diff --git a/java/openjdk8-jre/Makefile b/java/openjdk8-jre/Makefile index 2f8e4d59b53b..a0b4ec39d7f9 100644 --- a/java/openjdk8-jre/Makefile +++ b/java/openjdk8-jre/Makefile @@ -1,6 +1,5 @@ # $FreeBSD$ -PORTREVISION= 5 PKGNAMESUFFIX= ${JDK_MAJOR_VERSION}-jre COMMENT= Java Runtime Environment ${JDK_MAJOR_VERSION} diff --git a/java/openjdk8/Makefile b/java/openjdk8/Makefile index e7ed0806c513..6438336ddf0f 100644 --- a/java/openjdk8/Makefile +++ b/java/openjdk8/Makefile @@ -2,7 +2,6 @@ PORTNAME= openjdk PORTVERSION= ${JDK_MAJOR_VERSION}.${JDK_UPDATE_VERSION}.${JDK_BUILD_NUMBER:S/^0//} -PORTREVISION?= 1 CATEGORIES= java devel MASTER_SITES= http://download.java.net/openjdk/jdk${JDK_MAJOR_VERSION}/promoted/b${DIST_BUILD_NUMBER}/:jdk \ https://adopt-openjdk.ci.cloudbees.com/job/jtreg/${JTREG_JENKINS_BUILD}/artifact/:jtreg \ @@ -38,6 +37,15 @@ ONLY_FOR_ARCHS= i386 amd64 WRKSRC= ${WRKDIR}/${PORTNAME} DOS2UNIX_FILES= jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/xmlsecurity_en.properties \ + jdk/src/bsd/doc/man/java.1 \ + jdk/src/bsd/doc/man/javac.1 \ + jdk/src/bsd/doc/man/javap.1 \ + jdk/src/linux/doc/man/java.1 \ + jdk/src/linux/doc/man/javac.1 \ + jdk/src/linux/doc/man/javap.1 \ + jdk/src/solaris/doc/sun/man/man1/java.1 \ + jdk/src/solaris/doc/sun/man/man1/javac.1 \ + jdk/src/solaris/doc/sun/man/man1/javap.1 \ nashorn/test/script/jfx.js SHEBANG_FILES= configure @@ -62,8 +70,8 @@ NO_CCACHE= yes NOPRECIOUSMAKEVARS= yes JDK_MAJOR_VERSION= 8 -JDK_UPDATE_VERSION= 11 -JDK_BUILD_NUMBER= 12 +JDK_UPDATE_VERSION= 25 +JDK_BUILD_NUMBER= 17 DIST_BUILD_NUMBER= 132 JTREG_VERSION= 4.1 JTREG_BUILD_NUMBER= b08 @@ -163,33 +171,20 @@ ICONV_LDFLAGS= -L${LOCALBASE}/lib ${ICONV_LIB} .endif post-extract: - @${MV} -f ${WRKSRC}/hotspot/make/bsd/makefiles/mapfile-vers-debug \ - ${WRKSRC}/hotspot/make/bsd/makefiles/mapfile-vers-debug.macosx - @${MV} -f ${WRKSRC}/hotspot/make/bsd/makefiles/mapfile-vers-product \ - ${WRKSRC}/hotspot/make/bsd/makefiles/mapfile-vers-product.macosx - @${CP} -f ${WRKSRC}/hotspot/make/linux/makefiles/mapfile-vers-debug \ - ${WRKSRC}/hotspot/make/bsd/makefiles/mapfile-vers-debug - @${CP} -f ${WRKSRC}/hotspot/make/linux/makefiles/mapfile-vers-product \ - ${WRKSRC}/hotspot/make/bsd/makefiles/mapfile-vers-product - @${MKDIR} ${WRKSRC}/jdk/src/bsd/classes/java/net \ - ${WRKSRC}/jdk/src/bsd/classes/sun/nio/ch - @${MV} -f ${WRKSRC}/jdk/src/macosx/classes/java/net/DefaultInterface.java \ - ${WRKSRC}/jdk/src/bsd/classes/java/net - @${MV} -f ${WRKSRC}/jdk/src/macosx/classes/sun/nio/ch/DefaultSelectorProvider.java \ - ${WRKSRC}/jdk/src/bsd/classes/sun/nio/ch - @${MV} -f ${WRKSRC}/jdk/src/macosx/classes/sun/nio/ch/KQueue*.java \ - ${WRKSRC}/jdk/src/solaris/classes/sun/nio/ch - @${MV} -f ${WRKSRC}/jdk/src/macosx/native/sun/nio/ch/KQueue*.c \ - ${WRKSRC}/jdk/src/solaris/native/sun/nio/ch + @${CP} ${FILESDIR}/jdk-test-javax-imageio-plugins-jpeg-truncated.jpg \ + ${WRKSRC}/jdk/test/javax/imageio/plugins/jpeg/truncated.jpg + @${CP} ${FILESDIR}/nashorn-test-script-jfx-flyingimage-golden-bsd.png \ + ${WRKSRC}/nashorn/test/script/jfx/flyingimage/golden/bsd.png + @${CP} ${FILESDIR}/nashorn-test-script-jfx-kaleidoscope-golden-bsd.png \ + ${WRKSRC}/nashorn/test/script/jfx/kaleidoscope/golden/bsd.png + @${CP} ${FILESDIR}/nashorn-test-script-jfx-spread-golden-bsd.png \ + ${WRKSRC}/nashorn/test/script/jfx/spread/golden/bsd.png + +post-patch: + @${FIND} ${WRKSRC} -name '*.orig' -delete @${RMDIR} ${WRKSRC}/jdk/src/macosx/classes/java/net \ ${WRKSRC}/jdk/src/macosx/native/sun/nio/ch \ ${WRKSRC}/jdk/src/macosx/native/sun/nio - @${CP} -f ${WRKSRC}/jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd \ - ${WRKSRC}/jdk/src/solaris/classes/java/lang/UNIXProcess.java.macosx - @${CP} -f ${FILESDIR}/jdk-test-javax-imageio-plugins-jpeg-truncated.jpg \ - ${WRKSRC}/jdk/test/javax/imageio/plugins/jpeg/truncated.jpg - -post-patch: @${SED} -e 's|%%LOCALBASE%%|${LOCALBASE}|' \ ${FILESDIR}/bsd.fontconfig.properties.in > \ ${WRKSRC}/jdk/src/solaris/classes/sun/awt/fontconfigs/bsd.fontconfig.properties diff --git a/java/openjdk8/files/nashorn-test-script-jfx-flyingimage-golden-bsd.png b/java/openjdk8/files/nashorn-test-script-jfx-flyingimage-golden-bsd.png new file mode 100644 index 000000000000..ba72fe68406b Binary files /dev/null and b/java/openjdk8/files/nashorn-test-script-jfx-flyingimage-golden-bsd.png differ diff --git a/java/openjdk8/files/nashorn-test-script-jfx-kaleidoscope-golden-bsd.png b/java/openjdk8/files/nashorn-test-script-jfx-kaleidoscope-golden-bsd.png new file mode 100644 index 000000000000..64d9499b0ff6 Binary files /dev/null and b/java/openjdk8/files/nashorn-test-script-jfx-kaleidoscope-golden-bsd.png differ diff --git a/java/openjdk8/files/nashorn-test-script-jfx-spread-golden-bsd.png b/java/openjdk8/files/nashorn-test-script-jfx-spread-golden-bsd.png new file mode 100644 index 000000000000..c288162329ae Binary files /dev/null and b/java/openjdk8/files/nashorn-test-script-jfx-spread-golden-bsd.png differ diff --git a/java/openjdk8/files/patch-8u20-b26 b/java/openjdk8/files/patch-8u20-b26 new file mode 100644 index 000000000000..764df3e62484 --- /dev/null +++ b/java/openjdk8/files/patch-8u20-b26 @@ -0,0 +1,404059 @@ +--- ./.hgtags Tue Jun 03 14:19:17 2014 -0700 ++++ ./.hgtags Wed Jul 30 03:50:56 2014 -0700 +@@ -245,12 +245,18 @@ + 1e1f86d5d4e22c15a9bf9f1581acddb8c59abae2 jdk8-b121 + 347009c5881668b1e44f64d56d4a96cb20a183fa jdk8-b122 + ff1478785e43718146ffbce97e007f39c3bcaa32 jdk8-b123 ++c330fa67c4daffdc86527f1a24941aa5a3500098 jdk8u20-b00 + 790bbd46b2015e69ce301dae194c2b4141011f2d jdk8-b124 ++78abb27c27d988a86e6c82b2cce03cdc04211127 jdk8u20-b01 + 790bbd46b2015e69ce301dae194c2b4141011f2d jdk8-b125 + 9ccce5bf1b0ea0d3f3fb871be069f305f9cea530 jdk8-b126 + 2e2ffb9e4b690c63b32142861177390e0f2c40e9 jdk8-b127 + 101e42de46869e6604fbf095e1666fbf07fcb93c jdk8-b128 + 1e5fe865491300cd0c63261ecf8d34e621e1345c jdk8-b129 ++cc868070f1959b849c8c3b867771fbdb07b9ba05 jdk8u20-b02 ++6a3d3b7feab4d4a8252c63b4ce7d0fab106cf2f7 jdk8u20-b03 ++7e1b01df280fb065c5953c48f54ac9d619ecbf1c jdk8u20-b04 ++69e0af208dad70fdef65a89ab2c4c468ed9e24b8 jdk8u20-b05 + 839546caab1285c7699a9c2aa1467f57c9ea7f30 jdk8-b130 + 0c38dfecab2ad9f9b5b5edf54b991602147cd040 jdk8-b131 + 2a8f4c022aa03e7916223f3291517dbcc38e07cd jdk8-b132 +@@ -268,6 +274,7 @@ + dd3bd272ceedbd69fabafc531b6b1e056659f733 jdk8u5-b11 + 3e05b6ae0a1e2bd7352462e9bf8e7262246fb77f jdk8u5-b12 + d81e301cae70f1f95f4bb976ec053c915dee503a jdk8u5-b13 ++19dd42ebf97c187fbf53884f45dca84274909c3e jdk8u5-b31 + 397902f53444be14aa4e261cd47064fac82919c9 jdk8u11-b01 + 6ffd41be920a3e63c5767f36ac725e9e3bf5ec50 jdk8u11-b02 + 3078ab9b8d4ad37cf18bf6a1ed49c8015e70ec73 jdk8u11-b03 +@@ -279,3 +286,30 @@ + 390084098df7bffecd0eb2318facc6f0f9a46b70 jdk8u11-b09 + 6d324f36e2448f486d0caa67f70e5a6cf5ac6c0d jdk8u11-b10 + f0b9fee1d40a6aae31be4780f70aba02148ec54c jdk8u11-b11 ++e85bf9b28eb7f4098eeb25ba0e3afed34058ef09 jdk8u11-b12 ++66b17e2403b04cfe98dc1cce270f15ed817d0336 jdk8u11-b31 ++ae6a3aec6aa29509a0fd5f53709889b99b1e27da jdk8u20-b06 ++cc868070f1959b849c8c3b867771fbdb07b9ba05 jdk8u20-b02 ++6a3d3b7feab4d4a8252c63b4ce7d0fab106cf2f7 jdk8u20-b03 ++7e1b01df280fb065c5953c48f54ac9d619ecbf1c jdk8u20-b04 ++69e0af208dad70fdef65a89ab2c4c468ed9e24b8 jdk8u20-b05 ++ae6a3aec6aa29509a0fd5f53709889b99b1e27da jdk8u20-b06 ++6403ef94cb0db32d9221a5e8f09f3664cd7744dc jdk8u20-b07 ++b7750b6ee1578fd5b2b1f6758f905b332503d8ed jdk8u20-b08 ++d420eae635c42be98b166e1ce9c64fc0a8825529 jdk8u20-b09 ++cc4ca2ff0afcfb932da6fa4fffdd01f08e4ff71b jdk8u20-b10 ++61291eee163ab5bbe0b38b37b77673bac9bf5310 jdk8u20-b11 ++2feecdcd7b677f3baf9df6e8ea46f7e08c7e4411 jdk8u20-b12 ++26764db977ecb590cdee637d27996a87cdd9507e jdk8u20-b13 ++548afd2496385263874c0ce970158764166b1156 jdk8u20-b14 ++12a1fd80b05aa9c5daab22ca5fab8e2c9c3df61c jdk8u20-b15 ++4095a7a49a9ea95f4c59f936acf45ca1f87b8fff jdk8u20-b16 ++3a49a08a2e3991a10e6bec531e9dbfa7c503fcb4 jdk8u20-b17 ++1695032e51faa36ed9c39b2817baa374ca361513 jdk8u20-b18 ++2f40422f564b892a26cb04c62885bb5bc85984e3 jdk8u20-b19 ++5b76ecd0cdcf899261da2c9965862771f6da4e26 jdk8u20-b20 ++0dccc4aca1859b1ff7dca9db214f7f38c4ddbbce jdk8u20-b21 ++6c1fb59fa5d7095d93a023553a949f873f324c6b jdk8u20-b22 ++b14daf2459c5430dfe5d435483d6f424cff09584 jdk8u20-b23 ++1710841b0229403f4af85eac8b68ea5065a26c81 jdk8u20-b24 ++1710841b0229403f4af85eac8b68ea5065a26c81 jdk8u20-b25 +--- ./THIRD_PARTY_README Tue Jun 03 14:19:17 2014 -0700 ++++ ./THIRD_PARTY_README Wed Jul 30 03:50:56 2014 -0700 +@@ -2,7 +2,7 @@ + ----------------------------- + + %% This notice is provided with respect to ASM Bytecode Manipulation +-Framework v5.0, which may be included with JRE 8, and JDK 8, and ++Framework v5.0.3, which may be included with JRE 8, and JDK 8, and + OpenJDK 8. + + --- begin of LICENSE --- +@@ -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 +@@ -3349,14 +3349,14 @@ + + ------------------------------------------------------------------------------- + +-%% This notice is provided with respect to zlib v1.2.5, which may be included ++%% This notice is provided with respect to zlib v1.2.8, which may be included + with JRE 8, JDK 8, and OpenJDK 8. + + --- begin of LICENSE --- + +- version 1.2.5, July 18th, 2005 +- +- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler ++ version 1.2.8, April 28th, 2013 ++ ++ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages +@@ -3382,11 +3382,11 @@ + ------------------------------------------------------------------------------- + + %% This notice is provided with respect to the following which may be +-included with JRE 8, JDK 8, and OpenJDK 8, except where noted: +- +- Apache Commons Math 2.2 +- Apache Derby 10.10.1.2 [included with JDK 8] +- Apache Jakarta BCEL 5.2 ++included with JRE 8, JDK 8, and OpenJDK 8. ++ ++ Apache Commons Math 3.2 ++ Apache Derby 10.10.1.3 ++ Apache Jakarta BCEL 5.1 + Apache Jakarta Regexp 1.4 + Apache Santuario XML Security for Java 1.5.4 + Apache Xalan-Java 2.7.1 +--- ./common/autoconf/boot-jdk.m4 Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/boot-jdk.m4 Wed Jul 30 03:50:56 2014 -0700 +@@ -316,7 +316,7 @@ + + # Minimum amount of heap memory. + ADD_JVM_ARG_IF_OK([-Xms64M],boot_jdk_jvmargs,[$JAVA]) +- if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then ++ if test "x$OPENJDK_TARGET_OS" = "xmacosx" || test "x$OPENJDK_TARGET_CPU" = "xppc64" ; then + # Why does macosx need more heap? Its the huge JDK batch. + ADD_JVM_ARG_IF_OK([-Xmx1600M],boot_jdk_jvmargs,[$JAVA]) + else +--- ./common/autoconf/build-aux/config.guess Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/build-aux/config.guess Wed Jul 30 03:50:56 2014 -0700 +@@ -60,4 +60,30 @@ + esac + fi + ++# Test and fix architecture string on AIX ++# On AIX 'config.guess' returns 'powerpc' as architecture but 'powerpc' is ++# implicitely handled as 32-bit architecture in 'platform.m4' so we check ++# for the kernel mode rewrite it to 'powerpc64' if we'Re running in 64-bit mode. ++# The check could also be done with `/usr/sbin/prtconf | grep "Kernel Type" | grep "64-bit"` ++echo $OUT | grep powerpc-ibm-aix > /dev/null 2> /dev/null ++if test $? = 0; then ++ if [ -x /bin/getconf ] ; then ++ KERNEL_BITMODE=`getconf KERNEL_BITMODE` ++ if [ "$KERNEL_BITMODE" = "32" ]; then ++ KERNEL_BITMODE="" ++ fi ++ fi ++ OUT=powerpc$KERNEL_BITMODE`echo $OUT | sed -e 's/[^-]*//'` ++fi ++ ++# Test and fix little endian PowerPC64. ++# TODO: should be handled by autoconf-config.guess. ++if [ "x$OUT" = x ]; then ++ if [ `uname -m` = ppc64le ]; then ++ if [ `uname -s` = Linux ]; then ++ OUT=powerpc64le-unknown-linux-gnu ++ fi ++ fi ++fi ++ + echo $OUT +--- ./common/autoconf/build-performance.m4 Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/build-performance.m4 Wed Jul 30 03:50:56 2014 -0700 +@@ -41,6 +41,9 @@ + # Looks like a MacOSX system + NUM_CORES=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Cores' | awk '{print [$]5}'` + FOUND_CORES=yes ++ elif test "x$OPENJDK_BUILD_OS" = xaix ; then ++ NUM_CORES=`/usr/sbin/prtconf | grep "^Number Of Processors" | awk '{ print [$]4 }'` ++ FOUND_CORES=yes + elif test -n "$NUMBER_OF_PROCESSORS"; then + # On windows, look in the env + NUM_CORES=$NUMBER_OF_PROCESSORS +@@ -68,8 +71,8 @@ + MEMORY_SIZE=`expr $MEMORY_SIZE / 1024` + FOUND_MEM=yes + elif test -x /usr/sbin/prtconf; then +- # Looks like a Solaris system +- MEMORY_SIZE=`/usr/sbin/prtconf | grep "Memory size" | awk '{ print [$]3 }'` ++ # Looks like a Solaris or AIX system ++ MEMORY_SIZE=`/usr/sbin/prtconf | grep "^Memory [[Ss]]ize" | awk '{ print [$]3 }'` + FOUND_MEM=yes + elif test -x /usr/sbin/system_profiler; then + # Looks like a MacOSX system +--- ./common/autoconf/configure.ac Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/configure.ac Wed Jul 30 03:50:56 2014 -0700 +@@ -88,6 +88,7 @@ + + # These are needed to be able to create a configuration name (and thus the output directory) + JDKOPT_SETUP_JDK_VARIANT ++JDKOPT_SETUP_JVM_INTERPRETER + JDKOPT_SETUP_JVM_VARIANTS + JDKOPT_SETUP_DEBUG_LEVEL + +--- ./common/autoconf/generated-configure.sh Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/generated-configure.sh Wed Jul 30 03:50:56 2014 -0700 +@@ -665,6 +665,7 @@ + CFLAGS_DEBUG_SYMBOLS + ZIP_DEBUGINFO_FILES + ENABLE_DEBUG_SYMBOLS ++USING_BROKEN_SUSE_LD + COMPILER_SUPPORTS_TARGET_BITS_FLAG + ZERO_ARCHFLAG + LDFLAGS_CXX_JDK +@@ -749,6 +750,7 @@ + PROPER_COMPILER_CXX + POTENTIAL_CXX + TOOLS_DIR_CXX ++COMPILER_TARGET_BITS_FLAG + OBJEXT + EXEEXT + ac_ct_CC +@@ -851,6 +853,7 @@ + DEBUG_LEVEL + MACOSX_UNIVERSAL + INCLUDE_SA ++JVM_VARIANT_CORE + JVM_VARIANT_ZEROSHARK + JVM_VARIANT_ZERO + JVM_VARIANT_KERNEL +@@ -858,6 +861,7 @@ + JVM_VARIANT_CLIENT + JVM_VARIANT_SERVER + JVM_VARIANTS ++JVM_INTERPRETER + JDK_VARIANT + SET_OPENJDK + BUILD_LOG_WRAPPER +@@ -1003,6 +1007,7 @@ + with_devkit + enable_openjdk_only + with_jdk_variant ++with_jvm_interpreter + with_jvm_variants + enable_debug + with_debug_level +@@ -1747,8 +1752,10 @@ + --with-devkit use this directory as base for tools-dir and + sys-root (for cross-compiling) + --with-jdk-variant JDK variant to build (normal) [normal] ++ --with-jvm-interpreter JVM interpreter to build (template, cpp) [template] + --with-jvm-variants JVM variants (separated by commas) to build (server, +- client, minimal1, kernel, zero, zeroshark) [server] ++ client, minimal1, kernel, zero, zeroshark, core) ++ [server] + --with-debug-level set the debug level (release, fastdebug, slowdebug) + [release] + --with-conf-name use this as the name of the configuration [generated +@@ -3485,8 +3492,6 @@ + If you put the resulting build in \"C:\Program Files\GnuWin32\", it will be found automatically." + fi + ;; +- * ) +- break ;; + esac + } + +@@ -3512,8 +3517,6 @@ + PKGHANDLER_COMMAND="sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev" ;; + ccache) + PKGHANDLER_COMMAND="sudo apt-get install ccache" ;; +- * ) +- break ;; + esac + } + +@@ -3535,8 +3538,6 @@ + PKGHANDLER_COMMAND="sudo yum install libXtst-devel libXt-devel libXrender-devel" ;; + ccache) + PKGHANDLER_COMMAND="sudo yum install ccache" ;; +- * ) +- break ;; + esac + } + +@@ -3586,6 +3587,8 @@ + + + ++ ++ + ############################################################################### + # + # Should we build only OpenJDK even if closed sources are present? +@@ -3865,7 +3868,7 @@ + #CUSTOM_AUTOCONF_INCLUDE + + # Do not change or remove the following line, it is needed for consistency checks: +-DATE_WHEN_GENERATED=1390334534 ++DATE_WHEN_GENERATED=1397150809 + + ############################################################################### + # +@@ -6784,6 +6787,11 @@ + VAR_OS_API=winapi + VAR_OS_ENV=windows.msys + ;; ++ *aix*) ++ VAR_OS=aix ++ VAR_OS_API=posix ++ VAR_OS_ENV=aix ++ ;; + *) + as_fn_error $? "unsupported operating system $build_os" "$LINENO" 5 + ;; +@@ -6822,6 +6830,12 @@ + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; ++ powerpc64le) ++ VAR_CPU=ppc64 ++ VAR_CPU_ARCH=ppc ++ VAR_CPU_BITS=64 ++ VAR_CPU_ENDIAN=little ++ ;; + s390) + VAR_CPU=s390 + VAR_CPU_ARCH=s390 +@@ -6904,6 +6918,11 @@ + VAR_OS_API=winapi + VAR_OS_ENV=windows.msys + ;; ++ *aix*) ++ VAR_OS=aix ++ VAR_OS_API=posix ++ VAR_OS_ENV=aix ++ ;; + *) + as_fn_error $? "unsupported operating system $host_os" "$LINENO" 5 + ;; +@@ -6942,6 +6961,12 @@ + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; ++ powerpc64le) ++ VAR_CPU=ppc64 ++ VAR_CPU_ARCH=ppc ++ VAR_CPU_BITS=64 ++ VAR_CPU_ENDIAN=little ++ ;; + s390) + VAR_CPU=s390 + VAR_CPU_ARCH=s390 +@@ -7810,6 +7835,37 @@ + $as_echo "$JDK_VARIANT" >&6; } + + ++############################################################################### ++# ++# Check which interpreter of the JVM we want to build. ++# Currently we have: ++# template: Template interpreter (the default) ++# cpp : C++ interpreter ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which interpreter of the JVM to build" >&5 ++$as_echo_n "checking which interpreter of the JVM to build... " >&6; } ++ ++# Check whether --with-jvm-interpreter was given. ++if test "${with_jvm_interpreter+set}" = set; then : ++ withval=$with_jvm_interpreter; ++fi ++ ++ ++if test "x$with_jvm_interpreter" = x; then ++ with_jvm_interpreter="template" ++fi ++ ++JVM_INTERPRETER="$with_jvm_interpreter" ++ ++if test "x$JVM_INTERPRETER" != xtemplate && test "x$JVM_INTERPRETER" != xcpp; then ++ as_fn_error $? "The available JVM interpreters are: template, cpp" "$LINENO" 5 ++fi ++ ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_jvm_interpreter" >&5 ++$as_echo "$with_jvm_interpreter" >&6; } ++ ++ + + ############################################################################### + # +@@ -7822,6 +7878,7 @@ + # ie normal interpreter and C1, only the serial GC, kernel jvmti etc + # zero: no machine code interpreter, no compiler + # zeroshark: zero interpreter and shark/llvm compiler backend ++# core: interpreter only, no compiler (only works on some platforms) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variants of the JVM to build" >&5 + $as_echo_n "checking which variants of the JVM to build... " >&6; } + +@@ -7836,10 +7893,10 @@ + fi + + JVM_VARIANTS=",$with_jvm_variants," +- TEST_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/server,//' -e 's/client,//' -e 's/minimal1,//' -e 's/kernel,//' -e 's/zero,//' -e 's/zeroshark,//'` ++ TEST_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/server,//' -e 's/client,//' -e 's/minimal1,//' -e 's/kernel,//' -e 's/zero,//' -e 's/zeroshark,//' -e 's/core,//'` + + if test "x$TEST_VARIANTS" != "x,"; then +- as_fn_error $? "The available JVM variants are: server, client, minimal1, kernel, zero, zeroshark" "$LINENO" 5 ++ as_fn_error $? "The available JVM variants are: server, client, minimal1, kernel, zero, zeroshark, core" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_jvm_variants" >&5 + $as_echo "$with_jvm_variants" >&6; } +@@ -7850,6 +7907,7 @@ + JVM_VARIANT_KERNEL=`$ECHO "$JVM_VARIANTS" | $SED -e '/,kernel,/!s/.*/false/g' -e '/,kernel,/s/.*/true/g'` + JVM_VARIANT_ZERO=`$ECHO "$JVM_VARIANTS" | $SED -e '/,zero,/!s/.*/false/g' -e '/,zero,/s/.*/true/g'` + JVM_VARIANT_ZEROSHARK=`$ECHO "$JVM_VARIANTS" | $SED -e '/,zeroshark,/!s/.*/false/g' -e '/,zeroshark,/s/.*/true/g'` ++ JVM_VARIANT_CORE=`$ECHO "$JVM_VARIANTS" | $SED -e '/,core,/!s/.*/false/g' -e '/,core,/s/.*/true/g'` + + if test "x$JVM_VARIANT_CLIENT" = xtrue; then + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then +@@ -7869,7 +7927,7 @@ + + # Replace the commas with AND for use in the build directory name. + ANDED_JVM_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/^,//' -e 's/,$//' -e 's/,/AND/'` +- COUNT_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/server,/1/' -e 's/client,/1/' -e 's/minimal1,/1/' -e 's/kernel,/1/' -e 's/zero,/1/' -e 's/zeroshark,/1/'` ++ COUNT_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/server,/1/' -e 's/client,/1/' -e 's/minimal1,/1/' -e 's/kernel,/1/' -e 's/zero,/1/' -e 's/zeroshark,/1/' -e 's/core,/1/'` + if test "x$COUNT_VARIANTS" != "x,1"; then + BUILDING_MULTIPLE_JVM_VARIANTS=yes + else +@@ -7884,6 +7942,7 @@ + + + ++ + INCLUDE_SA=true + if test "x$JVM_VARIANT_ZERO" = xtrue ; then + INCLUDE_SA=false +@@ -7891,6 +7950,9 @@ + if test "x$JVM_VARIANT_ZEROSHARK" = xtrue ; then + INCLUDE_SA=false + fi ++ if test "x$VAR_CPU" = xppc64 ; then ++ INCLUDE_SA=false ++ fi + + + if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then +@@ -8006,6 +8068,10 @@ + HOTSPOT_TARGET="$HOTSPOT_TARGET${HOTSPOT_DEBUG_LEVEL}shark " + fi + ++ if test "x$JVM_VARIANT_CORE" = xtrue; then ++ HOTSPOT_TARGET="$HOTSPOT_TARGET${HOTSPOT_DEBUG_LEVEL}core " ++ fi ++ + HOTSPOT_TARGET="$HOTSPOT_TARGET docs export_$HOTSPOT_EXPORT" + + # On Macosx universal binaries are produced, but they only contain +@@ -15857,8 +15923,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -16037,7 +16101,7 @@ + JVM_ARG_OK=false + fi + +- if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then ++ if test "x$OPENJDK_TARGET_OS" = "xmacosx" || test "x$OPENJDK_TARGET_CPU" = "xppc64" ; then + # Why does macosx need more heap? Its the huge JDK batch. + + $ECHO "Check if jvm arg is ok: -Xmx1600M" >&5 +@@ -19109,6 +19173,9 @@ + COMPILER_CHECK_LIST="cl" + elif test "x$OPENJDK_TARGET_OS" = "xsolaris"; then + COMPILER_CHECK_LIST="cc gcc" ++ elif test "x$OPENJDK_TARGET_OS" = "xaix"; then ++ # Do not probe for cc on AIX. ++ COMPILER_CHECK_LIST="xlc_r" + else + COMPILER_CHECK_LIST="gcc cc" + fi +@@ -19246,8 +19313,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -19523,9 +19588,12 @@ + $as_echo "$as_me: Rewriting CC to \"$new_complete\"" >&6;} + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CC" >&5 ++ TEST_COMPILER="$CC" ++ # Don't remove symbolic links on AIX because 'xlc_r' and 'xlC_r' may all be links ++ # to 'xlc' but it is crucial that we invoke the compiler with the right name! ++ if test "x$OPENJDK_BUILD_OS" != xaix; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CC" >&5 + $as_echo_n "checking resolved symbolic links for CC... " >&6; } +- TEST_COMPILER="$CC" + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink +@@ -19574,8 +19642,9 @@ + fi + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 + $as_echo "$TEST_COMPILER" >&6; } ++ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if CC is disguised ccache" >&5 + $as_echo_n "checking if CC is disguised ccache... " >&6; } + +@@ -20039,6 +20108,15 @@ + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/p"` + COMPILER_VENDOR="Sun Studio" + fi ++ elif test "x$OPENJDK_TARGET_OS" = xaix; then ++ COMPILER_VERSION_TEST=`$COMPILER -qversion 2>&1 | $TAIL -n 1` ++ $ECHO $COMPILER_VERSION_TEST | $GREP "^Version: " > /dev/null ++ if test $? -ne 0; then ++ as_fn_error $? "Failed to detect the compiler version of $COMPILER ...." "$LINENO" 5 ++ else ++ COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n 's/Version: \(0-90-9\.0-90-9*\).*/\1/p'` ++ COMPILER_VENDOR='IBM' ++ fi + elif test "x$OPENJDK_TARGET_OS" = xwindows; then + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 +@@ -20680,6 +20758,14 @@ + ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + ++ # Option used to tell the compiler whether to create 32- or 64-bit executables ++ # Notice that CC contains the full compiler path at this point. ++ case $CC in ++ *xlc_r) COMPILER_TARGET_BITS_FLAG="-q";; ++ *) COMPILER_TARGET_BITS_FLAG="-m";; ++ esac ++ ++ + ### Locate C++ compiler (CXX) + + if test "x$CXX" != x; then +@@ -20688,6 +20774,9 @@ + COMPILER_CHECK_LIST="cl" + elif test "x$OPENJDK_TARGET_OS" = "xsolaris"; then + COMPILER_CHECK_LIST="CC g++" ++ elif test "x$OPENJDK_TARGET_OS" = "xaix"; then ++ # Do not probe for CC on AIX . ++ COMPILER_CHECK_LIST="xlC_r" + else + COMPILER_CHECK_LIST="g++ CC" + fi +@@ -20825,8 +20914,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -21102,9 +21189,12 @@ + $as_echo "$as_me: Rewriting CXX to \"$new_complete\"" >&6;} + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CXX" >&5 ++ TEST_COMPILER="$CXX" ++ # Don't remove symbolic links on AIX because 'xlc_r' and 'xlC_r' may all be links ++ # to 'xlc' but it is crucial that we invoke the compiler with the right name! ++ if test "x$OPENJDK_BUILD_OS" != xaix; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CXX" >&5 + $as_echo_n "checking resolved symbolic links for CXX... " >&6; } +- TEST_COMPILER="$CXX" + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink +@@ -21153,8 +21243,9 @@ + fi + fi + +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 + $as_echo "$TEST_COMPILER" >&6; } ++ fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if CXX is disguised ccache" >&5 + $as_echo_n "checking if CXX is disguised ccache... " >&6; } + +@@ -21618,6 +21709,15 @@ + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/p"` + COMPILER_VENDOR="Sun Studio" + fi ++ elif test "x$OPENJDK_TARGET_OS" = xaix; then ++ COMPILER_VERSION_TEST=`$COMPILER -qversion 2>&1 | $TAIL -n 1` ++ $ECHO $COMPILER_VERSION_TEST | $GREP "^Version: " > /dev/null ++ if test $? -ne 0; then ++ as_fn_error $? "Failed to detect the compiler version of $COMPILER ...." "$LINENO" 5 ++ else ++ COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n 's/Version: \(0-90-9\.0-90-9*\).*/\1/p'` ++ COMPILER_VENDOR='IBM' ++ fi + elif test "x$OPENJDK_TARGET_OS" = xwindows; then + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 +@@ -22823,6 +22923,8 @@ + fi + if test "x$OPENJDK_TARGET_OS" = xmacosx; then + ARFLAGS="-r" ++ elif test "x$OPENJDK_TARGET_OS" = xaix; then ++ ARFLAGS="-X64" + else + ARFLAGS="" + fi +@@ -28798,16 +28900,17 @@ + # is made at runtime.) + # + +- if test "x$OPENJDK_TARGET_OS" = xsolaris; then +- # Always specify -m flags on Solaris ++ if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xaix; then ++ # Always specify -m flag on Solaris ++ # And -q on AIX because otherwise the compiler produces 32-bit objects by default + + # When we add flags to the "official" CFLAGS etc, we need to + # keep track of these additions in ADDED_CFLAGS etc. These + # will later be checked to make sure only controlled additions + # have been made to CFLAGS etc. +- ADDED_CFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}" +- ADDED_CXXFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}" +- ADDED_LDFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_CFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_CXXFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_LDFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" + + CFLAGS="${CFLAGS}${ADDED_CFLAGS}" + CXXFLAGS="${CXXFLAGS}${ADDED_CXXFLAGS}" +@@ -28825,9 +28928,9 @@ + # keep track of these additions in ADDED_CFLAGS etc. These + # will later be checked to make sure only controlled additions + # have been made to CFLAGS etc. +- ADDED_CFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}" +- ADDED_CXXFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}" +- ADDED_LDFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_CFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_CXXFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_LDFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" + + CFLAGS="${CFLAGS}${ADDED_CFLAGS}" + CXXFLAGS="${CXXFLAGS}${ADDED_CXXFLAGS}" +@@ -28901,20 +29004,85 @@ + + + +- if test "x$SIZEOF_INT_P" != "x$ac_cv_sizeof_int_p"; then +- # Workaround autoconf bug, see http://lists.gnu.org/archive/html/autoconf/2010-07/msg00004.html +- SIZEOF_INT_P="$ac_cv_sizeof_int_p" +- fi +- +- if test "x$SIZEOF_INT_P" = x; then ++ # AC_CHECK_SIZEOF defines 'ac_cv_sizeof_int_p' to hold the number of bytes used by an 'int*' ++ if test "x$ac_cv_sizeof_int_p" = x; then + # The test failed, lets stick to the assumed value. + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The number of bits in the target could not be determined, using $OPENJDK_TARGET_CPU_BITS." >&5 + $as_echo "$as_me: WARNING: The number of bits in the target could not be determined, using $OPENJDK_TARGET_CPU_BITS." >&2;} + else +- TESTED_TARGET_CPU_BITS=`expr 8 \* $SIZEOF_INT_P` ++ TESTED_TARGET_CPU_BITS=`expr 8 \* $ac_cv_sizeof_int_p` + + if test "x$TESTED_TARGET_CPU_BITS" != "x$OPENJDK_TARGET_CPU_BITS"; then +- as_fn_error $? "The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS)" "$LINENO" 5 ++ # This situation may happen on 64-bit platforms where the compiler by default only generates 32-bit objects ++ # Let's try to implicitely set the compilers target architecture and retry the test ++ { $as_echo "$as_me:${as_lineno-$LINENO}: The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS)." >&5 ++$as_echo "$as_me: The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS)." >&6;} ++ { $as_echo "$as_me:${as_lineno-$LINENO}: I'll retry after setting the platforms compiler target bits flag to ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" >&5 ++$as_echo "$as_me: I'll retry after setting the platforms compiler target bits flag to ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" >&6;} ++ ++ # When we add flags to the "official" CFLAGS etc, we need to ++ # keep track of these additions in ADDED_CFLAGS etc. These ++ # will later be checked to make sure only controlled additions ++ # have been made to CFLAGS etc. ++ ADDED_CFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_CXXFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_LDFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" ++ ++ CFLAGS="${CFLAGS}${ADDED_CFLAGS}" ++ CXXFLAGS="${CXXFLAGS}${ADDED_CXXFLAGS}" ++ LDFLAGS="${LDFLAGS}${ADDED_LDFLAGS}" ++ ++ CFLAGS_JDK="${CFLAGS_JDK}${ADDED_CFLAGS}" ++ CXXFLAGS_JDK="${CXXFLAGS_JDK}${ADDED_CXXFLAGS}" ++ LDFLAGS_JDK="${LDFLAGS_JDK}${ADDED_LDFLAGS}" ++ ++ ++ # We have to unset 'ac_cv_sizeof_int_p' first, otherwise AC_CHECK_SIZEOF will use the previously cached value! ++ unset ac_cv_sizeof_int_p ++ # And we have to undef the definition of SIZEOF_INT_P in confdefs.h by the previous invocation of AC_CHECK_SIZEOF ++ cat >>confdefs.h <<_ACEOF ++#undef SIZEOF_INT_P ++_ACEOF ++ ++ # The cast to long int works around a bug in the HP C Compiler ++# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects ++# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. ++# This bug is HP SR number 8606223364. ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int *" >&5 ++$as_echo_n "checking size of int *... " >&6; } ++if ${ac_cv_sizeof_int_p+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (int *))" "ac_cv_sizeof_int_p" "$ac_includes_default"; then : ++ ++else ++ if test "$ac_cv_type_int_p" = yes; then ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 ++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++as_fn_error 77 "cannot compute sizeof (int *) ++See \`config.log' for more details" "$LINENO" 5; } ++ else ++ ac_cv_sizeof_int_p=0 ++ fi ++fi ++ ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int_p" >&5 ++$as_echo "$ac_cv_sizeof_int_p" >&6; } ++ ++ ++ ++cat >>confdefs.h <<_ACEOF ++#define SIZEOF_INT_P $ac_cv_sizeof_int_p ++_ACEOF ++ ++ ++ ++ TESTED_TARGET_CPU_BITS=`expr 8 \* $ac_cv_sizeof_int_p` ++ ++ if test "x$TESTED_TARGET_CPU_BITS" != "x$OPENJDK_TARGET_CPU_BITS"; then ++ as_fn_error $? "The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS)" "$LINENO" 5 ++ fi + fi + fi + +@@ -29227,6 +29395,29 @@ + POST_STRIP_CMD="$STRIP -x" + POST_MCS_CMD="$MCS -d -a \"JDK $FULL_VERSION\"" + fi ++ if test "x$OPENJDK_TARGET_OS" = xaix; then ++ COMPILER_NAME=xlc ++ PICFLAG="-qpic=large" ++ LIBRARY_PREFIX=lib ++ SHARED_LIBRARY='lib$1.so' ++ STATIC_LIBRARY='lib$1.a' ++ SHARED_LIBRARY_FLAGS="-qmkshrobj" ++ SHARED_LIBRARY_SUFFIX='.so' ++ STATIC_LIBRARY_SUFFIX='.a' ++ OBJ_SUFFIX='.o' ++ EXE_SUFFIX='' ++ SET_SHARED_LIBRARY_NAME='' ++ SET_SHARED_LIBRARY_MAPFILE='' ++ C_FLAG_REORDER='' ++ CXX_FLAG_REORDER='' ++ SET_SHARED_LIBRARY_ORIGIN='' ++ SET_EXECUTABLE_ORIGIN="" ++ CFLAGS_JDK="" ++ CXXFLAGS_JDK="" ++ CFLAGS_JDKLIB_EXTRA='' ++ POST_STRIP_CMD="$STRIP -X32_64" ++ POST_MCS_CMD="" ++ fi + if test "x$OPENJDK_TARGET_OS" = xwindows; then + # If it is not gcc, then assume it is the MS Visual Studio compiler + COMPILER_NAME=cl +@@ -29412,6 +29603,24 @@ + + CFLAGS_DEBUG_SYMBOLS="-g -xs" + CXXFLAGS_DEBUG_SYMBOLS="-g0 -xs" ++ ;; ++ xlc ) ++ C_FLAG_DEPS="-qmakedep=gcc -MF" ++ CXX_FLAG_DEPS="-qmakedep=gcc -MF" ++ C_O_FLAG_HIGHEST="-O3" ++ C_O_FLAG_HI="-O3 -qstrict" ++ C_O_FLAG_NORM="-O2" ++ C_O_FLAG_NONE="" ++ CXX_O_FLAG_HIGHEST="-O3" ++ CXX_O_FLAG_HI="-O3 -qstrict" ++ CXX_O_FLAG_NORM="-O2" ++ CXX_O_FLAG_NONE="" ++ CFLAGS_DEBUG_SYMBOLS="-g" ++ CXXFLAGS_DEBUG_SYMBOLS="-g" ++ LDFLAGS_JDK="${LDFLAGS_JDK} -q64 -brtl -bnolibpath -liconv -bexpall" ++ CFLAGS_JDK="${CFLAGS_JDK} -qchars=signed -q64 -qfullpath -qsaveopt" ++ CXXFLAGS_JDK="${CXXFLAGS_JDK} -qchars=signed -q64 -qfullpath -qsaveopt" ++ ;; + esac + ;; + CL ) +@@ -29535,6 +29744,13 @@ + LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib" + ;; ++ xlc ) ++ 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" ++ ++ LDFLAGS_JDK="$LDFLAGS_JDK" ++ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK" ++ ;; + cl ) + CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \ + -D_STATIC_CPPLIB -D_DISABLE_DEPRECATE_STATIC_CPPLIB -DWIN32_LEAN_AND_MEAN \ +@@ -29604,6 +29820,9 @@ + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DSOLARIS" + fi ++ if test "x$OPENJDK_TARGET_OS" = xaix; then ++ CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DAIX -DPPC64" ++ fi + if test "x$OPENJDK_TARGET_OS" = xmacosx; then + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT" + # Setting these parameters makes it an error to link to macosx APIs that are +@@ -29736,10 +29955,10 @@ + # ZERO_ARCHFLAG tells the compiler which mode to build for + case "${OPENJDK_TARGET_CPU}" in + s390) +- ZERO_ARCHFLAG="-m31" ++ ZERO_ARCHFLAG="${COMPILER_TARGET_BITS_FLAG}31" + ;; + *) +- ZERO_ARCHFLAG="-m${OPENJDK_TARGET_CPU_BITS}" ++ ZERO_ARCHFLAG="${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports \"$ZERO_ARCHFLAG\"" >&5 +@@ -29808,15 +30027,15 @@ + + + +- # Check that the compiler supports -mX flags ++ # Check that the compiler supports -mX (or -qX on AIX) flags + # Set COMPILER_SUPPORTS_TARGET_BITS_FLAG to 'true' if it does + +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports \"-m${OPENJDK_TARGET_CPU_BITS}\"" >&5 +-$as_echo_n "checking if compiler supports \"-m${OPENJDK_TARGET_CPU_BITS}\"... " >&6; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports \"${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}\"" >&5 ++$as_echo_n "checking if compiler supports \"${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}\"... " >&6; } + supports=yes + + saved_cflags="$CFLAGS" +- CFLAGS="$CFLAGS -m${OPENJDK_TARGET_CPU_BITS}" ++ CFLAGS="$CFLAGS ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -29842,7 +30061,7 @@ + CFLAGS="$saved_cflags" + + saved_cxxflags="$CXXFLAGS" +- CXXFLAGS="$CXXFLAG -m${OPENJDK_TARGET_CPU_BITS}" ++ CXXFLAGS="$CXXFLAG ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" + ac_ext=cpp + ac_cpp='$CXXCPP $CPPFLAGS' + ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -29878,6 +30097,27 @@ + + + ++ # 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$GCC" = xyes; 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 ++ 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; } ++ USING_BROKEN_SUSE_LD=no ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ USING_BROKEN_SUSE_LD=yes ++ fi ++ rm -rf version-script.map main.c ++ fi ++ ++ ++ + # Setup debug symbols (need objcopy from the toolchain for that) + + # +@@ -30034,6 +30274,16 @@ + $as_echo "alsa pulse" >&6; } + fi + ++ if test "x$OPENJDK_TARGET_OS" = xaix; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on AIX?" >&5 ++$as_echo_n "checking what is not needed on AIX?... " >&6; } ++ ALSA_NOT_NEEDED=yes ++ PULSE_NOT_NEEDED=yes ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: alsa pulse" >&5 ++$as_echo "alsa pulse" >&6; } ++ fi ++ ++ + if test "x$OPENJDK_TARGET_OS" = xwindows; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on Windows?" >&5 + $as_echo_n "checking what is not needed on Windows?... " >&6; } +@@ -30844,8 +31094,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -30936,8 +31184,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -31198,8 +31444,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -33960,8 +34204,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -34297,8 +34539,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -34377,7 +34617,7 @@ + fi + + if test "x${with_alsa}" != x; then +- ALSA_LIBS="-L${with_alsa}/lib -lalsa" ++ ALSA_LIBS="-L${with_alsa}/lib -lasound" + ALSA_CFLAGS="-I${with_alsa}/include" + ALSA_FOUND=yes + fi +@@ -34386,7 +34626,7 @@ + ALSA_FOUND=yes + fi + if test "x${with_alsa_lib}" != x; then +- ALSA_LIBS="-L${with_alsa_lib} -lalsa" ++ ALSA_LIBS="-L${with_alsa_lib} -lasound" + ALSA_FOUND=yes + fi + if test "x$ALSA_FOUND" = xno; then +@@ -34650,8 +34890,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -35454,6 +35692,9 @@ + # Looks like a MacOSX system + NUM_CORES=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Cores' | awk '{print $5}'` + FOUND_CORES=yes ++ elif test "x$OPENJDK_BUILD_OS" = xaix ; then ++ NUM_CORES=`/usr/sbin/prtconf | grep "^Number Of Processors" | awk '{ print $4 }'` ++ FOUND_CORES=yes + elif test -n "$NUMBER_OF_PROCESSORS"; then + # On windows, look in the env + NUM_CORES=$NUMBER_OF_PROCESSORS +@@ -35498,8 +35739,8 @@ + MEMORY_SIZE=`expr $MEMORY_SIZE / 1024` + FOUND_MEM=yes + elif test -x /usr/sbin/prtconf; then +- # Looks like a Solaris system +- MEMORY_SIZE=`/usr/sbin/prtconf | grep "Memory size" | awk '{ print $3 }'` ++ # Looks like a Solaris or AIX system ++ MEMORY_SIZE=`/usr/sbin/prtconf | grep "^Memory [Ss]ize" | awk '{ print $3 }'` + FOUND_MEM=yes + elif test -x /usr/sbin/system_profiler; then + # Looks like a MacOSX system +@@ -37410,8 +37651,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +--- ./common/autoconf/help.m4 Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/help.m4 Wed Jul 30 03:50:56 2014 -0700 +@@ -52,8 +52,6 @@ + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; +- * ) +- break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then +@@ -92,8 +90,6 @@ + If you put the resulting build in \"C:\Program Files\GnuWin32\", it will be found automatically." + fi + ;; +- * ) +- break ;; + esac + } + +@@ -119,8 +115,6 @@ + PKGHANDLER_COMMAND="sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev" ;; + ccache) + PKGHANDLER_COMMAND="sudo apt-get install ccache" ;; +- * ) +- break ;; + esac + } + +@@ -142,8 +136,6 @@ + PKGHANDLER_COMMAND="sudo yum install libXtst-devel libXt-devel libXrender-devel" ;; + ccache) + PKGHANDLER_COMMAND="sudo yum install ccache" ;; +- * ) +- break ;; + esac + } + +--- ./common/autoconf/hotspot-spec.gmk.in Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/hotspot-spec.gmk.in Wed Jul 30 03:50:56 2014 -0700 +@@ -91,6 +91,11 @@ + ALT_OUTPUTDIR=$(HOTSPOT_OUTPUTDIR) + ALT_EXPORT_PATH=$(HOTSPOT_DIST) + ++JVM_INTERPRETER:=@JVM_INTERPRETER@ ++ifeq ($(JVM_INTERPRETER), cpp) ++ CC_INTERP=true ++endif ++ + HOTSPOT_MAKE_ARGS:=@HOTSPOT_MAKE_ARGS@ @STATIC_CXX_SETTING@ + # This is used from the libjvm build for C/C++ code. + HOTSPOT_BUILD_JOBS:=$(JOBS) +--- ./common/autoconf/jdk-options.m4 Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/jdk-options.m4 Wed Jul 30 03:50:56 2014 -0700 +@@ -51,6 +51,33 @@ + AC_MSG_RESULT([$JDK_VARIANT]) + ]) + ++AC_DEFUN_ONCE([JDKOPT_SETUP_JVM_INTERPRETER], ++[ ++############################################################################### ++# ++# Check which interpreter of the JVM we want to build. ++# Currently we have: ++# template: Template interpreter (the default) ++# cpp : C++ interpreter ++AC_MSG_CHECKING([which interpreter of the JVM to build]) ++AC_ARG_WITH([jvm-interpreter], [AS_HELP_STRING([--with-jvm-interpreter], ++ [JVM interpreter to build (template, cpp) @<:@template@:>@])]) ++ ++if test "x$with_jvm_interpreter" = x; then ++ with_jvm_interpreter="template" ++fi ++ ++JVM_INTERPRETER="$with_jvm_interpreter" ++ ++if test "x$JVM_INTERPRETER" != xtemplate && test "x$JVM_INTERPRETER" != xcpp; then ++ AC_MSG_ERROR([The available JVM interpreters are: template, cpp]) ++fi ++ ++AC_SUBST(JVM_INTERPRETER) ++ ++AC_MSG_RESULT([$with_jvm_interpreter]) ++]) ++ + AC_DEFUN_ONCE([JDKOPT_SETUP_JVM_VARIANTS], + [ + +@@ -65,19 +92,20 @@ + # ie normal interpreter and C1, only the serial GC, kernel jvmti etc + # zero: no machine code interpreter, no compiler + # zeroshark: zero interpreter and shark/llvm compiler backend ++# core: interpreter only, no compiler (only works on some platforms) + AC_MSG_CHECKING([which variants of the JVM to build]) + AC_ARG_WITH([jvm-variants], [AS_HELP_STRING([--with-jvm-variants], +- [JVM variants (separated by commas) to build (server, client, minimal1, kernel, zero, zeroshark) @<:@server@:>@])]) ++ [JVM variants (separated by commas) to build (server, client, minimal1, kernel, zero, zeroshark, core) @<:@server@:>@])]) + + if test "x$with_jvm_variants" = x; then + with_jvm_variants="server" + fi + + JVM_VARIANTS=",$with_jvm_variants," +- TEST_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/server,//' -e 's/client,//' -e 's/minimal1,//' -e 's/kernel,//' -e 's/zero,//' -e 's/zeroshark,//'` ++ TEST_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/server,//' -e 's/client,//' -e 's/minimal1,//' -e 's/kernel,//' -e 's/zero,//' -e 's/zeroshark,//' -e 's/core,//'` + + if test "x$TEST_VARIANTS" != "x,"; then +- AC_MSG_ERROR([The available JVM variants are: server, client, minimal1, kernel, zero, zeroshark]) ++ AC_MSG_ERROR([The available JVM variants are: server, client, minimal1, kernel, zero, zeroshark, core]) + fi + AC_MSG_RESULT([$with_jvm_variants]) + +@@ -87,6 +115,7 @@ + JVM_VARIANT_KERNEL=`$ECHO "$JVM_VARIANTS" | $SED -e '/,kernel,/!s/.*/false/g' -e '/,kernel,/s/.*/true/g'` + JVM_VARIANT_ZERO=`$ECHO "$JVM_VARIANTS" | $SED -e '/,zero,/!s/.*/false/g' -e '/,zero,/s/.*/true/g'` + JVM_VARIANT_ZEROSHARK=`$ECHO "$JVM_VARIANTS" | $SED -e '/,zeroshark,/!s/.*/false/g' -e '/,zeroshark,/s/.*/true/g'` ++ JVM_VARIANT_CORE=`$ECHO "$JVM_VARIANTS" | $SED -e '/,core,/!s/.*/false/g' -e '/,core,/s/.*/true/g'` + + if test "x$JVM_VARIANT_CLIENT" = xtrue; then + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then +@@ -106,7 +135,7 @@ + + # Replace the commas with AND for use in the build directory name. + ANDED_JVM_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/^,//' -e 's/,$//' -e 's/,/AND/'` +- COUNT_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/server,/1/' -e 's/client,/1/' -e 's/minimal1,/1/' -e 's/kernel,/1/' -e 's/zero,/1/' -e 's/zeroshark,/1/'` ++ COUNT_VARIANTS=`$ECHO "$JVM_VARIANTS" | $SED -e 's/server,/1/' -e 's/client,/1/' -e 's/minimal1,/1/' -e 's/kernel,/1/' -e 's/zero,/1/' -e 's/zeroshark,/1/' -e 's/core,/1/'` + if test "x$COUNT_VARIANTS" != "x,1"; then + BUILDING_MULTIPLE_JVM_VARIANTS=yes + else +@@ -120,6 +149,7 @@ + AC_SUBST(JVM_VARIANT_KERNEL) + AC_SUBST(JVM_VARIANT_ZERO) + AC_SUBST(JVM_VARIANT_ZEROSHARK) ++ AC_SUBST(JVM_VARIANT_CORE) + + INCLUDE_SA=true + if test "x$JVM_VARIANT_ZERO" = xtrue ; then +@@ -128,6 +158,9 @@ + if test "x$JVM_VARIANT_ZEROSHARK" = xtrue ; then + INCLUDE_SA=false + fi ++ if test "x$VAR_CPU" = xppc64 ; then ++ INCLUDE_SA=false ++ fi + AC_SUBST(INCLUDE_SA) + + if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then +@@ -236,6 +269,10 @@ + HOTSPOT_TARGET="$HOTSPOT_TARGET${HOTSPOT_DEBUG_LEVEL}shark " + fi + ++ if test "x$JVM_VARIANT_CORE" = xtrue; then ++ HOTSPOT_TARGET="$HOTSPOT_TARGET${HOTSPOT_DEBUG_LEVEL}core " ++ fi ++ + HOTSPOT_TARGET="$HOTSPOT_TARGET docs export_$HOTSPOT_EXPORT" + + # On Macosx universal binaries are produced, but they only contain +--- ./common/autoconf/libraries.m4 Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/libraries.m4 Wed Jul 30 03:50:56 2014 -0700 +@@ -43,6 +43,14 @@ + AC_MSG_RESULT([alsa pulse]) + fi + ++ if test "x$OPENJDK_TARGET_OS" = xaix; then ++ AC_MSG_CHECKING([what is not needed on AIX?]) ++ ALSA_NOT_NEEDED=yes ++ PULSE_NOT_NEEDED=yes ++ AC_MSG_RESULT([alsa pulse]) ++ fi ++ ++ + if test "x$OPENJDK_TARGET_OS" = xwindows; then + AC_MSG_CHECKING([what is not needed on Windows?]) + CUPS_NOT_NEEDED=yes +@@ -554,7 +562,7 @@ + fi + + if test "x${with_alsa}" != x; then +- ALSA_LIBS="-L${with_alsa}/lib -lalsa" ++ ALSA_LIBS="-L${with_alsa}/lib -lasound" + ALSA_CFLAGS="-I${with_alsa}/include" + ALSA_FOUND=yes + fi +@@ -563,7 +571,7 @@ + ALSA_FOUND=yes + fi + if test "x${with_alsa_lib}" != x; then +- ALSA_LIBS="-L${with_alsa_lib} -lalsa" ++ ALSA_LIBS="-L${with_alsa_lib} -lasound" + ALSA_FOUND=yes + fi + if test "x$ALSA_FOUND" = xno; then +--- ./common/autoconf/platform.m4 Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/platform.m4 Wed Jul 30 03:50:56 2014 -0700 +@@ -60,6 +60,12 @@ + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; ++ powerpc64le) ++ VAR_CPU=ppc64 ++ VAR_CPU_ARCH=ppc ++ VAR_CPU_BITS=64 ++ VAR_CPU_ENDIAN=little ++ ;; + s390) + VAR_CPU=s390 + VAR_CPU_ARCH=s390 +@@ -126,6 +132,11 @@ + VAR_OS_API=winapi + VAR_OS_ENV=windows.msys + ;; ++ *aix*) ++ VAR_OS=aix ++ VAR_OS_API=posix ++ VAR_OS_ENV=aix ++ ;; + *) + AC_MSG_ERROR([unsupported operating system $1]) + ;; +@@ -432,9 +443,9 @@ + # keep track of these additions in ADDED_CFLAGS etc. These + # will later be checked to make sure only controlled additions + # have been made to CFLAGS etc. +- ADDED_CFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}" +- ADDED_CXXFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}" +- ADDED_LDFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_CFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_CXXFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" ++ ADDED_LDFLAGS=" ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" + + CFLAGS="${CFLAGS}${ADDED_CFLAGS}" + CXXFLAGS="${CXXFLAGS}${ADDED_CXXFLAGS}" +@@ -454,8 +465,9 @@ + # is made at runtime.) + # + +- if test "x$OPENJDK_TARGET_OS" = xsolaris; then +- # Always specify -m flags on Solaris ++ if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xaix; then ++ # Always specify -m flag on Solaris ++ # And -q on AIX because otherwise the compiler produces 32-bit objects by default + PLATFORM_SET_COMPILER_TARGET_BITS_FLAGS + elif test "x$COMPILE_TYPE" = xreduced; then + if test "x$OPENJDK_TARGET_OS" != xwindows; then +@@ -477,19 +489,34 @@ + + AC_CHECK_SIZEOF([int *], [1111]) + +- if test "x$SIZEOF_INT_P" != "x$ac_cv_sizeof_int_p"; then +- # Workaround autoconf bug, see http://lists.gnu.org/archive/html/autoconf/2010-07/msg00004.html +- SIZEOF_INT_P="$ac_cv_sizeof_int_p" +- fi +- +- if test "x$SIZEOF_INT_P" = x; then ++ # AC_CHECK_SIZEOF defines 'ac_cv_sizeof_int_p' to hold the number of bytes used by an 'int*' ++ if test "x$ac_cv_sizeof_int_p" = x; then + # The test failed, lets stick to the assumed value. + AC_MSG_WARN([The number of bits in the target could not be determined, using $OPENJDK_TARGET_CPU_BITS.]) + else +- TESTED_TARGET_CPU_BITS=`expr 8 \* $SIZEOF_INT_P` ++ TESTED_TARGET_CPU_BITS=`expr 8 \* $ac_cv_sizeof_int_p` + + if test "x$TESTED_TARGET_CPU_BITS" != "x$OPENJDK_TARGET_CPU_BITS"; then +- AC_MSG_ERROR([The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS)]) ++ # This situation may happen on 64-bit platforms where the compiler by default only generates 32-bit objects ++ # Let's try to implicitely set the compilers target architecture and retry the test ++ AC_MSG_NOTICE([The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS).]) ++ AC_MSG_NOTICE([I'll retry after setting the platforms compiler target bits flag to ${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}]) ++ PLATFORM_SET_COMPILER_TARGET_BITS_FLAGS ++ ++ # We have to unset 'ac_cv_sizeof_int_p' first, otherwise AC_CHECK_SIZEOF will use the previously cached value! ++ unset ac_cv_sizeof_int_p ++ # And we have to undef the definition of SIZEOF_INT_P in confdefs.h by the previous invocation of AC_CHECK_SIZEOF ++ cat >>confdefs.h <<_ACEOF ++#undef SIZEOF_INT_P ++_ACEOF ++ ++ AC_CHECK_SIZEOF([int *], [1111]) ++ ++ TESTED_TARGET_CPU_BITS=`expr 8 \* $ac_cv_sizeof_int_p` ++ ++ if test "x$TESTED_TARGET_CPU_BITS" != "x$OPENJDK_TARGET_CPU_BITS"; then ++ AC_MSG_ERROR([The tested number of bits in the target ($TESTED_TARGET_CPU_BITS) differs from the number of bits expected to be found in the target ($OPENJDK_TARGET_CPU_BITS)]) ++ fi + fi + fi + +--- ./common/autoconf/spec.gmk.in Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/spec.gmk.in Wed Jul 30 03:50:56 2014 -0700 +@@ -208,6 +208,7 @@ + JVM_VARIANT_KERNEL:=@JVM_VARIANT_KERNEL@ + JVM_VARIANT_ZERO:=@JVM_VARIANT_ZERO@ + JVM_VARIANT_ZEROSHARK:=@JVM_VARIANT_ZEROSHARK@ ++JVM_VARIANT_CORE:=@JVM_VARIANT_CORE@ + + # Universal binaries on macosx + MACOSX_UNIVERSAL=@MACOSX_UNIVERSAL@ +@@ -297,6 +298,8 @@ + COMPILER_TYPE:=@COMPILER_TYPE@ + COMPILER_NAME:=@COMPILER_NAME@ + ++# Option used to tell the compiler whether to create 32- or 64-bit executables ++COMPILER_TARGET_BITS_FLAG:=@COMPILER_TARGET_BITS_FLAG@ + COMPILER_SUPPORTS_TARGET_BITS_FLAG=@COMPILER_SUPPORTS_TARGET_BITS_FLAG@ + + CC_OUT_OPTION:=@CC_OUT_OPTION@ +@@ -340,6 +343,11 @@ + # The linker can be gcc or ld on posix systems, or link.exe on windows systems. + LD:=@FIXPATH@ @LD@ + ++# The linker on older SuSE distros (e.g. on SLES 10) complains with: ++# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable." ++# if feeded with a version script which contains named tags. ++USING_BROKEN_SUSE_LD:=@USING_BROKEN_SUSE_LD@ ++ + # LDFLAGS used to link the jdk native libraries (C-code) + LDFLAGS_JDKLIB:=@LDFLAGS_JDKLIB@ + LDFLAGS_JDKLIB_SUFFIX:=@LDFLAGS_JDKLIB_SUFFIX@ +--- ./common/autoconf/toolchain.m4 Tue Jun 03 14:19:17 2014 -0700 ++++ ./common/autoconf/toolchain.m4 Wed Jul 30 03:50:56 2014 -0700 +@@ -44,6 +44,15 @@ + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*@<:@ ,\t@:>@$COMPILER_NAME@<:@ ,\t@:>@\(@<:@1-9@:>@\.@<:@0-9@:>@@<:@0-9@:>@*\).*/\1/p"` + COMPILER_VENDOR="Sun Studio" + fi ++ elif test "x$OPENJDK_TARGET_OS" = xaix; then ++ COMPILER_VERSION_TEST=`$COMPILER -qversion 2>&1 | $TAIL -n 1` ++ $ECHO $COMPILER_VERSION_TEST | $GREP "^Version: " > /dev/null ++ if test $? -ne 0; then ++ AC_MSG_ERROR([Failed to detect the compiler version of $COMPILER ....]) ++ else ++ COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n 's/Version: \([0-9][0-9]\.[0-9][0-9]*\).*/\1/p'` ++ COMPILER_VENDOR='IBM' ++ fi + elif test "x$OPENJDK_TARGET_OS" = xwindows; then + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86 +@@ -137,10 +146,14 @@ + AC_MSG_ERROR([Could not find a $COMPILER_NAME compiler. $HELP_MSG]) + fi + BASIC_FIXUP_EXECUTABLE($1) +- AC_MSG_CHECKING([resolved symbolic links for $1]) + TEST_COMPILER="[$]$1" +- BASIC_REMOVE_SYMBOLIC_LINKS(TEST_COMPILER) +- AC_MSG_RESULT([$TEST_COMPILER]) ++ # Don't remove symbolic links on AIX because 'xlc_r' and 'xlC_r' may all be links ++ # to 'xlc' but it is crucial that we invoke the compiler with the right name! ++ if test "x$OPENJDK_BUILD_OS" != xaix; then ++ AC_MSG_CHECKING([resolved symbolic links for $1]) ++ BASIC_REMOVE_SYMBOLIC_LINKS(TEST_COMPILER) ++ AC_MSG_RESULT([$TEST_COMPILER]) ++ fi + AC_MSG_CHECKING([if $1 is disguised ccache]) + + COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` +@@ -254,6 +267,9 @@ + COMPILER_CHECK_LIST="cl" + elif test "x$OPENJDK_TARGET_OS" = "xsolaris"; then + COMPILER_CHECK_LIST="cc gcc" ++ elif test "x$OPENJDK_TARGET_OS" = "xaix"; then ++ # Do not probe for cc on AIX. ++ COMPILER_CHECK_LIST="xlc_r" + else + COMPILER_CHECK_LIST="gcc cc" + fi +@@ -262,6 +278,14 @@ + # Now that we have resolved CC ourself, let autoconf have its go at it + AC_PROG_CC([$CC]) + ++ # Option used to tell the compiler whether to create 32- or 64-bit executables ++ # Notice that CC contains the full compiler path at this point. ++ case $CC in ++ *xlc_r) COMPILER_TARGET_BITS_FLAG="-q";; ++ *) COMPILER_TARGET_BITS_FLAG="-m";; ++ esac ++ AC_SUBST(COMPILER_TARGET_BITS_FLAG) ++ + ### Locate C++ compiler (CXX) + + if test "x$CXX" != x; then +@@ -270,6 +294,9 @@ + COMPILER_CHECK_LIST="cl" + elif test "x$OPENJDK_TARGET_OS" = "xsolaris"; then + COMPILER_CHECK_LIST="CC g++" ++ elif test "x$OPENJDK_TARGET_OS" = "xaix"; then ++ # Do not probe for CC on AIX . ++ COMPILER_CHECK_LIST="xlC_r" + else + COMPILER_CHECK_LIST="g++ CC" + fi +@@ -311,6 +338,8 @@ + fi + if test "x$OPENJDK_TARGET_OS" = xmacosx; then + ARFLAGS="-r" ++ elif test "x$OPENJDK_TARGET_OS" = xaix; then ++ ARFLAGS="-X64" + else + ARFLAGS="" + fi +@@ -554,6 +583,29 @@ + POST_STRIP_CMD="$STRIP -x" + POST_MCS_CMD="$MCS -d -a \"JDK $FULL_VERSION\"" + fi ++ if test "x$OPENJDK_TARGET_OS" = xaix; then ++ COMPILER_NAME=xlc ++ PICFLAG="-qpic=large" ++ LIBRARY_PREFIX=lib ++ SHARED_LIBRARY='lib[$]1.so' ++ STATIC_LIBRARY='lib[$]1.a' ++ SHARED_LIBRARY_FLAGS="-qmkshrobj" ++ SHARED_LIBRARY_SUFFIX='.so' ++ STATIC_LIBRARY_SUFFIX='.a' ++ OBJ_SUFFIX='.o' ++ EXE_SUFFIX='' ++ SET_SHARED_LIBRARY_NAME='' ++ SET_SHARED_LIBRARY_MAPFILE='' ++ C_FLAG_REORDER='' ++ CXX_FLAG_REORDER='' ++ SET_SHARED_LIBRARY_ORIGIN='' ++ SET_EXECUTABLE_ORIGIN="" ++ CFLAGS_JDK="" ++ CXXFLAGS_JDK="" ++ CFLAGS_JDKLIB_EXTRA='' ++ POST_STRIP_CMD="$STRIP -X32_64" ++ POST_MCS_CMD="" ++ fi + if test "x$OPENJDK_TARGET_OS" = xwindows; then + # If it is not gcc, then assume it is the MS Visual Studio compiler + COMPILER_NAME=cl +@@ -730,6 +782,24 @@ + + CFLAGS_DEBUG_SYMBOLS="-g -xs" + CXXFLAGS_DEBUG_SYMBOLS="-g0 -xs" ++ ;; ++ xlc ) ++ C_FLAG_DEPS="-qmakedep=gcc -MF" ++ CXX_FLAG_DEPS="-qmakedep=gcc -MF" ++ C_O_FLAG_HIGHEST="-O3" ++ C_O_FLAG_HI="-O3 -qstrict" ++ C_O_FLAG_NORM="-O2" ++ C_O_FLAG_NONE="" ++ CXX_O_FLAG_HIGHEST="-O3" ++ CXX_O_FLAG_HI="-O3 -qstrict" ++ CXX_O_FLAG_NORM="-O2" ++ CXX_O_FLAG_NONE="" ++ CFLAGS_DEBUG_SYMBOLS="-g" ++ CXXFLAGS_DEBUG_SYMBOLS="-g" ++ LDFLAGS_JDK="${LDFLAGS_JDK} -q64 -brtl -bnolibpath -liconv -bexpall" ++ CFLAGS_JDK="${CFLAGS_JDK} -qchars=signed -q64 -qfullpath -qsaveopt" ++ CXXFLAGS_JDK="${CXXFLAGS_JDK} -qchars=signed -q64 -qfullpath -qsaveopt" ++ ;; + esac + ;; + CL ) +@@ -840,6 +910,13 @@ + LDFLAGS_JDK="$LDFLAGS_JDK -z defs -xildoff -ztext" + LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK -norunpath -xnolib" + ;; ++ xlc ) ++ 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" ++ ++ LDFLAGS_JDK="$LDFLAGS_JDK" ++ LDFLAGS_CXX_JDK="$LDFLAGS_CXX_JDK" ++ ;; + cl ) + CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -Zi -MD -Zc:wchar_t- -W3 -wd4800 \ + -D_STATIC_CPPLIB -D_DISABLE_DEPRECATE_STATIC_CPPLIB -DWIN32_LEAN_AND_MEAN \ +@@ -909,6 +986,9 @@ + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DSOLARIS" + fi ++ if test "x$OPENJDK_TARGET_OS" = xaix; then ++ CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DAIX -DPPC64" ++ fi + if test "x$OPENJDK_TARGET_OS" = xmacosx; then + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT" + # Setting these parameters makes it an error to link to macosx APIs that are +@@ -1076,20 +1156,38 @@ + # ZERO_ARCHFLAG tells the compiler which mode to build for + case "${OPENJDK_TARGET_CPU}" in + s390) +- ZERO_ARCHFLAG="-m31" ++ ZERO_ARCHFLAG="${COMPILER_TARGET_BITS_FLAG}31" + ;; + *) +- ZERO_ARCHFLAG="-m${OPENJDK_TARGET_CPU_BITS}" ++ ZERO_ARCHFLAG="${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}" + esac + TOOLCHAIN_COMPILER_CHECK_ARGUMENTS([$ZERO_ARCHFLAG], [], [ZERO_ARCHFLAG=""]) + AC_SUBST(ZERO_ARCHFLAG) + +- # Check that the compiler supports -mX flags ++ # Check that the compiler supports -mX (or -qX on AIX) flags + # Set COMPILER_SUPPORTS_TARGET_BITS_FLAG to 'true' if it does +- TOOLCHAIN_COMPILER_CHECK_ARGUMENTS([-m${OPENJDK_TARGET_CPU_BITS}], ++ TOOLCHAIN_COMPILER_CHECK_ARGUMENTS([${COMPILER_TARGET_BITS_FLAG}${OPENJDK_TARGET_CPU_BITS}], + [COMPILER_SUPPORTS_TARGET_BITS_FLAG=true], + [COMPILER_SUPPORTS_TARGET_BITS_FLAG=false]) + AC_SUBST(COMPILER_SUPPORTS_TARGET_BITS_FLAG) ++ ++ ++ # 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$GCC" = xyes; 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 ++ 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 ++ else ++ AC_MSG_RESULT(yes) ++ USING_BROKEN_SUSE_LD=yes ++ fi ++ rm -rf version-script.map main.c ++ fi ++ AC_SUBST(USING_BROKEN_SUSE_LD) + ]) + + # Setup the JTREG paths +--- ./make/Javadoc.gmk Tue Jun 03 14:19:17 2014 -0700 ++++ ./make/Javadoc.gmk Wed Jul 30 03:50:56 2014 -0700 +@@ -72,6 +72,7 @@ + TREEAPI_FIRST_COPYRIGHT_YEAR = 2005 + JNLP_FIRST_COPYRIGHT_YEAR = 1998 + PLUGIN2_FIRST_COPYRIGHT_YEAR = 2007 ++JDKNET_FIRST_COPYRIGHT_YEAR = 2014 + + # Oracle name + FULL_COMPANY_NAME = Oracle and/or its affiliates +@@ -102,10 +103,7 @@ + DOCSDIR_URL = {@docroot}/$(GET2DOCSDIR) + + # Url to copyright html file +-COPYRIGHT_URL-7 = $(DOCSDIR_URL)/legal/cpyr.html +-# This isn't added in old build yet. +-#COPYRIGHT_URL-8 = $(DOCSDIR_URL)/legal/cpyr.html +-COPYRIGHT_URL = $(COPYRIGHT_URL-$(JDK_MINOR_VERSION)) ++COPYRIGHT_URL = $(DOCSDIR_URL)/legal/cpyr.html + + # Url to bug filing site + BUG_SUBMIT_URL = http://bugreport.sun.com/bugreport/ +@@ -1147,6 +1145,57 @@ + + ############################################################# + # ++# jdk.net docs ++# ++ ++ALL_OTHER_TARGETS += jdknetdocs ++ ++JDKNET_DOCDIR := $(JRE_API_DOCSDIR)/net/socketoptions/spec ++JDKNET2COREAPI := ../../../$(JDKJRE2COREAPI) ++JDKNET_DOCTITLE := jdk.net API ++JDKNET_WINDOWTITLE := jdk.net API ++JDKNET_HEADER := jdk.net API ++JDKNET_BOTTOM := $(call CommonBottom,$(JDKNET_FIRST_COPYRIGHT_YEAR)) ++JDKNET_PKGS := jdk.net ++ ++JDKNET_INDEX_HTML = $(JDKNET_DOCDIR)/index.html ++JDKNET_OPTIONS_FILE = $(DOCSTMPDIR)/jdknet.options ++JDKNET_PACKAGES_FILE = $(DOCSTMPDIR)/jdknet.packages ++ ++jdknetdocs: $(JDKNET_INDEX_HTML) ++ ++# Set relative location to core api document root ++$(JDKNET_INDEX_HTML): GET2DOCSDIR=$(JDKNET2COREAPI)/.. ++ ++# Run javadoc if the index file is out of date or missing ++$(JDKNET_INDEX_HTML): $(JDKNET_OPTIONS_FILE) $(JDKNET_PACKAGES_FILE) coredocs ++ $(prep-javadoc) ++ $(call JavadocSummary,$(JDKNET_OPTIONS_FILE),$(JDKNET_PACKAGES_FILE)) ++ $(JAVADOC_CMD) -d $(@D) \ ++ @$(JDKNET_OPTIONS_FILE) @$(JDKNET_PACKAGES_FILE) ++ ++# Create file with javadoc options in it ++$(JDKNET_OPTIONS_FILE): ++ $(prep-target) ++ @($(call OptionOnly,$(COMMON_JAVADOCFLAGS)) ; \ ++ $(call OptionOnly,-Xdoclint:none) ; \ ++ $(call OptionPair,-sourcepath,$(RELEASEDOCS_SOURCEPATH)) ; \ ++ $(call OptionPair,-encoding,ascii) ; \ ++ $(call OptionOnly,-nodeprecatedlist) ; \ ++ $(call OptionPair,-doctitle,$(JDKNET_DOCTITLE)) ; \ ++ $(call OptionPair,-windowtitle,$(JDKNET_WINDOWTITLE) $(DRAFT_WINTITLE)); \ ++ $(call OptionPair,-header,$(JDKNET_HEADER)$(DRAFT_HEADER)); \ ++ $(call OptionPair,-bottom,$(JDKNET_BOTTOM)$(DRAFT_BOTTOM)); \ ++ $(call OptionTrip,-linkoffline,$(JDKNET2COREAPI),$(COREAPI_DOCSDIR)/); \ ++ ) >> $@ ++ ++# Create a file with the package names in it ++$(JDKNET_PACKAGES_FILE): $(DIRECTORY_CACHE) $(call PackageDependencies,$(JDKNET_PKGS)) ++ $(prep-target) ++ $(call PackageFilter,$(JDKNET_PKGS)) ++ ++############################################################# ++# + # Get a cache of all the directories + + $(DIRECTORY_CACHE): $(ALL_EXISTING_SOURCE_DIRS) +--- ./make/common/JavaCompilation.gmk Tue Jun 03 14:19:17 2014 -0700 ++++ ./make/common/JavaCompilation.gmk Wed Jul 30 03:50:56 2014 -0700 +@@ -163,11 +163,12 @@ + + # The capture contents macro finds all files (matching the patterns, typically + # .class and .prp) that are newer than the jar-file, ie the new content to be put into the jar. ++ # NOTICE: please leave the parentheses space separated otherwise the AIX build will break! + $1_CAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS), \ +- (($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) -a -newer $$@ $$($1_GREP_INCLUDES) \ ++ ( ( $(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) -a -newer $$@ $$($1_GREP_INCLUDES) \ + $$($1_GREP_EXCLUDES) | $(SED) 's|$$(src)/||g' && \ +- $(ECHO) $$(subst $$(src)/,,$$($1_EXTRA_FILES))) > \ +- $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) ++ $(ECHO) $$(subst $$(src)/,,$$($1_EXTRA_FILES) ) ) > \ ++ $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE) ) + # The capture metainf macro finds all files below the META-INF directory that are newer than the jar-file. + ifeq (,$$($1_SKIP_METAINF)) + $1_CAPTURE_METAINF =$$(foreach src,$$($1_SRCS),($(FIND) $$(src)/META-INF -type f -a -newer $$@ 2> /dev/null | $(SED) 's|$$(src)/||g' >> $$(src)/_the.$$($1_JARNAME)_contents ) $$(NEWLINE)) +@@ -176,19 +177,20 @@ + # tells us what to remove from the jar-file. + $1_CAPTURE_DELETES=$$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name _the.package.deleted -newer $$@ -exec $(SED) 's|$$(src)||g' \{\} >> $$($1_DELETES_FILE) \;) $$(NEWLINE)) + # The update contents macro updates the jar file with the previously capture contents. +- # xargs is used to trim the whitespace from the contents file, to see if it is empty. ++ # Use 'wc -w' to see if the contents file is empty. + $1_UPDATE_CONTENTS=$$(foreach src,$$($1_SRCS), \ + (cd $$(src) && \ +- if [ -n "`$(CAT) _the.$$($1_JARNAME)_contents | $(XARGS)`" ]; then \ ++ if [ "`$(WC) -w _the.$$($1_JARNAME)_contents | $(AWK) '{ print $$$$1 }'`" -gt "0" ]; then \ + $(ECHO) " updating" `$(WC) -l _the.$$($1_JARNAME)_contents | $(AWK) '{ print $$$$1 }'` files && \ + $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @_the.$$($1_JARNAME)_contents; \ + fi) $$(NEWLINE)) + # The s-variants of the above macros are used when the jar is created from scratch. ++ # NOTICE: please leave the parentheses space separated otherwise the AIX build will break! + $1_SCAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS), \ +- (($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) \ ++ ( ( $(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) \ + $$($1_GREP_EXCLUDES) | $(SED) 's|$$(src)/||g' && \ +- $$(subst $$(src)/,,$(ECHO) $$($1_EXTRA_FILES))) > \ +- $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) ++ $$(subst $$(src)/,,$(ECHO) $$($1_EXTRA_FILES) ) ) > \ ++ $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE) ) + + ifeq (,$$($1_SKIP_METAINF)) + $1_SCAPTURE_METAINF=$$(foreach src,$$($1_SRCS), \ +@@ -527,16 +529,16 @@ + # When building in batch, put headers in a temp dir to filter out those that actually + # changed before copying them to the real header dir. + ifneq (,$$($1_HEADERS)) +- $1_HEADERS_ARG := -h $$($1_HEADERS).tmp ++ $1_HEADERS_ARG := -h $$($1_HEADERS).$1.tmp + + $$($1_HEADERS)/_the.$1_headers: $$($1_BIN)/_the.$1_batch + $(MKDIR) -p $$(@D) +- for f in `ls $$($1_HEADERS).tmp`; do \ +- if [ ! -f "$$($1_HEADERS)/$$$$f" ] || [ "`$(DIFF) $$($1_HEADERS)/$$$$f $$($1_HEADERS).tmp/$$$$f`" != "" ]; then \ +- $(CP) -f $$($1_HEADERS).tmp/$$$$f $$($1_HEADERS)/$$$$f; \ ++ for f in `ls $$($1_HEADERS).$1.tmp`; do \ ++ if [ ! -f "$$($1_HEADERS)/$$$$f" ] || [ "`$(DIFF) $$($1_HEADERS)/$$$$f $$($1_HEADERS).$1.tmp/$$$$f`" != "" ]; then \ ++ $(CP) -f $$($1_HEADERS).$1.tmp/$$$$f $$($1_HEADERS)/$$$$f; \ + fi; \ + done +- $(RM) -r $$($1_HEADERS).tmp ++ $(RM) -r $$($1_HEADERS).$1.tmp + $(TOUCH) $$@ + + $1 += $$($1_HEADERS)/_the.$1_headers +--- ./make/common/NON_CORE_PKGS.gmk Tue Jun 03 14:19:17 2014 -0700 ++++ ./make/common/NON_CORE_PKGS.gmk Wed Jul 30 03:50:56 2014 -0700 +@@ -94,7 +94,8 @@ + com.apple.eio + endif + +-JDK_PKGS = jdk ++JDK_PKGS = jdk \ ++ jdk.net + + # non-core packages in rt.jar + NON_CORE_PKGS = $(DOMAPI_PKGS) \ +--- ./make/common/NativeCompilation.gmk Tue Jun 03 14:19:17 2014 -0700 ++++ ./make/common/NativeCompilation.gmk Wed Jul 30 03:50:56 2014 -0700 +@@ -501,7 +501,7 @@ + # Generating a static library, ie object file archive. + $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) + $$(call ARCHIVING_MSG,$$($1_LIBRARY)) +- $(AR) $$($1_AR_FLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_EXPECTED_OBJS) \ ++ $(AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_EXPECTED_OBJS) \ + $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX) + endif + +--- ./corba/.hgtags Tue Jun 03 14:19:19 2014 -0700 ++++ ./corba/.hgtags Wed Jul 30 03:51:08 2014 -0700 +@@ -245,7 +245,9 @@ + a7d3638deb2f4e33217b1ecf889479e90f9e5b50 jdk8-b121 + 0cd687347540b1d14e9cc653ba6af5f6807eb379 jdk8-b122 + 1ecd4619f60c2432120821e805e64bdb45de66cc jdk8-b123 ++afecd2878aee29c2d0282d2c6b3ba56e91b0b2de jdk8u20-b00 + 7b45151c7a05764b87ca088ba70448d39de6d41f jdk8-b124 ++7547c6a90a9e06b11ec1dca943b30c09c1665aa8 jdk8u20-b01 + 7b45151c7a05764b87ca088ba70448d39de6d41f jdk8-b125 + 8ceb68fd9e107767edf949c6b3ac9d425ca93cac jdk8-b126 + b8c71dae05574f8eca7ca6d703b16b450850b033 jdk8-b127 +@@ -268,6 +270,7 @@ + a2f7b36bfc1bc8df033fe5721b48fac1c3928a5b jdk8u5-b11 + 475b96f6d8cecf720ca9fd6d332dd4bafb0f654c jdk8u5-b12 + 897088ef059f53a8aa73267985666ad319223064 jdk8u5-b13 ++0355626e88639a9b51b209f26f48dee28c924c72 jdk8u5-b31 + e2cfebaf3b9d0eae06c2d5ee7669180f1723f897 jdk8u11-b01 + 152d1b91e5c5dfc940cccef1bfeae60a6604032a jdk8u11-b02 + 60b073836311720d4f013d4493af2729ebe663f6 jdk8u11-b03 +@@ -279,3 +282,32 @@ + f846c0c1c330545b8a85fc05a36fa95f48757525 jdk8u11-b09 + 3e4b895d06e8d292f7338aa2155849173722062f jdk8u11-b10 + ce324096c5626997634df1e5fa68f206909431ab jdk8u11-b11 ++c4d817051c6a620a4f748e9e057423a774f172c7 jdk8u11-b12 ++c79def3415b9c36e925d71d247de6bf60240a29b jdk8u11-b31 ++bfafb13aac1c8b2d9184d59ec510b45d965b7667 jdk8u20-b02 ++9059a1c857044ad5ce7564ddb71a064364f8fcf5 jdk8u20-b03 ++abe5b0157c367a72f9059269ca633ecfe15732d2 jdk8u20-b04 ++17d296953274eb110f284035ddb6c588f8b61823 jdk8u20-b05 ++0683ee308085785d0455f4153e764e062843f178 jdk8-b130 ++5e5c8f0c45dd75a08089586ca50835393f00c2cb jdk8-b131 ++84fed37bbe640666bfc022c2e8b9fde468de35d2 jdk8-b132 ++bcdc679d86aa752ccb62f6ecb182ff10ea09dce1 jdk8u20-b06 ++32b9c4f0ab3c6d33f70724b775cb9d12c004be6d jdk8u20-b07 ++4e4a75376185ca1a712cc9fef5a340e6927cf5e2 jdk8u20-b08 ++0344396d09b0e20d4a8d1bdff9f129250a60f365 jdk8u20-b09 ++e930c4fa31586b0f21887f7b50fba927550f17fb jdk8u20-b10 ++9a6092124c7c926d380a5f3b0f899fd1427c6e69 jdk8u20-b11 ++673829390271e51f8bc442ffbd4726833a7b1c06 jdk8u20-b12 ++d9985581e2a4973b48817103cd006f70863bc776 jdk8u20-b13 ++1680797c869e6e6df965c83a854fe7633ab94aa7 jdk8u20-b14 ++5949c13039299a0052343e81bb7da2e2068282fa jdk8u20-b15 ++db1b47c1102e31fe649e0ca13a85dc4f13281df4 jdk8u20-b16 ++90a428aa799d843cfc923031bd79f9e3896b49fa jdk8u20-b17 ++2c5113522ce5b887ce060b6accf225095349fc3c jdk8u20-b18 ++b078cb18ef95fe1afeacab70c2c313b6abbc959c jdk8u20-b19 ++aca1d25d10812c86024d9dbb7ec529876cca55e8 jdk8u20-b20 ++7d1e0f0b63f1d66c77924d8b2a1accdf8f7480db jdk8u20-b21 ++7677bf14d105ca23ab045f5041ceb19ee88b86c6 jdk8u20-b22 ++919405d7316dfcbddee5ad8dd08905916df88e04 jdk8u20-b23 ++34c930eaa6b591621afde05ca2e24571c91cdc9b jdk8u20-b24 ++34c930eaa6b591621afde05ca2e24571c91cdc9b jdk8u20-b25 +--- ./corba/THIRD_PARTY_README Tue Jun 03 14:19:19 2014 -0700 ++++ ./corba/THIRD_PARTY_README Wed Jul 30 03:51:08 2014 -0700 +@@ -2,7 +2,7 @@ + ----------------------------- + + %% This notice is provided with respect to ASM Bytecode Manipulation +-Framework v5.0, which may be included with JRE 8, and JDK 8, and ++Framework v5.0.3, which may be included with JRE 8, and JDK 8, and + OpenJDK 8. + + --- begin of LICENSE --- +@@ -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 +@@ -3349,14 +3349,14 @@ + + ------------------------------------------------------------------------------- + +-%% This notice is provided with respect to zlib v1.2.5, which may be included ++%% This notice is provided with respect to zlib v1.2.8, which may be included + with JRE 8, JDK 8, and OpenJDK 8. + + --- begin of LICENSE --- + +- version 1.2.5, July 18th, 2005 +- +- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler ++ version 1.2.8, April 28th, 2013 ++ ++ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages +@@ -3382,11 +3382,11 @@ + ------------------------------------------------------------------------------- + + %% This notice is provided with respect to the following which may be +-included with JRE 8, JDK 8, and OpenJDK 8, except where noted: +- +- Apache Commons Math 2.2 +- Apache Derby 10.10.1.2 [included with JDK 8] +- Apache Jakarta BCEL 5.2 ++included with JRE 8, JDK 8, and OpenJDK 8. ++ ++ Apache Commons Math 3.2 ++ Apache Derby 10.10.1.3 ++ Apache Jakarta BCEL 5.1 + Apache Jakarta Regexp 1.4 + Apache Santuario XML Security for Java 1.5.4 + Apache Xalan-Java 2.7.1 +--- ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_ja.properties Tue Jun 03 14:19:19 2014 -0700 ++++ ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_ja.properties Wed Jul 30 03:51:08 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -95,7 +95,7 @@ + bootstrap.exception=\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u30D5\u30A1\u30A4\u30EB{0}\u306B\u4FDD\u5B58\u4E2D\u306B\u4F8B\u5916\u3092\u6355\u6349\u3057\u307E\u3057\u305F: \u4F8B\u5916{1} + + tnameserv.exception=\u30DD\u30FC\u30C8{0}\u3067\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30B5\u30FC\u30D3\u30B9\u3092\u8D77\u52D5\u4E2D\u306B\u4F8B\u5916\u3092\u6355\u6349\u3057\u307E\u3057\u305F +-tnameserv.usage=\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u5F15\u6570-ORBInitialPort\u3092\u4F7F\u7528\u3057\u3066\u5225\u306E\u30DD\u30FC\u30C8\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044 ++tnameserv.usage=\u30B3\u30DE\u30F3\u30C9\u884C\u5F15\u6570-ORBInitialPort\u3092\u4F7F\u7528\u3057\u3066\u5225\u306E\u30DD\u30FC\u30C8\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044 + tnameserv.invalidhostoption=ORBInitialHost\u306FNameService\u306B\u6709\u52B9\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u306F\u3042\u308A\u307E\u305B\u3093 + tnameserv.orbinitialport0=ORBInitialPort 0\u306FNameService\u306B\u6709\u52B9\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u306F\u3042\u308A\u307E\u305B\u3093 + tnameserv.hs1=\u521D\u671F\u30CD\u30FC\u30DF\u30F3\u30B0\u30FB\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8:\n{0} +--- ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_pt_BR.properties Tue Jun 03 14:19:19 2014 -0700 ++++ ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_pt_BR.properties Wed Jul 30 03:51:08 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -23,7 +23,7 @@ + # questions. + # + +-orbd.usage=Uso: {0} \n\nem que inclui:\n -port porta de ativa\u00E7\u00E3o na qual o ORBD deve ser iniciado, default 1049 (opcional)\n -defaultdb diret\u00F3rio dos arquivos ORBD, default "./orb.db" (opcional)\n -serverid id do servidor para ORBD, default 1 (opcional)\n -ORBInitialPort porta inicial (obrigat\u00F3rio)\n -ORBInitialHost nome de host inicial (obrigat\u00F3rio)\n ++orbd.usage=Uso: {0} \n\nem que inclui:\n -port porta de ativa\u00E7\u00E3o na qual o ORBD deve ser iniciado, padr\u00E3o 1049 (opcional)\n -defaultdb diret\u00F3rio dos arquivos ORBD, padr\u00E3o "./orb.db" (opcional)\n -serverid id do servidor para ORBD, padr\u00E3o 1 (opcional)\n -ORBInitialPort porta inicial (obrigat\u00F3rio)\n -ORBInitialHost nome de host inicial (obrigat\u00F3rio)\n + + servertool.usage=Uso: {0} \n\nem que inclui:\n -ORBInitialPort porta inicial (obrigat\u00F3rio)\n -ORBInitialHost nome de host inicial (obrigat\u00F3rio)\n + servertool.banner=\n\nBem-vindo \u00E0 Ferramenta de Servidor IDL Java \ninsira os comandos no prompt \n +--- ./corba/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelAcceptorImpl.java Tue Jun 03 14:19:19 2014 -0700 ++++ ./corba/src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelAcceptorImpl.java Wed Jul 30 03:51:08 2014 -0700 +@@ -253,6 +253,13 @@ + // registered with the selector. Otherwise if the bytes + // are read on the connection it will attempt a time stamp + // but the cache will be null, resulting in NPE. ++ ++ // A connection needs to be timestamped before putting to the cache. ++ // Otherwise the newly created connection (with 0 timestamp) could be ++ // incorrectly reclaimed by concurrent reclaim() call OR if there ++ // will be no events on this connection then it could be reclaimed ++ // by upcoming reclaim() call. ++ getConnectionCache().stampTime(connection); + getConnectionCache().put(this, connection); + + if (connection.shouldRegisterServerReadEvent()) { +--- ./corba/src/share/classes/org/omg/CORBA/ORB.java Tue Jun 03 14:19:19 2014 -0700 ++++ ./corba/src/share/classes/org/omg/CORBA/ORB.java Wed Jul 30 03:51:08 2014 -0700 +@@ -291,28 +291,12 @@ + (className.equals("com.sun.corba.se.impl.orb.ORBSingleton"))) { + singleton = new com.sun.corba.se.impl.orb.ORBSingleton(); + } else { +- singleton = create_impl_with_systemclassloader(className); ++ singleton = create_impl(className); + } + } + return singleton; + } + +- private static ORB create_impl_with_systemclassloader(String className) { +- +- try { +- ReflectUtil.checkPackageAccess(className); +- ClassLoader cl = ClassLoader.getSystemClassLoader(); +- Class orbBaseClass = org.omg.CORBA.ORB.class; +- Class singletonOrbClass = Class.forName(className, true, cl).asSubclass(orbBaseClass); +- return (ORB)singletonOrbClass.newInstance(); +- } catch (Throwable ex) { +- SystemException systemException = new INITIALIZE( +- "can't instantiate default ORB implementation " + className); +- systemException.initCause(ex); +- throw systemException; +- } +- } +- + private static ORB create_impl(String className) { + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + if (cl == null) +--- ./hotspot/.hgtags Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/.hgtags Wed Jul 30 03:51:43 2014 -0700 +@@ -408,6 +408,8 @@ + 55fb97c4c58d6ed4db8ec02a382ba518d9265815 hs25-b65 + d3521d8e562a782f66fc0dfdebeffba2c7e3471d jdk8-b122 + 591135a7d6f96c0ef281d078cee9a8d8c342d45c jdk8-b123 ++c89630a122b43d0eabd78b74f6498a1c3cf04ca3 jdk8u20-b00 ++c89630a122b43d0eabd78b74f6498a1c3cf04ca3 hs25.20-b00 + 9b9816164447214f21b06ccf646893c281c76a42 hs25-b66 + df333ee12bba67e2e928f8ce1da37afd9bf95b48 jdk8-b124 + 3585183c191aa6b4d0375ea659515335e1804417 hs25-b67 +@@ -436,6 +438,7 @@ + 17a75e692af397532e2b296b24f6b9b6c239c633 jdk8u5-b11 + 9b289963cb9a14636fbe8faaa2dd6d3678464a7b jdk8u5-b12 + 8a67179106085689906732013a282efeeb9bd5f4 jdk8u5-b13 ++5c7ef8e396835b82c0460b73f23cac86ba34846f jdk8u5-b31 + f0d759a6a2309a1c149d530b29db24eda885f267 jdk8u11-b01 + 3c079aebb516765784dd8097887daadda5a76ac1 jdk8u11-b02 + 0037e964ce486c009984171f004259263628079f jdk8u11-b03 +@@ -447,3 +450,53 @@ + 34de1e8eeabbcc6e690f92766fd619beb9f3f049 jdk8u11-b09 + 7e4ae023277bef5b82361fd985262f4009eb2fe8 jdk8u11-b10 + e6b7384074325d5a4ede728d6928ecb7f1cc1326 jdk8u11-b11 ++78df957d46ebd98ba5bb68f4d9654c8bea3f1587 jdk8u11-b12 ++13f04650aa09df696d62a1912febe25fe4a64082 jdk8u11-b31 ++412d3b5fe90e54c0ff9d9ac7374b98607c561d5a hs25.20-b01 ++4638c4d7ff106db0f29ef7f18b128dd7e69bc470 hs25.20-b02 ++e56d11f8cc2158d4280f80e56d196193349c150a hs25.20-b03 ++757fe22ae90681e2b6cff50699c5abbe2563dd2c jdk8u20-b01 ++9c2ddd17626e375554044a3082a6dc5e68184ed9 jdk8u20-b02 ++ecf3678d5736a645aea893b525a9eb5fa1a8e072 hs25.20-b04 ++51e1bb81df8680bd237630323de5e0704fb25607 jdk8u20-b03 ++54436d3b2a915ff50a8d6b34f61d5afb45be7bb6 hs25.20-b05 ++d4e18f0633c662588cc0875be7759721c7d85af4 jdk8u20-b04 ++57eb3e69397e9d5818c5fdaef65b47d9b03f7f88 jdk8u20-b05 ++804f89b6ff46728d60a69e9a338e63f362f7ac68 hs25.20-b06 ++c3d92e04873788275eeebec6bcd2948cdbd143a7 jdk8u20-b06 ++39eae002499704438142e78f5e0e24d46d0b266f hs25.20-b07 ++f0ea4d3df1299b6c958e1a72f892c695fca055ad jdk8u20-b07 ++2627c7be4279478b880d7f643a252d185e4915ec hs25.20-b08 ++e9ffa408f7af28205a7114ca78bce29846f5a8df jdk8u20-b08 ++5186bc5047c1725888ed99f423bdfaa116e05abe hs25.20-b09 ++4d73f1e99f97d1444e16ee5ef4634eb2129969ad jdk8u20-b09 ++27a9e6a96a8ced7b7ee892d5d0f1a735b9010abb hs25.20-b10 ++300e2c5eeb2710de3630d14ffe4592214633dbff jdk8u20-b10 ++70dc2c030c69470a5d9099b7f54e4cfef89276fd jdk8u20-b11 ++b6a2ba7d3ea7259a76c8ff1ec22fac9094494c1c hs25.20-b11 ++3c291bc2aa7c58efb1219701f38c41731609e595 hs25.20-b12 ++18ae0dac7620474547aa1721bc3fd748af07b8b5 jdk8u20-b12 ++47951595af60460a479b8574622375bfbf5c8ed2 jdk8u20-b13 ++798f5b02be897151fdad44d695446088b1cca6b1 hs25.20-b13 ++28bbbecff5f08c1e343fc0c40923c05d86b7cf82 hs25.20-b14 ++c20d8a452574c85c8fc1f7f2d4e788cd6b156bc9 jdk8u20-b14 ++87bdb86f0aedbd9b9ef8e9999b273114c8be4748 hs25.20-b15 ++8c785f9bde6f603cbd13eecd2ee6acd699b376f8 jdk8u20-b15 ++50e5d560367b94275a91d5d579c32f1164eb5fa5 hs25.20-b16 ++c36ef639e6d3c2d238f4e4f8b2f5803a60de8be8 jdk8u20-b16 ++ee8b934668694dba5dc0ac039f8d56e52499c0f9 hs25.20-b17 ++8ea4732884ccd5586f0afe9478b80add90231455 jdk8u20-b17 ++b685b4e870b159ea5731984199d275879d427038 hs25.20-b18 ++11159d7ec80462a422e39c9b3a39ae932923622d jdk8u20-b18 ++3e1cec358ab95ef985f821219104141b9ffda83f hs25.20-b19 ++b15553cde967dfd7781a4a5c669e4cb7db734317 jdk8u20-b19 ++4f18dea0312d601d0515976bc0c643ea7acc829d hs25.20-b20 ++9e4d27da4ac04c6e19291087f7c68a5c5803c7ca jdk8u20-b20 ++4828415ebbf11e205dcc08e97ad5ae7dd03522f9 jdk8u20-b21 ++e4a6e7f1b90b85270aee1c54edaca3ef737082f1 hs25.20-b21 ++f7429096a202cab5c36a0f20dea33c554026010f jdk8u20-b22 ++7c56530b11496459e66cb9ea933035002311672c hs25.20-b22 ++f09d1f6a401e25a54dad44bb7bea482e47558af5 jdk8u20-b23 ++42ddd0bbcb6630fe463ec9bc1893c838d5edff1b jdk8u20-b24 ++00cf2b6f51b9560b01030e8f4c28c466f0b21fe3 hs25.20-b23 ++19408d5fd31c25ce60c43dd33e92b96e8df4a4ea jdk8u20-b25 +--- ./hotspot/THIRD_PARTY_README Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/THIRD_PARTY_README Wed Jul 30 03:51:43 2014 -0700 +@@ -2,7 +2,7 @@ + ----------------------------- + + %% This notice is provided with respect to ASM Bytecode Manipulation +-Framework v5.0, which may be included with JRE 8, and JDK 8, and ++Framework v5.0.3, which may be included with JRE 8, and JDK 8, and + OpenJDK 8. + + --- begin of LICENSE --- +@@ -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 +@@ -3349,14 +3349,14 @@ + + ------------------------------------------------------------------------------- + +-%% This notice is provided with respect to zlib v1.2.5, which may be included ++%% This notice is provided with respect to zlib v1.2.8, which may be included + with JRE 8, JDK 8, and OpenJDK 8. + + --- begin of LICENSE --- + +- version 1.2.5, July 18th, 2005 +- +- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler ++ version 1.2.8, April 28th, 2013 ++ ++ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages +@@ -3382,11 +3382,11 @@ + ------------------------------------------------------------------------------- + + %% This notice is provided with respect to the following which may be +-included with JRE 8, JDK 8, and OpenJDK 8, except where noted: +- +- Apache Commons Math 2.2 +- Apache Derby 10.10.1.2 [included with JDK 8] +- Apache Jakarta BCEL 5.2 ++included with JRE 8, JDK 8, and OpenJDK 8. ++ ++ Apache Commons Math 3.2 ++ Apache Derby 10.10.1.3 ++ Apache Jakarta BCEL 5.1 + Apache Jakarta Regexp 1.4 + Apache Santuario XML Security for Java 1.5.4 + Apache Xalan-Java 2.7.1 +--- ./hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m Wed Jul 30 03:51:43 2014 -0700 +@@ -95,7 +95,9 @@ + #define CHECK_EXCEPTION_CLEAR_(value) if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return value; } + + static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) { +- (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg); ++ jclass exceptionClass = (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"); ++ CHECK_EXCEPTION; ++ (*env)->ThrowNew(env, exceptionClass, errMsg); + } + + static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) { +@@ -129,6 +131,7 @@ + JNIEXPORT void JNICALL + Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0(JNIEnv *env, jclass cls) { + symbolicatorID = (*env)->GetFieldID(env, cls, "symbolicator", "J"); ++ CHECK_EXCEPTION; + taskID = (*env)->GetFieldID(env, cls, "task", "J"); + CHECK_EXCEPTION; + +@@ -236,13 +239,16 @@ + (JNIEnv *env, jobject this_obj, jlong addr) { + uintptr_t offset; + const char* sym = NULL; ++ jstring sym_string; + + struct ps_prochandle* ph = get_proc_handle(env, this_obj); + if (ph != NULL && ph->core != NULL) { + sym = symbol_for_pc(ph, (uintptr_t) addr, &offset); + if (sym == NULL) return 0; ++ sym_string = (*env)->NewStringUTF(env, sym); ++ CHECK_EXCEPTION_(0); + return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID, +- (*env)->NewStringUTF(env, sym), (jlong)offset); ++ sym_string, (jlong)offset); + } + return 0; + } +@@ -749,11 +755,14 @@ + const char* name; + jobject loadObject; + jobject loadObjectList; ++ jstring nameString; + + base = get_lib_base(ph, i); + name = get_lib_name(ph, i); ++ nameString = (*env)->NewStringUTF(env, name); ++ CHECK_EXCEPTION; + loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID, +- (*env)->NewStringUTF(env, name), (jlong)0, (jlong)base); ++ nameString, (jlong)0, (jlong)base); + CHECK_EXCEPTION; + loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID); + CHECK_EXCEPTION; +--- ./hotspot/agent/src/os/linux/libproc.h Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/os/linux/libproc.h Wed Jul 30 03:51:43 2014 -0700 +@@ -34,19 +34,7 @@ + #include "libproc_md.h" + #endif + +-#if defined(sparc) || defined(sparcv9) +-/* +- If _LP64 is defined ptrace.h should be taken from /usr/include/asm-sparc64 +- otherwise it should be from /usr/include/asm-sparc +- These two files define pt_regs structure differently +-*/ +-#ifdef _LP64 +-#include "asm-sparc64/ptrace.h" +-#else +-#include "asm-sparc/ptrace.h" +-#endif +- +-#endif //sparc or sparcv9 ++#include + + /************************************************************************************ + +@@ -80,7 +68,7 @@ + *************************************************************************************/ + + +-#if defined(sparc) || defined(sparcv9) ++#if defined(sparc) || defined(sparcv9) || defined(ppc64) + #define user_regs_struct pt_regs + #endif + +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/ci/ciEnv.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/ci/ciEnv.java Wed Jul 30 03:51:43 2014 -0700 +@@ -95,9 +95,15 @@ + int entryBci = task.osrBci(); + int compLevel = task.compLevel(); + Klass holder = method.getMethodHolder(); +- out.println("compile " + holder.getName().asString() + " " + +- OopUtilities.escapeString(method.getName().asString()) + " " + +- method.getSignature().asString() + " " + +- entryBci + " " + compLevel); ++ out.print("compile " + holder.getName().asString() + " " + ++ OopUtilities.escapeString(method.getName().asString()) + " " + ++ method.getSignature().asString() + " " + ++ entryBci + " " + compLevel); ++ Compile compiler = compilerData(); ++ if (compiler != null) { ++ // Dump inlining data. ++ compiler.dumpInlineData(out); ++ } ++ out.println(); + } + } +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/G1CollectedHeap.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/G1CollectedHeap.java Wed Jul 30 03:51:43 2014 -0700 +@@ -51,9 +51,9 @@ + static private CIntegerField summaryBytesUsedField; + // G1MonitoringSupport* _g1mm; + static private AddressField g1mmField; +- // MasterOldRegionSet _old_set; ++ // HeapRegionSet _old_set; + static private long oldSetFieldOffset; +- // MasterHumongousRegionSet _humongous_set; ++ // HeapRegionSet _humongous_set; + static private long humongousSetFieldOffset; + + static { +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/HeapRegionSetBase.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/HeapRegionSetBase.java Wed Jul 30 03:51:43 2014 -0700 +@@ -40,12 +40,8 @@ + // Mirror class for HeapRegionSetBase. Represents a group of regions. + + public class HeapRegionSetBase extends VMObject { +- // uint _length; +- static private CIntegerField lengthField; +- // uint _region_num; +- static private CIntegerField regionNumField; +- // size_t _total_used_bytes; +- static private CIntegerField totalUsedBytesField; ++ ++ static private long countField; + + static { + VM.registerVMInitializedObserver(new Observer() { +@@ -58,21 +54,13 @@ + static private synchronized void initialize(TypeDataBase db) { + Type type = db.lookupType("HeapRegionSetBase"); + +- lengthField = type.getCIntegerField("_length"); +- regionNumField = type.getCIntegerField("_region_num"); +- totalUsedBytesField = type.getCIntegerField("_total_used_bytes"); ++ countField = type.getField("_count").getOffset(); + } + +- public long length() { +- return lengthField.getValue(addr); +- } + +- public long regionNum() { +- return regionNumField.getValue(addr); +- } +- +- public long totalUsedBytes() { +- return totalUsedBytesField.getValue(addr); ++ public HeapRegionSetCount count() { ++ Address countFieldAddr = addr.addOffsetTo(countField); ++ return (HeapRegionSetCount) VMObjectFactory.newObject(HeapRegionSetCount.class, countFieldAddr); + } + + public HeapRegionSetBase(Address addr) { +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/HeapRegionSetCount.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/gc_implementation/g1/HeapRegionSetCount.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ * ++ */ ++ ++package sun.jvm.hotspot.gc_implementation.g1; ++ ++import java.util.Iterator; ++import java.util.Observable; ++import java.util.Observer; ++ ++import sun.jvm.hotspot.debugger.Address; ++import sun.jvm.hotspot.runtime.VM; ++import sun.jvm.hotspot.runtime.VMObject; ++import sun.jvm.hotspot.runtime.VMObjectFactory; ++import sun.jvm.hotspot.types.AddressField; ++import sun.jvm.hotspot.types.CIntegerField; ++import sun.jvm.hotspot.types.Type; ++import sun.jvm.hotspot.types.TypeDataBase; ++ ++// Mirror class for HeapRegionSetCount. Represents a group of regions. ++ ++public class HeapRegionSetCount extends VMObject { ++ ++ static private CIntegerField lengthField; ++ static private CIntegerField capacityField; ++ ++ static { ++ VM.registerVMInitializedObserver(new Observer() { ++ public void update(Observable o, Object data) { ++ initialize(VM.getVM().getTypeDataBase()); ++ } ++ }); ++ } ++ ++ static private synchronized void initialize(TypeDataBase db) { ++ Type type = db.lookupType("HeapRegionSetCount"); ++ ++ lengthField = type.getCIntegerField("_length"); ++ capacityField = type.getCIntegerField("_capacity"); ++ } ++ ++ public long length() { ++ return lengthField.getValue(addr); ++ } ++ ++ public long capacity() { ++ return capacityField.getValue(addr); ++ } ++ ++ public HeapRegionSetCount(Address addr) { ++ super(addr); ++ } ++} +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/opto/Compile.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/opto/Compile.java Wed Jul 30 03:51:43 2014 -0700 +@@ -25,6 +25,7 @@ + package sun.jvm.hotspot.opto; + + import java.util.*; ++import java.io.PrintStream; + import sun.jvm.hotspot.ci.*; + import sun.jvm.hotspot.debugger.*; + import sun.jvm.hotspot.runtime.*; +@@ -92,4 +93,13 @@ + } + return null; + } ++ ++ public void dumpInlineData(PrintStream out) { ++ InlineTree inlTree = ilt(); ++ if (inlTree != null) { ++ out.print(" inline " + inlTree.count()); ++ inlTree.dumpReplayData(out); ++ } ++ } ++ + } +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/opto/InlineTree.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/opto/InlineTree.java Wed Jul 30 03:51:43 2014 -0700 +@@ -87,6 +87,11 @@ + return GrowableArray.create(addr, inlineTreeConstructor); + } + ++ public int inlineLevel() { ++ JVMState jvms = callerJvms(); ++ return (jvms != null) ? jvms.depth() : 0; ++ } ++ + public void printImpl(PrintStream st, int indent) { + for (int i = 0; i < indent; i++) st.print(" "); + st.printf(" @ %d ", callerBci()); +@@ -101,4 +106,28 @@ + public void print(PrintStream st) { + printImpl(st, 2); + } ++ ++ // Count number of nodes in this subtree ++ public int count() { ++ int result = 1; ++ GrowableArray subt = subtrees(); ++ for (int i = 0 ; i < subt.length(); i++) { ++ result += subt.at(i).count(); ++ } ++ return result; ++ } ++ ++ public void dumpReplayData(PrintStream out) { ++ out.printf(" %d %d ", inlineLevel(), callerBci()); ++ Method method = (Method)method().getMetadata(); ++ Klass holder = method.getMethodHolder(); ++ out.print(holder.getName().asString() + " " + ++ OopUtilities.escapeString(method.getName().asString()) + " " + ++ method.getSignature().asString()); ++ ++ GrowableArray subt = subtrees(); ++ for (int i = 0 ; i < subt.length(); i++) { ++ subt.at(i).dumpReplayData(out); ++ } ++ } + } +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/opto/JVMState.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/opto/JVMState.java Wed Jul 30 03:51:43 2014 -0700 +@@ -88,6 +88,10 @@ + return (int)bciField.getValue(getAddress()); + } + ++ public int depth() { ++ return (int)depthField.getValue(getAddress()); ++ } ++ + public JVMState caller() { + return create(callerField.getValue(getAddress())); + } +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java Wed Jul 30 03:51:43 2014 -0700 +@@ -114,7 +114,8 @@ + long survivorRegionNum = g1mm.survivorRegionNum(); + HeapRegionSetBase oldSet = g1h.oldSet(); + HeapRegionSetBase humongousSet = g1h.humongousSet(); +- long oldRegionNum = oldSet.regionNum() + humongousSet.regionNum(); ++ long oldRegionNum = oldSet.count().length() ++ + humongousSet.count().capacity() / HeapRegion.grainBytes(); + printG1Space("G1 Heap:", g1h.n_regions(), + g1h.used(), g1h.capacity()); + System.out.println("G1 Young Generation:"); +--- ./hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -61,8 +61,9 @@ + long h = 0; + int s = 0; + int len = buf.length; ++ // Emulate the unsigned int in java_lang_String::hash_code + while (len-- > 0) { +- h = 31*h + (0xFFL & buf[s]); ++ h = 31*h + (0xFFFFFFFFL & buf[s]); + s++; + } + return h & 0xFFFFFFFFL; +--- ./hotspot/make/Makefile Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/Makefile Wed Jul 30 03:51:43 2014 -0700 +@@ -87,6 +87,7 @@ + # Typical C1/C2 targets made available with this Makefile + C1_VM_TARGETS=product1 fastdebug1 optimized1 debug1 + C2_VM_TARGETS=product fastdebug optimized debug ++CORE_VM_TARGETS=productcore fastdebugcore optimizedcore debugcore + ZERO_VM_TARGETS=productzero fastdebugzero optimizedzero debugzero + SHARK_VM_TARGETS=productshark fastdebugshark optimizedshark debugshark + MINIMAL1_VM_TARGETS=productminimal1 fastdebugminimal1 debugminimal1 +@@ -136,6 +137,12 @@ + all_debugshark: debugshark docs export_debug + all_optimizedshark: optimizedshark docs export_optimized + ++allcore: all_productcore all_fastdebugcore ++all_productcore: productcore docs export_product ++all_fastdebugcore: fastdebugcore docs export_fastdebug ++all_debugcore: debugcore docs export_debug ++all_optimizedcore: optimizedcore docs export_optimized ++ + # Do everything + world: all create_jdk + +@@ -154,6 +161,7 @@ + # Output directories + C1_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_compiler1 + C2_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_compiler2 ++CORE_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_core + MINIMAL1_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_minimal1 + ZERO_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_zero + SHARK_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_shark +@@ -167,6 +175,10 @@ + $(CD) $(GAMMADIR)/make; \ + $(MAKE) BUILD_DIR=$(C2_DIR) BUILD_FLAVOR=$@ VM_TARGET=$@ generic_build2 $(ALT_OUT) + ++$(CORE_VM_TARGETS): ++ $(CD) $(GAMMADIR)/make; \ ++ $(MAKE) BUILD_DIR=$(CORE_DIR) BUILD_FLAVOR=$(@:%core=%) VM_TARGET=$@ generic_buildcore $(ALT_OUT) ++ + $(ZERO_VM_TARGETS): + $(CD) $(GAMMADIR)/make; \ + $(MAKE) BUILD_DIR=$(ZERO_DIR) BUILD_FLAVOR=$(@:%zero=%) VM_TARGET=$@ generic_buildzero $(ALT_OUT) +@@ -228,6 +240,20 @@ + $(MAKE_ARGS) $(VM_TARGET) + endif + ++generic_buildcore: $(HOTSPOT_SCRIPT) ++ifeq ($(HS_ARCH),ppc) ++ ifeq ($(ARCH_DATA_MODEL),64) ++ $(MKDIR) -p $(OUTPUTDIR) ++ $(CD) $(OUTPUTDIR); \ ++ $(MAKE) -f $(ABS_OS_MAKEFILE) \ ++ $(MAKE_ARGS) $(VM_TARGET) ++ else ++ @$(ECHO) "No ($(VM_TARGET)) for ppc ARCH_DATA_MODEL=$(ARCH_DATA_MODEL)" ++ endif ++else ++ @$(ECHO) "No ($(VM_TARGET)) for $(HS_ARCH)" ++endif ++ + generic_buildzero: $(HOTSPOT_SCRIPT) + $(MKDIR) -p $(OUTPUTDIR) + $(CD) $(OUTPUTDIR); \ +@@ -287,6 +313,7 @@ + DOCS_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_docs + C1_BUILD_DIR =$(C1_DIR)/$(BUILD_FLAVOR) + C2_BUILD_DIR =$(C2_DIR)/$(BUILD_FLAVOR) ++CORE_BUILD_DIR =$(CORE_DIR)/$(BUILD_FLAVOR) + MINIMAL1_BUILD_DIR=$(MINIMAL1_DIR)/$(BUILD_FLAVOR) + ZERO_BUILD_DIR =$(ZERO_DIR)/$(BUILD_FLAVOR) + SHARK_BUILD_DIR =$(SHARK_DIR)/$(BUILD_FLAVOR) +@@ -464,6 +491,28 @@ + $(install-dir) + endif + ++# Core ++ifeq ($(JVM_VARIANT_CORE), true) ++# Common ++$(EXPORT_LIB_DIR)/%.jar: $(CORE_BUILD_DIR)/../generated/%.jar ++ $(install-file) ++$(EXPORT_INCLUDE_DIR)/%: $(CORE_BUILD_DIR)/../generated/jvmtifiles/% ++ $(install-file) ++# Unix ++$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(CORE_BUILD_DIR)/%.$(LIBRARY_SUFFIX) ++ $(install-file) ++$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(CORE_BUILD_DIR)/%.debuginfo ++ $(install-file) ++$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(CORE_BUILD_DIR)/%.diz ++ $(install-file) ++$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(CORE_BUILD_DIR)/%.$(LIBRARY_SUFFIX) ++ $(install-file) ++$(EXPORT_SERVER_DIR)/%.debuginfo: $(CORE_BUILD_DIR)/%.debuginfo ++ $(install-file) ++$(EXPORT_SERVER_DIR)/%.diz: $(CORE_BUILD_DIR)/%.diz ++ $(install-file) ++endif ++ + # Shark + ifeq ($(JVM_VARIANT_ZEROSHARK), true) + # Common +@@ -531,6 +580,7 @@ + clean_build: + $(RM) -r $(C1_DIR) + $(RM) -r $(C2_DIR) ++ $(RM) -r $(CORE_DIR) + $(RM) -r $(ZERO_DIR) + $(RM) -r $(SHARK_DIR) + $(RM) -r $(MINIMAL1_DIR) +--- ./hotspot/make/aix/Makefile Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/Makefile Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,381 @@ ++# ++# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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 makefile creates a build tree and lights off a build. ++# You can go back into the build tree and perform rebuilds or ++# incremental builds as desired. Be sure to reestablish ++# environment variable settings for LD_LIBRARY_PATH and JAVA_HOME. ++ ++# The make process now relies on java and javac. These can be ++# specified either implicitly on the PATH, by setting the ++# (JDK-inherited) ALT_BOOTDIR environment variable to full path to a ++# JDK in which bin/java and bin/javac are present and working (e.g., ++# /usr/local/java/jdk1.3/solaris), or via the (JDK-inherited) ++# default BOOTDIR path value. Note that one of ALT_BOOTDIR ++# or BOOTDIR has to be set. We do *not* search javac, javah, rmic etc. ++# from the PATH. ++# ++# One can set ALT_BOOTDIR or BOOTDIR to point to a jdk that runs on ++# an architecture that differs from the target architecture, as long ++# as the bootstrap jdk runs under the same flavor of OS as the target ++# (i.e., if the target is linux, point to a jdk that runs on a linux ++# box). In order to use such a bootstrap jdk, set the make variable ++# REMOTE to the desired remote command mechanism, e.g., ++# ++# make REMOTE="rsh -l me myotherlinuxbox" ++ ++# Along with VM, Serviceability Agent (SA) is built for SA/JDI binding. ++# JDI binding on SA produces two binaries: ++# 1. sa-jdi.jar - This is built before building libjvm.so ++# Please refer to ./makefiles/sa.make ++# 2. libsa.so - Native library for SA - This is built after ++# libjsig.so (signal interposition library) ++# Please refer to ./makefiles/vm.make ++# If $(GAMMADIR)/agent dir is not present, SA components are not built. ++ ++# No tests on Aix. ++TEST_IN_BUILD=false ++ ++ifeq ($(GAMMADIR),) ++include ../../make/defs.make ++else ++include $(GAMMADIR)/make/defs.make ++endif ++include $(GAMMADIR)/make/$(OSNAME)/makefiles/rules.make ++ ++ifndef CC_INTERP ++ ifndef FORCE_TIERED ++ FORCE_TIERED=1 ++ endif ++endif ++# C1 is not ported on ppc64(le), so we cannot build a tiered VM: ++ifneq (,$(filter $(ARCH),ppc64 pp64le)) ++ FORCE_TIERED=0 ++endif ++ ++ifdef LP64 ++ ifeq ("$(filter $(LP64_ARCH),$(BUILDARCH))","") ++ _JUNK_ := $(shell echo >&2 \ ++ $(OSNAME) $(ARCH) "*** ERROR: this platform does not support 64-bit compilers!") ++ @exit 1 ++ endif ++endif ++ ++# we need to set up LP64 correctly to satisfy sanity checks in adlc ++ifneq ("$(filter $(LP64_ARCH),$(BUILDARCH))","") ++ MFLAGS += " LP64=1 " ++endif ++ ++# pass USE_SUNCC further, through MFLAGS ++ifdef USE_SUNCC ++ MFLAGS += " USE_SUNCC=1 " ++endif ++ ++# The following renders pathnames in generated Makefiles valid on ++# machines other than the machine containing the build tree. ++# ++# For example, let's say my build tree lives on /files12 on ++# exact.east.sun.com. This logic will cause GAMMADIR to begin with ++# /net/exact/files12/... ++# ++# We only do this on SunOS variants, for a couple of reasons: ++# * It is extremely rare that source trees exist on other systems ++# * It has been claimed that the Linux automounter is flakey, so ++# changing GAMMADIR in a way that exercises the automounter could ++# prove to be a source of unreliability in the build process. ++# Obviously, this Makefile is only relevant on SunOS boxes to begin ++# with, but the SunOS conditionalization will make it easier to ++# combine Makefiles in the future (assuming we ever do that). ++ ++ifeq ($(OSNAME),solaris) ++ ++ # prepend current directory to relative pathnames. ++ NEW_GAMMADIR := \ ++ $(shell echo $(GAMMADIR) | \ ++ sed -e "s=^\([^/].*\)=$(shell pwd)/\1=" \ ++ ) ++ unexport NEW_GAMMADIR ++ ++ # If NEW_GAMMADIR doesn't already start with "/net/": ++ ifeq ($(strip $(filter /net/%,$(NEW_GAMMADIR))),) ++ # prepend /net/$(HOST) ++ # remove /net/$(HOST) if name already began with /home/ ++ # remove /net/$(HOST) if name already began with /java/ ++ # remove /net/$(HOST) if name already began with /lab/ ++ NEW_GAMMADIR := \ ++ $(shell echo $(NEW_GAMMADIR) | \ ++ sed -e "s=^\(.*\)=/net/$(HOST)\1=" \ ++ -e "s=^/net/$(HOST)/home/=/home/=" \ ++ -e "s=^/net/$(HOST)/java/=/java/=" \ ++ -e "s=^/net/$(HOST)/lab/=/lab/=" \ ++ ) ++ # Don't use the new value for GAMMADIR unless a file with the new ++ # name actually exists. ++ ifneq ($(wildcard $(NEW_GAMMADIR)),) ++ GAMMADIR := $(NEW_GAMMADIR) ++ endif ++ endif ++ ++endif ++ ++# BUILDARCH is set to "zero" for Zero builds. VARIANTARCH ++# is used to give the build directories meaningful names. ++VARIANTARCH = $(subst i386,i486,$(ZERO_LIBARCH)) ++ ++# There is a (semi-) regular correspondence between make targets and actions: ++# ++# Target Tree Type Build Dir ++# ++# debug compiler2 __compiler2/debug ++# fastdebug compiler2 __compiler2/fastdebug ++# optimized compiler2 __compiler2/optimized ++# product compiler2 __compiler2/product ++# ++# debug1 compiler1 __compiler1/debug ++# fastdebug1 compiler1 __compiler1/fastdebug ++# optimized1 compiler1 __compiler1/optimized ++# product1 compiler1 __compiler1/product ++# ++# debugcore core __core/debug ++# fastdebugcore core __core/fastdebug ++# optimizedcore core __core/optimized ++# productcore core __core/product ++# ++# debugzero zero __zero/debug ++# fastdebugzero zero __zero/fastdebug ++# optimizedzero zero __zero/optimized ++# productzero zero __zero/product ++# ++# debugshark shark __shark/debug ++# fastdebugshark shark __shark/fastdebug ++# optimizedshark shark __shark/optimized ++# productshark shark __shark/product ++# ++# fastdebugminimal1 minimal1 __minimal1/fastdebug ++# productminimal1 minimal1 __minimal1/product ++# ++# What you get with each target: ++# ++# debug* - debug compile with asserts enabled ++# fastdebug* - optimized compile, but with asserts enabled ++# optimized* - optimized compile, no asserts ++# product* - the shippable thing: optimized compile, no asserts, -DPRODUCT ++ ++# This target list needs to be coordinated with the usage message ++# in the build.sh script: ++TARGETS = debug fastdebug optimized product ++ ++ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true) ++ SUBDIR_DOCS = $(OSNAME)_$(VARIANTARCH)_docs ++else ++ SUBDIR_DOCS = $(OSNAME)_$(BUILDARCH)_docs ++endif ++SUBDIRS_C1 = $(addprefix $(OSNAME)_$(BUILDARCH)_compiler1/,$(TARGETS)) ++SUBDIRS_C2 = $(addprefix $(OSNAME)_$(BUILDARCH)_compiler2/,$(TARGETS)) ++SUBDIRS_TIERED = $(addprefix $(OSNAME)_$(BUILDARCH)_tiered/,$(TARGETS)) ++SUBDIRS_CORE = $(addprefix $(OSNAME)_$(BUILDARCH)_core/,$(TARGETS)) ++SUBDIRS_ZERO = $(addprefix $(OSNAME)_$(VARIANTARCH)_zero/,$(TARGETS)) ++SUBDIRS_SHARK = $(addprefix $(OSNAME)_$(VARIANTARCH)_shark/,$(TARGETS)) ++SUBDIRS_MINIMAL1 = $(addprefix $(OSNAME)_$(BUILDARCH)_minimal1/,$(TARGETS)) ++ ++TARGETS_C2 = $(TARGETS) ++TARGETS_C1 = $(addsuffix 1,$(TARGETS)) ++TARGETS_TIERED = $(addsuffix tiered,$(TARGETS)) ++TARGETS_CORE = $(addsuffix core,$(TARGETS)) ++TARGETS_ZERO = $(addsuffix zero,$(TARGETS)) ++TARGETS_SHARK = $(addsuffix shark,$(TARGETS)) ++TARGETS_MINIMAL1 = $(addsuffix minimal1,$(TARGETS)) ++ ++BUILDTREE_MAKE = $(GAMMADIR)/make/$(OSNAME)/makefiles/buildtree.make ++BUILDTREE_VARS = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OSNAME) SRCARCH=$(SRCARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH) ++BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION) HOTSPOT_BUILD_VERSION=$(HOTSPOT_BUILD_VERSION) JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION) ++BUILDTREE_VARS += ENABLE_FULL_DEBUG_SYMBOLS=$(ENABLE_FULL_DEBUG_SYMBOLS) OBJCOPY=$(OBJCOPY) STRIP_POLICY=$(STRIP_POLICY) ZIP_DEBUGINFO_FILES=$(ZIP_DEBUGINFO_FILES) ZIPEXE=$(ZIPEXE) ++ ++BUILDTREE = $(MAKE) -f $(BUILDTREE_MAKE) $(BUILDTREE_VARS) ++ ++#------------------------------------------------------------------------------- ++ ++# Could make everything by default, but that would take a while. ++all: ++ @echo "Try '$(MAKE) ...' where is one or more of" ++ @echo " $(TARGETS_C2)" ++ @echo " $(TARGETS_C1)" ++ @echo " $(TARGETS_CORE)" ++ @echo " $(TARGETS_ZERO)" ++ @echo " $(TARGETS_SHARK)" ++ @echo " $(TARGETS_MINIMAL1)" ++ ++checks: check_os_version check_j2se_version ++ ++# We do not want people accidentally building on old systems (e.g. Linux 2.2.x, ++# Solaris 2.5.1, 2.6). ++# Disable this check by setting DISABLE_HOTSPOT_OS_VERSION_CHECK=ok. ++ ++SUPPORTED_OS_VERSION = AIX ++OS_VERSION := $(shell uname -a) ++EMPTY_IF_NOT_SUPPORTED = $(filter $(SUPPORTED_OS_VERSION),$(OS_VERSION)) ++ ++check_os_version: ++ifeq ($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),) ++ $(QUIETLY) >&2 echo "*** This OS is not supported:" `uname -a`; exit 1; ++endif ++ ++# jvmti.make requires XSLT (J2SE 1.4.x or newer): ++XSLT_CHECK = $(REMOTE) $(RUN.JAVAP) javax.xml.transform.TransformerFactory ++# If not found then fail fast. ++check_j2se_version: ++ $(QUIETLY) $(XSLT_CHECK) > /dev/null 2>&1; \ ++ if [ $$? -ne 0 ]; then \ ++ $(REMOTE) $(RUN.JAVA) -version; \ ++ echo "*** An XSLT processor (J2SE 1.4.x or newer) is required" \ ++ "to bootstrap this build" 1>&2; \ ++ exit 1; \ ++ fi ++ ++$(SUBDIRS_TIERED): $(BUILDTREE_MAKE) ++ $(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks ++ $(BUILDTREE) VARIANT=tiered ++ ++$(SUBDIRS_C2): $(BUILDTREE_MAKE) ++ifeq ($(FORCE_TIERED),1) ++ $(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks ++ $(BUILDTREE) VARIANT=tiered FORCE_TIERED=1 ++else ++ $(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks ++ $(BUILDTREE) VARIANT=compiler2 ++endif ++ ++$(SUBDIRS_C1): $(BUILDTREE_MAKE) ++ $(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks ++ $(BUILDTREE) VARIANT=compiler1 ++ ++$(SUBDIRS_CORE): $(BUILDTREE_MAKE) ++ $(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks ++ $(BUILDTREE) VARIANT=core ++ ++$(SUBDIRS_ZERO): $(BUILDTREE_MAKE) platform_zero ++ $(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks ++ $(BUILDTREE) VARIANT=zero VARIANTARCH=$(VARIANTARCH) ++ ++$(SUBDIRS_SHARK): $(BUILDTREE_MAKE) platform_zero ++ $(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks ++ $(BUILDTREE) VARIANT=shark VARIANTARCH=$(VARIANTARCH) ++ ++$(SUBDIRS_MINIMAL1): $(BUILDTREE_MAKE) ++ $(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks ++ $(BUILDTREE) VARIANT=minimal1 ++ ++ ++platform_zero: $(GAMMADIR)/make/$(OSNAME)/platform_zero.in ++ $(SED) 's/@ZERO_ARCHDEF@/$(ZERO_ARCHDEF)/g;s/@ZERO_LIBARCH@/$(ZERO_LIBARCH)/g;' < $< > $@ ++ ++# Define INSTALL=y at command line to automatically copy JVM into JAVA_HOME ++ ++$(TARGETS_C2): $(SUBDIRS_C2) ++ cd $(OSNAME)_$(BUILDARCH)_compiler2/$@ && $(MAKE) $(MFLAGS) ++ifdef INSTALL ++ cd $(OSNAME)_$(BUILDARCH)_compiler2/$@ && $(MAKE) $(MFLAGS) install ++endif ++ ++$(TARGETS_TIERED): $(SUBDIRS_TIERED) ++ cd $(OSNAME)_$(BUILDARCH)_tiered/$(patsubst %tiered,%,$@) && $(MAKE) $(MFLAGS) ++ifdef INSTALL ++ cd $(OSNAME)_$(BUILDARCH)_tiered/$(patsubst %tiered,%,$@) && $(MAKE) $(MFLAGS) install ++endif ++ ++$(TARGETS_C1): $(SUBDIRS_C1) ++ cd $(OSNAME)_$(BUILDARCH)_compiler1/$(patsubst %1,%,$@) && $(MAKE) $(MFLAGS) ++ifdef INSTALL ++ cd $(OSNAME)_$(BUILDARCH)_compiler1/$(patsubst %1,%,$@) && $(MAKE) $(MFLAGS) install ++endif ++ ++$(TARGETS_CORE): $(SUBDIRS_CORE) ++ cd $(OSNAME)_$(BUILDARCH)_core/$(patsubst %core,%,$@) && $(MAKE) $(MFLAGS) ++ifdef INSTALL ++ cd $(OSNAME)_$(BUILDARCH)_core/$(patsubst %core,%,$@) && $(MAKE) $(MFLAGS) install ++endif ++ ++$(TARGETS_ZERO): $(SUBDIRS_ZERO) ++ cd $(OSNAME)_$(VARIANTARCH)_zero/$(patsubst %zero,%,$@) && $(MAKE) $(MFLAGS) ++ifdef INSTALL ++ cd $(OSNAME)_$(VARIANTARCH)_zero/$(patsubst %zero,%,$@) && $(MAKE) $(MFLAGS) install ++endif ++ ++$(TARGETS_SHARK): $(SUBDIRS_SHARK) ++ cd $(OSNAME)_$(VARIANTARCH)_shark/$(patsubst %shark,%,$@) && $(MAKE) $(MFLAGS) ++ifdef INSTALL ++ cd $(OSNAME)_$(VARIANTARCH)_shark/$(patsubst %shark,%,$@) && $(MAKE) $(MFLAGS) install ++endif ++ ++$(TARGETS_MINIMAL1): $(SUBDIRS_MINIMAL1) ++ cd $(OSNAME)_$(BUILDARCH)_minimal1/$(patsubst %minimal1,%,$@) && $(MAKE) $(MFLAGS) ++ifdef INSTALL ++ cd $(OSNAME)_$(BUILDARCH)_minimal1/$(patsubst %minimal1,%,$@) && $(MAKE) $(MFLAGS) install ++endif ++ ++# Just build the tree, and nothing else: ++tree: $(SUBDIRS_C2) ++tree1: $(SUBDIRS_C1) ++treecore: $(SUBDIRS_CORE) ++treezero: $(SUBDIRS_ZERO) ++treeshark: $(SUBDIRS_SHARK) ++treeminimal1: $(SUBDIRS_MINIMAL1) ++ ++# Doc target. This is the same for all build options. ++# Hence create a docs directory beside ...$(ARCH)_[...] ++# We specify 'BUILD_FLAVOR=product' so that the proper ++# ENABLE_FULL_DEBUG_SYMBOLS value is used. ++docs: checks ++ $(QUIETLY) mkdir -p $(SUBDIR_DOCS) ++ $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/makefiles/jvmti.make $(MFLAGS) $(BUILDTREE_VARS) JvmtiOutDir=$(SUBDIR_DOCS) BUILD_FLAVOR=product jvmtidocs ++ ++# Synonyms for win32-like targets. ++compiler2: debug product ++ ++compiler1: debug1 product1 ++ ++core: debugcore productcore ++ ++zero: debugzero productzero ++ ++shark: debugshark productshark ++ ++clean_docs: ++ rm -rf $(SUBDIR_DOCS) ++ ++clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark clean_minimal1: ++ rm -rf $(OSNAME)_$(BUILDARCH)_$(subst clean_,,$@) ++ ++clean: clean_compiler2 clean_compiler1 clean_core clean_zero clean_shark clean_minimal1 clean_docs ++ ++include $(GAMMADIR)/make/cscope.make ++ ++#------------------------------------------------------------------------------- ++ ++.PHONY: $(TARGETS_C2) $(TARGETS_C1) $(TARGETS_CORE) $(TARGETS_ZERO) $(TARGETS_SHARK) $(TARGETS_MINIMAL1) ++.PHONY: tree tree1 treecore treezero treeshark ++.PHONY: all compiler1 compiler2 core zero shark ++.PHONY: clean clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark docs clean_docs ++.PHONY: checks check_os_version check_j2se_version +--- ./hotspot/make/aix/adlc_updater Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/adlc_updater Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,20 @@ ++#! /bin/sh ++# ++# This file is used by adlc.make to selectively update generated ++# adlc files. Because source and target diretories are relative ++# paths, this file is copied to the target build directory before ++# use. ++# ++# adlc-updater ++# ++fix_lines() { ++ # repair bare #line directives in $1 to refer to $2 ++ awk < $1 > $1+ ' ++ /^#line 999999$/ {print "#line " (NR+1) " \"" F2 "\""; next} ++ {print} ++ ' F2=$2 ++ mv $1+ $1 ++} ++fix_lines $2/$1 $3/$1 ++[ -f $3/$1 ] && cmp -s $2/$1 $3/$1 || \ ++( [ -f $3/$1 ] && echo Updating $3/$1 ; touch $2/made-change ; mv $2/$1 $3/$1 ) +--- ./hotspot/make/aix/makefiles/adjust-mflags.sh Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/adjust-mflags.sh Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,87 @@ ++#! /bin/sh ++# ++# Copyright (c) 1999, 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. ++# ++# ++ ++# This script is used only from top.make. ++# The macro $(MFLAGS-adjusted) calls this script to ++# adjust the "-j" arguments to take into account ++# the HOTSPOT_BUILD_JOBS variable. The default ++# handling of the "-j" argument by gnumake does ++# not meet our needs, so we must adjust it ourselves. ++ ++# This argument adjustment applies to two recursive ++# calls to "$(MAKE) $(MFLAGS-adjusted)" in top.make. ++# One invokes adlc.make, and the other invokes vm.make. ++# The adjustment propagates the desired concurrency ++# level down to the sub-make (of the adlc or vm). ++# The default behavior of gnumake is to run all ++# sub-makes without concurrency ("-j1"). ++ ++# Also, we use a make variable rather than an explicit ++# "-j" argument to control this setting, so that ++# the concurrency setting (which must be tuned separately ++# for each MP system) can be set via an environment variable. ++# The recommended setting is 1.5x to 2x the number of available ++# CPUs on the MP system, which is large enough to keep the CPUs ++# busy (even though some jobs may be I/O bound) but not too large, ++# we may presume, to overflow the system's swap space. ++ ++set -eu ++ ++default_build_jobs=4 ++ ++case $# in ++[12]) true;; ++*) >&2 echo "Usage: $0 ${MFLAGS} ${HOTSPOT_BUILD_JOBS}"; exit 2;; ++esac ++ ++MFLAGS=$1 ++HOTSPOT_BUILD_JOBS=${2-} ++ ++# Normalize any -jN argument to the form " -j${HBJ}" ++MFLAGS=` ++ echo "$MFLAGS" \ ++ | sed ' ++ s/^-/ -/ ++ s/ -\([^ ][^ ]*\)j/ -\1 -j/ ++ s/ -j[0-9][0-9]*/ -j/ ++ s/ -j\([^ ]\)/ -j -\1/ ++ s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/ ++ ' ` ++ ++case ${HOTSPOT_BUILD_JOBS} in \ ++ ++'') case ${MFLAGS} in ++ *\ -j*) ++ >&2 echo "# Note: -jN is ineffective for setting parallelism in this makefile." ++ >&2 echo "# please set HOTSPOT_BUILD_JOBS=${default_build_jobs} in the command line or environment." ++ esac;; ++ ++?*) case ${MFLAGS} in ++ *\ -j*) true;; ++ *) MFLAGS="-j${HOTSPOT_BUILD_JOBS} ${MFLAGS}";; ++ esac;; ++esac ++ ++echo "${MFLAGS}" +--- ./hotspot/make/aix/makefiles/adlc.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/adlc.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,231 @@ ++# ++# Copyright (c) 1999, 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. ++# ++# ++ ++# This makefile (adlc.make) is included from the adlc.make in the ++# build directories. ++# It knows how to compile, link, and run the adlc. ++ ++include $(GAMMADIR)/make/$(Platform_os_family)/makefiles/rules.make ++ ++# ######################################################################### ++ ++# OUTDIR must be the same as AD_Dir = $(GENERATED)/adfiles in top.make: ++GENERATED = ../generated ++OUTDIR = $(GENERATED)/adfiles ++ ++ARCH = $(Platform_arch) ++OS = $(Platform_os_family) ++ ++SOURCE.AD = $(OUTDIR)/$(OS)_$(Platform_arch_model).ad ++ ++ifeq ("${Platform_arch_model}", "${Platform_arch}") ++ SOURCES.AD = \ ++ $(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) ++else ++ SOURCES.AD = \ ++ $(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \ ++ $(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch).ad) ++endif ++ ++EXEC = $(OUTDIR)/adlc ++ ++# set VPATH so make knows where to look for source files ++Src_Dirs_V += $(GAMMADIR)/src/share/vm/adlc ++VPATH += $(Src_Dirs_V:%=%:) ++ ++# set INCLUDES for C preprocessor ++Src_Dirs_I += $(GAMMADIR)/src/share/vm/adlc $(GENERATED) ++INCLUDES += $(Src_Dirs_I:%=-I%) ++ ++# set flags for adlc compilation ++CXXFLAGS = $(SYSDEFS) $(INCLUDES) ++ ++# Force assertions on. ++CXXFLAGS += -DASSERT ++ ++# CFLAGS_WARN holds compiler options to suppress/enable warnings. ++# Suppress warnings (for now) ++CFLAGS_WARN = -w ++CFLAGS += $(CFLAGS_WARN) ++ ++OBJECTNAMES = \ ++ adlparse.o \ ++ archDesc.o \ ++ arena.o \ ++ dfa.o \ ++ dict2.o \ ++ filebuff.o \ ++ forms.o \ ++ formsopt.o \ ++ formssel.o \ ++ main.o \ ++ adlc-opcodes.o \ ++ output_c.o \ ++ output_h.o \ ++ ++OBJECTS = $(OBJECTNAMES:%=$(OUTDIR)/%) ++ ++GENERATEDNAMES = \ ++ ad_$(Platform_arch_model).cpp \ ++ ad_$(Platform_arch_model).hpp \ ++ ad_$(Platform_arch_model)_clone.cpp \ ++ ad_$(Platform_arch_model)_expand.cpp \ ++ ad_$(Platform_arch_model)_format.cpp \ ++ ad_$(Platform_arch_model)_gen.cpp \ ++ ad_$(Platform_arch_model)_misc.cpp \ ++ ad_$(Platform_arch_model)_peephole.cpp \ ++ ad_$(Platform_arch_model)_pipeline.cpp \ ++ adGlobals_$(Platform_arch_model).hpp \ ++ dfa_$(Platform_arch_model).cpp \ ++ ++GENERATEDFILES = $(GENERATEDNAMES:%=$(OUTDIR)/%) ++ ++# ######################################################################### ++ ++all: $(EXEC) ++ ++$(EXEC) : $(OBJECTS) ++ @echo Making adlc ++ $(QUIETLY) $(HOST.LINK_NOPROF.CXX) -o $(EXEC) $(OBJECTS) ++ ++# Random dependencies: ++$(OBJECTS): opcodes.hpp classes.hpp adlc.hpp adlcVMDeps.hpp adlparse.hpp archDesc.hpp arena.hpp dict2.hpp filebuff.hpp forms.hpp formsopt.hpp formssel.hpp ++ ++# The source files refer to ostream.h, which sparcworks calls iostream.h ++$(OBJECTS): ostream.h ++ ++ostream.h : ++ @echo >$@ '#include ' ++ ++dump: ++ : OUTDIR=$(OUTDIR) ++ : OBJECTS=$(OBJECTS) ++ : products = $(GENERATEDFILES) ++ ++all: $(GENERATEDFILES) ++ ++$(GENERATEDFILES): refresh_adfiles ++ ++# Get a unique temporary directory name, so multiple makes can run in parallel. ++# Note that product files are updated via "mv", which is atomic. ++TEMPDIR := $(OUTDIR)/mktmp$(shell echo $$$$) ++ ++# Debuggable by default ++CFLAGS += -g ++ ++# Pass -D flags into ADLC. ++ADLCFLAGS += $(SYSDEFS) ++ ++# Note "+="; it is a hook so flags.make can add more flags, like -g or -DFOO. ++ADLCFLAGS += -q -T ++ ++# Normally, debugging is done directly on the ad_*.cpp files. ++# But -g will put #line directives in those files pointing back to .ad. ++# Some builds of gcc 3.2 have a bug that gets tickled by the extra #line directives ++# so skip it for 3.2 and ealier. ++ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0" ++ADLCFLAGS += -g ++endif ++ ++ifdef LP64 ++ADLCFLAGS += -D_LP64 ++else ++ADLCFLAGS += -U_LP64 ++endif ++ ++# ++# adlc_updater is a simple sh script, under sccs control. It is ++# used to selectively update generated adlc files. This should ++# provide a nice compilation speed improvement. ++# ++ADLC_UPDATER_DIRECTORY = $(GAMMADIR)/make/$(OS) ++ADLC_UPDATER = adlc_updater ++$(ADLC_UPDATER): $(ADLC_UPDATER_DIRECTORY)/$(ADLC_UPDATER) ++ $(QUIETLY) cp $< $@; chmod +x $@ ++ ++# This action refreshes all generated adlc files simultaneously. ++# The way it works is this: ++# 1) create a scratch directory to work in. ++# 2) if the current working directory does not have $(ADLC_UPDATER), copy it. ++# 3) run the compiled adlc executable. This will create new adlc files in the scratch directory. ++# 4) call $(ADLC_UPDATER) on each generated adlc file. It will selectively update changed or missing files. ++# 5) If we actually updated any files, echo a notice. ++# ++refresh_adfiles: $(EXEC) $(SOURCE.AD) $(ADLC_UPDATER) ++ @rm -rf $(TEMPDIR); mkdir $(TEMPDIR) ++ $(QUIETLY) $(EXEC) $(ADLCFLAGS) $(SOURCE.AD) \ ++ -c$(TEMPDIR)/ad_$(Platform_arch_model).cpp -h$(TEMPDIR)/ad_$(Platform_arch_model).hpp -a$(TEMPDIR)/dfa_$(Platform_arch_model).cpp -v$(TEMPDIR)/adGlobals_$(Platform_arch_model).hpp \ ++ || { rm -rf $(TEMPDIR); exit 1; } ++ $(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model).cpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model).hpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_clone.cpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_expand.cpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_format.cpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_gen.cpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_misc.cpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_peephole.cpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_pipeline.cpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) adGlobals_$(Platform_arch_model).hpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) ./$(ADLC_UPDATER) dfa_$(Platform_arch_model).cpp $(TEMPDIR) $(OUTDIR) ++ $(QUIETLY) [ -f $(TEMPDIR)/made-change ] \ ++ || echo "Rescanned $(SOURCE.AD) but encountered no changes." ++ $(QUIETLY) rm -rf $(TEMPDIR) ++ ++ ++# ######################################################################### ++ ++$(SOURCE.AD): $(SOURCES.AD) ++ $(QUIETLY) $(PROCESS_AD_FILES) $(SOURCES.AD) > $(SOURCE.AD) ++ ++#PROCESS_AD_FILES = cat ++# Pass through #line directives, in case user enables -g option above: ++PROCESS_AD_FILES = awk '{ \ ++ if (CUR_FN != FILENAME) { CUR_FN=FILENAME; NR_BASE=NR-1; need_lineno=1 } \ ++ if (need_lineno && $$0 !~ /\/\//) \ ++ { print "\n\n\#line " (NR-NR_BASE) " \"" FILENAME "\""; need_lineno=0 }; \ ++ print }' ++ ++$(OUTDIR)/%.o: %.cpp ++ @echo Compiling $< ++ $(QUIETLY) $(REMOVE_TARGET) ++ $(QUIETLY) $(HOST.COMPILE.CXX) -o $@ $< $(COMPILE_DONE) ++ ++# Some object files are given a prefix, to disambiguate ++# them from objects of the same name built for the VM. ++$(OUTDIR)/adlc-%.o: %.cpp ++ @echo Compiling $< ++ $(QUIETLY) $(REMOVE_TARGET) ++ $(QUIETLY) $(HOST.COMPILE.CXX) -o $@ $< $(COMPILE_DONE) ++ ++# ######################################################################### ++ ++clean: ++ rm $(OBJECTS) ++ ++cleanall: ++ rm $(OBJECTS) $(EXEC) ++ ++# ######################################################################### ++ ++.PHONY: all dump refresh_adfiles clean cleanall +--- ./hotspot/make/aix/makefiles/build_vm_def.sh Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/build_vm_def.sh Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,18 @@ ++#!/bin/sh ++ ++# If we're cross compiling use that path for nm ++if [ "$CROSS_COMPILE_ARCH" != "" ]; then ++NM=$ALT_COMPILER_PATH/nm ++else ++# On AIX we have to prevent that we pick up the 'nm' version from the GNU binutils ++# which may be installed under /opt/freeware/bin. So better use an absolute path here! ++NM=/usr/bin/nm ++fi ++ ++$NM -X64 -B -C $* \ ++ | awk '{ ++ if (($2="d" || $2="D") && ($3 ~ /^__vft/ || $3 ~ /^gHotSpotVM/)) print "\t" $3 ";" ++ if ($3 ~ /^UseSharedSpaces$/) print "\t" $3 ";" ++ if ($3 ~ /^SharedArchivePath__9Arguments$/) print "\t" $3 ";" ++ }' \ ++ | sort -u +--- ./hotspot/make/aix/makefiles/buildtree.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/buildtree.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,364 @@ ++# ++# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# Usage: ++# ++# $(MAKE) -f buildtree.make SRCARCH=srcarch BUILDARCH=buildarch LIBARCH=libarch ++# GAMMADIR=dir OS_FAMILY=os VARIANT=variant ++# ++# The macros ARCH, GAMMADIR, OS_FAMILY and VARIANT must be defined in the ++# environment or on the command-line: ++# ++# ARCH - sparc, i486, ... HotSpot cpu and os_cpu source directory ++# BUILDARCH - build directory ++# LIBARCH - the corresponding directory in JDK/JRE ++# GAMMADIR - top of workspace ++# OS_FAMILY - operating system ++# VARIANT - core, compiler1, compiler2, or tiered ++# HOTSPOT_RELEASE_VERSION - .-b (11.0-b07) ++# HOTSPOT_BUILD_VERSION - internal, internal-$(USER_RELEASE_SUFFIX) or empty ++# JRE_RELEASE_VERSION - .. (1.7.0) ++# ++# Builds the directory trees with makefiles plus some convenience files in ++# each directory: ++# ++# Makefile - for "make foo" ++# flags.make - with macro settings ++# vm.make - to support making "$(MAKE) -v vm.make" in makefiles ++# adlc.make - ++# trace.make - generate tracing event and type definitions ++# jvmti.make - generate JVMTI bindings from the spec (JSR-163) ++# sa.make - generate SA jar file and natives ++# ++# The makefiles are split this way so that "make foo" will run faster by not ++# having to read the dependency files for the vm. ++ ++-include $(SPEC) ++include $(GAMMADIR)/make/scm.make ++include $(GAMMADIR)/make/defs.make ++include $(GAMMADIR)/make/altsrc.make ++ ++ ++# 'gmake MAKE_VERBOSE=y' or 'gmake QUIETLY=' gives all the gory details. ++QUIETLY$(MAKE_VERBOSE) = @ ++ ++ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true) ++ PLATFORM_FILE = $(shell dirname $(shell dirname $(shell pwd)))/platform_zero ++else ++ ifdef USE_SUNCC ++ PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH).suncc ++ else ++ PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH) ++ endif ++endif ++ ++# Allow overriding of the arch part of the directory but default ++# to BUILDARCH if nothing is specified ++ifeq ($(VARIANTARCH),) ++ VARIANTARCH=$(BUILDARCH) ++endif ++ ++ifdef FORCE_TIERED ++ifeq ($(VARIANT),tiered) ++PLATFORM_DIR = $(OS_FAMILY)_$(VARIANTARCH)_compiler2 ++else ++PLATFORM_DIR = $(OS_FAMILY)_$(VARIANTARCH)_$(VARIANT) ++endif ++else ++PLATFORM_DIR = $(OS_FAMILY)_$(VARIANTARCH)_$(VARIANT) ++endif ++ ++# ++# We do two levels of exclusion in the shared directory. ++# TOPLEVEL excludes are pruned, they are not recursively searched, ++# but lower level directories can be named without fear of collision. ++# ALWAYS excludes are excluded at any level in the directory tree. ++# ++ ++ALWAYS_EXCLUDE_DIRS = $(SCM_DIRS) ++ ++ifeq ($(VARIANT),tiered) ++TOPLEVEL_EXCLUDE_DIRS = $(ALWAYS_EXCLUDE_DIRS) -o -name adlc -o -name agent ++else ++ifeq ($(VARIANT),compiler2) ++TOPLEVEL_EXCLUDE_DIRS = $(ALWAYS_EXCLUDE_DIRS) -o -name adlc -o -name c1 -o -name agent ++else ++# compiler1 and core use the same exclude list ++TOPLEVEL_EXCLUDE_DIRS = $(ALWAYS_EXCLUDE_DIRS) -o -name adlc -o -name opto -o -name libadt -o -name agent ++endif ++endif ++ ++# Get things from the platform file. ++COMPILER = $(shell sed -n 's/^compiler[ ]*=[ ]*//p' $(PLATFORM_FILE)) ++ ++SIMPLE_DIRS = \ ++ $(PLATFORM_DIR)/generated/dependencies \ ++ $(PLATFORM_DIR)/generated/adfiles \ ++ $(PLATFORM_DIR)/generated/jvmtifiles \ ++ $(PLATFORM_DIR)/generated/tracefiles ++ ++TARGETS = debug fastdebug optimized product ++SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS)) ++ ++# For dependencies and recursive makes. ++BUILDTREE_MAKE = $(GAMMADIR)/make/$(OS_FAMILY)/makefiles/buildtree.make ++ ++BUILDTREE_TARGETS = Makefile flags.make flags_vm.make vm.make adlc.make jvmti.make trace.make sa.make ++ ++BUILDTREE_VARS = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OS_FAMILY) \ ++ SRCARCH=$(SRCARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH) VARIANT=$(VARIANT) ++ ++# Define variables to be set in flags.make. ++# Default values are set in make/defs.make. ++ifeq ($(HOTSPOT_BUILD_VERSION),) ++ HS_BUILD_VER=$(HOTSPOT_RELEASE_VERSION) ++else ++ HS_BUILD_VER=$(HOTSPOT_RELEASE_VERSION)-$(HOTSPOT_BUILD_VERSION) ++endif ++# Set BUILD_USER from system-dependent hints: $LOGNAME, $(whoami) ++ifndef HOTSPOT_BUILD_USER ++ HOTSPOT_BUILD_USER := $(shell echo $$LOGNAME) ++endif ++ifndef HOTSPOT_BUILD_USER ++ HOTSPOT_BUILD_USER := $(shell whoami) ++endif ++# Define HOTSPOT_VM_DISTRO based on settings in make/openjdk_distro ++# or make/hotspot_distro. ++ifndef HOTSPOT_VM_DISTRO ++ ifeq ($(call if-has-altsrc,$(HS_COMMON_SRC)/,true,false),true) ++ include $(GAMMADIR)/make/hotspot_distro ++ else ++ include $(GAMMADIR)/make/openjdk_distro ++ endif ++endif ++ ++# if hotspot-only build and/or OPENJDK isn't passed down, need to set OPENJDK ++ifndef OPENJDK ++ ifneq ($(call if-has-altsrc,$(HS_COMMON_SRC)/,true,false),true) ++ OPENJDK=true ++ endif ++endif ++ ++BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HS_BUILD_VER) HOTSPOT_BUILD_VERSION= JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION) ++ ++BUILDTREE = \ ++ $(MAKE) -f $(BUILDTREE_MAKE) $(BUILDTREE_TARGETS) $(BUILDTREE_VARS) ++ ++BUILDTREE_COMMENT = echo "\# Generated by $(BUILDTREE_MAKE)" ++ ++all: $(SUBMAKE_DIRS) ++ ++# Run make in each subdirectory recursively. ++$(SUBMAKE_DIRS): $(SIMPLE_DIRS) FORCE ++ $(QUIETLY) [ -d $@ ] || { mkdir -p $@; } ++ $(QUIETLY) cd $@ && $(BUILDTREE) TARGET=$(@F) ++ $(QUIETLY) touch $@ ++ ++$(SIMPLE_DIRS): ++ $(QUIETLY) mkdir -p $@ ++ ++# Convenience macro which takes a source relative path, applies $(1) to the ++# absolute path, and then replaces $(GAMMADIR) in the result with a ++# literal "$(GAMMADIR)/" suitable for inclusion in a Makefile. ++gamma-path=$(subst $(GAMMADIR),\$$(GAMMADIR),$(call $(1),$(HS_COMMON_SRC)/$(2))) ++ ++# This bit is needed to enable local rebuilds. ++# Unless the makefile itself sets LP64, any environmental ++# setting of LP64 will interfere with the build. ++LP64_SETTING/32 = LP64 = \#empty ++LP64_SETTING/64 = LP64 = 1 ++ ++DATA_MODE/ppc64 = 64 ++ ++DATA_MODE = $(DATA_MODE/$(BUILDARCH)) ++ ++flags.make: $(BUILDTREE_MAKE) ../shared_dirs.lst ++ @echo Creating $@ ... ++ $(QUIETLY) ( \ ++ $(BUILDTREE_COMMENT); \ ++ echo; \ ++ echo "Platform_file = $(PLATFORM_FILE)" | sed 's|$(GAMMADIR)|$$(GAMMADIR)|'; \ ++ sed -n '/=/s/^ */Platform_/p' < $(PLATFORM_FILE); \ ++ echo; \ ++ echo "GAMMADIR = $(GAMMADIR)"; \ ++ echo "HS_ALT_MAKE = $(HS_ALT_MAKE)"; \ ++ echo "OSNAME = $(OSNAME)"; \ ++ echo "SYSDEFS = \$$(Platform_sysdefs)"; \ ++ echo "SRCARCH = $(SRCARCH)"; \ ++ echo "BUILDARCH = $(BUILDARCH)"; \ ++ echo "LIBARCH = $(LIBARCH)"; \ ++ echo "TARGET = $(TARGET)"; \ ++ echo "HS_BUILD_VER = $(HS_BUILD_VER)"; \ ++ echo "JRE_RELEASE_VER = $(JRE_RELEASE_VERSION)"; \ ++ echo "SA_BUILD_VERSION = $(HS_BUILD_VER)"; \ ++ echo "HOTSPOT_BUILD_USER = $(HOTSPOT_BUILD_USER)"; \ ++ echo "HOTSPOT_VM_DISTRO = $(HOTSPOT_VM_DISTRO)"; \ ++ echo "OPENJDK = $(OPENJDK)"; \ ++ echo "$(LP64_SETTING/$(DATA_MODE))"; \ ++ echo; \ ++ echo "# Used for platform dispatching"; \ ++ echo "TARGET_DEFINES = -DTARGET_OS_FAMILY_\$$(Platform_os_family)"; \ ++ echo "TARGET_DEFINES += -DTARGET_ARCH_\$$(Platform_arch)"; \ ++ echo "TARGET_DEFINES += -DTARGET_ARCH_MODEL_\$$(Platform_arch_model)"; \ ++ echo "TARGET_DEFINES += -DTARGET_OS_ARCH_\$$(Platform_os_arch)"; \ ++ echo "TARGET_DEFINES += -DTARGET_OS_ARCH_MODEL_\$$(Platform_os_arch_model)"; \ ++ echo "TARGET_DEFINES += -DTARGET_COMPILER_\$$(Platform_compiler)"; \ ++ echo "CFLAGS += \$$(TARGET_DEFINES)"; \ ++ echo; \ ++ echo "Src_Dirs_V = \\"; \ ++ sed 's/$$/ \\/;s|$(GAMMADIR)|$$(GAMMADIR)|' ../shared_dirs.lst; \ ++ echo "$(call gamma-path,altsrc,cpu/$(SRCARCH)/vm) \\"; \ ++ echo "$(call gamma-path,commonsrc,cpu/$(SRCARCH)/vm) \\"; \ ++ echo "$(call gamma-path,altsrc,os_cpu/$(OS_FAMILY)_$(SRCARCH)/vm) \\"; \ ++ echo "$(call gamma-path,commonsrc,os_cpu/$(OS_FAMILY)_$(SRCARCH)/vm) \\"; \ ++ echo "$(call gamma-path,altsrc,os/$(OS_FAMILY)/vm) \\"; \ ++ echo "$(call gamma-path,commonsrc,os/$(OS_FAMILY)/vm) \\"; \ ++ echo "$(call gamma-path,altsrc,os/posix/vm) \\"; \ ++ echo "$(call gamma-path,commonsrc,os/posix/vm)"; \ ++ echo; \ ++ echo "Src_Dirs_I = \\"; \ ++ echo "$(call gamma-path,altsrc,share/vm/prims) \\"; \ ++ echo "$(call gamma-path,commonsrc,share/vm/prims) \\"; \ ++ echo "$(call gamma-path,altsrc,share/vm) \\"; \ ++ echo "$(call gamma-path,commonsrc,share/vm) \\"; \ ++ echo "$(call gamma-path,altsrc,share/vm/precompiled) \\"; \ ++ echo "$(call gamma-path,commonsrc,share/vm/precompiled) \\"; \ ++ echo "$(call gamma-path,altsrc,cpu/$(SRCARCH)/vm) \\"; \ ++ echo "$(call gamma-path,commonsrc,cpu/$(SRCARCH)/vm) \\"; \ ++ echo "$(call gamma-path,altsrc,os_cpu/$(OS_FAMILY)_$(SRCARCH)/vm) \\"; \ ++ echo "$(call gamma-path,commonsrc,os_cpu/$(OS_FAMILY)_$(SRCARCH)/vm) \\"; \ ++ echo "$(call gamma-path,altsrc,os/$(OS_FAMILY)/vm) \\"; \ ++ echo "$(call gamma-path,commonsrc,os/$(OS_FAMILY)/vm) \\"; \ ++ echo "$(call gamma-path,altsrc,os/posix/vm) \\"; \ ++ echo "$(call gamma-path,commonsrc,os/posix/vm)"; \ ++ [ -n "$(CFLAGS_BROWSE)" ] && \ ++ echo && echo "CFLAGS_BROWSE = $(CFLAGS_BROWSE)"; \ ++ [ -n "$(ENABLE_FULL_DEBUG_SYMBOLS)" ] && \ ++ echo && echo "ENABLE_FULL_DEBUG_SYMBOLS = $(ENABLE_FULL_DEBUG_SYMBOLS)"; \ ++ [ -n "$(OBJCOPY)" ] && \ ++ echo && echo "OBJCOPY = $(OBJCOPY)"; \ ++ [ -n "$(STRIP_POLICY)" ] && \ ++ echo && echo "STRIP_POLICY = $(STRIP_POLICY)"; \ ++ [ -n "$(ZIP_DEBUGINFO_FILES)" ] && \ ++ echo && echo "ZIP_DEBUGINFO_FILES = $(ZIP_DEBUGINFO_FILES)"; \ ++ [ -n "$(ZIPEXE)" ] && \ ++ echo && echo "ZIPEXE = $(ZIPEXE)"; \ ++ [ -n "$(HOTSPOT_EXTRA_SYSDEFS)" ] && \ ++ echo && \ ++ echo "HOTSPOT_EXTRA_SYSDEFS\$$(HOTSPOT_EXTRA_SYSDEFS) = $(HOTSPOT_EXTRA_SYSDEFS)" && \ ++ echo "SYSDEFS += \$$(HOTSPOT_EXTRA_SYSDEFS)"; \ ++ [ -n "$(INCLUDE_TRACE)" ] && \ ++ echo && echo "INCLUDE_TRACE = $(INCLUDE_TRACE)"; \ ++ echo; \ ++ [ -n "$(SPEC)" ] && \ ++ echo "include $(SPEC)"; \ ++ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \ ++ echo "include \$$(GAMMADIR)/make/excludeSrc.make"; \ ++ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \ ++ ) > $@ ++ ++flags_vm.make: $(BUILDTREE_MAKE) ../shared_dirs.lst ++ @echo Creating $@ ... ++ $(QUIETLY) ( \ ++ $(BUILDTREE_COMMENT); \ ++ echo; \ ++ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(TARGET).make"; \ ++ ) > $@ ++ ++../shared_dirs.lst: $(BUILDTREE_MAKE) $(GAMMADIR)/src/share/vm ++ @echo Creating directory list $@ ++ $(QUIETLY) if [ -d $(HS_ALT_SRC)/share/vm ]; then \ ++ find $(HS_ALT_SRC)/share/vm/* -prune \ ++ -type d \! \( $(TOPLEVEL_EXCLUDE_DIRS) \) -exec find {} \ ++ \( $(ALWAYS_EXCLUDE_DIRS) \) -prune -o -type d -print \; > $@; \ ++ fi; ++ $(QUIETLY) find $(HS_COMMON_SRC)/share/vm/* -prune \ ++ -type d \! \( $(TOPLEVEL_EXCLUDE_DIRS) \) -exec find {} \ ++ \( $(ALWAYS_EXCLUDE_DIRS) \) -prune -o -type d -print \; >> $@ ++ ++Makefile: $(BUILDTREE_MAKE) ++ @echo Creating $@ ... ++ $(QUIETLY) ( \ ++ $(BUILDTREE_COMMENT); \ ++ echo; \ ++ echo include flags.make; \ ++ echo; \ ++ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/top.make"; \ ++ ) > $@ ++ ++vm.make: $(BUILDTREE_MAKE) ++ @echo Creating $@ ... ++ $(QUIETLY) ( \ ++ $(BUILDTREE_COMMENT); \ ++ echo; \ ++ echo include flags.make; \ ++ echo include flags_vm.make; \ ++ echo; \ ++ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(@F)"; \ ++ ) > $@ ++ ++adlc.make: $(BUILDTREE_MAKE) ++ @echo Creating $@ ... ++ $(QUIETLY) ( \ ++ $(BUILDTREE_COMMENT); \ ++ echo; \ ++ echo include flags.make; \ ++ echo; \ ++ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(@F)"; \ ++ ) > $@ ++ ++jvmti.make: $(BUILDTREE_MAKE) ++ @echo Creating $@ ... ++ $(QUIETLY) ( \ ++ $(BUILDTREE_COMMENT); \ ++ echo; \ ++ echo include flags.make; \ ++ echo; \ ++ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(@F)"; \ ++ ) > $@ ++ ++trace.make: $(BUILDTREE_MAKE) ++ @echo Creating $@ ... ++ $(QUIETLY) ( \ ++ $(BUILDTREE_COMMENT); \ ++ echo; \ ++ echo include flags.make; \ ++ echo; \ ++ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(@F)"; \ ++ ) > $@ ++ ++sa.make: $(BUILDTREE_MAKE) ++ @echo Creating $@ ... ++ $(QUIETLY) ( \ ++ $(BUILDTREE_COMMENT); \ ++ echo; \ ++ echo include flags.make; \ ++ echo; \ ++ echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(@F)"; \ ++ ) > $@ ++ ++FORCE: ++ ++.PHONY: all FORCE +--- ./hotspot/make/aix/makefiles/compiler2.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/compiler2.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,32 @@ ++# ++# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# Sets make macros for making server version of VM ++ ++TYPE=COMPILER2 ++ ++VM_SUBDIR = server ++ ++CFLAGS += -DCOMPILER2 +--- ./hotspot/make/aix/makefiles/core.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/core.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,33 @@ ++# ++# Copyright (c) 1999, 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. ++# ++# ++ ++# Sets make macros for making core version of VM ++ ++# Select which files to use (in top.make) ++TYPE=CORE ++ ++# There is no "core" directory in JDK. Install core build in server directory. ++VM_SUBDIR = server ++ ++# Note: macros.hpp defines CORE +--- ./hotspot/make/aix/makefiles/debug.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/debug.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,41 @@ ++# ++# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# Sets make macros for making debug version of VM ++ ++# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make ++DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS) ++DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@)) ++CFLAGS += $(DEBUG_CFLAGS/BYFILE) ++ ++# Set the environment variable HOTSPARC_GENERIC to "true" ++# to inhibit the effect of the previous line on CFLAGS. ++ ++# Linker mapfile ++MAPFILE = $(GAMMADIR)/make/aix/makefiles/mapfile-vers-debug ++ ++VERSION = debug ++SYSDEFS += -DASSERT -DDEBUG ++PICFLAGS = DEFAULT +--- ./hotspot/make/aix/makefiles/defs.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/defs.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,231 @@ ++# ++# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# The common definitions for hotspot AIX builds. ++# Include the top level defs.make under make directory instead of this one. ++# This file is included into make/defs.make. ++ ++SLASH_JAVA ?= /java ++ ++# Need PLATFORM (os-arch combo names) for jdk and hotspot, plus libarch name ++#ARCH:=$(shell uname -m) ++PATH_SEP = : ++ifeq ($(LP64), 1) ++ ARCH_DATA_MODEL ?= 64 ++else ++ ARCH_DATA_MODEL ?= 32 ++endif ++ ++ifeq ($(ARCH_DATA_MODEL), 64) ++ ARCH = ppc64 ++else ++ ARCH = ppc ++endif ++ ++# PPC ++ifeq ($(ARCH), ppc) ++ #ARCH_DATA_MODEL = 32 ++ PLATFORM = aix-ppc ++ VM_PLATFORM = aix_ppc ++ HS_ARCH = ppc ++endif ++ ++# PPC64 ++ifeq ($(ARCH), ppc64) ++ #ARCH_DATA_MODEL = 64 ++ MAKE_ARGS += LP64=1 ++ PLATFORM = aix-ppc64 ++ VM_PLATFORM = aix_ppc64 ++ HS_ARCH = ppc ++endif ++ ++# On 32 bit aix we build server and client, on 64 bit just server. ++ifeq ($(JVM_VARIANTS),) ++ ifeq ($(ARCH_DATA_MODEL), 32) ++ JVM_VARIANTS:=client,server ++ JVM_VARIANT_CLIENT:=true ++ JVM_VARIANT_SERVER:=true ++ else ++ JVM_VARIANTS:=server ++ JVM_VARIANT_SERVER:=true ++ endif ++endif ++ ++# determine if HotSpot is being built in JDK6 or earlier version ++JDK6_OR_EARLIER=0 ++ifeq "$(shell expr \( '$(JDK_MAJOR_VERSION)' != '' \& '$(JDK_MINOR_VERSION)' != '' \& '$(JDK_MICRO_VERSION)' != '' \))" "1" ++ # if the longer variable names (newer build style) are set, then check those ++ ifeq "$(shell expr \( $(JDK_MAJOR_VERSION) = 1 \& $(JDK_MINOR_VERSION) \< 7 \))" "1" ++ JDK6_OR_EARLIER=1 ++ endif ++else ++ # the longer variables aren't set so check the shorter variable names ++ ifeq "$(shell expr \( '$(JDK_MAJOR_VER)' = 1 \& '$(JDK_MINOR_VER)' \< 7 \))" "1" ++ JDK6_OR_EARLIER=1 ++ endif ++endif ++ ++ifeq ($(JDK6_OR_EARLIER),0) ++ # Full Debug Symbols is supported on JDK7 or newer. ++ # The Full Debug Symbols (FDS) default for BUILD_FLAVOR == product ++ # builds is enabled with debug info files ZIP'ed to save space. For ++ # BUILD_FLAVOR != product builds, FDS is always enabled, after all a ++ # debug build without debug info isn't very useful. ++ # The ZIP_DEBUGINFO_FILES option only has meaning when FDS is enabled. ++ # ++ # If you invoke a build with FULL_DEBUG_SYMBOLS=0, then FDS will be ++ # disabled for a BUILD_FLAVOR == product build. ++ # ++ # Note: Use of a different variable name for the FDS override option ++ # versus the FDS enabled check is intentional (FULL_DEBUG_SYMBOLS ++ # versus ENABLE_FULL_DEBUG_SYMBOLS). For auto build systems that pass ++ # in options via environment variables, use of distinct variables ++ # prevents strange behaviours. For example, in a BUILD_FLAVOR != ++ # product build, the FULL_DEBUG_SYMBOLS environment variable will be ++ # 0, but the ENABLE_FULL_DEBUG_SYMBOLS make variable will be 1. If ++ # the same variable name is used, then different values can be picked ++ # up by different parts of the build. Just to be clear, we only need ++ # two variable names because the incoming option value can be ++ # overridden in some situations, e.g., a BUILD_FLAVOR != product ++ # build. ++ ++ # Due to the multiple sub-make processes that occur this logic gets ++ # executed multiple times. We reduce the noise by at least checking that ++ # BUILD_FLAVOR has been set. ++ ifneq ($(BUILD_FLAVOR),) ++ ifeq ($(BUILD_FLAVOR), product) ++ FULL_DEBUG_SYMBOLS ?= 1 ++ ENABLE_FULL_DEBUG_SYMBOLS = $(FULL_DEBUG_SYMBOLS) ++ else ++ # debug variants always get Full Debug Symbols (if available) ++ ENABLE_FULL_DEBUG_SYMBOLS = 1 ++ endif ++ _JUNK_ := $(shell \ ++ echo >&2 "INFO: ENABLE_FULL_DEBUG_SYMBOLS=$(ENABLE_FULL_DEBUG_SYMBOLS)") ++ # since objcopy is optional, we set ZIP_DEBUGINFO_FILES later ++ ++ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ++ # Default OBJCOPY comes from GNU Binutils on Linux ++ ifeq ($(CROSS_COMPILE_ARCH),) ++ DEF_OBJCOPY=/usr/bin/objcopy ++ else ++ # Assume objcopy is part of the cross-compilation toolset ++ ifneq ($(ALT_COMPILER_PATH),) ++ DEF_OBJCOPY=$(ALT_COMPILER_PATH)/objcopy ++ endif ++ endif ++ OBJCOPY=$(shell test -x $(DEF_OBJCOPY) && echo $(DEF_OBJCOPY)) ++ ifneq ($(ALT_OBJCOPY),) ++ _JUNK_ := $(shell echo >&2 "INFO: ALT_OBJCOPY=$(ALT_OBJCOPY)") ++ OBJCOPY=$(shell test -x $(ALT_OBJCOPY) && echo $(ALT_OBJCOPY)) ++ endif ++ ++ ifeq ($(OBJCOPY),) ++ _JUNK_ := $(shell \ ++ echo >&2 "INFO: no objcopy cmd found so cannot create .debuginfo files. You may need to set ALT_OBJCOPY.") ++ ENABLE_FULL_DEBUG_SYMBOLS=0 ++ _JUNK_ := $(shell \ ++ echo >&2 "INFO: ENABLE_FULL_DEBUG_SYMBOLS=$(ENABLE_FULL_DEBUG_SYMBOLS)") ++ else ++ _JUNK_ := $(shell \ ++ echo >&2 "INFO: $(OBJCOPY) cmd found so will create .debuginfo files.") ++ ++ # Library stripping policies for .debuginfo configs: ++ # all_strip - strips everything from the library ++ # min_strip - strips most stuff from the library; leaves minimum symbols ++ # no_strip - does not strip the library at all ++ # ++ # Oracle security policy requires "all_strip". A waiver was granted on ++ # 2011.09.01 that permits using "min_strip" in the Java JDK and Java JRE. ++ # ++ # Currently, STRIP_POLICY is only used when Full Debug Symbols is enabled. ++ # ++ STRIP_POLICY ?= min_strip ++ ++ _JUNK_ := $(shell \ ++ echo >&2 "INFO: STRIP_POLICY=$(STRIP_POLICY)") ++ ++ ZIP_DEBUGINFO_FILES ?= 1 ++ ++ _JUNK_ := $(shell \ ++ echo >&2 "INFO: ZIP_DEBUGINFO_FILES=$(ZIP_DEBUGINFO_FILES)") ++ endif ++ endif # ENABLE_FULL_DEBUG_SYMBOLS=1 ++ endif # BUILD_FLAVOR ++endif # JDK_6_OR_EARLIER ++ ++# unused JDK_INCLUDE_SUBDIR=aix ++ ++# Library suffix ++LIBRARY_SUFFIX=so ++ ++EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html ++ ++# client and server subdirectories have symbolic links to ../libjsig.so ++EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.$(LIBRARY_SUFFIX) ++#ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ++# ifeq ($(ZIP_DEBUGINFO_FILES),1) ++# EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.diz ++# else ++# EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.debuginfo ++# endif ++#endif ++EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server ++EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client ++EXPORT_MINIMAL_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/minimal ++ ++ifeq ($(findstring true, $(JVM_VARIANT_SERVER) $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK) $(JVM_VARIANT_CORE)), true) ++ EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt ++ EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.$(LIBRARY_SUFFIX) ++# ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ++# ifeq ($(ZIP_DEBUGINFO_FILES),1) ++# EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.diz ++# else ++# EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.debuginfo ++# endif ++# endif ++endif ++ ++ifeq ($(JVM_VARIANT_CLIENT),true) ++ EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt ++ EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.$(LIBRARY_SUFFIX) ++# ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ++# ifeq ($(ZIP_DEBUGINFO_FILES),1) ++# EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.diz ++# else ++# EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.debuginfo ++# endif ++# endif ++endif ++ ++# Serviceability Binaries ++# No SA Support for PPC or zero ++ADD_SA_BINARIES/ppc = ++ADD_SA_BINARIES/ppc64 = ++ADD_SA_BINARIES/zero = ++ ++EXPORT_LIST += $(ADD_SA_BINARIES/$(HS_ARCH)) ++ ++ +--- ./hotspot/make/aix/makefiles/dtrace.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/dtrace.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,27 @@ ++# ++# 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. ++# ++# ++ ++# Linux does not build jvm_db ++LIBJVM_DB = ++ +--- ./hotspot/make/aix/makefiles/fastdebug.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/fastdebug.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,73 @@ ++# ++# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# Sets make macros for making debug version of VM ++ ++# Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make ++# Pare down optimization to -O2 if xlCV10.1 is in use. ++OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS) $(QV10_OPT_CONSERVATIVE) ++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. ++ ++# Linker mapfile ++MAPFILE = $(GAMMADIR)/make/aix/makefiles/mapfile-vers-debug ++ ++# xlc 10.1 parameters for ipa linkage. ++# - remove ipa linkage altogether. Does not seem to benefit performance, ++# but increases code footprint. ++# - this is a debug build in the end. Extra effort for ipa linkage is thus ++# not justified. ++LFLAGS_QIPA= ++ ++G_SUFFIX = _g ++VERSION = optimized ++SYSDEFS += -DASSERT -DFASTDEBUG ++PICFLAGS = DEFAULT +--- ./hotspot/make/aix/makefiles/jsig.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/jsig.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,87 @@ ++# ++# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# Rules to build signal interposition library, used by vm.make ++ ++# libjsig.so: signal interposition library ++JSIG = jsig ++LIBJSIG = lib$(JSIG).so ++ ++LIBJSIG_DEBUGINFO = lib$(JSIG).debuginfo ++LIBJSIG_DIZ = lib$(JSIG).diz ++ ++JSIGSRCDIR = $(GAMMADIR)/src/os/$(Platform_os_family)/vm ++ ++DEST_JSIG = $(JDK_LIBDIR)/$(LIBJSIG) ++DEST_JSIG_DEBUGINFO = $(JDK_LIBDIR)/$(LIBJSIG_DEBUGINFO) ++DEST_JSIG_DIZ = $(JDK_LIBDIR)/$(LIBJSIG_DIZ) ++ ++LIBJSIG_MAPFILE = $(MAKEFILES_DIR)/mapfile-vers-jsig ++ ++# On Linux we really dont want a mapfile, as this library is small ++# and preloaded using LD_PRELOAD, making functions private will ++# cause problems with interposing. See CR: 6466665 ++# LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE)) ++ ++LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE) ++ ++LFLAGS_JSIG += $(BIN_UTILS) ++ ++# DEBUG_BINARIES overrides everything, use full -g debug information ++ifeq ($(DEBUG_BINARIES), true) ++ JSIG_DEBUG_CFLAGS = -g ++endif ++ ++$(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE) ++ @echo Making signal interposition lib... ++ $(QUIETLY) $(CXX) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \ ++ $(LFLAGS_JSIG) $(JSIG_DEBUG_CFLAGS) -o $@ $< -ldl ++ ++#ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ++# $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJSIG_DEBUGINFO) ++# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJSIG_DEBUGINFO) $@ ++# ifeq ($(STRIP_POLICY),all_strip) ++# $(QUIETLY) $(STRIP) $@ ++# else ++# ifeq ($(STRIP_POLICY),min_strip) ++# $(QUIETLY) $(STRIP) -g $@ ++# # implied else here is no stripping at all ++# endif ++# endif ++# ifeq ($(ZIP_DEBUGINFO_FILES),1) ++# $(ZIPEXE) -q -y $(LIBJSIG_DIZ) $(LIBJSIG_DEBUGINFO) ++# $(RM) $(LIBJSIG_DEBUGINFO) ++# endif ++#endif ++ ++install_jsig: $(LIBJSIG) ++ @echo "Copying $(LIBJSIG) to $(DEST_JSIG)" ++ $(QUIETLY) test -f $(LIBJSIG_DEBUGINFO) && \ ++ cp -f $(LIBJSIG_DEBUGINFO) $(DEST_JSIG_DEBUGINFO) ++ $(QUIETLY) test -f $(LIBJSIG_DIZ) && \ ++ cp -f $(LIBJSIG_DIZ) $(DEST_JSIG_DIZ) ++ $(QUIETLY) cp -f $(LIBJSIG) $(DEST_JSIG) && echo "Done" ++ ++.PHONY: install_jsig +--- ./hotspot/make/aix/makefiles/jvmti.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/jvmti.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,118 @@ ++# ++# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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 makefile (jvmti.make) is included from the jvmti.make in the ++# build directories. ++# ++# It knows how to build and run the tools to generate jvmti. ++ ++include $(GAMMADIR)/make/aix/makefiles/rules.make ++ ++# ######################################################################### ++ ++TOPDIR = $(shell echo `pwd`) ++GENERATED = $(TOPDIR)/../generated ++JvmtiOutDir = $(GENERATED)/jvmtifiles ++ ++JvmtiSrcDir = $(GAMMADIR)/src/share/vm/prims ++InterpreterSrcDir = $(GAMMADIR)/src/share/vm/interpreter ++ ++# set VPATH so make knows where to look for source files ++Src_Dirs_V += $(JvmtiSrcDir) ++VPATH += $(Src_Dirs_V:%=%:) ++ ++JvmtiGeneratedNames = \ ++ jvmtiEnv.hpp \ ++ jvmtiEnter.cpp \ ++ jvmtiEnterTrace.cpp \ ++ jvmtiEnvRecommended.cpp \ ++ bytecodeInterpreterWithChecks.cpp \ ++ jvmti.h \ ++ ++JvmtiEnvFillSource = $(JvmtiSrcDir)/jvmtiEnvFill.java ++JvmtiEnvFillClass = $(JvmtiOutDir)/jvmtiEnvFill.class ++ ++JvmtiGenSource = $(JvmtiSrcDir)/jvmtiGen.java ++JvmtiGenClass = $(JvmtiOutDir)/jvmtiGen.class ++ ++JvmtiGeneratedFiles = $(JvmtiGeneratedNames:%=$(JvmtiOutDir)/%) ++ ++XSLT = $(QUIETLY) $(REMOTE) $(RUN.JAVA) -classpath $(JvmtiOutDir) jvmtiGen ++ ++.PHONY: all jvmtidocs clean cleanall ++ ++# ######################################################################### ++ ++all: $(JvmtiGeneratedFiles) ++ ++both = $(JvmtiGenClass) $(JvmtiSrcDir)/jvmti.xml $(JvmtiSrcDir)/jvmtiLib.xsl ++ ++$(JvmtiGenClass): $(JvmtiGenSource) ++ $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -d $(JvmtiOutDir) $(JvmtiGenSource) ++ ++$(JvmtiEnvFillClass): $(JvmtiEnvFillSource) ++ $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -d $(JvmtiOutDir) $(JvmtiEnvFillSource) ++ ++$(JvmtiOutDir)/jvmtiEnter.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnter.xsl ++ @echo Generating $@ ++ $(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiEnter.xsl -OUT $(JvmtiOutDir)/jvmtiEnter.cpp -PARAM interface jvmti ++ ++$(JvmtiOutDir)/bytecodeInterpreterWithChecks.cpp: $(JvmtiGenClass) $(InterpreterSrcDir)/bytecodeInterpreter.cpp $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xml $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xsl ++ @echo Generating $@ ++ $(XSLT) -IN $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xml -XSL $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xsl -OUT $(JvmtiOutDir)/bytecodeInterpreterWithChecks.cpp ++ ++$(JvmtiOutDir)/jvmtiEnterTrace.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnter.xsl ++ @echo Generating $@ ++ $(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiEnter.xsl -OUT $(JvmtiOutDir)/jvmtiEnterTrace.cpp -PARAM interface jvmti -PARAM trace Trace ++ ++$(JvmtiOutDir)/jvmtiEnvRecommended.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnv.xsl $(JvmtiSrcDir)/jvmtiEnv.cpp $(JvmtiEnvFillClass) ++ @echo Generating $@ ++ $(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiEnv.xsl -OUT $(JvmtiOutDir)/jvmtiEnvStub.cpp ++ $(QUIETLY) $(REMOTE) $(RUN.JAVA) -classpath $(JvmtiOutDir) jvmtiEnvFill $(JvmtiSrcDir)/jvmtiEnv.cpp $(JvmtiOutDir)/jvmtiEnvStub.cpp $(JvmtiOutDir)/jvmtiEnvRecommended.cpp ++ ++$(JvmtiOutDir)/jvmtiEnv.hpp: $(both) $(JvmtiSrcDir)/jvmtiHpp.xsl ++ @echo Generating $@ ++ $(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiHpp.xsl -OUT $(JvmtiOutDir)/jvmtiEnv.hpp ++ ++$(JvmtiOutDir)/jvmti.h: $(both) $(JvmtiSrcDir)/jvmtiH.xsl ++ @echo Generating $@ ++ $(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiH.xsl -OUT $(JvmtiOutDir)/jvmti.h ++ ++jvmtidocs: $(JvmtiOutDir)/jvmti.html ++ ++$(JvmtiOutDir)/jvmti.html: $(both) $(JvmtiSrcDir)/jvmti.xsl ++ @echo Generating $@ ++ $(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmti.xsl -OUT $(JvmtiOutDir)/jvmti.html ++ ++# ######################################################################### ++ ++clean : ++ rm $(JvmtiGenClass) $(JvmtiEnvFillClass) $(JvmtiGeneratedFiles) ++ ++cleanall : ++ rm $(JvmtiGenClass) $(JvmtiEnvFillClass) $(JvmtiGeneratedFiles) ++ ++# ######################################################################### ++ +--- ./hotspot/make/aix/makefiles/mapfile-vers-debug Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/mapfile-vers-debug Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,275 @@ ++# ++# Copyright (c) 2002, 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. ++# ++# ++ ++# Define public interface. ++ ++SUNWprivate_1.1 { ++ global: ++ # JNI ++ JNI_CreateJavaVM; ++ JNI_GetCreatedJavaVMs; ++ JNI_GetDefaultJavaVMInitArgs; ++ ++ # JVM ++ JVM_Accept; ++ JVM_ActiveProcessorCount; ++ JVM_AllocateNewArray; ++ JVM_AllocateNewObject; ++ JVM_ArrayCopy; ++ JVM_AssertionStatusDirectives; ++ JVM_Available; ++ JVM_Bind; ++ JVM_ClassDepth; ++ JVM_ClassLoaderDepth; ++ JVM_Clone; ++ JVM_Close; ++ JVM_CX8Field; ++ JVM_CompileClass; ++ JVM_CompileClasses; ++ JVM_CompilerCommand; ++ JVM_Connect; ++ JVM_ConstantPoolGetClassAt; ++ JVM_ConstantPoolGetClassAtIfLoaded; ++ JVM_ConstantPoolGetDoubleAt; ++ JVM_ConstantPoolGetFieldAt; ++ JVM_ConstantPoolGetFieldAtIfLoaded; ++ JVM_ConstantPoolGetFloatAt; ++ JVM_ConstantPoolGetIntAt; ++ JVM_ConstantPoolGetLongAt; ++ JVM_ConstantPoolGetMethodAt; ++ JVM_ConstantPoolGetMethodAtIfLoaded; ++ JVM_ConstantPoolGetMemberRefInfoAt; ++ JVM_ConstantPoolGetSize; ++ JVM_ConstantPoolGetStringAt; ++ JVM_ConstantPoolGetUTF8At; ++ JVM_CountStackFrames; ++ JVM_CurrentClassLoader; ++ JVM_CurrentLoadedClass; ++ JVM_CurrentThread; ++ JVM_CurrentTimeMillis; ++ JVM_DefineClass; ++ JVM_DefineClassWithSource; ++ JVM_DefineClassWithSourceCond; ++ JVM_DesiredAssertionStatus; ++ JVM_DisableCompiler; ++ JVM_DoPrivileged; ++ JVM_DTraceGetVersion; ++ JVM_DTraceActivate; ++ JVM_DTraceIsProbeEnabled; ++ JVM_DTraceIsSupported; ++ JVM_DTraceDispose; ++ JVM_DumpAllStacks; ++ JVM_DumpThreads; ++ JVM_EnableCompiler; ++ JVM_Exit; ++ JVM_FillInStackTrace; ++ JVM_FindClassFromClass; ++ JVM_FindClassFromClassLoader; ++ JVM_FindClassFromBootLoader; ++ JVM_FindLibraryEntry; ++ JVM_FindLoadedClass; ++ JVM_FindPrimitiveClass; ++ JVM_FindSignal; ++ JVM_FreeMemory; ++ JVM_GC; ++ JVM_GetAllThreads; ++ JVM_GetArrayElement; ++ JVM_GetArrayLength; ++ JVM_GetCPClassNameUTF; ++ JVM_GetCPFieldClassNameUTF; ++ JVM_GetCPFieldModifiers; ++ JVM_GetCPFieldNameUTF; ++ JVM_GetCPFieldSignatureUTF; ++ JVM_GetCPMethodClassNameUTF; ++ JVM_GetCPMethodModifiers; ++ JVM_GetCPMethodNameUTF; ++ JVM_GetCPMethodSignatureUTF; ++ JVM_GetCallerClass; ++ JVM_GetClassAccessFlags; ++ JVM_GetClassAnnotations; ++ JVM_GetClassCPEntriesCount; ++ JVM_GetClassCPTypes; ++ JVM_GetClassConstantPool; ++ JVM_GetClassContext; ++ JVM_GetClassDeclaredConstructors; ++ JVM_GetClassDeclaredFields; ++ JVM_GetClassDeclaredMethods; ++ JVM_GetClassFieldsCount; ++ JVM_GetClassInterfaces; ++ JVM_GetClassLoader; ++ JVM_GetClassMethodsCount; ++ JVM_GetClassModifiers; ++ JVM_GetClassName; ++ JVM_GetClassNameUTF; ++ JVM_GetClassSignature; ++ JVM_GetClassSigners; ++ JVM_GetClassTypeAnnotations; ++ JVM_GetComponentType; ++ JVM_GetDeclaredClasses; ++ JVM_GetDeclaringClass; ++ JVM_GetEnclosingMethodInfo; ++ JVM_GetFieldAnnotations; ++ JVM_GetFieldIxModifiers; ++ JVM_GetFieldTypeAnnotations; ++ JVM_GetHostName; ++ JVM_GetInheritedAccessControlContext; ++ JVM_GetInterfaceVersion; ++ JVM_GetLastErrorString; ++ JVM_GetManagement; ++ JVM_GetMethodAnnotations; ++ JVM_GetMethodDefaultAnnotationValue; ++ JVM_GetMethodIxArgsSize; ++ JVM_GetMethodIxByteCode; ++ JVM_GetMethodIxByteCodeLength; ++ JVM_GetMethodIxExceptionIndexes; ++ JVM_GetMethodIxExceptionTableEntry; ++ JVM_GetMethodIxExceptionTableLength; ++ JVM_GetMethodIxExceptionsCount; ++ JVM_GetMethodIxLocalsCount; ++ JVM_GetMethodIxMaxStack; ++ JVM_GetMethodIxModifiers; ++ JVM_GetMethodIxNameUTF; ++ JVM_GetMethodIxSignatureUTF; ++ JVM_GetMethodParameterAnnotations; ++ JVM_GetMethodParameters; ++ JVM_GetMethodTypeAnnotations; ++ JVM_GetPrimitiveArrayElement; ++ JVM_GetProtectionDomain; ++ JVM_GetSockName; ++ JVM_GetSockOpt; ++ JVM_GetStackAccessControlContext; ++ JVM_GetStackTraceDepth; ++ JVM_GetStackTraceElement; ++ JVM_GetSystemPackage; ++ JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; ++ JVM_GetThreadStateNames; ++ JVM_GetThreadStateValues; ++ JVM_GetVersionInfo; ++ JVM_Halt; ++ JVM_HoldsLock; ++ JVM_IHashCode; ++ JVM_InitAgentProperties; ++ JVM_InitProperties; ++ JVM_InitializeCompiler; ++ JVM_InitializeSocketLibrary; ++ JVM_InternString; ++ JVM_Interrupt; ++ JVM_InvokeMethod; ++ JVM_IsArrayClass; ++ JVM_IsConstructorIx; ++ JVM_IsInterface; ++ JVM_IsInterrupted; ++ JVM_IsNaN; ++ JVM_IsPrimitiveClass; ++ JVM_IsSameClassPackage; ++ JVM_IsSilentCompiler; ++ JVM_IsSupportedJNIVersion; ++ JVM_IsThreadAlive; ++ JVM_IsVMGeneratedMethodIx; ++ JVM_LatestUserDefinedLoader; ++ JVM_Listen; ++ JVM_LoadClass0; ++ JVM_LoadLibrary; ++ JVM_Lseek; ++ JVM_MaxObjectInspectionAge; ++ JVM_MaxMemory; ++ JVM_MonitorNotify; ++ JVM_MonitorNotifyAll; ++ JVM_MonitorWait; ++ JVM_NanoTime; ++ JVM_NativePath; ++ JVM_NewArray; ++ JVM_NewInstanceFromConstructor; ++ JVM_NewMultiArray; ++ JVM_OnExit; ++ JVM_Open; ++ JVM_RaiseSignal; ++ JVM_RawMonitorCreate; ++ JVM_RawMonitorDestroy; ++ JVM_RawMonitorEnter; ++ JVM_RawMonitorExit; ++ JVM_Read; ++ JVM_Recv; ++ JVM_RecvFrom; ++ JVM_RegisterSignal; ++ JVM_ReleaseUTF; ++ JVM_ResolveClass; ++ JVM_ResumeThread; ++ JVM_Send; ++ JVM_SendTo; ++ JVM_SetArrayElement; ++ JVM_SetClassSigners; ++ JVM_SetLength; ++ JVM_SetNativeThreadName; ++ JVM_SetPrimitiveArrayElement; ++ JVM_SetProtectionDomain; ++ JVM_SetSockOpt; ++ JVM_SetThreadPriority; ++ JVM_Sleep; ++ JVM_Socket; ++ JVM_SocketAvailable; ++ JVM_SocketClose; ++ JVM_SocketShutdown; ++ JVM_StartThread; ++ JVM_StopThread; ++ JVM_SuspendThread; ++ JVM_SupportsCX8; ++ JVM_Sync; ++ JVM_Timeout; ++ JVM_TotalMemory; ++ JVM_TraceInstructions; ++ JVM_TraceMethodCalls; ++ JVM_UnloadLibrary; ++ JVM_Write; ++ JVM_Yield; ++ JVM_handle_linux_signal; ++ ++ # debug JVM ++ JVM_AccessVMBooleanFlag; ++ JVM_AccessVMIntFlag; ++ JVM_VMBreakPoint; ++ ++ # miscellaneous functions ++ jio_fprintf; ++ jio_printf; ++ jio_snprintf; ++ jio_vfprintf; ++ jio_vsnprintf; ++ fork1; ++ numa_warn; ++ numa_error; ++ ++ # Needed because there is no JVM interface for this. ++ sysThreadAvailableStackWithSlack; ++ ++ # This is for Forte Analyzer profiling support. ++ AsyncGetCallTrace; ++ ++ # INSERT VTABLE SYMBOLS HERE ++ ++ local: ++ *; ++}; ++ +--- ./hotspot/make/aix/makefiles/mapfile-vers-jsig Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/mapfile-vers-jsig Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,38 @@ ++# ++# 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. ++# ++# ++ ++# Define library interface. ++ ++SUNWprivate_1.1 { ++ global: ++ JVM_begin_signal_setting; ++ JVM_end_signal_setting; ++ JVM_get_libjsig_version; ++ JVM_get_signal_action; ++ sigaction; ++ signal; ++ sigset; ++ local: ++ *; ++}; +--- ./hotspot/make/aix/makefiles/mapfile-vers-product Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/mapfile-vers-product Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,268 @@ ++# ++# Copyright (c) 2002, 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. ++# ++# ++ ++# Define public interface. ++ ++SUNWprivate_1.1 { ++ global: ++ # JNI ++ JNI_CreateJavaVM; ++ JNI_GetCreatedJavaVMs; ++ JNI_GetDefaultJavaVMInitArgs; ++ ++ # JVM ++ JVM_Accept; ++ JVM_ActiveProcessorCount; ++ JVM_AllocateNewArray; ++ JVM_AllocateNewObject; ++ JVM_ArrayCopy; ++ JVM_AssertionStatusDirectives; ++ JVM_Available; ++ JVM_Bind; ++ JVM_ClassDepth; ++ JVM_ClassLoaderDepth; ++ JVM_Clone; ++ JVM_Close; ++ JVM_CX8Field; ++ JVM_CompileClass; ++ JVM_CompileClasses; ++ JVM_CompilerCommand; ++ JVM_Connect; ++ JVM_ConstantPoolGetClassAt; ++ JVM_ConstantPoolGetClassAtIfLoaded; ++ JVM_ConstantPoolGetDoubleAt; ++ JVM_ConstantPoolGetFieldAt; ++ JVM_ConstantPoolGetFieldAtIfLoaded; ++ JVM_ConstantPoolGetFloatAt; ++ JVM_ConstantPoolGetIntAt; ++ JVM_ConstantPoolGetLongAt; ++ JVM_ConstantPoolGetMethodAt; ++ JVM_ConstantPoolGetMethodAtIfLoaded; ++ JVM_ConstantPoolGetMemberRefInfoAt; ++ JVM_ConstantPoolGetSize; ++ JVM_ConstantPoolGetStringAt; ++ JVM_ConstantPoolGetUTF8At; ++ JVM_CountStackFrames; ++ JVM_CurrentClassLoader; ++ JVM_CurrentLoadedClass; ++ JVM_CurrentThread; ++ JVM_CurrentTimeMillis; ++ JVM_DefineClass; ++ JVM_DefineClassWithSource; ++ JVM_DefineClassWithSourceCond; ++ JVM_DesiredAssertionStatus; ++ JVM_DisableCompiler; ++ JVM_DoPrivileged; ++ JVM_DTraceGetVersion; ++ JVM_DTraceActivate; ++ JVM_DTraceIsProbeEnabled; ++ JVM_DTraceIsSupported; ++ JVM_DTraceDispose; ++ JVM_DumpAllStacks; ++ JVM_DumpThreads; ++ JVM_EnableCompiler; ++ JVM_Exit; ++ JVM_FillInStackTrace; ++ JVM_FindClassFromClass; ++ JVM_FindClassFromClassLoader; ++ JVM_FindClassFromBootLoader; ++ JVM_FindLibraryEntry; ++ JVM_FindLoadedClass; ++ JVM_FindPrimitiveClass; ++ JVM_FindSignal; ++ JVM_FreeMemory; ++ JVM_GC; ++ JVM_GetAllThreads; ++ JVM_GetArrayElement; ++ JVM_GetArrayLength; ++ JVM_GetCPClassNameUTF; ++ JVM_GetCPFieldClassNameUTF; ++ JVM_GetCPFieldModifiers; ++ JVM_GetCPFieldNameUTF; ++ JVM_GetCPFieldSignatureUTF; ++ JVM_GetCPMethodClassNameUTF; ++ JVM_GetCPMethodModifiers; ++ JVM_GetCPMethodNameUTF; ++ JVM_GetCPMethodSignatureUTF; ++ JVM_GetCallerClass; ++ JVM_GetClassAccessFlags; ++ JVM_GetClassAnnotations; ++ JVM_GetClassCPEntriesCount; ++ JVM_GetClassCPTypes; ++ JVM_GetClassConstantPool; ++ JVM_GetClassContext; ++ JVM_GetClassDeclaredConstructors; ++ JVM_GetClassDeclaredFields; ++ JVM_GetClassDeclaredMethods; ++ JVM_GetClassFieldsCount; ++ JVM_GetClassInterfaces; ++ JVM_GetClassLoader; ++ JVM_GetClassMethodsCount; ++ JVM_GetClassModifiers; ++ JVM_GetClassName; ++ JVM_GetClassNameUTF; ++ JVM_GetClassSignature; ++ JVM_GetClassSigners; ++ JVM_GetClassTypeAnnotations; ++ JVM_GetComponentType; ++ JVM_GetDeclaredClasses; ++ JVM_GetDeclaringClass; ++ JVM_GetEnclosingMethodInfo; ++ JVM_GetFieldAnnotations; ++ JVM_GetFieldIxModifiers; ++ JVM_GetHostName; ++ JVM_GetInheritedAccessControlContext; ++ JVM_GetInterfaceVersion; ++ JVM_GetLastErrorString; ++ JVM_GetManagement; ++ JVM_GetMethodAnnotations; ++ JVM_GetMethodDefaultAnnotationValue; ++ JVM_GetMethodIxArgsSize; ++ JVM_GetMethodIxByteCode; ++ JVM_GetMethodIxByteCodeLength; ++ JVM_GetMethodIxExceptionIndexes; ++ JVM_GetMethodIxExceptionTableEntry; ++ JVM_GetMethodIxExceptionTableLength; ++ JVM_GetMethodIxExceptionsCount; ++ JVM_GetMethodIxLocalsCount; ++ JVM_GetMethodIxMaxStack; ++ JVM_GetMethodIxModifiers; ++ JVM_GetMethodIxNameUTF; ++ JVM_GetMethodIxSignatureUTF; ++ JVM_GetMethodParameterAnnotations; ++ JVM_GetMethodParameters; ++ JVM_GetPrimitiveArrayElement; ++ JVM_GetProtectionDomain; ++ JVM_GetSockName; ++ JVM_GetSockOpt; ++ JVM_GetStackAccessControlContext; ++ JVM_GetStackTraceDepth; ++ JVM_GetStackTraceElement; ++ JVM_GetSystemPackage; ++ JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; ++ JVM_GetThreadStateNames; ++ JVM_GetThreadStateValues; ++ JVM_GetVersionInfo; ++ JVM_Halt; ++ JVM_HoldsLock; ++ JVM_IHashCode; ++ JVM_InitAgentProperties; ++ JVM_InitProperties; ++ JVM_InitializeCompiler; ++ JVM_InitializeSocketLibrary; ++ JVM_InternString; ++ JVM_Interrupt; ++ JVM_InvokeMethod; ++ JVM_IsArrayClass; ++ JVM_IsConstructorIx; ++ JVM_IsInterface; ++ JVM_IsInterrupted; ++ JVM_IsNaN; ++ JVM_IsPrimitiveClass; ++ JVM_IsSameClassPackage; ++ JVM_IsSilentCompiler; ++ JVM_IsSupportedJNIVersion; ++ JVM_IsThreadAlive; ++ JVM_IsVMGeneratedMethodIx; ++ JVM_LatestUserDefinedLoader; ++ JVM_Listen; ++ JVM_LoadClass0; ++ JVM_LoadLibrary; ++ JVM_Lseek; ++ JVM_MaxObjectInspectionAge; ++ JVM_MaxMemory; ++ JVM_MonitorNotify; ++ JVM_MonitorNotifyAll; ++ JVM_MonitorWait; ++ JVM_NanoTime; ++ JVM_NativePath; ++ JVM_NewArray; ++ JVM_NewInstanceFromConstructor; ++ JVM_NewMultiArray; ++ JVM_OnExit; ++ JVM_Open; ++ JVM_RaiseSignal; ++ JVM_RawMonitorCreate; ++ JVM_RawMonitorDestroy; ++ JVM_RawMonitorEnter; ++ JVM_RawMonitorExit; ++ JVM_Read; ++ JVM_Recv; ++ JVM_RecvFrom; ++ JVM_RegisterSignal; ++ JVM_ReleaseUTF; ++ JVM_ResolveClass; ++ JVM_ResumeThread; ++ JVM_Send; ++ JVM_SendTo; ++ JVM_SetArrayElement; ++ JVM_SetClassSigners; ++ JVM_SetLength; ++ JVM_SetNativeThreadName; ++ JVM_SetPrimitiveArrayElement; ++ JVM_SetProtectionDomain; ++ JVM_SetSockOpt; ++ JVM_SetThreadPriority; ++ JVM_Sleep; ++ JVM_Socket; ++ JVM_SocketAvailable; ++ JVM_SocketClose; ++ JVM_SocketShutdown; ++ JVM_StartThread; ++ JVM_StopThread; ++ JVM_SuspendThread; ++ JVM_SupportsCX8; ++ JVM_Sync; ++ JVM_Timeout; ++ JVM_TotalMemory; ++ JVM_TraceInstructions; ++ JVM_TraceMethodCalls; ++ JVM_UnloadLibrary; ++ JVM_Write; ++ JVM_Yield; ++ JVM_handle_linux_signal; ++ ++ # miscellaneous functions ++ jio_fprintf; ++ jio_printf; ++ jio_snprintf; ++ jio_vfprintf; ++ jio_vsnprintf; ++ fork1; ++ numa_warn; ++ numa_error; ++ ++ # Needed because there is no JVM interface for this. ++ sysThreadAvailableStackWithSlack; ++ ++ # This is for Forte Analyzer profiling support. ++ AsyncGetCallTrace; ++ ++ # INSERT VTABLE SYMBOLS HERE ++ ++ local: ++ *; ++}; ++ +--- ./hotspot/make/aix/makefiles/ppc64.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/ppc64.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,94 @@ ++# ++# Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# Produce 64 bits object files. ++CFLAGS += -q64 ++ ++# Balanced tuning for recent versions of the POWER architecture (if supported by xlc). ++QTUNE=$(if $(CXX_SUPPORTS_BALANCED_TUNING),balanced,pwr5) ++ ++# Try to speed up the interpreter: use ppc64 instructions and inline ++# glue code for external functions. ++OPT_CFLAGS += -qarch=ppc64 -qtune=$(QTUNE) -qinlglue ++ ++# We need variable length arrays ++CFLAGS += -qlanglvl=c99vla ++# Just to check for unwanted macro redefinitions ++CFLAGS += -qlanglvl=noredefmac ++ ++# Suppress those "implicit private" warnings xlc gives. ++# - The omitted keyword "private" is assumed for base class "...". ++CFLAGS += -qsuppress=1540-0198 ++ ++# Suppress the following numerous warning: ++# - 1540-1090 (I) The destructor of "..." might not be called. ++# - 1500-010: (W) WARNING in ...: Infinite loop. Program may not stop. ++# There are several infinite loops in the vm, suppress. ++CFLAGS += -qsuppress=1540-1090 -qsuppress=1500-010 ++ ++# Suppress ++# - 540-1088 (W) The exception specification is being ignored. ++# caused by throw() in declaration of new() in nmethod.hpp. ++CFLAGS += -qsuppress=1540-1088 ++ ++# Turn off floating-point optimizations that may alter program semantics ++OPT_CFLAGS += -qstrict ++ ++# Disable aggressive optimizations for functions in sharedRuntimeTrig.cpp ++# and sharedRuntimeTrans.cpp on ppc64. ++# -qstrict turns off the following optimizations: ++# * Performing code motion and scheduling on computations such as loads ++# and floating-point computations that may trigger an exception. ++# * Relaxing conformance to IEEE rules. ++# * Reassociating floating-point expressions. ++# When using '-qstrict' there still remains one problem ++# in javasoft.sqe.tests.api.java.lang.Math.sin5Tests when run in compile-all ++# mode, so don't optimize sharedRuntimeTrig.cpp at all. ++OPT_CFLAGS/sharedRuntimeTrig.o = $(OPT_CFLAGS/NOOPT) ++OPT_CFLAGS/sharedRuntimeTrans.o = $(OPT_CFLAGS/NOOPT) ++ ++# xlc 10.01 parameters for ipa compile. ++QIPA_COMPILE=$(if $(CXX_IS_V10),-qipa) ++ ++# Xlc 10.1 parameters for aggressive optimization: ++# - qhot=level=1: Most aggressive loop optimizations. ++# - qignerrno: Assume errno is not modified by system calls. ++# - qinline: Inline method calls. No suboptions for c++ compiles. ++# - qxflag=ASMMIDCOALFIX: Activate fix for -O3 problem in interpreter loop. ++# - qxflag=asmfastsync: Activate fix for performance problem with inline assembler with memory clobber. ++QV10_OPT=$(if $(CXX_IS_V10),-qxflag=ASMMIDCOALFIX -qxflag=asmfastsync) ++QV10_OPT_AGGRESSIVE=$(if $(CXX_IS_V10),-qhot=level=1 -qignerrno -qinline) ++QV10_OPT_CONSERVATIVE=$(if $(CXX_IS_V10),-qhot=level=1 -qignerrno -qinline) ++ ++# Disallow inlining for synchronizer.cpp, but perform O3 optimizations. ++OPT_CFLAGS/synchronizer.o = $(OPT_CFLAGS) -qnoinline ++ ++# Set all the xlC V10.1 options here. ++OPT_CFLAGS += $(QIPA_COMPILE) $(QV10_OPT) $(QV10_OPT_AGGRESSIVE) ++ ++export OBJECT_MODE=64 ++ ++# Also build launcher as 64 bit executable. ++LAUNCHERFLAGS += -q64 +--- ./hotspot/make/aix/makefiles/product.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/product.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,58 @@ ++# ++# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# Sets make macros for making optimized version of Gamma VM ++# (This is the "product", not the "release" version.) ++ ++# 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) ++ ++# 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. ++ ++# Linker mapfile ++MAPFILE = $(GAMMADIR)/make/aix/makefiles/mapfile-vers-product ++ ++# Remove ipa linkage altogether. Does not seem to benfit performance, but increases code footprint. ++LFLAGS_QIPA= ++ ++SYSDEFS += -DPRODUCT ++VERSION = optimized ++ ++# use -g to strip library as -x will discard its symbol table; -x is fine for ++# executables. ++# Note: these macros are not used in .debuginfo configs ++STRIP_LIBJVM = $(STRIP) -g $@ || exit 1; ++STRIP_AOUT = $(STRIP) -x $@ || exit 1; ++ ++# If we can create .debuginfo files, then the VM is stripped in vm.make ++# and this macro is not used. ++# LINK_LIB.CXX/POST_HOOK += $(STRIP_$(LINK_INTO)) +--- ./hotspot/make/aix/makefiles/rules.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/rules.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,203 @@ ++# ++# Copyright (c) 2003, 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. ++# ++# ++ ++# Common rules/macros for the vm, adlc. ++ ++# Tell make that .cpp is important ++.SUFFIXES: .cpp $(SUFFIXES) ++ ++DEMANGLER = c++filt ++DEMANGLE = $(DEMANGLER) < $@ > .$@ && mv -f .$@ $@ ++ ++# $(CC) is the c compiler (cc/gcc), $(CXX) is the c++ compiler (CC/g++). ++CC_COMPILE = $(CC) $(CXXFLAGS) $(CFLAGS) ++CXX_COMPILE = $(CXX) $(CXXFLAGS) $(CFLAGS) ++ ++AS.S = $(AS) $(ASFLAGS) ++ ++COMPILE.CC = $(CC_COMPILE) -c ++GENASM.CC = $(CC_COMPILE) -S ++LINK.CC = $(CC) $(LFLAGS) $(AOUT_FLAGS) $(PROF_AOUT_FLAGS) ++LINK_LIB.CC = $(CC) $(LFLAGS) $(SHARED_FLAG) ++PREPROCESS.CC = $(CC_COMPILE) -E ++ ++COMPILE.CXX = $(CXX_COMPILE) -c ++GENASM.CXX = $(CXX_COMPILE) -S ++LINK.CXX = $(CXX) $(LFLAGS) $(AOUT_FLAGS) $(PROF_AOUT_FLAGS) ++LINK_NOPROF.CXX = $(CXX) $(LFLAGS) $(AOUT_FLAGS) ++LINK_LIB.CXX = $(CXX) $(LFLAGS) $(SHARED_FLAG) ++PREPROCESS.CXX = $(CXX_COMPILE) -E ++ ++# cross compiling the jvm with c2 requires host compilers to build ++# adlc tool ++ ++HOST.CXX_COMPILE = $(HOSTCXX) $(CXXFLAGS) $(CFLAGS) ++HOST.COMPILE.CXX = $(HOST.CXX_COMPILE) -c ++HOST.LINK_NOPROF.CXX = $(HOSTCXX) $(LFLAGS) $(AOUT_FLAGS) ++ ++ ++# Effect of REMOVE_TARGET is to delete out-of-date files during "gnumake -k". ++REMOVE_TARGET = rm -f $@ ++ ++# Note use of ALT_BOOTDIR to explicitly specify location of java and ++# javac; this is the same environment variable used in the J2SE build ++# process for overriding the default spec, which is BOOTDIR. ++# Note also that we fall back to using JAVA_HOME if neither of these is ++# specified. ++ ++ifdef ALT_BOOTDIR ++ ++RUN.JAVA = $(ALT_BOOTDIR)/bin/java ++RUN.JAVAP = $(ALT_BOOTDIR)/bin/javap ++RUN.JAVAH = $(ALT_BOOTDIR)/bin/javah ++RUN.JAR = $(ALT_BOOTDIR)/bin/jar ++COMPILE.JAVAC = $(ALT_BOOTDIR)/bin/javac ++COMPILE.RMIC = $(ALT_BOOTDIR)/bin/rmic ++BOOT_JAVA_HOME = $(ALT_BOOTDIR) ++ ++else ++ ++ifdef BOOTDIR ++ ++RUN.JAVA = $(BOOTDIR)/bin/java ++RUN.JAVAP = $(BOOTDIR)/bin/javap ++RUN.JAVAH = $(BOOTDIR)/bin/javah ++RUN.JAR = $(BOOTDIR)/bin/jar ++COMPILE.JAVAC = $(BOOTDIR)/bin/javac ++COMPILE.RMIC = $(BOOTDIR)/bin/rmic ++BOOT_JAVA_HOME = $(BOOTDIR) ++ ++else ++ ++ifdef JAVA_HOME ++ ++RUN.JAVA = $(JAVA_HOME)/bin/java ++RUN.JAVAP = $(JAVA_HOME)/bin/javap ++RUN.JAVAH = $(JAVA_HOME)/bin/javah ++RUN.JAR = $(JAVA_HOME)/bin/jar ++COMPILE.JAVAC = $(JAVA_HOME)/bin/javac ++COMPILE.RMIC = $(JAVA_HOME)/bin/rmic ++BOOT_JAVA_HOME = $(JAVA_HOME) ++ ++else ++ ++# take from the PATH, if ALT_BOOTDIR, BOOTDIR and JAVA_HOME are not defined ++# note that this is to support hotspot build without SA. To build ++# SA along with hotspot, you need to define ALT_BOOTDIR, BOOTDIR or JAVA_HOME ++ ++RUN.JAVA = java ++RUN.JAVAP = javap ++RUN.JAVAH = javah ++RUN.JAR = jar ++COMPILE.JAVAC = javac ++COMPILE.RMIC = rmic ++ ++endif ++endif ++endif ++ ++COMPILE.JAVAC += $(BOOTSTRAP_JAVAC_FLAGS) ++ ++SUM = /usr/bin/sum ++ ++# 'gmake MAKE_VERBOSE=y' gives all the gory details. ++QUIETLY$(MAKE_VERBOSE) = @ ++RUN.JAR$(MAKE_VERBOSE) += >/dev/null ++ ++# Settings for javac ++BOOT_SOURCE_LANGUAGE_VERSION = 6 ++BOOT_TARGET_CLASS_VERSION = 6 ++JAVAC_FLAGS = -g -encoding ascii ++BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION) ++ ++# With parallel makes, print a message at the end of compilation. ++ifeq ($(findstring j,$(MFLAGS)),j) ++COMPILE_DONE = && { echo Done with $<; } ++endif ++ ++# Include $(NONPIC_OBJ_FILES) definition ++ifndef LP64 ++include $(GAMMADIR)/make/pic.make ++endif ++ ++include $(GAMMADIR)/make/altsrc.make ++ ++# The non-PIC object files are only generated for 32 bit platforms. ++ifdef LP64 ++%.o: %.cpp ++ @echo Compiling $< ++ $(QUIETLY) $(REMOVE_TARGET) ++ $(QUIETLY) $(COMPILE.CXX) $(DEPFLAGS) -o $@ $< $(COMPILE_DONE) ++else ++%.o: %.cpp ++ @echo Compiling $< ++ $(QUIETLY) $(REMOVE_TARGET) ++ $(QUIETLY) $(if $(findstring $@, $(NONPIC_OBJ_FILES)), \ ++ $(subst $(VM_PICFLAG), ,$(COMPILE.CXX)) $(DEPFLAGS) -o $@ $< $(COMPILE_DONE), \ ++ $(COMPILE.CXX) $(DEPFLAGS) -o $@ $< $(COMPILE_DONE)) ++endif ++ ++%.o: %.s ++ @echo Assembling $< ++ $(QUIETLY) $(REMOVE_TARGET) ++ $(QUIETLY) $(AS.S) $(DEPFLAGS) -o $@ $< $(COMPILE_DONE) ++ ++%.s: %.cpp ++ @echo Generating assembly for $< ++ $(QUIETLY) $(GENASM.CXX) -o $@ $< ++ $(QUIETLY) $(DEMANGLE) $(COMPILE_DONE) ++ ++# Intermediate files (for debugging macros) ++%.i: %.cpp ++ @echo Preprocessing $< to $@ ++ $(QUIETLY) $(PREPROCESS.CXX) $< > $@ $(COMPILE_DONE) ++ ++# Override gnumake built-in rules which do sccs get operations badly. ++# (They put the checked out code in the current directory, not in the ++# directory of the original file.) Since this is a symptom of a teamware ++# failure, and since not all problems can be detected by gnumake due ++# to incomplete dependency checking... just complain and stop. ++%:: s.% ++ @echo "=========================================================" ++ @echo File $@ ++ @echo is out of date with respect to its SCCS file. ++ @echo This file may be from an unresolved Teamware conflict. ++ @echo This is also a symptom of a Teamware bringover/putback failure ++ @echo in which SCCS files are updated but not checked out. ++ @echo Check for other out of date files in your workspace. ++ @echo "=========================================================" ++ @exit 666 ++ ++%:: SCCS/s.% ++ @echo "=========================================================" ++ @echo File $@ ++ @echo is out of date with respect to its SCCS file. ++ @echo This file may be from an unresolved Teamware conflict. ++ @echo This is also a symptom of a Teamware bringover/putback failure ++ @echo in which SCCS files are updated but not checked out. ++ @echo Check for other out of date files in your workspace. ++ @echo "=========================================================" ++ @exit 666 ++ ++.PHONY: default +--- ./hotspot/make/aix/makefiles/sa.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/sa.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,116 @@ ++# ++# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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 makefile (sa.make) is included from the sa.make in the ++# build directories. ++ ++# This makefile is used to build Serviceability Agent java code ++# and generate JNI header file for native methods. ++ ++include $(GAMMADIR)/make/aix/makefiles/rules.make ++ ++include $(GAMMADIR)/make/defs.make ++ ++AGENT_DIR = $(GAMMADIR)/agent ++ ++include $(GAMMADIR)/make/sa.files ++ ++TOPDIR = $(shell echo `pwd`) ++GENERATED = $(TOPDIR)/../generated ++ ++# tools.jar is needed by the JDI - SA binding ++SA_CLASSPATH = $(BOOT_JAVA_HOME)/lib/tools.jar ++ ++# TODO: if it's a modules image, check if SA module is installed. ++MODULELIB_PATH= $(BOOT_JAVA_HOME)/lib/modules ++ ++AGENT_FILES_LIST := $(GENERATED)/agent.classes.list ++ ++SA_CLASSDIR = $(GENERATED)/saclasses ++ ++SA_BUILD_VERSION_PROP = "sun.jvm.hotspot.runtime.VM.saBuildVersion=$(SA_BUILD_VERSION)" ++ ++SA_PROPERTIES = $(SA_CLASSDIR)/sa.properties ++ ++# if $(AGENT_DIR) does not exist, we don't build SA ++# also, we don't build SA on Itanium, PowerPC, ARM or zero. ++ ++all: ++ if [ -d $(AGENT_DIR) -a "$(SRCARCH)" != "ia64" \ ++ -a "$(SRCARCH)" != "arm" \ ++ -a "$(SRCARCH)" != "ppc" \ ++ -a "$(SRCARCH)" != "zero" ] ; then \ ++ $(MAKE) -f sa.make $(GENERATED)/sa-jdi.jar; \ ++ fi ++ ++$(GENERATED)/sa-jdi.jar: $(AGENT_FILES) ++ $(QUIETLY) echo "Making $@" ++ $(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \ ++ echo "ALT_BOOTDIR, BOOTDIR or JAVA_HOME needs to be defined to build SA"; \ ++ exit 1; \ ++ fi ++ $(QUIETLY) if [ ! -f $(SA_CLASSPATH) -a ! -d $(MODULELIB_PATH) ] ; then \ ++ echo "Missing $(SA_CLASSPATH) file. Use 1.6.0 or later version of JDK";\ ++ echo ""; \ ++ exit 1; \ ++ fi ++ $(QUIETLY) if [ ! -d $(SA_CLASSDIR) ] ; then \ ++ mkdir -p $(SA_CLASSDIR); \ ++ fi ++# Note: When indented, make tries to execute the '$(shell' comment. ++# In some environments, cmd processors have limited line length. ++# To prevent the javac invocation in the next block from using ++# a very long cmd line, we use javac's @file-list option. We ++# generate the file lists using make's built-in 'foreach' control ++# flow which also avoids cmd processor line length issues. Since ++# the 'foreach' is done as part of make's macro expansion phase, ++# the initialization of the lists is also done in the same phase ++# using '$(shell rm ...' instead of using the more traditional ++# 'rm ...' rule. ++ $(shell rm -rf $(AGENT_FILES_LIST)) ++# gnumake 3.78.1 does not accept the *'s that ++# are in AGENT_FILES, so use the shell to expand them. ++# Be extra carefull to not produce too long command lines in the shell! ++ $(foreach file,$(AGENT_FILES),$(shell ls -1 $(file) >> $(AGENT_FILES_LIST))) ++ $(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) @$(AGENT_FILES_LIST) ++ $(QUIETLY) $(REMOTE) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer ++ $(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES) ++ $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js ++ $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql ++ $(QUIETLY) mkdir -p $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources ++ $(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/* ++ $(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/ ++ $(QUIETLY) cp -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/ ++ $(QUIETLY) $(REMOTE) $(RUN.JAR) cf $@ -C $(SA_CLASSDIR)/ . ++ $(QUIETLY) $(REMOTE) $(RUN.JAR) uf $@ -C $(AGENT_SRC_DIR) META-INF/services/com.sun.jdi.connect.Connector ++ $(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.x86.X86ThreadContext ++ $(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.ia64.IA64ThreadContext ++ $(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext ++ $(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.sparc.SPARCThreadContext ++ ++clean: ++ rm -rf $(SA_CLASSDIR) ++ rm -rf $(GENERATED)/sa-jdi.jar ++ rm -rf $(AGENT_FILES_LIST) +--- ./hotspot/make/aix/makefiles/saproc.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/saproc.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,117 @@ ++# ++# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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 $(GAMMADIR)/make/defs.make ++ ++# Rules to build serviceability agent library, used by vm.make ++ ++# libsaproc.so: serviceability agent ++ ++SAPROC = saproc ++LIBSAPROC = lib$(SAPROC).so ++ ++LIBSAPROC_DEBUGINFO = lib$(SAPROC).debuginfo ++LIBSAPROC_DIZ = lib$(SAPROC).diz ++ ++AGENT_DIR = $(GAMMADIR)/agent ++ ++SASRCDIR = $(AGENT_DIR)/src/os/$(Platform_os_family) ++ ++SASRCFILES = $(SASRCDIR)/salibelf.c \ ++ $(SASRCDIR)/symtab.c \ ++ $(SASRCDIR)/libproc_impl.c \ ++ $(SASRCDIR)/ps_proc.c \ ++ $(SASRCDIR)/ps_core.c \ ++ $(SASRCDIR)/LinuxDebuggerLocal.c \ ++ ++SAMAPFILE = $(SASRCDIR)/mapfile ++ ++DEST_SAPROC = $(JDK_LIBDIR)/$(LIBSAPROC) ++DEST_SAPROC_DEBUGINFO = $(JDK_LIBDIR)/$(LIBSAPROC_DEBUGINFO) ++DEST_SAPROC_DIZ = $(JDK_LIBDIR)/$(LIBSAPROC_DIZ) ++ ++# DEBUG_BINARIES overrides everything, use full -g debug information ++ifeq ($(DEBUG_BINARIES), true) ++ SA_DEBUG_CFLAGS = -g ++endif ++ ++# if $(AGENT_DIR) does not exist, we don't build SA ++# also, we don't build SA on Itanium, PPC, ARM or zero. ++ ++ifneq ($(wildcard $(AGENT_DIR)),) ++ifneq ($(filter-out ia64 arm ppc zero,$(SRCARCH)),) ++ BUILDLIBSAPROC = $(LIBSAPROC) ++endif ++endif ++ ++ ++SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE)) $(LDFLAGS_HASH_STYLE) ++ ++$(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE) ++ $(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \ ++ echo "ALT_BOOTDIR, BOOTDIR or JAVA_HOME needs to be defined to build SA"; \ ++ exit 1; \ ++ fi ++ @echo Making SA debugger back-end... ++ $(QUIETLY) $(CC) -D$(BUILDARCH) -D_GNU_SOURCE \ ++ -D_FILE_OFFSET_BITS=64 \ ++ $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \ ++ $(BIN_UTILS) \ ++ -I$(SASRCDIR) \ ++ -I$(GENERATED) \ ++ -I$(BOOT_JAVA_HOME)/include \ ++ -I$(BOOT_JAVA_HOME)/include/$(Platform_os_family) \ ++ $(SASRCFILES) \ ++ $(SA_LFLAGS) \ ++ $(SA_DEBUG_CFLAGS) \ ++ -o $@ \ ++ -lthread_db ++ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ++ $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBSAPROC_DEBUGINFO) ++ $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBSAPROC_DEBUGINFO) $@ ++ ifeq ($(STRIP_POLICY),all_strip) ++ $(QUIETLY) $(STRIP) $@ ++ else ++ ifeq ($(STRIP_POLICY),min_strip) ++ $(QUIETLY) $(STRIP) -g $@ ++ # implied else here is no stripping at all ++ endif ++ endif ++ ifeq ($(ZIP_DEBUGINFO_FILES),1) ++ $(ZIPEXE) -q -y $(LIBSAPROC_DIZ) $(LIBSAPROC_DEBUGINFO) ++ $(RM) $(LIBSAPROC_DEBUGINFO) ++ endif ++endif ++ ++install_saproc: $(BUILDLIBSAPROC) ++ $(QUIETLY) if [ -e $(LIBSAPROC) ] ; then \ ++ echo "Copying $(LIBSAPROC) to $(DEST_SAPROC)"; \ ++ test -f $(LIBSAPROC_DEBUGINFO) && \ ++ cp -f $(LIBSAPROC_DEBUGINFO) $(DEST_SAPROC_DEBUGINFO); \ ++ test -f $(LIBSAPROC_DIZ) && \ ++ cp -f $(LIBSAPROC_DIZ) $(DEST_SAPROC_DIZ); \ ++ cp -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done"; \ ++ fi ++ ++.PHONY: install_saproc +--- ./hotspot/make/aix/makefiles/top.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/top.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,144 @@ ++# ++# Copyright (c) 1999, 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. ++# ++# ++ ++# top.make is included in the Makefile in the build directories. ++# It DOES NOT include the vm dependency info in order to be faster. ++# Its main job is to implement the incremental form of make lists. ++# It also: ++# -builds and runs adlc via adlc.make ++# -generates JVMTI source and docs via jvmti.make (JSR-163) ++# -generate sa-jdi.jar (JDI binding to core files) ++ ++# It assumes the following flags are set: ++# CFLAGS Platform_file, Src_Dirs_I, Src_Dirs_V, SYSDEFS, AOUT, Obj_Files ++ ++# -- D. Ungar (5/97) from a file by Bill Bush ++ ++# Don't override the built-in $(MAKE). ++# Instead, use "gmake" (or "gnumake") from the command line. --Rose ++#MAKE = gmake ++ ++include $(GAMMADIR)/make/altsrc.make ++ ++TOPDIR = $(shell echo `pwd`) ++GENERATED = $(TOPDIR)/../generated ++VM = $(GAMMADIR)/src/share/vm ++Plat_File = $(Platform_file) ++CDG = cd $(GENERATED); ++ ++ifneq ($(USE_PRECOMPILED_HEADER),0) ++UpdatePCH = $(MAKE) -f vm.make $(PRECOMPILED_HEADER) $(MFLAGS) ++else ++UpdatePCH = \# precompiled header is not used ++endif ++ ++Cached_plat = $(GENERATED)/platform.current ++ ++AD_Dir = $(GENERATED)/adfiles ++ADLC = $(AD_Dir)/adlc ++AD_Spec = $(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(Platform_arch)/vm/$(Platform_arch_model).ad) ++AD_Src = $(call altsrc-replace,$(HS_COMMON_SRC)/share/vm/adlc) ++AD_Names = ad_$(Platform_arch_model).hpp ad_$(Platform_arch_model).cpp ++AD_Files = $(AD_Names:%=$(AD_Dir)/%) ++ ++# AD_Files_If_Required/COMPILER1 = ad_stuff ++AD_Files_If_Required/COMPILER2 = ad_stuff ++AD_Files_If_Required/TIERED = ad_stuff ++AD_Files_If_Required = $(AD_Files_If_Required/$(TYPE)) ++ ++# Wierd argument adjustment for "gnumake -j..." ++adjust-mflags = $(GENERATED)/adjust-mflags ++MFLAGS-adjusted = -r `$(adjust-mflags) "$(MFLAGS)" "$(HOTSPOT_BUILD_JOBS)"` ++ ++ ++# default target: update lists, make vm ++# done in stages to force sequential order with parallel make ++# ++ ++default: vm_build_preliminaries the_vm ++ @echo All done. ++ ++# This is an explicit dependency for the sake of parallel makes. ++vm_build_preliminaries: checks $(Cached_plat) $(AD_Files_If_Required) trace_stuff jvmti_stuff sa_stuff ++ @# We need a null action here, so implicit rules don't get consulted. ++ ++$(Cached_plat): $(Plat_File) ++ $(CDG) cp $(Plat_File) $(Cached_plat) ++ ++# make AD files as necessary ++ad_stuff: $(Cached_plat) $(adjust-mflags) ++ @$(MAKE) -f adlc.make $(MFLAGS-adjusted) ++ ++# generate JVMTI files from the spec ++jvmti_stuff: $(Cached_plat) $(adjust-mflags) ++ @$(MAKE) -f jvmti.make $(MFLAGS-adjusted) ++ ++# generate trace files ++trace_stuff: jvmti_stuff $(Cached_plat) $(adjust-mflags) ++ @$(MAKE) -f trace.make $(MFLAGS-adjusted) ++ ++# generate SA jar files and native header ++sa_stuff: ++ @$(MAKE) -f sa.make $(MFLAGS-adjusted) ++ ++# and the VM: must use other makefile with dependencies included ++ ++# We have to go to great lengths to get control over the -jN argument ++# to the recursive invocation of vm.make. The problem is that gnumake ++# resets -jN to -j1 for recursive runs. (How helpful.) ++# Note that the user must specify the desired parallelism level via a ++# command-line or environment variable name HOTSPOT_BUILD_JOBS. ++$(adjust-mflags): $(GAMMADIR)/make/$(Platform_os_family)/makefiles/adjust-mflags.sh ++ @+rm -f $@ $@+ ++ @+cat $< > $@+ ++ @+chmod +x $@+ ++ @+mv $@+ $@ ++ ++the_vm: vm_build_preliminaries $(adjust-mflags) ++ @$(UpdatePCH) ++ @$(MAKE) -f vm.make $(MFLAGS-adjusted) ++ ++install gamma: the_vm ++ @$(MAKE) -f vm.make $@ ++ ++# next rules support "make foo.[ois]" ++ ++%.o %.i %.s: ++ $(UpdatePCH) ++ $(MAKE) -f vm.make $(MFLAGS) $@ ++ #$(MAKE) -f vm.make $@ ++ ++# this should force everything to be rebuilt ++clean: ++ rm -f $(GENERATED)/*.class ++ $(MAKE) -f vm.make $(MFLAGS) clean ++ ++# just in case it doesn't, this should do it ++realclean: ++ $(MAKE) -f vm.make $(MFLAGS) clean ++ rm -fr $(GENERATED) ++ ++.PHONY: default vm_build_preliminaries ++.PHONY: lists ad_stuff jvmti_stuff sa_stuff the_vm clean realclean ++.PHONY: checks check_os_version install +--- ./hotspot/make/aix/makefiles/trace.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/trace.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,120 @@ ++# ++# Copyright (c) 2003, 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. ++# ++# ++ ++# This makefile (trace.make) is included from the trace.make in the ++# build directories. ++# ++# It knows how to build and run the tools to generate trace files. ++ ++include $(GAMMADIR)/make/linux/makefiles/rules.make ++include $(GAMMADIR)/make/altsrc.make ++ ++# ######################################################################### ++ ++HAS_ALT_SRC:=$(shell if [ -d $(HS_ALT_SRC)/share/vm/trace ]; then \ ++ echo "true"; else echo "false";\ ++ fi) ++ ++TOPDIR = $(shell echo `pwd`) ++GENERATED = $(TOPDIR)/../generated ++JvmtiOutDir = $(GENERATED)/jvmtifiles ++TraceOutDir = $(GENERATED)/tracefiles ++ ++TraceAltSrcDir = $(HS_ALT_SRC)/share/vm/trace ++TraceSrcDir = $(HS_COMMON_SRC)/share/vm/trace ++ ++# set VPATH so make knows where to look for source files ++Src_Dirs_V += $(TraceSrcDir) $(TraceAltSrcDir) ++VPATH += $(Src_Dirs_V:%=%:) ++ ++TraceGeneratedNames = \ ++ traceEventClasses.hpp \ ++ traceEventIds.hpp \ ++ traceTypes.hpp ++ ++ifeq ($(HAS_ALT_SRC), true) ++TraceGeneratedNames += \ ++ traceRequestables.hpp \ ++ traceEventControl.hpp ++ ++ifneq ($(INCLUDE_TRACE), false) ++TraceGeneratedNames += traceProducer.cpp ++endif ++ ++endif ++ ++TraceGeneratedFiles = $(TraceGeneratedNames:%=$(TraceOutDir)/%) ++ ++XSLT = $(REMOTE) $(RUN.JAVA) -classpath $(JvmtiOutDir) jvmtiGen ++ ++XML_DEPS = $(TraceSrcDir)/trace.xml $(TraceSrcDir)/tracetypes.xml \ ++ $(TraceSrcDir)/trace.dtd $(TraceSrcDir)/xinclude.mod ++ifeq ($(HAS_ALT_SRC), true) ++ XML_DEPS += $(TraceAltSrcDir)/traceevents.xml ++endif ++ ++.PHONY: all clean cleanall ++ ++# ######################################################################### ++ ++all: $(TraceGeneratedFiles) ++ ++GENERATE_CODE= \ ++ $(QUIETLY) echo Generating $@; \ ++ $(XSLT) -IN $(word 1,$^) -XSL $(word 2,$^) -OUT $@; \ ++ test -f $@ ++ ++$(TraceOutDir)/traceEventIds.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceEventIds.xsl $(XML_DEPS) ++ $(GENERATE_CODE) ++ ++$(TraceOutDir)/traceTypes.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceTypes.xsl $(XML_DEPS) ++ $(GENERATE_CODE) ++ ++ifeq ($(HAS_ALT_SRC), false) ++ ++$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceEventClasses.xsl $(XML_DEPS) ++ $(GENERATE_CODE) ++ ++else ++ ++$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS) ++ $(GENERATE_CODE) ++ ++$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS) ++ $(GENERATE_CODE) ++ ++$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS) ++ $(GENERATE_CODE) ++ ++$(TraceOutDir)/traceEventControl.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventControl.xsl $(XML_DEPS) ++ $(GENERATE_CODE) ++ ++endif ++ ++# ######################################################################### ++ ++clean cleanall: ++ rm $(TraceGeneratedFiles) ++ ++ +--- ./hotspot/make/aix/makefiles/vm.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/vm.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,377 @@ ++# ++# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# Rules to build JVM and related libraries, included from vm.make in the build ++# directory. ++ ++# Common build rules. ++MAKEFILES_DIR=$(GAMMADIR)/make/$(Platform_os_family)/makefiles ++include $(MAKEFILES_DIR)/rules.make ++include $(GAMMADIR)/make/altsrc.make ++ ++default: build ++ ++#---------------------------------------------------------------------- ++# Defs ++ ++GENERATED = ../generated ++DEP_DIR = $(GENERATED)/dependencies ++ ++# reads the generated files defining the set of .o's and the .o .h dependencies ++-include $(DEP_DIR)/*.d ++ ++# read machine-specific adjustments (%%% should do this via buildtree.make?) ++ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true) ++ include $(MAKEFILES_DIR)/zeroshark.make ++else ++ include $(MAKEFILES_DIR)/$(BUILDARCH).make ++endif ++ ++# set VPATH so make knows where to look for source files ++# Src_Dirs_V is everything in src/share/vm/*, plus the right os/*/vm and cpu/*/vm ++# The adfiles directory contains ad_.[ch]pp. ++# The jvmtifiles directory contains jvmti*.[ch]pp ++Src_Dirs_V += $(GENERATED)/adfiles $(GENERATED)/jvmtifiles $(GENERATED)/tracefiles ++VPATH += $(Src_Dirs_V:%=%:) ++ ++# set INCLUDES for C preprocessor. ++Src_Dirs_I += $(GENERATED) ++# The order is important for the precompiled headers to work. ++INCLUDES += $(PRECOMPILED_HEADER_DIR:%=-I%) $(Src_Dirs_I:%=-I%) ++ ++# SYMFLAG is used by {jsig,saproc}.make ++ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ++ # always build with debug info when we can create .debuginfo files ++ SYMFLAG = -g ++else ++ ifeq (${VERSION}, debug) ++ SYMFLAG = -g ++ else ++ SYMFLAG = ++ endif ++endif ++ ++# HOTSPOT_RELEASE_VERSION and HOTSPOT_BUILD_VERSION are defined ++# in $(GAMMADIR)/make/defs.make ++ifeq ($(HOTSPOT_BUILD_VERSION),) ++ BUILD_VERSION = -DHOTSPOT_RELEASE_VERSION="\"$(HOTSPOT_RELEASE_VERSION)\"" ++else ++ BUILD_VERSION = -DHOTSPOT_RELEASE_VERSION="\"$(HOTSPOT_RELEASE_VERSION)-$(HOTSPOT_BUILD_VERSION)\"" ++endif ++ ++# The following variables are defined in the generated flags.make file. ++BUILD_VERSION = -DHOTSPOT_RELEASE_VERSION="\"$(HS_BUILD_VER)\"" ++JRE_VERSION = -DJRE_RELEASE_VERSION="\"$(JRE_RELEASE_VER)\"" ++HS_LIB_ARCH = -DHOTSPOT_LIB_ARCH=\"$(LIBARCH)\" ++BUILD_TARGET = -DHOTSPOT_BUILD_TARGET="\"$(TARGET)\"" ++BUILD_USER = -DHOTSPOT_BUILD_USER="\"$(HOTSPOT_BUILD_USER)\"" ++VM_DISTRO = -DHOTSPOT_VM_DISTRO="\"$(HOTSPOT_VM_DISTRO)\"" ++ ++CXXFLAGS = \ ++ ${SYSDEFS} \ ++ ${INCLUDES} \ ++ ${BUILD_VERSION} \ ++ ${BUILD_TARGET} \ ++ ${BUILD_USER} \ ++ ${HS_LIB_ARCH} \ ++ ${VM_DISTRO} ++ ++# This is VERY important! The version define must only be supplied to vm_version.o ++# If not, ccache will not re-use the cache at all, since the version string might contain ++# a time and date. ++CXXFLAGS/vm_version.o += ${JRE_VERSION} ++ ++CXXFLAGS/BYFILE = $(CXXFLAGS/$@) ++ ++# File specific flags ++CXXFLAGS += $(CXXFLAGS/BYFILE) ++ ++ ++# CFLAGS_WARN holds compiler options to suppress/enable warnings. ++CFLAGS += $(CFLAGS_WARN/BYFILE) ++ ++# Do not use C++ exception handling ++CFLAGS += $(CFLAGS/NOEX) ++ ++# Extra flags from gnumake's invocation or environment ++CFLAGS += $(EXTRA_CFLAGS) ++LFLAGS += $(EXTRA_CFLAGS) ++ ++# Don't set excutable bit on stack segment ++# the same could be done by separate execstack command ++#LFLAGS += -Xlinker -z -Xlinker noexecstack ++ ++LIBS += -lm -ldl -lpthread ++ ++# By default, link the *.o into the library, not the executable. ++LINK_INTO$(LINK_INTO) = LIBJVM ++ ++JDK_LIBDIR = $(JAVA_HOME)/jre/lib/$(LIBARCH) ++ ++#---------------------------------------------------------------------- ++# jvm_db & dtrace ++include $(MAKEFILES_DIR)/dtrace.make ++ ++#---------------------------------------------------------------------- ++# JVM ++ ++JVM = jvm ++LIBJVM = lib$(JVM).so ++ ++CFLAGS += -DALLOW_OPERATOR_NEW_USAGE ++ ++LIBJVM_DEBUGINFO = lib$(JVM).debuginfo ++LIBJVM_DIZ = lib$(JVM).diz ++ ++SPECIAL_PATHS:=adlc c1 gc_implementation opto shark libadt ++ ++SOURCE_PATHS=\ ++ $(shell find $(HS_COMMON_SRC)/share/vm/* -type d \! \ ++ \( -name DUMMY $(foreach dir,$(SPECIAL_PATHS),-o -name $(dir)) \)) ++SOURCE_PATHS+=$(HS_COMMON_SRC)/os/$(Platform_os_family)/vm ++SOURCE_PATHS+=$(HS_COMMON_SRC)/os/posix/vm ++SOURCE_PATHS+=$(HS_COMMON_SRC)/cpu/$(SRCARCH)/vm ++SOURCE_PATHS+=$(HS_COMMON_SRC)/os_cpu/$(Platform_os_family)_$(SRCARCH)/vm ++ ++CORE_PATHS=$(foreach path,$(SOURCE_PATHS),$(call altsrc,$(path)) $(path)) ++CORE_PATHS+=$(GENERATED)/jvmtifiles $(GENERATED)/tracefiles ++ ++ifneq ($(INCLUDE_TRACE), false) ++CORE_PATHS+=$(shell if [ -d $(HS_ALT_SRC)/share/vm/jfr ]; then \ ++ find $(HS_ALT_SRC)/share/vm/jfr -type d; \ ++ fi) ++endif ++ ++COMPILER1_PATHS := $(call altsrc,$(HS_COMMON_SRC)/share/vm/c1) ++COMPILER1_PATHS += $(HS_COMMON_SRC)/share/vm/c1 ++ ++COMPILER2_PATHS := $(call altsrc,$(HS_COMMON_SRC)/share/vm/opto) ++COMPILER2_PATHS += $(call altsrc,$(HS_COMMON_SRC)/share/vm/libadt) ++COMPILER2_PATHS += $(HS_COMMON_SRC)/share/vm/opto ++COMPILER2_PATHS += $(HS_COMMON_SRC)/share/vm/libadt ++COMPILER2_PATHS += $(GENERATED)/adfiles ++ ++SHARK_PATHS := $(GAMMADIR)/src/share/vm/shark ++ ++# Include dirs per type. ++Src_Dirs/CORE := $(CORE_PATHS) ++Src_Dirs/COMPILER1 := $(CORE_PATHS) $(COMPILER1_PATHS) ++Src_Dirs/COMPILER2 := $(CORE_PATHS) $(COMPILER2_PATHS) ++Src_Dirs/TIERED := $(CORE_PATHS) $(COMPILER1_PATHS) $(COMPILER2_PATHS) ++Src_Dirs/ZERO := $(CORE_PATHS) ++Src_Dirs/SHARK := $(CORE_PATHS) $(SHARK_PATHS) ++Src_Dirs := $(Src_Dirs/$(TYPE)) ++ ++COMPILER2_SPECIFIC_FILES := opto libadt bcEscapeAnalyzer.cpp c2_\* runtime_\* ++COMPILER1_SPECIFIC_FILES := c1_\* ++SHARK_SPECIFIC_FILES := shark ++ZERO_SPECIFIC_FILES := zero ++ ++# Always exclude these. ++Src_Files_EXCLUDE += jsig.c jvmtiEnvRecommended.cpp jvmtiEnvStub.cpp ++ ++# Exclude per type. ++Src_Files_EXCLUDE/CORE := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp ++Src_Files_EXCLUDE/COMPILER1 := $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp ++Src_Files_EXCLUDE/COMPILER2 := $(COMPILER1_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ++Src_Files_EXCLUDE/TIERED := $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ++Src_Files_EXCLUDE/ZERO := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp ++Src_Files_EXCLUDE/SHARK := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) ++ ++Src_Files_EXCLUDE += $(Src_Files_EXCLUDE/$(TYPE)) ++ ++# Disable ELF decoder on AIX (AIX uses XCOFF). ++Src_Files_EXCLUDE += decoder_elf.cpp elfFile.cpp elfStringTable.cpp elfSymbolTable.cpp elfFuncDescTable.cpp ++ ++# Special handling of arch model. ++ifeq ($(Platform_arch_model), x86_32) ++Src_Files_EXCLUDE += \*x86_64\* ++endif ++ifeq ($(Platform_arch_model), x86_64) ++Src_Files_EXCLUDE += \*x86_32\* ++endif ++ ++# Locate all source files in the given directory, excluding files in Src_Files_EXCLUDE. ++define findsrc ++ $(notdir $(shell find $(1)/. ! -name . -prune \ ++ -a \( -name \*.c -o -name \*.cpp -o -name \*.s \) \ ++ -a ! \( -name DUMMY $(addprefix -o -name ,$(Src_Files_EXCLUDE)) \))) ++endef ++ ++Src_Files := $(foreach e,$(Src_Dirs),$(call findsrc,$(e))) ++ ++Obj_Files = $(sort $(addsuffix .o,$(basename $(Src_Files)))) ++ ++JVM_OBJ_FILES = $(Obj_Files) ++ ++vm_version.o: $(filter-out vm_version.o,$(JVM_OBJ_FILES)) ++ ++mapfile : $(MAPFILE) vm.def ++ rm -f $@ ++ awk '{ if ($$0 ~ "INSERT VTABLE SYMBOLS HERE") \ ++ { system ("cat vm.def"); } \ ++ else \ ++ { print $$0 } \ ++ }' > $@ < $(MAPFILE) ++ ++mapfile_reorder : mapfile $(REORDERFILE) ++ rm -f $@ ++ cat $^ > $@ ++ ++vm.def: $(Res_Files) $(Obj_Files) ++ sh $(GAMMADIR)/make/aix/makefiles/build_vm_def.sh *.o > $@ ++ ++ifeq ($(JVM_VARIANT_ZEROSHARK), true) ++ STATIC_CXX = false ++else ++ ifeq ($(ZERO_LIBARCH), ppc64) ++ STATIC_CXX = false ++ else ++ STATIC_CXX = true ++ endif ++endif ++ ++ifeq ($(LINK_INTO),AOUT) ++ LIBJVM.o = ++ LIBJVM_MAPFILE = ++ LIBS_VM = $(LIBS) ++else ++ LIBJVM.o = $(JVM_OBJ_FILES) ++ LIBJVM_MAPFILE$(LDNOMAP) = mapfile_reorder ++ LFLAGS_VM$(LDNOMAP) += $(MAPFLAG:FILENAME=$(LIBJVM_MAPFILE)) ++# xlC_r ignores the -o= syntax ++# LFLAGS_VM += $(SONAMEFLAG:SONAME=$(LIBJVM)) ++ ++ # JVM is statically linked with libgcc[_s] and libstdc++; this is needed to ++ # get around library dependency and compatibility issues. Must use gcc not ++ # g++ to link. ++ LIBS_VM += $(STATIC_STDCXX) $(LIBS) ++endif ++ ++LINK_VM = $(LINK_LIB.CXX) ++ ++# create loadmap for libjvm.so by default. Helps in diagnosing some problems. ++LFLAGS_VM += -bloadmap:libjvm.loadmap ++ ++# rule for building precompiled header ++$(PRECOMPILED_HEADER): ++ $(QUIETLY) echo Generating precompiled header $@ ++ $(QUIETLY) mkdir -p $(PRECOMPILED_HEADER_DIR) ++ $(QUIETLY) $(COMPILE.CXX) $(DEPFLAGS) -x c++-header $(PRECOMPILED_HEADER_SRC) -o $@ $(COMPILE_DONE) ++ ++# making the library: ++ ++ifneq ($(JVM_BASE_ADDR),) ++# By default shared library is linked at base address == 0. Modify the ++# linker script if JVM prefers a different base location. It can also be ++# implemented with 'prelink -r'. But 'prelink' is not (yet) available on ++# our build platform (AS-2.1). ++LD_SCRIPT = libjvm.so.lds ++$(LD_SCRIPT): $(LIBJVM_MAPFILE) ++ $(QUIETLY) { \ ++ rm -rf $@; \ ++ $(LINK_VM) -Wl,--verbose $(LFLAGS_VM) 2>&1 | \ ++ sed -e '/^======/,/^======/!d' \ ++ -e '/^======/d' \ ++ -e 's/0\( + SIZEOF_HEADERS\)/$(JVM_BASE_ADDR)\1/' \ ++ > $@; \ ++ } ++LD_SCRIPT_FLAG = -Wl,-T,$(LD_SCRIPT) ++endif ++ ++# With more recent Redhat releases (or the cutting edge version Fedora), if ++# SELinux is configured to be enabled, the runtime linker will fail to apply ++# the text relocation to libjvm.so considering that it is built as a non-PIC ++# DSO. To workaround that, we run chcon to libjvm.so after it is built. See ++# details in bug 6538311. ++$(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE) $(LD_SCRIPT) ++ $(QUIETLY) { \ ++ echo Linking vm...; \ ++ $(LINK_LIB.CXX/PRE_HOOK) \ ++ $(LINK_VM) $(LD_SCRIPT_FLAG) \ ++ $(LFLAGS_VM) -o $@ $(sort $(LIBJVM.o)) $(LIBS_VM); \ ++ $(LINK_LIB.CXX/POST_HOOK) \ ++ rm -f $@.1; ln -s $@ $@.1; \ ++ } ++# No security contexts on AIX ++# if [ \"$(CROSS_COMPILE_ARCH)\" = \"\" ] ; then \ ++# if [ -x /usr/sbin/selinuxenabled ] ; then \ ++# /usr/sbin/selinuxenabled; \ ++# if [ $$? = 0 ] ; then \ ++# /usr/bin/chcon -t textrel_shlib_t $@; \ ++# if [ $$? != 0 ]; then \ ++# echo "ERROR: Cannot chcon $@"; \ ++# fi \ ++# fi \ ++# fi \ ++# fi \ ++# } ++ ++#ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) ++# $(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DEBUGINFO) ++# $(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DEBUGINFO) $@ ++# ifeq ($(STRIP_POLICY),all_strip) ++# $(QUIETLY) $(STRIP) $@ ++# else ++# ifeq ($(STRIP_POLICY),min_strip) ++# $(QUIETLY) $(STRIP) -g $@ ++# # implied else here is no stripping at all ++# endif ++# endif ++# ifeq ($(ZIP_DEBUGINFO_FILES),1) ++# $(ZIPEXE) -q -y $(LIBJVM_DIZ) $(LIBJVM_DEBUGINFO) ++# $(RM) $(LIBJVM_DEBUGINFO) ++# endif ++#endif ++ ++DEST_SUBDIR = $(JDK_LIBDIR)/$(VM_SUBDIR) ++DEST_JVM = $(DEST_SUBDIR)/$(LIBJVM) ++DEST_JVM_DEBUGINFO = $(DEST_SUBDIR)/$(LIBJVM_DEBUGINFO) ++DEST_JVM_DIZ = $(DEST_SUBDIR)/$(LIBJVM_DIZ) ++ ++install_jvm: $(LIBJVM) ++ @echo "Copying $(LIBJVM) to $(DEST_JVM)" ++ $(QUIETLY) test -f $(LIBJVM_DEBUGINFO) && \ ++ cp -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO) ++ $(QUIETLY) test -f $(LIBJVM_DIZ) && \ ++ cp -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ) ++ $(QUIETLY) cp -f $(LIBJVM) $(DEST_JVM) && echo "Done" ++ ++#---------------------------------------------------------------------- ++# Other files ++ ++# Signal interposition library ++include $(MAKEFILES_DIR)/jsig.make ++ ++# Serviceability agent ++include $(MAKEFILES_DIR)/saproc.make ++ ++#---------------------------------------------------------------------- ++ ++build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC) ++ ++install: install_jvm install_jsig install_saproc ++ ++.PHONY: default build install install_jvm +--- ./hotspot/make/aix/makefiles/xlc.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/makefiles/xlc.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,159 @@ ++# ++# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2012, 2013 SAP. 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. ++# ++# ++ ++#------------------------------------------------------------------------ ++# CC, CXX & AS ++ ++# Set compiler explicitly ++CXX = $(COMPILER_PATH)xlC_r ++CC = $(COMPILER_PATH)xlc_r ++HOSTCXX = $(CXX) ++HOSTCC = $(CC) ++ ++AS = $(CC) -c ++ ++# get xlc version ++CXX_VERSION := $(shell $(CXX) -qversion 2>&1 | sed -n 's/.*Version: \([0-9.]*\)/\1/p') ++ ++# xlc 08.00.0000.0023 and higher supports -qtune=balanced ++CXX_SUPPORTS_BALANCED_TUNING=$(shell if [ $(subst .,,$(CXX_VERSION)) -ge 080000000023 ] ; then echo "true" ; fi) ++# xlc 10.01 is used with aggressive optimizations to boost performance ++CXX_IS_V10=$(shell if [ $(subst .,,$(CXX_VERSION)) -ge 100100000000 ] ; then echo "true" ; fi) ++ ++# check for precompiled headers support ++ ++# Switch off the precompiled header support. Neither xlC 8.0 nor xlC 10.0 ++# support precompiled headers. Both "understand" the command line switches "-qusepcomp" and ++# "-qgenpcomp" but when we specify them the following message is printed: ++# "1506-755 (W) The -qusepcomp option is not supported in this release." ++USE_PRECOMPILED_HEADER = 0 ++ifneq ($(USE_PRECOMPILED_HEADER),0) ++PRECOMPILED_HEADER_DIR=. ++PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled/precompiled.hpp ++PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.gch ++endif ++ ++ ++#------------------------------------------------------------------------ ++# Compiler flags ++ ++# position-independent code ++PICFLAG = -qpic=large ++ ++VM_PICFLAG/LIBJVM = $(PICFLAG) ++VM_PICFLAG/AOUT = ++VM_PICFLAG = $(VM_PICFLAG/$(LINK_INTO)) ++ ++CFLAGS += $(VM_PICFLAG) ++CFLAGS += -qnortti ++CFLAGS += -qnoeh ++ ++CFLAGS += -D_REENTRANT ++# no xlc counterpart for -fcheck-new ++# CFLAGS += -fcheck-new ++ ++ARCHFLAG = -q64 ++ ++CFLAGS += $(ARCHFLAG) ++AOUT_FLAGS += $(ARCHFLAG) ++LFLAGS += $(ARCHFLAG) ++ASFLAGS += $(ARCHFLAG) ++ ++# Use C++ Interpreter ++ifdef CC_INTERP ++ CFLAGS += -DCC_INTERP ++endif ++ ++# Keep temporary files (.ii, .s) ++# no counterpart on xlc for -save-temps, -pipe ++ ++# Compiler warnings are treated as errors ++# Do not treat warnings as errors ++# WARNINGS_ARE_ERRORS = -Werror ++# Except for a few acceptable ones ++# ACCEPTABLE_WARNINGS = -Wpointer-arith -Wconversion -Wsign-compare ++# CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(ACCEPTABLE_WARNINGS) ++CFLAGS_WARN/COMMON = ++CFLAGS_WARN/DEFAULT = $(CFLAGS_WARN/COMMON) $(EXTRA_WARNINGS) ++# Special cases ++CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) ++ ++# The flags to use for an optimized build ++OPT_CFLAGS += -O3 ++ ++# Hotspot uses very unstrict aliasing turn this optimization off ++OPT_CFLAGS += -qalias=noansi ++ ++OPT_CFLAGS/NOOPT=-qnoopt ++ ++DEPFLAGS = -qmakedep=gcc -MF $(DEP_DIR)/$(@:%=%.d) ++ ++#------------------------------------------------------------------------ ++# Linker flags ++ ++# statically link libstdc++.so, work with gcc but ignored by g++ ++STATIC_STDCXX = -Wl,-lC_r ++ ++# Enable linker optimization ++# no counterpart on xlc for this ++# LFLAGS += -Xlinker -O1 ++ ++# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file. ++# MAPFLAG = -Xlinker --version-script=FILENAME ++ ++# Build shared library ++SHARED_FLAG = -q64 -b64 -bexpall -G -bnoentry -qmkshrobj -brtl -bnolibpath ++ ++#------------------------------------------------------------------------ ++# Debug flags ++ ++# Always compile with '-g' to get symbols in the stacktraces in the hs_err file ++DEBUG_CFLAGS += -g ++FASTDEBUG_CFLAGS += -g ++OPT_CFLAGS += -g ++ ++# DEBUG_BINARIES overrides everything, use full -g debug information ++ifeq ($(DEBUG_BINARIES), true) ++ DEBUG_CFLAGS = -g ++ CFLAGS += $(DEBUG_CFLAGS) ++endif ++ ++# If we are building HEADLESS, pass on to VM ++# so it can set the java.awt.headless property ++ifdef HEADLESS ++CFLAGS += -DHEADLESS ++endif ++ ++# We are building Embedded for a small device ++# favor code space over speed ++ifdef MINIMIZE_RAM_USAGE ++CFLAGS += -DMINIMIZE_RAM_USAGE ++endif ++ ++ifdef CROSS_COMPILE_ARCH ++ STRIP = $(ALT_COMPILER_PATH)/strip ++else ++ STRIP = strip ++endif +--- ./hotspot/make/aix/platform_ppc64 Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/aix/platform_ppc64 Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,17 @@ ++os_family = aix ++ ++arch = ppc ++ ++arch_model = ppc_64 ++ ++os_arch = aix_ppc ++ ++os_arch_model = aix_ppc_64 ++ ++lib_arch = ppc64 ++ ++compiler = xlc ++ ++gnu_dis_arch = ppc64 ++ ++sysdefs = -DAIX -DPPC64 +--- ./hotspot/make/bsd/makefiles/mapfile-vers-debug Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-debug Wed Jul 30 03:51:43 2014 -0700 +@@ -161,6 +161,7 @@ + _JVM_GetStackTraceElement + _JVM_GetSystemPackage + _JVM_GetSystemPackages ++ _JVM_GetTemporaryDirectory + _JVM_GetThreadStateNames + _JVM_GetThreadStateValues + _JVM_GetVersionInfo +--- ./hotspot/make/bsd/makefiles/mapfile-vers-product Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-product Wed Jul 30 03:51:43 2014 -0700 +@@ -161,6 +161,7 @@ + _JVM_GetStackTraceElement + _JVM_GetSystemPackage + _JVM_GetSystemPackages ++ _JVM_GetTemporaryDirectory + _JVM_GetThreadStateNames + _JVM_GetThreadStateValues + _JVM_GetVersionInfo +--- ./hotspot/make/bsd/makefiles/universal.gmk Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/universal.gmk Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -74,19 +74,21 @@ + + + # Replace arch specific binaries with universal binaries ++# Do not touch jre/lib/{client,server}/libjsig.$(LIBRARY_SUFFIX) ++# That symbolic link belongs to the 'jdk' build. + export_universal: + $(RM) -r $(EXPORT_PATH)/jre/lib/{i386,amd64} + $(RM) -r $(JDK_IMAGE_DIR)/jre/lib/{i386,amd64} +- $(RM) $(JDK_IMAGE_DIR)/jre/lib/{client,server}/libjsig.$(LIBRARY_SUFFIX) + ($(CD) $(EXPORT_PATH) && \ + $(TAR) -cf - *) | \ + ($(CD) $(JDK_IMAGE_DIR) && $(TAR) -xpf -) + + + # Overlay universal binaries ++# Do not touch jre/lib/{client,server}/libjsig.$(LIBRARY_SUFFIX) ++# That symbolic link belongs to the 'jdk' build. + copy_universal: + $(RM) -r $(JDK_IMAGE_DIR)$(COPY_SUBDIR)/jre/lib/{i386,amd64} +- $(RM) $(JDK_IMAGE_DIR)$(COPY_SUBDIR)/jre/lib/{client,server}/libjsig.$(LIBRARY_SUFFIX) + ($(CD) $(EXPORT_PATH)$(COPY_SUBDIR) && \ + $(TAR) -cf - *) | \ + ($(CD) $(JDK_IMAGE_DIR)$(COPY_SUBDIR) && $(TAR) -xpf -) +--- ./hotspot/make/defs.make Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/defs.make Wed Jul 30 03:51:43 2014 -0700 +@@ -176,11 +176,15 @@ + HOST := $(shell uname -n) + endif + +-# If not SunOS, not Linux and not BSD, assume Windows ++# If not SunOS, not Linux not BSD and not AIX, assume Windows + ifneq ($(OS), Linux) + ifneq ($(OS), SunOS) + ifneq ($(OS), bsd) +- OSNAME=windows ++ ifneq ($(OS), AIX) ++ OSNAME=windows ++ else ++ OSNAME=aix ++ endif + else + OSNAME=bsd + endif +@@ -269,7 +273,7 @@ + + # Use uname output for SRCARCH, but deal with platform differences. If ARCH + # is not explicitly listed below, it is treated as x86. +- SRCARCH = $(ARCH/$(filter sparc sparc64 ia64 amd64 x86_64 arm ppc zero,$(ARCH))) ++ SRCARCH = $(ARCH/$(filter sparc sparc64 ia64 amd64 x86_64 arm ppc ppc64 zero,$(ARCH))) + ARCH/ = x86 + ARCH/sparc = sparc + ARCH/sparc64= sparc +@@ -295,6 +299,11 @@ + BUILDARCH = sparcv9 + endif + endif ++ ifeq ($(BUILDARCH), ppc) ++ ifdef LP64 ++ BUILDARCH = ppc64 ++ endif ++ endif + + # LIBARCH is 1:1 mapping from BUILDARCH + LIBARCH = $(LIBARCH/$(BUILDARCH)) +@@ -303,12 +312,12 @@ + LIBARCH/sparc = sparc + LIBARCH/sparcv9 = sparcv9 + LIBARCH/ia64 = ia64 +- LIBARCH/ppc64 = ppc ++ LIBARCH/ppc64 = ppc64 + LIBARCH/ppc = ppc + LIBARCH/arm = arm + LIBARCH/zero = $(ZERO_LIBARCH) + +- LP64_ARCH = sparcv9 amd64 ia64 zero ++ LP64_ARCH = sparcv9 amd64 ia64 ppc64 zero + endif + + # Required make macro settings for all platforms +--- ./hotspot/make/excludeSrc.make Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/excludeSrc.make Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++# 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 +@@ -86,10 +86,11 @@ + concurrentMark.cpp concurrentMarkThread.cpp dirtyCardQueue.cpp g1AllocRegion.cpp \ + g1BlockOffsetTable.cpp g1CardCounts.cpp g1CollectedHeap.cpp g1CollectorPolicy.cpp \ + g1ErgoVerbose.cpp g1GCPhaseTimes.cpp g1HRPrinter.cpp g1HotCardCache.cpp g1Log.cpp \ +- g1MMUTracker.cpp g1MarkSweep.cpp g1MemoryPool.cpp g1MonitoringSupport.cpp \ +- g1RemSet.cpp g1RemSetSummary.cpp g1SATBCardTableModRefBS.cpp g1_globals.cpp heapRegion.cpp \ ++ g1MMUTracker.cpp g1MarkSweep.cpp g1MemoryPool.cpp g1MonitoringSupport.cpp g1OopClosures.cpp \ ++ g1RemSet.cpp g1RemSetSummary.cpp g1SATBCardTableModRefBS.cpp g1StringDedup.cpp g1StringDedupStat.cpp \ ++ g1StringDedupTable.cpp g1StringDedupThread.cpp g1StringDedupQueue.cpp g1_globals.cpp heapRegion.cpp \ + g1BiasedArray.cpp heapRegionRemSet.cpp heapRegionSeq.cpp heapRegionSet.cpp heapRegionSets.cpp \ +- ptrQueue.cpp satbQueue.cpp sparsePRT.cpp survRateGroup.cpp vm_operations_g1.cpp \ ++ ptrQueue.cpp satbQueue.cpp sparsePRT.cpp survRateGroup.cpp vm_operations_g1.cpp g1CodeCacheRemSet.cpp \ + adjoiningGenerations.cpp adjoiningVirtualSpaces.cpp asPSOldGen.cpp asPSYoungGen.cpp \ + cardTableExtension.cpp gcTaskManager.cpp gcTaskThread.cpp objectStartArray.cpp \ + parallelScavengeHeap.cpp parMarkBitMap.cpp pcTasks.cpp psAdaptiveSizePolicy.cpp \ +--- ./hotspot/make/hotspot_version Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/hotspot_version Wed Jul 30 03:51:43 2014 -0700 +@@ -34,8 +34,8 @@ + HOTSPOT_VM_COPYRIGHT=Copyright 2014 + + HS_MAJOR_VER=25 +-HS_MINOR_VER=11 +-HS_BUILD_NUMBER=03 ++HS_MINOR_VER=20 ++HS_BUILD_NUMBER=23 + + JDK_MAJOR_VER=1 + JDK_MINOR_VER=8 +--- ./hotspot/make/jprt.properties Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/jprt.properties Wed Jul 30 03:51:43 2014 -0700 +@@ -33,7 +33,7 @@ + + # This tells jprt what default release we want to build + +-jprt.hotspot.default.release=jdk8 ++jprt.hotspot.default.release=jdk8u20 + + jprt.tools.default.release=${jprt.submit.option.release?${jprt.submit.option.release}:${jprt.hotspot.default.release}} + +@@ -47,70 +47,65 @@ + # sparc etc. + + # Define the Solaris platforms we want for the various releases +-jprt.my.solaris.sparcv9.jdk8=solaris_sparcv9_5.10 ++jprt.my.solaris.sparcv9.jdk8u20=solaris_sparcv9_5.10 + jprt.my.solaris.sparcv9.jdk7=solaris_sparcv9_5.10 + jprt.my.solaris.sparcv9.jdk7u8=${jprt.my.solaris.sparcv9.jdk7} + jprt.my.solaris.sparcv9=${jprt.my.solaris.sparcv9.${jprt.tools.default.release}} + +-jprt.my.solaris.x64.jdk8=solaris_x64_5.10 ++jprt.my.solaris.x64.jdk8u20=solaris_x64_5.10 + jprt.my.solaris.x64.jdk7=solaris_x64_5.10 + jprt.my.solaris.x64.jdk7u8=${jprt.my.solaris.x64.jdk7} + jprt.my.solaris.x64=${jprt.my.solaris.x64.${jprt.tools.default.release}} + +-jprt.my.linux.i586.jdk8=linux_i586_2.6 ++jprt.my.linux.i586.jdk8u20=linux_i586_2.6 + jprt.my.linux.i586.jdk7=linux_i586_2.6 + jprt.my.linux.i586.jdk7u8=${jprt.my.linux.i586.jdk7} + jprt.my.linux.i586=${jprt.my.linux.i586.${jprt.tools.default.release}} + +-jprt.my.linux.x64.jdk8=linux_x64_2.6 ++jprt.my.linux.x64.jdk8u20=linux_x64_2.6 + jprt.my.linux.x64.jdk7=linux_x64_2.6 + jprt.my.linux.x64.jdk7u8=${jprt.my.linux.x64.jdk7} + jprt.my.linux.x64=${jprt.my.linux.x64.${jprt.tools.default.release}} + +-jprt.my.linux.ppc.jdk8=linux_ppc_2.6 ++jprt.my.linux.ppc.jdk8u20=linux_ppc_2.6 + jprt.my.linux.ppc.jdk7=linux_ppc_2.6 + jprt.my.linux.ppc.jdk7u8=${jprt.my.linux.ppc.jdk7} + jprt.my.linux.ppc=${jprt.my.linux.ppc.${jprt.tools.default.release}} + +-jprt.my.linux.ppcv2.jdk8=linux_ppcv2_2.6 ++jprt.my.linux.ppcv2.jdk8u20=linux_ppcv2_2.6 + jprt.my.linux.ppcv2.jdk7=linux_ppcv2_2.6 + jprt.my.linux.ppcv2.jdk7u8=${jprt.my.linux.ppcv2.jdk7} + jprt.my.linux.ppcv2=${jprt.my.linux.ppcv2.${jprt.tools.default.release}} + +-jprt.my.linux.ppcsflt.jdk8=linux_ppcsflt_2.6 +-jprt.my.linux.ppcsflt.jdk7=linux_ppcsflt_2.6 +-jprt.my.linux.ppcsflt.jdk7u8=${jprt.my.linux.ppcsflt.jdk7} +-jprt.my.linux.ppcsflt=${jprt.my.linux.ppcsflt.${jprt.tools.default.release}} +- +-jprt.my.linux.armvfpsflt.jdk8=linux_armvfpsflt_2.6 ++jprt.my.linux.armvfpsflt.jdk8u20=linux_armvfpsflt_2.6 + jprt.my.linux.armvfpsflt=${jprt.my.linux.armvfpsflt.${jprt.tools.default.release}} + +-jprt.my.linux.armvfphflt.jdk8=linux_armvfphflt_2.6 ++jprt.my.linux.armvfphflt.jdk8u20=linux_armvfphflt_2.6 + jprt.my.linux.armvfphflt=${jprt.my.linux.armvfphflt.${jprt.tools.default.release}} + + # The ARM GP vfp-sflt build is not currently supported +-#jprt.my.linux.armvs.jdk8=linux_armvs_2.6 ++#jprt.my.linux.armvs.jdk8u20=linux_armvs_2.6 + #jprt.my.linux.armvs=${jprt.my.linux.armvs.${jprt.tools.default.release}} + +-jprt.my.linux.armvh.jdk8=linux_armvh_2.6 ++jprt.my.linux.armvh.jdk8u20=linux_armvh_2.6 + jprt.my.linux.armvh=${jprt.my.linux.armvh.${jprt.tools.default.release}} + +-jprt.my.linux.armsflt.jdk8=linux_armsflt_2.6 ++jprt.my.linux.armsflt.jdk8u20=linux_armsflt_2.6 + jprt.my.linux.armsflt.jdk7=linux_armsflt_2.6 + jprt.my.linux.armsflt.jdk7u8=${jprt.my.linux.armsflt.jdk7} + jprt.my.linux.armsflt=${jprt.my.linux.armsflt.${jprt.tools.default.release}} + +-jprt.my.macosx.x64.jdk8=macosx_x64_10.7 ++jprt.my.macosx.x64.jdk8u20=macosx_x64_10.7 + jprt.my.macosx.x64.jdk7=macosx_x64_10.7 + jprt.my.macosx.x64.jdk7u8=${jprt.my.macosx.x64.jdk7} + jprt.my.macosx.x64=${jprt.my.macosx.x64.${jprt.tools.default.release}} + +-jprt.my.windows.i586.jdk8=windows_i586_6.1 ++jprt.my.windows.i586.jdk8u20=windows_i586_6.1 + jprt.my.windows.i586.jdk7=windows_i586_6.1 + jprt.my.windows.i586.jdk7u8=${jprt.my.windows.i586.jdk7} + jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}} + +-jprt.my.windows.x64.jdk8=windows_x64_6.1 ++jprt.my.windows.x64.jdk8u20=windows_x64_6.1 + jprt.my.windows.x64.jdk7=windows_x64_6.1 + jprt.my.windows.x64.jdk7u8=${jprt.my.windows.x64.jdk7} + jprt.my.windows.x64=${jprt.my.windows.x64.${jprt.tools.default.release}} +@@ -135,7 +130,6 @@ + ${jprt.my.linux.i586}-{productEmb|fastdebugEmb}, \ + ${jprt.my.linux.ppc}-{productEmb|fastdebugEmb}, \ + ${jprt.my.linux.ppcv2}-{productEmb|fastdebugEmb}, \ +- ${jprt.my.linux.ppcsflt}-{productEmb|fastdebugEmb}, \ + ${jprt.my.linux.armvfpsflt}-{productEmb|fastdebugEmb}, \ + ${jprt.my.linux.armvfphflt}-{productEmb|fastdebugEmb}, \ + ${jprt.my.linux.armsflt}-{productEmb|fastdebugEmb} +@@ -143,7 +137,7 @@ + jprt.build.targets.all=${jprt.build.targets.standard}, \ + ${jprt.build.targets.embedded}, ${jprt.build.targets.open} + +-jprt.build.targets.jdk8=${jprt.build.targets.all} ++jprt.build.targets.jdk8u20=${jprt.build.targets.all} + jprt.build.targets.jdk7=${jprt.build.targets.all} + jprt.build.targets.jdk7u8=${jprt.build.targets.all} + jprt.build.targets=${jprt.build.targets.${jprt.tools.default.release}} +@@ -349,7 +343,7 @@ + ${jprt.my.windows.i586.test.targets}, \ + ${jprt.my.windows.x64.test.targets} + +-jprt.test.targets.jdk8=${jprt.test.targets.standard} ++jprt.test.targets.jdk8u20=${jprt.test.targets.standard} + jprt.test.targets.jdk7=${jprt.test.targets.standard} + jprt.test.targets.jdk7u8=${jprt.test.targets.jdk7} + jprt.test.targets=${jprt.test.targets.${jprt.tools.default.release}} +@@ -399,7 +393,7 @@ + jprt.make.rule.test.targets.embedded = \ + ${jprt.make.rule.test.targets.standard.client} + +-jprt.make.rule.test.targets.jdk8=${jprt.make.rule.test.targets.standard} ++jprt.make.rule.test.targets.jdk8u20=${jprt.make.rule.test.targets.standard} + jprt.make.rule.test.targets.jdk7=${jprt.make.rule.test.targets.standard} + jprt.make.rule.test.targets.jdk7u8=${jprt.make.rule.test.targets.jdk7} + jprt.make.rule.test.targets=${jprt.make.rule.test.targets.${jprt.tools.default.release}} +--- ./hotspot/make/linux/Makefile Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/linux/Makefile Wed Jul 30 03:51:43 2014 -0700 +@@ -66,6 +66,10 @@ + FORCE_TIERED=1 + endif + endif ++# C1 is not ported on ppc64, so we cannot build a tiered VM: ++ifeq ($(ARCH),ppc64) ++ FORCE_TIERED=0 ++endif + + ifdef LP64 + ifeq ("$(filter $(LP64_ARCH),$(BUILDARCH))","") +--- ./hotspot/make/linux/makefiles/buildtree.make Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/linux/makefiles/buildtree.make Wed Jul 30 03:51:43 2014 -0700 +@@ -193,6 +193,7 @@ + DATA_MODE/sparc = 32 + DATA_MODE/sparcv9 = 64 + DATA_MODE/amd64 = 64 ++DATA_MODE/ppc64 = 64 + + DATA_MODE = $(DATA_MODE/$(BUILDARCH)) + +--- ./hotspot/make/linux/makefiles/defs.make Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/linux/makefiles/defs.make Wed Jul 30 03:51:43 2014 -0700 +@@ -33,6 +33,11 @@ + # ARCH can be set explicitly in spec.gmk + ifndef ARCH + ARCH := $(shell uname -m) ++ # Fold little endian PowerPC64 into big-endian (if ARCH is set in ++ # hotspot-spec.gmk, this will be done by the configure script). ++ ifeq ($(ARCH),ppc64le) ++ ARCH := ppc64 ++ endif + endif + + PATH_SEP ?= : +@@ -120,6 +125,15 @@ + HS_ARCH = ppc + endif + ++# PPC64 ++ifeq ($(ARCH), ppc64) ++ ARCH_DATA_MODEL = 64 ++ MAKE_ARGS += LP64=1 ++ PLATFORM = linux-ppc64 ++ VM_PLATFORM = linux_ppc64 ++ HS_ARCH = ppc ++endif ++ + # On 32 bit linux we build server and client, on 64 bit just server. + ifeq ($(JVM_VARIANTS),) + ifeq ($(ARCH_DATA_MODEL), 32) +@@ -255,7 +269,7 @@ + EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client + EXPORT_MINIMAL_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/minimal + +-ifeq ($(findstring true, $(JVM_VARIANT_SERVER) $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true) ++ifeq ($(findstring true, $(JVM_VARIANT_SERVER) $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK) $(JVM_VARIANT_CORE)), true) + EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt + EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.$(LIBRARY_SUFFIX) + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) +--- ./hotspot/make/linux/makefiles/gcc.make Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/linux/makefiles/gcc.make Wed Jul 30 03:51:43 2014 -0700 +@@ -181,6 +181,7 @@ + ifndef E500V2 + ARCHFLAG/ppc = -mcpu=powerpc + endif ++ARCHFLAG/ppc64 = -m64 + + CFLAGS += $(ARCHFLAG) + AOUT_FLAGS += $(ARCHFLAG) +@@ -346,6 +347,7 @@ + DEBUG_CFLAGS/amd64 = -g + DEBUG_CFLAGS/arm = -g + DEBUG_CFLAGS/ppc = -g ++ DEBUG_CFLAGS/ppc64 = -g + DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH)) + ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),) + ifeq ($(USE_CLANG), true) +@@ -361,6 +363,7 @@ + FASTDEBUG_CFLAGS/amd64 = -g + FASTDEBUG_CFLAGS/arm = -g + FASTDEBUG_CFLAGS/ppc = -g ++ FASTDEBUG_CFLAGS/ppc64 = -g + FASTDEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH)) + ifeq ($(FASTDEBUG_CFLAGS/$(BUILDARCH)),) + ifeq ($(USE_CLANG), true) +@@ -375,6 +378,7 @@ + OPT_CFLAGS/amd64 = -g + OPT_CFLAGS/arm = -g + OPT_CFLAGS/ppc = -g ++ OPT_CFLAGS/ppc64 = -g + OPT_CFLAGS += $(OPT_CFLAGS/$(BUILDARCH)) + ifeq ($(OPT_CFLAGS/$(BUILDARCH)),) + ifeq ($(USE_CLANG), true) +--- ./hotspot/make/linux/makefiles/mapfile-vers-debug Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/linux/makefiles/mapfile-vers-debug Wed Jul 30 03:51:43 2014 -0700 +@@ -122,7 +122,7 @@ + JVM_GetClassModifiers; + JVM_GetClassName; + JVM_GetClassNameUTF; +- JVM_GetClassSignature; ++ JVM_GetClassSignature; + JVM_GetClassSigners; + JVM_GetClassTypeAnnotations; + JVM_GetComponentType; +@@ -163,6 +163,7 @@ + JVM_GetStackTraceElement; + JVM_GetSystemPackage; + JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; + JVM_GetThreadStateNames; + JVM_GetThreadStateValues; + JVM_GetVersionInfo; +--- ./hotspot/make/linux/makefiles/mapfile-vers-product Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/linux/makefiles/mapfile-vers-product Wed Jul 30 03:51:43 2014 -0700 +@@ -163,6 +163,7 @@ + JVM_GetStackTraceElement; + JVM_GetSystemPackage; + JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; + JVM_GetThreadStateNames; + JVM_GetThreadStateValues; + JVM_GetVersionInfo; +--- ./hotspot/make/linux/makefiles/ppc64.make Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/linux/makefiles/ppc64.make Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,51 @@ ++# ++# Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright 2012, 2013 SAP AG. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# 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. ++# ++# ++ ++# make c code know it is on a 64 bit platform. ++CFLAGS += -D_LP64=1 ++ ++ifeq ($(origin OPENJDK_TARGET_CPU_ENDIAN),undefined) ++ # This can happen during hotspot standalone build. Set endianness from ++ # uname. We assume build and target machines are the same. ++ OPENJDK_TARGET_CPU_ENDIAN:=$(if $(filter ppc64le,$(shell uname -m)),little,big) ++endif ++ ++ifeq ($(filter $(OPENJDK_TARGET_CPU_ENDIAN),big little),) ++ $(error OPENJDK_TARGET_CPU_ENDIAN value should be 'big' or 'little') ++endif ++ ++ifeq ($(OPENJDK_TARGET_CPU_ENDIAN),big) ++ # fixes `relocation truncated to fit' error for gcc 4.1. ++ CFLAGS += -mminimal-toc ++ ++ # finds use ppc64 instructions, but schedule for power5 ++ CFLAGS += -mcpu=powerpc64 -mtune=power5 -minsert-sched-nops=regroup_exact -mno-multiple -mno-string ++else ++ # Little endian machine uses ELFv2 ABI. ++ CFLAGS += -DVM_LITTLE_ENDIAN -DABI_ELFv2 ++ ++ # Use Power8, this is the first CPU to support PPC64 LE with ELFv2 ABI. ++ CFLAGS += -mcpu=power7 -mtune=power8 -minsert-sched-nops=regroup_exact -mno-multiple -mno-string ++endif +--- ./hotspot/make/linux/makefiles/zeroshark.make Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/linux/makefiles/zeroshark.make Wed Jul 30 03:51:43 2014 -0700 +@@ -25,6 +25,9 @@ + + # Setup common to Zero (non-Shark) and Shark versions of VM + ++# override this from the main file because some version of llvm do not like -Wundef ++WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wunused-function -Wunused-value ++ + # The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized + OPT_CFLAGS/sharedRuntimeTrig.o = $(OPT_CFLAGS/NOOPT) + # The copied fdlibm routines in sharedRuntimeTrans.o must not be optimized +--- ./hotspot/make/linux/platform_ppc Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/linux/platform_ppc Wed Jul 30 03:51:43 2014 -0700 +@@ -2,11 +2,11 @@ + + arch = ppc + +-arch_model = ppc ++arch_model = ppc_32 + + os_arch = linux_ppc + +-os_arch_model = linux_ppc ++os_arch_model = linux_ppc_32 + + lib_arch = ppc + +@@ -14,4 +14,4 @@ + + gnu_dis_arch = ppc + +-sysdefs = -DLINUX -D_GNU_SOURCE -DPPC ++sysdefs = -DLINUX -D_GNU_SOURCE -DPPC32 +--- ./hotspot/make/linux/platform_ppc64 Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/linux/platform_ppc64 Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,17 @@ ++os_family = linux ++ ++arch = ppc ++ ++arch_model = ppc_64 ++ ++os_arch = linux_ppc ++ ++os_arch_model = linux_ppc_64 ++ ++lib_arch = ppc64 ++ ++compiler = gcc ++ ++gnu_dis_arch = ppc64 ++ ++sysdefs = -DLINUX -D_GNU_SOURCE -DPPC64 +--- ./hotspot/make/solaris/makefiles/mapfile-vers Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/solaris/makefiles/mapfile-vers Wed Jul 30 03:51:43 2014 -0700 +@@ -163,6 +163,7 @@ + JVM_GetStackTraceElement; + JVM_GetSystemPackage; + JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; + JVM_GetThreadStateNames; + JVM_GetThreadStateValues; + JVM_GetVersionInfo; +--- ./hotspot/make/windows/makefiles/defs.make Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/make/windows/makefiles/defs.make Wed Jul 30 03:51:43 2014 -0700 +@@ -260,7 +260,6 @@ + EXPORT_LIST += $(EXPORT_SERVER_DIR)/jvm.map + endif + endif +- EXPORT_LIST += $(EXPORT_LIB_DIR)/jvm.lib + endif + ifeq ($(JVM_VARIANT_CLIENT),true) + EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt +@@ -275,6 +274,8 @@ + endif + endif + ++EXPORT_LIST += $(EXPORT_LIB_DIR)/jvm.lib ++ + ifeq ($(BUILD_WIN_SA), 1) + EXPORT_LIST += $(EXPORT_JRE_BIN_DIR)/sawindbg.$(LIBRARY_SUFFIX) + ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) +--- ./hotspot/src/cpu/ppc/vm/assembler_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/assembler_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,700 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/assembler.inline.hpp" ++#include "gc_interface/collectedHeap.inline.hpp" ++#include "interpreter/interpreter.hpp" ++#include "memory/cardTableModRefBS.hpp" ++#include "memory/resourceArea.hpp" ++#include "prims/methodHandles.hpp" ++#include "runtime/biasedLocking.hpp" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/objectMonitor.hpp" ++#include "runtime/os.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "utilities/macros.hpp" ++#if INCLUDE_ALL_GCS ++#include "gc_implementation/g1/g1CollectedHeap.inline.hpp" ++#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" ++#include "gc_implementation/g1/heapRegion.hpp" ++#endif // INCLUDE_ALL_GCS ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) // nothing ++#else ++#define BLOCK_COMMENT(str) block_comment(str) ++#endif ++ ++int AbstractAssembler::code_fill_byte() { ++ return 0x00; // illegal instruction 0x00000000 ++} ++ ++void Assembler::print_instruction(int inst) { ++ Unimplemented(); ++} ++ ++// Patch instruction `inst' at offset `inst_pos' to refer to ++// `dest_pos' and return the resulting instruction. We should have ++// pcs, not offsets, but since all is relative, it will work out fine. ++int Assembler::patched_branch(int dest_pos, int inst, int inst_pos) { ++ int m = 0; // mask for displacement field ++ int v = 0; // new value for displacement field ++ ++ switch (inv_op_ppc(inst)) { ++ case b_op: m = li(-1); v = li(disp(dest_pos, inst_pos)); break; ++ case bc_op: m = bd(-1); v = bd(disp(dest_pos, inst_pos)); break; ++ default: ShouldNotReachHere(); ++ } ++ return inst & ~m | v; ++} ++ ++// Return the offset, relative to _code_begin, of the destination of ++// the branch inst at offset pos. ++int Assembler::branch_destination(int inst, int pos) { ++ int r = 0; ++ switch (inv_op_ppc(inst)) { ++ case b_op: r = bxx_destination_offset(inst, pos); break; ++ case bc_op: r = inv_bd_field(inst, pos); break; ++ default: ShouldNotReachHere(); ++ } ++ return r; ++} ++ ++// Low-level andi-one-instruction-macro. ++void Assembler::andi(Register a, Register s, const int ui16) { ++ assert(is_uimm(ui16, 16), "must be 16-bit unsigned immediate"); ++ if (is_power_of_2_long(((jlong) ui16)+1)) { ++ // pow2minus1 ++ clrldi(a, s, 64-log2_long((((jlong) ui16)+1))); ++ } else if (is_power_of_2_long((jlong) ui16)) { ++ // pow2 ++ rlwinm(a, s, 0, 31-log2_long((jlong) ui16), 31-log2_long((jlong) ui16)); ++ } else if (is_power_of_2_long((jlong)-ui16)) { ++ // negpow2 ++ clrrdi(a, s, log2_long((jlong)-ui16)); ++ } else { ++ andi_(a, s, ui16); ++ } ++} ++ ++// RegisterOrConstant version. ++void Assembler::ld(Register d, RegisterOrConstant roc, Register s1) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ int simm16_rest = load_const_optimized(d, roc.as_constant(), noreg, true); ++ Assembler::ld(d, simm16_rest, d); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::ld(d, roc.as_constant(), s1); ++ } else { ++ load_const_optimized(d, roc.as_constant()); ++ Assembler::ldx(d, d, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::ld(d, 0, roc.as_register()); ++ else ++ Assembler::ldx(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::lwa(Register d, RegisterOrConstant roc, Register s1) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ int simm16_rest = load_const_optimized(d, roc.as_constant(), noreg, true); ++ Assembler::lwa(d, simm16_rest, d); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::lwa(d, roc.as_constant(), s1); ++ } else { ++ load_const_optimized(d, roc.as_constant()); ++ Assembler::lwax(d, d, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::lwa(d, 0, roc.as_register()); ++ else ++ Assembler::lwax(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::lwz(Register d, RegisterOrConstant roc, Register s1) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ int simm16_rest = load_const_optimized(d, roc.as_constant(), noreg, true); ++ Assembler::lwz(d, simm16_rest, d); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::lwz(d, roc.as_constant(), s1); ++ } else { ++ load_const_optimized(d, roc.as_constant()); ++ Assembler::lwzx(d, d, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::lwz(d, 0, roc.as_register()); ++ else ++ Assembler::lwzx(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::lha(Register d, RegisterOrConstant roc, Register s1) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ int simm16_rest = load_const_optimized(d, roc.as_constant(), noreg, true); ++ Assembler::lha(d, simm16_rest, d); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::lha(d, roc.as_constant(), s1); ++ } else { ++ load_const_optimized(d, roc.as_constant()); ++ Assembler::lhax(d, d, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::lha(d, 0, roc.as_register()); ++ else ++ Assembler::lhax(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::lhz(Register d, RegisterOrConstant roc, Register s1) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ int simm16_rest = load_const_optimized(d, roc.as_constant(), noreg, true); ++ Assembler::lhz(d, simm16_rest, d); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::lhz(d, roc.as_constant(), s1); ++ } else { ++ load_const_optimized(d, roc.as_constant()); ++ Assembler::lhzx(d, d, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::lhz(d, 0, roc.as_register()); ++ else ++ Assembler::lhzx(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::lbz(Register d, RegisterOrConstant roc, Register s1) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ int simm16_rest = load_const_optimized(d, roc.as_constant(), noreg, true); ++ Assembler::lbz(d, simm16_rest, d); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::lbz(d, roc.as_constant(), s1); ++ } else { ++ load_const_optimized(d, roc.as_constant()); ++ Assembler::lbzx(d, d, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::lbz(d, 0, roc.as_register()); ++ else ++ Assembler::lbzx(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::std(Register d, RegisterOrConstant roc, Register s1, Register tmp) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ guarantee(tmp != noreg, "Need tmp reg to encode large constants"); ++ int simm16_rest = load_const_optimized(tmp, roc.as_constant(), noreg, true); ++ Assembler::std(d, simm16_rest, tmp); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::std(d, roc.as_constant(), s1); ++ } else { ++ guarantee(tmp != noreg, "Need tmp reg to encode large constants"); ++ load_const_optimized(tmp, roc.as_constant()); ++ Assembler::stdx(d, tmp, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::std(d, 0, roc.as_register()); ++ else ++ Assembler::stdx(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::stw(Register d, RegisterOrConstant roc, Register s1, Register tmp) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ guarantee(tmp != noreg, "Need tmp reg to encode large constants"); ++ int simm16_rest = load_const_optimized(tmp, roc.as_constant(), noreg, true); ++ Assembler::stw(d, simm16_rest, tmp); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::stw(d, roc.as_constant(), s1); ++ } else { ++ guarantee(tmp != noreg, "Need tmp reg to encode large constants"); ++ load_const_optimized(tmp, roc.as_constant()); ++ Assembler::stwx(d, tmp, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::stw(d, 0, roc.as_register()); ++ else ++ Assembler::stwx(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::sth(Register d, RegisterOrConstant roc, Register s1, Register tmp) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ guarantee(tmp != noreg, "Need tmp reg to encode large constants"); ++ int simm16_rest = load_const_optimized(tmp, roc.as_constant(), noreg, true); ++ Assembler::sth(d, simm16_rest, tmp); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::sth(d, roc.as_constant(), s1); ++ } else { ++ guarantee(tmp != noreg, "Need tmp reg to encode large constants"); ++ load_const_optimized(tmp, roc.as_constant()); ++ Assembler::sthx(d, tmp, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::sth(d, 0, roc.as_register()); ++ else ++ Assembler::sthx(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::stb(Register d, RegisterOrConstant roc, Register s1, Register tmp) { ++ if (roc.is_constant()) { ++ if (s1 == noreg) { ++ guarantee(tmp != noreg, "Need tmp reg to encode large constants"); ++ int simm16_rest = load_const_optimized(tmp, roc.as_constant(), noreg, true); ++ Assembler::stb(d, simm16_rest, tmp); ++ } else if (is_simm(roc.as_constant(), 16)) { ++ Assembler::stb(d, roc.as_constant(), s1); ++ } else { ++ guarantee(tmp != noreg, "Need tmp reg to encode large constants"); ++ load_const_optimized(tmp, roc.as_constant()); ++ Assembler::stbx(d, tmp, s1); ++ } ++ } else { ++ if (s1 == noreg) ++ Assembler::stb(d, 0, roc.as_register()); ++ else ++ Assembler::stbx(d, roc.as_register(), s1); ++ } ++} ++ ++void Assembler::add(Register d, RegisterOrConstant roc, Register s1) { ++ if (roc.is_constant()) { ++ intptr_t c = roc.as_constant(); ++ assert(is_simm(c, 16), "too big"); ++ addi(d, s1, (int)c); ++ } ++ else add(d, roc.as_register(), s1); ++} ++ ++void Assembler::subf(Register d, RegisterOrConstant roc, Register s1) { ++ if (roc.is_constant()) { ++ intptr_t c = roc.as_constant(); ++ assert(is_simm(-c, 16), "too big"); ++ addi(d, s1, (int)-c); ++ } ++ else subf(d, roc.as_register(), s1); ++} ++ ++void Assembler::cmpd(ConditionRegister d, RegisterOrConstant roc, Register s1) { ++ if (roc.is_constant()) { ++ intptr_t c = roc.as_constant(); ++ assert(is_simm(c, 16), "too big"); ++ cmpdi(d, s1, (int)c); ++ } ++ else cmpd(d, roc.as_register(), s1); ++} ++ ++// Load a 64 bit constant. Patchable. ++void Assembler::load_const(Register d, long x, Register tmp) { ++ // 64-bit value: x = xa xb xc xd ++ int xa = (x >> 48) & 0xffff; ++ int xb = (x >> 32) & 0xffff; ++ int xc = (x >> 16) & 0xffff; ++ int xd = (x >> 0) & 0xffff; ++ if (tmp == noreg) { ++ Assembler::lis( d, (int)(short)xa); ++ Assembler::ori( d, d, (unsigned int)xb); ++ Assembler::sldi(d, d, 32); ++ Assembler::oris(d, d, (unsigned int)xc); ++ Assembler::ori( d, d, (unsigned int)xd); ++ } else { ++ // exploit instruction level parallelism if we have a tmp register ++ assert_different_registers(d, tmp); ++ Assembler::lis(tmp, (int)(short)xa); ++ Assembler::lis(d, (int)(short)xc); ++ Assembler::ori(tmp, tmp, (unsigned int)xb); ++ Assembler::ori(d, d, (unsigned int)xd); ++ Assembler::insrdi(d, tmp, 32, 0); ++ } ++} ++ ++// Load a 64 bit constant, optimized, not identifyable. ++// Tmp can be used to increase ILP. Set return_simm16_rest=true to get a ++// 16 bit immediate offset. ++int Assembler::load_const_optimized(Register d, long x, Register tmp, bool return_simm16_rest) { ++ // Avoid accidentally trying to use R0 for indexed addressing. ++ assert(d != R0, "R0 not allowed"); ++ assert_different_registers(d, tmp); ++ ++ short xa, xb, xc, xd; // Four 16-bit chunks of const. ++ long rem = x; // Remaining part of const. ++ ++ xd = rem & 0xFFFF; // Lowest 16-bit chunk. ++ rem = (rem >> 16) + ((unsigned short)xd >> 15); // Compensation for sign extend. ++ ++ if (rem == 0) { // opt 1: simm16 ++ li(d, xd); ++ return 0; ++ } ++ ++ xc = rem & 0xFFFF; // Next 16-bit chunk. ++ rem = (rem >> 16) + ((unsigned short)xc >> 15); // Compensation for sign extend. ++ ++ if (rem == 0) { // opt 2: simm32 ++ lis(d, xc); ++ } else { // High 32 bits needed. ++ ++ if (tmp != noreg) { // opt 3: We have a temp reg. ++ // No carry propagation between xc and higher chunks here (use logical instructions). ++ xa = (x >> 48) & 0xffff; ++ xb = (x >> 32) & 0xffff; // No sign compensation, we use lis+ori or li to allow usage of R0. ++ bool load_xa = (xa != 0) || (xb < 0); ++ bool return_xd = false; ++ ++ if (load_xa) { lis(tmp, xa); } ++ if (xc) { lis(d, xc); } ++ if (load_xa) { ++ if (xb) { ori(tmp, tmp, (unsigned short)xb); } // No addi, we support tmp == R0. ++ } else { ++ li(tmp, xb); // non-negative ++ } ++ if (xc) { ++ if (return_simm16_rest && xd >= 0) { return_xd = true; } // >= 0 to avoid carry propagation after insrdi/rldimi. ++ else if (xd) { addi(d, d, xd); } ++ } else { ++ li(d, xd); ++ } ++ insrdi(d, tmp, 32, 0); ++ return return_xd ? xd : 0; // non-negative ++ } ++ ++ xb = rem & 0xFFFF; // Next 16-bit chunk. ++ rem = (rem >> 16) + ((unsigned short)xb >> 15); // Compensation for sign extend. ++ ++ xa = rem & 0xFFFF; // Highest 16-bit chunk. ++ ++ // opt 4: avoid adding 0 ++ if (xa) { // Highest 16-bit needed? ++ lis(d, xa); ++ if (xb) { addi(d, d, xb); } ++ } else { ++ li(d, xb); ++ } ++ sldi(d, d, 32); ++ if (xc) { addis(d, d, xc); } ++ } ++ ++ // opt 5: Return offset to be inserted into following instruction. ++ if (return_simm16_rest) return xd; ++ ++ if (xd) { addi(d, d, xd); } ++ return 0; ++} ++ ++#ifndef PRODUCT ++// Test of ppc assembler. ++void Assembler::test_asm() { ++ // PPC 1, section 3.3.8, Fixed-Point Arithmetic Instructions ++ addi( R0, R1, 10); ++ addis( R5, R2, 11); ++ addic_( R3, R31, 42); ++ subfic( R21, R12, 2112); ++ add( R3, R2, R1); ++ add_( R11, R22, R30); ++ subf( R7, R6, R5); ++ subf_( R8, R9, R4); ++ addc( R11, R12, R13); ++ addc_( R14, R14, R14); ++ subfc( R15, R16, R17); ++ subfc_( R18, R20, R19); ++ adde( R20, R22, R24); ++ adde_( R29, R27, R26); ++ subfe( R28, R1, R0); ++ subfe_( R21, R11, R29); ++ neg( R21, R22); ++ neg_( R13, R23); ++ mulli( R0, R11, -31); ++ mulld( R1, R18, R21); ++ mulld_( R2, R17, R22); ++ mullw( R3, R16, R23); ++ mullw_( R4, R15, R24); ++ divd( R5, R14, R25); ++ divd_( R6, R13, R26); ++ divw( R7, R12, R27); ++ divw_( R8, R11, R28); ++ ++ li( R3, -4711); ++ ++ // PPC 1, section 3.3.9, Fixed-Point Compare Instructions ++ cmpi( CCR7, 0, R27, 4711); ++ cmp( CCR0, 1, R14, R11); ++ cmpli( CCR5, 1, R17, 45); ++ cmpl( CCR3, 0, R9, R10); ++ ++ cmpwi( CCR7, R27, 4711); ++ cmpw( CCR0, R14, R11); ++ cmplwi( CCR5, R17, 45); ++ cmplw( CCR3, R9, R10); ++ ++ cmpdi( CCR7, R27, 4711); ++ cmpd( CCR0, R14, R11); ++ cmpldi( CCR5, R17, 45); ++ cmpld( CCR3, R9, R10); ++ ++ // PPC 1, section 3.3.11, Fixed-Point Logical Instructions ++ andi_( R4, R5, 0xff); ++ andis_( R12, R13, 0x7b51); ++ ori( R1, R4, 13); ++ oris( R3, R5, 177); ++ xori( R7, R6, 51); ++ xoris( R29, R0, 1); ++ andr( R17, R21, R16); ++ and_( R3, R5, R15); ++ orr( R2, R1, R9); ++ or_( R17, R15, R11); ++ xorr( R19, R18, R10); ++ xor_( R31, R21, R11); ++ nand( R5, R7, R3); ++ nand_( R3, R1, R0); ++ nor( R2, R3, R5); ++ nor_( R3, R6, R8); ++ andc( R25, R12, R11); ++ andc_( R24, R22, R21); ++ orc( R20, R10, R12); ++ orc_( R22, R2, R13); ++ ++ nop(); ++ ++ // PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions ++ sld( R5, R6, R8); ++ sld_( R3, R5, R9); ++ slw( R2, R1, R10); ++ slw_( R6, R26, R16); ++ srd( R16, R24, R8); ++ srd_( R21, R14, R7); ++ srw( R22, R25, R29); ++ srw_( R5, R18, R17); ++ srad( R7, R11, R0); ++ srad_( R9, R13, R1); ++ sraw( R7, R15, R2); ++ sraw_( R4, R17, R3); ++ sldi( R3, R18, 63); ++ sldi_( R2, R20, 30); ++ slwi( R1, R21, 30); ++ slwi_( R7, R23, 8); ++ srdi( R0, R19, 2); ++ srdi_( R12, R24, 5); ++ srwi( R13, R27, 6); ++ srwi_( R14, R29, 7); ++ sradi( R15, R30, 9); ++ sradi_( R16, R31, 19); ++ srawi( R17, R31, 15); ++ srawi_( R18, R31, 12); ++ ++ clrrdi( R3, R30, 5); ++ clrldi( R9, R10, 11); ++ ++ rldicr( R19, R20, 13, 15); ++ rldicr_(R20, R20, 16, 14); ++ rldicl( R21, R21, 30, 33); ++ rldicl_(R22, R1, 20, 25); ++ rlwinm( R23, R2, 25, 10, 11); ++ rlwinm_(R24, R3, 12, 13, 14); ++ ++ // PPC 1, section 3.3.2 Fixed-Point Load Instructions ++ lwzx( R3, R5, R7); ++ lwz( R11, 0, R1); ++ lwzu( R31, -4, R11); ++ ++ lwax( R3, R5, R7); ++ lwa( R31, -4, R11); ++ lhzx( R3, R5, R7); ++ lhz( R31, -4, R11); ++ lhzu( R31, -4, R11); ++ ++ ++ lhax( R3, R5, R7); ++ lha( R31, -4, R11); ++ lhau( R11, 0, R1); ++ ++ lbzx( R3, R5, R7); ++ lbz( R31, -4, R11); ++ lbzu( R11, 0, R1); ++ ++ ld( R31, -4, R11); ++ ldx( R3, R5, R7); ++ ldu( R31, -4, R11); ++ ++ // PPC 1, section 3.3.3 Fixed-Point Store Instructions ++ stwx( R3, R5, R7); ++ stw( R31, -4, R11); ++ stwu( R11, 0, R1); ++ ++ sthx( R3, R5, R7 ); ++ sth( R31, -4, R11); ++ sthu( R31, -4, R11); ++ ++ stbx( R3, R5, R7); ++ stb( R31, -4, R11); ++ stbu( R31, -4, R11); ++ ++ std( R31, -4, R11); ++ stdx( R3, R5, R7); ++ stdu( R31, -4, R11); ++ ++ // PPC 1, section 3.3.13 Move To/From System Register Instructions ++ mtlr( R3); ++ mflr( R3); ++ mtctr( R3); ++ mfctr( R3); ++ mtcrf( 0xff, R15); ++ mtcr( R15); ++ mtcrf( 0x03, R15); ++ mtcr( R15); ++ mfcr( R15); ++ ++ // PPC 1, section 2.4.1 Branch Instructions ++ Label lbl1, lbl2, lbl3; ++ bind(lbl1); ++ ++ b(pc()); ++ b(pc() - 8); ++ b(lbl1); ++ b(lbl2); ++ b(lbl3); ++ ++ bl(pc() - 8); ++ bl(lbl1); ++ bl(lbl2); ++ ++ bcl(4, 10, pc() - 8); ++ bcl(4, 10, lbl1); ++ bcl(4, 10, lbl2); ++ ++ bclr( 4, 6, 0); ++ bclrl(4, 6, 0); ++ ++ bind(lbl2); ++ ++ bcctr( 4, 6, 0); ++ bcctrl(4, 6, 0); ++ ++ blt(CCR0, lbl2); ++ bgt(CCR1, lbl2); ++ beq(CCR2, lbl2); ++ bso(CCR3, lbl2); ++ bge(CCR4, lbl2); ++ ble(CCR5, lbl2); ++ bne(CCR6, lbl2); ++ bns(CCR7, lbl2); ++ ++ bltl(CCR0, lbl2); ++ bgtl(CCR1, lbl2); ++ beql(CCR2, lbl2); ++ bsol(CCR3, lbl2); ++ bgel(CCR4, lbl2); ++ blel(CCR5, lbl2); ++ bnel(CCR6, lbl2); ++ bnsl(CCR7, lbl2); ++ blr(); ++ ++ sync(); ++ icbi( R1, R2); ++ dcbst(R2, R3); ++ ++ // FLOATING POINT instructions ppc. ++ // PPC 1, section 4.6.2 Floating-Point Load Instructions ++ lfs( F1, -11, R3); ++ lfsu(F2, 123, R4); ++ lfsx(F3, R5, R6); ++ lfd( F4, 456, R7); ++ lfdu(F5, 789, R8); ++ lfdx(F6, R10, R11); ++ ++ // PPC 1, section 4.6.3 Floating-Point Store Instructions ++ stfs( F7, 876, R12); ++ stfsu( F8, 543, R13); ++ stfsx( F9, R14, R15); ++ stfd( F10, 210, R16); ++ stfdu( F11, 111, R17); ++ stfdx( F12, R18, R19); ++ ++ // PPC 1, section 4.6.4 Floating-Point Move Instructions ++ fmr( F13, F14); ++ fmr_( F14, F15); ++ fneg( F16, F17); ++ fneg_( F18, F19); ++ fabs( F20, F21); ++ fabs_( F22, F23); ++ fnabs( F24, F25); ++ fnabs_(F26, F27); ++ ++ // PPC 1, section 4.6.5.1 Floating-Point Elementary Arithmetic ++ // Instructions ++ fadd( F28, F29, F30); ++ fadd_( F31, F0, F1); ++ fadds( F2, F3, F4); ++ fadds_(F5, F6, F7); ++ fsub( F8, F9, F10); ++ fsub_( F11, F12, F13); ++ fsubs( F14, F15, F16); ++ fsubs_(F17, F18, F19); ++ fmul( F20, F21, F22); ++ fmul_( F23, F24, F25); ++ fmuls( F26, F27, F28); ++ fmuls_(F29, F30, F31); ++ fdiv( F0, F1, F2); ++ fdiv_( F3, F4, F5); ++ fdivs( F6, F7, F8); ++ fdivs_(F9, F10, F11); ++ ++ // PPC 1, section 4.6.6 Floating-Point Rounding and Conversion ++ // Instructions ++ frsp( F12, F13); ++ fctid( F14, F15); ++ fctidz(F16, F17); ++ fctiw( F18, F19); ++ fctiwz(F20, F21); ++ fcfid( F22, F23); ++ ++ // PPC 1, section 4.6.7 Floating-Point Compare Instructions ++ fcmpu( CCR7, F24, F25); ++ ++ tty->print_cr("\ntest_asm disassembly (0x%lx 0x%lx):", code()->insts_begin(), code()->insts_end()); ++ code()->decode(); ++} ++ ++#endif // !PRODUCT +--- ./hotspot/src/cpu/ppc/vm/assembler_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/assembler_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,1976 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_ASSEMBLER_PPC_HPP ++#define CPU_PPC_VM_ASSEMBLER_PPC_HPP ++ ++#include "asm/register.hpp" ++ ++// Address is an abstraction used to represent a memory location ++// as used in assembler instructions. ++// PPC instructions grok either baseReg + indexReg or baseReg + disp. ++// So far we do not use this as simplification by this class is low ++// on PPC with its simple addressing mode. Use RegisterOrConstant to ++// represent an offset. ++class Address VALUE_OBJ_CLASS_SPEC { ++}; ++ ++class AddressLiteral VALUE_OBJ_CLASS_SPEC { ++ private: ++ address _address; ++ RelocationHolder _rspec; ++ ++ RelocationHolder rspec_from_rtype(relocInfo::relocType rtype, address addr) { ++ switch (rtype) { ++ case relocInfo::external_word_type: ++ return external_word_Relocation::spec(addr); ++ case relocInfo::internal_word_type: ++ return internal_word_Relocation::spec(addr); ++ case relocInfo::opt_virtual_call_type: ++ return opt_virtual_call_Relocation::spec(); ++ case relocInfo::static_call_type: ++ return static_call_Relocation::spec(); ++ case relocInfo::runtime_call_type: ++ return runtime_call_Relocation::spec(); ++ case relocInfo::none: ++ return RelocationHolder(); ++ default: ++ ShouldNotReachHere(); ++ return RelocationHolder(); ++ } ++ } ++ ++ protected: ++ // creation ++ AddressLiteral() : _address(NULL), _rspec(NULL) {} ++ ++ public: ++ AddressLiteral(address addr, RelocationHolder const& rspec) ++ : _address(addr), ++ _rspec(rspec) {} ++ ++ AddressLiteral(address addr, relocInfo::relocType rtype = relocInfo::none) ++ : _address((address) addr), ++ _rspec(rspec_from_rtype(rtype, (address) addr)) {} ++ ++ AddressLiteral(oop* addr, relocInfo::relocType rtype = relocInfo::none) ++ : _address((address) addr), ++ _rspec(rspec_from_rtype(rtype, (address) addr)) {} ++ ++ intptr_t value() const { return (intptr_t) _address; } ++ ++ const RelocationHolder& rspec() const { return _rspec; } ++}; ++ ++// Argument is an abstraction used to represent an outgoing ++// actual argument or an incoming formal parameter, whether ++// it resides in memory or in a register, in a manner consistent ++// with the PPC Application Binary Interface, or ABI. This is ++// often referred to as the native or C calling convention. ++ ++class Argument VALUE_OBJ_CLASS_SPEC { ++ private: ++ int _number; // The number of the argument. ++ public: ++ enum { ++ // Only 8 registers may contain integer parameters. ++ n_register_parameters = 8, ++ // Can have up to 8 floating registers. ++ n_float_register_parameters = 8, ++ ++ // PPC C calling conventions. ++ // The first eight arguments are passed in int regs if they are int. ++ n_int_register_parameters_c = 8, ++ // The first thirteen float arguments are passed in float regs. ++ n_float_register_parameters_c = 13, ++ // Only the first 8 parameters are not placed on the stack. Aix disassembly ++ // shows that xlC places all float args after argument 8 on the stack AND ++ // in a register. This is not documented, but we follow this convention, too. ++ n_regs_not_on_stack_c = 8, ++ }; ++ // creation ++ Argument(int number) : _number(number) {} ++ ++ int number() const { return _number; } ++ ++ // Locating register-based arguments: ++ bool is_register() const { return _number < n_register_parameters; } ++ ++ Register as_register() const { ++ assert(is_register(), "must be a register argument"); ++ return as_Register(number() + R3_ARG1->encoding()); ++ } ++}; ++ ++#if !defined(ABI_ELFv2) ++// A ppc64 function descriptor. ++struct FunctionDescriptor VALUE_OBJ_CLASS_SPEC { ++ private: ++ address _entry; ++ address _toc; ++ address _env; ++ ++ public: ++ inline address entry() const { return _entry; } ++ inline address toc() const { return _toc; } ++ inline address env() const { return _env; } ++ ++ inline void set_entry(address entry) { _entry = entry; } ++ inline void set_toc( address toc) { _toc = toc; } ++ inline void set_env( address env) { _env = env; } ++ ++ inline static ByteSize entry_offset() { return byte_offset_of(FunctionDescriptor, _entry); } ++ inline static ByteSize toc_offset() { return byte_offset_of(FunctionDescriptor, _toc); } ++ inline static ByteSize env_offset() { return byte_offset_of(FunctionDescriptor, _env); } ++ ++ // Friend functions can be called without loading toc and env. ++ enum { ++ friend_toc = 0xcafe, ++ friend_env = 0xc0de ++ }; ++ ++ inline bool is_friend_function() const { ++ return (toc() == (address) friend_toc) && (env() == (address) friend_env); ++ } ++ ++ // Constructor for stack-allocated instances. ++ FunctionDescriptor() { ++ _entry = (address) 0xbad; ++ _toc = (address) 0xbad; ++ _env = (address) 0xbad; ++ } ++}; ++#endif ++ ++class Assembler : public AbstractAssembler { ++ protected: ++ // Displacement routines ++ static void print_instruction(int inst); ++ static int patched_branch(int dest_pos, int inst, int inst_pos); ++ static int branch_destination(int inst, int pos); ++ ++ friend class AbstractAssembler; ++ ++ // Code patchers need various routines like inv_wdisp() ++ friend class NativeInstruction; ++ friend class NativeGeneralJump; ++ friend class Relocation; ++ ++ public: ++ ++ enum shifts { ++ XO_21_29_SHIFT = 2, ++ XO_21_30_SHIFT = 1, ++ XO_27_29_SHIFT = 2, ++ XO_30_31_SHIFT = 0, ++ SPR_5_9_SHIFT = 11u, // SPR_5_9 field in bits 11 -- 15 ++ SPR_0_4_SHIFT = 16u, // SPR_0_4 field in bits 16 -- 20 ++ RS_SHIFT = 21u, // RS field in bits 21 -- 25 ++ OPCODE_SHIFT = 26u, // opcode in bits 26 -- 31 ++ }; ++ ++ enum opcdxos_masks { ++ XL_FORM_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1), ++ ADDI_OPCODE_MASK = (63u << OPCODE_SHIFT), ++ ADDIS_OPCODE_MASK = (63u << OPCODE_SHIFT), ++ BXX_OPCODE_MASK = (63u << OPCODE_SHIFT), ++ BCXX_OPCODE_MASK = (63u << OPCODE_SHIFT), ++ // trap instructions ++ TDI_OPCODE_MASK = (63u << OPCODE_SHIFT), ++ TWI_OPCODE_MASK = (63u << OPCODE_SHIFT), ++ TD_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1), ++ TW_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1), ++ LD_OPCODE_MASK = (63u << OPCODE_SHIFT) | (3u << XO_30_31_SHIFT), // DS-FORM ++ STD_OPCODE_MASK = LD_OPCODE_MASK, ++ STDU_OPCODE_MASK = STD_OPCODE_MASK, ++ STDX_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1), ++ STDUX_OPCODE_MASK = STDX_OPCODE_MASK, ++ STW_OPCODE_MASK = (63u << OPCODE_SHIFT), ++ STWU_OPCODE_MASK = STW_OPCODE_MASK, ++ STWX_OPCODE_MASK = (63u << OPCODE_SHIFT) | (1023u << 1), ++ STWUX_OPCODE_MASK = STWX_OPCODE_MASK, ++ MTCTR_OPCODE_MASK = ~(31u << RS_SHIFT), ++ ORI_OPCODE_MASK = (63u << OPCODE_SHIFT), ++ ORIS_OPCODE_MASK = (63u << OPCODE_SHIFT), ++ RLDICR_OPCODE_MASK = (63u << OPCODE_SHIFT) | (7u << XO_27_29_SHIFT) ++ }; ++ ++ enum opcdxos { ++ ADD_OPCODE = (31u << OPCODE_SHIFT | 266u << 1), ++ ADDC_OPCODE = (31u << OPCODE_SHIFT | 10u << 1), ++ ADDI_OPCODE = (14u << OPCODE_SHIFT), ++ ADDIS_OPCODE = (15u << OPCODE_SHIFT), ++ ADDIC__OPCODE = (13u << OPCODE_SHIFT), ++ ADDE_OPCODE = (31u << OPCODE_SHIFT | 138u << 1), ++ SUBF_OPCODE = (31u << OPCODE_SHIFT | 40u << 1), ++ SUBFC_OPCODE = (31u << OPCODE_SHIFT | 8u << 1), ++ SUBFE_OPCODE = (31u << OPCODE_SHIFT | 136u << 1), ++ SUBFIC_OPCODE = (8u << OPCODE_SHIFT), ++ SUBFZE_OPCODE = (31u << OPCODE_SHIFT | 200u << 1), ++ DIVW_OPCODE = (31u << OPCODE_SHIFT | 491u << 1), ++ MULLW_OPCODE = (31u << OPCODE_SHIFT | 235u << 1), ++ MULHW_OPCODE = (31u << OPCODE_SHIFT | 75u << 1), ++ MULHWU_OPCODE = (31u << OPCODE_SHIFT | 11u << 1), ++ MULLI_OPCODE = (7u << OPCODE_SHIFT), ++ AND_OPCODE = (31u << OPCODE_SHIFT | 28u << 1), ++ ANDI_OPCODE = (28u << OPCODE_SHIFT), ++ ANDIS_OPCODE = (29u << OPCODE_SHIFT), ++ ANDC_OPCODE = (31u << OPCODE_SHIFT | 60u << 1), ++ ORC_OPCODE = (31u << OPCODE_SHIFT | 412u << 1), ++ OR_OPCODE = (31u << OPCODE_SHIFT | 444u << 1), ++ ORI_OPCODE = (24u << OPCODE_SHIFT), ++ ORIS_OPCODE = (25u << OPCODE_SHIFT), ++ XOR_OPCODE = (31u << OPCODE_SHIFT | 316u << 1), ++ XORI_OPCODE = (26u << OPCODE_SHIFT), ++ XORIS_OPCODE = (27u << OPCODE_SHIFT), ++ ++ NEG_OPCODE = (31u << OPCODE_SHIFT | 104u << 1), ++ ++ RLWINM_OPCODE = (21u << OPCODE_SHIFT), ++ CLRRWI_OPCODE = RLWINM_OPCODE, ++ CLRLWI_OPCODE = RLWINM_OPCODE, ++ ++ RLWIMI_OPCODE = (20u << OPCODE_SHIFT), ++ ++ SLW_OPCODE = (31u << OPCODE_SHIFT | 24u << 1), ++ SLWI_OPCODE = RLWINM_OPCODE, ++ SRW_OPCODE = (31u << OPCODE_SHIFT | 536u << 1), ++ SRWI_OPCODE = RLWINM_OPCODE, ++ SRAW_OPCODE = (31u << OPCODE_SHIFT | 792u << 1), ++ SRAWI_OPCODE = (31u << OPCODE_SHIFT | 824u << 1), ++ ++ CMP_OPCODE = (31u << OPCODE_SHIFT | 0u << 1), ++ CMPI_OPCODE = (11u << OPCODE_SHIFT), ++ CMPL_OPCODE = (31u << OPCODE_SHIFT | 32u << 1), ++ CMPLI_OPCODE = (10u << OPCODE_SHIFT), ++ ++ ISEL_OPCODE = (31u << OPCODE_SHIFT | 15u << 1), ++ ++ MTLR_OPCODE = (31u << OPCODE_SHIFT | 467u << 1 | 8 << SPR_0_4_SHIFT), ++ MFLR_OPCODE = (31u << OPCODE_SHIFT | 339u << 1 | 8 << SPR_0_4_SHIFT), ++ ++ MTCRF_OPCODE = (31u << OPCODE_SHIFT | 144u << 1), ++ MFCR_OPCODE = (31u << OPCODE_SHIFT | 19u << 1), ++ MCRF_OPCODE = (19u << OPCODE_SHIFT | 0u << 1), ++ ++ // condition register logic instructions ++ CRAND_OPCODE = (19u << OPCODE_SHIFT | 257u << 1), ++ CRNAND_OPCODE = (19u << OPCODE_SHIFT | 225u << 1), ++ CROR_OPCODE = (19u << OPCODE_SHIFT | 449u << 1), ++ CRXOR_OPCODE = (19u << OPCODE_SHIFT | 193u << 1), ++ CRNOR_OPCODE = (19u << OPCODE_SHIFT | 33u << 1), ++ CREQV_OPCODE = (19u << OPCODE_SHIFT | 289u << 1), ++ CRANDC_OPCODE = (19u << OPCODE_SHIFT | 129u << 1), ++ CRORC_OPCODE = (19u << OPCODE_SHIFT | 417u << 1), ++ ++ BCLR_OPCODE = (19u << OPCODE_SHIFT | 16u << 1), ++ BXX_OPCODE = (18u << OPCODE_SHIFT), ++ BCXX_OPCODE = (16u << OPCODE_SHIFT), ++ ++ // CTR-related opcodes ++ BCCTR_OPCODE = (19u << OPCODE_SHIFT | 528u << 1), ++ MTCTR_OPCODE = (31u << OPCODE_SHIFT | 467u << 1 | 9 << SPR_0_4_SHIFT), ++ MFCTR_OPCODE = (31u << OPCODE_SHIFT | 339u << 1 | 9 << SPR_0_4_SHIFT), ++ ++ ++ LWZ_OPCODE = (32u << OPCODE_SHIFT), ++ LWZX_OPCODE = (31u << OPCODE_SHIFT | 23u << 1), ++ LWZU_OPCODE = (33u << OPCODE_SHIFT), ++ ++ LHA_OPCODE = (42u << OPCODE_SHIFT), ++ LHAX_OPCODE = (31u << OPCODE_SHIFT | 343u << 1), ++ LHAU_OPCODE = (43u << OPCODE_SHIFT), ++ ++ LHZ_OPCODE = (40u << OPCODE_SHIFT), ++ LHZX_OPCODE = (31u << OPCODE_SHIFT | 279u << 1), ++ LHZU_OPCODE = (41u << OPCODE_SHIFT), ++ ++ LBZ_OPCODE = (34u << OPCODE_SHIFT), ++ LBZX_OPCODE = (31u << OPCODE_SHIFT | 87u << 1), ++ LBZU_OPCODE = (35u << OPCODE_SHIFT), ++ ++ STW_OPCODE = (36u << OPCODE_SHIFT), ++ STWX_OPCODE = (31u << OPCODE_SHIFT | 151u << 1), ++ STWU_OPCODE = (37u << OPCODE_SHIFT), ++ STWUX_OPCODE = (31u << OPCODE_SHIFT | 183u << 1), ++ ++ STH_OPCODE = (44u << OPCODE_SHIFT), ++ STHX_OPCODE = (31u << OPCODE_SHIFT | 407u << 1), ++ STHU_OPCODE = (45u << OPCODE_SHIFT), ++ ++ STB_OPCODE = (38u << OPCODE_SHIFT), ++ STBX_OPCODE = (31u << OPCODE_SHIFT | 215u << 1), ++ STBU_OPCODE = (39u << OPCODE_SHIFT), ++ ++ EXTSB_OPCODE = (31u << OPCODE_SHIFT | 954u << 1), ++ EXTSH_OPCODE = (31u << OPCODE_SHIFT | 922u << 1), ++ EXTSW_OPCODE = (31u << OPCODE_SHIFT | 986u << 1), // X-FORM ++ ++ // 32 bit opcode encodings ++ ++ LWA_OPCODE = (58u << OPCODE_SHIFT | 2u << XO_30_31_SHIFT), // DS-FORM ++ LWAX_OPCODE = (31u << OPCODE_SHIFT | 341u << XO_21_30_SHIFT), // X-FORM ++ ++ CNTLZW_OPCODE = (31u << OPCODE_SHIFT | 26u << XO_21_30_SHIFT), // X-FORM ++ ++ // 64 bit opcode encodings ++ ++ LD_OPCODE = (58u << OPCODE_SHIFT | 0u << XO_30_31_SHIFT), // DS-FORM ++ LDU_OPCODE = (58u << OPCODE_SHIFT | 1u << XO_30_31_SHIFT), // DS-FORM ++ LDX_OPCODE = (31u << OPCODE_SHIFT | 21u << XO_21_30_SHIFT), // X-FORM ++ ++ STD_OPCODE = (62u << OPCODE_SHIFT | 0u << XO_30_31_SHIFT), // DS-FORM ++ STDU_OPCODE = (62u << OPCODE_SHIFT | 1u << XO_30_31_SHIFT), // DS-FORM ++ STDUX_OPCODE = (31u << OPCODE_SHIFT | 181u << 1), // X-FORM ++ STDX_OPCODE = (31u << OPCODE_SHIFT | 149u << XO_21_30_SHIFT), // X-FORM ++ ++ RLDICR_OPCODE = (30u << OPCODE_SHIFT | 1u << XO_27_29_SHIFT), // MD-FORM ++ RLDICL_OPCODE = (30u << OPCODE_SHIFT | 0u << XO_27_29_SHIFT), // MD-FORM ++ RLDIC_OPCODE = (30u << OPCODE_SHIFT | 2u << XO_27_29_SHIFT), // MD-FORM ++ RLDIMI_OPCODE = (30u << OPCODE_SHIFT | 3u << XO_27_29_SHIFT), // MD-FORM ++ ++ SRADI_OPCODE = (31u << OPCODE_SHIFT | 413u << XO_21_29_SHIFT), // XS-FORM ++ ++ SLD_OPCODE = (31u << OPCODE_SHIFT | 27u << 1), // X-FORM ++ SRD_OPCODE = (31u << OPCODE_SHIFT | 539u << 1), // X-FORM ++ SRAD_OPCODE = (31u << OPCODE_SHIFT | 794u << 1), // X-FORM ++ ++ MULLD_OPCODE = (31u << OPCODE_SHIFT | 233u << 1), // XO-FORM ++ MULHD_OPCODE = (31u << OPCODE_SHIFT | 73u << 1), // XO-FORM ++ MULHDU_OPCODE = (31u << OPCODE_SHIFT | 9u << 1), // XO-FORM ++ DIVD_OPCODE = (31u << OPCODE_SHIFT | 489u << 1), // XO-FORM ++ ++ CNTLZD_OPCODE = (31u << OPCODE_SHIFT | 58u << XO_21_30_SHIFT), // X-FORM ++ NAND_OPCODE = (31u << OPCODE_SHIFT | 476u << XO_21_30_SHIFT), // X-FORM ++ NOR_OPCODE = (31u << OPCODE_SHIFT | 124u << XO_21_30_SHIFT), // X-FORM ++ ++ ++ // opcodes only used for floating arithmetic ++ FADD_OPCODE = (63u << OPCODE_SHIFT | 21u << 1), ++ FADDS_OPCODE = (59u << OPCODE_SHIFT | 21u << 1), ++ FCMPU_OPCODE = (63u << OPCODE_SHIFT | 00u << 1), ++ FDIV_OPCODE = (63u << OPCODE_SHIFT | 18u << 1), ++ FDIVS_OPCODE = (59u << OPCODE_SHIFT | 18u << 1), ++ FMR_OPCODE = (63u << OPCODE_SHIFT | 72u << 1), ++ // These are special Power6 opcodes, reused for "lfdepx" and "stfdepx" ++ // on Power7. Do not use. ++ // MFFGPR_OPCODE = (31u << OPCODE_SHIFT | 607u << 1), ++ // MFTGPR_OPCODE = (31u << OPCODE_SHIFT | 735u << 1), ++ CMPB_OPCODE = (31u << OPCODE_SHIFT | 508 << 1), ++ POPCNTB_OPCODE = (31u << OPCODE_SHIFT | 122 << 1), ++ POPCNTW_OPCODE = (31u << OPCODE_SHIFT | 378 << 1), ++ POPCNTD_OPCODE = (31u << OPCODE_SHIFT | 506 << 1), ++ FABS_OPCODE = (63u << OPCODE_SHIFT | 264u << 1), ++ FNABS_OPCODE = (63u << OPCODE_SHIFT | 136u << 1), ++ FMUL_OPCODE = (63u << OPCODE_SHIFT | 25u << 1), ++ FMULS_OPCODE = (59u << OPCODE_SHIFT | 25u << 1), ++ FNEG_OPCODE = (63u << OPCODE_SHIFT | 40u << 1), ++ FSUB_OPCODE = (63u << OPCODE_SHIFT | 20u << 1), ++ FSUBS_OPCODE = (59u << OPCODE_SHIFT | 20u << 1), ++ ++ // PPC64-internal FPU conversion opcodes ++ FCFID_OPCODE = (63u << OPCODE_SHIFT | 846u << 1), ++ FCFIDS_OPCODE = (59u << OPCODE_SHIFT | 846u << 1), ++ FCTID_OPCODE = (63u << OPCODE_SHIFT | 814u << 1), ++ FCTIDZ_OPCODE = (63u << OPCODE_SHIFT | 815u << 1), ++ FCTIW_OPCODE = (63u << OPCODE_SHIFT | 14u << 1), ++ FCTIWZ_OPCODE = (63u << OPCODE_SHIFT | 15u << 1), ++ FRSP_OPCODE = (63u << OPCODE_SHIFT | 12u << 1), ++ ++ // WARNING: using fmadd results in a non-compliant vm. Some floating ++ // point tck tests will fail. ++ FMADD_OPCODE = (59u << OPCODE_SHIFT | 29u << 1), ++ DMADD_OPCODE = (63u << OPCODE_SHIFT | 29u << 1), ++ FMSUB_OPCODE = (59u << OPCODE_SHIFT | 28u << 1), ++ DMSUB_OPCODE = (63u << OPCODE_SHIFT | 28u << 1), ++ FNMADD_OPCODE = (59u << OPCODE_SHIFT | 31u << 1), ++ DNMADD_OPCODE = (63u << OPCODE_SHIFT | 31u << 1), ++ FNMSUB_OPCODE = (59u << OPCODE_SHIFT | 30u << 1), ++ DNMSUB_OPCODE = (63u << OPCODE_SHIFT | 30u << 1), ++ ++ LFD_OPCODE = (50u << OPCODE_SHIFT | 00u << 1), ++ LFDU_OPCODE = (51u << OPCODE_SHIFT | 00u << 1), ++ LFDX_OPCODE = (31u << OPCODE_SHIFT | 599u << 1), ++ LFS_OPCODE = (48u << OPCODE_SHIFT | 00u << 1), ++ LFSU_OPCODE = (49u << OPCODE_SHIFT | 00u << 1), ++ LFSX_OPCODE = (31u << OPCODE_SHIFT | 535u << 1), ++ ++ STFD_OPCODE = (54u << OPCODE_SHIFT | 00u << 1), ++ STFDU_OPCODE = (55u << OPCODE_SHIFT | 00u << 1), ++ STFDX_OPCODE = (31u << OPCODE_SHIFT | 727u << 1), ++ STFS_OPCODE = (52u << OPCODE_SHIFT | 00u << 1), ++ STFSU_OPCODE = (53u << OPCODE_SHIFT | 00u << 1), ++ STFSX_OPCODE = (31u << OPCODE_SHIFT | 663u << 1), ++ ++ FSQRT_OPCODE = (63u << OPCODE_SHIFT | 22u << 1), // A-FORM ++ FSQRTS_OPCODE = (59u << OPCODE_SHIFT | 22u << 1), // A-FORM ++ ++ // Vector instruction support for >= Power6 ++ // Vector Storage Access ++ LVEBX_OPCODE = (31u << OPCODE_SHIFT | 7u << 1), ++ LVEHX_OPCODE = (31u << OPCODE_SHIFT | 39u << 1), ++ LVEWX_OPCODE = (31u << OPCODE_SHIFT | 71u << 1), ++ LVX_OPCODE = (31u << OPCODE_SHIFT | 103u << 1), ++ LVXL_OPCODE = (31u << OPCODE_SHIFT | 359u << 1), ++ STVEBX_OPCODE = (31u << OPCODE_SHIFT | 135u << 1), ++ STVEHX_OPCODE = (31u << OPCODE_SHIFT | 167u << 1), ++ STVEWX_OPCODE = (31u << OPCODE_SHIFT | 199u << 1), ++ STVX_OPCODE = (31u << OPCODE_SHIFT | 231u << 1), ++ STVXL_OPCODE = (31u << OPCODE_SHIFT | 487u << 1), ++ LVSL_OPCODE = (31u << OPCODE_SHIFT | 6u << 1), ++ LVSR_OPCODE = (31u << OPCODE_SHIFT | 38u << 1), ++ ++ // Vector Permute and Formatting ++ VPKPX_OPCODE = (4u << OPCODE_SHIFT | 782u ), ++ VPKSHSS_OPCODE = (4u << OPCODE_SHIFT | 398u ), ++ VPKSWSS_OPCODE = (4u << OPCODE_SHIFT | 462u ), ++ VPKSHUS_OPCODE = (4u << OPCODE_SHIFT | 270u ), ++ VPKSWUS_OPCODE = (4u << OPCODE_SHIFT | 334u ), ++ VPKUHUM_OPCODE = (4u << OPCODE_SHIFT | 14u ), ++ VPKUWUM_OPCODE = (4u << OPCODE_SHIFT | 78u ), ++ VPKUHUS_OPCODE = (4u << OPCODE_SHIFT | 142u ), ++ VPKUWUS_OPCODE = (4u << OPCODE_SHIFT | 206u ), ++ VUPKHPX_OPCODE = (4u << OPCODE_SHIFT | 846u ), ++ VUPKHSB_OPCODE = (4u << OPCODE_SHIFT | 526u ), ++ VUPKHSH_OPCODE = (4u << OPCODE_SHIFT | 590u ), ++ VUPKLPX_OPCODE = (4u << OPCODE_SHIFT | 974u ), ++ VUPKLSB_OPCODE = (4u << OPCODE_SHIFT | 654u ), ++ VUPKLSH_OPCODE = (4u << OPCODE_SHIFT | 718u ), ++ ++ VMRGHB_OPCODE = (4u << OPCODE_SHIFT | 12u ), ++ VMRGHW_OPCODE = (4u << OPCODE_SHIFT | 140u ), ++ VMRGHH_OPCODE = (4u << OPCODE_SHIFT | 76u ), ++ VMRGLB_OPCODE = (4u << OPCODE_SHIFT | 268u ), ++ VMRGLW_OPCODE = (4u << OPCODE_SHIFT | 396u ), ++ VMRGLH_OPCODE = (4u << OPCODE_SHIFT | 332u ), ++ ++ VSPLT_OPCODE = (4u << OPCODE_SHIFT | 524u ), ++ VSPLTH_OPCODE = (4u << OPCODE_SHIFT | 588u ), ++ VSPLTW_OPCODE = (4u << OPCODE_SHIFT | 652u ), ++ VSPLTISB_OPCODE= (4u << OPCODE_SHIFT | 780u ), ++ VSPLTISH_OPCODE= (4u << OPCODE_SHIFT | 844u ), ++ VSPLTISW_OPCODE= (4u << OPCODE_SHIFT | 908u ), ++ ++ VPERM_OPCODE = (4u << OPCODE_SHIFT | 43u ), ++ VSEL_OPCODE = (4u << OPCODE_SHIFT | 42u ), ++ ++ VSL_OPCODE = (4u << OPCODE_SHIFT | 452u ), ++ VSLDOI_OPCODE = (4u << OPCODE_SHIFT | 44u ), ++ VSLO_OPCODE = (4u << OPCODE_SHIFT | 1036u ), ++ VSR_OPCODE = (4u << OPCODE_SHIFT | 708u ), ++ VSRO_OPCODE = (4u << OPCODE_SHIFT | 1100u ), ++ ++ // Vector Integer ++ VADDCUW_OPCODE = (4u << OPCODE_SHIFT | 384u ), ++ VADDSHS_OPCODE = (4u << OPCODE_SHIFT | 832u ), ++ VADDSBS_OPCODE = (4u << OPCODE_SHIFT | 768u ), ++ VADDSWS_OPCODE = (4u << OPCODE_SHIFT | 896u ), ++ VADDUBM_OPCODE = (4u << OPCODE_SHIFT | 0u ), ++ VADDUWM_OPCODE = (4u << OPCODE_SHIFT | 128u ), ++ VADDUHM_OPCODE = (4u << OPCODE_SHIFT | 64u ), ++ VADDUBS_OPCODE = (4u << OPCODE_SHIFT | 512u ), ++ VADDUWS_OPCODE = (4u << OPCODE_SHIFT | 640u ), ++ VADDUHS_OPCODE = (4u << OPCODE_SHIFT | 576u ), ++ VSUBCUW_OPCODE = (4u << OPCODE_SHIFT | 1408u ), ++ VSUBSHS_OPCODE = (4u << OPCODE_SHIFT | 1856u ), ++ VSUBSBS_OPCODE = (4u << OPCODE_SHIFT | 1792u ), ++ VSUBSWS_OPCODE = (4u << OPCODE_SHIFT | 1920u ), ++ VSUBUBM_OPCODE = (4u << OPCODE_SHIFT | 1024u ), ++ VSUBUWM_OPCODE = (4u << OPCODE_SHIFT | 1152u ), ++ VSUBUHM_OPCODE = (4u << OPCODE_SHIFT | 1088u ), ++ VSUBUBS_OPCODE = (4u << OPCODE_SHIFT | 1536u ), ++ VSUBUWS_OPCODE = (4u << OPCODE_SHIFT | 1664u ), ++ VSUBUHS_OPCODE = (4u << OPCODE_SHIFT | 1600u ), ++ ++ VMULESB_OPCODE = (4u << OPCODE_SHIFT | 776u ), ++ VMULEUB_OPCODE = (4u << OPCODE_SHIFT | 520u ), ++ VMULESH_OPCODE = (4u << OPCODE_SHIFT | 840u ), ++ VMULEUH_OPCODE = (4u << OPCODE_SHIFT | 584u ), ++ VMULOSB_OPCODE = (4u << OPCODE_SHIFT | 264u ), ++ VMULOUB_OPCODE = (4u << OPCODE_SHIFT | 8u ), ++ VMULOSH_OPCODE = (4u << OPCODE_SHIFT | 328u ), ++ VMULOUH_OPCODE = (4u << OPCODE_SHIFT | 72u ), ++ VMHADDSHS_OPCODE=(4u << OPCODE_SHIFT | 32u ), ++ VMHRADDSHS_OPCODE=(4u << OPCODE_SHIFT | 33u ), ++ VMLADDUHM_OPCODE=(4u << OPCODE_SHIFT | 34u ), ++ VMSUBUHM_OPCODE= (4u << OPCODE_SHIFT | 36u ), ++ VMSUMMBM_OPCODE= (4u << OPCODE_SHIFT | 37u ), ++ VMSUMSHM_OPCODE= (4u << OPCODE_SHIFT | 40u ), ++ VMSUMSHS_OPCODE= (4u << OPCODE_SHIFT | 41u ), ++ VMSUMUHM_OPCODE= (4u << OPCODE_SHIFT | 38u ), ++ VMSUMUHS_OPCODE= (4u << OPCODE_SHIFT | 39u ), ++ ++ VSUMSWS_OPCODE = (4u << OPCODE_SHIFT | 1928u ), ++ VSUM2SWS_OPCODE= (4u << OPCODE_SHIFT | 1672u ), ++ VSUM4SBS_OPCODE= (4u << OPCODE_SHIFT | 1800u ), ++ VSUM4UBS_OPCODE= (4u << OPCODE_SHIFT | 1544u ), ++ VSUM4SHS_OPCODE= (4u << OPCODE_SHIFT | 1608u ), ++ ++ VAVGSB_OPCODE = (4u << OPCODE_SHIFT | 1282u ), ++ VAVGSW_OPCODE = (4u << OPCODE_SHIFT | 1410u ), ++ VAVGSH_OPCODE = (4u << OPCODE_SHIFT | 1346u ), ++ VAVGUB_OPCODE = (4u << OPCODE_SHIFT | 1026u ), ++ VAVGUW_OPCODE = (4u << OPCODE_SHIFT | 1154u ), ++ VAVGUH_OPCODE = (4u << OPCODE_SHIFT | 1090u ), ++ ++ VMAXSB_OPCODE = (4u << OPCODE_SHIFT | 258u ), ++ VMAXSW_OPCODE = (4u << OPCODE_SHIFT | 386u ), ++ VMAXSH_OPCODE = (4u << OPCODE_SHIFT | 322u ), ++ VMAXUB_OPCODE = (4u << OPCODE_SHIFT | 2u ), ++ VMAXUW_OPCODE = (4u << OPCODE_SHIFT | 130u ), ++ VMAXUH_OPCODE = (4u << OPCODE_SHIFT | 66u ), ++ VMINSB_OPCODE = (4u << OPCODE_SHIFT | 770u ), ++ VMINSW_OPCODE = (4u << OPCODE_SHIFT | 898u ), ++ VMINSH_OPCODE = (4u << OPCODE_SHIFT | 834u ), ++ VMINUB_OPCODE = (4u << OPCODE_SHIFT | 514u ), ++ VMINUW_OPCODE = (4u << OPCODE_SHIFT | 642u ), ++ VMINUH_OPCODE = (4u << OPCODE_SHIFT | 578u ), ++ ++ VCMPEQUB_OPCODE= (4u << OPCODE_SHIFT | 6u ), ++ VCMPEQUH_OPCODE= (4u << OPCODE_SHIFT | 70u ), ++ VCMPEQUW_OPCODE= (4u << OPCODE_SHIFT | 134u ), ++ VCMPGTSH_OPCODE= (4u << OPCODE_SHIFT | 838u ), ++ VCMPGTSB_OPCODE= (4u << OPCODE_SHIFT | 774u ), ++ VCMPGTSW_OPCODE= (4u << OPCODE_SHIFT | 902u ), ++ VCMPGTUB_OPCODE= (4u << OPCODE_SHIFT | 518u ), ++ VCMPGTUH_OPCODE= (4u << OPCODE_SHIFT | 582u ), ++ VCMPGTUW_OPCODE= (4u << OPCODE_SHIFT | 646u ), ++ ++ VAND_OPCODE = (4u << OPCODE_SHIFT | 1028u ), ++ VANDC_OPCODE = (4u << OPCODE_SHIFT | 1092u ), ++ VNOR_OPCODE = (4u << OPCODE_SHIFT | 1284u ), ++ VOR_OPCODE = (4u << OPCODE_SHIFT | 1156u ), ++ VXOR_OPCODE = (4u << OPCODE_SHIFT | 1220u ), ++ VRLB_OPCODE = (4u << OPCODE_SHIFT | 4u ), ++ VRLW_OPCODE = (4u << OPCODE_SHIFT | 132u ), ++ VRLH_OPCODE = (4u << OPCODE_SHIFT | 68u ), ++ VSLB_OPCODE = (4u << OPCODE_SHIFT | 260u ), ++ VSKW_OPCODE = (4u << OPCODE_SHIFT | 388u ), ++ VSLH_OPCODE = (4u << OPCODE_SHIFT | 324u ), ++ VSRB_OPCODE = (4u << OPCODE_SHIFT | 516u ), ++ VSRW_OPCODE = (4u << OPCODE_SHIFT | 644u ), ++ VSRH_OPCODE = (4u << OPCODE_SHIFT | 580u ), ++ VSRAB_OPCODE = (4u << OPCODE_SHIFT | 772u ), ++ VSRAW_OPCODE = (4u << OPCODE_SHIFT | 900u ), ++ VSRAH_OPCODE = (4u << OPCODE_SHIFT | 836u ), ++ ++ // Vector Floating-Point ++ // not implemented yet ++ ++ // Vector Status and Control ++ MTVSCR_OPCODE = (4u << OPCODE_SHIFT | 1604u ), ++ MFVSCR_OPCODE = (4u << OPCODE_SHIFT | 1540u ), ++ ++ // Icache and dcache related instructions ++ DCBA_OPCODE = (31u << OPCODE_SHIFT | 758u << 1), ++ DCBZ_OPCODE = (31u << OPCODE_SHIFT | 1014u << 1), ++ DCBST_OPCODE = (31u << OPCODE_SHIFT | 54u << 1), ++ DCBF_OPCODE = (31u << OPCODE_SHIFT | 86u << 1), ++ ++ DCBT_OPCODE = (31u << OPCODE_SHIFT | 278u << 1), ++ DCBTST_OPCODE = (31u << OPCODE_SHIFT | 246u << 1), ++ ICBI_OPCODE = (31u << OPCODE_SHIFT | 982u << 1), ++ ++ // Instruction synchronization ++ ISYNC_OPCODE = (19u << OPCODE_SHIFT | 150u << 1), ++ // Memory barriers ++ SYNC_OPCODE = (31u << OPCODE_SHIFT | 598u << 1), ++ EIEIO_OPCODE = (31u << OPCODE_SHIFT | 854u << 1), ++ ++ // Trap instructions ++ TDI_OPCODE = (2u << OPCODE_SHIFT), ++ TWI_OPCODE = (3u << OPCODE_SHIFT), ++ TD_OPCODE = (31u << OPCODE_SHIFT | 68u << 1), ++ TW_OPCODE = (31u << OPCODE_SHIFT | 4u << 1), ++ ++ // Atomics. ++ LWARX_OPCODE = (31u << OPCODE_SHIFT | 20u << 1), ++ LDARX_OPCODE = (31u << OPCODE_SHIFT | 84u << 1), ++ STWCX_OPCODE = (31u << OPCODE_SHIFT | 150u << 1), ++ STDCX_OPCODE = (31u << OPCODE_SHIFT | 214u << 1) ++ ++ }; ++ ++ // Trap instructions TO bits ++ enum trap_to_bits { ++ // single bits ++ traptoLessThanSigned = 1 << 4, // 0, left end ++ traptoGreaterThanSigned = 1 << 3, ++ traptoEqual = 1 << 2, ++ traptoLessThanUnsigned = 1 << 1, ++ traptoGreaterThanUnsigned = 1 << 0, // 4, right end ++ ++ // compound ones ++ traptoUnconditional = (traptoLessThanSigned | ++ traptoGreaterThanSigned | ++ traptoEqual | ++ traptoLessThanUnsigned | ++ traptoGreaterThanUnsigned) ++ }; ++ ++ // Branch hints BH field ++ enum branch_hint_bh { ++ // bclr cases: ++ bhintbhBCLRisReturn = 0, ++ bhintbhBCLRisNotReturnButSame = 1, ++ bhintbhBCLRisNotPredictable = 3, ++ ++ // bcctr cases: ++ bhintbhBCCTRisNotReturnButSame = 0, ++ bhintbhBCCTRisNotPredictable = 3 ++ }; ++ ++ // Branch prediction hints AT field ++ enum branch_hint_at { ++ bhintatNoHint = 0, // at=00 ++ bhintatIsNotTaken = 2, // at=10 ++ bhintatIsTaken = 3 // at=11 ++ }; ++ ++ // Branch prediction hints ++ enum branch_hint_concept { ++ // Use the same encoding as branch_hint_at to simply code. ++ bhintNoHint = bhintatNoHint, ++ bhintIsNotTaken = bhintatIsNotTaken, ++ bhintIsTaken = bhintatIsTaken ++ }; ++ ++ // Used in BO field of branch instruction. ++ enum branch_condition { ++ bcondCRbiIs0 = 4, // bo=001at ++ bcondCRbiIs1 = 12, // bo=011at ++ bcondAlways = 20 // bo=10100 ++ }; ++ ++ // Branch condition with combined prediction hints. ++ enum branch_condition_with_hint { ++ bcondCRbiIs0_bhintNoHint = bcondCRbiIs0 | bhintatNoHint, ++ bcondCRbiIs0_bhintIsNotTaken = bcondCRbiIs0 | bhintatIsNotTaken, ++ bcondCRbiIs0_bhintIsTaken = bcondCRbiIs0 | bhintatIsTaken, ++ bcondCRbiIs1_bhintNoHint = bcondCRbiIs1 | bhintatNoHint, ++ bcondCRbiIs1_bhintIsNotTaken = bcondCRbiIs1 | bhintatIsNotTaken, ++ bcondCRbiIs1_bhintIsTaken = bcondCRbiIs1 | bhintatIsTaken, ++ }; ++ ++ // Elemental Memory Barriers (>=Power 8) ++ enum Elemental_Membar_mask_bits { ++ StoreStore = 1 << 0, ++ StoreLoad = 1 << 1, ++ LoadStore = 1 << 2, ++ LoadLoad = 1 << 3 ++ }; ++ ++ // Branch prediction hints. ++ inline static int add_bhint_to_boint(const int bhint, const int boint) { ++ switch (boint) { ++ case bcondCRbiIs0: ++ case bcondCRbiIs1: ++ // branch_hint and branch_hint_at have same encodings ++ assert( (int)bhintNoHint == (int)bhintatNoHint ++ && (int)bhintIsNotTaken == (int)bhintatIsNotTaken ++ && (int)bhintIsTaken == (int)bhintatIsTaken, ++ "wrong encodings"); ++ assert((bhint & 0x03) == bhint, "wrong encodings"); ++ return (boint & ~0x03) | bhint; ++ case bcondAlways: ++ // no branch_hint ++ return boint; ++ default: ++ ShouldNotReachHere(); ++ return 0; ++ } ++ } ++ ++ // Extract bcond from boint. ++ inline static int inv_boint_bcond(const int boint) { ++ int r_bcond = boint & ~0x03; ++ assert(r_bcond == bcondCRbiIs0 || ++ r_bcond == bcondCRbiIs1 || ++ r_bcond == bcondAlways, ++ "bad branch condition"); ++ return r_bcond; ++ } ++ ++ // Extract bhint from boint. ++ inline static int inv_boint_bhint(const int boint) { ++ int r_bhint = boint & 0x03; ++ assert(r_bhint == bhintatNoHint || ++ r_bhint == bhintatIsNotTaken || ++ r_bhint == bhintatIsTaken, ++ "bad branch hint"); ++ return r_bhint; ++ } ++ ++ // Calculate opposite of given bcond. ++ inline static int opposite_bcond(const int bcond) { ++ switch (bcond) { ++ case bcondCRbiIs0: ++ return bcondCRbiIs1; ++ case bcondCRbiIs1: ++ return bcondCRbiIs0; ++ default: ++ ShouldNotReachHere(); ++ return 0; ++ } ++ } ++ ++ // Calculate opposite of given bhint. ++ inline static int opposite_bhint(const int bhint) { ++ switch (bhint) { ++ case bhintatNoHint: ++ return bhintatNoHint; ++ case bhintatIsNotTaken: ++ return bhintatIsTaken; ++ case bhintatIsTaken: ++ return bhintatIsNotTaken; ++ default: ++ ShouldNotReachHere(); ++ return 0; ++ } ++ } ++ ++ // PPC branch instructions ++ enum ppcops { ++ b_op = 18, ++ bc_op = 16, ++ bcr_op = 19 ++ }; ++ ++ enum Condition { ++ negative = 0, ++ less = 0, ++ positive = 1, ++ greater = 1, ++ zero = 2, ++ equal = 2, ++ summary_overflow = 3, ++ }; ++ ++ public: ++ // Helper functions for groups of instructions ++ ++ enum Predict { pt = 1, pn = 0 }; // pt = predict taken ++ ++ // instruction must start at passed address ++ static int instr_len(unsigned char *instr) { return BytesPerInstWord; } ++ ++ // instruction must be left-justified in argument ++ static int instr_len(unsigned long instr) { return BytesPerInstWord; } ++ ++ // longest instructions ++ static int instr_maxlen() { return BytesPerInstWord; } ++ ++ // Test if x is within signed immediate range for nbits. ++ static bool is_simm(int x, unsigned int nbits) { ++ assert(0 < nbits && nbits < 32, "out of bounds"); ++ const int min = -( ((int)1) << nbits-1 ); ++ const int maxplus1 = ( ((int)1) << nbits-1 ); ++ return min <= x && x < maxplus1; ++ } ++ ++ static bool is_simm(jlong x, unsigned int nbits) { ++ assert(0 < nbits && nbits < 64, "out of bounds"); ++ const jlong min = -( ((jlong)1) << nbits-1 ); ++ const jlong maxplus1 = ( ((jlong)1) << nbits-1 ); ++ return min <= x && x < maxplus1; ++ } ++ ++ // Test if x is within unsigned immediate range for nbits ++ static bool is_uimm(int x, unsigned int nbits) { ++ assert(0 < nbits && nbits < 32, "out of bounds"); ++ const int maxplus1 = ( ((int)1) << nbits ); ++ return 0 <= x && x < maxplus1; ++ } ++ ++ static bool is_uimm(jlong x, unsigned int nbits) { ++ assert(0 < nbits && nbits < 64, "out of bounds"); ++ const jlong maxplus1 = ( ((jlong)1) << nbits ); ++ return 0 <= x && x < maxplus1; ++ } ++ ++ protected: ++ // helpers ++ ++ // X is supposed to fit in a field "nbits" wide ++ // and be sign-extended. Check the range. ++ static void assert_signed_range(intptr_t x, int nbits) { ++ assert(nbits == 32 || (-(1 << nbits-1) <= x && x < (1 << nbits-1)), ++ "value out of range"); ++ } ++ ++ static void assert_signed_word_disp_range(intptr_t x, int nbits) { ++ assert((x & 3) == 0, "not word aligned"); ++ assert_signed_range(x, nbits + 2); ++ } ++ ++ static void assert_unsigned_const(int x, int nbits) { ++ assert(juint(x) < juint(1 << nbits), "unsigned constant out of range"); ++ } ++ ++ static int fmask(juint hi_bit, juint lo_bit) { ++ assert(hi_bit >= lo_bit && hi_bit < 32, "bad bits"); ++ return (1 << ( hi_bit-lo_bit + 1 )) - 1; ++ } ++ ++ // inverse of u_field ++ static int inv_u_field(int x, int hi_bit, int lo_bit) { ++ juint r = juint(x) >> lo_bit; ++ r &= fmask(hi_bit, lo_bit); ++ return int(r); ++ } ++ ++ // signed version: extract from field and sign-extend ++ static int inv_s_field_ppc(int x, int hi_bit, int lo_bit) { ++ x = x << (31-hi_bit); ++ x = x >> (31-hi_bit+lo_bit); ++ return x; ++ } ++ ++ static int u_field(int x, int hi_bit, int lo_bit) { ++ assert((x & ~fmask(hi_bit, lo_bit)) == 0, "value out of range"); ++ int r = x << lo_bit; ++ assert(inv_u_field(r, hi_bit, lo_bit) == x, "just checking"); ++ return r; ++ } ++ ++ // Same as u_field for signed values ++ static int s_field(int x, int hi_bit, int lo_bit) { ++ int nbits = hi_bit - lo_bit + 1; ++ assert(nbits == 32 || (-(1 << nbits-1) <= x && x < (1 << nbits-1)), ++ "value out of range"); ++ x &= fmask(hi_bit, lo_bit); ++ int r = x << lo_bit; ++ return r; ++ } ++ ++ // inv_op for ppc instructions ++ static int inv_op_ppc(int x) { return inv_u_field(x, 31, 26); } ++ ++ // Determine target address from li, bd field of branch instruction. ++ static intptr_t inv_li_field(int x) { ++ intptr_t r = inv_s_field_ppc(x, 25, 2); ++ r = (r << 2); ++ return r; ++ } ++ static intptr_t inv_bd_field(int x, intptr_t pos) { ++ intptr_t r = inv_s_field_ppc(x, 15, 2); ++ r = (r << 2) + pos; ++ return r; ++ } ++ ++ #define inv_opp_u_field(x, hi_bit, lo_bit) inv_u_field(x, 31-(lo_bit), 31-(hi_bit)) ++ #define inv_opp_s_field(x, hi_bit, lo_bit) inv_s_field_ppc(x, 31-(lo_bit), 31-(hi_bit)) ++ // Extract instruction fields from instruction words. ++ public: ++ static int inv_ra_field(int x) { return inv_opp_u_field(x, 15, 11); } ++ static int inv_rb_field(int x) { return inv_opp_u_field(x, 20, 16); } ++ static int inv_rt_field(int x) { return inv_opp_u_field(x, 10, 6); } ++ static int inv_rta_field(int x) { return inv_opp_u_field(x, 15, 11); } ++ static int inv_rs_field(int x) { return inv_opp_u_field(x, 10, 6); } ++ // Ds uses opp_s_field(x, 31, 16), but lowest 2 bits must be 0. ++ // Inv_ds_field uses range (x, 29, 16) but shifts by 2 to ensure that lowest bits are 0. ++ static int inv_ds_field(int x) { return inv_opp_s_field(x, 29, 16) << 2; } ++ static int inv_d1_field(int x) { return inv_opp_s_field(x, 31, 16); } ++ static int inv_si_field(int x) { return inv_opp_s_field(x, 31, 16); } ++ static int inv_to_field(int x) { return inv_opp_u_field(x, 10, 6); } ++ static int inv_lk_field(int x) { return inv_opp_u_field(x, 31, 31); } ++ static int inv_bo_field(int x) { return inv_opp_u_field(x, 10, 6); } ++ static int inv_bi_field(int x) { return inv_opp_u_field(x, 15, 11); } ++ ++ #define opp_u_field(x, hi_bit, lo_bit) u_field(x, 31-(lo_bit), 31-(hi_bit)) ++ #define opp_s_field(x, hi_bit, lo_bit) s_field(x, 31-(lo_bit), 31-(hi_bit)) ++ ++ // instruction fields ++ static int aa( int x) { return opp_u_field(x, 30, 30); } ++ static int ba( int x) { return opp_u_field(x, 15, 11); } ++ static int bb( int x) { return opp_u_field(x, 20, 16); } ++ static int bc( int x) { return opp_u_field(x, 25, 21); } ++ static int bd( int x) { return opp_s_field(x, 29, 16); } ++ static int bf( ConditionRegister cr) { return bf(cr->encoding()); } ++ static int bf( int x) { return opp_u_field(x, 8, 6); } ++ static int bfa(ConditionRegister cr) { return bfa(cr->encoding()); } ++ static int bfa( int x) { return opp_u_field(x, 13, 11); } ++ static int bh( int x) { return opp_u_field(x, 20, 19); } ++ static int bi( int x) { return opp_u_field(x, 15, 11); } ++ static int bi0(ConditionRegister cr, Condition c) { return (cr->encoding() << 2) | c; } ++ static int bo( int x) { return opp_u_field(x, 10, 6); } ++ static int bt( int x) { return opp_u_field(x, 10, 6); } ++ static int d1( int x) { return opp_s_field(x, 31, 16); } ++ static int ds( int x) { assert((x & 0x3) == 0, "unaligned offset"); return opp_s_field(x, 31, 16); } ++ static int eh( int x) { return opp_u_field(x, 31, 31); } ++ static int flm( int x) { return opp_u_field(x, 14, 7); } ++ static int fra( FloatRegister r) { return fra(r->encoding());} ++ static int frb( FloatRegister r) { return frb(r->encoding());} ++ static int frc( FloatRegister r) { return frc(r->encoding());} ++ static int frs( FloatRegister r) { return frs(r->encoding());} ++ static int frt( FloatRegister r) { return frt(r->encoding());} ++ static int fra( int x) { return opp_u_field(x, 15, 11); } ++ static int frb( int x) { return opp_u_field(x, 20, 16); } ++ static int frc( int x) { return opp_u_field(x, 25, 21); } ++ static int frs( int x) { return opp_u_field(x, 10, 6); } ++ static int frt( int x) { return opp_u_field(x, 10, 6); } ++ static int fxm( int x) { return opp_u_field(x, 19, 12); } ++ static int l10( int x) { return opp_u_field(x, 10, 10); } ++ static int l15( int x) { return opp_u_field(x, 15, 15); } ++ static int l910( int x) { return opp_u_field(x, 10, 9); } ++ static int e1215( int x) { return opp_u_field(x, 15, 12); } ++ static int lev( int x) { return opp_u_field(x, 26, 20); } ++ static int li( int x) { return opp_s_field(x, 29, 6); } ++ static int lk( int x) { return opp_u_field(x, 31, 31); } ++ static int mb2125( int x) { return opp_u_field(x, 25, 21); } ++ static int me2630( int x) { return opp_u_field(x, 30, 26); } ++ static int mb2126( int x) { return opp_u_field(((x & 0x1f) << 1) | ((x & 0x20) >> 5), 26, 21); } ++ static int me2126( int x) { return mb2126(x); } ++ static int nb( int x) { return opp_u_field(x, 20, 16); } ++ //static int opcd( int x) { return opp_u_field(x, 5, 0); } // is contained in our opcodes ++ static int oe( int x) { return opp_u_field(x, 21, 21); } ++ static int ra( Register r) { return ra(r->encoding()); } ++ static int ra( int x) { return opp_u_field(x, 15, 11); } ++ static int rb( Register r) { return rb(r->encoding()); } ++ static int rb( int x) { return opp_u_field(x, 20, 16); } ++ static int rc( int x) { return opp_u_field(x, 31, 31); } ++ static int rs( Register r) { return rs(r->encoding()); } ++ static int rs( int x) { return opp_u_field(x, 10, 6); } ++ // we don't want to use R0 in memory accesses, because it has value `0' then ++ static int ra0mem( Register r) { assert(r != R0, "cannot use register R0 in memory access"); return ra(r); } ++ static int ra0mem( int x) { assert(x != 0, "cannot use register 0 in memory access"); return ra(x); } ++ ++ // register r is target ++ static int rt( Register r) { return rs(r); } ++ static int rt( int x) { return rs(x); } ++ static int rta( Register r) { return ra(r); } ++ static int rta0mem( Register r) { rta(r); return ra0mem(r); } ++ ++ static int sh1620( int x) { return opp_u_field(x, 20, 16); } ++ static int sh30( int x) { return opp_u_field(x, 30, 30); } ++ static int sh162030( int x) { return sh1620(x & 0x1f) | sh30((x & 0x20) >> 5); } ++ static int si( int x) { return opp_s_field(x, 31, 16); } ++ static int spr( int x) { return opp_u_field(x, 20, 11); } ++ static int sr( int x) { return opp_u_field(x, 15, 12); } ++ static int tbr( int x) { return opp_u_field(x, 20, 11); } ++ static int th( int x) { return opp_u_field(x, 10, 7); } ++ static int thct( int x) { assert((x&8) == 0, "must be valid cache specification"); return th(x); } ++ static int thds( int x) { assert((x&8) == 8, "must be valid stream specification"); return th(x); } ++ static int to( int x) { return opp_u_field(x, 10, 6); } ++ static int u( int x) { return opp_u_field(x, 19, 16); } ++ static int ui( int x) { return opp_u_field(x, 31, 16); } ++ ++ // Support vector instructions for >= Power6. ++ static int vra( int x) { return opp_u_field(x, 15, 11); } ++ static int vrb( int x) { return opp_u_field(x, 20, 16); } ++ static int vrc( int x) { return opp_u_field(x, 25, 21); } ++ static int vrs( int x) { return opp_u_field(x, 10, 6); } ++ static int vrt( int x) { return opp_u_field(x, 10, 6); } ++ ++ static int vra( VectorRegister r) { return vra(r->encoding());} ++ static int vrb( VectorRegister r) { return vrb(r->encoding());} ++ static int vrc( VectorRegister r) { return vrc(r->encoding());} ++ static int vrs( VectorRegister r) { return vrs(r->encoding());} ++ static int vrt( VectorRegister r) { return vrt(r->encoding());} ++ ++ static int vsplt_uim( int x) { return opp_u_field(x, 15, 12); } // for vsplt* instructions ++ static int vsplti_sim(int x) { return opp_u_field(x, 15, 11); } // for vsplti* instructions ++ static int vsldoi_shb(int x) { return opp_u_field(x, 25, 22); } // for vsldoi instruction ++ static int vcmp_rc( int x) { return opp_u_field(x, 21, 21); } // for vcmp* instructions ++ ++ //static int xo1( int x) { return opp_u_field(x, 29, 21); }// is contained in our opcodes ++ //static int xo2( int x) { return opp_u_field(x, 30, 21); }// is contained in our opcodes ++ //static int xo3( int x) { return opp_u_field(x, 30, 22); }// is contained in our opcodes ++ //static int xo4( int x) { return opp_u_field(x, 30, 26); }// is contained in our opcodes ++ //static int xo5( int x) { return opp_u_field(x, 29, 27); }// is contained in our opcodes ++ //static int xo6( int x) { return opp_u_field(x, 30, 27); }// is contained in our opcodes ++ //static int xo7( int x) { return opp_u_field(x, 31, 30); }// is contained in our opcodes ++ ++ protected: ++ // Compute relative address for branch. ++ static intptr_t disp(intptr_t x, intptr_t off) { ++ int xx = x - off; ++ xx = xx >> 2; ++ return xx; ++ } ++ ++ public: ++ // signed immediate, in low bits, nbits long ++ static int simm(int x, int nbits) { ++ assert_signed_range(x, nbits); ++ return x & ((1 << nbits) - 1); ++ } ++ ++ // unsigned immediate, in low bits, nbits long ++ static int uimm(int x, int nbits) { ++ assert_unsigned_const(x, nbits); ++ return x & ((1 << nbits) - 1); ++ } ++ ++ static void set_imm(int* instr, short s) { ++ // imm is always in the lower 16 bits of the instruction, ++ // so this is endian-neutral. Same for the get_imm below. ++ uint32_t w = *(uint32_t *)instr; ++ *instr = (int)((w & ~0x0000FFFF) | (s & 0x0000FFFF)); ++ } ++ ++ static int get_imm(address a, int instruction_number) { ++ return (short)((int *)a)[instruction_number]; ++ } ++ ++ static inline int hi16_signed( int x) { return (int)(int16_t)(x >> 16); } ++ static inline int lo16_unsigned(int x) { return x & 0xffff; } ++ ++ protected: ++ ++ // Extract the top 32 bits in a 64 bit word. ++ static int32_t hi32(int64_t x) { ++ int32_t r = int32_t((uint64_t)x >> 32); ++ return r; ++ } ++ ++ public: ++ ++ static inline unsigned int align_addr(unsigned int addr, unsigned int a) { ++ return ((addr + (a - 1)) & ~(a - 1)); ++ } ++ ++ static inline bool is_aligned(unsigned int addr, unsigned int a) { ++ return (0 == addr % a); ++ } ++ ++ void flush() { ++ AbstractAssembler::flush(); ++ } ++ ++ inline void emit_int32(int); // shadows AbstractAssembler::emit_int32 ++ inline void emit_data(int); ++ inline void emit_data(int, RelocationHolder const&); ++ inline void emit_data(int, relocInfo::relocType rtype); ++ ++ // Emit an address. ++ inline address emit_addr(const address addr = NULL); ++ ++#if !defined(ABI_ELFv2) ++ // Emit a function descriptor with the specified entry point, TOC, ++ // and ENV. If the entry point is NULL, the descriptor will point ++ // just past the descriptor. ++ // Use values from friend functions as defaults. ++ inline address emit_fd(address entry = NULL, ++ address toc = (address) FunctionDescriptor::friend_toc, ++ address env = (address) FunctionDescriptor::friend_env); ++#endif ++ ++ ///////////////////////////////////////////////////////////////////////////////////// ++ // PPC instructions ++ ///////////////////////////////////////////////////////////////////////////////////// ++ ++ // Memory instructions use r0 as hard coded 0, e.g. to simulate loading ++ // immediates. The normal instruction encoders enforce that r0 is not ++ // passed to them. Use either extended mnemonics encoders or the special ra0 ++ // versions. ++ ++ // Issue an illegal instruction. ++ inline void illtrap(); ++ static inline bool is_illtrap(int x); ++ ++ // PPC 1, section 3.3.8, Fixed-Point Arithmetic Instructions ++ inline void addi( Register d, Register a, int si16); ++ inline void addis(Register d, Register a, int si16); ++ private: ++ inline void addi_r0ok( Register d, Register a, int si16); ++ inline void addis_r0ok(Register d, Register a, int si16); ++ public: ++ inline void addic_( Register d, Register a, int si16); ++ inline void subfic( Register d, Register a, int si16); ++ inline void add( Register d, Register a, Register b); ++ inline void add_( Register d, Register a, Register b); ++ inline void subf( Register d, Register a, Register b); // d = b - a "Sub_from", as in ppc spec. ++ inline void sub( Register d, Register a, Register b); // d = a - b Swap operands of subf for readability. ++ inline void subf_( Register d, Register a, Register b); ++ inline void addc( Register d, Register a, Register b); ++ inline void addc_( Register d, Register a, Register b); ++ inline void subfc( Register d, Register a, Register b); ++ inline void subfc_( Register d, Register a, Register b); ++ inline void adde( Register d, Register a, Register b); ++ inline void adde_( Register d, Register a, Register b); ++ inline void subfe( Register d, Register a, Register b); ++ inline void subfe_( Register d, Register a, Register b); ++ inline void neg( Register d, Register a); ++ inline void neg_( Register d, Register a); ++ inline void mulli( Register d, Register a, int si16); ++ inline void mulld( Register d, Register a, Register b); ++ inline void mulld_( Register d, Register a, Register b); ++ inline void mullw( Register d, Register a, Register b); ++ inline void mullw_( Register d, Register a, Register b); ++ inline void mulhw( Register d, Register a, Register b); ++ inline void mulhw_( Register d, Register a, Register b); ++ inline void mulhd( Register d, Register a, Register b); ++ inline void mulhd_( Register d, Register a, Register b); ++ inline void mulhdu( Register d, Register a, Register b); ++ inline void mulhdu_(Register d, Register a, Register b); ++ inline void divd( Register d, Register a, Register b); ++ inline void divd_( Register d, Register a, Register b); ++ inline void divw( Register d, Register a, Register b); ++ inline void divw_( Register d, Register a, Register b); ++ ++ // extended mnemonics ++ inline void li( Register d, int si16); ++ inline void lis( Register d, int si16); ++ inline void addir(Register d, int si16, Register a); ++ ++ static bool is_addi(int x) { ++ return ADDI_OPCODE == (x & ADDI_OPCODE_MASK); ++ } ++ static bool is_addis(int x) { ++ return ADDIS_OPCODE == (x & ADDIS_OPCODE_MASK); ++ } ++ static bool is_bxx(int x) { ++ return BXX_OPCODE == (x & BXX_OPCODE_MASK); ++ } ++ static bool is_b(int x) { ++ return BXX_OPCODE == (x & BXX_OPCODE_MASK) && inv_lk_field(x) == 0; ++ } ++ static bool is_bl(int x) { ++ return BXX_OPCODE == (x & BXX_OPCODE_MASK) && inv_lk_field(x) == 1; ++ } ++ static bool is_bcxx(int x) { ++ return BCXX_OPCODE == (x & BCXX_OPCODE_MASK); ++ } ++ static bool is_bxx_or_bcxx(int x) { ++ return is_bxx(x) || is_bcxx(x); ++ } ++ static bool is_bctrl(int x) { ++ return x == 0x4e800421; ++ } ++ static bool is_bctr(int x) { ++ return x == 0x4e800420; ++ } ++ static bool is_bclr(int x) { ++ return BCLR_OPCODE == (x & XL_FORM_OPCODE_MASK); ++ } ++ static bool is_li(int x) { ++ return is_addi(x) && inv_ra_field(x)==0; ++ } ++ static bool is_lis(int x) { ++ return is_addis(x) && inv_ra_field(x)==0; ++ } ++ static bool is_mtctr(int x) { ++ return MTCTR_OPCODE == (x & MTCTR_OPCODE_MASK); ++ } ++ static bool is_ld(int x) { ++ return LD_OPCODE == (x & LD_OPCODE_MASK); ++ } ++ static bool is_std(int x) { ++ return STD_OPCODE == (x & STD_OPCODE_MASK); ++ } ++ static bool is_stdu(int x) { ++ return STDU_OPCODE == (x & STDU_OPCODE_MASK); ++ } ++ static bool is_stdx(int x) { ++ return STDX_OPCODE == (x & STDX_OPCODE_MASK); ++ } ++ static bool is_stdux(int x) { ++ return STDUX_OPCODE == (x & STDUX_OPCODE_MASK); ++ } ++ static bool is_stwx(int x) { ++ return STWX_OPCODE == (x & STWX_OPCODE_MASK); ++ } ++ static bool is_stwux(int x) { ++ return STWUX_OPCODE == (x & STWUX_OPCODE_MASK); ++ } ++ static bool is_stw(int x) { ++ return STW_OPCODE == (x & STW_OPCODE_MASK); ++ } ++ static bool is_stwu(int x) { ++ return STWU_OPCODE == (x & STWU_OPCODE_MASK); ++ } ++ static bool is_ori(int x) { ++ return ORI_OPCODE == (x & ORI_OPCODE_MASK); ++ }; ++ static bool is_oris(int x) { ++ return ORIS_OPCODE == (x & ORIS_OPCODE_MASK); ++ }; ++ static bool is_rldicr(int x) { ++ return (RLDICR_OPCODE == (x & RLDICR_OPCODE_MASK)); ++ }; ++ static bool is_nop(int x) { ++ return x == 0x60000000; ++ } ++ // endgroup opcode for Power6 ++ static bool is_endgroup(int x) { ++ return is_ori(x) && inv_ra_field(x) == 1 && inv_rs_field(x) == 1 && inv_d1_field(x) == 0; ++ } ++ ++ ++ private: ++ // PPC 1, section 3.3.9, Fixed-Point Compare Instructions ++ inline void cmpi( ConditionRegister bf, int l, Register a, int si16); ++ inline void cmp( ConditionRegister bf, int l, Register a, Register b); ++ inline void cmpli(ConditionRegister bf, int l, Register a, int ui16); ++ inline void cmpl( ConditionRegister bf, int l, Register a, Register b); ++ ++ public: ++ // extended mnemonics of Compare Instructions ++ inline void cmpwi( ConditionRegister crx, Register a, int si16); ++ inline void cmpdi( ConditionRegister crx, Register a, int si16); ++ inline void cmpw( ConditionRegister crx, Register a, Register b); ++ inline void cmpd( ConditionRegister crx, Register a, Register b); ++ inline void cmplwi(ConditionRegister crx, Register a, int ui16); ++ inline void cmpldi(ConditionRegister crx, Register a, int ui16); ++ inline void cmplw( ConditionRegister crx, Register a, Register b); ++ inline void cmpld( ConditionRegister crx, Register a, Register b); ++ ++ inline void isel( Register d, Register a, Register b, int bc); ++ // Convenient version which takes: Condition register, Condition code and invert flag. Omit b to keep old value. ++ inline void isel( Register d, ConditionRegister cr, Condition cc, bool inv, Register a, Register b = noreg); ++ // Set d = 0 if (cr.cc) equals 1, otherwise b. ++ inline void isel_0( Register d, ConditionRegister cr, Condition cc, Register b = noreg); ++ ++ // PPC 1, section 3.3.11, Fixed-Point Logical Instructions ++ void andi( Register a, Register s, int ui16); // optimized version ++ inline void andi_( Register a, Register s, int ui16); ++ inline void andis_( Register a, Register s, int ui16); ++ inline void ori( Register a, Register s, int ui16); ++ inline void oris( Register a, Register s, int ui16); ++ inline void xori( Register a, Register s, int ui16); ++ inline void xoris( Register a, Register s, int ui16); ++ inline void andr( Register a, Register s, Register b); // suffixed by 'r' as 'and' is C++ keyword ++ inline void and_( Register a, Register s, Register b); ++ // Turn or0(rx,rx,rx) into a nop and avoid that we accidently emit a ++ // SMT-priority change instruction (see SMT instructions below). ++ inline void or_unchecked(Register a, Register s, Register b); ++ inline void orr( Register a, Register s, Register b); // suffixed by 'r' as 'or' is C++ keyword ++ inline void or_( Register a, Register s, Register b); ++ inline void xorr( Register a, Register s, Register b); // suffixed by 'r' as 'xor' is C++ keyword ++ inline void xor_( Register a, Register s, Register b); ++ inline void nand( Register a, Register s, Register b); ++ inline void nand_( Register a, Register s, Register b); ++ inline void nor( Register a, Register s, Register b); ++ inline void nor_( Register a, Register s, Register b); ++ inline void andc( Register a, Register s, Register b); ++ inline void andc_( Register a, Register s, Register b); ++ inline void orc( Register a, Register s, Register b); ++ inline void orc_( Register a, Register s, Register b); ++ inline void extsb( Register a, Register s); ++ inline void extsh( Register a, Register s); ++ inline void extsw( Register a, Register s); ++ ++ // extended mnemonics ++ inline void nop(); ++ // NOP for FP and BR units (different versions to allow them to be in one group) ++ inline void fpnop0(); ++ inline void fpnop1(); ++ inline void brnop0(); ++ inline void brnop1(); ++ inline void brnop2(); ++ ++ inline void mr( Register d, Register s); ++ inline void ori_opt( Register d, int ui16); ++ inline void oris_opt(Register d, int ui16); ++ ++ // endgroup opcode for Power6 ++ inline void endgroup(); ++ ++ // count instructions ++ inline void cntlzw( Register a, Register s); ++ inline void cntlzw_( Register a, Register s); ++ inline void cntlzd( Register a, Register s); ++ inline void cntlzd_( Register a, Register s); ++ ++ // PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions ++ inline void sld( Register a, Register s, Register b); ++ inline void sld_( Register a, Register s, Register b); ++ inline void slw( Register a, Register s, Register b); ++ inline void slw_( Register a, Register s, Register b); ++ inline void srd( Register a, Register s, Register b); ++ inline void srd_( Register a, Register s, Register b); ++ inline void srw( Register a, Register s, Register b); ++ inline void srw_( Register a, Register s, Register b); ++ inline void srad( Register a, Register s, Register b); ++ inline void srad_( Register a, Register s, Register b); ++ inline void sraw( Register a, Register s, Register b); ++ inline void sraw_( Register a, Register s, Register b); ++ inline void sradi( Register a, Register s, int sh6); ++ inline void sradi_( Register a, Register s, int sh6); ++ inline void srawi( Register a, Register s, int sh5); ++ inline void srawi_( Register a, Register s, int sh5); ++ ++ // extended mnemonics for Shift Instructions ++ inline void sldi( Register a, Register s, int sh6); ++ inline void sldi_( Register a, Register s, int sh6); ++ inline void slwi( Register a, Register s, int sh5); ++ inline void slwi_( Register a, Register s, int sh5); ++ inline void srdi( Register a, Register s, int sh6); ++ inline void srdi_( Register a, Register s, int sh6); ++ inline void srwi( Register a, Register s, int sh5); ++ inline void srwi_( Register a, Register s, int sh5); ++ ++ inline void clrrdi( Register a, Register s, int ui6); ++ inline void clrrdi_( Register a, Register s, int ui6); ++ inline void clrldi( Register a, Register s, int ui6); ++ inline void clrldi_( Register a, Register s, int ui6); ++ inline void clrlsldi(Register a, Register s, int clrl6, int shl6); ++ inline void clrlsldi_(Register a, Register s, int clrl6, int shl6); ++ inline void extrdi( Register a, Register s, int n, int b); ++ // testbit with condition register ++ inline void testbitdi(ConditionRegister cr, Register a, Register s, int ui6); ++ ++ // rotate instructions ++ inline void rotldi( Register a, Register s, int n); ++ inline void rotrdi( Register a, Register s, int n); ++ inline void rotlwi( Register a, Register s, int n); ++ inline void rotrwi( Register a, Register s, int n); ++ ++ // Rotate Instructions ++ inline void rldic( Register a, Register s, int sh6, int mb6); ++ inline void rldic_( Register a, Register s, int sh6, int mb6); ++ inline void rldicr( Register a, Register s, int sh6, int mb6); ++ inline void rldicr_( Register a, Register s, int sh6, int mb6); ++ inline void rldicl( Register a, Register s, int sh6, int mb6); ++ inline void rldicl_( Register a, Register s, int sh6, int mb6); ++ inline void rlwinm( Register a, Register s, int sh5, int mb5, int me5); ++ inline void rlwinm_( Register a, Register s, int sh5, int mb5, int me5); ++ inline void rldimi( Register a, Register s, int sh6, int mb6); ++ inline void rldimi_( Register a, Register s, int sh6, int mb6); ++ inline void rlwimi( Register a, Register s, int sh5, int mb5, int me5); ++ inline void insrdi( Register a, Register s, int n, int b); ++ inline void insrwi( Register a, Register s, int n, int b); ++ ++ // PPC 1, section 3.3.2 Fixed-Point Load Instructions ++ // 4 bytes ++ inline void lwzx( Register d, Register s1, Register s2); ++ inline void lwz( Register d, int si16, Register s1); ++ inline void lwzu( Register d, int si16, Register s1); ++ ++ // 4 bytes ++ inline void lwax( Register d, Register s1, Register s2); ++ inline void lwa( Register d, int si16, Register s1); ++ ++ // 2 bytes ++ inline void lhzx( Register d, Register s1, Register s2); ++ inline void lhz( Register d, int si16, Register s1); ++ inline void lhzu( Register d, int si16, Register s1); ++ ++ // 2 bytes ++ inline void lhax( Register d, Register s1, Register s2); ++ inline void lha( Register d, int si16, Register s1); ++ inline void lhau( Register d, int si16, Register s1); ++ ++ // 1 byte ++ inline void lbzx( Register d, Register s1, Register s2); ++ inline void lbz( Register d, int si16, Register s1); ++ inline void lbzu( Register d, int si16, Register s1); ++ ++ // 8 bytes ++ inline void ldx( Register d, Register s1, Register s2); ++ inline void ld( Register d, int si16, Register s1); ++ inline void ldu( Register d, int si16, Register s1); ++ ++ // PPC 1, section 3.3.3 Fixed-Point Store Instructions ++ inline void stwx( Register d, Register s1, Register s2); ++ inline void stw( Register d, int si16, Register s1); ++ inline void stwu( Register d, int si16, Register s1); ++ ++ inline void sthx( Register d, Register s1, Register s2); ++ inline void sth( Register d, int si16, Register s1); ++ inline void sthu( Register d, int si16, Register s1); ++ ++ inline void stbx( Register d, Register s1, Register s2); ++ inline void stb( Register d, int si16, Register s1); ++ inline void stbu( Register d, int si16, Register s1); ++ ++ inline void stdx( Register d, Register s1, Register s2); ++ inline void std( Register d, int si16, Register s1); ++ inline void stdu( Register d, int si16, Register s1); ++ inline void stdux(Register s, Register a, Register b); ++ ++ // PPC 1, section 3.3.13 Move To/From System Register Instructions ++ inline void mtlr( Register s1); ++ inline void mflr( Register d); ++ inline void mtctr(Register s1); ++ inline void mfctr(Register d); ++ inline void mtcrf(int fxm, Register s); ++ inline void mfcr( Register d); ++ inline void mcrf( ConditionRegister crd, ConditionRegister cra); ++ inline void mtcr( Register s); ++ ++ // PPC 1, section 2.4.1 Branch Instructions ++ inline void b( address a, relocInfo::relocType rt = relocInfo::none); ++ inline void b( Label& L); ++ inline void bl( address a, relocInfo::relocType rt = relocInfo::none); ++ inline void bl( Label& L); ++ inline void bc( int boint, int biint, address a, relocInfo::relocType rt = relocInfo::none); ++ inline void bc( int boint, int biint, Label& L); ++ inline void bcl(int boint, int biint, address a, relocInfo::relocType rt = relocInfo::none); ++ inline void bcl(int boint, int biint, Label& L); ++ ++ inline void bclr( int boint, int biint, int bhint, relocInfo::relocType rt = relocInfo::none); ++ inline void bclrl( int boint, int biint, int bhint, relocInfo::relocType rt = relocInfo::none); ++ inline void bcctr( int boint, int biint, int bhint = bhintbhBCCTRisNotReturnButSame, ++ relocInfo::relocType rt = relocInfo::none); ++ inline void bcctrl(int boint, int biint, int bhint = bhintbhBCLRisReturn, ++ relocInfo::relocType rt = relocInfo::none); ++ ++ // helper function for b, bcxx ++ inline bool is_within_range_of_b(address a, address pc); ++ inline bool is_within_range_of_bcxx(address a, address pc); ++ ++ // get the destination of a bxx branch (b, bl, ba, bla) ++ static inline address bxx_destination(address baddr); ++ static inline address bxx_destination(int instr, address pc); ++ static inline intptr_t bxx_destination_offset(int instr, intptr_t bxx_pos); ++ ++ // extended mnemonics for branch instructions ++ inline void blt(ConditionRegister crx, Label& L); ++ inline void bgt(ConditionRegister crx, Label& L); ++ inline void beq(ConditionRegister crx, Label& L); ++ inline void bso(ConditionRegister crx, Label& L); ++ inline void bge(ConditionRegister crx, Label& L); ++ inline void ble(ConditionRegister crx, Label& L); ++ inline void bne(ConditionRegister crx, Label& L); ++ inline void bns(ConditionRegister crx, Label& L); ++ ++ // Branch instructions with static prediction hints. ++ inline void blt_predict_taken( ConditionRegister crx, Label& L); ++ inline void bgt_predict_taken( ConditionRegister crx, Label& L); ++ inline void beq_predict_taken( ConditionRegister crx, Label& L); ++ inline void bso_predict_taken( ConditionRegister crx, Label& L); ++ inline void bge_predict_taken( ConditionRegister crx, Label& L); ++ inline void ble_predict_taken( ConditionRegister crx, Label& L); ++ inline void bne_predict_taken( ConditionRegister crx, Label& L); ++ inline void bns_predict_taken( ConditionRegister crx, Label& L); ++ inline void blt_predict_not_taken(ConditionRegister crx, Label& L); ++ inline void bgt_predict_not_taken(ConditionRegister crx, Label& L); ++ inline void beq_predict_not_taken(ConditionRegister crx, Label& L); ++ inline void bso_predict_not_taken(ConditionRegister crx, Label& L); ++ inline void bge_predict_not_taken(ConditionRegister crx, Label& L); ++ inline void ble_predict_not_taken(ConditionRegister crx, Label& L); ++ inline void bne_predict_not_taken(ConditionRegister crx, Label& L); ++ inline void bns_predict_not_taken(ConditionRegister crx, Label& L); ++ ++ // for use in conjunction with testbitdi: ++ inline void btrue( ConditionRegister crx, Label& L); ++ inline void bfalse(ConditionRegister crx, Label& L); ++ ++ inline void bltl(ConditionRegister crx, Label& L); ++ inline void bgtl(ConditionRegister crx, Label& L); ++ inline void beql(ConditionRegister crx, Label& L); ++ inline void bsol(ConditionRegister crx, Label& L); ++ inline void bgel(ConditionRegister crx, Label& L); ++ inline void blel(ConditionRegister crx, Label& L); ++ inline void bnel(ConditionRegister crx, Label& L); ++ inline void bnsl(ConditionRegister crx, Label& L); ++ ++ // extended mnemonics for Branch Instructions via LR ++ // We use `blr' for returns. ++ inline void blr(relocInfo::relocType rt = relocInfo::none); ++ ++ // extended mnemonics for Branch Instructions with CTR ++ // bdnz means `decrement CTR and jump to L if CTR is not zero' ++ inline void bdnz(Label& L); ++ // Decrement and branch if result is zero. ++ inline void bdz(Label& L); ++ // we use `bctr[l]' for jumps/calls in function descriptor glue ++ // code, e.g. calls to runtime functions ++ inline void bctr( relocInfo::relocType rt = relocInfo::none); ++ inline void bctrl(relocInfo::relocType rt = relocInfo::none); ++ // conditional jumps/branches via CTR ++ inline void beqctr( ConditionRegister crx, relocInfo::relocType rt = relocInfo::none); ++ inline void beqctrl(ConditionRegister crx, relocInfo::relocType rt = relocInfo::none); ++ inline void bnectr( ConditionRegister crx, relocInfo::relocType rt = relocInfo::none); ++ inline void bnectrl(ConditionRegister crx, relocInfo::relocType rt = relocInfo::none); ++ ++ // condition register logic instructions ++ inline void crand( int d, int s1, int s2); ++ inline void crnand(int d, int s1, int s2); ++ inline void cror( int d, int s1, int s2); ++ inline void crxor( int d, int s1, int s2); ++ inline void crnor( int d, int s1, int s2); ++ inline void creqv( int d, int s1, int s2); ++ inline void crandc(int d, int s1, int s2); ++ inline void crorc( int d, int s1, int s2); ++ ++ // icache and dcache related instructions ++ inline void icbi( Register s1, Register s2); ++ //inline void dcba(Register s1, Register s2); // Instruction for embedded processor only. ++ inline void dcbz( Register s1, Register s2); ++ inline void dcbst( Register s1, Register s2); ++ inline void dcbf( Register s1, Register s2); ++ ++ enum ct_cache_specification { ++ ct_primary_cache = 0, ++ ct_secondary_cache = 2 ++ }; ++ // dcache read hint ++ inline void dcbt( Register s1, Register s2); ++ inline void dcbtct( Register s1, Register s2, int ct); ++ inline void dcbtds( Register s1, Register s2, int ds); ++ // dcache write hint ++ inline void dcbtst( Register s1, Register s2); ++ inline void dcbtstct(Register s1, Register s2, int ct); ++ ++ // machine barrier instructions: ++ // ++ // - sync two-way memory barrier, aka fence ++ // - lwsync orders Store|Store, ++ // Load|Store, ++ // Load|Load, ++ // but not Store|Load ++ // - eieio orders memory accesses for device memory (only) ++ // - isync invalidates speculatively executed instructions ++ // From the Power ISA 2.06 documentation: ++ // "[...] an isync instruction prevents the execution of ++ // instructions following the isync until instructions ++ // preceding the isync have completed, [...]" ++ // From IBM's AIX assembler reference: ++ // "The isync [...] instructions causes the processor to ++ // refetch any instructions that might have been fetched ++ // prior to the isync instruction. The instruction isync ++ // causes the processor to wait for all previous instructions ++ // to complete. Then any instructions already fetched are ++ // discarded and instruction processing continues in the ++ // environment established by the previous instructions." ++ // ++ // semantic barrier instructions: ++ // (as defined in orderAccess.hpp) ++ // ++ // - release orders Store|Store, (maps to lwsync) ++ // Load|Store ++ // - acquire orders Load|Store, (maps to lwsync) ++ // Load|Load ++ // - fence orders Store|Store, (maps to sync) ++ // Load|Store, ++ // Load|Load, ++ // Store|Load ++ // ++ private: ++ inline void sync(int l); ++ public: ++ inline void sync(); ++ inline void lwsync(); ++ inline void ptesync(); ++ inline void eieio(); ++ inline void isync(); ++ inline void elemental_membar(int e); // Elemental Memory Barriers (>=Power 8) ++ ++ // atomics ++ inline void lwarx_unchecked(Register d, Register a, Register b, int eh1 = 0); ++ inline void ldarx_unchecked(Register d, Register a, Register b, int eh1 = 0); ++ inline bool lxarx_hint_exclusive_access(); ++ inline void lwarx( Register d, Register a, Register b, bool hint_exclusive_access = false); ++ inline void ldarx( Register d, Register a, Register b, bool hint_exclusive_access = false); ++ inline void stwcx_( Register s, Register a, Register b); ++ inline void stdcx_( Register s, Register a, Register b); ++ ++ // Instructions for adjusting thread priority for simultaneous ++ // multithreading (SMT) on Power5. ++ private: ++ inline void smt_prio_very_low(); ++ inline void smt_prio_medium_high(); ++ inline void smt_prio_high(); ++ ++ public: ++ inline void smt_prio_low(); ++ inline void smt_prio_medium_low(); ++ inline void smt_prio_medium(); ++ ++ // trap instructions ++ inline void twi_0(Register a); // for load with acquire semantics use load+twi_0+isync (trap can't occur) ++ // NOT FOR DIRECT USE!! ++ protected: ++ inline void tdi_unchecked(int tobits, Register a, int si16); ++ inline void twi_unchecked(int tobits, Register a, int si16); ++ inline void tdi( int tobits, Register a, int si16); // asserts UseSIGTRAP ++ inline void twi( int tobits, Register a, int si16); // asserts UseSIGTRAP ++ inline void td( int tobits, Register a, Register b); // asserts UseSIGTRAP ++ inline void tw( int tobits, Register a, Register b); // asserts UseSIGTRAP ++ ++ static bool is_tdi(int x, int tobits, int ra, int si16) { ++ return (TDI_OPCODE == (x & TDI_OPCODE_MASK)) ++ && (tobits == inv_to_field(x)) ++ && (ra == -1/*any reg*/ || ra == inv_ra_field(x)) ++ && (si16 == inv_si_field(x)); ++ } ++ ++ static bool is_twi(int x, int tobits, int ra, int si16) { ++ return (TWI_OPCODE == (x & TWI_OPCODE_MASK)) ++ && (tobits == inv_to_field(x)) ++ && (ra == -1/*any reg*/ || ra == inv_ra_field(x)) ++ && (si16 == inv_si_field(x)); ++ } ++ ++ static bool is_twi(int x, int tobits, int ra) { ++ return (TWI_OPCODE == (x & TWI_OPCODE_MASK)) ++ && (tobits == inv_to_field(x)) ++ && (ra == -1/*any reg*/ || ra == inv_ra_field(x)); ++ } ++ ++ static bool is_td(int x, int tobits, int ra, int rb) { ++ return (TD_OPCODE == (x & TD_OPCODE_MASK)) ++ && (tobits == inv_to_field(x)) ++ && (ra == -1/*any reg*/ || ra == inv_ra_field(x)) ++ && (rb == -1/*any reg*/ || rb == inv_rb_field(x)); ++ } ++ ++ static bool is_tw(int x, int tobits, int ra, int rb) { ++ return (TW_OPCODE == (x & TW_OPCODE_MASK)) ++ && (tobits == inv_to_field(x)) ++ && (ra == -1/*any reg*/ || ra == inv_ra_field(x)) ++ && (rb == -1/*any reg*/ || rb == inv_rb_field(x)); ++ } ++ ++ public: ++ // PPC floating point instructions ++ // PPC 1, section 4.6.2 Floating-Point Load Instructions ++ inline void lfs( FloatRegister d, int si16, Register a); ++ inline void lfsu( FloatRegister d, int si16, Register a); ++ inline void lfsx( FloatRegister d, Register a, Register b); ++ inline void lfd( FloatRegister d, int si16, Register a); ++ inline void lfdu( FloatRegister d, int si16, Register a); ++ inline void lfdx( FloatRegister d, Register a, Register b); ++ ++ // PPC 1, section 4.6.3 Floating-Point Store Instructions ++ inline void stfs( FloatRegister s, int si16, Register a); ++ inline void stfsu( FloatRegister s, int si16, Register a); ++ inline void stfsx( FloatRegister s, Register a, Register b); ++ inline void stfd( FloatRegister s, int si16, Register a); ++ inline void stfdu( FloatRegister s, int si16, Register a); ++ inline void stfdx( FloatRegister s, Register a, Register b); ++ ++ // PPC 1, section 4.6.4 Floating-Point Move Instructions ++ inline void fmr( FloatRegister d, FloatRegister b); ++ inline void fmr_( FloatRegister d, FloatRegister b); ++ ++ // inline void mffgpr( FloatRegister d, Register b); ++ // inline void mftgpr( Register d, FloatRegister b); ++ inline void cmpb( Register a, Register s, Register b); ++ inline void popcntb(Register a, Register s); ++ inline void popcntw(Register a, Register s); ++ inline void popcntd(Register a, Register s); ++ ++ inline void fneg( FloatRegister d, FloatRegister b); ++ inline void fneg_( FloatRegister d, FloatRegister b); ++ inline void fabs( FloatRegister d, FloatRegister b); ++ inline void fabs_( FloatRegister d, FloatRegister b); ++ inline void fnabs( FloatRegister d, FloatRegister b); ++ inline void fnabs_(FloatRegister d, FloatRegister b); ++ ++ // PPC 1, section 4.6.5.1 Floating-Point Elementary Arithmetic Instructions ++ inline void fadd( FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fadd_( FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fadds( FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fadds_(FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fsub( FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fsub_( FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fsubs( FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fsubs_(FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fmul( FloatRegister d, FloatRegister a, FloatRegister c); ++ inline void fmul_( FloatRegister d, FloatRegister a, FloatRegister c); ++ inline void fmuls( FloatRegister d, FloatRegister a, FloatRegister c); ++ inline void fmuls_(FloatRegister d, FloatRegister a, FloatRegister c); ++ inline void fdiv( FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fdiv_( FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fdivs( FloatRegister d, FloatRegister a, FloatRegister b); ++ inline void fdivs_(FloatRegister d, FloatRegister a, FloatRegister b); ++ ++ // PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions ++ inline void frsp( FloatRegister d, FloatRegister b); ++ inline void fctid( FloatRegister d, FloatRegister b); ++ inline void fctidz(FloatRegister d, FloatRegister b); ++ inline void fctiw( FloatRegister d, FloatRegister b); ++ inline void fctiwz(FloatRegister d, FloatRegister b); ++ inline void fcfid( FloatRegister d, FloatRegister b); ++ inline void fcfids(FloatRegister d, FloatRegister b); ++ ++ // PPC 1, section 4.6.7 Floating-Point Compare Instructions ++ inline void fcmpu( ConditionRegister crx, FloatRegister a, FloatRegister b); ++ ++ inline void fsqrt( FloatRegister d, FloatRegister b); ++ inline void fsqrts(FloatRegister d, FloatRegister b); ++ ++ // Vector instructions for >= Power6. ++ inline void lvebx( VectorRegister d, Register s1, Register s2); ++ inline void lvehx( VectorRegister d, Register s1, Register s2); ++ inline void lvewx( VectorRegister d, Register s1, Register s2); ++ inline void lvx( VectorRegister d, Register s1, Register s2); ++ inline void lvxl( VectorRegister d, Register s1, Register s2); ++ inline void stvebx( VectorRegister d, Register s1, Register s2); ++ inline void stvehx( VectorRegister d, Register s1, Register s2); ++ inline void stvewx( VectorRegister d, Register s1, Register s2); ++ inline void stvx( VectorRegister d, Register s1, Register s2); ++ inline void stvxl( VectorRegister d, Register s1, Register s2); ++ inline void lvsl( VectorRegister d, Register s1, Register s2); ++ inline void lvsr( VectorRegister d, Register s1, Register s2); ++ inline void vpkpx( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vpkshss( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vpkswss( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vpkshus( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vpkswus( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vpkuhum( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vpkuwum( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vpkuhus( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vpkuwus( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vupkhpx( VectorRegister d, VectorRegister b); ++ inline void vupkhsb( VectorRegister d, VectorRegister b); ++ inline void vupkhsh( VectorRegister d, VectorRegister b); ++ inline void vupklpx( VectorRegister d, VectorRegister b); ++ inline void vupklsb( VectorRegister d, VectorRegister b); ++ inline void vupklsh( VectorRegister d, VectorRegister b); ++ inline void vmrghb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmrghw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmrghh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmrglb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmrglw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmrglh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsplt( VectorRegister d, int ui4, VectorRegister b); ++ inline void vsplth( VectorRegister d, int ui3, VectorRegister b); ++ inline void vspltw( VectorRegister d, int ui2, VectorRegister b); ++ inline void vspltisb( VectorRegister d, int si5); ++ inline void vspltish( VectorRegister d, int si5); ++ inline void vspltisw( VectorRegister d, int si5); ++ inline void vperm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vsel( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vsl( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsldoi( VectorRegister d, VectorRegister a, VectorRegister b, int si4); ++ inline void vslo( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsr( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsro( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vaddcuw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vaddshs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vaddsbs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vaddsws( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vaddubm( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vadduwm( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vadduhm( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vaddubs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vadduws( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vadduhs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsubcuw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsubshs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsubsbs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsubsws( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsububm( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsubuwm( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsubuhm( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsububs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsubuws( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsubuhs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmulesb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmuleub( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmulesh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmuleuh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmulosb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmuloub( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmulosh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmulouh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmhaddshs(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vmhraddshs(VectorRegister d,VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vmladduhm(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vmsubuhm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vmsummbm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vmsumshm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vmsumshs( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vmsumuhm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vmsumuhs( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c); ++ inline void vsumsws( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsum2sws( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsum4sbs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsum4ubs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsum4shs( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vavgsb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vavgsw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vavgsh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vavgub( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vavguw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vavguh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmaxsb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmaxsw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmaxsh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmaxub( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmaxuw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vmaxuh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vminsb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vminsw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vminsh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vminub( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vminuw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vminuh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpequb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpequh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpequw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtsh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtsb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtsw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtub( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtuh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtuw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpequb_(VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpequh_(VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpequw_(VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtsh_(VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtsb_(VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtsw_(VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtub_(VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtuh_(VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vcmpgtuw_(VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vand( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vandc( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vnor( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vor( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vxor( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vrlb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vrlw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vrlh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vslb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vskw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vslh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsrb( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsrw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsrh( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsrab( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsraw( VectorRegister d, VectorRegister a, VectorRegister b); ++ inline void vsrah( VectorRegister d, VectorRegister a, VectorRegister b); ++ // Vector Floating-Point not implemented yet ++ inline void mtvscr( VectorRegister b); ++ inline void mfvscr( VectorRegister d); ++ ++ // The following encoders use r0 as second operand. These instructions ++ // read r0 as '0'. ++ inline void lwzx( Register d, Register s2); ++ inline void lwz( Register d, int si16); ++ inline void lwax( Register d, Register s2); ++ inline void lwa( Register d, int si16); ++ inline void lhzx( Register d, Register s2); ++ inline void lhz( Register d, int si16); ++ inline void lhax( Register d, Register s2); ++ inline void lha( Register d, int si16); ++ inline void lbzx( Register d, Register s2); ++ inline void lbz( Register d, int si16); ++ inline void ldx( Register d, Register s2); ++ inline void ld( Register d, int si16); ++ inline void stwx( Register d, Register s2); ++ inline void stw( Register d, int si16); ++ inline void sthx( Register d, Register s2); ++ inline void sth( Register d, int si16); ++ inline void stbx( Register d, Register s2); ++ inline void stb( Register d, int si16); ++ inline void stdx( Register d, Register s2); ++ inline void std( Register d, int si16); ++ ++ // PPC 2, section 3.2.1 Instruction Cache Instructions ++ inline void icbi( Register s2); ++ // PPC 2, section 3.2.2 Data Cache Instructions ++ //inlinevoid dcba( Register s2); // Instruction for embedded processor only. ++ inline void dcbz( Register s2); ++ inline void dcbst( Register s2); ++ inline void dcbf( Register s2); ++ // dcache read hint ++ inline void dcbt( Register s2); ++ inline void dcbtct( Register s2, int ct); ++ inline void dcbtds( Register s2, int ds); ++ // dcache write hint ++ inline void dcbtst( Register s2); ++ inline void dcbtstct(Register s2, int ct); ++ ++ // Atomics: use ra0mem to disallow R0 as base. ++ inline void lwarx_unchecked(Register d, Register b, int eh1); ++ inline void ldarx_unchecked(Register d, Register b, int eh1); ++ inline void lwarx( Register d, Register b, bool hint_exclusive_access); ++ inline void ldarx( Register d, Register b, bool hint_exclusive_access); ++ inline void stwcx_(Register s, Register b); ++ inline void stdcx_(Register s, Register b); ++ inline void lfs( FloatRegister d, int si16); ++ inline void lfsx( FloatRegister d, Register b); ++ inline void lfd( FloatRegister d, int si16); ++ inline void lfdx( FloatRegister d, Register b); ++ inline void stfs( FloatRegister s, int si16); ++ inline void stfsx( FloatRegister s, Register b); ++ inline void stfd( FloatRegister s, int si16); ++ inline void stfdx( FloatRegister s, Register b); ++ inline void lvebx( VectorRegister d, Register s2); ++ inline void lvehx( VectorRegister d, Register s2); ++ inline void lvewx( VectorRegister d, Register s2); ++ inline void lvx( VectorRegister d, Register s2); ++ inline void lvxl( VectorRegister d, Register s2); ++ inline void stvebx(VectorRegister d, Register s2); ++ inline void stvehx(VectorRegister d, Register s2); ++ inline void stvewx(VectorRegister d, Register s2); ++ inline void stvx( VectorRegister d, Register s2); ++ inline void stvxl( VectorRegister d, Register s2); ++ inline void lvsl( VectorRegister d, Register s2); ++ inline void lvsr( VectorRegister d, Register s2); ++ ++ // RegisterOrConstant versions. ++ // These emitters choose between the versions using two registers and ++ // those with register and immediate, depending on the content of roc. ++ // If the constant is not encodable as immediate, instructions to ++ // load the constant are emitted beforehand. Store instructions need a ++ // tmp reg if the constant is not encodable as immediate. ++ // Size unpredictable. ++ void ld( Register d, RegisterOrConstant roc, Register s1 = noreg); ++ void lwa( Register d, RegisterOrConstant roc, Register s1 = noreg); ++ void lwz( Register d, RegisterOrConstant roc, Register s1 = noreg); ++ void lha( Register d, RegisterOrConstant roc, Register s1 = noreg); ++ void lhz( Register d, RegisterOrConstant roc, Register s1 = noreg); ++ void lbz( Register d, RegisterOrConstant roc, Register s1 = noreg); ++ void std( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg); ++ void stw( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg); ++ void sth( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg); ++ void stb( Register d, RegisterOrConstant roc, Register s1 = noreg, Register tmp = noreg); ++ void add( Register d, RegisterOrConstant roc, Register s1); ++ void subf(Register d, RegisterOrConstant roc, Register s1); ++ void cmpd(ConditionRegister d, RegisterOrConstant roc, Register s1); ++ ++ ++ // Emit several instructions to load a 64 bit constant. This issues a fixed ++ // instruction pattern so that the constant can be patched later on. ++ enum { ++ load_const_size = 5 * BytesPerInstWord ++ }; ++ void load_const(Register d, long a, Register tmp = noreg); ++ inline void load_const(Register d, void* a, Register tmp = noreg); ++ inline void load_const(Register d, Label& L, Register tmp = noreg); ++ inline void load_const(Register d, AddressLiteral& a, Register tmp = noreg); ++ ++ // Load a 64 bit constant, optimized, not identifyable. ++ // Tmp can be used to increase ILP. Set return_simm16_rest = true to get a ++ // 16 bit immediate offset. This is useful if the offset can be encoded in ++ // a succeeding instruction. ++ int load_const_optimized(Register d, long a, Register tmp = noreg, bool return_simm16_rest = false); ++ inline int load_const_optimized(Register d, void* a, Register tmp = noreg, bool return_simm16_rest = false) { ++ return load_const_optimized(d, (long)(unsigned long)a, tmp, return_simm16_rest); ++ } ++ ++ // Creation ++ Assembler(CodeBuffer* code) : AbstractAssembler(code) { ++#ifdef CHECK_DELAY ++ delay_state = no_delay; ++#endif ++ } ++ ++ // Testing ++#ifndef PRODUCT ++ void test_asm(); ++#endif ++}; ++ ++ ++#endif // CPU_PPC_VM_ASSEMBLER_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,823 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_ASSEMBLER_PPC_INLINE_HPP ++#define CPU_PPC_VM_ASSEMBLER_PPC_INLINE_HPP ++ ++#include "asm/assembler.inline.hpp" ++#include "asm/codeBuffer.hpp" ++#include "code/codeCache.hpp" ++ ++inline void Assembler::emit_int32(int x) { ++ AbstractAssembler::emit_int32(x); ++} ++ ++inline void Assembler::emit_data(int x) { ++ emit_int32(x); ++} ++ ++inline void Assembler::emit_data(int x, relocInfo::relocType rtype) { ++ relocate(rtype); ++ emit_int32(x); ++} ++ ++inline void Assembler::emit_data(int x, RelocationHolder const& rspec) { ++ relocate(rspec); ++ emit_int32(x); ++} ++ ++// Emit an address ++inline address Assembler::emit_addr(const address addr) { ++ address start = pc(); ++ emit_address(addr); ++ return start; ++} ++ ++#if !defined(ABI_ELFv2) ++// Emit a function descriptor with the specified entry point, TOC, and ++// ENV. If the entry point is NULL, the descriptor will point just ++// past the descriptor. ++inline address Assembler::emit_fd(address entry, address toc, address env) { ++ FunctionDescriptor* fd = (FunctionDescriptor*)pc(); ++ ++ assert(sizeof(FunctionDescriptor) == 3*sizeof(address), "function descriptor size"); ++ ++ (void)emit_addr(); ++ (void)emit_addr(); ++ (void)emit_addr(); ++ ++ fd->set_entry(entry == NULL ? pc() : entry); ++ fd->set_toc(toc); ++ fd->set_env(env); ++ ++ return (address)fd; ++} ++#endif ++ ++// Issue an illegal instruction. 0 is guaranteed to be an illegal instruction. ++inline void Assembler::illtrap() { Assembler::emit_int32(0); } ++inline bool Assembler::is_illtrap(int x) { return x == 0; } ++ ++// PPC 1, section 3.3.8, Fixed-Point Arithmetic Instructions ++inline void Assembler::addi( Register d, Register a, int si16) { assert(a != R0, "r0 not allowed"); addi_r0ok( d, a, si16); } ++inline void Assembler::addis( Register d, Register a, int si16) { assert(a != R0, "r0 not allowed"); addis_r0ok(d, a, si16); } ++inline void Assembler::addi_r0ok(Register d,Register a,int si16) { emit_int32(ADDI_OPCODE | rt(d) | ra(a) | simm(si16, 16)); } ++inline void Assembler::addis_r0ok(Register d,Register a,int si16) { emit_int32(ADDIS_OPCODE | rt(d) | ra(a) | simm(si16, 16)); } ++inline void Assembler::addic_( Register d, Register a, int si16) { emit_int32(ADDIC__OPCODE | rt(d) | ra(a) | simm(si16, 16)); } ++inline void Assembler::subfic( Register d, Register a, int si16) { emit_int32(SUBFIC_OPCODE | rt(d) | ra(a) | simm(si16, 16)); } ++inline void Assembler::add( Register d, Register a, Register b) { emit_int32(ADD_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::add_( Register d, Register a, Register b) { emit_int32(ADD_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++inline void Assembler::subf( Register d, Register a, Register b) { emit_int32(SUBF_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::sub( Register d, Register a, Register b) { subf(d, b, a); } ++inline void Assembler::subf_( Register d, Register a, Register b) { emit_int32(SUBF_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++inline void Assembler::addc( Register d, Register a, Register b) { emit_int32(ADDC_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::addc_( Register d, Register a, Register b) { emit_int32(ADDC_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++inline void Assembler::subfc( Register d, Register a, Register b) { emit_int32(SUBFC_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::subfc_( Register d, Register a, Register b) { emit_int32(SUBFC_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++inline void Assembler::adde( Register d, Register a, Register b) { emit_int32(ADDE_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::adde_( Register d, Register a, Register b) { emit_int32(ADDE_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++inline void Assembler::subfe( Register d, Register a, Register b) { emit_int32(SUBFE_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::subfe_( Register d, Register a, Register b) { emit_int32(SUBFE_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++inline void Assembler::neg( Register d, Register a) { emit_int32(NEG_OPCODE | rt(d) | ra(a) | oe(0) | rc(0)); } ++inline void Assembler::neg_( Register d, Register a) { emit_int32(NEG_OPCODE | rt(d) | ra(a) | oe(0) | rc(1)); } ++inline void Assembler::mulli( Register d, Register a, int si16) { emit_int32(MULLI_OPCODE | rt(d) | ra(a) | simm(si16, 16)); } ++inline void Assembler::mulld( Register d, Register a, Register b) { emit_int32(MULLD_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::mulld_( Register d, Register a, Register b) { emit_int32(MULLD_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++inline void Assembler::mullw( Register d, Register a, Register b) { emit_int32(MULLW_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::mullw_( Register d, Register a, Register b) { emit_int32(MULLW_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++inline void Assembler::mulhw( Register d, Register a, Register b) { emit_int32(MULHW_OPCODE | rt(d) | ra(a) | rb(b) | rc(0)); } ++inline void Assembler::mulhw_( Register d, Register a, Register b) { emit_int32(MULHW_OPCODE | rt(d) | ra(a) | rb(b) | rc(1)); } ++inline void Assembler::mulhd( Register d, Register a, Register b) { emit_int32(MULHD_OPCODE | rt(d) | ra(a) | rb(b) | rc(0)); } ++inline void Assembler::mulhd_( Register d, Register a, Register b) { emit_int32(MULHD_OPCODE | rt(d) | ra(a) | rb(b) | rc(1)); } ++inline void Assembler::mulhdu( Register d, Register a, Register b) { emit_int32(MULHDU_OPCODE | rt(d) | ra(a) | rb(b) | rc(0)); } ++inline void Assembler::mulhdu_(Register d, Register a, Register b) { emit_int32(MULHDU_OPCODE | rt(d) | ra(a) | rb(b) | rc(1)); } ++inline void Assembler::divd( Register d, Register a, Register b) { emit_int32(DIVD_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::divd_( Register d, Register a, Register b) { emit_int32(DIVD_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++inline void Assembler::divw( Register d, Register a, Register b) { emit_int32(DIVW_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(0)); } ++inline void Assembler::divw_( Register d, Register a, Register b) { emit_int32(DIVW_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); } ++ ++// extended mnemonics ++inline void Assembler::li( Register d, int si16) { Assembler::addi_r0ok( d, R0, si16); } ++inline void Assembler::lis( Register d, int si16) { Assembler::addis_r0ok(d, R0, si16); } ++inline void Assembler::addir(Register d, int si16, Register a) { Assembler::addi(d, a, si16); } ++ ++// PPC 1, section 3.3.9, Fixed-Point Compare Instructions ++inline void Assembler::cmpi( ConditionRegister f, int l, Register a, int si16) { emit_int32( CMPI_OPCODE | bf(f) | l10(l) | ra(a) | simm(si16,16)); } ++inline void Assembler::cmp( ConditionRegister f, int l, Register a, Register b) { emit_int32( CMP_OPCODE | bf(f) | l10(l) | ra(a) | rb(b)); } ++inline void Assembler::cmpli( ConditionRegister f, int l, Register a, int ui16) { emit_int32( CMPLI_OPCODE | bf(f) | l10(l) | ra(a) | uimm(ui16,16)); } ++inline void Assembler::cmpl( ConditionRegister f, int l, Register a, Register b) { emit_int32( CMPL_OPCODE | bf(f) | l10(l) | ra(a) | rb(b)); } ++ ++// extended mnemonics of Compare Instructions ++inline void Assembler::cmpwi( ConditionRegister crx, Register a, int si16) { Assembler::cmpi( crx, 0, a, si16); } ++inline void Assembler::cmpdi( ConditionRegister crx, Register a, int si16) { Assembler::cmpi( crx, 1, a, si16); } ++inline void Assembler::cmpw( ConditionRegister crx, Register a, Register b) { Assembler::cmp( crx, 0, a, b); } ++inline void Assembler::cmpd( ConditionRegister crx, Register a, Register b) { Assembler::cmp( crx, 1, a, b); } ++inline void Assembler::cmplwi(ConditionRegister crx, Register a, int ui16) { Assembler::cmpli(crx, 0, a, ui16); } ++inline void Assembler::cmpldi(ConditionRegister crx, Register a, int ui16) { Assembler::cmpli(crx, 1, a, ui16); } ++inline void Assembler::cmplw( ConditionRegister crx, Register a, Register b) { Assembler::cmpl( crx, 0, a, b); } ++inline void Assembler::cmpld( ConditionRegister crx, Register a, Register b) { Assembler::cmpl( crx, 1, a, b); } ++ ++inline void Assembler::isel(Register d, Register a, Register b, int c) { guarantee(VM_Version::has_isel(), "opcode not supported on this hardware"); ++ emit_int32(ISEL_OPCODE | rt(d) | ra(a) | rb(b) | bc(c)); } ++ ++// PPC 1, section 3.3.11, Fixed-Point Logical Instructions ++inline void Assembler::andi_( Register a, Register s, int ui16) { emit_int32(ANDI_OPCODE | rta(a) | rs(s) | uimm(ui16, 16)); } ++inline void Assembler::andis_( Register a, Register s, int ui16) { emit_int32(ANDIS_OPCODE | rta(a) | rs(s) | uimm(ui16, 16)); } ++inline void Assembler::ori( Register a, Register s, int ui16) { emit_int32(ORI_OPCODE | rta(a) | rs(s) | uimm(ui16, 16)); } ++inline void Assembler::oris( Register a, Register s, int ui16) { emit_int32(ORIS_OPCODE | rta(a) | rs(s) | uimm(ui16, 16)); } ++inline void Assembler::xori( Register a, Register s, int ui16) { emit_int32(XORI_OPCODE | rta(a) | rs(s) | uimm(ui16, 16)); } ++inline void Assembler::xoris( Register a, Register s, int ui16) { emit_int32(XORIS_OPCODE | rta(a) | rs(s) | uimm(ui16, 16)); } ++inline void Assembler::andr( Register a, Register s, Register b) { emit_int32(AND_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::and_( Register a, Register s, Register b) { emit_int32(AND_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++ ++inline void Assembler::or_unchecked(Register a, Register s, Register b){ emit_int32(OR_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::orr( Register a, Register s, Register b) { if (a==s && s==b) { Assembler::nop(); } else { Assembler::or_unchecked(a,s,b); } } ++inline void Assembler::or_( Register a, Register s, Register b) { emit_int32(OR_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::xorr( Register a, Register s, Register b) { emit_int32(XOR_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::xor_( Register a, Register s, Register b) { emit_int32(XOR_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::nand( Register a, Register s, Register b) { emit_int32(NAND_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::nand_( Register a, Register s, Register b) { emit_int32(NAND_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::nor( Register a, Register s, Register b) { emit_int32(NOR_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::nor_( Register a, Register s, Register b) { emit_int32(NOR_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::andc( Register a, Register s, Register b) { emit_int32(ANDC_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::andc_( Register a, Register s, Register b) { emit_int32(ANDC_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::orc( Register a, Register s, Register b) { emit_int32(ORC_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::orc_( Register a, Register s, Register b) { emit_int32(ORC_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::extsb( Register a, Register s) { emit_int32(EXTSB_OPCODE | rta(a) | rs(s) | rc(0)); } ++inline void Assembler::extsh( Register a, Register s) { emit_int32(EXTSH_OPCODE | rta(a) | rs(s) | rc(0)); } ++inline void Assembler::extsw( Register a, Register s) { emit_int32(EXTSW_OPCODE | rta(a) | rs(s) | rc(0)); } ++ ++// extended mnemonics ++inline void Assembler::nop() { Assembler::ori(R0, R0, 0); } ++// NOP for FP and BR units (different versions to allow them to be in one group) ++inline void Assembler::fpnop0() { Assembler::fmr(F30, F30); } ++inline void Assembler::fpnop1() { Assembler::fmr(F31, F31); } ++inline void Assembler::brnop0() { Assembler::mcrf(CCR2, CCR2); } ++inline void Assembler::brnop1() { Assembler::mcrf(CCR3, CCR3); } ++inline void Assembler::brnop2() { Assembler::mcrf(CCR4, CCR4); } ++ ++inline void Assembler::mr( Register d, Register s) { Assembler::orr(d, s, s); } ++inline void Assembler::ori_opt( Register d, int ui16) { if (ui16!=0) Assembler::ori( d, d, ui16); } ++inline void Assembler::oris_opt(Register d, int ui16) { if (ui16!=0) Assembler::oris(d, d, ui16); } ++ ++inline void Assembler::endgroup() { Assembler::ori(R1, R1, 0); } ++ ++// count instructions ++inline void Assembler::cntlzw( Register a, Register s) { emit_int32(CNTLZW_OPCODE | rta(a) | rs(s) | rc(0)); } ++inline void Assembler::cntlzw_( Register a, Register s) { emit_int32(CNTLZW_OPCODE | rta(a) | rs(s) | rc(1)); } ++inline void Assembler::cntlzd( Register a, Register s) { emit_int32(CNTLZD_OPCODE | rta(a) | rs(s) | rc(0)); } ++inline void Assembler::cntlzd_( Register a, Register s) { emit_int32(CNTLZD_OPCODE | rta(a) | rs(s) | rc(1)); } ++ ++// PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions ++inline void Assembler::sld( Register a, Register s, Register b) { emit_int32(SLD_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::sld_( Register a, Register s, Register b) { emit_int32(SLD_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::slw( Register a, Register s, Register b) { emit_int32(SLW_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::slw_( Register a, Register s, Register b) { emit_int32(SLW_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::srd( Register a, Register s, Register b) { emit_int32(SRD_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::srd_( Register a, Register s, Register b) { emit_int32(SRD_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::srw( Register a, Register s, Register b) { emit_int32(SRW_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::srw_( Register a, Register s, Register b) { emit_int32(SRW_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::srad( Register a, Register s, Register b) { emit_int32(SRAD_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::srad_( Register a, Register s, Register b) { emit_int32(SRAD_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::sraw( Register a, Register s, Register b) { emit_int32(SRAW_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::sraw_( Register a, Register s, Register b) { emit_int32(SRAW_OPCODE | rta(a) | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::sradi( Register a, Register s, int sh6) { emit_int32(SRADI_OPCODE | rta(a) | rs(s) | sh162030(sh6) | rc(0)); } ++inline void Assembler::sradi_( Register a, Register s, int sh6) { emit_int32(SRADI_OPCODE | rta(a) | rs(s) | sh162030(sh6) | rc(1)); } ++inline void Assembler::srawi( Register a, Register s, int sh5) { emit_int32(SRAWI_OPCODE | rta(a) | rs(s) | sh1620(sh5) | rc(0)); } ++inline void Assembler::srawi_( Register a, Register s, int sh5) { emit_int32(SRAWI_OPCODE | rta(a) | rs(s) | sh1620(sh5) | rc(1)); } ++ ++// extended mnemonics for Shift Instructions ++inline void Assembler::sldi( Register a, Register s, int sh6) { Assembler::rldicr(a, s, sh6, 63-sh6); } ++inline void Assembler::sldi_( Register a, Register s, int sh6) { Assembler::rldicr_(a, s, sh6, 63-sh6); } ++inline void Assembler::slwi( Register a, Register s, int sh5) { Assembler::rlwinm(a, s, sh5, 0, 31-sh5); } ++inline void Assembler::slwi_( Register a, Register s, int sh5) { Assembler::rlwinm_(a, s, sh5, 0, 31-sh5); } ++inline void Assembler::srdi( Register a, Register s, int sh6) { Assembler::rldicl(a, s, 64-sh6, sh6); } ++inline void Assembler::srdi_( Register a, Register s, int sh6) { Assembler::rldicl_(a, s, 64-sh6, sh6); } ++inline void Assembler::srwi( Register a, Register s, int sh5) { Assembler::rlwinm(a, s, 32-sh5, sh5, 31); } ++inline void Assembler::srwi_( Register a, Register s, int sh5) { Assembler::rlwinm_(a, s, 32-sh5, sh5, 31); } ++ ++inline void Assembler::clrrdi( Register a, Register s, int ui6) { Assembler::rldicr(a, s, 0, 63-ui6); } ++inline void Assembler::clrrdi_( Register a, Register s, int ui6) { Assembler::rldicr_(a, s, 0, 63-ui6); } ++inline void Assembler::clrldi( Register a, Register s, int ui6) { Assembler::rldicl(a, s, 0, ui6); } ++inline void Assembler::clrldi_( Register a, Register s, int ui6) { Assembler::rldicl_(a, s, 0, ui6); } ++inline void Assembler::clrlsldi( Register a, Register s, int clrl6, int shl6) { Assembler::rldic( a, s, shl6, clrl6-shl6); } ++inline void Assembler::clrlsldi_(Register a, Register s, int clrl6, int shl6) { Assembler::rldic_(a, s, shl6, clrl6-shl6); } ++inline void Assembler::extrdi( Register a, Register s, int n, int b){ Assembler::rldicl(a, s, b+n, 64-n); } ++// testbit with condition register. ++inline void Assembler::testbitdi(ConditionRegister cr, Register a, Register s, int ui6) { ++ if (cr == CCR0) { ++ Assembler::rldicr_(a, s, 63-ui6, 0); ++ } else { ++ Assembler::rldicr(a, s, 63-ui6, 0); ++ Assembler::cmpdi(cr, a, 0); ++ } ++} ++ ++// rotate instructions ++inline void Assembler::rotldi( Register a, Register s, int n) { Assembler::rldicl(a, s, n, 0); } ++inline void Assembler::rotrdi( Register a, Register s, int n) { Assembler::rldicl(a, s, 64-n, 0); } ++inline void Assembler::rotlwi( Register a, Register s, int n) { Assembler::rlwinm(a, s, n, 0, 31); } ++inline void Assembler::rotrwi( Register a, Register s, int n) { Assembler::rlwinm(a, s, 32-n, 0, 31); } ++ ++inline void Assembler::rldic( Register a, Register s, int sh6, int mb6) { emit_int32(RLDIC_OPCODE | rta(a) | rs(s) | sh162030(sh6) | mb2126(mb6) | rc(0)); } ++inline void Assembler::rldic_( Register a, Register s, int sh6, int mb6) { emit_int32(RLDIC_OPCODE | rta(a) | rs(s) | sh162030(sh6) | mb2126(mb6) | rc(1)); } ++inline void Assembler::rldicr( Register a, Register s, int sh6, int mb6) { emit_int32(RLDICR_OPCODE | rta(a) | rs(s) | sh162030(sh6) | mb2126(mb6) | rc(0)); } ++inline void Assembler::rldicr_( Register a, Register s, int sh6, int mb6) { emit_int32(RLDICR_OPCODE | rta(a) | rs(s) | sh162030(sh6) | mb2126(mb6) | rc(1)); } ++inline void Assembler::rldicl( Register a, Register s, int sh6, int me6) { emit_int32(RLDICL_OPCODE | rta(a) | rs(s) | sh162030(sh6) | me2126(me6) | rc(0)); } ++inline void Assembler::rldicl_( Register a, Register s, int sh6, int me6) { emit_int32(RLDICL_OPCODE | rta(a) | rs(s) | sh162030(sh6) | me2126(me6) | rc(1)); } ++inline void Assembler::rlwinm( Register a, Register s, int sh5, int mb5, int me5){ emit_int32(RLWINM_OPCODE | rta(a) | rs(s) | sh1620(sh5) | mb2125(mb5) | me2630(me5) | rc(0)); } ++inline void Assembler::rlwinm_( Register a, Register s, int sh5, int mb5, int me5){ emit_int32(RLWINM_OPCODE | rta(a) | rs(s) | sh1620(sh5) | mb2125(mb5) | me2630(me5) | rc(1)); } ++inline void Assembler::rldimi( Register a, Register s, int sh6, int mb6) { emit_int32(RLDIMI_OPCODE | rta(a) | rs(s) | sh162030(sh6) | mb2126(mb6) | rc(0)); } ++inline void Assembler::rlwimi( Register a, Register s, int sh5, int mb5, int me5){ emit_int32(RLWIMI_OPCODE | rta(a) | rs(s) | sh1620(sh5) | mb2125(mb5) | me2630(me5) | rc(0)); } ++inline void Assembler::rldimi_( Register a, Register s, int sh6, int mb6) { emit_int32(RLDIMI_OPCODE | rta(a) | rs(s) | sh162030(sh6) | mb2126(mb6) | rc(1)); } ++inline void Assembler::insrdi( Register a, Register s, int n, int b) { Assembler::rldimi(a, s, 64-(b+n), b); } ++inline void Assembler::insrwi( Register a, Register s, int n, int b) { Assembler::rlwimi(a, s, 32-(b+n), b, b+n-1); } ++ ++// PPC 1, section 3.3.2 Fixed-Point Load Instructions ++inline void Assembler::lwzx( Register d, Register s1, Register s2) { emit_int32(LWZX_OPCODE | rt(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::lwz( Register d, int si16, Register s1) { emit_int32(LWZ_OPCODE | rt(d) | d1(si16) | ra0mem(s1));} ++inline void Assembler::lwzu( Register d, int si16, Register s1) { assert(d != s1, "according to ibm manual"); emit_int32(LWZU_OPCODE | rt(d) | d1(si16) | rta0mem(s1));} ++ ++inline void Assembler::lwax( Register d, Register s1, Register s2) { emit_int32(LWAX_OPCODE | rt(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::lwa( Register d, int si16, Register s1) { emit_int32(LWA_OPCODE | rt(d) | ds(si16) | ra0mem(s1));} ++ ++inline void Assembler::lhzx( Register d, Register s1, Register s2) { emit_int32(LHZX_OPCODE | rt(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::lhz( Register d, int si16, Register s1) { emit_int32(LHZ_OPCODE | rt(d) | d1(si16) | ra0mem(s1));} ++inline void Assembler::lhzu( Register d, int si16, Register s1) { assert(d != s1, "according to ibm manual"); emit_int32(LHZU_OPCODE | rt(d) | d1(si16) | rta0mem(s1));} ++ ++inline void Assembler::lhax( Register d, Register s1, Register s2) { emit_int32(LHAX_OPCODE | rt(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::lha( Register d, int si16, Register s1) { emit_int32(LHA_OPCODE | rt(d) | d1(si16) | ra0mem(s1));} ++inline void Assembler::lhau( Register d, int si16, Register s1) { assert(d != s1, "according to ibm manual"); emit_int32(LHAU_OPCODE | rt(d) | d1(si16) | rta0mem(s1));} ++ ++inline void Assembler::lbzx( Register d, Register s1, Register s2) { emit_int32(LBZX_OPCODE | rt(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::lbz( Register d, int si16, Register s1) { emit_int32(LBZ_OPCODE | rt(d) | d1(si16) | ra0mem(s1));} ++inline void Assembler::lbzu( Register d, int si16, Register s1) { assert(d != s1, "according to ibm manual"); emit_int32(LBZU_OPCODE | rt(d) | d1(si16) | rta0mem(s1));} ++ ++inline void Assembler::ld( Register d, int si16, Register s1) { emit_int32(LD_OPCODE | rt(d) | ds(si16) | ra0mem(s1));} ++inline void Assembler::ldx( Register d, Register s1, Register s2) { emit_int32(LDX_OPCODE | rt(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::ldu( Register d, int si16, Register s1) { assert(d != s1, "according to ibm manual"); emit_int32(LDU_OPCODE | rt(d) | ds(si16) | rta0mem(s1));} ++ ++// PPC 1, section 3.3.3 Fixed-Point Store Instructions ++inline void Assembler::stwx( Register d, Register s1, Register s2) { emit_int32(STWX_OPCODE | rs(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::stw( Register d, int si16, Register s1) { emit_int32(STW_OPCODE | rs(d) | d1(si16) | ra0mem(s1));} ++inline void Assembler::stwu( Register d, int si16, Register s1) { emit_int32(STWU_OPCODE | rs(d) | d1(si16) | rta0mem(s1));} ++ ++inline void Assembler::sthx( Register d, Register s1, Register s2) { emit_int32(STHX_OPCODE | rs(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::sth( Register d, int si16, Register s1) { emit_int32(STH_OPCODE | rs(d) | d1(si16) | ra0mem(s1));} ++inline void Assembler::sthu( Register d, int si16, Register s1) { emit_int32(STHU_OPCODE | rs(d) | d1(si16) | rta0mem(s1));} ++ ++inline void Assembler::stbx( Register d, Register s1, Register s2) { emit_int32(STBX_OPCODE | rs(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::stb( Register d, int si16, Register s1) { emit_int32(STB_OPCODE | rs(d) | d1(si16) | ra0mem(s1));} ++inline void Assembler::stbu( Register d, int si16, Register s1) { emit_int32(STBU_OPCODE | rs(d) | d1(si16) | rta0mem(s1));} ++ ++inline void Assembler::std( Register d, int si16, Register s1) { emit_int32(STD_OPCODE | rs(d) | ds(si16) | ra0mem(s1));} ++inline void Assembler::stdx( Register d, Register s1, Register s2) { emit_int32(STDX_OPCODE | rs(d) | ra0mem(s1) | rb(s2));} ++inline void Assembler::stdu( Register d, int si16, Register s1) { emit_int32(STDU_OPCODE | rs(d) | ds(si16) | rta0mem(s1));} ++inline void Assembler::stdux(Register s, Register a, Register b) { emit_int32(STDUX_OPCODE| rs(s) | rta0mem(a) | rb(b));} ++ ++// PPC 1, section 3.3.13 Move To/From System Register Instructions ++inline void Assembler::mtlr( Register s1) { emit_int32(MTLR_OPCODE | rs(s1)); } ++inline void Assembler::mflr( Register d ) { emit_int32(MFLR_OPCODE | rt(d)); } ++inline void Assembler::mtctr(Register s1) { emit_int32(MTCTR_OPCODE | rs(s1)); } ++inline void Assembler::mfctr(Register d ) { emit_int32(MFCTR_OPCODE | rt(d)); } ++inline void Assembler::mtcrf(int afxm, Register s){ emit_int32(MTCRF_OPCODE | fxm(afxm) | rs(s)); } ++inline void Assembler::mfcr( Register d ) { emit_int32(MFCR_OPCODE | rt(d)); } ++inline void Assembler::mcrf( ConditionRegister crd, ConditionRegister cra) ++ { emit_int32(MCRF_OPCODE | bf(crd) | bfa(cra)); } ++inline void Assembler::mtcr( Register s) { Assembler::mtcrf(0xff, s); } ++ ++// SAP JVM 2006-02-13 PPC branch instruction. ++// PPC 1, section 2.4.1 Branch Instructions ++inline void Assembler::b( address a, relocInfo::relocType rt) { emit_data(BXX_OPCODE| li(disp( intptr_t(a), intptr_t(pc()))) |aa(0)|lk(0), rt); } ++inline void Assembler::b( Label& L) { b( target(L)); } ++inline void Assembler::bl(address a, relocInfo::relocType rt) { emit_data(BXX_OPCODE| li(disp( intptr_t(a), intptr_t(pc()))) |aa(0)|lk(1), rt); } ++inline void Assembler::bl(Label& L) { bl(target(L)); } ++inline void Assembler::bc( int boint, int biint, address a, relocInfo::relocType rt) { emit_data(BCXX_OPCODE| bo(boint) | bi(biint) | bd(disp( intptr_t(a), intptr_t(pc()))) | aa(0) | lk(0), rt); } ++inline void Assembler::bc( int boint, int biint, Label& L) { bc(boint, biint, target(L)); } ++inline void Assembler::bcl(int boint, int biint, address a, relocInfo::relocType rt) { emit_data(BCXX_OPCODE| bo(boint) | bi(biint) | bd(disp( intptr_t(a), intptr_t(pc()))) | aa(0)|lk(1)); } ++inline void Assembler::bcl(int boint, int biint, Label& L) { bcl(boint, biint, target(L)); } ++ ++inline void Assembler::bclr( int boint, int biint, int bhint, relocInfo::relocType rt) { emit_data(BCLR_OPCODE | bo(boint) | bi(biint) | bh(bhint) | aa(0) | lk(0), rt); } ++inline void Assembler::bclrl( int boint, int biint, int bhint, relocInfo::relocType rt) { emit_data(BCLR_OPCODE | bo(boint) | bi(biint) | bh(bhint) | aa(0) | lk(1), rt); } ++inline void Assembler::bcctr( int boint, int biint, int bhint, relocInfo::relocType rt) { emit_data(BCCTR_OPCODE| bo(boint) | bi(biint) | bh(bhint) | aa(0) | lk(0), rt); } ++inline void Assembler::bcctrl(int boint, int biint, int bhint, relocInfo::relocType rt) { emit_data(BCCTR_OPCODE| bo(boint) | bi(biint) | bh(bhint) | aa(0) | lk(1), rt); } ++ ++// helper function for b ++inline bool Assembler::is_within_range_of_b(address a, address pc) { ++ // Guard against illegal branch targets, e.g. -1 (see CompiledStaticCall and ad-file). ++ if ((((uint64_t)a) & 0x3) != 0) return false; ++ ++ const int range = 1 << (29-6); // li field is from bit 6 to bit 29. ++ int value = disp(intptr_t(a), intptr_t(pc)); ++ bool result = -range <= value && value < range-1; ++#ifdef ASSERT ++ if (result) li(value); // Assert that value is in correct range. ++#endif ++ return result; ++} ++ ++// helper functions for bcxx. ++inline bool Assembler::is_within_range_of_bcxx(address a, address pc) { ++ // Guard against illegal branch targets, e.g. -1 (see CompiledStaticCall and ad-file). ++ if ((((uint64_t)a) & 0x3) != 0) return false; ++ ++ const int range = 1 << (29-16); // bd field is from bit 16 to bit 29. ++ int value = disp(intptr_t(a), intptr_t(pc)); ++ bool result = -range <= value && value < range-1; ++#ifdef ASSERT ++ if (result) bd(value); // Assert that value is in correct range. ++#endif ++ return result; ++} ++ ++// Get the destination of a bxx branch (b, bl, ba, bla). ++address Assembler::bxx_destination(address baddr) { return bxx_destination(*(int*)baddr, baddr); } ++address Assembler::bxx_destination(int instr, address pc) { return (address)bxx_destination_offset(instr, (intptr_t)pc); } ++intptr_t Assembler::bxx_destination_offset(int instr, intptr_t bxx_pos) { ++ intptr_t displ = inv_li_field(instr); ++ return bxx_pos + displ; ++} ++ ++// Extended mnemonics for Branch Instructions ++inline void Assembler::blt(ConditionRegister crx, Label& L) { Assembler::bc(bcondCRbiIs1, bi0(crx, less), L); } ++inline void Assembler::bgt(ConditionRegister crx, Label& L) { Assembler::bc(bcondCRbiIs1, bi0(crx, greater), L); } ++inline void Assembler::beq(ConditionRegister crx, Label& L) { Assembler::bc(bcondCRbiIs1, bi0(crx, equal), L); } ++inline void Assembler::bso(ConditionRegister crx, Label& L) { Assembler::bc(bcondCRbiIs1, bi0(crx, summary_overflow), L); } ++inline void Assembler::bge(ConditionRegister crx, Label& L) { Assembler::bc(bcondCRbiIs0, bi0(crx, less), L); } ++inline void Assembler::ble(ConditionRegister crx, Label& L) { Assembler::bc(bcondCRbiIs0, bi0(crx, greater), L); } ++inline void Assembler::bne(ConditionRegister crx, Label& L) { Assembler::bc(bcondCRbiIs0, bi0(crx, equal), L); } ++inline void Assembler::bns(ConditionRegister crx, Label& L) { Assembler::bc(bcondCRbiIs0, bi0(crx, summary_overflow), L); } ++ ++// Branch instructions with static prediction hints. ++inline void Assembler::blt_predict_taken (ConditionRegister crx, Label& L) { bc(bcondCRbiIs1_bhintIsTaken, bi0(crx, less), L); } ++inline void Assembler::bgt_predict_taken (ConditionRegister crx, Label& L) { bc(bcondCRbiIs1_bhintIsTaken, bi0(crx, greater), L); } ++inline void Assembler::beq_predict_taken (ConditionRegister crx, Label& L) { bc(bcondCRbiIs1_bhintIsTaken, bi0(crx, equal), L); } ++inline void Assembler::bso_predict_taken (ConditionRegister crx, Label& L) { bc(bcondCRbiIs1_bhintIsTaken, bi0(crx, summary_overflow), L); } ++inline void Assembler::bge_predict_taken (ConditionRegister crx, Label& L) { bc(bcondCRbiIs0_bhintIsTaken, bi0(crx, less), L); } ++inline void Assembler::ble_predict_taken (ConditionRegister crx, Label& L) { bc(bcondCRbiIs0_bhintIsTaken, bi0(crx, greater), L); } ++inline void Assembler::bne_predict_taken (ConditionRegister crx, Label& L) { bc(bcondCRbiIs0_bhintIsTaken, bi0(crx, equal), L); } ++inline void Assembler::bns_predict_taken (ConditionRegister crx, Label& L) { bc(bcondCRbiIs0_bhintIsTaken, bi0(crx, summary_overflow), L); } ++inline void Assembler::blt_predict_not_taken(ConditionRegister crx, Label& L) { bc(bcondCRbiIs1_bhintIsNotTaken, bi0(crx, less), L); } ++inline void Assembler::bgt_predict_not_taken(ConditionRegister crx, Label& L) { bc(bcondCRbiIs1_bhintIsNotTaken, bi0(crx, greater), L); } ++inline void Assembler::beq_predict_not_taken(ConditionRegister crx, Label& L) { bc(bcondCRbiIs1_bhintIsNotTaken, bi0(crx, equal), L); } ++inline void Assembler::bso_predict_not_taken(ConditionRegister crx, Label& L) { bc(bcondCRbiIs1_bhintIsNotTaken, bi0(crx, summary_overflow), L); } ++inline void Assembler::bge_predict_not_taken(ConditionRegister crx, Label& L) { bc(bcondCRbiIs0_bhintIsNotTaken, bi0(crx, less), L); } ++inline void Assembler::ble_predict_not_taken(ConditionRegister crx, Label& L) { bc(bcondCRbiIs0_bhintIsNotTaken, bi0(crx, greater), L); } ++inline void Assembler::bne_predict_not_taken(ConditionRegister crx, Label& L) { bc(bcondCRbiIs0_bhintIsNotTaken, bi0(crx, equal), L); } ++inline void Assembler::bns_predict_not_taken(ConditionRegister crx, Label& L) { bc(bcondCRbiIs0_bhintIsNotTaken, bi0(crx, summary_overflow), L); } ++ ++// For use in conjunction with testbitdi: ++inline void Assembler::btrue( ConditionRegister crx, Label& L) { Assembler::bne(crx, L); } ++inline void Assembler::bfalse(ConditionRegister crx, Label& L) { Assembler::beq(crx, L); } ++ ++inline void Assembler::bltl(ConditionRegister crx, Label& L) { Assembler::bcl(bcondCRbiIs1, bi0(crx, less), L); } ++inline void Assembler::bgtl(ConditionRegister crx, Label& L) { Assembler::bcl(bcondCRbiIs1, bi0(crx, greater), L); } ++inline void Assembler::beql(ConditionRegister crx, Label& L) { Assembler::bcl(bcondCRbiIs1, bi0(crx, equal), L); } ++inline void Assembler::bsol(ConditionRegister crx, Label& L) { Assembler::bcl(bcondCRbiIs1, bi0(crx, summary_overflow), L); } ++inline void Assembler::bgel(ConditionRegister crx, Label& L) { Assembler::bcl(bcondCRbiIs0, bi0(crx, less), L); } ++inline void Assembler::blel(ConditionRegister crx, Label& L) { Assembler::bcl(bcondCRbiIs0, bi0(crx, greater), L); } ++inline void Assembler::bnel(ConditionRegister crx, Label& L) { Assembler::bcl(bcondCRbiIs0, bi0(crx, equal), L); } ++inline void Assembler::bnsl(ConditionRegister crx, Label& L) { Assembler::bcl(bcondCRbiIs0, bi0(crx, summary_overflow), L); } ++ ++// Extended mnemonics for Branch Instructions via LR. ++// We use `blr' for returns. ++inline void Assembler::blr(relocInfo::relocType rt) { Assembler::bclr(bcondAlways, 0, bhintbhBCLRisReturn, rt); } ++ ++// Extended mnemonics for Branch Instructions with CTR. ++// Bdnz means `decrement CTR and jump to L if CTR is not zero'. ++inline void Assembler::bdnz(Label& L) { Assembler::bc(16, 0, L); } ++// Decrement and branch if result is zero. ++inline void Assembler::bdz(Label& L) { Assembler::bc(18, 0, L); } ++// We use `bctr[l]' for jumps/calls in function descriptor glue ++// code, e.g. for calls to runtime functions. ++inline void Assembler::bctr( relocInfo::relocType rt) { Assembler::bcctr(bcondAlways, 0, bhintbhBCCTRisNotReturnButSame, rt); } ++inline void Assembler::bctrl(relocInfo::relocType rt) { Assembler::bcctrl(bcondAlways, 0, bhintbhBCCTRisNotReturnButSame, rt); } ++// Conditional jumps/branches via CTR. ++inline void Assembler::beqctr( ConditionRegister crx, relocInfo::relocType rt) { Assembler::bcctr( bcondCRbiIs1, bi0(crx, equal), bhintbhBCCTRisNotReturnButSame, rt); } ++inline void Assembler::beqctrl(ConditionRegister crx, relocInfo::relocType rt) { Assembler::bcctrl(bcondCRbiIs1, bi0(crx, equal), bhintbhBCCTRisNotReturnButSame, rt); } ++inline void Assembler::bnectr( ConditionRegister crx, relocInfo::relocType rt) { Assembler::bcctr( bcondCRbiIs0, bi0(crx, equal), bhintbhBCCTRisNotReturnButSame, rt); } ++inline void Assembler::bnectrl(ConditionRegister crx, relocInfo::relocType rt) { Assembler::bcctrl(bcondCRbiIs0, bi0(crx, equal), bhintbhBCCTRisNotReturnButSame, rt); } ++ ++// condition register logic instructions ++inline void Assembler::crand( int d, int s1, int s2) { emit_int32(CRAND_OPCODE | bt(d) | ba(s1) | bb(s2)); } ++inline void Assembler::crnand(int d, int s1, int s2) { emit_int32(CRNAND_OPCODE | bt(d) | ba(s1) | bb(s2)); } ++inline void Assembler::cror( int d, int s1, int s2) { emit_int32(CROR_OPCODE | bt(d) | ba(s1) | bb(s2)); } ++inline void Assembler::crxor( int d, int s1, int s2) { emit_int32(CRXOR_OPCODE | bt(d) | ba(s1) | bb(s2)); } ++inline void Assembler::crnor( int d, int s1, int s2) { emit_int32(CRNOR_OPCODE | bt(d) | ba(s1) | bb(s2)); } ++inline void Assembler::creqv( int d, int s1, int s2) { emit_int32(CREQV_OPCODE | bt(d) | ba(s1) | bb(s2)); } ++inline void Assembler::crandc(int d, int s1, int s2) { emit_int32(CRANDC_OPCODE | bt(d) | ba(s1) | bb(s2)); } ++inline void Assembler::crorc( int d, int s1, int s2) { emit_int32(CRORC_OPCODE | bt(d) | ba(s1) | bb(s2)); } ++ ++// Conditional move (>= Power7) ++inline void Assembler::isel(Register d, ConditionRegister cr, Condition cc, bool inv, Register a, Register b) { ++ if (b == noreg) { ++ b = d; // Can be omitted if old value should be kept in "else" case. ++ } ++ Register first = a; ++ Register second = b; ++ if (inv) { ++ first = b; ++ second = a; // exchange ++ } ++ assert(first != R0, "r0 not allowed"); ++ isel(d, first, second, bi0(cr, cc)); ++} ++inline void Assembler::isel_0(Register d, ConditionRegister cr, Condition cc, Register b) { ++ if (b == noreg) { ++ b = d; // Can be omitted if old value should be kept in "else" case. ++ } ++ isel(d, R0, b, bi0(cr, cc)); ++} ++ ++// PPC 2, section 3.2.1 Instruction Cache Instructions ++inline void Assembler::icbi( Register s1, Register s2) { emit_int32( ICBI_OPCODE | ra0mem(s1) | rb(s2) ); } ++// PPC 2, section 3.2.2 Data Cache Instructions ++//inline void Assembler::dcba( Register s1, Register s2) { emit_int32( DCBA_OPCODE | ra0mem(s1) | rb(s2) ); } ++inline void Assembler::dcbz( Register s1, Register s2) { emit_int32( DCBZ_OPCODE | ra0mem(s1) | rb(s2) ); } ++inline void Assembler::dcbst( Register s1, Register s2) { emit_int32( DCBST_OPCODE | ra0mem(s1) | rb(s2) ); } ++inline void Assembler::dcbf( Register s1, Register s2) { emit_int32( DCBF_OPCODE | ra0mem(s1) | rb(s2) ); } ++// dcache read hint ++inline void Assembler::dcbt( Register s1, Register s2) { emit_int32( DCBT_OPCODE | ra0mem(s1) | rb(s2) ); } ++inline void Assembler::dcbtct( Register s1, Register s2, int ct) { emit_int32( DCBT_OPCODE | ra0mem(s1) | rb(s2) | thct(ct)); } ++inline void Assembler::dcbtds( Register s1, Register s2, int ds) { emit_int32( DCBT_OPCODE | ra0mem(s1) | rb(s2) | thds(ds)); } ++// dcache write hint ++inline void Assembler::dcbtst( Register s1, Register s2) { emit_int32( DCBTST_OPCODE | ra0mem(s1) | rb(s2) ); } ++inline void Assembler::dcbtstct(Register s1, Register s2, int ct) { emit_int32( DCBTST_OPCODE | ra0mem(s1) | rb(s2) | thct(ct)); } ++ ++// machine barrier instructions: ++inline void Assembler::sync(int a) { emit_int32( SYNC_OPCODE | l910(a)); } ++inline void Assembler::sync() { Assembler::sync(0); } ++inline void Assembler::lwsync() { Assembler::sync(1); } ++inline void Assembler::ptesync() { Assembler::sync(2); } ++inline void Assembler::eieio() { emit_int32( EIEIO_OPCODE); } ++inline void Assembler::isync() { emit_int32( ISYNC_OPCODE); } ++inline void Assembler::elemental_membar(int e) { assert(0 < e && e < 16, "invalid encoding"); emit_int32( SYNC_OPCODE | e1215(e)); } ++ ++// atomics ++// Use ra0mem to disallow R0 as base. ++inline void Assembler::lwarx_unchecked(Register d, Register a, Register b, int eh1) { emit_int32( LWARX_OPCODE | rt(d) | ra0mem(a) | rb(b) | eh(eh1)); } ++inline void Assembler::ldarx_unchecked(Register d, Register a, Register b, int eh1) { emit_int32( LDARX_OPCODE | rt(d) | ra0mem(a) | rb(b) | eh(eh1)); } ++inline bool Assembler::lxarx_hint_exclusive_access() { return VM_Version::has_lxarxeh(); } ++inline void Assembler::lwarx( Register d, Register a, Register b, bool hint_exclusive_access) { lwarx_unchecked(d, a, b, (hint_exclusive_access && lxarx_hint_exclusive_access() && UseExtendedLoadAndReserveInstructionsPPC64) ? 1 : 0); } ++inline void Assembler::ldarx( Register d, Register a, Register b, bool hint_exclusive_access) { ldarx_unchecked(d, a, b, (hint_exclusive_access && lxarx_hint_exclusive_access() && UseExtendedLoadAndReserveInstructionsPPC64) ? 1 : 0); } ++inline void Assembler::stwcx_(Register s, Register a, Register b) { emit_int32( STWCX_OPCODE | rs(s) | ra0mem(a) | rb(b) | rc(1)); } ++inline void Assembler::stdcx_(Register s, Register a, Register b) { emit_int32( STDCX_OPCODE | rs(s) | ra0mem(a) | rb(b) | rc(1)); } ++ ++// Instructions for adjusting thread priority ++// for simultaneous multithreading (SMT) on POWER5. ++inline void Assembler::smt_prio_very_low() { Assembler::or_unchecked(R31, R31, R31); } ++inline void Assembler::smt_prio_low() { Assembler::or_unchecked(R1, R1, R1); } ++inline void Assembler::smt_prio_medium_low() { Assembler::or_unchecked(R6, R6, R6); } ++inline void Assembler::smt_prio_medium() { Assembler::or_unchecked(R2, R2, R2); } ++inline void Assembler::smt_prio_medium_high() { Assembler::or_unchecked(R5, R5, R5); } ++inline void Assembler::smt_prio_high() { Assembler::or_unchecked(R3, R3, R3); } ++ ++inline void Assembler::twi_0(Register a) { twi_unchecked(0, a, 0);} ++ ++// trap instructions ++inline void Assembler::tdi_unchecked(int tobits, Register a, int si16){ emit_int32( TDI_OPCODE | to(tobits) | ra(a) | si(si16)); } ++inline void Assembler::twi_unchecked(int tobits, Register a, int si16){ emit_int32( TWI_OPCODE | to(tobits) | ra(a) | si(si16)); } ++inline void Assembler::tdi(int tobits, Register a, int si16) { assert(UseSIGTRAP, "precondition"); tdi_unchecked(tobits, a, si16); } ++inline void Assembler::twi(int tobits, Register a, int si16) { assert(UseSIGTRAP, "precondition"); twi_unchecked(tobits, a, si16); } ++inline void Assembler::td( int tobits, Register a, Register b) { assert(UseSIGTRAP, "precondition"); emit_int32( TD_OPCODE | to(tobits) | ra(a) | rb(b)); } ++inline void Assembler::tw( int tobits, Register a, Register b) { assert(UseSIGTRAP, "precondition"); emit_int32( TW_OPCODE | to(tobits) | ra(a) | rb(b)); } ++ ++// FLOATING POINT instructions ppc. ++// PPC 1, section 4.6.2 Floating-Point Load Instructions ++// Use ra0mem instead of ra in some instructions below. ++inline void Assembler::lfs( FloatRegister d, int si16, Register a) { emit_int32( LFS_OPCODE | frt(d) | ra0mem(a) | simm(si16,16)); } ++inline void Assembler::lfsu(FloatRegister d, int si16, Register a) { emit_int32( LFSU_OPCODE | frt(d) | ra(a) | simm(si16,16)); } ++inline void Assembler::lfsx(FloatRegister d, Register a, Register b) { emit_int32( LFSX_OPCODE | frt(d) | ra0mem(a) | rb(b)); } ++inline void Assembler::lfd( FloatRegister d, int si16, Register a) { emit_int32( LFD_OPCODE | frt(d) | ra0mem(a) | simm(si16,16)); } ++inline void Assembler::lfdu(FloatRegister d, int si16, Register a) { emit_int32( LFDU_OPCODE | frt(d) | ra(a) | simm(si16,16)); } ++inline void Assembler::lfdx(FloatRegister d, Register a, Register b) { emit_int32( LFDX_OPCODE | frt(d) | ra0mem(a) | rb(b)); } ++ ++// PPC 1, section 4.6.3 Floating-Point Store Instructions ++// Use ra0mem instead of ra in some instructions below. ++inline void Assembler::stfs( FloatRegister s, int si16, Register a) { emit_int32( STFS_OPCODE | frs(s) | ra0mem(a) | simm(si16,16)); } ++inline void Assembler::stfsu(FloatRegister s, int si16, Register a) { emit_int32( STFSU_OPCODE | frs(s) | ra(a) | simm(si16,16)); } ++inline void Assembler::stfsx(FloatRegister s, Register a, Register b){ emit_int32( STFSX_OPCODE | frs(s) | ra0mem(a) | rb(b)); } ++inline void Assembler::stfd( FloatRegister s, int si16, Register a) { emit_int32( STFD_OPCODE | frs(s) | ra0mem(a) | simm(si16,16)); } ++inline void Assembler::stfdu(FloatRegister s, int si16, Register a) { emit_int32( STFDU_OPCODE | frs(s) | ra(a) | simm(si16,16)); } ++inline void Assembler::stfdx(FloatRegister s, Register a, Register b){ emit_int32( STFDX_OPCODE | frs(s) | ra0mem(a) | rb(b)); } ++ ++// PPC 1, section 4.6.4 Floating-Point Move Instructions ++inline void Assembler::fmr( FloatRegister d, FloatRegister b) { emit_int32( FMR_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fmr_(FloatRegister d, FloatRegister b) { emit_int32( FMR_OPCODE | frt(d) | frb(b) | rc(1)); } ++ ++// These are special Power6 opcodes, reused for "lfdepx" and "stfdepx" ++// on Power7. Do not use. ++//inline void Assembler::mffgpr( FloatRegister d, Register b) { emit_int32( MFFGPR_OPCODE | frt(d) | rb(b) | rc(0)); } ++//inline void Assembler::mftgpr( Register d, FloatRegister b) { emit_int32( MFTGPR_OPCODE | rt(d) | frb(b) | rc(0)); } ++// add cmpb and popcntb to detect ppc power version. ++inline void Assembler::cmpb( Register a, Register s, Register b) { guarantee(VM_Version::has_cmpb(), "opcode not supported on this hardware"); ++ emit_int32( CMPB_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); } ++inline void Assembler::popcntb(Register a, Register s) { guarantee(VM_Version::has_popcntb(), "opcode not supported on this hardware"); ++ emit_int32( POPCNTB_OPCODE | rta(a) | rs(s)); }; ++inline void Assembler::popcntw(Register a, Register s) { guarantee(VM_Version::has_popcntw(), "opcode not supported on this hardware"); ++ emit_int32( POPCNTW_OPCODE | rta(a) | rs(s)); }; ++inline void Assembler::popcntd(Register a, Register s) { emit_int32( POPCNTD_OPCODE | rta(a) | rs(s)); }; ++ ++inline void Assembler::fneg( FloatRegister d, FloatRegister b) { emit_int32( FNEG_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fneg_( FloatRegister d, FloatRegister b) { emit_int32( FNEG_OPCODE | frt(d) | frb(b) | rc(1)); } ++inline void Assembler::fabs( FloatRegister d, FloatRegister b) { emit_int32( FABS_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fabs_( FloatRegister d, FloatRegister b) { emit_int32( FABS_OPCODE | frt(d) | frb(b) | rc(1)); } ++inline void Assembler::fnabs( FloatRegister d, FloatRegister b) { emit_int32( FNABS_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fnabs_(FloatRegister d, FloatRegister b) { emit_int32( FNABS_OPCODE | frt(d) | frb(b) | rc(1)); } ++ ++// PPC 1, section 4.6.5.1 Floating-Point Elementary Arithmetic Instructions ++inline void Assembler::fadd( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FADD_OPCODE | frt(d) | fra(a) | frb(b) | rc(0)); } ++inline void Assembler::fadd_( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FADD_OPCODE | frt(d) | fra(a) | frb(b) | rc(1)); } ++inline void Assembler::fadds( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FADDS_OPCODE | frt(d) | fra(a) | frb(b) | rc(0)); } ++inline void Assembler::fadds_(FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FADDS_OPCODE | frt(d) | fra(a) | frb(b) | rc(1)); } ++inline void Assembler::fsub( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FSUB_OPCODE | frt(d) | fra(a) | frb(b) | rc(0)); } ++inline void Assembler::fsub_( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FSUB_OPCODE | frt(d) | fra(a) | frb(b) | rc(1)); } ++inline void Assembler::fsubs( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FSUBS_OPCODE | frt(d) | fra(a) | frb(b) | rc(0)); } ++inline void Assembler::fsubs_(FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FSUBS_OPCODE | frt(d) | fra(a) | frb(b) | rc(1)); } ++inline void Assembler::fmul( FloatRegister d, FloatRegister a, FloatRegister c) { emit_int32( FMUL_OPCODE | frt(d) | fra(a) | frc(c) | rc(0)); } ++inline void Assembler::fmul_( FloatRegister d, FloatRegister a, FloatRegister c) { emit_int32( FMUL_OPCODE | frt(d) | fra(a) | frc(c) | rc(1)); } ++inline void Assembler::fmuls( FloatRegister d, FloatRegister a, FloatRegister c) { emit_int32( FMULS_OPCODE | frt(d) | fra(a) | frc(c) | rc(0)); } ++inline void Assembler::fmuls_(FloatRegister d, FloatRegister a, FloatRegister c) { emit_int32( FMULS_OPCODE | frt(d) | fra(a) | frc(c) | rc(1)); } ++inline void Assembler::fdiv( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIV_OPCODE | frt(d) | fra(a) | frb(b) | rc(0)); } ++inline void Assembler::fdiv_( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIV_OPCODE | frt(d) | fra(a) | frb(b) | rc(1)); } ++inline void Assembler::fdivs( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIVS_OPCODE | frt(d) | fra(a) | frb(b) | rc(0)); } ++inline void Assembler::fdivs_(FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIVS_OPCODE | frt(d) | fra(a) | frb(b) | rc(1)); } ++ ++// PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions ++inline void Assembler::frsp( FloatRegister d, FloatRegister b) { emit_int32( FRSP_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fctid( FloatRegister d, FloatRegister b) { emit_int32( FCTID_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fctidz(FloatRegister d, FloatRegister b) { emit_int32( FCTIDZ_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fctiw( FloatRegister d, FloatRegister b) { emit_int32( FCTIW_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fctiwz(FloatRegister d, FloatRegister b) { emit_int32( FCTIWZ_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fcfid( FloatRegister d, FloatRegister b) { emit_int32( FCFID_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fcfids(FloatRegister d, FloatRegister b) { guarantee(VM_Version::has_fcfids(), "opcode not supported on this hardware"); ++ emit_int32( FCFIDS_OPCODE | frt(d) | frb(b) | rc(0)); } ++ ++// PPC 1, section 4.6.7 Floating-Point Compare Instructions ++inline void Assembler::fcmpu( ConditionRegister crx, FloatRegister a, FloatRegister b) { emit_int32( FCMPU_OPCODE | bf(crx) | fra(a) | frb(b)); } ++ ++// PPC 1, section 5.2.1 Floating-Point Arithmetic Instructions ++inline void Assembler::fsqrt( FloatRegister d, FloatRegister b) { guarantee(VM_Version::has_fsqrt(), "opcode not supported on this hardware"); ++ emit_int32( FSQRT_OPCODE | frt(d) | frb(b) | rc(0)); } ++inline void Assembler::fsqrts(FloatRegister d, FloatRegister b) { guarantee(VM_Version::has_fsqrts(), "opcode not supported on this hardware"); ++ emit_int32( FSQRTS_OPCODE | frt(d) | frb(b) | rc(0)); } ++ ++// Vector instructions for >= Power6. ++inline void Assembler::lvebx( VectorRegister d, Register s1, Register s2) { emit_int32( LVEBX_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::lvehx( VectorRegister d, Register s1, Register s2) { emit_int32( LVEHX_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::lvewx( VectorRegister d, Register s1, Register s2) { emit_int32( LVEWX_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::lvx( VectorRegister d, Register s1, Register s2) { emit_int32( LVX_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::lvxl( VectorRegister d, Register s1, Register s2) { emit_int32( LVXL_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::stvebx(VectorRegister d, Register s1, Register s2) { emit_int32( STVEBX_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::stvehx(VectorRegister d, Register s1, Register s2) { emit_int32( STVEHX_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::stvewx(VectorRegister d, Register s1, Register s2) { emit_int32( STVEWX_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::stvx( VectorRegister d, Register s1, Register s2) { emit_int32( STVX_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::stvxl( VectorRegister d, Register s1, Register s2) { emit_int32( STVXL_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::lvsl( VectorRegister d, Register s1, Register s2) { emit_int32( LVSL_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++inline void Assembler::lvsr( VectorRegister d, Register s1, Register s2) { emit_int32( LVSR_OPCODE | vrt(d) | ra0mem(s1) | rb(s2)); } ++ ++inline void Assembler::vpkpx( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKPX_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vpkshss( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKSHSS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vpkswss( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKSWSS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vpkshus( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKSHUS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vpkswus( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKSWUS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vpkuhum( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKUHUM_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vpkuwum( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKUWUM_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vpkuhus( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKUHUS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vpkuwus( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VPKUWUS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vupkhpx( VectorRegister d, VectorRegister b) { emit_int32( VUPKHPX_OPCODE | vrt(d) | vrb(b)); } ++inline void Assembler::vupkhsb( VectorRegister d, VectorRegister b) { emit_int32( VUPKHSB_OPCODE | vrt(d) | vrb(b)); } ++inline void Assembler::vupkhsh( VectorRegister d, VectorRegister b) { emit_int32( VUPKHSH_OPCODE | vrt(d) | vrb(b)); } ++inline void Assembler::vupklpx( VectorRegister d, VectorRegister b) { emit_int32( VUPKLPX_OPCODE | vrt(d) | vrb(b)); } ++inline void Assembler::vupklsb( VectorRegister d, VectorRegister b) { emit_int32( VUPKLSB_OPCODE | vrt(d) | vrb(b)); } ++inline void Assembler::vupklsh( VectorRegister d, VectorRegister b) { emit_int32( VUPKLSH_OPCODE | vrt(d) | vrb(b)); } ++inline void Assembler::vmrghb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMRGHB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmrghw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMRGHW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmrghh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMRGHH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmrglb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMRGLB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmrglw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMRGLW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmrglh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMRGLH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsplt( VectorRegister d, int ui4, VectorRegister b) { emit_int32( VSPLT_OPCODE | vrt(d) | vsplt_uim(uimm(ui4,4)) | vrb(b)); } ++inline void Assembler::vsplth( VectorRegister d, int ui3, VectorRegister b) { emit_int32( VSPLTH_OPCODE | vrt(d) | vsplt_uim(uimm(ui3,3)) | vrb(b)); } ++inline void Assembler::vspltw( VectorRegister d, int ui2, VectorRegister b) { emit_int32( VSPLTW_OPCODE | vrt(d) | vsplt_uim(uimm(ui2,2)) | vrb(b)); } ++inline void Assembler::vspltisb(VectorRegister d, int si5) { emit_int32( VSPLTISB_OPCODE| vrt(d) | vsplti_sim(simm(si5,5))); } ++inline void Assembler::vspltish(VectorRegister d, int si5) { emit_int32( VSPLTISH_OPCODE| vrt(d) | vsplti_sim(simm(si5,5))); } ++inline void Assembler::vspltisw(VectorRegister d, int si5) { emit_int32( VSPLTISW_OPCODE| vrt(d) | vsplti_sim(simm(si5,5))); } ++inline void Assembler::vperm( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c){ emit_int32( VPERM_OPCODE | vrt(d) | vra(a) | vrb(b) | vrc(c)); } ++inline void Assembler::vsel( VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c){ emit_int32( VSEL_OPCODE | vrt(d) | vra(a) | vrb(b) | vrc(c)); } ++inline void Assembler::vsl( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSL_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsldoi( VectorRegister d, VectorRegister a, VectorRegister b, int si4) { emit_int32( VSLDOI_OPCODE| vrt(d) | vra(a) | vrb(b) | vsldoi_shb(simm(si4,4))); } ++inline void Assembler::vslo( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSLO_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsr( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSR_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsro( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSRO_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vaddcuw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDCUW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vaddshs( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDSHS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vaddsbs( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDSBS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vaddsws( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDSWS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vaddubm( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDUBM_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vadduwm( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDUWM_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vadduhm( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDUHM_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vaddubs( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDUBS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vadduws( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDUWS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vadduhs( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VADDUHS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsubcuw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBCUW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsubshs( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBSHS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsubsbs( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBSBS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsubsws( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBSWS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsububm( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBUBM_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsubuwm( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBUWM_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsubuhm( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBUHM_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsububs( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBUBS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsubuws( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBUWS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsubuhs( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUBUHS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmulesb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMULESB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmuleub( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMULEUB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmulesh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMULESH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmuleuh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMULEUH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmulosb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMULOSB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmuloub( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMULOUB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmulosh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMULOSH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmulouh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMULOUH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmhaddshs(VectorRegister d,VectorRegister a, VectorRegister b, VectorRegister c) { emit_int32( VMHADDSHS_OPCODE | vrt(d) | vra(a) | vrb(b)| vrc(c)); } ++inline void Assembler::vmhraddshs(VectorRegister d,VectorRegister a,VectorRegister b, VectorRegister c) { emit_int32( VMHRADDSHS_OPCODE| vrt(d) | vra(a) | vrb(b)| vrc(c)); } ++inline void Assembler::vmladduhm(VectorRegister d,VectorRegister a, VectorRegister b, VectorRegister c) { emit_int32( VMLADDUHM_OPCODE | vrt(d) | vra(a) | vrb(b)| vrc(c)); } ++inline void Assembler::vmsubuhm(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c) { emit_int32( VMSUBUHM_OPCODE | vrt(d) | vra(a) | vrb(b)| vrc(c)); } ++inline void Assembler::vmsummbm(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c) { emit_int32( VMSUMMBM_OPCODE | vrt(d) | vra(a) | vrb(b)| vrc(c)); } ++inline void Assembler::vmsumshm(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c) { emit_int32( VMSUMSHM_OPCODE | vrt(d) | vra(a) | vrb(b)| vrc(c)); } ++inline void Assembler::vmsumshs(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c) { emit_int32( VMSUMSHS_OPCODE | vrt(d) | vra(a) | vrb(b)| vrc(c)); } ++inline void Assembler::vmsumuhm(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c) { emit_int32( VMSUMUHM_OPCODE | vrt(d) | vra(a) | vrb(b)| vrc(c)); } ++inline void Assembler::vmsumuhs(VectorRegister d, VectorRegister a, VectorRegister b, VectorRegister c) { emit_int32( VMSUMUHS_OPCODE | vrt(d) | vra(a) | vrb(b)| vrc(c)); } ++inline void Assembler::vsumsws( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUMSWS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsum2sws(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUM2SWS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsum4sbs(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUM4SBS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsum4ubs(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUM4UBS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsum4shs(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSUM4SHS_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vavgsb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VAVGSB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vavgsw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VAVGSW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vavgsh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VAVGSH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vavgub( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VAVGUB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vavguw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VAVGUW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vavguh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VAVGUH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmaxsb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMAXSB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmaxsw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMAXSW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmaxsh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMAXSH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmaxub( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMAXUB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmaxuw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMAXUW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vmaxuh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMAXUH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vminsb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMINSB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vminsw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMINSW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vminsh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMINSH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vminub( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMINUB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vminuw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMINUW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vminuh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VMINUH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vcmpequb(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCMPEQUB_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(0)); } ++inline void Assembler::vcmpequh(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCMPEQUH_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(0)); } ++inline void Assembler::vcmpequw(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCMPEQUW_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(0)); } ++inline void Assembler::vcmpgtsh(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCMPGTSH_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(0)); } ++inline void Assembler::vcmpgtsb(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCMPGTSB_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(0)); } ++inline void Assembler::vcmpgtsw(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCMPGTSW_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(0)); } ++inline void Assembler::vcmpgtub(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCMPGTUB_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(0)); } ++inline void Assembler::vcmpgtuh(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCMPGTUH_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(0)); } ++inline void Assembler::vcmpgtuw(VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VCMPGTUW_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(0)); } ++inline void Assembler::vcmpequb_(VectorRegister d,VectorRegister a, VectorRegister b) { emit_int32( VCMPEQUB_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(1)); } ++inline void Assembler::vcmpequh_(VectorRegister d,VectorRegister a, VectorRegister b) { emit_int32( VCMPEQUH_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(1)); } ++inline void Assembler::vcmpequw_(VectorRegister d,VectorRegister a, VectorRegister b) { emit_int32( VCMPEQUW_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(1)); } ++inline void Assembler::vcmpgtsh_(VectorRegister d,VectorRegister a, VectorRegister b) { emit_int32( VCMPGTSH_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(1)); } ++inline void Assembler::vcmpgtsb_(VectorRegister d,VectorRegister a, VectorRegister b) { emit_int32( VCMPGTSB_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(1)); } ++inline void Assembler::vcmpgtsw_(VectorRegister d,VectorRegister a, VectorRegister b) { emit_int32( VCMPGTSW_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(1)); } ++inline void Assembler::vcmpgtub_(VectorRegister d,VectorRegister a, VectorRegister b) { emit_int32( VCMPGTUB_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(1)); } ++inline void Assembler::vcmpgtuh_(VectorRegister d,VectorRegister a, VectorRegister b) { emit_int32( VCMPGTUH_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(1)); } ++inline void Assembler::vcmpgtuw_(VectorRegister d,VectorRegister a, VectorRegister b) { emit_int32( VCMPGTUW_OPCODE | vrt(d) | vra(a) | vrb(b) | vcmp_rc(1)); } ++inline void Assembler::vand( VectorRegister d, VectorRegister a, VectorRegister b) { guarantee(VM_Version::has_vand(), "opcode not supported on this hardware"); ++ emit_int32( VAND_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vandc( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VANDC_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vnor( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VNOR_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vor( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VOR_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vxor( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VXOR_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vrlb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VRLB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vrlw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VRLW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vrlh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VRLH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vslb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSLB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vskw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSKW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vslh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSLH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsrb( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSRB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsrw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSRW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsrh( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSRH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsrab( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSRAB_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsraw( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSRAW_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::vsrah( VectorRegister d, VectorRegister a, VectorRegister b) { emit_int32( VSRAH_OPCODE | vrt(d) | vra(a) | vrb(b)); } ++inline void Assembler::mtvscr( VectorRegister b) { emit_int32( MTVSCR_OPCODE | vrb(b)); } ++inline void Assembler::mfvscr( VectorRegister d) { emit_int32( MFVSCR_OPCODE | vrt(d)); } ++ ++// ra0 version ++inline void Assembler::lwzx( Register d, Register s2) { emit_int32( LWZX_OPCODE | rt(d) | rb(s2));} ++inline void Assembler::lwz( Register d, int si16 ) { emit_int32( LWZ_OPCODE | rt(d) | d1(si16));} ++inline void Assembler::lwax( Register d, Register s2) { emit_int32( LWAX_OPCODE | rt(d) | rb(s2));} ++inline void Assembler::lwa( Register d, int si16 ) { emit_int32( LWA_OPCODE | rt(d) | ds(si16));} ++inline void Assembler::lhzx( Register d, Register s2) { emit_int32( LHZX_OPCODE | rt(d) | rb(s2));} ++inline void Assembler::lhz( Register d, int si16 ) { emit_int32( LHZ_OPCODE | rt(d) | d1(si16));} ++inline void Assembler::lhax( Register d, Register s2) { emit_int32( LHAX_OPCODE | rt(d) | rb(s2));} ++inline void Assembler::lha( Register d, int si16 ) { emit_int32( LHA_OPCODE | rt(d) | d1(si16));} ++inline void Assembler::lbzx( Register d, Register s2) { emit_int32( LBZX_OPCODE | rt(d) | rb(s2));} ++inline void Assembler::lbz( Register d, int si16 ) { emit_int32( LBZ_OPCODE | rt(d) | d1(si16));} ++inline void Assembler::ld( Register d, int si16 ) { emit_int32( LD_OPCODE | rt(d) | ds(si16));} ++inline void Assembler::ldx( Register d, Register s2) { emit_int32( LDX_OPCODE | rt(d) | rb(s2));} ++inline void Assembler::stwx( Register d, Register s2) { emit_int32( STWX_OPCODE | rs(d) | rb(s2));} ++inline void Assembler::stw( Register d, int si16 ) { emit_int32( STW_OPCODE | rs(d) | d1(si16));} ++inline void Assembler::sthx( Register d, Register s2) { emit_int32( STHX_OPCODE | rs(d) | rb(s2));} ++inline void Assembler::sth( Register d, int si16 ) { emit_int32( STH_OPCODE | rs(d) | d1(si16));} ++inline void Assembler::stbx( Register d, Register s2) { emit_int32( STBX_OPCODE | rs(d) | rb(s2));} ++inline void Assembler::stb( Register d, int si16 ) { emit_int32( STB_OPCODE | rs(d) | d1(si16));} ++inline void Assembler::std( Register d, int si16 ) { emit_int32( STD_OPCODE | rs(d) | ds(si16));} ++inline void Assembler::stdx( Register d, Register s2) { emit_int32( STDX_OPCODE | rs(d) | rb(s2));} ++ ++// ra0 version ++inline void Assembler::icbi( Register s2) { emit_int32( ICBI_OPCODE | rb(s2) ); } ++//inline void Assembler::dcba( Register s2) { emit_int32( DCBA_OPCODE | rb(s2) ); } ++inline void Assembler::dcbz( Register s2) { emit_int32( DCBZ_OPCODE | rb(s2) ); } ++inline void Assembler::dcbst( Register s2) { emit_int32( DCBST_OPCODE | rb(s2) ); } ++inline void Assembler::dcbf( Register s2) { emit_int32( DCBF_OPCODE | rb(s2) ); } ++inline void Assembler::dcbt( Register s2) { emit_int32( DCBT_OPCODE | rb(s2) ); } ++inline void Assembler::dcbtct( Register s2, int ct) { emit_int32( DCBT_OPCODE | rb(s2) | thct(ct)); } ++inline void Assembler::dcbtds( Register s2, int ds) { emit_int32( DCBT_OPCODE | rb(s2) | thds(ds)); } ++inline void Assembler::dcbtst( Register s2) { emit_int32( DCBTST_OPCODE | rb(s2) ); } ++inline void Assembler::dcbtstct(Register s2, int ct) { emit_int32( DCBTST_OPCODE | rb(s2) | thct(ct)); } ++ ++// ra0 version ++inline void Assembler::lwarx_unchecked(Register d, Register b, int eh1) { emit_int32( LWARX_OPCODE | rt(d) | rb(b) | eh(eh1)); } ++inline void Assembler::ldarx_unchecked(Register d, Register b, int eh1) { emit_int32( LDARX_OPCODE | rt(d) | rb(b) | eh(eh1)); } ++inline void Assembler::lwarx( Register d, Register b, bool hint_exclusive_access){ lwarx_unchecked(d, b, (hint_exclusive_access && lxarx_hint_exclusive_access() && UseExtendedLoadAndReserveInstructionsPPC64) ? 1 : 0); } ++inline void Assembler::ldarx( Register d, Register b, bool hint_exclusive_access){ ldarx_unchecked(d, b, (hint_exclusive_access && lxarx_hint_exclusive_access() && UseExtendedLoadAndReserveInstructionsPPC64) ? 1 : 0); } ++inline void Assembler::stwcx_(Register s, Register b) { emit_int32( STWCX_OPCODE | rs(s) | rb(b) | rc(1)); } ++inline void Assembler::stdcx_(Register s, Register b) { emit_int32( STDCX_OPCODE | rs(s) | rb(b) | rc(1)); } ++ ++// ra0 version ++inline void Assembler::lfs( FloatRegister d, int si16) { emit_int32( LFS_OPCODE | frt(d) | simm(si16,16)); } ++inline void Assembler::lfsx(FloatRegister d, Register b) { emit_int32( LFSX_OPCODE | frt(d) | rb(b)); } ++inline void Assembler::lfd( FloatRegister d, int si16) { emit_int32( LFD_OPCODE | frt(d) | simm(si16,16)); } ++inline void Assembler::lfdx(FloatRegister d, Register b) { emit_int32( LFDX_OPCODE | frt(d) | rb(b)); } ++ ++// ra0 version ++inline void Assembler::stfs( FloatRegister s, int si16) { emit_int32( STFS_OPCODE | frs(s) | simm(si16, 16)); } ++inline void Assembler::stfsx(FloatRegister s, Register b) { emit_int32( STFSX_OPCODE | frs(s) | rb(b)); } ++inline void Assembler::stfd( FloatRegister s, int si16) { emit_int32( STFD_OPCODE | frs(s) | simm(si16, 16)); } ++inline void Assembler::stfdx(FloatRegister s, Register b) { emit_int32( STFDX_OPCODE | frs(s) | rb(b)); } ++ ++// ra0 version ++inline void Assembler::lvebx( VectorRegister d, Register s2) { emit_int32( LVEBX_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::lvehx( VectorRegister d, Register s2) { emit_int32( LVEHX_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::lvewx( VectorRegister d, Register s2) { emit_int32( LVEWX_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::lvx( VectorRegister d, Register s2) { emit_int32( LVX_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::lvxl( VectorRegister d, Register s2) { emit_int32( LVXL_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::stvebx(VectorRegister d, Register s2) { emit_int32( STVEBX_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::stvehx(VectorRegister d, Register s2) { emit_int32( STVEHX_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::stvewx(VectorRegister d, Register s2) { emit_int32( STVEWX_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::stvx( VectorRegister d, Register s2) { emit_int32( STVX_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::stvxl( VectorRegister d, Register s2) { emit_int32( STVXL_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::lvsl( VectorRegister d, Register s2) { emit_int32( LVSL_OPCODE | vrt(d) | rb(s2)); } ++inline void Assembler::lvsr( VectorRegister d, Register s2) { emit_int32( LVSR_OPCODE | vrt(d) | rb(s2)); } ++ ++inline void Assembler::load_const(Register d, void* x, Register tmp) { ++ load_const(d, (long)x, tmp); ++} ++ ++// Load a 64 bit constant encoded by a `Label'. This works for bound ++// labels as well as unbound ones. For unbound labels, the code will ++// be patched as soon as the label gets bound. ++inline void Assembler::load_const(Register d, Label& L, Register tmp) { ++ load_const(d, target(L), tmp); ++} ++ ++// Load a 64 bit constant encoded by an AddressLiteral. patchable. ++inline void Assembler::load_const(Register d, AddressLiteral& a, Register tmp) { ++ assert(d != R0, "R0 not allowed"); ++ // First relocate (we don't change the offset in the RelocationHolder, ++ // just pass a.rspec()), then delegate to load_const(Register, long). ++ relocate(a.rspec()); ++ load_const(d, (long)a.value(), tmp); ++} ++ ++ ++#endif // CPU_PPC_VM_ASSEMBLER_PPC_INLINE_HPP +--- ./hotspot/src/cpu/ppc/vm/bytecodeInterpreter_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/bytecodeInterpreter_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,106 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_BYTECODEINTERPRETER_PPC_HPP ++#define CPU_PPC_VM_BYTECODEINTERPRETER_PPC_HPP ++ ++// Platform specific for C++ based Interpreter ++#define LOTS_OF_REGS /* Lets interpreter use plenty of registers */ ++ ++private: ++ ++ // Save the bottom of the stack after frame manager setup. For ease of restoration after return ++ // from recursive interpreter call. ++ intptr_t* _frame_bottom; // Saved bottom of frame manager frame. ++ address _last_Java_pc; // Pc to return to in frame manager. ++ intptr_t* _last_Java_fp; // frame pointer ++ intptr_t* _last_Java_sp; // stack pointer ++ interpreterState _self_link; // Previous interpreter state // sometimes points to self??? ++ double _native_fresult; // Save result of native calls that might return floats. ++ intptr_t _native_lresult; // Save result of native calls that might return handle/longs. ++ ++public: ++ address last_Java_pc(void) { return _last_Java_pc; } ++ intptr_t* last_Java_fp(void) { return _last_Java_fp; } ++ ++ static ByteSize native_lresult_offset() { ++ return byte_offset_of(BytecodeInterpreter, _native_lresult); ++ } ++ ++ static ByteSize native_fresult_offset() { ++ return byte_offset_of(BytecodeInterpreter, _native_fresult); ++ } ++ ++ static void pd_layout_interpreterState(interpreterState istate, address last_Java_pc, intptr_t* last_Java_fp); ++ ++#define SET_LAST_JAVA_FRAME() THREAD->frame_anchor()->set(istate->_last_Java_sp, istate->_last_Java_pc); ++#define RESET_LAST_JAVA_FRAME() THREAD->frame_anchor()->clear(); ++ ++ ++// Macros for accessing the stack. ++#undef STACK_INT ++#undef STACK_FLOAT ++#undef STACK_ADDR ++#undef STACK_OBJECT ++#undef STACK_DOUBLE ++#undef STACK_LONG ++ ++// JavaStack Implementation ++#define STACK_SLOT(offset) ((address) &topOfStack[-(offset)]) ++#define STACK_INT(offset) (*((jint*) &topOfStack[-(offset)])) ++#define STACK_FLOAT(offset) (*((jfloat *) &topOfStack[-(offset)])) ++#define STACK_OBJECT(offset) (*((oop *) &topOfStack [-(offset)])) ++#define STACK_DOUBLE(offset) (((VMJavaVal64*) &topOfStack[-(offset)])->d) ++#define STACK_LONG(offset) (((VMJavaVal64 *) &topOfStack[-(offset)])->l) ++ ++#define SET_STACK_SLOT(value, offset) (*(intptr_t*)&topOfStack[-(offset)] = *(intptr_t*)(value)) ++#define SET_STACK_ADDR(value, offset) (*((address *)&topOfStack[-(offset)]) = (value)) ++#define SET_STACK_INT(value, offset) (*((jint *)&topOfStack[-(offset)]) = (value)) ++#define SET_STACK_FLOAT(value, offset) (*((jfloat *)&topOfStack[-(offset)]) = (value)) ++#define SET_STACK_OBJECT(value, offset) (*((oop *)&topOfStack[-(offset)]) = (value)) ++#define SET_STACK_DOUBLE(value, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->d = (value)) ++#define SET_STACK_DOUBLE_FROM_ADDR(addr, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->d = \ ++ ((VMJavaVal64*)(addr))->d) ++#define SET_STACK_LONG(value, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->l = (value)) ++#define SET_STACK_LONG_FROM_ADDR(addr, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->l = \ ++ ((VMJavaVal64*)(addr))->l) ++// JavaLocals implementation ++ ++#define LOCALS_SLOT(offset) ((intptr_t*)&locals[-(offset)]) ++#define LOCALS_ADDR(offset) ((address)locals[-(offset)]) ++#define LOCALS_INT(offset) (*(jint*)&(locals[-(offset)])) ++#define LOCALS_OBJECT(offset) (cast_to_oop(locals[-(offset)])) ++#define LOCALS_LONG_AT(offset) (((address)&locals[-((offset) + 1)])) ++#define LOCALS_DOUBLE_AT(offset) (((address)&locals[-((offset) + 1)])) ++ ++#define SET_LOCALS_SLOT(value, offset) (*(intptr_t*)&locals[-(offset)] = *(intptr_t *)(value)) ++#define SET_LOCALS_INT(value, offset) (*((jint *)&locals[-(offset)]) = (value)) ++#define SET_LOCALS_DOUBLE(value, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->d = (value)) ++#define SET_LOCALS_LONG(value, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->l = (value)) ++#define SET_LOCALS_DOUBLE_FROM_ADDR(addr, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->d = \ ++ ((VMJavaVal64*)(addr))->d) ++ ++ ++#endif // CPU_PPC_VM_BYTECODEINTERPRETER_PPC_PP +--- ./hotspot/src/cpu/ppc/vm/bytecodeInterpreter_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/bytecodeInterpreter_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,290 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_BYTECODEINTERPRETER_PPC_INLINE_HPP ++#define CPU_PPC_VM_BYTECODEINTERPRETER_PPC_INLINE_HPP ++ ++#ifdef CC_INTERP ++ ++// Inline interpreter functions for ppc. ++ ++#include ++ ++inline jfloat BytecodeInterpreter::VMfloatAdd(jfloat op1, jfloat op2) { return op1 + op2; } ++inline jfloat BytecodeInterpreter::VMfloatSub(jfloat op1, jfloat op2) { return op1 - op2; } ++inline jfloat BytecodeInterpreter::VMfloatMul(jfloat op1, jfloat op2) { return op1 * op2; } ++inline jfloat BytecodeInterpreter::VMfloatDiv(jfloat op1, jfloat op2) { return op1 / op2; } ++inline jfloat BytecodeInterpreter::VMfloatRem(jfloat op1, jfloat op2) { return (jfloat)fmod((double)op1, (double)op2); } ++ ++inline jfloat BytecodeInterpreter::VMfloatNeg(jfloat op) { return -op; } ++ ++inline int32_t BytecodeInterpreter::VMfloatCompare(jfloat op1, jfloat op2, int32_t direction) { ++ return ( op1 < op2 ? -1 : ++ op1 > op2 ? 1 : ++ op1 == op2 ? 0 : ++ (direction == -1 || direction == 1) ? direction : 0); ++ ++} ++ ++inline void BytecodeInterpreter::VMmemCopy64(uint32_t to[2], const uint32_t from[2]) { ++ to[0] = from[0]; to[1] = from[1]; ++} ++ ++// The long operations depend on compiler support for "long long" on ppc. ++ ++inline jlong BytecodeInterpreter::VMlongAdd(jlong op1, jlong op2) { ++ return op1 + op2; ++} ++ ++inline jlong BytecodeInterpreter::VMlongAnd(jlong op1, jlong op2) { ++ return op1 & op2; ++} ++ ++inline jlong BytecodeInterpreter::VMlongDiv(jlong op1, jlong op2) { ++ if (op1 == min_jlong && op2 == -1) return op1; ++ return op1 / op2; ++} ++ ++inline jlong BytecodeInterpreter::VMlongMul(jlong op1, jlong op2) { ++ return op1 * op2; ++} ++ ++inline jlong BytecodeInterpreter::VMlongOr(jlong op1, jlong op2) { ++ return op1 | op2; ++} ++ ++inline jlong BytecodeInterpreter::VMlongSub(jlong op1, jlong op2) { ++ return op1 - op2; ++} ++ ++inline jlong BytecodeInterpreter::VMlongXor(jlong op1, jlong op2) { ++ return op1 ^ op2; ++} ++ ++inline jlong BytecodeInterpreter::VMlongRem(jlong op1, jlong op2) { ++ if (op1 == min_jlong && op2 == -1) return 0; ++ return op1 % op2; ++} ++ ++inline jlong BytecodeInterpreter::VMlongUshr(jlong op1, jint op2) { ++ return ((uint64_t) op1) >> (op2 & 0x3F); ++} ++ ++inline jlong BytecodeInterpreter::VMlongShr(jlong op1, jint op2) { ++ return op1 >> (op2 & 0x3F); ++} ++ ++inline jlong BytecodeInterpreter::VMlongShl(jlong op1, jint op2) { ++ return op1 << (op2 & 0x3F); ++} ++ ++inline jlong BytecodeInterpreter::VMlongNeg(jlong op) { ++ return -op; ++} ++ ++inline jlong BytecodeInterpreter::VMlongNot(jlong op) { ++ return ~op; ++} ++ ++inline int32_t BytecodeInterpreter::VMlongLtz(jlong op) { ++ return (op <= 0); ++} ++ ++inline int32_t BytecodeInterpreter::VMlongGez(jlong op) { ++ return (op >= 0); ++} ++ ++inline int32_t BytecodeInterpreter::VMlongEqz(jlong op) { ++ return (op == 0); ++} ++ ++inline int32_t BytecodeInterpreter::VMlongEq(jlong op1, jlong op2) { ++ return (op1 == op2); ++} ++ ++inline int32_t BytecodeInterpreter::VMlongNe(jlong op1, jlong op2) { ++ return (op1 != op2); ++} ++ ++inline int32_t BytecodeInterpreter::VMlongGe(jlong op1, jlong op2) { ++ return (op1 >= op2); ++} ++ ++inline int32_t BytecodeInterpreter::VMlongLe(jlong op1, jlong op2) { ++ return (op1 <= op2); ++} ++ ++inline int32_t BytecodeInterpreter::VMlongLt(jlong op1, jlong op2) { ++ return (op1 < op2); ++} ++ ++inline int32_t BytecodeInterpreter::VMlongGt(jlong op1, jlong op2) { ++ return (op1 > op2); ++} ++ ++inline int32_t BytecodeInterpreter::VMlongCompare(jlong op1, jlong op2) { ++ return (VMlongLt(op1, op2) ? -1 : VMlongGt(op1, op2) ? 1 : 0); ++} ++ ++// Long conversions ++ ++inline jdouble BytecodeInterpreter::VMlong2Double(jlong val) { ++ return (jdouble) val; ++} ++ ++inline jfloat BytecodeInterpreter::VMlong2Float(jlong val) { ++ return (jfloat) val; ++} ++ ++inline jint BytecodeInterpreter::VMlong2Int(jlong val) { ++ return (jint) val; ++} ++ ++// Double Arithmetic ++ ++inline jdouble BytecodeInterpreter::VMdoubleAdd(jdouble op1, jdouble op2) { ++ return op1 + op2; ++} ++ ++inline jdouble BytecodeInterpreter::VMdoubleDiv(jdouble op1, jdouble op2) { ++ return op1 / op2; ++} ++ ++inline jdouble BytecodeInterpreter::VMdoubleMul(jdouble op1, jdouble op2) { ++ return op1 * op2; ++} ++ ++inline jdouble BytecodeInterpreter::VMdoubleNeg(jdouble op) { ++ return -op; ++} ++ ++inline jdouble BytecodeInterpreter::VMdoubleRem(jdouble op1, jdouble op2) { ++ return fmod(op1, op2); ++} ++ ++inline jdouble BytecodeInterpreter::VMdoubleSub(jdouble op1, jdouble op2) { ++ return op1 - op2; ++} ++ ++inline int32_t BytecodeInterpreter::VMdoubleCompare(jdouble op1, jdouble op2, int32_t direction) { ++ return ( op1 < op2 ? -1 : ++ op1 > op2 ? 1 : ++ op1 == op2 ? 0 : ++ (direction == -1 || direction == 1) ? direction : 0); ++} ++ ++// Double Conversions ++ ++inline jfloat BytecodeInterpreter::VMdouble2Float(jdouble val) { ++ return (jfloat) val; ++} ++ ++// Float Conversions ++ ++inline jdouble BytecodeInterpreter::VMfloat2Double(jfloat op) { ++ return (jdouble) op; ++} ++ ++// Integer Arithmetic ++ ++inline jint BytecodeInterpreter::VMintAdd(jint op1, jint op2) { ++ return op1 + op2; ++} ++ ++inline jint BytecodeInterpreter::VMintAnd(jint op1, jint op2) { ++ return op1 & op2; ++} ++ ++inline jint BytecodeInterpreter::VMintDiv(jint op1, jint op2) { ++ /* it's possible we could catch this special case implicitly */ ++ if ((juint)op1 == 0x80000000 && op2 == -1) return op1; ++ else return op1 / op2; ++} ++ ++inline jint BytecodeInterpreter::VMintMul(jint op1, jint op2) { ++ return op1 * op2; ++} ++ ++inline jint BytecodeInterpreter::VMintNeg(jint op) { ++ return -op; ++} ++ ++inline jint BytecodeInterpreter::VMintOr(jint op1, jint op2) { ++ return op1 | op2; ++} ++ ++inline jint BytecodeInterpreter::VMintRem(jint op1, jint op2) { ++ /* it's possible we could catch this special case implicitly */ ++ if ((juint)op1 == 0x80000000 && op2 == -1) return 0; ++ else return op1 % op2; ++} ++ ++inline jint BytecodeInterpreter::VMintShl(jint op1, jint op2) { ++ return op1 << (op2 & 0x1f); ++} ++ ++inline jint BytecodeInterpreter::VMintShr(jint op1, jint op2) { ++ return op1 >> (op2 & 0x1f); ++} ++ ++inline jint BytecodeInterpreter::VMintSub(jint op1, jint op2) { ++ return op1 - op2; ++} ++ ++inline juint BytecodeInterpreter::VMintUshr(jint op1, jint op2) { ++ return ((juint) op1) >> (op2 & 0x1f); ++} ++ ++inline jint BytecodeInterpreter::VMintXor(jint op1, jint op2) { ++ return op1 ^ op2; ++} ++ ++inline jdouble BytecodeInterpreter::VMint2Double(jint val) { ++ return (jdouble) val; ++} ++ ++inline jfloat BytecodeInterpreter::VMint2Float(jint val) { ++ return (jfloat) val; ++} ++ ++inline jlong BytecodeInterpreter::VMint2Long(jint val) { ++ return (jlong) val; ++} ++ ++inline jchar BytecodeInterpreter::VMint2Char(jint val) { ++ return (jchar) val; ++} ++ ++inline jshort BytecodeInterpreter::VMint2Short(jint val) { ++ return (jshort) val; ++} ++ ++inline jbyte BytecodeInterpreter::VMint2Byte(jint val) { ++ return (jbyte) val; ++} ++ ++#endif // CC_INTERP ++ ++#endif // CPU_PPC_VM_BYTECODEINTERPRETER_PPC_INLINE_HPP +--- ./hotspot/src/cpu/ppc/vm/bytecodes_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/bytecodes_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,31 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "interpreter/bytecodes.hpp" ++ ++void Bytecodes::pd_initialize() { ++ // No ppc specific initialization. ++} +--- ./hotspot/src/cpu/ppc/vm/bytecodes_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/bytecodes_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,31 @@ ++/* ++ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_BYTECODES_PPC_HPP ++#define CPU_PPC_VM_BYTECODES_PPC_HPP ++ ++// No ppc64 specific bytecodes ++ ++#endif // CPU_PPC_VM_BYTECODES_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/bytes_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/bytes_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,281 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_BYTES_PPC_HPP ++#define CPU_PPC_VM_BYTES_PPC_HPP ++ ++#include "memory/allocation.hpp" ++ ++class Bytes: AllStatic { ++ public: ++ // Efficient reading and writing of unaligned unsigned data in platform-specific byte ordering ++ // PowerPC needs to check for alignment. ++ ++ // Can I count on address always being a pointer to an unsigned char? Yes. ++ ++#if defined(VM_LITTLE_ENDIAN) ++ ++ // Returns true, if the byte ordering used by Java is different from the native byte ordering ++ // of the underlying machine. For example, true for Intel x86, False, for Solaris on Sparc. ++ static inline bool is_Java_byte_ordering_different() { return true; } ++ ++ // Forward declarations of the compiler-dependent implementation ++ static inline u2 swap_u2(u2 x); ++ static inline u4 swap_u4(u4 x); ++ static inline u8 swap_u8(u8 x); ++ ++ static inline u2 get_native_u2(address p) { ++ return (intptr_t(p) & 1) == 0 ++ ? *(u2*)p ++ : ( u2(p[1]) << 8 ) ++ | ( u2(p[0]) ); ++ } ++ ++ static inline u4 get_native_u4(address p) { ++ switch (intptr_t(p) & 3) { ++ case 0: return *(u4*)p; ++ ++ case 2: return ( u4( ((u2*)p)[1] ) << 16 ) ++ | ( u4( ((u2*)p)[0] ) ); ++ ++ default: return ( u4(p[3]) << 24 ) ++ | ( u4(p[2]) << 16 ) ++ | ( u4(p[1]) << 8 ) ++ | u4(p[0]); ++ } ++ } ++ ++ static inline u8 get_native_u8(address p) { ++ switch (intptr_t(p) & 7) { ++ case 0: return *(u8*)p; ++ ++ case 4: return ( u8( ((u4*)p)[1] ) << 32 ) ++ | ( u8( ((u4*)p)[0] ) ); ++ ++ case 2: return ( u8( ((u2*)p)[3] ) << 48 ) ++ | ( u8( ((u2*)p)[2] ) << 32 ) ++ | ( u8( ((u2*)p)[1] ) << 16 ) ++ | ( u8( ((u2*)p)[0] ) ); ++ ++ default: return ( u8(p[7]) << 56 ) ++ | ( u8(p[6]) << 48 ) ++ | ( u8(p[5]) << 40 ) ++ | ( u8(p[4]) << 32 ) ++ | ( u8(p[3]) << 24 ) ++ | ( u8(p[2]) << 16 ) ++ | ( u8(p[1]) << 8 ) ++ | u8(p[0]); ++ } ++ } ++ ++ ++ ++ static inline void put_native_u2(address p, u2 x) { ++ if ( (intptr_t(p) & 1) == 0 ) *(u2*)p = x; ++ else { ++ p[1] = x >> 8; ++ p[0] = x; ++ } ++ } ++ ++ static inline void put_native_u4(address p, u4 x) { ++ switch ( intptr_t(p) & 3 ) { ++ case 0: *(u4*)p = x; ++ break; ++ ++ case 2: ((u2*)p)[1] = x >> 16; ++ ((u2*)p)[0] = x; ++ break; ++ ++ default: ((u1*)p)[3] = x >> 24; ++ ((u1*)p)[2] = x >> 16; ++ ((u1*)p)[1] = x >> 8; ++ ((u1*)p)[0] = x; ++ break; ++ } ++ } ++ ++ static inline void put_native_u8(address p, u8 x) { ++ switch ( intptr_t(p) & 7 ) { ++ case 0: *(u8*)p = x; ++ break; ++ ++ case 4: ((u4*)p)[1] = x >> 32; ++ ((u4*)p)[0] = x; ++ break; ++ ++ case 2: ((u2*)p)[3] = x >> 48; ++ ((u2*)p)[2] = x >> 32; ++ ((u2*)p)[1] = x >> 16; ++ ((u2*)p)[0] = x; ++ break; ++ ++ default: ((u1*)p)[7] = x >> 56; ++ ((u1*)p)[6] = x >> 48; ++ ((u1*)p)[5] = x >> 40; ++ ((u1*)p)[4] = x >> 32; ++ ((u1*)p)[3] = x >> 24; ++ ((u1*)p)[2] = x >> 16; ++ ((u1*)p)[1] = x >> 8; ++ ((u1*)p)[0] = x; ++ } ++ } ++ ++ // Efficient reading and writing of unaligned unsigned data in Java byte ordering (i.e. big-endian ordering) ++ // (no byte-order reversal is needed since Power CPUs are big-endian oriented). ++ static inline u2 get_Java_u2(address p) { return swap_u2(get_native_u2(p)); } ++ static inline u4 get_Java_u4(address p) { return swap_u4(get_native_u4(p)); } ++ static inline u8 get_Java_u8(address p) { return swap_u8(get_native_u8(p)); } ++ ++ static inline void put_Java_u2(address p, u2 x) { put_native_u2(p, swap_u2(x)); } ++ static inline void put_Java_u4(address p, u4 x) { put_native_u4(p, swap_u4(x)); } ++ static inline void put_Java_u8(address p, u8 x) { put_native_u8(p, swap_u8(x)); } ++ ++#else // !defined(VM_LITTLE_ENDIAN) ++ ++ // Returns true, if the byte ordering used by Java is different from the nativ byte ordering ++ // of the underlying machine. For example, true for Intel x86, False, for Solaris on Sparc. ++ static inline bool is_Java_byte_ordering_different() { return false; } ++ ++ // Thus, a swap between native and Java ordering is always a no-op: ++ static inline u2 swap_u2(u2 x) { return x; } ++ static inline u4 swap_u4(u4 x) { return x; } ++ static inline u8 swap_u8(u8 x) { return x; } ++ ++ static inline u2 get_native_u2(address p) { ++ return (intptr_t(p) & 1) == 0 ++ ? *(u2*)p ++ : ( u2(p[0]) << 8 ) ++ | ( u2(p[1]) ); ++ } ++ ++ static inline u4 get_native_u4(address p) { ++ switch (intptr_t(p) & 3) { ++ case 0: return *(u4*)p; ++ ++ case 2: return ( u4( ((u2*)p)[0] ) << 16 ) ++ | ( u4( ((u2*)p)[1] ) ); ++ ++ default: return ( u4(p[0]) << 24 ) ++ | ( u4(p[1]) << 16 ) ++ | ( u4(p[2]) << 8 ) ++ | u4(p[3]); ++ } ++ } ++ ++ static inline u8 get_native_u8(address p) { ++ switch (intptr_t(p) & 7) { ++ case 0: return *(u8*)p; ++ ++ case 4: return ( u8( ((u4*)p)[0] ) << 32 ) ++ | ( u8( ((u4*)p)[1] ) ); ++ ++ case 2: return ( u8( ((u2*)p)[0] ) << 48 ) ++ | ( u8( ((u2*)p)[1] ) << 32 ) ++ | ( u8( ((u2*)p)[2] ) << 16 ) ++ | ( u8( ((u2*)p)[3] ) ); ++ ++ default: return ( u8(p[0]) << 56 ) ++ | ( u8(p[1]) << 48 ) ++ | ( u8(p[2]) << 40 ) ++ | ( u8(p[3]) << 32 ) ++ | ( u8(p[4]) << 24 ) ++ | ( u8(p[5]) << 16 ) ++ | ( u8(p[6]) << 8 ) ++ | u8(p[7]); ++ } ++ } ++ ++ ++ ++ static inline void put_native_u2(address p, u2 x) { ++ if ( (intptr_t(p) & 1) == 0 ) { *(u2*)p = x; } ++ else { ++ p[0] = x >> 8; ++ p[1] = x; ++ } ++ } ++ ++ static inline void put_native_u4(address p, u4 x) { ++ switch ( intptr_t(p) & 3 ) { ++ case 0: *(u4*)p = x; ++ break; ++ ++ case 2: ((u2*)p)[0] = x >> 16; ++ ((u2*)p)[1] = x; ++ break; ++ ++ default: ((u1*)p)[0] = x >> 24; ++ ((u1*)p)[1] = x >> 16; ++ ((u1*)p)[2] = x >> 8; ++ ((u1*)p)[3] = x; ++ break; ++ } ++ } ++ ++ static inline void put_native_u8(address p, u8 x) { ++ switch ( intptr_t(p) & 7 ) { ++ case 0: *(u8*)p = x; ++ break; ++ ++ case 4: ((u4*)p)[0] = x >> 32; ++ ((u4*)p)[1] = x; ++ break; ++ ++ case 2: ((u2*)p)[0] = x >> 48; ++ ((u2*)p)[1] = x >> 32; ++ ((u2*)p)[2] = x >> 16; ++ ((u2*)p)[3] = x; ++ break; ++ ++ default: ((u1*)p)[0] = x >> 56; ++ ((u1*)p)[1] = x >> 48; ++ ((u1*)p)[2] = x >> 40; ++ ((u1*)p)[3] = x >> 32; ++ ((u1*)p)[4] = x >> 24; ++ ((u1*)p)[5] = x >> 16; ++ ((u1*)p)[6] = x >> 8; ++ ((u1*)p)[7] = x; ++ } ++ } ++ ++ // Efficient reading and writing of unaligned unsigned data in Java byte ordering (i.e. big-endian ordering) ++ // (no byte-order reversal is needed since Power CPUs are big-endian oriented). ++ static inline u2 get_Java_u2(address p) { return get_native_u2(p); } ++ static inline u4 get_Java_u4(address p) { return get_native_u4(p); } ++ static inline u8 get_Java_u8(address p) { return get_native_u8(p); } ++ ++ static inline void put_Java_u2(address p, u2 x) { put_native_u2(p, x); } ++ static inline void put_Java_u4(address p, u4 x) { put_native_u4(p, x); } ++ static inline void put_Java_u8(address p, u8 x) { put_native_u8(p, x); } ++ ++#endif // VM_LITTLE_ENDIAN ++}; ++ ++#if defined(TARGET_OS_ARCH_linux_ppc) ++#include "bytes_linux_ppc.inline.hpp" ++#endif ++ ++#endif // CPU_PPC_VM_BYTES_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/c2_globals_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/c2_globals_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,98 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_C2_GLOBALS_PPC_HPP ++#define CPU_PPC_VM_C2_GLOBALS_PPC_HPP ++ ++#include "utilities/globalDefinitions.hpp" ++#include "utilities/macros.hpp" ++ ++// Sets the default values for platform dependent flags used by the server compiler. ++// (see c2_globals.hpp). ++ ++define_pd_global(bool, BackgroundCompilation, true); ++define_pd_global(bool, CICompileOSR, true); ++define_pd_global(bool, InlineIntrinsics, true); ++define_pd_global(bool, PreferInterpreterNativeStubs, false); ++define_pd_global(bool, ProfileTraps, true); ++define_pd_global(bool, UseOnStackReplacement, true); ++define_pd_global(bool, ProfileInterpreter, true); ++define_pd_global(bool, TieredCompilation, false); ++define_pd_global(intx, CompileThreshold, 10000); ++define_pd_global(intx, BackEdgeThreshold, 140000); ++ ++define_pd_global(intx, OnStackReplacePercentage, 140); ++define_pd_global(intx, ConditionalMoveLimit, 3); ++define_pd_global(intx, FLOATPRESSURE, 28); ++define_pd_global(intx, FreqInlineSize, 175); ++define_pd_global(intx, MinJumpTableSize, 10); ++define_pd_global(intx, INTPRESSURE, 25); ++define_pd_global(intx, InteriorEntryAlignment, 16); ++define_pd_global(intx, NewSizeThreadIncrease, ScaleForWordSize(4*K)); ++define_pd_global(intx, RegisterCostAreaRatio, 16000); ++define_pd_global(bool, UseTLAB, true); ++define_pd_global(bool, ResizeTLAB, true); ++define_pd_global(intx, LoopUnrollLimit, 60); ++ ++// Peephole and CISC spilling both break the graph, and so make the ++// scheduler sick. ++define_pd_global(bool, OptoPeephole, false); ++define_pd_global(bool, UseCISCSpill, false); ++define_pd_global(bool, OptoBundling, false); ++// GL: ++// Detected a problem with unscaled compressed oops and ++// narrow_oop_use_complex_address() == false. ++// -Djava.io.tmpdir=./tmp -jar SPECjvm2008.jar -ikv -wt 3 -it 3 ++// -bt 1 --base compiler.sunflow ++// fails in Lower.visitIf->translate->tranlate->translate and ++// throws an unexpected NPE. A load and a store seem to be ++// reordered. Java reads about: ++// loc = x.f ++// x.f = 0 ++// NullCheck loc ++// While assembler reads: ++// x.f = 0 ++// loc = x.f ++// NullCheck loc ++define_pd_global(bool, OptoScheduling, false); ++ ++define_pd_global(intx, InitialCodeCacheSize, 2048*K); // Integral multiple of CodeCacheExpansionSize ++define_pd_global(intx, ReservedCodeCacheSize, 256*M); ++define_pd_global(intx, CodeCacheExpansionSize, 64*K); ++ ++// Ergonomics related flags ++define_pd_global(uint64_t,MaxRAM, 4ULL*G); ++define_pd_global(uintx, CodeCacheMinBlockLength, 4); ++define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K); ++ ++define_pd_global(bool, TrapBasedRangeChecks, true); ++ ++// Heap related flags ++define_pd_global(uintx,MetaspaceSize, ScaleForWordSize(16*M)); ++ ++// Ergonomics related flags ++define_pd_global(bool, NeverActAsServerClassMachine, false); ++ ++#endif // CPU_PPC_VM_C2_GLOBALS_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/c2_init_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/c2_init_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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/compile.hpp" ++#include "opto/node.hpp" ++#include "runtime/globals.hpp" ++#include "utilities/debug.hpp" ++ ++// processor dependent initialization for ppc ++ ++void Compile::pd_compiler2_init() { ++ ++ // Power7 and later ++ if (PowerArchitecturePPC64 > 6) { ++ if (FLAG_IS_DEFAULT(UsePopCountInstruction)) { ++ FLAG_SET_ERGO(bool, UsePopCountInstruction, true); ++ } ++ } ++ ++ if (PowerArchitecturePPC64 == 6) { ++ if (FLAG_IS_DEFAULT(InsertEndGroupPPC64)) { ++ FLAG_SET_ERGO(bool, InsertEndGroupPPC64, true); ++ } ++ } ++} +--- ./hotspot/src/cpu/ppc/vm/codeBuffer_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/codeBuffer_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_CODEBUFFER_PPC_HPP ++#define CPU_PPC_VM_CODEBUFFER_PPC_HPP ++ ++private: ++ void pd_initialize() {} ++ ++public: ++ void flush_bundle(bool start_new_bundle) {} ++ ++#endif // CPU_PPC_VM_CODEBUFFER_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/compiledIC_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/compiledIC_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,261 @@ ++/* ++ * Copyright (c) 1997, 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. ++ * ++ */ ++ ++#include "precompiled.hpp" ++#include "asm/macroAssembler.inline.hpp" ++#include "code/compiledIC.hpp" ++#include "code/icBuffer.hpp" ++#include "code/nmethod.hpp" ++#include "memory/resourceArea.hpp" ++#include "runtime/mutexLocker.hpp" ++#include "runtime/safepoint.hpp" ++#ifdef COMPILER2 ++#include "opto/matcher.hpp" ++#endif ++ ++// Release the CompiledICHolder* associated with this call site is there is one. ++void CompiledIC::cleanup_call_site(virtual_call_Relocation* call_site) { ++ // This call site might have become stale so inspect it carefully. ++ NativeCall* call = nativeCall_at(call_site->addr()); ++ if (is_icholder_entry(call->destination())) { ++ NativeMovConstReg* value = nativeMovConstReg_at(call_site->cached_value()); ++ InlineCacheBuffer::queue_for_release((CompiledICHolder*)value->data()); ++ } ++} ++ ++bool CompiledIC::is_icholder_call_site(virtual_call_Relocation* call_site) { ++ // This call site might have become stale so inspect it carefully. ++ NativeCall* call = nativeCall_at(call_site->addr()); ++ return is_icholder_entry(call->destination()); ++} ++ ++//----------------------------------------------------------------------------- ++// High-level access to an inline cache. Guaranteed to be MT-safe. ++ ++CompiledIC::CompiledIC(nmethod* nm, NativeCall* call) ++ : _ic_call(call) ++{ ++ address ic_call = call->instruction_address(); ++ ++ assert(ic_call != NULL, "ic_call address must be set"); ++ assert(nm != NULL, "must pass nmethod"); ++ assert(nm->contains(ic_call), "must be in nmethod"); ++ ++ // Search for the ic_call at the given address. ++ RelocIterator iter(nm, ic_call, ic_call+1); ++ bool ret = iter.next(); ++ assert(ret == true, "relocInfo must exist at this address"); ++ assert(iter.addr() == ic_call, "must find ic_call"); ++ if (iter.type() == relocInfo::virtual_call_type) { ++ virtual_call_Relocation* r = iter.virtual_call_reloc(); ++ _is_optimized = false; ++ _value = nativeMovConstReg_at(r->cached_value()); ++ } else { ++ assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call"); ++ _is_optimized = true; ++ _value = NULL; ++ } ++} ++ ++// ---------------------------------------------------------------------------- ++ ++// A PPC CompiledStaticCall looks like this: ++// ++// >>>> consts ++// ++// [call target1] ++// [IC cache] ++// [call target2] ++// ++// <<<< consts ++// >>>> insts ++// ++// bl offset16 -+ -+ ??? // How many bits available? ++// | | ++// <<<< insts | | ++// >>>> stubs | | ++// | |- trampoline_stub_Reloc ++// trampoline stub: | <-+ ++// r2 = toc | ++// r2 = [r2 + offset] | // Load call target1 from const section ++// mtctr r2 | ++// bctr |- static_stub_Reloc ++// comp_to_interp_stub: <---+ ++// r1 = toc ++// ICreg = [r1 + IC_offset] // Load IC from const section ++// r1 = [r1 + offset] // Load call target2 from const section ++// mtctr r1 ++// bctr ++// ++// <<<< stubs ++// ++// The call instruction in the code either ++// - branches directly to a compiled method if offset encodable in instruction ++// - branches to the trampoline stub if offset to compiled method not encodable ++// - branches to the compiled_to_interp stub if target interpreted ++// ++// Further there are three relocations from the loads to the constants in ++// the constant section. ++// ++// Usage of r1 and r2 in the stubs allows to distinguish them. ++ ++const int IC_pos_in_java_to_interp_stub = 8; ++#define __ _masm. ++void CompiledStaticCall::emit_to_interp_stub(CodeBuffer &cbuf) { ++#ifdef COMPILER2 ++ // Get the mark within main instrs section which is set to the address of the call. ++ address call_addr = cbuf.insts_mark(); ++ ++ // Note that the code buffer's insts_mark is always relative to insts. ++ // That's why we must use the macroassembler to generate a stub. ++ MacroAssembler _masm(&cbuf); ++ ++ // Start the stub. ++ address stub = __ start_a_stub(CompiledStaticCall::to_interp_stub_size()); ++ if (stub == NULL) { ++ Compile::current()->env()->record_out_of_memory_failure(); ++ return; ++ } ++ ++ // For java_to_interp stubs we use R11_scratch1 as scratch register ++ // and in call trampoline stubs we use R12_scratch2. This way we ++ // can distinguish them (see is_NativeCallTrampolineStub_at()). ++ Register reg_scratch = R11_scratch1; ++ ++ // Create a static stub relocation which relates this stub ++ // with the call instruction at insts_call_instruction_offset in the ++ // instructions code-section. ++ __ relocate(static_stub_Relocation::spec(call_addr)); ++ const int stub_start_offset = __ offset(); ++ ++ // Now, create the stub's code: ++ // - load the TOC ++ // - load the inline cache oop from the constant pool ++ // - load the call target from the constant pool ++ // - call ++ __ calculate_address_from_global_toc(reg_scratch, __ method_toc()); ++ AddressLiteral ic = __ allocate_metadata_address((Metadata *)NULL); ++ __ load_const_from_method_toc(as_Register(Matcher::inline_cache_reg_encode()), ic, reg_scratch); ++ ++ if (ReoptimizeCallSequences) { ++ __ b64_patchable((address)-1, relocInfo::none); ++ } else { ++ AddressLiteral a((address)-1); ++ __ load_const_from_method_toc(reg_scratch, a, reg_scratch); ++ __ mtctr(reg_scratch); ++ __ bctr(); ++ } ++ ++ // FIXME: Assert that the stub can be identified and patched. ++ ++ // Java_to_interp_stub_size should be good. ++ assert((__ offset() - stub_start_offset) <= CompiledStaticCall::to_interp_stub_size(), ++ "should be good size"); ++ assert(!is_NativeCallTrampolineStub_at(__ addr_at(stub_start_offset)), ++ "must not confuse java_to_interp with trampoline stubs"); ++ ++ // End the stub. ++ __ end_a_stub(); ++#else ++ ShouldNotReachHere(); ++#endif ++} ++#undef __ ++ ++// Size of java_to_interp stub, this doesn't need to be accurate but it must ++// be larger or equal to the real size of the stub. ++// Used for optimization in Compile::Shorten_branches. ++int CompiledStaticCall::to_interp_stub_size() { ++ return 12 * BytesPerInstWord; ++} ++ ++// Relocation entries for call stub, compiled java to interpreter. ++// Used for optimization in Compile::Shorten_branches. ++int CompiledStaticCall::reloc_to_interp_stub() { ++ return 5; ++} ++ ++void CompiledStaticCall::set_to_interpreted(methodHandle callee, address entry) { ++ address stub = find_stub(); ++ guarantee(stub != NULL, "stub not found"); ++ ++ if (TraceICs) { ++ ResourceMark rm; ++ tty->print_cr("CompiledStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s", ++ instruction_address(), ++ callee->name_and_sig_as_C_string()); ++ } ++ ++ // Creation also verifies the object. ++ NativeMovConstReg* method_holder = nativeMovConstReg_at(stub + IC_pos_in_java_to_interp_stub); ++ NativeJump* jump = nativeJump_at(method_holder->next_instruction_address()); ++ ++ assert(method_holder->data() == 0 || method_holder->data() == (intptr_t)callee(), ++ "a) MT-unsafe modification of inline cache"); ++ assert(jump->jump_destination() == (address)-1 || jump->jump_destination() == entry, ++ "b) MT-unsafe modification of inline cache"); ++ ++ // Update stub. ++ method_holder->set_data((intptr_t)callee()); ++ jump->set_jump_destination(entry); ++ ++ // Update jump to call. ++ set_destination_mt_safe(stub); ++} ++ ++void CompiledStaticCall::set_stub_to_clean(static_stub_Relocation* static_stub) { ++ assert (CompiledIC_lock->is_locked() || SafepointSynchronize::is_at_safepoint(), "mt unsafe call"); ++ // Reset stub. ++ address stub = static_stub->addr(); ++ assert(stub != NULL, "stub not found"); ++ // Creation also verifies the object. ++ NativeMovConstReg* method_holder = nativeMovConstReg_at(stub + IC_pos_in_java_to_interp_stub); ++ NativeJump* jump = nativeJump_at(method_holder->next_instruction_address()); ++ method_holder->set_data(0); ++ jump->set_jump_destination((address)-1); ++} ++ ++//----------------------------------------------------------------------------- ++// Non-product mode code ++#ifndef PRODUCT ++ ++void CompiledStaticCall::verify() { ++ // Verify call. ++ NativeCall::verify(); ++ if (os::is_MP()) { ++ verify_alignment(); ++ } ++ ++ // Verify stub. ++ address stub = find_stub(); ++ assert(stub != NULL, "no stub found for static call"); ++ // Creation also verifies the object. ++ NativeMovConstReg* method_holder = nativeMovConstReg_at(stub + IC_pos_in_java_to_interp_stub); ++ NativeJump* jump = nativeJump_at(method_holder->next_instruction_address()); ++ ++ // Verify state. ++ assert(is_clean() || is_call_to_compiled() || is_call_to_interpreted(), "sanity check"); ++} ++ ++#endif // !PRODUCT +--- ./hotspot/src/cpu/ppc/vm/copy_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/copy_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,171 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_COPY_PPC_HPP ++#define CPU_PPC_VM_COPY_PPC_HPP ++ ++#ifndef PPC64 ++#error "copy currently only implemented for PPC64" ++#endif ++ ++// Inline functions for memory copy and fill. ++ ++static void pd_conjoint_words(HeapWord* from, HeapWord* to, size_t count) { ++ (void)memmove(to, from, count * HeapWordSize); ++} ++ ++static void pd_disjoint_words(HeapWord* from, HeapWord* to, size_t count) { ++ switch (count) { ++ case 8: to[7] = from[7]; ++ case 7: to[6] = from[6]; ++ case 6: to[5] = from[5]; ++ case 5: to[4] = from[4]; ++ case 4: to[3] = from[3]; ++ case 3: to[2] = from[2]; ++ case 2: to[1] = from[1]; ++ case 1: to[0] = from[0]; ++ case 0: break; ++ default: (void)memcpy(to, from, count * HeapWordSize); ++ break; ++ } ++} ++ ++static void pd_disjoint_words_atomic(HeapWord* from, HeapWord* to, size_t count) { ++ switch (count) { ++ case 8: to[7] = from[7]; ++ case 7: to[6] = from[6]; ++ case 6: to[5] = from[5]; ++ case 5: to[4] = from[4]; ++ case 4: to[3] = from[3]; ++ case 3: to[2] = from[2]; ++ case 2: to[1] = from[1]; ++ case 1: to[0] = from[0]; ++ case 0: break; ++ default: while (count-- > 0) { ++ *to++ = *from++; ++ } ++ break; ++ } ++} ++ ++static void pd_aligned_conjoint_words(HeapWord* from, HeapWord* to, size_t count) { ++ (void)memmove(to, from, count * HeapWordSize); ++} ++ ++static void pd_aligned_disjoint_words(HeapWord* from, HeapWord* to, size_t count) { ++ pd_disjoint_words(from, to, count); ++} ++ ++static void pd_conjoint_bytes(void* from, void* to, size_t count) { ++ (void)memmove(to, from, count); ++} ++ ++static void pd_conjoint_bytes_atomic(void* from, void* to, size_t count) { ++ (void)memmove(to, from, count); ++} ++ ++// Template for atomic, element-wise copy. ++template ++static void copy_conjoint_atomic(T* from, T* to, size_t count) { ++ if (from > to) { ++ while (count-- > 0) { ++ // Copy forwards ++ *to++ = *from++; ++ } ++ } else { ++ from += count - 1; ++ to += count - 1; ++ while (count-- > 0) { ++ // Copy backwards ++ *to-- = *from--; ++ } ++ } ++} ++ ++static void pd_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) { ++ // TODO: contribute optimized version. ++ copy_conjoint_atomic(from, to, count); ++} ++ ++static void pd_conjoint_jints_atomic(jint* from, jint* to, size_t count) { ++ // TODO: contribute optimized version. ++ copy_conjoint_atomic(from, to, count); ++} ++ ++static void pd_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) { ++ copy_conjoint_atomic(from, to, count); ++} ++ ++static void pd_conjoint_oops_atomic(oop* from, oop* to, size_t count) { ++ copy_conjoint_atomic(from, to, count); ++} ++ ++static void pd_arrayof_conjoint_bytes(HeapWord* from, HeapWord* to, size_t count) { ++ pd_conjoint_bytes_atomic(from, to, count); ++} ++ ++static void pd_arrayof_conjoint_jshorts(HeapWord* from, HeapWord* to, size_t count) { ++ // TODO: contribute optimized version. ++ pd_conjoint_jshorts_atomic((jshort*)from, (jshort*)to, count); ++} ++ ++static void pd_arrayof_conjoint_jints(HeapWord* from, HeapWord* to, size_t count) { ++ // TODO: contribute optimized version. ++ pd_conjoint_jints_atomic((jint*)from, (jint*)to, count); ++} ++ ++static void pd_arrayof_conjoint_jlongs(HeapWord* from, HeapWord* to, size_t count) { ++ pd_conjoint_jlongs_atomic((jlong*)from, (jlong*)to, count); ++} ++ ++static void pd_arrayof_conjoint_oops(HeapWord* from, HeapWord* to, size_t count) { ++ pd_conjoint_oops_atomic((oop*)from, (oop*)to, count); ++} ++ ++static void pd_fill_to_words(HeapWord* tohw, size_t count, juint value) { ++ julong* to = (julong*)tohw; ++ julong v = ((julong)value << 32) | value; ++ while (count-- > 0) { ++ *to++ = v; ++ } ++} ++ ++static void pd_fill_to_aligned_words(HeapWord* tohw, size_t count, juint value) { ++ pd_fill_to_words(tohw, count, value); ++} ++ ++static void pd_fill_to_bytes(void* to, size_t count, jubyte value) { ++ (void)memset(to, value, count); ++} ++ ++static void pd_zero_to_words(HeapWord* tohw, size_t count) { ++ pd_fill_to_words(tohw, count, 0); ++} ++ ++static void pd_zero_to_bytes(void* to, size_t count) { ++ (void)memset(to, 0, count); ++} ++ ++#endif // CPU_PPC_VM_COPY_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/cppInterpreterGenerator_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/cppInterpreterGenerator_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,43 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_CPPINTERPRETERGENERATOR_PPC_HPP ++#define CPU_PPC_VM_CPPINTERPRETERGENERATOR_PPC_HPP ++ ++ address generate_normal_entry(void); ++ address generate_native_entry(void); ++ ++ void lock_method(void); ++ void unlock_method(void); ++ ++ void generate_counter_incr(Label& overflow); ++ void generate_counter_overflow(Label& do_continue); ++ ++ void generate_more_monitors(); ++ void generate_deopt_handling(Register result_index); ++ ++ void generate_compute_interpreter_state(Label& exception_return); ++ ++#endif // CPU_PPC_VM_CPPINTERPRETERGENERATOR_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/cppInterpreter_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/cppInterpreter_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,3074 @@ ++ ++/* ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/assembler.hpp" ++#include "asm/macroAssembler.inline.hpp" ++#include "interpreter/bytecodeHistogram.hpp" ++#include "interpreter/cppInterpreter.hpp" ++#include "interpreter/interpreter.hpp" ++#include "interpreter/interpreterGenerator.hpp" ++#include "interpreter/interpreterRuntime.hpp" ++#include "oops/arrayOop.hpp" ++#include "oops/methodData.hpp" ++#include "oops/method.hpp" ++#include "oops/oop.inline.hpp" ++#include "prims/jvmtiExport.hpp" ++#include "prims/jvmtiThreadState.hpp" ++#include "runtime/arguments.hpp" ++#include "runtime/deoptimization.hpp" ++#include "runtime/frame.inline.hpp" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "runtime/synchronizer.hpp" ++#include "runtime/timer.hpp" ++#include "runtime/vframeArray.hpp" ++#include "utilities/debug.hpp" ++#ifdef SHARK ++#include "shark/shark_globals.hpp" ++#endif ++ ++#ifdef CC_INTERP ++ ++#define __ _masm-> ++ ++// Contains is used for identifying interpreter frames during a stack-walk. ++// A frame with a PC in InterpretMethod must be identified as a normal C frame. ++bool CppInterpreter::contains(address pc) { ++ return _code->contains(pc); ++} ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) // nothing ++#else ++#define BLOCK_COMMENT(str) __ block_comment(str) ++#endif ++ ++#define BIND(label) bind(label); BLOCK_COMMENT(#label ":") ++ ++static address interpreter_frame_manager = NULL; ++static address frame_manager_specialized_return = NULL; ++static address native_entry = NULL; ++ ++static address interpreter_return_address = NULL; ++ ++static address unctrap_frame_manager_entry = NULL; ++ ++static address deopt_frame_manager_return_atos = NULL; ++static address deopt_frame_manager_return_btos = NULL; ++static address deopt_frame_manager_return_itos = NULL; ++static address deopt_frame_manager_return_ltos = NULL; ++static address deopt_frame_manager_return_ftos = NULL; ++static address deopt_frame_manager_return_dtos = NULL; ++static address deopt_frame_manager_return_vtos = NULL; ++ ++// A result handler converts/unboxes a native call result into ++// a java interpreter/compiler result. The current frame is an ++// interpreter frame. ++address CppInterpreterGenerator::generate_result_handler_for(BasicType type) { ++ return AbstractInterpreterGenerator::generate_result_handler_for(type); ++} ++ ++// tosca based result to c++ interpreter stack based result. ++address CppInterpreterGenerator::generate_tosca_to_stack_converter(BasicType type) { ++ // ++ // A result is in the native abi result register from a native ++ // method call. We need to return this result to the interpreter by ++ // pushing the result on the interpreter's stack. ++ // ++ // Registers alive: ++ // R3_ARG1(R3_RET)/F1_ARG1(F1_RET) - result to move ++ // R4_ARG2 - address of tos ++ // LR ++ // ++ // Registers updated: ++ // R3_RET(R3_ARG1) - address of new tos (== R17_tos for T_VOID) ++ // ++ ++ int number_of_used_slots = 1; ++ ++ const Register tos = R4_ARG2; ++ Label done; ++ Label is_false; ++ ++ address entry = __ pc(); ++ ++ switch (type) { ++ case T_BOOLEAN: ++ __ cmpwi(CCR0, R3_RET, 0); ++ __ beq(CCR0, is_false); ++ __ li(R3_RET, 1); ++ __ stw(R3_RET, 0, tos); ++ __ b(done); ++ __ bind(is_false); ++ __ li(R3_RET, 0); ++ __ stw(R3_RET, 0, tos); ++ break; ++ case T_BYTE: ++ case T_CHAR: ++ case T_SHORT: ++ case T_INT: ++ __ stw(R3_RET, 0, tos); ++ break; ++ case T_LONG: ++ number_of_used_slots = 2; ++ // mark unused slot for debugging ++ // long goes to topmost slot ++ __ std(R3_RET, -BytesPerWord, tos); ++ __ li(R3_RET, 0); ++ __ std(R3_RET, 0, tos); ++ break; ++ case T_OBJECT: ++ __ verify_oop(R3_RET); ++ __ std(R3_RET, 0, tos); ++ break; ++ case T_FLOAT: ++ __ stfs(F1_RET, 0, tos); ++ break; ++ case T_DOUBLE: ++ number_of_used_slots = 2; ++ // mark unused slot for debugging ++ __ li(R3_RET, 0); ++ __ std(R3_RET, 0, tos); ++ // double goes to topmost slot ++ __ stfd(F1_RET, -BytesPerWord, tos); ++ break; ++ case T_VOID: ++ number_of_used_slots = 0; ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ ++ __ BIND(done); ++ ++ // new expression stack top ++ __ addi(R3_RET, tos, -BytesPerWord * number_of_used_slots); ++ ++ __ blr(); ++ ++ return entry; ++} ++ ++address CppInterpreterGenerator::generate_stack_to_stack_converter(BasicType type) { ++ // ++ // Copy the result from the callee's stack to the caller's stack, ++ // caller and callee both being interpreted. ++ // ++ // Registers alive ++ // R3_ARG1 - address of callee's tos + BytesPerWord ++ // R4_ARG2 - address of caller's tos [i.e. free location] ++ // LR ++ // ++ // stack grows upwards, memory grows downwards. ++ // ++ // [ free ] <-- callee's tos ++ // [ optional result ] <-- R3_ARG1 ++ // [ optional dummy ] ++ // ... ++ // [ free ] <-- caller's tos, R4_ARG2 ++ // ... ++ // Registers updated ++ // R3_RET(R3_ARG1) - address of caller's new tos ++ // ++ // stack grows upwards, memory grows downwards. ++ // ++ // [ free ] <-- current tos, R3_RET ++ // [ optional result ] ++ // [ optional dummy ] ++ // ... ++ // ++ ++ const Register from = R3_ARG1; ++ const Register ret = R3_ARG1; ++ const Register tos = R4_ARG2; ++ const Register tmp1 = R21_tmp1; ++ const Register tmp2 = R22_tmp2; ++ ++ address entry = __ pc(); ++ ++ switch (type) { ++ case T_BOOLEAN: ++ case T_BYTE: ++ case T_CHAR: ++ case T_SHORT: ++ case T_INT: ++ case T_FLOAT: ++ __ lwz(tmp1, 0, from); ++ __ stw(tmp1, 0, tos); ++ // New expression stack top. ++ __ addi(ret, tos, - BytesPerWord); ++ break; ++ case T_LONG: ++ case T_DOUBLE: ++ // Move both entries for debug purposes even though only one is live. ++ __ ld(tmp1, BytesPerWord, from); ++ __ ld(tmp2, 0, from); ++ __ std(tmp1, 0, tos); ++ __ std(tmp2, -BytesPerWord, tos); ++ // New expression stack top. ++ __ addi(ret, tos, - 2 * BytesPerWord); // two slots ++ break; ++ case T_OBJECT: ++ __ ld(tmp1, 0, from); ++ __ verify_oop(tmp1); ++ __ std(tmp1, 0, tos); ++ // New expression stack top. ++ __ addi(ret, tos, - BytesPerWord); ++ break; ++ case T_VOID: ++ // New expression stack top. ++ __ mr(ret, tos); ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ ++ __ blr(); ++ ++ return entry; ++} ++ ++address CppInterpreterGenerator::generate_stack_to_native_abi_converter(BasicType type) { ++ // ++ // Load a result from the callee's stack into the caller's expecting ++ // return register, callee being interpreted, caller being call stub ++ // or jit code. ++ // ++ // Registers alive ++ // R3_ARG1 - callee expression tos + BytesPerWord ++ // LR ++ // ++ // stack grows upwards, memory grows downwards. ++ // ++ // [ free ] <-- callee's tos ++ // [ optional result ] <-- R3_ARG1 ++ // [ optional dummy ] ++ // ... ++ // ++ // Registers updated ++ // R3_RET(R3_ARG1)/F1_RET - result ++ // ++ ++ const Register from = R3_ARG1; ++ const Register ret = R3_ARG1; ++ const FloatRegister fret = F1_ARG1; ++ ++ address entry = __ pc(); ++ ++ // Implemented uniformly for both kinds of endianness. The interpreter ++ // implements boolean, byte, char, and short as jint (4 bytes). ++ switch (type) { ++ case T_BOOLEAN: ++ case T_CHAR: ++ // zero extension ++ __ lwz(ret, 0, from); ++ break; ++ case T_BYTE: ++ case T_SHORT: ++ case T_INT: ++ // sign extension ++ __ lwa(ret, 0, from); ++ break; ++ case T_LONG: ++ __ ld(ret, 0, from); ++ break; ++ case T_OBJECT: ++ __ ld(ret, 0, from); ++ __ verify_oop(ret); ++ break; ++ case T_FLOAT: ++ __ lfs(fret, 0, from); ++ break; ++ case T_DOUBLE: ++ __ lfd(fret, 0, from); ++ break; ++ case T_VOID: ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ ++ __ blr(); ++ ++ return entry; ++} ++ ++address CppInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) { ++ assert(interpreter_return_address != NULL, "Not initialized"); ++ return interpreter_return_address; ++} ++ ++address CppInterpreter::deopt_entry(TosState state, int length) { ++ address ret = NULL; ++ if (length != 0) { ++ switch (state) { ++ case atos: ret = deopt_frame_manager_return_atos; break; ++ case btos: ret = deopt_frame_manager_return_itos; break; ++ case ctos: ++ case stos: ++ case itos: ret = deopt_frame_manager_return_itos; break; ++ case ltos: ret = deopt_frame_manager_return_ltos; break; ++ case ftos: ret = deopt_frame_manager_return_ftos; break; ++ case dtos: ret = deopt_frame_manager_return_dtos; break; ++ case vtos: ret = deopt_frame_manager_return_vtos; break; ++ default: ShouldNotReachHere(); ++ } ++ } else { ++ ret = unctrap_frame_manager_entry; // re-execute the bytecode (e.g. uncommon trap, popframe) ++ } ++ assert(ret != NULL, "Not initialized"); ++ return ret; ++} ++ ++// ++// Helpers for commoning out cases in the various type of method entries. ++// ++ ++// ++// Registers alive ++// R16_thread - JavaThread* ++// R1_SP - old stack pointer ++// R19_method - callee's Method ++// R17_tos - address of caller's tos (prepushed) ++// R15_prev_state - address of caller's BytecodeInterpreter or 0 ++// return_pc in R21_tmp15 (only when called within generate_native_entry) ++// ++// Registers updated ++// R14_state - address of callee's interpreter state ++// R1_SP - new stack pointer ++// CCR4_is_synced - current method is synchronized ++// ++void CppInterpreterGenerator::generate_compute_interpreter_state(Label& stack_overflow_return) { ++ // ++ // Stack layout at this point: ++ // ++ // F1 [TOP_IJAVA_FRAME_ABI] <-- R1_SP ++ // alignment (optional) ++ // [F1's outgoing Java arguments] <-- R17_tos ++ // ... ++ // F2 [PARENT_IJAVA_FRAME_ABI] ++ // ... ++ ++ //============================================================================= ++ // Allocate space for locals other than the parameters, the ++ // interpreter state, monitors, and the expression stack. ++ ++ const Register local_count = R21_tmp1; ++ const Register parameter_count = R22_tmp2; ++ const Register max_stack = R23_tmp3; ++ // Must not be overwritten within this method! ++ // const Register return_pc = R29_tmp9; ++ ++ const ConditionRegister is_synced = CCR4_is_synced; ++ const ConditionRegister is_native = CCR6; ++ const ConditionRegister is_static = CCR7; ++ ++ assert(is_synced != is_native, "condition code registers must be distinct"); ++ assert(is_synced != is_static, "condition code registers must be distinct"); ++ assert(is_native != is_static, "condition code registers must be distinct"); ++ ++ { ++ ++ // Local registers ++ const Register top_frame_size = R24_tmp4; ++ const Register access_flags = R25_tmp5; ++ const Register state_offset = R26_tmp6; ++ Register mem_stack_limit = R27_tmp7; ++ const Register page_size = R28_tmp8; ++ ++ BLOCK_COMMENT("compute_interpreter_state {"); ++ ++ // access_flags = method->access_flags(); ++ // TODO: PPC port: assert(4 == sizeof(AccessFlags), "unexpected field size"); ++ __ lwa(access_flags, method_(access_flags)); ++ ++ // parameter_count = method->constMethod->size_of_parameters(); ++ // TODO: PPC port: assert(2 == ConstMethod::sz_size_of_parameters(), "unexpected field size"); ++ __ ld(max_stack, in_bytes(Method::const_offset()), R19_method); // Max_stack holds constMethod for a while. ++ __ lhz(parameter_count, in_bytes(ConstMethod::size_of_parameters_offset()), max_stack); ++ ++ // local_count = method->constMethod()->max_locals(); ++ // TODO: PPC port: assert(2 == ConstMethod::sz_max_locals(), "unexpected field size"); ++ __ lhz(local_count, in_bytes(ConstMethod::size_of_locals_offset()), max_stack); ++ ++ // max_stack = method->constMethod()->max_stack(); ++ // TODO: PPC port: assert(2 == ConstMethod::sz_max_stack(), "unexpected field size"); ++ __ lhz(max_stack, in_bytes(ConstMethod::max_stack_offset()), max_stack); ++ ++ if (EnableInvokeDynamic) { ++ // Take into account 'extra_stack_entries' needed by method handles (see method.hpp). ++ __ addi(max_stack, max_stack, Method::extra_stack_entries()); ++ } ++ ++ // mem_stack_limit = thread->stack_limit(); ++ __ ld(mem_stack_limit, thread_(stack_overflow_limit)); ++ ++ // Point locals at the first argument. Method's locals are the ++ // parameters on top of caller's expression stack. ++ ++ // tos points past last Java argument ++ __ sldi(R18_locals, parameter_count, Interpreter::logStackElementSize); ++ __ add(R18_locals, R17_tos, R18_locals); ++ ++ // R18_locals - i*BytesPerWord points to i-th Java local (i starts at 0) ++ ++ // Set is_native, is_synced, is_static - will be used later. ++ __ testbitdi(is_native, R0, access_flags, JVM_ACC_NATIVE_BIT); ++ __ testbitdi(is_synced, R0, access_flags, JVM_ACC_SYNCHRONIZED_BIT); ++ assert(is_synced->is_nonvolatile(), "is_synced must be non-volatile"); ++ __ testbitdi(is_static, R0, access_flags, JVM_ACC_STATIC_BIT); ++ ++ // PARENT_IJAVA_FRAME_ABI ++ // ++ // frame_size = ++ // round_to((local_count - parameter_count)*BytesPerWord + ++ // 2*BytesPerWord + ++ // alignment + ++ // frame::interpreter_frame_cinterpreterstate_size_in_bytes() ++ // sizeof(PARENT_IJAVA_FRAME_ABI) ++ // method->is_synchronized() ? sizeof(BasicObjectLock) : 0 + ++ // max_stack*BytesPerWord, ++ // 16) ++ // ++ // Note that this calculation is exactly mirrored by ++ // AbstractInterpreter::layout_activation_impl() [ and ++ // AbstractInterpreter::size_activation() ]. Which is used by ++ // deoptimization so that it can allocate the proper sized ++ // frame. This only happens for interpreted frames so the extra ++ // notes below about max_stack below are not important. The other ++ // thing to note is that for interpreter frames other than the ++ // current activation the size of the stack is the size of the live ++ // portion of the stack at the particular bcp and NOT the maximum ++ // stack that the method might use. ++ // ++ // If we're calling a native method, we replace max_stack (which is ++ // zero) with space for the worst-case signature handler varargs ++ // vector, which is: ++ // ++ // max_stack = max(Argument::n_register_parameters, parameter_count+2); ++ // ++ // We add two slots to the parameter_count, one for the jni ++ // environment and one for a possible native mirror. We allocate ++ // space for at least the number of ABI registers, even though ++ // InterpreterRuntime::slow_signature_handler won't write more than ++ // parameter_count+2 words when it creates the varargs vector at the ++ // top of the stack. The generated slow signature handler will just ++ // load trash into registers beyond the necessary number. We're ++ // still going to cut the stack back by the ABI register parameter ++ // count so as to get SP+16 pointing at the ABI outgoing parameter ++ // area, so we need to allocate at least that much even though we're ++ // going to throw it away. ++ // ++ ++ // Adjust max_stack for native methods: ++ Label skip_native_calculate_max_stack; ++ __ bfalse(is_native, skip_native_calculate_max_stack); ++ // if (is_native) { ++ // max_stack = max(Argument::n_register_parameters, parameter_count+2); ++ __ addi(max_stack, parameter_count, 2*Interpreter::stackElementWords); ++ __ cmpwi(CCR0, max_stack, Argument::n_register_parameters); ++ __ bge(CCR0, skip_native_calculate_max_stack); ++ __ li(max_stack, Argument::n_register_parameters); ++ // } ++ __ bind(skip_native_calculate_max_stack); ++ // max_stack is now in bytes ++ __ slwi(max_stack, max_stack, Interpreter::logStackElementSize); ++ ++ // Calculate number of non-parameter locals (in slots): ++ Label not_java; ++ __ btrue(is_native, not_java); ++ // if (!is_native) { ++ // local_count = non-parameter local count ++ __ sub(local_count, local_count, parameter_count); ++ // } else { ++ // // nothing to do: method->max_locals() == 0 for native methods ++ // } ++ __ bind(not_java); ++ ++ ++ // Calculate top_frame_size and parent_frame_resize. ++ { ++ const Register parent_frame_resize = R12_scratch2; ++ ++ BLOCK_COMMENT("Compute top_frame_size."); ++ // top_frame_size = TOP_IJAVA_FRAME_ABI ++ // + size of interpreter state ++ __ li(top_frame_size, frame::top_ijava_frame_abi_size ++ + frame::interpreter_frame_cinterpreterstate_size_in_bytes()); ++ // + max_stack ++ __ add(top_frame_size, top_frame_size, max_stack); ++ // + stack slots for a BasicObjectLock for synchronized methods ++ { ++ Label not_synced; ++ __ bfalse(is_synced, not_synced); ++ __ addi(top_frame_size, top_frame_size, frame::interpreter_frame_monitor_size_in_bytes()); ++ __ bind(not_synced); ++ } ++ // align ++ __ round_to(top_frame_size, frame::alignment_in_bytes); ++ ++ ++ BLOCK_COMMENT("Compute parent_frame_resize."); ++ // parent_frame_resize = R1_SP - R17_tos ++ __ sub(parent_frame_resize, R1_SP, R17_tos); ++ //__ li(parent_frame_resize, 0); ++ // + PARENT_IJAVA_FRAME_ABI ++ // + extra two slots for the no-parameter/no-locals ++ // method result ++ __ addi(parent_frame_resize, parent_frame_resize, ++ frame::parent_ijava_frame_abi_size ++ + 2*Interpreter::stackElementSize); ++ // + (locals_count - params_count) ++ __ sldi(R0, local_count, Interpreter::logStackElementSize); ++ __ add(parent_frame_resize, parent_frame_resize, R0); ++ // align ++ __ round_to(parent_frame_resize, frame::alignment_in_bytes); ++ ++ // ++ // Stack layout at this point: ++ // ++ // The new frame F0 hasn't yet been pushed, F1 is still the top frame. ++ // ++ // F0 [TOP_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [F0's full operand stack] ++ // [F0's monitors] (optional) ++ // [F0's BytecodeInterpreter object] ++ // F1 [PARENT_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [F0's Java result] ++ // [F0's non-arg Java locals] ++ // [F1's outgoing Java arguments] <-- R17_tos ++ // ... ++ // F2 [PARENT_IJAVA_FRAME_ABI] ++ // ... ++ ++ ++ // Calculate new R14_state ++ // and ++ // test that the new memory stack pointer is above the limit, ++ // throw a StackOverflowError otherwise. ++ __ sub(R11_scratch1/*F1's SP*/, R1_SP, parent_frame_resize); ++ __ addi(R14_state, R11_scratch1/*F1's SP*/, ++ -frame::interpreter_frame_cinterpreterstate_size_in_bytes()); ++ __ sub(R11_scratch1/*F0's SP*/, ++ R11_scratch1/*F1's SP*/, top_frame_size); ++ ++ BLOCK_COMMENT("Test for stack overflow:"); ++ __ cmpld(CCR0/*is_stack_overflow*/, R11_scratch1, mem_stack_limit); ++ __ blt(CCR0/*is_stack_overflow*/, stack_overflow_return); ++ ++ ++ //============================================================================= ++ // Frame_size doesn't overflow the stack. Allocate new frame and ++ // initialize interpreter state. ++ ++ // Register state ++ // ++ // R15 - local_count ++ // R16 - parameter_count ++ // R17 - max_stack ++ // ++ // R18 - frame_size ++ // R19 - access_flags ++ // CCR4_is_synced - is_synced ++ // ++ // GR_Lstate - pointer to the uninitialized new BytecodeInterpreter. ++ ++ // _last_Java_pc just needs to be close enough that we can identify ++ // the frame as an interpreted frame. It does not need to be the ++ // exact return address from either calling ++ // BytecodeInterpreter::InterpretMethod or the call to a jni native method. ++ // So we can initialize it here with a value of a bundle in this ++ // code fragment. We only do this initialization for java frames ++ // where InterpretMethod needs a a way to get a good pc value to ++ // store in the thread state. For interpreter frames used to call ++ // jni native code we just zero the value in the state and move an ++ // ip as needed in the native entry code. ++ // ++ // const Register last_Java_pc_addr = GR24_SCRATCH; // QQQ 27 ++ // const Register last_Java_pc = GR26_SCRATCH; ++ ++ // Must reference stack before setting new SP since Windows ++ // will not be able to deliver the exception on a bad SP. ++ // Windows also insists that we bang each page one at a time in order ++ // for the OS to map in the reserved pages. If we bang only ++ // the final page, Windows stops delivering exceptions to our ++ // VectoredExceptionHandler and terminates our program. ++ // Linux only requires a single bang but it's rare to have ++ // to bang more than 1 page so the code is enabled for both OS's. ++ ++ // BANG THE STACK ++ // ++ // Nothing to do for PPC, because updating the SP will automatically ++ // bang the page. ++ ++ // Up to here we have calculated the delta for the new C-frame and ++ // checked for a stack-overflow. Now we can savely update SP and ++ // resize the C-frame. ++ ++ // R14_state has already been calculated. ++ __ push_interpreter_frame(top_frame_size, parent_frame_resize, ++ R25_tmp5, R26_tmp6, R27_tmp7, R28_tmp8); ++ ++ } ++ ++ // ++ // Stack layout at this point: ++ // ++ // F0 has been been pushed! ++ // ++ // F0 [TOP_IJAVA_FRAME_ABI] <-- R1_SP ++ // alignment (optional) (now it's here, if required) ++ // [F0's full operand stack] ++ // [F0's monitors] (optional) ++ // [F0's BytecodeInterpreter object] ++ // F1 [PARENT_IJAVA_FRAME_ABI] ++ // alignment (optional) (now it's here, if required) ++ // [F0's Java result] ++ // [F0's non-arg Java locals] ++ // [F1's outgoing Java arguments] ++ // ... ++ // F2 [PARENT_IJAVA_FRAME_ABI] ++ // ... ++ // ++ // R14_state points to F0's BytecodeInterpreter object. ++ // ++ ++ } ++ ++ //============================================================================= ++ // new BytecodeInterpreter-object is save, let's initialize it: ++ BLOCK_COMMENT("New BytecodeInterpreter-object is save."); ++ ++ { ++ // Locals ++ const Register bytecode_addr = R24_tmp4; ++ const Register constants = R25_tmp5; ++ const Register tos = R26_tmp6; ++ const Register stack_base = R27_tmp7; ++ const Register local_addr = R28_tmp8; ++ { ++ Label L; ++ __ btrue(is_native, L); ++ // if (!is_native) { ++ // bytecode_addr = constMethod->codes(); ++ __ ld(bytecode_addr, method_(const)); ++ __ addi(bytecode_addr, bytecode_addr, in_bytes(ConstMethod::codes_offset())); ++ // } ++ __ bind(L); ++ } ++ ++ __ ld(constants, in_bytes(Method::const_offset()), R19_method); ++ __ ld(constants, in_bytes(ConstMethod::constants_offset()), constants); ++ ++ // state->_prev_link = prev_state; ++ __ std(R15_prev_state, state_(_prev_link)); ++ ++ // For assertions only. ++ // TODO: not needed anyway because it coincides with `_monitor_base'. remove! ++ // state->_self_link = state; ++ DEBUG_ONLY(__ std(R14_state, state_(_self_link));) ++ ++ // state->_thread = thread; ++ __ std(R16_thread, state_(_thread)); ++ ++ // state->_method = method; ++ __ std(R19_method, state_(_method)); ++ ++ // state->_locals = locals; ++ __ std(R18_locals, state_(_locals)); ++ ++ // state->_oop_temp = NULL; ++ __ li(R0, 0); ++ __ std(R0, state_(_oop_temp)); ++ ++ // state->_last_Java_fp = *R1_SP // Use *R1_SP as fp ++ __ ld(R0, _abi(callers_sp), R1_SP); ++ __ std(R0, state_(_last_Java_fp)); ++ ++ BLOCK_COMMENT("load Stack base:"); ++ { ++ // Stack_base. ++ // if (!method->synchronized()) { ++ // stack_base = state; ++ // } else { ++ // stack_base = (uintptr_t)state - sizeof(BasicObjectLock); ++ // } ++ Label L; ++ __ mr(stack_base, R14_state); ++ __ bfalse(is_synced, L); ++ __ addi(stack_base, stack_base, -frame::interpreter_frame_monitor_size_in_bytes()); ++ __ bind(L); ++ } ++ ++ // state->_mdx = NULL; ++ __ li(R0, 0); ++ __ std(R0, state_(_mdx)); ++ ++ { ++ // if (method->is_native()) state->_bcp = NULL; ++ // else state->_bcp = bytecode_addr; ++ Label label1, label2; ++ __ bfalse(is_native, label1); ++ __ std(R0, state_(_bcp)); ++ __ b(label2); ++ __ bind(label1); ++ __ std(bytecode_addr, state_(_bcp)); ++ __ bind(label2); ++ } ++ ++ ++ // state->_result._to_call._callee = NULL; ++ __ std(R0, state_(_result._to_call._callee)); ++ ++ // state->_monitor_base = state; ++ __ std(R14_state, state_(_monitor_base)); ++ ++ // state->_msg = BytecodeInterpreter::method_entry; ++ __ li(R0, BytecodeInterpreter::method_entry); ++ __ stw(R0, state_(_msg)); ++ ++ // state->_last_Java_sp = R1_SP; ++ __ std(R1_SP, state_(_last_Java_sp)); ++ ++ // state->_stack_base = stack_base; ++ __ std(stack_base, state_(_stack_base)); ++ ++ // tos = stack_base - 1 slot (prepushed); ++ // state->_stack.Tos(tos); ++ __ addi(tos, stack_base, - Interpreter::stackElementSize); ++ __ std(tos, state_(_stack)); ++ ++ ++ { ++ BLOCK_COMMENT("get last_Java_pc:"); ++ // if (!is_native) state->_last_Java_pc = ; ++ // else state->_last_Java_pc = NULL; (just for neatness) ++ Label label1, label2; ++ __ btrue(is_native, label1); ++ __ get_PC_trash_LR(R0); ++ __ std(R0, state_(_last_Java_pc)); ++ __ b(label2); ++ __ bind(label1); ++ __ li(R0, 0); ++ __ std(R0, state_(_last_Java_pc)); ++ __ bind(label2); ++ } ++ ++ ++ // stack_limit = tos - max_stack; ++ __ sub(R0, tos, max_stack); ++ // state->_stack_limit = stack_limit; ++ __ std(R0, state_(_stack_limit)); ++ ++ ++ // cache = method->constants()->cache(); ++ __ ld(R0, ConstantPool::cache_offset_in_bytes(), constants); ++ // state->_constants = method->constants()->cache(); ++ __ std(R0, state_(_constants)); ++ ++ ++ ++ //============================================================================= ++ // synchronized method, allocate and initialize method object lock. ++ // if (!method->is_synchronized()) goto fill_locals_with_0x0s; ++ Label fill_locals_with_0x0s; ++ __ bfalse(is_synced, fill_locals_with_0x0s); ++ ++ // pool_holder = method->constants()->pool_holder(); ++ const int mirror_offset = in_bytes(Klass::java_mirror_offset()); ++ { ++ Label label1, label2; ++ // lockee = NULL; for java methods, correct value will be inserted in BytecodeInterpretMethod.hpp ++ __ li(R0,0); ++ __ bfalse(is_native, label2); ++ ++ __ bfalse(is_static, label1); ++ // if (method->is_static()) lockee = ++ // pool_holder->klass_part()->java_mirror(); ++ __ ld(R11_scratch1/*pool_holder*/, ConstantPool::pool_holder_offset_in_bytes(), constants); ++ __ ld(R0/*lockee*/, mirror_offset, R11_scratch1/*pool_holder*/); ++ __ b(label2); ++ ++ __ bind(label1); ++ // else lockee = *(oop*)locals; ++ __ ld(R0/*lockee*/, 0, R18_locals); ++ __ bind(label2); ++ ++ // monitor->set_obj(lockee); ++ __ std(R0/*lockee*/, BasicObjectLock::obj_offset_in_bytes(), stack_base); ++ } ++ ++ // See if we need to zero the locals ++ __ BIND(fill_locals_with_0x0s); ++ ++ ++ //============================================================================= ++ // fill locals with 0x0s ++ Label locals_zeroed; ++ __ btrue(is_native, locals_zeroed); ++ ++ if (true /* zerolocals */ || ClearInterpreterLocals) { ++ // local_count is already num_locals_slots - num_param_slots ++ __ sldi(R0, parameter_count, Interpreter::logStackElementSize); ++ __ sub(local_addr, R18_locals, R0); ++ __ cmpdi(CCR0, local_count, 0); ++ __ ble(CCR0, locals_zeroed); ++ ++ __ mtctr(local_count); ++ //__ ld_const_addr(R0, (address) 0xcafe0000babe); ++ __ li(R0, 0); ++ ++ Label zero_slot; ++ __ bind(zero_slot); ++ ++ // first local is at local_addr ++ __ std(R0, 0, local_addr); ++ __ addi(local_addr, local_addr, -BytesPerWord); ++ __ bdnz(zero_slot); ++ } ++ ++ __ BIND(locals_zeroed); ++ ++ } ++ BLOCK_COMMENT("} compute_interpreter_state"); ++} ++ ++// Generate code to initiate compilation on invocation counter overflow. ++void CppInterpreterGenerator::generate_counter_overflow(Label& continue_entry) { ++ // Registers alive ++ // R14_state ++ // R16_thread ++ // ++ // Registers updated ++ // R14_state ++ // R3_ARG1 (=R3_RET) ++ // R4_ARG2 ++ ++ // After entering the vm we remove the activation and retry the ++ // entry point in case the compilation is complete. ++ ++ // InterpreterRuntime::frequency_counter_overflow takes one argument ++ // that indicates if the counter overflow occurs at a backwards ++ // branch (NULL bcp). We pass zero. The call returns the address ++ // of the verified entry point for the method or NULL if the ++ // compilation did not complete (either went background or bailed ++ // out). ++ __ li(R4_ARG2, 0); ++ ++ // Pass false to call_VM so it doesn't check for pending exceptions, ++ // since at this point in the method invocation the exception ++ // handler would try to exit the monitor of synchronized methods ++ // which haven't been entered yet. ++ // ++ // Returns verified_entry_point or NULL, we don't care which. ++ // ++ // Do not use the variant `frequency_counter_overflow' that returns ++ // a structure, because this will change the argument list by a ++ // hidden parameter (gcc 4.1). ++ ++ __ call_VM(noreg, ++ CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), ++ R4_ARG2, ++ false); ++ // Returns verified_entry_point or NULL, we don't care which as we ignore it ++ // and run interpreted. ++ ++ // Reload method, it may have moved. ++ __ ld(R19_method, state_(_method)); ++ ++ // We jump now to the label "continue_after_compile". ++ __ b(continue_entry); ++} ++ ++// Increment invocation count and check for overflow. ++// ++// R19_method must contain Method* of method to profile. ++void CppInterpreterGenerator::generate_counter_incr(Label& overflow) { ++ Label done; ++ const Register Rcounters = R12_scratch2; ++ const Register iv_be_count = R11_scratch1; ++ const Register invocation_limit = R12_scratch2; ++ const Register invocation_limit_addr = invocation_limit; ++ ++ // Load and ev. allocate MethodCounters object. ++ __ get_method_counters(R19_method, Rcounters, done); ++ ++ // Update standard invocation counters. ++ __ increment_invocation_counter(Rcounters, iv_be_count, R0); ++ ++ // Compare against limit. ++ BLOCK_COMMENT("Compare counter against limit:"); ++ assert(4 == sizeof(InvocationCounter::InterpreterInvocationLimit), ++ "must be 4 bytes"); ++ __ load_const(invocation_limit_addr, (address)&InvocationCounter::InterpreterInvocationLimit); ++ __ lwa(invocation_limit, 0, invocation_limit_addr); ++ __ cmpw(CCR0, iv_be_count, invocation_limit); ++ __ bge(CCR0, overflow); ++ __ bind(done); ++} ++ ++// ++// Call a JNI method. ++// ++// Interpreter stub for calling a native method. (C++ interpreter) ++// This sets up a somewhat different looking stack for calling the native method ++// than the typical interpreter frame setup. ++// ++address CppInterpreterGenerator::generate_native_entry(void) { ++ if (native_entry != NULL) return native_entry; ++ address entry = __ pc(); ++ ++ // Read ++ // R16_thread ++ // R15_prev_state - address of caller's BytecodeInterpreter, if this snippet ++ // gets called by the frame manager. ++ // R19_method - callee's Method ++ // R17_tos - address of caller's tos ++ // R1_SP - caller's stack pointer ++ // R21_sender_SP - initial caller sp ++ // ++ // Update ++ // R14_state - address of caller's BytecodeInterpreter ++ // R3_RET - integer result, if any. ++ // F1_RET - float result, if any. ++ // ++ // ++ // Stack layout at this point: ++ // ++ // 0 [TOP_IJAVA_FRAME_ABI] <-- R1_SP ++ // alignment (optional) ++ // [outgoing Java arguments] <-- R17_tos ++ // ... ++ // PARENT [PARENT_IJAVA_FRAME_ABI] ++ // ... ++ // ++ ++ const bool inc_counter = UseCompiler || CountCompiledCalls; ++ ++ const Register signature_handler_fd = R21_tmp1; ++ const Register pending_exception = R22_tmp2; ++ const Register result_handler_addr = R23_tmp3; ++ const Register native_method_fd = R24_tmp4; ++ const Register access_flags = R25_tmp5; ++ const Register active_handles = R26_tmp6; ++ const Register sync_state = R27_tmp7; ++ const Register sync_state_addr = sync_state; // Address is dead after use. ++ const Register suspend_flags = R24_tmp4; ++ ++ const Register return_pc = R28_tmp8; // Register will be locked for some time. ++ ++ const ConditionRegister is_synced = CCR4_is_synced; // Live-on-exit from compute_interpreter_state. ++ ++ ++ // R1_SP still points to caller's SP at this point. ++ ++ // Save initial_caller_sp to caller's abi. The caller frame must be ++ // resized before returning to get rid of the c2i arguments (if ++ // any). ++ // Override the saved SP with the senderSP so we can pop c2i ++ // arguments (if any) off when we return ++ __ std(R21_sender_SP, _top_ijava_frame_abi(initial_caller_sp), R1_SP); ++ ++ // Save LR to caller's frame. We don't use _abi(lr) here, because it is not safe. ++ __ mflr(return_pc); ++ __ std(return_pc, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ ++ assert(return_pc->is_nonvolatile(), "return_pc must be a non-volatile register"); ++ ++ __ verify_method_ptr(R19_method); ++ ++ //============================================================================= ++ ++ // If this snippet gets called by the frame manager (at label ++ // `call_special'), then R15_prev_state is valid. If this snippet ++ // is not called by the frame manager, but e.g. by the call stub or ++ // by compiled code, then R15_prev_state is invalid. ++ { ++ // Set R15_prev_state to 0 if we don't return to the frame ++ // manager; we will return to the call_stub or to compiled code ++ // instead. If R15_prev_state is 0 there will be only one ++ // interpreter frame (we will set this up later) in this C frame! ++ // So we must take care about retrieving prev_state_(_prev_link) ++ // and restoring R1_SP when popping that interpreter. ++ Label prev_state_is_valid; ++ ++ __ load_const(R11_scratch1/*frame_manager_returnpc_addr*/, (address)&frame_manager_specialized_return); ++ __ ld(R12_scratch2/*frame_manager_returnpc*/, 0, R11_scratch1/*frame_manager_returnpc_addr*/); ++ __ cmpd(CCR0, return_pc, R12_scratch2/*frame_manager_returnpc*/); ++ __ beq(CCR0, prev_state_is_valid); ++ ++ __ li(R15_prev_state, 0); ++ ++ __ BIND(prev_state_is_valid); ++ } ++ ++ //============================================================================= ++ // Allocate new frame and initialize interpreter state. ++ ++ Label exception_return; ++ Label exception_return_sync_check; ++ Label stack_overflow_return; ++ ++ // Generate new interpreter state and jump to stack_overflow_return in case of ++ // a stack overflow. ++ generate_compute_interpreter_state(stack_overflow_return); ++ ++ //============================================================================= ++ // Increment invocation counter. On overflow, entry to JNI method ++ // will be compiled. ++ Label invocation_counter_overflow; ++ if (inc_counter) { ++ generate_counter_incr(invocation_counter_overflow); ++ } ++ ++ Label continue_after_compile; ++ __ BIND(continue_after_compile); ++ ++ // access_flags = method->access_flags(); ++ // Load access flags. ++ assert(access_flags->is_nonvolatile(), ++ "access_flags must be in a non-volatile register"); ++ // Type check. ++ // TODO: PPC port: assert(4 == sizeof(AccessFlags), "unexpected field size"); ++ __ lwz(access_flags, method_(access_flags)); ++ ++ // We don't want to reload R19_method and access_flags after calls ++ // to some helper functions. ++ assert(R19_method->is_nonvolatile(), "R19_method must be a non-volatile register"); ++ ++ // Check for synchronized methods. Must happen AFTER invocation counter ++ // check, so method is not locked if counter overflows. ++ ++ { ++ Label method_is_not_synced; ++ // Is_synced is still alive. ++ assert(is_synced->is_nonvolatile(), "is_synced must be non-volatile"); ++ __ bfalse(is_synced, method_is_not_synced); ++ ++ lock_method(); ++ // Reload method, it may have moved. ++ __ ld(R19_method, state_(_method)); ++ ++ __ BIND(method_is_not_synced); ++ } ++ ++ // jvmti/jvmpi support ++ __ notify_method_entry(); ++ ++ // Reload method, it may have moved. ++ __ ld(R19_method, state_(_method)); ++ ++ //============================================================================= ++ // Get and call the signature handler ++ ++ __ ld(signature_handler_fd, method_(signature_handler)); ++ Label call_signature_handler; ++ ++ __ cmpdi(CCR0, signature_handler_fd, 0); ++ __ bne(CCR0, call_signature_handler); ++ ++ // Method has never been called. Either generate a specialized ++ // handler or point to the slow one. ++ // ++ // Pass parameter 'false' to avoid exception check in call_VM. ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::prepare_native_call), R19_method, false); ++ ++ // Check for an exception while looking up the target method. If we ++ // incurred one, bail. ++ __ ld(pending_exception, thread_(pending_exception)); ++ __ cmpdi(CCR0, pending_exception, 0); ++ __ bne(CCR0, exception_return_sync_check); // has pending exception ++ ++ // reload method ++ __ ld(R19_method, state_(_method)); ++ ++ // Reload signature handler, it may have been created/assigned in the meanwhile ++ __ ld(signature_handler_fd, method_(signature_handler)); ++ ++ __ BIND(call_signature_handler); ++ ++ // Before we call the signature handler we push a new frame to ++ // protect the interpreter frame volatile registers when we return ++ // from jni but before we can get back to Java. ++ ++ // First set the frame anchor while the SP/FP registers are ++ // convenient and the slow signature handler can use this same frame ++ // anchor. ++ ++ // We have a TOP_IJAVA_FRAME here, which belongs to us. ++ __ set_top_ijava_frame_at_SP_as_last_Java_frame(R1_SP, R12_scratch2/*tmp*/); ++ ++ // Now the interpreter frame (and its call chain) have been ++ // invalidated and flushed. We are now protected against eager ++ // being enabled in native code. Even if it goes eager the ++ // registers will be reloaded as clean and we will invalidate after ++ // the call so no spurious flush should be possible. ++ ++ // Call signature handler and pass locals address. ++ // ++ // Our signature handlers copy required arguments to the C stack ++ // (outgoing C args), R3_ARG1 to R10_ARG8, and F1_ARG1 to ++ // F13_ARG13. ++ __ mr(R3_ARG1, R18_locals); ++#if !defined(ABI_ELFv2) ++ __ ld(signature_handler_fd, 0, signature_handler_fd); ++#endif ++ __ call_stub(signature_handler_fd); ++ // reload method ++ __ ld(R19_method, state_(_method)); ++ ++ // Remove the register parameter varargs slots we allocated in ++ // compute_interpreter_state. SP+16 ends up pointing to the ABI ++ // outgoing argument area. ++ // ++ // Not needed on PPC64. ++ //__ add(SP, SP, Argument::n_register_parameters*BytesPerWord); ++ ++ assert(result_handler_addr->is_nonvolatile(), "result_handler_addr must be in a non-volatile register"); ++ // Save across call to native method. ++ __ mr(result_handler_addr, R3_RET); ++ ++ // Set up fixed parameters and call the native method. ++ // If the method is static, get mirror into R4_ARG2. ++ ++ { ++ Label method_is_not_static; ++ // access_flags is non-volatile and still, no need to restore it ++ ++ // restore access flags ++ __ testbitdi(CCR0, R0, access_flags, JVM_ACC_STATIC_BIT); ++ __ bfalse(CCR0, method_is_not_static); ++ ++ // constants = method->constants(); ++ __ ld(R11_scratch1, in_bytes(Method::const_offset()), R19_method); ++ __ ld(R11_scratch1/*constants*/, in_bytes(ConstMethod::constants_offset()), R11_scratch1); ++ // pool_holder = method->constants()->pool_holder(); ++ __ ld(R11_scratch1/*pool_holder*/, ConstantPool::pool_holder_offset_in_bytes(), ++ R11_scratch1/*constants*/); ++ ++ const int mirror_offset = in_bytes(Klass::java_mirror_offset()); ++ ++ // mirror = pool_holder->klass_part()->java_mirror(); ++ __ ld(R0/*mirror*/, mirror_offset, R11_scratch1/*pool_holder*/); ++ // state->_native_mirror = mirror; ++ __ std(R0/*mirror*/, state_(_oop_temp)); ++ // R4_ARG2 = &state->_oop_temp; ++ __ addir(R4_ARG2, state_(_oop_temp)); ++ ++ __ BIND(method_is_not_static); ++ } ++ ++ // At this point, arguments have been copied off the stack into ++ // their JNI positions. Oops are boxed in-place on the stack, with ++ // handles copied to arguments. The result handler address is in a ++ // register. ++ ++ // pass JNIEnv address as first parameter ++ __ addir(R3_ARG1, thread_(jni_environment)); ++ ++ // Load the native_method entry before we change the thread state. ++ __ ld(native_method_fd, method_(native_function)); ++ ++ //============================================================================= ++ // Transition from _thread_in_Java to _thread_in_native. As soon as ++ // we make this change the safepoint code needs to be certain that ++ // the last Java frame we established is good. The pc in that frame ++ // just needs to be near here not an actual return address. ++ ++ // We use release_store_fence to update values like the thread state, where ++ // we don't want the current thread to continue until all our prior memory ++ // accesses (including the new thread state) are visible to other threads. ++ __ li(R0, _thread_in_native); ++ __ release(); ++ ++ // TODO: PPC port: assert(4 == JavaThread::sz_thread_state(), "unexpected field size"); ++ __ stw(R0, thread_(thread_state)); ++ ++ if (UseMembar) { ++ __ fence(); ++ } ++ ++ //============================================================================= ++ // Call the native method. Argument registers must not have been ++ // overwritten since "__ call_stub(signature_handler);" (except for ++ // ARG1 and ARG2 for static methods) ++ __ call_c(native_method_fd); ++ ++ __ std(R3_RET, state_(_native_lresult)); ++ __ stfd(F1_RET, state_(_native_fresult)); ++ ++ // The frame_manager_lr field, which we use for setting the last ++ // java frame, gets overwritten by the signature handler. Restore ++ // it now. ++ __ get_PC_trash_LR(R11_scratch1); ++ __ std(R11_scratch1, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ ++ // Because of GC R19_method may no longer be valid. ++ ++ // Block, if necessary, before resuming in _thread_in_Java state. ++ // In order for GC to work, don't clear the last_Java_sp until after ++ // blocking. ++ ++ ++ ++ //============================================================================= ++ // Switch thread to "native transition" state before reading the ++ // synchronization state. This additional state is necessary ++ // because reading and testing the synchronization state is not ++ // atomic w.r.t. GC, as this scenario demonstrates: Java thread A, ++ // in _thread_in_native state, loads _not_synchronized and is ++ // preempted. VM thread changes sync state to synchronizing and ++ // suspends threads for GC. Thread A is resumed to finish this ++ // native method, but doesn't block here since it didn't see any ++ // synchronization in progress, and escapes. ++ ++ // We use release_store_fence to update values like the thread state, where ++ // we don't want the current thread to continue until all our prior memory ++ // accesses (including the new thread state) are visible to other threads. ++ __ li(R0/*thread_state*/, _thread_in_native_trans); ++ __ release(); ++ __ stw(R0/*thread_state*/, thread_(thread_state)); ++ if (UseMembar) { ++ __ fence(); ++ } ++ // Write serialization page so that the VM thread can do a pseudo remote ++ // membar. We use the current thread pointer to calculate a thread ++ // specific offset to write to within the page. This minimizes bus ++ // traffic due to cache line collision. ++ else { ++ __ serialize_memory(R16_thread, R11_scratch1, R12_scratch2); ++ } ++ ++ // Now before we return to java we must look for a current safepoint ++ // (a new safepoint can not start since we entered native_trans). ++ // We must check here because a current safepoint could be modifying ++ // the callers registers right this moment. ++ ++ // Acquire isn't strictly necessary here because of the fence, but ++ // sync_state is declared to be volatile, so we do it anyway. ++ __ load_const(sync_state_addr, SafepointSynchronize::address_of_state()); ++ ++ // TODO: PPC port: assert(4 == SafepointSynchronize::sz_state(), "unexpected field size"); ++ __ lwz(sync_state, 0, sync_state_addr); ++ ++ // TODO: PPC port: assert(4 == Thread::sz_suspend_flags(), "unexpected field size"); ++ __ lwz(suspend_flags, thread_(suspend_flags)); ++ ++ __ acquire(); ++ ++ Label sync_check_done; ++ Label do_safepoint; ++ // No synchronization in progress nor yet synchronized ++ __ cmpwi(CCR0, sync_state, SafepointSynchronize::_not_synchronized); ++ // not suspended ++ __ cmpwi(CCR1, suspend_flags, 0); ++ ++ __ bne(CCR0, do_safepoint); ++ __ beq(CCR1, sync_check_done); ++ __ bind(do_safepoint); ++ // Block. We do the call directly and leave the current ++ // last_Java_frame setup undisturbed. We must save any possible ++ // native result acrosss the call. No oop is present ++ ++ __ mr(R3_ARG1, R16_thread); ++#if defined(ABI_ELFv2) ++ __ call_c(CAST_FROM_FN_PTR(address, JavaThread::check_special_condition_for_native_trans), ++ relocInfo::none); ++#else ++ __ call_c(CAST_FROM_FN_PTR(FunctionDescriptor*, JavaThread::check_special_condition_for_native_trans), ++ relocInfo::none); ++#endif ++ __ bind(sync_check_done); ++ ++ //============================================================================= ++ // <<<<<< Back in Interpreter Frame >>>>> ++ ++ // We are in thread_in_native_trans here and back in the normal ++ // interpreter frame. We don't have to do anything special about ++ // safepoints and we can switch to Java mode anytime we are ready. ++ ++ // Note: frame::interpreter_frame_result has a dependency on how the ++ // method result is saved across the call to post_method_exit. For ++ // native methods it assumes that the non-FPU/non-void result is ++ // saved in _native_lresult and a FPU result in _native_fresult. If ++ // this changes then the interpreter_frame_result implementation ++ // will need to be updated too. ++ ++ // On PPC64, we have stored the result directly after the native call. ++ ++ //============================================================================= ++ // back in Java ++ ++ // We use release_store_fence to update values like the thread state, where ++ // we don't want the current thread to continue until all our prior memory ++ // accesses (including the new thread state) are visible to other threads. ++ __ li(R0/*thread_state*/, _thread_in_Java); ++ __ release(); ++ __ stw(R0/*thread_state*/, thread_(thread_state)); ++ if (UseMembar) { ++ __ fence(); ++ } ++ ++ __ reset_last_Java_frame(); ++ ++ // Reload GR27_method, call killed it. We can't look at ++ // state->_method until we're back in java state because in java ++ // state gc can't happen until we get to a safepoint. ++ // ++ // We've set thread_state to _thread_in_Java already, so restoring ++ // R19_method from R14_state works; R19_method is invalid, because ++ // GC may have happened. ++ __ ld(R19_method, state_(_method)); // reload method, may have moved ++ ++ // jvmdi/jvmpi support. Whether we've got an exception pending or ++ // not, and whether unlocking throws an exception or not, we notify ++ // on native method exit. If we do have an exception, we'll end up ++ // in the caller's context to handle it, so if we don't do the ++ // notify here, we'll drop it on the floor. ++ ++ __ notify_method_exit(true/*native method*/, ++ ilgl /*illegal state (not used for native methods)*/, ++ InterpreterMacroAssembler::NotifyJVMTI, ++ false /*check_exceptions*/); ++ ++ //============================================================================= ++ // Handle exceptions ++ ++ // See if we must unlock. ++ // ++ { ++ Label method_is_not_synced; ++ // is_synced is still alive ++ assert(is_synced->is_nonvolatile(), "is_synced must be non-volatile"); ++ __ bfalse(is_synced, method_is_not_synced); ++ ++ unlock_method(); ++ ++ __ bind(method_is_not_synced); ++ } ++ ++ // Reset active handles after returning from native. ++ // thread->active_handles()->clear(); ++ __ ld(active_handles, thread_(active_handles)); ++ // JNIHandleBlock::_top is an int. ++ // TODO: PPC port: assert(4 == JNIHandleBlock::top_size_in_bytes(), "unexpected field size"); ++ __ li(R0, 0); ++ __ stw(R0, JNIHandleBlock::top_offset_in_bytes(), active_handles); ++ ++ Label no_pending_exception_from_native_method; ++ __ ld(R0/*pending_exception*/, thread_(pending_exception)); ++ __ cmpdi(CCR0, R0/*pending_exception*/, 0); ++ __ beq(CCR0, no_pending_exception_from_native_method); ++ ++ ++ //----------------------------------------------------------------------------- ++ // An exception is pending. We call into the runtime only if the ++ // caller was not interpreted. If it was interpreted the ++ // interpreter will do the correct thing. If it isn't interpreted ++ // (call stub/compiled code) we will change our return and continue. ++ __ BIND(exception_return); ++ ++ Label return_to_initial_caller_with_pending_exception; ++ __ cmpdi(CCR0, R15_prev_state, 0); ++ __ beq(CCR0, return_to_initial_caller_with_pending_exception); ++ ++ // We are returning to an interpreter activation, just pop the state, ++ // pop our frame, leave the exception pending, and return. ++ __ pop_interpreter_state(/*prev_state_may_be_0=*/false); ++ __ pop_interpreter_frame(R11_scratch1, R12_scratch2, R21_tmp1 /* set to return pc */, R22_tmp2); ++ __ mtlr(R21_tmp1); ++ __ blr(); ++ ++ __ BIND(exception_return_sync_check); ++ ++ assert(is_synced->is_nonvolatile(), "is_synced must be non-volatile"); ++ __ bfalse(is_synced, exception_return); ++ unlock_method(); ++ __ b(exception_return); ++ ++ ++ __ BIND(return_to_initial_caller_with_pending_exception); ++ // We are returning to a c2i-adapter / call-stub, get the address of the ++ // exception handler, pop the frame and return to the handler. ++ ++ // First, pop to caller's frame. ++ __ pop_interpreter_frame(R11_scratch1, R12_scratch2, R21_tmp1 /* set to return pc */, R22_tmp2); ++ ++ __ push_frame_reg_args(0, R11_scratch1); ++ // Get the address of the exception handler. ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), ++ R16_thread, ++ R21_tmp1 /* return pc */); ++ __ pop_frame(); ++ ++ // Load the PC of the the exception handler into LR. ++ __ mtlr(R3_RET); ++ ++ // Load exception into R3_ARG1 and clear pending exception in thread. ++ __ ld(R3_ARG1/*exception*/, thread_(pending_exception)); ++ __ li(R4_ARG2, 0); ++ __ std(R4_ARG2, thread_(pending_exception)); ++ ++ // Load the original return pc into R4_ARG2. ++ __ mr(R4_ARG2/*issuing_pc*/, R21_tmp1); ++ ++ // Resize frame to get rid of a potential extension. ++ __ resize_frame_to_initial_caller(R11_scratch1, R12_scratch2); ++ ++ // Return to exception handler. ++ __ blr(); ++ ++ ++ //----------------------------------------------------------------------------- ++ // No exception pending. ++ __ BIND(no_pending_exception_from_native_method); ++ ++ // Move native method result back into proper registers and return. ++ // Invoke result handler (may unbox/promote). ++ __ ld(R3_RET, state_(_native_lresult)); ++ __ lfd(F1_RET, state_(_native_fresult)); ++ __ call_stub(result_handler_addr); ++ ++ // We have created a new BytecodeInterpreter object, now we must destroy it. ++ // ++ // Restore previous R14_state and caller's SP. R15_prev_state may ++ // be 0 here, because our caller may be the call_stub or compiled ++ // code. ++ __ pop_interpreter_state(/*prev_state_may_be_0=*/true); ++ __ pop_interpreter_frame(R11_scratch1, R12_scratch2, R21_tmp1 /* set to return pc */, R22_tmp2); ++ // Resize frame to get rid of a potential extension. ++ __ resize_frame_to_initial_caller(R11_scratch1, R12_scratch2); ++ ++ // Must use the return pc which was loaded from the caller's frame ++ // as the VM uses return-pc-patching for deoptimization. ++ __ mtlr(R21_tmp1); ++ __ blr(); ++ ++ ++ ++ //============================================================================= ++ // We encountered an exception while computing the interpreter ++ // state, so R14_state isn't valid. Act as if we just returned from ++ // the callee method with a pending exception. ++ __ BIND(stack_overflow_return); ++ ++ // ++ // Register state: ++ // R14_state invalid; trashed by compute_interpreter_state ++ // R15_prev_state valid, but may be 0 ++ // ++ // R1_SP valid, points to caller's SP; wasn't yet updated by ++ // compute_interpreter_state ++ // ++ ++ // Create exception oop and make it pending. ++ ++ // Throw the exception via RuntimeStub "throw_StackOverflowError_entry". ++ // ++ // Previously, we called C-Code directly. As a consequence, a ++ // possible GC tried to process the argument oops of the top frame ++ // (see RegisterMap::clear, which sets the corresponding flag to ++ // true). This lead to crashes because: ++ // 1. The top register map did not contain locations for the argument registers ++ // 2. The arguments are dead anyway, could be already overwritten in the worst case ++ // Solution: Call via special runtime stub that pushes it's own ++ // frame. This runtime stub has the flag "CodeBlob::caller_must_gc_arguments()" ++ // set to "false", what prevents the dead arguments getting GC'd. ++ // ++ // 2 cases exist: ++ // 1. We were called by the c2i adapter / call stub ++ // 2. We were called by the frame manager ++ // ++ // Both cases are handled by this code: ++ // 1. - initial_caller_sp was saved in both cases on entry, so it's safe to load it back even if it was not changed. ++ // - control flow will be: ++ // throw_stackoverflow_stub->VM->throw_stackoverflow_stub->forward_excep->excp_blob of caller method ++ // 2. - control flow will be: ++ // throw_stackoverflow_stub->VM->throw_stackoverflow_stub->forward_excep->rethrow_excp_entry of frame manager->resume_method ++ // Since we restored the caller SP above, the rethrow_excp_entry can restore the original interpreter state ++ // registers using the stack and resume the calling method with a pending excp. ++ ++ // Pop any c2i extension from the stack, restore LR just to be sure ++ __ ld(R0, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ __ mtlr(R0); ++ // Resize frame to get rid of a potential extension. ++ __ resize_frame_to_initial_caller(R11_scratch1, R12_scratch2); ++ ++ assert(StubRoutines::throw_StackOverflowError_entry() != NULL, "generated in wrong order"); ++ // Load target address of the runtime stub. ++ __ load_const(R12_scratch2, (StubRoutines::throw_StackOverflowError_entry())); ++ __ mtctr(R12_scratch2); ++ __ bctr(); ++ ++ ++ //============================================================================= ++ // Counter overflow. ++ ++ if (inc_counter) { ++ // Handle invocation counter overflow ++ __ bind(invocation_counter_overflow); ++ ++ generate_counter_overflow(continue_after_compile); ++ } ++ ++ native_entry = entry; ++ return entry; ++} ++ ++bool AbstractInterpreter::can_be_compiled(methodHandle m) { ++ // No special entry points that preclude compilation. ++ return true; ++} ++ ++// Unlock the current method. ++// ++void CppInterpreterGenerator::unlock_method(void) { ++ // Find preallocated monitor and unlock method. Method monitor is ++ // the first one. ++ ++ // Registers alive ++ // R14_state ++ // ++ // Registers updated ++ // volatiles ++ // ++ const Register monitor = R4_ARG2; ++ ++ // Pass address of initial monitor we allocated. ++ // ++ // First monitor. ++ __ addi(monitor, R14_state, -frame::interpreter_frame_monitor_size_in_bytes()); ++ ++ // Unlock method ++ __ unlock_object(monitor); ++} ++ ++// Lock the current method. ++// ++void CppInterpreterGenerator::lock_method(void) { ++ // Find preallocated monitor and lock method. Method monitor is the ++ // first one. ++ ++ // ++ // Registers alive ++ // R14_state ++ // ++ // Registers updated ++ // volatiles ++ // ++ ++ const Register monitor = R4_ARG2; ++ const Register object = R5_ARG3; ++ ++ // Pass address of initial monitor we allocated. ++ __ addi(monitor, R14_state, -frame::interpreter_frame_monitor_size_in_bytes()); ++ ++ // Pass object address. ++ __ ld(object, BasicObjectLock::obj_offset_in_bytes(), monitor); ++ ++ // Lock method. ++ __ lock_object(monitor, object); ++} ++ ++// Generate code for handling resuming a deopted method. ++void CppInterpreterGenerator::generate_deopt_handling(Register result_index) { ++ ++ //============================================================================= ++ // Returning from a compiled method into a deopted method. The ++ // bytecode at the bcp has completed. The result of the bytecode is ++ // in the native abi (the tosca for the template based ++ // interpreter). Any stack space that was used by the bytecode that ++ // has completed has been removed (e.g. parameters for an invoke) so ++ // all that we have to do is place any pending result on the ++ // expression stack and resume execution on the next bytecode. ++ ++ Label return_from_deopt_common; ++ ++ // R3_RET and F1_RET are live here! Load the array index of the ++ // required result stub address and continue at return_from_deopt_common. ++ ++ // Deopt needs to jump to here to enter the interpreter (return a result). ++ deopt_frame_manager_return_atos = __ pc(); ++ __ li(result_index, AbstractInterpreter::BasicType_as_index(T_OBJECT)); ++ __ b(return_from_deopt_common); ++ ++ deopt_frame_manager_return_btos = __ pc(); ++ __ li(result_index, AbstractInterpreter::BasicType_as_index(T_BOOLEAN)); ++ __ b(return_from_deopt_common); ++ ++ deopt_frame_manager_return_itos = __ pc(); ++ __ li(result_index, AbstractInterpreter::BasicType_as_index(T_INT)); ++ __ b(return_from_deopt_common); ++ ++ deopt_frame_manager_return_ltos = __ pc(); ++ __ li(result_index, AbstractInterpreter::BasicType_as_index(T_LONG)); ++ __ b(return_from_deopt_common); ++ ++ deopt_frame_manager_return_ftos = __ pc(); ++ __ li(result_index, AbstractInterpreter::BasicType_as_index(T_FLOAT)); ++ __ b(return_from_deopt_common); ++ ++ deopt_frame_manager_return_dtos = __ pc(); ++ __ li(result_index, AbstractInterpreter::BasicType_as_index(T_DOUBLE)); ++ __ b(return_from_deopt_common); ++ ++ deopt_frame_manager_return_vtos = __ pc(); ++ __ li(result_index, AbstractInterpreter::BasicType_as_index(T_VOID)); ++ // Last one, fall-through to return_from_deopt_common. ++ ++ // Deopt return common. An index is present that lets us move any ++ // possible result being return to the interpreter's stack. ++ // ++ __ BIND(return_from_deopt_common); ++ ++} ++ ++// Generate the code to handle a more_monitors message from the c++ interpreter. ++void CppInterpreterGenerator::generate_more_monitors() { ++ ++ // ++ // Registers alive ++ // R16_thread - JavaThread* ++ // R15_prev_state - previous BytecodeInterpreter or 0 ++ // R14_state - BytecodeInterpreter* address of receiver's interpreter state ++ // R1_SP - old stack pointer ++ // ++ // Registers updated ++ // R1_SP - new stack pointer ++ // ++ ++ // Very-local scratch registers. ++ const Register old_tos = R21_tmp1; ++ const Register new_tos = R22_tmp2; ++ const Register stack_base = R23_tmp3; ++ const Register stack_limit = R24_tmp4; ++ const Register slot = R25_tmp5; ++ const Register n_slots = R25_tmp5; ++ ++ // Interpreter state fields. ++ const Register msg = R24_tmp4; ++ ++ // Load up relevant interpreter state. ++ ++ __ ld(stack_base, state_(_stack_base)); // Old stack_base ++ __ ld(old_tos, state_(_stack)); // Old tos ++ __ ld(stack_limit, state_(_stack_limit)); // Old stack_limit ++ ++ // extracted monitor_size ++ int monitor_size = frame::interpreter_frame_monitor_size_in_bytes(); ++ assert(Assembler::is_aligned((unsigned int)monitor_size, ++ (unsigned int)frame::alignment_in_bytes), ++ "size of a monitor must respect alignment of SP"); ++ ++ // Save and restore top LR ++ __ ld(R12_scratch2, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ __ resize_frame(-monitor_size, R11_scratch1);// Allocate space for new monitor ++ __ std(R12_scratch2, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ // Initial_caller_sp is used as unextended_sp for non initial callers. ++ __ std(R1_SP, _top_ijava_frame_abi(initial_caller_sp), R1_SP); ++ __ addi(stack_base, stack_base, -monitor_size); // New stack_base ++ __ addi(new_tos, old_tos, -monitor_size); // New tos ++ __ addi(stack_limit, stack_limit, -monitor_size); // New stack_limit ++ ++ __ std(R1_SP, state_(_last_Java_sp)); // Update frame_bottom ++ ++ __ std(stack_base, state_(_stack_base)); // Update stack_base ++ __ std(new_tos, state_(_stack)); // Update tos ++ __ std(stack_limit, state_(_stack_limit)); // Update stack_limit ++ ++ __ li(msg, BytecodeInterpreter::got_monitors); // Tell interpreter we allocated the lock ++ __ stw(msg, state_(_msg)); ++ ++ // Shuffle expression stack down. Recall that stack_base points ++ // just above the new expression stack bottom. Old_tos and new_tos ++ // are used to scan thru the old and new expression stacks. ++ ++ Label copy_slot, copy_slot_finished; ++ __ sub(n_slots, stack_base, new_tos); ++ __ srdi_(n_slots, n_slots, LogBytesPerWord); // compute number of slots to copy ++ assert(LogBytesPerWord == 3, "conflicts assembler instructions"); ++ __ beq(CCR0, copy_slot_finished); // nothing to copy ++ ++ __ mtctr(n_slots); ++ ++ // loop ++ __ bind(copy_slot); ++ __ ldu(slot, BytesPerWord, old_tos); // slot = *++old_tos; ++ __ stdu(slot, BytesPerWord, new_tos); // *++new_tos = slot; ++ __ bdnz(copy_slot); ++ ++ __ bind(copy_slot_finished); ++ ++ // Restart interpreter ++ __ li(R0, 0); ++ __ std(R0, BasicObjectLock::obj_offset_in_bytes(), stack_base); // Mark lock as unused ++} ++ ++address CppInterpreterGenerator::generate_normal_entry(void) { ++ if (interpreter_frame_manager != NULL) return interpreter_frame_manager; ++ ++ address entry = __ pc(); ++ ++ address return_from_native_pc = (address) NULL; ++ ++ // Initial entry to frame manager (from call_stub or c2i_adapter) ++ ++ // ++ // Registers alive ++ // R16_thread - JavaThread* ++ // R19_method - callee's Method (method to be invoked) ++ // R17_tos - address of sender tos (prepushed) ++ // R1_SP - SP prepared by call stub such that caller's outgoing args are near top ++ // LR - return address to caller (call_stub or c2i_adapter) ++ // R21_sender_SP - initial caller sp ++ // ++ // Registers updated ++ // R15_prev_state - 0 ++ // ++ // Stack layout at this point: ++ // ++ // 0 [TOP_IJAVA_FRAME_ABI] <-- R1_SP ++ // alignment (optional) ++ // [outgoing Java arguments] <-- R17_tos ++ // ... ++ // PARENT [PARENT_IJAVA_FRAME_ABI] ++ // ... ++ // ++ ++ // Save initial_caller_sp to caller's abi. ++ // The caller frame must be resized before returning to get rid of ++ // the c2i part on top of the calling compiled frame (if any). ++ // R21_tmp1 must match sender_sp in gen_c2i_adapter. ++ // Now override the saved SP with the senderSP so we can pop c2i ++ // arguments (if any) off when we return. ++ __ std(R21_sender_SP, _top_ijava_frame_abi(initial_caller_sp), R1_SP); ++ ++ // Save LR to caller's frame. We don't use _abi(lr) here, ++ // because it is not safe. ++ __ mflr(R0); ++ __ std(R0, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ ++ // If we come here, it is the first invocation of the frame manager. ++ // So there is no previous interpreter state. ++ __ li(R15_prev_state, 0); ++ ++ ++ // Fall through to where "recursive" invocations go. ++ ++ //============================================================================= ++ // Dispatch an instance of the interpreter. Recursive activations ++ // come here. ++ ++ Label re_dispatch; ++ __ BIND(re_dispatch); ++ ++ // ++ // Registers alive ++ // R16_thread - JavaThread* ++ // R19_method - callee's Method ++ // R17_tos - address of caller's tos (prepushed) ++ // R15_prev_state - address of caller's BytecodeInterpreter or 0 ++ // R1_SP - caller's SP trimmed such that caller's outgoing args are near top. ++ // ++ // Stack layout at this point: ++ // ++ // 0 [TOP_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [outgoing Java arguments] ++ // ... ++ // PARENT [PARENT_IJAVA_FRAME_ABI] ++ // ... ++ ++ // fall through to interpreted execution ++ ++ //============================================================================= ++ // Allocate a new Java frame and initialize the new interpreter state. ++ ++ Label stack_overflow_return; ++ ++ // Create a suitable new Java frame plus a new BytecodeInterpreter instance ++ // in the current (frame manager's) C frame. ++ generate_compute_interpreter_state(stack_overflow_return); ++ ++ // fall through ++ ++ //============================================================================= ++ // Interpreter dispatch. ++ ++ Label call_interpreter; ++ __ BIND(call_interpreter); ++ ++ // ++ // Registers alive ++ // R16_thread - JavaThread* ++ // R15_prev_state - previous BytecodeInterpreter or 0 ++ // R14_state - address of receiver's BytecodeInterpreter ++ // R1_SP - receiver's stack pointer ++ // ++ ++ // Thread fields. ++ const Register pending_exception = R21_tmp1; ++ ++ // Interpreter state fields. ++ const Register msg = R24_tmp4; ++ ++ // Method fields. ++ const Register parameter_count = R25_tmp5; ++ const Register result_index = R26_tmp6; ++ ++ const Register dummy = R28_tmp8; ++ ++ // Address of various interpreter stubs. ++ // R29_tmp9 is reserved. ++ const Register stub_addr = R27_tmp7; ++ ++ // Uncommon trap needs to jump to here to enter the interpreter ++ // (re-execute current bytecode). ++ unctrap_frame_manager_entry = __ pc(); ++ ++ // If we are profiling, store our fp (BSP) in the thread so we can ++ // find it during a tick. ++ if (Arguments::has_profile()) { ++ // On PPC64 we store the pointer to the current BytecodeInterpreter, ++ // instead of the bsp of ia64. This should suffice to be able to ++ // find all interesting information. ++ __ std(R14_state, thread_(last_interpreter_fp)); ++ } ++ ++ // R16_thread, R14_state and R15_prev_state are nonvolatile ++ // registers. There is no need to save these. If we needed to save ++ // some state in the current Java frame, this could be a place to do ++ // so. ++ ++ // Call Java bytecode dispatcher passing "BytecodeInterpreter* istate". ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, ++ JvmtiExport::can_post_interpreter_events() ++ ? BytecodeInterpreter::runWithChecks ++ : BytecodeInterpreter::run), ++ R14_state); ++ ++ interpreter_return_address = __ last_calls_return_pc(); ++ ++ // R16_thread, R14_state and R15_prev_state have their values preserved. ++ ++ // If we are profiling, clear the fp in the thread to tell ++ // the profiler that we are no longer in the interpreter. ++ if (Arguments::has_profile()) { ++ __ li(R11_scratch1, 0); ++ __ std(R11_scratch1, thread_(last_interpreter_fp)); ++ } ++ ++ // Load message from bytecode dispatcher. ++ // TODO: PPC port: guarantee(4 == BytecodeInterpreter::sz_msg(), "unexpected field size"); ++ __ lwz(msg, state_(_msg)); ++ ++ ++ Label more_monitors; ++ Label return_from_native; ++ Label return_from_native_common; ++ Label return_from_native_no_exception; ++ Label return_from_interpreted_method; ++ Label return_from_recursive_activation; ++ Label unwind_recursive_activation; ++ Label resume_interpreter; ++ Label return_to_initial_caller; ++ Label unwind_initial_activation; ++ Label unwind_initial_activation_pending_exception; ++ Label call_method; ++ Label call_special; ++ Label retry_method; ++ Label retry_method_osr; ++ Label popping_frame; ++ Label throwing_exception; ++ ++ // Branch according to the received message ++ ++ __ cmpwi(CCR1, msg, BytecodeInterpreter::call_method); ++ __ cmpwi(CCR2, msg, BytecodeInterpreter::return_from_method); ++ ++ __ beq(CCR1, call_method); ++ __ beq(CCR2, return_from_interpreted_method); ++ ++ __ cmpwi(CCR3, msg, BytecodeInterpreter::more_monitors); ++ __ cmpwi(CCR4, msg, BytecodeInterpreter::throwing_exception); ++ ++ __ beq(CCR3, more_monitors); ++ __ beq(CCR4, throwing_exception); ++ ++ __ cmpwi(CCR5, msg, BytecodeInterpreter::popping_frame); ++ __ cmpwi(CCR6, msg, BytecodeInterpreter::do_osr); ++ ++ __ beq(CCR5, popping_frame); ++ __ beq(CCR6, retry_method_osr); ++ ++ __ stop("bad message from interpreter"); ++ ++ ++ //============================================================================= ++ // Add a monitor just below the existing one(s). State->_stack_base ++ // points to the lowest existing one, so we insert the new one just ++ // below it and shuffle the expression stack down. Ref. the above ++ // stack layout picture, we must update _stack_base, _stack, _stack_limit ++ // and _last_Java_sp in the interpreter state. ++ ++ __ BIND(more_monitors); ++ ++ generate_more_monitors(); ++ __ b(call_interpreter); ++ ++ generate_deopt_handling(result_index); ++ ++ // Restoring the R14_state is already done by the deopt_blob. ++ ++ // Current tos includes no parameter slots. ++ __ ld(R17_tos, state_(_stack)); ++ __ li(msg, BytecodeInterpreter::deopt_resume); ++ __ b(return_from_native_common); ++ ++ // We are sent here when we are unwinding from a native method or ++ // adapter with an exception pending. We need to notify the interpreter ++ // that there is an exception to process. ++ // We arrive here also if the frame manager called an (interpreted) target ++ // which returns with a StackOverflow exception. ++ // The control flow is in this case is: ++ // frame_manager->throw_excp_stub->forward_excp->rethrow_excp_entry ++ ++ AbstractInterpreter::_rethrow_exception_entry = __ pc(); ++ ++ // Restore R14_state. ++ __ ld(R14_state, 0, R1_SP); ++ __ addi(R14_state, R14_state, ++ -frame::interpreter_frame_cinterpreterstate_size_in_bytes()); ++ ++ // Store exception oop into thread object. ++ __ std(R3_RET, thread_(pending_exception)); ++ __ li(msg, BytecodeInterpreter::method_resume /*rethrow_exception*/); ++ // ++ // NOTE: the interpreter frame as setup be deopt does NOT include ++ // any parameter slots (good thing since we have no callee here ++ // and couldn't remove them) so we don't have to do any calculations ++ // here to figure it out. ++ // ++ __ ld(R17_tos, state_(_stack)); ++ __ b(return_from_native_common); ++ ++ ++ //============================================================================= ++ // Returning from a native method. Result is in the native abi ++ // location so we must move it to the java expression stack. ++ ++ __ BIND(return_from_native); ++ guarantee(return_from_native_pc == (address) NULL, "precondition"); ++ return_from_native_pc = __ pc(); ++ ++ // Restore R14_state. ++ __ ld(R14_state, 0, R1_SP); ++ __ addi(R14_state, R14_state, -frame::interpreter_frame_cinterpreterstate_size_in_bytes()); ++ ++ // ++ // Registers alive ++ // R16_thread ++ // R14_state - address of caller's BytecodeInterpreter. ++ // R3_RET - integer result, if any. ++ // F1_RET - float result, if any. ++ // ++ // Registers updated ++ // R19_method - callee's Method ++ // R17_tos - caller's tos, with outgoing args popped ++ // result_index - index of result handler. ++ // msg - message for resuming interpreter. ++ // ++ ++ // Very-local scratch registers. ++ ++ const ConditionRegister have_pending_exception = CCR0; ++ ++ // Load callee Method, gc may have moved it. ++ __ ld(R19_method, state_(_result._to_call._callee)); ++ ++ // Load address of caller's tos. includes parameter slots. ++ __ ld(R17_tos, state_(_stack)); ++ ++ // Pop callee's parameters. ++ ++ __ ld(parameter_count, in_bytes(Method::const_offset()), R19_method); ++ __ lhz(parameter_count, in_bytes(ConstMethod::size_of_parameters_offset()), parameter_count); ++ __ sldi(parameter_count, parameter_count, Interpreter::logStackElementSize); ++ __ add(R17_tos, R17_tos, parameter_count); ++ ++ // Result stub address array index ++ // TODO: PPC port: assert(4 == sizeof(AccessFlags), "unexpected field size"); ++ __ lwa(result_index, method_(result_index)); ++ ++ __ li(msg, BytecodeInterpreter::method_resume); ++ ++ // ++ // Registers alive ++ // R16_thread ++ // R14_state - address of caller's BytecodeInterpreter. ++ // R17_tos - address of caller's tos with outgoing args already popped ++ // R3_RET - integer return value, if any. ++ // F1_RET - float return value, if any. ++ // result_index - index of result handler. ++ // msg - message for resuming interpreter. ++ // ++ // Registers updated ++ // R3_RET - new address of caller's tos, including result, if any ++ // ++ ++ __ BIND(return_from_native_common); ++ ++ // Check for pending exception ++ __ ld(pending_exception, thread_(pending_exception)); ++ __ cmpdi(CCR0, pending_exception, 0); ++ __ beq(CCR0, return_from_native_no_exception); ++ ++ // If there's a pending exception, we really have no result, so ++ // R3_RET is dead. Resume_interpreter assumes the new tos is in ++ // R3_RET. ++ __ mr(R3_RET, R17_tos); ++ // `resume_interpreter' expects R15_prev_state to be alive. ++ __ ld(R15_prev_state, state_(_prev_link)); ++ __ b(resume_interpreter); ++ ++ __ BIND(return_from_native_no_exception); ++ ++ // No pending exception, copy method result from native ABI register ++ // to tos. ++ ++ // Address of stub descriptor address array. ++ __ load_const(stub_addr, CppInterpreter::tosca_result_to_stack()); ++ ++ // Pass address of tos to stub. ++ __ mr(R4_ARG2, R17_tos); ++ ++ // Address of stub descriptor address. ++ __ sldi(result_index, result_index, LogBytesPerWord); ++ __ add(stub_addr, stub_addr, result_index); ++ ++ // Stub descriptor address. ++ __ ld(stub_addr, 0, stub_addr); ++ ++ // TODO: don't do this via a call, do it in place! ++ // ++ // call stub via descriptor ++ // in R3_ARG1/F1_ARG1: result value (R3_RET or F1_RET) ++ __ call_stub(stub_addr); ++ ++ // new tos = result of call in R3_RET ++ ++ // `resume_interpreter' expects R15_prev_state to be alive. ++ __ ld(R15_prev_state, state_(_prev_link)); ++ __ b(resume_interpreter); ++ ++ //============================================================================= ++ // We encountered an exception while computing the interpreter ++ // state, so R14_state isn't valid. Act as if we just returned from ++ // the callee method with a pending exception. ++ __ BIND(stack_overflow_return); ++ ++ // ++ // Registers alive ++ // R16_thread - JavaThread* ++ // R1_SP - old stack pointer ++ // R19_method - callee's Method ++ // R17_tos - address of caller's tos (prepushed) ++ // R15_prev_state - address of caller's BytecodeInterpreter or 0 ++ // R18_locals - address of callee's locals array ++ // ++ // Registers updated ++ // R3_RET - address of resuming tos, if recursive unwind ++ ++ Label Lskip_unextend_SP; ++ ++ { ++ const ConditionRegister is_initial_call = CCR0; ++ const Register tos_save = R21_tmp1; ++ const Register tmp = R22_tmp2; ++ ++ assert(tos_save->is_nonvolatile(), "need a nonvolatile"); ++ ++ // Is the exception thrown in the initial Java frame of this frame ++ // manager frame? ++ __ cmpdi(is_initial_call, R15_prev_state, 0); ++ __ bne(is_initial_call, Lskip_unextend_SP); ++ ++ // Pop any c2i extension from the stack. This is necessary in the ++ // non-recursive case (that is we were called by the c2i adapter, ++ // meaning we have to prev state). In this case we entered the frame ++ // manager through a special entry which pushes the orignal ++ // unextended SP to the stack. Here we load it back. ++ __ ld(R0, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ __ mtlr(R0); ++ // Resize frame to get rid of a potential extension. ++ __ resize_frame_to_initial_caller(R11_scratch1, R12_scratch2); ++ ++ // Fall through ++ ++ __ bind(Lskip_unextend_SP); ++ ++ // Throw the exception via RuntimeStub "throw_StackOverflowError_entry". ++ // ++ // Previously, we called C-Code directly. As a consequence, a ++ // possible GC tried to process the argument oops of the top frame ++ // (see RegisterMap::clear, which sets the corresponding flag to ++ // true). This lead to crashes because: ++ // 1. The top register map did not contain locations for the argument registers ++ // 2. The arguments are dead anyway, could be already overwritten in the worst case ++ // Solution: Call via special runtime stub that pushes it's own frame. This runtime stub has the flag ++ // "CodeBlob::caller_must_gc_arguments()" set to "false", what prevents the dead arguments getting GC'd. ++ // ++ // 2 cases exist: ++ // 1. We were called by the c2i adapter / call stub ++ // 2. We were called by the frame manager ++ // ++ // Both cases are handled by this code: ++ // 1. - initial_caller_sp was saved on stack => Load it back and we're ok ++ // - control flow will be: ++ // throw_stackoverflow_stub->VM->throw_stackoverflow_stub->forward_excep->excp_blob of calling method ++ // 2. - control flow will be: ++ // throw_stackoverflow_stub->VM->throw_stackoverflow_stub->forward_excep-> ++ // ->rethrow_excp_entry of frame manager->resume_method ++ // Since we restored the caller SP above, the rethrow_excp_entry can restore the original interpreter state ++ // registers using the stack and resume the calling method with a pending excp. ++ ++ assert(StubRoutines::throw_StackOverflowError_entry() != NULL, "generated in wrong order"); ++ __ load_const(R3_ARG1, (StubRoutines::throw_StackOverflowError_entry())); ++ __ mtctr(R3_ARG1); ++ __ bctr(); ++ } ++ //============================================================================= ++ // We have popped a frame from an interpreted call. We are assured ++ // of returning to an interpreted call by the popframe abi. We have ++ // no return value all we have to do is pop the current frame and ++ // then make sure that the top of stack (of the caller) gets set to ++ // where it was when we entered the callee (i.e. the args are still ++ // in place). Or we are returning to the interpreter. In the first ++ // case we must extract result (if any) from the java expression ++ // stack and store it in the location the native abi would expect ++ // for a call returning this type. In the second case we must simply ++ // do a stack to stack move as we unwind. ++ ++ __ BIND(popping_frame); ++ ++ // Registers alive ++ // R14_state ++ // R15_prev_state ++ // R17_tos ++ // ++ // Registers updated ++ // R19_method ++ // R3_RET ++ // msg ++ { ++ Label L; ++ ++ // Reload callee method, gc may have moved it. ++ __ ld(R19_method, state_(_method)); ++ ++ // We may be returning to a deoptimized frame in which case the ++ // usual assumption of a recursive return is not true. ++ ++ // not equal = is recursive call ++ __ cmpdi(CCR0, R15_prev_state, 0); ++ ++ __ bne(CCR0, L); ++ ++ // Pop_frame capability. ++ // The pop_frame api says that the underlying frame is a Java frame, in this case ++ // (prev_state==null) it must be a compiled frame: ++ // ++ // Stack at this point: I, C2I + C, ... ++ // ++ // The outgoing arguments of the call have just been copied (popframe_preserve_args). ++ // By the pop_frame api, we must end up in an interpreted frame. So the compiled frame ++ // will be deoptimized. Deoptimization will restore the outgoing arguments from ++ // popframe_preserve_args, adjust the tos such that it includes the popframe_preserve_args, ++ // and adjust the bci such that the call will be executed again. ++ // We have no results, just pop the interpreter frame, resize the compiled frame to get rid ++ // of the c2i extension and return to the deopt_handler. ++ __ b(unwind_initial_activation); ++ ++ // is recursive call ++ __ bind(L); ++ ++ // Resume_interpreter expects the original tos in R3_RET. ++ __ ld(R3_RET, prev_state_(_stack)); ++ ++ // We're done. ++ __ li(msg, BytecodeInterpreter::popping_frame); ++ ++ __ b(unwind_recursive_activation); ++ } ++ ++ ++ //============================================================================= ++ ++ // We have finished an interpreted call. We are either returning to ++ // native (call_stub/c2) or we are returning to the interpreter. ++ // When returning to native, we must extract the result (if any) ++ // from the java expression stack and store it in the location the ++ // native abi expects. When returning to the interpreter we must ++ // simply do a stack to stack move as we unwind. ++ ++ __ BIND(return_from_interpreted_method); ++ ++ // ++ // Registers alive ++ // R16_thread - JavaThread* ++ // R15_prev_state - address of caller's BytecodeInterpreter or 0 ++ // R14_state - address of callee's interpreter state ++ // R1_SP - callee's stack pointer ++ // ++ // Registers updated ++ // R19_method - callee's method ++ // R3_RET - address of result (new caller's tos), ++ // ++ // if returning to interpreted ++ // msg - message for interpreter, ++ // if returning to interpreted ++ // ++ ++ // Check if this is the initial invocation of the frame manager. ++ // If so, R15_prev_state will be null. ++ __ cmpdi(CCR0, R15_prev_state, 0); ++ ++ // Reload callee method, gc may have moved it. ++ __ ld(R19_method, state_(_method)); ++ ++ // Load the method's result type. ++ __ lwz(result_index, method_(result_index)); ++ ++ // Go to return_to_initial_caller if R15_prev_state is null. ++ __ beq(CCR0, return_to_initial_caller); ++ ++ // Copy callee's result to caller's expression stack via inline stack-to-stack ++ // converters. ++ { ++ Register new_tos = R3_RET; ++ Register from_temp = R4_ARG2; ++ Register from = R5_ARG3; ++ Register tos = R6_ARG4; ++ Register tmp1 = R7_ARG5; ++ Register tmp2 = R8_ARG6; ++ ++ ConditionRegister result_type_is_void = CCR1; ++ ConditionRegister result_type_is_long = CCR2; ++ ConditionRegister result_type_is_double = CCR3; ++ ++ Label stack_to_stack_void; ++ Label stack_to_stack_double_slot; // T_LONG, T_DOUBLE ++ Label stack_to_stack_single_slot; // T_BOOLEAN, T_BYTE, T_CHAR, T_SHORT, T_INT, T_FLOAT, T_OBJECT ++ Label stack_to_stack_done; ++ ++ // Pass callee's address of tos + BytesPerWord ++ __ ld(from_temp, state_(_stack)); ++ ++ // result type: void ++ __ cmpwi(result_type_is_void, result_index, AbstractInterpreter::BasicType_as_index(T_VOID)); ++ ++ // Pass caller's tos == callee's locals address ++ __ ld(tos, state_(_locals)); ++ ++ // result type: long ++ __ cmpwi(result_type_is_long, result_index, AbstractInterpreter::BasicType_as_index(T_LONG)); ++ ++ __ addi(from, from_temp, Interpreter::stackElementSize); ++ ++ // !! don't branch above this line !! ++ ++ // handle void ++ __ beq(result_type_is_void, stack_to_stack_void); ++ ++ // result type: double ++ __ cmpwi(result_type_is_double, result_index, AbstractInterpreter::BasicType_as_index(T_DOUBLE)); ++ ++ // handle long or double ++ __ beq(result_type_is_long, stack_to_stack_double_slot); ++ __ beq(result_type_is_double, stack_to_stack_double_slot); ++ ++ // fall through to single slot types (incl. object) ++ ++ { ++ __ BIND(stack_to_stack_single_slot); ++ // T_BOOLEAN, T_BYTE, T_CHAR, T_SHORT, T_INT, T_FLOAT, T_OBJECT ++ ++ __ ld(tmp1, 0, from); ++ __ std(tmp1, 0, tos); ++ // New expression stack top ++ __ addi(new_tos, tos, - BytesPerWord); ++ ++ __ b(stack_to_stack_done); ++ } ++ ++ { ++ __ BIND(stack_to_stack_double_slot); ++ // T_LONG, T_DOUBLE ++ ++ // Move both entries for debug purposes even though only one is live ++ __ ld(tmp1, BytesPerWord, from); ++ __ ld(tmp2, 0, from); ++ __ std(tmp1, 0, tos); ++ __ std(tmp2, -BytesPerWord, tos); ++ ++ // new expression stack top ++ __ addi(new_tos, tos, - 2 * BytesPerWord); // two slots ++ __ b(stack_to_stack_done); ++ } ++ ++ { ++ __ BIND(stack_to_stack_void); ++ // T_VOID ++ ++ // new expression stack top ++ __ mr(new_tos, tos); ++ // fall through to stack_to_stack_done ++ } ++ ++ __ BIND(stack_to_stack_done); ++ } ++ ++ // new tos = R3_RET ++ ++ // Get the message for the interpreter ++ __ li(msg, BytecodeInterpreter::method_resume); ++ ++ // And fall thru ++ ++ ++ //============================================================================= ++ // Restore caller's interpreter state and pass pointer to caller's ++ // new tos to caller. ++ ++ __ BIND(unwind_recursive_activation); ++ ++ // ++ // Registers alive ++ // R15_prev_state - address of caller's BytecodeInterpreter ++ // R3_RET - address of caller's tos ++ // msg - message for caller's BytecodeInterpreter ++ // R1_SP - callee's stack pointer ++ // ++ // Registers updated ++ // R14_state - address of caller's BytecodeInterpreter ++ // R15_prev_state - address of its parent or 0 ++ // ++ ++ // Pop callee's interpreter and set R14_state to caller's interpreter. ++ __ pop_interpreter_state(/*prev_state_may_be_0=*/false); ++ ++ // And fall thru ++ ++ ++ //============================================================================= ++ // Resume the (calling) interpreter after a call. ++ ++ __ BIND(resume_interpreter); ++ ++ // ++ // Registers alive ++ // R14_state - address of resuming BytecodeInterpreter ++ // R15_prev_state - address of its parent or 0 ++ // R3_RET - address of resuming tos ++ // msg - message for resuming interpreter ++ // R1_SP - callee's stack pointer ++ // ++ // Registers updated ++ // R1_SP - caller's stack pointer ++ // ++ ++ // Restore C stack pointer of caller (resuming interpreter), ++ // R14_state already points to the resuming BytecodeInterpreter. ++ __ pop_interpreter_frame_to_state(R14_state, R21_tmp1, R11_scratch1, R12_scratch2); ++ ++ // Store new address of tos (holding return value) in interpreter state. ++ __ std(R3_RET, state_(_stack)); ++ ++ // Store message for interpreter. ++ __ stw(msg, state_(_msg)); ++ ++ __ b(call_interpreter); ++ ++ //============================================================================= ++ // Interpreter returning to native code (call_stub/c1/c2) from ++ // initial activation. Convert stack result and unwind activation. ++ ++ __ BIND(return_to_initial_caller); ++ ++ // ++ // Registers alive ++ // R19_method - callee's Method ++ // R14_state - address of callee's interpreter state ++ // R16_thread - JavaThread ++ // R1_SP - callee's stack pointer ++ // ++ // Registers updated ++ // R3_RET/F1_RET - result in expected output register ++ // ++ ++ // If we have an exception pending we have no result and we ++ // must figure out where to really return to. ++ // ++ __ ld(pending_exception, thread_(pending_exception)); ++ __ cmpdi(CCR0, pending_exception, 0); ++ __ bne(CCR0, unwind_initial_activation_pending_exception); ++ ++ __ lwa(result_index, method_(result_index)); ++ ++ // Address of stub descriptor address array. ++ __ load_const(stub_addr, CppInterpreter::stack_result_to_native()); ++ ++ // Pass address of callee's tos + BytesPerWord. ++ // Will then point directly to result. ++ __ ld(R3_ARG1, state_(_stack)); ++ __ addi(R3_ARG1, R3_ARG1, Interpreter::stackElementSize); ++ ++ // Address of stub descriptor address ++ __ sldi(result_index, result_index, LogBytesPerWord); ++ __ add(stub_addr, stub_addr, result_index); ++ ++ // Stub descriptor address ++ __ ld(stub_addr, 0, stub_addr); ++ ++ // TODO: don't do this via a call, do it in place! ++ // ++ // call stub via descriptor ++ __ call_stub(stub_addr); ++ ++ __ BIND(unwind_initial_activation); ++ ++ // Unwind from initial activation. No exception is pending. ++ ++ // ++ // Stack layout at this point: ++ // ++ // 0 [TOP_IJAVA_FRAME_ABI] <-- R1_SP ++ // ... ++ // CALLER [PARENT_IJAVA_FRAME_ABI] ++ // ... ++ // CALLER [unextended ABI] ++ // ... ++ // ++ // The CALLER frame has a C2I adapter or is an entry-frame. ++ // ++ ++ // An interpreter frame exists, we may pop the TOP_IJAVA_FRAME and ++ // turn the caller's PARENT_IJAVA_FRAME back into a TOP_IJAVA_FRAME. ++ // But, we simply restore the return pc from the caller's frame and ++ // use the caller's initial_caller_sp as the new SP which pops the ++ // interpreter frame and "resizes" the caller's frame to its "unextended" ++ // size. ++ ++ // get rid of top frame ++ __ pop_frame(); ++ ++ // Load return PC from parent frame. ++ __ ld(R21_tmp1, _parent_ijava_frame_abi(lr), R1_SP); ++ ++ // Resize frame to get rid of a potential extension. ++ __ resize_frame_to_initial_caller(R11_scratch1, R12_scratch2); ++ ++ // update LR ++ __ mtlr(R21_tmp1); ++ ++ // return ++ __ blr(); ++ ++ //============================================================================= ++ // Unwind from initial activation. An exception is pending ++ ++ __ BIND(unwind_initial_activation_pending_exception); ++ ++ // ++ // Stack layout at this point: ++ // ++ // 0 [TOP_IJAVA_FRAME_ABI] <-- R1_SP ++ // ... ++ // CALLER [PARENT_IJAVA_FRAME_ABI] ++ // ... ++ // CALLER [unextended ABI] ++ // ... ++ // ++ // The CALLER frame has a C2I adapter or is an entry-frame. ++ // ++ ++ // An interpreter frame exists, we may pop the TOP_IJAVA_FRAME and ++ // turn the caller's PARENT_IJAVA_FRAME back into a TOP_IJAVA_FRAME. ++ // But, we just pop the current TOP_IJAVA_FRAME and fall through ++ ++ __ pop_frame(); ++ __ ld(R3_ARG1, _top_ijava_frame_abi(lr), R1_SP); ++ ++ // ++ // Stack layout at this point: ++ // ++ // CALLER [PARENT_IJAVA_FRAME_ABI] <-- R1_SP ++ // ... ++ // CALLER [unextended ABI] ++ // ... ++ // ++ // The CALLER frame has a C2I adapter or is an entry-frame. ++ // ++ // Registers alive ++ // R16_thread ++ // R3_ARG1 - return address to caller ++ // ++ // Registers updated ++ // R3_ARG1 - address of pending exception ++ // R4_ARG2 - issuing pc = return address to caller ++ // LR - address of exception handler stub ++ // ++ ++ // Resize frame to get rid of a potential extension. ++ __ resize_frame_to_initial_caller(R11_scratch1, R12_scratch2); ++ ++ __ mr(R14, R3_ARG1); // R14 := ARG1 ++ __ mr(R4_ARG2, R3_ARG1); // ARG2 := ARG1 ++ ++ // Find the address of the "catch_exception" stub. ++ __ push_frame_reg_args(0, R11_scratch1); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), ++ R16_thread, ++ R4_ARG2); ++ __ pop_frame(); ++ ++ // Load continuation address into LR. ++ __ mtlr(R3_RET); ++ ++ // Load address of pending exception and clear it in thread object. ++ __ ld(R3_ARG1/*R3_RET*/, thread_(pending_exception)); ++ __ li(R4_ARG2, 0); ++ __ std(R4_ARG2, thread_(pending_exception)); ++ ++ // re-load issuing pc ++ __ mr(R4_ARG2, R14); ++ ++ // Branch to found exception handler. ++ __ blr(); ++ ++ //============================================================================= ++ // Call a new method. Compute new args and trim the expression stack ++ // to only what we are currently using and then recurse. ++ ++ __ BIND(call_method); ++ ++ // ++ // Registers alive ++ // R16_thread ++ // R14_state - address of caller's BytecodeInterpreter ++ // R1_SP - caller's stack pointer ++ // ++ // Registers updated ++ // R15_prev_state - address of caller's BytecodeInterpreter ++ // R17_tos - address of caller's tos ++ // R19_method - callee's Method ++ // R1_SP - trimmed back ++ // ++ ++ // Very-local scratch registers. ++ ++ const Register offset = R21_tmp1; ++ const Register tmp = R22_tmp2; ++ const Register self_entry = R23_tmp3; ++ const Register stub_entry = R24_tmp4; ++ ++ const ConditionRegister cr = CCR0; ++ ++ // Load the address of the frame manager. ++ __ load_const(self_entry, &interpreter_frame_manager); ++ __ ld(self_entry, 0, self_entry); ++ ++ // Load BytecodeInterpreter._result._to_call._callee (callee's Method). ++ __ ld(R19_method, state_(_result._to_call._callee)); ++ // Load BytecodeInterpreter._stack (outgoing tos). ++ __ ld(R17_tos, state_(_stack)); ++ ++ // Save address of caller's BytecodeInterpreter. ++ __ mr(R15_prev_state, R14_state); ++ ++ // Load the callee's entry point. ++ // Load BytecodeInterpreter._result._to_call._callee_entry_point. ++ __ ld(stub_entry, state_(_result._to_call._callee_entry_point)); ++ ++ // Check whether stub_entry is equal to self_entry. ++ __ cmpd(cr, self_entry, stub_entry); ++ // if (self_entry == stub_entry) ++ // do a re-dispatch ++ __ beq(cr, re_dispatch); ++ // else ++ // call the specialized entry (adapter for jni or compiled code) ++ __ BIND(call_special); ++ ++ // ++ // Call the entry generated by `InterpreterGenerator::generate_native_entry'. ++ // ++ // Registers alive ++ // R16_thread ++ // R15_prev_state - address of caller's BytecodeInterpreter ++ // R19_method - callee's Method ++ // R17_tos - address of caller's tos ++ // R1_SP - caller's stack pointer ++ // ++ ++ // Mark return from specialized entry for generate_native_entry. ++ guarantee(return_from_native_pc != (address) NULL, "precondition"); ++ frame_manager_specialized_return = return_from_native_pc; ++ ++ // Set sender_SP in case we call interpreter native wrapper which ++ // will expect it. Compiled code should not care. ++ __ mr(R21_sender_SP, R1_SP); ++ ++ // Do a tail call here, and let the link register point to ++ // frame_manager_specialized_return which is return_from_native_pc. ++ __ load_const(tmp, frame_manager_specialized_return); ++ __ call_stub_and_return_to(stub_entry, tmp /* return_pc=tmp */); ++ ++ ++ //============================================================================= ++ // ++ // InterpretMethod triggered OSR compilation of some Java method M ++ // and now asks to run the compiled code. We call this code the ++ // `callee'. ++ // ++ // This is our current idea on how OSR should look like on PPC64: ++ // ++ // While interpreting a Java method M the stack is: ++ // ++ // (InterpretMethod (M), IJAVA_FRAME (M), ANY_FRAME, ...). ++ // ++ // After having OSR compiled M, `InterpretMethod' returns to the ++ // frame manager, sending the message `retry_method_osr'. The stack ++ // is: ++ // ++ // (IJAVA_FRAME (M), ANY_FRAME, ...). ++ // ++ // The compiler will have generated an `nmethod' suitable for ++ // continuing execution of M at the bytecode index at which OSR took ++ // place. So now the frame manager calls the OSR entry. The OSR ++ // entry sets up a JIT_FRAME for M and continues execution of M with ++ // initial state determined by the IJAVA_FRAME. ++ // ++ // (JIT_FRAME (M), IJAVA_FRAME (M), ANY_FRAME, ...). ++ // ++ ++ __ BIND(retry_method_osr); ++ { ++ // ++ // Registers alive ++ // R16_thread ++ // R15_prev_state - address of caller's BytecodeInterpreter ++ // R14_state - address of callee's BytecodeInterpreter ++ // R1_SP - callee's SP before call to InterpretMethod ++ // ++ // Registers updated ++ // R17 - pointer to callee's locals array ++ // (declared via `interpreter_arg_ptr_reg' in the AD file) ++ // R19_method - callee's Method ++ // R1_SP - callee's SP (will become SP of OSR adapter frame) ++ // ++ ++ // Provide a debugger breakpoint in the frame manager if breakpoints ++ // in osr'd methods are requested. ++#ifdef COMPILER2 ++ NOT_PRODUCT( if (OptoBreakpointOSR) { __ illtrap(); } ) ++#endif ++ ++ // Load callee's pointer to locals array from callee's state. ++ // __ ld(R17, state_(_locals)); ++ ++ // Load osr entry. ++ __ ld(R12_scratch2, state_(_result._osr._osr_entry)); ++ ++ // Load address of temporary osr buffer to arg1. ++ __ ld(R3_ARG1, state_(_result._osr._osr_buf)); ++ __ mtctr(R12_scratch2); ++ ++ // Load method, gc may move it during execution of osr'd method. ++ __ ld(R22_tmp2, state_(_method)); ++ // Load message 'call_method'. ++ __ li(R23_tmp3, BytecodeInterpreter::call_method); ++ ++ { ++ // Pop the IJAVA frame of the method which we are going to call osr'd. ++ Label no_state, skip_no_state; ++ __ pop_interpreter_state(/*prev_state_may_be_0=*/true); ++ __ cmpdi(CCR0, R14_state,0); ++ __ beq(CCR0, no_state); ++ // return to interpreter ++ __ pop_interpreter_frame_to_state(R14_state, R11_scratch1, R12_scratch2, R21_tmp1); ++ ++ // Init _result._to_call._callee and tell gc that it contains a valid oop ++ // by setting _msg to 'call_method'. ++ __ std(R22_tmp2, state_(_result._to_call._callee)); ++ // TODO: PPC port: assert(4 == BytecodeInterpreter::sz_msg(), "unexpected field size"); ++ __ stw(R23_tmp3, state_(_msg)); ++ ++ __ load_const(R21_tmp1, frame_manager_specialized_return); ++ __ b(skip_no_state); ++ __ bind(no_state); ++ ++ // Return to initial caller. ++ ++ // Get rid of top frame. ++ __ pop_frame(); ++ ++ // Load return PC from parent frame. ++ __ ld(R21_tmp1, _parent_ijava_frame_abi(lr), R1_SP); ++ ++ // Resize frame to get rid of a potential extension. ++ __ resize_frame_to_initial_caller(R11_scratch1, R12_scratch2); ++ ++ __ bind(skip_no_state); ++ ++ // Update LR with return pc. ++ __ mtlr(R21_tmp1); ++ } ++ // Jump to the osr entry point. ++ __ bctr(); ++ ++ } ++ ++ //============================================================================= ++ // Interpreted method "returned" with an exception, pass it on. ++ // Pass no result, unwind activation and continue/return to ++ // interpreter/call_stub/c2. ++ ++ __ BIND(throwing_exception); ++ ++ // Check if this is the initial invocation of the frame manager. If ++ // so, previous interpreter state in R15_prev_state will be null. ++ ++ // New tos of caller is callee's first parameter address, that is ++ // callee's incoming arguments are popped. ++ __ ld(R3_RET, state_(_locals)); ++ ++ // Check whether this is an initial call. ++ __ cmpdi(CCR0, R15_prev_state, 0); ++ // Yes, called from the call stub or from generated code via a c2i frame. ++ __ beq(CCR0, unwind_initial_activation_pending_exception); ++ ++ // Send resume message, interpreter will see the exception first. ++ ++ __ li(msg, BytecodeInterpreter::method_resume); ++ __ b(unwind_recursive_activation); ++ ++ ++ //============================================================================= ++ // Push the last instruction out to the code buffer. ++ ++ { ++ __ unimplemented("end of InterpreterGenerator::generate_normal_entry", 128); ++ } ++ ++ interpreter_frame_manager = entry; ++ return interpreter_frame_manager; ++} ++ ++// Generate code for various sorts of method entries ++// ++address AbstractInterpreterGenerator::generate_method_entry(AbstractInterpreter::MethodKind kind) { ++ address entry_point = NULL; ++ ++ switch (kind) { ++ case Interpreter::zerolocals : break; ++ case Interpreter::zerolocals_synchronized : break; ++ case Interpreter::native : // Fall thru ++ case Interpreter::native_synchronized : entry_point = ((CppInterpreterGenerator*)this)->generate_native_entry(); break; ++ case Interpreter::empty : break; ++ case Interpreter::accessor : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry(); break; ++ case Interpreter::abstract : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry(); break; ++ // These are special interpreter intrinsics which we don't support so far. ++ case Interpreter::java_lang_math_sin : break; ++ case Interpreter::java_lang_math_cos : break; ++ case Interpreter::java_lang_math_tan : break; ++ case Interpreter::java_lang_math_abs : break; ++ case Interpreter::java_lang_math_log : break; ++ case Interpreter::java_lang_math_log10 : break; ++ case Interpreter::java_lang_math_sqrt : break; ++ case Interpreter::java_lang_math_pow : break; ++ case Interpreter::java_lang_math_exp : break; ++ case Interpreter::java_lang_ref_reference_get: entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break; ++ default : ShouldNotReachHere(); break; ++ } ++ ++ if (entry_point) { ++ return entry_point; ++ } ++ return ((InterpreterGenerator*)this)->generate_normal_entry(); ++} ++ ++InterpreterGenerator::InterpreterGenerator(StubQueue* code) ++ : CppInterpreterGenerator(code) { ++ generate_all(); // down here so it can be "virtual" ++} ++ ++// How much stack a topmost interpreter method activation needs in words. ++int AbstractInterpreter::size_top_interpreter_activation(Method* method) { ++ // Computation is in bytes not words to match layout_activation_impl ++ // below, but the return is in words. ++ ++ // ++ // 0 [TOP_IJAVA_FRAME_ABI] \ ++ // alignment (optional) \ | ++ // [operand stack / Java parameters] > stack | | ++ // [monitors] (optional) > monitors | | ++ // [PARENT_IJAVA_FRAME_ABI] \ | | ++ // [BytecodeInterpreter object] > interpreter \ | | | ++ // alignment (optional) | round | parent | round | top ++ // [Java result] (2 slots) > result | | | | ++ // [Java non-arg locals] \ locals | | | | ++ // [arg locals] / / / / / ++ // ++ ++ int locals = method->max_locals() * BytesPerWord; ++ int interpreter = frame::interpreter_frame_cinterpreterstate_size_in_bytes(); ++ int result = 2 * BytesPerWord; ++ ++ int parent = round_to(interpreter + result + locals, 16) + frame::parent_ijava_frame_abi_size; ++ ++ int stack = method->max_stack() * BytesPerWord; ++ int monitors = method->is_synchronized() ? frame::interpreter_frame_monitor_size_in_bytes() : 0; ++ int top = round_to(parent + monitors + stack, 16) + frame::top_ijava_frame_abi_size; ++ ++ return (top / BytesPerWord); ++} ++ ++void BytecodeInterpreter::layout_interpreterState(interpreterState to_fill, ++ frame* caller, ++ frame* current, ++ Method* method, ++ intptr_t* locals, ++ intptr_t* stack, ++ intptr_t* stack_base, ++ intptr_t* monitor_base, ++ intptr_t* frame_sp, ++ bool is_top_frame) { ++ // What about any vtable? ++ // ++ to_fill->_thread = JavaThread::current(); ++ // This gets filled in later but make it something recognizable for now. ++ to_fill->_bcp = method->code_base(); ++ to_fill->_locals = locals; ++ to_fill->_constants = method->constants()->cache(); ++ to_fill->_method = method; ++ to_fill->_mdx = NULL; ++ to_fill->_stack = stack; ++ ++ if (is_top_frame && JavaThread::current()->popframe_forcing_deopt_reexecution()) { ++ to_fill->_msg = deopt_resume2; ++ } else { ++ to_fill->_msg = method_resume; ++ } ++ to_fill->_result._to_call._bcp_advance = 0; ++ to_fill->_result._to_call._callee_entry_point = NULL; // doesn't matter to anyone ++ to_fill->_result._to_call._callee = NULL; // doesn't matter to anyone ++ to_fill->_prev_link = NULL; ++ ++ if (caller->is_interpreted_frame()) { ++ interpreterState prev = caller->get_interpreterState(); ++ ++ // Support MH calls. Make sure the interpreter will return the right address: ++ // 1. Caller did ordinary interpreted->compiled call call: Set a prev_state ++ // which makes the CPP interpreter return to frame manager "return_from_interpreted_method" ++ // entry after finishing execution. ++ // 2. Caller did a MH call: If the caller has a MethodHandleInvoke in it's ++ // state (invariant: must be the caller of the bottom vframe) we used the ++ // "call_special" entry to do the call, meaning the arguments have not been ++ // popped from the stack. Therefore, don't enter a prev state in this case ++ // in order to return to "return_from_native" frame manager entry which takes ++ // care of popping arguments. Also, don't overwrite the MH.invoke Method in ++ // the prev_state in order to be able to figure out the number of arguments to ++ // pop. ++ // The parameter method can represent MethodHandle.invokeExact(...). ++ // The MethodHandleCompiler generates these synthetic Methods, ++ // including bytecodes, if an invokedynamic call gets inlined. In ++ // this case we want to return like from any other interpreted ++ // Java call, so we set _prev_link. ++ to_fill->_prev_link = prev; ++ ++ if (*prev->_bcp == Bytecodes::_invokeinterface || *prev->_bcp == Bytecodes::_invokedynamic) { ++ prev->_result._to_call._bcp_advance = 5; ++ } else { ++ prev->_result._to_call._bcp_advance = 3; ++ } ++ } ++ to_fill->_oop_temp = NULL; ++ to_fill->_stack_base = stack_base; ++ // Need +1 here because stack_base points to the word just above the ++ // first expr stack entry and stack_limit is supposed to point to ++ // the word just below the last expr stack entry. See ++ // generate_compute_interpreter_state. ++ to_fill->_stack_limit = stack_base - (method->max_stack() + 1); ++ to_fill->_monitor_base = (BasicObjectLock*) monitor_base; ++ ++ to_fill->_frame_bottom = frame_sp; ++ ++ // PPC64 specific ++ to_fill->_last_Java_pc = NULL; ++ to_fill->_last_Java_fp = NULL; ++ to_fill->_last_Java_sp = frame_sp; ++#ifdef ASSERT ++ to_fill->_self_link = to_fill; ++ to_fill->_native_fresult = 123456.789; ++ to_fill->_native_lresult = CONST64(0xdeafcafedeadc0de); ++#endif ++} ++ ++void BytecodeInterpreter::pd_layout_interpreterState(interpreterState istate, ++ address last_Java_pc, ++ intptr_t* last_Java_fp) { ++ istate->_last_Java_pc = last_Java_pc; ++ istate->_last_Java_fp = last_Java_fp; ++} ++ ++// Computes monitor_size and top_frame_size in bytes. ++static void frame_size_helper(int max_stack, ++ int monitors, ++ int& monitor_size, ++ int& top_frame_size) { ++ monitor_size = frame::interpreter_frame_monitor_size_in_bytes() * monitors; ++ top_frame_size = round_to(frame::interpreter_frame_cinterpreterstate_size_in_bytes() ++ + monitor_size ++ + max_stack * Interpreter::stackElementSize ++ + 2 * Interpreter::stackElementSize, ++ frame::alignment_in_bytes) ++ + frame::top_ijava_frame_abi_size; ++} ++ ++// Returns number of stackElementWords needed for the interpreter frame with the ++// given sections. ++int AbstractInterpreter::size_activation(int max_stack, ++ int temps, ++ int extra_args, ++ int monitors, ++ int callee_params, ++ int callee_locals, ++ bool is_top_frame) { ++ int monitor_size = 0; ++ int top_frame_size = 0; ++ frame_size_helper(max_stack, monitors, monitor_size, top_frame_size); ++ ++ int frame_size; ++ if (is_top_frame) { ++ frame_size = top_frame_size; ++ } else { ++ frame_size = round_to(frame::interpreter_frame_cinterpreterstate_size_in_bytes() ++ + monitor_size ++ + (temps - callee_params + callee_locals) * Interpreter::stackElementSize ++ + 2 * Interpreter::stackElementSize, ++ frame::alignment_in_bytes) ++ + frame::parent_ijava_frame_abi_size; ++ assert(extra_args == 0, "non-zero for top_frame only"); ++ } ++ ++ return frame_size / Interpreter::stackElementSize; ++} ++ ++void AbstractInterpreter::layout_activation(Method* method, ++ int temps, // Number of slots on java expression stack in use. ++ int popframe_args, ++ int monitors, // Number of active monitors. ++ int caller_actual_parameters, ++ int callee_params,// Number of slots for callee parameters. ++ int callee_locals,// Number of slots for locals. ++ frame* caller, ++ frame* interpreter_frame, ++ bool is_top_frame, ++ bool is_bottom_frame) { ++ ++ // NOTE this code must exactly mimic what ++ // InterpreterGenerator::generate_compute_interpreter_state() does ++ // as far as allocating an interpreter frame. However there is an ++ // exception. With the C++ based interpreter only the top most frame ++ // has a full sized expression stack. The 16 byte slop factor is ++ // both the abi scratch area and a place to hold a result from a ++ // callee on its way to the callers stack. ++ ++ int monitor_size = 0; ++ int top_frame_size = 0; ++ frame_size_helper(method->max_stack(), monitors, monitor_size, top_frame_size); ++ ++ intptr_t sp = (intptr_t)interpreter_frame->sp(); ++ intptr_t fp = *(intptr_t *)sp; ++ assert(fp == (intptr_t)caller->sp(), "fp must match"); ++ interpreterState cur_state = ++ (interpreterState)(fp - frame::interpreter_frame_cinterpreterstate_size_in_bytes()); ++ ++ // Now fill in the interpreterState object. ++ ++ intptr_t* locals; ++ if (caller->is_interpreted_frame()) { ++ // Locals must agree with the caller because it will be used to set the ++ // caller's tos when we return. ++ interpreterState prev = caller->get_interpreterState(); ++ // Calculate start of "locals" for MH calls. For MH calls, the ++ // current method() (= MH target) and prev->callee() (= ++ // MH.invoke*()) are different and especially have different ++ // signatures. To pop the argumentsof the caller, we must use ++ // the prev->callee()->size_of_arguments() because that's what ++ // the caller actually pushed. Currently, for synthetic MH ++ // calls (deoptimized from inlined MH calls), detected by ++ // is_method_handle_invoke(), we use the callee's arguments ++ // because here, the caller's and callee's signature match. ++ if (true /*!caller->is_at_mh_callsite()*/) { ++ locals = prev->stack() + method->size_of_parameters(); ++ } else { ++ // Normal MH call. ++ locals = prev->stack() + prev->callee()->size_of_parameters(); ++ } ++ } else { ++ bool is_deopted; ++ locals = (intptr_t*) (fp + ((method->max_locals() - 1) * BytesPerWord) + ++ frame::parent_ijava_frame_abi_size); ++ } ++ ++ intptr_t* monitor_base = (intptr_t*) cur_state; ++ intptr_t* stack_base = (intptr_t*) ((intptr_t) monitor_base - monitor_size); ++ ++ // Provide pop_frame capability on PPC64, add popframe_args. ++ // +1 because stack is always prepushed. ++ intptr_t* stack = (intptr_t*) ((intptr_t) stack_base - (temps + popframe_args + 1) * BytesPerWord); ++ ++ BytecodeInterpreter::layout_interpreterState(cur_state, ++ caller, ++ interpreter_frame, ++ method, ++ locals, ++ stack, ++ stack_base, ++ monitor_base, ++ (intptr_t*)(((intptr_t)fp) - top_frame_size), ++ is_top_frame); ++ ++ BytecodeInterpreter::pd_layout_interpreterState(cur_state, interpreter_return_address, ++ interpreter_frame->fp()); ++} ++ ++#endif // CC_INTERP +--- ./hotspot/src/cpu/ppc/vm/cppInterpreter_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/cppInterpreter_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_CPPINTERPRETER_PPC_HPP ++#define CPU_PPC_VM_CPPINTERPRETER_PPC_HPP ++ ++ protected: ++ ++ // Size of interpreter code. Increase if too small. Interpreter will ++ // fail with a guarantee ("not enough space for interpreter generation"); ++ // if too small. ++ // Run with +PrintInterpreter to get the VM to print out the size. ++ // Max size with JVMTI ++ ++ const static int InterpreterCodeSize = 12*K; ++ ++#endif // CPU_PPC_VM_CPPINTERPRETER_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/debug_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/debug_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "code/codeCache.hpp" ++#include "code/nmethod.hpp" ++#include "runtime/frame.hpp" ++#include "runtime/init.hpp" ++#include "runtime/os.hpp" ++#include "utilities/debug.hpp" ++#include "utilities/top.hpp" ++ ++void pd_ps(frame f) {} +--- ./hotspot/src/cpu/ppc/vm/depChecker_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/depChecker_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,31 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_DEPCHECKER_PPC_HPP ++#define CPU_PPC_VM_DEPCHECKER_PPC_HPP ++ ++// Nothing to do on ppc64 ++ ++#endif // CPU_PPC_VM_DEPCHECKER_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/disassembler_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/disassembler_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_DISASSEMBLER_PPC_HPP ++#define CPU_PPC_VM_DISASSEMBLER_PPC_HPP ++ ++ static int pd_instruction_alignment() { ++ return sizeof(int); ++ } ++ ++ static const char* pd_cpu_opts() { ++ return "ppc64"; ++ } ++ ++#endif // CPU_PPC_VM_DISASSEMBLER_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/frame_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/frame_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,320 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "interpreter/interpreter.hpp" ++#include "memory/resourceArea.hpp" ++#include "oops/markOop.hpp" ++#include "oops/method.hpp" ++#include "oops/oop.inline.hpp" ++#include "runtime/frame.inline.hpp" ++#include "runtime/handles.inline.hpp" ++#include "runtime/javaCalls.hpp" ++#include "runtime/monitorChunk.hpp" ++#include "runtime/signature.hpp" ++#include "runtime/stubCodeGenerator.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "vmreg_ppc.inline.hpp" ++#ifdef COMPILER1 ++#include "c1/c1_Runtime1.hpp" ++#include "runtime/vframeArray.hpp" ++#endif ++ ++#ifdef ASSERT ++void RegisterMap::check_location_valid() { ++} ++#endif // ASSERT ++ ++bool frame::safe_for_sender(JavaThread *thread) { ++ bool safe = false; ++ address cursp = (address)sp(); ++ address curfp = (address)fp(); ++ if ((cursp != NULL && curfp != NULL && ++ (cursp <= thread->stack_base() && cursp >= thread->stack_base() - thread->stack_size())) && ++ (curfp <= thread->stack_base() && curfp >= thread->stack_base() - thread->stack_size())) { ++ safe = true; ++ } ++ return safe; ++} ++ ++bool frame::is_interpreted_frame() const { ++ return Interpreter::contains(pc()); ++} ++ ++frame frame::sender_for_entry_frame(RegisterMap *map) const { ++ assert(map != NULL, "map must be set"); ++ // Java frame called from C; skip all C frames and return top C ++ // frame of that chunk as the sender. ++ JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor(); ++ assert(!entry_frame_is_first(), "next Java fp must be non zero"); ++ assert(jfa->last_Java_sp() > _sp, "must be above this frame on stack"); ++ map->clear(); ++ assert(map->include_argument_oops(), "should be set by clear"); ++ ++ if (jfa->last_Java_pc() != NULL) { ++ frame fr(jfa->last_Java_sp(), jfa->last_Java_pc()); ++ return fr; ++ } ++ // Last_java_pc is not set, if we come here from compiled code. The ++ // constructor retrieves the PC from the stack. ++ frame fr(jfa->last_Java_sp()); ++ return fr; ++} ++ ++frame frame::sender_for_interpreter_frame(RegisterMap *map) const { ++ // Pass callers initial_caller_sp as unextended_sp. ++ return frame(sender_sp(), sender_pc(), ++ CC_INTERP_ONLY((intptr_t*)((parent_ijava_frame_abi *)callers_abi())->initial_caller_sp) ++ NOT_CC_INTERP((intptr_t*)get_ijava_state()->sender_sp) ++ ); ++} ++ ++frame frame::sender_for_compiled_frame(RegisterMap *map) const { ++ assert(map != NULL, "map must be set"); ++ ++ // Frame owned by compiler. ++ address pc = *compiled_sender_pc_addr(_cb); ++ frame caller(compiled_sender_sp(_cb), pc); ++ ++ // Now adjust the map. ++ ++ // Get the rest. ++ if (map->update_map()) { ++ // Tell GC to use argument oopmaps for some runtime stubs that need it. ++ map->set_include_argument_oops(_cb->caller_must_gc_arguments(map->thread())); ++ if (_cb->oop_maps() != NULL) { ++ OopMapSet::update_register_map(this, map); ++ } ++ } ++ ++ return caller; ++} ++ ++intptr_t* frame::compiled_sender_sp(CodeBlob* cb) const { ++ return sender_sp(); ++} ++ ++address* frame::compiled_sender_pc_addr(CodeBlob* cb) const { ++ return sender_pc_addr(); ++} ++ ++frame frame::sender(RegisterMap* map) const { ++ // Default is we do have to follow them. The sender_for_xxx will ++ // update it accordingly. ++ map->set_include_argument_oops(false); ++ ++ if (is_entry_frame()) return sender_for_entry_frame(map); ++ if (is_interpreted_frame()) return sender_for_interpreter_frame(map); ++ assert(_cb == CodeCache::find_blob(pc()),"Must be the same"); ++ ++ if (_cb != NULL) { ++ return sender_for_compiled_frame(map); ++ } ++ // Must be native-compiled frame, i.e. the marshaling code for native ++ // methods that exists in the core system. ++ return frame(sender_sp(), sender_pc()); ++} ++ ++void frame::patch_pc(Thread* thread, address pc) { ++ if (TracePcPatching) { ++ tty->print_cr("patch_pc at address " PTR_FORMAT " [" PTR_FORMAT " -> " PTR_FORMAT "]", ++ &((address*) _sp)[-1], ((address*) _sp)[-1], pc); ++ } ++ own_abi()->lr = (uint64_t)pc; ++ _cb = CodeCache::find_blob(pc); ++ if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) { ++ address orig = (((nmethod*)_cb)->get_original_pc(this)); ++ assert(orig == _pc, "expected original to be stored before patching"); ++ _deopt_state = is_deoptimized; ++ // Leave _pc as is. ++ } else { ++ _deopt_state = not_deoptimized; ++ _pc = pc; ++ } ++} ++ ++void frame::pd_gc_epilog() { ++ if (is_interpreted_frame()) { ++ // Set constant pool cache entry for interpreter. ++ Method* m = interpreter_frame_method(); ++ ++ *interpreter_frame_cpoolcache_addr() = m->constants()->cache(); ++ } ++} ++ ++bool frame::is_interpreted_frame_valid(JavaThread* thread) const { ++ // Is there anything to do? ++ assert(is_interpreted_frame(), "Not an interpreted frame"); ++ return true; ++} ++ ++BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) { ++ assert(is_interpreted_frame(), "interpreted frame expected"); ++ Method* method = interpreter_frame_method(); ++ BasicType type = method->result_type(); ++ ++ if (method->is_native()) { ++ // Prior to calling into the runtime to notify the method exit the possible ++ // result value is saved into the interpreter frame. ++#ifdef CC_INTERP ++ interpreterState istate = get_interpreterState(); ++ address lresult = (address)istate + in_bytes(BytecodeInterpreter::native_lresult_offset()); ++ address fresult = (address)istate + in_bytes(BytecodeInterpreter::native_fresult_offset()); ++#else ++ address lresult = (address)&(get_ijava_state()->lresult); ++ address fresult = (address)&(get_ijava_state()->fresult); ++#endif ++ ++ switch (method->result_type()) { ++ case T_OBJECT: ++ case T_ARRAY: { ++ oop* obj_p = *(oop**)lresult; ++ oop obj = (obj_p == NULL) ? (oop)NULL : *obj_p; ++ assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check"); ++ *oop_result = obj; ++ break; ++ } ++ // We use std/stfd to store the values. ++ case T_BOOLEAN : value_result->z = (jboolean) *(unsigned long*)lresult; break; ++ case T_INT : value_result->i = (jint) *(long*)lresult; break; ++ case T_CHAR : value_result->c = (jchar) *(unsigned long*)lresult; break; ++ case T_SHORT : value_result->s = (jshort) *(long*)lresult; break; ++ case T_BYTE : value_result->z = (jbyte) *(long*)lresult; break; ++ case T_LONG : value_result->j = (jlong) *(long*)lresult; break; ++ case T_FLOAT : value_result->f = (jfloat) *(double*)fresult; break; ++ case T_DOUBLE : value_result->d = (jdouble) *(double*)fresult; break; ++ case T_VOID : /* Nothing to do */ break; ++ default : ShouldNotReachHere(); ++ } ++ } else { ++ intptr_t* tos_addr = interpreter_frame_tos_address(); ++ switch (method->result_type()) { ++ case T_OBJECT: ++ case T_ARRAY: { ++ oop obj = *(oop*)tos_addr; ++ assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check"); ++ *oop_result = obj; ++ } ++ case T_BOOLEAN : value_result->z = (jboolean) *(jint*)tos_addr; break; ++ case T_BYTE : value_result->b = (jbyte) *(jint*)tos_addr; break; ++ case T_CHAR : value_result->c = (jchar) *(jint*)tos_addr; break; ++ case T_SHORT : value_result->s = (jshort) *(jint*)tos_addr; break; ++ case T_INT : value_result->i = *(jint*)tos_addr; break; ++ case T_LONG : value_result->j = *(jlong*)tos_addr; break; ++ case T_FLOAT : value_result->f = *(jfloat*)tos_addr; break; ++ case T_DOUBLE : value_result->d = *(jdouble*)tos_addr; break; ++ case T_VOID : /* Nothing to do */ break; ++ default : ShouldNotReachHere(); ++ } ++ } ++ return type; ++} ++ ++#ifndef PRODUCT ++ ++void frame::describe_pd(FrameValues& values, int frame_no) { ++ if (is_interpreted_frame()) { ++#ifdef CC_INTERP ++ interpreterState istate = get_interpreterState(); ++ values.describe(frame_no, (intptr_t*)istate, "istate"); ++ values.describe(frame_no, (intptr_t*)&(istate->_thread), " thread"); ++ values.describe(frame_no, (intptr_t*)&(istate->_bcp), " bcp"); ++ values.describe(frame_no, (intptr_t*)&(istate->_locals), " locals"); ++ values.describe(frame_no, (intptr_t*)&(istate->_constants), " constants"); ++ values.describe(frame_no, (intptr_t*)&(istate->_method), err_msg(" method = %s", istate->_method->name_and_sig_as_C_string())); ++ values.describe(frame_no, (intptr_t*)&(istate->_mdx), " mdx"); ++ values.describe(frame_no, (intptr_t*)&(istate->_stack), " stack"); ++ values.describe(frame_no, (intptr_t*)&(istate->_msg), err_msg(" msg = %s", BytecodeInterpreter::C_msg(istate->_msg))); ++ values.describe(frame_no, (intptr_t*)&(istate->_result), " result"); ++ values.describe(frame_no, (intptr_t*)&(istate->_prev_link), " prev_link"); ++ values.describe(frame_no, (intptr_t*)&(istate->_oop_temp), " oop_temp"); ++ values.describe(frame_no, (intptr_t*)&(istate->_stack_base), " stack_base"); ++ values.describe(frame_no, (intptr_t*)&(istate->_stack_limit), " stack_limit"); ++ values.describe(frame_no, (intptr_t*)&(istate->_monitor_base), " monitor_base"); ++ values.describe(frame_no, (intptr_t*)&(istate->_frame_bottom), " frame_bottom"); ++ values.describe(frame_no, (intptr_t*)&(istate->_last_Java_pc), " last_Java_pc"); ++ values.describe(frame_no, (intptr_t*)&(istate->_last_Java_fp), " last_Java_fp"); ++ values.describe(frame_no, (intptr_t*)&(istate->_last_Java_sp), " last_Java_sp"); ++ values.describe(frame_no, (intptr_t*)&(istate->_self_link), " self_link"); ++ values.describe(frame_no, (intptr_t*)&(istate->_native_fresult), " native_fresult"); ++ values.describe(frame_no, (intptr_t*)&(istate->_native_lresult), " native_lresult"); ++#else ++#define DESCRIBE_ADDRESS(name) \ ++ values.describe(frame_no, (intptr_t*)&(get_ijava_state()->name), #name); ++ ++ DESCRIBE_ADDRESS(method); ++ DESCRIBE_ADDRESS(locals); ++ DESCRIBE_ADDRESS(monitors); ++ DESCRIBE_ADDRESS(cpoolCache); ++ DESCRIBE_ADDRESS(bcp); ++ DESCRIBE_ADDRESS(esp); ++ DESCRIBE_ADDRESS(mdx); ++ DESCRIBE_ADDRESS(top_frame_sp); ++ DESCRIBE_ADDRESS(sender_sp); ++ DESCRIBE_ADDRESS(oop_tmp); ++ DESCRIBE_ADDRESS(lresult); ++ DESCRIBE_ADDRESS(fresult); ++#endif ++ } ++} ++#endif ++ ++void frame::adjust_unextended_sp() { ++ // If we are returning to a compiled MethodHandle call site, the ++ // saved_fp will in fact be a saved value of the unextended SP. The ++ // simplest way to tell whether we are returning to such a call site ++ // is as follows: ++ ++ if (is_compiled_frame() && false /*is_at_mh_callsite()*/) { // TODO PPC port ++ // If the sender PC is a deoptimization point, get the original ++ // PC. For MethodHandle call site the unextended_sp is stored in ++ // saved_fp. ++ _unextended_sp = _fp - _cb->frame_size(); ++ ++#ifdef ASSERT ++ nmethod *sender_nm = _cb->as_nmethod_or_null(); ++ assert(sender_nm && *_sp == *_unextended_sp, "backlink changed"); ++ ++ intptr_t* sp = _unextended_sp; // check if stack can be walked from here ++ for (int x = 0; x < 5; ++x) { // check up to a couple of backlinks ++ intptr_t* prev_sp = *(intptr_t**)sp; ++ if (prev_sp == 0) break; // end of stack ++ assert(prev_sp>sp, "broken stack"); ++ sp = prev_sp; ++ } ++ ++ if (sender_nm->is_deopt_mh_entry(_pc)) { // checks for deoptimization ++ address original_pc = sender_nm->get_original_pc(this); ++ assert(sender_nm->insts_contains(original_pc), "original PC must be in nmethod"); ++ assert(sender_nm->is_method_handle_return(original_pc), "must be"); ++ } ++#endif ++ } ++} ++ ++intptr_t *frame::initial_deoptimization_info() { ++ // unused... but returns fp() to minimize changes introduced by 7087445 ++ return fp(); ++} +--- ./hotspot/src/cpu/ppc/vm/frame_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/frame_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,534 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_FRAME_PPC_HPP ++#define CPU_PPC_VM_FRAME_PPC_HPP ++ ++#include "runtime/synchronizer.hpp" ++#include "utilities/top.hpp" ++ ++ // C frame layout on PPC-64. ++ // ++ // In this figure the stack grows upwards, while memory grows ++ // downwards. See "64-bit PowerPC ELF ABI Supplement Version 1.7", ++ // IBM Corp. (2003-10-29) ++ // (http://math-atlas.sourceforge.net/devel/assembly/PPC-elf64abi-1.7.pdf). ++ // ++ // Square brackets denote stack regions possibly larger ++ // than a single 64 bit slot. ++ // ++ // STACK: ++ // 0 [C_FRAME] <-- SP after prolog (mod 16 = 0) ++ // [C_FRAME] <-- SP before prolog ++ // ... ++ // [C_FRAME] ++ // ++ // C_FRAME: ++ // 0 [ABI_REG_ARGS] ++ // 112 CARG_9: outgoing arg 9 (arg_1 ... arg_8 via gpr_3 ... gpr_{10}) ++ // ... ++ // 40+M*8 CARG_M: outgoing arg M (M is the maximum of outgoing args taken over all call sites in the procedure) ++ // local 1 ++ // ... ++ // local N ++ // spill slot for vector reg (16 bytes aligned) ++ // ... ++ // spill slot for vector reg ++ // alignment (4 or 12 bytes) ++ // V SR_VRSAVE ++ // V+4 spill slot for GR ++ // ... ... ++ // spill slot for GR ++ // spill slot for FR ++ // ... ++ // spill slot for FR ++ // ++ // ABI_48: ++ // 0 caller's SP ++ // 8 space for condition register (CR) for next call ++ // 16 space for link register (LR) for next call ++ // 24 reserved ++ // 32 reserved ++ // 40 space for TOC (=R2) register for next call ++ // ++ // ABI_REG_ARGS: ++ // 0 [ABI_48] ++ // 48 CARG_1: spill slot for outgoing arg 1. used by next callee. ++ // ... ... ++ // 104 CARG_8: spill slot for outgoing arg 8. used by next callee. ++ // ++ ++ public: ++ ++ // C frame layout ++ ++ enum { ++ // stack alignment ++ alignment_in_bytes = 16, ++ // log_2(16*8 bits) = 7. ++ log_2_of_alignment_in_bits = 7 ++ }; ++ ++ // ABI_MINFRAME: ++ struct abi_minframe { ++ uint64_t callers_sp; ++ uint64_t cr; //_16 ++ uint64_t lr; ++#if !defined(ABI_ELFv2) ++ uint64_t reserved1; //_16 ++ uint64_t reserved2; ++#endif ++ uint64_t toc; //_16 ++ // nothing to add here! ++ // aligned to frame::alignment_in_bytes (16) ++ }; ++ ++ enum { ++ abi_minframe_size = sizeof(abi_minframe) ++ }; ++ ++ struct abi_reg_args : abi_minframe { ++ uint64_t carg_1; ++ uint64_t carg_2; //_16 ++ uint64_t carg_3; ++ uint64_t carg_4; //_16 ++ uint64_t carg_5; ++ uint64_t carg_6; //_16 ++ uint64_t carg_7; ++ uint64_t carg_8; //_16 ++ // aligned to frame::alignment_in_bytes (16) ++ }; ++ ++ enum { ++ abi_reg_args_size = sizeof(abi_reg_args) ++ }; ++ ++ #define _abi(_component) \ ++ (offset_of(frame::abi_reg_args, _component)) ++ ++ struct abi_reg_args_spill : abi_reg_args { ++ // additional spill slots ++ uint64_t spill_ret; ++ uint64_t spill_fret; //_16 ++ // aligned to frame::alignment_in_bytes (16) ++ }; ++ ++ enum { ++ abi_reg_args_spill_size = sizeof(abi_reg_args_spill) ++ }; ++ ++ #define _abi_reg_args_spill(_component) \ ++ (offset_of(frame::abi_reg_args_spill, _component)) ++ ++ // non-volatile GPRs: ++ ++ struct spill_nonvolatiles { ++ uint64_t r14; ++ uint64_t r15; //_16 ++ uint64_t r16; ++ uint64_t r17; //_16 ++ uint64_t r18; ++ uint64_t r19; //_16 ++ uint64_t r20; ++ uint64_t r21; //_16 ++ uint64_t r22; ++ uint64_t r23; //_16 ++ uint64_t r24; ++ uint64_t r25; //_16 ++ uint64_t r26; ++ uint64_t r27; //_16 ++ uint64_t r28; ++ uint64_t r29; //_16 ++ uint64_t r30; ++ uint64_t r31; //_16 ++ ++ double f14; ++ double f15; ++ double f16; ++ double f17; ++ double f18; ++ double f19; ++ double f20; ++ double f21; ++ double f22; ++ double f23; ++ double f24; ++ double f25; ++ double f26; ++ double f27; ++ double f28; ++ double f29; ++ double f30; ++ double f31; ++ ++ // aligned to frame::alignment_in_bytes (16) ++ }; ++ ++ enum { ++ spill_nonvolatiles_size = sizeof(spill_nonvolatiles) ++ }; ++ ++ #define _spill_nonvolatiles_neg(_component) \ ++ (int)(-frame::spill_nonvolatiles_size + offset_of(frame::spill_nonvolatiles, _component)) ++ ++ ++ ++#ifndef CC_INTERP ++ // Frame layout for the Java template interpreter on PPC64. ++ // ++ // Diffs to the CC_INTERP are marked with 'X'. ++ // ++ // TOP_IJAVA_FRAME: ++ // ++ // 0 [TOP_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [operand stack] ++ // [monitors] (optional) ++ // X[IJAVA_STATE] ++ // note: own locals are located in the caller frame. ++ // ++ // PARENT_IJAVA_FRAME: ++ // ++ // 0 [PARENT_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [callee's Java result] ++ // [callee's locals w/o arguments] ++ // [outgoing arguments] ++ // [used part of operand stack w/o arguments] ++ // [monitors] (optional) ++ // X[IJAVA_STATE] ++ // ++ ++ struct parent_ijava_frame_abi : abi_minframe { ++ }; ++ ++ enum { ++ parent_ijava_frame_abi_size = sizeof(parent_ijava_frame_abi) ++ }; ++ ++#define _parent_ijava_frame_abi(_component) \ ++ (offset_of(frame::parent_ijava_frame_abi, _component)) ++ ++ struct top_ijava_frame_abi : abi_reg_args { ++ }; ++ ++ enum { ++ top_ijava_frame_abi_size = sizeof(top_ijava_frame_abi) ++ }; ++ ++#define _top_ijava_frame_abi(_component) \ ++ (offset_of(frame::top_ijava_frame_abi, _component)) ++ ++ struct ijava_state { ++#ifdef ASSERT ++ uint64_t ijava_reserved; // Used for assertion. ++ uint64_t ijava_reserved2; // Inserted for alignment. ++#endif ++ uint64_t method; ++ uint64_t locals; ++ uint64_t monitors; ++ uint64_t cpoolCache; ++ uint64_t bcp; ++ uint64_t esp; ++ uint64_t mdx; ++ uint64_t top_frame_sp; // Maybe define parent_frame_abi and move there. ++ uint64_t sender_sp; ++ // Slots only needed for native calls. Maybe better to move elsewhere. ++ uint64_t oop_tmp; ++ uint64_t lresult; ++ uint64_t fresult; ++ // Aligned to frame::alignment_in_bytes (16). ++ }; ++ ++ enum { ++ ijava_state_size = sizeof(ijava_state) ++ }; ++ ++#define _ijava_state_neg(_component) \ ++ (int) (-frame::ijava_state_size + offset_of(frame::ijava_state, _component)) ++ ++#else // CC_INTERP: ++ ++ // Frame layout for the Java C++ interpreter on PPC64. ++ // ++ // This frame layout provides a C-like frame for every Java frame. ++ // ++ // In these figures the stack grows upwards, while memory grows ++ // downwards. Square brackets denote regions possibly larger than ++ // single 64 bit slots. ++ // ++ // STACK (no JNI, no compiled code, no library calls, ++ // interpreter-loop is active): ++ // 0 [InterpretMethod] ++ // [TOP_IJAVA_FRAME] ++ // [PARENT_IJAVA_FRAME] ++ // ... ++ // [PARENT_IJAVA_FRAME] ++ // [ENTRY_FRAME] ++ // [C_FRAME] ++ // ... ++ // [C_FRAME] ++ // ++ // TOP_IJAVA_FRAME: ++ // 0 [TOP_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [operand stack] ++ // [monitors] (optional) ++ // [cInterpreter object] ++ // result, locals, and arguments are in parent frame! ++ // ++ // PARENT_IJAVA_FRAME: ++ // 0 [PARENT_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [callee's Java result] ++ // [callee's locals w/o arguments] ++ // [outgoing arguments] ++ // [used part of operand stack w/o arguments] ++ // [monitors] (optional) ++ // [cInterpreter object] ++ // ++ // ENTRY_FRAME: ++ // 0 [PARENT_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [callee's Java result] ++ // [callee's locals w/o arguments] ++ // [outgoing arguments] ++ // [ENTRY_FRAME_LOCALS] ++ // ++ // PARENT_IJAVA_FRAME_ABI: ++ // 0 [ABI_MINFRAME] ++ // top_frame_sp ++ // initial_caller_sp ++ // ++ // TOP_IJAVA_FRAME_ABI: ++ // 0 [PARENT_IJAVA_FRAME_ABI] ++ // carg_3_unused ++ // carg_4_unused ++ // carg_5_unused ++ // carg_6_unused ++ // carg_7_unused ++ // frame_manager_lr ++ // ++ ++ // PARENT_IJAVA_FRAME_ABI ++ ++ struct parent_ijava_frame_abi : abi_minframe { ++ // SOE registers. ++ // C2i adapters spill their top-frame stack-pointer here. ++ uint64_t top_frame_sp; // carg_1 ++ // Sp of calling compiled frame before it was resized by the c2i ++ // adapter or sp of call stub. Does not contain a valid value for ++ // non-initial frames. ++ uint64_t initial_caller_sp; // carg_2 ++ // aligned to frame::alignment_in_bytes (16) ++ }; ++ ++ enum { ++ parent_ijava_frame_abi_size = sizeof(parent_ijava_frame_abi) ++ }; ++ ++ #define _parent_ijava_frame_abi(_component) \ ++ (offset_of(frame::parent_ijava_frame_abi, _component)) ++ ++ // TOP_IJAVA_FRAME_ABI ++ ++ struct top_ijava_frame_abi : parent_ijava_frame_abi { ++ uint64_t carg_3_unused; // carg_3 ++ uint64_t card_4_unused; //_16 carg_4 ++ uint64_t carg_5_unused; // carg_5 ++ uint64_t carg_6_unused; //_16 carg_6 ++ uint64_t carg_7_unused; // carg_7 ++ // Use arg8 for storing frame_manager_lr. The size of ++ // top_ijava_frame_abi must match abi_reg_args. ++ uint64_t frame_manager_lr; //_16 carg_8 ++ // nothing to add here! ++ // aligned to frame::alignment_in_bytes (16) ++ }; ++ ++ enum { ++ top_ijava_frame_abi_size = sizeof(top_ijava_frame_abi) ++ }; ++ ++ #define _top_ijava_frame_abi(_component) \ ++ (offset_of(frame::top_ijava_frame_abi, _component)) ++ ++#endif // CC_INTERP ++ ++ // ENTRY_FRAME ++ ++ struct entry_frame_locals { ++ uint64_t call_wrapper_address; ++ uint64_t result_address; //_16 ++ uint64_t result_type; ++ uint64_t arguments_tos_address; //_16 ++ // aligned to frame::alignment_in_bytes (16) ++ uint64_t r[spill_nonvolatiles_size/sizeof(uint64_t)]; ++ }; ++ ++ enum { ++ entry_frame_locals_size = sizeof(entry_frame_locals) ++ }; ++ ++ #define _entry_frame_locals_neg(_component) \ ++ (int)(-frame::entry_frame_locals_size + offset_of(frame::entry_frame_locals, _component)) ++ ++ ++ // Frame layout for JIT generated methods ++ // ++ // In these figures the stack grows upwards, while memory grows ++ // downwards. Square brackets denote regions possibly larger than single ++ // 64 bit slots. ++ // ++ // STACK (interpreted Java calls JIT generated Java): ++ // [JIT_FRAME] <-- SP (mod 16 = 0) ++ // [TOP_IJAVA_FRAME] ++ // ... ++ // ++ // JIT_FRAME (is a C frame according to PPC-64 ABI): ++ // [out_preserve] ++ // [out_args] ++ // [spills] ++ // [pad_1] ++ // [monitor] (optional) ++ // ... ++ // [monitor] (optional) ++ // [pad_2] ++ // [in_preserve] added / removed by prolog / epilog ++ // ++ ++ // JIT_ABI (TOP and PARENT) ++ ++ struct jit_abi { ++ uint64_t callers_sp; ++ uint64_t cr; ++ uint64_t lr; ++ uint64_t toc; ++ // Nothing to add here! ++ // NOT ALIGNED to frame::alignment_in_bytes (16). ++ }; ++ ++ struct jit_out_preserve : jit_abi { ++ // Nothing to add here! ++ }; ++ ++ struct jit_in_preserve { ++ // Nothing to add here! ++ }; ++ ++ enum { ++ jit_out_preserve_size = sizeof(jit_out_preserve), ++ jit_in_preserve_size = sizeof(jit_in_preserve) ++ }; ++ ++ struct jit_monitor { ++ uint64_t monitor[1]; ++ }; ++ ++ enum { ++ jit_monitor_size = sizeof(jit_monitor), ++ }; ++ ++ private: ++ ++ // STACK: ++ // ... ++ // [THIS_FRAME] <-- this._sp (stack pointer for this frame) ++ // [CALLER_FRAME] <-- this.fp() (_sp of caller's frame) ++ // ... ++ // ++ ++ // frame pointer for this frame ++ intptr_t* _fp; ++ ++ // The frame's stack pointer before it has been extended by a c2i adapter; ++ // needed by deoptimization ++ intptr_t* _unextended_sp; ++ void adjust_unextended_sp(); ++ ++ public: ++ ++ // Accessors for fields ++ intptr_t* fp() const { return _fp; } ++ ++ // Accessors for ABIs ++ inline abi_minframe* own_abi() const { return (abi_minframe*) _sp; } ++ inline abi_minframe* callers_abi() const { return (abi_minframe*) _fp; } ++ ++ private: ++ ++ // Find codeblob and set deopt_state. ++ inline void find_codeblob_and_set_pc_and_deopt_state(address pc); ++ ++ public: ++ ++ // Constructors ++ inline frame(intptr_t* sp); ++ frame(intptr_t* sp, address pc); ++ inline frame(intptr_t* sp, address pc, intptr_t* unextended_sp); ++ ++ private: ++ ++ intptr_t* compiled_sender_sp(CodeBlob* cb) const; ++ address* compiled_sender_pc_addr(CodeBlob* cb) const; ++ address* sender_pc_addr(void) const; ++ ++ public: ++ ++#ifdef CC_INTERP ++ // Additional interface for interpreter frames: ++ inline interpreterState get_interpreterState() const; ++#else ++ inline ijava_state* get_ijava_state() const; ++ // Some convenient register frame setters/getters for deoptimization. ++ inline intptr_t* interpreter_frame_esp() const; ++ inline void interpreter_frame_set_cpcache(ConstantPoolCache* cp); ++ inline void interpreter_frame_set_esp(intptr_t* esp); ++ inline void interpreter_frame_set_top_frame_sp(intptr_t* top_frame_sp); ++ inline void interpreter_frame_set_sender_sp(intptr_t* sender_sp); ++#endif // CC_INTERP ++ ++ // Size of a monitor in bytes. ++ static int interpreter_frame_monitor_size_in_bytes(); ++ ++ // The size of a cInterpreter object. ++ static inline int interpreter_frame_cinterpreterstate_size_in_bytes(); ++ ++ private: ++ ++ ConstantPoolCache** interpreter_frame_cpoolcache_addr() const; ++ ++ public: ++ ++ // Additional interface for entry frames: ++ inline entry_frame_locals* get_entry_frame_locals() const { ++ return (entry_frame_locals*) (((address) fp()) - entry_frame_locals_size); ++ } ++ ++ enum { ++ // normal return address is 1 bundle past PC ++ pc_return_offset = 0 ++ }; ++ ++#endif // CPU_PPC_VM_FRAME_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/frame_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/frame_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,303 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_FRAME_PPC_INLINE_HPP ++#define CPU_PPC_VM_FRAME_PPC_INLINE_HPP ++ ++#include "code/codeCache.hpp" ++ ++// Inline functions for ppc64 frames: ++ ++// Find codeblob and set deopt_state. ++inline void frame::find_codeblob_and_set_pc_and_deopt_state(address pc) { ++ assert(pc != NULL, "precondition: must have PC"); ++ ++ _cb = CodeCache::find_blob(pc); ++ _pc = pc; // Must be set for get_deopt_original_pc() ++ ++ _fp = (intptr_t*)own_abi()->callers_sp; ++ // Use _fp - frame_size, needs to be done between _cb and _pc initialization ++ // and get_deopt_original_pc. ++ adjust_unextended_sp(); ++ ++ address original_pc = nmethod::get_deopt_original_pc(this); ++ if (original_pc != NULL) { ++ _pc = original_pc; ++ _deopt_state = is_deoptimized; ++ } else { ++ _deopt_state = not_deoptimized; ++ } ++ ++ assert(((uint64_t)_sp & 0xf) == 0, "SP must be 16-byte aligned"); ++} ++ ++// Constructors ++ ++// Initialize all fields, _unextended_sp will be adjusted in find_codeblob_and_set_pc_and_deopt_state. ++inline frame::frame() : _sp(NULL), _unextended_sp(NULL), _fp(NULL), _cb(NULL), _pc(NULL), _deopt_state(unknown) {} ++ ++inline frame::frame(intptr_t* sp) : _sp(sp), _unextended_sp(sp) { ++ find_codeblob_and_set_pc_and_deopt_state((address)own_abi()->lr); // also sets _fp and adjusts _unextended_sp ++} ++ ++inline frame::frame(intptr_t* sp, address pc) : _sp(sp), _unextended_sp(sp) { ++ find_codeblob_and_set_pc_and_deopt_state(pc); // also sets _fp and adjusts _unextended_sp ++} ++ ++inline frame::frame(intptr_t* sp, address pc, intptr_t* unextended_sp) : _sp(sp), _unextended_sp(unextended_sp) { ++ find_codeblob_and_set_pc_and_deopt_state(pc); // also sets _fp and adjusts _unextended_sp ++} ++ ++// Accessors ++ ++// Return unique id for this frame. The id must have a value where we ++// can distinguish identity and younger/older relationship. NULL ++// represents an invalid (incomparable) frame. ++inline intptr_t* frame::id(void) const { ++ // Use _fp. _sp or _unextended_sp wouldn't be correct due to resizing. ++ return _fp; ++} ++ ++// Return true if this frame is older (less recent activation) than ++// the frame represented by id. ++inline bool frame::is_older(intptr_t* id) const { ++ assert(this->id() != NULL && id != NULL, "NULL frame id"); ++ // Stack grows towards smaller addresses on ppc64. ++ return this->id() > id; ++} ++ ++inline int frame::frame_size(RegisterMap* map) const { ++ // Stack grows towards smaller addresses on PPC64: sender is at a higher address. ++ return sender_sp() - sp(); ++} ++ ++// Return the frame's stack pointer before it has been extended by a ++// c2i adapter. This is needed by deoptimization for ignoring c2i adapter ++// frames. ++inline intptr_t* frame::unextended_sp() const { ++ return _unextended_sp; ++} ++ ++// All frames have this field. ++inline address frame::sender_pc() const { ++ return (address)callers_abi()->lr; ++} ++inline address* frame::sender_pc_addr() const { ++ return (address*)&(callers_abi()->lr); ++} ++ ++// All frames have this field. ++inline intptr_t* frame::sender_sp() const { ++ return (intptr_t*)callers_abi(); ++} ++ ++// All frames have this field. ++inline intptr_t* frame::link() const { ++ return (intptr_t*)callers_abi()->callers_sp; ++} ++ ++inline intptr_t* frame::real_fp() const { ++ return fp(); ++} ++ ++#ifdef CC_INTERP ++ ++inline interpreterState frame::get_interpreterState() const { ++ return (interpreterState)(((address)callers_abi()) ++ - frame::interpreter_frame_cinterpreterstate_size_in_bytes()); ++} ++ ++inline intptr_t** frame::interpreter_frame_locals_addr() const { ++ interpreterState istate = get_interpreterState(); ++ return (intptr_t**)&istate->_locals; ++} ++ ++inline intptr_t* frame::interpreter_frame_bcx_addr() const { ++ interpreterState istate = get_interpreterState(); ++ return (intptr_t*)&istate->_bcp; ++} ++ ++inline intptr_t* frame::interpreter_frame_mdx_addr() const { ++ interpreterState istate = get_interpreterState(); ++ return (intptr_t*)&istate->_mdx; ++} ++ ++inline intptr_t* frame::interpreter_frame_expression_stack() const { ++ return (intptr_t*)interpreter_frame_monitor_end() - 1; ++} ++ ++inline jint frame::interpreter_frame_expression_stack_direction() { ++ return -1; ++} ++ ++// top of expression stack ++inline intptr_t* frame::interpreter_frame_tos_address() const { ++ interpreterState istate = get_interpreterState(); ++ return istate->_stack + 1; ++} ++ ++inline intptr_t* frame::interpreter_frame_tos_at(jint offset) const { ++ return &interpreter_frame_tos_address()[offset]; ++} ++ ++// monitor elements ++ ++// in keeping with Intel side: end is lower in memory than begin; ++// and beginning element is oldest element ++// Also begin is one past last monitor. ++ ++inline BasicObjectLock* frame::interpreter_frame_monitor_begin() const { ++ return get_interpreterState()->monitor_base(); ++} ++ ++inline BasicObjectLock* frame::interpreter_frame_monitor_end() const { ++ return (BasicObjectLock*)get_interpreterState()->stack_base(); ++} ++ ++inline int frame::interpreter_frame_cinterpreterstate_size_in_bytes() { ++ // Size of an interpreter object. Not aligned with frame size. ++ return round_to(sizeof(BytecodeInterpreter), 8); ++} ++ ++inline Method** frame::interpreter_frame_method_addr() const { ++ interpreterState istate = get_interpreterState(); ++ return &istate->_method; ++} ++ ++// Constant pool cache ++ ++inline ConstantPoolCache** frame::interpreter_frame_cpoolcache_addr() const { ++ interpreterState istate = get_interpreterState(); ++ return &istate->_constants; // should really use accessor ++} ++ ++inline ConstantPoolCache** frame::interpreter_frame_cache_addr() const { ++ interpreterState istate = get_interpreterState(); ++ return &istate->_constants; ++} ++ ++#else // !CC_INTERP ++ ++// Template Interpreter frame value accessors. ++ ++inline frame::ijava_state* frame::get_ijava_state() const { ++ return (ijava_state*) ((uintptr_t)fp() - ijava_state_size); ++} ++ ++inline intptr_t** frame::interpreter_frame_locals_addr() const { ++ return (intptr_t**) &(get_ijava_state()->locals); ++} ++inline intptr_t* frame::interpreter_frame_bcx_addr() const { ++ return (intptr_t*) &(get_ijava_state()->bcp); ++} ++inline intptr_t* frame::interpreter_frame_mdx_addr() const { ++ return (intptr_t*) &(get_ijava_state()->mdx); ++} ++// Pointer beyond the "oldest/deepest" BasicObjectLock on stack. ++inline BasicObjectLock* frame::interpreter_frame_monitor_end() const { ++ return (BasicObjectLock *) get_ijava_state()->monitors; ++} ++ ++inline BasicObjectLock* frame::interpreter_frame_monitor_begin() const { ++ return (BasicObjectLock *) get_ijava_state(); ++} ++ ++// SAPJVM ASc 2012-11-21. Return register stack slot addr at which currently interpreted method is found ++inline Method** frame::interpreter_frame_method_addr() const { ++ return (Method**) &(get_ijava_state()->method); ++} ++inline ConstantPoolCache** frame::interpreter_frame_cpoolcache_addr() const { ++ return (ConstantPoolCache**) &(get_ijava_state()->cpoolCache); ++} ++inline ConstantPoolCache** frame::interpreter_frame_cache_addr() const { ++ return (ConstantPoolCache**) &(get_ijava_state()->cpoolCache); ++} ++ ++inline oop* frame::interpreter_frame_temp_oop_addr() const { ++ return (oop *) &(get_ijava_state()->oop_tmp); ++} ++inline intptr_t* frame::interpreter_frame_esp() const { ++ return (intptr_t*) get_ijava_state()->esp; ++} ++ ++// Convenient setters ++inline void frame::interpreter_frame_set_monitor_end(BasicObjectLock* end) { get_ijava_state()->monitors = (intptr_t) end;} ++inline void frame::interpreter_frame_set_cpcache(ConstantPoolCache* cp) { *frame::interpreter_frame_cpoolcache_addr() = cp; } ++inline void frame::interpreter_frame_set_esp(intptr_t* esp) { get_ijava_state()->esp = (intptr_t) esp; } ++inline void frame::interpreter_frame_set_top_frame_sp(intptr_t* top_frame_sp) { get_ijava_state()->top_frame_sp = (intptr_t) top_frame_sp; } ++inline void frame::interpreter_frame_set_sender_sp(intptr_t* sender_sp) { get_ijava_state()->sender_sp = (intptr_t) sender_sp; } ++ ++inline intptr_t* frame::interpreter_frame_expression_stack() const { ++ return (intptr_t*)interpreter_frame_monitor_end() - 1; ++} ++ ++inline jint frame::interpreter_frame_expression_stack_direction() { ++ return -1; ++} ++ ++// top of expression stack ++inline intptr_t* frame::interpreter_frame_tos_address() const { ++ return ((intptr_t*) get_ijava_state()->esp) + Interpreter::stackElementWords; ++} ++ ++inline intptr_t* frame::interpreter_frame_tos_at(jint offset) const { ++ return &interpreter_frame_tos_address()[offset]; ++} ++ ++#endif // CC_INTERP ++ ++inline int frame::interpreter_frame_monitor_size() { ++ // Number of stack slots for a monitor. ++ return round_to(BasicObjectLock::size(), // number of stack slots ++ WordsPerLong); // number of stack slots for a Java long ++} ++ ++inline int frame::interpreter_frame_monitor_size_in_bytes() { ++ return frame::interpreter_frame_monitor_size() * wordSize; ++} ++ ++// entry frames ++ ++inline intptr_t* frame::entry_frame_argument_at(int offset) const { ++ // Since an entry frame always calls the interpreter first, the ++ // parameters are on the stack and relative to known register in the ++ // entry frame. ++ intptr_t* tos = (intptr_t*)get_entry_frame_locals()->arguments_tos_address; ++ return &tos[offset + 1]; // prepushed tos ++} ++ ++inline JavaCallWrapper** frame::entry_frame_call_wrapper_addr() const { ++ return (JavaCallWrapper**)&get_entry_frame_locals()->call_wrapper_address; ++} ++ ++inline oop frame::saved_oop_result(RegisterMap* map) const { ++ return *((oop*)map->location(R3->as_VMReg())); ++} ++ ++inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) { ++ *((oop*)map->location(R3->as_VMReg())) = obj; ++} ++ ++#endif // CPU_PPC_VM_FRAME_PPC_INLINE_HPP +--- ./hotspot/src/cpu/ppc/vm/globalDefinitions_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/globalDefinitions_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,43 @@ ++/* ++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_GLOBALDEFINITIONS_PPC_HPP ++#define CPU_PPC_VM_GLOBALDEFINITIONS_PPC_HPP ++ ++// Size of PPC Instructions ++const int BytesPerInstWord = 4; ++ ++const int StackAlignmentInBytes = 16; ++ ++// Indicates whether the C calling conventions require that ++// 32-bit integer argument values are properly extended to 64 bits. ++// If set, SharedRuntime::c_calling_convention() must adapt ++// signatures accordingly. ++const bool CCallingConventionRequiresIntsAsLongs = true; ++ ++// The PPC CPUs are NOT multiple-copy-atomic. ++#define CPU_NOT_MULTIPLE_COPY_ATOMIC ++ ++#endif // CPU_PPC_VM_GLOBALDEFINITIONS_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/globals_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/globals_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,126 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_GLOBALS_PPC_HPP ++#define CPU_PPC_VM_GLOBALS_PPC_HPP ++ ++#include "utilities/globalDefinitions.hpp" ++#include "utilities/macros.hpp" ++ ++// Sets the default values for platform dependent flags used by the runtime system. ++// (see globals.hpp) ++ ++define_pd_global(bool, ConvertSleepToYield, true); ++define_pd_global(bool, ShareVtableStubs, false); // Improves performance markedly for mtrt and compress. ++define_pd_global(bool, NeedsDeoptSuspend, false); // Only register window machines need this. ++ ++ ++define_pd_global(bool, ImplicitNullChecks, true); // Generate code for implicit null checks. ++define_pd_global(bool, TrapBasedNullChecks, true); ++define_pd_global(bool, UncommonNullCast, true); // Uncommon-trap NULLs passed to check cast. ++ ++// Use large code-entry alignment. ++define_pd_global(intx, CodeEntryAlignment, 128); ++define_pd_global(intx, OptoLoopAlignment, 16); ++define_pd_global(intx, InlineFrequencyCount, 100); ++define_pd_global(intx, InlineSmallCode, 1500); ++ ++define_pd_global(intx, PreInflateSpin, 10); ++ ++// Flags for template interpreter. ++define_pd_global(bool, RewriteBytecodes, true); ++define_pd_global(bool, RewriteFrequentPairs, true); ++ ++define_pd_global(bool, UseMembar, false); ++ ++// GC Ergo Flags ++define_pd_global(uintx, CMSYoungGenPerWorker, 16*M); // Default max size of CMS young gen, per GC worker thread. ++ ++define_pd_global(uintx, TypeProfileLevel, 0); ++ ++// Platform dependent flag handling: flags only defined on this platform. ++#define ARCH_FLAGS(develop, product, diagnostic, experimental, notproduct) \ ++ \ ++ /* Load poll address from thread. This is used to implement per-thread */ \ ++ /* safepoints on platforms != IA64. */ \ ++ product(bool, LoadPollAddressFromThread, false, \ ++ "Load polling page address from thread object (required for " \ ++ "per-thread safepoints on platforms != IA64)") \ ++ \ ++ product(uintx, PowerArchitecturePPC64, 0, \ ++ "CPU Version: x for PowerX. Currently recognizes Power5 to " \ ++ "Power7. Default is 0. CPUs newer than Power7 will be " \ ++ "recognized as Power7.") \ ++ \ ++ /* Reoptimize code-sequences of calls at runtime, e.g. replace an */ \ ++ /* indirect call by a direct call. */ \ ++ product(bool, ReoptimizeCallSequences, true, \ ++ "Reoptimize code-sequences of calls at runtime.") \ ++ \ ++ product(bool, UseLoadInstructionsForStackBangingPPC64, false, \ ++ "Use load instructions for stack banging.") \ ++ \ ++ /* special instructions */ \ ++ \ ++ product(bool, UseCountLeadingZerosInstructionsPPC64, true, \ ++ "Use count leading zeros instructions.") \ ++ \ ++ product(bool, UseExtendedLoadAndReserveInstructionsPPC64, false, \ ++ "Use extended versions of load-and-reserve instructions.") \ ++ \ ++ product(bool, UseRotateAndMaskInstructionsPPC64, true, \ ++ "Use rotate and mask instructions.") \ ++ \ ++ product(bool, UseStaticBranchPredictionInCompareAndSwapPPC64, true, \ ++ "Use static branch prediction hints in CAS operations.") \ ++ product(bool, UseStaticBranchPredictionForUncommonPathsPPC64, false, \ ++ "Use static branch prediction hints for uncommon paths.") \ ++ \ ++ product(bool, UsePower6SchedulerPPC64, false, \ ++ "Use Power6 Scheduler.") \ ++ \ ++ product(bool, InsertEndGroupPPC64, false, \ ++ "Insert EndGroup instructions to optimize for Power6.") \ ++ \ ++ /* Trap based checks. */ \ ++ /* Trap based checks use the ppc trap instructions to check certain */ \ ++ /* conditions. This instruction raises a SIGTRAP caught by the */ \ ++ /* exception handler of the VM. */ \ ++ product(bool, UseSIGTRAP, true, \ ++ "Allow trap instructions that make use of SIGTRAP. Use this to " \ ++ "switch off all optimizations requiring SIGTRAP.") \ ++ product(bool, TrapBasedICMissChecks, true, \ ++ "Raise and handle SIGTRAP if inline cache miss detected.") \ ++ product(bool, TrapBasedNotEntrantChecks, true, \ ++ "Raise and handle SIGTRAP if calling not entrant or zombie" \ ++ " method.") \ ++ product(bool, TraceTraps, false, "Trace all traps the signal handler" \ ++ "handles.") \ ++ \ ++ product(bool, ZapMemory, false, "Write 0x0101... to empty memory." \ ++ " Use this to ease debugging.") \ ++ ++ ++#endif // CPU_PPC_VM_GLOBALS_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/icBuffer_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/icBuffer_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,71 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "asm/assembler.hpp" ++#include "assembler_ppc.inline.hpp" ++#include "code/icBuffer.hpp" ++#include "gc_interface/collectedHeap.inline.hpp" ++#include "interpreter/bytecodes.hpp" ++#include "memory/resourceArea.hpp" ++#include "nativeInst_ppc.hpp" ++#include "oops/oop.inline.hpp" ++#include "oops/oop.inline2.hpp" ++ ++#define __ masm. ++ ++int InlineCacheBuffer::ic_stub_code_size() { ++ return MacroAssembler::load_const_size + MacroAssembler::b64_patchable_size; ++} ++ ++void InlineCacheBuffer::assemble_ic_buffer_code(address code_begin, void* cached_value, address entry_point) { ++ ResourceMark rm; ++ CodeBuffer code(code_begin, ic_stub_code_size()); ++ MacroAssembler masm(&code); ++ // Note: even though the code contains an embedded metadata, we do not need reloc info ++ // because ++ // (1) the metadata is old (i.e., doesn't matter for scavenges) ++ // (2) these ICStubs are removed *before* a GC happens, so the roots disappear. ++ ++ // Load the oop ... ++ __ load_const(R19_method, (address) cached_value, R0); ++ // ... and jump to entry point. ++ __ b64_patchable((address) entry_point, relocInfo::none); ++ ++ __ flush(); ++} ++ ++address InlineCacheBuffer::ic_buffer_entry_point(address code_begin) { ++ NativeMovConstReg* move = nativeMovConstReg_at(code_begin); // creation also verifies the object ++ NativeJump* jump = nativeJump_at(move->next_instruction_address()); ++ return jump->jump_destination(); ++} ++ ++void* InlineCacheBuffer::ic_buffer_cached_value(address code_begin) { ++ NativeMovConstReg* move = nativeMovConstReg_at(code_begin); // creation also verifies the object ++ void* o = (void*)move->data(); ++ return o; ++} ++ +--- ./hotspot/src/cpu/ppc/vm/icache_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/icache_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,77 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "assembler_ppc.inline.hpp" ++#include "runtime/icache.hpp" ++ ++// Use inline assembler to implement icache flush. ++int ICache::ppc64_flush_icache(address start, int lines, int magic) { ++ address end = start + (unsigned int)lines*ICache::line_size; ++ assert(start <= end, "flush_icache parms"); ++ ++ // store modified cache lines from data cache ++ for (address a = start; a < end; a += ICache::line_size) { ++ __asm__ __volatile__( ++ "dcbst 0, %0 \n" ++ : ++ : "r" (a) ++ : "memory"); ++ } ++ ++ // sync instruction ++ __asm__ __volatile__( ++ "sync \n" ++ : ++ : ++ : "memory"); ++ ++ // invalidate respective cache lines in instruction cache ++ for (address a = start; a < end; a += ICache::line_size) { ++ __asm__ __volatile__( ++ "icbi 0, %0 \n" ++ : ++ : "r" (a) ++ : "memory"); ++ } ++ ++ // discard fetched instructions ++ __asm__ __volatile__( ++ "isync \n" ++ : ++ : ++ : "memory"); ++ ++ return magic; ++} ++ ++void ICacheStubGenerator::generate_icache_flush(ICache::flush_icache_stub_t* flush_icache_stub) { ++ StubCodeMark mark(this, "ICache", "flush_icache_stub"); ++ ++ *flush_icache_stub = (ICache::flush_icache_stub_t)ICache::ppc64_flush_icache; ++ ++ // First call to flush itself ++ ICache::invalidate_range((address)(*flush_icache_stub), 0); ++} +--- ./hotspot/src/cpu/ppc/vm/icache_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/icache_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,52 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_ICACHE_PPC_HPP ++#define CPU_PPC_VM_ICACHE_PPC_HPP ++ ++// Interface for updating the instruction cache. Whenever the VM modifies ++// code, part of the processor instruction cache potentially has to be flushed. ++ ++class ICache : public AbstractICache { ++ friend class ICacheStubGenerator; ++ static int ppc64_flush_icache(address start, int lines, int magic); ++ ++ public: ++ enum { ++ // Actually, cache line size is 64, but keeping it as it is to be ++ // on the safe side on ALL PPC64 implementations. ++ log2_line_size = 5, ++ line_size = 1 << log2_line_size ++ }; ++ ++ static void ppc64_flush_icache_bytes(address start, int bytes) { ++ // Align start address to an icache line boundary and transform ++ // nbytes to an icache line count. ++ const uint line_offset = mask_address_bits(start, line_size - 1); ++ ppc64_flush_icache(start - line_offset, (bytes + line_offset + line_size - 1) >> log2_line_size, 0); ++ } ++}; ++ ++#endif // CPU_PPC_VM_ICACHE_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,2209 @@ ++/* ++ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/assembler.hpp" ++#include "asm/macroAssembler.inline.hpp" ++#include "interp_masm_ppc_64.hpp" ++#include "interpreter/interpreterRuntime.hpp" ++#include "prims/jvmtiThreadState.hpp" ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) // nothing ++#else ++#define BLOCK_COMMENT(str) block_comment(str) ++#endif ++ ++void InterpreterMacroAssembler::null_check_throw(Register a, int offset, Register temp_reg) { ++#ifdef CC_INTERP ++ address exception_entry = StubRoutines::throw_NullPointerException_at_call_entry(); ++#else ++ address exception_entry = Interpreter::throw_NullPointerException_entry(); ++#endif ++ MacroAssembler::null_check_throw(a, offset, temp_reg, exception_entry); ++} ++ ++void InterpreterMacroAssembler::branch_to_entry(address entry, Register Rscratch) { ++ assert(entry, "Entry must have been generated by now"); ++ if (is_within_range_of_b(entry, pc())) { ++ b(entry); ++ } else { ++ load_const_optimized(Rscratch, entry, R0); ++ mtctr(Rscratch); ++ bctr(); ++ } ++} ++ ++#ifndef CC_INTERP ++ ++void InterpreterMacroAssembler::dispatch_next(TosState state, int bcp_incr) { ++ Register bytecode = R12_scratch2; ++ if (bcp_incr != 0) { ++ lbzu(bytecode, bcp_incr, R14_bcp); ++ } else { ++ lbz(bytecode, 0, R14_bcp); ++ } ++ ++ dispatch_Lbyte_code(state, bytecode, Interpreter::dispatch_table(state)); ++} ++ ++void InterpreterMacroAssembler::dispatch_via(TosState state, address* table) { ++ // Load current bytecode. ++ Register bytecode = R12_scratch2; ++ lbz(bytecode, 0, R14_bcp); ++ dispatch_Lbyte_code(state, bytecode, table); ++} ++ ++// Dispatch code executed in the prolog of a bytecode which does not do it's ++// own dispatch. The dispatch address is computed and placed in R24_dispatch_addr. ++void InterpreterMacroAssembler::dispatch_prolog(TosState state, int bcp_incr) { ++ Register bytecode = R12_scratch2; ++ lbz(bytecode, bcp_incr, R14_bcp); ++ ++ load_dispatch_table(R24_dispatch_addr, Interpreter::dispatch_table(state)); ++ ++ sldi(bytecode, bytecode, LogBytesPerWord); ++ ldx(R24_dispatch_addr, R24_dispatch_addr, bytecode); ++} ++ ++// Dispatch code executed in the epilog of a bytecode which does not do it's ++// own dispatch. The dispatch address in R24_dispatch_addr is used for the ++// dispatch. ++void InterpreterMacroAssembler::dispatch_epilog(TosState state, int bcp_incr) { ++ mtctr(R24_dispatch_addr); ++ addi(R14_bcp, R14_bcp, bcp_incr); ++ bctr(); ++} ++ ++void InterpreterMacroAssembler::check_and_handle_popframe(Register scratch_reg) { ++ assert(scratch_reg != R0, "can't use R0 as scratch_reg here"); ++ if (JvmtiExport::can_pop_frame()) { ++ Label L; ++ ++ // Check the "pending popframe condition" flag in the current thread. ++ lwz(scratch_reg, in_bytes(JavaThread::popframe_condition_offset()), R16_thread); ++ ++ // Initiate popframe handling only if it is not already being ++ // processed. If the flag has the popframe_processing bit set, it ++ // means that this code is called *during* popframe handling - we ++ // don't want to reenter. ++ andi_(R0, scratch_reg, JavaThread::popframe_pending_bit); ++ beq(CCR0, L); ++ ++ andi_(R0, scratch_reg, JavaThread::popframe_processing_bit); ++ bne(CCR0, L); ++ ++ // Call the Interpreter::remove_activation_preserving_args_entry() ++ // func to get the address of the same-named entrypoint in the ++ // generated interpreter code. ++ call_c(CAST_FROM_FN_PTR(FunctionDescriptor*, ++ Interpreter::remove_activation_preserving_args_entry), ++ relocInfo::none); ++ ++ // Jump to Interpreter::_remove_activation_preserving_args_entry. ++ mtctr(R3_RET); ++ bctr(); ++ ++ align(32, 12); ++ bind(L); ++ } ++} ++ ++void InterpreterMacroAssembler::check_and_handle_earlyret(Register scratch_reg) { ++ const Register Rthr_state_addr = scratch_reg; ++ if (JvmtiExport::can_force_early_return()) { ++ Label Lno_early_ret; ++ ld(Rthr_state_addr, in_bytes(JavaThread::jvmti_thread_state_offset()), R16_thread); ++ cmpdi(CCR0, Rthr_state_addr, 0); ++ beq(CCR0, Lno_early_ret); ++ ++ lwz(R0, in_bytes(JvmtiThreadState::earlyret_state_offset()), Rthr_state_addr); ++ cmpwi(CCR0, R0, JvmtiThreadState::earlyret_pending); ++ bne(CCR0, Lno_early_ret); ++ ++ // Jump to Interpreter::_earlyret_entry. ++ lwz(R3_ARG1, in_bytes(JvmtiThreadState::earlyret_tos_offset()), Rthr_state_addr); ++ call_VM_leaf(CAST_FROM_FN_PTR(address, Interpreter::remove_activation_early_entry)); ++ mtlr(R3_RET); ++ blr(); ++ ++ align(32, 12); ++ bind(Lno_early_ret); ++ } ++} ++ ++void InterpreterMacroAssembler::load_earlyret_value(TosState state, Register Rscratch1) { ++ const Register RjvmtiState = Rscratch1; ++ const Register Rscratch2 = R0; ++ ++ ld(RjvmtiState, in_bytes(JavaThread::jvmti_thread_state_offset()), R16_thread); ++ li(Rscratch2, 0); ++ ++ switch (state) { ++ case atos: ld(R17_tos, in_bytes(JvmtiThreadState::earlyret_oop_offset()), RjvmtiState); ++ std(Rscratch2, in_bytes(JvmtiThreadState::earlyret_oop_offset()), RjvmtiState); ++ break; ++ case ltos: ld(R17_tos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState); ++ break; ++ case btos: // fall through ++ case ctos: // fall through ++ case stos: // fall through ++ case itos: lwz(R17_tos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState); ++ break; ++ case ftos: lfs(F15_ftos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState); ++ break; ++ case dtos: lfd(F15_ftos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState); ++ break; ++ case vtos: break; ++ default : ShouldNotReachHere(); ++ } ++ ++ // Clean up tos value in the jvmti thread state. ++ std(Rscratch2, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState); ++ // Set tos state field to illegal value. ++ li(Rscratch2, ilgl); ++ stw(Rscratch2, in_bytes(JvmtiThreadState::earlyret_tos_offset()), RjvmtiState); ++} ++ ++// Common code to dispatch and dispatch_only. ++// Dispatch value in Lbyte_code and increment Lbcp. ++ ++void InterpreterMacroAssembler::load_dispatch_table(Register dst, address* table) { ++ address table_base = (address)Interpreter::dispatch_table((TosState)0); ++ intptr_t table_offs = (intptr_t)table - (intptr_t)table_base; ++ if (is_simm16(table_offs)) { ++ addi(dst, R25_templateTableBase, (int)table_offs); ++ } else { ++ load_const_optimized(dst, table, R0); ++ } ++} ++ ++void InterpreterMacroAssembler::dispatch_Lbyte_code(TosState state, Register bytecode, address* table, bool verify) { ++ if (verify) { ++ unimplemented("dispatch_Lbyte_code: verify"); // See Sparc Implementation to implement this ++ } ++ ++#ifdef FAST_DISPATCH ++ unimplemented("dispatch_Lbyte_code FAST_DISPATCH"); ++#else ++ assert_different_registers(bytecode, R11_scratch1); ++ ++ // Calc dispatch table address. ++ load_dispatch_table(R11_scratch1, table); ++ ++ sldi(R12_scratch2, bytecode, LogBytesPerWord); ++ ldx(R11_scratch1, R11_scratch1, R12_scratch2); ++ ++ // Jump off! ++ mtctr(R11_scratch1); ++ bctr(); ++#endif ++} ++ ++void InterpreterMacroAssembler::load_receiver(Register Rparam_count, Register Rrecv_dst) { ++ sldi(Rrecv_dst, Rparam_count, Interpreter::logStackElementSize); ++ ldx(Rrecv_dst, Rrecv_dst, R15_esp); ++} ++ ++// helpers for expression stack ++ ++void InterpreterMacroAssembler::pop_i(Register r) { ++ lwzu(r, Interpreter::stackElementSize, R15_esp); ++} ++ ++void InterpreterMacroAssembler::pop_ptr(Register r) { ++ ldu(r, Interpreter::stackElementSize, R15_esp); ++} ++ ++void InterpreterMacroAssembler::pop_l(Register r) { ++ ld(r, Interpreter::stackElementSize, R15_esp); ++ addi(R15_esp, R15_esp, 2 * Interpreter::stackElementSize); ++} ++ ++void InterpreterMacroAssembler::pop_f(FloatRegister f) { ++ lfsu(f, Interpreter::stackElementSize, R15_esp); ++} ++ ++void InterpreterMacroAssembler::pop_d(FloatRegister f) { ++ lfd(f, Interpreter::stackElementSize, R15_esp); ++ addi(R15_esp, R15_esp, 2 * Interpreter::stackElementSize); ++} ++ ++void InterpreterMacroAssembler::push_i(Register r) { ++ stw(r, 0, R15_esp); ++ addi(R15_esp, R15_esp, - Interpreter::stackElementSize ); ++} ++ ++void InterpreterMacroAssembler::push_ptr(Register r) { ++ std(r, 0, R15_esp); ++ addi(R15_esp, R15_esp, - Interpreter::stackElementSize ); ++} ++ ++void InterpreterMacroAssembler::push_l(Register r) { ++ std(r, - Interpreter::stackElementSize, R15_esp); ++ addi(R15_esp, R15_esp, - 2 * Interpreter::stackElementSize ); ++} ++ ++void InterpreterMacroAssembler::push_f(FloatRegister f) { ++ stfs(f, 0, R15_esp); ++ addi(R15_esp, R15_esp, - Interpreter::stackElementSize ); ++} ++ ++void InterpreterMacroAssembler::push_d(FloatRegister f) { ++ stfd(f, - Interpreter::stackElementSize, R15_esp); ++ addi(R15_esp, R15_esp, - 2 * Interpreter::stackElementSize ); ++} ++ ++void InterpreterMacroAssembler::push_2ptrs(Register first, Register second) { ++ std(first, 0, R15_esp); ++ std(second, -Interpreter::stackElementSize, R15_esp); ++ addi(R15_esp, R15_esp, - 2 * Interpreter::stackElementSize ); ++} ++ ++void InterpreterMacroAssembler::push_l_pop_d(Register l, FloatRegister d) { ++ std(l, 0, R15_esp); ++ lfd(d, 0, R15_esp); ++} ++ ++void InterpreterMacroAssembler::push_d_pop_l(FloatRegister d, Register l) { ++ stfd(d, 0, R15_esp); ++ ld(l, 0, R15_esp); ++} ++ ++void InterpreterMacroAssembler::push(TosState state) { ++ switch (state) { ++ case atos: push_ptr(); break; ++ case btos: ++ case ctos: ++ case stos: ++ case itos: push_i(); break; ++ case ltos: push_l(); break; ++ case ftos: push_f(); break; ++ case dtos: push_d(); break; ++ case vtos: /* nothing to do */ break; ++ default : ShouldNotReachHere(); ++ } ++} ++ ++void InterpreterMacroAssembler::pop(TosState state) { ++ switch (state) { ++ case atos: pop_ptr(); break; ++ case btos: ++ case ctos: ++ case stos: ++ case itos: pop_i(); break; ++ case ltos: pop_l(); break; ++ case ftos: pop_f(); break; ++ case dtos: pop_d(); break; ++ case vtos: /* nothing to do */ break; ++ default : ShouldNotReachHere(); ++ } ++ verify_oop(R17_tos, state); ++} ++ ++void InterpreterMacroAssembler::empty_expression_stack() { ++ addi(R15_esp, R26_monitor, - Interpreter::stackElementSize); ++} ++ ++void InterpreterMacroAssembler::get_2_byte_integer_at_bcp(int bcp_offset, ++ Register Rdst, ++ signedOrNot is_signed) { ++ // Read Java big endian format. ++ if (is_signed == Signed) { ++ lha(Rdst, bcp_offset, R14_bcp); ++ } else { ++ lhz(Rdst, bcp_offset, R14_bcp); ++ } ++#if 0 ++ assert(Rtmp != Rdst, "need separate temp register"); ++ Register Rfirst = Rtmp; ++ lbz(Rfirst, bcp_offset, R14_bcp); // first byte ++ lbz(Rdst, bcp_offset+1, R14_bcp); // second byte ++ ++ // Rdst = ((Rfirst<<8) & 0xFF00) | (Rdst &~ 0xFF00) ++ rldimi(/*RA=*/Rdst, /*RS=*/Rfirst, /*sh=*/8, /*mb=*/48); ++ if (is_signed == Signed) { ++ extsh(Rdst, Rdst); ++ } ++#endif ++} ++ ++void InterpreterMacroAssembler::get_4_byte_integer_at_bcp(int bcp_offset, ++ Register Rdst, ++ signedOrNot is_signed) { ++ // Read Java big endian format. ++ if (bcp_offset & 3) { // Offset unaligned? ++ load_const_optimized(Rdst, bcp_offset); ++ if (is_signed == Signed) { ++ lwax(Rdst, R14_bcp, Rdst); ++ } else { ++ lwzx(Rdst, R14_bcp, Rdst); ++ } ++ } else { ++ if (is_signed == Signed) { ++ lwa(Rdst, bcp_offset, R14_bcp); ++ } else { ++ lwz(Rdst, bcp_offset, R14_bcp); ++ } ++ } ++} ++ ++// Load the constant pool cache index from the bytecode stream. ++// ++// Kills / writes: ++// - Rdst, Rscratch ++void InterpreterMacroAssembler::get_cache_index_at_bcp(Register Rdst, int bcp_offset, size_t index_size) { ++ assert(bcp_offset > 0, "bcp is still pointing to start of bytecode"); ++ if (index_size == sizeof(u2)) { ++ get_2_byte_integer_at_bcp(bcp_offset, Rdst, Unsigned); ++ } else if (index_size == sizeof(u4)) { ++ assert(EnableInvokeDynamic, "giant index used only for JSR 292"); ++ get_4_byte_integer_at_bcp(bcp_offset, Rdst, Signed); ++ assert(ConstantPool::decode_invokedynamic_index(~123) == 123, "else change next line"); ++ nand(Rdst, Rdst, Rdst); // convert to plain index ++ } else if (index_size == sizeof(u1)) { ++ lbz(Rdst, bcp_offset, R14_bcp); ++ } else { ++ ShouldNotReachHere(); ++ } ++ // Rdst now contains cp cache index. ++} ++ ++void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, int bcp_offset, size_t index_size) { ++ get_cache_index_at_bcp(cache, bcp_offset, index_size); ++ sldi(cache, cache, exact_log2(in_words(ConstantPoolCacheEntry::size()) * BytesPerWord)); ++ add(cache, R27_constPoolCache, cache); ++} ++ ++// Load object from cpool->resolved_references(index). ++void InterpreterMacroAssembler::load_resolved_reference_at_index(Register result, Register index) { ++ assert_different_registers(result, index); ++ get_constant_pool(result); ++ ++ // Convert from field index to resolved_references() index and from ++ // word index to byte offset. Since this is a java object, it can be compressed. ++ Register tmp = index; // reuse ++ sldi(tmp, index, LogBytesPerHeapOop); ++ // Load pointer for resolved_references[] objArray. ++ ld(result, ConstantPool::resolved_references_offset_in_bytes(), result); ++ // JNIHandles::resolve(result) ++ ld(result, 0, result); ++#ifdef ASSERT ++ Label index_ok; ++ lwa(R0, arrayOopDesc::length_offset_in_bytes(), result); ++ sldi(R0, R0, LogBytesPerHeapOop); ++ cmpd(CCR0, tmp, R0); ++ blt(CCR0, index_ok); ++ stop("resolved reference index out of bounds", 0x09256); ++ bind(index_ok); ++#endif ++ // Add in the index. ++ add(result, tmp, result); ++ load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result); ++} ++ ++// Generate a subtype check: branch to ok_is_subtype if sub_klass is ++// a subtype of super_klass. Blows registers Rsub_klass, tmp1, tmp2. ++void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, Register Rsuper_klass, Register Rtmp1, ++ Register Rtmp2, Register Rtmp3, Label &ok_is_subtype) { ++ // Profile the not-null value's klass. ++ profile_typecheck(Rsub_klass, Rtmp1, Rtmp2); ++ check_klass_subtype(Rsub_klass, Rsuper_klass, Rtmp1, Rtmp2, ok_is_subtype); ++ profile_typecheck_failed(Rtmp1, Rtmp2); ++} ++ ++void InterpreterMacroAssembler::generate_stack_overflow_check_with_compare_and_throw(Register Rmem_frame_size, Register Rscratch1) { ++ Label done; ++ sub(Rmem_frame_size, R1_SP, Rmem_frame_size); ++ ld(Rscratch1, thread_(stack_overflow_limit)); ++ cmpld(CCR0/*is_stack_overflow*/, Rmem_frame_size, Rscratch1); ++ bgt(CCR0/*is_stack_overflow*/, done); ++ ++ // Load target address of the runtime stub. ++ assert(StubRoutines::throw_StackOverflowError_entry() != NULL, "generated in wrong order"); ++ load_const_optimized(Rscratch1, (StubRoutines::throw_StackOverflowError_entry()), R0); ++ mtctr(Rscratch1); ++ // Restore caller_sp. ++#ifdef ASSERT ++ ld(Rscratch1, 0, R1_SP); ++ ld(R0, 0, R21_sender_SP); ++ cmpd(CCR0, R0, Rscratch1); ++ asm_assert_eq("backlink", 0x547); ++#endif // ASSERT ++ mr(R1_SP, R21_sender_SP); ++ bctr(); ++ ++ align(32, 12); ++ bind(done); ++} ++ ++// Separate these two to allow for delay slot in middle. ++// These are used to do a test and full jump to exception-throwing code. ++ ++// Check that index is in range for array, then shift index by index_shift, ++// and put arrayOop + shifted_index into res. ++// Note: res is still shy of address by array offset into object. ++ ++void InterpreterMacroAssembler::index_check_without_pop(Register Rarray, Register Rindex, int index_shift, Register Rtmp, Register Rres) { ++ // Check that index is in range for array, then shift index by index_shift, ++ // and put arrayOop + shifted_index into res. ++ // Note: res is still shy of address by array offset into object. ++ // Kills: ++ // - Rindex ++ // Writes: ++ // - Rres: Address that corresponds to the array index if check was successful. ++ verify_oop(Rarray); ++ const Register Rlength = R0; ++ const Register RsxtIndex = Rtmp; ++ Label LisNull, LnotOOR; ++ ++ // Array nullcheck ++ if (!ImplicitNullChecks) { ++ cmpdi(CCR0, Rarray, 0); ++ beq(CCR0, LisNull); ++ } else { ++ null_check_throw(Rarray, arrayOopDesc::length_offset_in_bytes(), /*temp*/RsxtIndex); ++ } ++ ++ // Rindex might contain garbage in upper bits (remember that we don't sign extend ++ // during integer arithmetic operations). So kill them and put value into same register ++ // where ArrayIndexOutOfBounds would expect the index in. ++ rldicl(RsxtIndex, Rindex, 0, 32); // zero extend 32 bit -> 64 bit ++ ++ // Index check ++ lwz(Rlength, arrayOopDesc::length_offset_in_bytes(), Rarray); ++ cmplw(CCR0, Rindex, Rlength); ++ sldi(RsxtIndex, RsxtIndex, index_shift); ++ blt(CCR0, LnotOOR); ++ load_dispatch_table(Rtmp, (address*)Interpreter::_throw_ArrayIndexOutOfBoundsException_entry); ++ mtctr(Rtmp); ++ bctr(); ++ ++ if (!ImplicitNullChecks) { ++ bind(LisNull); ++ load_dispatch_table(Rtmp, (address*)Interpreter::_throw_NullPointerException_entry); ++ mtctr(Rtmp); ++ bctr(); ++ } ++ ++ align(32, 16); ++ bind(LnotOOR); ++ ++ // Calc address ++ add(Rres, RsxtIndex, Rarray); ++} ++ ++void InterpreterMacroAssembler::index_check(Register array, Register index, int index_shift, Register tmp, Register res) { ++ // pop array ++ pop_ptr(array); ++ ++ // check array ++ index_check_without_pop(array, index, index_shift, tmp, res); ++} ++ ++void InterpreterMacroAssembler::get_const(Register Rdst) { ++ ld(Rdst, in_bytes(Method::const_offset()), R19_method); ++} ++ ++void InterpreterMacroAssembler::get_constant_pool(Register Rdst) { ++ get_const(Rdst); ++ ld(Rdst, in_bytes(ConstMethod::constants_offset()), Rdst); ++} ++ ++void InterpreterMacroAssembler::get_constant_pool_cache(Register Rdst) { ++ get_constant_pool(Rdst); ++ ld(Rdst, ConstantPool::cache_offset_in_bytes(), Rdst); ++} ++ ++void InterpreterMacroAssembler::get_cpool_and_tags(Register Rcpool, Register Rtags) { ++ get_constant_pool(Rcpool); ++ ld(Rtags, ConstantPool::tags_offset_in_bytes(), Rcpool); ++} ++ ++// Unlock if synchronized method. ++// ++// Unlock the receiver if this is a synchronized method. ++// Unlock any Java monitors from synchronized blocks. ++// ++// If there are locked Java monitors ++// If throw_monitor_exception ++// throws IllegalMonitorStateException ++// Else if install_monitor_exception ++// installs IllegalMonitorStateException ++// Else ++// no error processing ++void InterpreterMacroAssembler::unlock_if_synchronized_method(TosState state, ++ bool throw_monitor_exception, ++ bool install_monitor_exception) { ++ Label Lunlocked, Lno_unlock; ++ { ++ Register Rdo_not_unlock_flag = R11_scratch1; ++ Register Raccess_flags = R12_scratch2; ++ ++ // Check if synchronized method or unlocking prevented by ++ // JavaThread::do_not_unlock_if_synchronized flag. ++ lbz(Rdo_not_unlock_flag, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread); ++ lwz(Raccess_flags, in_bytes(Method::access_flags_offset()), R19_method); ++ li(R0, 0); ++ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread); // reset flag ++ ++ push(state); ++ ++ // Skip if we don't have to unlock. ++ rldicl_(R0, Raccess_flags, 64-JVM_ACC_SYNCHRONIZED_BIT, 63); // Extract bit and compare to 0. ++ beq(CCR0, Lunlocked); ++ ++ cmpwi(CCR0, Rdo_not_unlock_flag, 0); ++ bne(CCR0, Lno_unlock); ++ } ++ ++ // Unlock ++ { ++ Register Rmonitor_base = R11_scratch1; ++ ++ Label Lunlock; ++ // If it's still locked, everything is ok, unlock it. ++ ld(Rmonitor_base, 0, R1_SP); ++ addi(Rmonitor_base, Rmonitor_base, - (frame::ijava_state_size + frame::interpreter_frame_monitor_size_in_bytes())); // Monitor base ++ ++ ld(R0, BasicObjectLock::obj_offset_in_bytes(), Rmonitor_base); ++ cmpdi(CCR0, R0, 0); ++ bne(CCR0, Lunlock); ++ ++ // If it's already unlocked, throw exception. ++ if (throw_monitor_exception) { ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception)); ++ should_not_reach_here(); ++ } else { ++ if (install_monitor_exception) { ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::new_illegal_monitor_state_exception)); ++ b(Lunlocked); ++ } ++ } ++ ++ bind(Lunlock); ++ unlock_object(Rmonitor_base); ++ } ++ ++ // Check that all other monitors are unlocked. Throw IllegelMonitorState exception if not. ++ bind(Lunlocked); ++ { ++ Label Lexception, Lrestart; ++ Register Rcurrent_obj_addr = R11_scratch1; ++ const int delta = frame::interpreter_frame_monitor_size_in_bytes(); ++ assert((delta & LongAlignmentMask) == 0, "sizeof BasicObjectLock must be even number of doublewords"); ++ ++ bind(Lrestart); ++ // Set up search loop: Calc num of iterations. ++ { ++ Register Riterations = R12_scratch2; ++ Register Rmonitor_base = Rcurrent_obj_addr; ++ ld(Rmonitor_base, 0, R1_SP); ++ addi(Rmonitor_base, Rmonitor_base, - frame::ijava_state_size); // Monitor base ++ ++ subf_(Riterations, R26_monitor, Rmonitor_base); ++ ble(CCR0, Lno_unlock); ++ ++ addi(Rcurrent_obj_addr, Rmonitor_base, BasicObjectLock::obj_offset_in_bytes() - frame::interpreter_frame_monitor_size_in_bytes()); ++ // Check if any monitor is on stack, bail out if not ++ srdi(Riterations, Riterations, exact_log2(delta)); ++ mtctr(Riterations); ++ } ++ ++ // The search loop: Look for locked monitors. ++ { ++ const Register Rcurrent_obj = R0; ++ Label Lloop; ++ ++ ld(Rcurrent_obj, 0, Rcurrent_obj_addr); ++ addi(Rcurrent_obj_addr, Rcurrent_obj_addr, -delta); ++ bind(Lloop); ++ ++ // Check if current entry is used. ++ cmpdi(CCR0, Rcurrent_obj, 0); ++ bne(CCR0, Lexception); ++ // Preload next iteration's compare value. ++ ld(Rcurrent_obj, 0, Rcurrent_obj_addr); ++ addi(Rcurrent_obj_addr, Rcurrent_obj_addr, -delta); ++ bdnz(Lloop); ++ } ++ // Fell through: Everything's unlocked => finish. ++ b(Lno_unlock); ++ ++ // An object is still locked => need to throw exception. ++ bind(Lexception); ++ if (throw_monitor_exception) { ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception)); ++ should_not_reach_here(); ++ } else { ++ // Stack unrolling. Unlock object and if requested, install illegal_monitor_exception. ++ // Unlock does not block, so don't have to worry about the frame. ++ Register Rmonitor_addr = R11_scratch1; ++ addi(Rmonitor_addr, Rcurrent_obj_addr, -BasicObjectLock::obj_offset_in_bytes() + delta); ++ unlock_object(Rmonitor_addr); ++ if (install_monitor_exception) { ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::new_illegal_monitor_state_exception)); ++ } ++ b(Lrestart); ++ } ++ } ++ ++ align(32, 12); ++ bind(Lno_unlock); ++ pop(state); ++} ++ ++// Support function for remove_activation & Co. ++void InterpreterMacroAssembler::merge_frames(Register Rsender_sp, Register return_pc, Register Rscratch1, Register Rscratch2) { ++ // Pop interpreter frame. ++ ld(Rscratch1, 0, R1_SP); // *SP ++ ld(Rsender_sp, _ijava_state_neg(sender_sp), Rscratch1); // top_frame_sp ++ ld(Rscratch2, 0, Rscratch1); // **SP ++#ifdef ASSERT ++ { ++ Label Lok; ++ ld(R0, _ijava_state_neg(ijava_reserved), Rscratch1); ++ cmpdi(CCR0, R0, 0x5afe); ++ beq(CCR0, Lok); ++ stop("frame corrupted (remove activation)", 0x5afe); ++ bind(Lok); ++ } ++#endif ++ if (return_pc!=noreg) { ++ ld(return_pc, _abi(lr), Rscratch1); // LR ++ } ++ ++ // Merge top frames. ++ subf(Rscratch1, R1_SP, Rsender_sp); // top_frame_sp - SP ++ stdux(Rscratch2, R1_SP, Rscratch1); // atomically set *(SP = top_frame_sp) = **SP ++} ++ ++// Remove activation. ++// ++// Unlock the receiver if this is a synchronized method. ++// Unlock any Java monitors from synchronized blocks. ++// Remove the activation from the stack. ++// ++// If there are locked Java monitors ++// If throw_monitor_exception ++// throws IllegalMonitorStateException ++// Else if install_monitor_exception ++// installs IllegalMonitorStateException ++// Else ++// no error processing ++void InterpreterMacroAssembler::remove_activation(TosState state, ++ bool throw_monitor_exception, ++ bool install_monitor_exception) { ++ unlock_if_synchronized_method(state, throw_monitor_exception, install_monitor_exception); ++ ++ // Save result (push state before jvmti call and pop it afterwards) and notify jvmti. ++ notify_method_exit(false, state, NotifyJVMTI, true); ++ ++ verify_oop(R17_tos, state); ++ verify_thread(); ++ ++ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ R0, R11_scratch1, R12_scratch2); ++ mtlr(R0); ++} ++ ++#endif // !CC_INTERP ++ ++// Lock object ++// ++// Registers alive ++// monitor - Address of the BasicObjectLock to be used for locking, ++// which must be initialized with the object to lock. ++// object - Address of the object to be locked. ++// ++void InterpreterMacroAssembler::lock_object(Register monitor, Register object) { ++ if (UseHeavyMonitors) { ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter), ++ monitor, /*check_for_exceptions=*/true CC_INTERP_ONLY(&& false)); ++ } else { ++ // template code: ++ // ++ // markOop displaced_header = obj->mark().set_unlocked(); ++ // monitor->lock()->set_displaced_header(displaced_header); ++ // if (Atomic::cmpxchg_ptr(/*ex=*/monitor, /*addr*/obj->mark_addr(), /*cmp*/displaced_header) == displaced_header) { ++ // // We stored the monitor address into the object's mark word. ++ // } else if (THREAD->is_lock_owned((address)displaced_header)) ++ // // Simple recursive case. ++ // monitor->lock()->set_displaced_header(NULL); ++ // } else { ++ // // Slow path. ++ // InterpreterRuntime::monitorenter(THREAD, monitor); ++ // } ++ ++ const Register displaced_header = R7_ARG5; ++ const Register object_mark_addr = R8_ARG6; ++ const Register current_header = R9_ARG7; ++ const Register tmp = R10_ARG8; ++ ++ Label done; ++ Label cas_failed, slow_case; ++ ++ assert_different_registers(displaced_header, object_mark_addr, current_header, tmp); ++ ++ // markOop displaced_header = obj->mark().set_unlocked(); ++ ++ // Load markOop from object into displaced_header. ++ ld(displaced_header, oopDesc::mark_offset_in_bytes(), object); ++ ++ if (UseBiasedLocking) { ++ biased_locking_enter(CCR0, object, displaced_header, tmp, current_header, done, &slow_case); ++ } ++ ++ // Set displaced_header to be (markOop of object | UNLOCK_VALUE). ++ ori(displaced_header, displaced_header, markOopDesc::unlocked_value); ++ ++ // monitor->lock()->set_displaced_header(displaced_header); ++ ++ // Initialize the box (Must happen before we update the object mark!). ++ std(displaced_header, BasicObjectLock::lock_offset_in_bytes() + ++ BasicLock::displaced_header_offset_in_bytes(), monitor); ++ ++ // if (Atomic::cmpxchg_ptr(/*ex=*/monitor, /*addr*/obj->mark_addr(), /*cmp*/displaced_header) == displaced_header) { ++ ++ // Store stack address of the BasicObjectLock (this is monitor) into object. ++ addi(object_mark_addr, object, oopDesc::mark_offset_in_bytes()); ++ ++ // Must fence, otherwise, preceding store(s) may float below cmpxchg. ++ // CmpxchgX sets CCR0 to cmpX(current, displaced). ++ fence(); // TODO: replace by MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq ? ++ cmpxchgd(/*flag=*/CCR0, ++ /*current_value=*/current_header, ++ /*compare_value=*/displaced_header, /*exchange_value=*/monitor, ++ /*where=*/object_mark_addr, ++ MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq, ++ MacroAssembler::cmpxchgx_hint_acquire_lock(), ++ noreg, ++ &cas_failed); ++ ++ // If the compare-and-exchange succeeded, then we found an unlocked ++ // object and we have now locked it. ++ b(done); ++ bind(cas_failed); ++ ++ // } else if (THREAD->is_lock_owned((address)displaced_header)) ++ // // Simple recursive case. ++ // monitor->lock()->set_displaced_header(NULL); ++ ++ // We did not see an unlocked object so try the fast recursive case. ++ ++ // Check if owner is self by comparing the value in the markOop of object ++ // (current_header) with the stack pointer. ++ sub(current_header, current_header, R1_SP); ++ ++ assert(os::vm_page_size() > 0xfff, "page size too small - change the constant"); ++ load_const_optimized(tmp, ++ (address) (~(os::vm_page_size()-1) | ++ markOopDesc::lock_mask_in_place)); ++ ++ and_(R0/*==0?*/, current_header, tmp); ++ // If condition is true we are done and hence we can store 0 in the displaced ++ // header indicating it is a recursive lock. ++ bne(CCR0, slow_case); ++ release(); ++ std(R0/*==0!*/, BasicObjectLock::lock_offset_in_bytes() + ++ BasicLock::displaced_header_offset_in_bytes(), monitor); ++ b(done); ++ ++ // } else { ++ // // Slow path. ++ // InterpreterRuntime::monitorenter(THREAD, monitor); ++ ++ // None of the above fast optimizations worked so we have to get into the ++ // slow case of monitor enter. ++ bind(slow_case); ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter), ++ monitor, /*check_for_exceptions=*/true CC_INTERP_ONLY(&& false)); ++ // } ++ align(32, 12); ++ bind(done); ++ } ++} ++ ++// Unlocks an object. Used in monitorexit bytecode and remove_activation. ++// ++// Registers alive ++// monitor - Address of the BasicObjectLock to be used for locking, ++// which must be initialized with the object to lock. ++// ++// Throw IllegalMonitorException if object is not locked by current thread. ++void InterpreterMacroAssembler::unlock_object(Register monitor, bool check_for_exceptions) { ++ if (UseHeavyMonitors) { ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorexit), ++ monitor, check_for_exceptions CC_INTERP_ONLY(&& false)); ++ } else { ++ ++ // template code: ++ // ++ // if ((displaced_header = monitor->displaced_header()) == NULL) { ++ // // Recursive unlock. Mark the monitor unlocked by setting the object field to NULL. ++ // monitor->set_obj(NULL); ++ // } else if (Atomic::cmpxchg_ptr(displaced_header, obj->mark_addr(), monitor) == monitor) { ++ // // We swapped the unlocked mark in displaced_header into the object's mark word. ++ // monitor->set_obj(NULL); ++ // } else { ++ // // Slow path. ++ // InterpreterRuntime::monitorexit(THREAD, monitor); ++ // } ++ ++ const Register object = R7_ARG5; ++ const Register displaced_header = R8_ARG6; ++ const Register object_mark_addr = R9_ARG7; ++ const Register current_header = R10_ARG8; ++ ++ Label free_slot; ++ Label slow_case; ++ ++ assert_different_registers(object, displaced_header, object_mark_addr, current_header); ++ ++ if (UseBiasedLocking) { ++ // The object address from the monitor is in object. ++ ld(object, BasicObjectLock::obj_offset_in_bytes(), monitor); ++ assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0"); ++ biased_locking_exit(CCR0, object, displaced_header, free_slot); ++ } ++ ++ // Test first if we are in the fast recursive case. ++ ld(displaced_header, BasicObjectLock::lock_offset_in_bytes() + ++ BasicLock::displaced_header_offset_in_bytes(), monitor); ++ ++ // If the displaced header is zero, we have a recursive unlock. ++ cmpdi(CCR0, displaced_header, 0); ++ beq(CCR0, free_slot); // recursive unlock ++ ++ // } else if (Atomic::cmpxchg_ptr(displaced_header, obj->mark_addr(), monitor) == monitor) { ++ // // We swapped the unlocked mark in displaced_header into the object's mark word. ++ // monitor->set_obj(NULL); ++ ++ // If we still have a lightweight lock, unlock the object and be done. ++ ++ // The object address from the monitor is in object. ++ if (!UseBiasedLocking) { ld(object, BasicObjectLock::obj_offset_in_bytes(), monitor); } ++ addi(object_mark_addr, object, oopDesc::mark_offset_in_bytes()); ++ ++ // We have the displaced header in displaced_header. If the lock is still ++ // lightweight, it will contain the monitor address and we'll store the ++ // displaced header back into the object's mark word. ++ // CmpxchgX sets CCR0 to cmpX(current, monitor). ++ cmpxchgd(/*flag=*/CCR0, ++ /*current_value=*/current_header, ++ /*compare_value=*/monitor, /*exchange_value=*/displaced_header, ++ /*where=*/object_mark_addr, ++ MacroAssembler::MemBarRel, ++ MacroAssembler::cmpxchgx_hint_release_lock(), ++ noreg, ++ &slow_case); ++ b(free_slot); ++ ++ // } else { ++ // // Slow path. ++ // InterpreterRuntime::monitorexit(THREAD, monitor); ++ ++ // The lock has been converted into a heavy lock and hence ++ // we need to get into the slow case. ++ bind(slow_case); ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorexit), ++ monitor, check_for_exceptions CC_INTERP_ONLY(&& false)); ++ // } ++ ++ Label done; ++ b(done); // Monitor register may be overwritten! Runtime has already freed the slot. ++ ++ // Exchange worked, do monitor->set_obj(NULL); ++ align(32, 12); ++ bind(free_slot); ++ li(R0, 0); ++ std(R0, BasicObjectLock::obj_offset_in_bytes(), monitor); ++ bind(done); ++ } ++} ++ ++#ifndef CC_INTERP ++ ++// Load compiled (i2c) or interpreter entry when calling from interpreted and ++// do the call. Centralized so that all interpreter calls will do the same actions. ++// If jvmti single stepping is on for a thread we must not call compiled code. ++// ++// Input: ++// - Rtarget_method: method to call ++// - Rret_addr: return address ++// - 2 scratch regs ++// ++void InterpreterMacroAssembler::call_from_interpreter(Register Rtarget_method, Register Rret_addr, Register Rscratch1, Register Rscratch2) { ++ assert_different_registers(Rscratch1, Rscratch2, Rtarget_method, Rret_addr); ++ // Assume we want to go compiled if available. ++ const Register Rtarget_addr = Rscratch1; ++ const Register Rinterp_only = Rscratch2; ++ ++ ld(Rtarget_addr, in_bytes(Method::from_interpreted_offset()), Rtarget_method); ++ ++ if (JvmtiExport::can_post_interpreter_events()) { ++ lwz(Rinterp_only, in_bytes(JavaThread::interp_only_mode_offset()), R16_thread); ++ ++ // JVMTI events, such as single-stepping, are implemented partly by avoiding running ++ // compiled code in threads for which the event is enabled. Check here for ++ // interp_only_mode if these events CAN be enabled. ++ Label done; ++ verify_thread(); ++ cmpwi(CCR0, Rinterp_only, 0); ++ beq(CCR0, done); ++ ld(Rtarget_addr, in_bytes(Method::interpreter_entry_offset()), Rtarget_method); ++ align(32, 12); ++ bind(done); ++ } ++ ++#ifdef ASSERT ++ { ++ Label Lok; ++ cmpdi(CCR0, Rtarget_addr, 0); ++ bne(CCR0, Lok); ++ stop("null entry point"); ++ bind(Lok); ++ } ++#endif // ASSERT ++ ++ mr(R21_sender_SP, R1_SP); ++ ++ // Calc a precise SP for the call. The SP value we calculated in ++ // generate_fixed_frame() is based on the max_stack() value, so we would waste stack space ++ // if esp is not max. Also, the i2c adapter extends the stack space without restoring ++ // our pre-calced value, so repeating calls via i2c would result in stack overflow. ++ // Since esp already points to an empty slot, we just have to sub 1 additional slot ++ // to meet the abi scratch requirements. ++ // The max_stack pointer will get restored by means of the GR_Lmax_stack local in ++ // the return entry of the interpreter. ++ addi(Rscratch2, R15_esp, Interpreter::stackElementSize - frame::abi_reg_args_size); ++ clrrdi(Rscratch2, Rscratch2, exact_log2(frame::alignment_in_bytes)); // round towards smaller address ++ resize_frame_absolute(Rscratch2, Rscratch2, R0); ++ ++ mr_if_needed(R19_method, Rtarget_method); ++ mtctr(Rtarget_addr); ++ mtlr(Rret_addr); ++ ++ save_interpreter_state(Rscratch2); ++#ifdef ASSERT ++ ld(Rscratch1, _ijava_state_neg(top_frame_sp), Rscratch2); // Rscratch2 contains fp ++ cmpd(CCR0, R21_sender_SP, Rscratch1); ++ asm_assert_eq("top_frame_sp incorrect", 0x951); ++#endif ++ ++ bctr(); ++} ++ ++// Set the method data pointer for the current bcp. ++void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ Label get_continue; ++ ld(R28_mdx, in_bytes(Method::method_data_offset()), R19_method); ++ test_method_data_pointer(get_continue); ++ call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::bcp_to_di), R19_method, R14_bcp); ++ ++ addi(R28_mdx, R28_mdx, in_bytes(MethodData::data_offset())); ++ add(R28_mdx, R28_mdx, R3_RET); ++ bind(get_continue); ++} ++ ++// Test ImethodDataPtr. If it is null, continue at the specified label. ++void InterpreterMacroAssembler::test_method_data_pointer(Label& zero_continue) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ cmpdi(CCR0, R28_mdx, 0); ++ beq(CCR0, zero_continue); ++} ++ ++void InterpreterMacroAssembler::verify_method_data_pointer() { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++#ifdef ASSERT ++ Label verify_continue; ++ test_method_data_pointer(verify_continue); ++ ++ // If the mdp is valid, it will point to a DataLayout header which is ++ // consistent with the bcp. The converse is highly probable also. ++ lhz(R11_scratch1, in_bytes(DataLayout::bci_offset()), R28_mdx); ++ ld(R12_scratch2, in_bytes(Method::const_offset()), R19_method); ++ addi(R11_scratch1, R11_scratch1, in_bytes(ConstMethod::codes_offset())); ++ add(R11_scratch1, R12_scratch2, R12_scratch2); ++ cmpd(CCR0, R11_scratch1, R14_bcp); ++ beq(CCR0, verify_continue); ++ ++ call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::verify_mdp ), R19_method, R14_bcp, R28_mdx); ++ ++ bind(verify_continue); ++#endif ++} ++ ++void InterpreterMacroAssembler::test_invocation_counter_for_mdp(Register invocation_count, ++ Register Rscratch, ++ Label &profile_continue) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ // Control will flow to "profile_continue" if the counter is less than the ++ // limit or if we call profile_method(). ++ Label done; ++ ++ // If no method data exists, and the counter is high enough, make one. ++ int ipl_offs = load_const_optimized(Rscratch, &InvocationCounter::InterpreterProfileLimit, R0, true); ++ lwz(Rscratch, ipl_offs, Rscratch); ++ ++ cmpdi(CCR0, R28_mdx, 0); ++ // Test to see if we should create a method data oop. ++ cmpd(CCR1, Rscratch /* InterpreterProfileLimit */, invocation_count); ++ bne(CCR0, done); ++ bge(CCR1, profile_continue); ++ ++ // Build it now. ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method)); ++ set_method_data_pointer_for_bcp(); ++ b(profile_continue); ++ ++ align(32, 12); ++ bind(done); ++} ++ ++void InterpreterMacroAssembler::test_backedge_count_for_osr(Register backedge_count, Register branch_bcp, Register Rtmp) { ++ assert_different_registers(backedge_count, Rtmp, branch_bcp); ++ assert(UseOnStackReplacement,"Must UseOnStackReplacement to test_backedge_count_for_osr"); ++ ++ Label did_not_overflow; ++ Label overflow_with_error; ++ ++ int ibbl_offs = load_const_optimized(Rtmp, &InvocationCounter::InterpreterBackwardBranchLimit, R0, true); ++ lwz(Rtmp, ibbl_offs, Rtmp); ++ cmpw(CCR0, backedge_count, Rtmp); ++ ++ blt(CCR0, did_not_overflow); ++ ++ // When ProfileInterpreter is on, the backedge_count comes from the ++ // methodDataOop, which value does not get reset on the call to ++ // frequency_counter_overflow(). To avoid excessive calls to the overflow ++ // routine while the method is being compiled, add a second test to make sure ++ // the overflow function is called only once every overflow_frequency. ++ if (ProfileInterpreter) { ++ const int overflow_frequency = 1024; ++ li(Rtmp, overflow_frequency-1); ++ andr(Rtmp, Rtmp, backedge_count); ++ cmpwi(CCR0, Rtmp, 0); ++ bne(CCR0, did_not_overflow); ++ } ++ ++ // Overflow in loop, pass branch bytecode. ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), branch_bcp, true); ++ ++ // Was an OSR adapter generated? ++ // O0 = osr nmethod ++ cmpdi(CCR0, R3_RET, 0); ++ beq(CCR0, overflow_with_error); ++ ++ // Has the nmethod been invalidated already? ++ lwz(Rtmp, nmethod::entry_bci_offset(), R3_RET); ++ cmpwi(CCR0, Rtmp, InvalidOSREntryBci); ++ beq(CCR0, overflow_with_error); ++ ++ // Migrate the interpreter frame off of the stack. ++ // We can use all registers because we will not return to interpreter from this point. ++ ++ // Save nmethod. ++ const Register osr_nmethod = R31; ++ mr(osr_nmethod, R3_RET); ++ set_top_ijava_frame_at_SP_as_last_Java_frame(R1_SP, R11_scratch1); ++ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin), R16_thread); ++ reset_last_Java_frame(); ++ // OSR buffer is in ARG1 ++ ++ // Remove the interpreter frame. ++ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ R0, R11_scratch1, R12_scratch2); ++ ++ // Jump to the osr code. ++ ld(R11_scratch1, nmethod::osr_entry_point_offset(), osr_nmethod); ++ mtlr(R0); ++ mtctr(R11_scratch1); ++ bctr(); ++ ++ align(32, 12); ++ bind(overflow_with_error); ++ bind(did_not_overflow); ++} ++ ++// Store a value at some constant offset from the method data pointer. ++void InterpreterMacroAssembler::set_mdp_data_at(int constant, Register value) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ ++ std(value, constant, R28_mdx); ++} ++ ++// Increment the value at some constant offset from the method data pointer. ++void InterpreterMacroAssembler::increment_mdp_data_at(int constant, ++ Register counter_addr, ++ Register Rbumped_count, ++ bool decrement) { ++ // Locate the counter at a fixed offset from the mdp: ++ addi(counter_addr, R28_mdx, constant); ++ increment_mdp_data_at(counter_addr, Rbumped_count, decrement); ++} ++ ++// Increment the value at some non-fixed (reg + constant) offset from ++// the method data pointer. ++void InterpreterMacroAssembler::increment_mdp_data_at(Register reg, ++ int constant, ++ Register scratch, ++ Register Rbumped_count, ++ bool decrement) { ++ // Add the constant to reg to get the offset. ++ add(scratch, R28_mdx, reg); ++ // Then calculate the counter address. ++ addi(scratch, scratch, constant); ++ increment_mdp_data_at(scratch, Rbumped_count, decrement); ++} ++ ++void InterpreterMacroAssembler::increment_mdp_data_at(Register counter_addr, ++ Register Rbumped_count, ++ bool decrement) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ ++ // Load the counter. ++ ld(Rbumped_count, 0, counter_addr); ++ ++ if (decrement) { ++ // Decrement the register. Set condition codes. ++ addi(Rbumped_count, Rbumped_count, - DataLayout::counter_increment); ++ // Store the decremented counter, if it is still negative. ++ std(Rbumped_count, 0, counter_addr); ++ // Note: add/sub overflow check are not ported, since 64 bit ++ // calculation should never overflow. ++ } else { ++ // Increment the register. Set carry flag. ++ addi(Rbumped_count, Rbumped_count, DataLayout::counter_increment); ++ // Store the incremented counter. ++ std(Rbumped_count, 0, counter_addr); ++ } ++} ++ ++// Set a flag value at the current method data pointer position. ++void InterpreterMacroAssembler::set_mdp_flag_at(int flag_constant, ++ Register scratch) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ // Load the data header. ++ lbz(scratch, in_bytes(DataLayout::flags_offset()), R28_mdx); ++ // Set the flag. ++ ori(scratch, scratch, flag_constant); ++ // Store the modified header. ++ stb(scratch, in_bytes(DataLayout::flags_offset()), R28_mdx); ++} ++ ++// Test the location at some offset from the method data pointer. ++// If it is not equal to value, branch to the not_equal_continue Label. ++void InterpreterMacroAssembler::test_mdp_data_at(int offset, ++ Register value, ++ Label& not_equal_continue, ++ Register test_out) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ ++ ld(test_out, offset, R28_mdx); ++ cmpd(CCR0, value, test_out); ++ bne(CCR0, not_equal_continue); ++} ++ ++// Update the method data pointer by the displacement located at some fixed ++// offset from the method data pointer. ++void InterpreterMacroAssembler::update_mdp_by_offset(int offset_of_disp, ++ Register scratch) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ ++ ld(scratch, offset_of_disp, R28_mdx); ++ add(R28_mdx, scratch, R28_mdx); ++} ++ ++// Update the method data pointer by the displacement located at the ++// offset (reg + offset_of_disp). ++void InterpreterMacroAssembler::update_mdp_by_offset(Register reg, ++ int offset_of_disp, ++ Register scratch) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ ++ add(scratch, reg, R28_mdx); ++ ld(scratch, offset_of_disp, scratch); ++ add(R28_mdx, scratch, R28_mdx); ++} ++ ++// Update the method data pointer by a simple constant displacement. ++void InterpreterMacroAssembler::update_mdp_by_constant(int constant) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ addi(R28_mdx, R28_mdx, constant); ++} ++ ++// Update the method data pointer for a _ret bytecode whose target ++// was not among our cached targets. ++void InterpreterMacroAssembler::update_mdp_for_ret(TosState state, ++ Register return_bci) { ++ assert(ProfileInterpreter, "must be profiling interpreter"); ++ ++ push(state); ++ assert(return_bci->is_nonvolatile(), "need to protect return_bci"); ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::update_mdp_for_ret), return_bci); ++ pop(state); ++} ++ ++// Increments the backedge counter. ++// Returns backedge counter + invocation counter in Rdst. ++void InterpreterMacroAssembler::increment_backedge_counter(const Register Rcounters, const Register Rdst, ++ const Register Rtmp1, Register Rscratch) { ++ assert(UseCompiler, "incrementing must be useful"); ++ assert_different_registers(Rdst, Rtmp1); ++ const Register invocation_counter = Rtmp1; ++ const Register counter = Rdst; ++ // TODO ppc port assert(4 == InvocationCounter::sz_counter(), "unexpected field size."); ++ ++ // Load backedge counter. ++ lwz(counter, in_bytes(MethodCounters::backedge_counter_offset()) + ++ in_bytes(InvocationCounter::counter_offset()), Rcounters); ++ // Load invocation counter. ++ lwz(invocation_counter, in_bytes(MethodCounters::invocation_counter_offset()) + ++ in_bytes(InvocationCounter::counter_offset()), Rcounters); ++ ++ // Add the delta to the backedge counter. ++ addi(counter, counter, InvocationCounter::count_increment); ++ ++ // Mask the invocation counter. ++ li(Rscratch, InvocationCounter::count_mask_value); ++ andr(invocation_counter, invocation_counter, Rscratch); ++ ++ // Store new counter value. ++ stw(counter, in_bytes(MethodCounters::backedge_counter_offset()) + ++ in_bytes(InvocationCounter::counter_offset()), Rcounters); ++ // Return invocation counter + backedge counter. ++ add(counter, counter, invocation_counter); ++} ++ ++// Count a taken branch in the bytecodes. ++void InterpreterMacroAssembler::profile_taken_branch(Register scratch, Register bumped_count) { ++ if (ProfileInterpreter) { ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ // We are taking a branch. Increment the taken count. ++ increment_mdp_data_at(in_bytes(JumpData::taken_offset()), scratch, bumped_count); ++ ++ // The method data pointer needs to be updated to reflect the new target. ++ update_mdp_by_offset(in_bytes(JumpData::displacement_offset()), scratch); ++ bind (profile_continue); ++ } ++} ++ ++// Count a not-taken branch in the bytecodes. ++void InterpreterMacroAssembler::profile_not_taken_branch(Register scratch1, Register scratch2) { ++ if (ProfileInterpreter) { ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ // We are taking a branch. Increment the not taken count. ++ increment_mdp_data_at(in_bytes(BranchData::not_taken_offset()), scratch1, scratch2); ++ ++ // The method data pointer needs to be updated to correspond to the ++ // next bytecode. ++ update_mdp_by_constant(in_bytes(BranchData::branch_data_size())); ++ bind (profile_continue); ++ } ++} ++ ++// Count a non-virtual call in the bytecodes. ++void InterpreterMacroAssembler::profile_call(Register scratch1, Register scratch2) { ++ if (ProfileInterpreter) { ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ // We are making a call. Increment the count. ++ increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2); ++ ++ // The method data pointer needs to be updated to reflect the new target. ++ update_mdp_by_constant(in_bytes(CounterData::counter_data_size())); ++ bind (profile_continue); ++ } ++} ++ ++// Count a final call in the bytecodes. ++void InterpreterMacroAssembler::profile_final_call(Register scratch1, Register scratch2) { ++ if (ProfileInterpreter) { ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ // We are making a call. Increment the count. ++ increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2); ++ ++ // The method data pointer needs to be updated to reflect the new target. ++ update_mdp_by_constant(in_bytes(VirtualCallData::virtual_call_data_size())); ++ bind (profile_continue); ++ } ++} ++ ++// Count a virtual call in the bytecodes. ++void InterpreterMacroAssembler::profile_virtual_call(Register Rreceiver, ++ Register Rscratch1, ++ Register Rscratch2, ++ bool receiver_can_be_null) { ++ if (!ProfileInterpreter) { return; } ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ Label skip_receiver_profile; ++ if (receiver_can_be_null) { ++ Label not_null; ++ cmpdi(CCR0, Rreceiver, 0); ++ bne(CCR0, not_null); ++ // We are making a call. Increment the count for null receiver. ++ increment_mdp_data_at(in_bytes(CounterData::count_offset()), Rscratch1, Rscratch2); ++ b(skip_receiver_profile); ++ bind(not_null); ++ } ++ ++ // Record the receiver type. ++ record_klass_in_profile(Rreceiver, Rscratch1, Rscratch2, true); ++ bind(skip_receiver_profile); ++ ++ // The method data pointer needs to be updated to reflect the new target. ++ update_mdp_by_constant(in_bytes(VirtualCallData::virtual_call_data_size())); ++ bind (profile_continue); ++} ++ ++void InterpreterMacroAssembler::profile_typecheck(Register Rklass, Register Rscratch1, Register Rscratch2) { ++ if (ProfileInterpreter) { ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ int mdp_delta = in_bytes(BitData::bit_data_size()); ++ if (TypeProfileCasts) { ++ mdp_delta = in_bytes(VirtualCallData::virtual_call_data_size()); ++ ++ // Record the object type. ++ record_klass_in_profile(Rklass, Rscratch1, Rscratch2, false); ++ } ++ ++ // The method data pointer needs to be updated. ++ update_mdp_by_constant(mdp_delta); ++ ++ bind (profile_continue); ++ } ++} ++ ++void InterpreterMacroAssembler::profile_typecheck_failed(Register Rscratch1, Register Rscratch2) { ++ if (ProfileInterpreter && TypeProfileCasts) { ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ int count_offset = in_bytes(CounterData::count_offset()); ++ // Back up the address, since we have already bumped the mdp. ++ count_offset -= in_bytes(VirtualCallData::virtual_call_data_size()); ++ ++ // *Decrement* the counter. We expect to see zero or small negatives. ++ increment_mdp_data_at(count_offset, Rscratch1, Rscratch2, true); ++ ++ bind (profile_continue); ++ } ++} ++ ++// Count a ret in the bytecodes. ++void InterpreterMacroAssembler::profile_ret(TosState state, Register return_bci, Register scratch1, Register scratch2) { ++ if (ProfileInterpreter) { ++ Label profile_continue; ++ uint row; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ // Update the total ret count. ++ increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2 ); ++ ++ for (row = 0; row < RetData::row_limit(); row++) { ++ Label next_test; ++ ++ // See if return_bci is equal to bci[n]: ++ test_mdp_data_at(in_bytes(RetData::bci_offset(row)), return_bci, next_test, scratch1); ++ ++ // return_bci is equal to bci[n]. Increment the count. ++ increment_mdp_data_at(in_bytes(RetData::bci_count_offset(row)), scratch1, scratch2); ++ ++ // The method data pointer needs to be updated to reflect the new target. ++ update_mdp_by_offset(in_bytes(RetData::bci_displacement_offset(row)), scratch1); ++ b(profile_continue); ++ bind(next_test); ++ } ++ ++ update_mdp_for_ret(state, return_bci); ++ ++ bind (profile_continue); ++ } ++} ++ ++// Count the default case of a switch construct. ++void InterpreterMacroAssembler::profile_switch_default(Register scratch1, Register scratch2) { ++ if (ProfileInterpreter) { ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ // Update the default case count ++ increment_mdp_data_at(in_bytes(MultiBranchData::default_count_offset()), ++ scratch1, scratch2); ++ ++ // The method data pointer needs to be updated. ++ update_mdp_by_offset(in_bytes(MultiBranchData::default_displacement_offset()), ++ scratch1); ++ ++ bind (profile_continue); ++ } ++} ++ ++// Count the index'th case of a switch construct. ++void InterpreterMacroAssembler::profile_switch_case(Register index, ++ Register scratch1, ++ Register scratch2, ++ Register scratch3) { ++ if (ProfileInterpreter) { ++ assert_different_registers(index, scratch1, scratch2, scratch3); ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ // Build the base (index * per_case_size_in_bytes()) + case_array_offset_in_bytes(). ++ li(scratch3, in_bytes(MultiBranchData::case_array_offset())); ++ ++ assert (in_bytes(MultiBranchData::per_case_size()) == 16, "so that shladd works"); ++ sldi(scratch1, index, exact_log2(in_bytes(MultiBranchData::per_case_size()))); ++ add(scratch1, scratch1, scratch3); ++ ++ // Update the case count. ++ increment_mdp_data_at(scratch1, in_bytes(MultiBranchData::relative_count_offset()), scratch2, scratch3); ++ ++ // The method data pointer needs to be updated. ++ update_mdp_by_offset(scratch1, in_bytes(MultiBranchData::relative_displacement_offset()), scratch2); ++ ++ bind (profile_continue); ++ } ++} ++ ++void InterpreterMacroAssembler::profile_null_seen(Register Rscratch1, Register Rscratch2) { ++ if (ProfileInterpreter) { ++ assert_different_registers(Rscratch1, Rscratch2); ++ Label profile_continue; ++ ++ // If no method data exists, go to profile_continue. ++ test_method_data_pointer(profile_continue); ++ ++ set_mdp_flag_at(BitData::null_seen_byte_constant(), Rscratch1); ++ ++ // The method data pointer needs to be updated. ++ int mdp_delta = in_bytes(BitData::bit_data_size()); ++ if (TypeProfileCasts) { ++ mdp_delta = in_bytes(VirtualCallData::virtual_call_data_size()); ++ } ++ update_mdp_by_constant(mdp_delta); ++ ++ bind (profile_continue); ++ } ++} ++ ++void InterpreterMacroAssembler::record_klass_in_profile(Register Rreceiver, ++ Register Rscratch1, Register Rscratch2, ++ bool is_virtual_call) { ++ assert(ProfileInterpreter, "must be profiling"); ++ assert_different_registers(Rreceiver, Rscratch1, Rscratch2); ++ ++ Label done; ++ record_klass_in_profile_helper(Rreceiver, Rscratch1, Rscratch2, 0, done, is_virtual_call); ++ bind (done); ++} ++ ++void InterpreterMacroAssembler::record_klass_in_profile_helper( ++ Register receiver, Register scratch1, Register scratch2, ++ int start_row, Label& done, bool is_virtual_call) { ++ if (TypeProfileWidth == 0) { ++ if (is_virtual_call) { ++ increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2); ++ } ++ return; ++ } ++ ++ int last_row = VirtualCallData::row_limit() - 1; ++ assert(start_row <= last_row, "must be work left to do"); ++ // Test this row for both the receiver and for null. ++ // Take any of three different outcomes: ++ // 1. found receiver => increment count and goto done ++ // 2. found null => keep looking for case 1, maybe allocate this cell ++ // 3. found something else => keep looking for cases 1 and 2 ++ // Case 3 is handled by a recursive call. ++ for (int row = start_row; row <= last_row; row++) { ++ Label next_test; ++ bool test_for_null_also = (row == start_row); ++ ++ // See if the receiver is receiver[n]. ++ int recvr_offset = in_bytes(VirtualCallData::receiver_offset(row)); ++ test_mdp_data_at(recvr_offset, receiver, next_test, scratch1); ++ // delayed()->tst(scratch); ++ ++ // The receiver is receiver[n]. Increment count[n]. ++ int count_offset = in_bytes(VirtualCallData::receiver_count_offset(row)); ++ increment_mdp_data_at(count_offset, scratch1, scratch2); ++ b(done); ++ bind(next_test); ++ ++ if (test_for_null_also) { ++ Label found_null; ++ // Failed the equality check on receiver[n]... Test for null. ++ if (start_row == last_row) { ++ // The only thing left to do is handle the null case. ++ if (is_virtual_call) { ++ // Scratch1 contains test_out from test_mdp_data_at. ++ cmpdi(CCR0, scratch1, 0); ++ beq(CCR0, found_null); ++ // Receiver did not match any saved receiver and there is no empty row for it. ++ // Increment total counter to indicate polymorphic case. ++ increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2); ++ b(done); ++ bind(found_null); ++ } else { ++ cmpdi(CCR0, scratch1, 0); ++ bne(CCR0, done); ++ } ++ break; ++ } ++ // Since null is rare, make it be the branch-taken case. ++ cmpdi(CCR0, scratch1, 0); ++ beq(CCR0, found_null); ++ ++ // Put all the "Case 3" tests here. ++ record_klass_in_profile_helper(receiver, scratch1, scratch2, start_row + 1, done, is_virtual_call); ++ ++ // Found a null. Keep searching for a matching receiver, ++ // but remember that this is an empty (unused) slot. ++ bind(found_null); ++ } ++ } ++ ++ // In the fall-through case, we found no matching receiver, but we ++ // observed the receiver[start_row] is NULL. ++ ++ // Fill in the receiver field and increment the count. ++ int recvr_offset = in_bytes(VirtualCallData::receiver_offset(start_row)); ++ set_mdp_data_at(recvr_offset, receiver); ++ int count_offset = in_bytes(VirtualCallData::receiver_count_offset(start_row)); ++ li(scratch1, DataLayout::counter_increment); ++ set_mdp_data_at(count_offset, scratch1); ++ if (start_row > 0) { ++ b(done); ++ } ++} ++ ++// Add a InterpMonitorElem to stack (see frame_sparc.hpp). ++void InterpreterMacroAssembler::add_monitor_to_stack(bool stack_is_empty, Register Rtemp1, Register Rtemp2) { ++ ++ // Very-local scratch registers. ++ const Register esp = Rtemp1; ++ const Register slot = Rtemp2; ++ ++ // Extracted monitor_size. ++ int monitor_size = frame::interpreter_frame_monitor_size_in_bytes(); ++ assert(Assembler::is_aligned((unsigned int)monitor_size, ++ (unsigned int)frame::alignment_in_bytes), ++ "size of a monitor must respect alignment of SP"); ++ ++ resize_frame(-monitor_size, /*temp*/esp); // Allocate space for new monitor ++ std(R1_SP, _ijava_state_neg(top_frame_sp), esp); // esp contains fp ++ ++ // Shuffle expression stack down. Recall that stack_base points ++ // just above the new expression stack bottom. Old_tos and new_tos ++ // are used to scan thru the old and new expression stacks. ++ if (!stack_is_empty) { ++ Label copy_slot, copy_slot_finished; ++ const Register n_slots = slot; ++ ++ addi(esp, R15_esp, Interpreter::stackElementSize); // Point to first element (pre-pushed stack). ++ subf(n_slots, esp, R26_monitor); ++ srdi_(n_slots, n_slots, LogBytesPerWord); // Compute number of slots to copy. ++ assert(LogBytesPerWord == 3, "conflicts assembler instructions"); ++ beq(CCR0, copy_slot_finished); // Nothing to copy. ++ ++ mtctr(n_slots); ++ ++ // loop ++ bind(copy_slot); ++ ld(slot, 0, esp); // Move expression stack down. ++ std(slot, -monitor_size, esp); // distance = monitor_size ++ addi(esp, esp, BytesPerWord); ++ bdnz(copy_slot); ++ ++ bind(copy_slot_finished); ++ } ++ ++ addi(R15_esp, R15_esp, -monitor_size); ++ addi(R26_monitor, R26_monitor, -monitor_size); ++ ++ // Restart interpreter ++} ++ ++// ============================================================================ ++// Java locals access ++ ++// Load a local variable at index in Rindex into register Rdst_value. ++// Also puts address of local into Rdst_address as a service. ++// Kills: ++// - Rdst_value ++// - Rdst_address ++void InterpreterMacroAssembler::load_local_int(Register Rdst_value, Register Rdst_address, Register Rindex) { ++ sldi(Rdst_address, Rindex, Interpreter::logStackElementSize); ++ subf(Rdst_address, Rdst_address, R18_locals); ++ lwz(Rdst_value, 0, Rdst_address); ++} ++ ++// Load a local variable at index in Rindex into register Rdst_value. ++// Also puts address of local into Rdst_address as a service. ++// Kills: ++// - Rdst_value ++// - Rdst_address ++void InterpreterMacroAssembler::load_local_long(Register Rdst_value, Register Rdst_address, Register Rindex) { ++ sldi(Rdst_address, Rindex, Interpreter::logStackElementSize); ++ subf(Rdst_address, Rdst_address, R18_locals); ++ ld(Rdst_value, -8, Rdst_address); ++} ++ ++// Load a local variable at index in Rindex into register Rdst_value. ++// Also puts address of local into Rdst_address as a service. ++// Input: ++// - Rindex: slot nr of local variable ++// Kills: ++// - Rdst_value ++// - Rdst_address ++void InterpreterMacroAssembler::load_local_ptr(Register Rdst_value, Register Rdst_address, Register Rindex) { ++ sldi(Rdst_address, Rindex, Interpreter::logStackElementSize); ++ subf(Rdst_address, Rdst_address, R18_locals); ++ ld(Rdst_value, 0, Rdst_address); ++} ++ ++// Load a local variable at index in Rindex into register Rdst_value. ++// Also puts address of local into Rdst_address as a service. ++// Kills: ++// - Rdst_value ++// - Rdst_address ++void InterpreterMacroAssembler::load_local_float(FloatRegister Rdst_value, Register Rdst_address, Register Rindex) { ++ sldi(Rdst_address, Rindex, Interpreter::logStackElementSize); ++ subf(Rdst_address, Rdst_address, R18_locals); ++ lfs(Rdst_value, 0, Rdst_address); ++} ++ ++// Load a local variable at index in Rindex into register Rdst_value. ++// Also puts address of local into Rdst_address as a service. ++// Kills: ++// - Rdst_value ++// - Rdst_address ++void InterpreterMacroAssembler::load_local_double(FloatRegister Rdst_value, Register Rdst_address, Register Rindex) { ++ sldi(Rdst_address, Rindex, Interpreter::logStackElementSize); ++ subf(Rdst_address, Rdst_address, R18_locals); ++ lfd(Rdst_value, -8, Rdst_address); ++} ++ ++// Store an int value at local variable slot Rindex. ++// Kills: ++// - Rindex ++void InterpreterMacroAssembler::store_local_int(Register Rvalue, Register Rindex) { ++ sldi(Rindex, Rindex, Interpreter::logStackElementSize); ++ subf(Rindex, Rindex, R18_locals); ++ stw(Rvalue, 0, Rindex); ++} ++ ++// Store a long value at local variable slot Rindex. ++// Kills: ++// - Rindex ++void InterpreterMacroAssembler::store_local_long(Register Rvalue, Register Rindex) { ++ sldi(Rindex, Rindex, Interpreter::logStackElementSize); ++ subf(Rindex, Rindex, R18_locals); ++ std(Rvalue, -8, Rindex); ++} ++ ++// Store an oop value at local variable slot Rindex. ++// Kills: ++// - Rindex ++void InterpreterMacroAssembler::store_local_ptr(Register Rvalue, Register Rindex) { ++ sldi(Rindex, Rindex, Interpreter::logStackElementSize); ++ subf(Rindex, Rindex, R18_locals); ++ std(Rvalue, 0, Rindex); ++} ++ ++// Store an int value at local variable slot Rindex. ++// Kills: ++// - Rindex ++void InterpreterMacroAssembler::store_local_float(FloatRegister Rvalue, Register Rindex) { ++ sldi(Rindex, Rindex, Interpreter::logStackElementSize); ++ subf(Rindex, Rindex, R18_locals); ++ stfs(Rvalue, 0, Rindex); ++} ++ ++// Store an int value at local variable slot Rindex. ++// Kills: ++// - Rindex ++void InterpreterMacroAssembler::store_local_double(FloatRegister Rvalue, Register Rindex) { ++ sldi(Rindex, Rindex, Interpreter::logStackElementSize); ++ subf(Rindex, Rindex, R18_locals); ++ stfd(Rvalue, -8, Rindex); ++} ++ ++// Read pending exception from thread and jump to interpreter. ++// Throw exception entry if one if pending. Fall through otherwise. ++void InterpreterMacroAssembler::check_and_forward_exception(Register Rscratch1, Register Rscratch2) { ++ assert_different_registers(Rscratch1, Rscratch2, R3); ++ Register Rexception = Rscratch1; ++ Register Rtmp = Rscratch2; ++ Label Ldone; ++ // Get pending exception oop. ++ ld(Rexception, thread_(pending_exception)); ++ cmpdi(CCR0, Rexception, 0); ++ beq(CCR0, Ldone); ++ li(Rtmp, 0); ++ mr_if_needed(R3, Rexception); ++ std(Rtmp, thread_(pending_exception)); // Clear exception in thread ++ if (Interpreter::rethrow_exception_entry() != NULL) { ++ // Already got entry address. ++ load_dispatch_table(Rtmp, (address*)Interpreter::rethrow_exception_entry()); ++ } else { ++ // Dynamically load entry address. ++ int simm16_rest = load_const_optimized(Rtmp, &Interpreter::_rethrow_exception_entry, R0, true); ++ ld(Rtmp, simm16_rest, Rtmp); ++ } ++ mtctr(Rtmp); ++ save_interpreter_state(Rtmp); ++ bctr(); ++ ++ align(32, 12); ++ bind(Ldone); ++} ++ ++void InterpreterMacroAssembler::call_VM(Register oop_result, address entry_point, bool check_exceptions) { ++ save_interpreter_state(R11_scratch1); ++ ++ MacroAssembler::call_VM(oop_result, entry_point, false); ++ ++ restore_interpreter_state(R11_scratch1, /*bcp_and_mdx_only*/ true); ++ ++ check_and_handle_popframe(R11_scratch1); ++ check_and_handle_earlyret(R11_scratch1); ++ // Now check exceptions manually. ++ if (check_exceptions) { ++ check_and_forward_exception(R11_scratch1, R12_scratch2); ++ } ++} ++ ++void InterpreterMacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions) { ++ // ARG1 is reserved for the thread. ++ mr_if_needed(R4_ARG2, arg_1); ++ call_VM(oop_result, entry_point, check_exceptions); ++} ++ ++void InterpreterMacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions) { ++ // ARG1 is reserved for the thread. ++ mr_if_needed(R4_ARG2, arg_1); ++ assert(arg_2 != R4_ARG2, "smashed argument"); ++ mr_if_needed(R5_ARG3, arg_2); ++ call_VM(oop_result, entry_point, check_exceptions); ++} ++ ++void InterpreterMacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions) { ++ // ARG1 is reserved for the thread. ++ mr_if_needed(R4_ARG2, arg_1); ++ assert(arg_2 != R4_ARG2, "smashed argument"); ++ mr_if_needed(R5_ARG3, arg_2); ++ assert(arg_3 != R4_ARG2 && arg_3 != R5_ARG3, "smashed argument"); ++ mr_if_needed(R6_ARG4, arg_3); ++ call_VM(oop_result, entry_point, check_exceptions); ++} ++ ++void InterpreterMacroAssembler::save_interpreter_state(Register scratch) { ++ ld(scratch, 0, R1_SP); ++ std(R15_esp, _ijava_state_neg(esp), scratch); ++ std(R14_bcp, _ijava_state_neg(bcp), scratch); ++ std(R26_monitor, _ijava_state_neg(monitors), scratch); ++ if (ProfileInterpreter) { std(R28_mdx, _ijava_state_neg(mdx), scratch); } ++ // Other entries should be unchanged. ++} ++ ++void InterpreterMacroAssembler::restore_interpreter_state(Register scratch, bool bcp_and_mdx_only) { ++ ld(scratch, 0, R1_SP); ++ ld(R14_bcp, _ijava_state_neg(bcp), scratch); // Changed by VM code (exception). ++ if (ProfileInterpreter) { ld(R28_mdx, _ijava_state_neg(mdx), scratch); } // Changed by VM code. ++ if (!bcp_and_mdx_only) { ++ // Following ones are Metadata. ++ ld(R19_method, _ijava_state_neg(method), scratch); ++ ld(R27_constPoolCache, _ijava_state_neg(cpoolCache), scratch); ++ // Following ones are stack addresses and don't require reload. ++ ld(R15_esp, _ijava_state_neg(esp), scratch); ++ ld(R18_locals, _ijava_state_neg(locals), scratch); ++ ld(R26_monitor, _ijava_state_neg(monitors), scratch); ++ } ++#ifdef ASSERT ++ { ++ Label Lok; ++ subf(R0, R1_SP, scratch); ++ cmpdi(CCR0, R0, frame::abi_reg_args_size + frame::ijava_state_size); ++ bge(CCR0, Lok); ++ stop("frame too small (restore istate)", 0x5432); ++ bind(Lok); ++ } ++ { ++ Label Lok; ++ ld(R0, _ijava_state_neg(ijava_reserved), scratch); ++ cmpdi(CCR0, R0, 0x5afe); ++ beq(CCR0, Lok); ++ stop("frame corrupted (restore istate)", 0x5afe); ++ bind(Lok); ++ } ++#endif ++} ++ ++#endif // !CC_INTERP ++ ++void InterpreterMacroAssembler::get_method_counters(Register method, ++ Register Rcounters, ++ Label& skip) { ++ BLOCK_COMMENT("Load and ev. allocate counter object {"); ++ Label has_counters; ++ ld(Rcounters, in_bytes(Method::method_counters_offset()), method); ++ cmpdi(CCR0, Rcounters, 0); ++ bne(CCR0, has_counters); ++ call_VM(noreg, CAST_FROM_FN_PTR(address, ++ InterpreterRuntime::build_method_counters), method, false); ++ ld(Rcounters, in_bytes(Method::method_counters_offset()), method); ++ cmpdi(CCR0, Rcounters, 0); ++ beq(CCR0, skip); // No MethodCounters, OutOfMemory. ++ BLOCK_COMMENT("} Load and ev. allocate counter object"); ++ ++ bind(has_counters); ++} ++ ++void InterpreterMacroAssembler::increment_invocation_counter(Register Rcounters, Register iv_be_count, Register Rtmp_r0) { ++ assert(UseCompiler, "incrementing must be useful"); ++ Register invocation_count = iv_be_count; ++ Register backedge_count = Rtmp_r0; ++ int delta = InvocationCounter::count_increment; ++ ++ // Load each counter in a register. ++ // ld(inv_counter, Rtmp); ++ // ld(be_counter, Rtmp2); ++ int inv_counter_offset = in_bytes(MethodCounters::invocation_counter_offset() + ++ InvocationCounter::counter_offset()); ++ int be_counter_offset = in_bytes(MethodCounters::backedge_counter_offset() + ++ InvocationCounter::counter_offset()); ++ ++ BLOCK_COMMENT("Increment profiling counters {"); ++ ++ // Load the backedge counter. ++ lwz(backedge_count, be_counter_offset, Rcounters); // is unsigned int ++ // Mask the backedge counter. ++ Register tmp = invocation_count; ++ li(tmp, InvocationCounter::count_mask_value); ++ andr(backedge_count, tmp, backedge_count); // Cannot use andi, need sign extension of count_mask_value. ++ ++ // Load the invocation counter. ++ lwz(invocation_count, inv_counter_offset, Rcounters); // is unsigned int ++ // Add the delta to the invocation counter and store the result. ++ addi(invocation_count, invocation_count, delta); ++ // Store value. ++ stw(invocation_count, inv_counter_offset, Rcounters); ++ ++ // Add invocation counter + backedge counter. ++ add(iv_be_count, backedge_count, invocation_count); ++ ++ // Note that this macro must leave the backedge_count + invocation_count in ++ // register iv_be_count! ++ BLOCK_COMMENT("} Increment profiling counters"); ++} ++ ++void InterpreterMacroAssembler::verify_oop(Register reg, TosState state) { ++ if (state == atos) { MacroAssembler::verify_oop(reg); } ++} ++ ++#ifndef CC_INTERP ++// Local helper function for the verify_oop_or_return_address macro. ++static bool verify_return_address(Method* m, int bci) { ++#ifndef PRODUCT ++ address pc = (address)(m->constMethod()) + in_bytes(ConstMethod::codes_offset()) + bci; ++ // Assume it is a valid return address if it is inside m and is preceded by a jsr. ++ if (!m->contains(pc)) return false; ++ address jsr_pc; ++ jsr_pc = pc - Bytecodes::length_for(Bytecodes::_jsr); ++ if (*jsr_pc == Bytecodes::_jsr && jsr_pc >= m->code_base()) return true; ++ jsr_pc = pc - Bytecodes::length_for(Bytecodes::_jsr_w); ++ if (*jsr_pc == Bytecodes::_jsr_w && jsr_pc >= m->code_base()) return true; ++#endif // PRODUCT ++ return false; ++} ++ ++void InterpreterMacroAssembler::verify_FPU(int stack_depth, TosState state) { ++ if (VerifyFPU) { ++ unimplemented("verfiyFPU"); ++ } ++} ++ ++void InterpreterMacroAssembler::verify_oop_or_return_address(Register reg, Register Rtmp) { ++ if (!VerifyOops) return; ++ ++ // The VM documentation for the astore[_wide] bytecode allows ++ // the TOS to be not only an oop but also a return address. ++ Label test; ++ Label skip; ++ // See if it is an address (in the current method): ++ ++ const int log2_bytecode_size_limit = 16; ++ srdi_(Rtmp, reg, log2_bytecode_size_limit); ++ bne(CCR0, test); ++ ++ address fd = CAST_FROM_FN_PTR(address, verify_return_address); ++ unsigned int nbytes_save = 10*8; // 10 volatile gprs ++ ++ save_LR_CR(Rtmp); ++ push_frame_reg_args(nbytes_save, Rtmp); ++ save_volatile_gprs(R1_SP, 112); // except R0 ++ ++ load_const_optimized(Rtmp, fd, R0); ++ mr_if_needed(R4_ARG2, reg); ++ mr(R3_ARG1, R19_method); ++ call_c(Rtmp); // call C ++ ++ restore_volatile_gprs(R1_SP, 112); // except R0 ++ pop_frame(); ++ restore_LR_CR(Rtmp); ++ b(skip); ++ ++ // Perform a more elaborate out-of-line call. ++ // Not an address; verify it: ++ bind(test); ++ verify_oop(reg); ++ bind(skip); ++} ++#endif // !CC_INTERP ++ ++// Inline assembly for: ++// ++// if (thread is in interp_only_mode) { ++// InterpreterRuntime::post_method_entry(); ++// } ++// if (*jvmpi::event_flags_array_at_addr(JVMPI_EVENT_METHOD_ENTRY ) || ++// *jvmpi::event_flags_array_at_addr(JVMPI_EVENT_METHOD_ENTRY2) ) { ++// SharedRuntime::jvmpi_method_entry(method, receiver); ++// } ++void InterpreterMacroAssembler::notify_method_entry() { ++ // JVMTI ++ // Whenever JVMTI puts a thread in interp_only_mode, method ++ // entry/exit events are sent for that thread to track stack ++ // depth. If it is possible to enter interp_only_mode we add ++ // the code to check if the event should be sent. ++ if (JvmtiExport::can_post_interpreter_events()) { ++ Label jvmti_post_done; ++ ++ lwz(R0, in_bytes(JavaThread::interp_only_mode_offset()), R16_thread); ++ cmpwi(CCR0, R0, 0); ++ beq(CCR0, jvmti_post_done); ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_method_entry), ++ /*check_exceptions=*/true CC_INTERP_ONLY(&& false)); ++ ++ bind(jvmti_post_done); ++ } ++} ++ ++// Inline assembly for: ++// ++// if (thread is in interp_only_mode) { ++// // save result ++// InterpreterRuntime::post_method_exit(); ++// // restore result ++// } ++// if (*jvmpi::event_flags_array_at_addr(JVMPI_EVENT_METHOD_EXIT)) { ++// // save result ++// SharedRuntime::jvmpi_method_exit(); ++// // restore result ++// } ++// ++// Native methods have their result stored in d_tmp and l_tmp. ++// Java methods have their result stored in the expression stack. ++void InterpreterMacroAssembler::notify_method_exit(bool is_native_method, TosState state, ++ NotifyMethodExitMode mode, bool check_exceptions) { ++ // JVMTI ++ // Whenever JVMTI puts a thread in interp_only_mode, method ++ // entry/exit events are sent for that thread to track stack ++ // depth. If it is possible to enter interp_only_mode we add ++ // the code to check if the event should be sent. ++ if (mode == NotifyJVMTI && JvmtiExport::can_post_interpreter_events()) { ++ Label jvmti_post_done; ++ ++ lwz(R0, in_bytes(JavaThread::interp_only_mode_offset()), R16_thread); ++ cmpwi(CCR0, R0, 0); ++ beq(CCR0, jvmti_post_done); ++ CC_INTERP_ONLY(assert(is_native_method && !check_exceptions, "must not push state")); ++ if (!is_native_method) push(state); // Expose tos to GC. ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_method_exit), ++ /*check_exceptions=*/check_exceptions); ++ if (!is_native_method) pop(state); ++ ++ align(32, 12); ++ bind(jvmti_post_done); ++ } ++ ++ // Dtrace support not implemented. ++} ++ ++#ifdef CC_INTERP ++// Convert the current TOP_IJAVA_FRAME into a PARENT_IJAVA_FRAME ++// (using parent_frame_resize) and push a new interpreter ++// TOP_IJAVA_FRAME (using frame_size). ++void InterpreterMacroAssembler::push_interpreter_frame(Register top_frame_size, Register parent_frame_resize, ++ Register tmp1, Register tmp2, Register tmp3, ++ Register tmp4, Register pc) { ++ assert_different_registers(top_frame_size, parent_frame_resize, tmp1, tmp2, tmp3, tmp4); ++ ld(tmp1, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ mr(tmp2/*top_frame_sp*/, R1_SP); ++ // Move initial_caller_sp. ++ ld(tmp4, _top_ijava_frame_abi(initial_caller_sp), R1_SP); ++ neg(parent_frame_resize, parent_frame_resize); ++ resize_frame(parent_frame_resize/*-parent_frame_resize*/, tmp3); ++ ++ // Set LR in new parent frame. ++ std(tmp1, _abi(lr), R1_SP); ++ // Set top_frame_sp info for new parent frame. ++ std(tmp2, _parent_ijava_frame_abi(top_frame_sp), R1_SP); ++ std(tmp4, _parent_ijava_frame_abi(initial_caller_sp), R1_SP); ++ ++ // Push new TOP_IJAVA_FRAME. ++ push_frame(top_frame_size, tmp2); ++ ++ get_PC_trash_LR(tmp3); ++ std(tmp3, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ // Used for non-initial callers by unextended_sp(). ++ std(R1_SP, _top_ijava_frame_abi(initial_caller_sp), R1_SP); ++} ++ ++// Pop the topmost TOP_IJAVA_FRAME and convert the previous ++// PARENT_IJAVA_FRAME back into a TOP_IJAVA_FRAME. ++void InterpreterMacroAssembler::pop_interpreter_frame(Register tmp1, Register tmp2, Register tmp3, Register tmp4) { ++ assert_different_registers(tmp1, tmp2, tmp3, tmp4); ++ ++ ld(tmp1/*caller's sp*/, _abi(callers_sp), R1_SP); ++ ld(tmp3, _abi(lr), tmp1); ++ ++ ld(tmp4, _parent_ijava_frame_abi(initial_caller_sp), tmp1); ++ ++ ld(tmp2/*caller's caller's sp*/, _abi(callers_sp), tmp1); ++ // Merge top frame. ++ std(tmp2, _abi(callers_sp), R1_SP); ++ ++ ld(tmp2, _parent_ijava_frame_abi(top_frame_sp), tmp1); ++ ++ // Update C stack pointer to caller's top_abi. ++ resize_frame_absolute(tmp2/*addr*/, tmp1/*tmp*/, tmp2/*tmp*/); ++ ++ // Update LR in top_frame. ++ std(tmp3, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ ++ std(tmp4, _top_ijava_frame_abi(initial_caller_sp), R1_SP); ++ ++ // Store the top-frame stack-pointer for c2i adapters. ++ std(R1_SP, _top_ijava_frame_abi(top_frame_sp), R1_SP); ++} ++ ++// Turn state's interpreter frame into the current TOP_IJAVA_FRAME. ++void InterpreterMacroAssembler::pop_interpreter_frame_to_state(Register state, Register tmp1, Register tmp2, Register tmp3) { ++ assert_different_registers(R14_state, R15_prev_state, tmp1, tmp2, tmp3); ++ ++ if (state == R14_state) { ++ ld(tmp1/*state's fp*/, state_(_last_Java_fp)); ++ ld(tmp2/*state's sp*/, state_(_last_Java_sp)); ++ } else if (state == R15_prev_state) { ++ ld(tmp1/*state's fp*/, prev_state_(_last_Java_fp)); ++ ld(tmp2/*state's sp*/, prev_state_(_last_Java_sp)); ++ } else { ++ ShouldNotReachHere(); ++ } ++ ++ // Merge top frames. ++ std(tmp1, _abi(callers_sp), R1_SP); ++ ++ // Tmp2 is new SP. ++ // Tmp1 is parent's SP. ++ resize_frame_absolute(tmp2/*addr*/, tmp1/*tmp*/, tmp2/*tmp*/); ++ ++ // Update LR in top_frame. ++ // Must be interpreter frame. ++ get_PC_trash_LR(tmp3); ++ std(tmp3, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ // Used for non-initial callers by unextended_sp(). ++ std(R1_SP, _top_ijava_frame_abi(initial_caller_sp), R1_SP); ++} ++ ++// Set SP to initial caller's sp, but before fix the back chain. ++void InterpreterMacroAssembler::resize_frame_to_initial_caller(Register tmp1, Register tmp2) { ++ ld(tmp1, _parent_ijava_frame_abi(initial_caller_sp), R1_SP); ++ ld(tmp2, _parent_ijava_frame_abi(callers_sp), R1_SP); ++ std(tmp2, _parent_ijava_frame_abi(callers_sp), tmp1); // Fix back chain ... ++ mr(R1_SP, tmp1); // ... and resize to initial caller. ++} ++ ++// Pop the current interpreter state (without popping the correspoding ++// frame) and restore R14_state and R15_prev_state accordingly. ++// Use prev_state_may_be_0 to indicate whether prev_state may be 0 ++// in order to generate an extra check before retrieving prev_state_(_prev_link). ++void InterpreterMacroAssembler::pop_interpreter_state(bool prev_state_may_be_0) ++{ ++ // Move prev_state to state and restore prev_state from state_(_prev_link). ++ Label prev_state_is_0; ++ mr(R14_state, R15_prev_state); ++ ++ // Don't retrieve /*state==*/prev_state_(_prev_link) ++ // if /*state==*/prev_state is 0. ++ if (prev_state_may_be_0) { ++ cmpdi(CCR0, R15_prev_state, 0); ++ beq(CCR0, prev_state_is_0); ++ } ++ ++ ld(R15_prev_state, /*state==*/prev_state_(_prev_link)); ++ bind(prev_state_is_0); ++} ++ ++void InterpreterMacroAssembler::restore_prev_state() { ++ // _prev_link is private, but cInterpreter is a friend. ++ ld(R15_prev_state, state_(_prev_link)); ++} ++#endif // CC_INTERP +--- ./hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,301 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_INTERP_MASM_PPC_64_HPP ++#define CPU_PPC_VM_INTERP_MASM_PPC_64_HPP ++ ++#include "asm/macroAssembler.hpp" ++#include "interpreter/invocationCounter.hpp" ++ ++// This file specializes the assembler with interpreter-specific macros. ++ ++ ++class InterpreterMacroAssembler: public MacroAssembler { ++ ++ public: ++ InterpreterMacroAssembler(CodeBuffer* code) : MacroAssembler(code) {} ++ ++ void null_check_throw(Register a, int offset, Register temp_reg); ++ ++ void branch_to_entry(address entry, Register Rscratch); ++ ++ // Handy address generation macros. ++#define thread_(field_name) in_bytes(JavaThread::field_name ## _offset()), R16_thread ++#define method_(field_name) in_bytes(Method::field_name ## _offset()), R19_method ++ ++#ifdef CC_INTERP ++#define state_(field_name) in_bytes(byte_offset_of(BytecodeInterpreter, field_name)), R14_state ++#define prev_state_(field_name) in_bytes(byte_offset_of(BytecodeInterpreter, field_name)), R15_prev_state ++ void pop (TosState state) {}; // Not needed. ++ void push(TosState state) {}; // Not needed. ++#endif ++ ++#ifndef CC_INTERP ++ virtual void check_and_handle_popframe(Register java_thread); ++ virtual void check_and_handle_earlyret(Register java_thread); ++ ++ // Base routine for all dispatches. ++ void dispatch_base(TosState state, address* table); ++ ++ void load_earlyret_value(TosState state, Register Rscratch1); ++ ++ static const Address l_tmp; ++ static const Address d_tmp; ++ ++ // dispatch routines ++ void dispatch_next(TosState state, int step = 0); ++ void dispatch_via (TosState state, address* table); ++ void load_dispatch_table(Register dst, address* table); ++ void dispatch_Lbyte_code(TosState state, Register bytecode, address* table, bool verify = false); ++ ++ // Called by shared interpreter generator. ++ void dispatch_prolog(TosState state, int step = 0); ++ void dispatch_epilog(TosState state, int step = 0); ++ ++ // Super call_VM calls - correspond to MacroAssembler::call_VM(_leaf) calls. ++ void super_call_VM_leaf(Register thread_cache, address entry_point, Register arg_1); ++ void super_call_VM(Register thread_cache, Register oop_result, Register last_java_sp, ++ address entry_point, Register arg_1, Register arg_2, bool check_exception = true); ++ ++ // Generate a subtype check: branch to ok_is_subtype if sub_klass is ++ // a subtype of super_klass. Blows registers tmp1, tmp2 and tmp3. ++ void gen_subtype_check(Register sub_klass, Register super_klass, ++ Register tmp1, Register tmp2, Register tmp3, Label &ok_is_subtype); ++ ++ // Load object from cpool->resolved_references(index). ++ void load_resolved_reference_at_index(Register result, Register index); ++ ++ void generate_stack_overflow_check_with_compare_and_throw(Register Rmem_frame_size, Register Rscratch1); ++ void load_receiver(Register Rparam_count, Register Rrecv_dst); ++ ++ // helpers for expression stack ++ void pop_i( Register r = R17_tos); ++ void pop_ptr( Register r = R17_tos); ++ void pop_l( Register r = R17_tos); ++ void pop_f(FloatRegister f = F15_ftos); ++ void pop_d(FloatRegister f = F15_ftos ); ++ ++ void push_i( Register r = R17_tos); ++ void push_ptr( Register r = R17_tos); ++ void push_l( Register r = R17_tos); ++ void push_f(FloatRegister f = F15_ftos ); ++ void push_d(FloatRegister f = F15_ftos); ++ ++ void push_2ptrs(Register first, Register second); ++ ++ void push_l_pop_d(Register l = R17_tos, FloatRegister d = F15_ftos); ++ void push_d_pop_l(FloatRegister d = F15_ftos, Register l = R17_tos); ++ ++ void pop (TosState state); // transition vtos -> state ++ void push(TosState state); // transition state -> vtos ++ void empty_expression_stack(); // Resets both Lesp and SP. ++ ++ public: ++ // Load values from bytecode stream: ++ ++ enum signedOrNot { Signed, Unsigned }; ++ enum setCCOrNot { set_CC, dont_set_CC }; ++ ++ void get_2_byte_integer_at_bcp(int bcp_offset, ++ Register Rdst, ++ signedOrNot is_signed); ++ ++ void get_4_byte_integer_at_bcp(int bcp_offset, ++ Register Rdst, ++ signedOrNot is_signed = Unsigned); ++ ++ void get_cache_index_at_bcp(Register Rdst, int bcp_offset, size_t index_size); ++ ++ void get_cache_and_index_at_bcp(Register cache, int bcp_offset, size_t index_size = sizeof(u2)); ++ ++ ++ // common code ++ ++ void field_offset_at(int n, Register tmp, Register dest, Register base); ++ int field_offset_at(Register object, address bcp, int offset); ++ void fast_iaaccess(int n, address bcp); ++ void fast_iagetfield(address bcp); ++ void fast_iaputfield(address bcp, bool do_store_check); ++ ++ void index_check(Register array, Register index, int index_shift, Register tmp, Register res); ++ void index_check_without_pop(Register array, Register index, int index_shift, Register tmp, Register res); ++ ++ void get_const(Register Rdst); ++ void get_constant_pool(Register Rdst); ++ void get_constant_pool_cache(Register Rdst); ++ void get_cpool_and_tags(Register Rcpool, Register Rtags); ++ void is_a(Label& L); ++ ++ // Java Call Helpers ++ void call_from_interpreter(Register Rtarget_method, Register Rret_addr, Register Rscratch1, Register Rscratch2); ++ ++ // -------------------------------------------------- ++ ++ void unlock_if_synchronized_method(TosState state, bool throw_monitor_exception = true, ++ bool install_monitor_exception = true); ++ ++ // Removes the current activation (incl. unlocking of monitors). ++ // Additionally this code is used for earlyReturn in which case we ++ // want to skip throwing an exception and installing an exception. ++ void remove_activation(TosState state, ++ bool throw_monitor_exception = true, ++ bool install_monitor_exception = true); ++ void merge_frames(Register Rtop_frame_sp, Register return_pc, Register Rscratch1, Register Rscratch2); // merge top frames ++ ++ void add_monitor_to_stack(bool stack_is_empty, Register Rtemp1, Register Rtemp2); ++ ++ // Local variable access helpers ++ void load_local_int(Register Rdst_value, Register Rdst_address, Register Rindex); ++ void load_local_long(Register Rdst_value, Register Rdst_address, Register Rindex); ++ void load_local_ptr(Register Rdst_value, Register Rdst_address, Register Rindex); ++ void load_local_float(FloatRegister Rdst_value, Register Rdst_address, Register Rindex); ++ void load_local_double(FloatRegister Rdst_value, Register Rdst_address, Register Rindex); ++ void store_local_int(Register Rvalue, Register Rindex); ++ void store_local_long(Register Rvalue, Register Rindex); ++ void store_local_ptr(Register Rvalue, Register Rindex); ++ void store_local_float(FloatRegister Rvalue, Register Rindex); ++ void store_local_double(FloatRegister Rvalue, Register Rindex); ++ ++ // Call VM for std frames ++ // Special call VM versions that check for exceptions and forward exception ++ // via short cut (not via expensive forward exception stub). ++ void check_and_forward_exception(Register Rscratch1, Register Rscratch2); ++ void call_VM(Register oop_result, address entry_point, bool check_exceptions = true); ++ void call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions = true); ++ void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true); ++ void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true); ++ // Should not be used: ++ void call_VM(Register oop_result, Register last_java_sp, address entry_point, bool check_exceptions = true) {ShouldNotReachHere();} ++ void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, bool check_exceptions = true) {ShouldNotReachHere();} ++ void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true) {ShouldNotReachHere();} ++ void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true) {ShouldNotReachHere();} ++ ++ Address first_local_in_stack(); ++ ++ enum LoadOrStore { load, store }; ++ void static_iload_or_store(int which_local, LoadOrStore direction, Register Rtmp); ++ void static_aload_or_store(int which_local, LoadOrStore direction, Register Rtmp); ++ void static_dload_or_store(int which_local, LoadOrStore direction); ++ ++ void save_interpreter_state(Register scratch); ++ void restore_interpreter_state(Register scratch, bool bcp_and_mdx_only = false); ++ ++ void increment_backedge_counter(const Register Rcounters, Register Rtmp, Register Rtmp2, Register Rscratch); ++ void test_backedge_count_for_osr(Register backedge_count, Register branch_bcp, Register Rtmp); ++ ++ void record_static_call_in_profile(Register Rentry, Register Rtmp); ++ void record_receiver_call_in_profile(Register Rklass, Register Rentry, Register Rtmp); ++#endif // !CC_INTERP ++ ++ void get_method_counters(Register method, Register Rcounters, Label& skip); ++ void increment_invocation_counter(Register iv_be_count, Register Rtmp1, Register Rtmp2_r0); ++ ++ // Object locking ++ void lock_object (Register lock_reg, Register obj_reg); ++ void unlock_object(Register lock_reg, bool check_for_exceptions = true); ++ ++#ifndef CC_INTERP ++ ++ // Interpreter profiling operations ++ void set_method_data_pointer_for_bcp(); ++ void test_method_data_pointer(Label& zero_continue); ++ void verify_method_data_pointer(); ++ void test_invocation_counter_for_mdp(Register invocation_count, Register Rscratch, Label &profile_continue); ++ ++ void set_mdp_data_at(int constant, Register value); ++ ++ void increment_mdp_data_at(int constant, Register counter_addr, Register Rbumped_count, bool decrement = false); ++ ++ void increment_mdp_data_at(Register counter_addr, Register Rbumped_count, bool decrement = false); ++ void increment_mdp_data_at(Register reg, int constant, Register scratch, Register Rbumped_count, bool decrement = false); ++ ++ void set_mdp_flag_at(int flag_constant, Register scratch); ++ void test_mdp_data_at(int offset, Register value, Label& not_equal_continue, Register test_out); ++ ++ void update_mdp_by_offset(int offset_of_disp, Register scratch); ++ void update_mdp_by_offset(Register reg, int offset_of_disp, ++ Register scratch); ++ void update_mdp_by_constant(int constant); ++ void update_mdp_for_ret(TosState state, Register return_bci); ++ ++ void profile_taken_branch(Register scratch, Register bumped_count); ++ void profile_not_taken_branch(Register scratch1, Register scratch2); ++ void profile_call(Register scratch1, Register scratch2); ++ void profile_final_call(Register scratch1, Register scratch2); ++ void profile_virtual_call(Register Rreceiver, Register Rscratch1, Register Rscratch2, bool receiver_can_be_null); ++ void profile_typecheck(Register Rklass, Register Rscratch1, Register Rscratch2); ++ void profile_typecheck_failed(Register Rscratch1, Register Rscratch2); ++ void profile_ret(TosState state, Register return_bci, Register scratch1, Register scratch2); ++ void profile_switch_default(Register scratch1, Register scratch2); ++ void profile_switch_case(Register index, Register scratch1,Register scratch2, Register scratch3); ++ void profile_null_seen(Register Rscratch1, Register Rscratch2); ++ void record_klass_in_profile(Register receiver, Register scratch1, Register scratch2, bool is_virtual_call); ++ void record_klass_in_profile_helper(Register receiver, Register scratch1, Register scratch2, int start_row, Label& done, bool is_virtual_call); ++ ++#endif // !CC_INTERP ++ ++ // Debugging ++ void verify_oop(Register reg, TosState state = atos); // only if +VerifyOops && state == atos ++#ifndef CC_INTERP ++ void verify_oop_or_return_address(Register reg, Register rtmp); // for astore ++ void verify_FPU(int stack_depth, TosState state = ftos); ++#endif // !CC_INTERP ++ ++ typedef enum { NotifyJVMTI, SkipNotifyJVMTI } NotifyMethodExitMode; ++ ++ // Support for jvmdi/jvmpi. ++ void notify_method_entry(); ++ void notify_method_exit(bool is_native_method, TosState state, ++ NotifyMethodExitMode mode, bool check_exceptions); ++ ++#ifdef CC_INTERP ++ // Convert the current TOP_IJAVA_FRAME into a PARENT_IJAVA_FRAME ++ // (using parent_frame_resize) and push a new interpreter ++ // TOP_IJAVA_FRAME (using frame_size). ++ void push_interpreter_frame(Register top_frame_size, Register parent_frame_resize, ++ Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register pc=noreg); ++ ++ // Pop the topmost TOP_IJAVA_FRAME and convert the previous ++ // PARENT_IJAVA_FRAME back into a TOP_IJAVA_FRAME. ++ void pop_interpreter_frame(Register tmp1, Register tmp2, Register tmp3, Register tmp4); ++ ++ // Turn state's interpreter frame into the current TOP_IJAVA_FRAME. ++ void pop_interpreter_frame_to_state(Register state, Register tmp1, Register tmp2, Register tmp3); ++ ++ // Set SP to initial caller's sp, but before fix the back chain. ++ void resize_frame_to_initial_caller(Register tmp1, Register tmp2); ++ ++ // Pop the current interpreter state (without popping the ++ // correspoding frame) and restore R14_state and R15_prev_state ++ // accordingly. Use prev_state_may_be_0 to indicate whether ++ // prev_state may be 0 in order to generate an extra check before ++ // retrieving prev_state_(_prev_link). ++ void pop_interpreter_state(bool prev_state_may_be_0); ++ ++ void restore_prev_state(); ++#endif ++}; ++ ++#endif // CPU_PPC_VM_INTERP_MASM_PPC_64_HPP +--- ./hotspot/src/cpu/ppc/vm/interpreterGenerator_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/interpreterGenerator_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_INTERPRETERGENERATOR_PPC_HPP ++#define CPU_PPC_VM_INTERPRETERGENERATOR_PPC_HPP ++ ++ friend class AbstractInterpreterGenerator; ++ ++ private: ++ ++ address generate_abstract_entry(void); ++ address generate_accessor_entry(void); ++ address generate_Reference_get_entry(void); ++ ++#endif // CPU_PPC_VM_INTERPRETERGENERATOR_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/interpreterRT_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/interpreterRT_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,155 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "asm/assembler.inline.hpp" ++#include "interpreter/interpreter.hpp" ++#include "interpreter/interpreterRuntime.hpp" ++#include "memory/allocation.inline.hpp" ++#include "memory/universe.inline.hpp" ++#include "oops/method.hpp" ++#include "oops/oop.inline.hpp" ++#include "runtime/handles.inline.hpp" ++#include "runtime/icache.hpp" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/signature.hpp" ++ ++#define __ _masm-> ++ ++// Access macros for Java and C arguments. ++// The first Java argument is at index -1. ++#define locals_j_arg_at(index) (Interpreter::local_offset_in_bytes(index)), R18_locals ++// The first C argument is at index 0. ++#define sp_c_arg_at(index) ((index)*wordSize + _abi(carg_1)), R1_SP ++ ++// Implementation of SignatureHandlerGenerator ++ ++void InterpreterRuntime::SignatureHandlerGenerator::pass_int() { ++ Argument jni_arg(jni_offset()); ++ Register r = jni_arg.is_register() ? jni_arg.as_register() : R0; ++ ++ __ lwa(r, locals_j_arg_at(offset())); // sign extension of integer ++ if (DEBUG_ONLY(true ||) !jni_arg.is_register()) { ++ __ std(r, sp_c_arg_at(jni_arg.number())); ++ } ++} ++ ++void InterpreterRuntime::SignatureHandlerGenerator::pass_long() { ++ Argument jni_arg(jni_offset()); ++ Register r = jni_arg.is_register() ? jni_arg.as_register() : R0; ++ ++ __ ld(r, locals_j_arg_at(offset()+1)); // long resides in upper slot ++ if (DEBUG_ONLY(true ||) !jni_arg.is_register()) { ++ __ std(r, sp_c_arg_at(jni_arg.number())); ++ } ++} ++ ++void InterpreterRuntime::SignatureHandlerGenerator::pass_float() { ++ FloatRegister fp_reg = (_num_used_fp_arg_regs < 13/*max_fp_register_arguments*/) ++ ? as_FloatRegister((_num_used_fp_arg_regs++) + F1_ARG1->encoding()) ++ : F0; ++ ++ __ lfs(fp_reg, locals_j_arg_at(offset())); ++ if (DEBUG_ONLY(true ||) jni_offset() > 8) { ++ __ stfs(fp_reg, sp_c_arg_at(jni_offset())); ++ } ++} ++ ++void InterpreterRuntime::SignatureHandlerGenerator::pass_double() { ++ FloatRegister fp_reg = (_num_used_fp_arg_regs < 13/*max_fp_register_arguments*/) ++ ? as_FloatRegister((_num_used_fp_arg_regs++) + F1_ARG1->encoding()) ++ : F0; ++ ++ __ lfd(fp_reg, locals_j_arg_at(offset()+1)); ++ if (DEBUG_ONLY(true ||) jni_offset() > 8) { ++ __ stfd(fp_reg, sp_c_arg_at(jni_offset())); ++ } ++} ++ ++void InterpreterRuntime::SignatureHandlerGenerator::pass_object() { ++ Argument jni_arg(jni_offset()); ++ Register r = jni_arg.is_register() ? jni_arg.as_register() : R11_scratch1; ++ ++ // The handle for a receiver will never be null. ++ bool do_NULL_check = offset() != 0 || is_static(); ++ ++ Label do_null; ++ if (do_NULL_check) { ++ __ ld(R0, locals_j_arg_at(offset())); ++ __ cmpdi(CCR0, R0, 0); ++ __ li(r, 0); ++ __ beq(CCR0, do_null); ++ } ++ __ addir(r, locals_j_arg_at(offset())); ++ __ bind(do_null); ++ if (DEBUG_ONLY(true ||) !jni_arg.is_register()) { ++ __ std(r, sp_c_arg_at(jni_arg.number())); ++ } ++} ++ ++void InterpreterRuntime::SignatureHandlerGenerator::generate(uint64_t fingerprint) { ++#if !defined(ABI_ELFv2) ++ // Emit fd for current codebuffer. Needs patching! ++ __ emit_fd(); ++#endif ++ ++ // Generate code to handle arguments. ++ iterate(fingerprint); ++ ++ // Return the result handler. ++ __ load_const(R3_RET, AbstractInterpreter::result_handler(method()->result_type())); ++ __ blr(); ++ ++ __ flush(); ++} ++ ++#undef __ ++ ++// Implementation of SignatureHandlerLibrary ++ ++void SignatureHandlerLibrary::pd_set_handler(address handler) { ++#if !defined(ABI_ELFv2) ++ // patch fd here. ++ FunctionDescriptor* fd = (FunctionDescriptor*) handler; ++ ++ fd->set_entry(handler + (int)sizeof(FunctionDescriptor)); ++ assert(fd->toc() == (address)0xcafe, "need to adjust TOC here"); ++#endif ++} ++ ++ ++// Access function to get the signature. ++IRT_ENTRY(address, InterpreterRuntime::get_signature(JavaThread* thread, Method* method)) ++ methodHandle m(thread, method); ++ assert(m->is_native(), "sanity check"); ++ Symbol *s = m->signature(); ++ return (address) s->base(); ++IRT_END ++ ++IRT_ENTRY(address, InterpreterRuntime::get_result_handler(JavaThread* thread, Method* method)) ++ methodHandle m(thread, method); ++ assert(m->is_native(), "sanity check"); ++ return AbstractInterpreter::result_handler(m->result_type()); ++IRT_END +--- ./hotspot/src/cpu/ppc/vm/interpreterRT_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/interpreterRT_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,62 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_INTERPRETERRT_PPC_HPP ++#define CPU_PPC_VM_INTERPRETERRT_PPC_HPP ++ ++#include "memory/allocation.hpp" ++ ++// native method calls ++ ++class SignatureHandlerGenerator: public NativeSignatureIterator { ++ private: ++ MacroAssembler* _masm; ++ // number of already used floating-point argument registers ++ int _num_used_fp_arg_regs; ++ ++ void pass_int(); ++ void pass_long(); ++ void pass_double(); ++ void pass_float(); ++ void pass_object(); ++ ++ public: ++ // Creation ++ SignatureHandlerGenerator(methodHandle method, CodeBuffer* buffer) : NativeSignatureIterator(method) { ++ _masm = new MacroAssembler(buffer); ++ _num_used_fp_arg_regs = 0; ++ } ++ ++ // Code generation ++ void generate(uint64_t fingerprint); ++}; ++ ++// Support for generate_slow_signature_handler. ++static address get_result_handler(JavaThread* thread, Method* method); ++ ++// A function to get the signature. ++static address get_signature(JavaThread* thread, Method* method); ++ ++#endif // CPU_PPC_VM_INTERPRETERRT_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/interpreter_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/interpreter_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,787 @@ ++/* ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/assembler.hpp" ++#include "asm/macroAssembler.inline.hpp" ++#include "interpreter/bytecodeHistogram.hpp" ++#include "interpreter/interpreter.hpp" ++#include "interpreter/interpreterGenerator.hpp" ++#include "interpreter/interpreterRuntime.hpp" ++#include "interpreter/templateTable.hpp" ++#include "oops/arrayOop.hpp" ++#include "oops/methodData.hpp" ++#include "oops/method.hpp" ++#include "oops/oop.inline.hpp" ++#include "prims/jvmtiExport.hpp" ++#include "prims/jvmtiThreadState.hpp" ++#include "prims/methodHandles.hpp" ++#include "runtime/arguments.hpp" ++#include "runtime/deoptimization.hpp" ++#include "runtime/frame.inline.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "runtime/synchronizer.hpp" ++#include "runtime/timer.hpp" ++#include "runtime/vframeArray.hpp" ++#include "utilities/debug.hpp" ++#ifdef COMPILER1 ++#include "c1/c1_Runtime1.hpp" ++#endif ++ ++#define __ _masm-> ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) // nothing ++#else ++#define BLOCK_COMMENT(str) __ block_comment(str) ++#endif ++ ++#define BIND(label) bind(label); BLOCK_COMMENT(#label ":") ++ ++int AbstractInterpreter::BasicType_as_index(BasicType type) { ++ int i = 0; ++ switch (type) { ++ case T_BOOLEAN: i = 0; break; ++ case T_CHAR : i = 1; break; ++ case T_BYTE : i = 2; break; ++ case T_SHORT : i = 3; break; ++ case T_INT : i = 4; break; ++ case T_LONG : i = 5; break; ++ case T_VOID : i = 6; break; ++ case T_FLOAT : i = 7; break; ++ case T_DOUBLE : i = 8; break; ++ case T_OBJECT : i = 9; break; ++ case T_ARRAY : i = 9; break; ++ default : ShouldNotReachHere(); ++ } ++ assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers, "index out of bounds"); ++ return i; ++} ++ ++address AbstractInterpreterGenerator::generate_slow_signature_handler() { ++ // Slow_signature handler that respects the PPC C calling conventions. ++ // ++ // We get called by the native entry code with our output register ++ // area == 8. First we call InterpreterRuntime::get_result_handler ++ // to copy the pointer to the signature string temporarily to the ++ // first C-argument and to return the result_handler in ++ // R3_RET. Since native_entry will copy the jni-pointer to the ++ // first C-argument slot later on, it is OK to occupy this slot ++ // temporarilly. Then we copy the argument list on the java ++ // expression stack into native varargs format on the native stack ++ // and load arguments into argument registers. Integer arguments in ++ // the varargs vector will be sign-extended to 8 bytes. ++ // ++ // On entry: ++ // R3_ARG1 - intptr_t* Address of java argument list in memory. ++ // R15_prev_state - BytecodeInterpreter* Address of interpreter state for ++ // this method ++ // R19_method ++ // ++ // On exit (just before return instruction): ++ // R3_RET - contains the address of the result_handler. ++ // R4_ARG2 - is not updated for static methods and contains "this" otherwise. ++ // R5_ARG3-R10_ARG8: - When the (i-2)th Java argument is not of type float or double, ++ // ARGi contains this argument. Otherwise, ARGi is not updated. ++ // F1_ARG1-F13_ARG13 - contain the first 13 arguments of type float or double. ++ ++ const int LogSizeOfTwoInstructions = 3; ++ ++ // FIXME: use Argument:: GL: Argument names different numbers! ++ const int max_fp_register_arguments = 13; ++ const int max_int_register_arguments = 6; // first 2 are reserved ++ ++ const Register arg_java = R21_tmp1; ++ const Register arg_c = R22_tmp2; ++ const Register signature = R23_tmp3; // is string ++ const Register sig_byte = R24_tmp4; ++ const Register fpcnt = R25_tmp5; ++ const Register argcnt = R26_tmp6; ++ const Register intSlot = R27_tmp7; ++ const Register target_sp = R28_tmp8; ++ const FloatRegister floatSlot = F0; ++ ++ address entry = __ function_entry(); ++ ++ __ save_LR_CR(R0); ++ __ save_nonvolatile_gprs(R1_SP, _spill_nonvolatiles_neg(r14)); ++ // We use target_sp for storing arguments in the C frame. ++ __ mr(target_sp, R1_SP); ++ __ push_frame_reg_args_nonvolatiles(0, R11_scratch1); ++ ++ __ mr(arg_java, R3_ARG1); ++ ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::get_signature), R16_thread, R19_method); ++ ++ // Signature is in R3_RET. Signature is callee saved. ++ __ mr(signature, R3_RET); ++ ++ // Get the result handler. ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::get_result_handler), R16_thread, R19_method); ++ ++ { ++ Label L; ++ // test if static ++ // _access_flags._flags must be at offset 0. ++ // TODO PPC port: requires change in shared code. ++ //assert(in_bytes(AccessFlags::flags_offset()) == 0, ++ // "MethodDesc._access_flags == MethodDesc._access_flags._flags"); ++ // _access_flags must be a 32 bit value. ++ assert(sizeof(AccessFlags) == 4, "wrong size"); ++ __ lwa(R11_scratch1/*access_flags*/, method_(access_flags)); ++ // testbit with condition register. ++ __ testbitdi(CCR0, R0, R11_scratch1/*access_flags*/, JVM_ACC_STATIC_BIT); ++ __ btrue(CCR0, L); ++ // For non-static functions, pass "this" in R4_ARG2 and copy it ++ // to 2nd C-arg slot. ++ // We need to box the Java object here, so we use arg_java ++ // (address of current Java stack slot) as argument and don't ++ // dereference it as in case of ints, floats, etc. ++ __ mr(R4_ARG2, arg_java); ++ __ addi(arg_java, arg_java, -BytesPerWord); ++ __ std(R4_ARG2, _abi(carg_2), target_sp); ++ __ bind(L); ++ } ++ ++ // Will be incremented directly after loop_start. argcnt=0 ++ // corresponds to 3rd C argument. ++ __ li(argcnt, -1); ++ // arg_c points to 3rd C argument ++ __ addi(arg_c, target_sp, _abi(carg_3)); ++ // no floating-point args parsed so far ++ __ li(fpcnt, 0); ++ ++ Label move_intSlot_to_ARG, move_floatSlot_to_FARG; ++ Label loop_start, loop_end; ++ Label do_int, do_long, do_float, do_double, do_dontreachhere, do_object, do_array, do_boxed; ++ ++ // signature points to '(' at entry ++#ifdef ASSERT ++ __ lbz(sig_byte, 0, signature); ++ __ cmplwi(CCR0, sig_byte, '('); ++ __ bne(CCR0, do_dontreachhere); ++#endif ++ ++ __ bind(loop_start); ++ ++ __ addi(argcnt, argcnt, 1); ++ __ lbzu(sig_byte, 1, signature); ++ ++ __ cmplwi(CCR0, sig_byte, ')'); // end of signature ++ __ beq(CCR0, loop_end); ++ ++ __ cmplwi(CCR0, sig_byte, 'B'); // byte ++ __ beq(CCR0, do_int); ++ ++ __ cmplwi(CCR0, sig_byte, 'C'); // char ++ __ beq(CCR0, do_int); ++ ++ __ cmplwi(CCR0, sig_byte, 'D'); // double ++ __ beq(CCR0, do_double); ++ ++ __ cmplwi(CCR0, sig_byte, 'F'); // float ++ __ beq(CCR0, do_float); ++ ++ __ cmplwi(CCR0, sig_byte, 'I'); // int ++ __ beq(CCR0, do_int); ++ ++ __ cmplwi(CCR0, sig_byte, 'J'); // long ++ __ beq(CCR0, do_long); ++ ++ __ cmplwi(CCR0, sig_byte, 'S'); // short ++ __ beq(CCR0, do_int); ++ ++ __ cmplwi(CCR0, sig_byte, 'Z'); // boolean ++ __ beq(CCR0, do_int); ++ ++ __ cmplwi(CCR0, sig_byte, 'L'); // object ++ __ beq(CCR0, do_object); ++ ++ __ cmplwi(CCR0, sig_byte, '['); // array ++ __ beq(CCR0, do_array); ++ ++ // __ cmplwi(CCR0, sig_byte, 'V'); // void cannot appear since we do not parse the return type ++ // __ beq(CCR0, do_void); ++ ++ __ bind(do_dontreachhere); ++ ++ __ unimplemented("ShouldNotReachHere in slow_signature_handler", 120); ++ ++ __ bind(do_array); ++ ++ { ++ Label start_skip, end_skip; ++ ++ __ bind(start_skip); ++ __ lbzu(sig_byte, 1, signature); ++ __ cmplwi(CCR0, sig_byte, '['); ++ __ beq(CCR0, start_skip); // skip further brackets ++ __ cmplwi(CCR0, sig_byte, '9'); ++ __ bgt(CCR0, end_skip); // no optional size ++ __ cmplwi(CCR0, sig_byte, '0'); ++ __ bge(CCR0, start_skip); // skip optional size ++ __ bind(end_skip); ++ ++ __ cmplwi(CCR0, sig_byte, 'L'); ++ __ beq(CCR0, do_object); // for arrays of objects, the name of the object must be skipped ++ __ b(do_boxed); // otherwise, go directly to do_boxed ++ } ++ ++ __ bind(do_object); ++ { ++ Label L; ++ __ bind(L); ++ __ lbzu(sig_byte, 1, signature); ++ __ cmplwi(CCR0, sig_byte, ';'); ++ __ bne(CCR0, L); ++ } ++ // Need to box the Java object here, so we use arg_java (address of ++ // current Java stack slot) as argument and don't dereference it as ++ // in case of ints, floats, etc. ++ Label do_null; ++ __ bind(do_boxed); ++ __ ld(R0,0, arg_java); ++ __ cmpdi(CCR0, R0, 0); ++ __ li(intSlot,0); ++ __ beq(CCR0, do_null); ++ __ mr(intSlot, arg_java); ++ __ bind(do_null); ++ __ std(intSlot, 0, arg_c); ++ __ addi(arg_java, arg_java, -BytesPerWord); ++ __ addi(arg_c, arg_c, BytesPerWord); ++ __ cmplwi(CCR0, argcnt, max_int_register_arguments); ++ __ blt(CCR0, move_intSlot_to_ARG); ++ __ b(loop_start); ++ ++ __ bind(do_int); ++ __ lwa(intSlot, 0, arg_java); ++ __ std(intSlot, 0, arg_c); ++ __ addi(arg_java, arg_java, -BytesPerWord); ++ __ addi(arg_c, arg_c, BytesPerWord); ++ __ cmplwi(CCR0, argcnt, max_int_register_arguments); ++ __ blt(CCR0, move_intSlot_to_ARG); ++ __ b(loop_start); ++ ++ __ bind(do_long); ++ __ ld(intSlot, -BytesPerWord, arg_java); ++ __ std(intSlot, 0, arg_c); ++ __ addi(arg_java, arg_java, - 2 * BytesPerWord); ++ __ addi(arg_c, arg_c, BytesPerWord); ++ __ cmplwi(CCR0, argcnt, max_int_register_arguments); ++ __ blt(CCR0, move_intSlot_to_ARG); ++ __ b(loop_start); ++ ++ __ bind(do_float); ++ __ lfs(floatSlot, 0, arg_java); ++#if defined(LINUX) ++ __ stfs(floatSlot, 4, arg_c); ++#elif defined(AIX) ++ __ stfs(floatSlot, 0, arg_c); ++#else ++#error "unknown OS" ++#endif ++ __ addi(arg_java, arg_java, -BytesPerWord); ++ __ addi(arg_c, arg_c, BytesPerWord); ++ __ cmplwi(CCR0, fpcnt, max_fp_register_arguments); ++ __ blt(CCR0, move_floatSlot_to_FARG); ++ __ b(loop_start); ++ ++ __ bind(do_double); ++ __ lfd(floatSlot, - BytesPerWord, arg_java); ++ __ stfd(floatSlot, 0, arg_c); ++ __ addi(arg_java, arg_java, - 2 * BytesPerWord); ++ __ addi(arg_c, arg_c, BytesPerWord); ++ __ cmplwi(CCR0, fpcnt, max_fp_register_arguments); ++ __ blt(CCR0, move_floatSlot_to_FARG); ++ __ b(loop_start); ++ ++ __ bind(loop_end); ++ ++ __ pop_frame(); ++ __ restore_nonvolatile_gprs(R1_SP, _spill_nonvolatiles_neg(r14)); ++ __ restore_LR_CR(R0); ++ ++ __ blr(); ++ ++ Label move_int_arg, move_float_arg; ++ __ bind(move_int_arg); // each case must consist of 2 instructions (otherwise adapt LogSizeOfTwoInstructions) ++ __ mr(R5_ARG3, intSlot); __ b(loop_start); ++ __ mr(R6_ARG4, intSlot); __ b(loop_start); ++ __ mr(R7_ARG5, intSlot); __ b(loop_start); ++ __ mr(R8_ARG6, intSlot); __ b(loop_start); ++ __ mr(R9_ARG7, intSlot); __ b(loop_start); ++ __ mr(R10_ARG8, intSlot); __ b(loop_start); ++ ++ __ bind(move_float_arg); // each case must consist of 2 instructions (otherwise adapt LogSizeOfTwoInstructions) ++ __ fmr(F1_ARG1, floatSlot); __ b(loop_start); ++ __ fmr(F2_ARG2, floatSlot); __ b(loop_start); ++ __ fmr(F3_ARG3, floatSlot); __ b(loop_start); ++ __ fmr(F4_ARG4, floatSlot); __ b(loop_start); ++ __ fmr(F5_ARG5, floatSlot); __ b(loop_start); ++ __ fmr(F6_ARG6, floatSlot); __ b(loop_start); ++ __ fmr(F7_ARG7, floatSlot); __ b(loop_start); ++ __ fmr(F8_ARG8, floatSlot); __ b(loop_start); ++ __ fmr(F9_ARG9, floatSlot); __ b(loop_start); ++ __ fmr(F10_ARG10, floatSlot); __ b(loop_start); ++ __ fmr(F11_ARG11, floatSlot); __ b(loop_start); ++ __ fmr(F12_ARG12, floatSlot); __ b(loop_start); ++ __ fmr(F13_ARG13, floatSlot); __ b(loop_start); ++ ++ __ bind(move_intSlot_to_ARG); ++ __ sldi(R0, argcnt, LogSizeOfTwoInstructions); ++ __ load_const(R11_scratch1, move_int_arg); // Label must be bound here. ++ __ add(R11_scratch1, R0, R11_scratch1); ++ __ mtctr(R11_scratch1/*branch_target*/); ++ __ bctr(); ++ __ bind(move_floatSlot_to_FARG); ++ __ sldi(R0, fpcnt, LogSizeOfTwoInstructions); ++ __ addi(fpcnt, fpcnt, 1); ++ __ load_const(R11_scratch1, move_float_arg); // Label must be bound here. ++ __ add(R11_scratch1, R0, R11_scratch1); ++ __ mtctr(R11_scratch1/*branch_target*/); ++ __ bctr(); ++ ++ return entry; ++} ++ ++address AbstractInterpreterGenerator::generate_result_handler_for(BasicType type) { ++ // ++ // Registers alive ++ // R3_RET ++ // LR ++ // ++ // Registers updated ++ // R3_RET ++ // ++ ++ Label done; ++ address entry = __ pc(); ++ ++ switch (type) { ++ case T_BOOLEAN: ++ // convert !=0 to 1 ++ __ neg(R0, R3_RET); ++ __ orr(R0, R3_RET, R0); ++ __ srwi(R3_RET, R0, 31); ++ break; ++ case T_BYTE: ++ // sign extend 8 bits ++ __ extsb(R3_RET, R3_RET); ++ break; ++ case T_CHAR: ++ // zero extend 16 bits ++ __ clrldi(R3_RET, R3_RET, 48); ++ break; ++ case T_SHORT: ++ // sign extend 16 bits ++ __ extsh(R3_RET, R3_RET); ++ break; ++ case T_INT: ++ // sign extend 32 bits ++ __ extsw(R3_RET, R3_RET); ++ break; ++ case T_LONG: ++ break; ++ case T_OBJECT: ++ // unbox result if not null ++ __ cmpdi(CCR0, R3_RET, 0); ++ __ beq(CCR0, done); ++ __ ld(R3_RET, 0, R3_RET); ++ __ verify_oop(R3_RET); ++ break; ++ case T_FLOAT: ++ break; ++ case T_DOUBLE: ++ break; ++ case T_VOID: ++ break; ++ default: ShouldNotReachHere(); ++ } ++ ++ __ BIND(done); ++ __ blr(); ++ ++ return entry; ++} ++ ++// Abstract method entry. ++// ++address InterpreterGenerator::generate_abstract_entry(void) { ++ address entry = __ pc(); ++ ++ // ++ // Registers alive ++ // R16_thread - JavaThread* ++ // R19_method - callee's method (method to be invoked) ++ // R1_SP - SP prepared such that caller's outgoing args are near top ++ // LR - return address to caller ++ // ++ // Stack layout at this point: ++ // ++ // 0 [TOP_IJAVA_FRAME_ABI] <-- R1_SP ++ // alignment (optional) ++ // [outgoing Java arguments] ++ // ... ++ // PARENT [PARENT_IJAVA_FRAME_ABI] ++ // ... ++ // ++ ++ // Can't use call_VM here because we have not set up a new ++ // interpreter state. Make the call to the vm and make it look like ++ // our caller set up the JavaFrameAnchor. ++ __ set_top_ijava_frame_at_SP_as_last_Java_frame(R1_SP, R12_scratch2/*tmp*/); ++ ++ // Push a new C frame and save LR. ++ __ save_LR_CR(R0); ++ __ push_frame_reg_args(0, R11_scratch1); ++ ++ // This is not a leaf but we have a JavaFrameAnchor now and we will ++ // check (create) exceptions afterward so this is ok. ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); ++ ++ // Pop the C frame and restore LR. ++ __ pop_frame(); ++ __ restore_LR_CR(R0); ++ ++ // Reset JavaFrameAnchor from call_VM_leaf above. ++ __ reset_last_Java_frame(); ++ ++#ifdef CC_INTERP ++ // Return to frame manager, it will handle the pending exception. ++ __ blr(); ++#else ++ // We don't know our caller, so jump to the general forward exception stub, ++ // which will also pop our full frame off. Satisfy the interface of ++ // SharedRuntime::generate_forward_exception() ++ __ load_const_optimized(R11_scratch1, StubRoutines::forward_exception_entry(), R0); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++#endif ++ ++ return entry; ++} ++ ++// Call an accessor method (assuming it is resolved, otherwise drop into ++// vanilla (slow path) entry. ++address InterpreterGenerator::generate_accessor_entry(void) { ++ if (!UseFastAccessorMethods && (!FLAG_IS_ERGO(UseFastAccessorMethods))) { ++ return NULL; ++ } ++ ++ Label Lslow_path, Lacquire; ++ ++ const Register ++ Rclass_or_obj = R3_ARG1, ++ Rconst_method = R4_ARG2, ++ Rcodes = Rconst_method, ++ Rcpool_cache = R5_ARG3, ++ Rscratch = R11_scratch1, ++ Rjvmti_mode = Rscratch, ++ Roffset = R12_scratch2, ++ Rflags = R6_ARG4, ++ Rbtable = R7_ARG5; ++ ++ static address branch_table[number_of_states]; ++ ++ address entry = __ pc(); ++ ++ // Check for safepoint: ++ // Ditch this, real man don't need safepoint checks. ++ ++ // Also check for JVMTI mode ++ // Check for null obj, take slow path if so. ++ __ ld(Rclass_or_obj, Interpreter::stackElementSize, CC_INTERP_ONLY(R17_tos) NOT_CC_INTERP(R15_esp)); ++ __ lwz(Rjvmti_mode, thread_(interp_only_mode)); ++ __ cmpdi(CCR1, Rclass_or_obj, 0); ++ __ cmpwi(CCR0, Rjvmti_mode, 0); ++ __ crorc(/*CCR0 eq*/2, /*CCR1 eq*/4+2, /*CCR0 eq*/2); ++ __ beq(CCR0, Lslow_path); // this==null or jvmti_mode!=0 ++ ++ // Do 2 things in parallel: ++ // 1. Load the index out of the first instruction word, which looks like this: ++ // <0x2a><0xb4>. ++ // 2. Load constant pool cache base. ++ __ ld(Rconst_method, in_bytes(Method::const_offset()), R19_method); ++ __ ld(Rcpool_cache, in_bytes(ConstMethod::constants_offset()), Rconst_method); ++ ++ __ lhz(Rcodes, in_bytes(ConstMethod::codes_offset()) + 2, Rconst_method); // Lower half of 32 bit field. ++ __ ld(Rcpool_cache, ConstantPool::cache_offset_in_bytes(), Rcpool_cache); ++ ++ // Get the const pool entry by means of . ++ const int codes_shift = exact_log2(in_words(ConstantPoolCacheEntry::size()) * BytesPerWord); ++ __ slwi(Rscratch, Rcodes, codes_shift); // (codes&0xFFFF)<print_cr("accessor_entry: branch_table[%d] = 0x%llx (opcode 0x%llx)", i, branch_table[i], *((unsigned int*)branch_table[i])); ++ } ++#endif ++ ++ __ bind(Lslow_path); ++ __ branch_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals), Rscratch); ++ __ flush(); ++ ++ return entry; ++} ++ ++// Interpreter intrinsic for WeakReference.get(). ++// 1. Don't push a full blown frame and go on dispatching, but fetch the value ++// into R8 and return quickly ++// 2. If G1 is active we *must* execute this intrinsic for corrrectness: ++// It contains a GC barrier which puts the reference into the satb buffer ++// to indicate that someone holds a strong reference to the object the ++// weak ref points to! ++address InterpreterGenerator::generate_Reference_get_entry(void) { ++ // Code: _aload_0, _getfield, _areturn ++ // parameter size = 1 ++ // ++ // The code that gets generated by this routine is split into 2 parts: ++ // 1. the "intrinsified" code for G1 (or any SATB based GC), ++ // 2. the slow path - which is an expansion of the regular method entry. ++ // ++ // Notes: ++ // * In the G1 code we do not check whether we need to block for ++ // a safepoint. If G1 is enabled then we must execute the specialized ++ // code for Reference.get (except when the Reference object is null) ++ // so that we can log the value in the referent field with an SATB ++ // update buffer. ++ // If the code for the getfield template is modified so that the ++ // G1 pre-barrier code is executed when the current method is ++ // Reference.get() then going through the normal method entry ++ // will be fine. ++ // * The G1 code can, however, check the receiver object (the instance ++ // of java.lang.Reference) and jump to the slow path if null. If the ++ // Reference object is null then we obviously cannot fetch the referent ++ // and so we don't need to call the G1 pre-barrier. Thus we can use the ++ // regular method entry code to generate the NPE. ++ // ++ // This code is based on generate_accessor_enty. ++ ++ address entry = __ pc(); ++ ++ const int referent_offset = java_lang_ref_Reference::referent_offset; ++ guarantee(referent_offset > 0, "referent offset not initialized"); ++ ++ if (UseG1GC) { ++ Label slow_path; ++ ++ // Debugging not possible, so can't use __ skip_if_jvmti_mode(slow_path, GR31_SCRATCH); ++ ++ // In the G1 code we don't check if we need to reach a safepoint. We ++ // continue and the thread will safepoint at the next bytecode dispatch. ++ ++ // If the receiver is null then it is OK to jump to the slow path. ++ __ ld(R3_RET, Interpreter::stackElementSize, CC_INTERP_ONLY(R17_tos) NOT_CC_INTERP(R15_esp)); // get receiver ++ ++ // Check if receiver == NULL and go the slow path. ++ __ cmpdi(CCR0, R3_RET, 0); ++ __ beq(CCR0, slow_path); ++ ++ // Load the value of the referent field. ++ __ load_heap_oop(R3_RET, referent_offset, R3_RET); ++ ++ // Generate the G1 pre-barrier code to log the value of ++ // the referent field in an SATB buffer. Note with ++ // these parameters the pre-barrier does not generate ++ // the load of the previous value. ++ ++ // Restore caller sp for c2i case. ++#ifdef ASSERT ++ __ ld(R9_ARG7, 0, R1_SP); ++ __ ld(R10_ARG8, 0, R21_sender_SP); ++ __ cmpd(CCR0, R9_ARG7, R10_ARG8); ++ __ asm_assert_eq("backlink", 0x544); ++#endif // ASSERT ++ __ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started. ++ ++ __ g1_write_barrier_pre(noreg, // obj ++ noreg, // offset ++ R3_RET, // pre_val ++ R11_scratch1, // tmp ++ R12_scratch2, // tmp ++ true); // needs_frame ++ ++ __ blr(); ++ ++ // Generate regular method entry. ++ __ bind(slow_path); ++ __ branch_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals), R11_scratch1); ++ __ flush(); ++ ++ return entry; ++ } else { ++ return generate_accessor_entry(); ++ } ++} ++ ++void Deoptimization::unwind_callee_save_values(frame* f, vframeArray* vframe_array) { ++ // This code is sort of the equivalent of C2IAdapter::setup_stack_frame back in ++ // the days we had adapter frames. When we deoptimize a situation where a ++ // compiled caller calls a compiled caller will have registers it expects ++ // to survive the call to the callee. If we deoptimize the callee the only ++ // way we can restore these registers is to have the oldest interpreter ++ // frame that we create restore these values. That is what this routine ++ // will accomplish. ++ ++ // At the moment we have modified c2 to not have any callee save registers ++ // so this problem does not exist and this routine is just a place holder. ++ ++ assert(f->is_interpreted_frame(), "must be interpreted"); ++} +--- ./hotspot/src/cpu/ppc/vm/interpreter_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/interpreter_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_INTERPRETER_PPC_HPP ++#define CPU_PPC_VM_INTERPRETER_PPC_HPP ++ ++ public: ++ ++ // Stack index relative to tos (which points at value). ++ static int expr_index_at(int i) { ++ return stackElementWords * i; ++ } ++ ++ // Already negated by c++ interpreter. ++ static int local_index_at(int i) { ++ assert(i <= 0, "local direction already negated"); ++ return stackElementWords * i; ++ } ++ ++#ifndef CC_INTERP ++ // The offset in bytes to access a expression stack slot ++ // relative to the esp pointer. ++ static int expr_offset_in_bytes(int slot) { ++ return stackElementSize * slot + wordSize; ++ } ++#endif ++ ++#endif // CPU_PPC_VM_INTERPRETER_PPC_PP +--- ./hotspot/src/cpu/ppc/vm/javaFrameAnchor_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/javaFrameAnchor_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,78 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_JAVAFRAMEANCHOR_PPC_HPP ++#define CPU_PPC_VM_JAVAFRAMEANCHOR_PPC_HPP ++ ++public: ++ // Each arch must define reset, save, restore ++ // These are used by objects that only care about: ++ // 1 - initializing a new state (thread creation, javaCalls) ++ // 2 - saving a current state (javaCalls) ++ // 3 - restoring an old state (javaCalls) ++ ++ inline void clear(void) { ++ // clearing _last_Java_sp must be first ++ _last_Java_sp = NULL; ++ // fence? ++ OrderAccess::release(); ++ _last_Java_pc = NULL; ++ } ++ ++ inline void set(intptr_t* sp, address pc) { ++ _last_Java_pc = pc; ++ OrderAccess::release(); ++ _last_Java_sp = sp; ++ } ++ ++ void copy(JavaFrameAnchor* src) { ++ // In order to make sure the transition state is valid for "this". ++ // We must clear _last_Java_sp before copying the rest of the new data. ++ // ++ // Hack Alert: Temporary bugfix for 4717480/4721647 ++ // To act like previous version (pd_cache_state) don't NULL _last_Java_sp ++ // unless the value is changing. ++ if (_last_Java_sp != src->_last_Java_sp) { ++ _last_Java_sp = NULL; ++ OrderAccess::release(); ++ } ++ _last_Java_pc = src->_last_Java_pc; ++ // Must be last so profiler will always see valid frame if has_last_frame() is true. ++ OrderAccess::release(); ++ _last_Java_sp = src->_last_Java_sp; ++ } ++ ++ // Always walkable. ++ bool walkable(void) { return true; } ++ // Never any thing to do since we are always walkable and can find address of return addresses. ++ void make_walkable(JavaThread* thread) { } ++ ++ intptr_t* last_Java_sp(void) const { return _last_Java_sp; } ++ ++ address last_Java_pc(void) { return _last_Java_pc; } ++ ++ void set_last_Java_sp(intptr_t* sp) { OrderAccess::release(); _last_Java_sp = sp; } ++ ++#endif // CPU_PPC_VM_JAVAFRAMEANCHOR_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/jniFastGetField_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/jniFastGetField_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,75 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "assembler_ppc.inline.hpp" ++#include "memory/resourceArea.hpp" ++#include "prims/jniFastGetField.hpp" ++#include "prims/jvm_misc.hpp" ++#include "runtime/safepoint.hpp" ++ ++ ++address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) { ++ // We don't have fast jni accessors. ++ return (address) -1; ++} ++ ++address JNI_FastGetField::generate_fast_get_boolean_field() { ++ return generate_fast_get_int_field0(T_BOOLEAN); ++} ++ ++address JNI_FastGetField::generate_fast_get_byte_field() { ++ return generate_fast_get_int_field0(T_BYTE); ++} ++ ++address JNI_FastGetField::generate_fast_get_char_field() { ++ return generate_fast_get_int_field0(T_CHAR); ++} ++ ++address JNI_FastGetField::generate_fast_get_short_field() { ++ return generate_fast_get_int_field0(T_SHORT); ++} ++ ++address JNI_FastGetField::generate_fast_get_int_field() { ++ return generate_fast_get_int_field0(T_INT); ++} ++ ++address JNI_FastGetField::generate_fast_get_long_field() { ++ // We don't have fast jni accessors. ++ return (address) -1; ++} ++ ++address JNI_FastGetField::generate_fast_get_float_field0(BasicType type) { ++ // We don't have fast jni accessors. ++ return (address) -1; ++} ++ ++address JNI_FastGetField::generate_fast_get_float_field() { ++ return generate_fast_get_float_field0(T_FLOAT); ++} ++ ++address JNI_FastGetField::generate_fast_get_double_field() { ++ return generate_fast_get_float_field0(T_DOUBLE); ++} +--- ./hotspot/src/cpu/ppc/vm/jniTypes_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/jniTypes_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,110 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_JNITYPES_PPC_HPP ++#define CPU_PPC_VM_JNITYPES_PPC_HPP ++ ++#include "memory/allocation.hpp" ++#include "oops/oop.hpp" ++#include "prims/jni.h" ++ ++// This file holds platform-dependent routines used to write primitive ++// jni types to the array of arguments passed into JavaCalls::call. ++ ++class JNITypes : AllStatic { ++ // These functions write a java primitive type (in native format) to ++ // a java stack slot array to be passed as an argument to ++ // JavaCalls:calls. I.e., they are functionally 'push' operations ++ // if they have a 'pos' formal parameter. Note that jlong's and ++ // jdouble's are written _in reverse_ of the order in which they ++ // appear in the interpreter stack. This is because call stubs (see ++ // stubGenerator_sparc.cpp) reverse the argument list constructed by ++ // JavaCallArguments (see javaCalls.hpp). ++ ++ private: ++ ++#ifndef PPC64 ++#error "ppc32 support currently not implemented!!!" ++#endif // PPC64 ++ ++ public: ++ // Ints are stored in native format in one JavaCallArgument slot at *to. ++ static inline void put_int(jint from, intptr_t *to) { *(jint *)(to + 0 ) = from; } ++ static inline void put_int(jint from, intptr_t *to, int& pos) { *(jint *)(to + pos++) = from; } ++ static inline void put_int(jint *from, intptr_t *to, int& pos) { *(jint *)(to + pos++) = *from; } ++ ++ // Longs are stored in native format in one JavaCallArgument slot at ++ // *(to+1). ++ static inline void put_long(jlong from, intptr_t *to) { ++ *(jlong*) (to + 1) = from; ++ } ++ ++ static inline void put_long(jlong from, intptr_t *to, int& pos) { ++ *(jlong*) (to + 1 + pos) = from; ++ pos += 2; ++ } ++ ++ static inline void put_long(jlong *from, intptr_t *to, int& pos) { ++ *(jlong*) (to + 1 + pos) = *from; ++ pos += 2; ++ } ++ ++ // Oops are stored in native format in one JavaCallArgument slot at *to. ++ static inline void put_obj(oop from, intptr_t *to) { *(oop *)(to + 0 ) = from; } ++ static inline void put_obj(oop from, intptr_t *to, int& pos) { *(oop *)(to + pos++) = from; } ++ static inline void put_obj(oop *from, intptr_t *to, int& pos) { *(oop *)(to + pos++) = *from; } ++ ++ // Floats are stored in native format in one JavaCallArgument slot at *to. ++ static inline void put_float(jfloat from, intptr_t *to) { *(jfloat *)(to + 0 ) = from; } ++ static inline void put_float(jfloat from, intptr_t *to, int& pos) { *(jfloat *)(to + pos++) = from; } ++ static inline void put_float(jfloat *from, intptr_t *to, int& pos) { *(jfloat *)(to + pos++) = *from; } ++ ++ // Doubles are stored in native word format in one JavaCallArgument ++ // slot at *(to+1). ++ static inline void put_double(jdouble from, intptr_t *to) { ++ *(jdouble*) (to + 1) = from; ++ } ++ ++ static inline void put_double(jdouble from, intptr_t *to, int& pos) { ++ *(jdouble*) (to + 1 + pos) = from; ++ pos += 2; ++ } ++ ++ static inline void put_double(jdouble *from, intptr_t *to, int& pos) { ++ *(jdouble*) (to + 1 + pos) = *from; ++ pos += 2; ++ } ++ ++ // The get_xxx routines, on the other hand, actually _do_ fetch ++ // java primitive types from the interpreter stack. ++ // No need to worry about alignment on Intel. ++ static inline jint get_int (intptr_t *from) { return *(jint *) from; } ++ static inline jlong get_long (intptr_t *from) { return *(jlong *) (from + 1); } ++ static inline oop get_obj (intptr_t *from) { return *(oop *) from; } ++ static inline jfloat get_float (intptr_t *from) { return *(jfloat *) from; } ++ static inline jdouble get_double(intptr_t *from) { return *(jdouble *)(from + 1); } ++}; ++ ++#endif // CPU_PPC_VM_JNITYPES_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/jni_ppc.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/jni_ppc.h Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_JNI_PPC_H ++#define CPU_PPC_VM_JNI_PPC_H ++ ++// Note: please do not change these without also changing jni_md.h in the JDK ++// repository ++#ifndef __has_attribute ++ #define __has_attribute(x) 0 ++#endif ++#if (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ > 2))) || __has_attribute(visibility) ++ #define JNIEXPORT __attribute__((visibility("default"))) ++ #define JNIIMPORT __attribute__((visibility("default"))) ++#else ++ #define JNIEXPORT ++ #define JNIIMPORT ++#endif ++ ++#define JNICALL ++ ++typedef int jint; ++ ++#if defined(_LP64) ++ typedef long jlong; ++#else ++ typedef long long jlong; ++#endif ++ ++typedef signed char jbyte; ++ ++#endif // CPU_PPC_VM_JNI_PPC_H +--- ./hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/macroAssembler_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,3169 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/macroAssembler.inline.hpp" ++#include "compiler/disassembler.hpp" ++#include "gc_interface/collectedHeap.inline.hpp" ++#include "interpreter/interpreter.hpp" ++#include "memory/cardTableModRefBS.hpp" ++#include "memory/resourceArea.hpp" ++#include "prims/methodHandles.hpp" ++#include "runtime/biasedLocking.hpp" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/objectMonitor.hpp" ++#include "runtime/os.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "utilities/macros.hpp" ++#if INCLUDE_ALL_GCS ++#include "gc_implementation/g1/g1CollectedHeap.inline.hpp" ++#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" ++#include "gc_implementation/g1/heapRegion.hpp" ++#endif // INCLUDE_ALL_GCS ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) // nothing ++#else ++#define BLOCK_COMMENT(str) block_comment(str) ++#endif ++ ++#ifdef ASSERT ++// On RISC, there's no benefit to verifying instruction boundaries. ++bool AbstractAssembler::pd_check_instruction_mark() { return false; } ++#endif ++ ++void MacroAssembler::ld_largeoffset_unchecked(Register d, int si31, Register a, int emit_filler_nop) { ++ assert(Assembler::is_simm(si31, 31) && si31 >= 0, "si31 out of range"); ++ if (Assembler::is_simm(si31, 16)) { ++ ld(d, si31, a); ++ if (emit_filler_nop) nop(); ++ } else { ++ const int hi = MacroAssembler::largeoffset_si16_si16_hi(si31); ++ const int lo = MacroAssembler::largeoffset_si16_si16_lo(si31); ++ addis(d, a, hi); ++ ld(d, lo, d); ++ } ++} ++ ++void MacroAssembler::ld_largeoffset(Register d, int si31, Register a, int emit_filler_nop) { ++ assert_different_registers(d, a); ++ ld_largeoffset_unchecked(d, si31, a, emit_filler_nop); ++} ++ ++void MacroAssembler::load_sized_value(Register dst, RegisterOrConstant offs, Register base, ++ size_t size_in_bytes, bool is_signed) { ++ switch (size_in_bytes) { ++ case 8: ld(dst, offs, base); break; ++ case 4: is_signed ? lwa(dst, offs, base) : lwz(dst, offs, base); break; ++ case 2: is_signed ? lha(dst, offs, base) : lhz(dst, offs, base); break; ++ case 1: lbz(dst, offs, base); if (is_signed) extsb(dst, dst); break; // lba doesn't exist :( ++ default: ShouldNotReachHere(); ++ } ++} ++ ++void MacroAssembler::store_sized_value(Register dst, RegisterOrConstant offs, Register base, ++ size_t size_in_bytes) { ++ switch (size_in_bytes) { ++ case 8: std(dst, offs, base); break; ++ case 4: stw(dst, offs, base); break; ++ case 2: sth(dst, offs, base); break; ++ case 1: stb(dst, offs, base); break; ++ default: ShouldNotReachHere(); ++ } ++} ++ ++void MacroAssembler::align(int modulus, int max, int rem) { ++ int padding = (rem + modulus - (offset() % modulus)) % modulus; ++ if (padding > max) return; ++ for (int c = (padding >> 2); c > 0; --c) { nop(); } ++} ++ ++// Issue instructions that calculate given TOC from global TOC. ++void MacroAssembler::calculate_address_from_global_toc(Register dst, address addr, bool hi16, bool lo16, ++ bool add_relocation, bool emit_dummy_addr) { ++ int offset = -1; ++ if (emit_dummy_addr) { ++ offset = -128; // dummy address ++ } else if (addr != (address)(intptr_t)-1) { ++ offset = MacroAssembler::offset_to_global_toc(addr); ++ } ++ ++ if (hi16) { ++ addis(dst, R29, MacroAssembler::largeoffset_si16_si16_hi(offset)); ++ } ++ if (lo16) { ++ if (add_relocation) { ++ // Relocate at the addi to avoid confusion with a load from the method's TOC. ++ relocate(internal_word_Relocation::spec(addr)); ++ } ++ addi(dst, dst, MacroAssembler::largeoffset_si16_si16_lo(offset)); ++ } ++} ++ ++int MacroAssembler::patch_calculate_address_from_global_toc_at(address a, address bound, address addr) { ++ const int offset = MacroAssembler::offset_to_global_toc(addr); ++ ++ const address inst2_addr = a; ++ const int inst2 = *(int *)inst2_addr; ++ ++ // The relocation points to the second instruction, the addi, ++ // and the addi reads and writes the same register dst. ++ const int dst = inv_rt_field(inst2); ++ assert(is_addi(inst2) && inv_ra_field(inst2) == dst, "must be addi reading and writing dst"); ++ ++ // Now, find the preceding addis which writes to dst. ++ int inst1 = 0; ++ address inst1_addr = inst2_addr - BytesPerInstWord; ++ while (inst1_addr >= bound) { ++ inst1 = *(int *) inst1_addr; ++ if (is_addis(inst1) && inv_rt_field(inst1) == dst) { ++ // Stop, found the addis which writes dst. ++ break; ++ } ++ inst1_addr -= BytesPerInstWord; ++ } ++ ++ assert(is_addis(inst1) && inv_ra_field(inst1) == 29 /* R29 */, "source must be global TOC"); ++ set_imm((int *)inst1_addr, MacroAssembler::largeoffset_si16_si16_hi(offset)); ++ set_imm((int *)inst2_addr, MacroAssembler::largeoffset_si16_si16_lo(offset)); ++ return (int)((intptr_t)addr - (intptr_t)inst1_addr); ++} ++ ++address MacroAssembler::get_address_of_calculate_address_from_global_toc_at(address a, address bound) { ++ const address inst2_addr = a; ++ const int inst2 = *(int *)inst2_addr; ++ ++ // The relocation points to the second instruction, the addi, ++ // and the addi reads and writes the same register dst. ++ const int dst = inv_rt_field(inst2); ++ assert(is_addi(inst2) && inv_ra_field(inst2) == dst, "must be addi reading and writing dst"); ++ ++ // Now, find the preceding addis which writes to dst. ++ int inst1 = 0; ++ address inst1_addr = inst2_addr - BytesPerInstWord; ++ while (inst1_addr >= bound) { ++ inst1 = *(int *) inst1_addr; ++ if (is_addis(inst1) && inv_rt_field(inst1) == dst) { ++ // stop, found the addis which writes dst ++ break; ++ } ++ inst1_addr -= BytesPerInstWord; ++ } ++ ++ assert(is_addis(inst1) && inv_ra_field(inst1) == 29 /* R29 */, "source must be global TOC"); ++ ++ int offset = (get_imm(inst1_addr, 0) << 16) + get_imm(inst2_addr, 0); ++ // -1 is a special case ++ if (offset == -1) { ++ return (address)(intptr_t)-1; ++ } else { ++ return global_toc() + offset; ++ } ++} ++ ++#ifdef _LP64 ++// Patch compressed oops or klass constants. ++// Assembler sequence is ++// 1) compressed oops: ++// lis rx = const.hi ++// ori rx = rx | const.lo ++// 2) compressed klass: ++// lis rx = const.hi ++// clrldi rx = rx & 0xFFFFffff // clearMS32b, optional ++// ori rx = rx | const.lo ++// Clrldi will be passed by. ++int MacroAssembler::patch_set_narrow_oop(address a, address bound, narrowOop data) { ++ assert(UseCompressedOops, "Should only patch compressed oops"); ++ ++ const address inst2_addr = a; ++ const int inst2 = *(int *)inst2_addr; ++ ++ // The relocation points to the second instruction, the ori, ++ // and the ori reads and writes the same register dst. ++ const int dst = inv_rta_field(inst2); ++ assert(is_ori(inst2) && inv_rs_field(inst2) == dst, "must be ori reading and writing dst"); ++ // Now, find the preceding addis which writes to dst. ++ int inst1 = 0; ++ address inst1_addr = inst2_addr - BytesPerInstWord; ++ bool inst1_found = false; ++ while (inst1_addr >= bound) { ++ inst1 = *(int *)inst1_addr; ++ if (is_lis(inst1) && inv_rs_field(inst1) == dst) { inst1_found = true; break; } ++ inst1_addr -= BytesPerInstWord; ++ } ++ assert(inst1_found, "inst is not lis"); ++ ++ int xc = (data >> 16) & 0xffff; ++ int xd = (data >> 0) & 0xffff; ++ ++ set_imm((int *)inst1_addr, (short)(xc)); // see enc_load_con_narrow_hi/_lo ++ set_imm((int *)inst2_addr, (xd)); // unsigned int ++ return (int)((intptr_t)inst2_addr - (intptr_t)inst1_addr); ++} ++ ++// Get compressed oop or klass constant. ++narrowOop MacroAssembler::get_narrow_oop(address a, address bound) { ++ assert(UseCompressedOops, "Should only patch compressed oops"); ++ ++ const address inst2_addr = a; ++ const int inst2 = *(int *)inst2_addr; ++ ++ // The relocation points to the second instruction, the ori, ++ // and the ori reads and writes the same register dst. ++ const int dst = inv_rta_field(inst2); ++ assert(is_ori(inst2) && inv_rs_field(inst2) == dst, "must be ori reading and writing dst"); ++ // Now, find the preceding lis which writes to dst. ++ int inst1 = 0; ++ address inst1_addr = inst2_addr - BytesPerInstWord; ++ bool inst1_found = false; ++ ++ while (inst1_addr >= bound) { ++ inst1 = *(int *) inst1_addr; ++ if (is_lis(inst1) && inv_rs_field(inst1) == dst) { inst1_found = true; break;} ++ inst1_addr -= BytesPerInstWord; ++ } ++ assert(inst1_found, "inst is not lis"); ++ ++ uint xl = ((unsigned int) (get_imm(inst2_addr, 0) & 0xffff)); ++ uint xh = (((get_imm(inst1_addr, 0)) & 0xffff) << 16); ++ ++ return (int) (xl | xh); ++} ++#endif // _LP64 ++ ++void MacroAssembler::load_const_from_method_toc(Register dst, AddressLiteral& a, Register toc) { ++ int toc_offset = 0; ++ // Use RelocationHolder::none for the constant pool entry, otherwise ++ // we will end up with a failing NativeCall::verify(x) where x is ++ // the address of the constant pool entry. ++ // FIXME: We should insert relocation information for oops at the constant ++ // pool entries instead of inserting it at the loads; patching of a constant ++ // pool entry should be less expensive. ++ address oop_address = address_constant((address)a.value(), RelocationHolder::none); ++ // Relocate at the pc of the load. ++ relocate(a.rspec()); ++ toc_offset = (int)(oop_address - code()->consts()->start()); ++ ld_largeoffset_unchecked(dst, toc_offset, toc, true); ++} ++ ++bool MacroAssembler::is_load_const_from_method_toc_at(address a) { ++ const address inst1_addr = a; ++ const int inst1 = *(int *)inst1_addr; ++ ++ // The relocation points to the ld or the addis. ++ return (is_ld(inst1)) || ++ (is_addis(inst1) && inv_ra_field(inst1) != 0); ++} ++ ++int MacroAssembler::get_offset_of_load_const_from_method_toc_at(address a) { ++ assert(is_load_const_from_method_toc_at(a), "must be load_const_from_method_toc"); ++ ++ const address inst1_addr = a; ++ const int inst1 = *(int *)inst1_addr; ++ ++ if (is_ld(inst1)) { ++ return inv_d1_field(inst1); ++ } else if (is_addis(inst1)) { ++ const int dst = inv_rt_field(inst1); ++ ++ // Now, find the succeeding ld which reads and writes to dst. ++ address inst2_addr = inst1_addr + BytesPerInstWord; ++ int inst2 = 0; ++ while (true) { ++ inst2 = *(int *) inst2_addr; ++ if (is_ld(inst2) && inv_ra_field(inst2) == dst && inv_rt_field(inst2) == dst) { ++ // Stop, found the ld which reads and writes dst. ++ break; ++ } ++ inst2_addr += BytesPerInstWord; ++ } ++ return (inv_d1_field(inst1) << 16) + inv_d1_field(inst2); ++ } ++ ShouldNotReachHere(); ++ return 0; ++} ++ ++// Get the constant from a `load_const' sequence. ++long MacroAssembler::get_const(address a) { ++ assert(is_load_const_at(a), "not a load of a constant"); ++ const int *p = (const int*) a; ++ unsigned long x = (((unsigned long) (get_imm(a,0) & 0xffff)) << 48); ++ if (is_ori(*(p+1))) { ++ x |= (((unsigned long) (get_imm(a,1) & 0xffff)) << 32); ++ x |= (((unsigned long) (get_imm(a,3) & 0xffff)) << 16); ++ x |= (((unsigned long) (get_imm(a,4) & 0xffff))); ++ } else if (is_lis(*(p+1))) { ++ x |= (((unsigned long) (get_imm(a,2) & 0xffff)) << 32); ++ x |= (((unsigned long) (get_imm(a,1) & 0xffff)) << 16); ++ x |= (((unsigned long) (get_imm(a,3) & 0xffff))); ++ } else { ++ ShouldNotReachHere(); ++ return (long) 0; ++ } ++ return (long) x; ++} ++ ++// Patch the 64 bit constant of a `load_const' sequence. This is a low ++// level procedure. It neither flushes the instruction cache nor is it ++// mt safe. ++void MacroAssembler::patch_const(address a, long x) { ++ assert(is_load_const_at(a), "not a load of a constant"); ++ int *p = (int*) a; ++ if (is_ori(*(p+1))) { ++ set_imm(0 + p, (x >> 48) & 0xffff); ++ set_imm(1 + p, (x >> 32) & 0xffff); ++ set_imm(3 + p, (x >> 16) & 0xffff); ++ set_imm(4 + p, x & 0xffff); ++ } else if (is_lis(*(p+1))) { ++ set_imm(0 + p, (x >> 48) & 0xffff); ++ set_imm(2 + p, (x >> 32) & 0xffff); ++ set_imm(1 + p, (x >> 16) & 0xffff); ++ set_imm(3 + p, x & 0xffff); ++ } else { ++ ShouldNotReachHere(); ++ } ++} ++ ++AddressLiteral MacroAssembler::allocate_metadata_address(Metadata* obj) { ++ assert(oop_recorder() != NULL, "this assembler needs a Recorder"); ++ int index = oop_recorder()->allocate_metadata_index(obj); ++ RelocationHolder rspec = metadata_Relocation::spec(index); ++ return AddressLiteral((address)obj, rspec); ++} ++ ++AddressLiteral MacroAssembler::constant_metadata_address(Metadata* obj) { ++ assert(oop_recorder() != NULL, "this assembler needs a Recorder"); ++ int index = oop_recorder()->find_index(obj); ++ RelocationHolder rspec = metadata_Relocation::spec(index); ++ return AddressLiteral((address)obj, rspec); ++} ++ ++AddressLiteral MacroAssembler::allocate_oop_address(jobject obj) { ++ assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); ++ int oop_index = oop_recorder()->allocate_oop_index(obj); ++ return AddressLiteral(address(obj), oop_Relocation::spec(oop_index)); ++} ++ ++AddressLiteral MacroAssembler::constant_oop_address(jobject obj) { ++ assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); ++ int oop_index = oop_recorder()->find_index(obj); ++ return AddressLiteral(address(obj), oop_Relocation::spec(oop_index)); ++} ++ ++RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr, ++ Register tmp, int offset) { ++ intptr_t value = *delayed_value_addr; ++ if (value != 0) { ++ return RegisterOrConstant(value + offset); ++ } ++ ++ // Load indirectly to solve generation ordering problem. ++ // static address, no relocation ++ int simm16_offset = load_const_optimized(tmp, delayed_value_addr, noreg, true); ++ ld(tmp, simm16_offset, tmp); // must be aligned ((xa & 3) == 0) ++ ++ if (offset != 0) { ++ addi(tmp, tmp, offset); ++ } ++ ++ return RegisterOrConstant(tmp); ++} ++ ++#ifndef PRODUCT ++void MacroAssembler::pd_print_patched_instruction(address branch) { ++ Unimplemented(); // TODO: PPC port ++} ++#endif // ndef PRODUCT ++ ++// Conditional far branch for destinations encodable in 24+2 bits. ++void MacroAssembler::bc_far(int boint, int biint, Label& dest, int optimize) { ++ ++ // If requested by flag optimize, relocate the bc_far as a ++ // runtime_call and prepare for optimizing it when the code gets ++ // relocated. ++ if (optimize == bc_far_optimize_on_relocate) { ++ relocate(relocInfo::runtime_call_type); ++ } ++ ++ // variant 2: ++ // ++ // b!cxx SKIP ++ // bxx DEST ++ // SKIP: ++ // ++ ++ const int opposite_boint = add_bhint_to_boint(opposite_bhint(inv_boint_bhint(boint)), ++ opposite_bcond(inv_boint_bcond(boint))); ++ ++ // We emit two branches. ++ // First, a conditional branch which jumps around the far branch. ++ const address not_taken_pc = pc() + 2 * BytesPerInstWord; ++ const address bc_pc = pc(); ++ bc(opposite_boint, biint, not_taken_pc); ++ ++ const int bc_instr = *(int*)bc_pc; ++ assert(not_taken_pc == (address)inv_bd_field(bc_instr, (intptr_t)bc_pc), "postcondition"); ++ assert(opposite_boint == inv_bo_field(bc_instr), "postcondition"); ++ assert(boint == add_bhint_to_boint(opposite_bhint(inv_boint_bhint(inv_bo_field(bc_instr))), ++ opposite_bcond(inv_boint_bcond(inv_bo_field(bc_instr)))), ++ "postcondition"); ++ assert(biint == inv_bi_field(bc_instr), "postcondition"); ++ ++ // Second, an unconditional far branch which jumps to dest. ++ // Note: target(dest) remembers the current pc (see CodeSection::target) ++ // and returns the current pc if the label is not bound yet; when ++ // the label gets bound, the unconditional far branch will be patched. ++ const address target_pc = target(dest); ++ const address b_pc = pc(); ++ b(target_pc); ++ ++ assert(not_taken_pc == pc(), "postcondition"); ++ assert(dest.is_bound() || target_pc == b_pc, "postcondition"); ++} ++ ++bool MacroAssembler::is_bc_far_at(address instruction_addr) { ++ return is_bc_far_variant1_at(instruction_addr) || ++ is_bc_far_variant2_at(instruction_addr) || ++ is_bc_far_variant3_at(instruction_addr); ++} ++ ++address MacroAssembler::get_dest_of_bc_far_at(address instruction_addr) { ++ if (is_bc_far_variant1_at(instruction_addr)) { ++ const address instruction_1_addr = instruction_addr; ++ const int instruction_1 = *(int*)instruction_1_addr; ++ return (address)inv_bd_field(instruction_1, (intptr_t)instruction_1_addr); ++ } else if (is_bc_far_variant2_at(instruction_addr)) { ++ const address instruction_2_addr = instruction_addr + 4; ++ return bxx_destination(instruction_2_addr); ++ } else if (is_bc_far_variant3_at(instruction_addr)) { ++ return instruction_addr + 8; ++ } ++ // variant 4 ??? ++ ShouldNotReachHere(); ++ return NULL; ++} ++void MacroAssembler::set_dest_of_bc_far_at(address instruction_addr, address dest) { ++ ++ if (is_bc_far_variant3_at(instruction_addr)) { ++ // variant 3, far cond branch to the next instruction, already patched to nops: ++ // ++ // nop ++ // endgroup ++ // SKIP/DEST: ++ // ++ return; ++ } ++ ++ // first, extract boint and biint from the current branch ++ int boint = 0; ++ int biint = 0; ++ ++ ResourceMark rm; ++ const int code_size = 2 * BytesPerInstWord; ++ CodeBuffer buf(instruction_addr, code_size); ++ MacroAssembler masm(&buf); ++ if (is_bc_far_variant2_at(instruction_addr) && dest == instruction_addr + 8) { ++ // Far branch to next instruction: Optimize it by patching nops (produce variant 3). ++ masm.nop(); ++ masm.endgroup(); ++ } else { ++ if (is_bc_far_variant1_at(instruction_addr)) { ++ // variant 1, the 1st instruction contains the destination address: ++ // ++ // bcxx DEST ++ // endgroup ++ // ++ const int instruction_1 = *(int*)(instruction_addr); ++ boint = inv_bo_field(instruction_1); ++ biint = inv_bi_field(instruction_1); ++ } else if (is_bc_far_variant2_at(instruction_addr)) { ++ // variant 2, the 2nd instruction contains the destination address: ++ // ++ // b!cxx SKIP ++ // bxx DEST ++ // SKIP: ++ // ++ const int instruction_1 = *(int*)(instruction_addr); ++ boint = add_bhint_to_boint(opposite_bhint(inv_boint_bhint(inv_bo_field(instruction_1))), ++ opposite_bcond(inv_boint_bcond(inv_bo_field(instruction_1)))); ++ biint = inv_bi_field(instruction_1); ++ } else { ++ // variant 4??? ++ ShouldNotReachHere(); ++ } ++ ++ // second, set the new branch destination and optimize the code ++ if (dest != instruction_addr + 4 && // the bc_far is still unbound! ++ masm.is_within_range_of_bcxx(dest, instruction_addr)) { ++ // variant 1: ++ // ++ // bcxx DEST ++ // endgroup ++ // ++ masm.bc(boint, biint, dest); ++ masm.endgroup(); ++ } else { ++ // variant 2: ++ // ++ // b!cxx SKIP ++ // bxx DEST ++ // SKIP: ++ // ++ const int opposite_boint = add_bhint_to_boint(opposite_bhint(inv_boint_bhint(boint)), ++ opposite_bcond(inv_boint_bcond(boint))); ++ const address not_taken_pc = masm.pc() + 2 * BytesPerInstWord; ++ masm.bc(opposite_boint, biint, not_taken_pc); ++ masm.b(dest); ++ } ++ } ++ ICache::ppc64_flush_icache_bytes(instruction_addr, code_size); ++} ++ ++// Emit a NOT mt-safe patchable 64 bit absolute call/jump. ++void MacroAssembler::bxx64_patchable(address dest, relocInfo::relocType rt, bool link) { ++ // get current pc ++ uint64_t start_pc = (uint64_t) pc(); ++ ++ const address pc_of_bl = (address) (start_pc + (6*BytesPerInstWord)); // bl is last ++ const address pc_of_b = (address) (start_pc + (0*BytesPerInstWord)); // b is first ++ ++ // relocate here ++ if (rt != relocInfo::none) { ++ relocate(rt); ++ } ++ ++ if ( ReoptimizeCallSequences && ++ (( link && is_within_range_of_b(dest, pc_of_bl)) || ++ (!link && is_within_range_of_b(dest, pc_of_b)))) { ++ // variant 2: ++ // Emit an optimized, pc-relative call/jump. ++ ++ if (link) { ++ // some padding ++ nop(); ++ nop(); ++ nop(); ++ nop(); ++ nop(); ++ nop(); ++ ++ // do the call ++ assert(pc() == pc_of_bl, "just checking"); ++ bl(dest, relocInfo::none); ++ } else { ++ // do the jump ++ assert(pc() == pc_of_b, "just checking"); ++ b(dest, relocInfo::none); ++ ++ // some padding ++ nop(); ++ nop(); ++ nop(); ++ nop(); ++ nop(); ++ nop(); ++ } ++ ++ // Assert that we can identify the emitted call/jump. ++ assert(is_bxx64_patchable_variant2_at((address)start_pc, link), ++ "can't identify emitted call"); ++ } else { ++ // variant 1: ++#if defined(ABI_ELFv2) ++ nop(); ++ calculate_address_from_global_toc(R12, dest, true, true, false); ++ mtctr(R12); ++ nop(); ++ nop(); ++#else ++ mr(R0, R11); // spill R11 -> R0. ++ ++ // Load the destination address into CTR, ++ // calculate destination relative to global toc. ++ calculate_address_from_global_toc(R11, dest, true, true, false); ++ ++ mtctr(R11); ++ mr(R11, R0); // spill R11 <- R0. ++ nop(); ++#endif ++ ++ // do the call/jump ++ if (link) { ++ bctrl(); ++ } else{ ++ bctr(); ++ } ++ // Assert that we can identify the emitted call/jump. ++ assert(is_bxx64_patchable_variant1b_at((address)start_pc, link), ++ "can't identify emitted call"); ++ } ++ ++ // Assert that we can identify the emitted call/jump. ++ assert(is_bxx64_patchable_at((address)start_pc, link), ++ "can't identify emitted call"); ++ assert(get_dest_of_bxx64_patchable_at((address)start_pc, link) == dest, ++ "wrong encoding of dest address"); ++} ++ ++// Identify a bxx64_patchable instruction. ++bool MacroAssembler::is_bxx64_patchable_at(address instruction_addr, bool link) { ++ return is_bxx64_patchable_variant1b_at(instruction_addr, link) ++ //|| is_bxx64_patchable_variant1_at(instruction_addr, link) ++ || is_bxx64_patchable_variant2_at(instruction_addr, link); ++} ++ ++// Does the call64_patchable instruction use a pc-relative encoding of ++// the call destination? ++bool MacroAssembler::is_bxx64_patchable_pcrelative_at(address instruction_addr, bool link) { ++ // variant 2 is pc-relative ++ return is_bxx64_patchable_variant2_at(instruction_addr, link); ++} ++ ++// Identify variant 1. ++bool MacroAssembler::is_bxx64_patchable_variant1_at(address instruction_addr, bool link) { ++ unsigned int* instr = (unsigned int*) instruction_addr; ++ return (link ? is_bctrl(instr[6]) : is_bctr(instr[6])) // bctr[l] ++ && is_mtctr(instr[5]) // mtctr ++ && is_load_const_at(instruction_addr); ++} ++ ++// Identify variant 1b: load destination relative to global toc. ++bool MacroAssembler::is_bxx64_patchable_variant1b_at(address instruction_addr, bool link) { ++ unsigned int* instr = (unsigned int*) instruction_addr; ++ return (link ? is_bctrl(instr[6]) : is_bctr(instr[6])) // bctr[l] ++ && is_mtctr(instr[3]) // mtctr ++ && is_calculate_address_from_global_toc_at(instruction_addr + 2*BytesPerInstWord, instruction_addr); ++} ++ ++// Identify variant 2. ++bool MacroAssembler::is_bxx64_patchable_variant2_at(address instruction_addr, bool link) { ++ unsigned int* instr = (unsigned int*) instruction_addr; ++ if (link) { ++ return is_bl (instr[6]) // bl dest is last ++ && is_nop(instr[0]) // nop ++ && is_nop(instr[1]) // nop ++ && is_nop(instr[2]) // nop ++ && is_nop(instr[3]) // nop ++ && is_nop(instr[4]) // nop ++ && is_nop(instr[5]); // nop ++ } else { ++ return is_b (instr[0]) // b dest is first ++ && is_nop(instr[1]) // nop ++ && is_nop(instr[2]) // nop ++ && is_nop(instr[3]) // nop ++ && is_nop(instr[4]) // nop ++ && is_nop(instr[5]) // nop ++ && is_nop(instr[6]); // nop ++ } ++} ++ ++// Set dest address of a bxx64_patchable instruction. ++void MacroAssembler::set_dest_of_bxx64_patchable_at(address instruction_addr, address dest, bool link) { ++ ResourceMark rm; ++ int code_size = MacroAssembler::bxx64_patchable_size; ++ CodeBuffer buf(instruction_addr, code_size); ++ MacroAssembler masm(&buf); ++ masm.bxx64_patchable(dest, relocInfo::none, link); ++ ICache::ppc64_flush_icache_bytes(instruction_addr, code_size); ++} ++ ++// Get dest address of a bxx64_patchable instruction. ++address MacroAssembler::get_dest_of_bxx64_patchable_at(address instruction_addr, bool link) { ++ if (is_bxx64_patchable_variant1_at(instruction_addr, link)) { ++ return (address) (unsigned long) get_const(instruction_addr); ++ } else if (is_bxx64_patchable_variant2_at(instruction_addr, link)) { ++ unsigned int* instr = (unsigned int*) instruction_addr; ++ if (link) { ++ const int instr_idx = 6; // bl is last ++ int branchoffset = branch_destination(instr[instr_idx], 0); ++ return instruction_addr + branchoffset + instr_idx*BytesPerInstWord; ++ } else { ++ const int instr_idx = 0; // b is first ++ int branchoffset = branch_destination(instr[instr_idx], 0); ++ return instruction_addr + branchoffset + instr_idx*BytesPerInstWord; ++ } ++ // Load dest relative to global toc. ++ } else if (is_bxx64_patchable_variant1b_at(instruction_addr, link)) { ++ return get_address_of_calculate_address_from_global_toc_at(instruction_addr + 2*BytesPerInstWord, ++ instruction_addr); ++ } else { ++ ShouldNotReachHere(); ++ return NULL; ++ } ++} ++ ++// Uses ordering which corresponds to ABI: ++// _savegpr0_14: std r14,-144(r1) ++// _savegpr0_15: std r15,-136(r1) ++// _savegpr0_16: std r16,-128(r1) ++void MacroAssembler::save_nonvolatile_gprs(Register dst, int offset) { ++ std(R14, offset, dst); offset += 8; ++ std(R15, offset, dst); offset += 8; ++ std(R16, offset, dst); offset += 8; ++ std(R17, offset, dst); offset += 8; ++ std(R18, offset, dst); offset += 8; ++ std(R19, offset, dst); offset += 8; ++ std(R20, offset, dst); offset += 8; ++ std(R21, offset, dst); offset += 8; ++ std(R22, offset, dst); offset += 8; ++ std(R23, offset, dst); offset += 8; ++ std(R24, offset, dst); offset += 8; ++ std(R25, offset, dst); offset += 8; ++ std(R26, offset, dst); offset += 8; ++ std(R27, offset, dst); offset += 8; ++ std(R28, offset, dst); offset += 8; ++ std(R29, offset, dst); offset += 8; ++ std(R30, offset, dst); offset += 8; ++ std(R31, offset, dst); offset += 8; ++ ++ stfd(F14, offset, dst); offset += 8; ++ stfd(F15, offset, dst); offset += 8; ++ stfd(F16, offset, dst); offset += 8; ++ stfd(F17, offset, dst); offset += 8; ++ stfd(F18, offset, dst); offset += 8; ++ stfd(F19, offset, dst); offset += 8; ++ stfd(F20, offset, dst); offset += 8; ++ stfd(F21, offset, dst); offset += 8; ++ stfd(F22, offset, dst); offset += 8; ++ stfd(F23, offset, dst); offset += 8; ++ stfd(F24, offset, dst); offset += 8; ++ stfd(F25, offset, dst); offset += 8; ++ stfd(F26, offset, dst); offset += 8; ++ stfd(F27, offset, dst); offset += 8; ++ stfd(F28, offset, dst); offset += 8; ++ stfd(F29, offset, dst); offset += 8; ++ stfd(F30, offset, dst); offset += 8; ++ stfd(F31, offset, dst); ++} ++ ++// Uses ordering which corresponds to ABI: ++// _restgpr0_14: ld r14,-144(r1) ++// _restgpr0_15: ld r15,-136(r1) ++// _restgpr0_16: ld r16,-128(r1) ++void MacroAssembler::restore_nonvolatile_gprs(Register src, int offset) { ++ ld(R14, offset, src); offset += 8; ++ ld(R15, offset, src); offset += 8; ++ ld(R16, offset, src); offset += 8; ++ ld(R17, offset, src); offset += 8; ++ ld(R18, offset, src); offset += 8; ++ ld(R19, offset, src); offset += 8; ++ ld(R20, offset, src); offset += 8; ++ ld(R21, offset, src); offset += 8; ++ ld(R22, offset, src); offset += 8; ++ ld(R23, offset, src); offset += 8; ++ ld(R24, offset, src); offset += 8; ++ ld(R25, offset, src); offset += 8; ++ ld(R26, offset, src); offset += 8; ++ ld(R27, offset, src); offset += 8; ++ ld(R28, offset, src); offset += 8; ++ ld(R29, offset, src); offset += 8; ++ ld(R30, offset, src); offset += 8; ++ ld(R31, offset, src); offset += 8; ++ ++ // FP registers ++ lfd(F14, offset, src); offset += 8; ++ lfd(F15, offset, src); offset += 8; ++ lfd(F16, offset, src); offset += 8; ++ lfd(F17, offset, src); offset += 8; ++ lfd(F18, offset, src); offset += 8; ++ lfd(F19, offset, src); offset += 8; ++ lfd(F20, offset, src); offset += 8; ++ lfd(F21, offset, src); offset += 8; ++ lfd(F22, offset, src); offset += 8; ++ lfd(F23, offset, src); offset += 8; ++ lfd(F24, offset, src); offset += 8; ++ lfd(F25, offset, src); offset += 8; ++ lfd(F26, offset, src); offset += 8; ++ lfd(F27, offset, src); offset += 8; ++ lfd(F28, offset, src); offset += 8; ++ lfd(F29, offset, src); offset += 8; ++ lfd(F30, offset, src); offset += 8; ++ lfd(F31, offset, src); ++} ++ ++// For verify_oops. ++void MacroAssembler::save_volatile_gprs(Register dst, int offset) { ++ std(R3, offset, dst); offset += 8; ++ std(R4, offset, dst); offset += 8; ++ std(R5, offset, dst); offset += 8; ++ std(R6, offset, dst); offset += 8; ++ std(R7, offset, dst); offset += 8; ++ std(R8, offset, dst); offset += 8; ++ std(R9, offset, dst); offset += 8; ++ std(R10, offset, dst); offset += 8; ++ std(R11, offset, dst); offset += 8; ++ std(R12, offset, dst); ++} ++ ++// For verify_oops. ++void MacroAssembler::restore_volatile_gprs(Register src, int offset) { ++ ld(R3, offset, src); offset += 8; ++ ld(R4, offset, src); offset += 8; ++ ld(R5, offset, src); offset += 8; ++ ld(R6, offset, src); offset += 8; ++ ld(R7, offset, src); offset += 8; ++ ld(R8, offset, src); offset += 8; ++ ld(R9, offset, src); offset += 8; ++ ld(R10, offset, src); offset += 8; ++ ld(R11, offset, src); offset += 8; ++ ld(R12, offset, src); ++} ++ ++void MacroAssembler::save_LR_CR(Register tmp) { ++ mfcr(tmp); ++ std(tmp, _abi(cr), R1_SP); ++ mflr(tmp); ++ std(tmp, _abi(lr), R1_SP); ++ // Tmp must contain lr on exit! (see return_addr and prolog in ppc64.ad) ++} ++ ++void MacroAssembler::restore_LR_CR(Register tmp) { ++ assert(tmp != R1_SP, "must be distinct"); ++ ld(tmp, _abi(lr), R1_SP); ++ mtlr(tmp); ++ ld(tmp, _abi(cr), R1_SP); ++ mtcr(tmp); ++} ++ ++address MacroAssembler::get_PC_trash_LR(Register result) { ++ Label L; ++ bl(L); ++ bind(L); ++ address lr_pc = pc(); ++ mflr(result); ++ return lr_pc; ++} ++ ++void MacroAssembler::resize_frame(Register offset, Register tmp) { ++#ifdef ASSERT ++ assert_different_registers(offset, tmp, R1_SP); ++ andi_(tmp, offset, frame::alignment_in_bytes-1); ++ asm_assert_eq("resize_frame: unaligned", 0x204); ++#endif ++ ++ // tmp <- *(SP) ++ ld(tmp, _abi(callers_sp), R1_SP); ++ // addr <- SP + offset; ++ // *(addr) <- tmp; ++ // SP <- addr ++ stdux(tmp, R1_SP, offset); ++} ++ ++void MacroAssembler::resize_frame(int offset, Register tmp) { ++ assert(is_simm(offset, 16), "too big an offset"); ++ assert_different_registers(tmp, R1_SP); ++ assert((offset & (frame::alignment_in_bytes-1))==0, "resize_frame: unaligned"); ++ // tmp <- *(SP) ++ ld(tmp, _abi(callers_sp), R1_SP); ++ // addr <- SP + offset; ++ // *(addr) <- tmp; ++ // SP <- addr ++ stdu(tmp, offset, R1_SP); ++} ++ ++void MacroAssembler::resize_frame_absolute(Register addr, Register tmp1, Register tmp2) { ++ // (addr == tmp1) || (addr == tmp2) is allowed here! ++ assert(tmp1 != tmp2, "must be distinct"); ++ ++ // compute offset w.r.t. current stack pointer ++ // tmp_1 <- addr - SP (!) ++ subf(tmp1, R1_SP, addr); ++ ++ // atomically update SP keeping back link. ++ resize_frame(tmp1/* offset */, tmp2/* tmp */); ++} ++ ++void MacroAssembler::push_frame(Register bytes, Register tmp) { ++#ifdef ASSERT ++ assert(bytes != R0, "r0 not allowed here"); ++ andi_(R0, bytes, frame::alignment_in_bytes-1); ++ asm_assert_eq("push_frame(Reg, Reg): unaligned", 0x203); ++#endif ++ neg(tmp, bytes); ++ stdux(R1_SP, R1_SP, tmp); ++} ++ ++// Push a frame of size `bytes'. ++void MacroAssembler::push_frame(unsigned int bytes, Register tmp) { ++ long offset = align_addr(bytes, frame::alignment_in_bytes); ++ if (is_simm(-offset, 16)) { ++ stdu(R1_SP, -offset, R1_SP); ++ } else { ++ load_const(tmp, -offset); ++ stdux(R1_SP, R1_SP, tmp); ++ } ++} ++ ++// Push a frame of size `bytes' plus abi_reg_args on top. ++void MacroAssembler::push_frame_reg_args(unsigned int bytes, Register tmp) { ++ push_frame(bytes + frame::abi_reg_args_size, tmp); ++} ++ ++// Setup up a new C frame with a spill area for non-volatile GPRs and ++// additional space for local variables. ++void MacroAssembler::push_frame_reg_args_nonvolatiles(unsigned int bytes, ++ Register tmp) { ++ push_frame(bytes + frame::abi_reg_args_size + frame::spill_nonvolatiles_size, tmp); ++} ++ ++// Pop current C frame. ++void MacroAssembler::pop_frame() { ++ ld(R1_SP, _abi(callers_sp), R1_SP); ++} ++ ++#if defined(ABI_ELFv2) ++address MacroAssembler::branch_to(Register r_function_entry, bool and_link) { ++ // TODO(asmundak): make sure the caller uses R12 as function descriptor ++ // most of the times. ++ if (R12 != r_function_entry) { ++ mr(R12, r_function_entry); ++ } ++ mtctr(R12); ++ // Do a call or a branch. ++ if (and_link) { ++ bctrl(); ++ } else { ++ bctr(); ++ } ++ _last_calls_return_pc = pc(); ++ ++ return _last_calls_return_pc; ++} ++ ++// Call a C function via a function descriptor and use full C ++// calling conventions. Updates and returns _last_calls_return_pc. ++address MacroAssembler::call_c(Register r_function_entry) { ++ return branch_to(r_function_entry, /*and_link=*/true); ++} ++ ++// For tail calls: only branch, don't link, so callee returns to caller of this function. ++address MacroAssembler::call_c_and_return_to_caller(Register r_function_entry) { ++ return branch_to(r_function_entry, /*and_link=*/false); ++} ++ ++address MacroAssembler::call_c(address function_entry, relocInfo::relocType rt) { ++ load_const(R12, function_entry, R0); ++ return branch_to(R12, /*and_link=*/true); ++} ++ ++#else ++// Generic version of a call to C function via a function descriptor ++// with variable support for C calling conventions (TOC, ENV, etc.). ++// Updates and returns _last_calls_return_pc. ++address MacroAssembler::branch_to(Register function_descriptor, bool and_link, bool save_toc_before_call, ++ bool restore_toc_after_call, bool load_toc_of_callee, bool load_env_of_callee) { ++ // we emit standard ptrgl glue code here ++ assert((function_descriptor != R0), "function_descriptor cannot be R0"); ++ ++ // retrieve necessary entries from the function descriptor ++ ld(R0, in_bytes(FunctionDescriptor::entry_offset()), function_descriptor); ++ mtctr(R0); ++ ++ if (load_toc_of_callee) { ++ ld(R2_TOC, in_bytes(FunctionDescriptor::toc_offset()), function_descriptor); ++ } ++ if (load_env_of_callee) { ++ ld(R11, in_bytes(FunctionDescriptor::env_offset()), function_descriptor); ++ } else if (load_toc_of_callee) { ++ li(R11, 0); ++ } ++ ++ // do a call or a branch ++ if (and_link) { ++ bctrl(); ++ } else { ++ bctr(); ++ } ++ _last_calls_return_pc = pc(); ++ ++ return _last_calls_return_pc; ++} ++ ++// Call a C function via a function descriptor and use full C calling ++// conventions. ++// We don't use the TOC in generated code, so there is no need to save ++// and restore its value. ++address MacroAssembler::call_c(Register fd) { ++ return branch_to(fd, /*and_link=*/true, ++ /*save toc=*/false, ++ /*restore toc=*/false, ++ /*load toc=*/true, ++ /*load env=*/true); ++} ++ ++address MacroAssembler::call_c_and_return_to_caller(Register fd) { ++ return branch_to(fd, /*and_link=*/false, ++ /*save toc=*/false, ++ /*restore toc=*/false, ++ /*load toc=*/true, ++ /*load env=*/true); ++} ++ ++address MacroAssembler::call_c(const FunctionDescriptor* fd, relocInfo::relocType rt) { ++ if (rt != relocInfo::none) { ++ // this call needs to be relocatable ++ if (!ReoptimizeCallSequences ++ || (rt != relocInfo::runtime_call_type && rt != relocInfo::none) ++ || fd == NULL // support code-size estimation ++ || !fd->is_friend_function() ++ || fd->entry() == NULL) { ++ // it's not a friend function as defined by class FunctionDescriptor, ++ // so do a full call-c here. ++ load_const(R11, (address)fd, R0); ++ ++ bool has_env = (fd != NULL && fd->env() != NULL); ++ return branch_to(R11, /*and_link=*/true, ++ /*save toc=*/false, ++ /*restore toc=*/false, ++ /*load toc=*/true, ++ /*load env=*/has_env); ++ } else { ++ // It's a friend function. Load the entry point and don't care about ++ // toc and env. Use an optimizable call instruction, but ensure the ++ // same code-size as in the case of a non-friend function. ++ nop(); ++ nop(); ++ nop(); ++ bl64_patchable(fd->entry(), rt); ++ _last_calls_return_pc = pc(); ++ return _last_calls_return_pc; ++ } ++ } else { ++ // This call does not need to be relocatable, do more aggressive ++ // optimizations. ++ if (!ReoptimizeCallSequences ++ || !fd->is_friend_function()) { ++ // It's not a friend function as defined by class FunctionDescriptor, ++ // so do a full call-c here. ++ load_const(R11, (address)fd, R0); ++ return branch_to(R11, /*and_link=*/true, ++ /*save toc=*/false, ++ /*restore toc=*/false, ++ /*load toc=*/true, ++ /*load env=*/true); ++ } else { ++ // it's a friend function, load the entry point and don't care about ++ // toc and env. ++ address dest = fd->entry(); ++ if (is_within_range_of_b(dest, pc())) { ++ bl(dest); ++ } else { ++ bl64_patchable(dest, rt); ++ } ++ _last_calls_return_pc = pc(); ++ return _last_calls_return_pc; ++ } ++ } ++} ++ ++// Call a C function. All constants needed reside in TOC. ++// ++// Read the address to call from the TOC. ++// Read env from TOC, if fd specifies an env. ++// Read new TOC from TOC. ++address MacroAssembler::call_c_using_toc(const FunctionDescriptor* fd, ++ relocInfo::relocType rt, Register toc) { ++ if (!ReoptimizeCallSequences ++ || (rt != relocInfo::runtime_call_type && rt != relocInfo::none) ++ || !fd->is_friend_function()) { ++ // It's not a friend function as defined by class FunctionDescriptor, ++ // so do a full call-c here. ++ assert(fd->entry() != NULL, "function must be linked"); ++ ++ AddressLiteral fd_entry(fd->entry()); ++ load_const_from_method_toc(R11, fd_entry, toc); ++ mtctr(R11); ++ if (fd->env() == NULL) { ++ li(R11, 0); ++ nop(); ++ } else { ++ AddressLiteral fd_env(fd->env()); ++ load_const_from_method_toc(R11, fd_env, toc); ++ } ++ AddressLiteral fd_toc(fd->toc()); ++ load_toc_from_toc(R2_TOC, fd_toc, toc); ++ // R2_TOC is killed. ++ bctrl(); ++ _last_calls_return_pc = pc(); ++ } else { ++ // It's a friend function, load the entry point and don't care about ++ // toc and env. Use an optimizable call instruction, but ensure the ++ // same code-size as in the case of a non-friend function. ++ nop(); ++ bl64_patchable(fd->entry(), rt); ++ _last_calls_return_pc = pc(); ++ } ++ return _last_calls_return_pc; ++} ++#endif // ABI_ELFv2 ++ ++void MacroAssembler::call_VM_base(Register oop_result, ++ Register last_java_sp, ++ address entry_point, ++ bool check_exceptions) { ++ BLOCK_COMMENT("call_VM {"); ++ // Determine last_java_sp register. ++ if (!last_java_sp->is_valid()) { ++ last_java_sp = R1_SP; ++ } ++ set_top_ijava_frame_at_SP_as_last_Java_frame(last_java_sp, R11_scratch1); ++ ++ // ARG1 must hold thread address. ++ mr(R3_ARG1, R16_thread); ++#if defined(ABI_ELFv2) ++ address return_pc = call_c(entry_point, relocInfo::none); ++#else ++ address return_pc = call_c((FunctionDescriptor*)entry_point, relocInfo::none); ++#endif ++ ++ reset_last_Java_frame(); ++ ++ // Check for pending exceptions. ++ if (check_exceptions) { ++ // We don't check for exceptions here. ++ ShouldNotReachHere(); ++ } ++ ++ // Get oop result if there is one and reset the value in the thread. ++ if (oop_result->is_valid()) { ++ get_vm_result(oop_result); ++ } ++ ++ _last_calls_return_pc = return_pc; ++ BLOCK_COMMENT("} call_VM"); ++} ++ ++void MacroAssembler::call_VM_leaf_base(address entry_point) { ++ BLOCK_COMMENT("call_VM_leaf {"); ++#if defined(ABI_ELFv2) ++ call_c(entry_point, relocInfo::none); ++#else ++ call_c(CAST_FROM_FN_PTR(FunctionDescriptor*, entry_point), relocInfo::none); ++#endif ++ BLOCK_COMMENT("} call_VM_leaf"); ++} ++ ++void MacroAssembler::call_VM(Register oop_result, address entry_point, bool check_exceptions) { ++ call_VM_base(oop_result, noreg, entry_point, check_exceptions); ++} ++ ++void MacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, ++ bool check_exceptions) { ++ // R3_ARG1 is reserved for the thread. ++ mr_if_needed(R4_ARG2, arg_1); ++ call_VM(oop_result, entry_point, check_exceptions); ++} ++ ++void MacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, ++ bool check_exceptions) { ++ // R3_ARG1 is reserved for the thread ++ mr_if_needed(R4_ARG2, arg_1); ++ assert(arg_2 != R4_ARG2, "smashed argument"); ++ mr_if_needed(R5_ARG3, arg_2); ++ call_VM(oop_result, entry_point, check_exceptions); ++} ++ ++void MacroAssembler::call_VM_leaf(address entry_point) { ++ call_VM_leaf_base(entry_point); ++} ++ ++void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1) { ++ mr_if_needed(R3_ARG1, arg_1); ++ call_VM_leaf(entry_point); ++} ++ ++void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1, Register arg_2) { ++ mr_if_needed(R3_ARG1, arg_1); ++ assert(arg_2 != R3_ARG1, "smashed argument"); ++ mr_if_needed(R4_ARG2, arg_2); ++ call_VM_leaf(entry_point); ++} ++ ++void MacroAssembler::call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3) { ++ mr_if_needed(R3_ARG1, arg_1); ++ assert(arg_2 != R3_ARG1, "smashed argument"); ++ mr_if_needed(R4_ARG2, arg_2); ++ assert(arg_3 != R3_ARG1 && arg_3 != R4_ARG2, "smashed argument"); ++ mr_if_needed(R5_ARG3, arg_3); ++ call_VM_leaf(entry_point); ++} ++ ++// Check whether instruction is a read access to the polling page ++// which was emitted by load_from_polling_page(..). ++bool MacroAssembler::is_load_from_polling_page(int instruction, void* ucontext, ++ address* polling_address_ptr) { ++ if (!is_ld(instruction)) ++ return false; // It's not a ld. Fail. ++ ++ int rt = inv_rt_field(instruction); ++ int ra = inv_ra_field(instruction); ++ int ds = inv_ds_field(instruction); ++ if (!(ds == 0 && ra != 0 && rt == 0)) { ++ return false; // It's not a ld(r0, X, ra). Fail. ++ } ++ ++ if (!ucontext) { ++ // Set polling address. ++ if (polling_address_ptr != NULL) { ++ *polling_address_ptr = NULL; ++ } ++ return true; // No ucontext given. Can't check value of ra. Assume true. ++ } ++ ++#ifdef LINUX ++ // Ucontext given. Check that register ra contains the address of ++ // the safepoing polling page. ++ ucontext_t* uc = (ucontext_t*) ucontext; ++ // Set polling address. ++ address addr = (address)uc->uc_mcontext.regs->gpr[ra] + (ssize_t)ds; ++ if (polling_address_ptr != NULL) { ++ *polling_address_ptr = addr; ++ } ++ return os::is_poll_address(addr); ++#else ++ // Not on Linux, ucontext must be NULL. ++ ShouldNotReachHere(); ++ return false; ++#endif ++} ++ ++bool MacroAssembler::is_memory_serialization(int instruction, JavaThread* thread, void* ucontext) { ++#ifdef LINUX ++ ucontext_t* uc = (ucontext_t*) ucontext; ++ ++ if (is_stwx(instruction) || is_stwux(instruction)) { ++ int ra = inv_ra_field(instruction); ++ int rb = inv_rb_field(instruction); ++ ++ // look up content of ra and rb in ucontext ++ address ra_val=(address)uc->uc_mcontext.regs->gpr[ra]; ++ long rb_val=(long)uc->uc_mcontext.regs->gpr[rb]; ++ return os::is_memory_serialize_page(thread, ra_val+rb_val); ++ } else if (is_stw(instruction) || is_stwu(instruction)) { ++ int ra = inv_ra_field(instruction); ++ int d1 = inv_d1_field(instruction); ++ ++ // look up content of ra in ucontext ++ address ra_val=(address)uc->uc_mcontext.regs->gpr[ra]; ++ return os::is_memory_serialize_page(thread, ra_val+d1); ++ } else { ++ return false; ++ } ++#else ++ // workaround not needed on !LINUX :-) ++ ShouldNotCallThis(); ++ return false; ++#endif ++} ++ ++void MacroAssembler::bang_stack_with_offset(int offset) { ++ // When increasing the stack, the old stack pointer will be written ++ // to the new top of stack according to the PPC64 abi. ++ // Therefore, stack banging is not necessary when increasing ++ // the stack by <= os::vm_page_size() bytes. ++ // When increasing the stack by a larger amount, this method is ++ // called repeatedly to bang the intermediate pages. ++ ++ // Stack grows down, caller passes positive offset. ++ assert(offset > 0, "must bang with positive offset"); ++ ++ long stdoffset = -offset; ++ ++ if (is_simm(stdoffset, 16)) { ++ // Signed 16 bit offset, a simple std is ok. ++ if (UseLoadInstructionsForStackBangingPPC64) { ++ ld(R0, (int)(signed short)stdoffset, R1_SP); ++ } else { ++ std(R0,(int)(signed short)stdoffset, R1_SP); ++ } ++ } else if (is_simm(stdoffset, 31)) { ++ const int hi = MacroAssembler::largeoffset_si16_si16_hi(stdoffset); ++ const int lo = MacroAssembler::largeoffset_si16_si16_lo(stdoffset); ++ ++ Register tmp = R11; ++ addis(tmp, R1_SP, hi); ++ if (UseLoadInstructionsForStackBangingPPC64) { ++ ld(R0, lo, tmp); ++ } else { ++ std(R0, lo, tmp); ++ } ++ } else { ++ ShouldNotReachHere(); ++ } ++} ++ ++// If instruction is a stack bang of the form ++// std R0, x(Ry), (see bang_stack_with_offset()) ++// stdu R1_SP, x(R1_SP), (see push_frame(), resize_frame()) ++// or stdux R1_SP, Rx, R1_SP (see push_frame(), resize_frame()) ++// return the banged address. Otherwise, return 0. ++address MacroAssembler::get_stack_bang_address(int instruction, void *ucontext) { ++#ifdef LINUX ++ ucontext_t* uc = (ucontext_t*) ucontext; ++ int rs = inv_rs_field(instruction); ++ int ra = inv_ra_field(instruction); ++ if ( (is_ld(instruction) && rs == 0 && UseLoadInstructionsForStackBangingPPC64) ++ || (is_std(instruction) && rs == 0 && !UseLoadInstructionsForStackBangingPPC64) ++ || (is_stdu(instruction) && rs == 1)) { ++ int ds = inv_ds_field(instruction); ++ // return banged address ++ return ds+(address)uc->uc_mcontext.regs->gpr[ra]; ++ } else if (is_stdux(instruction) && rs == 1) { ++ int rb = inv_rb_field(instruction); ++ address sp = (address)uc->uc_mcontext.regs->gpr[1]; ++ long rb_val = (long)uc->uc_mcontext.regs->gpr[rb]; ++ return ra != 1 || rb_val >= 0 ? NULL // not a stack bang ++ : sp + rb_val; // banged address ++ } ++ return NULL; // not a stack bang ++#else ++ // workaround not needed on !LINUX :-) ++ ShouldNotCallThis(); ++ return NULL; ++#endif ++} ++ ++// CmpxchgX sets condition register to cmpX(current, compare). ++void MacroAssembler::cmpxchgw(ConditionRegister flag, Register dest_current_value, ++ Register compare_value, Register exchange_value, ++ Register addr_base, int semantics, bool cmpxchgx_hint, ++ Register int_flag_success, bool contention_hint) { ++ Label retry; ++ Label failed; ++ Label done; ++ ++ // Save one branch if result is returned via register and ++ // result register is different from the other ones. ++ bool use_result_reg = (int_flag_success != noreg); ++ bool preset_result_reg = (int_flag_success != dest_current_value && int_flag_success != compare_value && ++ int_flag_success != exchange_value && int_flag_success != addr_base); ++ ++ // release/fence semantics ++ if (semantics & MemBarRel) { ++ release(); ++ } ++ ++ if (use_result_reg && preset_result_reg) { ++ li(int_flag_success, 0); // preset (assume cas failed) ++ } ++ ++ // Add simple guard in order to reduce risk of starving under high contention (recommended by IBM). ++ if (contention_hint) { // Don't try to reserve if cmp fails. ++ lwz(dest_current_value, 0, addr_base); ++ cmpw(flag, dest_current_value, compare_value); ++ bne(flag, failed); ++ } ++ ++ // atomic emulation loop ++ bind(retry); ++ ++ lwarx(dest_current_value, addr_base, cmpxchgx_hint); ++ cmpw(flag, dest_current_value, compare_value); ++ if (UseStaticBranchPredictionInCompareAndSwapPPC64) { ++ bne_predict_not_taken(flag, failed); ++ } else { ++ bne( flag, failed); ++ } ++ // branch to done => (flag == ne), (dest_current_value != compare_value) ++ // fall through => (flag == eq), (dest_current_value == compare_value) ++ ++ stwcx_(exchange_value, addr_base); ++ if (UseStaticBranchPredictionInCompareAndSwapPPC64) { ++ bne_predict_not_taken(CCR0, retry); // StXcx_ sets CCR0. ++ } else { ++ bne( CCR0, retry); // StXcx_ sets CCR0. ++ } ++ // fall through => (flag == eq), (dest_current_value == compare_value), (swapped) ++ ++ // Result in register (must do this at the end because int_flag_success can be the ++ // same register as one above). ++ if (use_result_reg) { ++ li(int_flag_success, 1); ++ } ++ ++ if (semantics & MemBarFenceAfter) { ++ fence(); ++ } else if (semantics & MemBarAcq) { ++ isync(); ++ } ++ ++ if (use_result_reg && !preset_result_reg) { ++ b(done); ++ } ++ ++ bind(failed); ++ if (use_result_reg && !preset_result_reg) { ++ li(int_flag_success, 0); ++ } ++ ++ bind(done); ++ // (flag == ne) => (dest_current_value != compare_value), (!swapped) ++ // (flag == eq) => (dest_current_value == compare_value), ( swapped) ++} ++ ++// Preforms atomic compare exchange: ++// if (compare_value == *addr_base) ++// *addr_base = exchange_value ++// int_flag_success = 1; ++// else ++// int_flag_success = 0; ++// ++// ConditionRegister flag = cmp(compare_value, *addr_base) ++// Register dest_current_value = *addr_base ++// Register compare_value Used to compare with value in memory ++// Register exchange_value Written to memory if compare_value == *addr_base ++// Register addr_base The memory location to compareXChange ++// Register int_flag_success Set to 1 if exchange_value was written to *addr_base ++// ++// To avoid the costly compare exchange the value is tested beforehand. ++// Several special cases exist to avoid that unnecessary information is generated. ++// ++void MacroAssembler::cmpxchgd(ConditionRegister flag, ++ Register dest_current_value, Register compare_value, Register exchange_value, ++ Register addr_base, int semantics, bool cmpxchgx_hint, ++ Register int_flag_success, Label* failed_ext, bool contention_hint) { ++ Label retry; ++ Label failed_int; ++ Label& failed = (failed_ext != NULL) ? *failed_ext : failed_int; ++ Label done; ++ ++ // Save one branch if result is returned via register and result register is different from the other ones. ++ bool use_result_reg = (int_flag_success!=noreg); ++ bool preset_result_reg = (int_flag_success!=dest_current_value && int_flag_success!=compare_value && ++ int_flag_success!=exchange_value && int_flag_success!=addr_base); ++ assert(int_flag_success == noreg || failed_ext == NULL, "cannot have both"); ++ ++ // release/fence semantics ++ if (semantics & MemBarRel) { ++ release(); ++ } ++ ++ if (use_result_reg && preset_result_reg) { ++ li(int_flag_success, 0); // preset (assume cas failed) ++ } ++ ++ // Add simple guard in order to reduce risk of starving under high contention (recommended by IBM). ++ if (contention_hint) { // Don't try to reserve if cmp fails. ++ ld(dest_current_value, 0, addr_base); ++ cmpd(flag, dest_current_value, compare_value); ++ bne(flag, failed); ++ } ++ ++ // atomic emulation loop ++ bind(retry); ++ ++ ldarx(dest_current_value, addr_base, cmpxchgx_hint); ++ cmpd(flag, dest_current_value, compare_value); ++ if (UseStaticBranchPredictionInCompareAndSwapPPC64) { ++ bne_predict_not_taken(flag, failed); ++ } else { ++ bne( flag, failed); ++ } ++ ++ stdcx_(exchange_value, addr_base); ++ if (UseStaticBranchPredictionInCompareAndSwapPPC64) { ++ bne_predict_not_taken(CCR0, retry); // stXcx_ sets CCR0 ++ } else { ++ bne( CCR0, retry); // stXcx_ sets CCR0 ++ } ++ ++ // result in register (must do this at the end because int_flag_success can be the same register as one above) ++ if (use_result_reg) { ++ li(int_flag_success, 1); ++ } ++ ++ // POWER6 doesn't need isync in CAS. ++ // Always emit isync to be on the safe side. ++ if (semantics & MemBarFenceAfter) { ++ fence(); ++ } else if (semantics & MemBarAcq) { ++ isync(); ++ } ++ ++ if (use_result_reg && !preset_result_reg) { ++ b(done); ++ } ++ ++ bind(failed_int); ++ if (use_result_reg && !preset_result_reg) { ++ li(int_flag_success, 0); ++ } ++ ++ bind(done); ++ // (flag == ne) => (dest_current_value != compare_value), (!swapped) ++ // (flag == eq) => (dest_current_value == compare_value), ( swapped) ++} ++ ++// Look up the method for a megamorphic invokeinterface call. ++// The target method is determined by . ++// The receiver klass is in recv_klass. ++// On success, the result will be in method_result, and execution falls through. ++// On failure, execution transfers to the given label. ++void MacroAssembler::lookup_interface_method(Register recv_klass, ++ Register intf_klass, ++ RegisterOrConstant itable_index, ++ Register method_result, ++ Register scan_temp, ++ Register sethi_temp, ++ Label& L_no_such_interface) { ++ assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); ++ assert(itable_index.is_constant() || itable_index.as_register() == method_result, ++ "caller must use same register for non-constant itable index as for method"); ++ ++ // Compute start of first itableOffsetEntry (which is at the end of the vtable). ++ int vtable_base = InstanceKlass::vtable_start_offset() * wordSize; ++ int itentry_off = itableMethodEntry::method_offset_in_bytes(); ++ int logMEsize = exact_log2(itableMethodEntry::size() * wordSize); ++ int scan_step = itableOffsetEntry::size() * wordSize; ++ int log_vte_size= exact_log2(vtableEntry::size() * wordSize); ++ ++ lwz(scan_temp, InstanceKlass::vtable_length_offset() * wordSize, recv_klass); ++ // %%% We should store the aligned, prescaled offset in the klassoop. ++ // Then the next several instructions would fold away. ++ ++ sldi(scan_temp, scan_temp, log_vte_size); ++ addi(scan_temp, scan_temp, vtable_base); ++ add(scan_temp, recv_klass, scan_temp); ++ ++ // Adjust recv_klass by scaled itable_index, so we can free itable_index. ++ if (itable_index.is_register()) { ++ Register itable_offset = itable_index.as_register(); ++ sldi(itable_offset, itable_offset, logMEsize); ++ if (itentry_off) addi(itable_offset, itable_offset, itentry_off); ++ add(recv_klass, itable_offset, recv_klass); ++ } else { ++ long itable_offset = (long)itable_index.as_constant(); ++ load_const_optimized(sethi_temp, (itable_offset<itable(); scan->interface() != NULL; scan += scan_step) { ++ // if (scan->interface() == intf) { ++ // result = (klass + scan->offset() + itable_index); ++ // } ++ // } ++ Label search, found_method; ++ ++ for (int peel = 1; peel >= 0; peel--) { ++ // %%%% Could load both offset and interface in one ldx, if they were ++ // in the opposite order. This would save a load. ++ ld(method_result, itableOffsetEntry::interface_offset_in_bytes(), scan_temp); ++ ++ // Check that this entry is non-null. A null entry means that ++ // the receiver class doesn't implement the interface, and wasn't the ++ // same as when the caller was compiled. ++ cmpd(CCR0, method_result, intf_klass); ++ ++ if (peel) { ++ beq(CCR0, found_method); ++ } else { ++ bne(CCR0, search); ++ // (invert the test to fall through to found_method...) ++ } ++ ++ if (!peel) break; ++ ++ bind(search); ++ ++ cmpdi(CCR0, method_result, 0); ++ beq(CCR0, L_no_such_interface); ++ addi(scan_temp, scan_temp, scan_step); ++ } ++ ++ bind(found_method); ++ ++ // Got a hit. ++ int ito_offset = itableOffsetEntry::offset_offset_in_bytes(); ++ lwz(scan_temp, ito_offset, scan_temp); ++ ldx(method_result, scan_temp, recv_klass); ++} ++ ++// virtual method calling ++void MacroAssembler::lookup_virtual_method(Register recv_klass, ++ RegisterOrConstant vtable_index, ++ Register method_result) { ++ ++ assert_different_registers(recv_klass, method_result, vtable_index.register_or_noreg()); ++ ++ const int base = InstanceKlass::vtable_start_offset() * wordSize; ++ assert(vtableEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); ++ ++ if (vtable_index.is_register()) { ++ sldi(vtable_index.as_register(), vtable_index.as_register(), LogBytesPerWord); ++ add(recv_klass, vtable_index.as_register(), recv_klass); ++ } else { ++ addi(recv_klass, recv_klass, vtable_index.as_constant() << LogBytesPerWord); ++ } ++ ld(R19_method, base + vtableEntry::method_offset_in_bytes(), recv_klass); ++} ++ ++/////////////////////////////////////////// subtype checking //////////////////////////////////////////// ++ ++void MacroAssembler::check_klass_subtype_fast_path(Register sub_klass, ++ Register super_klass, ++ Register temp1_reg, ++ Register temp2_reg, ++ Label& L_success, ++ Label& L_failure) { ++ ++ const Register check_cache_offset = temp1_reg; ++ const Register cached_super = temp2_reg; ++ ++ assert_different_registers(sub_klass, super_klass, check_cache_offset, cached_super); ++ ++ int sco_offset = in_bytes(Klass::super_check_offset_offset()); ++ int sc_offset = in_bytes(Klass::secondary_super_cache_offset()); ++ ++ // If the pointers are equal, we are done (e.g., String[] elements). ++ // This self-check enables sharing of secondary supertype arrays among ++ // non-primary types such as array-of-interface. Otherwise, each such ++ // type would need its own customized SSA. ++ // We move this check to the front of the fast path because many ++ // type checks are in fact trivially successful in this manner, ++ // so we get a nicely predicted branch right at the start of the check. ++ cmpd(CCR0, sub_klass, super_klass); ++ beq(CCR0, L_success); ++ ++ // Check the supertype display: ++ lwz(check_cache_offset, sco_offset, super_klass); ++ // The loaded value is the offset from KlassOopDesc. ++ ++ ldx(cached_super, check_cache_offset, sub_klass); ++ cmpd(CCR0, cached_super, super_klass); ++ beq(CCR0, L_success); ++ ++ // This check has worked decisively for primary supers. ++ // Secondary supers are sought in the super_cache ('super_cache_addr'). ++ // (Secondary supers are interfaces and very deeply nested subtypes.) ++ // This works in the same check above because of a tricky aliasing ++ // between the super_cache and the primary super display elements. ++ // (The 'super_check_addr' can address either, as the case requires.) ++ // Note that the cache is updated below if it does not help us find ++ // what we need immediately. ++ // So if it was a primary super, we can just fail immediately. ++ // Otherwise, it's the slow path for us (no success at this point). ++ ++ cmpwi(CCR0, check_cache_offset, sc_offset); ++ bne(CCR0, L_failure); ++ // bind(slow_path); // fallthru ++} ++ ++void MacroAssembler::check_klass_subtype_slow_path(Register sub_klass, ++ Register super_klass, ++ Register temp1_reg, ++ Register temp2_reg, ++ Label* L_success, ++ Register result_reg) { ++ const Register array_ptr = temp1_reg; // current value from cache array ++ const Register temp = temp2_reg; ++ ++ assert_different_registers(sub_klass, super_klass, array_ptr, temp); ++ ++ int source_offset = in_bytes(Klass::secondary_supers_offset()); ++ int target_offset = in_bytes(Klass::secondary_super_cache_offset()); ++ ++ int length_offset = Array::length_offset_in_bytes(); ++ int base_offset = Array::base_offset_in_bytes(); ++ ++ Label hit, loop, failure, fallthru; ++ ++ ld(array_ptr, source_offset, sub_klass); ++ ++ //assert(4 == arrayOopDesc::length_length_in_bytes(), "precondition violated."); ++ lwz(temp, length_offset, array_ptr); ++ cmpwi(CCR0, temp, 0); ++ beq(CCR0, result_reg!=noreg ? failure : fallthru); // length 0 ++ ++ mtctr(temp); // load ctr ++ ++ bind(loop); ++ // Oops in table are NO MORE compressed. ++ ld(temp, base_offset, array_ptr); ++ cmpd(CCR0, temp, super_klass); ++ beq(CCR0, hit); ++ addi(array_ptr, array_ptr, BytesPerWord); ++ bdnz(loop); ++ ++ bind(failure); ++ if (result_reg!=noreg) li(result_reg, 1); // load non-zero result (indicates a miss) ++ b(fallthru); ++ ++ bind(hit); ++ std(super_klass, target_offset, sub_klass); // save result to cache ++ if (result_reg != noreg) li(result_reg, 0); // load zero result (indicates a hit) ++ if (L_success != NULL) b(*L_success); ++ ++ bind(fallthru); ++} ++ ++// Try fast path, then go to slow one if not successful ++void MacroAssembler::check_klass_subtype(Register sub_klass, ++ Register super_klass, ++ Register temp1_reg, ++ Register temp2_reg, ++ Label& L_success) { ++ Label L_failure; ++ check_klass_subtype_fast_path(sub_klass, super_klass, temp1_reg, temp2_reg, L_success, L_failure); ++ check_klass_subtype_slow_path(sub_klass, super_klass, temp1_reg, temp2_reg, &L_success); ++ bind(L_failure); // Fallthru if not successful. ++} ++ ++void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg, ++ Register temp_reg, ++ Label& wrong_method_type) { ++ assert_different_registers(mtype_reg, mh_reg, temp_reg); ++ // Compare method type against that of the receiver. ++ load_heap_oop_not_null(temp_reg, delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg), mh_reg); ++ cmpd(CCR0, temp_reg, mtype_reg); ++ bne(CCR0, wrong_method_type); ++} ++ ++RegisterOrConstant MacroAssembler::argument_offset(RegisterOrConstant arg_slot, ++ Register temp_reg, ++ int extra_slot_offset) { ++ // cf. TemplateTable::prepare_invoke(), if (load_receiver). ++ int stackElementSize = Interpreter::stackElementSize; ++ int offset = extra_slot_offset * stackElementSize; ++ if (arg_slot.is_constant()) { ++ offset += arg_slot.as_constant() * stackElementSize; ++ return offset; ++ } else { ++ assert(temp_reg != noreg, "must specify"); ++ sldi(temp_reg, arg_slot.as_register(), exact_log2(stackElementSize)); ++ if (offset != 0) ++ addi(temp_reg, temp_reg, offset); ++ return temp_reg; ++ } ++} ++ ++void MacroAssembler::biased_locking_enter(ConditionRegister cr_reg, Register obj_reg, ++ Register mark_reg, Register temp_reg, ++ Register temp2_reg, Label& done, Label* slow_case) { ++ assert(UseBiasedLocking, "why call this otherwise?"); ++ ++#ifdef ASSERT ++ assert_different_registers(obj_reg, mark_reg, temp_reg, temp2_reg); ++#endif ++ ++ Label cas_label; ++ ++ // Branch to done if fast path fails and no slow_case provided. ++ Label *slow_case_int = (slow_case != NULL) ? slow_case : &done; ++ ++ // Biased locking ++ // See whether the lock is currently biased toward our thread and ++ // whether the epoch is still valid ++ // Note that the runtime guarantees sufficient alignment of JavaThread ++ // pointers to allow age to be placed into low bits ++ assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, ++ "biased locking makes assumptions about bit layout"); ++ ++ if (PrintBiasedLockingStatistics) { ++ load_const(temp_reg, (address) BiasedLocking::total_entry_count_addr(), temp2_reg); ++ lwz(temp2_reg, 0, temp_reg); ++ addi(temp2_reg, temp2_reg, 1); ++ stw(temp2_reg, 0, temp_reg); ++ } ++ ++ andi(temp_reg, mark_reg, markOopDesc::biased_lock_mask_in_place); ++ cmpwi(cr_reg, temp_reg, markOopDesc::biased_lock_pattern); ++ bne(cr_reg, cas_label); ++ ++ load_klass(temp_reg, obj_reg); ++ ++ load_const_optimized(temp2_reg, ~((int) markOopDesc::age_mask_in_place)); ++ ld(temp_reg, in_bytes(Klass::prototype_header_offset()), temp_reg); ++ orr(temp_reg, R16_thread, temp_reg); ++ xorr(temp_reg, mark_reg, temp_reg); ++ andr(temp_reg, temp_reg, temp2_reg); ++ cmpdi(cr_reg, temp_reg, 0); ++ if (PrintBiasedLockingStatistics) { ++ Label l; ++ bne(cr_reg, l); ++ load_const(mark_reg, (address) BiasedLocking::biased_lock_entry_count_addr()); ++ lwz(temp2_reg, 0, mark_reg); ++ addi(temp2_reg, temp2_reg, 1); ++ stw(temp2_reg, 0, mark_reg); ++ // restore mark_reg ++ ld(mark_reg, oopDesc::mark_offset_in_bytes(), obj_reg); ++ bind(l); ++ } ++ beq(cr_reg, done); ++ ++ Label try_revoke_bias; ++ Label try_rebias; ++ ++ // At this point we know that the header has the bias pattern and ++ // that we are not the bias owner in the current epoch. We need to ++ // figure out more details about the state of the header in order to ++ // know what operations can be legally performed on the object's ++ // header. ++ ++ // If the low three bits in the xor result aren't clear, that means ++ // the prototype header is no longer biased and we have to revoke ++ // the bias on this object. ++ andi(temp2_reg, temp_reg, markOopDesc::biased_lock_mask_in_place); ++ cmpwi(cr_reg, temp2_reg, 0); ++ bne(cr_reg, try_revoke_bias); ++ ++ // Biasing is still enabled for this data type. See whether the ++ // epoch of the current bias is still valid, meaning that the epoch ++ // bits of the mark word are equal to the epoch bits of the ++ // prototype header. (Note that the prototype header's epoch bits ++ // only change at a safepoint.) If not, attempt to rebias the object ++ // toward the current thread. Note that we must be absolutely sure ++ // that the current epoch is invalid in order to do this because ++ // otherwise the manipulations it performs on the mark word are ++ // illegal. ++ ++ int shift_amount = 64 - markOopDesc::epoch_shift; ++ // rotate epoch bits to right (little) end and set other bits to 0 ++ // [ big part | epoch | little part ] -> [ 0..0 | epoch ] ++ rldicl_(temp2_reg, temp_reg, shift_amount, 64 - markOopDesc::epoch_bits); ++ // branch if epoch bits are != 0, i.e. they differ, because the epoch has been incremented ++ bne(CCR0, try_rebias); ++ ++ // The epoch of the current bias is still valid but we know nothing ++ // about the owner; it might be set or it might be clear. 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. ++ // Note that we first construct the presumed unbiased header so we ++ // don't accidentally blow away another thread's valid bias. ++ andi(mark_reg, mark_reg, (markOopDesc::biased_lock_mask_in_place | ++ markOopDesc::age_mask_in_place | ++ markOopDesc::epoch_mask_in_place)); ++ orr(temp_reg, R16_thread, mark_reg); ++ ++ assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0"); ++ ++ // CmpxchgX sets cr_reg to cmpX(temp2_reg, mark_reg). ++ fence(); // TODO: replace by MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq ? ++ cmpxchgd(/*flag=*/cr_reg, /*current_value=*/temp2_reg, ++ /*compare_value=*/mark_reg, /*exchange_value=*/temp_reg, ++ /*where=*/obj_reg, ++ MacroAssembler::MemBarAcq, ++ MacroAssembler::cmpxchgx_hint_acquire_lock(), ++ noreg, slow_case_int); // bail out if failed ++ ++ // If the biasing toward our thread failed, this means that ++ // another thread succeeded in biasing it toward itself and we ++ // need to revoke that bias. The revocation will occur in the ++ // interpreter runtime in the slow case. ++ if (PrintBiasedLockingStatistics) { ++ load_const(temp_reg, (address) BiasedLocking::anonymously_biased_lock_entry_count_addr(), temp2_reg); ++ lwz(temp2_reg, 0, temp_reg); ++ addi(temp2_reg, temp2_reg, 1); ++ stw(temp2_reg, 0, temp_reg); ++ } ++ b(done); ++ ++ bind(try_rebias); ++ // At this point we know the epoch has expired, meaning that the ++ // current "bias owner", if any, is actually invalid. Under these ++ // circumstances _only_, we are allowed to use the current header's ++ // value as the comparison value when doing the cas to acquire the ++ // bias in the current epoch. In other words, we allow transfer of ++ // the bias from one thread to another directly in this situation. ++ andi(temp_reg, mark_reg, markOopDesc::age_mask_in_place); ++ orr(temp_reg, R16_thread, temp_reg); ++ load_klass(temp2_reg, obj_reg); ++ ld(temp2_reg, in_bytes(Klass::prototype_header_offset()), temp2_reg); ++ orr(temp_reg, temp_reg, temp2_reg); ++ ++ assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0"); ++ ++ // CmpxchgX sets cr_reg to cmpX(temp2_reg, mark_reg). ++ fence(); // TODO: replace by MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq ? ++ cmpxchgd(/*flag=*/cr_reg, /*current_value=*/temp2_reg, ++ /*compare_value=*/mark_reg, /*exchange_value=*/temp_reg, ++ /*where=*/obj_reg, ++ MacroAssembler::MemBarAcq, ++ MacroAssembler::cmpxchgx_hint_acquire_lock(), ++ noreg, slow_case_int); // bail out if failed ++ ++ // If the biasing toward our thread failed, this means that ++ // another thread succeeded in biasing it toward itself and we ++ // need to revoke that bias. The revocation will occur in the ++ // interpreter runtime in the slow case. ++ if (PrintBiasedLockingStatistics) { ++ load_const(temp_reg, (address) BiasedLocking::rebiased_lock_entry_count_addr(), temp2_reg); ++ lwz(temp2_reg, 0, temp_reg); ++ addi(temp2_reg, temp2_reg, 1); ++ stw(temp2_reg, 0, temp_reg); ++ } ++ b(done); ++ ++ bind(try_revoke_bias); ++ // The prototype mark in the klass doesn't have the bias bit set any ++ // more, indicating that objects of this data type are not supposed ++ // to be biased any more. 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. Note that if our CAS fails, it means ++ // that another thread raced us for the privilege of revoking the ++ // bias of this particular object, so it's okay to continue in the ++ // normal locking code. ++ load_klass(temp_reg, obj_reg); ++ ld(temp_reg, in_bytes(Klass::prototype_header_offset()), temp_reg); ++ andi(temp2_reg, mark_reg, markOopDesc::age_mask_in_place); ++ orr(temp_reg, temp_reg, temp2_reg); ++ ++ assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0"); ++ ++ // CmpxchgX sets cr_reg to cmpX(temp2_reg, mark_reg). ++ fence(); // TODO: replace by MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq ? ++ cmpxchgd(/*flag=*/cr_reg, /*current_value=*/temp2_reg, ++ /*compare_value=*/mark_reg, /*exchange_value=*/temp_reg, ++ /*where=*/obj_reg, ++ MacroAssembler::MemBarAcq, ++ MacroAssembler::cmpxchgx_hint_acquire_lock()); ++ ++ // reload markOop in mark_reg before continuing with lightweight locking ++ ld(mark_reg, oopDesc::mark_offset_in_bytes(), obj_reg); ++ ++ // Fall through to the normal CAS-based lock, because no matter what ++ // the result of the above CAS, some thread must have succeeded in ++ // removing the bias bit from the object's header. ++ if (PrintBiasedLockingStatistics) { ++ Label l; ++ bne(cr_reg, l); ++ load_const(temp_reg, (address) BiasedLocking::revoked_lock_entry_count_addr(), temp2_reg); ++ lwz(temp2_reg, 0, temp_reg); ++ addi(temp2_reg, temp2_reg, 1); ++ stw(temp2_reg, 0, temp_reg); ++ bind(l); ++ } ++ ++ bind(cas_label); ++} ++ ++void MacroAssembler::biased_locking_exit (ConditionRegister cr_reg, Register mark_addr, Register temp_reg, Label& done) { ++ // Check for biased locking unlock case, which is a no-op ++ // Note: we do not have to check the thread ID for two reasons. ++ // First, the interpreter checks for IllegalMonitorStateException at ++ // a higher level. Second, if the bias was revoked while we held the ++ // lock, the object could not be rebiased toward another thread, so ++ // the bias bit would be clear. ++ ++ ld(temp_reg, 0, mark_addr); ++ andi(temp_reg, temp_reg, markOopDesc::biased_lock_mask_in_place); ++ ++ cmpwi(cr_reg, temp_reg, markOopDesc::biased_lock_pattern); ++ beq(cr_reg, done); ++} ++ ++// "The box" is the space on the stack where we copy the object mark. ++void MacroAssembler::compiler_fast_lock_object(ConditionRegister flag, Register oop, Register box, ++ Register temp, Register displaced_header, Register current_header) { ++ assert_different_registers(oop, box, temp, displaced_header, current_header); ++ assert(flag != CCR0, "bad condition register"); ++ Label cont; ++ Label object_has_monitor; ++ Label cas_failed; ++ ++ // Load markOop from object into displaced_header. ++ ld(displaced_header, oopDesc::mark_offset_in_bytes(), oop); ++ ++ ++ // Always do locking in runtime. ++ if (EmitSync & 0x01) { ++ cmpdi(flag, oop, 0); // Oop can't be 0 here => always false. ++ return; ++ } ++ ++ if (UseBiasedLocking) { ++ biased_locking_enter(flag, oop, displaced_header, temp, current_header, cont); ++ } ++ ++ // Handle existing monitor. ++ if ((EmitSync & 0x02) == 0) { ++ // The object has an existing monitor iff (mark & monitor_value) != 0. ++ andi_(temp, displaced_header, markOopDesc::monitor_value); ++ bne(CCR0, object_has_monitor); ++ } ++ ++ // Set displaced_header to be (markOop of object | UNLOCK_VALUE). ++ ori(displaced_header, displaced_header, markOopDesc::unlocked_value); ++ ++ // Load Compare Value application register. ++ ++ // Initialize the box. (Must happen before we update the object mark!) ++ std(displaced_header, BasicLock::displaced_header_offset_in_bytes(), box); ++ ++ // Must fence, otherwise, preceding store(s) may float below cmpxchg. ++ // Compare object markOop with mark and if equal exchange scratch1 with object markOop. ++ // CmpxchgX sets cr_reg to cmpX(current, displaced). ++ membar(Assembler::StoreStore); ++ cmpxchgd(/*flag=*/flag, ++ /*current_value=*/current_header, ++ /*compare_value=*/displaced_header, ++ /*exchange_value=*/box, ++ /*where=*/oop, ++ MacroAssembler::MemBarAcq, ++ MacroAssembler::cmpxchgx_hint_acquire_lock(), ++ noreg, ++ &cas_failed); ++ assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0"); ++ ++ // If the compare-and-exchange succeeded, then we found an unlocked ++ // object and we have now locked it. ++ b(cont); ++ ++ bind(cas_failed); ++ // We did not see an unlocked object so try the fast recursive case. ++ ++ // Check if the owner is self by comparing the value in the markOop of object ++ // (current_header) with the stack pointer. ++ sub(current_header, current_header, R1_SP); ++ load_const_optimized(temp, (address) (~(os::vm_page_size()-1) | ++ markOopDesc::lock_mask_in_place)); ++ ++ and_(R0/*==0?*/, current_header, temp); ++ // If condition is true we are cont and hence we can store 0 as the ++ // displaced header in the box, which indicates that it is a recursive lock. ++ mcrf(flag,CCR0); ++ std(R0/*==0, perhaps*/, BasicLock::displaced_header_offset_in_bytes(), box); ++ ++ // Handle existing monitor. ++ if ((EmitSync & 0x02) == 0) { ++ b(cont); ++ ++ bind(object_has_monitor); ++ // The object's monitor m is unlocked iff m->owner == NULL, ++ // otherwise m->owner may contain a thread or a stack address. ++ // ++ // Try to CAS m->owner from NULL to current thread. ++ addi(temp, displaced_header, ObjectMonitor::owner_offset_in_bytes()-markOopDesc::monitor_value); ++ li(displaced_header, 0); ++ // CmpxchgX sets flag to cmpX(current, displaced). ++ cmpxchgd(/*flag=*/flag, ++ /*current_value=*/current_header, ++ /*compare_value=*/displaced_header, ++ /*exchange_value=*/R16_thread, ++ /*where=*/temp, ++ MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq, ++ MacroAssembler::cmpxchgx_hint_acquire_lock()); ++ ++ // Store a non-null value into the box. ++ std(box, BasicLock::displaced_header_offset_in_bytes(), box); ++ ++# ifdef ASSERT ++ bne(flag, cont); ++ // We have acquired the monitor, check some invariants. ++ addi(/*monitor=*/temp, temp, -ObjectMonitor::owner_offset_in_bytes()); ++ // Invariant 1: _recursions should be 0. ++ //assert(ObjectMonitor::recursions_size_in_bytes() == 8, "unexpected size"); ++ asm_assert_mem8_is_zero(ObjectMonitor::recursions_offset_in_bytes(), temp, ++ "monitor->_recursions should be 0", -1); ++ // Invariant 2: OwnerIsThread shouldn't be 0. ++ //assert(ObjectMonitor::OwnerIsThread_size_in_bytes() == 4, "unexpected size"); ++ //asm_assert_mem4_isnot_zero(ObjectMonitor::OwnerIsThread_offset_in_bytes(), temp, ++ // "monitor->OwnerIsThread shouldn't be 0", -1); ++# endif ++ } ++ ++ bind(cont); ++ // flag == EQ indicates success ++ // flag == NE indicates failure ++} ++ ++void MacroAssembler::compiler_fast_unlock_object(ConditionRegister flag, Register oop, Register box, ++ Register temp, Register displaced_header, Register current_header) { ++ assert_different_registers(oop, box, temp, displaced_header, current_header); ++ assert(flag != CCR0, "bad condition register"); ++ Label cont; ++ Label object_has_monitor; ++ ++ // Always do locking in runtime. ++ if (EmitSync & 0x01) { ++ cmpdi(flag, oop, 0); // Oop can't be 0 here => always false. ++ return; ++ } ++ ++ if (UseBiasedLocking) { ++ biased_locking_exit(flag, oop, current_header, cont); ++ } ++ ++ // Find the lock address and load the displaced header from the stack. ++ ld(displaced_header, BasicLock::displaced_header_offset_in_bytes(), box); ++ ++ // If the displaced header is 0, we have a recursive unlock. ++ cmpdi(flag, displaced_header, 0); ++ beq(flag, cont); ++ ++ // Handle existing monitor. ++ if ((EmitSync & 0x02) == 0) { ++ // The object has an existing monitor iff (mark & monitor_value) != 0. ++ ld(current_header, oopDesc::mark_offset_in_bytes(), oop); ++ andi(temp, current_header, markOopDesc::monitor_value); ++ cmpdi(flag, temp, 0); ++ bne(flag, object_has_monitor); ++ } ++ ++ ++ // Check if it is still a light weight lock, this is is true if we see ++ // the stack address of the basicLock in the markOop of the object. ++ // Cmpxchg sets flag to cmpd(current_header, box). ++ cmpxchgd(/*flag=*/flag, ++ /*current_value=*/current_header, ++ /*compare_value=*/box, ++ /*exchange_value=*/displaced_header, ++ /*where=*/oop, ++ MacroAssembler::MemBarRel, ++ MacroAssembler::cmpxchgx_hint_release_lock(), ++ noreg, ++ &cont); ++ ++ assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0"); ++ ++ // Handle existing monitor. ++ if ((EmitSync & 0x02) == 0) { ++ b(cont); ++ ++ bind(object_has_monitor); ++ addi(current_header, current_header, -markOopDesc::monitor_value); // monitor ++ ld(temp, ObjectMonitor::owner_offset_in_bytes(), current_header); ++ ld(displaced_header, ObjectMonitor::recursions_offset_in_bytes(), current_header); ++ xorr(temp, R16_thread, temp); // Will be 0 if we are the owner. ++ orr(temp, temp, displaced_header); // Will be 0 if there are 0 recursions. ++ cmpdi(flag, temp, 0); ++ bne(flag, cont); ++ ++ ld(temp, ObjectMonitor::EntryList_offset_in_bytes(), current_header); ++ ld(displaced_header, ObjectMonitor::cxq_offset_in_bytes(), current_header); ++ orr(temp, temp, displaced_header); // Will be 0 if both are 0. ++ cmpdi(flag, temp, 0); ++ bne(flag, cont); ++ release(); ++ std(temp, ObjectMonitor::owner_offset_in_bytes(), current_header); ++ } ++ ++ bind(cont); ++ // flag == EQ indicates success ++ // flag == NE indicates failure ++} ++ ++// Write serialization page so VM thread can do a pseudo remote membar. ++// We use the current thread pointer to calculate a thread specific ++// offset to write to within the page. This minimizes bus traffic ++// due to cache line collision. ++void MacroAssembler::serialize_memory(Register thread, Register tmp1, Register tmp2) { ++ srdi(tmp2, thread, os::get_serialize_page_shift_count()); ++ ++ int mask = os::vm_page_size() - sizeof(int); ++ if (Assembler::is_simm(mask, 16)) { ++ andi(tmp2, tmp2, mask); ++ } else { ++ lis(tmp1, (int)((signed short) (mask >> 16))); ++ ori(tmp1, tmp1, mask & 0x0000ffff); ++ andr(tmp2, tmp2, tmp1); ++ } ++ ++ load_const(tmp1, (long) os::get_memory_serialize_page()); ++ release(); ++ stwx(R0, tmp1, tmp2); ++} ++ ++ ++// GC barrier helper macros ++ ++// Write the card table byte if needed. ++void MacroAssembler::card_write_barrier_post(Register Rstore_addr, Register Rnew_val, Register Rtmp) { ++ CardTableModRefBS* bs = (CardTableModRefBS*) Universe::heap()->barrier_set(); ++ assert(bs->kind() == BarrierSet::CardTableModRef || ++ bs->kind() == BarrierSet::CardTableExtension, "wrong barrier"); ++#ifdef ASSERT ++ cmpdi(CCR0, Rnew_val, 0); ++ asm_assert_ne("null oop not allowed", 0x321); ++#endif ++ card_table_write(bs->byte_map_base, Rtmp, Rstore_addr); ++} ++ ++// Write the card table byte. ++void MacroAssembler::card_table_write(jbyte* byte_map_base, Register Rtmp, Register Robj) { ++ assert_different_registers(Robj, Rtmp, R0); ++ load_const_optimized(Rtmp, (address)byte_map_base, R0); ++ srdi(Robj, Robj, CardTableModRefBS::card_shift); ++ li(R0, 0); // dirty ++ if (UseConcMarkSweepGC) membar(Assembler::StoreStore); ++ stbx(R0, Rtmp, Robj); ++} ++ ++#if INCLUDE_ALL_GCS ++// General G1 pre-barrier generator. ++// Goal: record the previous value if it is not null. ++void MacroAssembler::g1_write_barrier_pre(Register Robj, RegisterOrConstant offset, Register Rpre_val, ++ Register Rtmp1, Register Rtmp2, bool needs_frame) { ++ Label runtime, filtered; ++ ++ // Is marking active? ++ if (in_bytes(PtrQueue::byte_width_of_active()) == 4) { ++ lwz(Rtmp1, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_active()), R16_thread); ++ } else { ++ guarantee(in_bytes(PtrQueue::byte_width_of_active()) == 1, "Assumption"); ++ lbz(Rtmp1, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_active()), R16_thread); ++ } ++ cmpdi(CCR0, Rtmp1, 0); ++ beq(CCR0, filtered); ++ ++ // Do we need to load the previous value? ++ if (Robj != noreg) { ++ // Load the previous value... ++ if (UseCompressedOops) { ++ lwz(Rpre_val, offset, Robj); ++ } else { ++ ld(Rpre_val, offset, Robj); ++ } ++ // Previous value has been loaded into Rpre_val. ++ } ++ assert(Rpre_val != noreg, "must have a real register"); ++ ++ // Is the previous value null? ++ cmpdi(CCR0, Rpre_val, 0); ++ beq(CCR0, filtered); ++ ++ if (Robj != noreg && UseCompressedOops) { ++ decode_heap_oop_not_null(Rpre_val); ++ } ++ ++ // OK, it's not filtered, so we'll need to call enqueue. In the normal ++ // case, pre_val will be a scratch G-reg, but there are some cases in ++ // which it's an O-reg. In the first case, do a normal call. In the ++ // latter, do a save here and call the frameless version. ++ ++ // Can we store original value in the thread's buffer? ++ // Is index == 0? ++ // (The index field is typed as size_t.) ++ const Register Rbuffer = Rtmp1, Rindex = Rtmp2; ++ ++ ld(Rindex, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_index()), R16_thread); ++ cmpdi(CCR0, Rindex, 0); ++ beq(CCR0, runtime); // If index == 0, goto runtime. ++ ld(Rbuffer, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_buf()), R16_thread); ++ ++ addi(Rindex, Rindex, -wordSize); // Decrement index. ++ std(Rindex, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_index()), R16_thread); ++ ++ // Record the previous value. ++ stdx(Rpre_val, Rbuffer, Rindex); ++ b(filtered); ++ ++ bind(runtime); ++ ++ // VM call need frame to access(write) O register. ++ if (needs_frame) { ++ save_LR_CR(Rtmp1); ++ push_frame_reg_args(0, Rtmp2); ++ } ++ ++ if (Rpre_val->is_volatile() && Robj == noreg) mr(R31, Rpre_val); // Save pre_val across C call if it was preloaded. ++ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), Rpre_val, R16_thread); ++ if (Rpre_val->is_volatile() && Robj == noreg) mr(Rpre_val, R31); // restore ++ ++ if (needs_frame) { ++ pop_frame(); ++ restore_LR_CR(Rtmp1); ++ } ++ ++ bind(filtered); ++} ++ ++// General G1 post-barrier generator ++// Store cross-region card. ++void MacroAssembler::g1_write_barrier_post(Register Rstore_addr, Register Rnew_val, Register Rtmp1, Register Rtmp2, Register Rtmp3, Label *filtered_ext) { ++ Label runtime, filtered_int; ++ Label& filtered = (filtered_ext != NULL) ? *filtered_ext : filtered_int; ++ assert_different_registers(Rstore_addr, Rnew_val, Rtmp1, Rtmp2); ++ ++ G1SATBCardTableModRefBS* bs = (G1SATBCardTableModRefBS*) Universe::heap()->barrier_set(); ++ assert(bs->kind() == BarrierSet::G1SATBCT || ++ bs->kind() == BarrierSet::G1SATBCTLogging, "wrong barrier"); ++ ++ // Does store cross heap regions? ++ if (G1RSBarrierRegionFilter) { ++ xorr(Rtmp1, Rstore_addr, Rnew_val); ++ srdi_(Rtmp1, Rtmp1, HeapRegion::LogOfHRGrainBytes); ++ beq(CCR0, filtered); ++ } ++ ++ // Crosses regions, storing NULL? ++#ifdef ASSERT ++ cmpdi(CCR0, Rnew_val, 0); ++ asm_assert_ne("null oop not allowed (G1)", 0x322); // Checked by caller on PPC64, so following branch is obsolete: ++ //beq(CCR0, filtered); ++#endif ++ ++ // Storing region crossing non-NULL, is card already dirty? ++ assert(sizeof(*bs->byte_map_base) == sizeof(jbyte), "adjust this code"); ++ const Register Rcard_addr = Rtmp1; ++ Register Rbase = Rtmp2; ++ load_const_optimized(Rbase, (address)bs->byte_map_base, /*temp*/ Rtmp3); ++ ++ srdi(Rcard_addr, Rstore_addr, CardTableModRefBS::card_shift); ++ ++ // Get the address of the card. ++ lbzx(/*card value*/ Rtmp3, Rbase, Rcard_addr); ++ cmpwi(CCR0, Rtmp3, (int)G1SATBCardTableModRefBS::g1_young_card_val()); ++ beq(CCR0, filtered); ++ ++ membar(Assembler::StoreLoad); ++ lbzx(/*card value*/ Rtmp3, Rbase, Rcard_addr); // Reload after membar. ++ cmpwi(CCR0, Rtmp3 /* card value */, CardTableModRefBS::dirty_card_val()); ++ beq(CCR0, filtered); ++ ++ // Storing a region crossing, non-NULL oop, card is clean. ++ // Dirty card and log. ++ li(Rtmp3, CardTableModRefBS::dirty_card_val()); ++ //release(); // G1: oops are allowed to get visible after dirty marking. ++ stbx(Rtmp3, Rbase, Rcard_addr); ++ ++ add(Rcard_addr, Rbase, Rcard_addr); // This is the address which needs to get enqueued. ++ Rbase = noreg; // end of lifetime ++ ++ const Register Rqueue_index = Rtmp2, ++ Rqueue_buf = Rtmp3; ++ ld(Rqueue_index, in_bytes(JavaThread::dirty_card_queue_offset() + PtrQueue::byte_offset_of_index()), R16_thread); ++ cmpdi(CCR0, Rqueue_index, 0); ++ beq(CCR0, runtime); // index == 0 then jump to runtime ++ ld(Rqueue_buf, in_bytes(JavaThread::dirty_card_queue_offset() + PtrQueue::byte_offset_of_buf()), R16_thread); ++ ++ addi(Rqueue_index, Rqueue_index, -wordSize); // decrement index ++ std(Rqueue_index, in_bytes(JavaThread::dirty_card_queue_offset() + PtrQueue::byte_offset_of_index()), R16_thread); ++ ++ stdx(Rcard_addr, Rqueue_buf, Rqueue_index); // store card ++ b(filtered); ++ ++ bind(runtime); ++ ++ // Save the live input values. ++ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), Rcard_addr, R16_thread); ++ ++ bind(filtered_int); ++} ++#endif // INCLUDE_ALL_GCS ++ ++// Values for last_Java_pc, and last_Java_sp must comply to the rules ++// in frame_ppc64.hpp. ++void MacroAssembler::set_last_Java_frame(Register last_Java_sp, Register last_Java_pc) { ++ // Always set last_Java_pc and flags first because once last_Java_sp ++ // is visible has_last_Java_frame is true and users will look at the ++ // rest of the fields. (Note: flags should always be zero before we ++ // get here so doesn't need to be set.) ++ ++ // Verify that last_Java_pc was zeroed on return to Java ++ asm_assert_mem8_is_zero(in_bytes(JavaThread::last_Java_pc_offset()), R16_thread, ++ "last_Java_pc not zeroed before leaving Java", 0x200); ++ ++ // When returning from calling out from Java mode the frame anchor's ++ // last_Java_pc will always be set to NULL. It is set here so that ++ // if we are doing a call to native (not VM) that we capture the ++ // known pc and don't have to rely on the native call having a ++ // standard frame linkage where we can find the pc. ++ if (last_Java_pc != noreg) ++ std(last_Java_pc, in_bytes(JavaThread::last_Java_pc_offset()), R16_thread); ++ ++ // Set last_Java_sp last. ++ std(last_Java_sp, in_bytes(JavaThread::last_Java_sp_offset()), R16_thread); ++} ++ ++void MacroAssembler::reset_last_Java_frame(void) { ++ asm_assert_mem8_isnot_zero(in_bytes(JavaThread::last_Java_sp_offset()), ++ R16_thread, "SP was not set, still zero", 0x202); ++ ++ BLOCK_COMMENT("reset_last_Java_frame {"); ++ li(R0, 0); ++ ++ // _last_Java_sp = 0 ++ std(R0, in_bytes(JavaThread::last_Java_sp_offset()), R16_thread); ++ ++ // _last_Java_pc = 0 ++ std(R0, in_bytes(JavaThread::last_Java_pc_offset()), R16_thread); ++ BLOCK_COMMENT("} reset_last_Java_frame"); ++} ++ ++void MacroAssembler::set_top_ijava_frame_at_SP_as_last_Java_frame(Register sp, Register tmp1) { ++ assert_different_registers(sp, tmp1); ++ ++ // sp points to a TOP_IJAVA_FRAME, retrieve frame's PC via ++ // TOP_IJAVA_FRAME_ABI. ++ // FIXME: assert that we really have a TOP_IJAVA_FRAME here! ++#ifdef CC_INTERP ++ ld(tmp1/*pc*/, _top_ijava_frame_abi(frame_manager_lr), sp); ++#else ++ address entry = pc(); ++ load_const_optimized(tmp1, entry); ++#endif ++ ++ set_last_Java_frame(/*sp=*/sp, /*pc=*/tmp1); ++} ++ ++void MacroAssembler::get_vm_result(Register oop_result) { ++ // Read: ++ // R16_thread ++ // R16_thread->in_bytes(JavaThread::vm_result_offset()) ++ // ++ // Updated: ++ // oop_result ++ // R16_thread->in_bytes(JavaThread::vm_result_offset()) ++ ++ ld(oop_result, in_bytes(JavaThread::vm_result_offset()), R16_thread); ++ li(R0, 0); ++ std(R0, in_bytes(JavaThread::vm_result_offset()), R16_thread); ++ ++ verify_oop(oop_result); ++} ++ ++void MacroAssembler::get_vm_result_2(Register metadata_result) { ++ // Read: ++ // R16_thread ++ // R16_thread->in_bytes(JavaThread::vm_result_2_offset()) ++ // ++ // Updated: ++ // metadata_result ++ // R16_thread->in_bytes(JavaThread::vm_result_2_offset()) ++ ++ ld(metadata_result, in_bytes(JavaThread::vm_result_2_offset()), R16_thread); ++ li(R0, 0); ++ std(R0, in_bytes(JavaThread::vm_result_2_offset()), R16_thread); ++} ++ ++ ++void MacroAssembler::encode_klass_not_null(Register dst, Register src) { ++ Register current = (src != noreg) ? src : dst; // Klass is in dst if no src provided. ++ if (Universe::narrow_klass_base() != 0) { ++ // Use dst as temp if it is free. ++ load_const(R0, Universe::narrow_klass_base(), (dst != current && dst != R0) ? dst : noreg); ++ sub(dst, current, R0); ++ current = dst; ++ } ++ if (Universe::narrow_klass_shift() != 0) { ++ srdi(dst, current, Universe::narrow_klass_shift()); ++ current = dst; ++ } ++ mr_if_needed(dst, current); // Move may be required. ++} ++ ++void MacroAssembler::store_klass(Register dst_oop, Register klass, Register ck) { ++ if (UseCompressedClassPointers) { ++ encode_klass_not_null(ck, klass); ++ stw(ck, oopDesc::klass_offset_in_bytes(), dst_oop); ++ } else { ++ std(klass, oopDesc::klass_offset_in_bytes(), dst_oop); ++ } ++} ++ ++void MacroAssembler::store_klass_gap(Register dst_oop, Register val) { ++ if (UseCompressedClassPointers) { ++ if (val == noreg) { ++ val = R0; ++ li(val, 0); ++ } ++ stw(val, oopDesc::klass_gap_offset_in_bytes(), dst_oop); // klass gap if compressed ++ } ++} ++ ++int MacroAssembler::instr_size_for_decode_klass_not_null() { ++ if (!UseCompressedClassPointers) return 0; ++ int num_instrs = 1; // shift or move ++ if (Universe::narrow_klass_base() != 0) num_instrs = 7; // shift + load const + add ++ return num_instrs * BytesPerInstWord; ++} ++ ++void MacroAssembler::decode_klass_not_null(Register dst, Register src) { ++ if (src == noreg) src = dst; ++ Register shifted_src = src; ++ if (Universe::narrow_klass_shift() != 0 || ++ Universe::narrow_klass_base() == 0 && src != dst) { // Move required. ++ shifted_src = dst; ++ sldi(shifted_src, src, Universe::narrow_klass_shift()); ++ } ++ if (Universe::narrow_klass_base() != 0) { ++ load_const(R0, Universe::narrow_klass_base()); ++ add(dst, shifted_src, R0); ++ } ++} ++ ++void MacroAssembler::load_klass(Register dst, Register src) { ++ if (UseCompressedClassPointers) { ++ lwz(dst, oopDesc::klass_offset_in_bytes(), src); ++ // Attention: no null check here! ++ decode_klass_not_null(dst, dst); ++ } else { ++ ld(dst, oopDesc::klass_offset_in_bytes(), src); ++ } ++} ++ ++void MacroAssembler::load_klass_with_trap_null_check(Register dst, Register src) { ++ if (!os::zero_page_read_protected()) { ++ if (TrapBasedNullChecks) { ++ trap_null_check(src); ++ } ++ } ++ load_klass(dst, src); ++} ++ ++void MacroAssembler::reinit_heapbase(Register d, Register tmp) { ++ if (Universe::heap() != NULL) { ++ if (Universe::narrow_oop_base() == NULL) { ++ Assembler::xorr(R30, R30, R30); ++ } else { ++ load_const(R30, Universe::narrow_ptrs_base(), tmp); ++ } ++ } else { ++ load_const(R30, Universe::narrow_ptrs_base_addr(), tmp); ++ ld(R30, 0, R30); ++ } ++} ++ ++// Clear Array ++// Kills both input registers. tmp == R0 is allowed. ++void MacroAssembler::clear_memory_doubleword(Register base_ptr, Register cnt_dwords, Register tmp) { ++ // Procedure for large arrays (uses data cache block zero instruction). ++ Label startloop, fast, fastloop, small_rest, restloop, done; ++ const int cl_size = VM_Version::get_cache_line_size(), ++ cl_dwords = cl_size>>3, ++ cl_dw_addr_bits = exact_log2(cl_dwords), ++ dcbz_min = 1; // Min count of dcbz executions, needs to be >0. ++ ++//2: ++ cmpdi(CCR1, cnt_dwords, ((dcbz_min+1)<=dcbz_min lines included). ++ blt(CCR1, small_rest); // Too small. ++ rldicl_(tmp, base_ptr, 64-3, 64-cl_dw_addr_bits); // Extract dword offset within first cache line. ++ beq(CCR0, fast); // Already 128byte aligned. ++ ++ subfic(tmp, tmp, cl_dwords); ++ mtctr(tmp); // Set ctr to hit 128byte boundary (00). ++ andi(cnt_dwords, cnt_dwords, cl_dwords-1); // Rest in dwords. ++ mtctr(tmp); // Load counter. ++//16: ++ bind(fastloop); ++ dcbz(base_ptr); // Clear 128byte aligned block. ++ addi(base_ptr, base_ptr, cl_size); ++ bdnz(fastloop); ++ if (InsertEndGroupPPC64) { endgroup(); } else { nop(); } ++//20: ++ bind(small_rest); ++ cmpdi(CCR0, cnt_dwords, 0); // size 0? ++ beq(CCR0, done); // rest == 0 ++ li(tmp, 0); ++ mtctr(cnt_dwords); // Load counter. ++//24: ++ bind(restloop); // Clear rest. ++ std(tmp, 0, base_ptr); // Clear 8byte aligned block. ++ addi(base_ptr, base_ptr, 8); ++ bdnz(restloop); ++//27: ++ bind(done); ++} ++ ++/////////////////////////////////////////// String intrinsics //////////////////////////////////////////// ++ ++// Search for a single jchar in an jchar[]. ++// ++// Assumes that result differs from all other registers. ++// ++// Haystack, needle are the addresses of jchar-arrays. ++// NeedleChar is needle[0] if it is known at compile time. ++// Haycnt is the length of the haystack. We assume haycnt >=1. ++// ++// Preserves haystack, haycnt, kills all other registers. ++// ++// If needle == R0, we search for the constant needleChar. ++void MacroAssembler::string_indexof_1(Register result, Register haystack, Register haycnt, ++ Register needle, jchar needleChar, ++ Register tmp1, Register tmp2) { ++ ++ assert_different_registers(result, haystack, haycnt, needle, tmp1, tmp2); ++ ++ Label L_InnerLoop, L_FinalCheck, L_Found1, L_Found2, L_Found3, L_NotFound, L_End; ++ Register needle0 = needle, // Contains needle[0]. ++ addr = tmp1, ++ ch1 = tmp2, ++ ch2 = R0; ++ ++//2 (variable) or 3 (const): ++ if (needle != R0) lhz(needle0, 0, needle); // Preload needle character, needle has len==1. ++ dcbtct(haystack, 0x00); // Indicate R/O access to haystack. ++ ++ srwi_(tmp2, haycnt, 1); // Shift right by exact_log2(UNROLL_FACTOR). ++ mr(addr, haystack); ++ beq(CCR0, L_FinalCheck); ++ mtctr(tmp2); // Move to count register. ++//8: ++ bind(L_InnerLoop); // Main work horse (2x unrolled search loop). ++ lhz(ch1, 0, addr); // Load characters from haystack. ++ lhz(ch2, 2, addr); ++ (needle != R0) ? cmpw(CCR0, ch1, needle0) : cmplwi(CCR0, ch1, needleChar); ++ (needle != R0) ? cmpw(CCR1, ch2, needle0) : cmplwi(CCR1, ch2, needleChar); ++ beq(CCR0, L_Found1); // Did we find the needle? ++ beq(CCR1, L_Found2); ++ addi(addr, addr, 4); ++ bdnz(L_InnerLoop); ++//16: ++ bind(L_FinalCheck); ++ andi_(R0, haycnt, 1); ++ beq(CCR0, L_NotFound); ++ lhz(ch1, 0, addr); // One position left at which we have to compare. ++ (needle != R0) ? cmpw(CCR1, ch1, needle0) : cmplwi(CCR1, ch1, needleChar); ++ beq(CCR1, L_Found3); ++//21: ++ bind(L_NotFound); ++ li(result, -1); // Not found. ++ b(L_End); ++ ++ bind(L_Found2); ++ addi(addr, addr, 2); ++//24: ++ bind(L_Found1); ++ bind(L_Found3); // Return index ... ++ subf(addr, haystack, addr); // relative to haystack, ++ srdi(result, addr, 1); // in characters. ++ bind(L_End); ++} ++ ++ ++// Implementation of IndexOf for jchar arrays. ++// ++// The length of haystack and needle are not constant, i.e. passed in a register. ++// ++// Preserves registers haystack, needle. ++// Kills registers haycnt, needlecnt. ++// Assumes that result differs from all other registers. ++// Haystack, needle are the addresses of jchar-arrays. ++// Haycnt, needlecnt are the lengths of them, respectively. ++// ++// Needlecntval must be zero or 15-bit unsigned immediate and > 1. ++void MacroAssembler::string_indexof(Register result, Register haystack, Register haycnt, ++ Register needle, ciTypeArray* needle_values, Register needlecnt, int needlecntval, ++ Register tmp1, Register tmp2, Register tmp3, Register tmp4) { ++ ++ // Ensure 0=2, bail out otherwise. ++ // ************************************************************************************************** ++ ++//1 (variable) or 3 (const): ++ dcbtct(needle, 0x00); // Indicate R/O access to str1. ++ dcbtct(haystack, 0x00); // Indicate R/O access to str2. ++ ++ // Compute last haystack addr to use if no match gets found. ++ if (needlecntval == 0) { // variable needlecnt ++//3: ++ subf(ch1, needlecnt, haycnt); // Last character index to compare is haycnt-needlecnt. ++ addi(addr, haystack, -2); // Accesses use pre-increment. ++ cmpwi(CCR6, needlecnt, 2); ++ blt(CCR6, L_TooShort); // Variable needlecnt: handle short needle separately. ++ slwi(ch1, ch1, 1); // Scale to number of bytes. ++ lwz(n_start, 0, needle); // Load first 2 characters of needle. ++ add(last_addr, haystack, ch1); // Point to last address to compare (haystack+2*(haycnt-needlecnt)). ++ addi(needlecnt, needlecnt, -2); // Rest of needle. ++ } else { // constant needlecnt ++ guarantee(needlecntval != 1, "IndexOf with single-character needle must be handled separately"); ++ assert((needlecntval & 0x7fff) == needlecntval, "wrong immediate"); ++//5: ++ addi(ch1, haycnt, -needlecntval); // Last character index to compare is haycnt-needlecnt. ++ lwz(n_start, 0, needle); // Load first 2 characters of needle. ++ addi(addr, haystack, -2); // Accesses use pre-increment. ++ slwi(ch1, ch1, 1); // Scale to number of bytes. ++ add(last_addr, haystack, ch1); // Point to last address to compare (haystack+2*(haycnt-needlecnt)). ++ li(needlecnt, needlecntval-2); // Rest of needle. ++ } ++ ++ // Main Loop (now we have at least 3 characters). ++//11: ++ Label L_OuterLoop, L_InnerLoop, L_FinalCheck, L_Comp1, L_Comp2, L_Comp3; ++ bind(L_OuterLoop); // Search for 1st 2 characters. ++ Register addr_diff = tmp4; ++ subf(addr_diff, addr, last_addr); // Difference between already checked address and last address to check. ++ addi(addr, addr, 2); // This is the new address we want to use for comparing. ++ srdi_(ch2, addr_diff, 2); ++ beq(CCR0, L_FinalCheck); // 2 characters left? ++ mtctr(ch2); // addr_diff/4 ++//16: ++ bind(L_InnerLoop); // Main work horse (2x unrolled search loop) ++ lwz(ch1, 0, addr); // Load 2 characters of haystack (ignore alignment). ++ lwz(ch2, 2, addr); ++ cmpw(CCR0, ch1, n_start); // Compare 2 characters (1 would be sufficient but try to reduce branches to CompLoop). ++ cmpw(CCR1, ch2, n_start); ++ beq(CCR0, L_Comp1); // Did we find the needle start? ++ beq(CCR1, L_Comp2); ++ addi(addr, addr, 4); ++ bdnz(L_InnerLoop); ++//24: ++ bind(L_FinalCheck); ++ rldicl_(addr_diff, addr_diff, 64-1, 63); // Remaining characters not covered by InnerLoop: (addr_diff>>1)&1. ++ beq(CCR0, L_NotFound); ++ lwz(ch1, 0, addr); // One position left at which we have to compare. ++ cmpw(CCR1, ch1, n_start); ++ beq(CCR1, L_Comp3); ++//29: ++ bind(L_NotFound); ++ li(result, -1); // not found ++ b(L_End); ++ ++ ++ // ************************************************************************************************** ++ // Special Case: unfortunately, the variable needle case can be called with needlecnt<2 ++ // ************************************************************************************************** ++//31: ++ if ((needlecntval>>1) !=1 ) { // Const needlecnt is 2 or 3? Reduce code size. ++ int nopcnt = 5; ++ if (needlecntval !=0 ) ++nopcnt; // Balance alignment (other case: see below). ++ if (needlecntval == 0) { // We have to handle these cases separately. ++ Label L_OneCharLoop; ++ bind(L_TooShort); ++ mtctr(haycnt); ++ lhz(n_start, 0, needle); // First character of needle ++ bind(L_OneCharLoop); ++ lhzu(ch1, 2, addr); ++ cmpw(CCR1, ch1, n_start); ++ beq(CCR1, L_Found); // Did we find the one character needle? ++ bdnz(L_OneCharLoop); ++ li(result, -1); // Not found. ++ b(L_End); ++ } // 8 instructions, so no impact on alignment. ++ for (int x = 0; x < nopcnt; ++x) nop(); ++ } ++ ++ // ************************************************************************************************** ++ // Regular Case Part II: compare rest of needle (first 2 characters have been compared already) ++ // ************************************************************************************************** ++ ++ // Compare the rest ++//36 if needlecntval==0, else 37: ++ bind(L_Comp2); ++ addi(addr, addr, 2); // First comparison has failed, 2nd one hit. ++ bind(L_Comp1); // Addr points to possible needle start. ++ bind(L_Comp3); // Could have created a copy and use a different return address but saving code size here. ++ if (needlecntval != 2) { // Const needlecnt==2? ++ if (needlecntval != 3) { ++ if (needlecntval == 0) beq(CCR6, L_Found); // Variable needlecnt==2? ++ Register ind_reg = tmp4; ++ li(ind_reg, 2*2); // First 2 characters are already compared, use index 2. ++ mtctr(needlecnt); // Decremented by 2, still > 0. ++//40: ++ Label L_CompLoop; ++ bind(L_CompLoop); ++ lhzx(ch2, needle, ind_reg); ++ lhzx(ch1, addr, ind_reg); ++ cmpw(CCR1, ch1, ch2); ++ bne(CCR1, L_OuterLoop); ++ addi(ind_reg, ind_reg, 2); ++ bdnz(L_CompLoop); ++ } else { // No loop required if there's only one needle character left. ++ lhz(ch2, 2*2, needle); ++ lhz(ch1, 2*2, addr); ++ cmpw(CCR1, ch1, ch2); ++ bne(CCR1, L_OuterLoop); ++ } ++ } ++ // Return index ... ++//46: ++ bind(L_Found); ++ subf(addr, haystack, addr); // relative to haystack, ... ++ srdi(result, addr, 1); // in characters. ++//48: ++ bind(L_End); ++} ++ ++// Implementation of Compare for jchar arrays. ++// ++// Kills the registers str1, str2, cnt1, cnt2. ++// Kills cr0, ctr. ++// Assumes that result differes from the input registers. ++void MacroAssembler::string_compare(Register str1_reg, Register str2_reg, Register cnt1_reg, Register cnt2_reg, ++ Register result_reg, Register tmp_reg) { ++ assert_different_registers(result_reg, str1_reg, str2_reg, cnt1_reg, cnt2_reg, tmp_reg); ++ ++ Label Ldone, Lslow_case, Lslow_loop, Lfast_loop; ++ Register cnt_diff = R0, ++ limit_reg = cnt1_reg, ++ chr1_reg = result_reg, ++ chr2_reg = cnt2_reg, ++ addr_diff = str2_reg; ++ ++ // Offset 0 should be 32 byte aligned. ++//-4: ++ dcbtct(str1_reg, 0x00); // Indicate R/O access to str1. ++ dcbtct(str2_reg, 0x00); // Indicate R/O access to str2. ++//-2: ++ // Compute min(cnt1, cnt2) and check if 0 (bail out if we don't need to compare characters). ++ subf(result_reg, cnt2_reg, cnt1_reg); // difference between cnt1/2 ++ subf_(addr_diff, str1_reg, str2_reg); // alias? ++ beq(CCR0, Ldone); // return cnt difference if both ones are identical ++ srawi(limit_reg, result_reg, 31); // generate signmask (cnt1/2 must be non-negative so cnt_diff can't overflow) ++ mr(cnt_diff, result_reg); ++ andr(limit_reg, result_reg, limit_reg); // difference or zero (negative): cnt14 characters for fast loop ++ andi(limit_reg, tmp_reg, 4-1); // remaining characters ++ ++ // Adapt str1_reg str2_reg for the first loop iteration ++ mtctr(chr2_reg); // (min(cnt1, cnt2)-1)/4 ++ addi(limit_reg, limit_reg, 4+1); // compare last 5-8 characters in slow_case if mismatch found in fast_loop ++//16: ++ // Compare the rest of the characters ++ bind(Lfast_loop); ++ ld(chr1_reg, 0, str1_reg); ++ ldx(chr2_reg, str1_reg, addr_diff); ++ cmpd(CCR0, chr2_reg, chr1_reg); ++ bne(CCR0, Lslow_case); // return chr1_reg ++ addi(str1_reg, str1_reg, 4*2); ++ bdnz(Lfast_loop); ++ addi(limit_reg, limit_reg, -4); // no mismatch found in fast_loop, only 1-4 characters missing ++//23: ++ bind(Lslow_case); ++ mtctr(limit_reg); ++//24: ++ bind(Lslow_loop); ++ lhz(chr1_reg, 0, str1_reg); ++ lhzx(chr2_reg, str1_reg, addr_diff); ++ subf_(result_reg, chr2_reg, chr1_reg); ++ bne(CCR0, Ldone); // return chr1_reg ++ addi(str1_reg, str1_reg, 1*2); ++ bdnz(Lslow_loop); ++//30: ++ // If strings are equal up to min length, return the length difference. ++ mr(result_reg, cnt_diff); ++ nop(); // alignment ++//32: ++ // Otherwise, return the difference between the first mismatched chars. ++ bind(Ldone); ++} ++ ++ ++// Compare char[] arrays. ++// ++// str1_reg USE only ++// str2_reg USE only ++// cnt_reg USE_DEF, due to tmp reg shortage ++// result_reg DEF only, might compromise USE only registers ++void MacroAssembler::char_arrays_equals(Register str1_reg, Register str2_reg, Register cnt_reg, Register result_reg, ++ Register tmp1_reg, Register tmp2_reg, Register tmp3_reg, Register tmp4_reg, ++ Register tmp5_reg) { ++ ++ // Str1 may be the same register as str2 which can occur e.g. after scalar replacement. ++ assert_different_registers(result_reg, str1_reg, cnt_reg, tmp1_reg, tmp2_reg, tmp3_reg, tmp4_reg, tmp5_reg); ++ assert_different_registers(result_reg, str2_reg, cnt_reg, tmp1_reg, tmp2_reg, tmp3_reg, tmp4_reg, tmp5_reg); ++ ++ // Offset 0 should be 32 byte aligned. ++ Label Linit_cbc, Lcbc, Lloop, Ldone_true, Ldone_false; ++ Register index_reg = tmp5_reg; ++ Register cbc_iter = tmp4_reg; ++ ++//-1: ++ dcbtct(str1_reg, 0x00); // Indicate R/O access to str1. ++ dcbtct(str2_reg, 0x00); // Indicate R/O access to str2. ++//1: ++ andi(cbc_iter, cnt_reg, 4-1); // Remaining iterations after 4 java characters per iteration loop. ++ li(index_reg, 0); // init ++ li(result_reg, 0); // assume false ++ srwi_(tmp2_reg, cnt_reg, exact_log2(4)); // Div: 4 java characters per iteration (main loop). ++ ++ cmpwi(CCR1, cbc_iter, 0); // CCR1 = (cbc_iter==0) ++ beq(CCR0, Linit_cbc); // too short ++ mtctr(tmp2_reg); ++//8: ++ bind(Lloop); ++ ldx(tmp1_reg, str1_reg, index_reg); ++ ldx(tmp2_reg, str2_reg, index_reg); ++ cmpd(CCR0, tmp1_reg, tmp2_reg); ++ bne(CCR0, Ldone_false); // Unequal char pair found -> done. ++ addi(index_reg, index_reg, 4*sizeof(jchar)); ++ bdnz(Lloop); ++//14: ++ bind(Linit_cbc); ++ beq(CCR1, Ldone_true); ++ mtctr(cbc_iter); ++//16: ++ bind(Lcbc); ++ lhzx(tmp1_reg, str1_reg, index_reg); ++ lhzx(tmp2_reg, str2_reg, index_reg); ++ cmpw(CCR0, tmp1_reg, tmp2_reg); ++ bne(CCR0, Ldone_false); // Unequal char pair found -> done. ++ addi(index_reg, index_reg, 1*sizeof(jchar)); ++ bdnz(Lcbc); ++ nop(); ++ bind(Ldone_true); ++ li(result_reg, 1); ++//24: ++ bind(Ldone_false); ++} ++ ++ ++void MacroAssembler::char_arrays_equalsImm(Register str1_reg, Register str2_reg, int cntval, Register result_reg, ++ Register tmp1_reg, Register tmp2_reg) { ++ // Str1 may be the same register as str2 which can occur e.g. after scalar replacement. ++ assert_different_registers(result_reg, str1_reg, tmp1_reg, tmp2_reg); ++ assert_different_registers(result_reg, str2_reg, tmp1_reg, tmp2_reg); ++ assert(sizeof(jchar) == 2, "must be"); ++ assert(cntval >= 0 && ((cntval & 0x7fff) == cntval), "wrong immediate"); ++ ++ Label Ldone_false; ++ ++ if (cntval < 16) { // short case ++ if (cntval != 0) li(result_reg, 0); // assume false ++ ++ const int num_bytes = cntval*sizeof(jchar); ++ int index = 0; ++ for (int next_index; (next_index = index + 8) <= num_bytes; index = next_index) { ++ ld(tmp1_reg, index, str1_reg); ++ ld(tmp2_reg, index, str2_reg); ++ cmpd(CCR0, tmp1_reg, tmp2_reg); ++ bne(CCR0, Ldone_false); ++ } ++ if (cntval & 2) { ++ lwz(tmp1_reg, index, str1_reg); ++ lwz(tmp2_reg, index, str2_reg); ++ cmpw(CCR0, tmp1_reg, tmp2_reg); ++ bne(CCR0, Ldone_false); ++ index += 4; ++ } ++ if (cntval & 1) { ++ lhz(tmp1_reg, index, str1_reg); ++ lhz(tmp2_reg, index, str2_reg); ++ cmpw(CCR0, tmp1_reg, tmp2_reg); ++ bne(CCR0, Ldone_false); ++ } ++ // fallthrough: true ++ } else { ++ Label Lloop; ++ Register index_reg = tmp1_reg; ++ const int loopcnt = cntval/4; ++ assert(loopcnt > 0, "must be"); ++ // Offset 0 should be 32 byte aligned. ++ //2: ++ dcbtct(str1_reg, 0x00); // Indicate R/O access to str1. ++ dcbtct(str2_reg, 0x00); // Indicate R/O access to str2. ++ li(tmp2_reg, loopcnt); ++ li(index_reg, 0); // init ++ li(result_reg, 0); // assume false ++ mtctr(tmp2_reg); ++ //8: ++ bind(Lloop); ++ ldx(R0, str1_reg, index_reg); ++ ldx(tmp2_reg, str2_reg, index_reg); ++ cmpd(CCR0, R0, tmp2_reg); ++ bne(CCR0, Ldone_false); // Unequal char pair found -> done. ++ addi(index_reg, index_reg, 4*sizeof(jchar)); ++ bdnz(Lloop); ++ //14: ++ if (cntval & 2) { ++ lwzx(R0, str1_reg, index_reg); ++ lwzx(tmp2_reg, str2_reg, index_reg); ++ cmpw(CCR0, R0, tmp2_reg); ++ bne(CCR0, Ldone_false); ++ if (cntval & 1) addi(index_reg, index_reg, 2*sizeof(jchar)); ++ } ++ if (cntval & 1) { ++ lhzx(R0, str1_reg, index_reg); ++ lhzx(tmp2_reg, str2_reg, index_reg); ++ cmpw(CCR0, R0, tmp2_reg); ++ bne(CCR0, Ldone_false); ++ } ++ // fallthru: true ++ } ++ li(result_reg, 1); ++ bind(Ldone_false); ++} ++ ++ ++void MacroAssembler::asm_assert(bool check_equal, const char *msg, int id) { ++#ifdef ASSERT ++ Label ok; ++ if (check_equal) { ++ beq(CCR0, ok); ++ } else { ++ bne(CCR0, ok); ++ } ++ stop(msg, id); ++ bind(ok); ++#endif ++} ++ ++void MacroAssembler::asm_assert_mems_zero(bool check_equal, int size, int mem_offset, ++ Register mem_base, const char* msg, int id) { ++#ifdef ASSERT ++ switch (size) { ++ case 4: ++ lwz(R0, mem_offset, mem_base); ++ cmpwi(CCR0, R0, 0); ++ break; ++ case 8: ++ ld(R0, mem_offset, mem_base); ++ cmpdi(CCR0, R0, 0); ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ asm_assert(check_equal, msg, id); ++#endif // ASSERT ++} ++ ++void MacroAssembler::verify_thread() { ++ if (VerifyThread) { ++ unimplemented("'VerifyThread' currently not implemented on PPC"); ++ } ++} ++ ++// READ: oop. KILL: R0. Volatile floats perhaps. ++void MacroAssembler::verify_oop(Register oop, const char* msg) { ++ if (!VerifyOops) { ++ return; ++ } ++ // Will be preserved. ++ Register tmp = R11; ++ assert(oop != tmp, "precondition"); ++ unsigned int nbytes_save = 10*8; // 10 volatile gprs ++ address/* FunctionDescriptor** */fd = StubRoutines::verify_oop_subroutine_entry_address(); ++ // save tmp ++ mr(R0, tmp); ++ // kill tmp ++ save_LR_CR(tmp); ++ push_frame_reg_args(nbytes_save, tmp); ++ // restore tmp ++ mr(tmp, R0); ++ save_volatile_gprs(R1_SP, 112); // except R0 ++ // load FunctionDescriptor** / entry_address * ++ load_const(tmp, fd); ++ // load FunctionDescriptor* / entry_address ++ ld(tmp, 0, tmp); ++ mr(R4_ARG2, oop); ++ load_const(R3_ARG1, (address)msg); ++ // call destination for its side effect ++ call_c(tmp); ++ restore_volatile_gprs(R1_SP, 112); // except R0 ++ pop_frame(); ++ // save tmp ++ mr(R0, tmp); ++ // kill tmp ++ restore_LR_CR(tmp); ++ // restore tmp ++ mr(tmp, R0); ++} ++ ++const char* stop_types[] = { ++ "stop", ++ "untested", ++ "unimplemented", ++ "shouldnotreachhere" ++}; ++ ++static void stop_on_request(int tp, const char* msg) { ++ tty->print("PPC assembly code requires stop: (%s) %s\n", (void *)stop_types[tp%/*stop_end*/4], msg); ++ guarantee(false, err_msg("PPC assembly code requires stop: %s", msg)); ++} ++ ++// Call a C-function that prints output. ++void MacroAssembler::stop(int type, const char* msg, int id) { ++#ifndef PRODUCT ++ block_comment(err_msg("stop: %s %s {", stop_types[type%stop_end], msg)); ++#else ++ block_comment("stop {"); ++#endif ++ ++ // setup arguments ++ load_const_optimized(R3_ARG1, type); ++ load_const_optimized(R4_ARG2, (void *)msg, /*tmp=*/R0); ++ call_VM_leaf(CAST_FROM_FN_PTR(address, stop_on_request), R3_ARG1, R4_ARG2); ++ illtrap(); ++ emit_int32(id); ++ block_comment("} stop;"); ++} ++ ++#ifndef PRODUCT ++// Write pattern 0x0101010101010101 in memory region [low-before, high+after]. ++// Val, addr are temp registers. ++// If low == addr, addr is killed. ++// High is preserved. ++void MacroAssembler::zap_from_to(Register low, int before, Register high, int after, Register val, Register addr) { ++ if (!ZapMemory) return; ++ ++ assert_different_registers(low, val); ++ ++ BLOCK_COMMENT("zap memory region {"); ++ load_const_optimized(val, 0x0101010101010101); ++ int size = before + after; ++ if (low == high && size < 5 && size > 0) { ++ int offset = -before*BytesPerWord; ++ for (int i = 0; i < size; ++i) { ++ std(val, offset, low); ++ offset += (1*BytesPerWord); ++ } ++ } else { ++ addi(addr, low, -before*BytesPerWord); ++ assert_different_registers(high, val); ++ if (after) addi(high, high, after * BytesPerWord); ++ Label loop; ++ bind(loop); ++ std(val, 0, addr); ++ addi(addr, addr, 8); ++ cmpd(CCR6, addr, high); ++ ble(CCR6, loop); ++ if (after) addi(high, high, -after * BytesPerWord); // Correct back to old value. ++ } ++ BLOCK_COMMENT("} zap memory region"); ++} ++ ++#endif // !PRODUCT ++ ++SkipIfEqualZero::SkipIfEqualZero(MacroAssembler* masm, Register temp, const bool* flag_addr) : _masm(masm), _label() { ++ int simm16_offset = masm->load_const_optimized(temp, (address)flag_addr, R0, true); ++ assert(sizeof(bool) == 1, "PowerPC ABI"); ++ masm->lbz(temp, simm16_offset, temp); ++ masm->cmpwi(CCR0, temp, 0); ++ masm->beq(CCR0, _label); ++} ++ ++SkipIfEqualZero::~SkipIfEqualZero() { ++ _masm->bind(_label); ++} +--- ./hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,716 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_MACROASSEMBLER_PPC_HPP ++#define CPU_PPC_VM_MACROASSEMBLER_PPC_HPP ++ ++#include "asm/assembler.hpp" ++ ++// MacroAssembler extends Assembler by a few frequently used macros. ++ ++class ciTypeArray; ++ ++class MacroAssembler: public Assembler { ++ public: ++ MacroAssembler(CodeBuffer* code) : Assembler(code) {} ++ ++ // ++ // Optimized instruction emitters ++ // ++ ++ inline static int largeoffset_si16_si16_hi(int si31) { return (si31 + (1<<15)) >> 16; } ++ inline static int largeoffset_si16_si16_lo(int si31) { return si31 - (((si31 + (1<<15)) >> 16) << 16); } ++ ++ // load d = *[a+si31] ++ // Emits several instructions if the offset is not encodable in one instruction. ++ void ld_largeoffset_unchecked(Register d, int si31, Register a, int emit_filler_nop); ++ void ld_largeoffset (Register d, int si31, Register a, int emit_filler_nop); ++ inline static bool is_ld_largeoffset(address a); ++ inline static int get_ld_largeoffset_offset(address a); ++ ++ inline void round_to(Register r, int modulus); ++ ++ // Load/store with type given by parameter. ++ void load_sized_value( Register dst, RegisterOrConstant offs, Register base, size_t size_in_bytes, bool is_signed); ++ void store_sized_value(Register dst, RegisterOrConstant offs, Register base, size_t size_in_bytes); ++ ++ // Move register if destination register and target register are different ++ inline void mr_if_needed(Register rd, Register rs); ++ inline void fmr_if_needed(FloatRegister rd, FloatRegister rs); ++ // This is dedicated for emitting scheduled mach nodes. For better ++ // readability of the ad file I put it here. ++ // Endgroups are not needed if ++ // - the scheduler is off ++ // - the scheduler found that there is a natural group end, in that ++ // case it reduced the size of the instruction used in the test ++ // yielding 'needed'. ++ inline void endgroup_if_needed(bool needed); ++ ++ // Memory barriers. ++ inline void membar(int bits); ++ inline void release(); ++ inline void acquire(); ++ inline void fence(); ++ ++ // nop padding ++ void align(int modulus, int max = 252, int rem = 0); ++ ++ // ++ // Constants, loading constants, TOC support ++ // ++ ++ // Address of the global TOC. ++ inline static address global_toc(); ++ // Offset of given address to the global TOC. ++ inline static int offset_to_global_toc(const address addr); ++ ++ // Address of TOC of the current method. ++ inline address method_toc(); ++ // Offset of given address to TOC of the current method. ++ inline int offset_to_method_toc(const address addr); ++ ++ // Global TOC. ++ void calculate_address_from_global_toc(Register dst, address addr, ++ bool hi16 = true, bool lo16 = true, ++ bool add_relocation = true, bool emit_dummy_addr = false); ++ inline void calculate_address_from_global_toc_hi16only(Register dst, address addr) { ++ calculate_address_from_global_toc(dst, addr, true, false); ++ }; ++ inline void calculate_address_from_global_toc_lo16only(Register dst, address addr) { ++ calculate_address_from_global_toc(dst, addr, false, true); ++ }; ++ ++ inline static bool is_calculate_address_from_global_toc_at(address a, address bound); ++ static int patch_calculate_address_from_global_toc_at(address a, address addr, address bound); ++ static address get_address_of_calculate_address_from_global_toc_at(address a, address addr); ++ ++#ifdef _LP64 ++ // Patch narrow oop constant. ++ inline static bool is_set_narrow_oop(address a, address bound); ++ static int patch_set_narrow_oop(address a, address bound, narrowOop data); ++ static narrowOop get_narrow_oop(address a, address bound); ++#endif ++ ++ inline static bool is_load_const_at(address a); ++ ++ // Emits an oop const to the constant pool, loads the constant, and ++ // sets a relocation info with address current_pc. ++ void load_const_from_method_toc(Register dst, AddressLiteral& a, Register toc); ++ void load_toc_from_toc(Register dst, AddressLiteral& a, Register toc) { ++ assert(dst == R2_TOC, "base register must be TOC"); ++ load_const_from_method_toc(dst, a, toc); ++ } ++ ++ static bool is_load_const_from_method_toc_at(address a); ++ static int get_offset_of_load_const_from_method_toc_at(address a); ++ ++ // Get the 64 bit constant from a `load_const' sequence. ++ static long get_const(address load_const); ++ ++ // Patch the 64 bit constant of a `load_const' sequence. This is a ++ // low level procedure. It neither flushes the instruction cache nor ++ // is it atomic. ++ static void patch_const(address load_const, long x); ++ ++ // Metadata in code that we have to keep track of. ++ AddressLiteral allocate_metadata_address(Metadata* obj); // allocate_index ++ AddressLiteral constant_metadata_address(Metadata* obj); // find_index ++ // Oops used directly in compiled code are stored in the constant pool, ++ // and loaded from there. ++ // Allocate new entry for oop in constant pool. Generate relocation. ++ AddressLiteral allocate_oop_address(jobject obj); ++ // Find oop obj in constant pool. Return relocation with it's index. ++ AddressLiteral constant_oop_address(jobject obj); ++ ++ // Find oop in constant pool and emit instructions to load it. ++ // Uses constant_oop_address. ++ inline void set_oop_constant(jobject obj, Register d); ++ // Same as load_address. ++ inline void set_oop (AddressLiteral obj_addr, Register d); ++ ++ // Read runtime constant: Issue load if constant not yet established, ++ // else use real constant. ++ virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr, ++ Register tmp, ++ int offset); ++ ++ // ++ // branch, jump ++ // ++ ++ inline void pd_patch_instruction(address branch, address target); ++ NOT_PRODUCT(static void pd_print_patched_instruction(address branch);) ++ ++ // Conditional far branch for destinations encodable in 24+2 bits. ++ // Same interface as bc, e.g. no inverse boint-field. ++ enum { ++ bc_far_optimize_not = 0, ++ bc_far_optimize_on_relocate = 1 ++ }; ++ // optimize: flag for telling the conditional far branch to optimize ++ // itself when relocated. ++ void bc_far(int boint, int biint, Label& dest, int optimize); ++ // Relocation of conditional far branches. ++ static bool is_bc_far_at(address instruction_addr); ++ static address get_dest_of_bc_far_at(address instruction_addr); ++ static void set_dest_of_bc_far_at(address instruction_addr, address dest); ++ private: ++ static bool inline is_bc_far_variant1_at(address instruction_addr); ++ static bool inline is_bc_far_variant2_at(address instruction_addr); ++ static bool inline is_bc_far_variant3_at(address instruction_addr); ++ public: ++ ++ // Convenience bc_far versions. ++ inline void blt_far(ConditionRegister crx, Label& L, int optimize); ++ inline void bgt_far(ConditionRegister crx, Label& L, int optimize); ++ inline void beq_far(ConditionRegister crx, Label& L, int optimize); ++ inline void bso_far(ConditionRegister crx, Label& L, int optimize); ++ inline void bge_far(ConditionRegister crx, Label& L, int optimize); ++ inline void ble_far(ConditionRegister crx, Label& L, int optimize); ++ inline void bne_far(ConditionRegister crx, Label& L, int optimize); ++ inline void bns_far(ConditionRegister crx, Label& L, int optimize); ++ ++ // Emit, identify and patch a NOT mt-safe patchable 64 bit absolute call/jump. ++ private: ++ enum { ++ bxx64_patchable_instruction_count = (2/*load_codecache_const*/ + 3/*5load_const*/ + 1/*mtctr*/ + 1/*bctrl*/), ++ bxx64_patchable_size = bxx64_patchable_instruction_count * BytesPerInstWord, ++ bxx64_patchable_ret_addr_offset = bxx64_patchable_size ++ }; ++ void bxx64_patchable(address target, relocInfo::relocType rt, bool link); ++ static bool is_bxx64_patchable_at( address instruction_addr, bool link); ++ // Does the instruction use a pc-relative encoding of the destination? ++ static bool is_bxx64_patchable_pcrelative_at( address instruction_addr, bool link); ++ static bool is_bxx64_patchable_variant1_at( address instruction_addr, bool link); ++ // Load destination relative to global toc. ++ static bool is_bxx64_patchable_variant1b_at( address instruction_addr, bool link); ++ static bool is_bxx64_patchable_variant2_at( address instruction_addr, bool link); ++ static void set_dest_of_bxx64_patchable_at( address instruction_addr, address target, bool link); ++ static address get_dest_of_bxx64_patchable_at(address instruction_addr, bool link); ++ ++ public: ++ // call ++ enum { ++ bl64_patchable_instruction_count = bxx64_patchable_instruction_count, ++ bl64_patchable_size = bxx64_patchable_size, ++ bl64_patchable_ret_addr_offset = bxx64_patchable_ret_addr_offset ++ }; ++ inline void bl64_patchable(address target, relocInfo::relocType rt) { ++ bxx64_patchable(target, rt, /*link=*/true); ++ } ++ inline static bool is_bl64_patchable_at(address instruction_addr) { ++ return is_bxx64_patchable_at(instruction_addr, /*link=*/true); ++ } ++ inline static bool is_bl64_patchable_pcrelative_at(address instruction_addr) { ++ return is_bxx64_patchable_pcrelative_at(instruction_addr, /*link=*/true); ++ } ++ inline static void set_dest_of_bl64_patchable_at(address instruction_addr, address target) { ++ set_dest_of_bxx64_patchable_at(instruction_addr, target, /*link=*/true); ++ } ++ inline static address get_dest_of_bl64_patchable_at(address instruction_addr) { ++ return get_dest_of_bxx64_patchable_at(instruction_addr, /*link=*/true); ++ } ++ // jump ++ enum { ++ b64_patchable_instruction_count = bxx64_patchable_instruction_count, ++ b64_patchable_size = bxx64_patchable_size, ++ }; ++ inline void b64_patchable(address target, relocInfo::relocType rt) { ++ bxx64_patchable(target, rt, /*link=*/false); ++ } ++ inline static bool is_b64_patchable_at(address instruction_addr) { ++ return is_bxx64_patchable_at(instruction_addr, /*link=*/false); ++ } ++ inline static bool is_b64_patchable_pcrelative_at(address instruction_addr) { ++ return is_bxx64_patchable_pcrelative_at(instruction_addr, /*link=*/false); ++ } ++ inline static void set_dest_of_b64_patchable_at(address instruction_addr, address target) { ++ set_dest_of_bxx64_patchable_at(instruction_addr, target, /*link=*/false); ++ } ++ inline static address get_dest_of_b64_patchable_at(address instruction_addr) { ++ return get_dest_of_bxx64_patchable_at(instruction_addr, /*link=*/false); ++ } ++ ++ // ++ // Support for frame handling ++ // ++ ++ // some ABI-related functions ++ void save_nonvolatile_gprs( Register dst_base, int offset); ++ void restore_nonvolatile_gprs(Register src_base, int offset); ++ void save_volatile_gprs( Register dst_base, int offset); ++ void restore_volatile_gprs(Register src_base, int offset); ++ void save_LR_CR( Register tmp); // tmp contains LR on return. ++ void restore_LR_CR(Register tmp); ++ ++ // Get current PC using bl-next-instruction trick. ++ address get_PC_trash_LR(Register result); ++ ++ // Resize current frame either relatively wrt to current SP or absolute. ++ void resize_frame(Register offset, Register tmp); ++ void resize_frame(int offset, Register tmp); ++ void resize_frame_absolute(Register addr, Register tmp1, Register tmp2); ++ ++ // Push a frame of size bytes. ++ void push_frame(Register bytes, Register tmp); ++ ++ // Push a frame of size `bytes'. No abi space provided. ++ void push_frame(unsigned int bytes, Register tmp); ++ ++ // Push a frame of size `bytes' plus abi_reg_args on top. ++ void push_frame_reg_args(unsigned int bytes, Register tmp); ++ ++ // Setup up a new C frame with a spill area for non-volatile GPRs and additional ++ // space for local variables ++ void push_frame_reg_args_nonvolatiles(unsigned int bytes, Register tmp); ++ ++ // pop current C frame ++ void pop_frame(); ++ ++ // ++ // Calls ++ // ++ ++ private: ++ address _last_calls_return_pc; ++ ++#if defined(ABI_ELFv2) ++ // Generic version of a call to C function. ++ // Updates and returns _last_calls_return_pc. ++ address branch_to(Register function_entry, bool and_link); ++#else ++ // Generic version of a call to C function via a function descriptor ++ // with variable support for C calling conventions (TOC, ENV, etc.). ++ // updates and returns _last_calls_return_pc. ++ address branch_to(Register function_descriptor, bool and_link, bool save_toc_before_call, ++ bool restore_toc_after_call, bool load_toc_of_callee, bool load_env_of_callee); ++#endif ++ ++ public: ++ ++ // Get the pc where the last call will return to. returns _last_calls_return_pc. ++ inline address last_calls_return_pc(); ++ ++#if defined(ABI_ELFv2) ++ // Call a C function via a function descriptor and use full C ++ // calling conventions. Updates and returns _last_calls_return_pc. ++ address call_c(Register function_entry); ++ // For tail calls: only branch, don't link, so callee returns to caller of this function. ++ address call_c_and_return_to_caller(Register function_entry); ++ address call_c(address function_entry, relocInfo::relocType rt); ++#else ++ // Call a C function via a function descriptor and use full C ++ // calling conventions. Updates and returns _last_calls_return_pc. ++ address call_c(Register function_descriptor); ++ // For tail calls: only branch, don't link, so callee returns to caller of this function. ++ address call_c_and_return_to_caller(Register function_descriptor); ++ address call_c(const FunctionDescriptor* function_descriptor, relocInfo::relocType rt); ++ address call_c_using_toc(const FunctionDescriptor* function_descriptor, relocInfo::relocType rt, ++ Register toc); ++#endif ++ ++ protected: ++ ++ // It is imperative that all calls into the VM are handled via the ++ // call_VM macros. They make sure that the stack linkage is setup ++ // correctly. call_VM's correspond to ENTRY/ENTRY_X entry points ++ // while call_VM_leaf's correspond to LEAF entry points. ++ // ++ // This is the base routine called by the different versions of ++ // call_VM. The interpreter may customize this version by overriding ++ // it for its purposes (e.g., to save/restore additional registers ++ // when doing a VM call). ++ // ++ // If no last_java_sp is specified (noreg) then SP will be used instead. ++ virtual void call_VM_base( ++ // where an oop-result ends up if any; use noreg otherwise ++ Register oop_result, ++ // to set up last_Java_frame in stubs; use noreg otherwise ++ Register last_java_sp, ++ // the entry point ++ address entry_point, ++ // flag which indicates if exception should be checked ++ bool check_exception = true ++ ); ++ ++ // Support for VM calls. This is the base routine called by the ++ // different versions of call_VM_leaf. The interpreter may customize ++ // this version by overriding it for its purposes (e.g., to ++ // save/restore additional registers when doing a VM call). ++ void call_VM_leaf_base(address entry_point); ++ ++ public: ++ // Call into the VM. ++ // Passes the thread pointer (in R3_ARG1) as a prepended argument. ++ // Makes sure oop return values are visible to the GC. ++ void call_VM(Register oop_result, address entry_point, bool check_exceptions = true); ++ void call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions = true); ++ void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true); ++ void call_VM_leaf(address entry_point); ++ void call_VM_leaf(address entry_point, Register arg_1); ++ void call_VM_leaf(address entry_point, Register arg_1, Register arg_2); ++ void call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3); ++ ++ // Call a stub function via a function descriptor, but don't save ++ // TOC before call, don't setup TOC and ENV for call, and don't ++ // restore TOC after call. Updates and returns _last_calls_return_pc. ++ inline address call_stub(Register function_entry); ++ inline void call_stub_and_return_to(Register function_entry, Register return_pc); ++ ++ // ++ // Java utilities ++ // ++ ++ // Read from the polling page, its address is already in a register. ++ inline void load_from_polling_page(Register polling_page_address, int offset = 0); ++ // Check whether instruction is a read access to the polling page ++ // which was emitted by load_from_polling_page(..). ++ static bool is_load_from_polling_page(int instruction, void* ucontext/*may be NULL*/, ++ address* polling_address_ptr = NULL); ++ ++ // Check whether instruction is a write access to the memory ++ // serialization page realized by one of the instructions stw, stwu, ++ // stwx, or stwux. ++ static bool is_memory_serialization(int instruction, JavaThread* thread, void* ucontext); ++ ++ // Support for NULL-checks ++ // ++ // Generates code that causes a NULL OS exception if the content of reg is NULL. ++ // If the accessed location is M[reg + offset] and the offset is known, provide the ++ // offset. No explicit code generation is needed if the offset is within a certain ++ // range (0 <= offset <= page_size). ++ ++ // Stack overflow checking ++ void bang_stack_with_offset(int offset); ++ ++ // If instruction is a stack bang of the form ld, stdu, or ++ // stdux, return the banged address. Otherwise, return 0. ++ static address get_stack_bang_address(int instruction, void* ucontext); ++ ++ // Atomics ++ // CmpxchgX sets condition register to cmpX(current, compare). ++ // (flag == ne) => (dest_current_value != compare_value), (!swapped) ++ // (flag == eq) => (dest_current_value == compare_value), ( swapped) ++ static inline bool cmpxchgx_hint_acquire_lock() { return true; } ++ // The stxcx will probably not be succeeded by a releasing store. ++ static inline bool cmpxchgx_hint_release_lock() { return false; } ++ static inline bool cmpxchgx_hint_atomic_update() { return false; } ++ ++ // Cmpxchg semantics ++ enum { ++ MemBarNone = 0, ++ MemBarRel = 1, ++ MemBarAcq = 2, ++ MemBarFenceAfter = 4 // use powers of 2 ++ }; ++ void cmpxchgw(ConditionRegister flag, ++ Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base, ++ int semantics, bool cmpxchgx_hint = false, ++ Register int_flag_success = noreg, bool contention_hint = false); ++ void cmpxchgd(ConditionRegister flag, ++ Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base, ++ int semantics, bool cmpxchgx_hint = false, ++ Register int_flag_success = noreg, Label* failed = NULL, bool contention_hint = false); ++ ++ // interface method calling ++ void lookup_interface_method(Register recv_klass, ++ Register intf_klass, ++ RegisterOrConstant itable_index, ++ Register method_result, ++ Register temp_reg, Register temp2_reg, ++ Label& no_such_interface); ++ ++ // virtual method calling ++ void lookup_virtual_method(Register recv_klass, ++ RegisterOrConstant vtable_index, ++ Register method_result); ++ ++ // Test sub_klass against super_klass, with fast and slow paths. ++ ++ // The fast path produces a tri-state answer: yes / no / maybe-slow. ++ // One of the three labels can be NULL, meaning take the fall-through. ++ // If super_check_offset is -1, the value is loaded up from super_klass. ++ // No registers are killed, except temp_reg and temp2_reg. ++ // If super_check_offset is not -1, temp2_reg is not used and can be noreg. ++ void check_klass_subtype_fast_path(Register sub_klass, ++ Register super_klass, ++ Register temp1_reg, ++ Register temp2_reg, ++ Label& L_success, ++ Label& L_failure); ++ ++ // The rest of the type check; must be wired to a corresponding fast path. ++ // It does not repeat the fast path logic, so don't use it standalone. ++ // The temp_reg can be noreg, if no temps are available. ++ // It can also be sub_klass or super_klass, meaning it's OK to kill that one. ++ // Updates the sub's secondary super cache as necessary. ++ void check_klass_subtype_slow_path(Register sub_klass, ++ Register super_klass, ++ Register temp1_reg, ++ Register temp2_reg, ++ Label* L_success = NULL, ++ Register result_reg = noreg); ++ ++ // Simplified, combined version, good for typical uses. ++ // Falls through on failure. ++ void check_klass_subtype(Register sub_klass, ++ Register super_klass, ++ Register temp1_reg, ++ Register temp2_reg, ++ Label& L_success); ++ ++ // Method handle support (JSR 292). ++ void check_method_handle_type(Register mtype_reg, Register mh_reg, Register temp_reg, Label& wrong_method_type); ++ ++ RegisterOrConstant argument_offset(RegisterOrConstant arg_slot, Register temp_reg, int extra_slot_offset = 0); ++ ++ // Biased locking support ++ // Upon entry,obj_reg must contain the target object, and mark_reg ++ // must contain the target object's header. ++ // Destroys mark_reg if an attempt is made to bias an anonymously ++ // biased lock. In this case a failure will go either to the slow ++ // case or fall through with the notEqual condition code set with ++ // the expectation that the slow case in the runtime will be called. ++ // In the fall-through case where the CAS-based lock is done, ++ // mark_reg is not destroyed. ++ void biased_locking_enter(ConditionRegister cr_reg, Register obj_reg, Register mark_reg, Register temp_reg, ++ Register temp2_reg, Label& done, Label* slow_case = NULL); ++ // Upon entry, the base register of mark_addr must contain the oop. ++ // Destroys temp_reg. ++ // If allow_delay_slot_filling is set to true, the next instruction ++ // emitted after this one will go in an annulled delay slot if the ++ // biased locking exit case failed. ++ void biased_locking_exit(ConditionRegister cr_reg, Register mark_addr, Register temp_reg, Label& done); ++ ++ void compiler_fast_lock_object( ConditionRegister flag, Register oop, Register box, Register tmp1, Register tmp2, Register tmp3); ++ void compiler_fast_unlock_object(ConditionRegister flag, Register oop, Register box, Register tmp1, Register tmp2, Register tmp3); ++ ++ // Support for serializing memory accesses between threads ++ void serialize_memory(Register thread, Register tmp1, Register tmp2); ++ ++ // GC barrier support. ++ void card_write_barrier_post(Register Rstore_addr, Register Rnew_val, Register Rtmp); ++ void card_table_write(jbyte* byte_map_base, Register Rtmp, Register Robj); ++ ++#if INCLUDE_ALL_GCS ++ // General G1 pre-barrier generator. ++ void g1_write_barrier_pre(Register Robj, RegisterOrConstant offset, Register Rpre_val, ++ Register Rtmp1, Register Rtmp2, bool needs_frame = false); ++ // General G1 post-barrier generator ++ void g1_write_barrier_post(Register Rstore_addr, Register Rnew_val, Register Rtmp1, ++ Register Rtmp2, Register Rtmp3, Label *filtered_ext = NULL); ++#endif ++ ++ // Support for managing the JavaThread pointer (i.e.; the reference to ++ // thread-local information). ++ ++ // Support for last Java frame (but use call_VM instead where possible): ++ // access R16_thread->last_Java_sp. ++ void set_last_Java_frame(Register last_java_sp, Register last_Java_pc); ++ void reset_last_Java_frame(void); ++ void set_top_ijava_frame_at_SP_as_last_Java_frame(Register sp, Register tmp1); ++ ++ // Read vm result from thread: oop_result = R16_thread->result; ++ void get_vm_result (Register oop_result); ++ void get_vm_result_2(Register metadata_result); ++ ++ static bool needs_explicit_null_check(intptr_t offset); ++ ++ // Trap-instruction-based checks. ++ // Range checks can be distinguished from zero checks as they check 32 bit, ++ // zero checks all 64 bits (tw, td). ++ inline void trap_null_check(Register a, trap_to_bits cmp = traptoEqual); ++ static bool is_trap_null_check(int x) { ++ return is_tdi(x, traptoEqual, -1/*any reg*/, 0) || ++ is_tdi(x, traptoGreaterThanUnsigned, -1/*any reg*/, 0); ++ } ++ ++ inline void trap_zombie_not_entrant(); ++ static bool is_trap_zombie_not_entrant(int x) { return is_tdi(x, traptoUnconditional, 0/*reg 0*/, 1); } ++ ++ inline void trap_should_not_reach_here(); ++ static bool is_trap_should_not_reach_here(int x) { return is_tdi(x, traptoUnconditional, 0/*reg 0*/, 2); } ++ ++ inline void trap_ic_miss_check(Register a, Register b); ++ static bool is_trap_ic_miss_check(int x) { ++ return is_td(x, traptoGreaterThanUnsigned | traptoLessThanUnsigned, -1/*any reg*/, -1/*any reg*/); ++ } ++ ++ // Implicit or explicit null check, jumps to static address exception_entry. ++ inline void null_check_throw(Register a, int offset, Register temp_reg, address exception_entry); ++ ++ // Check accessed object for null. Use SIGTRAP-based null checks on AIX. ++ inline void load_with_trap_null_check(Register d, int si16, Register s1); ++ ++ // Load heap oop and decompress. Loaded oop may not be null. ++ inline void load_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1 = noreg); ++ inline void store_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1, ++ /*specify if d must stay uncompressed*/ Register tmp = noreg); ++ ++ // Null allowed. ++ inline void load_heap_oop(Register d, RegisterOrConstant offs, Register s1 = noreg); ++ ++ // Encode/decode heap oop. Oop may not be null, else en/decoding goes wrong. ++ inline Register encode_heap_oop_not_null(Register d, Register src = noreg); ++ inline void decode_heap_oop_not_null(Register d); ++ ++ // Null allowed. ++ inline void decode_heap_oop(Register d); ++ ++ // Load/Store klass oop from klass field. Compress. ++ void load_klass(Register dst, Register src); ++ void load_klass_with_trap_null_check(Register dst, Register src); ++ void store_klass(Register dst_oop, Register klass, Register tmp = R0); ++ void store_klass_gap(Register dst_oop, Register val = noreg); // Will store 0 if val not specified. ++ static int instr_size_for_decode_klass_not_null(); ++ void decode_klass_not_null(Register dst, Register src = noreg); ++ void encode_klass_not_null(Register dst, Register src = noreg); ++ ++ // Load common heap base into register. ++ void reinit_heapbase(Register d, Register tmp = noreg); ++ ++ // SIGTRAP-based range checks for arrays. ++ inline void trap_range_check_l(Register a, Register b); ++ inline void trap_range_check_l(Register a, int si16); ++ static bool is_trap_range_check_l(int x) { ++ return (is_tw (x, traptoLessThanUnsigned, -1/*any reg*/, -1/*any reg*/) || ++ is_twi(x, traptoLessThanUnsigned, -1/*any reg*/) ); ++ } ++ inline void trap_range_check_le(Register a, int si16); ++ static bool is_trap_range_check_le(int x) { ++ return is_twi(x, traptoEqual | traptoLessThanUnsigned, -1/*any reg*/); ++ } ++ inline void trap_range_check_g(Register a, int si16); ++ static bool is_trap_range_check_g(int x) { ++ return is_twi(x, traptoGreaterThanUnsigned, -1/*any reg*/); ++ } ++ inline void trap_range_check_ge(Register a, Register b); ++ inline void trap_range_check_ge(Register a, int si16); ++ static bool is_trap_range_check_ge(int x) { ++ return (is_tw (x, traptoEqual | traptoGreaterThanUnsigned, -1/*any reg*/, -1/*any reg*/) || ++ is_twi(x, traptoEqual | traptoGreaterThanUnsigned, -1/*any reg*/) ); ++ } ++ static bool is_trap_range_check(int x) { ++ return is_trap_range_check_l(x) || is_trap_range_check_le(x) || ++ is_trap_range_check_g(x) || is_trap_range_check_ge(x); ++ } ++ ++ void clear_memory_doubleword(Register base_ptr, Register cnt_dwords, Register tmp = R0); ++ ++ // Needle of length 1. ++ void string_indexof_1(Register result, Register haystack, Register haycnt, ++ Register needle, jchar needleChar, ++ Register tmp1, Register tmp2); ++ // General indexof, eventually with constant needle length. ++ void string_indexof(Register result, Register haystack, Register haycnt, ++ Register needle, ciTypeArray* needle_values, Register needlecnt, int needlecntval, ++ Register tmp1, Register tmp2, Register tmp3, Register tmp4); ++ void string_compare(Register str1_reg, Register str2_reg, Register cnt1_reg, Register cnt2_reg, ++ Register result_reg, Register tmp_reg); ++ void char_arrays_equals(Register str1_reg, Register str2_reg, Register cnt_reg, Register result_reg, ++ Register tmp1_reg, Register tmp2_reg, Register tmp3_reg, Register tmp4_reg, ++ Register tmp5_reg); ++ void char_arrays_equalsImm(Register str1_reg, Register str2_reg, int cntval, Register result_reg, ++ Register tmp1_reg, Register tmp2_reg); ++ ++ // ++ // Debugging ++ // ++ ++ // assert on cr0 ++ void asm_assert(bool check_equal, const char* msg, int id); ++ void asm_assert_eq(const char* msg, int id) { asm_assert(true, msg, id); } ++ void asm_assert_ne(const char* msg, int id) { asm_assert(false, msg, id); } ++ ++ private: ++ void asm_assert_mems_zero(bool check_equal, int size, int mem_offset, Register mem_base, ++ const char* msg, int id); ++ ++ public: ++ ++ void asm_assert_mem8_is_zero(int mem_offset, Register mem_base, const char* msg, int id) { ++ asm_assert_mems_zero(true, 8, mem_offset, mem_base, msg, id); ++ } ++ void asm_assert_mem8_isnot_zero(int mem_offset, Register mem_base, const char* msg, int id) { ++ asm_assert_mems_zero(false, 8, mem_offset, mem_base, msg, id); ++ } ++ ++ // Verify R16_thread contents. ++ void verify_thread(); ++ ++ // Emit code to verify that reg contains a valid oop if +VerifyOops is set. ++ void verify_oop(Register reg, const char* s = "broken oop"); ++ ++ // TODO: verify method and klass metadata (compare against vptr?) ++ void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {} ++ void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line) {} ++ ++ // Convenience method returning function entry. For the ELFv1 case ++ // creates function descriptor at the current address and returs ++ // the pointer to it. For the ELFv2 case returns the current address. ++ inline address function_entry(); ++ ++#define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__) ++#define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__) ++ ++ private: ++ ++ enum { ++ stop_stop = 0, ++ stop_untested = 1, ++ stop_unimplemented = 2, ++ stop_shouldnotreachhere = 3, ++ stop_end = 4 ++ }; ++ void stop(int type, const char* msg, int id); ++ ++ public: ++ // Prints msg, dumps registers and stops execution. ++ void stop (const char* msg = "", int id = 0) { stop(stop_stop, msg, id); } ++ void untested (const char* msg = "", int id = 0) { stop(stop_untested, msg, id); } ++ void unimplemented(const char* msg = "", int id = 0) { stop(stop_unimplemented, msg, id); } ++ void should_not_reach_here() { stop(stop_shouldnotreachhere, "", -1); } ++ ++ void zap_from_to(Register low, int before, Register high, int after, Register val, Register addr) PRODUCT_RETURN; ++}; ++ ++// class SkipIfEqualZero: ++// ++// Instantiating this class will result in assembly code being output that will ++// jump around any code emitted between the creation of the instance and it's ++// automatic destruction at the end of a scope block, depending on the value of ++// the flag passed to the constructor, which will be checked at run-time. ++class SkipIfEqualZero : public StackObj { ++ private: ++ MacroAssembler* _masm; ++ Label _label; ++ ++ public: ++ // 'Temp' is a temp register that this object can use (and trash). ++ explicit SkipIfEqualZero(MacroAssembler*, Register temp, const bool* flag_addr); ++ ~SkipIfEqualZero(); ++}; ++ ++#endif // CPU_PPC_VM_MACROASSEMBLER_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/macroAssembler_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/macroAssembler_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,407 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_MACROASSEMBLER_PPC_INLINE_HPP ++#define CPU_PPC_VM_MACROASSEMBLER_PPC_INLINE_HPP ++ ++#include "asm/assembler.inline.hpp" ++#include "asm/macroAssembler.hpp" ++#include "asm/codeBuffer.hpp" ++#include "code/codeCache.hpp" ++ ++inline bool MacroAssembler::is_ld_largeoffset(address a) { ++ const int inst1 = *(int *)a; ++ const int inst2 = *(int *)(a+4); ++ return (is_ld(inst1)) || ++ (is_addis(inst1) && is_ld(inst2) && inv_ra_field(inst2) == inv_rt_field(inst1)); ++} ++ ++inline int MacroAssembler::get_ld_largeoffset_offset(address a) { ++ assert(MacroAssembler::is_ld_largeoffset(a), "must be ld with large offset"); ++ ++ const int inst1 = *(int *)a; ++ if (is_ld(inst1)) { ++ return inv_d1_field(inst1); ++ } else { ++ const int inst2 = *(int *)(a+4); ++ return (inv_d1_field(inst1) << 16) + inv_d1_field(inst2); ++ } ++} ++ ++inline void MacroAssembler::round_to(Register r, int modulus) { ++ assert(is_power_of_2_long((jlong)modulus), "must be power of 2"); ++ addi(r, r, modulus-1); ++ clrrdi(r, r, log2_long((jlong)modulus)); ++} ++ ++// Move register if destination register and target register are different. ++inline void MacroAssembler::mr_if_needed(Register rd, Register rs) { ++ if (rs != rd) mr(rd, rs); ++} ++inline void MacroAssembler::fmr_if_needed(FloatRegister rd, FloatRegister rs) { ++ if (rs != rd) fmr(rd, rs); ++} ++inline void MacroAssembler::endgroup_if_needed(bool needed) { ++ if (needed) { ++ endgroup(); ++ } ++} ++ ++inline void MacroAssembler::membar(int bits) { ++ // TODO: use elemental_membar(bits) for Power 8 and disable optimization of acquire-release ++ // (Matcher::post_membar_release where we use PPC64_ONLY(xop == Op_MemBarRelease ||)) ++ if (bits & StoreLoad) sync(); else lwsync(); ++} ++inline void MacroAssembler::release() { membar(LoadStore | StoreStore); } ++inline void MacroAssembler::acquire() { membar(LoadLoad | LoadStore); } ++inline void MacroAssembler::fence() { membar(LoadLoad | LoadStore | StoreLoad | StoreStore); } ++ ++// Address of the global TOC. ++inline address MacroAssembler::global_toc() { ++ return CodeCache::low_bound(); ++} ++ ++// Offset of given address to the global TOC. ++inline int MacroAssembler::offset_to_global_toc(const address addr) { ++ intptr_t offset = (intptr_t)addr - (intptr_t)MacroAssembler::global_toc(); ++ assert(Assembler::is_simm((long)offset, 31) && offset >= 0, "must be in range"); ++ return (int)offset; ++} ++ ++// Address of current method's TOC. ++inline address MacroAssembler::method_toc() { ++ return code()->consts()->start(); ++} ++ ++// Offset of given address to current method's TOC. ++inline int MacroAssembler::offset_to_method_toc(address addr) { ++ intptr_t offset = (intptr_t)addr - (intptr_t)method_toc(); ++ assert(is_simm((long)offset, 31) && offset >= 0, "must be in range"); ++ return (int)offset; ++} ++ ++inline bool MacroAssembler::is_calculate_address_from_global_toc_at(address a, address bound) { ++ const address inst2_addr = a; ++ const int inst2 = *(int *) a; ++ ++ // The relocation points to the second instruction, the addi. ++ if (!is_addi(inst2)) return false; ++ ++ // The addi reads and writes the same register dst. ++ const int dst = inv_rt_field(inst2); ++ if (inv_ra_field(inst2) != dst) return false; ++ ++ // Now, find the preceding addis which writes to dst. ++ int inst1 = 0; ++ address inst1_addr = inst2_addr - BytesPerInstWord; ++ while (inst1_addr >= bound) { ++ inst1 = *(int *) inst1_addr; ++ if (is_addis(inst1) && inv_rt_field(inst1) == dst) { ++ // stop, found the addis which writes dst ++ break; ++ } ++ inst1_addr -= BytesPerInstWord; ++ } ++ ++ if (!(inst1 == 0 || inv_ra_field(inst1) == 29 /* R29 */)) return false; ++ return is_addis(inst1); ++} ++ ++#ifdef _LP64 ++// Detect narrow oop constants. ++inline bool MacroAssembler::is_set_narrow_oop(address a, address bound) { ++ const address inst2_addr = a; ++ const int inst2 = *(int *)a; ++ // The relocation points to the second instruction, the ori. ++ if (!is_ori(inst2)) return false; ++ ++ // The ori reads and writes the same register dst. ++ const int dst = inv_rta_field(inst2); ++ if (inv_rs_field(inst2) != dst) return false; ++ ++ // Now, find the preceding addis which writes to dst. ++ int inst1 = 0; ++ address inst1_addr = inst2_addr - BytesPerInstWord; ++ while (inst1_addr >= bound) { ++ inst1 = *(int *) inst1_addr; ++ if (is_lis(inst1) && inv_rs_field(inst1) == dst) return true; ++ inst1_addr -= BytesPerInstWord; ++ } ++ return false; ++} ++#endif ++ ++ ++inline bool MacroAssembler::is_load_const_at(address a) { ++ const int* p_inst = (int *) a; ++ bool b = is_lis(*p_inst++); ++ if (is_ori(*p_inst)) { ++ p_inst++; ++ b = b && is_rldicr(*p_inst++); // TODO: could be made more precise: `sldi'! ++ b = b && is_oris(*p_inst++); ++ b = b && is_ori(*p_inst); ++ } else if (is_lis(*p_inst)) { ++ p_inst++; ++ b = b && is_ori(*p_inst++); ++ b = b && is_ori(*p_inst); ++ // TODO: could enhance reliability by adding is_insrdi ++ } else return false; ++ return b; ++} ++ ++inline void MacroAssembler::set_oop_constant(jobject obj, Register d) { ++ set_oop(constant_oop_address(obj), d); ++} ++ ++inline void MacroAssembler::set_oop(AddressLiteral obj_addr, Register d) { ++ assert(obj_addr.rspec().type() == relocInfo::oop_type, "must be an oop reloc"); ++ load_const(d, obj_addr); ++} ++ ++inline void MacroAssembler::pd_patch_instruction(address branch, address target) { ++ jint& stub_inst = *(jint*) branch; ++ stub_inst = patched_branch(target - branch, stub_inst, 0); ++} ++ ++// Relocation of conditional far branches. ++inline bool MacroAssembler::is_bc_far_variant1_at(address instruction_addr) { ++ // Variant 1, the 1st instruction contains the destination address: ++ // ++ // bcxx DEST ++ // endgroup ++ // ++ const int instruction_1 = *(int*)(instruction_addr); ++ const int instruction_2 = *(int*)(instruction_addr + 4); ++ return is_bcxx(instruction_1) && ++ (inv_bd_field(instruction_1, (intptr_t)instruction_addr) != (intptr_t)(instruction_addr + 2*4)) && ++ is_endgroup(instruction_2); ++} ++ ++// Relocation of conditional far branches. ++inline bool MacroAssembler::is_bc_far_variant2_at(address instruction_addr) { ++ // Variant 2, the 2nd instruction contains the destination address: ++ // ++ // b!cxx SKIP ++ // bxx DEST ++ // SKIP: ++ // ++ const int instruction_1 = *(int*)(instruction_addr); ++ const int instruction_2 = *(int*)(instruction_addr + 4); ++ return is_bcxx(instruction_1) && ++ (inv_bd_field(instruction_1, (intptr_t)instruction_addr) == (intptr_t)(instruction_addr + 2*4)) && ++ is_bxx(instruction_2); ++} ++ ++// Relocation for conditional branches ++inline bool MacroAssembler::is_bc_far_variant3_at(address instruction_addr) { ++ // Variant 3, far cond branch to the next instruction, already patched to nops: ++ // ++ // nop ++ // endgroup ++ // SKIP/DEST: ++ // ++ const int instruction_1 = *(int*)(instruction_addr); ++ const int instruction_2 = *(int*)(instruction_addr + 4); ++ return is_nop(instruction_1) && ++ is_endgroup(instruction_2); ++} ++ ++ ++// Convenience bc_far versions ++inline void MacroAssembler::blt_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs1, bi0(crx, less), L, optimize); } ++inline void MacroAssembler::bgt_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs1, bi0(crx, greater), L, optimize); } ++inline void MacroAssembler::beq_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs1, bi0(crx, equal), L, optimize); } ++inline void MacroAssembler::bso_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs1, bi0(crx, summary_overflow), L, optimize); } ++inline void MacroAssembler::bge_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs0, bi0(crx, less), L, optimize); } ++inline void MacroAssembler::ble_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs0, bi0(crx, greater), L, optimize); } ++inline void MacroAssembler::bne_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs0, bi0(crx, equal), L, optimize); } ++inline void MacroAssembler::bns_far(ConditionRegister crx, Label& L, int optimize) { MacroAssembler::bc_far(bcondCRbiIs0, bi0(crx, summary_overflow), L, optimize); } ++ ++inline address MacroAssembler::call_stub(Register function_entry) { ++ mtctr(function_entry); ++ bctrl(); ++ return pc(); ++} ++ ++inline void MacroAssembler::call_stub_and_return_to(Register function_entry, Register return_pc) { ++ assert_different_registers(function_entry, return_pc); ++ mtlr(return_pc); ++ mtctr(function_entry); ++ bctr(); ++} ++ ++// Get the pc where the last emitted call will return to. ++inline address MacroAssembler::last_calls_return_pc() { ++ return _last_calls_return_pc; ++} ++ ++// Read from the polling page, its address is already in a register. ++inline void MacroAssembler::load_from_polling_page(Register polling_page_address, int offset) { ++ ld(R0, offset, polling_page_address); ++} ++ ++// Trap-instruction-based checks. ++ ++inline void MacroAssembler::trap_null_check(Register a, trap_to_bits cmp) { ++ assert(TrapBasedNullChecks, "sanity"); ++ tdi(cmp, a/*reg a*/, 0); ++} ++inline void MacroAssembler::trap_zombie_not_entrant() { ++ tdi(traptoUnconditional, 0/*reg 0*/, 1); ++} ++inline void MacroAssembler::trap_should_not_reach_here() { ++ tdi_unchecked(traptoUnconditional, 0/*reg 0*/, 2); ++} ++ ++inline void MacroAssembler::trap_ic_miss_check(Register a, Register b) { ++ td(traptoGreaterThanUnsigned | traptoLessThanUnsigned, a, b); ++} ++ ++// Do an explicit null check if access to a+offset will not raise a SIGSEGV. ++// Either issue a trap instruction that raises SIGTRAP, or do a compare that ++// branches to exception_entry. ++// No support for compressed oops (base page of heap). Does not distinguish ++// loads and stores. ++inline void MacroAssembler::null_check_throw(Register a, int offset, Register temp_reg, ++ address exception_entry) { ++ if (!ImplicitNullChecks || needs_explicit_null_check(offset) || !os::zero_page_read_protected()) { ++ if (TrapBasedNullChecks) { ++ assert(UseSIGTRAP, "sanity"); ++ trap_null_check(a); ++ } else { ++ Label ok; ++ cmpdi(CCR0, a, 0); ++ bne(CCR0, ok); ++ load_const_optimized(temp_reg, exception_entry); ++ mtctr(temp_reg); ++ bctr(); ++ bind(ok); ++ } ++ } ++} ++ ++inline void MacroAssembler::load_with_trap_null_check(Register d, int si16, Register s1) { ++ if (!os::zero_page_read_protected()) { ++ if (TrapBasedNullChecks) { ++ trap_null_check(s1); ++ } ++ } ++ ld(d, si16, s1); ++} ++ ++inline void MacroAssembler::load_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1) { ++ if (UseCompressedOops) { ++ lwz(d, offs, s1); ++ // Attention: no null check here! ++ decode_heap_oop_not_null(d); ++ } else { ++ ld(d, offs, s1); ++ } ++} ++ ++inline void MacroAssembler::store_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1, Register tmp) { ++ if (UseCompressedOops) { ++ Register compressedOop = encode_heap_oop_not_null((tmp != noreg) ? tmp : d, d); ++ stw(compressedOop, offs, s1); ++ } else { ++ std(d, offs, s1); ++ } ++} ++ ++inline void MacroAssembler::load_heap_oop(Register d, RegisterOrConstant offs, Register s1) { ++ if (UseCompressedOops) { ++ lwz(d, offs, s1); ++ decode_heap_oop(d); ++ } else { ++ ld(d, offs, s1); ++ } ++} ++ ++inline Register MacroAssembler::encode_heap_oop_not_null(Register d, Register src) { ++ Register current = (src!=noreg) ? src : d; // Compressed oop is in d if no src provided. ++ if (Universe::narrow_oop_base() != NULL) { ++ sub(d, current, R30); ++ current = d; ++ } ++ if (Universe::narrow_oop_shift() != 0) { ++ srdi(d, current, LogMinObjAlignmentInBytes); ++ current = d; ++ } ++ return current; // Encoded oop is in this register. ++} ++ ++inline void MacroAssembler::decode_heap_oop_not_null(Register d) { ++ if (Universe::narrow_oop_shift() != 0) { ++ assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong"); ++ sldi(d, d, LogMinObjAlignmentInBytes); ++ } ++ if (Universe::narrow_oop_base() != NULL) { ++ add(d, d, R30); ++ } ++} ++ ++inline void MacroAssembler::decode_heap_oop(Register d) { ++ Label isNull; ++ if (Universe::narrow_oop_base() != NULL) { ++ cmpwi(CCR0, d, 0); ++ beq(CCR0, isNull); ++ } ++ if (Universe::narrow_oop_shift() != 0) { ++ assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong"); ++ sldi(d, d, LogMinObjAlignmentInBytes); ++ } ++ if (Universe::narrow_oop_base() != NULL) { ++ add(d, d, R30); ++ } ++ bind(isNull); ++} ++ ++// SIGTRAP-based range checks for arrays. ++inline void MacroAssembler::trap_range_check_l(Register a, Register b) { ++ tw (traptoLessThanUnsigned, a/*reg a*/, b/*reg b*/); ++} ++inline void MacroAssembler::trap_range_check_l(Register a, int si16) { ++ twi(traptoLessThanUnsigned, a/*reg a*/, si16); ++} ++inline void MacroAssembler::trap_range_check_le(Register a, int si16) { ++ twi(traptoEqual | traptoLessThanUnsigned, a/*reg a*/, si16); ++} ++inline void MacroAssembler::trap_range_check_g(Register a, int si16) { ++ twi(traptoGreaterThanUnsigned, a/*reg a*/, si16); ++} ++inline void MacroAssembler::trap_range_check_ge(Register a, Register b) { ++ tw (traptoEqual | traptoGreaterThanUnsigned, a/*reg a*/, b/*reg b*/); ++} ++inline void MacroAssembler::trap_range_check_ge(Register a, int si16) { ++ twi(traptoEqual | traptoGreaterThanUnsigned, a/*reg a*/, si16); ++} ++ ++#if defined(ABI_ELFv2) ++inline address MacroAssembler::function_entry() { return pc(); } ++#else ++inline address MacroAssembler::function_entry() { return emit_fd(); } ++#endif ++ ++#endif // CPU_PPC_VM_MACROASSEMBLER_PPC_INLINE_HPP +--- ./hotspot/src/cpu/ppc/vm/metaspaceShared_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/metaspaceShared_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,61 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "asm/macroAssembler.inline.hpp" ++#include "asm/codeBuffer.hpp" ++#include "memory/metaspaceShared.hpp" ++ ++// Generate the self-patching vtable method: ++// ++// This method will be called (as any other Klass virtual method) with ++// the Klass itself as the first argument. Example: ++// ++// oop obj; ++// int size = obj->klass()->klass_part()->oop_size(this); ++// ++// for which the virtual method call is Klass::oop_size(); ++// ++// The dummy method is called with the Klass object as the first ++// operand, and an object as the second argument. ++// ++ ++//===================================================================== ++ ++// All of the dummy methods in the vtable are essentially identical, ++// differing only by an ordinal constant, and they bear no releationship ++// to the original method which the caller intended. Also, there needs ++// to be 'vtbl_list_size' instances of the vtable in order to ++// differentiate between the 'vtable_list_size' original Klass objects. ++ ++void MetaspaceShared::generate_vtable_methods(void** vtbl_list, ++ void** vtable, ++ char** md_top, ++ char* md_end, ++ char** mc_top, ++ char* mc_end) { ++ Unimplemented(); ++} ++ +--- ./hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,558 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/macroAssembler.inline.hpp" ++#include "interpreter/interpreter.hpp" ++#include "memory/allocation.inline.hpp" ++#include "prims/methodHandles.hpp" ++ ++#define __ _masm-> ++ ++#ifdef CC_INTERP ++#define EXCEPTION_ENTRY StubRoutines::throw_NullPointerException_at_call_entry() ++#else ++#define EXCEPTION_ENTRY Interpreter::throw_NullPointerException_entry() ++#endif ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) // nothing ++#else ++#define BLOCK_COMMENT(str) __ block_comment(str) ++#endif ++ ++#define BIND(label) bind(label); BLOCK_COMMENT(#label ":") ++ ++// Workaround for C++ overloading nastiness on '0' for RegisterOrConstant. ++inline static RegisterOrConstant constant(int value) { ++ return RegisterOrConstant(value); ++} ++ ++void MethodHandles::load_klass_from_Class(MacroAssembler* _masm, Register klass_reg, Register temp_reg, Register temp2_reg) { ++ if (VerifyMethodHandles) ++ verify_klass(_masm, klass_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_Class), temp_reg, temp2_reg, ++ "MH argument is a Class"); ++ __ ld(klass_reg, java_lang_Class::klass_offset_in_bytes(), klass_reg); ++} ++ ++#ifdef ASSERT ++static int check_nonzero(const char* xname, int x) { ++ assert(x != 0, err_msg("%s should be nonzero", xname)); ++ return x; ++} ++#define NONZERO(x) check_nonzero(#x, x) ++#else //ASSERT ++#define NONZERO(x) (x) ++#endif //ASSERT ++ ++#ifdef ASSERT ++void MethodHandles::verify_klass(MacroAssembler* _masm, ++ Register obj_reg, SystemDictionary::WKID klass_id, ++ Register temp_reg, Register temp2_reg, ++ const char* error_message) { ++ Klass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id); ++ KlassHandle klass = SystemDictionary::well_known_klass(klass_id); ++ Label L_ok, L_bad; ++ BLOCK_COMMENT("verify_klass {"); ++ __ verify_oop(obj_reg); ++ __ cmpdi(CCR0, obj_reg, 0); ++ __ beq(CCR0, L_bad); ++ __ load_klass(temp_reg, obj_reg); ++ __ load_const_optimized(temp2_reg, (address) klass_addr); ++ __ ld(temp2_reg, 0, temp2_reg); ++ __ cmpd(CCR0, temp_reg, temp2_reg); ++ __ beq(CCR0, L_ok); ++ __ ld(temp_reg, klass->super_check_offset(), temp_reg); ++ __ cmpd(CCR0, temp_reg, temp2_reg); ++ __ beq(CCR0, L_ok); ++ __ BIND(L_bad); ++ __ stop(error_message); ++ __ BIND(L_ok); ++ BLOCK_COMMENT("} verify_klass"); ++} ++ ++void MethodHandles::verify_ref_kind(MacroAssembler* _masm, int ref_kind, Register member_reg, Register temp) { ++ Label L; ++ BLOCK_COMMENT("verify_ref_kind {"); ++ __ load_sized_value(temp, NONZERO(java_lang_invoke_MemberName::flags_offset_in_bytes()), member_reg, ++ sizeof(u4), /*is_signed*/ false); ++ // assert(sizeof(u4) == sizeof(java.lang.invoke.MemberName.flags), ""); ++ __ srwi( temp, temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT); ++ __ andi(temp, temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK); ++ __ cmpwi(CCR1, temp, ref_kind); ++ __ beq(CCR1, L); ++ { char* buf = NEW_C_HEAP_ARRAY(char, 100, mtInternal); ++ jio_snprintf(buf, 100, "verify_ref_kind expected %x", ref_kind); ++ if (ref_kind == JVM_REF_invokeVirtual || ++ ref_kind == JVM_REF_invokeSpecial) ++ // could do this for all ref_kinds, but would explode assembly code size ++ trace_method_handle(_masm, buf); ++ __ stop(buf); ++ } ++ BLOCK_COMMENT("} verify_ref_kind"); ++ __ BIND(L); ++} ++ ++#endif // ASSERT ++ ++void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register target, Register temp, ++ bool for_compiler_entry) { ++ Label L_no_such_method; ++ assert(method == R19_method, "interpreter calling convention"); ++ assert_different_registers(method, target, temp); ++ ++ if (!for_compiler_entry && JvmtiExport::can_post_interpreter_events()) { ++ Label run_compiled_code; ++ // JVMTI events, such as single-stepping, are implemented partly by avoiding running ++ // compiled code in threads for which the event is enabled. Check here for ++ // interp_only_mode if these events CAN be enabled. ++ __ verify_thread(); ++ __ lwz(temp, in_bytes(JavaThread::interp_only_mode_offset()), R16_thread); ++ __ cmplwi(CCR0, temp, 0); ++ __ beq(CCR0, run_compiled_code); ++ // Null method test is replicated below in compiled case, ++ // it might be able to address across the verify_thread() ++ __ cmplwi(CCR0, R19_method, 0); ++ __ beq(CCR0, L_no_such_method); ++ __ ld(target, in_bytes(Method::interpreter_entry_offset()), R19_method); ++ __ mtctr(target); ++ __ bctr(); ++ __ BIND(run_compiled_code); ++ } ++ ++ // Compiled case, either static or fall-through from runtime conditional ++ __ cmplwi(CCR0, R19_method, 0); ++ __ beq(CCR0, L_no_such_method); ++ ++ const ByteSize entry_offset = for_compiler_entry ? Method::from_compiled_offset() : ++ Method::from_interpreted_offset(); ++ __ ld(target, in_bytes(entry_offset), R19_method); ++ __ mtctr(target); ++ __ bctr(); ++ ++ __ bind(L_no_such_method); ++ assert(StubRoutines::throw_AbstractMethodError_entry() != NULL, "not yet generated!"); ++ __ load_const_optimized(target, StubRoutines::throw_AbstractMethodError_entry()); ++ __ mtctr(target); ++ __ bctr(); ++} ++ ++ ++void MethodHandles::jump_to_lambda_form(MacroAssembler* _masm, ++ Register recv, Register method_temp, ++ Register temp2, Register temp3, ++ bool for_compiler_entry) { ++ BLOCK_COMMENT("jump_to_lambda_form {"); ++ // This is the initial entry point of a lazy method handle. ++ // After type checking, it picks up the invoker from the LambdaForm. ++ assert_different_registers(recv, method_temp, temp2); // temp3 is only passed on ++ assert(method_temp == R19_method, "required register for loading method"); ++ ++ // Load the invoker, as MH -> MH.form -> LF.vmentry ++ __ verify_oop(recv); ++ __ load_heap_oop_not_null(method_temp, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes()), recv); ++ __ verify_oop(method_temp); ++ __ load_heap_oop_not_null(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes()), method_temp); ++ __ verify_oop(method_temp); ++ // the following assumes that a Method* is normally compressed in the vmtarget field: ++ __ ld(method_temp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes()), method_temp); ++ ++ if (VerifyMethodHandles && !for_compiler_entry) { ++ // make sure recv is already on stack ++ __ ld(temp2, in_bytes(Method::const_offset()), method_temp); ++ __ load_sized_value(temp2, in_bytes(ConstMethod::size_of_parameters_offset()), temp2, ++ sizeof(u2), /*is_signed*/ false); ++ // assert(sizeof(u2) == sizeof(ConstMethod::_size_of_parameters), ""); ++ Label L; ++ __ ld(temp2, __ argument_offset(temp2, temp2, 0), CC_INTERP_ONLY(R17_tos) NOT_CC_INTERP(R15_esp)); ++ __ cmpd(CCR1, temp2, recv); ++ __ beq(CCR1, L); ++ __ stop("receiver not on stack"); ++ __ BIND(L); ++ } ++ ++ jump_from_method_handle(_masm, method_temp, temp2, temp3, for_compiler_entry); ++ BLOCK_COMMENT("} jump_to_lambda_form"); ++} ++ ++ ++ ++// Code generation ++address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm, ++ vmIntrinsics::ID iid) { ++ const bool not_for_compiler_entry = false; // this is the interpreter entry ++ assert(is_signature_polymorphic(iid), "expected invoke iid"); ++ if (iid == vmIntrinsics::_invokeGeneric || ++ iid == vmIntrinsics::_compiledLambdaForm) { ++ // Perhaps surprisingly, the symbolic references visible to Java are not directly used. ++ // They are linked to Java-generated adapters via MethodHandleNatives.linkMethod. ++ // They all allow an appendix argument. ++ __ stop("Should not reach here"); // empty stubs make SG sick ++ return NULL; ++ } ++ ++ Register argbase = CC_INTERP_ONLY(R17_tos) NOT_CC_INTERP(R15_esp); // parameter (preserved) ++ Register argslot = R3; ++ Register temp1 = R6; ++ Register param_size = R7; ++ ++ // here's where control starts out: ++ __ align(CodeEntryAlignment); ++ address entry_point = __ pc(); ++ ++ if (VerifyMethodHandles) { ++ Label L; ++ BLOCK_COMMENT("verify_intrinsic_id {"); ++ __ load_sized_value(temp1, Method::intrinsic_id_offset_in_bytes(), R19_method, ++ sizeof(u1), /*is_signed*/ false); ++ // assert(sizeof(u1) == sizeof(Method::_intrinsic_id), ""); ++ __ cmpwi(CCR1, temp1, (int) iid); ++ __ beq(CCR1, L); ++ if (iid == vmIntrinsics::_linkToVirtual || ++ iid == vmIntrinsics::_linkToSpecial) { ++ // could do this for all kinds, but would explode assembly code size ++ trace_method_handle(_masm, "bad Method*:intrinsic_id"); ++ } ++ __ stop("bad Method*::intrinsic_id"); ++ __ BIND(L); ++ BLOCK_COMMENT("} verify_intrinsic_id"); ++ } ++ ++ // First task: Find out how big the argument list is. ++ int ref_kind = signature_polymorphic_intrinsic_ref_kind(iid); ++ assert(ref_kind != 0 || iid == vmIntrinsics::_invokeBasic, "must be _invokeBasic or a linkTo intrinsic"); ++ if (ref_kind == 0 || MethodHandles::ref_kind_has_receiver(ref_kind)) { ++ __ ld(param_size, in_bytes(Method::const_offset()), R19_method); ++ __ load_sized_value(param_size, in_bytes(ConstMethod::size_of_parameters_offset()), param_size, ++ sizeof(u2), /*is_signed*/ false); ++ // assert(sizeof(u2) == sizeof(ConstMethod::_size_of_parameters), ""); ++ } else { ++ DEBUG_ONLY(param_size = noreg); ++ } ++ ++ Register tmp_mh = noreg; ++ if (!is_signature_polymorphic_static(iid)) { ++ __ ld(tmp_mh = temp1, __ argument_offset(param_size, param_size, 0), argbase); ++ DEBUG_ONLY(param_size = noreg); ++ } ++ ++ if (TraceMethodHandles) { ++ if (tmp_mh != noreg) ++ __ mr(R23_method_handle, tmp_mh); // make stub happy ++ trace_method_handle_interpreter_entry(_masm, iid); ++ } ++ ++ if (iid == vmIntrinsics::_invokeBasic) { ++ generate_method_handle_dispatch(_masm, iid, tmp_mh, noreg, not_for_compiler_entry); ++ ++ } else { ++ // Adjust argument list by popping the trailing MemberName argument. ++ Register tmp_recv = noreg; ++ if (MethodHandles::ref_kind_has_receiver(ref_kind)) { ++ // Load the receiver (not the MH; the actual MemberName's receiver) up from the interpreter stack. ++ __ ld(tmp_recv = temp1, __ argument_offset(param_size, param_size, 0), argbase); ++ DEBUG_ONLY(param_size = noreg); ++ } ++ Register R19_member = R19_method; // MemberName ptr; incoming method ptr is dead now ++ __ ld(R19_member, RegisterOrConstant((intptr_t)8), argbase); ++ __ add(argbase, Interpreter::stackElementSize, argbase); ++ generate_method_handle_dispatch(_masm, iid, tmp_recv, R19_member, not_for_compiler_entry); ++ } ++ ++ return entry_point; ++} ++ ++void MethodHandles::generate_method_handle_dispatch(MacroAssembler* _masm, ++ vmIntrinsics::ID iid, ++ Register receiver_reg, ++ Register member_reg, ++ bool for_compiler_entry) { ++ assert(is_signature_polymorphic(iid), "expected invoke iid"); ++ Register temp1 = (for_compiler_entry ? R25_tmp5 : R7); ++ Register temp2 = (for_compiler_entry ? R22_tmp2 : R8); ++ Register temp3 = (for_compiler_entry ? R23_tmp3 : R9); ++ Register temp4 = (for_compiler_entry ? R24_tmp4 : R10); ++ if (receiver_reg != noreg) assert_different_registers(temp1, temp2, temp3, temp4, receiver_reg); ++ if (member_reg != noreg) assert_different_registers(temp1, temp2, temp3, temp4, member_reg); ++ ++ if (iid == vmIntrinsics::_invokeBasic) { ++ // indirect through MH.form.vmentry.vmtarget ++ jump_to_lambda_form(_masm, receiver_reg, R19_method, temp1, temp2, for_compiler_entry); ++ } else { ++ // The method is a member invoker used by direct method handles. ++ if (VerifyMethodHandles) { ++ // make sure the trailing argument really is a MemberName (caller responsibility) ++ verify_klass(_masm, member_reg, SystemDictionary::WK_KLASS_ENUM_NAME(MemberName_klass), ++ temp1, temp2, ++ "MemberName required for invokeVirtual etc."); ++ } ++ ++ Register temp1_recv_klass = temp1; ++ if (iid != vmIntrinsics::_linkToStatic) { ++ __ verify_oop(receiver_reg); ++ if (iid == vmIntrinsics::_linkToSpecial) { ++ // Don't actually load the klass; just null-check the receiver. ++ __ null_check_throw(receiver_reg, -1, temp1, EXCEPTION_ENTRY); ++ } else { ++ // load receiver klass itself ++ __ null_check_throw(receiver_reg, oopDesc::klass_offset_in_bytes(), temp1, EXCEPTION_ENTRY); ++ __ load_klass(temp1_recv_klass, receiver_reg); ++ __ verify_klass_ptr(temp1_recv_klass); ++ } ++ BLOCK_COMMENT("check_receiver {"); ++ // The receiver for the MemberName must be in receiver_reg. ++ // Check the receiver against the MemberName.clazz ++ if (VerifyMethodHandles && iid == vmIntrinsics::_linkToSpecial) { ++ // Did not load it above... ++ __ load_klass(temp1_recv_klass, receiver_reg); ++ __ verify_klass_ptr(temp1_recv_klass); ++ } ++ if (VerifyMethodHandles && iid != vmIntrinsics::_linkToInterface) { ++ Label L_ok; ++ Register temp2_defc = temp2; ++ __ load_heap_oop_not_null(temp2_defc, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg); ++ load_klass_from_Class(_masm, temp2_defc, temp3, temp4); ++ __ verify_klass_ptr(temp2_defc); ++ __ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, temp4, L_ok); ++ // If we get here, the type check failed! ++ __ stop("receiver class disagrees with MemberName.clazz"); ++ __ BIND(L_ok); ++ } ++ BLOCK_COMMENT("} check_receiver"); ++ } ++ if (iid == vmIntrinsics::_linkToSpecial || ++ iid == vmIntrinsics::_linkToStatic) { ++ DEBUG_ONLY(temp1_recv_klass = noreg); // these guys didn't load the recv_klass ++ } ++ ++ // Live registers at this point: ++ // member_reg - MemberName that was the trailing argument ++ // temp1_recv_klass - klass of stacked receiver, if needed ++ // O5_savedSP - interpreter linkage (if interpreted) ++ // O0..O5 - compiler arguments (if compiled) ++ ++ Label L_incompatible_class_change_error; ++ switch (iid) { ++ case vmIntrinsics::_linkToSpecial: ++ if (VerifyMethodHandles) { ++ verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp2); ++ } ++ __ ld(R19_method, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes()), member_reg); ++ break; ++ ++ case vmIntrinsics::_linkToStatic: ++ if (VerifyMethodHandles) { ++ verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp2); ++ } ++ __ ld(R19_method, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes()), member_reg); ++ break; ++ ++ case vmIntrinsics::_linkToVirtual: ++ { ++ // same as TemplateTable::invokevirtual, ++ // minus the CP setup and profiling: ++ ++ if (VerifyMethodHandles) { ++ verify_ref_kind(_masm, JVM_REF_invokeVirtual, member_reg, temp2); ++ } ++ ++ // pick out the vtable index from the MemberName, and then we can discard it: ++ Register temp2_index = temp2; ++ __ ld(temp2_index, NONZERO(java_lang_invoke_MemberName::vmindex_offset_in_bytes()), member_reg); ++ ++ if (VerifyMethodHandles) { ++ Label L_index_ok; ++ __ cmpdi(CCR1, temp2_index, 0); ++ __ bge(CCR1, L_index_ok); ++ __ stop("no virtual index"); ++ __ BIND(L_index_ok); ++ } ++ ++ // Note: The verifier invariants allow us to ignore MemberName.clazz and vmtarget ++ // at this point. And VerifyMethodHandles has already checked clazz, if needed. ++ ++ // get target Method* & entry point ++ __ lookup_virtual_method(temp1_recv_klass, temp2_index, R19_method); ++ break; ++ } ++ ++ case vmIntrinsics::_linkToInterface: ++ { ++ // same as TemplateTable::invokeinterface ++ // (minus the CP setup and profiling, with different argument motion) ++ if (VerifyMethodHandles) { ++ verify_ref_kind(_masm, JVM_REF_invokeInterface, member_reg, temp2); ++ } ++ ++ Register temp2_intf = temp2; ++ __ load_heap_oop_not_null(temp2_intf, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg); ++ load_klass_from_Class(_masm, temp2_intf, temp3, temp4); ++ __ verify_klass_ptr(temp2_intf); ++ ++ Register vtable_index = R19_method; ++ __ ld(vtable_index, NONZERO(java_lang_invoke_MemberName::vmindex_offset_in_bytes()), member_reg); ++ if (VerifyMethodHandles) { ++ Label L_index_ok; ++ __ cmpdi(CCR1, vtable_index, 0); ++ __ bge(CCR1, L_index_ok); ++ __ stop("invalid vtable index for MH.invokeInterface"); ++ __ BIND(L_index_ok); ++ } ++ ++ // given intf, index, and recv klass, dispatch to the implementation method ++ __ lookup_interface_method(temp1_recv_klass, temp2_intf, ++ // note: next two args must be the same: ++ vtable_index, R19_method, ++ temp3, temp4, ++ L_incompatible_class_change_error); ++ break; ++ } ++ ++ default: ++ fatal(err_msg_res("unexpected intrinsic %d: %s", iid, vmIntrinsics::name_at(iid))); ++ break; ++ } ++ ++ // Live at this point: ++ // R19_method ++ // O5_savedSP (if interpreted) ++ ++ // After figuring out which concrete method to call, jump into it. ++ // Note that this works in the interpreter with no data motion. ++ // But the compiled version will require that rcx_recv be shifted out. ++ __ verify_method_ptr(R19_method); ++ jump_from_method_handle(_masm, R19_method, temp1, temp2, for_compiler_entry); ++ ++ if (iid == vmIntrinsics::_linkToInterface) { ++ __ BIND(L_incompatible_class_change_error); ++ __ load_const_optimized(temp1, StubRoutines::throw_IncompatibleClassChangeError_entry()); ++ __ mtctr(temp1); ++ __ bctr(); ++ } ++ } ++} ++ ++#ifndef PRODUCT ++void trace_method_handle_stub(const char* adaptername, ++ oopDesc* mh, ++ intptr_t* entry_sp, ++ intptr_t* saved_regs) { ++ ++ bool has_mh = (strstr(adaptername, "/static") == NULL && ++ strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH ++ const char* mh_reg_name = has_mh ? "R23_method_handle" : "G23"; ++ tty->print_cr("MH %s %s="INTPTR_FORMAT " sp=" INTPTR_FORMAT, ++ adaptername, mh_reg_name, (intptr_t) mh, entry_sp); ++ ++ if (Verbose) { ++ tty->print_cr("Registers:"); ++ const int abi_offset = frame::abi_reg_args_size / 8; ++ for (int i = R3->encoding(); i <= R12->encoding(); i++) { ++ Register r = as_Register(i); ++ int count = i - R3->encoding(); ++ // The registers are stored in reverse order on the stack (by save_volatile_gprs(R1_SP, abi_reg_args_size)). ++ tty->print("%3s=" PTR_FORMAT, r->name(), saved_regs[abi_offset + count]); ++ if ((count + 1) % 4 == 0) { ++ tty->cr(); ++ } else { ++ tty->print(", "); ++ } ++ } ++ tty->cr(); ++ ++ { ++ // dumping last frame with frame::describe ++ ++ JavaThread* p = JavaThread::active(); ++ ++ ResourceMark rm; ++ PRESERVE_EXCEPTION_MARK; // may not be needed by safer and unexpensive here ++ FrameValues values; ++ ++ // Note: We want to allow trace_method_handle from any call site. ++ // While trace_method_handle creates a frame, it may be entered ++ // without a PC on the stack top (e.g. not just after a call). ++ // Walking that frame could lead to failures due to that invalid PC. ++ // => carefully detect that frame when doing the stack walking ++ ++ // Current C frame ++ frame cur_frame = os::current_frame(); ++ ++ // Robust search of trace_calling_frame (independant of inlining). ++ // Assumes saved_regs comes from a pusha in the trace_calling_frame. ++ assert(cur_frame.sp() < saved_regs, "registers not saved on stack ?"); ++ frame trace_calling_frame = os::get_sender_for_C_frame(&cur_frame); ++ while (trace_calling_frame.fp() < saved_regs) { ++ trace_calling_frame = os::get_sender_for_C_frame(&trace_calling_frame); ++ } ++ ++ // Safely create a frame and call frame::describe. ++ intptr_t *dump_sp = trace_calling_frame.sender_sp(); ++ ++ frame dump_frame = frame(dump_sp); ++ dump_frame.describe(values, 1); ++ ++ values.describe(-1, saved_regs, "raw top of stack"); ++ ++ tty->print_cr("Stack layout:"); ++ values.print(p); ++ } ++ ++ if (has_mh && mh->is_oop()) { ++ mh->print(); ++ if (java_lang_invoke_MethodHandle::is_instance(mh)) { ++ if (java_lang_invoke_MethodHandle::form_offset_in_bytes() != 0) ++ java_lang_invoke_MethodHandle::form(mh)->print(); ++ } ++ } ++ } ++} ++ ++void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) { ++ if (!TraceMethodHandles) return; ++ ++ BLOCK_COMMENT("trace_method_handle {"); ++ ++ int nbytes_save = 10 * 8; // 10 volatile gprs ++ __ save_LR_CR(R0); ++ __ mr(R0, R1_SP); // saved_sp ++ assert(Assembler::is_simm(-nbytes_save, 16), "Overwriting R0"); ++ // Push_frame_reg_args only uses R0 if nbytes_save is wider than 16 bit. ++ __ push_frame_reg_args(nbytes_save, R0); ++ __ save_volatile_gprs(R1_SP, frame::abi_reg_args_size); // Except R0. ++ ++ __ load_const(R3_ARG1, (address)adaptername); ++ __ mr(R4_ARG2, R23_method_handle); ++ __ mr(R5_ARG3, R0); // saved_sp ++ __ mr(R6_ARG4, R1_SP); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub)); ++ ++ __ restore_volatile_gprs(R1_SP, 112); // Except R0. ++ __ pop_frame(); ++ __ restore_LR_CR(R0); ++ ++ BLOCK_COMMENT("} trace_method_handle"); ++} ++#endif // PRODUCT +--- ./hotspot/src/cpu/ppc/vm/methodHandles_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/methodHandles_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,62 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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. ++ * ++ */ ++ ++// Platform-specific definitions for method handles. ++// These definitions are inlined into class MethodHandles. ++ ++// Adapters ++//static unsigned int adapter_code_size() { ++// return 32*K DEBUG_ONLY(+ 16*K) + (TraceMethodHandles ? 16*K : 0) + (VerifyMethodHandles ? 32*K : 0); ++//} ++enum /* platform_dependent_constants */ { ++ adapter_code_size = NOT_LP64(16000 DEBUG_ONLY(+ 25000)) LP64_ONLY(32000 DEBUG_ONLY(+ 150000)) ++}; ++ ++// Additional helper methods for MethodHandles code generation: ++public: ++ static void load_klass_from_Class(MacroAssembler* _masm, Register klass_reg, Register temp_reg, Register temp2_reg); ++ ++ static void verify_klass(MacroAssembler* _masm, ++ Register obj_reg, SystemDictionary::WKID klass_id, ++ Register temp_reg, Register temp2_reg, ++ const char* error_message = "wrong klass") NOT_DEBUG_RETURN; ++ ++ static void verify_method_handle(MacroAssembler* _masm, Register mh_reg, ++ Register temp_reg, Register temp2_reg) { ++ Unimplemented(); ++ } ++ ++ static void verify_ref_kind(MacroAssembler* _masm, int ref_kind, Register member_reg, Register temp) NOT_DEBUG_RETURN; ++ ++ // Similar to InterpreterMacroAssembler::jump_from_interpreted. ++ // Takes care of special dispatch from single stepping too. ++ static void jump_from_method_handle(MacroAssembler* _masm, Register method, ++ Register temp, Register temp2, ++ bool for_compiler_entry); ++ ++ static void jump_to_lambda_form(MacroAssembler* _masm, ++ Register recv, Register method_temp, ++ Register temp2, Register temp3, ++ bool for_compiler_entry); +--- ./hotspot/src/cpu/ppc/vm/nativeInst_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/nativeInst_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,391 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "asm/macroAssembler.inline.hpp" ++#include "memory/resourceArea.hpp" ++#include "nativeInst_ppc.hpp" ++#include "oops/oop.inline.hpp" ++#include "runtime/handles.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "utilities/ostream.hpp" ++#ifdef COMPILER1 ++#include "c1/c1_Runtime1.hpp" ++#endif ++ ++// We use an illtrap for marking a method as not_entrant or zombie iff !UseSIGTRAP ++// Work around a C++ compiler bug which changes 'this' ++bool NativeInstruction::is_sigill_zombie_not_entrant_at(address addr) { ++ assert(!UseSIGTRAP, "precondition"); ++ if (*(int*)addr != 0 /*illtrap*/) return false; ++ CodeBlob* cb = CodeCache::find_blob_unsafe(addr); ++ if (cb == NULL || !cb->is_nmethod()) return false; ++ nmethod *nm = (nmethod *)cb; ++ // This method is not_entrant or zombie iff the illtrap instruction is ++ // located at the verified entry point. ++ return nm->verified_entry_point() == addr; ++} ++ ++#ifdef ASSERT ++void NativeInstruction::verify() { ++ // Make sure code pattern is actually an instruction address. ++ address addr = addr_at(0); ++ if (addr == 0 || ((intptr_t)addr & 3) != 0) { ++ fatal("not an instruction address"); ++ } ++} ++#endif // ASSERT ++ ++// Extract call destination from a NativeCall. The call might use a trampoline stub. ++address NativeCall::destination() const { ++ address addr = (address)this; ++ address destination = Assembler::bxx_destination(addr); ++ ++ // Do we use a trampoline stub for this call? ++ CodeBlob* cb = CodeCache::find_blob_unsafe(addr); // Else we get assertion if nmethod is zombie. ++ assert(cb && cb->is_nmethod(), "sanity"); ++ nmethod *nm = (nmethod *)cb; ++ if (nm->stub_contains(destination) && is_NativeCallTrampolineStub_at(destination)) { ++ // Yes we do, so get the destination from the trampoline stub. ++ const address trampoline_stub_addr = destination; ++ destination = NativeCallTrampolineStub_at(trampoline_stub_addr)->destination(nm); ++ } ++ ++ return destination; ++} ++ ++// Similar to replace_mt_safe, but just changes the destination. The ++// important thing is that free-running threads are able to execute this ++// call instruction at all times. Thus, the displacement field must be ++// instruction-word-aligned. ++// ++// Used in the runtime linkage of calls; see class CompiledIC. ++// ++// Add parameter assert_lock to switch off assertion ++// during code generation, where no patching lock is needed. ++void NativeCall::set_destination_mt_safe(address dest, bool assert_lock) { ++ assert(!assert_lock || ++ (Patching_lock->is_locked() || SafepointSynchronize::is_at_safepoint()), ++ "concurrent code patching"); ++ ++ ResourceMark rm; ++ int code_size = 1 * BytesPerInstWord; ++ address addr_call = addr_at(0); ++ assert(MacroAssembler::is_bl(*(int*)addr_call), "unexpected code at call-site"); ++ ++ CodeBuffer cb(addr_call, code_size + 1); ++ MacroAssembler* a = new MacroAssembler(&cb); ++ ++ // Patch the call. ++ if (ReoptimizeCallSequences && ++ a->is_within_range_of_b(dest, addr_call)) { ++ a->bl(dest); ++ } else { ++ address trampoline_stub_addr = get_trampoline(); ++ ++ // We did not find a trampoline stub because the current codeblob ++ // does not provide this information. The branch will be patched ++ // later during a final fixup, when all necessary information is ++ // available. ++ if (trampoline_stub_addr == 0) ++ return; ++ ++ // Patch the constant in the call's trampoline stub. ++ NativeCallTrampolineStub_at(trampoline_stub_addr)->set_destination(dest); ++ ++ a->bl(trampoline_stub_addr); ++ } ++ ICache::ppc64_flush_icache_bytes(addr_call, code_size); ++} ++ ++address NativeCall::get_trampoline() { ++ address call_addr = addr_at(0); ++ ++ CodeBlob *code = CodeCache::find_blob(call_addr); ++ assert(code != NULL, "Could not find the containing code blob"); ++ ++ // There are no relocations available when the code gets relocated ++ // because of CodeBuffer expansion. ++ if (code->relocation_size() == 0) ++ return NULL; ++ ++ address bl_destination = Assembler::bxx_destination(call_addr); ++ if (code->content_contains(bl_destination) && ++ is_NativeCallTrampolineStub_at(bl_destination)) ++ return bl_destination; ++ ++ // If the codeBlob is not a nmethod, this is because we get here from the ++ // CodeBlob constructor, which is called within the nmethod constructor. ++ return trampoline_stub_Relocation::get_trampoline_for(call_addr, (nmethod*)code); ++} ++ ++#ifdef ASSERT ++void NativeCall::verify() { ++ address addr = addr_at(0); ++ ++ if (!NativeCall::is_call_at(addr)) { ++ tty->print_cr("not a NativeCall at " PTR_FORMAT, addr); ++ // TODO: PPC port: Disassembler::decode(addr - 20, addr + 20, tty); ++ fatal(err_msg("not a NativeCall at " PTR_FORMAT, addr)); ++ } ++} ++#endif // ASSERT ++ ++#ifdef ASSERT ++void NativeFarCall::verify() { ++ address addr = addr_at(0); ++ ++ NativeInstruction::verify(); ++ if (!NativeFarCall::is_far_call_at(addr)) { ++ tty->print_cr("not a NativeFarCall at " PTR_FORMAT, addr); ++ // TODO: PPC port: Disassembler::decode(addr, 20, 20, tty); ++ fatal(err_msg("not a NativeFarCall at " PTR_FORMAT, addr)); ++ } ++} ++#endif // ASSERT ++ ++address NativeMovConstReg::next_instruction_address() const { ++#ifdef ASSERT ++ CodeBlob* nm = CodeCache::find_blob(instruction_address()); ++ assert(!MacroAssembler::is_set_narrow_oop(addr_at(0), nm->content_begin()), "Should not patch narrow oop here"); ++#endif ++ ++ if (MacroAssembler::is_load_const_from_method_toc_at(addr_at(0))) { ++ return addr_at(load_const_from_method_toc_instruction_size); ++ } else { ++ return addr_at(load_const_instruction_size); ++ } ++} ++ ++intptr_t NativeMovConstReg::data() const { ++ address addr = addr_at(0); ++ ++ if (MacroAssembler::is_load_const_at(addr)) { ++ return MacroAssembler::get_const(addr); ++ } ++ ++ CodeBlob* cb = CodeCache::find_blob_unsafe(addr); ++ if (MacroAssembler::is_set_narrow_oop(addr, cb->content_begin())) { ++ narrowOop no = (narrowOop)MacroAssembler::get_narrow_oop(addr, cb->content_begin()); ++ return cast_from_oop(oopDesc::decode_heap_oop(no)); ++ } else { ++ assert(MacroAssembler::is_load_const_from_method_toc_at(addr), "must be load_const_from_pool"); ++ ++ address ctable = cb->content_begin(); ++ int offset = MacroAssembler::get_offset_of_load_const_from_method_toc_at(addr); ++ return *(intptr_t *)(ctable + offset); ++ } ++} ++ ++address NativeMovConstReg::set_data_plain(intptr_t data, CodeBlob *cb) { ++ address addr = instruction_address(); ++ address next_address = NULL; ++ if (!cb) cb = CodeCache::find_blob(addr); ++ ++ if (cb != NULL && MacroAssembler::is_load_const_from_method_toc_at(addr)) { ++ // A load from the method's TOC (ctable). ++ assert(cb->is_nmethod(), "must be nmethod"); ++ const address ctable = cb->content_begin(); ++ const int toc_offset = MacroAssembler::get_offset_of_load_const_from_method_toc_at(addr); ++ *(intptr_t *)(ctable + toc_offset) = data; ++ next_address = addr + BytesPerInstWord; ++ } else if (cb != NULL && ++ MacroAssembler::is_calculate_address_from_global_toc_at(addr, cb->content_begin())) { ++ // A calculation relative to the global TOC. ++ if (MacroAssembler::get_address_of_calculate_address_from_global_toc_at(addr, cb->content_begin()) != ++ (address)data) { ++ const int invalidated_range = ++ MacroAssembler::patch_calculate_address_from_global_toc_at(addr, cb->content_begin(), ++ (address)data); ++ const address start = invalidated_range < 0 ? addr + invalidated_range : addr; ++ // FIXME: ++ const int range = invalidated_range < 0 ? 4 - invalidated_range : 8; ++ ICache::ppc64_flush_icache_bytes(start, range); ++ } ++ next_address = addr + 1 * BytesPerInstWord; ++ } else if (MacroAssembler::is_load_const_at(addr)) { ++ // A normal 5 instruction load_const code sequence. ++ if (MacroAssembler::get_const(addr) != (long)data) { ++ // This is not mt safe, ok in methods like CodeBuffer::copy_code(). ++ MacroAssembler::patch_const(addr, (long)data); ++ ICache::ppc64_flush_icache_bytes(addr, load_const_instruction_size); ++ } ++ next_address = addr + 5 * BytesPerInstWord; ++ } else if (MacroAssembler::is_bl(* (int*) addr)) { ++ // A single branch-and-link instruction. ++ ResourceMark rm; ++ const int code_size = 1 * BytesPerInstWord; ++ CodeBuffer cb(addr, code_size + 1); ++ MacroAssembler* a = new MacroAssembler(&cb); ++ a->bl((address) data); ++ ICache::ppc64_flush_icache_bytes(addr, code_size); ++ next_address = addr + code_size; ++ } else { ++ ShouldNotReachHere(); ++ } ++ ++ return next_address; ++} ++ ++void NativeMovConstReg::set_data(intptr_t data) { ++ // Store the value into the instruction stream. ++ CodeBlob *cb = CodeCache::find_blob(instruction_address()); ++ address next_address = set_data_plain(data, cb); ++ ++ // Also store the value into an oop_Relocation cell, if any. ++ if (cb && cb->is_nmethod()) { ++ RelocIterator iter((nmethod *) cb, instruction_address(), next_address); ++ oop* oop_addr = NULL; ++ Metadata** metadata_addr = NULL; ++ while (iter.next()) { ++ if (iter.type() == relocInfo::oop_type) { ++ oop_Relocation *r = iter.oop_reloc(); ++ if (oop_addr == NULL) { ++ oop_addr = r->oop_addr(); ++ *oop_addr = cast_to_oop(data); ++ } else { ++ assert(oop_addr == r->oop_addr(), "must be only one set-oop here") ; ++ } ++ } ++ if (iter.type() == relocInfo::metadata_type) { ++ metadata_Relocation *r = iter.metadata_reloc(); ++ if (metadata_addr == NULL) { ++ metadata_addr = r->metadata_addr(); ++ *metadata_addr = (Metadata*)data; ++ } else { ++ assert(metadata_addr == r->metadata_addr(), "must be only one set-metadata here"); ++ } ++ } ++ } ++ } ++} ++ ++void NativeMovConstReg::set_narrow_oop(narrowOop data, CodeBlob *code /* = NULL */) { ++ address addr = addr_at(0); ++ CodeBlob* cb = (code) ? code : CodeCache::find_blob(instruction_address()); ++ if (MacroAssembler::get_narrow_oop(addr, cb->content_begin()) == (long)data) return; ++ const int invalidated_range = ++ MacroAssembler::patch_set_narrow_oop(addr, cb->content_begin(), (long)data); ++ const address start = invalidated_range < 0 ? addr + invalidated_range : addr; ++ // FIXME: ++ const int range = invalidated_range < 0 ? 4 - invalidated_range : 8; ++ ICache::ppc64_flush_icache_bytes(start, range); ++} ++ ++// Do not use an assertion here. Let clients decide whether they only ++// want this when assertions are enabled. ++#ifdef ASSERT ++void NativeMovConstReg::verify() { ++ address addr = addr_at(0); ++ if (! MacroAssembler::is_load_const_at(addr) && ++ ! MacroAssembler::is_load_const_from_method_toc_at(addr)) { ++ CodeBlob* cb = CodeCache::find_blob_unsafe(addr); // find_nmethod() asserts if nmethod is zombie. ++ if (! (cb != NULL && MacroAssembler::is_calculate_address_from_global_toc_at(addr, cb->content_begin())) && ++ ! (cb != NULL && MacroAssembler::is_set_narrow_oop(addr, cb->content_begin())) && ++ ! MacroAssembler::is_bl(*((int*) addr))) { ++ tty->print_cr("not a NativeMovConstReg at " PTR_FORMAT, addr); ++ // TODO: PPC port: Disassembler::decode(addr, 20, 20, tty); ++ fatal(err_msg("not a NativeMovConstReg at " PTR_FORMAT, addr)); ++ } ++ } ++} ++#endif // ASSERT ++ ++void NativeJump::patch_verified_entry(address entry, address verified_entry, address dest) { ++ ResourceMark rm; ++ int code_size = 1 * BytesPerInstWord; ++ CodeBuffer cb(verified_entry, code_size + 1); ++ MacroAssembler* a = new MacroAssembler(&cb); ++#ifdef COMPILER2 ++ assert(dest == SharedRuntime::get_handle_wrong_method_stub(), "expected fixed destination of patch"); ++#endif ++ // Patch this nmethod atomically. Always use illtrap/trap in debug build. ++ if (DEBUG_ONLY(false &&) a->is_within_range_of_b(dest, a->pc())) { ++ a->b(dest); ++ } else { ++ // The signal handler will continue at dest=OptoRuntime::handle_wrong_method_stub(). ++ if (TrapBasedNotEntrantChecks) { ++ // We use a special trap for marking a method as not_entrant or zombie. ++ a->trap_zombie_not_entrant(); ++ } else { ++ // We use an illtrap for marking a method as not_entrant or zombie. ++ a->illtrap(); ++ } ++ } ++ ICache::ppc64_flush_icache_bytes(verified_entry, code_size); ++} ++ ++#ifdef ASSERT ++void NativeJump::verify() { ++ address addr = addr_at(0); ++ ++ NativeInstruction::verify(); ++ if (!NativeJump::is_jump_at(addr)) { ++ tty->print_cr("not a NativeJump at " PTR_FORMAT, addr); ++ // TODO: PPC port: Disassembler::decode(addr, 20, 20, tty); ++ fatal(err_msg("not a NativeJump at " PTR_FORMAT, addr)); ++ } ++} ++#endif // ASSERT ++ ++//------------------------------------------------------------------- ++ ++// Call trampoline stubs. ++// ++// Layout and instructions of a call trampoline stub: ++// 0: load the TOC (part 1) ++// 4: load the TOC (part 2) ++// 8: load the call target from the constant pool (part 1) ++// [12: load the call target from the constant pool (part 2, optional)] ++// ..: branch via CTR ++// ++ ++address NativeCallTrampolineStub::encoded_destination_addr() const { ++ address instruction_addr = addr_at(2 * BytesPerInstWord); ++ assert(MacroAssembler::is_ld_largeoffset(instruction_addr), ++ "must be a ld with large offset (from the constant pool)"); ++ ++ return instruction_addr; ++} ++ ++address NativeCallTrampolineStub::destination(nmethod *nm) const { ++ CodeBlob* cb = nm ? nm : CodeCache::find_blob_unsafe(addr_at(0)); ++ address ctable = cb->content_begin(); ++ ++ return *(address*)(ctable + destination_toc_offset()); ++} ++ ++int NativeCallTrampolineStub::destination_toc_offset() const { ++ return MacroAssembler::get_ld_largeoffset_offset(encoded_destination_addr()); ++} ++ ++void NativeCallTrampolineStub::set_destination(address new_destination) { ++ CodeBlob* cb = CodeCache::find_blob(addr_at(0)); ++ address ctable = cb->content_begin(); ++ ++ *(address*)(ctable + destination_toc_offset()) = new_destination; ++} ++ +--- ./hotspot/src/cpu/ppc/vm/nativeInst_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/nativeInst_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,398 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_NATIVEINST_PPC_HPP ++#define CPU_PPC_VM_NATIVEINST_PPC_HPP ++ ++#include "asm/assembler.hpp" ++#include "asm/macroAssembler.hpp" ++#include "memory/allocation.hpp" ++#include "runtime/icache.hpp" ++#include "runtime/os.hpp" ++#include "utilities/top.hpp" ++ ++// We have interfaces for the following instructions: ++// ++// - NativeInstruction ++// - NativeCall ++// - NativeFarCall ++// - NativeMovConstReg ++// - NativeJump ++// - NativeIllegalInstruction ++// - NativeConditionalFarBranch ++// - NativeCallTrampolineStub ++ ++// The base class for different kinds of native instruction abstractions. ++// It provides the primitive operations to manipulate code relative to this. ++class NativeInstruction VALUE_OBJ_CLASS_SPEC { ++ friend class Relocation; ++ ++ public: ++ bool is_sigtrap_ic_miss_check() { ++ assert(UseSIGTRAP, "precondition"); ++ return MacroAssembler::is_trap_ic_miss_check(long_at(0)); ++ } ++ ++ bool is_sigtrap_null_check() { ++ assert(UseSIGTRAP && TrapBasedNullChecks, "precondition"); ++ return MacroAssembler::is_trap_null_check(long_at(0)); ++ } ++ ++ // We use a special trap for marking a method as not_entrant or zombie ++ // iff UseSIGTRAP. ++ bool is_sigtrap_zombie_not_entrant() { ++ assert(UseSIGTRAP, "precondition"); ++ return MacroAssembler::is_trap_zombie_not_entrant(long_at(0)); ++ } ++ ++ // We use an illtrap for marking a method as not_entrant or zombie ++ // iff !UseSIGTRAP. ++ bool is_sigill_zombie_not_entrant() { ++ assert(!UseSIGTRAP, "precondition"); ++ // Work around a C++ compiler bug which changes 'this'. ++ return NativeInstruction::is_sigill_zombie_not_entrant_at(addr_at(0)); ++ } ++ static bool is_sigill_zombie_not_entrant_at(address addr); ++ ++#ifdef COMPILER2 ++ // SIGTRAP-based implicit range checks ++ bool is_sigtrap_range_check() { ++ assert(UseSIGTRAP && TrapBasedRangeChecks, "precondition"); ++ return MacroAssembler::is_trap_range_check(long_at(0)); ++ } ++#endif ++ ++ // 'should not reach here'. ++ bool is_sigtrap_should_not_reach_here() { ++ return MacroAssembler::is_trap_should_not_reach_here(long_at(0)); ++ } ++ ++ bool is_safepoint_poll() { ++ // Is the current instruction a POTENTIAL read access to the polling page? ++ // The current arguments of the instruction are not checked! ++ return MacroAssembler::is_load_from_polling_page(long_at(0), NULL); ++ } ++ ++ bool is_memory_serialization(JavaThread *thread, void *ucontext) { ++ // Is the current instruction a write access of thread to the ++ // memory serialization page? ++ return MacroAssembler::is_memory_serialization(long_at(0), thread, ucontext); ++ } ++ ++ address get_stack_bang_address(void *ucontext) { ++ // If long_at(0) is not a stack bang, return 0. Otherwise, return ++ // banged address. ++ return MacroAssembler::get_stack_bang_address(long_at(0), ucontext); ++ } ++ ++ protected: ++ address addr_at(int offset) const { return address(this) + offset; } ++ int long_at(int offset) const { return *(int*)addr_at(offset); } ++ ++ public: ++ void verify() NOT_DEBUG_RETURN; ++}; ++ ++inline NativeInstruction* nativeInstruction_at(address address) { ++ NativeInstruction* inst = (NativeInstruction*)address; ++ inst->verify(); ++ return inst; ++} ++ ++// The NativeCall is an abstraction for accessing/manipulating call ++// instructions. It is used to manipulate inline caches, primitive & ++// dll calls, etc. ++// ++// Sparc distinguishes `NativeCall' and `NativeFarCall'. On PPC64, ++// at present, we provide a single class `NativeCall' representing the ++// sequence `load_const, mtctr, bctrl' or the sequence 'ld_from_toc, ++// mtctr, bctrl'. ++class NativeCall: public NativeInstruction { ++ public: ++ ++ enum ppc_specific_constants { ++ load_const_instruction_size = 28, ++ load_const_from_method_toc_instruction_size = 16, ++ instruction_size = 16 // Used in shared code for calls with reloc_info. ++ }; ++ ++ static bool is_call_at(address a) { ++ return Assembler::is_bl(*(int*)(a)); ++ } ++ ++ static bool is_call_before(address return_address) { ++ return NativeCall::is_call_at(return_address - 4); ++ } ++ ++ address instruction_address() const { ++ return addr_at(0); ++ } ++ ++ address next_instruction_address() const { ++ // We have only bl. ++ assert(MacroAssembler::is_bl(*(int*)instruction_address()), "Should be bl instruction!"); ++ return addr_at(4); ++ } ++ ++ address return_address() const { ++ return next_instruction_address(); ++ } ++ ++ address destination() const; ++ ++ // The parameter assert_lock disables the assertion during code generation. ++ void set_destination_mt_safe(address dest, bool assert_lock = true); ++ ++ address get_trampoline(); ++ ++ void verify_alignment() {} // do nothing on ppc ++ void verify() NOT_DEBUG_RETURN; ++}; ++ ++inline NativeCall* nativeCall_at(address instr) { ++ NativeCall* call = (NativeCall*)instr; ++ call->verify(); ++ return call; ++} ++ ++inline NativeCall* nativeCall_before(address return_address) { ++ NativeCall* call = NULL; ++ if (MacroAssembler::is_bl(*(int*)(return_address - 4))) ++ call = (NativeCall*)(return_address - 4); ++ call->verify(); ++ return call; ++} ++ ++// The NativeFarCall is an abstraction for accessing/manipulating native ++// call-anywhere instructions. ++// Used to call native methods which may be loaded anywhere in the address ++// space, possibly out of reach of a call instruction. ++class NativeFarCall: public NativeInstruction { ++ public: ++ // We use MacroAssembler::bl64_patchable() for implementing a ++ // call-anywhere instruction. ++ ++ // Checks whether instr points at a NativeFarCall instruction. ++ static bool is_far_call_at(address instr) { ++ return MacroAssembler::is_bl64_patchable_at(instr); ++ } ++ ++ // Does the NativeFarCall implementation use a pc-relative encoding ++ // of the call destination? ++ // Used when relocating code. ++ bool is_pcrelative() { ++ assert(MacroAssembler::is_bl64_patchable_at((address)this), ++ "unexpected call type"); ++ return MacroAssembler::is_bl64_patchable_pcrelative_at((address)this); ++ } ++ ++ // Returns the NativeFarCall's destination. ++ address destination() const { ++ assert(MacroAssembler::is_bl64_patchable_at((address)this), ++ "unexpected call type"); ++ return MacroAssembler::get_dest_of_bl64_patchable_at((address)this); ++ } ++ ++ // Sets the NativeCall's destination, not necessarily mt-safe. ++ // Used when relocating code. ++ void set_destination(address dest) { ++ // Set new destination (implementation of call may change here). ++ assert(MacroAssembler::is_bl64_patchable_at((address)this), ++ "unexpected call type"); ++ MacroAssembler::set_dest_of_bl64_patchable_at((address)this, dest); ++ } ++ ++ void verify() NOT_DEBUG_RETURN; ++}; ++ ++// Instantiates a NativeFarCall object starting at the given instruction ++// address and returns the NativeFarCall object. ++inline NativeFarCall* nativeFarCall_at(address instr) { ++ NativeFarCall* call = (NativeFarCall*)instr; ++ call->verify(); ++ return call; ++} ++ ++// An interface for accessing/manipulating native set_oop imm, reg instructions. ++// (used to manipulate inlined data references, etc.) ++class NativeMovConstReg: public NativeInstruction { ++ public: ++ ++ enum ppc_specific_constants { ++ load_const_instruction_size = 20, ++ load_const_from_method_toc_instruction_size = 8, ++ instruction_size = 8 // Used in shared code for calls with reloc_info. ++ }; ++ ++ address instruction_address() const { ++ return addr_at(0); ++ } ++ ++ address next_instruction_address() const; ++ ++ // (The [set_]data accessor respects oop_type relocs also.) ++ intptr_t data() const; ++ ++ // Patch the code stream. ++ address set_data_plain(intptr_t x, CodeBlob *code); ++ // Patch the code stream and oop pool. ++ void set_data(intptr_t x); ++ ++ // Patch narrow oop constants. Use this also for narrow klass. ++ void set_narrow_oop(narrowOop data, CodeBlob *code = NULL); ++ ++ void verify() NOT_DEBUG_RETURN; ++}; ++ ++inline NativeMovConstReg* nativeMovConstReg_at(address address) { ++ NativeMovConstReg* test = (NativeMovConstReg*)address; ++ test->verify(); ++ return test; ++} ++ ++// The NativeJump is an abstraction for accessing/manipulating native ++// jump-anywhere instructions. ++class NativeJump: public NativeInstruction { ++ public: ++ // We use MacroAssembler::b64_patchable() for implementing a ++ // jump-anywhere instruction. ++ ++ enum ppc_specific_constants { ++ instruction_size = MacroAssembler::b64_patchable_size ++ }; ++ ++ // Checks whether instr points at a NativeJump instruction. ++ static bool is_jump_at(address instr) { ++ return MacroAssembler::is_b64_patchable_at(instr) ++ || ( MacroAssembler::is_load_const_from_method_toc_at(instr) ++ && Assembler::is_mtctr(*(int*)(instr + 2 * 4)) ++ && Assembler::is_bctr(*(int*)(instr + 3 * 4))); ++ } ++ ++ // Does the NativeJump implementation use a pc-relative encoding ++ // of the call destination? ++ // Used when relocating code or patching jumps. ++ bool is_pcrelative() { ++ return MacroAssembler::is_b64_patchable_pcrelative_at((address)this); ++ } ++ ++ // Returns the NativeJump's destination. ++ address jump_destination() const { ++ if (MacroAssembler::is_b64_patchable_at((address)this)) { ++ return MacroAssembler::get_dest_of_b64_patchable_at((address)this); ++ } else if (MacroAssembler::is_load_const_from_method_toc_at((address)this) ++ && Assembler::is_mtctr(*(int*)((address)this + 2 * 4)) ++ && Assembler::is_bctr(*(int*)((address)this + 3 * 4))) { ++ return (address)((NativeMovConstReg *)this)->data(); ++ } else { ++ ShouldNotReachHere(); ++ return NULL; ++ } ++ } ++ ++ // Sets the NativeJump's destination, not necessarily mt-safe. ++ // Used when relocating code or patching jumps. ++ void set_jump_destination(address dest) { ++ // Set new destination (implementation of call may change here). ++ if (MacroAssembler::is_b64_patchable_at((address)this)) { ++ MacroAssembler::set_dest_of_b64_patchable_at((address)this, dest); ++ } else if (MacroAssembler::is_load_const_from_method_toc_at((address)this) ++ && Assembler::is_mtctr(*(int*)((address)this + 2 * 4)) ++ && Assembler::is_bctr(*(int*)((address)this + 3 * 4))) { ++ ((NativeMovConstReg *)this)->set_data((intptr_t)dest); ++ } else { ++ ShouldNotReachHere(); ++ } ++ } ++ ++ // MT-safe insertion of native jump at verified method entry ++ static void patch_verified_entry(address entry, address verified_entry, address dest); ++ ++ void verify() NOT_DEBUG_RETURN; ++ ++ static void check_verified_entry_alignment(address entry, address verified_entry) { ++ // We just patch one instruction on ppc64, so the jump doesn't have to ++ // be aligned. Nothing to do here. ++ } ++}; ++ ++// Instantiates a NativeJump object starting at the given instruction ++// address and returns the NativeJump object. ++inline NativeJump* nativeJump_at(address instr) { ++ NativeJump* call = (NativeJump*)instr; ++ call->verify(); ++ return call; ++} ++ ++// NativeConditionalFarBranch is abstraction for accessing/manipulating ++// conditional far branches. ++class NativeConditionalFarBranch : public NativeInstruction { ++ public: ++ ++ static bool is_conditional_far_branch_at(address instr) { ++ return MacroAssembler::is_bc_far_at(instr); ++ } ++ ++ address branch_destination() const { ++ return MacroAssembler::get_dest_of_bc_far_at((address)this); ++ } ++ ++ void set_branch_destination(address dest) { ++ MacroAssembler::set_dest_of_bc_far_at((address)this, dest); ++ } ++}; ++ ++inline NativeConditionalFarBranch* NativeConditionalFarBranch_at(address address) { ++ assert(NativeConditionalFarBranch::is_conditional_far_branch_at(address), ++ "must be a conditional far branch"); ++ return (NativeConditionalFarBranch*)address; ++} ++ ++// Call trampoline stubs. ++class NativeCallTrampolineStub : public NativeInstruction { ++ private: ++ ++ address encoded_destination_addr() const; ++ ++ public: ++ ++ address destination(nmethod *nm = NULL) const; ++ int destination_toc_offset() const; ++ ++ void set_destination(address new_destination); ++}; ++ ++inline bool is_NativeCallTrampolineStub_at(address address) { ++ int first_instr = *(int*)address; ++ return Assembler::is_addis(first_instr) && ++ (Register)(intptr_t)Assembler::inv_rt_field(first_instr) == R12_scratch2; ++} ++ ++inline NativeCallTrampolineStub* NativeCallTrampolineStub_at(address address) { ++ assert(is_NativeCallTrampolineStub_at(address), "no call trampoline found"); ++ return (NativeCallTrampolineStub*)address; ++} ++ ++#endif // CPU_PPC_VM_NATIVEINST_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/ppc.ad Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/ppc.ad Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,12117 @@ ++// ++// Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. ++// Copyright 2012, 2014 SAP AG. 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. ++// ++// ++ ++// ++// PPC64 Architecture Description File ++// ++ ++//----------REGISTER DEFINITION BLOCK------------------------------------------ ++// This information is used by the matcher and the register allocator to ++// describe individual registers and classes of registers within the target ++// architecture. ++register %{ ++//----------Architecture Description Register Definitions---------------------- ++// General Registers ++// "reg_def" name (register save type, C convention save type, ++// ideal register type, encoding); ++// ++// Register Save Types: ++// ++// NS = No-Save: The register allocator assumes that these registers ++// can be used without saving upon entry to the method, & ++// that they do not need to be saved at call sites. ++// ++// SOC = Save-On-Call: The register allocator assumes that these registers ++// can be used without saving upon entry to the method, ++// but that they must be saved at call sites. ++// These are called "volatiles" on ppc. ++// ++// SOE = Save-On-Entry: The register allocator assumes that these registers ++// must be saved before using them upon entry to the ++// method, but they do not need to be saved at call ++// sites. ++// These are called "nonvolatiles" on ppc. ++// ++// AS = Always-Save: The register allocator assumes that these registers ++// must be saved before using them upon entry to the ++// method, & that they must be saved at call sites. ++// ++// Ideal Register Type is used to determine how to save & restore a ++// register. Op_RegI will get spilled with LoadI/StoreI, Op_RegP will get ++// spilled with LoadP/StoreP. If the register supports both, use Op_RegI. ++// ++// The encoding number is the actual bit-pattern placed into the opcodes. ++// ++// PPC64 register definitions, based on the 64-bit PowerPC ELF ABI ++// Supplement Version 1.7 as of 2003-10-29. ++// ++// For each 64-bit register we must define two registers: the register ++// itself, e.g. R3, and a corresponding virtual other (32-bit-)'half', ++// e.g. R3_H, which is needed by the allocator, but is not used ++// for stores, loads, etc. ++ ++// ---------------------------- ++// Integer/Long Registers ++// ---------------------------- ++ ++ // PPC64 has 32 64-bit integer registers. ++ ++ // types: v = volatile, nv = non-volatile, s = system ++ reg_def R0 ( SOC, SOC, Op_RegI, 0, R0->as_VMReg() ); // v used in prologs ++ reg_def R0_H ( SOC, SOC, Op_RegI, 99, R0->as_VMReg()->next() ); ++ reg_def R1 ( NS, NS, Op_RegI, 1, R1->as_VMReg() ); // s SP ++ reg_def R1_H ( NS, NS, Op_RegI, 99, R1->as_VMReg()->next() ); ++ reg_def R2 ( SOC, SOC, Op_RegI, 2, R2->as_VMReg() ); // v TOC ++ reg_def R2_H ( SOC, SOC, Op_RegI, 99, R2->as_VMReg()->next() ); ++ reg_def R3 ( SOC, SOC, Op_RegI, 3, R3->as_VMReg() ); // v iarg1 & iret ++ reg_def R3_H ( SOC, SOC, Op_RegI, 99, R3->as_VMReg()->next() ); ++ reg_def R4 ( SOC, SOC, Op_RegI, 4, R4->as_VMReg() ); // iarg2 ++ reg_def R4_H ( SOC, SOC, Op_RegI, 99, R4->as_VMReg()->next() ); ++ reg_def R5 ( SOC, SOC, Op_RegI, 5, R5->as_VMReg() ); // v iarg3 ++ reg_def R5_H ( SOC, SOC, Op_RegI, 99, R5->as_VMReg()->next() ); ++ reg_def R6 ( SOC, SOC, Op_RegI, 6, R6->as_VMReg() ); // v iarg4 ++ reg_def R6_H ( SOC, SOC, Op_RegI, 99, R6->as_VMReg()->next() ); ++ reg_def R7 ( SOC, SOC, Op_RegI, 7, R7->as_VMReg() ); // v iarg5 ++ reg_def R7_H ( SOC, SOC, Op_RegI, 99, R7->as_VMReg()->next() ); ++ reg_def R8 ( SOC, SOC, Op_RegI, 8, R8->as_VMReg() ); // v iarg6 ++ reg_def R8_H ( SOC, SOC, Op_RegI, 99, R8->as_VMReg()->next() ); ++ reg_def R9 ( SOC, SOC, Op_RegI, 9, R9->as_VMReg() ); // v iarg7 ++ reg_def R9_H ( SOC, SOC, Op_RegI, 99, R9->as_VMReg()->next() ); ++ reg_def R10 ( SOC, SOC, Op_RegI, 10, R10->as_VMReg() ); // v iarg8 ++ reg_def R10_H( SOC, SOC, Op_RegI, 99, R10->as_VMReg()->next()); ++ reg_def R11 ( SOC, SOC, Op_RegI, 11, R11->as_VMReg() ); // v ENV / scratch ++ reg_def R11_H( SOC, SOC, Op_RegI, 99, R11->as_VMReg()->next()); ++ reg_def R12 ( SOC, SOC, Op_RegI, 12, R12->as_VMReg() ); // v scratch ++ reg_def R12_H( SOC, SOC, Op_RegI, 99, R12->as_VMReg()->next()); ++ reg_def R13 ( NS, NS, Op_RegI, 13, R13->as_VMReg() ); // s system thread id ++ reg_def R13_H( NS, NS, Op_RegI, 99, R13->as_VMReg()->next()); ++ reg_def R14 ( SOC, SOE, Op_RegI, 14, R14->as_VMReg() ); // nv ++ reg_def R14_H( SOC, SOE, Op_RegI, 99, R14->as_VMReg()->next()); ++ reg_def R15 ( SOC, SOE, Op_RegI, 15, R15->as_VMReg() ); // nv ++ reg_def R15_H( SOC, SOE, Op_RegI, 99, R15->as_VMReg()->next()); ++ reg_def R16 ( SOC, SOE, Op_RegI, 16, R16->as_VMReg() ); // nv ++ reg_def R16_H( SOC, SOE, Op_RegI, 99, R16->as_VMReg()->next()); ++ reg_def R17 ( SOC, SOE, Op_RegI, 17, R17->as_VMReg() ); // nv ++ reg_def R17_H( SOC, SOE, Op_RegI, 99, R17->as_VMReg()->next()); ++ reg_def R18 ( SOC, SOE, Op_RegI, 18, R18->as_VMReg() ); // nv ++ reg_def R18_H( SOC, SOE, Op_RegI, 99, R18->as_VMReg()->next()); ++ reg_def R19 ( SOC, SOE, Op_RegI, 19, R19->as_VMReg() ); // nv ++ reg_def R19_H( SOC, SOE, Op_RegI, 99, R19->as_VMReg()->next()); ++ reg_def R20 ( SOC, SOE, Op_RegI, 20, R20->as_VMReg() ); // nv ++ reg_def R20_H( SOC, SOE, Op_RegI, 99, R20->as_VMReg()->next()); ++ reg_def R21 ( SOC, SOE, Op_RegI, 21, R21->as_VMReg() ); // nv ++ reg_def R21_H( SOC, SOE, Op_RegI, 99, R21->as_VMReg()->next()); ++ reg_def R22 ( SOC, SOE, Op_RegI, 22, R22->as_VMReg() ); // nv ++ reg_def R22_H( SOC, SOE, Op_RegI, 99, R22->as_VMReg()->next()); ++ reg_def R23 ( SOC, SOE, Op_RegI, 23, R23->as_VMReg() ); // nv ++ reg_def R23_H( SOC, SOE, Op_RegI, 99, R23->as_VMReg()->next()); ++ reg_def R24 ( SOC, SOE, Op_RegI, 24, R24->as_VMReg() ); // nv ++ reg_def R24_H( SOC, SOE, Op_RegI, 99, R24->as_VMReg()->next()); ++ reg_def R25 ( SOC, SOE, Op_RegI, 25, R25->as_VMReg() ); // nv ++ reg_def R25_H( SOC, SOE, Op_RegI, 99, R25->as_VMReg()->next()); ++ reg_def R26 ( SOC, SOE, Op_RegI, 26, R26->as_VMReg() ); // nv ++ reg_def R26_H( SOC, SOE, Op_RegI, 99, R26->as_VMReg()->next()); ++ reg_def R27 ( SOC, SOE, Op_RegI, 27, R27->as_VMReg() ); // nv ++ reg_def R27_H( SOC, SOE, Op_RegI, 99, R27->as_VMReg()->next()); ++ reg_def R28 ( SOC, SOE, Op_RegI, 28, R28->as_VMReg() ); // nv ++ reg_def R28_H( SOC, SOE, Op_RegI, 99, R28->as_VMReg()->next()); ++ reg_def R29 ( SOC, SOE, Op_RegI, 29, R29->as_VMReg() ); // nv ++ reg_def R29_H( SOC, SOE, Op_RegI, 99, R29->as_VMReg()->next()); ++ reg_def R30 ( SOC, SOE, Op_RegI, 30, R30->as_VMReg() ); // nv ++ reg_def R30_H( SOC, SOE, Op_RegI, 99, R30->as_VMReg()->next()); ++ reg_def R31 ( SOC, SOE, Op_RegI, 31, R31->as_VMReg() ); // nv ++ reg_def R31_H( SOC, SOE, Op_RegI, 99, R31->as_VMReg()->next()); ++ ++ ++// ---------------------------- ++// Float/Double Registers ++// ---------------------------- ++ ++ // Double Registers ++ // The rules of ADL require that double registers be defined in pairs. ++ // Each pair must be two 32-bit values, but not necessarily a pair of ++ // single float registers. In each pair, ADLC-assigned register numbers ++ // must be adjacent, with the lower number even. Finally, when the ++ // CPU stores such a register pair to memory, the word associated with ++ // the lower ADLC-assigned number must be stored to the lower address. ++ ++ // PPC64 has 32 64-bit floating-point registers. Each can store a single ++ // or double precision floating-point value. ++ ++ // types: v = volatile, nv = non-volatile, s = system ++ reg_def F0 ( SOC, SOC, Op_RegF, 0, F0->as_VMReg() ); // v scratch ++ reg_def F0_H ( SOC, SOC, Op_RegF, 99, F0->as_VMReg()->next() ); ++ reg_def F1 ( SOC, SOC, Op_RegF, 1, F1->as_VMReg() ); // v farg1 & fret ++ reg_def F1_H ( SOC, SOC, Op_RegF, 99, F1->as_VMReg()->next() ); ++ reg_def F2 ( SOC, SOC, Op_RegF, 2, F2->as_VMReg() ); // v farg2 ++ reg_def F2_H ( SOC, SOC, Op_RegF, 99, F2->as_VMReg()->next() ); ++ reg_def F3 ( SOC, SOC, Op_RegF, 3, F3->as_VMReg() ); // v farg3 ++ reg_def F3_H ( SOC, SOC, Op_RegF, 99, F3->as_VMReg()->next() ); ++ reg_def F4 ( SOC, SOC, Op_RegF, 4, F4->as_VMReg() ); // v farg4 ++ reg_def F4_H ( SOC, SOC, Op_RegF, 99, F4->as_VMReg()->next() ); ++ reg_def F5 ( SOC, SOC, Op_RegF, 5, F5->as_VMReg() ); // v farg5 ++ reg_def F5_H ( SOC, SOC, Op_RegF, 99, F5->as_VMReg()->next() ); ++ reg_def F6 ( SOC, SOC, Op_RegF, 6, F6->as_VMReg() ); // v farg6 ++ reg_def F6_H ( SOC, SOC, Op_RegF, 99, F6->as_VMReg()->next() ); ++ reg_def F7 ( SOC, SOC, Op_RegF, 7, F7->as_VMReg() ); // v farg7 ++ reg_def F7_H ( SOC, SOC, Op_RegF, 99, F7->as_VMReg()->next() ); ++ reg_def F8 ( SOC, SOC, Op_RegF, 8, F8->as_VMReg() ); // v farg8 ++ reg_def F8_H ( SOC, SOC, Op_RegF, 99, F8->as_VMReg()->next() ); ++ reg_def F9 ( SOC, SOC, Op_RegF, 9, F9->as_VMReg() ); // v farg9 ++ reg_def F9_H ( SOC, SOC, Op_RegF, 99, F9->as_VMReg()->next() ); ++ reg_def F10 ( SOC, SOC, Op_RegF, 10, F10->as_VMReg() ); // v farg10 ++ reg_def F10_H( SOC, SOC, Op_RegF, 99, F10->as_VMReg()->next()); ++ reg_def F11 ( SOC, SOC, Op_RegF, 11, F11->as_VMReg() ); // v farg11 ++ reg_def F11_H( SOC, SOC, Op_RegF, 99, F11->as_VMReg()->next()); ++ reg_def F12 ( SOC, SOC, Op_RegF, 12, F12->as_VMReg() ); // v farg12 ++ reg_def F12_H( SOC, SOC, Op_RegF, 99, F12->as_VMReg()->next()); ++ reg_def F13 ( SOC, SOC, Op_RegF, 13, F13->as_VMReg() ); // v farg13 ++ reg_def F13_H( SOC, SOC, Op_RegF, 99, F13->as_VMReg()->next()); ++ reg_def F14 ( SOC, SOE, Op_RegF, 14, F14->as_VMReg() ); // nv ++ reg_def F14_H( SOC, SOE, Op_RegF, 99, F14->as_VMReg()->next()); ++ reg_def F15 ( SOC, SOE, Op_RegF, 15, F15->as_VMReg() ); // nv ++ reg_def F15_H( SOC, SOE, Op_RegF, 99, F15->as_VMReg()->next()); ++ reg_def F16 ( SOC, SOE, Op_RegF, 16, F16->as_VMReg() ); // nv ++ reg_def F16_H( SOC, SOE, Op_RegF, 99, F16->as_VMReg()->next()); ++ reg_def F17 ( SOC, SOE, Op_RegF, 17, F17->as_VMReg() ); // nv ++ reg_def F17_H( SOC, SOE, Op_RegF, 99, F17->as_VMReg()->next()); ++ reg_def F18 ( SOC, SOE, Op_RegF, 18, F18->as_VMReg() ); // nv ++ reg_def F18_H( SOC, SOE, Op_RegF, 99, F18->as_VMReg()->next()); ++ reg_def F19 ( SOC, SOE, Op_RegF, 19, F19->as_VMReg() ); // nv ++ reg_def F19_H( SOC, SOE, Op_RegF, 99, F19->as_VMReg()->next()); ++ reg_def F20 ( SOC, SOE, Op_RegF, 20, F20->as_VMReg() ); // nv ++ reg_def F20_H( SOC, SOE, Op_RegF, 99, F20->as_VMReg()->next()); ++ reg_def F21 ( SOC, SOE, Op_RegF, 21, F21->as_VMReg() ); // nv ++ reg_def F21_H( SOC, SOE, Op_RegF, 99, F21->as_VMReg()->next()); ++ reg_def F22 ( SOC, SOE, Op_RegF, 22, F22->as_VMReg() ); // nv ++ reg_def F22_H( SOC, SOE, Op_RegF, 99, F22->as_VMReg()->next()); ++ reg_def F23 ( SOC, SOE, Op_RegF, 23, F23->as_VMReg() ); // nv ++ reg_def F23_H( SOC, SOE, Op_RegF, 99, F23->as_VMReg()->next()); ++ reg_def F24 ( SOC, SOE, Op_RegF, 24, F24->as_VMReg() ); // nv ++ reg_def F24_H( SOC, SOE, Op_RegF, 99, F24->as_VMReg()->next()); ++ reg_def F25 ( SOC, SOE, Op_RegF, 25, F25->as_VMReg() ); // nv ++ reg_def F25_H( SOC, SOE, Op_RegF, 99, F25->as_VMReg()->next()); ++ reg_def F26 ( SOC, SOE, Op_RegF, 26, F26->as_VMReg() ); // nv ++ reg_def F26_H( SOC, SOE, Op_RegF, 99, F26->as_VMReg()->next()); ++ reg_def F27 ( SOC, SOE, Op_RegF, 27, F27->as_VMReg() ); // nv ++ reg_def F27_H( SOC, SOE, Op_RegF, 99, F27->as_VMReg()->next()); ++ reg_def F28 ( SOC, SOE, Op_RegF, 28, F28->as_VMReg() ); // nv ++ reg_def F28_H( SOC, SOE, Op_RegF, 99, F28->as_VMReg()->next()); ++ reg_def F29 ( SOC, SOE, Op_RegF, 29, F29->as_VMReg() ); // nv ++ reg_def F29_H( SOC, SOE, Op_RegF, 99, F29->as_VMReg()->next()); ++ reg_def F30 ( SOC, SOE, Op_RegF, 30, F30->as_VMReg() ); // nv ++ reg_def F30_H( SOC, SOE, Op_RegF, 99, F30->as_VMReg()->next()); ++ reg_def F31 ( SOC, SOE, Op_RegF, 31, F31->as_VMReg() ); // nv ++ reg_def F31_H( SOC, SOE, Op_RegF, 99, F31->as_VMReg()->next()); ++ ++// ---------------------------- ++// Special Registers ++// ---------------------------- ++ ++// Condition Codes Flag Registers ++ ++ // PPC64 has 8 condition code "registers" which are all contained ++ // in the CR register. ++ ++ // types: v = volatile, nv = non-volatile, s = system ++ reg_def CCR0(SOC, SOC, Op_RegFlags, 0, CCR0->as_VMReg()); // v ++ reg_def CCR1(SOC, SOC, Op_RegFlags, 1, CCR1->as_VMReg()); // v ++ reg_def CCR2(SOC, SOC, Op_RegFlags, 2, CCR2->as_VMReg()); // nv ++ reg_def CCR3(SOC, SOC, Op_RegFlags, 3, CCR3->as_VMReg()); // nv ++ reg_def CCR4(SOC, SOC, Op_RegFlags, 4, CCR4->as_VMReg()); // nv ++ reg_def CCR5(SOC, SOC, Op_RegFlags, 5, CCR5->as_VMReg()); // v ++ reg_def CCR6(SOC, SOC, Op_RegFlags, 6, CCR6->as_VMReg()); // v ++ reg_def CCR7(SOC, SOC, Op_RegFlags, 7, CCR7->as_VMReg()); // v ++ ++ // Special registers of PPC64 ++ ++ reg_def SR_XER( SOC, SOC, Op_RegP, 0, SR_XER->as_VMReg()); // v ++ reg_def SR_LR( SOC, SOC, Op_RegP, 1, SR_LR->as_VMReg()); // v ++ reg_def SR_CTR( SOC, SOC, Op_RegP, 2, SR_CTR->as_VMReg()); // v ++ reg_def SR_VRSAVE( SOC, SOC, Op_RegP, 3, SR_VRSAVE->as_VMReg()); // v ++ reg_def SR_SPEFSCR(SOC, SOC, Op_RegP, 4, SR_SPEFSCR->as_VMReg()); // v ++ reg_def SR_PPR( SOC, SOC, Op_RegP, 5, SR_PPR->as_VMReg()); // v ++ ++ ++// ---------------------------- ++// Specify priority of register selection within phases of register ++// allocation. Highest priority is first. A useful heuristic is to ++// give registers a low priority when they are required by machine ++// instructions, like EAX and EDX on I486, and choose no-save registers ++// before save-on-call, & save-on-call before save-on-entry. Registers ++// which participate in fixed calling sequences should come last. ++// Registers which are used as pairs must fall on an even boundary. ++ ++// It's worth about 1% on SPEC geomean to get this right. ++ ++// Chunk0, chunk1, and chunk2 form the MachRegisterNumbers enumeration ++// in adGlobals_ppc64.hpp which defines the _num values, e.g. ++// R3_num. Therefore, R3_num may not be (and in reality is not) ++// the same as R3->encoding()! Furthermore, we cannot make any ++// assumptions on ordering, e.g. R3_num may be less than R2_num. ++// Additionally, the function ++// static enum RC rc_class(OptoReg::Name reg ) ++// maps a given _num value to its chunk type (except for flags) ++// and its current implementation relies on chunk0 and chunk1 having a ++// size of 64 each. ++ ++// If you change this allocation class, please have a look at the ++// default values for the parameters RoundRobinIntegerRegIntervalStart ++// and RoundRobinFloatRegIntervalStart ++ ++alloc_class chunk0 ( ++ // Chunk0 contains *all* 64 integer registers halves. ++ ++ // "non-volatile" registers ++ R14, R14_H, ++ R15, R15_H, ++ R17, R17_H, ++ R18, R18_H, ++ R19, R19_H, ++ R20, R20_H, ++ R21, R21_H, ++ R22, R22_H, ++ R23, R23_H, ++ R24, R24_H, ++ R25, R25_H, ++ R26, R26_H, ++ R27, R27_H, ++ R28, R28_H, ++ R29, R29_H, ++ R30, R30_H, ++ R31, R31_H, ++ ++ // scratch/special registers ++ R11, R11_H, ++ R12, R12_H, ++ ++ // argument registers ++ R10, R10_H, ++ R9, R9_H, ++ R8, R8_H, ++ R7, R7_H, ++ R6, R6_H, ++ R5, R5_H, ++ R4, R4_H, ++ R3, R3_H, ++ ++ // special registers, not available for allocation ++ R16, R16_H, // R16_thread ++ R13, R13_H, // system thread id ++ R2, R2_H, // may be used for TOC ++ R1, R1_H, // SP ++ R0, R0_H // R0 (scratch) ++); ++ ++// If you change this allocation class, please have a look at the ++// default values for the parameters RoundRobinIntegerRegIntervalStart ++// and RoundRobinFloatRegIntervalStart ++ ++alloc_class chunk1 ( ++ // Chunk1 contains *all* 64 floating-point registers halves. ++ ++ // scratch register ++ F0, F0_H, ++ ++ // argument registers ++ F13, F13_H, ++ F12, F12_H, ++ F11, F11_H, ++ F10, F10_H, ++ F9, F9_H, ++ F8, F8_H, ++ F7, F7_H, ++ F6, F6_H, ++ F5, F5_H, ++ F4, F4_H, ++ F3, F3_H, ++ F2, F2_H, ++ F1, F1_H, ++ ++ // non-volatile registers ++ F14, F14_H, ++ F15, F15_H, ++ F16, F16_H, ++ F17, F17_H, ++ F18, F18_H, ++ F19, F19_H, ++ F20, F20_H, ++ F21, F21_H, ++ F22, F22_H, ++ F23, F23_H, ++ F24, F24_H, ++ F25, F25_H, ++ F26, F26_H, ++ F27, F27_H, ++ F28, F28_H, ++ F29, F29_H, ++ F30, F30_H, ++ F31, F31_H ++); ++ ++alloc_class chunk2 ( ++ // Chunk2 contains *all* 8 condition code registers. ++ ++ CCR0, ++ CCR1, ++ CCR2, ++ CCR3, ++ CCR4, ++ CCR5, ++ CCR6, ++ CCR7 ++); ++ ++alloc_class chunk3 ( ++ // special registers ++ // These registers are not allocated, but used for nodes generated by postalloc expand. ++ SR_XER, ++ SR_LR, ++ SR_CTR, ++ SR_VRSAVE, ++ SR_SPEFSCR, ++ SR_PPR ++); ++ ++//-------Architecture Description Register Classes----------------------- ++ ++// Several register classes are automatically defined based upon ++// information in this architecture description. ++ ++// 1) reg_class inline_cache_reg ( as defined in frame section ) ++// 2) reg_class compiler_method_oop_reg ( as defined in frame section ) ++// 2) reg_class interpreter_method_oop_reg ( as defined in frame section ) ++// 3) reg_class stack_slots( /* one chunk of stack-based "registers" */ ) ++// ++ ++// ---------------------------- ++// 32 Bit Register Classes ++// ---------------------------- ++ ++// We specify registers twice, once as read/write, and once read-only. ++// We use the read-only registers for source operands. With this, we ++// can include preset read only registers in this class, as a hard-coded ++// '0'-register. (We used to simulate this on ppc.) ++ ++// 32 bit registers that can be read and written i.e. these registers ++// can be dest (or src) of normal instructions. ++reg_class bits32_reg_rw( ++/*R0*/ // R0 ++/*R1*/ // SP ++ R2, // TOC ++ R3, ++ R4, ++ R5, ++ R6, ++ R7, ++ R8, ++ R9, ++ R10, ++ R11, ++ R12, ++/*R13*/ // system thread id ++ R14, ++ R15, ++/*R16*/ // R16_thread ++ R17, ++ R18, ++ R19, ++ R20, ++ R21, ++ R22, ++ R23, ++ R24, ++ R25, ++ R26, ++ R27, ++ R28, ++/*R29*/ // global TOC ++/*R30*/ // Narrow Oop Base ++ R31 ++); ++ ++// 32 bit registers that can only be read i.e. these registers can ++// only be src of all instructions. ++reg_class bits32_reg_ro( ++/*R0*/ // R0 ++/*R1*/ // SP ++ R2 // TOC ++ R3, ++ R4, ++ R5, ++ R6, ++ R7, ++ R8, ++ R9, ++ R10, ++ R11, ++ R12, ++/*R13*/ // system thread id ++ R14, ++ R15, ++/*R16*/ // R16_thread ++ R17, ++ R18, ++ R19, ++ R20, ++ R21, ++ R22, ++ R23, ++ R24, ++ R25, ++ R26, ++ R27, ++ R28, ++/*R29*/ ++/*R30*/ // Narrow Oop Base ++ R31 ++); ++ ++// Complement-required-in-pipeline operands for narrow oops. ++reg_class bits32_reg_ro_not_complement ( ++/*R0*/ // R0 ++ R1, // SP ++ R2, // TOC ++ R3, ++ R4, ++ R5, ++ R6, ++ R7, ++ R8, ++ R9, ++ R10, ++ R11, ++ R12, ++/*R13,*/ // system thread id ++ R14, ++ R15, ++ R16, // R16_thread ++ R17, ++ R18, ++ R19, ++ R20, ++ R21, ++ R22, ++/*R23, ++ R24, ++ R25, ++ R26, ++ R27, ++ R28,*/ ++/*R29,*/ // TODO: let allocator handle TOC!! ++/*R30,*/ ++ R31 ++); ++ ++// Complement-required-in-pipeline operands for narrow oops. ++// See 64-bit declaration. ++reg_class bits32_reg_ro_complement ( ++ R23, ++ R24, ++ R25, ++ R26, ++ R27, ++ R28 ++); ++ ++reg_class rscratch1_bits32_reg(R11); ++reg_class rscratch2_bits32_reg(R12); ++reg_class rarg1_bits32_reg(R3); ++reg_class rarg2_bits32_reg(R4); ++reg_class rarg3_bits32_reg(R5); ++reg_class rarg4_bits32_reg(R6); ++ ++// ---------------------------- ++// 64 Bit Register Classes ++// ---------------------------- ++// 64-bit build means 64-bit pointers means hi/lo pairs ++ ++reg_class rscratch1_bits64_reg(R11_H, R11); ++reg_class rscratch2_bits64_reg(R12_H, R12); ++reg_class rarg1_bits64_reg(R3_H, R3); ++reg_class rarg2_bits64_reg(R4_H, R4); ++reg_class rarg3_bits64_reg(R5_H, R5); ++reg_class rarg4_bits64_reg(R6_H, R6); ++// Thread register, 'written' by tlsLoadP, see there. ++reg_class thread_bits64_reg(R16_H, R16); ++ ++reg_class r19_bits64_reg(R19_H, R19); ++ ++// 64 bit registers that can be read and written i.e. these registers ++// can be dest (or src) of normal instructions. ++reg_class bits64_reg_rw( ++/*R0_H, R0*/ // R0 ++/*R1_H, R1*/ // SP ++ R2_H, R2, // TOC ++ R3_H, R3, ++ R4_H, R4, ++ R5_H, R5, ++ R6_H, R6, ++ R7_H, R7, ++ R8_H, R8, ++ R9_H, R9, ++ R10_H, R10, ++ R11_H, R11, ++ R12_H, R12, ++/*R13_H, R13*/ // system thread id ++ R14_H, R14, ++ R15_H, R15, ++/*R16_H, R16*/ // R16_thread ++ R17_H, R17, ++ R18_H, R18, ++ R19_H, R19, ++ R20_H, R20, ++ R21_H, R21, ++ R22_H, R22, ++ R23_H, R23, ++ R24_H, R24, ++ R25_H, R25, ++ R26_H, R26, ++ R27_H, R27, ++ R28_H, R28, ++/*R29_H, R29*/ ++/*R30_H, R30*/ ++ R31_H, R31 ++); ++ ++// 64 bit registers used excluding r2, r11 and r12 ++// Used to hold the TOC to avoid collisions with expanded LeafCall which uses ++// r2, r11 and r12 internally. ++reg_class bits64_reg_leaf_call( ++/*R0_H, R0*/ // R0 ++/*R1_H, R1*/ // SP ++/*R2_H, R2*/ // TOC ++ R3_H, R3, ++ R4_H, R4, ++ R5_H, R5, ++ R6_H, R6, ++ R7_H, R7, ++ R8_H, R8, ++ R9_H, R9, ++ R10_H, R10, ++/*R11_H, R11*/ ++/*R12_H, R12*/ ++/*R13_H, R13*/ // system thread id ++ R14_H, R14, ++ R15_H, R15, ++/*R16_H, R16*/ // R16_thread ++ R17_H, R17, ++ R18_H, R18, ++ R19_H, R19, ++ R20_H, R20, ++ R21_H, R21, ++ R22_H, R22, ++ R23_H, R23, ++ R24_H, R24, ++ R25_H, R25, ++ R26_H, R26, ++ R27_H, R27, ++ R28_H, R28, ++/*R29_H, R29*/ ++/*R30_H, R30*/ ++ R31_H, R31 ++); ++ ++// Used to hold the TOC to avoid collisions with expanded DynamicCall ++// which uses r19 as inline cache internally and expanded LeafCall which uses ++// r2, r11 and r12 internally. ++reg_class bits64_constant_table_base( ++/*R0_H, R0*/ // R0 ++/*R1_H, R1*/ // SP ++/*R2_H, R2*/ // TOC ++ R3_H, R3, ++ R4_H, R4, ++ R5_H, R5, ++ R6_H, R6, ++ R7_H, R7, ++ R8_H, R8, ++ R9_H, R9, ++ R10_H, R10, ++/*R11_H, R11*/ ++/*R12_H, R12*/ ++/*R13_H, R13*/ // system thread id ++ R14_H, R14, ++ R15_H, R15, ++/*R16_H, R16*/ // R16_thread ++ R17_H, R17, ++ R18_H, R18, ++/*R19_H, R19*/ ++ R20_H, R20, ++ R21_H, R21, ++ R22_H, R22, ++ R23_H, R23, ++ R24_H, R24, ++ R25_H, R25, ++ R26_H, R26, ++ R27_H, R27, ++ R28_H, R28, ++/*R29_H, R29*/ ++/*R30_H, R30*/ ++ R31_H, R31 ++); ++ ++// 64 bit registers that can only be read i.e. these registers can ++// only be src of all instructions. ++reg_class bits64_reg_ro( ++/*R0_H, R0*/ // R0 ++ R1_H, R1, ++ R2_H, R2, // TOC ++ R3_H, R3, ++ R4_H, R4, ++ R5_H, R5, ++ R6_H, R6, ++ R7_H, R7, ++ R8_H, R8, ++ R9_H, R9, ++ R10_H, R10, ++ R11_H, R11, ++ R12_H, R12, ++/*R13_H, R13*/ // system thread id ++ R14_H, R14, ++ R15_H, R15, ++ R16_H, R16, // R16_thread ++ R17_H, R17, ++ R18_H, R18, ++ R19_H, R19, ++ R20_H, R20, ++ R21_H, R21, ++ R22_H, R22, ++ R23_H, R23, ++ R24_H, R24, ++ R25_H, R25, ++ R26_H, R26, ++ R27_H, R27, ++ R28_H, R28, ++/*R29_H, R29*/ // TODO: let allocator handle TOC!! ++/*R30_H, R30,*/ ++ R31_H, R31 ++); ++ ++// Complement-required-in-pipeline operands. ++reg_class bits64_reg_ro_not_complement ( ++/*R0_H, R0*/ // R0 ++ R1_H, R1, // SP ++ R2_H, R2, // TOC ++ R3_H, R3, ++ R4_H, R4, ++ R5_H, R5, ++ R6_H, R6, ++ R7_H, R7, ++ R8_H, R8, ++ R9_H, R9, ++ R10_H, R10, ++ R11_H, R11, ++ R12_H, R12, ++/*R13_H, R13*/ // system thread id ++ R14_H, R14, ++ R15_H, R15, ++ R16_H, R16, // R16_thread ++ R17_H, R17, ++ R18_H, R18, ++ R19_H, R19, ++ R20_H, R20, ++ R21_H, R21, ++ R22_H, R22, ++/*R23_H, R23, ++ R24_H, R24, ++ R25_H, R25, ++ R26_H, R26, ++ R27_H, R27, ++ R28_H, R28,*/ ++/*R29_H, R29*/ // TODO: let allocator handle TOC!! ++/*R30_H, R30,*/ ++ R31_H, R31 ++); ++ ++// Complement-required-in-pipeline operands. ++// This register mask is used for the trap instructions that implement ++// the null checks on AIX. The trap instruction first computes the ++// complement of the value it shall trap on. Because of this, the ++// instruction can not be scheduled in the same cycle as an other ++// instruction reading the normal value of the same register. So we ++// force the value to check into 'bits64_reg_ro_not_complement' ++// and then copy it to 'bits64_reg_ro_complement' for the trap. ++reg_class bits64_reg_ro_complement ( ++ R23_H, R23, ++ R24_H, R24, ++ R25_H, R25, ++ R26_H, R26, ++ R27_H, R27, ++ R28_H, R28 ++); ++ ++ ++// ---------------------------- ++// Special Class for Condition Code Flags Register ++ ++reg_class int_flags( ++/*CCR0*/ // scratch ++/*CCR1*/ // scratch ++/*CCR2*/ // nv! ++/*CCR3*/ // nv! ++/*CCR4*/ // nv! ++ CCR5, ++ CCR6, ++ CCR7 ++); ++ ++reg_class int_flags_CR0(CCR0); ++reg_class int_flags_CR1(CCR1); ++reg_class int_flags_CR6(CCR6); ++reg_class ctr_reg(SR_CTR); ++ ++// ---------------------------- ++// Float Register Classes ++// ---------------------------- ++ ++reg_class flt_reg( ++/*F0*/ // scratch ++ F1, ++ F2, ++ F3, ++ F4, ++ F5, ++ F6, ++ F7, ++ F8, ++ F9, ++ F10, ++ F11, ++ F12, ++ F13, ++ F14, // nv! ++ F15, // nv! ++ F16, // nv! ++ F17, // nv! ++ F18, // nv! ++ F19, // nv! ++ F20, // nv! ++ F21, // nv! ++ F22, // nv! ++ F23, // nv! ++ F24, // nv! ++ F25, // nv! ++ F26, // nv! ++ F27, // nv! ++ F28, // nv! ++ F29, // nv! ++ F30, // nv! ++ F31 // nv! ++); ++ ++// Double precision float registers have virtual `high halves' that ++// are needed by the allocator. ++reg_class dbl_reg( ++/*F0, F0_H*/ // scratch ++ F1, F1_H, ++ F2, F2_H, ++ F3, F3_H, ++ F4, F4_H, ++ F5, F5_H, ++ F6, F6_H, ++ F7, F7_H, ++ F8, F8_H, ++ F9, F9_H, ++ F10, F10_H, ++ F11, F11_H, ++ F12, F12_H, ++ F13, F13_H, ++ F14, F14_H, // nv! ++ F15, F15_H, // nv! ++ F16, F16_H, // nv! ++ F17, F17_H, // nv! ++ F18, F18_H, // nv! ++ F19, F19_H, // nv! ++ F20, F20_H, // nv! ++ F21, F21_H, // nv! ++ F22, F22_H, // nv! ++ F23, F23_H, // nv! ++ F24, F24_H, // nv! ++ F25, F25_H, // nv! ++ F26, F26_H, // nv! ++ F27, F27_H, // nv! ++ F28, F28_H, // nv! ++ F29, F29_H, // nv! ++ F30, F30_H, // nv! ++ F31, F31_H // nv! ++); ++ ++ %} ++ ++//----------DEFINITION BLOCK--------------------------------------------------- ++// Define name --> value mappings to inform the ADLC of an integer valued name ++// Current support includes integer values in the range [0, 0x7FFFFFFF] ++// Format: ++// int_def ( , ); ++// Generated Code in ad_.hpp ++// #define () ++// // value == ++// Generated code in ad_.cpp adlc_verification() ++// assert( == , "Expect () to equal "); ++// ++definitions %{ ++ // The default cost (of an ALU instruction). ++ int_def DEFAULT_COST_LOW ( 30, 30); ++ int_def DEFAULT_COST ( 100, 100); ++ int_def HUGE_COST (1000000, 1000000); ++ ++ // Memory refs ++ int_def MEMORY_REF_COST_LOW ( 200, DEFAULT_COST * 2); ++ int_def MEMORY_REF_COST ( 300, DEFAULT_COST * 3); ++ ++ // Branches are even more expensive. ++ int_def BRANCH_COST ( 900, DEFAULT_COST * 9); ++ int_def CALL_COST ( 1300, DEFAULT_COST * 13); ++%} ++ ++ ++//----------SOURCE BLOCK------------------------------------------------------- ++// This is a block of C++ code which provides values, functions, and ++// definitions necessary in the rest of the architecture description. ++source_hpp %{ ++ // Header information of the source block. ++ // Method declarations/definitions which are used outside ++ // the ad-scope can conveniently be defined here. ++ // ++ // To keep related declarations/definitions/uses close together, ++ // we switch between source %{ }% and source_hpp %{ }% freely as needed. ++ ++ // Returns true if Node n is followed by a MemBar node that ++ // will do an acquire. If so, this node must not do the acquire ++ // operation. ++ bool followed_by_acquire(const Node *n); ++%} ++ ++source %{ ++ ++// Optimize load-acquire. ++// ++// Check if acquire is unnecessary due to following operation that does ++// acquire anyways. ++// Walk the pattern: ++// ++// n: Load.acq ++// | ++// MemBarAcquire ++// | | ++// Proj(ctrl) Proj(mem) ++// | | ++// MemBarRelease/Volatile ++// ++bool followed_by_acquire(const Node *load) { ++ assert(load->is_Load(), "So far implemented only for loads."); ++ ++ // Find MemBarAcquire. ++ const Node *mba = NULL; ++ for (DUIterator_Fast imax, i = load->fast_outs(imax); i < imax; i++) { ++ const Node *out = load->fast_out(i); ++ if (out->Opcode() == Op_MemBarAcquire) { ++ if (out->in(0) == load) continue; // Skip control edge, membar should be found via precedence edge. ++ mba = out; ++ break; ++ } ++ } ++ if (!mba) return false; ++ ++ // Find following MemBar node. ++ // ++ // The following node must be reachable by control AND memory ++ // edge to assure no other operations are in between the two nodes. ++ // ++ // So first get the Proj node, mem_proj, to use it to iterate forward. ++ Node *mem_proj = NULL; ++ for (DUIterator_Fast imax, i = mba->fast_outs(imax); i < imax; i++) { ++ mem_proj = mba->fast_out(i); // Throw out-of-bounds if proj not found ++ assert(mem_proj->is_Proj(), "only projections here"); ++ ProjNode *proj = mem_proj->as_Proj(); ++ if (proj->_con == TypeFunc::Memory && ++ !Compile::current()->node_arena()->contains(mem_proj)) // Unmatched old-space only ++ break; ++ } ++ assert(mem_proj->as_Proj()->_con == TypeFunc::Memory, "Graph broken"); ++ ++ // Search MemBar behind Proj. If there are other memory operations ++ // behind the Proj we lost. ++ for (DUIterator_Fast jmax, j = mem_proj->fast_outs(jmax); j < jmax; j++) { ++ Node *x = mem_proj->fast_out(j); ++ // Proj might have an edge to a store or load node which precedes the membar. ++ if (x->is_Mem()) return false; ++ ++ // On PPC64 release and volatile are implemented by an instruction ++ // that also has acquire semantics. I.e. there is no need for an ++ // acquire before these. ++ int xop = x->Opcode(); ++ if (xop == Op_MemBarRelease || xop == Op_MemBarVolatile) { ++ // Make sure we're not missing Call/Phi/MergeMem by checking ++ // control edges. The control edge must directly lead back ++ // to the MemBarAcquire ++ Node *ctrl_proj = x->in(0); ++ if (ctrl_proj->is_Proj() && ctrl_proj->in(0) == mba) { ++ return true; ++ } ++ } ++ } ++ ++ return false; ++} ++ ++#define __ _masm. ++ ++// Tertiary op of a LoadP or StoreP encoding. ++#define REGP_OP true ++ ++// **************************************************************************** ++ ++// REQUIRED FUNCTIONALITY ++ ++// !!!!! Special hack to get all type of calls to specify the byte offset ++// from the start of the call to the point where the return address ++// will point. ++ ++// PPC port: Removed use of lazy constant construct. ++ ++int MachCallStaticJavaNode::ret_addr_offset() { ++ // It's only a single branch-and-link instruction. ++ return 4; ++} ++ ++int MachCallDynamicJavaNode::ret_addr_offset() { ++ // Offset is 4 with postalloc expanded calls (bl is one instruction). We use ++ // postalloc expanded calls if we use inline caches and do not update method data. ++ if (UseInlineCaches) ++ return 4; ++ ++ int vtable_index = this->_vtable_index; ++ if (vtable_index < 0) { ++ // Must be invalid_vtable_index, not nonvirtual_vtable_index. ++ assert(vtable_index == Method::invalid_vtable_index, "correct sentinel value"); ++ return 12; ++ } else { ++ assert(!UseInlineCaches, "expect vtable calls only if not using ICs"); ++ return 24; ++ } ++} ++ ++int MachCallRuntimeNode::ret_addr_offset() { ++#if defined(ABI_ELFv2) ++ return 28; ++#else ++ return 40; ++#endif ++} ++ ++//============================================================================= ++ ++// condition code conversions ++ ++static int cc_to_boint(int cc) { ++ return Assembler::bcondCRbiIs0 | (cc & 8); ++} ++ ++static int cc_to_inverse_boint(int cc) { ++ return Assembler::bcondCRbiIs0 | (8-(cc & 8)); ++} ++ ++static int cc_to_biint(int cc, int flags_reg) { ++ return (flags_reg << 2) | (cc & 3); ++} ++ ++//============================================================================= ++ ++// Compute padding required for nodes which need alignment. The padding ++// is the number of bytes (not instructions) which will be inserted before ++// the instruction. The padding must match the size of a NOP instruction. ++ ++int string_indexOf_imm1_charNode::compute_padding(int current_offset) const { ++ return (3*4-current_offset)&31; ++} ++ ++int string_indexOf_imm1Node::compute_padding(int current_offset) const { ++ return (2*4-current_offset)&31; ++} ++ ++int string_indexOf_immNode::compute_padding(int current_offset) const { ++ return (3*4-current_offset)&31; ++} ++ ++int string_indexOfNode::compute_padding(int current_offset) const { ++ return (1*4-current_offset)&31; ++} ++ ++int string_compareNode::compute_padding(int current_offset) const { ++ return (4*4-current_offset)&31; ++} ++ ++int string_equals_immNode::compute_padding(int current_offset) const { ++ if (opnd_array(3)->constant() < 16) return 0; // Don't insert nops for short version (loop completely unrolled). ++ return (2*4-current_offset)&31; ++} ++ ++int string_equalsNode::compute_padding(int current_offset) const { ++ return (7*4-current_offset)&31; ++} ++ ++int inlineCallClearArrayNode::compute_padding(int current_offset) const { ++ return (2*4-current_offset)&31; ++} ++ ++//============================================================================= ++ ++// Indicate if the safepoint node needs the polling page as an input. ++bool SafePointNode::needs_polling_address_input() { ++ // The address is loaded from thread by a seperate node. ++ return true; ++} ++ ++//============================================================================= ++ ++// Emit an interrupt that is caught by the debugger (for debugging compiler). ++void emit_break(CodeBuffer &cbuf) { ++ MacroAssembler _masm(&cbuf); ++ __ illtrap(); ++} ++ ++#ifndef PRODUCT ++void MachBreakpointNode::format(PhaseRegAlloc *ra_, outputStream *st) const { ++ st->print("BREAKPOINT"); ++} ++#endif ++ ++void MachBreakpointNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { ++ emit_break(cbuf); ++} ++ ++uint MachBreakpointNode::size(PhaseRegAlloc *ra_) const { ++ return MachNode::size(ra_); ++} ++ ++//============================================================================= ++ ++void emit_nop(CodeBuffer &cbuf) { ++ MacroAssembler _masm(&cbuf); ++ __ nop(); ++} ++ ++static inline void emit_long(CodeBuffer &cbuf, int value) { ++ *((int*)(cbuf.insts_end())) = value; ++ cbuf.set_insts_end(cbuf.insts_end() + BytesPerInstWord); ++} ++ ++//============================================================================= ++ ++%} // interrupt source ++ ++source_hpp %{ // Header information of the source block. ++ ++//-------------------------------------------------------------- ++//---< Used for optimization in Compile::Shorten_branches >--- ++//-------------------------------------------------------------- ++ ++const uint trampoline_stub_size = 6 * BytesPerInstWord; ++ ++class CallStubImpl { ++ ++ public: ++ ++ // Emit call stub, compiled java to interpreter. ++ static void emit_trampoline_stub(MacroAssembler &_masm, int destination_toc_offset, int insts_call_instruction_offset); ++ ++ // Size of call trampoline stub. ++ // This doesn't need to be accurate to the byte, but it ++ // must be larger than or equal to the real size of the stub. ++ static uint size_call_trampoline() { ++ return trampoline_stub_size; ++ } ++ ++ // number of relocations needed by a call trampoline stub ++ static uint reloc_call_trampoline() { ++ return 5; ++ } ++ ++}; ++ ++%} // end source_hpp ++ ++source %{ ++ ++// Emit a trampoline stub for a call to a target which is too far away. ++// ++// code sequences: ++// ++// call-site: ++// branch-and-link to or ++// ++// Related trampoline stub for this call-site in the stub section: ++// load the call target from the constant pool ++// branch via CTR (LR/link still points to the call-site above) ++ ++void CallStubImpl::emit_trampoline_stub(MacroAssembler &_masm, int destination_toc_offset, int insts_call_instruction_offset) { ++ // Start the stub. ++ address stub = __ start_a_stub(Compile::MAX_stubs_size/2); ++ if (stub == NULL) { ++ Compile::current()->env()->record_out_of_memory_failure(); ++ return; ++ } ++ ++ // For java_to_interp stubs we use R11_scratch1 as scratch register ++ // and in call trampoline stubs we use R12_scratch2. This way we ++ // can distinguish them (see is_NativeCallTrampolineStub_at()). ++ Register reg_scratch = R12_scratch2; ++ ++ // Create a trampoline stub relocation which relates this trampoline stub ++ // with the call instruction at insts_call_instruction_offset in the ++ // instructions code-section. ++ __ relocate(trampoline_stub_Relocation::spec(__ code()->insts()->start() + insts_call_instruction_offset)); ++ const int stub_start_offset = __ offset(); ++ ++ // Now, create the trampoline stub's code: ++ // - load the TOC ++ // - load the call target from the constant pool ++ // - call ++ __ calculate_address_from_global_toc(reg_scratch, __ method_toc()); ++ __ ld_largeoffset_unchecked(reg_scratch, destination_toc_offset, reg_scratch, false); ++ __ mtctr(reg_scratch); ++ __ bctr(); ++ ++ const address stub_start_addr = __ addr_at(stub_start_offset); ++ ++ // FIXME: Assert that the trampoline stub can be identified and patched. ++ ++ // Assert that the encoded destination_toc_offset can be identified and that it is correct. ++ assert(destination_toc_offset == NativeCallTrampolineStub_at(stub_start_addr)->destination_toc_offset(), ++ "encoded offset into the constant pool must match"); ++ // Trampoline_stub_size should be good. ++ assert((uint)(__ offset() - stub_start_offset) <= trampoline_stub_size, "should be good size"); ++ assert(is_NativeCallTrampolineStub_at(stub_start_addr), "doesn't look like a trampoline"); ++ ++ // End the stub. ++ __ end_a_stub(); ++} ++ ++//============================================================================= ++ ++// Emit an inline branch-and-link call and a related trampoline stub. ++// ++// code sequences: ++// ++// call-site: ++// branch-and-link to or ++// ++// Related trampoline stub for this call-site in the stub section: ++// load the call target from the constant pool ++// branch via CTR (LR/link still points to the call-site above) ++// ++ ++typedef struct { ++ int insts_call_instruction_offset; ++ int ret_addr_offset; ++} EmitCallOffsets; ++ ++// Emit a branch-and-link instruction that branches to a trampoline. ++// - Remember the offset of the branch-and-link instruction. ++// - Add a relocation at the branch-and-link instruction. ++// - Emit a branch-and-link. ++// - Remember the return pc offset. ++EmitCallOffsets emit_call_with_trampoline_stub(MacroAssembler &_masm, address entry_point, relocInfo::relocType rtype) { ++ EmitCallOffsets offsets = { -1, -1 }; ++ const int start_offset = __ offset(); ++ offsets.insts_call_instruction_offset = __ offset(); ++ ++ // No entry point given, use the current pc. ++ if (entry_point == NULL) entry_point = __ pc(); ++ ++ if (!Compile::current()->in_scratch_emit_size()) { ++ // Put the entry point as a constant into the constant pool. ++ const address entry_point_toc_addr = __ address_constant(entry_point, RelocationHolder::none); ++ const int entry_point_toc_offset = __ offset_to_method_toc(entry_point_toc_addr); ++ ++ // Emit the trampoline stub which will be related to the branch-and-link below. ++ CallStubImpl::emit_trampoline_stub(_masm, entry_point_toc_offset, offsets.insts_call_instruction_offset); ++ __ relocate(rtype); ++ } ++ ++ // Note: At this point we do not have the address of the trampoline ++ // stub, and the entry point might be too far away for bl, so __ pc() ++ // serves as dummy and the bl will be patched later. ++ __ bl((address) __ pc()); ++ ++ offsets.ret_addr_offset = __ offset() - start_offset; ++ ++ return offsets; ++} ++ ++//============================================================================= ++ ++// Factory for creating loadConL* nodes for large/small constant pool. ++ ++static inline jlong replicate_immF(float con) { ++ // Replicate float con 2 times and pack into vector. ++ int val = *((int*)&con); ++ jlong lval = val; ++ lval = (lval << 32) | (lval & 0xFFFFFFFFl); ++ return lval; ++} ++ ++//============================================================================= ++ ++const RegMask& MachConstantBaseNode::_out_RegMask = BITS64_CONSTANT_TABLE_BASE_mask(); ++int Compile::ConstantTable::calculate_table_base_offset() const { ++ return 0; // absolute addressing, no offset ++} ++ ++bool MachConstantBaseNode::requires_postalloc_expand() const { return true; } ++void MachConstantBaseNode::postalloc_expand(GrowableArray *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(); ++ ++ m1->add_req(NULL); ++ m2->add_req(NULL, m1); ++ m1->_opnds[0] = op_dst; ++ m2->_opnds[0] = op_dst; ++ m2->_opnds[1] = op_dst; ++ ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ nodes->push(m1); ++ nodes->push(m2); ++} ++ ++void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const { ++ // Is postalloc expanded. ++ ShouldNotReachHere(); ++} ++ ++uint MachConstantBaseNode::size(PhaseRegAlloc* ra_) const { ++ return 0; ++} ++ ++#ifndef PRODUCT ++void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const { ++ st->print("-- \t// MachConstantBaseNode (empty encoding)"); ++} ++#endif ++ ++//============================================================================= ++ ++#ifndef PRODUCT ++void MachPrologNode::format(PhaseRegAlloc *ra_, outputStream *st) const { ++ Compile* C = ra_->C; ++ const long framesize = C->frame_slots() << LogBytesPerInt; ++ ++ st->print("PROLOG\n\t"); ++ if (C->need_stack_bang(framesize)) { ++ st->print("stack_overflow_check\n\t"); ++ } ++ ++ if (!false /* TODO: PPC port C->is_frameless_method()*/) { ++ st->print("save return pc\n\t"); ++ st->print("push frame %d\n\t", -framesize); ++ } ++} ++#endif ++ ++// Macro used instead of the common __ to emulate the pipes of PPC. ++// Instead of e.g. __ ld(...) one hase to write ___(ld) ld(...) This enables the ++// micro scheduler to cope with "hand written" assembler like in the prolog. Though ++// still no scheduling of this code is possible, the micro scheduler is aware of the ++// code and can update its internal data. The following mechanism is used to achieve this: ++// The micro scheduler calls size() of each compound node during scheduling. size() does a ++// dummy emit and only during this dummy emit C->hb_scheduling() is not NULL. ++#if 0 // TODO: PPC port ++#define ___(op) if (UsePower6SchedulerPPC64 && C->hb_scheduling()) \ ++ C->hb_scheduling()->_pdScheduling->PdEmulatePipe(ppc64Opcode_##op); \ ++ _masm. ++#define ___stop if (UsePower6SchedulerPPC64 && C->hb_scheduling()) \ ++ C->hb_scheduling()->_pdScheduling->PdEmulatePipe(archOpcode_none) ++#define ___advance if (UsePower6SchedulerPPC64 && C->hb_scheduling()) \ ++ C->hb_scheduling()->_pdScheduling->advance_offset ++#else ++#define ___(op) if (UsePower6SchedulerPPC64) \ ++ Unimplemented(); \ ++ _masm. ++#define ___stop if (UsePower6SchedulerPPC64) \ ++ Unimplemented() ++#define ___advance if (UsePower6SchedulerPPC64) \ ++ Unimplemented() ++#endif ++ ++void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { ++ Compile* C = ra_->C; ++ MacroAssembler _masm(&cbuf); ++ ++ const long framesize = C->frame_size_in_bytes(); ++ assert(framesize % (2 * wordSize) == 0, "must preserve 2*wordSize alignment"); ++ ++ const bool method_is_frameless = false /* TODO: PPC port C->is_frameless_method()*/; ++ ++ const Register return_pc = R20; // Must match return_addr() in frame section. ++ const Register callers_sp = R21; ++ const Register push_frame_temp = R22; ++ const Register toc_temp = R23; ++ assert_different_registers(R11, return_pc, callers_sp, push_frame_temp, toc_temp); ++ ++ if (method_is_frameless) { ++ // Add nop at beginning of all frameless methods to prevent any ++ // oop instructions from getting overwritten by make_not_entrant ++ // (patching attempt would fail). ++ ___(nop) nop(); ++ } else { ++ // Get return pc. ++ ___(mflr) mflr(return_pc); ++ } ++ ++ // Calls to C2R adapters often do not accept exceptional returns. ++ // We require that their callers must bang for them. But be ++ // careful, because some VM calls (such as call site linkage) can ++ // use several kilobytes of stack. But the stack safety zone should ++ // account for that. See bugs 4446381, 4468289, 4497237. ++ ++ int bangsize = C->bang_size_in_bytes(); ++ assert(bangsize >= framesize || bangsize <= 0, "stack bang size incorrect"); ++ if (C->need_stack_bang(bangsize) && UseStackBanging) { ++ // Unfortunately we cannot use the function provided in ++ // assembler.cpp as we have to emulate the pipes. So I had to ++ // insert the code of generate_stack_overflow_check(), see ++ // assembler.cpp for some illuminative comments. ++ const int page_size = os::vm_page_size(); ++ int bang_end = StackShadowPages * page_size; ++ ++ // This is how far the previous frame's stack banging extended. ++ const int bang_end_safe = bang_end; ++ ++ if (bangsize > page_size) { ++ bang_end += bangsize; ++ } ++ ++ int bang_offset = bang_end_safe; ++ ++ while (bang_offset <= bang_end) { ++ // Need at least one stack bang at end of shadow zone. ++ ++ // Again I had to copy code, this time from assembler_ppc64.cpp, ++ // bang_stack_with_offset - see there for comments. ++ ++ // Stack grows down, caller passes positive offset. ++ assert(bang_offset > 0, "must bang with positive offset"); ++ ++ long stdoffset = -bang_offset; ++ ++ if (Assembler::is_simm(stdoffset, 16)) { ++ // Signed 16 bit offset, a simple std is ok. ++ if (UseLoadInstructionsForStackBangingPPC64) { ++ ___(ld) ld(R0, (int)(signed short)stdoffset, R1_SP); ++ } else { ++ ___(std) std(R0, (int)(signed short)stdoffset, R1_SP); ++ } ++ } else if (Assembler::is_simm(stdoffset, 31)) { ++ // Use largeoffset calculations for addis & ld/std. ++ const int hi = MacroAssembler::largeoffset_si16_si16_hi(stdoffset); ++ const int lo = MacroAssembler::largeoffset_si16_si16_lo(stdoffset); ++ ++ Register tmp = R11; ++ ___(addis) addis(tmp, R1_SP, hi); ++ if (UseLoadInstructionsForStackBangingPPC64) { ++ ___(ld) ld(R0, lo, tmp); ++ } else { ++ ___(std) std(R0, lo, tmp); ++ } ++ } else { ++ ShouldNotReachHere(); ++ } ++ ++ bang_offset += page_size; ++ } ++ // R11 trashed ++ } // C->need_stack_bang(framesize) && UseStackBanging ++ ++ unsigned int bytes = (unsigned int)framesize; ++ long offset = Assembler::align_addr(bytes, frame::alignment_in_bytes); ++ ciMethod *currMethod = C->method(); ++ ++ // Optimized version for most common case. ++ if (UsePower6SchedulerPPC64 && ++ !method_is_frameless && Assembler::is_simm((int)(-offset), 16) && ++ !(false /* ConstantsALot TODO: PPC port*/)) { ++ ___(or) mr(callers_sp, R1_SP); ++ ___(std) std(return_pc, _abi(lr), R1_SP); ++ ___(stdu) stdu(R1_SP, -offset, R1_SP); ++ return; ++ } ++ ++ if (!method_is_frameless) { ++ // Get callers sp. ++ ___(or) mr(callers_sp, R1_SP); ++ ++ // Push method's frame, modifies SP. ++ assert(Assembler::is_uimm(framesize, 32U), "wrong type"); ++ // The ABI is already accounted for in 'framesize' via the ++ // 'out_preserve' area. ++ Register tmp = push_frame_temp; ++ // Had to insert code of push_frame((unsigned int)framesize, push_frame_temp). ++ if (Assembler::is_simm(-offset, 16)) { ++ ___(stdu) stdu(R1_SP, -offset, R1_SP); ++ } else { ++ long x = -offset; ++ // Had to insert load_const(tmp, -offset). ++ ___(addis) lis( tmp, (int)((signed short)(((x >> 32) & 0xffff0000) >> 16))); ++ ___(ori) ori( tmp, tmp, ((x >> 32) & 0x0000ffff)); ++ ___(rldicr) sldi(tmp, tmp, 32); ++ ___(oris) oris(tmp, tmp, (x & 0xffff0000) >> 16); ++ ___(ori) ori( tmp, tmp, (x & 0x0000ffff)); ++ ++ ___(stdux) stdux(R1_SP, R1_SP, tmp); ++ } ++ } ++#if 0 // TODO: PPC port ++ // For testing large constant pools, emit a lot of constants to constant pool. ++ // "Randomize" const_size. ++ if (ConstantsALot) { ++ const int num_consts = const_size(); ++ for (int i = 0; i < num_consts; i++) { ++ __ long_constant(0xB0B5B00BBABE); ++ } ++ } ++#endif ++ if (!method_is_frameless) { ++ // Save return pc. ++ ___(std) std(return_pc, _abi(lr), callers_sp); ++ } ++} ++#undef ___ ++#undef ___stop ++#undef ___advance ++ ++uint MachPrologNode::size(PhaseRegAlloc *ra_) const { ++ // Variable size. determine dynamically. ++ return MachNode::size(ra_); ++} ++ ++int MachPrologNode::reloc() const { ++ // Return number of relocatable values contained in this instruction. ++ return 1; // 1 reloc entry for load_const(toc). ++} ++ ++//============================================================================= ++ ++#ifndef PRODUCT ++void MachEpilogNode::format(PhaseRegAlloc *ra_, outputStream *st) const { ++ Compile* C = ra_->C; ++ ++ st->print("EPILOG\n\t"); ++ st->print("restore return pc\n\t"); ++ st->print("pop frame\n\t"); ++ ++ if (do_polling() && C->is_method_compilation()) { ++ st->print("touch polling page\n\t"); ++ } ++} ++#endif ++ ++void MachEpilogNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { ++ Compile* C = ra_->C; ++ MacroAssembler _masm(&cbuf); ++ ++ const long framesize = ((long)C->frame_slots()) << LogBytesPerInt; ++ assert(framesize >= 0, "negative frame-size?"); ++ ++ const bool method_needs_polling = do_polling() && C->is_method_compilation(); ++ const bool method_is_frameless = false /* TODO: PPC port C->is_frameless_method()*/; ++ const Register return_pc = R11; ++ const Register polling_page = R12; ++ ++ if (!method_is_frameless) { ++ // Restore return pc relative to callers' sp. ++ __ ld(return_pc, ((int)framesize) + _abi(lr), R1_SP); ++ } ++ ++ if (method_needs_polling) { ++ if (LoadPollAddressFromThread) { ++ // TODO: PPC port __ ld(polling_page, in_bytes(JavaThread::poll_address_offset()), R16_thread); ++ Unimplemented(); ++ } else { ++ __ load_const_optimized(polling_page, (long)(address) os::get_polling_page()); // TODO: PPC port: get_standard_polling_page() ++ } ++ } ++ ++ if (!method_is_frameless) { ++ // Move return pc to LR. ++ __ mtlr(return_pc); ++ // Pop frame (fixed frame-size). ++ __ addi(R1_SP, R1_SP, (int)framesize); ++ } ++ ++ if (method_needs_polling) { ++ // We need to mark the code position where the load from the safepoint ++ // polling page was emitted as relocInfo::poll_return_type here. ++ __ relocate(relocInfo::poll_return_type); ++ __ load_from_polling_page(polling_page); ++ } ++} ++ ++uint MachEpilogNode::size(PhaseRegAlloc *ra_) const { ++ // Variable size. Determine dynamically. ++ return MachNode::size(ra_); ++} ++ ++int MachEpilogNode::reloc() const { ++ // Return number of relocatable values contained in this instruction. ++ return 1; // 1 for load_from_polling_page. ++} ++ ++const Pipeline * MachEpilogNode::pipeline() const { ++ return MachNode::pipeline_class(); ++} ++ ++// This method seems to be obsolete. It is declared in machnode.hpp ++// and defined in all *.ad files, but it is never called. Should we ++// get rid of it? ++int MachEpilogNode::safepoint_offset() const { ++ assert(do_polling(), "no return for this epilog node"); ++ return 0; ++} ++ ++#if 0 // TODO: PPC port ++void MachLoadPollAddrLateNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const { ++ MacroAssembler _masm(&cbuf); ++ if (LoadPollAddressFromThread) { ++ _masm.ld(R11, in_bytes(JavaThread::poll_address_offset()), R16_thread); ++ } else { ++ _masm.nop(); ++ } ++} ++ ++uint MachLoadPollAddrLateNode::size(PhaseRegAlloc* ra_) const { ++ if (LoadPollAddressFromThread) { ++ return 4; ++ } else { ++ return 4; ++ } ++} ++ ++#ifndef PRODUCT ++void MachLoadPollAddrLateNode::format(PhaseRegAlloc* ra_, outputStream* st) const { ++ st->print_cr(" LD R11, PollAddressOffset, R16_thread \t// LoadPollAddressFromThread"); ++} ++#endif ++ ++const RegMask &MachLoadPollAddrLateNode::out_RegMask() const { ++ return RSCRATCH1_BITS64_REG_mask(); ++} ++#endif // PPC port ++ ++// ============================================================================= ++ ++// Figure out which register class each belongs in: rc_int, rc_float or ++// rc_stack. ++enum RC { rc_bad, rc_int, rc_float, rc_stack }; ++ ++static enum RC rc_class(OptoReg::Name reg) { ++ // Return the register class for the given register. The given register ++ // reg is a _num value, which is an index into the MachRegisterNumbers ++ // enumeration in adGlobals_ppc64.hpp. ++ ++ if (reg == OptoReg::Bad) return rc_bad; ++ ++ // We have 64 integer register halves, starting at index 0. ++ if (reg < 64) return rc_int; ++ ++ // We have 64 floating-point register halves, starting at index 64. ++ if (reg < 64+64) return rc_float; ++ ++ // Between float regs & stack are the flags regs. ++ assert(OptoReg::is_stack(reg), "blow up if spilling flags"); ++ ++ return rc_stack; ++} ++ ++static int ld_st_helper(CodeBuffer *cbuf, const char *op_str, uint opcode, int reg, int offset, ++ bool do_print, Compile* C, outputStream *st) { ++ ++ assert(opcode == Assembler::LD_OPCODE || ++ opcode == Assembler::STD_OPCODE || ++ opcode == Assembler::LWZ_OPCODE || ++ opcode == Assembler::STW_OPCODE || ++ opcode == Assembler::LFD_OPCODE || ++ opcode == Assembler::STFD_OPCODE || ++ opcode == Assembler::LFS_OPCODE || ++ opcode == Assembler::STFS_OPCODE, ++ "opcode not supported"); ++ ++ if (cbuf) { ++ int d = ++ (Assembler::LD_OPCODE == opcode || Assembler::STD_OPCODE == opcode) ? ++ Assembler::ds(offset+0 /* TODO: PPC port C->frame_slots_sp_bias_in_bytes()*/) ++ : Assembler::d1(offset+0 /* TODO: PPC port C->frame_slots_sp_bias_in_bytes()*/); // Makes no difference in opt build. ++ emit_long(*cbuf, opcode | Assembler::rt(Matcher::_regEncode[reg]) | d | Assembler::ra(R1_SP)); ++ } ++#ifndef PRODUCT ++ else if (do_print) { ++ st->print("%-7s %s, [R1_SP + #%d+%d] \t// spill copy", ++ op_str, ++ Matcher::regName[reg], ++ offset, 0 /* TODO: PPC port C->frame_slots_sp_bias_in_bytes()*/); ++ } ++#endif ++ return 4; // size ++} ++ ++uint MachSpillCopyNode::implementation(CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream *st) const { ++ Compile* C = ra_->C; ++ ++ // Get registers to move. ++ OptoReg::Name src_hi = ra_->get_reg_second(in(1)); ++ OptoReg::Name src_lo = ra_->get_reg_first(in(1)); ++ OptoReg::Name dst_hi = ra_->get_reg_second(this); ++ OptoReg::Name dst_lo = ra_->get_reg_first(this); ++ ++ enum RC src_hi_rc = rc_class(src_hi); ++ enum RC src_lo_rc = rc_class(src_lo); ++ enum RC dst_hi_rc = rc_class(dst_hi); ++ enum RC dst_lo_rc = rc_class(dst_lo); ++ ++ assert(src_lo != OptoReg::Bad && dst_lo != OptoReg::Bad, "must move at least 1 register"); ++ if (src_hi != OptoReg::Bad) ++ assert((src_lo&1)==0 && src_lo+1==src_hi && ++ (dst_lo&1)==0 && dst_lo+1==dst_hi, ++ "expected aligned-adjacent pairs"); ++ // Generate spill code! ++ int size = 0; ++ ++ if (src_lo == dst_lo && src_hi == dst_hi) ++ return size; // Self copy, no move. ++ ++ // -------------------------------------- ++ // Memory->Memory Spill. Use R0 to hold the value. ++ if (src_lo_rc == rc_stack && dst_lo_rc == rc_stack) { ++ int src_offset = ra_->reg2offset(src_lo); ++ int dst_offset = ra_->reg2offset(dst_lo); ++ if (src_hi != OptoReg::Bad) { ++ assert(src_hi_rc==rc_stack && dst_hi_rc==rc_stack, ++ "expected same type of move for high parts"); ++ size += ld_st_helper(cbuf, "LD ", Assembler::LD_OPCODE, R0_num, src_offset, !do_size, C, st); ++ if (!cbuf && !do_size) st->print("\n\t"); ++ size += ld_st_helper(cbuf, "STD ", Assembler::STD_OPCODE, R0_num, dst_offset, !do_size, C, st); ++ } else { ++ size += ld_st_helper(cbuf, "LWZ ", Assembler::LWZ_OPCODE, R0_num, src_offset, !do_size, C, st); ++ if (!cbuf && !do_size) st->print("\n\t"); ++ size += ld_st_helper(cbuf, "STW ", Assembler::STW_OPCODE, R0_num, dst_offset, !do_size, C, st); ++ } ++ return size; ++ } ++ ++ // -------------------------------------- ++ // Check for float->int copy; requires a trip through memory. ++ if (src_lo_rc == rc_float && dst_lo_rc == rc_int) { ++ Unimplemented(); ++ } ++ ++ // -------------------------------------- ++ // Check for integer reg-reg copy. ++ if (src_lo_rc == rc_int && dst_lo_rc == rc_int) { ++ Register Rsrc = as_Register(Matcher::_regEncode[src_lo]); ++ Register Rdst = as_Register(Matcher::_regEncode[dst_lo]); ++ size = (Rsrc != Rdst) ? 4 : 0; ++ ++ if (cbuf) { ++ MacroAssembler _masm(cbuf); ++ if (size) { ++ __ mr(Rdst, Rsrc); ++ } ++ } ++#ifndef PRODUCT ++ else if (!do_size) { ++ if (size) { ++ st->print("%-7s %s, %s \t// spill copy", "MR", Matcher::regName[dst_lo], Matcher::regName[src_lo]); ++ } else { ++ st->print("%-7s %s, %s \t// spill copy", "MR-NOP", Matcher::regName[dst_lo], Matcher::regName[src_lo]); ++ } ++ } ++#endif ++ return size; ++ } ++ ++ // Check for integer store. ++ if (src_lo_rc == rc_int && dst_lo_rc == rc_stack) { ++ int dst_offset = ra_->reg2offset(dst_lo); ++ if (src_hi != OptoReg::Bad) { ++ assert(src_hi_rc==rc_int && dst_hi_rc==rc_stack, ++ "expected same type of move for high parts"); ++ size += ld_st_helper(cbuf, "STD ", Assembler::STD_OPCODE, src_lo, dst_offset, !do_size, C, st); ++ } else { ++ size += ld_st_helper(cbuf, "STW ", Assembler::STW_OPCODE, src_lo, dst_offset, !do_size, C, st); ++ } ++ return size; ++ } ++ ++ // Check for integer load. ++ if (dst_lo_rc == rc_int && src_lo_rc == rc_stack) { ++ int src_offset = ra_->reg2offset(src_lo); ++ if (src_hi != OptoReg::Bad) { ++ assert(dst_hi_rc==rc_int && src_hi_rc==rc_stack, ++ "expected same type of move for high parts"); ++ size += ld_st_helper(cbuf, "LD ", Assembler::LD_OPCODE, dst_lo, src_offset, !do_size, C, st); ++ } else { ++ size += ld_st_helper(cbuf, "LWZ ", Assembler::LWZ_OPCODE, dst_lo, src_offset, !do_size, C, st); ++ } ++ return size; ++ } ++ ++ // Check for float reg-reg copy. ++ if (src_lo_rc == rc_float && dst_lo_rc == rc_float) { ++ if (cbuf) { ++ MacroAssembler _masm(cbuf); ++ FloatRegister Rsrc = as_FloatRegister(Matcher::_regEncode[src_lo]); ++ FloatRegister Rdst = as_FloatRegister(Matcher::_regEncode[dst_lo]); ++ __ fmr(Rdst, Rsrc); ++ } ++#ifndef PRODUCT ++ else if (!do_size) { ++ st->print("%-7s %s, %s \t// spill copy", "FMR", Matcher::regName[dst_lo], Matcher::regName[src_lo]); ++ } ++#endif ++ return 4; ++ } ++ ++ // Check for float store. ++ if (src_lo_rc == rc_float && dst_lo_rc == rc_stack) { ++ int dst_offset = ra_->reg2offset(dst_lo); ++ if (src_hi != OptoReg::Bad) { ++ assert(src_hi_rc==rc_float && dst_hi_rc==rc_stack, ++ "expected same type of move for high parts"); ++ size += ld_st_helper(cbuf, "STFD", Assembler::STFD_OPCODE, src_lo, dst_offset, !do_size, C, st); ++ } else { ++ size += ld_st_helper(cbuf, "STFS", Assembler::STFS_OPCODE, src_lo, dst_offset, !do_size, C, st); ++ } ++ return size; ++ } ++ ++ // Check for float load. ++ if (dst_lo_rc == rc_float && src_lo_rc == rc_stack) { ++ int src_offset = ra_->reg2offset(src_lo); ++ if (src_hi != OptoReg::Bad) { ++ assert(dst_hi_rc==rc_float && src_hi_rc==rc_stack, ++ "expected same type of move for high parts"); ++ size += ld_st_helper(cbuf, "LFD ", Assembler::LFD_OPCODE, dst_lo, src_offset, !do_size, C, st); ++ } else { ++ size += ld_st_helper(cbuf, "LFS ", Assembler::LFS_OPCODE, dst_lo, src_offset, !do_size, C, st); ++ } ++ return size; ++ } ++ ++ // -------------------------------------------------------------------- ++ // Check for hi bits still needing moving. Only happens for misaligned ++ // arguments to native calls. ++ if (src_hi == dst_hi) ++ return size; // Self copy; no move. ++ ++ assert(src_hi_rc != rc_bad && dst_hi_rc != rc_bad, "src_hi & dst_hi cannot be Bad"); ++ ShouldNotReachHere(); // Unimplemented ++ return 0; ++} ++ ++#ifndef PRODUCT ++void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream *st) const { ++ if (!ra_) ++ st->print("N%d = SpillCopy(N%d)", _idx, in(1)->_idx); ++ else ++ implementation(NULL, ra_, false, st); ++} ++#endif ++ ++void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { ++ implementation(&cbuf, ra_, false, NULL); ++} ++ ++uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const { ++ return implementation(NULL, ra_, true, NULL); ++} ++ ++#if 0 // TODO: PPC port ++ArchOpcode MachSpillCopyNode_archOpcode(MachSpillCopyNode *n, PhaseRegAlloc *ra_) { ++#ifndef PRODUCT ++ if (ra_->node_regs_max_index() == 0) return archOpcode_undefined; ++#endif ++ assert(ra_->node_regs_max_index() != 0, ""); ++ ++ // Get registers to move. ++ OptoReg::Name src_hi = ra_->get_reg_second(n->in(1)); ++ OptoReg::Name src_lo = ra_->get_reg_first(n->in(1)); ++ OptoReg::Name dst_hi = ra_->get_reg_second(n); ++ OptoReg::Name dst_lo = ra_->get_reg_first(n); ++ ++ enum RC src_lo_rc = rc_class(src_lo); ++ enum RC dst_lo_rc = rc_class(dst_lo); ++ ++ if (src_lo == dst_lo && src_hi == dst_hi) ++ return ppc64Opcode_none; // Self copy, no move. ++ ++ // -------------------------------------- ++ // Memory->Memory Spill. Use R0 to hold the value. ++ if (src_lo_rc == rc_stack && dst_lo_rc == rc_stack) { ++ return ppc64Opcode_compound; ++ } ++ ++ // -------------------------------------- ++ // Check for float->int copy; requires a trip through memory. ++ if (src_lo_rc == rc_float && dst_lo_rc == rc_int) { ++ Unimplemented(); ++ } ++ ++ // -------------------------------------- ++ // Check for integer reg-reg copy. ++ if (src_lo_rc == rc_int && dst_lo_rc == rc_int) { ++ Register Rsrc = as_Register(Matcher::_regEncode[src_lo]); ++ Register Rdst = as_Register(Matcher::_regEncode[dst_lo]); ++ if (Rsrc == Rdst) { ++ return ppc64Opcode_none; ++ } else { ++ return ppc64Opcode_or; ++ } ++ } ++ ++ // Check for integer store. ++ if (src_lo_rc == rc_int && dst_lo_rc == rc_stack) { ++ if (src_hi != OptoReg::Bad) { ++ return ppc64Opcode_std; ++ } else { ++ return ppc64Opcode_stw; ++ } ++ } ++ ++ // Check for integer load. ++ if (dst_lo_rc == rc_int && src_lo_rc == rc_stack) { ++ if (src_hi != OptoReg::Bad) { ++ return ppc64Opcode_ld; ++ } else { ++ return ppc64Opcode_lwz; ++ } ++ } ++ ++ // Check for float reg-reg copy. ++ if (src_lo_rc == rc_float && dst_lo_rc == rc_float) { ++ return ppc64Opcode_fmr; ++ } ++ ++ // Check for float store. ++ if (src_lo_rc == rc_float && dst_lo_rc == rc_stack) { ++ if (src_hi != OptoReg::Bad) { ++ return ppc64Opcode_stfd; ++ } else { ++ return ppc64Opcode_stfs; ++ } ++ } ++ ++ // Check for float load. ++ if (dst_lo_rc == rc_float && src_lo_rc == rc_stack) { ++ if (src_hi != OptoReg::Bad) { ++ return ppc64Opcode_lfd; ++ } else { ++ return ppc64Opcode_lfs; ++ } ++ } ++ ++ // -------------------------------------------------------------------- ++ // Check for hi bits still needing moving. Only happens for misaligned ++ // arguments to native calls. ++ if (src_hi == dst_hi) ++ return ppc64Opcode_none; // Self copy; no move. ++ ++ ShouldNotReachHere(); ++ return ppc64Opcode_undefined; ++} ++#endif // PPC port ++ ++#ifndef PRODUCT ++void MachNopNode::format(PhaseRegAlloc *ra_, outputStream *st) const { ++ st->print("NOP \t// %d nops to pad for loops.", _count); ++} ++#endif ++ ++void MachNopNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *) const { ++ MacroAssembler _masm(&cbuf); ++ // _count contains the number of nops needed for padding. ++ for (int i = 0; i < _count; i++) { ++ __ nop(); ++ } ++} ++ ++uint MachNopNode::size(PhaseRegAlloc *ra_) const { ++ return _count * 4; ++} ++ ++#ifndef PRODUCT ++void BoxLockNode::format(PhaseRegAlloc *ra_, outputStream *st) const { ++ int offset = ra_->reg2offset(in_RegMask(0).find_first_elem()); ++ int reg = ra_->get_reg_first(this); ++ st->print("ADDI %s, SP, %d \t// box node", Matcher::regName[reg], offset); ++} ++#endif ++ ++void BoxLockNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { ++ MacroAssembler _masm(&cbuf); ++ ++ int offset = ra_->reg2offset(in_RegMask(0).find_first_elem()); ++ int reg = ra_->get_encode(this); ++ ++ if (Assembler::is_simm(offset, 16)) { ++ __ addi(as_Register(reg), R1, offset); ++ } else { ++ ShouldNotReachHere(); ++ } ++} ++ ++uint BoxLockNode::size(PhaseRegAlloc *ra_) const { ++ // BoxLockNode is not a MachNode, so we can't just call MachNode::size(ra_). ++ return 4; ++} ++ ++#ifndef PRODUCT ++void MachUEPNode::format(PhaseRegAlloc *ra_, outputStream *st) const { ++ st->print_cr("---- MachUEPNode ----"); ++ st->print_cr("..."); ++} ++#endif ++ ++void MachUEPNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { ++ // This is the unverified entry point. ++ MacroAssembler _masm(&cbuf); ++ ++ // Inline_cache contains a klass. ++ Register ic_klass = as_Register(Matcher::inline_cache_reg_encode()); ++ Register receiver_klass = R0; // tmp ++ ++ assert_different_registers(ic_klass, receiver_klass, R11_scratch1, R3_ARG1); ++ assert(R11_scratch1 == R11, "need prologue scratch register"); ++ ++ // Check for NULL argument if we don't have implicit null checks. ++ if (!ImplicitNullChecks || !os::zero_page_read_protected()) { ++ if (TrapBasedNullChecks) { ++ __ trap_null_check(R3_ARG1); ++ } else { ++ Label valid; ++ __ cmpdi(CCR0, R3_ARG1, 0); ++ __ bne_predict_taken(CCR0, valid); ++ // We have a null argument, branch to ic_miss_stub. ++ __ b64_patchable((address)SharedRuntime::get_ic_miss_stub(), ++ relocInfo::runtime_call_type); ++ __ bind(valid); ++ } ++ } ++ // Assume argument is not NULL, load klass from receiver. ++ __ load_klass(receiver_klass, R3_ARG1); ++ ++ if (TrapBasedICMissChecks) { ++ __ trap_ic_miss_check(receiver_klass, ic_klass); ++ } else { ++ Label valid; ++ __ cmpd(CCR0, receiver_klass, ic_klass); ++ __ beq_predict_taken(CCR0, valid); ++ // We have an unexpected klass, branch to ic_miss_stub. ++ __ b64_patchable((address)SharedRuntime::get_ic_miss_stub(), ++ relocInfo::runtime_call_type); ++ __ bind(valid); ++ } ++ ++ // Argument is valid and klass is as expected, continue. ++} ++ ++#if 0 // TODO: PPC port ++// Optimize UEP code on z (save a load_const() call in main path). ++int MachUEPNode::ep_offset() { ++ return 0; ++} ++#endif ++ ++uint MachUEPNode::size(PhaseRegAlloc *ra_) const { ++ // Variable size. Determine dynamically. ++ return MachNode::size(ra_); ++} ++ ++//============================================================================= ++ ++%} // interrupt source ++ ++source_hpp %{ // Header information of the source block. ++ ++class HandlerImpl { ++ ++ public: ++ ++ static int emit_exception_handler(CodeBuffer &cbuf); ++ static int emit_deopt_handler(CodeBuffer& cbuf); ++ ++ static uint size_exception_handler() { ++ // The exception_handler is a b64_patchable. ++ return MacroAssembler::b64_patchable_size; ++ } ++ ++ static uint size_deopt_handler() { ++ // The deopt_handler is a bl64_patchable. ++ return MacroAssembler::bl64_patchable_size; ++ } ++ ++}; ++ ++%} // end source_hpp ++ ++source %{ ++ ++int HandlerImpl::emit_exception_handler(CodeBuffer &cbuf) { ++ MacroAssembler _masm(&cbuf); ++ ++ address base = __ start_a_stub(size_exception_handler()); ++ if (base == NULL) return 0; // CodeBuffer::expand failed ++ ++ int offset = __ offset(); ++ __ b64_patchable((address)OptoRuntime::exception_blob()->content_begin(), ++ relocInfo::runtime_call_type); ++ assert(__ offset() - offset == (int)size_exception_handler(), "must be fixed size"); ++ __ end_a_stub(); ++ ++ return offset; ++} ++ ++// The deopt_handler is like the exception handler, but it calls to ++// the deoptimization blob instead of jumping to the exception blob. ++int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf) { ++ MacroAssembler _masm(&cbuf); ++ ++ address base = __ start_a_stub(size_deopt_handler()); ++ if (base == NULL) return 0; // CodeBuffer::expand failed ++ ++ int offset = __ offset(); ++ __ bl64_patchable((address)SharedRuntime::deopt_blob()->unpack(), ++ relocInfo::runtime_call_type); ++ assert(__ offset() - offset == (int) size_deopt_handler(), "must be fixed size"); ++ __ end_a_stub(); ++ ++ return offset; ++} ++ ++//============================================================================= ++ ++// Use a frame slots bias for frameless methods if accessing the stack. ++static int frame_slots_bias(int reg_enc, PhaseRegAlloc* ra_) { ++ if (as_Register(reg_enc) == R1_SP) { ++ return 0; // TODO: PPC port ra_->C->frame_slots_sp_bias_in_bytes(); ++ } ++ return 0; ++} ++ ++const bool Matcher::match_rule_supported(int opcode) { ++ if (!has_match_rule(opcode)) ++ return false; ++ ++ switch (opcode) { ++ case Op_SqrtD: ++ return VM_Version::has_fsqrt(); ++ case Op_CountLeadingZerosI: ++ case Op_CountLeadingZerosL: ++ case Op_CountTrailingZerosI: ++ case Op_CountTrailingZerosL: ++ if (!UseCountLeadingZerosInstructionsPPC64) ++ return false; ++ break; ++ ++ case Op_PopCountI: ++ case Op_PopCountL: ++ return (UsePopCountInstruction && VM_Version::has_popcntw()); ++ ++ case Op_StrComp: ++ return SpecialStringCompareTo; ++ case Op_StrEquals: ++ return SpecialStringEquals; ++ case Op_StrIndexOf: ++ return SpecialStringIndexOf; ++ } ++ ++ return true; // Per default match rules are supported. ++} ++ ++int Matcher::regnum_to_fpu_offset(int regnum) { ++ // No user for this method? ++ Unimplemented(); ++ return 999; ++} ++ ++const bool Matcher::convL2FSupported(void) { ++ // fcfids can do the conversion (>= Power7). ++ // fcfid + frsp showed rounding problem when result should be 0x3f800001. ++ return VM_Version::has_fcfids(); // False means that conversion is done by runtime call. ++} ++ ++// Vector width in bytes. ++const int Matcher::vector_width_in_bytes(BasicType bt) { ++ assert(MaxVectorSize == 8, ""); ++ return 8; ++} ++ ++// Vector ideal reg. ++const int Matcher::vector_ideal_reg(int size) { ++ assert(MaxVectorSize == 8 && size == 8, ""); ++ return Op_RegL; ++} ++ ++const int Matcher::vector_shift_count_ideal_reg(int size) { ++ fatal("vector shift is not supported"); ++ return Node::NotAMachineReg; ++} ++ ++// Limits on vector size (number of elements) loaded into vector. ++const int Matcher::max_vector_size(const BasicType bt) { ++ assert(is_java_primitive(bt), "only primitive type vectors"); ++ return vector_width_in_bytes(bt)/type2aelembytes(bt); ++} ++ ++const int Matcher::min_vector_size(const BasicType bt) { ++ return max_vector_size(bt); // Same as max. ++} ++ ++// PPC doesn't support misaligned vectors store/load. ++const bool Matcher::misaligned_vectors_ok() { ++ return false; ++} ++ ++// PPC AES support not yet implemented ++const bool Matcher::pass_original_key_for_aes() { ++ return false; ++} ++ ++// RETURNS: whether this branch offset is short enough that a short ++// branch can be used. ++// ++// If the platform does not provide any short branch variants, then ++// this method should return `false' for offset 0. ++// ++// `Compile::Fill_buffer' will decide on basis of this information ++// whether to do the pass `Compile::Shorten_branches' at all. ++// ++// And `Compile::Shorten_branches' will decide on basis of this ++// information whether to replace particular branch sites by short ++// ones. ++bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) { ++ // Is the offset within the range of a ppc64 pc relative branch? ++ bool b; ++ ++ const int safety_zone = 3 * BytesPerInstWord; ++ b = Assembler::is_simm((offset<0 ? offset-safety_zone : offset+safety_zone), ++ 29 - 16 + 1 + 2); ++ return b; ++} ++ ++const bool Matcher::isSimpleConstant64(jlong value) { ++ // Probably always true, even if a temp register is required. ++ return true; ++} ++/* TODO: PPC port ++// Make a new machine dependent decode node (with its operands). ++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()); ++ return decode; ++} ++*/ ++// Threshold size for cleararray. ++const int Matcher::init_array_short_size = 8 * BytesPerLong; ++ ++// false => size gets scaled to BytesPerLong, ok. ++const bool Matcher::init_array_count_is_in_bytes = false; ++ ++// Use conditional move (CMOVL) on Power7. ++const int Matcher::long_cmove_cost() { return 0; } // this only makes long cmoves more expensive than int cmoves ++ ++// Suppress CMOVF. Conditional move available (sort of) on PPC64 only from P7 onwards. Not exploited yet. ++// fsel doesn't accept a condition register as input, so this would be slightly different. ++const int Matcher::float_cmove_cost() { return ConditionalMoveLimit; } ++ ++// Power6 requires postalloc expand (see block.cpp for description of postalloc expand). ++const bool Matcher::require_postalloc_expand = true; ++ ++// Should the Matcher clone shifts on addressing modes, expecting them to ++// be subsumed into complex addressing expressions or compute them into ++// registers? True for Intel but false for most RISCs. ++const bool Matcher::clone_shift_expressions = false; ++ ++// Do we need to mask the count passed to shift instructions or does ++// the cpu only look at the lower 5/6 bits anyway? ++// Off, as masks are generated in expand rules where required. ++// Constant shift counts are handled in Ideal phase. ++const bool Matcher::need_masked_shift_count = false; ++ ++// This affects two different things: ++// - how Decode nodes are matched ++// - how ImplicitNullCheck opportunities are recognized ++// If true, the matcher will try to remove all Decodes and match them ++// (as operands) into nodes. NullChecks are not prepared to deal with ++// Decodes by final_graph_reshaping(). ++// If false, final_graph_reshaping() forces the decode behind the Cmp ++// for a NullCheck. The matcher matches the Decode node into a register. ++// Implicit_null_check optimization moves the Decode along with the ++// memory operation back up before the NullCheck. ++bool Matcher::narrow_oop_use_complex_address() { ++ // TODO: PPC port if (MatchDecodeNodes) return true; ++ return false; ++} ++ ++bool Matcher::narrow_klass_use_complex_address() { ++ NOT_LP64(ShouldNotCallThis()); ++ assert(UseCompressedClassPointers, "only for compressed klass code"); ++ // TODO: PPC port if (MatchDecodeNodes) return true; ++ return false; ++} ++ ++// Is it better to copy float constants, or load them directly from memory? ++// Intel can load a float constant from a direct address, requiring no ++// extra registers. Most RISCs will have to materialize an address into a ++// register first, so they would do better to copy the constant from stack. ++const bool Matcher::rematerialize_float_constants = false; ++ ++// If CPU can load and store mis-aligned doubles directly then no fixup is ++// needed. Else we split the double into 2 integer pieces and move it ++// piece-by-piece. Only happens when passing doubles into C code as the ++// Java calling convention forces doubles to be aligned. ++const bool Matcher::misaligned_doubles_ok = true; ++ ++void Matcher::pd_implicit_null_fixup(MachNode *node, uint idx) { ++ Unimplemented(); ++} ++ ++// Advertise here if the CPU requires explicit rounding operations ++// to implement the UseStrictFP mode. ++const bool Matcher::strict_fp_requires_explicit_rounding = false; ++ ++// Do floats take an entire double register or just half? ++// ++// A float occupies a ppc64 double register. For the allocator, a ++// ppc64 double register appears as a pair of float registers. ++bool Matcher::float_in_double() { return true; } ++ ++// Do ints take an entire long register or just half? ++// The relevant question is how the int is callee-saved: ++// the whole long is written but de-opt'ing will have to extract ++// the relevant 32 bits. ++const bool Matcher::int_in_long = true; ++ ++// Constants for c2c and c calling conventions. ++ ++const MachRegisterNumbers iarg_reg[8] = { ++ R3_num, R4_num, R5_num, R6_num, ++ R7_num, R8_num, R9_num, R10_num ++}; ++ ++const MachRegisterNumbers farg_reg[13] = { ++ F1_num, F2_num, F3_num, F4_num, ++ F5_num, F6_num, F7_num, F8_num, ++ F9_num, F10_num, F11_num, F12_num, ++ F13_num ++}; ++ ++const int num_iarg_registers = sizeof(iarg_reg) / sizeof(iarg_reg[0]); ++ ++const int num_farg_registers = sizeof(farg_reg) / sizeof(farg_reg[0]); ++ ++// Return whether or not this register is ever used as an argument. This ++// function is used on startup to build the trampoline stubs in generateOptoStub. ++// Registers not mentioned will be killed by the VM call in the trampoline, and ++// arguments in those registers not be available to the callee. ++bool Matcher::can_be_java_arg(int reg) { ++ // We return true for all registers contained in iarg_reg[] and ++ // farg_reg[] and their virtual halves. ++ // We must include the virtual halves in order to get STDs and LDs ++ // instead of STWs and LWs in the trampoline stubs. ++ ++ if ( reg == R3_num || reg == R3_H_num ++ || reg == R4_num || reg == R4_H_num ++ || reg == R5_num || reg == R5_H_num ++ || reg == R6_num || reg == R6_H_num ++ || reg == R7_num || reg == R7_H_num ++ || reg == R8_num || reg == R8_H_num ++ || reg == R9_num || reg == R9_H_num ++ || reg == R10_num || reg == R10_H_num) ++ return true; ++ ++ if ( reg == F1_num || reg == F1_H_num ++ || reg == F2_num || reg == F2_H_num ++ || reg == F3_num || reg == F3_H_num ++ || reg == F4_num || reg == F4_H_num ++ || reg == F5_num || reg == F5_H_num ++ || reg == F6_num || reg == F6_H_num ++ || reg == F7_num || reg == F7_H_num ++ || reg == F8_num || reg == F8_H_num ++ || reg == F9_num || reg == F9_H_num ++ || reg == F10_num || reg == F10_H_num ++ || reg == F11_num || reg == F11_H_num ++ || reg == F12_num || reg == F12_H_num ++ || reg == F13_num || reg == F13_H_num) ++ return true; ++ ++ return false; ++} ++ ++bool Matcher::is_spillable_arg(int reg) { ++ return can_be_java_arg(reg); ++} ++ ++bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) { ++ return false; ++} ++ ++// Register for DIVI projection of divmodI. ++RegMask Matcher::divI_proj_mask() { ++ ShouldNotReachHere(); ++ return RegMask(); ++} ++ ++// Register for MODI projection of divmodI. ++RegMask Matcher::modI_proj_mask() { ++ ShouldNotReachHere(); ++ return RegMask(); ++} ++ ++// Register for DIVL projection of divmodL. ++RegMask Matcher::divL_proj_mask() { ++ ShouldNotReachHere(); ++ return RegMask(); ++} ++ ++// Register for MODL projection of divmodL. ++RegMask Matcher::modL_proj_mask() { ++ ShouldNotReachHere(); ++ return RegMask(); ++} ++ ++const RegMask Matcher::method_handle_invoke_SP_save_mask() { ++ return RegMask(); ++} ++ ++%} ++ ++//----------ENCODING BLOCK----------------------------------------------------- ++// This block specifies the encoding classes used by the compiler to output ++// byte streams. Encoding classes are parameterized macros used by ++// Machine Instruction Nodes in order to generate the bit encoding of the ++// instruction. Operands specify their base encoding interface with the ++// interface keyword. There are currently supported four interfaces, ++// REG_INTER, CONST_INTER, MEMORY_INTER, & COND_INTER. REG_INTER causes an ++// operand to generate a function which returns its register number when ++// queried. CONST_INTER causes an operand to generate a function which ++// returns the value of the constant when queried. MEMORY_INTER causes an ++// operand to generate four functions which return the Base Register, the ++// Index Register, the Scale Value, and the Offset Value of the operand when ++// queried. COND_INTER causes an operand to generate six functions which ++// return the encoding code (ie - encoding bits for the instruction) ++// associated with each basic boolean condition for a conditional instruction. ++// ++// Instructions specify two basic values for encoding. Again, a function ++// is available to check if the constant displacement is an oop. They use the ++// ins_encode keyword to specify their encoding classes (which must be ++// a sequence of enc_class names, and their parameters, specified in ++// the encoding block), and they use the ++// opcode keyword to specify, in order, their primary, secondary, and ++// tertiary opcode. Only the opcode sections which a particular instruction ++// needs for encoding need to be specified. ++encode %{ ++ enc_class enc_unimplemented %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ MacroAssembler _masm(&cbuf); ++ __ unimplemented("Unimplemented mach node encoding in AD file.", 13); ++ %} ++ ++ enc_class enc_untested %{ ++#ifdef ASSERT ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ MacroAssembler _masm(&cbuf); ++ __ untested("Untested mach node encoding in AD file."); ++#else ++ // TODO: PPC port $archOpcode(ppc64Opcode_none); ++#endif ++ %} ++ ++ enc_class enc_lbz(iRegIdst dst, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lbz); ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lbz($dst$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ++ // Load acquire. ++ enc_class enc_lbz_ac(iRegIdst dst, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lbz($dst$$Register, Idisp, $mem$$base$$Register); ++ __ twi_0($dst$$Register); ++ __ isync(); ++ %} ++ ++ enc_class enc_lhz(iRegIdst dst, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lhz); ++ ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lhz($dst$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ++ // Load acquire. ++ enc_class enc_lhz_ac(iRegIdst dst, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lhz($dst$$Register, Idisp, $mem$$base$$Register); ++ __ twi_0($dst$$Register); ++ __ isync(); ++ %} ++ ++ enc_class enc_lwz(iRegIdst dst, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lwz); ++ ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lwz($dst$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ++ // Load acquire. ++ enc_class enc_lwz_ac(iRegIdst dst, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lwz($dst$$Register, Idisp, $mem$$base$$Register); ++ __ twi_0($dst$$Register); ++ __ isync(); ++ %} ++ ++ enc_class enc_ld(iRegLdst dst, memoryAlg4 mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ld); ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ // Operand 'ds' requires 4-alignment. ++ assert((Idisp & 0x3) == 0, "unaligned offset"); ++ __ ld($dst$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ++ // Load acquire. ++ enc_class enc_ld_ac(iRegLdst dst, memoryAlg4 mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ // Operand 'ds' requires 4-alignment. ++ assert((Idisp & 0x3) == 0, "unaligned offset"); ++ __ ld($dst$$Register, Idisp, $mem$$base$$Register); ++ __ twi_0($dst$$Register); ++ __ isync(); ++ %} ++ ++ enc_class enc_lfd(RegF dst, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lfd); ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lfd($dst$$FloatRegister, Idisp, $mem$$base$$Register); ++ %} ++ ++ enc_class enc_load_long_constL(iRegLdst dst, immL src, iRegLdst toc) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ld); ++ ++ MacroAssembler _masm(&cbuf); ++ int toc_offset = 0; ++ ++ if (!ra_->C->in_scratch_emit_size()) { ++ address const_toc_addr; ++ // Create a non-oop constant, no relocation needed. ++ // If it is an IC, it has a virtual_call_Relocation. ++ const_toc_addr = __ long_constant((jlong)$src$$constant); ++ ++ // Get the constant's TOC offset. ++ toc_offset = __ offset_to_method_toc(const_toc_addr); ++ ++ // Keep the current instruction offset in mind. ++ ((loadConLNode*)this)->_cbuf_insts_offset = __ offset(); ++ } ++ ++ __ ld($dst$$Register, toc_offset, $toc$$Register); ++ %} ++ ++ enc_class enc_load_long_constL_hi(iRegLdst dst, iRegLdst toc, immL src) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ ++ MacroAssembler _masm(&cbuf); ++ ++ if (!ra_->C->in_scratch_emit_size()) { ++ address const_toc_addr; ++ // Create a non-oop constant, no relocation needed. ++ // If it is an IC, it has a virtual_call_Relocation. ++ const_toc_addr = __ long_constant((jlong)$src$$constant); ++ ++ // Get the constant's TOC offset. ++ const int toc_offset = __ offset_to_method_toc(const_toc_addr); ++ // Store the toc offset of the constant. ++ ((loadConL_hiNode*)this)->_const_toc_offset = toc_offset; ++ ++ // Also keep the current instruction offset in mind. ++ ((loadConL_hiNode*)this)->_cbuf_insts_offset = __ offset(); ++ } ++ ++ __ addis($dst$$Register, $toc$$Register, MacroAssembler::largeoffset_si16_si16_hi(_const_toc_offset)); ++ %} ++ ++%} // encode ++ ++source %{ ++ ++typedef struct { ++ loadConL_hiNode *_large_hi; ++ loadConL_loNode *_large_lo; ++ loadConLNode *_small; ++ MachNode *_last; ++} loadConLNodesTuple; ++ ++loadConLNodesTuple loadConLNodesTuple_create(Compile *C, PhaseRegAlloc *ra_, Node *toc, immLOper *immSrc, ++ OptoReg::Name reg_second, OptoReg::Name reg_first) { ++ loadConLNodesTuple nodes; ++ ++ 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(); ++ ++ // 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 ++ ++ // Initialize ins_attrib TOC fields. ++ m1->_const_toc_offset = -1; ++ m2->_const_toc_offset_hi_node = m1; ++ ++ // Initialize ins_attrib instruction offset. ++ m1->_cbuf_insts_offset = -1; ++ ++ // register allocation for new nodes ++ ra_->set_pair(m1->_idx, reg_second, reg_first); ++ ra_->set_pair(m2->_idx, reg_second, reg_first); ++ ++ // Create result. ++ nodes._large_hi = m1; ++ nodes._large_lo = m2; ++ nodes._small = NULL; ++ nodes._last = nodes._large_lo; ++ assert(m2->bottom_type()->isa_long(), "must be long"); ++ } else { ++ loadConLNode *m2 = new (C) 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 ++ ++ // Initialize ins_attrib instruction offset. ++ m2->_cbuf_insts_offset = -1; ++ ++ // register allocation for new nodes ++ ra_->set_pair(m2->_idx, reg_second, reg_first); ++ ++ // Create result. ++ nodes._large_hi = NULL; ++ nodes._large_lo = NULL; ++ nodes._small = m2; ++ nodes._last = nodes._small; ++ assert(m2->bottom_type()->isa_long(), "must be long"); ++ } ++ ++ return nodes; ++} ++ ++%} // source ++ ++encode %{ ++ // Postalloc expand emitter for loading a long constant from the method's TOC. ++ // Enc_class needed as consttanttablebase is not supported by postalloc ++ // expand. ++ enc_class postalloc_expand_load_long_constant(iRegLdst dst, immL src, iRegLdst toc) %{ ++ // Create new nodes. ++ loadConLNodesTuple loadConLNodes = ++ loadConLNodesTuple_create(C, ra_, n_toc, op_src, ++ ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ // Push new nodes. ++ if (loadConLNodes._large_hi) nodes->push(loadConLNodes._large_hi); ++ if (loadConLNodes._last) nodes->push(loadConLNodes._last); ++ ++ // some asserts ++ assert(nodes->length() >= 1, "must have created at least 1 node"); ++ assert(loadConLNodes._last->bottom_type()->isa_long(), "must be long"); ++ %} ++ ++ enc_class enc_load_long_constP(iRegLdst dst, immP src, iRegLdst toc) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ld); ++ ++ MacroAssembler _masm(&cbuf); ++ int toc_offset = 0; ++ ++ if (!ra_->C->in_scratch_emit_size()) { ++ intptr_t val = $src$$constant; ++ relocInfo::relocType constant_reloc = $src->constant_reloc(); // src ++ address const_toc_addr; ++ if (constant_reloc == relocInfo::oop_type) { ++ // Create an oop constant and a corresponding relocation. ++ AddressLiteral a = __ allocate_oop_address((jobject)val); ++ const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none); ++ __ relocate(a.rspec()); ++ } else if (constant_reloc == relocInfo::metadata_type) { ++ AddressLiteral a = __ allocate_metadata_address((Metadata *)val); ++ const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none); ++ __ relocate(a.rspec()); ++ } else { ++ // Create a non-oop constant, no relocation needed. ++ const_toc_addr = __ long_constant((jlong)$src$$constant); ++ } ++ ++ // Get the constant's TOC offset. ++ toc_offset = __ offset_to_method_toc(const_toc_addr); ++ } ++ ++ __ ld($dst$$Register, toc_offset, $toc$$Register); ++ %} ++ ++ enc_class enc_load_long_constP_hi(iRegLdst dst, immP src, iRegLdst toc) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ ++ MacroAssembler _masm(&cbuf); ++ if (!ra_->C->in_scratch_emit_size()) { ++ intptr_t val = $src$$constant; ++ relocInfo::relocType constant_reloc = $src->constant_reloc(); // src ++ address const_toc_addr; ++ if (constant_reloc == relocInfo::oop_type) { ++ // Create an oop constant and a corresponding relocation. ++ AddressLiteral a = __ allocate_oop_address((jobject)val); ++ const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none); ++ __ relocate(a.rspec()); ++ } else if (constant_reloc == relocInfo::metadata_type) { ++ AddressLiteral a = __ allocate_metadata_address((Metadata *)val); ++ const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none); ++ __ relocate(a.rspec()); ++ } else { // non-oop pointers, e.g. card mark base, heap top ++ // Create a non-oop constant, no relocation needed. ++ const_toc_addr = __ long_constant((jlong)$src$$constant); ++ } ++ ++ // Get the constant's TOC offset. ++ const int toc_offset = __ offset_to_method_toc(const_toc_addr); ++ // Store the toc offset of the constant. ++ ((loadConP_hiNode*)this)->_const_toc_offset = toc_offset; ++ } ++ ++ __ addis($dst$$Register, $toc$$Register, MacroAssembler::largeoffset_si16_si16_hi(_const_toc_offset)); ++ %} ++ ++ // Postalloc expand emitter for loading a ptr constant from the method's TOC. ++ // Enc_class needed as consttanttablebase is not supported by postalloc ++ // expand. ++ enc_class postalloc_expand_load_ptr_constant(iRegPdst dst, immP src, iRegLdst toc) %{ ++ 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(); ++ ++ // 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 ++ ++ // Initialize ins_attrib TOC fields. ++ m1->_const_toc_offset = -1; ++ m2->_const_toc_offset_hi_node = m1; ++ ++ // Register allocation for new nodes. ++ ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ nodes->push(m1); ++ nodes->push(m2); ++ assert(m2->bottom_type()->isa_ptr(), "must be ptr"); ++ } else { ++ loadConPNode *m2 = new (C) 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 ++ ++ // Register allocation for new nodes. ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ nodes->push(m2); ++ assert(m2->bottom_type()->isa_ptr(), "must be ptr"); ++ } ++ %} ++ ++ // Enc_class needed as consttanttablebase is not supported by postalloc ++ // expand. ++ enc_class postalloc_expand_load_float_constant(regF dst, immF src, iRegLdst toc) %{ ++ bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; ++ ++ MachNode *m2; ++ if (large_constant_pool) { ++ m2 = new (C) loadConFCompNode(); ++ } else { ++ m2 = new (C) loadConFNode(); ++ } ++ // inputs for new nodes ++ m2->add_req(NULL, n_toc); ++ ++ // operands for new nodes ++ m2->_opnds[0] = op_dst; ++ m2->_opnds[1] = op_src; ++ m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase ++ ++ // register allocation for new nodes ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ nodes->push(m2); ++ %} ++ ++ // Enc_class needed as consttanttablebase is not supported by postalloc ++ // expand. ++ enc_class postalloc_expand_load_double_constant(regD dst, immD src, iRegLdst toc) %{ ++ bool large_constant_pool = true; // TODO: PPC port C->cfg()->_consts_size > 4000; ++ ++ MachNode *m2; ++ if (large_constant_pool) { ++ m2 = new (C) loadConDCompNode(); ++ } else { ++ m2 = new (C) loadConDNode(); ++ } ++ // inputs for new nodes ++ m2->add_req(NULL, n_toc); ++ ++ // operands for new nodes ++ m2->_opnds[0] = op_dst; ++ m2->_opnds[1] = op_src; ++ m2->_opnds[2] = new (C) iRegPdstOper(); // constanttablebase ++ ++ // register allocation for new nodes ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ nodes->push(m2); ++ %} ++ ++ enc_class enc_stw(iRegIsrc src, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_stw); ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ stw($src$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ++ enc_class enc_std(iRegIsrc src, memoryAlg4 mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_std); ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ // Operand 'ds' requires 4-alignment. ++ assert((Idisp & 0x3) == 0, "unaligned offset"); ++ __ std($src$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ++ enc_class enc_stfs(RegF src, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_stfs); ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ stfs($src$$FloatRegister, Idisp, $mem$$base$$Register); ++ %} ++ ++ enc_class enc_stfd(RegF src, memory mem) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_stfd); ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ stfd($src$$FloatRegister, Idisp, $mem$$base$$Register); ++ %} ++ ++ // Use release_store for card-marking to ensure that previous ++ // oop-stores are visible before the card-mark change. ++ enc_class enc_cms_card_mark(memory mem, iRegLdst releaseFieldAddr) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ // FIXME: Implement this as a cmove and use a fixed condition code ++ // register which is written on every transition to compiled code, ++ // e.g. in call-stub and when returning from runtime stubs. ++ // ++ // Proposed code sequence for the cmove implementation: ++ // ++ // Label skip_release; ++ // __ beq(CCRfixed, skip_release); ++ // __ release(); ++ // __ bind(skip_release); ++ // __ stb(card mark); ++ ++ MacroAssembler _masm(&cbuf); ++ Label skip_storestore; ++ ++#if 0 // TODO: PPC port ++ // Check CMSCollectorCardTableModRefBSExt::_requires_release and do the ++ // StoreStore barrier conditionally. ++ __ lwz(R0, 0, $releaseFieldAddr$$Register); ++ __ cmpwi(CCR0, R0, 0); ++ __ beq_predict_taken(CCR0, skip_storestore); ++#endif ++ __ li(R0, 0); ++ __ membar(Assembler::StoreStore); ++#if 0 // TODO: PPC port ++ __ bind(skip_storestore); ++#endif ++ ++ // Do the store. ++ if ($mem$$index == 0) { ++ __ stb(R0, $mem$$disp, $mem$$base$$Register); ++ } else { ++ assert(0 == $mem$$disp, "no displacement possible with indexed load/stores on ppc"); ++ __ stbx(R0, $mem$$base$$Register, $mem$$index$$Register); ++ } ++ %} ++ ++ enc_class postalloc_expand_encode_oop(iRegNdst dst, iRegPdst src, flagsReg crx) %{ ++ ++ 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(); ++ ++ 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_sub_base->add_req(n_region, n_src); ++ n_sub_base->_opnds[0] = op_dst; ++ n_sub_base->_opnds[1] = op_src; ++ n_sub_base->_bottom_type = _bottom_type; ++ ++ n_shift->add_req(n_region, n_sub_base); ++ n_shift->_opnds[0] = op_dst; ++ n_shift->_opnds[1] = op_dst; ++ n_shift->_bottom_type = _bottom_type; ++ ++ n_cond_set->add_req(n_region, n_compare, n_shift); ++ n_cond_set->_opnds[0] = op_dst; ++ n_cond_set->_opnds[1] = op_crx; ++ n_cond_set->_opnds[2] = op_dst; ++ n_cond_set->_bottom_type = _bottom_type; ++ ++ ra_->set_pair(n_compare->_idx, ra_->get_reg_second(n_crx), ra_->get_reg_first(n_crx)); ++ ra_->set_pair(n_sub_base->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n_shift->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n_cond_set->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ nodes->push(n_compare); ++ nodes->push(n_sub_base); ++ nodes->push(n_shift); ++ nodes->push(n_cond_set); ++ ++ } 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(); ++ ++ n_move->add_req(n_region, n_src); ++ n_move->_opnds[0] = op_dst; ++ n_move->_opnds[1] = op_src; ++ ra_->set_oop(n_move, true); // Until here, 'n_move' still produces an oop. ++ ++ n_compare->add_req(n_region, n_src); ++ n_compare->add_prec(n_move); ++ ++ n_compare->_opnds[0] = op_crx; ++ n_compare->_opnds[1] = op_src; ++ n_compare->_opnds[2] = new (C) immL16Oper(0); ++ ++ n_sub_base->add_req(n_region, n_compare, n_src); ++ n_sub_base->_opnds[0] = op_dst; ++ n_sub_base->_opnds[1] = op_crx; ++ n_sub_base->_opnds[2] = op_src; ++ n_sub_base->_bottom_type = _bottom_type; ++ ++ n_shift->add_req(n_region, n_sub_base); ++ n_shift->_opnds[0] = op_dst; ++ n_shift->_opnds[1] = op_dst; ++ n_shift->_bottom_type = _bottom_type; ++ ++ ra_->set_pair(n_shift->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n_compare->_idx, ra_->get_reg_second(n_crx), ra_->get_reg_first(n_crx)); ++ ra_->set_pair(n_sub_base->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n_move->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ nodes->push(n_move); ++ nodes->push(n_compare); ++ nodes->push(n_sub_base); ++ nodes->push(n_shift); ++ } ++ ++ assert(!(ra_->is_oop(this)), "sanity"); // This is not supposed to be GC'ed. ++ %} ++ ++ enc_class postalloc_expand_encode_oop_not_null(iRegNdst dst, iRegPdst src) %{ ++ ++ encodeP_subNode *n1 = new (C) 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(); ++ n2->add_req(n_region, n1); ++ n2->_opnds[0] = op_dst; ++ n2->_opnds[1] = op_dst; ++ n2->_bottom_type = _bottom_type; ++ ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ nodes->push(n1); ++ nodes->push(n2); ++ assert(!(ra_->is_oop(this)), "sanity"); // This is not supposed to be GC'ed. ++ %} ++ ++ 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(); ++ ++ 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_shift->add_req(n_region, n_src); ++ n_shift->_opnds[0] = op_dst; ++ n_shift->_opnds[1] = op_src; ++ n_shift->_bottom_type = _bottom_type; ++ ++ if (VM_Version::has_isel()) { ++ // use isel instruction with Power 7 ++ ++ decodeN_addNode *n_add_base = new (C) 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(); ++ 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; ++ n_cond_set->_opnds[2] = op_dst; ++ n_cond_set->_bottom_type = _bottom_type; ++ ++ assert(ra_->is_oop(this) == true, "A decodeN node must produce an oop!"); ++ ra_->set_oop(n_cond_set, true); ++ ++ ra_->set_pair(n_shift->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n_compare->_idx, ra_->get_reg_second(n_crx), ra_->get_reg_first(n_crx)); ++ ra_->set_pair(n_add_base->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n_cond_set->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ nodes->push(n_compare); ++ nodes->push(n_shift); ++ nodes->push(n_add_base); ++ nodes->push(n_cond_set); ++ ++ } else { ++ // before Power 7 ++ cond_add_baseNode *n_add_base = new (C) cond_add_baseNode(); ++ ++ n_add_base->add_req(n_region, n_compare, n_shift); ++ n_add_base->_opnds[0] = op_dst; ++ n_add_base->_opnds[1] = op_crx; ++ n_add_base->_opnds[2] = op_dst; ++ n_add_base->_bottom_type = _bottom_type; ++ ++ assert(ra_->is_oop(this) == true, "A decodeN node must produce an oop!"); ++ ra_->set_oop(n_add_base, true); ++ ++ ra_->set_pair(n_shift->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n_compare->_idx, ra_->get_reg_second(n_crx), ra_->get_reg_first(n_crx)); ++ ra_->set_pair(n_add_base->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ nodes->push(n_compare); ++ nodes->push(n_shift); ++ nodes->push(n_add_base); ++ } ++ %} ++ ++ enc_class postalloc_expand_decode_oop_not_null(iRegPdst dst, iRegNsrc src) %{ ++ decodeN_shiftNode *n1 = new (C) 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(); ++ n2->add_req(n_region, n1); ++ n2->_opnds[0] = op_dst; ++ n2->_opnds[1] = op_dst; ++ n2->_bottom_type = _bottom_type; ++ ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ assert(ra_->is_oop(this) == true, "A decodeN node must produce an oop!"); ++ ra_->set_oop(n2, true); ++ ++ nodes->push(n1); ++ nodes->push(n2); ++ %} ++ ++ enc_class enc_cmove_reg(iRegIdst dst, flagsReg crx, iRegIsrc src, cmpOp cmp) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmove); ++ ++ MacroAssembler _masm(&cbuf); ++ int cc = $cmp$$cmpcode; ++ int flags_reg = $crx$$reg; ++ Label done; ++ assert((Assembler::bcondCRbiIs1 & ~Assembler::bcondCRbiIs0) == 8, "check encoding"); ++ // Branch if not (cmp crx). ++ __ bc(cc_to_inverse_boint(cc), cc_to_biint(cc, flags_reg), done); ++ __ mr($dst$$Register, $src$$Register); ++ // TODO PPC port __ endgroup_if_needed(_size == 12); ++ __ bind(done); ++ %} ++ ++ enc_class enc_cmove_imm(iRegIdst dst, flagsReg crx, immI16 src, cmpOp cmp) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmove); ++ ++ MacroAssembler _masm(&cbuf); ++ Label done; ++ assert((Assembler::bcondCRbiIs1 & ~Assembler::bcondCRbiIs0) == 8, "check encoding"); ++ // Branch if not (cmp crx). ++ __ bc(cc_to_inverse_boint($cmp$$cmpcode), cc_to_biint($cmp$$cmpcode, $crx$$reg), done); ++ __ li($dst$$Register, $src$$constant); ++ // TODO PPC port __ endgroup_if_needed(_size == 12); ++ __ bind(done); ++ %} ++ ++ // New atomics. ++ enc_class enc_GetAndAddI(iRegIdst res, iRegPdst mem_ptr, iRegIsrc src) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ Register Rtmp = R0; ++ Register Rres = $res$$Register; ++ Register Rsrc = $src$$Register; ++ Register Rptr = $mem_ptr$$Register; ++ bool RegCollision = (Rres == Rsrc) || (Rres == Rptr); ++ Register Rold = RegCollision ? Rtmp : Rres; ++ ++ Label Lretry; ++ __ bind(Lretry); ++ __ lwarx(Rold, Rptr, MacroAssembler::cmpxchgx_hint_atomic_update()); ++ __ add(Rtmp, Rsrc, Rold); ++ __ stwcx_(Rtmp, Rptr); ++ if (UseStaticBranchPredictionInCompareAndSwapPPC64) { ++ __ bne_predict_not_taken(CCR0, Lretry); ++ } else { ++ __ bne( CCR0, Lretry); ++ } ++ if (RegCollision) __ subf(Rres, Rsrc, Rtmp); ++ __ fence(); ++ %} ++ ++ enc_class enc_GetAndAddL(iRegLdst res, iRegPdst mem_ptr, iRegLsrc src) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ Register Rtmp = R0; ++ Register Rres = $res$$Register; ++ Register Rsrc = $src$$Register; ++ Register Rptr = $mem_ptr$$Register; ++ bool RegCollision = (Rres == Rsrc) || (Rres == Rptr); ++ Register Rold = RegCollision ? Rtmp : Rres; ++ ++ Label Lretry; ++ __ bind(Lretry); ++ __ ldarx(Rold, Rptr, MacroAssembler::cmpxchgx_hint_atomic_update()); ++ __ add(Rtmp, Rsrc, Rold); ++ __ stdcx_(Rtmp, Rptr); ++ if (UseStaticBranchPredictionInCompareAndSwapPPC64) { ++ __ bne_predict_not_taken(CCR0, Lretry); ++ } else { ++ __ bne( CCR0, Lretry); ++ } ++ if (RegCollision) __ subf(Rres, Rsrc, Rtmp); ++ __ fence(); ++ %} ++ ++ enc_class enc_GetAndSetI(iRegIdst res, iRegPdst mem_ptr, iRegIsrc src) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ Register Rtmp = R0; ++ Register Rres = $res$$Register; ++ Register Rsrc = $src$$Register; ++ Register Rptr = $mem_ptr$$Register; ++ bool RegCollision = (Rres == Rsrc) || (Rres == Rptr); ++ Register Rold = RegCollision ? Rtmp : Rres; ++ ++ Label Lretry; ++ __ bind(Lretry); ++ __ lwarx(Rold, Rptr, MacroAssembler::cmpxchgx_hint_atomic_update()); ++ __ stwcx_(Rsrc, Rptr); ++ if (UseStaticBranchPredictionInCompareAndSwapPPC64) { ++ __ bne_predict_not_taken(CCR0, Lretry); ++ } else { ++ __ bne( CCR0, Lretry); ++ } ++ if (RegCollision) __ mr(Rres, Rtmp); ++ __ fence(); ++ %} ++ ++ enc_class enc_GetAndSetL(iRegLdst res, iRegPdst mem_ptr, iRegLsrc src) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ Register Rtmp = R0; ++ Register Rres = $res$$Register; ++ Register Rsrc = $src$$Register; ++ Register Rptr = $mem_ptr$$Register; ++ bool RegCollision = (Rres == Rsrc) || (Rres == Rptr); ++ Register Rold = RegCollision ? Rtmp : Rres; ++ ++ Label Lretry; ++ __ bind(Lretry); ++ __ ldarx(Rold, Rptr, MacroAssembler::cmpxchgx_hint_atomic_update()); ++ __ stdcx_(Rsrc, Rptr); ++ if (UseStaticBranchPredictionInCompareAndSwapPPC64) { ++ __ bne_predict_not_taken(CCR0, Lretry); ++ } else { ++ __ bne( CCR0, Lretry); ++ } ++ if (RegCollision) __ mr(Rres, Rtmp); ++ __ fence(); ++ %} ++ ++ // This enc_class is needed so that scheduler gets proper ++ // input mapping for latency computation. ++ enc_class enc_andc(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_andc); ++ MacroAssembler _masm(&cbuf); ++ __ andc($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ++ enc_class enc_convI2B_regI__cmove(iRegIdst dst, iRegIsrc src, flagsReg crx, immI16 zero, immI16 notzero) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ ++ Label done; ++ __ cmpwi($crx$$CondRegister, $src$$Register, 0); ++ __ li($dst$$Register, $zero$$constant); ++ __ beq($crx$$CondRegister, done); ++ __ li($dst$$Register, $notzero$$constant); ++ __ bind(done); ++ %} ++ ++ enc_class enc_convP2B_regP__cmove(iRegIdst dst, iRegPsrc src, flagsReg crx, immI16 zero, immI16 notzero) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ ++ Label done; ++ __ cmpdi($crx$$CondRegister, $src$$Register, 0); ++ __ li($dst$$Register, $zero$$constant); ++ __ beq($crx$$CondRegister, done); ++ __ li($dst$$Register, $notzero$$constant); ++ __ bind(done); ++ %} ++ ++ enc_class enc_cmove_bso_stackSlotL(iRegLdst dst, flagsReg crx, stackSlotL mem ) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmove); ++ ++ MacroAssembler _masm(&cbuf); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ Label done; ++ __ bso($crx$$CondRegister, done); ++ __ ld($dst$$Register, Idisp, $mem$$base$$Register); ++ // TODO PPC port __ endgroup_if_needed(_size == 12); ++ __ bind(done); ++ %} ++ ++ enc_class enc_bc(flagsReg crx, cmpOp cmp, Label lbl) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_bc); ++ ++ MacroAssembler _masm(&cbuf); ++ Label d; // dummy ++ __ bind(d); ++ Label* p = ($lbl$$label); ++ // `p' is `NULL' when this encoding class is used only to ++ // determine the size of the encoded instruction. ++ Label& l = (NULL == p)? d : *(p); ++ int cc = $cmp$$cmpcode; ++ int flags_reg = $crx$$reg; ++ assert((Assembler::bcondCRbiIs1 & ~Assembler::bcondCRbiIs0) == 8, "check encoding"); ++ int bhint = Assembler::bhintNoHint; ++ ++ if (UseStaticBranchPredictionForUncommonPathsPPC64) { ++ if (_prob <= PROB_NEVER) { ++ bhint = Assembler::bhintIsNotTaken; ++ } else if (_prob >= PROB_ALWAYS) { ++ bhint = Assembler::bhintIsTaken; ++ } ++ } ++ ++ __ bc(Assembler::add_bhint_to_boint(bhint, cc_to_boint(cc)), ++ cc_to_biint(cc, flags_reg), ++ l); ++ %} ++ ++ enc_class enc_bc_far(flagsReg crx, cmpOp cmp, Label lbl) %{ ++ // The scheduler doesn't know about branch shortening, so we set the opcode ++ // to ppc64Opcode_bc in order to hide this detail from the scheduler. ++ // TODO: PPC port $archOpcode(ppc64Opcode_bc); ++ ++ MacroAssembler _masm(&cbuf); ++ Label d; // dummy ++ __ bind(d); ++ Label* p = ($lbl$$label); ++ // `p' is `NULL' when this encoding class is used only to ++ // determine the size of the encoded instruction. ++ Label& l = (NULL == p)? d : *(p); ++ int cc = $cmp$$cmpcode; ++ int flags_reg = $crx$$reg; ++ int bhint = Assembler::bhintNoHint; ++ ++ if (UseStaticBranchPredictionForUncommonPathsPPC64) { ++ if (_prob <= PROB_NEVER) { ++ bhint = Assembler::bhintIsNotTaken; ++ } else if (_prob >= PROB_ALWAYS) { ++ bhint = Assembler::bhintIsTaken; ++ } ++ } ++ ++ // Tell the conditional far branch to optimize itself when being relocated. ++ __ bc_far(Assembler::add_bhint_to_boint(bhint, cc_to_boint(cc)), ++ cc_to_biint(cc, flags_reg), ++ l, ++ MacroAssembler::bc_far_optimize_on_relocate); ++ %} ++ ++ // Branch used with Power6 scheduling (can be shortened without changing the node). ++ enc_class enc_bc_short_far(flagsReg crx, cmpOp cmp, Label lbl) %{ ++ // The scheduler doesn't know about branch shortening, so we set the opcode ++ // to ppc64Opcode_bc in order to hide this detail from the scheduler. ++ // TODO: PPC port $archOpcode(ppc64Opcode_bc); ++ ++ MacroAssembler _masm(&cbuf); ++ Label d; // dummy ++ __ bind(d); ++ Label* p = ($lbl$$label); ++ // `p' is `NULL' when this encoding class is used only to ++ // determine the size of the encoded instruction. ++ Label& l = (NULL == p)? d : *(p); ++ int cc = $cmp$$cmpcode; ++ int flags_reg = $crx$$reg; ++ int bhint = Assembler::bhintNoHint; ++ ++ if (UseStaticBranchPredictionForUncommonPathsPPC64) { ++ if (_prob <= PROB_NEVER) { ++ bhint = Assembler::bhintIsNotTaken; ++ } else if (_prob >= PROB_ALWAYS) { ++ bhint = Assembler::bhintIsTaken; ++ } ++ } ++ ++#if 0 // TODO: PPC port ++ if (_size == 8) { ++ // Tell the conditional far branch to optimize itself when being relocated. ++ __ bc_far(Assembler::add_bhint_to_boint(bhint, cc_to_boint(cc)), ++ cc_to_biint(cc, flags_reg), ++ l, ++ MacroAssembler::bc_far_optimize_on_relocate); ++ } else { ++ __ bc (Assembler::add_bhint_to_boint(bhint, cc_to_boint(cc)), ++ cc_to_biint(cc, flags_reg), ++ l); ++ } ++#endif ++ Unimplemented(); ++ %} ++ ++ // Postalloc expand emitter for loading a replicatef float constant from ++ // the method's TOC. ++ // Enc_class needed as consttanttablebase is not supported by postalloc ++ // expand. ++ enc_class postalloc_expand_load_replF_constant(iRegLdst dst, immF src, iRegLdst toc) %{ ++ // 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())); ++ ++ loadConLNodesTuple loadConLNodes = ++ loadConLNodesTuple_create(C, ra_, n_toc, op_repl, ++ ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ // Push new nodes. ++ if (loadConLNodes._large_hi) nodes->push(loadConLNodes._large_hi); ++ if (loadConLNodes._last) nodes->push(loadConLNodes._last); ++ ++ assert(nodes->length() >= 1, "must have created at least 1 node"); ++ assert(loadConLNodes._last->bottom_type()->isa_long(), "must be long"); ++ %} ++ ++ // This enc_class is needed so that scheduler gets proper ++ // input mapping for latency computation. ++ enc_class enc_poll(immI dst, iRegLdst poll) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ld); ++ // Fake operand dst needed for PPC scheduler. ++ assert($dst$$constant == 0x0, "dst must be 0x0"); ++ ++ MacroAssembler _masm(&cbuf); ++ // Mark the code position where the load from the safepoint ++ // polling page was emitted as relocInfo::poll_type. ++ __ relocate(relocInfo::poll_type); ++ __ load_from_polling_page($poll$$Register); ++ %} ++ ++ // A Java static call or a runtime call. ++ // ++ // Branch-and-link relative to a trampoline. ++ // The trampoline loads the target address and does a long branch to there. ++ // In case we call java, the trampoline branches to a interpreter_stub ++ // which loads the inline cache and the real call target from the constant pool. ++ // ++ // This basically looks like this: ++ // ++ // >>>> consts -+ -+ ++ // | |- offset1 ++ // [call target1] | <-+ ++ // [IC cache] |- offset2 ++ // [call target2] <--+ ++ // ++ // <<<< consts ++ // >>>> insts ++ // ++ // bl offset16 -+ -+ ??? // How many bits available? ++ // | | ++ // <<<< insts | | ++ // >>>> stubs | | ++ // | |- trampoline_stub_Reloc ++ // trampoline stub: | <-+ ++ // r2 = toc | ++ // r2 = [r2 + offset1] | // Load call target1 from const section ++ // mtctr r2 | ++ // bctr |- static_stub_Reloc ++ // comp_to_interp_stub: <---+ ++ // r1 = toc ++ // ICreg = [r1 + IC_offset] // Load IC from const section ++ // r1 = [r1 + offset2] // Load call target2 from const section ++ // mtctr r1 ++ // bctr ++ // ++ // <<<< stubs ++ // ++ // The call instruction in the code either ++ // - Branches directly to a compiled method if the offset is encodable in instruction. ++ // - Branches to the trampoline stub if the offset to the compiled method is not encodable. ++ // - Branches to the compiled_to_interp stub if the target is interpreted. ++ // ++ // Further there are three relocations from the loads to the constants in ++ // the constant section. ++ // ++ // Usage of r1 and r2 in the stubs allows to distinguish them. ++ enc_class enc_java_static_call(method meth) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_bl); ++ ++ MacroAssembler _masm(&cbuf); ++ address entry_point = (address)$meth$$method; ++ ++ if (!_method) { ++ // A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap. ++ emit_call_with_trampoline_stub(_masm, entry_point, relocInfo::runtime_call_type); ++ } else { ++ // Remember the offset not the address. ++ const int start_offset = __ offset(); ++ // The trampoline stub. ++ if (!Compile::current()->in_scratch_emit_size()) { ++ // No entry point given, use the current pc. ++ // Make sure branch fits into ++ if (entry_point == 0) entry_point = __ pc(); ++ ++ // Put the entry point as a constant into the constant pool. ++ const address entry_point_toc_addr = __ address_constant(entry_point, RelocationHolder::none); ++ const int entry_point_toc_offset = __ offset_to_method_toc(entry_point_toc_addr); ++ ++ // Emit the trampoline stub which will be related to the branch-and-link below. ++ CallStubImpl::emit_trampoline_stub(_masm, entry_point_toc_offset, start_offset); ++ __ relocate(_optimized_virtual ? ++ relocInfo::opt_virtual_call_type : relocInfo::static_call_type); ++ } ++ ++ // The real call. ++ // Note: At this point we do not have the address of the trampoline ++ // stub, and the entry point might be too far away for bl, so __ pc() ++ // serves as dummy and the bl will be patched later. ++ cbuf.set_insts_mark(); ++ __ bl(__ pc()); // Emits a relocation. ++ ++ // The stub for call to interpreter. ++ CompiledStaticCall::emit_to_interp_stub(cbuf); ++ } ++ %} ++ ++ // Emit a method handle call. ++ // ++ // Method handle calls from compiled to compiled are going thru a ++ // c2i -> i2c adapter, extending the frame for their arguments. The ++ // caller however, returns directly to the compiled callee, that has ++ // to cope with the extended frame. We restore the original frame by ++ // loading the callers sp and adding the calculated framesize. ++ enc_class enc_java_handle_call(method meth) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ address entry_point = (address)$meth$$method; ++ ++ // Remember the offset not the address. ++ const int start_offset = __ offset(); ++ // The trampoline stub. ++ if (!ra_->C->in_scratch_emit_size()) { ++ // No entry point given, use the current pc. ++ // Make sure branch fits into ++ if (entry_point == 0) entry_point = __ pc(); ++ ++ // Put the entry point as a constant into the constant pool. ++ const address entry_point_toc_addr = __ address_constant(entry_point, RelocationHolder::none); ++ const int entry_point_toc_offset = __ offset_to_method_toc(entry_point_toc_addr); ++ ++ // Emit the trampoline stub which will be related to the branch-and-link below. ++ CallStubImpl::emit_trampoline_stub(_masm, entry_point_toc_offset, start_offset); ++ assert(_optimized_virtual, "methodHandle call should be a virtual call"); ++ __ relocate(relocInfo::opt_virtual_call_type); ++ } ++ ++ // The real call. ++ // Note: At this point we do not have the address of the trampoline ++ // stub, and the entry point might be too far away for bl, so __ pc() ++ // serves as dummy and the bl will be patched later. ++ cbuf.set_insts_mark(); ++ __ bl(__ pc()); // Emits a relocation. ++ ++ assert(_method, "execute next statement conditionally"); ++ // The stub for call to interpreter. ++ CompiledStaticCall::emit_to_interp_stub(cbuf); ++ ++ // Restore original sp. ++ __ ld(R11_scratch1, 0, R1_SP); // Load caller sp. ++ const long framesize = ra_->C->frame_slots() << LogBytesPerInt; ++ unsigned int bytes = (unsigned int)framesize; ++ long offset = Assembler::align_addr(bytes, frame::alignment_in_bytes); ++ if (Assembler::is_simm(-offset, 16)) { ++ __ addi(R1_SP, R11_scratch1, -offset); ++ } else { ++ __ load_const_optimized(R12_scratch2, -offset); ++ __ add(R1_SP, R11_scratch1, R12_scratch2); ++ } ++#ifdef ASSERT ++ __ ld(R12_scratch2, 0, R1_SP); // Load from unextended_sp. ++ __ cmpd(CCR0, R11_scratch1, R12_scratch2); ++ __ asm_assert_eq("backlink changed", 0x8000); ++#endif ++ // If fails should store backlink before unextending. ++ ++ if (ra_->C->env()->failing()) { ++ return; ++ } ++ %} ++ ++ // Second node of expanded dynamic call - the call. ++ enc_class enc_java_dynamic_call_sched(method meth) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_bl); ++ ++ MacroAssembler _masm(&cbuf); ++ ++ if (!ra_->C->in_scratch_emit_size()) { ++ // Create a call trampoline stub for the given method. ++ const address entry_point = !($meth$$method) ? 0 : (address)$meth$$method; ++ const address entry_point_const = __ address_constant(entry_point, RelocationHolder::none); ++ const int entry_point_const_toc_offset = __ offset_to_method_toc(entry_point_const); ++ CallStubImpl::emit_trampoline_stub(_masm, entry_point_const_toc_offset, __ offset()); ++ ++ if (ra_->C->env()->failing()) ++ return; ++ ++ // Build relocation at call site with ic position as data. ++ assert((_load_ic_hi_node != NULL && _load_ic_node == NULL) || ++ (_load_ic_hi_node == NULL && _load_ic_node != NULL), ++ "must have one, but can't have both"); ++ assert((_load_ic_hi_node != NULL && _load_ic_hi_node->_cbuf_insts_offset != -1) || ++ (_load_ic_node != NULL && _load_ic_node->_cbuf_insts_offset != -1), ++ "must contain instruction offset"); ++ const int virtual_call_oop_addr_offset = _load_ic_hi_node != NULL ++ ? _load_ic_hi_node->_cbuf_insts_offset ++ : _load_ic_node->_cbuf_insts_offset; ++ const address virtual_call_oop_addr = __ addr_at(virtual_call_oop_addr_offset); ++ assert(MacroAssembler::is_load_const_from_method_toc_at(virtual_call_oop_addr), ++ "should be load from TOC"); ++ ++ __ relocate(virtual_call_Relocation::spec(virtual_call_oop_addr)); ++ } ++ ++ // At this point I do not have the address of the trampoline stub, ++ // and the entry point might be too far away for bl. Pc() serves ++ // as dummy and bl will be patched later. ++ __ bl((address) __ pc()); ++ %} ++ ++ // postalloc expand emitter for virtual calls. ++ enc_class postalloc_expand_java_dynamic_call_sched(method meth, iRegLdst toc) %{ ++ ++ // 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()), ++ OptoReg::Name(R19_H_num), OptoReg::Name(R19_num)); ++ ++ // Create the call node. ++ CallDynamicJavaDirectSchedNode *call = new (C) CallDynamicJavaDirectSchedNode(); ++ call->_method_handle_invoke = _method_handle_invoke; ++ call->_vtable_index = _vtable_index; ++ call->_method = _method; ++ call->_bci = _bci; ++ call->_optimized_virtual = _optimized_virtual; ++ call->_tf = _tf; ++ call->_entry_point = _entry_point; ++ call->_cnt = _cnt; ++ call->_argsize = _argsize; ++ call->_oop_map = _oop_map; ++ call->_jvms = _jvms; ++ call->_jvmadj = _jvmadj; ++ call->_in_rms = _in_rms; ++ call->_nesting = _nesting; ++ ++ // New call needs all inputs of old call. ++ // Req... ++ for (uint i = 0; i < req(); ++i) { ++ // The expanded node does not need toc any more. ++ // Add the inline cache constant here instead. This expresses the ++ // register of the inline cache must be live at the call. ++ // Else we would have to adapt JVMState by -1. ++ if (i == mach_constant_base_node_input()) { ++ call->add_req(loadConLNodes_IC._last); ++ } else { ++ call->add_req(in(i)); ++ } ++ } ++ // ...as well as prec ++ for (uint i = req(); i < len(); ++i) { ++ call->add_prec(in(i)); ++ } ++ ++ // Remember nodes loading the inline cache into r19. ++ call->_load_ic_hi_node = loadConLNodes_IC._large_hi; ++ call->_load_ic_node = loadConLNodes_IC._small; ++ ++ // Operands for new nodes. ++ call->_opnds[0] = _opnds[0]; ++ call->_opnds[1] = _opnds[1]; ++ ++ // Only the inline cache is associated with a register. ++ assert(Matcher::inline_cache_reg() == OptoReg::Name(R19_num), "ic reg should be R19"); ++ ++ // Push new nodes. ++ if (loadConLNodes_IC._large_hi) nodes->push(loadConLNodes_IC._large_hi); ++ if (loadConLNodes_IC._last) nodes->push(loadConLNodes_IC._last); ++ nodes->push(call); ++ %} ++ ++ // Compound version of call dynamic ++ // Toc is only passed so that it can be used in ins_encode statement. ++ // In the code we have to use $constanttablebase. ++ enc_class enc_java_dynamic_call(method meth, iRegLdst toc) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ MacroAssembler _masm(&cbuf); ++ int start_offset = __ offset(); ++ ++ Register Rtoc = (ra_) ? $constanttablebase : R2_TOC; ++#if 0 ++ int vtable_index = this->_vtable_index; ++ if (_vtable_index < 0) { ++ // Must be invalid_vtable_index, not nonvirtual_vtable_index. ++ assert(_vtable_index == Method::invalid_vtable_index, "correct sentinel value"); ++ Register ic_reg = as_Register(Matcher::inline_cache_reg_encode()); ++ ++ // Virtual call relocation will point to ic load. ++ address virtual_call_meta_addr = __ pc(); ++ // Load a clear inline cache. ++ AddressLiteral empty_ic((address) Universe::non_oop_word()); ++ __ load_const_from_method_toc(ic_reg, empty_ic, Rtoc); ++ // CALL to fixup routine. Fixup routine uses ScopeDesc info ++ // to determine who we intended to call. ++ __ relocate(virtual_call_Relocation::spec(virtual_call_meta_addr)); ++ emit_call_with_trampoline_stub(_masm, (address)$meth$$method, relocInfo::none); ++ assert(((MachCallDynamicJavaNode*)this)->ret_addr_offset() == __ offset() - start_offset, ++ "Fix constant in ret_addr_offset()"); ++ } else { ++ assert(!UseInlineCaches, "expect vtable calls only if not using ICs"); ++ // Go thru the vtable. Get receiver klass. Receiver already ++ // checked for non-null. If we'll go thru a C2I adapter, the ++ // interpreter expects method in R19_method. ++ ++ __ load_klass(R11_scratch1, R3); ++ ++ int entry_offset = InstanceKlass::vtable_start_offset() + _vtable_index * vtableEntry::size(); ++ int v_off = entry_offset * wordSize + vtableEntry::method_offset_in_bytes(); ++ __ li(R19_method, v_off); ++ __ ldx(R19_method/*method oop*/, R19_method/*method offset*/, R11_scratch1/*class*/); ++ // NOTE: for vtable dispatches, the vtable entry will never be ++ // null. However it may very well end up in handle_wrong_method ++ // if the method is abstract for the particular class. ++ __ ld(R11_scratch1, in_bytes(Method::from_compiled_offset()), R19_method); ++ // Call target. Either compiled code or C2I adapter. ++ __ mtctr(R11_scratch1); ++ __ bctrl(); ++ if (((MachCallDynamicJavaNode*)this)->ret_addr_offset() != __ offset() - start_offset) { ++ tty->print(" %d, %d\n", ((MachCallDynamicJavaNode*)this)->ret_addr_offset(),__ offset() - start_offset); ++ } ++ assert(((MachCallDynamicJavaNode*)this)->ret_addr_offset() == __ offset() - start_offset, ++ "Fix constant in ret_addr_offset()"); ++ } ++#endif ++ Unimplemented(); // ret_addr_offset not yet fixed. Depends on compressed oops (load klass!). ++ %} ++ ++ // a runtime call ++ enc_class enc_java_to_runtime_call (method meth) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ ++ MacroAssembler _masm(&cbuf); ++ const address start_pc = __ pc(); ++ ++#if defined(ABI_ELFv2) ++ address entry= !($meth$$method) ? NULL : (address)$meth$$method; ++ __ call_c(entry, relocInfo::runtime_call_type); ++#else ++ // The function we're going to call. ++ FunctionDescriptor fdtemp; ++ const FunctionDescriptor* fd = !($meth$$method) ? &fdtemp : (FunctionDescriptor*)$meth$$method; ++ ++ Register Rtoc = R12_scratch2; ++ // Calculate the method's TOC. ++ __ calculate_address_from_global_toc(Rtoc, __ method_toc()); ++ // Put entry, env, toc into the constant pool, this needs up to 3 constant ++ // pool entries; call_c_using_toc will optimize the call. ++ __ call_c_using_toc(fd, relocInfo::runtime_call_type, Rtoc); ++#endif ++ ++ // Check the ret_addr_offset. ++ assert(((MachCallRuntimeNode*)this)->ret_addr_offset() == __ last_calls_return_pc() - start_pc, ++ "Fix constant in ret_addr_offset()"); ++ %} ++ ++ // Move to ctr for leaf call. ++ // This enc_class is needed so that scheduler gets proper ++ // input mapping for latency computation. ++ enc_class enc_leaf_call_mtctr(iRegLsrc src) %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_mtctr); ++ MacroAssembler _masm(&cbuf); ++ __ mtctr($src$$Register); ++ %} ++ ++ // Postalloc expand emitter for runtime leaf calls. ++ enc_class postalloc_expand_java_to_runtime_call(method meth, iRegLdst toc) %{ ++ loadConLNodesTuple loadConLNodes_Entry; ++#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), ++ OptoReg::Name(R12_H_num), OptoReg::Name(R12_num)); ++#else ++ // Get the struct that describes the function we are about to call. ++ FunctionDescriptor* fd = (FunctionDescriptor*) this->entry_point(); ++ assert(fd, "need fd here"); ++ jlong entry_address = (jlong) fd->entry(); ++ // new nodes ++ loadConLNodesTuple loadConLNodes_Env; ++ 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), ++ 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()), ++ 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); ++ 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()), ++ OptoReg::Name(R2_H_num), OptoReg::Name(R2_num)); ++#endif // ABI_ELFv2 ++ // mtctr node ++ MachNode *mtctr = new (C) 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(); ++ ++ // call node ++ MachCallLeafNode *call = new (C) CallLeafDirectNode(); ++ ++ call->_opnds[0] = _opnds[0]; ++ call->_opnds[1] = new (C) methodOper((intptr_t) entry_address); // May get set later. ++ ++ // Make the new call node look like the old one. ++ call->_name = _name; ++ call->_tf = _tf; ++ call->_entry_point = _entry_point; ++ call->_cnt = _cnt; ++ call->_argsize = _argsize; ++ call->_oop_map = _oop_map; ++ guarantee(!_jvms, "You must clone the jvms and adapt the offsets by fix_jvms()."); ++ call->_jvms = NULL; ++ call->_jvmadj = _jvmadj; ++ call->_in_rms = _in_rms; ++ call->_nesting = _nesting; ++ ++ ++ // New call needs all inputs of old call. ++ // Req... ++ for (uint i = 0; i < req(); ++i) { ++ if (i != mach_constant_base_node_input()) { ++ call->add_req(in(i)); ++ } ++ } ++ ++ // These must be reqired edges, as the registers are live up to ++ // the call. Else the constants are handled as kills. ++ call->add_req(mtctr); ++#if !defined(ABI_ELFv2) ++ call->add_req(loadConLNodes_Env._last); ++ call->add_req(loadConLNodes_Toc._last); ++#endif ++ ++ // ...as well as prec ++ for (uint i = req(); i < len(); ++i) { ++ call->add_prec(in(i)); ++ } ++ ++ // registers ++ ra_->set1(mtctr->_idx, OptoReg::Name(SR_CTR_num)); ++ ++ // Insert the new nodes. ++ if (loadConLNodes_Entry._large_hi) nodes->push(loadConLNodes_Entry._large_hi); ++ if (loadConLNodes_Entry._last) nodes->push(loadConLNodes_Entry._last); ++#if !defined(ABI_ELFv2) ++ if (loadConLNodes_Env._large_hi) nodes->push(loadConLNodes_Env._large_hi); ++ if (loadConLNodes_Env._last) nodes->push(loadConLNodes_Env._last); ++ if (loadConLNodes_Toc._large_hi) nodes->push(loadConLNodes_Toc._large_hi); ++ if (loadConLNodes_Toc._last) nodes->push(loadConLNodes_Toc._last); ++#endif ++ nodes->push(mtctr); ++ nodes->push(call); ++ %} ++%} ++ ++//----------FRAME-------------------------------------------------------------- ++// Definition of frame structure and management information. ++ ++frame %{ ++ // What direction does stack grow in (assumed to be same for native & Java). ++ stack_direction(TOWARDS_LOW); ++ ++ // These two registers define part of the calling convention between ++ // compiled code and the interpreter. ++ ++ // Inline Cache Register or method for I2C. ++ inline_cache_reg(R19); // R19_method ++ ++ // Method Oop Register when calling interpreter. ++ interpreter_method_oop_reg(R19); // R19_method ++ ++ // Optional: name the operand used by cisc-spilling to access ++ // [stack_pointer + offset]. ++ cisc_spilling_operand_name(indOffset); ++ ++ // Number of stack slots consumed by a Monitor enter. ++ sync_stack_slots((frame::jit_monitor_size / VMRegImpl::stack_slot_size)); ++ ++ // Compiled code's Frame Pointer. ++ frame_pointer(R1); // R1_SP ++ ++ // Interpreter stores its frame pointer in a register which is ++ // stored to the stack by I2CAdaptors. I2CAdaptors convert from ++ // interpreted java to compiled java. ++ // ++ // R14_state holds pointer to caller's cInterpreter. ++ interpreter_frame_pointer(R14); // R14_state ++ ++ stack_alignment(frame::alignment_in_bytes); ++ ++ in_preserve_stack_slots((frame::jit_in_preserve_size / VMRegImpl::stack_slot_size)); ++ ++ // Number of outgoing stack slots killed above the ++ // out_preserve_stack_slots for calls to C. Supports the var-args ++ // backing area for register parms. ++ // ++ varargs_C_out_slots_killed(((frame::abi_reg_args_size - frame::jit_out_preserve_size) / VMRegImpl::stack_slot_size)); ++ ++ // The after-PROLOG location of the return address. Location of ++ // return address specifies a type (REG or STACK) and a number ++ // representing the register number (i.e. - use a register name) or ++ // stack slot. ++ // ++ // A: Link register is stored in stack slot ... ++ // M: ... but it's in the caller's frame according to PPC-64 ABI. ++ // J: Therefore, we make sure that the link register is also in R11_scratch1 ++ // at the end of the prolog. ++ // B: We use R20, now. ++ //return_addr(REG R20); ++ ++ // G: After reading the comments made by all the luminaries on their ++ // failure to tell the compiler where the return address really is, ++ // I hardly dare to try myself. However, I'm convinced it's in slot ++ // 4 what apparently works and saves us some spills. ++ return_addr(STACK 4); ++ ++ // This is the body of the function ++ // ++ // void Matcher::calling_convention(OptoRegPair* sig, // array of ideal regs ++ // uint length, // length of array ++ // bool is_outgoing) ++ // ++ // The `sig' array is to be updated. sig[j] represents the location ++ // of the j-th argument, either a register or a stack slot. ++ ++ // Comment taken from i486.ad: ++ // Body of function which returns an integer array locating ++ // arguments either in registers or in stack slots. Passed an array ++ // of ideal registers called "sig" and a "length" count. Stack-slot ++ // offsets are based on outgoing arguments, i.e. a CALLER setting up ++ // arguments for a CALLEE. Incoming stack arguments are ++ // automatically biased by the preserve_stack_slots field above. ++ calling_convention %{ ++ // No difference between ingoing/outgoing. Just pass false. ++ SharedRuntime::java_calling_convention(sig_bt, regs, length, false); ++ %} ++ ++ // Comment taken from i486.ad: ++ // Body of function which returns an integer array locating ++ // arguments either in registers or in stack slots. Passed an array ++ // of ideal registers called "sig" and a "length" count. Stack-slot ++ // offsets are based on outgoing arguments, i.e. a CALLER setting up ++ // arguments for a CALLEE. Incoming stack arguments are ++ // automatically biased by the preserve_stack_slots field above. ++ c_calling_convention %{ ++ // This is obviously always outgoing. ++ // C argument in register AND stack slot. ++ (void) SharedRuntime::c_calling_convention(sig_bt, regs, /*regs2=*/NULL, length); ++ %} ++ ++ // Location of native (C/C++) and interpreter return values. This ++ // is specified to be the same as Java. In the 32-bit VM, long ++ // values are actually returned from native calls in O0:O1 and ++ // returned to the interpreter in I0:I1. The copying to and from ++ // the register pairs is done by the appropriate call and epilog ++ // opcodes. This simplifies the register allocator. ++ c_return_value %{ ++ assert((ideal_reg >= Op_RegI && ideal_reg <= Op_RegL) || ++ (ideal_reg == Op_RegN && Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0), ++ "only return normal values"); ++ // enum names from opcodes.hpp: Op_Node Op_Set Op_RegN Op_RegI Op_RegP Op_RegF Op_RegD Op_RegL ++ static int typeToRegLo[Op_RegL+1] = { 0, 0, R3_num, R3_num, R3_num, F1_num, F1_num, R3_num }; ++ static int typeToRegHi[Op_RegL+1] = { 0, 0, OptoReg::Bad, R3_H_num, R3_H_num, OptoReg::Bad, F1_H_num, R3_H_num }; ++ return OptoRegPair(typeToRegHi[ideal_reg], typeToRegLo[ideal_reg]); ++ %} ++ ++ // Location of compiled Java return values. Same as C ++ return_value %{ ++ assert((ideal_reg >= Op_RegI && ideal_reg <= Op_RegL) || ++ (ideal_reg == Op_RegN && Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0), ++ "only return normal values"); ++ // enum names from opcodes.hpp: Op_Node Op_Set Op_RegN Op_RegI Op_RegP Op_RegF Op_RegD Op_RegL ++ static int typeToRegLo[Op_RegL+1] = { 0, 0, R3_num, R3_num, R3_num, F1_num, F1_num, R3_num }; ++ static int typeToRegHi[Op_RegL+1] = { 0, 0, OptoReg::Bad, R3_H_num, R3_H_num, OptoReg::Bad, F1_H_num, R3_H_num }; ++ return OptoRegPair(typeToRegHi[ideal_reg], typeToRegLo[ideal_reg]); ++ %} ++%} ++ ++ ++//----------ATTRIBUTES--------------------------------------------------------- ++ ++//----------Operand Attributes------------------------------------------------- ++op_attrib op_cost(1); // Required cost attribute. ++ ++//----------Instruction Attributes--------------------------------------------- ++ ++// Cost attribute. required. ++ins_attrib ins_cost(DEFAULT_COST); ++ ++// Is this instruction a non-matching short branch variant of some ++// long branch? Not required. ++ins_attrib ins_short_branch(0); ++ ++ins_attrib ins_is_TrapBasedCheckNode(true); ++ ++// Number of constants. ++// This instruction uses the given number of constants ++// (optional attribute). ++// This is needed to determine in time whether the constant pool will ++// exceed 4000 entries. Before postalloc_expand the overall number of constants ++// is determined. It's also used to compute the constant pool size ++// in Output(). ++ins_attrib ins_num_consts(0); ++ ++// Required alignment attribute (must be a power of 2) specifies the ++// alignment that some part of the instruction (not necessarily the ++// start) requires. If > 1, a compute_padding() function must be ++// provided for the instruction. ++ins_attrib ins_alignment(1); ++ ++// Enforce/prohibit rematerializations. ++// - If an instruction is attributed with 'ins_cannot_rematerialize(true)' ++// then rematerialization of that instruction is prohibited and the ++// instruction's value will be spilled if necessary. ++// Causes that MachNode::rematerialize() returns false. ++// - If an instruction is attributed with 'ins_should_rematerialize(true)' ++// then rematerialization should be enforced and a copy of the instruction ++// should be inserted if possible; rematerialization is not guaranteed. ++// Note: this may result in rematerializations in front of every use. ++// Causes that MachNode::rematerialize() can return true. ++// (optional attribute) ++ins_attrib ins_cannot_rematerialize(false); ++ins_attrib ins_should_rematerialize(false); ++ ++// Instruction has variable size depending on alignment. ++ins_attrib ins_variable_size_depending_on_alignment(false); ++ ++// Instruction is a nop. ++ins_attrib ins_is_nop(false); ++ ++// Instruction is mapped to a MachIfFastLock node (instead of MachFastLock). ++ins_attrib ins_use_mach_if_fast_lock_node(false); ++ ++// Field for the toc offset of a constant. ++// ++// This is needed if the toc offset is not encodable as an immediate in ++// the PPC load instruction. If so, the upper (hi) bits of the offset are ++// added to the toc, and from this a load with immediate is performed. ++// With postalloc expand, we get two nodes that require the same offset ++// but which don't know about each other. The offset is only known ++// when the constant is added to the constant pool during emitting. ++// It is generated in the 'hi'-node adding the upper bits, and saved ++// in this node. The 'lo'-node has a link to the 'hi'-node and reads ++// the offset from there when it gets encoded. ++ins_attrib ins_field_const_toc_offset(0); ++ins_attrib ins_field_const_toc_offset_hi_node(0); ++ ++// A field that can hold the instructions offset in the code buffer. ++// Set in the nodes emitter. ++ins_attrib ins_field_cbuf_insts_offset(-1); ++ ++// Fields for referencing a call's load-IC-node. ++// If the toc offset can not be encoded as an immediate in a load, we ++// use two nodes. ++ins_attrib ins_field_load_ic_hi_node(0); ++ins_attrib ins_field_load_ic_node(0); ++ ++//----------OPERANDS----------------------------------------------------------- ++// Operand definitions must precede instruction definitions for correct ++// parsing in the ADLC because operands constitute user defined types ++// which are used in instruction definitions. ++// ++// Formats are generated automatically for constants and base registers. ++ ++//----------Simple Operands---------------------------------------------------- ++// Immediate Operands ++ ++// Integer Immediate: 32-bit ++operand immI() %{ ++ match(ConI); ++ op_cost(40); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++operand immI8() %{ ++ predicate(Assembler::is_simm(n->get_int(), 8)); ++ op_cost(0); ++ match(ConI); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Integer Immediate: 16-bit ++operand immI16() %{ ++ predicate(Assembler::is_simm(n->get_int(), 16)); ++ op_cost(0); ++ match(ConI); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Integer Immediate: 32-bit, where lowest 16 bits are 0x0000. ++operand immIhi16() %{ ++ predicate(((n->get_int() & 0xffff0000) != 0) && ((n->get_int() & 0xffff) == 0)); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++operand immInegpow2() %{ ++ predicate(is_power_of_2_long((jlong) (julong) (juint) (-(n->get_int())))); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++operand immIpow2minus1() %{ ++ predicate(is_power_of_2_long((((jlong) (n->get_int()))+1))); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++operand immIpowerOf2() %{ ++ predicate(is_power_of_2_long((((jlong) (julong) (juint) (n->get_int()))))); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Unsigned Integer Immediate: the values 0-31 ++operand uimmI5() %{ ++ predicate(Assembler::is_uimm(n->get_int(), 5)); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Unsigned Integer Immediate: 6-bit ++operand uimmI6() %{ ++ predicate(Assembler::is_uimm(n->get_int(), 6)); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Unsigned Integer Immediate: 6-bit int, greater than 32 ++operand uimmI6_ge32() %{ ++ predicate(Assembler::is_uimm(n->get_int(), 6) && n->get_int() >= 32); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Unsigned Integer Immediate: 15-bit ++operand uimmI15() %{ ++ predicate(Assembler::is_uimm(n->get_int(), 15)); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Unsigned Integer Immediate: 16-bit ++operand uimmI16() %{ ++ predicate(Assembler::is_uimm(n->get_int(), 16)); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// constant 'int 0'. ++operand immI_0() %{ ++ predicate(n->get_int() == 0); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// constant 'int 1'. ++operand immI_1() %{ ++ predicate(n->get_int() == 1); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// constant 'int -1'. ++operand immI_minus1() %{ ++ predicate(n->get_int() == -1); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// int value 16. ++operand immI_16() %{ ++ predicate(n->get_int() == 16); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// int value 24. ++operand immI_24() %{ ++ predicate(n->get_int() == 24); ++ match(ConI); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Compressed oops constants ++// Pointer Immediate ++operand immN() %{ ++ match(ConN); ++ ++ op_cost(10); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// NULL Pointer Immediate ++operand immN_0() %{ ++ predicate(n->get_narrowcon() == 0); ++ match(ConN); ++ ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Compressed klass constants ++operand immNKlass() %{ ++ match(ConNKlass); ++ ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// This operand can be used to avoid matching of an instruct ++// with chain rule. ++operand immNKlass_NM() %{ ++ match(ConNKlass); ++ predicate(false); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Pointer Immediate: 64-bit ++operand immP() %{ ++ match(ConP); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Operand to avoid match of loadConP. ++// This operand can be used to avoid matching of an instruct ++// with chain rule. ++operand immP_NM() %{ ++ match(ConP); ++ predicate(false); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// costant 'pointer 0'. ++operand immP_0() %{ ++ predicate(n->get_ptr() == 0); ++ match(ConP); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// pointer 0x0 or 0x1 ++operand immP_0or1() %{ ++ predicate((n->get_ptr() == 0) || (n->get_ptr() == 1)); ++ match(ConP); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++operand immL() %{ ++ match(ConL); ++ op_cost(40); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Long Immediate: 16-bit ++operand immL16() %{ ++ predicate(Assembler::is_simm(n->get_long(), 16)); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Long Immediate: 16-bit, 4-aligned ++operand immL16Alg4() %{ ++ predicate(Assembler::is_simm(n->get_long(), 16) && ((n->get_long() & 0x3) == 0)); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Long Immediate: 32-bit, where lowest 16 bits are 0x0000. ++operand immL32hi16() %{ ++ predicate(Assembler::is_simm(n->get_long(), 32) && ((n->get_long() & 0xffffL) == 0L)); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Long Immediate: 32-bit ++operand immL32() %{ ++ predicate(Assembler::is_simm(n->get_long(), 32)); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Long Immediate: 64-bit, where highest 16 bits are not 0x0000. ++operand immLhighest16() %{ ++ predicate((n->get_long() & 0xffff000000000000L) != 0L && (n->get_long() & 0x0000ffffffffffffL) == 0L); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++operand immLnegpow2() %{ ++ predicate(is_power_of_2_long((jlong)-(n->get_long()))); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++operand immLpow2minus1() %{ ++ predicate(is_power_of_2_long((((jlong) (n->get_long()))+1)) && ++ (n->get_long() != (jlong)0xffffffffffffffffL)); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// constant 'long 0'. ++operand immL_0() %{ ++ predicate(n->get_long() == 0L); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// constat ' long -1'. ++operand immL_minus1() %{ ++ predicate(n->get_long() == -1L); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Long Immediate: low 32-bit mask ++operand immL_32bits() %{ ++ predicate(n->get_long() == 0xFFFFFFFFL); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Unsigned Long Immediate: 16-bit ++operand uimmL16() %{ ++ predicate(Assembler::is_uimm(n->get_long(), 16)); ++ match(ConL); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Float Immediate ++operand immF() %{ ++ match(ConF); ++ op_cost(40); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// constant 'float +0.0'. ++operand immF_0() %{ ++ predicate((n->getf() == 0) && ++ (fpclassify(n->getf()) == FP_ZERO) && (signbit(n->getf()) == 0)); ++ match(ConF); ++ op_cost(0); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Double Immediate ++operand immD() %{ ++ match(ConD); ++ op_cost(40); ++ format %{ %} ++ interface(CONST_INTER); ++%} ++ ++// Integer Register Operands ++// Integer Destination Register ++// See definition of reg_class bits32_reg_rw. ++operand iRegIdst() %{ ++ constraint(ALLOC_IN_RC(bits32_reg_rw)); ++ match(RegI); ++ match(rscratch1RegI); ++ match(rscratch2RegI); ++ match(rarg1RegI); ++ match(rarg2RegI); ++ match(rarg3RegI); ++ match(rarg4RegI); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Integer Source Register ++// See definition of reg_class bits32_reg_ro. ++operand iRegIsrc() %{ ++ constraint(ALLOC_IN_RC(bits32_reg_ro)); ++ match(RegI); ++ match(rscratch1RegI); ++ match(rscratch2RegI); ++ match(rarg1RegI); ++ match(rarg2RegI); ++ match(rarg3RegI); ++ match(rarg4RegI); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rscratch1RegI() %{ ++ constraint(ALLOC_IN_RC(rscratch1_bits32_reg)); ++ match(iRegIdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rscratch2RegI() %{ ++ constraint(ALLOC_IN_RC(rscratch2_bits32_reg)); ++ match(iRegIdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg1RegI() %{ ++ constraint(ALLOC_IN_RC(rarg1_bits32_reg)); ++ match(iRegIdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg2RegI() %{ ++ constraint(ALLOC_IN_RC(rarg2_bits32_reg)); ++ match(iRegIdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg3RegI() %{ ++ constraint(ALLOC_IN_RC(rarg3_bits32_reg)); ++ match(iRegIdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg4RegI() %{ ++ constraint(ALLOC_IN_RC(rarg4_bits32_reg)); ++ match(iRegIdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg1RegL() %{ ++ constraint(ALLOC_IN_RC(rarg1_bits64_reg)); ++ match(iRegLdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg2RegL() %{ ++ constraint(ALLOC_IN_RC(rarg2_bits64_reg)); ++ match(iRegLdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg3RegL() %{ ++ constraint(ALLOC_IN_RC(rarg3_bits64_reg)); ++ match(iRegLdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg4RegL() %{ ++ constraint(ALLOC_IN_RC(rarg4_bits64_reg)); ++ match(iRegLdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Pointer Destination Register ++// See definition of reg_class bits64_reg_rw. ++operand iRegPdst() %{ ++ constraint(ALLOC_IN_RC(bits64_reg_rw)); ++ match(RegP); ++ match(rscratch1RegP); ++ match(rscratch2RegP); ++ match(rarg1RegP); ++ match(rarg2RegP); ++ match(rarg3RegP); ++ match(rarg4RegP); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Pointer Destination Register ++// Operand not using r11 and r12 (killed in epilog). ++operand iRegPdstNoScratch() %{ ++ constraint(ALLOC_IN_RC(bits64_reg_leaf_call)); ++ match(RegP); ++ match(rarg1RegP); ++ match(rarg2RegP); ++ match(rarg3RegP); ++ match(rarg4RegP); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Pointer Source Register ++// See definition of reg_class bits64_reg_ro. ++operand iRegPsrc() %{ ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(RegP); ++ match(iRegPdst); ++ match(rscratch1RegP); ++ match(rscratch2RegP); ++ match(rarg1RegP); ++ match(rarg2RegP); ++ match(rarg3RegP); ++ match(rarg4RegP); ++ match(threadRegP); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Thread operand. ++operand threadRegP() %{ ++ constraint(ALLOC_IN_RC(thread_bits64_reg)); ++ match(iRegPdst); ++ format %{ "R16" %} ++ interface(REG_INTER); ++%} ++ ++operand rscratch1RegP() %{ ++ constraint(ALLOC_IN_RC(rscratch1_bits64_reg)); ++ match(iRegPdst); ++ format %{ "R11" %} ++ interface(REG_INTER); ++%} ++ ++operand rscratch2RegP() %{ ++ constraint(ALLOC_IN_RC(rscratch2_bits64_reg)); ++ match(iRegPdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg1RegP() %{ ++ constraint(ALLOC_IN_RC(rarg1_bits64_reg)); ++ match(iRegPdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg2RegP() %{ ++ constraint(ALLOC_IN_RC(rarg2_bits64_reg)); ++ match(iRegPdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg3RegP() %{ ++ constraint(ALLOC_IN_RC(rarg3_bits64_reg)); ++ match(iRegPdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rarg4RegP() %{ ++ constraint(ALLOC_IN_RC(rarg4_bits64_reg)); ++ match(iRegPdst); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand iRegNsrc() %{ ++ constraint(ALLOC_IN_RC(bits32_reg_ro)); ++ match(RegN); ++ match(iRegNdst); ++ ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand iRegNdst() %{ ++ constraint(ALLOC_IN_RC(bits32_reg_rw)); ++ match(RegN); ++ ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Long Destination Register ++// See definition of reg_class bits64_reg_rw. ++operand iRegLdst() %{ ++ constraint(ALLOC_IN_RC(bits64_reg_rw)); ++ match(RegL); ++ match(rscratch1RegL); ++ match(rscratch2RegL); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Long Source Register ++// See definition of reg_class bits64_reg_ro. ++operand iRegLsrc() %{ ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(RegL); ++ match(iRegLdst); ++ match(rscratch1RegL); ++ match(rscratch2RegL); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Special operand for ConvL2I. ++operand iRegL2Isrc(iRegLsrc reg) %{ ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(ConvL2I reg); ++ format %{ "ConvL2I($reg)" %} ++ interface(REG_INTER) ++%} ++ ++operand rscratch1RegL() %{ ++ constraint(ALLOC_IN_RC(rscratch1_bits64_reg)); ++ match(RegL); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand rscratch2RegL() %{ ++ constraint(ALLOC_IN_RC(rscratch2_bits64_reg)); ++ match(RegL); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Condition Code Flag Registers ++operand flagsReg() %{ ++ constraint(ALLOC_IN_RC(int_flags)); ++ match(RegFlags); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Condition Code Flag Register CR0 ++operand flagsRegCR0() %{ ++ constraint(ALLOC_IN_RC(int_flags_CR0)); ++ match(RegFlags); ++ format %{ "CR0" %} ++ interface(REG_INTER); ++%} ++ ++operand flagsRegCR1() %{ ++ constraint(ALLOC_IN_RC(int_flags_CR1)); ++ match(RegFlags); ++ format %{ "CR1" %} ++ interface(REG_INTER); ++%} ++ ++operand flagsRegCR6() %{ ++ constraint(ALLOC_IN_RC(int_flags_CR6)); ++ match(RegFlags); ++ format %{ "CR6" %} ++ interface(REG_INTER); ++%} ++ ++operand regCTR() %{ ++ constraint(ALLOC_IN_RC(ctr_reg)); ++ // RegFlags should work. Introducing a RegSpecial type would cause a ++ // lot of changes. ++ match(RegFlags); ++ format %{"SR_CTR" %} ++ interface(REG_INTER); ++%} ++ ++operand regD() %{ ++ constraint(ALLOC_IN_RC(dbl_reg)); ++ match(RegD); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand regF() %{ ++ constraint(ALLOC_IN_RC(flt_reg)); ++ match(RegF); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Special Registers ++ ++// Method Register ++operand inline_cache_regP(iRegPdst reg) %{ ++ constraint(ALLOC_IN_RC(r19_bits64_reg)); // inline_cache_reg ++ match(reg); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand compiler_method_oop_regP(iRegPdst reg) %{ ++ constraint(ALLOC_IN_RC(rscratch1_bits64_reg)); // compiler_method_oop_reg ++ match(reg); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++operand interpreter_method_oop_regP(iRegPdst reg) %{ ++ constraint(ALLOC_IN_RC(r19_bits64_reg)); // interpreter_method_oop_reg ++ match(reg); ++ format %{ %} ++ interface(REG_INTER); ++%} ++ ++// Operands to remove register moves in unscaled mode. ++// Match read/write registers with an EncodeP node if neither shift nor add are required. ++operand iRegP2N(iRegPsrc reg) %{ ++ predicate(false /* TODO: PPC port MatchDecodeNodes*/&& Universe::narrow_oop_shift() == 0); ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(EncodeP reg); ++ format %{ "$reg" %} ++ interface(REG_INTER) ++%} ++ ++operand iRegN2P(iRegNsrc reg) %{ ++ predicate(false /* TODO: PPC port MatchDecodeNodes*/); ++ constraint(ALLOC_IN_RC(bits32_reg_ro)); ++ match(DecodeN reg); ++ match(DecodeNKlass reg); ++ format %{ "$reg" %} ++ interface(REG_INTER) ++%} ++ ++//----------Complex Operands--------------------------------------------------- ++// Indirect Memory Reference ++operand indirect(iRegPsrc reg) %{ ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(reg); ++ op_cost(100); ++ format %{ "[$reg]" %} ++ interface(MEMORY_INTER) %{ ++ base($reg); ++ index(0x0); ++ scale(0x0); ++ disp(0x0); ++ %} ++%} ++ ++// Indirect with Offset ++operand indOffset16(iRegPsrc reg, immL16 offset) %{ ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(AddP reg offset); ++ op_cost(100); ++ format %{ "[$reg + $offset]" %} ++ interface(MEMORY_INTER) %{ ++ base($reg); ++ index(0x0); ++ scale(0x0); ++ disp($offset); ++ %} ++%} ++ ++// Indirect with 4-aligned Offset ++operand indOffset16Alg4(iRegPsrc reg, immL16Alg4 offset) %{ ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(AddP reg offset); ++ op_cost(100); ++ format %{ "[$reg + $offset]" %} ++ interface(MEMORY_INTER) %{ ++ base($reg); ++ index(0x0); ++ scale(0x0); ++ disp($offset); ++ %} ++%} ++ ++//----------Complex Operands for Compressed OOPs------------------------------- ++// Compressed OOPs with narrow_oop_shift == 0. ++ ++// Indirect Memory Reference, compressed OOP ++operand indirectNarrow(iRegNsrc reg) %{ ++ predicate(false /* TODO: PPC port MatchDecodeNodes*/); ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(DecodeN reg); ++ match(DecodeNKlass reg); ++ op_cost(100); ++ format %{ "[$reg]" %} ++ interface(MEMORY_INTER) %{ ++ base($reg); ++ index(0x0); ++ scale(0x0); ++ disp(0x0); ++ %} ++%} ++ ++// Indirect with Offset, compressed OOP ++operand indOffset16Narrow(iRegNsrc reg, immL16 offset) %{ ++ predicate(false /* TODO: PPC port MatchDecodeNodes*/); ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(AddP (DecodeN reg) offset); ++ match(AddP (DecodeNKlass reg) offset); ++ op_cost(100); ++ format %{ "[$reg + $offset]" %} ++ interface(MEMORY_INTER) %{ ++ base($reg); ++ index(0x0); ++ scale(0x0); ++ disp($offset); ++ %} ++%} ++ ++// Indirect with 4-aligned Offset, compressed OOP ++operand indOffset16NarrowAlg4(iRegNsrc reg, immL16Alg4 offset) %{ ++ predicate(false /* TODO: PPC port MatchDecodeNodes*/); ++ constraint(ALLOC_IN_RC(bits64_reg_ro)); ++ match(AddP (DecodeN reg) offset); ++ match(AddP (DecodeNKlass reg) offset); ++ op_cost(100); ++ format %{ "[$reg + $offset]" %} ++ interface(MEMORY_INTER) %{ ++ base($reg); ++ index(0x0); ++ scale(0x0); ++ disp($offset); ++ %} ++%} ++ ++//----------Special Memory Operands-------------------------------------------- ++// Stack Slot Operand ++// ++// This operand is used for loading and storing temporary values on ++// the stack where a match requires a value to flow through memory. ++operand stackSlotI(sRegI reg) %{ ++ constraint(ALLOC_IN_RC(stack_slots)); ++ op_cost(100); ++ //match(RegI); ++ format %{ "[sp+$reg]" %} ++ interface(MEMORY_INTER) %{ ++ base(0x1); // R1_SP ++ index(0x0); ++ scale(0x0); ++ disp($reg); // Stack Offset ++ %} ++%} ++ ++operand stackSlotL(sRegL reg) %{ ++ constraint(ALLOC_IN_RC(stack_slots)); ++ op_cost(100); ++ //match(RegL); ++ format %{ "[sp+$reg]" %} ++ interface(MEMORY_INTER) %{ ++ base(0x1); // R1_SP ++ index(0x0); ++ scale(0x0); ++ disp($reg); // Stack Offset ++ %} ++%} ++ ++operand stackSlotP(sRegP reg) %{ ++ constraint(ALLOC_IN_RC(stack_slots)); ++ op_cost(100); ++ //match(RegP); ++ format %{ "[sp+$reg]" %} ++ interface(MEMORY_INTER) %{ ++ base(0x1); // R1_SP ++ index(0x0); ++ scale(0x0); ++ disp($reg); // Stack Offset ++ %} ++%} ++ ++operand stackSlotF(sRegF reg) %{ ++ constraint(ALLOC_IN_RC(stack_slots)); ++ op_cost(100); ++ //match(RegF); ++ format %{ "[sp+$reg]" %} ++ interface(MEMORY_INTER) %{ ++ base(0x1); // R1_SP ++ index(0x0); ++ scale(0x0); ++ disp($reg); // Stack Offset ++ %} ++%} ++ ++operand stackSlotD(sRegD reg) %{ ++ constraint(ALLOC_IN_RC(stack_slots)); ++ op_cost(100); ++ //match(RegD); ++ format %{ "[sp+$reg]" %} ++ interface(MEMORY_INTER) %{ ++ base(0x1); // R1_SP ++ index(0x0); ++ scale(0x0); ++ disp($reg); // Stack Offset ++ %} ++%} ++ ++// Operands for expressing Control Flow ++// NOTE: Label is a predefined operand which should not be redefined in ++// the AD file. It is generically handled within the ADLC. ++ ++//----------Conditional Branch Operands---------------------------------------- ++// Comparison Op ++// ++// This is the operation of the comparison, and is limited to the ++// following set of codes: L (<), LE (<=), G (>), GE (>=), E (==), NE ++// (!=). ++// ++// Other attributes of the comparison, such as unsignedness, are specified ++// by the comparison instruction that sets a condition code flags register. ++// That result is represented by a flags operand whose subtype is appropriate ++// to the unsignedness (etc.) of the comparison. ++// ++// Later, the instruction which matches both the Comparison Op (a Bool) and ++// the flags (produced by the Cmp) specifies the coding of the comparison op ++// by matching a specific subtype of Bool operand below. ++ ++// When used for floating point comparisons: unordered same as less. ++operand cmpOp() %{ ++ match(Bool); ++ format %{ "" %} ++ interface(COND_INTER) %{ ++ // BO only encodes bit 4 of bcondCRbiIsX, as bits 1-3 are always '100'. ++ // BO & BI ++ equal(0xA); // 10 10: bcondCRbiIs1 & Condition::equal ++ not_equal(0x2); // 00 10: bcondCRbiIs0 & Condition::equal ++ less(0x8); // 10 00: bcondCRbiIs1 & Condition::less ++ greater_equal(0x0); // 00 00: bcondCRbiIs0 & Condition::less ++ less_equal(0x1); // 00 01: bcondCRbiIs0 & Condition::greater ++ greater(0x9); // 10 01: bcondCRbiIs1 & Condition::greater ++ overflow(0xB); // 10 11: bcondCRbiIs1 & Condition::summary_overflow ++ no_overflow(0x3); // 00 11: bcondCRbiIs0 & Condition::summary_overflow ++ %} ++%} ++ ++//----------OPERAND CLASSES---------------------------------------------------- ++// Operand Classes are groups of operands that are used to simplify ++// instruction definitions by not requiring the AD writer to specify ++// seperate instructions for every form of operand when the ++// instruction accepts multiple operand types with the same basic ++// encoding and format. The classic case of this is memory operands. ++// Indirect is not included since its use is limited to Compare & Swap. ++ ++opclass memory(indirect, indOffset16 /*, indIndex, tlsReference*/, indirectNarrow, indOffset16Narrow); ++// Memory operand where offsets are 4-aligned. Required for ld, std. ++opclass memoryAlg4(indirect, indOffset16Alg4, indirectNarrow, indOffset16NarrowAlg4); ++opclass indirectMemory(indirect, indirectNarrow); ++ ++// Special opclass for I and ConvL2I. ++opclass iRegIsrc_iRegL2Isrc(iRegIsrc, iRegL2Isrc); ++ ++// Operand classes to match encode and decode. iRegN_P2N is only used ++// for storeN. I have never seen an encode node elsewhere. ++opclass iRegN_P2N(iRegNsrc, iRegP2N); ++opclass iRegP_N2P(iRegPsrc, iRegN2P); ++ ++//----------PIPELINE----------------------------------------------------------- ++ ++pipeline %{ ++ ++// See J.M.Tendler et al. "Power4 system microarchitecture", IBM ++// J. Res. & Dev., No. 1, Jan. 2002. ++ ++//----------ATTRIBUTES--------------------------------------------------------- ++attributes %{ ++ ++ // Power4 instructions are of fixed length. ++ fixed_size_instructions; ++ ++ // TODO: if `bundle' means number of instructions fetched ++ // per cycle, this is 8. If `bundle' means Power4 `group', that is ++ // max instructions issued per cycle, this is 5. ++ max_instructions_per_bundle = 8; ++ ++ // A Power4 instruction is 4 bytes long. ++ instruction_unit_size = 4; ++ ++ // The Power4 processor fetches 64 bytes... ++ instruction_fetch_unit_size = 64; ++ ++ // ...in one line ++ instruction_fetch_units = 1 ++ ++ // Unused, list one so that array generated by adlc is not empty. ++ // Aix compiler chokes if _nop_count = 0. ++ nops(fxNop); ++%} ++ ++//----------RESOURCES---------------------------------------------------------- ++// Resources are the functional units available to the machine ++resources( ++ PPC_BR, // branch unit ++ PPC_CR, // condition unit ++ PPC_FX1, // integer arithmetic unit 1 ++ PPC_FX2, // integer arithmetic unit 2 ++ PPC_LDST1, // load/store unit 1 ++ PPC_LDST2, // load/store unit 2 ++ PPC_FP1, // float arithmetic unit 1 ++ PPC_FP2, // float arithmetic unit 2 ++ PPC_LDST = PPC_LDST1 | PPC_LDST2, ++ PPC_FX = PPC_FX1 | PPC_FX2, ++ PPC_FP = PPC_FP1 | PPC_FP2 ++ ); ++ ++//----------PIPELINE DESCRIPTION----------------------------------------------- ++// Pipeline Description specifies the stages in the machine's pipeline ++pipe_desc( ++ // Power4 longest pipeline path ++ PPC_IF, // instruction fetch ++ PPC_IC, ++ //PPC_BP, // branch prediction ++ PPC_D0, // decode ++ PPC_D1, // decode ++ PPC_D2, // decode ++ PPC_D3, // decode ++ PPC_Xfer1, ++ PPC_GD, // group definition ++ PPC_MP, // map ++ PPC_ISS, // issue ++ PPC_RF, // resource fetch ++ PPC_EX1, // execute (all units) ++ PPC_EX2, // execute (FP, LDST) ++ PPC_EX3, // execute (FP, LDST) ++ PPC_EX4, // execute (FP) ++ PPC_EX5, // execute (FP) ++ PPC_EX6, // execute (FP) ++ PPC_WB, // write back ++ PPC_Xfer2, ++ PPC_CP ++ ); ++ ++//----------PIPELINE CLASSES--------------------------------------------------- ++// Pipeline Classes describe the stages in which input and output are ++// referenced by the hardware pipeline. ++ ++// Simple pipeline classes. ++ ++// Default pipeline class. ++pipe_class pipe_class_default() %{ ++ single_instruction; ++ fixed_latency(2); ++%} ++ ++// Pipeline class for empty instructions. ++pipe_class pipe_class_empty() %{ ++ single_instruction; ++ fixed_latency(0); ++%} ++ ++// Pipeline class for compares. ++pipe_class pipe_class_compare() %{ ++ single_instruction; ++ fixed_latency(16); ++%} ++ ++// Pipeline class for traps. ++pipe_class pipe_class_trap() %{ ++ single_instruction; ++ fixed_latency(100); ++%} ++ ++// Pipeline class for memory operations. ++pipe_class pipe_class_memory() %{ ++ single_instruction; ++ fixed_latency(16); ++%} ++ ++// Pipeline class for call. ++pipe_class pipe_class_call() %{ ++ single_instruction; ++ fixed_latency(100); ++%} ++ ++// Define the class for the Nop node. ++define %{ ++ MachNop = pipe_class_default; ++%} ++ ++%} ++ ++//----------INSTRUCTIONS------------------------------------------------------- ++ ++// Naming of instructions: ++// opA_operB / opA_operB_operC: ++// Operation 'op' with one or two source operands 'oper'. Result ++// type is A, source operand types are B and C. ++// Iff A == B == C, B and C are left out. ++// ++// The instructions are ordered according to the following scheme: ++// - loads ++// - load constants ++// - prefetch ++// - store ++// - encode/decode ++// - membar ++// - conditional moves ++// - compare & swap ++// - arithmetic and logic operations ++// * int: Add, Sub, Mul, Div, Mod ++// * int: lShift, arShift, urShift, rot ++// * float: Add, Sub, Mul, Div ++// * and, or, xor ... ++// - register moves: float <-> int, reg <-> stack, repl ++// - cast (high level type cast, XtoP, castPP, castII, not_null etc. ++// - conv (low level type cast requiring bit changes (sign extend etc) ++// - compares, range & zero checks. ++// - branches ++// - complex operations, intrinsics, min, max, replicate ++// - lock ++// - Calls ++// ++// If there are similar instructions with different types they are sorted: ++// int before float ++// small before big ++// signed before unsigned ++// e.g., loadS before loadUS before loadI before loadF. ++ ++ ++//----------Load/Store Instructions-------------------------------------------- ++ ++//----------Load Instructions-------------------------------------------------- ++ ++// Converts byte to int. ++// As convB2I_reg, but without match rule. The match rule of convB2I_reg ++// reuses the 'amount' operand, but adlc expects that operand specification ++// and operands in match rule are equivalent. ++instruct convB2I_reg_2(iRegIdst dst, iRegIsrc src) %{ ++ effect(DEF dst, USE src); ++ format %{ "EXTSB $dst, $src \t// byte->int" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_extsb); ++ __ extsb($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct loadUB_indirect(iRegIdst dst, indirectMemory mem) %{ ++ // match-rule, false predicate ++ match(Set dst (LoadB mem)); ++ predicate(false); ++ ++ format %{ "LBZ $dst, $mem" %} ++ size(4); ++ ins_encode( enc_lbz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++instruct loadUB_indirect_ac(iRegIdst dst, indirectMemory mem) %{ ++ // match-rule, false predicate ++ match(Set dst (LoadB mem)); ++ predicate(false); ++ ++ format %{ "LBZ $dst, $mem\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_lbz_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Byte (8bit signed). LoadB = LoadUB + ConvUB2B. ++instruct loadB_indirect_Ex(iRegIdst dst, indirectMemory mem) %{ ++ match(Set dst (LoadB mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST + DEFAULT_COST); ++ expand %{ ++ iRegIdst tmp; ++ loadUB_indirect(tmp, mem); ++ convB2I_reg_2(dst, tmp); ++ %} ++%} ++ ++instruct loadB_indirect_ac_Ex(iRegIdst dst, indirectMemory mem) %{ ++ match(Set dst (LoadB mem)); ++ ins_cost(3*MEMORY_REF_COST + DEFAULT_COST); ++ expand %{ ++ iRegIdst tmp; ++ loadUB_indirect_ac(tmp, mem); ++ convB2I_reg_2(dst, tmp); ++ %} ++%} ++ ++instruct loadUB_indOffset16(iRegIdst dst, indOffset16 mem) %{ ++ // match-rule, false predicate ++ match(Set dst (LoadB mem)); ++ predicate(false); ++ ++ format %{ "LBZ $dst, $mem" %} ++ size(4); ++ ins_encode( enc_lbz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++instruct loadUB_indOffset16_ac(iRegIdst dst, indOffset16 mem) %{ ++ // match-rule, false predicate ++ match(Set dst (LoadB mem)); ++ predicate(false); ++ ++ format %{ "LBZ $dst, $mem\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_lbz_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Byte (8bit signed). LoadB = LoadUB + ConvUB2B. ++instruct loadB_indOffset16_Ex(iRegIdst dst, indOffset16 mem) %{ ++ match(Set dst (LoadB mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST + DEFAULT_COST); ++ ++ expand %{ ++ iRegIdst tmp; ++ loadUB_indOffset16(tmp, mem); ++ convB2I_reg_2(dst, tmp); ++ %} ++%} ++ ++instruct loadB_indOffset16_ac_Ex(iRegIdst dst, indOffset16 mem) %{ ++ match(Set dst (LoadB mem)); ++ ins_cost(3*MEMORY_REF_COST + DEFAULT_COST); ++ ++ expand %{ ++ iRegIdst tmp; ++ loadUB_indOffset16_ac(tmp, mem); ++ convB2I_reg_2(dst, tmp); ++ %} ++%} ++ ++// Load Unsigned Byte (8bit UNsigned) into an int reg. ++instruct loadUB(iRegIdst dst, memory mem) %{ ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ match(Set dst (LoadUB mem)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LBZ $dst, $mem \t// byte, zero-extend to int" %} ++ size(4); ++ ins_encode( enc_lbz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Unsigned Byte (8bit UNsigned) acquire. ++instruct loadUB_ac(iRegIdst dst, memory mem) %{ ++ match(Set dst (LoadUB mem)); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LBZ $dst, $mem \t// byte, zero-extend to int, acquire\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_lbz_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Unsigned Byte (8bit UNsigned) into a Long Register. ++instruct loadUB2L(iRegLdst dst, memory mem) %{ ++ match(Set dst (ConvI2L (LoadUB mem))); ++ predicate(_kids[0]->_leaf->as_Load()->is_unordered() || followed_by_acquire(_kids[0]->_leaf)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LBZ $dst, $mem \t// byte, zero-extend to long" %} ++ size(4); ++ ins_encode( enc_lbz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++instruct loadUB2L_ac(iRegLdst dst, memory mem) %{ ++ match(Set dst (ConvI2L (LoadUB mem))); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LBZ $dst, $mem \t// byte, zero-extend to long, acquire\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_lbz_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Short (16bit signed) ++instruct loadS(iRegIdst dst, memory mem) %{ ++ match(Set dst (LoadS mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LHA $dst, $mem" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lha); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lha($dst$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Short (16bit signed) acquire. ++instruct loadS_ac(iRegIdst dst, memory mem) %{ ++ match(Set dst (LoadS mem)); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LHA $dst, $mem\t acquire\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lha($dst$$Register, Idisp, $mem$$base$$Register); ++ __ twi_0($dst$$Register); ++ __ isync(); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Char (16bit unsigned) ++instruct loadUS(iRegIdst dst, memory mem) %{ ++ match(Set dst (LoadUS mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LHZ $dst, $mem" %} ++ size(4); ++ ins_encode( enc_lhz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Char (16bit unsigned) acquire. ++instruct loadUS_ac(iRegIdst dst, memory mem) %{ ++ match(Set dst (LoadUS mem)); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LHZ $dst, $mem \t// acquire\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_lhz_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Unsigned Short/Char (16bit UNsigned) into a Long Register. ++instruct loadUS2L(iRegLdst dst, memory mem) %{ ++ match(Set dst (ConvI2L (LoadUS mem))); ++ predicate(_kids[0]->_leaf->as_Load()->is_unordered() || followed_by_acquire(_kids[0]->_leaf)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LHZ $dst, $mem \t// short, zero-extend to long" %} ++ size(4); ++ ins_encode( enc_lhz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Unsigned Short/Char (16bit UNsigned) into a Long Register acquire. ++instruct loadUS2L_ac(iRegLdst dst, memory mem) %{ ++ match(Set dst (ConvI2L (LoadUS mem))); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LHZ $dst, $mem \t// short, zero-extend to long, acquire\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_lhz_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Integer. ++instruct loadI(iRegIdst dst, memory mem) %{ ++ match(Set dst (LoadI mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $mem" %} ++ size(4); ++ ins_encode( enc_lwz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Integer acquire. ++instruct loadI_ac(iRegIdst dst, memory mem) %{ ++ match(Set dst (LoadI mem)); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $mem \t// load acquire\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_lwz_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Match loading integer and casting it to unsigned int in ++// long register. ++// LoadI + ConvI2L + AndL 0xffffffff. ++instruct loadUI2L(iRegLdst dst, memory mem, immL_32bits mask) %{ ++ match(Set dst (AndL (ConvI2L (LoadI mem)) mask)); ++ predicate(_kids[0]->_kids[0]->_leaf->as_Load()->is_unordered()); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $mem \t// zero-extend to long" %} ++ size(4); ++ ins_encode( enc_lwz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Match loading integer and casting it to long. ++instruct loadI2L(iRegLdst dst, memory mem) %{ ++ match(Set dst (ConvI2L (LoadI mem))); ++ predicate(_kids[0]->_leaf->as_Load()->is_unordered()); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LWA $dst, $mem \t// loadI2L" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lwa); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lwa($dst$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Match loading integer and casting it to long - acquire. ++instruct loadI2L_ac(iRegLdst dst, memory mem) %{ ++ match(Set dst (ConvI2L (LoadI mem))); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LWA $dst, $mem \t// loadI2L acquire" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lwa); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lwa($dst$$Register, Idisp, $mem$$base$$Register); ++ __ twi_0($dst$$Register); ++ __ isync(); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Long - aligned ++instruct loadL(iRegLdst dst, memoryAlg4 mem) %{ ++ match(Set dst (LoadL mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $mem \t// long" %} ++ size(4); ++ ins_encode( enc_ld(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Long - aligned acquire. ++instruct loadL_ac(iRegLdst dst, memoryAlg4 mem) %{ ++ match(Set dst (LoadL mem)); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $mem \t// long acquire\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_ld_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Long - UNaligned ++instruct loadL_unaligned(iRegLdst dst, memoryAlg4 mem) %{ ++ match(Set dst (LoadL_unaligned mem)); ++ // predicate(...) // Unaligned_ac is not needed (and wouldn't make sense). ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $mem \t// unaligned long" %} ++ size(4); ++ ins_encode( enc_ld(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load nodes for superwords ++ ++// Load Aligned Packed Byte ++instruct loadV8(iRegLdst dst, memoryAlg4 mem) %{ ++ predicate(n->as_LoadVector()->memory_size() == 8); ++ match(Set dst (LoadVector mem)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $mem \t// load 8-byte Vector" %} ++ size(4); ++ ins_encode( enc_ld(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Range, range = array length (=jint) ++instruct loadRange(iRegIdst dst, memory mem) %{ ++ match(Set dst (LoadRange mem)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $mem \t// range" %} ++ size(4); ++ ins_encode( enc_lwz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Compressed Pointer ++instruct loadN(iRegNdst dst, memory mem) %{ ++ match(Set dst (LoadN mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $mem \t// load compressed ptr" %} ++ size(4); ++ ins_encode( enc_lwz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Compressed Pointer acquire. ++instruct loadN_ac(iRegNdst dst, memory mem) %{ ++ match(Set dst (LoadN mem)); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $mem \t// load acquire compressed ptr\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_lwz_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Compressed Pointer and decode it if narrow_oop_shift == 0. ++instruct loadN2P_unscaled(iRegPdst dst, memory mem) %{ ++ match(Set dst (DecodeN (LoadN mem))); ++ predicate(_kids[0]->_leaf->as_Load()->is_unordered() && Universe::narrow_oop_shift() == 0); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $mem \t// DecodeN (unscaled)" %} ++ size(4); ++ ins_encode( enc_lwz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Pointer ++instruct loadP(iRegPdst dst, memoryAlg4 mem) %{ ++ match(Set dst (LoadP mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $mem \t// ptr" %} ++ size(4); ++ ins_encode( enc_ld(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Pointer acquire. ++instruct loadP_ac(iRegPdst dst, memoryAlg4 mem) %{ ++ match(Set dst (LoadP mem)); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $mem \t// ptr acquire\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_ld_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// LoadP + CastP2L ++instruct loadP2X(iRegLdst dst, memoryAlg4 mem) %{ ++ match(Set dst (CastP2X (LoadP mem))); ++ predicate(_kids[0]->_leaf->as_Load()->is_unordered()); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $mem \t// ptr + p2x" %} ++ size(4); ++ ins_encode( enc_ld(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load compressed klass pointer. ++instruct loadNKlass(iRegNdst dst, memory mem) %{ ++ match(Set dst (LoadNKlass mem)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $mem \t// compressed klass ptr" %} ++ size(4); ++ ins_encode( enc_lwz(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++//// Load compressed klass and decode it if narrow_klass_shift == 0. ++//// TODO: will narrow_klass_shift ever be 0? ++//instruct decodeNKlass2Klass(iRegPdst dst, memory mem) %{ ++// match(Set dst (DecodeNKlass (LoadNKlass mem))); ++// predicate(false /* TODO: PPC port Universe::narrow_klass_shift() == 0*); ++// ins_cost(MEMORY_REF_COST); ++// ++// format %{ "LWZ $dst, $mem \t// DecodeNKlass (unscaled)" %} ++// size(4); ++// ins_encode( enc_lwz(dst, mem) ); ++// ins_pipe(pipe_class_memory); ++//%} ++ ++// Load Klass Pointer ++instruct loadKlass(iRegPdst dst, memoryAlg4 mem) %{ ++ match(Set dst (LoadKlass mem)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $mem \t// klass ptr" %} ++ size(4); ++ ins_encode( enc_ld(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Float ++instruct loadF(regF dst, memory mem) %{ ++ match(Set dst (LoadF mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LFS $dst, $mem" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lfs); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ lfs($dst$$FloatRegister, Idisp, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Float acquire. ++instruct loadF_ac(regF dst, memory mem) %{ ++ match(Set dst (LoadF mem)); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LFS $dst, $mem \t// acquire\n\t" ++ "FCMPU cr0, $dst, $dst\n\t" ++ "BNE cr0, next\n" ++ "next:\n\t" ++ "ISYNC" %} ++ size(16); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ Label next; ++ __ lfs($dst$$FloatRegister, Idisp, $mem$$base$$Register); ++ __ fcmpu(CCR0, $dst$$FloatRegister, $dst$$FloatRegister); ++ __ bne(CCR0, next); ++ __ bind(next); ++ __ isync(); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Double - aligned ++instruct loadD(regD dst, memory mem) %{ ++ match(Set dst (LoadD mem)); ++ predicate(n->as_Load()->is_unordered() || followed_by_acquire(n)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LFD $dst, $mem" %} ++ size(4); ++ ins_encode( enc_lfd(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Double - aligned acquire. ++instruct loadD_ac(regD dst, memory mem) %{ ++ match(Set dst (LoadD mem)); ++ ins_cost(3*MEMORY_REF_COST); ++ ++ format %{ "LFD $dst, $mem \t// acquire\n\t" ++ "FCMPU cr0, $dst, $dst\n\t" ++ "BNE cr0, next\n" ++ "next:\n\t" ++ "ISYNC" %} ++ size(16); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ Label next; ++ __ lfd($dst$$FloatRegister, Idisp, $mem$$base$$Register); ++ __ fcmpu(CCR0, $dst$$FloatRegister, $dst$$FloatRegister); ++ __ bne(CCR0, next); ++ __ bind(next); ++ __ isync(); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load Double - UNaligned ++instruct loadD_unaligned(regD dst, memory mem) %{ ++ match(Set dst (LoadD_unaligned mem)); ++ // predicate(...) // Unaligned_ac is not needed (and wouldn't make sense). ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LFD $dst, $mem" %} ++ size(4); ++ ins_encode( enc_lfd(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++//----------Constants-------------------------------------------------------- ++ ++// Load MachConstantTableBase: add hi offset to global toc. ++// TODO: Handle hidden register r29 in bundler! ++instruct loadToc_hi(iRegLdst dst) %{ ++ effect(DEF dst); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "ADDIS $dst, R29, DISP.hi \t// load TOC hi" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ __ calculate_address_from_global_toc_hi16only($dst$$Register, __ method_toc()); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Load MachConstantTableBase: add lo offset to global toc. ++instruct loadToc_lo(iRegLdst dst, iRegLdst src) %{ ++ effect(DEF dst, USE src); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "ADDI $dst, $src, DISP.lo \t// load TOC lo" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ori); ++ __ calculate_address_from_global_toc_lo16only($dst$$Register, __ method_toc()); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Load 16-bit integer constant 0xssss???? ++instruct loadConI16(iRegIdst dst, immI16 src) %{ ++ match(Set dst src); ++ ++ format %{ "LI $dst, $src" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Load integer constant 0x????0000 ++instruct loadConIhi16(iRegIdst dst, immIhi16 src) %{ ++ match(Set dst src); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "LIS $dst, $src.hi" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ // Lis sign extends 16-bit src then shifts it 16 bit to the left. ++ __ lis($dst$$Register, (int)((short)(($src$$constant & 0xFFFF0000) >> 16))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Part 2 of loading 32 bit constant: hi16 is is src1 (properly shifted ++// and sign extended), this adds the low 16 bits. ++instruct loadConI32_lo16(iRegIdst dst, iRegIsrc src1, immI16 src2) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "ORI $dst, $src1.hi, $src2.lo" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ori); ++ __ ori($dst$$Register, $src1$$Register, ($src2$$constant) & 0xFFFF); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct loadConI_Ex(iRegIdst dst, immI src) %{ ++ match(Set dst src); ++ ins_cost(DEFAULT_COST*2); ++ ++ expand %{ ++ // Would like to use $src$$constant. ++ immI16 srcLo %{ _opnds[1]->constant() %} ++ // srcHi can be 0000 if srcLo sign-extends to a negative number. ++ immIhi16 srcHi %{ _opnds[1]->constant() %} ++ iRegIdst tmpI; ++ loadConIhi16(tmpI, srcHi); ++ loadConI32_lo16(dst, tmpI, srcLo); ++ %} ++%} ++ ++// No constant pool entries required. ++instruct loadConL16(iRegLdst dst, immL16 src) %{ ++ match(Set dst src); ++ ++ format %{ "LI $dst, $src \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, (int)((short) ($src$$constant & 0xFFFF))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Load long constant 0xssssssss????0000 ++instruct loadConL32hi16(iRegLdst dst, immL32hi16 src) %{ ++ match(Set dst src); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "LIS $dst, $src.hi \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ __ lis($dst$$Register, (int)((short)(($src$$constant & 0xFFFF0000) >> 16))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// To load a 32 bit constant: merge lower 16 bits into already loaded ++// high 16 bits. ++instruct loadConL32_lo16(iRegLdst dst, iRegLsrc src1, immL16 src2) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "ORI $dst, $src1, $src2.lo" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ori); ++ __ ori($dst$$Register, $src1$$Register, ($src2$$constant) & 0xFFFF); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Load 32-bit long constant ++instruct loadConL32_Ex(iRegLdst dst, immL32 src) %{ ++ match(Set dst src); ++ ins_cost(DEFAULT_COST*2); ++ ++ expand %{ ++ // Would like to use $src$$constant. ++ immL16 srcLo %{ _opnds[1]->constant() /*& 0x0000FFFFL */%} ++ // srcHi can be 0000 if srcLo sign-extends to a negative number. ++ immL32hi16 srcHi %{ _opnds[1]->constant() /*& 0xFFFF0000L */%} ++ iRegLdst tmpL; ++ loadConL32hi16(tmpL, srcHi); ++ loadConL32_lo16(dst, tmpL, srcLo); ++ %} ++%} ++ ++// Load long constant 0x????000000000000. ++instruct loadConLhighest16_Ex(iRegLdst dst, immLhighest16 src) %{ ++ match(Set dst src); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ immL32hi16 srcHi %{ _opnds[1]->constant() >> 32 /*& 0xFFFF0000L */%} ++ immI shift32 %{ 32 %} ++ iRegLdst tmpL; ++ loadConL32hi16(tmpL, srcHi); ++ lshiftL_regL_immI(dst, tmpL, shift32); ++ %} ++%} ++ ++// Expand node for constant pool load: small offset. ++instruct loadConL(iRegLdst dst, immL src, iRegLdst toc) %{ ++ effect(DEF dst, USE src, USE toc); ++ ins_cost(MEMORY_REF_COST); ++ ++ ins_num_consts(1); ++ // Needed so that CallDynamicJavaDirect can compute the address of this ++ // instruction for relocation. ++ ins_field_cbuf_insts_offset(int); ++ ++ format %{ "LD $dst, offset, $toc \t// load long $src from TOC" %} ++ size(4); ++ ins_encode( enc_load_long_constL(dst, src, toc) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Expand node for constant pool load: large offset. ++instruct loadConL_hi(iRegLdst dst, immL src, iRegLdst toc) %{ ++ effect(DEF dst, USE src, USE toc); ++ predicate(false); ++ ++ ins_num_consts(1); ++ ins_field_const_toc_offset(int); ++ // Needed so that CallDynamicJavaDirect can compute the address of this ++ // instruction for relocation. ++ ins_field_cbuf_insts_offset(int); ++ ++ format %{ "ADDIS $dst, $toc, offset \t// load long $src from TOC (hi)" %} ++ size(4); ++ ins_encode( enc_load_long_constL_hi(dst, toc, src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Expand node for constant pool load: large offset. ++// No constant pool entries required. ++instruct loadConL_lo(iRegLdst dst, immL src, iRegLdst base) %{ ++ effect(DEF dst, USE src, USE base); ++ predicate(false); ++ ++ ins_field_const_toc_offset_hi_node(loadConL_hiNode*); ++ ++ format %{ "LD $dst, offset, $base \t// load long $src from TOC (lo)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ld); ++ int offset = ra_->C->in_scratch_emit_size() ? 0 : _const_toc_offset_hi_node->_const_toc_offset; ++ __ ld($dst$$Register, MacroAssembler::largeoffset_si16_si16_lo(offset), $base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load long constant from constant table. Expand in case of ++// offset > 16 bit is needed. ++// Adlc adds toc node MachConstantTableBase. ++instruct loadConL_Ex(iRegLdst dst, immL src) %{ ++ match(Set dst src); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LD $dst, offset, $constanttablebase\t// load long $src from table, postalloc expanded" %} ++ // We can not inline the enc_class for the expand as that does not support constanttablebase. ++ postalloc_expand( postalloc_expand_load_long_constant(dst, src, constanttablebase) ); ++%} ++ ++// Load NULL as compressed oop. ++instruct loadConN0(iRegNdst dst, immN_0 src) %{ ++ match(Set dst src); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "LI $dst, $src \t// compressed ptr" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, 0); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Load hi part of compressed oop constant. ++instruct loadConN_hi(iRegNdst dst, immN src) %{ ++ effect(DEF dst, USE src); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "LIS $dst, $src \t// narrow oop hi" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ __ lis($dst$$Register, (int)(short)(($src$$constant >> 16) & 0xffff)); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Add lo part of compressed oop constant to already loaded hi part. ++instruct loadConN_lo(iRegNdst dst, iRegNsrc src1, immN src2) %{ ++ effect(DEF dst, USE src1, USE src2); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "ORI $dst, $src1, $src2 \t// narrow oop lo" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ assert(__ oop_recorder() != NULL, "this assembler needs an OopRecorder"); ++ int oop_index = __ oop_recorder()->find_index((jobject)$src2$$constant); ++ RelocationHolder rspec = oop_Relocation::spec(oop_index); ++ __ relocate(rspec, 1); ++ __ ori($dst$$Register, $src1$$Register, $src2$$constant & 0xffff); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Needed to postalloc expand loadConN: ConN is loaded as ConI ++// leaving the upper 32 bits with sign-extension bits. ++// This clears these bits: dst = src & 0xFFFFFFFF. ++// TODO: Eventually call this maskN_regN_FFFFFFFF. ++instruct clearMs32b(iRegNdst dst, iRegNsrc src) %{ ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "MASK $dst, $src, 0xFFFFFFFF" %} // mask ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ clrldi($dst$$Register, $src$$Register, 0x20); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Loading ConN must be postalloc expanded so that edges between ++// the nodes are safe. They may not interfere with a safepoint. ++// GL TODO: This needs three instructions: better put this into the constant pool. ++instruct loadConN_Ex(iRegNdst dst, immN src) %{ ++ match(Set dst src); ++ ins_cost(DEFAULT_COST*2); ++ ++ 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(); ++ m1->add_req(NULL); ++ m2->add_req(NULL, m1); ++ m3->add_req(NULL, m2); ++ m1->_opnds[0] = op_dst; ++ m1->_opnds[1] = op_src; ++ m2->_opnds[0] = op_dst; ++ m2->_opnds[1] = op_dst; ++ m2->_opnds[2] = op_src; ++ m3->_opnds[0] = op_dst; ++ m3->_opnds[1] = op_dst; ++ ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(m3->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ nodes->push(m1); ++ nodes->push(m2); ++ nodes->push(m3); ++ %} ++%} ++ ++instruct loadConNKlass_hi(iRegNdst dst, immNKlass src) %{ ++ effect(DEF dst, USE src); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "LIS $dst, $src \t// narrow oop hi" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ intptr_t Csrc = Klass::encode_klass((Klass *)$src$$constant); ++ __ lis($dst$$Register, (int)(short)((Csrc >> 16) & 0xffff)); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// This needs a match rule so that build_oop_map knows this is ++// not a narrow oop. ++instruct loadConNKlass_lo(iRegNdst dst, immNKlass_NM src1, iRegNsrc src2) %{ ++ match(Set dst src1); ++ effect(TEMP src2); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "ADDI $dst, $src1, $src2 \t// narrow oop lo" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ intptr_t Csrc = Klass::encode_klass((Klass *)$src1$$constant); ++ assert(__ oop_recorder() != NULL, "this assembler needs an OopRecorder"); ++ int klass_index = __ oop_recorder()->find_index((Klass *)$src1$$constant); ++ RelocationHolder rspec = metadata_Relocation::spec(klass_index); ++ ++ __ relocate(rspec, 1); ++ __ ori($dst$$Register, $src2$$Register, Csrc & 0xffff); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Loading ConNKlass must be postalloc expanded so that edges between ++// the nodes are safe. They may not interfere with a safepoint. ++instruct loadConNKlass_Ex(iRegNdst dst, immNKlass src) %{ ++ match(Set dst src); ++ ins_cost(DEFAULT_COST*2); ++ ++ format %{ "LoadN $dst, $src \t// postalloc expanded" %} // mask ++ postalloc_expand %{ ++ // Load high bits into register. Sign extended. ++ MachNode *m1 = new (C) loadConNKlass_hiNode(); ++ m1->add_req(NULL); ++ m1->_opnds[0] = op_dst; ++ m1->_opnds[1] = op_src; ++ ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ nodes->push(m1); ++ ++ 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->add_req(NULL, m1); ++ m2->_opnds[0] = op_dst; ++ m2->_opnds[1] = op_dst; ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ nodes->push(m2); ++ } ++ ++ MachNode *m3 = new (C) loadConNKlass_loNode(); ++ m3->add_req(NULL, m2); ++ m3->_opnds[0] = op_dst; ++ m3->_opnds[1] = op_src; ++ m3->_opnds[2] = op_dst; ++ ra_->set_pair(m3->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ nodes->push(m3); ++ %} ++%} ++ ++// 0x1 is used in object initialization (initial object header). ++// No constant pool entries required. ++instruct loadConP0or1(iRegPdst dst, immP_0or1 src) %{ ++ match(Set dst src); ++ ++ format %{ "LI $dst, $src \t// ptr" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Expand node for constant pool load: small offset. ++// The match rule is needed to generate the correct bottom_type(), ++// however this node should never match. The use of predicate is not ++// possible since ADLC forbids predicates for chain rules. The higher ++// costs do not prevent matching in this case. For that reason the ++// operand immP_NM with predicate(false) is used. ++instruct loadConP(iRegPdst dst, immP_NM src, iRegLdst toc) %{ ++ match(Set dst src); ++ effect(TEMP toc); ++ ++ ins_num_consts(1); ++ ++ format %{ "LD $dst, offset, $toc \t// load ptr $src from TOC" %} ++ size(4); ++ ins_encode( enc_load_long_constP(dst, src, toc) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Expand node for constant pool load: large offset. ++instruct loadConP_hi(iRegPdst dst, immP_NM src, iRegLdst toc) %{ ++ effect(DEF dst, USE src, USE toc); ++ predicate(false); ++ ++ ins_num_consts(1); ++ ins_field_const_toc_offset(int); ++ ++ format %{ "ADDIS $dst, $toc, offset \t// load ptr $src from TOC (hi)" %} ++ size(4); ++ ins_encode( enc_load_long_constP_hi(dst, src, toc) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Expand node for constant pool load: large offset. ++instruct loadConP_lo(iRegPdst dst, immP_NM src, iRegLdst base) %{ ++ match(Set dst src); ++ effect(TEMP base); ++ ++ ins_field_const_toc_offset_hi_node(loadConP_hiNode*); ++ ++ format %{ "LD $dst, offset, $base \t// load ptr $src from TOC (lo)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ld); ++ int offset = ra_->C->in_scratch_emit_size() ? 0 : _const_toc_offset_hi_node->_const_toc_offset; ++ __ ld($dst$$Register, MacroAssembler::largeoffset_si16_si16_lo(offset), $base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load pointer constant from constant table. Expand in case an ++// offset > 16 bit is needed. ++// Adlc adds toc node MachConstantTableBase. ++instruct loadConP_Ex(iRegPdst dst, immP src) %{ ++ match(Set dst src); ++ ins_cost(MEMORY_REF_COST); ++ ++ // This rule does not use "expand" because then ++ // the result type is not known to be an Oop. An ADLC ++ // enhancement will be needed to make that work - not worth it! ++ ++ // If this instruction rematerializes, it prolongs the live range ++ // of the toc node, causing illegal graphs. ++ // assert(edge_from_to(_reg_node[reg_lo],def)) fails in verify_good_schedule(). ++ ins_cannot_rematerialize(true); ++ ++ format %{ "LD $dst, offset, $constanttablebase \t// load ptr $src from table, postalloc expanded" %} ++ postalloc_expand( postalloc_expand_load_ptr_constant(dst, src, constanttablebase) ); ++%} ++ ++// Expand node for constant pool load: small offset. ++instruct loadConF(regF dst, immF src, iRegLdst toc) %{ ++ effect(DEF dst, USE src, USE toc); ++ ins_cost(MEMORY_REF_COST); ++ ++ ins_num_consts(1); ++ ++ format %{ "LFS $dst, offset, $toc \t// load float $src from TOC" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lfs); ++ address float_address = __ float_constant($src$$constant); ++ __ lfs($dst$$FloatRegister, __ offset_to_method_toc(float_address), $toc$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Expand node for constant pool load: large offset. ++instruct loadConFComp(regF dst, immF src, iRegLdst toc) %{ ++ effect(DEF dst, USE src, USE toc); ++ ins_cost(MEMORY_REF_COST); ++ ++ ins_num_consts(1); ++ ++ format %{ "ADDIS $toc, $toc, offset_hi\n\t" ++ "LFS $dst, offset_lo, $toc \t// load float $src from TOC (hi/lo)\n\t" ++ "ADDIS $toc, $toc, -offset_hi"%} ++ size(12); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ FloatRegister Rdst = $dst$$FloatRegister; ++ Register Rtoc = $toc$$Register; ++ address float_address = __ float_constant($src$$constant); ++ int offset = __ offset_to_method_toc(float_address); ++ int hi = (offset + (1<<15))>>16; ++ int lo = offset - hi * (1<<16); ++ ++ __ addis(Rtoc, Rtoc, hi); ++ __ lfs(Rdst, lo, Rtoc); ++ __ addis(Rtoc, Rtoc, -hi); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Adlc adds toc node MachConstantTableBase. ++instruct loadConF_Ex(regF dst, immF src) %{ ++ match(Set dst src); ++ ins_cost(MEMORY_REF_COST); ++ ++ // See loadConP. ++ ins_cannot_rematerialize(true); ++ ++ format %{ "LFS $dst, offset, $constanttablebase \t// load $src from table, postalloc expanded" %} ++ postalloc_expand( postalloc_expand_load_float_constant(dst, src, constanttablebase) ); ++%} ++ ++// Expand node for constant pool load: small offset. ++instruct loadConD(regD dst, immD src, iRegLdst toc) %{ ++ effect(DEF dst, USE src, USE toc); ++ ins_cost(MEMORY_REF_COST); ++ ++ ins_num_consts(1); ++ ++ format %{ "LFD $dst, offset, $toc \t// load double $src from TOC" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lfd); ++ int offset = __ offset_to_method_toc(__ double_constant($src$$constant)); ++ __ lfd($dst$$FloatRegister, offset, $toc$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Expand node for constant pool load: large offset. ++instruct loadConDComp(regD dst, immD src, iRegLdst toc) %{ ++ effect(DEF dst, USE src, USE toc); ++ ins_cost(MEMORY_REF_COST); ++ ++ ins_num_consts(1); ++ ++ format %{ "ADDIS $toc, $toc, offset_hi\n\t" ++ "LFD $dst, offset_lo, $toc \t// load double $src from TOC (hi/lo)\n\t" ++ "ADDIS $toc, $toc, -offset_hi" %} ++ size(12); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ FloatRegister Rdst = $dst$$FloatRegister; ++ Register Rtoc = $toc$$Register; ++ address float_address = __ double_constant($src$$constant); ++ int offset = __ offset_to_method_toc(float_address); ++ int hi = (offset + (1<<15))>>16; ++ int lo = offset - hi * (1<<16); ++ ++ __ addis(Rtoc, Rtoc, hi); ++ __ lfd(Rdst, lo, Rtoc); ++ __ addis(Rtoc, Rtoc, -hi); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Adlc adds toc node MachConstantTableBase. ++instruct loadConD_Ex(regD dst, immD src) %{ ++ match(Set dst src); ++ ins_cost(MEMORY_REF_COST); ++ ++ // See loadConP. ++ ins_cannot_rematerialize(true); ++ ++ format %{ "ConD $dst, offset, $constanttablebase \t// load $src from table, postalloc expanded" %} ++ postalloc_expand( postalloc_expand_load_double_constant(dst, src, constanttablebase) ); ++%} ++ ++// Prefetch instructions. ++// Must be safe to execute with invalid address (cannot fault). ++ ++instruct prefetchr(indirectMemory mem, iRegLsrc src) %{ ++ match(PrefetchRead (AddP mem src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "PREFETCH $mem, 0, $src \t// Prefetch read-many" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_dcbt); ++ __ dcbt($src$$Register, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++instruct prefetchr_no_offset(indirectMemory mem) %{ ++ match(PrefetchRead mem); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "PREFETCH $mem" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_dcbt); ++ __ dcbt($mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++instruct prefetchw(indirectMemory mem, iRegLsrc src) %{ ++ match(PrefetchWrite (AddP mem src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "PREFETCH $mem, 2, $src \t// Prefetch write-many (and read)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_dcbtst); ++ __ dcbtst($src$$Register, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++instruct prefetchw_no_offset(indirectMemory mem) %{ ++ match(PrefetchWrite mem); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "PREFETCH $mem" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_dcbtst); ++ __ dcbtst($mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Special prefetch versions which use the dcbz instruction. ++instruct prefetch_alloc_zero(indirectMemory mem, iRegLsrc src) %{ ++ match(PrefetchAllocation (AddP mem src)); ++ predicate(AllocatePrefetchStyle == 3); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "PREFETCH $mem, 2, $src \t// Prefetch write-many with zero" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_dcbtst); ++ __ dcbz($src$$Register, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++instruct prefetch_alloc_zero_no_offset(indirectMemory mem) %{ ++ match(PrefetchAllocation mem); ++ predicate(AllocatePrefetchStyle == 3); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "PREFETCH $mem, 2 \t// Prefetch write-many with zero" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_dcbtst); ++ __ dcbz($mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++instruct prefetch_alloc(indirectMemory mem, iRegLsrc src) %{ ++ match(PrefetchAllocation (AddP mem src)); ++ predicate(AllocatePrefetchStyle != 3); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "PREFETCH $mem, 2, $src \t// Prefetch write-many" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_dcbtst); ++ __ dcbtst($src$$Register, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++instruct prefetch_alloc_no_offset(indirectMemory mem) %{ ++ match(PrefetchAllocation mem); ++ predicate(AllocatePrefetchStyle != 3); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "PREFETCH $mem, 2 \t// Prefetch write-many" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_dcbtst); ++ __ dcbtst($mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++//----------Store Instructions------------------------------------------------- ++ ++// Store Byte ++instruct storeB(memory mem, iRegIsrc src) %{ ++ match(Set mem (StoreB mem src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STB $src, $mem \t// byte" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_stb); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ stb($src$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store Char/Short ++instruct storeC(memory mem, iRegIsrc src) %{ ++ match(Set mem (StoreC mem src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STH $src, $mem \t// short" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_sth); ++ int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_); ++ __ sth($src$$Register, Idisp, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store Integer ++instruct storeI(memory mem, iRegIsrc src) %{ ++ match(Set mem (StoreI mem src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STW $src, $mem" %} ++ size(4); ++ ins_encode( enc_stw(src, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// ConvL2I + StoreI. ++instruct storeI_convL2I(memory mem, iRegLsrc src) %{ ++ match(Set mem (StoreI mem (ConvL2I src))); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STW l2i($src), $mem" %} ++ size(4); ++ ins_encode( enc_stw(src, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store Long ++instruct storeL(memoryAlg4 mem, iRegLsrc src) %{ ++ match(Set mem (StoreL mem src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STD $src, $mem \t// long" %} ++ size(4); ++ ins_encode( enc_std(src, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store super word nodes. ++ ++// Store Aligned Packed Byte long register to memory ++instruct storeA8B(memoryAlg4 mem, iRegLsrc src) %{ ++ predicate(n->as_StoreVector()->memory_size() == 8); ++ match(Set mem (StoreVector mem src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STD $mem, $src \t// packed8B" %} ++ size(4); ++ ins_encode( enc_std(src, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store Compressed Oop ++instruct storeN(memory dst, iRegN_P2N src) %{ ++ match(Set dst (StoreN dst src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STW $src, $dst \t// compressed oop" %} ++ size(4); ++ ins_encode( enc_stw(src, dst) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store Compressed KLass ++instruct storeNKlass(memory dst, iRegN_P2N src) %{ ++ match(Set dst (StoreNKlass dst src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STW $src, $dst \t// compressed klass" %} ++ size(4); ++ ins_encode( enc_stw(src, dst) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store Pointer ++instruct storeP(memoryAlg4 dst, iRegPsrc src) %{ ++ match(Set dst (StoreP dst src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STD $src, $dst \t// ptr" %} ++ size(4); ++ ins_encode( enc_std(src, dst) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store Float ++instruct storeF(memory mem, regF src) %{ ++ match(Set mem (StoreF mem src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STFS $src, $mem" %} ++ size(4); ++ ins_encode( enc_stfs(src, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store Double ++instruct storeD(memory mem, regD src) %{ ++ match(Set mem (StoreD mem src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STFD $src, $mem" %} ++ size(4); ++ ins_encode( enc_stfd(src, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++//----------Store Instructions With Zeros-------------------------------------- ++ ++// Card-mark for CMS garbage collection. ++// This cardmark does an optimization so that it must not always ++// do a releasing store. For this, it gets the address of ++// CMSCollectorCardTableModRefBSExt::_requires_release as input. ++// (Using releaseFieldAddr in the match rule is a hack.) ++instruct storeCM_CMS(memory mem, iRegLdst releaseFieldAddr) %{ ++ match(Set mem (StoreCM mem releaseFieldAddr)); ++ predicate(false); ++ ins_cost(MEMORY_REF_COST); ++ ++ // See loadConP. ++ ins_cannot_rematerialize(true); ++ ++ format %{ "STB #0, $mem \t// CMS card-mark byte (must be 0!), checking requires_release in [$releaseFieldAddr]" %} ++ ins_encode( enc_cms_card_mark(mem, releaseFieldAddr) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Card-mark for CMS garbage collection. ++// This cardmark does an optimization so that it must not always ++// do a releasing store. For this, it needs the constant address of ++// CMSCollectorCardTableModRefBSExt::_requires_release. ++// This constant address is split off here by expand so we can use ++// adlc / matcher functionality to load it from the constant section. ++instruct storeCM_CMS_ExEx(memory mem, immI_0 zero) %{ ++ match(Set mem (StoreCM mem zero)); ++ predicate(UseConcMarkSweepGC); ++ ++ expand %{ ++ immL baseImm %{ 0 /* TODO: PPC port (jlong)CMSCollectorCardTableModRefBSExt::requires_release_address() */ %} ++ iRegLdst releaseFieldAddress; ++ loadConL_Ex(releaseFieldAddress, baseImm); ++ storeCM_CMS(mem, releaseFieldAddress); ++ %} ++%} ++ ++instruct storeCM_G1(memory mem, immI_0 zero) %{ ++ match(Set mem (StoreCM mem zero)); ++ predicate(UseG1GC); ++ ins_cost(MEMORY_REF_COST); ++ ++ ins_cannot_rematerialize(true); ++ ++ format %{ "STB #0, $mem \t// CMS card-mark byte store (G1)" %} ++ size(8); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ li(R0, 0); ++ //__ release(); // G1: oops are allowed to get visible after dirty marking ++ guarantee($mem$$base$$Register != R1_SP, "use frame_slots_bias"); ++ __ stb(R0, $mem$$disp, $mem$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Convert oop pointer into compressed form. ++ ++// Nodes for postalloc expand. ++ ++// Shift node for expand. ++instruct encodeP_shift(iRegNdst dst, iRegNsrc src) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (EncodeP src)); ++ predicate(false); ++ ++ format %{ "SRDI $dst, $src, 3 \t// encode" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ srdi($dst$$Register, $src$$Register, Universe::narrow_oop_shift() & 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Add node for expand. ++instruct encodeP_sub(iRegPdst dst, iRegPdst src) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (EncodeP src)); ++ predicate(false); ++ ++ format %{ "SUB $dst, $src, oop_base \t// encode" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_subf); ++ __ subf($dst$$Register, R30, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Conditional sub base. ++instruct cond_sub_base(iRegNdst dst, flagsReg crx, iRegPsrc src1) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (EncodeP (Binary crx src1))); ++ predicate(false); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "BEQ $crx, done\n\t" ++ "SUB $dst, $src1, R30 \t// encode: subtract base if != NULL\n" ++ "done:" %} ++ size(false /* TODO: PPC PORT (InsertEndGroupPPC64 && Compile::current()->do_hb_scheduling())*/ ? 12 : 8); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmove); ++ Label done; ++ __ beq($crx$$CondRegister, done); ++ __ subf($dst$$Register, R30, $src1$$Register); ++ // TODO PPC port __ endgroup_if_needed(_size == 12); ++ __ bind(done); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Power 7 can use isel instruction ++instruct cond_set_0_oop(iRegNdst dst, flagsReg crx, iRegPsrc src1) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (EncodeP (Binary crx src1))); ++ predicate(false); ++ ++ format %{ "CMOVE $dst, $crx eq, 0, $src1 \t// encode: preserve 0" %} ++ size(4); ++ ins_encode %{ ++ // This is a Power7 instruction for which no machine description exists. ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ isel_0($dst$$Register, $crx$$CondRegister, Assembler::equal, $src1$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// base != 0 ++// 32G aligned narrow oop base. ++instruct encodeP_32GAligned(iRegNdst dst, iRegPsrc src) %{ ++ match(Set dst (EncodeP src)); ++ predicate(false /* TODO: PPC port Universe::narrow_oop_base_disjoint()*/); ++ ++ format %{ "EXTRDI $dst, $src, #32, #3 \t// encode with 32G aligned base" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ rldicl($dst$$Register, $src$$Register, 64-Universe::narrow_oop_shift(), 32); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// shift != 0, base != 0 ++instruct encodeP_Ex(iRegNdst dst, flagsReg crx, iRegPsrc src) %{ ++ match(Set dst (EncodeP src)); ++ effect(TEMP crx); ++ predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull && ++ Universe::narrow_oop_shift() != 0 && ++ true /* TODO: PPC port Universe::narrow_oop_base_overlaps()*/); ++ ++ format %{ "EncodeP $dst, $crx, $src \t// postalloc expanded" %} ++ postalloc_expand( postalloc_expand_encode_oop(dst, src, crx)); ++%} ++ ++// shift != 0, base != 0 ++instruct encodeP_not_null_Ex(iRegNdst dst, iRegPsrc src) %{ ++ match(Set dst (EncodeP src)); ++ predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull && ++ Universe::narrow_oop_shift() != 0 && ++ true /* TODO: PPC port Universe::narrow_oop_base_overlaps()*/); ++ ++ format %{ "EncodeP $dst, $src\t// $src != Null, postalloc expanded" %} ++ postalloc_expand( postalloc_expand_encode_oop_not_null(dst, src) ); ++%} ++ ++// shift != 0, base == 0 ++// TODO: This is the same as encodeP_shift. Merge! ++instruct encodeP_not_null_base_null(iRegNdst dst, iRegPsrc src) %{ ++ match(Set dst (EncodeP src)); ++ predicate(Universe::narrow_oop_shift() != 0 && ++ Universe::narrow_oop_base() ==0); ++ ++ format %{ "SRDI $dst, $src, #3 \t// encodeP, $src != NULL" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ srdi($dst$$Register, $src$$Register, Universe::narrow_oop_shift() & 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Compressed OOPs with narrow_oop_shift == 0. ++// shift == 0, base == 0 ++instruct encodeP_narrow_oop_shift_0(iRegNdst dst, iRegPsrc src) %{ ++ match(Set dst (EncodeP src)); ++ predicate(Universe::narrow_oop_shift() == 0); ++ ++ format %{ "MR $dst, $src \t// Ptr->Narrow" %} ++ // variable size, 0 or 4. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ mr_if_needed($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Decode nodes. ++ ++// Shift node for expand. ++instruct decodeN_shift(iRegPdst dst, iRegPsrc src) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (DecodeN src)); ++ predicate(false); ++ ++ format %{ "SLDI $dst, $src, #3 \t// DecodeN" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicr); ++ __ sldi($dst$$Register, $src$$Register, Universe::narrow_oop_shift()); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Add node for expand. ++instruct decodeN_add(iRegPdst dst, iRegPdst src) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (DecodeN src)); ++ predicate(false); ++ ++ format %{ "ADD $dst, $src, R30 \t// DecodeN, add oop base" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_add); ++ __ add($dst$$Register, $src$$Register, R30); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// conditianal add base for expand ++instruct cond_add_base(iRegPdst dst, flagsReg crx, iRegPsrc src1) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ // NOTICE that the rule is nonsense - we just have to make sure that: ++ // - _matrule->_rChild->_opType == "DecodeN" (see InstructForm::captures_bottom_type() in formssel.cpp) ++ // - we have to match 'crx' to avoid an "illegal USE of non-input: flagsReg crx" error in ADLC. ++ match(Set dst (DecodeN (Binary crx src1))); ++ predicate(false); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "BEQ $crx, done\n\t" ++ "ADD $dst, $src1, R30 \t// DecodeN: add oop base if $src1 != NULL\n" ++ "done:" %} ++ size(false /* TODO: PPC PORT (InsertEndGroupPPC64 && Compile::current()->do_hb_scheduling()) */? 12 : 8); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmove); ++ Label done; ++ __ beq($crx$$CondRegister, done); ++ __ add($dst$$Register, $src1$$Register, R30); ++ // TODO PPC port __ endgroup_if_needed(_size == 12); ++ __ bind(done); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cond_set_0_ptr(iRegPdst dst, flagsReg crx, iRegPsrc src1) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ // NOTICE that the rule is nonsense - we just have to make sure that: ++ // - _matrule->_rChild->_opType == "DecodeN" (see InstructForm::captures_bottom_type() in formssel.cpp) ++ // - we have to match 'crx' to avoid an "illegal USE of non-input: flagsReg crx" error in ADLC. ++ match(Set dst (DecodeN (Binary crx src1))); ++ predicate(false); ++ ++ format %{ "CMOVE $dst, $crx eq, 0, $src1 \t// decode: preserve 0" %} ++ size(4); ++ ins_encode %{ ++ // This is a Power7 instruction for which no machine description exists. ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ isel_0($dst$$Register, $crx$$CondRegister, Assembler::equal, $src1$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// shift != 0, base != 0 ++instruct decodeN_Ex(iRegPdst dst, iRegNsrc src, flagsReg crx) %{ ++ match(Set dst (DecodeN src)); ++ predicate((n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull && ++ n->bottom_type()->is_oopptr()->ptr() != TypePtr::Constant) && ++ Universe::narrow_oop_shift() != 0 && ++ Universe::narrow_oop_base() != 0); ++ effect(TEMP crx); ++ ++ format %{ "DecodeN $dst, $src \t// Kills $crx, postalloc expanded" %} ++ postalloc_expand( postalloc_expand_decode_oop(dst, src, crx) ); ++%} ++ ++// shift != 0, base == 0 ++instruct decodeN_nullBase(iRegPdst dst, iRegNsrc src) %{ ++ match(Set dst (DecodeN src)); ++ predicate(Universe::narrow_oop_shift() != 0 && ++ Universe::narrow_oop_base() == 0); ++ ++ format %{ "SLDI $dst, $src, #3 \t// DecodeN (zerobased)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicr); ++ __ sldi($dst$$Register, $src$$Register, Universe::narrow_oop_shift()); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// src != 0, shift != 0, base != 0 ++instruct decodeN_notNull_addBase_Ex(iRegPdst dst, iRegNsrc src) %{ ++ match(Set dst (DecodeN src)); ++ predicate((n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull || ++ n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant) && ++ Universe::narrow_oop_shift() != 0 && ++ Universe::narrow_oop_base() != 0); ++ ++ format %{ "DecodeN $dst, $src \t// $src != NULL, postalloc expanded" %} ++ postalloc_expand( postalloc_expand_decode_oop_not_null(dst, src)); ++%} ++ ++// Compressed OOPs with narrow_oop_shift == 0. ++instruct decodeN_unscaled(iRegPdst dst, iRegNsrc src) %{ ++ match(Set dst (DecodeN src)); ++ predicate(Universe::narrow_oop_shift() == 0); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "MR $dst, $src \t// DecodeN (unscaled)" %} ++ // variable size, 0 or 4. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ mr_if_needed($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Convert compressed oop into int for vectors alignment masking. ++instruct decodeN2I_unscaled(iRegIdst dst, iRegNsrc src) %{ ++ match(Set dst (ConvL2I (CastP2X (DecodeN src)))); ++ predicate(Universe::narrow_oop_shift() == 0); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "MR $dst, $src \t// (int)DecodeN (unscaled)" %} ++ // variable size, 0 or 4. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ mr_if_needed($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Convert klass pointer into compressed form. ++ ++// Nodes for postalloc expand. ++ ++// Shift node for expand. ++instruct encodePKlass_shift(iRegNdst dst, iRegNsrc src) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (EncodePKlass src)); ++ predicate(false); ++ ++ format %{ "SRDI $dst, $src, 3 \t// encode" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ srdi($dst$$Register, $src$$Register, Universe::narrow_klass_shift()); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Add node for expand. ++instruct encodePKlass_sub_base(iRegPdst dst, iRegLsrc base, iRegPdst src) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (EncodePKlass (Binary base src))); ++ predicate(false); ++ ++ format %{ "SUB $dst, $base, $src \t// encode" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_subf); ++ __ subf($dst$$Register, $base$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// base != 0 ++// 32G aligned narrow oop base. ++instruct encodePKlass_32GAligned(iRegNdst dst, iRegPsrc src) %{ ++ match(Set dst (EncodePKlass src)); ++ predicate(false /* TODO: PPC port Universe::narrow_klass_base_disjoint()*/); ++ ++ format %{ "EXTRDI $dst, $src, #32, #3 \t// encode with 32G aligned base" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ rldicl($dst$$Register, $src$$Register, 64-Universe::narrow_oop_shift(), 32); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// shift != 0, base != 0 ++instruct encodePKlass_not_null_Ex(iRegNdst dst, iRegLsrc base, iRegPsrc src) %{ ++ match(Set dst (EncodePKlass (Binary base src))); ++ predicate(false); ++ ++ format %{ "EncodePKlass $dst, $src\t// $src != Null, postalloc expanded" %} ++ postalloc_expand %{ ++ encodePKlass_sub_baseNode *n1 = new (C) 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(); ++ n2->add_req(n_region, n1); ++ n2->_opnds[0] = op_dst; ++ n2->_opnds[1] = op_dst; ++ n2->_bottom_type = _bottom_type; ++ ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ nodes->push(n1); ++ nodes->push(n2); ++ %} ++%} ++ ++// shift != 0, base != 0 ++instruct encodePKlass_not_null_ExEx(iRegNdst dst, iRegPsrc src) %{ ++ match(Set dst (EncodePKlass src)); ++ //predicate(Universe::narrow_klass_shift() != 0 && ++ // true /* TODO: PPC port Universe::narrow_klass_base_overlaps()*/); ++ ++ //format %{ "EncodePKlass $dst, $src\t// $src != Null, postalloc expanded" %} ++ ins_cost(DEFAULT_COST*2); // Don't count constant. ++ expand %{ ++ immL baseImm %{ (jlong)(intptr_t)Universe::narrow_klass_base() %} ++ iRegLdst base; ++ loadConL_Ex(base, baseImm); ++ encodePKlass_not_null_Ex(dst, base, src); ++ %} ++%} ++ ++// Decode nodes. ++ ++// Shift node for expand. ++instruct decodeNKlass_shift(iRegPdst dst, iRegPsrc src) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (DecodeNKlass src)); ++ predicate(false); ++ ++ format %{ "SLDI $dst, $src, #3 \t// DecodeNKlass" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicr); ++ __ sldi($dst$$Register, $src$$Register, Universe::narrow_klass_shift()); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Add node for expand. ++ ++instruct decodeNKlass_add_base(iRegPdst dst, iRegLsrc base, iRegPdst src) %{ ++ // The match rule is needed to make it a 'MachTypeNode'! ++ match(Set dst (DecodeNKlass (Binary base src))); ++ predicate(false); ++ ++ format %{ "ADD $dst, $base, $src \t// DecodeNKlass, add klass base" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_add); ++ __ add($dst$$Register, $base$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// src != 0, shift != 0, base != 0 ++instruct decodeNKlass_notNull_addBase_Ex(iRegPdst dst, iRegLsrc base, iRegNsrc src) %{ ++ match(Set dst (DecodeNKlass (Binary base src))); ++ //effect(kill src); // We need a register for the immediate result after shifting. ++ predicate(false); ++ ++ format %{ "DecodeNKlass $dst = $base + ($src << 3) \t// $src != NULL, postalloc expanded" %} ++ postalloc_expand %{ ++ decodeNKlass_add_baseNode *n1 = new (C) 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(); ++ n2->add_req(n_region, n1); ++ n2->_opnds[0] = op_dst; ++ n2->_opnds[1] = op_dst; ++ n2->_bottom_type = _bottom_type; ++ ++ ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ra_->set_pair(n2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ++ ++ nodes->push(n1); ++ nodes->push(n2); ++ %} ++%} ++ ++// src != 0, shift != 0, base != 0 ++instruct decodeNKlass_notNull_addBase_ExEx(iRegPdst dst, iRegNsrc src) %{ ++ match(Set dst (DecodeNKlass src)); ++ // predicate(Universe::narrow_klass_shift() != 0 && ++ // Universe::narrow_klass_base() != 0); ++ ++ //format %{ "DecodeNKlass $dst, $src \t// $src != NULL, expanded" %} ++ ++ ins_cost(DEFAULT_COST*2); // Don't count constant. ++ expand %{ ++ // We add first, then we shift. Like this, we can get along with one register less. ++ // But we have to load the base pre-shifted. ++ immL baseImm %{ (jlong)((intptr_t)Universe::narrow_klass_base() >> Universe::narrow_klass_shift()) %} ++ iRegLdst base; ++ loadConL_Ex(base, baseImm); ++ decodeNKlass_notNull_addBase_Ex(dst, base, src); ++ %} ++%} ++ ++//----------MemBar Instructions----------------------------------------------- ++// Memory barrier flavors ++ ++instruct membar_acquire() %{ ++ match(LoadFence); ++ ins_cost(4*MEMORY_REF_COST); ++ ++ format %{ "MEMBAR-acquire" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lwsync); ++ __ acquire(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct unnecessary_membar_acquire() %{ ++ match(MemBarAcquire); ++ ins_cost(0); ++ ++ format %{ " -- \t// redundant MEMBAR-acquire - empty" %} ++ size(0); ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct membar_acquire_lock() %{ ++ match(MemBarAcquireLock); ++ ins_cost(0); ++ ++ format %{ " -- \t// redundant MEMBAR-acquire - empty (acquire as part of CAS in prior FastLock)" %} ++ size(0); ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct membar_release() %{ ++ match(MemBarRelease); ++ match(StoreFence); ++ ins_cost(4*MEMORY_REF_COST); ++ ++ format %{ "MEMBAR-release" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lwsync); ++ __ release(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct membar_storestore() %{ ++ match(MemBarStoreStore); ++ ins_cost(4*MEMORY_REF_COST); ++ ++ format %{ "MEMBAR-store-store" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lwsync); ++ __ membar(Assembler::StoreStore); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct membar_release_lock() %{ ++ match(MemBarReleaseLock); ++ ins_cost(0); ++ ++ format %{ " -- \t// redundant MEMBAR-release - empty (release in FastUnlock)" %} ++ size(0); ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct membar_volatile() %{ ++ match(MemBarVolatile); ++ ins_cost(4*MEMORY_REF_COST); ++ ++ format %{ "MEMBAR-volatile" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_sync); ++ __ fence(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// This optimization is wrong on PPC. The following pattern is not supported: ++// MemBarVolatile ++// ^ ^ ++// | | ++// CtrlProj MemProj ++// ^ ^ ++// | | ++// | Load ++// | ++// MemBarVolatile ++// ++// The first MemBarVolatile could get optimized out! According to ++// Vladimir, this pattern can not occur on Oracle platforms. ++// However, it does occur on PPC64 (because of membars in ++// inline_unsafe_load_store). ++// ++// Add this node again if we found a good solution for inline_unsafe_load_store(). ++// Don't forget to look at the implementation of post_store_load_barrier again, ++// we did other fixes in that method. ++//instruct unnecessary_membar_volatile() %{ ++// match(MemBarVolatile); ++// predicate(Matcher::post_store_load_barrier(n)); ++// ins_cost(0); ++// ++// format %{ " -- \t// redundant MEMBAR-volatile - empty" %} ++// size(0); ++// ins_encode( /*empty*/ ); ++// ins_pipe(pipe_class_default); ++//%} ++ ++instruct membar_CPUOrder() %{ ++ match(MemBarCPUOrder); ++ ins_cost(0); ++ ++ format %{ " -- \t// MEMBAR-CPUOrder - empty: PPC64 processors are self-consistent." %} ++ size(0); ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Conditional Move--------------------------------------------------- ++ ++// Cmove using isel. ++instruct cmovI_reg_isel(cmpOp cmp, flagsReg crx, iRegIdst dst, iRegIsrc src) %{ ++ match(Set dst (CMoveI (Binary cmp crx) (Binary dst src))); ++ predicate(VM_Version::has_isel()); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ size(4); ++ ins_encode %{ ++ // This is a Power7 instruction for which no machine description ++ // exists. Anyways, the scheduler should be off on Power7. ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ int cc = $cmp$$cmpcode; ++ __ isel($dst$$Register, $crx$$CondRegister, ++ (Assembler::Condition)(cc & 3), /*invert*/((~cc) & 8), $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovI_reg(cmpOp cmp, flagsReg crx, iRegIdst dst, iRegIsrc src) %{ ++ match(Set dst (CMoveI (Binary cmp crx) (Binary dst src))); ++ predicate(!VM_Version::has_isel()); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler ++ size(false /* TODO: PPC PORT Compile::current()->do_hb_scheduling()*/ ? 12 : 8); ++ ins_encode( enc_cmove_reg(dst, crx, src, cmp) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovI_imm(cmpOp cmp, flagsReg crx, iRegIdst dst, immI16 src) %{ ++ match(Set dst (CMoveI (Binary cmp crx) (Binary dst src))); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler ++ size(false /* TODO: PPC PORT Compile::current()->do_hb_scheduling()*/ ? 12 : 8); ++ ins_encode( enc_cmove_imm(dst, crx, src, cmp) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Cmove using isel. ++instruct cmovL_reg_isel(cmpOp cmp, flagsReg crx, iRegLdst dst, iRegLsrc src) %{ ++ match(Set dst (CMoveL (Binary cmp crx) (Binary dst src))); ++ predicate(VM_Version::has_isel()); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ size(4); ++ ins_encode %{ ++ // This is a Power7 instruction for which no machine description ++ // exists. Anyways, the scheduler should be off on Power7. ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ int cc = $cmp$$cmpcode; ++ __ isel($dst$$Register, $crx$$CondRegister, ++ (Assembler::Condition)(cc & 3), /*invert*/((~cc) & 8), $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovL_reg(cmpOp cmp, flagsReg crx, iRegLdst dst, iRegLsrc src) %{ ++ match(Set dst (CMoveL (Binary cmp crx) (Binary dst src))); ++ predicate(!VM_Version::has_isel()); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT Compile::current()->do_hb_scheduling()*/ ? 12 : 8); ++ ins_encode( enc_cmove_reg(dst, crx, src, cmp) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovL_imm(cmpOp cmp, flagsReg crx, iRegLdst dst, immL16 src) %{ ++ match(Set dst (CMoveL (Binary cmp crx) (Binary dst src))); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT Compile::current()->do_hb_scheduling()*/ ? 12 : 8); ++ ins_encode( enc_cmove_imm(dst, crx, src, cmp) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Cmove using isel. ++instruct cmovN_reg_isel(cmpOp cmp, flagsReg crx, iRegNdst dst, iRegNsrc src) %{ ++ match(Set dst (CMoveN (Binary cmp crx) (Binary dst src))); ++ predicate(VM_Version::has_isel()); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ size(4); ++ ins_encode %{ ++ // This is a Power7 instruction for which no machine description ++ // exists. Anyways, the scheduler should be off on Power7. ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ int cc = $cmp$$cmpcode; ++ __ isel($dst$$Register, $crx$$CondRegister, ++ (Assembler::Condition)(cc & 3), /*invert*/((~cc) & 8), $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Conditional move for RegN. Only cmov(reg, reg). ++instruct cmovN_reg(cmpOp cmp, flagsReg crx, iRegNdst dst, iRegNsrc src) %{ ++ match(Set dst (CMoveN (Binary cmp crx) (Binary dst src))); ++ predicate(!VM_Version::has_isel()); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT Compile::current()->do_hb_scheduling()*/ ? 12 : 8); ++ ins_encode( enc_cmove_reg(dst, crx, src, cmp) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovN_imm(cmpOp cmp, flagsReg crx, iRegNdst dst, immN_0 src) %{ ++ match(Set dst (CMoveN (Binary cmp crx) (Binary dst src))); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT Compile::current()->do_hb_scheduling()*/ ? 12 : 8); ++ ins_encode( enc_cmove_imm(dst, crx, src, cmp) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Cmove using isel. ++instruct cmovP_reg_isel(cmpOp cmp, flagsReg crx, iRegPdst dst, iRegPsrc src) %{ ++ match(Set dst (CMoveP (Binary cmp crx) (Binary dst src))); ++ predicate(VM_Version::has_isel()); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ size(4); ++ ins_encode %{ ++ // This is a Power7 instruction for which no machine description ++ // exists. Anyways, the scheduler should be off on Power7. ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ int cc = $cmp$$cmpcode; ++ __ isel($dst$$Register, $crx$$CondRegister, ++ (Assembler::Condition)(cc & 3), /*invert*/((~cc) & 8), $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovP_reg(cmpOp cmp, flagsReg crx, iRegPdst dst, iRegP_N2P src) %{ ++ match(Set dst (CMoveP (Binary cmp crx) (Binary dst src))); ++ predicate(!VM_Version::has_isel()); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT Compile::current()->do_hb_scheduling()*/ ? 12 : 8); ++ ins_encode( enc_cmove_reg(dst, crx, src, cmp) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovP_imm(cmpOp cmp, flagsReg crx, iRegPdst dst, immP_0 src) %{ ++ match(Set dst (CMoveP (Binary cmp crx) (Binary dst src))); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT Compile::current()->do_hb_scheduling()*/ ? 12 : 8); ++ ins_encode( enc_cmove_imm(dst, crx, src, cmp) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovF_reg(cmpOp cmp, flagsReg crx, regF dst, regF src) %{ ++ match(Set dst (CMoveF (Binary cmp crx) (Binary dst src))); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVEF $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT (InsertEndGroupPPC64 && Compile::current()->do_hb_scheduling())*/ ? 12 : 8); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmovef); ++ Label done; ++ assert((Assembler::bcondCRbiIs1 & ~Assembler::bcondCRbiIs0) == 8, "check encoding"); ++ // Branch if not (cmp crx). ++ __ bc(cc_to_inverse_boint($cmp$$cmpcode), cc_to_biint($cmp$$cmpcode, $crx$$reg), done); ++ __ fmr($dst$$FloatRegister, $src$$FloatRegister); ++ // TODO PPC port __ endgroup_if_needed(_size == 12); ++ __ bind(done); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovD_reg(cmpOp cmp, flagsReg crx, regD dst, regD src) %{ ++ match(Set dst (CMoveD (Binary cmp crx) (Binary dst src))); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVEF $cmp, $crx, $dst, $src\n\t" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT (InsertEndGroupPPC64 && Compile::current()->do_hb_scheduling())*/ ? 12 : 8); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmovef); ++ Label done; ++ assert((Assembler::bcondCRbiIs1 & ~Assembler::bcondCRbiIs0) == 8, "check encoding"); ++ // Branch if not (cmp crx). ++ __ bc(cc_to_inverse_boint($cmp$$cmpcode), cc_to_biint($cmp$$cmpcode, $crx$$reg), done); ++ __ fmr($dst$$FloatRegister, $src$$FloatRegister); ++ // TODO PPC port __ endgroup_if_needed(_size == 12); ++ __ bind(done); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Conditional_store-------------------------------------------------- ++// Conditional-store of the updated heap-top. ++// Used during allocation of the shared heap. ++// Sets flags (EQ) on success. Implemented with a CASA on Sparc. ++ ++// As compareAndSwapL, but return flag register instead of boolean value in ++// int register. ++// Used by sun/misc/AtomicLongCSImpl.java. ++// Mem_ptr must be a memory operand, else this node does not get ++// Flag_needs_anti_dependence_check set by adlc. If this is not set this node ++// can be rematerialized which leads to errors. ++instruct storeLConditional_regP_regL_regL(flagsReg crx, indirect mem_ptr, iRegLsrc oldVal, iRegLsrc newVal) %{ ++ match(Set crx (StoreLConditional mem_ptr (Binary oldVal newVal))); ++ format %{ "CMPXCHGD if ($crx = ($oldVal == *$mem_ptr)) *mem_ptr = $newVal; as bool" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ cmpxchgd($crx$$CondRegister, R0, $oldVal$$Register, $newVal$$Register, $mem_ptr$$Register, ++ MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(), ++ noreg, NULL, true); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// As compareAndSwapP, but return flag register instead of boolean value in ++// int register. ++// This instruction is matched if UseTLAB is off. ++// Mem_ptr must be a memory operand, else this node does not get ++// Flag_needs_anti_dependence_check set by adlc. If this is not set this node ++// can be rematerialized which leads to errors. ++instruct storePConditional_regP_regP_regP(flagsReg crx, indirect mem_ptr, iRegPsrc oldVal, iRegPsrc newVal) %{ ++ match(Set crx (StorePConditional mem_ptr (Binary oldVal newVal))); ++ format %{ "CMPXCHGD if ($crx = ($oldVal == *$mem_ptr)) *mem_ptr = $newVal; as bool" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ cmpxchgd($crx$$CondRegister, R0, $oldVal$$Register, $newVal$$Register, $mem_ptr$$Register, ++ MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(), ++ noreg, NULL, true); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Implement LoadPLocked. Must be ordered against changes of the memory location ++// by storePConditional. ++// Don't know whether this is ever used. ++instruct loadPLocked(iRegPdst dst, memory mem) %{ ++ match(Set dst (LoadPLocked mem)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $mem \t// loadPLocked\n\t" ++ "TWI $dst\n\t" ++ "ISYNC" %} ++ size(12); ++ ins_encode( enc_ld_ac(dst, mem) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++//----------Compare-And-Swap--------------------------------------------------- ++ ++// CompareAndSwap{P,I,L} have more than one output, therefore "CmpI ++// (CompareAndSwap ...)" or "If (CmpI (CompareAndSwap ..))" cannot be ++// matched. ++ ++instruct compareAndSwapI_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set res (CompareAndSwapI mem_ptr (Binary src1 src2))); ++ format %{ "CMPXCHGW $res, $mem_ptr, $src1, $src2; as bool" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ // CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'. ++ __ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, ++ MacroAssembler::MemBarFenceAfter, MacroAssembler::cmpxchgx_hint_atomic_update(), ++ $res$$Register, true); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct compareAndSwapN_regP_regN_regN(iRegIdst res, iRegPdst mem_ptr, iRegNsrc src1, iRegNsrc src2) %{ ++ match(Set res (CompareAndSwapN mem_ptr (Binary src1 src2))); ++ format %{ "CMPXCHGW $res, $mem_ptr, $src1, $src2; as bool" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ // CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'. ++ __ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, ++ MacroAssembler::MemBarFenceAfter, MacroAssembler::cmpxchgx_hint_atomic_update(), ++ $res$$Register, true); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct compareAndSwapL_regP_regL_regL(iRegIdst res, iRegPdst mem_ptr, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set res (CompareAndSwapL mem_ptr (Binary src1 src2))); ++ format %{ "CMPXCHGD $res, $mem_ptr, $src1, $src2; as bool" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ // CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'. ++ __ cmpxchgd(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, ++ MacroAssembler::MemBarFenceAfter, MacroAssembler::cmpxchgx_hint_atomic_update(), ++ $res$$Register, NULL, true); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct compareAndSwapP_regP_regP_regP(iRegIdst res, iRegPdst mem_ptr, iRegPsrc src1, iRegPsrc src2) %{ ++ match(Set res (CompareAndSwapP mem_ptr (Binary src1 src2))); ++ format %{ "CMPXCHGD $res, $mem_ptr, $src1, $src2; as bool; ptr" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ // CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'. ++ __ cmpxchgd(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, ++ MacroAssembler::MemBarFenceAfter, MacroAssembler::cmpxchgx_hint_atomic_update(), ++ $res$$Register, NULL, true); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct getAndAddI(iRegIdst res, iRegPdst mem_ptr, iRegIsrc src) %{ ++ match(Set res (GetAndAddI mem_ptr src)); ++ format %{ "GetAndAddI $res, $mem_ptr, $src" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode( enc_GetAndAddI(res, mem_ptr, src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct getAndAddL(iRegLdst res, iRegPdst mem_ptr, iRegLsrc src) %{ ++ match(Set res (GetAndAddL mem_ptr src)); ++ format %{ "GetAndAddL $res, $mem_ptr, $src" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode( enc_GetAndAddL(res, mem_ptr, src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct getAndSetI(iRegIdst res, iRegPdst mem_ptr, iRegIsrc src) %{ ++ match(Set res (GetAndSetI mem_ptr src)); ++ format %{ "GetAndSetI $res, $mem_ptr, $src" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode( enc_GetAndSetI(res, mem_ptr, src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct getAndSetL(iRegLdst res, iRegPdst mem_ptr, iRegLsrc src) %{ ++ match(Set res (GetAndSetL mem_ptr src)); ++ format %{ "GetAndSetL $res, $mem_ptr, $src" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode( enc_GetAndSetL(res, mem_ptr, src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct getAndSetP(iRegPdst res, iRegPdst mem_ptr, iRegPsrc src) %{ ++ match(Set res (GetAndSetP mem_ptr src)); ++ format %{ "GetAndSetP $res, $mem_ptr, $src" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode( enc_GetAndSetL(res, mem_ptr, src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct getAndSetN(iRegNdst res, iRegPdst mem_ptr, iRegNsrc src) %{ ++ match(Set res (GetAndSetN mem_ptr src)); ++ format %{ "GetAndSetN $res, $mem_ptr, $src" %} ++ // Variable size: instruction count smaller if regs are disjoint. ++ ins_encode( enc_GetAndSetI(res, mem_ptr, src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Arithmetic Instructions-------------------------------------------- ++// Addition Instructions ++ ++// Register Addition ++instruct addI_reg_reg(iRegIdst dst, iRegIsrc_iRegL2Isrc src1, iRegIsrc_iRegL2Isrc src2) %{ ++ match(Set dst (AddI src1 src2)); ++ format %{ "ADD $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_add); ++ __ add($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Expand does not work with above instruct. (??) ++instruct addI_reg_reg_2(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ // no match-rule ++ effect(DEF dst, USE src1, USE src2); ++ format %{ "ADD $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_add); ++ __ add($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct tree_addI_addI_addI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2, iRegIsrc src3, iRegIsrc src4) %{ ++ match(Set dst (AddI (AddI (AddI src1 src2) src3) src4)); ++ ins_cost(DEFAULT_COST*3); ++ ++ expand %{ ++ // FIXME: we should do this in the ideal world. ++ iRegIdst tmp1; ++ iRegIdst tmp2; ++ addI_reg_reg(tmp1, src1, src2); ++ addI_reg_reg_2(tmp2, src3, src4); // Adlc complains about addI_reg_reg. ++ addI_reg_reg(dst, tmp1, tmp2); ++ %} ++%} ++ ++// Immediate Addition ++instruct addI_reg_imm16(iRegIdst dst, iRegIsrc src1, immI16 src2) %{ ++ match(Set dst (AddI src1 src2)); ++ format %{ "ADDI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ addi($dst$$Register, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate Addition with 16-bit shifted operand ++instruct addI_reg_immhi16(iRegIdst dst, iRegIsrc src1, immIhi16 src2) %{ ++ match(Set dst (AddI src1 src2)); ++ format %{ "ADDIS $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ __ addis($dst$$Register, $src1$$Register, ($src2$$constant)>>16); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Long Addition ++instruct addL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (AddL src1 src2)); ++ format %{ "ADD $dst, $src1, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_add); ++ __ add($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Expand does not work with above instruct. (??) ++instruct addL_reg_reg_2(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ // no match-rule ++ effect(DEF dst, USE src1, USE src2); ++ format %{ "ADD $dst, $src1, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_add); ++ __ add($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct tree_addL_addL_addL_reg_reg_Ex(iRegLdst dst, iRegLsrc src1, iRegLsrc src2, iRegLsrc src3, iRegLsrc src4) %{ ++ match(Set dst (AddL (AddL (AddL src1 src2) src3) src4)); ++ ins_cost(DEFAULT_COST*3); ++ ++ expand %{ ++ // FIXME: we should do this in the ideal world. ++ iRegLdst tmp1; ++ iRegLdst tmp2; ++ addL_reg_reg(tmp1, src1, src2); ++ addL_reg_reg_2(tmp2, src3, src4); // Adlc complains about orI_reg_reg. ++ addL_reg_reg(dst, tmp1, tmp2); ++ %} ++%} ++ ++// AddL + ConvL2I. ++instruct addI_regL_regL(iRegIdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (ConvL2I (AddL src1 src2))); ++ ++ format %{ "ADD $dst, $src1, $src2 \t// long + l2i" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_add); ++ __ add($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// No constant pool entries required. ++instruct addL_reg_imm16(iRegLdst dst, iRegLsrc src1, immL16 src2) %{ ++ match(Set dst (AddL src1 src2)); ++ ++ format %{ "ADDI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ addi($dst$$Register, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Long Immediate Addition with 16-bit shifted operand. ++// No constant pool entries required. ++instruct addL_reg_immhi16(iRegLdst dst, iRegLsrc src1, immL32hi16 src2) %{ ++ match(Set dst (AddL src1 src2)); ++ ++ format %{ "ADDIS $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ __ addis($dst$$Register, $src1$$Register, ($src2$$constant)>>16); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Pointer Register Addition ++instruct addP_reg_reg(iRegPdst dst, iRegP_N2P src1, iRegLsrc src2) %{ ++ match(Set dst (AddP src1 src2)); ++ format %{ "ADD $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_add); ++ __ add($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Pointer Immediate Addition ++// No constant pool entries required. ++instruct addP_reg_imm16(iRegPdst dst, iRegP_N2P src1, immL16 src2) %{ ++ match(Set dst (AddP src1 src2)); ++ ++ format %{ "ADDI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ addi($dst$$Register, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Pointer Immediate Addition with 16-bit shifted operand. ++// No constant pool entries required. ++instruct addP_reg_immhi16(iRegPdst dst, iRegP_N2P src1, immL32hi16 src2) %{ ++ match(Set dst (AddP src1 src2)); ++ ++ format %{ "ADDIS $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addis); ++ __ addis($dst$$Register, $src1$$Register, ($src2$$constant)>>16); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++//--------------------- ++// Subtraction Instructions ++ ++// Register Subtraction ++instruct subI_reg_reg(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (SubI src1 src2)); ++ format %{ "SUBF $dst, $src2, $src1" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_subf); ++ __ subf($dst$$Register, $src2$$Register, $src1$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate Subtraction ++// The compiler converts "x-c0" into "x+ -c0" (see SubINode::Ideal), ++// so this rule seems to be unused. ++instruct subI_reg_imm16(iRegIdst dst, iRegIsrc src1, immI16 src2) %{ ++ match(Set dst (SubI src1 src2)); ++ format %{ "SUBI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ addi($dst$$Register, $src1$$Register, ($src2$$constant) * (-1)); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// SubI from constant (using subfic). ++instruct subI_imm16_reg(iRegIdst dst, immI16 src1, iRegIsrc src2) %{ ++ match(Set dst (SubI src1 src2)); ++ format %{ "SUBI $dst, $src1, $src2" %} ++ ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_subfic); ++ __ subfic($dst$$Register, $src2$$Register, $src1$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Turn the sign-bit of an integer into a 32-bit mask, 0x0...0 for ++// positive integers and 0xF...F for negative ones. ++instruct signmask32I_regI(iRegIdst dst, iRegIsrc src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "SRAWI $dst, $src, #31" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_srawi); ++ __ srawi($dst$$Register, $src$$Register, 0x1f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct absI_reg_Ex(iRegIdst dst, iRegIsrc src) %{ ++ match(Set dst (AbsI src)); ++ ins_cost(DEFAULT_COST*3); ++ ++ expand %{ ++ iRegIdst tmp1; ++ iRegIdst tmp2; ++ signmask32I_regI(tmp1, src); ++ xorI_reg_reg(tmp2, tmp1, src); ++ subI_reg_reg(dst, tmp2, tmp1); ++ %} ++%} ++ ++instruct negI_regI(iRegIdst dst, immI_0 zero, iRegIsrc src2) %{ ++ match(Set dst (SubI zero src2)); ++ format %{ "NEG $dst, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_neg); ++ __ neg($dst$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Long subtraction ++instruct subL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (SubL src1 src2)); ++ format %{ "SUBF $dst, $src2, $src1 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_subf); ++ __ subf($dst$$Register, $src2$$Register, $src1$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// SubL + convL2I. ++instruct subI_regL_regL(iRegIdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (ConvL2I (SubL src1 src2))); ++ ++ format %{ "SUBF $dst, $src2, $src1 \t// long + l2i" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_subf); ++ __ subf($dst$$Register, $src2$$Register, $src1$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate Subtraction ++// The compiler converts "x-c0" into "x+ -c0" (see SubLNode::Ideal), ++// so this rule seems to be unused. ++// No constant pool entries required. ++instruct subL_reg_imm16(iRegLdst dst, iRegLsrc src1, immL16 src2) %{ ++ match(Set dst (SubL src1 src2)); ++ ++ format %{ "SUBI $dst, $src1, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ addi($dst$$Register, $src1$$Register, ($src2$$constant) * (-1)); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Turn the sign-bit of a long into a 64-bit mask, 0x0...0 for ++// positive longs and 0xF...F for negative ones. ++instruct signmask64I_regL(iRegIdst dst, iRegLsrc src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "SRADI $dst, $src, #63" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_sradi); ++ __ sradi($dst$$Register, $src$$Register, 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Turn the sign-bit of a long into a 64-bit mask, 0x0...0 for ++// positive longs and 0xF...F for negative ones. ++instruct signmask64L_regL(iRegLdst dst, iRegLsrc src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "SRADI $dst, $src, #63" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_sradi); ++ __ sradi($dst$$Register, $src$$Register, 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Long negation ++instruct negL_reg_reg(iRegLdst dst, immL_0 zero, iRegLsrc src2) %{ ++ match(Set dst (SubL zero src2)); ++ format %{ "NEG $dst, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_neg); ++ __ neg($dst$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// NegL + ConvL2I. ++instruct negI_con0_regL(iRegIdst dst, immL_0 zero, iRegLsrc src2) %{ ++ match(Set dst (ConvL2I (SubL zero src2))); ++ ++ format %{ "NEG $dst, $src2 \t// long + l2i" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_neg); ++ __ neg($dst$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Multiplication Instructions ++// Integer Multiplication ++ ++// Register Multiplication ++instruct mulI_reg_reg(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (MulI src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "MULLW $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_mullw); ++ __ mullw($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate Multiplication ++instruct mulI_reg_imm16(iRegIdst dst, iRegIsrc src1, immI16 src2) %{ ++ match(Set dst (MulI src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "MULLI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_mulli); ++ __ mulli($dst$$Register, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct mulL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (MulL src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "MULLD $dst $src1, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_mulld); ++ __ mulld($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Multiply high for optimized long division by constant. ++instruct mulHighL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (MulHiL src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "MULHD $dst $src1, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_mulhd); ++ __ mulhd($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate Multiplication ++instruct mulL_reg_imm16(iRegLdst dst, iRegLsrc src1, immL16 src2) %{ ++ match(Set dst (MulL src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "MULLI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_mulli); ++ __ mulli($dst$$Register, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Integer Division with Immediate -1: Negate. ++instruct divI_reg_immIvalueMinus1(iRegIdst dst, iRegIsrc src1, immI_minus1 src2) %{ ++ match(Set dst (DivI src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "NEG $dst, $src1 \t// /-1" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_neg); ++ __ neg($dst$$Register, $src1$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Integer Division with constant, but not -1. ++// We should be able to improve this by checking the type of src2. ++// It might well be that src2 is known to be positive. ++instruct divI_reg_regnotMinus1(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (DivI src1 src2)); ++ predicate(n->in(2)->find_int_con(-1) != -1); // src2 is a constant, but not -1 ++ ins_cost(2*DEFAULT_COST); ++ ++ format %{ "DIVW $dst, $src1, $src2 \t// /not-1" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_divw); ++ __ divw($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovI_bne_negI_reg(iRegIdst dst, flagsReg crx, iRegIsrc src1) %{ ++ effect(USE_DEF dst, USE src1, USE crx); ++ predicate(false); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $dst, neg($src1), $crx" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT (InsertEndGroupPPC64 && Compile::current()->do_hb_scheduling())*/ ? 12 : 8); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmove); ++ Label done; ++ __ bne($crx$$CondRegister, done); ++ __ neg($dst$$Register, $src1$$Register); ++ // TODO PPC port __ endgroup_if_needed(_size == 12); ++ __ bind(done); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Integer Division with Registers not containing constants. ++instruct divI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (DivI src1 src2)); ++ ins_cost(10*DEFAULT_COST); ++ ++ expand %{ ++ immI16 imm %{ (int)-1 %} ++ flagsReg tmp1; ++ cmpI_reg_imm16(tmp1, src2, imm); // check src2 == -1 ++ divI_reg_regnotMinus1(dst, src1, src2); // dst = src1 / src2 ++ cmovI_bne_negI_reg(dst, tmp1, src1); // cmove dst = neg(src1) if src2 == -1 ++ %} ++%} ++ ++// Long Division with Immediate -1: Negate. ++instruct divL_reg_immLvalueMinus1(iRegLdst dst, iRegLsrc src1, immL_minus1 src2) %{ ++ match(Set dst (DivL src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "NEG $dst, $src1 \t// /-1, long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_neg); ++ __ neg($dst$$Register, $src1$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Long Division with constant, but not -1. ++instruct divL_reg_regnotMinus1(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (DivL src1 src2)); ++ predicate(n->in(2)->find_long_con(-1L) != -1L); // Src2 is a constant, but not -1. ++ ins_cost(2*DEFAULT_COST); ++ ++ format %{ "DIVD $dst, $src1, $src2 \t// /not-1, long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_divd); ++ __ divd($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovL_bne_negL_reg(iRegLdst dst, flagsReg crx, iRegLsrc src1) %{ ++ effect(USE_DEF dst, USE src1, USE crx); ++ predicate(false); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "CMOVE $dst, neg($src1), $crx" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT (InsertEndGroupPPC64 && Compile::current()->do_hb_scheduling())*/ ? 12 : 8); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmove); ++ Label done; ++ __ bne($crx$$CondRegister, done); ++ __ neg($dst$$Register, $src1$$Register); ++ // TODO PPC port __ endgroup_if_needed(_size == 12); ++ __ bind(done); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Long Division with Registers not containing constants. ++instruct divL_reg_reg_Ex(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (DivL src1 src2)); ++ ins_cost(10*DEFAULT_COST); ++ ++ expand %{ ++ immL16 imm %{ (int)-1 %} ++ flagsReg tmp1; ++ cmpL_reg_imm16(tmp1, src2, imm); // check src2 == -1 ++ divL_reg_regnotMinus1(dst, src1, src2); // dst = src1 / src2 ++ cmovL_bne_negL_reg(dst, tmp1, src1); // cmove dst = neg(src1) if src2 == -1 ++ %} ++%} ++ ++// Integer Remainder with registers. ++instruct modI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (ModI src1 src2)); ++ ins_cost(10*DEFAULT_COST); ++ ++ expand %{ ++ immI16 imm %{ (int)-1 %} ++ flagsReg tmp1; ++ iRegIdst tmp2; ++ iRegIdst tmp3; ++ cmpI_reg_imm16(tmp1, src2, imm); // check src2 == -1 ++ divI_reg_regnotMinus1(tmp2, src1, src2); // tmp2 = src1 / src2 ++ cmovI_bne_negI_reg(tmp2, tmp1, src1); // cmove tmp2 = neg(src1) if src2 == -1 ++ mulI_reg_reg(tmp3, src2, tmp2); // tmp3 = src2 * tmp2 ++ subI_reg_reg(dst, src1, tmp3); // dst = src1 - tmp3 ++ %} ++%} ++ ++// Long Remainder with registers ++instruct modL_reg_reg_Ex(iRegLdst dst, iRegLsrc src1, iRegLsrc src2, flagsRegCR0 cr0) %{ ++ match(Set dst (ModL src1 src2)); ++ ins_cost(10*DEFAULT_COST); ++ ++ expand %{ ++ immL16 imm %{ (int)-1 %} ++ flagsReg tmp1; ++ iRegLdst tmp2; ++ iRegLdst tmp3; ++ cmpL_reg_imm16(tmp1, src2, imm); // check src2 == -1 ++ divL_reg_regnotMinus1(tmp2, src1, src2); // tmp2 = src1 / src2 ++ cmovL_bne_negL_reg(tmp2, tmp1, src1); // cmove tmp2 = neg(src1) if src2 == -1 ++ mulL_reg_reg(tmp3, src2, tmp2); // tmp3 = src2 * tmp2 ++ subL_reg_reg(dst, src1, tmp3); // dst = src1 - tmp3 ++ %} ++%} ++ ++// Integer Shift Instructions ++ ++// Register Shift Left ++ ++// Clear all but the lowest #mask bits. ++// Used to normalize shift amounts in registers. ++instruct maskI_reg_imm(iRegIdst dst, iRegIsrc src, uimmI6 mask) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src, USE mask); ++ predicate(false); ++ ++ format %{ "MASK $dst, $src, $mask \t// clear $mask upper bits" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ clrldi($dst$$Register, $src$$Register, $mask$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct lShiftI_reg_reg(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "SLW $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_slw); ++ __ slw($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct lShiftI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (LShiftI src1 src2)); ++ ins_cost(DEFAULT_COST*2); ++ expand %{ ++ uimmI6 mask %{ 0x3b /* clear 59 bits, keep 5 */ %} ++ iRegIdst tmpI; ++ maskI_reg_imm(tmpI, src2, mask); ++ lShiftI_reg_reg(dst, src1, tmpI); ++ %} ++%} ++ ++// Register Shift Left Immediate ++instruct lShiftI_reg_imm(iRegIdst dst, iRegIsrc src1, immI src2) %{ ++ match(Set dst (LShiftI src1 src2)); ++ ++ format %{ "SLWI $dst, $src1, ($src2 & 0x1f)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwinm); ++ __ slwi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x1f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// AndI with negpow2-constant + LShiftI ++instruct lShiftI_andI_immInegpow2_imm5(iRegIdst dst, iRegIsrc src1, immInegpow2 src2, uimmI5 src3) %{ ++ match(Set dst (LShiftI (AndI src1 src2) src3)); ++ predicate(UseRotateAndMaskInstructionsPPC64); ++ ++ format %{ "RLWINM $dst, lShiftI(AndI($src1, $src2), $src3)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwinm); // FIXME: assert that rlwinm is equal to addi ++ long src2 = $src2$$constant; ++ long src3 = $src3$$constant; ++ long maskbits = src3 + log2_long((jlong) (julong) (juint) -src2); ++ if (maskbits >= 32) { ++ __ li($dst$$Register, 0); // addi ++ } else { ++ __ rlwinm($dst$$Register, $src1$$Register, src3 & 0x1f, 0, (31-maskbits) & 0x1f); ++ } ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// RShiftI + AndI with negpow2-constant + LShiftI ++instruct lShiftI_andI_immInegpow2_rShiftI_imm5(iRegIdst dst, iRegIsrc src1, immInegpow2 src2, uimmI5 src3) %{ ++ match(Set dst (LShiftI (AndI (RShiftI src1 src3) src2) src3)); ++ predicate(UseRotateAndMaskInstructionsPPC64); ++ ++ format %{ "RLWINM $dst, lShiftI(AndI(RShiftI($src1, $src3), $src2), $src3)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwinm); // FIXME: assert that rlwinm is equal to addi ++ long src2 = $src2$$constant; ++ long src3 = $src3$$constant; ++ long maskbits = src3 + log2_long((jlong) (julong) (juint) -src2); ++ if (maskbits >= 32) { ++ __ li($dst$$Register, 0); // addi ++ } else { ++ __ rlwinm($dst$$Register, $src1$$Register, 0, 0, (31-maskbits) & 0x1f); ++ } ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct lShiftL_regL_regI(iRegLdst dst, iRegLsrc src1, iRegIsrc src2) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "SLD $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_sld); ++ __ sld($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Register Shift Left ++instruct lShiftL_regL_regI_Ex(iRegLdst dst, iRegLsrc src1, iRegIsrc src2) %{ ++ match(Set dst (LShiftL src1 src2)); ++ ins_cost(DEFAULT_COST*2); ++ expand %{ ++ uimmI6 mask %{ 0x3a /* clear 58 bits, keep 6 */ %} ++ iRegIdst tmpI; ++ maskI_reg_imm(tmpI, src2, mask); ++ lShiftL_regL_regI(dst, src1, tmpI); ++ %} ++%} ++ ++// Register Shift Left Immediate ++instruct lshiftL_regL_immI(iRegLdst dst, iRegLsrc src1, immI src2) %{ ++ match(Set dst (LShiftL src1 src2)); ++ format %{ "SLDI $dst, $src1, ($src2 & 0x3f)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicr); ++ __ sldi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// If we shift more than 32 bits, we need not convert I2L. ++instruct lShiftL_regI_immGE32(iRegLdst dst, iRegIsrc src1, uimmI6_ge32 src2) %{ ++ match(Set dst (LShiftL (ConvI2L src1) src2)); ++ ins_cost(DEFAULT_COST); ++ ++ size(4); ++ format %{ "SLDI $dst, i2l($src1), $src2" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicr); ++ __ sldi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Shift a postivie int to the left. ++// Clrlsldi clears the upper 32 bits and shifts. ++instruct scaledPositiveI2L_lShiftL_convI2L_reg_imm6(iRegLdst dst, iRegIsrc src1, uimmI6 src2) %{ ++ match(Set dst (LShiftL (ConvI2L src1) src2)); ++ predicate(((ConvI2LNode*)(_kids[0]->_leaf))->type()->is_long()->is_positive_int()); ++ ++ format %{ "SLDI $dst, i2l(positive_int($src1)), $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldic); ++ __ clrlsldi($dst$$Register, $src1$$Register, 0x20, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct arShiftI_reg_reg(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "SRAW $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_sraw); ++ __ sraw($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Register Arithmetic Shift Right ++instruct arShiftI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (RShiftI src1 src2)); ++ ins_cost(DEFAULT_COST*2); ++ expand %{ ++ uimmI6 mask %{ 0x3b /* clear 59 bits, keep 5 */ %} ++ iRegIdst tmpI; ++ maskI_reg_imm(tmpI, src2, mask); ++ arShiftI_reg_reg(dst, src1, tmpI); ++ %} ++%} ++ ++// Register Arithmetic Shift Right Immediate ++instruct arShiftI_reg_imm(iRegIdst dst, iRegIsrc src1, immI src2) %{ ++ match(Set dst (RShiftI src1 src2)); ++ ++ format %{ "SRAWI $dst, $src1, ($src2 & 0x1f)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_srawi); ++ __ srawi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x1f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct arShiftL_regL_regI(iRegLdst dst, iRegLsrc src1, iRegIsrc src2) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "SRAD $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_srad); ++ __ srad($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Register Shift Right Arithmetic Long ++instruct arShiftL_regL_regI_Ex(iRegLdst dst, iRegLsrc src1, iRegIsrc src2) %{ ++ match(Set dst (RShiftL src1 src2)); ++ ins_cost(DEFAULT_COST*2); ++ ++ expand %{ ++ uimmI6 mask %{ 0x3a /* clear 58 bits, keep 6 */ %} ++ iRegIdst tmpI; ++ maskI_reg_imm(tmpI, src2, mask); ++ arShiftL_regL_regI(dst, src1, tmpI); ++ %} ++%} ++ ++// Register Shift Right Immediate ++instruct arShiftL_regL_immI(iRegLdst dst, iRegLsrc src1, immI src2) %{ ++ match(Set dst (RShiftL src1 src2)); ++ ++ format %{ "SRADI $dst, $src1, ($src2 & 0x3f)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_sradi); ++ __ sradi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// RShiftL + ConvL2I ++instruct convL2I_arShiftL_regL_immI(iRegIdst dst, iRegLsrc src1, immI src2) %{ ++ match(Set dst (ConvL2I (RShiftL src1 src2))); ++ ++ format %{ "SRADI $dst, $src1, ($src2 & 0x3f) \t// long + l2i" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_sradi); ++ __ sradi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct urShiftI_reg_reg(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "SRW $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_srw); ++ __ srw($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Register Shift Right ++instruct urShiftI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (URShiftI src1 src2)); ++ ins_cost(DEFAULT_COST*2); ++ ++ expand %{ ++ uimmI6 mask %{ 0x3b /* clear 59 bits, keep 5 */ %} ++ iRegIdst tmpI; ++ maskI_reg_imm(tmpI, src2, mask); ++ urShiftI_reg_reg(dst, src1, tmpI); ++ %} ++%} ++ ++// Register Shift Right Immediate ++instruct urShiftI_reg_imm(iRegIdst dst, iRegIsrc src1, immI src2) %{ ++ match(Set dst (URShiftI src1 src2)); ++ ++ format %{ "SRWI $dst, $src1, ($src2 & 0x1f)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwinm); ++ __ srwi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x1f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct urShiftL_regL_regI(iRegLdst dst, iRegLsrc src1, iRegIsrc src2) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "SRD $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_srd); ++ __ srd($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Register Shift Right ++instruct urShiftL_regL_regI_Ex(iRegLdst dst, iRegLsrc src1, iRegIsrc src2) %{ ++ match(Set dst (URShiftL src1 src2)); ++ ins_cost(DEFAULT_COST*2); ++ ++ expand %{ ++ uimmI6 mask %{ 0x3a /* clear 58 bits, keep 6 */ %} ++ iRegIdst tmpI; ++ maskI_reg_imm(tmpI, src2, mask); ++ urShiftL_regL_regI(dst, src1, tmpI); ++ %} ++%} ++ ++// Register Shift Right Immediate ++instruct urShiftL_regL_immI(iRegLdst dst, iRegLsrc src1, immI src2) %{ ++ match(Set dst (URShiftL src1 src2)); ++ ++ format %{ "SRDI $dst, $src1, ($src2 & 0x3f)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ srdi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// URShiftL + ConvL2I. ++instruct convL2I_urShiftL_regL_immI(iRegIdst dst, iRegLsrc src1, immI src2) %{ ++ match(Set dst (ConvL2I (URShiftL src1 src2))); ++ ++ format %{ "SRDI $dst, $src1, ($src2 & 0x3f) \t// long + l2i" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ srdi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Register Shift Right Immediate with a CastP2X ++instruct shrP_convP2X_reg_imm6(iRegLdst dst, iRegP_N2P src1, uimmI6 src2) %{ ++ match(Set dst (URShiftL (CastP2X src1) src2)); ++ ++ format %{ "SRDI $dst, $src1, $src2 \t// Cast ptr $src1 to long and shift" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ srdi($dst$$Register, $src1$$Register, ($src2$$constant) & 0x3f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct sxtI_reg(iRegIdst dst, iRegIsrc src) %{ ++ match(Set dst (ConvL2I (ConvI2L src))); ++ ++ format %{ "EXTSW $dst, $src \t// int->int" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_extsw); ++ __ extsw($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Rotate Instructions------------------------------------------------ ++ ++// Rotate Left by 8-bit immediate ++instruct rotlI_reg_immi8(iRegIdst dst, iRegIsrc src, immI8 lshift, immI8 rshift) %{ ++ match(Set dst (OrI (LShiftI src lshift) (URShiftI src rshift))); ++ predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f)); ++ ++ format %{ "ROTLWI $dst, $src, $lshift" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwinm); ++ __ rotlwi($dst$$Register, $src$$Register, $lshift$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Rotate Right by 8-bit immediate ++instruct rotrI_reg_immi8(iRegIdst dst, iRegIsrc src, immI8 rshift, immI8 lshift) %{ ++ match(Set dst (OrI (URShiftI src rshift) (LShiftI src lshift))); ++ predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f)); ++ ++ format %{ "ROTRWI $dst, $rshift" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwinm); ++ __ rotrwi($dst$$Register, $src$$Register, $rshift$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Floating Point Arithmetic Instructions----------------------------- ++ ++// Add float single precision ++instruct addF_reg_reg(regF dst, regF src1, regF src2) %{ ++ match(Set dst (AddF src1 src2)); ++ ++ format %{ "FADDS $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fadds); ++ __ fadds($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Add float double precision ++instruct addD_reg_reg(regD dst, regD src1, regD src2) %{ ++ match(Set dst (AddD src1 src2)); ++ ++ format %{ "FADD $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fadd); ++ __ fadd($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Sub float single precision ++instruct subF_reg_reg(regF dst, regF src1, regF src2) %{ ++ match(Set dst (SubF src1 src2)); ++ ++ format %{ "FSUBS $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fsubs); ++ __ fsubs($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Sub float double precision ++instruct subD_reg_reg(regD dst, regD src1, regD src2) %{ ++ match(Set dst (SubD src1 src2)); ++ format %{ "FSUB $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fsub); ++ __ fsub($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Mul float single precision ++instruct mulF_reg_reg(regF dst, regF src1, regF src2) %{ ++ match(Set dst (MulF src1 src2)); ++ format %{ "FMULS $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fmuls); ++ __ fmuls($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Mul float double precision ++instruct mulD_reg_reg(regD dst, regD src1, regD src2) %{ ++ match(Set dst (MulD src1 src2)); ++ format %{ "FMUL $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fmul); ++ __ fmul($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Div float single precision ++instruct divF_reg_reg(regF dst, regF src1, regF src2) %{ ++ match(Set dst (DivF src1 src2)); ++ format %{ "FDIVS $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fdivs); ++ __ fdivs($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Div float double precision ++instruct divD_reg_reg(regD dst, regD src1, regD src2) %{ ++ match(Set dst (DivD src1 src2)); ++ format %{ "FDIV $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fdiv); ++ __ fdiv($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Absolute float single precision ++instruct absF_reg(regF dst, regF src) %{ ++ match(Set dst (AbsF src)); ++ format %{ "FABS $dst, $src \t// float" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fabs); ++ __ fabs($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Absolute float double precision ++instruct absD_reg(regD dst, regD src) %{ ++ match(Set dst (AbsD src)); ++ format %{ "FABS $dst, $src \t// double" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fabs); ++ __ fabs($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct negF_reg(regF dst, regF src) %{ ++ match(Set dst (NegF src)); ++ format %{ "FNEG $dst, $src \t// float" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fneg); ++ __ fneg($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct negD_reg(regD dst, regD src) %{ ++ match(Set dst (NegD src)); ++ format %{ "FNEG $dst, $src \t// double" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fneg); ++ __ fneg($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// AbsF + NegF. ++instruct negF_absF_reg(regF dst, regF src) %{ ++ match(Set dst (NegF (AbsF src))); ++ format %{ "FNABS $dst, $src \t// float" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fnabs); ++ __ fnabs($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// AbsD + NegD. ++instruct negD_absD_reg(regD dst, regD src) %{ ++ match(Set dst (NegD (AbsD src))); ++ format %{ "FNABS $dst, $src \t// double" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fnabs); ++ __ fnabs($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// VM_Version::has_fsqrt() decides if this node will be used. ++// Sqrt float double precision ++instruct sqrtD_reg(regD dst, regD src) %{ ++ match(Set dst (SqrtD src)); ++ format %{ "FSQRT $dst, $src" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fsqrt); ++ __ fsqrt($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Single-precision sqrt. ++instruct sqrtF_reg(regF dst, regF src) %{ ++ match(Set dst (ConvD2F (SqrtD (ConvF2D src)))); ++ predicate(VM_Version::has_fsqrts()); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "FSQRTS $dst, $src" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fsqrts); ++ __ fsqrts($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct roundDouble_nop(regD dst) %{ ++ match(Set dst (RoundDouble dst)); ++ ins_cost(0); ++ ++ format %{ " -- \t// RoundDouble not needed - empty" %} ++ size(0); ++ // PPC results are already "rounded" (i.e., normal-format IEEE). ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct roundFloat_nop(regF dst) %{ ++ match(Set dst (RoundFloat dst)); ++ ins_cost(0); ++ ++ format %{ " -- \t// RoundFloat not needed - empty" %} ++ size(0); ++ // PPC results are already "rounded" (i.e., normal-format IEEE). ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Logical Instructions----------------------------------------------- ++ ++// And Instructions ++ ++// Register And ++instruct andI_reg_reg(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (AndI src1 src2)); ++ format %{ "AND $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_and); ++ __ andr($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate And ++instruct andI_reg_uimm16(iRegIdst dst, iRegIsrc src1, uimmI16 src2, flagsRegCR0 cr0) %{ ++ match(Set dst (AndI src1 src2)); ++ effect(KILL cr0); ++ ++ format %{ "ANDI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_andi_); ++ // FIXME: avoid andi_ ? ++ __ andi_($dst$$Register, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate And where the immediate is a negative power of 2. ++instruct andI_reg_immInegpow2(iRegIdst dst, iRegIsrc src1, immInegpow2 src2) %{ ++ match(Set dst (AndI src1 src2)); ++ format %{ "ANDWI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicr); ++ __ clrrdi($dst$$Register, $src1$$Register, log2_long((jlong)(julong)(juint)-($src2$$constant))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct andI_reg_immIpow2minus1(iRegIdst dst, iRegIsrc src1, immIpow2minus1 src2) %{ ++ match(Set dst (AndI src1 src2)); ++ format %{ "ANDWI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ clrldi($dst$$Register, $src1$$Register, 64-log2_long((((jlong) $src2$$constant)+1))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct andI_reg_immIpowerOf2(iRegIdst dst, iRegIsrc src1, immIpowerOf2 src2) %{ ++ match(Set dst (AndI src1 src2)); ++ predicate(UseRotateAndMaskInstructionsPPC64); ++ format %{ "ANDWI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwinm); ++ __ rlwinm($dst$$Register, $src1$$Register, 0, ++ (31-log2_long((jlong) $src2$$constant)) & 0x1f, (31-log2_long((jlong) $src2$$constant)) & 0x1f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Register And Long ++instruct andL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (AndL src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "AND $dst, $src1, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_and); ++ __ andr($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate And long ++instruct andL_reg_uimm16(iRegLdst dst, iRegLsrc src1, uimmL16 src2, flagsRegCR0 cr0) %{ ++ match(Set dst (AndL src1 src2)); ++ effect(KILL cr0); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "ANDI $dst, $src1, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_andi_); ++ // FIXME: avoid andi_ ? ++ __ andi_($dst$$Register, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate And Long where the immediate is a negative power of 2. ++instruct andL_reg_immLnegpow2(iRegLdst dst, iRegLsrc src1, immLnegpow2 src2) %{ ++ match(Set dst (AndL src1 src2)); ++ format %{ "ANDDI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicr); ++ __ clrrdi($dst$$Register, $src1$$Register, log2_long((jlong)-$src2$$constant)); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct andL_reg_immLpow2minus1(iRegLdst dst, iRegLsrc src1, immLpow2minus1 src2) %{ ++ match(Set dst (AndL src1 src2)); ++ format %{ "ANDDI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ clrldi($dst$$Register, $src1$$Register, 64-log2_long((((jlong) $src2$$constant)+1))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// AndL + ConvL2I. ++instruct convL2I_andL_reg_immLpow2minus1(iRegIdst dst, iRegLsrc src1, immLpow2minus1 src2) %{ ++ match(Set dst (ConvL2I (AndL src1 src2))); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "ANDDI $dst, $src1, $src2 \t// long + l2i" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ clrldi($dst$$Register, $src1$$Register, 64-log2_long((((jlong) $src2$$constant)+1))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Or Instructions ++ ++// Register Or ++instruct orI_reg_reg(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (OrI src1 src2)); ++ format %{ "OR $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ or_unchecked($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Expand does not work with above instruct. (??) ++instruct orI_reg_reg_2(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ // no match-rule ++ effect(DEF dst, USE src1, USE src2); ++ format %{ "OR $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ or_unchecked($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct tree_orI_orI_orI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2, iRegIsrc src3, iRegIsrc src4) %{ ++ match(Set dst (OrI (OrI (OrI src1 src2) src3) src4)); ++ ins_cost(DEFAULT_COST*3); ++ ++ expand %{ ++ // FIXME: we should do this in the ideal world. ++ iRegIdst tmp1; ++ iRegIdst tmp2; ++ orI_reg_reg(tmp1, src1, src2); ++ orI_reg_reg_2(tmp2, src3, src4); // Adlc complains about orI_reg_reg. ++ orI_reg_reg(dst, tmp1, tmp2); ++ %} ++%} ++ ++// Immediate Or ++instruct orI_reg_uimm16(iRegIdst dst, iRegIsrc src1, uimmI16 src2) %{ ++ match(Set dst (OrI src1 src2)); ++ format %{ "ORI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ori); ++ __ ori($dst$$Register, $src1$$Register, ($src2$$constant) & 0xFFFF); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Register Or Long ++instruct orL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (OrL src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ size(4); ++ format %{ "OR $dst, $src1, $src2 \t// long" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ or_unchecked($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// OrL + ConvL2I. ++instruct orI_regL_regL(iRegIdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (ConvL2I (OrL src1 src2))); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "OR $dst, $src1, $src2 \t// long + l2i" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ or_unchecked($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate Or long ++instruct orL_reg_uimm16(iRegLdst dst, iRegLsrc src1, uimmL16 con) %{ ++ match(Set dst (OrL src1 con)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "ORI $dst, $src1, $con \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_ori); ++ __ ori($dst$$Register, $src1$$Register, ($con$$constant) & 0xFFFF); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Xor Instructions ++ ++// Register Xor ++instruct xorI_reg_reg(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (XorI src1 src2)); ++ format %{ "XOR $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_xor); ++ __ xorr($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Expand does not work with above instruct. (??) ++instruct xorI_reg_reg_2(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ // no match-rule ++ effect(DEF dst, USE src1, USE src2); ++ format %{ "XOR $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_xor); ++ __ xorr($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct tree_xorI_xorI_xorI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2, iRegIsrc src3, iRegIsrc src4) %{ ++ match(Set dst (XorI (XorI (XorI src1 src2) src3) src4)); ++ ins_cost(DEFAULT_COST*3); ++ ++ expand %{ ++ // FIXME: we should do this in the ideal world. ++ iRegIdst tmp1; ++ iRegIdst tmp2; ++ xorI_reg_reg(tmp1, src1, src2); ++ xorI_reg_reg_2(tmp2, src3, src4); // Adlc complains about xorI_reg_reg. ++ xorI_reg_reg(dst, tmp1, tmp2); ++ %} ++%} ++ ++// Immediate Xor ++instruct xorI_reg_uimm16(iRegIdst dst, iRegIsrc src1, uimmI16 src2) %{ ++ match(Set dst (XorI src1 src2)); ++ format %{ "XORI $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_xori); ++ __ xori($dst$$Register, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Register Xor Long ++instruct xorL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (XorL src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "XOR $dst, $src1, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_xor); ++ __ xorr($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// XorL + ConvL2I. ++instruct xorI_regL_regL(iRegIdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (ConvL2I (XorL src1 src2))); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "XOR $dst, $src1, $src2 \t// long + l2i" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_xor); ++ __ xorr($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Immediate Xor Long ++instruct xorL_reg_uimm16(iRegLdst dst, iRegLsrc src1, uimmL16 src2) %{ ++ match(Set dst (XorL src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "XORI $dst, $src1, $src2 \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_xori); ++ __ xori($dst$$Register, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct notI_reg(iRegIdst dst, iRegIsrc src1, immI_minus1 src2) %{ ++ match(Set dst (XorI src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "NOT $dst, $src1 ($src2)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_nor); ++ __ nor($dst$$Register, $src1$$Register, $src1$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct notL_reg(iRegLdst dst, iRegLsrc src1, immL_minus1 src2) %{ ++ match(Set dst (XorL src1 src2)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "NOT $dst, $src1 ($src2) \t// long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_nor); ++ __ nor($dst$$Register, $src1$$Register, $src1$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// And-complement ++instruct andcI_reg_reg(iRegIdst dst, iRegIsrc src1, immI_minus1 src2, iRegIsrc src3) %{ ++ match(Set dst (AndI (XorI src1 src2) src3)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "ANDW $dst, xori($src1, $src2), $src3" %} ++ size(4); ++ ins_encode( enc_andc(dst, src3, src1) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// And-complement ++instruct andcL_reg_reg(iRegLdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "ANDC $dst, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_andc); ++ __ andc($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Moves between int/long and float/double---------------------------- ++// ++// The following rules move values from int/long registers/stack-locations ++// to float/double registers/stack-locations and vice versa, without doing any ++// conversions. These rules are used to implement the bit-conversion methods ++// of java.lang.Float etc., e.g. ++// int floatToIntBits(float value) ++// float intBitsToFloat(int bits) ++// ++// Notes on the implementation on ppc64: ++// We only provide rules which move between a register and a stack-location, ++// because we always have to go through memory when moving between a float ++// register and an integer register. ++ ++//---------- Chain stack slots between similar types -------- ++ ++// These are needed so that the rules below can match. ++ ++// Load integer from stack slot ++instruct stkI_to_regI(iRegIdst dst, stackSlotI src) %{ ++ match(Set dst src); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $src" %} ++ size(4); ++ ins_encode( enc_lwz(dst, src) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store integer to stack slot ++instruct regI_to_stkI(stackSlotI dst, iRegIsrc src) %{ ++ match(Set dst src); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STW $src, $dst \t// stk" %} ++ size(4); ++ ins_encode( enc_stw(src, dst) ); // rs=rt ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Load long from stack slot ++instruct stkL_to_regL(iRegLdst dst, stackSlotL src) %{ ++ match(Set dst src); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LD $dst, $src \t// long" %} ++ size(4); ++ ins_encode( enc_ld(dst, src) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Store long to stack slot ++instruct regL_to_stkL(stackSlotL dst, iRegLsrc src) %{ ++ match(Set dst src); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STD $src, $dst \t// long" %} ++ size(4); ++ ins_encode( enc_std(src, dst) ); // rs=rt ++ ins_pipe(pipe_class_memory); ++%} ++ ++//----------Moves between int and float ++ ++// Move float value from float stack-location to integer register. ++instruct moveF2I_stack_reg(iRegIdst dst, stackSlotF src) %{ ++ match(Set dst (MoveF2I src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LWZ $dst, $src \t// MoveF2I" %} ++ size(4); ++ ins_encode( enc_lwz(dst, src) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Move float value from float register to integer stack-location. ++instruct moveF2I_reg_stack(stackSlotI dst, regF src) %{ ++ match(Set dst (MoveF2I src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STFS $src, $dst \t// MoveF2I" %} ++ size(4); ++ ins_encode( enc_stfs(src, dst) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Move integer value from integer stack-location to float register. ++instruct moveI2F_stack_reg(regF dst, stackSlotI src) %{ ++ match(Set dst (MoveI2F src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LFS $dst, $src \t// MoveI2F" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_lfs); ++ int Idisp = $src$$disp + frame_slots_bias($src$$base, ra_); ++ __ lfs($dst$$FloatRegister, Idisp, $src$$base$$Register); ++ %} ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Move integer value from integer register to float stack-location. ++instruct moveI2F_reg_stack(stackSlotF dst, iRegIsrc src) %{ ++ match(Set dst (MoveI2F src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STW $src, $dst \t// MoveI2F" %} ++ size(4); ++ ins_encode( enc_stw(src, dst) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++//----------Moves between long and float ++ ++instruct moveF2L_reg_stack(stackSlotL dst, regF src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "storeD $src, $dst \t// STACK" %} ++ size(4); ++ ins_encode( enc_stfd(src, dst) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Moves between long and double ++ ++// Move double value from double stack-location to long register. ++instruct moveD2L_stack_reg(iRegLdst dst, stackSlotD src) %{ ++ match(Set dst (MoveD2L src)); ++ ins_cost(MEMORY_REF_COST); ++ size(4); ++ format %{ "LD $dst, $src \t// MoveD2L" %} ++ ins_encode( enc_ld(dst, src) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Move double value from double register to long stack-location. ++instruct moveD2L_reg_stack(stackSlotL dst, regD src) %{ ++ match(Set dst (MoveD2L src)); ++ effect(DEF dst, USE src); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STFD $src, $dst \t// MoveD2L" %} ++ size(4); ++ ins_encode( enc_stfd(src, dst) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Move long value from long stack-location to double register. ++instruct moveL2D_stack_reg(regD dst, stackSlotL src) %{ ++ match(Set dst (MoveL2D src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "LFD $dst, $src \t// MoveL2D" %} ++ size(4); ++ ins_encode( enc_lfd(dst, src) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++// Move long value from long register to double stack-location. ++instruct moveL2D_reg_stack(stackSlotD dst, iRegLsrc src) %{ ++ match(Set dst (MoveL2D src)); ++ ins_cost(MEMORY_REF_COST); ++ ++ format %{ "STD $src, $dst \t// MoveL2D" %} ++ size(4); ++ ins_encode( enc_std(src, dst) ); ++ ins_pipe(pipe_class_memory); ++%} ++ ++//----------Register Move Instructions----------------------------------------- ++ ++// Replicate for Superword ++ ++instruct moveReg(iRegLdst dst, iRegIsrc src) %{ ++ predicate(false); ++ effect(DEF dst, USE src); ++ ++ format %{ "MR $dst, $src \t// replicate " %} ++ // variable size, 0 or 4. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ mr_if_needed($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Cast instructions (Java-level type cast)--------------------------- ++ ++// Cast Long to Pointer for unsafe natives. ++instruct castX2P(iRegPdst dst, iRegLsrc src) %{ ++ match(Set dst (CastX2P src)); ++ ++ format %{ "MR $dst, $src \t// Long->Ptr" %} ++ // variable size, 0 or 4. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ mr_if_needed($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Cast Pointer to Long for unsafe natives. ++instruct castP2X(iRegLdst dst, iRegP_N2P src) %{ ++ match(Set dst (CastP2X src)); ++ ++ format %{ "MR $dst, $src \t// Ptr->Long" %} ++ // variable size, 0 or 4. ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ mr_if_needed($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct castPP(iRegPdst dst) %{ ++ match(Set dst (CastPP dst)); ++ format %{ " -- \t// castPP of $dst" %} ++ size(0); ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct castII(iRegIdst dst) %{ ++ match(Set dst (CastII dst)); ++ format %{ " -- \t// castII of $dst" %} ++ size(0); ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct checkCastPP(iRegPdst dst) %{ ++ match(Set dst (CheckCastPP dst)); ++ format %{ " -- \t// checkcastPP of $dst" %} ++ size(0); ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Convert instructions----------------------------------------------- ++ ++// Convert to boolean. ++ ++// int_to_bool(src) : { 1 if src != 0 ++// { 0 else ++// ++// strategy: ++// 1) Count leading zeros of 32 bit-value src, ++// this returns 32 (0b10.0000) iff src == 0 and <32 otherwise. ++// 2) Shift 5 bits to the right, result is 0b1 iff src == 0, 0b0 otherwise. ++// 3) Xori the result to get 0b1 if src != 0 and 0b0 if src == 0. ++ ++// convI2Bool ++instruct convI2Bool_reg__cntlz_Ex(iRegIdst dst, iRegIsrc src) %{ ++ match(Set dst (Conv2B src)); ++ predicate(UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ immI shiftAmount %{ 0x5 %} ++ uimmI16 mask %{ 0x1 %} ++ iRegIdst tmp1; ++ iRegIdst tmp2; ++ countLeadingZerosI(tmp1, src); ++ urShiftI_reg_imm(tmp2, tmp1, shiftAmount); ++ xorI_reg_uimm16(dst, tmp2, mask); ++ %} ++%} ++ ++instruct convI2Bool_reg__cmove(iRegIdst dst, iRegIsrc src, flagsReg crx) %{ ++ match(Set dst (Conv2B src)); ++ effect(TEMP crx); ++ predicate(!UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CMPWI $crx, $src, #0 \t// convI2B" ++ "LI $dst, #0\n\t" ++ "BEQ $crx, done\n\t" ++ "LI $dst, #1\n" ++ "done:" %} ++ size(16); ++ ins_encode( enc_convI2B_regI__cmove(dst, src, crx, 0x0, 0x1) ); ++ ins_pipe(pipe_class_compare); ++%} ++ ++// ConvI2B + XorI ++instruct xorI_convI2Bool_reg_immIvalue1__cntlz_Ex(iRegIdst dst, iRegIsrc src, immI_1 mask) %{ ++ match(Set dst (XorI (Conv2B src) mask)); ++ predicate(UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ immI shiftAmount %{ 0x5 %} ++ iRegIdst tmp1; ++ countLeadingZerosI(tmp1, src); ++ urShiftI_reg_imm(dst, tmp1, shiftAmount); ++ %} ++%} ++ ++instruct xorI_convI2Bool_reg_immIvalue1__cmove(iRegIdst dst, iRegIsrc src, flagsReg crx, immI_1 mask) %{ ++ match(Set dst (XorI (Conv2B src) mask)); ++ effect(TEMP crx); ++ predicate(!UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CMPWI $crx, $src, #0 \t// Xor(convI2B($src), $mask)" ++ "LI $dst, #1\n\t" ++ "BEQ $crx, done\n\t" ++ "LI $dst, #0\n" ++ "done:" %} ++ size(16); ++ ins_encode( enc_convI2B_regI__cmove(dst, src, crx, 0x1, 0x0) ); ++ ins_pipe(pipe_class_compare); ++%} ++ ++// AndI 0b0..010..0 + ConvI2B ++instruct convI2Bool_andI_reg_immIpowerOf2(iRegIdst dst, iRegIsrc src, immIpowerOf2 mask) %{ ++ match(Set dst (Conv2B (AndI src mask))); ++ predicate(UseRotateAndMaskInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "RLWINM $dst, $src, $mask \t// convI2B(AndI($src, $mask))" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwinm); ++ __ rlwinm($dst$$Register, $src$$Register, (32-log2_long((jlong)$mask$$constant)) & 0x1f, 31, 31); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Convert pointer to boolean. ++// ++// ptr_to_bool(src) : { 1 if src != 0 ++// { 0 else ++// ++// strategy: ++// 1) Count leading zeros of 64 bit-value src, ++// this returns 64 (0b100.0000) iff src == 0 and <64 otherwise. ++// 2) Shift 6 bits to the right, result is 0b1 iff src == 0, 0b0 otherwise. ++// 3) Xori the result to get 0b1 if src != 0 and 0b0 if src == 0. ++ ++// ConvP2B ++instruct convP2Bool_reg__cntlz_Ex(iRegIdst dst, iRegP_N2P src) %{ ++ match(Set dst (Conv2B src)); ++ predicate(UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ immI shiftAmount %{ 0x6 %} ++ uimmI16 mask %{ 0x1 %} ++ iRegIdst tmp1; ++ iRegIdst tmp2; ++ countLeadingZerosP(tmp1, src); ++ urShiftI_reg_imm(tmp2, tmp1, shiftAmount); ++ xorI_reg_uimm16(dst, tmp2, mask); ++ %} ++%} ++ ++instruct convP2Bool_reg__cmove(iRegIdst dst, iRegP_N2P src, flagsReg crx) %{ ++ match(Set dst (Conv2B src)); ++ effect(TEMP crx); ++ predicate(!UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CMPDI $crx, $src, #0 \t// convP2B" ++ "LI $dst, #0\n\t" ++ "BEQ $crx, done\n\t" ++ "LI $dst, #1\n" ++ "done:" %} ++ size(16); ++ ins_encode( enc_convP2B_regP__cmove(dst, src, crx, 0x0, 0x1) ); ++ ins_pipe(pipe_class_compare); ++%} ++ ++// ConvP2B + XorI ++instruct xorI_convP2Bool_reg__cntlz_Ex(iRegIdst dst, iRegP_N2P src, immI_1 mask) %{ ++ match(Set dst (XorI (Conv2B src) mask)); ++ predicate(UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ immI shiftAmount %{ 0x6 %} ++ iRegIdst tmp1; ++ countLeadingZerosP(tmp1, src); ++ urShiftI_reg_imm(dst, tmp1, shiftAmount); ++ %} ++%} ++ ++instruct xorI_convP2Bool_reg_immIvalue1__cmove(iRegIdst dst, iRegP_N2P src, flagsReg crx, immI_1 mask) %{ ++ match(Set dst (XorI (Conv2B src) mask)); ++ effect(TEMP crx); ++ predicate(!UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CMPDI $crx, $src, #0 \t// XorI(convP2B($src), $mask)" ++ "LI $dst, #1\n\t" ++ "BEQ $crx, done\n\t" ++ "LI $dst, #0\n" ++ "done:" %} ++ size(16); ++ ins_encode( enc_convP2B_regP__cmove(dst, src, crx, 0x1, 0x0) ); ++ ins_pipe(pipe_class_compare); ++%} ++ ++// if src1 < src2, return -1 else return 0 ++instruct cmpLTMask_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (CmpLTMask src1 src2)); ++ ins_cost(DEFAULT_COST*4); ++ ++ expand %{ ++ iRegLdst src1s; ++ iRegLdst src2s; ++ iRegLdst diff; ++ convI2L_reg(src1s, src1); // Ensure proper sign extension. ++ convI2L_reg(src2s, src2); // Ensure proper sign extension. ++ subL_reg_reg(diff, src1s, src2s); ++ // Need to consider >=33 bit result, therefore we need signmaskL. ++ signmask64I_regL(dst, diff); ++ %} ++%} ++ ++instruct cmpLTMask_reg_immI0(iRegIdst dst, iRegIsrc src1, immI_0 src2) %{ ++ match(Set dst (CmpLTMask src1 src2)); // if src1 < src2, return -1 else return 0 ++ format %{ "SRAWI $dst, $src1, $src2 \t// CmpLTMask" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_srawi); ++ __ srawi($dst$$Register, $src1$$Register, 0x1f); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Arithmetic Conversion Instructions--------------------------------- ++ ++// Convert to Byte -- nop ++// Convert to Short -- nop ++ ++// Convert to Int ++ ++instruct convB2I_reg(iRegIdst dst, iRegIsrc src, immI_24 amount) %{ ++ match(Set dst (RShiftI (LShiftI src amount) amount)); ++ format %{ "EXTSB $dst, $src \t// byte->int" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_extsb); ++ __ extsb($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// LShiftI 16 + RShiftI 16 converts short to int. ++instruct convS2I_reg(iRegIdst dst, iRegIsrc src, immI_16 amount) %{ ++ match(Set dst (RShiftI (LShiftI src amount) amount)); ++ format %{ "EXTSH $dst, $src \t// short->int" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_extsh); ++ __ extsh($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// ConvL2I + ConvI2L: Sign extend int in long register. ++instruct sxtI_L2L_reg(iRegLdst dst, iRegLsrc src) %{ ++ match(Set dst (ConvI2L (ConvL2I src))); ++ ++ format %{ "EXTSW $dst, $src \t// long->long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_extsw); ++ __ extsw($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct convL2I_reg(iRegIdst dst, iRegLsrc src) %{ ++ match(Set dst (ConvL2I src)); ++ format %{ "MR $dst, $src \t// long->int" %} ++ // variable size, 0 or 4 ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_or); ++ __ mr_if_needed($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct convD2IRaw_regD(regD dst, regD src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "FCTIWZ $dst, $src \t// convD2I, $src != NaN" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fctiwz);; ++ __ fctiwz($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovI_bso_stackSlotL(iRegIdst dst, flagsReg crx, stackSlotL src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE crx, USE src); ++ predicate(false); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "cmovI $crx, $dst, $src" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT(InsertEndGroupPPC64 && Compile::current()->do_hb_scheduling())*/ ? 12 : 8); ++ ins_encode( enc_cmove_bso_stackSlotL(dst, crx, src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovI_bso_stackSlotL_conLvalue0_Ex(iRegIdst dst, flagsReg crx, stackSlotL mem) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE crx, USE mem); ++ predicate(false); ++ ++ format %{ "CmovI $dst, $crx, $mem \t// postalloc expanded" %} ++ postalloc_expand %{ ++ // ++ // replaces ++ // ++ // region dst crx mem ++ // \ | | / ++ // dst=cmovI_bso_stackSlotL_conLvalue0 ++ // ++ // with ++ // ++ // region dst ++ // \ / ++ // dst=loadConI16(0) ++ // | ++ // ^ region dst crx mem ++ // | \ | | / ++ // dst=cmovI_bso_stackSlotL ++ // ++ ++ // Create new nodes. ++ MachNode *m1 = new (C) loadConI16Node(); ++ MachNode *m2 = new (C) cmovI_bso_stackSlotLNode(); ++ ++ // inputs for new nodes ++ m1->add_req(n_region); ++ m2->add_req(n_region, n_crx, n_mem); ++ ++ // precedences for new nodes ++ m2->add_prec(m1); ++ ++ // operands for new nodes ++ m1->_opnds[0] = op_dst; ++ m1->_opnds[1] = new (C) immI16Oper(0); ++ ++ m2->_opnds[0] = op_dst; ++ m2->_opnds[1] = op_crx; ++ m2->_opnds[2] = op_mem; ++ ++ // registers for new nodes ++ ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // dst ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // dst ++ ++ // Insert new nodes. ++ nodes->push(m1); ++ nodes->push(m2); ++ %} ++%} ++ ++// Double to Int conversion, NaN is mapped to 0. ++instruct convD2I_reg_ExEx(iRegIdst dst, regD src) %{ ++ match(Set dst (ConvD2I src)); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ regD tmpD; ++ stackSlotL tmpS; ++ flagsReg crx; ++ cmpDUnordered_reg_reg(crx, src, src); // Check whether src is NaN. ++ convD2IRaw_regD(tmpD, src); // Convert float to int (speculated). ++ moveD2L_reg_stack(tmpS, tmpD); // Store float to stack (speculated). ++ cmovI_bso_stackSlotL_conLvalue0_Ex(dst, crx, tmpS); // Cmove based on NaN check. ++ %} ++%} ++ ++instruct convF2IRaw_regF(regF dst, regF src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "FCTIWZ $dst, $src \t// convF2I, $src != NaN" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fctiwz); ++ __ fctiwz($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Float to Int conversion, NaN is mapped to 0. ++instruct convF2I_regF_ExEx(iRegIdst dst, regF src) %{ ++ match(Set dst (ConvF2I src)); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ regF tmpF; ++ stackSlotL tmpS; ++ flagsReg crx; ++ cmpFUnordered_reg_reg(crx, src, src); // Check whether src is NaN. ++ convF2IRaw_regF(tmpF, src); // Convert float to int (speculated). ++ moveF2L_reg_stack(tmpS, tmpF); // Store float to stack (speculated). ++ cmovI_bso_stackSlotL_conLvalue0_Ex(dst, crx, tmpS); // Cmove based on NaN check. ++ %} ++%} ++ ++// Convert to Long ++ ++instruct convI2L_reg(iRegLdst dst, iRegIsrc src) %{ ++ match(Set dst (ConvI2L src)); ++ format %{ "EXTSW $dst, $src \t// int->long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_extsw); ++ __ extsw($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Zero-extend: convert unsigned int to long (convUI2L). ++instruct zeroExtendL_regI(iRegLdst dst, iRegIsrc src, immL_32bits mask) %{ ++ match(Set dst (AndL (ConvI2L src) mask)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CLRLDI $dst, $src, #32 \t// zero-extend int to long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ clrldi($dst$$Register, $src$$Register, 32); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Zero-extend: convert unsigned int to long in long register. ++instruct zeroExtendL_regL(iRegLdst dst, iRegLsrc src, immL_32bits mask) %{ ++ match(Set dst (AndL src mask)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CLRLDI $dst, $src, #32 \t// zero-extend int to long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl); ++ __ clrldi($dst$$Register, $src$$Register, 32); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct convF2LRaw_regF(regF dst, regF src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "FCTIDZ $dst, $src \t// convF2L, $src != NaN" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fctiwz); ++ __ fctidz($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovL_bso_stackSlotL(iRegLdst dst, flagsReg crx, stackSlotL src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE crx, USE src); ++ predicate(false); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "cmovL $crx, $dst, $src" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT Compile::current()->do_hb_scheduling()*/ ? 12 : 8); ++ ins_encode( enc_cmove_bso_stackSlotL(dst, crx, src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmovL_bso_stackSlotL_conLvalue0_Ex(iRegLdst dst, flagsReg crx, stackSlotL mem) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE crx, USE mem); ++ predicate(false); ++ ++ format %{ "CmovL $dst, $crx, $mem \t// postalloc expanded" %} ++ postalloc_expand %{ ++ // ++ // replaces ++ // ++ // region dst crx mem ++ // \ | | / ++ // dst=cmovL_bso_stackSlotL_conLvalue0 ++ // ++ // with ++ // ++ // region dst ++ // \ / ++ // dst=loadConL16(0) ++ // | ++ // ^ region dst crx mem ++ // | \ | | / ++ // dst=cmovL_bso_stackSlotL ++ // ++ ++ // Create new nodes. ++ MachNode *m1 = new (C) loadConL16Node(); ++ MachNode *m2 = new (C) cmovL_bso_stackSlotLNode(); ++ ++ // inputs for new nodes ++ m1->add_req(n_region); ++ m2->add_req(n_region, n_crx, n_mem); ++ m2->add_prec(m1); ++ ++ // operands for new nodes ++ m1->_opnds[0] = op_dst; ++ m1->_opnds[1] = new (C) immL16Oper(0); ++ m2->_opnds[0] = op_dst; ++ m2->_opnds[1] = op_crx; ++ m2->_opnds[2] = op_mem; ++ ++ // registers for new nodes ++ ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // dst ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // dst ++ ++ // Insert new nodes. ++ nodes->push(m1); ++ nodes->push(m2); ++ %} ++%} ++ ++// Float to Long conversion, NaN is mapped to 0. ++instruct convF2L_reg_ExEx(iRegLdst dst, regF src) %{ ++ match(Set dst (ConvF2L src)); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ regF tmpF; ++ stackSlotL tmpS; ++ flagsReg crx; ++ cmpFUnordered_reg_reg(crx, src, src); // Check whether src is NaN. ++ convF2LRaw_regF(tmpF, src); // Convert float to long (speculated). ++ moveF2L_reg_stack(tmpS, tmpF); // Store float to stack (speculated). ++ cmovL_bso_stackSlotL_conLvalue0_Ex(dst, crx, tmpS); // Cmove based on NaN check. ++ %} ++%} ++ ++instruct convD2LRaw_regD(regD dst, regD src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "FCTIDZ $dst, $src \t// convD2L $src != NaN" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fctiwz); ++ __ fctidz($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Double to Long conversion, NaN is mapped to 0. ++instruct convD2L_reg_ExEx(iRegLdst dst, regD src) %{ ++ match(Set dst (ConvD2L src)); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ regD tmpD; ++ stackSlotL tmpS; ++ flagsReg crx; ++ cmpDUnordered_reg_reg(crx, src, src); // Check whether src is NaN. ++ convD2LRaw_regD(tmpD, src); // Convert float to long (speculated). ++ moveD2L_reg_stack(tmpS, tmpD); // Store float to stack (speculated). ++ cmovL_bso_stackSlotL_conLvalue0_Ex(dst, crx, tmpS); // Cmove based on NaN check. ++ %} ++%} ++ ++// Convert to Float ++ ++// Placed here as needed in expand. ++instruct convL2DRaw_regD(regD dst, regD src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "FCFID $dst, $src \t// convL2D" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fcfid); ++ __ fcfid($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Placed here as needed in expand. ++instruct convD2F_reg(regF dst, regD src) %{ ++ match(Set dst (ConvD2F src)); ++ format %{ "FRSP $dst, $src \t// convD2F" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_frsp); ++ __ frsp($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Integer to Float conversion. ++instruct convI2F_ireg_Ex(regF dst, iRegIsrc src) %{ ++ match(Set dst (ConvI2F src)); ++ predicate(!VM_Version::has_fcfids()); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ iRegLdst tmpL; ++ stackSlotL tmpS; ++ regD tmpD; ++ regD tmpD2; ++ convI2L_reg(tmpL, src); // Sign-extension int to long. ++ regL_to_stkL(tmpS, tmpL); // Store long to stack. ++ moveL2D_stack_reg(tmpD, tmpS); // Load long into double register. ++ convL2DRaw_regD(tmpD2, tmpD); // Convert to double. ++ convD2F_reg(dst, tmpD2); // Convert double to float. ++ %} ++%} ++ ++instruct convL2FRaw_regF(regF dst, regD src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "FCFIDS $dst, $src \t// convL2F" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fcfid); ++ __ fcfids($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Integer to Float conversion. Special version for Power7. ++instruct convI2F_ireg_fcfids_Ex(regF dst, iRegIsrc src) %{ ++ match(Set dst (ConvI2F src)); ++ predicate(VM_Version::has_fcfids()); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ iRegLdst tmpL; ++ stackSlotL tmpS; ++ regD tmpD; ++ convI2L_reg(tmpL, src); // Sign-extension int to long. ++ regL_to_stkL(tmpS, tmpL); // Store long to stack. ++ moveL2D_stack_reg(tmpD, tmpS); // Load long into double register. ++ convL2FRaw_regF(dst, tmpD); // Convert to float. ++ %} ++%} ++ ++// L2F to avoid runtime call. ++instruct convL2F_ireg_fcfids_Ex(regF dst, iRegLsrc src) %{ ++ match(Set dst (ConvL2F src)); ++ predicate(VM_Version::has_fcfids()); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ stackSlotL tmpS; ++ regD tmpD; ++ regL_to_stkL(tmpS, src); // Store long to stack. ++ moveL2D_stack_reg(tmpD, tmpS); // Load long into double register. ++ convL2FRaw_regF(dst, tmpD); // Convert to float. ++ %} ++%} ++ ++// Moved up as used in expand. ++//instruct convD2F_reg(regF dst, regD src) %{%} ++ ++// Convert to Double ++ ++// Integer to Double conversion. ++instruct convI2D_reg_Ex(regD dst, iRegIsrc src) %{ ++ match(Set dst (ConvI2D src)); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ iRegLdst tmpL; ++ stackSlotL tmpS; ++ regD tmpD; ++ convI2L_reg(tmpL, src); // Sign-extension int to long. ++ regL_to_stkL(tmpS, tmpL); // Store long to stack. ++ moveL2D_stack_reg(tmpD, tmpS); // Load long into double register. ++ convL2DRaw_regD(dst, tmpD); // Convert to double. ++ %} ++%} ++ ++// Long to Double conversion ++instruct convL2D_reg_Ex(regD dst, stackSlotL src) %{ ++ match(Set dst (ConvL2D src)); ++ ins_cost(DEFAULT_COST + MEMORY_REF_COST); ++ ++ expand %{ ++ regD tmpD; ++ moveL2D_stack_reg(tmpD, src); ++ convL2DRaw_regD(dst, tmpD); ++ %} ++%} ++ ++instruct convF2D_reg(regD dst, regF src) %{ ++ match(Set dst (ConvF2D src)); ++ format %{ "FMR $dst, $src \t// float->double" %} ++ // variable size, 0 or 4 ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fmr); ++ __ fmr_if_needed($dst$$FloatRegister, $src$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------Control Flow Instructions------------------------------------------ ++// Compare Instructions ++ ++// Compare Integers ++instruct cmpI_reg_reg(flagsReg crx, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set crx (CmpI src1 src2)); ++ size(4); ++ format %{ "CMPW $crx, $src1, $src2" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmp); ++ __ cmpw($crx$$CondRegister, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct cmpI_reg_imm16(flagsReg crx, iRegIsrc src1, immI16 src2) %{ ++ match(Set crx (CmpI src1 src2)); ++ format %{ "CMPWI $crx, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmpi); ++ __ cmpwi($crx$$CondRegister, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// (src1 & src2) == 0? ++instruct testI_reg_imm(flagsRegCR0 cr0, iRegIsrc src1, uimmI16 src2, immI_0 zero) %{ ++ match(Set cr0 (CmpI (AndI src1 src2) zero)); ++ // r0 is killed ++ format %{ "ANDI R0, $src1, $src2 \t// BTST int" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_andi_); ++ // FIXME: avoid andi_ ? ++ __ andi_(R0, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct cmpL_reg_reg(flagsReg crx, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set crx (CmpL src1 src2)); ++ format %{ "CMPD $crx, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmp); ++ __ cmpd($crx$$CondRegister, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct cmpL_reg_imm16(flagsReg crx, iRegLsrc src1, immL16 src2) %{ ++ match(Set crx (CmpL src1 src2)); ++ format %{ "CMPDI $crx, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmpi); ++ __ cmpdi($crx$$CondRegister, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct testL_reg_reg(flagsRegCR0 cr0, iRegLsrc src1, iRegLsrc src2, immL_0 zero) %{ ++ match(Set cr0 (CmpL (AndL src1 src2) zero)); ++ // r0 is killed ++ format %{ "AND R0, $src1, $src2 \t// BTST long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_and_); ++ __ and_(R0, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct testL_reg_imm(flagsRegCR0 cr0, iRegLsrc src1, uimmL16 src2, immL_0 zero) %{ ++ match(Set cr0 (CmpL (AndL src1 src2) zero)); ++ // r0 is killed ++ format %{ "ANDI R0, $src1, $src2 \t// BTST long" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_andi_); ++ // FIXME: avoid andi_ ? ++ __ andi_(R0, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct cmovI_conIvalueMinus1_conIvalue1(iRegIdst dst, flagsReg crx) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE crx); ++ predicate(false); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "cmovI $crx, $dst, -1, 0, +1" %} ++ // Worst case is branch + move + branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORTInsertEndGroupPPC64 && Compile::current()->do_hb_scheduling())*/ ? 20 : 16); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmove); ++ Label done; ++ // li(Rdst, 0); // equal -> 0 ++ __ beq($crx$$CondRegister, done); ++ __ li($dst$$Register, 1); // greater -> +1 ++ __ bgt($crx$$CondRegister, done); ++ __ li($dst$$Register, -1); // unordered or less -> -1 ++ // TODO: PPC port__ endgroup_if_needed(_size == 20); ++ __ bind(done); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct cmovI_conIvalueMinus1_conIvalue0_conIvalue1_Ex(iRegIdst dst, flagsReg crx) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE crx); ++ predicate(false); ++ ++ format %{ "CmovI $crx, $dst, -1, 0, +1 \t// postalloc expanded" %} ++ postalloc_expand %{ ++ // ++ // replaces ++ // ++ // region crx ++ // \ | ++ // dst=cmovI_conIvalueMinus1_conIvalue0_conIvalue1 ++ // ++ // with ++ // ++ // region ++ // \ ++ // dst=loadConI16(0) ++ // | ++ // ^ region crx ++ // | \ | ++ // dst=cmovI_conIvalueMinus1_conIvalue1 ++ // ++ ++ // Create new nodes. ++ MachNode *m1 = new (C) loadConI16Node(); ++ MachNode *m2 = new (C) cmovI_conIvalueMinus1_conIvalue1Node(); ++ ++ // inputs for new nodes ++ m1->add_req(n_region); ++ m2->add_req(n_region, n_crx); ++ m2->add_prec(m1); ++ ++ // operands for new nodes ++ m1->_opnds[0] = op_dst; ++ m1->_opnds[1] = new (C) immI16Oper(0); ++ m2->_opnds[0] = op_dst; ++ m2->_opnds[1] = op_crx; ++ ++ // registers for new nodes ++ ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // dst ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // dst ++ ++ // Insert new nodes. ++ nodes->push(m1); ++ nodes->push(m2); ++ %} ++%} ++ ++// Manifest a CmpL3 result in an integer register. Very painful. ++// This is the test to avoid. ++// (src1 < src2) ? -1 : ((src1 > src2) ? 1 : 0) ++instruct cmpL3_reg_reg_ExEx(iRegIdst dst, iRegLsrc src1, iRegLsrc src2) %{ ++ match(Set dst (CmpL3 src1 src2)); ++ ins_cost(DEFAULT_COST*5+BRANCH_COST); ++ ++ expand %{ ++ flagsReg tmp1; ++ cmpL_reg_reg(tmp1, src1, src2); ++ cmovI_conIvalueMinus1_conIvalue0_conIvalue1_Ex(dst, tmp1); ++ %} ++%} ++ ++// Implicit range checks. ++// A range check in the ideal world has one of the following shapes: ++// - (If le (CmpU length index)), (IfTrue throw exception) ++// - (If lt (CmpU index length)), (IfFalse throw exception) ++// ++// Match range check 'If le (CmpU length index)'. ++instruct rangeCheck_iReg_uimm15(cmpOp cmp, iRegIsrc src_length, uimmI15 index, label labl) %{ ++ match(If cmp (CmpU src_length index)); ++ effect(USE labl); ++ predicate(TrapBasedRangeChecks && ++ _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le && ++ PROB_UNLIKELY(_leaf->as_If()->_prob) >= PROB_ALWAYS && ++ (Matcher::branches_to_uncommon_trap(_leaf))); ++ ++ ins_is_TrapBasedCheckNode(true); ++ ++ format %{ "TWI $index $cmp $src_length \t// RangeCheck => trap $labl" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_twi); ++ if ($cmp$$cmpcode == 0x1 /* less_equal */) { ++ __ trap_range_check_le($src_length$$Register, $index$$constant); ++ } else { ++ // Both successors are uncommon traps, probability is 0. ++ // Node got flipped during fixup flow. ++ assert($cmp$$cmpcode == 0x9, "must be greater"); ++ __ trap_range_check_g($src_length$$Register, $index$$constant); ++ } ++ %} ++ ins_pipe(pipe_class_trap); ++%} ++ ++// Match range check 'If lt (CmpU index length)'. ++instruct rangeCheck_iReg_iReg(cmpOp cmp, iRegIsrc src_index, iRegIsrc src_length, label labl) %{ ++ match(If cmp (CmpU src_index src_length)); ++ effect(USE labl); ++ predicate(TrapBasedRangeChecks && ++ _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt && ++ _leaf->as_If()->_prob >= PROB_ALWAYS && ++ (Matcher::branches_to_uncommon_trap(_leaf))); ++ ++ ins_is_TrapBasedCheckNode(true); ++ ++ format %{ "TW $src_index $cmp $src_length \t// RangeCheck => trap $labl" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_tw); ++ if ($cmp$$cmpcode == 0x0 /* greater_equal */) { ++ __ trap_range_check_ge($src_index$$Register, $src_length$$Register); ++ } else { ++ // Both successors are uncommon traps, probability is 0. ++ // Node got flipped during fixup flow. ++ assert($cmp$$cmpcode == 0x8, "must be less"); ++ __ trap_range_check_l($src_index$$Register, $src_length$$Register); ++ } ++ %} ++ ins_pipe(pipe_class_trap); ++%} ++ ++// Match range check 'If lt (CmpU index length)'. ++instruct rangeCheck_uimm15_iReg(cmpOp cmp, iRegIsrc src_index, uimmI15 length, label labl) %{ ++ match(If cmp (CmpU src_index length)); ++ effect(USE labl); ++ predicate(TrapBasedRangeChecks && ++ _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt && ++ _leaf->as_If()->_prob >= PROB_ALWAYS && ++ (Matcher::branches_to_uncommon_trap(_leaf))); ++ ++ ins_is_TrapBasedCheckNode(true); ++ ++ format %{ "TWI $src_index $cmp $length \t// RangeCheck => trap $labl" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_twi); ++ if ($cmp$$cmpcode == 0x0 /* greater_equal */) { ++ __ trap_range_check_ge($src_index$$Register, $length$$constant); ++ } else { ++ // Both successors are uncommon traps, probability is 0. ++ // Node got flipped during fixup flow. ++ assert($cmp$$cmpcode == 0x8, "must be less"); ++ __ trap_range_check_l($src_index$$Register, $length$$constant); ++ } ++ %} ++ ins_pipe(pipe_class_trap); ++%} ++ ++instruct compU_reg_reg(flagsReg crx, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set crx (CmpU src1 src2)); ++ format %{ "CMPLW $crx, $src1, $src2 \t// unsigned" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmpl); ++ __ cmplw($crx$$CondRegister, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct compU_reg_uimm16(flagsReg crx, iRegIsrc src1, uimmI16 src2) %{ ++ match(Set crx (CmpU src1 src2)); ++ size(4); ++ format %{ "CMPLWI $crx, $src1, $src2" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmpli); ++ __ cmplwi($crx$$CondRegister, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// Implicit zero checks (more implicit null checks). ++// No constant pool entries required. ++instruct zeroCheckN_iReg_imm0(cmpOp cmp, iRegNsrc value, immN_0 zero, label labl) %{ ++ match(If cmp (CmpN value zero)); ++ effect(USE labl); ++ predicate(TrapBasedNullChecks && ++ _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne && ++ _leaf->as_If()->_prob >= PROB_LIKELY_MAG(4) && ++ Matcher::branches_to_uncommon_trap(_leaf)); ++ ins_cost(1); ++ ++ ins_is_TrapBasedCheckNode(true); ++ ++ format %{ "TDI $value $cmp $zero \t// ZeroCheckN => trap $labl" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_tdi); ++ if ($cmp$$cmpcode == 0xA) { ++ __ trap_null_check($value$$Register); ++ } else { ++ // Both successors are uncommon traps, probability is 0. ++ // Node got flipped during fixup flow. ++ assert($cmp$$cmpcode == 0x2 , "must be equal(0xA) or notEqual(0x2)"); ++ __ trap_null_check($value$$Register, Assembler::traptoGreaterThanUnsigned); ++ } ++ %} ++ ins_pipe(pipe_class_trap); ++%} ++ ++// Compare narrow oops. ++instruct cmpN_reg_reg(flagsReg crx, iRegNsrc src1, iRegNsrc src2) %{ ++ match(Set crx (CmpN src1 src2)); ++ ++ size(4); ++ ins_cost(DEFAULT_COST); ++ format %{ "CMPLW $crx, $src1, $src2 \t// compressed ptr" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmpl); ++ __ cmplw($crx$$CondRegister, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct cmpN_reg_imm0(flagsReg crx, iRegNsrc src1, immN_0 src2) %{ ++ match(Set crx (CmpN src1 src2)); ++ // Make this more expensive than zeroCheckN_iReg_imm0. ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CMPLWI $crx, $src1, $src2 \t// compressed ptr" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmpli); ++ __ cmplwi($crx$$CondRegister, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// Implicit zero checks (more implicit null checks). ++// No constant pool entries required. ++instruct zeroCheckP_reg_imm0(cmpOp cmp, iRegP_N2P value, immP_0 zero, label labl) %{ ++ match(If cmp (CmpP value zero)); ++ effect(USE labl); ++ predicate(TrapBasedNullChecks && ++ _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne && ++ _leaf->as_If()->_prob >= PROB_LIKELY_MAG(4) && ++ Matcher::branches_to_uncommon_trap(_leaf)); ++ ++ ins_is_TrapBasedCheckNode(true); ++ ++ format %{ "TDI $value $cmp $zero \t// ZeroCheckP => trap $labl" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_tdi); ++ if ($cmp$$cmpcode == 0xA) { ++ __ trap_null_check($value$$Register); ++ } else { ++ // Both successors are uncommon traps, probability is 0. ++ // Node got flipped during fixup flow. ++ assert($cmp$$cmpcode == 0x2 , "must be equal(0xA) or notEqual(0x2)"); ++ __ trap_null_check($value$$Register, Assembler::traptoGreaterThanUnsigned); ++ } ++ %} ++ ins_pipe(pipe_class_trap); ++%} ++ ++// Compare Pointers ++instruct cmpP_reg_reg(flagsReg crx, iRegP_N2P src1, iRegP_N2P src2) %{ ++ match(Set crx (CmpP src1 src2)); ++ format %{ "CMPLD $crx, $src1, $src2 \t// ptr" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmpl); ++ __ cmpld($crx$$CondRegister, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// Used in postalloc expand. ++instruct cmpP_reg_imm16(flagsReg crx, iRegPsrc src1, immL16 src2) %{ ++ // This match rule prevents reordering of node before a safepoint. ++ // This only makes sense if this instructions is used exclusively ++ // for the expansion of EncodeP! ++ match(Set crx (CmpP src1 src2)); ++ predicate(false); ++ ++ format %{ "CMPDI $crx, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmpi); ++ __ cmpdi($crx$$CondRegister, $src1$$Register, $src2$$constant); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++//----------Float Compares---------------------------------------------------- ++ ++instruct cmpFUnordered_reg_reg(flagsReg crx, regF src1, regF src2) %{ ++ // no match-rule, false predicate ++ effect(DEF crx, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "cmpFUrd $crx, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fcmpu); ++ __ fcmpu($crx$$CondRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmov_bns_less(flagsReg crx) %{ ++ // no match-rule, false predicate ++ effect(DEF crx); ++ predicate(false); ++ ++ ins_variable_size_depending_on_alignment(true); ++ ++ format %{ "cmov $crx" %} ++ // Worst case is branch + move + stop, no stop without scheduler. ++ size(false /* TODO: PPC PORT(InsertEndGroupPPC64 && Compile::current()->do_hb_scheduling())*/ ? 16 : 12); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cmovecr); ++ Label done; ++ __ bns($crx$$CondRegister, done); // not unordered -> keep crx ++ __ li(R0, 0); ++ __ cmpwi($crx$$CondRegister, R0, 1); // unordered -> set crx to 'less' ++ // TODO PPC port __ endgroup_if_needed(_size == 16); ++ __ bind(done); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Compare floating, generate condition code. ++instruct cmpF_reg_reg_Ex(flagsReg crx, regF src1, regF src2) %{ ++ // FIXME: should we match 'If cmp (CmpF src1 src2))' ?? ++ // ++ // The following code sequence occurs a lot in mpegaudio: ++ // ++ // block BXX: ++ // 0: instruct cmpFUnordered_reg_reg (cmpF_reg_reg-0): ++ // cmpFUrd CCR6, F11, F9 ++ // 4: instruct cmov_bns_less (cmpF_reg_reg-1): ++ // cmov CCR6 ++ // 8: instruct branchConSched: ++ // B_FARle CCR6, B56 P=0.500000 C=-1.000000 ++ match(Set crx (CmpF src1 src2)); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ format %{ "CmpF $crx, $src1, $src2 \t// postalloc expanded" %} ++ postalloc_expand %{ ++ // ++ // replaces ++ // ++ // region src1 src2 ++ // \ | | ++ // crx=cmpF_reg_reg ++ // ++ // with ++ // ++ // region src1 src2 ++ // \ | | ++ // crx=cmpFUnordered_reg_reg ++ // | ++ // ^ region ++ // | \ ++ // crx=cmov_bns_less ++ // ++ ++ // Create new nodes. ++ MachNode *m1 = new (C) cmpFUnordered_reg_regNode(); ++ MachNode *m2 = new (C) cmov_bns_lessNode(); ++ ++ // inputs for new nodes ++ m1->add_req(n_region, n_src1, n_src2); ++ m2->add_req(n_region); ++ m2->add_prec(m1); ++ ++ // operands for new nodes ++ m1->_opnds[0] = op_crx; ++ m1->_opnds[1] = op_src1; ++ m1->_opnds[2] = op_src2; ++ m2->_opnds[0] = op_crx; ++ ++ // registers for new nodes ++ ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // crx ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // crx ++ ++ // Insert new nodes. ++ nodes->push(m1); ++ nodes->push(m2); ++ %} ++%} ++ ++// Compare float, generate -1,0,1 ++instruct cmpF3_reg_reg_ExEx(iRegIdst dst, regF src1, regF src2) %{ ++ match(Set dst (CmpF3 src1 src2)); ++ ins_cost(DEFAULT_COST*5+BRANCH_COST); ++ ++ expand %{ ++ flagsReg tmp1; ++ cmpFUnordered_reg_reg(tmp1, src1, src2); ++ cmovI_conIvalueMinus1_conIvalue0_conIvalue1_Ex(dst, tmp1); ++ %} ++%} ++ ++instruct cmpDUnordered_reg_reg(flagsReg crx, regD src1, regD src2) %{ ++ // no match-rule, false predicate ++ effect(DEF crx, USE src1, USE src2); ++ predicate(false); ++ ++ format %{ "cmpFUrd $crx, $src1, $src2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fcmpu); ++ __ fcmpu($crx$$CondRegister, $src1$$FloatRegister, $src2$$FloatRegister); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct cmpD_reg_reg_Ex(flagsReg crx, regD src1, regD src2) %{ ++ match(Set crx (CmpD src1 src2)); ++ ins_cost(DEFAULT_COST+BRANCH_COST); ++ ++ format %{ "CmpD $crx, $src1, $src2 \t// postalloc expanded" %} ++ postalloc_expand %{ ++ // ++ // replaces ++ // ++ // region src1 src2 ++ // \ | | ++ // crx=cmpD_reg_reg ++ // ++ // with ++ // ++ // region src1 src2 ++ // \ | | ++ // crx=cmpDUnordered_reg_reg ++ // | ++ // ^ region ++ // | \ ++ // crx=cmov_bns_less ++ // ++ ++ // create new nodes ++ MachNode *m1 = new (C) cmpDUnordered_reg_regNode(); ++ MachNode *m2 = new (C) cmov_bns_lessNode(); ++ ++ // inputs for new nodes ++ m1->add_req(n_region, n_src1, n_src2); ++ m2->add_req(n_region); ++ m2->add_prec(m1); ++ ++ // operands for new nodes ++ m1->_opnds[0] = op_crx; ++ m1->_opnds[1] = op_src1; ++ m1->_opnds[2] = op_src2; ++ m2->_opnds[0] = op_crx; ++ ++ // registers for new nodes ++ ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // crx ++ ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); // crx ++ ++ // Insert new nodes. ++ nodes->push(m1); ++ nodes->push(m2); ++ %} ++%} ++ ++// Compare double, generate -1,0,1 ++instruct cmpD3_reg_reg_ExEx(iRegIdst dst, regD src1, regD src2) %{ ++ match(Set dst (CmpD3 src1 src2)); ++ ins_cost(DEFAULT_COST*5+BRANCH_COST); ++ ++ expand %{ ++ flagsReg tmp1; ++ cmpDUnordered_reg_reg(tmp1, src1, src2); ++ cmovI_conIvalueMinus1_conIvalue0_conIvalue1_Ex(dst, tmp1); ++ %} ++%} ++ ++//----------Branches--------------------------------------------------------- ++// Jump ++ ++// Direct Branch. ++instruct branch(label labl) %{ ++ match(Goto); ++ effect(USE labl); ++ ins_cost(BRANCH_COST); ++ ++ format %{ "B $labl" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_b); ++ Label d; // dummy ++ __ bind(d); ++ Label* p = $labl$$label; ++ // `p' is `NULL' when this encoding class is used only to ++ // determine the size of the encoded instruction. ++ Label& l = (NULL == p)? d : *(p); ++ __ b(l); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Conditional Near Branch ++instruct branchCon(cmpOp cmp, flagsReg crx, label lbl) %{ ++ // Same match rule as `branchConFar'. ++ match(If cmp crx); ++ effect(USE lbl); ++ ins_cost(BRANCH_COST); ++ ++ // If set to 1 this indicates that the current instruction is a ++ // short variant of a long branch. This avoids using this ++ // instruction in first-pass matching. It will then only be used in ++ // the `Shorten_branches' pass. ++ ins_short_branch(1); ++ ++ format %{ "B$cmp $crx, $lbl" %} ++ size(4); ++ ins_encode( enc_bc(crx, cmp, lbl) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// This is for cases when the ppc64 `bc' instruction does not ++// reach far enough. So we emit a far branch here, which is more ++// expensive. ++// ++// Conditional Far Branch ++instruct branchConFar(cmpOp cmp, flagsReg crx, label lbl) %{ ++ // Same match rule as `branchCon'. ++ match(If cmp crx); ++ effect(USE crx, USE lbl); ++ predicate(!false /* TODO: PPC port HB_Schedule*/); ++ // Higher cost than `branchCon'. ++ ins_cost(5*BRANCH_COST); ++ ++ // This is not a short variant of a branch, but the long variant. ++ ins_short_branch(0); ++ ++ format %{ "B_FAR$cmp $crx, $lbl" %} ++ size(8); ++ ins_encode( enc_bc_far(crx, cmp, lbl) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Conditional Branch used with Power6 scheduler (can be far or short). ++instruct branchConSched(cmpOp cmp, flagsReg crx, label lbl) %{ ++ // Same match rule as `branchCon'. ++ match(If cmp crx); ++ effect(USE crx, USE lbl); ++ predicate(false /* TODO: PPC port HB_Schedule*/); ++ // Higher cost than `branchCon'. ++ ins_cost(5*BRANCH_COST); ++ ++ // Actually size doesn't depend on alignment but on shortening. ++ ins_variable_size_depending_on_alignment(true); ++ // long variant. ++ ins_short_branch(0); ++ ++ format %{ "B_FAR$cmp $crx, $lbl" %} ++ size(8); // worst case ++ ins_encode( enc_bc_short_far(crx, cmp, lbl) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct branchLoopEnd(cmpOp cmp, flagsReg crx, label labl) %{ ++ match(CountedLoopEnd cmp crx); ++ effect(USE labl); ++ ins_cost(BRANCH_COST); ++ ++ // short variant. ++ ins_short_branch(1); ++ ++ format %{ "B$cmp $crx, $labl \t// counted loop end" %} ++ size(4); ++ ins_encode( enc_bc(crx, cmp, labl) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct branchLoopEndFar(cmpOp cmp, flagsReg crx, label labl) %{ ++ match(CountedLoopEnd cmp crx); ++ effect(USE labl); ++ predicate(!false /* TODO: PPC port HB_Schedule */); ++ ins_cost(BRANCH_COST); ++ ++ // Long variant. ++ ins_short_branch(0); ++ ++ format %{ "B_FAR$cmp $crx, $labl \t// counted loop end" %} ++ size(8); ++ ins_encode( enc_bc_far(crx, cmp, labl) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Conditional Branch used with Power6 scheduler (can be far or short). ++instruct branchLoopEndSched(cmpOp cmp, flagsReg crx, label labl) %{ ++ match(CountedLoopEnd cmp crx); ++ effect(USE labl); ++ predicate(false /* TODO: PPC port HB_Schedule */); ++ // Higher cost than `branchCon'. ++ ins_cost(5*BRANCH_COST); ++ ++ // Actually size doesn't depend on alignment but on shortening. ++ ins_variable_size_depending_on_alignment(true); ++ // Long variant. ++ ins_short_branch(0); ++ ++ format %{ "B_FAR$cmp $crx, $labl \t// counted loop end" %} ++ size(8); // worst case ++ ins_encode( enc_bc_short_far(crx, cmp, labl) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// ============================================================================ ++// Java runtime operations, intrinsics and other complex operations. ++ ++// The 2nd slow-half of a subtype check. Scan the subklass's 2ndary superklass ++// array for an instance of the superklass. Set a hidden internal cache on a ++// hit (cache is checked with exposed code in gen_subtype_check()). Return ++// not zero for a miss or zero for a hit. The encoding ALSO sets flags. ++// ++// GL TODO: Improve this. ++// - result should not be a TEMP ++// - Add match rule as on sparc avoiding additional Cmp. ++instruct partialSubtypeCheck(iRegPdst result, iRegP_N2P subklass, iRegP_N2P superklass, ++ iRegPdst tmp_klass, iRegPdst tmp_arrayptr) %{ ++ match(Set result (PartialSubtypeCheck subklass superklass)); ++ effect(TEMP result, TEMP tmp_klass, TEMP tmp_arrayptr); ++ ins_cost(DEFAULT_COST*10); ++ ++ format %{ "PartialSubtypeCheck $result = ($subklass instanceOf $superklass) tmp: $tmp_klass, $tmp_arrayptr" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ check_klass_subtype_slow_path($subklass$$Register, $superklass$$Register, $tmp_arrayptr$$Register, ++ $tmp_klass$$Register, NULL, $result$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// inlined locking and unlocking ++ ++instruct cmpFastLock(flagsReg crx, iRegPdst oop, iRegPdst box, iRegPdst tmp1, iRegPdst tmp2, iRegPdst tmp3) %{ ++ match(Set crx (FastLock oop box)); ++ effect(TEMP tmp1, TEMP tmp2, TEMP tmp3); ++ // TODO PPC port predicate(!UseNewFastLockPPC64 || UseBiasedLocking); ++ ++ format %{ "FASTLOCK $oop, $box, $tmp1, $tmp2, $tmp3" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ compiler_fast_lock_object($crx$$CondRegister, $oop$$Register, $box$$Register, ++ $tmp3$$Register, $tmp1$$Register, $tmp2$$Register); ++ // If locking was successfull, crx should indicate 'EQ'. ++ // The compiler generates a branch to the runtime call to ++ // _complete_monitor_locking_Java for the case where crx is 'NE'. ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++instruct cmpFastUnlock(flagsReg crx, iRegPdst oop, iRegPdst box, iRegPdst tmp1, iRegPdst tmp2, iRegPdst tmp3) %{ ++ match(Set crx (FastUnlock oop box)); ++ effect(TEMP tmp1, TEMP tmp2, TEMP tmp3); ++ ++ format %{ "FASTUNLOCK $oop, $box, $tmp1, $tmp2" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ compiler_fast_unlock_object($crx$$CondRegister, $oop$$Register, $box$$Register, ++ $tmp3$$Register, $tmp1$$Register, $tmp2$$Register); ++ // If unlocking was successfull, crx should indicate 'EQ'. ++ // The compiler generates a branch to the runtime call to ++ // _complete_monitor_unlocking_Java for the case where crx is 'NE'. ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// Align address. ++instruct align_addr(iRegPdst dst, iRegPsrc src, immLnegpow2 mask) %{ ++ match(Set dst (CastX2P (AndL (CastP2X src) mask))); ++ ++ format %{ "ANDDI $dst, $src, $mask \t// next aligned address" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldicr); ++ __ clrrdi($dst$$Register, $src$$Register, log2_long((jlong)-$mask$$constant)); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Array size computation. ++instruct array_size(iRegLdst dst, iRegPsrc end, iRegPsrc start) %{ ++ match(Set dst (SubL (CastP2X end) (CastP2X start))); ++ ++ format %{ "SUB $dst, $end, $start \t// array size in bytes" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_subf); ++ __ subf($dst$$Register, $start$$Register, $end$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Clear-array with dynamic array-size. ++instruct inlineCallClearArray(rarg1RegL cnt, rarg2RegP base, Universe dummy, regCTR ctr) %{ ++ match(Set dummy (ClearArray cnt base)); ++ effect(USE_KILL cnt, USE_KILL base, KILL ctr); ++ ins_cost(MEMORY_REF_COST); ++ ++ ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted. ++ ++ format %{ "ClearArray $cnt, $base" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ clear_memory_doubleword($base$$Register, $cnt$$Register); // kills cnt, base, R0 ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// String_IndexOf for needle of length 1. ++// ++// Match needle into immediate operands: no loadConP node needed. Saves one ++// register and two instructions over string_indexOf_imm1Node. ++// ++// Assumes register result differs from all input registers. ++// ++// Preserves registers haystack, haycnt ++// Kills registers tmp1, tmp2 ++// Defines registers result ++// ++// Use dst register classes if register gets killed, as it is the case for tmp registers! ++// ++// Unfortunately this does not match too often. In many situations the AddP is used ++// by several nodes, even several StrIndexOf nodes, breaking the match tree. ++instruct string_indexOf_imm1_char(iRegIdst result, iRegPsrc haystack, iRegIsrc haycnt, ++ immP needleImm, immL offsetImm, immI_1 needlecntImm, ++ iRegIdst tmp1, iRegIdst tmp2, ++ flagsRegCR0 cr0, flagsRegCR1 cr1) %{ ++ predicate(SpecialStringIndexOf); // type check implicit by parameter type, See Matcher::match_rule_supported ++ match(Set result (StrIndexOf (Binary haystack haycnt) (Binary (AddP needleImm offsetImm) needlecntImm))); ++ ++ effect(TEMP result, TEMP tmp1, TEMP tmp2, KILL cr0, KILL cr1); ++ ++ ins_cost(150); ++ format %{ "String IndexOf CSCL1 $haystack[0..$haycnt], $needleImm+$offsetImm[0..$needlecntImm]" ++ "-> $result \t// KILL $haycnt, $tmp1, $tmp2, $cr0, $cr1" %} ++ ++ ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ immPOper *needleOper = (immPOper *)$needleImm; ++ const TypeOopPtr *t = needleOper->type()->isa_oopptr(); ++ ciTypeArray* needle_values = t->const_oop()->as_type_array(); // Pointer to live char * ++ ++ __ string_indexof_1($result$$Register, ++ $haystack$$Register, $haycnt$$Register, ++ R0, needle_values->char_at(0), ++ $tmp1$$Register, $tmp2$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// String_IndexOf for needle of length 1. ++// ++// Special case requires less registers and emits less instructions. ++// ++// Assumes register result differs from all input registers. ++// ++// Preserves registers haystack, haycnt ++// Kills registers tmp1, tmp2, needle ++// Defines registers result ++// ++// Use dst register classes if register gets killed, as it is the case for tmp registers! ++instruct string_indexOf_imm1(iRegIdst result, iRegPsrc haystack, iRegIsrc haycnt, ++ rscratch2RegP needle, immI_1 needlecntImm, ++ iRegIdst tmp1, iRegIdst tmp2, ++ flagsRegCR0 cr0, flagsRegCR1 cr1) %{ ++ match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm))); ++ effect(USE_KILL needle, /* TDEF needle, */ TEMP result, ++ TEMP tmp1, TEMP tmp2); ++ // Required for EA: check if it is still a type_array. ++ predicate(SpecialStringIndexOf && n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop() && ++ n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop()->is_type_array()); ++ ins_cost(180); ++ ++ ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted. ++ ++ format %{ "String IndexOf SCL1 $haystack[0..$haycnt], $needle[0..$needlecntImm]" ++ " -> $result \t// KILL $haycnt, $needle, $tmp1, $tmp2, $cr0, $cr1" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ Node *ndl = in(operand_index($needle)); // The node that defines needle. ++ ciTypeArray* needle_values = ndl->bottom_type()->is_aryptr()->const_oop()->as_type_array(); ++ guarantee(needle_values, "sanity"); ++ if (needle_values != NULL) { ++ __ string_indexof_1($result$$Register, ++ $haystack$$Register, $haycnt$$Register, ++ R0, needle_values->char_at(0), ++ $tmp1$$Register, $tmp2$$Register); ++ } else { ++ __ string_indexof_1($result$$Register, ++ $haystack$$Register, $haycnt$$Register, ++ $needle$$Register, 0, ++ $tmp1$$Register, $tmp2$$Register); ++ } ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// String_IndexOf. ++// ++// Length of needle as immediate. This saves instruction loading constant needle ++// length. ++// @@@ TODO Specify rules for length < 8 or so, and roll out comparison of needle ++// completely or do it in vector instruction. This should save registers for ++// needlecnt and needle. ++// ++// Assumes register result differs from all input registers. ++// Overwrites haycnt, needlecnt. ++// Use dst register classes if register gets killed, as it is the case for tmp registers! ++instruct string_indexOf_imm(iRegIdst result, iRegPsrc haystack, rscratch1RegI haycnt, ++ iRegPsrc needle, uimmI15 needlecntImm, ++ iRegIdst tmp1, iRegIdst tmp2, iRegIdst tmp3, iRegIdst tmp4, iRegIdst tmp5, ++ flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6) %{ ++ match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm))); ++ effect(USE_KILL haycnt, /* better: TDEF haycnt, */ TEMP result, ++ TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP tmp5, KILL cr0, KILL cr1, KILL cr6); ++ // Required for EA: check if it is still a type_array. ++ predicate(SpecialStringIndexOf && n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop() && ++ n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop()->is_type_array()); ++ ins_cost(250); ++ ++ ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted. ++ ++ format %{ "String IndexOf SCL $haystack[0..$haycnt], $needle[0..$needlecntImm]" ++ " -> $result \t// KILL $haycnt, $tmp1, $tmp2, $tmp3, $tmp4, $tmp5, $cr0, $cr1" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ Node *ndl = in(operand_index($needle)); // The node that defines needle. ++ ciTypeArray* needle_values = ndl->bottom_type()->is_aryptr()->const_oop()->as_type_array(); ++ ++ __ string_indexof($result$$Register, ++ $haystack$$Register, $haycnt$$Register, ++ $needle$$Register, needle_values, $tmp5$$Register, $needlecntImm$$constant, ++ $tmp1$$Register, $tmp2$$Register, $tmp3$$Register, $tmp4$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// StrIndexOf node. ++// ++// Assumes register result differs from all input registers. ++// Overwrites haycnt, needlecnt. ++// Use dst register classes if register gets killed, as it is the case for tmp registers! ++instruct string_indexOf(iRegIdst result, iRegPsrc haystack, rscratch1RegI haycnt, iRegPsrc needle, rscratch2RegI needlecnt, ++ iRegLdst tmp1, iRegLdst tmp2, iRegLdst tmp3, iRegLdst tmp4, ++ flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6) %{ ++ match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt))); ++ effect(USE_KILL haycnt, USE_KILL needlecnt, /*better: TDEF haycnt, TDEF needlecnt,*/ ++ TEMP result, ++ TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr0, KILL cr1, KILL cr6); ++ predicate(SpecialStringIndexOf); // See Matcher::match_rule_supported. ++ ins_cost(300); ++ ++ ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted. ++ ++ format %{ "String IndexOf $haystack[0..$haycnt], $needle[0..$needlecnt]" ++ " -> $result \t// KILL $haycnt, $needlecnt, $tmp1, $tmp2, $tmp3, $tmp4, $cr0, $cr1" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ string_indexof($result$$Register, ++ $haystack$$Register, $haycnt$$Register, ++ $needle$$Register, NULL, $needlecnt$$Register, 0, // needlecnt not constant. ++ $tmp1$$Register, $tmp2$$Register, $tmp3$$Register, $tmp4$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// String equals with immediate. ++instruct string_equals_imm(iRegPsrc str1, iRegPsrc str2, uimmI15 cntImm, iRegIdst result, ++ iRegPdst tmp1, iRegPdst tmp2, ++ flagsRegCR0 cr0, flagsRegCR6 cr6, regCTR ctr) %{ ++ match(Set result (StrEquals (Binary str1 str2) cntImm)); ++ effect(TEMP result, TEMP tmp1, TEMP tmp2, ++ KILL cr0, KILL cr6, KILL ctr); ++ predicate(SpecialStringEquals); // See Matcher::match_rule_supported. ++ ins_cost(250); ++ ++ ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted. ++ ++ format %{ "String Equals SCL [0..$cntImm]($str1),[0..$cntImm]($str2)" ++ " -> $result \t// KILL $cr0, $cr6, $ctr, TEMP $result, $tmp1, $tmp2" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ char_arrays_equalsImm($str1$$Register, $str2$$Register, $cntImm$$constant, ++ $result$$Register, $tmp1$$Register, $tmp2$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// String equals. ++// Use dst register classes if register gets killed, as it is the case for TEMP operands! ++instruct string_equals(iRegPsrc str1, iRegPsrc str2, iRegIsrc cnt, iRegIdst result, ++ iRegPdst tmp1, iRegPdst tmp2, iRegPdst tmp3, iRegPdst tmp4, iRegPdst tmp5, ++ flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6, regCTR ctr) %{ ++ match(Set result (StrEquals (Binary str1 str2) cnt)); ++ effect(TEMP result, TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP tmp5, ++ KILL cr0, KILL cr1, KILL cr6, KILL ctr); ++ predicate(SpecialStringEquals); // See Matcher::match_rule_supported. ++ ins_cost(300); ++ ++ ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted. ++ ++ format %{ "String Equals [0..$cnt]($str1),[0..$cnt]($str2) -> $result" ++ " \t// KILL $cr0, $cr1, $cr6, $ctr, TEMP $result, $tmp1, $tmp2, $tmp3, $tmp4, $tmp5" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ char_arrays_equals($str1$$Register, $str2$$Register, $cnt$$Register, $result$$Register, ++ $tmp1$$Register, $tmp2$$Register, $tmp3$$Register, $tmp4$$Register, $tmp5$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++// String compare. ++// Char[] pointers are passed in. ++// Use dst register classes if register gets killed, as it is the case for TEMP operands! ++instruct string_compare(rarg1RegP str1, rarg2RegP str2, rarg3RegI cnt1, rarg4RegI cnt2, iRegIdst result, ++ iRegPdst tmp, flagsRegCR0 cr0, regCTR ctr) %{ ++ match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2))); ++ effect(USE_KILL cnt1, USE_KILL cnt2, USE_KILL str1, USE_KILL str2, TEMP result, TEMP tmp, KILL cr0, KILL ctr); ++ ins_cost(300); ++ ++ ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted. ++ ++ format %{ "String Compare $str1[0..$cnt1], $str2[0..$cnt2] -> $result" ++ " \t// TEMP $tmp, $result KILLs $str1, $cnt1, $str2, $cnt2, $cr0, $ctr" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ string_compare($str1$$Register, $str2$$Register, $cnt1$$Register, $cnt2$$Register, ++ $result$$Register, $tmp$$Register); ++ %} ++ ins_pipe(pipe_class_compare); ++%} ++ ++//---------- Min/Max Instructions --------------------------------------------- ++ ++instruct minI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (MinI src1 src2)); ++ ins_cost(DEFAULT_COST*6); ++ ++ expand %{ ++ iRegLdst src1s; ++ iRegLdst src2s; ++ iRegLdst diff; ++ iRegLdst sm; ++ iRegLdst doz; // difference or zero ++ convI2L_reg(src1s, src1); // Ensure proper sign extension. ++ convI2L_reg(src2s, src2); // Ensure proper sign extension. ++ subL_reg_reg(diff, src2s, src1s); ++ // Need to consider >=33 bit result, therefore we need signmaskL. ++ signmask64L_regL(sm, diff); ++ andL_reg_reg(doz, diff, sm); // <=0 ++ addI_regL_regL(dst, doz, src1s); ++ %} ++%} ++ ++instruct maxI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ++ match(Set dst (MaxI src1 src2)); ++ ins_cost(DEFAULT_COST*6); ++ ++ expand %{ ++ iRegLdst src1s; ++ iRegLdst src2s; ++ iRegLdst diff; ++ iRegLdst sm; ++ iRegLdst doz; // difference or zero ++ convI2L_reg(src1s, src1); // Ensure proper sign extension. ++ convI2L_reg(src2s, src2); // Ensure proper sign extension. ++ subL_reg_reg(diff, src2s, src1s); ++ // Need to consider >=33 bit result, therefore we need signmaskL. ++ signmask64L_regL(sm, diff); ++ andcL_reg_reg(doz, diff, sm); // >=0 ++ addI_regL_regL(dst, doz, src1s); ++ %} ++%} ++ ++//---------- Population Count Instructions ------------------------------------ ++ ++// Popcnt for Power7. ++instruct popCountI(iRegIdst dst, iRegIsrc src) %{ ++ match(Set dst (PopCountI src)); ++ predicate(UsePopCountInstruction && VM_Version::has_popcntw()); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "POPCNTW $dst, $src" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_popcntb); ++ __ popcntw($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Popcnt for Power7. ++instruct popCountL(iRegIdst dst, iRegLsrc src) %{ ++ predicate(UsePopCountInstruction && VM_Version::has_popcntw()); ++ match(Set dst (PopCountL src)); ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "POPCNTD $dst, $src" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_popcntb); ++ __ popcntd($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct countLeadingZerosI(iRegIdst dst, iRegIsrc src) %{ ++ match(Set dst (CountLeadingZerosI src)); ++ predicate(UseCountLeadingZerosInstructionsPPC64); // See Matcher::match_rule_supported. ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CNTLZW $dst, $src" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cntlzw); ++ __ cntlzw($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct countLeadingZerosL(iRegIdst dst, iRegLsrc src) %{ ++ match(Set dst (CountLeadingZerosL src)); ++ predicate(UseCountLeadingZerosInstructionsPPC64); // See Matcher::match_rule_supported. ++ ins_cost(DEFAULT_COST); ++ ++ format %{ "CNTLZD $dst, $src" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cntlzd); ++ __ cntlzd($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct countLeadingZerosP(iRegIdst dst, iRegPsrc src) %{ ++ // no match-rule, false predicate ++ effect(DEF dst, USE src); ++ predicate(false); ++ ++ format %{ "CNTLZD $dst, $src" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_cntlzd); ++ __ cntlzd($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct countTrailingZerosI_Ex(iRegIdst dst, iRegIsrc src) %{ ++ match(Set dst (CountTrailingZerosI src)); ++ predicate(UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ immI16 imm1 %{ (int)-1 %} ++ immI16 imm2 %{ (int)32 %} ++ immI_minus1 m1 %{ -1 %} ++ iRegIdst tmpI1; ++ iRegIdst tmpI2; ++ iRegIdst tmpI3; ++ addI_reg_imm16(tmpI1, src, imm1); ++ andcI_reg_reg(tmpI2, src, m1, tmpI1); ++ countLeadingZerosI(tmpI3, tmpI2); ++ subI_imm16_reg(dst, imm2, tmpI3); ++ %} ++%} ++ ++instruct countTrailingZerosL_Ex(iRegIdst dst, iRegLsrc src) %{ ++ match(Set dst (CountTrailingZerosL src)); ++ predicate(UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ immL16 imm1 %{ (long)-1 %} ++ immI16 imm2 %{ (int)64 %} ++ iRegLdst tmpL1; ++ iRegLdst tmpL2; ++ iRegIdst tmpL3; ++ addL_reg_imm16(tmpL1, src, imm1); ++ andcL_reg_reg(tmpL2, tmpL1, src); ++ countLeadingZerosL(tmpL3, tmpL2); ++ subI_imm16_reg(dst, imm2, tmpL3); ++ %} ++%} ++ ++// Expand nodes for byte_reverse_int. ++instruct insrwi_a(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{ ++ effect(DEF dst, USE src, USE pos, USE shift); ++ predicate(false); ++ ++ format %{ "INSRWI $dst, $src, $pos, $shift" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwimi); ++ __ insrwi($dst$$Register, $src$$Register, $shift$$constant, $pos$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// As insrwi_a, but with USE_DEF. ++instruct insrwi(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{ ++ effect(USE_DEF dst, USE src, USE pos, USE shift); ++ predicate(false); ++ ++ format %{ "INSRWI $dst, $src, $pos, $shift" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rlwimi); ++ __ insrwi($dst$$Register, $src$$Register, $shift$$constant, $pos$$constant); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Just slightly faster than java implementation. ++instruct bytes_reverse_int_Ex(iRegIdst dst, iRegIsrc src) %{ ++ match(Set dst (ReverseBytesI src)); ++ predicate(UseCountLeadingZerosInstructionsPPC64); ++ ins_cost(DEFAULT_COST); ++ ++ expand %{ ++ immI16 imm24 %{ (int) 24 %} ++ immI16 imm16 %{ (int) 16 %} ++ immI16 imm8 %{ (int) 8 %} ++ immI16 imm4 %{ (int) 4 %} ++ immI16 imm0 %{ (int) 0 %} ++ iRegLdst tmpI1; ++ iRegLdst tmpI2; ++ iRegLdst tmpI3; ++ ++ urShiftI_reg_imm(tmpI1, src, imm24); ++ insrwi_a(dst, tmpI1, imm24, imm8); ++ urShiftI_reg_imm(tmpI2, src, imm16); ++ insrwi(dst, tmpI2, imm8, imm16); ++ urShiftI_reg_imm(tmpI3, src, imm8); ++ insrwi(dst, tmpI3, imm8, imm8); ++ insrwi(dst, src, imm0, imm8); ++ %} ++%} ++ ++//---------- Replicate Vector Instructions ------------------------------------ ++ ++// Insrdi does replicate if src == dst. ++instruct repl32(iRegLdst dst) %{ ++ predicate(false); ++ effect(USE_DEF dst); ++ ++ format %{ "INSRDI $dst, #0, $dst, #32 \t// replicate" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldimi); ++ __ insrdi($dst$$Register, $dst$$Register, 32, 0); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Insrdi does replicate if src == dst. ++instruct repl48(iRegLdst dst) %{ ++ predicate(false); ++ effect(USE_DEF dst); ++ ++ format %{ "INSRDI $dst, #0, $dst, #48 \t// replicate" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldimi); ++ __ insrdi($dst$$Register, $dst$$Register, 48, 0); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Insrdi does replicate if src == dst. ++instruct repl56(iRegLdst dst) %{ ++ predicate(false); ++ effect(USE_DEF dst); ++ ++ format %{ "INSRDI $dst, #0, $dst, #56 \t// replicate" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_rldimi); ++ __ insrdi($dst$$Register, $dst$$Register, 56, 0); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct repl8B_reg_Ex(iRegLdst dst, iRegIsrc src) %{ ++ match(Set dst (ReplicateB src)); ++ predicate(n->as_Vector()->length() == 8); ++ expand %{ ++ moveReg(dst, src); ++ repl56(dst); ++ repl48(dst); ++ repl32(dst); ++ %} ++%} ++ ++instruct repl8B_immI0(iRegLdst dst, immI_0 zero) %{ ++ match(Set dst (ReplicateB zero)); ++ predicate(n->as_Vector()->length() == 8); ++ format %{ "LI $dst, #0 \t// replicate8B" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, (int)((short)($zero$$constant & 0xFFFF))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct repl8B_immIminus1(iRegLdst dst, immI_minus1 src) %{ ++ match(Set dst (ReplicateB src)); ++ predicate(n->as_Vector()->length() == 8); ++ format %{ "LI $dst, #-1 \t// replicate8B" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct repl4S_reg_Ex(iRegLdst dst, iRegIsrc src) %{ ++ match(Set dst (ReplicateS src)); ++ predicate(n->as_Vector()->length() == 4); ++ expand %{ ++ moveReg(dst, src); ++ repl48(dst); ++ repl32(dst); ++ %} ++%} ++ ++instruct repl4S_immI0(iRegLdst dst, immI_0 zero) %{ ++ match(Set dst (ReplicateS zero)); ++ predicate(n->as_Vector()->length() == 4); ++ format %{ "LI $dst, #0 \t// replicate4C" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, (int)((short)($zero$$constant & 0xFFFF))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct repl4S_immIminus1(iRegLdst dst, immI_minus1 src) %{ ++ match(Set dst (ReplicateS src)); ++ predicate(n->as_Vector()->length() == 4); ++ format %{ "LI $dst, -1 \t// replicate4C" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct repl2I_reg_Ex(iRegLdst dst, iRegIsrc src) %{ ++ match(Set dst (ReplicateI src)); ++ predicate(n->as_Vector()->length() == 2); ++ ins_cost(2 * DEFAULT_COST); ++ expand %{ ++ moveReg(dst, src); ++ repl32(dst); ++ %} ++%} ++ ++instruct repl2I_immI0(iRegLdst dst, immI_0 zero) %{ ++ match(Set dst (ReplicateI zero)); ++ predicate(n->as_Vector()->length() == 2); ++ format %{ "LI $dst, #0 \t// replicate4C" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, (int)((short)($zero$$constant & 0xFFFF))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct repl2I_immIminus1(iRegLdst dst, immI_minus1 src) %{ ++ match(Set dst (ReplicateI src)); ++ predicate(n->as_Vector()->length() == 2); ++ format %{ "LI $dst, -1 \t// replicate4C" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, (int)((short)($src$$constant & 0xFFFF))); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Move float to int register via stack, replicate. ++instruct repl2F_reg_Ex(iRegLdst dst, regF src) %{ ++ match(Set dst (ReplicateF src)); ++ predicate(n->as_Vector()->length() == 2); ++ ins_cost(2 * MEMORY_REF_COST + DEFAULT_COST); ++ expand %{ ++ stackSlotL tmpS; ++ iRegIdst tmpI; ++ moveF2I_reg_stack(tmpS, src); // Move float to stack. ++ moveF2I_stack_reg(tmpI, tmpS); // Move stack to int reg. ++ moveReg(dst, tmpI); // Move int to long reg. ++ repl32(dst); // Replicate bitpattern. ++ %} ++%} ++ ++// Replicate scalar constant to packed float values in Double register ++instruct repl2F_immF_Ex(iRegLdst dst, immF src) %{ ++ match(Set dst (ReplicateF src)); ++ predicate(n->as_Vector()->length() == 2); ++ ins_cost(5 * DEFAULT_COST); ++ ++ format %{ "LD $dst, offset, $constanttablebase\t// load replicated float $src $src from table, postalloc expanded" %} ++ postalloc_expand( postalloc_expand_load_replF_constant(dst, src, constanttablebase) ); ++%} ++ ++// Replicate scalar zero constant to packed float values in Double register ++instruct repl2F_immF0(iRegLdst dst, immF_0 zero) %{ ++ match(Set dst (ReplicateF zero)); ++ predicate(n->as_Vector()->length() == 2); ++ ++ format %{ "LI $dst, #0 \t// replicate2F" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_addi); ++ __ li($dst$$Register, 0x0); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// ============================================================================ ++// Safepoint Instruction ++ ++instruct safePoint_poll(iRegPdst poll) %{ ++ match(SafePoint poll); ++ predicate(LoadPollAddressFromThread); ++ ++ // It caused problems to add the effect that r0 is killed, but this ++ // effect no longer needs to be mentioned, since r0 is not contained ++ // in a reg_class. ++ ++ format %{ "LD R0, #0, $poll \t// Safepoint poll for GC" %} ++ size(4); ++ ins_encode( enc_poll(0x0, poll) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Safepoint without per-thread support. Load address of page to poll ++// as constant. ++// Rscratch2RegP is R12. ++// LoadConPollAddr node is added in pd_post_matching_hook(). It must be ++// a seperate node so that the oop map is at the right location. ++instruct safePoint_poll_conPollAddr(rscratch2RegP poll) %{ ++ match(SafePoint poll); ++ predicate(!LoadPollAddressFromThread); ++ ++ // It caused problems to add the effect that r0 is killed, but this ++ // effect no longer needs to be mentioned, since r0 is not contained ++ // in a reg_class. ++ ++ format %{ "LD R0, #0, R12 \t// Safepoint poll for GC" %} ++ ins_encode( enc_poll(0x0, poll) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// ============================================================================ ++// Call Instructions ++ ++// Call Java Static Instruction ++ ++// Schedulable version of call static node. ++instruct CallStaticJavaDirect(method meth) %{ ++ match(CallStaticJava); ++ effect(USE meth); ++ predicate(!((CallStaticJavaNode*)n)->is_method_handle_invoke()); ++ ins_cost(CALL_COST); ++ ++ ins_num_consts(3 /* up to 3 patchable constants: inline cache, 2 call targets. */); ++ ++ format %{ "CALL,static $meth \t// ==> " %} ++ size(4); ++ ins_encode( enc_java_static_call(meth) ); ++ ins_pipe(pipe_class_call); ++%} ++ ++// Schedulable version of call static node. ++instruct CallStaticJavaDirectHandle(method meth) %{ ++ match(CallStaticJava); ++ effect(USE meth); ++ predicate(((CallStaticJavaNode*)n)->is_method_handle_invoke()); ++ ins_cost(CALL_COST); ++ ++ ins_num_consts(3 /* up to 3 patchable constants: inline cache, 2 call targets. */); ++ ++ format %{ "CALL,static $meth \t// ==> " %} ++ ins_encode( enc_java_handle_call(meth) ); ++ ins_pipe(pipe_class_call); ++%} ++ ++// Call Java Dynamic Instruction ++ ++// Used by postalloc expand of CallDynamicJavaDirectSchedEx (actual call). ++// Loading of IC was postalloc expanded. The nodes loading the IC are reachable ++// via fields ins_field_load_ic_hi_node and ins_field_load_ic_node. ++// The call destination must still be placed in the constant pool. ++instruct CallDynamicJavaDirectSched(method meth) %{ ++ match(CallDynamicJava); // To get all the data fields we need ... ++ effect(USE meth); ++ predicate(false); // ... but never match. ++ ++ ins_field_load_ic_hi_node(loadConL_hiNode*); ++ ins_field_load_ic_node(loadConLNode*); ++ ins_num_consts(1 /* 1 patchable constant: call destination */); ++ ++ format %{ "BL \t// dynamic $meth ==> " %} ++ size(4); ++ ins_encode( enc_java_dynamic_call_sched(meth) ); ++ ins_pipe(pipe_class_call); ++%} ++ ++// Schedulable (i.e. postalloc expanded) version of call dynamic java. ++// We use postalloc expanded calls if we use inline caches ++// and do not update method data. ++// ++// This instruction has two constants: inline cache (IC) and call destination. ++// Loading the inline cache will be postalloc expanded, thus leaving a call with ++// one constant. ++instruct CallDynamicJavaDirectSched_Ex(method meth) %{ ++ match(CallDynamicJava); ++ effect(USE meth); ++ predicate(UseInlineCaches); ++ ins_cost(CALL_COST); ++ ++ ins_num_consts(2 /* 2 patchable constants: inline cache, call destination. */); ++ ++ format %{ "CALL,dynamic $meth \t// postalloc expanded" %} ++ postalloc_expand( postalloc_expand_java_dynamic_call_sched(meth, constanttablebase) ); ++%} ++ ++// Compound version of call dynamic java ++// We use postalloc expanded calls if we use inline caches ++// and do not update method data. ++instruct CallDynamicJavaDirect(method meth) %{ ++ match(CallDynamicJava); ++ effect(USE meth); ++ predicate(!UseInlineCaches); ++ ins_cost(CALL_COST); ++ ++ // Enc_java_to_runtime_call needs up to 4 constants (method data oop). ++ ins_num_consts(4); ++ ++ format %{ "CALL,dynamic $meth \t// ==> " %} ++ ins_encode( enc_java_dynamic_call(meth, constanttablebase) ); ++ ins_pipe(pipe_class_call); ++%} ++ ++// Call Runtime Instruction ++ ++instruct CallRuntimeDirect(method meth) %{ ++ match(CallRuntime); ++ effect(USE meth); ++ ins_cost(CALL_COST); ++ ++ // Enc_java_to_runtime_call needs up to 3 constants: call target, ++ // env for callee, C-toc. ++ ins_num_consts(3); ++ ++ format %{ "CALL,runtime" %} ++ ins_encode( enc_java_to_runtime_call(meth) ); ++ ins_pipe(pipe_class_call); ++%} ++ ++// Call Leaf ++ ++// Used by postalloc expand of CallLeafDirect_Ex (mtctr). ++instruct CallLeafDirect_mtctr(iRegLdst dst, iRegLsrc src) %{ ++ effect(DEF dst, USE src); ++ ++ ins_num_consts(1); ++ ++ format %{ "MTCTR $src" %} ++ size(4); ++ ins_encode( enc_leaf_call_mtctr(src) ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Used by postalloc expand of CallLeafDirect_Ex (actual call). ++instruct CallLeafDirect(method meth) %{ ++ match(CallLeaf); // To get the data all the data fields we need ... ++ effect(USE meth); ++ predicate(false); // but never match. ++ ++ format %{ "BCTRL \t// leaf call $meth ==> " %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_bctrl); ++ __ bctrl(); ++ %} ++ ins_pipe(pipe_class_call); ++%} ++ ++// postalloc expand of CallLeafDirect. ++// Load adress to call from TOC, then bl to it. ++instruct CallLeafDirect_Ex(method meth) %{ ++ match(CallLeaf); ++ effect(USE meth); ++ ins_cost(CALL_COST); ++ ++ // Postalloc_expand_java_to_runtime_call needs up to 3 constants: call target, ++ // env for callee, C-toc. ++ ins_num_consts(3); ++ ++ format %{ "CALL,runtime leaf $meth \t// postalloc expanded" %} ++ postalloc_expand( postalloc_expand_java_to_runtime_call(meth, constanttablebase) ); ++%} ++ ++// Call runtime without safepoint - same as CallLeaf. ++// postalloc expand of CallLeafNoFPDirect. ++// Load adress to call from TOC, then bl to it. ++instruct CallLeafNoFPDirect_Ex(method meth) %{ ++ match(CallLeafNoFP); ++ effect(USE meth); ++ ins_cost(CALL_COST); ++ ++ // Enc_java_to_runtime_call needs up to 3 constants: call target, ++ // env for callee, C-toc. ++ ins_num_consts(3); ++ ++ format %{ "CALL,runtime leaf nofp $meth \t// postalloc expanded" %} ++ postalloc_expand( postalloc_expand_java_to_runtime_call(meth, constanttablebase) ); ++%} ++ ++// Tail Call; Jump from runtime stub to Java code. ++// Also known as an 'interprocedural jump'. ++// Target of jump will eventually return to caller. ++// TailJump below removes the return address. ++instruct TailCalljmpInd(iRegPdstNoScratch jump_target, inline_cache_regP method_oop) %{ ++ match(TailCall jump_target method_oop); ++ ins_cost(CALL_COST); ++ ++ format %{ "MTCTR $jump_target \t// $method_oop holds method oop\n\t" ++ "BCTR \t// tail call" %} ++ size(8); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ mtctr($jump_target$$Register); ++ __ bctr(); ++ %} ++ ins_pipe(pipe_class_call); ++%} ++ ++// Return Instruction ++instruct Ret() %{ ++ match(Return); ++ format %{ "BLR \t// branch to link register" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_blr); ++ // LR is restored in MachEpilogNode. Just do the RET here. ++ __ blr(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Tail Jump; remove the return address; jump to target. ++// TailCall above leaves the return address around. ++// TailJump is used in only one place, the rethrow_Java stub (fancy_jump=2). ++// ex_oop (Exception Oop) is needed in %o0 at the jump. As there would be a ++// "restore" before this instruction (in Epilogue), we need to materialize it ++// in %i0. ++instruct tailjmpInd(iRegPdstNoScratch jump_target, rarg1RegP ex_oop) %{ ++ match(TailJump jump_target ex_oop); ++ ins_cost(CALL_COST); ++ ++ format %{ "LD R4_ARG2 = LR\n\t" ++ "MTCTR $jump_target\n\t" ++ "BCTR \t// TailJump, exception oop: $ex_oop" %} ++ size(12); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ __ ld(R4_ARG2/* issuing pc */, _abi(lr), R1_SP); ++ __ mtctr($jump_target$$Register); ++ __ bctr(); ++ %} ++ ins_pipe(pipe_class_call); ++%} ++ ++// Create exception oop: created by stack-crawling runtime code. ++// Created exception is now available to this handler, and is setup ++// just prior to jumping to this handler. No code emitted. ++instruct CreateException(rarg1RegP ex_oop) %{ ++ match(Set ex_oop (CreateEx)); ++ ins_cost(0); ++ ++ format %{ " -- \t// exception oop; no code emitted" %} ++ size(0); ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_default); ++%} ++ ++// Rethrow exception: The exception oop will come in the first ++// argument position. Then JUMP (not call) to the rethrow stub code. ++instruct RethrowException() %{ ++ match(Rethrow); ++ ins_cost(CALL_COST); ++ ++ format %{ "Jmp rethrow_stub" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_compound); ++ cbuf.set_insts_mark(); ++ __ b64_patchable((address)OptoRuntime::rethrow_stub(), relocInfo::runtime_call_type); ++ %} ++ ins_pipe(pipe_class_call); ++%} ++ ++// Die now. ++instruct ShouldNotReachHere() %{ ++ match(Halt); ++ ins_cost(CALL_COST); ++ ++ format %{ "ShouldNotReachHere" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_tdi); ++ __ trap_should_not_reach_here(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// This name is KNOWN by the ADLC and cannot be changed. The ADLC ++// forces a 'TypeRawPtr::BOTTOM' output type for this guy. ++// Get a DEF on threadRegP, no costs, no encoding, use ++// 'ins_should_rematerialize(true)' to avoid spilling. ++instruct tlsLoadP(threadRegP dst) %{ ++ match(Set dst (ThreadLocal)); ++ ins_cost(0); ++ ++ ins_should_rematerialize(true); ++ ++ format %{ " -- \t// $dst=Thread::current(), empty" %} ++ size(0); ++ ins_encode( /*empty*/ ); ++ ins_pipe(pipe_class_empty); ++%} ++ ++//---Some PPC specific nodes--------------------------------------------------- ++ ++// Stop a group. ++instruct endGroup() %{ ++ ins_cost(0); ++ ++ ins_is_nop(true); ++ ++ format %{ "End Bundle (ori r1, r1, 0)" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_endgroup); ++ __ endgroup(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++// Nop instructions ++ ++instruct fxNop() %{ ++ ins_cost(0); ++ ++ ins_is_nop(true); ++ ++ format %{ "fxNop" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fmr); ++ __ nop(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct fpNop0() %{ ++ ins_cost(0); ++ ++ ins_is_nop(true); ++ ++ format %{ "fpNop0" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fmr); ++ __ fpnop0(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct fpNop1() %{ ++ ins_cost(0); ++ ++ ins_is_nop(true); ++ ++ format %{ "fpNop1" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_fmr); ++ __ fpnop1(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct brNop0() %{ ++ ins_cost(0); ++ size(4); ++ format %{ "brNop0" %} ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_mcrf); ++ __ brnop0(); ++ %} ++ ins_is_nop(true); ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct brNop1() %{ ++ ins_cost(0); ++ ++ ins_is_nop(true); ++ ++ format %{ "brNop1" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_mcrf); ++ __ brnop1(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++instruct brNop2() %{ ++ ins_cost(0); ++ ++ ins_is_nop(true); ++ ++ format %{ "brNop2" %} ++ size(4); ++ ins_encode %{ ++ // TODO: PPC port $archOpcode(ppc64Opcode_mcrf); ++ __ brnop2(); ++ %} ++ ins_pipe(pipe_class_default); ++%} ++ ++//----------PEEPHOLE RULES----------------------------------------------------- ++// These must follow all instruction definitions as they use the names ++// defined in the instructions definitions. ++// ++// peepmatch ( root_instr_name [preceeding_instruction]* ); ++// ++// peepconstraint %{ ++// (instruction_number.operand_name relational_op instruction_number.operand_name ++// [, ...] ); ++// // instruction numbers are zero-based using left to right order in peepmatch ++// ++// peepreplace ( instr_name ( [instruction_number.operand_name]* ) ); ++// // provide an instruction_number.operand_name for each operand that appears ++// // in the replacement instruction's match rule ++// ++// ---------VM FLAGS--------------------------------------------------------- ++// ++// All peephole optimizations can be turned off using -XX:-OptoPeephole ++// ++// Each peephole rule is given an identifying number starting with zero and ++// increasing by one in the order seen by the parser. An individual peephole ++// can be enabled, and all others disabled, by using -XX:OptoPeepholeAt=# ++// on the command-line. ++// ++// ---------CURRENT LIMITATIONS---------------------------------------------- ++// ++// Only match adjacent instructions in same basic block ++// Only equality constraints ++// Only constraints between operands, not (0.dest_reg == EAX_enc) ++// Only one replacement instruction ++// ++// ---------EXAMPLE---------------------------------------------------------- ++// ++// // pertinent parts of existing instructions in architecture description ++// instruct movI(eRegI dst, eRegI src) %{ ++// match(Set dst (CopyI src)); ++// %} ++// ++// instruct incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{ ++// match(Set dst (AddI dst src)); ++// effect(KILL cr); ++// %} ++// ++// // Change (inc mov) to lea ++// peephole %{ ++// // increment preceeded by register-register move ++// peepmatch ( incI_eReg movI ); ++// // require that the destination register of the increment ++// // match the destination register of the move ++// peepconstraint ( 0.dst == 1.dst ); ++// // construct a replacement instruction that sets ++// // the destination to ( move's source register + one ) ++// peepreplace ( leaI_eReg_immI( 0.dst 1.src 0.src ) ); ++// %} ++// ++// Implementation no longer uses movX instructions since ++// machine-independent system no longer uses CopyX nodes. ++// ++// peephole %{ ++// peepmatch ( incI_eReg movI ); ++// peepconstraint ( 0.dst == 1.dst ); ++// peepreplace ( leaI_eReg_immI( 0.dst 1.src 0.src ) ); ++// %} ++// ++// peephole %{ ++// peepmatch ( decI_eReg movI ); ++// peepconstraint ( 0.dst == 1.dst ); ++// peepreplace ( leaI_eReg_immI( 0.dst 1.src 0.src ) ); ++// %} ++// ++// peephole %{ ++// peepmatch ( addI_eReg_imm movI ); ++// peepconstraint ( 0.dst == 1.dst ); ++// peepreplace ( leaI_eReg_immI( 0.dst 1.src 0.src ) ); ++// %} ++// ++// peephole %{ ++// peepmatch ( addP_eReg_imm movP ); ++// peepconstraint ( 0.dst == 1.dst ); ++// peepreplace ( leaP_eReg_immI( 0.dst 1.src 0.src ) ); ++// %} ++ ++// // Change load of spilled value to only a spill ++// instruct storeI(memory mem, eRegI src) %{ ++// match(Set mem (StoreI mem src)); ++// %} ++// ++// instruct loadI(eRegI dst, memory mem) %{ ++// match(Set dst (LoadI mem)); ++// %} ++// ++peephole %{ ++ peepmatch ( loadI storeI ); ++ peepconstraint ( 1.src == 0.dst, 1.mem == 0.mem ); ++ peepreplace ( storeI( 1.mem 1.mem 1.src ) ); ++%} ++ ++peephole %{ ++ peepmatch ( loadL storeL ); ++ peepconstraint ( 1.src == 0.dst, 1.mem == 0.mem ); ++ peepreplace ( storeL( 1.mem 1.mem 1.src ) ); ++%} ++ ++peephole %{ ++ peepmatch ( loadP storeP ); ++ peepconstraint ( 1.src == 0.dst, 1.dst == 0.mem ); ++ peepreplace ( storeP( 1.dst 1.dst 1.src ) ); ++%} ++ ++//----------SMARTSPILL RULES--------------------------------------------------- ++// These must follow all instruction definitions as they use the names ++// defined in the instructions definitions. +--- ./hotspot/src/cpu/ppc/vm/ppc_64.ad Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/ppc_64.ad Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,24 @@ ++// ++// Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. ++// Copyright 2012, 2013 SAP AG. All rights reserved. ++// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++// ++// 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. ++// ++// +--- ./hotspot/src/cpu/ppc/vm/registerMap_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/registerMap_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_REGISTERMAP_PPC_HPP ++#define CPU_PPC_VM_REGISTERMAP_PPC_HPP ++ ++// machine-dependent implemention for register maps ++ friend class frame; ++ ++ private: ++ // This is the hook for finding a register in an "well-known" location, ++ // such as a register block of a predetermined format. ++ // Since there is none, we just return NULL. ++ // See registerMap_sparc.hpp for an example of grabbing registers ++ // from register save areas of a standard layout. ++ address pd_location(VMReg reg) const { return NULL; } ++ ++ // no PD state to clear or copy: ++ void pd_clear() {} ++ void pd_initialize() {} ++ void pd_initialize_from(const RegisterMap* map) {} ++ ++#endif // CPU_PPC_VM_REGISTERMAP_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/register_definitions_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/register_definitions_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,42 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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. ++ * ++ */ ++ ++// make sure the defines don't screw up the declarations later on in this file ++#define DONT_USE_REGISTER_DEFINES ++ ++#include "precompiled.hpp" ++#include "asm/macroAssembler.hpp" ++#include "asm/register.hpp" ++#include "register_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "interp_masm_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "interp_masm_ppc_64.hpp" ++#endif ++ ++REGISTER_DEFINITION(Register, noreg); ++ ++REGISTER_DEFINITION(FloatRegister, fnoreg); +--- ./hotspot/src/cpu/ppc/vm/register_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/register_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,77 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "register_ppc.hpp" ++ ++const int ConcreteRegisterImpl::max_gpr = RegisterImpl::number_of_registers * 2; ++const int ConcreteRegisterImpl::max_fpr = ConcreteRegisterImpl::max_gpr + ++ FloatRegisterImpl::number_of_registers * 2; ++const int ConcreteRegisterImpl::max_cnd = ConcreteRegisterImpl::max_fpr + ++ ConditionRegisterImpl::number_of_registers; ++ ++const char* RegisterImpl::name() const { ++ const char* names[number_of_registers] = { ++ "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", ++ "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15", ++ "R16", "R17", "R18", "R19", "R20", "R21", "R22", "R23", ++ "R24", "R25", "R26", "R27", "R28", "R29", "R30", "R31" ++ }; ++ return is_valid() ? names[encoding()] : "noreg"; ++} ++ ++const char* ConditionRegisterImpl::name() const { ++ const char* names[number_of_registers] = { ++ "CR0", "CR1", "CR2", "CR3", "CR4", "CR5", "CR6", "CR7" ++ }; ++ return is_valid() ? names[encoding()] : "cnoreg"; ++} ++ ++const char* FloatRegisterImpl::name() const { ++ const char* names[number_of_registers] = { ++ "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", ++ "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", ++ "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", ++ "F24", "F25", "F26", "F27", "F28", "F29", "F30", "F31" ++ }; ++ return is_valid() ? names[encoding()] : "fnoreg"; ++} ++ ++const char* SpecialRegisterImpl::name() const { ++ const char* names[number_of_registers] = { ++ "SR_XER", "SR_LR", "SR_CTR", "SR_VRSAVE", "SR_SPEFSCR", "SR_PPR" ++ }; ++ return is_valid() ? names[encoding()] : "snoreg"; ++} ++ ++const char* VectorRegisterImpl::name() const { ++ const char* names[number_of_registers] = { ++ "VR0", "VR1", "VR2", "VR3", "VR4", "VR5", "VR6", "VR7", ++ "VR8", "VR9", "VR10", "VR11", "VR12", "VR13", "VR14", "VR15", ++ "VR16", "VR17", "VR18", "VR19", "VR20", "VR21", "VR22", "VR23", ++ "VR24", "VR25", "VR26", "VR27", "VR28", "VR29", "VR30", "VR31" ++ }; ++ return is_valid() ? names[encoding()] : "vnoreg"; ++} +--- ./hotspot/src/cpu/ppc/vm/register_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/register_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,663 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_REGISTER_PPC_HPP ++#define CPU_PPC_VM_REGISTER_PPC_HPP ++ ++#include "asm/register.hpp" ++#include "vm_version_ppc.hpp" ++ ++// forward declaration ++class Address; ++class VMRegImpl; ++typedef VMRegImpl* VMReg; ++ ++// PPC64 registers ++// ++// See "64-bit PowerPC ELF ABI Supplement 1.7", IBM Corp. (2003-10-29). ++// (http://math-atlas.sourceforge.net/devel/assembly/PPC-elf64abi-1.7.pdf) ++// ++// r0 Register used in function prologs (volatile) ++// r1 Stack pointer (nonvolatile) ++// r2 TOC pointer (volatile) ++// r3 Parameter and return value (volatile) ++// r4-r10 Function parameters (volatile) ++// r11 Register used in calls by pointer and as an environment pointer for languages which require one (volatile) ++// r12 Register used for exception handling and glink code (volatile) ++// r13 Reserved for use as system thread ID ++// r14-r31 Local variables (nonvolatile) ++// ++// f0 Scratch register (volatile) ++// f1-f4 Floating point parameters and return value (volatile) ++// f5-f13 Floating point parameters (volatile) ++// f14-f31 Floating point values (nonvolatile) ++// ++// LR Link register for return address (volatile) ++// CTR Loop counter (volatile) ++// XER Fixed point exception register (volatile) ++// FPSCR Floating point status and control register (volatile) ++// ++// CR0-CR1 Condition code fields (volatile) ++// CR2-CR4 Condition code fields (nonvolatile) ++// CR5-CR7 Condition code fields (volatile) ++// ++// ---------------------------------------------- ++// On processors with the VMX feature: ++// v0-v1 Volatile scratch registers ++// v2-v13 Volatile vector parameters registers ++// v14-v19 Volatile scratch registers ++// v20-v31 Non-volatile registers ++// vrsave Non-volatile 32-bit register ++ ++ ++// Use Register as shortcut ++class RegisterImpl; ++typedef RegisterImpl* Register; ++ ++inline Register as_Register(int encoding) { ++ assert(encoding >= 0 && encoding < 32, "bad register encoding"); ++ return (Register)(intptr_t)encoding; ++} ++ ++// The implementation of integer registers for the Power architecture ++class RegisterImpl: public AbstractRegisterImpl { ++ public: ++ enum { ++ number_of_registers = 32 ++ }; ++ ++ // general construction ++ inline friend Register as_Register(int encoding); ++ ++ // accessors ++ int encoding() const { assert(is_valid(), "invalid register"); return value(); } ++ VMReg as_VMReg(); ++ Register successor() const { return as_Register(encoding() + 1); } ++ ++ // testers ++ bool is_valid() const { return ( 0 <= (value()&0x7F) && (value()&0x7F) < number_of_registers); } ++ bool is_volatile() const { return ( 0 <= (value()&0x7F) && (value()&0x7F) <= 13 ); } ++ bool is_nonvolatile() const { return (14 <= (value()&0x7F) && (value()&0x7F) <= 31 ); } ++ ++ const char* name() const; ++}; ++ ++// The integer registers of the PPC architecture ++CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1)); ++ ++CONSTANT_REGISTER_DECLARATION(Register, R0, (0)); ++CONSTANT_REGISTER_DECLARATION(Register, R1, (1)); ++CONSTANT_REGISTER_DECLARATION(Register, R2, (2)); ++CONSTANT_REGISTER_DECLARATION(Register, R3, (3)); ++CONSTANT_REGISTER_DECLARATION(Register, R4, (4)); ++CONSTANT_REGISTER_DECLARATION(Register, R5, (5)); ++CONSTANT_REGISTER_DECLARATION(Register, R6, (6)); ++CONSTANT_REGISTER_DECLARATION(Register, R7, (7)); ++CONSTANT_REGISTER_DECLARATION(Register, R8, (8)); ++CONSTANT_REGISTER_DECLARATION(Register, R9, (9)); ++CONSTANT_REGISTER_DECLARATION(Register, R10, (10)); ++CONSTANT_REGISTER_DECLARATION(Register, R11, (11)); ++CONSTANT_REGISTER_DECLARATION(Register, R12, (12)); ++CONSTANT_REGISTER_DECLARATION(Register, R13, (13)); ++CONSTANT_REGISTER_DECLARATION(Register, R14, (14)); ++CONSTANT_REGISTER_DECLARATION(Register, R15, (15)); ++CONSTANT_REGISTER_DECLARATION(Register, R16, (16)); ++CONSTANT_REGISTER_DECLARATION(Register, R17, (17)); ++CONSTANT_REGISTER_DECLARATION(Register, R18, (18)); ++CONSTANT_REGISTER_DECLARATION(Register, R19, (19)); ++CONSTANT_REGISTER_DECLARATION(Register, R20, (20)); ++CONSTANT_REGISTER_DECLARATION(Register, R21, (21)); ++CONSTANT_REGISTER_DECLARATION(Register, R22, (22)); ++CONSTANT_REGISTER_DECLARATION(Register, R23, (23)); ++CONSTANT_REGISTER_DECLARATION(Register, R24, (24)); ++CONSTANT_REGISTER_DECLARATION(Register, R25, (25)); ++CONSTANT_REGISTER_DECLARATION(Register, R26, (26)); ++CONSTANT_REGISTER_DECLARATION(Register, R27, (27)); ++CONSTANT_REGISTER_DECLARATION(Register, R28, (28)); ++CONSTANT_REGISTER_DECLARATION(Register, R29, (29)); ++CONSTANT_REGISTER_DECLARATION(Register, R30, (30)); ++CONSTANT_REGISTER_DECLARATION(Register, R31, (31)); ++ ++ ++// ++// Because Power has many registers, #define'ing values for them is ++// beneficial in code size and is worth the cost of some of the ++// dangers of defines. If a particular file has a problem with these ++// defines then it's possible to turn them off in that file by ++// defining DONT_USE_REGISTER_DEFINES. Register_definition_ppc.cpp ++// does that so that it's able to provide real definitions of these ++// registers for use in debuggers and such. ++// ++ ++#ifndef DONT_USE_REGISTER_DEFINES ++#define noreg ((Register)(noreg_RegisterEnumValue)) ++ ++#define R0 ((Register)(R0_RegisterEnumValue)) ++#define R1 ((Register)(R1_RegisterEnumValue)) ++#define R2 ((Register)(R2_RegisterEnumValue)) ++#define R3 ((Register)(R3_RegisterEnumValue)) ++#define R4 ((Register)(R4_RegisterEnumValue)) ++#define R5 ((Register)(R5_RegisterEnumValue)) ++#define R6 ((Register)(R6_RegisterEnumValue)) ++#define R7 ((Register)(R7_RegisterEnumValue)) ++#define R8 ((Register)(R8_RegisterEnumValue)) ++#define R9 ((Register)(R9_RegisterEnumValue)) ++#define R10 ((Register)(R10_RegisterEnumValue)) ++#define R11 ((Register)(R11_RegisterEnumValue)) ++#define R12 ((Register)(R12_RegisterEnumValue)) ++#define R13 ((Register)(R13_RegisterEnumValue)) ++#define R14 ((Register)(R14_RegisterEnumValue)) ++#define R15 ((Register)(R15_RegisterEnumValue)) ++#define R16 ((Register)(R16_RegisterEnumValue)) ++#define R17 ((Register)(R17_RegisterEnumValue)) ++#define R18 ((Register)(R18_RegisterEnumValue)) ++#define R19 ((Register)(R19_RegisterEnumValue)) ++#define R20 ((Register)(R20_RegisterEnumValue)) ++#define R21 ((Register)(R21_RegisterEnumValue)) ++#define R22 ((Register)(R22_RegisterEnumValue)) ++#define R23 ((Register)(R23_RegisterEnumValue)) ++#define R24 ((Register)(R24_RegisterEnumValue)) ++#define R25 ((Register)(R25_RegisterEnumValue)) ++#define R26 ((Register)(R26_RegisterEnumValue)) ++#define R27 ((Register)(R27_RegisterEnumValue)) ++#define R28 ((Register)(R28_RegisterEnumValue)) ++#define R29 ((Register)(R29_RegisterEnumValue)) ++#define R30 ((Register)(R30_RegisterEnumValue)) ++#define R31 ((Register)(R31_RegisterEnumValue)) ++#endif ++ ++// Use ConditionRegister as shortcut ++class ConditionRegisterImpl; ++typedef ConditionRegisterImpl* ConditionRegister; ++ ++inline ConditionRegister as_ConditionRegister(int encoding) { ++ assert(encoding >= 0 && encoding < 8, "bad condition register encoding"); ++ return (ConditionRegister)(intptr_t)encoding; ++} ++ ++// The implementation of condition register(s) for the PPC architecture ++class ConditionRegisterImpl: public AbstractRegisterImpl { ++ public: ++ enum { ++ number_of_registers = 8 ++ }; ++ ++ // construction. ++ inline friend ConditionRegister as_ConditionRegister(int encoding); ++ ++ // accessors ++ int encoding() const { assert(is_valid(), "invalid register"); return value(); } ++ VMReg as_VMReg(); ++ ++ // testers ++ bool is_valid() const { return (0 <= value() && value() < number_of_registers); } ++ bool is_nonvolatile() const { return (2 <= (value()&0x7F) && (value()&0x7F) <= 4 ); } ++ ++ const char* name() const; ++}; ++ ++// The (parts of the) condition register(s) of the PPC architecture ++// sys/ioctl.h on AIX defines CR0-CR3, so I name these CCR. ++CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR0, (0)); ++CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR1, (1)); ++CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR2, (2)); ++CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR3, (3)); ++CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR4, (4)); ++CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR5, (5)); ++CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR6, (6)); ++CONSTANT_REGISTER_DECLARATION(ConditionRegister, CCR7, (7)); ++ ++#ifndef DONT_USE_REGISTER_DEFINES ++ ++#define CCR0 ((ConditionRegister)(CCR0_ConditionRegisterEnumValue)) ++#define CCR1 ((ConditionRegister)(CCR1_ConditionRegisterEnumValue)) ++#define CCR2 ((ConditionRegister)(CCR2_ConditionRegisterEnumValue)) ++#define CCR3 ((ConditionRegister)(CCR3_ConditionRegisterEnumValue)) ++#define CCR4 ((ConditionRegister)(CCR4_ConditionRegisterEnumValue)) ++#define CCR5 ((ConditionRegister)(CCR5_ConditionRegisterEnumValue)) ++#define CCR6 ((ConditionRegister)(CCR6_ConditionRegisterEnumValue)) ++#define CCR7 ((ConditionRegister)(CCR7_ConditionRegisterEnumValue)) ++ ++#endif // DONT_USE_REGISTER_DEFINES ++ ++ ++// Use FloatRegister as shortcut ++class FloatRegisterImpl; ++typedef FloatRegisterImpl* FloatRegister; ++ ++inline FloatRegister as_FloatRegister(int encoding) { ++ assert(encoding >= 0 && encoding < 32, "bad float register encoding"); ++ return (FloatRegister)(intptr_t)encoding; ++} ++ ++// The implementation of float registers for the PPC architecture ++class FloatRegisterImpl: public AbstractRegisterImpl { ++ public: ++ enum { ++ number_of_registers = 32 ++ }; ++ ++ // construction ++ inline friend FloatRegister as_FloatRegister(int encoding); ++ ++ // accessors ++ int encoding() const { assert(is_valid(), "invalid register"); return value(); } ++ VMReg as_VMReg(); ++ FloatRegister successor() const { return as_FloatRegister(encoding() + 1); } ++ ++ // testers ++ bool is_valid() const { return (0 <= value() && value() < number_of_registers); } ++ ++ const char* name() const; ++}; ++ ++// The float registers of the PPC architecture ++CONSTANT_REGISTER_DECLARATION(FloatRegister, fnoreg, (-1)); ++ ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F0, ( 0)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F1, ( 1)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F2, ( 2)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F3, ( 3)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F4, ( 4)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F5, ( 5)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F6, ( 6)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F7, ( 7)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F8, ( 8)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F9, ( 9)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F10, (10)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F11, (11)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F12, (12)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F13, (13)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F14, (14)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F15, (15)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F16, (16)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F17, (17)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F18, (18)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F19, (19)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F20, (20)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F21, (21)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F22, (22)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F23, (23)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F24, (24)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F25, (25)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F26, (26)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F27, (27)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F28, (28)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F29, (29)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F30, (30)); ++CONSTANT_REGISTER_DECLARATION(FloatRegister, F31, (31)); ++ ++#ifndef DONT_USE_REGISTER_DEFINES ++#define fnoreg ((FloatRegister)(fnoreg_FloatRegisterEnumValue)) ++#define F0 ((FloatRegister)( F0_FloatRegisterEnumValue)) ++#define F1 ((FloatRegister)( F1_FloatRegisterEnumValue)) ++#define F2 ((FloatRegister)( F2_FloatRegisterEnumValue)) ++#define F3 ((FloatRegister)( F3_FloatRegisterEnumValue)) ++#define F4 ((FloatRegister)( F4_FloatRegisterEnumValue)) ++#define F5 ((FloatRegister)( F5_FloatRegisterEnumValue)) ++#define F6 ((FloatRegister)( F6_FloatRegisterEnumValue)) ++#define F7 ((FloatRegister)( F7_FloatRegisterEnumValue)) ++#define F8 ((FloatRegister)( F8_FloatRegisterEnumValue)) ++#define F9 ((FloatRegister)( F9_FloatRegisterEnumValue)) ++#define F10 ((FloatRegister)( F10_FloatRegisterEnumValue)) ++#define F11 ((FloatRegister)( F11_FloatRegisterEnumValue)) ++#define F12 ((FloatRegister)( F12_FloatRegisterEnumValue)) ++#define F13 ((FloatRegister)( F13_FloatRegisterEnumValue)) ++#define F14 ((FloatRegister)( F14_FloatRegisterEnumValue)) ++#define F15 ((FloatRegister)( F15_FloatRegisterEnumValue)) ++#define F16 ((FloatRegister)( F16_FloatRegisterEnumValue)) ++#define F17 ((FloatRegister)( F17_FloatRegisterEnumValue)) ++#define F18 ((FloatRegister)( F18_FloatRegisterEnumValue)) ++#define F19 ((FloatRegister)( F19_FloatRegisterEnumValue)) ++#define F20 ((FloatRegister)( F20_FloatRegisterEnumValue)) ++#define F21 ((FloatRegister)( F21_FloatRegisterEnumValue)) ++#define F22 ((FloatRegister)( F22_FloatRegisterEnumValue)) ++#define F23 ((FloatRegister)( F23_FloatRegisterEnumValue)) ++#define F24 ((FloatRegister)( F24_FloatRegisterEnumValue)) ++#define F25 ((FloatRegister)( F25_FloatRegisterEnumValue)) ++#define F26 ((FloatRegister)( F26_FloatRegisterEnumValue)) ++#define F27 ((FloatRegister)( F27_FloatRegisterEnumValue)) ++#define F28 ((FloatRegister)( F28_FloatRegisterEnumValue)) ++#define F29 ((FloatRegister)( F29_FloatRegisterEnumValue)) ++#define F30 ((FloatRegister)( F30_FloatRegisterEnumValue)) ++#define F31 ((FloatRegister)( F31_FloatRegisterEnumValue)) ++#endif // DONT_USE_REGISTER_DEFINES ++ ++// Use SpecialRegister as shortcut ++class SpecialRegisterImpl; ++typedef SpecialRegisterImpl* SpecialRegister; ++ ++inline SpecialRegister as_SpecialRegister(int encoding) { ++ return (SpecialRegister)(intptr_t)encoding; ++} ++ ++// The implementation of special registers for the Power architecture (LR, CTR and friends) ++class SpecialRegisterImpl: public AbstractRegisterImpl { ++ public: ++ enum { ++ number_of_registers = 6 ++ }; ++ ++ // construction ++ inline friend SpecialRegister as_SpecialRegister(int encoding); ++ ++ // accessors ++ int encoding() const { assert(is_valid(), "invalid register"); return value(); } ++ VMReg as_VMReg(); ++ ++ // testers ++ bool is_valid() const { return 0 <= value() && value() < number_of_registers; } ++ ++ const char* name() const; ++}; ++ ++// The special registers of the PPC architecture ++CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_XER, (0)); ++CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_LR, (1)); ++CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_CTR, (2)); ++CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_VRSAVE, (3)); ++CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_SPEFSCR, (4)); ++CONSTANT_REGISTER_DECLARATION(SpecialRegister, SR_PPR, (5)); ++ ++#ifndef DONT_USE_REGISTER_DEFINES ++#define SR_XER ((SpecialRegister)(SR_XER_SpecialRegisterEnumValue)) ++#define SR_LR ((SpecialRegister)(SR_LR_SpecialRegisterEnumValue)) ++#define SR_CTR ((SpecialRegister)(SR_CTR_SpecialRegisterEnumValue)) ++#define SR_VRSAVE ((SpecialRegister)(SR_VRSAVE_SpecialRegisterEnumValue)) ++#define SR_SPEFSCR ((SpecialRegister)(SR_SPEFSCR_SpecialRegisterEnumValue)) ++#define SR_PPR ((SpecialRegister)(SR_PPR_SpecialRegisterEnumValue)) ++#endif // DONT_USE_REGISTER_DEFINES ++ ++ ++// Use VectorRegister as shortcut ++class VectorRegisterImpl; ++typedef VectorRegisterImpl* VectorRegister; ++ ++inline VectorRegister as_VectorRegister(int encoding) { ++ return (VectorRegister)(intptr_t)encoding; ++} ++ ++// The implementation of vector registers for the Power architecture ++class VectorRegisterImpl: public AbstractRegisterImpl { ++ public: ++ enum { ++ number_of_registers = 32 ++ }; ++ ++ // construction ++ inline friend VectorRegister as_VectorRegister(int encoding); ++ ++ // accessors ++ int encoding() const { assert(is_valid(), "invalid register"); return value(); } ++ ++ // testers ++ bool is_valid() const { return 0 <= value() && value() < number_of_registers; } ++ ++ const char* name() const; ++}; ++ ++// The Vector registers of the Power architecture ++ ++CONSTANT_REGISTER_DECLARATION(VectorRegister, vnoreg, (-1)); ++ ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR0, ( 0)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR1, ( 1)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR2, ( 2)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR3, ( 3)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR4, ( 4)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR5, ( 5)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR6, ( 6)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR7, ( 7)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR8, ( 8)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR9, ( 9)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR10, (10)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR11, (11)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR12, (12)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR13, (13)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR14, (14)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR15, (15)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR16, (16)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR17, (17)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR18, (18)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR19, (19)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR20, (20)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR21, (21)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR22, (22)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR23, (23)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR24, (24)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR25, (25)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR26, (26)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR27, (27)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR28, (28)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR29, (29)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR30, (30)); ++CONSTANT_REGISTER_DECLARATION(VectorRegister, VR31, (31)); ++ ++#ifndef DONT_USE_REGISTER_DEFINES ++#define vnoreg ((VectorRegister)(vnoreg_VectorRegisterEnumValue)) ++#define VR0 ((VectorRegister)( VR0_VectorRegisterEnumValue)) ++#define VR1 ((VectorRegister)( VR1_VectorRegisterEnumValue)) ++#define VR2 ((VectorRegister)( VR2_VectorRegisterEnumValue)) ++#define VR3 ((VectorRegister)( VR3_VectorRegisterEnumValue)) ++#define VR4 ((VectorRegister)( VR4_VectorRegisterEnumValue)) ++#define VR5 ((VectorRegister)( VR5_VectorRegisterEnumValue)) ++#define VR6 ((VectorRegister)( VR6_VectorRegisterEnumValue)) ++#define VR7 ((VectorRegister)( VR7_VectorRegisterEnumValue)) ++#define VR8 ((VectorRegister)( VR8_VectorRegisterEnumValue)) ++#define VR9 ((VectorRegister)( VR9_VectorRegisterEnumValue)) ++#define VR10 ((VectorRegister)( VR10_VectorRegisterEnumValue)) ++#define VR11 ((VectorRegister)( VR11_VectorRegisterEnumValue)) ++#define VR12 ((VectorRegister)( VR12_VectorRegisterEnumValue)) ++#define VR13 ((VectorRegister)( VR13_VectorRegisterEnumValue)) ++#define VR14 ((VectorRegister)( VR14_VectorRegisterEnumValue)) ++#define VR15 ((VectorRegister)( VR15_VectorRegisterEnumValue)) ++#define VR16 ((VectorRegister)( VR16_VectorRegisterEnumValue)) ++#define VR17 ((VectorRegister)( VR17_VectorRegisterEnumValue)) ++#define VR18 ((VectorRegister)( VR18_VectorRegisterEnumValue)) ++#define VR19 ((VectorRegister)( VR19_VectorRegisterEnumValue)) ++#define VR20 ((VectorRegister)( VR20_VectorRegisterEnumValue)) ++#define VR21 ((VectorRegister)( VR21_VectorRegisterEnumValue)) ++#define VR22 ((VectorRegister)( VR22_VectorRegisterEnumValue)) ++#define VR23 ((VectorRegister)( VR23_VectorRegisterEnumValue)) ++#define VR24 ((VectorRegister)( VR24_VectorRegisterEnumValue)) ++#define VR25 ((VectorRegister)( VR25_VectorRegisterEnumValue)) ++#define VR26 ((VectorRegister)( VR26_VectorRegisterEnumValue)) ++#define VR27 ((VectorRegister)( VR27_VectorRegisterEnumValue)) ++#define VR28 ((VectorRegister)( VR28_VectorRegisterEnumValue)) ++#define VR29 ((VectorRegister)( VR29_VectorRegisterEnumValue)) ++#define VR30 ((VectorRegister)( VR30_VectorRegisterEnumValue)) ++#define VR31 ((VectorRegister)( VR31_VectorRegisterEnumValue)) ++#endif // DONT_USE_REGISTER_DEFINES ++ ++ ++// Maximum number of incoming arguments that can be passed in i registers. ++const int PPC_ARGS_IN_REGS_NUM = 8; ++ ++ ++// Need to know the total number of registers of all sorts for SharedInfo. ++// Define a class that exports it. ++class ConcreteRegisterImpl : public AbstractRegisterImpl { ++ public: ++ enum { ++ // This number must be large enough to cover REG_COUNT (defined by c2) registers. ++ // There is no requirement that any ordering here matches any ordering c2 gives ++ // it's optoregs. ++ number_of_registers = ++ ( RegisterImpl::number_of_registers + ++ FloatRegisterImpl::number_of_registers ) ++ * 2 // register halves ++ + ConditionRegisterImpl::number_of_registers // condition code registers ++ + SpecialRegisterImpl::number_of_registers // special registers ++ + VectorRegisterImpl::number_of_registers // vector registers ++ }; ++ ++ static const int max_gpr; ++ static const int max_fpr; ++ static const int max_cnd; ++}; ++ ++// Common register declarations used in assembler code. ++REGISTER_DECLARATION(Register, R0_SCRATCH, R0); // volatile ++REGISTER_DECLARATION(Register, R1_SP, R1); // non-volatile ++REGISTER_DECLARATION(Register, R2_TOC, R2); // volatile ++REGISTER_DECLARATION(Register, R3_RET, R3); // volatile ++REGISTER_DECLARATION(Register, R3_ARG1, R3); // volatile ++REGISTER_DECLARATION(Register, R4_ARG2, R4); // volatile ++REGISTER_DECLARATION(Register, R5_ARG3, R5); // volatile ++REGISTER_DECLARATION(Register, R6_ARG4, R6); // volatile ++REGISTER_DECLARATION(Register, R7_ARG5, R7); // volatile ++REGISTER_DECLARATION(Register, R8_ARG6, R8); // volatile ++REGISTER_DECLARATION(Register, R9_ARG7, R9); // volatile ++REGISTER_DECLARATION(Register, R10_ARG8, R10); // volatile ++REGISTER_DECLARATION(FloatRegister, F0_SCRATCH, F0); // volatile ++REGISTER_DECLARATION(FloatRegister, F1_RET, F1); // volatile ++REGISTER_DECLARATION(FloatRegister, F1_ARG1, F1); // volatile ++REGISTER_DECLARATION(FloatRegister, F2_ARG2, F2); // volatile ++REGISTER_DECLARATION(FloatRegister, F3_ARG3, F3); // volatile ++REGISTER_DECLARATION(FloatRegister, F4_ARG4, F4); // volatile ++REGISTER_DECLARATION(FloatRegister, F5_ARG5, F5); // volatile ++REGISTER_DECLARATION(FloatRegister, F6_ARG6, F6); // volatile ++REGISTER_DECLARATION(FloatRegister, F7_ARG7, F7); // volatile ++REGISTER_DECLARATION(FloatRegister, F8_ARG8, F8); // volatile ++REGISTER_DECLARATION(FloatRegister, F9_ARG9, F9); // volatile ++REGISTER_DECLARATION(FloatRegister, F10_ARG10, F10); // volatile ++REGISTER_DECLARATION(FloatRegister, F11_ARG11, F11); // volatile ++REGISTER_DECLARATION(FloatRegister, F12_ARG12, F12); // volatile ++REGISTER_DECLARATION(FloatRegister, F13_ARG13, F13); // volatile ++ ++#ifndef DONT_USE_REGISTER_DEFINES ++#define R0_SCRATCH AS_REGISTER(Register, R0) ++#define R1_SP AS_REGISTER(Register, R1) ++#define R2_TOC AS_REGISTER(Register, R2) ++#define R3_RET AS_REGISTER(Register, R3) ++#define R3_ARG1 AS_REGISTER(Register, R3) ++#define R4_ARG2 AS_REGISTER(Register, R4) ++#define R5_ARG3 AS_REGISTER(Register, R5) ++#define R6_ARG4 AS_REGISTER(Register, R6) ++#define R7_ARG5 AS_REGISTER(Register, R7) ++#define R8_ARG6 AS_REGISTER(Register, R8) ++#define R9_ARG7 AS_REGISTER(Register, R9) ++#define R10_ARG8 AS_REGISTER(Register, R10) ++#define F0_SCRATCH AS_REGISTER(FloatRegister, F0) ++#define F1_RET AS_REGISTER(FloatRegister, F1) ++#define F1_ARG1 AS_REGISTER(FloatRegister, F1) ++#define F2_ARG2 AS_REGISTER(FloatRegister, F2) ++#define F3_ARG3 AS_REGISTER(FloatRegister, F3) ++#define F4_ARG4 AS_REGISTER(FloatRegister, F4) ++#define F5_ARG5 AS_REGISTER(FloatRegister, F5) ++#define F6_ARG6 AS_REGISTER(FloatRegister, F6) ++#define F7_ARG7 AS_REGISTER(FloatRegister, F7) ++#define F8_ARG8 AS_REGISTER(FloatRegister, F8) ++#define F9_ARG9 AS_REGISTER(FloatRegister, F9) ++#define F10_ARG10 AS_REGISTER(FloatRegister, F10) ++#define F11_ARG11 AS_REGISTER(FloatRegister, F11) ++#define F12_ARG12 AS_REGISTER(FloatRegister, F12) ++#define F13_ARG13 AS_REGISTER(FloatRegister, F13) ++#endif ++ ++// Register declarations to be used in frame manager assembly code. ++// Use only non-volatile registers in order to keep values across C-calls. ++#ifdef CC_INTERP ++REGISTER_DECLARATION(Register, R14_state, R14); // address of new cInterpreter. ++REGISTER_DECLARATION(Register, R15_prev_state, R15); // address of old cInterpreter ++#else // CC_INTERP ++REGISTER_DECLARATION(Register, R14_bcp, R14); ++REGISTER_DECLARATION(Register, R15_esp, R15); ++REGISTER_DECLARATION(FloatRegister, F15_ftos, F15); ++#endif // CC_INTERP ++REGISTER_DECLARATION(Register, R16_thread, R16); // address of current thread ++REGISTER_DECLARATION(Register, R17_tos, R17); // address of Java tos (prepushed). ++REGISTER_DECLARATION(Register, R18_locals, R18); // address of first param slot (receiver). ++REGISTER_DECLARATION(Register, R19_method, R19); // address of current method ++#ifndef DONT_USE_REGISTER_DEFINES ++#ifdef CC_INTERP ++#define R14_state AS_REGISTER(Register, R14) ++#define R15_prev_state AS_REGISTER(Register, R15) ++#else // CC_INTERP ++#define R14_bcp AS_REGISTER(Register, R14) ++#define R15_esp AS_REGISTER(Register, R15) ++#define F15_ftos AS_REGISTER(FloatRegister, F15) ++#endif // CC_INTERP ++#define R16_thread AS_REGISTER(Register, R16) ++#define R17_tos AS_REGISTER(Register, R17) ++#define R18_locals AS_REGISTER(Register, R18) ++#define R19_method AS_REGISTER(Register, R19) ++#define R21_sender_SP AS_REGISTER(Register, R21) ++#define R23_method_handle AS_REGISTER(Register, R23) ++#endif ++ ++// Temporary registers to be used within frame manager. We can use ++// the non-volatiles because the call stub has saved them. ++// Use only non-volatile registers in order to keep values across C-calls. ++REGISTER_DECLARATION(Register, R21_tmp1, R21); ++REGISTER_DECLARATION(Register, R22_tmp2, R22); ++REGISTER_DECLARATION(Register, R23_tmp3, R23); ++REGISTER_DECLARATION(Register, R24_tmp4, R24); ++REGISTER_DECLARATION(Register, R25_tmp5, R25); ++REGISTER_DECLARATION(Register, R26_tmp6, R26); ++REGISTER_DECLARATION(Register, R27_tmp7, R27); ++REGISTER_DECLARATION(Register, R28_tmp8, R28); ++REGISTER_DECLARATION(Register, R29_tmp9, R29); ++#ifndef CC_INTERP ++REGISTER_DECLARATION(Register, R24_dispatch_addr, R24); ++REGISTER_DECLARATION(Register, R25_templateTableBase, R25); ++REGISTER_DECLARATION(Register, R26_monitor, R26); ++REGISTER_DECLARATION(Register, R27_constPoolCache, R27); ++REGISTER_DECLARATION(Register, R28_mdx, R28); ++#endif // CC_INTERP ++ ++#ifndef DONT_USE_REGISTER_DEFINES ++#define R21_tmp1 AS_REGISTER(Register, R21) ++#define R22_tmp2 AS_REGISTER(Register, R22) ++#define R23_tmp3 AS_REGISTER(Register, R23) ++#define R24_tmp4 AS_REGISTER(Register, R24) ++#define R25_tmp5 AS_REGISTER(Register, R25) ++#define R26_tmp6 AS_REGISTER(Register, R26) ++#define R27_tmp7 AS_REGISTER(Register, R27) ++#define R28_tmp8 AS_REGISTER(Register, R28) ++#define R29_tmp9 AS_REGISTER(Register, R29) ++#ifndef CC_INTERP ++// Lmonitors : monitor pointer ++// LcpoolCache: constant pool cache ++// mdx: method data index ++#define R24_dispatch_addr AS_REGISTER(Register, R24) ++#define R25_templateTableBase AS_REGISTER(Register, R25) ++#define R26_monitor AS_REGISTER(Register, R26) ++#define R27_constPoolCache AS_REGISTER(Register, R27) ++#define R28_mdx AS_REGISTER(Register, R28) ++#endif ++ ++#define CCR4_is_synced AS_REGISTER(ConditionRegister, CCR4) ++#endif ++ ++// Scratch registers are volatile. ++REGISTER_DECLARATION(Register, R11_scratch1, R11); ++REGISTER_DECLARATION(Register, R12_scratch2, R12); ++#ifndef DONT_USE_REGISTER_DEFINES ++#define R11_scratch1 AS_REGISTER(Register, R11) ++#define R12_scratch2 AS_REGISTER(Register, R12) ++#endif ++ ++#endif // CPU_PPC_VM_REGISTER_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/relocInfo_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/relocInfo_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,133 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "asm/assembler.inline.hpp" ++#include "assembler_ppc.inline.hpp" ++#include "code/relocInfo.hpp" ++#include "nativeInst_ppc.hpp" ++#include "oops/oop.inline.hpp" ++#include "runtime/safepoint.hpp" ++ ++void Relocation::pd_set_data_value(address x, intptr_t o, bool verify_only) { ++ bool copy_back_to_oop_pool = true; // TODO: PPC port ++ // The following comment is from the declaration of DataRelocation: ++ // ++ // "The "o" (displacement) argument is relevant only to split relocations ++ // on RISC machines. In some CPUs (SPARC), the set-hi and set-lo ins'ns ++ // can encode more than 32 bits between them. This allows compilers to ++ // share set-hi instructions between addresses that differ by a small ++ // offset (e.g., different static variables in the same class). ++ // On such machines, the "x" argument to set_value on all set-lo ++ // instructions must be the same as the "x" argument for the ++ // corresponding set-hi instructions. The "o" arguments for the ++ // set-hi instructions are ignored, and must not affect the high-half ++ // immediate constant. The "o" arguments for the set-lo instructions are ++ // added into the low-half immediate constant, and must not overflow it." ++ // ++ // Currently we don't support splitting of relocations, so o must be ++ // zero: ++ assert(o == 0, "tried to split relocations"); ++ ++ if (!verify_only) { ++ if (format() != 1) { ++ nativeMovConstReg_at(addr())->set_data_plain(((intptr_t)x), code()); ++ } else { ++ assert(type() == relocInfo::oop_type || type() == relocInfo::metadata_type, ++ "how to encode else?"); ++ narrowOop no = (type() == relocInfo::oop_type) ? ++ oopDesc::encode_heap_oop((oop)x) : Klass::encode_klass((Klass*)x); ++ nativeMovConstReg_at(addr())->set_narrow_oop(no, code()); ++ } ++ } else { ++ assert((address) (nativeMovConstReg_at(addr())->data()) == x, "data must match"); ++ } ++} ++ ++address Relocation::pd_call_destination(address orig_addr) { ++ intptr_t adj = 0; ++ address inst_loc = addr(); ++ ++ if (orig_addr != NULL) { ++ // We just moved this call instruction from orig_addr to addr(). ++ // This means its target will appear to have grown by addr() - orig_addr. ++ adj = -(inst_loc - orig_addr); ++ } ++ if (NativeFarCall::is_far_call_at(inst_loc)) { ++ NativeFarCall* call = nativeFarCall_at(inst_loc); ++ return call->destination() + (intptr_t)(call->is_pcrelative() ? adj : 0); ++ } else if (NativeJump::is_jump_at(inst_loc)) { ++ NativeJump* jump = nativeJump_at(inst_loc); ++ return jump->jump_destination() + (intptr_t)(jump->is_pcrelative() ? adj : 0); ++ } else if (NativeConditionalFarBranch::is_conditional_far_branch_at(inst_loc)) { ++ NativeConditionalFarBranch* branch = NativeConditionalFarBranch_at(inst_loc); ++ return branch->branch_destination(); ++ } else { ++ // There are two instructions at the beginning of a stub, therefore we ++ // load at orig_addr + 8. ++ orig_addr = nativeCall_at(inst_loc)->get_trampoline(); ++ if (orig_addr == NULL) { ++ return (address) -1; ++ } else { ++ return (address) nativeMovConstReg_at(orig_addr + 8)->data(); ++ } ++ } ++} ++ ++void Relocation::pd_set_call_destination(address x) { ++ address inst_loc = addr(); ++ ++ if (NativeFarCall::is_far_call_at(inst_loc)) { ++ NativeFarCall* call = nativeFarCall_at(inst_loc); ++ call->set_destination(x); ++ } else if (NativeJump::is_jump_at(inst_loc)) { ++ NativeJump* jump= nativeJump_at(inst_loc); ++ jump->set_jump_destination(x); ++ } else if (NativeConditionalFarBranch::is_conditional_far_branch_at(inst_loc)) { ++ NativeConditionalFarBranch* branch = NativeConditionalFarBranch_at(inst_loc); ++ branch->set_branch_destination(x); ++ } else { ++ NativeCall* call = nativeCall_at(inst_loc); ++ call->set_destination_mt_safe(x, false); ++ } ++} ++ ++address* Relocation::pd_address_in_code() { ++ ShouldNotReachHere(); ++ return 0; ++} ++ ++address Relocation::pd_get_address_from_code() { ++ return (address)(nativeMovConstReg_at(addr())->data()); ++} ++ ++void poll_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) { ++} ++ ++void poll_return_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) { ++} ++ ++void metadata_Relocation::pd_fix_value(address x) { ++} +--- ./hotspot/src/cpu/ppc/vm/relocInfo_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/relocInfo_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,46 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_RELOCINFO_PPC_HPP ++#define CPU_PPC_VM_RELOCINFO_PPC_HPP ++ ++ // machine-dependent parts of class relocInfo ++ private: ++ enum { ++ // Since Power instructions are whole words, ++ // the two low-order offset bits can always be discarded. ++ offset_unit = 4, ++ ++ // There is no need for format bits; the instructions are ++ // sufficiently self-identifying. ++#ifndef _LP64 ++ format_width = 0 ++#else ++ // Except narrow oops in 64-bits VM. ++ format_width = 1 ++#endif ++ }; ++ ++#endif // CPU_PPC_VM_RELOCINFO_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/runtime_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/runtime_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,191 @@ ++/* ++ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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" ++#ifdef COMPILER2 ++#include "asm/assembler.inline.hpp" ++#include "asm/macroAssembler.inline.hpp" ++#include "classfile/systemDictionary.hpp" ++#include "code/vmreg.hpp" ++#include "interpreter/interpreter.hpp" ++#include "nativeInst_ppc.hpp" ++#include "opto/runtime.hpp" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "runtime/vframeArray.hpp" ++#include "utilities/globalDefinitions.hpp" ++#include "vmreg_ppc.inline.hpp" ++#endif ++ ++#define __ masm-> ++ ++ ++#ifdef COMPILER2 ++ ++// SP adjustment (must use unextended SP) for method handle call sites ++// during exception handling. ++static intptr_t adjust_SP_for_methodhandle_callsite(JavaThread *thread) { ++ RegisterMap map(thread, false); ++ // The frame constructor will do the correction for us (see frame::adjust_unextended_SP). ++ frame mh_caller_frame = thread->last_frame().sender(&map); ++ assert(mh_caller_frame.is_compiled_frame(), "Only may reach here for compiled MH call sites"); ++ return (intptr_t) mh_caller_frame.unextended_sp(); ++} ++ ++//------------------------------generate_exception_blob--------------------------- ++// Creates exception blob at the end. ++// Using exception blob, this code is jumped from a compiled method. ++// ++// Given an exception pc at a call we call into the runtime for the ++// handler in this method. This handler might merely restore state ++// (i.e. callee save registers) unwind the frame and jump to the ++// exception handler for the nmethod if there is no Java level handler ++// for the nmethod. ++// ++// This code is entered with a jmp. ++// ++// Arguments: ++// R3_ARG1: exception oop ++// R4_ARG2: exception pc ++// ++// Results: ++// R3_ARG1: exception oop ++// R4_ARG2: exception pc in caller ++// destination: exception handler of caller ++// ++// Note: the exception pc MUST be at a call (precise debug information) ++// ++void OptoRuntime::generate_exception_blob() { ++ // Allocate space for the code. ++ ResourceMark rm; ++ // Setup code generation tools. ++ CodeBuffer buffer("exception_blob", 2048, 1024); ++ InterpreterMacroAssembler* masm = new InterpreterMacroAssembler(&buffer); ++ ++ address start = __ pc(); ++ ++ int frame_size_in_bytes = frame::abi_reg_args_size; ++ OopMap* map = new OopMap(frame_size_in_bytes / sizeof(jint), 0); ++ ++ // Exception pc is 'return address' for stack walker. ++ __ std(R4_ARG2/*exception pc*/, _abi(lr), R1_SP); ++ ++ // Store the exception in the Thread object. ++ __ std(R3_ARG1/*exception oop*/, in_bytes(JavaThread::exception_oop_offset()), R16_thread); ++ __ std(R4_ARG2/*exception pc*/, in_bytes(JavaThread::exception_pc_offset()), R16_thread); ++ ++ // Save callee-saved registers. ++ // Push a C frame for the exception blob. It is needed for the C call later on. ++ __ push_frame_reg_args(0, R11_scratch1); ++ ++ // This call does all the hard work. It checks if an exception handler ++ // exists in the method. ++ // If so, it returns the handler address. ++ // If not, it prepares for stack-unwinding, restoring the callee-save ++ // registers of the frame being removed. ++ __ set_last_Java_frame(/*sp=*/R1_SP, noreg); ++ ++ __ mr(R3_ARG1, R16_thread); ++#if defined(ABI_ELFv2) ++ __ call_c((address) OptoRuntime::handle_exception_C, relocInfo::none); ++#else ++ __ call_c(CAST_FROM_FN_PTR(FunctionDescriptor*, OptoRuntime::handle_exception_C), ++ relocInfo::none); ++#endif ++ address calls_return_pc = __ last_calls_return_pc(); ++# ifdef ASSERT ++ __ cmpdi(CCR0, R3_RET, 0); ++ __ asm_assert_ne("handle_exception_C must not return NULL", 0x601); ++# endif ++ ++ // Set an oopmap for the call site. This oopmap will only be used if we ++ // are unwinding the stack. Hence, all locations will be dead. ++ // Callee-saved registers will be the same as the frame above (i.e., ++ // handle_exception_stub), since they were restored when we got the ++ // exception. ++ OopMapSet* oop_maps = new OopMapSet(); ++ oop_maps->add_gc_map(calls_return_pc - start, map); ++ ++ // Get unextended_sp for method handle call sites. ++ Label mh_callsite, mh_done; // Use a 2nd c call if it's a method handle call site. ++ __ lwa(R4_ARG2, in_bytes(JavaThread::is_method_handle_return_offset()), R16_thread); ++ __ cmpwi(CCR0, R4_ARG2, 0); ++ __ bne(CCR0, mh_callsite); ++ ++ __ mtctr(R3_RET); // Move address of exception handler to SR_CTR. ++ __ reset_last_Java_frame(); ++ __ pop_frame(); ++ ++ __ bind(mh_done); ++ // We have a handler in register SR_CTR (could be deopt blob). ++ ++ // Get the exception oop. ++ __ ld(R3_ARG1, in_bytes(JavaThread::exception_oop_offset()), R16_thread); ++ ++ // Get the exception pc in case we are deoptimized. ++ __ ld(R4_ARG2, in_bytes(JavaThread::exception_pc_offset()), R16_thread); ++ ++ // Reset thread values. ++ __ li(R0, 0); ++#ifdef ASSERT ++ __ std(R0, in_bytes(JavaThread::exception_handler_pc_offset()), R16_thread); ++ __ std(R0, in_bytes(JavaThread::exception_pc_offset()), R16_thread); ++#endif ++ // Clear the exception oop so GC no longer processes it as a root. ++ __ std(R0, in_bytes(JavaThread::exception_oop_offset()), R16_thread); ++ ++ // Move exception pc into SR_LR. ++ __ mtlr(R4_ARG2); ++ __ bctr(); ++ ++ ++ // Same as above, but also set sp to unextended_sp. ++ __ bind(mh_callsite); ++ __ mr(R31, R3_RET); // Save branch address. ++ __ mr(R3_ARG1, R16_thread); ++#if defined(ABI_ELFv2) ++ __ call_c((address) adjust_SP_for_methodhandle_callsite, relocInfo::none); ++#else ++ __ call_c(CAST_FROM_FN_PTR(FunctionDescriptor*, adjust_SP_for_methodhandle_callsite), relocInfo::none); ++#endif ++ // Returns unextended_sp in R3_RET. ++ ++ __ mtctr(R31); // Move address of exception handler to SR_CTR. ++ __ reset_last_Java_frame(); ++ ++ __ mr(R1_SP, R3_RET); // Set sp to unextended_sp. ++ __ b(mh_done); ++ ++ ++ // Make sure all code is generated. ++ masm->flush(); ++ ++ // Set exception blob. ++ _exception_blob = ExceptionBlob::create(&buffer, oop_maps, ++ frame_size_in_bytes/wordSize); ++} ++ ++#endif // COMPILER2 +--- ./hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,3255 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/macroAssembler.inline.hpp" ++#include "code/debugInfoRec.hpp" ++#include "code/icBuffer.hpp" ++#include "code/vtableStubs.hpp" ++#include "interpreter/interpreter.hpp" ++#include "oops/compiledICHolder.hpp" ++#include "prims/jvmtiRedefineClassesTrace.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/vframeArray.hpp" ++#include "vmreg_ppc.inline.hpp" ++#include "adfiles/ad_ppc_64.hpp" ++#ifdef COMPILER1 ++#include "c1/c1_Runtime1.hpp" ++#endif ++#ifdef COMPILER2 ++#include "opto/runtime.hpp" ++#endif ++ ++#define __ masm-> ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) // nothing ++#else ++#define BLOCK_COMMENT(str) __ block_comment(str) ++#endif ++ ++#define BIND(label) bind(label); BLOCK_COMMENT(#label ":") ++ ++ ++class RegisterSaver { ++ // Used for saving volatile registers. ++ public: ++ ++ // Support different return pc locations. ++ enum ReturnPCLocation { ++ return_pc_is_lr, ++ return_pc_is_r4, ++ return_pc_is_thread_saved_exception_pc ++ }; ++ ++ static OopMap* push_frame_reg_args_and_save_live_registers(MacroAssembler* masm, ++ int* out_frame_size_in_bytes, ++ bool generate_oop_map, ++ int return_pc_adjustment, ++ ReturnPCLocation return_pc_location); ++ static void restore_live_registers_and_pop_frame(MacroAssembler* masm, ++ int frame_size_in_bytes, ++ bool restore_ctr); ++ ++ static void push_frame_and_save_argument_registers(MacroAssembler* masm, ++ Register r_temp, ++ int frame_size, ++ int total_args, ++ const VMRegPair *regs, const VMRegPair *regs2 = NULL); ++ static void restore_argument_registers_and_pop_frame(MacroAssembler*masm, ++ int frame_size, ++ int total_args, ++ const VMRegPair *regs, const VMRegPair *regs2 = NULL); ++ ++ // During deoptimization only the result registers need to be restored ++ // all the other values have already been extracted. ++ static void restore_result_registers(MacroAssembler* masm, int frame_size_in_bytes); ++ ++ // Constants and data structures: ++ ++ typedef enum { ++ int_reg = 0, ++ float_reg = 1, ++ special_reg = 2 ++ } RegisterType; ++ ++ typedef enum { ++ reg_size = 8, ++ half_reg_size = reg_size / 2, ++ } RegisterConstants; ++ ++ typedef struct { ++ RegisterType reg_type; ++ int reg_num; ++ VMReg vmreg; ++ } LiveRegType; ++}; ++ ++ ++#define RegisterSaver_LiveSpecialReg(regname) \ ++ { RegisterSaver::special_reg, regname->encoding(), regname->as_VMReg() } ++ ++#define RegisterSaver_LiveIntReg(regname) \ ++ { RegisterSaver::int_reg, regname->encoding(), regname->as_VMReg() } ++ ++#define RegisterSaver_LiveFloatReg(regname) \ ++ { RegisterSaver::float_reg, regname->encoding(), regname->as_VMReg() } ++ ++static const RegisterSaver::LiveRegType RegisterSaver_LiveRegs[] = { ++ // Live registers which get spilled to the stack. Register ++ // positions in this array correspond directly to the stack layout. ++ ++ // ++ // live special registers: ++ // ++ RegisterSaver_LiveSpecialReg(SR_CTR), ++ // ++ // live float registers: ++ // ++ RegisterSaver_LiveFloatReg( F0 ), ++ RegisterSaver_LiveFloatReg( F1 ), ++ RegisterSaver_LiveFloatReg( F2 ), ++ RegisterSaver_LiveFloatReg( F3 ), ++ RegisterSaver_LiveFloatReg( F4 ), ++ RegisterSaver_LiveFloatReg( F5 ), ++ RegisterSaver_LiveFloatReg( F6 ), ++ RegisterSaver_LiveFloatReg( F7 ), ++ RegisterSaver_LiveFloatReg( F8 ), ++ RegisterSaver_LiveFloatReg( F9 ), ++ RegisterSaver_LiveFloatReg( F10 ), ++ RegisterSaver_LiveFloatReg( F11 ), ++ RegisterSaver_LiveFloatReg( F12 ), ++ RegisterSaver_LiveFloatReg( F13 ), ++ RegisterSaver_LiveFloatReg( F14 ), ++ RegisterSaver_LiveFloatReg( F15 ), ++ RegisterSaver_LiveFloatReg( F16 ), ++ RegisterSaver_LiveFloatReg( F17 ), ++ RegisterSaver_LiveFloatReg( F18 ), ++ RegisterSaver_LiveFloatReg( F19 ), ++ RegisterSaver_LiveFloatReg( F20 ), ++ RegisterSaver_LiveFloatReg( F21 ), ++ RegisterSaver_LiveFloatReg( F22 ), ++ RegisterSaver_LiveFloatReg( F23 ), ++ RegisterSaver_LiveFloatReg( F24 ), ++ RegisterSaver_LiveFloatReg( F25 ), ++ RegisterSaver_LiveFloatReg( F26 ), ++ RegisterSaver_LiveFloatReg( F27 ), ++ RegisterSaver_LiveFloatReg( F28 ), ++ RegisterSaver_LiveFloatReg( F29 ), ++ RegisterSaver_LiveFloatReg( F30 ), ++ RegisterSaver_LiveFloatReg( F31 ), ++ // ++ // live integer registers: ++ // ++ RegisterSaver_LiveIntReg( R0 ), ++ //RegisterSaver_LiveIntReg( R1 ), // stack pointer ++ RegisterSaver_LiveIntReg( R2 ), ++ RegisterSaver_LiveIntReg( R3 ), ++ RegisterSaver_LiveIntReg( R4 ), ++ RegisterSaver_LiveIntReg( R5 ), ++ RegisterSaver_LiveIntReg( R6 ), ++ RegisterSaver_LiveIntReg( R7 ), ++ RegisterSaver_LiveIntReg( R8 ), ++ RegisterSaver_LiveIntReg( R9 ), ++ RegisterSaver_LiveIntReg( R10 ), ++ RegisterSaver_LiveIntReg( R11 ), ++ RegisterSaver_LiveIntReg( R12 ), ++ //RegisterSaver_LiveIntReg( R13 ), // system thread id ++ RegisterSaver_LiveIntReg( R14 ), ++ RegisterSaver_LiveIntReg( R15 ), ++ RegisterSaver_LiveIntReg( R16 ), ++ RegisterSaver_LiveIntReg( R17 ), ++ RegisterSaver_LiveIntReg( R18 ), ++ RegisterSaver_LiveIntReg( R19 ), ++ RegisterSaver_LiveIntReg( R20 ), ++ RegisterSaver_LiveIntReg( R21 ), ++ RegisterSaver_LiveIntReg( R22 ), ++ RegisterSaver_LiveIntReg( R23 ), ++ RegisterSaver_LiveIntReg( R24 ), ++ RegisterSaver_LiveIntReg( R25 ), ++ RegisterSaver_LiveIntReg( R26 ), ++ RegisterSaver_LiveIntReg( R27 ), ++ RegisterSaver_LiveIntReg( R28 ), ++ RegisterSaver_LiveIntReg( R29 ), ++ RegisterSaver_LiveIntReg( R31 ), ++ RegisterSaver_LiveIntReg( R30 ), // r30 must be the last register ++}; ++ ++OopMap* RegisterSaver::push_frame_reg_args_and_save_live_registers(MacroAssembler* masm, ++ int* out_frame_size_in_bytes, ++ bool generate_oop_map, ++ int return_pc_adjustment, ++ ReturnPCLocation return_pc_location) { ++ // Push an abi_reg_args-frame and store all registers which may be live. ++ // If requested, create an OopMap: Record volatile registers as ++ // callee-save values in an OopMap so their save locations will be ++ // propagated to the RegisterMap of the caller frame during ++ // StackFrameStream construction (needed for deoptimization; see ++ // compiledVFrame::create_stack_value). ++ // If return_pc_adjustment != 0 adjust the return pc by return_pc_adjustment. ++ ++ int i; ++ int offset; ++ ++ // calcualte frame size ++ const int regstosave_num = sizeof(RegisterSaver_LiveRegs) / ++ sizeof(RegisterSaver::LiveRegType); ++ const int register_save_size = regstosave_num * reg_size; ++ const int frame_size_in_bytes = round_to(register_save_size, frame::alignment_in_bytes) ++ + frame::abi_reg_args_size; ++ *out_frame_size_in_bytes = frame_size_in_bytes; ++ const int frame_size_in_slots = frame_size_in_bytes / sizeof(jint); ++ const int register_save_offset = frame_size_in_bytes - register_save_size; ++ ++ // OopMap frame size is in c2 stack slots (sizeof(jint)) not bytes or words. ++ OopMap* map = generate_oop_map ? new OopMap(frame_size_in_slots, 0) : NULL; ++ ++ BLOCK_COMMENT("push_frame_reg_args_and_save_live_registers {"); ++ ++ // Save r30 in the last slot of the not yet pushed frame so that we ++ // can use it as scratch reg. ++ __ std(R30, -reg_size, R1_SP); ++ assert(-reg_size == register_save_offset - frame_size_in_bytes + ((regstosave_num-1)*reg_size), ++ "consistency check"); ++ ++ // save the flags ++ // Do the save_LR_CR by hand and adjust the return pc if requested. ++ __ mfcr(R30); ++ __ std(R30, _abi(cr), R1_SP); ++ switch (return_pc_location) { ++ case return_pc_is_lr: __ mflr(R30); break; ++ case return_pc_is_r4: __ mr(R30, R4); break; ++ case return_pc_is_thread_saved_exception_pc: ++ __ ld(R30, thread_(saved_exception_pc)); break; ++ default: ShouldNotReachHere(); ++ } ++ if (return_pc_adjustment != 0) ++ __ addi(R30, R30, return_pc_adjustment); ++ __ std(R30, _abi(lr), R1_SP); ++ ++ // push a new frame ++ __ push_frame(frame_size_in_bytes, R30); ++ ++ // save all registers (ints and floats) ++ offset = register_save_offset; ++ for (int i = 0; i < regstosave_num; i++) { ++ int reg_num = RegisterSaver_LiveRegs[i].reg_num; ++ int reg_type = RegisterSaver_LiveRegs[i].reg_type; ++ ++ switch (reg_type) { ++ case RegisterSaver::int_reg: { ++ if (reg_num != 30) { // We spilled R30 right at the beginning. ++ __ std(as_Register(reg_num), offset, R1_SP); ++ } ++ break; ++ } ++ case RegisterSaver::float_reg: { ++ __ stfd(as_FloatRegister(reg_num), offset, R1_SP); ++ break; ++ } ++ case RegisterSaver::special_reg: { ++ if (reg_num == SR_CTR_SpecialRegisterEnumValue) { ++ __ mfctr(R30); ++ __ std(R30, offset, R1_SP); ++ } else { ++ Unimplemented(); ++ } ++ break; ++ } ++ default: ++ ShouldNotReachHere(); ++ } ++ ++ if (generate_oop_map) { ++ map->set_callee_saved(VMRegImpl::stack2reg(offset>>2), ++ RegisterSaver_LiveRegs[i].vmreg); ++ map->set_callee_saved(VMRegImpl::stack2reg((offset + half_reg_size)>>2), ++ RegisterSaver_LiveRegs[i].vmreg->next()); ++ } ++ offset += reg_size; ++ } ++ ++ BLOCK_COMMENT("} push_frame_reg_args_and_save_live_registers"); ++ ++ // And we're done. ++ return map; ++} ++ ++ ++// Pop the current frame and restore all the registers that we ++// saved. ++void RegisterSaver::restore_live_registers_and_pop_frame(MacroAssembler* masm, ++ int frame_size_in_bytes, ++ bool restore_ctr) { ++ int i; ++ int offset; ++ const int regstosave_num = sizeof(RegisterSaver_LiveRegs) / ++ sizeof(RegisterSaver::LiveRegType); ++ const int register_save_size = regstosave_num * reg_size; ++ const int register_save_offset = frame_size_in_bytes - register_save_size; ++ ++ BLOCK_COMMENT("restore_live_registers_and_pop_frame {"); ++ ++ // restore all registers (ints and floats) ++ offset = register_save_offset; ++ for (int i = 0; i < regstosave_num; i++) { ++ int reg_num = RegisterSaver_LiveRegs[i].reg_num; ++ int reg_type = RegisterSaver_LiveRegs[i].reg_type; ++ ++ switch (reg_type) { ++ case RegisterSaver::int_reg: { ++ if (reg_num != 30) // R30 restored at the end, it's the tmp reg! ++ __ ld(as_Register(reg_num), offset, R1_SP); ++ break; ++ } ++ case RegisterSaver::float_reg: { ++ __ lfd(as_FloatRegister(reg_num), offset, R1_SP); ++ break; ++ } ++ case RegisterSaver::special_reg: { ++ if (reg_num == SR_CTR_SpecialRegisterEnumValue) { ++ if (restore_ctr) { // Nothing to do here if ctr already contains the next address. ++ __ ld(R30, offset, R1_SP); ++ __ mtctr(R30); ++ } ++ } else { ++ Unimplemented(); ++ } ++ break; ++ } ++ default: ++ ShouldNotReachHere(); ++ } ++ offset += reg_size; ++ } ++ ++ // pop the frame ++ __ pop_frame(); ++ ++ // restore the flags ++ __ restore_LR_CR(R30); ++ ++ // restore scratch register's value ++ __ ld(R30, -reg_size, R1_SP); ++ ++ BLOCK_COMMENT("} restore_live_registers_and_pop_frame"); ++} ++ ++void RegisterSaver::push_frame_and_save_argument_registers(MacroAssembler* masm, Register r_temp, ++ int frame_size,int total_args, const VMRegPair *regs, ++ const VMRegPair *regs2) { ++ __ push_frame(frame_size, r_temp); ++ int st_off = frame_size - wordSize; ++ for (int i = 0; i < total_args; i++) { ++ VMReg r_1 = regs[i].first(); ++ VMReg r_2 = regs[i].second(); ++ if (!r_1->is_valid()) { ++ assert(!r_2->is_valid(), ""); ++ continue; ++ } ++ if (r_1->is_Register()) { ++ Register r = r_1->as_Register(); ++ __ std(r, st_off, R1_SP); ++ st_off -= wordSize; ++ } else if (r_1->is_FloatRegister()) { ++ FloatRegister f = r_1->as_FloatRegister(); ++ __ stfd(f, st_off, R1_SP); ++ st_off -= wordSize; ++ } ++ } ++ if (regs2 != NULL) { ++ for (int i = 0; i < total_args; i++) { ++ VMReg r_1 = regs2[i].first(); ++ VMReg r_2 = regs2[i].second(); ++ if (!r_1->is_valid()) { ++ assert(!r_2->is_valid(), ""); ++ continue; ++ } ++ if (r_1->is_Register()) { ++ Register r = r_1->as_Register(); ++ __ std(r, st_off, R1_SP); ++ st_off -= wordSize; ++ } else if (r_1->is_FloatRegister()) { ++ FloatRegister f = r_1->as_FloatRegister(); ++ __ stfd(f, st_off, R1_SP); ++ st_off -= wordSize; ++ } ++ } ++ } ++} ++ ++void RegisterSaver::restore_argument_registers_and_pop_frame(MacroAssembler*masm, int frame_size, ++ int total_args, const VMRegPair *regs, ++ const VMRegPair *regs2) { ++ int st_off = frame_size - wordSize; ++ for (int i = 0; i < total_args; i++) { ++ VMReg r_1 = regs[i].first(); ++ VMReg r_2 = regs[i].second(); ++ if (r_1->is_Register()) { ++ Register r = r_1->as_Register(); ++ __ ld(r, st_off, R1_SP); ++ st_off -= wordSize; ++ } else if (r_1->is_FloatRegister()) { ++ FloatRegister f = r_1->as_FloatRegister(); ++ __ lfd(f, st_off, R1_SP); ++ st_off -= wordSize; ++ } ++ } ++ if (regs2 != NULL) ++ for (int i = 0; i < total_args; i++) { ++ VMReg r_1 = regs2[i].first(); ++ VMReg r_2 = regs2[i].second(); ++ if (r_1->is_Register()) { ++ Register r = r_1->as_Register(); ++ __ ld(r, st_off, R1_SP); ++ st_off -= wordSize; ++ } else if (r_1->is_FloatRegister()) { ++ FloatRegister f = r_1->as_FloatRegister(); ++ __ lfd(f, st_off, R1_SP); ++ st_off -= wordSize; ++ } ++ } ++ __ pop_frame(); ++} ++ ++// Restore the registers that might be holding a result. ++void RegisterSaver::restore_result_registers(MacroAssembler* masm, int frame_size_in_bytes) { ++ int i; ++ int offset; ++ const int regstosave_num = sizeof(RegisterSaver_LiveRegs) / ++ sizeof(RegisterSaver::LiveRegType); ++ const int register_save_size = regstosave_num * reg_size; ++ const int register_save_offset = frame_size_in_bytes - register_save_size; ++ ++ // restore all result registers (ints and floats) ++ offset = register_save_offset; ++ for (int i = 0; i < regstosave_num; i++) { ++ int reg_num = RegisterSaver_LiveRegs[i].reg_num; ++ int reg_type = RegisterSaver_LiveRegs[i].reg_type; ++ switch (reg_type) { ++ case RegisterSaver::int_reg: { ++ if (as_Register(reg_num)==R3_RET) // int result_reg ++ __ ld(as_Register(reg_num), offset, R1_SP); ++ break; ++ } ++ case RegisterSaver::float_reg: { ++ if (as_FloatRegister(reg_num)==F1_RET) // float result_reg ++ __ lfd(as_FloatRegister(reg_num), offset, R1_SP); ++ break; ++ } ++ case RegisterSaver::special_reg: { ++ // Special registers don't hold a result. ++ break; ++ } ++ default: ++ ShouldNotReachHere(); ++ } ++ offset += reg_size; ++ } ++} ++ ++// Is vector's size (in bytes) bigger than a size saved by default? ++bool SharedRuntime::is_wide_vector(int size) { ++ ResourceMark rm; ++ // Note, MaxVectorSize == 8 on PPC64. ++ assert(size <= 8, err_msg_res("%d bytes vectors are not supported", size)); ++ return size > 8; ++} ++#ifdef COMPILER2 ++static int reg2slot(VMReg r) { ++ return r->reg2stack() + SharedRuntime::out_preserve_stack_slots(); ++} ++ ++static int reg2offset(VMReg r) { ++ return (r->reg2stack() + SharedRuntime::out_preserve_stack_slots()) * VMRegImpl::stack_slot_size; ++} ++#endif ++ ++// --------------------------------------------------------------------------- ++// Read the array of BasicTypes from a signature, and compute where the ++// arguments should go. Values in the VMRegPair regs array refer to 4-byte ++// quantities. Values less than VMRegImpl::stack0 are registers, those above ++// refer to 4-byte stack slots. All stack slots are based off of the stack pointer ++// as framesizes are fixed. ++// VMRegImpl::stack0 refers to the first slot 0(sp). ++// and VMRegImpl::stack0+1 refers to the memory word 4-bytes higher. Register ++// up to RegisterImpl::number_of_registers) are the 64-bit ++// integer registers. ++ ++// Note: the INPUTS in sig_bt are in units of Java argument words, which are ++// either 32-bit or 64-bit depending on the build. The OUTPUTS are in 32-bit ++// units regardless of build. Of course for i486 there is no 64 bit build ++ ++// The Java calling convention is a "shifted" version of the C ABI. ++// By skipping the first C ABI register we can call non-static jni methods ++// with small numbers of arguments without having to shuffle the arguments ++// at all. Since we control the java ABI we ought to at least get some ++// advantage out of it. ++ ++const VMReg java_iarg_reg[8] = { ++ R3->as_VMReg(), ++ R4->as_VMReg(), ++ R5->as_VMReg(), ++ R6->as_VMReg(), ++ R7->as_VMReg(), ++ R8->as_VMReg(), ++ R9->as_VMReg(), ++ R10->as_VMReg() ++}; ++ ++const VMReg java_farg_reg[13] = { ++ F1->as_VMReg(), ++ F2->as_VMReg(), ++ F3->as_VMReg(), ++ F4->as_VMReg(), ++ F5->as_VMReg(), ++ F6->as_VMReg(), ++ F7->as_VMReg(), ++ F8->as_VMReg(), ++ F9->as_VMReg(), ++ F10->as_VMReg(), ++ F11->as_VMReg(), ++ F12->as_VMReg(), ++ F13->as_VMReg() ++}; ++ ++const int num_java_iarg_registers = sizeof(java_iarg_reg) / sizeof(java_iarg_reg[0]); ++const int num_java_farg_registers = sizeof(java_farg_reg) / sizeof(java_farg_reg[0]); ++ ++int SharedRuntime::java_calling_convention(const BasicType *sig_bt, ++ VMRegPair *regs, ++ int total_args_passed, ++ int is_outgoing) { ++ // C2c calling conventions for compiled-compiled calls. ++ // Put 8 ints/longs into registers _AND_ 13 float/doubles into ++ // registers _AND_ put the rest on the stack. ++ ++ const int inc_stk_for_intfloat = 1; // 1 slots for ints and floats ++ const int inc_stk_for_longdouble = 2; // 2 slots for longs and doubles ++ ++ int i; ++ VMReg reg; ++ int stk = 0; ++ int ireg = 0; ++ int freg = 0; ++ ++ // We put the first 8 arguments into registers and the rest on the ++ // stack, float arguments are already in their argument registers ++ // due to c2c calling conventions (see calling_convention). ++ for (int i = 0; i < total_args_passed; ++i) { ++ switch(sig_bt[i]) { ++ case T_BOOLEAN: ++ case T_CHAR: ++ case T_BYTE: ++ case T_SHORT: ++ case T_INT: ++ if (ireg < num_java_iarg_registers) { ++ // Put int/ptr in register ++ reg = java_iarg_reg[ireg]; ++ ++ireg; ++ } else { ++ // Put int/ptr on stack. ++ reg = VMRegImpl::stack2reg(stk); ++ stk += inc_stk_for_intfloat; ++ } ++ regs[i].set1(reg); ++ break; ++ case T_LONG: ++ assert(sig_bt[i+1] == T_VOID, "expecting half"); ++ if (ireg < num_java_iarg_registers) { ++ // Put long in register. ++ reg = java_iarg_reg[ireg]; ++ ++ireg; ++ } else { ++ // Put long on stack. They must be aligned to 2 slots. ++ if (stk & 0x1) ++stk; ++ reg = VMRegImpl::stack2reg(stk); ++ stk += inc_stk_for_longdouble; ++ } ++ regs[i].set2(reg); ++ break; ++ case T_OBJECT: ++ case T_ARRAY: ++ case T_ADDRESS: ++ if (ireg < num_java_iarg_registers) { ++ // Put ptr in register. ++ reg = java_iarg_reg[ireg]; ++ ++ireg; ++ } else { ++ // Put ptr on stack. Objects must be aligned to 2 slots too, ++ // because "64-bit pointers record oop-ishness on 2 aligned ++ // adjacent registers." (see OopFlow::build_oop_map). ++ if (stk & 0x1) ++stk; ++ reg = VMRegImpl::stack2reg(stk); ++ stk += inc_stk_for_longdouble; ++ } ++ regs[i].set2(reg); ++ break; ++ case T_FLOAT: ++ if (freg < num_java_farg_registers) { ++ // Put float in register. ++ reg = java_farg_reg[freg]; ++ ++freg; ++ } else { ++ // Put float on stack. ++ reg = VMRegImpl::stack2reg(stk); ++ stk += inc_stk_for_intfloat; ++ } ++ regs[i].set1(reg); ++ break; ++ case T_DOUBLE: ++ assert(sig_bt[i+1] == T_VOID, "expecting half"); ++ if (freg < num_java_farg_registers) { ++ // Put double in register. ++ reg = java_farg_reg[freg]; ++ ++freg; ++ } else { ++ // Put double on stack. They must be aligned to 2 slots. ++ if (stk & 0x1) ++stk; ++ reg = VMRegImpl::stack2reg(stk); ++ stk += inc_stk_for_longdouble; ++ } ++ regs[i].set2(reg); ++ break; ++ case T_VOID: ++ // Do not count halves. ++ regs[i].set_bad(); ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ } ++ return round_to(stk, 2); ++} ++ ++#ifdef COMPILER2 ++// Calling convention for calling C code. ++int SharedRuntime::c_calling_convention(const BasicType *sig_bt, ++ VMRegPair *regs, ++ VMRegPair *regs2, ++ int total_args_passed) { ++ // Calling conventions for C runtime calls and calls to JNI native methods. ++ // ++ // PPC64 convention: Hoist the first 8 int/ptr/long's in the first 8 ++ // int regs, leaving int regs undefined if the arg is flt/dbl. Hoist ++ // the first 13 flt/dbl's in the first 13 fp regs but additionally ++ // copy flt/dbl to the stack if they are beyond the 8th argument. ++ ++ const VMReg iarg_reg[8] = { ++ R3->as_VMReg(), ++ R4->as_VMReg(), ++ R5->as_VMReg(), ++ R6->as_VMReg(), ++ R7->as_VMReg(), ++ R8->as_VMReg(), ++ R9->as_VMReg(), ++ R10->as_VMReg() ++ }; ++ ++ const VMReg farg_reg[13] = { ++ F1->as_VMReg(), ++ F2->as_VMReg(), ++ F3->as_VMReg(), ++ F4->as_VMReg(), ++ F5->as_VMReg(), ++ F6->as_VMReg(), ++ F7->as_VMReg(), ++ F8->as_VMReg(), ++ F9->as_VMReg(), ++ F10->as_VMReg(), ++ F11->as_VMReg(), ++ F12->as_VMReg(), ++ F13->as_VMReg() ++ }; ++ ++ // Check calling conventions consistency. ++ assert(sizeof(iarg_reg) / sizeof(iarg_reg[0]) == Argument::n_int_register_parameters_c && ++ sizeof(farg_reg) / sizeof(farg_reg[0]) == Argument::n_float_register_parameters_c, ++ "consistency"); ++ ++ // `Stk' counts stack slots. Due to alignment, 32 bit values occupy ++ // 2 such slots, like 64 bit values do. ++ const int inc_stk_for_intfloat = 2; // 2 slots for ints and floats ++ const int inc_stk_for_longdouble = 2; // 2 slots for longs and doubles ++ ++ int i; ++ VMReg reg; ++ // Leave room for C-compatible ABI_REG_ARGS. ++ int stk = (frame::abi_reg_args_size - frame::jit_out_preserve_size) / VMRegImpl::stack_slot_size; ++ int arg = 0; ++ int freg = 0; ++ ++ // Avoid passing C arguments in the wrong stack slots. ++#if defined(ABI_ELFv2) ++ assert((SharedRuntime::out_preserve_stack_slots() + stk) * VMRegImpl::stack_slot_size == 96, ++ "passing C arguments in wrong stack slots"); ++#else ++ assert((SharedRuntime::out_preserve_stack_slots() + stk) * VMRegImpl::stack_slot_size == 112, ++ "passing C arguments in wrong stack slots"); ++#endif ++ // We fill-out regs AND regs2 if an argument must be passed in a ++ // register AND in a stack slot. If regs2 is NULL in such a ++ // situation, we bail-out with a fatal error. ++ for (int i = 0; i < total_args_passed; ++i, ++arg) { ++ // Initialize regs2 to BAD. ++ if (regs2 != NULL) regs2[i].set_bad(); ++ ++ switch(sig_bt[i]) { ++ ++ // ++ // If arguments 0-7 are integers, they are passed in integer registers. ++ // Argument i is placed in iarg_reg[i]. ++ // ++ case T_BOOLEAN: ++ case T_CHAR: ++ case T_BYTE: ++ case T_SHORT: ++ case T_INT: ++ // We must cast ints to longs and use full 64 bit stack slots ++ // here. We do the cast in GraphKit::gen_stub() and just guard ++ // here against loosing that change. ++ assert(CCallingConventionRequiresIntsAsLongs, ++ "argument of type int should be promoted to type long"); ++ guarantee(i > 0 && sig_bt[i-1] == T_LONG, ++ "argument of type (bt) should have been promoted to type (T_LONG,bt) for bt in " ++ "{T_BOOLEAN, T_CHAR, T_BYTE, T_SHORT, T_INT}"); ++ // Do not count halves. ++ regs[i].set_bad(); ++ --arg; ++ break; ++ case T_LONG: ++ guarantee(sig_bt[i+1] == T_VOID || ++ sig_bt[i+1] == T_BOOLEAN || sig_bt[i+1] == T_CHAR || ++ sig_bt[i+1] == T_BYTE || sig_bt[i+1] == T_SHORT || ++ sig_bt[i+1] == T_INT, ++ "expecting type (T_LONG,half) or type (T_LONG,bt) with bt in {T_BOOLEAN, T_CHAR, T_BYTE, T_SHORT, T_INT}"); ++ case T_OBJECT: ++ case T_ARRAY: ++ case T_ADDRESS: ++ case T_METADATA: ++ // Oops are already boxed if required (JNI). ++ if (arg < Argument::n_int_register_parameters_c) { ++ reg = iarg_reg[arg]; ++ } else { ++ reg = VMRegImpl::stack2reg(stk); ++ stk += inc_stk_for_longdouble; ++ } ++ regs[i].set2(reg); ++ break; ++ ++ // ++ // Floats are treated differently from int regs: The first 13 float arguments ++ // are passed in registers (not the float args among the first 13 args). ++ // Thus argument i is NOT passed in farg_reg[i] if it is float. It is passed ++ // in farg_reg[j] if argument i is the j-th float argument of this call. ++ // ++ case T_FLOAT: ++ if (freg < Argument::n_float_register_parameters_c) { ++ // Put float in register ... ++ reg = farg_reg[freg]; ++ ++freg; ++ ++ // Argument i for i > 8 is placed on the stack even if it's ++ // placed in a register (if it's a float arg). Aix disassembly ++ // shows that xlC places these float args on the stack AND in ++ // a register. This is not documented, but we follow this ++ // convention, too. ++ if (arg >= Argument::n_regs_not_on_stack_c) { ++ // ... and on the stack. ++ guarantee(regs2 != NULL, "must pass float in register and stack slot"); ++ VMReg reg2 = VMRegImpl::stack2reg(stk LINUX_ONLY(+1)); ++ regs2[i].set1(reg2); ++ stk += inc_stk_for_intfloat; ++ } ++ ++ } else { ++ // Put float on stack. ++ reg = VMRegImpl::stack2reg(stk LINUX_ONLY(+1)); ++ stk += inc_stk_for_intfloat; ++ } ++ regs[i].set1(reg); ++ break; ++ case T_DOUBLE: ++ assert(sig_bt[i+1] == T_VOID, "expecting half"); ++ if (freg < Argument::n_float_register_parameters_c) { ++ // Put double in register ... ++ reg = farg_reg[freg]; ++ ++freg; ++ ++ // Argument i for i > 8 is placed on the stack even if it's ++ // placed in a register (if it's a double arg). Aix disassembly ++ // shows that xlC places these float args on the stack AND in ++ // a register. This is not documented, but we follow this ++ // convention, too. ++ if (arg >= Argument::n_regs_not_on_stack_c) { ++ // ... and on the stack. ++ guarantee(regs2 != NULL, "must pass float in register and stack slot"); ++ VMReg reg2 = VMRegImpl::stack2reg(stk); ++ regs2[i].set2(reg2); ++ stk += inc_stk_for_longdouble; ++ } ++ } else { ++ // Put double on stack. ++ reg = VMRegImpl::stack2reg(stk); ++ stk += inc_stk_for_longdouble; ++ } ++ regs[i].set2(reg); ++ break; ++ ++ case T_VOID: ++ // Do not count halves. ++ regs[i].set_bad(); ++ --arg; ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ } ++ ++ return round_to(stk, 2); ++} ++#endif // COMPILER2 ++ ++static address gen_c2i_adapter(MacroAssembler *masm, ++ int total_args_passed, ++ int comp_args_on_stack, ++ const BasicType *sig_bt, ++ const VMRegPair *regs, ++ Label& call_interpreter, ++ const Register& ientry) { ++ ++ address c2i_entrypoint; ++ ++ const Register sender_SP = R21_sender_SP; // == R21_tmp1 ++ const Register code = R22_tmp2; ++ //const Register ientry = R23_tmp3; ++ const Register value_regs[] = { R24_tmp4, R25_tmp5, R26_tmp6 }; ++ const int num_value_regs = sizeof(value_regs) / sizeof(Register); ++ int value_regs_index = 0; ++ ++ const Register return_pc = R27_tmp7; ++ const Register tmp = R28_tmp8; ++ ++ assert_different_registers(sender_SP, code, ientry, return_pc, tmp); ++ ++ // Adapter needs TOP_IJAVA_FRAME_ABI. ++ const int adapter_size = frame::top_ijava_frame_abi_size + ++ round_to(total_args_passed * wordSize, frame::alignment_in_bytes); ++ ++ // regular (verified) c2i entry point ++ c2i_entrypoint = __ pc(); ++ ++ // Does compiled code exists? If yes, patch the caller's callsite. ++ __ ld(code, method_(code)); ++ __ cmpdi(CCR0, code, 0); ++ __ ld(ientry, method_(interpreter_entry)); // preloaded ++ __ beq(CCR0, call_interpreter); ++ ++ ++ // Patch caller's callsite, method_(code) was not NULL which means that ++ // compiled code exists. ++ __ mflr(return_pc); ++ __ std(return_pc, _abi(lr), R1_SP); ++ RegisterSaver::push_frame_and_save_argument_registers(masm, tmp, adapter_size, total_args_passed, regs); ++ ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::fixup_callers_callsite), R19_method, return_pc); ++ ++ RegisterSaver::restore_argument_registers_and_pop_frame(masm, adapter_size, total_args_passed, regs); ++ __ ld(return_pc, _abi(lr), R1_SP); ++ __ ld(ientry, method_(interpreter_entry)); // preloaded ++ __ mtlr(return_pc); ++ ++ ++ // Call the interpreter. ++ __ BIND(call_interpreter); ++ __ mtctr(ientry); ++ ++ // Get a copy of the current SP for loading caller's arguments. ++ __ mr(sender_SP, R1_SP); ++ ++ // Add space for the adapter. ++ __ resize_frame(-adapter_size, R12_scratch2); ++ ++ int st_off = adapter_size - wordSize; ++ ++ // Write the args into the outgoing interpreter space. ++ for (int i = 0; i < total_args_passed; i++) { ++ VMReg r_1 = regs[i].first(); ++ VMReg r_2 = regs[i].second(); ++ if (!r_1->is_valid()) { ++ assert(!r_2->is_valid(), ""); ++ continue; ++ } ++ if (r_1->is_stack()) { ++ Register tmp_reg = value_regs[value_regs_index]; ++ value_regs_index = (value_regs_index + 1) % num_value_regs; ++ // The calling convention produces OptoRegs that ignore the out ++ // preserve area (JIT's ABI). We must account for it here. ++ int ld_off = (r_1->reg2stack() + SharedRuntime::out_preserve_stack_slots()) * VMRegImpl::stack_slot_size; ++ if (!r_2->is_valid()) { ++ __ lwz(tmp_reg, ld_off, sender_SP); ++ } else { ++ __ ld(tmp_reg, ld_off, sender_SP); ++ } ++ // Pretend stack targets were loaded into tmp_reg. ++ r_1 = tmp_reg->as_VMReg(); ++ } ++ ++ if (r_1->is_Register()) { ++ Register r = r_1->as_Register(); ++ if (!r_2->is_valid()) { ++ __ stw(r, st_off, R1_SP); ++ st_off-=wordSize; ++ } else { ++ // Longs are given 2 64-bit slots in the interpreter, but the ++ // data is passed in only 1 slot. ++ if (sig_bt[i] == T_LONG || sig_bt[i] == T_DOUBLE) { ++ DEBUG_ONLY( __ li(tmp, 0); __ std(tmp, st_off, R1_SP); ) ++ st_off-=wordSize; ++ } ++ __ std(r, st_off, R1_SP); ++ st_off-=wordSize; ++ } ++ } else { ++ assert(r_1->is_FloatRegister(), ""); ++ FloatRegister f = r_1->as_FloatRegister(); ++ if (!r_2->is_valid()) { ++ __ stfs(f, st_off, R1_SP); ++ st_off-=wordSize; ++ } else { ++ // In 64bit, doubles are given 2 64-bit slots in the interpreter, but the ++ // data is passed in only 1 slot. ++ // One of these should get known junk... ++ DEBUG_ONLY( __ li(tmp, 0); __ std(tmp, st_off, R1_SP); ) ++ st_off-=wordSize; ++ __ stfd(f, st_off, R1_SP); ++ st_off-=wordSize; ++ } ++ } ++ } ++ ++ // Jump to the interpreter just as if interpreter was doing it. ++ ++#ifdef CC_INTERP ++ const Register tos = R17_tos; ++#else ++ const Register tos = R15_esp; ++ __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R11_scratch1); ++#endif ++ ++ // load TOS ++ __ addi(tos, R1_SP, st_off); ++ ++ // Frame_manager expects initial_caller_sp (= SP without resize by c2i) in R21_tmp1. ++ assert(sender_SP == R21_sender_SP, "passing initial caller's SP in wrong register"); ++ __ bctr(); ++ ++ return c2i_entrypoint; ++} ++ ++static void gen_i2c_adapter(MacroAssembler *masm, ++ int total_args_passed, ++ int comp_args_on_stack, ++ const BasicType *sig_bt, ++ const VMRegPair *regs) { ++ ++ // Load method's entry-point from method. ++ __ ld(R12_scratch2, in_bytes(Method::from_compiled_offset()), R19_method); ++ __ mtctr(R12_scratch2); ++ ++ // We will only enter here from an interpreted frame and never from after ++ // passing thru a c2i. Azul allowed this but we do not. If we lose the ++ // race and use a c2i we will remain interpreted for the race loser(s). ++ // This removes all sorts of headaches on the x86 side and also eliminates ++ // the possibility of having c2i -> i2c -> c2i -> ... endless transitions. ++ ++ // Note: r13 contains the senderSP on entry. We must preserve it since ++ // we may do a i2c -> c2i transition if we lose a race where compiled ++ // code goes non-entrant while we get args ready. ++ // In addition we use r13 to locate all the interpreter args as ++ // we must align the stack to 16 bytes on an i2c entry else we ++ // lose alignment we expect in all compiled code and register ++ // save code can segv when fxsave instructions find improperly ++ // aligned stack pointer. ++ ++#ifdef CC_INTERP ++ const Register ld_ptr = R17_tos; ++#else ++ const Register ld_ptr = R15_esp; ++#endif ++ ++ const Register value_regs[] = { R22_tmp2, R23_tmp3, R24_tmp4, R25_tmp5, R26_tmp6 }; ++ const int num_value_regs = sizeof(value_regs) / sizeof(Register); ++ int value_regs_index = 0; ++ ++ int ld_offset = total_args_passed*wordSize; ++ ++ // Cut-out for having no stack args. Since up to 2 int/oop args are passed ++ // in registers, we will occasionally have no stack args. ++ int comp_words_on_stack = 0; ++ if (comp_args_on_stack) { ++ // Sig words on the stack are greater-than VMRegImpl::stack0. Those in ++ // registers are below. By subtracting stack0, we either get a negative ++ // number (all values in registers) or the maximum stack slot accessed. ++ ++ // Convert 4-byte c2 stack slots to words. ++ comp_words_on_stack = round_to(comp_args_on_stack*VMRegImpl::stack_slot_size, wordSize)>>LogBytesPerWord; ++ // Round up to miminum stack alignment, in wordSize. ++ comp_words_on_stack = round_to(comp_words_on_stack, 2); ++ __ resize_frame(-comp_words_on_stack * wordSize, R11_scratch1); ++ } ++ ++ // Now generate the shuffle code. Pick up all register args and move the ++ // rest through register value=Z_R12. ++ BLOCK_COMMENT("Shuffle arguments"); ++ for (int i = 0; i < total_args_passed; i++) { ++ if (sig_bt[i] == T_VOID) { ++ assert(i > 0 && (sig_bt[i-1] == T_LONG || sig_bt[i-1] == T_DOUBLE), "missing half"); ++ continue; ++ } ++ ++ // Pick up 0, 1 or 2 words from ld_ptr. ++ assert(!regs[i].second()->is_valid() || regs[i].first()->next() == regs[i].second(), ++ "scrambled load targets?"); ++ VMReg r_1 = regs[i].first(); ++ VMReg r_2 = regs[i].second(); ++ if (!r_1->is_valid()) { ++ assert(!r_2->is_valid(), ""); ++ continue; ++ } ++ if (r_1->is_FloatRegister()) { ++ if (!r_2->is_valid()) { ++ __ lfs(r_1->as_FloatRegister(), ld_offset, ld_ptr); ++ ld_offset-=wordSize; ++ } else { ++ // Skip the unused interpreter slot. ++ __ lfd(r_1->as_FloatRegister(), ld_offset-wordSize, ld_ptr); ++ ld_offset-=2*wordSize; ++ } ++ } else { ++ Register r; ++ if (r_1->is_stack()) { ++ // Must do a memory to memory move thru "value". ++ r = value_regs[value_regs_index]; ++ value_regs_index = (value_regs_index + 1) % num_value_regs; ++ } else { ++ r = r_1->as_Register(); ++ } ++ if (!r_2->is_valid()) { ++ // Not sure we need to do this but it shouldn't hurt. ++ if (sig_bt[i] == T_OBJECT || sig_bt[i] == T_ADDRESS || sig_bt[i] == T_ARRAY) { ++ __ ld(r, ld_offset, ld_ptr); ++ ld_offset-=wordSize; ++ } else { ++ __ lwz(r, ld_offset, ld_ptr); ++ ld_offset-=wordSize; ++ } ++ } else { ++ // In 64bit, longs are given 2 64-bit slots in the interpreter, but the ++ // data is passed in only 1 slot. ++ if (sig_bt[i] == T_LONG || sig_bt[i] == T_DOUBLE) { ++ ld_offset-=wordSize; ++ } ++ __ ld(r, ld_offset, ld_ptr); ++ ld_offset-=wordSize; ++ } ++ ++ if (r_1->is_stack()) { ++ // Now store value where the compiler expects it ++ int st_off = (r_1->reg2stack() + SharedRuntime::out_preserve_stack_slots())*VMRegImpl::stack_slot_size; ++ ++ if (sig_bt[i] == T_INT || sig_bt[i] == T_FLOAT ||sig_bt[i] == T_BOOLEAN || ++ sig_bt[i] == T_SHORT || sig_bt[i] == T_CHAR || sig_bt[i] == T_BYTE) { ++ __ stw(r, st_off, R1_SP); ++ } else { ++ __ std(r, st_off, R1_SP); ++ } ++ } ++ } ++ } ++ ++ BLOCK_COMMENT("Store method"); ++ // Store method into thread->callee_target. ++ // We might end up in handle_wrong_method if the callee is ++ // deoptimized as we race thru here. If that happens we don't want ++ // to take a safepoint because the caller frame will look ++ // interpreted and arguments are now "compiled" so it is much better ++ // to make this transition invisible to the stack walking ++ // code. Unfortunately if we try and find the callee by normal means ++ // a safepoint is possible. So we stash the desired callee in the ++ // thread and the vm will find there should this case occur. ++ __ std(R19_method, thread_(callee_target)); ++ ++ // Jump to the compiled code just as if compiled code was doing it. ++ __ bctr(); ++} ++ ++AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm, ++ int total_args_passed, ++ int comp_args_on_stack, ++ const BasicType *sig_bt, ++ const VMRegPair *regs, ++ AdapterFingerPrint* fingerprint) { ++ address i2c_entry; ++ address c2i_unverified_entry; ++ address c2i_entry; ++ ++ ++ // entry: i2c ++ ++ __ align(CodeEntryAlignment); ++ i2c_entry = __ pc(); ++ gen_i2c_adapter(masm, total_args_passed, comp_args_on_stack, sig_bt, regs); ++ ++ ++ // entry: c2i unverified ++ ++ __ align(CodeEntryAlignment); ++ BLOCK_COMMENT("c2i unverified entry"); ++ c2i_unverified_entry = __ pc(); ++ ++ // inline_cache contains a compiledICHolder ++ const Register ic = R19_method; ++ const Register ic_klass = R11_scratch1; ++ const Register receiver_klass = R12_scratch2; ++ const Register code = R21_tmp1; ++ const Register ientry = R23_tmp3; ++ ++ assert_different_registers(ic, ic_klass, receiver_klass, R3_ARG1, code, ientry); ++ assert(R11_scratch1 == R11, "need prologue scratch register"); ++ ++ Label call_interpreter; ++ ++ assert(!MacroAssembler::needs_explicit_null_check(oopDesc::klass_offset_in_bytes()), ++ "klass offset should reach into any page"); ++ // Check for NULL argument if we don't have implicit null checks. ++ if (!ImplicitNullChecks || !os::zero_page_read_protected()) { ++ if (TrapBasedNullChecks) { ++ __ trap_null_check(R3_ARG1); ++ } else { ++ Label valid; ++ __ cmpdi(CCR0, R3_ARG1, 0); ++ __ bne_predict_taken(CCR0, valid); ++ // We have a null argument, branch to ic_miss_stub. ++ __ b64_patchable((address)SharedRuntime::get_ic_miss_stub(), ++ relocInfo::runtime_call_type); ++ __ BIND(valid); ++ } ++ } ++ // Assume argument is not NULL, load klass from receiver. ++ __ load_klass(receiver_klass, R3_ARG1); ++ ++ __ ld(ic_klass, CompiledICHolder::holder_klass_offset(), ic); ++ ++ if (TrapBasedICMissChecks) { ++ __ trap_ic_miss_check(receiver_klass, ic_klass); ++ } else { ++ Label valid; ++ __ cmpd(CCR0, receiver_klass, ic_klass); ++ __ beq_predict_taken(CCR0, valid); ++ // We have an unexpected klass, branch to ic_miss_stub. ++ __ b64_patchable((address)SharedRuntime::get_ic_miss_stub(), ++ relocInfo::runtime_call_type); ++ __ BIND(valid); ++ } ++ ++ // Argument is valid and klass is as expected, continue. ++ ++ // Extract method from inline cache, verified entry point needs it. ++ __ ld(R19_method, CompiledICHolder::holder_method_offset(), ic); ++ assert(R19_method == ic, "the inline cache register is dead here"); ++ ++ __ ld(code, method_(code)); ++ __ cmpdi(CCR0, code, 0); ++ __ ld(ientry, method_(interpreter_entry)); // preloaded ++ __ beq_predict_taken(CCR0, call_interpreter); ++ ++ // Branch to ic_miss_stub. ++ __ b64_patchable((address)SharedRuntime::get_ic_miss_stub(), relocInfo::runtime_call_type); ++ ++ // entry: c2i ++ ++ c2i_entry = gen_c2i_adapter(masm, total_args_passed, comp_args_on_stack, sig_bt, regs, call_interpreter, ientry); ++ ++ return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry); ++} ++ ++#ifdef COMPILER2 ++// An oop arg. Must pass a handle not the oop itself. ++static void object_move(MacroAssembler* masm, ++ int frame_size_in_slots, ++ OopMap* oop_map, int oop_handle_offset, ++ bool is_receiver, int* receiver_offset, ++ VMRegPair src, VMRegPair dst, ++ Register r_caller_sp, Register r_temp_1, Register r_temp_2) { ++ assert(!is_receiver || (is_receiver && (*receiver_offset == -1)), ++ "receiver has already been moved"); ++ ++ // We must pass a handle. First figure out the location we use as a handle. ++ ++ if (src.first()->is_stack()) { ++ // stack to stack or reg ++ ++ const Register r_handle = dst.first()->is_stack() ? r_temp_1 : dst.first()->as_Register(); ++ Label skip; ++ const int oop_slot_in_callers_frame = reg2slot(src.first()); ++ ++ guarantee(!is_receiver, "expecting receiver in register"); ++ oop_map->set_oop(VMRegImpl::stack2reg(oop_slot_in_callers_frame + frame_size_in_slots)); ++ ++ __ addi(r_handle, r_caller_sp, reg2offset(src.first())); ++ __ ld( r_temp_2, reg2offset(src.first()), r_caller_sp); ++ __ cmpdi(CCR0, r_temp_2, 0); ++ __ bne(CCR0, skip); ++ // Use a NULL handle if oop is NULL. ++ __ li(r_handle, 0); ++ __ bind(skip); ++ ++ if (dst.first()->is_stack()) { ++ // stack to stack ++ __ std(r_handle, reg2offset(dst.first()), R1_SP); ++ } else { ++ // stack to reg ++ // Nothing to do, r_handle is already the dst register. ++ } ++ } else { ++ // reg to stack or reg ++ const Register r_oop = src.first()->as_Register(); ++ const Register r_handle = dst.first()->is_stack() ? r_temp_1 : dst.first()->as_Register(); ++ const int oop_slot = (r_oop->encoding()-R3_ARG1->encoding()) * VMRegImpl::slots_per_word ++ + oop_handle_offset; // in slots ++ const int oop_offset = oop_slot * VMRegImpl::stack_slot_size; ++ Label skip; ++ ++ if (is_receiver) { ++ *receiver_offset = oop_offset; ++ } ++ oop_map->set_oop(VMRegImpl::stack2reg(oop_slot)); ++ ++ __ std( r_oop, oop_offset, R1_SP); ++ __ addi(r_handle, R1_SP, oop_offset); ++ ++ __ cmpdi(CCR0, r_oop, 0); ++ __ bne(CCR0, skip); ++ // Use a NULL handle if oop is NULL. ++ __ li(r_handle, 0); ++ __ bind(skip); ++ ++ if (dst.first()->is_stack()) { ++ // reg to stack ++ __ std(r_handle, reg2offset(dst.first()), R1_SP); ++ } else { ++ // reg to reg ++ // Nothing to do, r_handle is already the dst register. ++ } ++ } ++} ++ ++static void int_move(MacroAssembler*masm, ++ VMRegPair src, VMRegPair dst, ++ Register r_caller_sp, Register r_temp) { ++ assert(src.first()->is_valid() && src.second() == src.first()->next(), "incoming must be long-int"); ++ assert(dst.first()->is_valid() && dst.second() == dst.first()->next(), "outgoing must be long"); ++ ++ if (src.first()->is_stack()) { ++ if (dst.first()->is_stack()) { ++ // stack to stack ++ __ lwa(r_temp, reg2offset(src.first()), r_caller_sp); ++ __ std(r_temp, reg2offset(dst.first()), R1_SP); ++ } else { ++ // stack to reg ++ __ lwa(dst.first()->as_Register(), reg2offset(src.first()), r_caller_sp); ++ } ++ } else if (dst.first()->is_stack()) { ++ // reg to stack ++ __ extsw(r_temp, src.first()->as_Register()); ++ __ std(r_temp, reg2offset(dst.first()), R1_SP); ++ } else { ++ // reg to reg ++ __ extsw(dst.first()->as_Register(), src.first()->as_Register()); ++ } ++} ++ ++static void long_move(MacroAssembler*masm, ++ VMRegPair src, VMRegPair dst, ++ Register r_caller_sp, Register r_temp) { ++ assert(src.first()->is_valid() && src.second() == src.first()->next(), "incoming must be long"); ++ assert(dst.first()->is_valid() && dst.second() == dst.first()->next(), "outgoing must be long"); ++ ++ if (src.first()->is_stack()) { ++ if (dst.first()->is_stack()) { ++ // stack to stack ++ __ ld( r_temp, reg2offset(src.first()), r_caller_sp); ++ __ std(r_temp, reg2offset(dst.first()), R1_SP); ++ } else { ++ // stack to reg ++ __ ld(dst.first()->as_Register(), reg2offset(src.first()), r_caller_sp); ++ } ++ } else if (dst.first()->is_stack()) { ++ // reg to stack ++ __ std(src.first()->as_Register(), reg2offset(dst.first()), R1_SP); ++ } else { ++ // reg to reg ++ if (dst.first()->as_Register() != src.first()->as_Register()) ++ __ mr(dst.first()->as_Register(), src.first()->as_Register()); ++ } ++} ++ ++static void float_move(MacroAssembler*masm, ++ VMRegPair src, VMRegPair dst, ++ Register r_caller_sp, Register r_temp) { ++ assert(src.first()->is_valid() && !src.second()->is_valid(), "incoming must be float"); ++ assert(dst.first()->is_valid() && !dst.second()->is_valid(), "outgoing must be float"); ++ ++ if (src.first()->is_stack()) { ++ if (dst.first()->is_stack()) { ++ // stack to stack ++ __ lwz(r_temp, reg2offset(src.first()), r_caller_sp); ++ __ stw(r_temp, reg2offset(dst.first()), R1_SP); ++ } else { ++ // stack to reg ++ __ lfs(dst.first()->as_FloatRegister(), reg2offset(src.first()), r_caller_sp); ++ } ++ } else if (dst.first()->is_stack()) { ++ // reg to stack ++ __ stfs(src.first()->as_FloatRegister(), reg2offset(dst.first()), R1_SP); ++ } else { ++ // reg to reg ++ if (dst.first()->as_FloatRegister() != src.first()->as_FloatRegister()) ++ __ fmr(dst.first()->as_FloatRegister(), src.first()->as_FloatRegister()); ++ } ++} ++ ++static void double_move(MacroAssembler*masm, ++ VMRegPair src, VMRegPair dst, ++ Register r_caller_sp, Register r_temp) { ++ assert(src.first()->is_valid() && src.second() == src.first()->next(), "incoming must be double"); ++ assert(dst.first()->is_valid() && dst.second() == dst.first()->next(), "outgoing must be double"); ++ ++ if (src.first()->is_stack()) { ++ if (dst.first()->is_stack()) { ++ // stack to stack ++ __ ld( r_temp, reg2offset(src.first()), r_caller_sp); ++ __ std(r_temp, reg2offset(dst.first()), R1_SP); ++ } else { ++ // stack to reg ++ __ lfd(dst.first()->as_FloatRegister(), reg2offset(src.first()), r_caller_sp); ++ } ++ } else if (dst.first()->is_stack()) { ++ // reg to stack ++ __ stfd(src.first()->as_FloatRegister(), reg2offset(dst.first()), R1_SP); ++ } else { ++ // reg to reg ++ if (dst.first()->as_FloatRegister() != src.first()->as_FloatRegister()) ++ __ fmr(dst.first()->as_FloatRegister(), src.first()->as_FloatRegister()); ++ } ++} ++ ++void SharedRuntime::save_native_result(MacroAssembler *masm, BasicType ret_type, int frame_slots) { ++ switch (ret_type) { ++ case T_BOOLEAN: ++ case T_CHAR: ++ case T_BYTE: ++ case T_SHORT: ++ case T_INT: ++ __ stw (R3_RET, frame_slots*VMRegImpl::stack_slot_size, R1_SP); ++ break; ++ case T_ARRAY: ++ case T_OBJECT: ++ case T_LONG: ++ __ std (R3_RET, frame_slots*VMRegImpl::stack_slot_size, R1_SP); ++ break; ++ case T_FLOAT: ++ __ stfs(F1_RET, frame_slots*VMRegImpl::stack_slot_size, R1_SP); ++ break; ++ case T_DOUBLE: ++ __ stfd(F1_RET, frame_slots*VMRegImpl::stack_slot_size, R1_SP); ++ break; ++ case T_VOID: ++ break; ++ default: ++ ShouldNotReachHere(); ++ break; ++ } ++} ++ ++void SharedRuntime::restore_native_result(MacroAssembler *masm, BasicType ret_type, int frame_slots) { ++ switch (ret_type) { ++ case T_BOOLEAN: ++ case T_CHAR: ++ case T_BYTE: ++ case T_SHORT: ++ case T_INT: ++ __ lwz(R3_RET, frame_slots*VMRegImpl::stack_slot_size, R1_SP); ++ break; ++ case T_ARRAY: ++ case T_OBJECT: ++ case T_LONG: ++ __ ld (R3_RET, frame_slots*VMRegImpl::stack_slot_size, R1_SP); ++ break; ++ case T_FLOAT: ++ __ lfs(F1_RET, frame_slots*VMRegImpl::stack_slot_size, R1_SP); ++ break; ++ case T_DOUBLE: ++ __ lfd(F1_RET, frame_slots*VMRegImpl::stack_slot_size, R1_SP); ++ break; ++ case T_VOID: ++ break; ++ default: ++ ShouldNotReachHere(); ++ break; ++ } ++} ++ ++static void save_or_restore_arguments(MacroAssembler* masm, ++ const int stack_slots, ++ const int total_in_args, ++ const int arg_save_area, ++ OopMap* map, ++ VMRegPair* in_regs, ++ BasicType* in_sig_bt) { ++ // If map is non-NULL then the code should store the values, ++ // otherwise it should load them. ++ int slot = arg_save_area; ++ // Save down double word first. ++ for (int i = 0; i < total_in_args; i++) { ++ if (in_regs[i].first()->is_FloatRegister() && in_sig_bt[i] == T_DOUBLE) { ++ int offset = slot * VMRegImpl::stack_slot_size; ++ slot += VMRegImpl::slots_per_word; ++ assert(slot <= stack_slots, "overflow (after DOUBLE stack slot)"); ++ if (map != NULL) { ++ __ stfd(in_regs[i].first()->as_FloatRegister(), offset, R1_SP); ++ } else { ++ __ lfd(in_regs[i].first()->as_FloatRegister(), offset, R1_SP); ++ } ++ } else if (in_regs[i].first()->is_Register() && ++ (in_sig_bt[i] == T_LONG || in_sig_bt[i] == T_ARRAY)) { ++ int offset = slot * VMRegImpl::stack_slot_size; ++ if (map != NULL) { ++ __ std(in_regs[i].first()->as_Register(), offset, R1_SP); ++ if (in_sig_bt[i] == T_ARRAY) { ++ map->set_oop(VMRegImpl::stack2reg(slot)); ++ } ++ } else { ++ __ ld(in_regs[i].first()->as_Register(), offset, R1_SP); ++ } ++ slot += VMRegImpl::slots_per_word; ++ assert(slot <= stack_slots, "overflow (after LONG/ARRAY stack slot)"); ++ } ++ } ++ // Save or restore single word registers. ++ for (int i = 0; i < total_in_args; i++) { ++ // PPC64: pass ints as longs: must only deal with floats here. ++ if (in_regs[i].first()->is_FloatRegister()) { ++ if (in_sig_bt[i] == T_FLOAT) { ++ int offset = slot * VMRegImpl::stack_slot_size; ++ slot++; ++ assert(slot <= stack_slots, "overflow (after FLOAT stack slot)"); ++ if (map != NULL) { ++ __ stfs(in_regs[i].first()->as_FloatRegister(), offset, R1_SP); ++ } else { ++ __ lfs(in_regs[i].first()->as_FloatRegister(), offset, R1_SP); ++ } ++ } ++ } else if (in_regs[i].first()->is_stack()) { ++ if (in_sig_bt[i] == T_ARRAY && map != NULL) { ++ int offset_in_older_frame = in_regs[i].first()->reg2stack() + SharedRuntime::out_preserve_stack_slots(); ++ map->set_oop(VMRegImpl::stack2reg(offset_in_older_frame + stack_slots)); ++ } ++ } ++ } ++} ++ ++// Check GC_locker::needs_gc and enter the runtime if it's true. This ++// keeps a new JNI critical region from starting until a GC has been ++// forced. Save down any oops in registers and describe them in an ++// OopMap. ++static void check_needs_gc_for_critical_native(MacroAssembler* masm, ++ const int stack_slots, ++ const int total_in_args, ++ const int arg_save_area, ++ OopMapSet* oop_maps, ++ VMRegPair* in_regs, ++ BasicType* in_sig_bt, ++ Register tmp_reg ) { ++ __ block_comment("check GC_locker::needs_gc"); ++ Label cont; ++ __ lbz(tmp_reg, (RegisterOrConstant)(intptr_t)GC_locker::needs_gc_address()); ++ __ cmplwi(CCR0, tmp_reg, 0); ++ __ beq(CCR0, cont); ++ ++ // Save down any values that are live in registers and call into the ++ // runtime to halt for a GC. ++ OopMap* map = new OopMap(stack_slots * 2, 0 /* arg_slots*/); ++ save_or_restore_arguments(masm, stack_slots, total_in_args, ++ arg_save_area, map, in_regs, in_sig_bt); ++ ++ __ mr(R3_ARG1, R16_thread); ++ __ set_last_Java_frame(R1_SP, noreg); ++ ++ __ block_comment("block_for_jni_critical"); ++ address entry_point = CAST_FROM_FN_PTR(address, SharedRuntime::block_for_jni_critical); ++#if defined(ABI_ELFv2) ++ __ call_c(entry_point, relocInfo::runtime_call_type); ++#else ++ __ call_c(CAST_FROM_FN_PTR(FunctionDescriptor*, entry_point), relocInfo::runtime_call_type); ++#endif ++ address start = __ pc() - __ offset(), ++ calls_return_pc = __ last_calls_return_pc(); ++ oop_maps->add_gc_map(calls_return_pc - start, map); ++ ++ __ reset_last_Java_frame(); ++ ++ // Reload all the register arguments. ++ save_or_restore_arguments(masm, stack_slots, total_in_args, ++ arg_save_area, NULL, in_regs, in_sig_bt); ++ ++ __ BIND(cont); ++ ++#ifdef ASSERT ++ if (StressCriticalJNINatives) { ++ // Stress register saving. ++ OopMap* map = new OopMap(stack_slots * 2, 0 /* arg_slots*/); ++ save_or_restore_arguments(masm, stack_slots, total_in_args, ++ arg_save_area, map, in_regs, in_sig_bt); ++ // Destroy argument registers. ++ for (int i = 0; i < total_in_args; i++) { ++ if (in_regs[i].first()->is_Register()) { ++ const Register reg = in_regs[i].first()->as_Register(); ++ __ neg(reg, reg); ++ } else if (in_regs[i].first()->is_FloatRegister()) { ++ __ fneg(in_regs[i].first()->as_FloatRegister(), in_regs[i].first()->as_FloatRegister()); ++ } ++ } ++ ++ save_or_restore_arguments(masm, stack_slots, total_in_args, ++ arg_save_area, NULL, in_regs, in_sig_bt); ++ } ++#endif ++} ++ ++static void move_ptr(MacroAssembler* masm, VMRegPair src, VMRegPair dst, Register r_caller_sp, Register r_temp) { ++ if (src.first()->is_stack()) { ++ if (dst.first()->is_stack()) { ++ // stack to stack ++ __ ld(r_temp, reg2offset(src.first()), r_caller_sp); ++ __ std(r_temp, reg2offset(dst.first()), R1_SP); ++ } else { ++ // stack to reg ++ __ ld(dst.first()->as_Register(), reg2offset(src.first()), r_caller_sp); ++ } ++ } else if (dst.first()->is_stack()) { ++ // reg to stack ++ __ std(src.first()->as_Register(), reg2offset(dst.first()), R1_SP); ++ } else { ++ if (dst.first() != src.first()) { ++ __ mr(dst.first()->as_Register(), src.first()->as_Register()); ++ } ++ } ++} ++ ++// Unpack an array argument into a pointer to the body and the length ++// if the array is non-null, otherwise pass 0 for both. ++static void unpack_array_argument(MacroAssembler* masm, VMRegPair reg, BasicType in_elem_type, ++ VMRegPair body_arg, VMRegPair length_arg, Register r_caller_sp, ++ Register tmp_reg, Register tmp2_reg) { ++ assert(!body_arg.first()->is_Register() || body_arg.first()->as_Register() != tmp_reg, ++ "possible collision"); ++ assert(!length_arg.first()->is_Register() || length_arg.first()->as_Register() != tmp_reg, ++ "possible collision"); ++ ++ // Pass the length, ptr pair. ++ Label set_out_args; ++ VMRegPair tmp, tmp2; ++ tmp.set_ptr(tmp_reg->as_VMReg()); ++ tmp2.set_ptr(tmp2_reg->as_VMReg()); ++ if (reg.first()->is_stack()) { ++ // Load the arg up from the stack. ++ move_ptr(masm, reg, tmp, r_caller_sp, /*unused*/ R0); ++ reg = tmp; ++ } ++ __ li(tmp2_reg, 0); // Pass zeros if Array=null. ++ if (tmp_reg != reg.first()->as_Register()) __ li(tmp_reg, 0); ++ __ cmpdi(CCR0, reg.first()->as_Register(), 0); ++ __ beq(CCR0, set_out_args); ++ __ lwa(tmp2_reg, arrayOopDesc::length_offset_in_bytes(), reg.first()->as_Register()); ++ __ addi(tmp_reg, reg.first()->as_Register(), arrayOopDesc::base_offset_in_bytes(in_elem_type)); ++ __ bind(set_out_args); ++ move_ptr(masm, tmp, body_arg, r_caller_sp, /*unused*/ R0); ++ move_ptr(masm, tmp2, length_arg, r_caller_sp, /*unused*/ R0); // Same as move32_64 on PPC64. ++} ++ ++static void verify_oop_args(MacroAssembler* masm, ++ methodHandle method, ++ const BasicType* sig_bt, ++ const VMRegPair* regs) { ++ Register temp_reg = R19_method; // not part of any compiled calling seq ++ if (VerifyOops) { ++ for (int i = 0; i < method->size_of_parameters(); i++) { ++ if (sig_bt[i] == T_OBJECT || ++ sig_bt[i] == T_ARRAY) { ++ VMReg r = regs[i].first(); ++ assert(r->is_valid(), "bad oop arg"); ++ if (r->is_stack()) { ++ __ ld(temp_reg, reg2offset(r), R1_SP); ++ __ verify_oop(temp_reg); ++ } else { ++ __ verify_oop(r->as_Register()); ++ } ++ } ++ } ++ } ++} ++ ++static void gen_special_dispatch(MacroAssembler* masm, ++ methodHandle method, ++ const BasicType* sig_bt, ++ const VMRegPair* regs) { ++ verify_oop_args(masm, method, sig_bt, regs); ++ vmIntrinsics::ID iid = method->intrinsic_id(); ++ ++ // Now write the args into the outgoing interpreter space ++ bool has_receiver = false; ++ Register receiver_reg = noreg; ++ int member_arg_pos = -1; ++ Register member_reg = noreg; ++ int ref_kind = MethodHandles::signature_polymorphic_intrinsic_ref_kind(iid); ++ if (ref_kind != 0) { ++ member_arg_pos = method->size_of_parameters() - 1; // trailing MemberName argument ++ member_reg = R19_method; // known to be free at this point ++ has_receiver = MethodHandles::ref_kind_has_receiver(ref_kind); ++ } else if (iid == vmIntrinsics::_invokeBasic) { ++ has_receiver = true; ++ } else { ++ fatal(err_msg_res("unexpected intrinsic id %d", iid)); ++ } ++ ++ if (member_reg != noreg) { ++ // Load the member_arg into register, if necessary. ++ SharedRuntime::check_member_name_argument_is_last_argument(method, sig_bt, regs); ++ VMReg r = regs[member_arg_pos].first(); ++ if (r->is_stack()) { ++ __ ld(member_reg, reg2offset(r), R1_SP); ++ } else { ++ // no data motion is needed ++ member_reg = r->as_Register(); ++ } ++ } ++ ++ if (has_receiver) { ++ // Make sure the receiver is loaded into a register. ++ assert(method->size_of_parameters() > 0, "oob"); ++ assert(sig_bt[0] == T_OBJECT, "receiver argument must be an object"); ++ VMReg r = regs[0].first(); ++ assert(r->is_valid(), "bad receiver arg"); ++ if (r->is_stack()) { ++ // Porting note: This assumes that compiled calling conventions always ++ // pass the receiver oop in a register. If this is not true on some ++ // platform, pick a temp and load the receiver from stack. ++ fatal("receiver always in a register"); ++ receiver_reg = R11_scratch1; // TODO (hs24): is R11_scratch1 really free at this point? ++ __ ld(receiver_reg, reg2offset(r), R1_SP); ++ } else { ++ // no data motion is needed ++ receiver_reg = r->as_Register(); ++ } ++ } ++ ++ // Figure out which address we are really jumping to: ++ MethodHandles::generate_method_handle_dispatch(masm, iid, ++ receiver_reg, member_reg, /*for_compiler_entry:*/ true); ++} ++ ++#endif // COMPILER2 ++ ++// --------------------------------------------------------------------------- ++// Generate a native wrapper for a given method. The method takes arguments ++// in the Java compiled code convention, marshals them to the native ++// convention (handlizes oops, etc), transitions to native, makes the call, ++// returns to java state (possibly blocking), unhandlizes any result and ++// returns. ++// ++// Critical native functions are a shorthand for the use of ++// GetPrimtiveArrayCritical and disallow the use of any other JNI ++// functions. The wrapper is expected to unpack the arguments before ++// passing them to the callee and perform checks before and after the ++// native call to ensure that they GC_locker ++// lock_critical/unlock_critical semantics are followed. Some other ++// parts of JNI setup are skipped like the tear down of the JNI handle ++// block and the check for pending exceptions it's impossible for them ++// to be thrown. ++// ++// They are roughly structured like this: ++// if (GC_locker::needs_gc()) ++// SharedRuntime::block_for_jni_critical(); ++// tranistion to thread_in_native ++// unpack arrray arguments and call native entry point ++// check for safepoint in progress ++// check if any thread suspend flags are set ++// call into JVM and possible unlock the JNI critical ++// if a GC was suppressed while in the critical native. ++// transition back to thread_in_Java ++// return to caller ++// ++nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, ++ methodHandle method, ++ int compile_id, ++ BasicType *in_sig_bt, ++ VMRegPair *in_regs, ++ BasicType ret_type) { ++#ifdef COMPILER2 ++ if (method->is_method_handle_intrinsic()) { ++ vmIntrinsics::ID iid = method->intrinsic_id(); ++ intptr_t start = (intptr_t)__ pc(); ++ int vep_offset = ((intptr_t)__ pc()) - start; ++ gen_special_dispatch(masm, ++ method, ++ in_sig_bt, ++ in_regs); ++ int frame_complete = ((intptr_t)__ pc()) - start; // not complete, period ++ __ flush(); ++ int stack_slots = SharedRuntime::out_preserve_stack_slots(); // no out slots at all, actually ++ return nmethod::new_native_nmethod(method, ++ compile_id, ++ masm->code(), ++ vep_offset, ++ frame_complete, ++ stack_slots / VMRegImpl::slots_per_word, ++ in_ByteSize(-1), ++ in_ByteSize(-1), ++ (OopMapSet*)NULL); ++ } ++ ++ bool is_critical_native = true; ++ address native_func = method->critical_native_function(); ++ if (native_func == NULL) { ++ native_func = method->native_function(); ++ is_critical_native = false; ++ } ++ assert(native_func != NULL, "must have function"); ++ ++ // First, create signature for outgoing C call ++ // -------------------------------------------------------------------------- ++ ++ int total_in_args = method->size_of_parameters(); ++ // We have received a description of where all the java args are located ++ // on entry to the wrapper. We need to convert these args to where ++ // the jni function will expect them. To figure out where they go ++ // we convert the java signature to a C signature by inserting ++ // the hidden arguments as arg[0] and possibly arg[1] (static method) ++ // ++ // Additionally, on ppc64 we must convert integers to longs in the C ++ // signature. We do this in advance in order to have no trouble with ++ // indexes into the bt-arrays. ++ // So convert the signature and registers now, and adjust the total number ++ // of in-arguments accordingly. ++ int i2l_argcnt = convert_ints_to_longints_argcnt(total_in_args, in_sig_bt); // PPC64: pass ints as longs. ++ ++ // Calculate the total number of C arguments and create arrays for the ++ // signature and the outgoing registers. ++ // On ppc64, we have two arrays for the outgoing registers, because ++ // some floating-point arguments must be passed in registers _and_ ++ // in stack locations. ++ bool method_is_static = method->is_static(); ++ int total_c_args = i2l_argcnt; ++ ++ if (!is_critical_native) { ++ int n_hidden_args = method_is_static ? 2 : 1; ++ total_c_args += n_hidden_args; ++ } else { ++ // No JNIEnv*, no this*, but unpacked arrays (base+length). ++ for (int i = 0; i < total_in_args; i++) { ++ if (in_sig_bt[i] == T_ARRAY) { ++ total_c_args += 2; // PPC64: T_LONG, T_INT, T_ADDRESS (see convert_ints_to_longints and c_calling_convention) ++ } ++ } ++ } ++ ++ BasicType *out_sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_c_args); ++ VMRegPair *out_regs = NEW_RESOURCE_ARRAY(VMRegPair, total_c_args); ++ VMRegPair *out_regs2 = NEW_RESOURCE_ARRAY(VMRegPair, total_c_args); ++ BasicType* in_elem_bt = NULL; ++ ++ // Create the signature for the C call: ++ // 1) add the JNIEnv* ++ // 2) add the class if the method is static ++ // 3) copy the rest of the incoming signature (shifted by the number of ++ // hidden arguments). ++ ++ int argc = 0; ++ if (!is_critical_native) { ++ convert_ints_to_longints(i2l_argcnt, total_in_args, in_sig_bt, in_regs); // PPC64: pass ints as longs. ++ ++ out_sig_bt[argc++] = T_ADDRESS; ++ if (method->is_static()) { ++ out_sig_bt[argc++] = T_OBJECT; ++ } ++ ++ for (int i = 0; i < total_in_args ; i++ ) { ++ out_sig_bt[argc++] = in_sig_bt[i]; ++ } ++ } else { ++ Thread* THREAD = Thread::current(); ++ in_elem_bt = NEW_RESOURCE_ARRAY(BasicType, i2l_argcnt); ++ SignatureStream ss(method->signature()); ++ int o = 0; ++ for (int i = 0; i < total_in_args ; i++, o++) { ++ if (in_sig_bt[i] == T_ARRAY) { ++ // Arrays are passed as int, elem* pair ++ Symbol* atype = ss.as_symbol(CHECK_NULL); ++ const char* at = atype->as_C_string(); ++ if (strlen(at) == 2) { ++ assert(at[0] == '[', "must be"); ++ switch (at[1]) { ++ case 'B': in_elem_bt[o] = T_BYTE; break; ++ case 'C': in_elem_bt[o] = T_CHAR; break; ++ case 'D': in_elem_bt[o] = T_DOUBLE; break; ++ case 'F': in_elem_bt[o] = T_FLOAT; break; ++ case 'I': in_elem_bt[o] = T_INT; break; ++ case 'J': in_elem_bt[o] = T_LONG; break; ++ case 'S': in_elem_bt[o] = T_SHORT; break; ++ case 'Z': in_elem_bt[o] = T_BOOLEAN; break; ++ default: ShouldNotReachHere(); ++ } ++ } ++ } else { ++ in_elem_bt[o] = T_VOID; ++ switch(in_sig_bt[i]) { // PPC64: pass ints as longs. ++ case T_BOOLEAN: ++ case T_CHAR: ++ case T_BYTE: ++ case T_SHORT: ++ case T_INT: in_elem_bt[++o] = T_VOID; break; ++ default: break; ++ } ++ } ++ if (in_sig_bt[i] != T_VOID) { ++ assert(in_sig_bt[i] == ss.type(), "must match"); ++ ss.next(); ++ } ++ } ++ assert(i2l_argcnt==o, "must match"); ++ ++ convert_ints_to_longints(i2l_argcnt, total_in_args, in_sig_bt, in_regs); // PPC64: pass ints as longs. ++ ++ for (int i = 0; i < total_in_args ; i++ ) { ++ if (in_sig_bt[i] == T_ARRAY) { ++ // Arrays are passed as int, elem* pair. ++ out_sig_bt[argc++] = T_LONG; // PPC64: pass ints as longs. ++ out_sig_bt[argc++] = T_INT; ++ out_sig_bt[argc++] = T_ADDRESS; ++ } else { ++ out_sig_bt[argc++] = in_sig_bt[i]; ++ } ++ } ++ } ++ ++ ++ // Compute the wrapper's frame size. ++ // -------------------------------------------------------------------------- ++ ++ // Now figure out where the args must be stored and how much stack space ++ // they require. ++ // ++ // Compute framesize for the wrapper. We need to handlize all oops in ++ // incoming registers. ++ // ++ // Calculate the total number of stack slots we will need: ++ // 1) abi requirements ++ // 2) outgoing arguments ++ // 3) space for inbound oop handle area ++ // 4) space for handlizing a klass if static method ++ // 5) space for a lock if synchronized method ++ // 6) workspace for saving return values, int <-> float reg moves, etc. ++ // 7) alignment ++ // ++ // Layout of the native wrapper frame: ++ // (stack grows upwards, memory grows downwards) ++ // ++ // NW [ABI_REG_ARGS] <-- 1) R1_SP ++ // [outgoing arguments] <-- 2) R1_SP + out_arg_slot_offset ++ // [oopHandle area] <-- 3) R1_SP + oop_handle_offset (save area for critical natives) ++ // klass <-- 4) R1_SP + klass_offset ++ // lock <-- 5) R1_SP + lock_offset ++ // [workspace] <-- 6) R1_SP + workspace_offset ++ // [alignment] (optional) <-- 7) ++ // caller [JIT_TOP_ABI_48] <-- r_callers_sp ++ // ++ // - *_slot_offset Indicates offset from SP in number of stack slots. ++ // - *_offset Indicates offset from SP in bytes. ++ ++ int stack_slots = c_calling_convention(out_sig_bt, out_regs, out_regs2, total_c_args) // 1+2) ++ + SharedRuntime::out_preserve_stack_slots(); // See c_calling_convention. ++ ++ // Now the space for the inbound oop handle area. ++ int total_save_slots = num_java_iarg_registers * VMRegImpl::slots_per_word; ++ if (is_critical_native) { ++ // Critical natives may have to call out so they need a save area ++ // for register arguments. ++ int double_slots = 0; ++ int single_slots = 0; ++ for (int i = 0; i < total_in_args; i++) { ++ if (in_regs[i].first()->is_Register()) { ++ const Register reg = in_regs[i].first()->as_Register(); ++ switch (in_sig_bt[i]) { ++ case T_BOOLEAN: ++ case T_BYTE: ++ case T_SHORT: ++ case T_CHAR: ++ case T_INT: /*single_slots++;*/ break; // PPC64: pass ints as longs. ++ case T_ARRAY: ++ case T_LONG: double_slots++; break; ++ default: ShouldNotReachHere(); ++ } ++ } else if (in_regs[i].first()->is_FloatRegister()) { ++ switch (in_sig_bt[i]) { ++ case T_FLOAT: single_slots++; break; ++ case T_DOUBLE: double_slots++; break; ++ default: ShouldNotReachHere(); ++ } ++ } ++ } ++ total_save_slots = double_slots * 2 + round_to(single_slots, 2); // round to even ++ } ++ ++ int oop_handle_slot_offset = stack_slots; ++ stack_slots += total_save_slots; // 3) ++ ++ int klass_slot_offset = 0; ++ int klass_offset = -1; ++ if (method_is_static && !is_critical_native) { // 4) ++ klass_slot_offset = stack_slots; ++ klass_offset = klass_slot_offset * VMRegImpl::stack_slot_size; ++ stack_slots += VMRegImpl::slots_per_word; ++ } ++ ++ int lock_slot_offset = 0; ++ int lock_offset = -1; ++ if (method->is_synchronized()) { // 5) ++ lock_slot_offset = stack_slots; ++ lock_offset = lock_slot_offset * VMRegImpl::stack_slot_size; ++ stack_slots += VMRegImpl::slots_per_word; ++ } ++ ++ int workspace_slot_offset = stack_slots; // 6) ++ stack_slots += 2; ++ ++ // Now compute actual number of stack words we need. ++ // Rounding to make stack properly aligned. ++ stack_slots = round_to(stack_slots, // 7) ++ frame::alignment_in_bytes / VMRegImpl::stack_slot_size); ++ int frame_size_in_bytes = stack_slots * VMRegImpl::stack_slot_size; ++ ++ ++ // Now we can start generating code. ++ // -------------------------------------------------------------------------- ++ ++ intptr_t start_pc = (intptr_t)__ pc(); ++ intptr_t vep_start_pc; ++ intptr_t frame_done_pc; ++ intptr_t oopmap_pc; ++ ++ Label ic_miss; ++ Label handle_pending_exception; ++ ++ Register r_callers_sp = R21; ++ Register r_temp_1 = R22; ++ Register r_temp_2 = R23; ++ Register r_temp_3 = R24; ++ Register r_temp_4 = R25; ++ Register r_temp_5 = R26; ++ Register r_temp_6 = R27; ++ Register r_return_pc = R28; ++ ++ Register r_carg1_jnienv = noreg; ++ Register r_carg2_classorobject = noreg; ++ if (!is_critical_native) { ++ r_carg1_jnienv = out_regs[0].first()->as_Register(); ++ r_carg2_classorobject = out_regs[1].first()->as_Register(); ++ } ++ ++ ++ // Generate the Unverified Entry Point (UEP). ++ // -------------------------------------------------------------------------- ++ assert(start_pc == (intptr_t)__ pc(), "uep must be at start"); ++ ++ // Check ic: object class == cached class? ++ if (!method_is_static) { ++ Register ic = as_Register(Matcher::inline_cache_reg_encode()); ++ Register receiver_klass = r_temp_1; ++ ++ __ cmpdi(CCR0, R3_ARG1, 0); ++ __ beq(CCR0, ic_miss); ++ __ verify_oop(R3_ARG1); ++ __ load_klass(receiver_klass, R3_ARG1); ++ ++ __ cmpd(CCR0, receiver_klass, ic); ++ __ bne(CCR0, ic_miss); ++ } ++ ++ ++ // Generate the Verified Entry Point (VEP). ++ // -------------------------------------------------------------------------- ++ vep_start_pc = (intptr_t)__ pc(); ++ ++ __ save_LR_CR(r_temp_1); ++ __ generate_stack_overflow_check(frame_size_in_bytes); // Check before creating frame. ++ __ mr(r_callers_sp, R1_SP); // Remember frame pointer. ++ __ push_frame(frame_size_in_bytes, r_temp_1); // Push the c2n adapter's frame. ++ frame_done_pc = (intptr_t)__ pc(); ++ ++ // Native nmethod wrappers never take possesion of the oop arguments. ++ // So the caller will gc the arguments. ++ // The only thing we need an oopMap for is if the call is static. ++ // ++ // An OopMap for lock (and class if static), and one for the VM call itself. ++ OopMapSet *oop_maps = new OopMapSet(); ++ OopMap *oop_map = new OopMap(stack_slots * 2, 0 /* arg_slots*/); ++ ++ if (is_critical_native) { ++ check_needs_gc_for_critical_native(masm, stack_slots, total_in_args, oop_handle_slot_offset, oop_maps, in_regs, in_sig_bt, r_temp_1); ++ } ++ ++ // Move arguments from register/stack to register/stack. ++ // -------------------------------------------------------------------------- ++ // ++ // We immediately shuffle the arguments so that for any vm call we have ++ // to make from here on out (sync slow path, jvmti, etc.) we will have ++ // captured the oops from our caller and have a valid oopMap for them. ++ // ++ // Natives require 1 or 2 extra arguments over the normal ones: the JNIEnv* ++ // (derived from JavaThread* which is in R16_thread) and, if static, ++ // the class mirror instead of a receiver. This pretty much guarantees that ++ // register layout will not match. We ignore these extra arguments during ++ // the shuffle. The shuffle is described by the two calling convention ++ // vectors we have in our possession. We simply walk the java vector to ++ // get the source locations and the c vector to get the destinations. ++ ++ // Record sp-based slot for receiver on stack for non-static methods. ++ int receiver_offset = -1; ++ ++ // We move the arguments backward because the floating point registers ++ // destination will always be to a register with a greater or equal ++ // register number or the stack. ++ // in is the index of the incoming Java arguments ++ // out is the index of the outgoing C arguments ++ ++#ifdef ASSERT ++ bool reg_destroyed[RegisterImpl::number_of_registers]; ++ bool freg_destroyed[FloatRegisterImpl::number_of_registers]; ++ for (int r = 0 ; r < RegisterImpl::number_of_registers ; r++) { ++ reg_destroyed[r] = false; ++ } ++ for (int f = 0 ; f < FloatRegisterImpl::number_of_registers ; f++) { ++ freg_destroyed[f] = false; ++ } ++#endif // ASSERT ++ ++ for (int in = total_in_args - 1, out = total_c_args - 1; in >= 0 ; in--, out--) { ++ ++#ifdef ASSERT ++ if (in_regs[in].first()->is_Register()) { ++ assert(!reg_destroyed[in_regs[in].first()->as_Register()->encoding()], "ack!"); ++ } else if (in_regs[in].first()->is_FloatRegister()) { ++ assert(!freg_destroyed[in_regs[in].first()->as_FloatRegister()->encoding()], "ack!"); ++ } ++ if (out_regs[out].first()->is_Register()) { ++ reg_destroyed[out_regs[out].first()->as_Register()->encoding()] = true; ++ } else if (out_regs[out].first()->is_FloatRegister()) { ++ freg_destroyed[out_regs[out].first()->as_FloatRegister()->encoding()] = true; ++ } ++ if (out_regs2[out].first()->is_Register()) { ++ reg_destroyed[out_regs2[out].first()->as_Register()->encoding()] = true; ++ } else if (out_regs2[out].first()->is_FloatRegister()) { ++ freg_destroyed[out_regs2[out].first()->as_FloatRegister()->encoding()] = true; ++ } ++#endif // ASSERT ++ ++ switch (in_sig_bt[in]) { ++ case T_BOOLEAN: ++ case T_CHAR: ++ case T_BYTE: ++ case T_SHORT: ++ case T_INT: ++ guarantee(in > 0 && in_sig_bt[in-1] == T_LONG, ++ "expecting type (T_LONG,bt) for bt in {T_BOOLEAN, T_CHAR, T_BYTE, T_SHORT, T_INT}"); ++ break; ++ case T_LONG: ++ if (in_sig_bt[in+1] == T_VOID) { ++ long_move(masm, in_regs[in], out_regs[out], r_callers_sp, r_temp_1); ++ } else { ++ guarantee(in_sig_bt[in+1] == T_BOOLEAN || in_sig_bt[in+1] == T_CHAR || ++ in_sig_bt[in+1] == T_BYTE || in_sig_bt[in+1] == T_SHORT || ++ in_sig_bt[in+1] == T_INT, ++ "expecting type (T_LONG,bt) for bt in {T_BOOLEAN, T_CHAR, T_BYTE, T_SHORT, T_INT}"); ++ int_move(masm, in_regs[in], out_regs[out], r_callers_sp, r_temp_1); ++ } ++ break; ++ case T_ARRAY: ++ if (is_critical_native) { ++ int body_arg = out; ++ out -= 2; // Point to length arg. PPC64: pass ints as longs. ++ unpack_array_argument(masm, in_regs[in], in_elem_bt[in], out_regs[body_arg], out_regs[out], ++ r_callers_sp, r_temp_1, r_temp_2); ++ break; ++ } ++ case T_OBJECT: ++ assert(!is_critical_native, "no oop arguments"); ++ object_move(masm, stack_slots, ++ oop_map, oop_handle_slot_offset, ++ ((in == 0) && (!method_is_static)), &receiver_offset, ++ in_regs[in], out_regs[out], ++ r_callers_sp, r_temp_1, r_temp_2); ++ break; ++ case T_VOID: ++ break; ++ case T_FLOAT: ++ float_move(masm, in_regs[in], out_regs[out], r_callers_sp, r_temp_1); ++ if (out_regs2[out].first()->is_valid()) { ++ float_move(masm, in_regs[in], out_regs2[out], r_callers_sp, r_temp_1); ++ } ++ break; ++ case T_DOUBLE: ++ double_move(masm, in_regs[in], out_regs[out], r_callers_sp, r_temp_1); ++ if (out_regs2[out].first()->is_valid()) { ++ double_move(masm, in_regs[in], out_regs2[out], r_callers_sp, r_temp_1); ++ } ++ break; ++ case T_ADDRESS: ++ fatal("found type (T_ADDRESS) in java args"); ++ break; ++ default: ++ ShouldNotReachHere(); ++ break; ++ } ++ } ++ ++ // Pre-load a static method's oop into ARG2. ++ // Used both by locking code and the normal JNI call code. ++ if (method_is_static && !is_critical_native) { ++ __ set_oop_constant(JNIHandles::make_local(method->method_holder()->java_mirror()), ++ r_carg2_classorobject); ++ ++ // Now handlize the static class mirror in carg2. It's known not-null. ++ __ std(r_carg2_classorobject, klass_offset, R1_SP); ++ oop_map->set_oop(VMRegImpl::stack2reg(klass_slot_offset)); ++ __ addi(r_carg2_classorobject, R1_SP, klass_offset); ++ } ++ ++ // Get JNIEnv* which is first argument to native. ++ if (!is_critical_native) { ++ __ addi(r_carg1_jnienv, R16_thread, in_bytes(JavaThread::jni_environment_offset())); ++ } ++ ++ // NOTE: ++ // ++ // We have all of the arguments setup at this point. ++ // We MUST NOT touch any outgoing regs from this point on. ++ // So if we must call out we must push a new frame. ++ ++ // Get current pc for oopmap, and load it patchable relative to global toc. ++ oopmap_pc = (intptr_t) __ pc(); ++ __ calculate_address_from_global_toc(r_return_pc, (address)oopmap_pc, true, true, true, true); ++ ++ // We use the same pc/oopMap repeatedly when we call out. ++ oop_maps->add_gc_map(oopmap_pc - start_pc, oop_map); ++ ++ // r_return_pc now has the pc loaded that we will use when we finally call ++ // to native. ++ ++ // Make sure that thread is non-volatile; it crosses a bunch of VM calls below. ++ assert(R16_thread->is_nonvolatile(), "thread must be in non-volatile register"); ++ ++ ++# if 0 ++ // DTrace method entry ++# endif ++ ++ // Lock a synchronized method. ++ // -------------------------------------------------------------------------- ++ ++ if (method->is_synchronized()) { ++ assert(!is_critical_native, "unhandled"); ++ ConditionRegister r_flag = CCR1; ++ Register r_oop = r_temp_4; ++ const Register r_box = r_temp_5; ++ Label done, locked; ++ ++ // Load the oop for the object or class. r_carg2_classorobject contains ++ // either the handlized oop from the incoming arguments or the handlized ++ // class mirror (if the method is static). ++ __ ld(r_oop, 0, r_carg2_classorobject); ++ ++ // Get the lock box slot's address. ++ __ addi(r_box, R1_SP, lock_offset); ++ ++# ifdef ASSERT ++ if (UseBiasedLocking) { ++ // Making the box point to itself will make it clear it went unused ++ // but also be obviously invalid. ++ __ std(r_box, 0, r_box); ++ } ++# endif // ASSERT ++ ++ // Try fastpath for locking. ++ // fast_lock kills r_temp_1, r_temp_2, r_temp_3. ++ __ compiler_fast_lock_object(r_flag, r_oop, r_box, r_temp_1, r_temp_2, r_temp_3); ++ __ beq(r_flag, locked); ++ ++ // None of the above fast optimizations worked so we have to get into the ++ // slow case of monitor enter. Inline a special case of call_VM that ++ // disallows any pending_exception. ++ ++ // Save argument registers and leave room for C-compatible ABI_REG_ARGS. ++ int frame_size = frame::abi_reg_args_size + ++ round_to(total_c_args * wordSize, frame::alignment_in_bytes); ++ __ mr(R11_scratch1, R1_SP); ++ RegisterSaver::push_frame_and_save_argument_registers(masm, R12_scratch2, frame_size, total_c_args, out_regs, out_regs2); ++ ++ // Do the call. ++ __ set_last_Java_frame(R11_scratch1, r_return_pc); ++ assert(r_return_pc->is_nonvolatile(), "expecting return pc to be in non-volatile register"); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::complete_monitor_locking_C), r_oop, r_box, R16_thread); ++ __ reset_last_Java_frame(); ++ ++ RegisterSaver::restore_argument_registers_and_pop_frame(masm, frame_size, total_c_args, out_regs, out_regs2); ++ ++ __ asm_assert_mem8_is_zero(thread_(pending_exception), ++ "no pending exception allowed on exit from SharedRuntime::complete_monitor_locking_C", 0); ++ ++ __ bind(locked); ++ } ++ ++ ++ // Publish thread state ++ // -------------------------------------------------------------------------- ++ ++ // Use that pc we placed in r_return_pc a while back as the current frame anchor. ++ __ set_last_Java_frame(R1_SP, r_return_pc); ++ ++ // Transition from _thread_in_Java to _thread_in_native. ++ __ li(R0, _thread_in_native); ++ __ release(); ++ // TODO: PPC port assert(4 == JavaThread::sz_thread_state(), "unexpected field size"); ++ __ stw(R0, thread_(thread_state)); ++ if (UseMembar) { ++ __ fence(); ++ } ++ ++ ++ // The JNI call ++ // -------------------------------------------------------------------------- ++#if defined(ABI_ELFv2) ++ __ call_c(native_func, relocInfo::runtime_call_type); ++#else ++ FunctionDescriptor* fd_native_method = (FunctionDescriptor*) native_func; ++ __ call_c(fd_native_method, relocInfo::runtime_call_type); ++#endif ++ ++ ++ // Now, we are back from the native code. ++ ++ ++ // Unpack the native result. ++ // -------------------------------------------------------------------------- ++ ++ // For int-types, we do any needed sign-extension required. ++ // Care must be taken that the return values (R3_RET and F1_RET) ++ // will survive any VM calls for blocking or unlocking. ++ // An OOP result (handle) is done specially in the slow-path code. ++ ++ switch (ret_type) { ++ case T_VOID: break; // Nothing to do! ++ case T_FLOAT: break; // Got it where we want it (unless slow-path). ++ case T_DOUBLE: break; // Got it where we want it (unless slow-path). ++ case T_LONG: break; // Got it where we want it (unless slow-path). ++ case T_OBJECT: break; // Really a handle. ++ // Cannot de-handlize until after reclaiming jvm_lock. ++ case T_ARRAY: break; ++ ++ case T_BOOLEAN: { // 0 -> false(0); !0 -> true(1) ++ Label skip_modify; ++ __ cmpwi(CCR0, R3_RET, 0); ++ __ beq(CCR0, skip_modify); ++ __ li(R3_RET, 1); ++ __ bind(skip_modify); ++ break; ++ } ++ case T_BYTE: { // sign extension ++ __ extsb(R3_RET, R3_RET); ++ break; ++ } ++ case T_CHAR: { // unsigned result ++ __ andi(R3_RET, R3_RET, 0xffff); ++ break; ++ } ++ case T_SHORT: { // sign extension ++ __ extsh(R3_RET, R3_RET); ++ break; ++ } ++ case T_INT: // nothing to do ++ break; ++ default: ++ ShouldNotReachHere(); ++ break; ++ } ++ ++ ++ // Publish thread state ++ // -------------------------------------------------------------------------- ++ ++ // Switch thread to "native transition" state before reading the ++ // synchronization state. This additional state is necessary because reading ++ // and testing the synchronization state is not atomic w.r.t. GC, as this ++ // scenario demonstrates: ++ // - Java thread A, in _thread_in_native state, loads _not_synchronized ++ // and is preempted. ++ // - VM thread changes sync state to synchronizing and suspends threads ++ // for GC. ++ // - Thread A is resumed to finish this native method, but doesn't block ++ // here since it didn't see any synchronization in progress, and escapes. ++ ++ // Transition from _thread_in_native to _thread_in_native_trans. ++ __ li(R0, _thread_in_native_trans); ++ __ release(); ++ // TODO: PPC port assert(4 == JavaThread::sz_thread_state(), "unexpected field size"); ++ __ stw(R0, thread_(thread_state)); ++ ++ ++ // Must we block? ++ // -------------------------------------------------------------------------- ++ ++ // Block, if necessary, before resuming in _thread_in_Java state. ++ // In order for GC to work, don't clear the last_Java_sp until after blocking. ++ Label after_transition; ++ { ++ Label no_block, sync; ++ ++ if (os::is_MP()) { ++ if (UseMembar) { ++ // Force this write out before the read below. ++ __ fence(); ++ } else { ++ // Write serialization page so VM thread can do a pseudo remote membar. ++ // We use the current thread pointer to calculate a thread specific ++ // offset to write to within the page. This minimizes bus traffic ++ // due to cache line collision. ++ __ serialize_memory(R16_thread, r_temp_4, r_temp_5); ++ } ++ } ++ ++ Register sync_state_addr = r_temp_4; ++ Register sync_state = r_temp_5; ++ Register suspend_flags = r_temp_6; ++ ++ __ load_const(sync_state_addr, SafepointSynchronize::address_of_state(), /*temp*/ sync_state); ++ ++ // TODO: PPC port assert(4 == SafepointSynchronize::sz_state(), "unexpected field size"); ++ __ lwz(sync_state, 0, sync_state_addr); ++ ++ // TODO: PPC port assert(4 == Thread::sz_suspend_flags(), "unexpected field size"); ++ __ lwz(suspend_flags, thread_(suspend_flags)); ++ ++ __ acquire(); ++ ++ Label do_safepoint; ++ // No synchronization in progress nor yet synchronized. ++ __ cmpwi(CCR0, sync_state, SafepointSynchronize::_not_synchronized); ++ // Not suspended. ++ __ cmpwi(CCR1, suspend_flags, 0); ++ ++ __ bne(CCR0, sync); ++ __ beq(CCR1, no_block); ++ ++ // Block. Save any potential method result value before the operation and ++ // use a leaf call to leave the last_Java_frame setup undisturbed. Doing this ++ // lets us share the oopMap we used when we went native rather than create ++ // a distinct one for this pc. ++ __ bind(sync); ++ ++ address entry_point = is_critical_native ++ ? CAST_FROM_FN_PTR(address, JavaThread::check_special_condition_for_native_trans_and_transition) ++ : CAST_FROM_FN_PTR(address, JavaThread::check_special_condition_for_native_trans); ++ save_native_result(masm, ret_type, workspace_slot_offset); ++ __ call_VM_leaf(entry_point, R16_thread); ++ restore_native_result(masm, ret_type, workspace_slot_offset); ++ ++ if (is_critical_native) { ++ __ b(after_transition); // No thread state transition here. ++ } ++ __ bind(no_block); ++ } ++ ++ // Publish thread state. ++ // -------------------------------------------------------------------------- ++ ++ // Thread state is thread_in_native_trans. Any safepoint blocking has ++ // already happened so we can now change state to _thread_in_Java. ++ ++ // Transition from _thread_in_native_trans to _thread_in_Java. ++ __ li(R0, _thread_in_Java); ++ __ release(); ++ // TODO: PPC port assert(4 == JavaThread::sz_thread_state(), "unexpected field size"); ++ __ stw(R0, thread_(thread_state)); ++ if (UseMembar) { ++ __ fence(); ++ } ++ __ bind(after_transition); ++ ++ // Reguard any pages if necessary. ++ // -------------------------------------------------------------------------- ++ ++ Label no_reguard; ++ __ lwz(r_temp_1, thread_(stack_guard_state)); ++ __ cmpwi(CCR0, r_temp_1, JavaThread::stack_guard_yellow_disabled); ++ __ bne(CCR0, no_reguard); ++ ++ save_native_result(masm, ret_type, workspace_slot_offset); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::reguard_yellow_pages)); ++ restore_native_result(masm, ret_type, workspace_slot_offset); ++ ++ __ bind(no_reguard); ++ ++ ++ // Unlock ++ // -------------------------------------------------------------------------- ++ ++ if (method->is_synchronized()) { ++ ++ ConditionRegister r_flag = CCR1; ++ const Register r_oop = r_temp_4; ++ const Register r_box = r_temp_5; ++ const Register r_exception = r_temp_6; ++ Label done; ++ ++ // Get oop and address of lock object box. ++ if (method_is_static) { ++ assert(klass_offset != -1, ""); ++ __ ld(r_oop, klass_offset, R1_SP); ++ } else { ++ assert(receiver_offset != -1, ""); ++ __ ld(r_oop, receiver_offset, R1_SP); ++ } ++ __ addi(r_box, R1_SP, lock_offset); ++ ++ // Try fastpath for unlocking. ++ __ compiler_fast_unlock_object(r_flag, r_oop, r_box, r_temp_1, r_temp_2, r_temp_3); ++ __ beq(r_flag, done); ++ ++ // Save and restore any potential method result value around the unlocking operation. ++ save_native_result(masm, ret_type, workspace_slot_offset); ++ ++ // Must save pending exception around the slow-path VM call. Since it's a ++ // leaf call, the pending exception (if any) can be kept in a register. ++ __ ld(r_exception, thread_(pending_exception)); ++ assert(r_exception->is_nonvolatile(), "exception register must be non-volatile"); ++ __ li(R0, 0); ++ __ std(R0, thread_(pending_exception)); ++ ++ // Slow case of monitor enter. ++ // Inline a special case of call_VM that disallows any pending_exception. ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::complete_monitor_unlocking_C), r_oop, r_box); ++ ++ __ asm_assert_mem8_is_zero(thread_(pending_exception), ++ "no pending exception allowed on exit from SharedRuntime::complete_monitor_unlocking_C", 0); ++ ++ restore_native_result(masm, ret_type, workspace_slot_offset); ++ ++ // Check_forward_pending_exception jump to forward_exception if any pending ++ // exception is set. The forward_exception routine expects to see the ++ // exception in pending_exception and not in a register. Kind of clumsy, ++ // since all folks who branch to forward_exception must have tested ++ // pending_exception first and hence have it in a register already. ++ __ std(r_exception, thread_(pending_exception)); ++ ++ __ bind(done); ++ } ++ ++# if 0 ++ // DTrace method exit ++# endif ++ ++ // Clear "last Java frame" SP and PC. ++ // -------------------------------------------------------------------------- ++ ++ __ reset_last_Java_frame(); ++ ++ // Unpack oop result. ++ // -------------------------------------------------------------------------- ++ ++ if (ret_type == T_OBJECT || ret_type == T_ARRAY) { ++ Label skip_unboxing; ++ __ cmpdi(CCR0, R3_RET, 0); ++ __ beq(CCR0, skip_unboxing); ++ __ ld(R3_RET, 0, R3_RET); ++ __ bind(skip_unboxing); ++ __ verify_oop(R3_RET); ++ } ++ ++ ++ // Reset handle block. ++ // -------------------------------------------------------------------------- ++ if (!is_critical_native) { ++ __ ld(r_temp_1, thread_(active_handles)); ++ // TODO: PPC port assert(4 == JNIHandleBlock::top_size_in_bytes(), "unexpected field size"); ++ __ li(r_temp_2, 0); ++ __ stw(r_temp_2, JNIHandleBlock::top_offset_in_bytes(), r_temp_1); ++ ++ ++ // Check for pending exceptions. ++ // -------------------------------------------------------------------------- ++ __ ld(r_temp_2, thread_(pending_exception)); ++ __ cmpdi(CCR0, r_temp_2, 0); ++ __ bne(CCR0, handle_pending_exception); ++ } ++ ++ // Return ++ // -------------------------------------------------------------------------- ++ ++ __ pop_frame(); ++ __ restore_LR_CR(R11); ++ __ blr(); ++ ++ ++ // Handler for pending exceptions (out-of-line). ++ // -------------------------------------------------------------------------- ++ ++ // Since this is a native call, we know the proper exception handler ++ // is the empty function. We just pop this frame and then jump to ++ // forward_exception_entry. ++ if (!is_critical_native) { ++ __ align(InteriorEntryAlignment); ++ __ bind(handle_pending_exception); ++ ++ __ pop_frame(); ++ __ restore_LR_CR(R11); ++ __ b64_patchable((address)StubRoutines::forward_exception_entry(), ++ relocInfo::runtime_call_type); ++ } ++ ++ // Handler for a cache miss (out-of-line). ++ // -------------------------------------------------------------------------- ++ ++ if (!method_is_static) { ++ __ align(InteriorEntryAlignment); ++ __ bind(ic_miss); ++ ++ __ b64_patchable((address)SharedRuntime::get_ic_miss_stub(), ++ relocInfo::runtime_call_type); ++ } ++ ++ // Done. ++ // -------------------------------------------------------------------------- ++ ++ __ flush(); ++ ++ nmethod *nm = nmethod::new_native_nmethod(method, ++ compile_id, ++ masm->code(), ++ vep_start_pc-start_pc, ++ frame_done_pc-start_pc, ++ stack_slots / VMRegImpl::slots_per_word, ++ (method_is_static ? in_ByteSize(klass_offset) : in_ByteSize(receiver_offset)), ++ in_ByteSize(lock_offset), ++ oop_maps); ++ ++ if (is_critical_native) { ++ nm->set_lazy_critical_native(true); ++ } ++ ++ return nm; ++#else ++ ShouldNotReachHere(); ++ return NULL; ++#endif // COMPILER2 ++} ++ ++// This function returns the adjust size (in number of words) to a c2i adapter ++// activation for use during deoptimization. ++int Deoptimization::last_frame_adjust(int callee_parameters, int callee_locals) { ++ return round_to((callee_locals - callee_parameters) * Interpreter::stackElementWords, frame::alignment_in_bytes); ++} ++ ++uint SharedRuntime::out_preserve_stack_slots() { ++#ifdef COMPILER2 ++ return frame::jit_out_preserve_size / VMRegImpl::stack_slot_size; ++#else ++ return 0; ++#endif ++} ++ ++#ifdef COMPILER2 ++// Frame generation for deopt and uncommon trap blobs. ++static void push_skeleton_frame(MacroAssembler* masm, bool deopt, ++ /* Read */ ++ Register unroll_block_reg, ++ /* Update */ ++ Register frame_sizes_reg, ++ Register number_of_frames_reg, ++ Register pcs_reg, ++ /* Invalidate */ ++ Register frame_size_reg, ++ Register pc_reg) { ++ ++ __ ld(pc_reg, 0, pcs_reg); ++ __ ld(frame_size_reg, 0, frame_sizes_reg); ++ __ std(pc_reg, _abi(lr), R1_SP); ++ __ push_frame(frame_size_reg, R0/*tmp*/); ++#ifdef CC_INTERP ++ __ std(R1_SP, _parent_ijava_frame_abi(initial_caller_sp), R1_SP); ++#else ++#ifdef ASSERT ++ __ load_const_optimized(pc_reg, 0x5afe); ++ __ std(pc_reg, _ijava_state_neg(ijava_reserved), R1_SP); ++#endif ++ __ std(R1_SP, _ijava_state_neg(sender_sp), R1_SP); ++#endif // CC_INTERP ++ __ addi(number_of_frames_reg, number_of_frames_reg, -1); ++ __ addi(frame_sizes_reg, frame_sizes_reg, wordSize); ++ __ addi(pcs_reg, pcs_reg, wordSize); ++} ++ ++// Loop through the UnrollBlock info and create new frames. ++static void push_skeleton_frames(MacroAssembler* masm, bool deopt, ++ /* read */ ++ Register unroll_block_reg, ++ /* invalidate */ ++ Register frame_sizes_reg, ++ Register number_of_frames_reg, ++ Register pcs_reg, ++ Register frame_size_reg, ++ Register pc_reg) { ++ Label loop; ++ ++ // _number_of_frames is of type int (deoptimization.hpp) ++ __ lwa(number_of_frames_reg, ++ Deoptimization::UnrollBlock::number_of_frames_offset_in_bytes(), ++ unroll_block_reg); ++ __ ld(pcs_reg, ++ Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes(), ++ unroll_block_reg); ++ __ ld(frame_sizes_reg, ++ Deoptimization::UnrollBlock::frame_sizes_offset_in_bytes(), ++ unroll_block_reg); ++ ++ // stack: (caller_of_deoptee, ...). ++ ++ // At this point we either have an interpreter frame or a compiled ++ // frame on top of stack. If it is a compiled frame we push a new c2i ++ // adapter here ++ ++ // Memorize top-frame stack-pointer. ++ __ mr(frame_size_reg/*old_sp*/, R1_SP); ++ ++ // Resize interpreter top frame OR C2I adapter. ++ ++ // At this moment, the top frame (which is the caller of the deoptee) is ++ // an interpreter frame or a newly pushed C2I adapter or an entry frame. ++ // The top frame has a TOP_IJAVA_FRAME_ABI and the frame contains the ++ // outgoing arguments. ++ // ++ // In order to push the interpreter frame for the deoptee, we need to ++ // resize the top frame such that we are able to place the deoptee's ++ // locals in the frame. ++ // Additionally, we have to turn the top frame's TOP_IJAVA_FRAME_ABI ++ // into a valid PARENT_IJAVA_FRAME_ABI. ++ ++ __ lwa(R11_scratch1, ++ Deoptimization::UnrollBlock::caller_adjustment_offset_in_bytes(), ++ unroll_block_reg); ++ __ neg(R11_scratch1, R11_scratch1); ++ ++ // R11_scratch1 contains size of locals for frame resizing. ++ // R12_scratch2 contains top frame's lr. ++ ++ // Resize frame by complete frame size prevents TOC from being ++ // overwritten by locals. A more stack space saving way would be ++ // to copy the TOC to its location in the new abi. ++ __ addi(R11_scratch1, R11_scratch1, - frame::parent_ijava_frame_abi_size); ++ ++ // now, resize the frame ++ __ resize_frame(R11_scratch1, pc_reg/*tmp*/); ++ ++ // In the case where we have resized a c2i frame above, the optional ++ // alignment below the locals has size 32 (why?). ++ __ std(R12_scratch2, _abi(lr), R1_SP); ++ ++ // Initialize initial_caller_sp. ++#ifdef CC_INTERP ++ __ std(frame_size_reg/*old_sp*/, _parent_ijava_frame_abi(initial_caller_sp), R1_SP); ++#else ++#ifdef ASSERT ++ __ load_const_optimized(pc_reg, 0x5afe); ++ __ std(pc_reg, _ijava_state_neg(ijava_reserved), R1_SP); ++#endif ++ __ std(frame_size_reg, _ijava_state_neg(sender_sp), R1_SP); ++#endif // CC_INTERP ++ ++#ifdef ASSERT ++ // Make sure that there is at least one entry in the array. ++ __ cmpdi(CCR0, number_of_frames_reg, 0); ++ __ asm_assert_ne("array_size must be > 0", 0x205); ++#endif ++ ++ // Now push the new interpreter frames. ++ // ++ __ bind(loop); ++ // Allocate a new frame, fill in the pc. ++ push_skeleton_frame(masm, deopt, ++ unroll_block_reg, ++ frame_sizes_reg, ++ number_of_frames_reg, ++ pcs_reg, ++ frame_size_reg, ++ pc_reg); ++ __ cmpdi(CCR0, number_of_frames_reg, 0); ++ __ bne(CCR0, loop); ++ ++ // Get the return address pointing into the frame manager. ++ __ ld(R0, 0, pcs_reg); ++ // Store it in the top interpreter frame. ++ __ std(R0, _abi(lr), R1_SP); ++ // Initialize frame_manager_lr of interpreter top frame. ++#ifdef CC_INTERP ++ __ std(R0, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++#endif ++} ++#endif ++ ++void SharedRuntime::generate_deopt_blob() { ++ // Allocate space for the code ++ ResourceMark rm; ++ // Setup code generation tools ++ CodeBuffer buffer("deopt_blob", 2048, 1024); ++ InterpreterMacroAssembler* masm = new InterpreterMacroAssembler(&buffer); ++ Label exec_mode_initialized; ++ int frame_size_in_words; ++ OopMap* map = NULL; ++ OopMapSet *oop_maps = new OopMapSet(); ++ ++ // size of ABI112 plus spill slots for R3_RET and F1_RET. ++ const int frame_size_in_bytes = frame::abi_reg_args_spill_size; ++ const int frame_size_in_slots = frame_size_in_bytes / sizeof(jint); ++ int first_frame_size_in_bytes = 0; // frame size of "unpack frame" for call to fetch_unroll_info. ++ ++ const Register exec_mode_reg = R21_tmp1; ++ ++ const address start = __ pc(); ++ ++#ifdef COMPILER2 ++ // -------------------------------------------------------------------------- ++ // Prolog for non exception case! ++ ++ // We have been called from the deopt handler of the deoptee. ++ // ++ // deoptee: ++ // ... ++ // call X ++ // ... ++ // deopt_handler: call_deopt_stub ++ // cur. return pc --> ... ++ // ++ // So currently SR_LR points behind the call in the deopt handler. ++ // We adjust it such that it points to the start of the deopt handler. ++ // The return_pc has been stored in the frame of the deoptee and ++ // will replace the address of the deopt_handler in the call ++ // to Deoptimization::fetch_unroll_info below. ++ // We can't grab a free register here, because all registers may ++ // contain live values, so let the RegisterSaver do the adjustment ++ // of the return pc. ++ const int return_pc_adjustment_no_exception = -HandlerImpl::size_deopt_handler(); ++ ++ // Push the "unpack frame" ++ // Save everything in sight. ++ map = RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, ++ &first_frame_size_in_bytes, ++ /*generate_oop_map=*/ true, ++ return_pc_adjustment_no_exception, ++ RegisterSaver::return_pc_is_lr); ++ assert(map != NULL, "OopMap must have been created"); ++ ++ __ li(exec_mode_reg, Deoptimization::Unpack_deopt); ++ // Save exec mode for unpack_frames. ++ __ b(exec_mode_initialized); ++ ++ // -------------------------------------------------------------------------- ++ // Prolog for exception case ++ ++ // An exception is pending. ++ // We have been called with a return (interpreter) or a jump (exception blob). ++ // ++ // - R3_ARG1: exception oop ++ // - R4_ARG2: exception pc ++ ++ int exception_offset = __ pc() - start; ++ ++ BLOCK_COMMENT("Prolog for exception case"); ++ ++ // The RegisterSaves doesn't need to adjust the return pc for this situation. ++ const int return_pc_adjustment_exception = 0; ++ ++ // Push the "unpack frame". ++ // Save everything in sight. ++ assert(R4 == R4_ARG2, "exception pc must be in r4"); ++ RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, ++ &first_frame_size_in_bytes, ++ /*generate_oop_map=*/ false, ++ return_pc_adjustment_exception, ++ RegisterSaver::return_pc_is_r4); ++ ++ // Deopt during an exception. Save exec mode for unpack_frames. ++ __ li(exec_mode_reg, Deoptimization::Unpack_exception); ++ ++ // Store exception oop and pc in thread (location known to GC). ++ // This is needed since the call to "fetch_unroll_info()" may safepoint. ++ __ std(R3_ARG1, in_bytes(JavaThread::exception_oop_offset()), R16_thread); ++ __ std(R4_ARG2, in_bytes(JavaThread::exception_pc_offset()), R16_thread); ++ ++ // fall through ++ ++ // -------------------------------------------------------------------------- ++ __ BIND(exec_mode_initialized); ++ ++ { ++ const Register unroll_block_reg = R22_tmp2; ++ ++ // We need to set `last_Java_frame' because `fetch_unroll_info' will ++ // call `last_Java_frame()'. The value of the pc in the frame is not ++ // particularly important. It just needs to identify this blob. ++ __ set_last_Java_frame(R1_SP, noreg); ++ ++ // With EscapeAnalysis turned on, this call may safepoint! ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::fetch_unroll_info), R16_thread); ++ address calls_return_pc = __ last_calls_return_pc(); ++ // Set an oopmap for the call site that describes all our saved registers. ++ oop_maps->add_gc_map(calls_return_pc - start, map); ++ ++ __ reset_last_Java_frame(); ++ // Save the return value. ++ __ mr(unroll_block_reg, R3_RET); ++ ++ // Restore only the result registers that have been saved ++ // by save_volatile_registers(...). ++ RegisterSaver::restore_result_registers(masm, first_frame_size_in_bytes); ++ ++ // In excp_deopt_mode, restore and clear exception oop which we ++ // stored in the thread during exception entry above. The exception ++ // oop will be the return value of this stub. ++ Label skip_restore_excp; ++ __ cmpdi(CCR0, exec_mode_reg, Deoptimization::Unpack_exception); ++ __ bne(CCR0, skip_restore_excp); ++ __ ld(R3_RET, in_bytes(JavaThread::exception_oop_offset()), R16_thread); ++ __ ld(R4_ARG2, in_bytes(JavaThread::exception_pc_offset()), R16_thread); ++ __ li(R0, 0); ++ __ std(R0, in_bytes(JavaThread::exception_pc_offset()), R16_thread); ++ __ std(R0, in_bytes(JavaThread::exception_oop_offset()), R16_thread); ++ __ BIND(skip_restore_excp); ++ ++ // reload narrro_oop_base ++ if (UseCompressedOops && Universe::narrow_oop_base() != 0) { ++ __ load_const_optimized(R30, Universe::narrow_oop_base()); ++ } ++ ++ __ pop_frame(); ++ ++ // stack: (deoptee, optional i2c, caller of deoptee, ...). ++ ++ // pop the deoptee's frame ++ __ pop_frame(); ++ ++ // stack: (caller_of_deoptee, ...). ++ ++ // Loop through the `UnrollBlock' info and create interpreter frames. ++ push_skeleton_frames(masm, true/*deopt*/, ++ unroll_block_reg, ++ R23_tmp3, ++ R24_tmp4, ++ R25_tmp5, ++ R26_tmp6, ++ R27_tmp7); ++ ++ // stack: (skeletal interpreter frame, ..., optional skeletal ++ // interpreter frame, optional c2i, caller of deoptee, ...). ++ } ++ ++ // push an `unpack_frame' taking care of float / int return values. ++ __ push_frame(frame_size_in_bytes, R0/*tmp*/); ++ ++ // stack: (unpack frame, skeletal interpreter frame, ..., optional ++ // skeletal interpreter frame, optional c2i, caller of deoptee, ++ // ...). ++ ++ // Spill live volatile registers since we'll do a call. ++ __ std( R3_RET, _abi_reg_args_spill(spill_ret), R1_SP); ++ __ stfd(F1_RET, _abi_reg_args_spill(spill_fret), R1_SP); ++ ++ // Let the unpacker layout information in the skeletal frames just ++ // allocated. ++ __ get_PC_trash_LR(R3_RET); ++ __ set_last_Java_frame(/*sp*/R1_SP, /*pc*/R3_RET); ++ // This is a call to a LEAF method, so no oop map is required. ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), ++ R16_thread/*thread*/, exec_mode_reg/*exec_mode*/); ++ __ reset_last_Java_frame(); ++ ++ // Restore the volatiles saved above. ++ __ ld( R3_RET, _abi_reg_args_spill(spill_ret), R1_SP); ++ __ lfd(F1_RET, _abi_reg_args_spill(spill_fret), R1_SP); ++ ++ // Pop the unpack frame. ++ __ pop_frame(); ++ __ restore_LR_CR(R0); ++ ++ // stack: (top interpreter frame, ..., optional interpreter frame, ++ // optional c2i, caller of deoptee, ...). ++ ++ // Initialize R14_state. ++#ifdef CC_INTERP ++ __ ld(R14_state, 0, R1_SP); ++ __ addi(R14_state, R14_state, -frame::interpreter_frame_cinterpreterstate_size_in_bytes()); ++ // Also inititialize R15_prev_state. ++ __ restore_prev_state(); ++#else ++ __ restore_interpreter_state(R11_scratch1); ++ __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R11_scratch1); ++#endif // CC_INTERP ++ ++ ++ // Return to the interpreter entry point. ++ __ blr(); ++ __ flush(); ++#else // COMPILER2 ++ __ unimplemented("deopt blob needed only with compiler"); ++ int exception_offset = __ pc() - start; ++#endif // COMPILER2 ++ ++ _deopt_blob = DeoptimizationBlob::create(&buffer, oop_maps, 0, exception_offset, 0, first_frame_size_in_bytes / wordSize); ++} ++ ++#ifdef COMPILER2 ++void SharedRuntime::generate_uncommon_trap_blob() { ++ // Allocate space for the code. ++ ResourceMark rm; ++ // Setup code generation tools. ++ CodeBuffer buffer("uncommon_trap_blob", 2048, 1024); ++ InterpreterMacroAssembler* masm = new InterpreterMacroAssembler(&buffer); ++ address start = __ pc(); ++ ++ Register unroll_block_reg = R21_tmp1; ++ Register klass_index_reg = R22_tmp2; ++ Register unc_trap_reg = R23_tmp3; ++ ++ OopMapSet* oop_maps = new OopMapSet(); ++ int frame_size_in_bytes = frame::abi_reg_args_size; ++ OopMap* map = new OopMap(frame_size_in_bytes / sizeof(jint), 0); ++ ++ // stack: (deoptee, optional i2c, caller_of_deoptee, ...). ++ ++ // Push a dummy `unpack_frame' and call ++ // `Deoptimization::uncommon_trap' to pack the compiled frame into a ++ // vframe array and return the `UnrollBlock' information. ++ ++ // Save LR to compiled frame. ++ __ save_LR_CR(R11_scratch1); ++ ++ // Push an "uncommon_trap" frame. ++ __ push_frame_reg_args(0, R11_scratch1); ++ ++ // stack: (unpack frame, deoptee, optional i2c, caller_of_deoptee, ...). ++ ++ // Set the `unpack_frame' as last_Java_frame. ++ // `Deoptimization::uncommon_trap' expects it and considers its ++ // sender frame as the deoptee frame. ++ // Remember the offset of the instruction whose address will be ++ // moved to R11_scratch1. ++ address gc_map_pc = __ get_PC_trash_LR(R11_scratch1); ++ ++ __ set_last_Java_frame(/*sp*/R1_SP, /*pc*/R11_scratch1); ++ ++ __ mr(klass_index_reg, R3); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::uncommon_trap), ++ R16_thread, klass_index_reg); ++ ++ // Set an oopmap for the call site. ++ oop_maps->add_gc_map(gc_map_pc - start, map); ++ ++ __ reset_last_Java_frame(); ++ ++ // Pop the `unpack frame'. ++ __ pop_frame(); ++ ++ // stack: (deoptee, optional i2c, caller_of_deoptee, ...). ++ ++ // Save the return value. ++ __ mr(unroll_block_reg, R3_RET); ++ ++ // Pop the uncommon_trap frame. ++ __ pop_frame(); ++ ++ // stack: (caller_of_deoptee, ...). ++ ++ // Allocate new interpreter frame(s) and possibly a c2i adapter ++ // frame. ++ push_skeleton_frames(masm, false/*deopt*/, ++ unroll_block_reg, ++ R22_tmp2, ++ R23_tmp3, ++ R24_tmp4, ++ R25_tmp5, ++ R26_tmp6); ++ ++ // stack: (skeletal interpreter frame, ..., optional skeletal ++ // interpreter frame, optional c2i, caller of deoptee, ...). ++ ++ // Push a dummy `unpack_frame' taking care of float return values. ++ // Call `Deoptimization::unpack_frames' to layout information in the ++ // interpreter frames just created. ++ ++ // Push a simple "unpack frame" here. ++ __ push_frame_reg_args(0, R11_scratch1); ++ ++ // stack: (unpack frame, skeletal interpreter frame, ..., optional ++ // skeletal interpreter frame, optional c2i, caller of deoptee, ++ // ...). ++ ++ // Set the "unpack_frame" as last_Java_frame. ++ __ get_PC_trash_LR(R11_scratch1); ++ __ set_last_Java_frame(/*sp*/R1_SP, /*pc*/R11_scratch1); ++ ++ // Indicate it is the uncommon trap case. ++ __ li(unc_trap_reg, Deoptimization::Unpack_uncommon_trap); ++ // Let the unpacker layout information in the skeletal frames just ++ // allocated. ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), ++ R16_thread, unc_trap_reg); ++ ++ __ reset_last_Java_frame(); ++ // Pop the `unpack frame'. ++ __ pop_frame(); ++ // Restore LR from top interpreter frame. ++ __ restore_LR_CR(R11_scratch1); ++ ++ // stack: (top interpreter frame, ..., optional interpreter frame, ++ // optional c2i, caller of deoptee, ...). ++ ++#ifdef CC_INTERP ++ // Initialize R14_state, ... ++ __ ld(R11_scratch1, 0, R1_SP); ++ __ addi(R14_state, R11_scratch1, -frame::interpreter_frame_cinterpreterstate_size_in_bytes()); ++ // also initialize R15_prev_state. ++ __ restore_prev_state(); ++#else ++ __ restore_interpreter_state(R11_scratch1); ++ __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R11_scratch1); ++#endif // CC_INTERP ++ ++ // Return to the interpreter entry point. ++ __ blr(); ++ ++ masm->flush(); ++ ++ _uncommon_trap_blob = UncommonTrapBlob::create(&buffer, oop_maps, frame_size_in_bytes/wordSize); ++} ++#endif // COMPILER2 ++ ++// Generate a special Compile2Runtime blob that saves all registers, and setup oopmap. ++SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_type) { ++ assert(StubRoutines::forward_exception_entry() != NULL, ++ "must be generated before"); ++ ++ ResourceMark rm; ++ OopMapSet *oop_maps = new OopMapSet(); ++ OopMap* map; ++ ++ // Allocate space for the code. Setup code generation tools. ++ CodeBuffer buffer("handler_blob", 2048, 1024); ++ MacroAssembler* masm = new MacroAssembler(&buffer); ++ ++ address start = __ pc(); ++ int frame_size_in_bytes = 0; ++ ++ RegisterSaver::ReturnPCLocation return_pc_location; ++ bool cause_return = (poll_type == POLL_AT_RETURN); ++ if (cause_return) { ++ // Nothing to do here. The frame has already been popped in MachEpilogNode. ++ // Register LR already contains the return pc. ++ return_pc_location = RegisterSaver::return_pc_is_lr; ++ } else { ++ // Use thread()->saved_exception_pc() as return pc. ++ return_pc_location = RegisterSaver::return_pc_is_thread_saved_exception_pc; ++ } ++ ++ // Save registers, fpu state, and flags. ++ map = RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, ++ &frame_size_in_bytes, ++ /*generate_oop_map=*/ true, ++ /*return_pc_adjustment=*/0, ++ return_pc_location); ++ ++ // The following is basically a call_VM. However, we need the precise ++ // address of the call in order to generate an oopmap. Hence, we do all the ++ // work outselves. ++ __ set_last_Java_frame(/*sp=*/R1_SP, /*pc=*/noreg); ++ ++ // The return address must always be correct so that the frame constructor ++ // never sees an invalid pc. ++ ++ // Do the call ++ __ call_VM_leaf(call_ptr, R16_thread); ++ address calls_return_pc = __ last_calls_return_pc(); ++ ++ // Set an oopmap for the call site. This oopmap will map all ++ // oop-registers and debug-info registers as callee-saved. This ++ // will allow deoptimization at this safepoint to find all possible ++ // debug-info recordings, as well as let GC find all oops. ++ oop_maps->add_gc_map(calls_return_pc - start, map); ++ ++ Label noException; ++ ++ // Clear the last Java frame. ++ __ reset_last_Java_frame(); ++ ++ BLOCK_COMMENT(" Check pending exception."); ++ const Register pending_exception = R0; ++ __ ld(pending_exception, thread_(pending_exception)); ++ __ cmpdi(CCR0, pending_exception, 0); ++ __ beq(CCR0, noException); ++ ++ // Exception pending ++ RegisterSaver::restore_live_registers_and_pop_frame(masm, ++ frame_size_in_bytes, ++ /*restore_ctr=*/true); ++ ++ BLOCK_COMMENT(" Jump to forward_exception_entry."); ++ // Jump to forward_exception_entry, with the issuing PC in LR ++ // so it looks like the original nmethod called forward_exception_entry. ++ __ b64_patchable(StubRoutines::forward_exception_entry(), relocInfo::runtime_call_type); ++ ++ // No exception case. ++ __ BIND(noException); ++ ++ ++ // Normal exit, restore registers and exit. ++ RegisterSaver::restore_live_registers_and_pop_frame(masm, ++ frame_size_in_bytes, ++ /*restore_ctr=*/true); ++ ++ __ blr(); ++ ++ // Make sure all code is generated ++ masm->flush(); ++ ++ // Fill-out other meta info ++ // CodeBlob frame size is in words. ++ return SafepointBlob::create(&buffer, oop_maps, frame_size_in_bytes / wordSize); ++} ++ ++// generate_resolve_blob - call resolution (static/virtual/opt-virtual/ic-miss) ++// ++// Generate a stub that calls into the vm to find out the proper destination ++// of a java call. All the argument registers are live at this point ++// but since this is generic code we don't know what they are and the caller ++// must do any gc of the args. ++// ++RuntimeStub* SharedRuntime::generate_resolve_blob(address destination, const char* name) { ++ ++ // allocate space for the code ++ ResourceMark rm; ++ ++ CodeBuffer buffer(name, 1000, 512); ++ MacroAssembler* masm = new MacroAssembler(&buffer); ++ ++ int frame_size_in_bytes; ++ ++ OopMapSet *oop_maps = new OopMapSet(); ++ OopMap* map = NULL; ++ ++ address start = __ pc(); ++ ++ map = RegisterSaver::push_frame_reg_args_and_save_live_registers(masm, ++ &frame_size_in_bytes, ++ /*generate_oop_map*/ true, ++ /*return_pc_adjustment*/ 0, ++ RegisterSaver::return_pc_is_lr); ++ ++ // Use noreg as last_Java_pc, the return pc will be reconstructed ++ // from the physical frame. ++ __ set_last_Java_frame(/*sp*/R1_SP, noreg); ++ ++ int frame_complete = __ offset(); ++ ++ // Pass R19_method as 2nd (optional) argument, used by ++ // counter_overflow_stub. ++ __ call_VM_leaf(destination, R16_thread, R19_method); ++ address calls_return_pc = __ last_calls_return_pc(); ++ // Set an oopmap for the call site. ++ // We need this not only for callee-saved registers, but also for volatile ++ // registers that the compiler might be keeping live across a safepoint. ++ // Create the oopmap for the call's return pc. ++ oop_maps->add_gc_map(calls_return_pc - start, map); ++ ++ // R3_RET contains the address we are going to jump to assuming no exception got installed. ++ ++ // clear last_Java_sp ++ __ reset_last_Java_frame(); ++ ++ // Check for pending exceptions. ++ BLOCK_COMMENT("Check for pending exceptions."); ++ Label pending; ++ __ ld(R11_scratch1, thread_(pending_exception)); ++ __ cmpdi(CCR0, R11_scratch1, 0); ++ __ bne(CCR0, pending); ++ ++ __ mtctr(R3_RET); // Ctr will not be touched by restore_live_registers_and_pop_frame. ++ ++ RegisterSaver::restore_live_registers_and_pop_frame(masm, frame_size_in_bytes, /*restore_ctr*/ false); ++ ++ // Get the returned method. ++ __ get_vm_result_2(R19_method); ++ ++ __ bctr(); ++ ++ ++ // Pending exception after the safepoint. ++ __ BIND(pending); ++ ++ RegisterSaver::restore_live_registers_and_pop_frame(masm, frame_size_in_bytes, /*restore_ctr*/ true); ++ ++ // exception pending => remove activation and forward to exception handler ++ ++ __ li(R11_scratch1, 0); ++ __ ld(R3_ARG1, thread_(pending_exception)); ++ __ std(R11_scratch1, in_bytes(JavaThread::vm_result_offset()), R16_thread); ++ __ b64_patchable(StubRoutines::forward_exception_entry(), relocInfo::runtime_call_type); ++ ++ // ------------- ++ // Make sure all code is generated. ++ masm->flush(); ++ ++ // return the blob ++ // frame_size_words or bytes?? ++ return RuntimeStub::new_runtime_stub(name, &buffer, frame_complete, frame_size_in_bytes/wordSize, ++ oop_maps, true); ++} +--- ./hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,2117 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/assembler.hpp" ++#include "asm/macroAssembler.inline.hpp" ++#include "interpreter/interpreter.hpp" ++#include "nativeInst_ppc.hpp" ++#include "oops/instanceOop.hpp" ++#include "oops/method.hpp" ++#include "oops/objArrayKlass.hpp" ++#include "oops/oop.inline.hpp" ++#include "prims/methodHandles.hpp" ++#include "runtime/frame.inline.hpp" ++#include "runtime/handles.inline.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubCodeGenerator.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "utilities/top.hpp" ++#ifdef COMPILER2 ++#include "opto/runtime.hpp" ++#endif ++#include "runtime/thread.inline.hpp" ++ ++#define __ _masm-> ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) // nothing ++#else ++#define BLOCK_COMMENT(str) __ block_comment(str) ++#endif ++ ++class StubGenerator: public StubCodeGenerator { ++ private: ++ ++ // Call stubs are used to call Java from C ++ // ++ // Arguments: ++ // ++ // R3 - call wrapper address : address ++ // R4 - result : intptr_t* ++ // R5 - result type : BasicType ++ // R6 - method : Method ++ // R7 - frame mgr entry point : address ++ // R8 - parameter block : intptr_t* ++ // R9 - parameter count in words : int ++ // R10 - thread : Thread* ++ // ++ address generate_call_stub(address& return_address) { ++ // Setup a new c frame, copy java arguments, call frame manager or ++ // native_entry, and process result. ++ ++ StubCodeMark mark(this, "StubRoutines", "call_stub"); ++ ++ address start = __ function_entry(); ++ ++ // some sanity checks ++ assert((sizeof(frame::abi_minframe) % 16) == 0, "unaligned"); ++ assert((sizeof(frame::abi_reg_args) % 16) == 0, "unaligned"); ++ assert((sizeof(frame::spill_nonvolatiles) % 16) == 0, "unaligned"); ++ assert((sizeof(frame::parent_ijava_frame_abi) % 16) == 0, "unaligned"); ++ assert((sizeof(frame::entry_frame_locals) % 16) == 0, "unaligned"); ++ ++ Register r_arg_call_wrapper_addr = R3; ++ Register r_arg_result_addr = R4; ++ Register r_arg_result_type = R5; ++ Register r_arg_method = R6; ++ Register r_arg_entry = R7; ++ Register r_arg_thread = R10; ++ ++ Register r_temp = R24; ++ Register r_top_of_arguments_addr = R25; ++ Register r_entryframe_fp = R26; ++ ++ { ++ // Stack on entry to call_stub: ++ // ++ // F1 [C_FRAME] ++ // ... ++ ++ Register r_arg_argument_addr = R8; ++ Register r_arg_argument_count = R9; ++ Register r_frame_alignment_in_bytes = R27; ++ Register r_argument_addr = R28; ++ Register r_argumentcopy_addr = R29; ++ Register r_argument_size_in_bytes = R30; ++ Register r_frame_size = R23; ++ ++ Label arguments_copied; ++ ++ // Save LR/CR to caller's C_FRAME. ++ __ save_LR_CR(R0); ++ ++ // Zero extend arg_argument_count. ++ __ clrldi(r_arg_argument_count, r_arg_argument_count, 32); ++ ++ // Save non-volatiles GPRs to ENTRY_FRAME (not yet pushed, but it's safe). ++ __ save_nonvolatile_gprs(R1_SP, _spill_nonvolatiles_neg(r14)); ++ ++ // Keep copy of our frame pointer (caller's SP). ++ __ mr(r_entryframe_fp, R1_SP); ++ ++ BLOCK_COMMENT("Push ENTRY_FRAME including arguments"); ++ // Push ENTRY_FRAME including arguments: ++ // ++ // F0 [TOP_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [outgoing Java arguments] ++ // [ENTRY_FRAME_LOCALS] ++ // F1 [C_FRAME] ++ // ... ++ ++ // calculate frame size ++ ++ // unaligned size of arguments ++ __ sldi(r_argument_size_in_bytes, ++ r_arg_argument_count, Interpreter::logStackElementSize); ++ // arguments alignment (max 1 slot) ++ // FIXME: use round_to() here ++ __ andi_(r_frame_alignment_in_bytes, r_arg_argument_count, 1); ++ __ sldi(r_frame_alignment_in_bytes, ++ r_frame_alignment_in_bytes, Interpreter::logStackElementSize); ++ ++ // size = unaligned size of arguments + top abi's size ++ __ addi(r_frame_size, r_argument_size_in_bytes, ++ frame::top_ijava_frame_abi_size); ++ // size += arguments alignment ++ __ add(r_frame_size, ++ r_frame_size, r_frame_alignment_in_bytes); ++ // size += size of call_stub locals ++ __ addi(r_frame_size, ++ r_frame_size, frame::entry_frame_locals_size); ++ ++ // push ENTRY_FRAME ++ __ push_frame(r_frame_size, r_temp); ++ ++ // initialize call_stub locals (step 1) ++ __ std(r_arg_call_wrapper_addr, ++ _entry_frame_locals_neg(call_wrapper_address), r_entryframe_fp); ++ __ std(r_arg_result_addr, ++ _entry_frame_locals_neg(result_address), r_entryframe_fp); ++ __ std(r_arg_result_type, ++ _entry_frame_locals_neg(result_type), r_entryframe_fp); ++ // we will save arguments_tos_address later ++ ++ ++ BLOCK_COMMENT("Copy Java arguments"); ++ // copy Java arguments ++ ++ // Calculate top_of_arguments_addr which will be R17_tos (not prepushed) later. ++ // FIXME: why not simply use SP+frame::top_ijava_frame_size? ++ __ addi(r_top_of_arguments_addr, ++ R1_SP, frame::top_ijava_frame_abi_size); ++ __ add(r_top_of_arguments_addr, ++ r_top_of_arguments_addr, r_frame_alignment_in_bytes); ++ ++ // any arguments to copy? ++ __ cmpdi(CCR0, r_arg_argument_count, 0); ++ __ beq(CCR0, arguments_copied); ++ ++ // prepare loop and copy arguments in reverse order ++ { ++ // init CTR with arg_argument_count ++ __ mtctr(r_arg_argument_count); ++ ++ // let r_argumentcopy_addr point to last outgoing Java arguments P ++ __ mr(r_argumentcopy_addr, r_top_of_arguments_addr); ++ ++ // let r_argument_addr point to last incoming java argument ++ __ add(r_argument_addr, ++ r_arg_argument_addr, r_argument_size_in_bytes); ++ __ addi(r_argument_addr, r_argument_addr, -BytesPerWord); ++ ++ // now loop while CTR > 0 and copy arguments ++ { ++ Label next_argument; ++ __ bind(next_argument); ++ ++ __ ld(r_temp, 0, r_argument_addr); ++ // argument_addr--; ++ __ addi(r_argument_addr, r_argument_addr, -BytesPerWord); ++ __ std(r_temp, 0, r_argumentcopy_addr); ++ // argumentcopy_addr++; ++ __ addi(r_argumentcopy_addr, r_argumentcopy_addr, BytesPerWord); ++ ++ __ bdnz(next_argument); ++ } ++ } ++ ++ // Arguments copied, continue. ++ __ bind(arguments_copied); ++ } ++ ++ { ++ BLOCK_COMMENT("Call frame manager or native entry."); ++ // Call frame manager or native entry. ++ Register r_new_arg_entry = R14; // PPC_state; ++ assert_different_registers(r_new_arg_entry, r_top_of_arguments_addr, ++ r_arg_method, r_arg_thread); ++ ++ __ mr(r_new_arg_entry, r_arg_entry); ++ ++ // Register state on entry to frame manager / native entry: ++ // ++ // tos - intptr_t* sender tos (prepushed) Lesp = (SP) + copied_arguments_offset - 8 ++ // R19_method - Method ++ // R16_thread - JavaThread* ++ ++ // Tos must point to last argument - element_size. ++#ifdef CC_INTERP ++ const Register tos = R17_tos; ++#else ++ const Register tos = R15_esp; ++#endif ++ __ addi(tos, r_top_of_arguments_addr, -Interpreter::stackElementSize); ++ ++ // initialize call_stub locals (step 2) ++ // now save tos as arguments_tos_address ++ __ std(tos, _entry_frame_locals_neg(arguments_tos_address), r_entryframe_fp); ++ ++ // load argument registers for call ++ __ mr(R19_method, r_arg_method); ++ __ mr(R16_thread, r_arg_thread); ++ assert(tos != r_arg_method, "trashed r_arg_method"); ++ assert(tos != r_arg_thread && R19_method != r_arg_thread, "trashed r_arg_thread"); ++ ++ // Set R15_prev_state to 0 for simplifying checks in callee. ++#ifdef CC_INTERP ++ __ li(R15_prev_state, 0); ++#else ++ __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R11_scratch1); ++#endif ++ // Stack on entry to frame manager / native entry: ++ // ++ // F0 [TOP_IJAVA_FRAME_ABI] ++ // alignment (optional) ++ // [outgoing Java arguments] ++ // [ENTRY_FRAME_LOCALS] ++ // F1 [C_FRAME] ++ // ... ++ // ++ ++ // global toc register ++ __ load_const(R29, MacroAssembler::global_toc(), R11_scratch1); ++ ++ // Load narrow oop base. ++ __ reinit_heapbase(R30, R11_scratch1); ++ ++ // Remember the senderSP so we interpreter can pop c2i arguments off of the stack ++ // when called via a c2i. ++ ++ // Pass initial_caller_sp to framemanager. ++ __ mr(R21_tmp1, R1_SP); ++ ++ // Do a light-weight C-call here, r_new_arg_entry holds the address ++ // of the interpreter entry point (frame manager or native entry) ++ // and save runtime-value of LR in return_address. ++ assert(r_new_arg_entry != tos && r_new_arg_entry != R19_method && r_new_arg_entry != R16_thread, ++ "trashed r_new_arg_entry"); ++ return_address = __ call_stub(r_new_arg_entry); ++ } ++ ++ { ++ BLOCK_COMMENT("Returned from frame manager or native entry."); ++ // Returned from frame manager or native entry. ++ // Now pop frame, process result, and return to caller. ++ ++ // Stack on exit from frame manager / native entry: ++ // ++ // F0 [ABI] ++ // ... ++ // [ENTRY_FRAME_LOCALS] ++ // F1 [C_FRAME] ++ // ... ++ // ++ // Just pop the topmost frame ... ++ // ++ ++ Label ret_is_object; ++ Label ret_is_long; ++ Label ret_is_float; ++ Label ret_is_double; ++ ++ Register r_entryframe_fp = R30; ++ Register r_lr = R7_ARG5; ++ Register r_cr = R8_ARG6; ++ ++ // Reload some volatile registers which we've spilled before the call ++ // to frame manager / native entry. ++ // Access all locals via frame pointer, because we know nothing about ++ // the topmost frame's size. ++ __ ld(r_entryframe_fp, _abi(callers_sp), R1_SP); ++ assert_different_registers(r_entryframe_fp, R3_RET, r_arg_result_addr, r_arg_result_type, r_cr, r_lr); ++ __ ld(r_arg_result_addr, ++ _entry_frame_locals_neg(result_address), r_entryframe_fp); ++ __ ld(r_arg_result_type, ++ _entry_frame_locals_neg(result_type), r_entryframe_fp); ++ __ ld(r_cr, _abi(cr), r_entryframe_fp); ++ __ ld(r_lr, _abi(lr), r_entryframe_fp); ++ ++ // pop frame and restore non-volatiles, LR and CR ++ __ mr(R1_SP, r_entryframe_fp); ++ __ mtcr(r_cr); ++ __ mtlr(r_lr); ++ ++ // Store result depending on type. Everything that is not ++ // T_OBJECT, T_LONG, T_FLOAT, or T_DOUBLE is treated as T_INT. ++ __ cmpwi(CCR0, r_arg_result_type, T_OBJECT); ++ __ cmpwi(CCR1, r_arg_result_type, T_LONG); ++ __ cmpwi(CCR5, r_arg_result_type, T_FLOAT); ++ __ cmpwi(CCR6, r_arg_result_type, T_DOUBLE); ++ ++ // restore non-volatile registers ++ __ restore_nonvolatile_gprs(R1_SP, _spill_nonvolatiles_neg(r14)); ++ ++ ++ // Stack on exit from call_stub: ++ // ++ // 0 [C_FRAME] ++ // ... ++ // ++ // no call_stub frames left. ++ ++ // All non-volatiles have been restored at this point!! ++ assert(R3_RET == R3, "R3_RET should be R3"); ++ ++ __ beq(CCR0, ret_is_object); ++ __ beq(CCR1, ret_is_long); ++ __ beq(CCR5, ret_is_float); ++ __ beq(CCR6, ret_is_double); ++ ++ // default: ++ __ stw(R3_RET, 0, r_arg_result_addr); ++ __ blr(); // return to caller ++ ++ // case T_OBJECT: ++ __ bind(ret_is_object); ++ __ std(R3_RET, 0, r_arg_result_addr); ++ __ blr(); // return to caller ++ ++ // case T_LONG: ++ __ bind(ret_is_long); ++ __ std(R3_RET, 0, r_arg_result_addr); ++ __ blr(); // return to caller ++ ++ // case T_FLOAT: ++ __ bind(ret_is_float); ++ __ stfs(F1_RET, 0, r_arg_result_addr); ++ __ blr(); // return to caller ++ ++ // case T_DOUBLE: ++ __ bind(ret_is_double); ++ __ stfd(F1_RET, 0, r_arg_result_addr); ++ __ blr(); // return to caller ++ } ++ ++ return start; ++ } ++ ++ // Return point for a Java call if there's an exception thrown in ++ // Java code. The exception is caught and transformed into a ++ // pending exception stored in JavaThread that can be tested from ++ // within the VM. ++ // ++ address generate_catch_exception() { ++ StubCodeMark mark(this, "StubRoutines", "catch_exception"); ++ ++ address start = __ pc(); ++ ++ // Registers alive ++ // ++ // R16_thread ++ // R3_ARG1 - address of pending exception ++ // R4_ARG2 - return address in call stub ++ ++ const Register exception_file = R21_tmp1; ++ const Register exception_line = R22_tmp2; ++ ++ __ load_const(exception_file, (void*)__FILE__); ++ __ load_const(exception_line, (void*)__LINE__); ++ ++ __ std(R3_ARG1, thread_(pending_exception)); ++ // store into `char *' ++ __ std(exception_file, thread_(exception_file)); ++ // store into `int' ++ __ stw(exception_line, thread_(exception_line)); ++ ++ // complete return to VM ++ assert(StubRoutines::_call_stub_return_address != NULL, "must have been generated before"); ++ ++ __ mtlr(R4_ARG2); ++ // continue in call stub ++ __ blr(); ++ ++ return start; ++ } ++ ++ // Continuation point for runtime calls returning with a pending ++ // exception. The pending exception check happened in the runtime ++ // or native call stub. The pending exception in Thread is ++ // converted into a Java-level exception. ++ // ++ address generate_forward_exception() { ++ StubCodeMark mark(this, "StubRoutines", "forward_exception"); ++ address start = __ pc(); ++ ++#if !defined(PRODUCT) ++ if (VerifyOops) { ++ // Get pending exception oop. ++ __ ld(R3_ARG1, ++ in_bytes(Thread::pending_exception_offset()), ++ R16_thread); ++ // Make sure that this code is only executed if there is a pending exception. ++ { ++ Label L; ++ __ cmpdi(CCR0, R3_ARG1, 0); ++ __ bne(CCR0, L); ++ __ stop("StubRoutines::forward exception: no pending exception (1)"); ++ __ bind(L); ++ } ++ __ verify_oop(R3_ARG1, "StubRoutines::forward exception: not an oop"); ++ } ++#endif ++ ++ // Save LR/CR and copy exception pc (LR) into R4_ARG2. ++ __ save_LR_CR(R4_ARG2); ++ __ push_frame_reg_args(0, R0); ++ // Find exception handler. ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, ++ SharedRuntime::exception_handler_for_return_address), ++ R16_thread, ++ R4_ARG2); ++ // Copy handler's address. ++ __ mtctr(R3_RET); ++ __ pop_frame(); ++ __ restore_LR_CR(R0); ++ ++ // Set up the arguments for the exception handler: ++ // - R3_ARG1: exception oop ++ // - R4_ARG2: exception pc. ++ ++ // Load pending exception oop. ++ __ ld(R3_ARG1, ++ in_bytes(Thread::pending_exception_offset()), ++ R16_thread); ++ ++ // The exception pc is the return address in the caller. ++ // Must load it into R4_ARG2. ++ __ mflr(R4_ARG2); ++ ++#ifdef ASSERT ++ // Make sure exception is set. ++ { ++ Label L; ++ __ cmpdi(CCR0, R3_ARG1, 0); ++ __ bne(CCR0, L); ++ __ stop("StubRoutines::forward exception: no pending exception (2)"); ++ __ bind(L); ++ } ++#endif ++ ++ // Clear the pending exception. ++ __ li(R0, 0); ++ __ std(R0, ++ in_bytes(Thread::pending_exception_offset()), ++ R16_thread); ++ // Jump to exception handler. ++ __ bctr(); ++ ++ return start; ++ } ++ ++#undef __ ++#define __ masm-> ++ // Continuation point for throwing of implicit exceptions that are ++ // not handled in the current activation. Fabricates an exception ++ // oop and initiates normal exception dispatching in this ++ // frame. Only callee-saved registers are preserved (through the ++ // normal register window / RegisterMap handling). If the compiler ++ // needs all registers to be preserved between the fault point and ++ // the exception handler then it must assume responsibility for that ++ // in AbstractCompiler::continuation_for_implicit_null_exception or ++ // continuation_for_implicit_division_by_zero_exception. All other ++ // implicit exceptions (e.g., NullPointerException or ++ // AbstractMethodError on entry) are either at call sites or ++ // otherwise assume that stack unwinding will be initiated, so ++ // caller saved registers were assumed volatile in the compiler. ++ // ++ // Note that we generate only this stub into a RuntimeStub, because ++ // it needs to be properly traversed and ignored during GC, so we ++ // change the meaning of the "__" macro within this method. ++ // ++ // Note: the routine set_pc_not_at_call_for_caller in ++ // SharedRuntime.cpp requires that this code be generated into a ++ // RuntimeStub. ++ address generate_throw_exception(const char* name, address runtime_entry, bool restore_saved_exception_pc, ++ Register arg1 = noreg, Register arg2 = noreg) { ++ CodeBuffer code(name, 1024 DEBUG_ONLY(+ 512), 0); ++ MacroAssembler* masm = new MacroAssembler(&code); ++ ++ OopMapSet* oop_maps = new OopMapSet(); ++ int frame_size_in_bytes = frame::abi_reg_args_size; ++ OopMap* map = new OopMap(frame_size_in_bytes / sizeof(jint), 0); ++ ++ StubCodeMark mark(this, "StubRoutines", "throw_exception"); ++ ++ address start = __ pc(); ++ ++ __ save_LR_CR(R11_scratch1); ++ ++ // Push a frame. ++ __ push_frame_reg_args(0, R11_scratch1); ++ ++ address frame_complete_pc = __ pc(); ++ ++ if (restore_saved_exception_pc) { ++ __ unimplemented("StubGenerator::throw_exception with restore_saved_exception_pc", 74); ++ } ++ ++ // Note that we always have a runtime stub frame on the top of ++ // stack by this point. Remember the offset of the instruction ++ // whose address will be moved to R11_scratch1. ++ address gc_map_pc = __ get_PC_trash_LR(R11_scratch1); ++ ++ __ set_last_Java_frame(/*sp*/R1_SP, /*pc*/R11_scratch1); ++ ++ __ mr(R3_ARG1, R16_thread); ++ if (arg1 != noreg) { ++ __ mr(R4_ARG2, arg1); ++ } ++ if (arg2 != noreg) { ++ __ mr(R5_ARG3, arg2); ++ } ++#if defined(ABI_ELFv2) ++ __ call_c(runtime_entry, relocInfo::none); ++#else ++ __ call_c(CAST_FROM_FN_PTR(FunctionDescriptor*, runtime_entry), relocInfo::none); ++#endif ++ ++ // Set an oopmap for the call site. ++ oop_maps->add_gc_map((int)(gc_map_pc - start), map); ++ ++ __ reset_last_Java_frame(); ++ ++#ifdef ASSERT ++ // Make sure that this code is only executed if there is a pending ++ // exception. ++ { ++ Label L; ++ __ ld(R0, ++ in_bytes(Thread::pending_exception_offset()), ++ R16_thread); ++ __ cmpdi(CCR0, R0, 0); ++ __ bne(CCR0, L); ++ __ stop("StubRoutines::throw_exception: no pending exception"); ++ __ bind(L); ++ } ++#endif ++ ++ // Pop frame. ++ __ pop_frame(); ++ ++ __ restore_LR_CR(R11_scratch1); ++ ++ __ load_const(R11_scratch1, StubRoutines::forward_exception_entry()); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++ ++ // Create runtime stub with OopMap. ++ RuntimeStub* stub = ++ RuntimeStub::new_runtime_stub(name, &code, ++ /*frame_complete=*/ (int)(frame_complete_pc - start), ++ frame_size_in_bytes/wordSize, ++ oop_maps, ++ false); ++ return stub->entry_point(); ++ } ++#undef __ ++#define __ _masm-> ++ ++ // Generate G1 pre-write barrier for array. ++ // ++ // Input: ++ // from - register containing src address (only needed for spilling) ++ // to - register containing starting address ++ // count - register containing element count ++ // tmp - scratch register ++ // ++ // Kills: ++ // nothing ++ // ++ void gen_write_ref_array_pre_barrier(Register from, Register to, Register count, bool dest_uninitialized, Register Rtmp1) { ++ BarrierSet* const bs = Universe::heap()->barrier_set(); ++ switch (bs->kind()) { ++ case BarrierSet::G1SATBCT: ++ case BarrierSet::G1SATBCTLogging: ++ // With G1, don't generate the call if we statically know that the target in uninitialized ++ if (!dest_uninitialized) { ++ const int spill_slots = 4 * wordSize; ++ const int frame_size = frame::abi_reg_args_size + spill_slots; ++ Label filtered; ++ ++ // Is marking active? ++ if (in_bytes(PtrQueue::byte_width_of_active()) == 4) { ++ __ lwz(Rtmp1, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_active()), R16_thread); ++ } else { ++ guarantee(in_bytes(PtrQueue::byte_width_of_active()) == 1, "Assumption"); ++ __ lbz(Rtmp1, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_active()), R16_thread); ++ } ++ __ cmpdi(CCR0, Rtmp1, 0); ++ __ beq(CCR0, filtered); ++ ++ __ save_LR_CR(R0); ++ __ push_frame_reg_args(spill_slots, R0); ++ __ std(from, frame_size - 1 * wordSize, R1_SP); ++ __ std(to, frame_size - 2 * wordSize, R1_SP); ++ __ std(count, frame_size - 3 * wordSize, R1_SP); ++ ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre), to, count); ++ ++ __ ld(from, frame_size - 1 * wordSize, R1_SP); ++ __ ld(to, frame_size - 2 * wordSize, R1_SP); ++ __ ld(count, frame_size - 3 * wordSize, R1_SP); ++ __ pop_frame(); ++ __ restore_LR_CR(R0); ++ ++ __ bind(filtered); ++ } ++ break; ++ case BarrierSet::CardTableModRef: ++ case BarrierSet::CardTableExtension: ++ case BarrierSet::ModRef: ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ } ++ ++ // Generate CMS/G1 post-write barrier for array. ++ // ++ // Input: ++ // addr - register containing starting address ++ // count - register containing element count ++ // tmp - scratch register ++ // ++ // The input registers and R0 are overwritten. ++ // ++ void gen_write_ref_array_post_barrier(Register addr, Register count, Register tmp, bool branchToEnd) { ++ BarrierSet* const bs = Universe::heap()->barrier_set(); ++ ++ switch (bs->kind()) { ++ case BarrierSet::G1SATBCT: ++ case BarrierSet::G1SATBCTLogging: ++ { ++ if (branchToEnd) { ++ __ save_LR_CR(R0); ++ // We need this frame only to spill LR. ++ __ push_frame_reg_args(0, R0); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post), addr, count); ++ __ pop_frame(); ++ __ restore_LR_CR(R0); ++ } else { ++ // Tail call: fake call from stub caller by branching without linking. ++ address entry_point = (address)CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post); ++ __ mr_if_needed(R3_ARG1, addr); ++ __ mr_if_needed(R4_ARG2, count); ++ __ load_const(R11, entry_point, R0); ++ __ call_c_and_return_to_caller(R11); ++ } ++ } ++ break; ++ case BarrierSet::CardTableModRef: ++ case BarrierSet::CardTableExtension: ++ { ++ Label Lskip_loop, Lstore_loop; ++ if (UseConcMarkSweepGC) { ++ // TODO PPC port: contribute optimization / requires shared changes ++ __ release(); ++ } ++ ++ CardTableModRefBS* const ct = (CardTableModRefBS*)bs; ++ assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); ++ assert_different_registers(addr, count, tmp); ++ ++ __ sldi(count, count, LogBytesPerHeapOop); ++ __ addi(count, count, -BytesPerHeapOop); ++ __ add(count, addr, count); ++ // Use two shifts to clear out those low order two bits! (Cannot opt. into 1.) ++ __ srdi(addr, addr, CardTableModRefBS::card_shift); ++ __ srdi(count, count, CardTableModRefBS::card_shift); ++ __ subf(count, addr, count); ++ assert_different_registers(R0, addr, count, tmp); ++ __ load_const(tmp, (address)ct->byte_map_base); ++ __ addic_(count, count, 1); ++ __ beq(CCR0, Lskip_loop); ++ __ li(R0, 0); ++ __ mtctr(count); ++ // Byte store loop ++ __ bind(Lstore_loop); ++ __ stbx(R0, tmp, addr); ++ __ addi(addr, addr, 1); ++ __ bdnz(Lstore_loop); ++ __ bind(Lskip_loop); ++ ++ if (!branchToEnd) __ blr(); ++ } ++ break; ++ case BarrierSet::ModRef: ++ if (!branchToEnd) __ blr(); ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ } ++ ++ // Support for void zero_words_aligned8(HeapWord* to, size_t count) ++ // ++ // Arguments: ++ // to: ++ // count: ++ // ++ // Destroys: ++ // ++ address generate_zero_words_aligned8() { ++ StubCodeMark mark(this, "StubRoutines", "zero_words_aligned8"); ++ ++ // Implemented as in ClearArray. ++ address start = __ function_entry(); ++ ++ Register base_ptr_reg = R3_ARG1; // tohw (needs to be 8b aligned) ++ Register cnt_dwords_reg = R4_ARG2; // count (in dwords) ++ Register tmp1_reg = R5_ARG3; ++ Register tmp2_reg = R6_ARG4; ++ Register zero_reg = R7_ARG5; ++ ++ // Procedure for large arrays (uses data cache block zero instruction). ++ Label dwloop, fast, fastloop, restloop, lastdword, done; ++ int cl_size=VM_Version::get_cache_line_size(), cl_dwords=cl_size>>3, cl_dwordaddr_bits=exact_log2(cl_dwords); ++ int min_dcbz=2; // Needs to be positive, apply dcbz only to at least min_dcbz cache lines. ++ ++ // Clear up to 128byte boundary if long enough, dword_cnt=(16-(base>>3))%16. ++ __ dcbtst(base_ptr_reg); // Indicate write access to first cache line ... ++ __ andi(tmp2_reg, cnt_dwords_reg, 1); // to check if number of dwords is even. ++ __ srdi_(tmp1_reg, cnt_dwords_reg, 1); // number of double dwords ++ __ load_const_optimized(zero_reg, 0L); // Use as zero register. ++ ++ __ cmpdi(CCR1, tmp2_reg, 0); // cnt_dwords even? ++ __ beq(CCR0, lastdword); // size <= 1 ++ __ mtctr(tmp1_reg); // Speculatively preload counter for rest loop (>0). ++ __ cmpdi(CCR0, cnt_dwords_reg, (min_dcbz+1)*cl_dwords-1); // Big enough to ensure >=min_dcbz cache lines are included? ++ __ neg(tmp1_reg, base_ptr_reg); // bit 0..58: bogus, bit 57..60: (16-(base>>3))%16, bit 61..63: 000 ++ ++ __ blt(CCR0, restloop); // Too small. (<31=(2*cl_dwords)-1 is sufficient, but bigger performs better.) ++ __ rldicl_(tmp1_reg, tmp1_reg, 64-3, 64-cl_dwordaddr_bits); // Extract number of dwords to 128byte boundary=(16-(base>>3))%16. ++ ++ __ beq(CCR0, fast); // already 128byte aligned ++ __ mtctr(tmp1_reg); // Set ctr to hit 128byte boundary (00 since size>=256-8) ++ ++ // Clear in first cache line dword-by-dword if not already 128byte aligned. ++ __ bind(dwloop); ++ __ std(zero_reg, 0, base_ptr_reg); // Clear 8byte aligned block. ++ __ addi(base_ptr_reg, base_ptr_reg, 8); ++ __ bdnz(dwloop); ++ ++ // clear 128byte blocks ++ __ bind(fast); ++ __ srdi(tmp1_reg, cnt_dwords_reg, cl_dwordaddr_bits); // loop count for 128byte loop (>0 since size>=256-8) ++ __ andi(tmp2_reg, cnt_dwords_reg, 1); // to check if rest even ++ ++ __ mtctr(tmp1_reg); // load counter ++ __ cmpdi(CCR1, tmp2_reg, 0); // rest even? ++ __ rldicl_(tmp1_reg, cnt_dwords_reg, 63, 65-cl_dwordaddr_bits); // rest in double dwords ++ ++ __ bind(fastloop); ++ __ dcbz(base_ptr_reg); // Clear 128byte aligned block. ++ __ addi(base_ptr_reg, base_ptr_reg, cl_size); ++ __ bdnz(fastloop); ++ ++ //__ dcbtst(base_ptr_reg); // Indicate write access to last cache line. ++ __ beq(CCR0, lastdword); // rest<=1 ++ __ mtctr(tmp1_reg); // load counter ++ ++ // Clear rest. ++ __ bind(restloop); ++ __ std(zero_reg, 0, base_ptr_reg); // Clear 8byte aligned block. ++ __ std(zero_reg, 8, base_ptr_reg); // Clear 8byte aligned block. ++ __ addi(base_ptr_reg, base_ptr_reg, 16); ++ __ bdnz(restloop); ++ ++ __ bind(lastdword); ++ __ beq(CCR1, done); ++ __ std(zero_reg, 0, base_ptr_reg); ++ __ bind(done); ++ __ blr(); // return ++ ++ return start; ++ } ++ ++ // The following routine generates a subroutine to throw an asynchronous ++ // UnknownError when an unsafe access gets a fault that could not be ++ // reasonably prevented by the programmer. (Example: SIGBUS/OBJERR.) ++ // ++ address generate_handler_for_unsafe_access() { ++ StubCodeMark mark(this, "StubRoutines", "handler_for_unsafe_access"); ++ address start = __ function_entry(); ++ __ unimplemented("StubRoutines::handler_for_unsafe_access", 93); ++ return start; ++ } ++ ++#if !defined(PRODUCT) ++ // Wrapper which calls oopDesc::is_oop_or_null() ++ // Only called by MacroAssembler::verify_oop ++ static void verify_oop_helper(const char* message, oop o) { ++ if (!o->is_oop_or_null()) { ++ fatal(message); ++ } ++ ++ StubRoutines::_verify_oop_count; ++ } ++#endif ++ ++ // Return address of code to be called from code generated by ++ // MacroAssembler::verify_oop. ++ // ++ // Don't generate, rather use C++ code. ++ address generate_verify_oop() { ++ StubCodeMark mark(this, "StubRoutines", "verify_oop"); ++ ++ // this is actually a `FunctionDescriptor*'. ++ address start = 0; ++ ++#if !defined(PRODUCT) ++ start = CAST_FROM_FN_PTR(address, verify_oop_helper); ++#endif ++ ++ return start; ++ } ++ ++ // Fairer handling of safepoints for native methods. ++ // ++ // Generate code which reads from the polling page. This special handling is needed as the ++ // linux-ppc64 kernel before 2.6.6 doesn't set si_addr on some segfaults in 64bit mode ++ // (cf. http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.6), especially when we try ++ // to read from the safepoint polling page. ++ address generate_load_from_poll() { ++ StubCodeMark mark(this, "StubRoutines", "generate_load_from_poll"); ++ address start = __ function_entry(); ++ __ unimplemented("StubRoutines::verify_oop", 95); // TODO PPC port ++ return start; ++ } ++ ++ // -XX:+OptimizeFill : convert fill/copy loops into intrinsic ++ // ++ // The code is implemented(ported from sparc) as we believe it benefits JVM98, however ++ // tracing(-XX:+TraceOptimizeFill) shows the intrinsic replacement doesn't happen at all! ++ // ++ // Source code in function is_range_check_if() shows that OptimizeFill relaxed the condition ++ // for turning on loop predication optimization, and hence the behavior of "array range check" ++ // and "loop invariant check" could be influenced, which potentially boosted JVM98. ++ // ++ // Generate stub for disjoint short fill. If "aligned" is true, the ++ // "to" address is assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // to: R3_ARG1 ++ // value: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ address generate_fill(BasicType t, bool aligned, const char* name) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ address start = __ function_entry(); ++ ++ const Register to = R3_ARG1; // source array address ++ const Register value = R4_ARG2; // fill value ++ const Register count = R5_ARG3; // elements count ++ const Register temp = R6_ARG4; // temp register ++ ++ //assert_clean_int(count, O3); // Make sure 'count' is clean int. ++ ++ Label L_exit, L_skip_align1, L_skip_align2, L_fill_byte; ++ Label L_fill_2_bytes, L_fill_4_bytes, L_fill_elements, L_fill_32_bytes; ++ ++ int shift = -1; ++ switch (t) { ++ case T_BYTE: ++ shift = 2; ++ // Clone bytes (zero extend not needed because store instructions below ignore high order bytes). ++ __ rldimi(value, value, 8, 48); // 8 bit -> 16 bit ++ __ cmpdi(CCR0, count, 2< 32 bit ++ break; ++ case T_SHORT: ++ shift = 1; ++ // Clone bytes (zero extend not needed because store instructions below ignore high order bytes). ++ __ rldimi(value, value, 16, 32); // 16 bit -> 32 bit ++ __ cmpdi(CCR0, count, 2<long as above. ++ __ rldimi(value, value, 32, 0); // 32 bit -> 64 bit ++ ++ Label L_check_fill_8_bytes; ++ // Fill 32-byte chunks. ++ __ subf_(count, temp, count); ++ __ blt(CCR0, L_check_fill_8_bytes); ++ ++ Label L_fill_32_bytes_loop; ++ __ align(32); ++ __ bind(L_fill_32_bytes_loop); ++ ++ __ std(value, 0, to); ++ __ std(value, 8, to); ++ __ subf_(count, temp, count); // Update count. ++ __ std(value, 16, to); ++ __ std(value, 24, to); ++ ++ __ addi(to, to, 32); ++ __ bge(CCR0, L_fill_32_bytes_loop); ++ ++ __ bind(L_check_fill_8_bytes); ++ __ add_(count, temp, count); ++ __ beq(CCR0, L_exit); ++ __ addic_(count, count, -(2 << shift)); ++ __ blt(CCR0, L_fill_4_bytes); ++ ++ // ++ // Length is too short, just fill 8 bytes at a time. ++ // ++ Label L_fill_8_bytes_loop; ++ __ bind(L_fill_8_bytes_loop); ++ __ std(value, 0, to); ++ __ addic_(count, count, -(2 << shift)); ++ __ addi(to, to, 8); ++ __ bge(CCR0, L_fill_8_bytes_loop); ++ ++ // Fill trailing 4 bytes. ++ __ bind(L_fill_4_bytes); ++ __ andi_(temp, count, 1< to or from is aligned -> copy 8 ++ ++ // copy a 2-element word if necessary to align to 8 bytes ++ __ andi_(R0, R3_ARG1, 7); ++ __ beq(CCR0, l_7); ++ ++ __ lwzx(tmp2, R3_ARG1, tmp3); ++ __ addi(R5_ARG3, R5_ARG3, -4); ++ __ stwx(tmp2, R4_ARG2, tmp3); ++ { // FasterArrayCopy ++ __ addi(R3_ARG1, R3_ARG1, 4); ++ __ addi(R4_ARG2, R4_ARG2, 4); ++ } ++ __ bind(l_7); ++ ++ { // FasterArrayCopy ++ __ cmpwi(CCR0, R5_ARG3, 31); ++ __ ble(CCR0, l_6); // copy 2 at a time if less than 32 elements remain ++ ++ __ srdi(tmp1, R5_ARG3, 5); ++ __ andi_(R5_ARG3, R5_ARG3, 31); ++ __ mtctr(tmp1); ++ ++ __ bind(l_8); ++ // Use unrolled version for mass copying (copy 32 elements a time) ++ // Load feeding store gets zero latency on Power6, however not on Power5. ++ // Therefore, the following sequence is made for the good of both. ++ __ ld(tmp1, 0, R3_ARG1); ++ __ ld(tmp2, 8, R3_ARG1); ++ __ ld(tmp3, 16, R3_ARG1); ++ __ ld(tmp4, 24, R3_ARG1); ++ __ std(tmp1, 0, R4_ARG2); ++ __ std(tmp2, 8, R4_ARG2); ++ __ std(tmp3, 16, R4_ARG2); ++ __ std(tmp4, 24, R4_ARG2); ++ __ addi(R3_ARG1, R3_ARG1, 32); ++ __ addi(R4_ARG2, R4_ARG2, 32); ++ __ bdnz(l_8); ++ } ++ ++ __ bind(l_6); ++ ++ // copy 4 elements at a time ++ __ cmpwi(CCR0, R5_ARG3, 4); ++ __ blt(CCR0, l_1); ++ __ srdi(tmp1, R5_ARG3, 2); ++ __ mtctr(tmp1); // is > 0 ++ __ andi_(R5_ARG3, R5_ARG3, 3); ++ ++ { // FasterArrayCopy ++ __ addi(R3_ARG1, R3_ARG1, -4); ++ __ addi(R4_ARG2, R4_ARG2, -4); ++ __ bind(l_3); ++ __ lwzu(tmp2, 4, R3_ARG1); ++ __ stwu(tmp2, 4, R4_ARG2); ++ __ bdnz(l_3); ++ __ addi(R3_ARG1, R3_ARG1, 4); ++ __ addi(R4_ARG2, R4_ARG2, 4); ++ } ++ ++ // do single element copy ++ __ bind(l_1); ++ __ cmpwi(CCR0, R5_ARG3, 0); ++ __ beq(CCR0, l_4); ++ ++ { // FasterArrayCopy ++ __ mtctr(R5_ARG3); ++ __ addi(R3_ARG1, R3_ARG1, -1); ++ __ addi(R4_ARG2, R4_ARG2, -1); ++ ++ __ bind(l_5); ++ __ lbzu(tmp2, 1, R3_ARG1); ++ __ stbu(tmp2, 1, R4_ARG2); ++ __ bdnz(l_5); ++ } ++ ++ __ bind(l_4); ++ __ blr(); ++ ++ return start; ++ } ++ ++ // Generate stub for conjoint byte copy. If "aligned" is true, the ++ // "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ address generate_conjoint_byte_copy(bool aligned, const char * name) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ address start = __ function_entry(); ++ ++ Register tmp1 = R6_ARG4; ++ Register tmp2 = R7_ARG5; ++ Register tmp3 = R8_ARG6; ++ ++#if defined(ABI_ELFv2) ++ address nooverlap_target = aligned ? ++ StubRoutines::arrayof_jbyte_disjoint_arraycopy() : ++ StubRoutines::jbyte_disjoint_arraycopy(); ++#else ++ address nooverlap_target = aligned ? ++ ((FunctionDescriptor*)StubRoutines::arrayof_jbyte_disjoint_arraycopy())->entry() : ++ ((FunctionDescriptor*)StubRoutines::jbyte_disjoint_arraycopy())->entry(); ++#endif ++ ++ array_overlap_test(nooverlap_target, 0); ++ // Do reverse copy. We assume the case of actual overlap is rare enough ++ // that we don't have to optimize it. ++ Label l_1, l_2; ++ ++ __ b(l_2); ++ __ bind(l_1); ++ __ stbx(tmp1, R4_ARG2, R5_ARG3); ++ __ bind(l_2); ++ __ addic_(R5_ARG3, R5_ARG3, -1); ++ __ lbzx(tmp1, R3_ARG1, R5_ARG3); ++ __ bge(CCR0, l_1); ++ ++ __ blr(); ++ ++ return start; ++ } ++ ++ // Generate stub for disjoint short copy. If "aligned" is true, the ++ // "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // elm.count: R5_ARG3 treated as signed ++ // ++ // Strategy for aligned==true: ++ // ++ // If length <= 9: ++ // 1. copy 2 elements at a time (l_6) ++ // 2. copy last element if original element count was odd (l_1) ++ // ++ // If length > 9: ++ // 1. copy 4 elements at a time until less than 4 elements are left (l_7) ++ // 2. copy 2 elements at a time until less than 2 elements are left (l_6) ++ // 3. copy last element if one was left in step 2. (l_1) ++ // ++ // ++ // Strategy for aligned==false: ++ // ++ // If length <= 9: same as aligned==true case, but NOTE: load/stores ++ // can be unaligned (see comment below) ++ // ++ // If length > 9: ++ // 1. continue with step 6. if the alignment of from and to mod 4 ++ // is different. ++ // 2. align from and to to 4 bytes by copying 1 element if necessary ++ // 3. at l_2 from and to are 4 byte aligned; continue with ++ // 5. if they cannot be aligned to 8 bytes because they have ++ // got different alignment mod 8. ++ // 4. at this point we know that both, from and to, have the same ++ // alignment mod 8, now copy one element if necessary to get ++ // 8 byte alignment of from and to. ++ // 5. copy 4 elements at a time until less than 4 elements are ++ // left; depending on step 3. all load/stores are aligned or ++ // either all loads or all stores are unaligned. ++ // 6. copy 2 elements at a time until less than 2 elements are ++ // left (l_6); arriving here from step 1., there is a chance ++ // that all accesses are unaligned. ++ // 7. copy last element if one was left in step 6. (l_1) ++ // ++ // There are unaligned data accesses using integer load/store ++ // instructions in this stub. POWER allows such accesses. ++ // ++ // According to the manuals (PowerISA_V2.06_PUBLIC, Book II, ++ // Chapter 2: Effect of Operand Placement on Performance) unaligned ++ // integer load/stores have good performance. Only unaligned ++ // floating point load/stores can have poor performance. ++ // ++ // TODO: ++ // ++ // 1. check if aligning the backbranch target of loops is beneficial ++ // ++ address generate_disjoint_short_copy(bool aligned, const char * name) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ ++ Register tmp1 = R6_ARG4; ++ Register tmp2 = R7_ARG5; ++ Register tmp3 = R8_ARG6; ++ Register tmp4 = R9_ARG7; ++ ++ address start = __ function_entry(); ++ ++ Label l_1, l_2, l_3, l_4, l_5, l_6, l_7, l_8; ++ // don't try anything fancy if arrays don't have many elements ++ __ li(tmp3, 0); ++ __ cmpwi(CCR0, R5_ARG3, 9); ++ __ ble(CCR0, l_6); // copy 2 at a time ++ ++ if (!aligned) { ++ __ xorr(tmp1, R3_ARG1, R4_ARG2); ++ __ andi_(tmp1, tmp1, 3); ++ __ bne(CCR0, l_6); // if arrays don't have the same alignment mod 4, do 2 element copy ++ ++ // At this point it is guaranteed that both, from and to have the same alignment mod 4. ++ ++ // Copy 1 element if necessary to align to 4 bytes. ++ __ andi_(tmp1, R3_ARG1, 3); ++ __ beq(CCR0, l_2); ++ ++ __ lhz(tmp2, 0, R3_ARG1); ++ __ addi(R3_ARG1, R3_ARG1, 2); ++ __ sth(tmp2, 0, R4_ARG2); ++ __ addi(R4_ARG2, R4_ARG2, 2); ++ __ addi(R5_ARG3, R5_ARG3, -1); ++ __ bind(l_2); ++ ++ // At this point the positions of both, from and to, are at least 4 byte aligned. ++ ++ // Copy 4 elements at a time. ++ // Align to 8 bytes, but only if both, from and to, have same alignment mod 8. ++ __ xorr(tmp2, R3_ARG1, R4_ARG2); ++ __ andi_(tmp1, tmp2, 7); ++ __ bne(CCR0, l_7); // not same alignment mod 8 -> copy 4, either from or to will be unaligned ++ ++ // Copy a 2-element word if necessary to align to 8 bytes. ++ __ andi_(R0, R3_ARG1, 7); ++ __ beq(CCR0, l_7); ++ ++ __ lwzx(tmp2, R3_ARG1, tmp3); ++ __ addi(R5_ARG3, R5_ARG3, -2); ++ __ stwx(tmp2, R4_ARG2, tmp3); ++ { // FasterArrayCopy ++ __ addi(R3_ARG1, R3_ARG1, 4); ++ __ addi(R4_ARG2, R4_ARG2, 4); ++ } ++ } ++ ++ __ bind(l_7); ++ ++ // Copy 4 elements at a time; either the loads or the stores can ++ // be unaligned if aligned == false. ++ ++ { // FasterArrayCopy ++ __ cmpwi(CCR0, R5_ARG3, 15); ++ __ ble(CCR0, l_6); // copy 2 at a time if less than 16 elements remain ++ ++ __ srdi(tmp1, R5_ARG3, 4); ++ __ andi_(R5_ARG3, R5_ARG3, 15); ++ __ mtctr(tmp1); ++ ++ __ bind(l_8); ++ // Use unrolled version for mass copying (copy 16 elements a time). ++ // Load feeding store gets zero latency on Power6, however not on Power5. ++ // Therefore, the following sequence is made for the good of both. ++ __ ld(tmp1, 0, R3_ARG1); ++ __ ld(tmp2, 8, R3_ARG1); ++ __ ld(tmp3, 16, R3_ARG1); ++ __ ld(tmp4, 24, R3_ARG1); ++ __ std(tmp1, 0, R4_ARG2); ++ __ std(tmp2, 8, R4_ARG2); ++ __ std(tmp3, 16, R4_ARG2); ++ __ std(tmp4, 24, R4_ARG2); ++ __ addi(R3_ARG1, R3_ARG1, 32); ++ __ addi(R4_ARG2, R4_ARG2, 32); ++ __ bdnz(l_8); ++ } ++ __ bind(l_6); ++ ++ // copy 2 elements at a time ++ { // FasterArrayCopy ++ __ cmpwi(CCR0, R5_ARG3, 2); ++ __ blt(CCR0, l_1); ++ __ srdi(tmp1, R5_ARG3, 1); ++ __ andi_(R5_ARG3, R5_ARG3, 1); ++ ++ __ addi(R3_ARG1, R3_ARG1, -4); ++ __ addi(R4_ARG2, R4_ARG2, -4); ++ __ mtctr(tmp1); ++ ++ __ bind(l_3); ++ __ lwzu(tmp2, 4, R3_ARG1); ++ __ stwu(tmp2, 4, R4_ARG2); ++ __ bdnz(l_3); ++ ++ __ addi(R3_ARG1, R3_ARG1, 4); ++ __ addi(R4_ARG2, R4_ARG2, 4); ++ } ++ ++ // do single element copy ++ __ bind(l_1); ++ __ cmpwi(CCR0, R5_ARG3, 0); ++ __ beq(CCR0, l_4); ++ ++ { // FasterArrayCopy ++ __ mtctr(R5_ARG3); ++ __ addi(R3_ARG1, R3_ARG1, -2); ++ __ addi(R4_ARG2, R4_ARG2, -2); ++ ++ __ bind(l_5); ++ __ lhzu(tmp2, 2, R3_ARG1); ++ __ sthu(tmp2, 2, R4_ARG2); ++ __ bdnz(l_5); ++ } ++ __ bind(l_4); ++ __ blr(); ++ ++ return start; ++ } ++ ++ // Generate stub for conjoint short copy. If "aligned" is true, the ++ // "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ address generate_conjoint_short_copy(bool aligned, const char * name) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ address start = __ function_entry(); ++ ++ Register tmp1 = R6_ARG4; ++ Register tmp2 = R7_ARG5; ++ Register tmp3 = R8_ARG6; ++ ++#if defined(ABI_ELFv2) ++ address nooverlap_target = aligned ? ++ StubRoutines::arrayof_jshort_disjoint_arraycopy() : ++ StubRoutines::jshort_disjoint_arraycopy(); ++#else ++ address nooverlap_target = aligned ? ++ ((FunctionDescriptor*)StubRoutines::arrayof_jshort_disjoint_arraycopy())->entry() : ++ ((FunctionDescriptor*)StubRoutines::jshort_disjoint_arraycopy())->entry(); ++#endif ++ ++ array_overlap_test(nooverlap_target, 1); ++ ++ Label l_1, l_2; ++ __ sldi(tmp1, R5_ARG3, 1); ++ __ b(l_2); ++ __ bind(l_1); ++ __ sthx(tmp2, R4_ARG2, tmp1); ++ __ bind(l_2); ++ __ addic_(tmp1, tmp1, -2); ++ __ lhzx(tmp2, R3_ARG1, tmp1); ++ __ bge(CCR0, l_1); ++ ++ __ blr(); ++ ++ return start; ++ } ++ ++ // Generate core code for disjoint int copy (and oop copy on 32-bit). If "aligned" ++ // is true, the "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ void generate_disjoint_int_copy_core(bool aligned) { ++ Register tmp1 = R6_ARG4; ++ Register tmp2 = R7_ARG5; ++ Register tmp3 = R8_ARG6; ++ Register tmp4 = R0; ++ ++ Label l_1, l_2, l_3, l_4, l_5, l_6; ++ // for short arrays, just do single element copy ++ __ li(tmp3, 0); ++ __ cmpwi(CCR0, R5_ARG3, 5); ++ __ ble(CCR0, l_2); ++ ++ if (!aligned) { ++ // check if arrays have same alignment mod 8. ++ __ xorr(tmp1, R3_ARG1, R4_ARG2); ++ __ andi_(R0, tmp1, 7); ++ // Not the same alignment, but ld and std just need to be 4 byte aligned. ++ __ bne(CCR0, l_4); // to OR from is 8 byte aligned -> copy 2 at a time ++ ++ // copy 1 element to align to and from on an 8 byte boundary ++ __ andi_(R0, R3_ARG1, 7); ++ __ beq(CCR0, l_4); ++ ++ __ lwzx(tmp2, R3_ARG1, tmp3); ++ __ addi(R5_ARG3, R5_ARG3, -1); ++ __ stwx(tmp2, R4_ARG2, tmp3); ++ { // FasterArrayCopy ++ __ addi(R3_ARG1, R3_ARG1, 4); ++ __ addi(R4_ARG2, R4_ARG2, 4); ++ } ++ __ bind(l_4); ++ } ++ ++ { // FasterArrayCopy ++ __ cmpwi(CCR0, R5_ARG3, 7); ++ __ ble(CCR0, l_2); // copy 1 at a time if less than 8 elements remain ++ ++ __ srdi(tmp1, R5_ARG3, 3); ++ __ andi_(R5_ARG3, R5_ARG3, 7); ++ __ mtctr(tmp1); ++ ++ __ bind(l_6); ++ // Use unrolled version for mass copying (copy 8 elements a time). ++ // Load feeding store gets zero latency on power6, however not on power 5. ++ // Therefore, the following sequence is made for the good of both. ++ __ ld(tmp1, 0, R3_ARG1); ++ __ ld(tmp2, 8, R3_ARG1); ++ __ ld(tmp3, 16, R3_ARG1); ++ __ ld(tmp4, 24, R3_ARG1); ++ __ std(tmp1, 0, R4_ARG2); ++ __ std(tmp2, 8, R4_ARG2); ++ __ std(tmp3, 16, R4_ARG2); ++ __ std(tmp4, 24, R4_ARG2); ++ __ addi(R3_ARG1, R3_ARG1, 32); ++ __ addi(R4_ARG2, R4_ARG2, 32); ++ __ bdnz(l_6); ++ } ++ ++ // copy 1 element at a time ++ __ bind(l_2); ++ __ cmpwi(CCR0, R5_ARG3, 0); ++ __ beq(CCR0, l_1); ++ ++ { // FasterArrayCopy ++ __ mtctr(R5_ARG3); ++ __ addi(R3_ARG1, R3_ARG1, -4); ++ __ addi(R4_ARG2, R4_ARG2, -4); ++ ++ __ bind(l_3); ++ __ lwzu(tmp2, 4, R3_ARG1); ++ __ stwu(tmp2, 4, R4_ARG2); ++ __ bdnz(l_3); ++ } ++ ++ __ bind(l_1); ++ return; ++ } ++ ++ // Generate stub for disjoint int copy. If "aligned" is true, the ++ // "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ address generate_disjoint_int_copy(bool aligned, const char * name) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ address start = __ function_entry(); ++ generate_disjoint_int_copy_core(aligned); ++ __ blr(); ++ return start; ++ } ++ ++ // Generate core code for conjoint int copy (and oop copy on ++ // 32-bit). If "aligned" is true, the "from" and "to" addresses ++ // are assumed to be heapword aligned. ++ // ++ // Arguments: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ void generate_conjoint_int_copy_core(bool aligned) { ++ // Do reverse copy. We assume the case of actual overlap is rare enough ++ // that we don't have to optimize it. ++ ++ Label l_1, l_2, l_3, l_4, l_5, l_6; ++ ++ Register tmp1 = R6_ARG4; ++ Register tmp2 = R7_ARG5; ++ Register tmp3 = R8_ARG6; ++ Register tmp4 = R0; ++ ++ { // FasterArrayCopy ++ __ cmpwi(CCR0, R5_ARG3, 0); ++ __ beq(CCR0, l_6); ++ ++ __ sldi(R5_ARG3, R5_ARG3, 2); ++ __ add(R3_ARG1, R3_ARG1, R5_ARG3); ++ __ add(R4_ARG2, R4_ARG2, R5_ARG3); ++ __ srdi(R5_ARG3, R5_ARG3, 2); ++ ++ __ cmpwi(CCR0, R5_ARG3, 7); ++ __ ble(CCR0, l_5); // copy 1 at a time if less than 8 elements remain ++ ++ __ srdi(tmp1, R5_ARG3, 3); ++ __ andi(R5_ARG3, R5_ARG3, 7); ++ __ mtctr(tmp1); ++ ++ __ bind(l_4); ++ // Use unrolled version for mass copying (copy 4 elements a time). ++ // Load feeding store gets zero latency on Power6, however not on Power5. ++ // Therefore, the following sequence is made for the good of both. ++ __ addi(R3_ARG1, R3_ARG1, -32); ++ __ addi(R4_ARG2, R4_ARG2, -32); ++ __ ld(tmp4, 24, R3_ARG1); ++ __ ld(tmp3, 16, R3_ARG1); ++ __ ld(tmp2, 8, R3_ARG1); ++ __ ld(tmp1, 0, R3_ARG1); ++ __ std(tmp4, 24, R4_ARG2); ++ __ std(tmp3, 16, R4_ARG2); ++ __ std(tmp2, 8, R4_ARG2); ++ __ std(tmp1, 0, R4_ARG2); ++ __ bdnz(l_4); ++ ++ __ cmpwi(CCR0, R5_ARG3, 0); ++ __ beq(CCR0, l_6); ++ ++ __ bind(l_5); ++ __ mtctr(R5_ARG3); ++ __ bind(l_3); ++ __ lwz(R0, -4, R3_ARG1); ++ __ stw(R0, -4, R4_ARG2); ++ __ addi(R3_ARG1, R3_ARG1, -4); ++ __ addi(R4_ARG2, R4_ARG2, -4); ++ __ bdnz(l_3); ++ ++ __ bind(l_6); ++ } ++ } ++ ++ // Generate stub for conjoint int copy. If "aligned" is true, the ++ // "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ address generate_conjoint_int_copy(bool aligned, const char * name) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ address start = __ function_entry(); ++ ++#if defined(ABI_ELFv2) ++ address nooverlap_target = aligned ? ++ StubRoutines::arrayof_jint_disjoint_arraycopy() : ++ StubRoutines::jint_disjoint_arraycopy(); ++#else ++ address nooverlap_target = aligned ? ++ ((FunctionDescriptor*)StubRoutines::arrayof_jint_disjoint_arraycopy())->entry() : ++ ((FunctionDescriptor*)StubRoutines::jint_disjoint_arraycopy())->entry(); ++#endif ++ ++ array_overlap_test(nooverlap_target, 2); ++ ++ generate_conjoint_int_copy_core(aligned); ++ ++ __ blr(); ++ ++ return start; ++ } ++ ++ // Generate core code for disjoint long copy (and oop copy on ++ // 64-bit). If "aligned" is true, the "from" and "to" addresses ++ // are assumed to be heapword aligned. ++ // ++ // Arguments: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ void generate_disjoint_long_copy_core(bool aligned) { ++ Register tmp1 = R6_ARG4; ++ Register tmp2 = R7_ARG5; ++ Register tmp3 = R8_ARG6; ++ Register tmp4 = R0; ++ ++ Label l_1, l_2, l_3, l_4; ++ ++ { // FasterArrayCopy ++ __ cmpwi(CCR0, R5_ARG3, 3); ++ __ ble(CCR0, l_3); // copy 1 at a time if less than 4 elements remain ++ ++ __ srdi(tmp1, R5_ARG3, 2); ++ __ andi_(R5_ARG3, R5_ARG3, 3); ++ __ mtctr(tmp1); ++ ++ __ bind(l_4); ++ // Use unrolled version for mass copying (copy 4 elements a time). ++ // Load feeding store gets zero latency on Power6, however not on Power5. ++ // Therefore, the following sequence is made for the good of both. ++ __ ld(tmp1, 0, R3_ARG1); ++ __ ld(tmp2, 8, R3_ARG1); ++ __ ld(tmp3, 16, R3_ARG1); ++ __ ld(tmp4, 24, R3_ARG1); ++ __ std(tmp1, 0, R4_ARG2); ++ __ std(tmp2, 8, R4_ARG2); ++ __ std(tmp3, 16, R4_ARG2); ++ __ std(tmp4, 24, R4_ARG2); ++ __ addi(R3_ARG1, R3_ARG1, 32); ++ __ addi(R4_ARG2, R4_ARG2, 32); ++ __ bdnz(l_4); ++ } ++ ++ // copy 1 element at a time ++ __ bind(l_3); ++ __ cmpwi(CCR0, R5_ARG3, 0); ++ __ beq(CCR0, l_1); ++ ++ { // FasterArrayCopy ++ __ mtctr(R5_ARG3); ++ __ addi(R3_ARG1, R3_ARG1, -8); ++ __ addi(R4_ARG2, R4_ARG2, -8); ++ ++ __ bind(l_2); ++ __ ldu(R0, 8, R3_ARG1); ++ __ stdu(R0, 8, R4_ARG2); ++ __ bdnz(l_2); ++ ++ } ++ __ bind(l_1); ++ } ++ ++ // Generate stub for disjoint long copy. If "aligned" is true, the ++ // "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ address generate_disjoint_long_copy(bool aligned, const char * name) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ address start = __ function_entry(); ++ generate_disjoint_long_copy_core(aligned); ++ __ blr(); ++ ++ return start; ++ } ++ ++ // Generate core code for conjoint long copy (and oop copy on ++ // 64-bit). If "aligned" is true, the "from" and "to" addresses ++ // are assumed to be heapword aligned. ++ // ++ // Arguments: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ void generate_conjoint_long_copy_core(bool aligned) { ++ Register tmp1 = R6_ARG4; ++ Register tmp2 = R7_ARG5; ++ Register tmp3 = R8_ARG6; ++ Register tmp4 = R0; ++ ++ Label l_1, l_2, l_3, l_4, l_5; ++ ++ __ cmpwi(CCR0, R5_ARG3, 0); ++ __ beq(CCR0, l_1); ++ ++ { // FasterArrayCopy ++ __ sldi(R5_ARG3, R5_ARG3, 3); ++ __ add(R3_ARG1, R3_ARG1, R5_ARG3); ++ __ add(R4_ARG2, R4_ARG2, R5_ARG3); ++ __ srdi(R5_ARG3, R5_ARG3, 3); ++ ++ __ cmpwi(CCR0, R5_ARG3, 3); ++ __ ble(CCR0, l_5); // copy 1 at a time if less than 4 elements remain ++ ++ __ srdi(tmp1, R5_ARG3, 2); ++ __ andi(R5_ARG3, R5_ARG3, 3); ++ __ mtctr(tmp1); ++ ++ __ bind(l_4); ++ // Use unrolled version for mass copying (copy 4 elements a time). ++ // Load feeding store gets zero latency on Power6, however not on Power5. ++ // Therefore, the following sequence is made for the good of both. ++ __ addi(R3_ARG1, R3_ARG1, -32); ++ __ addi(R4_ARG2, R4_ARG2, -32); ++ __ ld(tmp4, 24, R3_ARG1); ++ __ ld(tmp3, 16, R3_ARG1); ++ __ ld(tmp2, 8, R3_ARG1); ++ __ ld(tmp1, 0, R3_ARG1); ++ __ std(tmp4, 24, R4_ARG2); ++ __ std(tmp3, 16, R4_ARG2); ++ __ std(tmp2, 8, R4_ARG2); ++ __ std(tmp1, 0, R4_ARG2); ++ __ bdnz(l_4); ++ ++ __ cmpwi(CCR0, R5_ARG3, 0); ++ __ beq(CCR0, l_1); ++ ++ __ bind(l_5); ++ __ mtctr(R5_ARG3); ++ __ bind(l_3); ++ __ ld(R0, -8, R3_ARG1); ++ __ std(R0, -8, R4_ARG2); ++ __ addi(R3_ARG1, R3_ARG1, -8); ++ __ addi(R4_ARG2, R4_ARG2, -8); ++ __ bdnz(l_3); ++ ++ } ++ __ bind(l_1); ++ } ++ ++ // Generate stub for conjoint long copy. If "aligned" is true, the ++ // "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // ++ address generate_conjoint_long_copy(bool aligned, const char * name) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ address start = __ function_entry(); ++ ++#if defined(ABI_ELFv2) ++ address nooverlap_target = aligned ? ++ StubRoutines::arrayof_jlong_disjoint_arraycopy() : ++ StubRoutines::jlong_disjoint_arraycopy(); ++#else ++ address nooverlap_target = aligned ? ++ ((FunctionDescriptor*)StubRoutines::arrayof_jlong_disjoint_arraycopy())->entry() : ++ ((FunctionDescriptor*)StubRoutines::jlong_disjoint_arraycopy())->entry(); ++#endif ++ ++ array_overlap_test(nooverlap_target, 3); ++ generate_conjoint_long_copy_core(aligned); ++ ++ __ blr(); ++ ++ return start; ++ } ++ ++ // Generate stub for conjoint oop copy. If "aligned" is true, the ++ // "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // dest_uninitialized: G1 support ++ // ++ address generate_conjoint_oop_copy(bool aligned, const char * name, bool dest_uninitialized) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ ++ address start = __ function_entry(); ++ ++#if defined(ABI_ELFv2) ++ address nooverlap_target = aligned ? ++ StubRoutines::arrayof_oop_disjoint_arraycopy() : ++ StubRoutines::oop_disjoint_arraycopy(); ++#else ++ address nooverlap_target = aligned ? ++ ((FunctionDescriptor*)StubRoutines::arrayof_oop_disjoint_arraycopy())->entry() : ++ ((FunctionDescriptor*)StubRoutines::oop_disjoint_arraycopy())->entry(); ++#endif ++ ++ gen_write_ref_array_pre_barrier(R3_ARG1, R4_ARG2, R5_ARG3, dest_uninitialized, R9_ARG7); ++ ++ // Save arguments. ++ __ mr(R9_ARG7, R4_ARG2); ++ __ mr(R10_ARG8, R5_ARG3); ++ ++ if (UseCompressedOops) { ++ array_overlap_test(nooverlap_target, 2); ++ generate_conjoint_int_copy_core(aligned); ++ } else { ++ array_overlap_test(nooverlap_target, 3); ++ generate_conjoint_long_copy_core(aligned); ++ } ++ ++ gen_write_ref_array_post_barrier(R9_ARG7, R10_ARG8, R11_scratch1, /*branchToEnd*/ false); ++ return start; ++ } ++ ++ // Generate stub for disjoint oop copy. If "aligned" is true, the ++ // "from" and "to" addresses are assumed to be heapword aligned. ++ // ++ // Arguments for generated stub: ++ // from: R3_ARG1 ++ // to: R4_ARG2 ++ // count: R5_ARG3 treated as signed ++ // dest_uninitialized: G1 support ++ // ++ address generate_disjoint_oop_copy(bool aligned, const char * name, bool dest_uninitialized) { ++ StubCodeMark mark(this, "StubRoutines", name); ++ address start = __ function_entry(); ++ ++ gen_write_ref_array_pre_barrier(R3_ARG1, R4_ARG2, R5_ARG3, dest_uninitialized, R9_ARG7); ++ ++ // save some arguments, disjoint_long_copy_core destroys them. ++ // needed for post barrier ++ __ mr(R9_ARG7, R4_ARG2); ++ __ mr(R10_ARG8, R5_ARG3); ++ ++ if (UseCompressedOops) { ++ generate_disjoint_int_copy_core(aligned); ++ } else { ++ generate_disjoint_long_copy_core(aligned); ++ } ++ ++ gen_write_ref_array_post_barrier(R9_ARG7, R10_ARG8, R11_scratch1, /*branchToEnd*/ false); ++ ++ return start; ++ } ++ ++ void generate_arraycopy_stubs() { ++ // Note: the disjoint stubs must be generated first, some of ++ // the conjoint stubs use them. ++ ++ // non-aligned disjoint versions ++ StubRoutines::_jbyte_disjoint_arraycopy = generate_disjoint_byte_copy(false, "jbyte_disjoint_arraycopy"); ++ StubRoutines::_jshort_disjoint_arraycopy = generate_disjoint_short_copy(false, "jshort_disjoint_arraycopy"); ++ StubRoutines::_jint_disjoint_arraycopy = generate_disjoint_int_copy(false, "jint_disjoint_arraycopy"); ++ StubRoutines::_jlong_disjoint_arraycopy = generate_disjoint_long_copy(false, "jlong_disjoint_arraycopy"); ++ StubRoutines::_oop_disjoint_arraycopy = generate_disjoint_oop_copy(false, "oop_disjoint_arraycopy", false); ++ StubRoutines::_oop_disjoint_arraycopy_uninit = generate_disjoint_oop_copy(false, "oop_disjoint_arraycopy_uninit", true); ++ ++ // aligned disjoint versions ++ StubRoutines::_arrayof_jbyte_disjoint_arraycopy = generate_disjoint_byte_copy(true, "arrayof_jbyte_disjoint_arraycopy"); ++ StubRoutines::_arrayof_jshort_disjoint_arraycopy = generate_disjoint_short_copy(true, "arrayof_jshort_disjoint_arraycopy"); ++ StubRoutines::_arrayof_jint_disjoint_arraycopy = generate_disjoint_int_copy(true, "arrayof_jint_disjoint_arraycopy"); ++ StubRoutines::_arrayof_jlong_disjoint_arraycopy = generate_disjoint_long_copy(true, "arrayof_jlong_disjoint_arraycopy"); ++ StubRoutines::_arrayof_oop_disjoint_arraycopy = generate_disjoint_oop_copy(true, "arrayof_oop_disjoint_arraycopy", false); ++ StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit = generate_disjoint_oop_copy(true, "oop_disjoint_arraycopy_uninit", true); ++ ++ // non-aligned conjoint versions ++ StubRoutines::_jbyte_arraycopy = generate_conjoint_byte_copy(false, "jbyte_arraycopy"); ++ StubRoutines::_jshort_arraycopy = generate_conjoint_short_copy(false, "jshort_arraycopy"); ++ StubRoutines::_jint_arraycopy = generate_conjoint_int_copy(false, "jint_arraycopy"); ++ StubRoutines::_jlong_arraycopy = generate_conjoint_long_copy(false, "jlong_arraycopy"); ++ StubRoutines::_oop_arraycopy = generate_conjoint_oop_copy(false, "oop_arraycopy", false); ++ StubRoutines::_oop_arraycopy_uninit = generate_conjoint_oop_copy(false, "oop_arraycopy_uninit", true); ++ ++ // aligned conjoint versions ++ StubRoutines::_arrayof_jbyte_arraycopy = generate_conjoint_byte_copy(true, "arrayof_jbyte_arraycopy"); ++ StubRoutines::_arrayof_jshort_arraycopy = generate_conjoint_short_copy(true, "arrayof_jshort_arraycopy"); ++ StubRoutines::_arrayof_jint_arraycopy = generate_conjoint_int_copy(true, "arrayof_jint_arraycopy"); ++ StubRoutines::_arrayof_jlong_arraycopy = generate_conjoint_long_copy(true, "arrayof_jlong_arraycopy"); ++ StubRoutines::_arrayof_oop_arraycopy = generate_conjoint_oop_copy(true, "arrayof_oop_arraycopy", false); ++ StubRoutines::_arrayof_oop_arraycopy_uninit = generate_conjoint_oop_copy(true, "arrayof_oop_arraycopy", true); ++ ++ // fill routines ++ StubRoutines::_jbyte_fill = generate_fill(T_BYTE, false, "jbyte_fill"); ++ StubRoutines::_jshort_fill = generate_fill(T_SHORT, false, "jshort_fill"); ++ StubRoutines::_jint_fill = generate_fill(T_INT, false, "jint_fill"); ++ StubRoutines::_arrayof_jbyte_fill = generate_fill(T_BYTE, true, "arrayof_jbyte_fill"); ++ StubRoutines::_arrayof_jshort_fill = generate_fill(T_SHORT, true, "arrayof_jshort_fill"); ++ StubRoutines::_arrayof_jint_fill = generate_fill(T_INT, true, "arrayof_jint_fill"); ++ } ++ ++ // Safefetch stubs. ++ void generate_safefetch(const char* name, int size, address* entry, address* fault_pc, address* continuation_pc) { ++ // safefetch signatures: ++ // int SafeFetch32(int* adr, int errValue); ++ // intptr_t SafeFetchN (intptr_t* adr, intptr_t errValue); ++ // ++ // arguments: ++ // R3_ARG1 = adr ++ // R4_ARG2 = errValue ++ // ++ // result: ++ // R3_RET = *adr or errValue ++ ++ StubCodeMark mark(this, "StubRoutines", name); ++ ++ // Entry point, pc or function descriptor. ++ *entry = __ function_entry(); ++ ++ // Load *adr into R4_ARG2, may fault. ++ *fault_pc = __ pc(); ++ switch (size) { ++ case 4: ++ // int32_t, signed extended ++ __ lwa(R4_ARG2, 0, R3_ARG1); ++ break; ++ case 8: ++ // int64_t ++ __ ld(R4_ARG2, 0, R3_ARG1); ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ ++ // return errValue or *adr ++ *continuation_pc = __ pc(); ++ __ mr(R3_RET, R4_ARG2); ++ __ blr(); ++ } ++ ++ // Initialization ++ void generate_initial() { ++ // Generates all stubs and initializes the entry points ++ ++ // Entry points that exist in all platforms. ++ // Note: This is code that could be shared among different platforms - however the ++ // benefit seems to be smaller than the disadvantage of having a ++ // much more complicated generator structure. See also comment in ++ // stubRoutines.hpp. ++ ++ StubRoutines::_forward_exception_entry = generate_forward_exception(); ++ StubRoutines::_call_stub_entry = generate_call_stub(StubRoutines::_call_stub_return_address); ++ StubRoutines::_catch_exception_entry = generate_catch_exception(); ++ ++ // Build this early so it's available for the interpreter. ++ StubRoutines::_throw_StackOverflowError_entry = ++ generate_throw_exception("StackOverflowError throw_exception", ++ CAST_FROM_FN_PTR(address, SharedRuntime::throw_StackOverflowError), false); ++ } ++ ++ void generate_all() { ++ // Generates all stubs and initializes the entry points ++ ++ // These entry points require SharedInfo::stack0 to be set up in ++ // non-core builds ++ StubRoutines::_throw_AbstractMethodError_entry = generate_throw_exception("AbstractMethodError throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_AbstractMethodError), false); ++ // Handle IncompatibleClassChangeError in itable stubs. ++ StubRoutines::_throw_IncompatibleClassChangeError_entry= generate_throw_exception("IncompatibleClassChangeError throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_IncompatibleClassChangeError), false); ++ StubRoutines::_throw_NullPointerException_at_call_entry= generate_throw_exception("NullPointerException at call throw_exception", CAST_FROM_FN_PTR(address, SharedRuntime::throw_NullPointerException_at_call), false); ++ ++ StubRoutines::_handler_for_unsafe_access_entry = generate_handler_for_unsafe_access(); ++ ++ // support for verify_oop (must happen after universe_init) ++ StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop(); ++ ++ // arraycopy stubs used by compilers ++ generate_arraycopy_stubs(); ++ ++ if (UseAESIntrinsics) { ++ guarantee(!UseAESIntrinsics, "not yet implemented."); ++ } ++ ++ // Safefetch stubs. ++ generate_safefetch("SafeFetch32", sizeof(int), &StubRoutines::_safefetch32_entry, ++ &StubRoutines::_safefetch32_fault_pc, ++ &StubRoutines::_safefetch32_continuation_pc); ++ generate_safefetch("SafeFetchN", sizeof(intptr_t), &StubRoutines::_safefetchN_entry, ++ &StubRoutines::_safefetchN_fault_pc, ++ &StubRoutines::_safefetchN_continuation_pc); ++ } ++ ++ public: ++ StubGenerator(CodeBuffer* code, bool all) : StubCodeGenerator(code) { ++ // replace the standard masm with a special one: ++ _masm = new MacroAssembler(code); ++ if (all) { ++ generate_all(); ++ } else { ++ generate_initial(); ++ } ++ } ++}; ++ ++void StubGenerator_generate(CodeBuffer* code, bool all) { ++ StubGenerator g(code, all); ++} +--- ./hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,29 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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. ++ * ++ */ ++ ++// Implementation of the platform-specific part of StubRoutines - for ++// a description of how to extend it, see the stubRoutines.hpp file. ++ ++ +--- ./hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/stubRoutines_ppc_64.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,40 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_STUBROUTINES_PPC_64_HPP ++#define CPU_PPC_VM_STUBROUTINES_PPC_64_HPP ++ ++// This file holds the platform specific parts of the StubRoutines ++// definition. See stubRoutines.hpp for a description on how to ++// extend it. ++ ++static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; } ++ ++enum platform_dependent_constants { ++ code_size1 = 20000, // simply increase if too small (assembler will crash if too small) ++ code_size2 = 20000 // simply increase if too small (assembler will crash if too small) ++}; ++ ++#endif // CPU_PPC_VM_STUBROUTINES_PPC_64_HPP +--- ./hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,44 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013, 2014 SAP AG. 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 CPU_PPC_VM_TEMPLATEINTERPRETERGENERATOR_PPC_HPP ++#define CPU_PPC_VM_TEMPLATEINTERPRETERGENERATOR_PPC_HPP ++ ++ protected: ++ address generate_normal_entry(bool synchronized); ++ address generate_native_entry(bool synchronized); ++ address generate_math_entry(AbstractInterpreter::MethodKind kind); ++ address generate_empty_entry(void); ++ ++ void lock_method(Register Rflags, Register Rscratch1, Register Rscratch2, bool flags_preloaded=false); ++ void unlock_method(bool check_exceptions = true); ++ ++ void generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue); ++ void generate_counter_overflow(Label& continue_entry); ++ ++ void generate_fixed_frame(bool native_call, Register Rsize_of_parameters, Register Rsize_of_locals); ++ void generate_stack_overflow_check(Register Rframe_size, Register Rscratch1); ++ ++#endif // CPU_PPC_VM_TEMPLATEINTERPRETERGENERATOR_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,1828 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013, 2014 SAP AG. 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" ++#ifndef CC_INTERP ++#include "asm/macroAssembler.inline.hpp" ++#include "interpreter/bytecodeHistogram.hpp" ++#include "interpreter/interpreter.hpp" ++#include "interpreter/interpreterGenerator.hpp" ++#include "interpreter/interpreterRuntime.hpp" ++#include "interpreter/templateTable.hpp" ++#include "oops/arrayOop.hpp" ++#include "oops/methodData.hpp" ++#include "oops/method.hpp" ++#include "oops/oop.inline.hpp" ++#include "prims/jvmtiExport.hpp" ++#include "prims/jvmtiThreadState.hpp" ++#include "runtime/arguments.hpp" ++#include "runtime/deoptimization.hpp" ++#include "runtime/frame.inline.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "runtime/synchronizer.hpp" ++#include "runtime/timer.hpp" ++#include "runtime/vframeArray.hpp" ++#include "utilities/debug.hpp" ++#include "utilities/macros.hpp" ++ ++#undef __ ++#define __ _masm-> ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) /* nothing */ ++#else ++#define BLOCK_COMMENT(str) __ block_comment(str) ++#endif ++ ++#define BIND(label) bind(label); BLOCK_COMMENT(#label ":") ++ ++//----------------------------------------------------------------------------- ++ ++// Actually we should never reach here since we do stack overflow checks before pushing any frame. ++address TemplateInterpreterGenerator::generate_StackOverflowError_handler() { ++ address entry = __ pc(); ++ __ unimplemented("generate_StackOverflowError_handler"); ++ return entry; ++} ++ ++address TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler(const char* name) { ++ address entry = __ pc(); ++ __ empty_expression_stack(); ++ __ load_const_optimized(R4_ARG2, (address) name); ++ // Index is in R17_tos. ++ __ mr(R5_ARG3, R17_tos); ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ArrayIndexOutOfBoundsException)); ++ return entry; ++} ++ ++#if 0 ++// Call special ClassCastException constructor taking object to cast ++// and target class as arguments. ++address TemplateInterpreterGenerator::generate_ClassCastException_verbose_handler() { ++ address entry = __ pc(); ++ ++ // Expression stack must be empty before entering the VM if an ++ // exception happened. ++ __ empty_expression_stack(); ++ ++ // Thread will be loaded to R3_ARG1. ++ // Target class oop is in register R5_ARG3 by convention! ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ClassCastException_verbose, R17_tos, R5_ARG3)); ++ // Above call must not return here since exception pending. ++ DEBUG_ONLY(__ should_not_reach_here();) ++ return entry; ++} ++#endif ++ ++address TemplateInterpreterGenerator::generate_ClassCastException_handler() { ++ address entry = __ pc(); ++ // Expression stack must be empty before entering the VM if an ++ // exception happened. ++ __ empty_expression_stack(); ++ ++ // Load exception object. ++ // Thread will be loaded to R3_ARG1. ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ClassCastException), R17_tos); ++#ifdef ASSERT ++ // Above call must not return here since exception pending. ++ __ should_not_reach_here(); ++#endif ++ return entry; ++} ++ ++address TemplateInterpreterGenerator::generate_exception_handler_common(const char* name, const char* message, bool pass_oop) { ++ address entry = __ pc(); ++ //__ untested("generate_exception_handler_common"); ++ Register Rexception = R17_tos; ++ ++ // Expression stack must be empty before entering the VM if an exception happened. ++ __ empty_expression_stack(); ++ ++ __ load_const_optimized(R4_ARG2, (address) name, R11_scratch1); ++ if (pass_oop) { ++ __ mr(R5_ARG3, Rexception); ++ __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_klass_exception), false); ++ } else { ++ __ load_const_optimized(R5_ARG3, (address) message, R11_scratch1); ++ __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception), false); ++ } ++ ++ // Throw exception. ++ __ mr(R3_ARG1, Rexception); ++ __ load_const_optimized(R11_scratch1, Interpreter::throw_exception_entry(), R12_scratch2); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++ ++ return entry; ++} ++ ++address TemplateInterpreterGenerator::generate_continuation_for(TosState state) { ++ address entry = __ pc(); ++ __ unimplemented("generate_continuation_for"); ++ return entry; ++} ++ ++// This entry is returned to when a call returns to the interpreter. ++// When we arrive here, we expect that the callee stack frame is already popped. ++address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) { ++ address entry = __ pc(); ++ ++ // Move the value out of the return register back to the TOS cache of current frame. ++ switch (state) { ++ case ltos: ++ case btos: ++ case ctos: ++ case stos: ++ case atos: ++ case itos: __ mr(R17_tos, R3_RET); break; // RET -> TOS cache ++ case ftos: ++ case dtos: __ fmr(F15_ftos, F1_RET); break; // TOS cache -> GR_FRET ++ case vtos: break; // Nothing to do, this was a void return. ++ default : ShouldNotReachHere(); ++ } ++ ++ __ restore_interpreter_state(R11_scratch1); // Sets R11_scratch1 = fp. ++ __ ld(R12_scratch2, _ijava_state_neg(top_frame_sp), R11_scratch1); ++ __ resize_frame_absolute(R12_scratch2, R11_scratch1, R0); ++ ++ // Compiled code destroys templateTableBase, reload. ++ __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R12_scratch2); ++ ++ const Register cache = R11_scratch1; ++ const Register size = R12_scratch2; ++ __ get_cache_and_index_at_bcp(cache, 1, index_size); ++ ++ // Big Endian (get least significant byte of 64 bit value): ++ __ lbz(size, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()) + 7, cache); ++ __ sldi(size, size, Interpreter::logStackElementSize); ++ __ add(R15_esp, R15_esp, size); ++ __ dispatch_next(state, step); ++ return entry; ++} ++ ++address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state, int step) { ++ address entry = __ pc(); ++ // If state != vtos, we're returning from a native method, which put it's result ++ // into the result register. So move the value out of the return register back ++ // to the TOS cache of current frame. ++ ++ switch (state) { ++ case ltos: ++ case btos: ++ case ctos: ++ case stos: ++ case atos: ++ case itos: __ mr(R17_tos, R3_RET); break; // GR_RET -> TOS cache ++ case ftos: ++ case dtos: __ fmr(F15_ftos, F1_RET); break; // TOS cache -> GR_FRET ++ case vtos: break; // Nothing to do, this was a void return. ++ default : ShouldNotReachHere(); ++ } ++ ++ // Load LcpoolCache @@@ should be already set! ++ __ get_constant_pool_cache(R27_constPoolCache); ++ ++ // Handle a pending exception, fall through if none. ++ __ check_and_forward_exception(R11_scratch1, R12_scratch2); ++ ++ // Start executing bytecodes. ++ __ dispatch_next(state, step); ++ ++ return entry; ++} ++ ++// A result handler converts the native result into java format. ++// Use the shared code between c++ and template interpreter. ++address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type) { ++ return AbstractInterpreterGenerator::generate_result_handler_for(type); ++} ++ ++address TemplateInterpreterGenerator::generate_safept_entry_for(TosState state, address runtime_entry) { ++ address entry = __ pc(); ++ ++ __ push(state); ++ __ call_VM(noreg, runtime_entry); ++ __ dispatch_via(vtos, Interpreter::_normal_table.table_for(vtos)); ++ ++ return entry; ++} ++ ++// Helpers for commoning out cases in the various type of method entries. ++ ++// Increment invocation count & check for overflow. ++// ++// Note: checking for negative value instead of overflow ++// so we have a 'sticky' overflow test. ++// ++void TemplateInterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) { ++ // Note: In tiered we increment either counters in method or in MDO depending if we're profiling or not. ++ Register Rscratch1 = R11_scratch1; ++ Register Rscratch2 = R12_scratch2; ++ Register R3_counters = R3_ARG1; ++ Label done; ++ ++ if (TieredCompilation) { ++ const int increment = InvocationCounter::count_increment; ++ const int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift; ++ Label no_mdo; ++ if (ProfileInterpreter) { ++ const Register Rmdo = Rscratch1; ++ // If no method data exists, go to profile_continue. ++ __ ld(Rmdo, in_bytes(Method::method_data_offset()), R19_method); ++ __ cmpdi(CCR0, Rmdo, 0); ++ __ beq(CCR0, no_mdo); ++ ++ // Increment backedge counter in the MDO. ++ const int mdo_bc_offs = in_bytes(MethodData::backedge_counter_offset()) + in_bytes(InvocationCounter::counter_offset()); ++ __ lwz(Rscratch2, mdo_bc_offs, Rmdo); ++ __ addi(Rscratch2, Rscratch2, increment); ++ __ stw(Rscratch2, mdo_bc_offs, Rmdo); ++ __ load_const_optimized(Rscratch1, mask, R0); ++ __ and_(Rscratch1, Rscratch2, Rscratch1); ++ __ bne(CCR0, done); ++ __ b(*overflow); ++ } ++ ++ // Increment counter in MethodCounters*. ++ const int mo_bc_offs = in_bytes(MethodCounters::backedge_counter_offset()) + in_bytes(InvocationCounter::counter_offset()); ++ __ bind(no_mdo); ++ __ get_method_counters(R19_method, R3_counters, done); ++ __ lwz(Rscratch2, mo_bc_offs, R3_counters); ++ __ addi(Rscratch2, Rscratch2, increment); ++ __ stw(Rscratch2, mo_bc_offs, R3_counters); ++ __ load_const_optimized(Rscratch1, mask, R0); ++ __ and_(Rscratch1, Rscratch2, Rscratch1); ++ __ beq(CCR0, *overflow); ++ ++ __ bind(done); ++ ++ } else { ++ ++ // Update standard invocation counters. ++ Register Rsum_ivc_bec = R4_ARG2; ++ __ get_method_counters(R19_method, R3_counters, done); ++ __ increment_invocation_counter(R3_counters, Rsum_ivc_bec, R12_scratch2); ++ // Increment interpreter invocation counter. ++ if (ProfileInterpreter) { // %%% Merge this into methodDataOop. ++ __ lwz(R12_scratch2, in_bytes(MethodCounters::interpreter_invocation_counter_offset()), R3_counters); ++ __ addi(R12_scratch2, R12_scratch2, 1); ++ __ stw(R12_scratch2, in_bytes(MethodCounters::interpreter_invocation_counter_offset()), R3_counters); ++ } ++ // Check if we must create a method data obj. ++ if (ProfileInterpreter && profile_method != NULL) { ++ const Register profile_limit = Rscratch1; ++ int pl_offs = __ load_const_optimized(profile_limit, &InvocationCounter::InterpreterProfileLimit, R0, true); ++ __ lwz(profile_limit, pl_offs, profile_limit); ++ // Test to see if we should create a method data oop. ++ __ cmpw(CCR0, Rsum_ivc_bec, profile_limit); ++ __ blt(CCR0, *profile_method_continue); ++ // If no method data exists, go to profile_method. ++ __ test_method_data_pointer(*profile_method); ++ } ++ // Finally check for counter overflow. ++ if (overflow) { ++ const Register invocation_limit = Rscratch1; ++ int il_offs = __ load_const_optimized(invocation_limit, &InvocationCounter::InterpreterInvocationLimit, R0, true); ++ __ lwz(invocation_limit, il_offs, invocation_limit); ++ assert(4 == sizeof(InvocationCounter::InterpreterInvocationLimit), "unexpected field size"); ++ __ cmpw(CCR0, Rsum_ivc_bec, invocation_limit); ++ __ bge(CCR0, *overflow); ++ } ++ ++ __ bind(done); ++ } ++} ++ ++// Generate code to initiate compilation on invocation counter overflow. ++void TemplateInterpreterGenerator::generate_counter_overflow(Label& continue_entry) { ++ // Generate code to initiate compilation on the counter overflow. ++ ++ // InterpreterRuntime::frequency_counter_overflow takes one arguments, ++ // which indicates if the counter overflow occurs at a backwards branch (NULL bcp) ++ // We pass zero in. ++ // The call returns the address of the verified entry point for the method or NULL ++ // if the compilation did not complete (either went background or bailed out). ++ // ++ // Unlike the C++ interpreter above: Check exceptions! ++ // Assumption: Caller must set the flag "do_not_unlock_if_sychronized" if the monitor of a sync'ed ++ // method has not yet been created. Thus, no unlocking of a non-existing monitor can occur. ++ ++ __ li(R4_ARG2, 0); ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), R4_ARG2, true); ++ ++ // Returns verified_entry_point or NULL. ++ // We ignore it in any case. ++ __ b(continue_entry); ++} ++ ++void TemplateInterpreterGenerator::generate_stack_overflow_check(Register Rmem_frame_size, Register Rscratch1) { ++ assert_different_registers(Rmem_frame_size, Rscratch1); ++ __ generate_stack_overflow_check_with_compare_and_throw(Rmem_frame_size, Rscratch1); ++} ++ ++void TemplateInterpreterGenerator::unlock_method(bool check_exceptions) { ++ __ unlock_object(R26_monitor, check_exceptions); ++} ++ ++// Lock the current method, interpreter register window must be set up! ++void TemplateInterpreterGenerator::lock_method(Register Rflags, Register Rscratch1, Register Rscratch2, bool flags_preloaded) { ++ const Register Robj_to_lock = Rscratch2; ++ ++ { ++ if (!flags_preloaded) { ++ __ lwz(Rflags, method_(access_flags)); ++ } ++ ++#ifdef ASSERT ++ // Check if methods needs synchronization. ++ { ++ Label Lok; ++ __ testbitdi(CCR0, R0, Rflags, JVM_ACC_SYNCHRONIZED_BIT); ++ __ btrue(CCR0,Lok); ++ __ stop("method doesn't need synchronization"); ++ __ bind(Lok); ++ } ++#endif // ASSERT ++ } ++ ++ // Get synchronization object to Rscratch2. ++ { ++ const int mirror_offset = in_bytes(Klass::java_mirror_offset()); ++ Label Lstatic; ++ Label Ldone; ++ ++ __ testbitdi(CCR0, R0, Rflags, JVM_ACC_STATIC_BIT); ++ __ btrue(CCR0, Lstatic); ++ ++ // Non-static case: load receiver obj from stack and we're done. ++ __ ld(Robj_to_lock, R18_locals); ++ __ b(Ldone); ++ ++ __ bind(Lstatic); // Static case: Lock the java mirror ++ __ ld(Robj_to_lock, in_bytes(Method::const_offset()), R19_method); ++ __ ld(Robj_to_lock, in_bytes(ConstMethod::constants_offset()), Robj_to_lock); ++ __ ld(Robj_to_lock, ConstantPool::pool_holder_offset_in_bytes(), Robj_to_lock); ++ __ ld(Robj_to_lock, mirror_offset, Robj_to_lock); ++ ++ __ bind(Ldone); ++ __ verify_oop(Robj_to_lock); ++ } ++ ++ // Got the oop to lock => execute! ++ __ add_monitor_to_stack(true, Rscratch1, R0); ++ ++ __ std(Robj_to_lock, BasicObjectLock::obj_offset_in_bytes(), R26_monitor); ++ __ lock_object(R26_monitor, Robj_to_lock); ++} ++ ++// Generate a fixed interpreter frame for pure interpreter ++// and I2N native transition frames. ++// ++// Before (stack grows downwards): ++// ++// | ... | ++// |------------- | ++// | java arg0 | ++// | ... | ++// | java argn | ++// | | <- R15_esp ++// | | ++// |--------------| ++// | abi_112 | ++// | | <- R1_SP ++// |==============| ++// ++// ++// After: ++// ++// | ... | ++// | java arg0 |<- R18_locals ++// | ... | ++// | java argn | ++// |--------------| ++// | | ++// | java locals | ++// | | ++// |--------------| ++// | abi_48 | ++// |==============| ++// | | ++// | istate | ++// | | ++// |--------------| ++// | monitor |<- R26_monitor ++// |--------------| ++// | |<- R15_esp ++// | expression | ++// | stack | ++// | | ++// |--------------| ++// | | ++// | abi_112 |<- R1_SP ++// |==============| ++// ++// The top most frame needs an abi space of 112 bytes. This space is needed, ++// since we call to c. The c function may spill their arguments to the caller ++// frame. When we call to java, we don't need these spill slots. In order to save ++// space on the stack, we resize the caller. However, java local reside in ++// the caller frame and the frame has to be increased. The frame_size for the ++// current frame was calculated based on max_stack as size for the expression ++// stack. At the call, just a part of the expression stack might be used. ++// We don't want to waste this space and cut the frame back accordingly. ++// The resulting amount for resizing is calculated as follows: ++// resize = (number_of_locals - number_of_arguments) * slot_size ++// + (R1_SP - R15_esp) + 48 ++// ++// The size for the callee frame is calculated: ++// framesize = 112 + max_stack + monitor + state_size ++// ++// maxstack: Max number of slots on the expression stack, loaded from the method. ++// monitor: We statically reserve room for one monitor object. ++// state_size: We save the current state of the interpreter to this area. ++// ++void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call, Register Rsize_of_parameters, Register Rsize_of_locals) { ++ Register parent_frame_resize = R6_ARG4, // Frame will grow by this number of bytes. ++ top_frame_size = R7_ARG5, ++ Rconst_method = R8_ARG6; ++ ++ assert_different_registers(Rsize_of_parameters, Rsize_of_locals, parent_frame_resize, top_frame_size); ++ ++ __ ld(Rconst_method, method_(const)); ++ __ lhz(Rsize_of_parameters /* number of params */, ++ in_bytes(ConstMethod::size_of_parameters_offset()), Rconst_method); ++ if (native_call) { ++ // If we're calling a native method, we reserve space for the worst-case signature ++ // handler varargs vector, which is max(Argument::n_register_parameters, parameter_count+2). ++ // We add two slots to the parameter_count, one for the jni ++ // environment and one for a possible native mirror. ++ Label skip_native_calculate_max_stack; ++ __ addi(top_frame_size, Rsize_of_parameters, 2); ++ __ cmpwi(CCR0, top_frame_size, Argument::n_register_parameters); ++ __ bge(CCR0, skip_native_calculate_max_stack); ++ __ li(top_frame_size, Argument::n_register_parameters); ++ __ bind(skip_native_calculate_max_stack); ++ __ sldi(Rsize_of_parameters, Rsize_of_parameters, Interpreter::logStackElementSize); ++ __ sldi(top_frame_size, top_frame_size, Interpreter::logStackElementSize); ++ __ sub(parent_frame_resize, R1_SP, R15_esp); // <0, off by Interpreter::stackElementSize! ++ assert(Rsize_of_locals == noreg, "Rsize_of_locals not initialized"); // Only relevant value is Rsize_of_parameters. ++ } else { ++ __ lhz(Rsize_of_locals /* number of params */, in_bytes(ConstMethod::size_of_locals_offset()), Rconst_method); ++ __ sldi(Rsize_of_parameters, Rsize_of_parameters, Interpreter::logStackElementSize); ++ __ sldi(Rsize_of_locals, Rsize_of_locals, Interpreter::logStackElementSize); ++ __ lhz(top_frame_size, in_bytes(ConstMethod::max_stack_offset()), Rconst_method); ++ __ sub(R11_scratch1, Rsize_of_locals, Rsize_of_parameters); // >=0 ++ __ sub(parent_frame_resize, R1_SP, R15_esp); // <0, off by Interpreter::stackElementSize! ++ __ sldi(top_frame_size, top_frame_size, Interpreter::logStackElementSize); ++ __ add(parent_frame_resize, parent_frame_resize, R11_scratch1); ++ } ++ ++ // Compute top frame size. ++ __ addi(top_frame_size, top_frame_size, frame::abi_reg_args_size + frame::ijava_state_size); ++ ++ // Cut back area between esp and max_stack. ++ __ addi(parent_frame_resize, parent_frame_resize, frame::abi_minframe_size - Interpreter::stackElementSize); ++ ++ __ round_to(top_frame_size, frame::alignment_in_bytes); ++ __ round_to(parent_frame_resize, frame::alignment_in_bytes); ++ // parent_frame_resize = (locals-parameters) - (ESP-SP-ABI48) Rounded to frame alignment size. ++ // Enlarge by locals-parameters (not in case of native_call), shrink by ESP-SP-ABI48. ++ ++ { ++ // -------------------------------------------------------------------------- ++ // Stack overflow check ++ ++ Label cont; ++ __ add(R11_scratch1, parent_frame_resize, top_frame_size); ++ generate_stack_overflow_check(R11_scratch1, R12_scratch2); ++ } ++ ++ // Set up interpreter state registers. ++ ++ __ add(R18_locals, R15_esp, Rsize_of_parameters); ++ __ ld(R27_constPoolCache, in_bytes(ConstMethod::constants_offset()), Rconst_method); ++ __ ld(R27_constPoolCache, ConstantPool::cache_offset_in_bytes(), R27_constPoolCache); ++ ++ // Set method data pointer. ++ if (ProfileInterpreter) { ++ Label zero_continue; ++ __ ld(R28_mdx, method_(method_data)); ++ __ cmpdi(CCR0, R28_mdx, 0); ++ __ beq(CCR0, zero_continue); ++ __ addi(R28_mdx, R28_mdx, in_bytes(MethodData::data_offset())); ++ __ bind(zero_continue); ++ } ++ ++ if (native_call) { ++ __ li(R14_bcp, 0); // Must initialize. ++ } else { ++ __ add(R14_bcp, in_bytes(ConstMethod::codes_offset()), Rconst_method); ++ } ++ ++ // Resize parent frame. ++ __ mflr(R12_scratch2); ++ __ neg(parent_frame_resize, parent_frame_resize); ++ __ resize_frame(parent_frame_resize, R11_scratch1); ++ __ std(R12_scratch2, _abi(lr), R1_SP); ++ ++ __ addi(R26_monitor, R1_SP, - frame::ijava_state_size); ++ __ addi(R15_esp, R26_monitor, - Interpreter::stackElementSize); ++ ++ // Store values. ++ // R15_esp, R14_bcp, R26_monitor, R28_mdx are saved at java calls ++ // in InterpreterMacroAssembler::call_from_interpreter. ++ __ std(R19_method, _ijava_state_neg(method), R1_SP); ++ __ std(R21_sender_SP, _ijava_state_neg(sender_sp), R1_SP); ++ __ std(R27_constPoolCache, _ijava_state_neg(cpoolCache), R1_SP); ++ __ std(R18_locals, _ijava_state_neg(locals), R1_SP); ++ ++ // Note: esp, bcp, monitor, mdx live in registers. Hence, the correct version can only ++ // be found in the frame after save_interpreter_state is done. This is always true ++ // for non-top frames. But when a signal occurs, dumping the top frame can go wrong, ++ // because e.g. frame::interpreter_frame_bcp() will not access the correct value ++ // (Enhanced Stack Trace). ++ // The signal handler does not save the interpreter state into the frame. ++ __ li(R0, 0); ++#ifdef ASSERT ++ // Fill remaining slots with constants. ++ __ load_const_optimized(R11_scratch1, 0x5afe); ++ __ load_const_optimized(R12_scratch2, 0xdead); ++#endif ++ // We have to initialize some frame slots for native calls (accessed by GC). ++ if (native_call) { ++ __ std(R26_monitor, _ijava_state_neg(monitors), R1_SP); ++ __ std(R14_bcp, _ijava_state_neg(bcp), R1_SP); ++ if (ProfileInterpreter) { __ std(R28_mdx, _ijava_state_neg(mdx), R1_SP); } ++ } ++#ifdef ASSERT ++ else { ++ __ std(R12_scratch2, _ijava_state_neg(monitors), R1_SP); ++ __ std(R12_scratch2, _ijava_state_neg(bcp), R1_SP); ++ __ std(R12_scratch2, _ijava_state_neg(mdx), R1_SP); ++ } ++ __ std(R11_scratch1, _ijava_state_neg(ijava_reserved), R1_SP); ++ __ std(R12_scratch2, _ijava_state_neg(esp), R1_SP); ++ __ std(R12_scratch2, _ijava_state_neg(lresult), R1_SP); ++ __ std(R12_scratch2, _ijava_state_neg(fresult), R1_SP); ++#endif ++ __ subf(R12_scratch2, top_frame_size, R1_SP); ++ __ std(R0, _ijava_state_neg(oop_tmp), R1_SP); ++ __ std(R12_scratch2, _ijava_state_neg(top_frame_sp), R1_SP); ++ ++ // Push top frame. ++ __ push_frame(top_frame_size, R11_scratch1); ++} ++ ++// End of helpers ++ ++// ============================================================================ ++// Various method entries ++// ++ ++// Empty method, generate a very fast return. We must skip this entry if ++// someone's debugging, indicated by the flag ++// "interp_mode" in the Thread obj. ++// Note: empty methods are generated mostly methods that do assertions, which are ++// disabled in the "java opt build". ++address TemplateInterpreterGenerator::generate_empty_entry(void) { ++ if (!UseFastEmptyMethods) { ++ NOT_PRODUCT(__ should_not_reach_here();) ++ return Interpreter::entry_for_kind(Interpreter::zerolocals); ++ } ++ ++ Label Lslow_path; ++ const Register Rjvmti_mode = R11_scratch1; ++ address entry = __ pc(); ++ ++ __ lwz(Rjvmti_mode, thread_(interp_only_mode)); ++ __ cmpwi(CCR0, Rjvmti_mode, 0); ++ __ bne(CCR0, Lslow_path); // jvmti_mode!=0 ++ ++ // Noone's debuggin: Simply return. ++ // Pop c2i arguments (if any) off when we return. ++#ifdef ASSERT ++ __ ld(R9_ARG7, 0, R1_SP); ++ __ ld(R10_ARG8, 0, R21_sender_SP); ++ __ cmpd(CCR0, R9_ARG7, R10_ARG8); ++ __ asm_assert_eq("backlink", 0x545); ++#endif // ASSERT ++ __ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started. ++ ++ // And we're done. ++ __ blr(); ++ ++ __ bind(Lslow_path); ++ __ branch_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals), R11_scratch1); ++ __ flush(); ++ ++ return entry; ++} ++ ++// Support abs and sqrt like in compiler. ++// For others we can use a normal (native) entry. ++ ++inline bool math_entry_available(AbstractInterpreter::MethodKind kind) { ++ // Provide math entry with debugging on demand. ++ // Note: Debugging changes which code will get executed: ++ // Debugging or disabled InlineIntrinsics: java method will get interpreted and performs a native call. ++ // Not debugging and enabled InlineIntrinics: processor instruction will get used. ++ // Result might differ slightly due to rounding etc. ++ if (!InlineIntrinsics && (!FLAG_IS_ERGO(InlineIntrinsics))) return false; // Generate a vanilla entry. ++ ++ return ((kind==Interpreter::java_lang_math_sqrt && VM_Version::has_fsqrt()) || ++ (kind==Interpreter::java_lang_math_abs)); ++} ++ ++address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) { ++ if (!math_entry_available(kind)) { ++ NOT_PRODUCT(__ should_not_reach_here();) ++ return Interpreter::entry_for_kind(Interpreter::zerolocals); ++ } ++ ++ Label Lslow_path; ++ const Register Rjvmti_mode = R11_scratch1; ++ address entry = __ pc(); ++ ++ // Provide math entry with debugging on demand. ++ __ lwz(Rjvmti_mode, thread_(interp_only_mode)); ++ __ cmpwi(CCR0, Rjvmti_mode, 0); ++ __ bne(CCR0, Lslow_path); // jvmti_mode!=0 ++ ++ __ lfd(F1_RET, Interpreter::stackElementSize, R15_esp); ++ ++ // Pop c2i arguments (if any) off when we return. ++#ifdef ASSERT ++ __ ld(R9_ARG7, 0, R1_SP); ++ __ ld(R10_ARG8, 0, R21_sender_SP); ++ __ cmpd(CCR0, R9_ARG7, R10_ARG8); ++ __ asm_assert_eq("backlink", 0x545); ++#endif // ASSERT ++ __ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started. ++ ++ if (kind == Interpreter::java_lang_math_sqrt) { ++ __ fsqrt(F1_RET, F1_RET); ++ } else if (kind == Interpreter::java_lang_math_abs) { ++ __ fabs(F1_RET, F1_RET); ++ } else { ++ ShouldNotReachHere(); ++ } ++ ++ // And we're done. ++ __ blr(); ++ ++ // Provide slow path for JVMTI case. ++ __ bind(Lslow_path); ++ __ branch_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals), R12_scratch2); ++ __ flush(); ++ ++ return entry; ++} ++ ++// Interpreter stub for calling a native method. (asm interpreter) ++// This sets up a somewhat different looking stack for calling the ++// native method than the typical interpreter frame setup. ++// ++// On entry: ++// R19_method - method ++// R16_thread - JavaThread* ++// R15_esp - intptr_t* sender tos ++// ++// abstract stack (grows up) ++// [ IJava (caller of JNI callee) ] <-- ASP ++// ... ++address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) { ++ ++ address entry = __ pc(); ++ ++ const bool inc_counter = UseCompiler || CountCompiledCalls; ++ ++ // ----------------------------------------------------------------------------- ++ // Allocate a new frame that represents the native callee (i2n frame). ++ // This is not a full-blown interpreter frame, but in particular, the ++ // following registers are valid after this: ++ // - R19_method ++ // - R18_local (points to start of argumuments to native function) ++ // ++ // abstract stack (grows up) ++ // [ IJava (caller of JNI callee) ] <-- ASP ++ // ... ++ ++ const Register signature_handler_fd = R11_scratch1; ++ const Register pending_exception = R0; ++ const Register result_handler_addr = R31; ++ const Register native_method_fd = R11_scratch1; ++ const Register access_flags = R22_tmp2; ++ const Register active_handles = R11_scratch1; // R26_monitor saved to state. ++ const Register sync_state = R12_scratch2; ++ const Register sync_state_addr = sync_state; // Address is dead after use. ++ const Register suspend_flags = R11_scratch1; ++ ++ //============================================================================= ++ // Allocate new frame and initialize interpreter state. ++ ++ Label exception_return; ++ Label exception_return_sync_check; ++ Label stack_overflow_return; ++ ++ // Generate new interpreter state and jump to stack_overflow_return in case of ++ // a stack overflow. ++ //generate_compute_interpreter_state(stack_overflow_return); ++ ++ Register size_of_parameters = R22_tmp2; ++ ++ generate_fixed_frame(true, size_of_parameters, noreg /* unused */); ++ ++ //============================================================================= ++ // Increment invocation counter. On overflow, entry to JNI method ++ // will be compiled. ++ Label invocation_counter_overflow, continue_after_compile; ++ if (inc_counter) { ++ if (synchronized) { ++ // Since at this point in the method invocation the exception handler ++ // would try to exit the monitor of synchronized methods which hasn't ++ // been entered yet, we set the thread local variable ++ // _do_not_unlock_if_synchronized to true. If any exception was thrown by ++ // runtime, exception handling i.e. unlock_if_synchronized_method will ++ // check this thread local flag. ++ // This flag has two effects, one is to force an unwind in the topmost ++ // interpreter frame and not perform an unlock while doing so. ++ __ li(R0, 1); ++ __ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread); ++ } ++ generate_counter_incr(&invocation_counter_overflow, NULL, NULL); ++ ++ __ BIND(continue_after_compile); ++ // Reset the _do_not_unlock_if_synchronized flag. ++ if (synchronized) { ++ __ li(R0, 0); ++ __ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread); ++ } ++ } ++ ++ // access_flags = method->access_flags(); ++ // Load access flags. ++ assert(access_flags->is_nonvolatile(), ++ "access_flags must be in a non-volatile register"); ++ // Type check. ++ assert(4 == sizeof(AccessFlags), "unexpected field size"); ++ __ lwz(access_flags, method_(access_flags)); ++ ++ // We don't want to reload R19_method and access_flags after calls ++ // to some helper functions. ++ assert(R19_method->is_nonvolatile(), ++ "R19_method must be a non-volatile register"); ++ ++ // Check for synchronized methods. Must happen AFTER invocation counter ++ // check, so method is not locked if counter overflows. ++ ++ if (synchronized) { ++ lock_method(access_flags, R11_scratch1, R12_scratch2, true); ++ ++ // Update monitor in state. ++ __ ld(R11_scratch1, 0, R1_SP); ++ __ std(R26_monitor, _ijava_state_neg(monitors), R11_scratch1); ++ } ++ ++ // jvmti/jvmpi support ++ __ notify_method_entry(); ++ ++ //============================================================================= ++ // Get and call the signature handler. ++ ++ __ ld(signature_handler_fd, method_(signature_handler)); ++ Label call_signature_handler; ++ ++ __ cmpdi(CCR0, signature_handler_fd, 0); ++ __ bne(CCR0, call_signature_handler); ++ ++ // Method has never been called. Either generate a specialized ++ // handler or point to the slow one. ++ // ++ // Pass parameter 'false' to avoid exception check in call_VM. ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::prepare_native_call), R19_method, false); ++ ++ // Check for an exception while looking up the target method. If we ++ // incurred one, bail. ++ __ ld(pending_exception, thread_(pending_exception)); ++ __ cmpdi(CCR0, pending_exception, 0); ++ __ bne(CCR0, exception_return_sync_check); // Has pending exception. ++ ++ // Reload signature handler, it may have been created/assigned in the meanwhile. ++ __ ld(signature_handler_fd, method_(signature_handler)); ++ __ twi_0(signature_handler_fd); // Order wrt. load of klass mirror and entry point (isync is below). ++ ++ __ BIND(call_signature_handler); ++ ++ // Before we call the signature handler we push a new frame to ++ // protect the interpreter frame volatile registers when we return ++ // from jni but before we can get back to Java. ++ ++ // First set the frame anchor while the SP/FP registers are ++ // convenient and the slow signature handler can use this same frame ++ // anchor. ++ ++ // We have a TOP_IJAVA_FRAME here, which belongs to us. ++ __ set_top_ijava_frame_at_SP_as_last_Java_frame(R1_SP, R12_scratch2/*tmp*/); ++ ++ // Now the interpreter frame (and its call chain) have been ++ // invalidated and flushed. We are now protected against eager ++ // being enabled in native code. Even if it goes eager the ++ // registers will be reloaded as clean and we will invalidate after ++ // the call so no spurious flush should be possible. ++ ++ // Call signature handler and pass locals address. ++ // ++ // Our signature handlers copy required arguments to the C stack ++ // (outgoing C args), R3_ARG1 to R10_ARG8, and FARG1 to FARG13. ++ __ mr(R3_ARG1, R18_locals); ++ __ ld(signature_handler_fd, 0, signature_handler_fd); ++ ++ __ call_stub(signature_handler_fd); ++ ++ // Remove the register parameter varargs slots we allocated in ++ // compute_interpreter_state. SP+16 ends up pointing to the ABI ++ // outgoing argument area. ++ // ++ // Not needed on PPC64. ++ //__ add(SP, SP, Argument::n_register_parameters*BytesPerWord); ++ ++ assert(result_handler_addr->is_nonvolatile(), "result_handler_addr must be in a non-volatile register"); ++ // Save across call to native method. ++ __ mr(result_handler_addr, R3_RET); ++ ++ __ isync(); // Acquire signature handler before trying to fetch the native entry point and klass mirror. ++ ++ // Set up fixed parameters and call the native method. ++ // If the method is static, get mirror into R4_ARG2. ++ { ++ Label method_is_not_static; ++ // Access_flags is non-volatile and still, no need to restore it. ++ ++ // Restore access flags. ++ __ testbitdi(CCR0, R0, access_flags, JVM_ACC_STATIC_BIT); ++ __ bfalse(CCR0, method_is_not_static); ++ ++ // constants = method->constants(); ++ __ ld(R11_scratch1, in_bytes(Method::const_offset()), R19_method); ++ __ ld(R11_scratch1, in_bytes(ConstMethod::constants_offset()), R11_scratch1); ++ // pool_holder = method->constants()->pool_holder(); ++ __ ld(R11_scratch1/*pool_holder*/, ConstantPool::pool_holder_offset_in_bytes(), ++ R11_scratch1/*constants*/); ++ ++ const int mirror_offset = in_bytes(Klass::java_mirror_offset()); ++ ++ // mirror = pool_holder->klass_part()->java_mirror(); ++ __ ld(R0/*mirror*/, mirror_offset, R11_scratch1/*pool_holder*/); ++ // state->_native_mirror = mirror; ++ ++ __ ld(R11_scratch1, 0, R1_SP); ++ __ std(R0/*mirror*/, _ijava_state_neg(oop_tmp), R11_scratch1); ++ // R4_ARG2 = &state->_oop_temp; ++ __ addi(R4_ARG2, R11_scratch1, _ijava_state_neg(oop_tmp)); ++ __ BIND(method_is_not_static); ++ } ++ ++ // At this point, arguments have been copied off the stack into ++ // their JNI positions. Oops are boxed in-place on the stack, with ++ // handles copied to arguments. The result handler address is in a ++ // register. ++ ++ // Pass JNIEnv address as first parameter. ++ __ addir(R3_ARG1, thread_(jni_environment)); ++ ++ // Load the native_method entry before we change the thread state. ++ __ ld(native_method_fd, method_(native_function)); ++ ++ //============================================================================= ++ // Transition from _thread_in_Java to _thread_in_native. As soon as ++ // we make this change the safepoint code needs to be certain that ++ // the last Java frame we established is good. The pc in that frame ++ // just needs to be near here not an actual return address. ++ ++ // We use release_store_fence to update values like the thread state, where ++ // we don't want the current thread to continue until all our prior memory ++ // accesses (including the new thread state) are visible to other threads. ++ __ li(R0, _thread_in_native); ++ __ release(); ++ ++ // TODO PPC port assert(4 == JavaThread::sz_thread_state(), "unexpected field size"); ++ __ stw(R0, thread_(thread_state)); ++ ++ if (UseMembar) { ++ __ fence(); ++ } ++ ++ //============================================================================= ++ // Call the native method. Argument registers must not have been ++ // overwritten since "__ call_stub(signature_handler);" (except for ++ // ARG1 and ARG2 for static methods). ++ __ call_c(native_method_fd); ++ ++ __ li(R0, 0); ++ __ ld(R11_scratch1, 0, R1_SP); ++ __ std(R3_RET, _ijava_state_neg(lresult), R11_scratch1); ++ __ stfd(F1_RET, _ijava_state_neg(fresult), R11_scratch1); ++ __ std(R0/*mirror*/, _ijava_state_neg(oop_tmp), R11_scratch1); // reset ++ ++ // Note: C++ interpreter needs the following here: ++ // The frame_manager_lr field, which we use for setting the last ++ // java frame, gets overwritten by the signature handler. Restore ++ // it now. ++ //__ get_PC_trash_LR(R11_scratch1); ++ //__ std(R11_scratch1, _top_ijava_frame_abi(frame_manager_lr), R1_SP); ++ ++ // Because of GC R19_method may no longer be valid. ++ ++ // Block, if necessary, before resuming in _thread_in_Java state. ++ // In order for GC to work, don't clear the last_Java_sp until after ++ // blocking. ++ ++ //============================================================================= ++ // Switch thread to "native transition" state before reading the ++ // synchronization state. This additional state is necessary ++ // because reading and testing the synchronization state is not ++ // atomic w.r.t. GC, as this scenario demonstrates: Java thread A, ++ // in _thread_in_native state, loads _not_synchronized and is ++ // preempted. VM thread changes sync state to synchronizing and ++ // suspends threads for GC. Thread A is resumed to finish this ++ // native method, but doesn't block here since it didn't see any ++ // synchronization in progress, and escapes. ++ ++ // We use release_store_fence to update values like the thread state, where ++ // we don't want the current thread to continue until all our prior memory ++ // accesses (including the new thread state) are visible to other threads. ++ __ li(R0/*thread_state*/, _thread_in_native_trans); ++ __ release(); ++ __ stw(R0/*thread_state*/, thread_(thread_state)); ++ if (UseMembar) { ++ __ fence(); ++ } ++ // Write serialization page so that the VM thread can do a pseudo remote ++ // membar. We use the current thread pointer to calculate a thread ++ // specific offset to write to within the page. This minimizes bus ++ // traffic due to cache line collision. ++ else { ++ __ serialize_memory(R16_thread, R11_scratch1, R12_scratch2); ++ } ++ ++ // Now before we return to java we must look for a current safepoint ++ // (a new safepoint can not start since we entered native_trans). ++ // We must check here because a current safepoint could be modifying ++ // the callers registers right this moment. ++ ++ // Acquire isn't strictly necessary here because of the fence, but ++ // sync_state is declared to be volatile, so we do it anyway ++ // (cmp-br-isync on one path, release (same as acquire on PPC64) on the other path). ++ int sync_state_offs = __ load_const_optimized(sync_state_addr, SafepointSynchronize::address_of_state(), /*temp*/R0, true); ++ ++ // TODO PPC port assert(4 == SafepointSynchronize::sz_state(), "unexpected field size"); ++ __ lwz(sync_state, sync_state_offs, sync_state_addr); ++ ++ // TODO PPC port assert(4 == Thread::sz_suspend_flags(), "unexpected field size"); ++ __ lwz(suspend_flags, thread_(suspend_flags)); ++ ++ Label sync_check_done; ++ Label do_safepoint; ++ // No synchronization in progress nor yet synchronized. ++ __ cmpwi(CCR0, sync_state, SafepointSynchronize::_not_synchronized); ++ // Not suspended. ++ __ cmpwi(CCR1, suspend_flags, 0); ++ ++ __ bne(CCR0, do_safepoint); ++ __ beq(CCR1, sync_check_done); ++ __ bind(do_safepoint); ++ __ isync(); ++ // Block. We do the call directly and leave the current ++ // last_Java_frame setup undisturbed. We must save any possible ++ // native result across the call. No oop is present. ++ ++ __ mr(R3_ARG1, R16_thread); ++ __ call_c(CAST_FROM_FN_PTR(FunctionDescriptor*, JavaThread::check_special_condition_for_native_trans), ++ relocInfo::none); ++ ++ __ bind(sync_check_done); ++ ++ //============================================================================= ++ // <<<<<< Back in Interpreter Frame >>>>> ++ ++ // We are in thread_in_native_trans here and back in the normal ++ // interpreter frame. We don't have to do anything special about ++ // safepoints and we can switch to Java mode anytime we are ready. ++ ++ // Note: frame::interpreter_frame_result has a dependency on how the ++ // method result is saved across the call to post_method_exit. For ++ // native methods it assumes that the non-FPU/non-void result is ++ // saved in _native_lresult and a FPU result in _native_fresult. If ++ // this changes then the interpreter_frame_result implementation ++ // will need to be updated too. ++ ++ // On PPC64, we have stored the result directly after the native call. ++ ++ //============================================================================= ++ // Back in Java ++ ++ // We use release_store_fence to update values like the thread state, where ++ // we don't want the current thread to continue until all our prior memory ++ // accesses (including the new thread state) are visible to other threads. ++ __ li(R0/*thread_state*/, _thread_in_Java); ++ __ release(); ++ __ stw(R0/*thread_state*/, thread_(thread_state)); ++ if (UseMembar) { ++ __ fence(); ++ } ++ ++ __ reset_last_Java_frame(); ++ ++ // Jvmdi/jvmpi support. Whether we've got an exception pending or ++ // not, and whether unlocking throws an exception or not, we notify ++ // on native method exit. If we do have an exception, we'll end up ++ // in the caller's context to handle it, so if we don't do the ++ // notify here, we'll drop it on the floor. ++ __ notify_method_exit(true/*native method*/, ++ ilgl /*illegal state (not used for native methods)*/, ++ InterpreterMacroAssembler::NotifyJVMTI, ++ false /*check_exceptions*/); ++ ++ //============================================================================= ++ // Handle exceptions ++ ++ if (synchronized) { ++ // Don't check for exceptions since we're still in the i2n frame. Do that ++ // manually afterwards. ++ unlock_method(false); ++ } ++ ++ // Reset active handles after returning from native. ++ // thread->active_handles()->clear(); ++ __ ld(active_handles, thread_(active_handles)); ++ // TODO PPC port assert(4 == JNIHandleBlock::top_size_in_bytes(), "unexpected field size"); ++ __ li(R0, 0); ++ __ stw(R0, JNIHandleBlock::top_offset_in_bytes(), active_handles); ++ ++ Label exception_return_sync_check_already_unlocked; ++ __ ld(R0/*pending_exception*/, thread_(pending_exception)); ++ __ cmpdi(CCR0, R0/*pending_exception*/, 0); ++ __ bne(CCR0, exception_return_sync_check_already_unlocked); ++ ++ //----------------------------------------------------------------------------- ++ // No exception pending. ++ ++ // Move native method result back into proper registers and return. ++ // Invoke result handler (may unbox/promote). ++ __ ld(R11_scratch1, 0, R1_SP); ++ __ ld(R3_RET, _ijava_state_neg(lresult), R11_scratch1); ++ __ lfd(F1_RET, _ijava_state_neg(fresult), R11_scratch1); ++ __ call_stub(result_handler_addr); ++ ++ __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ R0, R11_scratch1, R12_scratch2); ++ ++ // Must use the return pc which was loaded from the caller's frame ++ // as the VM uses return-pc-patching for deoptimization. ++ __ mtlr(R0); ++ __ blr(); ++ ++ //----------------------------------------------------------------------------- ++ // An exception is pending. We call into the runtime only if the ++ // caller was not interpreted. If it was interpreted the ++ // interpreter will do the correct thing. If it isn't interpreted ++ // (call stub/compiled code) we will change our return and continue. ++ ++ __ BIND(exception_return_sync_check); ++ ++ if (synchronized) { ++ // Don't check for exceptions since we're still in the i2n frame. Do that ++ // manually afterwards. ++ unlock_method(false); ++ } ++ __ BIND(exception_return_sync_check_already_unlocked); ++ ++ const Register return_pc = R31; ++ ++ __ ld(return_pc, 0, R1_SP); ++ __ ld(return_pc, _abi(lr), return_pc); ++ ++ // Get the address of the exception handler. ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), ++ R16_thread, ++ return_pc /* return pc */); ++ __ merge_frames(/*top_frame_sp*/ R21_sender_SP, noreg, R11_scratch1, R12_scratch2); ++ ++ // Load the PC of the the exception handler into LR. ++ __ mtlr(R3_RET); ++ ++ // Load exception into R3_ARG1 and clear pending exception in thread. ++ __ ld(R3_ARG1/*exception*/, thread_(pending_exception)); ++ __ li(R4_ARG2, 0); ++ __ std(R4_ARG2, thread_(pending_exception)); ++ ++ // Load the original return pc into R4_ARG2. ++ __ mr(R4_ARG2/*issuing_pc*/, return_pc); ++ ++ // Return to exception handler. ++ __ blr(); ++ ++ //============================================================================= ++ // Counter overflow. ++ ++ if (inc_counter) { ++ // Handle invocation counter overflow. ++ __ bind(invocation_counter_overflow); ++ ++ generate_counter_overflow(continue_after_compile); ++ } ++ ++ return entry; ++} ++ ++// Generic interpreted method entry to (asm) interpreter. ++// ++address TemplateInterpreterGenerator::generate_normal_entry(bool synchronized) { ++ bool inc_counter = UseCompiler || CountCompiledCalls; ++ address entry = __ pc(); ++ // Generate the code to allocate the interpreter stack frame. ++ Register Rsize_of_parameters = R4_ARG2, // Written by generate_fixed_frame. ++ Rsize_of_locals = R5_ARG3; // Written by generate_fixed_frame. ++ ++ generate_fixed_frame(false, Rsize_of_parameters, Rsize_of_locals); ++ ++#ifdef FAST_DISPATCH ++ __ unimplemented("Fast dispatch in generate_normal_entry"); ++#if 0 ++ __ set((intptr_t)Interpreter::dispatch_table(), IdispatchTables); ++ // Set bytecode dispatch table base. ++#endif ++#endif ++ ++ // -------------------------------------------------------------------------- ++ // Zero out non-parameter locals. ++ // Note: *Always* zero out non-parameter locals as Sparc does. It's not ++ // worth to ask the flag, just do it. ++ Register Rslot_addr = R6_ARG4, ++ Rnum = R7_ARG5; ++ Label Lno_locals, Lzero_loop; ++ ++ // Set up the zeroing loop. ++ __ subf(Rnum, Rsize_of_parameters, Rsize_of_locals); ++ __ subf(Rslot_addr, Rsize_of_parameters, R18_locals); ++ __ srdi_(Rnum, Rnum, Interpreter::logStackElementSize); ++ __ beq(CCR0, Lno_locals); ++ __ li(R0, 0); ++ __ mtctr(Rnum); ++ ++ // The zero locals loop. ++ __ bind(Lzero_loop); ++ __ std(R0, 0, Rslot_addr); ++ __ addi(Rslot_addr, Rslot_addr, -Interpreter::stackElementSize); ++ __ bdnz(Lzero_loop); ++ ++ __ bind(Lno_locals); ++ ++ // -------------------------------------------------------------------------- ++ // Counter increment and overflow check. ++ Label invocation_counter_overflow, ++ profile_method, ++ profile_method_continue; ++ if (inc_counter || ProfileInterpreter) { ++ ++ Register Rdo_not_unlock_if_synchronized_addr = R11_scratch1; ++ if (synchronized) { ++ // Since at this point in the method invocation the exception handler ++ // would try to exit the monitor of synchronized methods which hasn't ++ // been entered yet, we set the thread local variable ++ // _do_not_unlock_if_synchronized to true. If any exception was thrown by ++ // runtime, exception handling i.e. unlock_if_synchronized_method will ++ // check this thread local flag. ++ // This flag has two effects, one is to force an unwind in the topmost ++ // interpreter frame and not perform an unlock while doing so. ++ __ li(R0, 1); ++ __ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread); ++ } ++ // Increment invocation counter and check for overflow. ++ if (inc_counter) { ++ generate_counter_incr(&invocation_counter_overflow, &profile_method, &profile_method_continue); ++ } ++ ++ __ bind(profile_method_continue); ++ ++ // Reset the _do_not_unlock_if_synchronized flag. ++ if (synchronized) { ++ __ li(R0, 0); ++ __ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread); ++ } ++ } ++ ++ // -------------------------------------------------------------------------- ++ // Locking of synchronized methods. Must happen AFTER invocation_counter ++ // check and stack overflow check, so method is not locked if overflows. ++ if (synchronized) { ++ lock_method(R3_ARG1, R4_ARG2, R5_ARG3); ++ } ++#ifdef ASSERT ++ else { ++ Label Lok; ++ __ lwz(R0, in_bytes(Method::access_flags_offset()), R19_method); ++ __ andi_(R0, R0, JVM_ACC_SYNCHRONIZED); ++ __ asm_assert_eq("method needs synchronization", 0x8521); ++ __ bind(Lok); ++ } ++#endif // ASSERT ++ ++ __ verify_thread(); ++ ++ // -------------------------------------------------------------------------- ++ // JVMTI support ++ __ notify_method_entry(); ++ ++ // -------------------------------------------------------------------------- ++ // Start executing instructions. ++ __ dispatch_next(vtos); ++ ++ // -------------------------------------------------------------------------- ++ // Out of line counter overflow and MDO creation code. ++ if (ProfileInterpreter) { ++ // We have decided to profile this method in the interpreter. ++ __ bind(profile_method); ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method)); ++ __ set_method_data_pointer_for_bcp(); ++ __ b(profile_method_continue); ++ } ++ ++ if (inc_counter) { ++ // Handle invocation counter overflow. ++ __ bind(invocation_counter_overflow); ++ generate_counter_overflow(profile_method_continue); ++ } ++ return entry; ++} ++ ++// ============================================================================= ++// Entry points ++ ++address AbstractInterpreterGenerator::generate_method_entry( ++ AbstractInterpreter::MethodKind kind) { ++ // Determine code generation flags. ++ bool synchronized = false; ++ address entry_point = NULL; ++ ++ switch (kind) { ++ case Interpreter::zerolocals : break; ++ case Interpreter::zerolocals_synchronized: synchronized = true; break; ++ case Interpreter::native : entry_point = ((InterpreterGenerator*) this)->generate_native_entry(false); break; ++ case Interpreter::native_synchronized : entry_point = ((InterpreterGenerator*) this)->generate_native_entry(true); break; ++ case Interpreter::empty : entry_point = ((InterpreterGenerator*) this)->generate_empty_entry(); break; ++ case Interpreter::accessor : entry_point = ((InterpreterGenerator*) this)->generate_accessor_entry(); break; ++ case Interpreter::abstract : entry_point = ((InterpreterGenerator*) this)->generate_abstract_entry(); break; ++ ++ case Interpreter::java_lang_math_sin : // fall thru ++ case Interpreter::java_lang_math_cos : // fall thru ++ case Interpreter::java_lang_math_tan : // fall thru ++ case Interpreter::java_lang_math_abs : // fall thru ++ case Interpreter::java_lang_math_log : // fall thru ++ case Interpreter::java_lang_math_log10 : // fall thru ++ case Interpreter::java_lang_math_sqrt : // fall thru ++ case Interpreter::java_lang_math_pow : // fall thru ++ case Interpreter::java_lang_math_exp : entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind); break; ++ case Interpreter::java_lang_ref_reference_get ++ : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break; ++ default : ShouldNotReachHere(); break; ++ } ++ ++ if (entry_point) { ++ return entry_point; ++ } ++ ++ return ((InterpreterGenerator*) this)->generate_normal_entry(synchronized); ++} ++ ++// These should never be compiled since the interpreter will prefer ++// the compiled version to the intrinsic version. ++bool AbstractInterpreter::can_be_compiled(methodHandle m) { ++ return !math_entry_available(method_kind(m)); ++} ++ ++// How much stack a method activation needs in stack slots. ++// We must calc this exactly like in generate_fixed_frame. ++// Note: This returns the conservative size assuming maximum alignment. ++int AbstractInterpreter::size_top_interpreter_activation(Method* method) { ++ const int max_alignment_size = 2; ++ const int abi_scratch = frame::abi_reg_args_size; ++ return method->max_locals() + method->max_stack() + ++ frame::interpreter_frame_monitor_size() + max_alignment_size + abi_scratch; ++} ++ ++// Returns number of stackElementWords needed for the interpreter frame with the ++// given sections. ++// This overestimates the stack by one slot in case of alignments. ++int AbstractInterpreter::size_activation(int max_stack, ++ int temps, ++ int extra_args, ++ int monitors, ++ int callee_params, ++ int callee_locals, ++ bool is_top_frame) { ++ // Note: This calculation must exactly parallel the frame setup ++ // in AbstractInterpreterGenerator::generate_method_entry. ++ assert(Interpreter::stackElementWords == 1, "sanity"); ++ const int max_alignment_space = StackAlignmentInBytes / Interpreter::stackElementSize; ++ const int abi_scratch = is_top_frame ? (frame::abi_reg_args_size / Interpreter::stackElementSize) : ++ (frame::abi_minframe_size / Interpreter::stackElementSize); ++ const int size = ++ max_stack + ++ (callee_locals - callee_params) + ++ monitors * frame::interpreter_frame_monitor_size() + ++ max_alignment_space + ++ abi_scratch + ++ frame::ijava_state_size / Interpreter::stackElementSize; ++ ++ // Fixed size of an interpreter frame, align to 16-byte. ++ return (size & -2); ++} ++ ++// Fills a sceletal interpreter frame generated during deoptimizations. ++// ++// Parameters: ++// ++// interpreter_frame != NULL: ++// set up the method, locals, and monitors. ++// The frame interpreter_frame, if not NULL, is guaranteed to be the ++// right size, as determined by a previous call to this method. ++// It is also guaranteed to be walkable even though it is in a skeletal state ++// ++// is_top_frame == true: ++// We're processing the *oldest* interpreter frame! ++// ++// pop_frame_extra_args: ++// If this is != 0 we are returning to a deoptimized frame by popping ++// off the callee frame. We want to re-execute the call that called the ++// callee interpreted, but since the return to the interpreter would pop ++// the arguments off advance the esp by dummy popframe_extra_args slots. ++// Popping off those will establish the stack layout as it was before the call. ++// ++void AbstractInterpreter::layout_activation(Method* method, ++ int tempcount, ++ int popframe_extra_args, ++ int moncount, ++ int caller_actual_parameters, ++ int callee_param_count, ++ int callee_locals_count, ++ frame* caller, ++ frame* interpreter_frame, ++ bool is_top_frame, ++ bool is_bottom_frame) { ++ ++ const int abi_scratch = is_top_frame ? (frame::abi_reg_args_size / Interpreter::stackElementSize) : ++ (frame::abi_minframe_size / Interpreter::stackElementSize); ++ ++ intptr_t* locals_base = (caller->is_interpreted_frame()) ? ++ caller->interpreter_frame_esp() + caller_actual_parameters : ++ caller->sp() + method->max_locals() - 1 + (frame::abi_minframe_size / Interpreter::stackElementSize) ; ++ ++ intptr_t* monitor_base = caller->sp() - frame::ijava_state_size / Interpreter::stackElementSize ; ++ intptr_t* monitor = monitor_base - (moncount * frame::interpreter_frame_monitor_size()); ++ intptr_t* esp_base = monitor - 1; ++ intptr_t* esp = esp_base - tempcount - popframe_extra_args; ++ intptr_t* sp = (intptr_t *) (((intptr_t) (esp_base - callee_locals_count + callee_param_count - method->max_stack()- abi_scratch)) & -StackAlignmentInBytes); ++ intptr_t* sender_sp = caller->sp() + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize; ++ intptr_t* top_frame_sp = is_top_frame ? sp : sp + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize; ++ ++ interpreter_frame->interpreter_frame_set_method(method); ++ interpreter_frame->interpreter_frame_set_locals(locals_base); ++ interpreter_frame->interpreter_frame_set_cpcache(method->constants()->cache()); ++ interpreter_frame->interpreter_frame_set_esp(esp); ++ interpreter_frame->interpreter_frame_set_monitor_end((BasicObjectLock *)monitor); ++ interpreter_frame->interpreter_frame_set_top_frame_sp(top_frame_sp); ++ if (!is_bottom_frame) { ++ interpreter_frame->interpreter_frame_set_sender_sp(sender_sp); ++ } ++} ++ ++// ============================================================================= ++// Exceptions ++ ++void TemplateInterpreterGenerator::generate_throw_exception() { ++ Register Rexception = R17_tos, ++ Rcontinuation = R3_RET; ++ ++ // -------------------------------------------------------------------------- ++ // Entry point if an method returns with a pending exception (rethrow). ++ Interpreter::_rethrow_exception_entry = __ pc(); ++ { ++ __ restore_interpreter_state(R11_scratch1); // Sets R11_scratch1 = fp. ++ __ ld(R12_scratch2, _ijava_state_neg(top_frame_sp), R11_scratch1); ++ __ resize_frame_absolute(R12_scratch2, R11_scratch1, R0); ++ ++ // Compiled code destroys templateTableBase, reload. ++ __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R11_scratch1); ++ } ++ ++ // Entry point if a interpreted method throws an exception (throw). ++ Interpreter::_throw_exception_entry = __ pc(); ++ { ++ __ mr(Rexception, R3_RET); ++ ++ __ verify_thread(); ++ __ verify_oop(Rexception); ++ ++ // Expression stack must be empty before entering the VM in case of an exception. ++ __ empty_expression_stack(); ++ // Find exception handler address and preserve exception oop. ++ // Call C routine to find handler and jump to it. ++ __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::exception_handler_for_exception), Rexception); ++ __ mtctr(Rcontinuation); ++ // Push exception for exception handler bytecodes. ++ __ push_ptr(Rexception); ++ ++ // Jump to exception handler (may be remove activation entry!). ++ __ bctr(); ++ } ++ ++ // If the exception is not handled in the current frame the frame is ++ // removed and the exception is rethrown (i.e. exception ++ // continuation is _rethrow_exception). ++ // ++ // Note: At this point the bci is still the bxi for the instruction ++ // which caused the exception and the expression stack is ++ // empty. Thus, for any VM calls at this point, GC will find a legal ++ // oop map (with empty expression stack). ++ ++ // In current activation ++ // tos: exception ++ // bcp: exception bcp ++ ++ // -------------------------------------------------------------------------- ++ // JVMTI PopFrame support ++ ++ Interpreter::_remove_activation_preserving_args_entry = __ pc(); ++ { ++ // Set the popframe_processing bit in popframe_condition indicating that we are ++ // currently handling popframe, so that call_VMs that may happen later do not ++ // trigger new popframe handling cycles. ++ __ lwz(R11_scratch1, in_bytes(JavaThread::popframe_condition_offset()), R16_thread); ++ __ ori(R11_scratch1, R11_scratch1, JavaThread::popframe_processing_bit); ++ __ stw(R11_scratch1, in_bytes(JavaThread::popframe_condition_offset()), R16_thread); ++ ++ // Empty the expression stack, as in normal exception handling. ++ __ empty_expression_stack(); ++ __ unlock_if_synchronized_method(vtos, /* throw_monitor_exception */ false, /* install_monitor_exception */ false); ++ ++ // Check to see whether we are returning to a deoptimized frame. ++ // (The PopFrame call ensures that the caller of the popped frame is ++ // either interpreted or compiled and deoptimizes it if compiled.) ++ // Note that we don't compare the return PC against the ++ // deoptimization blob's unpack entry because of the presence of ++ // adapter frames in C2. ++ Label Lcaller_not_deoptimized; ++ Register return_pc = R3_ARG1; ++ __ ld(return_pc, 0, R1_SP); ++ __ ld(return_pc, _abi(lr), return_pc); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::interpreter_contains), return_pc); ++ __ cmpdi(CCR0, R3_RET, 0); ++ __ bne(CCR0, Lcaller_not_deoptimized); ++ ++ // The deoptimized case. ++ // In this case, we can't call dispatch_next() after the frame is ++ // popped, but instead must save the incoming arguments and restore ++ // them after deoptimization has occurred. ++ __ ld(R4_ARG2, in_bytes(Method::const_offset()), R19_method); ++ __ lhz(R4_ARG2 /* number of params */, in_bytes(ConstMethod::size_of_parameters_offset()), R4_ARG2); ++ __ slwi(R4_ARG2, R4_ARG2, Interpreter::logStackElementSize); ++ __ addi(R5_ARG3, R18_locals, Interpreter::stackElementSize); ++ __ subf(R5_ARG3, R4_ARG2, R5_ARG3); ++ // Save these arguments. ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::popframe_preserve_args), R16_thread, R4_ARG2, R5_ARG3); ++ ++ // Inform deoptimization that it is responsible for restoring these arguments. ++ __ load_const_optimized(R11_scratch1, JavaThread::popframe_force_deopt_reexecution_bit); ++ __ stw(R11_scratch1, in_bytes(JavaThread::popframe_condition_offset()), R16_thread); ++ ++ // Return from the current method into the deoptimization blob. Will eventually ++ // end up in the deopt interpeter entry, deoptimization prepared everything that ++ // we will reexecute the call that called us. ++ __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*reload return_pc*/ return_pc, R11_scratch1, R12_scratch2); ++ __ mtlr(return_pc); ++ __ blr(); ++ ++ // The non-deoptimized case. ++ __ bind(Lcaller_not_deoptimized); ++ ++ // Clear the popframe condition flag. ++ __ li(R0, 0); ++ __ stw(R0, in_bytes(JavaThread::popframe_condition_offset()), R16_thread); ++ ++ // Get out of the current method and re-execute the call that called us. ++ __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ noreg, R11_scratch1, R12_scratch2); ++ __ restore_interpreter_state(R11_scratch1); ++ __ ld(R12_scratch2, _ijava_state_neg(top_frame_sp), R11_scratch1); ++ __ resize_frame_absolute(R12_scratch2, R11_scratch1, R0); ++ if (ProfileInterpreter) { ++ __ set_method_data_pointer_for_bcp(); ++ } ++#if INCLUDE_JVMTI ++ Label L_done; ++ ++ __ lbz(R11_scratch1, 0, R14_bcp); ++ __ cmpwi(CCR0, R11_scratch1, Bytecodes::_invokestatic); ++ __ bne(CCR0, L_done); ++ ++ // The member name argument must be restored if _invokestatic is re-executed after a PopFrame call. ++ // Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL. ++ __ ld(R4_ARG2, 0, R18_locals); ++ __ call_VM(R11_scratch1, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), ++ R4_ARG2, R19_method, R14_bcp); ++ ++ __ cmpdi(CCR0, R11_scratch1, 0); ++ __ beq(CCR0, L_done); ++ ++ __ std(R11_scratch1, wordSize, R15_esp); ++ __ bind(L_done); ++#endif // INCLUDE_JVMTI ++ __ dispatch_next(vtos); ++ } ++ // end of JVMTI PopFrame support ++ ++ // -------------------------------------------------------------------------- ++ // Remove activation exception entry. ++ // This is jumped to if an interpreted method can't handle an exception itself ++ // (we come from the throw/rethrow exception entry above). We're going to call ++ // into the VM to find the exception handler in the caller, pop the current ++ // frame and return the handler we calculated. ++ Interpreter::_remove_activation_entry = __ pc(); ++ { ++ __ pop_ptr(Rexception); ++ __ verify_thread(); ++ __ verify_oop(Rexception); ++ __ std(Rexception, in_bytes(JavaThread::vm_result_offset()), R16_thread); ++ ++ __ unlock_if_synchronized_method(vtos, /* throw_monitor_exception */ false, true); ++ __ notify_method_exit(false, vtos, InterpreterMacroAssembler::SkipNotifyJVMTI, false); ++ ++ __ get_vm_result(Rexception); ++ ++ // We are done with this activation frame; find out where to go next. ++ // The continuation point will be an exception handler, which expects ++ // the following registers set up: ++ // ++ // RET: exception oop ++ // ARG2: Issuing PC (see generate_exception_blob()), only used if the caller is compiled. ++ ++ Register return_pc = R31; // Needs to survive the runtime call. ++ __ ld(return_pc, 0, R1_SP); ++ __ ld(return_pc, _abi(lr), return_pc); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), R16_thread, return_pc); ++ ++ // Remove the current activation. ++ __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ noreg, R11_scratch1, R12_scratch2); ++ ++ __ mr(R4_ARG2, return_pc); ++ __ mtlr(R3_RET); ++ __ mr(R3_RET, Rexception); ++ __ blr(); ++ } ++} ++ ++// JVMTI ForceEarlyReturn support. ++// Returns "in the middle" of a method with a "fake" return value. ++address TemplateInterpreterGenerator::generate_earlyret_entry_for(TosState state) { ++ ++ Register Rscratch1 = R11_scratch1, ++ Rscratch2 = R12_scratch2; ++ ++ address entry = __ pc(); ++ __ empty_expression_stack(); ++ ++ __ load_earlyret_value(state, Rscratch1); ++ ++ __ ld(Rscratch1, in_bytes(JavaThread::jvmti_thread_state_offset()), R16_thread); ++ // Clear the earlyret state. ++ __ li(R0, 0); ++ __ stw(R0, in_bytes(JvmtiThreadState::earlyret_state_offset()), Rscratch1); ++ ++ __ remove_activation(state, false, false); ++ // Copied from TemplateTable::_return. ++ // Restoration of lr done by remove_activation. ++ switch (state) { ++ case ltos: ++ case btos: ++ case ctos: ++ case stos: ++ case atos: ++ case itos: __ mr(R3_RET, R17_tos); break; ++ case ftos: ++ case dtos: __ fmr(F1_RET, F15_ftos); break; ++ case vtos: // This might be a constructor. Final fields (and volatile fields on PPC64) need ++ // to get visible before the reference to the object gets stored anywhere. ++ __ membar(Assembler::StoreStore); break; ++ default : ShouldNotReachHere(); ++ } ++ __ blr(); ++ ++ return entry; ++} // end of ForceEarlyReturn support ++ ++//----------------------------------------------------------------------------- ++// Helper for vtos entry point generation ++ ++void TemplateInterpreterGenerator::set_vtos_entry_points(Template* t, ++ address& bep, ++ address& cep, ++ address& sep, ++ address& aep, ++ address& iep, ++ address& lep, ++ address& fep, ++ address& dep, ++ address& vep) { ++ assert(t->is_valid() && t->tos_in() == vtos, "illegal template"); ++ Label L; ++ ++ aep = __ pc(); __ push_ptr(); __ b(L); ++ fep = __ pc(); __ push_f(); __ b(L); ++ dep = __ pc(); __ push_d(); __ b(L); ++ lep = __ pc(); __ push_l(); __ b(L); ++ __ align(32, 12, 24); // align L ++ bep = cep = sep = ++ iep = __ pc(); __ push_i(); ++ vep = __ pc(); ++ __ bind(L); ++ generate_and_dispatch(t); ++} ++ ++//----------------------------------------------------------------------------- ++// Generation of individual instructions ++ ++// helpers for generate_and_dispatch ++ ++InterpreterGenerator::InterpreterGenerator(StubQueue* code) ++ : TemplateInterpreterGenerator(code) { ++ generate_all(); // Down here so it can be "virtual". ++} ++ ++//----------------------------------------------------------------------------- ++ ++// Non-product code ++#ifndef PRODUCT ++address TemplateInterpreterGenerator::generate_trace_code(TosState state) { ++ //__ flush_bundle(); ++ address entry = __ pc(); ++ ++ const char *bname = NULL; ++ uint tsize = 0; ++ switch(state) { ++ case ftos: ++ bname = "trace_code_ftos {"; ++ tsize = 2; ++ break; ++ case btos: ++ bname = "trace_code_btos {"; ++ tsize = 2; ++ break; ++ case ctos: ++ bname = "trace_code_ctos {"; ++ tsize = 2; ++ break; ++ case stos: ++ bname = "trace_code_stos {"; ++ tsize = 2; ++ break; ++ case itos: ++ bname = "trace_code_itos {"; ++ tsize = 2; ++ break; ++ case ltos: ++ bname = "trace_code_ltos {"; ++ tsize = 3; ++ break; ++ case atos: ++ bname = "trace_code_atos {"; ++ tsize = 2; ++ break; ++ case vtos: ++ // Note: In case of vtos, the topmost of stack value could be a int or doubl ++ // In case of a double (2 slots) we won't see the 2nd stack value. ++ // Maybe we simply should print the topmost 3 stack slots to cope with the problem. ++ bname = "trace_code_vtos {"; ++ tsize = 2; ++ ++ break; ++ case dtos: ++ bname = "trace_code_dtos {"; ++ tsize = 3; ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++ BLOCK_COMMENT(bname); ++ ++ // Support short-cut for TraceBytecodesAt. ++ // Don't call into the VM if we don't want to trace to speed up things. ++ Label Lskip_vm_call; ++ if (TraceBytecodesAt > 0 && TraceBytecodesAt < max_intx) { ++ int offs1 = __ load_const_optimized(R11_scratch1, (address) &TraceBytecodesAt, R0, true); ++ int offs2 = __ load_const_optimized(R12_scratch2, (address) &BytecodeCounter::_counter_value, R0, true); ++ __ ld(R11_scratch1, offs1, R11_scratch1); ++ __ lwa(R12_scratch2, offs2, R12_scratch2); ++ __ cmpd(CCR0, R12_scratch2, R11_scratch1); ++ __ blt(CCR0, Lskip_vm_call); ++ } ++ ++ __ push(state); ++ // Load 2 topmost expression stack values. ++ __ ld(R6_ARG4, tsize*Interpreter::stackElementSize, R15_esp); ++ __ ld(R5_ARG3, Interpreter::stackElementSize, R15_esp); ++ __ mflr(R31); ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode), /* unused */ R4_ARG2, R5_ARG3, R6_ARG4, false); ++ __ mtlr(R31); ++ __ pop(state); ++ ++ if (TraceBytecodesAt > 0 && TraceBytecodesAt < max_intx) { ++ __ bind(Lskip_vm_call); ++ } ++ __ blr(); ++ BLOCK_COMMENT("} trace_code"); ++ return entry; ++} ++ ++void TemplateInterpreterGenerator::count_bytecode() { ++ int offs = __ load_const_optimized(R11_scratch1, (address) &BytecodeCounter::_counter_value, R12_scratch2, true); ++ __ lwz(R12_scratch2, offs, R11_scratch1); ++ __ addi(R12_scratch2, R12_scratch2, 1); ++ __ stw(R12_scratch2, offs, R11_scratch1); ++} ++ ++void TemplateInterpreterGenerator::histogram_bytecode(Template* t) { ++ int offs = __ load_const_optimized(R11_scratch1, (address) &BytecodeHistogram::_counters[t->bytecode()], R12_scratch2, true); ++ __ lwz(R12_scratch2, offs, R11_scratch1); ++ __ addi(R12_scratch2, R12_scratch2, 1); ++ __ stw(R12_scratch2, offs, R11_scratch1); ++} ++ ++void TemplateInterpreterGenerator::histogram_bytecode_pair(Template* t) { ++ const Register addr = R11_scratch1, ++ tmp = R12_scratch2; ++ // Get index, shift out old bytecode, bring in new bytecode, and store it. ++ // _index = (_index >> log2_number_of_codes) | ++ // (bytecode << log2_number_of_codes); ++ int offs1 = __ load_const_optimized(addr, (address)&BytecodePairHistogram::_index, tmp, true); ++ __ lwz(tmp, offs1, addr); ++ __ srwi(tmp, tmp, BytecodePairHistogram::log2_number_of_codes); ++ __ ori(tmp, tmp, ((int) t->bytecode()) << BytecodePairHistogram::log2_number_of_codes); ++ __ stw(tmp, offs1, addr); ++ ++ // Bump bucket contents. ++ // _counters[_index] ++; ++ int offs2 = __ load_const_optimized(addr, (address)&BytecodePairHistogram::_counters, R0, true); ++ __ sldi(tmp, tmp, LogBytesPerInt); ++ __ add(addr, tmp, addr); ++ __ lwz(tmp, offs2, addr); ++ __ addi(tmp, tmp, 1); ++ __ stw(tmp, offs2, addr); ++} ++ ++void TemplateInterpreterGenerator::trace_bytecode(Template* t) { ++ // Call a little run-time stub to avoid blow-up for each bytecode. ++ // The run-time runtime saves the right registers, depending on ++ // the tosca in-state for the given template. ++ ++ assert(Interpreter::trace_code(t->tos_in()) != NULL, ++ "entry must have been generated"); ++ ++ // Note: we destroy LR here. ++ __ bl(Interpreter::trace_code(t->tos_in())); ++} ++ ++void TemplateInterpreterGenerator::stop_interpreter_at() { ++ Label L; ++ int offs1 = __ load_const_optimized(R11_scratch1, (address) &StopInterpreterAt, R0, true); ++ int offs2 = __ load_const_optimized(R12_scratch2, (address) &BytecodeCounter::_counter_value, R0, true); ++ __ ld(R11_scratch1, offs1, R11_scratch1); ++ __ lwa(R12_scratch2, offs2, R12_scratch2); ++ __ cmpd(CCR0, R12_scratch2, R11_scratch1); ++ __ bne(CCR0, L); ++ __ illtrap(); ++ __ bind(L); ++} ++ ++#endif // !PRODUCT ++#endif // !CC_INTERP +--- ./hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013, 2014 SAP AG. 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 CPU_PPC_VM_TEMPLATEINTERPRETER_PPC_HPP ++#define CPU_PPC_VM_TEMPLATEINTERPRETER_PPC_HPP ++ ++ protected: ++ ++ // Size of interpreter code. Increase if too small. Interpreter will ++ // fail with a guarantee ("not enough space for interpreter generation"); ++ // if too small. ++ // Run with +PrintInterpreter to get the VM to print out the size. ++ // Max size with JVMTI ++ ++ const static int InterpreterCodeSize = 210*K; ++ ++#endif // CPU_PPC_VM_TEMPLATEINTERPRETER_PPC_HPP ++ ++ +--- ./hotspot/src/cpu/ppc/vm/templateTable_ppc_64.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/templateTable_ppc_64.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,4082 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013, 2014 SAP AG. 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 "asm/macroAssembler.inline.hpp" ++#include "interpreter/interpreter.hpp" ++#include "interpreter/interpreterRuntime.hpp" ++#include "interpreter/templateInterpreter.hpp" ++#include "interpreter/templateTable.hpp" ++#include "memory/universe.inline.hpp" ++#include "oops/objArrayKlass.hpp" ++#include "oops/oop.inline.hpp" ++#include "prims/methodHandles.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "runtime/synchronizer.hpp" ++#include "utilities/macros.hpp" ++ ++#ifndef CC_INTERP ++ ++#undef __ ++#define __ _masm-> ++ ++// ============================================================================ ++// Misc helpers ++ ++// Do an oop store like *(base + index) = val OR *(base + offset) = val ++// (only one of both variants is possible at the same time). ++// Index can be noreg. ++// Kills: ++// Rbase, Rtmp ++static void do_oop_store(InterpreterMacroAssembler* _masm, ++ Register Rbase, ++ RegisterOrConstant offset, ++ Register Rval, // Noreg means always null. ++ Register Rtmp1, ++ Register Rtmp2, ++ Register Rtmp3, ++ BarrierSet::Name barrier, ++ bool precise, ++ bool check_null) { ++ assert_different_registers(Rtmp1, Rtmp2, Rtmp3, Rval, Rbase); ++ ++ switch (barrier) { ++#if INCLUDE_ALL_GCS ++ case BarrierSet::G1SATBCT: ++ case BarrierSet::G1SATBCTLogging: ++ { ++ // Load and record the previous value. ++ __ g1_write_barrier_pre(Rbase, offset, ++ Rtmp3, /* holder of pre_val ? */ ++ Rtmp1, Rtmp2, false /* frame */); ++ ++ Label Lnull, Ldone; ++ if (Rval != noreg) { ++ if (check_null) { ++ __ cmpdi(CCR0, Rval, 0); ++ __ beq(CCR0, Lnull); ++ } ++ __ store_heap_oop_not_null(Rval, offset, Rbase, /*Rval must stay uncompressed.*/ Rtmp1); ++ // Mark the card. ++ if (!(offset.is_constant() && offset.as_constant() == 0) && precise) { ++ __ add(Rbase, offset, Rbase); ++ } ++ __ g1_write_barrier_post(Rbase, Rval, Rtmp1, Rtmp2, Rtmp3, /*filtered (fast path)*/ &Ldone); ++ if (check_null) { __ b(Ldone); } ++ } ++ ++ if (Rval == noreg || check_null) { // Store null oop. ++ Register Rnull = Rval; ++ __ bind(Lnull); ++ if (Rval == noreg) { ++ Rnull = Rtmp1; ++ __ li(Rnull, 0); ++ } ++ if (UseCompressedOops) { ++ __ stw(Rnull, offset, Rbase); ++ } else { ++ __ std(Rnull, offset, Rbase); ++ } ++ } ++ __ bind(Ldone); ++ } ++ break; ++#endif // INCLUDE_ALL_GCS ++ case BarrierSet::CardTableModRef: ++ case BarrierSet::CardTableExtension: ++ { ++ Label Lnull, Ldone; ++ if (Rval != noreg) { ++ if (check_null) { ++ __ cmpdi(CCR0, Rval, 0); ++ __ beq(CCR0, Lnull); ++ } ++ __ store_heap_oop_not_null(Rval, offset, Rbase, /*Rval should better stay uncompressed.*/ Rtmp1); ++ // Mark the card. ++ if (!(offset.is_constant() && offset.as_constant() == 0) && precise) { ++ __ add(Rbase, offset, Rbase); ++ } ++ __ card_write_barrier_post(Rbase, Rval, Rtmp1); ++ if (check_null) { ++ __ b(Ldone); ++ } ++ } ++ ++ if (Rval == noreg || check_null) { // Store null oop. ++ Register Rnull = Rval; ++ __ bind(Lnull); ++ if (Rval == noreg) { ++ Rnull = Rtmp1; ++ __ li(Rnull, 0); ++ } ++ if (UseCompressedOops) { ++ __ stw(Rnull, offset, Rbase); ++ } else { ++ __ std(Rnull, offset, Rbase); ++ } ++ } ++ __ bind(Ldone); ++ } ++ break; ++ case BarrierSet::ModRef: ++ case BarrierSet::Other: ++ ShouldNotReachHere(); ++ break; ++ default: ++ ShouldNotReachHere(); ++ } ++} ++ ++// ============================================================================ ++// Platform-dependent initialization ++ ++void TemplateTable::pd_initialize() { ++ // No ppc64 specific initialization. ++} ++ ++Address TemplateTable::at_bcp(int offset) { ++ // Not used on ppc. ++ ShouldNotReachHere(); ++ return Address(); ++} ++ ++// Patches the current bytecode (ptr to it located in bcp) ++// in the bytecode stream with a new one. ++void TemplateTable::patch_bytecode(Bytecodes::Code new_bc, Register Rnew_bc, Register Rtemp, bool load_bc_into_bc_reg /*=true*/, int byte_no) { ++ // With sharing on, may need to test method flag. ++ if (!RewriteBytecodes) return; ++ Label L_patch_done; ++ ++ switch (new_bc) { ++ case Bytecodes::_fast_aputfield: ++ case Bytecodes::_fast_bputfield: ++ case Bytecodes::_fast_cputfield: ++ case Bytecodes::_fast_dputfield: ++ case Bytecodes::_fast_fputfield: ++ case Bytecodes::_fast_iputfield: ++ case Bytecodes::_fast_lputfield: ++ case Bytecodes::_fast_sputfield: ++ { ++ // We skip bytecode quickening for putfield instructions when ++ // the put_code written to the constant pool cache is zero. ++ // This is required so that every execution of this instruction ++ // calls out to InterpreterRuntime::resolve_get_put to do ++ // additional, required work. ++ assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range"); ++ assert(load_bc_into_bc_reg, "we use bc_reg as temp"); ++ __ get_cache_and_index_at_bcp(Rtemp /* dst = cache */, 1); ++ // Big Endian: ((*(cache+indices))>>((1+byte_no)*8))&0xFF ++ __ lbz(Rnew_bc, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::indices_offset()) + 7 - (1 + byte_no), Rtemp); ++ __ cmpwi(CCR0, Rnew_bc, 0); ++ __ li(Rnew_bc, (unsigned int)(unsigned char)new_bc); ++ __ beq(CCR0, L_patch_done); ++ // __ isync(); // acquire not needed ++ break; ++ } ++ ++ default: ++ assert(byte_no == -1, "sanity"); ++ if (load_bc_into_bc_reg) { ++ __ li(Rnew_bc, (unsigned int)(unsigned char)new_bc); ++ } ++ } ++ ++ if (JvmtiExport::can_post_breakpoint()) { ++ Label L_fast_patch; ++ __ lbz(Rtemp, 0, R14_bcp); ++ __ cmpwi(CCR0, Rtemp, (unsigned int)(unsigned char)Bytecodes::_breakpoint); ++ __ bne(CCR0, L_fast_patch); ++ // Perform the quickening, slowly, in the bowels of the breakpoint table. ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), R19_method, R14_bcp, Rnew_bc); ++ __ b(L_patch_done); ++ __ bind(L_fast_patch); ++ } ++ ++ // Patch bytecode. ++ __ stb(Rnew_bc, 0, R14_bcp); ++ ++ __ bind(L_patch_done); ++} ++ ++// ============================================================================ ++// Individual instructions ++ ++void TemplateTable::nop() { ++ transition(vtos, vtos); ++ // Nothing to do. ++} ++ ++void TemplateTable::shouldnotreachhere() { ++ transition(vtos, vtos); ++ __ stop("shouldnotreachhere bytecode"); ++} ++ ++void TemplateTable::aconst_null() { ++ transition(vtos, atos); ++ __ li(R17_tos, 0); ++} ++ ++void TemplateTable::iconst(int value) { ++ transition(vtos, itos); ++ assert(value >= -1 && value <= 5, ""); ++ __ li(R17_tos, value); ++} ++ ++void TemplateTable::lconst(int value) { ++ transition(vtos, ltos); ++ assert(value >= -1 && value <= 5, ""); ++ __ li(R17_tos, value); ++} ++ ++void TemplateTable::fconst(int value) { ++ transition(vtos, ftos); ++ static float zero = 0.0; ++ static float one = 1.0; ++ static float two = 2.0; ++ switch (value) { ++ default: ShouldNotReachHere(); ++ case 0: { ++ int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&zero, R0, true); ++ __ lfs(F15_ftos, simm16_offset, R11_scratch1); ++ break; ++ } ++ case 1: { ++ int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&one, R0, true); ++ __ lfs(F15_ftos, simm16_offset, R11_scratch1); ++ break; ++ } ++ case 2: { ++ int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&two, R0, true); ++ __ lfs(F15_ftos, simm16_offset, R11_scratch1); ++ break; ++ } ++ } ++} ++ ++void TemplateTable::dconst(int value) { ++ transition(vtos, dtos); ++ static double zero = 0.0; ++ static double one = 1.0; ++ switch (value) { ++ case 0: { ++ int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&zero, R0, true); ++ __ lfd(F15_ftos, simm16_offset, R11_scratch1); ++ break; ++ } ++ case 1: { ++ int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&one, R0, true); ++ __ lfd(F15_ftos, simm16_offset, R11_scratch1); ++ break; ++ } ++ default: ShouldNotReachHere(); ++ } ++} ++ ++void TemplateTable::bipush() { ++ transition(vtos, itos); ++ __ lbz(R17_tos, 1, R14_bcp); ++ __ extsb(R17_tos, R17_tos); ++} ++ ++void TemplateTable::sipush() { ++ transition(vtos, itos); ++ __ get_2_byte_integer_at_bcp(1, R17_tos, InterpreterMacroAssembler::Signed); ++} ++ ++void TemplateTable::ldc(bool wide) { ++ Register Rscratch1 = R11_scratch1, ++ Rscratch2 = R12_scratch2, ++ Rcpool = R3_ARG1; ++ ++ transition(vtos, vtos); ++ Label notInt, notClass, exit; ++ ++ __ get_cpool_and_tags(Rcpool, Rscratch2); // Set Rscratch2 = &tags. ++ if (wide) { // Read index. ++ __ get_2_byte_integer_at_bcp(1, Rscratch1, InterpreterMacroAssembler::Unsigned); ++ } else { ++ __ lbz(Rscratch1, 1, R14_bcp); ++ } ++ ++ const int base_offset = ConstantPool::header_size() * wordSize; ++ const int tags_offset = Array::base_offset_in_bytes(); ++ ++ // Get type from tags. ++ __ addi(Rscratch2, Rscratch2, tags_offset); ++ __ lbzx(Rscratch2, Rscratch2, Rscratch1); ++ ++ __ cmpwi(CCR0, Rscratch2, JVM_CONSTANT_UnresolvedClass); // Unresolved class? ++ __ cmpwi(CCR1, Rscratch2, JVM_CONSTANT_UnresolvedClassInError); // Unresolved class in error state? ++ __ cror(/*CR0 eq*/2, /*CR1 eq*/4+2, /*CR0 eq*/2); ++ ++ // Resolved class - need to call vm to get java mirror of the class. ++ __ cmpwi(CCR1, Rscratch2, JVM_CONSTANT_Class); ++ __ crnor(/*CR0 eq*/2, /*CR1 eq*/4+2, /*CR0 eq*/2); // Neither resolved class nor unresolved case from above? ++ __ beq(CCR0, notClass); ++ ++ __ li(R4, wide ? 1 : 0); ++ call_VM(R17_tos, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), R4); ++ __ push(atos); ++ __ b(exit); ++ ++ __ align(32, 12); ++ __ bind(notClass); ++ __ addi(Rcpool, Rcpool, base_offset); ++ __ sldi(Rscratch1, Rscratch1, LogBytesPerWord); ++ __ cmpdi(CCR0, Rscratch2, JVM_CONSTANT_Integer); ++ __ bne(CCR0, notInt); ++ __ isync(); // Order load of constant wrt. tags. ++ __ lwax(R17_tos, Rcpool, Rscratch1); ++ __ push(itos); ++ __ b(exit); ++ ++ __ align(32, 12); ++ __ bind(notInt); ++#ifdef ASSERT ++ // String and Object are rewritten to fast_aldc ++ __ cmpdi(CCR0, Rscratch2, JVM_CONSTANT_Float); ++ __ asm_assert_eq("unexpected type", 0x8765); ++#endif ++ __ isync(); // Order load of constant wrt. tags. ++ __ lfsx(F15_ftos, Rcpool, Rscratch1); ++ __ push(ftos); ++ ++ __ align(32, 12); ++ __ bind(exit); ++} ++ ++// Fast path for caching oop constants. ++void TemplateTable::fast_aldc(bool wide) { ++ transition(vtos, atos); ++ ++ int index_size = wide ? sizeof(u2) : sizeof(u1); ++ const Register Rscratch = R11_scratch1; ++ Label resolved; ++ ++ // We are resolved if the resolved reference cache entry contains a ++ // non-null object (CallSite, etc.) ++ __ get_cache_index_at_bcp(Rscratch, 1, index_size); // Load index. ++ __ load_resolved_reference_at_index(R17_tos, Rscratch); ++ __ cmpdi(CCR0, R17_tos, 0); ++ __ bne(CCR0, resolved); ++ __ load_const_optimized(R3_ARG1, (int)bytecode()); ++ ++ address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc); ++ ++ // First time invocation - must resolve first. ++ __ call_VM(R17_tos, entry, R3_ARG1); ++ ++ __ align(32, 12); ++ __ bind(resolved); ++ __ verify_oop(R17_tos); ++} ++ ++void TemplateTable::ldc2_w() { ++ transition(vtos, vtos); ++ Label Llong, Lexit; ++ ++ Register Rindex = R11_scratch1, ++ Rcpool = R12_scratch2, ++ Rtag = R3_ARG1; ++ __ get_cpool_and_tags(Rcpool, Rtag); ++ __ get_2_byte_integer_at_bcp(1, Rindex, InterpreterMacroAssembler::Unsigned); ++ ++ const int base_offset = ConstantPool::header_size() * wordSize; ++ const int tags_offset = Array::base_offset_in_bytes(); ++ // Get type from tags. ++ __ addi(Rcpool, Rcpool, base_offset); ++ __ addi(Rtag, Rtag, tags_offset); ++ ++ __ lbzx(Rtag, Rtag, Rindex); ++ ++ __ sldi(Rindex, Rindex, LogBytesPerWord); ++ __ cmpdi(CCR0, Rtag, JVM_CONSTANT_Double); ++ __ bne(CCR0, Llong); ++ // A double can be placed at word-aligned locations in the constant pool. ++ // Check out Conversions.java for an example. ++ // Also ConstantPool::header_size() is 20, which makes it very difficult ++ // to double-align double on the constant pool. SG, 11/7/97 ++ __ isync(); // Order load of constant wrt. tags. ++ __ lfdx(F15_ftos, Rcpool, Rindex); ++ __ push(dtos); ++ __ b(Lexit); ++ ++ __ bind(Llong); ++ __ isync(); // Order load of constant wrt. tags. ++ __ ldx(R17_tos, Rcpool, Rindex); ++ __ push(ltos); ++ ++ __ bind(Lexit); ++} ++ ++// Get the locals index located in the bytecode stream at bcp + offset. ++void TemplateTable::locals_index(Register Rdst, int offset) { ++ __ lbz(Rdst, offset, R14_bcp); ++} ++ ++void TemplateTable::iload() { ++ transition(vtos, itos); ++ ++ // Get the local value into tos ++ const Register Rindex = R22_tmp2; ++ locals_index(Rindex); ++ ++ // Rewrite iload,iload pair into fast_iload2 ++ // iload,caload pair into fast_icaload ++ if (RewriteFrequentPairs) { ++ Label Lrewrite, Ldone; ++ Register Rnext_byte = R3_ARG1, ++ Rrewrite_to = R6_ARG4, ++ Rscratch = R11_scratch1; ++ ++ // get next byte ++ __ lbz(Rnext_byte, Bytecodes::length_for(Bytecodes::_iload), R14_bcp); ++ ++ // if _iload, wait to rewrite to iload2. We only want to rewrite the ++ // last two iloads in a pair. Comparing against fast_iload means that ++ // the next bytecode is neither an iload or a caload, and therefore ++ // an iload pair. ++ __ cmpwi(CCR0, Rnext_byte, (unsigned int)(unsigned char)Bytecodes::_iload); ++ __ beq(CCR0, Ldone); ++ ++ __ cmpwi(CCR1, Rnext_byte, (unsigned int)(unsigned char)Bytecodes::_fast_iload); ++ __ li(Rrewrite_to, (unsigned int)(unsigned char)Bytecodes::_fast_iload2); ++ __ beq(CCR1, Lrewrite); ++ ++ __ cmpwi(CCR0, Rnext_byte, (unsigned int)(unsigned char)Bytecodes::_caload); ++ __ li(Rrewrite_to, (unsigned int)(unsigned char)Bytecodes::_fast_icaload); ++ __ beq(CCR0, Lrewrite); ++ ++ __ li(Rrewrite_to, (unsigned int)(unsigned char)Bytecodes::_fast_iload); ++ ++ __ bind(Lrewrite); ++ patch_bytecode(Bytecodes::_iload, Rrewrite_to, Rscratch, false); ++ __ bind(Ldone); ++ } ++ ++ __ load_local_int(R17_tos, Rindex, Rindex); ++} ++ ++// Load 2 integers in a row without dispatching ++void TemplateTable::fast_iload2() { ++ transition(vtos, itos); ++ ++ __ lbz(R3_ARG1, 1, R14_bcp); ++ __ lbz(R17_tos, Bytecodes::length_for(Bytecodes::_iload) + 1, R14_bcp); ++ ++ __ load_local_int(R3_ARG1, R11_scratch1, R3_ARG1); ++ __ load_local_int(R17_tos, R12_scratch2, R17_tos); ++ __ push_i(R3_ARG1); ++} ++ ++void TemplateTable::fast_iload() { ++ transition(vtos, itos); ++ // Get the local value into tos ++ ++ const Register Rindex = R11_scratch1; ++ locals_index(Rindex); ++ __ load_local_int(R17_tos, Rindex, Rindex); ++} ++ ++// Load a local variable type long from locals area to TOS cache register. ++// Local index resides in bytecodestream. ++void TemplateTable::lload() { ++ transition(vtos, ltos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index(Rindex); ++ __ load_local_long(R17_tos, Rindex, Rindex); ++} ++ ++void TemplateTable::fload() { ++ transition(vtos, ftos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index(Rindex); ++ __ load_local_float(F15_ftos, Rindex, Rindex); ++} ++ ++void TemplateTable::dload() { ++ transition(vtos, dtos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index(Rindex); ++ __ load_local_double(F15_ftos, Rindex, Rindex); ++} ++ ++void TemplateTable::aload() { ++ transition(vtos, atos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index(Rindex); ++ __ load_local_ptr(R17_tos, Rindex, Rindex); ++} ++ ++void TemplateTable::locals_index_wide(Register Rdst) { ++ // Offset is 2, not 1, because Lbcp points to wide prefix code. ++ __ get_2_byte_integer_at_bcp(2, Rdst, InterpreterMacroAssembler::Unsigned); ++} ++ ++void TemplateTable::wide_iload() { ++ // Get the local value into tos. ++ ++ const Register Rindex = R11_scratch1; ++ locals_index_wide(Rindex); ++ __ load_local_int(R17_tos, Rindex, Rindex); ++} ++ ++void TemplateTable::wide_lload() { ++ transition(vtos, ltos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index_wide(Rindex); ++ __ load_local_long(R17_tos, Rindex, Rindex); ++} ++ ++void TemplateTable::wide_fload() { ++ transition(vtos, ftos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index_wide(Rindex); ++ __ load_local_float(F15_ftos, Rindex, Rindex); ++} ++ ++void TemplateTable::wide_dload() { ++ transition(vtos, dtos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index_wide(Rindex); ++ __ load_local_double(F15_ftos, Rindex, Rindex); ++} ++ ++void TemplateTable::wide_aload() { ++ transition(vtos, atos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index_wide(Rindex); ++ __ load_local_ptr(R17_tos, Rindex, Rindex); ++} ++ ++void TemplateTable::iaload() { ++ transition(itos, itos); ++ ++ const Register Rload_addr = R3_ARG1, ++ Rarray = R4_ARG2, ++ Rtemp = R5_ARG3; ++ __ index_check(Rarray, R17_tos /* index */, LogBytesPerInt, Rtemp, Rload_addr); ++ __ lwa(R17_tos, arrayOopDesc::base_offset_in_bytes(T_INT), Rload_addr); ++} ++ ++void TemplateTable::laload() { ++ transition(itos, ltos); ++ ++ const Register Rload_addr = R3_ARG1, ++ Rarray = R4_ARG2, ++ Rtemp = R5_ARG3; ++ __ index_check(Rarray, R17_tos /* index */, LogBytesPerLong, Rtemp, Rload_addr); ++ __ ld(R17_tos, arrayOopDesc::base_offset_in_bytes(T_LONG), Rload_addr); ++} ++ ++void TemplateTable::faload() { ++ transition(itos, ftos); ++ ++ const Register Rload_addr = R3_ARG1, ++ Rarray = R4_ARG2, ++ Rtemp = R5_ARG3; ++ __ index_check(Rarray, R17_tos /* index */, LogBytesPerInt, Rtemp, Rload_addr); ++ __ lfs(F15_ftos, arrayOopDesc::base_offset_in_bytes(T_FLOAT), Rload_addr); ++} ++ ++void TemplateTable::daload() { ++ transition(itos, dtos); ++ ++ const Register Rload_addr = R3_ARG1, ++ Rarray = R4_ARG2, ++ Rtemp = R5_ARG3; ++ __ index_check(Rarray, R17_tos /* index */, LogBytesPerLong, Rtemp, Rload_addr); ++ __ lfd(F15_ftos, arrayOopDesc::base_offset_in_bytes(T_DOUBLE), Rload_addr); ++} ++ ++void TemplateTable::aaload() { ++ transition(itos, atos); ++ ++ // tos: index ++ // result tos: array ++ const Register Rload_addr = R3_ARG1, ++ Rarray = R4_ARG2, ++ Rtemp = R5_ARG3; ++ __ index_check(Rarray, R17_tos /* index */, UseCompressedOops ? 2 : LogBytesPerWord, Rtemp, Rload_addr); ++ __ load_heap_oop(R17_tos, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Rload_addr); ++ __ verify_oop(R17_tos); ++ //__ dcbt(R17_tos); // prefetch ++} ++ ++void TemplateTable::baload() { ++ transition(itos, itos); ++ ++ const Register Rload_addr = R3_ARG1, ++ Rarray = R4_ARG2, ++ Rtemp = R5_ARG3; ++ __ index_check(Rarray, R17_tos /* index */, 0, Rtemp, Rload_addr); ++ __ lbz(R17_tos, arrayOopDesc::base_offset_in_bytes(T_BYTE), Rload_addr); ++ __ extsb(R17_tos, R17_tos); ++} ++ ++void TemplateTable::caload() { ++ transition(itos, itos); ++ ++ const Register Rload_addr = R3_ARG1, ++ Rarray = R4_ARG2, ++ Rtemp = R5_ARG3; ++ __ index_check(Rarray, R17_tos /* index */, LogBytesPerShort, Rtemp, Rload_addr); ++ __ lhz(R17_tos, arrayOopDesc::base_offset_in_bytes(T_CHAR), Rload_addr); ++} ++ ++// Iload followed by caload frequent pair. ++void TemplateTable::fast_icaload() { ++ transition(vtos, itos); ++ ++ const Register Rload_addr = R3_ARG1, ++ Rarray = R4_ARG2, ++ Rtemp = R11_scratch1; ++ ++ locals_index(R17_tos); ++ __ load_local_int(R17_tos, Rtemp, R17_tos); ++ __ index_check(Rarray, R17_tos /* index */, LogBytesPerShort, Rtemp, Rload_addr); ++ __ lhz(R17_tos, arrayOopDesc::base_offset_in_bytes(T_CHAR), Rload_addr); ++} ++ ++void TemplateTable::saload() { ++ transition(itos, itos); ++ ++ const Register Rload_addr = R11_scratch1, ++ Rarray = R12_scratch2, ++ Rtemp = R3_ARG1; ++ __ index_check(Rarray, R17_tos /* index */, LogBytesPerShort, Rtemp, Rload_addr); ++ __ lha(R17_tos, arrayOopDesc::base_offset_in_bytes(T_SHORT), Rload_addr); ++} ++ ++void TemplateTable::iload(int n) { ++ transition(vtos, itos); ++ ++ __ lwz(R17_tos, Interpreter::local_offset_in_bytes(n), R18_locals); ++} ++ ++void TemplateTable::lload(int n) { ++ transition(vtos, ltos); ++ ++ __ ld(R17_tos, Interpreter::local_offset_in_bytes(n + 1), R18_locals); ++} ++ ++void TemplateTable::fload(int n) { ++ transition(vtos, ftos); ++ ++ __ lfs(F15_ftos, Interpreter::local_offset_in_bytes(n), R18_locals); ++} ++ ++void TemplateTable::dload(int n) { ++ transition(vtos, dtos); ++ ++ __ lfd(F15_ftos, Interpreter::local_offset_in_bytes(n + 1), R18_locals); ++} ++ ++void TemplateTable::aload(int n) { ++ transition(vtos, atos); ++ ++ __ ld(R17_tos, Interpreter::local_offset_in_bytes(n), R18_locals); ++} ++ ++void TemplateTable::aload_0() { ++ transition(vtos, atos); ++ // According to bytecode histograms, the pairs: ++ // ++ // _aload_0, _fast_igetfield ++ // _aload_0, _fast_agetfield ++ // _aload_0, _fast_fgetfield ++ // ++ // occur frequently. If RewriteFrequentPairs is set, the (slow) ++ // _aload_0 bytecode checks if the next bytecode is either ++ // _fast_igetfield, _fast_agetfield or _fast_fgetfield and then ++ // rewrites the current bytecode into a pair bytecode; otherwise it ++ // rewrites the current bytecode into _0 that doesn't do ++ // the pair check anymore. ++ // ++ // Note: If the next bytecode is _getfield, the rewrite must be ++ // delayed, otherwise we may miss an opportunity for a pair. ++ // ++ // Also rewrite frequent pairs ++ // aload_0, aload_1 ++ // aload_0, iload_1 ++ // These bytecodes with a small amount of code are most profitable ++ // to rewrite. ++ ++ if (RewriteFrequentPairs) { ++ ++ Label Lrewrite, Ldont_rewrite; ++ Register Rnext_byte = R3_ARG1, ++ Rrewrite_to = R6_ARG4, ++ Rscratch = R11_scratch1; ++ ++ // Get next byte. ++ __ lbz(Rnext_byte, Bytecodes::length_for(Bytecodes::_aload_0), R14_bcp); ++ ++ // If _getfield, wait to rewrite. We only want to rewrite the last two bytecodes in a pair. ++ __ cmpwi(CCR0, Rnext_byte, (unsigned int)(unsigned char)Bytecodes::_getfield); ++ __ beq(CCR0, Ldont_rewrite); ++ ++ __ cmpwi(CCR1, Rnext_byte, (unsigned int)(unsigned char)Bytecodes::_fast_igetfield); ++ __ li(Rrewrite_to, (unsigned int)(unsigned char)Bytecodes::_fast_iaccess_0); ++ __ beq(CCR1, Lrewrite); ++ ++ __ cmpwi(CCR0, Rnext_byte, (unsigned int)(unsigned char)Bytecodes::_fast_agetfield); ++ __ li(Rrewrite_to, (unsigned int)(unsigned char)Bytecodes::_fast_aaccess_0); ++ __ beq(CCR0, Lrewrite); ++ ++ __ cmpwi(CCR1, Rnext_byte, (unsigned int)(unsigned char)Bytecodes::_fast_fgetfield); ++ __ li(Rrewrite_to, (unsigned int)(unsigned char)Bytecodes::_fast_faccess_0); ++ __ beq(CCR1, Lrewrite); ++ ++ __ li(Rrewrite_to, (unsigned int)(unsigned char)Bytecodes::_fast_aload_0); ++ ++ __ bind(Lrewrite); ++ patch_bytecode(Bytecodes::_aload_0, Rrewrite_to, Rscratch, false); ++ __ bind(Ldont_rewrite); ++ } ++ ++ // Do actual aload_0 (must do this after patch_bytecode which might call VM and GC might change oop). ++ aload(0); ++} ++ ++void TemplateTable::istore() { ++ transition(itos, vtos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index(Rindex); ++ __ store_local_int(R17_tos, Rindex); ++} ++ ++void TemplateTable::lstore() { ++ transition(ltos, vtos); ++ const Register Rindex = R11_scratch1; ++ locals_index(Rindex); ++ __ store_local_long(R17_tos, Rindex); ++} ++ ++void TemplateTable::fstore() { ++ transition(ftos, vtos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index(Rindex); ++ __ store_local_float(F15_ftos, Rindex); ++} ++ ++void TemplateTable::dstore() { ++ transition(dtos, vtos); ++ ++ const Register Rindex = R11_scratch1; ++ locals_index(Rindex); ++ __ store_local_double(F15_ftos, Rindex); ++} ++ ++void TemplateTable::astore() { ++ transition(vtos, vtos); ++ ++ const Register Rindex = R11_scratch1; ++ __ pop_ptr(); ++ __ verify_oop_or_return_address(R17_tos, Rindex); ++ locals_index(Rindex); ++ __ store_local_ptr(R17_tos, Rindex); ++} ++ ++void TemplateTable::wide_istore() { ++ transition(vtos, vtos); ++ ++ const Register Rindex = R11_scratch1; ++ __ pop_i(); ++ locals_index_wide(Rindex); ++ __ store_local_int(R17_tos, Rindex); ++} ++ ++void TemplateTable::wide_lstore() { ++ transition(vtos, vtos); ++ ++ const Register Rindex = R11_scratch1; ++ __ pop_l(); ++ locals_index_wide(Rindex); ++ __ store_local_long(R17_tos, Rindex); ++} ++ ++void TemplateTable::wide_fstore() { ++ transition(vtos, vtos); ++ ++ const Register Rindex = R11_scratch1; ++ __ pop_f(); ++ locals_index_wide(Rindex); ++ __ store_local_float(F15_ftos, Rindex); ++} ++ ++void TemplateTable::wide_dstore() { ++ transition(vtos, vtos); ++ ++ const Register Rindex = R11_scratch1; ++ __ pop_d(); ++ locals_index_wide(Rindex); ++ __ store_local_double(F15_ftos, Rindex); ++} ++ ++void TemplateTable::wide_astore() { ++ transition(vtos, vtos); ++ ++ const Register Rindex = R11_scratch1; ++ __ pop_ptr(); ++ __ verify_oop_or_return_address(R17_tos, Rindex); ++ locals_index_wide(Rindex); ++ __ store_local_ptr(R17_tos, Rindex); ++} ++ ++void TemplateTable::iastore() { ++ transition(itos, vtos); ++ ++ const Register Rindex = R3_ARG1, ++ Rstore_addr = R4_ARG2, ++ Rarray = R5_ARG3, ++ Rtemp = R6_ARG4; ++ __ pop_i(Rindex); ++ __ index_check(Rarray, Rindex, LogBytesPerInt, Rtemp, Rstore_addr); ++ __ stw(R17_tos, arrayOopDesc::base_offset_in_bytes(T_INT), Rstore_addr); ++ } ++ ++void TemplateTable::lastore() { ++ transition(ltos, vtos); ++ ++ const Register Rindex = R3_ARG1, ++ Rstore_addr = R4_ARG2, ++ Rarray = R5_ARG3, ++ Rtemp = R6_ARG4; ++ __ pop_i(Rindex); ++ __ index_check(Rarray, Rindex, LogBytesPerLong, Rtemp, Rstore_addr); ++ __ std(R17_tos, arrayOopDesc::base_offset_in_bytes(T_LONG), Rstore_addr); ++ } ++ ++void TemplateTable::fastore() { ++ transition(ftos, vtos); ++ ++ const Register Rindex = R3_ARG1, ++ Rstore_addr = R4_ARG2, ++ Rarray = R5_ARG3, ++ Rtemp = R6_ARG4; ++ __ pop_i(Rindex); ++ __ index_check(Rarray, Rindex, LogBytesPerInt, Rtemp, Rstore_addr); ++ __ stfs(F15_ftos, arrayOopDesc::base_offset_in_bytes(T_FLOAT), Rstore_addr); ++ } ++ ++void TemplateTable::dastore() { ++ transition(dtos, vtos); ++ ++ const Register Rindex = R3_ARG1, ++ Rstore_addr = R4_ARG2, ++ Rarray = R5_ARG3, ++ Rtemp = R6_ARG4; ++ __ pop_i(Rindex); ++ __ index_check(Rarray, Rindex, LogBytesPerLong, Rtemp, Rstore_addr); ++ __ stfd(F15_ftos, arrayOopDesc::base_offset_in_bytes(T_DOUBLE), Rstore_addr); ++ } ++ ++// Pop 3 values from the stack and... ++void TemplateTable::aastore() { ++ transition(vtos, vtos); ++ ++ Label Lstore_ok, Lis_null, Ldone; ++ const Register Rindex = R3_ARG1, ++ Rarray = R4_ARG2, ++ Rscratch = R11_scratch1, ++ Rscratch2 = R12_scratch2, ++ Rarray_klass = R5_ARG3, ++ Rarray_element_klass = Rarray_klass, ++ Rvalue_klass = R6_ARG4, ++ Rstore_addr = R31; // Use register which survives VM call. ++ ++ __ ld(R17_tos, Interpreter::expr_offset_in_bytes(0), R15_esp); // Get value to store. ++ __ lwz(Rindex, Interpreter::expr_offset_in_bytes(1), R15_esp); // Get index. ++ __ ld(Rarray, Interpreter::expr_offset_in_bytes(2), R15_esp); // Get array. ++ ++ __ verify_oop(R17_tos); ++ __ index_check_without_pop(Rarray, Rindex, UseCompressedOops ? 2 : LogBytesPerWord, Rscratch, Rstore_addr); ++ // Rindex is dead! ++ Register Rscratch3 = Rindex; ++ ++ // Do array store check - check for NULL value first. ++ __ cmpdi(CCR0, R17_tos, 0); ++ __ beq(CCR0, Lis_null); ++ ++ __ load_klass(Rarray_klass, Rarray); ++ __ load_klass(Rvalue_klass, R17_tos); ++ ++ // Do fast instanceof cache test. ++ __ ld(Rarray_element_klass, in_bytes(ObjArrayKlass::element_klass_offset()), Rarray_klass); ++ ++ // Generate a fast subtype check. Branch to store_ok if no failure. Throw if failure. ++ __ gen_subtype_check(Rvalue_klass /*subklass*/, Rarray_element_klass /*superklass*/, Rscratch, Rscratch2, Rscratch3, Lstore_ok); ++ ++ // Fell through: subtype check failed => throw an exception. ++ __ load_dispatch_table(R11_scratch1, (address*)Interpreter::_throw_ArrayStoreException_entry); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++ ++ __ bind(Lis_null); ++ do_oop_store(_masm, Rstore_addr, arrayOopDesc::base_offset_in_bytes(T_OBJECT), noreg /* 0 */, ++ Rscratch, Rscratch2, Rscratch3, _bs->kind(), true /* precise */, false /* check_null */); ++ __ profile_null_seen(Rscratch, Rscratch2); ++ __ b(Ldone); ++ ++ // Store is OK. ++ __ bind(Lstore_ok); ++ do_oop_store(_masm, Rstore_addr, arrayOopDesc::base_offset_in_bytes(T_OBJECT), R17_tos /* value */, ++ Rscratch, Rscratch2, Rscratch3, _bs->kind(), true /* precise */, false /* check_null */); ++ ++ __ bind(Ldone); ++ // Adjust sp (pops array, index and value). ++ __ addi(R15_esp, R15_esp, 3 * Interpreter::stackElementSize); ++} ++ ++void TemplateTable::bastore() { ++ transition(itos, vtos); ++ ++ const Register Rindex = R11_scratch1, ++ Rarray = R12_scratch2, ++ Rscratch = R3_ARG1; ++ __ pop_i(Rindex); ++ // tos: val ++ // Rarray: array ptr (popped by index_check) ++ __ index_check(Rarray, Rindex, 0, Rscratch, Rarray); ++ __ stb(R17_tos, arrayOopDesc::base_offset_in_bytes(T_BYTE), Rarray); ++} ++ ++void TemplateTable::castore() { ++ transition(itos, vtos); ++ ++ const Register Rindex = R11_scratch1, ++ Rarray = R12_scratch2, ++ Rscratch = R3_ARG1; ++ __ pop_i(Rindex); ++ // tos: val ++ // Rarray: array ptr (popped by index_check) ++ __ index_check(Rarray, Rindex, LogBytesPerShort, Rscratch, Rarray); ++ __ sth(R17_tos, arrayOopDesc::base_offset_in_bytes(T_CHAR), Rarray); ++} ++ ++void TemplateTable::sastore() { ++ castore(); ++} ++ ++void TemplateTable::istore(int n) { ++ transition(itos, vtos); ++ __ stw(R17_tos, Interpreter::local_offset_in_bytes(n), R18_locals); ++} ++ ++void TemplateTable::lstore(int n) { ++ transition(ltos, vtos); ++ __ std(R17_tos, Interpreter::local_offset_in_bytes(n + 1), R18_locals); ++} ++ ++void TemplateTable::fstore(int n) { ++ transition(ftos, vtos); ++ __ stfs(F15_ftos, Interpreter::local_offset_in_bytes(n), R18_locals); ++} ++ ++void TemplateTable::dstore(int n) { ++ transition(dtos, vtos); ++ __ stfd(F15_ftos, Interpreter::local_offset_in_bytes(n + 1), R18_locals); ++} ++ ++void TemplateTable::astore(int n) { ++ transition(vtos, vtos); ++ ++ __ pop_ptr(); ++ __ verify_oop_or_return_address(R17_tos, R11_scratch1); ++ __ std(R17_tos, Interpreter::local_offset_in_bytes(n), R18_locals); ++} ++ ++void TemplateTable::pop() { ++ transition(vtos, vtos); ++ ++ __ addi(R15_esp, R15_esp, Interpreter::stackElementSize); ++} ++ ++void TemplateTable::pop2() { ++ transition(vtos, vtos); ++ ++ __ addi(R15_esp, R15_esp, Interpreter::stackElementSize * 2); ++} ++ ++void TemplateTable::dup() { ++ transition(vtos, vtos); ++ ++ __ ld(R11_scratch1, Interpreter::stackElementSize, R15_esp); ++ __ push_ptr(R11_scratch1); ++} ++ ++void TemplateTable::dup_x1() { ++ transition(vtos, vtos); ++ ++ Register Ra = R11_scratch1, ++ Rb = R12_scratch2; ++ // stack: ..., a, b ++ __ ld(Rb, Interpreter::stackElementSize, R15_esp); ++ __ ld(Ra, Interpreter::stackElementSize * 2, R15_esp); ++ __ std(Rb, Interpreter::stackElementSize * 2, R15_esp); ++ __ std(Ra, Interpreter::stackElementSize, R15_esp); ++ __ push_ptr(Rb); ++ // stack: ..., b, a, b ++} ++ ++void TemplateTable::dup_x2() { ++ transition(vtos, vtos); ++ ++ Register Ra = R11_scratch1, ++ Rb = R12_scratch2, ++ Rc = R3_ARG1; ++ ++ // stack: ..., a, b, c ++ __ ld(Rc, Interpreter::stackElementSize, R15_esp); // load c ++ __ ld(Ra, Interpreter::stackElementSize * 3, R15_esp); // load a ++ __ std(Rc, Interpreter::stackElementSize * 3, R15_esp); // store c in a ++ __ ld(Rb, Interpreter::stackElementSize * 2, R15_esp); // load b ++ // stack: ..., c, b, c ++ __ std(Ra, Interpreter::stackElementSize * 2, R15_esp); // store a in b ++ // stack: ..., c, a, c ++ __ std(Rb, Interpreter::stackElementSize, R15_esp); // store b in c ++ __ push_ptr(Rc); // push c ++ // stack: ..., c, a, b, c ++} ++ ++void TemplateTable::dup2() { ++ transition(vtos, vtos); ++ ++ Register Ra = R11_scratch1, ++ Rb = R12_scratch2; ++ // stack: ..., a, b ++ __ ld(Rb, Interpreter::stackElementSize, R15_esp); ++ __ ld(Ra, Interpreter::stackElementSize * 2, R15_esp); ++ __ push_2ptrs(Ra, Rb); ++ // stack: ..., a, b, a, b ++} ++ ++void TemplateTable::dup2_x1() { ++ transition(vtos, vtos); ++ ++ Register Ra = R11_scratch1, ++ Rb = R12_scratch2, ++ Rc = R3_ARG1; ++ // stack: ..., a, b, c ++ __ ld(Rc, Interpreter::stackElementSize, R15_esp); ++ __ ld(Rb, Interpreter::stackElementSize * 2, R15_esp); ++ __ std(Rc, Interpreter::stackElementSize * 2, R15_esp); ++ __ ld(Ra, Interpreter::stackElementSize * 3, R15_esp); ++ __ std(Ra, Interpreter::stackElementSize, R15_esp); ++ __ std(Rb, Interpreter::stackElementSize * 3, R15_esp); ++ // stack: ..., b, c, a ++ __ push_2ptrs(Rb, Rc); ++ // stack: ..., b, c, a, b, c ++} ++ ++void TemplateTable::dup2_x2() { ++ transition(vtos, vtos); ++ ++ Register Ra = R11_scratch1, ++ Rb = R12_scratch2, ++ Rc = R3_ARG1, ++ Rd = R4_ARG2; ++ // stack: ..., a, b, c, d ++ __ ld(Rb, Interpreter::stackElementSize * 3, R15_esp); ++ __ ld(Rd, Interpreter::stackElementSize, R15_esp); ++ __ std(Rb, Interpreter::stackElementSize, R15_esp); // store b in d ++ __ std(Rd, Interpreter::stackElementSize * 3, R15_esp); // store d in b ++ __ ld(Ra, Interpreter::stackElementSize * 4, R15_esp); ++ __ ld(Rc, Interpreter::stackElementSize * 2, R15_esp); ++ __ std(Ra, Interpreter::stackElementSize * 2, R15_esp); // store a in c ++ __ std(Rc, Interpreter::stackElementSize * 4, R15_esp); // store c in a ++ // stack: ..., c, d, a, b ++ __ push_2ptrs(Rc, Rd); ++ // stack: ..., c, d, a, b, c, d ++} ++ ++void TemplateTable::swap() { ++ transition(vtos, vtos); ++ // stack: ..., a, b ++ ++ Register Ra = R11_scratch1, ++ Rb = R12_scratch2; ++ // stack: ..., a, b ++ __ ld(Rb, Interpreter::stackElementSize, R15_esp); ++ __ ld(Ra, Interpreter::stackElementSize * 2, R15_esp); ++ __ std(Rb, Interpreter::stackElementSize * 2, R15_esp); ++ __ std(Ra, Interpreter::stackElementSize, R15_esp); ++ // stack: ..., b, a ++} ++ ++void TemplateTable::iop2(Operation op) { ++ transition(itos, itos); ++ ++ Register Rscratch = R11_scratch1; ++ ++ __ pop_i(Rscratch); ++ // tos = number of bits to shift ++ // Rscratch = value to shift ++ switch (op) { ++ case add: __ add(R17_tos, Rscratch, R17_tos); break; ++ case sub: __ sub(R17_tos, Rscratch, R17_tos); break; ++ case mul: __ mullw(R17_tos, Rscratch, R17_tos); break; ++ case _and: __ andr(R17_tos, Rscratch, R17_tos); break; ++ case _or: __ orr(R17_tos, Rscratch, R17_tos); break; ++ case _xor: __ xorr(R17_tos, Rscratch, R17_tos); break; ++ case shl: __ rldicl(R17_tos, R17_tos, 0, 64-5); __ slw(R17_tos, Rscratch, R17_tos); break; ++ case shr: __ rldicl(R17_tos, R17_tos, 0, 64-5); __ sraw(R17_tos, Rscratch, R17_tos); break; ++ case ushr: __ rldicl(R17_tos, R17_tos, 0, 64-5); __ srw(R17_tos, Rscratch, R17_tos); break; ++ default: ShouldNotReachHere(); ++ } ++} ++ ++void TemplateTable::lop2(Operation op) { ++ transition(ltos, ltos); ++ ++ Register Rscratch = R11_scratch1; ++ __ pop_l(Rscratch); ++ switch (op) { ++ case add: __ add(R17_tos, Rscratch, R17_tos); break; ++ case sub: __ sub(R17_tos, Rscratch, R17_tos); break; ++ case _and: __ andr(R17_tos, Rscratch, R17_tos); break; ++ case _or: __ orr(R17_tos, Rscratch, R17_tos); break; ++ case _xor: __ xorr(R17_tos, Rscratch, R17_tos); break; ++ default: ShouldNotReachHere(); ++ } ++} ++ ++void TemplateTable::idiv() { ++ transition(itos, itos); ++ ++ Label Lnormal, Lexception, Ldone; ++ Register Rdividend = R11_scratch1; // Used by irem. ++ ++ __ addi(R0, R17_tos, 1); ++ __ cmplwi(CCR0, R0, 2); ++ __ bgt(CCR0, Lnormal); // divisor <-1 or >1 ++ ++ __ cmpwi(CCR1, R17_tos, 0); ++ __ beq(CCR1, Lexception); // divisor == 0 ++ ++ __ pop_i(Rdividend); ++ __ mullw(R17_tos, Rdividend, R17_tos); // div by +/-1 ++ __ b(Ldone); ++ ++ __ bind(Lexception); ++ __ load_dispatch_table(R11_scratch1, (address*)Interpreter::_throw_ArithmeticException_entry); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++ ++ __ align(32, 12); ++ __ bind(Lnormal); ++ __ pop_i(Rdividend); ++ __ divw(R17_tos, Rdividend, R17_tos); // Can't divide minint/-1. ++ __ bind(Ldone); ++} ++ ++void TemplateTable::irem() { ++ transition(itos, itos); ++ ++ __ mr(R12_scratch2, R17_tos); ++ idiv(); ++ __ mullw(R17_tos, R17_tos, R12_scratch2); ++ __ subf(R17_tos, R17_tos, R11_scratch1); // Dividend set by idiv. ++} ++ ++void TemplateTable::lmul() { ++ transition(ltos, ltos); ++ ++ __ pop_l(R11_scratch1); ++ __ mulld(R17_tos, R11_scratch1, R17_tos); ++} ++ ++void TemplateTable::ldiv() { ++ transition(ltos, ltos); ++ ++ Label Lnormal, Lexception, Ldone; ++ Register Rdividend = R11_scratch1; // Used by lrem. ++ ++ __ addi(R0, R17_tos, 1); ++ __ cmpldi(CCR0, R0, 2); ++ __ bgt(CCR0, Lnormal); // divisor <-1 or >1 ++ ++ __ cmpdi(CCR1, R17_tos, 0); ++ __ beq(CCR1, Lexception); // divisor == 0 ++ ++ __ pop_l(Rdividend); ++ __ mulld(R17_tos, Rdividend, R17_tos); // div by +/-1 ++ __ b(Ldone); ++ ++ __ bind(Lexception); ++ __ load_dispatch_table(R11_scratch1, (address*)Interpreter::_throw_ArithmeticException_entry); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++ ++ __ align(32, 12); ++ __ bind(Lnormal); ++ __ pop_l(Rdividend); ++ __ divd(R17_tos, Rdividend, R17_tos); // Can't divide minint/-1. ++ __ bind(Ldone); ++} ++ ++void TemplateTable::lrem() { ++ transition(ltos, ltos); ++ ++ __ mr(R12_scratch2, R17_tos); ++ ldiv(); ++ __ mulld(R17_tos, R17_tos, R12_scratch2); ++ __ subf(R17_tos, R17_tos, R11_scratch1); // Dividend set by ldiv. ++} ++ ++void TemplateTable::lshl() { ++ transition(itos, ltos); ++ ++ __ rldicl(R17_tos, R17_tos, 0, 64-6); // Extract least significant bits. ++ __ pop_l(R11_scratch1); ++ __ sld(R17_tos, R11_scratch1, R17_tos); ++} ++ ++void TemplateTable::lshr() { ++ transition(itos, ltos); ++ ++ __ rldicl(R17_tos, R17_tos, 0, 64-6); // Extract least significant bits. ++ __ pop_l(R11_scratch1); ++ __ srad(R17_tos, R11_scratch1, R17_tos); ++} ++ ++void TemplateTable::lushr() { ++ transition(itos, ltos); ++ ++ __ rldicl(R17_tos, R17_tos, 0, 64-6); // Extract least significant bits. ++ __ pop_l(R11_scratch1); ++ __ srd(R17_tos, R11_scratch1, R17_tos); ++} ++ ++void TemplateTable::fop2(Operation op) { ++ transition(ftos, ftos); ++ ++ switch (op) { ++ case add: __ pop_f(F0_SCRATCH); __ fadds(F15_ftos, F0_SCRATCH, F15_ftos); break; ++ case sub: __ pop_f(F0_SCRATCH); __ fsubs(F15_ftos, F0_SCRATCH, F15_ftos); break; ++ case mul: __ pop_f(F0_SCRATCH); __ fmuls(F15_ftos, F0_SCRATCH, F15_ftos); break; ++ case div: __ pop_f(F0_SCRATCH); __ fdivs(F15_ftos, F0_SCRATCH, F15_ftos); break; ++ case rem: ++ __ pop_f(F1_ARG1); ++ __ fmr(F2_ARG2, F15_ftos); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem)); ++ __ fmr(F15_ftos, F1_RET); ++ break; ++ ++ default: ShouldNotReachHere(); ++ } ++} ++ ++void TemplateTable::dop2(Operation op) { ++ transition(dtos, dtos); ++ ++ switch (op) { ++ case add: __ pop_d(F0_SCRATCH); __ fadd(F15_ftos, F0_SCRATCH, F15_ftos); break; ++ case sub: __ pop_d(F0_SCRATCH); __ fsub(F15_ftos, F0_SCRATCH, F15_ftos); break; ++ case mul: __ pop_d(F0_SCRATCH); __ fmul(F15_ftos, F0_SCRATCH, F15_ftos); break; ++ case div: __ pop_d(F0_SCRATCH); __ fdiv(F15_ftos, F0_SCRATCH, F15_ftos); break; ++ case rem: ++ __ pop_d(F1_ARG1); ++ __ fmr(F2_ARG2, F15_ftos); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem)); ++ __ fmr(F15_ftos, F1_RET); ++ break; ++ ++ default: ShouldNotReachHere(); ++ } ++} ++ ++// Negate the value in the TOS cache. ++void TemplateTable::ineg() { ++ transition(itos, itos); ++ ++ __ neg(R17_tos, R17_tos); ++} ++ ++// Negate the value in the TOS cache. ++void TemplateTable::lneg() { ++ transition(ltos, ltos); ++ ++ __ neg(R17_tos, R17_tos); ++} ++ ++void TemplateTable::fneg() { ++ transition(ftos, ftos); ++ ++ __ fneg(F15_ftos, F15_ftos); ++} ++ ++void TemplateTable::dneg() { ++ transition(dtos, dtos); ++ ++ __ fneg(F15_ftos, F15_ftos); ++} ++ ++// Increments a local variable in place. ++void TemplateTable::iinc() { ++ transition(vtos, vtos); ++ ++ const Register Rindex = R11_scratch1, ++ Rincrement = R0, ++ Rvalue = R12_scratch2; ++ ++ locals_index(Rindex); // Load locals index from bytecode stream. ++ __ lbz(Rincrement, 2, R14_bcp); // Load increment from the bytecode stream. ++ __ extsb(Rincrement, Rincrement); ++ ++ __ load_local_int(Rvalue, Rindex, Rindex); // Puts address of local into Rindex. ++ ++ __ add(Rvalue, Rincrement, Rvalue); ++ __ stw(Rvalue, 0, Rindex); ++} ++ ++void TemplateTable::wide_iinc() { ++ transition(vtos, vtos); ++ ++ Register Rindex = R11_scratch1, ++ Rlocals_addr = Rindex, ++ Rincr = R12_scratch2; ++ locals_index_wide(Rindex); ++ __ get_2_byte_integer_at_bcp(4, Rincr, InterpreterMacroAssembler::Signed); ++ __ load_local_int(R17_tos, Rlocals_addr, Rindex); ++ __ add(R17_tos, Rincr, R17_tos); ++ __ stw(R17_tos, 0, Rlocals_addr); ++} ++ ++void TemplateTable::convert() { ++ // %%%%% Factor this first part accross platforms ++#ifdef ASSERT ++ TosState tos_in = ilgl; ++ TosState tos_out = ilgl; ++ switch (bytecode()) { ++ case Bytecodes::_i2l: // fall through ++ case Bytecodes::_i2f: // fall through ++ case Bytecodes::_i2d: // fall through ++ case Bytecodes::_i2b: // fall through ++ case Bytecodes::_i2c: // fall through ++ case Bytecodes::_i2s: tos_in = itos; break; ++ case Bytecodes::_l2i: // fall through ++ case Bytecodes::_l2f: // fall through ++ case Bytecodes::_l2d: tos_in = ltos; break; ++ case Bytecodes::_f2i: // fall through ++ case Bytecodes::_f2l: // fall through ++ case Bytecodes::_f2d: tos_in = ftos; break; ++ case Bytecodes::_d2i: // fall through ++ case Bytecodes::_d2l: // fall through ++ case Bytecodes::_d2f: tos_in = dtos; break; ++ default : ShouldNotReachHere(); ++ } ++ switch (bytecode()) { ++ case Bytecodes::_l2i: // fall through ++ case Bytecodes::_f2i: // fall through ++ case Bytecodes::_d2i: // fall through ++ case Bytecodes::_i2b: // fall through ++ case Bytecodes::_i2c: // fall through ++ case Bytecodes::_i2s: tos_out = itos; break; ++ case Bytecodes::_i2l: // fall through ++ case Bytecodes::_f2l: // fall through ++ case Bytecodes::_d2l: tos_out = ltos; break; ++ case Bytecodes::_i2f: // fall through ++ case Bytecodes::_l2f: // fall through ++ case Bytecodes::_d2f: tos_out = ftos; break; ++ case Bytecodes::_i2d: // fall through ++ case Bytecodes::_l2d: // fall through ++ case Bytecodes::_f2d: tos_out = dtos; break; ++ default : ShouldNotReachHere(); ++ } ++ transition(tos_in, tos_out); ++#endif ++ ++ // Conversion ++ Label done; ++ switch (bytecode()) { ++ case Bytecodes::_i2l: ++ __ extsw(R17_tos, R17_tos); ++ break; ++ ++ case Bytecodes::_l2i: ++ // Nothing to do, we'll continue to work with the lower bits. ++ break; ++ ++ case Bytecodes::_i2b: ++ __ extsb(R17_tos, R17_tos); ++ break; ++ ++ case Bytecodes::_i2c: ++ __ rldicl(R17_tos, R17_tos, 0, 64-2*8); ++ break; ++ ++ case Bytecodes::_i2s: ++ __ extsh(R17_tos, R17_tos); ++ break; ++ ++ case Bytecodes::_i2d: ++ __ extsw(R17_tos, R17_tos); ++ case Bytecodes::_l2d: ++ __ push_l_pop_d(); ++ __ fcfid(F15_ftos, F15_ftos); ++ break; ++ ++ case Bytecodes::_i2f: ++ __ extsw(R17_tos, R17_tos); ++ __ push_l_pop_d(); ++ if (VM_Version::has_fcfids()) { // fcfids is >= Power7 only ++ // Comment: alternatively, load with sign extend could be done by lfiwax. ++ __ fcfids(F15_ftos, F15_ftos); ++ } else { ++ __ fcfid(F15_ftos, F15_ftos); ++ __ frsp(F15_ftos, F15_ftos); ++ } ++ break; ++ ++ case Bytecodes::_l2f: ++ if (VM_Version::has_fcfids()) { // fcfids is >= Power7 only ++ __ push_l_pop_d(); ++ __ fcfids(F15_ftos, F15_ftos); ++ } else { ++ // Avoid rounding problem when result should be 0x3f800001: need fixup code before fcfid+frsp. ++ __ mr(R3_ARG1, R17_tos); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::l2f)); ++ __ fmr(F15_ftos, F1_RET); ++ } ++ break; ++ ++ case Bytecodes::_f2d: ++ // empty ++ break; ++ ++ case Bytecodes::_d2f: ++ __ frsp(F15_ftos, F15_ftos); ++ break; ++ ++ case Bytecodes::_d2i: ++ case Bytecodes::_f2i: ++ __ fcmpu(CCR0, F15_ftos, F15_ftos); ++ __ li(R17_tos, 0); // 0 in case of NAN ++ __ bso(CCR0, done); ++ __ fctiwz(F15_ftos, F15_ftos); ++ __ push_d_pop_l(); ++ break; ++ ++ case Bytecodes::_d2l: ++ case Bytecodes::_f2l: ++ __ fcmpu(CCR0, F15_ftos, F15_ftos); ++ __ li(R17_tos, 0); // 0 in case of NAN ++ __ bso(CCR0, done); ++ __ fctidz(F15_ftos, F15_ftos); ++ __ push_d_pop_l(); ++ break; ++ ++ default: ShouldNotReachHere(); ++ } ++ __ bind(done); ++} ++ ++// Long compare ++void TemplateTable::lcmp() { ++ transition(ltos, itos); ++ ++ const Register Rscratch = R11_scratch1; ++ __ pop_l(Rscratch); // first operand, deeper in stack ++ ++ __ cmpd(CCR0, Rscratch, R17_tos); // compare ++ __ mfcr(R17_tos); // set bit 32..33 as follows: <: 0b10, =: 0b00, >: 0b01 ++ __ srwi(Rscratch, R17_tos, 30); ++ __ srawi(R17_tos, R17_tos, 31); ++ __ orr(R17_tos, Rscratch, R17_tos); // set result as follows: <: -1, =: 0, >: 1 ++} ++ ++// fcmpl/fcmpg and dcmpl/dcmpg bytecodes ++// unordered_result == -1 => fcmpl or dcmpl ++// unordered_result == 1 => fcmpg or dcmpg ++void TemplateTable::float_cmp(bool is_float, int unordered_result) { ++ const FloatRegister Rfirst = F0_SCRATCH, ++ Rsecond = F15_ftos; ++ const Register Rscratch = R11_scratch1; ++ ++ if (is_float) { ++ __ pop_f(Rfirst); ++ } else { ++ __ pop_d(Rfirst); ++ } ++ ++ Label Lunordered, Ldone; ++ __ fcmpu(CCR0, Rfirst, Rsecond); // compare ++ if (unordered_result) { ++ __ bso(CCR0, Lunordered); ++ } ++ __ mfcr(R17_tos); // set bit 32..33 as follows: <: 0b10, =: 0b00, >: 0b01 ++ __ srwi(Rscratch, R17_tos, 30); ++ __ srawi(R17_tos, R17_tos, 31); ++ __ orr(R17_tos, Rscratch, R17_tos); // set result as follows: <: -1, =: 0, >: 1 ++ if (unordered_result) { ++ __ b(Ldone); ++ __ bind(Lunordered); ++ __ load_const_optimized(R17_tos, unordered_result); ++ } ++ __ bind(Ldone); ++} ++ ++// Branch_conditional which takes TemplateTable::Condition. ++void TemplateTable::branch_conditional(ConditionRegister crx, TemplateTable::Condition cc, Label& L, bool invert) { ++ bool positive = false; ++ Assembler::Condition cond = Assembler::equal; ++ switch (cc) { ++ case TemplateTable::equal: positive = true ; cond = Assembler::equal ; break; ++ case TemplateTable::not_equal: positive = false; cond = Assembler::equal ; break; ++ case TemplateTable::less: positive = true ; cond = Assembler::less ; break; ++ case TemplateTable::less_equal: positive = false; cond = Assembler::greater; break; ++ case TemplateTable::greater: positive = true ; cond = Assembler::greater; break; ++ case TemplateTable::greater_equal: positive = false; cond = Assembler::less ; break; ++ default: ShouldNotReachHere(); ++ } ++ int bo = (positive != invert) ? Assembler::bcondCRbiIs1 : Assembler::bcondCRbiIs0; ++ int bi = Assembler::bi0(crx, cond); ++ __ bc(bo, bi, L); ++} ++ ++void TemplateTable::branch(bool is_jsr, bool is_wide) { ++ ++ // Note: on SPARC, we use InterpreterMacroAssembler::if_cmp also. ++ __ verify_thread(); ++ ++ const Register Rscratch1 = R11_scratch1, ++ Rscratch2 = R12_scratch2, ++ Rscratch3 = R3_ARG1, ++ R4_counters = R4_ARG2, ++ bumped_count = R31, ++ Rdisp = R22_tmp2; ++ ++ __ profile_taken_branch(Rscratch1, bumped_count); ++ ++ // Get (wide) offset. ++ if (is_wide) { ++ __ get_4_byte_integer_at_bcp(1, Rdisp, InterpreterMacroAssembler::Signed); ++ } else { ++ __ get_2_byte_integer_at_bcp(1, Rdisp, InterpreterMacroAssembler::Signed); ++ } ++ ++ // -------------------------------------------------------------------------- ++ // Handle all the JSR stuff here, then exit. ++ // It's much shorter and cleaner than intermingling with the ++ // non-JSR normal-branch stuff occurring below. ++ if (is_jsr) { ++ // Compute return address as bci in Otos_i. ++ __ ld(Rscratch1, in_bytes(Method::const_offset()), R19_method); ++ __ addi(Rscratch2, R14_bcp, -in_bytes(ConstMethod::codes_offset()) + (is_wide ? 5 : 3)); ++ __ subf(R17_tos, Rscratch1, Rscratch2); ++ ++ // Bump bcp to target of JSR. ++ __ add(R14_bcp, Rdisp, R14_bcp); ++ // Push returnAddress for "ret" on stack. ++ __ push_ptr(R17_tos); ++ // And away we go! ++ __ dispatch_next(vtos); ++ return; ++ } ++ ++ // -------------------------------------------------------------------------- ++ // Normal (non-jsr) branch handling ++ ++ const bool increment_invocation_counter_for_backward_branches = UseCompiler && UseLoopCounter; ++ if (increment_invocation_counter_for_backward_branches) { ++ //__ unimplemented("branch invocation counter"); ++ ++ Label Lforward; ++ __ add(R14_bcp, Rdisp, R14_bcp); // Add to bc addr. ++ ++ // Check branch direction. ++ __ cmpdi(CCR0, Rdisp, 0); ++ __ bgt(CCR0, Lforward); ++ ++ __ get_method_counters(R19_method, R4_counters, Lforward); ++ ++ if (TieredCompilation) { ++ Label Lno_mdo, Loverflow; ++ const int increment = InvocationCounter::count_increment; ++ const int mask = ((1 << Tier0BackedgeNotifyFreqLog) - 1) << InvocationCounter::count_shift; ++ if (ProfileInterpreter) { ++ Register Rmdo = Rscratch1; ++ ++ // If no method data exists, go to profile_continue. ++ __ ld(Rmdo, in_bytes(Method::method_data_offset()), R19_method); ++ __ cmpdi(CCR0, Rmdo, 0); ++ __ beq(CCR0, Lno_mdo); ++ ++ // Increment backedge counter in the MDO. ++ const int mdo_bc_offs = in_bytes(MethodData::backedge_counter_offset()) + in_bytes(InvocationCounter::counter_offset()); ++ __ lwz(Rscratch2, mdo_bc_offs, Rmdo); ++ __ load_const_optimized(Rscratch3, mask, R0); ++ __ addi(Rscratch2, Rscratch2, increment); ++ __ stw(Rscratch2, mdo_bc_offs, Rmdo); ++ __ and_(Rscratch3, Rscratch2, Rscratch3); ++ __ bne(CCR0, Lforward); ++ __ b(Loverflow); ++ } ++ ++ // If there's no MDO, increment counter in method. ++ const int mo_bc_offs = in_bytes(MethodCounters::backedge_counter_offset()) + in_bytes(InvocationCounter::counter_offset()); ++ __ bind(Lno_mdo); ++ __ lwz(Rscratch2, mo_bc_offs, R4_counters); ++ __ load_const_optimized(Rscratch3, mask, R0); ++ __ addi(Rscratch2, Rscratch2, increment); ++ __ stw(Rscratch2, mo_bc_offs, R19_method); ++ __ and_(Rscratch3, Rscratch2, Rscratch3); ++ __ bne(CCR0, Lforward); ++ ++ __ bind(Loverflow); ++ ++ // Notify point for loop, pass branch bytecode. ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), R14_bcp, true); ++ ++ // Was an OSR adapter generated? ++ // O0 = osr nmethod ++ __ cmpdi(CCR0, R3_RET, 0); ++ __ beq(CCR0, Lforward); ++ ++ // Has the nmethod been invalidated already? ++ __ lwz(R0, nmethod::entry_bci_offset(), R3_RET); ++ __ cmpwi(CCR0, R0, InvalidOSREntryBci); ++ __ beq(CCR0, Lforward); ++ ++ // Migrate the interpreter frame off of the stack. ++ // We can use all registers because we will not return to interpreter from this point. ++ ++ // Save nmethod. ++ const Register osr_nmethod = R31; ++ __ mr(osr_nmethod, R3_RET); ++ __ set_top_ijava_frame_at_SP_as_last_Java_frame(R1_SP, R11_scratch1); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin), R16_thread); ++ __ reset_last_Java_frame(); ++ // OSR buffer is in ARG1. ++ ++ // Remove the interpreter frame. ++ __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ R0, R11_scratch1, R12_scratch2); ++ ++ // Jump to the osr code. ++ __ ld(R11_scratch1, nmethod::osr_entry_point_offset(), osr_nmethod); ++ __ mtlr(R0); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++ ++ } else { ++ ++ const Register invoke_ctr = Rscratch1; ++ // Update Backedge branch separately from invocations. ++ __ increment_backedge_counter(R4_counters, invoke_ctr, Rscratch2, Rscratch3); ++ ++ if (ProfileInterpreter) { ++ __ test_invocation_counter_for_mdp(invoke_ctr, Rscratch2, Lforward); ++ if (UseOnStackReplacement) { ++ __ test_backedge_count_for_osr(bumped_count, R14_bcp, Rscratch2); ++ } ++ } else { ++ if (UseOnStackReplacement) { ++ __ test_backedge_count_for_osr(invoke_ctr, R14_bcp, Rscratch2); ++ } ++ } ++ } ++ ++ __ bind(Lforward); ++ ++ } else { ++ // Bump bytecode pointer by displacement (take the branch). ++ __ add(R14_bcp, Rdisp, R14_bcp); // Add to bc addr. ++ } ++ // Continue with bytecode @ target. ++ // %%%%% Like Intel, could speed things up by moving bytecode fetch to code above, ++ // %%%%% and changing dispatch_next to dispatch_only. ++ __ dispatch_next(vtos); ++} ++ ++// Helper function for if_cmp* methods below. ++// Factored out common compare and branch code. ++void TemplateTable::if_cmp_common(Register Rfirst, Register Rsecond, Register Rscratch1, Register Rscratch2, Condition cc, bool is_jint, bool cmp0) { ++ Label Lnot_taken; ++ // Note: The condition code we get is the condition under which we ++ // *fall through*! So we have to inverse the CC here. ++ ++ if (is_jint) { ++ if (cmp0) { ++ __ cmpwi(CCR0, Rfirst, 0); ++ } else { ++ __ cmpw(CCR0, Rfirst, Rsecond); ++ } ++ } else { ++ if (cmp0) { ++ __ cmpdi(CCR0, Rfirst, 0); ++ } else { ++ __ cmpd(CCR0, Rfirst, Rsecond); ++ } ++ } ++ branch_conditional(CCR0, cc, Lnot_taken, /*invert*/ true); ++ ++ // Conition is false => Jump! ++ branch(false, false); ++ ++ // Condition is not true => Continue. ++ __ align(32, 12); ++ __ bind(Lnot_taken); ++ __ profile_not_taken_branch(Rscratch1, Rscratch2); ++} ++ ++// Compare integer values with zero and fall through if CC holds, branch away otherwise. ++void TemplateTable::if_0cmp(Condition cc) { ++ transition(itos, vtos); ++ ++ if_cmp_common(R17_tos, noreg, R11_scratch1, R12_scratch2, cc, true, true); ++} ++ ++// Compare integer values and fall through if CC holds, branch away otherwise. ++// ++// Interface: ++// - Rfirst: First operand (older stack value) ++// - tos: Second operand (younger stack value) ++void TemplateTable::if_icmp(Condition cc) { ++ transition(itos, vtos); ++ ++ const Register Rfirst = R0, ++ Rsecond = R17_tos; ++ ++ __ pop_i(Rfirst); ++ if_cmp_common(Rfirst, Rsecond, R11_scratch1, R12_scratch2, cc, true, false); ++} ++ ++void TemplateTable::if_nullcmp(Condition cc) { ++ transition(atos, vtos); ++ ++ if_cmp_common(R17_tos, noreg, R11_scratch1, R12_scratch2, cc, false, true); ++} ++ ++void TemplateTable::if_acmp(Condition cc) { ++ transition(atos, vtos); ++ ++ const Register Rfirst = R0, ++ Rsecond = R17_tos; ++ ++ __ pop_ptr(Rfirst); ++ if_cmp_common(Rfirst, Rsecond, R11_scratch1, R12_scratch2, cc, false, false); ++} ++ ++void TemplateTable::ret() { ++ locals_index(R11_scratch1); ++ __ load_local_ptr(R17_tos, R11_scratch1, R11_scratch1); ++ ++ __ profile_ret(vtos, R17_tos, R11_scratch1, R12_scratch2); ++ ++ __ ld(R11_scratch1, in_bytes(Method::const_offset()), R19_method); ++ __ add(R11_scratch1, R17_tos, R11_scratch1); ++ __ addi(R14_bcp, R11_scratch1, in_bytes(ConstMethod::codes_offset())); ++ __ dispatch_next(vtos); ++} ++ ++void TemplateTable::wide_ret() { ++ transition(vtos, vtos); ++ ++ const Register Rindex = R3_ARG1, ++ Rscratch1 = R11_scratch1, ++ Rscratch2 = R12_scratch2; ++ ++ locals_index_wide(Rindex); ++ __ load_local_ptr(R17_tos, R17_tos, Rindex); ++ __ profile_ret(vtos, R17_tos, Rscratch1, R12_scratch2); ++ // Tos now contains the bci, compute the bcp from that. ++ __ ld(Rscratch1, in_bytes(Method::const_offset()), R19_method); ++ __ addi(Rscratch2, R17_tos, in_bytes(ConstMethod::codes_offset())); ++ __ add(R14_bcp, Rscratch1, Rscratch2); ++ __ dispatch_next(vtos); ++} ++ ++void TemplateTable::tableswitch() { ++ transition(itos, vtos); ++ ++ Label Ldispatch, Ldefault_case; ++ Register Rlow_byte = R3_ARG1, ++ Rindex = Rlow_byte, ++ Rhigh_byte = R4_ARG2, ++ Rdef_offset_addr = R5_ARG3, // is going to contain address of default offset ++ Rscratch1 = R11_scratch1, ++ Rscratch2 = R12_scratch2, ++ Roffset = R6_ARG4; ++ ++ // Align bcp. ++ __ addi(Rdef_offset_addr, R14_bcp, BytesPerInt); ++ __ clrrdi(Rdef_offset_addr, Rdef_offset_addr, log2_long((jlong)BytesPerInt)); ++ ++ // Load lo & hi. ++ __ lwz(Rlow_byte, BytesPerInt, Rdef_offset_addr); ++ __ lwz(Rhigh_byte, BytesPerInt * 2, Rdef_offset_addr); ++ ++ // Check for default case (=index outside [low,high]). ++ __ cmpw(CCR0, R17_tos, Rlow_byte); ++ __ cmpw(CCR1, R17_tos, Rhigh_byte); ++ __ blt(CCR0, Ldefault_case); ++ __ bgt(CCR1, Ldefault_case); ++ ++ // Lookup dispatch offset. ++ __ sub(Rindex, R17_tos, Rlow_byte); ++ __ extsw(Rindex, Rindex); ++ __ profile_switch_case(Rindex, Rhigh_byte /* scratch */, Rscratch1, Rscratch2); ++ __ sldi(Rindex, Rindex, LogBytesPerInt); ++ __ addi(Rindex, Rindex, 3 * BytesPerInt); ++ __ lwax(Roffset, Rdef_offset_addr, Rindex); ++ __ b(Ldispatch); ++ ++ __ bind(Ldefault_case); ++ __ profile_switch_default(Rhigh_byte, Rscratch1); ++ __ lwa(Roffset, 0, Rdef_offset_addr); ++ ++ __ bind(Ldispatch); ++ ++ __ add(R14_bcp, Roffset, R14_bcp); ++ __ dispatch_next(vtos); ++} ++ ++void TemplateTable::lookupswitch() { ++ transition(itos, itos); ++ __ stop("lookupswitch bytecode should have been rewritten"); ++} ++ ++// Table switch using linear search through cases. ++// Bytecode stream format: ++// Bytecode (1) | 4-byte padding | default offset (4) | count (4) | value/offset pair1 (8) | value/offset pair2 (8) | ... ++// Note: Everything is big-endian format here. So on little endian machines, we have to revers offset and count and cmp value. ++void TemplateTable::fast_linearswitch() { ++ transition(itos, vtos); ++ ++ Label Lloop_entry, Lsearch_loop, Lfound, Lcontinue_execution, Ldefault_case; ++ ++ Register Rcount = R3_ARG1, ++ Rcurrent_pair = R4_ARG2, ++ Rdef_offset_addr = R5_ARG3, // Is going to contain address of default offset. ++ Roffset = R31, // Might need to survive C call. ++ Rvalue = R12_scratch2, ++ Rscratch = R11_scratch1, ++ Rcmp_value = R17_tos; ++ ++ // Align bcp. ++ __ addi(Rdef_offset_addr, R14_bcp, BytesPerInt); ++ __ clrrdi(Rdef_offset_addr, Rdef_offset_addr, log2_long((jlong)BytesPerInt)); ++ ++ // Setup loop counter and limit. ++ __ lwz(Rcount, BytesPerInt, Rdef_offset_addr); // Load count. ++ __ addi(Rcurrent_pair, Rdef_offset_addr, 2 * BytesPerInt); // Rcurrent_pair now points to first pair. ++ ++ // Set up search loop. ++ __ cmpwi(CCR0, Rcount, 0); ++ __ beq(CCR0, Ldefault_case); ++ ++ __ mtctr(Rcount); ++ ++ // linear table search ++ __ bind(Lsearch_loop); ++ ++ __ lwz(Rvalue, 0, Rcurrent_pair); ++ __ lwa(Roffset, 1 * BytesPerInt, Rcurrent_pair); ++ ++ __ cmpw(CCR0, Rvalue, Rcmp_value); ++ __ beq(CCR0, Lfound); ++ ++ __ addi(Rcurrent_pair, Rcurrent_pair, 2 * BytesPerInt); ++ __ bdnz(Lsearch_loop); ++ ++ // default case ++ __ bind(Ldefault_case); ++ ++ __ lwa(Roffset, 0, Rdef_offset_addr); ++ if (ProfileInterpreter) { ++ __ profile_switch_default(Rdef_offset_addr, Rcount/* scratch */); ++ __ b(Lcontinue_execution); ++ } ++ ++ // Entry found, skip Roffset bytecodes and continue. ++ __ bind(Lfound); ++ if (ProfileInterpreter) { ++ // Calc the num of the pair we hit. Careful, Rcurrent_pair points 2 ints ++ // beyond the actual current pair due to the auto update load above! ++ __ sub(Rcurrent_pair, Rcurrent_pair, Rdef_offset_addr); ++ __ addi(Rcurrent_pair, Rcurrent_pair, - 2 * BytesPerInt); ++ __ srdi(Rcurrent_pair, Rcurrent_pair, LogBytesPerInt + 1); ++ __ profile_switch_case(Rcurrent_pair, Rcount /*scratch*/, Rdef_offset_addr/*scratch*/, Rscratch); ++ __ bind(Lcontinue_execution); ++ } ++ __ add(R14_bcp, Roffset, R14_bcp); ++ __ dispatch_next(vtos); ++} ++ ++// Table switch using binary search (value/offset pairs are ordered). ++// Bytecode stream format: ++// Bytecode (1) | 4-byte padding | default offset (4) | count (4) | value/offset pair1 (8) | value/offset pair2 (8) | ... ++// Note: Everything is big-endian format here. So on little endian machines, we have to revers offset and count and cmp value. ++void TemplateTable::fast_binaryswitch() { ++ ++ transition(itos, vtos); ++ // Implementation using the following core algorithm: (copied from Intel) ++ // ++ // int binary_search(int key, LookupswitchPair* array, int n) { ++ // // Binary search according to "Methodik des Programmierens" by ++ // // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985. ++ // int i = 0; ++ // int j = n; ++ // while (i+1 < j) { ++ // // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q) ++ // // with Q: for all i: 0 <= i < n: key < a[i] ++ // // where a stands for the array and assuming that the (inexisting) ++ // // element a[n] is infinitely big. ++ // int h = (i + j) >> 1; ++ // // i < h < j ++ // if (key < array[h].fast_match()) { ++ // j = h; ++ // } else { ++ // i = h; ++ // } ++ // } ++ // // R: a[i] <= key < a[i+1] or Q ++ // // (i.e., if key is within array, i is the correct index) ++ // return i; ++ // } ++ ++ // register allocation ++ const Register Rkey = R17_tos; // already set (tosca) ++ const Register Rarray = R3_ARG1; ++ const Register Ri = R4_ARG2; ++ const Register Rj = R5_ARG3; ++ const Register Rh = R6_ARG4; ++ const Register Rscratch = R11_scratch1; ++ ++ const int log_entry_size = 3; ++ const int entry_size = 1 << log_entry_size; ++ ++ Label found; ++ ++ // Find Array start, ++ __ addi(Rarray, R14_bcp, 3 * BytesPerInt); ++ __ clrrdi(Rarray, Rarray, log2_long((jlong)BytesPerInt)); ++ ++ // initialize i & j ++ __ li(Ri,0); ++ __ lwz(Rj, -BytesPerInt, Rarray); ++ ++ // and start. ++ Label entry; ++ __ b(entry); ++ ++ // binary search loop ++ { Label loop; ++ __ bind(loop); ++ // int h = (i + j) >> 1; ++ __ srdi(Rh, Rh, 1); ++ // if (key < array[h].fast_match()) { ++ // j = h; ++ // } else { ++ // i = h; ++ // } ++ __ sldi(Rscratch, Rh, log_entry_size); ++ __ lwzx(Rscratch, Rscratch, Rarray); ++ ++ // if (key < current value) ++ // Rh = Rj ++ // else ++ // Rh = Ri ++ Label Lgreater; ++ __ cmpw(CCR0, Rkey, Rscratch); ++ __ bge(CCR0, Lgreater); ++ __ mr(Rj, Rh); ++ __ b(entry); ++ __ bind(Lgreater); ++ __ mr(Ri, Rh); ++ ++ // while (i+1 < j) ++ __ bind(entry); ++ __ addi(Rscratch, Ri, 1); ++ __ cmpw(CCR0, Rscratch, Rj); ++ __ add(Rh, Ri, Rj); // start h = i + j >> 1; ++ ++ __ blt(CCR0, loop); ++ } ++ ++ // End of binary search, result index is i (must check again!). ++ Label default_case; ++ Label continue_execution; ++ if (ProfileInterpreter) { ++ __ mr(Rh, Ri); // Save index in i for profiling. ++ } ++ // Ri = value offset ++ __ sldi(Ri, Ri, log_entry_size); ++ __ add(Ri, Ri, Rarray); ++ __ lwz(Rscratch, 0, Ri); ++ ++ Label not_found; ++ // Ri = offset offset ++ __ cmpw(CCR0, Rkey, Rscratch); ++ __ beq(CCR0, not_found); ++ // entry not found -> j = default offset ++ __ lwz(Rj, -2 * BytesPerInt, Rarray); ++ __ b(default_case); ++ ++ __ bind(not_found); ++ // entry found -> j = offset ++ __ profile_switch_case(Rh, Rj, Rscratch, Rkey); ++ __ lwz(Rj, BytesPerInt, Ri); ++ ++ if (ProfileInterpreter) { ++ __ b(continue_execution); ++ } ++ ++ __ bind(default_case); // fall through (if not profiling) ++ __ profile_switch_default(Ri, Rscratch); ++ ++ __ bind(continue_execution); ++ ++ __ extsw(Rj, Rj); ++ __ add(R14_bcp, Rj, R14_bcp); ++ __ dispatch_next(vtos); ++} ++ ++void TemplateTable::_return(TosState state) { ++ transition(state, state); ++ assert(_desc->calls_vm(), ++ "inconsistent calls_vm information"); // call in remove_activation ++ ++ if (_desc->bytecode() == Bytecodes::_return_register_finalizer) { ++ ++ Register Rscratch = R11_scratch1, ++ Rklass = R12_scratch2, ++ Rklass_flags = Rklass; ++ Label Lskip_register_finalizer; ++ ++ // Check if the method has the FINALIZER flag set and call into the VM to finalize in this case. ++ assert(state == vtos, "only valid state"); ++ __ ld(R17_tos, 0, R18_locals); ++ ++ // Load klass of this obj. ++ __ load_klass(Rklass, R17_tos); ++ __ lwz(Rklass_flags, in_bytes(Klass::access_flags_offset()), Rklass); ++ __ testbitdi(CCR0, R0, Rklass_flags, exact_log2(JVM_ACC_HAS_FINALIZER)); ++ __ bfalse(CCR0, Lskip_register_finalizer); ++ ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), R17_tos /* obj */); ++ ++ __ align(32, 12); ++ __ bind(Lskip_register_finalizer); ++ } ++ ++ // Move the result value into the correct register and remove memory stack frame. ++ __ remove_activation(state, /* throw_monitor_exception */ true); ++ // Restoration of lr done by remove_activation. ++ switch (state) { ++ case ltos: ++ case btos: ++ case ctos: ++ case stos: ++ case atos: ++ case itos: __ mr(R3_RET, R17_tos); break; ++ case ftos: ++ case dtos: __ fmr(F1_RET, F15_ftos); break; ++ case vtos: // This might be a constructor. Final fields (and volatile fields on PPC64) need ++ // to get visible before the reference to the object gets stored anywhere. ++ __ membar(Assembler::StoreStore); break; ++ default : ShouldNotReachHere(); ++ } ++ __ blr(); ++} ++ ++// ============================================================================ ++// Constant pool cache access ++// ++// Memory ordering: ++// ++// Like done in C++ interpreter, we load the fields ++// - _indices ++// - _f12_oop ++// acquired, because these are asked if the cache is already resolved. We don't ++// want to float loads above this check. ++// See also comments in ConstantPoolCacheEntry::bytecode_1(), ++// ConstantPoolCacheEntry::bytecode_2() and ConstantPoolCacheEntry::f1(); ++ ++// Call into the VM if call site is not yet resolved ++// ++// Input regs: ++// - None, all passed regs are outputs. ++// ++// Returns: ++// - Rcache: The const pool cache entry that contains the resolved result. ++// - Rresult: Either noreg or output for f1/f2. ++// ++// Kills: ++// - Rscratch ++void TemplateTable::resolve_cache_and_index(int byte_no, Register Rcache, Register Rscratch, size_t index_size) { ++ ++ __ get_cache_and_index_at_bcp(Rcache, 1, index_size); ++ Label Lresolved, Ldone; ++ ++ assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range"); ++ // We are resolved if the indices offset contains the current bytecode. ++ // Big Endian: ++ __ lbz(Rscratch, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::indices_offset()) + 7 - (byte_no + 1), Rcache); ++ // Acquire by cmp-br-isync (see below). ++ __ cmpdi(CCR0, Rscratch, (int)bytecode()); ++ __ beq(CCR0, Lresolved); ++ ++ address entry = NULL; ++ switch (bytecode()) { ++ case Bytecodes::_getstatic : // fall through ++ case Bytecodes::_putstatic : // fall through ++ case Bytecodes::_getfield : // fall through ++ case Bytecodes::_putfield : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put); break; ++ case Bytecodes::_invokevirtual : // fall through ++ case Bytecodes::_invokespecial : // fall through ++ case Bytecodes::_invokestatic : // fall through ++ case Bytecodes::_invokeinterface: entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke); break; ++ case Bytecodes::_invokehandle : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokehandle); break; ++ case Bytecodes::_invokedynamic : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic); break; ++ default : ShouldNotReachHere(); break; ++ } ++ __ li(R4_ARG2, (int)bytecode()); ++ __ call_VM(noreg, entry, R4_ARG2, true); ++ ++ // Update registers with resolved info. ++ __ get_cache_and_index_at_bcp(Rcache, 1, index_size); ++ __ b(Ldone); ++ ++ __ bind(Lresolved); ++ __ isync(); // Order load wrt. succeeding loads. ++ __ bind(Ldone); ++} ++ ++// Load the constant pool cache entry at field accesses into registers. ++// The Rcache and Rindex registers must be set before call. ++// Input: ++// - Rcache, Rindex ++// Output: ++// - Robj, Roffset, Rflags ++void TemplateTable::load_field_cp_cache_entry(Register Robj, ++ Register Rcache, ++ Register Rindex /* unused on PPC64 */, ++ Register Roffset, ++ Register Rflags, ++ bool is_static = false) { ++ assert_different_registers(Rcache, Rflags, Roffset); ++ // assert(Rindex == noreg, "parameter not used on PPC64"); ++ ++ ByteSize cp_base_offset = ConstantPoolCache::base_offset(); ++ __ ld(Rflags, in_bytes(cp_base_offset) + in_bytes(ConstantPoolCacheEntry::flags_offset()), Rcache); ++ __ ld(Roffset, in_bytes(cp_base_offset) + in_bytes(ConstantPoolCacheEntry::f2_offset()), Rcache); ++ if (is_static) { ++ __ ld(Robj, in_bytes(cp_base_offset) + in_bytes(ConstantPoolCacheEntry::f1_offset()), Rcache); ++ __ ld(Robj, in_bytes(Klass::java_mirror_offset()), Robj); ++ // Acquire not needed here. Following access has an address dependency on this value. ++ } ++} ++ ++// Load the constant pool cache entry at invokes into registers. ++// Resolve if necessary. ++ ++// Input Registers: ++// - None, bcp is used, though ++// ++// Return registers: ++// - Rmethod (f1 field or f2 if invokevirtual) ++// - Ritable_index (f2 field) ++// - Rflags (flags field) ++// ++// Kills: ++// - R21 ++// ++void TemplateTable::load_invoke_cp_cache_entry(int byte_no, ++ Register Rmethod, ++ Register Ritable_index, ++ Register Rflags, ++ bool is_invokevirtual, ++ bool is_invokevfinal, ++ bool is_invokedynamic) { ++ ++ ByteSize cp_base_offset = ConstantPoolCache::base_offset(); ++ // Determine constant pool cache field offsets. ++ assert(is_invokevirtual == (byte_no == f2_byte), "is_invokevirtual flag redundant"); ++ const int method_offset = in_bytes(cp_base_offset + (is_invokevirtual ? ConstantPoolCacheEntry::f2_offset() : ConstantPoolCacheEntry::f1_offset())); ++ const int flags_offset = in_bytes(cp_base_offset + ConstantPoolCacheEntry::flags_offset()); ++ // Access constant pool cache fields. ++ const int index_offset = in_bytes(cp_base_offset + ConstantPoolCacheEntry::f2_offset()); ++ ++ Register Rcache = R21_tmp1; // Note: same register as R21_sender_SP. ++ ++ if (is_invokevfinal) { ++ assert(Ritable_index == noreg, "register not used"); ++ // Already resolved. ++ __ get_cache_and_index_at_bcp(Rcache, 1); ++ } else { ++ resolve_cache_and_index(byte_no, Rcache, R0, is_invokedynamic ? sizeof(u4) : sizeof(u2)); ++ } ++ ++ __ ld(Rmethod, method_offset, Rcache); ++ __ ld(Rflags, flags_offset, Rcache); ++ ++ if (Ritable_index != noreg) { ++ __ ld(Ritable_index, index_offset, Rcache); ++ } ++} ++ ++// ============================================================================ ++// Field access ++ ++// Volatile variables demand their effects be made known to all CPU's ++// in order. Store buffers on most chips allow reads & writes to ++// reorder; the JMM's ReadAfterWrite.java test fails in -Xint mode ++// without some kind of memory barrier (i.e., it's not sufficient that ++// the interpreter does not reorder volatile references, the hardware ++// also must not reorder them). ++// ++// According to the new Java Memory Model (JMM): ++// (1) All volatiles are serialized wrt to each other. ALSO reads & ++// writes act as aquire & release, so: ++// (2) A read cannot let unrelated NON-volatile memory refs that ++// happen after the read float up to before the read. It's OK for ++// non-volatile memory refs that happen before the volatile read to ++// float down below it. ++// (3) Similar a volatile write cannot let unrelated NON-volatile ++// memory refs that happen BEFORE the write float down to after the ++// write. It's OK for non-volatile memory refs that happen after the ++// volatile write to float up before it. ++// ++// We only put in barriers around volatile refs (they are expensive), ++// not _between_ memory refs (that would require us to track the ++// flavor of the previous memory refs). Requirements (2) and (3) ++// require some barriers before volatile stores and after volatile ++// loads. These nearly cover requirement (1) but miss the ++// volatile-store-volatile-load case. This final case is placed after ++// volatile-stores although it could just as well go before ++// volatile-loads. ++ ++// The registers cache and index expected to be set before call. ++// Correct values of the cache and index registers are preserved. ++// Kills: ++// Rcache (if has_tos) ++// Rscratch ++void TemplateTable::jvmti_post_field_access(Register Rcache, Register Rscratch, bool is_static, bool has_tos) { ++ ++ assert_different_registers(Rcache, Rscratch); ++ ++ if (JvmtiExport::can_post_field_access()) { ++ ByteSize cp_base_offset = ConstantPoolCache::base_offset(); ++ Label Lno_field_access_post; ++ ++ // Check if post field access in enabled. ++ int offs = __ load_const_optimized(Rscratch, JvmtiExport::get_field_access_count_addr(), R0, true); ++ __ lwz(Rscratch, offs, Rscratch); ++ ++ __ cmpwi(CCR0, Rscratch, 0); ++ __ beq(CCR0, Lno_field_access_post); ++ ++ // Post access enabled - do it! ++ __ addi(Rcache, Rcache, in_bytes(cp_base_offset)); ++ if (is_static) { ++ __ li(R17_tos, 0); ++ } else { ++ if (has_tos) { ++ // The fast bytecode versions have obj ptr in register. ++ // Thus, save object pointer before call_VM() clobbers it ++ // put object on tos where GC wants it. ++ __ push_ptr(R17_tos); ++ } else { ++ // Load top of stack (do not pop the value off the stack). ++ __ ld(R17_tos, Interpreter::expr_offset_in_bytes(0), R15_esp); ++ } ++ __ verify_oop(R17_tos); ++ } ++ // tos: object pointer or NULL if static ++ // cache: cache entry pointer ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), R17_tos, Rcache); ++ if (!is_static && has_tos) { ++ // Restore object pointer. ++ __ pop_ptr(R17_tos); ++ __ verify_oop(R17_tos); ++ } else { ++ // Cache is still needed to get class or obj. ++ __ get_cache_and_index_at_bcp(Rcache, 1); ++ } ++ ++ __ align(32, 12); ++ __ bind(Lno_field_access_post); ++ } ++} ++ ++// kills R11_scratch1 ++void TemplateTable::pop_and_check_object(Register Roop) { ++ Register Rtmp = R11_scratch1; ++ ++ assert_different_registers(Rtmp, Roop); ++ __ pop_ptr(Roop); ++ // For field access must check obj. ++ __ null_check_throw(Roop, -1, Rtmp); ++ __ verify_oop(Roop); ++} ++ ++// PPC64: implement volatile loads as fence-store-acquire. ++void TemplateTable::getfield_or_static(int byte_no, bool is_static) { ++ transition(vtos, vtos); ++ ++ Label Lacquire, Lisync; ++ ++ const Register Rcache = R3_ARG1, ++ Rclass_or_obj = R22_tmp2, ++ Roffset = R23_tmp3, ++ Rflags = R31, ++ Rbtable = R5_ARG3, ++ Rbc = R6_ARG4, ++ Rscratch = R12_scratch2; ++ ++ static address field_branch_table[number_of_states], ++ static_branch_table[number_of_states]; ++ ++ address* branch_table = is_static ? static_branch_table : field_branch_table; ++ ++ // Get field offset. ++ resolve_cache_and_index(byte_no, Rcache, Rscratch, sizeof(u2)); ++ ++ // JVMTI support ++ jvmti_post_field_access(Rcache, Rscratch, is_static, false); ++ ++ // Load after possible GC. ++ load_field_cp_cache_entry(Rclass_or_obj, Rcache, noreg, Roffset, Rflags, is_static); ++ ++ // Load pointer to branch table. ++ __ load_const_optimized(Rbtable, (address)branch_table, Rscratch); ++ ++ // Get volatile flag. ++ __ rldicl(Rscratch, Rflags, 64-ConstantPoolCacheEntry::is_volatile_shift, 63); // Extract volatile bit. ++ // Note: sync is needed before volatile load on PPC64. ++ ++ // Check field type. ++ __ rldicl(Rflags, Rflags, 64-ConstantPoolCacheEntry::tos_state_shift, 64-ConstantPoolCacheEntry::tos_state_bits); ++ ++#ifdef ASSERT ++ Label LFlagInvalid; ++ __ cmpldi(CCR0, Rflags, number_of_states); ++ __ bge(CCR0, LFlagInvalid); ++#endif ++ ++ // Load from branch table and dispatch (volatile case: one instruction ahead). ++ __ sldi(Rflags, Rflags, LogBytesPerWord); ++ __ cmpwi(CCR6, Rscratch, 1); // Volatile? ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ sldi(Rscratch, Rscratch, exact_log2(BytesPerInstWord)); // Volatile ? size of 1 instruction : 0. ++ } ++ __ ldx(Rbtable, Rbtable, Rflags); ++ ++ // Get the obj from stack. ++ if (!is_static) { ++ pop_and_check_object(Rclass_or_obj); // Kills R11_scratch1. ++ } else { ++ __ verify_oop(Rclass_or_obj); ++ } ++ ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ subf(Rbtable, Rscratch, Rbtable); // Point to volatile/non-volatile entry point. ++ } ++ __ mtctr(Rbtable); ++ __ bctr(); ++ ++#ifdef ASSERT ++ __ bind(LFlagInvalid); ++ __ stop("got invalid flag", 0x654); ++ ++ // __ bind(Lvtos); ++ address pc_before_fence = __ pc(); ++ __ fence(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(__ pc() - pc_before_fence == (ptrdiff_t)BytesPerInstWord, "must be single instruction"); ++ assert(branch_table[vtos] == 0, "can't compute twice"); ++ branch_table[vtos] = __ pc(); // non-volatile_entry point ++ __ stop("vtos unexpected", 0x655); ++#endif ++ ++ __ align(32, 28, 28); // Align load. ++ // __ bind(Ldtos); ++ __ fence(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[dtos] == 0, "can't compute twice"); ++ branch_table[dtos] = __ pc(); // non-volatile_entry point ++ __ lfdx(F15_ftos, Rclass_or_obj, Roffset); ++ __ push(dtos); ++ if (!is_static) patch_bytecode(Bytecodes::_fast_dgetfield, Rbc, Rscratch); ++ { ++ Label acquire_double; ++ __ beq(CCR6, acquire_double); // Volatile? ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ bind(acquire_double); ++ __ fcmpu(CCR0, F15_ftos, F15_ftos); // Acquire by cmp-br-isync. ++ __ beq_predict_taken(CCR0, Lisync); ++ __ b(Lisync); // In case of NAN. ++ } ++ ++ __ align(32, 28, 28); // Align load. ++ // __ bind(Lftos); ++ __ fence(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[ftos] == 0, "can't compute twice"); ++ branch_table[ftos] = __ pc(); // non-volatile_entry point ++ __ lfsx(F15_ftos, Rclass_or_obj, Roffset); ++ __ push(ftos); ++ if (!is_static) { patch_bytecode(Bytecodes::_fast_fgetfield, Rbc, Rscratch); } ++ { ++ Label acquire_float; ++ __ beq(CCR6, acquire_float); // Volatile? ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ bind(acquire_float); ++ __ fcmpu(CCR0, F15_ftos, F15_ftos); // Acquire by cmp-br-isync. ++ __ beq_predict_taken(CCR0, Lisync); ++ __ b(Lisync); // In case of NAN. ++ } ++ ++ __ align(32, 28, 28); // Align load. ++ // __ bind(Litos); ++ __ fence(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[itos] == 0, "can't compute twice"); ++ branch_table[itos] = __ pc(); // non-volatile_entry point ++ __ lwax(R17_tos, Rclass_or_obj, Roffset); ++ __ push(itos); ++ if (!is_static) patch_bytecode(Bytecodes::_fast_igetfield, Rbc, Rscratch); ++ __ beq(CCR6, Lacquire); // Volatile? ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align load. ++ // __ bind(Lltos); ++ __ fence(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[ltos] == 0, "can't compute twice"); ++ branch_table[ltos] = __ pc(); // non-volatile_entry point ++ __ ldx(R17_tos, Rclass_or_obj, Roffset); ++ __ push(ltos); ++ if (!is_static) patch_bytecode(Bytecodes::_fast_lgetfield, Rbc, Rscratch); ++ __ beq(CCR6, Lacquire); // Volatile? ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align load. ++ // __ bind(Lbtos); ++ __ fence(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[btos] == 0, "can't compute twice"); ++ branch_table[btos] = __ pc(); // non-volatile_entry point ++ __ lbzx(R17_tos, Rclass_or_obj, Roffset); ++ __ extsb(R17_tos, R17_tos); ++ __ push(btos); ++ if (!is_static) patch_bytecode(Bytecodes::_fast_bgetfield, Rbc, Rscratch); ++ __ beq(CCR6, Lacquire); // Volatile? ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align load. ++ // __ bind(Lctos); ++ __ fence(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[ctos] == 0, "can't compute twice"); ++ branch_table[ctos] = __ pc(); // non-volatile_entry point ++ __ lhzx(R17_tos, Rclass_or_obj, Roffset); ++ __ push(ctos); ++ if (!is_static) patch_bytecode(Bytecodes::_fast_cgetfield, Rbc, Rscratch); ++ __ beq(CCR6, Lacquire); // Volatile? ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align load. ++ // __ bind(Lstos); ++ __ fence(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[stos] == 0, "can't compute twice"); ++ branch_table[stos] = __ pc(); // non-volatile_entry point ++ __ lhax(R17_tos, Rclass_or_obj, Roffset); ++ __ push(stos); ++ if (!is_static) patch_bytecode(Bytecodes::_fast_sgetfield, Rbc, Rscratch); ++ __ beq(CCR6, Lacquire); // Volatile? ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align load. ++ // __ bind(Latos); ++ __ fence(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[atos] == 0, "can't compute twice"); ++ branch_table[atos] = __ pc(); // non-volatile_entry point ++ __ load_heap_oop(R17_tos, (RegisterOrConstant)Roffset, Rclass_or_obj); ++ __ verify_oop(R17_tos); ++ __ push(atos); ++ //__ dcbt(R17_tos); // prefetch ++ if (!is_static) patch_bytecode(Bytecodes::_fast_agetfield, Rbc, Rscratch); ++ __ beq(CCR6, Lacquire); // Volatile? ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 12); ++ __ bind(Lacquire); ++ __ twi_0(R17_tos); ++ __ bind(Lisync); ++ __ isync(); // acquire ++ ++#ifdef ASSERT ++ for (int i = 0; iprint_cr("get: %s_branch_table[%d] = 0x%llx (opcode 0x%llx)", ++ // is_static ? "static" : "field", i, branch_table[i], *((unsigned int*)branch_table[i])); ++ } ++#endif ++} ++ ++void TemplateTable::getfield(int byte_no) { ++ getfield_or_static(byte_no, false); ++} ++ ++void TemplateTable::getstatic(int byte_no) { ++ getfield_or_static(byte_no, true); ++} ++ ++// The registers cache and index expected to be set before call. ++// The function may destroy various registers, just not the cache and index registers. ++void TemplateTable::jvmti_post_field_mod(Register Rcache, Register Rscratch, bool is_static) { ++ ++ assert_different_registers(Rcache, Rscratch, R6_ARG4); ++ ++ if (JvmtiExport::can_post_field_modification()) { ++ Label Lno_field_mod_post; ++ ++ // Check if post field access in enabled. ++ int offs = __ load_const_optimized(Rscratch, JvmtiExport::get_field_modification_count_addr(), R0, true); ++ __ lwz(Rscratch, offs, Rscratch); ++ ++ __ cmpwi(CCR0, Rscratch, 0); ++ __ beq(CCR0, Lno_field_mod_post); ++ ++ // Do the post ++ ByteSize cp_base_offset = ConstantPoolCache::base_offset(); ++ const Register Robj = Rscratch; ++ ++ __ addi(Rcache, Rcache, in_bytes(cp_base_offset)); ++ if (is_static) { ++ // Life is simple. Null out the object pointer. ++ __ li(Robj, 0); ++ } else { ++ // In case of the fast versions, value lives in registers => put it back on tos. ++ int offs = Interpreter::expr_offset_in_bytes(0); ++ Register base = R15_esp; ++ switch(bytecode()) { ++ case Bytecodes::_fast_aputfield: __ push_ptr(); offs+= Interpreter::stackElementSize; break; ++ case Bytecodes::_fast_iputfield: // Fall through ++ case Bytecodes::_fast_bputfield: // Fall through ++ case Bytecodes::_fast_cputfield: // Fall through ++ case Bytecodes::_fast_sputfield: __ push_i(); offs+= Interpreter::stackElementSize; break; ++ case Bytecodes::_fast_lputfield: __ push_l(); offs+=2*Interpreter::stackElementSize; break; ++ case Bytecodes::_fast_fputfield: __ push_f(); offs+= Interpreter::stackElementSize; break; ++ case Bytecodes::_fast_dputfield: __ push_d(); offs+=2*Interpreter::stackElementSize; break; ++ default: { ++ offs = 0; ++ base = Robj; ++ const Register Rflags = Robj; ++ Label is_one_slot; ++ // Life is harder. The stack holds the value on top, followed by the ++ // object. We don't know the size of the value, though; it could be ++ // one or two words depending on its type. As a result, we must find ++ // the type to determine where the object is. ++ __ ld(Rflags, in_bytes(ConstantPoolCacheEntry::flags_offset()), Rcache); // Big Endian ++ __ rldicl(Rflags, Rflags, 64-ConstantPoolCacheEntry::tos_state_shift, 64-ConstantPoolCacheEntry::tos_state_bits); ++ ++ __ cmpwi(CCR0, Rflags, ltos); ++ __ cmpwi(CCR1, Rflags, dtos); ++ __ addi(base, R15_esp, Interpreter::expr_offset_in_bytes(1)); ++ __ crnor(/*CR0 eq*/2, /*CR1 eq*/4+2, /*CR0 eq*/2); ++ __ beq(CCR0, is_one_slot); ++ __ addi(base, R15_esp, Interpreter::expr_offset_in_bytes(2)); ++ __ bind(is_one_slot); ++ break; ++ } ++ } ++ __ ld(Robj, offs, base); ++ __ verify_oop(Robj); ++ } ++ ++ __ addi(R6_ARG4, R15_esp, Interpreter::expr_offset_in_bytes(0)); ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), Robj, Rcache, R6_ARG4); ++ __ get_cache_and_index_at_bcp(Rcache, 1); ++ ++ // In case of the fast versions, value lives in registers => put it back on tos. ++ switch(bytecode()) { ++ case Bytecodes::_fast_aputfield: __ pop_ptr(); break; ++ case Bytecodes::_fast_iputfield: // Fall through ++ case Bytecodes::_fast_bputfield: // Fall through ++ case Bytecodes::_fast_cputfield: // Fall through ++ case Bytecodes::_fast_sputfield: __ pop_i(); break; ++ case Bytecodes::_fast_lputfield: __ pop_l(); break; ++ case Bytecodes::_fast_fputfield: __ pop_f(); break; ++ case Bytecodes::_fast_dputfield: __ pop_d(); break; ++ default: break; // Nothin' to do. ++ } ++ ++ __ align(32, 12); ++ __ bind(Lno_field_mod_post); ++ } ++} ++ ++// PPC64: implement volatile stores as release-store (return bytecode contains an additional release). ++void TemplateTable::putfield_or_static(int byte_no, bool is_static) { ++ Label Lvolatile; ++ ++ const Register Rcache = R5_ARG3, // Do not use ARG1/2 (causes trouble in jvmti_post_field_mod). ++ Rclass_or_obj = R31, // Needs to survive C call. ++ Roffset = R22_tmp2, // Needs to survive C call. ++ Rflags = R3_ARG1, ++ Rbtable = R4_ARG2, ++ Rscratch = R11_scratch1, ++ Rscratch2 = R12_scratch2, ++ Rscratch3 = R6_ARG4, ++ Rbc = Rscratch3; ++ const ConditionRegister CR_is_vol = CCR2; // Non-volatile condition register (survives runtime call in do_oop_store). ++ ++ static address field_branch_table[number_of_states], ++ static_branch_table[number_of_states]; ++ ++ address* branch_table = is_static ? static_branch_table : field_branch_table; ++ ++ // Stack (grows up): ++ // value ++ // obj ++ ++ // Load the field offset. ++ resolve_cache_and_index(byte_no, Rcache, Rscratch, sizeof(u2)); ++ jvmti_post_field_mod(Rcache, Rscratch, is_static); ++ load_field_cp_cache_entry(Rclass_or_obj, Rcache, noreg, Roffset, Rflags, is_static); ++ ++ // Load pointer to branch table. ++ __ load_const_optimized(Rbtable, (address)branch_table, Rscratch); ++ ++ // Get volatile flag. ++ __ rldicl(Rscratch, Rflags, 64-ConstantPoolCacheEntry::is_volatile_shift, 63); // Extract volatile bit. ++ ++ // Check the field type. ++ __ rldicl(Rflags, Rflags, 64-ConstantPoolCacheEntry::tos_state_shift, 64-ConstantPoolCacheEntry::tos_state_bits); ++ ++#ifdef ASSERT ++ Label LFlagInvalid; ++ __ cmpldi(CCR0, Rflags, number_of_states); ++ __ bge(CCR0, LFlagInvalid); ++#endif ++ ++ // Load from branch table and dispatch (volatile case: one instruction ahead). ++ __ sldi(Rflags, Rflags, LogBytesPerWord); ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { __ cmpwi(CR_is_vol, Rscratch, 1); } // Volatile? ++ __ sldi(Rscratch, Rscratch, exact_log2(BytesPerInstWord)); // Volatile? size of instruction 1 : 0. ++ __ ldx(Rbtable, Rbtable, Rflags); ++ ++ __ subf(Rbtable, Rscratch, Rbtable); // Point to volatile/non-volatile entry point. ++ __ mtctr(Rbtable); ++ __ bctr(); ++ ++#ifdef ASSERT ++ __ bind(LFlagInvalid); ++ __ stop("got invalid flag", 0x656); ++ ++ // __ bind(Lvtos); ++ address pc_before_release = __ pc(); ++ __ release(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(__ pc() - pc_before_release == (ptrdiff_t)BytesPerInstWord, "must be single instruction"); ++ assert(branch_table[vtos] == 0, "can't compute twice"); ++ branch_table[vtos] = __ pc(); // non-volatile_entry point ++ __ stop("vtos unexpected", 0x657); ++#endif ++ ++ __ align(32, 28, 28); // Align pop. ++ // __ bind(Ldtos); ++ __ release(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[dtos] == 0, "can't compute twice"); ++ branch_table[dtos] = __ pc(); // non-volatile_entry point ++ __ pop(dtos); ++ if (!is_static) { pop_and_check_object(Rclass_or_obj); } // Kills R11_scratch1. ++ __ stfdx(F15_ftos, Rclass_or_obj, Roffset); ++ if (!is_static) { patch_bytecode(Bytecodes::_fast_dputfield, Rbc, Rscratch, true, byte_no); } ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ beq(CR_is_vol, Lvolatile); // Volatile? ++ } ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align pop. ++ // __ bind(Lftos); ++ __ release(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[ftos] == 0, "can't compute twice"); ++ branch_table[ftos] = __ pc(); // non-volatile_entry point ++ __ pop(ftos); ++ if (!is_static) { pop_and_check_object(Rclass_or_obj); } // Kills R11_scratch1. ++ __ stfsx(F15_ftos, Rclass_or_obj, Roffset); ++ if (!is_static) { patch_bytecode(Bytecodes::_fast_fputfield, Rbc, Rscratch, true, byte_no); } ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ beq(CR_is_vol, Lvolatile); // Volatile? ++ } ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align pop. ++ // __ bind(Litos); ++ __ release(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[itos] == 0, "can't compute twice"); ++ branch_table[itos] = __ pc(); // non-volatile_entry point ++ __ pop(itos); ++ if (!is_static) { pop_and_check_object(Rclass_or_obj); } // Kills R11_scratch1. ++ __ stwx(R17_tos, Rclass_or_obj, Roffset); ++ if (!is_static) { patch_bytecode(Bytecodes::_fast_iputfield, Rbc, Rscratch, true, byte_no); } ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ beq(CR_is_vol, Lvolatile); // Volatile? ++ } ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align pop. ++ // __ bind(Lltos); ++ __ release(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[ltos] == 0, "can't compute twice"); ++ branch_table[ltos] = __ pc(); // non-volatile_entry point ++ __ pop(ltos); ++ if (!is_static) { pop_and_check_object(Rclass_or_obj); } // Kills R11_scratch1. ++ __ stdx(R17_tos, Rclass_or_obj, Roffset); ++ if (!is_static) { patch_bytecode(Bytecodes::_fast_lputfield, Rbc, Rscratch, true, byte_no); } ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ beq(CR_is_vol, Lvolatile); // Volatile? ++ } ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align pop. ++ // __ bind(Lbtos); ++ __ release(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[btos] == 0, "can't compute twice"); ++ branch_table[btos] = __ pc(); // non-volatile_entry point ++ __ pop(btos); ++ if (!is_static) { pop_and_check_object(Rclass_or_obj); } // Kills R11_scratch1. ++ __ stbx(R17_tos, Rclass_or_obj, Roffset); ++ if (!is_static) { patch_bytecode(Bytecodes::_fast_bputfield, Rbc, Rscratch, true, byte_no); } ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ beq(CR_is_vol, Lvolatile); // Volatile? ++ } ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align pop. ++ // __ bind(Lctos); ++ __ release(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[ctos] == 0, "can't compute twice"); ++ branch_table[ctos] = __ pc(); // non-volatile_entry point ++ __ pop(ctos); ++ if (!is_static) { pop_and_check_object(Rclass_or_obj); } // Kills R11_scratch1.. ++ __ sthx(R17_tos, Rclass_or_obj, Roffset); ++ if (!is_static) { patch_bytecode(Bytecodes::_fast_cputfield, Rbc, Rscratch, true, byte_no); } ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ beq(CR_is_vol, Lvolatile); // Volatile? ++ } ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align pop. ++ // __ bind(Lstos); ++ __ release(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[stos] == 0, "can't compute twice"); ++ branch_table[stos] = __ pc(); // non-volatile_entry point ++ __ pop(stos); ++ if (!is_static) { pop_and_check_object(Rclass_or_obj); } // Kills R11_scratch1. ++ __ sthx(R17_tos, Rclass_or_obj, Roffset); ++ if (!is_static) { patch_bytecode(Bytecodes::_fast_sputfield, Rbc, Rscratch, true, byte_no); } ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ beq(CR_is_vol, Lvolatile); // Volatile? ++ } ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 28, 28); // Align pop. ++ // __ bind(Latos); ++ __ release(); // Volatile entry point (one instruction before non-volatile_entry point). ++ assert(branch_table[atos] == 0, "can't compute twice"); ++ branch_table[atos] = __ pc(); // non-volatile_entry point ++ __ pop(atos); ++ if (!is_static) { pop_and_check_object(Rclass_or_obj); } // kills R11_scratch1 ++ do_oop_store(_masm, Rclass_or_obj, Roffset, R17_tos, Rscratch, Rscratch2, Rscratch3, _bs->kind(), false /* precise */, true /* check null */); ++ if (!is_static) { patch_bytecode(Bytecodes::_fast_aputfield, Rbc, Rscratch, true, byte_no); } ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ __ beq(CR_is_vol, Lvolatile); // Volatile? ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 12); ++ __ bind(Lvolatile); ++ __ fence(); ++ } ++ // fallthru: __ b(Lexit); ++ ++#ifdef ASSERT ++ for (int i = 0; iprint_cr("put: %s_branch_table[%d] = 0x%llx (opcode 0x%llx)", ++ // is_static ? "static" : "field", i, branch_table[i], *((unsigned int*)branch_table[i])); ++ } ++#endif ++} ++ ++void TemplateTable::putfield(int byte_no) { ++ putfield_or_static(byte_no, false); ++} ++ ++void TemplateTable::putstatic(int byte_no) { ++ putfield_or_static(byte_no, true); ++} ++ ++// See SPARC. On PPC64, we have a different jvmti_post_field_mod which does the job. ++void TemplateTable::jvmti_post_fast_field_mod() { ++ __ should_not_reach_here(); ++} ++ ++void TemplateTable::fast_storefield(TosState state) { ++ transition(state, vtos); ++ ++ const Register Rcache = R5_ARG3, // Do not use ARG1/2 (causes trouble in jvmti_post_field_mod). ++ Rclass_or_obj = R31, // Needs to survive C call. ++ Roffset = R22_tmp2, // Needs to survive C call. ++ Rflags = R3_ARG1, ++ Rscratch = R11_scratch1, ++ Rscratch2 = R12_scratch2, ++ Rscratch3 = R4_ARG2; ++ const ConditionRegister CR_is_vol = CCR2; // Non-volatile condition register (survives runtime call in do_oop_store). ++ ++ // Constant pool already resolved => Load flags and offset of field. ++ __ get_cache_and_index_at_bcp(Rcache, 1); ++ jvmti_post_field_mod(Rcache, Rscratch, false /* not static */); ++ load_field_cp_cache_entry(noreg, Rcache, noreg, Roffset, Rflags, false); ++ ++ // Get the obj and the final store addr. ++ pop_and_check_object(Rclass_or_obj); // Kills R11_scratch1. ++ ++ // Get volatile flag. ++ __ rldicl_(Rscratch, Rflags, 64-ConstantPoolCacheEntry::is_volatile_shift, 63); // Extract volatile bit. ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { __ cmpdi(CR_is_vol, Rscratch, 1); } ++ { ++ Label LnotVolatile; ++ __ beq(CCR0, LnotVolatile); ++ __ release(); ++ __ align(32, 12); ++ __ bind(LnotVolatile); ++ } ++ ++ // Do the store and fencing. ++ switch(bytecode()) { ++ case Bytecodes::_fast_aputfield: ++ // Store into the field. ++ do_oop_store(_masm, Rclass_or_obj, Roffset, R17_tos, Rscratch, Rscratch2, Rscratch3, _bs->kind(), false /* precise */, true /* check null */); ++ break; ++ ++ case Bytecodes::_fast_iputfield: ++ __ stwx(R17_tos, Rclass_or_obj, Roffset); ++ break; ++ ++ case Bytecodes::_fast_lputfield: ++ __ stdx(R17_tos, Rclass_or_obj, Roffset); ++ break; ++ ++ case Bytecodes::_fast_bputfield: ++ __ stbx(R17_tos, Rclass_or_obj, Roffset); ++ break; ++ ++ case Bytecodes::_fast_cputfield: ++ case Bytecodes::_fast_sputfield: ++ __ sthx(R17_tos, Rclass_or_obj, Roffset); ++ break; ++ ++ case Bytecodes::_fast_fputfield: ++ __ stfsx(F15_ftos, Rclass_or_obj, Roffset); ++ break; ++ ++ case Bytecodes::_fast_dputfield: ++ __ stfdx(F15_ftos, Rclass_or_obj, Roffset); ++ break; ++ ++ default: ShouldNotReachHere(); ++ } ++ ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ Label LVolatile; ++ __ beq(CR_is_vol, LVolatile); ++ __ dispatch_epilog(vtos, Bytecodes::length_for(bytecode())); ++ ++ __ align(32, 12); ++ __ bind(LVolatile); ++ __ fence(); ++ } ++} ++ ++void TemplateTable::fast_accessfield(TosState state) { ++ transition(atos, state); ++ ++ Label LisVolatile; ++ ByteSize cp_base_offset = ConstantPoolCache::base_offset(); ++ ++ const Register Rcache = R3_ARG1, ++ Rclass_or_obj = R17_tos, ++ Roffset = R22_tmp2, ++ Rflags = R23_tmp3, ++ Rscratch = R12_scratch2; ++ ++ // Constant pool already resolved. Get the field offset. ++ __ get_cache_and_index_at_bcp(Rcache, 1); ++ load_field_cp_cache_entry(noreg, Rcache, noreg, Roffset, Rflags, false); ++ ++ // JVMTI support ++ jvmti_post_field_access(Rcache, Rscratch, false, true); ++ ++ // Get the load address. ++ __ null_check_throw(Rclass_or_obj, -1, Rscratch); ++ ++ // Get volatile flag. ++ __ rldicl_(Rscratch, Rflags, 64-ConstantPoolCacheEntry::is_volatile_shift, 63); // Extract volatile bit. ++ __ bne(CCR0, LisVolatile); ++ ++ switch(bytecode()) { ++ case Bytecodes::_fast_agetfield: ++ { ++ __ load_heap_oop(R17_tos, (RegisterOrConstant)Roffset, Rclass_or_obj); ++ __ verify_oop(R17_tos); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode())); ++ ++ __ bind(LisVolatile); ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ load_heap_oop(R17_tos, (RegisterOrConstant)Roffset, Rclass_or_obj); ++ __ verify_oop(R17_tos); ++ __ twi_0(R17_tos); ++ __ isync(); ++ break; ++ } ++ case Bytecodes::_fast_igetfield: ++ { ++ __ lwax(R17_tos, Rclass_or_obj, Roffset); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode())); ++ ++ __ bind(LisVolatile); ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ lwax(R17_tos, Rclass_or_obj, Roffset); ++ __ twi_0(R17_tos); ++ __ isync(); ++ break; ++ } ++ case Bytecodes::_fast_lgetfield: ++ { ++ __ ldx(R17_tos, Rclass_or_obj, Roffset); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode())); ++ ++ __ bind(LisVolatile); ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ ldx(R17_tos, Rclass_or_obj, Roffset); ++ __ twi_0(R17_tos); ++ __ isync(); ++ break; ++ } ++ case Bytecodes::_fast_bgetfield: ++ { ++ __ lbzx(R17_tos, Rclass_or_obj, Roffset); ++ __ extsb(R17_tos, R17_tos); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode())); ++ ++ __ bind(LisVolatile); ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ lbzx(R17_tos, Rclass_or_obj, Roffset); ++ __ twi_0(R17_tos); ++ __ extsb(R17_tos, R17_tos); ++ __ isync(); ++ break; ++ } ++ case Bytecodes::_fast_cgetfield: ++ { ++ __ lhzx(R17_tos, Rclass_or_obj, Roffset); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode())); ++ ++ __ bind(LisVolatile); ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ lhzx(R17_tos, Rclass_or_obj, Roffset); ++ __ twi_0(R17_tos); ++ __ isync(); ++ break; ++ } ++ case Bytecodes::_fast_sgetfield: ++ { ++ __ lhax(R17_tos, Rclass_or_obj, Roffset); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode())); ++ ++ __ bind(LisVolatile); ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ lhax(R17_tos, Rclass_or_obj, Roffset); ++ __ twi_0(R17_tos); ++ __ isync(); ++ break; ++ } ++ case Bytecodes::_fast_fgetfield: ++ { ++ __ lfsx(F15_ftos, Rclass_or_obj, Roffset); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode())); ++ ++ __ bind(LisVolatile); ++ Label Ldummy; ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ lfsx(F15_ftos, Rclass_or_obj, Roffset); ++ __ fcmpu(CCR0, F15_ftos, F15_ftos); // Acquire by cmp-br-isync. ++ __ bne_predict_not_taken(CCR0, Ldummy); ++ __ bind(Ldummy); ++ __ isync(); ++ break; ++ } ++ case Bytecodes::_fast_dgetfield: ++ { ++ __ lfdx(F15_ftos, Rclass_or_obj, Roffset); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode())); ++ ++ __ bind(LisVolatile); ++ Label Ldummy; ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ lfdx(F15_ftos, Rclass_or_obj, Roffset); ++ __ fcmpu(CCR0, F15_ftos, F15_ftos); // Acquire by cmp-br-isync. ++ __ bne_predict_not_taken(CCR0, Ldummy); ++ __ bind(Ldummy); ++ __ isync(); ++ break; ++ } ++ default: ShouldNotReachHere(); ++ } ++} ++ ++void TemplateTable::fast_xaccess(TosState state) { ++ transition(vtos, state); ++ ++ Label LisVolatile; ++ ByteSize cp_base_offset = ConstantPoolCache::base_offset(); ++ const Register Rcache = R3_ARG1, ++ Rclass_or_obj = R17_tos, ++ Roffset = R22_tmp2, ++ Rflags = R23_tmp3, ++ Rscratch = R12_scratch2; ++ ++ __ ld(Rclass_or_obj, 0, R18_locals); ++ ++ // Constant pool already resolved. Get the field offset. ++ __ get_cache_and_index_at_bcp(Rcache, 2); ++ load_field_cp_cache_entry(noreg, Rcache, noreg, Roffset, Rflags, false); ++ ++ // JVMTI support not needed, since we switch back to single bytecode as soon as debugger attaches. ++ ++ // Needed to report exception at the correct bcp. ++ __ addi(R14_bcp, R14_bcp, 1); ++ ++ // Get the load address. ++ __ null_check_throw(Rclass_or_obj, -1, Rscratch); ++ ++ // Get volatile flag. ++ __ rldicl_(Rscratch, Rflags, 64-ConstantPoolCacheEntry::is_volatile_shift, 63); // Extract volatile bit. ++ __ bne(CCR0, LisVolatile); ++ ++ switch(state) { ++ case atos: ++ { ++ __ load_heap_oop(R17_tos, (RegisterOrConstant)Roffset, Rclass_or_obj); ++ __ verify_oop(R17_tos); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode()) - 1); // Undo bcp increment. ++ ++ __ bind(LisVolatile); ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ load_heap_oop(R17_tos, (RegisterOrConstant)Roffset, Rclass_or_obj); ++ __ verify_oop(R17_tos); ++ __ twi_0(R17_tos); ++ __ isync(); ++ break; ++ } ++ case itos: ++ { ++ __ lwax(R17_tos, Rclass_or_obj, Roffset); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode()) - 1); // Undo bcp increment. ++ ++ __ bind(LisVolatile); ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ lwax(R17_tos, Rclass_or_obj, Roffset); ++ __ twi_0(R17_tos); ++ __ isync(); ++ break; ++ } ++ case ftos: ++ { ++ __ lfsx(F15_ftos, Rclass_or_obj, Roffset); ++ __ dispatch_epilog(state, Bytecodes::length_for(bytecode()) - 1); // Undo bcp increment. ++ ++ __ bind(LisVolatile); ++ Label Ldummy; ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { __ fence(); } ++ __ lfsx(F15_ftos, Rclass_or_obj, Roffset); ++ __ fcmpu(CCR0, F15_ftos, F15_ftos); // Acquire by cmp-br-isync. ++ __ bne_predict_not_taken(CCR0, Ldummy); ++ __ bind(Ldummy); ++ __ isync(); ++ break; ++ } ++ default: ShouldNotReachHere(); ++ } ++ __ addi(R14_bcp, R14_bcp, -1); ++} ++ ++// ============================================================================ ++// Calls ++ ++// Common code for invoke ++// ++// Input: ++// - byte_no ++// ++// Output: ++// - Rmethod: The method to invoke next. ++// - Rret_addr: The return address to return to. ++// - Rindex: MethodType (invokehandle) or CallSite obj (invokedynamic) ++// - Rrecv: Cache for "this" pointer, might be noreg if static call. ++// - Rflags: Method flags from const pool cache. ++// ++// Kills: ++// - Rscratch1 ++// ++void TemplateTable::prepare_invoke(int byte_no, ++ Register Rmethod, // linked method (or i-klass) ++ Register Rret_addr,// return address ++ Register Rindex, // itable index, MethodType, etc. ++ Register Rrecv, // If caller wants to see it. ++ Register Rflags, // If caller wants to test it. ++ Register Rscratch ++ ) { ++ // Determine flags. ++ const Bytecodes::Code code = bytecode(); ++ const bool is_invokeinterface = code == Bytecodes::_invokeinterface; ++ const bool is_invokedynamic = code == Bytecodes::_invokedynamic; ++ const bool is_invokehandle = code == Bytecodes::_invokehandle; ++ const bool is_invokevirtual = code == Bytecodes::_invokevirtual; ++ const bool is_invokespecial = code == Bytecodes::_invokespecial; ++ const bool load_receiver = (Rrecv != noreg); ++ assert(load_receiver == (code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic), ""); ++ ++ assert_different_registers(Rmethod, Rindex, Rflags, Rscratch); ++ assert_different_registers(Rmethod, Rrecv, Rflags, Rscratch); ++ assert_different_registers(Rret_addr, Rscratch); ++ ++ load_invoke_cp_cache_entry(byte_no, Rmethod, Rindex, Rflags, is_invokevirtual, false, is_invokedynamic); ++ ++ // Saving of SP done in call_from_interpreter. ++ ++ // Maybe push "appendix" to arguments. ++ if (is_invokedynamic || is_invokehandle) { ++ Label Ldone; ++ __ rldicl_(R0, Rflags, 64-ConstantPoolCacheEntry::has_appendix_shift, 63); ++ __ beq(CCR0, Ldone); ++ // Push "appendix" (MethodType, CallSite, etc.). ++ // This must be done before we get the receiver, ++ // since the parameter_size includes it. ++ __ load_resolved_reference_at_index(Rscratch, Rindex); ++ __ verify_oop(Rscratch); ++ __ push_ptr(Rscratch); ++ __ bind(Ldone); ++ } ++ ++ // Load receiver if needed (after appendix is pushed so parameter size is correct). ++ if (load_receiver) { ++ const Register Rparam_count = Rscratch; ++ __ andi(Rparam_count, Rflags, ConstantPoolCacheEntry::parameter_size_mask); ++ __ load_receiver(Rparam_count, Rrecv); ++ __ verify_oop(Rrecv); ++ } ++ ++ // Get return address. ++ { ++ Register Rtable_addr = Rscratch; ++ Register Rret_type = Rret_addr; ++ address table_addr = (address) Interpreter::invoke_return_entry_table_for(code); ++ ++ // Get return type. It's coded into the upper 4 bits of the lower half of the 64 bit value. ++ __ rldicl(Rret_type, Rflags, 64-ConstantPoolCacheEntry::tos_state_shift, 64-ConstantPoolCacheEntry::tos_state_bits); ++ __ load_dispatch_table(Rtable_addr, (address*)table_addr); ++ __ sldi(Rret_type, Rret_type, LogBytesPerWord); ++ // Get return address. ++ __ ldx(Rret_addr, Rtable_addr, Rret_type); ++ } ++} ++ ++// Helper for virtual calls. Load target out of vtable and jump off! ++// Kills all passed registers. ++void TemplateTable::generate_vtable_call(Register Rrecv_klass, Register Rindex, Register Rret, Register Rtemp) { ++ ++ assert_different_registers(Rrecv_klass, Rtemp, Rret); ++ const Register Rtarget_method = Rindex; ++ ++ // Get target method & entry point. ++ const int base = InstanceKlass::vtable_start_offset() * wordSize; ++ // Calc vtable addr scale the vtable index by 8. ++ __ sldi(Rindex, Rindex, exact_log2(vtableEntry::size() * wordSize)); ++ // Load target. ++ __ addi(Rrecv_klass, Rrecv_klass, base + vtableEntry::method_offset_in_bytes()); ++ __ ldx(Rtarget_method, Rindex, Rrecv_klass); ++ __ call_from_interpreter(Rtarget_method, Rret, Rrecv_klass /* scratch1 */, Rtemp /* scratch2 */); ++} ++ ++// Virtual or final call. Final calls are rewritten on the fly to run through "fast_finalcall" next time. ++void TemplateTable::invokevirtual(int byte_no) { ++ transition(vtos, vtos); ++ ++ Register Rtable_addr = R11_scratch1, ++ Rret_type = R12_scratch2, ++ Rret_addr = R5_ARG3, ++ Rflags = R22_tmp2, // Should survive C call. ++ Rrecv = R3_ARG1, ++ Rrecv_klass = Rrecv, ++ Rvtableindex_or_method = R31, // Should survive C call. ++ Rnum_params = R4_ARG2, ++ Rnew_bc = R6_ARG4; ++ ++ Label LnotFinal; ++ ++ load_invoke_cp_cache_entry(byte_no, Rvtableindex_or_method, noreg, Rflags, /*virtual*/ true, false, false); ++ ++ __ testbitdi(CCR0, R0, Rflags, ConstantPoolCacheEntry::is_vfinal_shift); ++ __ bfalse(CCR0, LnotFinal); ++ ++ patch_bytecode(Bytecodes::_fast_invokevfinal, Rnew_bc, R12_scratch2); ++ invokevfinal_helper(Rvtableindex_or_method, Rflags, R11_scratch1, R12_scratch2); ++ ++ __ align(32, 12); ++ __ bind(LnotFinal); ++ // Load "this" pointer (receiver). ++ __ rldicl(Rnum_params, Rflags, 64, 48); ++ __ load_receiver(Rnum_params, Rrecv); ++ __ verify_oop(Rrecv); ++ ++ // Get return type. It's coded into the upper 4 bits of the lower half of the 64 bit value. ++ __ rldicl(Rret_type, Rflags, 64-ConstantPoolCacheEntry::tos_state_shift, 64-ConstantPoolCacheEntry::tos_state_bits); ++ __ load_dispatch_table(Rtable_addr, Interpreter::invoke_return_entry_table()); ++ __ sldi(Rret_type, Rret_type, LogBytesPerWord); ++ __ ldx(Rret_addr, Rret_type, Rtable_addr); ++ __ null_check_throw(Rrecv, oopDesc::klass_offset_in_bytes(), R11_scratch1); ++ __ load_klass(Rrecv_klass, Rrecv); ++ __ verify_klass_ptr(Rrecv_klass); ++ __ profile_virtual_call(Rrecv_klass, R11_scratch1, R12_scratch2, false); ++ ++ generate_vtable_call(Rrecv_klass, Rvtableindex_or_method, Rret_addr, R11_scratch1); ++} ++ ++void TemplateTable::fast_invokevfinal(int byte_no) { ++ transition(vtos, vtos); ++ ++ assert(byte_no == f2_byte, "use this argument"); ++ Register Rflags = R22_tmp2, ++ Rmethod = R31; ++ load_invoke_cp_cache_entry(byte_no, Rmethod, noreg, Rflags, /*virtual*/ true, /*is_invokevfinal*/ true, false); ++ invokevfinal_helper(Rmethod, Rflags, R11_scratch1, R12_scratch2); ++} ++ ++void TemplateTable::invokevfinal_helper(Register Rmethod, Register Rflags, Register Rscratch1, Register Rscratch2) { ++ ++ assert_different_registers(Rmethod, Rflags, Rscratch1, Rscratch2); ++ ++ // Load receiver from stack slot. ++ Register Rrecv = Rscratch2; ++ Register Rnum_params = Rrecv; ++ ++ __ ld(Rnum_params, in_bytes(Method::const_offset()), Rmethod); ++ __ lhz(Rnum_params /* number of params */, in_bytes(ConstMethod::size_of_parameters_offset()), Rnum_params); ++ ++ // Get return address. ++ Register Rtable_addr = Rscratch1, ++ Rret_addr = Rflags, ++ Rret_type = Rret_addr; ++ // Get return type. It's coded into the upper 4 bits of the lower half of the 64 bit value. ++ __ rldicl(Rret_type, Rflags, 64-ConstantPoolCacheEntry::tos_state_shift, 64-ConstantPoolCacheEntry::tos_state_bits); ++ __ load_dispatch_table(Rtable_addr, Interpreter::invoke_return_entry_table()); ++ __ sldi(Rret_type, Rret_type, LogBytesPerWord); ++ __ ldx(Rret_addr, Rret_type, Rtable_addr); ++ ++ // Load receiver and receiver NULL check. ++ __ load_receiver(Rnum_params, Rrecv); ++ __ null_check_throw(Rrecv, -1, Rscratch1); ++ ++ __ profile_final_call(Rrecv, Rscratch1); ++ ++ // Do the call. ++ __ call_from_interpreter(Rmethod, Rret_addr, Rscratch1, Rscratch2); ++} ++ ++void TemplateTable::invokespecial(int byte_no) { ++ assert(byte_no == f1_byte, "use this argument"); ++ transition(vtos, vtos); ++ ++ Register Rtable_addr = R3_ARG1, ++ Rret_addr = R4_ARG2, ++ Rflags = R5_ARG3, ++ Rreceiver = R6_ARG4, ++ Rmethod = R31; ++ ++ prepare_invoke(byte_no, Rmethod, Rret_addr, noreg, Rreceiver, Rflags, R11_scratch1); ++ ++ // Receiver NULL check. ++ __ null_check_throw(Rreceiver, -1, R11_scratch1); ++ ++ __ profile_call(R11_scratch1, R12_scratch2); ++ __ call_from_interpreter(Rmethod, Rret_addr, R11_scratch1, R12_scratch2); ++} ++ ++void TemplateTable::invokestatic(int byte_no) { ++ assert(byte_no == f1_byte, "use this argument"); ++ transition(vtos, vtos); ++ ++ Register Rtable_addr = R3_ARG1, ++ Rret_addr = R4_ARG2, ++ Rflags = R5_ARG3; ++ ++ prepare_invoke(byte_no, R19_method, Rret_addr, noreg, noreg, Rflags, R11_scratch1); ++ ++ __ profile_call(R11_scratch1, R12_scratch2); ++ __ call_from_interpreter(R19_method, Rret_addr, R11_scratch1, R12_scratch2); ++} ++ ++void TemplateTable::invokeinterface_object_method(Register Rrecv_klass, ++ Register Rret, ++ Register Rflags, ++ Register Rindex, ++ Register Rtemp1, ++ Register Rtemp2) { ++ ++ assert_different_registers(Rindex, Rret, Rrecv_klass, Rflags, Rtemp1, Rtemp2); ++ Label LnotFinal; ++ ++ // Check for vfinal. ++ __ testbitdi(CCR0, R0, Rflags, ConstantPoolCacheEntry::is_vfinal_shift); ++ __ bfalse(CCR0, LnotFinal); ++ ++ Register Rscratch = Rflags; // Rflags is dead now. ++ ++ // Final call case. ++ __ profile_final_call(Rtemp1, Rscratch); ++ // Do the final call - the index (f2) contains the method. ++ __ call_from_interpreter(Rindex, Rret, Rscratch, Rrecv_klass /* scratch */); ++ ++ // Non-final callc case. ++ __ bind(LnotFinal); ++ __ profile_virtual_call(Rrecv_klass, Rtemp1, Rscratch, false); ++ generate_vtable_call(Rrecv_klass, Rindex, Rret, Rscratch); ++} ++ ++void TemplateTable::invokeinterface(int byte_no) { ++ assert(byte_no == f1_byte, "use this argument"); ++ transition(vtos, vtos); ++ ++ const Register Rscratch1 = R11_scratch1, ++ Rscratch2 = R12_scratch2, ++ Rscratch3 = R9_ARG7, ++ Rscratch4 = R10_ARG8, ++ Rtable_addr = Rscratch2, ++ Rinterface_klass = R5_ARG3, ++ Rret_type = R8_ARG6, ++ Rret_addr = Rret_type, ++ Rindex = R6_ARG4, ++ Rreceiver = R4_ARG2, ++ Rrecv_klass = Rreceiver, ++ Rflags = R7_ARG5; ++ ++ prepare_invoke(byte_no, Rinterface_klass, Rret_addr, Rindex, Rreceiver, Rflags, Rscratch1); ++ ++ // Get receiver klass. ++ __ null_check_throw(Rreceiver, oopDesc::klass_offset_in_bytes(), Rscratch3); ++ __ load_klass(Rrecv_klass, Rreceiver); ++ ++ // Check corner case object method. ++ Label LobjectMethod; ++ ++ __ testbitdi(CCR0, R0, Rflags, ConstantPoolCacheEntry::is_forced_virtual_shift); ++ __ btrue(CCR0, LobjectMethod); ++ ++ // Fallthrough: The normal invokeinterface case. ++ __ profile_virtual_call(Rrecv_klass, Rscratch1, Rscratch2, false); ++ ++ // Find entry point to call. ++ Label Lthrow_icc, Lthrow_ame; ++ // Result will be returned in Rindex. ++ __ mr(Rscratch4, Rrecv_klass); ++ __ mr(Rscratch3, Rindex); ++ __ lookup_interface_method(Rrecv_klass, Rinterface_klass, Rindex, Rindex, Rscratch1, Rscratch2, Lthrow_icc); ++ ++ __ cmpdi(CCR0, Rindex, 0); ++ __ beq(CCR0, Lthrow_ame); ++ // Found entry. Jump off! ++ __ call_from_interpreter(Rindex, Rret_addr, Rscratch1, Rscratch2); ++ ++ // Vtable entry was NULL => Throw abstract method error. ++ __ bind(Lthrow_ame); ++ __ mr(Rrecv_klass, Rscratch4); ++ __ mr(Rindex, Rscratch3); ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); ++ ++ // Interface was not found => Throw incompatible class change error. ++ __ bind(Lthrow_icc); ++ __ mr(Rrecv_klass, Rscratch4); ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); ++ ++ __ should_not_reach_here(); ++ ++ // Special case of invokeinterface called for virtual method of ++ // java.lang.Object. See ConstantPoolCacheEntry::set_method() for details: ++ // The invokeinterface was rewritten to a invokevirtual, hence we have ++ // to handle this corner case. This code isn't produced by javac, but could ++ // be produced by another compliant java compiler. ++ __ bind(LobjectMethod); ++ invokeinterface_object_method(Rrecv_klass, Rret_addr, Rflags, Rindex, Rscratch1, Rscratch2); ++} ++ ++void TemplateTable::invokedynamic(int byte_no) { ++ transition(vtos, vtos); ++ ++ const Register Rret_addr = R3_ARG1, ++ Rflags = R4_ARG2, ++ Rmethod = R22_tmp2, ++ Rscratch1 = R11_scratch1, ++ Rscratch2 = R12_scratch2; ++ ++ if (!EnableInvokeDynamic) { ++ // We should not encounter this bytecode if !EnableInvokeDynamic. ++ // The verifier will stop it. However, if we get past the verifier, ++ // this will stop the thread in a reasonable way, without crashing the JVM. ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); ++ // The call_VM checks for exception, so we should never return here. ++ __ should_not_reach_here(); ++ return; ++ } ++ ++ prepare_invoke(byte_no, Rmethod, Rret_addr, Rscratch1, noreg, Rflags, Rscratch2); ++ ++ // Profile this call. ++ __ profile_call(Rscratch1, Rscratch2); ++ ++ // Off we go. With the new method handles, we don't jump to a method handle ++ // entry any more. Instead, we pushed an "appendix" in prepare invoke, which happens ++ // to be the callsite object the bootstrap method returned. This is passed to a ++ // "link" method which does the dispatch (Most likely just grabs the MH stored ++ // inside the callsite and does an invokehandle). ++ __ call_from_interpreter(Rmethod, Rret_addr, Rscratch1 /* scratch1 */, Rscratch2 /* scratch2 */); ++} ++ ++void TemplateTable::invokehandle(int byte_no) { ++ transition(vtos, vtos); ++ ++ const Register Rret_addr = R3_ARG1, ++ Rflags = R4_ARG2, ++ Rrecv = R5_ARG3, ++ Rmethod = R22_tmp2, ++ Rscratch1 = R11_scratch1, ++ Rscratch2 = R12_scratch2; ++ ++ if (!EnableInvokeDynamic) { ++ // Rewriter does not generate this bytecode. ++ __ should_not_reach_here(); ++ return; ++ } ++ ++ prepare_invoke(byte_no, Rmethod, Rret_addr, Rscratch1, Rrecv, Rflags, Rscratch2); ++ __ verify_method_ptr(Rmethod); ++ __ null_check_throw(Rrecv, -1, Rscratch2); ++ ++ __ profile_final_call(Rrecv, Rscratch1); ++ ++ // Still no call from handle => We call the method handle interpreter here. ++ __ call_from_interpreter(Rmethod, Rret_addr, Rscratch1 /* scratch1 */, Rscratch2 /* scratch2 */); ++} ++ ++// ============================================================================= ++// Allocation ++ ++// Puts allocated obj ref onto the expression stack. ++void TemplateTable::_new() { ++ transition(vtos, atos); ++ ++ Label Lslow_case, ++ Ldone, ++ Linitialize_header, ++ Lallocate_shared, ++ Linitialize_object; // Including clearing the fields. ++ ++ const Register RallocatedObject = R17_tos, ++ RinstanceKlass = R9_ARG7, ++ Rscratch = R11_scratch1, ++ Roffset = R8_ARG6, ++ Rinstance_size = Roffset, ++ Rcpool = R4_ARG2, ++ Rtags = R3_ARG1, ++ Rindex = R5_ARG3; ++ ++ const bool allow_shared_alloc = Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode; ++ ++ // -------------------------------------------------------------------------- ++ // Check if fast case is possible. ++ ++ // Load pointers to const pool and const pool's tags array. ++ __ get_cpool_and_tags(Rcpool, Rtags); ++ // Load index of constant pool entry. ++ __ get_2_byte_integer_at_bcp(1, Rindex, InterpreterMacroAssembler::Unsigned); ++ ++ if (UseTLAB) { ++ // Make sure the class we're about to instantiate has been resolved ++ // This is done before loading instanceKlass to be consistent with the order ++ // how Constant Pool is updated (see ConstantPoolCache::klass_at_put). ++ __ addi(Rtags, Rtags, Array::base_offset_in_bytes()); ++ __ lbzx(Rtags, Rindex, Rtags); ++ ++ __ cmpdi(CCR0, Rtags, JVM_CONSTANT_Class); ++ __ bne(CCR0, Lslow_case); ++ ++ // Get instanceKlass (load from Rcpool + sizeof(ConstantPool) + Rindex*BytesPerWord). ++ __ sldi(Roffset, Rindex, LogBytesPerWord); ++ __ addi(Rscratch, Rcpool, sizeof(ConstantPool)); ++ __ isync(); // Order load of instance Klass wrt. tags. ++ __ ldx(RinstanceKlass, Roffset, Rscratch); ++ ++ // Make sure klass is fully initialized and get instance_size. ++ __ lbz(Rscratch, in_bytes(InstanceKlass::init_state_offset()), RinstanceKlass); ++ __ lwz(Rinstance_size, in_bytes(Klass::layout_helper_offset()), RinstanceKlass); ++ ++ __ cmpdi(CCR1, Rscratch, InstanceKlass::fully_initialized); ++ // Make sure klass does not have has_finalizer, or is abstract, or interface or java/lang/Class. ++ __ andi_(R0, Rinstance_size, Klass::_lh_instance_slow_path_bit); // slow path bit equals 0? ++ ++ __ crnand(/*CR0 eq*/2, /*CR1 eq*/4+2, /*CR0 eq*/2); // slow path bit set or not fully initialized? ++ __ beq(CCR0, Lslow_case); ++ ++ // -------------------------------------------------------------------------- ++ // Fast case: ++ // Allocate the instance. ++ // 1) Try to allocate in the TLAB. ++ // 2) If fail, and the TLAB is not full enough to discard, allocate in the shared Eden. ++ // 3) If the above fails (or is not applicable), go to a slow case (creates a new TLAB, etc.). ++ ++ Register RoldTopValue = RallocatedObject; // Object will be allocated here if it fits. ++ Register RnewTopValue = R6_ARG4; ++ Register RendValue = R7_ARG5; ++ ++ // Check if we can allocate in the TLAB. ++ __ ld(RoldTopValue, in_bytes(JavaThread::tlab_top_offset()), R16_thread); ++ __ ld(RendValue, in_bytes(JavaThread::tlab_end_offset()), R16_thread); ++ ++ __ add(RnewTopValue, Rinstance_size, RoldTopValue); ++ ++ // If there is enough space, we do not CAS and do not clear. ++ __ cmpld(CCR0, RnewTopValue, RendValue); ++ __ bgt(CCR0, allow_shared_alloc ? Lallocate_shared : Lslow_case); ++ ++ __ std(RnewTopValue, in_bytes(JavaThread::tlab_top_offset()), R16_thread); ++ ++ if (ZeroTLAB) { ++ // The fields have already been cleared. ++ __ b(Linitialize_header); ++ } else { ++ // Initialize both the header and fields. ++ __ b(Linitialize_object); ++ } ++ ++ // Fall through: TLAB was too small. ++ if (allow_shared_alloc) { ++ Register RtlabWasteLimitValue = R10_ARG8; ++ Register RfreeValue = RnewTopValue; ++ ++ __ bind(Lallocate_shared); ++ // Check if tlab should be discarded (refill_waste_limit >= free). ++ __ ld(RtlabWasteLimitValue, in_bytes(JavaThread::tlab_refill_waste_limit_offset()), R16_thread); ++ __ subf(RfreeValue, RoldTopValue, RendValue); ++ __ srdi(RfreeValue, RfreeValue, LogHeapWordSize); // in dwords ++ __ cmpld(CCR0, RtlabWasteLimitValue, RfreeValue); ++ __ bge(CCR0, Lslow_case); ++ ++ // Increment waste limit to prevent getting stuck on this slow path. ++ __ addi(RtlabWasteLimitValue, RtlabWasteLimitValue, (int)ThreadLocalAllocBuffer::refill_waste_limit_increment()); ++ __ std(RtlabWasteLimitValue, in_bytes(JavaThread::tlab_refill_waste_limit_offset()), R16_thread); ++ } ++ // else: No allocation in the shared eden. // fallthru: __ b(Lslow_case); ++ } ++ // else: Always go the slow path. ++ ++ // -------------------------------------------------------------------------- ++ // slow case ++ __ bind(Lslow_case); ++ call_VM(R17_tos, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), Rcpool, Rindex); ++ ++ if (UseTLAB) { ++ __ b(Ldone); ++ // -------------------------------------------------------------------------- ++ // Init1: Zero out newly allocated memory. ++ ++ if (!ZeroTLAB || allow_shared_alloc) { ++ // Clear object fields. ++ __ bind(Linitialize_object); ++ ++ // Initialize remaining object fields. ++ Register Rbase = Rtags; ++ __ addi(Rinstance_size, Rinstance_size, 7 - (int)sizeof(oopDesc)); ++ __ addi(Rbase, RallocatedObject, sizeof(oopDesc)); ++ __ srdi(Rinstance_size, Rinstance_size, 3); ++ ++ // Clear out object skipping header. Takes also care of the zero length case. ++ __ clear_memory_doubleword(Rbase, Rinstance_size); ++ // fallthru: __ b(Linitialize_header); ++ } ++ ++ // -------------------------------------------------------------------------- ++ // Init2: Initialize the header: mark, klass ++ __ bind(Linitialize_header); ++ ++ // Init mark. ++ if (UseBiasedLocking) { ++ __ ld(Rscratch, in_bytes(Klass::prototype_header_offset()), RinstanceKlass); ++ } else { ++ __ load_const_optimized(Rscratch, markOopDesc::prototype(), R0); ++ } ++ __ std(Rscratch, oopDesc::mark_offset_in_bytes(), RallocatedObject); ++ ++ // Init klass. ++ __ store_klass_gap(RallocatedObject); ++ __ store_klass(RallocatedObject, RinstanceKlass, Rscratch); // klass (last for cms) ++ ++ // Check and trigger dtrace event. ++ { ++ SkipIfEqualZero skip_if(_masm, Rscratch, &DTraceAllocProbes); ++ __ push(atos); ++ __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc)); ++ __ pop(atos); ++ } ++ } ++ ++ // continue ++ __ bind(Ldone); ++ ++ // Must prevent reordering of stores for object initialization with stores that publish the new object. ++ __ membar(Assembler::StoreStore); ++} ++ ++void TemplateTable::newarray() { ++ transition(itos, atos); ++ ++ __ lbz(R4, 1, R14_bcp); ++ __ extsw(R5, R17_tos); ++ call_VM(R17_tos, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray), R4, R5 /* size */); ++ ++ // Must prevent reordering of stores for object initialization with stores that publish the new object. ++ __ membar(Assembler::StoreStore); ++} ++ ++void TemplateTable::anewarray() { ++ transition(itos, atos); ++ ++ __ get_constant_pool(R4); ++ __ get_2_byte_integer_at_bcp(1, R5, InterpreterMacroAssembler::Unsigned); ++ __ extsw(R6, R17_tos); // size ++ call_VM(R17_tos, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray), R4 /* pool */, R5 /* index */, R6 /* size */); ++ ++ // Must prevent reordering of stores for object initialization with stores that publish the new object. ++ __ membar(Assembler::StoreStore); ++} ++ ++// Allocate a multi dimensional array ++void TemplateTable::multianewarray() { ++ transition(vtos, atos); ++ ++ Register Rptr = R31; // Needs to survive C call. ++ ++ // Put ndims * wordSize into frame temp slot ++ __ lbz(Rptr, 3, R14_bcp); ++ __ sldi(Rptr, Rptr, Interpreter::logStackElementSize); ++ // Esp points past last_dim, so set to R4 to first_dim address. ++ __ add(R4, Rptr, R15_esp); ++ call_VM(R17_tos, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), R4 /* first_size_address */); ++ // Pop all dimensions off the stack. ++ __ add(R15_esp, Rptr, R15_esp); ++ ++ // Must prevent reordering of stores for object initialization with stores that publish the new object. ++ __ membar(Assembler::StoreStore); ++} ++ ++void TemplateTable::arraylength() { ++ transition(atos, itos); ++ ++ Label LnoException; ++ __ verify_oop(R17_tos); ++ __ null_check_throw(R17_tos, arrayOopDesc::length_offset_in_bytes(), R11_scratch1); ++ __ lwa(R17_tos, arrayOopDesc::length_offset_in_bytes(), R17_tos); ++} ++ ++// ============================================================================ ++// Typechecks ++ ++void TemplateTable::checkcast() { ++ transition(atos, atos); ++ ++ Label Ldone, Lis_null, Lquicked, Lresolved; ++ Register Roffset = R6_ARG4, ++ RobjKlass = R4_ARG2, ++ RspecifiedKlass = R5_ARG3, // Generate_ClassCastException_verbose_handler will read value from this register. ++ Rcpool = R11_scratch1, ++ Rtags = R12_scratch2; ++ ++ // Null does not pass. ++ __ cmpdi(CCR0, R17_tos, 0); ++ __ beq(CCR0, Lis_null); ++ ++ // Get constant pool tag to find out if the bytecode has already been "quickened". ++ __ get_cpool_and_tags(Rcpool, Rtags); ++ ++ __ get_2_byte_integer_at_bcp(1, Roffset, InterpreterMacroAssembler::Unsigned); ++ ++ __ addi(Rtags, Rtags, Array::base_offset_in_bytes()); ++ __ lbzx(Rtags, Rtags, Roffset); ++ ++ __ cmpdi(CCR0, Rtags, JVM_CONSTANT_Class); ++ __ beq(CCR0, Lquicked); ++ ++ // Call into the VM to "quicken" instanceof. ++ __ push_ptr(); // for GC ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)); ++ __ get_vm_result_2(RspecifiedKlass); ++ __ pop_ptr(); // Restore receiver. ++ __ b(Lresolved); ++ ++ // Extract target class from constant pool. ++ __ bind(Lquicked); ++ __ sldi(Roffset, Roffset, LogBytesPerWord); ++ __ addi(Rcpool, Rcpool, sizeof(ConstantPool)); ++ __ isync(); // Order load of specified Klass wrt. tags. ++ __ ldx(RspecifiedKlass, Rcpool, Roffset); ++ ++ // Do the checkcast. ++ __ bind(Lresolved); ++ // Get value klass in RobjKlass. ++ __ load_klass(RobjKlass, R17_tos); ++ // Generate a fast subtype check. Branch to cast_ok if no failure. Return 0 if failure. ++ __ gen_subtype_check(RobjKlass, RspecifiedKlass, /*3 temp regs*/ Roffset, Rcpool, Rtags, /*target if subtype*/ Ldone); ++ ++ // Not a subtype; so must throw exception ++ // Target class oop is in register R6_ARG4 == RspecifiedKlass by convention. ++ __ load_dispatch_table(R11_scratch1, (address*)Interpreter::_throw_ClassCastException_entry); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++ ++ // Profile the null case. ++ __ align(32, 12); ++ __ bind(Lis_null); ++ __ profile_null_seen(R11_scratch1, Rtags); // Rtags used as scratch. ++ ++ __ align(32, 12); ++ __ bind(Ldone); ++} ++ ++// Output: ++// - tos == 0: Obj was null or not an instance of class. ++// - tos == 1: Obj was an instance of class. ++void TemplateTable::instanceof() { ++ transition(atos, itos); ++ ++ Label Ldone, Lis_null, Lquicked, Lresolved; ++ Register Roffset = R5_ARG3, ++ RobjKlass = R4_ARG2, ++ RspecifiedKlass = R6_ARG4, // Generate_ClassCastException_verbose_handler will expect the value in this register. ++ Rcpool = R11_scratch1, ++ Rtags = R12_scratch2; ++ ++ // Null does not pass. ++ __ cmpdi(CCR0, R17_tos, 0); ++ __ beq(CCR0, Lis_null); ++ ++ // Get constant pool tag to find out if the bytecode has already been "quickened". ++ __ get_cpool_and_tags(Rcpool, Rtags); ++ ++ __ get_2_byte_integer_at_bcp(1, Roffset, InterpreterMacroAssembler::Unsigned); ++ ++ __ addi(Rtags, Rtags, Array::base_offset_in_bytes()); ++ __ lbzx(Rtags, Rtags, Roffset); ++ ++ __ cmpdi(CCR0, Rtags, JVM_CONSTANT_Class); ++ __ beq(CCR0, Lquicked); ++ ++ // Call into the VM to "quicken" instanceof. ++ __ push_ptr(); // for GC ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)); ++ __ get_vm_result_2(RspecifiedKlass); ++ __ pop_ptr(); // Restore receiver. ++ __ b(Lresolved); ++ ++ // Extract target class from constant pool. ++ __ bind(Lquicked); ++ __ sldi(Roffset, Roffset, LogBytesPerWord); ++ __ addi(Rcpool, Rcpool, sizeof(ConstantPool)); ++ __ isync(); // Order load of specified Klass wrt. tags. ++ __ ldx(RspecifiedKlass, Rcpool, Roffset); ++ ++ // Do the checkcast. ++ __ bind(Lresolved); ++ // Get value klass in RobjKlass. ++ __ load_klass(RobjKlass, R17_tos); ++ // Generate a fast subtype check. Branch to cast_ok if no failure. Return 0 if failure. ++ __ li(R17_tos, 1); ++ __ gen_subtype_check(RobjKlass, RspecifiedKlass, /*3 temp regs*/ Roffset, Rcpool, Rtags, /*target if subtype*/ Ldone); ++ __ li(R17_tos, 0); ++ ++ if (ProfileInterpreter) { ++ __ b(Ldone); ++ } ++ ++ // Profile the null case. ++ __ align(32, 12); ++ __ bind(Lis_null); ++ __ profile_null_seen(Rcpool, Rtags); // Rcpool and Rtags used as scratch. ++ ++ __ align(32, 12); ++ __ bind(Ldone); ++} ++ ++// ============================================================================= ++// Breakpoints ++ ++void TemplateTable::_breakpoint() { ++ transition(vtos, vtos); ++ ++ // Get the unpatched byte code. ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::get_original_bytecode_at), R19_method, R14_bcp); ++ __ mr(R31, R3_RET); ++ ++ // Post the breakpoint event. ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint), R19_method, R14_bcp); ++ ++ // Complete the execution of original bytecode. ++ __ dispatch_Lbyte_code(vtos, R31, Interpreter::normal_table(vtos)); ++} ++ ++// ============================================================================= ++// Exceptions ++ ++void TemplateTable::athrow() { ++ transition(atos, vtos); ++ ++ // Exception oop is in tos ++ __ verify_oop(R17_tos); ++ ++ __ null_check_throw(R17_tos, -1, R11_scratch1); ++ ++ // Throw exception interpreter entry expects exception oop to be in R3. ++ __ mr(R3_RET, R17_tos); ++ __ load_dispatch_table(R11_scratch1, (address*)Interpreter::throw_exception_entry()); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++} ++ ++// ============================================================================= ++// Synchronization ++// Searches the basic object lock list on the stack for a free slot ++// and uses it to lock the obect in tos. ++// ++// Recursive locking is enabled by exiting the search if the same ++// object is already found in the list. Thus, a new basic lock obj lock ++// is allocated "higher up" in the stack and thus is found first ++// at next monitor exit. ++void TemplateTable::monitorenter() { ++ transition(atos, vtos); ++ ++ __ verify_oop(R17_tos); ++ ++ Register Rcurrent_monitor = R11_scratch1, ++ Rcurrent_obj = R12_scratch2, ++ Robj_to_lock = R17_tos, ++ Rscratch1 = R3_ARG1, ++ Rscratch2 = R4_ARG2, ++ Rscratch3 = R5_ARG3, ++ Rcurrent_obj_addr = R6_ARG4; ++ ++ // ------------------------------------------------------------------------------ ++ // Null pointer exception. ++ __ null_check_throw(Robj_to_lock, -1, R11_scratch1); ++ ++ // Try to acquire a lock on the object. ++ // Repeat until succeeded (i.e., until monitorenter returns true). ++ ++ // ------------------------------------------------------------------------------ ++ // Find a free slot in the monitor block. ++ Label Lfound, Lexit, Lallocate_new; ++ ConditionRegister found_free_slot = CCR0, ++ found_same_obj = CCR1, ++ reached_limit = CCR6; ++ { ++ Label Lloop, Lentry; ++ Register Rlimit = Rcurrent_monitor; ++ ++ // Set up search loop - start with topmost monitor. ++ __ add(Rcurrent_obj_addr, BasicObjectLock::obj_offset_in_bytes(), R26_monitor); ++ ++ __ ld(Rlimit, 0, R1_SP); ++ __ addi(Rlimit, Rlimit, - (frame::ijava_state_size + frame::interpreter_frame_monitor_size_in_bytes() - BasicObjectLock::obj_offset_in_bytes())); // Monitor base ++ ++ // Check if any slot is present => short cut to allocation if not. ++ __ cmpld(reached_limit, Rcurrent_obj_addr, Rlimit); ++ __ bgt(reached_limit, Lallocate_new); ++ ++ // Pre-load topmost slot. ++ __ ld(Rcurrent_obj, 0, Rcurrent_obj_addr); ++ __ addi(Rcurrent_obj_addr, Rcurrent_obj_addr, frame::interpreter_frame_monitor_size() * wordSize); ++ // The search loop. ++ __ bind(Lloop); ++ // Found free slot? ++ __ cmpdi(found_free_slot, Rcurrent_obj, 0); ++ // Is this entry for same obj? If so, stop the search and take the found ++ // free slot or allocate a new one to enable recursive locking. ++ __ cmpd(found_same_obj, Rcurrent_obj, Robj_to_lock); ++ __ cmpld(reached_limit, Rcurrent_obj_addr, Rlimit); ++ __ beq(found_free_slot, Lexit); ++ __ beq(found_same_obj, Lallocate_new); ++ __ bgt(reached_limit, Lallocate_new); ++ // Check if last allocated BasicLockObj reached. ++ __ ld(Rcurrent_obj, 0, Rcurrent_obj_addr); ++ __ addi(Rcurrent_obj_addr, Rcurrent_obj_addr, frame::interpreter_frame_monitor_size() * wordSize); ++ // Next iteration if unchecked BasicObjectLocks exist on the stack. ++ __ b(Lloop); ++ } ++ ++ // ------------------------------------------------------------------------------ ++ // Check if we found a free slot. ++ __ bind(Lexit); ++ ++ __ addi(Rcurrent_monitor, Rcurrent_obj_addr, -(frame::interpreter_frame_monitor_size() * wordSize) - BasicObjectLock::obj_offset_in_bytes()); ++ __ addi(Rcurrent_obj_addr, Rcurrent_obj_addr, - frame::interpreter_frame_monitor_size() * wordSize); ++ __ b(Lfound); ++ ++ // We didn't find a free BasicObjLock => allocate one. ++ __ align(32, 12); ++ __ bind(Lallocate_new); ++ __ add_monitor_to_stack(false, Rscratch1, Rscratch2); ++ __ mr(Rcurrent_monitor, R26_monitor); ++ __ addi(Rcurrent_obj_addr, R26_monitor, BasicObjectLock::obj_offset_in_bytes()); ++ ++ // ------------------------------------------------------------------------------ ++ // We now have a slot to lock. ++ __ bind(Lfound); ++ ++ // Increment bcp to point to the next bytecode, so exception handling for async. exceptions work correctly. ++ // The object has already been poped from the stack, so the expression stack looks correct. ++ __ addi(R14_bcp, R14_bcp, 1); ++ ++ __ std(Robj_to_lock, 0, Rcurrent_obj_addr); ++ __ lock_object(Rcurrent_monitor, Robj_to_lock); ++ ++ // Check if there's enough space on the stack for the monitors after locking. ++ Label Lskip_stack_check; ++ // Optimization: If the monitors stack section is less then a std page size (4K) don't run ++ // the stack check. There should be enough shadow pages to fit that in. ++ __ ld(Rscratch3, 0, R1_SP); ++ __ sub(Rscratch3, Rscratch3, R26_monitor); ++ __ cmpdi(CCR0, Rscratch3, 4*K); ++ __ blt(CCR0, Lskip_stack_check); ++ ++ DEBUG_ONLY(__ untested("stack overflow check during monitor enter");) ++ __ li(Rscratch1, 0); ++ __ generate_stack_overflow_check_with_compare_and_throw(Rscratch1, Rscratch2); ++ ++ __ align(32, 12); ++ __ bind(Lskip_stack_check); ++ ++ // The bcp has already been incremented. Just need to dispatch to next instruction. ++ __ dispatch_next(vtos); ++} ++ ++void TemplateTable::monitorexit() { ++ transition(atos, vtos); ++ __ verify_oop(R17_tos); ++ ++ Register Rcurrent_monitor = R11_scratch1, ++ Rcurrent_obj = R12_scratch2, ++ Robj_to_lock = R17_tos, ++ Rcurrent_obj_addr = R3_ARG1, ++ Rlimit = R4_ARG2; ++ Label Lfound, Lillegal_monitor_state; ++ ++ // Check corner case: unbalanced monitorEnter / Exit. ++ __ ld(Rlimit, 0, R1_SP); ++ __ addi(Rlimit, Rlimit, - (frame::ijava_state_size + frame::interpreter_frame_monitor_size_in_bytes())); // Monitor base ++ ++ // Null pointer check. ++ __ null_check_throw(Robj_to_lock, -1, R11_scratch1); ++ ++ __ cmpld(CCR0, R26_monitor, Rlimit); ++ __ bgt(CCR0, Lillegal_monitor_state); ++ ++ // Find the corresponding slot in the monitors stack section. ++ { ++ Label Lloop; ++ ++ // Start with topmost monitor. ++ __ addi(Rcurrent_obj_addr, R26_monitor, BasicObjectLock::obj_offset_in_bytes()); ++ __ addi(Rlimit, Rlimit, BasicObjectLock::obj_offset_in_bytes()); ++ __ ld(Rcurrent_obj, 0, Rcurrent_obj_addr); ++ __ addi(Rcurrent_obj_addr, Rcurrent_obj_addr, frame::interpreter_frame_monitor_size() * wordSize); ++ ++ __ bind(Lloop); ++ // Is this entry for same obj? ++ __ cmpd(CCR0, Rcurrent_obj, Robj_to_lock); ++ __ beq(CCR0, Lfound); ++ ++ // Check if last allocated BasicLockObj reached. ++ ++ __ ld(Rcurrent_obj, 0, Rcurrent_obj_addr); ++ __ cmpld(CCR0, Rcurrent_obj_addr, Rlimit); ++ __ addi(Rcurrent_obj_addr, Rcurrent_obj_addr, frame::interpreter_frame_monitor_size() * wordSize); ++ ++ // Next iteration if unchecked BasicObjectLocks exist on the stack. ++ __ ble(CCR0, Lloop); ++ } ++ ++ // Fell through without finding the basic obj lock => throw up! ++ __ bind(Lillegal_monitor_state); ++ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception)); ++ __ should_not_reach_here(); ++ ++ __ align(32, 12); ++ __ bind(Lfound); ++ __ addi(Rcurrent_monitor, Rcurrent_obj_addr, ++ -(frame::interpreter_frame_monitor_size() * wordSize) - BasicObjectLock::obj_offset_in_bytes()); ++ __ unlock_object(Rcurrent_monitor); ++} ++ ++// ============================================================================ ++// Wide bytecodes ++ ++// Wide instructions. Simply redirects to the wide entry point for that instruction. ++void TemplateTable::wide() { ++ transition(vtos, vtos); ++ ++ const Register Rtable = R11_scratch1, ++ Rindex = R12_scratch2, ++ Rtmp = R0; ++ ++ __ lbz(Rindex, 1, R14_bcp); ++ ++ __ load_dispatch_table(Rtable, Interpreter::_wentry_point); ++ ++ __ slwi(Rindex, Rindex, LogBytesPerWord); ++ __ ldx(Rtmp, Rtable, Rindex); ++ __ mtctr(Rtmp); ++ __ bctr(); ++ // Note: the bcp increment step is part of the individual wide bytecode implementations. ++} ++#endif // !CC_INTERP +--- ./hotspot/src/cpu/ppc/vm/templateTable_ppc_64.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/templateTable_ppc_64.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,38 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013, 2014 SAP AG. 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 CPU_PPC_VM_TEMPLATETABLE_PPC_64_HPP ++#define CPU_PPC_VM_TEMPLATETABLE_PPC_64_HPP ++ ++ static void prepare_invoke(int byte_no, Register Rmethod, Register Rret_addr, Register Rindex, Register Rrecv, Register Rflags, Register Rscratch); ++ static void invokevfinal_helper(Register Rmethod, Register Rflags, Register Rscratch1, Register Rscratch2); ++ static void generate_vtable_call(Register Rrecv_klass, Register Rindex, Register Rret, Register Rtemp); ++ static void invokeinterface_object_method(Register Rrecv_klass, Register Rret, Register Rflags, Register Rindex, Register Rtemp, Register Rtemp2); ++ ++ // Branch_conditional which takes TemplateTable::Condition. ++ static void branch_conditional(ConditionRegister crx, TemplateTable::Condition cc, Label& L, bool invert = false); ++ static void if_cmp_common(Register Rfirst, Register Rsecond, Register Rscratch1, Register Rscratch2, Condition cc, bool is_jint, bool cmp0); ++ ++#endif // CPU_PPC_VM_TEMPLATETABLE_PPC_64_HPP +--- ./hotspot/src/cpu/ppc/vm/vmStructs_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/vmStructs_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_VMSTRUCTS_PPC_HPP ++#define CPU_PPC_VM_VMSTRUCTS_PPC_HPP ++ ++// These are the CPU-specific fields, types and integer ++// constants required by the Serviceability Agent. This file is ++// referenced by vmStructs.cpp. ++ ++#define VM_STRUCTS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) ++ ++#define VM_TYPES_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) ++ ++#define VM_INT_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) ++ ++#define VM_LONG_CONSTANTS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) ++ ++#endif // CPU_PPC_VM_VMSTRUCTS_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,488 @@ ++/* ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/assembler.inline.hpp" ++#include "asm/macroAssembler.inline.hpp" ++#include "compiler/disassembler.hpp" ++#include "memory/resourceArea.hpp" ++#include "runtime/java.hpp" ++#include "runtime/stubCodeGenerator.hpp" ++#include "utilities/defaultStream.hpp" ++#include "vm_version_ppc.hpp" ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif ++#ifdef TARGET_OS_FAMILY_linux ++# include "os_linux.inline.hpp" ++#endif ++ ++# include ++ ++int VM_Version::_features = VM_Version::unknown_m; ++int VM_Version::_measured_cache_line_size = 128; // default value ++const char* VM_Version::_features_str = ""; ++bool VM_Version::_is_determine_features_test_running = false; ++ ++ ++#define MSG(flag) \ ++ if (flag && !FLAG_IS_DEFAULT(flag)) \ ++ jio_fprintf(defaultStream::error_stream(), \ ++ "warning: -XX:+" #flag " requires -XX:+UseSIGTRAP\n" \ ++ " -XX:+" #flag " will be disabled!\n"); ++ ++void VM_Version::initialize() { ++ ++ // Test which instructions are supported and measure cache line size. ++ determine_features(); ++ ++ // If PowerArchitecturePPC64 hasn't been specified explicitly determine from features. ++ if (FLAG_IS_DEFAULT(PowerArchitecturePPC64)) { ++ if (VM_Version::has_popcntw()) { ++ FLAG_SET_ERGO(uintx, PowerArchitecturePPC64, 7); ++ } else if (VM_Version::has_cmpb()) { ++ FLAG_SET_ERGO(uintx, PowerArchitecturePPC64, 6); ++ } else if (VM_Version::has_popcntb()) { ++ FLAG_SET_ERGO(uintx, PowerArchitecturePPC64, 5); ++ } else { ++ FLAG_SET_ERGO(uintx, PowerArchitecturePPC64, 0); ++ } ++ } ++ guarantee(PowerArchitecturePPC64 == 0 || PowerArchitecturePPC64 == 5 || ++ PowerArchitecturePPC64 == 6 || PowerArchitecturePPC64 == 7, ++ "PowerArchitecturePPC64 should be 0, 5, 6 or 7"); ++ ++ if (!UseSIGTRAP) { ++ MSG(TrapBasedICMissChecks); ++ MSG(TrapBasedNotEntrantChecks); ++ MSG(TrapBasedNullChecks); ++ FLAG_SET_ERGO(bool, TrapBasedNotEntrantChecks, false); ++ FLAG_SET_ERGO(bool, TrapBasedNullChecks, false); ++ FLAG_SET_ERGO(bool, TrapBasedICMissChecks, false); ++ } ++ ++#ifdef COMPILER2 ++ if (!UseSIGTRAP) { ++ MSG(TrapBasedRangeChecks); ++ FLAG_SET_ERGO(bool, TrapBasedRangeChecks, false); ++ } ++ ++ // On Power6 test for section size. ++ if (PowerArchitecturePPC64 == 6) { ++ determine_section_size(); ++ // TODO: PPC port } else { ++ // TODO: PPC port PdScheduling::power6SectorSize = 0x20; ++ } ++ ++ MaxVectorSize = 8; ++#endif ++ ++ // Create and print feature-string. ++ char buf[(num_features+1) * 16]; // Max 16 chars per feature. ++ jio_snprintf(buf, sizeof(buf), ++ "ppc64%s%s%s%s%s%s%s%s", ++ (has_fsqrt() ? " fsqrt" : ""), ++ (has_isel() ? " isel" : ""), ++ (has_lxarxeh() ? " lxarxeh" : ""), ++ (has_cmpb() ? " cmpb" : ""), ++ //(has_mftgpr()? " mftgpr" : ""), ++ (has_popcntb() ? " popcntb" : ""), ++ (has_popcntw() ? " popcntw" : ""), ++ (has_fcfids() ? " fcfids" : ""), ++ (has_vand() ? " vand" : "") ++ // Make sure number of %s matches num_features! ++ ); ++ _features_str = strdup(buf); ++ NOT_PRODUCT(if (Verbose) print_features();); ++ ++ // PPC64 supports 8-byte compare-exchange operations (see ++ // Atomic::cmpxchg and StubGenerator::generate_atomic_cmpxchg_ptr) ++ // and 'atomic long memory ops' (see Unsafe_GetLongVolatile). ++ _supports_cx8 = true; ++ ++ UseSSE = 0; // Only on x86 and x64 ++ ++ intx cache_line_size = _measured_cache_line_size; ++ ++ if (FLAG_IS_DEFAULT(AllocatePrefetchStyle)) AllocatePrefetchStyle = 1; ++ ++ if (AllocatePrefetchStyle == 4) { ++ AllocatePrefetchStepSize = cache_line_size; // Need exact value. ++ if (FLAG_IS_DEFAULT(AllocatePrefetchLines)) AllocatePrefetchLines = 12; // Use larger blocks by default. ++ if (AllocatePrefetchDistance < 0) AllocatePrefetchDistance = 2*cache_line_size; // Default is not defined? ++ } else { ++ if (cache_line_size > AllocatePrefetchStepSize) AllocatePrefetchStepSize = cache_line_size; ++ if (FLAG_IS_DEFAULT(AllocatePrefetchLines)) AllocatePrefetchLines = 3; // Optimistic value. ++ if (AllocatePrefetchDistance < 0) AllocatePrefetchDistance = 3*cache_line_size; // Default is not defined? ++ } ++ ++ assert(AllocatePrefetchLines > 0, "invalid value"); ++ if (AllocatePrefetchLines < 1) // Set valid value in product VM. ++ AllocatePrefetchLines = 1; // Conservative value. ++ ++ if (AllocatePrefetchStyle == 3 && AllocatePrefetchDistance < cache_line_size) ++ AllocatePrefetchStyle = 1; // Fall back if inappropriate. ++ ++ assert(AllocatePrefetchStyle >= 0, "AllocatePrefetchStyle should be positive"); ++} ++ ++void VM_Version::print_features() { ++ tty->print_cr("Version: %s cache_line_size = %d", cpu_features(), (int) get_cache_line_size()); ++} ++ ++#ifdef COMPILER2 ++// Determine section size on power6: If section size is 8 instructions, ++// there should be a difference between the two testloops of ~15 %. If ++// no difference is detected the section is assumed to be 32 instructions. ++void VM_Version::determine_section_size() { ++ ++ int unroll = 80; ++ ++ const int code_size = (2* unroll * 32 + 100)*BytesPerInstWord; ++ ++ // Allocate space for the code. ++ ResourceMark rm; ++ CodeBuffer cb("detect_section_size", code_size, 0); ++ MacroAssembler* a = new MacroAssembler(&cb); ++ ++ uint32_t *code = (uint32_t *)a->pc(); ++ // Emit code. ++ void (*test1)() = (void(*)())(void *)a->function_entry(); ++ ++ Label l1; ++ ++ a->li(R4, 1); ++ a->sldi(R4, R4, 28); ++ a->b(l1); ++ a->align(CodeEntryAlignment); ++ ++ a->bind(l1); ++ ++ for (int i = 0; i < unroll; i++) { ++ // Schleife 1 ++ // ------- sector 0 ------------ ++ // ;; 0 ++ a->nop(); // 1 ++ a->fpnop0(); // 2 ++ a->fpnop1(); // 3 ++ a->addi(R4,R4, -1); // 4 ++ ++ // ;; 1 ++ a->nop(); // 5 ++ a->fmr(F6, F6); // 6 ++ a->fmr(F7, F7); // 7 ++ a->endgroup(); // 8 ++ // ------- sector 8 ------------ ++ ++ // ;; 2 ++ a->nop(); // 9 ++ a->nop(); // 10 ++ a->fmr(F8, F8); // 11 ++ a->fmr(F9, F9); // 12 ++ ++ // ;; 3 ++ a->nop(); // 13 ++ a->fmr(F10, F10); // 14 ++ a->fmr(F11, F11); // 15 ++ a->endgroup(); // 16 ++ // -------- sector 16 ------------- ++ ++ // ;; 4 ++ a->nop(); // 17 ++ a->nop(); // 18 ++ a->fmr(F15, F15); // 19 ++ a->fmr(F16, F16); // 20 ++ ++ // ;; 5 ++ a->nop(); // 21 ++ a->fmr(F17, F17); // 22 ++ a->fmr(F18, F18); // 23 ++ a->endgroup(); // 24 ++ // ------- sector 24 ------------ ++ ++ // ;; 6 ++ a->nop(); // 25 ++ a->nop(); // 26 ++ a->fmr(F19, F19); // 27 ++ a->fmr(F20, F20); // 28 ++ ++ // ;; 7 ++ a->nop(); // 29 ++ a->fmr(F21, F21); // 30 ++ a->fmr(F22, F22); // 31 ++ a->brnop0(); // 32 ++ ++ // ------- sector 32 ------------ ++ } ++ ++ // ;; 8 ++ a->cmpdi(CCR0, R4, unroll); // 33 ++ a->bge(CCR0, l1); // 34 ++ a->blr(); ++ ++ // Emit code. ++ void (*test2)() = (void(*)())(void *)a->function_entry(); ++ // uint32_t *code = (uint32_t *)a->pc(); ++ ++ Label l2; ++ ++ a->li(R4, 1); ++ a->sldi(R4, R4, 28); ++ a->b(l2); ++ a->align(CodeEntryAlignment); ++ ++ a->bind(l2); ++ ++ for (int i = 0; i < unroll; i++) { ++ // Schleife 2 ++ // ------- sector 0 ------------ ++ // ;; 0 ++ a->brnop0(); // 1 ++ a->nop(); // 2 ++ //a->cmpdi(CCR0, R4, unroll); ++ a->fpnop0(); // 3 ++ a->fpnop1(); // 4 ++ a->addi(R4,R4, -1); // 5 ++ ++ // ;; 1 ++ ++ a->nop(); // 6 ++ a->fmr(F6, F6); // 7 ++ a->fmr(F7, F7); // 8 ++ // ------- sector 8 --------------- ++ ++ // ;; 2 ++ a->endgroup(); // 9 ++ ++ // ;; 3 ++ a->nop(); // 10 ++ a->nop(); // 11 ++ a->fmr(F8, F8); // 12 ++ ++ // ;; 4 ++ a->fmr(F9, F9); // 13 ++ a->nop(); // 14 ++ a->fmr(F10, F10); // 15 ++ ++ // ;; 5 ++ a->fmr(F11, F11); // 16 ++ // -------- sector 16 ------------- ++ ++ // ;; 6 ++ a->endgroup(); // 17 ++ ++ // ;; 7 ++ a->nop(); // 18 ++ a->nop(); // 19 ++ a->fmr(F15, F15); // 20 ++ ++ // ;; 8 ++ a->fmr(F16, F16); // 21 ++ a->nop(); // 22 ++ a->fmr(F17, F17); // 23 ++ ++ // ;; 9 ++ a->fmr(F18, F18); // 24 ++ // -------- sector 24 ------------- ++ ++ // ;; 10 ++ a->endgroup(); // 25 ++ ++ // ;; 11 ++ a->nop(); // 26 ++ a->nop(); // 27 ++ a->fmr(F19, F19); // 28 ++ ++ // ;; 12 ++ a->fmr(F20, F20); // 29 ++ a->nop(); // 30 ++ a->fmr(F21, F21); // 31 ++ ++ // ;; 13 ++ a->fmr(F22, F22); // 32 ++ } ++ ++ // -------- sector 32 ------------- ++ // ;; 14 ++ a->cmpdi(CCR0, R4, unroll); // 33 ++ a->bge(CCR0, l2); // 34 ++ ++ a->blr(); ++ uint32_t *code_end = (uint32_t *)a->pc(); ++ a->flush(); ++ ++ double loop1_seconds,loop2_seconds, rel_diff; ++ uint64_t start1, stop1; ++ ++ start1 = os::current_thread_cpu_time(false); ++ (*test1)(); ++ stop1 = os::current_thread_cpu_time(false); ++ loop1_seconds = (stop1- start1) / (1000 *1000 *1000.0); ++ ++ ++ start1 = os::current_thread_cpu_time(false); ++ (*test2)(); ++ stop1 = os::current_thread_cpu_time(false); ++ ++ loop2_seconds = (stop1 - start1) / (1000 *1000 *1000.0); ++ ++ rel_diff = (loop2_seconds - loop1_seconds) / loop1_seconds *100; ++ ++ if (PrintAssembly) { ++ ttyLocker ttyl; ++ tty->print_cr("Decoding section size detection stub at " INTPTR_FORMAT " before execution:", code); ++ Disassembler::decode((u_char*)code, (u_char*)code_end, tty); ++ tty->print_cr("Time loop1 :%f", loop1_seconds); ++ tty->print_cr("Time loop2 :%f", loop2_seconds); ++ tty->print_cr("(time2 - time1) / time1 = %f %%", rel_diff); ++ ++ if (rel_diff > 12.0) { ++ tty->print_cr("Section Size 8 Instructions"); ++ } else{ ++ tty->print_cr("Section Size 32 Instructions or Power5"); ++ } ++ } ++ ++#if 0 // TODO: PPC port ++ // Set sector size (if not set explicitly). ++ if (FLAG_IS_DEFAULT(Power6SectorSize128PPC64)) { ++ if (rel_diff > 12.0) { ++ PdScheduling::power6SectorSize = 0x20; ++ } else { ++ PdScheduling::power6SectorSize = 0x80; ++ } ++ } else if (Power6SectorSize128PPC64) { ++ PdScheduling::power6SectorSize = 0x80; ++ } else { ++ PdScheduling::power6SectorSize = 0x20; ++ } ++#endif ++ if (UsePower6SchedulerPPC64) Unimplemented(); ++} ++#endif // COMPILER2 ++ ++void VM_Version::determine_features() { ++#if defined(ABI_ELFv2) ++ const int code_size = (num_features+1+2*7)*BytesPerInstWord; // TODO(asmundak): calculation is incorrect. ++#else ++ // 7 InstWords for each call (function descriptor + blr instruction). ++ const int code_size = (num_features+1+2*7)*BytesPerInstWord; ++#endif ++ int features = 0; ++ ++ // create test area ++ enum { BUFFER_SIZE = 2*4*K }; // Needs to be >=2* max cache line size (cache line size can't exceed min page size). ++ char test_area[BUFFER_SIZE]; ++ char *mid_of_test_area = &test_area[BUFFER_SIZE>>1]; ++ ++ // Allocate space for the code. ++ ResourceMark rm; ++ CodeBuffer cb("detect_cpu_features", code_size, 0); ++ MacroAssembler* a = new MacroAssembler(&cb); ++ ++ // Must be set to true so we can generate the test code. ++ _features = VM_Version::all_features_m; ++ ++ // Emit code. ++ void (*test)(address addr, uint64_t offset)=(void(*)(address addr, uint64_t offset))(void *)a->function_entry(); ++ uint32_t *code = (uint32_t *)a->pc(); ++ // Don't use R0 in ldarx. ++ // Keep R3_ARG1 unmodified, it contains &field (see below). ++ // Keep R4_ARG2 unmodified, it contains offset = 0 (see below). ++ a->fsqrt(F3, F4); // code[0] -> fsqrt_m ++ a->fsqrts(F3, F4); // code[1] -> fsqrts_m ++ a->isel(R7, R5, R6, 0); // code[2] -> isel_m ++ a->ldarx_unchecked(R7, R3_ARG1, R4_ARG2, 1); // code[3] -> lxarx_m ++ a->cmpb(R7, R5, R6); // code[4] -> bcmp ++ //a->mftgpr(R7, F3); // code[5] -> mftgpr ++ a->popcntb(R7, R5); // code[6] -> popcntb ++ a->popcntw(R7, R5); // code[7] -> popcntw ++ a->fcfids(F3, F4); // code[8] -> fcfids ++ a->vand(VR0, VR0, VR0); // code[9] -> vand ++ a->blr(); ++ ++ // Emit function to set one cache line to zero. Emit function descriptor and get pointer to it. ++ void (*zero_cacheline_func_ptr)(char*) = (void(*)(char*))(void *)a->function_entry(); ++ a->dcbz(R3_ARG1); // R3_ARG1 = addr ++ a->blr(); ++ ++ uint32_t *code_end = (uint32_t *)a->pc(); ++ a->flush(); ++ _features = VM_Version::unknown_m; ++ ++ // Print the detection code. ++ if (PrintAssembly) { ++ ttyLocker ttyl; ++ tty->print_cr("Decoding cpu-feature detection stub at " INTPTR_FORMAT " before execution:", code); ++ Disassembler::decode((u_char*)code, (u_char*)code_end, tty); ++ } ++ ++ // Measure cache line size. ++ memset(test_area, 0xFF, BUFFER_SIZE); // Fill test area with 0xFF. ++ (*zero_cacheline_func_ptr)(mid_of_test_area); // Call function which executes dcbz to the middle. ++ int count = 0; // count zeroed bytes ++ for (int i = 0; i < BUFFER_SIZE; i++) if (test_area[i] == 0) count++; ++ guarantee(is_power_of_2(count), "cache line size needs to be a power of 2"); ++ _measured_cache_line_size = count; ++ ++ // Execute code. Illegal instructions will be replaced by 0 in the signal handler. ++ VM_Version::_is_determine_features_test_running = true; ++ (*test)((address)mid_of_test_area, (uint64_t)0); ++ VM_Version::_is_determine_features_test_running = false; ++ ++ // determine which instructions are legal. ++ int feature_cntr = 0; ++ if (code[feature_cntr++]) features |= fsqrt_m; ++ if (code[feature_cntr++]) features |= fsqrts_m; ++ if (code[feature_cntr++]) features |= isel_m; ++ if (code[feature_cntr++]) features |= lxarxeh_m; ++ if (code[feature_cntr++]) features |= cmpb_m; ++ //if(code[feature_cntr++])features |= mftgpr_m; ++ if (code[feature_cntr++]) features |= popcntb_m; ++ if (code[feature_cntr++]) features |= popcntw_m; ++ if (code[feature_cntr++]) features |= fcfids_m; ++ if (code[feature_cntr++]) features |= vand_m; ++ ++ // Print the detection code. ++ if (PrintAssembly) { ++ ttyLocker ttyl; ++ tty->print_cr("Decoding cpu-feature detection stub at " INTPTR_FORMAT " after execution:", code); ++ Disassembler::decode((u_char*)code, (u_char*)code_end, tty); ++ } ++ ++ _features = features; ++} ++ ++ ++static int saved_features = 0; ++ ++void VM_Version::allow_all() { ++ saved_features = _features; ++ _features = all_features_m; ++} ++ ++void VM_Version::revert() { ++ _features = saved_features; ++} +--- ./hotspot/src/cpu/ppc/vm/vm_version_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/vm_version_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,96 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 CPU_PPC_VM_VM_VERSION_PPC_HPP ++#define CPU_PPC_VM_VM_VERSION_PPC_HPP ++ ++#include "runtime/globals_extension.hpp" ++#include "runtime/vm_version.hpp" ++ ++class VM_Version: public Abstract_VM_Version { ++protected: ++ enum Feature_Flag { ++ fsqrt, ++ fsqrts, ++ isel, ++ lxarxeh, ++ cmpb, ++ popcntb, ++ popcntw, ++ fcfids, ++ vand, ++ dcba, ++ num_features // last entry to count features ++ }; ++ enum Feature_Flag_Set { ++ unknown_m = 0, ++ fsqrt_m = (1 << fsqrt ), ++ fsqrts_m = (1 << fsqrts ), ++ isel_m = (1 << isel ), ++ lxarxeh_m = (1 << lxarxeh), ++ cmpb_m = (1 << cmpb ), ++ popcntb_m = (1 << popcntb), ++ popcntw_m = (1 << popcntw), ++ fcfids_m = (1 << fcfids ), ++ vand_m = (1 << vand ), ++ dcba_m = (1 << dcba ), ++ all_features_m = -1 ++ }; ++ static int _features; ++ static int _measured_cache_line_size; ++ static const char* _features_str; ++ static bool _is_determine_features_test_running; ++ ++ static void print_features(); ++ static void determine_features(); // also measures cache line size ++ static void determine_section_size(); ++ static void power6_micro_bench(); ++public: ++ // Initialization ++ static void initialize(); ++ ++ static bool is_determine_features_test_running() { return _is_determine_features_test_running; } ++ // CPU instruction support ++ static bool has_fsqrt() { return (_features & fsqrt_m) != 0; } ++ static bool has_fsqrts() { return (_features & fsqrts_m) != 0; } ++ static bool has_isel() { return (_features & isel_m) != 0; } ++ static bool has_lxarxeh() { return (_features & lxarxeh_m) !=0; } ++ static bool has_cmpb() { return (_features & cmpb_m) != 0; } ++ static bool has_popcntb() { return (_features & popcntb_m) != 0; } ++ static bool has_popcntw() { return (_features & popcntw_m) != 0; } ++ static bool has_fcfids() { return (_features & fcfids_m) != 0; } ++ static bool has_vand() { return (_features & vand_m) != 0; } ++ static bool has_dcba() { return (_features & dcba_m) != 0; } ++ ++ static const char* cpu_features() { return _features_str; } ++ ++ static int get_cache_line_size() { return _measured_cache_line_size; } ++ ++ // Assembler testing ++ static void allow_all(); ++ static void revert(); ++}; ++ ++#endif // CPU_PPC_VM_VM_VERSION_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/vmreg_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/vmreg_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,51 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "asm/assembler.hpp" ++#include "code/vmreg.hpp" ++ ++void VMRegImpl::set_regName() { ++ Register reg = ::as_Register(0); ++ int i; ++ for (i = 0; i < ConcreteRegisterImpl::max_gpr; ) { ++ regName[i++] = reg->name(); ++ regName[i++] = reg->name(); ++ if (reg->encoding() < RegisterImpl::number_of_registers-1) ++ reg = reg->successor(); ++ } ++ ++ FloatRegister freg = ::as_FloatRegister(0); ++ for ( ; i < ConcreteRegisterImpl::max_fpr; ) { ++ regName[i++] = freg->name(); ++ regName[i++] = freg->name(); ++ if (reg->encoding() < FloatRegisterImpl::number_of_registers-1) ++ freg = freg->successor(); ++ } ++ for ( ; i < ConcreteRegisterImpl::number_of_registers; i++) { ++ regName[i] = "NON-GPR-FPR"; ++ } ++} ++ +--- ./hotspot/src/cpu/ppc/vm/vmreg_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/vmreg_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_VMREG_PPC_HPP ++#define CPU_PPC_VM_VMREG_PPC_HPP ++ ++ bool is_Register(); ++ Register as_Register(); ++ ++ bool is_FloatRegister(); ++ FloatRegister as_FloatRegister(); ++ ++#endif // CPU_PPC_VM_VMREG_PPC_HPP +--- ./hotspot/src/cpu/ppc/vm/vmreg_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/vmreg_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,71 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 CPU_PPC_VM_VMREG_PPC_INLINE_HPP ++#define CPU_PPC_VM_VMREG_PPC_INLINE_HPP ++ ++inline VMReg RegisterImpl::as_VMReg() { ++ if (this == noreg) return VMRegImpl::Bad(); ++ return VMRegImpl::as_VMReg(encoding() << 1); ++} ++ ++// Since we don't have two halfs here, don't multiply by 2. ++inline VMReg ConditionRegisterImpl::as_VMReg() { ++ return VMRegImpl::as_VMReg((encoding()) + ConcreteRegisterImpl::max_fpr); ++} ++ ++inline VMReg FloatRegisterImpl::as_VMReg() { ++ return VMRegImpl::as_VMReg((encoding() << 1) + ConcreteRegisterImpl::max_gpr); ++} ++ ++inline VMReg SpecialRegisterImpl::as_VMReg() { ++ return VMRegImpl::as_VMReg((encoding()) + ConcreteRegisterImpl::max_cnd); ++} ++ ++inline bool VMRegImpl::is_Register() { ++ return (unsigned int)value() < (unsigned int)ConcreteRegisterImpl::max_gpr; ++} ++ ++inline bool VMRegImpl::is_FloatRegister() { ++ return value() >= ConcreteRegisterImpl::max_gpr && ++ value() < ConcreteRegisterImpl::max_fpr; ++} ++ ++inline Register VMRegImpl::as_Register() { ++ assert(is_Register() && is_even(value()), "even-aligned GPR name"); ++ return ::as_Register(value()>>1); ++} ++ ++inline FloatRegister VMRegImpl::as_FloatRegister() { ++ assert(is_FloatRegister() && is_even(value()), "must be"); ++ return ::as_FloatRegister((value() - ConcreteRegisterImpl::max_gpr) >> 1); ++} ++ ++inline bool VMRegImpl::is_concrete() { ++ assert(is_reg(), "must be"); ++ return is_even(value()); ++} ++ ++#endif // CPU_PPC_VM_VMREG_PPC_INLINE_HPP +--- ./hotspot/src/cpu/ppc/vm/vtableStubs_ppc_64.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/ppc/vm/vtableStubs_ppc_64.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,268 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "asm/assembler.hpp" ++#include "asm/macroAssembler.inline.hpp" ++#include "code/vtableStubs.hpp" ++#include "interp_masm_ppc_64.hpp" ++#include "memory/resourceArea.hpp" ++#include "oops/instanceKlass.hpp" ++#include "oops/klassVtable.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "vmreg_ppc.inline.hpp" ++#ifdef COMPILER2 ++#include "opto/runtime.hpp" ++#endif ++ ++#define __ masm-> ++ ++#ifdef PRODUCT ++#define BLOCK_COMMENT(str) // nothing ++#else ++#define BLOCK_COMMENT(str) __ block_comment(str) ++#endif ++#define BIND(label) bind(label); BLOCK_COMMENT(#label ":") ++ ++#ifndef PRODUCT ++extern "C" void bad_compiled_vtable_index(JavaThread* thread, oopDesc* receiver, int index); ++#endif ++ ++// Used by compiler only; may use only caller saved, non-argument ++// registers. ++VtableStub* VtableStubs::create_vtable_stub(int vtable_index) { ++ // PPC port: use fixed size. ++ const int code_length = VtableStub::pd_code_size_limit(true); ++ VtableStub* s = new (code_length) VtableStub(true, vtable_index); ++ ResourceMark rm; ++ CodeBuffer cb(s->entry_point(), code_length); ++ MacroAssembler* masm = new MacroAssembler(&cb); ++ address start_pc; ++ ++#ifndef PRODUCT ++ if (CountCompiledCalls) { ++ __ load_const(R11_scratch1, SharedRuntime::nof_megamorphic_calls_addr()); ++ __ lwz(R12_scratch2, 0, R11_scratch1); ++ __ addi(R12_scratch2, R12_scratch2, 1); ++ __ stw(R12_scratch2, 0, R11_scratch1); ++ } ++#endif ++ ++ assert(VtableStub::receiver_location() == R3_ARG1->as_VMReg(), "receiver expected in R3_ARG1"); ++ ++ // Get receiver klass. ++ const Register rcvr_klass = R11_scratch1; ++ ++ // We might implicit NULL fault here. ++ address npe_addr = __ pc(); // npe = null pointer exception ++ __ load_klass_with_trap_null_check(rcvr_klass, R3); ++ ++ // Set method (in case of interpreted method), and destination address. ++ int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size(); ++ ++#ifndef PRODUCT ++ if (DebugVtables) { ++ Label L; ++ // Check offset vs vtable length. ++ const Register vtable_len = R12_scratch2; ++ __ lwz(vtable_len, InstanceKlass::vtable_length_offset()*wordSize, rcvr_klass); ++ __ cmpwi(CCR0, vtable_len, vtable_index*vtableEntry::size()); ++ __ bge(CCR0, L); ++ __ li(R12_scratch2, vtable_index); ++ __ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), R3_ARG1, R12_scratch2, false); ++ __ bind(L); ++ } ++#endif ++ ++ int v_off = entry_offset*wordSize + vtableEntry::method_offset_in_bytes(); ++ ++ __ ld(R19_method, v_off, rcvr_klass); ++ ++#ifndef PRODUCT ++ if (DebugVtables) { ++ Label L; ++ __ cmpdi(CCR0, R19_method, 0); ++ __ bne(CCR0, L); ++ __ stop("Vtable entry is ZERO", 102); ++ __ bind(L); ++ } ++#endif ++ ++ // If the vtable entry is null, the method is abstract. ++ address ame_addr = __ pc(); // ame = abstract method error ++ ++ __ load_with_trap_null_check(R12_scratch2, in_bytes(Method::from_compiled_offset()), R19_method); ++ __ mtctr(R12_scratch2); ++ __ bctr(); ++ masm->flush(); ++ ++ guarantee(__ pc() <= s->code_end(), "overflowed buffer"); ++ ++ s->set_exception_points(npe_addr, ame_addr); ++ ++ return s; ++} ++ ++VtableStub* VtableStubs::create_itable_stub(int vtable_index) { ++ // PPC port: use fixed size. ++ const int code_length = VtableStub::pd_code_size_limit(false); ++ VtableStub* s = new (code_length) VtableStub(false, vtable_index); ++ ResourceMark rm; ++ CodeBuffer cb(s->entry_point(), code_length); ++ MacroAssembler* masm = new MacroAssembler(&cb); ++ address start_pc; ++ ++#ifndef PRODUCT ++ if (CountCompiledCalls) { ++ __ load_const(R11_scratch1, SharedRuntime::nof_megamorphic_calls_addr()); ++ __ lwz(R12_scratch2, 0, R11_scratch1); ++ __ addi(R12_scratch2, R12_scratch2, 1); ++ __ stw(R12_scratch2, 0, R11_scratch1); ++ } ++#endif ++ ++ assert(VtableStub::receiver_location() == R3_ARG1->as_VMReg(), "receiver expected in R3_ARG1"); ++ ++ // Entry arguments: ++ // R19_method: Interface ++ // R3_ARG1: Receiver ++ // ++ ++ const Register rcvr_klass = R11_scratch1; ++ const Register vtable_len = R12_scratch2; ++ const Register itable_entry_addr = R21_tmp1; ++ const Register itable_interface = R22_tmp2; ++ ++ // Get receiver klass. ++ ++ // We might implicit NULL fault here. ++ address npe_addr = __ pc(); // npe = null pointer exception ++ __ load_klass_with_trap_null_check(rcvr_klass, R3_ARG1); ++ ++ BLOCK_COMMENT("Load start of itable entries into itable_entry."); ++ __ lwz(vtable_len, InstanceKlass::vtable_length_offset() * wordSize, rcvr_klass); ++ __ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size() * wordSize)); ++ __ add(itable_entry_addr, vtable_len, rcvr_klass); ++ ++ // Loop over all itable entries until desired interfaceOop(Rinterface) found. ++ BLOCK_COMMENT("Increment itable_entry_addr in loop."); ++ const int vtable_base_offset = InstanceKlass::vtable_start_offset() * wordSize; ++ __ addi(itable_entry_addr, itable_entry_addr, vtable_base_offset + itableOffsetEntry::interface_offset_in_bytes()); ++ ++ const int itable_offset_search_inc = itableOffsetEntry::size() * wordSize; ++ Label search; ++ __ bind(search); ++ __ ld(itable_interface, 0, itable_entry_addr); ++ ++ // Handle IncompatibleClassChangeError in itable stubs. ++ // If the entry is NULL then we've reached the end of the table ++ // without finding the expected interface, so throw an exception. ++ BLOCK_COMMENT("Handle IncompatibleClassChangeError in itable stubs."); ++ Label throw_icce; ++ __ cmpdi(CCR1, itable_interface, 0); ++ __ cmpd(CCR0, itable_interface, R19_method); ++ __ addi(itable_entry_addr, itable_entry_addr, itable_offset_search_inc); ++ __ beq(CCR1, throw_icce); ++ __ bne(CCR0, search); ++ ++ // Entry found and itable_entry_addr points to it, get offset of vtable for interface. ++ ++ const Register vtable_offset = R12_scratch2; ++ const Register itable_method = R11_scratch1; ++ ++ const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() - ++ itableOffsetEntry::interface_offset_in_bytes()) - ++ itable_offset_search_inc; ++ __ lwz(vtable_offset, vtable_offset_offset, itable_entry_addr); ++ ++ // Compute itableMethodEntry and get method and entry point for compiler. ++ const int method_offset = (itableMethodEntry::size() * wordSize * vtable_index) + ++ itableMethodEntry::method_offset_in_bytes(); ++ ++ __ add(itable_method, rcvr_klass, vtable_offset); ++ __ ld(R19_method, method_offset, itable_method); ++ ++#ifndef PRODUCT ++ if (DebugVtables) { ++ Label ok; ++ __ cmpd(CCR0, R19_method, 0); ++ __ bne(CCR0, ok); ++ __ stop("method is null", 103); ++ __ bind(ok); ++ } ++#endif ++ ++ // If the vtable entry is null, the method is abstract. ++ address ame_addr = __ pc(); // ame = abstract method error ++ ++ // Must do an explicit check if implicit checks are disabled. ++ assert(!MacroAssembler::needs_explicit_null_check(in_bytes(Method::from_compiled_offset())), "sanity"); ++ if (!ImplicitNullChecks || !os::zero_page_read_protected()) { ++ if (TrapBasedNullChecks) { ++ __ trap_null_check(R19_method); ++ } else { ++ __ cmpdi(CCR0, R19_method, 0); ++ __ beq(CCR0, throw_icce); ++ } ++ } ++ __ ld(R12_scratch2, in_bytes(Method::from_compiled_offset()), R19_method); ++ __ mtctr(R12_scratch2); ++ __ bctr(); ++ ++ // Handle IncompatibleClassChangeError in itable stubs. ++ // More detailed error message. ++ // We force resolving of the call site by jumping to the "handle ++ // wrong method" stub, and so let the interpreter runtime do all the ++ // dirty work. ++ __ bind(throw_icce); ++ __ load_const(R11_scratch1, SharedRuntime::get_handle_wrong_method_stub()); ++ __ mtctr(R11_scratch1); ++ __ bctr(); ++ ++ masm->flush(); ++ ++ guarantee(__ pc() <= s->code_end(), "overflowed buffer"); ++ ++ s->set_exception_points(npe_addr, ame_addr); ++ return s; ++} ++ ++int VtableStub::pd_code_size_limit(bool is_vtable_stub) { ++ if (TraceJumps || DebugVtables || CountCompiledCalls || VerifyOops) { ++ return 1000; ++ } else { ++ int decode_klass_size = MacroAssembler::instr_size_for_decode_klass_not_null(); ++ if (is_vtable_stub) { ++ return 20 + decode_klass_size + 8 + 8; // Plain + cOops + Traps + safety ++ } else { ++ return 96 + decode_klass_size + 12 + 8; // Plain + cOops + Traps + safety ++ } ++ } ++} ++ ++int VtableStub::pd_code_alignment() { ++ const unsigned int icache_line_size = 32; ++ return icache_line_size; ++} +--- ./hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/assembler_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -88,6 +88,7 @@ + orncc_op3 = 0x16, + xnorcc_op3 = 0x17, + addccc_op3 = 0x18, ++ aes4_op3 = 0x19, + umulcc_op3 = 0x1a, + smulcc_op3 = 0x1b, + subccc_op3 = 0x1c, +@@ -121,7 +122,14 @@ + fpop1_op3 = 0x34, + fpop2_op3 = 0x35, + impdep1_op3 = 0x36, ++ aes3_op3 = 0x36, ++ alignaddr_op3 = 0x36, ++ faligndata_op3 = 0x36, ++ flog3_op3 = 0x36, ++ edge_op3 = 0x36, ++ fsrc_op3 = 0x36, + impdep2_op3 = 0x37, ++ stpartialf_op3 = 0x37, + jmpl_op3 = 0x38, + rett_op3 = 0x39, + trap_op3 = 0x3a, +@@ -172,41 +180,62 @@ + + enum opfs { + // selected opfs +- fmovs_opf = 0x01, +- fmovd_opf = 0x02, ++ edge8n_opf = 0x01, + +- fnegs_opf = 0x05, +- fnegd_opf = 0x06, ++ fmovs_opf = 0x01, ++ fmovd_opf = 0x02, + +- fadds_opf = 0x41, +- faddd_opf = 0x42, +- fsubs_opf = 0x45, +- fsubd_opf = 0x46, ++ fnegs_opf = 0x05, ++ fnegd_opf = 0x06, + +- fmuls_opf = 0x49, +- fmuld_opf = 0x4a, +- fdivs_opf = 0x4d, +- fdivd_opf = 0x4e, ++ alignaddr_opf = 0x18, + +- fcmps_opf = 0x51, +- fcmpd_opf = 0x52, ++ fadds_opf = 0x41, ++ faddd_opf = 0x42, ++ fsubs_opf = 0x45, ++ fsubd_opf = 0x46, + +- fstox_opf = 0x81, +- fdtox_opf = 0x82, +- fxtos_opf = 0x84, +- fxtod_opf = 0x88, +- fitos_opf = 0xc4, +- fdtos_opf = 0xc6, +- fitod_opf = 0xc8, +- fstod_opf = 0xc9, +- fstoi_opf = 0xd1, +- fdtoi_opf = 0xd2, ++ faligndata_opf = 0x48, + +- mdtox_opf = 0x110, +- mstouw_opf = 0x111, +- mstosw_opf = 0x113, +- mxtod_opf = 0x118, +- mwtos_opf = 0x119 ++ fmuls_opf = 0x49, ++ fmuld_opf = 0x4a, ++ fdivs_opf = 0x4d, ++ fdivd_opf = 0x4e, ++ ++ fcmps_opf = 0x51, ++ fcmpd_opf = 0x52, ++ ++ fstox_opf = 0x81, ++ fdtox_opf = 0x82, ++ fxtos_opf = 0x84, ++ fxtod_opf = 0x88, ++ fitos_opf = 0xc4, ++ fdtos_opf = 0xc6, ++ fitod_opf = 0xc8, ++ fstod_opf = 0xc9, ++ fstoi_opf = 0xd1, ++ fdtoi_opf = 0xd2, ++ ++ mdtox_opf = 0x110, ++ mstouw_opf = 0x111, ++ mstosw_opf = 0x113, ++ mxtod_opf = 0x118, ++ mwtos_opf = 0x119, ++ ++ aes_kexpand0_opf = 0x130, ++ aes_kexpand2_opf = 0x131 ++ }; ++ ++ enum op5s { ++ aes_eround01_op5 = 0x00, ++ aes_eround23_op5 = 0x01, ++ aes_dround01_op5 = 0x02, ++ aes_dround23_op5 = 0x03, ++ aes_eround01_l_op5 = 0x04, ++ aes_eround23_l_op5 = 0x05, ++ aes_dround01_l_op5 = 0x06, ++ aes_dround23_l_op5 = 0x07, ++ aes_kexpand1_op5 = 0x08 + }; + + enum RCondition { rc_z = 1, rc_lez = 2, rc_lz = 3, rc_nz = 5, rc_gz = 6, rc_gez = 7, rc_last = rc_gez }; +@@ -330,6 +359,8 @@ + ASI_PRIMARY = 0x80, + ASI_PRIMARY_NOFAULT = 0x82, + ASI_PRIMARY_LITTLE = 0x88, ++ // 8x8-bit partial store ++ ASI_PST8_PRIMARY = 0xC0, + // Block initializing store + ASI_ST_BLKINIT_PRIMARY = 0xE2, + // Most-Recently-Used (MRU) BIS variant +@@ -427,6 +458,7 @@ + static int immed( bool i) { return u_field(i ? 1 : 0, 13, 13); } + static int opf_low6( int w) { return u_field(w, 10, 5); } + static int opf_low5( int w) { return u_field(w, 9, 5); } ++ static int op5( int x) { return u_field(x, 8, 5); } + static int trapcc( CC cc) { return u_field(cc, 12, 11); } + static int sx( int i) { return u_field(i, 12, 12); } // shift x=1 means 64-bit + static int opf( int x) { return u_field(x, 13, 5); } +@@ -451,6 +483,7 @@ + static int fd( FloatRegister r, FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 29, 25); }; + static int fs1(FloatRegister r, FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 18, 14); }; + static int fs2(FloatRegister r, FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 4, 0); }; ++ static int fs3(FloatRegister r, FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 13, 9); }; + + // some float instructions use this encoding on the op3 field + static int alt_op3(int op, FloatRegisterImpl::Width w) { +@@ -559,6 +592,15 @@ + return x & ((1 << 10) - 1); + } + ++ // 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"); } ++ ++ // instruction only in VIS1 ++ static void vis1_only() { assert( VM_Version::has_vis1(), "This instruction only works on SPARC with VIS1"); } ++ ++ // instruction only in VIS2 ++ static void vis2_only() { assert( VM_Version::has_vis2(), "This instruction only works on SPARC with VIS2"); } ++ + // instruction only in VIS3 + static void vis3_only() { assert( VM_Version::has_vis3(), "This instruction only works on SPARC with VIS3"); } + +@@ -604,11 +646,20 @@ + } + + protected: ++ // Insert a nop if the previous is cbcond ++ void insert_nop_after_cbcond() { ++ if (UseCBCond && cbcond_before()) { ++ nop(); ++ } ++ } + // Delay slot helpers + // cti is called when emitting control-transfer instruction, + // BEFORE doing the emitting. + // Only effective when assertion-checking is enabled. + void cti() { ++ // A cbcond instruction immediately followed by a CTI ++ // instruction introduces pipeline stalls, we need to avoid that. ++ no_cbcond_before(); + #ifdef CHECK_DELAY + assert_not_delayed("cti should not be in delay slot"); + #endif +@@ -632,7 +683,6 @@ + void no_cbcond_before() { + assert(offset() == 0 || !cbcond_before(), "cbcond should not follow an other cbcond"); + } +- + public: + + bool use_cbcond(Label& L) { +@@ -682,6 +732,24 @@ + void addccc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(addc_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); } + + ++ // 4-operand AES instructions ++ ++ void aes_eround01( FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_eround01_op5) | fs2(s2, FloatRegisterImpl::D) ); } ++ void aes_eround23( FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_eround23_op5) | fs2(s2, FloatRegisterImpl::D) ); } ++ void aes_dround01( FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_dround01_op5) | fs2(s2, FloatRegisterImpl::D) ); } ++ void aes_dround23( FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_dround23_op5) | fs2(s2, FloatRegisterImpl::D) ); } ++ void aes_eround01_l( FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_eround01_l_op5) | fs2(s2, FloatRegisterImpl::D) ); } ++ void aes_eround23_l( FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_eround23_l_op5) | fs2(s2, FloatRegisterImpl::D) ); } ++ void aes_dround01_l( FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_dround01_l_op5) | fs2(s2, FloatRegisterImpl::D) ); } ++ void aes_dround23_l( FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_dround23_l_op5) | fs2(s2, FloatRegisterImpl::D) ); } ++ void aes_kexpand1( FloatRegister s1, FloatRegister s2, int imm5a, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | u_field(imm5a, 13, 9) | op5(aes_kexpand1_op5) | fs2(s2, FloatRegisterImpl::D) ); } ++ ++ ++ // 3-operand AES instructions ++ ++ void aes_kexpand0( FloatRegister s1, FloatRegister s2, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes3_op3) | fs1(s1, FloatRegisterImpl::D) | opf(aes_kexpand0_opf) | fs2(s2, FloatRegisterImpl::D) ); } ++ void aes_kexpand2( FloatRegister s1, FloatRegister s2, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes3_op3) | fs1(s1, FloatRegisterImpl::D) | opf(aes_kexpand2_opf) | fs2(s2, FloatRegisterImpl::D) ); } ++ + // pp 136 + + inline void bpr(RCondition c, bool a, Predict p, Register s1, address d, relocInfo::relocType rt = relocInfo::none); +@@ -784,6 +852,10 @@ + void fmul( FloatRegisterImpl::Width sw, FloatRegisterImpl::Width dw, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, dw) | op3(fpop1_op3) | fs1(s1, sw) | opf(0x60 + sw + dw*4) | fs2(s2, sw)); } + void fdiv( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x4c + w) | fs2(s2, w)); } + ++ // FXORs/FXORd instructions ++ ++ void fxor( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(flog3_op3) | fs1(s1, w) | opf(0x6E - w) | fs2(s2, w)); } ++ + // pp 164 + + void fsqrt( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x28 + w) | fs2(s, w)); } +@@ -1108,6 +1180,20 @@ + 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)); } ++ ++ void faligndata( FloatRegister s1, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(faligndata_op3) | fs1(s1, FloatRegisterImpl::D) | opf(faligndata_opf) | fs2(s2, FloatRegisterImpl::D)); } ++ ++ void fsrc2( FloatRegisterImpl::Width w, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fsrc_op3) | opf(0x7A - w) | fs2(s2, w)); } ++ ++ void stpartialf( Register s1, Register s2, FloatRegister d, int ia = -1 ) { vis1_only(); emit_int32( op(ldst_op) | fd(d, FloatRegisterImpl::D) | op3(stpartialf_op3) | rs1(s1) | imm_asi(ia) | rs2(s2)); } ++ ++ // VIS2 instructions ++ ++ void edge8n( Register s1, Register s2, Register d ) { vis2_only(); emit_int32( op(arith_op) | rd(d) | op3(edge_op3) | rs1(s1) | opf(edge8n_opf) | rs2(s2)); } ++ + // VIS3 instructions + + void movstosw( FloatRegister s, Register d ) { vis3_only(); emit_int32( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mstosw_opf) | fs2(s, FloatRegisterImpl::S)); } +--- ./hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/assembler_sparc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -54,33 +54,33 @@ + inline void Assembler::add(Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | rs2(s2) ); } + inline void Assembler::add(Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(add_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); } + +-inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, address d, relocInfo::relocType rt ) { v9_only(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(bpr_op2) | wdisp16(intptr_t(d), intptr_t(pc())) | predict(p) | rs1(s1), rt); has_delay_slot(); } +-inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, Label& L) { bpr( c, a, p, s1, target(L)); } ++inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, address d, relocInfo::relocType rt ) { v9_only(); insert_nop_after_cbcond(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(bpr_op2) | wdisp16(intptr_t(d), intptr_t(pc())) | predict(p) | rs1(s1), rt); has_delay_slot(); } ++inline void Assembler::bpr( RCondition c, bool a, Predict p, Register s1, Label& L) { insert_nop_after_cbcond(); bpr( c, a, p, s1, target(L)); } + +-inline void Assembler::fb( Condition c, bool a, address d, relocInfo::relocType rt ) { v9_dep(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(fb_op2) | wdisp(intptr_t(d), intptr_t(pc()), 22), rt); has_delay_slot(); } +-inline void Assembler::fb( Condition c, bool a, Label& L ) { fb(c, a, target(L)); } ++inline void Assembler::fb( Condition c, bool a, address d, relocInfo::relocType rt ) { v9_dep(); insert_nop_after_cbcond(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(fb_op2) | wdisp(intptr_t(d), intptr_t(pc()), 22), rt); has_delay_slot(); } ++inline void Assembler::fb( Condition c, bool a, Label& L ) { insert_nop_after_cbcond(); fb(c, a, target(L)); } + +-inline void Assembler::fbp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt ) { v9_only(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(fbp_op2) | branchcc(cc) | predict(p) | wdisp(intptr_t(d), intptr_t(pc()), 19), rt); has_delay_slot(); } +-inline void Assembler::fbp( Condition c, bool a, CC cc, Predict p, Label& L ) { fbp(c, a, cc, p, target(L)); } ++inline void Assembler::fbp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt ) { v9_only(); insert_nop_after_cbcond(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(fbp_op2) | branchcc(cc) | predict(p) | wdisp(intptr_t(d), intptr_t(pc()), 19), rt); has_delay_slot(); } ++inline void Assembler::fbp( Condition c, bool a, CC cc, Predict p, Label& L ) { insert_nop_after_cbcond(); fbp(c, a, cc, p, target(L)); } + +-inline void Assembler::br( Condition c, bool a, address d, relocInfo::relocType rt ) { v9_dep(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(br_op2) | wdisp(intptr_t(d), intptr_t(pc()), 22), rt); has_delay_slot(); } +-inline void Assembler::br( Condition c, bool a, Label& L ) { br(c, a, target(L)); } ++inline void Assembler::br( Condition c, bool a, address d, relocInfo::relocType rt ) { v9_dep(); insert_nop_after_cbcond(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(br_op2) | wdisp(intptr_t(d), intptr_t(pc()), 22), rt); has_delay_slot(); } ++inline void Assembler::br( Condition c, bool a, Label& L ) { insert_nop_after_cbcond(); br(c, a, target(L)); } + +-inline void Assembler::bp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt ) { v9_only(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(bp_op2) | branchcc(cc) | predict(p) | wdisp(intptr_t(d), intptr_t(pc()), 19), rt); has_delay_slot(); } +-inline void Assembler::bp( Condition c, bool a, CC cc, Predict p, Label& L ) { bp(c, a, cc, p, target(L)); } ++inline void Assembler::bp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt ) { v9_only(); insert_nop_after_cbcond(); cti(); emit_data( op(branch_op) | annul(a) | cond(c) | op2(bp_op2) | branchcc(cc) | predict(p) | wdisp(intptr_t(d), intptr_t(pc()), 19), rt); has_delay_slot(); } ++inline void Assembler::bp( Condition c, bool a, CC cc, Predict p, Label& L ) { insert_nop_after_cbcond(); bp(c, a, cc, p, target(L)); } + + // compare and branch + inline void Assembler::cbcond(Condition c, CC cc, Register s1, Register s2, Label& L) { cti(); no_cbcond_before(); emit_data(op(branch_op) | cond_cbcond(c) | op2(bpr_op2) | branchcc(cc) | wdisp10(intptr_t(target(L)), intptr_t(pc())) | rs1(s1) | rs2(s2)); } + inline void Assembler::cbcond(Condition c, CC cc, Register s1, int simm5, Label& L) { cti(); no_cbcond_before(); emit_data(op(branch_op) | cond_cbcond(c) | op2(bpr_op2) | branchcc(cc) | wdisp10(intptr_t(target(L)), intptr_t(pc())) | rs1(s1) | immed(true) | simm(simm5, 5)); } + +-inline void Assembler::call( address d, relocInfo::relocType rt ) { cti(); emit_data( op(call_op) | wdisp(intptr_t(d), intptr_t(pc()), 30), rt); has_delay_slot(); assert(rt != relocInfo::virtual_call_type, "must use virtual_call_Relocation::spec"); } +-inline void Assembler::call( Label& L, relocInfo::relocType rt ) { call( target(L), rt); } ++inline void Assembler::call( address d, relocInfo::relocType rt ) { insert_nop_after_cbcond(); cti(); emit_data( op(call_op) | wdisp(intptr_t(d), intptr_t(pc()), 30), rt); has_delay_slot(); assert(rt != relocInfo::virtual_call_type, "must use virtual_call_Relocation::spec"); } ++inline void Assembler::call( Label& L, relocInfo::relocType rt ) { insert_nop_after_cbcond(); call( target(L), rt); } + + inline void Assembler::flush( Register s1, Register s2) { emit_int32( op(arith_op) | op3(flush_op3) | rs1(s1) | rs2(s2)); } + inline void Assembler::flush( Register s1, int simm13a) { emit_data( op(arith_op) | op3(flush_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); } + +-inline void Assembler::jmpl( Register s1, Register s2, Register d ) { cti(); emit_int32( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | rs2(s2)); has_delay_slot(); } +-inline void Assembler::jmpl( Register s1, int simm13a, Register d, RelocationHolder const& rspec ) { cti(); emit_data( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec); has_delay_slot(); } ++inline void Assembler::jmpl( Register s1, Register s2, Register d ) { insert_nop_after_cbcond(); cti(); emit_int32( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | rs2(s2)); has_delay_slot(); } ++inline void Assembler::jmpl( Register s1, int simm13a, Register d, RelocationHolder const& rspec ) { insert_nop_after_cbcond(); cti(); emit_data( op(arith_op) | rd(d) | op3(jmpl_op3) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec); has_delay_slot(); } + + inline void Assembler::ldf(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d) { emit_int32( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | rs2(s2) ); } + inline void Assembler::ldf(FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d, RelocationHolder const& rspec) { emit_data( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13), rspec); } +--- ./hotspot/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -83,7 +83,7 @@ + #define LOCALS_ADDR(offset) ((address)locals[-(offset)]) + #define LOCALS_INT(offset) (*((jint*)&locals[-(offset)])) + #define LOCALS_FLOAT(offset) (*((jfloat*)&locals[-(offset)])) +-#define LOCALS_OBJECT(offset) ((oop)locals[-(offset)]) ++#define LOCALS_OBJECT(offset) (cast_to_oop(locals[-(offset)])) + #define LOCALS_DOUBLE(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->d) + #define LOCALS_LONG(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->l) + #define LOCALS_LONG_AT(offset) (((address)&locals[-((offset) + 1)])) +--- ./hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -152,7 +152,7 @@ + } + + +-int LIR_Assembler::initial_frame_size_in_bytes() { ++int LIR_Assembler::initial_frame_size_in_bytes() const { + return in_bytes(frame_map()->framesize_in_bytes()); + } + +@@ -182,7 +182,7 @@ + int number_of_locks = entry_state->locks_size(); + + // Create a frame for the compiled activation. +- __ build_frame(initial_frame_size_in_bytes()); ++ __ build_frame(initial_frame_size_in_bytes(), bang_size_in_bytes()); + + // OSR buffer is + // +@@ -1315,7 +1315,7 @@ + } + + Address LIR_Assembler::as_Address(LIR_Address* addr) { +- Register reg = addr->base()->as_register(); ++ Register reg = addr->base()->as_pointer_register(); + LIR_Opr index = addr->index(); + if (index->is_illegal()) { + return Address(reg, addr->disp()); +@@ -3101,7 +3101,145 @@ + } + + void LIR_Assembler::emit_profile_type(LIR_OpProfileType* op) { +- fatal("Type profiling not implemented on this platform"); ++ Register obj = op->obj()->as_register(); ++ Register tmp1 = op->tmp()->as_pointer_register(); ++ Register tmp2 = G1; ++ Address mdo_addr = as_Address(op->mdp()->as_address_ptr()); ++ ciKlass* exact_klass = op->exact_klass(); ++ intptr_t current_klass = op->current_klass(); ++ bool not_null = op->not_null(); ++ bool no_conflict = op->no_conflict(); ++ ++ Label update, next, none; ++ ++ bool do_null = !not_null; ++ bool exact_klass_set = exact_klass != NULL && ciTypeEntries::valid_ciklass(current_klass) == exact_klass; ++ bool do_update = !TypeEntries::is_type_unknown(current_klass) && !exact_klass_set; ++ ++ assert(do_null || do_update, "why are we here?"); ++ assert(!TypeEntries::was_null_seen(current_klass) || do_update, "why are we here?"); ++ ++ __ verify_oop(obj); ++ ++ if (tmp1 != obj) { ++ __ mov(obj, tmp1); ++ } ++ if (do_null) { ++ __ br_notnull_short(tmp1, Assembler::pt, update); ++ if (!TypeEntries::was_null_seen(current_klass)) { ++ __ ld_ptr(mdo_addr, tmp1); ++ __ or3(tmp1, TypeEntries::null_seen, tmp1); ++ __ st_ptr(tmp1, mdo_addr); ++ } ++ if (do_update) { ++ __ ba(next); ++ __ delayed()->nop(); ++ } ++#ifdef ASSERT ++ } else { ++ __ br_notnull_short(tmp1, Assembler::pt, update); ++ __ stop("unexpect null obj"); ++#endif ++ } ++ ++ __ bind(update); ++ ++ if (do_update) { ++#ifdef ASSERT ++ if (exact_klass != NULL) { ++ Label ok; ++ __ load_klass(tmp1, tmp1); ++ metadata2reg(exact_klass->constant_encoding(), tmp2); ++ __ cmp_and_br_short(tmp1, tmp2, Assembler::equal, Assembler::pt, ok); ++ __ stop("exact klass and actual klass differ"); ++ __ bind(ok); ++ } ++#endif ++ ++ Label do_update; ++ __ ld_ptr(mdo_addr, tmp2); ++ ++ if (!no_conflict) { ++ if (exact_klass == NULL || TypeEntries::is_type_none(current_klass)) { ++ if (exact_klass != NULL) { ++ metadata2reg(exact_klass->constant_encoding(), tmp1); ++ } else { ++ __ load_klass(tmp1, tmp1); ++ } ++ ++ __ xor3(tmp1, tmp2, tmp1); ++ __ btst(TypeEntries::type_klass_mask, tmp1); ++ // klass seen before, nothing to do. The unknown bit may have been ++ // set already but no need to check. ++ __ brx(Assembler::zero, false, Assembler::pt, next); ++ __ delayed()-> ++ ++ btst(TypeEntries::type_unknown, tmp1); ++ // already unknown. Nothing to do anymore. ++ __ brx(Assembler::notZero, false, Assembler::pt, next); ++ ++ if (TypeEntries::is_type_none(current_klass)) { ++ __ delayed()->btst(TypeEntries::type_mask, tmp2); ++ __ brx(Assembler::zero, true, Assembler::pt, do_update); ++ // first time here. Set profile type. ++ __ delayed()->or3(tmp2, tmp1, tmp2); ++ } else { ++ __ delayed()->nop(); ++ } ++ } else { ++ assert(ciTypeEntries::valid_ciklass(current_klass) != NULL && ++ ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "conflict only"); ++ ++ __ btst(TypeEntries::type_unknown, tmp2); ++ // already unknown. Nothing to do anymore. ++ __ brx(Assembler::notZero, false, Assembler::pt, next); ++ __ delayed()->nop(); ++ } ++ ++ // different than before. Cannot keep accurate profile. ++ __ or3(tmp2, TypeEntries::type_unknown, tmp2); ++ } else { ++ // There's a single possible klass at this profile point ++ assert(exact_klass != NULL, "should be"); ++ if (TypeEntries::is_type_none(current_klass)) { ++ metadata2reg(exact_klass->constant_encoding(), tmp1); ++ __ xor3(tmp1, tmp2, tmp1); ++ __ btst(TypeEntries::type_klass_mask, tmp1); ++ __ brx(Assembler::zero, false, Assembler::pt, next); ++#ifdef ASSERT ++ ++ { ++ Label ok; ++ __ delayed()->btst(TypeEntries::type_mask, tmp2); ++ __ brx(Assembler::zero, true, Assembler::pt, ok); ++ __ delayed()->nop(); ++ ++ __ stop("unexpected profiling mismatch"); ++ __ bind(ok); ++ } ++ // first time here. Set profile type. ++ __ or3(tmp2, tmp1, tmp2); ++#else ++ // first time here. Set profile type. ++ __ delayed()->or3(tmp2, tmp1, tmp2); ++#endif ++ ++ } else { ++ assert(ciTypeEntries::valid_ciklass(current_klass) != NULL && ++ ciTypeEntries::valid_ciklass(current_klass) != exact_klass, "inconsistent"); ++ ++ // already unknown. Nothing to do anymore. ++ __ btst(TypeEntries::type_unknown, tmp2); ++ __ brx(Assembler::notZero, false, Assembler::pt, next); ++ __ delayed()->or3(tmp2, TypeEntries::type_unknown, tmp2); ++ } ++ } ++ ++ __ bind(do_update); ++ __ st_ptr(tmp2, mdo_addr); ++ ++ __ bind(next); ++ } + } + + void LIR_Assembler::align_backward_branch_target() { +@@ -3321,9 +3459,14 @@ + + void LIR_Assembler::leal(LIR_Opr addr_opr, LIR_Opr dest) { + LIR_Address* addr = addr_opr->as_address_ptr(); +- assert(addr->index()->is_illegal() && addr->scale() == LIR_Address::times_1 && Assembler::is_simm13(addr->disp()), "can't handle complex addresses yet"); +- +- __ add(addr->base()->as_pointer_register(), addr->disp(), dest->as_pointer_register()); ++ assert(addr->index()->is_illegal() && addr->scale() == LIR_Address::times_1, "can't handle complex addresses yet"); ++ ++ if (Assembler::is_simm13(addr->disp())) { ++ __ add(addr->base()->as_pointer_register(), addr->disp(), dest->as_pointer_register()); ++ } else { ++ __ set(addr->disp(), G3_scratch); ++ __ add(addr->base()->as_pointer_register(), G3_scratch, dest->as_pointer_register()); ++ } + } + + +--- ./hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1221,10 +1221,8 @@ + bool is_obj = (type == T_ARRAY || type == T_OBJECT); + LIR_Opr offset = off.result(); + +- if (data != dst) { +- __ move(data, dst); +- data = dst; +- } ++ // Because we want a 2-arg form of xchg ++ __ move(data, dst); + + assert (!x->is_add() && (type == T_INT || (is_obj LP64_ONLY(&& UseCompressedOops))), "unexpected type"); + LIR_Address* addr; +@@ -1254,7 +1252,7 @@ + pre_barrier(ptr, LIR_OprFact::illegalOpr /* pre_val */, + true /* do_load */, false /* patch */, NULL); + } +- __ xchg(LIR_OprFact::address(addr), data, dst, tmp); ++ __ xchg(LIR_OprFact::address(addr), dst, dst, tmp); + if (is_obj) { + // Seems to be a precise address + post_barrier(ptr, data); +--- ./hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -55,9 +55,9 @@ + } + + +-void C1_MacroAssembler::build_frame(int frame_size_in_bytes) { +- +- generate_stack_overflow_check(frame_size_in_bytes); ++void C1_MacroAssembler::build_frame(int frame_size_in_bytes, int bang_size_in_bytes) { ++ assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect"); ++ generate_stack_overflow_check(bang_size_in_bytes); + // Create the frame. + save_frame_c1(frame_size_in_bytes); + } +--- ./hotspot/src/cpu/sparc/vm/c2_globals_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/c2_globals_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -90,6 +90,8 @@ + define_pd_global(uintx, CodeCacheMinBlockLength, 4); + define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K); + ++define_pd_global(bool, TrapBasedRangeChecks, false); // Not needed on sparc. ++ + // Heap related flags + define_pd_global(uintx,MetaspaceSize, ScaleForWordSize(16*M)); + +--- ./hotspot/src/cpu/sparc/vm/copy_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/copy_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -184,7 +184,7 @@ + assert(MinObjAlignmentInBytes >= BytesPerLong, "need alternate implementation"); + + if (value == 0 && UseBlockZeroing && +- (count > (BlockZeroingLowLimit >> LogHeapWordSize))) { ++ (count > (size_t)(BlockZeroingLowLimit >> LogHeapWordSize))) { + // Call it only when block zeroing is used + ((_zero_Fn)StubRoutines::zero_aligned_words())(tohw, count); + } else { +--- ./hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -960,7 +960,7 @@ + + // reset handle block + __ ld_ptr(G2_thread, in_bytes(JavaThread::active_handles_offset()), G3_scratch); +- __ st_ptr(G0, G3_scratch, JNIHandleBlock::top_offset_in_bytes()); ++ __ st(G0, G3_scratch, JNIHandleBlock::top_offset_in_bytes()); + + + // handle exceptions (exception handling will handle unlocking!) +@@ -2101,7 +2101,7 @@ + int monitor_size = method->is_synchronized() ? + 1*frame::interpreter_frame_monitor_size() : 0; + return size_activation_helper(method->max_locals(), method->max_stack(), +- monitor_size) + call_stub_size; ++ monitor_size) + call_stub_size; + } + + void BytecodeInterpreter::layout_interpreterState(interpreterState to_fill, +@@ -2185,31 +2185,31 @@ + istate->_last_Java_pc = (intptr_t*) last_Java_pc; + } + ++static int frame_size_helper(int max_stack, ++ int moncount, ++ int callee_param_size, ++ int callee_locals_size, ++ bool is_top_frame, ++ int& monitor_size, ++ int& full_frame_words) { ++ int extra_locals_size = callee_locals_size - callee_param_size; ++ monitor_size = (sizeof(BasicObjectLock) * moncount) / wordSize; ++ full_frame_words = size_activation_helper(extra_locals_size, max_stack, monitor_size); ++ int short_frame_words = size_activation_helper(extra_locals_size, max_stack, monitor_size); ++ int frame_words = is_top_frame ? full_frame_words : short_frame_words; + +-int AbstractInterpreter::layout_activation(Method* method, +- int tempcount, // Number of slots on java expression stack in use +- int popframe_extra_args, +- int moncount, // Number of active monitors +- int caller_actual_parameters, +- int callee_param_size, +- int callee_locals_size, +- frame* caller, +- frame* interpreter_frame, +- bool is_top_frame, +- bool is_bottom_frame) { ++ return frame_words; ++} + +- assert(popframe_extra_args == 0, "NEED TO FIX"); +- // NOTE this code must exactly mimic what InterpreterGenerator::generate_compute_interpreter_state() +- // does as far as allocating an interpreter frame. +- // If interpreter_frame!=NULL, set up the method, locals, and monitors. +- // The frame interpreter_frame, if not NULL, is guaranteed to be the right size, +- // as determined by a previous call to this method. +- // It is also guaranteed to be walkable even though it is in a skeletal state ++int AbstractInterpreter::size_activation(int max_stack, ++ int tempcount, ++ int extra_args, ++ int moncount, ++ int callee_param_size, ++ int callee_locals_size, ++ bool is_top_frame) { ++ assert(extra_args == 0, "NEED TO FIX"); + // NOTE: return size is in words not bytes +- // NOTE: tempcount is the current size of the java expression stack. For top most +- // frames we will allocate a full sized expression stack and not the curback +- // version that non-top frames have. +- + // Calculate the amount our frame will be adjust by the callee. For top frame + // this is zero. + +@@ -2218,87 +2218,108 @@ + // to it. So it ignores last_frame_adjust value. Seems suspicious as far + // as getting sender_sp correct. + +- int extra_locals_size = callee_locals_size - callee_param_size; +- int monitor_size = (sizeof(BasicObjectLock) * moncount) / wordSize; +- int full_frame_words = size_activation_helper(extra_locals_size, method->max_stack(), monitor_size); +- int short_frame_words = size_activation_helper(extra_locals_size, method->max_stack(), monitor_size); +- int frame_words = is_top_frame ? full_frame_words : short_frame_words; ++ int unused_monitor_size = 0; ++ int unused_full_frame_words = 0; ++ return frame_size_helper(max_stack, moncount, callee_param_size, callee_locals_size, is_top_frame, ++ unused_monitor_size, unused_full_frame_words); ++} ++void AbstractInterpreter::layout_activation(Method* method, ++ int tempcount, // Number of slots on java expression stack in use ++ int popframe_extra_args, ++ int moncount, // Number of active monitors ++ int caller_actual_parameters, ++ int callee_param_size, ++ int callee_locals_size, ++ frame* caller, ++ frame* interpreter_frame, ++ bool is_top_frame, ++ bool is_bottom_frame) { ++ assert(popframe_extra_args == 0, "NEED TO FIX"); ++ // NOTE this code must exactly mimic what InterpreterGenerator::generate_compute_interpreter_state() ++ // does as far as allocating an interpreter frame. ++ // Set up the method, locals, and monitors. ++ // The frame interpreter_frame is guaranteed to be the right size, ++ // as determined by a previous call to the size_activation() method. ++ // It is also guaranteed to be walkable even though it is in a skeletal state ++ // NOTE: tempcount is the current size of the java expression stack. For top most ++ // frames we will allocate a full sized expression stack and not the curback ++ // version that non-top frames have. + ++ int monitor_size = 0; ++ int full_frame_words = 0; ++ int frame_words = frame_size_helper(method->max_stack(), moncount, callee_param_size, callee_locals_size, ++ is_top_frame, monitor_size, full_frame_words); + + /* +- if we actually have a frame to layout we must now fill in all the pieces. This means both ++ We must now fill in all the pieces of the frame. This means both + the interpreterState and the registers. + */ +- if (interpreter_frame != NULL) { + +- // MUCHO HACK ++ // MUCHO HACK + +- intptr_t* frame_bottom = interpreter_frame->sp() - (full_frame_words - frame_words); +- // 'interpreter_frame->sp()' is unbiased while 'frame_bottom' must be a biased value in 64bit mode. +- assert(((intptr_t)frame_bottom & 0xf) == 0, "SP biased in layout_activation"); +- frame_bottom = (intptr_t*)((intptr_t)frame_bottom - STACK_BIAS); ++ intptr_t* frame_bottom = interpreter_frame->sp() - (full_frame_words - frame_words); ++ // 'interpreter_frame->sp()' is unbiased while 'frame_bottom' must be a biased value in 64bit mode. ++ assert(((intptr_t)frame_bottom & 0xf) == 0, "SP biased in layout_activation"); ++ frame_bottom = (intptr_t*)((intptr_t)frame_bottom - STACK_BIAS); + +- /* Now fillin the interpreterState object */ ++ /* Now fillin the interpreterState object */ + +- interpreterState cur_state = (interpreterState) ((intptr_t)interpreter_frame->fp() - sizeof(BytecodeInterpreter)); ++ interpreterState cur_state = (interpreterState) ((intptr_t)interpreter_frame->fp() - sizeof(BytecodeInterpreter)); + + +- intptr_t* locals; ++ intptr_t* locals; + +- // Calculate the postion of locals[0]. This is painful because of +- // stack alignment (same as ia64). The problem is that we can +- // not compute the location of locals from fp(). fp() will account +- // for the extra locals but it also accounts for aligning the stack +- // and we can't determine if the locals[0] was misaligned but max_locals +- // was enough to have the +- // calculate postion of locals. fp already accounts for extra locals. +- // +2 for the static long no_params() issue. ++ // Calculate the postion of locals[0]. This is painful because of ++ // stack alignment (same as ia64). The problem is that we can ++ // not compute the location of locals from fp(). fp() will account ++ // for the extra locals but it also accounts for aligning the stack ++ // and we can't determine if the locals[0] was misaligned but max_locals ++ // was enough to have the ++ // calculate postion of locals. fp already accounts for extra locals. ++ // +2 for the static long no_params() issue. + +- if (caller->is_interpreted_frame()) { +- // locals must agree with the caller because it will be used to set the +- // caller's tos when we return. +- interpreterState prev = caller->get_interpreterState(); +- // stack() is prepushed. +- locals = prev->stack() + method->size_of_parameters(); ++ if (caller->is_interpreted_frame()) { ++ // locals must agree with the caller because it will be used to set the ++ // caller's tos when we return. ++ interpreterState prev = caller->get_interpreterState(); ++ // stack() is prepushed. ++ locals = prev->stack() + method->size_of_parameters(); ++ } else { ++ // Lay out locals block in the caller adjacent to the register window save area. ++ // ++ // Compiled frames do not allocate a varargs area which is why this if ++ // statement is needed. ++ // ++ intptr_t* fp = interpreter_frame->fp(); ++ int local_words = method->max_locals() * Interpreter::stackElementWords; ++ ++ if (caller->is_compiled_frame()) { ++ locals = fp + frame::register_save_words + local_words - 1; + } else { +- // Lay out locals block in the caller adjacent to the register window save area. +- // +- // Compiled frames do not allocate a varargs area which is why this if +- // statement is needed. +- // +- intptr_t* fp = interpreter_frame->fp(); +- int local_words = method->max_locals() * Interpreter::stackElementWords; +- +- if (caller->is_compiled_frame()) { +- locals = fp + frame::register_save_words + local_words - 1; +- } else { +- locals = fp + frame::memory_parameter_word_sp_offset + local_words - 1; +- } +- ++ locals = fp + frame::memory_parameter_word_sp_offset + local_words - 1; + } +- // END MUCHO HACK +- +- intptr_t* monitor_base = (intptr_t*) cur_state; +- intptr_t* stack_base = monitor_base - monitor_size; +- /* +1 because stack is always prepushed */ +- intptr_t* stack = stack_base - (tempcount + 1); +- +- +- BytecodeInterpreter::layout_interpreterState(cur_state, +- caller, +- interpreter_frame, +- method, +- locals, +- stack, +- stack_base, +- monitor_base, +- frame_bottom, +- is_top_frame); +- +- BytecodeInterpreter::pd_layout_interpreterState(cur_state, interpreter_return_address, interpreter_frame->fp()); + + } +- return frame_words; ++ // END MUCHO HACK ++ ++ intptr_t* monitor_base = (intptr_t*) cur_state; ++ intptr_t* stack_base = monitor_base - monitor_size; ++ /* +1 because stack is always prepushed */ ++ intptr_t* stack = stack_base - (tempcount + 1); ++ ++ ++ BytecodeInterpreter::layout_interpreterState(cur_state, ++ caller, ++ interpreter_frame, ++ method, ++ locals, ++ stack, ++ stack_base, ++ monitor_base, ++ frame_bottom, ++ is_top_frame); ++ ++ BytecodeInterpreter::pd_layout_interpreterState(cur_state, interpreter_return_address, interpreter_frame->fp()); + } + + #endif // CC_INTERP +--- ./hotspot/src/cpu/sparc/vm/frame_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/frame_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -259,8 +259,8 @@ + + // next two fns read and write Lmonitors value, + private: +- BasicObjectLock* interpreter_frame_monitors() const { return *interpreter_frame_monitors_addr(); } +- void interpreter_frame_set_monitors(BasicObjectLock* monitors) { *interpreter_frame_monitors_addr() = monitors; } ++ BasicObjectLock* interpreter_frame_monitors() const; ++ void interpreter_frame_set_monitors(BasicObjectLock* monitors); + #else + public: + inline interpreterState get_interpreterState() const { +--- ./hotspot/src/cpu/sparc/vm/frame_sparc.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/frame_sparc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -226,6 +226,13 @@ + return (Method**)sp_addr_at( Lmethod->sp_offset_in_saved_window()); + } + ++inline BasicObjectLock* frame::interpreter_frame_monitors() const { ++ return *interpreter_frame_monitors_addr(); ++} ++ ++inline void frame::interpreter_frame_set_monitors(BasicObjectLock* monitors) { ++ *interpreter_frame_monitors_addr() = monitors; ++} + + // Constant pool cache + +@@ -237,6 +244,10 @@ + inline ConstantPoolCache** frame::interpreter_frame_cache_addr() const { + return (ConstantPoolCache**)sp_addr_at( LcpoolCache->sp_offset_in_saved_window()); + } ++ ++inline oop* frame::interpreter_frame_temp_oop_addr() const { ++ return (oop *)(fp() + interpreter_frame_oop_temp_offset); ++} + #endif // CC_INTERP + + +--- ./hotspot/src/cpu/sparc/vm/globalDefinitions_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/globalDefinitions_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -30,6 +30,12 @@ + + const int StackAlignmentInBytes = (2*wordSize); + ++// Indicates whether the C calling conventions require that ++// 32-bit integer argument values are properly extended to 64 bits. ++// If set, SharedRuntime::c_calling_convention() must adapt ++// signatures accordingly. ++const bool CCallingConventionRequiresIntsAsLongs = false; ++ + #define SUPPORTS_NATIVE_CX8 + + #endif // CPU_SPARC_VM_GLOBALDEFINITIONS_SPARC_HPP +--- ./hotspot/src/cpu/sparc/vm/globals_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/globals_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -43,7 +43,8 @@ + define_pd_global(bool, NeedsDeoptSuspend, true); // register window machines need this + + define_pd_global(bool, ImplicitNullChecks, true); // Generate code for implicit null checks +-define_pd_global(bool, UncommonNullCast, true); // Uncommon-trap NULLs past to check cast ++define_pd_global(bool, TrapBasedNullChecks, false); // Not needed on sparc. ++define_pd_global(bool, UncommonNullCast, true); // Uncommon-trap NULLs passed to check cast + + define_pd_global(intx, CodeEntryAlignment, 32); + // The default setting 16/16 seems to work best. +--- ./hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1892,6 +1892,220 @@ + } + } + ++void InterpreterMacroAssembler::profile_obj_type(Register obj, const Address& mdo_addr, Register tmp) { ++ Label not_null, do_nothing, do_update; ++ ++ assert_different_registers(obj, mdo_addr.base(), tmp); ++ ++ verify_oop(obj); ++ ++ ld_ptr(mdo_addr, tmp); ++ ++ br_notnull_short(obj, pt, not_null); ++ or3(tmp, TypeEntries::null_seen, tmp); ++ ba_short(do_update); ++ ++ bind(not_null); ++ load_klass(obj, obj); ++ ++ xor3(obj, tmp, obj); ++ btst(TypeEntries::type_klass_mask, obj); ++ // klass seen before, nothing to do. The unknown bit may have been ++ // set already but no need to check. ++ brx(zero, false, pt, do_nothing); ++ delayed()-> ++ ++ btst(TypeEntries::type_unknown, obj); ++ // already unknown. Nothing to do anymore. ++ brx(notZero, false, pt, do_nothing); ++ delayed()-> ++ ++ btst(TypeEntries::type_mask, tmp); ++ brx(zero, true, pt, do_update); ++ // first time here. Set profile type. ++ delayed()->or3(tmp, obj, tmp); ++ ++ // different than before. Cannot keep accurate profile. ++ or3(tmp, TypeEntries::type_unknown, tmp); ++ ++ bind(do_update); ++ // update profile ++ st_ptr(tmp, mdo_addr); ++ ++ bind(do_nothing); ++} ++ ++void InterpreterMacroAssembler::profile_arguments_type(Register callee, Register tmp1, Register tmp2, bool is_virtual) { ++ if (!ProfileInterpreter) { ++ return; ++ } ++ ++ assert_different_registers(callee, tmp1, tmp2, ImethodDataPtr); ++ ++ if (MethodData::profile_arguments() || MethodData::profile_return()) { ++ Label profile_continue; ++ ++ test_method_data_pointer(profile_continue); ++ ++ int off_to_start = is_virtual ? in_bytes(VirtualCallData::virtual_call_data_size()) : in_bytes(CounterData::counter_data_size()); ++ ++ ldub(ImethodDataPtr, in_bytes(DataLayout::tag_offset()) - off_to_start, tmp1); ++ cmp_and_br_short(tmp1, is_virtual ? DataLayout::virtual_call_type_data_tag : DataLayout::call_type_data_tag, notEqual, pn, profile_continue); ++ ++ if (MethodData::profile_arguments()) { ++ Label done; ++ int off_to_args = in_bytes(TypeEntriesAtCall::args_data_offset()); ++ add(ImethodDataPtr, off_to_args, ImethodDataPtr); ++ ++ for (int i = 0; i < TypeProfileArgsLimit; i++) { ++ if (i > 0 || MethodData::profile_return()) { ++ // If return value type is profiled we may have no argument to profile ++ ld_ptr(ImethodDataPtr, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args, tmp1); ++ sub(tmp1, i*TypeStackSlotEntries::per_arg_count(), tmp1); ++ cmp_and_br_short(tmp1, TypeStackSlotEntries::per_arg_count(), less, pn, done); ++ } ++ ld_ptr(Address(callee, Method::const_offset()), tmp1); ++ lduh(Address(tmp1, ConstMethod::size_of_parameters_offset()), tmp1); ++ // stack offset o (zero based) from the start of the argument ++ // list, for n arguments translates into offset n - o - 1 from ++ // the end of the argument list. But there's an extra slot at ++ // the stop of the stack. So the offset is n - o from Lesp. ++ ld_ptr(ImethodDataPtr, in_bytes(TypeEntriesAtCall::stack_slot_offset(i))-off_to_args, tmp2); ++ sub(tmp1, tmp2, tmp1); ++ ++ // Can't use MacroAssembler::argument_address() which needs Gargs to be set up ++ sll(tmp1, Interpreter::logStackElementSize, tmp1); ++ ld_ptr(Lesp, tmp1, tmp1); ++ ++ Address mdo_arg_addr(ImethodDataPtr, in_bytes(TypeEntriesAtCall::argument_type_offset(i))-off_to_args); ++ profile_obj_type(tmp1, mdo_arg_addr, tmp2); ++ ++ int to_add = in_bytes(TypeStackSlotEntries::per_arg_size()); ++ add(ImethodDataPtr, to_add, ImethodDataPtr); ++ off_to_args += to_add; ++ } ++ ++ if (MethodData::profile_return()) { ++ ld_ptr(ImethodDataPtr, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args, tmp1); ++ sub(tmp1, TypeProfileArgsLimit*TypeStackSlotEntries::per_arg_count(), tmp1); ++ } ++ ++ bind(done); ++ ++ if (MethodData::profile_return()) { ++ // We're right after the type profile for the last ++ // argument. tmp1 is the number of cells left in the ++ // CallTypeData/VirtualCallTypeData to reach its end. Non null ++ // if there's a return to profile. ++ assert(ReturnTypeEntry::static_cell_count() < TypeStackSlotEntries::per_arg_count(), "can't move past ret type"); ++ sll(tmp1, exact_log2(DataLayout::cell_size), tmp1); ++ add(ImethodDataPtr, tmp1, ImethodDataPtr); ++ } ++ } else { ++ assert(MethodData::profile_return(), "either profile call args or call ret"); ++ update_mdp_by_constant(in_bytes(TypeEntriesAtCall::return_only_size())); ++ } ++ ++ // mdp points right after the end of the ++ // CallTypeData/VirtualCallTypeData, right after the cells for the ++ // return value type if there's one. ++ ++ bind(profile_continue); ++ } ++} ++ ++void InterpreterMacroAssembler::profile_return_type(Register ret, Register tmp1, Register tmp2) { ++ assert_different_registers(ret, tmp1, tmp2); ++ if (ProfileInterpreter && MethodData::profile_return()) { ++ Label profile_continue, done; ++ ++ test_method_data_pointer(profile_continue); ++ ++ if (MethodData::profile_return_jsr292_only()) { ++ // If we don't profile all invoke bytecodes we must make sure ++ // it's a bytecode we indeed profile. We can't go back to the ++ // begining of the ProfileData we intend to update to check its ++ // type because we're right after it and we don't known its ++ // length. ++ Label do_profile; ++ ldub(Lbcp, 0, tmp1); ++ cmp_and_br_short(tmp1, Bytecodes::_invokedynamic, equal, pn, do_profile); ++ cmp(tmp1, Bytecodes::_invokehandle); ++ br(equal, false, pn, do_profile); ++ delayed()->ldub(Lmethod, Method::intrinsic_id_offset_in_bytes(), tmp1); ++ cmp_and_br_short(tmp1, vmIntrinsics::_compiledLambdaForm, notEqual, pt, profile_continue); ++ ++ bind(do_profile); ++ } ++ ++ Address mdo_ret_addr(ImethodDataPtr, -in_bytes(ReturnTypeEntry::size())); ++ mov(ret, tmp1); ++ profile_obj_type(tmp1, mdo_ret_addr, tmp2); ++ ++ bind(profile_continue); ++ } ++} ++ ++void InterpreterMacroAssembler::profile_parameters_type(Register tmp1, Register tmp2, Register tmp3, Register tmp4) { ++ if (ProfileInterpreter && MethodData::profile_parameters()) { ++ Label profile_continue, done; ++ ++ test_method_data_pointer(profile_continue); ++ ++ // Load the offset of the area within the MDO used for ++ // parameters. If it's negative we're not profiling any parameters. ++ lduw(ImethodDataPtr, in_bytes(MethodData::parameters_type_data_di_offset()) - in_bytes(MethodData::data_offset()), tmp1); ++ cmp_and_br_short(tmp1, 0, less, pn, profile_continue); ++ ++ // Compute a pointer to the area for parameters from the offset ++ // and move the pointer to the slot for the last ++ // parameters. Collect profiling from last parameter down. ++ // mdo start + parameters offset + array length - 1 ++ ++ // Pointer to the parameter area in the MDO ++ Register mdp = tmp1; ++ add(ImethodDataPtr, tmp1, mdp); ++ ++ // offset of the current profile entry to update ++ Register entry_offset = tmp2; ++ // entry_offset = array len in number of cells ++ ld_ptr(mdp, ArrayData::array_len_offset(), entry_offset); ++ ++ int off_base = in_bytes(ParametersTypeData::stack_slot_offset(0)); ++ assert(off_base % DataLayout::cell_size == 0, "should be a number of cells"); ++ ++ // entry_offset (number of cells) = array len - size of 1 entry + offset of the stack slot field ++ sub(entry_offset, TypeStackSlotEntries::per_arg_count() - (off_base / DataLayout::cell_size), entry_offset); ++ // entry_offset in bytes ++ sll(entry_offset, exact_log2(DataLayout::cell_size), entry_offset); ++ ++ Label loop; ++ bind(loop); ++ ++ // load offset on the stack from the slot for this parameter ++ ld_ptr(mdp, entry_offset, tmp3); ++ sll(tmp3,Interpreter::logStackElementSize, tmp3); ++ neg(tmp3); ++ // read the parameter from the local area ++ ld_ptr(Llocals, tmp3, tmp3); ++ ++ // make entry_offset now point to the type field for this parameter ++ int type_base = in_bytes(ParametersTypeData::type_offset(0)); ++ assert(type_base > off_base, "unexpected"); ++ add(entry_offset, type_base - off_base, entry_offset); ++ ++ // profile the parameter ++ Address arg_type(mdp, entry_offset); ++ profile_obj_type(tmp3, arg_type, tmp4); ++ ++ // go to next parameter ++ sub(entry_offset, TypeStackSlotEntries::per_arg_count() * DataLayout::cell_size + (type_base - off_base), entry_offset); ++ cmp_and_br_short(entry_offset, off_base, greaterEqual, pt, loop); ++ ++ bind(profile_continue); ++ } ++} ++ + // add a InterpMonitorElem to stack (see frame_sparc.hpp) + + void InterpreterMacroAssembler::add_monitor_to_stack( bool stack_is_empty, +--- ./hotspot/src/cpu/sparc/vm/interp_masm_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/interp_masm_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -323,6 +323,11 @@ + Register scratch2, + Register scratch3); + ++ void profile_obj_type(Register obj, const Address& mdo_addr, Register tmp); ++ void profile_arguments_type(Register callee, Register tmp1, Register tmp2, bool is_virtual); ++ void profile_return_type(Register ret, Register tmp1, Register tmp2); ++ void profile_parameters_type(Register tmp1, Register tmp2, Register tmp3, Register tmp4); ++ + // Debugging + void interp_verify_oop(Register reg, TosState state, const char * file, int line); // only if +VerifyOops && state == atos + void verify_oop_or_return_address(Register reg, Register rtmp); // for astore +--- ./hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -3531,7 +3531,7 @@ + // was post-decremented.) Skip this address by starting at i=1, and + // touch a few more pages below. N.B. It is important to touch all + // the way down to and including i=StackShadowPages. +- for (int i = 1; i <= StackShadowPages; i++) { ++ for (int i = 1; i < StackShadowPages; i++) { + set((-i*offset)+STACK_BIAS, Rscratch); + st(G0, Rtsp, Rscratch); + } +--- ./hotspot/src/cpu/sparc/vm/macroAssembler_sparc.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/macroAssembler_sparc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -233,6 +233,7 @@ + } + + inline void MacroAssembler::br( Condition c, bool a, Predict p, Label& L ) { ++ insert_nop_after_cbcond(); + br(c, a, p, target(L)); + } + +@@ -248,6 +249,7 @@ + } + + inline void MacroAssembler::brx( Condition c, bool a, Predict p, Label& L ) { ++ insert_nop_after_cbcond(); + brx(c, a, p, target(L)); + } + +@@ -269,6 +271,7 @@ + } + + inline void MacroAssembler::fb( Condition c, bool a, Predict p, Label& L ) { ++ insert_nop_after_cbcond(); + fb(c, a, p, target(L)); + } + +@@ -318,6 +321,7 @@ + } + + inline void MacroAssembler::call( Label& L, relocInfo::relocType rt ) { ++ insert_nop_after_cbcond(); + MacroAssembler::call( target(L), rt); + } + +--- ./hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1106,7 +1106,9 @@ + + int SharedRuntime::c_calling_convention(const BasicType *sig_bt, + VMRegPair *regs, ++ VMRegPair *regs2, + int total_args_passed) { ++ assert(regs2 == NULL, "not needed on sparc"); + + // Return the number of VMReg stack_slots needed for the args. + // This value does not include an abi space (like register window +@@ -2084,7 +2086,7 @@ + // the 1st six register arguments). It's weird see int_stk_helper. + // + int out_arg_slots; +- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, total_c_args); ++ out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args); + + if (is_critical_native) { + // Critical natives may have to call out so they need a save area +@@ -2685,7 +2687,7 @@ + if (!is_critical_native) { + // reset handle block + __ ld_ptr(G2_thread, in_bytes(JavaThread::active_handles_offset()), L5); +- __ st_ptr(G0, L5, JNIHandleBlock::top_offset_in_bytes()); ++ __ st(G0, L5, JNIHandleBlock::top_offset_in_bytes()); + + __ ld_ptr(G2_thread, in_bytes(Thread::pending_exception_offset()), G3_scratch); + check_forward_pending_exception(masm, G3_scratch); +@@ -2831,7 +2833,7 @@ + // the 1st six register arguments). It's weird see int_stk_helper. + // + int out_arg_slots; +- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, total_c_args); ++ out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args); + + // Calculate the total number of stack slots we will need. + +@@ -3353,13 +3355,16 @@ + Register O4array_size = O4; + Label loop; + +- // Before we make new frames, check to see if stack is available. +- // Do this after the caller's return address is on top of stack ++#ifdef ASSERT ++ // Compilers generate code that bang the stack by as much as the ++ // interpreter would need. So this stack banging should never ++ // trigger a fault. Verify that it does not on non product builds. + if (UseStackBanging) { + // Get total frame size for interpreted frames + __ ld(O2UnrollBlock, Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes(), O4); + __ bang_stack_size(O4, O3, G3_scratch); + } ++#endif + + __ ld(O2UnrollBlock, Deoptimization::UnrollBlock::number_of_frames_offset_in_bytes(), O4array_size); + __ ld_ptr(O2UnrollBlock, Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes(), G3pcs); +@@ -3407,9 +3412,11 @@ + ResourceMark rm; + // setup code generation tools + int pad = VerifyThread ? 512 : 0;// Extra slop space for more verify code ++#ifdef ASSERT + if (UseStackBanging) { + pad += StackShadowPages*16 + 32; + } ++#endif + #ifdef _LP64 + CodeBuffer buffer("deopt_blob", 2100+pad, 512); + #else +@@ -3630,9 +3637,11 @@ + ResourceMark rm; + // setup code generation tools + int pad = VerifyThread ? 512 : 0; ++#ifdef ASSERT + if (UseStackBanging) { + pad += StackShadowPages*16 + 32; + } ++#endif + #ifdef _LP64 + CodeBuffer buffer("uncommon_trap_blob", 2700+pad, 512); + #else +--- ./hotspot/src/cpu/sparc/vm/sparc.ad Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/sparc.ad Wed Jul 30 03:51:43 2014 -0700 +@@ -457,6 +457,13 @@ + // This is a block of C++ code which provides values, functions, and + // definitions necessary in the rest of the architecture description + source_hpp %{ ++// Header information of the source block. ++// Method declarations/definitions which are used outside ++// the ad-scope can conveniently be defined here. ++// ++// To keep related declarations/definitions/uses close together, ++// we switch between source %{ }% and source_hpp %{ }% freely as needed. ++ + // Must be visible to the DFA in dfa_sparc.cpp + extern bool can_branch_register( Node *bol, Node *cmp ); + +@@ -468,6 +475,46 @@ + #define LONG_HI_REG(x) (x) + #define LONG_LO_REG(x) (x) + ++class CallStubImpl { ++ ++ //-------------------------------------------------------------- ++ //---< Used for optimization in Compile::Shorten_branches >--- ++ //-------------------------------------------------------------- ++ ++ public: ++ // Size of call trampoline stub. ++ static uint size_call_trampoline() { ++ return 0; // no call trampolines on this platform ++ } ++ ++ // number of relocations needed by a call trampoline stub ++ static uint reloc_call_trampoline() { ++ return 0; // no call trampolines on this platform ++ } ++}; ++ ++class HandlerImpl { ++ ++ public: ++ ++ static int emit_exception_handler(CodeBuffer &cbuf); ++ static int emit_deopt_handler(CodeBuffer& cbuf); ++ ++ static uint size_exception_handler() { ++ if (TraceJumps) { ++ return (400); // just a guess ++ } ++ return ( NativeJump::instruction_size ); // sethi;jmp;nop ++ } ++ ++ static uint size_deopt_handler() { ++ if (TraceJumps) { ++ return (400); // just a guess ++ } ++ return ( 4+ NativeJump::instruction_size ); // save;sethi;jmp;restore ++ } ++}; ++ + %} + + source %{ +@@ -1040,6 +1087,11 @@ + } + } + ++bool MachConstantBaseNode::requires_postalloc_expand() const { return false; } ++void MachConstantBaseNode::postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_) { ++ ShouldNotReachHere(); ++} ++ + void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const { + Compile* C = ra_->C; + Compile::ConstantTable& constant_table = C->constant_table(); +@@ -1141,15 +1193,16 @@ + st->print_cr("Verify_Thread"); st->print("\t"); + } + +- size_t framesize = C->frame_slots() << LogBytesPerInt; ++ size_t framesize = C->frame_size_in_bytes(); ++ int bangsize = C->bang_size_in_bytes(); + + // Calls to C2R adapters often do not accept exceptional returns. + // We require that their callers must bang for them. But be careful, because + // some VM calls (such as call site linkage) can use several kilobytes of + // stack. But the stack safety zone should account for that. + // See bugs 4446381, 4468289, 4497237. +- if (C->need_stack_bang(framesize)) { +- st->print_cr("! stack bang"); st->print("\t"); ++ if (C->need_stack_bang(bangsize)) { ++ st->print_cr("! stack bang (%d bytes)", bangsize); st->print("\t"); + } + + if (Assembler::is_simm13(-framesize)) { +@@ -1173,17 +1226,18 @@ + + __ verify_thread(); + +- size_t framesize = C->frame_slots() << LogBytesPerInt; ++ size_t framesize = C->frame_size_in_bytes(); + assert(framesize >= 16*wordSize, "must have room for reg. save area"); + assert(framesize%(2*wordSize) == 0, "must preserve 2*wordSize alignment"); ++ int bangsize = C->bang_size_in_bytes(); + + // Calls to C2R adapters often do not accept exceptional returns. + // We require that their callers must bang for them. But be careful, because + // some VM calls (such as call site linkage) can use several kilobytes of + // stack. But the stack safety zone should account for that. + // See bugs 4446381, 4468289, 4497237. +- if (C->need_stack_bang(framesize)) { +- __ generate_stack_overflow_check(framesize); ++ if (C->need_stack_bang(bangsize)) { ++ __ generate_stack_overflow_check(bangsize); + } + + if (Assembler::is_simm13(-framesize)) { +@@ -1216,7 +1270,7 @@ + void MachEpilogNode::format( PhaseRegAlloc *ra_, outputStream *st ) const { + Compile* C = ra_->C; + +- if( do_polling() && ra_->C->is_method_compilation() ) { ++ if(do_polling() && ra_->C->is_method_compilation()) { + st->print("SETHI #PollAddr,L0\t! Load Polling address\n\t"); + #ifdef _LP64 + st->print("LDX [L0],G0\t!Poll for Safepointing\n\t"); +@@ -1225,8 +1279,12 @@ + #endif + } + +- if( do_polling() ) ++ if(do_polling()) { ++ if (UseCBCond && !ra_->C->is_method_compilation()) { ++ st->print("NOP\n\t"); ++ } + st->print("RET\n\t"); ++ } + + st->print("RESTORE"); + } +@@ -1239,15 +1297,20 @@ + __ verify_thread(); + + // If this does safepoint polling, then do it here +- if( do_polling() && ra_->C->is_method_compilation() ) { ++ if(do_polling() && ra_->C->is_method_compilation()) { + AddressLiteral polling_page(os::get_polling_page()); + __ sethi(polling_page, L0); + __ relocate(relocInfo::poll_return_type); +- __ ld_ptr( L0, 0, G0 ); ++ __ ld_ptr(L0, 0, G0); + } + + // If this is a return, then stuff the restore in the delay slot +- if( do_polling() ) { ++ if(do_polling()) { ++ if (UseCBCond && !ra_->C->is_method_compilation()) { ++ // Insert extra padding for the case when the epilogue is preceded by ++ // a cbcond jump, which can't be followed by a CTI instruction ++ __ nop(); ++ } + __ ret(); + __ delayed()->restore(); + } else { +@@ -1705,22 +1768,9 @@ + + //============================================================================= + +-uint size_exception_handler() { +- if (TraceJumps) { +- return (400); // just a guess +- } +- return ( NativeJump::instruction_size ); // sethi;jmp;nop +-} +- +-uint size_deopt_handler() { +- if (TraceJumps) { +- return (400); // just a guess +- } +- return ( 4+ NativeJump::instruction_size ); // save;sethi;jmp;restore +-} + + // Emit exception handler code. +-int emit_exception_handler(CodeBuffer& cbuf) { ++int HandlerImpl::emit_exception_handler(CodeBuffer& cbuf) { + Register temp_reg = G3; + AddressLiteral exception_blob(OptoRuntime::exception_blob()->entry_point()); + MacroAssembler _masm(&cbuf); +@@ -1741,7 +1791,7 @@ + return offset; + } + +-int emit_deopt_handler(CodeBuffer& cbuf) { ++int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf) { + // Can't use any of the current frame's registers as we may have deopted + // at a poll and everything (including G3) can be live. + Register temp_reg = L0; +@@ -1848,6 +1898,12 @@ + return false; + } + ++// Current (2013) SPARC platforms need to read original key ++// to construct decryption expanded key ++const bool Matcher::pass_original_key_for_aes() { ++ return true; ++} ++ + // USII supports fxtof through the whole range of number, USIII doesn't + const bool Matcher::convL2FSupported(void) { + return VM_Version::has_fast_fxtof(); +@@ -1885,6 +1941,9 @@ + return (VM_Version::is_T4() || VM_Version::is_sparc64()) ? ConditionalMoveLimit : 0; + } + ++// Does the CPU require late expand (see block.cpp for description of late expand)? ++const bool Matcher::require_postalloc_expand = false; ++ + // Should the Matcher clone shifts on addressing modes, expecting them to + // be subsumed into complex addressing expressions or compute them into + // registers? True for Intel but false for most RISCs +@@ -2023,19 +2082,6 @@ + return L7_REGP_mask(); + } + +-const RegMask Matcher::mathExactI_result_proj_mask() { +- return G1_REGI_mask(); +-} +- +-const RegMask Matcher::mathExactL_result_proj_mask() { +- return G1_REGL_mask(); +-} +- +-const RegMask Matcher::mathExactI_flags_proj_mask() { +- return INT_FLAGS_mask(); +-} +- +- + %} + + +@@ -2503,7 +2549,7 @@ + enc_class call_epilog %{ + if( VerifyStackAtCalls ) { + MacroAssembler _masm(&cbuf); +- int framesize = ra_->C->frame_slots() << LogBytesPerInt; ++ int framesize = ra_->C->frame_size_in_bytes(); + Register temp_reg = G3; + __ add(SP, framesize, temp_reg); + __ cmp(temp_reg, FP); +@@ -3242,7 +3288,7 @@ + // C. + c_calling_convention %{ + // This is obviously always outgoing +- (void) SharedRuntime::c_calling_convention(sig_bt, regs, length); ++ (void) SharedRuntime::c_calling_convention(sig_bt, regs, /*regs2=*/NULL, length); + %} + + // Location of native (C/C++) and interpreter return values. This is specified to +@@ -3295,7 +3341,18 @@ + //----------Instruction Attributes--------------------------------------------- + ins_attrib ins_cost(DEFAULT_COST); // Required cost attribute + ins_attrib ins_size(32); // Required size attribute (in bits) +-ins_attrib ins_avoid_back_to_back(0); // instruction should not be generated back to back ++ ++// avoid_back_to_back attribute is an expression that must return ++// one of the following values defined in MachNode: ++// AVOID_NONE - instruction can be placed anywhere ++// AVOID_BEFORE - instruction cannot be placed after an ++// instruction with MachNode::AVOID_AFTER ++// AVOID_AFTER - the next instruction cannot be the one ++// with MachNode::AVOID_BEFORE ++// AVOID_BEFORE_AND_AFTER - BEFORE and AFTER attributes at ++// the same time ++ins_attrib ins_avoid_back_to_back(MachNode::AVOID_NONE); ++ + ins_attrib ins_short_branch(0); // Required flag: is this instruction a + // non-matching short branch variant of some + // long branch? +@@ -6595,6 +6652,7 @@ + ins_encode %{ + __ encode_heap_oop($src$$Register, $dst$$Register); + %} ++ ins_avoid_back_to_back(Universe::narrow_oop_base() == NULL ? AVOID_NONE : AVOID_BEFORE); + ins_pipe(ialu_reg); + %} + +@@ -6653,6 +6711,7 @@ + + instruct membar_acquire() %{ + match(MemBarAcquire); ++ match(LoadFence); + ins_cost(4*MEMORY_REF_COST); + + size(0); +@@ -6673,6 +6732,7 @@ + + instruct membar_release() %{ + match(MemBarRelease); ++ match(StoreFence); + ins_cost(4*MEMORY_REF_COST); + + size(0); +@@ -9162,6 +9222,7 @@ + __ ba(*L); + __ delayed()->nop(); + %} ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br); + %} + +@@ -9174,13 +9235,13 @@ + size(4); + ins_cost(BRANCH_COST); + format %{ "BA $labl\t! short branch" %} +- ins_encode %{ ++ ins_encode %{ + Label* L = $labl$$label; + assert(__ use_cbcond(*L), "back to back cbcond"); + __ ba_short(*L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_imm); + %} + +@@ -9194,6 +9255,7 @@ + format %{ "BP$cmp $icc,$labl" %} + // Prim = bits 24-22, Secnd = bits 31-30 + ins_encode( enc_bp( labl, cmp, icc ) ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_cc); + %} + +@@ -9205,6 +9267,7 @@ + format %{ "BP$cmp $icc,$labl" %} + // Prim = bits 24-22, Secnd = bits 31-30 + ins_encode( enc_bp( labl, cmp, icc ) ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_cc); + %} + +@@ -9223,6 +9286,7 @@ + __ bp( (Assembler::Condition)($cmp$$cmpcode), false, Assembler::ptr_cc, predict_taken, *L); + __ delayed()->nop(); + %} ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_cc); + %} + +@@ -9241,6 +9305,7 @@ + __ fbp( (Assembler::Condition)($cmp$$cmpcode), false, (Assembler::CC)($fcc$$reg), predict_taken, *L); + __ delayed()->nop(); + %} ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_fcc); + %} + +@@ -9253,6 +9318,7 @@ + format %{ "BP$cmp $icc,$labl\t! Loop end" %} + // Prim = bits 24-22, Secnd = bits 31-30 + ins_encode( enc_bp( labl, cmp, icc ) ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_cc); + %} + +@@ -9265,6 +9331,7 @@ + format %{ "BP$cmp $icc,$labl\t! Loop end" %} + // Prim = bits 24-22, Secnd = bits 31-30 + ins_encode( enc_bp( labl, cmp, icc ) ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_cc); + %} + +@@ -9515,7 +9582,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::icc, $op1$$Register, $op2$$Register, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_reg); + %} + +@@ -9533,7 +9600,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::icc, $op1$$Register, $op2$$constant, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_imm); + %} + +@@ -9551,7 +9618,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::icc, $op1$$Register, $op2$$Register, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_reg); + %} + +@@ -9569,7 +9636,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::icc, $op1$$Register, $op2$$constant, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_imm); + %} + +@@ -9587,7 +9654,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::xcc, $op1$$Register, $op2$$Register, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_reg); + %} + +@@ -9605,7 +9672,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::xcc, $op1$$Register, $op2$$constant, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_imm); + %} + +@@ -9628,7 +9695,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::ptr_cc, $op1$$Register, $op2$$Register, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_reg); + %} + +@@ -9650,7 +9717,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::ptr_cc, $op1$$Register, G0, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_reg); + %} + +@@ -9668,7 +9735,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::icc, $op1$$Register, $op2$$Register, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_reg); + %} + +@@ -9686,7 +9753,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::icc, $op1$$Register, G0, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_reg); + %} + +@@ -9705,7 +9772,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::icc, $op1$$Register, $op2$$Register, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_reg); + %} + +@@ -9723,7 +9790,7 @@ + __ cbcond((Assembler::Condition)($cmp$$cmpcode), Assembler::icc, $op1$$Register, $op2$$constant, *L); + %} + ins_short_branch(1); +- ins_avoid_back_to_back(1); ++ ins_avoid_back_to_back(AVOID_BEFORE_AND_AFTER); + ins_pipe(cbcond_reg_imm); + %} + +@@ -9740,6 +9807,7 @@ + ins_cost(BRANCH_COST); + format %{ "BR$cmp $op1,$labl" %} + ins_encode( enc_bpr( labl, cmp, op1 ) ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_reg); + %} + +@@ -9752,6 +9820,7 @@ + ins_cost(BRANCH_COST); + format %{ "BR$cmp $op1,$labl" %} + ins_encode( enc_bpr( labl, cmp, op1 ) ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_reg); + %} + +@@ -9764,6 +9833,7 @@ + ins_cost(BRANCH_COST); + format %{ "BR$cmp $op1,$labl" %} + ins_encode( enc_bpr( labl, cmp, op1 ) ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_reg); + %} + +@@ -9804,6 +9874,7 @@ + __ bp( (Assembler::Condition)($cmp$$cmpcode), false, Assembler::xcc, predict_taken, *L); + __ delayed()->nop(); + %} ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(br_cc); + %} + +@@ -9931,6 +10002,7 @@ + ins_cost(CALL_COST); + format %{ "CALL,static ; NOP ==> " %} + ins_encode( Java_Static_Call( meth ), call_epilog ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(simple_call); + %} + +@@ -9967,6 +10039,7 @@ + format %{ "CALL,runtime" %} + ins_encode( Java_To_Runtime( meth ), + call_epilog, adjust_long_from_native_call ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(simple_call); + %} + +@@ -9979,6 +10052,7 @@ + ins_encode( Java_To_Runtime( meth ), + call_epilog, + adjust_long_from_native_call ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(simple_call); + %} + +@@ -9991,6 +10065,7 @@ + ins_encode( Java_To_Runtime( meth ), + call_epilog, + adjust_long_from_native_call ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(simple_call); + %} + +@@ -10004,6 +10079,7 @@ + ins_cost(CALL_COST); + format %{ "Jmp $jump_target ; NOP \t! $method_oop holds method oop" %} + ins_encode(form_jmpl(jump_target)); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(tail_call); + %} + +@@ -10035,6 +10111,7 @@ + // opcode(Assembler::jmpl_op3, Assembler::arith_op); + // The hack duplicates the exception oop into G3, so that CreateEx can use it there. + // ins_encode( form3_rs1_simm13_rd( jump_target, 0x00, R_G0 ), move_return_pc_to_o1() ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(tail_call); + %} + +@@ -10065,6 +10142,7 @@ + // use the following format syntax + format %{ "Jmp rethrow_stub" %} + ins_encode(enc_rethrow); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(tail_call); + %} + +@@ -10093,6 +10171,7 @@ + ins_cost(DEFAULT_COST*10); + format %{ "CALL PartialSubtypeCheck\n\tNOP" %} + ins_encode( enc_PartialSubtypeCheck() ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(partial_subtype_check_pipe); + %} + +@@ -10102,6 +10181,7 @@ + ins_cost(DEFAULT_COST*10); + format %{ "CALL PartialSubtypeCheck\n\tNOP\t# (sets condition codes)" %} + ins_encode( enc_PartialSubtypeCheck() ); ++ ins_avoid_back_to_back(AVOID_BEFORE); + ins_pipe(partial_subtype_check_pipe); + %} + +--- ./hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -83,7 +83,7 @@ + private: + + #ifdef PRODUCT +-#define inc_counter_np(a,b,c) (0) ++#define inc_counter_np(a,b,c) + #else + #define inc_counter_np(counter, t1, t2) \ + BLOCK_COMMENT("inc_counter " #counter); \ +@@ -1055,7 +1055,7 @@ + Label& L_loop, bool use_prefetch, bool use_bis); + + void disjoint_copy_core(Register from, Register to, Register count, int log2_elem_size, +- int iter_size, CopyLoopFunc copy_loop_func) { ++ int iter_size, StubGenerator::CopyLoopFunc copy_loop_func) { + Label L_copy; + + assert(log2_elem_size <= 3, "the following code should be changed"); +@@ -1206,7 +1206,7 @@ + __ inc(from, 8); + __ sllx(O3, left_shift, O3); + +- disjoint_copy_core(from, to, count, log2_elem_size, 16, copy_16_bytes_shift_loop); ++ disjoint_copy_core(from, to, count, log2_elem_size, 16, &StubGenerator::copy_16_bytes_shift_loop); + + __ inccc(count, count_dec>>1 ); // + 8 bytes + __ brx(Assembler::negative, true, Assembler::pn, L_copy_last_bytes); +@@ -2085,7 +2085,7 @@ + __ dec(count, 4); // The cmp at the beginning guaranty count >= 4 + __ sllx(O3, 32, O3); + +- disjoint_copy_core(from, to, count, 2, 16, copy_16_bytes_loop); ++ disjoint_copy_core(from, to, count, 2, 16, &StubGenerator::copy_16_bytes_loop); + + __ br(Assembler::always, false, Assembler::pt, L_copy_4_bytes); + __ delayed()->inc(count, 4); // restore 'count' +@@ -2366,7 +2366,7 @@ + // count >= 0 (original count - 8) + __ mov(from, from64); + +- disjoint_copy_core(from64, to64, count, 3, 64, copy_64_bytes_loop); ++ disjoint_copy_core(from64, to64, count, 3, 64, &StubGenerator::copy_64_bytes_loop); + + // Restore O4(offset0), O5(offset8) + __ sub(from64, from, offset0); +@@ -3304,6 +3304,1277 @@ + } + } + ++ address generate_aescrypt_encryptBlock() { ++ // required since we read expanded key 'int' array starting first element without alignment considerations ++ assert((arrayOopDesc::base_offset_in_bytes(T_INT) & 7) == 0, ++ "the following code assumes that first element of an int array is aligned to 8 bytes"); ++ __ align(CodeEntryAlignment); ++ StubCodeMark mark(this, "StubRoutines", "aescrypt_encryptBlock"); ++ Label L_load_misaligned_input, L_load_expanded_key, L_doLast128bit, L_storeOutput, L_store_misaligned_output; ++ address start = __ pc(); ++ Register from = O0; // source byte array ++ Register to = O1; // destination byte array ++ Register key = O2; // expanded key array ++ const Register keylen = O4; //reg for storing expanded key array length ++ ++ // read expanded key length ++ __ ldsw(Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)), keylen, 0); ++ ++ // Method to address arbitrary alignment for load instructions: ++ // Check last 3 bits of 'from' address to see if it is aligned to 8-byte boundary ++ // If zero/aligned then continue with double FP load instructions ++ // If not zero/mis-aligned then alignaddr will set GSR.align with number of bytes to skip during faligndata ++ // alignaddr will also convert arbitrary aligned 'from' address to nearest 8-byte aligned address ++ // load 3 * 8-byte components (to read 16 bytes input) in 3 different FP regs starting at this aligned address ++ // faligndata will then extract (based on GSR.align value) the appropriate 8 bytes from the 2 source regs ++ ++ // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input); ++ __ delayed()->alignaddr(from, G0, from); ++ ++ // aligned case: load input into F54-F56 ++ __ ldf(FloatRegisterImpl::D, from, 0, F54); ++ __ ldf(FloatRegisterImpl::D, from, 8, F56); ++ __ ba_short(L_load_expanded_key); ++ ++ __ BIND(L_load_misaligned_input); ++ __ ldf(FloatRegisterImpl::D, from, 0, F54); ++ __ ldf(FloatRegisterImpl::D, from, 8, F56); ++ __ ldf(FloatRegisterImpl::D, from, 16, F58); ++ __ faligndata(F54, F56, F54); ++ __ faligndata(F56, F58, F56); ++ ++ __ BIND(L_load_expanded_key); ++ // Since we load expanded key buffers starting first element, 8-byte alignment is guaranteed ++ for ( int i = 0; i <= 38; i += 2 ) { ++ __ ldf(FloatRegisterImpl::D, key, i*4, as_FloatRegister(i)); ++ } ++ ++ // perform cipher transformation ++ __ fxor(FloatRegisterImpl::D, F0, F54, F54); ++ __ fxor(FloatRegisterImpl::D, F2, F56, F56); ++ // rounds 1 through 8 ++ for ( int i = 4; i <= 28; i += 8 ) { ++ __ aes_eround01(as_FloatRegister(i), F54, F56, F58); ++ __ aes_eround23(as_FloatRegister(i+2), F54, F56, F60); ++ __ aes_eround01(as_FloatRegister(i+4), F58, F60, F54); ++ __ aes_eround23(as_FloatRegister(i+6), F58, F60, F56); ++ } ++ __ aes_eround01(F36, F54, F56, F58); //round 9 ++ __ aes_eround23(F38, F54, F56, F60); ++ ++ // 128-bit original key size ++ __ cmp_and_brx_short(keylen, 44, Assembler::equal, Assembler::pt, L_doLast128bit); ++ ++ for ( int i = 40; i <= 50; i += 2 ) { ++ __ ldf(FloatRegisterImpl::D, key, i*4, as_FloatRegister(i) ); ++ } ++ __ aes_eround01(F40, F58, F60, F54); //round 10 ++ __ aes_eround23(F42, F58, F60, F56); ++ __ aes_eround01(F44, F54, F56, F58); //round 11 ++ __ aes_eround23(F46, F54, F56, F60); ++ ++ // 192-bit original key size ++ __ cmp_and_brx_short(keylen, 52, Assembler::equal, Assembler::pt, L_storeOutput); ++ ++ __ ldf(FloatRegisterImpl::D, key, 208, F52); ++ __ aes_eround01(F48, F58, F60, F54); //round 12 ++ __ aes_eround23(F50, F58, F60, F56); ++ __ ldf(FloatRegisterImpl::D, key, 216, F46); ++ __ ldf(FloatRegisterImpl::D, key, 224, F48); ++ __ ldf(FloatRegisterImpl::D, key, 232, F50); ++ __ aes_eround01(F52, F54, F56, F58); //round 13 ++ __ aes_eround23(F46, F54, F56, F60); ++ __ ba_short(L_storeOutput); ++ ++ __ BIND(L_doLast128bit); ++ __ ldf(FloatRegisterImpl::D, key, 160, F48); ++ __ ldf(FloatRegisterImpl::D, key, 168, F50); ++ ++ __ BIND(L_storeOutput); ++ // perform last round of encryption common for all key sizes ++ __ aes_eround01_l(F48, F58, F60, F54); //last round ++ __ aes_eround23_l(F50, F58, F60, F56); ++ ++ // Method to address arbitrary alignment for store instructions: ++ // Check last 3 bits of 'dest' address to see if it is aligned to 8-byte boundary ++ // If zero/aligned then continue with double FP store instructions ++ // If not zero/mis-aligned then edge8n will generate edge mask in result reg (O3 in below case) ++ // Example: If dest address is 0x07 and nearest 8-byte aligned address is 0x00 then edge mask will be 00000001 ++ // Compute (8-n) where n is # of bytes skipped by partial store(stpartialf) inst from edge mask, n=7 in this case ++ // We get the value of n from the andcc that checks 'dest' alignment. n is available in O5 in below case. ++ // Set GSR.align to (8-n) using alignaddr ++ // Circular byte shift store values by n places so that the original bytes are at correct position for stpartialf ++ // Set the arbitrarily aligned 'dest' address to nearest 8-byte aligned address ++ // Store (partial) the original first (8-n) bytes starting at the original 'dest' address ++ // Negate the edge mask so that the subsequent stpartialf can store the original (8-n-1)th through 8th bytes at appropriate address ++ // We need to execute this process for both the 8-byte result values ++ ++ // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(to, 7, O5); ++ __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output); ++ __ delayed()->edge8n(to, G0, O3); ++ ++ // aligned case: store output into the destination array ++ __ stf(FloatRegisterImpl::D, F54, to, 0); ++ __ retl(); ++ __ delayed()->stf(FloatRegisterImpl::D, F56, to, 8); ++ ++ __ BIND(L_store_misaligned_output); ++ __ add(to, 8, O4); ++ __ mov(8, O2); ++ __ sub(O2, O5, O2); ++ __ alignaddr(O2, G0, O2); ++ __ faligndata(F54, F54, F54); ++ __ faligndata(F56, F56, F56); ++ __ and3(to, -8, to); ++ __ and3(O4, -8, O4); ++ __ stpartialf(to, O3, F54, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(O4, O3, F56, Assembler::ASI_PST8_PRIMARY); ++ __ add(to, 8, to); ++ __ add(O4, 8, O4); ++ __ orn(G0, O3, O3); ++ __ stpartialf(to, O3, F54, Assembler::ASI_PST8_PRIMARY); ++ __ retl(); ++ __ delayed()->stpartialf(O4, O3, F56, Assembler::ASI_PST8_PRIMARY); ++ ++ return start; ++ } ++ ++ address generate_aescrypt_decryptBlock() { ++ assert((arrayOopDesc::base_offset_in_bytes(T_INT) & 7) == 0, ++ "the following code assumes that first element of an int array is aligned to 8 bytes"); ++ // required since we read original key 'byte' array as well in the decryption stubs ++ assert((arrayOopDesc::base_offset_in_bytes(T_BYTE) & 7) == 0, ++ "the following code assumes that first element of a byte array is aligned to 8 bytes"); ++ __ align(CodeEntryAlignment); ++ StubCodeMark mark(this, "StubRoutines", "aescrypt_decryptBlock"); ++ address start = __ pc(); ++ Label L_load_misaligned_input, L_load_original_key, L_expand192bit, L_expand256bit, L_reload_misaligned_input; ++ Label L_256bit_transform, L_common_transform, L_store_misaligned_output; ++ Register from = O0; // source byte array ++ Register to = O1; // destination byte array ++ Register key = O2; // expanded key array ++ Register original_key = O3; // original key array only required during decryption ++ const Register keylen = O4; // reg for storing expanded key array length ++ ++ // read expanded key array length ++ __ ldsw(Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)), keylen, 0); ++ ++ // save 'from' since we may need to recheck alignment in case of 256-bit decryption ++ __ mov(from, G1); ++ ++ // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input); ++ __ delayed()->alignaddr(from, G0, from); ++ ++ // aligned case: load input into F52-F54 ++ __ ldf(FloatRegisterImpl::D, from, 0, F52); ++ __ ldf(FloatRegisterImpl::D, from, 8, F54); ++ __ ba_short(L_load_original_key); ++ ++ __ BIND(L_load_misaligned_input); ++ __ ldf(FloatRegisterImpl::D, from, 0, F52); ++ __ ldf(FloatRegisterImpl::D, from, 8, F54); ++ __ ldf(FloatRegisterImpl::D, from, 16, F56); ++ __ faligndata(F52, F54, F52); ++ __ faligndata(F54, F56, F54); ++ ++ __ BIND(L_load_original_key); ++ // load original key from SunJCE expanded decryption key ++ // Since we load original key buffer starting first element, 8-byte alignment is guaranteed ++ for ( int i = 0; i <= 3; i++ ) { ++ __ ldf(FloatRegisterImpl::S, original_key, i*4, as_FloatRegister(i)); ++ } ++ ++ // 256-bit original key size ++ __ cmp_and_brx_short(keylen, 60, Assembler::equal, Assembler::pn, L_expand256bit); ++ ++ // 192-bit original key size ++ __ cmp_and_brx_short(keylen, 52, Assembler::equal, Assembler::pn, L_expand192bit); ++ ++ // 128-bit original key size ++ // perform key expansion since SunJCE decryption-key expansion is not compatible with SPARC crypto instructions ++ for ( int i = 0; i <= 36; i += 4 ) { ++ __ aes_kexpand1(as_FloatRegister(i), as_FloatRegister(i+2), i/4, as_FloatRegister(i+4)); ++ __ aes_kexpand2(as_FloatRegister(i+2), as_FloatRegister(i+4), as_FloatRegister(i+6)); ++ } ++ ++ // perform 128-bit key specific inverse cipher transformation ++ __ fxor(FloatRegisterImpl::D, F42, F54, F54); ++ __ fxor(FloatRegisterImpl::D, F40, F52, F52); ++ __ ba_short(L_common_transform); ++ ++ __ BIND(L_expand192bit); ++ ++ // start loading rest of the 192-bit key ++ __ ldf(FloatRegisterImpl::S, original_key, 16, F4); ++ __ ldf(FloatRegisterImpl::S, original_key, 20, F5); ++ ++ // perform key expansion since SunJCE decryption-key expansion is not compatible with SPARC crypto instructions ++ for ( int i = 0; i <= 36; i += 6 ) { ++ __ aes_kexpand1(as_FloatRegister(i), as_FloatRegister(i+4), i/6, as_FloatRegister(i+6)); ++ __ aes_kexpand2(as_FloatRegister(i+2), as_FloatRegister(i+6), as_FloatRegister(i+8)); ++ __ aes_kexpand2(as_FloatRegister(i+4), as_FloatRegister(i+8), as_FloatRegister(i+10)); ++ } ++ __ aes_kexpand1(F42, F46, 7, F48); ++ __ aes_kexpand2(F44, F48, F50); ++ ++ // perform 192-bit key specific inverse cipher transformation ++ __ fxor(FloatRegisterImpl::D, F50, F54, F54); ++ __ fxor(FloatRegisterImpl::D, F48, F52, F52); ++ __ aes_dround23(F46, F52, F54, F58); ++ __ aes_dround01(F44, F52, F54, F56); ++ __ aes_dround23(F42, F56, F58, F54); ++ __ aes_dround01(F40, F56, F58, F52); ++ __ ba_short(L_common_transform); ++ ++ __ BIND(L_expand256bit); ++ ++ // load rest of the 256-bit key ++ for ( int i = 4; i <= 7; i++ ) { ++ __ ldf(FloatRegisterImpl::S, original_key, i*4, as_FloatRegister(i)); ++ } ++ ++ // perform key expansion since SunJCE decryption-key expansion is not compatible with SPARC crypto instructions ++ for ( int i = 0; i <= 40; i += 8 ) { ++ __ aes_kexpand1(as_FloatRegister(i), as_FloatRegister(i+6), i/8, as_FloatRegister(i+8)); ++ __ aes_kexpand2(as_FloatRegister(i+2), as_FloatRegister(i+8), as_FloatRegister(i+10)); ++ __ aes_kexpand0(as_FloatRegister(i+4), as_FloatRegister(i+10), as_FloatRegister(i+12)); ++ __ aes_kexpand2(as_FloatRegister(i+6), as_FloatRegister(i+12), as_FloatRegister(i+14)); ++ } ++ __ aes_kexpand1(F48, F54, 6, F56); ++ __ aes_kexpand2(F50, F56, F58); ++ ++ for ( int i = 0; i <= 6; i += 2 ) { ++ __ fsrc2(FloatRegisterImpl::D, as_FloatRegister(58-i), as_FloatRegister(i)); ++ } ++ ++ // reload original 'from' address ++ __ mov(G1, from); ++ ++ // re-check 8-byte alignment ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_reload_misaligned_input); ++ __ delayed()->alignaddr(from, G0, from); ++ ++ // aligned case: load input into F52-F54 ++ __ ldf(FloatRegisterImpl::D, from, 0, F52); ++ __ ldf(FloatRegisterImpl::D, from, 8, F54); ++ __ ba_short(L_256bit_transform); ++ ++ __ BIND(L_reload_misaligned_input); ++ __ ldf(FloatRegisterImpl::D, from, 0, F52); ++ __ ldf(FloatRegisterImpl::D, from, 8, F54); ++ __ ldf(FloatRegisterImpl::D, from, 16, F56); ++ __ faligndata(F52, F54, F52); ++ __ faligndata(F54, F56, F54); ++ ++ // perform 256-bit key specific inverse cipher transformation ++ __ BIND(L_256bit_transform); ++ __ fxor(FloatRegisterImpl::D, F0, F54, F54); ++ __ fxor(FloatRegisterImpl::D, F2, F52, F52); ++ __ aes_dround23(F4, F52, F54, F58); ++ __ aes_dround01(F6, F52, F54, F56); ++ __ aes_dround23(F50, F56, F58, F54); ++ __ aes_dround01(F48, F56, F58, F52); ++ __ aes_dround23(F46, F52, F54, F58); ++ __ aes_dround01(F44, F52, F54, F56); ++ __ aes_dround23(F42, F56, F58, F54); ++ __ aes_dround01(F40, F56, F58, F52); ++ ++ for ( int i = 0; i <= 7; i++ ) { ++ __ ldf(FloatRegisterImpl::S, original_key, i*4, as_FloatRegister(i)); ++ } ++ ++ // perform inverse cipher transformations common for all key sizes ++ __ BIND(L_common_transform); ++ for ( int i = 38; i >= 6; i -= 8 ) { ++ __ aes_dround23(as_FloatRegister(i), F52, F54, F58); ++ __ aes_dround01(as_FloatRegister(i-2), F52, F54, F56); ++ if ( i != 6) { ++ __ aes_dround23(as_FloatRegister(i-4), F56, F58, F54); ++ __ aes_dround01(as_FloatRegister(i-6), F56, F58, F52); ++ } else { ++ __ aes_dround23_l(as_FloatRegister(i-4), F56, F58, F54); ++ __ aes_dround01_l(as_FloatRegister(i-6), F56, F58, F52); ++ } ++ } ++ ++ // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(to, 7, O5); ++ __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output); ++ __ delayed()->edge8n(to, G0, O3); ++ ++ // aligned case: store output into the destination array ++ __ stf(FloatRegisterImpl::D, F52, to, 0); ++ __ retl(); ++ __ delayed()->stf(FloatRegisterImpl::D, F54, to, 8); ++ ++ __ BIND(L_store_misaligned_output); ++ __ add(to, 8, O4); ++ __ mov(8, O2); ++ __ sub(O2, O5, O2); ++ __ alignaddr(O2, G0, O2); ++ __ faligndata(F52, F52, F52); ++ __ faligndata(F54, F54, F54); ++ __ and3(to, -8, to); ++ __ and3(O4, -8, O4); ++ __ stpartialf(to, O3, F52, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(O4, O3, F54, Assembler::ASI_PST8_PRIMARY); ++ __ add(to, 8, to); ++ __ add(O4, 8, O4); ++ __ orn(G0, O3, O3); ++ __ stpartialf(to, O3, F52, Assembler::ASI_PST8_PRIMARY); ++ __ retl(); ++ __ delayed()->stpartialf(O4, O3, F54, Assembler::ASI_PST8_PRIMARY); ++ ++ return start; ++ } ++ ++ address generate_cipherBlockChaining_encryptAESCrypt() { ++ assert((arrayOopDesc::base_offset_in_bytes(T_INT) & 7) == 0, ++ "the following code assumes that first element of an int array is aligned to 8 bytes"); ++ assert((arrayOopDesc::base_offset_in_bytes(T_BYTE) & 7) == 0, ++ "the following code assumes that first element of a byte array is aligned to 8 bytes"); ++ __ align(CodeEntryAlignment); ++ StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_encryptAESCrypt"); ++ Label L_cbcenc128, L_load_misaligned_input_128bit, L_128bit_transform, L_store_misaligned_output_128bit; ++ Label L_check_loop_end_128bit, L_cbcenc192, L_load_misaligned_input_192bit, L_192bit_transform; ++ Label L_store_misaligned_output_192bit, L_check_loop_end_192bit, L_cbcenc256, L_load_misaligned_input_256bit; ++ Label L_256bit_transform, L_store_misaligned_output_256bit, L_check_loop_end_256bit; ++ address start = __ pc(); ++ Register from = I0; // source byte array ++ Register to = I1; // destination byte array ++ Register key = I2; // expanded key array ++ Register rvec = I3; // init vector ++ const Register len_reg = I4; // cipher length ++ const Register keylen = I5; // reg for storing expanded key array length ++ ++ __ save_frame(0); ++ // save cipher len to return in the end ++ __ mov(len_reg, L0); ++ ++ // read expanded key length ++ __ ldsw(Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)), keylen, 0); ++ ++ // load initial vector, 8-byte alignment is guranteed ++ __ ldf(FloatRegisterImpl::D, rvec, 0, F60); ++ __ ldf(FloatRegisterImpl::D, rvec, 8, F62); ++ // load key, 8-byte alignment is guranteed ++ __ ldx(key,0,G1); ++ __ ldx(key,8,G5); ++ ++ // start loading expanded key, 8-byte alignment is guranteed ++ for ( int i = 0, j = 16; i <= 38; i += 2, j += 8 ) { ++ __ ldf(FloatRegisterImpl::D, key, j, as_FloatRegister(i)); ++ } ++ ++ // 128-bit original key size ++ __ cmp_and_brx_short(keylen, 44, Assembler::equal, Assembler::pt, L_cbcenc128); ++ ++ for ( int i = 40, j = 176; i <= 46; i += 2, j += 8 ) { ++ __ ldf(FloatRegisterImpl::D, key, j, as_FloatRegister(i)); ++ } ++ ++ // 192-bit original key size ++ __ cmp_and_brx_short(keylen, 52, Assembler::equal, Assembler::pt, L_cbcenc192); ++ ++ for ( int i = 48, j = 208; i <= 54; i += 2, j += 8 ) { ++ __ ldf(FloatRegisterImpl::D, key, j, as_FloatRegister(i)); ++ } ++ ++ // 256-bit original key size ++ __ ba_short(L_cbcenc256); ++ ++ __ align(OptoLoopAlignment); ++ __ BIND(L_cbcenc128); ++ // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input_128bit); ++ __ delayed()->mov(from, L1); // save original 'from' address before alignaddr ++ ++ // aligned case: load input into G3 and G4 ++ __ ldx(from,0,G3); ++ __ ldx(from,8,G4); ++ __ ba_short(L_128bit_transform); ++ ++ __ BIND(L_load_misaligned_input_128bit); ++ // can clobber F48, F50 and F52 as they are not used in 128 and 192-bit key encryption ++ __ alignaddr(from, G0, from); ++ __ ldf(FloatRegisterImpl::D, from, 0, F48); ++ __ ldf(FloatRegisterImpl::D, from, 8, F50); ++ __ ldf(FloatRegisterImpl::D, from, 16, F52); ++ __ faligndata(F48, F50, F48); ++ __ faligndata(F50, F52, F50); ++ __ movdtox(F48, G3); ++ __ movdtox(F50, G4); ++ __ mov(L1, from); ++ ++ __ BIND(L_128bit_transform); ++ __ xor3(G1,G3,G3); ++ __ xor3(G5,G4,G4); ++ __ movxtod(G3,F56); ++ __ movxtod(G4,F58); ++ __ fxor(FloatRegisterImpl::D, F60, F56, F60); ++ __ fxor(FloatRegisterImpl::D, F62, F58, F62); ++ ++ // TEN_EROUNDS ++ for ( int i = 0; i <= 32; i += 8 ) { ++ __ aes_eround01(as_FloatRegister(i), F60, F62, F56); ++ __ aes_eround23(as_FloatRegister(i+2), F60, F62, F58); ++ if (i != 32 ) { ++ __ aes_eround01(as_FloatRegister(i+4), F56, F58, F60); ++ __ aes_eround23(as_FloatRegister(i+6), F56, F58, F62); ++ } else { ++ __ aes_eround01_l(as_FloatRegister(i+4), F56, F58, F60); ++ __ aes_eround23_l(as_FloatRegister(i+6), F56, F58, F62); ++ } ++ } ++ ++ // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(to, 7, L1); ++ __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_128bit); ++ __ delayed()->edge8n(to, G0, L2); ++ ++ // aligned case: store output into the destination array ++ __ stf(FloatRegisterImpl::D, F60, to, 0); ++ __ stf(FloatRegisterImpl::D, F62, to, 8); ++ __ ba_short(L_check_loop_end_128bit); ++ ++ __ BIND(L_store_misaligned_output_128bit); ++ __ add(to, 8, L3); ++ __ mov(8, L4); ++ __ sub(L4, L1, L4); ++ __ alignaddr(L4, G0, L4); ++ // save cipher text before circular right shift ++ // as it needs to be stored as iv for next block (see code before next retl) ++ __ movdtox(F60, L6); ++ __ movdtox(F62, L7); ++ __ faligndata(F60, F60, F60); ++ __ faligndata(F62, F62, F62); ++ __ mov(to, L5); ++ __ and3(to, -8, to); ++ __ and3(L3, -8, L3); ++ __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); ++ __ add(to, 8, to); ++ __ add(L3, 8, L3); ++ __ orn(G0, L2, L2); ++ __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); ++ __ mov(L5, to); ++ __ movxtod(L6, F60); ++ __ movxtod(L7, F62); ++ ++ __ BIND(L_check_loop_end_128bit); ++ __ add(from, 16, from); ++ __ add(to, 16, to); ++ __ subcc(len_reg, 16, len_reg); ++ __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc128); ++ __ delayed()->nop(); ++ // re-init intial vector for next block, 8-byte alignment is guaranteed ++ __ stf(FloatRegisterImpl::D, F60, rvec, 0); ++ __ stf(FloatRegisterImpl::D, F62, rvec, 8); ++ __ mov(L0, I0); ++ __ ret(); ++ __ delayed()->restore(); ++ ++ __ align(OptoLoopAlignment); ++ __ BIND(L_cbcenc192); ++ // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input_192bit); ++ __ delayed()->mov(from, L1); // save original 'from' address before alignaddr ++ ++ // aligned case: load input into G3 and G4 ++ __ ldx(from,0,G3); ++ __ ldx(from,8,G4); ++ __ ba_short(L_192bit_transform); ++ ++ __ BIND(L_load_misaligned_input_192bit); ++ // can clobber F48, F50 and F52 as they are not used in 128 and 192-bit key encryption ++ __ alignaddr(from, G0, from); ++ __ ldf(FloatRegisterImpl::D, from, 0, F48); ++ __ ldf(FloatRegisterImpl::D, from, 8, F50); ++ __ ldf(FloatRegisterImpl::D, from, 16, F52); ++ __ faligndata(F48, F50, F48); ++ __ faligndata(F50, F52, F50); ++ __ movdtox(F48, G3); ++ __ movdtox(F50, G4); ++ __ mov(L1, from); ++ ++ __ BIND(L_192bit_transform); ++ __ xor3(G1,G3,G3); ++ __ xor3(G5,G4,G4); ++ __ movxtod(G3,F56); ++ __ movxtod(G4,F58); ++ __ fxor(FloatRegisterImpl::D, F60, F56, F60); ++ __ fxor(FloatRegisterImpl::D, F62, F58, F62); ++ ++ // TWELEVE_EROUNDS ++ for ( int i = 0; i <= 40; i += 8 ) { ++ __ aes_eround01(as_FloatRegister(i), F60, F62, F56); ++ __ aes_eround23(as_FloatRegister(i+2), F60, F62, F58); ++ if (i != 40 ) { ++ __ aes_eround01(as_FloatRegister(i+4), F56, F58, F60); ++ __ aes_eround23(as_FloatRegister(i+6), F56, F58, F62); ++ } else { ++ __ aes_eround01_l(as_FloatRegister(i+4), F56, F58, F60); ++ __ aes_eround23_l(as_FloatRegister(i+6), F56, F58, F62); ++ } ++ } ++ ++ // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(to, 7, L1); ++ __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_192bit); ++ __ delayed()->edge8n(to, G0, L2); ++ ++ // aligned case: store output into the destination array ++ __ stf(FloatRegisterImpl::D, F60, to, 0); ++ __ stf(FloatRegisterImpl::D, F62, to, 8); ++ __ ba_short(L_check_loop_end_192bit); ++ ++ __ BIND(L_store_misaligned_output_192bit); ++ __ add(to, 8, L3); ++ __ mov(8, L4); ++ __ sub(L4, L1, L4); ++ __ alignaddr(L4, G0, L4); ++ __ movdtox(F60, L6); ++ __ movdtox(F62, L7); ++ __ faligndata(F60, F60, F60); ++ __ faligndata(F62, F62, F62); ++ __ mov(to, L5); ++ __ and3(to, -8, to); ++ __ and3(L3, -8, L3); ++ __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); ++ __ add(to, 8, to); ++ __ add(L3, 8, L3); ++ __ orn(G0, L2, L2); ++ __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); ++ __ mov(L5, to); ++ __ movxtod(L6, F60); ++ __ movxtod(L7, F62); ++ ++ __ BIND(L_check_loop_end_192bit); ++ __ add(from, 16, from); ++ __ subcc(len_reg, 16, len_reg); ++ __ add(to, 16, to); ++ __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc192); ++ __ delayed()->nop(); ++ // re-init intial vector for next block, 8-byte alignment is guaranteed ++ __ stf(FloatRegisterImpl::D, F60, rvec, 0); ++ __ stf(FloatRegisterImpl::D, F62, rvec, 8); ++ __ mov(L0, I0); ++ __ ret(); ++ __ delayed()->restore(); ++ ++ __ align(OptoLoopAlignment); ++ __ BIND(L_cbcenc256); ++ // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input_256bit); ++ __ delayed()->mov(from, L1); // save original 'from' address before alignaddr ++ ++ // aligned case: load input into G3 and G4 ++ __ ldx(from,0,G3); ++ __ ldx(from,8,G4); ++ __ ba_short(L_256bit_transform); ++ ++ __ BIND(L_load_misaligned_input_256bit); ++ // cannot clobber F48, F50 and F52. F56, F58 can be used though ++ __ alignaddr(from, G0, from); ++ __ movdtox(F60, L2); // save F60 before overwriting ++ __ ldf(FloatRegisterImpl::D, from, 0, F56); ++ __ ldf(FloatRegisterImpl::D, from, 8, F58); ++ __ ldf(FloatRegisterImpl::D, from, 16, F60); ++ __ faligndata(F56, F58, F56); ++ __ faligndata(F58, F60, F58); ++ __ movdtox(F56, G3); ++ __ movdtox(F58, G4); ++ __ mov(L1, from); ++ __ movxtod(L2, F60); ++ ++ __ BIND(L_256bit_transform); ++ __ xor3(G1,G3,G3); ++ __ xor3(G5,G4,G4); ++ __ movxtod(G3,F56); ++ __ movxtod(G4,F58); ++ __ fxor(FloatRegisterImpl::D, F60, F56, F60); ++ __ fxor(FloatRegisterImpl::D, F62, F58, F62); ++ ++ // FOURTEEN_EROUNDS ++ for ( int i = 0; i <= 48; i += 8 ) { ++ __ aes_eround01(as_FloatRegister(i), F60, F62, F56); ++ __ aes_eround23(as_FloatRegister(i+2), F60, F62, F58); ++ if (i != 48 ) { ++ __ aes_eround01(as_FloatRegister(i+4), F56, F58, F60); ++ __ aes_eround23(as_FloatRegister(i+6), F56, F58, F62); ++ } else { ++ __ aes_eround01_l(as_FloatRegister(i+4), F56, F58, F60); ++ __ aes_eround23_l(as_FloatRegister(i+6), F56, F58, F62); ++ } ++ } ++ ++ // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(to, 7, L1); ++ __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_256bit); ++ __ delayed()->edge8n(to, G0, L2); ++ ++ // aligned case: store output into the destination array ++ __ stf(FloatRegisterImpl::D, F60, to, 0); ++ __ stf(FloatRegisterImpl::D, F62, to, 8); ++ __ ba_short(L_check_loop_end_256bit); ++ ++ __ BIND(L_store_misaligned_output_256bit); ++ __ add(to, 8, L3); ++ __ mov(8, L4); ++ __ sub(L4, L1, L4); ++ __ alignaddr(L4, G0, L4); ++ __ movdtox(F60, L6); ++ __ movdtox(F62, L7); ++ __ faligndata(F60, F60, F60); ++ __ faligndata(F62, F62, F62); ++ __ mov(to, L5); ++ __ and3(to, -8, to); ++ __ and3(L3, -8, L3); ++ __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); ++ __ add(to, 8, to); ++ __ add(L3, 8, L3); ++ __ orn(G0, L2, L2); ++ __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); ++ __ mov(L5, to); ++ __ movxtod(L6, F60); ++ __ movxtod(L7, F62); ++ ++ __ BIND(L_check_loop_end_256bit); ++ __ add(from, 16, from); ++ __ subcc(len_reg, 16, len_reg); ++ __ add(to, 16, to); ++ __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc256); ++ __ delayed()->nop(); ++ // re-init intial vector for next block, 8-byte alignment is guaranteed ++ __ stf(FloatRegisterImpl::D, F60, rvec, 0); ++ __ stf(FloatRegisterImpl::D, F62, rvec, 8); ++ __ mov(L0, I0); ++ __ ret(); ++ __ delayed()->restore(); ++ ++ return start; ++ } ++ ++ address generate_cipherBlockChaining_decryptAESCrypt_Parallel() { ++ assert((arrayOopDesc::base_offset_in_bytes(T_INT) & 7) == 0, ++ "the following code assumes that first element of an int array is aligned to 8 bytes"); ++ assert((arrayOopDesc::base_offset_in_bytes(T_BYTE) & 7) == 0, ++ "the following code assumes that first element of a byte array is aligned to 8 bytes"); ++ __ align(CodeEntryAlignment); ++ StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_decryptAESCrypt"); ++ Label L_cbcdec_end, L_expand192bit, L_expand256bit, L_dec_first_block_start; ++ Label L_dec_first_block128, L_dec_first_block192, L_dec_next2_blocks128, L_dec_next2_blocks192, L_dec_next2_blocks256; ++ Label L_load_misaligned_input_first_block, L_transform_first_block, L_load_misaligned_next2_blocks128, L_transform_next2_blocks128; ++ Label L_load_misaligned_next2_blocks192, L_transform_next2_blocks192, L_load_misaligned_next2_blocks256, L_transform_next2_blocks256; ++ Label L_store_misaligned_output_first_block, L_check_decrypt_end, L_store_misaligned_output_next2_blocks128; ++ Label L_check_decrypt_loop_end128, L_store_misaligned_output_next2_blocks192, L_check_decrypt_loop_end192; ++ Label L_store_misaligned_output_next2_blocks256, L_check_decrypt_loop_end256; ++ address start = __ pc(); ++ Register from = I0; // source byte array ++ Register to = I1; // destination byte array ++ Register key = I2; // expanded key array ++ Register rvec = I3; // init vector ++ const Register len_reg = I4; // cipher length ++ const Register original_key = I5; // original key array only required during decryption ++ const Register keylen = L6; // reg for storing expanded key array length ++ ++ __ save_frame(0); //args are read from I* registers since we save the frame in the beginning ++ // save cipher len to return in the end ++ __ mov(len_reg, L7); ++ ++ // load original key from SunJCE expanded decryption key ++ // Since we load original key buffer starting first element, 8-byte alignment is guaranteed ++ for ( int i = 0; i <= 3; i++ ) { ++ __ ldf(FloatRegisterImpl::S, original_key, i*4, as_FloatRegister(i)); ++ } ++ ++ // load initial vector, 8-byte alignment is guaranteed ++ __ ldx(rvec,0,L0); ++ __ ldx(rvec,8,L1); ++ ++ // read expanded key array length ++ __ ldsw(Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)), keylen, 0); ++ ++ // 256-bit original key size ++ __ cmp_and_brx_short(keylen, 60, Assembler::equal, Assembler::pn, L_expand256bit); ++ ++ // 192-bit original key size ++ __ cmp_and_brx_short(keylen, 52, Assembler::equal, Assembler::pn, L_expand192bit); ++ ++ // 128-bit original key size ++ // perform key expansion since SunJCE decryption-key expansion is not compatible with SPARC crypto instructions ++ for ( int i = 0; i <= 36; i += 4 ) { ++ __ aes_kexpand1(as_FloatRegister(i), as_FloatRegister(i+2), i/4, as_FloatRegister(i+4)); ++ __ aes_kexpand2(as_FloatRegister(i+2), as_FloatRegister(i+4), as_FloatRegister(i+6)); ++ } ++ ++ // load expanded key[last-1] and key[last] elements ++ __ movdtox(F40,L2); ++ __ movdtox(F42,L3); ++ ++ __ and3(len_reg, 16, L4); ++ __ br_null_short(L4, Assembler::pt, L_dec_next2_blocks128); ++ __ nop(); ++ ++ __ ba_short(L_dec_first_block_start); ++ ++ __ BIND(L_expand192bit); ++ // load rest of the 192-bit key ++ __ ldf(FloatRegisterImpl::S, original_key, 16, F4); ++ __ ldf(FloatRegisterImpl::S, original_key, 20, F5); ++ ++ // perform key expansion since SunJCE decryption-key expansion is not compatible with SPARC crypto instructions ++ for ( int i = 0; i <= 36; i += 6 ) { ++ __ aes_kexpand1(as_FloatRegister(i), as_FloatRegister(i+4), i/6, as_FloatRegister(i+6)); ++ __ aes_kexpand2(as_FloatRegister(i+2), as_FloatRegister(i+6), as_FloatRegister(i+8)); ++ __ aes_kexpand2(as_FloatRegister(i+4), as_FloatRegister(i+8), as_FloatRegister(i+10)); ++ } ++ __ aes_kexpand1(F42, F46, 7, F48); ++ __ aes_kexpand2(F44, F48, F50); ++ ++ // load expanded key[last-1] and key[last] elements ++ __ movdtox(F48,L2); ++ __ movdtox(F50,L3); ++ ++ __ and3(len_reg, 16, L4); ++ __ br_null_short(L4, Assembler::pt, L_dec_next2_blocks192); ++ __ nop(); ++ ++ __ ba_short(L_dec_first_block_start); ++ ++ __ BIND(L_expand256bit); ++ // load rest of the 256-bit key ++ for ( int i = 4; i <= 7; i++ ) { ++ __ ldf(FloatRegisterImpl::S, original_key, i*4, as_FloatRegister(i)); ++ } ++ ++ // perform key expansion since SunJCE decryption-key expansion is not compatible with SPARC crypto instructions ++ for ( int i = 0; i <= 40; i += 8 ) { ++ __ aes_kexpand1(as_FloatRegister(i), as_FloatRegister(i+6), i/8, as_FloatRegister(i+8)); ++ __ aes_kexpand2(as_FloatRegister(i+2), as_FloatRegister(i+8), as_FloatRegister(i+10)); ++ __ aes_kexpand0(as_FloatRegister(i+4), as_FloatRegister(i+10), as_FloatRegister(i+12)); ++ __ aes_kexpand2(as_FloatRegister(i+6), as_FloatRegister(i+12), as_FloatRegister(i+14)); ++ } ++ __ aes_kexpand1(F48, F54, 6, F56); ++ __ aes_kexpand2(F50, F56, F58); ++ ++ // load expanded key[last-1] and key[last] elements ++ __ movdtox(F56,L2); ++ __ movdtox(F58,L3); ++ ++ __ and3(len_reg, 16, L4); ++ __ br_null_short(L4, Assembler::pt, L_dec_next2_blocks256); ++ ++ __ BIND(L_dec_first_block_start); ++ // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input_first_block); ++ __ delayed()->mov(from, G1); // save original 'from' address before alignaddr ++ ++ // aligned case: load input into L4 and L5 ++ __ ldx(from,0,L4); ++ __ ldx(from,8,L5); ++ __ ba_short(L_transform_first_block); ++ ++ __ BIND(L_load_misaligned_input_first_block); ++ __ alignaddr(from, G0, from); ++ // F58, F60, F62 can be clobbered ++ __ ldf(FloatRegisterImpl::D, from, 0, F58); ++ __ ldf(FloatRegisterImpl::D, from, 8, F60); ++ __ ldf(FloatRegisterImpl::D, from, 16, F62); ++ __ faligndata(F58, F60, F58); ++ __ faligndata(F60, F62, F60); ++ __ movdtox(F58, L4); ++ __ movdtox(F60, L5); ++ __ mov(G1, from); ++ ++ __ BIND(L_transform_first_block); ++ __ xor3(L2,L4,G1); ++ __ movxtod(G1,F60); ++ __ xor3(L3,L5,G1); ++ __ movxtod(G1,F62); ++ ++ // 128-bit original key size ++ __ cmp_and_brx_short(keylen, 44, Assembler::equal, Assembler::pn, L_dec_first_block128); ++ ++ // 192-bit original key size ++ __ cmp_and_brx_short(keylen, 52, Assembler::equal, Assembler::pn, L_dec_first_block192); ++ ++ __ aes_dround23(F54, F60, F62, F58); ++ __ aes_dround01(F52, F60, F62, F56); ++ __ aes_dround23(F50, F56, F58, F62); ++ __ aes_dround01(F48, F56, F58, F60); ++ ++ __ BIND(L_dec_first_block192); ++ __ aes_dround23(F46, F60, F62, F58); ++ __ aes_dround01(F44, F60, F62, F56); ++ __ aes_dround23(F42, F56, F58, F62); ++ __ aes_dround01(F40, F56, F58, F60); ++ ++ __ BIND(L_dec_first_block128); ++ for ( int i = 38; i >= 6; i -= 8 ) { ++ __ aes_dround23(as_FloatRegister(i), F60, F62, F58); ++ __ aes_dround01(as_FloatRegister(i-2), F60, F62, F56); ++ if ( i != 6) { ++ __ aes_dround23(as_FloatRegister(i-4), F56, F58, F62); ++ __ aes_dround01(as_FloatRegister(i-6), F56, F58, F60); ++ } else { ++ __ aes_dround23_l(as_FloatRegister(i-4), F56, F58, F62); ++ __ aes_dround01_l(as_FloatRegister(i-6), F56, F58, F60); ++ } ++ } ++ ++ __ movxtod(L0,F56); ++ __ movxtod(L1,F58); ++ __ mov(L4,L0); ++ __ mov(L5,L1); ++ __ fxor(FloatRegisterImpl::D, F56, F60, F60); ++ __ fxor(FloatRegisterImpl::D, F58, F62, F62); ++ ++ // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(to, 7, G1); ++ __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_first_block); ++ __ delayed()->edge8n(to, G0, G2); ++ ++ // aligned case: store output into the destination array ++ __ stf(FloatRegisterImpl::D, F60, to, 0); ++ __ stf(FloatRegisterImpl::D, F62, to, 8); ++ __ ba_short(L_check_decrypt_end); ++ ++ __ BIND(L_store_misaligned_output_first_block); ++ __ add(to, 8, G3); ++ __ mov(8, G4); ++ __ sub(G4, G1, G4); ++ __ alignaddr(G4, G0, G4); ++ __ faligndata(F60, F60, F60); ++ __ faligndata(F62, F62, F62); ++ __ mov(to, G1); ++ __ and3(to, -8, to); ++ __ and3(G3, -8, G3); ++ __ stpartialf(to, G2, F60, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(G3, G2, F62, Assembler::ASI_PST8_PRIMARY); ++ __ add(to, 8, to); ++ __ add(G3, 8, G3); ++ __ orn(G0, G2, G2); ++ __ stpartialf(to, G2, F60, Assembler::ASI_PST8_PRIMARY); ++ __ stpartialf(G3, G2, F62, Assembler::ASI_PST8_PRIMARY); ++ __ mov(G1, to); ++ ++ __ BIND(L_check_decrypt_end); ++ __ add(from, 16, from); ++ __ add(to, 16, to); ++ __ subcc(len_reg, 16, len_reg); ++ __ br(Assembler::equal, false, Assembler::pt, L_cbcdec_end); ++ __ delayed()->nop(); ++ ++ // 256-bit original key size ++ __ cmp_and_brx_short(keylen, 60, Assembler::equal, Assembler::pn, L_dec_next2_blocks256); ++ ++ // 192-bit original key size ++ __ cmp_and_brx_short(keylen, 52, Assembler::equal, Assembler::pn, L_dec_next2_blocks192); ++ ++ __ align(OptoLoopAlignment); ++ __ BIND(L_dec_next2_blocks128); ++ __ nop(); ++ ++ // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_next2_blocks128); ++ __ delayed()->mov(from, G1); // save original 'from' address before alignaddr ++ ++ // aligned case: load input into G4, G5, L4 and L5 ++ __ ldx(from,0,G4); ++ __ ldx(from,8,G5); ++ __ ldx(from,16,L4); ++ __ ldx(from,24,L5); ++ __ ba_short(L_transform_next2_blocks128); ++ ++ __ BIND(L_load_misaligned_next2_blocks128); ++ __ alignaddr(from, G0, from); ++ // F40, F42, F58, F60, F62 can be clobbered ++ __ ldf(FloatRegisterImpl::D, from, 0, F40); ++ __ ldf(FloatRegisterImpl::D, from, 8, F42); ++ __ ldf(FloatRegisterImpl::D, from, 16, F60); ++ __ ldf(FloatRegisterImpl::D, from, 24, F62); ++ __ ldf(FloatRegisterImpl::D, from, 32, F58); ++ __ faligndata(F40, F42, F40); ++ __ faligndata(F42, F60, F42); ++ __ faligndata(F60, F62, F60); ++ __ faligndata(F62, F58, F62); ++ __ movdtox(F40, G4); ++ __ movdtox(F42, G5); ++ __ movdtox(F60, L4); ++ __ movdtox(F62, L5); ++ __ mov(G1, from); ++ ++ __ BIND(L_transform_next2_blocks128); ++ // F40:F42 used for first 16-bytes ++ __ xor3(L2,G4,G1); ++ __ movxtod(G1,F40); ++ __ xor3(L3,G5,G1); ++ __ movxtod(G1,F42); ++ ++ // F60:F62 used for next 16-bytes ++ __ xor3(L2,L4,G1); ++ __ movxtod(G1,F60); ++ __ xor3(L3,L5,G1); ++ __ movxtod(G1,F62); ++ ++ for ( int i = 38; i >= 6; i -= 8 ) { ++ __ aes_dround23(as_FloatRegister(i), F40, F42, F44); ++ __ aes_dround01(as_FloatRegister(i-2), F40, F42, F46); ++ __ aes_dround23(as_FloatRegister(i), F60, F62, F58); ++ __ aes_dround01(as_FloatRegister(i-2), F60, F62, F56); ++ if (i != 6 ) { ++ __ aes_dround23(as_FloatRegister(i-4), F46, F44, F42); ++ __ aes_dround01(as_FloatRegister(i-6), F46, F44, F40); ++ __ aes_dround23(as_FloatRegister(i-4), F56, F58, F62); ++ __ aes_dround01(as_FloatRegister(i-6), F56, F58, F60); ++ } else { ++ __ aes_dround23_l(as_FloatRegister(i-4), F46, F44, F42); ++ __ aes_dround01_l(as_FloatRegister(i-6), F46, F44, F40); ++ __ aes_dround23_l(as_FloatRegister(i-4), F56, F58, F62); ++ __ aes_dround01_l(as_FloatRegister(i-6), F56, F58, F60); ++ } ++ } ++ ++ __ movxtod(L0,F46); ++ __ movxtod(L1,F44); ++ __ fxor(FloatRegisterImpl::D, F46, F40, F40); ++ __ fxor(FloatRegisterImpl::D, F44, F42, F42); ++ ++ __ movxtod(G4,F56); ++ __ movxtod(G5,F58); ++ __ mov(L4,L0); ++ __ mov(L5,L1); ++ __ fxor(FloatRegisterImpl::D, F56, F60, F60); ++ __ fxor(FloatRegisterImpl::D, F58, F62, F62); ++ ++ // For mis-aligned store of 32 bytes of result we can do: ++ // Circular right-shift all 4 FP registers so that 'head' and 'tail' ++ // parts that need to be stored starting at mis-aligned address are in a FP reg ++ // the other 3 FP regs can thus be stored using regular store ++ // we then use the edge + partial-store mechanism to store the 'head' and 'tail' parts ++ ++ // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(to, 7, G1); ++ __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_next2_blocks128); ++ __ delayed()->edge8n(to, G0, G2); ++ ++ // aligned case: store output into the destination array ++ __ stf(FloatRegisterImpl::D, F40, to, 0); ++ __ stf(FloatRegisterImpl::D, F42, to, 8); ++ __ stf(FloatRegisterImpl::D, F60, to, 16); ++ __ stf(FloatRegisterImpl::D, F62, to, 24); ++ __ ba_short(L_check_decrypt_loop_end128); ++ ++ __ BIND(L_store_misaligned_output_next2_blocks128); ++ __ mov(8, G4); ++ __ sub(G4, G1, G4); ++ __ alignaddr(G4, G0, G4); ++ __ faligndata(F40, F42, F56); // F56 can be clobbered ++ __ faligndata(F42, F60, F42); ++ __ faligndata(F60, F62, F60); ++ __ faligndata(F62, F40, F40); ++ __ mov(to, G1); ++ __ and3(to, -8, to); ++ __ stpartialf(to, G2, F40, Assembler::ASI_PST8_PRIMARY); ++ __ stf(FloatRegisterImpl::D, F56, to, 8); ++ __ stf(FloatRegisterImpl::D, F42, to, 16); ++ __ stf(FloatRegisterImpl::D, F60, to, 24); ++ __ add(to, 32, to); ++ __ orn(G0, G2, G2); ++ __ stpartialf(to, G2, F40, Assembler::ASI_PST8_PRIMARY); ++ __ mov(G1, to); ++ ++ __ BIND(L_check_decrypt_loop_end128); ++ __ add(from, 32, from); ++ __ add(to, 32, to); ++ __ subcc(len_reg, 32, len_reg); ++ __ br(Assembler::notEqual, false, Assembler::pt, L_dec_next2_blocks128); ++ __ delayed()->nop(); ++ __ ba_short(L_cbcdec_end); ++ ++ __ align(OptoLoopAlignment); ++ __ BIND(L_dec_next2_blocks192); ++ __ nop(); ++ ++ // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_next2_blocks192); ++ __ delayed()->mov(from, G1); // save original 'from' address before alignaddr ++ ++ // aligned case: load input into G4, G5, L4 and L5 ++ __ ldx(from,0,G4); ++ __ ldx(from,8,G5); ++ __ ldx(from,16,L4); ++ __ ldx(from,24,L5); ++ __ ba_short(L_transform_next2_blocks192); ++ ++ __ BIND(L_load_misaligned_next2_blocks192); ++ __ alignaddr(from, G0, from); ++ // F48, F50, F52, F60, F62 can be clobbered ++ __ ldf(FloatRegisterImpl::D, from, 0, F48); ++ __ ldf(FloatRegisterImpl::D, from, 8, F50); ++ __ ldf(FloatRegisterImpl::D, from, 16, F60); ++ __ ldf(FloatRegisterImpl::D, from, 24, F62); ++ __ ldf(FloatRegisterImpl::D, from, 32, F52); ++ __ faligndata(F48, F50, F48); ++ __ faligndata(F50, F60, F50); ++ __ faligndata(F60, F62, F60); ++ __ faligndata(F62, F52, F62); ++ __ movdtox(F48, G4); ++ __ movdtox(F50, G5); ++ __ movdtox(F60, L4); ++ __ movdtox(F62, L5); ++ __ mov(G1, from); ++ ++ __ BIND(L_transform_next2_blocks192); ++ // F48:F50 used for first 16-bytes ++ __ xor3(L2,G4,G1); ++ __ movxtod(G1,F48); ++ __ xor3(L3,G5,G1); ++ __ movxtod(G1,F50); ++ ++ // F60:F62 used for next 16-bytes ++ __ xor3(L2,L4,G1); ++ __ movxtod(G1,F60); ++ __ xor3(L3,L5,G1); ++ __ movxtod(G1,F62); ++ ++ for ( int i = 46; i >= 6; i -= 8 ) { ++ __ aes_dround23(as_FloatRegister(i), F48, F50, F52); ++ __ aes_dround01(as_FloatRegister(i-2), F48, F50, F54); ++ __ aes_dround23(as_FloatRegister(i), F60, F62, F58); ++ __ aes_dround01(as_FloatRegister(i-2), F60, F62, F56); ++ if (i != 6 ) { ++ __ aes_dround23(as_FloatRegister(i-4), F54, F52, F50); ++ __ aes_dround01(as_FloatRegister(i-6), F54, F52, F48); ++ __ aes_dround23(as_FloatRegister(i-4), F56, F58, F62); ++ __ aes_dround01(as_FloatRegister(i-6), F56, F58, F60); ++ } else { ++ __ aes_dround23_l(as_FloatRegister(i-4), F54, F52, F50); ++ __ aes_dround01_l(as_FloatRegister(i-6), F54, F52, F48); ++ __ aes_dround23_l(as_FloatRegister(i-4), F56, F58, F62); ++ __ aes_dround01_l(as_FloatRegister(i-6), F56, F58, F60); ++ } ++ } ++ ++ __ movxtod(L0,F54); ++ __ movxtod(L1,F52); ++ __ fxor(FloatRegisterImpl::D, F54, F48, F48); ++ __ fxor(FloatRegisterImpl::D, F52, F50, F50); ++ ++ __ movxtod(G4,F56); ++ __ movxtod(G5,F58); ++ __ mov(L4,L0); ++ __ mov(L5,L1); ++ __ fxor(FloatRegisterImpl::D, F56, F60, F60); ++ __ fxor(FloatRegisterImpl::D, F58, F62, F62); ++ ++ // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(to, 7, G1); ++ __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_next2_blocks192); ++ __ delayed()->edge8n(to, G0, G2); ++ ++ // aligned case: store output into the destination array ++ __ stf(FloatRegisterImpl::D, F48, to, 0); ++ __ stf(FloatRegisterImpl::D, F50, to, 8); ++ __ stf(FloatRegisterImpl::D, F60, to, 16); ++ __ stf(FloatRegisterImpl::D, F62, to, 24); ++ __ ba_short(L_check_decrypt_loop_end192); ++ ++ __ BIND(L_store_misaligned_output_next2_blocks192); ++ __ mov(8, G4); ++ __ sub(G4, G1, G4); ++ __ alignaddr(G4, G0, G4); ++ __ faligndata(F48, F50, F56); // F56 can be clobbered ++ __ faligndata(F50, F60, F50); ++ __ faligndata(F60, F62, F60); ++ __ faligndata(F62, F48, F48); ++ __ mov(to, G1); ++ __ and3(to, -8, to); ++ __ stpartialf(to, G2, F48, Assembler::ASI_PST8_PRIMARY); ++ __ stf(FloatRegisterImpl::D, F56, to, 8); ++ __ stf(FloatRegisterImpl::D, F50, to, 16); ++ __ stf(FloatRegisterImpl::D, F60, to, 24); ++ __ add(to, 32, to); ++ __ orn(G0, G2, G2); ++ __ stpartialf(to, G2, F48, Assembler::ASI_PST8_PRIMARY); ++ __ mov(G1, to); ++ ++ __ BIND(L_check_decrypt_loop_end192); ++ __ add(from, 32, from); ++ __ add(to, 32, to); ++ __ subcc(len_reg, 32, len_reg); ++ __ br(Assembler::notEqual, false, Assembler::pt, L_dec_next2_blocks192); ++ __ delayed()->nop(); ++ __ ba_short(L_cbcdec_end); ++ ++ __ align(OptoLoopAlignment); ++ __ BIND(L_dec_next2_blocks256); ++ __ nop(); ++ ++ // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(from, 7, G0); ++ __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_next2_blocks256); ++ __ delayed()->mov(from, G1); // save original 'from' address before alignaddr ++ ++ // aligned case: load input into G4, G5, L4 and L5 ++ __ ldx(from,0,G4); ++ __ ldx(from,8,G5); ++ __ ldx(from,16,L4); ++ __ ldx(from,24,L5); ++ __ ba_short(L_transform_next2_blocks256); ++ ++ __ BIND(L_load_misaligned_next2_blocks256); ++ __ alignaddr(from, G0, from); ++ // F0, F2, F4, F60, F62 can be clobbered ++ __ ldf(FloatRegisterImpl::D, from, 0, F0); ++ __ ldf(FloatRegisterImpl::D, from, 8, F2); ++ __ ldf(FloatRegisterImpl::D, from, 16, F60); ++ __ ldf(FloatRegisterImpl::D, from, 24, F62); ++ __ ldf(FloatRegisterImpl::D, from, 32, F4); ++ __ faligndata(F0, F2, F0); ++ __ faligndata(F2, F60, F2); ++ __ faligndata(F60, F62, F60); ++ __ faligndata(F62, F4, F62); ++ __ movdtox(F0, G4); ++ __ movdtox(F2, G5); ++ __ movdtox(F60, L4); ++ __ movdtox(F62, L5); ++ __ mov(G1, from); ++ ++ __ BIND(L_transform_next2_blocks256); ++ // F0:F2 used for first 16-bytes ++ __ xor3(L2,G4,G1); ++ __ movxtod(G1,F0); ++ __ xor3(L3,G5,G1); ++ __ movxtod(G1,F2); ++ ++ // F60:F62 used for next 16-bytes ++ __ xor3(L2,L4,G1); ++ __ movxtod(G1,F60); ++ __ xor3(L3,L5,G1); ++ __ movxtod(G1,F62); ++ ++ __ aes_dround23(F54, F0, F2, F4); ++ __ aes_dround01(F52, F0, F2, F6); ++ __ aes_dround23(F54, F60, F62, F58); ++ __ aes_dround01(F52, F60, F62, F56); ++ __ aes_dround23(F50, F6, F4, F2); ++ __ aes_dround01(F48, F6, F4, F0); ++ __ aes_dround23(F50, F56, F58, F62); ++ __ aes_dround01(F48, F56, F58, F60); ++ // save F48:F54 in temp registers ++ __ movdtox(F54,G2); ++ __ movdtox(F52,G3); ++ __ movdtox(F50,G6); ++ __ movdtox(F48,G1); ++ for ( int i = 46; i >= 14; i -= 8 ) { ++ __ aes_dround23(as_FloatRegister(i), F0, F2, F4); ++ __ aes_dround01(as_FloatRegister(i-2), F0, F2, F6); ++ __ aes_dround23(as_FloatRegister(i), F60, F62, F58); ++ __ aes_dround01(as_FloatRegister(i-2), F60, F62, F56); ++ __ aes_dround23(as_FloatRegister(i-4), F6, F4, F2); ++ __ aes_dround01(as_FloatRegister(i-6), F6, F4, F0); ++ __ aes_dround23(as_FloatRegister(i-4), F56, F58, F62); ++ __ aes_dround01(as_FloatRegister(i-6), F56, F58, F60); ++ } ++ // init F48:F54 with F0:F6 values (original key) ++ __ ldf(FloatRegisterImpl::D, original_key, 0, F48); ++ __ ldf(FloatRegisterImpl::D, original_key, 8, F50); ++ __ ldf(FloatRegisterImpl::D, original_key, 16, F52); ++ __ ldf(FloatRegisterImpl::D, original_key, 24, F54); ++ __ aes_dround23(F54, F0, F2, F4); ++ __ aes_dround01(F52, F0, F2, F6); ++ __ aes_dround23(F54, F60, F62, F58); ++ __ aes_dround01(F52, F60, F62, F56); ++ __ aes_dround23_l(F50, F6, F4, F2); ++ __ aes_dround01_l(F48, F6, F4, F0); ++ __ aes_dround23_l(F50, F56, F58, F62); ++ __ aes_dround01_l(F48, F56, F58, F60); ++ // re-init F48:F54 with their original values ++ __ movxtod(G2,F54); ++ __ movxtod(G3,F52); ++ __ movxtod(G6,F50); ++ __ movxtod(G1,F48); ++ ++ __ movxtod(L0,F6); ++ __ movxtod(L1,F4); ++ __ fxor(FloatRegisterImpl::D, F6, F0, F0); ++ __ fxor(FloatRegisterImpl::D, F4, F2, F2); ++ ++ __ movxtod(G4,F56); ++ __ movxtod(G5,F58); ++ __ mov(L4,L0); ++ __ mov(L5,L1); ++ __ fxor(FloatRegisterImpl::D, F56, F60, F60); ++ __ fxor(FloatRegisterImpl::D, F58, F62, F62); ++ ++ // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero ++ __ andcc(to, 7, G1); ++ __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_next2_blocks256); ++ __ delayed()->edge8n(to, G0, G2); ++ ++ // aligned case: store output into the destination array ++ __ stf(FloatRegisterImpl::D, F0, to, 0); ++ __ stf(FloatRegisterImpl::D, F2, to, 8); ++ __ stf(FloatRegisterImpl::D, F60, to, 16); ++ __ stf(FloatRegisterImpl::D, F62, to, 24); ++ __ ba_short(L_check_decrypt_loop_end256); ++ ++ __ BIND(L_store_misaligned_output_next2_blocks256); ++ __ mov(8, G4); ++ __ sub(G4, G1, G4); ++ __ alignaddr(G4, G0, G4); ++ __ faligndata(F0, F2, F56); // F56 can be clobbered ++ __ faligndata(F2, F60, F2); ++ __ faligndata(F60, F62, F60); ++ __ faligndata(F62, F0, F0); ++ __ mov(to, G1); ++ __ and3(to, -8, to); ++ __ stpartialf(to, G2, F0, Assembler::ASI_PST8_PRIMARY); ++ __ stf(FloatRegisterImpl::D, F56, to, 8); ++ __ stf(FloatRegisterImpl::D, F2, to, 16); ++ __ stf(FloatRegisterImpl::D, F60, to, 24); ++ __ add(to, 32, to); ++ __ orn(G0, G2, G2); ++ __ stpartialf(to, G2, F0, Assembler::ASI_PST8_PRIMARY); ++ __ mov(G1, to); ++ ++ __ BIND(L_check_decrypt_loop_end256); ++ __ add(from, 32, from); ++ __ add(to, 32, to); ++ __ subcc(len_reg, 32, len_reg); ++ __ br(Assembler::notEqual, false, Assembler::pt, L_dec_next2_blocks256); ++ __ delayed()->nop(); ++ ++ __ BIND(L_cbcdec_end); ++ // re-init intial vector for next block, 8-byte alignment is guaranteed ++ __ stx(L0, rvec, 0); ++ __ stx(L1, rvec, 8); ++ __ mov(L7, I0); ++ __ ret(); ++ __ delayed()->restore(); ++ ++ return start; ++ } ++ + void generate_initial() { + // Generates all stubs and initializes the entry points + +@@ -3368,6 +4639,14 @@ + generate_safefetch("SafeFetchN", sizeof(intptr_t), &StubRoutines::_safefetchN_entry, + &StubRoutines::_safefetchN_fault_pc, + &StubRoutines::_safefetchN_continuation_pc); ++ ++ // generate AES intrinsics code ++ if (UseAESIntrinsics) { ++ StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock(); ++ StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock(); ++ StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt(); ++ StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt_Parallel(); ++ } + } + + +--- ./hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 = 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) + }; + + class Sparc { +--- ./hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -156,6 +156,10 @@ + address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) { + address entry = __ pc(); + ++ if (state == atos) { ++ __ profile_return_type(O0, G3_scratch, G1_scratch); ++ } ++ + #if !defined(_LP64) && defined(COMPILER2) + // All return values are where we want them, except for Longs. C2 returns + // longs in G1 in the 32-bit build whereas the interpreter wants them in O0/O1. +@@ -1143,7 +1147,7 @@ + + // reset handle block + __ ld_ptr(G2_thread, JavaThread::active_handles_offset(), G3_scratch); +- __ st_ptr(G0, G3_scratch, JNIHandleBlock::top_offset_in_bytes()); ++ __ st(G0, G3_scratch, JNIHandleBlock::top_offset_in_bytes()); + + // If we have an oop result store it where it will be safe for any further gc + // until we return now that we've released the handle it might be protected by +@@ -1333,6 +1337,7 @@ + __ movbool(true, G3_scratch); + __ stbool(G3_scratch, do_not_unlock_if_synchronized); + ++ __ profile_parameters_type(G1_scratch, G3_scratch, G4_scratch, Lscratch); + // increment invocation counter and check for overflow + // + // Note: checking for negative value instead of overflow +@@ -1559,37 +1564,23 @@ + int monitor_size = method->is_synchronized() ? + 1*frame::interpreter_frame_monitor_size() : 0; + return size_activation_helper(method->max_locals(), method->max_stack(), +- monitor_size) + call_stub_size; ++ monitor_size) + call_stub_size; + } + +-int AbstractInterpreter::layout_activation(Method* method, +- int tempcount, +- int popframe_extra_args, +- int moncount, +- int caller_actual_parameters, +- int callee_param_count, +- int callee_local_count, +- frame* caller, +- frame* interpreter_frame, +- bool is_top_frame, +- bool is_bottom_frame) { ++int AbstractInterpreter::size_activation(int max_stack, ++ int temps, ++ int extra_args, ++ int monitors, ++ int callee_params, ++ int callee_locals, ++ bool is_top_frame) { + // Note: This calculation must exactly parallel the frame setup + // in InterpreterGenerator::generate_fixed_frame. +- // If f!=NULL, set up the following variables: +- // - Lmethod +- // - Llocals +- // - Lmonitors (to the indicated number of monitors) +- // - Lesp (to the indicated number of temps) +- // The frame f (if not NULL) on entry is a description of the caller of the frame +- // we are about to layout. We are guaranteed that we will be able to fill in a +- // new interpreter frame as its callee (i.e. the stack space is allocated and +- // the amount was determined by an earlier call to this method with f == NULL). +- // On return f (if not NULL) while describe the interpreter frame we just layed out. + +- int monitor_size = moncount * frame::interpreter_frame_monitor_size(); +- int rounded_vm_local_words = round_to(frame::interpreter_frame_vm_local_words,WordsPerLong); ++ int monitor_size = monitors * frame::interpreter_frame_monitor_size(); + + assert(monitor_size == round_to(monitor_size, WordsPerLong), "must align"); ++ + // + // Note: if you look closely this appears to be doing something much different + // than generate_fixed_frame. What is happening is this. On sparc we have to do +@@ -1614,146 +1605,171 @@ + // there is no sense in messing working code. + // + +- int rounded_cls = round_to((callee_local_count - callee_param_count), WordsPerLong); ++ int rounded_cls = round_to((callee_locals - callee_params), WordsPerLong); + assert(rounded_cls == round_to(rounded_cls, WordsPerLong), "must align"); + +- int raw_frame_size = size_activation_helper(rounded_cls, method->max_stack(), +- monitor_size); ++ int raw_frame_size = size_activation_helper(rounded_cls, max_stack, monitor_size); + +- if (interpreter_frame != NULL) { +- // The skeleton frame must already look like an interpreter frame +- // even if not fully filled out. +- assert(interpreter_frame->is_interpreted_frame(), "Must be interpreted frame"); ++ return raw_frame_size; ++} + +- intptr_t* fp = interpreter_frame->fp(); ++void AbstractInterpreter::layout_activation(Method* method, ++ int tempcount, ++ int popframe_extra_args, ++ int moncount, ++ int caller_actual_parameters, ++ int callee_param_count, ++ int callee_local_count, ++ frame* caller, ++ frame* interpreter_frame, ++ bool is_top_frame, ++ bool is_bottom_frame) { ++ // Set up the following variables: ++ // - Lmethod ++ // - Llocals ++ // - Lmonitors (to the indicated number of monitors) ++ // - Lesp (to the indicated number of temps) ++ // The frame caller on entry is a description of the caller of the ++ // frame we are about to layout. We are guaranteed that we will be ++ // able to fill in a new interpreter frame as its callee (i.e. the ++ // stack space is allocated and the amount was determined by an ++ // earlier call to the size_activation() method). On return caller ++ // while describe the interpreter frame we just layed out. + +- JavaThread* thread = JavaThread::current(); +- RegisterMap map(thread, false); +- // More verification that skeleton frame is properly walkable +- assert(fp == caller->sp(), "fp must match"); ++ // The skeleton frame must already look like an interpreter frame ++ // even if not fully filled out. ++ assert(interpreter_frame->is_interpreted_frame(), "Must be interpreted frame"); + +- intptr_t* montop = fp - rounded_vm_local_words; ++ int rounded_vm_local_words = round_to(frame::interpreter_frame_vm_local_words,WordsPerLong); ++ int monitor_size = moncount * frame::interpreter_frame_monitor_size(); ++ assert(monitor_size == round_to(monitor_size, WordsPerLong), "must align"); + +- // preallocate monitors (cf. __ add_monitor_to_stack) +- intptr_t* monitors = montop - monitor_size; ++ intptr_t* fp = interpreter_frame->fp(); + +- // preallocate stack space +- intptr_t* esp = monitors - 1 - +- (tempcount * Interpreter::stackElementWords) - +- popframe_extra_args; ++ JavaThread* thread = JavaThread::current(); ++ RegisterMap map(thread, false); ++ // More verification that skeleton frame is properly walkable ++ assert(fp == caller->sp(), "fp must match"); + +- int local_words = method->max_locals() * Interpreter::stackElementWords; +- NEEDS_CLEANUP; +- intptr_t* locals; +- if (caller->is_interpreted_frame()) { +- // Can force the locals area to end up properly overlapping the top of the expression stack. +- intptr_t* Lesp_ptr = caller->interpreter_frame_tos_address() - 1; +- // Note that this computation means we replace size_of_parameters() values from the caller +- // interpreter frame's expression stack with our argument locals +- int parm_words = caller_actual_parameters * Interpreter::stackElementWords; +- locals = Lesp_ptr + parm_words; +- int delta = local_words - parm_words; +- int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0; +- *interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS; +- if (!is_bottom_frame) { +- // Llast_SP is set below for the current frame to SP (with the +- // extra space for the callee's locals). Here we adjust +- // Llast_SP for the caller's frame, removing the extra space +- // for the current method's locals. +- *caller->register_addr(Llast_SP) = *interpreter_frame->register_addr(I5_savedSP); +- } else { +- assert(*caller->register_addr(Llast_SP) >= *interpreter_frame->register_addr(I5_savedSP), "strange Llast_SP"); +- } ++ intptr_t* montop = fp - rounded_vm_local_words; ++ ++ // preallocate monitors (cf. __ add_monitor_to_stack) ++ intptr_t* monitors = montop - monitor_size; ++ ++ // preallocate stack space ++ intptr_t* esp = monitors - 1 - ++ (tempcount * Interpreter::stackElementWords) - ++ popframe_extra_args; ++ ++ int local_words = method->max_locals() * Interpreter::stackElementWords; ++ NEEDS_CLEANUP; ++ intptr_t* locals; ++ if (caller->is_interpreted_frame()) { ++ // Can force the locals area to end up properly overlapping the top of the expression stack. ++ intptr_t* Lesp_ptr = caller->interpreter_frame_tos_address() - 1; ++ // Note that this computation means we replace size_of_parameters() values from the caller ++ // interpreter frame's expression stack with our argument locals ++ int parm_words = caller_actual_parameters * Interpreter::stackElementWords; ++ locals = Lesp_ptr + parm_words; ++ int delta = local_words - parm_words; ++ int computed_sp_adjustment = (delta > 0) ? round_to(delta, WordsPerLong) : 0; ++ *interpreter_frame->register_addr(I5_savedSP) = (intptr_t) (fp + computed_sp_adjustment) - STACK_BIAS; ++ if (!is_bottom_frame) { ++ // Llast_SP is set below for the current frame to SP (with the ++ // extra space for the callee's locals). Here we adjust ++ // Llast_SP for the caller's frame, removing the extra space ++ // for the current method's locals. ++ *caller->register_addr(Llast_SP) = *interpreter_frame->register_addr(I5_savedSP); + } else { +- assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases"); +- // Don't have Lesp available; lay out locals block in the caller +- // adjacent to the register window save area. +- // +- // Compiled frames do not allocate a varargs area which is why this if +- // statement is needed. +- // +- if (caller->is_compiled_frame()) { +- locals = fp + frame::register_save_words + local_words - 1; +- } else { +- locals = fp + frame::memory_parameter_word_sp_offset + local_words - 1; +- } +- if (!caller->is_entry_frame()) { +- // Caller wants his own SP back +- int caller_frame_size = caller->cb()->frame_size(); +- *interpreter_frame->register_addr(I5_savedSP) = (intptr_t)(caller->fp() - caller_frame_size) - STACK_BIAS; ++ assert(*caller->register_addr(Llast_SP) >= *interpreter_frame->register_addr(I5_savedSP), "strange Llast_SP"); ++ } ++ } else { ++ assert(caller->is_compiled_frame() || caller->is_entry_frame(), "only possible cases"); ++ // Don't have Lesp available; lay out locals block in the caller ++ // adjacent to the register window save area. ++ // ++ // Compiled frames do not allocate a varargs area which is why this if ++ // statement is needed. ++ // ++ if (caller->is_compiled_frame()) { ++ locals = fp + frame::register_save_words + local_words - 1; ++ } else { ++ locals = fp + frame::memory_parameter_word_sp_offset + local_words - 1; ++ } ++ if (!caller->is_entry_frame()) { ++ // Caller wants his own SP back ++ int caller_frame_size = caller->cb()->frame_size(); ++ *interpreter_frame->register_addr(I5_savedSP) = (intptr_t)(caller->fp() - caller_frame_size) - STACK_BIAS; ++ } ++ } ++ if (TraceDeoptimization) { ++ if (caller->is_entry_frame()) { ++ // make sure I5_savedSP and the entry frames notion of saved SP ++ // agree. This assertion duplicate a check in entry frame code ++ // but catches the failure earlier. ++ assert(*caller->register_addr(Lscratch) == *interpreter_frame->register_addr(I5_savedSP), ++ "would change callers SP"); ++ } ++ if (caller->is_entry_frame()) { ++ tty->print("entry "); ++ } ++ if (caller->is_compiled_frame()) { ++ tty->print("compiled "); ++ if (caller->is_deoptimized_frame()) { ++ tty->print("(deopt) "); + } + } +- if (TraceDeoptimization) { +- if (caller->is_entry_frame()) { +- // make sure I5_savedSP and the entry frames notion of saved SP +- // agree. This assertion duplicate a check in entry frame code +- // but catches the failure earlier. +- assert(*caller->register_addr(Lscratch) == *interpreter_frame->register_addr(I5_savedSP), +- "would change callers SP"); +- } +- if (caller->is_entry_frame()) { +- tty->print("entry "); +- } +- if (caller->is_compiled_frame()) { +- tty->print("compiled "); +- if (caller->is_deoptimized_frame()) { +- tty->print("(deopt) "); +- } +- } +- 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); ++ 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); ++ } + +- if (method->max_locals() > 0) { +- assert(locals < caller->sp() || locals >= (caller->sp() + 16), "locals in save area"); +- assert(locals < caller->fp() || locals > (caller->fp() + 16), "locals in save area"); +- assert(locals < interpreter_frame->sp() || locals > (interpreter_frame->sp() + 16), "locals in save area"); +- assert(locals < interpreter_frame->fp() || locals >= (interpreter_frame->fp() + 16), "locals in save area"); +- } ++ if (method->max_locals() > 0) { ++ assert(locals < caller->sp() || locals >= (caller->sp() + 16), "locals in save area"); ++ assert(locals < caller->fp() || locals > (caller->fp() + 16), "locals in save area"); ++ assert(locals < interpreter_frame->sp() || locals > (interpreter_frame->sp() + 16), "locals in save area"); ++ assert(locals < interpreter_frame->fp() || locals >= (interpreter_frame->fp() + 16), "locals in save area"); ++ } + #ifdef _LP64 +- assert(*interpreter_frame->register_addr(I5_savedSP) & 1, "must be odd"); ++ assert(*interpreter_frame->register_addr(I5_savedSP) & 1, "must be odd"); + #endif + +- *interpreter_frame->register_addr(Lmethod) = (intptr_t) method; +- *interpreter_frame->register_addr(Llocals) = (intptr_t) locals; +- *interpreter_frame->register_addr(Lmonitors) = (intptr_t) monitors; +- *interpreter_frame->register_addr(Lesp) = (intptr_t) esp; +- // Llast_SP will be same as SP as there is no adapter space +- *interpreter_frame->register_addr(Llast_SP) = (intptr_t) interpreter_frame->sp() - STACK_BIAS; +- *interpreter_frame->register_addr(LcpoolCache) = (intptr_t) method->constants()->cache(); ++ *interpreter_frame->register_addr(Lmethod) = (intptr_t) method; ++ *interpreter_frame->register_addr(Llocals) = (intptr_t) locals; ++ *interpreter_frame->register_addr(Lmonitors) = (intptr_t) monitors; ++ *interpreter_frame->register_addr(Lesp) = (intptr_t) esp; ++ // Llast_SP will be same as SP as there is no adapter space ++ *interpreter_frame->register_addr(Llast_SP) = (intptr_t) interpreter_frame->sp() - STACK_BIAS; ++ *interpreter_frame->register_addr(LcpoolCache) = (intptr_t) method->constants()->cache(); + #ifdef FAST_DISPATCH +- *interpreter_frame->register_addr(IdispatchTables) = (intptr_t) Interpreter::dispatch_table(); ++ *interpreter_frame->register_addr(IdispatchTables) = (intptr_t) Interpreter::dispatch_table(); + #endif + + + #ifdef ASSERT +- BasicObjectLock* mp = (BasicObjectLock*)monitors; ++ BasicObjectLock* mp = (BasicObjectLock*)monitors; + +- assert(interpreter_frame->interpreter_frame_method() == method, "method matches"); +- assert(interpreter_frame->interpreter_frame_local_at(9) == (intptr_t *)((intptr_t)locals - (9 * Interpreter::stackElementSize)), "locals match"); +- assert(interpreter_frame->interpreter_frame_monitor_end() == mp, "monitor_end matches"); +- assert(((intptr_t *)interpreter_frame->interpreter_frame_monitor_begin()) == ((intptr_t *)mp)+monitor_size, "monitor_begin matches"); +- assert(interpreter_frame->interpreter_frame_tos_address()-1 == esp, "esp matches"); ++ assert(interpreter_frame->interpreter_frame_method() == method, "method matches"); ++ assert(interpreter_frame->interpreter_frame_local_at(9) == (intptr_t *)((intptr_t)locals - (9 * Interpreter::stackElementSize)), "locals match"); ++ assert(interpreter_frame->interpreter_frame_monitor_end() == mp, "monitor_end matches"); ++ assert(((intptr_t *)interpreter_frame->interpreter_frame_monitor_begin()) == ((intptr_t *)mp)+monitor_size, "monitor_begin matches"); ++ assert(interpreter_frame->interpreter_frame_tos_address()-1 == esp, "esp matches"); + +- // check bounds +- intptr_t* lo = interpreter_frame->sp() + (frame::memory_parameter_word_sp_offset - 1); +- intptr_t* hi = interpreter_frame->fp() - rounded_vm_local_words; +- assert(lo < monitors && montop <= hi, "monitors in bounds"); +- assert(lo <= esp && esp < monitors, "esp in bounds"); ++ // check bounds ++ intptr_t* lo = interpreter_frame->sp() + (frame::memory_parameter_word_sp_offset - 1); ++ intptr_t* hi = interpreter_frame->fp() - rounded_vm_local_words; ++ assert(lo < monitors && montop <= hi, "monitors in bounds"); ++ assert(lo <= esp && esp < monitors, "esp in bounds"); + #endif // ASSERT +- } +- +- return raw_frame_size; + } + + //---------------------------------------------------------------------------------------------------- +--- ./hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -2942,12 +2942,12 @@ + + + void TemplateTable::generate_vtable_call(Register Rrecv, Register Rindex, Register Rret) { +- Register Rtemp = G4_scratch; + Register Rcall = Rindex; + assert_different_registers(Rcall, G5_method, Gargs, Rret); + + // get target Method* & entry point + __ lookup_virtual_method(Rrecv, Rindex, G5_method); ++ __ profile_arguments_type(G5_method, Rcall, Gargs, true); + __ call_from_interpreter(Rcall, Gargs, Rret); + } + +@@ -3022,6 +3022,7 @@ + __ null_check(O0); + + __ profile_final_call(O4); ++ __ profile_arguments_type(G5_method, Rscratch, Gargs, true); + + // get return address + AddressLiteral table(Interpreter::invoke_return_entry_table()); +@@ -3051,6 +3052,7 @@ + + // do the call + __ profile_call(O4); ++ __ profile_arguments_type(G5_method, Rscratch, Gargs, false); + __ call_from_interpreter(Rscratch, Gargs, Rret); + } + +@@ -3066,6 +3068,7 @@ + + // do the call + __ profile_call(O4); ++ __ profile_arguments_type(G5_method, Rscratch, Gargs, false); + __ call_from_interpreter(Rscratch, Gargs, Rret); + } + +@@ -3091,6 +3094,7 @@ + // do the call - the index (f2) contains the Method* + assert_different_registers(G5_method, Gargs, Rcall); + __ mov(Rindex, G5_method); ++ __ profile_arguments_type(G5_method, Rcall, Gargs, true); + __ call_from_interpreter(Rcall, Gargs, Rret); + __ bind(notFinal); + +@@ -3197,6 +3201,7 @@ + Register Rcall = Rinterface; + assert_different_registers(Rcall, G5_method, Gargs, Rret); + ++ __ profile_arguments_type(G5_method, Rcall, Gargs, true); + __ call_from_interpreter(Rcall, Gargs, Rret); + } + +@@ -3226,6 +3231,7 @@ + // do the call + __ verify_oop(G4_mtype); + __ profile_final_call(O4); // FIXME: profile the LambdaForm also ++ __ profile_arguments_type(G5_method, Rscratch, Gargs, true); + __ call_from_interpreter(Rscratch, Gargs, Rret); + } + +@@ -3262,6 +3268,7 @@ + + // do the call + __ verify_oop(G4_callsite); ++ __ profile_arguments_type(G5_method, Rscratch, Gargs, false); + __ call_from_interpreter(Rscratch, Gargs, Rret); + } + +--- ./hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -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", ++ jio_snprintf(buf, sizeof(buf), "%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" : ""), +@@ -242,6 +242,7 @@ + (has_vis3() ? ", vis3" : ""), + (has_blk_init() ? ", blk_init" : ""), + (has_cbcond() ? ", cbcond" : ""), ++ (has_aes() ? ", aes" : ""), + (is_ultra3() ? ", ultra3" : ""), + (is_sun4v() ? ", sun4v" : ""), + (is_niagara_plus() ? ", niagara_plus" : (is_niagara() ? ", niagara" : "")), +@@ -265,6 +266,41 @@ + if (!has_vis1()) // Drop to 0 if no VIS1 support + UseVIS = 0; + ++ // SPARC T4 and above should have support for AES instructions ++ if (has_aes()) { ++ if (UseVIS > 2) { // AES intrinsics use MOVxTOd/MOVdTOx which are VIS3 ++ if (FLAG_IS_DEFAULT(UseAES)) { ++ FLAG_SET_DEFAULT(UseAES, true); ++ } ++ if (FLAG_IS_DEFAULT(UseAESIntrinsics)) { ++ FLAG_SET_DEFAULT(UseAESIntrinsics, true); ++ } ++ // we disable both the AES flags if either of them is disabled on the command line ++ if (!UseAES || !UseAESIntrinsics) { ++ FLAG_SET_DEFAULT(UseAES, false); ++ FLAG_SET_DEFAULT(UseAESIntrinsics, false); ++ } ++ } else { ++ if (UseAES || UseAESIntrinsics) { ++ warning("SPARC AES intrinsics require VIS3 instruction support. Intrinsics will be disabled."); ++ if (UseAES) { ++ FLAG_SET_DEFAULT(UseAES, false); ++ } ++ if (UseAESIntrinsics) { ++ FLAG_SET_DEFAULT(UseAESIntrinsics, false); ++ } ++ } ++ } ++ } else if (UseAES || UseAESIntrinsics) { ++ warning("AES instructions are not available on this CPU"); ++ if (UseAES) { ++ FLAG_SET_DEFAULT(UseAES, false); ++ } ++ if (UseAESIntrinsics) { ++ FLAG_SET_DEFAULT(UseAESIntrinsics, false); ++ } ++ } ++ + if (FLAG_IS_DEFAULT(ContendedPaddingWidth) && + (cache_line_size > ContendedPaddingWidth)) + ContendedPaddingWidth = cache_line_size; +@@ -282,22 +318,22 @@ + tty->print("BIS"); + } + if (AllocatePrefetchLines > 1) { +- tty->print_cr(" at distance %d, %d lines of %d bytes", AllocatePrefetchDistance, AllocatePrefetchLines, AllocatePrefetchStepSize); ++ tty->print_cr(" at distance %d, %d lines of %d bytes", (int) AllocatePrefetchDistance, (int) AllocatePrefetchLines, (int) AllocatePrefetchStepSize); + } else { +- tty->print_cr(" at distance %d, one line of %d bytes", AllocatePrefetchDistance, AllocatePrefetchStepSize); ++ tty->print_cr(" at distance %d, one line of %d bytes", (int) AllocatePrefetchDistance, (int) AllocatePrefetchStepSize); + } + } + if (PrefetchCopyIntervalInBytes > 0) { +- tty->print_cr("PrefetchCopyIntervalInBytes %d", PrefetchCopyIntervalInBytes); ++ tty->print_cr("PrefetchCopyIntervalInBytes %d", (int) PrefetchCopyIntervalInBytes); + } + if (PrefetchScanIntervalInBytes > 0) { +- tty->print_cr("PrefetchScanIntervalInBytes %d", PrefetchScanIntervalInBytes); ++ tty->print_cr("PrefetchScanIntervalInBytes %d", (int) PrefetchScanIntervalInBytes); + } + if (PrefetchFieldsAhead > 0) { +- tty->print_cr("PrefetchFieldsAhead %d", PrefetchFieldsAhead); ++ tty->print_cr("PrefetchFieldsAhead %d", (int) PrefetchFieldsAhead); + } + if (ContendedPaddingWidth > 0) { +- tty->print_cr("ContendedPaddingWidth %d", ContendedPaddingWidth); ++ tty->print_cr("ContendedPaddingWidth %d", (int) ContendedPaddingWidth); + } + } + #endif // PRODUCT +--- ./hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/sparc/vm/vm_version_sparc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -48,7 +48,9 @@ + sparc64_family = 14, + M_family = 15, + T_family = 16, +- T1_model = 17 ++ T1_model = 17, ++ sparc5_instructions = 18, ++ aes_instructions = 19 + }; + + enum Feature_Flag_Set { +@@ -73,6 +75,8 @@ + M_family_m = 1 << M_family, + T_family_m = 1 << T_family, + T1_model_m = 1 << T1_model, ++ sparc5_instructions_m = 1 << sparc5_instructions, ++ aes_instructions_m = 1 << aes_instructions, + + generic_v8_m = v8_instructions_m | hardware_mul32_m | hardware_div32_m | hardware_fsmuld_m, + generic_v9_m = generic_v8_m | v9_instructions_m, +@@ -123,6 +127,8 @@ + static bool has_vis3() { return (_features & vis3_instructions_m) != 0; } + static bool has_blk_init() { return (_features & blk_init_instructions_m) != 0; } + 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 supports_compare_and_exchange() + { return has_v9(); } +@@ -133,6 +139,7 @@ + + static bool is_M_series() { return is_M_family(_features); } + static bool is_T4() { return is_T_family(_features) && has_cbcond(); } ++ static bool is_T7() { return is_T_family(_features) && has_sparc5_instr(); } + + // Fujitsu SPARC64 + static bool is_sparc64() { return (_features & sparc64_family_m) != 0; } +@@ -152,7 +159,7 @@ + static const char* cpu_features() { return _features_str; } + + static intx prefetch_data_size() { +- return is_T4() ? 32 : 64; // default prefetch block size on sparc ++ return is_T4() && !is_T7() ? 32 : 64; // default prefetch block size on sparc + } + + // Prefetch +--- ./hotspot/src/cpu/x86/vm/assembler_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/assembler_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -522,11 +522,11 @@ + // these asserts are somewhat nonsensical + #ifndef _LP64 + assert(which == imm_operand || which == disp32_operand, +- err_msg("which %d is_64_bit %d ip " INTPTR_FORMAT, which, is_64bit, ip)); ++ err_msg("which %d is_64_bit %d ip " INTPTR_FORMAT, which, is_64bit, p2i(ip))); + #else + assert((which == call32_operand || which == imm_operand) && is_64bit || + which == narrow_oop_operand && !is_64bit, +- err_msg("which %d is_64_bit %d ip " INTPTR_FORMAT, which, is_64bit, ip)); ++ err_msg("which %d is_64_bit %d ip " INTPTR_FORMAT, which, is_64bit, p2i(ip))); + #endif // _LP64 + return ip; + +@@ -1089,6 +1089,21 @@ + emit_arith(0x23, 0xC0, dst, src); + } + ++void Assembler::andnl(Register dst, Register src1, Register src2) { ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ int encode = vex_prefix_0F38_and_encode(dst, src1, src2); ++ emit_int8((unsigned char)0xF2); ++ emit_int8((unsigned char)(0xC0 | encode)); ++} ++ ++void Assembler::andnl(Register dst, Register src1, Address src2) { ++ InstructionMark im(this); ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ vex_prefix_0F38(dst, src1, src2); ++ emit_int8((unsigned char)0xF2); ++ emit_operand(dst, src2); ++} ++ + void Assembler::bsfl(Register dst, Register src) { + int encode = prefix_and_encode(dst->encoding(), src->encoding()); + emit_int8(0x0F); +@@ -1097,7 +1112,6 @@ + } + + void Assembler::bsrl(Register dst, Register src) { +- assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT"); + int encode = prefix_and_encode(dst->encoding(), src->encoding()); + emit_int8(0x0F); + emit_int8((unsigned char)0xBD); +@@ -1110,6 +1124,51 @@ + emit_int8((unsigned char)(0xC8 | encode)); + } + ++void Assembler::blsil(Register dst, Register src) { ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ int encode = vex_prefix_0F38_and_encode(rbx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_int8((unsigned char)(0xC0 | encode)); ++} ++ ++void Assembler::blsil(Register dst, Address src) { ++ InstructionMark im(this); ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ vex_prefix_0F38(rbx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_operand(rbx, src); ++} ++ ++void Assembler::blsmskl(Register dst, Register src) { ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ int encode = vex_prefix_0F38_and_encode(rdx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_int8((unsigned char)(0xC0 | encode)); ++} ++ ++void Assembler::blsmskl(Register dst, Address src) { ++ InstructionMark im(this); ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ vex_prefix_0F38(rdx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_operand(rdx, src); ++} ++ ++void Assembler::blsrl(Register dst, Register src) { ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ int encode = vex_prefix_0F38_and_encode(rcx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_int8((unsigned char)(0xC0 | encode)); ++} ++ ++void Assembler::blsrl(Register dst, Address src) { ++ InstructionMark im(this); ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ vex_prefix_0F38(rcx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_operand(rcx, src); ++} ++ + void Assembler::call(Label& L, relocInfo::relocType rtype) { + // suspect disp32 is always good + int operand = LP64_ONLY(disp32_operand) NOT_LP64(imm_operand); +@@ -1707,7 +1766,7 @@ + + // Move Unaligned 256bit Vector + void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) { +- assert(UseAVX, ""); ++ assert(UseAVX > 0, ""); + bool vector256 = true; + int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, vector256); + emit_int8(0x6F); +@@ -1715,7 +1774,7 @@ + } + + void Assembler::vmovdqu(XMMRegister dst, Address src) { +- assert(UseAVX, ""); ++ assert(UseAVX > 0, ""); + InstructionMark im(this); + bool vector256 = true; + vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector256); +@@ -1724,7 +1783,7 @@ + } + + void Assembler::vmovdqu(Address dst, XMMRegister src) { +- assert(UseAVX, ""); ++ assert(UseAVX > 0, ""); + InstructionMark im(this); + bool vector256 = true; + // swap src<->dst for encoding +@@ -2283,6 +2342,11 @@ + emit_int8(imm8); + } + ++void Assembler::pause() { ++ emit_int8((unsigned char)0xF3); ++ emit_int8((unsigned char)0x90); ++} ++ + void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) { + assert(VM_Version::supports_sse4_2(), ""); + InstructionMark im(this); +@@ -2607,6 +2671,11 @@ + } + } + ++void Assembler::rdtsc() { ++ emit_int8((unsigned char)0x0F); ++ emit_int8((unsigned char)0x31); ++} ++ + // copies data from [esi] to [edi] using rcx pointer sized words + // generic + void Assembler::rep_mov() { +@@ -2878,6 +2947,24 @@ + emit_operand(dst, src); + } + ++void Assembler::tzcntl(Register dst, Register src) { ++ assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported"); ++ emit_int8((unsigned char)0xF3); ++ int encode = prefix_and_encode(dst->encoding(), src->encoding()); ++ emit_int8(0x0F); ++ emit_int8((unsigned char)0xBC); ++ emit_int8((unsigned char)0xC0 | encode); ++} ++ ++void Assembler::tzcntq(Register dst, Register src) { ++ assert(VM_Version::supports_bmi1(), "tzcnt instruction not supported"); ++ emit_int8((unsigned char)0xF3); ++ int encode = prefixq_and_encode(dst->encoding(), src->encoding()); ++ emit_int8(0x0F); ++ emit_int8((unsigned char)0xBC); ++ emit_int8((unsigned char)(0xC0 | encode)); ++} ++ + void Assembler::ucomisd(XMMRegister dst, Address src) { + NOT_LP64(assert(VM_Version::supports_sse2(), "")); + emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_66); +@@ -2898,6 +2985,11 @@ + emit_simd_arith_nonds(0x2E, dst, src, VEX_SIMD_NONE); + } + ++void Assembler::xabort(int8_t imm8) { ++ emit_int8((unsigned char)0xC6); ++ emit_int8((unsigned char)0xF8); ++ emit_int8((unsigned char)(imm8 & 0xFF)); ++} + + void Assembler::xaddl(Address dst, Register src) { + InstructionMark im(this); +@@ -2907,6 +2999,24 @@ + emit_operand(src, dst); + } + ++void Assembler::xbegin(Label& abort, relocInfo::relocType rtype) { ++ InstructionMark im(this); ++ relocate(rtype); ++ if (abort.is_bound()) { ++ address entry = target(abort); ++ assert(entry != NULL, "abort entry NULL"); ++ intptr_t offset = entry - pc(); ++ emit_int8((unsigned char)0xC7); ++ emit_int8((unsigned char)0xF8); ++ emit_int32(offset - 6); // 2 opcode + 4 address ++ } else { ++ abort.add_patch_at(code(), locator()); ++ emit_int8((unsigned char)0xC7); ++ emit_int8((unsigned char)0xF8); ++ emit_int32(0); ++ } ++} ++ + void Assembler::xchgl(Register dst, Address src) { // xchg + InstructionMark im(this); + prefix(src, dst); +@@ -2920,6 +3030,12 @@ + emit_int8((unsigned char)(0xC0 | encode)); + } + ++void Assembler::xend() { ++ emit_int8((unsigned char)0x0F); ++ emit_int8((unsigned char)0x01); ++ emit_int8((unsigned char)0xD5); ++} ++ + void Assembler::xgetbv() { + emit_int8(0x0F); + emit_int8(0x01); +@@ -4837,6 +4953,21 @@ + emit_arith(0x23, 0xC0, dst, src); + } + ++void Assembler::andnq(Register dst, Register src1, Register src2) { ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ int encode = vex_prefix_0F38_and_encode_q(dst, src1, src2); ++ emit_int8((unsigned char)0xF2); ++ emit_int8((unsigned char)(0xC0 | encode)); ++} ++ ++void Assembler::andnq(Register dst, Register src1, Address src2) { ++ InstructionMark im(this); ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ vex_prefix_0F38_q(dst, src1, src2); ++ emit_int8((unsigned char)0xF2); ++ emit_operand(dst, src2); ++} ++ + void Assembler::bsfq(Register dst, Register src) { + int encode = prefixq_and_encode(dst->encoding(), src->encoding()); + emit_int8(0x0F); +@@ -4845,7 +4976,6 @@ + } + + void Assembler::bsrq(Register dst, Register src) { +- assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT"); + int encode = prefixq_and_encode(dst->encoding(), src->encoding()); + emit_int8(0x0F); + emit_int8((unsigned char)0xBD); +@@ -4858,6 +4988,51 @@ + emit_int8((unsigned char)(0xC8 | encode)); + } + ++void Assembler::blsiq(Register dst, Register src) { ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ int encode = vex_prefix_0F38_and_encode_q(rbx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_int8((unsigned char)(0xC0 | encode)); ++} ++ ++void Assembler::blsiq(Register dst, Address src) { ++ InstructionMark im(this); ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ vex_prefix_0F38_q(rbx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_operand(rbx, src); ++} ++ ++void Assembler::blsmskq(Register dst, Register src) { ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ int encode = vex_prefix_0F38_and_encode_q(rdx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_int8((unsigned char)(0xC0 | encode)); ++} ++ ++void Assembler::blsmskq(Register dst, Address src) { ++ InstructionMark im(this); ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ vex_prefix_0F38_q(rdx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_operand(rdx, src); ++} ++ ++void Assembler::blsrq(Register dst, Register src) { ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ int encode = vex_prefix_0F38_and_encode_q(rcx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_int8((unsigned char)(0xC0 | encode)); ++} ++ ++void Assembler::blsrq(Register dst, Address src) { ++ InstructionMark im(this); ++ assert(VM_Version::supports_bmi1(), "bit manipulation instructions not supported"); ++ vex_prefix_0F38_q(rcx, dst, src); ++ emit_int8((unsigned char)0xF3); ++ emit_operand(rcx, src); ++} ++ + void Assembler::cdqq() { + prefix(REX_W); + emit_int8((unsigned char)0x99); +--- ./hotspot/src/cpu/x86/vm/assembler_x86.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/assembler_x86.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -590,10 +590,35 @@ + vex_prefix(src, nds_enc, dst_enc, pre, VEX_OPCODE_0F, false, vector256); + } + ++ void vex_prefix_0F38(Register dst, Register nds, Address src) { ++ bool vex_w = false; ++ bool vector256 = false; ++ vex_prefix(src, nds->encoding(), dst->encoding(), ++ VEX_SIMD_NONE, VEX_OPCODE_0F_38, vex_w, vector256); ++ } ++ ++ void vex_prefix_0F38_q(Register dst, Register nds, Address src) { ++ bool vex_w = true; ++ bool vector256 = false; ++ vex_prefix(src, nds->encoding(), dst->encoding(), ++ VEX_SIMD_NONE, VEX_OPCODE_0F_38, vex_w, vector256); ++ } + int vex_prefix_and_encode(int dst_enc, int nds_enc, int src_enc, + VexSimdPrefix pre, VexOpcode opc, + bool vex_w, bool vector256); + ++ int vex_prefix_0F38_and_encode(Register dst, Register nds, Register src) { ++ bool vex_w = false; ++ bool vector256 = false; ++ return vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), ++ VEX_SIMD_NONE, VEX_OPCODE_0F_38, vex_w, vector256); ++ } ++ int vex_prefix_0F38_and_encode_q(Register dst, Register nds, Register src) { ++ bool vex_w = true; ++ bool vector256 = false; ++ return vex_prefix_and_encode(dst->encoding(), nds->encoding(), src->encoding(), ++ VEX_SIMD_NONE, VEX_OPCODE_0F_38, vex_w, vector256); ++ } + int vex_prefix_and_encode(XMMRegister dst, XMMRegister nds, XMMRegister src, + VexSimdPrefix pre, bool vector256 = false, + VexOpcode opc = VEX_OPCODE_0F) { +@@ -897,6 +922,27 @@ + void andq(Register dst, Address src); + void andq(Register dst, Register src); + ++ // BMI instructions ++ void andnl(Register dst, Register src1, Register src2); ++ void andnl(Register dst, Register src1, Address src2); ++ void andnq(Register dst, Register src1, Register src2); ++ void andnq(Register dst, Register src1, Address src2); ++ ++ void blsil(Register dst, Register src); ++ void blsil(Register dst, Address src); ++ void blsiq(Register dst, Register src); ++ void blsiq(Register dst, Address src); ++ ++ void blsmskl(Register dst, Register src); ++ void blsmskl(Register dst, Address src); ++ void blsmskq(Register dst, Register src); ++ void blsmskq(Register dst, Address src); ++ ++ void blsrl(Register dst, Register src); ++ void blsrl(Register dst, Address src); ++ void blsrq(Register dst, Register src); ++ void blsrq(Register dst, Address src); ++ + void bsfl(Register dst, Register src); + void bsrl(Register dst, Register src); + +@@ -1405,6 +1451,8 @@ + // Pemutation of 64bit words + void vpermq(XMMRegister dst, XMMRegister src, int imm8, bool vector256); + ++ void pause(); ++ + // SSE4.2 string instructions + void pcmpestri(XMMRegister xmm1, XMMRegister xmm2, int imm8); + void pcmpestri(XMMRegister xmm1, Address src, int imm8); +@@ -1489,6 +1537,8 @@ + + void rclq(Register dst, int imm8); + ++ void rdtsc(); ++ + void ret(int imm16); + + void sahf(); +@@ -1574,6 +1624,9 @@ + void testq(Register dst, int32_t imm32); + void testq(Register dst, Register src); + ++ // BMI - count trailing zeros ++ void tzcntl(Register dst, Register src); ++ void tzcntq(Register dst, Register src); + + // Unordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS + void ucomisd(XMMRegister dst, Address src); +@@ -1583,16 +1636,22 @@ + void ucomiss(XMMRegister dst, Address src); + void ucomiss(XMMRegister dst, XMMRegister src); + ++ void xabort(int8_t imm8); ++ + void xaddl(Address dst, Register src); + + void xaddq(Address dst, Register src); + ++ void xbegin(Label& abort, relocInfo::relocType rtype = relocInfo::none); ++ + void xchgl(Register reg, Address adr); + void xchgl(Register dst, Register src); + + void xchgq(Register reg, Address adr); + void xchgq(Register dst, Register src); + ++ void xend(); ++ + // Get Value of Extended Control Register + void xgetbv(); + +--- ./hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/bytecodeInterpreter_x86.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -94,7 +94,7 @@ + #define LOCALS_ADDR(offset) ((address)locals[-(offset)]) + #define LOCALS_INT(offset) ((jint)(locals[-(offset)])) + #define LOCALS_FLOAT(offset) (*((jfloat*)&locals[-(offset)])) +-#define LOCALS_OBJECT(offset) ((oop)locals[-(offset)]) ++#define LOCALS_OBJECT(offset) (cast_to_oop(locals[-(offset)])) + #define LOCALS_DOUBLE(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->d) + #define LOCALS_LONG(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->l) + #define LOCALS_LONG_AT(offset) (((address)&locals[-((offset) + 1)])) +--- ./hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -288,7 +288,7 @@ + + // build frame + ciMethod* m = compilation()->method(); +- __ build_frame(initial_frame_size_in_bytes()); ++ __ build_frame(initial_frame_size_in_bytes(), bang_size_in_bytes()); + + // OSR buffer is + // +@@ -376,7 +376,7 @@ + } + + // This specifies the rsp decrement needed to build the frame +-int LIR_Assembler::initial_frame_size_in_bytes() { ++int LIR_Assembler::initial_frame_size_in_bytes() const { + // if rounding, must let FrameMap know! + + // The frame_map records size in slots (32bit word) +@@ -801,7 +801,13 @@ + if (UseCompressedOops && !wide) { + __ movl(as_Address(addr), (int32_t)NULL_WORD); + } else { ++#ifdef _LP64 ++ __ xorptr(rscratch1, rscratch1); ++ null_check_here = code_offset(); ++ __ movptr(as_Address(addr), rscratch1); ++#else + __ movptr(as_Address(addr), NULL_WORD); ++#endif + } + } else { + if (is_literal_address(addr)) { +--- ./hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/c1_LinearScan_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -95,7 +95,7 @@ + + #ifndef PRODUCT + if (TraceFPURegisterUsage) { +- tty->print("FPU regs for block %d, LIR instr %d): ", b->block_id(), id); regs.print_on(tty); tty->print_cr(""); ++ tty->print("FPU regs for block %d, LIR instr %d): ", b->block_id(), id); regs.print_on(tty); tty->cr(); + } + #endif + } +--- ./hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -349,13 +349,14 @@ + } + + +-void C1_MacroAssembler::build_frame(int frame_size_in_bytes) { ++void C1_MacroAssembler::build_frame(int frame_size_in_bytes, int bang_size_in_bytes) { ++ assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect"); + // Make sure there is enough stack space for this method's activation. + // Note that we do this before doing an enter(). This matches the + // ordering of C2's stack overflow check / rsp decrement and allows + // the SharedRuntime stack overflow handling to be consistent + // between the two compilers. +- generate_stack_overflow_check(frame_size_in_bytes); ++ generate_stack_overflow_check(bang_size_in_bytes); + + push(rbp); + #ifdef TIERED +--- ./hotspot/src/cpu/x86/vm/c2_globals_x86.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/c2_globals_x86.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -88,6 +88,8 @@ + define_pd_global(uintx, CodeCacheMinBlockLength, 4); + define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K); + ++define_pd_global(bool, TrapBasedRangeChecks, false); // Not needed on x86. ++ + // Heap related flags + define_pd_global(uintx,MetaspaceSize, ScaleForWordSize(16*M)); + +--- ./hotspot/src/cpu/x86/vm/compiledIC_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/compiledIC_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -122,7 +122,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()); + } + +--- ./hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/cppInterpreter_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1354,7 +1354,7 @@ + + // reset handle block + __ movptr(t, Address(thread, JavaThread::active_handles_offset())); +- __ movptr(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); ++ __ movl(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); + + // If result was an oop then unbox and save it in the frame + { Label L; +@@ -2336,29 +2336,42 @@ + "Stack top out of range"); + } + +-int AbstractInterpreter::layout_activation(Method* method, +- int tempcount, // +- int popframe_extra_args, +- int moncount, +- int caller_actual_parameters, +- int callee_param_count, +- int callee_locals, +- frame* caller, +- frame* interpreter_frame, +- bool is_top_frame, +- bool is_bottom_frame) { +- +- assert(popframe_extra_args == 0, "FIX ME"); +- // NOTE this code must exactly mimic what InterpreterGenerator::generate_compute_interpreter_state() +- // does as far as allocating an interpreter frame. +- // If interpreter_frame!=NULL, set up the method, locals, and monitors. +- // The frame interpreter_frame, if not NULL, is guaranteed to be the right size, +- // as determined by a previous call to this method. +- // It is also guaranteed to be walkable even though it is in a skeletal state ++ ++static int frame_size_helper(int max_stack, ++ int tempcount, ++ int moncount, ++ int callee_param_count, ++ int callee_locals, ++ bool is_top_frame, ++ int& monitor_size, ++ int& full_frame_size) { ++ int extra_locals_size = (callee_locals - callee_param_count) * BytesPerWord; ++ monitor_size = sizeof(BasicObjectLock) * moncount; ++ ++ // First calculate the frame size without any java expression stack ++ int short_frame_size = size_activation_helper(extra_locals_size, ++ monitor_size); ++ ++ // Now with full size expression stack ++ full_frame_size = short_frame_size + max_stack * BytesPerWord; ++ ++ // and now with only live portion of the expression stack ++ short_frame_size = short_frame_size + tempcount * BytesPerWord; ++ ++ // the size the activation is right now. Only top frame is full size ++ int frame_size = (is_top_frame ? full_frame_size : short_frame_size); ++ return frame_size; ++} ++ ++int AbstractInterpreter::size_activation(int max_stack, ++ int tempcount, ++ int extra_args, ++ int moncount, ++ int callee_param_count, ++ int callee_locals, ++ bool is_top_frame) { ++ assert(extra_args == 0, "FIX ME"); + // NOTE: return size is in words not bytes +- // NOTE: tempcount is the current size of the java expression stack. For top most +- // frames we will allocate a full sized expression stack and not the curback +- // version that non-top frames have. + + // Calculate the amount our frame will be adjust by the callee. For top frame + // this is zero. +@@ -2368,87 +2381,102 @@ + // to it. So it ignores last_frame_adjust value. Seems suspicious as far + // as getting sender_sp correct. + +- int extra_locals_size = (callee_locals - callee_param_count) * BytesPerWord; +- int monitor_size = sizeof(BasicObjectLock) * moncount; +- +- // First calculate the frame size without any java expression stack +- int short_frame_size = size_activation_helper(extra_locals_size, +- monitor_size); +- +- // Now with full size expression stack +- int full_frame_size = short_frame_size + method->max_stack() * BytesPerWord; +- +- // and now with only live portion of the expression stack +- short_frame_size = short_frame_size + tempcount * BytesPerWord; +- +- // the size the activation is right now. Only top frame is full size +- int frame_size = (is_top_frame ? full_frame_size : short_frame_size); +- +- if (interpreter_frame != NULL) { ++ int unused_monitor_size = 0; ++ int unused_full_frame_size = 0; ++ return frame_size_helper(max_stack, tempcount, moncount, callee_param_count, callee_locals, ++ is_top_frame, unused_monitor_size, unused_full_frame_size)/BytesPerWord; ++} ++ ++void AbstractInterpreter::layout_activation(Method* method, ++ int tempcount, // ++ int popframe_extra_args, ++ int moncount, ++ int caller_actual_parameters, ++ int callee_param_count, ++ int callee_locals, ++ frame* caller, ++ frame* interpreter_frame, ++ bool is_top_frame, ++ bool is_bottom_frame) { ++ ++ assert(popframe_extra_args == 0, "FIX ME"); ++ // NOTE this code must exactly mimic what InterpreterGenerator::generate_compute_interpreter_state() ++ // does as far as allocating an interpreter frame. ++ // Set up the method, locals, and monitors. ++ // The frame interpreter_frame is guaranteed to be the right size, ++ // as determined by a previous call to the size_activation() method. ++ // It is also guaranteed to be walkable even though it is in a skeletal state ++ // NOTE: tempcount is the current size of the java expression stack. For top most ++ // frames we will allocate a full sized expression stack and not the curback ++ // version that non-top frames have. ++ ++ int monitor_size = 0; ++ int full_frame_size = 0; ++ int frame_size = frame_size_helper(method->max_stack(), tempcount, moncount, callee_param_count, callee_locals, ++ is_top_frame, monitor_size, full_frame_size); ++ + #ifdef ASSERT +- assert(caller->unextended_sp() == interpreter_frame->interpreter_frame_sender_sp(), "Frame not properly walkable"); ++ assert(caller->unextended_sp() == interpreter_frame->interpreter_frame_sender_sp(), "Frame not properly walkable"); + #endif + +- // MUCHO HACK +- +- intptr_t* frame_bottom = (intptr_t*) ((intptr_t)interpreter_frame->sp() - (full_frame_size - frame_size)); +- +- /* Now fillin the interpreterState object */ +- +- // The state object is the first thing on the frame and easily located +- +- interpreterState cur_state = (interpreterState) ((intptr_t)interpreter_frame->fp() - sizeof(BytecodeInterpreter)); +- +- +- // Find the locals pointer. This is rather simple on x86 because there is no +- // confusing rounding at the callee to account for. We can trivially locate +- // our locals based on the current fp(). +- // Note: the + 2 is for handling the "static long no_params() method" issue. +- // (too bad I don't really remember that issue well...) +- +- intptr_t* locals; +- // If the caller is interpreted we need to make sure that locals points to the first +- // argument that the caller passed and not in an area where the stack might have been extended. +- // because the stack to stack to converter needs a proper locals value in order to remove the +- // arguments from the caller and place the result in the proper location. Hmm maybe it'd be +- // simpler if we simply stored the result in the BytecodeInterpreter object and let the c++ code +- // adjust the stack?? HMMM QQQ +- // +- if (caller->is_interpreted_frame()) { +- // locals must agree with the caller because it will be used to set the +- // caller's tos when we return. +- interpreterState prev = caller->get_interpreterState(); +- // stack() is prepushed. +- locals = prev->stack() + method->size_of_parameters(); +- // locals = caller->unextended_sp() + (method->size_of_parameters() - 1); +- if (locals != interpreter_frame->fp() + frame::sender_sp_offset + (method->max_locals() - 1) + 2) { +- // os::breakpoint(); +- } +- } else { +- // this is where a c2i would have placed locals (except for the +2) +- locals = interpreter_frame->fp() + frame::sender_sp_offset + (method->max_locals() - 1) + 2; ++ // MUCHO HACK ++ ++ intptr_t* frame_bottom = (intptr_t*) ((intptr_t)interpreter_frame->sp() - (full_frame_size - frame_size)); ++ ++ /* Now fillin the interpreterState object */ ++ ++ // The state object is the first thing on the frame and easily located ++ ++ interpreterState cur_state = (interpreterState) ((intptr_t)interpreter_frame->fp() - sizeof(BytecodeInterpreter)); ++ ++ ++ // Find the locals pointer. This is rather simple on x86 because there is no ++ // confusing rounding at the callee to account for. We can trivially locate ++ // our locals based on the current fp(). ++ // Note: the + 2 is for handling the "static long no_params() method" issue. ++ // (too bad I don't really remember that issue well...) ++ ++ intptr_t* locals; ++ // If the caller is interpreted we need to make sure that locals points to the first ++ // argument that the caller passed and not in an area where the stack might have been extended. ++ // because the stack to stack to converter needs a proper locals value in order to remove the ++ // arguments from the caller and place the result in the proper location. Hmm maybe it'd be ++ // simpler if we simply stored the result in the BytecodeInterpreter object and let the c++ code ++ // adjust the stack?? HMMM QQQ ++ // ++ if (caller->is_interpreted_frame()) { ++ // locals must agree with the caller because it will be used to set the ++ // caller's tos when we return. ++ interpreterState prev = caller->get_interpreterState(); ++ // stack() is prepushed. ++ locals = prev->stack() + method->size_of_parameters(); ++ // locals = caller->unextended_sp() + (method->size_of_parameters() - 1); ++ if (locals != interpreter_frame->fp() + frame::sender_sp_offset + (method->max_locals() - 1) + 2) { ++ // os::breakpoint(); + } +- +- intptr_t* monitor_base = (intptr_t*) cur_state; +- intptr_t* stack_base = (intptr_t*) ((intptr_t) monitor_base - monitor_size); +- /* +1 because stack is always prepushed */ +- intptr_t* stack = (intptr_t*) ((intptr_t) stack_base - (tempcount + 1) * BytesPerWord); +- +- +- BytecodeInterpreter::layout_interpreterState(cur_state, +- caller, +- interpreter_frame, +- method, +- locals, +- stack, +- stack_base, +- monitor_base, +- frame_bottom, +- is_top_frame); +- +- // BytecodeInterpreter::pd_layout_interpreterState(cur_state, interpreter_return_address, interpreter_frame->fp()); ++ } else { ++ // this is where a c2i would have placed locals (except for the +2) ++ locals = interpreter_frame->fp() + frame::sender_sp_offset + (method->max_locals() - 1) + 2; + } +- return frame_size/BytesPerWord; ++ ++ intptr_t* monitor_base = (intptr_t*) cur_state; ++ intptr_t* stack_base = (intptr_t*) ((intptr_t) monitor_base - monitor_size); ++ /* +1 because stack is always prepushed */ ++ intptr_t* stack = (intptr_t*) ((intptr_t) stack_base - (tempcount + 1) * BytesPerWord); ++ ++ ++ BytecodeInterpreter::layout_interpreterState(cur_state, ++ caller, ++ interpreter_frame, ++ method, ++ locals, ++ stack, ++ stack_base, ++ monitor_base, ++ frame_bottom, ++ is_top_frame); ++ ++ // BytecodeInterpreter::pd_layout_interpreterState(cur_state, interpreter_return_address, interpreter_frame->fp()); + } + + #endif // CC_INTERP (all) +--- ./hotspot/src/cpu/x86/vm/frame_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/frame_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -48,6 +48,7 @@ + } + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + // Profiling/safepoint support + +--- ./hotspot/src/cpu/x86/vm/frame_x86.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/frame_x86.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -247,6 +247,10 @@ + } + } + ++inline oop* frame::interpreter_frame_temp_oop_addr() const { ++ return (oop *)(fp() + interpreter_frame_oop_temp_offset); ++} ++ + #endif /* CC_INTERP */ + + inline int frame::pd_oop_map_offset_adjustment() const { +--- ./hotspot/src/cpu/x86/vm/globalDefinitions_x86.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/globalDefinitions_x86.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -27,6 +27,12 @@ + + const int StackAlignmentInBytes = 16; + ++// Indicates whether the C calling conventions require that ++// 32-bit integer argument values are properly extended to 64 bits. ++// If set, SharedRuntime::c_calling_convention() must adapt ++// signatures accordingly. ++const bool CCallingConventionRequiresIntsAsLongs = false; ++ + #define SUPPORTS_NATIVE_CX8 + + #endif // CPU_X86_VM_GLOBALDEFINITIONS_X86_HPP +--- ./hotspot/src/cpu/x86/vm/globals_x86.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/globals_x86.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -37,7 +37,8 @@ + define_pd_global(bool, NeedsDeoptSuspend, false); // only register window machines need this + + define_pd_global(bool, ImplicitNullChecks, true); // Generate code for implicit null checks +-define_pd_global(bool, UncommonNullCast, true); // Uncommon-trap NULLs past to check cast ++define_pd_global(bool, TrapBasedNullChecks, false); // Not needed on x86. ++define_pd_global(bool, UncommonNullCast, true); // Uncommon-trap NULLs passed to check cast + + // See 4827828 for this change. There is no globals_core_i486.hpp. I can't + // assign a different value for C2 without touching a number of files. Use +@@ -128,11 +129,53 @@ + product(bool, UseFastStosb, false, \ + "Use fast-string operation for zeroing: rep stosb") \ + \ ++ /* Use Restricted Transactional Memory for lock eliding */ \ ++ experimental(bool, UseRTMLocking, false, \ ++ "Enable RTM lock eliding for inflated locks in compiled code") \ ++ \ ++ experimental(bool, UseRTMForStackLocks, false, \ ++ "Enable RTM lock eliding for stack locks in compiled code") \ ++ \ ++ experimental(bool, UseRTMDeopt, false, \ ++ "Perform deopt and recompilation based on RTM abort ratio") \ ++ \ ++ experimental(uintx, RTMRetryCount, 5, \ ++ "Number of RTM retries on lock abort or busy") \ ++ \ ++ experimental(intx, RTMSpinLoopCount, 100, \ ++ "Spin count for lock to become free before RTM retry") \ ++ \ ++ experimental(intx, RTMAbortThreshold, 1000, \ ++ "Calculate abort ratio after this number of aborts") \ ++ \ ++ experimental(intx, RTMLockingThreshold, 10000, \ ++ "Lock count at which to do RTM lock eliding without " \ ++ "abort ratio calculation") \ ++ \ ++ experimental(intx, RTMAbortRatio, 50, \ ++ "Lock abort ratio at which to stop use RTM lock eliding") \ ++ \ ++ experimental(intx, RTMTotalCountIncrRate, 64, \ ++ "Increment total RTM attempted lock count once every n times") \ ++ \ ++ experimental(intx, RTMLockingCalculationDelay, 0, \ ++ "Number of milliseconds to wait before start calculating aborts " \ ++ "for RTM locking") \ ++ \ ++ experimental(bool, UseRTMXendForLockBusy, true, \ ++ "Use RTM Xend instead of Xabort when lock busy") \ ++ \ + /* assembler */ \ + product(bool, Use486InstrsOnly, false, \ + "Use 80486 Compliant instruction subset") \ + \ + product(bool, UseCountLeadingZerosInstruction, false, \ + "Use count leading zeros instruction") \ ++ \ ++ product(bool, UseCountTrailingZerosInstruction, false, \ ++ "Use count trailing zeros instruction") \ ++ \ ++ product(bool, UseBMI1Instructions, false, \ ++ "Use BMI instructions") + + #endif // CPU_X86_VM_GLOBALS_X86_HPP +--- ./hotspot/src/cpu/x86/vm/interp_masm_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/interp_masm_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -127,7 +127,7 @@ + + if (MethodData::profile_return()) { + // We're right after the type profile for the last +- // argument. tmp is the number of cell left in the ++ // argument. tmp is the number of cells left in the + // CallTypeData/VirtualCallTypeData to reach its end. Non null + // if there's a return to profile. + assert(ReturnTypeEntry::static_cell_count() < TypeStackSlotEntries::per_arg_count(), "can't move past ret type"); +@@ -137,7 +137,7 @@ + movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), mdp); + } else { + assert(MethodData::profile_return(), "either profile call args or call ret"); +- update_mdp_by_constant(mdp, in_bytes(ReturnTypeEntry::size())); ++ update_mdp_by_constant(mdp, in_bytes(TypeEntriesAtCall::return_only_size())); + } + + // mdp points right after the end of the +@@ -198,7 +198,7 @@ + // parameters. Collect profiling from last parameter down. + // mdo start + parameters offset + array length - 1 + addptr(mdp, tmp1); +- movptr(tmp1, Address(mdp, in_bytes(ArrayData::array_len_offset()))); ++ movptr(tmp1, Address(mdp, ArrayData::array_len_offset())); + decrement(tmp1, TypeStackSlotEntries::per_arg_count()); + + Label loop; +--- ./hotspot/src/cpu/x86/vm/interpreter_x86_64.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/interpreter_x86_64.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -51,6 +51,7 @@ + + #define __ _masm-> + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + #ifdef _WIN64 + address AbstractInterpreterGenerator::generate_slow_signature_handler() { +--- ./hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -55,6 +55,7 @@ + + #define BIND(label) bind(label); BLOCK_COMMENT(#label ":") + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + #ifdef ASSERT + bool AbstractAssembler::pd_check_instruction_mark() { return true; } +@@ -98,217 +99,6 @@ + return Address::make_array(adr); + } + +-int MacroAssembler::biased_locking_enter(Register lock_reg, +- Register obj_reg, +- Register swap_reg, +- Register tmp_reg, +- bool swap_reg_contains_mark, +- Label& done, +- Label* slow_case, +- BiasedLockingCounters* counters) { +- assert(UseBiasedLocking, "why call this otherwise?"); +- assert(swap_reg == rax, "swap_reg must be rax, for cmpxchg"); +- assert_different_registers(lock_reg, obj_reg, swap_reg); +- +- if (PrintBiasedLockingStatistics && counters == NULL) +- counters = BiasedLocking::counters(); +- +- bool need_tmp_reg = false; +- if (tmp_reg == noreg) { +- need_tmp_reg = true; +- tmp_reg = lock_reg; +- } else { +- assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg); +- } +- assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, "biased locking makes assumptions about bit layout"); +- Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes()); +- Address klass_addr (obj_reg, oopDesc::klass_offset_in_bytes()); +- Address saved_mark_addr(lock_reg, 0); +- +- // Biased locking +- // See whether the lock is currently biased toward our thread and +- // whether the epoch is still valid +- // Note that the runtime guarantees sufficient alignment of JavaThread +- // pointers to allow age to be placed into low bits +- // First check to see whether biasing is even enabled for this object +- Label cas_label; +- int null_check_offset = -1; +- if (!swap_reg_contains_mark) { +- null_check_offset = offset(); +- movl(swap_reg, mark_addr); +- } +- if (need_tmp_reg) { +- push(tmp_reg); +- } +- movl(tmp_reg, swap_reg); +- andl(tmp_reg, markOopDesc::biased_lock_mask_in_place); +- cmpl(tmp_reg, markOopDesc::biased_lock_pattern); +- if (need_tmp_reg) { +- pop(tmp_reg); +- } +- jcc(Assembler::notEqual, cas_label); +- // The bias pattern is present in the object's header. Need to check +- // whether the bias owner and the epoch are both still current. +- // Note that because there is no current thread register on x86 we +- // need to store off the mark word we read out of the object to +- // avoid reloading it and needing to recheck invariants below. This +- // store is unfortunate but it makes the overall code shorter and +- // simpler. +- movl(saved_mark_addr, swap_reg); +- if (need_tmp_reg) { +- push(tmp_reg); +- } +- get_thread(tmp_reg); +- xorl(swap_reg, tmp_reg); +- if (swap_reg_contains_mark) { +- null_check_offset = offset(); +- } +- movl(tmp_reg, klass_addr); +- xorl(swap_reg, Address(tmp_reg, Klass::prototype_header_offset())); +- andl(swap_reg, ~((int) markOopDesc::age_mask_in_place)); +- if (need_tmp_reg) { +- pop(tmp_reg); +- } +- if (counters != NULL) { +- cond_inc32(Assembler::zero, +- ExternalAddress((address)counters->biased_lock_entry_count_addr())); +- } +- jcc(Assembler::equal, done); +- +- Label try_revoke_bias; +- Label try_rebias; +- +- // At this point we know that the header has the bias pattern and +- // that we are not the bias owner in the current epoch. We need to +- // figure out more details about the state of the header in order to +- // know what operations can be legally performed on the object's +- // header. +- +- // If the low three bits in the xor result aren't clear, that means +- // the prototype header is no longer biased and we have to revoke +- // the bias on this object. +- testl(swap_reg, markOopDesc::biased_lock_mask_in_place); +- jcc(Assembler::notZero, try_revoke_bias); +- +- // Biasing is still enabled for this data type. See whether the +- // epoch of the current bias is still valid, meaning that the epoch +- // bits of the mark word are equal to the epoch bits of the +- // prototype header. (Note that the prototype header's epoch bits +- // only change at a safepoint.) If not, attempt to rebias the object +- // toward the current thread. Note that we must be absolutely sure +- // that the current epoch is invalid in order to do this because +- // otherwise the manipulations it performs on the mark word are +- // illegal. +- testl(swap_reg, markOopDesc::epoch_mask_in_place); +- jcc(Assembler::notZero, try_rebias); +- +- // The epoch of the current bias is still valid but we know nothing +- // about the owner; it might be set or it might be clear. 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. +- // Note that we first construct the presumed unbiased header so we +- // don't accidentally blow away another thread's valid bias. +- movl(swap_reg, saved_mark_addr); +- andl(swap_reg, +- markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place); +- if (need_tmp_reg) { +- push(tmp_reg); +- } +- get_thread(tmp_reg); +- orl(tmp_reg, swap_reg); +- if (os::is_MP()) { +- lock(); +- } +- cmpxchgptr(tmp_reg, Address(obj_reg, 0)); +- if (need_tmp_reg) { +- pop(tmp_reg); +- } +- // If the biasing toward our thread failed, this means that +- // another thread succeeded in biasing it toward itself and we +- // need to revoke that bias. The revocation will occur in the +- // interpreter runtime in the slow case. +- if (counters != NULL) { +- cond_inc32(Assembler::zero, +- ExternalAddress((address)counters->anonymously_biased_lock_entry_count_addr())); +- } +- if (slow_case != NULL) { +- jcc(Assembler::notZero, *slow_case); +- } +- jmp(done); +- +- bind(try_rebias); +- // At this point we know the epoch has expired, meaning that the +- // current "bias owner", if any, is actually invalid. Under these +- // circumstances _only_, we are allowed to use the current header's +- // value as the comparison value when doing the cas to acquire the +- // bias in the current epoch. In other words, we allow transfer of +- // the bias from one thread to another directly in this situation. +- // +- // FIXME: due to a lack of registers we currently blow away the age +- // bits in this situation. Should attempt to preserve them. +- if (need_tmp_reg) { +- push(tmp_reg); +- } +- get_thread(tmp_reg); +- movl(swap_reg, klass_addr); +- orl(tmp_reg, Address(swap_reg, Klass::prototype_header_offset())); +- movl(swap_reg, saved_mark_addr); +- if (os::is_MP()) { +- lock(); +- } +- cmpxchgptr(tmp_reg, Address(obj_reg, 0)); +- if (need_tmp_reg) { +- pop(tmp_reg); +- } +- // If the biasing toward our thread failed, then another thread +- // succeeded in biasing it toward itself and we need to revoke that +- // bias. The revocation will occur in the runtime in the slow case. +- if (counters != NULL) { +- cond_inc32(Assembler::zero, +- ExternalAddress((address)counters->rebiased_lock_entry_count_addr())); +- } +- if (slow_case != NULL) { +- jcc(Assembler::notZero, *slow_case); +- } +- jmp(done); +- +- bind(try_revoke_bias); +- // The prototype mark in the klass doesn't have the bias bit set any +- // more, indicating that objects of this data type are not supposed +- // to be biased any more. 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. Note that if our CAS fails, it means +- // that another thread raced us for the privilege of revoking the +- // bias of this particular object, so it's okay to continue in the +- // normal locking code. +- // +- // FIXME: due to a lack of registers we currently blow away the age +- // bits in this situation. Should attempt to preserve them. +- movl(swap_reg, saved_mark_addr); +- if (need_tmp_reg) { +- push(tmp_reg); +- } +- movl(tmp_reg, klass_addr); +- movl(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset())); +- if (os::is_MP()) { +- lock(); +- } +- cmpxchgptr(tmp_reg, Address(obj_reg, 0)); +- if (need_tmp_reg) { +- pop(tmp_reg); +- } +- // Fall through to the normal CAS-based lock, because no matter what +- // the result of the above CAS, some thread must have succeeded in +- // removing the bias bit from the object's header. +- if (counters != NULL) { +- cond_inc32(Assembler::zero, +- ExternalAddress((address)counters->revoked_lock_entry_count_addr())); +- } +- +- bind(cas_label); +- +- return null_check_offset; +-} + void MacroAssembler::call_VM_leaf_base(address entry_point, + int number_of_arguments) { + call(RuntimeAddress(entry_point)); +@@ -512,7 +302,9 @@ + mov_literal32(dst, (int32_t)obj, metadata_Relocation::spec_for_immediate()); + } + +-void MacroAssembler::movptr(Register dst, AddressLiteral src) { ++void MacroAssembler::movptr(Register dst, AddressLiteral src, Register scratch) { ++ // scratch register is not used, ++ // it is defined to match parameters of 64-bit version of this method. + if (src.is_lval()) { + mov_literal32(dst, (intptr_t)src.target(), src.rspec()); + } else { +@@ -726,165 +518,6 @@ + return array; + } + +-int MacroAssembler::biased_locking_enter(Register lock_reg, +- Register obj_reg, +- Register swap_reg, +- Register tmp_reg, +- bool swap_reg_contains_mark, +- Label& done, +- Label* slow_case, +- BiasedLockingCounters* counters) { +- assert(UseBiasedLocking, "why call this otherwise?"); +- assert(swap_reg == rax, "swap_reg must be rax for cmpxchgq"); +- assert(tmp_reg != noreg, "tmp_reg must be supplied"); +- assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg); +- assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, "biased locking makes assumptions about bit layout"); +- Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes()); +- Address saved_mark_addr(lock_reg, 0); +- +- if (PrintBiasedLockingStatistics && counters == NULL) +- counters = BiasedLocking::counters(); +- +- // Biased locking +- // See whether the lock is currently biased toward our thread and +- // whether the epoch is still valid +- // Note that the runtime guarantees sufficient alignment of JavaThread +- // pointers to allow age to be placed into low bits +- // First check to see whether biasing is even enabled for this object +- Label cas_label; +- int null_check_offset = -1; +- if (!swap_reg_contains_mark) { +- null_check_offset = offset(); +- movq(swap_reg, mark_addr); +- } +- movq(tmp_reg, swap_reg); +- andq(tmp_reg, markOopDesc::biased_lock_mask_in_place); +- cmpq(tmp_reg, markOopDesc::biased_lock_pattern); +- jcc(Assembler::notEqual, cas_label); +- // The bias pattern is present in the object's header. Need to check +- // whether the bias owner and the epoch are both still current. +- load_prototype_header(tmp_reg, obj_reg); +- orq(tmp_reg, r15_thread); +- xorq(tmp_reg, swap_reg); +- andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place)); +- if (counters != NULL) { +- cond_inc32(Assembler::zero, +- ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr())); +- } +- jcc(Assembler::equal, done); +- +- Label try_revoke_bias; +- Label try_rebias; +- +- // At this point we know that the header has the bias pattern and +- // that we are not the bias owner in the current epoch. We need to +- // figure out more details about the state of the header in order to +- // know what operations can be legally performed on the object's +- // header. +- +- // If the low three bits in the xor result aren't clear, that means +- // the prototype header is no longer biased and we have to revoke +- // the bias on this object. +- testq(tmp_reg, markOopDesc::biased_lock_mask_in_place); +- jcc(Assembler::notZero, try_revoke_bias); +- +- // Biasing is still enabled for this data type. See whether the +- // epoch of the current bias is still valid, meaning that the epoch +- // bits of the mark word are equal to the epoch bits of the +- // prototype header. (Note that the prototype header's epoch bits +- // only change at a safepoint.) If not, attempt to rebias the object +- // toward the current thread. Note that we must be absolutely sure +- // that the current epoch is invalid in order to do this because +- // otherwise the manipulations it performs on the mark word are +- // illegal. +- testq(tmp_reg, markOopDesc::epoch_mask_in_place); +- jcc(Assembler::notZero, try_rebias); +- +- // The epoch of the current bias is still valid but we know nothing +- // about the owner; it might be set or it might be clear. 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. +- // Note that we first construct the presumed unbiased header so we +- // don't accidentally blow away another thread's valid bias. +- andq(swap_reg, +- markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place); +- movq(tmp_reg, swap_reg); +- orq(tmp_reg, r15_thread); +- if (os::is_MP()) { +- lock(); +- } +- cmpxchgq(tmp_reg, Address(obj_reg, 0)); +- // If the biasing toward our thread failed, this means that +- // another thread succeeded in biasing it toward itself and we +- // need to revoke that bias. The revocation will occur in the +- // interpreter runtime in the slow case. +- if (counters != NULL) { +- cond_inc32(Assembler::zero, +- ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr())); +- } +- if (slow_case != NULL) { +- jcc(Assembler::notZero, *slow_case); +- } +- jmp(done); +- +- bind(try_rebias); +- // At this point we know the epoch has expired, meaning that the +- // current "bias owner", if any, is actually invalid. Under these +- // circumstances _only_, we are allowed to use the current header's +- // value as the comparison value when doing the cas to acquire the +- // bias in the current epoch. In other words, we allow transfer of +- // the bias from one thread to another directly in this situation. +- // +- // FIXME: due to a lack of registers we currently blow away the age +- // bits in this situation. Should attempt to preserve them. +- load_prototype_header(tmp_reg, obj_reg); +- orq(tmp_reg, r15_thread); +- if (os::is_MP()) { +- lock(); +- } +- cmpxchgq(tmp_reg, Address(obj_reg, 0)); +- // If the biasing toward our thread failed, then another thread +- // succeeded in biasing it toward itself and we need to revoke that +- // bias. The revocation will occur in the runtime in the slow case. +- if (counters != NULL) { +- cond_inc32(Assembler::zero, +- ExternalAddress((address) counters->rebiased_lock_entry_count_addr())); +- } +- if (slow_case != NULL) { +- jcc(Assembler::notZero, *slow_case); +- } +- jmp(done); +- +- bind(try_revoke_bias); +- // The prototype mark in the klass doesn't have the bias bit set any +- // more, indicating that objects of this data type are not supposed +- // to be biased any more. 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. Note that if our CAS fails, it means +- // that another thread raced us for the privilege of revoking the +- // bias of this particular object, so it's okay to continue in the +- // normal locking code. +- // +- // FIXME: due to a lack of registers we currently blow away the age +- // bits in this situation. Should attempt to preserve them. +- load_prototype_header(tmp_reg, obj_reg); +- if (os::is_MP()) { +- lock(); +- } +- cmpxchgq(tmp_reg, Address(obj_reg, 0)); +- // Fall through to the normal CAS-based lock, because no matter what +- // the result of the above CAS, some thread must have succeeded in +- // removing the bias bit from the object's header. +- if (counters != NULL) { +- cond_inc32(Assembler::zero, +- ExternalAddress((address) counters->revoked_lock_entry_count_addr())); +- } +- +- bind(cas_label); +- +- return null_check_offset; +-} +- + void MacroAssembler::call_VM_leaf_base(address entry_point, int num_args) { + Label L, E; + +@@ -983,6 +616,15 @@ + /* else */ { subq(dst, value) ; return; } + } + ++void MacroAssembler::incrementq(AddressLiteral dst) { ++ if (reachable(dst)) { ++ incrementq(as_Address(dst)); ++ } else { ++ lea(rscratch1, dst); ++ incrementq(Address(rscratch1, 0)); ++ } ++} ++ + void MacroAssembler::incrementq(Register reg, int value) { + if (value == min_jint) { addq(reg, value); return; } + if (value < 0) { decrementq(reg, -value); return; } +@@ -1051,15 +693,15 @@ + movq(dst, rscratch1); + } + +-void MacroAssembler::movptr(Register dst, AddressLiteral src) { ++void MacroAssembler::movptr(Register dst, AddressLiteral src, Register scratch) { + if (src.is_lval()) { + mov_literal64(dst, (intptr_t)src.target(), src.rspec()); + } else { + if (reachable(src)) { + movq(dst, as_Address(src)); + } else { +- lea(rscratch1, src); +- movq(dst, Address(rscratch1,0)); ++ lea(scratch, src); ++ movq(dst, Address(scratch, 0)); + } + } + } +@@ -1358,13 +1000,37 @@ + LP64_ONLY(andq(dst, imm32)) NOT_LP64(andl(dst, imm32)); + } + +-void MacroAssembler::atomic_incl(AddressLiteral counter_addr) { +- pushf(); ++void MacroAssembler::atomic_incl(Address counter_addr) { + if (os::is_MP()) + lock(); + incrementl(counter_addr); +- popf(); +-} ++} ++ ++void MacroAssembler::atomic_incl(AddressLiteral counter_addr, Register scr) { ++ if (reachable(counter_addr)) { ++ atomic_incl(as_Address(counter_addr)); ++ } else { ++ lea(scr, counter_addr); ++ atomic_incl(Address(scr, 0)); ++ } ++} ++ ++#ifdef _LP64 ++void MacroAssembler::atomic_incq(Address counter_addr) { ++ if (os::is_MP()) ++ lock(); ++ incrementq(counter_addr); ++} ++ ++void MacroAssembler::atomic_incq(AddressLiteral counter_addr, Register scr) { ++ if (reachable(counter_addr)) { ++ atomic_incq(as_Address(counter_addr)); ++ } else { ++ lea(scr, counter_addr); ++ atomic_incq(Address(scr, 0)); ++ } ++} ++#endif + + // Writes to stack successive pages until offset reached to check for + // stack overflow + shadow pages. This clobbers tmp. +@@ -1386,13 +1052,241 @@ + // was post-decremented.) Skip this address by starting at i=1, and + // touch a few more pages below. N.B. It is important to touch all + // the way down to and including i=StackShadowPages. +- for (int i = 1; i <= StackShadowPages; i++) { ++ for (int i = 1; i < StackShadowPages; i++) { + // this could be any sized move but this is can be a debugging crumb + // so the bigger the better. + movptr(Address(tmp, (-i*os::vm_page_size())), size ); + } + } + ++int MacroAssembler::biased_locking_enter(Register lock_reg, ++ Register obj_reg, ++ Register swap_reg, ++ Register tmp_reg, ++ bool swap_reg_contains_mark, ++ Label& done, ++ Label* slow_case, ++ BiasedLockingCounters* counters) { ++ assert(UseBiasedLocking, "why call this otherwise?"); ++ assert(swap_reg == rax, "swap_reg must be rax for cmpxchgq"); ++ LP64_ONLY( assert(tmp_reg != noreg, "tmp_reg must be supplied"); ) ++ bool need_tmp_reg = false; ++ if (tmp_reg == noreg) { ++ need_tmp_reg = true; ++ tmp_reg = lock_reg; ++ assert_different_registers(lock_reg, obj_reg, swap_reg); ++ } else { ++ assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg); ++ } ++ assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, "biased locking makes assumptions about bit layout"); ++ Address mark_addr (obj_reg, oopDesc::mark_offset_in_bytes()); ++ Address saved_mark_addr(lock_reg, 0); ++ ++ if (PrintBiasedLockingStatistics && counters == NULL) { ++ counters = BiasedLocking::counters(); ++ } ++ // Biased locking ++ // See whether the lock is currently biased toward our thread and ++ // whether the epoch is still valid ++ // Note that the runtime guarantees sufficient alignment of JavaThread ++ // pointers to allow age to be placed into low bits ++ // First check to see whether biasing is even enabled for this object ++ Label cas_label; ++ int null_check_offset = -1; ++ if (!swap_reg_contains_mark) { ++ null_check_offset = offset(); ++ movptr(swap_reg, mark_addr); ++ } ++ if (need_tmp_reg) { ++ push(tmp_reg); ++ } ++ movptr(tmp_reg, swap_reg); ++ andptr(tmp_reg, markOopDesc::biased_lock_mask_in_place); ++ cmpptr(tmp_reg, markOopDesc::biased_lock_pattern); ++ if (need_tmp_reg) { ++ pop(tmp_reg); ++ } ++ jcc(Assembler::notEqual, cas_label); ++ // The bias pattern is present in the object's header. Need to check ++ // whether the bias owner and the epoch are both still current. ++#ifndef _LP64 ++ // Note that because there is no current thread register on x86_32 we ++ // need to store off the mark word we read out of the object to ++ // avoid reloading it and needing to recheck invariants below. This ++ // store is unfortunate but it makes the overall code shorter and ++ // simpler. ++ movptr(saved_mark_addr, swap_reg); ++#endif ++ if (need_tmp_reg) { ++ push(tmp_reg); ++ } ++ if (swap_reg_contains_mark) { ++ null_check_offset = offset(); ++ } ++ load_prototype_header(tmp_reg, obj_reg); ++#ifdef _LP64 ++ orptr(tmp_reg, r15_thread); ++ xorptr(tmp_reg, swap_reg); ++ Register header_reg = tmp_reg; ++#else ++ xorptr(tmp_reg, swap_reg); ++ get_thread(swap_reg); ++ xorptr(swap_reg, tmp_reg); ++ Register header_reg = swap_reg; ++#endif ++ andptr(header_reg, ~((int) markOopDesc::age_mask_in_place)); ++ if (need_tmp_reg) { ++ pop(tmp_reg); ++ } ++ if (counters != NULL) { ++ cond_inc32(Assembler::zero, ++ ExternalAddress((address) counters->biased_lock_entry_count_addr())); ++ } ++ jcc(Assembler::equal, done); ++ ++ Label try_revoke_bias; ++ Label try_rebias; ++ ++ // At this point we know that the header has the bias pattern and ++ // that we are not the bias owner in the current epoch. We need to ++ // figure out more details about the state of the header in order to ++ // know what operations can be legally performed on the object's ++ // header. ++ ++ // If the low three bits in the xor result aren't clear, that means ++ // the prototype header is no longer biased and we have to revoke ++ // the bias on this object. ++ testptr(header_reg, markOopDesc::biased_lock_mask_in_place); ++ jccb(Assembler::notZero, try_revoke_bias); ++ ++ // Biasing is still enabled for this data type. See whether the ++ // epoch of the current bias is still valid, meaning that the epoch ++ // bits of the mark word are equal to the epoch bits of the ++ // prototype header. (Note that the prototype header's epoch bits ++ // only change at a safepoint.) If not, attempt to rebias the object ++ // toward the current thread. Note that we must be absolutely sure ++ // that the current epoch is invalid in order to do this because ++ // otherwise the manipulations it performs on the mark word are ++ // illegal. ++ testptr(header_reg, markOopDesc::epoch_mask_in_place); ++ jccb(Assembler::notZero, try_rebias); ++ ++ // The epoch of the current bias is still valid but we know nothing ++ // about the owner; it might be set or it might be clear. 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. ++ // Note that we first construct the presumed unbiased header so we ++ // don't accidentally blow away another thread's valid bias. ++ NOT_LP64( movptr(swap_reg, saved_mark_addr); ) ++ andptr(swap_reg, ++ markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place); ++ if (need_tmp_reg) { ++ push(tmp_reg); ++ } ++#ifdef _LP64 ++ movptr(tmp_reg, swap_reg); ++ orptr(tmp_reg, r15_thread); ++#else ++ get_thread(tmp_reg); ++ orptr(tmp_reg, swap_reg); ++#endif ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(tmp_reg, mark_addr); // compare tmp_reg and swap_reg ++ if (need_tmp_reg) { ++ pop(tmp_reg); ++ } ++ // If the biasing toward our thread failed, this means that ++ // another thread succeeded in biasing it toward itself and we ++ // need to revoke that bias. The revocation will occur in the ++ // interpreter runtime in the slow case. ++ if (counters != NULL) { ++ cond_inc32(Assembler::zero, ++ ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr())); ++ } ++ if (slow_case != NULL) { ++ jcc(Assembler::notZero, *slow_case); ++ } ++ jmp(done); ++ ++ bind(try_rebias); ++ // At this point we know the epoch has expired, meaning that the ++ // current "bias owner", if any, is actually invalid. Under these ++ // circumstances _only_, we are allowed to use the current header's ++ // value as the comparison value when doing the cas to acquire the ++ // bias in the current epoch. In other words, we allow transfer of ++ // the bias from one thread to another directly in this situation. ++ // ++ // FIXME: due to a lack of registers we currently blow away the age ++ // bits in this situation. Should attempt to preserve them. ++ if (need_tmp_reg) { ++ push(tmp_reg); ++ } ++ load_prototype_header(tmp_reg, obj_reg); ++#ifdef _LP64 ++ orptr(tmp_reg, r15_thread); ++#else ++ get_thread(swap_reg); ++ orptr(tmp_reg, swap_reg); ++ movptr(swap_reg, saved_mark_addr); ++#endif ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(tmp_reg, mark_addr); // compare tmp_reg and swap_reg ++ if (need_tmp_reg) { ++ pop(tmp_reg); ++ } ++ // If the biasing toward our thread failed, then another thread ++ // succeeded in biasing it toward itself and we need to revoke that ++ // bias. The revocation will occur in the runtime in the slow case. ++ if (counters != NULL) { ++ cond_inc32(Assembler::zero, ++ ExternalAddress((address) counters->rebiased_lock_entry_count_addr())); ++ } ++ if (slow_case != NULL) { ++ jcc(Assembler::notZero, *slow_case); ++ } ++ jmp(done); ++ ++ bind(try_revoke_bias); ++ // The prototype mark in the klass doesn't have the bias bit set any ++ // more, indicating that objects of this data type are not supposed ++ // to be biased any more. 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. Note that if our CAS fails, it means ++ // that another thread raced us for the privilege of revoking the ++ // bias of this particular object, so it's okay to continue in the ++ // normal locking code. ++ // ++ // FIXME: due to a lack of registers we currently blow away the age ++ // bits in this situation. Should attempt to preserve them. ++ NOT_LP64( movptr(swap_reg, saved_mark_addr); ) ++ if (need_tmp_reg) { ++ push(tmp_reg); ++ } ++ load_prototype_header(tmp_reg, obj_reg); ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(tmp_reg, mark_addr); // compare tmp_reg and swap_reg ++ if (need_tmp_reg) { ++ pop(tmp_reg); ++ } ++ // Fall through to the normal CAS-based lock, because no matter what ++ // the result of the above CAS, some thread must have succeeded in ++ // removing the bias bit from the object's header. ++ if (counters != NULL) { ++ cond_inc32(Assembler::zero, ++ ExternalAddress((address) counters->revoked_lock_entry_count_addr())); ++ } ++ ++ bind(cas_label); ++ ++ return null_check_offset; ++} ++ + void MacroAssembler::biased_locking_exit(Register obj_reg, Register temp_reg, Label& done) { + assert(UseBiasedLocking, "why call this otherwise?"); + +@@ -1408,6 +1302,992 @@ + jcc(Assembler::equal, done); + } + ++#ifdef COMPILER2 ++ ++#if INCLUDE_RTM_OPT ++ ++// Update rtm_counters based on abort status ++// input: abort_status ++// rtm_counters (RTMLockingCounters*) ++// flags are killed ++void MacroAssembler::rtm_counters_update(Register abort_status, Register rtm_counters) { ++ ++ atomic_incptr(Address(rtm_counters, RTMLockingCounters::abort_count_offset())); ++ if (PrintPreciseRTMLockingStatistics) { ++ for (int i = 0; i < RTMLockingCounters::ABORT_STATUS_LIMIT; i++) { ++ Label check_abort; ++ testl(abort_status, (1< 0) { ++ // Delay calculation ++ movptr(tmpReg, ExternalAddress((address) RTMLockingCounters::rtm_calculation_flag_addr()), tmpReg); ++ testptr(tmpReg, tmpReg); ++ jccb(Assembler::equal, L_done); ++ } ++ // Abort ratio calculation only if abort_count > RTMAbortThreshold ++ // Aborted transactions = abort_count * 100 ++ // All transactions = total_count * RTMTotalCountIncrRate ++ // Set no_rtm bit if (Aborted transactions >= All transactions * RTMAbortRatio) ++ ++ movptr(tmpReg, Address(rtm_counters_Reg, RTMLockingCounters::abort_count_offset())); ++ cmpptr(tmpReg, RTMAbortThreshold); ++ jccb(Assembler::below, L_check_always_rtm2); ++ imulptr(tmpReg, tmpReg, 100); ++ ++ Register scrReg = rtm_counters_Reg; ++ movptr(scrReg, Address(rtm_counters_Reg, RTMLockingCounters::total_count_offset())); ++ imulptr(scrReg, scrReg, RTMTotalCountIncrRate); ++ imulptr(scrReg, scrReg, RTMAbortRatio); ++ cmpptr(tmpReg, scrReg); ++ jccb(Assembler::below, L_check_always_rtm1); ++ if (method_data != NULL) { ++ // set rtm_state to "no rtm" in MDO ++ mov_metadata(tmpReg, method_data); ++ if (os::is_MP()) { ++ lock(); ++ } ++ orl(Address(tmpReg, MethodData::rtm_state_offset_in_bytes()), NoRTM); ++ } ++ jmpb(L_done); ++ bind(L_check_always_rtm1); ++ // Reload RTMLockingCounters* address ++ lea(rtm_counters_Reg, ExternalAddress((address)rtm_counters)); ++ bind(L_check_always_rtm2); ++ movptr(tmpReg, Address(rtm_counters_Reg, RTMLockingCounters::total_count_offset())); ++ cmpptr(tmpReg, RTMLockingThreshold / RTMTotalCountIncrRate); ++ jccb(Assembler::below, L_done); ++ if (method_data != NULL) { ++ // set rtm_state to "always rtm" in MDO ++ mov_metadata(tmpReg, method_data); ++ if (os::is_MP()) { ++ lock(); ++ } ++ orl(Address(tmpReg, MethodData::rtm_state_offset_in_bytes()), UseRTM); ++ } ++ bind(L_done); ++} ++ ++// Update counters and perform abort ratio calculation ++// input: abort_status_Reg ++// rtm_counters_Reg, flags are killed ++void MacroAssembler::rtm_profiling(Register abort_status_Reg, ++ Register rtm_counters_Reg, ++ RTMLockingCounters* rtm_counters, ++ Metadata* method_data, ++ bool profile_rtm) { ++ ++ assert(rtm_counters != NULL, "should not be NULL when profiling RTM"); ++ // update rtm counters based on rax value at abort ++ // reads abort_status_Reg, updates flags ++ lea(rtm_counters_Reg, ExternalAddress((address)rtm_counters)); ++ rtm_counters_update(abort_status_Reg, rtm_counters_Reg); ++ if (profile_rtm) { ++ // Save abort status because abort_status_Reg is used by following code. ++ if (RTMRetryCount > 0) { ++ push(abort_status_Reg); ++ } ++ assert(rtm_counters != NULL, "should not be NULL when profiling RTM"); ++ rtm_abort_ratio_calculation(abort_status_Reg, rtm_counters_Reg, rtm_counters, method_data); ++ // restore abort status ++ if (RTMRetryCount > 0) { ++ pop(abort_status_Reg); ++ } ++ } ++} ++ ++// Retry on abort if abort's status is 0x6: can retry (0x2) | memory conflict (0x4) ++// inputs: retry_count_Reg ++// : abort_status_Reg ++// output: retry_count_Reg decremented by 1 ++// flags are killed ++void MacroAssembler::rtm_retry_lock_on_abort(Register retry_count_Reg, Register abort_status_Reg, Label& retryLabel) { ++ Label doneRetry; ++ assert(abort_status_Reg == rax, ""); ++ // The abort reason bits are in eax (see all states in rtmLocking.hpp) ++ // 0x6 = conflict on which we can retry (0x2) | memory conflict (0x4) ++ // if reason is in 0x6 and retry count != 0 then retry ++ andptr(abort_status_Reg, 0x6); ++ jccb(Assembler::zero, doneRetry); ++ testl(retry_count_Reg, retry_count_Reg); ++ jccb(Assembler::zero, doneRetry); ++ pause(); ++ decrementl(retry_count_Reg); ++ jmp(retryLabel); ++ bind(doneRetry); ++} ++ ++// Spin and retry if lock is busy, ++// inputs: box_Reg (monitor address) ++// : retry_count_Reg ++// output: retry_count_Reg decremented by 1 ++// : clear z flag if retry count exceeded ++// tmp_Reg, scr_Reg, flags are killed ++void MacroAssembler::rtm_retry_lock_on_busy(Register retry_count_Reg, Register box_Reg, ++ Register tmp_Reg, Register scr_Reg, Label& retryLabel) { ++ Label SpinLoop, SpinExit, doneRetry; ++ // Clean monitor_value bit to get valid pointer ++ int owner_offset = ObjectMonitor::owner_offset_in_bytes() - markOopDesc::monitor_value; ++ ++ testl(retry_count_Reg, retry_count_Reg); ++ jccb(Assembler::zero, doneRetry); ++ decrementl(retry_count_Reg); ++ movptr(scr_Reg, RTMSpinLoopCount); ++ ++ bind(SpinLoop); ++ pause(); ++ decrementl(scr_Reg); ++ jccb(Assembler::lessEqual, SpinExit); ++ movptr(tmp_Reg, Address(box_Reg, owner_offset)); ++ testptr(tmp_Reg, tmp_Reg); ++ jccb(Assembler::notZero, SpinLoop); ++ ++ bind(SpinExit); ++ jmp(retryLabel); ++ bind(doneRetry); ++ incrementl(retry_count_Reg); // clear z flag ++} ++ ++// Use RTM for normal stack locks ++// Input: objReg (object to lock) ++void MacroAssembler::rtm_stack_locking(Register objReg, Register tmpReg, Register scrReg, ++ Register retry_on_abort_count_Reg, ++ RTMLockingCounters* stack_rtm_counters, ++ Metadata* method_data, bool profile_rtm, ++ Label& DONE_LABEL, Label& IsInflated) { ++ assert(UseRTMForStackLocks, "why call this otherwise?"); ++ assert(!UseBiasedLocking, "Biased locking is not supported with RTM locking"); ++ assert(tmpReg == rax, ""); ++ assert(scrReg == rdx, ""); ++ Label L_rtm_retry, L_decrement_retry, L_on_abort; ++ ++ if (RTMRetryCount > 0) { ++ movl(retry_on_abort_count_Reg, RTMRetryCount); // Retry on abort ++ bind(L_rtm_retry); ++ } ++ movptr(tmpReg, Address(objReg, 0)); ++ testptr(tmpReg, markOopDesc::monitor_value); // inflated vs stack-locked|neutral|biased ++ jcc(Assembler::notZero, IsInflated); ++ ++ if (PrintPreciseRTMLockingStatistics || profile_rtm) { ++ Label L_noincrement; ++ if (RTMTotalCountIncrRate > 1) { ++ // tmpReg, scrReg and flags are killed ++ branch_on_random_using_rdtsc(tmpReg, scrReg, (int)RTMTotalCountIncrRate, L_noincrement); ++ } ++ assert(stack_rtm_counters != NULL, "should not be NULL when profiling RTM"); ++ atomic_incptr(ExternalAddress((address)stack_rtm_counters->total_count_addr()), scrReg); ++ bind(L_noincrement); ++ } ++ xbegin(L_on_abort); ++ movptr(tmpReg, Address(objReg, 0)); // fetch markword ++ andptr(tmpReg, markOopDesc::biased_lock_mask_in_place); // look at 3 lock bits ++ cmpptr(tmpReg, markOopDesc::unlocked_value); // bits = 001 unlocked ++ jcc(Assembler::equal, DONE_LABEL); // all done if unlocked ++ ++ Register abort_status_Reg = tmpReg; // status of abort is stored in RAX ++ if (UseRTMXendForLockBusy) { ++ xend(); ++ movptr(abort_status_Reg, 0x2); // Set the abort status to 2 (so we can retry) ++ jmp(L_decrement_retry); ++ } ++ else { ++ xabort(0); ++ } ++ bind(L_on_abort); ++ if (PrintPreciseRTMLockingStatistics || profile_rtm) { ++ rtm_profiling(abort_status_Reg, scrReg, stack_rtm_counters, method_data, profile_rtm); ++ } ++ bind(L_decrement_retry); ++ if (RTMRetryCount > 0) { ++ // retry on lock abort if abort status is 'can retry' (0x2) or 'memory conflict' (0x4) ++ rtm_retry_lock_on_abort(retry_on_abort_count_Reg, abort_status_Reg, L_rtm_retry); ++ } ++} ++ ++// Use RTM for inflating locks ++// inputs: objReg (object to lock) ++// boxReg (on-stack box address (displaced header location) - KILLED) ++// tmpReg (ObjectMonitor address + 2(monitor_value)) ++void MacroAssembler::rtm_inflated_locking(Register objReg, Register boxReg, Register tmpReg, ++ Register scrReg, Register retry_on_busy_count_Reg, ++ Register retry_on_abort_count_Reg, ++ RTMLockingCounters* rtm_counters, ++ Metadata* method_data, bool profile_rtm, ++ Label& DONE_LABEL) { ++ assert(UseRTMLocking, "why call this otherwise?"); ++ assert(tmpReg == rax, ""); ++ assert(scrReg == rdx, ""); ++ Label L_rtm_retry, L_decrement_retry, L_on_abort; ++ // Clean monitor_value bit to get valid pointer ++ int owner_offset = ObjectMonitor::owner_offset_in_bytes() - markOopDesc::monitor_value; ++ ++ // Without cast to int32_t a movptr will destroy r10 which is typically obj ++ movptr(Address(boxReg, 0), (int32_t)intptr_t(markOopDesc::unused_mark())); ++ movptr(boxReg, tmpReg); // Save ObjectMonitor address ++ ++ if (RTMRetryCount > 0) { ++ movl(retry_on_busy_count_Reg, RTMRetryCount); // Retry on lock busy ++ movl(retry_on_abort_count_Reg, RTMRetryCount); // Retry on abort ++ bind(L_rtm_retry); ++ } ++ if (PrintPreciseRTMLockingStatistics || profile_rtm) { ++ Label L_noincrement; ++ if (RTMTotalCountIncrRate > 1) { ++ // tmpReg, scrReg and flags are killed ++ branch_on_random_using_rdtsc(tmpReg, scrReg, (int)RTMTotalCountIncrRate, L_noincrement); ++ } ++ assert(rtm_counters != NULL, "should not be NULL when profiling RTM"); ++ atomic_incptr(ExternalAddress((address)rtm_counters->total_count_addr()), scrReg); ++ bind(L_noincrement); ++ } ++ xbegin(L_on_abort); ++ movptr(tmpReg, Address(objReg, 0)); ++ movptr(tmpReg, Address(tmpReg, owner_offset)); ++ testptr(tmpReg, tmpReg); ++ jcc(Assembler::zero, DONE_LABEL); ++ if (UseRTMXendForLockBusy) { ++ xend(); ++ jmp(L_decrement_retry); ++ } ++ else { ++ xabort(0); ++ } ++ bind(L_on_abort); ++ Register abort_status_Reg = tmpReg; // status of abort is stored in RAX ++ if (PrintPreciseRTMLockingStatistics || profile_rtm) { ++ rtm_profiling(abort_status_Reg, scrReg, rtm_counters, method_data, profile_rtm); ++ } ++ if (RTMRetryCount > 0) { ++ // retry on lock abort if abort status is 'can retry' (0x2) or 'memory conflict' (0x4) ++ rtm_retry_lock_on_abort(retry_on_abort_count_Reg, abort_status_Reg, L_rtm_retry); ++ } ++ ++ movptr(tmpReg, Address(boxReg, owner_offset)) ; ++ testptr(tmpReg, tmpReg) ; ++ jccb(Assembler::notZero, L_decrement_retry) ; ++ ++ // Appears unlocked - try to swing _owner from null to non-null. ++ // Invariant: tmpReg == 0. tmpReg is EAX which is the implicit cmpxchg comparand. ++#ifdef _LP64 ++ Register threadReg = r15_thread; ++#else ++ get_thread(scrReg); ++ Register threadReg = scrReg; ++#endif ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(threadReg, Address(boxReg, owner_offset)); // Updates tmpReg ++ ++ if (RTMRetryCount > 0) { ++ // success done else retry ++ jccb(Assembler::equal, DONE_LABEL) ; ++ bind(L_decrement_retry); ++ // Spin and retry if lock is busy. ++ rtm_retry_lock_on_busy(retry_on_busy_count_Reg, boxReg, tmpReg, scrReg, L_rtm_retry); ++ } ++ else { ++ bind(L_decrement_retry); ++ } ++} ++ ++#endif // INCLUDE_RTM_OPT ++ ++// Fast_Lock and Fast_Unlock used by C2 ++ ++// Because the transitions from emitted code to the runtime ++// monitorenter/exit helper stubs are so slow it's critical that ++// we inline both the stack-locking fast-path and the inflated fast path. ++// ++// See also: cmpFastLock and cmpFastUnlock. ++// ++// What follows is a specialized inline transliteration of the code ++// in slow_enter() and slow_exit(). If we're concerned about I$ bloat ++// another option would be to emit TrySlowEnter and TrySlowExit methods ++// at startup-time. These methods would accept arguments as ++// (rax,=Obj, rbx=Self, rcx=box, rdx=Scratch) and return success-failure ++// indications in the icc.ZFlag. Fast_Lock and Fast_Unlock would simply ++// marshal the arguments and emit calls to TrySlowEnter and TrySlowExit. ++// In practice, however, the # of lock sites is bounded and is usually small. ++// Besides the call overhead, TrySlowEnter and TrySlowExit might suffer ++// if the processor uses simple bimodal branch predictors keyed by EIP ++// Since the helper routines would be called from multiple synchronization ++// sites. ++// ++// An even better approach would be write "MonitorEnter()" and "MonitorExit()" ++// in java - using j.u.c and unsafe - and just bind the lock and unlock sites ++// to those specialized methods. That'd give us a mostly platform-independent ++// implementation that the JITs could optimize and inline at their pleasure. ++// Done correctly, the only time we'd need to cross to native could would be ++// to park() or unpark() threads. We'd also need a few more unsafe operators ++// to (a) prevent compiler-JIT reordering of non-volatile accesses, and ++// (b) explicit barriers or fence operations. ++// ++// TODO: ++// ++// * Arrange for C2 to pass "Self" into Fast_Lock and Fast_Unlock in one of the registers (scr). ++// This avoids manifesting the Self pointer in the Fast_Lock and Fast_Unlock terminals. ++// Given TLAB allocation, Self is usually manifested in a register, so passing it into ++// the lock operators would typically be faster than reifying Self. ++// ++// * Ideally I'd define the primitives as: ++// fast_lock (nax Obj, nax box, EAX tmp, nax scr) where box, tmp and scr are KILLED. ++// fast_unlock (nax Obj, EAX box, nax tmp) where box and tmp are KILLED ++// Unfortunately ADLC bugs prevent us from expressing the ideal form. ++// Instead, we're stuck with a rather awkward and brittle register assignments below. ++// Furthermore the register assignments are overconstrained, possibly resulting in ++// sub-optimal code near the synchronization site. ++// ++// * Eliminate the sp-proximity tests and just use "== Self" tests instead. ++// Alternately, use a better sp-proximity test. ++// ++// * Currently ObjectMonitor._Owner can hold either an sp value or a (THREAD *) value. ++// Either one is sufficient to uniquely identify a thread. ++// TODO: eliminate use of sp in _owner and use get_thread(tr) instead. ++// ++// * Intrinsify notify() and notifyAll() for the common cases where the ++// object is locked by the calling thread but the waitlist is empty. ++// avoid the expensive JNI call to JVM_Notify() and JVM_NotifyAll(). ++// ++// * use jccb and jmpb instead of jcc and jmp to improve code density. ++// But beware of excessive branch density on AMD Opterons. ++// ++// * Both Fast_Lock and Fast_Unlock set the ICC.ZF to indicate success ++// or failure of the fast-path. If the fast-path fails then we pass ++// control to the slow-path, typically in C. In Fast_Lock and ++// Fast_Unlock we often branch to DONE_LABEL, just to find that C2 ++// will emit a conditional branch immediately after the node. ++// So we have branches to branches and lots of ICC.ZF games. ++// Instead, it might be better to have C2 pass a "FailureLabel" ++// into Fast_Lock and Fast_Unlock. In the case of success, control ++// will drop through the node. ICC.ZF is undefined at exit. ++// In the case of failure, the node will branch directly to the ++// FailureLabel ++ ++ ++// obj: object to lock ++// box: on-stack box address (displaced header location) - KILLED ++// rax,: tmp -- KILLED ++// scr: tmp -- KILLED ++void MacroAssembler::fast_lock(Register objReg, Register boxReg, Register tmpReg, ++ Register scrReg, Register cx1Reg, Register cx2Reg, ++ BiasedLockingCounters* counters, ++ RTMLockingCounters* rtm_counters, ++ RTMLockingCounters* stack_rtm_counters, ++ Metadata* method_data, ++ bool use_rtm, bool profile_rtm) { ++ // Ensure the register assignents are disjoint ++ assert(tmpReg == rax, ""); ++ ++ if (use_rtm) { ++ assert_different_registers(objReg, boxReg, tmpReg, scrReg, cx1Reg, cx2Reg); ++ } else { ++ assert(cx1Reg == noreg, ""); ++ assert(cx2Reg == noreg, ""); ++ assert_different_registers(objReg, boxReg, tmpReg, scrReg); ++ } ++ ++ if (counters != NULL) { ++ atomic_incl(ExternalAddress((address)counters->total_entry_count_addr()), scrReg); ++ } ++ if (EmitSync & 1) { ++ // set box->dhw = unused_mark (3) ++ // Force all sync thru slow-path: slow_enter() and slow_exit() ++ movptr (Address(boxReg, 0), (int32_t)intptr_t(markOopDesc::unused_mark())); ++ cmpptr (rsp, (int32_t)NULL_WORD); ++ } else ++ if (EmitSync & 2) { ++ Label DONE_LABEL ; ++ if (UseBiasedLocking) { ++ // Note: tmpReg maps to the swap_reg argument and scrReg to the tmp_reg argument. ++ biased_locking_enter(boxReg, objReg, tmpReg, scrReg, false, DONE_LABEL, NULL, counters); ++ } ++ ++ movptr(tmpReg, Address(objReg, 0)); // fetch markword ++ orptr (tmpReg, 0x1); ++ movptr(Address(boxReg, 0), tmpReg); // Anticipate successful CAS ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(boxReg, Address(objReg, 0)); // Updates tmpReg ++ jccb(Assembler::equal, DONE_LABEL); ++ // Recursive locking ++ subptr(tmpReg, rsp); ++ andptr(tmpReg, (int32_t) (NOT_LP64(0xFFFFF003) LP64_ONLY(7 - os::vm_page_size())) ); ++ movptr(Address(boxReg, 0), tmpReg); ++ bind(DONE_LABEL); ++ } else { ++ // Possible cases that we'll encounter in fast_lock ++ // ------------------------------------------------ ++ // * Inflated ++ // -- unlocked ++ // -- Locked ++ // = by self ++ // = by other ++ // * biased ++ // -- by Self ++ // -- by other ++ // * neutral ++ // * stack-locked ++ // -- by self ++ // = sp-proximity test hits ++ // = sp-proximity test generates false-negative ++ // -- by other ++ // ++ ++ Label IsInflated, DONE_LABEL; ++ ++ // it's stack-locked, biased or neutral ++ // TODO: optimize away redundant LDs of obj->mark and improve the markword triage ++ // order to reduce the number of conditional branches in the most common cases. ++ // Beware -- there's a subtle invariant that fetch of the markword ++ // at [FETCH], below, will never observe a biased encoding (*101b). ++ // If this invariant is not held we risk exclusion (safety) failure. ++ if (UseBiasedLocking && !UseOptoBiasInlining) { ++ biased_locking_enter(boxReg, objReg, tmpReg, scrReg, true, DONE_LABEL, NULL, counters); ++ } ++ ++#if INCLUDE_RTM_OPT ++ if (UseRTMForStackLocks && use_rtm) { ++ rtm_stack_locking(objReg, tmpReg, scrReg, cx2Reg, ++ stack_rtm_counters, method_data, profile_rtm, ++ DONE_LABEL, IsInflated); ++ } ++#endif // INCLUDE_RTM_OPT ++ ++ movptr(tmpReg, Address(objReg, 0)); // [FETCH] ++ testptr(tmpReg, markOopDesc::monitor_value); // inflated vs stack-locked|neutral|biased ++ jccb(Assembler::notZero, IsInflated); ++ ++ // Attempt stack-locking ... ++ orptr (tmpReg, markOopDesc::unlocked_value); ++ movptr(Address(boxReg, 0), tmpReg); // Anticipate successful CAS ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(boxReg, Address(objReg, 0)); // Updates tmpReg ++ if (counters != NULL) { ++ cond_inc32(Assembler::equal, ++ ExternalAddress((address)counters->fast_path_entry_count_addr())); ++ } ++ jcc(Assembler::equal, DONE_LABEL); // Success ++ ++ // Recursive locking. ++ // The object is stack-locked: markword contains stack pointer to BasicLock. ++ // Locked by current thread if difference with current SP is less than one page. ++ subptr(tmpReg, rsp); ++ // Next instruction set ZFlag == 1 (Success) if difference is less then one page. ++ andptr(tmpReg, (int32_t) (NOT_LP64(0xFFFFF003) LP64_ONLY(7 - os::vm_page_size())) ); ++ movptr(Address(boxReg, 0), tmpReg); ++ if (counters != NULL) { ++ cond_inc32(Assembler::equal, ++ ExternalAddress((address)counters->fast_path_entry_count_addr())); ++ } ++ jmp(DONE_LABEL); ++ ++ bind(IsInflated); ++ // The object is inflated. tmpReg contains pointer to ObjectMonitor* + 2(monitor_value) ++ ++#if INCLUDE_RTM_OPT ++ // Use the same RTM locking code in 32- and 64-bit VM. ++ if (use_rtm) { ++ rtm_inflated_locking(objReg, boxReg, tmpReg, scrReg, cx1Reg, cx2Reg, ++ rtm_counters, method_data, profile_rtm, DONE_LABEL); ++ } else { ++#endif // INCLUDE_RTM_OPT ++ ++#ifndef _LP64 ++ // The object is inflated. ++ // ++ // TODO-FIXME: eliminate the ugly use of manifest constants: ++ // Use markOopDesc::monitor_value instead of "2". ++ // use markOop::unused_mark() instead of "3". ++ // The tmpReg value is an objectMonitor reference ORed with ++ // markOopDesc::monitor_value (2). We can either convert tmpReg to an ++ // objectmonitor pointer by masking off the "2" bit or we can just ++ // use tmpReg as an objectmonitor pointer but bias the objectmonitor ++ // field offsets with "-2" to compensate for and annul the low-order tag bit. ++ // ++ // I use the latter as it avoids AGI stalls. ++ // As such, we write "mov r, [tmpReg+OFFSETOF(Owner)-2]" ++ // instead of "mov r, [tmpReg+OFFSETOF(Owner)]". ++ // ++ #define OFFSET_SKEWED(f) ((ObjectMonitor::f ## _offset_in_bytes())-2) ++ ++ // boxReg refers to the on-stack BasicLock in the current frame. ++ // We'd like to write: ++ // set box->_displaced_header = markOop::unused_mark(). Any non-0 value suffices. ++ // This is convenient but results a ST-before-CAS penalty. The following CAS suffers ++ // additional latency as we have another ST in the store buffer that must drain. ++ ++ if (EmitSync & 8192) { ++ movptr(Address(boxReg, 0), 3); // results in ST-before-CAS penalty ++ get_thread (scrReg); ++ movptr(boxReg, tmpReg); // consider: LEA box, [tmp-2] ++ movptr(tmpReg, NULL_WORD); // consider: xor vs mov ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ } else ++ if ((EmitSync & 128) == 0) { // avoid ST-before-CAS ++ movptr(scrReg, boxReg); ++ movptr(boxReg, tmpReg); // consider: LEA box, [tmp-2] ++ ++ // Using a prefetchw helps avoid later RTS->RTO upgrades and cache probes ++ if ((EmitSync & 2048) && VM_Version::supports_3dnow_prefetch() && os::is_MP()) { ++ // prefetchw [eax + Offset(_owner)-2] ++ prefetchw(Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ } ++ ++ if ((EmitSync & 64) == 0) { ++ // Optimistic form: consider XORL tmpReg,tmpReg ++ movptr(tmpReg, NULL_WORD); ++ } else { ++ // Can suffer RTS->RTO upgrades on shared or cold $ lines ++ // Test-And-CAS instead of CAS ++ movptr(tmpReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); // rax, = m->_owner ++ testptr(tmpReg, tmpReg); // Locked ? ++ jccb (Assembler::notZero, DONE_LABEL); ++ } ++ ++ // Appears unlocked - try to swing _owner from null to non-null. ++ // Ideally, I'd manifest "Self" with get_thread and then attempt ++ // to CAS the register containing Self into m->Owner. ++ // But we don't have enough registers, so instead we can either try to CAS ++ // rsp or the address of the box (in scr) into &m->owner. If the CAS succeeds ++ // we later store "Self" into m->Owner. Transiently storing a stack address ++ // (rsp or the address of the box) into m->owner is harmless. ++ // Invariant: tmpReg == 0. tmpReg is EAX which is the implicit cmpxchg comparand. ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ movptr(Address(scrReg, 0), 3); // box->_displaced_header = 3 ++ jccb (Assembler::notZero, DONE_LABEL); ++ get_thread (scrReg); // beware: clobbers ICCs ++ movptr(Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2), scrReg); ++ xorptr(boxReg, boxReg); // set icc.ZFlag = 1 to indicate success ++ ++ // If the CAS fails we can either retry or pass control to the slow-path. ++ // We use the latter tactic. ++ // Pass the CAS result in the icc.ZFlag into DONE_LABEL ++ // If the CAS was successful ... ++ // Self has acquired the lock ++ // Invariant: m->_recursions should already be 0, so we don't need to explicitly set it. ++ // Intentional fall-through into DONE_LABEL ... ++ } else { ++ movptr(Address(boxReg, 0), intptr_t(markOopDesc::unused_mark())); // results in ST-before-CAS penalty ++ movptr(boxReg, tmpReg); ++ ++ // Using a prefetchw helps avoid later RTS->RTO upgrades and cache probes ++ if ((EmitSync & 2048) && VM_Version::supports_3dnow_prefetch() && os::is_MP()) { ++ // prefetchw [eax + Offset(_owner)-2] ++ prefetchw(Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ } ++ ++ if ((EmitSync & 64) == 0) { ++ // Optimistic form ++ xorptr (tmpReg, tmpReg); ++ } else { ++ // Can suffer RTS->RTO upgrades on shared or cold $ lines ++ movptr(tmpReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); // rax, = m->_owner ++ testptr(tmpReg, tmpReg); // Locked ? ++ jccb (Assembler::notZero, DONE_LABEL); ++ } ++ ++ // Appears unlocked - try to swing _owner from null to non-null. ++ // Use either "Self" (in scr) or rsp as thread identity in _owner. ++ // Invariant: tmpReg == 0. tmpReg is EAX which is the implicit cmpxchg comparand. ++ get_thread (scrReg); ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ ++ // If the CAS fails we can either retry or pass control to the slow-path. ++ // We use the latter tactic. ++ // Pass the CAS result in the icc.ZFlag into DONE_LABEL ++ // If the CAS was successful ... ++ // Self has acquired the lock ++ // Invariant: m->_recursions should already be 0, so we don't need to explicitly set it. ++ // Intentional fall-through into DONE_LABEL ... ++ } ++#else // _LP64 ++ // It's inflated ++ ++ // TODO: someday avoid the ST-before-CAS penalty by ++ // relocating (deferring) the following ST. ++ // We should also think about trying a CAS without having ++ // fetched _owner. If the CAS is successful we may ++ // avoid an RTO->RTS upgrade on the $line. ++ ++ // Without cast to int32_t a movptr will destroy r10 which is typically obj ++ movptr(Address(boxReg, 0), (int32_t)intptr_t(markOopDesc::unused_mark())); ++ ++ movptr (boxReg, tmpReg); ++ movptr (tmpReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ testptr(tmpReg, tmpReg); ++ jccb (Assembler::notZero, DONE_LABEL); ++ ++ // It's inflated and appears unlocked ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(r15_thread, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ // Intentional fall-through into DONE_LABEL ... ++#endif // _LP64 ++ ++#if INCLUDE_RTM_OPT ++ } // use_rtm() ++#endif ++ // DONE_LABEL is a hot target - we'd really like to place it at the ++ // start of cache line by padding with NOPs. ++ // See the AMD and Intel software optimization manuals for the ++ // most efficient "long" NOP encodings. ++ // Unfortunately none of our alignment mechanisms suffice. ++ bind(DONE_LABEL); ++ ++ // At DONE_LABEL the icc ZFlag is set as follows ... ++ // Fast_Unlock uses the same protocol. ++ // ZFlag == 1 -> Success ++ // ZFlag == 0 -> Failure - force control through the slow-path ++ } ++} ++ ++// obj: object to unlock ++// box: box address (displaced header location), killed. Must be EAX. ++// tmp: killed, cannot be obj nor box. ++// ++// Some commentary on balanced locking: ++// ++// Fast_Lock and Fast_Unlock are emitted only for provably balanced lock sites. ++// Methods that don't have provably balanced locking are forced to run in the ++// interpreter - such methods won't be compiled to use fast_lock and fast_unlock. ++// The interpreter provides two properties: ++// I1: At return-time the interpreter automatically and quietly unlocks any ++// objects acquired the current activation (frame). Recall that the ++// interpreter maintains an on-stack list of locks currently held by ++// a frame. ++// I2: If a method attempts to unlock an object that is not held by the ++// the frame the interpreter throws IMSX. ++// ++// Lets say A(), which has provably balanced locking, acquires O and then calls B(). ++// B() doesn't have provably balanced locking so it runs in the interpreter. ++// Control returns to A() and A() unlocks O. By I1 and I2, above, we know that O ++// is still locked by A(). ++// ++// The only other source of unbalanced locking would be JNI. The "Java Native Interface: ++// Programmer's Guide and Specification" claims that an object locked by jni_monitorenter ++// should not be unlocked by "normal" java-level locking and vice-versa. The specification ++// doesn't specify what will occur if a program engages in such mixed-mode locking, however. ++ ++void MacroAssembler::fast_unlock(Register objReg, Register boxReg, Register tmpReg, bool use_rtm) { ++ assert(boxReg == rax, ""); ++ assert_different_registers(objReg, boxReg, tmpReg); ++ ++ if (EmitSync & 4) { ++ // Disable - inhibit all inlining. Force control through the slow-path ++ cmpptr (rsp, 0); ++ } else ++ if (EmitSync & 8) { ++ Label DONE_LABEL; ++ if (UseBiasedLocking) { ++ biased_locking_exit(objReg, tmpReg, DONE_LABEL); ++ } ++ // Classic stack-locking code ... ++ // Check whether the displaced header is 0 ++ //(=> recursive unlock) ++ movptr(tmpReg, Address(boxReg, 0)); ++ testptr(tmpReg, tmpReg); ++ jccb(Assembler::zero, DONE_LABEL); ++ // If not recursive lock, reset the header to displaced header ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses RAX which is box ++ bind(DONE_LABEL); ++ } else { ++ Label DONE_LABEL, Stacked, CheckSucc; ++ ++ // Critically, the biased locking test must have precedence over ++ // and appear before the (box->dhw == 0) recursive stack-lock test. ++ if (UseBiasedLocking && !UseOptoBiasInlining) { ++ biased_locking_exit(objReg, tmpReg, DONE_LABEL); ++ } ++ ++#if INCLUDE_RTM_OPT ++ if (UseRTMForStackLocks && use_rtm) { ++ assert(!UseBiasedLocking, "Biased locking is not supported with RTM locking"); ++ Label L_regular_unlock; ++ movptr(tmpReg, Address(objReg, 0)); // fetch markword ++ andptr(tmpReg, markOopDesc::biased_lock_mask_in_place); // look at 3 lock bits ++ cmpptr(tmpReg, markOopDesc::unlocked_value); // bits = 001 unlocked ++ jccb(Assembler::notEqual, L_regular_unlock); // if !HLE RegularLock ++ xend(); // otherwise end... ++ jmp(DONE_LABEL); // ... and we're done ++ bind(L_regular_unlock); ++ } ++#endif ++ ++ cmpptr(Address(boxReg, 0), (int32_t)NULL_WORD); // Examine the displaced header ++ jcc (Assembler::zero, DONE_LABEL); // 0 indicates recursive stack-lock ++ movptr(tmpReg, Address(objReg, 0)); // Examine the object's markword ++ testptr(tmpReg, markOopDesc::monitor_value); // Inflated? ++ jccb (Assembler::zero, Stacked); ++ ++ // It's inflated. ++#if INCLUDE_RTM_OPT ++ if (use_rtm) { ++ Label L_regular_inflated_unlock; ++ // Clean monitor_value bit to get valid pointer ++ int owner_offset = ObjectMonitor::owner_offset_in_bytes() - markOopDesc::monitor_value; ++ movptr(boxReg, Address(tmpReg, owner_offset)); ++ testptr(boxReg, boxReg); ++ jccb(Assembler::notZero, L_regular_inflated_unlock); ++ xend(); ++ jmpb(DONE_LABEL); ++ bind(L_regular_inflated_unlock); ++ } ++#endif ++ ++ // Despite our balanced locking property we still check that m->_owner == Self ++ // as java routines or native JNI code called by this thread might ++ // have released the lock. ++ // Refer to the comments in synchronizer.cpp for how we might encode extra ++ // state in _succ so we can avoid fetching EntryList|cxq. ++ // ++ // I'd like to add more cases in fast_lock() and fast_unlock() -- ++ // such as recursive enter and exit -- but we have to be wary of ++ // I$ bloat, T$ effects and BP$ effects. ++ // ++ // If there's no contention try a 1-0 exit. That is, exit without ++ // a costly MEMBAR or CAS. See synchronizer.cpp for details on how ++ // we detect and recover from the race that the 1-0 exit admits. ++ // ++ // Conceptually Fast_Unlock() must execute a STST|LDST "release" barrier ++ // before it STs null into _owner, releasing the lock. Updates ++ // to data protected by the critical section must be visible before ++ // we drop the lock (and thus before any other thread could acquire ++ // the lock and observe the fields protected by the lock). ++ // IA32's memory-model is SPO, so STs are ordered with respect to ++ // each other and there's no need for an explicit barrier (fence). ++ // See also http://gee.cs.oswego.edu/dl/jmm/cookbook.html. ++#ifndef _LP64 ++ get_thread (boxReg); ++ if ((EmitSync & 4096) && VM_Version::supports_3dnow_prefetch() && os::is_MP()) { ++ // prefetchw [ebx + Offset(_owner)-2] ++ prefetchw(Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ } ++ ++ // Note that we could employ various encoding schemes to reduce ++ // the number of loads below (currently 4) to just 2 or 3. ++ // Refer to the comments in synchronizer.cpp. ++ // In practice the chain of fetches doesn't seem to impact performance, however. ++ if ((EmitSync & 65536) == 0 && (EmitSync & 256)) { ++ // Attempt to reduce branch density - AMD's branch predictor. ++ xorptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ orptr(boxReg, Address (tmpReg, ObjectMonitor::recursions_offset_in_bytes()-2)); ++ orptr(boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)); ++ orptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)); ++ jccb (Assembler::notZero, DONE_LABEL); ++ movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD); ++ jmpb (DONE_LABEL); ++ } else { ++ xorptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ orptr(boxReg, Address (tmpReg, ObjectMonitor::recursions_offset_in_bytes()-2)); ++ jccb (Assembler::notZero, DONE_LABEL); ++ movptr(boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)); ++ orptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)); ++ jccb (Assembler::notZero, CheckSucc); ++ movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD); ++ jmpb (DONE_LABEL); ++ } ++ ++ // The Following code fragment (EmitSync & 65536) improves the performance of ++ // contended applications and contended synchronization microbenchmarks. ++ // Unfortunately the emission of the code - even though not executed - causes regressions ++ // in scimark and jetstream, evidently because of $ effects. Replacing the code ++ // with an equal number of never-executed NOPs results in the same regression. ++ // We leave it off by default. ++ ++ if ((EmitSync & 65536) != 0) { ++ Label LSuccess, LGoSlowPath ; ++ ++ bind (CheckSucc); ++ ++ // Optional pre-test ... it's safe to elide this ++ if ((EmitSync & 16) == 0) { ++ cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), (int32_t)NULL_WORD); ++ jccb (Assembler::zero, LGoSlowPath); ++ } ++ ++ // We have a classic Dekker-style idiom: ++ // ST m->_owner = 0 ; MEMBAR; LD m->_succ ++ // There are a number of ways to implement the barrier: ++ // (1) lock:andl &m->_owner, 0 ++ // is fast, but mask doesn't currently support the "ANDL M,IMM32" form. ++ // LOCK: ANDL [ebx+Offset(_Owner)-2], 0 ++ // Encodes as 81 31 OFF32 IMM32 or 83 63 OFF8 IMM8 ++ // (2) If supported, an explicit MFENCE is appealing. ++ // In older IA32 processors MFENCE is slower than lock:add or xchg ++ // particularly if the write-buffer is full as might be the case if ++ // if stores closely precede the fence or fence-equivalent instruction. ++ // In more modern implementations MFENCE appears faster, however. ++ // (3) In lieu of an explicit fence, use lock:addl to the top-of-stack ++ // The $lines underlying the top-of-stack should be in M-state. ++ // The locked add instruction is serializing, of course. ++ // (4) Use xchg, which is serializing ++ // mov boxReg, 0; xchgl boxReg, [tmpReg + Offset(_owner)-2] also works ++ // (5) ST m->_owner = 0 and then execute lock:orl &m->_succ, 0. ++ // The integer condition codes will tell us if succ was 0. ++ // Since _succ and _owner should reside in the same $line and ++ // we just stored into _owner, it's likely that the $line ++ // remains in M-state for the lock:orl. ++ // ++ // We currently use (3), although it's likely that switching to (2) ++ // is correct for the future. ++ ++ movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD); ++ if (os::is_MP()) { ++ if (VM_Version::supports_sse2() && 1 == FenceInstruction) { ++ mfence(); ++ } else { ++ lock (); addptr(Address(rsp, 0), 0); ++ } ++ } ++ // Ratify _succ remains non-null ++ cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), 0); ++ jccb (Assembler::notZero, LSuccess); ++ ++ xorptr(boxReg, boxReg); // box is really EAX ++ if (os::is_MP()) { lock(); } ++ cmpxchgptr(rsp, Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ jccb (Assembler::notEqual, LSuccess); ++ // Since we're low on registers we installed rsp as a placeholding in _owner. ++ // Now install Self over rsp. This is safe as we're transitioning from ++ // non-null to non=null ++ get_thread (boxReg); ++ movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), boxReg); ++ // Intentional fall-through into LGoSlowPath ... ++ ++ bind (LGoSlowPath); ++ orptr(boxReg, 1); // set ICC.ZF=0 to indicate failure ++ jmpb (DONE_LABEL); ++ ++ bind (LSuccess); ++ xorptr(boxReg, boxReg); // set ICC.ZF=1 to indicate success ++ jmpb (DONE_LABEL); ++ } ++ ++ bind (Stacked); ++ // It's not inflated and it's not recursively stack-locked and it's not biased. ++ // It must be stack-locked. ++ // Try to reset the header to displaced header. ++ // The "box" value on the stack is stable, so we can reload ++ // and be assured we observe the same value as above. ++ movptr(tmpReg, Address(boxReg, 0)); ++ if (os::is_MP()) { ++ lock(); ++ } ++ cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses RAX which is box ++ // Intention fall-thru into DONE_LABEL ++ ++ // DONE_LABEL is a hot target - we'd really like to place it at the ++ // start of cache line by padding with NOPs. ++ // See the AMD and Intel software optimization manuals for the ++ // most efficient "long" NOP encodings. ++ // Unfortunately none of our alignment mechanisms suffice. ++ if ((EmitSync & 65536) == 0) { ++ bind (CheckSucc); ++ } ++#else // _LP64 ++ // It's inflated ++ movptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ xorptr(boxReg, r15_thread); ++ orptr (boxReg, Address (tmpReg, ObjectMonitor::recursions_offset_in_bytes()-2)); ++ jccb (Assembler::notZero, DONE_LABEL); ++ movptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)); ++ orptr (boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)); ++ jccb (Assembler::notZero, CheckSucc); ++ movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), (int32_t)NULL_WORD); ++ jmpb (DONE_LABEL); ++ ++ if ((EmitSync & 65536) == 0) { ++ Label LSuccess, LGoSlowPath ; ++ bind (CheckSucc); ++ cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), (int32_t)NULL_WORD); ++ jccb (Assembler::zero, LGoSlowPath); ++ ++ // I'd much rather use lock:andl m->_owner, 0 as it's faster than the ++ // the explicit ST;MEMBAR combination, but masm doesn't currently support ++ // "ANDQ M,IMM". Don't use MFENCE here. lock:add to TOS, xchg, etc ++ // are all faster when the write buffer is populated. ++ movptr (Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), (int32_t)NULL_WORD); ++ if (os::is_MP()) { ++ lock (); addl (Address(rsp, 0), 0); ++ } ++ cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), (int32_t)NULL_WORD); ++ jccb (Assembler::notZero, LSuccess); ++ ++ movptr (boxReg, (int32_t)NULL_WORD); // box is really EAX ++ if (os::is_MP()) { lock(); } ++ cmpxchgptr(r15_thread, Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); ++ jccb (Assembler::notEqual, LSuccess); ++ // Intentional fall-through into slow-path ++ ++ bind (LGoSlowPath); ++ orl (boxReg, 1); // set ICC.ZF=0 to indicate failure ++ jmpb (DONE_LABEL); ++ ++ bind (LSuccess); ++ testl (boxReg, 0); // set ICC.ZF=1 to indicate success ++ jmpb (DONE_LABEL); ++ } ++ ++ bind (Stacked); ++ movptr(tmpReg, Address (boxReg, 0)); // re-fetch ++ if (os::is_MP()) { lock(); } ++ cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses RAX which is box ++ ++ if (EmitSync & 65536) { ++ bind (CheckSucc); ++ } ++#endif ++ bind(DONE_LABEL); ++ // Avoid branch to branch on AMD processors ++ if (EmitSync & 32768) { ++ nop(); ++ } ++ } ++} ++#endif // COMPILER2 ++ + void MacroAssembler::c2bool(Register x) { + // implements x == 0 ? 0 : 1 + // note: must only look at least-significant byte of x +@@ -1969,7 +2849,9 @@ + Condition negated_cond = negate_condition(cond); + Label L; + jcc(negated_cond, L); ++ pushf(); // Preserve flags + atomic_incl(counter_addr); ++ popf(); + bind(L); + } + +@@ -2271,10 +3153,12 @@ + // if fast computation is not possible, result is NaN. Requires + // fallback from user of this macro. + // increase precision for intermediate steps of the computation ++ BLOCK_COMMENT("fast_pow {"); + increase_precision(); + fyl2x(); // Stack: (Y*log2(X)) ... + pow_exp_core_encoding(); // Stack: exp(X) ... + restore_precision(); ++ BLOCK_COMMENT("} fast_pow"); + } + + void MacroAssembler::fast_exp() { +@@ -5212,7 +6096,7 @@ + + + // C2 compiled method's prolog code. +-void MacroAssembler::verified_entry(int framesize, bool stack_bang, bool fp_mode_24b) { ++void MacroAssembler::verified_entry(int framesize, int stack_bang_size, bool fp_mode_24b) { + + // WARNING: Initial instruction MUST be 5 bytes or longer so that + // NativeJump::patch_verified_entry will be able to patch out the entry +@@ -5220,18 +6104,20 @@ + // the frame allocation can be either 3 or 6 bytes. So if we don't do + // stack bang then we must use the 6 byte frame allocation even if + // we have no frame. :-( ++ assert(stack_bang_size >= framesize || stack_bang_size <= 0, "stack bang size incorrect"); + + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove word for return addr + framesize -= wordSize; ++ stack_bang_size -= wordSize; + + // Calls to C2R adapters often do not accept exceptional returns. + // We require that their callers must bang for them. But be careful, because + // some VM calls (such as call site linkage) can use several kilobytes of + // stack. But the stack safety zone should account for that. + // See bugs 4446381, 4468289, 4497237. +- if (stack_bang) { +- generate_stack_overflow_check(framesize); ++ if (stack_bang_size > 0) { ++ generate_stack_overflow_check(stack_bang_size); + + // We always push rbp, so that on return to interpreter rbp, will be + // restored correctly and we can correct the stack. +--- ./hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -27,6 +27,7 @@ + + #include "asm/assembler.hpp" + #include "utilities/macros.hpp" ++#include "runtime/rtmLocking.hpp" + + + // MacroAssembler extends Assembler by frequently used macros. +@@ -111,7 +112,8 @@ + op == 0xE9 /* jmp */ || + op == 0xEB /* short jmp */ || + (op & 0xF0) == 0x70 /* short jcc */ || +- op == 0x0F && (branch[1] & 0xF0) == 0x80 /* jcc */, ++ op == 0x0F && (branch[1] & 0xF0) == 0x80 /* jcc */ || ++ op == 0xC7 && branch[1] == 0xF8 /* xbegin */, + "Invalid opcode at patch point"); + + if (op == 0xEB || (op & 0xF0) == 0x70) { +@@ -121,7 +123,7 @@ + guarantee(this->is8bit(imm8), "Short forward jump exceeds 8-bit offset"); + *disp = imm8; + } else { +- int* disp = (int*) &branch[(op == 0x0F)? 2: 1]; ++ int* disp = (int*) &branch[(op == 0x0F || op == 0xC7)? 2: 1]; + int imm32 = target - (address) &disp[1]; + *disp = imm32; + } +@@ -161,7 +163,6 @@ + void incrementq(Register reg, int value = 1); + void incrementq(Address dst, int value = 1); + +- + // Support optimal SSE move instructions. + void movflt(XMMRegister dst, XMMRegister src) { + if (UseXmmRegToRegMoveAll) { movaps(dst, src); return; } +@@ -187,6 +188,8 @@ + void incrementl(AddressLiteral dst); + void incrementl(ArrayAddress dst); + ++ void incrementq(AddressLiteral dst); ++ + // Alignment + void align(int modulus); + +@@ -651,7 +654,40 @@ + Label& done, Label* slow_case = NULL, + BiasedLockingCounters* counters = NULL); + void biased_locking_exit (Register obj_reg, Register temp_reg, Label& done); +- ++#ifdef COMPILER2 ++ // Code used by cmpFastLock and cmpFastUnlock mach instructions in .ad file. ++ // See full desription in macroAssembler_x86.cpp. ++ void fast_lock(Register obj, Register box, Register tmp, ++ Register scr, Register cx1, Register cx2, ++ BiasedLockingCounters* counters, ++ RTMLockingCounters* rtm_counters, ++ RTMLockingCounters* stack_rtm_counters, ++ Metadata* method_data, ++ bool use_rtm, bool profile_rtm); ++ void fast_unlock(Register obj, Register box, Register tmp, bool use_rtm); ++#if INCLUDE_RTM_OPT ++ void rtm_counters_update(Register abort_status, Register rtm_counters); ++ void branch_on_random_using_rdtsc(Register tmp, Register scr, int count, Label& brLabel); ++ void rtm_abort_ratio_calculation(Register tmp, Register rtm_counters_reg, ++ RTMLockingCounters* rtm_counters, ++ Metadata* method_data); ++ void rtm_profiling(Register abort_status_Reg, Register rtm_counters_Reg, ++ RTMLockingCounters* rtm_counters, Metadata* method_data, bool profile_rtm); ++ void rtm_retry_lock_on_abort(Register retry_count, Register abort_status, Label& retryLabel); ++ void rtm_retry_lock_on_busy(Register retry_count, Register box, Register tmp, Register scr, Label& retryLabel); ++ void rtm_stack_locking(Register obj, Register tmp, Register scr, ++ Register retry_on_abort_count, ++ RTMLockingCounters* stack_rtm_counters, ++ Metadata* method_data, bool profile_rtm, ++ Label& DONE_LABEL, Label& IsInflated); ++ void rtm_inflated_locking(Register obj, Register box, Register tmp, ++ Register scr, Register retry_on_busy_count, ++ Register retry_on_abort_count, ++ RTMLockingCounters* rtm_counters, ++ Metadata* method_data, bool profile_rtm, ++ Label& DONE_LABEL); ++#endif ++#endif + + Condition negate_condition(Condition cond); + +@@ -716,6 +752,7 @@ + + + void imulptr(Register dst, Register src) { LP64_ONLY(imulq(dst, src)) NOT_LP64(imull(dst, src)); } ++ void imulptr(Register dst, Register src, int imm32) { LP64_ONLY(imulq(dst, src, imm32)) NOT_LP64(imull(dst, src, imm32)); } + + + void negptr(Register dst) { LP64_ONLY(negq(dst)) NOT_LP64(negl(dst)); } +@@ -757,7 +794,14 @@ + // Conditionally (atomically, on MPs) increments passed counter address, preserving condition codes. + void cond_inc32(Condition cond, AddressLiteral counter_addr); + // Unconditional atomic increment. +- void atomic_incl(AddressLiteral counter_addr); ++ void atomic_incl(Address counter_addr); ++ void atomic_incl(AddressLiteral counter_addr, Register scr = rscratch1); ++#ifdef _LP64 ++ void atomic_incq(Address counter_addr); ++ void atomic_incq(AddressLiteral counter_addr, Register scr = rscratch1); ++#endif ++ void atomic_incptr(AddressLiteral counter_addr, Register scr = rscratch1) { LP64_ONLY(atomic_incq(counter_addr, scr)) NOT_LP64(atomic_incl(counter_addr, scr)) ; } ++ void atomic_incptr(Address counter_addr) { LP64_ONLY(atomic_incq(counter_addr)) NOT_LP64(atomic_incl(counter_addr)) ; } + + void lea(Register dst, AddressLiteral adr); + void lea(Address dst, AddressLiteral adr); +@@ -1069,7 +1113,11 @@ + + void movptr(Register dst, Address src); + +- void movptr(Register dst, AddressLiteral src); ++#ifdef _LP64 ++ void movptr(Register dst, AddressLiteral src, Register scratch=rscratch1); ++#else ++ void movptr(Register dst, AddressLiteral src, Register scratch=noreg); // Scratch reg is ignored in 32-bit ++#endif + + void movptr(Register dst, intptr_t src); + void movptr(Register dst, Register src); +@@ -1122,7 +1170,7 @@ + void movl2ptr(Register dst, Register src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(if (dst != src) movl(dst, src)); } + + // C2 compiled method's prolog code. +- void verified_entry(int framesize, bool stack_bang, bool fp_mode_24b); ++ void verified_entry(int framesize, int stack_bang_size, bool fp_mode_24b); + + // clear memory of size 'cnt' qwords, starting at 'base'. + void clear_mem(Register base, Register cnt, Register rtmp); +--- ./hotspot/src/cpu/x86/vm/methodHandles_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/methodHandles_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -29,6 +29,8 @@ + #include "memory/allocation.inline.hpp" + #include "prims/methodHandles.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #define __ _masm-> + + #ifdef PRODUCT +--- ./hotspot/src/cpu/x86/vm/nativeInst_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/nativeInst_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2010, 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 +@@ -35,6 +35,8 @@ + #include "c1/c1_Runtime1.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + void NativeInstruction::wrote(int offset) { + ICache::invalidate_word(addr_at(offset)); + } +--- ./hotspot/src/cpu/x86/vm/rtmLocking.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/x86/vm/rtmLocking.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++#include "precompiled.hpp" ++#include "memory/allocation.inline.hpp" ++#include "runtime/task.hpp" ++#include "runtime/rtmLocking.hpp" ++ ++// One-shot PeriodicTask subclass for enabling RTM locking ++uintx RTMLockingCounters::_calculation_flag = 0; ++ ++class RTMLockingCalculationTask : public PeriodicTask { ++ public: ++ RTMLockingCalculationTask(size_t interval_time) : PeriodicTask(interval_time){ } ++ ++ virtual void task() { ++ RTMLockingCounters::_calculation_flag = 1; ++ // Reclaim our storage and disenroll ourself ++ delete this; ++ } ++}; ++ ++void RTMLockingCounters::init() { ++ if (UseRTMLocking && RTMLockingCalculationDelay > 0) { ++ RTMLockingCalculationTask* task = new RTMLockingCalculationTask(RTMLockingCalculationDelay); ++ task->enroll(); ++ } else { ++ _calculation_flag = 1; ++ } ++} ++ ++//------------------------------print_on------------------------------- ++void RTMLockingCounters::print_on(outputStream* st) { ++ tty->print_cr("# rtm locks total (estimated): " UINTX_FORMAT, _total_count * RTMTotalCountIncrRate); ++ tty->print_cr("# rtm lock aborts : " UINTX_FORMAT, _abort_count); ++ for (int i = 0; i < ABORT_STATUS_LIMIT; i++) { ++ tty->print_cr("# rtm lock aborts %d: " UINTX_FORMAT, i, _abortX_count[i]); ++ } ++} +--- ./hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -977,7 +977,9 @@ + + int SharedRuntime::c_calling_convention(const BasicType *sig_bt, + VMRegPair *regs, ++ VMRegPair *regs2, + int total_args_passed) { ++ assert(regs2 == NULL, "not needed on x86"); + // We return the amount of VMRegImpl stack slots we need to reserve for all + // the arguments NOT counting out_preserve_stack_slots. + +@@ -1624,7 +1626,7 @@ + // Now figure out where the args must be stored and how much stack space + // they require. + int out_arg_slots; +- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, total_c_args); ++ out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args); + + // Compute framesize for the wrapper. We need to handlize all oops in + // registers a max of 2 on x86. +@@ -1815,6 +1817,13 @@ + // Frame is now completed as far as size and linkage. + int frame_complete = ((intptr_t)__ pc()) - start; + ++ if (UseRTMLocking) { ++ // Abort RTM transaction before calling JNI ++ // because critical section will be large and will be ++ // aborted anyway. Also nmethod could be deoptimized. ++ __ xabort(0); ++ } ++ + // Calculate the difference between rsp and rbp,. We need to know it + // after the native call because on windows Java Natives will pop + // the arguments and it is painful to do rsp relative addressing +@@ -2257,7 +2266,7 @@ + if (!is_critical_native) { + // reset handle block + __ movptr(rcx, Address(thread, JavaThread::active_handles_offset())); +- __ movptr(Address(rcx, JNIHandleBlock::top_offset_in_bytes()), NULL_WORD); ++ __ movl(Address(rcx, JNIHandleBlock::top_offset_in_bytes()), NULL_WORD); + + // Any exception pending? + __ cmpptr(Address(thread, in_bytes(Thread::pending_exception_offset())), (int32_t)NULL_WORD); +@@ -2495,7 +2504,7 @@ + // they require (neglecting out_preserve_stack_slots). + + int out_arg_slots; +- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, total_c_args); ++ out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args); + + // Calculate the total number of stack slots we will need. + +@@ -3005,11 +3014,15 @@ + // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) + __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); + +- // Stack bang to make sure there's enough room for these interpreter frames. ++#ifdef ASSERT ++ // Compilers generate code that bang the stack by as much as the ++ // interpreter would need. So this stack banging should never ++ // trigger a fault. Verify that it does not on non product builds. + if (UseStackBanging) { + __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); + __ bang_stack_size(rbx, rcx); + } ++#endif + + // Load array of frame pcs into ECX + __ movptr(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); +@@ -3168,6 +3181,12 @@ + }; + + address start = __ pc(); ++ ++ if (UseRTMLocking) { ++ // Abort RTM transaction before possible nmethod deoptimization. ++ __ xabort(0); ++ } ++ + // Push self-frame. + __ subptr(rsp, return_off*wordSize); // Epilog! + +@@ -3225,12 +3244,15 @@ + // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) + __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); + +- // Stack bang to make sure there's enough room for these interpreter frames. ++#ifdef ASSERT ++ // Compilers generate code that bang the stack by as much as the ++ // interpreter would need. So this stack banging should never ++ // trigger a fault. Verify that it does not on non product builds. + if (UseStackBanging) { + __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); + __ bang_stack_size(rbx, rcx); + } +- ++#endif + + // Load array of frame pcs into ECX + __ movl(rcx,Address(rdi,Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); +@@ -3353,6 +3375,14 @@ + address call_pc = NULL; + bool cause_return = (poll_type == POLL_AT_RETURN); + bool save_vectors = (poll_type == POLL_AT_VECTOR_LOOP); ++ ++ if (UseRTMLocking) { ++ // Abort RTM transaction before calling runtime ++ // because critical section will be large and will be ++ // aborted anyway. Also nmethod could be deoptimized. ++ __ xabort(0); ++ } ++ + // If cause_return is true we are at a poll_return and there is + // the return address on the stack to the caller on the nmethod + // that is safepoint. We can leave this return on the stack and +--- ./hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -889,7 +889,9 @@ + + int SharedRuntime::c_calling_convention(const BasicType *sig_bt, + VMRegPair *regs, ++ VMRegPair *regs2, + int total_args_passed) { ++ assert(regs2 == NULL, "not needed on x86"); + // We return the amount of VMRegImpl stack slots we need to reserve for all + // the arguments NOT counting out_preserve_stack_slots. + +@@ -1857,7 +1859,7 @@ + // Now figure out where the args must be stored and how much stack space + // they require. + int out_arg_slots; +- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, total_c_args); ++ out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args); + + // Compute framesize for the wrapper. We need to handlize all oops in + // incoming registers +@@ -2010,6 +2012,13 @@ + // Frame is now completed as far as size and linkage. + int frame_complete = ((intptr_t)__ pc()) - start; + ++ if (UseRTMLocking) { ++ // Abort RTM transaction before calling JNI ++ // because critical section will be large and will be ++ // aborted anyway. Also nmethod could be deoptimized. ++ __ xabort(0); ++ } ++ + #ifdef ASSERT + { + Label L; +@@ -2500,7 +2509,7 @@ + if (!is_critical_native) { + // reset handle block + __ movptr(rcx, Address(r15_thread, JavaThread::active_handles_offset())); +- __ movptr(Address(rcx, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); ++ __ movl(Address(rcx, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); + } + + // pop our frame +@@ -2761,7 +2770,7 @@ + // the 1st six register arguments). It's weird see int_stk_helper. + + int out_arg_slots; +- out_arg_slots = c_calling_convention(out_sig_bt, out_regs, total_c_args); ++ out_arg_slots = c_calling_convention(out_sig_bt, out_regs, NULL, total_c_args); + + // Calculate the total number of stack slots we will need. + +@@ -3475,11 +3484,15 @@ + // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) + __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); + +- // Stack bang to make sure there's enough room for these interpreter frames. ++#ifdef ASSERT ++ // Compilers generate code that bang the stack by as much as the ++ // interpreter would need. So this stack banging should never ++ // trigger a fault. Verify that it does not on non product builds. + if (UseStackBanging) { + __ movl(rbx, Address(rdi, Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); + __ bang_stack_size(rbx, rcx); + } ++#endif + + // Load address of array of frame pcs into rcx + __ movptr(rcx, Address(rdi, Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); +@@ -3610,6 +3623,11 @@ + + address start = __ pc(); + ++ if (UseRTMLocking) { ++ // Abort RTM transaction before possible nmethod deoptimization. ++ __ xabort(0); ++ } ++ + // Push self-frame. We get here with a return address on the + // stack, so rsp is 8-byte aligned until we allocate our frame. + __ subptr(rsp, SimpleRuntimeFrame::return_off << LogBytesPerInt); // Epilog! +@@ -3668,11 +3686,15 @@ + // restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved) + __ movptr(rbp, Address(rdi, Deoptimization::UnrollBlock::initial_info_offset_in_bytes())); + +- // Stack bang to make sure there's enough room for these interpreter frames. ++#ifdef ASSERT ++ // Compilers generate code that bang the stack by as much as the ++ // interpreter would need. So this stack banging should never ++ // trigger a fault. Verify that it does not on non product builds. + if (UseStackBanging) { + __ movl(rbx, Address(rdi ,Deoptimization::UnrollBlock::total_frame_sizes_offset_in_bytes())); + __ bang_stack_size(rbx, rcx); + } ++#endif + + // Load address of array of frame pcs into rcx (address*) + __ movptr(rcx, Address(rdi, Deoptimization::UnrollBlock::frame_pcs_offset_in_bytes())); +@@ -3790,6 +3812,13 @@ + bool cause_return = (poll_type == POLL_AT_RETURN); + bool save_vectors = (poll_type == POLL_AT_VECTOR_LOOP); + ++ if (UseRTMLocking) { ++ // Abort RTM transaction before calling runtime ++ // because critical section will be large and will be ++ // aborted anyway. Also nmethod could be deoptimized. ++ __ xabort(0); ++ } ++ + // Make room for return address (or push it again) + if (!cause_return) { + __ push(rbx); +--- ./hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -2403,6 +2403,9 @@ + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // ++ // Output: ++ // rax - input length ++ // + address generate_cipherBlockChaining_encryptAESCrypt() { + assert(UseAES, "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); +@@ -2483,7 +2486,7 @@ + __ movdqu(Address(rvec, 0), xmm_result); // final value of r stored in rvec of CipherBlockChaining object + + handleSOERegisters(false /*restoring*/); +- __ movl(rax, 0); // return 0 (why?) ++ __ movptr(rax, len_param); // return length + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + +@@ -2557,6 +2560,9 @@ + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // ++ // Output: ++ // rax - input length ++ // + + address generate_cipherBlockChaining_decryptAESCrypt() { + assert(UseAES, "need AES instructions and misaligned SSE support"); +@@ -2650,7 +2656,7 @@ + __ movptr(rvec , rvec_param); // restore this since used in loop + __ movdqu(Address(rvec, 0), xmm_temp); // final value of r stored in rvec of CipherBlockChaining object + handleSOERegisters(false /*restoring*/); +- __ movl(rax, 0); // return 0 (why?) ++ __ movptr(rax, len_param); // return length + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + +--- ./hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -3217,6 +3217,9 @@ + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // ++ // Output: ++ // rax - input length ++ // + address generate_cipherBlockChaining_encryptAESCrypt() { + assert(UseAES, "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); +@@ -3232,7 +3235,7 @@ + #ifndef _WIN64 + const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16) + #else +- const Address len_mem(rsp, 6 * wordSize); // length is on stack on Win64 ++ const Address len_mem(rbp, 6 * wordSize); // length is on stack on Win64 + const Register len_reg = r10; // pick the first volatile windows register + #endif + const Register pos = rax; +@@ -3259,6 +3262,8 @@ + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(xmm_save(i), as_XMMRegister(i)); + } ++#else ++ __ push(len_reg); // Save + #endif + + const XMMRegister xmm_key_shuf_mask = xmm_temp; // used temporarily to swap key bytes up front +@@ -3301,8 +3306,10 @@ + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(as_XMMRegister(i), xmm_save(i)); + } ++ __ movl(rax, len_mem); ++#else ++ __ pop(rax); // return length + #endif +- __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + +@@ -3409,6 +3416,9 @@ + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // ++ // Output: ++ // rax - input length ++ // + + address generate_cipherBlockChaining_decryptAESCrypt_Parallel() { + assert(UseAES, "need AES instructions and misaligned SSE support"); +@@ -3427,7 +3437,7 @@ + #ifndef _WIN64 + const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16) + #else +- const Address len_mem(rsp, 6 * wordSize); // length is on stack on Win64 ++ const Address len_mem(rbp, 6 * wordSize); // length is on stack on Win64 + const Register len_reg = r10; // pick the first volatile windows register + #endif + const Register pos = rax; +@@ -3448,7 +3458,10 @@ + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(xmm_save(i), as_XMMRegister(i)); + } ++#else ++ __ push(len_reg); // Save + #endif ++ + // the java expanded key ordering is rotated one position from what we want + // so we start from 0x10 here and hit 0x00 last + const XMMRegister xmm_key_shuf_mask = xmm1; // used temporarily to swap key bytes up front +@@ -3554,8 +3567,10 @@ + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(as_XMMRegister(i), xmm_save(i)); + } ++ __ movl(rax, len_mem); ++#else ++ __ pop(rax); // return length + #endif +- __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + +--- ./hotspot/src/cpu/x86/vm/templateInterpreter_x86.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/cpu/x86/vm/templateInterpreter_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,124 @@ ++/* ++ * 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 ++ * 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 "ci/ciMethod.hpp" ++#include "interpreter/interpreter.hpp" ++#include "runtime/frame.inline.hpp" ++ ++#ifndef CC_INTERP ++ ++// asm based interpreter deoptimization helpers ++int AbstractInterpreter::size_activation(int max_stack, ++ int temps, ++ int extra_args, ++ int monitors, ++ int callee_params, ++ int callee_locals, ++ bool is_top_frame) { ++ // Note: This calculation must exactly parallel the frame setup ++ // in AbstractInterpreterGenerator::generate_method_entry. ++ ++ // fixed size of an interpreter frame: ++ int overhead = frame::sender_sp_offset - ++ frame::interpreter_frame_initial_sp_offset; ++ // Our locals were accounted for by the caller (or last_frame_adjust ++ // on the transistion) Since the callee parameters already account ++ // for the callee's params we only need to account for the extra ++ // locals. ++ int size = overhead + ++ (callee_locals - callee_params)*Interpreter::stackElementWords + ++ monitors * frame::interpreter_frame_monitor_size() + ++ temps* Interpreter::stackElementWords + extra_args; ++ ++ return size; ++} ++ ++void AbstractInterpreter::layout_activation(Method* method, ++ int tempcount, ++ int popframe_extra_args, ++ int moncount, ++ int caller_actual_parameters, ++ int callee_param_count, ++ int callee_locals, ++ frame* caller, ++ frame* interpreter_frame, ++ bool is_top_frame, ++ bool is_bottom_frame) { ++ // The frame interpreter_frame is guaranteed to be the right size, ++ // as determined by a previous call to the size_activation() method. ++ // It is also guaranteed to be walkable even though it is in a ++ // skeletal state ++ ++ int max_locals = method->max_locals() * Interpreter::stackElementWords; ++ int extra_locals = (method->max_locals() - method->size_of_parameters()) * ++ Interpreter::stackElementWords; ++ ++#ifdef ASSERT ++ if (!EnableInvokeDynamic) { ++ // @@@ FIXME: Should we correct interpreter_frame_sender_sp in the calling sequences? ++ // Probably, since deoptimization doesn't work yet. ++ assert(caller->unextended_sp() == interpreter_frame->interpreter_frame_sender_sp(), "Frame not properly walkable"); ++ } ++ assert(caller->sp() == interpreter_frame->sender_sp(), "Frame not properly walkable(2)"); ++#endif ++ ++ interpreter_frame->interpreter_frame_set_method(method); ++ // NOTE the difference in using sender_sp and ++ // interpreter_frame_sender_sp interpreter_frame_sender_sp is ++ // the original sp of the caller (the unextended_sp) and ++ // sender_sp is fp+8/16 (32bit/64bit) XXX ++ intptr_t* locals = interpreter_frame->sender_sp() + max_locals - 1; ++ ++#ifdef ASSERT ++ if (caller->is_interpreted_frame()) { ++ assert(locals < caller->fp() + frame::interpreter_frame_initial_sp_offset, "bad placement"); ++ } ++#endif ++ ++ interpreter_frame->interpreter_frame_set_locals(locals); ++ BasicObjectLock* montop = interpreter_frame->interpreter_frame_monitor_begin(); ++ BasicObjectLock* monbot = montop - moncount; ++ interpreter_frame->interpreter_frame_set_monitor_end(monbot); ++ ++ // Set last_sp ++ intptr_t* esp = (intptr_t*) monbot - ++ tempcount*Interpreter::stackElementWords - ++ popframe_extra_args; ++ interpreter_frame->interpreter_frame_set_last_sp(esp); ++ ++ // All frames but the initial (oldest) interpreter frame we fill in have ++ // a value for sender_sp that allows walking the stack but isn't ++ // truly correct. Correct the value here. ++ if (extra_locals != 0 && ++ interpreter_frame->sender_sp() == ++ interpreter_frame->interpreter_frame_sender_sp()) { ++ interpreter_frame->set_interpreter_frame_sender_sp(caller->sp() + ++ extra_locals); ++ } ++ *interpreter_frame->interpreter_frame_cache_addr() = ++ method->constants()->cache(); ++} ++ ++#endif // CC_INTERP +--- ./hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1287,7 +1287,7 @@ + + // reset handle block + __ movptr(t, Address(thread, JavaThread::active_handles_offset())); +- __ movptr(Address(t, JNIHandleBlock::top_offset_in_bytes()), NULL_WORD); ++ __ movl(Address(t, JNIHandleBlock::top_offset_in_bytes()), NULL_WORD); + + // If result was an oop then unbox and save it in the frame + { Label L; +@@ -1686,91 +1686,6 @@ + return overhead_size + method_stack + stub_code; + } + +-// asm based interpreter deoptimization helpers +- +-int AbstractInterpreter::layout_activation(Method* method, +- int tempcount, +- int popframe_extra_args, +- int moncount, +- int caller_actual_parameters, +- int callee_param_count, +- int callee_locals, +- frame* caller, +- frame* interpreter_frame, +- bool is_top_frame, +- bool is_bottom_frame) { +- // Note: This calculation must exactly parallel the frame setup +- // in AbstractInterpreterGenerator::generate_method_entry. +- // If interpreter_frame!=NULL, set up the method, locals, and monitors. +- // The frame interpreter_frame, if not NULL, is guaranteed to be the right size, +- // as determined by a previous call to this method. +- // It is also guaranteed to be walkable even though it is in a skeletal state +- // NOTE: return size is in words not bytes +- +- // fixed size of an interpreter frame: +- int max_locals = method->max_locals() * Interpreter::stackElementWords; +- int extra_locals = (method->max_locals() - method->size_of_parameters()) * +- Interpreter::stackElementWords; +- +- int overhead = frame::sender_sp_offset - frame::interpreter_frame_initial_sp_offset; +- +- // Our locals were accounted for by the caller (or last_frame_adjust on the transistion) +- // Since the callee parameters already account for the callee's params we only need to account for +- // the extra locals. +- +- +- int size = overhead + +- ((callee_locals - callee_param_count)*Interpreter::stackElementWords) + +- (moncount*frame::interpreter_frame_monitor_size()) + +- tempcount*Interpreter::stackElementWords + popframe_extra_args; +- +- if (interpreter_frame != NULL) { +-#ifdef ASSERT +- if (!EnableInvokeDynamic) +- // @@@ FIXME: Should we correct interpreter_frame_sender_sp in the calling sequences? +- // Probably, since deoptimization doesn't work yet. +- assert(caller->unextended_sp() == interpreter_frame->interpreter_frame_sender_sp(), "Frame not properly walkable"); +- assert(caller->sp() == interpreter_frame->sender_sp(), "Frame not properly walkable(2)"); +-#endif +- +- interpreter_frame->interpreter_frame_set_method(method); +- // NOTE the difference in using sender_sp and interpreter_frame_sender_sp +- // interpreter_frame_sender_sp is the original sp of the caller (the unextended_sp) +- // and sender_sp is fp+8 +- intptr_t* locals = interpreter_frame->sender_sp() + max_locals - 1; +- +-#ifdef ASSERT +- if (caller->is_interpreted_frame()) { +- assert(locals < caller->fp() + frame::interpreter_frame_initial_sp_offset, "bad placement"); +- } +-#endif +- +- interpreter_frame->interpreter_frame_set_locals(locals); +- BasicObjectLock* montop = interpreter_frame->interpreter_frame_monitor_begin(); +- BasicObjectLock* monbot = montop - moncount; +- interpreter_frame->interpreter_frame_set_monitor_end(monbot); +- +- // Set last_sp +- intptr_t* rsp = (intptr_t*) monbot - +- tempcount*Interpreter::stackElementWords - +- popframe_extra_args; +- interpreter_frame->interpreter_frame_set_last_sp(rsp); +- +- // All frames but the initial (oldest) interpreter frame we fill in have a +- // value for sender_sp that allows walking the stack but isn't +- // truly correct. Correct the value here. +- +- if (extra_locals != 0 && +- interpreter_frame->sender_sp() == interpreter_frame->interpreter_frame_sender_sp() ) { +- interpreter_frame->set_interpreter_frame_sender_sp(caller->sp() + extra_locals); +- } +- *interpreter_frame->interpreter_frame_cache_addr() = +- method->constants()->cache(); +- } +- return size; +-} +- +- + //------------------------------------------------------------------------------------------------------------------------ + // Exceptions + +--- ./hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1259,7 +1259,7 @@ + + // reset handle block + __ movptr(t, Address(r15_thread, JavaThread::active_handles_offset())); +- __ movptr(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); ++ __ movl(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); + + // If result is an oop unbox and store it in frame where gc will see it + // and result handler will pick it up +@@ -1695,87 +1695,6 @@ + return (overhead_size + method_stack + stub_code); + } + +-int AbstractInterpreter::layout_activation(Method* method, +- int tempcount, +- int popframe_extra_args, +- int moncount, +- int caller_actual_parameters, +- int callee_param_count, +- int callee_locals, +- frame* caller, +- frame* interpreter_frame, +- bool is_top_frame, +- bool is_bottom_frame) { +- // Note: This calculation must exactly parallel the frame setup +- // in AbstractInterpreterGenerator::generate_method_entry. +- // If interpreter_frame!=NULL, set up the method, locals, and monitors. +- // The frame interpreter_frame, if not NULL, is guaranteed to be the +- // right size, as determined by a previous call to this method. +- // It is also guaranteed to be walkable even though it is in a skeletal state +- +- // fixed size of an interpreter frame: +- int max_locals = method->max_locals() * Interpreter::stackElementWords; +- int extra_locals = (method->max_locals() - method->size_of_parameters()) * +- Interpreter::stackElementWords; +- +- int overhead = frame::sender_sp_offset - +- frame::interpreter_frame_initial_sp_offset; +- // Our locals were accounted for by the caller (or last_frame_adjust +- // on the transistion) Since the callee parameters already account +- // for the callee's params we only need to account for the extra +- // locals. +- int size = overhead + +- (callee_locals - callee_param_count)*Interpreter::stackElementWords + +- moncount * frame::interpreter_frame_monitor_size() + +- tempcount* Interpreter::stackElementWords + popframe_extra_args; +- if (interpreter_frame != NULL) { +-#ifdef ASSERT +- if (!EnableInvokeDynamic) +- // @@@ FIXME: Should we correct interpreter_frame_sender_sp in the calling sequences? +- // Probably, since deoptimization doesn't work yet. +- assert(caller->unextended_sp() == interpreter_frame->interpreter_frame_sender_sp(), "Frame not properly walkable"); +- assert(caller->sp() == interpreter_frame->sender_sp(), "Frame not properly walkable(2)"); +-#endif +- +- interpreter_frame->interpreter_frame_set_method(method); +- // NOTE the difference in using sender_sp and +- // interpreter_frame_sender_sp interpreter_frame_sender_sp is +- // the original sp of the caller (the unextended_sp) and +- // sender_sp is fp+16 XXX +- intptr_t* locals = interpreter_frame->sender_sp() + max_locals - 1; +- +-#ifdef ASSERT +- if (caller->is_interpreted_frame()) { +- assert(locals < caller->fp() + frame::interpreter_frame_initial_sp_offset, "bad placement"); +- } +-#endif +- +- interpreter_frame->interpreter_frame_set_locals(locals); +- BasicObjectLock* montop = interpreter_frame->interpreter_frame_monitor_begin(); +- BasicObjectLock* monbot = montop - moncount; +- interpreter_frame->interpreter_frame_set_monitor_end(monbot); +- +- // Set last_sp +- intptr_t* esp = (intptr_t*) monbot - +- tempcount*Interpreter::stackElementWords - +- popframe_extra_args; +- interpreter_frame->interpreter_frame_set_last_sp(esp); +- +- // All frames but the initial (oldest) interpreter frame we fill in have +- // a value for sender_sp that allows walking the stack but isn't +- // truly correct. Correct the value here. +- if (extra_locals != 0 && +- interpreter_frame->sender_sp() == +- interpreter_frame->interpreter_frame_sender_sp()) { +- interpreter_frame->set_interpreter_frame_sender_sp(caller->sp() + +- extra_locals); +- } +- *interpreter_frame->interpreter_frame_cache_addr() = +- method->constants()->cache(); +- } +- return size; +-} +- + //----------------------------------------------------------------------------- + // Exceptions + +--- ./hotspot/src/cpu/x86/vm/vm_version_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/vm_version_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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,13 +50,18 @@ + const char* VM_Version::_features_str = ""; + VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, }; + ++// Address of instruction which causes SEGV ++address VM_Version::_cpuinfo_segv_addr = 0; ++// Address of instruction after the one which causes SEGV ++address VM_Version::_cpuinfo_cont_addr = 0; ++ + static BufferBlob* stub_blob; +-static const int stub_size = 550; ++static const int stub_size = 600; + + extern "C" { +- typedef void (*getPsrInfo_stub_t)(void*); ++ typedef void (*get_cpu_info_stub_t)(void*); + } +-static getPsrInfo_stub_t getPsrInfo_stub = NULL; ++static get_cpu_info_stub_t get_cpu_info_stub = NULL; + + + class VM_Version_StubGenerator: public StubCodeGenerator { +@@ -64,7 +69,7 @@ + + VM_Version_StubGenerator(CodeBuffer *c) : StubCodeGenerator(c) {} + +- address generate_getPsrInfo() { ++ address generate_get_cpu_info() { + // Flags to test CPU type. + const uint32_t HS_EFL_AC = 0x40000; + const uint32_t HS_EFL_ID = 0x200000; +@@ -76,13 +81,13 @@ + Label detect_486, cpu486, detect_586, std_cpuid1, std_cpuid4; + Label sef_cpuid, ext_cpuid, ext_cpuid1, ext_cpuid5, ext_cpuid7, done; + +- StubCodeMark mark(this, "VM_Version", "getPsrInfo_stub"); ++ StubCodeMark mark(this, "VM_Version", "get_cpu_info_stub"); + # define __ _masm-> + + address start = __ pc(); + + // +- // void getPsrInfo(VM_Version::CpuidInfo* cpuid_info); ++ // void get_cpu_info(VM_Version::CpuidInfo* cpuid_info); + // + // LP64: rcx and rdx are first and second argument registers on windows + +@@ -234,9 +239,9 @@ + // Check if OS has enabled XGETBV instruction to access XCR0 + // (OSXSAVE feature flag) and CPU supports AVX + // +- __ andl(rcx, 0x18000000); ++ __ andl(rcx, 0x18000000); // cpuid1 bits osxsave | avx + __ cmpl(rcx, 0x18000000); +- __ jccb(Assembler::notEqual, sef_cpuid); ++ __ jccb(Assembler::notEqual, sef_cpuid); // jump if AVX is not supported + + // + // XCR0, XFEATURE_ENABLED_MASK register +@@ -247,6 +252,53 @@ + __ movl(Address(rsi, 0), rax); + __ movl(Address(rsi, 4), rdx); + ++ __ andl(rax, 0x6); // xcr0 bits sse | ymm ++ __ cmpl(rax, 0x6); ++ __ jccb(Assembler::notEqual, sef_cpuid); // jump if AVX is not supported ++ ++ // ++ // Some OSs have a bug when upper 128bits of YMM ++ // registers are not restored after a signal processing. ++ // Generate SEGV here (reference through NULL) ++ // and check upper YMM bits after it. ++ // ++ VM_Version::set_avx_cpuFeatures(); // Enable temporary to pass asserts ++ intx saved_useavx = UseAVX; ++ intx saved_usesse = UseSSE; ++ UseAVX = 1; ++ UseSSE = 2; ++ ++ // load value into all 32 bytes of ymm7 register ++ __ movl(rcx, VM_Version::ymm_test_value()); ++ ++ __ movdl(xmm0, rcx); ++ __ pshufd(xmm0, xmm0, 0x00); ++ __ vinsertf128h(xmm0, xmm0, xmm0); ++ __ vmovdqu(xmm7, xmm0); ++#ifdef _LP64 ++ __ vmovdqu(xmm8, xmm0); ++ __ vmovdqu(xmm15, xmm0); ++#endif ++ ++ __ xorl(rsi, rsi); ++ VM_Version::set_cpuinfo_segv_addr( __ pc() ); ++ // Generate SEGV ++ __ movl(rax, Address(rsi, 0)); ++ ++ VM_Version::set_cpuinfo_cont_addr( __ pc() ); ++ // Returns here after signal. Save xmm0 to check it later. ++ __ lea(rsi, Address(rbp, in_bytes(VM_Version::ymm_save_offset()))); ++ __ vmovdqu(Address(rsi, 0), xmm0); ++ __ vmovdqu(Address(rsi, 32), xmm7); ++#ifdef _LP64 ++ __ vmovdqu(Address(rsi, 64), xmm8); ++ __ vmovdqu(Address(rsi, 96), xmm15); ++#endif ++ ++ VM_Version::clean_cpuFeatures(); ++ UseAVX = saved_useavx; ++ UseSSE = saved_usesse; ++ + // + // cpuid(0x7) Structured Extended Features + // +@@ -339,6 +391,14 @@ + }; + + ++void VM_Version::get_cpu_info_wrapper() { ++ get_cpu_info_stub(&_cpuid_info); ++} ++ ++#ifndef CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED ++ #define CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED(f) f() ++#endif ++ + void VM_Version::get_processor_features() { + + _cpu = 4; // 486 by default +@@ -349,7 +409,11 @@ + + if (!Use486InstrsOnly) { + // Get raw processor info +- getPsrInfo_stub(&_cpuid_info); ++ ++ // Some platforms (like Win*) need a wrapper around here ++ // in order to properly handle SEGV for YMM registers test. ++ CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED(get_cpu_info_wrapper); ++ + assert_is_initialized(); + _cpu = extended_cpu_family(); + _model = extended_cpu_model(); +@@ -429,7 +493,7 @@ + } + + char buf[256]; +- jio_snprintf(buf, sizeof(buf), "(%u cores per cpu, %u threads per core) family %d model %d stepping %d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", ++ jio_snprintf(buf, sizeof(buf), "(%u cores per cpu, %u threads per core) family %d model %d stepping %d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + cores_per_cpu(), threads_per_core(), + cpu_family(), _model, _stepping, + (supports_cmov() ? ", cmov" : ""), +@@ -446,8 +510,9 @@ + (supports_avx() ? ", avx" : ""), + (supports_avx2() ? ", avx2" : ""), + (supports_aes() ? ", aes" : ""), +- (supports_clmul() ? ", clmul" : ""), ++ (supports_clmul() ? ", clmul" : ""), + (supports_erms() ? ", erms" : ""), ++ (supports_rtm() ? ", rtm" : ""), + (supports_mmx_ext() ? ", mmxext" : ""), + (supports_3dnow_prefetch() ? ", 3dnowpref" : ""), + (supports_lzcnt() ? ", lzcnt": ""), +@@ -455,7 +520,9 @@ + (supports_ht() ? ", ht": ""), + (supports_tsc() ? ", tsc": ""), + (supports_tscinv_bit() ? ", tscinvbit": ""), +- (supports_tscinv() ? ", tscinv": "")); ++ (supports_tscinv() ? ", tscinv": ""), ++ (supports_bmi1() ? ", bmi1" : ""), ++ (supports_bmi2() ? ", bmi2" : "")); + _features_str = strdup(buf); + + // UseSSE is set to the smaller of what hardware supports and what +@@ -486,7 +553,7 @@ + } + } else if (UseAES) { + if (!FLAG_IS_DEFAULT(UseAES)) +- warning("AES instructions not available on this CPU"); ++ warning("AES instructions are not available on this CPU"); + FLAG_SET_DEFAULT(UseAES, false); + } + +@@ -519,10 +586,57 @@ + } + } else if (UseAESIntrinsics) { + if (!FLAG_IS_DEFAULT(UseAESIntrinsics)) +- warning("AES intrinsics not available on this CPU"); ++ warning("AES intrinsics are not available on this CPU"); + FLAG_SET_DEFAULT(UseAESIntrinsics, false); + } + ++ // Adjust RTM (Restricted Transactional Memory) flags ++ if (!supports_rtm() && UseRTMLocking) { ++ // Can't continue because UseRTMLocking affects UseBiasedLocking flag ++ // setting during arguments processing. See use_biased_locking(). ++ // VM_Version_init() is executed after UseBiasedLocking is used ++ // in Thread::allocate(). ++ vm_exit_during_initialization("RTM instructions are not available on this CPU"); ++ } ++ ++#if INCLUDE_RTM_OPT ++ if (UseRTMLocking) { ++ if (!FLAG_IS_CMDLINE(UseRTMLocking)) { ++ // RTM locking should be used only for applications with ++ // high lock contention. For now we do not use it by default. ++ vm_exit_during_initialization("UseRTMLocking flag should be only set on command line"); ++ } ++ if (!is_power_of_2(RTMTotalCountIncrRate)) { ++ warning("RTMTotalCountIncrRate must be a power of 2, resetting it to 64"); ++ FLAG_SET_DEFAULT(RTMTotalCountIncrRate, 64); ++ } ++ if (RTMAbortRatio < 0 || RTMAbortRatio > 100) { ++ warning("RTMAbortRatio must be in the range 0 to 100, resetting it to 50"); ++ FLAG_SET_DEFAULT(RTMAbortRatio, 50); ++ } ++ } else { // !UseRTMLocking ++ if (UseRTMForStackLocks) { ++ if (!FLAG_IS_DEFAULT(UseRTMForStackLocks)) { ++ warning("UseRTMForStackLocks flag should be off when UseRTMLocking flag is off"); ++ } ++ FLAG_SET_DEFAULT(UseRTMForStackLocks, false); ++ } ++ if (UseRTMDeopt) { ++ FLAG_SET_DEFAULT(UseRTMDeopt, false); ++ } ++ if (PrintPreciseRTMLockingStatistics) { ++ FLAG_SET_DEFAULT(PrintPreciseRTMLockingStatistics, false); ++ } ++ } ++#else ++ if (UseRTMLocking) { ++ // Only C2 does RTM locking optimization. ++ // Can't continue because UseRTMLocking affects UseBiasedLocking flag ++ // setting during arguments processing. See use_biased_locking(). ++ vm_exit_during_initialization("RTM locking optimization is not supported in this VM"); ++ } ++#endif ++ + #ifdef COMPILER2 + if (UseFPUForSpilling) { + if (UseSSE < 2) { +@@ -538,14 +652,28 @@ + if (MaxVectorSize > 32) { + FLAG_SET_DEFAULT(MaxVectorSize, 32); + } +- if (MaxVectorSize > 16 && UseAVX == 0) { +- // Only supported with AVX+ ++ if (MaxVectorSize > 16 && (UseAVX == 0 || !os_supports_avx_vectors())) { ++ // 32 bytes vectors (in YMM) are only supported with AVX+ + FLAG_SET_DEFAULT(MaxVectorSize, 16); + } + if (UseSSE < 2) { +- // Only supported with SSE2+ ++ // Vectors (in XMM) are only supported with SSE2+ + FLAG_SET_DEFAULT(MaxVectorSize, 0); + } ++#ifdef ASSERT ++ if (supports_avx() && PrintMiscellaneous && Verbose && TraceNewVectors) { ++ tty->print_cr("State of YMM registers after signal handle:"); ++ int nreg = 2 LP64_ONLY(+2); ++ const char* ymm_name[4] = {"0", "7", "8", "15"}; ++ for (int i = 0; i < nreg; i++) { ++ tty->print("YMM%s:", ymm_name[i]); ++ for (int j = 7; j >=0; j--) { ++ tty->print(" %x", _cpuid_info.ymm_save[i*8 + j]); ++ } ++ tty->cr(); ++ } ++ } ++#endif + } + #endif + +@@ -600,13 +728,6 @@ + } + } + +- // Use count leading zeros count instruction if available. +- if (supports_lzcnt()) { +- if (FLAG_IS_DEFAULT(UseCountLeadingZerosInstruction)) { +- UseCountLeadingZerosInstruction = true; +- } +- } +- + // some defaults for AMD family 15h + if ( cpu_family() == 0x15 ) { + // On family 15h processors default is no sw prefetch +@@ -683,14 +804,35 @@ + } + } + } +-#if defined(COMPILER2) && defined(_ALLBSD_SOURCE) +- if (MaxVectorSize > 16) { +- // Limit vectors size to 16 bytes on BSD until it fixes +- // restoring upper 128bit of YMM registers on return +- // from signal handler. +- FLAG_SET_DEFAULT(MaxVectorSize, 16); ++ ++ // Use count leading zeros count instruction if available. ++ if (supports_lzcnt()) { ++ if (FLAG_IS_DEFAULT(UseCountLeadingZerosInstruction)) { ++ UseCountLeadingZerosInstruction = true; + } +-#endif // COMPILER2 ++ } else if (UseCountLeadingZerosInstruction) { ++ warning("lzcnt instruction is not available on this CPU"); ++ FLAG_SET_DEFAULT(UseCountLeadingZerosInstruction, false); ++ } ++ ++ if (supports_bmi1()) { ++ if (FLAG_IS_DEFAULT(UseBMI1Instructions)) { ++ UseBMI1Instructions = true; ++ } ++ } else if (UseBMI1Instructions) { ++ warning("BMI1 instructions are not available on this CPU"); ++ FLAG_SET_DEFAULT(UseBMI1Instructions, false); ++ } ++ ++ // Use count trailing zeros instruction if available ++ if (supports_bmi1()) { ++ if (FLAG_IS_DEFAULT(UseCountTrailingZerosInstruction)) { ++ UseCountTrailingZerosInstruction = UseBMI1Instructions; ++ } ++ } else if (UseCountTrailingZerosInstruction) { ++ warning("tzcnt instruction is not available on this CPU"); ++ FLAG_SET_DEFAULT(UseCountTrailingZerosInstruction, false); ++ } + + // Use population count instruction if available. + if (supports_popcnt()) { +@@ -783,13 +925,18 @@ + if (PrintMiscellaneous && Verbose) { + tty->print_cr("Logical CPUs per core: %u", + logical_processors_per_package()); +- tty->print("UseSSE=%d",UseSSE); ++ tty->print("UseSSE=%d", (int) UseSSE); + if (UseAVX > 0) { +- tty->print(" UseAVX=%d",UseAVX); ++ tty->print(" UseAVX=%d", (int) UseAVX); + } + if (UseAES) { + tty->print(" UseAES=1"); + } ++#ifdef COMPILER2 ++ if (MaxVectorSize > 0) { ++ tty->print(" MaxVectorSize=%d", (int) MaxVectorSize); ++ } ++#endif + tty->cr(); + tty->print("Allocation"); + if (AllocatePrefetchStyle <= 0 || UseSSE == 0 && !supports_3dnow_prefetch()) { +@@ -810,40 +957,61 @@ + } + } + if (AllocatePrefetchLines > 1) { +- tty->print_cr(" at distance %d, %d lines of %d bytes", AllocatePrefetchDistance, AllocatePrefetchLines, AllocatePrefetchStepSize); ++ tty->print_cr(" at distance %d, %d lines of %d bytes", (int) AllocatePrefetchDistance, (int) AllocatePrefetchLines, (int) AllocatePrefetchStepSize); + } else { +- tty->print_cr(" at distance %d, one line of %d bytes", AllocatePrefetchDistance, AllocatePrefetchStepSize); ++ tty->print_cr(" at distance %d, one line of %d bytes", (int) AllocatePrefetchDistance, (int) AllocatePrefetchStepSize); + } + } + + if (PrefetchCopyIntervalInBytes > 0) { +- tty->print_cr("PrefetchCopyIntervalInBytes %d", PrefetchCopyIntervalInBytes); ++ tty->print_cr("PrefetchCopyIntervalInBytes %d", (int) PrefetchCopyIntervalInBytes); + } + if (PrefetchScanIntervalInBytes > 0) { +- tty->print_cr("PrefetchScanIntervalInBytes %d", PrefetchScanIntervalInBytes); ++ tty->print_cr("PrefetchScanIntervalInBytes %d", (int) PrefetchScanIntervalInBytes); + } + if (PrefetchFieldsAhead > 0) { +- tty->print_cr("PrefetchFieldsAhead %d", PrefetchFieldsAhead); ++ tty->print_cr("PrefetchFieldsAhead %d", (int) PrefetchFieldsAhead); + } + if (ContendedPaddingWidth > 0) { +- tty->print_cr("ContendedPaddingWidth %d", ContendedPaddingWidth); ++ tty->print_cr("ContendedPaddingWidth %d", (int) ContendedPaddingWidth); + } + } + #endif // !PRODUCT + } + ++bool VM_Version::use_biased_locking() { ++#if INCLUDE_RTM_OPT ++ // RTM locking is most useful when there is high lock contention and ++ // low data contention. With high lock contention the lock is usually ++ // inflated and biased locking is not suitable for that case. ++ // RTM locking code requires that biased locking is off. ++ // Note: we can't switch off UseBiasedLocking in get_processor_features() ++ // because it is used by Thread::allocate() which is called before ++ // VM_Version::initialize(). ++ if (UseRTMLocking && UseBiasedLocking) { ++ if (FLAG_IS_DEFAULT(UseBiasedLocking)) { ++ FLAG_SET_DEFAULT(UseBiasedLocking, false); ++ } else { ++ warning("Biased locking is not supported with RTM locking; ignoring UseBiasedLocking flag." ); ++ UseBiasedLocking = false; ++ } ++ } ++#endif ++ return UseBiasedLocking; ++} ++ + void VM_Version::initialize() { + ResourceMark rm; + // Making this stub must be FIRST use of assembler + +- stub_blob = BufferBlob::create("getPsrInfo_stub", stub_size); ++ stub_blob = BufferBlob::create("get_cpu_info_stub", stub_size); + if (stub_blob == NULL) { +- vm_exit_during_initialization("Unable to allocate getPsrInfo_stub"); ++ vm_exit_during_initialization("Unable to allocate get_cpu_info_stub"); + } + CodeBuffer c(stub_blob); + VM_Version_StubGenerator g(&c); +- getPsrInfo_stub = CAST_TO_FN_PTR(getPsrInfo_stub_t, +- g.generate_getPsrInfo()); ++ get_cpu_info_stub = CAST_TO_FN_PTR(get_cpu_info_stub_t, ++ g.generate_get_cpu_info()); + + get_processor_features(); + } +--- ./hotspot/src/cpu/x86/vm/vm_version_x86.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/vm_version_x86.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -141,7 +141,8 @@ + struct { + uint32_t LahfSahf : 1, + CmpLegacy : 1, +- : 4, ++ : 3, ++ lzcnt_intel : 1, + lzcnt : 1, + sse4a : 1, + misalignsse : 1, +@@ -206,7 +207,9 @@ + : 2, + bmi2 : 1, + erms : 1, +- : 22; ++ : 1, ++ rtm : 1, ++ : 20; + } bits; + }; + +@@ -228,6 +231,9 @@ + // 0 if this instruction is not available + static const char* _features_str; + ++ static address _cpuinfo_segv_addr; // address of instruction which causes SEGV ++ static address _cpuinfo_cont_addr; // address of instruction after the one which causes SEGV ++ + enum { + CPU_CX8 = (1 << 0), // next bits are from cpuid 1 (EDX) + CPU_CMOV = (1 << 1), +@@ -251,7 +257,10 @@ + CPU_AVX2 = (1 << 18), + CPU_AES = (1 << 19), + CPU_ERMS = (1 << 20), // enhanced 'rep movsb/stosb' instructions +- CPU_CLMUL = (1 << 21) // carryless multiply for CRC ++ CPU_CLMUL = (1 << 21), // carryless multiply for CRC ++ CPU_BMI1 = (1 << 22), ++ CPU_BMI2 = (1 << 23), ++ CPU_RTM = (1 << 24) // Restricted Transactional Memory instructions + } cpuFeatureFlags; + + enum { +@@ -358,6 +367,9 @@ + // extended control register XCR0 (the XFEATURE_ENABLED_MASK register) + XemXcr0Eax xem_xcr0_eax; + uint32_t xem_xcr0_edx; // reserved ++ ++ // Space to save ymm registers after signal handle ++ int ymm_save[8*4]; // Save ymm0, ymm7, ymm8, ymm15 + }; + + // The actual cpuid info block +@@ -423,6 +435,8 @@ + if (_cpuid_info.sef_cpuid7_ebx.bits.avx2 != 0) + result |= CPU_AVX2; + } ++ if(_cpuid_info.sef_cpuid7_ebx.bits.bmi1 != 0) ++ result |= CPU_BMI1; + if (_cpuid_info.std_cpuid1_edx.bits.tsc != 0) + result |= CPU_TSC; + if (_cpuid_info.ext_cpuid7_edx.bits.tsc_invariance != 0) +@@ -433,6 +447,8 @@ + result |= CPU_ERMS; + if (_cpuid_info.std_cpuid1_ecx.bits.clmul != 0) + result |= CPU_CLMUL; ++ if (_cpuid_info.sef_cpuid7_ebx.bits.rtm != 0) ++ result |= CPU_RTM; + + // AMD features. + if (is_amd()) { +@@ -444,10 +460,32 @@ + if (_cpuid_info.ext_cpuid1_ecx.bits.sse4a != 0) + result |= CPU_SSE4A; + } ++ // Intel features. ++ if(is_intel()) { ++ if(_cpuid_info.sef_cpuid7_ebx.bits.bmi2 != 0) ++ result |= CPU_BMI2; ++ if(_cpuid_info.ext_cpuid1_ecx.bits.lzcnt_intel != 0) ++ result |= CPU_LZCNT; ++ } + + return result; + } + ++ static bool os_supports_avx_vectors() { ++ if (!supports_avx()) { ++ return false; ++ } ++ // Verify that OS save/restore all bits of AVX registers ++ // during signal processing. ++ int nreg = 2 LP64_ONLY(+2); ++ for (int i = 0; i < 8 * nreg; i++) { // 32 bytes per ymm register ++ if (_cpuid_info.ymm_save[i] != ymm_test_value()) { ++ return false; ++ } ++ } ++ return true; ++ } ++ + static void get_processor_features(); + + public: +@@ -464,10 +502,27 @@ + static ByteSize tpl_cpuidB1_offset() { return byte_offset_of(CpuidInfo, tpl_cpuidB1_eax); } + static ByteSize tpl_cpuidB2_offset() { return byte_offset_of(CpuidInfo, tpl_cpuidB2_eax); } + static ByteSize xem_xcr0_offset() { return byte_offset_of(CpuidInfo, xem_xcr0_eax); } ++ static ByteSize ymm_save_offset() { return byte_offset_of(CpuidInfo, ymm_save); } ++ ++ // The value used to check ymm register after signal handle ++ static int ymm_test_value() { return 0xCAFEBABE; } ++ ++ static void get_cpu_info_wrapper(); ++ static void set_cpuinfo_segv_addr(address pc) { _cpuinfo_segv_addr = pc; } ++ static bool is_cpuinfo_segv_addr(address pc) { return _cpuinfo_segv_addr == pc; } ++ static void set_cpuinfo_cont_addr(address pc) { _cpuinfo_cont_addr = pc; } ++ static address cpuinfo_cont_addr() { return _cpuinfo_cont_addr; } ++ ++ static void clean_cpuFeatures() { _cpuFeatures = 0; } ++ static void set_avx_cpuFeatures() { _cpuFeatures = (CPU_SSE | CPU_SSE2 | CPU_AVX); } ++ + + // Initialization + static void initialize(); + ++ // Override Abstract_VM_Version implementation ++ static bool use_biased_locking(); ++ + // Asserts + static void assert_is_initialized() { + assert(_cpuid_info.std_cpuid1_eax.bits.family != 0, "VM_Version not initialized"); +@@ -560,7 +615,9 @@ + static bool supports_aes() { return (_cpuFeatures & CPU_AES) != 0; } + static bool supports_erms() { return (_cpuFeatures & CPU_ERMS) != 0; } + static bool supports_clmul() { return (_cpuFeatures & CPU_CLMUL) != 0; } +- ++ static bool supports_rtm() { return (_cpuFeatures & CPU_RTM) != 0; } ++ static bool supports_bmi1() { return (_cpuFeatures & CPU_BMI1) != 0; } ++ static bool supports_bmi2() { return (_cpuFeatures & CPU_BMI2) != 0; } + // Intel features + static bool is_intel_family_core() { return is_intel() && + extended_cpu_family() == CPU_FAMILY_INTEL_CORE; } +--- ./hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -118,7 +118,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())); + } +@@ -199,7 +199,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())); + } +--- ./hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -35,6 +35,8 @@ + #include "opto/runtime.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // machine-dependent part of VtableStubs: create VtableStub of correct size and + // initialize its code + +--- ./hotspot/src/cpu/x86/vm/x86.ad Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/x86.ad Wed Jul 30 03:51:43 2014 -0700 +@@ -474,7 +474,125 @@ + + %} + ++ ++//----------SOURCE BLOCK------------------------------------------------------- ++// This is a block of C++ code which provides values, functions, and ++// definitions necessary in the rest of the architecture description ++ ++source_hpp %{ ++// Header information of the source block. ++// Method declarations/definitions which are used outside ++// the ad-scope can conveniently be defined here. ++// ++// To keep related declarations/definitions/uses close together, ++// we switch between source %{ }% and source_hpp %{ }% freely as needed. ++ ++class CallStubImpl { ++ ++ //-------------------------------------------------------------- ++ //---< Used for optimization in Compile::shorten_branches >--- ++ //-------------------------------------------------------------- ++ ++ public: ++ // Size of call trampoline stub. ++ static uint size_call_trampoline() { ++ return 0; // no call trampolines on this platform ++ } ++ ++ // number of relocations needed by a call trampoline stub ++ static uint reloc_call_trampoline() { ++ return 0; // no call trampolines on this platform ++ } ++}; ++ ++class HandlerImpl { ++ ++ public: ++ ++ static int emit_exception_handler(CodeBuffer &cbuf); ++ static int emit_deopt_handler(CodeBuffer& cbuf); ++ ++ static uint size_exception_handler() { ++ // NativeCall instruction size is the same as NativeJump. ++ // exception handler starts out as jump and can be patched to ++ // a call be deoptimization. (4932387) ++ // Note that this value is also credited (in output.cpp) to ++ // the size of the code section. ++ return NativeJump::instruction_size; ++ } ++ ++#ifdef _LP64 ++ static uint size_deopt_handler() { ++ // three 5 byte instructions ++ return 15; ++ } ++#else ++ static uint size_deopt_handler() { ++ // NativeCall instruction size is the same as NativeJump. ++ // exception handler starts out as jump and can be patched to ++ // a call be deoptimization. (4932387) ++ // Note that this value is also credited (in output.cpp) to ++ // the size of the code section. ++ return 5 + NativeJump::instruction_size; // pushl(); jmp; ++ } ++#endif ++}; ++ ++%} // end source_hpp ++ + source %{ ++ ++// Emit exception handler code. ++// Stuff framesize into a register and call a VM stub routine. ++int HandlerImpl::emit_exception_handler(CodeBuffer& cbuf) { ++ ++ // Note that the code buffer's insts_mark is always relative to insts. ++ // That's why we must use the macroassembler to generate a handler. ++ MacroAssembler _masm(&cbuf); ++ address base = __ start_a_stub(size_exception_handler()); ++ if (base == NULL) return 0; // CodeBuffer::expand failed ++ int offset = __ offset(); ++ __ jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); ++ assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); ++ __ end_a_stub(); ++ return offset; ++} ++ ++// Emit deopt handler code. ++int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf) { ++ ++ // Note that the code buffer's insts_mark is always relative to insts. ++ // That's why we must use the macroassembler to generate a handler. ++ MacroAssembler _masm(&cbuf); ++ address base = __ start_a_stub(size_deopt_handler()); ++ if (base == NULL) return 0; // CodeBuffer::expand failed ++ int offset = __ offset(); ++ ++#ifdef _LP64 ++ address the_pc = (address) __ pc(); ++ Label next; ++ // push a "the_pc" on the stack without destroying any registers ++ // as they all may be live. ++ ++ // push address of "next" ++ __ call(next, relocInfo::none); // reloc none is fine since it is a disp32 ++ __ bind(next); ++ // adjust it so it matches "the_pc" ++ __ subptr(Address(rsp, 0), __ offset() - offset); ++#else ++ InternalAddress here(__ pc()); ++ __ pushptr(here.addr()); ++#endif ++ ++ __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); ++ assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); ++ __ end_a_stub(); ++ return offset; ++} ++ ++ ++//============================================================================= ++ + // Float masks come from different places depending on platform. + #ifdef _LP64 + static address float_signmask() { return StubRoutines::x86::float_sign_mask(); } +@@ -581,6 +699,12 @@ + return !AlignVector; // can be changed by flag + } + ++// x86 AES instructions are compatible with SunJCE expanded ++// keys, hence we do not need to pass the original key to stubs ++const bool Matcher::pass_original_key_for_aes() { ++ return false; ++} ++ + // Helper methods for MachSpillCopyNode::implementation(). + static int vec_mov_helper(CodeBuffer *cbuf, bool do_size, int src_lo, int dst_lo, + int src_hi, int dst_hi, uint ireg, outputStream* st) { +--- ./hotspot/src/cpu/x86/vm/x86_32.ad Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/x86_32.ad Wed Jul 30 03:51:43 2014 -0700 +@@ -487,6 +487,11 @@ + return 0; // absolute addressing, no offset + } + ++bool MachConstantBaseNode::requires_postalloc_expand() const { return false; } ++void MachConstantBaseNode::postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_) { ++ ShouldNotReachHere(); ++} ++ + void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const { + // Empty encoding + } +@@ -507,14 +512,15 @@ + void MachPrologNode::format(PhaseRegAlloc* ra_, outputStream* st) const { + Compile* C = ra_->C; + +- int framesize = C->frame_slots() << LogBytesPerInt; ++ int framesize = C->frame_size_in_bytes(); ++ int bangsize = C->bang_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove wordSize for return addr which is already pushed. + framesize -= wordSize; + +- if (C->need_stack_bang(framesize)) { ++ if (C->need_stack_bang(bangsize)) { + framesize -= wordSize; +- st->print("# stack bang"); ++ st->print("# stack bang (%d bytes)", bangsize); + st->print("\n\t"); + st->print("PUSH EBP\t# Save EBP"); + if (framesize) { +@@ -558,9 +564,10 @@ + Compile* C = ra_->C; + MacroAssembler _masm(&cbuf); + +- int framesize = C->frame_slots() << LogBytesPerInt; +- +- __ verified_entry(framesize, C->need_stack_bang(framesize), C->in_24_bit_fp_mode()); ++ int framesize = C->frame_size_in_bytes(); ++ int bangsize = C->bang_size_in_bytes(); ++ ++ __ verified_entry(framesize, C->need_stack_bang(bangsize)?bangsize:0, C->in_24_bit_fp_mode()); + + C->set_frame_complete(cbuf.insts_size()); + +@@ -584,7 +591,7 @@ + #ifndef PRODUCT + void MachEpilogNode::format( PhaseRegAlloc *ra_, outputStream* st ) const { + Compile *C = ra_->C; +- int framesize = C->frame_slots() << LogBytesPerInt; ++ int framesize = C->frame_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove two words for return addr and rbp, + framesize -= 2*wordSize; +@@ -624,7 +631,7 @@ + masm.fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std())); + } + +- int framesize = C->frame_slots() << LogBytesPerInt; ++ int framesize = C->frame_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove two words for return addr and rbp, + framesize -= 2*wordSize; +@@ -658,7 +665,7 @@ + if (C->max_vector_size() > 16) size += 3; // vzeroupper + if (do_polling() && C->is_method_compilation()) size += 6; + +- int framesize = C->frame_slots() << LogBytesPerInt; ++ int framesize = C->frame_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove two words for return addr and rbp, + framesize -= 2*wordSize; +@@ -1292,59 +1299,6 @@ + + + //============================================================================= +-uint size_exception_handler() { +- // NativeCall instruction size is the same as NativeJump. +- // exception handler starts out as jump and can be patched to +- // a call be deoptimization. (4932387) +- // Note that this value is also credited (in output.cpp) to +- // the size of the code section. +- return NativeJump::instruction_size; +-} +- +-// Emit exception handler code. Stuff framesize into a register +-// and call a VM stub routine. +-int emit_exception_handler(CodeBuffer& cbuf) { +- +- // Note that the code buffer's insts_mark is always relative to insts. +- // That's why we must use the macroassembler to generate a handler. +- MacroAssembler _masm(&cbuf); +- address base = +- __ start_a_stub(size_exception_handler()); +- if (base == NULL) return 0; // CodeBuffer::expand failed +- int offset = __ offset(); +- __ jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); +- assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); +- __ end_a_stub(); +- return offset; +-} +- +-uint size_deopt_handler() { +- // NativeCall instruction size is the same as NativeJump. +- // exception handler starts out as jump and can be patched to +- // a call be deoptimization. (4932387) +- // Note that this value is also credited (in output.cpp) to +- // the size of the code section. +- return 5 + NativeJump::instruction_size; // pushl(); jmp; +-} +- +-// Emit deopt handler code. +-int emit_deopt_handler(CodeBuffer& cbuf) { +- +- // Note that the code buffer's insts_mark is always relative to insts. +- // That's why we must use the macroassembler to generate a handler. +- MacroAssembler _masm(&cbuf); +- address base = +- __ start_a_stub(size_exception_handler()); +- if (base == NULL) return 0; // CodeBuffer::expand failed +- int offset = __ offset(); +- InternalAddress here(__ pc()); +- __ pushptr(here.addr()); +- +- __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); +- assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); +- __ end_a_stub(); +- return offset; +-} + + int Matcher::regnum_to_fpu_offset(int regnum) { + return regnum - 32; // The FP registers are in the second chunk +@@ -1389,6 +1343,9 @@ + // No CMOVF/CMOVD with SSE/SSE2 + const int Matcher::float_cmove_cost() { return (UseSSE>=1) ? ConditionalMoveLimit : 0; } + ++// Does the CPU require late expand (see block.cpp for description of late expand)? ++const bool Matcher::require_postalloc_expand = false; ++ + // Should the Matcher clone shifts on addressing modes, expecting them to + // be subsumed into complex addressing expressions or compute them into + // registers? True for Intel but false for most RISCs +@@ -1534,19 +1491,6 @@ + return EBP_REG_mask(); + } + +-const RegMask Matcher::mathExactI_result_proj_mask() { +- return EAX_REG_mask(); +-} +- +-const RegMask Matcher::mathExactL_result_proj_mask() { +- ShouldNotReachHere(); +- return RegMask(); +-} +- +-const RegMask Matcher::mathExactI_flags_proj_mask() { +- return INT_FLAGS_mask(); +-} +- + // Returns true if the high 32 bits of the value is known to be zero. + bool is_operand_hi32_zero(Node* n) { + int opc = n->Opcode(); +@@ -2910,542 +2854,6 @@ + emit_d8 (cbuf,0 ); + %} + +- +- // Because the transitions from emitted code to the runtime +- // monitorenter/exit helper stubs are so slow it's critical that +- // we inline both the stack-locking fast-path and the inflated fast path. +- // +- // See also: cmpFastLock and cmpFastUnlock. +- // +- // What follows is a specialized inline transliteration of the code +- // in slow_enter() and slow_exit(). If we're concerned about I$ bloat +- // another option would be to emit TrySlowEnter and TrySlowExit methods +- // at startup-time. These methods would accept arguments as +- // (rax,=Obj, rbx=Self, rcx=box, rdx=Scratch) and return success-failure +- // indications in the icc.ZFlag. Fast_Lock and Fast_Unlock would simply +- // marshal the arguments and emit calls to TrySlowEnter and TrySlowExit. +- // In practice, however, the # of lock sites is bounded and is usually small. +- // Besides the call overhead, TrySlowEnter and TrySlowExit might suffer +- // if the processor uses simple bimodal branch predictors keyed by EIP +- // Since the helper routines would be called from multiple synchronization +- // sites. +- // +- // An even better approach would be write "MonitorEnter()" and "MonitorExit()" +- // in java - using j.u.c and unsafe - and just bind the lock and unlock sites +- // to those specialized methods. That'd give us a mostly platform-independent +- // implementation that the JITs could optimize and inline at their pleasure. +- // Done correctly, the only time we'd need to cross to native could would be +- // to park() or unpark() threads. We'd also need a few more unsafe operators +- // to (a) prevent compiler-JIT reordering of non-volatile accesses, and +- // (b) explicit barriers or fence operations. +- // +- // TODO: +- // +- // * Arrange for C2 to pass "Self" into Fast_Lock and Fast_Unlock in one of the registers (scr). +- // This avoids manifesting the Self pointer in the Fast_Lock and Fast_Unlock terminals. +- // Given TLAB allocation, Self is usually manifested in a register, so passing it into +- // the lock operators would typically be faster than reifying Self. +- // +- // * Ideally I'd define the primitives as: +- // fast_lock (nax Obj, nax box, EAX tmp, nax scr) where box, tmp and scr are KILLED. +- // fast_unlock (nax Obj, EAX box, nax tmp) where box and tmp are KILLED +- // Unfortunately ADLC bugs prevent us from expressing the ideal form. +- // Instead, we're stuck with a rather awkward and brittle register assignments below. +- // Furthermore the register assignments are overconstrained, possibly resulting in +- // sub-optimal code near the synchronization site. +- // +- // * Eliminate the sp-proximity tests and just use "== Self" tests instead. +- // Alternately, use a better sp-proximity test. +- // +- // * Currently ObjectMonitor._Owner can hold either an sp value or a (THREAD *) value. +- // Either one is sufficient to uniquely identify a thread. +- // TODO: eliminate use of sp in _owner and use get_thread(tr) instead. +- // +- // * Intrinsify notify() and notifyAll() for the common cases where the +- // object is locked by the calling thread but the waitlist is empty. +- // avoid the expensive JNI call to JVM_Notify() and JVM_NotifyAll(). +- // +- // * use jccb and jmpb instead of jcc and jmp to improve code density. +- // But beware of excessive branch density on AMD Opterons. +- // +- // * Both Fast_Lock and Fast_Unlock set the ICC.ZF to indicate success +- // or failure of the fast-path. If the fast-path fails then we pass +- // control to the slow-path, typically in C. In Fast_Lock and +- // Fast_Unlock we often branch to DONE_LABEL, just to find that C2 +- // will emit a conditional branch immediately after the node. +- // So we have branches to branches and lots of ICC.ZF games. +- // Instead, it might be better to have C2 pass a "FailureLabel" +- // into Fast_Lock and Fast_Unlock. In the case of success, control +- // will drop through the node. ICC.ZF is undefined at exit. +- // In the case of failure, the node will branch directly to the +- // FailureLabel +- +- +- // obj: object to lock +- // box: on-stack box address (displaced header location) - KILLED +- // rax,: tmp -- KILLED +- // scr: tmp -- KILLED +- enc_class Fast_Lock( eRegP obj, eRegP box, eAXRegI tmp, eRegP scr ) %{ +- +- Register objReg = as_Register($obj$$reg); +- Register boxReg = as_Register($box$$reg); +- Register tmpReg = as_Register($tmp$$reg); +- Register scrReg = as_Register($scr$$reg); +- +- // Ensure the register assignents are disjoint +- guarantee (objReg != boxReg, "") ; +- guarantee (objReg != tmpReg, "") ; +- guarantee (objReg != scrReg, "") ; +- guarantee (boxReg != tmpReg, "") ; +- guarantee (boxReg != scrReg, "") ; +- guarantee (tmpReg == as_Register(EAX_enc), "") ; +- +- MacroAssembler masm(&cbuf); +- +- if (_counters != NULL) { +- masm.atomic_incl(ExternalAddress((address) _counters->total_entry_count_addr())); +- } +- if (EmitSync & 1) { +- // set box->dhw = unused_mark (3) +- // Force all sync thru slow-path: slow_enter() and slow_exit() +- masm.movptr (Address(boxReg, 0), int32_t(markOopDesc::unused_mark())) ; +- masm.cmpptr (rsp, (int32_t)0) ; +- } else +- if (EmitSync & 2) { +- Label DONE_LABEL ; +- if (UseBiasedLocking) { +- // Note: tmpReg maps to the swap_reg argument and scrReg to the tmp_reg argument. +- masm.biased_locking_enter(boxReg, objReg, tmpReg, scrReg, false, DONE_LABEL, NULL, _counters); +- } +- +- masm.movptr(tmpReg, Address(objReg, 0)) ; // fetch markword +- masm.orptr (tmpReg, 0x1); +- masm.movptr(Address(boxReg, 0), tmpReg); // Anticipate successful CAS +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(boxReg, Address(objReg, 0)); // Updates tmpReg +- masm.jcc(Assembler::equal, DONE_LABEL); +- // Recursive locking +- masm.subptr(tmpReg, rsp); +- masm.andptr(tmpReg, (int32_t) 0xFFFFF003 ); +- masm.movptr(Address(boxReg, 0), tmpReg); +- masm.bind(DONE_LABEL) ; +- } else { +- // Possible cases that we'll encounter in fast_lock +- // ------------------------------------------------ +- // * Inflated +- // -- unlocked +- // -- Locked +- // = by self +- // = by other +- // * biased +- // -- by Self +- // -- by other +- // * neutral +- // * stack-locked +- // -- by self +- // = sp-proximity test hits +- // = sp-proximity test generates false-negative +- // -- by other +- // +- +- Label IsInflated, DONE_LABEL, PopDone ; +- +- // TODO: optimize away redundant LDs of obj->mark and improve the markword triage +- // order to reduce the number of conditional branches in the most common cases. +- // Beware -- there's a subtle invariant that fetch of the markword +- // at [FETCH], below, will never observe a biased encoding (*101b). +- // If this invariant is not held we risk exclusion (safety) failure. +- if (UseBiasedLocking && !UseOptoBiasInlining) { +- masm.biased_locking_enter(boxReg, objReg, tmpReg, scrReg, false, DONE_LABEL, NULL, _counters); +- } +- +- masm.movptr(tmpReg, Address(objReg, 0)) ; // [FETCH] +- masm.testptr(tmpReg, 0x02) ; // Inflated v (Stack-locked or neutral) +- masm.jccb (Assembler::notZero, IsInflated) ; +- +- // Attempt stack-locking ... +- masm.orptr (tmpReg, 0x1); +- masm.movptr(Address(boxReg, 0), tmpReg); // Anticipate successful CAS +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(boxReg, Address(objReg, 0)); // Updates tmpReg +- if (_counters != NULL) { +- masm.cond_inc32(Assembler::equal, +- ExternalAddress((address)_counters->fast_path_entry_count_addr())); +- } +- masm.jccb (Assembler::equal, DONE_LABEL); +- +- // Recursive locking +- masm.subptr(tmpReg, rsp); +- masm.andptr(tmpReg, 0xFFFFF003 ); +- masm.movptr(Address(boxReg, 0), tmpReg); +- if (_counters != NULL) { +- masm.cond_inc32(Assembler::equal, +- ExternalAddress((address)_counters->fast_path_entry_count_addr())); +- } +- masm.jmp (DONE_LABEL) ; +- +- masm.bind (IsInflated) ; +- +- // The object is inflated. +- // +- // TODO-FIXME: eliminate the ugly use of manifest constants: +- // Use markOopDesc::monitor_value instead of "2". +- // use markOop::unused_mark() instead of "3". +- // The tmpReg value is an objectMonitor reference ORed with +- // markOopDesc::monitor_value (2). We can either convert tmpReg to an +- // objectmonitor pointer by masking off the "2" bit or we can just +- // use tmpReg as an objectmonitor pointer but bias the objectmonitor +- // field offsets with "-2" to compensate for and annul the low-order tag bit. +- // +- // I use the latter as it avoids AGI stalls. +- // As such, we write "mov r, [tmpReg+OFFSETOF(Owner)-2]" +- // instead of "mov r, [tmpReg+OFFSETOF(Owner)]". +- // +- #define OFFSET_SKEWED(f) ((ObjectMonitor::f ## _offset_in_bytes())-2) +- +- // boxReg refers to the on-stack BasicLock in the current frame. +- // We'd like to write: +- // set box->_displaced_header = markOop::unused_mark(). Any non-0 value suffices. +- // This is convenient but results a ST-before-CAS penalty. The following CAS suffers +- // additional latency as we have another ST in the store buffer that must drain. +- +- if (EmitSync & 8192) { +- masm.movptr(Address(boxReg, 0), 3) ; // results in ST-before-CAS penalty +- masm.get_thread (scrReg) ; +- masm.movptr(boxReg, tmpReg); // consider: LEA box, [tmp-2] +- masm.movptr(tmpReg, NULL_WORD); // consider: xor vs mov +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; +- } else +- if ((EmitSync & 128) == 0) { // avoid ST-before-CAS +- masm.movptr(scrReg, boxReg) ; +- masm.movptr(boxReg, tmpReg); // consider: LEA box, [tmp-2] +- +- // Using a prefetchw helps avoid later RTS->RTO upgrades and cache probes +- if ((EmitSync & 2048) && VM_Version::supports_3dnow_prefetch() && os::is_MP()) { +- // prefetchw [eax + Offset(_owner)-2] +- masm.prefetchw(Address(rax, ObjectMonitor::owner_offset_in_bytes()-2)); +- } +- +- if ((EmitSync & 64) == 0) { +- // Optimistic form: consider XORL tmpReg,tmpReg +- masm.movptr(tmpReg, NULL_WORD) ; +- } else { +- // Can suffer RTS->RTO upgrades on shared or cold $ lines +- // Test-And-CAS instead of CAS +- masm.movptr(tmpReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; // rax, = m->_owner +- masm.testptr(tmpReg, tmpReg) ; // Locked ? +- masm.jccb (Assembler::notZero, DONE_LABEL) ; +- } +- +- // Appears unlocked - try to swing _owner from null to non-null. +- // Ideally, I'd manifest "Self" with get_thread and then attempt +- // to CAS the register containing Self into m->Owner. +- // But we don't have enough registers, so instead we can either try to CAS +- // rsp or the address of the box (in scr) into &m->owner. If the CAS succeeds +- // we later store "Self" into m->Owner. Transiently storing a stack address +- // (rsp or the address of the box) into m->owner is harmless. +- // Invariant: tmpReg == 0. tmpReg is EAX which is the implicit cmpxchg comparand. +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; +- masm.movptr(Address(scrReg, 0), 3) ; // box->_displaced_header = 3 +- masm.jccb (Assembler::notZero, DONE_LABEL) ; +- masm.get_thread (scrReg) ; // beware: clobbers ICCs +- masm.movptr(Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2), scrReg) ; +- masm.xorptr(boxReg, boxReg) ; // set icc.ZFlag = 1 to indicate success +- +- // If the CAS fails we can either retry or pass control to the slow-path. +- // We use the latter tactic. +- // Pass the CAS result in the icc.ZFlag into DONE_LABEL +- // If the CAS was successful ... +- // Self has acquired the lock +- // Invariant: m->_recursions should already be 0, so we don't need to explicitly set it. +- // Intentional fall-through into DONE_LABEL ... +- } else { +- masm.movptr(Address(boxReg, 0), 3) ; // results in ST-before-CAS penalty +- masm.movptr(boxReg, tmpReg) ; +- +- // Using a prefetchw helps avoid later RTS->RTO upgrades and cache probes +- if ((EmitSync & 2048) && VM_Version::supports_3dnow_prefetch() && os::is_MP()) { +- // prefetchw [eax + Offset(_owner)-2] +- masm.prefetchw(Address(rax, ObjectMonitor::owner_offset_in_bytes()-2)); +- } +- +- if ((EmitSync & 64) == 0) { +- // Optimistic form +- masm.xorptr (tmpReg, tmpReg) ; +- } else { +- // Can suffer RTS->RTO upgrades on shared or cold $ lines +- masm.movptr(tmpReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; // rax, = m->_owner +- masm.testptr(tmpReg, tmpReg) ; // Locked ? +- masm.jccb (Assembler::notZero, DONE_LABEL) ; +- } +- +- // Appears unlocked - try to swing _owner from null to non-null. +- // Use either "Self" (in scr) or rsp as thread identity in _owner. +- // Invariant: tmpReg == 0. tmpReg is EAX which is the implicit cmpxchg comparand. +- masm.get_thread (scrReg) ; +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(scrReg, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; +- +- // If the CAS fails we can either retry or pass control to the slow-path. +- // We use the latter tactic. +- // Pass the CAS result in the icc.ZFlag into DONE_LABEL +- // If the CAS was successful ... +- // Self has acquired the lock +- // Invariant: m->_recursions should already be 0, so we don't need to explicitly set it. +- // Intentional fall-through into DONE_LABEL ... +- } +- +- // DONE_LABEL is a hot target - we'd really like to place it at the +- // start of cache line by padding with NOPs. +- // See the AMD and Intel software optimization manuals for the +- // most efficient "long" NOP encodings. +- // Unfortunately none of our alignment mechanisms suffice. +- masm.bind(DONE_LABEL); +- +- // Avoid branch-to-branch on AMD processors +- // This appears to be superstition. +- if (EmitSync & 32) masm.nop() ; +- +- +- // At DONE_LABEL the icc ZFlag is set as follows ... +- // Fast_Unlock uses the same protocol. +- // ZFlag == 1 -> Success +- // ZFlag == 0 -> Failure - force control through the slow-path +- } +- %} +- +- // obj: object to unlock +- // box: box address (displaced header location), killed. Must be EAX. +- // rbx,: killed tmp; cannot be obj nor box. +- // +- // Some commentary on balanced locking: +- // +- // Fast_Lock and Fast_Unlock are emitted only for provably balanced lock sites. +- // Methods that don't have provably balanced locking are forced to run in the +- // interpreter - such methods won't be compiled to use fast_lock and fast_unlock. +- // The interpreter provides two properties: +- // I1: At return-time the interpreter automatically and quietly unlocks any +- // objects acquired the current activation (frame). Recall that the +- // interpreter maintains an on-stack list of locks currently held by +- // a frame. +- // I2: If a method attempts to unlock an object that is not held by the +- // the frame the interpreter throws IMSX. +- // +- // Lets say A(), which has provably balanced locking, acquires O and then calls B(). +- // B() doesn't have provably balanced locking so it runs in the interpreter. +- // Control returns to A() and A() unlocks O. By I1 and I2, above, we know that O +- // is still locked by A(). +- // +- // The only other source of unbalanced locking would be JNI. The "Java Native Interface: +- // Programmer's Guide and Specification" claims that an object locked by jni_monitorenter +- // should not be unlocked by "normal" java-level locking and vice-versa. The specification +- // doesn't specify what will occur if a program engages in such mixed-mode locking, however. +- +- enc_class Fast_Unlock( nabxRegP obj, eAXRegP box, eRegP tmp) %{ +- +- Register objReg = as_Register($obj$$reg); +- Register boxReg = as_Register($box$$reg); +- Register tmpReg = as_Register($tmp$$reg); +- +- guarantee (objReg != boxReg, "") ; +- guarantee (objReg != tmpReg, "") ; +- guarantee (boxReg != tmpReg, "") ; +- guarantee (boxReg == as_Register(EAX_enc), "") ; +- MacroAssembler masm(&cbuf); +- +- if (EmitSync & 4) { +- // Disable - inhibit all inlining. Force control through the slow-path +- masm.cmpptr (rsp, 0) ; +- } else +- if (EmitSync & 8) { +- Label DONE_LABEL ; +- if (UseBiasedLocking) { +- masm.biased_locking_exit(objReg, tmpReg, DONE_LABEL); +- } +- // classic stack-locking code ... +- masm.movptr(tmpReg, Address(boxReg, 0)) ; +- masm.testptr(tmpReg, tmpReg) ; +- masm.jcc (Assembler::zero, DONE_LABEL) ; +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses EAX which is box +- masm.bind(DONE_LABEL); +- } else { +- Label DONE_LABEL, Stacked, CheckSucc, Inflated ; +- +- // Critically, the biased locking test must have precedence over +- // and appear before the (box->dhw == 0) recursive stack-lock test. +- if (UseBiasedLocking && !UseOptoBiasInlining) { +- masm.biased_locking_exit(objReg, tmpReg, DONE_LABEL); +- } +- +- masm.cmpptr(Address(boxReg, 0), 0) ; // Examine the displaced header +- masm.movptr(tmpReg, Address(objReg, 0)) ; // Examine the object's markword +- masm.jccb (Assembler::zero, DONE_LABEL) ; // 0 indicates recursive stack-lock +- +- masm.testptr(tmpReg, 0x02) ; // Inflated? +- masm.jccb (Assembler::zero, Stacked) ; +- +- masm.bind (Inflated) ; +- // It's inflated. +- // Despite our balanced locking property we still check that m->_owner == Self +- // as java routines or native JNI code called by this thread might +- // have released the lock. +- // Refer to the comments in synchronizer.cpp for how we might encode extra +- // state in _succ so we can avoid fetching EntryList|cxq. +- // +- // I'd like to add more cases in fast_lock() and fast_unlock() -- +- // such as recursive enter and exit -- but we have to be wary of +- // I$ bloat, T$ effects and BP$ effects. +- // +- // If there's no contention try a 1-0 exit. That is, exit without +- // a costly MEMBAR or CAS. See synchronizer.cpp for details on how +- // we detect and recover from the race that the 1-0 exit admits. +- // +- // Conceptually Fast_Unlock() must execute a STST|LDST "release" barrier +- // before it STs null into _owner, releasing the lock. Updates +- // to data protected by the critical section must be visible before +- // we drop the lock (and thus before any other thread could acquire +- // the lock and observe the fields protected by the lock). +- // IA32's memory-model is SPO, so STs are ordered with respect to +- // each other and there's no need for an explicit barrier (fence). +- // See also http://gee.cs.oswego.edu/dl/jmm/cookbook.html. +- +- masm.get_thread (boxReg) ; +- if ((EmitSync & 4096) && VM_Version::supports_3dnow_prefetch() && os::is_MP()) { +- // prefetchw [ebx + Offset(_owner)-2] +- masm.prefetchw(Address(rbx, ObjectMonitor::owner_offset_in_bytes()-2)); +- } +- +- // Note that we could employ various encoding schemes to reduce +- // the number of loads below (currently 4) to just 2 or 3. +- // Refer to the comments in synchronizer.cpp. +- // In practice the chain of fetches doesn't seem to impact performance, however. +- if ((EmitSync & 65536) == 0 && (EmitSync & 256)) { +- // Attempt to reduce branch density - AMD's branch predictor. +- masm.xorptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; +- masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::recursions_offset_in_bytes()-2)) ; +- masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)) ; +- masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)) ; +- masm.jccb (Assembler::notZero, DONE_LABEL) ; +- masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD) ; +- masm.jmpb (DONE_LABEL) ; +- } else { +- masm.xorptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; +- masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::recursions_offset_in_bytes()-2)) ; +- masm.jccb (Assembler::notZero, DONE_LABEL) ; +- masm.movptr(boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)) ; +- masm.orptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)) ; +- masm.jccb (Assembler::notZero, CheckSucc) ; +- masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD) ; +- masm.jmpb (DONE_LABEL) ; +- } +- +- // The Following code fragment (EmitSync & 65536) improves the performance of +- // contended applications and contended synchronization microbenchmarks. +- // Unfortunately the emission of the code - even though not executed - causes regressions +- // in scimark and jetstream, evidently because of $ effects. Replacing the code +- // with an equal number of never-executed NOPs results in the same regression. +- // We leave it off by default. +- +- if ((EmitSync & 65536) != 0) { +- Label LSuccess, LGoSlowPath ; +- +- masm.bind (CheckSucc) ; +- +- // Optional pre-test ... it's safe to elide this +- if ((EmitSync & 16) == 0) { +- masm.cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), 0) ; +- masm.jccb (Assembler::zero, LGoSlowPath) ; +- } +- +- // We have a classic Dekker-style idiom: +- // ST m->_owner = 0 ; MEMBAR; LD m->_succ +- // There are a number of ways to implement the barrier: +- // (1) lock:andl &m->_owner, 0 +- // is fast, but mask doesn't currently support the "ANDL M,IMM32" form. +- // LOCK: ANDL [ebx+Offset(_Owner)-2], 0 +- // Encodes as 81 31 OFF32 IMM32 or 83 63 OFF8 IMM8 +- // (2) If supported, an explicit MFENCE is appealing. +- // In older IA32 processors MFENCE is slower than lock:add or xchg +- // particularly if the write-buffer is full as might be the case if +- // if stores closely precede the fence or fence-equivalent instruction. +- // In more modern implementations MFENCE appears faster, however. +- // (3) In lieu of an explicit fence, use lock:addl to the top-of-stack +- // The $lines underlying the top-of-stack should be in M-state. +- // The locked add instruction is serializing, of course. +- // (4) Use xchg, which is serializing +- // mov boxReg, 0; xchgl boxReg, [tmpReg + Offset(_owner)-2] also works +- // (5) ST m->_owner = 0 and then execute lock:orl &m->_succ, 0. +- // The integer condition codes will tell us if succ was 0. +- // Since _succ and _owner should reside in the same $line and +- // we just stored into _owner, it's likely that the $line +- // remains in M-state for the lock:orl. +- // +- // We currently use (3), although it's likely that switching to (2) +- // is correct for the future. +- +- masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), NULL_WORD) ; +- if (os::is_MP()) { +- if (VM_Version::supports_sse2() && 1 == FenceInstruction) { +- masm.mfence(); +- } else { +- masm.lock () ; masm.addptr(Address(rsp, 0), 0) ; +- } +- } +- // Ratify _succ remains non-null +- masm.cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), 0) ; +- masm.jccb (Assembler::notZero, LSuccess) ; +- +- masm.xorptr(boxReg, boxReg) ; // box is really EAX +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(rsp, Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); +- masm.jccb (Assembler::notEqual, LSuccess) ; +- // Since we're low on registers we installed rsp as a placeholding in _owner. +- // Now install Self over rsp. This is safe as we're transitioning from +- // non-null to non=null +- masm.get_thread (boxReg) ; +- masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), boxReg) ; +- // Intentional fall-through into LGoSlowPath ... +- +- masm.bind (LGoSlowPath) ; +- masm.orptr(boxReg, 1) ; // set ICC.ZF=0 to indicate failure +- masm.jmpb (DONE_LABEL) ; +- +- masm.bind (LSuccess) ; +- masm.xorptr(boxReg, boxReg) ; // set ICC.ZF=1 to indicate success +- masm.jmpb (DONE_LABEL) ; +- } +- +- masm.bind (Stacked) ; +- // It's not inflated and it's not recursively stack-locked and it's not biased. +- // It must be stack-locked. +- // Try to reset the header to displaced header. +- // The "box" value on the stack is stable, so we can reload +- // and be assured we observe the same value as above. +- masm.movptr(tmpReg, Address(boxReg, 0)) ; +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses EAX which is box +- // Intention fall-thru into DONE_LABEL +- +- +- // DONE_LABEL is a hot target - we'd really like to place it at the +- // start of cache line by padding with NOPs. +- // See the AMD and Intel software optimization manuals for the +- // most efficient "long" NOP encodings. +- // Unfortunately none of our alignment mechanisms suffice. +- if ((EmitSync & 65536) == 0) { +- masm.bind (CheckSucc) ; +- } +- masm.bind(DONE_LABEL); +- +- // Avoid branch to branch on AMD processors +- if (EmitSync & 32768) { masm.nop() ; } +- } +- %} +- +- + enc_class enc_pop_rdx() %{ + emit_opcode(cbuf,0x5A); + %} +@@ -3768,7 +3176,7 @@ + // automatically biased by the preserve_stack_slots field above. + c_calling_convention %{ + // This is obviously always outgoing +- (void) SharedRuntime::c_calling_convention(sig_bt, regs, length); ++ (void) SharedRuntime::c_calling_convention(sig_bt, regs, /*regs2=*/NULL, length); + %} + + // Location of C & interpreter return values +@@ -5704,6 +5112,19 @@ + %} + + instruct countTrailingZerosI(rRegI dst, rRegI src, eFlagsReg cr) %{ ++ predicate(UseCountTrailingZerosInstruction); ++ match(Set dst (CountTrailingZerosI src)); ++ effect(KILL cr); ++ ++ format %{ "TZCNT $dst, $src\t# count trailing zeros (int)" %} ++ ins_encode %{ ++ __ tzcntl($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct countTrailingZerosI_bsf(rRegI dst, rRegI src, eFlagsReg cr) %{ ++ predicate(!UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosI src)); + effect(KILL cr); + +@@ -5723,6 +5144,30 @@ + %} + + instruct countTrailingZerosL(rRegI dst, eRegL src, eFlagsReg cr) %{ ++ predicate(UseCountTrailingZerosInstruction); ++ match(Set dst (CountTrailingZerosL src)); ++ effect(TEMP dst, KILL cr); ++ ++ format %{ "TZCNT $dst, $src.lo\t# count trailing zeros (long) \n\t" ++ "JNC done\n\t" ++ "TZCNT $dst, $src.hi\n\t" ++ "ADD $dst, 32\n" ++ "done:" %} ++ ins_encode %{ ++ Register Rdst = $dst$$Register; ++ Register Rsrc = $src$$Register; ++ Label done; ++ __ tzcntl(Rdst, Rsrc); ++ __ jccb(Assembler::carryClear, done); ++ __ tzcntl(Rdst, HIGH_FROM_LOW(Rsrc)); ++ __ addl(Rdst, BitsPerInt); ++ __ bind(done); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct countTrailingZerosL_bsf(rRegI dst, eRegL src, eFlagsReg cr) %{ ++ predicate(!UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosL src)); + effect(TEMP dst, KILL cr); + +@@ -7099,6 +6544,7 @@ + + instruct membar_acquire() %{ + match(MemBarAcquire); ++ match(LoadFence); + ins_cost(400); + + size(0); +@@ -7119,6 +6565,7 @@ + + instruct membar_release() %{ + match(MemBarRelease); ++ match(StoreFence); + ins_cost(400); + + size(0); +@@ -7535,44 +6982,6 @@ + //----------Arithmetic Instructions-------------------------------------------- + //----------Addition Instructions---------------------------------------------- + +-instruct addExactI_eReg(eAXRegI dst, rRegI src, eFlagsReg cr) +-%{ +- match(AddExactI dst src); +- effect(DEF cr); +- +- format %{ "ADD $dst, $src\t# addExact int" %} +- ins_encode %{ +- __ addl($dst$$Register, $src$$Register); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct addExactI_eReg_imm(eAXRegI dst, immI src, eFlagsReg cr) +-%{ +- match(AddExactI dst src); +- effect(DEF cr); +- +- format %{ "ADD $dst, $src\t# addExact int" %} +- ins_encode %{ +- __ addl($dst$$Register, $src$$constant); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct addExactI_eReg_mem(eAXRegI dst, memory src, eFlagsReg cr) +-%{ +- match(AddExactI dst (LoadI src)); +- effect(DEF cr); +- +- ins_cost(125); +- format %{ "ADD $dst,$src\t# addExact int" %} +- ins_encode %{ +- __ addl($dst$$Register, $src$$Address); +- %} +- ins_pipe( ialu_reg_mem ); +-%} +- +- + // Integer Addition Instructions + instruct addI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{ + match(Set dst (AddI dst src)); +@@ -7882,43 +7291,6 @@ + + //----------Subtraction Instructions------------------------------------------- + +-instruct subExactI_eReg(eAXRegI dst, rRegI src, eFlagsReg cr) +-%{ +- match(SubExactI dst src); +- effect(DEF cr); +- +- format %{ "SUB $dst, $src\t# subExact int" %} +- ins_encode %{ +- __ subl($dst$$Register, $src$$Register); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct subExactI_eReg_imm(eAXRegI dst, immI src, eFlagsReg cr) +-%{ +- match(SubExactI dst src); +- effect(DEF cr); +- +- format %{ "SUB $dst, $src\t# subExact int" %} +- ins_encode %{ +- __ subl($dst$$Register, $src$$constant); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct subExactI_eReg_mem(eAXRegI dst, memory src, eFlagsReg cr) +-%{ +- match(SubExactI dst (LoadI src)); +- effect(DEF cr); +- +- ins_cost(125); +- format %{ "SUB $dst,$src\t# subExact int" %} +- ins_encode %{ +- __ subl($dst$$Register, $src$$Address); +- %} +- ins_pipe( ialu_reg_mem ); +-%} +- + // Integer Subtraction Instructions + instruct subI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{ + match(Set dst (SubI dst src)); +@@ -7987,17 +7359,6 @@ + ins_pipe( ialu_reg ); + %} + +-instruct negExactI_eReg(eAXRegI dst, eFlagsReg cr) %{ +- match(NegExactI dst); +- effect(DEF cr); +- +- format %{ "NEG $dst\t# negExact int"%} +- ins_encode %{ +- __ negl($dst$$Register); +- %} +- ins_pipe(ialu_reg); +-%} +- + //----------Multiplication/Division Instructions------------------------------- + // Integer Multiplication Instructions + // Multiply Register +@@ -8209,46 +7570,6 @@ + ins_pipe( pipe_slow ); + %} + +-instruct mulExactI_eReg(eAXRegI dst, rRegI src, eFlagsReg cr) +-%{ +- match(MulExactI dst src); +- effect(DEF cr); +- +- ins_cost(300); +- format %{ "IMUL $dst, $src\t# mulExact int" %} +- ins_encode %{ +- __ imull($dst$$Register, $src$$Register); +- %} +- ins_pipe(ialu_reg_reg_alu0); +-%} +- +-instruct mulExactI_eReg_imm(eAXRegI dst, rRegI src, immI imm, eFlagsReg cr) +-%{ +- match(MulExactI src imm); +- effect(DEF cr); +- +- ins_cost(300); +- format %{ "IMUL $dst, $src, $imm\t# mulExact int" %} +- ins_encode %{ +- __ imull($dst$$Register, $src$$Register, $imm$$constant); +- %} +- ins_pipe(ialu_reg_reg_alu0); +-%} +- +-instruct mulExactI_eReg_mem(eAXRegI dst, memory src, eFlagsReg cr) +-%{ +- match(MulExactI dst (LoadI src)); +- effect(DEF cr); +- +- ins_cost(350); +- format %{ "IMUL $dst, $src\t# mulExact int" %} +- ins_encode %{ +- __ imull($dst$$Register, $src$$Address); +- %} +- ins_pipe(ialu_reg_mem_alu0); +-%} +- +- + // Integer DIV with Register + instruct divI_eReg(eAXRegI rax, eDXRegI rdx, eCXRegI div, eFlagsReg cr) %{ + match(Set rax (DivI rax div)); +@@ -8692,6 +8013,123 @@ + ins_pipe( ialu_mem_imm ); + %} + ++// BMI1 instructions ++instruct andnI_rReg_rReg_rReg(rRegI dst, rRegI src1, rRegI src2, immI_M1 minus_1, eFlagsReg cr) %{ ++ match(Set dst (AndI (XorI src1 minus_1) src2)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "ANDNL $dst, $src1, $src2" %} ++ ++ ins_encode %{ ++ __ andnl($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct andnI_rReg_rReg_mem(rRegI dst, rRegI src1, memory src2, immI_M1 minus_1, eFlagsReg cr) %{ ++ match(Set dst (AndI (XorI src1 minus_1) (LoadI src2) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "ANDNL $dst, $src1, $src2" %} ++ ++ ins_encode %{ ++ __ andnl($dst$$Register, $src1$$Register, $src2$$Address); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsiI_rReg_rReg(rRegI dst, rRegI src, immI0 imm_zero, eFlagsReg cr) %{ ++ match(Set dst (AndI (SubI imm_zero src) src)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "BLSIL $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsil($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsiI_rReg_mem(rRegI dst, memory src, immI0 imm_zero, eFlagsReg cr) %{ ++ match(Set dst (AndI (SubI imm_zero (LoadI src) ) (LoadI src) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "BLSIL $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsil($dst$$Register, $src$$Address); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsmskI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, eFlagsReg cr) ++%{ ++ match(Set dst (XorI (AddI src minus_1) src)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "BLSMSKL $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsmskl($dst$$Register, $src$$Register); ++ %} ++ ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsmskI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, eFlagsReg cr) ++%{ ++ match(Set dst (XorI (AddI (LoadI src) minus_1) (LoadI src) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "BLSMSKL $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsmskl($dst$$Register, $src$$Address); ++ %} ++ ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsrI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, eFlagsReg cr) ++%{ ++ match(Set dst (AndI (AddI src minus_1) src) ); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "BLSRL $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsrl($dst$$Register, $src$$Register); ++ %} ++ ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsrI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, eFlagsReg cr) ++%{ ++ match(Set dst (AndI (AddI (LoadI src) minus_1) (LoadI src) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "BLSRL $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsrl($dst$$Register, $src$$Address); ++ %} ++ ++ ins_pipe(ialu_reg_mem); ++%} ++ + // Or Instructions + // Or Register with Register + instruct orI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{ +@@ -9114,6 +8552,91 @@ + instruct cadd_cmpLTMask_mem(ncxRegI p, ncxRegI q, memory y, eCXRegI tmp, eFlagsReg cr) %{ + match(Set p (AddI (AndI (CmpLTMask p q) (LoadI y)) (SubI p q))); + */ ++//----------Overflow Math Instructions----------------------------------------- ++ ++instruct overflowAddI_eReg(eFlagsReg cr, eAXRegI op1, rRegI op2) ++%{ ++ match(Set cr (OverflowAddI op1 op2)); ++ effect(DEF cr, USE_KILL op1, USE op2); ++ ++ format %{ "ADD $op1, $op2\t# overflow check int" %} ++ ++ ins_encode %{ ++ __ addl($op1$$Register, $op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowAddI_rReg_imm(eFlagsReg cr, eAXRegI op1, immI op2) ++%{ ++ match(Set cr (OverflowAddI op1 op2)); ++ effect(DEF cr, USE_KILL op1, USE op2); ++ ++ format %{ "ADD $op1, $op2\t# overflow check int" %} ++ ++ ins_encode %{ ++ __ addl($op1$$Register, $op2$$constant); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowSubI_rReg(eFlagsReg cr, rRegI op1, rRegI op2) ++%{ ++ match(Set cr (OverflowSubI op1 op2)); ++ ++ format %{ "CMP $op1, $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ cmpl($op1$$Register, $op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowSubI_rReg_imm(eFlagsReg cr, rRegI op1, immI op2) ++%{ ++ match(Set cr (OverflowSubI op1 op2)); ++ ++ format %{ "CMP $op1, $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ cmpl($op1$$Register, $op2$$constant); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowNegI_rReg(eFlagsReg cr, immI0 zero, eAXRegI op2) ++%{ ++ match(Set cr (OverflowSubI zero op2)); ++ effect(DEF cr, USE_KILL op2); ++ ++ format %{ "NEG $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ negl($op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowMulI_rReg(eFlagsReg cr, eAXRegI op1, rRegI op2) ++%{ ++ match(Set cr (OverflowMulI op1 op2)); ++ effect(DEF cr, USE_KILL op1, USE op2); ++ ++ format %{ "IMUL $op1, $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ imull($op1$$Register, $op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg_alu0); ++%} ++ ++instruct overflowMulI_rReg_imm(eFlagsReg cr, rRegI op1, immI op2, rRegI tmp) ++%{ ++ match(Set cr (OverflowMulI op1 op2)); ++ effect(DEF cr, TEMP tmp, USE op1, USE op2); ++ ++ format %{ "IMUL $tmp, $op1, $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ imull($tmp$$Register, $op1$$Register, $op2$$constant); ++ %} ++ ins_pipe(ialu_reg_reg_alu0); ++%} + + //----------Long Instructions------------------------------------------------ + // Add Long Register with Register +@@ -9229,6 +8752,210 @@ + ins_pipe( ialu_reg_long_mem ); + %} + ++// BMI1 instructions ++instruct andnL_eReg_eReg_eReg(eRegL dst, eRegL src1, eRegL src2, immL_M1 minus_1, eFlagsReg cr) %{ ++ match(Set dst (AndL (XorL src1 minus_1) src2)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr, TEMP dst); ++ ++ format %{ "ANDNL $dst.lo, $src1.lo, $src2.lo\n\t" ++ "ANDNL $dst.hi, $src1.hi, $src2.hi" ++ %} ++ ++ ins_encode %{ ++ Register Rdst = $dst$$Register; ++ Register Rsrc1 = $src1$$Register; ++ Register Rsrc2 = $src2$$Register; ++ __ andnl(Rdst, Rsrc1, Rsrc2); ++ __ andnl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc1), HIGH_FROM_LOW(Rsrc2)); ++ %} ++ ins_pipe(ialu_reg_reg_long); ++%} ++ ++instruct andnL_eReg_eReg_mem(eRegL dst, eRegL src1, memory src2, immL_M1 minus_1, eFlagsReg cr) %{ ++ match(Set dst (AndL (XorL src1 minus_1) (LoadL src2) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr, TEMP dst); ++ ++ ins_cost(125); ++ format %{ "ANDNL $dst.lo, $src1.lo, $src2\n\t" ++ "ANDNL $dst.hi, $src1.hi, $src2+4" ++ %} ++ ++ ins_encode %{ ++ Register Rdst = $dst$$Register; ++ Register Rsrc1 = $src1$$Register; ++ Address src2_hi = Address::make_raw($src2$$base, $src2$$index, $src2$$scale, $src2$$disp + 4, relocInfo::none); ++ ++ __ andnl(Rdst, Rsrc1, $src2$$Address); ++ __ andnl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc1), src2_hi); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsiL_eReg_eReg(eRegL dst, eRegL src, immL0 imm_zero, eFlagsReg cr) %{ ++ match(Set dst (AndL (SubL imm_zero src) src)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr, TEMP dst); ++ ++ format %{ "MOVL $dst.hi, 0\n\t" ++ "BLSIL $dst.lo, $src.lo\n\t" ++ "JNZ done\n\t" ++ "BLSIL $dst.hi, $src.hi\n" ++ "done:" ++ %} ++ ++ ins_encode %{ ++ Label done; ++ Register Rdst = $dst$$Register; ++ Register Rsrc = $src$$Register; ++ __ movl(HIGH_FROM_LOW(Rdst), 0); ++ __ blsil(Rdst, Rsrc); ++ __ jccb(Assembler::notZero, done); ++ __ blsil(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc)); ++ __ bind(done); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsiL_eReg_mem(eRegL dst, memory src, immL0 imm_zero, eFlagsReg cr) %{ ++ match(Set dst (AndL (SubL imm_zero (LoadL src) ) (LoadL src) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr, TEMP dst); ++ ++ ins_cost(125); ++ format %{ "MOVL $dst.hi, 0\n\t" ++ "BLSIL $dst.lo, $src\n\t" ++ "JNZ done\n\t" ++ "BLSIL $dst.hi, $src+4\n" ++ "done:" ++ %} ++ ++ ins_encode %{ ++ Label done; ++ Register Rdst = $dst$$Register; ++ Address src_hi = Address::make_raw($src$$base, $src$$index, $src$$scale, $src$$disp + 4, relocInfo::none); ++ ++ __ movl(HIGH_FROM_LOW(Rdst), 0); ++ __ blsil(Rdst, $src$$Address); ++ __ jccb(Assembler::notZero, done); ++ __ blsil(HIGH_FROM_LOW(Rdst), src_hi); ++ __ bind(done); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsmskL_eReg_eReg(eRegL dst, eRegL src, immL_M1 minus_1, eFlagsReg cr) ++%{ ++ match(Set dst (XorL (AddL src minus_1) src)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr, TEMP dst); ++ ++ format %{ "MOVL $dst.hi, 0\n\t" ++ "BLSMSKL $dst.lo, $src.lo\n\t" ++ "JNC done\n\t" ++ "BLSMSKL $dst.hi, $src.hi\n" ++ "done:" ++ %} ++ ++ ins_encode %{ ++ Label done; ++ Register Rdst = $dst$$Register; ++ Register Rsrc = $src$$Register; ++ __ movl(HIGH_FROM_LOW(Rdst), 0); ++ __ blsmskl(Rdst, Rsrc); ++ __ jccb(Assembler::carryClear, done); ++ __ blsmskl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc)); ++ __ bind(done); ++ %} ++ ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsmskL_eReg_mem(eRegL dst, memory src, immL_M1 minus_1, eFlagsReg cr) ++%{ ++ match(Set dst (XorL (AddL (LoadL src) minus_1) (LoadL src) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr, TEMP dst); ++ ++ ins_cost(125); ++ format %{ "MOVL $dst.hi, 0\n\t" ++ "BLSMSKL $dst.lo, $src\n\t" ++ "JNC done\n\t" ++ "BLSMSKL $dst.hi, $src+4\n" ++ "done:" ++ %} ++ ++ ins_encode %{ ++ Label done; ++ Register Rdst = $dst$$Register; ++ Address src_hi = Address::make_raw($src$$base, $src$$index, $src$$scale, $src$$disp + 4, relocInfo::none); ++ ++ __ movl(HIGH_FROM_LOW(Rdst), 0); ++ __ blsmskl(Rdst, $src$$Address); ++ __ jccb(Assembler::carryClear, done); ++ __ blsmskl(HIGH_FROM_LOW(Rdst), src_hi); ++ __ bind(done); ++ %} ++ ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsrL_eReg_eReg(eRegL dst, eRegL src, immL_M1 minus_1, eFlagsReg cr) ++%{ ++ match(Set dst (AndL (AddL src minus_1) src) ); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr, TEMP dst); ++ ++ format %{ "MOVL $dst.hi, $src.hi\n\t" ++ "BLSRL $dst.lo, $src.lo\n\t" ++ "JNC done\n\t" ++ "BLSRL $dst.hi, $src.hi\n" ++ "done:" ++ %} ++ ++ ins_encode %{ ++ Label done; ++ Register Rdst = $dst$$Register; ++ Register Rsrc = $src$$Register; ++ __ movl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc)); ++ __ blsrl(Rdst, Rsrc); ++ __ jccb(Assembler::carryClear, done); ++ __ blsrl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rsrc)); ++ __ bind(done); ++ %} ++ ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsrL_eReg_mem(eRegL dst, memory src, immL_M1 minus_1, eFlagsReg cr) ++%{ ++ match(Set dst (AndL (AddL (LoadL src) minus_1) (LoadL src) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr, TEMP dst); ++ ++ ins_cost(125); ++ format %{ "MOVL $dst.hi, $src+4\n\t" ++ "BLSRL $dst.lo, $src\n\t" ++ "JNC done\n\t" ++ "BLSRL $dst.hi, $src+4\n" ++ "done:" ++ %} ++ ++ ins_encode %{ ++ Label done; ++ Register Rdst = $dst$$Register; ++ Address src_hi = Address::make_raw($src$$base, $src$$index, $src$$scale, $src$$disp + 4, relocInfo::none); ++ __ movl(HIGH_FROM_LOW(Rdst), src_hi); ++ __ blsrl(Rdst, $src$$Address); ++ __ jccb(Assembler::carryClear, done); ++ __ blsrl(HIGH_FROM_LOW(Rdst), src_hi); ++ __ bind(done); ++ %} ++ ++ ins_pipe(ialu_reg_mem); ++%} ++ + // Or Long Register with Register + instruct orl_eReg(eRegL dst, eRegL src, eFlagsReg cr) %{ + match(Set dst (OrL dst src)); +@@ -13147,23 +12874,44 @@ + + // inlined locking and unlocking + +- +-instruct cmpFastLock( eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eRegP scr) %{ +- match( Set cr (FastLock object box) ); +- effect( TEMP tmp, TEMP scr, USE_KILL box ); ++instruct cmpFastLockRTM(eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eDXRegI scr, rRegI cx1, rRegI cx2) %{ ++ predicate(Compile::current()->use_rtm()); ++ match(Set cr (FastLock object box)); ++ effect(TEMP tmp, TEMP scr, TEMP cx1, TEMP cx2, USE_KILL box); ++ ins_cost(300); ++ format %{ "FASTLOCK $object,$box\t! kills $box,$tmp,$scr,$cx1,$cx2" %} ++ ins_encode %{ ++ __ fast_lock($object$$Register, $box$$Register, $tmp$$Register, ++ $scr$$Register, $cx1$$Register, $cx2$$Register, ++ _counters, _rtm_counters, _stack_rtm_counters, ++ ((Method*)(ra_->C->method()->constant_encoding()))->method_data(), ++ true, ra_->C->profile_rtm()); ++ %} ++ ins_pipe(pipe_slow); ++%} ++ ++instruct cmpFastLock(eFlagsReg cr, eRegP object, eBXRegP box, eAXRegI tmp, eRegP scr) %{ ++ predicate(!Compile::current()->use_rtm()); ++ match(Set cr (FastLock object box)); ++ effect(TEMP tmp, TEMP scr, USE_KILL box); + ins_cost(300); + format %{ "FASTLOCK $object,$box\t! kills $box,$tmp,$scr" %} +- ins_encode( Fast_Lock(object,box,tmp,scr) ); +- ins_pipe( pipe_slow ); +-%} +- +-instruct cmpFastUnlock( eFlagsReg cr, eRegP object, eAXRegP box, eRegP tmp ) %{ +- match( Set cr (FastUnlock object box) ); +- effect( TEMP tmp, USE_KILL box ); ++ ins_encode %{ ++ __ fast_lock($object$$Register, $box$$Register, $tmp$$Register, ++ $scr$$Register, noreg, noreg, _counters, NULL, NULL, NULL, false, false); ++ %} ++ ins_pipe(pipe_slow); ++%} ++ ++instruct cmpFastUnlock(eFlagsReg cr, eRegP object, eAXRegP box, eRegP tmp ) %{ ++ match(Set cr (FastUnlock object box)); ++ effect(TEMP tmp, USE_KILL box); + ins_cost(300); + format %{ "FASTUNLOCK $object,$box\t! kills $box,$tmp" %} +- ins_encode( Fast_Unlock(object,box,tmp) ); +- ins_pipe( pipe_slow ); ++ ins_encode %{ ++ __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register, ra_->C->use_rtm()); ++ %} ++ ins_pipe(pipe_slow); + %} + + +--- ./hotspot/src/cpu/x86/vm/x86_64.ad Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/x86_64.ad Wed Jul 30 03:51:43 2014 -0700 +@@ -688,6 +688,11 @@ + return 0; // absolute addressing, no offset + } + ++bool MachConstantBaseNode::requires_postalloc_expand() const { return false; } ++void MachConstantBaseNode::postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_) { ++ ShouldNotReachHere(); ++} ++ + void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const { + // Empty encoding + } +@@ -708,14 +713,15 @@ + void MachPrologNode::format(PhaseRegAlloc* ra_, outputStream* st) const { + Compile* C = ra_->C; + +- int framesize = C->frame_slots() << LogBytesPerInt; ++ int framesize = C->frame_size_in_bytes(); ++ int bangsize = C->bang_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove wordSize for return addr which is already pushed. + framesize -= wordSize; + +- if (C->need_stack_bang(framesize)) { ++ if (C->need_stack_bang(bangsize)) { + framesize -= wordSize; +- st->print("# stack bang"); ++ st->print("# stack bang (%d bytes)", bangsize); + st->print("\n\t"); + st->print("pushq rbp\t# Save rbp"); + if (framesize) { +@@ -746,9 +752,10 @@ + Compile* C = ra_->C; + MacroAssembler _masm(&cbuf); + +- int framesize = C->frame_slots() << LogBytesPerInt; +- +- __ verified_entry(framesize, C->need_stack_bang(framesize), false); ++ int framesize = C->frame_size_in_bytes(); ++ int bangsize = C->bang_size_in_bytes(); ++ ++ __ verified_entry(framesize, C->need_stack_bang(bangsize)?bangsize:0, false); + + C->set_frame_complete(cbuf.insts_size()); + +@@ -781,7 +788,7 @@ + st->cr(); st->print("\t"); + } + +- int framesize = C->frame_slots() << LogBytesPerInt; ++ int framesize = C->frame_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove word for return adr already pushed + // and RBP +@@ -817,7 +824,7 @@ + __ vzeroupper(); + } + +- int framesize = C->frame_slots() << LogBytesPerInt; ++ int framesize = C->frame_size_in_bytes(); + assert((framesize & (StackAlignmentInBytes-1)) == 0, "frame size not aligned"); + // Remove word for return adr already pushed + // and RBP +@@ -1434,66 +1441,9 @@ + return MachNode::size(ra_); // too many variables; just compute it + // the hard way + } +- ++ + + //============================================================================= +-uint size_exception_handler() +-{ +- // NativeCall instruction size is the same as NativeJump. +- // Note that this value is also credited (in output.cpp) to +- // the size of the code section. +- return NativeJump::instruction_size; +-} +- +-// Emit exception handler code. +-int emit_exception_handler(CodeBuffer& cbuf) +-{ +- +- // Note that the code buffer's insts_mark is always relative to insts. +- // That's why we must use the macroassembler to generate a handler. +- MacroAssembler _masm(&cbuf); +- address base = +- __ start_a_stub(size_exception_handler()); +- if (base == NULL) return 0; // CodeBuffer::expand failed +- int offset = __ offset(); +- __ jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point())); +- assert(__ offset() - offset <= (int) size_exception_handler(), "overflow"); +- __ end_a_stub(); +- return offset; +-} +- +-uint size_deopt_handler() +-{ +- // three 5 byte instructions +- return 15; +-} +- +-// Emit deopt handler code. +-int emit_deopt_handler(CodeBuffer& cbuf) +-{ +- +- // Note that the code buffer's insts_mark is always relative to insts. +- // That's why we must use the macroassembler to generate a handler. +- MacroAssembler _masm(&cbuf); +- address base = +- __ start_a_stub(size_deopt_handler()); +- if (base == NULL) return 0; // CodeBuffer::expand failed +- int offset = __ offset(); +- address the_pc = (address) __ pc(); +- Label next; +- // push a "the_pc" on the stack without destroying any registers +- // as they all may be live. +- +- // push address of "next" +- __ call(next, relocInfo::none); // reloc none is fine since it is a disp32 +- __ bind(next); +- // adjust it so it matches "the_pc" +- __ subptr(Address(rsp, 0), __ offset() - offset); +- __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); +- assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow"); +- __ end_a_stub(); +- return offset; +-} + + int Matcher::regnum_to_fpu_offset(int regnum) + { +@@ -1542,6 +1492,9 @@ + // No CMOVF/CMOVD with SSE2 + const int Matcher::float_cmove_cost() { return ConditionalMoveLimit; } + ++// Does the CPU require late expand (see block.cpp for description of late expand)? ++const bool Matcher::require_postalloc_expand = false; ++ + // Should the Matcher clone shifts on addressing modes, expecting them + // to be subsumed into complex addressing expressions or compute them + // into registers? True for Intel but false for most RISCs +@@ -1649,18 +1602,6 @@ + return PTR_RBP_REG_mask(); + } + +-const RegMask Matcher::mathExactI_result_proj_mask() { +- return INT_RAX_REG_mask(); +-} +- +-const RegMask Matcher::mathExactL_result_proj_mask() { +- return LONG_RAX_REG_mask(); +-} +- +-const RegMask Matcher::mathExactI_flags_proj_mask() { +- return INT_FLAGS_mask(); +-} +- + %} + + //----------ENCODING BLOCK----------------------------------------------------- +@@ -2591,231 +2532,6 @@ + %} + + +- // obj: object to lock +- // box: box address (header location) -- killed +- // tmp: rax -- killed +- // scr: rbx -- killed +- // +- // What follows is a direct transliteration of fast_lock() and fast_unlock() +- // from i486.ad. See that file for comments. +- // TODO: where possible switch from movq (r, 0) to movl(r,0) and +- // use the shorter encoding. (Movl clears the high-order 32-bits). +- +- +- enc_class Fast_Lock(rRegP obj, rRegP box, rax_RegI tmp, rRegP scr) +- %{ +- Register objReg = as_Register((int)$obj$$reg); +- Register boxReg = as_Register((int)$box$$reg); +- Register tmpReg = as_Register($tmp$$reg); +- Register scrReg = as_Register($scr$$reg); +- MacroAssembler masm(&cbuf); +- +- // Verify uniqueness of register assignments -- necessary but not sufficient +- assert (objReg != boxReg && objReg != tmpReg && +- objReg != scrReg && tmpReg != scrReg, "invariant") ; +- +- if (_counters != NULL) { +- masm.atomic_incl(ExternalAddress((address) _counters->total_entry_count_addr())); +- } +- if (EmitSync & 1) { +- // Without cast to int32_t a movptr will destroy r10 which is typically obj +- masm.movptr (Address(boxReg, 0), (int32_t)intptr_t(markOopDesc::unused_mark())) ; +- masm.cmpptr(rsp, (int32_t)NULL_WORD) ; +- } else +- if (EmitSync & 2) { +- Label DONE_LABEL; +- if (UseBiasedLocking) { +- // Note: tmpReg maps to the swap_reg argument and scrReg to the tmp_reg argument. +- masm.biased_locking_enter(boxReg, objReg, tmpReg, scrReg, false, DONE_LABEL, NULL, _counters); +- } +- // QQQ was movl... +- masm.movptr(tmpReg, 0x1); +- masm.orptr(tmpReg, Address(objReg, 0)); +- masm.movptr(Address(boxReg, 0), tmpReg); +- if (os::is_MP()) { +- masm.lock(); +- } +- masm.cmpxchgptr(boxReg, Address(objReg, 0)); // Updates tmpReg +- masm.jcc(Assembler::equal, DONE_LABEL); +- +- // Recursive locking +- masm.subptr(tmpReg, rsp); +- masm.andptr(tmpReg, 7 - os::vm_page_size()); +- masm.movptr(Address(boxReg, 0), tmpReg); +- +- masm.bind(DONE_LABEL); +- masm.nop(); // avoid branch to branch +- } else { +- Label DONE_LABEL, IsInflated, Egress; +- +- masm.movptr(tmpReg, Address(objReg, 0)) ; +- masm.testl (tmpReg, 0x02) ; // inflated vs stack-locked|neutral|biased +- masm.jcc (Assembler::notZero, IsInflated) ; +- +- // it's stack-locked, biased or neutral +- // TODO: optimize markword triage order to reduce the number of +- // conditional branches in the most common cases. +- // Beware -- there's a subtle invariant that fetch of the markword +- // at [FETCH], below, will never observe a biased encoding (*101b). +- // If this invariant is not held we'll suffer exclusion (safety) failure. +- +- if (UseBiasedLocking && !UseOptoBiasInlining) { +- masm.biased_locking_enter(boxReg, objReg, tmpReg, scrReg, true, DONE_LABEL, NULL, _counters); +- masm.movptr(tmpReg, Address(objReg, 0)) ; // [FETCH] +- } +- +- // was q will it destroy high? +- masm.orl (tmpReg, 1) ; +- masm.movptr(Address(boxReg, 0), tmpReg) ; +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(boxReg, Address(objReg, 0)); // Updates tmpReg +- if (_counters != NULL) { +- masm.cond_inc32(Assembler::equal, +- ExternalAddress((address) _counters->fast_path_entry_count_addr())); +- } +- masm.jcc (Assembler::equal, DONE_LABEL); +- +- // Recursive locking +- masm.subptr(tmpReg, rsp); +- masm.andptr(tmpReg, 7 - os::vm_page_size()); +- masm.movptr(Address(boxReg, 0), tmpReg); +- if (_counters != NULL) { +- masm.cond_inc32(Assembler::equal, +- ExternalAddress((address) _counters->fast_path_entry_count_addr())); +- } +- masm.jmp (DONE_LABEL) ; +- +- masm.bind (IsInflated) ; +- // It's inflated +- +- // TODO: someday avoid the ST-before-CAS penalty by +- // relocating (deferring) the following ST. +- // We should also think about trying a CAS without having +- // fetched _owner. If the CAS is successful we may +- // avoid an RTO->RTS upgrade on the $line. +- // Without cast to int32_t a movptr will destroy r10 which is typically obj +- masm.movptr(Address(boxReg, 0), (int32_t)intptr_t(markOopDesc::unused_mark())) ; +- +- masm.mov (boxReg, tmpReg) ; +- masm.movptr (tmpReg, Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; +- masm.testptr(tmpReg, tmpReg) ; +- masm.jcc (Assembler::notZero, DONE_LABEL) ; +- +- // It's inflated and appears unlocked +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(r15_thread, Address(boxReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; +- // Intentional fall-through into DONE_LABEL ... +- +- masm.bind (DONE_LABEL) ; +- masm.nop () ; // avoid jmp to jmp +- } +- %} +- +- // obj: object to unlock +- // box: box address (displaced header location), killed +- // RBX: killed tmp; cannot be obj nor box +- enc_class Fast_Unlock(rRegP obj, rax_RegP box, rRegP tmp) +- %{ +- +- Register objReg = as_Register($obj$$reg); +- Register boxReg = as_Register($box$$reg); +- Register tmpReg = as_Register($tmp$$reg); +- MacroAssembler masm(&cbuf); +- +- if (EmitSync & 4) { +- masm.cmpptr(rsp, 0) ; +- } else +- if (EmitSync & 8) { +- Label DONE_LABEL; +- if (UseBiasedLocking) { +- masm.biased_locking_exit(objReg, tmpReg, DONE_LABEL); +- } +- +- // Check whether the displaced header is 0 +- //(=> recursive unlock) +- masm.movptr(tmpReg, Address(boxReg, 0)); +- masm.testptr(tmpReg, tmpReg); +- masm.jcc(Assembler::zero, DONE_LABEL); +- +- // If not recursive lock, reset the header to displaced header +- if (os::is_MP()) { +- masm.lock(); +- } +- masm.cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses RAX which is box +- masm.bind(DONE_LABEL); +- masm.nop(); // avoid branch to branch +- } else { +- Label DONE_LABEL, Stacked, CheckSucc ; +- +- if (UseBiasedLocking && !UseOptoBiasInlining) { +- masm.biased_locking_exit(objReg, tmpReg, DONE_LABEL); +- } +- +- masm.movptr(tmpReg, Address(objReg, 0)) ; +- masm.cmpptr(Address(boxReg, 0), (int32_t)NULL_WORD) ; +- masm.jcc (Assembler::zero, DONE_LABEL) ; +- masm.testl (tmpReg, 0x02) ; +- masm.jcc (Assembler::zero, Stacked) ; +- +- // It's inflated +- masm.movptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)) ; +- masm.xorptr(boxReg, r15_thread) ; +- masm.orptr (boxReg, Address (tmpReg, ObjectMonitor::recursions_offset_in_bytes()-2)) ; +- masm.jcc (Assembler::notZero, DONE_LABEL) ; +- masm.movptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2)) ; +- masm.orptr (boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2)) ; +- masm.jcc (Assembler::notZero, CheckSucc) ; +- masm.movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), (int32_t)NULL_WORD) ; +- masm.jmp (DONE_LABEL) ; +- +- if ((EmitSync & 65536) == 0) { +- Label LSuccess, LGoSlowPath ; +- masm.bind (CheckSucc) ; +- masm.cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), (int32_t)NULL_WORD) ; +- masm.jcc (Assembler::zero, LGoSlowPath) ; +- +- // I'd much rather use lock:andl m->_owner, 0 as it's faster than the +- // the explicit ST;MEMBAR combination, but masm doesn't currently support +- // "ANDQ M,IMM". Don't use MFENCE here. lock:add to TOS, xchg, etc +- // are all faster when the write buffer is populated. +- masm.movptr (Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), (int32_t)NULL_WORD) ; +- if (os::is_MP()) { +- masm.lock () ; masm.addl (Address(rsp, 0), 0) ; +- } +- masm.cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), (int32_t)NULL_WORD) ; +- masm.jcc (Assembler::notZero, LSuccess) ; +- +- masm.movptr (boxReg, (int32_t)NULL_WORD) ; // box is really EAX +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(r15_thread, Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2)); +- masm.jcc (Assembler::notEqual, LSuccess) ; +- // Intentional fall-through into slow-path +- +- masm.bind (LGoSlowPath) ; +- masm.orl (boxReg, 1) ; // set ICC.ZF=0 to indicate failure +- masm.jmp (DONE_LABEL) ; +- +- masm.bind (LSuccess) ; +- masm.testl (boxReg, 0) ; // set ICC.ZF=1 to indicate success +- masm.jmp (DONE_LABEL) ; +- } +- +- masm.bind (Stacked) ; +- masm.movptr(tmpReg, Address (boxReg, 0)) ; // re-fetch +- if (os::is_MP()) { masm.lock(); } +- masm.cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses RAX which is box +- +- if (EmitSync & 65536) { +- masm.bind (CheckSucc) ; +- } +- masm.bind(DONE_LABEL); +- if (EmitSync & 32768) { +- masm.nop(); // avoid branch to branch +- } +- } +- %} +- +- + enc_class enc_rethrow() + %{ + cbuf.set_insts_mark(); +@@ -2953,7 +2669,7 @@ + c_calling_convention + %{ + // This is obviously always outgoing +- (void) SharedRuntime::c_calling_convention(sig_bt, regs, length); ++ (void) SharedRuntime::c_calling_convention(sig_bt, regs, /*regs2=*/NULL, length); + %} + + // Location of compiled Java return values. Same as C for now. +@@ -6251,6 +5967,19 @@ + %} + + instruct countTrailingZerosI(rRegI dst, rRegI src, rFlagsReg cr) %{ ++ predicate(UseCountTrailingZerosInstruction); ++ match(Set dst (CountTrailingZerosI src)); ++ effect(KILL cr); ++ ++ format %{ "tzcntl $dst, $src\t# count trailing zeros (int)" %} ++ ins_encode %{ ++ __ tzcntl($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct countTrailingZerosI_bsf(rRegI dst, rRegI src, rFlagsReg cr) %{ ++ predicate(!UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosI src)); + effect(KILL cr); + +@@ -6270,6 +5999,19 @@ + %} + + instruct countTrailingZerosL(rRegI dst, rRegL src, rFlagsReg cr) %{ ++ predicate(UseCountTrailingZerosInstruction); ++ match(Set dst (CountTrailingZerosL src)); ++ effect(KILL cr); ++ ++ format %{ "tzcntq $dst, $src\t# count trailing zeros (long)" %} ++ ins_encode %{ ++ __ tzcntq($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct countTrailingZerosL_bsf(rRegI dst, rRegL src, rFlagsReg cr) %{ ++ predicate(!UseCountTrailingZerosInstruction); + match(Set dst (CountTrailingZerosL src)); + effect(KILL cr); + +@@ -6348,6 +6090,7 @@ + instruct membar_acquire() + %{ + match(MemBarAcquire); ++ match(LoadFence); + ins_cost(0); + + size(0); +@@ -6370,6 +6113,7 @@ + instruct membar_release() + %{ + match(MemBarRelease); ++ match(StoreFence); + ins_cost(0); + + size(0); +@@ -6953,82 +6697,6 @@ + //----------Arithmetic Instructions-------------------------------------------- + //----------Addition Instructions---------------------------------------------- + +-instruct addExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr) +-%{ +- match(AddExactI dst src); +- effect(DEF cr); +- +- format %{ "addl $dst, $src\t# addExact int" %} +- ins_encode %{ +- __ addl($dst$$Register, $src$$Register); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct addExactI_rReg_imm(rax_RegI dst, immI src, rFlagsReg cr) +-%{ +- match(AddExactI dst src); +- effect(DEF cr); +- +- format %{ "addl $dst, $src\t# addExact int" %} +- ins_encode %{ +- __ addl($dst$$Register, $src$$constant); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct addExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr) +-%{ +- match(AddExactI dst (LoadI src)); +- effect(DEF cr); +- +- ins_cost(125); // XXX +- format %{ "addl $dst, $src\t# addExact int" %} +- ins_encode %{ +- __ addl($dst$$Register, $src$$Address); +- %} +- +- ins_pipe(ialu_reg_mem); +-%} +- +-instruct addExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr) +-%{ +- match(AddExactL dst src); +- effect(DEF cr); +- +- format %{ "addq $dst, $src\t# addExact long" %} +- ins_encode %{ +- __ addq($dst$$Register, $src$$Register); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct addExactL_rReg_imm(rax_RegL dst, immL32 src, rFlagsReg cr) +-%{ +- match(AddExactL dst src); +- effect(DEF cr); +- +- format %{ "addq $dst, $src\t# addExact long" %} +- ins_encode %{ +- __ addq($dst$$Register, $src$$constant); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct addExactL_rReg_mem(rax_RegL dst, memory src, rFlagsReg cr) +-%{ +- match(AddExactL dst (LoadL src)); +- effect(DEF cr); +- +- ins_cost(125); // XXX +- format %{ "addq $dst, $src\t# addExact long" %} +- ins_encode %{ +- __ addq($dst$$Register, $src$$Address); +- %} +- +- ins_pipe(ialu_reg_mem); +-%} +- + instruct addI_rReg(rRegI dst, rRegI src, rFlagsReg cr) + %{ + match(Set dst (AddI dst src)); +@@ -7641,80 +7309,6 @@ + ins_pipe(ialu_mem_imm); + %} + +-instruct subExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr) +-%{ +- match(SubExactI dst src); +- effect(DEF cr); +- +- format %{ "subl $dst, $src\t# subExact int" %} +- ins_encode %{ +- __ subl($dst$$Register, $src$$Register); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct subExactI_rReg_imm(rax_RegI dst, immI src, rFlagsReg cr) +-%{ +- match(SubExactI dst src); +- effect(DEF cr); +- +- format %{ "subl $dst, $src\t# subExact int" %} +- ins_encode %{ +- __ subl($dst$$Register, $src$$constant); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct subExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr) +-%{ +- match(SubExactI dst (LoadI src)); +- effect(DEF cr); +- +- ins_cost(125); +- format %{ "subl $dst, $src\t# subExact int" %} +- ins_encode %{ +- __ subl($dst$$Register, $src$$Address); +- %} +- ins_pipe(ialu_reg_mem); +-%} +- +-instruct subExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr) +-%{ +- match(SubExactL dst src); +- effect(DEF cr); +- +- format %{ "subq $dst, $src\t# subExact long" %} +- ins_encode %{ +- __ subq($dst$$Register, $src$$Register); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct subExactL_rReg_imm(rax_RegL dst, immL32 src, rFlagsReg cr) +-%{ +- match(SubExactL dst (LoadL src)); +- effect(DEF cr); +- +- format %{ "subq $dst, $src\t# subExact long" %} +- ins_encode %{ +- __ subq($dst$$Register, $src$$constant); +- %} +- ins_pipe(ialu_reg_reg); +-%} +- +-instruct subExactL_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr) +-%{ +- match(SubExactI dst src); +- effect(DEF cr); +- +- ins_cost(125); +- format %{ "subq $dst, $src\t# subExact long" %} +- ins_encode %{ +- __ subq($dst$$Register, $src$$Address); +- %} +- ins_pipe(ialu_reg_mem); +-%} +- + instruct subL_rReg(rRegL dst, rRegL src, rFlagsReg cr) + %{ + match(Set dst (SubL dst src)); +@@ -7831,31 +7425,6 @@ + ins_pipe(ialu_reg); + %} + +-instruct negExactI_rReg(rax_RegI dst, rFlagsReg cr) +-%{ +- match(NegExactI dst); +- effect(KILL cr); +- +- format %{ "negl $dst\t# negExact int" %} +- ins_encode %{ +- __ negl($dst$$Register); +- %} +- ins_pipe(ialu_reg); +-%} +- +-instruct negExactL_rReg(rax_RegL dst, rFlagsReg cr) +-%{ +- match(NegExactL dst); +- effect(KILL cr); +- +- format %{ "negq $dst\t# negExact long" %} +- ins_encode %{ +- __ negq($dst$$Register); +- %} +- ins_pipe(ialu_reg); +-%} +- +- + //----------Multiplication/Division Instructions------------------------------- + // Integer Multiplication Instructions + // Multiply Register +@@ -7972,86 +7541,6 @@ + ins_pipe(ialu_reg_reg_alu0); + %} + +- +-instruct mulExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr) +-%{ +- match(MulExactI dst src); +- effect(DEF cr); +- +- ins_cost(300); +- format %{ "imull $dst, $src\t# mulExact int" %} +- ins_encode %{ +- __ imull($dst$$Register, $src$$Register); +- %} +- ins_pipe(ialu_reg_reg_alu0); +-%} +- +- +-instruct mulExactI_rReg_imm(rax_RegI dst, rRegI src, immI imm, rFlagsReg cr) +-%{ +- match(MulExactI src imm); +- effect(DEF cr); +- +- ins_cost(300); +- format %{ "imull $dst, $src, $imm\t# mulExact int" %} +- ins_encode %{ +- __ imull($dst$$Register, $src$$Register, $imm$$constant); +- %} +- ins_pipe(ialu_reg_reg_alu0); +-%} +- +-instruct mulExactI_rReg_mem(rax_RegI dst, memory src, rFlagsReg cr) +-%{ +- match(MulExactI dst (LoadI src)); +- effect(DEF cr); +- +- ins_cost(350); +- format %{ "imull $dst, $src\t# mulExact int" %} +- ins_encode %{ +- __ imull($dst$$Register, $src$$Address); +- %} +- ins_pipe(ialu_reg_mem_alu0); +-%} +- +-instruct mulExactL_rReg(rax_RegL dst, rRegL src, rFlagsReg cr) +-%{ +- match(MulExactL dst src); +- effect(DEF cr); +- +- ins_cost(300); +- format %{ "imulq $dst, $src\t# mulExact long" %} +- ins_encode %{ +- __ imulq($dst$$Register, $src$$Register); +- %} +- ins_pipe(ialu_reg_reg_alu0); +-%} +- +-instruct mulExactL_rReg_imm(rax_RegL dst, rRegL src, immL32 imm, rFlagsReg cr) +-%{ +- match(MulExactL src imm); +- effect(DEF cr); +- +- ins_cost(300); +- format %{ "imulq $dst, $src, $imm\t# mulExact long" %} +- ins_encode %{ +- __ imulq($dst$$Register, $src$$Register, $imm$$constant); +- %} +- ins_pipe(ialu_reg_reg_alu0); +-%} +- +-instruct mulExactL_rReg_mem(rax_RegL dst, memory src, rFlagsReg cr) +-%{ +- match(MulExactL dst (LoadL src)); +- effect(DEF cr); +- +- ins_cost(350); +- format %{ "imulq $dst, $src\t# mulExact long" %} +- ins_encode %{ +- __ imulq($dst$$Register, $src$$Address); +- %} +- ins_pipe(ialu_reg_mem_alu0); +-%} +- + instruct divI_rReg(rax_RegI rax, rdx_RegI rdx, no_rax_rdx_RegI div, + rFlagsReg cr) + %{ +@@ -9104,6 +8593,122 @@ + ins_pipe(ialu_mem_imm); + %} + ++// BMI1 instructions ++instruct andnI_rReg_rReg_mem(rRegI dst, rRegI src1, memory src2, immI_M1 minus_1, rFlagsReg cr) %{ ++ match(Set dst (AndI (XorI src1 minus_1) (LoadI src2))); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "andnl $dst, $src1, $src2" %} ++ ++ ins_encode %{ ++ __ andnl($dst$$Register, $src1$$Register, $src2$$Address); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct andnI_rReg_rReg_rReg(rRegI dst, rRegI src1, rRegI src2, immI_M1 minus_1, rFlagsReg cr) %{ ++ match(Set dst (AndI (XorI src1 minus_1) src2)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "andnl $dst, $src1, $src2" %} ++ ++ ins_encode %{ ++ __ andnl($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsiI_rReg_rReg(rRegI dst, rRegI src, immI0 imm_zero, rFlagsReg cr) %{ ++ match(Set dst (AndI (SubI imm_zero src) src)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "blsil $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsil($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsiI_rReg_mem(rRegI dst, memory src, immI0 imm_zero, rFlagsReg cr) %{ ++ match(Set dst (AndI (SubI imm_zero (LoadI src) ) (LoadI src) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "blsil $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsil($dst$$Register, $src$$Address); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsmskI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, rFlagsReg cr) ++%{ ++ match(Set dst (XorI (AddI (LoadI src) minus_1) (LoadI src) ) ); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "blsmskl $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsmskl($dst$$Register, $src$$Address); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsmskI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, rFlagsReg cr) ++%{ ++ match(Set dst (XorI (AddI src minus_1) src)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "blsmskl $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsmskl($dst$$Register, $src$$Register); ++ %} ++ ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsrI_rReg_rReg(rRegI dst, rRegI src, immI_M1 minus_1, rFlagsReg cr) ++%{ ++ match(Set dst (AndI (AddI src minus_1) src) ); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "blsrl $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsrl($dst$$Register, $src$$Register); ++ %} ++ ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsrI_rReg_mem(rRegI dst, memory src, immI_M1 minus_1, rFlagsReg cr) ++%{ ++ match(Set dst (AndI (AddI (LoadI src) minus_1) (LoadI src) ) ); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "blsrl $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsrl($dst$$Register, $src$$Address); ++ %} ++ ++ ins_pipe(ialu_reg); ++%} ++ + // Or Instructions + // Or Register with Register + instruct orI_rReg(rRegI dst, rRegI src, rFlagsReg cr) +@@ -9335,6 +8940,122 @@ + ins_pipe(ialu_mem_imm); + %} + ++// BMI1 instructions ++instruct andnL_rReg_rReg_mem(rRegL dst, rRegL src1, memory src2, immL_M1 minus_1, rFlagsReg cr) %{ ++ match(Set dst (AndL (XorL src1 minus_1) (LoadL src2))); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "andnq $dst, $src1, $src2" %} ++ ++ ins_encode %{ ++ __ andnq($dst$$Register, $src1$$Register, $src2$$Address); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct andnL_rReg_rReg_rReg(rRegL dst, rRegL src1, rRegL src2, immL_M1 minus_1, rFlagsReg cr) %{ ++ match(Set dst (AndL (XorL src1 minus_1) src2)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "andnq $dst, $src1, $src2" %} ++ ++ ins_encode %{ ++ __ andnq($dst$$Register, $src1$$Register, $src2$$Register); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsiL_rReg_rReg(rRegL dst, rRegL src, immL0 imm_zero, rFlagsReg cr) %{ ++ match(Set dst (AndL (SubL imm_zero src) src)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "blsiq $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsiq($dst$$Register, $src$$Register); ++ %} ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsiL_rReg_mem(rRegL dst, memory src, immL0 imm_zero, rFlagsReg cr) %{ ++ match(Set dst (AndL (SubL imm_zero (LoadL src) ) (LoadL src) )); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "blsiq $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsiq($dst$$Register, $src$$Address); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsmskL_rReg_mem(rRegL dst, memory src, immL_M1 minus_1, rFlagsReg cr) ++%{ ++ match(Set dst (XorL (AddL (LoadL src) minus_1) (LoadL src) ) ); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "blsmskq $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsmskq($dst$$Register, $src$$Address); ++ %} ++ ins_pipe(ialu_reg_mem); ++%} ++ ++instruct blsmskL_rReg_rReg(rRegL dst, rRegL src, immL_M1 minus_1, rFlagsReg cr) ++%{ ++ match(Set dst (XorL (AddL src minus_1) src)); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "blsmskq $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsmskq($dst$$Register, $src$$Register); ++ %} ++ ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsrL_rReg_rReg(rRegL dst, rRegL src, immL_M1 minus_1, rFlagsReg cr) ++%{ ++ match(Set dst (AndL (AddL src minus_1) src) ); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ format %{ "blsrq $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsrq($dst$$Register, $src$$Register); ++ %} ++ ++ ins_pipe(ialu_reg); ++%} ++ ++instruct blsrL_rReg_mem(rRegL dst, memory src, immL_M1 minus_1, rFlagsReg cr) ++%{ ++ match(Set dst (AndL (AddL (LoadL src) minus_1) (LoadL src)) ); ++ predicate(UseBMI1Instructions); ++ effect(KILL cr); ++ ++ ins_cost(125); ++ format %{ "blsrq $dst, $src" %} ++ ++ ins_encode %{ ++ __ blsrq($dst$$Register, $src$$Address); ++ %} ++ ++ ins_pipe(ialu_reg); ++%} ++ + // Or Instructions + // Or Register with Register + instruct orL_rReg(rRegL dst, rRegL src, rFlagsReg cr) +@@ -10660,6 +10381,174 @@ + ins_pipe( pipe_slow ); + %} + ++//----------Overflow Math Instructions----------------------------------------- ++ ++instruct overflowAddI_rReg(rFlagsReg cr, rax_RegI op1, rRegI op2) ++%{ ++ match(Set cr (OverflowAddI op1 op2)); ++ effect(DEF cr, USE_KILL op1, USE op2); ++ ++ format %{ "addl $op1, $op2\t# overflow check int" %} ++ ++ ins_encode %{ ++ __ addl($op1$$Register, $op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowAddI_rReg_imm(rFlagsReg cr, rax_RegI op1, immI op2) ++%{ ++ match(Set cr (OverflowAddI op1 op2)); ++ effect(DEF cr, USE_KILL op1, USE op2); ++ ++ format %{ "addl $op1, $op2\t# overflow check int" %} ++ ++ ins_encode %{ ++ __ addl($op1$$Register, $op2$$constant); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowAddL_rReg(rFlagsReg cr, rax_RegL op1, rRegL op2) ++%{ ++ match(Set cr (OverflowAddL op1 op2)); ++ effect(DEF cr, USE_KILL op1, USE op2); ++ ++ format %{ "addq $op1, $op2\t# overflow check long" %} ++ ins_encode %{ ++ __ addq($op1$$Register, $op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowAddL_rReg_imm(rFlagsReg cr, rax_RegL op1, immL32 op2) ++%{ ++ match(Set cr (OverflowAddL op1 op2)); ++ effect(DEF cr, USE_KILL op1, USE op2); ++ ++ format %{ "addq $op1, $op2\t# overflow check long" %} ++ ins_encode %{ ++ __ addq($op1$$Register, $op2$$constant); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowSubI_rReg(rFlagsReg cr, rRegI op1, rRegI op2) ++%{ ++ match(Set cr (OverflowSubI op1 op2)); ++ ++ format %{ "cmpl $op1, $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ cmpl($op1$$Register, $op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowSubI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2) ++%{ ++ match(Set cr (OverflowSubI op1 op2)); ++ ++ format %{ "cmpl $op1, $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ cmpl($op1$$Register, $op2$$constant); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowSubL_rReg(rFlagsReg cr, rRegL op1, rRegL op2) ++%{ ++ match(Set cr (OverflowSubL op1 op2)); ++ ++ format %{ "cmpq $op1, $op2\t# overflow check long" %} ++ ins_encode %{ ++ __ cmpq($op1$$Register, $op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowSubL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2) ++%{ ++ match(Set cr (OverflowSubL op1 op2)); ++ ++ format %{ "cmpq $op1, $op2\t# overflow check long" %} ++ ins_encode %{ ++ __ cmpq($op1$$Register, $op2$$constant); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowNegI_rReg(rFlagsReg cr, immI0 zero, rax_RegI op2) ++%{ ++ match(Set cr (OverflowSubI zero op2)); ++ effect(DEF cr, USE_KILL op2); ++ ++ format %{ "negl $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ negl($op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowNegL_rReg(rFlagsReg cr, immL0 zero, rax_RegL op2) ++%{ ++ match(Set cr (OverflowSubL zero op2)); ++ effect(DEF cr, USE_KILL op2); ++ ++ format %{ "negq $op2\t# overflow check long" %} ++ ins_encode %{ ++ __ negq($op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg); ++%} ++ ++instruct overflowMulI_rReg(rFlagsReg cr, rax_RegI op1, rRegI op2) ++%{ ++ match(Set cr (OverflowMulI op1 op2)); ++ effect(DEF cr, USE_KILL op1, USE op2); ++ ++ format %{ "imull $op1, $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ imull($op1$$Register, $op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg_alu0); ++%} ++ ++instruct overflowMulI_rReg_imm(rFlagsReg cr, rRegI op1, immI op2, rRegI tmp) ++%{ ++ match(Set cr (OverflowMulI op1 op2)); ++ effect(DEF cr, TEMP tmp, USE op1, USE op2); ++ ++ format %{ "imull $tmp, $op1, $op2\t# overflow check int" %} ++ ins_encode %{ ++ __ imull($tmp$$Register, $op1$$Register, $op2$$constant); ++ %} ++ ins_pipe(ialu_reg_reg_alu0); ++%} ++ ++instruct overflowMulL_rReg(rFlagsReg cr, rax_RegL op1, rRegL op2) ++%{ ++ match(Set cr (OverflowMulL op1 op2)); ++ effect(DEF cr, USE_KILL op1, USE op2); ++ ++ format %{ "imulq $op1, $op2\t# overflow check long" %} ++ ins_encode %{ ++ __ imulq($op1$$Register, $op2$$Register); ++ %} ++ ins_pipe(ialu_reg_reg_alu0); ++%} ++ ++instruct overflowMulL_rReg_imm(rFlagsReg cr, rRegL op1, immL32 op2, rRegL tmp) ++%{ ++ match(Set cr (OverflowMulL op1 op2)); ++ effect(DEF cr, TEMP tmp, USE op1, USE op2); ++ ++ format %{ "imulq $tmp, $op1, $op2\t# overflow check long" %} ++ ins_encode %{ ++ __ imulq($tmp$$Register, $op1$$Register, $op2$$constant); ++ %} ++ ins_pipe(ialu_reg_reg_alu0); ++%} ++ + + //----------Control Flow Instructions------------------------------------------ + // Signed compare Instructions +@@ -11443,27 +11332,43 @@ + // ============================================================================ + // inlined locking and unlocking + +-instruct cmpFastLock(rFlagsReg cr, +- rRegP object, rbx_RegP box, rax_RegI tmp, rRegP scr) +-%{ ++instruct cmpFastLockRTM(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI tmp, rdx_RegI scr, rRegI cx1, rRegI cx2) %{ ++ predicate(Compile::current()->use_rtm()); ++ match(Set cr (FastLock object box)); ++ effect(TEMP tmp, TEMP scr, TEMP cx1, TEMP cx2, USE_KILL box); ++ ins_cost(300); ++ format %{ "fastlock $object,$box\t! kills $box,$tmp,$scr,$cx1,$cx2" %} ++ ins_encode %{ ++ __ fast_lock($object$$Register, $box$$Register, $tmp$$Register, ++ $scr$$Register, $cx1$$Register, $cx2$$Register, ++ _counters, _rtm_counters, _stack_rtm_counters, ++ ((Method*)(ra_->C->method()->constant_encoding()))->method_data(), ++ true, ra_->C->profile_rtm()); ++ %} ++ ins_pipe(pipe_slow); ++%} ++ ++instruct cmpFastLock(rFlagsReg cr, rRegP object, rbx_RegP box, rax_RegI tmp, rRegP scr) %{ ++ predicate(!Compile::current()->use_rtm()); + match(Set cr (FastLock object box)); + effect(TEMP tmp, TEMP scr, USE_KILL box); +- + ins_cost(300); + format %{ "fastlock $object,$box\t! kills $box,$tmp,$scr" %} +- ins_encode(Fast_Lock(object, box, tmp, scr)); ++ ins_encode %{ ++ __ fast_lock($object$$Register, $box$$Register, $tmp$$Register, ++ $scr$$Register, noreg, noreg, _counters, NULL, NULL, NULL, false, false); ++ %} + ins_pipe(pipe_slow); + %} + +-instruct cmpFastUnlock(rFlagsReg cr, +- rRegP object, rax_RegP box, rRegP tmp) +-%{ ++instruct cmpFastUnlock(rFlagsReg cr, rRegP object, rax_RegP box, rRegP tmp) %{ + match(Set cr (FastUnlock object box)); + effect(TEMP tmp, USE_KILL box); +- + ins_cost(300); + format %{ "fastunlock $object,$box\t! kills $box,$tmp" %} +- ins_encode(Fast_Unlock(object, box, tmp)); ++ ins_encode %{ ++ __ fast_unlock($object$$Register, $box$$Register, $tmp$$Register, ra_->C->use_rtm()); ++ %} + ins_pipe(pipe_slow); + %} + +--- ./hotspot/src/cpu/zero/vm/bytecodeInterpreter_zero.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/zero/vm/bytecodeInterpreter_zero.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -132,7 +132,7 @@ + #define LOCALS_ADDR(offset) ((address)locals[-(offset)]) + #define LOCALS_INT(offset) (*((jint*)&locals[-(offset)])) + #define LOCALS_FLOAT(offset) (*((jfloat*)&locals[-(offset)])) +-#define LOCALS_OBJECT(offset) ((oop)locals[-(offset)]) ++#define LOCALS_OBJECT(offset) (cast_to_oop(locals[-(offset)])) + #define LOCALS_DOUBLE(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->d) + #define LOCALS_LONG(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->l) + #define LOCALS_LONG_AT(offset) (((address)&locals[-((offset) + 1)])) +--- ./hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -220,7 +220,7 @@ + } + InvocationCounter *counter = mcs->invocation_counter(); + counter->increment(); +- if (counter->reached_InvocationLimit()) { ++ if (counter->reached_InvocationLimit(mcs->backedge_counter())) { + CALL_VM_NOCHECK( + InterpreterRuntime::frequency_counter_overflow(thread, NULL)); + if (HAS_PENDING_EXCEPTION) +@@ -916,17 +916,32 @@ + return (InterpreterFrame *) fp; + } + +-int AbstractInterpreter::layout_activation(Method* method, +- int tempcount, +- int popframe_extra_args, +- int moncount, +- int caller_actual_parameters, +- int callee_param_count, +- int callee_locals, +- frame* caller, +- frame* interpreter_frame, +- bool is_top_frame, +- bool is_bottom_frame) { ++int AbstractInterpreter::size_activation(int max_stack, ++ int tempcount, ++ int extra_args, ++ int moncount, ++ int callee_param_count, ++ int callee_locals, ++ bool is_top_frame) { ++ int header_words = InterpreterFrame::header_words; ++ int monitor_words = moncount * frame::interpreter_frame_monitor_size(); ++ int stack_words = is_top_frame ? max_stack : tempcount; ++ int callee_extra_locals = callee_locals - callee_param_count; ++ ++ return header_words + monitor_words + stack_words + callee_extra_locals; ++} ++ ++void AbstractInterpreter::layout_activation(Method* method, ++ int tempcount, ++ int popframe_extra_args, ++ int moncount, ++ int caller_actual_parameters, ++ int callee_param_count, ++ int callee_locals, ++ frame* caller, ++ frame* interpreter_frame, ++ bool is_top_frame, ++ bool is_bottom_frame) { + assert(popframe_extra_args == 0, "what to do?"); + assert(!is_top_frame || (!callee_locals && !callee_param_count), + "top frame should have no caller"); +@@ -935,39 +950,31 @@ + // does (the full InterpreterFrame::build, that is, not the + // one that creates empty frames for the deoptimizer). + // +- // If interpreter_frame is not NULL then it will be filled in. +- // It's size is determined by a previous call to this method, +- // so it should be correct. ++ // interpreter_frame will be filled in. It's size is determined by ++ // a previous call to the size_activation() method, + // + // Note that tempcount is the current size of the expression + // stack. For top most frames we will allocate a full sized + // expression stack and not the trimmed version that non-top + // frames have. + +- int header_words = InterpreterFrame::header_words; + int monitor_words = moncount * frame::interpreter_frame_monitor_size(); +- int stack_words = is_top_frame ? method->max_stack() : tempcount; +- int callee_extra_locals = callee_locals - callee_param_count; ++ intptr_t *locals = interpreter_frame->fp() + method->max_locals(); ++ interpreterState istate = interpreter_frame->get_interpreterState(); ++ intptr_t *monitor_base = (intptr_t*) istate; ++ intptr_t *stack_base = monitor_base - monitor_words; ++ intptr_t *stack = stack_base - tempcount - 1; + +- if (interpreter_frame) { +- intptr_t *locals = interpreter_frame->fp() + method->max_locals(); +- interpreterState istate = interpreter_frame->get_interpreterState(); +- intptr_t *monitor_base = (intptr_t*) istate; +- intptr_t *stack_base = monitor_base - monitor_words; +- intptr_t *stack = stack_base - tempcount - 1; +- +- BytecodeInterpreter::layout_interpreterState(istate, +- caller, +- NULL, +- method, +- locals, +- stack, +- stack_base, +- monitor_base, +- NULL, +- is_top_frame); +- } +- return header_words + monitor_words + stack_words + callee_extra_locals; ++ BytecodeInterpreter::layout_interpreterState(istate, ++ caller, ++ NULL, ++ method, ++ locals, ++ stack, ++ stack_base, ++ monitor_base, ++ NULL, ++ is_top_frame); + } + + void BytecodeInterpreter::layout_interpreterState(interpreterState istate, +--- ./hotspot/src/cpu/zero/vm/globalDefinitions_zero.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/zero/vm/globalDefinitions_zero.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -28,4 +28,10 @@ + + #include + ++// Indicates whether the C calling conventions require that ++// 32-bit integer argument values are properly extended to 64 bits. ++// If set, SharedRuntime::c_calling_convention() must adapt ++// signatures accordingly. ++const bool CCallingConventionRequiresIntsAsLongs = false; ++ + #endif // CPU_ZERO_VM_GLOBALDEFINITIONS_ZERO_HPP +--- ./hotspot/src/cpu/zero/vm/globals_zero.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/zero/vm/globals_zero.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -38,11 +38,13 @@ + define_pd_global(bool, NeedsDeoptSuspend, false); + + define_pd_global(bool, ImplicitNullChecks, true); ++define_pd_global(bool, TrapBasedNullChecks, false); + define_pd_global(bool, UncommonNullCast, true); + + define_pd_global(intx, CodeEntryAlignment, 32); + define_pd_global(intx, OptoLoopAlignment, 16); + define_pd_global(intx, InlineFrequencyCount, 100); ++define_pd_global(intx, InlineSmallCode, 1000 ); + define_pd_global(intx, PreInflateSpin, 10); + + define_pd_global(intx, StackYellowPages, 2); +--- ./hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -135,6 +135,7 @@ + + int SharedRuntime::c_calling_convention(const BasicType *sig_bt, + VMRegPair *regs, ++ VMRegPair *regs2, + int total_args_passed) { + ShouldNotCallThis(); + return 0; +--- ./hotspot/src/cpu/zero/vm/shark_globals_zero.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/cpu/zero/vm/shark_globals_zero.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -50,7 +50,6 @@ + + define_pd_global(intx, OnStackReplacePercentage, 933 ); + define_pd_global(intx, FreqInlineSize, 325 ); +-define_pd_global(intx, InlineSmallCode, 1000 ); + define_pd_global(uintx, NewRatio, 12 ); + define_pd_global(intx, NewSizeThreadIncrease, 4*K ); + define_pd_global(intx, InitialCodeCacheSize, 160*K); +--- ./hotspot/src/os/aix/vm/attachListener_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/attachListener_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,574 @@ ++/* ++ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "runtime/interfaceSupport.hpp" ++#include "runtime/os.hpp" ++#include "services/attachListener.hpp" ++#include "services/dtraceAttacher.hpp" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef UNIX_PATH_MAX ++#define UNIX_PATH_MAX sizeof(((struct sockaddr_un *)0)->sun_path) ++#endif ++ ++// The attach mechanism on Linux uses a UNIX domain socket. An attach listener ++// thread is created at startup or is created on-demand via a signal from ++// the client tool. The attach listener creates a socket and binds it to a file ++// in the filesystem. The attach listener then acts as a simple (single- ++// threaded) server - it waits for a client to connect, reads the request, ++// executes it, and returns the response to the client via the socket ++// connection. ++// ++// As the socket is a UNIX domain socket it means that only clients on the ++// local machine can connect. In addition there are two other aspects to ++// the security: ++// 1. The well known file that the socket is bound to has permission 400 ++// 2. When a client connect, the SO_PEERID socket option is used to ++// obtain the credentials of client. We check that the effective uid ++// of the client matches this process. ++ ++// forward reference ++class AixAttachOperation; ++ ++class AixAttachListener: AllStatic { ++ private: ++ // the path to which we bind the UNIX domain socket ++ static char _path[UNIX_PATH_MAX]; ++ static bool _has_path; ++ // Shutdown marker to prevent accept blocking during clean-up. ++ static bool _shutdown; ++ ++ // the file descriptor for the listening socket ++ static int _listener; ++ ++ static void set_path(char* path) { ++ if (path == NULL) { ++ _has_path = false; ++ } else { ++ strncpy(_path, path, UNIX_PATH_MAX); ++ _path[UNIX_PATH_MAX-1] = '\0'; ++ _has_path = true; ++ } ++ } ++ ++ static void set_listener(int s) { _listener = s; } ++ ++ // reads a request from the given connected socket ++ static AixAttachOperation* read_request(int s); ++ ++ public: ++ enum { ++ ATTACH_PROTOCOL_VER = 1 // protocol version ++ }; ++ enum { ++ ATTACH_ERROR_BADVERSION = 101 // error codes ++ }; ++ ++ // initialize the listener, returns 0 if okay ++ static int init(); ++ ++ static char* path() { return _path; } ++ static bool has_path() { return _has_path; } ++ static int listener() { return _listener; } ++ // Shutdown marker to prevent accept blocking during clean-up ++ static void set_shutdown(bool shutdown) { _shutdown = shutdown; } ++ static bool is_shutdown() { return _shutdown; } ++ ++ // write the given buffer to a socket ++ static int write_fully(int s, char* buf, int len); ++ ++ static AixAttachOperation* dequeue(); ++}; ++ ++class AixAttachOperation: public AttachOperation { ++ private: ++ // the connection to the client ++ int _socket; ++ ++ public: ++ void complete(jint res, bufferedStream* st); ++ ++ void set_socket(int s) { _socket = s; } ++ int socket() const { return _socket; } ++ ++ AixAttachOperation(char* name) : AttachOperation(name) { ++ set_socket(-1); ++ } ++}; ++ ++// statics ++char AixAttachListener::_path[UNIX_PATH_MAX]; ++bool AixAttachListener::_has_path; ++int AixAttachListener::_listener = -1; ++// Shutdown marker to prevent accept blocking during clean-up ++bool AixAttachListener::_shutdown = false; ++ ++// Supporting class to help split a buffer into individual components ++class ArgumentIterator : public StackObj { ++ private: ++ char* _pos; ++ char* _end; ++ public: ++ ArgumentIterator(char* arg_buffer, size_t arg_size) { ++ _pos = arg_buffer; ++ _end = _pos + arg_size - 1; ++ } ++ char* next() { ++ if (*_pos == '\0') { ++ return NULL; ++ } ++ char* res = _pos; ++ char* next_pos = strchr(_pos, '\0'); ++ if (next_pos < _end) { ++ next_pos++; ++ } ++ _pos = next_pos; ++ return res; ++ } ++}; ++ ++// On AIX if sockets block until all data has been transmitted ++// successfully in some communication domains a socket "close" may ++// never complete. We have to take care that after the socket shutdown ++// the listener never enters accept state. ++ ++// atexit hook to stop listener and unlink the file that it is ++// bound too. ++ ++// Some modifications to the listener logic to prevent deadlocks on exit. ++// 1. We Shutdown the socket here instead. AixAttachOperation::complete() is not the right place ++// since more than one agent in a sequence in JPLIS live tests wouldn't work (Listener thread ++// would be dead after the first operation completion). ++// 2. close(s) may never return if the listener thread is in socket accept(). Unlinking the file ++// should be sufficient for cleanup. ++extern "C" { ++ static void listener_cleanup() { ++ static int cleanup_done; ++ if (!cleanup_done) { ++ cleanup_done = 1; ++ AixAttachListener::set_shutdown(true); ++ int s = AixAttachListener::listener(); ++ if (s != -1) { ++ ::shutdown(s, 2); ++ } ++ if (AixAttachListener::has_path()) { ++ ::unlink(AixAttachListener::path()); ++ } ++ } ++ } ++} ++ ++// Initialization - create a listener socket and bind it to a file ++ ++int AixAttachListener::init() { ++ char path[UNIX_PATH_MAX]; // socket file ++ char initial_path[UNIX_PATH_MAX]; // socket file during setup ++ int listener; // listener socket (file descriptor) ++ ++ // register function to cleanup ++ ::atexit(listener_cleanup); ++ ++ int n = snprintf(path, UNIX_PATH_MAX, "%s/.java_pid%d", ++ os::get_temp_directory(), os::current_process_id()); ++ if (n < (int)UNIX_PATH_MAX) { ++ n = snprintf(initial_path, UNIX_PATH_MAX, "%s.tmp", path); ++ } ++ if (n >= (int)UNIX_PATH_MAX) { ++ return -1; ++ } ++ ++ // create the listener socket ++ listener = ::socket(PF_UNIX, SOCK_STREAM, 0); ++ if (listener == -1) { ++ return -1; ++ } ++ ++ // bind socket ++ struct sockaddr_un addr; ++ addr.sun_family = AF_UNIX; ++ strcpy(addr.sun_path, initial_path); ++ ::unlink(initial_path); ++ // We must call bind with the actual socketaddr length. This is obligatory for AS400. ++ int res = ::bind(listener, (struct sockaddr*)&addr, SUN_LEN(&addr)); ++ if (res == -1) { ++ RESTARTABLE(::close(listener), res); ++ return -1; ++ } ++ ++ // put in listen mode, set permissions, and rename into place ++ res = ::listen(listener, 5); ++ if (res == 0) { ++ RESTARTABLE(::chmod(initial_path, (S_IREAD|S_IWRITE) & ~(S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)), res); ++ if (res == 0) { ++ res = ::rename(initial_path, path); ++ } ++ } ++ if (res == -1) { ++ RESTARTABLE(::close(listener), res); ++ ::unlink(initial_path); ++ return -1; ++ } ++ set_path(path); ++ set_listener(listener); ++ set_shutdown(false); ++ ++ return 0; ++} ++ ++// Given a socket that is connected to a peer we read the request and ++// create an AttachOperation. As the socket is blocking there is potential ++// for a denial-of-service if the peer does not response. However this happens ++// after the peer credentials have been checked and in the worst case it just ++// means that the attach listener thread is blocked. ++// ++AixAttachOperation* AixAttachListener::read_request(int s) { ++ char ver_str[8]; ++ sprintf(ver_str, "%d", ATTACH_PROTOCOL_VER); ++ ++ // The request is a sequence of strings so we first figure out the ++ // expected count and the maximum possible length of the request. ++ // The request is: ++ // 00000 ++ // where is the protocol version (1), is the command ++ // name ("load", "datadump", ...), and is an argument ++ int expected_str_count = 2 + AttachOperation::arg_count_max; ++ const int max_len = (sizeof(ver_str) + 1) + (AttachOperation::name_length_max + 1) + ++ AttachOperation::arg_count_max*(AttachOperation::arg_length_max + 1); ++ ++ char buf[max_len]; ++ int str_count = 0; ++ ++ // Read until all (expected) strings have been read, the buffer is ++ // full, or EOF. ++ ++ int off = 0; ++ int left = max_len; ++ ++ do { ++ int n; ++ // Don't block on interrupts because this will ++ // hang in the clean-up when shutting down. ++ n = read(s, buf+off, left); ++ if (n == -1) { ++ return NULL; // reset by peer or other error ++ } ++ if (n == 0) { // end of file reached ++ break; ++ } ++ for (int i=0; i so check it now to ++ // check for protocol mis-match ++ if (str_count == 1) { ++ if ((strlen(buf) != strlen(ver_str)) || ++ (atoi(buf) != ATTACH_PROTOCOL_VER)) { ++ char msg[32]; ++ sprintf(msg, "%d\n", ATTACH_ERROR_BADVERSION); ++ write_fully(s, msg, strlen(msg)); ++ return NULL; ++ } ++ } ++ } ++ } ++ off += n; ++ left -= n; ++ } while (left > 0 && str_count < expected_str_count); ++ ++ if (str_count != expected_str_count) { ++ return NULL; // incomplete request ++ } ++ ++ // parse request ++ ++ ArgumentIterator args(buf, (max_len)-left); ++ ++ // version already checked ++ char* v = args.next(); ++ ++ char* name = args.next(); ++ if (name == NULL || strlen(name) > AttachOperation::name_length_max) { ++ return NULL; ++ } ++ ++ AixAttachOperation* op = new AixAttachOperation(name); ++ ++ for (int i=0; iset_arg(i, NULL); ++ } else { ++ if (strlen(arg) > AttachOperation::arg_length_max) { ++ delete op; ++ return NULL; ++ } ++ op->set_arg(i, arg); ++ } ++ } ++ ++ op->set_socket(s); ++ return op; ++} ++ ++ ++// Dequeue an operation ++// ++// In the Linux implementation there is only a single operation and clients ++// cannot queue commands (except at the socket level). ++// ++AixAttachOperation* AixAttachListener::dequeue() { ++ for (;;) { ++ int s; ++ ++ // wait for client to connect ++ struct sockaddr addr; ++ socklen_t len = sizeof(addr); ++ memset(&addr, 0, len); ++ // We must prevent accept blocking on the socket if it has been shut down. ++ // Therefore we allow interrups and check whether we have been shut down already. ++ if (AixAttachListener::is_shutdown()) { ++ return NULL; ++ } ++ s=::accept(listener(), &addr, &len); ++ if (s == -1) { ++ return NULL; // log a warning? ++ } ++ ++ // Added timeouts for read and write. If we get no request within the ++ // next AttachListenerTimeout milliseconds we just finish the connection. ++ struct timeval tv; ++ tv.tv_sec = 0; ++ tv.tv_usec = AttachListenerTimeout * 1000; ++ ::setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); ++ ::setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); ++ ++ // get the credentials of the peer and check the effective uid/guid ++ // - check with jeff on this. ++ struct peercred_struct cred_info; ++ socklen_t optlen = sizeof(cred_info); ++ if (::getsockopt(s, SOL_SOCKET, SO_PEERID, (void*)&cred_info, &optlen) == -1) { ++ int res; ++ RESTARTABLE(::close(s), res); ++ continue; ++ } ++ uid_t euid = geteuid(); ++ gid_t egid = getegid(); ++ ++ if (cred_info.euid != euid || cred_info.egid != egid) { ++ int res; ++ RESTARTABLE(::close(s), res); ++ continue; ++ } ++ ++ // peer credential look okay so we read the request ++ AixAttachOperation* op = read_request(s); ++ if (op == NULL) { ++ int res; ++ RESTARTABLE(::close(s), res); ++ continue; ++ } else { ++ return op; ++ } ++ } ++} ++ ++// write the given buffer to the socket ++int AixAttachListener::write_fully(int s, char* buf, int len) { ++ do { ++ int n = ::write(s, buf, len); ++ if (n == -1) { ++ if (errno != EINTR) return -1; ++ } else { ++ buf += n; ++ len -= n; ++ } ++ } ++ while (len > 0); ++ return 0; ++} ++ ++// Complete an operation by sending the operation result and any result ++// output to the client. At this time the socket is in blocking mode so ++// potentially we can block if there is a lot of data and the client is ++// non-responsive. For most operations this is a non-issue because the ++// default send buffer is sufficient to buffer everything. In the future ++// if there are operations that involves a very big reply then it the ++// socket could be made non-blocking and a timeout could be used. ++ ++void AixAttachOperation::complete(jint result, bufferedStream* st) { ++ JavaThread* thread = JavaThread::current(); ++ ThreadBlockInVM tbivm(thread); ++ ++ thread->set_suspend_equivalent(); ++ // cleared by handle_special_suspend_equivalent_condition() or ++ // java_suspend_self() via check_and_wait_while_suspended() ++ ++ // write operation result ++ char msg[32]; ++ sprintf(msg, "%d\n", result); ++ int rc = AixAttachListener::write_fully(this->socket(), msg, strlen(msg)); ++ ++ // write any result data ++ if (rc == 0) { ++ // Shutdown the socket in the cleanup function to enable more than ++ // one agent attach in a sequence (see comments to listener_cleanup()). ++ AixAttachListener::write_fully(this->socket(), (char*) st->base(), st->size()); ++ } ++ ++ // done ++ RESTARTABLE(::close(this->socket()), rc); ++ ++ // were we externally suspended while we were waiting? ++ thread->check_and_wait_while_suspended(); ++ ++ delete this; ++} ++ ++ ++// AttachListener functions ++ ++AttachOperation* AttachListener::dequeue() { ++ JavaThread* thread = JavaThread::current(); ++ ThreadBlockInVM tbivm(thread); ++ ++ thread->set_suspend_equivalent(); ++ // cleared by handle_special_suspend_equivalent_condition() or ++ // java_suspend_self() via check_and_wait_while_suspended() ++ ++ AttachOperation* op = AixAttachListener::dequeue(); ++ ++ // were we externally suspended while we were waiting? ++ thread->check_and_wait_while_suspended(); ++ ++ return op; ++} ++ ++// Performs initialization at vm startup ++// For AIX we remove any stale .java_pid file which could cause ++// an attaching process to think we are ready to receive on the ++// domain socket before we are properly initialized ++ ++void AttachListener::vm_start() { ++ char fn[UNIX_PATH_MAX]; ++ struct stat64 st; ++ int ret; ++ ++ int n = snprintf(fn, UNIX_PATH_MAX, "%s/.java_pid%d", ++ os::get_temp_directory(), os::current_process_id()); ++ assert(n < (int)UNIX_PATH_MAX, "java_pid file name buffer overflow"); ++ ++ RESTARTABLE(::stat64(fn, &st), ret); ++ if (ret == 0) { ++ ret = ::unlink(fn); ++ if (ret == -1) { ++ debug_only(warning("failed to remove stale attach pid file at %s", fn)); ++ } ++ } ++} ++ ++int AttachListener::pd_init() { ++ JavaThread* thread = JavaThread::current(); ++ ThreadBlockInVM tbivm(thread); ++ ++ thread->set_suspend_equivalent(); ++ // cleared by handle_special_suspend_equivalent_condition() or ++ // java_suspend_self() via check_and_wait_while_suspended() ++ ++ int ret_code = AixAttachListener::init(); ++ ++ // were we externally suspended while we were waiting? ++ thread->check_and_wait_while_suspended(); ++ ++ return ret_code; ++} ++ ++// Attach Listener is started lazily except in the case when ++// +ReduseSignalUsage is used ++bool AttachListener::init_at_startup() { ++ if (ReduceSignalUsage) { ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++// If the file .attach_pid exists in the working directory ++// or /tmp then this is the trigger to start the attach mechanism ++bool AttachListener::is_init_trigger() { ++ if (init_at_startup() || is_initialized()) { ++ return false; // initialized at startup or already initialized ++ } ++ char fn[PATH_MAX+1]; ++ sprintf(fn, ".attach_pid%d", os::current_process_id()); ++ int ret; ++ struct stat64 st; ++ RESTARTABLE(::stat64(fn, &st), ret); ++ if (ret == -1) { ++ snprintf(fn, sizeof(fn), "%s/.attach_pid%d", ++ os::get_temp_directory(), os::current_process_id()); ++ RESTARTABLE(::stat64(fn, &st), ret); ++ } ++ if (ret == 0) { ++ // simple check to avoid starting the attach mechanism when ++ // a bogus user creates the file ++ if (st.st_uid == geteuid()) { ++ init(); ++ return true; ++ } ++ } ++ return false; ++} ++ ++// if VM aborts then remove listener ++void AttachListener::abort() { ++ listener_cleanup(); ++} ++ ++void AttachListener::pd_data_dump() { ++ os::signal_notify(SIGQUIT); ++} ++ ++AttachOperationFunctionInfo* AttachListener::pd_find_operation(const char* n) { ++ return NULL; ++} ++ ++jint AttachListener::pd_set_flag(AttachOperation* op, outputStream* out) { ++ out->print_cr("flag '%s' cannot be changed", op->arg(0)); ++ return JNI_ERR; ++} ++ ++void AttachListener::pd_detachall() { ++ // Cleanup server socket to detach clients. ++ listener_cleanup(); ++} +--- ./hotspot/src/os/aix/vm/c2_globals_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/c2_globals_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_AIX_VM_C2_GLOBALS_AIX_HPP ++#define OS_AIX_VM_C2_GLOBALS_AIX_HPP ++ ++#include "utilities/globalDefinitions.hpp" ++#include "utilities/macros.hpp" ++ ++// ++// Sets the default values for operating system dependent flags used by the ++// server compiler. (see c2_globals.hpp) ++// ++ ++#endif // OS_AIX_VM_C2_GLOBALS_AIX_HPP +--- ./hotspot/src/os/aix/vm/decoder_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/decoder_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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 "utilities/decoder.hpp" ++#include "porting_aix.hpp" ++ ++// Provide simple AIXDecoder which enables decoding of C frames in VM. ++class AIXDecoder: public AbstractDecoder { ++ public: ++ AIXDecoder() { ++ _decoder_status = no_error; ++ } ++ ~AIXDecoder() {} ++ ++ virtual bool can_decode_C_frame_in_vm() const { return true; } ++ ++ virtual bool demangle(const char* symbol, char* buf, int buflen) { return false; } // demangled by getFuncName ++ ++ virtual bool decode(address addr, char* buf, int buflen, int* offset, const char* modulepath) { ++ return (::getFuncName((codeptr_t)addr, buf, buflen, offset, 0, 0, 0) == 0); ++ } ++ virtual bool decode(address addr, char *buf, int buflen, int* offset, const void *base) { ++ ShouldNotReachHere(); ++ return false; ++ } ++}; +--- ./hotspot/src/os/aix/vm/globals_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/globals_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_AIX_VM_GLOBALS_AIX_HPP ++#define OS_AIX_VM_GLOBALS_AIX_HPP ++ ++// ++// Defines Aix specific flags. They are not available on other platforms. ++// ++#define RUNTIME_OS_FLAGS(develop, develop_pd, product, product_pd, diagnostic, notproduct) \ ++ \ ++ /* If UseLargePages == true allow or deny usage of 16M pages. 16M pages are */ \ ++ /* a scarce resource and there may be situations where we do not want the VM */ \ ++ /* to run with 16M pages. (Will fall back to 64K pages). */ \ ++ product_pd(bool, Use16MPages, \ ++ "Use 16M pages if available.") \ ++ \ ++ /* use optimized addresses for the polling page, */ \ ++ /* e.g. map it to a special 32-bit address. */ \ ++ product_pd(bool, OptimizePollingPageLocation, \ ++ "Optimize the location of the polling page used for Safepoints") \ ++ \ ++ product_pd(intx, AttachListenerTimeout, \ ++ "Timeout in ms the attach listener waits for a request") \ ++ \ ++ ++// Per default, do not allow 16M pages. 16M pages have to be switched on specifically. ++define_pd_global(bool, Use16MPages, false); ++define_pd_global(bool, OptimizePollingPageLocation, true); ++define_pd_global(intx, AttachListenerTimeout, 1000); ++ ++// ++// Defines Aix-specific default values. The flags are available on all ++// platforms, but they may have different default values on other platforms. ++// ++define_pd_global(bool, UseLargePages, true); ++define_pd_global(bool, UseLargePagesIndividualAllocation, false); ++define_pd_global(bool, UseOSErrorReporting, false); ++define_pd_global(bool, UseThreadPriorities, true) ; ++ ++#endif // OS_AIX_VM_GLOBALS_AIX_HPP +--- ./hotspot/src/os/aix/vm/interfaceSupport_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/interfaceSupport_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_LINUX_VM_INTERFACESUPPORT_LINUX_HPP ++#define OS_LINUX_VM_INTERFACESUPPORT_LINUX_HPP ++ ++// Contains inlined functions for class InterfaceSupport ++ ++static inline void serialize_memory(JavaThread *thread) { ++ os::write_memory_serialize_page(thread); ++} ++ ++#endif // OS_LINUX_VM_INTERFACESUPPORT_LINUX_HPP +--- ./hotspot/src/os/aix/vm/jsig.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/jsig.c Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,233 @@ ++/* ++ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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. ++ * ++ */ ++ ++/* CopyrightVersion 1.2 */ ++ ++/* This is a special library that should be loaded before libc & ++ * libthread to interpose the signal handler installation functions: ++ * sigaction(), signal(), sigset(). ++ * Used for signal-chaining. See RFE 4381843. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define bool int ++#define true 1 ++#define false 0 ++ ++// Highest so far on AIX 5.2 is SIGSAK (63) ++#define MAXSIGNUM 63 ++#define MASK(sig) ((unsigned int)1 << sig) ++ ++static struct sigaction sact[MAXSIGNUM]; /* saved signal handlers */ ++static unsigned int jvmsigs = 0; /* signals used by jvm */ ++ ++/* used to synchronize the installation of signal handlers */ ++static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; ++static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; ++static pthread_t tid = 0; ++ ++typedef void (*sa_handler_t)(int); ++typedef void (*sa_sigaction_t)(int, siginfo_t *, void *); ++// signal_t is already defined on AIX ++typedef sa_handler_t (*signal_like_function_t)(int, sa_handler_t); ++typedef int (*sigaction_t)(int, const struct sigaction *, struct sigaction *); ++ ++static signal_like_function_t os_signal = 0; /* os's version of signal()/sigset() */ ++static sigaction_t os_sigaction = 0; /* os's version of sigaction() */ ++ ++static bool jvm_signal_installing = false; ++static bool jvm_signal_installed = false; ++ ++static void signal_lock() { ++ pthread_mutex_lock(&mutex); ++ /* When the jvm is installing its set of signal handlers, threads ++ * other than the jvm thread should wait */ ++ if (jvm_signal_installing) { ++ if (tid != pthread_self()) { ++ pthread_cond_wait(&cond, &mutex); ++ } ++ } ++} ++ ++static void signal_unlock() { ++ pthread_mutex_unlock(&mutex); ++} ++ ++static sa_handler_t call_os_signal(int sig, sa_handler_t disp, ++ bool is_sigset) { ++ if (os_signal == NULL) { ++ if (!is_sigset) { ++ // Aix: call functions directly instead of dlsym'ing them ++ os_signal = signal; ++ } else { ++ // Aix: call functions directly instead of dlsym'ing them ++ os_signal = sigset; ++ } ++ if (os_signal == NULL) { ++ printf("%s\n", dlerror()); ++ exit(0); ++ } ++ } ++ return (*os_signal)(sig, disp); ++} ++ ++static void save_signal_handler(int sig, sa_handler_t disp) { ++ sigset_t set; ++ sact[sig].sa_handler = disp; ++ sigemptyset(&set); ++ sact[sig].sa_mask = set; ++ sact[sig].sa_flags = 0; ++} ++ ++static sa_handler_t set_signal(int sig, sa_handler_t disp, bool is_sigset) { ++ sa_handler_t oldhandler; ++ bool sigused; ++ ++ signal_lock(); ++ ++ sigused = (MASK(sig) & jvmsigs) != 0; ++ if (jvm_signal_installed && sigused) { ++ /* jvm has installed its signal handler for this signal. */ ++ /* Save the handler. Don't really install it. */ ++ oldhandler = sact[sig].sa_handler; ++ save_signal_handler(sig, disp); ++ ++ signal_unlock(); ++ return oldhandler; ++ } else if (jvm_signal_installing) { ++ /* jvm is installing its signal handlers. Install the new ++ * handlers and save the old ones. jvm uses sigaction(). ++ * Leave the piece here just in case. */ ++ oldhandler = call_os_signal(sig, disp, is_sigset); ++ save_signal_handler(sig, oldhandler); ++ ++ /* Record the signals used by jvm */ ++ jvmsigs |= MASK(sig); ++ ++ signal_unlock(); ++ return oldhandler; ++ } else { ++ /* jvm has no relation with this signal (yet). Install the ++ * the handler. */ ++ oldhandler = call_os_signal(sig, disp, is_sigset); ++ ++ signal_unlock(); ++ return oldhandler; ++ } ++} ++ ++sa_handler_t signal(int sig, sa_handler_t disp) { ++ return set_signal(sig, disp, false); ++} ++ ++sa_handler_t sigset(int sig, sa_handler_t disp) { ++ return set_signal(sig, disp, true); ++ } ++ ++static int call_os_sigaction(int sig, const struct sigaction *act, ++ struct sigaction *oact) { ++ if (os_sigaction == NULL) { ++ // Aix: call functions directly instead of dlsym'ing them ++ os_sigaction = sigaction; ++ if (os_sigaction == NULL) { ++ printf("%s\n", dlerror()); ++ exit(0); ++ } ++ } ++ return (*os_sigaction)(sig, act, oact); ++} ++ ++int sigaction(int sig, const struct sigaction *act, struct sigaction *oact) { ++ int res; ++ bool sigused; ++ struct sigaction oldAct; ++ ++ signal_lock(); ++ ++ sigused = (MASK(sig) & jvmsigs) != 0; ++ if (jvm_signal_installed && sigused) { ++ /* jvm has installed its signal handler for this signal. */ ++ /* Save the handler. Don't really install it. */ ++ if (oact != NULL) { ++ *oact = sact[sig]; ++ } ++ if (act != NULL) { ++ sact[sig] = *act; ++ } ++ ++ signal_unlock(); ++ return 0; ++ } else if (jvm_signal_installing) { ++ /* jvm is installing its signal handlers. Install the new ++ * handlers and save the old ones. */ ++ res = call_os_sigaction(sig, act, &oldAct); ++ sact[sig] = oldAct; ++ if (oact != NULL) { ++ *oact = oldAct; ++ } ++ ++ /* Record the signals used by jvm */ ++ jvmsigs |= MASK(sig); ++ ++ signal_unlock(); ++ return res; ++ } else { ++ /* jvm has no relation with this signal (yet). Install the ++ * the handler. */ ++ res = call_os_sigaction(sig, act, oact); ++ ++ signal_unlock(); ++ return res; ++ } ++} ++ ++/* The three functions for the jvm to call into */ ++void JVM_begin_signal_setting() { ++ signal_lock(); ++ jvm_signal_installing = true; ++ tid = pthread_self(); ++ signal_unlock(); ++} ++ ++void JVM_end_signal_setting() { ++ signal_lock(); ++ jvm_signal_installed = true; ++ jvm_signal_installing = false; ++ pthread_cond_broadcast(&cond); ++ signal_unlock(); ++} ++ ++struct sigaction *JVM_get_signal_action(int sig) { ++ /* Does race condition make sense here? */ ++ if ((MASK(sig) & jvmsigs) != 0) { ++ return &sact[sig]; ++ } ++ return NULL; ++} +--- ./hotspot/src/os/aix/vm/jvm_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/jvm_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,201 @@ ++/* ++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "prims/jvm.h" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/osThread.hpp" ++ ++#include ++ ++ ++// sun.misc.Signal /////////////////////////////////////////////////////////// ++// Signal code is mostly copied from classic vm, signals_md.c 1.4 98/08/23 ++/* ++ * This function is included primarily as a debugging aid. If Java is ++ * running in a console window, then pressing will cause ++ * the current state of all active threads and monitors to be written ++ * to the console window. ++ */ ++ ++JVM_ENTRY_NO_ENV(void*, JVM_RegisterSignal(jint sig, void* handler)) ++ // Copied from classic vm ++ // signals_md.c 1.4 98/08/23 ++ void* newHandler = handler == (void *)2 ++ ? os::user_handler() ++ : handler; ++ switch (sig) { ++ /* The following are already used by the VM. */ ++ case INTERRUPT_SIGNAL: ++ case SIGFPE: ++ case SIGILL: ++ case SIGSEGV: ++ ++ /* The following signal is used by the VM to dump thread stacks unless ++ ReduceSignalUsage is set, in which case the user is allowed to set ++ his own _native_ handler for this signal; thus, in either case, ++ we do not allow JVM_RegisterSignal to change the handler. */ ++ case BREAK_SIGNAL: ++ return (void *)-1; ++ ++ /* The following signals are used for Shutdown Hooks support. However, if ++ ReduceSignalUsage (-Xrs) is set, Shutdown Hooks must be invoked via ++ System.exit(), Java is not allowed to use these signals, and the the ++ user is allowed to set his own _native_ handler for these signals and ++ invoke System.exit() as needed. Terminator.setup() is avoiding ++ registration of these signals when -Xrs is present. ++ - If the HUP signal is ignored (from the nohup) command, then Java ++ is not allowed to use this signal. ++ */ ++ ++ case SHUTDOWN1_SIGNAL: ++ case SHUTDOWN2_SIGNAL: ++ case SHUTDOWN3_SIGNAL: ++ if (ReduceSignalUsage) return (void*)-1; ++ if (os::Aix::is_sig_ignored(sig)) return (void*)1; ++ } ++ ++ void* oldHandler = os::signal(sig, newHandler); ++ if (oldHandler == os::user_handler()) { ++ return (void *)2; ++ } else { ++ return oldHandler; ++ } ++JVM_END ++ ++ ++JVM_ENTRY_NO_ENV(jboolean, JVM_RaiseSignal(jint sig)) ++ if (ReduceSignalUsage) { ++ // do not allow SHUTDOWN1_SIGNAL,SHUTDOWN2_SIGNAL,SHUTDOWN3_SIGNAL, ++ // BREAK_SIGNAL to be raised when ReduceSignalUsage is set, since ++ // no handler for them is actually registered in JVM or via ++ // JVM_RegisterSignal. ++ if (sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL || ++ sig == SHUTDOWN3_SIGNAL || sig == BREAK_SIGNAL) { ++ return JNI_FALSE; ++ } ++ } ++ else if ((sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL || ++ sig == SHUTDOWN3_SIGNAL) && os::Aix::is_sig_ignored(sig)) { ++ // do not allow SHUTDOWN1_SIGNAL to be raised when SHUTDOWN1_SIGNAL ++ // is ignored, since no handler for them is actually registered in JVM ++ // or via JVM_RegisterSignal. ++ // This also applies for SHUTDOWN2_SIGNAL and SHUTDOWN3_SIGNAL ++ return JNI_FALSE; ++ } ++ ++ os::signal_raise(sig); ++ return JNI_TRUE; ++JVM_END ++ ++/* ++ All the defined signal names for Linux. ++ ++ NOTE that not all of these names are accepted by our Java implementation ++ ++ Via an existing claim by the VM, sigaction restrictions, or ++ the "rules of Unix" some of these names will be rejected at runtime. ++ For example the VM sets up to handle USR1, sigaction returns EINVAL for ++ STOP, and Linux simply doesn't allow catching of KILL. ++ ++ Here are the names currently accepted by a user of sun.misc.Signal with ++ 1.4.1 (ignoring potential interaction with use of chaining, etc): ++ ++ HUP, INT, TRAP, ABRT, IOT, BUS, USR2, PIPE, ALRM, TERM, STKFLT, ++ CLD, CHLD, CONT, TSTP, TTIN, TTOU, URG, XCPU, XFSZ, VTALRM, PROF, ++ WINCH, POLL, IO, PWR, SYS ++ ++*/ ++ ++struct siglabel { ++ const char *name; ++ int number; ++}; ++ ++struct siglabel siglabels[] = { ++ /* derived from /usr/include/bits/signum.h on RH7.2 */ ++ "HUP", SIGHUP, /* Hangup (POSIX). */ ++ "INT", SIGINT, /* Interrupt (ANSI). */ ++ "QUIT", SIGQUIT, /* Quit (POSIX). */ ++ "ILL", SIGILL, /* Illegal instruction (ANSI). */ ++ "TRAP", SIGTRAP, /* Trace trap (POSIX). */ ++ "ABRT", SIGABRT, /* Abort (ANSI). */ ++ "IOT", SIGIOT, /* IOT trap (4.2 BSD). */ ++ "BUS", SIGBUS, /* BUS error (4.2 BSD). */ ++ "FPE", SIGFPE, /* Floating-point exception (ANSI). */ ++ "KILL", SIGKILL, /* Kill, unblockable (POSIX). */ ++ "USR1", SIGUSR1, /* User-defined signal 1 (POSIX). */ ++ "SEGV", SIGSEGV, /* Segmentation violation (ANSI). */ ++ "USR2", SIGUSR2, /* User-defined signal 2 (POSIX). */ ++ "PIPE", SIGPIPE, /* Broken pipe (POSIX). */ ++ "ALRM", SIGALRM, /* Alarm clock (POSIX). */ ++ "TERM", SIGTERM, /* Termination (ANSI). */ ++#ifdef SIGSTKFLT ++ "STKFLT", SIGSTKFLT, /* Stack fault. */ ++#endif ++ "CLD", SIGCLD, /* Same as SIGCHLD (System V). */ ++ "CHLD", SIGCHLD, /* Child status has changed (POSIX). */ ++ "CONT", SIGCONT, /* Continue (POSIX). */ ++ "STOP", SIGSTOP, /* Stop, unblockable (POSIX). */ ++ "TSTP", SIGTSTP, /* Keyboard stop (POSIX). */ ++ "TTIN", SIGTTIN, /* Background read from tty (POSIX). */ ++ "TTOU", SIGTTOU, /* Background write to tty (POSIX). */ ++ "URG", SIGURG, /* Urgent condition on socket (4.2 BSD). */ ++ "XCPU", SIGXCPU, /* CPU limit exceeded (4.2 BSD). */ ++ "XFSZ", SIGXFSZ, /* File size limit exceeded (4.2 BSD). */ ++ "DANGER", SIGDANGER, /* System crash imminent; free up some page space (AIX). */ ++ "VTALRM", SIGVTALRM, /* Virtual alarm clock (4.2 BSD). */ ++ "PROF", SIGPROF, /* Profiling alarm clock (4.2 BSD). */ ++ "WINCH", SIGWINCH, /* Window size change (4.3 BSD, Sun). */ ++ "POLL", SIGPOLL, /* Pollable event occurred (System V). */ ++ "IO", SIGIO, /* I/O now possible (4.2 BSD). */ ++ "PWR", SIGPWR, /* Power failure restart (System V). */ ++#ifdef SIGSYS ++ "SYS", SIGSYS /* Bad system call. Only on some Linuxen! */ ++#endif ++ }; ++ ++JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name)) ++ ++ /* find and return the named signal's number */ ++ ++ for(uint i=0; i /* For DIR */ ++ ++// Must redefine NULL because the macro gets redefined to int 0 ++// by dirent.h. This redefinition is included later then the standard definition in ++// globalDefinitions_.hpp and leads to assertions in the VM initialization. ++// We definitely need NULL to have the same lengh as an address pointer. ++#ifdef _LP64 ++#undef NULL ++#define NULL 0L ++#else ++#ifndef NULL ++#define NULL 0 ++#endif ++#endif ++ ++#include /* For MAXPATHLEN */ ++#include /* For socklen_t */ ++#include /* For F_OK, R_OK, W_OK */ ++ ++#define JNI_ONLOAD_SYMBOLS {"JNI_OnLoad"} ++#define JNI_ONUNLOAD_SYMBOLS {"JNI_OnUnload"} ++#define JVM_ONLOAD_SYMBOLS {"JVM_OnLoad"} ++#define AGENT_ONLOAD_SYMBOLS {"Agent_OnLoad"} ++#define AGENT_ONUNLOAD_SYMBOLS {"Agent_OnUnload"} ++#define AGENT_ONATTACH_SYMBOLS {"Agent_OnAttach"} ++ ++#define JNI_LIB_PREFIX "lib" ++#define JNI_LIB_SUFFIX ".so" ++ ++// Hack: MAXPATHLEN is 4095 on some Linux and 4096 on others. This may ++// cause problems if JVM and the rest of JDK are built on different ++// Linux releases. Here we define JVM_MAXPATHLEN to be MAXPATHLEN + 1, ++// so buffers declared in VM are always >= 4096. ++#define JVM_MAXPATHLEN MAXPATHLEN + 1 ++ ++#define JVM_R_OK R_OK ++#define JVM_W_OK W_OK ++#define JVM_X_OK X_OK ++#define JVM_F_OK F_OK ++ ++/* ++ * File I/O ++ */ ++ ++#include ++#include ++#include ++#include ++ ++/* O Flags */ ++ ++#define JVM_O_RDONLY O_RDONLY ++#define JVM_O_WRONLY O_WRONLY ++#define JVM_O_RDWR O_RDWR ++#define JVM_O_O_APPEND O_APPEND ++#define JVM_O_EXCL O_EXCL ++#define JVM_O_CREAT O_CREAT ++ ++/* Signal definitions */ ++ ++#define BREAK_SIGNAL SIGQUIT /* Thread dumping support. */ ++#define INTERRUPT_SIGNAL SIGUSR1 /* Interruptible I/O support. */ ++#define SHUTDOWN1_SIGNAL SIGHUP /* Shutdown Hooks support. */ ++#define SHUTDOWN2_SIGNAL SIGINT ++#define SHUTDOWN3_SIGNAL SIGTERM ++ ++#endif /* JVM_MD_H */ ++ ++#endif // OS_AIX_VM_JVM_AIX_H +--- ./hotspot/src/os/aix/vm/libperfstat_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/libperfstat_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,124 @@ ++/* ++ * Copyright 2012, 2013 SAP AG. 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 "runtime/arguments.hpp" ++#include "libperfstat_aix.hpp" ++ ++// For dlopen and friends ++#include ++ ++// handle to the libperfstat ++static void* g_libhandle = NULL; ++ ++// whether initialization worked ++static bool g_initialized = false; ++ ++ ++typedef int (*fun_perfstat_cpu_total_t) (perfstat_id_t *name, perfstat_cpu_total_t* userbuff, ++ int sizeof_userbuff, int desired_number); ++ ++typedef int (*fun_perfstat_memory_total_t) (perfstat_id_t *name, perfstat_memory_total_t* userbuff, ++ int sizeof_userbuff, int desired_number); ++ ++typedef void (*fun_perfstat_reset_t) (); ++ ++static fun_perfstat_cpu_total_t g_fun_perfstat_cpu_total = NULL; ++static fun_perfstat_memory_total_t g_fun_perfstat_memory_total = NULL; ++static fun_perfstat_reset_t g_fun_perfstat_reset = NULL; ++ ++bool libperfstat::init() { ++ ++ if (g_initialized) { ++ return true; ++ } ++ ++ g_initialized = false; ++ ++ // dynamically load the libperfstat porting library. ++ g_libhandle = dlopen("/usr/lib/libperfstat.a(shr_64.o)", RTLD_MEMBER | RTLD_NOW); ++ if (!g_libhandle) { ++ if (Verbose) { ++ fprintf(stderr, "Cannot load libperfstat.a (dlerror: %s)", dlerror()); ++ } ++ return false; ++ } ++ ++ // resolve function pointers ++ ++#define RESOLVE_FUN_NO_ERROR(name) \ ++ g_fun_##name = (fun_##name##_t) dlsym(g_libhandle, #name); ++ ++#define RESOLVE_FUN(name) \ ++ RESOLVE_FUN_NO_ERROR(name) \ ++ if (!g_fun_##name) { \ ++ if (Verbose) { \ ++ fprintf(stderr, "Cannot resolve " #name "() from libperfstat.a\n" \ ++ " (dlerror: %s)", dlerror()); \ ++ } \ ++ return false; \ ++ } ++ ++ RESOLVE_FUN(perfstat_cpu_total); ++ RESOLVE_FUN(perfstat_memory_total); ++ RESOLVE_FUN(perfstat_reset); ++ ++ g_initialized = true; ++ ++ return true; ++} ++ ++void libperfstat::cleanup() { ++ ++ g_initialized = false; ++ ++ if (g_libhandle) { ++ dlclose(g_libhandle); ++ g_libhandle = NULL; ++ } ++ ++ g_fun_perfstat_cpu_total = NULL; ++ g_fun_perfstat_memory_total = NULL; ++ g_fun_perfstat_reset = NULL; ++} ++ ++int libperfstat::perfstat_memory_total(perfstat_id_t *name, ++ perfstat_memory_total_t* userbuff, ++ int sizeof_userbuff, int desired_number) { ++ assert(g_initialized, "libperfstat not initialized"); ++ assert(g_fun_perfstat_memory_total, ""); ++ return g_fun_perfstat_memory_total(name, userbuff, sizeof_userbuff, desired_number); ++} ++ ++int libperfstat::perfstat_cpu_total(perfstat_id_t *name, perfstat_cpu_total_t* userbuff, ++ int sizeof_userbuff, int desired_number) { ++ assert(g_initialized, "libperfstat not initialized"); ++ assert(g_fun_perfstat_cpu_total, ""); ++ return g_fun_perfstat_cpu_total(name, userbuff, sizeof_userbuff, desired_number); ++} ++ ++void libperfstat::perfstat_reset() { ++ assert(g_initialized, "libperfstat not initialized"); ++ assert(g_fun_perfstat_reset, ""); ++ g_fun_perfstat_reset(); ++} +--- ./hotspot/src/os/aix/vm/libperfstat_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/libperfstat_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,59 @@ ++/* ++ * Copyright 2012, 2013 SAP AG. 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. ++ * ++ */ ++ ++// encapsulates the libperfstat library. ++// ++// The purpose of this code is to dynamically load the libperfstat library ++// instead of statically linking against it. The libperfstat library is an ++// AIX-specific library which only exists on AIX, not on PASE. If I want to ++// share binaries between AIX and PASE, I cannot directly link against libperfstat.so. ++ ++#ifndef OS_AIX_VM_LIBPERFSTAT_AIX_HPP ++#define OS_AIX_VM_LIBPERFSTAT_AIX_HPP ++ ++#include ++ ++class libperfstat { ++ ++public: ++ ++ // Load the libperfstat library (must be in LIBPATH). ++ // Returns true if succeeded, false if error. ++ static bool init(); ++ ++ // cleanup of the libo4 porting library. ++ static void cleanup(); ++ ++ // direct wrappers for the libperfstat functionality. All they do is ++ // to call the functions with the same name via function pointers. ++ static int perfstat_cpu_total(perfstat_id_t *name, perfstat_cpu_total_t* userbuff, ++ int sizeof_userbuff, int desired_number); ++ ++ static int perfstat_memory_total(perfstat_id_t *name, perfstat_memory_total_t* userbuff, ++ int sizeof_userbuff, int desired_number); ++ ++ static void perfstat_reset(); ++}; ++ ++#endif // OS_AIX_VM_LIBPERFSTAT_AIX_HPP +--- ./hotspot/src/os/aix/vm/loadlib_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/loadlib_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,185 @@ ++/* ++ * Copyright 2012, 2013 SAP AG. 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. ++ * ++ */ ++ ++ ++// Implementation of LoadedLibraries and friends ++ ++// Ultimately this just uses loadquery() ++// See: ++// http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp ++// ?topic=/com.ibm.aix.basetechref/doc/basetrf1/loadquery.htm ++ ++#ifndef __STDC_FORMAT_MACROS ++#define __STDC_FORMAT_MACROS ++#endif ++// 'allocation.inline.hpp' triggers the inclusion of 'inttypes.h' which defines macros ++// required by the definitions in 'globalDefinitions.hpp'. But these macros in 'inttypes.h' ++// are only defined if '__STDC_FORMAT_MACROS' is defined! ++#include "memory/allocation.inline.hpp" ++#include "oops/oop.inline.hpp" ++#include "runtime/threadCritical.hpp" ++#include "utilities/debug.hpp" ++#include "utilities/ostream.hpp" ++#include "loadlib_aix.hpp" ++#include "porting_aix.hpp" ++ ++// For loadquery() ++#include ++ ++/////////////////////////////////////////////////////////////////////////////// ++// Implementation for LoadedLibraryModule ++ ++// output debug info ++void LoadedLibraryModule::print(outputStream* os) const { ++ os->print("%15.15s: text: " INTPTR_FORMAT " - " INTPTR_FORMAT ++ ", data: " INTPTR_FORMAT " - " INTPTR_FORMAT " ", ++ shortname, text_from, text_to, data_from, data_to); ++ os->print(" %s", fullpath); ++ if (strlen(membername) > 0) { ++ os->print("(%s)", membername); ++ } ++ os->cr(); ++} ++ ++ ++/////////////////////////////////////////////////////////////////////////////// ++// Implementation for LoadedLibraries ++ ++// class variables ++LoadedLibraryModule LoadedLibraries::tab[MAX_MODULES]; ++int LoadedLibraries::num_loaded = 0; ++ ++// Checks whether the address p points to any of the loaded code segments. ++// If it does, returns the LoadedLibraryModule entry. If not, returns NULL. ++// static ++const LoadedLibraryModule* LoadedLibraries::find_for_text_address(const unsigned char* p) { ++ ++ if (num_loaded == 0) { ++ reload(); ++ } ++ for (int i = 0; i < num_loaded; i++) { ++ if (tab[i].is_in_text(p)) { ++ return &tab[i]; ++ } ++ } ++ return NULL; ++} ++ ++// Checks whether the address p points to any of the loaded data segments. ++// If it does, returns the LoadedLibraryModule entry. If not, returns NULL. ++// static ++const LoadedLibraryModule* LoadedLibraries::find_for_data_address(const unsigned char* p) { ++ if (num_loaded == 0) { ++ reload(); ++ } ++ for (int i = 0; i < num_loaded; i++) { ++ if (tab[i].is_in_data(p)) { ++ return &tab[i]; ++ } ++ } ++ return NULL; ++} ++ ++// Rebuild the internal table of LoadedLibraryModule objects ++// static ++void LoadedLibraries::reload() { ++ ++ ThreadCritical cs; ++ ++ // discard old content ++ num_loaded = 0; ++ ++ // Call loadquery(L_GETINFO..) to get a list of all loaded Dlls from AIX. ++ size_t buf_size = 4096; ++ char* loadquery_buf = AllocateHeap(buf_size, mtInternal); ++ ++ while(loadquery(L_GETINFO, loadquery_buf, buf_size) == -1) { ++ if (errno == ENOMEM) { ++ buf_size *= 2; ++ loadquery_buf = ReallocateHeap(loadquery_buf, buf_size, mtInternal); ++ } else { ++ FreeHeap(loadquery_buf); ++ // Ensure that the uintptr_t pointer is valid ++ assert(errno != EFAULT, "loadquery: Invalid uintptr_t in info buffer."); ++ fprintf(stderr, "loadquery failed (%d %s)", errno, strerror(errno)); ++ return; ++ } ++ } ++ ++ // Iterate over the loadquery result. For details see sys/ldr.h on AIX. ++ const struct ld_info* p = (struct ld_info*) loadquery_buf; ++ ++ // Ensure we have all loaded libs. ++ bool all_loaded = false; ++ while(num_loaded < MAX_MODULES) { ++ LoadedLibraryModule& mod = tab[num_loaded]; ++ mod.text_from = (const unsigned char*) p->ldinfo_textorg; ++ mod.text_to = (const unsigned char*) (((char*)p->ldinfo_textorg) + p->ldinfo_textsize); ++ mod.data_from = (const unsigned char*) p->ldinfo_dataorg; ++ mod.data_to = (const unsigned char*) (((char*)p->ldinfo_dataorg) + p->ldinfo_datasize); ++ sprintf(mod.fullpath, "%.*s", sizeof(mod.fullpath), p->ldinfo_filename); ++ // do we have a member name as well (see ldr.h)? ++ const char* p_mbr_name = p->ldinfo_filename + strlen(p->ldinfo_filename) + 1; ++ if (*p_mbr_name) { ++ sprintf(mod.membername, "%.*s", sizeof(mod.membername), p_mbr_name); ++ } else { ++ mod.membername[0] = '\0'; ++ } ++ ++ // fill in the short name ++ const char* p_slash = strrchr(mod.fullpath, '/'); ++ if (p_slash) { ++ sprintf(mod.shortname, "%.*s", sizeof(mod.shortname), p_slash + 1); ++ } else { ++ sprintf(mod.shortname, "%.*s", sizeof(mod.shortname), mod.fullpath); ++ } ++ num_loaded ++; ++ ++ // next entry... ++ if (p->ldinfo_next) { ++ p = (struct ld_info*)(((char*)p) + p->ldinfo_next); ++ } else { ++ all_loaded = true; ++ break; ++ } ++ } ++ ++ FreeHeap(loadquery_buf); ++ ++ // Ensure we have all loaded libs ++ assert(all_loaded, "loadquery returned more entries then expected. Please increase MAX_MODULES"); ++ ++} // end LoadedLibraries::reload() ++ ++ ++// output loaded libraries table ++//static ++void LoadedLibraries::print(outputStream* os) { ++ ++ for (int i = 0; i < num_loaded; i++) { ++ tab[i].print(os); ++ } ++ ++} ++ +--- ./hotspot/src/os/aix/vm/loadlib_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/loadlib_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,128 @@ ++/* ++ * Copyright 2012, 2013 SAP AG. 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. ++ * ++ */ ++ ++ ++// Loadlib_aix.cpp contains support code for analysing the memory ++// layout of loaded binaries in ones own process space. ++// ++// It is needed, among other things, to provide a dladdr() emulation, because ++// that one is not provided by AIX ++ ++#ifndef OS_AIX_VM_LOADLIB_AIX_HPP ++#define OS_AIX_VM_LOADLIB_AIX_HPP ++ ++class outputStream; ++ ++// This class holds information about a single loaded library module. ++// Note that on AIX, a single library can be spread over multiple ++// uintptr_t range on a module base, eg. ++// libC.a(shr3_64.o) or libC.a(shrcore_64.o). ++class LoadedLibraryModule { ++ ++ friend class LoadedLibraries; ++ ++ char fullpath[512]; // eg /usr/lib/libC.a ++ char shortname[30]; // eg libC.a ++ char membername[30]; // eg shrcore_64.o ++ const unsigned char* text_from; ++ const unsigned char* text_to; ++ const unsigned char* data_from; ++ const unsigned char* data_to; ++ ++ public: ++ ++ const char* get_fullpath() const { ++ return fullpath; ++ } ++ const char* get_shortname() const { ++ return shortname; ++ } ++ const char* get_membername() const { ++ return membername; ++ } ++ ++ // text_from, text_to: returns the range of the text (code) ++ // segment for that module ++ const unsigned char* get_text_from() const { ++ return text_from; ++ } ++ const unsigned char* get_text_to() const { ++ return text_to; ++ } ++ ++ // data_from/data_to: returns the range of the data ++ // segment for that module ++ const unsigned char* get_data_from() const { ++ return data_from; ++ } ++ const unsigned char* get_data_to() const { ++ return data_to; ++ } ++ ++ // returns true if the ++ bool is_in_text(const unsigned char* p) const { ++ return p >= text_from && p < text_to ? true : false; ++ } ++ ++ bool is_in_data(const unsigned char* p) const { ++ return p >= data_from && p < data_to ? true : false; ++ } ++ ++ // output debug info ++ void print(outputStream* os) const; ++ ++}; // end LoadedLibraryModule ++ ++// This class is a singleton holding a map of all loaded binaries ++// in the AIX process space. ++class LoadedLibraries ++// : AllStatic (including allocation.hpp just for AllStatic is overkill.) ++{ ++ ++ private: ++ ++ enum {MAX_MODULES = 100}; ++ static LoadedLibraryModule tab[MAX_MODULES]; ++ static int num_loaded; ++ ++ public: ++ ++ // rebuild the internal table of LoadedLibraryModule objects ++ static void reload(); ++ ++ // checks whether the address p points to any of the loaded code segments. ++ // If it does, returns the LoadedLibraryModule entry. If not, returns NULL. ++ static const LoadedLibraryModule* find_for_text_address(const unsigned char* p); ++ ++ // checks whether the address p points to any of the loaded data segments. ++ // If it does, returns the LoadedLibraryModule entry. If not, returns NULL. ++ static const LoadedLibraryModule* find_for_data_address(const unsigned char* p); ++ ++ // output debug info ++ static void print(outputStream* os); ++ ++}; // end LoadedLibraries ++ ++ ++#endif // OS_AIX_VM_LOADLIB_AIX_HPP +--- ./hotspot/src/os/aix/vm/mutex_aix.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/mutex_aix.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,33 @@ ++/* ++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 OS_AIX_VM_MUTEX_AIX_INLINE_HPP ++#define OS_AIX_VM_MUTEX_AIX_INLINE_HPP ++ ++#include "os_aix.inline.hpp" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/thread.inline.hpp" ++ ++#endif // OS_AIX_VM_MUTEX_AIX_INLINE_HPP +--- ./hotspot/src/os/aix/vm/osThread_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/osThread_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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. ++ * ++ */ ++ ++// no precompiled headers ++#include "runtime/atomic.hpp" ++#include "runtime/handles.inline.hpp" ++#include "runtime/mutexLocker.hpp" ++#include "runtime/os.hpp" ++#include "runtime/osThread.hpp" ++#include "runtime/safepoint.hpp" ++#include "runtime/vmThread.hpp" ++#ifdef TARGET_ARCH_ppc ++# include "assembler_ppc.inline.hpp" ++#endif ++ ++ ++void OSThread::pd_initialize() { ++ assert(this != NULL, "check"); ++ _thread_id = 0; ++ _pthread_id = 0; ++ _siginfo = NULL; ++ _ucontext = NULL; ++ _expanding_stack = 0; ++ _alt_sig_stack = NULL; ++ ++ _last_cpu_times.sys = _last_cpu_times.user = 0L; ++ ++ sigemptyset(&_caller_sigmask); ++ ++ _startThread_lock = new Monitor(Mutex::event, "startThread_lock", true); ++ assert(_startThread_lock !=NULL, "check"); ++} ++ ++void OSThread::pd_destroy() { ++ delete _startThread_lock; ++} +--- ./hotspot/src/os/aix/vm/osThread_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/osThread_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,144 @@ ++/* ++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_AIX_VM_OSTHREAD_AIX_HPP ++#define OS_AIX_VM_OSTHREAD_AIX_HPP ++ ++ public: ++ typedef pid_t thread_id_t; ++ ++ private: ++ int _thread_type; ++ ++ public: ++ ++ int thread_type() const { ++ return _thread_type; ++ } ++ void set_thread_type(int type) { ++ _thread_type = type; ++ } ++ ++ private: ++ ++ // _pthread_id is the pthread id, which is used by library calls ++ // (e.g. pthread_kill). ++ pthread_t _pthread_id; ++ ++ sigset_t _caller_sigmask; // Caller's signal mask ++ ++ public: ++ ++ // Methods to save/restore caller's signal mask ++ sigset_t caller_sigmask() const { return _caller_sigmask; } ++ void set_caller_sigmask(sigset_t sigmask) { _caller_sigmask = sigmask; } ++ ++#ifndef PRODUCT ++ // Used for debugging, return a unique integer for each thread. ++ int thread_identifier() const { return _thread_id; } ++#endif ++#ifdef ASSERT ++ // We expect no reposition failures so kill vm if we get one. ++ // ++ bool valid_reposition_failure() { ++ return false; ++ } ++#endif // ASSERT ++ pthread_t pthread_id() const { ++ return _pthread_id; ++ } ++ void set_pthread_id(pthread_t tid) { ++ _pthread_id = tid; ++ } ++ ++ // *************************************************************** ++ // suspension support. ++ // *************************************************************** ++ ++ public: ++ // flags that support signal based suspend/resume on Linux are in a ++ // separate class to avoid confusion with many flags in OSThread that ++ // are used by VM level suspend/resume. ++ os::SuspendResume sr; ++ ++ // _ucontext and _siginfo are used by SR_handler() to save thread context, ++ // and they will later be used to walk the stack or reposition thread PC. ++ // If the thread is not suspended in SR_handler() (e.g. self suspend), ++ // the value in _ucontext is meaningless, so we must use the last Java ++ // frame information as the frame. This will mean that for threads ++ // that are parked on a mutex the profiler (and safepoint mechanism) ++ // will see the thread as if it were still in the Java frame. This ++ // not a problem for the profiler since the Java frame is a close ++ // enough result. For the safepoint mechanism when the give it the ++ // Java frame we are not at a point where the safepoint needs the ++ // frame to that accurate (like for a compiled safepoint) since we ++ // should be in a place where we are native and will block ourselves ++ // if we transition. ++ private: ++ void* _siginfo; ++ ucontext_t* _ucontext; ++ int _expanding_stack; // non zero if manually expanding stack ++ address _alt_sig_stack; // address of base of alternate signal stack ++ ++ public: ++ void* siginfo() const { return _siginfo; } ++ void set_siginfo(void* ptr) { _siginfo = ptr; } ++ ucontext_t* ucontext() const { return _ucontext; } ++ void set_ucontext(ucontext_t* ptr) { _ucontext = ptr; } ++ void set_expanding_stack(void) { _expanding_stack = 1; } ++ void clear_expanding_stack(void) { _expanding_stack = 0; } ++ int expanding_stack(void) { return _expanding_stack; } ++ ++ void set_alt_sig_stack(address val) { _alt_sig_stack = val; } ++ address alt_sig_stack(void) { return _alt_sig_stack; } ++ ++ private: ++ Monitor* _startThread_lock; // sync parent and child in thread creation ++ ++ public: ++ ++ Monitor* startThread_lock() const { ++ return _startThread_lock; ++ } ++ ++ // *************************************************************** ++ // Platform dependent initialization and cleanup ++ // *************************************************************** ++ ++ private: ++ ++ void pd_initialize(); ++ void pd_destroy(); ++ ++ public: ++ ++ // The last measured values of cpu timing to prevent the "stale ++ // value return" bug in thread_cpu_time. ++ volatile struct { ++ jlong sys; ++ jlong user; ++ } _last_cpu_times; ++ ++#endif // OS_AIX_VM_OSTHREAD_AIX_HPP +--- ./hotspot/src/os/aix/vm/os_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/os_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,5256 @@ ++/* ++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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. ++ * ++ */ ++ ++// According to the AIX OS doc #pragma alloca must be used ++// with C++ compiler before referencing the function alloca() ++#pragma alloca ++ ++// no precompiled headers ++#include "classfile/classLoader.hpp" ++#include "classfile/systemDictionary.hpp" ++#include "classfile/vmSymbols.hpp" ++#include "code/icBuffer.hpp" ++#include "code/vtableStubs.hpp" ++#include "compiler/compileBroker.hpp" ++#include "interpreter/interpreter.hpp" ++#include "jvm_aix.h" ++#include "libperfstat_aix.hpp" ++#include "loadlib_aix.hpp" ++#include "memory/allocation.inline.hpp" ++#include "memory/filemap.hpp" ++#include "mutex_aix.inline.hpp" ++#include "oops/oop.inline.hpp" ++#include "os_share_aix.hpp" ++#include "porting_aix.hpp" ++#include "prims/jniFastGetField.hpp" ++#include "prims/jvm.h" ++#include "prims/jvm_misc.hpp" ++#include "runtime/arguments.hpp" ++#include "runtime/extendedPC.hpp" ++#include "runtime/globals.hpp" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/java.hpp" ++#include "runtime/javaCalls.hpp" ++#include "runtime/mutexLocker.hpp" ++#include "runtime/objectMonitor.hpp" ++#include "runtime/osThread.hpp" ++#include "runtime/perfMemory.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/statSampler.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "runtime/thread.inline.hpp" ++#include "runtime/threadCritical.hpp" ++#include "runtime/timer.hpp" ++#include "services/attachListener.hpp" ++#include "services/runtimeService.hpp" ++#include "utilities/decoder.hpp" ++#include "utilities/defaultStream.hpp" ++#include "utilities/events.hpp" ++#include "utilities/growableArray.hpp" ++#include "utilities/vmError.hpp" ++ ++// put OS-includes here (sorted alphabetically) ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++// Add missing declarations (should be in procinfo.h but isn't until AIX 6.1). ++#if !defined(_AIXVERSION_610) ++extern "C" { ++ int getthrds64(pid_t ProcessIdentifier, ++ struct thrdentry64* ThreadBuffer, ++ int ThreadSize, ++ tid64_t* IndexPointer, ++ int Count); ++} ++#endif ++ ++// Excerpts from systemcfg.h definitions newer than AIX 5.3 ++#ifndef PV_7 ++# define PV_7 0x200000 // Power PC 7 ++# define PV_7_Compat 0x208000 // Power PC 7 ++#endif ++ ++#define MAX_PATH (2 * K) ++ ++// for timer info max values which include all bits ++#define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) ++// for multipage initialization error analysis (in 'g_multipage_error') ++#define ERROR_MP_OS_TOO_OLD 100 ++#define ERROR_MP_EXTSHM_ACTIVE 101 ++#define ERROR_MP_VMGETINFO_FAILED 102 ++#define ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K 103 ++ ++// the semantics in this file are thus that codeptr_t is a *real code ptr* ++// This means that any function taking codeptr_t as arguments will assume ++// a real codeptr and won't handle function descriptors (eg getFuncName), ++// whereas functions taking address as args will deal with function ++// descriptors (eg os::dll_address_to_library_name) ++typedef unsigned int* codeptr_t; ++ ++// typedefs for stackslots, stack pointers, pointers to op codes ++typedef unsigned long stackslot_t; ++typedef stackslot_t* stackptr_t; ++ ++// query dimensions of the stack of the calling thread ++static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size); ++ ++// function to check a given stack pointer against given stack limits ++inline bool is_valid_stackpointer(stackptr_t sp, stackptr_t stack_base, size_t stack_size) { ++ if (((uintptr_t)sp) & 0x7) { ++ return false; ++ } ++ if (sp > stack_base) { ++ return false; ++ } ++ if (sp < (stackptr_t) ((address)stack_base - stack_size)) { ++ return false; ++ } ++ return true; ++} ++ ++// returns true if function is a valid codepointer ++inline bool is_valid_codepointer(codeptr_t p) { ++ if (!p) { ++ return false; ++ } ++ if (((uintptr_t)p) & 0x3) { ++ return false; ++ } ++ if (LoadedLibraries::find_for_text_address((address)p) == NULL) { ++ return false; ++ } ++ return true; ++} ++ ++// macro to check a given stack pointer against given stack limits and to die if test fails ++#define CHECK_STACK_PTR(sp, stack_base, stack_size) { \ ++ guarantee(is_valid_stackpointer((stackptr_t)(sp), (stackptr_t)(stack_base), stack_size), "Stack Pointer Invalid"); \ ++} ++ ++// macro to check the current stack pointer against given stacklimits ++#define CHECK_CURRENT_STACK_PTR(stack_base, stack_size) { \ ++ address sp; \ ++ sp = os::current_stack_pointer(); \ ++ CHECK_STACK_PTR(sp, stack_base, stack_size); \ ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// global variables (for a description see os_aix.hpp) ++ ++julong os::Aix::_physical_memory = 0; ++pthread_t os::Aix::_main_thread = ((pthread_t)0); ++int os::Aix::_page_size = -1; ++int os::Aix::_on_pase = -1; ++int os::Aix::_os_version = -1; ++int os::Aix::_stack_page_size = -1; ++size_t os::Aix::_shm_default_page_size = -1; ++int os::Aix::_can_use_64K_pages = -1; ++int os::Aix::_can_use_16M_pages = -1; ++int os::Aix::_xpg_sus_mode = -1; ++int os::Aix::_extshm = -1; ++int os::Aix::_logical_cpus = -1; ++ ++//////////////////////////////////////////////////////////////////////////////// ++// local variables ++ ++static int g_multipage_error = -1; // error analysis for multipage initialization ++static jlong initial_time_count = 0; ++static int clock_tics_per_sec = 100; ++static sigset_t check_signal_done; // For diagnostics to print a message once (see run_periodic_checks) ++static bool check_signals = true; ++static pid_t _initial_pid = 0; ++static int SR_signum = SIGUSR2; // Signal used to suspend/resume a thread (must be > SIGSEGV, see 4355769) ++static sigset_t SR_sigset; ++static pthread_mutex_t dl_mutex; // Used to protect dlsym() calls */ ++ ++julong os::available_memory() { ++ return Aix::available_memory(); ++} ++ ++julong os::Aix::available_memory() { ++ os::Aix::meminfo_t mi; ++ if (os::Aix::get_meminfo(&mi)) { ++ return mi.real_free; ++ } else { ++ return 0xFFFFFFFFFFFFFFFFLL; ++ } ++} ++ ++julong os::physical_memory() { ++ return Aix::physical_memory(); ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// environment support ++ ++bool os::getenv(const char* name, char* buf, int len) { ++ const char* val = ::getenv(name); ++ if (val != NULL && strlen(val) < (size_t)len) { ++ strcpy(buf, val); ++ return true; ++ } ++ if (len > 0) buf[0] = 0; // return a null string ++ return false; ++} ++ ++ ++// Return true if user is running as root. ++ ++bool os::have_special_privileges() { ++ static bool init = false; ++ static bool privileges = false; ++ if (!init) { ++ privileges = (getuid() != geteuid()) || (getgid() != getegid()); ++ init = true; ++ } ++ return privileges; ++} ++ ++// Helper function, emulates disclaim64 using multiple 32bit disclaims ++// because we cannot use disclaim64() on AS/400 and old AIX releases. ++static bool my_disclaim64(char* addr, size_t size) { ++ ++ if (size == 0) { ++ return true; ++ } ++ ++ // Maximum size 32bit disclaim() accepts. (Theoretically 4GB, but I just do not trust that.) ++ const unsigned int maxDisclaimSize = 0x80000000; ++ ++ const unsigned int numFullDisclaimsNeeded = (size / maxDisclaimSize); ++ const unsigned int lastDisclaimSize = (size % maxDisclaimSize); ++ ++ char* p = addr; ++ ++ for (int i = 0; i < numFullDisclaimsNeeded; i ++) { ++ if (::disclaim(p, maxDisclaimSize, DISCLAIM_ZEROMEM) != 0) { ++ //if (Verbose) ++ fprintf(stderr, "Cannot disclaim %p - %p (errno %d)\n", p, p + maxDisclaimSize, errno); ++ return false; ++ } ++ p += maxDisclaimSize; ++ } ++ ++ if (lastDisclaimSize > 0) { ++ if (::disclaim(p, lastDisclaimSize, DISCLAIM_ZEROMEM) != 0) { ++ //if (Verbose) ++ fprintf(stderr, "Cannot disclaim %p - %p (errno %d)\n", p, p + lastDisclaimSize, errno); ++ return false; ++ } ++ } ++ ++ return true; ++} ++ ++// Cpu architecture string ++#if defined(PPC32) ++static char cpu_arch[] = "ppc"; ++#elif defined(PPC64) ++static char cpu_arch[] = "ppc64"; ++#else ++#error Add appropriate cpu_arch setting ++#endif ++ ++ ++// Given an address, returns the size of the page backing that address. ++size_t os::Aix::query_pagesize(void* addr) { ++ ++ vm_page_info pi; ++ pi.addr = (uint64_t)addr; ++ if (::vmgetinfo(&pi, VM_PAGE_INFO, sizeof(pi)) == 0) { ++ return pi.pagesize; ++ } else { ++ fprintf(stderr, "vmgetinfo failed to retrieve page size for address %p (errno %d).\n", addr, errno); ++ assert(false, "vmgetinfo failed to retrieve page size"); ++ return SIZE_4K; ++ } ++ ++} ++ ++// Returns the kernel thread id of the currently running thread. ++pid_t os::Aix::gettid() { ++ return (pid_t) thread_self(); ++} ++ ++void os::Aix::initialize_system_info() { ++ ++ // get the number of online(logical) cpus instead of configured ++ os::_processor_count = sysconf(_SC_NPROCESSORS_ONLN); ++ assert(_processor_count > 0, "_processor_count must be > 0"); ++ ++ // retrieve total physical storage ++ os::Aix::meminfo_t mi; ++ if (!os::Aix::get_meminfo(&mi)) { ++ fprintf(stderr, "os::Aix::get_meminfo failed.\n"); fflush(stderr); ++ assert(false, "os::Aix::get_meminfo failed."); ++ } ++ _physical_memory = (julong) mi.real_total; ++} ++ ++// Helper function for tracing page sizes. ++static const char* describe_pagesize(size_t pagesize) { ++ switch (pagesize) { ++ case SIZE_4K : return "4K"; ++ case SIZE_64K: return "64K"; ++ case SIZE_16M: return "16M"; ++ case SIZE_16G: return "16G"; ++ default: ++ assert(false, "surprise"); ++ return "??"; ++ } ++} ++ ++// Retrieve information about multipage size support. Will initialize ++// Aix::_page_size, Aix::_stack_page_size, Aix::_can_use_64K_pages, ++// Aix::_can_use_16M_pages. ++// Must be called before calling os::large_page_init(). ++void os::Aix::query_multipage_support() { ++ ++ guarantee(_page_size == -1 && ++ _stack_page_size == -1 && ++ _can_use_64K_pages == -1 && ++ _can_use_16M_pages == -1 && ++ g_multipage_error == -1, ++ "do not call twice"); ++ ++ _page_size = ::sysconf(_SC_PAGESIZE); ++ ++ // This really would surprise me. ++ assert(_page_size == SIZE_4K, "surprise!"); ++ ++ ++ // Query default data page size (default page size for C-Heap, pthread stacks and .bss). ++ // Default data page size is influenced either by linker options (-bdatapsize) ++ // or by environment variable LDR_CNTRL (suboption DATAPSIZE). If none is given, ++ // default should be 4K. ++ size_t data_page_size = SIZE_4K; ++ { ++ void* p = ::malloc(SIZE_16M); ++ guarantee(p != NULL, "malloc failed"); ++ data_page_size = os::Aix::query_pagesize(p); ++ ::free(p); ++ } ++ ++ // query default shm page size (LDR_CNTRL SHMPSIZE) ++ { ++ const int shmid = ::shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR | S_IWUSR); ++ guarantee(shmid != -1, "shmget failed"); ++ void* p = ::shmat(shmid, NULL, 0); ++ ::shmctl(shmid, IPC_RMID, NULL); ++ guarantee(p != (void*) -1, "shmat failed"); ++ _shm_default_page_size = os::Aix::query_pagesize(p); ++ ::shmdt(p); ++ } ++ ++ // before querying the stack page size, make sure we are not running as primordial ++ // thread (because primordial thread's stack may have different page size than ++ // pthread thread stacks). Running a VM on the primordial thread won't work for a ++ // number of reasons so we may just as well guarantee it here ++ guarantee(!os::Aix::is_primordial_thread(), "Must not be called for primordial thread"); ++ ++ // query stack page size ++ { ++ int dummy = 0; ++ _stack_page_size = os::Aix::query_pagesize(&dummy); ++ // everything else would surprise me and should be looked into ++ guarantee(_stack_page_size == SIZE_4K || _stack_page_size == SIZE_64K, "Wrong page size"); ++ // also, just for completeness: pthread stacks are allocated from C heap, so ++ // stack page size should be the same as data page size ++ guarantee(_stack_page_size == data_page_size, "stack page size should be the same as data page size"); ++ } ++ ++ // EXTSHM is bad: among other things, it prevents setting pagesize dynamically ++ // for system V shm. ++ if (Aix::extshm()) { ++ if (Verbose) { ++ fprintf(stderr, "EXTSHM is active - will disable large page support.\n" ++ "Please make sure EXTSHM is OFF for large page support.\n"); ++ } ++ g_multipage_error = ERROR_MP_EXTSHM_ACTIVE; ++ _can_use_64K_pages = _can_use_16M_pages = 0; ++ goto query_multipage_support_end; ++ } ++ ++ // now check which page sizes the OS claims it supports, and of those, which actually can be used. ++ { ++ const int MAX_PAGE_SIZES = 4; ++ psize_t sizes[MAX_PAGE_SIZES]; ++ const int num_psizes = ::vmgetinfo(sizes, VMINFO_GETPSIZES, MAX_PAGE_SIZES); ++ if (num_psizes == -1) { ++ if (Verbose) { ++ fprintf(stderr, "vmgetinfo(VMINFO_GETPSIZES) failed (errno: %d)\n", errno); ++ fprintf(stderr, "disabling multipage support.\n"); ++ } ++ g_multipage_error = ERROR_MP_VMGETINFO_FAILED; ++ _can_use_64K_pages = _can_use_16M_pages = 0; ++ goto query_multipage_support_end; ++ } ++ guarantee(num_psizes > 0, "vmgetinfo(.., VMINFO_GETPSIZES, ...) failed."); ++ assert(num_psizes <= MAX_PAGE_SIZES, "Surprise! more than 4 page sizes?"); ++ if (Verbose) { ++ fprintf(stderr, "vmgetinfo(.., VMINFO_GETPSIZES, ...) returns %d supported page sizes: ", num_psizes); ++ for (int i = 0; i < num_psizes; i ++) { ++ fprintf(stderr, " %s ", describe_pagesize(sizes[i])); ++ } ++ fprintf(stderr, " .\n"); ++ } ++ ++ // Can we use 64K, 16M pages? ++ _can_use_64K_pages = 0; ++ _can_use_16M_pages = 0; ++ for (int i = 0; i < num_psizes; i ++) { ++ if (sizes[i] == SIZE_64K) { ++ _can_use_64K_pages = 1; ++ } else if (sizes[i] == SIZE_16M) { ++ _can_use_16M_pages = 1; ++ } ++ } ++ ++ if (!_can_use_64K_pages) { ++ g_multipage_error = ERROR_MP_VMGETINFO_CLAIMS_NO_SUPPORT_FOR_64K; ++ } ++ ++ // Double-check for 16M pages: Even if AIX claims to be able to use 16M pages, ++ // there must be an actual 16M page pool, and we must run with enough rights. ++ if (_can_use_16M_pages) { ++ const int shmid = ::shmget(IPC_PRIVATE, SIZE_16M, IPC_CREAT | S_IRUSR | S_IWUSR); ++ guarantee(shmid != -1, "shmget failed"); ++ struct shmid_ds shm_buf = { 0 }; ++ shm_buf.shm_pagesize = SIZE_16M; ++ const bool can_set_pagesize = ::shmctl(shmid, SHM_PAGESIZE, &shm_buf) == 0 ? true : false; ++ const int en = errno; ++ ::shmctl(shmid, IPC_RMID, NULL); ++ if (!can_set_pagesize) { ++ if (Verbose) { ++ fprintf(stderr, "Failed to allocate even one misely 16M page. shmctl failed with %d (%s).\n" ++ "Will deactivate 16M support.\n", en, strerror(en)); ++ } ++ _can_use_16M_pages = 0; ++ } ++ } ++ ++ } // end: check which pages can be used for shared memory ++ ++query_multipage_support_end: ++ ++ guarantee(_page_size != -1 && ++ _stack_page_size != -1 && ++ _can_use_64K_pages != -1 && ++ _can_use_16M_pages != -1, "Page sizes not properly initialized"); ++ ++ if (_can_use_64K_pages) { ++ g_multipage_error = 0; ++ } ++ ++ if (Verbose) { ++ fprintf(stderr, "Data page size (C-Heap, bss, etc): %s\n", describe_pagesize(data_page_size)); ++ fprintf(stderr, "Thread stack page size (pthread): %s\n", describe_pagesize(_stack_page_size)); ++ fprintf(stderr, "Default shared memory page size: %s\n", describe_pagesize(_shm_default_page_size)); ++ fprintf(stderr, "Can use 64K pages dynamically with shared meory: %s\n", (_can_use_64K_pages ? "yes" :"no")); ++ fprintf(stderr, "Can use 16M pages dynamically with shared memory: %s\n", (_can_use_16M_pages ? "yes" :"no")); ++ fprintf(stderr, "Multipage error details: %d\n", g_multipage_error); ++ } ++ ++} // end os::Aix::query_multipage_support() ++ ++// The code for this method was initially derived from the version in os_linux.cpp. ++void os::init_system_properties_values() { ++ ++#define DEFAULT_LIBPATH "/usr/lib:/lib" ++#define EXTENSIONS_DIR "/lib/ext" ++#define ENDORSED_DIR "/lib/endorsed" ++ ++ // Buffer that fits several sprintfs. ++ // Note that the space for the trailing null is provided ++ // by the nulls included by the sizeof operator. ++ const size_t bufsize = ++ MAX3((size_t)MAXPATHLEN, // For dll_dir & friends. ++ (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR), // extensions dir ++ (size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir ++ char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); ++ ++ // sysclasspath, java_home, dll_dir ++ { ++ char *pslash; ++ os::jvm_path(buf, bufsize); ++ ++ // Found the full path to libjvm.so. ++ // Now cut the path to /jre if we can. ++ *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so. ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /{client|server|hotspot}. ++ } ++ Arguments::set_dll_dir(buf); ++ ++ if (pslash != NULL) { ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /. ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /lib. ++ } ++ } ++ } ++ Arguments::set_java_home(buf); ++ set_boot_path('/', ':'); ++ } ++ ++ // Where to look for native libraries. ++ ++ // On Aix we get the user setting of LIBPATH. ++ // Eventually, all the library path setting will be done here. ++ // Get the user setting of LIBPATH. ++ const char *v = ::getenv("LIBPATH"); ++ const char *v_colon = ":"; ++ if (v == NULL) { v = ""; v_colon = ""; } ++ ++ // Concatenate user and invariant part of ld_library_path. ++ // That's +1 for the colon and +1 for the trailing '\0'. ++ char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, strlen(v) + 1 + sizeof(DEFAULT_LIBPATH) + 1, mtInternal); ++ sprintf(ld_library_path, "%s%s" DEFAULT_LIBPATH, v, v_colon); ++ Arguments::set_library_path(ld_library_path); ++ FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal); ++ ++ // Extensions directories. ++ sprintf(buf, "%s" EXTENSIONS_DIR, Arguments::get_java_home()); ++ Arguments::set_ext_dirs(buf); ++ ++ // Endorsed standards default directory. ++ sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); ++ Arguments::set_endorsed_dirs(buf); ++ ++ FREE_C_HEAP_ARRAY(char, buf, mtInternal); ++ ++#undef DEFAULT_LIBPATH ++#undef EXTENSIONS_DIR ++#undef ENDORSED_DIR ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// breakpoint support ++ ++void os::breakpoint() { ++ BREAKPOINT; ++} ++ ++extern "C" void breakpoint() { ++ // use debugger to set breakpoint here ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// signal support ++ ++debug_only(static bool signal_sets_initialized = false); ++static sigset_t unblocked_sigs, vm_sigs, allowdebug_blocked_sigs; ++ ++bool os::Aix::is_sig_ignored(int sig) { ++ struct sigaction oact; ++ sigaction(sig, (struct sigaction*)NULL, &oact); ++ void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction) ++ : CAST_FROM_FN_PTR(void*, oact.sa_handler); ++ if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) ++ return true; ++ else ++ return false; ++} ++ ++void os::Aix::signal_sets_init() { ++ // Should also have an assertion stating we are still single-threaded. ++ assert(!signal_sets_initialized, "Already initialized"); ++ // Fill in signals that are necessarily unblocked for all threads in ++ // the VM. Currently, we unblock the following signals: ++ // SHUTDOWN{1,2,3}_SIGNAL: for shutdown hooks support (unless over-ridden ++ // by -Xrs (=ReduceSignalUsage)); ++ // BREAK_SIGNAL which is unblocked only by the VM thread and blocked by all ++ // other threads. The "ReduceSignalUsage" boolean tells us not to alter ++ // the dispositions or masks wrt these signals. ++ // Programs embedding the VM that want to use the above signals for their ++ // own purposes must, at this time, use the "-Xrs" option to prevent ++ // interference with shutdown hooks and BREAK_SIGNAL thread dumping. ++ // (See bug 4345157, and other related bugs). ++ // In reality, though, unblocking these signals is really a nop, since ++ // these signals are not blocked by default. ++ sigemptyset(&unblocked_sigs); ++ sigemptyset(&allowdebug_blocked_sigs); ++ sigaddset(&unblocked_sigs, SIGILL); ++ sigaddset(&unblocked_sigs, SIGSEGV); ++ sigaddset(&unblocked_sigs, SIGBUS); ++ sigaddset(&unblocked_sigs, SIGFPE); ++ sigaddset(&unblocked_sigs, SIGTRAP); ++ sigaddset(&unblocked_sigs, SIGDANGER); ++ sigaddset(&unblocked_sigs, SR_signum); ++ ++ if (!ReduceSignalUsage) { ++ if (!os::Aix::is_sig_ignored(SHUTDOWN1_SIGNAL)) { ++ sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL); ++ sigaddset(&allowdebug_blocked_sigs, SHUTDOWN1_SIGNAL); ++ } ++ if (!os::Aix::is_sig_ignored(SHUTDOWN2_SIGNAL)) { ++ sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL); ++ sigaddset(&allowdebug_blocked_sigs, SHUTDOWN2_SIGNAL); ++ } ++ if (!os::Aix::is_sig_ignored(SHUTDOWN3_SIGNAL)) { ++ sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL); ++ sigaddset(&allowdebug_blocked_sigs, SHUTDOWN3_SIGNAL); ++ } ++ } ++ // Fill in signals that are blocked by all but the VM thread. ++ sigemptyset(&vm_sigs); ++ if (!ReduceSignalUsage) ++ sigaddset(&vm_sigs, BREAK_SIGNAL); ++ debug_only(signal_sets_initialized = true); ++} ++ ++// These are signals that are unblocked while a thread is running Java. ++// (For some reason, they get blocked by default.) ++sigset_t* os::Aix::unblocked_signals() { ++ assert(signal_sets_initialized, "Not initialized"); ++ return &unblocked_sigs; ++} ++ ++// These are the signals that are blocked while a (non-VM) thread is ++// running Java. Only the VM thread handles these signals. ++sigset_t* os::Aix::vm_signals() { ++ assert(signal_sets_initialized, "Not initialized"); ++ return &vm_sigs; ++} ++ ++// These are signals that are blocked during cond_wait to allow debugger in ++sigset_t* os::Aix::allowdebug_blocked_signals() { ++ assert(signal_sets_initialized, "Not initialized"); ++ return &allowdebug_blocked_sigs; ++} ++ ++void os::Aix::hotspot_sigmask(Thread* thread) { ++ ++ //Save caller's signal mask before setting VM signal mask ++ sigset_t caller_sigmask; ++ pthread_sigmask(SIG_BLOCK, NULL, &caller_sigmask); ++ ++ OSThread* osthread = thread->osthread(); ++ osthread->set_caller_sigmask(caller_sigmask); ++ ++ pthread_sigmask(SIG_UNBLOCK, os::Aix::unblocked_signals(), NULL); ++ ++ if (!ReduceSignalUsage) { ++ if (thread->is_VM_thread()) { ++ // Only the VM thread handles BREAK_SIGNAL ... ++ pthread_sigmask(SIG_UNBLOCK, vm_signals(), NULL); ++ } else { ++ // ... all other threads block BREAK_SIGNAL ++ pthread_sigmask(SIG_BLOCK, vm_signals(), NULL); ++ } ++ } ++} ++ ++// retrieve memory information. ++// Returns false if something went wrong; ++// content of pmi undefined in this case. ++bool os::Aix::get_meminfo(meminfo_t* pmi) { ++ ++ assert(pmi, "get_meminfo: invalid parameter"); ++ ++ memset(pmi, 0, sizeof(meminfo_t)); ++ ++ if (os::Aix::on_pase()) { ++ ++ Unimplemented(); ++ return false; ++ ++ } else { ++ ++ // On AIX, I use the (dynamically loaded) perfstat library to retrieve memory statistics ++ // See: ++ // http://publib.boulder.ibm.com/infocenter/systems/index.jsp ++ // ?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_memtot.htm ++ // http://publib.boulder.ibm.com/infocenter/systems/index.jsp ++ // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm ++ ++ perfstat_memory_total_t psmt; ++ memset (&psmt, '\0', sizeof(psmt)); ++ const int rc = libperfstat::perfstat_memory_total(NULL, &psmt, sizeof(psmt), 1); ++ if (rc == -1) { ++ fprintf(stderr, "perfstat_memory_total() failed (errno=%d)\n", errno); ++ assert(0, "perfstat_memory_total() failed"); ++ return false; ++ } ++ ++ assert(rc == 1, "perfstat_memory_total() - weird return code"); ++ ++ // excerpt from ++ // http://publib.boulder.ibm.com/infocenter/systems/index.jsp ++ // ?topic=/com.ibm.aix.files/doc/aixfiles/libperfstat.h.htm ++ // The fields of perfstat_memory_total_t: ++ // u_longlong_t virt_total Total virtual memory (in 4 KB pages). ++ // u_longlong_t real_total Total real memory (in 4 KB pages). ++ // u_longlong_t real_free Free real memory (in 4 KB pages). ++ // u_longlong_t pgsp_total Total paging space (in 4 KB pages). ++ // u_longlong_t pgsp_free Free paging space (in 4 KB pages). ++ ++ pmi->virt_total = psmt.virt_total * 4096; ++ pmi->real_total = psmt.real_total * 4096; ++ pmi->real_free = psmt.real_free * 4096; ++ pmi->pgsp_total = psmt.pgsp_total * 4096; ++ pmi->pgsp_free = psmt.pgsp_free * 4096; ++ ++ return true; ++ ++ } ++} // end os::Aix::get_meminfo ++ ++// Retrieve global cpu information. ++// Returns false if something went wrong; ++// the content of pci is undefined in this case. ++bool os::Aix::get_cpuinfo(cpuinfo_t* pci) { ++ assert(pci, "get_cpuinfo: invalid parameter"); ++ memset(pci, 0, sizeof(cpuinfo_t)); ++ ++ perfstat_cpu_total_t psct; ++ memset (&psct, '\0', sizeof(psct)); ++ ++ if (-1 == libperfstat::perfstat_cpu_total(NULL, &psct, sizeof(perfstat_cpu_total_t), 1)) { ++ fprintf(stderr, "perfstat_cpu_total() failed (errno=%d)\n", errno); ++ assert(0, "perfstat_cpu_total() failed"); ++ return false; ++ } ++ ++ // global cpu information ++ strcpy (pci->description, psct.description); ++ pci->processorHZ = psct.processorHZ; ++ pci->ncpus = psct.ncpus; ++ os::Aix::_logical_cpus = psct.ncpus; ++ for (int i = 0; i < 3; i++) { ++ pci->loadavg[i] = (double) psct.loadavg[i] / (1 << SBITS); ++ } ++ ++ // get the processor version from _system_configuration ++ switch (_system_configuration.version) { ++ case PV_7: ++ strcpy(pci->version, "Power PC 7"); ++ break; ++ case PV_6_1: ++ strcpy(pci->version, "Power PC 6 DD1.x"); ++ break; ++ case PV_6: ++ strcpy(pci->version, "Power PC 6"); ++ break; ++ case PV_5: ++ strcpy(pci->version, "Power PC 5"); ++ break; ++ case PV_5_2: ++ strcpy(pci->version, "Power PC 5_2"); ++ break; ++ case PV_5_3: ++ strcpy(pci->version, "Power PC 5_3"); ++ break; ++ case PV_5_Compat: ++ strcpy(pci->version, "PV_5_Compat"); ++ break; ++ case PV_6_Compat: ++ strcpy(pci->version, "PV_6_Compat"); ++ break; ++ case PV_7_Compat: ++ strcpy(pci->version, "PV_7_Compat"); ++ break; ++ default: ++ strcpy(pci->version, "unknown"); ++ } ++ ++ return true; ++ ++} //end os::Aix::get_cpuinfo ++ ++////////////////////////////////////////////////////////////////////////////// ++// detecting pthread library ++ ++void os::Aix::libpthread_init() { ++ return; ++} ++ ++////////////////////////////////////////////////////////////////////////////// ++// create new thread ++ ++// Thread start routine for all newly created threads ++static void *java_start(Thread *thread) { ++ ++ // find out my own stack dimensions ++ { ++ // actually, this should do exactly the same as thread->record_stack_base_and_size... ++ address base = 0; ++ size_t size = 0; ++ query_stack_dimensions(&base, &size); ++ thread->set_stack_base(base); ++ thread->set_stack_size(size); ++ } ++ ++ // Do some sanity checks. ++ CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size()); ++ ++ // Try to randomize the cache line index of hot stack frames. ++ // This helps when threads of the same stack traces evict each other's ++ // cache lines. The threads can be either from the same JVM instance, or ++ // from different JVM instances. The benefit is especially true for ++ // processors with hyperthreading technology. ++ ++ static int counter = 0; ++ int pid = os::current_process_id(); ++ alloca(((pid ^ counter++) & 7) * 128); ++ ++ ThreadLocalStorage::set_thread(thread); ++ ++ OSThread* osthread = thread->osthread(); ++ ++ // thread_id is kernel thread id (similar to Solaris LWP id) ++ osthread->set_thread_id(os::Aix::gettid()); ++ ++ // initialize signal mask for this thread ++ os::Aix::hotspot_sigmask(thread); ++ ++ // initialize floating point control register ++ os::Aix::init_thread_fpu_state(); ++ ++ assert(osthread->get_state() == RUNNABLE, "invalid os thread state"); ++ ++ // call one more level start routine ++ thread->run(); ++ ++ return 0; ++} ++ ++bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size) { ++ ++ // We want the whole function to be synchronized. ++ ThreadCritical cs; ++ ++ assert(thread->osthread() == NULL, "caller responsible"); ++ ++ // Allocate the OSThread object ++ OSThread* osthread = new OSThread(NULL, NULL); ++ if (osthread == NULL) { ++ return false; ++ } ++ ++ // set the correct thread state ++ osthread->set_thread_type(thr_type); ++ ++ // Initial state is ALLOCATED but not INITIALIZED ++ osthread->set_state(ALLOCATED); ++ ++ thread->set_osthread(osthread); ++ ++ // init thread attributes ++ pthread_attr_t attr; ++ pthread_attr_init(&attr); ++ guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???"); ++ ++ // Make sure we run in 1:1 kernel-user-thread mode. ++ if (os::Aix::on_aix()) { ++ guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???"); ++ guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???"); ++ } // end: aix ++ ++ // Start in suspended state, and in os::thread_start, wake the thread up. ++ guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???"); ++ ++ // calculate stack size if it's not specified by caller ++ if (os::Aix::supports_variable_stack_size()) { ++ if (stack_size == 0) { ++ stack_size = os::Aix::default_stack_size(thr_type); ++ ++ switch (thr_type) { ++ case os::java_thread: ++ // Java threads use ThreadStackSize whose default value can be changed with the flag -Xss. ++ assert(JavaThread::stack_size_at_create() > 0, "this should be set"); ++ stack_size = JavaThread::stack_size_at_create(); ++ break; ++ case os::compiler_thread: ++ if (CompilerThreadStackSize > 0) { ++ stack_size = (size_t)(CompilerThreadStackSize * K); ++ break; ++ } // else fall through: ++ // use VMThreadStackSize if CompilerThreadStackSize is not defined ++ case os::vm_thread: ++ case os::pgc_thread: ++ case os::cgc_thread: ++ case os::watcher_thread: ++ if (VMThreadStackSize > 0) stack_size = (size_t)(VMThreadStackSize * K); ++ break; ++ } ++ } ++ ++ stack_size = MAX2(stack_size, os::Aix::min_stack_allowed); ++ pthread_attr_setstacksize(&attr, stack_size); ++ } //else let thread_create() pick the default value (96 K on AIX) ++ ++ pthread_t tid; ++ int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread); ++ ++ pthread_attr_destroy(&attr); ++ ++ if (ret != 0) { ++ if (PrintMiscellaneous && (Verbose || WizardMode)) { ++ perror("pthread_create()"); ++ } ++ // Need to clean up stuff we've allocated so far ++ thread->set_osthread(NULL); ++ delete osthread; ++ return false; ++ } ++ ++ // Store pthread info into the OSThread ++ osthread->set_pthread_id(tid); ++ ++ return true; ++} ++ ++///////////////////////////////////////////////////////////////////////////// ++// attach existing thread ++ ++// bootstrap the main thread ++bool os::create_main_thread(JavaThread* thread) { ++ assert(os::Aix::_main_thread == pthread_self(), "should be called inside main thread"); ++ return create_attached_thread(thread); ++} ++ ++bool os::create_attached_thread(JavaThread* thread) { ++#ifdef ASSERT ++ thread->verify_not_published(); ++#endif ++ ++ // Allocate the OSThread object ++ OSThread* osthread = new OSThread(NULL, NULL); ++ ++ if (osthread == NULL) { ++ return false; ++ } ++ ++ // Store pthread info into the OSThread ++ osthread->set_thread_id(os::Aix::gettid()); ++ osthread->set_pthread_id(::pthread_self()); ++ ++ // initialize floating point control register ++ os::Aix::init_thread_fpu_state(); ++ ++ // some sanity checks ++ CHECK_CURRENT_STACK_PTR(thread->stack_base(), thread->stack_size()); ++ ++ // Initial thread state is RUNNABLE ++ osthread->set_state(RUNNABLE); ++ ++ thread->set_osthread(osthread); ++ ++ if (UseNUMA) { ++ int lgrp_id = os::numa_get_group_id(); ++ if (lgrp_id != -1) { ++ thread->set_lgrp_id(lgrp_id); ++ } ++ } ++ ++ // initialize signal mask for this thread ++ // and save the caller's signal mask ++ os::Aix::hotspot_sigmask(thread); ++ ++ return true; ++} ++ ++void os::pd_start_thread(Thread* thread) { ++ int status = pthread_continue_np(thread->osthread()->pthread_id()); ++ assert(status == 0, "thr_continue failed"); ++} ++ ++// Free OS resources related to the OSThread ++void os::free_thread(OSThread* osthread) { ++ assert(osthread != NULL, "osthread not set"); ++ ++ if (Thread::current()->osthread() == osthread) { ++ // Restore caller's signal mask ++ sigset_t sigmask = osthread->caller_sigmask(); ++ pthread_sigmask(SIG_SETMASK, &sigmask, NULL); ++ } ++ ++ delete osthread; ++} ++ ++////////////////////////////////////////////////////////////////////////////// ++// thread local storage ++ ++int os::allocate_thread_local_storage() { ++ pthread_key_t key; ++ int rslt = pthread_key_create(&key, NULL); ++ assert(rslt == 0, "cannot allocate thread local storage"); ++ return (int)key; ++} ++ ++// Note: This is currently not used by VM, as we don't destroy TLS key ++// on VM exit. ++void os::free_thread_local_storage(int index) { ++ int rslt = pthread_key_delete((pthread_key_t)index); ++ assert(rslt == 0, "invalid index"); ++} ++ ++void os::thread_local_storage_at_put(int index, void* value) { ++ int rslt = pthread_setspecific((pthread_key_t)index, value); ++ assert(rslt == 0, "pthread_setspecific failed"); ++} ++ ++extern "C" Thread* get_thread() { ++ return ThreadLocalStorage::thread(); ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// time support ++ ++// Time since start-up in seconds to a fine granularity. ++// Used by VMSelfDestructTimer and the MemProfiler. ++double os::elapsedTime() { ++ return (double)(os::elapsed_counter()) * 0.000001; ++} ++ ++jlong os::elapsed_counter() { ++ timeval time; ++ int status = gettimeofday(&time, NULL); ++ return jlong(time.tv_sec) * 1000 * 1000 + jlong(time.tv_usec) - initial_time_count; ++} ++ ++jlong os::elapsed_frequency() { ++ return (1000 * 1000); ++} ++ ++// For now, we say that linux does not support vtime. I have no idea ++// whether it can actually be made to (DLD, 9/13/05). ++ ++bool os::supports_vtime() { return false; } ++bool os::enable_vtime() { return false; } ++bool os::vtime_enabled() { return false; } ++double os::elapsedVTime() { ++ // better than nothing, but not much ++ return elapsedTime(); ++} ++ ++jlong os::javaTimeMillis() { ++ timeval time; ++ int status = gettimeofday(&time, NULL); ++ assert(status != -1, "aix error at gettimeofday()"); ++ return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000); ++} ++ ++// We need to manually declare mread_real_time, ++// because IBM didn't provide a prototype in time.h. ++// (they probably only ever tested in C, not C++) ++extern "C" ++int mread_real_time(timebasestruct_t *t, size_t size_of_timebasestruct_t); ++ ++jlong os::javaTimeNanos() { ++ if (os::Aix::on_pase()) { ++ Unimplemented(); ++ return 0; ++ } ++ else { ++ // On AIX use the precision of processors real time clock ++ // or time base registers. ++ timebasestruct_t time; ++ int rc; ++ ++ // If the CPU has a time register, it will be used and ++ // we have to convert to real time first. After convertion we have following data: ++ // time.tb_high [seconds since 00:00:00 UTC on 1.1.1970] ++ // time.tb_low [nanoseconds after the last full second above] ++ // We better use mread_real_time here instead of read_real_time ++ // to ensure that we will get a monotonic increasing time. ++ if (mread_real_time(&time, TIMEBASE_SZ) != RTC_POWER) { ++ rc = time_base_to_time(&time, TIMEBASE_SZ); ++ assert(rc != -1, "aix error at time_base_to_time()"); ++ } ++ return jlong(time.tb_high) * (1000 * 1000 * 1000) + jlong(time.tb_low); ++ } ++} ++ ++void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) { ++ { ++ // gettimeofday - based on time in seconds since the Epoch thus does not wrap ++ info_ptr->max_value = ALL_64_BITS; ++ ++ // gettimeofday is a real time clock so it skips ++ info_ptr->may_skip_backward = true; ++ info_ptr->may_skip_forward = true; ++ } ++ ++ info_ptr->kind = JVMTI_TIMER_ELAPSED; // elapsed not CPU time ++} ++ ++// Return the real, user, and system times in seconds from an ++// arbitrary fixed point in the past. ++bool os::getTimesSecs(double* process_real_time, ++ double* process_user_time, ++ double* process_system_time) { ++ struct tms ticks; ++ clock_t real_ticks = times(&ticks); ++ ++ if (real_ticks == (clock_t) (-1)) { ++ return false; ++ } else { ++ double ticks_per_second = (double) clock_tics_per_sec; ++ *process_user_time = ((double) ticks.tms_utime) / ticks_per_second; ++ *process_system_time = ((double) ticks.tms_stime) / ticks_per_second; ++ *process_real_time = ((double) real_ticks) / ticks_per_second; ++ ++ return true; ++ } ++} ++ ++ ++char * os::local_time_string(char *buf, size_t buflen) { ++ struct tm t; ++ time_t long_time; ++ time(&long_time); ++ localtime_r(&long_time, &t); ++ jio_snprintf(buf, buflen, "%d-%02d-%02d %02d:%02d:%02d", ++ t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, ++ t.tm_hour, t.tm_min, t.tm_sec); ++ return buf; ++} ++ ++struct tm* os::localtime_pd(const time_t* clock, struct tm* res) { ++ return localtime_r(clock, res); ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// runtime exit support ++ ++// Note: os::shutdown() might be called very early during initialization, or ++// called from signal handler. Before adding something to os::shutdown(), make ++// sure it is async-safe and can handle partially initialized VM. ++void os::shutdown() { ++ ++ // allow PerfMemory to attempt cleanup of any persistent resources ++ perfMemory_exit(); ++ ++ // needs to remove object in file system ++ AttachListener::abort(); ++ ++ // flush buffered output, finish log files ++ ostream_abort(); ++ ++ // Check for abort hook ++ abort_hook_t abort_hook = Arguments::abort_hook(); ++ if (abort_hook != NULL) { ++ abort_hook(); ++ } ++ ++} ++ ++// Note: os::abort() might be called very early during initialization, or ++// called from signal handler. Before adding something to os::abort(), make ++// sure it is async-safe and can handle partially initialized VM. ++void os::abort(bool dump_core) { ++ os::shutdown(); ++ if (dump_core) { ++#ifndef PRODUCT ++ fdStream out(defaultStream::output_fd()); ++ out.print_raw("Current thread is "); ++ char buf[16]; ++ jio_snprintf(buf, sizeof(buf), UINTX_FORMAT, os::current_thread_id()); ++ out.print_raw_cr(buf); ++ out.print_raw_cr("Dumping core ..."); ++#endif ++ ::abort(); // dump core ++ } ++ ++ ::exit(1); ++} ++ ++// Die immediately, no exit hook, no abort hook, no cleanup. ++void os::die() { ++ ::abort(); ++} ++ ++// This method is a copy of JDK's sysGetLastErrorString ++// from src/solaris/hpi/src/system_md.c ++ ++size_t os::lasterror(char *buf, size_t len) { ++ ++ if (errno == 0) return 0; ++ ++ const char *s = ::strerror(errno); ++ size_t n = ::strlen(s); ++ if (n >= len) { ++ n = len - 1; ++ } ++ ::strncpy(buf, s, n); ++ buf[n] = '\0'; ++ return n; ++} ++ ++intx os::current_thread_id() { return (intx)pthread_self(); } ++int os::current_process_id() { ++ ++ // This implementation returns a unique pid, the pid of the ++ // launcher thread that starts the vm 'process'. ++ ++ // Under POSIX, getpid() returns the same pid as the ++ // launcher thread rather than a unique pid per thread. ++ // Use gettid() if you want the old pre NPTL behaviour. ++ ++ // if you are looking for the result of a call to getpid() that ++ // returns a unique pid for the calling thread, then look at the ++ // OSThread::thread_id() method in osThread_linux.hpp file ++ ++ return (int)(_initial_pid ? _initial_pid : getpid()); ++} ++ ++// DLL functions ++ ++const char* os::dll_file_extension() { return ".so"; } ++ ++// This must be hard coded because it's the system's temporary ++// directory not the java application's temp directory, ala java.io.tmpdir. ++const char* os::get_temp_directory() { return "/tmp"; } ++ ++static bool file_exists(const char* filename) { ++ struct stat statbuf; ++ if (filename == NULL || strlen(filename) == 0) { ++ return false; ++ } ++ return os::stat(filename, &statbuf) == 0; ++} ++ ++bool os::dll_build_name(char* buffer, size_t buflen, ++ const char* pname, const char* fname) { ++ bool retval = false; ++ // Copied from libhpi ++ const size_t pnamelen = pname ? strlen(pname) : 0; ++ ++ // Return error on buffer overflow. ++ if (pnamelen + strlen(fname) + 10 > (size_t) buflen) { ++ *buffer = '\0'; ++ return retval; ++ } ++ ++ if (pnamelen == 0) { ++ snprintf(buffer, buflen, "lib%s.so", fname); ++ retval = true; ++ } else if (strchr(pname, *os::path_separator()) != NULL) { ++ int n; ++ char** pelements = split_path(pname, &n); ++ for (int i = 0; i < n; i++) { ++ // Really shouldn't be NULL, but check can't hurt ++ if (pelements[i] == NULL || strlen(pelements[i]) == 0) { ++ continue; // skip the empty path values ++ } ++ snprintf(buffer, buflen, "%s/lib%s.so", pelements[i], fname); ++ if (file_exists(buffer)) { ++ retval = true; ++ break; ++ } ++ } ++ // release the storage ++ for (int i = 0; i < n; i++) { ++ if (pelements[i] != NULL) { ++ FREE_C_HEAP_ARRAY(char, pelements[i], mtInternal); ++ } ++ } ++ if (pelements != NULL) { ++ FREE_C_HEAP_ARRAY(char*, pelements, mtInternal); ++ } ++ } else { ++ snprintf(buffer, buflen, "%s/lib%s.so", pname, fname); ++ retval = true; ++ } ++ return retval; ++} ++ ++// Check if addr is inside libjvm.so. ++bool os::address_is_in_vm(address addr) { ++ ++ // Input could be a real pc or a function pointer literal. The latter ++ // would be a function descriptor residing in the data segment of a module. ++ ++ const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr); ++ if (lib) { ++ if (strcmp(lib->get_shortname(), "libjvm.so") == 0) { ++ return true; ++ } else { ++ return false; ++ } ++ } else { ++ lib = LoadedLibraries::find_for_data_address(addr); ++ if (lib) { ++ if (strcmp(lib->get_shortname(), "libjvm.so") == 0) { ++ return true; ++ } else { ++ return false; ++ } ++ } else { ++ return false; ++ } ++ } ++} ++ ++// Resolve an AIX function descriptor literal to a code pointer. ++// If the input is a valid code pointer to a text segment of a loaded module, ++// it is returned unchanged. ++// If the input is a valid AIX function descriptor, it is resolved to the ++// code entry point. ++// If the input is neither a valid function descriptor nor a valid code pointer, ++// NULL is returned. ++static address resolve_function_descriptor_to_code_pointer(address p) { ++ ++ const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(p); ++ if (lib) { ++ // its a real code pointer ++ return p; ++ } else { ++ lib = LoadedLibraries::find_for_data_address(p); ++ if (lib) { ++ // pointer to data segment, potential function descriptor ++ address code_entry = (address)(((FunctionDescriptor*)p)->entry()); ++ if (LoadedLibraries::find_for_text_address(code_entry)) { ++ // Its a function descriptor ++ return code_entry; ++ } ++ } ++ } ++ return NULL; ++} ++ ++bool os::dll_address_to_function_name(address addr, char *buf, ++ int buflen, int *offset) { ++ if (offset) { ++ *offset = -1; ++ } ++ if (buf) { ++ buf[0] = '\0'; ++ } ++ ++ // Resolve function ptr literals first. ++ addr = resolve_function_descriptor_to_code_pointer(addr); ++ if (!addr) { ++ return false; ++ } ++ ++ // Go through Decoder::decode to call getFuncName which reads the name from the traceback table. ++ return Decoder::decode(addr, buf, buflen, offset); ++} ++ ++static int getModuleName(codeptr_t pc, // [in] program counter ++ char* p_name, size_t namelen, // [out] optional: function name ++ char* p_errmsg, size_t errmsglen // [out] optional: user provided buffer for error messages ++ ) { ++ ++ // initialize output parameters ++ if (p_name && namelen > 0) { ++ *p_name = '\0'; ++ } ++ if (p_errmsg && errmsglen > 0) { ++ *p_errmsg = '\0'; ++ } ++ ++ const LoadedLibraryModule* const lib = LoadedLibraries::find_for_text_address((address)pc); ++ if (lib) { ++ if (p_name && namelen > 0) { ++ sprintf(p_name, "%.*s", namelen, lib->get_shortname()); ++ } ++ return 0; ++ } ++ ++ if (Verbose) { ++ fprintf(stderr, "pc outside any module"); ++ } ++ ++ return -1; ++ ++} ++ ++bool os::dll_address_to_library_name(address addr, char* buf, ++ int buflen, int* offset) { ++ if (offset) { ++ *offset = -1; ++ } ++ if (buf) { ++ buf[0] = '\0'; ++ } ++ ++ // Resolve function ptr literals first. ++ addr = resolve_function_descriptor_to_code_pointer(addr); ++ if (!addr) { ++ return false; ++ } ++ ++ if (::getModuleName((codeptr_t) addr, buf, buflen, 0, 0) == 0) { ++ return true; ++ } ++ return false; ++} ++ ++// Loads .dll/.so and in case of error it checks if .dll/.so was built ++// for the same architecture as Hotspot is running on ++void *os::dll_load(const char *filename, char *ebuf, int ebuflen) { ++ ++ if (ebuf && ebuflen > 0) { ++ ebuf[0] = '\0'; ++ ebuf[ebuflen - 1] = '\0'; ++ } ++ ++ if (!filename || strlen(filename) == 0) { ++ ::strncpy(ebuf, "dll_load: empty filename specified", ebuflen - 1); ++ return NULL; ++ } ++ ++ // RTLD_LAZY is currently not implemented. The dl is loaded immediately with all its dependants. ++ void * result= ::dlopen(filename, RTLD_LAZY); ++ if (result != NULL) { ++ // Reload dll cache. Don't do this in signal handling. ++ LoadedLibraries::reload(); ++ return result; ++ } else { ++ // error analysis when dlopen fails ++ const char* const error_report = ::dlerror(); ++ if (error_report && ebuf && ebuflen > 0) { ++ snprintf(ebuf, ebuflen - 1, "%s, LIBPATH=%s, LD_LIBRARY_PATH=%s : %s", ++ filename, ::getenv("LIBPATH"), ::getenv("LD_LIBRARY_PATH"), error_report); ++ } ++ } ++ return NULL; ++} ++ ++// Glibc-2.0 libdl is not MT safe. If you are building with any glibc, ++// chances are you might want to run the generated bits against glibc-2.0 ++// libdl.so, so always use locking for any version of glibc. ++void* os::dll_lookup(void* handle, const char* name) { ++ pthread_mutex_lock(&dl_mutex); ++ void* res = dlsym(handle, name); ++ pthread_mutex_unlock(&dl_mutex); ++ return res; ++} ++ ++void* os::get_default_process_handle() { ++ return (void*)::dlopen(NULL, RTLD_LAZY); ++} ++ ++void os::print_dll_info(outputStream *st) { ++ st->print_cr("Dynamic libraries:"); ++ LoadedLibraries::print(st); ++} ++ ++void os::print_os_info(outputStream* st) { ++ st->print("OS:"); ++ ++ st->print("uname:"); ++ struct utsname name; ++ uname(&name); ++ st->print(name.sysname); st->print(" "); ++ st->print(name.nodename); st->print(" "); ++ st->print(name.release); st->print(" "); ++ st->print(name.version); st->print(" "); ++ st->print(name.machine); ++ st->cr(); ++ ++ // rlimit ++ st->print("rlimit:"); ++ struct rlimit rlim; ++ ++ st->print(" STACK "); ++ getrlimit(RLIMIT_STACK, &rlim); ++ if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); ++ else st->print("%uk", rlim.rlim_cur >> 10); ++ ++ st->print(", CORE "); ++ getrlimit(RLIMIT_CORE, &rlim); ++ if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); ++ else st->print("%uk", rlim.rlim_cur >> 10); ++ ++ st->print(", NPROC "); ++ st->print("%d", sysconf(_SC_CHILD_MAX)); ++ ++ st->print(", NOFILE "); ++ getrlimit(RLIMIT_NOFILE, &rlim); ++ if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); ++ else st->print("%d", rlim.rlim_cur); ++ ++ st->print(", AS "); ++ getrlimit(RLIMIT_AS, &rlim); ++ if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); ++ else st->print("%uk", rlim.rlim_cur >> 10); ++ ++ // Print limits on DATA, because it limits the C-heap. ++ st->print(", DATA "); ++ getrlimit(RLIMIT_DATA, &rlim); ++ if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); ++ else st->print("%uk", rlim.rlim_cur >> 10); ++ st->cr(); ++ ++ // load average ++ st->print("load average:"); ++ double loadavg[3] = {-1.L, -1.L, -1.L}; ++ os::loadavg(loadavg, 3); ++ st->print("%0.02f %0.02f %0.02f", loadavg[0], loadavg[1], loadavg[2]); ++ st->cr(); ++} ++ ++void os::print_memory_info(outputStream* st) { ++ ++ st->print_cr("Memory:"); ++ ++ st->print_cr(" default page size: %s", describe_pagesize(os::vm_page_size())); ++ st->print_cr(" default stack page size: %s", describe_pagesize(os::vm_page_size())); ++ st->print_cr(" default shm page size: %s", describe_pagesize(os::Aix::shm_default_page_size())); ++ st->print_cr(" can use 64K pages dynamically: %s", (os::Aix::can_use_64K_pages() ? "yes" :"no")); ++ st->print_cr(" can use 16M pages dynamically: %s", (os::Aix::can_use_16M_pages() ? "yes" :"no")); ++ if (g_multipage_error != 0) { ++ st->print_cr(" multipage error: %d", g_multipage_error); ++ } ++ ++ // print out LDR_CNTRL because it affects the default page sizes ++ const char* const ldr_cntrl = ::getenv("LDR_CNTRL"); ++ st->print_cr(" LDR_CNTRL=%s.", ldr_cntrl ? ldr_cntrl : ""); ++ ++ const char* const extshm = ::getenv("EXTSHM"); ++ st->print_cr(" EXTSHM=%s.", extshm ? extshm : ""); ++ ++ // Call os::Aix::get_meminfo() to retrieve memory statistics. ++ os::Aix::meminfo_t mi; ++ if (os::Aix::get_meminfo(&mi)) { ++ char buffer[256]; ++ if (os::Aix::on_aix()) { ++ jio_snprintf(buffer, sizeof(buffer), ++ " physical total : %llu\n" ++ " physical free : %llu\n" ++ " swap total : %llu\n" ++ " swap free : %llu\n", ++ mi.real_total, ++ mi.real_free, ++ mi.pgsp_total, ++ mi.pgsp_free); ++ } else { ++ Unimplemented(); ++ } ++ st->print_raw(buffer); ++ } else { ++ st->print_cr(" (no more information available)"); ++ } ++} ++ ++void os::pd_print_cpu_info(outputStream* st) { ++ // cpu ++ st->print("CPU:"); ++ st->print("total %d", os::processor_count()); ++ // It's not safe to query number of active processors after crash ++ // st->print("(active %d)", os::active_processor_count()); ++ st->print(" %s", VM_Version::cpu_features()); ++ st->cr(); ++} ++ ++void os::print_siginfo(outputStream* st, void* siginfo) { ++ // Use common posix version. ++ os::Posix::print_siginfo_brief(st, (const siginfo_t*) siginfo); ++ st->cr(); ++} ++ ++ ++static void print_signal_handler(outputStream* st, int sig, ++ char* buf, size_t buflen); ++ ++void os::print_signal_handlers(outputStream* st, char* buf, size_t buflen) { ++ st->print_cr("Signal Handlers:"); ++ print_signal_handler(st, SIGSEGV, buf, buflen); ++ print_signal_handler(st, SIGBUS , buf, buflen); ++ print_signal_handler(st, SIGFPE , buf, buflen); ++ print_signal_handler(st, SIGPIPE, buf, buflen); ++ print_signal_handler(st, SIGXFSZ, buf, buflen); ++ print_signal_handler(st, SIGILL , buf, buflen); ++ print_signal_handler(st, INTERRUPT_SIGNAL, buf, buflen); ++ print_signal_handler(st, SR_signum, buf, buflen); ++ print_signal_handler(st, SHUTDOWN1_SIGNAL, buf, buflen); ++ print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen); ++ print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen); ++ print_signal_handler(st, BREAK_SIGNAL, buf, buflen); ++ print_signal_handler(st, SIGTRAP, buf, buflen); ++ print_signal_handler(st, SIGDANGER, buf, buflen); ++} ++ ++static char saved_jvm_path[MAXPATHLEN] = {0}; ++ ++// Find the full path to the current module, libjvm.so or libjvm_g.so ++void os::jvm_path(char *buf, jint buflen) { ++ // Error checking. ++ if (buflen < MAXPATHLEN) { ++ assert(false, "must use a large-enough buffer"); ++ buf[0] = '\0'; ++ return; ++ } ++ // Lazy resolve the path to current module. ++ if (saved_jvm_path[0] != 0) { ++ strcpy(buf, saved_jvm_path); ++ return; ++ } ++ ++ Dl_info dlinfo; ++ int ret = dladdr(CAST_FROM_FN_PTR(void *, os::jvm_path), &dlinfo); ++ assert(ret != 0, "cannot locate libjvm"); ++ char* rp = realpath((char *)dlinfo.dli_fname, buf); ++ assert(rp != NULL, "error in realpath(): maybe the 'path' argument is too long?"); ++ ++ strcpy(saved_jvm_path, buf); ++} ++ ++void os::print_jni_name_prefix_on(outputStream* st, int args_size) { ++ // no prefix required, not even "_" ++} ++ ++void os::print_jni_name_suffix_on(outputStream* st, int args_size) { ++ // no suffix required ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// sun.misc.Signal support ++ ++static volatile jint sigint_count = 0; ++ ++static void ++UserHandler(int sig, void *siginfo, void *context) { ++ // 4511530 - sem_post is serialized and handled by the manager thread. When ++ // the program is interrupted by Ctrl-C, SIGINT is sent to every thread. We ++ // don't want to flood the manager thread with sem_post requests. ++ if (sig == SIGINT && Atomic::add(1, &sigint_count) > 1) ++ return; ++ ++ // Ctrl-C is pressed during error reporting, likely because the error ++ // handler fails to abort. Let VM die immediately. ++ if (sig == SIGINT && is_error_reported()) { ++ os::die(); ++ } ++ ++ os::signal_notify(sig); ++} ++ ++void* os::user_handler() { ++ return CAST_FROM_FN_PTR(void*, UserHandler); ++} ++ ++extern "C" { ++ typedef void (*sa_handler_t)(int); ++ typedef void (*sa_sigaction_t)(int, siginfo_t *, void *); ++} ++ ++void* os::signal(int signal_number, void* handler) { ++ struct sigaction sigAct, oldSigAct; ++ ++ sigfillset(&(sigAct.sa_mask)); ++ ++ // Do not block out synchronous signals in the signal handler. ++ // Blocking synchronous signals only makes sense if you can really ++ // be sure that those signals won't happen during signal handling, ++ // when the blocking applies. Normal signal handlers are lean and ++ // do not cause signals. But our signal handlers tend to be "risky" ++ // - secondary SIGSEGV, SIGILL, SIGBUS' may and do happen. ++ // On AIX, PASE there was a case where a SIGSEGV happened, followed ++ // by a SIGILL, which was blocked due to the signal mask. The process ++ // just hung forever. Better to crash from a secondary signal than to hang. ++ sigdelset(&(sigAct.sa_mask), SIGSEGV); ++ sigdelset(&(sigAct.sa_mask), SIGBUS); ++ sigdelset(&(sigAct.sa_mask), SIGILL); ++ sigdelset(&(sigAct.sa_mask), SIGFPE); ++ sigdelset(&(sigAct.sa_mask), SIGTRAP); ++ ++ sigAct.sa_flags = SA_RESTART|SA_SIGINFO; ++ ++ sigAct.sa_handler = CAST_TO_FN_PTR(sa_handler_t, handler); ++ ++ if (sigaction(signal_number, &sigAct, &oldSigAct)) { ++ // -1 means registration failed ++ return (void *)-1; ++ } ++ ++ return CAST_FROM_FN_PTR(void*, oldSigAct.sa_handler); ++} ++ ++void os::signal_raise(int signal_number) { ++ ::raise(signal_number); ++} ++ ++// ++// The following code is moved from os.cpp for making this ++// code platform specific, which it is by its very nature. ++// ++ ++// Will be modified when max signal is changed to be dynamic ++int os::sigexitnum_pd() { ++ return NSIG; ++} ++ ++// a counter for each possible signal value ++static volatile jint pending_signals[NSIG+1] = { 0 }; ++ ++// Linux(POSIX) specific hand shaking semaphore. ++static sem_t sig_sem; ++ ++void os::signal_init_pd() { ++ // Initialize signal structures ++ ::memset((void*)pending_signals, 0, sizeof(pending_signals)); ++ ++ // Initialize signal semaphore ++ int rc = ::sem_init(&sig_sem, 0, 0); ++ guarantee(rc != -1, "sem_init failed"); ++} ++ ++void os::signal_notify(int sig) { ++ Atomic::inc(&pending_signals[sig]); ++ ::sem_post(&sig_sem); ++} ++ ++static int check_pending_signals(bool wait) { ++ Atomic::store(0, &sigint_count); ++ for (;;) { ++ for (int i = 0; i < NSIG + 1; i++) { ++ jint n = pending_signals[i]; ++ if (n > 0 && n == Atomic::cmpxchg(n - 1, &pending_signals[i], n)) { ++ return i; ++ } ++ } ++ if (!wait) { ++ return -1; ++ } ++ JavaThread *thread = JavaThread::current(); ++ ThreadBlockInVM tbivm(thread); ++ ++ bool threadIsSuspended; ++ do { ++ thread->set_suspend_equivalent(); ++ // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() ++ ++ ::sem_wait(&sig_sem); ++ ++ // were we externally suspended while we were waiting? ++ threadIsSuspended = thread->handle_special_suspend_equivalent_condition(); ++ if (threadIsSuspended) { ++ // ++ // The semaphore has been incremented, but while we were waiting ++ // another thread suspended us. We don't want to continue running ++ // while suspended because that would surprise the thread that ++ // suspended us. ++ // ++ ::sem_post(&sig_sem); ++ ++ thread->java_suspend_self(); ++ } ++ } while (threadIsSuspended); ++ } ++} ++ ++int os::signal_lookup() { ++ return check_pending_signals(false); ++} ++ ++int os::signal_wait() { ++ return check_pending_signals(true); ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// Virtual Memory ++ ++// AddrRange describes an immutable address range ++// ++// This is a helper class for the 'shared memory bookkeeping' below. ++class AddrRange { ++ friend class ShmBkBlock; ++ ++ char* _start; ++ size_t _size; ++ ++public: ++ ++ AddrRange(char* start, size_t size) ++ : _start(start), _size(size) ++ {} ++ ++ AddrRange(const AddrRange& r) ++ : _start(r.start()), _size(r.size()) ++ {} ++ ++ char* start() const { return _start; } ++ size_t size() const { return _size; } ++ char* end() const { return _start + _size; } ++ bool is_empty() const { return _size == 0 ? true : false; } ++ ++ static AddrRange empty_range() { return AddrRange(NULL, 0); } ++ ++ bool contains(const char* p) const { ++ return start() <= p && end() > p; ++ } ++ ++ bool contains(const AddrRange& range) const { ++ return start() <= range.start() && end() >= range.end(); ++ } ++ ++ bool intersects(const AddrRange& range) const { ++ return (range.start() <= start() && range.end() > start()) || ++ (range.start() < end() && range.end() >= end()) || ++ contains(range); ++ } ++ ++ bool is_same_range(const AddrRange& range) const { ++ return start() == range.start() && size() == range.size(); ++ } ++ ++ // return the closest inside range consisting of whole pages ++ AddrRange find_closest_aligned_range(size_t pagesize) const { ++ if (pagesize == 0 || is_empty()) { ++ return empty_range(); ++ } ++ char* const from = (char*)align_size_up((intptr_t)_start, pagesize); ++ char* const to = (char*)align_size_down((intptr_t)end(), pagesize); ++ if (from > to) { ++ return empty_range(); ++ } ++ return AddrRange(from, to - from); ++ } ++}; ++ ++//////////////////////////////////////////////////////////////////////////// ++// shared memory bookkeeping ++// ++// the os::reserve_memory() API and friends hand out different kind of memory, depending ++// on need and circumstances. Memory may be allocated with mmap() or with shmget/shmat. ++// ++// But these memory types have to be treated differently. For example, to uncommit ++// mmap-based memory, msync(MS_INVALIDATE) is needed, to uncommit shmat-based memory, ++// disclaim64() is needed. ++// ++// Therefore we need to keep track of the allocated memory segments and their ++// properties. ++ ++// ShmBkBlock: base class for all blocks in the shared memory bookkeeping ++class ShmBkBlock { ++ ++ ShmBkBlock* _next; ++ ++protected: ++ ++ AddrRange _range; ++ const size_t _pagesize; ++ const bool _pinned; ++ ++public: ++ ++ ShmBkBlock(AddrRange range, size_t pagesize, bool pinned) ++ : _range(range), _pagesize(pagesize), _pinned(pinned) , _next(NULL) { ++ ++ assert(_pagesize == SIZE_4K || _pagesize == SIZE_64K || _pagesize == SIZE_16M, "invalid page size"); ++ assert(!_range.is_empty(), "invalid range"); ++ } ++ ++ virtual void print(outputStream* st) const { ++ st->print("0x%p ... 0x%p (%llu) - %d %s pages - %s", ++ _range.start(), _range.end(), _range.size(), ++ _range.size() / _pagesize, describe_pagesize(_pagesize), ++ _pinned ? "pinned" : ""); ++ } ++ ++ enum Type { MMAP, SHMAT }; ++ virtual Type getType() = 0; ++ ++ char* base() const { return _range.start(); } ++ size_t size() const { return _range.size(); } ++ ++ void setAddrRange(AddrRange range) { ++ _range = range; ++ } ++ ++ bool containsAddress(const char* p) const { ++ return _range.contains(p); ++ } ++ ++ bool containsRange(const char* p, size_t size) const { ++ return _range.contains(AddrRange((char*)p, size)); ++ } ++ ++ bool isSameRange(const char* p, size_t size) const { ++ return _range.is_same_range(AddrRange((char*)p, size)); ++ } ++ ++ virtual bool disclaim(char* p, size_t size) = 0; ++ virtual bool release() = 0; ++ ++ // blocks live in a list. ++ ShmBkBlock* next() const { return _next; } ++ void set_next(ShmBkBlock* blk) { _next = blk; } ++ ++}; // end: ShmBkBlock ++ ++ ++// ShmBkMappedBlock: describes an block allocated with mmap() ++class ShmBkMappedBlock : public ShmBkBlock { ++public: ++ ++ ShmBkMappedBlock(AddrRange range) ++ : ShmBkBlock(range, SIZE_4K, false) {} // mmap: always 4K, never pinned ++ ++ void print(outputStream* st) const { ++ ShmBkBlock::print(st); ++ st->print_cr(" - mmap'ed"); ++ } ++ ++ Type getType() { ++ return MMAP; ++ } ++ ++ bool disclaim(char* p, size_t size) { ++ ++ AddrRange r(p, size); ++ ++ guarantee(_range.contains(r), "invalid disclaim"); ++ ++ // only disclaim whole ranges. ++ const AddrRange r2 = r.find_closest_aligned_range(_pagesize); ++ if (r2.is_empty()) { ++ return true; ++ } ++ ++ const int rc = ::msync(r2.start(), r2.size(), MS_INVALIDATE); ++ ++ if (rc != 0) { ++ warning("msync(0x%p, %llu, MS_INVALIDATE) failed (%d)\n", r2.start(), r2.size(), errno); ++ } ++ ++ return rc == 0 ? true : false; ++ } ++ ++ bool release() { ++ // mmap'ed blocks are released using munmap ++ if (::munmap(_range.start(), _range.size()) != 0) { ++ warning("munmap(0x%p, %llu) failed (%d)\n", _range.start(), _range.size(), errno); ++ return false; ++ } ++ return true; ++ } ++}; // end: ShmBkMappedBlock ++ ++// ShmBkShmatedBlock: describes an block allocated with shmget/shmat() ++class ShmBkShmatedBlock : public ShmBkBlock { ++public: ++ ++ ShmBkShmatedBlock(AddrRange range, size_t pagesize, bool pinned) ++ : ShmBkBlock(range, pagesize, pinned) {} ++ ++ void print(outputStream* st) const { ++ ShmBkBlock::print(st); ++ st->print_cr(" - shmat'ed"); ++ } ++ ++ Type getType() { ++ return SHMAT; ++ } ++ ++ bool disclaim(char* p, size_t size) { ++ ++ AddrRange r(p, size); ++ ++ if (_pinned) { ++ return true; ++ } ++ ++ // shmat'ed blocks are disclaimed using disclaim64 ++ guarantee(_range.contains(r), "invalid disclaim"); ++ ++ // only disclaim whole ranges. ++ const AddrRange r2 = r.find_closest_aligned_range(_pagesize); ++ if (r2.is_empty()) { ++ return true; ++ } ++ ++ const bool rc = my_disclaim64(r2.start(), r2.size()); ++ ++ if (Verbose && !rc) { ++ warning("failed to disclaim shm %p-%p\n", r2.start(), r2.end()); ++ } ++ ++ return rc; ++ } ++ ++ bool release() { ++ bool rc = false; ++ if (::shmdt(_range.start()) != 0) { ++ warning("shmdt(0x%p) failed (%d)\n", _range.start(), errno); ++ } else { ++ rc = true; ++ } ++ return rc; ++ } ++ ++}; // end: ShmBkShmatedBlock ++ ++static ShmBkBlock* g_shmbk_list = NULL; ++static volatile jint g_shmbk_table_lock = 0; ++ ++// keep some usage statistics ++static struct { ++ int nodes; // number of nodes in list ++ size_t bytes; // reserved - not committed - bytes. ++ int reserves; // how often reserve was called ++ int lookups; // how often a lookup was made ++} g_shmbk_stats = { 0, 0, 0, 0 }; ++ ++// add information about a shared memory segment to the bookkeeping ++static void shmbk_register(ShmBkBlock* p_block) { ++ guarantee(p_block, "logic error"); ++ p_block->set_next(g_shmbk_list); ++ g_shmbk_list = p_block; ++ g_shmbk_stats.reserves ++; ++ g_shmbk_stats.bytes += p_block->size(); ++ g_shmbk_stats.nodes ++; ++} ++ ++// remove information about a shared memory segment by its starting address ++static void shmbk_unregister(ShmBkBlock* p_block) { ++ ShmBkBlock* p = g_shmbk_list; ++ ShmBkBlock* prev = NULL; ++ while (p) { ++ if (p == p_block) { ++ if (prev) { ++ prev->set_next(p->next()); ++ } else { ++ g_shmbk_list = p->next(); ++ } ++ g_shmbk_stats.nodes --; ++ g_shmbk_stats.bytes -= p->size(); ++ return; ++ } ++ prev = p; ++ p = p->next(); ++ } ++ assert(false, "should not happen"); ++} ++ ++// given a pointer, return shared memory bookkeeping record for the segment it points into ++// using the returned block info must happen under lock protection ++static ShmBkBlock* shmbk_find_by_containing_address(const char* addr) { ++ g_shmbk_stats.lookups ++; ++ ShmBkBlock* p = g_shmbk_list; ++ while (p) { ++ if (p->containsAddress(addr)) { ++ return p; ++ } ++ p = p->next(); ++ } ++ return NULL; ++} ++ ++// dump all information about all memory segments allocated with os::reserve_memory() ++void shmbk_dump_info() { ++ tty->print_cr("-- shared mem bookkeeping (alive: %d segments, %llu bytes, " ++ "total reserves: %d total lookups: %d)", ++ g_shmbk_stats.nodes, g_shmbk_stats.bytes, g_shmbk_stats.reserves, g_shmbk_stats.lookups); ++ const ShmBkBlock* p = g_shmbk_list; ++ int i = 0; ++ while (p) { ++ p->print(tty); ++ p = p->next(); ++ i ++; ++ } ++} ++ ++#define LOCK_SHMBK { ThreadCritical _LOCK_SHMBK; ++#define UNLOCK_SHMBK } ++ ++// End: shared memory bookkeeping ++//////////////////////////////////////////////////////////////////////////////////////////////////// ++ ++int os::vm_page_size() { ++ // Seems redundant as all get out ++ assert(os::Aix::page_size() != -1, "must call os::init"); ++ return os::Aix::page_size(); ++} ++ ++// Aix allocates memory by pages. ++int os::vm_allocation_granularity() { ++ assert(os::Aix::page_size() != -1, "must call os::init"); ++ return os::Aix::page_size(); ++} ++ ++int os::Aix::commit_memory_impl(char* addr, size_t size, bool exec) { ++ ++ // Commit is a noop. There is no explicit commit ++ // needed on AIX. Memory is committed when touched. ++ // ++ // Debug : check address range for validity ++#ifdef ASSERT ++ LOCK_SHMBK ++ ShmBkBlock* const block = shmbk_find_by_containing_address(addr); ++ if (!block) { ++ fprintf(stderr, "invalid pointer: " INTPTR_FORMAT "\n", addr); ++ shmbk_dump_info(); ++ assert(false, "invalid pointer"); ++ return false; ++ } else if (!block->containsRange(addr, size)) { ++ fprintf(stderr, "invalid range: " INTPTR_FORMAT " .. " INTPTR_FORMAT "\n", addr, addr + size); ++ shmbk_dump_info(); ++ assert(false, "invalid range"); ++ return false; ++ } ++ UNLOCK_SHMBK ++#endif // ASSERT ++ ++ return 0; ++} ++ ++bool os::pd_commit_memory(char* addr, size_t size, bool exec) { ++ return os::Aix::commit_memory_impl(addr, size, exec) == 0; ++} ++ ++void os::pd_commit_memory_or_exit(char* addr, size_t size, bool exec, ++ const char* mesg) { ++ assert(mesg != NULL, "mesg must be specified"); ++ os::Aix::commit_memory_impl(addr, size, exec); ++} ++ ++int os::Aix::commit_memory_impl(char* addr, size_t size, ++ size_t alignment_hint, bool exec) { ++ return os::Aix::commit_memory_impl(addr, size, exec); ++} ++ ++bool os::pd_commit_memory(char* addr, size_t size, size_t alignment_hint, ++ bool exec) { ++ return os::Aix::commit_memory_impl(addr, size, alignment_hint, exec) == 0; ++} ++ ++void os::pd_commit_memory_or_exit(char* addr, size_t size, ++ size_t alignment_hint, bool exec, ++ const char* mesg) { ++ os::Aix::commit_memory_impl(addr, size, alignment_hint, exec); ++} ++ ++bool os::pd_uncommit_memory(char* addr, size_t size) { ++ ++ // Delegate to ShmBkBlock class which knows how to uncommit its memory. ++ ++ bool rc = false; ++ LOCK_SHMBK ++ ShmBkBlock* const block = shmbk_find_by_containing_address(addr); ++ if (!block) { ++ fprintf(stderr, "invalid pointer: 0x%p.\n", addr); ++ shmbk_dump_info(); ++ assert(false, "invalid pointer"); ++ return false; ++ } else if (!block->containsRange(addr, size)) { ++ fprintf(stderr, "invalid range: 0x%p .. 0x%p.\n", addr, addr + size); ++ shmbk_dump_info(); ++ assert(false, "invalid range"); ++ return false; ++ } ++ rc = block->disclaim(addr, size); ++ UNLOCK_SHMBK ++ ++ if (Verbose && !rc) { ++ warning("failed to disclaim 0x%p .. 0x%p (0x%llX bytes).", addr, addr + size, size); ++ } ++ return rc; ++} ++ ++bool os::pd_create_stack_guard_pages(char* addr, size_t size) { ++ return os::guard_memory(addr, size); ++} ++ ++bool os::remove_stack_guard_pages(char* addr, size_t size) { ++ return os::unguard_memory(addr, size); ++} ++ ++void os::pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint) { ++} ++ ++void os::pd_free_memory(char *addr, size_t bytes, size_t alignment_hint) { ++} ++ ++void os::numa_make_global(char *addr, size_t bytes) { ++} ++ ++void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint) { ++} ++ ++bool os::numa_topology_changed() { ++ return false; ++} ++ ++size_t os::numa_get_groups_num() { ++ return 1; ++} ++ ++int os::numa_get_group_id() { ++ return 0; ++} ++ ++size_t os::numa_get_leaf_groups(int *ids, size_t size) { ++ if (size > 0) { ++ ids[0] = 0; ++ return 1; ++ } ++ return 0; ++} ++ ++bool os::get_page_info(char *start, page_info* info) { ++ return false; ++} ++ ++char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) { ++ return end; ++} ++ ++// Flags for reserve_shmatted_memory: ++#define RESSHM_WISHADDR_OR_FAIL 1 ++#define RESSHM_TRY_16M_PAGES 2 ++#define RESSHM_16M_PAGES_OR_FAIL 4 ++ ++// Result of reserve_shmatted_memory: ++struct shmatted_memory_info_t { ++ char* addr; ++ size_t pagesize; ++ bool pinned; ++}; ++ ++// Reserve a section of shmatted memory. ++// params: ++// bytes [in]: size of memory, in bytes ++// requested_addr [in]: wish address. ++// NULL = no wish. ++// If RESSHM_WISHADDR_OR_FAIL is set in flags and wish address cannot ++// be obtained, function will fail. Otherwise wish address is treated as hint and ++// another pointer is returned. ++// flags [in]: some flags. Valid flags are: ++// RESSHM_WISHADDR_OR_FAIL - fail if wish address is given and cannot be obtained. ++// RESSHM_TRY_16M_PAGES - try to allocate from 16M page pool ++// (requires UseLargePages and Use16MPages) ++// RESSHM_16M_PAGES_OR_FAIL - if you cannot allocate from 16M page pool, fail. ++// Otherwise any other page size will do. ++// p_info [out] : holds information about the created shared memory segment. ++static bool reserve_shmatted_memory(size_t bytes, char* requested_addr, int flags, shmatted_memory_info_t* p_info) { ++ ++ assert(p_info, "parameter error"); ++ ++ // init output struct. ++ p_info->addr = NULL; ++ ++ // neither should we be here for EXTSHM=ON. ++ if (os::Aix::extshm()) { ++ ShouldNotReachHere(); ++ } ++ ++ // extract flags. sanity checks. ++ const bool wishaddr_or_fail = ++ flags & RESSHM_WISHADDR_OR_FAIL; ++ const bool try_16M_pages = ++ flags & RESSHM_TRY_16M_PAGES; ++ const bool f16M_pages_or_fail = ++ flags & RESSHM_16M_PAGES_OR_FAIL; ++ ++ // first check: if a wish address is given and it is mandatory, but not aligned to segment boundary, ++ // shmat will fail anyway, so save some cycles by failing right away ++ if (requested_addr && ((uintptr_t)requested_addr % SIZE_256M == 0)) { ++ if (wishaddr_or_fail) { ++ return false; ++ } else { ++ requested_addr = NULL; ++ } ++ } ++ ++ char* addr = NULL; ++ ++ // Align size of shm up to the largest possible page size, to avoid errors later on when we try to change ++ // pagesize dynamically. ++ const size_t size = align_size_up(bytes, SIZE_16M); ++ ++ // reserve the shared segment ++ int shmid = shmget(IPC_PRIVATE, size, IPC_CREAT | S_IRUSR | S_IWUSR); ++ if (shmid == -1) { ++ warning("shmget(.., %lld, ..) failed (errno: %d).", size, errno); ++ return false; ++ } ++ ++ // Important note: ++ // It is very important that we, upon leaving this function, do not leave a shm segment alive. ++ // We must right after attaching it remove it from the system. System V shm segments are global and ++ // survive the process. ++ // So, from here on: Do not assert. Do not return. Always do a "goto cleanup_shm". ++ ++ // try forcing the page size ++ size_t pagesize = -1; // unknown so far ++ ++ if (UseLargePages) { ++ ++ struct shmid_ds shmbuf; ++ memset(&shmbuf, 0, sizeof(shmbuf)); ++ ++ // First, try to take from 16M page pool if... ++ if (os::Aix::can_use_16M_pages() // we can ... ++ && Use16MPages // we are not explicitly forbidden to do so (-XX:-Use16MPages).. ++ && try_16M_pages) { // caller wants us to. ++ shmbuf.shm_pagesize = SIZE_16M; ++ if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) == 0) { ++ pagesize = SIZE_16M; ++ } else { ++ warning("Failed to allocate %d 16M pages. 16M page pool might be exhausted. (shmctl failed with %d)", ++ size / SIZE_16M, errno); ++ if (f16M_pages_or_fail) { ++ goto cleanup_shm; ++ } ++ } ++ } ++ ++ // Nothing yet? Try setting 64K pages. Note that I never saw this fail, but in theory it might, ++ // because the 64K page pool may also be exhausted. ++ if (pagesize == -1) { ++ shmbuf.shm_pagesize = SIZE_64K; ++ if (shmctl(shmid, SHM_PAGESIZE, &shmbuf) == 0) { ++ pagesize = SIZE_64K; ++ } else { ++ warning("Failed to allocate %d 64K pages. (shmctl failed with %d)", ++ size / SIZE_64K, errno); ++ // here I give up. leave page_size -1 - later, after attaching, we will query the ++ // real page size of the attached memory. (in theory, it may be something different ++ // from 4K if LDR_CNTRL SHM_PSIZE is set) ++ } ++ } ++ } ++ ++ // sanity point ++ assert(pagesize == -1 || pagesize == SIZE_16M || pagesize == SIZE_64K, "wrong page size"); ++ ++ // Now attach the shared segment. ++ addr = (char*) shmat(shmid, requested_addr, 0); ++ if (addr == (char*)-1) { ++ // How to handle attach failure: ++ // If it failed for a specific wish address, tolerate this: in that case, if wish address was ++ // mandatory, fail, if not, retry anywhere. ++ // If it failed for any other reason, treat that as fatal error. ++ addr = NULL; ++ if (requested_addr) { ++ if (wishaddr_or_fail) { ++ goto cleanup_shm; ++ } else { ++ addr = (char*) shmat(shmid, NULL, 0); ++ if (addr == (char*)-1) { // fatal ++ addr = NULL; ++ warning("shmat failed (errno: %d)", errno); ++ goto cleanup_shm; ++ } ++ } ++ } else { // fatal ++ addr = NULL; ++ warning("shmat failed (errno: %d)", errno); ++ goto cleanup_shm; ++ } ++ } ++ ++ // sanity point ++ assert(addr && addr != (char*) -1, "wrong address"); ++ ++ // after successful Attach remove the segment - right away. ++ if (::shmctl(shmid, IPC_RMID, NULL) == -1) { ++ warning("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno); ++ guarantee(false, "failed to remove shared memory segment!"); ++ } ++ shmid = -1; ++ ++ // query the real page size. In case setting the page size did not work (see above), the system ++ // may have given us something other then 4K (LDR_CNTRL) ++ { ++ const size_t real_pagesize = os::Aix::query_pagesize(addr); ++ if (pagesize != -1) { ++ assert(pagesize == real_pagesize, "unexpected pagesize after shmat"); ++ } else { ++ pagesize = real_pagesize; ++ } ++ } ++ ++ // Now register the reserved block with internal book keeping. ++ LOCK_SHMBK ++ const bool pinned = pagesize >= SIZE_16M ? true : false; ++ ShmBkShmatedBlock* const p_block = new ShmBkShmatedBlock(AddrRange(addr, size), pagesize, pinned); ++ assert(p_block, ""); ++ shmbk_register(p_block); ++ UNLOCK_SHMBK ++ ++cleanup_shm: ++ ++ // if we have not done so yet, remove the shared memory segment. This is very important. ++ if (shmid != -1) { ++ if (::shmctl(shmid, IPC_RMID, NULL) == -1) { ++ warning("shmctl(%u, IPC_RMID) failed (%d)\n", shmid, errno); ++ guarantee(false, "failed to remove shared memory segment!"); ++ } ++ shmid = -1; ++ } ++ ++ // trace ++ if (Verbose && !addr) { ++ if (requested_addr != NULL) { ++ warning("failed to shm-allocate 0x%llX bytes at wish address 0x%p.", size, requested_addr); ++ } else { ++ warning("failed to shm-allocate 0x%llX bytes at any address.", size); ++ } ++ } ++ ++ // hand info to caller ++ if (addr) { ++ p_info->addr = addr; ++ p_info->pagesize = pagesize; ++ p_info->pinned = pagesize == SIZE_16M ? true : false; ++ } ++ ++ // sanity test: ++ if (requested_addr && addr && wishaddr_or_fail) { ++ guarantee(addr == requested_addr, "shmat error"); ++ } ++ ++ // just one more test to really make sure we have no dangling shm segments. ++ guarantee(shmid == -1, "dangling shm segments"); ++ ++ return addr ? true : false; ++ ++} // end: reserve_shmatted_memory ++ ++// Reserve memory using mmap. Behaves the same as reserve_shmatted_memory(): ++// will return NULL in case of an error. ++static char* reserve_mmaped_memory(size_t bytes, char* requested_addr) { ++ ++ // if a wish address is given, but not aligned to 4K page boundary, mmap will fail. ++ if (requested_addr && ((uintptr_t)requested_addr % os::vm_page_size() != 0)) { ++ warning("Wish address 0x%p not aligned to page boundary.", requested_addr); ++ return NULL; ++ } ++ ++ const size_t size = align_size_up(bytes, SIZE_4K); ++ ++ // Note: MAP_SHARED (instead of MAP_PRIVATE) needed to be able to ++ // msync(MS_INVALIDATE) (see os::uncommit_memory) ++ int flags = MAP_ANONYMOUS | MAP_SHARED; ++ ++ // MAP_FIXED is needed to enforce requested_addr - manpage is vague about what ++ // it means if wishaddress is given but MAP_FIXED is not set. ++ // ++ // Note however that this changes semantics in SPEC1170 mode insofar as MAP_FIXED ++ // clobbers the address range, which is probably not what the caller wants. That's ++ // why I assert here (again) that the SPEC1170 compat mode is off. ++ // If we want to be able to run under SPEC1170, we have to do some porting and ++ // testing. ++ if (requested_addr != NULL) { ++ assert(!os::Aix::xpg_sus_mode(), "SPEC1170 mode not allowed."); ++ flags |= MAP_FIXED; ++ } ++ ++ char* addr = (char*)::mmap(requested_addr, size, PROT_READ|PROT_WRITE|PROT_EXEC, flags, -1, 0); ++ ++ if (addr == MAP_FAILED) { ++ // attach failed: tolerate for specific wish addresses. Not being able to attach ++ // anywhere is a fatal error. ++ if (requested_addr == NULL) { ++ // It's ok to fail here if the machine has not enough memory. ++ warning("mmap(NULL, 0x%llX, ..) failed (%d)", size, errno); ++ } ++ addr = NULL; ++ goto cleanup_mmap; ++ } ++ ++ // If we did request a specific address and that address was not available, fail. ++ if (addr && requested_addr) { ++ guarantee(addr == requested_addr, "unexpected"); ++ } ++ ++ // register this mmap'ed segment with book keeping ++ LOCK_SHMBK ++ ShmBkMappedBlock* const p_block = new ShmBkMappedBlock(AddrRange(addr, size)); ++ assert(p_block, ""); ++ shmbk_register(p_block); ++ UNLOCK_SHMBK ++ ++cleanup_mmap: ++ ++ // trace ++ if (Verbose) { ++ if (addr) { ++ fprintf(stderr, "mmap-allocated 0x%p .. 0x%p (0x%llX bytes)\n", addr, addr + bytes, bytes); ++ } ++ else { ++ if (requested_addr != NULL) { ++ warning("failed to mmap-allocate 0x%llX bytes at wish address 0x%p.", bytes, requested_addr); ++ } else { ++ warning("failed to mmap-allocate 0x%llX bytes at any address.", bytes); ++ } ++ } ++ } ++ ++ return addr; ++ ++} // end: reserve_mmaped_memory ++ ++// Reserves and attaches a shared memory segment. ++// Will assert if a wish address is given and could not be obtained. ++char* os::pd_reserve_memory(size_t bytes, char* requested_addr, size_t alignment_hint) { ++ return os::attempt_reserve_memory_at(bytes, requested_addr); ++} ++ ++bool os::pd_release_memory(char* addr, size_t size) { ++ ++ // delegate to ShmBkBlock class which knows how to uncommit its memory. ++ ++ bool rc = false; ++ LOCK_SHMBK ++ ShmBkBlock* const block = shmbk_find_by_containing_address(addr); ++ if (!block) { ++ fprintf(stderr, "invalid pointer: 0x%p.\n", addr); ++ shmbk_dump_info(); ++ assert(false, "invalid pointer"); ++ return false; ++ } ++ else if (!block->isSameRange(addr, size)) { ++ if (block->getType() == ShmBkBlock::MMAP) { ++ // Release only the same range or a the beginning or the end of a range. ++ if (block->base() == addr && size < block->size()) { ++ ShmBkMappedBlock* const b = new ShmBkMappedBlock(AddrRange(block->base() + size, block->size() - size)); ++ assert(b, ""); ++ shmbk_register(b); ++ block->setAddrRange(AddrRange(addr, size)); ++ } ++ else if (addr > block->base() && addr + size == block->base() + block->size()) { ++ ShmBkMappedBlock* const b = new ShmBkMappedBlock(AddrRange(block->base(), block->size() - size)); ++ assert(b, ""); ++ shmbk_register(b); ++ block->setAddrRange(AddrRange(addr, size)); ++ } ++ else { ++ fprintf(stderr, "invalid mmap range: 0x%p .. 0x%p.\n", addr, addr + size); ++ shmbk_dump_info(); ++ assert(false, "invalid mmap range"); ++ return false; ++ } ++ } ++ else { ++ // Release only the same range. No partial release allowed. ++ // Soften the requirement a bit, because the user may think he owns a smaller size ++ // than the block is due to alignment etc. ++ if (block->base() != addr || block->size() < size) { ++ fprintf(stderr, "invalid shmget range: 0x%p .. 0x%p.\n", addr, addr + size); ++ shmbk_dump_info(); ++ assert(false, "invalid shmget range"); ++ return false; ++ } ++ } ++ } ++ rc = block->release(); ++ assert(rc, "release failed"); ++ // remove block from bookkeeping ++ shmbk_unregister(block); ++ delete block; ++ UNLOCK_SHMBK ++ ++ if (!rc) { ++ warning("failed to released %lu bytes at 0x%p", size, addr); ++ } ++ ++ return rc; ++} ++ ++static bool checked_mprotect(char* addr, size_t size, int prot) { ++ ++ // Little problem here: if SPEC1170 behaviour is off, mprotect() on AIX will ++ // not tell me if protection failed when trying to protect an un-protectable range. ++ // ++ // This means if the memory was allocated using shmget/shmat, protection wont work ++ // but mprotect will still return 0: ++ // ++ // See http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/mprotect.htm ++ ++ bool rc = ::mprotect(addr, size, prot) == 0 ? true : false; ++ ++ if (!rc) { ++ const char* const s_errno = strerror(errno); ++ warning("mprotect(" PTR_FORMAT "-" PTR_FORMAT ", 0x%X) failed (%s).", addr, addr + size, prot, s_errno); ++ return false; ++ } ++ ++ // mprotect success check ++ // ++ // Mprotect said it changed the protection but can I believe it? ++ // ++ // To be sure I need to check the protection afterwards. Try to ++ // read from protected memory and check whether that causes a segfault. ++ // ++ if (!os::Aix::xpg_sus_mode()) { ++ ++ if (StubRoutines::SafeFetch32_stub()) { ++ ++ const bool read_protected = ++ (SafeFetch32((int*)addr, 0x12345678) == 0x12345678 && ++ SafeFetch32((int*)addr, 0x76543210) == 0x76543210) ? true : false; ++ ++ if (prot & PROT_READ) { ++ rc = !read_protected; ++ } else { ++ rc = read_protected; ++ } ++ } ++ } ++ if (!rc) { ++ assert(false, "mprotect failed."); ++ } ++ return rc; ++} ++ ++// Set protections specified ++bool os::protect_memory(char* addr, size_t size, ProtType prot, bool is_committed) { ++ unsigned int p = 0; ++ switch (prot) { ++ case MEM_PROT_NONE: p = PROT_NONE; break; ++ case MEM_PROT_READ: p = PROT_READ; break; ++ case MEM_PROT_RW: p = PROT_READ|PROT_WRITE; break; ++ case MEM_PROT_RWX: p = PROT_READ|PROT_WRITE|PROT_EXEC; break; ++ default: ++ ShouldNotReachHere(); ++ } ++ // is_committed is unused. ++ return checked_mprotect(addr, size, p); ++} ++ ++bool os::guard_memory(char* addr, size_t size) { ++ return checked_mprotect(addr, size, PROT_NONE); ++} ++ ++bool os::unguard_memory(char* addr, size_t size) { ++ return checked_mprotect(addr, size, PROT_READ|PROT_WRITE|PROT_EXEC); ++} ++ ++// Large page support ++ ++static size_t _large_page_size = 0; ++ ++// Enable large page support if OS allows that. ++void os::large_page_init() { ++ ++ // Note: os::Aix::query_multipage_support must run first. ++ ++ if (!UseLargePages) { ++ return; ++ } ++ ++ if (!Aix::can_use_64K_pages()) { ++ assert(!Aix::can_use_16M_pages(), "64K is a precondition for 16M."); ++ UseLargePages = false; ++ return; ++ } ++ ++ if (!Aix::can_use_16M_pages() && Use16MPages) { ++ fprintf(stderr, "Cannot use 16M pages. Please ensure that there is a 16M page pool " ++ " and that the VM runs with CAP_BYPASS_RAC_VMM and CAP_PROPAGATE capabilities.\n"); ++ } ++ ++ // Do not report 16M page alignment as part of os::_page_sizes if we are ++ // explicitly forbidden from using 16M pages. Doing so would increase the ++ // alignment the garbage collector calculates with, slightly increasing ++ // heap usage. We should only pay for 16M alignment if we really want to ++ // use 16M pages. ++ if (Use16MPages && Aix::can_use_16M_pages()) { ++ _large_page_size = SIZE_16M; ++ _page_sizes[0] = SIZE_16M; ++ _page_sizes[1] = SIZE_64K; ++ _page_sizes[2] = SIZE_4K; ++ _page_sizes[3] = 0; ++ } else if (Aix::can_use_64K_pages()) { ++ _large_page_size = SIZE_64K; ++ _page_sizes[0] = SIZE_64K; ++ _page_sizes[1] = SIZE_4K; ++ _page_sizes[2] = 0; ++ } ++ ++ if (Verbose) { ++ ("Default large page size is 0x%llX.", _large_page_size); ++ } ++} // end: os::large_page_init() ++ ++char* os::reserve_memory_special(size_t bytes, size_t alignment, char* req_addr, bool exec) { ++ // "exec" is passed in but not used. Creating the shared image for ++ // the code cache doesn't have an SHM_X executable permission to check. ++ Unimplemented(); ++ return 0; ++} ++ ++bool os::release_memory_special(char* base, size_t bytes) { ++ // detaching the SHM segment will also delete it, see reserve_memory_special() ++ Unimplemented(); ++ return false; ++} ++ ++size_t os::large_page_size() { ++ return _large_page_size; ++} ++ ++bool os::can_commit_large_page_memory() { ++ // Well, sadly we cannot commit anything at all (see comment in ++ // os::commit_memory) but we claim to so we can make use of large pages ++ return true; ++} ++ ++bool os::can_execute_large_page_memory() { ++ // We can do that ++ return true; ++} ++ ++// Reserve memory at an arbitrary address, only if that area is ++// available (and not reserved for something else). ++char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) { ++ ++ bool use_mmap = false; ++ ++ // mmap: smaller graining, no large page support ++ // shm: large graining (256M), large page support, limited number of shm segments ++ // ++ // Prefer mmap wherever we either do not need large page support or have OS limits ++ ++ if (!UseLargePages || bytes < SIZE_16M) { ++ use_mmap = true; ++ } ++ ++ char* addr = NULL; ++ if (use_mmap) { ++ addr = reserve_mmaped_memory(bytes, requested_addr); ++ } else { ++ // shmat: wish address is mandatory, and do not try 16M pages here. ++ shmatted_memory_info_t info; ++ const int flags = RESSHM_WISHADDR_OR_FAIL; ++ if (reserve_shmatted_memory(bytes, requested_addr, flags, &info)) { ++ addr = info.addr; ++ } ++ } ++ ++ return addr; ++} ++ ++size_t os::read(int fd, void *buf, unsigned int nBytes) { ++ return ::read(fd, buf, nBytes); ++} ++ ++#define NANOSECS_PER_MILLISEC 1000000 ++ ++int os::sleep(Thread* thread, jlong millis, bool interruptible) { ++ assert(thread == Thread::current(), "thread consistency check"); ++ ++ // Prevent nasty overflow in deadline calculation ++ // by handling long sleeps similar to solaris or windows. ++ const jlong limit = INT_MAX; ++ int result; ++ while (millis > limit) { ++ if ((result = os::sleep(thread, limit, interruptible)) != OS_OK) { ++ return result; ++ } ++ millis -= limit; ++ } ++ ++ ParkEvent * const slp = thread->_SleepEvent; ++ slp->reset(); ++ OrderAccess::fence(); ++ ++ if (interruptible) { ++ jlong prevtime = javaTimeNanos(); ++ ++ // Prevent precision loss and too long sleeps ++ jlong deadline = prevtime + millis * NANOSECS_PER_MILLISEC; ++ ++ for (;;) { ++ if (os::is_interrupted(thread, true)) { ++ return OS_INTRPT; ++ } ++ ++ jlong newtime = javaTimeNanos(); ++ ++ assert(newtime >= prevtime, "time moving backwards"); ++ // Doing prevtime and newtime in microseconds doesn't help precision, ++ // and trying to round up to avoid lost milliseconds can result in a ++ // too-short delay. ++ millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC; ++ ++ if (millis <= 0) { ++ return OS_OK; ++ } ++ ++ // Stop sleeping if we passed the deadline ++ if (newtime >= deadline) { ++ return OS_OK; ++ } ++ ++ prevtime = newtime; ++ ++ { ++ assert(thread->is_Java_thread(), "sanity check"); ++ JavaThread *jt = (JavaThread *) thread; ++ ThreadBlockInVM tbivm(jt); ++ OSThreadWaitState osts(jt->osthread(), false /* not Object.wait() */); ++ ++ jt->set_suspend_equivalent(); ++ ++ slp->park(millis); ++ ++ // were we externally suspended while we were waiting? ++ jt->check_and_wait_while_suspended(); ++ } ++ } ++ } else { ++ OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); ++ jlong prevtime = javaTimeNanos(); ++ ++ // Prevent precision loss and too long sleeps ++ jlong deadline = prevtime + millis * NANOSECS_PER_MILLISEC; ++ ++ for (;;) { ++ // It'd be nice to avoid the back-to-back javaTimeNanos() calls on ++ // the 1st iteration ... ++ jlong newtime = javaTimeNanos(); ++ ++ if (newtime - prevtime < 0) { ++ // time moving backwards, should only happen if no monotonic clock ++ // not a guarantee() because JVM should not abort on kernel/glibc bugs ++ // - HS14 Commented out as not implemented. ++ // - TODO Maybe we should implement it? ++ //assert(!Aix::supports_monotonic_clock(), "time moving backwards"); ++ } else { ++ millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC; ++ } ++ ++ if (millis <= 0) break; ++ ++ if (newtime >= deadline) { ++ break; ++ } ++ ++ prevtime = newtime; ++ slp->park(millis); ++ } ++ return OS_OK; ++ } ++} ++ ++void os::naked_short_sleep(jlong ms) { ++ struct timespec req; ++ ++ assert(ms < 1000, "Un-interruptable sleep, short time use only"); ++ req.tv_sec = 0; ++ if (ms > 0) { ++ req.tv_nsec = (ms % 1000) * 1000000; ++ } ++ else { ++ req.tv_nsec = 1; ++ } ++ ++ nanosleep(&req, NULL); ++ ++ return; ++} ++ ++// Sleep forever; naked call to OS-specific sleep; use with CAUTION ++void os::infinite_sleep() { ++ while (true) { // sleep forever ... ++ ::sleep(100); // ... 100 seconds at a time ++ } ++} ++ ++// Used to convert frequent JVM_Yield() to nops ++bool os::dont_yield() { ++ return DontYieldALot; ++} ++ ++void os::yield() { ++ sched_yield(); ++} ++ ++os::YieldResult os::NakedYield() { sched_yield(); return os::YIELD_UNKNOWN; } ++ ++void os::yield_all(int attempts) { ++ // Yields to all threads, including threads with lower priorities ++ // Threads on Linux are all with same priority. The Solaris style ++ // os::yield_all() with nanosleep(1ms) is not necessary. ++ sched_yield(); ++} ++ ++// Called from the tight loops to possibly influence time-sharing heuristics ++void os::loop_breaker(int attempts) { ++ os::yield_all(attempts); ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// thread priority support ++ ++// From AIX manpage to pthread_setschedparam ++// (see: http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp? ++// topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_setschedparam.htm): ++// ++// "If schedpolicy is SCHED_OTHER, then sched_priority must be in the ++// range from 40 to 80, where 40 is the least favored priority and 80 ++// is the most favored." ++// ++// (Actually, I doubt this even has an impact on AIX, as we do kernel ++// scheduling there; however, this still leaves iSeries.) ++// ++// We use the same values for AIX and PASE. ++int os::java_to_os_priority[CriticalPriority + 1] = { ++ 54, // 0 Entry should never be used ++ ++ 55, // 1 MinPriority ++ 55, // 2 ++ 56, // 3 ++ ++ 56, // 4 ++ 57, // 5 NormPriority ++ 57, // 6 ++ ++ 58, // 7 ++ 58, // 8 ++ 59, // 9 NearMaxPriority ++ ++ 60, // 10 MaxPriority ++ ++ 60 // 11 CriticalPriority ++}; ++ ++OSReturn os::set_native_priority(Thread* thread, int newpri) { ++ if (!UseThreadPriorities) return OS_OK; ++ pthread_t thr = thread->osthread()->pthread_id(); ++ int policy = SCHED_OTHER; ++ struct sched_param param; ++ param.sched_priority = newpri; ++ int ret = pthread_setschedparam(thr, policy, ¶m); ++ ++ if (Verbose) { ++ if (ret == 0) { ++ fprintf(stderr, "changed priority of thread %d to %d\n", (int)thr, newpri); ++ } else { ++ fprintf(stderr, "Could not changed priority for thread %d to %d (error %d, %s)\n", ++ (int)thr, newpri, ret, strerror(ret)); ++ } ++ } ++ return (ret == 0) ? OS_OK : OS_ERR; ++} ++ ++OSReturn os::get_native_priority(const Thread* const thread, int *priority_ptr) { ++ if (!UseThreadPriorities) { ++ *priority_ptr = java_to_os_priority[NormPriority]; ++ return OS_OK; ++ } ++ pthread_t thr = thread->osthread()->pthread_id(); ++ int policy = SCHED_OTHER; ++ struct sched_param param; ++ int ret = pthread_getschedparam(thr, &policy, ¶m); ++ *priority_ptr = param.sched_priority; ++ ++ return (ret == 0) ? OS_OK : OS_ERR; ++} ++ ++// Hint to the underlying OS that a task switch would not be good. ++// Void return because it's a hint and can fail. ++void os::hint_no_preempt() {} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// suspend/resume support ++ ++// the low-level signal-based suspend/resume support is a remnant from the ++// old VM-suspension that used to be for java-suspension, safepoints etc, ++// within hotspot. Now there is a single use-case for this: ++// - calling get_thread_pc() on the VMThread by the flat-profiler task ++// that runs in the watcher thread. ++// The remaining code is greatly simplified from the more general suspension ++// code that used to be used. ++// ++// The protocol is quite simple: ++// - suspend: ++// - sends a signal to the target thread ++// - polls the suspend state of the osthread using a yield loop ++// - target thread signal handler (SR_handler) sets suspend state ++// and blocks in sigsuspend until continued ++// - resume: ++// - sets target osthread state to continue ++// - sends signal to end the sigsuspend loop in the SR_handler ++// ++// Note that the SR_lock plays no role in this suspend/resume protocol. ++// ++ ++static void resume_clear_context(OSThread *osthread) { ++ osthread->set_ucontext(NULL); ++ osthread->set_siginfo(NULL); ++} ++ ++static void suspend_save_context(OSThread *osthread, siginfo_t* siginfo, ucontext_t* context) { ++ osthread->set_ucontext(context); ++ osthread->set_siginfo(siginfo); ++} ++ ++// ++// Handler function invoked when a thread's execution is suspended or ++// resumed. We have to be careful that only async-safe functions are ++// called here (Note: most pthread functions are not async safe and ++// should be avoided.) ++// ++// Note: sigwait() is a more natural fit than sigsuspend() from an ++// interface point of view, but sigwait() prevents the signal hander ++// from being run. libpthread would get very confused by not having ++// its signal handlers run and prevents sigwait()'s use with the ++// mutex granting granting signal. ++// ++// Currently only ever called on the VMThread and JavaThreads (PC sampling). ++// ++static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) { ++ // Save and restore errno to avoid confusing native code with EINTR ++ // after sigsuspend. ++ int old_errno = errno; ++ ++ Thread* thread = Thread::current(); ++ OSThread* osthread = thread->osthread(); ++ assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread"); ++ ++ os::SuspendResume::State current = osthread->sr.state(); ++ if (current == os::SuspendResume::SR_SUSPEND_REQUEST) { ++ suspend_save_context(osthread, siginfo, context); ++ ++ // attempt to switch the state, we assume we had a SUSPEND_REQUEST ++ os::SuspendResume::State state = osthread->sr.suspended(); ++ if (state == os::SuspendResume::SR_SUSPENDED) { ++ sigset_t suspend_set; // signals for sigsuspend() ++ ++ // get current set of blocked signals and unblock resume signal ++ pthread_sigmask(SIG_BLOCK, NULL, &suspend_set); ++ sigdelset(&suspend_set, SR_signum); ++ ++ // wait here until we are resumed ++ while (1) { ++ sigsuspend(&suspend_set); ++ ++ os::SuspendResume::State result = osthread->sr.running(); ++ if (result == os::SuspendResume::SR_RUNNING) { ++ break; ++ } ++ } ++ ++ } else if (state == os::SuspendResume::SR_RUNNING) { ++ // request was cancelled, continue ++ } else { ++ ShouldNotReachHere(); ++ } ++ ++ resume_clear_context(osthread); ++ } else if (current == os::SuspendResume::SR_RUNNING) { ++ // request was cancelled, continue ++ } else if (current == os::SuspendResume::SR_WAKEUP_REQUEST) { ++ // ignore ++ } else { ++ ShouldNotReachHere(); ++ } ++ ++ errno = old_errno; ++} ++ ++ ++static int SR_initialize() { ++ struct sigaction act; ++ char *s; ++ // Get signal number to use for suspend/resume ++ if ((s = ::getenv("_JAVA_SR_SIGNUM")) != 0) { ++ int sig = ::strtol(s, 0, 10); ++ if (sig > 0 || sig < NSIG) { ++ SR_signum = sig; ++ } ++ } ++ ++ assert(SR_signum > SIGSEGV && SR_signum > SIGBUS, ++ "SR_signum must be greater than max(SIGSEGV, SIGBUS), see 4355769"); ++ ++ sigemptyset(&SR_sigset); ++ sigaddset(&SR_sigset, SR_signum); ++ ++ // Set up signal handler for suspend/resume. ++ act.sa_flags = SA_RESTART|SA_SIGINFO; ++ act.sa_handler = (void (*)(int)) SR_handler; ++ ++ // SR_signum is blocked by default. ++ // 4528190 - We also need to block pthread restart signal (32 on all ++ // supported Linux platforms). Note that LinuxThreads need to block ++ // this signal for all threads to work properly. So we don't have ++ // to use hard-coded signal number when setting up the mask. ++ pthread_sigmask(SIG_BLOCK, NULL, &act.sa_mask); ++ ++ if (sigaction(SR_signum, &act, 0) == -1) { ++ return -1; ++ } ++ ++ // Save signal flag ++ os::Aix::set_our_sigflags(SR_signum, act.sa_flags); ++ return 0; ++} ++ ++static int SR_finalize() { ++ return 0; ++} ++ ++static int sr_notify(OSThread* osthread) { ++ int status = pthread_kill(osthread->pthread_id(), SR_signum); ++ assert_status(status == 0, status, "pthread_kill"); ++ return status; ++} ++ ++// "Randomly" selected value for how long we want to spin ++// before bailing out on suspending a thread, also how often ++// we send a signal to a thread we want to resume ++static const int RANDOMLY_LARGE_INTEGER = 1000000; ++static const int RANDOMLY_LARGE_INTEGER2 = 100; ++ ++// returns true on success and false on error - really an error is fatal ++// but this seems the normal response to library errors ++static bool do_suspend(OSThread* osthread) { ++ assert(osthread->sr.is_running(), "thread should be running"); ++ // mark as suspended and send signal ++ ++ if (osthread->sr.request_suspend() != os::SuspendResume::SR_SUSPEND_REQUEST) { ++ // failed to switch, state wasn't running? ++ ShouldNotReachHere(); ++ return false; ++ } ++ ++ if (sr_notify(osthread) != 0) { ++ // try to cancel, switch to running ++ ++ os::SuspendResume::State result = osthread->sr.cancel_suspend(); ++ if (result == os::SuspendResume::SR_RUNNING) { ++ // cancelled ++ return false; ++ } else if (result == os::SuspendResume::SR_SUSPENDED) { ++ // somehow managed to suspend ++ return true; ++ } else { ++ ShouldNotReachHere(); ++ return false; ++ } ++ } ++ ++ // managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED ++ ++ for (int n = 0; !osthread->sr.is_suspended(); n++) { ++ for (int i = 0; i < RANDOMLY_LARGE_INTEGER2 && !osthread->sr.is_suspended(); i++) { ++ os::yield_all(i); ++ } ++ ++ // timeout, try to cancel the request ++ if (n >= RANDOMLY_LARGE_INTEGER) { ++ os::SuspendResume::State cancelled = osthread->sr.cancel_suspend(); ++ if (cancelled == os::SuspendResume::SR_RUNNING) { ++ return false; ++ } else if (cancelled == os::SuspendResume::SR_SUSPENDED) { ++ return true; ++ } else { ++ ShouldNotReachHere(); ++ return false; ++ } ++ } ++ } ++ ++ guarantee(osthread->sr.is_suspended(), "Must be suspended"); ++ return true; ++} ++ ++static void do_resume(OSThread* osthread) { ++ //assert(osthread->sr.is_suspended(), "thread should be suspended"); ++ ++ if (osthread->sr.request_wakeup() != os::SuspendResume::SR_WAKEUP_REQUEST) { ++ // failed to switch to WAKEUP_REQUEST ++ ShouldNotReachHere(); ++ return; ++ } ++ ++ while (!osthread->sr.is_running()) { ++ if (sr_notify(osthread) == 0) { ++ for (int n = 0; n < RANDOMLY_LARGE_INTEGER && !osthread->sr.is_running(); n++) { ++ for (int i = 0; i < 100 && !osthread->sr.is_running(); i++) { ++ os::yield_all(i); ++ } ++ } ++ } else { ++ ShouldNotReachHere(); ++ } ++ } ++ ++ guarantee(osthread->sr.is_running(), "Must be running!"); ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// interrupt support ++ ++void os::interrupt(Thread* thread) { ++ assert(Thread::current() == thread || Threads_lock->owned_by_self(), ++ "possibility of dangling Thread pointer"); ++ ++ OSThread* osthread = thread->osthread(); ++ ++ if (!osthread->interrupted()) { ++ osthread->set_interrupted(true); ++ // More than one thread can get here with the same value of osthread, ++ // resulting in multiple notifications. We do, however, want the store ++ // to interrupted() to be visible to other threads before we execute unpark(). ++ OrderAccess::fence(); ++ ParkEvent * const slp = thread->_SleepEvent; ++ if (slp != NULL) slp->unpark(); ++ } ++ ++ // For JSR166. Unpark even if interrupt status already was set ++ if (thread->is_Java_thread()) ++ ((JavaThread*)thread)->parker()->unpark(); ++ ++ ParkEvent * ev = thread->_ParkEvent; ++ if (ev != NULL) ev->unpark(); ++ ++} ++ ++bool os::is_interrupted(Thread* thread, bool clear_interrupted) { ++ assert(Thread::current() == thread || Threads_lock->owned_by_self(), ++ "possibility of dangling Thread pointer"); ++ ++ OSThread* osthread = thread->osthread(); ++ ++ bool interrupted = osthread->interrupted(); ++ ++ if (interrupted && clear_interrupted) { ++ osthread->set_interrupted(false); ++ // consider thread->_SleepEvent->reset() ... optional optimization ++ } ++ ++ return interrupted; ++} ++ ++/////////////////////////////////////////////////////////////////////////////////// ++// signal handling (except suspend/resume) ++ ++// This routine may be used by user applications as a "hook" to catch signals. ++// The user-defined signal handler must pass unrecognized signals to this ++// routine, and if it returns true (non-zero), then the signal handler must ++// return immediately. If the flag "abort_if_unrecognized" is true, then this ++// routine will never retun false (zero), but instead will execute a VM panic ++// routine kill the process. ++// ++// If this routine returns false, it is OK to call it again. This allows ++// the user-defined signal handler to perform checks either before or after ++// the VM performs its own checks. Naturally, the user code would be making ++// a serious error if it tried to handle an exception (such as a null check ++// or breakpoint) that the VM was generating for its own correct operation. ++// ++// This routine may recognize any of the following kinds of signals: ++// SIGBUS, SIGSEGV, SIGILL, SIGFPE, SIGQUIT, SIGPIPE, SIGXFSZ, SIGUSR1. ++// It should be consulted by handlers for any of those signals. ++// ++// The caller of this routine must pass in the three arguments supplied ++// to the function referred to in the "sa_sigaction" (not the "sa_handler") ++// field of the structure passed to sigaction(). This routine assumes that ++// the sa_flags field passed to sigaction() includes SA_SIGINFO and SA_RESTART. ++// ++// Note that the VM will print warnings if it detects conflicting signal ++// handlers, unless invoked with the option "-XX:+AllowUserSignalHandlers". ++// ++extern "C" JNIEXPORT int ++JVM_handle_aix_signal(int signo, siginfo_t* siginfo, void* ucontext, int abort_if_unrecognized); ++ ++// Set thread signal mask (for some reason on AIX sigthreadmask() seems ++// to be the thing to call; documentation is not terribly clear about whether ++// pthread_sigmask also works, and if it does, whether it does the same. ++bool set_thread_signal_mask(int how, const sigset_t* set, sigset_t* oset) { ++ const int rc = ::pthread_sigmask(how, set, oset); ++ // return value semantics differ slightly for error case: ++ // pthread_sigmask returns error number, sigthreadmask -1 and sets global errno ++ // (so, pthread_sigmask is more theadsafe for error handling) ++ // But success is always 0. ++ return rc == 0 ? true : false; ++} ++ ++// Function to unblock all signals which are, according ++// to POSIX, typical program error signals. If they happen while being blocked, ++// they typically will bring down the process immediately. ++bool unblock_program_error_signals() { ++ sigset_t set; ++ ::sigemptyset(&set); ++ ::sigaddset(&set, SIGILL); ++ ::sigaddset(&set, SIGBUS); ++ ::sigaddset(&set, SIGFPE); ++ ::sigaddset(&set, SIGSEGV); ++ return set_thread_signal_mask(SIG_UNBLOCK, &set, NULL); ++} ++ ++// Renamed from 'signalHandler' to avoid collision with other shared libs. ++void javaSignalHandler(int sig, siginfo_t* info, void* uc) { ++ assert(info != NULL && uc != NULL, "it must be old kernel"); ++ ++ // Never leave program error signals blocked; ++ // on all our platforms they would bring down the process immediately when ++ // getting raised while being blocked. ++ unblock_program_error_signals(); ++ ++ JVM_handle_aix_signal(sig, info, uc, true); ++} ++ ++ ++// This boolean allows users to forward their own non-matching signals ++// to JVM_handle_aix_signal, harmlessly. ++bool os::Aix::signal_handlers_are_installed = false; ++ ++// For signal-chaining ++struct sigaction os::Aix::sigact[MAXSIGNUM]; ++unsigned int os::Aix::sigs = 0; ++bool os::Aix::libjsig_is_loaded = false; ++typedef struct sigaction *(*get_signal_t)(int); ++get_signal_t os::Aix::get_signal_action = NULL; ++ ++struct sigaction* os::Aix::get_chained_signal_action(int sig) { ++ struct sigaction *actp = NULL; ++ ++ if (libjsig_is_loaded) { ++ // Retrieve the old signal handler from libjsig ++ actp = (*get_signal_action)(sig); ++ } ++ if (actp == NULL) { ++ // Retrieve the preinstalled signal handler from jvm ++ actp = get_preinstalled_handler(sig); ++ } ++ ++ return actp; ++} ++ ++static bool call_chained_handler(struct sigaction *actp, int sig, ++ siginfo_t *siginfo, void *context) { ++ // Call the old signal handler ++ if (actp->sa_handler == SIG_DFL) { ++ // It's more reasonable to let jvm treat it as an unexpected exception ++ // instead of taking the default action. ++ return false; ++ } else if (actp->sa_handler != SIG_IGN) { ++ if ((actp->sa_flags & SA_NODEFER) == 0) { ++ // automaticlly block the signal ++ sigaddset(&(actp->sa_mask), sig); ++ } ++ ++ sa_handler_t hand = NULL; ++ sa_sigaction_t sa = NULL; ++ bool siginfo_flag_set = (actp->sa_flags & SA_SIGINFO) != 0; ++ // retrieve the chained handler ++ if (siginfo_flag_set) { ++ sa = actp->sa_sigaction; ++ } else { ++ hand = actp->sa_handler; ++ } ++ ++ if ((actp->sa_flags & SA_RESETHAND) != 0) { ++ actp->sa_handler = SIG_DFL; ++ } ++ ++ // try to honor the signal mask ++ sigset_t oset; ++ pthread_sigmask(SIG_SETMASK, &(actp->sa_mask), &oset); ++ ++ // call into the chained handler ++ if (siginfo_flag_set) { ++ (*sa)(sig, siginfo, context); ++ } else { ++ (*hand)(sig); ++ } ++ ++ // restore the signal mask ++ pthread_sigmask(SIG_SETMASK, &oset, 0); ++ } ++ // Tell jvm's signal handler the signal is taken care of. ++ return true; ++} ++ ++bool os::Aix::chained_handler(int sig, siginfo_t* siginfo, void* context) { ++ bool chained = false; ++ // signal-chaining ++ if (UseSignalChaining) { ++ struct sigaction *actp = get_chained_signal_action(sig); ++ if (actp != NULL) { ++ chained = call_chained_handler(actp, sig, siginfo, context); ++ } ++ } ++ return chained; ++} ++ ++struct sigaction* os::Aix::get_preinstalled_handler(int sig) { ++ if ((((unsigned int)1 << sig) & sigs) != 0) { ++ return &sigact[sig]; ++ } ++ return NULL; ++} ++ ++void os::Aix::save_preinstalled_handler(int sig, struct sigaction& oldAct) { ++ assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range"); ++ sigact[sig] = oldAct; ++ sigs |= (unsigned int)1 << sig; ++} ++ ++// for diagnostic ++int os::Aix::sigflags[MAXSIGNUM]; ++ ++int os::Aix::get_our_sigflags(int sig) { ++ assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range"); ++ return sigflags[sig]; ++} ++ ++void os::Aix::set_our_sigflags(int sig, int flags) { ++ assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range"); ++ sigflags[sig] = flags; ++} ++ ++void os::Aix::set_signal_handler(int sig, bool set_installed) { ++ // Check for overwrite. ++ struct sigaction oldAct; ++ sigaction(sig, (struct sigaction*)NULL, &oldAct); ++ ++ void* oldhand = oldAct.sa_sigaction ++ ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) ++ : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); ++ // Renamed 'signalHandler' to avoid collision with other shared libs. ++ if (oldhand != CAST_FROM_FN_PTR(void*, SIG_DFL) && ++ oldhand != CAST_FROM_FN_PTR(void*, SIG_IGN) && ++ oldhand != CAST_FROM_FN_PTR(void*, (sa_sigaction_t)javaSignalHandler)) { ++ if (AllowUserSignalHandlers || !set_installed) { ++ // Do not overwrite; user takes responsibility to forward to us. ++ return; ++ } else if (UseSignalChaining) { ++ // save the old handler in jvm ++ save_preinstalled_handler(sig, oldAct); ++ // libjsig also interposes the sigaction() call below and saves the ++ // old sigaction on it own. ++ } else { ++ fatal(err_msg("Encountered unexpected pre-existing sigaction handler " ++ "%#lx for signal %d.", (long)oldhand, sig)); ++ } ++ } ++ ++ struct sigaction sigAct; ++ sigfillset(&(sigAct.sa_mask)); ++ if (!set_installed) { ++ sigAct.sa_handler = SIG_DFL; ++ sigAct.sa_flags = SA_RESTART; ++ } else { ++ // Renamed 'signalHandler' to avoid collision with other shared libs. ++ sigAct.sa_sigaction = javaSignalHandler; ++ sigAct.sa_flags = SA_SIGINFO|SA_RESTART; ++ } ++ // Save flags, which are set by ours ++ assert(sig > 0 && sig < MAXSIGNUM, "vm signal out of expected range"); ++ sigflags[sig] = sigAct.sa_flags; ++ ++ int ret = sigaction(sig, &sigAct, &oldAct); ++ assert(ret == 0, "check"); ++ ++ void* oldhand2 = oldAct.sa_sigaction ++ ? CAST_FROM_FN_PTR(void*, oldAct.sa_sigaction) ++ : CAST_FROM_FN_PTR(void*, oldAct.sa_handler); ++ assert(oldhand2 == oldhand, "no concurrent signal handler installation"); ++} ++ ++// install signal handlers for signals that HotSpot needs to ++// handle in order to support Java-level exception handling. ++void os::Aix::install_signal_handlers() { ++ if (!signal_handlers_are_installed) { ++ signal_handlers_are_installed = true; ++ ++ // signal-chaining ++ typedef void (*signal_setting_t)(); ++ signal_setting_t begin_signal_setting = NULL; ++ signal_setting_t end_signal_setting = NULL; ++ begin_signal_setting = CAST_TO_FN_PTR(signal_setting_t, ++ dlsym(RTLD_DEFAULT, "JVM_begin_signal_setting")); ++ if (begin_signal_setting != NULL) { ++ end_signal_setting = CAST_TO_FN_PTR(signal_setting_t, ++ dlsym(RTLD_DEFAULT, "JVM_end_signal_setting")); ++ get_signal_action = CAST_TO_FN_PTR(get_signal_t, ++ dlsym(RTLD_DEFAULT, "JVM_get_signal_action")); ++ libjsig_is_loaded = true; ++ assert(UseSignalChaining, "should enable signal-chaining"); ++ } ++ if (libjsig_is_loaded) { ++ // Tell libjsig jvm is setting signal handlers ++ (*begin_signal_setting)(); ++ } ++ ++ set_signal_handler(SIGSEGV, true); ++ set_signal_handler(SIGPIPE, true); ++ set_signal_handler(SIGBUS, true); ++ set_signal_handler(SIGILL, true); ++ set_signal_handler(SIGFPE, true); ++ set_signal_handler(SIGTRAP, true); ++ set_signal_handler(SIGXFSZ, true); ++ set_signal_handler(SIGDANGER, true); ++ ++ if (libjsig_is_loaded) { ++ // Tell libjsig jvm finishes setting signal handlers ++ (*end_signal_setting)(); ++ } ++ ++ // We don't activate signal checker if libjsig is in place, we trust ourselves ++ // and if UserSignalHandler is installed all bets are off. ++ // Log that signal checking is off only if -verbose:jni is specified. ++ if (CheckJNICalls) { ++ if (libjsig_is_loaded) { ++ tty->print_cr("Info: libjsig is activated, all active signal checking is disabled"); ++ check_signals = false; ++ } ++ if (AllowUserSignalHandlers) { ++ tty->print_cr("Info: AllowUserSignalHandlers is activated, all active signal checking is disabled"); ++ check_signals = false; ++ } ++ // need to initialize check_signal_done ++ ::sigemptyset(&check_signal_done); ++ } ++ } ++} ++ ++static const char* get_signal_handler_name(address handler, ++ char* buf, int buflen) { ++ int offset; ++ bool found = os::dll_address_to_library_name(handler, buf, buflen, &offset); ++ if (found) { ++ // skip directory names ++ const char *p1, *p2; ++ p1 = buf; ++ size_t len = strlen(os::file_separator()); ++ while ((p2 = strstr(p1, os::file_separator())) != NULL) p1 = p2 + len; ++ // The way os::dll_address_to_library_name is implemented on Aix ++ // right now, it always returns -1 for the offset which is not ++ // terribly informative. ++ // Will fix that. For now, omit the offset. ++ jio_snprintf(buf, buflen, "%s", p1); ++ } else { ++ jio_snprintf(buf, buflen, PTR_FORMAT, handler); ++ } ++ return buf; ++} ++ ++static void print_signal_handler(outputStream* st, int sig, ++ char* buf, size_t buflen) { ++ struct sigaction sa; ++ sigaction(sig, NULL, &sa); ++ ++ st->print("%s: ", os::exception_name(sig, buf, buflen)); ++ ++ address handler = (sa.sa_flags & SA_SIGINFO) ++ ? CAST_FROM_FN_PTR(address, sa.sa_sigaction) ++ : CAST_FROM_FN_PTR(address, sa.sa_handler); ++ ++ if (handler == CAST_FROM_FN_PTR(address, SIG_DFL)) { ++ st->print("SIG_DFL"); ++ } else if (handler == CAST_FROM_FN_PTR(address, SIG_IGN)) { ++ st->print("SIG_IGN"); ++ } else { ++ st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); ++ } ++ ++ // Print readable mask. ++ st->print(", sa_mask[0]="); ++ os::Posix::print_signal_set_short(st, &sa.sa_mask); ++ ++ address rh = VMError::get_resetted_sighandler(sig); ++ // May be, handler was resetted by VMError? ++ if (rh != NULL) { ++ handler = rh; ++ sa.sa_flags = VMError::get_resetted_sigflags(sig); ++ } ++ ++ // Print textual representation of sa_flags. ++ st->print(", sa_flags="); ++ os::Posix::print_sa_flags(st, sa.sa_flags); ++ ++ // Check: is it our handler? ++ if (handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler) || ++ handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler)) { ++ // It is our signal handler. ++ // Check for flags, reset system-used one! ++ if ((int)sa.sa_flags != os::Aix::get_our_sigflags(sig)) { ++ st->print(", flags was changed from " PTR32_FORMAT ", consider using jsig library", ++ os::Aix::get_our_sigflags(sig)); ++ } ++ } ++ st->cr(); ++} ++ ++ ++#define DO_SIGNAL_CHECK(sig) \ ++ if (!sigismember(&check_signal_done, sig)) \ ++ os::Aix::check_signal_handler(sig) ++ ++// This method is a periodic task to check for misbehaving JNI applications ++// under CheckJNI, we can add any periodic checks here ++ ++void os::run_periodic_checks() { ++ ++ if (check_signals == false) return; ++ ++ // SEGV and BUS if overridden could potentially prevent ++ // generation of hs*.log in the event of a crash, debugging ++ // such a case can be very challenging, so we absolutely ++ // check the following for a good measure: ++ DO_SIGNAL_CHECK(SIGSEGV); ++ DO_SIGNAL_CHECK(SIGILL); ++ DO_SIGNAL_CHECK(SIGFPE); ++ DO_SIGNAL_CHECK(SIGBUS); ++ DO_SIGNAL_CHECK(SIGPIPE); ++ DO_SIGNAL_CHECK(SIGXFSZ); ++ if (UseSIGTRAP) { ++ DO_SIGNAL_CHECK(SIGTRAP); ++ } ++ DO_SIGNAL_CHECK(SIGDANGER); ++ ++ // ReduceSignalUsage allows the user to override these handlers ++ // see comments at the very top and jvm_solaris.h ++ if (!ReduceSignalUsage) { ++ DO_SIGNAL_CHECK(SHUTDOWN1_SIGNAL); ++ DO_SIGNAL_CHECK(SHUTDOWN2_SIGNAL); ++ DO_SIGNAL_CHECK(SHUTDOWN3_SIGNAL); ++ DO_SIGNAL_CHECK(BREAK_SIGNAL); ++ } ++ ++ DO_SIGNAL_CHECK(SR_signum); ++ DO_SIGNAL_CHECK(INTERRUPT_SIGNAL); ++} ++ ++typedef int (*os_sigaction_t)(int, const struct sigaction *, struct sigaction *); ++ ++static os_sigaction_t os_sigaction = NULL; ++ ++void os::Aix::check_signal_handler(int sig) { ++ char buf[O_BUFLEN]; ++ address jvmHandler = NULL; ++ ++ struct sigaction act; ++ if (os_sigaction == NULL) { ++ // only trust the default sigaction, in case it has been interposed ++ os_sigaction = (os_sigaction_t)dlsym(RTLD_DEFAULT, "sigaction"); ++ if (os_sigaction == NULL) return; ++ } ++ ++ os_sigaction(sig, (struct sigaction*)NULL, &act); ++ ++ address thisHandler = (act.sa_flags & SA_SIGINFO) ++ ? CAST_FROM_FN_PTR(address, act.sa_sigaction) ++ : CAST_FROM_FN_PTR(address, act.sa_handler); ++ ++ ++ switch(sig) { ++ case SIGSEGV: ++ case SIGBUS: ++ case SIGFPE: ++ case SIGPIPE: ++ case SIGILL: ++ case SIGXFSZ: ++ // Renamed 'signalHandler' to avoid collision with other shared libs. ++ jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)javaSignalHandler); ++ break; ++ ++ case SHUTDOWN1_SIGNAL: ++ case SHUTDOWN2_SIGNAL: ++ case SHUTDOWN3_SIGNAL: ++ case BREAK_SIGNAL: ++ jvmHandler = (address)user_handler(); ++ break; ++ ++ case INTERRUPT_SIGNAL: ++ jvmHandler = CAST_FROM_FN_PTR(address, SIG_DFL); ++ break; ++ ++ default: ++ if (sig == SR_signum) { ++ jvmHandler = CAST_FROM_FN_PTR(address, (sa_sigaction_t)SR_handler); ++ } else { ++ return; ++ } ++ break; ++ } ++ ++ if (thisHandler != jvmHandler) { ++ tty->print("Warning: %s handler ", exception_name(sig, buf, O_BUFLEN)); ++ tty->print("expected:%s", get_signal_handler_name(jvmHandler, buf, O_BUFLEN)); ++ tty->print_cr(" found:%s", get_signal_handler_name(thisHandler, buf, O_BUFLEN)); ++ // No need to check this sig any longer ++ sigaddset(&check_signal_done, sig); ++ } else if (os::Aix::get_our_sigflags(sig) != 0 && (int)act.sa_flags != os::Aix::get_our_sigflags(sig)) { ++ tty->print("Warning: %s handler flags ", exception_name(sig, buf, O_BUFLEN)); ++ tty->print("expected:" PTR32_FORMAT, os::Aix::get_our_sigflags(sig)); ++ tty->print_cr(" found:" PTR32_FORMAT, act.sa_flags); ++ // No need to check this sig any longer ++ sigaddset(&check_signal_done, sig); ++ } ++ ++ // Dump all the signal ++ if (sigismember(&check_signal_done, sig)) { ++ print_signal_handlers(tty, buf, O_BUFLEN); ++ } ++} ++ ++extern bool signal_name(int signo, char* buf, size_t len); ++ ++const char* os::exception_name(int exception_code, char* buf, size_t size) { ++ if (0 < exception_code && exception_code <= SIGRTMAX) { ++ // signal ++ if (!signal_name(exception_code, buf, size)) { ++ jio_snprintf(buf, size, "SIG%d", exception_code); ++ } ++ return buf; ++ } else { ++ return NULL; ++ } ++} ++ ++// To install functions for atexit system call ++extern "C" { ++ static void perfMemory_exit_helper() { ++ perfMemory_exit(); ++ } ++} ++ ++// This is called _before_ the most of global arguments have been parsed. ++void os::init(void) { ++ // This is basic, we want to know if that ever changes. ++ // (shared memory boundary is supposed to be a 256M aligned) ++ assert(SHMLBA == ((uint64_t)0x10000000ULL)/*256M*/, "unexpected"); ++ ++ // First off, we need to know whether we run on AIX or PASE, and ++ // the OS level we run on. ++ os::Aix::initialize_os_info(); ++ ++ // Scan environment (SPEC1170 behaviour, etc) ++ os::Aix::scan_environment(); ++ ++ // Check which pages are supported by AIX. ++ os::Aix::query_multipage_support(); ++ ++ // Next, we need to initialize libo4 and libperfstat libraries. ++ if (os::Aix::on_pase()) { ++ os::Aix::initialize_libo4(); ++ } else { ++ os::Aix::initialize_libperfstat(); ++ } ++ ++ // Reset the perfstat information provided by ODM. ++ if (os::Aix::on_aix()) { ++ libperfstat::perfstat_reset(); ++ } ++ ++ // Now initialze basic system properties. Note that for some of the values we ++ // need libperfstat etc. ++ os::Aix::initialize_system_info(); ++ ++ // Initialize large page support. ++ if (UseLargePages) { ++ os::large_page_init(); ++ if (!UseLargePages) { ++ // initialize os::_page_sizes ++ _page_sizes[0] = Aix::page_size(); ++ _page_sizes[1] = 0; ++ if (Verbose) { ++ fprintf(stderr, "Large Page initialization failed: setting UseLargePages=0.\n"); ++ } ++ } ++ } else { ++ // initialize os::_page_sizes ++ _page_sizes[0] = Aix::page_size(); ++ _page_sizes[1] = 0; ++ } ++ ++ // debug trace ++ if (Verbose) { ++ fprintf(stderr, "os::vm_page_size 0x%llX\n", os::vm_page_size()); ++ fprintf(stderr, "os::large_page_size 0x%llX\n", os::large_page_size()); ++ fprintf(stderr, "os::_page_sizes = ( "); ++ for (int i = 0; _page_sizes[i]; i ++) { ++ fprintf(stderr, " %s ", describe_pagesize(_page_sizes[i])); ++ } ++ fprintf(stderr, ")\n"); ++ } ++ ++ _initial_pid = getpid(); ++ ++ clock_tics_per_sec = sysconf(_SC_CLK_TCK); ++ ++ init_random(1234567); ++ ++ ThreadCritical::initialize(); ++ ++ // Main_thread points to the aboriginal thread. ++ Aix::_main_thread = pthread_self(); ++ ++ initial_time_count = os::elapsed_counter(); ++ pthread_mutex_init(&dl_mutex, NULL); ++} ++ ++// this is called _after_ the global arguments have been parsed ++jint os::init_2(void) { ++ ++ if (Verbose) { ++ fprintf(stderr, "processor count: %d\n", os::_processor_count); ++ fprintf(stderr, "physical memory: %lu\n", Aix::_physical_memory); ++ } ++ ++ // initially build up the loaded dll map ++ LoadedLibraries::reload(); ++ ++ const int page_size = Aix::page_size(); ++ const int map_size = page_size; ++ ++ address map_address = (address) MAP_FAILED; ++ const int prot = PROT_READ; ++ const int flags = MAP_PRIVATE|MAP_ANONYMOUS; ++ ++ // use optimized addresses for the polling page, ++ // e.g. map it to a special 32-bit address. ++ if (OptimizePollingPageLocation) { ++ // architecture-specific list of address wishes: ++ address address_wishes[] = { ++ // AIX: addresses lower than 0x30000000 don't seem to work on AIX. ++ // PPC64: all address wishes are non-negative 32 bit values where ++ // the lower 16 bits are all zero. we can load these addresses ++ // with a single ppc_lis instruction. ++ (address) 0x30000000, (address) 0x31000000, ++ (address) 0x32000000, (address) 0x33000000, ++ (address) 0x40000000, (address) 0x41000000, ++ (address) 0x42000000, (address) 0x43000000, ++ (address) 0x50000000, (address) 0x51000000, ++ (address) 0x52000000, (address) 0x53000000, ++ (address) 0x60000000, (address) 0x61000000, ++ (address) 0x62000000, (address) 0x63000000 ++ }; ++ int address_wishes_length = sizeof(address_wishes)/sizeof(address); ++ ++ // iterate over the list of address wishes: ++ for (int i=0; i %p\n", ++ address_wishes[i], map_address + (ssize_t)page_size); ++ } ++ ++ if (map_address + (ssize_t)page_size == address_wishes[i]) { ++ // map succeeded and map_address is at wished address, exit loop. ++ break; ++ } ++ ++ if (map_address != (address) MAP_FAILED) { ++ // map succeeded, but polling_page is not at wished address, unmap and continue. ++ ::munmap(map_address, map_size); ++ map_address = (address) MAP_FAILED; ++ } ++ // map failed, continue loop. ++ } ++ } // end OptimizePollingPageLocation ++ ++ if (map_address == (address) MAP_FAILED) { ++ map_address = (address) ::mmap(NULL, map_size, prot, flags, -1, 0); ++ } ++ guarantee(map_address != MAP_FAILED, "os::init_2: failed to allocate polling page"); ++ os::set_polling_page(map_address); ++ ++ if (!UseMembar) { ++ address mem_serialize_page = (address) ::mmap(NULL, Aix::page_size(), PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); ++ guarantee(mem_serialize_page != NULL, "mmap Failed for memory serialize page"); ++ os::set_memory_serialize_page(mem_serialize_page); ++ ++#ifndef PRODUCT ++ if (Verbose && PrintMiscellaneous) ++ tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page); ++#endif ++ } ++ ++ // initialize suspend/resume support - must do this before signal_sets_init() ++ if (SR_initialize() != 0) { ++ perror("SR_initialize failed"); ++ return JNI_ERR; ++ } ++ ++ Aix::signal_sets_init(); ++ Aix::install_signal_handlers(); ++ ++ // Check minimum allowable stack size for thread creation and to initialize ++ // the java system classes, including StackOverflowError - depends on page ++ // size. Add a page for compiler2 recursion in main thread. ++ // Add in 2*BytesPerWord times page size to account for VM stack during ++ // class initialization depending on 32 or 64 bit VM. ++ os::Aix::min_stack_allowed = MAX2(os::Aix::min_stack_allowed, ++ (size_t)(StackYellowPages+StackRedPages+StackShadowPages + ++ 2*BytesPerWord COMPILER2_PRESENT(+1)) * Aix::page_size()); ++ ++ size_t threadStackSizeInBytes = ThreadStackSize * K; ++ if (threadStackSizeInBytes != 0 && ++ threadStackSizeInBytes < os::Aix::min_stack_allowed) { ++ tty->print_cr("\nThe stack size specified is too small, " ++ "Specify at least %dk", ++ os::Aix::min_stack_allowed / K); ++ return JNI_ERR; ++ } ++ ++ // Make the stack size a multiple of the page size so that ++ // the yellow/red zones can be guarded. ++ // note that this can be 0, if no default stacksize was set ++ JavaThread::set_stack_size_at_create(round_to(threadStackSizeInBytes, vm_page_size())); ++ ++ Aix::libpthread_init(); ++ ++ if (MaxFDLimit) { ++ // set the number of file descriptors to max. print out error ++ // if getrlimit/setrlimit fails but continue regardless. ++ struct rlimit nbr_files; ++ int status = getrlimit(RLIMIT_NOFILE, &nbr_files); ++ if (status != 0) { ++ if (PrintMiscellaneous && (Verbose || WizardMode)) ++ perror("os::init_2 getrlimit failed"); ++ } else { ++ nbr_files.rlim_cur = nbr_files.rlim_max; ++ status = setrlimit(RLIMIT_NOFILE, &nbr_files); ++ if (status != 0) { ++ if (PrintMiscellaneous && (Verbose || WizardMode)) ++ perror("os::init_2 setrlimit failed"); ++ } ++ } ++ } ++ ++ if (PerfAllowAtExitRegistration) { ++ // only register atexit functions if PerfAllowAtExitRegistration is set. ++ // atexit functions can be delayed until process exit time, which ++ // can be problematic for embedded VM situations. Embedded VMs should ++ // call DestroyJavaVM() to assure that VM resources are released. ++ ++ // note: perfMemory_exit_helper atexit function may be removed in ++ // the future if the appropriate cleanup code can be added to the ++ // VM_Exit VMOperation's doit method. ++ if (atexit(perfMemory_exit_helper) != 0) { ++ warning("os::init_2 atexit(perfMemory_exit_helper) failed"); ++ } ++ } ++ ++ return JNI_OK; ++} ++ ++// this is called at the end of vm_initialization ++void os::init_3(void) { ++ return; ++} ++ ++// Mark the polling page as unreadable ++void os::make_polling_page_unreadable(void) { ++ if (!guard_memory((char*)_polling_page, Aix::page_size())) { ++ fatal("Could not disable polling page"); ++ } ++}; ++ ++// Mark the polling page as readable ++void os::make_polling_page_readable(void) { ++ // Changed according to os_linux.cpp. ++ if (!checked_mprotect((char *)_polling_page, Aix::page_size(), PROT_READ)) { ++ fatal(err_msg("Could not enable polling page at " PTR_FORMAT, _polling_page)); ++ } ++}; ++ ++int os::active_processor_count() { ++ int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN); ++ assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check"); ++ return online_cpus; ++} ++ ++void os::set_native_thread_name(const char *name) { ++ // Not yet implemented. ++ return; ++} ++ ++bool os::distribute_processes(uint length, uint* distribution) { ++ // Not yet implemented. ++ return false; ++} ++ ++bool os::bind_to_processor(uint processor_id) { ++ // Not yet implemented. ++ return false; ++} ++ ++void os::SuspendedThreadTask::internal_do_task() { ++ if (do_suspend(_thread->osthread())) { ++ SuspendedThreadTaskContext context(_thread, _thread->osthread()->ucontext()); ++ do_task(context); ++ do_resume(_thread->osthread()); ++ } ++} ++ ++class PcFetcher : public os::SuspendedThreadTask { ++public: ++ PcFetcher(Thread* thread) : os::SuspendedThreadTask(thread) {} ++ ExtendedPC result(); ++protected: ++ void do_task(const os::SuspendedThreadTaskContext& context); ++private: ++ ExtendedPC _epc; ++}; ++ ++ExtendedPC PcFetcher::result() { ++ guarantee(is_done(), "task is not done yet."); ++ return _epc; ++} ++ ++void PcFetcher::do_task(const os::SuspendedThreadTaskContext& context) { ++ Thread* thread = context.thread(); ++ OSThread* osthread = thread->osthread(); ++ if (osthread->ucontext() != NULL) { ++ _epc = os::Aix::ucontext_get_pc((ucontext_t *) context.ucontext()); ++ } else { ++ // NULL context is unexpected, double-check this is the VMThread. ++ guarantee(thread->is_VM_thread(), "can only be called for VMThread"); ++ } ++} ++ ++// Suspends the target using the signal mechanism and then grabs the PC before ++// resuming the target. Used by the flat-profiler only ++ExtendedPC os::get_thread_pc(Thread* thread) { ++ // Make sure that it is called by the watcher for the VMThread. ++ assert(Thread::current()->is_Watcher_thread(), "Must be watcher"); ++ assert(thread->is_VM_thread(), "Can only be called for VMThread"); ++ ++ PcFetcher fetcher(thread); ++ fetcher.run(); ++ return fetcher.result(); ++} ++ ++// Not neede on Aix. ++// int os::Aix::safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime) { ++// } ++ ++//////////////////////////////////////////////////////////////////////////////// ++// debug support ++ ++static address same_page(address x, address y) { ++ intptr_t page_bits = -os::vm_page_size(); ++ if ((intptr_t(x) & page_bits) == (intptr_t(y) & page_bits)) ++ return x; ++ else if (x > y) ++ return (address)(intptr_t(y) | ~page_bits) + 1; ++ else ++ return (address)(intptr_t(y) & page_bits); ++} ++ ++bool os::find(address addr, outputStream* st) { ++ ++ st->print(PTR_FORMAT ": ", addr); ++ ++ const LoadedLibraryModule* lib = LoadedLibraries::find_for_text_address(addr); ++ if (lib) { ++ lib->print(st); ++ return true; ++ } else { ++ lib = LoadedLibraries::find_for_data_address(addr); ++ if (lib) { ++ lib->print(st); ++ return true; ++ } else { ++ st->print_cr("(outside any module)"); ++ } ++ } ++ ++ return false; ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// misc ++ ++// This does not do anything on Aix. This is basically a hook for being ++// able to use structured exception handling (thread-local exception filters) ++// on, e.g., Win32. ++void ++os::os_exception_wrapper(java_call_t f, JavaValue* value, methodHandle* method, ++ JavaCallArguments* args, Thread* thread) { ++ f(value, method, args, thread); ++} ++ ++void os::print_statistics() { ++} ++ ++int os::message_box(const char* title, const char* message) { ++ int i; ++ fdStream err(defaultStream::error_fd()); ++ for (i = 0; i < 78; i++) err.print_raw("="); ++ err.cr(); ++ err.print_raw_cr(title); ++ for (i = 0; i < 78; i++) err.print_raw("-"); ++ err.cr(); ++ err.print_raw_cr(message); ++ for (i = 0; i < 78; i++) err.print_raw("="); ++ err.cr(); ++ ++ char buf[16]; ++ // Prevent process from exiting upon "read error" without consuming all CPU ++ while (::read(0, buf, sizeof(buf)) <= 0) { ::sleep(100); } ++ ++ return buf[0] == 'y' || buf[0] == 'Y'; ++} ++ ++int os::stat(const char *path, struct stat *sbuf) { ++ char pathbuf[MAX_PATH]; ++ if (strlen(path) > MAX_PATH - 1) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ os::native_path(strcpy(pathbuf, path)); ++ return ::stat(pathbuf, sbuf); ++} ++ ++bool os::check_heap(bool force) { ++ return true; ++} ++ ++// int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) { ++// return ::vsnprintf(buf, count, format, args); ++// } ++ ++// Is a (classpath) directory empty? ++bool os::dir_is_empty(const char* path) { ++ DIR *dir = NULL; ++ struct dirent *ptr; ++ ++ dir = opendir(path); ++ if (dir == NULL) return true; ++ ++ /* Scan the directory */ ++ bool result = true; ++ char buf[sizeof(struct dirent) + MAX_PATH]; ++ while (result && (ptr = ::readdir(dir)) != NULL) { ++ if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) { ++ result = false; ++ } ++ } ++ closedir(dir); ++ return result; ++} ++ ++// This code originates from JDK's sysOpen and open64_w ++// from src/solaris/hpi/src/system_md.c ++ ++#ifndef O_DELETE ++#define O_DELETE 0x10000 ++#endif ++ ++// Open a file. Unlink the file immediately after open returns ++// if the specified oflag has the O_DELETE flag set. ++// O_DELETE is used only in j2se/src/share/native/java/util/zip/ZipFile.c ++ ++int os::open(const char *path, int oflag, int mode) { ++ ++ if (strlen(path) > MAX_PATH - 1) { ++ errno = ENAMETOOLONG; ++ return -1; ++ } ++ int fd; ++ int o_delete = (oflag & O_DELETE); ++ oflag = oflag & ~O_DELETE; ++ ++ fd = ::open64(path, oflag, mode); ++ if (fd == -1) return -1; ++ ++ // If the open succeeded, the file might still be a directory. ++ { ++ struct stat64 buf64; ++ int ret = ::fstat64(fd, &buf64); ++ int st_mode = buf64.st_mode; ++ ++ if (ret != -1) { ++ if ((st_mode & S_IFMT) == S_IFDIR) { ++ errno = EISDIR; ++ ::close(fd); ++ return -1; ++ } ++ } else { ++ ::close(fd); ++ return -1; ++ } ++ } ++ ++ // All file descriptors that are opened in the JVM and not ++ // specifically destined for a subprocess should have the ++ // close-on-exec flag set. If we don't set it, then careless 3rd ++ // party native code might fork and exec without closing all ++ // appropriate file descriptors (e.g. as we do in closeDescriptors in ++ // UNIXProcess.c), and this in turn might: ++ // ++ // - cause end-of-file to fail to be detected on some file ++ // descriptors, resulting in mysterious hangs, or ++ // ++ // - might cause an fopen in the subprocess to fail on a system ++ // suffering from bug 1085341. ++ // ++ // (Yes, the default setting of the close-on-exec flag is a Unix ++ // design flaw.) ++ // ++ // See: ++ // 1085341: 32-bit stdio routines should support file descriptors >255 ++ // 4843136: (process) pipe file descriptor from Runtime.exec not being closed ++ // 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9 ++#ifdef FD_CLOEXEC ++ { ++ int flags = ::fcntl(fd, F_GETFD); ++ if (flags != -1) ++ ::fcntl(fd, F_SETFD, flags | FD_CLOEXEC); ++ } ++#endif ++ ++ if (o_delete != 0) { ++ ::unlink(path); ++ } ++ return fd; ++} ++ ++ ++// create binary file, rewriting existing file if required ++int os::create_binary_file(const char* path, bool rewrite_existing) { ++ int oflags = O_WRONLY | O_CREAT; ++ if (!rewrite_existing) { ++ oflags |= O_EXCL; ++ } ++ return ::open64(path, oflags, S_IREAD | S_IWRITE); ++} ++ ++// return current position of file pointer ++jlong os::current_file_offset(int fd) { ++ return (jlong)::lseek64(fd, (off64_t)0, SEEK_CUR); ++} ++ ++// move file pointer to the specified offset ++jlong os::seek_to_file_offset(int fd, jlong offset) { ++ return (jlong)::lseek64(fd, (off64_t)offset, SEEK_SET); ++} ++ ++// This code originates from JDK's sysAvailable ++// from src/solaris/hpi/src/native_threads/src/sys_api_td.c ++ ++int os::available(int fd, jlong *bytes) { ++ jlong cur, end; ++ int mode; ++ struct stat64 buf64; ++ ++ if (::fstat64(fd, &buf64) >= 0) { ++ mode = buf64.st_mode; ++ if (S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { ++ // XXX: is the following call interruptible? If so, this might ++ // need to go through the INTERRUPT_IO() wrapper as for other ++ // blocking, interruptible calls in this file. ++ int n; ++ if (::ioctl(fd, FIONREAD, &n) >= 0) { ++ *bytes = n; ++ return 1; ++ } ++ } ++ } ++ if ((cur = ::lseek64(fd, 0L, SEEK_CUR)) == -1) { ++ return 0; ++ } else if ((end = ::lseek64(fd, 0L, SEEK_END)) == -1) { ++ return 0; ++ } else if (::lseek64(fd, cur, SEEK_SET) == -1) { ++ return 0; ++ } ++ *bytes = end - cur; ++ return 1; ++} ++ ++int os::socket_available(int fd, jint *pbytes) { ++ // Linux doc says EINTR not returned, unlike Solaris ++ int ret = ::ioctl(fd, FIONREAD, pbytes); ++ ++ //%% note ioctl can return 0 when successful, JVM_SocketAvailable ++ // is expected to return 0 on failure and 1 on success to the jdk. ++ return (ret < 0) ? 0 : 1; ++} ++ ++// Map a block of memory. ++char* os::pd_map_memory(int fd, const char* file_name, size_t file_offset, ++ char *addr, size_t bytes, bool read_only, ++ bool allow_exec) { ++ Unimplemented(); ++ return NULL; ++} ++ ++ ++// Remap a block of memory. ++char* os::pd_remap_memory(int fd, const char* file_name, size_t file_offset, ++ char *addr, size_t bytes, bool read_only, ++ bool allow_exec) { ++ // same as map_memory() on this OS ++ return os::map_memory(fd, file_name, file_offset, addr, bytes, read_only, ++ allow_exec); ++} ++ ++// Unmap a block of memory. ++bool os::pd_unmap_memory(char* addr, size_t bytes) { ++ return munmap(addr, bytes) == 0; ++} ++ ++// current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) ++// are used by JVM M&M and JVMTI to get user+sys or user CPU time ++// of a thread. ++// ++// current_thread_cpu_time() and thread_cpu_time(Thread*) returns ++// the fast estimate available on the platform. ++ ++jlong os::current_thread_cpu_time() { ++ // return user + sys since the cost is the same ++ const jlong n = os::thread_cpu_time(Thread::current(), true /* user + sys */); ++ assert(n >= 0, "negative CPU time"); ++ return n; ++} ++ ++jlong os::thread_cpu_time(Thread* thread) { ++ // consistent with what current_thread_cpu_time() returns ++ const jlong n = os::thread_cpu_time(thread, true /* user + sys */); ++ assert(n >= 0, "negative CPU time"); ++ return n; ++} ++ ++jlong os::current_thread_cpu_time(bool user_sys_cpu_time) { ++ const jlong n = os::thread_cpu_time(Thread::current(), user_sys_cpu_time); ++ assert(n >= 0, "negative CPU time"); ++ return n; ++} ++ ++static bool thread_cpu_time_unchecked(Thread* thread, jlong* p_sys_time, jlong* p_user_time) { ++ bool error = false; ++ ++ jlong sys_time = 0; ++ jlong user_time = 0; ++ ++ // reimplemented using getthrds64(). ++ // ++ // goes like this: ++ // For the thread in question, get the kernel thread id. Then get the ++ // kernel thread statistics using that id. ++ // ++ // This only works of course when no pthread scheduling is used, ++ // ie there is a 1:1 relationship to kernel threads. ++ // On AIX, see AIXTHREAD_SCOPE variable. ++ ++ pthread_t pthtid = thread->osthread()->pthread_id(); ++ ++ // retrieve kernel thread id for the pthread: ++ tid64_t tid = 0; ++ struct __pthrdsinfo pinfo; ++ // I just love those otherworldly IBM APIs which force me to hand down ++ // dummy buffers for stuff I dont care for... ++ char dummy[1]; ++ int dummy_size = sizeof(dummy); ++ if (pthread_getthrds_np(&pthtid, PTHRDSINFO_QUERY_TID, &pinfo, sizeof(pinfo), ++ dummy, &dummy_size) == 0) { ++ tid = pinfo.__pi_tid; ++ } else { ++ tty->print_cr("pthread_getthrds_np failed."); ++ error = true; ++ } ++ ++ // retrieve kernel timing info for that kernel thread ++ if (!error) { ++ struct thrdentry64 thrdentry; ++ if (getthrds64(getpid(), &thrdentry, sizeof(thrdentry), &tid, 1) == 1) { ++ sys_time = thrdentry.ti_ru.ru_stime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_stime.tv_usec * 1000LL; ++ user_time = thrdentry.ti_ru.ru_utime.tv_sec * 1000000000LL + thrdentry.ti_ru.ru_utime.tv_usec * 1000LL; ++ } else { ++ tty->print_cr("pthread_getthrds_np failed."); ++ error = true; ++ } ++ } ++ ++ if (p_sys_time) { ++ *p_sys_time = sys_time; ++ } ++ ++ if (p_user_time) { ++ *p_user_time = user_time; ++ } ++ ++ if (error) { ++ return false; ++ } ++ ++ return true; ++} ++ ++jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { ++ jlong sys_time; ++ jlong user_time; ++ ++ if (!thread_cpu_time_unchecked(thread, &sys_time, &user_time)) { ++ return -1; ++ } ++ ++ return user_sys_cpu_time ? sys_time + user_time : user_time; ++} ++ ++void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { ++ info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits ++ info_ptr->may_skip_backward = false; // elapsed time not wall time ++ info_ptr->may_skip_forward = false; // elapsed time not wall time ++ info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned ++} ++ ++void os::thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { ++ info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits ++ info_ptr->may_skip_backward = false; // elapsed time not wall time ++ info_ptr->may_skip_forward = false; // elapsed time not wall time ++ info_ptr->kind = JVMTI_TIMER_TOTAL_CPU; // user+system time is returned ++} ++ ++bool os::is_thread_cpu_time_supported() { ++ return true; ++} ++ ++// System loadavg support. Returns -1 if load average cannot be obtained. ++// For now just return the system wide load average (no processor sets). ++int os::loadavg(double values[], int nelem) { ++ ++ // Implemented using libperfstat on AIX. ++ ++ guarantee(nelem >= 0 && nelem <= 3, "argument error"); ++ guarantee(values, "argument error"); ++ ++ if (os::Aix::on_pase()) { ++ Unimplemented(); ++ return -1; ++ } else { ++ // AIX: use libperfstat ++ // ++ // See also: ++ // http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/perfstat_cputot.htm ++ // /usr/include/libperfstat.h: ++ ++ // Use the already AIX version independent get_cpuinfo. ++ os::Aix::cpuinfo_t ci; ++ if (os::Aix::get_cpuinfo(&ci)) { ++ for (int i = 0; i < nelem; i++) { ++ values[i] = ci.loadavg[i]; ++ } ++ } else { ++ return -1; ++ } ++ return nelem; ++ } ++} ++ ++void os::pause() { ++ char filename[MAX_PATH]; ++ if (PauseAtStartupFile && PauseAtStartupFile[0]) { ++ jio_snprintf(filename, MAX_PATH, PauseAtStartupFile); ++ } else { ++ jio_snprintf(filename, MAX_PATH, "./vm.paused.%d", current_process_id()); ++ } ++ ++ int fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666); ++ if (fd != -1) { ++ struct stat buf; ++ ::close(fd); ++ while (::stat(filename, &buf) == 0) { ++ (void)::poll(NULL, 0, 100); ++ } ++ } else { ++ jio_fprintf(stderr, ++ "Could not open pause file '%s', continuing immediately.\n", filename); ++ } ++} ++ ++bool os::Aix::is_primordial_thread() { ++ if (pthread_self() == (pthread_t)1) { ++ return true; ++ } else { ++ return false; ++ } ++} ++ ++// OS recognitions (PASE/AIX, OS level) call this before calling any ++// one of Aix::on_pase(), Aix::os_version() static ++void os::Aix::initialize_os_info() { ++ ++ assert(_on_pase == -1 && _os_version == -1, "already called."); ++ ++ struct utsname uts; ++ memset(&uts, 0, sizeof(uts)); ++ strcpy(uts.sysname, "?"); ++ if (::uname(&uts) == -1) { ++ fprintf(stderr, "uname failed (%d)\n", errno); ++ guarantee(0, "Could not determine whether we run on AIX or PASE"); ++ } else { ++ if (Verbose) { ++ fprintf(stderr,"uname says: sysname \"%s\" version \"%s\" release \"%s\" " ++ "node \"%s\" machine \"%s\"\n", ++ uts.sysname, uts.version, uts.release, uts.nodename, uts.machine); ++ } ++ const int major = atoi(uts.version); ++ assert(major > 0, "invalid OS version"); ++ const int minor = atoi(uts.release); ++ assert(minor > 0, "invalid OS release"); ++ _os_version = (major << 8) | minor; ++ if (strcmp(uts.sysname, "OS400") == 0) { ++ Unimplemented(); ++ } else if (strcmp(uts.sysname, "AIX") == 0) { ++ // We run on AIX. We do not support versions older than AIX 5.3. ++ _on_pase = 0; ++ if (_os_version < 0x0503) { ++ fprintf(stderr, "AIX release older than AIX 5.3 not supported.\n"); ++ assert(false, "AIX release too old."); ++ } else { ++ if (Verbose) { ++ fprintf(stderr, "We run on AIX %d.%d\n", major, minor); ++ } ++ } ++ } else { ++ assert(false, "unknown OS"); ++ } ++ } ++ ++ guarantee(_on_pase != -1 && _os_version, "Could not determine AIX/OS400 release"); ++ ++} // end: os::Aix::initialize_os_info() ++ ++// Scan environment for important settings which might effect the VM. ++// Trace out settings. Warn about invalid settings and/or correct them. ++// ++// Must run after os::Aix::initialue_os_info(). ++void os::Aix::scan_environment() { ++ ++ char* p; ++ int rc; ++ ++ // Warn explicity if EXTSHM=ON is used. That switch changes how ++ // System V shared memory behaves. One effect is that page size of ++ // shared memory cannot be change dynamically, effectivly preventing ++ // large pages from working. ++ // This switch was needed on AIX 32bit, but on AIX 64bit the general ++ // recommendation is (in OSS notes) to switch it off. ++ p = ::getenv("EXTSHM"); ++ if (Verbose) { ++ fprintf(stderr, "EXTSHM=%s.\n", p ? p : ""); ++ } ++ if (p && strcmp(p, "ON") == 0) { ++ fprintf(stderr, "Unsupported setting: EXTSHM=ON. Large Page support will be disabled.\n"); ++ _extshm = 1; ++ } else { ++ _extshm = 0; ++ } ++ ++ // SPEC1170 behaviour: will change the behaviour of a number of POSIX APIs. ++ // Not tested, not supported. ++ // ++ // Note that it might be worth the trouble to test and to require it, if only to ++ // get useful return codes for mprotect. ++ // ++ // Note: Setting XPG_SUS_ENV in the process is too late. Must be set earlier (before ++ // exec() ? before loading the libjvm ? ....) ++ p = ::getenv("XPG_SUS_ENV"); ++ if (Verbose) { ++ fprintf(stderr, "XPG_SUS_ENV=%s.\n", p ? p : ""); ++ } ++ if (p && strcmp(p, "ON") == 0) { ++ _xpg_sus_mode = 1; ++ fprintf(stderr, "Unsupported setting: XPG_SUS_ENV=ON\n"); ++ // This is not supported. Worst of all, it changes behaviour of mmap MAP_FIXED to ++ // clobber address ranges. If we ever want to support that, we have to do some ++ // testing first. ++ guarantee(false, "XPG_SUS_ENV=ON not supported"); ++ } else { ++ _xpg_sus_mode = 0; ++ } ++ ++ // Switch off AIX internal (pthread) guard pages. This has ++ // immediate effect for any pthread_create calls which follow. ++ p = ::getenv("AIXTHREAD_GUARDPAGES"); ++ if (Verbose) { ++ fprintf(stderr, "AIXTHREAD_GUARDPAGES=%s.\n", p ? p : ""); ++ fprintf(stderr, "setting AIXTHREAD_GUARDPAGES=0.\n"); ++ } ++ rc = ::putenv("AIXTHREAD_GUARDPAGES=0"); ++ guarantee(rc == 0, ""); ++ ++} // end: os::Aix::scan_environment() ++ ++// PASE: initialize the libo4 library (AS400 PASE porting library). ++void os::Aix::initialize_libo4() { ++ Unimplemented(); ++} ++ ++// AIX: initialize the libperfstat library (we load this dynamically ++// because it is only available on AIX. ++void os::Aix::initialize_libperfstat() { ++ ++ assert(os::Aix::on_aix(), "AIX only"); ++ ++ if (!libperfstat::init()) { ++ fprintf(stderr, "libperfstat initialization failed.\n"); ++ assert(false, "libperfstat initialization failed"); ++ } else { ++ if (Verbose) { ++ fprintf(stderr, "libperfstat initialized.\n"); ++ } ++ } ++} // end: os::Aix::initialize_libperfstat ++ ++///////////////////////////////////////////////////////////////////////////// ++// thread stack ++ ++// function to query the current stack size using pthread_getthrds_np ++// ++// ! do not change anything here unless you know what you are doing ! ++static void query_stack_dimensions(address* p_stack_base, size_t* p_stack_size) { ++ ++ // This only works when invoked on a pthread. As we agreed not to use ++ // primordial threads anyway, I assert here ++ guarantee(!os::Aix::is_primordial_thread(), "not allowed on the primordial thread"); ++ ++ // information about this api can be found (a) in the pthread.h header and ++ // (b) in http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/pthread_getthrds_np.htm ++ // ++ // The use of this API to find out the current stack is kind of undefined. ++ // But after a lot of tries and asking IBM about it, I concluded that it is safe ++ // enough for cases where I let the pthread library create its stacks. For cases ++ // where I create an own stack and pass this to pthread_create, it seems not to ++ // work (the returned stack size in that case is 0). ++ ++ pthread_t tid = pthread_self(); ++ struct __pthrdsinfo pinfo; ++ char dummy[1]; // we only need this to satisfy the api and to not get E ++ int dummy_size = sizeof(dummy); ++ ++ memset(&pinfo, 0, sizeof(pinfo)); ++ ++ const int rc = pthread_getthrds_np (&tid, PTHRDSINFO_QUERY_ALL, &pinfo, ++ sizeof(pinfo), dummy, &dummy_size); ++ ++ if (rc != 0) { ++ fprintf(stderr, "pthread_getthrds_np failed (%d)\n", rc); ++ guarantee(0, "pthread_getthrds_np failed"); ++ } ++ ++ guarantee(pinfo.__pi_stackend, "returned stack base invalid"); ++ ++ // the following can happen when invoking pthread_getthrds_np on a pthread running on a user provided stack ++ // (when handing down a stack to pthread create, see pthread_attr_setstackaddr). ++ // Not sure what to do here - I feel inclined to forbid this use case completely. ++ guarantee(pinfo.__pi_stacksize, "returned stack size invalid"); ++ ++ // On AIX, stacks are not necessarily page aligned so round the base and size accordingly ++ if (p_stack_base) { ++ (*p_stack_base) = (address) align_size_up((intptr_t)pinfo.__pi_stackend, os::Aix::stack_page_size()); ++ } ++ ++ if (p_stack_size) { ++ (*p_stack_size) = pinfo.__pi_stacksize - os::Aix::stack_page_size(); ++ } ++ ++#ifndef PRODUCT ++ if (Verbose) { ++ fprintf(stderr, ++ "query_stack_dimensions() -> real stack_base=" INTPTR_FORMAT ", real stack_addr=" INTPTR_FORMAT ++ ", real stack_size=" INTPTR_FORMAT ++ ", stack_base=" INTPTR_FORMAT ", stack_size=" INTPTR_FORMAT "\n", ++ (intptr_t)pinfo.__pi_stackend, (intptr_t)pinfo.__pi_stackaddr, pinfo.__pi_stacksize, ++ (intptr_t)align_size_up((intptr_t)pinfo.__pi_stackend, os::Aix::stack_page_size()), ++ pinfo.__pi_stacksize - os::Aix::stack_page_size()); ++ } ++#endif ++ ++} // end query_stack_dimensions ++ ++// get the current stack base from the OS (actually, the pthread library) ++address os::current_stack_base() { ++ address p; ++ query_stack_dimensions(&p, 0); ++ return p; ++} ++ ++// get the current stack size from the OS (actually, the pthread library) ++size_t os::current_stack_size() { ++ size_t s; ++ query_stack_dimensions(0, &s); ++ return s; ++} ++ ++// Refer to the comments in os_solaris.cpp park-unpark. ++// ++// Beware -- Some versions of NPTL embody a flaw where pthread_cond_timedwait() can ++// hang indefinitely. For instance NPTL 0.60 on 2.4.21-4ELsmp is vulnerable. ++// For specifics regarding the bug see GLIBC BUGID 261237 : ++// http://www.mail-archive.com/debian-glibc@lists.debian.org/msg10837.html. ++// Briefly, pthread_cond_timedwait() calls with an expiry time that's not in the future ++// will either hang or corrupt the condvar, resulting in subsequent hangs if the condvar ++// is used. (The simple C test-case provided in the GLIBC bug report manifests the ++// hang). The JVM is vulernable via sleep(), Object.wait(timo), LockSupport.parkNanos() ++// and monitorenter when we're using 1-0 locking. All those operations may result in ++// calls to pthread_cond_timedwait(). Using LD_ASSUME_KERNEL to use an older version ++// of libpthread avoids the problem, but isn't practical. ++// ++// Possible remedies: ++// ++// 1. Establish a minimum relative wait time. 50 to 100 msecs seems to work. ++// This is palliative and probabilistic, however. If the thread is preempted ++// between the call to compute_abstime() and pthread_cond_timedwait(), more ++// than the minimum period may have passed, and the abstime may be stale (in the ++// past) resultin in a hang. Using this technique reduces the odds of a hang ++// but the JVM is still vulnerable, particularly on heavily loaded systems. ++// ++// 2. Modify park-unpark to use per-thread (per ParkEvent) pipe-pairs instead ++// of the usual flag-condvar-mutex idiom. The write side of the pipe is set ++// NDELAY. unpark() reduces to write(), park() reduces to read() and park(timo) ++// reduces to poll()+read(). This works well, but consumes 2 FDs per extant ++// thread. ++// ++// 3. Embargo pthread_cond_timedwait() and implement a native "chron" thread ++// that manages timeouts. We'd emulate pthread_cond_timedwait() by enqueuing ++// a timeout request to the chron thread and then blocking via pthread_cond_wait(). ++// This also works well. In fact it avoids kernel-level scalability impediments ++// on certain platforms that don't handle lots of active pthread_cond_timedwait() ++// timers in a graceful fashion. ++// ++// 4. When the abstime value is in the past it appears that control returns ++// correctly from pthread_cond_timedwait(), but the condvar is left corrupt. ++// Subsequent timedwait/wait calls may hang indefinitely. Given that, we ++// can avoid the problem by reinitializing the condvar -- by cond_destroy() ++// followed by cond_init() -- after all calls to pthread_cond_timedwait(). ++// It may be possible to avoid reinitialization by checking the return ++// value from pthread_cond_timedwait(). In addition to reinitializing the ++// condvar we must establish the invariant that cond_signal() is only called ++// within critical sections protected by the adjunct mutex. This prevents ++// cond_signal() from "seeing" a condvar that's in the midst of being ++// reinitialized or that is corrupt. Sadly, this invariant obviates the ++// desirable signal-after-unlock optimization that avoids futile context switching. ++// ++// I'm also concerned that some versions of NTPL might allocate an auxilliary ++// structure when a condvar is used or initialized. cond_destroy() would ++// release the helper structure. Our reinitialize-after-timedwait fix ++// put excessive stress on malloc/free and locks protecting the c-heap. ++// ++// We currently use (4). See the WorkAroundNTPLTimedWaitHang flag. ++// It may be possible to refine (4) by checking the kernel and NTPL verisons ++// and only enabling the work-around for vulnerable environments. ++ ++// utility to compute the abstime argument to timedwait: ++// millis is the relative timeout time ++// abstime will be the absolute timeout time ++// TODO: replace compute_abstime() with unpackTime() ++ ++static struct timespec* compute_abstime(timespec* abstime, jlong millis) { ++ if (millis < 0) millis = 0; ++ struct timeval now; ++ int status = gettimeofday(&now, NULL); ++ assert(status == 0, "gettimeofday"); ++ jlong seconds = millis / 1000; ++ millis %= 1000; ++ if (seconds > 50000000) { // see man cond_timedwait(3T) ++ seconds = 50000000; ++ } ++ abstime->tv_sec = now.tv_sec + seconds; ++ long usec = now.tv_usec + millis * 1000; ++ if (usec >= 1000000) { ++ abstime->tv_sec += 1; ++ usec -= 1000000; ++ } ++ abstime->tv_nsec = usec * 1000; ++ return abstime; ++} ++ ++ ++// Test-and-clear _Event, always leaves _Event set to 0, returns immediately. ++// Conceptually TryPark() should be equivalent to park(0). ++ ++int os::PlatformEvent::TryPark() { ++ for (;;) { ++ const int v = _Event; ++ guarantee ((v == 0) || (v == 1), "invariant"); ++ if (Atomic::cmpxchg (0, &_Event, v) == v) return v; ++ } ++} ++ ++void os::PlatformEvent::park() { // AKA "down()" ++ // Invariant: Only the thread associated with the Event/PlatformEvent ++ // may call park(). ++ // TODO: assert that _Assoc != NULL or _Assoc == Self ++ int v; ++ for (;;) { ++ v = _Event; ++ if (Atomic::cmpxchg (v-1, &_Event, v) == v) break; ++ } ++ guarantee (v >= 0, "invariant"); ++ if (v == 0) { ++ // Do this the hard way by blocking ... ++ int status = pthread_mutex_lock(_mutex); ++ assert_status(status == 0, status, "mutex_lock"); ++ guarantee (_nParked == 0, "invariant"); ++ ++ _nParked; ++ while (_Event < 0) { ++ status = pthread_cond_wait(_cond, _mutex); ++ assert_status(status == 0 || status == ETIMEDOUT, status, "cond_timedwait"); ++ } ++ -- _nParked; ++ ++ // In theory we could move the ST of 0 into _Event past the unlock(), ++ // but then we'd need a MEMBAR after the ST. ++ _Event = 0; ++ status = pthread_mutex_unlock(_mutex); ++ assert_status(status == 0, status, "mutex_unlock"); ++ } ++ guarantee (_Event >= 0, "invariant"); ++} ++ ++int os::PlatformEvent::park(jlong millis) { ++ guarantee (_nParked == 0, "invariant"); ++ ++ int v; ++ for (;;) { ++ v = _Event; ++ if (Atomic::cmpxchg (v-1, &_Event, v) == v) break; ++ } ++ guarantee (v >= 0, "invariant"); ++ if (v != 0) return OS_OK; ++ ++ // We do this the hard way, by blocking the thread. ++ // Consider enforcing a minimum timeout value. ++ struct timespec abst; ++ compute_abstime(&abst, millis); ++ ++ int ret = OS_TIMEOUT; ++ int status = pthread_mutex_lock(_mutex); ++ assert_status(status == 0, status, "mutex_lock"); ++ guarantee (_nParked == 0, "invariant"); ++ ++_nParked; ++ ++ // Object.wait(timo) will return because of ++ // (a) notification ++ // (b) timeout ++ // (c) thread.interrupt ++ // ++ // 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. ++ // ++ // TODO: properly differentiate simultaneous notify+interrupt. ++ // In that case, we should propagate the notify to another waiter. ++ ++ while (_Event < 0) { ++ status = pthread_cond_timedwait(_cond, _mutex, &abst); ++ assert_status(status == 0 || status == ETIMEDOUT, ++ status, "cond_timedwait"); ++ if (!FilterSpuriousWakeups) break; // previous semantics ++ if (status == ETIMEDOUT) break; ++ // We consume and ignore EINTR and spurious wakeups. ++ } ++ --_nParked; ++ if (_Event >= 0) { ++ ret = OS_OK; ++ } ++ _Event = 0; ++ status = pthread_mutex_unlock(_mutex); ++ assert_status(status == 0, status, "mutex_unlock"); ++ assert (_nParked == 0, "invariant"); ++ return ret; ++} ++ ++void os::PlatformEvent::unpark() { ++ int v, AnyWaiters; ++ for (;;) { ++ v = _Event; ++ if (v > 0) { ++ // The LD of _Event could have reordered or be satisfied ++ // by a read-aside from this processor's write buffer. ++ // To avoid problems execute a barrier and then ++ // ratify the value. ++ OrderAccess::fence(); ++ if (_Event == v) return; ++ continue; ++ } ++ if (Atomic::cmpxchg (v+1, &_Event, v) == v) break; ++ } ++ if (v < 0) { ++ // Wait for the thread associated with the event to vacate ++ int status = pthread_mutex_lock(_mutex); ++ assert_status(status == 0, status, "mutex_lock"); ++ AnyWaiters = _nParked; ++ ++ if (AnyWaiters != 0) { ++ // We intentional signal *after* dropping the lock ++ // to avoid a common class of futile wakeups. ++ status = pthread_cond_signal(_cond); ++ assert_status(status == 0, status, "cond_signal"); ++ } ++ // Mutex should be locked for pthread_cond_signal(_cond). ++ status = pthread_mutex_unlock(_mutex); ++ assert_status(status == 0, status, "mutex_unlock"); ++ } ++ ++ // Note that we signal() _after dropping the lock for "immortal" Events. ++ // This is safe and avoids a common class of futile wakeups. In rare ++ // circumstances this can cause a thread to return prematurely from ++ // cond_{timed}wait() but the spurious wakeup is benign and the victim will ++ // simply re-test the condition and re-park itself. ++} ++ ++ ++// JSR166 ++// ------------------------------------------------------- ++ ++// ++// The solaris and linux implementations of park/unpark are fairly ++// conservative for now, but can be improved. They currently use a ++// mutex/condvar pair, plus a a count. ++// Park decrements count if > 0, else does a condvar wait. Unpark ++// sets count to 1 and signals condvar. Only one thread ever waits ++// on the condvar. Contention seen when trying to park implies that someone ++// is unparking you, so don't wait. And spurious returns are fine, so there ++// is no need to track notifications. ++// ++ ++#define MAX_SECS 100000000 ++// ++// This code is common to linux and solaris and will be moved to a ++// common place in dolphin. ++// ++// The passed in time value is either a relative time in nanoseconds ++// or an absolute time in milliseconds. Either way it has to be unpacked ++// into suitable seconds and nanoseconds components and stored in the ++// given timespec structure. ++// Given time is a 64-bit value and the time_t used in the timespec is only ++// a signed-32-bit value (except on 64-bit Linux) we have to watch for ++// overflow if times way in the future are given. Further on Solaris versions ++// prior to 10 there is a restriction (see cond_timedwait) that the specified ++// number of seconds, in abstime, is less than current_time + 100,000,000. ++// As it will be 28 years before "now + 100000000" will overflow we can ++// ignore overflow and just impose a hard-limit on seconds using the value ++// of "now + 100,000,000". This places a limit on the timeout of about 3.17 ++// years from "now". ++// ++ ++static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) { ++ assert (time > 0, "convertTime"); ++ ++ struct timeval now; ++ int status = gettimeofday(&now, NULL); ++ assert(status == 0, "gettimeofday"); ++ ++ time_t max_secs = now.tv_sec + MAX_SECS; ++ ++ if (isAbsolute) { ++ jlong secs = time / 1000; ++ if (secs > max_secs) { ++ absTime->tv_sec = max_secs; ++ } ++ else { ++ absTime->tv_sec = secs; ++ } ++ absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC; ++ } ++ else { ++ jlong secs = time / NANOSECS_PER_SEC; ++ if (secs >= MAX_SECS) { ++ absTime->tv_sec = max_secs; ++ absTime->tv_nsec = 0; ++ } ++ else { ++ absTime->tv_sec = now.tv_sec + secs; ++ absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000; ++ if (absTime->tv_nsec >= NANOSECS_PER_SEC) { ++ absTime->tv_nsec -= NANOSECS_PER_SEC; ++ ++absTime->tv_sec; // note: this must be <= max_secs ++ } ++ } ++ } ++ assert(absTime->tv_sec >= 0, "tv_sec < 0"); ++ assert(absTime->tv_sec <= max_secs, "tv_sec > max_secs"); ++ assert(absTime->tv_nsec >= 0, "tv_nsec < 0"); ++ assert(absTime->tv_nsec < NANOSECS_PER_SEC, "tv_nsec >= nanos_per_sec"); ++} ++ ++void Parker::park(bool isAbsolute, jlong time) { ++ // Optional fast-path check: ++ // Return immediately if a permit is available. ++ if (_counter > 0) { ++ _counter = 0; ++ OrderAccess::fence(); ++ return; ++ } ++ ++ Thread* thread = Thread::current(); ++ assert(thread->is_Java_thread(), "Must be JavaThread"); ++ JavaThread *jt = (JavaThread *)thread; ++ ++ // Optional optimization -- avoid state transitions if there's an interrupt pending. ++ // Check interrupt before trying to wait ++ if (Thread::is_interrupted(thread, false)) { ++ return; ++ } ++ ++ // Next, demultiplex/decode time arguments ++ timespec absTime; ++ if (time < 0 || (isAbsolute && time == 0)) { // don't wait at all ++ return; ++ } ++ if (time > 0) { ++ unpackTime(&absTime, isAbsolute, time); ++ } ++ ++ ++ // Enter safepoint region ++ // Beware of deadlocks such as 6317397. ++ // The per-thread Parker:: mutex is a classic leaf-lock. ++ // In particular a thread must never block on the Threads_lock while ++ // holding the Parker:: mutex. If safepoints are pending both the ++ // the ThreadBlockInVM() CTOR and DTOR may grab Threads_lock. ++ ThreadBlockInVM tbivm(jt); ++ ++ // Don't wait if cannot get lock since interference arises from ++ // unblocking. Also. check interrupt before trying wait ++ if (Thread::is_interrupted(thread, false) || pthread_mutex_trylock(_mutex) != 0) { ++ return; ++ } ++ ++ int status; ++ if (_counter > 0) { // no wait needed ++ _counter = 0; ++ status = pthread_mutex_unlock(_mutex); ++ assert (status == 0, "invariant"); ++ OrderAccess::fence(); ++ return; ++ } ++ ++#ifdef ASSERT ++ // Don't catch signals while blocked; let the running threads have the signals. ++ // (This allows a debugger to break into the running thread.) ++ sigset_t oldsigs; ++ sigset_t* allowdebug_blocked = os::Aix::allowdebug_blocked_signals(); ++ pthread_sigmask(SIG_BLOCK, allowdebug_blocked, &oldsigs); ++#endif ++ ++ OSThreadWaitState osts(thread->osthread(), false /* not Object.wait() */); ++ jt->set_suspend_equivalent(); ++ // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self() ++ ++ if (time == 0) { ++ status = pthread_cond_wait (_cond, _mutex); ++ } else { ++ status = pthread_cond_timedwait (_cond, _mutex, &absTime); ++ if (status != 0 && WorkAroundNPTLTimedWaitHang) { ++ pthread_cond_destroy (_cond); ++ pthread_cond_init (_cond, NULL); ++ } ++ } ++ assert_status(status == 0 || status == EINTR || ++ status == ETIME || status == ETIMEDOUT, ++ status, "cond_timedwait"); ++ ++#ifdef ASSERT ++ pthread_sigmask(SIG_SETMASK, &oldsigs, NULL); ++#endif ++ ++ _counter = 0; ++ status = pthread_mutex_unlock(_mutex); ++ assert_status(status == 0, status, "invariant"); ++ // If externally suspended while waiting, re-suspend ++ if (jt->handle_special_suspend_equivalent_condition()) { ++ jt->java_suspend_self(); ++ } ++ ++ OrderAccess::fence(); ++} ++ ++void Parker::unpark() { ++ int s, status; ++ status = pthread_mutex_lock(_mutex); ++ assert (status == 0, "invariant"); ++ s = _counter; ++ _counter = 1; ++ if (s < 1) { ++ if (WorkAroundNPTLTimedWaitHang) { ++ status = pthread_cond_signal (_cond); ++ assert (status == 0, "invariant"); ++ status = pthread_mutex_unlock(_mutex); ++ assert (status == 0, "invariant"); ++ } else { ++ status = pthread_mutex_unlock(_mutex); ++ assert (status == 0, "invariant"); ++ status = pthread_cond_signal (_cond); ++ assert (status == 0, "invariant"); ++ } ++ } else { ++ pthread_mutex_unlock(_mutex); ++ assert (status == 0, "invariant"); ++ } ++} ++ ++ ++extern char** environ; ++ ++// Run the specified command in a separate process. Return its exit value, ++// or -1 on failure (e.g. can't fork a new process). ++// Unlike system(), this function can be called from signal handler. It ++// doesn't block SIGINT et al. ++int os::fork_and_exec(char* cmd) { ++ char * argv[4] = {"sh", "-c", cmd, NULL}; ++ ++ pid_t pid = fork(); ++ ++ if (pid < 0) { ++ // fork failed ++ return -1; ++ ++ } else if (pid == 0) { ++ // child process ++ ++ // try to be consistent with system(), which uses "/usr/bin/sh" on AIX ++ execve("/usr/bin/sh", argv, environ); ++ ++ // execve failed ++ _exit(-1); ++ ++ } else { ++ // copied from J2SE ..._waitForProcessExit() in UNIXProcess_md.c; we don't ++ // care about the actual exit code, for now. ++ ++ int status; ++ ++ // Wait for the child process to exit. This returns immediately if ++ // the child has already exited. */ ++ while (waitpid(pid, &status, 0) < 0) { ++ switch (errno) { ++ case ECHILD: return 0; ++ case EINTR: break; ++ default: return -1; ++ } ++ } ++ ++ if (WIFEXITED(status)) { ++ // The child exited normally; get its exit code. ++ return WEXITSTATUS(status); ++ } else if (WIFSIGNALED(status)) { ++ // The child exited because of a signal ++ // The best value to return is 0x80 + signal number, ++ // because that is what all Unix shells do, and because ++ // it allows callers to distinguish between process exit and ++ // process death by signal. ++ return 0x80 + WTERMSIG(status); ++ } else { ++ // Unknown exit code; pass it through ++ return status; ++ } ++ } ++ // Remove warning. ++ return -1; ++} ++ ++// is_headless_jre() ++// ++// Test for the existence of xawt/libmawt.so or libawt_xawt.so ++// in order to report if we are running in a headless jre. ++// ++// Since JDK8 xawt/libmawt.so is moved into the same directory ++// as libawt.so, and renamed libawt_xawt.so ++bool os::is_headless_jre() { ++ struct stat statbuf; ++ char buf[MAXPATHLEN]; ++ char libmawtpath[MAXPATHLEN]; ++ const char *xawtstr = "/xawt/libmawt.so"; ++ const char *new_xawtstr = "/libawt_xawt.so"; ++ ++ char *p; ++ ++ // Get path to libjvm.so ++ os::jvm_path(buf, sizeof(buf)); ++ ++ // Get rid of libjvm.so ++ p = strrchr(buf, '/'); ++ if (p == NULL) return false; ++ else *p = '\0'; ++ ++ // Get rid of client or server ++ p = strrchr(buf, '/'); ++ if (p == NULL) return false; ++ else *p = '\0'; ++ ++ // check xawt/libmawt.so ++ strcpy(libmawtpath, buf); ++ strcat(libmawtpath, xawtstr); ++ if (::stat(libmawtpath, &statbuf) == 0) return false; ++ ++ // check libawt_xawt.so ++ strcpy(libmawtpath, buf); ++ strcat(libmawtpath, new_xawtstr); ++ if (::stat(libmawtpath, &statbuf) == 0) return false; ++ ++ return true; ++} ++ ++// Get the default path to the core file ++// Returns the length of the string ++int os::get_core_path(char* buffer, size_t bufferSize) { ++ const char* p = get_current_directory(buffer, bufferSize); ++ ++ if (p == NULL) { ++ assert(p != NULL, "failed to get current directory"); ++ return 0; ++ } ++ ++ return strlen(buffer); ++} ++ ++#ifndef PRODUCT ++void TestReserveMemorySpecial_test() { ++ // No tests available for this platform ++} ++#endif +--- ./hotspot/src/os/aix/vm/os_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/os_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,385 @@ ++/* ++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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 OS_AIX_VM_OS_AIX_HPP ++#define OS_AIX_VM_OS_AIX_HPP ++ ++// Information about the protection of the page at address '0' on this os. ++static bool zero_page_read_protected() { return false; } ++ ++// Class Aix defines the interface to the Aix operating systems. ++ ++class Aix { ++ friend class os; ++ ++ // For signal-chaining ++ // highest so far (AIX 5.2) is SIGSAK (63) ++#define MAXSIGNUM 63 ++ // length of strings included in the libperfstat structures ++#define IDENTIFIER_LENGTH 64 ++ ++ static struct sigaction sigact[MAXSIGNUM]; // saved preinstalled sigactions ++ static unsigned int sigs; // mask of signals that have ++ // preinstalled signal handlers ++ static bool libjsig_is_loaded; // libjsig that interposes sigaction(), ++ // __sigaction(), signal() is loaded ++ static struct sigaction *(*get_signal_action)(int); ++ static struct sigaction *get_preinstalled_handler(int); ++ static void save_preinstalled_handler(int, struct sigaction&); ++ ++ static void check_signal_handler(int sig); ++ ++ // For signal flags diagnostics ++ static int sigflags[MAXSIGNUM]; ++ ++ protected: ++ ++ static julong _physical_memory; ++ static pthread_t _main_thread; ++ static Mutex* _createThread_lock; ++ static int _page_size; ++ static int _logical_cpus; ++ ++ // -1 = uninitialized, 0 = AIX, 1 = OS/400 (PASE) ++ static int _on_pase; ++ ++ // -1 = uninitialized, otherwise 16 bit number: ++ // lower 8 bit - minor version ++ // higher 8 bit - major version ++ // For AIX, e.g. 0x0601 for AIX 6.1 ++ // for OS/400 e.g. 0x0504 for OS/400 V5R4 ++ static int _os_version; ++ ++ // -1 = uninitialized, ++ // 0 - SPEC1170 not requested (XPG_SUS_ENV is OFF or not set) ++ // 1 - SPEC1170 requested (XPG_SUS_ENV is ON) ++ static int _xpg_sus_mode; ++ ++ // -1 = uninitialized, ++ // 0 - EXTSHM=OFF or not set ++ // 1 - EXTSHM=ON ++ static int _extshm; ++ ++ // page sizes on AIX. ++ // ++ // AIX supports four different page sizes - 4K, 64K, 16MB, 16GB. The latter two ++ // (16M "large" resp. 16G "huge" pages) require special setup and are normally ++ // not available. ++ // ++ // AIX supports multiple page sizes per process, for: ++ // - Stack (of the primordial thread, so not relevant for us) ++ // - Data - data, bss, heap, for us also pthread stacks ++ // - Text - text code ++ // - shared memory ++ // ++ // Default page sizes can be set via linker options (-bdatapsize, -bstacksize, ...) ++ // and via environment variable LDR_CNTRL (DATAPSIZE, STACKPSIZE, ...) ++ // ++ // For shared memory, page size can be set dynamically via shmctl(). Different shared memory ++ // regions can have different page sizes. ++ // ++ // More information can be found at AIBM info center: ++ // http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.prftungd/doc/prftungd/multiple_page_size_app_support.htm ++ // ++ // ----- ++ // We want to support 4K and 64K and, if the machine is set up correctly, 16MB pages. ++ // ++ ++ // page size of the stack of newly created pthreads ++ // (should be LDR_CNTRL DATAPSIZE because stack is allocated on heap by pthread lib) ++ static int _stack_page_size; ++ ++ // Default shm page size. Read: what page size shared memory will be backed ++ // with if no page size was set explicitly using shmctl(SHM_PAGESIZE). ++ // Should be LDR_CNTRL SHMPSIZE. ++ static size_t _shm_default_page_size; ++ ++ // True if sys V shm can be used with 64K pages dynamically. ++ // (via shmctl(.. SHM_PAGESIZE..). Should be true for AIX 53 and ++ // newer / PASE V6R1 and newer. (0 or 1, -1 if not initialized) ++ static int _can_use_64K_pages; ++ ++ // True if sys V shm can be used with 16M pages dynamically. ++ // (via shmctl(.. SHM_PAGESIZE..). Only true on AIX 5.3 and ++ // newer, if the system was set up to use 16M pages and the ++ // jvm has enough user rights. (0 or 1, -1 if not initialized) ++ static int _can_use_16M_pages; ++ ++ static julong available_memory(); ++ static julong physical_memory() { return _physical_memory; } ++ static void initialize_system_info(); ++ ++ // OS recognitions (PASE/AIX, OS level) call this before calling any ++ // one of Aix::on_pase(), Aix::os_version(). ++ static void initialize_os_info(); ++ ++ static int commit_memory_impl(char* addr, size_t bytes, bool exec); ++ static int commit_memory_impl(char* addr, size_t bytes, ++ size_t alignment_hint, bool exec); ++ ++ // Scan environment for important settings which might effect the ++ // VM. Trace out settings. Warn about invalid settings and/or ++ // correct them. ++ // ++ // Must run after os::Aix::initialue_os_info(). ++ static void scan_environment(); ++ ++ // Retrieve information about multipage size support. Will initialize ++ // _page_size, _stack_page_size, _can_use_64K_pages/_can_use_16M_pages ++ static void query_multipage_support(); ++ ++ // Initialize libo4 (on PASE) and libperfstat (on AIX). Call this ++ // before relying on functions from either lib, e.g. Aix::get_meminfo(). ++ static void initialize_libo4(); ++ static void initialize_libperfstat(); ++ ++ static bool supports_variable_stack_size(); ++ ++ public: ++ static void init_thread_fpu_state(); ++ static pthread_t main_thread(void) { return _main_thread; } ++ // returns kernel thread id (similar to LWP id on Solaris), which can be ++ // used to access /proc ++ static pid_t gettid(); ++ static void set_createThread_lock(Mutex* lk) { _createThread_lock = lk; } ++ static Mutex* createThread_lock(void) { return _createThread_lock; } ++ static void hotspot_sigmask(Thread* thread); ++ ++ // Given an address, returns the size of the page backing that address ++ static size_t query_pagesize(void* p); ++ ++ // Return `true' if the calling thread is the primordial thread. The ++ // primordial thread is the thread which contains the main function, ++ // *not* necessarily the thread which initialized the VM by calling ++ // JNI_CreateJavaVM. ++ static bool is_primordial_thread(void); ++ ++ static int page_size(void) { ++ assert(_page_size != -1, "not initialized"); ++ return _page_size; ++ } ++ ++ // Accessor methods for stack page size which may be different from usual page size. ++ static int stack_page_size(void) { ++ assert(_stack_page_size != -1, "not initialized"); ++ return _stack_page_size; ++ } ++ ++ // default shm page size. Read: what page size shared memory ++ // will be backed with if no page size was set explicitly using shmctl(SHM_PAGESIZE). ++ // Should be LDR_CNTRL SHMPSIZE. ++ static int shm_default_page_size(void) { ++ assert(_shm_default_page_size != -1, "not initialized"); ++ return _shm_default_page_size; ++ } ++ ++ // Return true if sys V shm can be used with 64K pages dynamically ++ // (via shmctl(.. SHM_PAGESIZE..). ++ static bool can_use_64K_pages () { ++ assert(_can_use_64K_pages != -1, "not initialized"); ++ return _can_use_64K_pages == 1 ? true : false; ++ } ++ ++ // Return true if sys V shm can be used with 16M pages dynamically. ++ // (via shmctl(.. SHM_PAGESIZE..). ++ static bool can_use_16M_pages () { ++ assert(_can_use_16M_pages != -1, "not initialized"); ++ return _can_use_16M_pages == 1 ? true : false; ++ } ++ ++ static address ucontext_get_pc(ucontext_t* uc); ++ static intptr_t* ucontext_get_sp(ucontext_t* uc); ++ static intptr_t* ucontext_get_fp(ucontext_t* uc); ++ // Set PC into context. Needed for continuation after signal. ++ static void ucontext_set_pc(ucontext_t* uc, address pc); ++ ++ // This boolean allows users to forward their own non-matching signals ++ // to JVM_handle_aix_signal, harmlessly. ++ static bool signal_handlers_are_installed; ++ ++ static int get_our_sigflags(int); ++ static void set_our_sigflags(int, int); ++ static void signal_sets_init(); ++ static void install_signal_handlers(); ++ static void set_signal_handler(int, bool); ++ static bool is_sig_ignored(int sig); ++ ++ static sigset_t* unblocked_signals(); ++ static sigset_t* vm_signals(); ++ static sigset_t* allowdebug_blocked_signals(); ++ ++ // For signal-chaining ++ static struct sigaction *get_chained_signal_action(int sig); ++ static bool chained_handler(int sig, siginfo_t* siginfo, void* context); ++ ++ // libpthread version string ++ static void libpthread_init(); ++ ++ // Minimum stack size a thread can be created with (allowing ++ // the VM to completely create the thread and enter user code) ++ static size_t min_stack_allowed; ++ ++ // Return default stack size or guard size for the specified thread type ++ static size_t default_stack_size(os::ThreadType thr_type); ++ static size_t default_guard_size(os::ThreadType thr_type); ++ ++ // Function returns true if we run on OS/400 (pase), false if we run ++ // on AIX. ++ static bool on_pase() { ++ assert(_on_pase != -1, "not initialized"); ++ return _on_pase ? true : false; ++ } ++ ++ // Function returns true if we run on AIX, false if we run on OS/400 ++ // (pase). ++ static bool on_aix() { ++ assert(_on_pase != -1, "not initialized"); ++ return _on_pase ? false : true; ++ } ++ ++ // -1 = uninitialized, otherwise 16 bit number: ++ // lower 8 bit - minor version ++ // higher 8 bit - major version ++ // For AIX, e.g. 0x0601 for AIX 6.1 ++ // for OS/400 e.g. 0x0504 for OS/400 V5R4 ++ static int os_version () { ++ assert(_os_version != -1, "not initialized"); ++ return _os_version; ++ } ++ ++ // Convenience method: returns true if running on AIX 5.3 or older. ++ static bool on_aix_53_or_older() { ++ return on_aix() && os_version() <= 0x0503; ++ } ++ ++ // Returns true if we run in SPEC1170 compliant mode (XPG_SUS_ENV=ON). ++ static bool xpg_sus_mode() { ++ assert(_xpg_sus_mode != -1, "not initialized"); ++ return _xpg_sus_mode; ++ } ++ ++ // Returns true if EXTSHM=ON. ++ static bool extshm() { ++ assert(_extshm != -1, "not initialized"); ++ return _extshm; ++ } ++ ++ // result struct for get_meminfo() ++ struct meminfo_t { ++ ++ // Amount of virtual memory (in units of 4 KB pages) ++ unsigned long long virt_total; ++ ++ // Amount of real memory, in bytes ++ unsigned long long real_total; ++ ++ // Amount of free real memory, in bytes ++ unsigned long long real_free; ++ ++ // Total amount of paging space, in bytes ++ unsigned long long pgsp_total; ++ ++ // Amount of free paging space, in bytes ++ unsigned long long pgsp_free; ++ ++ }; ++ ++ // Result struct for get_cpuinfo(). ++ struct cpuinfo_t { ++ char description[IDENTIFIER_LENGTH]; // processor description (type/official name) ++ u_longlong_t processorHZ; // processor speed in Hz ++ int ncpus; // number of active logical processors ++ double loadavg[3]; // (1<. ++ char version[20]; // processor version from _system_configuration (sys/systemcfg.h) ++ }; ++ ++ // Functions to retrieve memory information on AIX, PASE. ++ // (on AIX, using libperfstat, on PASE with libo4.so). ++ // Returns true if ok, false if error. ++ static bool get_meminfo(meminfo_t* pmi); ++ ++ // Function to retrieve cpu information on AIX ++ // (on AIX, using libperfstat) ++ // Returns true if ok, false if error. ++ static bool get_cpuinfo(cpuinfo_t* pci); ++ ++}; // os::Aix class ++ ++ ++class PlatformEvent : public CHeapObj { ++ private: ++ double CachePad [4]; // increase odds that _mutex is sole occupant of cache line ++ volatile int _Event; ++ volatile int _nParked; ++ pthread_mutex_t _mutex [1]; ++ pthread_cond_t _cond [1]; ++ double PostPad [2]; ++ Thread * _Assoc; ++ ++ public: // TODO-FIXME: make dtor private ++ ~PlatformEvent() { guarantee (0, "invariant"); } ++ ++ public: ++ PlatformEvent() { ++ int status; ++ status = pthread_cond_init (_cond, NULL); ++ assert_status(status == 0, status, "cond_init"); ++ status = pthread_mutex_init (_mutex, NULL); ++ assert_status(status == 0, status, "mutex_init"); ++ _Event = 0; ++ _nParked = 0; ++ _Assoc = NULL; ++ } ++ ++ // Use caution with reset() and fired() -- they may require MEMBARs ++ void reset() { _Event = 0; } ++ int fired() { return _Event; } ++ void park (); ++ void unpark (); ++ int TryPark (); ++ int park (jlong millis); ++ void SetAssociation (Thread * a) { _Assoc = a; } ++}; ++ ++class PlatformParker : public CHeapObj { ++ protected: ++ pthread_mutex_t _mutex [1]; ++ pthread_cond_t _cond [1]; ++ ++ public: // TODO-FIXME: make dtor private ++ ~PlatformParker() { guarantee (0, "invariant"); } ++ ++ public: ++ PlatformParker() { ++ int status; ++ status = pthread_cond_init (_cond, NULL); ++ assert_status(status == 0, status, "cond_init"); ++ status = pthread_mutex_init (_mutex, NULL); ++ assert_status(status == 0, status, "mutex_init"); ++ } ++}; ++ ++#endif // OS_AIX_VM_OS_AIX_HPP +--- ./hotspot/src/os/aix/vm/os_aix.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/os_aix.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,286 @@ ++/* ++ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_AIX_VM_OS_AIX_INLINE_HPP ++#define OS_AIX_VM_OS_AIX_INLINE_HPP ++ ++#include "runtime/atomic.hpp" ++#include "runtime/os.hpp" ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "atomic_aix_ppc.inline.hpp" ++# include "orderAccess_aix_ppc.inline.hpp" ++#endif ++ ++// System includes ++ ++#include ++#include ++#include ++#include ++#include ++ ++// Defined in the system headers included above. ++#undef rem_size ++ ++inline void* os::thread_local_storage_at(int index) { ++ return pthread_getspecific((pthread_key_t)index); ++} ++ ++inline const char* os::file_separator() { ++ return "/"; ++} ++ ++inline const char* os::line_separator() { ++ return "\n"; ++} ++ ++inline const char* os::path_separator() { ++ return ":"; ++} ++ ++// File names are case-sensitive on windows only ++inline int os::file_name_strcmp(const char* s1, const char* s2) { ++ return strcmp(s1, s2); ++} ++ ++inline bool os::obsolete_option(const JavaVMOption *option) { ++ return false; ++} ++ ++inline bool os::uses_stack_guard_pages() { ++ return true; ++} ++ ++inline bool os::allocate_stack_guard_pages() { ++ assert(uses_stack_guard_pages(), "sanity check"); ++ return true; ++} ++ ++ ++// On Aix, reservations are made on a page by page basis, nothing to do. ++inline void os::pd_split_reserved_memory(char *base, size_t size, ++ size_t split, bool realloc) { ++} ++ ++ ++// Bang the shadow pages if they need to be touched to be mapped. ++inline void os::bang_stack_shadow_pages() { ++} ++ ++inline void os::dll_unload(void *lib) { ++ ::dlclose(lib); ++} ++ ++inline const int os::default_file_open_flags() { return 0;} ++ ++inline DIR* os::opendir(const char* dirname) ++{ ++ assert(dirname != NULL, "just checking"); ++ return ::opendir(dirname); ++} ++ ++inline int os::readdir_buf_size(const char *path) ++{ ++ // according to aix sys/limits, NAME_MAX must be retrieved at runtime. */ ++ const long my_NAME_MAX = pathconf(path, _PC_NAME_MAX); ++ return my_NAME_MAX + sizeof(dirent) + 1; ++} ++ ++inline jlong os::lseek(int fd, jlong offset, int whence) { ++ return (jlong) ::lseek64(fd, offset, whence); ++} ++ ++inline int os::fsync(int fd) { ++ return ::fsync(fd); ++} ++ ++inline char* os::native_path(char *path) { ++ return path; ++} ++ ++inline int os::ftruncate(int fd, jlong length) { ++ return ::ftruncate64(fd, length); ++} ++ ++inline struct dirent* os::readdir(DIR* dirp, dirent *dbuf) ++{ ++ dirent* p; ++ int status; ++ assert(dirp != NULL, "just checking"); ++ ++ // NOTE: Linux readdir_r (on RH 6.2 and 7.2 at least) is NOT like the POSIX ++ // version. Here is the doc for this function: ++ // http://www.gnu.org/manual/glibc-2.2.3/html_node/libc_262.html ++ ++ if((status = ::readdir_r(dirp, dbuf, &p)) != 0) { ++ errno = status; ++ return NULL; ++ } else ++ return p; ++} ++ ++inline int os::closedir(DIR *dirp) { ++ assert(dirp != NULL, "argument is NULL"); ++ return ::closedir(dirp); ++} ++ ++// macros for restartable system calls ++ ++#define RESTARTABLE(_cmd, _result) do { \ ++ _result = _cmd; \ ++ } while(((int)_result == OS_ERR) && (errno == EINTR)) ++ ++#define RESTARTABLE_RETURN_INT(_cmd) do { \ ++ int _result; \ ++ RESTARTABLE(_cmd, _result); \ ++ return _result; \ ++} while(false) ++ ++// We don't have NUMA support on Aix, but we need this for compilation. ++inline bool os::numa_has_static_binding() { ShouldNotReachHere(); return true; } ++inline bool os::numa_has_group_homing() { ShouldNotReachHere(); return false; } ++ ++inline size_t os::restartable_read(int fd, void *buf, unsigned int nBytes) { ++ size_t res; ++ RESTARTABLE( (size_t) ::read(fd, buf, (size_t) nBytes), res); ++ return res; ++} ++ ++inline size_t os::write(int fd, const void *buf, unsigned int nBytes) { ++ size_t res; ++ RESTARTABLE((size_t) ::write(fd, buf, (size_t) nBytes), res); ++ return res; ++} ++ ++inline int os::close(int fd) { ++ return ::close(fd); ++} ++ ++inline int os::socket_close(int fd) { ++ return ::close(fd); ++} ++ ++inline int os::socket(int domain, int type, int protocol) { ++ return ::socket(domain, type, protocol); ++} ++ ++inline int os::recv(int fd, char* buf, size_t nBytes, uint flags) { ++ RESTARTABLE_RETURN_INT(::recv(fd, buf, nBytes, flags)); ++} ++ ++inline int os::send(int fd, char* buf, size_t nBytes, uint flags) { ++ RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, flags)); ++} ++ ++inline int os::raw_send(int fd, char* buf, size_t nBytes, uint flags) { ++ return os::send(fd, buf, nBytes, flags); ++} ++ ++inline int os::timeout(int fd, long timeout) { ++ julong prevtime,newtime; ++ struct timeval t; ++ ++ gettimeofday(&t, NULL); ++ prevtime = ((julong)t.tv_sec * 1000) + t.tv_usec / 1000; ++ ++ for(;;) { ++ struct pollfd pfd; ++ ++ pfd.fd = fd; ++ pfd.events = POLLIN | POLLERR; ++ ++ int res = ::poll(&pfd, 1, timeout); ++ ++ if (res == OS_ERR && errno == EINTR) { ++ ++ // On Linux any value < 0 means "forever" ++ ++ if(timeout >= 0) { ++ gettimeofday(&t, NULL); ++ newtime = ((julong)t.tv_sec * 1000) + t.tv_usec / 1000; ++ timeout -= newtime - prevtime; ++ if(timeout <= 0) ++ return OS_OK; ++ prevtime = newtime; ++ } ++ } else ++ return res; ++ } ++} ++ ++inline int os::listen(int fd, int count) { ++ return ::listen(fd, count); ++} ++ ++inline int os::connect(int fd, struct sockaddr* him, socklen_t len) { ++ RESTARTABLE_RETURN_INT(::connect(fd, him, len)); ++} ++ ++inline int os::accept(int fd, struct sockaddr* him, socklen_t* len) { ++ // Linux doc says this can't return EINTR, unlike accept() on Solaris. ++ // But see attachListener_linux.cpp, LinuxAttachListener::dequeue(). ++ return (int)::accept(fd, him, len); ++} ++ ++inline int os::recvfrom(int fd, char* buf, size_t nBytes, uint flags, ++ sockaddr* from, socklen_t* fromlen) { ++ RESTARTABLE_RETURN_INT((int)::recvfrom(fd, buf, nBytes, flags, from, fromlen)); ++} ++ ++inline int os::sendto(int fd, char* buf, size_t len, uint flags, ++ struct sockaddr* to, socklen_t tolen) { ++ RESTARTABLE_RETURN_INT((int)::sendto(fd, buf, len, flags, to, tolen)); ++} ++ ++inline int os::socket_shutdown(int fd, int howto) { ++ return ::shutdown(fd, howto); ++} ++ ++inline int os::bind(int fd, struct sockaddr* him, socklen_t len) { ++ return ::bind(fd, him, len); ++} ++ ++inline int os::get_sock_name(int fd, struct sockaddr* him, socklen_t* len) { ++ return ::getsockname(fd, him, len); ++} ++ ++inline int os::get_host_name(char* name, int namelen) { ++ return ::gethostname(name, namelen); ++} ++ ++inline struct hostent* os::get_host_by_name(char* name) { ++ return ::gethostbyname(name); ++} ++ ++inline int os::get_sock_opt(int fd, int level, int optname, ++ char* optval, socklen_t* optlen) { ++ return ::getsockopt(fd, level, optname, optval, optlen); ++} ++ ++inline int os::set_sock_opt(int fd, int level, int optname, ++ const char* optval, socklen_t optlen) { ++ return ::setsockopt(fd, level, optname, optval, optlen); ++} ++#endif // OS_AIX_VM_OS_AIX_INLINE_HPP +--- ./hotspot/src/os/aix/vm/os_share_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/os_share_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) 1999, 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. ++ * ++ */ ++ ++#ifndef OS_AIX_VM_OS_SHARE_AIX_HPP ++#define OS_AIX_VM_OS_SHARE_AIX_HPP ++ ++// misc ++void signalHandler(int, siginfo_t*, ucontext_t*); ++void handle_unexpected_exception(Thread* thread, int sig, siginfo_t* info, address pc, address adjusted_pc); ++#ifndef PRODUCT ++void continue_with_dump(void); ++#endif ++ ++#define PROCFILE_LENGTH 128 ++ ++#endif // OS_AIX_VM_OS_SHARE_AIX_HPP +--- ./hotspot/src/os/aix/vm/perfMemory_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/perfMemory_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,1026 @@ ++/* ++ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "classfile/vmSymbols.hpp" ++#include "memory/allocation.inline.hpp" ++#include "memory/resourceArea.hpp" ++#include "oops/oop.inline.hpp" ++#include "os_aix.inline.hpp" ++#include "runtime/handles.inline.hpp" ++#include "runtime/perfMemory.hpp" ++#include "utilities/exceptions.hpp" ++ ++// put OS-includes here ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++ ++static char* backing_store_file_name = NULL; // name of the backing store ++ // file, if successfully created. ++ ++// Standard Memory Implementation Details ++ ++// create the PerfData memory region in standard memory. ++// ++static char* create_standard_memory(size_t size) { ++ ++ // allocate an aligned chuck of memory ++ char* mapAddress = os::reserve_memory(size); ++ ++ if (mapAddress == NULL) { ++ return NULL; ++ } ++ ++ // commit memory ++ if (!os::commit_memory(mapAddress, size, !ExecMem)) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("Could not commit PerfData memory\n"); ++ } ++ os::release_memory(mapAddress, size); ++ return NULL; ++ } ++ ++ return mapAddress; ++} ++ ++// delete the PerfData memory region ++// ++static void delete_standard_memory(char* addr, size_t size) { ++ ++ // there are no persistent external resources to cleanup for standard ++ // memory. since DestroyJavaVM does not support unloading of the JVM, ++ // cleanup of the memory resource is not performed. The memory will be ++ // reclaimed by the OS upon termination of the process. ++ // ++ return; ++} ++ ++// save the specified memory region to the given file ++// ++// Note: this function might be called from signal handler (by os::abort()), ++// don't allocate heap memory. ++// ++static void save_memory_to_file(char* addr, size_t size) { ++ ++ const char* destfile = PerfMemory::get_perfdata_file_path(); ++ assert(destfile[0] != '\0', "invalid PerfData file path"); ++ ++ int result; ++ ++ RESTARTABLE(::open(destfile, O_CREAT|O_WRONLY|O_TRUNC, S_IREAD|S_IWRITE), ++ result);; ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("Could not create Perfdata save file: %s: %s\n", ++ destfile, strerror(errno)); ++ } ++ } else { ++ int fd = result; ++ ++ for (size_t remaining = size; remaining > 0;) { ++ ++ RESTARTABLE(::write(fd, addr, remaining), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("Could not write Perfdata save file: %s: %s\n", ++ destfile, strerror(errno)); ++ } ++ break; ++ } ++ ++ remaining -= (size_t)result; ++ addr += result; ++ } ++ ++ RESTARTABLE(::close(fd), result); ++ if (PrintMiscellaneous && Verbose) { ++ if (result == OS_ERR) { ++ warning("Could not close %s: %s\n", destfile, strerror(errno)); ++ } ++ } ++ } ++ FREE_C_HEAP_ARRAY(char, destfile, mtInternal); ++} ++ ++ ++// Shared Memory Implementation Details ++ ++// Note: the solaris and linux shared memory implementation uses the mmap ++// interface with a backing store file to implement named shared memory. ++// Using the file system as the name space for shared memory allows a ++// common name space to be supported across a variety of platforms. It ++// also provides a name space that Java applications can deal with through ++// simple file apis. ++// ++// The solaris and linux implementations store the backing store file in ++// a user specific temporary directory located in the /tmp file system, ++// which is always a local file system and is sometimes a RAM based file ++// system. ++ ++// return the user specific temporary directory name. ++// ++// the caller is expected to free the allocated memory. ++// ++static char* get_user_tmp_dir(const char* user) { ++ ++ const char* tmpdir = os::get_temp_directory(); ++ const char* perfdir = PERFDATA_NAME; ++ size_t nbytes = strlen(tmpdir) + strlen(perfdir) + strlen(user) + 3; ++ char* dirname = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); ++ ++ // construct the path name to user specific tmp directory ++ snprintf(dirname, nbytes, "%s/%s_%s", tmpdir, perfdir, user); ++ ++ return dirname; ++} ++ ++// convert the given file name into a process id. if the file ++// does not meet the file naming constraints, return 0. ++// ++static pid_t filename_to_pid(const char* filename) { ++ ++ // a filename that doesn't begin with a digit is not a ++ // candidate for conversion. ++ // ++ if (!isdigit(*filename)) { ++ return 0; ++ } ++ ++ // check if file name can be converted to an integer without ++ // any leftover characters. ++ // ++ char* remainder = NULL; ++ errno = 0; ++ pid_t pid = (pid_t)strtol(filename, &remainder, 10); ++ ++ if (errno != 0) { ++ return 0; ++ } ++ ++ // check for left over characters. If any, then the filename is ++ // not a candidate for conversion. ++ // ++ if (remainder != NULL && *remainder != '\0') { ++ return 0; ++ } ++ ++ // successful conversion, return the pid ++ return pid; ++} ++ ++ ++// check if the given path is considered a secure directory for ++// the backing store files. Returns true if the directory exists ++// and is considered a secure location. Returns false if the path ++// is a symbolic link or if an error occurred. ++// ++static bool is_directory_secure(const char* path) { ++ struct stat statbuf; ++ int result = 0; ++ ++ RESTARTABLE(::lstat(path, &statbuf), result); ++ if (result == OS_ERR) { ++ return false; ++ } ++ ++ // the path exists, now check it's mode ++ if (S_ISLNK(statbuf.st_mode) || !S_ISDIR(statbuf.st_mode)) { ++ // the path represents a link or some non-directory file type, ++ // which is not what we expected. declare it insecure. ++ // ++ return false; ++ } ++ else { ++ // we have an existing directory, check if the permissions are safe. ++ // ++ if ((statbuf.st_mode & (S_IWGRP|S_IWOTH)) != 0) { ++ // the directory is open for writing and could be subjected ++ // to a symlnk attack. declare it insecure. ++ // ++ return false; ++ } ++ } ++ return true; ++} ++ ++ ++// return the user name for the given user id ++// ++// the caller is expected to free the allocated memory. ++// ++static char* get_user_name(uid_t uid) { ++ ++ struct passwd pwent; ++ ++ // determine the max pwbuf size from sysconf, and hardcode ++ // a default if this not available through sysconf. ++ // ++ long bufsize = sysconf(_SC_GETPW_R_SIZE_MAX); ++ if (bufsize == -1) ++ bufsize = 1024; ++ ++ char* pwbuf = NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); ++ ++ // POSIX interface to getpwuid_r is used on LINUX ++ struct passwd* p; ++ int result = getpwuid_r(uid, &pwent, pwbuf, (size_t)bufsize, &p); ++ ++ if (result != 0 || p == NULL || p->pw_name == NULL || *(p->pw_name) == '\0') { ++ if (PrintMiscellaneous && Verbose) { ++ if (result != 0) { ++ warning("Could not retrieve passwd entry: %s\n", ++ strerror(result)); ++ } ++ else if (p == NULL) { ++ // this check is added to protect against an observed problem ++ // with getpwuid_r() on RedHat 9 where getpwuid_r returns 0, ++ // indicating success, but has p == NULL. This was observed when ++ // inserting a file descriptor exhaustion fault prior to the call ++ // getpwuid_r() call. In this case, error is set to the appropriate ++ // error condition, but this is undocumented behavior. This check ++ // is safe under any condition, but the use of errno in the output ++ // message may result in an erroneous message. ++ // Bug Id 89052 was opened with RedHat. ++ // ++ warning("Could not retrieve passwd entry: %s\n", ++ strerror(errno)); ++ } ++ else { ++ warning("Could not determine user name: %s\n", ++ p->pw_name == NULL ? "pw_name = NULL" : ++ "pw_name zero length"); ++ } ++ } ++ FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal); ++ return NULL; ++ } ++ ++ char* user_name = NEW_C_HEAP_ARRAY(char, strlen(p->pw_name) + 1, mtInternal); ++ strcpy(user_name, p->pw_name); ++ ++ FREE_C_HEAP_ARRAY(char, pwbuf, mtInternal); ++ return user_name; ++} ++ ++// return the name of the user that owns the process identified by vmid. ++// ++// This method uses a slow directory search algorithm to find the backing ++// store file for the specified vmid and returns the user name, as determined ++// by the user name suffix of the hsperfdata_ directory name. ++// ++// the caller is expected to free the allocated memory. ++// ++static char* get_user_name_slow(int vmid, TRAPS) { ++ ++ // short circuit the directory search if the process doesn't even exist. ++ if (kill(vmid, 0) == OS_ERR) { ++ if (errno == ESRCH) { ++ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), ++ "Process not found"); ++ } ++ else /* EPERM */ { ++ THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); ++ } ++ } ++ ++ // directory search ++ char* oldest_user = NULL; ++ time_t oldest_ctime = 0; ++ ++ const char* tmpdirname = os::get_temp_directory(); ++ ++ DIR* tmpdirp = os::opendir(tmpdirname); ++ ++ if (tmpdirp == NULL) { ++ return NULL; ++ } ++ ++ // for each entry in the directory that matches the pattern hsperfdata_*, ++ // open the directory and check if the file for the given vmid exists. ++ // The file with the expected name and the latest creation date is used ++ // to determine the user name for the process id. ++ // ++ struct dirent* dentry; ++ char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(tmpdirname), mtInternal); ++ errno = 0; ++ while ((dentry = os::readdir(tmpdirp, (struct dirent *)tdbuf)) != NULL) { ++ ++ // check if the directory entry is a hsperfdata file ++ if (strncmp(dentry->d_name, PERFDATA_NAME, strlen(PERFDATA_NAME)) != 0) { ++ continue; ++ } ++ ++ char* usrdir_name = NEW_C_HEAP_ARRAY(char, ++ strlen(tmpdirname) + strlen(dentry->d_name) + 2, mtInternal); ++ strcpy(usrdir_name, tmpdirname); ++ strcat(usrdir_name, "/"); ++ strcat(usrdir_name, dentry->d_name); ++ ++ DIR* subdirp = os::opendir(usrdir_name); ++ ++ if (subdirp == NULL) { ++ FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); ++ continue; ++ } ++ ++ // Since we don't create the backing store files in directories ++ // pointed to by symbolic links, we also don't follow them when ++ // looking for the files. We check for a symbolic link after the ++ // call to opendir in order to eliminate a small window where the ++ // symlink can be exploited. ++ // ++ if (!is_directory_secure(usrdir_name)) { ++ FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); ++ os::closedir(subdirp); ++ continue; ++ } ++ ++ struct dirent* udentry; ++ char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal); ++ errno = 0; ++ while ((udentry = os::readdir(subdirp, (struct dirent *)udbuf)) != NULL) { ++ ++ if (filename_to_pid(udentry->d_name) == vmid) { ++ struct stat statbuf; ++ int result; ++ ++ char* filename = NEW_C_HEAP_ARRAY(char, ++ strlen(usrdir_name) + strlen(udentry->d_name) + 2, mtInternal); ++ ++ strcpy(filename, usrdir_name); ++ strcat(filename, "/"); ++ strcat(filename, udentry->d_name); ++ ++ // don't follow symbolic links for the file ++ RESTARTABLE(::lstat(filename, &statbuf), result); ++ if (result == OS_ERR) { ++ FREE_C_HEAP_ARRAY(char, filename, mtInternal); ++ continue; ++ } ++ ++ // skip over files that are not regular files. ++ if (!S_ISREG(statbuf.st_mode)) { ++ FREE_C_HEAP_ARRAY(char, filename, mtInternal); ++ continue; ++ } ++ ++ // compare and save filename with latest creation time ++ if (statbuf.st_size > 0 && statbuf.st_ctime > oldest_ctime) { ++ ++ if (statbuf.st_ctime > oldest_ctime) { ++ char* user = strchr(dentry->d_name, '_') + 1; ++ ++ if (oldest_user != NULL) FREE_C_HEAP_ARRAY(char, oldest_user, mtInternal); ++ oldest_user = NEW_C_HEAP_ARRAY(char, strlen(user)+1, mtInternal); ++ ++ strcpy(oldest_user, user); ++ oldest_ctime = statbuf.st_ctime; ++ } ++ } ++ ++ FREE_C_HEAP_ARRAY(char, filename, mtInternal); ++ } ++ } ++ os::closedir(subdirp); ++ FREE_C_HEAP_ARRAY(char, udbuf, mtInternal); ++ FREE_C_HEAP_ARRAY(char, usrdir_name, mtInternal); ++ } ++ os::closedir(tmpdirp); ++ FREE_C_HEAP_ARRAY(char, tdbuf, mtInternal); ++ ++ return(oldest_user); ++} ++ ++// return the name of the user that owns the JVM indicated by the given vmid. ++// ++static char* get_user_name(int vmid, TRAPS) { ++ return get_user_name_slow(vmid, CHECK_NULL); ++} ++ ++// return the file name of the backing store file for the named ++// shared memory region for the given user name and vmid. ++// ++// the caller is expected to free the allocated memory. ++// ++static char* get_sharedmem_filename(const char* dirname, int vmid) { ++ ++ // add 2 for the file separator and a null terminator. ++ size_t nbytes = strlen(dirname) + UINT_CHARS + 2; ++ ++ char* name = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); ++ snprintf(name, nbytes, "%s/%d", dirname, vmid); ++ ++ return name; ++} ++ ++ ++// remove file ++// ++// this method removes the file specified by the given path ++// ++static void remove_file(const char* path) { ++ ++ int result; ++ ++ // if the file is a directory, the following unlink will fail. since ++ // we don't expect to find directories in the user temp directory, we ++ // won't try to handle this situation. even if accidentially or ++ // maliciously planted, the directory's presence won't hurt anything. ++ // ++ RESTARTABLE(::unlink(path), result); ++ if (PrintMiscellaneous && Verbose && result == OS_ERR) { ++ if (errno != ENOENT) { ++ warning("Could not unlink shared memory backing" ++ " store file %s : %s\n", path, strerror(errno)); ++ } ++ } ++} ++ ++ ++// remove file ++// ++// this method removes the file with the given file name in the ++// named directory. ++// ++static void remove_file(const char* dirname, const char* filename) { ++ ++ size_t nbytes = strlen(dirname) + strlen(filename) + 2; ++ char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal); ++ ++ strcpy(path, dirname); ++ strcat(path, "/"); ++ strcat(path, filename); ++ ++ remove_file(path); ++ ++ FREE_C_HEAP_ARRAY(char, path, mtInternal); ++} ++ ++ ++// cleanup stale shared memory resources ++// ++// This method attempts to remove all stale shared memory files in ++// the named user temporary directory. It scans the named directory ++// for files matching the pattern ^$[0-9]*$. For each file found, the ++// process id is extracted from the file name and a test is run to ++// determine if the process is alive. If the process is not alive, ++// any stale file resources are removed. ++// ++static void cleanup_sharedmem_resources(const char* dirname) { ++ ++ // open the user temp directory ++ DIR* dirp = os::opendir(dirname); ++ ++ if (dirp == NULL) { ++ // directory doesn't exist, so there is nothing to cleanup ++ return; ++ } ++ ++ if (!is_directory_secure(dirname)) { ++ // the directory is not a secure directory ++ return; ++ } ++ ++ // for each entry in the directory that matches the expected file ++ // name pattern, determine if the file resources are stale and if ++ // so, remove the file resources. Note, instrumented HotSpot processes ++ // for this user may start and/or terminate during this search and ++ // remove or create new files in this directory. The behavior of this ++ // loop under these conditions is dependent upon the implementation of ++ // opendir/readdir. ++ // ++ struct dirent* entry; ++ char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal); ++ errno = 0; ++ while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) { ++ ++ pid_t pid = filename_to_pid(entry->d_name); ++ ++ if (pid == 0) { ++ ++ if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { ++ ++ // attempt to remove all unexpected files, except "." and ".." ++ remove_file(dirname, entry->d_name); ++ } ++ ++ errno = 0; ++ continue; ++ } ++ ++ // we now have a file name that converts to a valid integer ++ // that could represent a process id . if this process id ++ // matches the current process id or the process is not running, ++ // then remove the stale file resources. ++ // ++ // process liveness is detected by sending signal number 0 to ++ // the process id (see kill(2)). if kill determines that the ++ // process does not exist, then the file resources are removed. ++ // if kill determines that that we don't have permission to ++ // signal the process, then the file resources are assumed to ++ // be stale and are removed because the resources for such a ++ // process should be in a different user specific directory. ++ // ++ if ((pid == os::current_process_id()) || ++ (kill(pid, 0) == OS_ERR && (errno == ESRCH || errno == EPERM))) { ++ ++ remove_file(dirname, entry->d_name); ++ } ++ errno = 0; ++ } ++ os::closedir(dirp); ++ FREE_C_HEAP_ARRAY(char, dbuf, mtInternal); ++} ++ ++// make the user specific temporary directory. Returns true if ++// the directory exists and is secure upon return. Returns false ++// if the directory exists but is either a symlink, is otherwise ++// insecure, or if an error occurred. ++// ++static bool make_user_tmp_dir(const char* dirname) { ++ ++ // create the directory with 0755 permissions. note that the directory ++ // will be owned by euid::egid, which may not be the same as uid::gid. ++ // ++ if (mkdir(dirname, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) == OS_ERR) { ++ if (errno == EEXIST) { ++ // The directory already exists and was probably created by another ++ // JVM instance. However, this could also be the result of a ++ // deliberate symlink. Verify that the existing directory is safe. ++ // ++ if (!is_directory_secure(dirname)) { ++ // directory is not secure ++ if (PrintMiscellaneous && Verbose) { ++ warning("%s directory is insecure\n", dirname); ++ } ++ return false; ++ } ++ } ++ else { ++ // we encountered some other failure while attempting ++ // to create the directory ++ // ++ if (PrintMiscellaneous && Verbose) { ++ warning("could not create directory %s: %s\n", ++ dirname, strerror(errno)); ++ } ++ return false; ++ } ++ } ++ return true; ++} ++ ++// create the shared memory file resources ++// ++// This method creates the shared memory file with the given size ++// This method also creates the user specific temporary directory, if ++// it does not yet exist. ++// ++static int create_sharedmem_resources(const char* dirname, const char* filename, size_t size) { ++ ++ // make the user temporary directory ++ if (!make_user_tmp_dir(dirname)) { ++ // could not make/find the directory or the found directory ++ // was not secure ++ return -1; ++ } ++ ++ int result; ++ ++ RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("could not create file %s: %s\n", filename, strerror(errno)); ++ } ++ return -1; ++ } ++ ++ // save the file descriptor ++ int fd = result; ++ ++ // set the file size ++ RESTARTABLE(::ftruncate(fd, (off_t)size), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("could not set shared memory file size: %s\n", strerror(errno)); ++ } ++ RESTARTABLE(::close(fd), result); ++ return -1; ++ } ++ ++ return fd; ++} ++ ++// open the shared memory file for the given user and vmid. returns ++// the file descriptor for the open file or -1 if the file could not ++// be opened. ++// ++static int open_sharedmem_file(const char* filename, int oflags, TRAPS) { ++ ++ // open the file ++ int result; ++ RESTARTABLE(::open(filename, oflags), result); ++ if (result == OS_ERR) { ++ if (errno == ENOENT) { ++ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), ++ "Process not found"); ++ } ++ else if (errno == EACCES) { ++ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), ++ "Permission denied"); ++ } ++ else { ++ THROW_MSG_0(vmSymbols::java_io_IOException(), strerror(errno)); ++ } ++ } ++ ++ return result; ++} ++ ++// create a named shared memory region. returns the address of the ++// memory region on success or NULL on failure. A return value of ++// NULL will ultimately disable the shared memory feature. ++// ++// On Solaris and Linux, the name space for shared memory objects ++// is the file system name space. ++// ++// A monitoring application attaching to a JVM does not need to know ++// the file system name of the shared memory object. However, it may ++// be convenient for applications to discover the existence of newly ++// created and terminating JVMs by watching the file system name space ++// for files being created or removed. ++// ++static char* mmap_create_shared(size_t size) { ++ ++ int result; ++ int fd; ++ char* mapAddress; ++ ++ int vmid = os::current_process_id(); ++ ++ char* user_name = get_user_name(geteuid()); ++ ++ if (user_name == NULL) ++ return NULL; ++ ++ char* dirname = get_user_tmp_dir(user_name); ++ char* filename = get_sharedmem_filename(dirname, vmid); ++ ++ // cleanup any stale shared memory files ++ cleanup_sharedmem_resources(dirname); ++ ++ assert(((size > 0) && (size % os::vm_page_size() == 0)), ++ "unexpected PerfMemory region size"); ++ ++ fd = create_sharedmem_resources(dirname, filename, size); ++ ++ FREE_C_HEAP_ARRAY(char, user_name, mtInternal); ++ FREE_C_HEAP_ARRAY(char, dirname, mtInternal); ++ ++ if (fd == -1) { ++ FREE_C_HEAP_ARRAY(char, filename, mtInternal); ++ return NULL; ++ } ++ ++ mapAddress = (char*)::mmap((char*)0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); ++ ++ // attempt to close the file - restart it if it was interrupted, ++ // but ignore other failures ++ RESTARTABLE(::close(fd), result); ++ assert(result != OS_ERR, "could not close file"); ++ ++ if (mapAddress == MAP_FAILED) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("mmap failed - %s\n", strerror(errno)); ++ } ++ remove_file(filename); ++ FREE_C_HEAP_ARRAY(char, filename, mtInternal); ++ return NULL; ++ } ++ ++ // save the file name for use in delete_shared_memory() ++ backing_store_file_name = filename; ++ ++ // clear the shared memory region ++ (void)::memset((void*) mapAddress, 0, size); ++ ++ return mapAddress; ++} ++ ++// release a named shared memory region ++// ++static void unmap_shared(char* addr, size_t bytes) { ++ // Do not rely on os::reserve_memory/os::release_memory to use mmap. ++ // Use os::reserve_memory/os::release_memory for PerfDisableSharedMem=1, mmap/munmap for PerfDisableSharedMem=0 ++ if (::munmap(addr, bytes) == -1) { ++ warning("perfmemory: munmap failed (%d)\n", errno); ++ } ++} ++ ++// create the PerfData memory region in shared memory. ++// ++static char* create_shared_memory(size_t size) { ++ ++ // create the shared memory region. ++ return mmap_create_shared(size); ++} ++ ++// delete the shared PerfData memory region ++// ++static void delete_shared_memory(char* addr, size_t size) { ++ ++ // cleanup the persistent shared memory resources. since DestroyJavaVM does ++ // not support unloading of the JVM, unmapping of the memory resource is ++ // not performed. The memory will be reclaimed by the OS upon termination of ++ // the process. The backing store file is deleted from the file system. ++ ++ assert(!PerfDisableSharedMem, "shouldn't be here"); ++ ++ if (backing_store_file_name != NULL) { ++ remove_file(backing_store_file_name); ++ // Don't.. Free heap memory could deadlock os::abort() if it is called ++ // from signal handler. OS will reclaim the heap memory. ++ // FREE_C_HEAP_ARRAY(char, backing_store_file_name, mtInternal); ++ backing_store_file_name = NULL; ++ } ++} ++ ++// return the size of the file for the given file descriptor ++// or 0 if it is not a valid size for a shared memory file ++// ++static size_t sharedmem_filesize(int fd, TRAPS) { ++ ++ struct stat statbuf; ++ int result; ++ ++ RESTARTABLE(::fstat(fd, &statbuf), result); ++ if (result == OS_ERR) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("fstat failed: %s\n", strerror(errno)); ++ } ++ THROW_MSG_0(vmSymbols::java_io_IOException(), ++ "Could not determine PerfMemory size"); ++ } ++ ++ if ((statbuf.st_size == 0) || ++ ((size_t)statbuf.st_size % os::vm_page_size() != 0)) { ++ THROW_MSG_0(vmSymbols::java_lang_Exception(), ++ "Invalid PerfMemory size"); ++ } ++ ++ return (size_t)statbuf.st_size; ++} ++ ++// attach to a named shared memory region. ++// ++static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemoryMode mode, char** addr, size_t* sizep, TRAPS) { ++ ++ char* mapAddress; ++ int result; ++ int fd; ++ size_t size; ++ const char* luser = NULL; ++ ++ int mmap_prot; ++ int file_flags; ++ ++ ResourceMark rm; ++ ++ // map the high level access mode to the appropriate permission ++ // constructs for the file and the shared memory mapping. ++ if (mode == PerfMemory::PERF_MODE_RO) { ++ mmap_prot = PROT_READ; ++ file_flags = O_RDONLY; ++ } ++ else if (mode == PerfMemory::PERF_MODE_RW) { ++#ifdef LATER ++ mmap_prot = PROT_READ | PROT_WRITE; ++ file_flags = O_RDWR; ++#else ++ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), ++ "Unsupported access mode"); ++#endif ++ } ++ else { ++ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), ++ "Illegal access mode"); ++ } ++ ++ if (user == NULL || strlen(user) == 0) { ++ luser = get_user_name(vmid, CHECK); ++ } ++ else { ++ luser = user; ++ } ++ ++ if (luser == NULL) { ++ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), ++ "Could not map vmid to user Name"); ++ } ++ ++ char* dirname = get_user_tmp_dir(luser); ++ ++ // since we don't follow symbolic links when creating the backing ++ // store file, we don't follow them when attaching either. ++ // ++ if (!is_directory_secure(dirname)) { ++ FREE_C_HEAP_ARRAY(char, dirname, mtInternal); ++ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), ++ "Process not found"); ++ } ++ ++ char* filename = get_sharedmem_filename(dirname, vmid); ++ ++ // copy heap memory to resource memory. the open_sharedmem_file ++ // method below need to use the filename, but could throw an ++ // exception. using a resource array prevents the leak that ++ // would otherwise occur. ++ char* rfilename = NEW_RESOURCE_ARRAY(char, strlen(filename) + 1); ++ strcpy(rfilename, filename); ++ ++ // free the c heap resources that are no longer needed ++ if (luser != user) FREE_C_HEAP_ARRAY(char, luser, mtInternal); ++ FREE_C_HEAP_ARRAY(char, dirname, mtInternal); ++ FREE_C_HEAP_ARRAY(char, filename, mtInternal); ++ ++ // open the shared memory file for the give vmid ++ fd = open_sharedmem_file(rfilename, file_flags, CHECK); ++ assert(fd != OS_ERR, "unexpected value"); ++ ++ if (*sizep == 0) { ++ size = sharedmem_filesize(fd, CHECK); ++ assert(size != 0, "unexpected size"); ++ } else { ++ size = *sizep; ++ } ++ ++ mapAddress = (char*)::mmap((char*)0, size, mmap_prot, MAP_SHARED, fd, 0); ++ ++ // attempt to close the file - restart if it gets interrupted, ++ // but ignore other failures ++ RESTARTABLE(::close(fd), result); ++ assert(result != OS_ERR, "could not close file"); ++ ++ if (mapAddress == MAP_FAILED) { ++ if (PrintMiscellaneous && Verbose) { ++ warning("mmap failed: %s\n", strerror(errno)); ++ } ++ THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(), ++ "Could not map PerfMemory"); ++ } ++ ++ *addr = mapAddress; ++ *sizep = size; ++ ++ if (PerfTraceMemOps) { ++ tty->print("mapped " SIZE_FORMAT " bytes for vmid %d at " ++ INTPTR_FORMAT "\n", size, vmid, (void*)mapAddress); ++ } ++} ++ ++ ++ ++ ++// create the PerfData memory region ++// ++// This method creates the memory region used to store performance ++// data for the JVM. The memory may be created in standard or ++// shared memory. ++// ++void PerfMemory::create_memory_region(size_t size) { ++ ++ if (PerfDisableSharedMem) { ++ // do not share the memory for the performance data. ++ _start = create_standard_memory(size); ++ } ++ else { ++ _start = create_shared_memory(size); ++ if (_start == NULL) { ++ ++ // creation of the shared memory region failed, attempt ++ // to create a contiguous, non-shared memory region instead. ++ // ++ if (PrintMiscellaneous && Verbose) { ++ warning("Reverting to non-shared PerfMemory region.\n"); ++ } ++ PerfDisableSharedMem = true; ++ _start = create_standard_memory(size); ++ } ++ } ++ ++ if (_start != NULL) _capacity = size; ++ ++} ++ ++// delete the PerfData memory region ++// ++// This method deletes the memory region used to store performance ++// data for the JVM. The memory region indicated by the ++// tuple will be inaccessible after a call to this method. ++// ++void PerfMemory::delete_memory_region() { ++ ++ assert((start() != NULL && capacity() > 0), "verify proper state"); ++ ++ // If user specifies PerfDataSaveFile, it will save the performance data ++ // to the specified file name no matter whether PerfDataSaveToFile is specified ++ // or not. In other word, -XX:PerfDataSaveFile=.. overrides flag ++ // -XX:+PerfDataSaveToFile. ++ if (PerfDataSaveToFile || PerfDataSaveFile != NULL) { ++ save_memory_to_file(start(), capacity()); ++ } ++ ++ if (PerfDisableSharedMem) { ++ delete_standard_memory(start(), capacity()); ++ } ++ else { ++ delete_shared_memory(start(), capacity()); ++ } ++} ++ ++// attach to the PerfData memory region for another JVM ++// ++// This method returns an tuple that points to ++// a memory buffer that is kept reasonably synchronized with ++// the PerfData memory region for the indicated JVM. This ++// buffer may be kept in synchronization via shared memory ++// or some other mechanism that keeps the buffer updated. ++// ++// If the JVM chooses not to support the attachability feature, ++// this method should throw an UnsupportedOperation exception. ++// ++// This implementation utilizes named shared memory to map ++// the indicated process's PerfData memory region into this JVMs ++// address space. ++// ++void PerfMemory::attach(const char* user, int vmid, PerfMemoryMode mode, char** addrp, size_t* sizep, TRAPS) { ++ ++ if (vmid == 0 || vmid == os::current_process_id()) { ++ *addrp = start(); ++ *sizep = capacity(); ++ return; ++ } ++ ++ mmap_attach_shared(user, vmid, mode, addrp, sizep, CHECK); ++} ++ ++// detach from the PerfData memory region of another JVM ++// ++// This method detaches the PerfData memory region of another ++// JVM, specified as an tuple of a buffer ++// in this process's address space. This method may perform ++// arbitrary actions to accomplish the detachment. The memory ++// region specified by will be inaccessible after ++// a call to this method. ++// ++// If the JVM chooses not to support the attachability feature, ++// this method should throw an UnsupportedOperation exception. ++// ++// This implementation utilizes named shared memory to detach ++// the indicated process's PerfData memory region from this ++// process's address space. ++// ++void PerfMemory::detach(char* addr, size_t bytes, TRAPS) { ++ ++ assert(addr != 0, "address sanity check"); ++ assert(bytes > 0, "capacity sanity check"); ++ ++ if (PerfMemory::contains(addr) || PerfMemory::contains(addr + bytes - 1)) { ++ // prevent accidental detachment of this process's PerfMemory region ++ return; ++ } ++ ++ unmap_shared(addr, bytes); ++} ++ ++char* PerfMemory::backing_store_filename() { ++ return backing_store_file_name; ++} +--- ./hotspot/src/os/aix/vm/porting_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/porting_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,367 @@ ++/* ++ * Copyright 2012, 2013 SAP AG. 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 "asm/assembler.hpp" ++#include "loadlib_aix.hpp" ++#include "porting_aix.hpp" ++#include "utilities/debug.hpp" ++ ++#include ++#include ++ ++////////////////////////////////// ++// Provide implementation for dladdr based on LoadedLibraries pool and ++// traceback table scan (see getFuncName). ++ ++// Search traceback table in stack, ++// return procedure name from trace back table. ++#define MAX_FUNC_SEARCH_LEN 0x10000 ++// Any PC below this value is considered toast. ++#define MINIMUM_VALUE_FOR_PC ((unsigned int*)0x1024) ++ ++#define PTRDIFF_BYTES(p1,p2) (((ptrdiff_t)p1) - ((ptrdiff_t)p2)) ++ ++// Align a pointer without having to cast. ++inline char* align_ptr_up(char* ptr, intptr_t alignment) { ++ return (char*) align_size_up((intptr_t)ptr, alignment); ++} ++ ++// Trace if verbose to tty. ++// I use these now instead of the Xtrace system because the latter is ++// not available at init time, hence worthless. Until we fix this, all ++// tracing here is done with -XX:+Verbose. ++#define trcVerbose(fmt, ...) { \ ++ if (Verbose) { \ ++ fprintf(stderr, fmt, ##__VA_ARGS__); \ ++ fputc('\n', stderr); fflush(stderr); \ ++ } \ ++} ++#define ERRBYE(s) { trcVerbose(s); return -1; } ++ ++// Unfortunately, the interface of dladdr makes the implementator ++// responsible for maintaining memory for function name/library ++// name. I guess this is because most OS's keep those values as part ++// of the mapped executable image ready to use. On AIX, this doesn't ++// work, so I have to keep the returned strings. For now, I do this in ++// a primitive string map. Should this turn out to be a performance ++// problem, a better hashmap has to be used. ++class fixed_strings { ++ struct node { ++ char* v; ++ node* next; ++ }; ++ ++ node* first; ++ ++ public: ++ ++ fixed_strings() : first(0) {} ++ ~fixed_strings() { ++ node* n = first; ++ while (n) { ++ node* p = n; ++ n = n->next; ++ free(p->v); ++ delete p; ++ } ++ } ++ ++ char* intern(const char* s) { ++ for (node* n = first; n; n = n->next) { ++ if (strcmp(n->v, s) == 0) { ++ return n->v; ++ } ++ } ++ node* p = new node; ++ p->v = strdup(s); ++ p->next = first; ++ first = p; ++ return p->v; ++ } ++}; ++ ++static fixed_strings dladdr_fixed_strings; ++ ++// Given a code pointer, returns the function name and the displacement. ++// Function looks for the traceback table at the end of the function. ++extern "C" int getFuncName( ++ codeptr_t pc, // [in] program counter ++ char* p_name, size_t namelen, // [out] optional: function name ("" if not available) ++ int* p_displacement, // [out] optional: displacement (-1 if not available) ++ const struct tbtable** p_tb, // [out] optional: ptr to traceback table to get further ++ // information (NULL if not available) ++ char* p_errmsg, size_t errmsglen // [out] optional: user provided buffer for error messages ++ ) { ++ struct tbtable* tb = 0; ++ unsigned int searchcount = 0; ++ ++ // initialize output parameters ++ if (p_name && namelen > 0) { ++ *p_name = '\0'; ++ } ++ if (p_errmsg && errmsglen > 0) { ++ *p_errmsg = '\0'; ++ } ++ if (p_displacement) { ++ *p_displacement = -1; ++ } ++ if (p_tb) { ++ *p_tb = NULL; ++ } ++ ++ // weed out obvious bogus states ++ if (pc < MINIMUM_VALUE_FOR_PC) { ++ ERRBYE("invalid program counter"); ++ } ++ ++ codeptr_t pc2 = pc; ++ ++ // make sure the pointer is word aligned. ++ pc2 = (codeptr_t) align_ptr_up((char*)pc2, 4); ++ ++ // Find start of traceback table. ++ // (starts after code, is marked by word-aligned (32bit) zeros) ++ while ((*pc2 != NULL) && (searchcount++ < MAX_FUNC_SEARCH_LEN)) { ++ pc2++; ++ } ++ if (*pc2 != 0) { ++ ERRBYE("could not find traceback table within 5000 bytes of program counter"); ++ } ++ // ++ // Set up addressability to the traceback table ++ // ++ tb = (struct tbtable*) (pc2 + 1); ++ ++ // Is this really a traceback table? No way to be sure but ++ // some indicators we can check. ++ if (tb->tb.lang >= 0xf && tb->tb.lang <= 0xfb) { ++ // Language specifiers, go from 0 (C) to 14 (Objective C). ++ // According to spec, 0xf-0xfa reserved, 0xfb-0xff reserved for ibm. ++ ERRBYE("not a traceback table"); ++ } ++ ++ // Existence of fields in the tbtable extension are contingent upon ++ // specific fields in the base table. Check for their existence so ++ // that we can address the function name if it exists. ++ pc2 = (codeptr_t) tb + ++ sizeof(struct tbtable_short)/sizeof(int); ++ if (tb->tb.fixedparms != 0 || tb->tb.floatparms != 0) ++ pc2++; ++ ++ if (tb->tb.has_tboff == TRUE) { ++ ++ // I want to know the displacement ++ const unsigned int tb_offset = *pc2; ++ codeptr_t start_of_procedure = ++ (codeptr_t)(((char*)tb) - 4 - tb_offset); // (-4 to omit leading 0000) ++ ++ // Weed out the cases where we did find the wrong traceback table. ++ if (pc < start_of_procedure) { ++ ERRBYE("could not find (the real) traceback table within 5000 bytes of program counter"); ++ } ++ ++ // return the displacement ++ if (p_displacement) { ++ (*p_displacement) = (int) PTRDIFF_BYTES(pc, start_of_procedure); ++ } ++ ++ pc2++; ++ } else { ++ // return -1 for displacement ++ if (p_displacement) { ++ (*p_displacement) = -1; ++ } ++ } ++ ++ if (tb->tb.int_hndl == TRUE) ++ pc2++; ++ ++ if (tb->tb.has_ctl == TRUE) ++ pc2 += (*pc2) + 1; // don't care ++ ++ // ++ // return function name if it exists. ++ // ++ if (p_name && namelen > 0) { ++ if (tb->tb.name_present) { ++ char buf[256]; ++ const short l = MIN2(*((short*)pc2), sizeof(buf) - 1); ++ memcpy(buf, (char*)pc2 + sizeof(short), l); ++ buf[l] = '\0'; ++ ++ p_name[0] = '\0'; ++ ++ // If it is a C++ name, try and demangle it using the Demangle interface (see demangle.h). ++ char* rest; ++ Name* const name = Demangle(buf, rest); ++ if (name) { ++ const char* const demangled_name = name->Text(); ++ if (demangled_name) { ++ strncpy(p_name, demangled_name, namelen-1); ++ p_name[namelen-1] = '\0'; ++ } ++ delete name; ++ } ++ ++ // Fallback: if demangling did not work, just provide the unmangled name. ++ if (p_name[0] == '\0') { ++ strncpy(p_name, buf, namelen-1); ++ p_name[namelen-1] = '\0'; ++ } ++ ++ } else { ++ strncpy(p_name, "", namelen-1); ++ p_name[namelen-1] = '\0'; ++ } ++ } ++ // Return traceback table, if user wants it. ++ if (p_tb) { ++ (*p_tb) = tb; ++ } ++ ++ return 0; ++} ++ ++// Special implementation of dladdr for Aix based on LoadedLibraries ++// Note: dladdr returns non-zero for ok, 0 for error! ++// Note: dladdr is not posix, but a non-standard GNU extension. So this tries to ++// fulfill the contract of dladdr on Linux (see http://linux.die.net/man/3/dladdr) ++// Note: addr may be both an AIX function descriptor or a real code pointer ++// to the entry of a function. ++extern "C" ++int dladdr(void* addr, Dl_info* info) { ++ ++ if (!addr) { ++ return 0; ++ } ++ ++ assert(info, ""); ++ ++ int rc = 0; ++ ++ const char* const ZEROSTRING = ""; ++ ++ // Always return a string, even if a "" one. Linux dladdr manpage ++ // does not say anything about returning NULL ++ info->dli_fname = ZEROSTRING; ++ info->dli_sname = ZEROSTRING; ++ info->dli_saddr = NULL; ++ ++ address p = (address) addr; ++ const LoadedLibraryModule* lib = NULL; ++ ++ enum { noclue, code, data } type = noclue; ++ ++ trcVerbose("dladdr(%p)...", p); ++ ++ // Note: input address may be a function. I accept both a pointer to ++ // the entry of a function and a pointer to the function decriptor. ++ // (see ppc64 ABI) ++ lib = LoadedLibraries::find_for_text_address(p); ++ if (lib) { ++ type = code; ++ } ++ ++ if (!lib) { ++ // Not a pointer into any text segment. Is it a function descriptor? ++ const FunctionDescriptor* const pfd = (const FunctionDescriptor*) p; ++ p = pfd->entry(); ++ if (p) { ++ lib = LoadedLibraries::find_for_text_address(p); ++ if (lib) { ++ type = code; ++ } ++ } ++ } ++ ++ if (!lib) { ++ // Neither direct code pointer nor function descriptor. A data ptr? ++ p = (address)addr; ++ lib = LoadedLibraries::find_for_data_address(p); ++ if (lib) { ++ type = data; ++ } ++ } ++ ++ // If we did find the shared library this address belongs to (either ++ // code or data segment) resolve library path and, if possible, the ++ // symbol name. ++ if (lib) { ++ const char* const interned_libpath = ++ dladdr_fixed_strings.intern(lib->get_fullpath()); ++ if (interned_libpath) { ++ info->dli_fname = interned_libpath; ++ } ++ ++ if (type == code) { ++ ++ // For code symbols resolve function name and displacement. Use ++ // displacement to calc start of function. ++ char funcname[256] = ""; ++ int displacement = 0; ++ ++ if (getFuncName((codeptr_t) p, funcname, sizeof(funcname), &displacement, ++ NULL, NULL, 0) == 0) { ++ if (funcname[0] != '\0') { ++ const char* const interned = dladdr_fixed_strings.intern(funcname); ++ info->dli_sname = interned; ++ trcVerbose("... function name: %s ...", interned); ++ } ++ ++ // From the displacement calculate the start of the function. ++ if (displacement != -1) { ++ info->dli_saddr = p - displacement; ++ } else { ++ info->dli_saddr = p; ++ } ++ } else { ++ ++ // No traceback table found. Just assume the pointer is it. ++ info->dli_saddr = p; ++ ++ } ++ ++ } else if (type == data) { ++ ++ // For data symbols. ++ info->dli_saddr = p; ++ ++ } else { ++ ShouldNotReachHere(); ++ } ++ ++ rc = 1; // success: return 1 [sic] ++ ++ } ++ ++ // sanity checks. ++ if (rc) { ++ assert(info->dli_fname, ""); ++ assert(info->dli_sname, ""); ++ assert(info->dli_saddr, ""); ++ } ++ ++ return rc; // error: return 0 [sic] ++ ++} +--- ./hotspot/src/os/aix/vm/porting_aix.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/porting_aix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,81 @@ ++/* ++ * Copyright 2012, 2013 SAP AG. 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 ++ ++// Header file to contain porting-relevant code which does not have a ++// home anywhere else and which can not go into os_.h because ++// that header is included inside the os class definition, hence all ++// its content is part of the os class. ++ ++// Aix' own version of dladdr(). ++// This function tries to mimick dladdr(3) on Linux ++// (see http://linux.die.net/man/3/dladdr) ++// dladdr(3) is not POSIX but a GNU extension, and is not available on AIX. ++// ++// Differences between AIX dladdr and Linux dladdr: ++// ++// 1) Dl_info.dli_fbase: can never work, is disabled. ++// A loaded image on AIX is divided in multiple segments, at least two ++// (text and data) but potentially also far more. This is because the loader may ++// load each member into an own segment, as for instance happens with the libC.a ++// 2) Dl_info.dli_sname: This only works for code symbols (functions); for data, a ++// zero-length string is returned (""). ++// 3) Dl_info.dli_saddr: For code, this will return the entry point of the function, ++// not the function descriptor. ++ ++typedef struct { ++ const char *dli_fname; // file path of loaded library ++ // void *dli_fbase; ++ const char *dli_sname; // symbol name; "" if not known ++ void *dli_saddr; // address of *entry* of function; not function descriptor; ++} Dl_info; ++ ++// Note: we export this to use it inside J2se too ++#ifdef __cplusplus ++extern "C" ++#endif ++int dladdr(void *addr, Dl_info *info); ++ ++ ++// The semantics in this file are thus that codeptr_t is a *real code ptr*. ++// This means that any function taking codeptr_t as arguments will assume ++// a real codeptr and won't handle function descriptors (eg getFuncName), ++// whereas functions taking address as args will deal with function ++// descriptors (eg os::dll_address_to_library_name). ++typedef unsigned int* codeptr_t; ++ ++// helper function - given a program counter, tries to locate the traceback table and ++// returns info from it (like, most importantly, function name, displacement of the ++// pc inside the function, and the traceback table itself. ++#ifdef __cplusplus ++extern "C" ++#endif ++int getFuncName( ++ codeptr_t pc, // [in] program counter ++ char* p_name, size_t namelen, // [out] optional: user provided buffer for the function name ++ int* p_displacement, // [out] optional: displacement ++ const struct tbtable** p_tb, // [out] optional: ptr to traceback table to get further information ++ char* p_errmsg, size_t errmsglen // [out] optional: user provided buffer for error messages ++ ); +--- ./hotspot/src/os/aix/vm/threadCritical_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/threadCritical_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,68 @@ ++/* ++ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "runtime/threadCritical.hpp" ++#include "runtime/thread.inline.hpp" ++ ++// put OS-includes here ++# include ++ ++// ++// See threadCritical.hpp for details of this class. ++// ++ ++static pthread_t tc_owner = 0; ++static pthread_mutex_t tc_mutex = PTHREAD_MUTEX_INITIALIZER; ++static int tc_count = 0; ++ ++void ThreadCritical::initialize() { ++} ++ ++void ThreadCritical::release() { ++} ++ ++ThreadCritical::ThreadCritical() { ++ pthread_t self = pthread_self(); ++ if (self != tc_owner) { ++ int ret = pthread_mutex_lock(&tc_mutex); ++ guarantee(ret == 0, "fatal error with pthread_mutex_lock()"); ++ assert(tc_count == 0, "Lock acquired with illegal reentry count."); ++ tc_owner = self; ++ } ++ tc_count++; ++} ++ ++ThreadCritical::~ThreadCritical() { ++ assert(tc_owner == pthread_self(), "must have correct owner"); ++ assert(tc_count > 0, "must have correct count"); ++ ++ tc_count--; ++ if (tc_count == 0) { ++ tc_owner = 0; ++ int ret = pthread_mutex_unlock(&tc_mutex); ++ guarantee(ret == 0, "fatal error with pthread_mutex_unlock()"); ++ } ++} +--- ./hotspot/src/os/aix/vm/thread_aix.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/thread_aix.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,42 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_AIX_VM_THREAD_AIX_INLINE_HPP ++#define OS_AIX_VM_THREAD_AIX_INLINE_HPP ++ ++#include "runtime/atomic.hpp" ++#include "runtime/prefetch.hpp" ++#include "runtime/thread.hpp" ++#include "runtime/threadLocalStorage.hpp" ++ ++#include "atomic_aix_ppc.inline.hpp" ++#include "orderAccess_aix_ppc.inline.hpp" ++#include "prefetch_aix_ppc.inline.hpp" ++ ++// Contains inlined functions for class Thread and ThreadLocalStorage ++ ++inline void ThreadLocalStorage::pd_invalidate_all() {} // nothing to do ++ ++#endif // OS_AIX_VM_THREAD_AIX_INLINE_HPP +--- ./hotspot/src/os/aix/vm/vmError_aix.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/aix/vm/vmError_aix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,122 @@ ++/* ++ * Copyright (c) 2003, 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. ++ * ++ */ ++ ++#include "precompiled.hpp" ++#include "runtime/arguments.hpp" ++#include "runtime/os.hpp" ++#include "runtime/thread.hpp" ++#include "utilities/vmError.hpp" ++ ++#include ++#include ++#include ++#include ++ ++void VMError::show_message_box(char *buf, int buflen) { ++ bool yes; ++ do { ++ error_string(buf, buflen); ++ int len = (int)strlen(buf); ++ char *p = &buf[len]; ++ ++ jio_snprintf(p, buflen - len, ++ "\n\n" ++ "Do you want to debug the problem?\n\n" ++ "To debug, run 'dbx -a %d'; then switch to thread tid " INTX_FORMAT ", k-tid " INTX_FORMAT "\n" ++ "Enter 'yes' to launch dbx automatically (PATH must include dbx)\n" ++ "Otherwise, press RETURN to abort...", ++ os::current_process_id(), ++ os::current_thread_id(), thread_self()); ++ ++ yes = os::message_box("Unexpected Error", buf); ++ ++ if (yes) { ++ // yes, user asked VM to launch debugger ++ jio_snprintf(buf, buflen, "dbx -a %d", os::current_process_id()); ++ ++ os::fork_and_exec(buf); ++ yes = false; ++ } ++ } while (yes); ++} ++ ++// Handle all synchronous signals which may happen during signal handling, ++// not just SIGSEGV and SIGBUS. ++static const int SIGNALS[] = { SIGSEGV, SIGBUS, SIGILL, SIGFPE, SIGTRAP }; // add more if needed ++static const int NUM_SIGNALS = sizeof(SIGNALS) / sizeof(int); ++ ++// Space for our "saved" signal flags and handlers ++static int resettedSigflags[NUM_SIGNALS]; ++static address resettedSighandler[NUM_SIGNALS]; ++ ++static void save_signal(int idx, int sig) { ++ struct sigaction sa; ++ sigaction(sig, NULL, &sa); ++ resettedSigflags[idx] = sa.sa_flags; ++ resettedSighandler[idx] = (sa.sa_flags & SA_SIGINFO) ++ ? CAST_FROM_FN_PTR(address, sa.sa_sigaction) ++ : CAST_FROM_FN_PTR(address, sa.sa_handler); ++} ++ ++int VMError::get_resetted_sigflags(int sig) { ++ // Handle all program errors. ++ for (int i = 0; i < NUM_SIGNALS; i++) { ++ if (SIGNALS[i] == sig) { ++ return resettedSigflags[i]; ++ } ++ } ++ return -1; ++} ++ ++address VMError::get_resetted_sighandler(int sig) { ++ // Handle all program errors. ++ for (int i = 0; i < NUM_SIGNALS; i++) { ++ if (SIGNALS[i] == sig) { ++ return resettedSighandler[i]; ++ } ++ } ++ return NULL; ++} ++ ++static void crash_handler(int sig, siginfo_t* info, void* ucVoid) { ++ // Unmask current signal. ++ sigset_t newset; ++ sigemptyset(&newset); ++ sigaddset(&newset, sig); ++ ++ Unimplemented(); ++} ++ ++void VMError::reset_signal_handlers() { ++ sigset_t newset; ++ sigemptyset(&newset); ++ ++ for (int i = 0; i < NUM_SIGNALS; i++) { ++ save_signal(i, SIGNALS[i]); ++ os::signal(SIGNALS[i], CAST_FROM_FN_PTR(void *, crash_handler)); ++ sigaddset(&newset, SIGNALS[i]); ++ } ++ ++ sigthreadmask(SIG_UNBLOCK, &newset, NULL); ++} +--- ./hotspot/src/os/bsd/vm/decoder_machO.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/decoder_machO.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -53,7 +53,7 @@ + struct symtab_command * symt = (struct symtab_command *) + mach_find_command((struct mach_header_64 *)mach_base, LC_SYMTAB); + if (symt == NULL) { +- DEBUG_ONLY(tty->print_cr("no symtab in mach file at 0x%lx", mach_base)); ++ DEBUG_ONLY(tty->print_cr("no symtab in mach file at 0x%lx", p2i(mach_base))); + return false; + } + uint32_t off = symt->symoff; /* symbol table offset (within this mach file) */ +--- ./hotspot/src/os/bsd/vm/os_bsd.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/os_bsd.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -123,12 +123,19 @@ + #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) + + #define LARGEPAGES_BIT (1 << 6) ++ ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + //////////////////////////////////////////////////////////////////////////////// + // global variables + julong os::Bsd::_physical_memory = 0; + +- ++#ifdef __APPLE__ ++mach_timebase_info_data_t os::Bsd::_timebase_info = {0, 0}; ++volatile uint64_t os::Bsd::_max_abstime = 0; ++#else + int (*os::Bsd::_clock_gettime)(clockid_t, struct timespec *) = NULL; ++#endif + pthread_t os::Bsd::_main_thread; + int os::Bsd::_page_size = -1; + +@@ -219,7 +226,7 @@ + static char cpu_arch[] = "amd64"; + #elif defined(ARM) + static char cpu_arch[] = "arm"; +-#elif defined(PPC) ++#elif defined(PPC32) + static char cpu_arch[] = "ppc"; + #elif defined(SPARC) + # ifdef _LP64 +@@ -306,9 +313,6 @@ + #endif + + void os::init_system_properties_values() { +-// char arch[12]; +-// sysinfo(SI_ARCHITECTURE, arch, sizeof(arch)); +- + // The next steps are taken in the product version: + // + // Obtain the JAVA_HOME value from the location of libjvm.so. +@@ -335,199 +339,205 @@ + // Important note: if the location of libjvm.so changes this + // code needs to be changed accordingly. + +- // The next few definitions allow the code to be verbatim: +-#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal) +-#define getenv(n) ::getenv(n) +- +-/* +- * See ld(1): +- * The linker uses the following search paths to locate required +- * shared libraries: +- * 1: ... +- * ... +- * 7: The default directories, normally /lib and /usr/lib. +- */ ++// See ld(1): ++// The linker uses the following search paths to locate required ++// shared libraries: ++// 1: ... ++// ... ++// 7: The default directories, normally /lib and /usr/lib. + #ifndef DEFAULT_LIBPATH + #define DEFAULT_LIBPATH "/lib:/usr/lib" + #endif + ++// Base path of extensions installed on the system. ++#define SYS_EXT_DIR "/usr/java/packages" + #define EXTENSIONS_DIR "/lib/ext" + #define ENDORSED_DIR "/lib/endorsed" +-#define REG_DIR "/usr/java/packages" +- +-#ifdef __APPLE__ ++ ++#ifndef __APPLE__ ++ ++ // Buffer that fits several sprintfs. ++ // Note that the space for the colon and the trailing null are provided ++ // by the nulls included by the sizeof operator. ++ const size_t bufsize = ++ MAX3((size_t)MAXPATHLEN, // For dll_dir & friends. ++ (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR), // extensions dir ++ (size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir ++ char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); ++ ++ // sysclasspath, java_home, dll_dir ++ { ++ char *pslash; ++ os::jvm_path(buf, bufsize); ++ ++ // Found the full path to libjvm.so. ++ // Now cut the path to /jre if we can. ++ *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so. ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /{client|server|hotspot}. ++ } ++ Arguments::set_dll_dir(buf); ++ ++ if (pslash != NULL) { ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /. ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /lib. ++ } ++ } ++ } ++ Arguments::set_java_home(buf); ++ set_boot_path('/', ':'); ++ } ++ ++ // Where to look for native libraries. ++ // ++ // Note: Due to a legacy implementation, most of the library path ++ // is set in the launcher. This was to accomodate linking restrictions ++ // on legacy Bsd implementations (which are no longer supported). ++ // Eventually, all the library path setting will be done here. ++ // ++ // However, to prevent the proliferation of improperly built native ++ // libraries, the new path component /usr/java/packages is added here. ++ // Eventually, all the library path setting will be done here. ++ { ++ // Get the user setting of LD_LIBRARY_PATH, and prepended it. It ++ // should always exist (until the legacy problem cited above is ++ // addressed). ++ const char *v = ::getenv("LD_LIBRARY_PATH"); ++ const char *v_colon = ":"; ++ if (v == NULL) { v = ""; v_colon = ""; } ++ // That's +1 for the colon and +1 for the trailing '\0'. ++ char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, ++ strlen(v) + 1 + ++ sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH) + 1, ++ mtInternal); ++ sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch); ++ Arguments::set_library_path(ld_library_path); ++ FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal); ++ } ++ ++ // Extensions directories. ++ sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home()); ++ Arguments::set_ext_dirs(buf); ++ ++ // Endorsed standards default directory. ++ sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); ++ Arguments::set_endorsed_dirs(buf); ++ ++ FREE_C_HEAP_ARRAY(char, buf, mtInternal); ++ ++#else // __APPLE__ ++ + #define SYS_EXTENSIONS_DIR "/Library/Java/Extensions" + #define SYS_EXTENSIONS_DIRS SYS_EXTENSIONS_DIR ":/Network" SYS_EXTENSIONS_DIR ":/System" SYS_EXTENSIONS_DIR ":/usr/lib/java" +- const char *user_home_dir = get_home(); +- // the null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir +- int system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) + +- sizeof(SYS_EXTENSIONS_DIRS); +-#endif +- ++ ++ const char *user_home_dir = get_home(); ++ // The null in SYS_EXTENSIONS_DIRS counts for the size of the colon after user_home_dir. ++ size_t system_ext_size = strlen(user_home_dir) + sizeof(SYS_EXTENSIONS_DIR) + ++ sizeof(SYS_EXTENSIONS_DIRS); ++ ++ // Buffer that fits several sprintfs. ++ // Note that the space for the colon and the trailing null are provided ++ // by the nulls included by the sizeof operator. ++ const size_t bufsize = ++ MAX3((size_t)MAXPATHLEN, // for dll_dir & friends. ++ (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + system_ext_size, // extensions dir ++ (size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir ++ char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); ++ ++ // sysclasspath, java_home, dll_dir + { +- /* sysclasspath, java_home, dll_dir */ +- { +- char *home_path; +- char *dll_path; +- char *pslash; +- char buf[MAXPATHLEN]; +- os::jvm_path(buf, sizeof(buf)); +- +- // Found the full path to libjvm.so. +- // Now cut the path to /jre if we can. +- *(strrchr(buf, '/')) = '\0'; /* get rid of /libjvm.so */ +- pslash = strrchr(buf, '/'); +- if (pslash != NULL) +- *pslash = '\0'; /* get rid of /{client|server|hotspot} */ +- dll_path = malloc(strlen(buf) + 1); +- if (dll_path == NULL) +- return; +- strcpy(dll_path, buf); +- Arguments::set_dll_dir(dll_path); +- +- if (pslash != NULL) { +- pslash = strrchr(buf, '/'); +- if (pslash != NULL) { +- *pslash = '\0'; /* get rid of / (/lib on macosx) */ +-#ifndef __APPLE__ +- pslash = strrchr(buf, '/'); +- if (pslash != NULL) +- *pslash = '\0'; /* get rid of /lib */ +-#endif +- } +- } +- +- home_path = malloc(strlen(buf) + 1); +- if (home_path == NULL) +- return; +- strcpy(home_path, buf); +- Arguments::set_java_home(home_path); +- +- if (!set_boot_path('/', ':')) +- return; ++ char *pslash; ++ os::jvm_path(buf, bufsize); ++ ++ // Found the full path to libjvm.so. ++ // Now cut the path to /jre if we can. ++ *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so. ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /{client|server|hotspot}. + } +- +- /* +- * Where to look for native libraries +- * +- * Note: Due to a legacy implementation, most of the library path +- * is set in the launcher. This was to accomodate linking restrictions +- * on legacy Bsd implementations (which are no longer supported). +- * Eventually, all the library path setting will be done here. +- * +- * However, to prevent the proliferation of improperly built native +- * libraries, the new path component /usr/java/packages is added here. +- * Eventually, all the library path setting will be done here. +- */ +- { +- char *ld_library_path; +- +- /* +- * Construct the invariant part of ld_library_path. Note that the +- * space for the colon and the trailing null are provided by the +- * nulls included by the sizeof operator (so actually we allocate +- * a byte more than necessary). +- */ +-#ifdef __APPLE__ +- ld_library_path = (char *) malloc(system_ext_size); +- sprintf(ld_library_path, "%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, user_home_dir); +-#else +- ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") + +- strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH)); +- sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch); +-#endif +- +- /* +- * Get the user setting of LD_LIBRARY_PATH, and prepended it. It +- * should always exist (until the legacy problem cited above is +- * addressed). +- */ +-#ifdef __APPLE__ +- // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code can specify a directory inside an app wrapper +- char *l = getenv("JAVA_LIBRARY_PATH"); +- if (l != NULL) { +- char *t = ld_library_path; +- /* That's +1 for the colon and +1 for the trailing '\0' */ +- ld_library_path = (char *) malloc(strlen(l) + 1 + strlen(t) + 1); +- sprintf(ld_library_path, "%s:%s", l, t); +- free(t); +- } +- +- char *v = getenv("DYLD_LIBRARY_PATH"); +-#else +- char *v = getenv("LD_LIBRARY_PATH"); +-#endif +- if (v != NULL) { +- char *t = ld_library_path; +- /* That's +1 for the colon and +1 for the trailing '\0' */ +- ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1); +- sprintf(ld_library_path, "%s:%s", v, t); +- free(t); +- } +- +-#ifdef __APPLE__ +- // Apple's Java6 has "." at the beginning of java.library.path. +- // OpenJDK on Windows has "." at the end of java.library.path. +- // OpenJDK on Linux and Solaris don't have "." in java.library.path +- // at all. To ease the transition from Apple's Java6 to OpenJDK7, +- // "." is appended to the end of java.library.path. Yes, this +- // could cause a change in behavior, but Apple's Java6 behavior +- // can be achieved by putting "." at the beginning of the +- // JAVA_LIBRARY_PATH environment variable. +- { +- char *t = ld_library_path; +- // that's +3 for appending ":." and the trailing '\0' +- ld_library_path = (char *) malloc(strlen(t) + 3); +- sprintf(ld_library_path, "%s:%s", t, "."); +- free(t); +- } +-#endif +- +- Arguments::set_library_path(ld_library_path); ++ Arguments::set_dll_dir(buf); ++ ++ if (pslash != NULL) { ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /lib. ++ } + } +- +- /* +- * Extensions directories. +- * +- * Note that the space for the colon and the trailing null are provided +- * by the nulls included by the sizeof operator (so actually one byte more +- * than necessary is allocated). +- */ +- { +-#ifdef __APPLE__ +- char *buf = malloc(strlen(Arguments::get_java_home()) + +- sizeof(EXTENSIONS_DIR) + system_ext_size); +- sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":" +- SYS_EXTENSIONS_DIRS, user_home_dir, Arguments::get_java_home()); +-#else +- char *buf = malloc(strlen(Arguments::get_java_home()) + +- sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR)); +- sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR, +- Arguments::get_java_home()); +-#endif +- +- Arguments::set_ext_dirs(buf); +- } +- +- /* Endorsed standards default directory. */ +- { +- char * buf; +- buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR)); +- sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); +- Arguments::set_endorsed_dirs(buf); +- } ++ Arguments::set_java_home(buf); ++ set_boot_path('/', ':'); + } + +-#ifdef __APPLE__ ++ // Where to look for native libraries. ++ // ++ // Note: Due to a legacy implementation, most of the library path ++ // is set in the launcher. This was to accomodate linking restrictions ++ // on legacy Bsd implementations (which are no longer supported). ++ // Eventually, all the library path setting will be done here. ++ // ++ // However, to prevent the proliferation of improperly built native ++ // libraries, the new path component /usr/java/packages is added here. ++ // Eventually, all the library path setting will be done here. ++ { ++ // Get the user setting of LD_LIBRARY_PATH, and prepended it. It ++ // should always exist (until the legacy problem cited above is ++ // addressed). ++ // Prepend the default path with the JAVA_LIBRARY_PATH so that the app launcher code ++ // can specify a directory inside an app wrapper ++ const char *l = ::getenv("JAVA_LIBRARY_PATH"); ++ const char *l_colon = ":"; ++ if (l == NULL) { l = ""; l_colon = ""; } ++ ++ const char *v = ::getenv("DYLD_LIBRARY_PATH"); ++ const char *v_colon = ":"; ++ if (v == NULL) { v = ""; v_colon = ""; } ++ ++ // Apple's Java6 has "." at the beginning of java.library.path. ++ // OpenJDK on Windows has "." at the end of java.library.path. ++ // OpenJDK on Linux and Solaris don't have "." in java.library.path ++ // at all. To ease the transition from Apple's Java6 to OpenJDK7, ++ // "." is appended to the end of java.library.path. Yes, this ++ // could cause a change in behavior, but Apple's Java6 behavior ++ // can be achieved by putting "." at the beginning of the ++ // JAVA_LIBRARY_PATH environment variable. ++ char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, ++ strlen(v) + 1 + strlen(l) + 1 + ++ system_ext_size + 3, ++ mtInternal); ++ sprintf(ld_library_path, "%s%s%s%s%s" SYS_EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS ":.", ++ v, v_colon, l, l_colon, user_home_dir); ++ Arguments::set_library_path(ld_library_path); ++ FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal); ++ } ++ ++ // Extensions directories. ++ // ++ // Note that the space for the colon and the trailing null are provided ++ // by the nulls included by the sizeof operator (so actually one byte more ++ // than necessary is allocated). ++ sprintf(buf, "%s" SYS_EXTENSIONS_DIR ":%s" EXTENSIONS_DIR ":" SYS_EXTENSIONS_DIRS, ++ user_home_dir, Arguments::get_java_home()); ++ Arguments::set_ext_dirs(buf); ++ ++ // Endorsed standards default directory. ++ sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); ++ Arguments::set_endorsed_dirs(buf); ++ ++ FREE_C_HEAP_ARRAY(char, buf, mtInternal); ++ + #undef SYS_EXTENSIONS_DIR +-#endif +-#undef malloc +-#undef getenv ++#undef SYS_EXTENSIONS_DIRS ++ ++#endif // __APPLE__ ++ ++#undef SYS_EXT_DIR + #undef EXTENSIONS_DIR + #undef ENDORSED_DIR +- +- // Done +- return; + } + + //////////////////////////////////////////////////////////////////////////////// +@@ -914,9 +924,20 @@ + ////////////////////////////////////////////////////////////////////////////// + // thread local storage + ++// Restore the thread pointer if the destructor is called. This is in case ++// someone from JNI code sets up a destructor with pthread_key_create to run ++// detachCurrentThread on thread death. Unless we restore the thread pointer we ++// will hang or crash. When detachCurrentThread is called the key will be set ++// to null and we will not be called again. If detachCurrentThread is never ++// called we could loop forever depending on the pthread implementation. ++static void restore_thread_pointer(void* p) { ++ Thread* thread = (Thread*) p; ++ os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); ++} ++ + int os::allocate_thread_local_storage() { + pthread_key_t key; +- int rslt = pthread_key_create(&key, NULL); ++ int rslt = pthread_key_create(&key, restore_thread_pointer); + assert(rslt == 0, "cannot allocate thread local storage"); + return (int)key; + } +@@ -972,13 +993,15 @@ + return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000); + } + ++#ifndef __APPLE__ + #ifndef CLOCK_MONOTONIC + #define CLOCK_MONOTONIC (1) + #endif ++#endif + + #ifdef __APPLE__ + void os::Bsd::clock_init() { +- // XXXDARWIN: Investigate replacement monotonic clock ++ mach_timebase_info(&_timebase_info); + } + #else + void os::Bsd::clock_init() { +@@ -993,10 +1016,38 @@ + #endif + + ++#ifdef __APPLE__ ++ ++jlong os::javaTimeNanos() { ++ const uint64_t tm = mach_absolute_time(); ++ const uint64_t now = (tm * Bsd::_timebase_info.numer) / Bsd::_timebase_info.denom; ++ const uint64_t prev = Bsd::_max_abstime; ++ if (now <= prev) { ++ return prev; // same or retrograde time; ++ } ++ const uint64_t obsv = Atomic::cmpxchg(now, (volatile jlong*)&Bsd::_max_abstime, prev); ++ assert(obsv >= prev, "invariant"); // Monotonicity ++ // If the CAS succeeded then we're done and return "now". ++ // If the CAS failed and the observed value "obsv" is >= now then ++ // we should return "obsv". If the CAS failed and now > obsv > prv then ++ // some other thread raced this thread and installed a new value, in which case ++ // we could either (a) retry the entire operation, (b) retry trying to install now ++ // or (c) just return obsv. We use (c). No loop is required although in some cases ++ // we might discard a higher "now" value in deference to a slightly lower but freshly ++ // installed obsv value. That's entirely benign -- it admits no new orderings compared ++ // to (a) or (b) -- and greatly reduces coherence traffic. ++ // We might also condition (c) on the magnitude of the delta between obsv and now. ++ // Avoiding excessive CAS operations to hot RW locations is critical. ++ // See https://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate ++ return (prev == obsv) ? now : obsv; ++} ++ ++#else // __APPLE__ ++ + jlong os::javaTimeNanos() { + if (Bsd::supports_monotonic_clock()) { + struct timespec tp; +- int status = Bsd::clock_gettime(CLOCK_MONOTONIC, &tp); ++ int status = Bsd::_clock_gettime(CLOCK_MONOTONIC, &tp); + assert(status == 0, "gettime error"); + jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec); + return result; +@@ -1009,6 +1060,8 @@ + } + } + ++#endif // __APPLE__ ++ + void os::javaTimeNanos_info(jvmtiTimerInfo *info_ptr) { + if (Bsd::supports_monotonic_clock()) { + info_ptr->max_value = ALL_64_BITS; +@@ -1553,6 +1606,17 @@ + } + #endif /* !__APPLE__ */ + ++void* os::get_default_process_handle() { ++#ifdef __APPLE__ ++ // MacOS X needs to use RTLD_FIRST instead of RTLD_LAZY ++ // to avoid finding unexpected symbols on second (or later) ++ // loads of a library. ++ return (void*)::dlopen(NULL, RTLD_FIRST); ++#else ++ return (void*)::dlopen(NULL, RTLD_LAZY); ++#endif ++} ++ + // XXX: Do we need a lock around this as per Linux? + void* os::dll_lookup(void* handle, const char* name) { + return dlsym(handle, name); +@@ -1662,58 +1726,12 @@ + st->cr(); + } + +-// Taken from /usr/include/bits/siginfo.h Supposed to be architecture specific +-// but they're the same for all the bsd arch that we support +-// and they're the same for solaris but there's no common place to put this. +-const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR", +- "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG", +- "ILL_COPROC", "ILL_BADSTK" }; +- +-const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV", +- "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES", +- "FPE_FLTINV", "FPE_FLTSUB", "FPE_FLTDEN" }; +- +-const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" }; +- +-const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" }; +- + void os::print_siginfo(outputStream* st, void* siginfo) { +- st->print("siginfo:"); +- +- const int buflen = 100; +- char buf[buflen]; +- siginfo_t *si = (siginfo_t*)siginfo; +- st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen)); +- if (si->si_errno != 0 && strerror_r(si->si_errno, buf, buflen) == 0) { +- st->print("si_errno=%s", buf); +- } else { +- st->print("si_errno=%d", si->si_errno); +- } +- const int c = si->si_code; +- assert(c > 0, "unexpected si_code"); +- switch (si->si_signo) { +- case SIGILL: +- st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- case SIGFPE: +- st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- case SIGSEGV: +- st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- case SIGBUS: +- st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- default: +- st->print(", si_code=%d", si->si_code); +- // no si_addr +- } +- +- if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && ++ const siginfo_t* si = (const siginfo_t*)siginfo; ++ ++ os::Posix::print_siginfo_brief(st, si); ++ ++ if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && + UseSharedSpaces) { + FileMapInfo* mapinfo = FileMapInfo::current_info(); + if (mapinfo->is_in_shared_space(si->si_addr)) { +@@ -2372,7 +2390,6 @@ + (!FLAG_IS_DEFAULT(UseLargePages) || + !FLAG_IS_DEFAULT(LargePageSizeInBytes) + ); +- char msg[128]; + + // Create a large shared memory region to attach to based on size. + // Currently, size is the total size of the heap +@@ -2393,8 +2410,7 @@ + // coalesce into large pages. Try to reserve large pages when + // the system is still "fresh". + if (warn_on_failure) { +- jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno); +- warning(msg); ++ warning("Failed to reserve shared memory (errno = %d).", errno); + } + return NULL; + } +@@ -2411,8 +2427,7 @@ + + if ((intptr_t)addr == -1) { + if (warn_on_failure) { +- jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err); +- warning(msg); ++ warning("Failed to attach shared memory (errno = %d).", err); + } + return NULL; + } +@@ -2622,9 +2637,21 @@ + } + } + +-int os::naked_sleep() { +- // %% make the sleep time an integer flag. for now use 1 millisec. +- return os::sleep(Thread::current(), 1, false); ++void os::naked_short_sleep(jlong ms) { ++ struct timespec req; ++ ++ assert(ms < 1000, "Un-interruptable sleep, short time use only"); ++ req.tv_sec = 0; ++ if (ms > 0) { ++ req.tv_nsec = (ms % 1000) * 1000000; ++ } ++ else { ++ req.tv_nsec = 1; ++ } ++ ++ nanosleep(&req, NULL); ++ ++ return; + } + + // Sleep forever; naked call to OS-specific sleep; use with CAUTION +@@ -3232,7 +3259,7 @@ + sigAct.sa_sigaction = signalHandler; + sigAct.sa_flags = SA_SIGINFO|SA_RESTART; + } +-#if __APPLE__ ++#ifdef __APPLE__ + // Needed for main thread as XNU (Mac OS X kernel) will only deliver SIGSEGV + // (which starts as SIGBUS) on main thread with faulting address inside "stack+guard pages" + // if the signal handler declares it will handle it on alternate stack. +@@ -3389,7 +3416,8 @@ + st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); + } + +- st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask); ++ st->print(", sa_mask[0]="); ++ os::Posix::print_signal_set_short(st, &sa.sa_mask); + + address rh = VMError::get_resetted_sighandler(sig); + // May be, handler was resetted by VMError? +@@ -3398,7 +3426,8 @@ + sa.sa_flags = VMError::get_resetted_sigflags(sig) & SIGNIFICANT_SIGNAL_MASK; + } + +- st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags); ++ st->print(", sa_flags="); ++ os::Posix::print_sa_flags(st, sa.sa_flags); + + // Check: is it our handler? + if(handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) || +@@ -3897,6 +3926,7 @@ + return true; + } + ++ATTRIBUTE_PRINTF(3, 0) + int local_vsnprintf(char* buf, size_t count, const char* format, va_list args) { + return ::vsnprintf(buf, count, format, args); + } +--- ./hotspot/src/os/bsd/vm/os_bsd.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/os_bsd.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -27,6 +27,9 @@ + + // Bsd_OS defines the interface to Bsd operating systems + ++// Information about the protection of the page at address '0' on this os. ++static bool zero_page_read_protected() { return true; } ++ + /* pthread_getattr_np comes with BsdThreads-0.9-7 on RedHat 7.1 */ + typedef int (*pthread_getattr_func_type) (pthread_t, pthread_attr_t *); + +@@ -55,7 +58,13 @@ + // For signal flags diagnostics + static int sigflags[MAXSIGNUM]; + ++#ifdef __APPLE__ ++ // mach_absolute_time ++ static mach_timebase_info_data_t _timebase_info; ++ static volatile uint64_t _max_abstime; ++#else + static int (*_clock_gettime)(clockid_t, struct timespec *); ++#endif + + static GrowableArray* _cpu_to_node; + +@@ -132,11 +141,11 @@ + static void clock_init(void); + + static inline bool supports_monotonic_clock() { ++#ifdef __APPLE__ ++ return true; ++#else + return _clock_gettime != NULL; +- } +- +- static int clock_gettime(clockid_t clock_id, struct timespec *tp) { +- return _clock_gettime ? _clock_gettime(clock_id, tp) : -1; ++#endif + } + + // Stack repair handling +--- ./hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -925,7 +925,7 @@ + + if (PerfTraceMemOps) { + tty->print("mapped " SIZE_FORMAT " bytes for vmid %d at " +- INTPTR_FORMAT "\n", size, vmid, (void*)mapAddress); ++ INTPTR_FORMAT "\n", size, vmid, p2i((void*)mapAddress)); + } + } + +--- ./hotspot/src/os/linux/vm/decoder_linux.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/linux/vm/decoder_linux.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -32,6 +32,12 @@ + char* result; + size_t size = (size_t)buflen; + ++#ifdef PPC64 ++ // On PPC64 ElfDecoder::decode() may return a dot (.) prefixed name ++ // (see elfFuncDescTable.hpp for details) ++ if (symbol && *symbol == '.') symbol += 1; ++#endif ++ + // Don't pass buf to __cxa_demangle. In case of the 'buf' is too small, + // __cxa_demangle will call system "realloc" for additional memory, which + // may use different malloc/realloc mechanism that allocates 'buf'. +--- ./hotspot/src/os/linux/vm/os_linux.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/linux/vm/os_linux.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -101,6 +101,8 @@ + # include + # include + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // if RUSAGE_THREAD for getrusage() has not been defined, do it here. The code calling + // getrusage() is prepared to handle the associated failure. + #ifndef RUSAGE_THREAD +@@ -109,6 +111,8 @@ + + #define MAX_PATH (2 * K) + ++#define MAX_SECS 100000000 ++ + // for timer info max values which include all bits + #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) + +@@ -139,7 +143,7 @@ + + // For diagnostics to print a message once. see run_periodic_checks + static sigset_t check_signal_done; +-static bool check_signals = true;; ++static bool check_signals = true; + + static pid_t _initial_pid = 0; + +@@ -257,8 +261,10 @@ + static char cpu_arch[] = "amd64"; + #elif defined(ARM) + static char cpu_arch[] = "arm"; +-#elif defined(PPC) ++#elif defined(PPC32) + static char cpu_arch[] = "ppc"; ++#elif defined(PPC64) ++static char cpu_arch[] = "ppc64"; + #elif defined(SPARC) + # ifdef _LP64 + static char cpu_arch[] = "sparcv9"; +@@ -315,9 +321,6 @@ + } + + void os::init_system_properties_values() { +-// char arch[12]; +-// sysinfo(SI_ARCHITECTURE, arch, sizeof(arch)); +- + // The next steps are taken in the product version: + // + // Obtain the JAVA_HOME value from the location of libjvm.so. +@@ -344,140 +347,101 @@ + // Important note: if the location of libjvm.so changes this + // code needs to be changed accordingly. + +- // The next few definitions allow the code to be verbatim: +-#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal) +-#define getenv(n) ::getenv(n) +- +-/* +- * See ld(1): +- * The linker uses the following search paths to locate required +- * shared libraries: +- * 1: ... +- * ... +- * 7: The default directories, normally /lib and /usr/lib. +- */ ++// See ld(1): ++// The linker uses the following search paths to locate required ++// shared libraries: ++// 1: ... ++// ... ++// 7: The default directories, normally /lib and /usr/lib. + #if defined(AMD64) || defined(_LP64) && (defined(SPARC) || defined(PPC) || defined(S390)) + #define DEFAULT_LIBPATH "/usr/lib64:/lib64:/lib:/usr/lib" + #else + #define DEFAULT_LIBPATH "/lib:/usr/lib" + #endif + ++// Base path of extensions installed on the system. ++#define SYS_EXT_DIR "/usr/java/packages" + #define EXTENSIONS_DIR "/lib/ext" + #define ENDORSED_DIR "/lib/endorsed" +-#define REG_DIR "/usr/java/packages" +- ++ ++ // Buffer that fits several sprintfs. ++ // Note that the space for the colon and the trailing null are provided ++ // by the nulls included by the sizeof operator. ++ const size_t bufsize = ++ MAX3((size_t)MAXPATHLEN, // For dll_dir & friends. ++ (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR), // extensions dir ++ (size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir ++ char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); ++ ++ // sysclasspath, java_home, dll_dir + { +- /* sysclasspath, java_home, dll_dir */ +- { +- char *home_path; +- char *dll_path; +- char *pslash; +- char buf[MAXPATHLEN]; +- os::jvm_path(buf, sizeof(buf)); +- +- // Found the full path to libjvm.so. +- // Now cut the path to /jre if we can. +- *(strrchr(buf, '/')) = '\0'; /* get rid of /libjvm.so */ ++ char *pslash; ++ os::jvm_path(buf, bufsize); ++ ++ // Found the full path to libjvm.so. ++ // Now cut the path to /jre if we can. ++ *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so. ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /{client|server|hotspot}. ++ } ++ Arguments::set_dll_dir(buf); ++ ++ if (pslash != NULL) { ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /. + pslash = strrchr(buf, '/'); +- if (pslash != NULL) +- *pslash = '\0'; /* get rid of /{client|server|hotspot} */ +- dll_path = malloc(strlen(buf) + 1); +- if (dll_path == NULL) +- return; +- strcpy(dll_path, buf); +- Arguments::set_dll_dir(dll_path); +- + if (pslash != NULL) { +- pslash = strrchr(buf, '/'); +- if (pslash != NULL) { +- *pslash = '\0'; /* get rid of / */ +- pslash = strrchr(buf, '/'); +- if (pslash != NULL) +- *pslash = '\0'; /* get rid of /lib */ +- } ++ *pslash = '\0'; // Get rid of /lib. + } +- +- home_path = malloc(strlen(buf) + 1); +- if (home_path == NULL) +- return; +- strcpy(home_path, buf); +- Arguments::set_java_home(home_path); +- +- if (!set_boot_path('/', ':')) +- return; ++ } + } +- +- /* +- * Where to look for native libraries +- * +- * Note: Due to a legacy implementation, most of the library path +- * is set in the launcher. This was to accomodate linking restrictions +- * on legacy Linux implementations (which are no longer supported). +- * Eventually, all the library path setting will be done here. +- * +- * However, to prevent the proliferation of improperly built native +- * libraries, the new path component /usr/java/packages is added here. +- * Eventually, all the library path setting will be done here. +- */ +- { +- char *ld_library_path; +- +- /* +- * Construct the invariant part of ld_library_path. Note that the +- * space for the colon and the trailing null are provided by the +- * nulls included by the sizeof operator (so actually we allocate +- * a byte more than necessary). +- */ +- ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") + +- strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH)); +- sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch); +- +- /* +- * Get the user setting of LD_LIBRARY_PATH, and prepended it. It +- * should always exist (until the legacy problem cited above is +- * addressed). +- */ +- char *v = getenv("LD_LIBRARY_PATH"); +- if (v != NULL) { +- char *t = ld_library_path; +- /* That's +1 for the colon and +1 for the trailing '\0' */ +- ld_library_path = (char *) malloc(strlen(v) + 1 + strlen(t) + 1); +- sprintf(ld_library_path, "%s:%s", v, t); +- } +- Arguments::set_library_path(ld_library_path); +- } +- +- /* +- * Extensions directories. +- * +- * Note that the space for the colon and the trailing null are provided +- * by the nulls included by the sizeof operator (so actually one byte more +- * than necessary is allocated). +- */ +- { +- char *buf = malloc(strlen(Arguments::get_java_home()) + +- sizeof(EXTENSIONS_DIR) + sizeof(REG_DIR) + sizeof(EXTENSIONS_DIR)); +- sprintf(buf, "%s" EXTENSIONS_DIR ":" REG_DIR EXTENSIONS_DIR, +- Arguments::get_java_home()); +- Arguments::set_ext_dirs(buf); +- } +- +- /* Endorsed standards default directory. */ +- { +- char * buf; +- buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR)); +- sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); +- Arguments::set_endorsed_dirs(buf); +- } +- } +- +-#undef malloc +-#undef getenv ++ Arguments::set_java_home(buf); ++ set_boot_path('/', ':'); ++ } ++ ++ // Where to look for native libraries. ++ // ++ // Note: Due to a legacy implementation, most of the library path ++ // is set in the launcher. This was to accomodate linking restrictions ++ // on legacy Linux implementations (which are no longer supported). ++ // Eventually, all the library path setting will be done here. ++ // ++ // However, to prevent the proliferation of improperly built native ++ // libraries, the new path component /usr/java/packages is added here. ++ // Eventually, all the library path setting will be done here. ++ { ++ // Get the user setting of LD_LIBRARY_PATH, and prepended it. It ++ // should always exist (until the legacy problem cited above is ++ // addressed). ++ const char *v = ::getenv("LD_LIBRARY_PATH"); ++ const char *v_colon = ":"; ++ if (v == NULL) { v = ""; v_colon = ""; } ++ // That's +1 for the colon and +1 for the trailing '\0'. ++ char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, ++ strlen(v) + 1 + ++ sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH) + 1, ++ mtInternal); ++ sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch); ++ Arguments::set_library_path(ld_library_path); ++ FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal); ++ } ++ ++ // Extensions directories. ++ sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home()); ++ Arguments::set_ext_dirs(buf); ++ ++ // Endorsed standards default directory. ++ sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); ++ Arguments::set_endorsed_dirs(buf); ++ ++ FREE_C_HEAP_ARRAY(char, buf, mtInternal); ++ ++#undef DEFAULT_LIBPATH ++#undef SYS_EXT_DIR + #undef EXTENSIONS_DIR + #undef ENDORSED_DIR +- +- // Done +- return; + } + + //////////////////////////////////////////////////////////////////////////////// +@@ -530,6 +494,9 @@ + sigaddset(&unblocked_sigs, SIGSEGV); + sigaddset(&unblocked_sigs, SIGBUS); + sigaddset(&unblocked_sigs, SIGFPE); ++#if defined(PPC64) ++ sigaddset(&unblocked_sigs, SIGTRAP); ++#endif + sigaddset(&unblocked_sigs, SR_signum); + + if (!ReduceSignalUsage) { +@@ -1067,9 +1034,20 @@ + ////////////////////////////////////////////////////////////////////////////// + // thread local storage + ++// Restore the thread pointer if the destructor is called. This is in case ++// someone from JNI code sets up a destructor with pthread_key_create to run ++// detachCurrentThread on thread death. Unless we restore the thread pointer we ++// will hang or crash. When detachCurrentThread is called the key will be set ++// to null and we will not be called again. If detachCurrentThread is never ++// called we could loop forever depending on the pthread implementation. ++static void restore_thread_pointer(void* p) { ++ Thread* thread = (Thread*) p; ++ os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); ++} ++ + int os::allocate_thread_local_storage() { + pthread_key_t key; +- int rslt = pthread_key_create(&key, NULL); ++ int rslt = pthread_key_create(&key, restore_thread_pointer); + assert(rslt == 0, "cannot allocate thread local storage"); + return (int)key; + } +@@ -1953,7 +1931,11 @@ + {EM_SPARC32PLUS, EM_SPARC, ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"}, + {EM_SPARCV9, EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"}, + {EM_PPC, EM_PPC, ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"}, ++#if defined(VM_LITTLE_ENDIAN) ++ {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2LSB, (char*)"Power PC 64"}, ++#else + {EM_PPC64, EM_PPC64, ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"}, ++#endif + {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM"}, + {EM_S390, EM_S390, ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"}, + {EM_ALPHA, EM_ALPHA, ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"}, +@@ -2101,6 +2083,9 @@ + return res; + } + ++void* os::get_default_process_handle() { ++ return (void*)::dlopen(NULL, RTLD_LAZY); ++} + + static bool _print_ascii_file(const char* filename, outputStream* st) { + int fd = ::open(filename, O_RDONLY); +@@ -2151,7 +2136,7 @@ + // Print warning if unsafe chroot environment detected + if (unsafe_chroot_detected) { + st->print("WARNING!! "); +- st->print_cr(unstable_chroot_error); ++ st->print_cr("%s", unstable_chroot_error); + } + + os::Linux::print_libversion_info(st); +@@ -2212,8 +2197,8 @@ + void os::Linux::print_libversion_info(outputStream* st) { + // libc, pthread + st->print("libc:"); +- st->print(os::Linux::glibc_version()); st->print(" "); +- st->print(os::Linux::libpthread_version()); st->print(" "); ++ st->print("%s ", os::Linux::glibc_version()); ++ st->print("%s ", os::Linux::libpthread_version()); + if (os::Linux::is_LinuxThreads()) { + st->print("(%s stack)", os::Linux::is_floating_stack() ? "floating" : "fixed"); + } +@@ -2254,58 +2239,12 @@ + st->cr(); + } + +-// Taken from /usr/include/bits/siginfo.h Supposed to be architecture specific +-// but they're the same for all the linux arch that we support +-// and they're the same for solaris but there's no common place to put this. +-const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR", +- "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG", +- "ILL_COPROC", "ILL_BADSTK" }; +- +-const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV", +- "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES", +- "FPE_FLTINV", "FPE_FLTSUB", "FPE_FLTDEN" }; +- +-const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" }; +- +-const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" }; +- + void os::print_siginfo(outputStream* st, void* siginfo) { +- st->print("siginfo:"); +- +- const int buflen = 100; +- char buf[buflen]; +- siginfo_t *si = (siginfo_t*)siginfo; +- st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen)); +- if (si->si_errno != 0 && strerror_r(si->si_errno, buf, buflen) == 0) { +- st->print("si_errno=%s", buf); +- } else { +- st->print("si_errno=%d", si->si_errno); +- } +- const int c = si->si_code; +- assert(c > 0, "unexpected si_code"); +- switch (si->si_signo) { +- case SIGILL: +- st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- case SIGFPE: +- st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- case SIGSEGV: +- st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- case SIGBUS: +- st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- default: +- st->print(", si_code=%d", si->si_code); +- // no si_addr +- } +- +- if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && ++ const siginfo_t* si = (const siginfo_t*)siginfo; ++ ++ os::Posix::print_siginfo_brief(st, si); ++ ++ if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && + UseSharedSpaces) { + FileMapInfo* mapinfo = FileMapInfo::current_info(); + if (mapinfo->is_in_shared_space(si->si_addr)) { +@@ -2335,6 +2274,9 @@ + print_signal_handler(st, SHUTDOWN2_SIGNAL , buf, buflen); + print_signal_handler(st, SHUTDOWN3_SIGNAL , buf, buflen); + print_signal_handler(st, BREAK_SIGNAL, buf, buflen); ++#if defined(PPC64) ++ print_signal_handler(st, SIGTRAP, buf, buflen); ++#endif + } + + static char saved_jvm_path[MAXPATHLEN] = {0}; +@@ -2466,7 +2408,6 @@ + sem_t _semaphore; + }; + +- + Semaphore::Semaphore() { + sem_init(&_semaphore, 0, 0); + } +@@ -2488,8 +2429,22 @@ + } + + bool Semaphore::timedwait(unsigned int sec, int nsec) { ++ + struct timespec ts; +- unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec); ++ // Semaphore's are always associated with CLOCK_REALTIME ++ os::Linux::clock_gettime(CLOCK_REALTIME, &ts); ++ // see unpackTime for discussion on overflow checking ++ if (sec >= MAX_SECS) { ++ ts.tv_sec += MAX_SECS; ++ ts.tv_nsec = 0; ++ } else { ++ ts.tv_sec += sec; ++ ts.tv_nsec += nsec; ++ if (ts.tv_nsec >= NANOSECS_PER_SEC) { ++ ts.tv_nsec -= NANOSECS_PER_SEC; ++ ++ts.tv_sec; // note: this must be <= max_secs ++ } ++ } + + while (1) { + int result = sem_timedwait(&_semaphore, &ts); +@@ -2994,7 +2949,9 @@ + + unsigned char vec[1]; + unsigned imin = 1, imax = pages + 1, imid; +- int mincore_return_value; ++ int mincore_return_value = 0; ++ ++ assert(imin <= imax, "Unexpected page size"); + + while (imin < imax) { + imid = (imax + imin) / 2; +@@ -3458,7 +3415,7 @@ + // the system is still "fresh". + if (warn_on_failure) { + jio_snprintf(msg, sizeof(msg), "Failed to reserve shared memory (errno = %d).", errno); +- warning(msg); ++ warning("%s", msg); + } + return NULL; + } +@@ -3476,7 +3433,7 @@ + if ((intptr_t)addr == -1) { + if (warn_on_failure) { + jio_snprintf(msg, sizeof(msg), "Failed to attach shared memory (errno = %d).", err); +- warning(msg); ++ warning("%s", msg); + } + return NULL; + } +@@ -3496,7 +3453,7 @@ + char msg[128]; + jio_snprintf(msg, sizeof(msg), "Failed to reserve large pages memory req_addr: " + PTR_FORMAT " bytes: " SIZE_FORMAT " (errno = %d).", req_addr, bytes, error); +- warning(msg); ++ warning("%s", msg); + } + } + +@@ -3866,9 +3823,33 @@ + } + } + +-int os::naked_sleep() { +- // %% make the sleep time an integer flag. for now use 1 millisec. +- return os::sleep(Thread::current(), 1, false); ++// ++// Short sleep, direct OS call. ++// ++// Note: certain versions of Linux CFS scheduler (since 2.6.23) do not guarantee ++// sched_yield(2) will actually give up the CPU: ++// ++// * Alone on this pariticular CPU, keeps running. ++// * Before the introduction of "skip_buddy" with "compat_yield" disabled ++// (pre 2.6.39). ++// ++// So calling this with 0 is an alternative. ++// ++void os::naked_short_sleep(jlong ms) { ++ struct timespec req; ++ ++ assert(ms < 1000, "Un-interruptable sleep, short time use only"); ++ req.tv_sec = 0; ++ if (ms > 0) { ++ req.tv_nsec = (ms % 1000) * 1000000; ++ } ++ else { ++ req.tv_nsec = 1; ++ } ++ ++ nanosleep(&req, NULL); ++ ++ return; + } + + // Sleep forever; naked call to OS-specific sleep; use with CAUTION +@@ -4465,6 +4446,9 @@ + set_signal_handler(SIGBUS, true); + set_signal_handler(SIGILL, true); + set_signal_handler(SIGFPE, true); ++#if defined(PPC64) ++ set_signal_handler(SIGTRAP, true); ++#endif + set_signal_handler(SIGXFSZ, true); + + if (libjsig_is_loaded) { +@@ -4558,7 +4542,8 @@ + st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); + } + +- st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask); ++ st->print(", sa_mask[0]="); ++ os::Posix::print_signal_set_short(st, &sa.sa_mask); + + address rh = VMError::get_resetted_sighandler(sig); + // May be, handler was resetted by VMError? +@@ -4567,7 +4552,8 @@ + sa.sa_flags = VMError::get_resetted_sigflags(sig) & SIGNIFICANT_SIGNAL_MASK; + } + +- st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags); ++ st->print(", sa_flags="); ++ os::Posix::print_sa_flags(st, sa.sa_flags); + + // Check: is it our handler? + if(handler == CAST_FROM_FN_PTR(address, (sa_sigaction_t)signalHandler) || +@@ -4605,7 +4591,9 @@ + DO_SIGNAL_CHECK(SIGBUS); + DO_SIGNAL_CHECK(SIGPIPE); + DO_SIGNAL_CHECK(SIGXFSZ); +- ++#if defined(PPC64) ++ DO_SIGNAL_CHECK(SIGTRAP); ++#endif + + // ReduceSignalUsage allows the user to override these handlers + // see comments at the very top and jvm_solaris.h +@@ -4927,7 +4915,7 @@ + // the future if the appropriate cleanup code can be added to the + // VM_Exit VMOperation's doit method. + if (atexit(perfMemory_exit_helper) != 0) { +- warning("os::init2 atexit(perfMemory_exit_helper) failed"); ++ warning("os::init_2 atexit(perfMemory_exit_helper) failed"); + } + } + +@@ -4938,8 +4926,7 @@ + } + + // this is called at the end of vm_initialization +-void os::init_3(void) +-{ ++void os::init_3(void) { + #ifdef JAVASE_EMBEDDED + // Start the MemNotifyThread + if (LowMemoryProtection) { +@@ -5405,6 +5392,8 @@ + // -1 on error. + // + ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED + static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { + static bool proc_task_unchecked = true; + static const char *proc_stat_path = "/proc/%d/stat"; +@@ -5466,6 +5455,7 @@ + return (jlong)user_time * (1000000000 / clock_tics_per_sec); + } + } ++PRAGMA_DIAG_POP + + void os::current_thread_cpu_time_info(jvmtiTimerInfo *info_ptr) { + info_ptr->max_value = ALL_64_BITS; // will not wrap in less than 64 bits +@@ -5779,7 +5769,6 @@ + * is no need to track notifications. + */ + +-#define MAX_SECS 100000000 + /* + * This code is common to linux and solaris and will be moved to a + * common place in dolphin. +--- ./hotspot/src/os/linux/vm/os_linux.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/linux/vm/os_linux.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -30,6 +30,9 @@ + /* pthread_getattr_np comes with LinuxThreads-0.9-7 on RedHat 7.1 */ + typedef int (*pthread_getattr_func_type) (pthread_t, pthread_attr_t *); + ++// Information about the protection of the page at address '0' on this os. ++static bool zero_page_read_protected() { return true; } ++ + class Linux { + friend class os; + friend class TestReserveMemorySpecial; +--- ./hotspot/src/os/linux/vm/perfMemory_linux.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/linux/vm/perfMemory_linux.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -891,8 +891,16 @@ + FREE_C_HEAP_ARRAY(char, filename, mtInternal); + + // open the shared memory file for the give vmid +- fd = open_sharedmem_file(rfilename, file_flags, CHECK); +- assert(fd != OS_ERR, "unexpected value"); ++ fd = open_sharedmem_file(rfilename, file_flags, THREAD); ++ ++ if (fd == OS_ERR) { ++ return; ++ } ++ ++ if (HAS_PENDING_EXCEPTION) { ++ ::close(fd); ++ return; ++ } + + if (*sizep == 0) { + size = sharedmem_filesize(fd, CHECK); +@@ -923,7 +931,7 @@ + + if (PerfTraceMemOps) { + tty->print("mapped " SIZE_FORMAT " bytes for vmid %d at " +- INTPTR_FORMAT "\n", size, vmid, (void*)mapAddress); ++ INTPTR_FORMAT "\n", size, vmid, p2i((void*)mapAddress)); + } + } + +--- ./hotspot/src/os/posix/vm/os_posix.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/posix/vm/os_posix.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,38 +1,48 @@ + /* +-* Copyright (c) 1999, 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. +-* +-*/ ++* Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * 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 "utilities/globalDefinitions.hpp" + #include "prims/jvm.h" + #include "runtime/frame.inline.hpp" + #include "runtime/os.hpp" + #include "utilities/vmError.hpp" + ++#include + #include + #include + #include + #include + #include + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ ++// Todo: provide a os::get_max_process_id() or similar. Number of processes ++// may have been configured, can be read more accurately from proc fs etc. ++#ifndef MAX_PID ++#define MAX_PID INT_MAX ++#endif ++#define IS_VALID_PID(p) (p > 0 && p < MAX_PID) + + // Check core dump limit and report possible place where core can be found + void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) { +@@ -158,8 +168,8 @@ + if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); + else st->print("%uk", rlim.rlim_cur >> 10); + +- //Isn't there on solaris +-#ifndef TARGET_OS_FAMILY_solaris ++ // Isn't there on solaris ++#if !defined(TARGET_OS_FAMILY_solaris) && !defined(TARGET_OS_FAMILY_aix) + st->print(", NPROC "); + getrlimit(RLIMIT_NPROC, &rlim); + if (rlim.rlim_cur == RLIM_INFINITY) st->print("infinity"); +@@ -183,10 +193,10 @@ + st->print("uname:"); + struct utsname name; + uname(&name); +- st->print(name.sysname); st->print(" "); +- st->print(name.release); st->print(" "); +- st->print(name.version); st->print(" "); +- st->print(name.machine); ++ st->print("%s ", name.sysname); ++ st->print("%s ", name.release); ++ st->print("%s ", name.version); ++ st->print("%s", name.machine); + st->cr(); + } + +@@ -262,10 +272,6 @@ + return ::fdopen(fd, mode); + } + +-void* os::get_default_process_handle() { +- return (void*)::dlopen(NULL, RTLD_LAZY); +-} +- + // Builds a platform dependent Agent_OnLoad_ function name + // which is used to find statically linked in agents. + // Parameters: +@@ -311,6 +317,483 @@ + return agent_entry_name; + } + ++// Returned string is a constant. For unknown signals "UNKNOWN" is returned. ++const char* os::Posix::get_signal_name(int sig, char* out, size_t outlen) { ++ ++ static const struct { ++ int sig; const char* name; ++ } ++ info[] = ++ { ++ { SIGABRT, "SIGABRT" }, ++#ifdef SIGAIO ++ { SIGAIO, "SIGAIO" }, ++#endif ++ { SIGALRM, "SIGALRM" }, ++#ifdef SIGALRM1 ++ { SIGALRM1, "SIGALRM1" }, ++#endif ++ { SIGBUS, "SIGBUS" }, ++#ifdef SIGCANCEL ++ { SIGCANCEL, "SIGCANCEL" }, ++#endif ++ { SIGCHLD, "SIGCHLD" }, ++#ifdef SIGCLD ++ { SIGCLD, "SIGCLD" }, ++#endif ++ { SIGCONT, "SIGCONT" }, ++#ifdef SIGCPUFAIL ++ { SIGCPUFAIL, "SIGCPUFAIL" }, ++#endif ++#ifdef SIGDANGER ++ { SIGDANGER, "SIGDANGER" }, ++#endif ++#ifdef SIGDIL ++ { SIGDIL, "SIGDIL" }, ++#endif ++#ifdef SIGEMT ++ { SIGEMT, "SIGEMT" }, ++#endif ++ { SIGFPE, "SIGFPE" }, ++#ifdef SIGFREEZE ++ { SIGFREEZE, "SIGFREEZE" }, ++#endif ++#ifdef SIGGFAULT ++ { SIGGFAULT, "SIGGFAULT" }, ++#endif ++#ifdef SIGGRANT ++ { SIGGRANT, "SIGGRANT" }, ++#endif ++ { SIGHUP, "SIGHUP" }, ++ { SIGILL, "SIGILL" }, ++ { SIGINT, "SIGINT" }, ++#ifdef SIGIO ++ { SIGIO, "SIGIO" }, ++#endif ++#ifdef SIGIOINT ++ { SIGIOINT, "SIGIOINT" }, ++#endif ++#ifdef SIGIOT ++ // SIGIOT is there for BSD compatibility, but on most Unices just a ++ // synonym for SIGABRT. The result should be "SIGABRT", not ++ // "SIGIOT". ++ #if (SIGIOT != SIGABRT ) ++ { SIGIOT, "SIGIOT" }, ++ #endif ++#endif ++#ifdef SIGKAP ++ { SIGKAP, "SIGKAP" }, ++#endif ++ { SIGKILL, "SIGKILL" }, ++#ifdef SIGLOST ++ { SIGLOST, "SIGLOST" }, ++#endif ++#ifdef SIGLWP ++ { SIGLWP, "SIGLWP" }, ++#endif ++#ifdef SIGLWPTIMER ++ { SIGLWPTIMER, "SIGLWPTIMER" }, ++#endif ++#ifdef SIGMIGRATE ++ { SIGMIGRATE, "SIGMIGRATE" }, ++#endif ++#ifdef SIGMSG ++ { SIGMSG, "SIGMSG" }, ++#endif ++ { SIGPIPE, "SIGPIPE" }, ++#ifdef SIGPOLL ++ { SIGPOLL, "SIGPOLL" }, ++#endif ++#ifdef SIGPRE ++ { SIGPRE, "SIGPRE" }, ++#endif ++ { SIGPROF, "SIGPROF" }, ++#ifdef SIGPTY ++ { SIGPTY, "SIGPTY" }, ++#endif ++#ifdef SIGPWR ++ { SIGPWR, "SIGPWR" }, ++#endif ++ { SIGQUIT, "SIGQUIT" }, ++#ifdef SIGRECONFIG ++ { SIGRECONFIG, "SIGRECONFIG" }, ++#endif ++#ifdef SIGRECOVERY ++ { SIGRECOVERY, "SIGRECOVERY" }, ++#endif ++#ifdef SIGRESERVE ++ { SIGRESERVE, "SIGRESERVE" }, ++#endif ++#ifdef SIGRETRACT ++ { SIGRETRACT, "SIGRETRACT" }, ++#endif ++#ifdef SIGSAK ++ { SIGSAK, "SIGSAK" }, ++#endif ++ { SIGSEGV, "SIGSEGV" }, ++#ifdef SIGSOUND ++ { SIGSOUND, "SIGSOUND" }, ++#endif ++ { SIGSTOP, "SIGSTOP" }, ++ { SIGSYS, "SIGSYS" }, ++#ifdef SIGSYSERROR ++ { SIGSYSERROR, "SIGSYSERROR" }, ++#endif ++#ifdef SIGTALRM ++ { SIGTALRM, "SIGTALRM" }, ++#endif ++ { SIGTERM, "SIGTERM" }, ++#ifdef SIGTHAW ++ { SIGTHAW, "SIGTHAW" }, ++#endif ++ { SIGTRAP, "SIGTRAP" }, ++#ifdef SIGTSTP ++ { SIGTSTP, "SIGTSTP" }, ++#endif ++ { SIGTTIN, "SIGTTIN" }, ++ { SIGTTOU, "SIGTTOU" }, ++#ifdef SIGURG ++ { SIGURG, "SIGURG" }, ++#endif ++ { SIGUSR1, "SIGUSR1" }, ++ { SIGUSR2, "SIGUSR2" }, ++#ifdef SIGVIRT ++ { SIGVIRT, "SIGVIRT" }, ++#endif ++ { SIGVTALRM, "SIGVTALRM" }, ++#ifdef SIGWAITING ++ { SIGWAITING, "SIGWAITING" }, ++#endif ++#ifdef SIGWINCH ++ { SIGWINCH, "SIGWINCH" }, ++#endif ++#ifdef SIGWINDOW ++ { SIGWINDOW, "SIGWINDOW" }, ++#endif ++ { SIGXCPU, "SIGXCPU" }, ++ { SIGXFSZ, "SIGXFSZ" }, ++#ifdef SIGXRES ++ { SIGXRES, "SIGXRES" }, ++#endif ++ { -1, NULL } ++ }; ++ ++ const char* ret = NULL; ++ ++#ifdef SIGRTMIN ++ if (sig >= SIGRTMIN && sig <= SIGRTMAX) { ++ if (sig == SIGRTMIN) { ++ ret = "SIGRTMIN"; ++ } else if (sig == SIGRTMAX) { ++ ret = "SIGRTMAX"; ++ } else { ++ jio_snprintf(out, outlen, "SIGRTMIN+%d", sig - SIGRTMIN); ++ return out; ++ } ++ } ++#endif ++ ++ if (sig > 0) { ++ for (int idx = 0; info[idx].sig != -1; idx ++) { ++ if (info[idx].sig == sig) { ++ ret = info[idx].name; ++ break; ++ } ++ } ++ } ++ ++ if (!ret) { ++ if (!is_valid_signal(sig)) { ++ ret = "INVALID"; ++ } else { ++ ret = "UNKNOWN"; ++ } ++ } ++ ++ jio_snprintf(out, outlen, ret); ++ return out; ++} ++ ++// Returns true if signal number is valid. ++bool os::Posix::is_valid_signal(int sig) { ++ // MacOS not really POSIX compliant: sigaddset does not return ++ // an error for invalid signal numbers. However, MacOS does not ++ // support real time signals and simply seems to have just 33 ++ // signals with no holes in the signal range. ++#ifdef __APPLE__ ++ return sig >= 1 && sig < NSIG; ++#else ++ // Use sigaddset to check for signal validity. ++ sigset_t set; ++ if (sigaddset(&set, sig) == -1 && errno == EINVAL) { ++ return false; ++ } ++ return true; ++#endif ++} ++ ++#define NUM_IMPORTANT_SIGS 32 ++// Returns one-line short description of a signal set in a user provided buffer. ++const char* os::Posix::describe_signal_set_short(const sigset_t* set, char* buffer, size_t buf_size) { ++ assert(buf_size == (NUM_IMPORTANT_SIGS + 1), "wrong buffer size"); ++ // Note: for shortness, just print out the first 32. That should ++ // cover most of the useful ones, apart from realtime signals. ++ for (int sig = 1; sig <= NUM_IMPORTANT_SIGS; sig++) { ++ const int rc = sigismember(set, sig); ++ if (rc == -1 && errno == EINVAL) { ++ buffer[sig-1] = '?'; ++ } else { ++ buffer[sig-1] = rc == 0 ? '0' : '1'; ++ } ++ } ++ buffer[NUM_IMPORTANT_SIGS] = 0; ++ return buffer; ++} ++ ++// Prints one-line description of a signal set. ++void os::Posix::print_signal_set_short(outputStream* st, const sigset_t* set) { ++ char buf[NUM_IMPORTANT_SIGS + 1]; ++ os::Posix::describe_signal_set_short(set, buf, sizeof(buf)); ++ st->print("%s", buf); ++} ++ ++// Writes one-line description of a combination of sigaction.sa_flags into a user ++// provided buffer. Returns that buffer. ++const char* os::Posix::describe_sa_flags(int flags, char* buffer, size_t size) { ++ char* p = buffer; ++ size_t remaining = size; ++ bool first = true; ++ int idx = 0; ++ ++ assert(buffer, "invalid argument"); ++ ++ if (size == 0) { ++ return buffer; ++ } ++ ++ strncpy(buffer, "none", size); ++ ++ const struct { ++ int i; ++ const char* s; ++ } flaginfo [] = { ++ { SA_NOCLDSTOP, "SA_NOCLDSTOP" }, ++ { SA_ONSTACK, "SA_ONSTACK" }, ++ { SA_RESETHAND, "SA_RESETHAND" }, ++ { SA_RESTART, "SA_RESTART" }, ++ { SA_SIGINFO, "SA_SIGINFO" }, ++ { SA_NOCLDWAIT, "SA_NOCLDWAIT" }, ++ { SA_NODEFER, "SA_NODEFER" }, ++#ifdef AIX ++ { SA_ONSTACK, "SA_ONSTACK" }, ++ { SA_OLDSTYLE, "SA_OLDSTYLE" }, ++#endif ++ { 0, NULL } ++ }; ++ ++ for (idx = 0; flaginfo[idx].s && remaining > 1; idx++) { ++ if (flags & flaginfo[idx].i) { ++ if (first) { ++ jio_snprintf(p, remaining, "%s", flaginfo[idx].s); ++ first = false; ++ } else { ++ jio_snprintf(p, remaining, "|%s", flaginfo[idx].s); ++ } ++ const size_t len = strlen(p); ++ p += len; ++ remaining -= len; ++ } ++ } ++ ++ buffer[size - 1] = '\0'; ++ ++ return buffer; ++} ++ ++// Prints one-line description of a combination of sigaction.sa_flags. ++void os::Posix::print_sa_flags(outputStream* st, int flags) { ++ char buffer[0x100]; ++ os::Posix::describe_sa_flags(flags, buffer, sizeof(buffer)); ++ st->print("%s", buffer); ++} ++ ++// Helper function for os::Posix::print_siginfo_...(): ++// return a textual description for signal code. ++struct enum_sigcode_desc_t { ++ const char* s_name; ++ const char* s_desc; ++}; ++ ++static bool get_signal_code_description(const siginfo_t* si, enum_sigcode_desc_t* out) { ++ ++ const struct { ++ int sig; int code; const char* s_code; const char* s_desc; ++ } t1 [] = { ++ { SIGILL, ILL_ILLOPC, "ILL_ILLOPC", "Illegal opcode." }, ++ { SIGILL, ILL_ILLOPN, "ILL_ILLOPN", "Illegal operand." }, ++ { SIGILL, ILL_ILLADR, "ILL_ILLADR", "Illegal addressing mode." }, ++ { SIGILL, ILL_ILLTRP, "ILL_ILLTRP", "Illegal trap." }, ++ { SIGILL, ILL_PRVOPC, "ILL_PRVOPC", "Privileged opcode." }, ++ { SIGILL, ILL_PRVREG, "ILL_PRVREG", "Privileged register." }, ++ { SIGILL, ILL_COPROC, "ILL_COPROC", "Coprocessor error." }, ++ { SIGILL, ILL_BADSTK, "ILL_BADSTK", "Internal stack error." }, ++#if defined(IA64) && defined(LINUX) ++ { SIGILL, ILL_BADIADDR, "ILL_BADIADDR", "Unimplemented instruction address" }, ++ { SIGILL, ILL_BREAK, "ILL_BREAK", "Application Break instruction" }, ++#endif ++ { SIGFPE, FPE_INTDIV, "FPE_INTDIV", "Integer divide by zero." }, ++ { SIGFPE, FPE_INTOVF, "FPE_INTOVF", "Integer overflow." }, ++ { SIGFPE, FPE_FLTDIV, "FPE_FLTDIV", "Floating-point divide by zero." }, ++ { SIGFPE, FPE_FLTOVF, "FPE_FLTOVF", "Floating-point overflow." }, ++ { SIGFPE, FPE_FLTUND, "FPE_FLTUND", "Floating-point underflow." }, ++ { SIGFPE, FPE_FLTRES, "FPE_FLTRES", "Floating-point inexact result." }, ++ { SIGFPE, FPE_FLTINV, "FPE_FLTINV", "Invalid floating-point operation." }, ++ { SIGFPE, FPE_FLTSUB, "FPE_FLTSUB", "Subscript out of range." }, ++ { SIGSEGV, SEGV_MAPERR, "SEGV_MAPERR", "Address not mapped to object." }, ++ { SIGSEGV, SEGV_ACCERR, "SEGV_ACCERR", "Invalid permissions for mapped object." }, ++#ifdef AIX ++ // no explanation found what keyerr would be ++ { SIGSEGV, SEGV_KEYERR, "SEGV_KEYERR", "key error" }, ++#endif ++#if defined(IA64) && !defined(AIX) ++ { SIGSEGV, SEGV_PSTKOVF, "SEGV_PSTKOVF", "Paragraph stack overflow" }, ++#endif ++ { SIGBUS, BUS_ADRALN, "BUS_ADRALN", "Invalid address alignment." }, ++ { SIGBUS, BUS_ADRERR, "BUS_ADRERR", "Nonexistent physical address." }, ++ { SIGBUS, BUS_OBJERR, "BUS_OBJERR", "Object-specific hardware error." }, ++ { SIGTRAP, TRAP_BRKPT, "TRAP_BRKPT", "Process breakpoint." }, ++ { SIGTRAP, TRAP_TRACE, "TRAP_TRACE", "Process trace trap." }, ++ { SIGCHLD, CLD_EXITED, "CLD_EXITED", "Child has exited." }, ++ { SIGCHLD, CLD_KILLED, "CLD_KILLED", "Child has terminated abnormally and did not create a core file." }, ++ { SIGCHLD, CLD_DUMPED, "CLD_DUMPED", "Child has terminated abnormally and created a core file." }, ++ { SIGCHLD, CLD_TRAPPED, "CLD_TRAPPED", "Traced child has trapped." }, ++ { SIGCHLD, CLD_STOPPED, "CLD_STOPPED", "Child has stopped." }, ++ { SIGCHLD, CLD_CONTINUED,"CLD_CONTINUED","Stopped child has continued." }, ++#ifdef SIGPOLL ++ { SIGPOLL, POLL_OUT, "POLL_OUT", "Output buffers available." }, ++ { SIGPOLL, POLL_MSG, "POLL_MSG", "Input message available." }, ++ { SIGPOLL, POLL_ERR, "POLL_ERR", "I/O error." }, ++ { SIGPOLL, POLL_PRI, "POLL_PRI", "High priority input available." }, ++ { SIGPOLL, POLL_HUP, "POLL_HUP", "Device disconnected. [Option End]" }, ++#endif ++ { -1, -1, NULL, NULL } ++ }; ++ ++ // Codes valid in any signal context. ++ const struct { ++ int code; const char* s_code; const char* s_desc; ++ } t2 [] = { ++ { SI_USER, "SI_USER", "Signal sent by kill()." }, ++ { SI_QUEUE, "SI_QUEUE", "Signal sent by the sigqueue()." }, ++ { SI_TIMER, "SI_TIMER", "Signal generated by expiration of a timer set by timer_settime()." }, ++ { SI_ASYNCIO, "SI_ASYNCIO", "Signal generated by completion of an asynchronous I/O request." }, ++ { SI_MESGQ, "SI_MESGQ", "Signal generated by arrival of a message on an empty message queue." }, ++ // Linux specific ++#ifdef SI_TKILL ++ { SI_TKILL, "SI_TKILL", "Signal sent by tkill (pthread_kill)" }, ++#endif ++#ifdef SI_DETHREAD ++ { SI_DETHREAD, "SI_DETHREAD", "Signal sent by execve() killing subsidiary threads" }, ++#endif ++#ifdef SI_KERNEL ++ { SI_KERNEL, "SI_KERNEL", "Signal sent by kernel." }, ++#endif ++#ifdef SI_SIGIO ++ { SI_SIGIO, "SI_SIGIO", "Signal sent by queued SIGIO" }, ++#endif ++ ++#ifdef AIX ++ { SI_UNDEFINED, "SI_UNDEFINED","siginfo contains partial information" }, ++ { SI_EMPTY, "SI_EMPTY", "siginfo contains no useful information" }, ++#endif ++ ++#ifdef __sun ++ { SI_NOINFO, "SI_NOINFO", "No signal information" }, ++ { SI_RCTL, "SI_RCTL", "kernel generated signal via rctl action" }, ++ { SI_LWP, "SI_LWP", "Signal sent via lwp_kill" }, ++#endif ++ ++ { -1, NULL, NULL } ++ }; ++ ++ const char* s_code = NULL; ++ const char* s_desc = NULL; ++ ++ for (int i = 0; t1[i].sig != -1; i ++) { ++ if (t1[i].sig == si->si_signo && t1[i].code == si->si_code) { ++ s_code = t1[i].s_code; ++ s_desc = t1[i].s_desc; ++ break; ++ } ++ } ++ ++ if (s_code == NULL) { ++ for (int i = 0; t2[i].s_code != NULL; i ++) { ++ if (t2[i].code == si->si_code) { ++ s_code = t2[i].s_code; ++ s_desc = t2[i].s_desc; ++ } ++ } ++ } ++ ++ if (s_code == NULL) { ++ out->s_name = "unknown"; ++ out->s_desc = "unknown"; ++ return false; ++ } ++ ++ out->s_name = s_code; ++ out->s_desc = s_desc; ++ ++ return true; ++} ++ ++// A POSIX conform, platform-independend siginfo print routine. ++// Short print out on one line. ++void os::Posix::print_siginfo_brief(outputStream* os, const siginfo_t* si) { ++ char buf[20]; ++ os->print("siginfo: "); ++ ++ if (!si) { ++ os->print(""); ++ return; ++ } ++ ++ // See print_siginfo_full() for details. ++ const int sig = si->si_signo; ++ ++ os->print("si_signo: %d (%s)", sig, os::Posix::get_signal_name(sig, buf, sizeof(buf))); ++ ++ enum_sigcode_desc_t ed; ++ if (get_signal_code_description(si, &ed)) { ++ os->print(", si_code: %d (%s)", si->si_code, ed.s_name); ++ } else { ++ os->print(", si_code: %d (unknown)", si->si_code); ++ } ++ ++ if (si->si_errno) { ++ os->print(", si_errno: %d", si->si_errno); ++ } ++ ++ const int me = (int) ::getpid(); ++ const int pid = (int) si->si_pid; ++ ++ if (si->si_code == SI_USER || si->si_code == SI_QUEUE) { ++ if (IS_VALID_PID(pid) && pid != me) { ++ os->print(", sent from pid: %d (uid: %d)", pid, (int) si->si_uid); ++ } ++ } else if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL || ++ sig == SIGTRAP || sig == SIGFPE) { ++ os->print(", si_addr: " PTR_FORMAT, si->si_addr); ++#ifdef SIGPOLL ++ } else if (sig == SIGPOLL) { ++ os->print(", si_band: " PTR64_FORMAT, (uint64_t)si->si_band); ++#endif ++ } else if (sig == SIGCHLD) { ++ os->print_cr(", si_pid: %d, si_uid: %d, si_status: %d", (int) si->si_pid, si->si_uid, si->si_status); ++ } ++} ++ + os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() { + assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread"); + } +--- ./hotspot/src/os/posix/vm/os_posix.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/posix/vm/os_posix.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -34,6 +34,30 @@ + static void print_libversion_info(outputStream* st); + static void print_load_average(outputStream* st); + ++public: ++ ++ // Returns true if signal is valid. ++ static bool is_valid_signal(int sig); ++ ++ // Helper function, returns a string (e.g. "SIGILL") for a signal. ++ // Returned string is a constant. For unknown signals "UNKNOWN" is returned. ++ static const char* get_signal_name(int sig, char* out, size_t outlen); ++ ++ // Returns one-line short description of a signal set in a user provided buffer. ++ static const char* describe_signal_set_short(const sigset_t* set, char* buffer, size_t size); ++ ++ // Prints a short one-line description of a signal set. ++ static void print_signal_set_short(outputStream* st, const sigset_t* set); ++ ++ // Writes a one-line description of a combination of sigaction.sa_flags ++ // into a user provided buffer. Returns that buffer. ++ static const char* describe_sa_flags(int flags, char* buffer, size_t size); ++ ++ // Prints a one-line description of a combination of sigaction.sa_flags. ++ static void print_sa_flags(outputStream* st, int flags); ++ ++ // A POSIX conform, platform-independend siginfo print routine. ++ static void print_siginfo_brief(outputStream* os, const siginfo_t* si); + + }; + +@@ -57,4 +81,4 @@ + sigjmp_buf _jmpbuf; + }; + +-#endif ++#endif // OS_POSIX_VM_OS_POSIX_HPP +--- ./hotspot/src/os/solaris/vm/os_solaris.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/solaris/vm/os_solaris.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -415,11 +415,7 @@ + + static hrtime_t first_hrtime = 0; + static const hrtime_t hrtime_hz = 1000*1000*1000; +-const int LOCK_BUSY = 1; +-const int LOCK_FREE = 0; +-const int LOCK_INVALID = -1; + static volatile hrtime_t max_hrtime = 0; +-static volatile int max_hrtime_lock = LOCK_FREE; // Update counter with LSB as lock-in-progress + + + void os::Solaris::initialize_system_info() { +@@ -648,9 +644,6 @@ + + + void os::init_system_properties_values() { +- char arch[12]; +- sysinfo(SI_ARCHITECTURE, arch, sizeof(arch)); +- + // The next steps are taken in the product version: + // + // Obtain the JAVA_HOME value from the location of libjvm.so. +@@ -677,218 +670,174 @@ + // Important note: if the location of libjvm.so changes this + // code needs to be changed accordingly. + +- // The next few definitions allow the code to be verbatim: +-#define malloc(n) (char*)NEW_C_HEAP_ARRAY(char, (n), mtInternal) +-#define free(p) FREE_C_HEAP_ARRAY(char, p, mtInternal) +-#define getenv(n) ::getenv(n) +- ++// Base path of extensions installed on the system. ++#define SYS_EXT_DIR "/usr/jdk/packages" + #define EXTENSIONS_DIR "/lib/ext" + #define ENDORSED_DIR "/lib/endorsed" +-#define COMMON_DIR "/usr/jdk/packages" +- ++ ++ char cpu_arch[12]; ++ // Buffer that fits several sprintfs. ++ // Note that the space for the colon and the trailing null are provided ++ // by the nulls included by the sizeof operator. ++ const size_t bufsize = ++ MAX4((size_t)MAXPATHLEN, // For dll_dir & friends. ++ sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch), // invariant ld_library_path ++ (size_t)MAXPATHLEN + sizeof(EXTENSIONS_DIR) + sizeof(SYS_EXT_DIR) + sizeof(EXTENSIONS_DIR), // extensions dir ++ (size_t)MAXPATHLEN + sizeof(ENDORSED_DIR)); // endorsed dir ++ char *buf = (char *)NEW_C_HEAP_ARRAY(char, bufsize, mtInternal); ++ ++ // sysclasspath, java_home, dll_dir + { +- /* sysclasspath, java_home, dll_dir */ +- { +- char *home_path; +- char *dll_path; +- char *pslash; +- char buf[MAXPATHLEN]; +- os::jvm_path(buf, sizeof(buf)); +- +- // Found the full path to libjvm.so. +- // Now cut the path to /jre if we can. +- *(strrchr(buf, '/')) = '\0'; /* get rid of /libjvm.so */ ++ char *pslash; ++ os::jvm_path(buf, bufsize); ++ ++ // Found the full path to libjvm.so. ++ // Now cut the path to /jre if we can. ++ *(strrchr(buf, '/')) = '\0'; // Get rid of /libjvm.so. ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /{client|server|hotspot}. ++ } ++ Arguments::set_dll_dir(buf); ++ ++ if (pslash != NULL) { ++ pslash = strrchr(buf, '/'); ++ if (pslash != NULL) { ++ *pslash = '\0'; // Get rid of /. + pslash = strrchr(buf, '/'); +- if (pslash != NULL) +- *pslash = '\0'; /* get rid of /{client|server|hotspot} */ +- dll_path = malloc(strlen(buf) + 1); +- if (dll_path == NULL) +- return; +- strcpy(dll_path, buf); +- Arguments::set_dll_dir(dll_path); +- + if (pslash != NULL) { +- pslash = strrchr(buf, '/'); +- if (pslash != NULL) { +- *pslash = '\0'; /* get rid of / */ +- pslash = strrchr(buf, '/'); +- if (pslash != NULL) +- *pslash = '\0'; /* get rid of /lib */ +- } ++ *pslash = '\0'; // Get rid of /lib. + } +- +- home_path = malloc(strlen(buf) + 1); +- if (home_path == NULL) +- return; +- strcpy(home_path, buf); +- Arguments::set_java_home(home_path); +- +- if (!set_boot_path('/', ':')) +- return; ++ } + } +- +- /* +- * Where to look for native libraries +- */ +- { +- // Use dlinfo() to determine the correct java.library.path. +- // +- // If we're launched by the Java launcher, and the user +- // does not set java.library.path explicitly on the commandline, +- // the Java launcher sets LD_LIBRARY_PATH for us and unsets +- // LD_LIBRARY_PATH_32 and LD_LIBRARY_PATH_64. In this case +- // dlinfo returns LD_LIBRARY_PATH + crle settings (including +- // /usr/lib), which is exactly what we want. +- // +- // If the user does set java.library.path, it completely +- // overwrites this setting, and always has. +- // +- // If we're not launched by the Java launcher, we may +- // get here with any/all of the LD_LIBRARY_PATH[_32|64] +- // settings. Again, dlinfo does exactly what we want. +- +- Dl_serinfo _info, *info = &_info; +- Dl_serpath *path; +- char* library_path; +- char *common_path; +- int i; +- +- // determine search path count and required buffer size +- if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) { +- vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror()); ++ Arguments::set_java_home(buf); ++ set_boot_path('/', ':'); ++ } ++ ++ // Where to look for native libraries. ++ { ++ // Use dlinfo() to determine the correct java.library.path. ++ // ++ // If we're launched by the Java launcher, and the user ++ // does not set java.library.path explicitly on the commandline, ++ // the Java launcher sets LD_LIBRARY_PATH for us and unsets ++ // LD_LIBRARY_PATH_32 and LD_LIBRARY_PATH_64. In this case ++ // dlinfo returns LD_LIBRARY_PATH + crle settings (including ++ // /usr/lib), which is exactly what we want. ++ // ++ // If the user does set java.library.path, it completely ++ // overwrites this setting, and always has. ++ // ++ // If we're not launched by the Java launcher, we may ++ // get here with any/all of the LD_LIBRARY_PATH[_32|64] ++ // settings. Again, dlinfo does exactly what we want. ++ ++ Dl_serinfo info_sz, *info = &info_sz; ++ Dl_serpath *path; ++ char *library_path; ++ char *common_path = buf; ++ ++ // Determine search path count and required buffer size. ++ if (dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info) == -1) { ++ FREE_C_HEAP_ARRAY(char, buf, mtInternal); ++ vm_exit_during_initialization("dlinfo SERINFOSIZE request", dlerror()); ++ } ++ ++ // Allocate new buffer and initialize. ++ info = (Dl_serinfo*)NEW_C_HEAP_ARRAY(char, info_sz.dls_size, mtInternal); ++ info->dls_size = info_sz.dls_size; ++ info->dls_cnt = info_sz.dls_cnt; ++ ++ // Obtain search path information. ++ if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) { ++ FREE_C_HEAP_ARRAY(char, buf, mtInternal); ++ FREE_C_HEAP_ARRAY(char, info, mtInternal); ++ vm_exit_during_initialization("dlinfo SERINFO request", dlerror()); ++ } ++ ++ path = &info->dls_serpath[0]; ++ ++ // Note: Due to a legacy implementation, most of the library path ++ // is set in the launcher. This was to accomodate linking restrictions ++ // on legacy Solaris implementations (which are no longer supported). ++ // Eventually, all the library path setting will be done here. ++ // ++ // However, to prevent the proliferation of improperly built native ++ // libraries, the new path component /usr/jdk/packages is added here. ++ ++ // Determine the actual CPU architecture. ++ sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch)); ++#ifdef _LP64 ++ // If we are a 64-bit vm, perform the following translations: ++ // sparc -> sparcv9 ++ // i386 -> amd64 ++ if (strcmp(cpu_arch, "sparc") == 0) { ++ strcat(cpu_arch, "v9"); ++ } else if (strcmp(cpu_arch, "i386") == 0) { ++ strcpy(cpu_arch, "amd64"); ++ } ++#endif ++ ++ // Construct the invariant part of ld_library_path. ++ sprintf(common_path, SYS_EXT_DIR "/lib/%s", cpu_arch); ++ ++ // Struct size is more than sufficient for the path components obtained ++ // through the dlinfo() call, so only add additional space for the path ++ // components explicitly added here. ++ size_t library_path_size = info->dls_size + strlen(common_path); ++ library_path = (char *)NEW_C_HEAP_ARRAY(char, library_path_size, mtInternal); ++ library_path[0] = '\0'; ++ ++ // Construct the desired Java library path from the linker's library ++ // search path. ++ // ++ // For compatibility, it is optimal that we insert the additional path ++ // components specific to the Java VM after those components specified ++ // in LD_LIBRARY_PATH (if any) but before those added by the ld.so ++ // infrastructure. ++ if (info->dls_cnt == 0) { // Not sure this can happen, but allow for it. ++ strcpy(library_path, common_path); ++ } else { ++ int inserted = 0; ++ int i; ++ for (i = 0; i < info->dls_cnt; i++, path++) { ++ uint_t flags = path->dls_flags & LA_SER_MASK; ++ if (((flags & LA_SER_LIBPATH) == 0) && !inserted) { ++ strcat(library_path, common_path); ++ strcat(library_path, os::path_separator()); ++ inserted = 1; ++ } ++ strcat(library_path, path->dls_name); ++ strcat(library_path, os::path_separator()); + } +- +- // allocate new buffer and initialize +- info = (Dl_serinfo*)malloc(_info.dls_size); +- if (info == NULL) { +- vm_exit_out_of_memory(_info.dls_size, OOM_MALLOC_ERROR, +- "init_system_properties_values info"); +- } +- info->dls_size = _info.dls_size; +- info->dls_cnt = _info.dls_cnt; +- +- // obtain search path information +- if (dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info) == -1) { +- free(info); +- vm_exit_during_initialization("dlinfo SERINFO request", dlerror()); +- } +- +- path = &info->dls_serpath[0]; +- +- // Note: Due to a legacy implementation, most of the library path +- // is set in the launcher. This was to accomodate linking restrictions +- // on legacy Solaris implementations (which are no longer supported). +- // Eventually, all the library path setting will be done here. +- // +- // However, to prevent the proliferation of improperly built native +- // libraries, the new path component /usr/jdk/packages is added here. +- +- // Determine the actual CPU architecture. +- char cpu_arch[12]; +- sysinfo(SI_ARCHITECTURE, cpu_arch, sizeof(cpu_arch)); +-#ifdef _LP64 +- // If we are a 64-bit vm, perform the following translations: +- // sparc -> sparcv9 +- // i386 -> amd64 +- if (strcmp(cpu_arch, "sparc") == 0) +- strcat(cpu_arch, "v9"); +- else if (strcmp(cpu_arch, "i386") == 0) +- strcpy(cpu_arch, "amd64"); +-#endif +- +- // Construct the invariant part of ld_library_path. Note that the +- // space for the colon and the trailing null are provided by the +- // nulls included by the sizeof operator. +- size_t bufsize = sizeof(COMMON_DIR) + sizeof("/lib/") + strlen(cpu_arch); +- common_path = malloc(bufsize); +- if (common_path == NULL) { +- free(info); +- vm_exit_out_of_memory(bufsize, OOM_MALLOC_ERROR, +- "init_system_properties_values common_path"); +- } +- sprintf(common_path, COMMON_DIR "/lib/%s", cpu_arch); +- +- // struct size is more than sufficient for the path components obtained +- // through the dlinfo() call, so only add additional space for the path +- // components explicitly added here. +- bufsize = info->dls_size + strlen(common_path); +- library_path = malloc(bufsize); +- if (library_path == NULL) { +- free(info); +- free(common_path); +- vm_exit_out_of_memory(bufsize, OOM_MALLOC_ERROR, +- "init_system_properties_values library_path"); +- } +- library_path[0] = '\0'; +- +- // Construct the desired Java library path from the linker's library +- // search path. +- // +- // For compatibility, it is optimal that we insert the additional path +- // components specific to the Java VM after those components specified +- // in LD_LIBRARY_PATH (if any) but before those added by the ld.so +- // infrastructure. +- if (info->dls_cnt == 0) { // Not sure this can happen, but allow for it +- strcpy(library_path, common_path); +- } else { +- int inserted = 0; +- for (i = 0; i < info->dls_cnt; i++, path++) { +- uint_t flags = path->dls_flags & LA_SER_MASK; +- if (((flags & LA_SER_LIBPATH) == 0) && !inserted) { +- strcat(library_path, common_path); +- strcat(library_path, os::path_separator()); +- inserted = 1; +- } +- strcat(library_path, path->dls_name); +- strcat(library_path, os::path_separator()); +- } +- // eliminate trailing path separator +- library_path[strlen(library_path)-1] = '\0'; +- } +- +- // happens before argument parsing - can't use a trace flag +- // tty->print_raw("init_system_properties_values: native lib path: "); +- // tty->print_raw_cr(library_path); +- +- // callee copies into its own buffer +- Arguments::set_library_path(library_path); +- +- free(common_path); +- free(library_path); +- free(info); ++ // Eliminate trailing path separator. ++ library_path[strlen(library_path)-1] = '\0'; + } + +- /* +- * Extensions directories. +- * +- * Note that the space for the colon and the trailing null are provided +- * by the nulls included by the sizeof operator (so actually one byte more +- * than necessary is allocated). +- */ +- { +- char *buf = (char *) malloc(strlen(Arguments::get_java_home()) + +- sizeof(EXTENSIONS_DIR) + sizeof(COMMON_DIR) + +- sizeof(EXTENSIONS_DIR)); +- sprintf(buf, "%s" EXTENSIONS_DIR ":" COMMON_DIR EXTENSIONS_DIR, +- Arguments::get_java_home()); +- Arguments::set_ext_dirs(buf); +- } +- +- /* Endorsed standards default directory. */ +- { +- char * buf = malloc(strlen(Arguments::get_java_home()) + sizeof(ENDORSED_DIR)); +- sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); +- Arguments::set_endorsed_dirs(buf); +- } +- } +- +-#undef malloc +-#undef free +-#undef getenv ++ // happens before argument parsing - can't use a trace flag ++ // tty->print_raw("init_system_properties_values: native lib path: "); ++ // tty->print_raw_cr(library_path); ++ ++ // Callee copies into its own buffer. ++ Arguments::set_library_path(library_path); ++ ++ FREE_C_HEAP_ARRAY(char, library_path, mtInternal); ++ FREE_C_HEAP_ARRAY(char, info, mtInternal); ++ } ++ ++ // Extensions directories. ++ sprintf(buf, "%s" EXTENSIONS_DIR ":" SYS_EXT_DIR EXTENSIONS_DIR, Arguments::get_java_home()); ++ Arguments::set_ext_dirs(buf); ++ ++ // Endorsed standards default directory. ++ sprintf(buf, "%s" ENDORSED_DIR, Arguments::get_java_home()); ++ Arguments::set_endorsed_dirs(buf); ++ ++ FREE_C_HEAP_ARRAY(char, buf, mtInternal); ++ ++#undef SYS_EXT_DIR + #undef EXTENSIONS_DIR + #undef ENDORSED_DIR +-#undef COMMON_DIR +- + } + + void os::breakpoint() { +@@ -1581,58 +1530,31 @@ + } + + +-// gethrtime can move backwards if read from one cpu and then a different cpu +-// getTimeNanos is guaranteed to not move backward on Solaris +-// local spinloop created as faster for a CAS on an int than +-// a CAS on a 64bit jlong. Also Atomic::cmpxchg for jlong is not +-// supported on sparc v8 or pre supports_cx8 intel boxes. +-// oldgetTimeNanos for systems which do not support CAS on 64bit jlong +-// i.e. sparc v8 and pre supports_cx8 (i486) intel boxes +-inline hrtime_t oldgetTimeNanos() { +- int gotlock = LOCK_INVALID; +- hrtime_t newtime = gethrtime(); +- +- for (;;) { +-// grab lock for max_hrtime +- int curlock = max_hrtime_lock; +- if (curlock & LOCK_BUSY) continue; +- if (gotlock = Atomic::cmpxchg(LOCK_BUSY, &max_hrtime_lock, LOCK_FREE) != LOCK_FREE) continue; +- if (newtime > max_hrtime) { +- max_hrtime = newtime; +- } else { +- newtime = max_hrtime; +- } +- // release lock +- max_hrtime_lock = LOCK_FREE; +- return newtime; +- } +-} +-// gethrtime can move backwards if read from one cpu and then a different cpu +-// getTimeNanos is guaranteed to not move backward on Solaris ++// gethrtime() should be monotonic according to the documentation, ++// but some virtualized platforms are known to break this guarantee. ++// getTimeNanos() must be guaranteed not to move backwards, so we ++// are forced to add a check here. + inline hrtime_t getTimeNanos() { +- if (VM_Version::supports_cx8()) { +- const hrtime_t now = gethrtime(); +- // Use atomic long load since 32-bit x86 uses 2 registers to keep long. +- const hrtime_t prev = Atomic::load((volatile jlong*)&max_hrtime); +- if (now <= prev) return prev; // same or retrograde time; +- const hrtime_t obsv = Atomic::cmpxchg(now, (volatile jlong*)&max_hrtime, prev); +- assert(obsv >= prev, "invariant"); // Monotonicity +- // If the CAS succeeded then we're done and return "now". +- // If the CAS failed and the observed value "obs" is >= now then +- // we should return "obs". If the CAS failed and now > obs > prv then +- // some other thread raced this thread and installed a new value, in which case +- // we could either (a) retry the entire operation, (b) retry trying to install now +- // or (c) just return obs. We use (c). No loop is required although in some cases +- // we might discard a higher "now" value in deference to a slightly lower but freshly +- // installed obs value. That's entirely benign -- it admits no new orderings compared +- // to (a) or (b) -- and greatly reduces coherence traffic. +- // We might also condition (c) on the magnitude of the delta between obs and now. +- // Avoiding excessive CAS operations to hot RW locations is critical. +- // See http://blogs.sun.com/dave/entry/cas_and_cache_trivia_invalidate +- return (prev == obsv) ? now : obsv ; +- } else { +- return oldgetTimeNanos(); +- } ++ const hrtime_t now = gethrtime(); ++ const hrtime_t prev = max_hrtime; ++ if (now <= prev) { ++ return prev; // same or retrograde time; ++ } ++ const hrtime_t obsv = Atomic::cmpxchg(now, (volatile jlong*)&max_hrtime, prev); ++ assert(obsv >= prev, "invariant"); // Monotonicity ++ // If the CAS succeeded then we're done and return "now". ++ // If the CAS failed and the observed value "obsv" is >= now then ++ // we should return "obsv". If the CAS failed and now > obsv > prv then ++ // some other thread raced this thread and installed a new value, in which case ++ // we could either (a) retry the entire operation, (b) retry trying to install now ++ // or (c) just return obsv. We use (c). No loop is required although in some cases ++ // we might discard a higher "now" value in deference to a slightly lower but freshly ++ // installed obsv value. That's entirely benign -- it admits no new orderings compared ++ // to (a) or (b) -- and greatly reduces coherence traffic. ++ // We might also condition (c) on the magnitude of the delta between obsv and now. ++ // Avoiding excessive CAS operations to hot RW locations is critical. ++ // See https://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate ++ return (prev == obsv) ? now : obsv; + } + + // Time since start-up in seconds to a fine granularity. +@@ -2143,6 +2065,10 @@ + return dlsym(handle, name); + } + ++void* os::get_default_process_handle() { ++ return (void*)::dlopen(NULL, RTLD_LAZY); ++} ++ + int os::stat(const char *path, struct stat *sbuf) { + char pathbuf[MAX_PATH]; + if (strlen(path) > MAX_PATH - 1) { +@@ -2225,8 +2151,8 @@ + st->cr(); + status = true; + } +- ::close(fd); + } ++ ::close(fd); + } + return status; + } +@@ -2244,58 +2170,12 @@ + (void) check_addr0(st); + } + +-// Taken from /usr/include/sys/machsig.h Supposed to be architecture specific +-// but they're the same for all the solaris architectures that we support. +-const char *ill_names[] = { "ILL0", "ILL_ILLOPC", "ILL_ILLOPN", "ILL_ILLADR", +- "ILL_ILLTRP", "ILL_PRVOPC", "ILL_PRVREG", +- "ILL_COPROC", "ILL_BADSTK" }; +- +-const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV", +- "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES", +- "FPE_FLTINV", "FPE_FLTSUB" }; +- +-const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" }; +- +-const char *bus_names[] = { "BUS0", "BUS_ADRALN", "BUS_ADRERR", "BUS_OBJERR" }; +- + void os::print_siginfo(outputStream* st, void* siginfo) { +- st->print("siginfo:"); +- +- const int buflen = 100; +- char buf[buflen]; +- siginfo_t *si = (siginfo_t*)siginfo; +- st->print("si_signo=%s: ", os::exception_name(si->si_signo, buf, buflen)); +- char *err = strerror(si->si_errno); +- if (si->si_errno != 0 && err != NULL) { +- st->print("si_errno=%s", err); +- } else { +- st->print("si_errno=%d", si->si_errno); +- } +- const int c = si->si_code; +- assert(c > 0, "unexpected si_code"); +- switch (si->si_signo) { +- case SIGILL: +- st->print(", si_code=%d (%s)", c, c > 8 ? "" : ill_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- case SIGFPE: +- st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- case SIGSEGV: +- st->print(", si_code=%d (%s)", c, c > 2 ? "" : segv_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- case SIGBUS: +- st->print(", si_code=%d (%s)", c, c > 3 ? "" : bus_names[c]); +- st->print(", si_addr=" PTR_FORMAT, si->si_addr); +- break; +- default: +- st->print(", si_code=%d", si->si_code); +- // no si_addr +- } +- +- if ((si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && ++ const siginfo_t* si = (const siginfo_t*)siginfo; ++ ++ os::Posix::print_siginfo_brief(st, si); ++ ++ if (si && (si->si_signo == SIGBUS || si->si_signo == SIGSEGV) && + UseSharedSpaces) { + FileMapInfo* mapinfo = FileMapInfo::current_info(); + if (mapinfo->is_in_shared_space(si->si_addr)) { +@@ -2365,7 +2245,8 @@ + st->print("[%s]", get_signal_handler_name(handler, buf, buflen)); + } + +- st->print(", sa_mask[0]=" PTR32_FORMAT, *(uint32_t*)&sa.sa_mask); ++ st->print(", sa_mask[0]="); ++ os::Posix::print_signal_set_short(st, &sa.sa_mask); + + address rh = VMError::get_resetted_sighandler(sig); + // May be, handler was resetted by VMError? +@@ -2374,7 +2255,8 @@ + sa.sa_flags = VMError::get_resetted_sigflags(sig); + } + +- st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags); ++ st->print(", sa_flags="); ++ os::Posix::print_sa_flags(st, sa.sa_flags); + + // Check: is it our handler? + if(handler == CAST_FROM_FN_PTR(address, signalHandler) || +@@ -3005,7 +2887,7 @@ + char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) { + const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE }; + const size_t types = sizeof(info_types) / sizeof(info_types[0]); +- uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT]; ++ uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT + 1]; + uint_t validity[MAX_MEMINFO_CNT]; + + size_t page_size = MAX2((size_t)os::vm_page_size(), page_expected->size); +@@ -3044,7 +2926,7 @@ + } + } + +- if (i != addrs_count) { ++ if (i < addrs_count) { + if ((validity[i] & 2) != 0) { + page_found->lgrp_id = outdata[types * i]; + } else { +@@ -3534,9 +3416,14 @@ + return os_sleep(millis, interruptible); + } + +-int os::naked_sleep() { +- // %% make the sleep time an integer flag. for now use 1 millisec. +- return os_sleep(1, false); ++void os::naked_short_sleep(jlong ms) { ++ assert(ms < 1000, "Un-interruptable sleep, short time use only"); ++ ++ // usleep is deprecated and removed from POSIX, in favour of nanosleep, but ++ // Solaris requires -lrt for this. ++ usleep((ms * 1000)); ++ ++ return; + } + + // Sleep forever; naked call to OS-specific sleep; use with CAUTION +--- ./hotspot/src/os/solaris/vm/os_solaris.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/solaris/vm/os_solaris.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -27,6 +27,9 @@ + + // Solaris_OS defines the interface to Solaris operating systems + ++// Information about the protection of the page at address '0' on this os. ++static bool zero_page_read_protected() { return true; } ++ + class Solaris { + friend class os; + +--- ./hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -431,10 +431,12 @@ + + RESTARTABLE(::read(fd, addr, remaining), result); + if (result == OS_ERR) { ++ ::close(fd); + THROW_MSG_0(vmSymbols::java_io_IOException(), "Read error"); ++ } else { ++ remaining-=result; ++ addr+=result; + } +- remaining-=result; +- addr+=result; + } + + ::close(fd); +@@ -906,8 +908,16 @@ + FREE_C_HEAP_ARRAY(char, filename, mtInternal); + + // open the shared memory file for the give vmid +- fd = open_sharedmem_file(rfilename, file_flags, CHECK); +- assert(fd != OS_ERR, "unexpected value"); ++ fd = open_sharedmem_file(rfilename, file_flags, THREAD); ++ ++ if (fd == OS_ERR) { ++ return; ++ } ++ ++ if (HAS_PENDING_EXCEPTION) { ++ ::close(fd); ++ return; ++ } + + if (*sizep == 0) { + size = sharedmem_filesize(fd, CHECK); +--- ./hotspot/src/os/windows/vm/os_windows.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/windows/vm/os_windows.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -2427,6 +2427,12 @@ + } + } + ++ if ((exception_code == EXCEPTION_ACCESS_VIOLATION) && ++ VM_Version::is_cpuinfo_segv_addr(pc)) { ++ // Verify that OS save/restore AVX registers. ++ return Handle_Exception(exceptionInfo, VM_Version::cpuinfo_cont_addr()); ++ } ++ + if (t != NULL && t->is_Java_thread()) { + JavaThread* thread = (JavaThread*) t; + bool in_java = thread->thread_state() == _thread_in_Java; +@@ -2700,7 +2706,6 @@ + } + #endif + +-#ifndef PRODUCT + void os::win32::call_test_func_with_wrapper(void (*funcPtr)(void)) { + // Install a win32 structured exception handler around the test + // function call so the VM can generate an error dump if needed. +@@ -2711,7 +2716,6 @@ + // Nothing to do. + } + } +-#endif + + // Virtual Memory + +@@ -3486,6 +3490,16 @@ + return result; + } + ++// ++// Short sleep, direct OS call. ++// ++// ms = 0, means allow others (if any) to run. ++// ++void os::naked_short_sleep(jlong ms) { ++ assert(ms < 1000, "Un-interruptable sleep, short time use only"); ++ Sleep(ms); ++} ++ + // Sleep forever; naked call to OS-specific sleep; use with CAUTION + void os::infinite_sleep() { + while (true) { // sleep forever ... +@@ -3613,13 +3627,14 @@ + "possibility of dangling Thread pointer"); + + OSThread* osthread = thread->osthread(); +- bool interrupted = osthread->interrupted(); + // There is no synchronization between the setting of the interrupt + // and it being cleared here. It is critical - see 6535709 - that + // we only clear the interrupt state, and reset the interrupt event, + // if we are going to report that we were indeed interrupted - else + // an interrupt can be "lost", leading to spurious wakeups or lost wakeups +- // depending on the timing ++ // depending on the timing. By checking thread interrupt event to see ++ // if the thread gets real interrupt thus prevent spurious wakeup. ++ bool interrupted = osthread->interrupted() && (WaitForSingleObject(osthread->interrupt_event(), 0) == WAIT_OBJECT_0); + if (interrupted && clear_interrupted) { + osthread->set_interrupted(false); + ResetEvent(osthread->interrupt_event()); +--- ./hotspot/src/os/windows/vm/os_windows.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/windows/vm/os_windows.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -26,6 +26,9 @@ + #define OS_WINDOWS_VM_OS_WINDOWS_HPP + // Win32_OS defines the interface to windows operating systems + ++// Information about the protection of the page at address '0' on this os. ++static bool zero_page_read_protected() { return true; } ++ + class win32 { + friend class os; + +@@ -94,9 +97,7 @@ + static address fast_jni_accessor_wrapper(BasicType); + #endif + +-#ifndef PRODUCT + static void call_test_func_with_wrapper(void (*funcPtr)(void)); +-#endif + + // filter function to ignore faults on serializations page + static LONG WINAPI serialize_fault_filter(struct _EXCEPTION_POINTERS* e); +--- ./hotspot/src/os/windows/vm/os_windows.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os/windows/vm/os_windows.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -107,9 +107,7 @@ + return ::close(fd); + } + +-#ifndef PRODUCT +- #define CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED(f) \ +- os::win32::call_test_func_with_wrapper(f) +-#endif ++#define CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED(f) \ ++ os::win32::call_test_func_with_wrapper(f) + + #endif // OS_WINDOWS_VM_OS_WINDOWS_INLINE_HPP +--- ./hotspot/src/os_cpu/aix_ppc/vm/atomic_aix_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/atomic_aix_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,401 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_AIX_OJDKPPC_VM_ATOMIC_AIX_PPC_INLINE_HPP ++#define OS_CPU_AIX_OJDKPPC_VM_ATOMIC_AIX_PPC_INLINE_HPP ++ ++#include "orderAccess_aix_ppc.inline.hpp" ++#include "runtime/atomic.hpp" ++#include "runtime/os.hpp" ++#include "vm_version_ppc.hpp" ++ ++#ifndef _LP64 ++#error "Atomic currently only impleneted for PPC64" ++#endif ++ ++// Implementation of class atomic ++ ++inline void Atomic::store (jbyte store_value, jbyte* dest) { *dest = store_value; } ++inline void Atomic::store (jshort store_value, jshort* dest) { *dest = store_value; } ++inline void Atomic::store (jint store_value, jint* dest) { *dest = store_value; } ++inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; } ++inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) { *dest = store_value; } ++inline void Atomic::store_ptr(void* store_value, void* dest) { *(void**)dest = store_value; } ++ ++inline void Atomic::store (jbyte store_value, volatile jbyte* dest) { *dest = store_value; } ++inline void Atomic::store (jshort store_value, volatile jshort* dest) { *dest = store_value; } ++inline void Atomic::store (jint store_value, volatile jint* dest) { *dest = store_value; } ++inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; } ++inline void Atomic::store_ptr(intptr_t store_value, volatile intptr_t* dest) { *dest = store_value; } ++inline void Atomic::store_ptr(void* store_value, volatile void* dest) { *(void* volatile *)dest = store_value; } ++ ++inline jlong Atomic::load(volatile jlong* src) { return *src; } ++ ++// ++// machine barrier instructions: ++// ++// - ppc_sync two-way memory barrier, aka fence ++// - ppc_lwsync orders Store|Store, ++// Load|Store, ++// Load|Load, ++// but not Store|Load ++// - ppc_eieio orders memory accesses for device memory (only) ++// - ppc_isync invalidates speculatively executed instructions ++// From the POWER ISA 2.06 documentation: ++// "[...] an isync instruction prevents the execution of ++// instructions following the isync until instructions ++// preceding the isync have completed, [...]" ++// From IBM's AIX assembler reference: ++// "The isync [...] instructions causes the processor to ++// refetch any instructions that might have been fetched ++// prior to the isync instruction. The instruction isync ++// causes the processor to wait for all previous instructions ++// to complete. Then any instructions already fetched are ++// discarded and instruction processing continues in the ++// environment established by the previous instructions." ++// ++// semantic barrier instructions: ++// (as defined in orderAccess.hpp) ++// ++// - ppc_release orders Store|Store, (maps to ppc_lwsync) ++// Load|Store ++// - ppc_acquire orders Load|Store, (maps to ppc_lwsync) ++// Load|Load ++// - ppc_fence orders Store|Store, (maps to ppc_sync) ++// Load|Store, ++// Load|Load, ++// Store|Load ++// ++ ++#define strasm_sync "\n sync \n" ++#define strasm_lwsync "\n lwsync \n" ++#define strasm_isync "\n isync \n" ++#define strasm_release strasm_lwsync ++#define strasm_acquire strasm_lwsync ++#define strasm_fence strasm_sync ++#define strasm_nobarrier "" ++#define strasm_nobarrier_clobber_memory "" ++ ++inline jint Atomic::add (jint add_value, volatile jint* dest) { ++ ++ unsigned int result; ++ ++ __asm__ __volatile__ ( ++ strasm_lwsync ++ "1: lwarx %0, 0, %2 \n" ++ " add %0, %0, %1 \n" ++ " stwcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_isync ++ : /*%0*/"=&r" (result) ++ : /*%1*/"r" (add_value), /*%2*/"r" (dest) ++ : "cc", "memory" ); ++ ++ return (jint) result; ++} ++ ++ ++inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) { ++ ++ long result; ++ ++ __asm__ __volatile__ ( ++ strasm_lwsync ++ "1: ldarx %0, 0, %2 \n" ++ " add %0, %0, %1 \n" ++ " stdcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_isync ++ : /*%0*/"=&r" (result) ++ : /*%1*/"r" (add_value), /*%2*/"r" (dest) ++ : "cc", "memory" ); ++ ++ return (intptr_t) result; ++} ++ ++inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) { ++ return (void*)add_ptr(add_value, (volatile intptr_t*)dest); ++} ++ ++ ++inline void Atomic::inc (volatile jint* dest) { ++ ++ unsigned int temp; ++ ++ __asm__ __volatile__ ( ++ strasm_nobarrier ++ "1: lwarx %0, 0, %2 \n" ++ " addic %0, %0, 1 \n" ++ " stwcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_nobarrier ++ : /*%0*/"=&r" (temp), "=m" (*dest) ++ : /*%2*/"r" (dest), "m" (*dest) ++ : "cc" strasm_nobarrier_clobber_memory); ++ ++} ++ ++inline void Atomic::inc_ptr(volatile intptr_t* dest) { ++ ++ long temp; ++ ++ __asm__ __volatile__ ( ++ strasm_nobarrier ++ "1: ldarx %0, 0, %2 \n" ++ " addic %0, %0, 1 \n" ++ " stdcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_nobarrier ++ : /*%0*/"=&r" (temp), "=m" (*dest) ++ : /*%2*/"r" (dest), "m" (*dest) ++ : "cc" strasm_nobarrier_clobber_memory); ++ ++} ++ ++inline void Atomic::inc_ptr(volatile void* dest) { ++ inc_ptr((volatile intptr_t*)dest); ++} ++ ++ ++inline void Atomic::dec (volatile jint* dest) { ++ ++ unsigned int temp; ++ ++ __asm__ __volatile__ ( ++ strasm_nobarrier ++ "1: lwarx %0, 0, %2 \n" ++ " addic %0, %0, -1 \n" ++ " stwcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_nobarrier ++ : /*%0*/"=&r" (temp), "=m" (*dest) ++ : /*%2*/"r" (dest), "m" (*dest) ++ : "cc" strasm_nobarrier_clobber_memory); ++ ++} ++ ++inline void Atomic::dec_ptr(volatile intptr_t* dest) { ++ ++ long temp; ++ ++ __asm__ __volatile__ ( ++ strasm_nobarrier ++ "1: ldarx %0, 0, %2 \n" ++ " addic %0, %0, -1 \n" ++ " stdcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_nobarrier ++ : /*%0*/"=&r" (temp), "=m" (*dest) ++ : /*%2*/"r" (dest), "m" (*dest) ++ : "cc" strasm_nobarrier_clobber_memory); ++ ++} ++ ++inline void Atomic::dec_ptr(volatile void* dest) { ++ dec_ptr((volatile intptr_t*)dest); ++} ++ ++inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) { ++ ++ // Note that xchg_ptr doesn't necessarily do an acquire ++ // (see synchronizer.cpp). ++ ++ unsigned int old_value; ++ const uint64_t zero = 0; ++ ++ __asm__ __volatile__ ( ++ /* lwsync */ ++ strasm_lwsync ++ /* atomic loop */ ++ "1: \n" ++ " lwarx %[old_value], %[dest], %[zero] \n" ++ " stwcx. %[exchange_value], %[dest], %[zero] \n" ++ " bne- 1b \n" ++ /* isync */ ++ strasm_sync ++ /* exit */ ++ "2: \n" ++ /* out */ ++ : [old_value] "=&r" (old_value), ++ "=m" (*dest) ++ /* in */ ++ : [dest] "b" (dest), ++ [zero] "r" (zero), ++ [exchange_value] "r" (exchange_value), ++ "m" (*dest) ++ /* clobber */ ++ : "cc", ++ "memory" ++ ); ++ ++ return (jint) old_value; ++} ++ ++inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) { ++ ++ // Note that xchg_ptr doesn't necessarily do an acquire ++ // (see synchronizer.cpp). ++ ++ long old_value; ++ const uint64_t zero = 0; ++ ++ __asm__ __volatile__ ( ++ /* lwsync */ ++ strasm_lwsync ++ /* atomic loop */ ++ "1: \n" ++ " ldarx %[old_value], %[dest], %[zero] \n" ++ " stdcx. %[exchange_value], %[dest], %[zero] \n" ++ " bne- 1b \n" ++ /* isync */ ++ strasm_sync ++ /* exit */ ++ "2: \n" ++ /* out */ ++ : [old_value] "=&r" (old_value), ++ "=m" (*dest) ++ /* in */ ++ : [dest] "b" (dest), ++ [zero] "r" (zero), ++ [exchange_value] "r" (exchange_value), ++ "m" (*dest) ++ /* clobber */ ++ : "cc", ++ "memory" ++ ); ++ ++ return (intptr_t) old_value; ++} ++ ++inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) { ++ return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest); ++} ++ ++inline jint Atomic::cmpxchg(jint exchange_value, volatile jint* dest, jint compare_value) { ++ ++ // Note that cmpxchg guarantees a two-way memory barrier across ++ // the cmpxchg, so it's really a a 'fence_cmpxchg_acquire' ++ // (see atomic.hpp). ++ ++ unsigned int old_value; ++ const uint64_t zero = 0; ++ ++ __asm__ __volatile__ ( ++ /* fence */ ++ strasm_sync ++ /* simple guard */ ++ " lwz %[old_value], 0(%[dest]) \n" ++ " cmpw %[compare_value], %[old_value] \n" ++ " bne- 2f \n" ++ /* atomic loop */ ++ "1: \n" ++ " lwarx %[old_value], %[dest], %[zero] \n" ++ " cmpw %[compare_value], %[old_value] \n" ++ " bne- 2f \n" ++ " stwcx. %[exchange_value], %[dest], %[zero] \n" ++ " bne- 1b \n" ++ /* acquire */ ++ strasm_sync ++ /* exit */ ++ "2: \n" ++ /* out */ ++ : [old_value] "=&r" (old_value), ++ "=m" (*dest) ++ /* in */ ++ : [dest] "b" (dest), ++ [zero] "r" (zero), ++ [compare_value] "r" (compare_value), ++ [exchange_value] "r" (exchange_value), ++ "m" (*dest) ++ /* clobber */ ++ : "cc", ++ "memory" ++ ); ++ ++ return (jint) old_value; ++} ++ ++inline jlong Atomic::cmpxchg(jlong exchange_value, volatile jlong* dest, jlong compare_value) { ++ ++ // Note that cmpxchg guarantees a two-way memory barrier across ++ // the cmpxchg, so it's really a a 'fence_cmpxchg_acquire' ++ // (see atomic.hpp). ++ ++ long old_value; ++ const uint64_t zero = 0; ++ ++ __asm__ __volatile__ ( ++ /* fence */ ++ strasm_sync ++ /* simple guard */ ++ " ld %[old_value], 0(%[dest]) \n" ++ " cmpd %[compare_value], %[old_value] \n" ++ " bne- 2f \n" ++ /* atomic loop */ ++ "1: \n" ++ " ldarx %[old_value], %[dest], %[zero] \n" ++ " cmpd %[compare_value], %[old_value] \n" ++ " bne- 2f \n" ++ " stdcx. %[exchange_value], %[dest], %[zero] \n" ++ " bne- 1b \n" ++ /* acquire */ ++ strasm_sync ++ /* exit */ ++ "2: \n" ++ /* out */ ++ : [old_value] "=&r" (old_value), ++ "=m" (*dest) ++ /* in */ ++ : [dest] "b" (dest), ++ [zero] "r" (zero), ++ [compare_value] "r" (compare_value), ++ [exchange_value] "r" (exchange_value), ++ "m" (*dest) ++ /* clobber */ ++ : "cc", ++ "memory" ++ ); ++ ++ return (jlong) old_value; ++} ++ ++inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) { ++ return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value); ++} ++ ++inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) { ++ return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value); ++} ++ ++#undef strasm_sync ++#undef strasm_lwsync ++#undef strasm_isync ++#undef strasm_release ++#undef strasm_acquire ++#undef strasm_fence ++#undef strasm_nobarrier ++#undef strasm_nobarrier_clobber_memory ++ ++#endif // OS_CPU_AIX_OJDKPPC_VM_ATOMIC_AIX_PPC_INLINE_HPP +--- ./hotspot/src/os_cpu/aix_ppc/vm/globals_aix_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/globals_aix_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,54 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_AIX_OJDKPPC_VM_GLOBALS_AIX_PPC_HPP ++#define OS_CPU_AIX_OJDKPPC_VM_GLOBALS_AIX_PPC_HPP ++ ++// Sets the default values for platform dependent flags used by the runtime system. ++// (see globals.hpp) ++ ++define_pd_global(bool, DontYieldALot, false); ++define_pd_global(intx, ThreadStackSize, 2048); // 0 => use system default ++define_pd_global(intx, VMThreadStackSize, 2048); ++ ++// if we set CompilerThreadStackSize to a value different than 0, it will ++// be used in os::create_thread(). Otherwise, due the strange logic in os::create_thread(), ++// the stack size for compiler threads will default to VMThreadStackSize, although it ++// is defined to 4M in os::Aix::default_stack_size()! ++define_pd_global(intx, CompilerThreadStackSize, 4096); ++ ++// Allow extra space in DEBUG builds for asserts. ++define_pd_global(uintx,JVMInvokeMethodSlack, 8192); ++ ++define_pd_global(intx, StackYellowPages, 6); ++define_pd_global(intx, StackRedPages, 1); ++define_pd_global(intx, StackShadowPages, 6 DEBUG_ONLY(+2)); ++ ++// Only used on 64 bit platforms ++define_pd_global(uintx,HeapBaseMinAddress, 2*G); ++// Only used on 64 bit Windows platforms ++define_pd_global(bool, UseVectoredExceptions, false); ++ ++#endif // OS_CPU_AIX_OJDKPPC_VM_GLOBALS_AIX_PPC_HPP +--- ./hotspot/src/os_cpu/aix_ppc/vm/orderAccess_aix_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/orderAccess_aix_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,147 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_AIX_OJDKPPC_VM_ORDERACCESS_AIX_PPC_INLINE_HPP ++#define OS_CPU_AIX_OJDKPPC_VM_ORDERACCESS_AIX_PPC_INLINE_HPP ++ ++#include "runtime/orderAccess.hpp" ++#include "vm_version_ppc.hpp" ++ ++// Implementation of class OrderAccess. ++ ++// ++// Machine barrier instructions: ++// ++// - sync Two-way memory barrier, aka fence. ++// - lwsync orders Store|Store, ++// Load|Store, ++// Load|Load, ++// but not Store|Load ++// - eieio orders Store|Store ++// - isync Invalidates speculatively executed instructions, ++// but isync may complete before storage accesses ++// associated with instructions preceding isync have ++// been performed. ++// ++// Semantic barrier instructions: ++// (as defined in orderAccess.hpp) ++// ++// - release orders Store|Store, (maps to lwsync) ++// Load|Store ++// - acquire orders Load|Store, (maps to lwsync) ++// Load|Load ++// - fence orders Store|Store, (maps to sync) ++// Load|Store, ++// Load|Load, ++// Store|Load ++// ++ ++#define inlasm_sync() __asm__ __volatile__ ("sync" : : : "memory"); ++#define inlasm_lwsync() __asm__ __volatile__ ("lwsync" : : : "memory"); ++#define inlasm_eieio() __asm__ __volatile__ ("eieio" : : : "memory"); ++#define inlasm_isync() __asm__ __volatile__ ("isync" : : : "memory"); ++#define inlasm_release() inlasm_lwsync(); ++#define inlasm_acquire() inlasm_lwsync(); ++// Use twi-isync for load_acquire (faster than lwsync). ++// ATTENTION: seems like xlC 10.1 has problems with this inline assembler macro (VerifyMethodHandles found "bad vminfo in AMH.conv"): ++// #define inlasm_acquire_reg(X) __asm__ __volatile__ ("twi 0,%0,0\n isync\n" : : "r" (X) : "memory"); ++#define inlasm_acquire_reg(X) inlasm_lwsync(); ++#define inlasm_fence() inlasm_sync(); ++ ++inline void OrderAccess::loadload() { inlasm_lwsync(); } ++inline void OrderAccess::storestore() { inlasm_lwsync(); } ++inline void OrderAccess::loadstore() { inlasm_lwsync(); } ++inline void OrderAccess::storeload() { inlasm_fence(); } ++ ++inline void OrderAccess::acquire() { inlasm_acquire(); } ++inline void OrderAccess::release() { inlasm_release(); } ++inline void OrderAccess::fence() { inlasm_fence(); } ++ ++inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { register jbyte t = *p; inlasm_acquire_reg(t); return t; } ++inline jshort OrderAccess::load_acquire(volatile jshort* p) { register jshort t = *p; inlasm_acquire_reg(t); return t; } ++inline jint OrderAccess::load_acquire(volatile jint* p) { register jint t = *p; inlasm_acquire_reg(t); return t; } ++inline jlong OrderAccess::load_acquire(volatile jlong* p) { register jlong t = *p; inlasm_acquire_reg(t); return t; } ++inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { register jubyte t = *p; inlasm_acquire_reg(t); return t; } ++inline jushort OrderAccess::load_acquire(volatile jushort* p) { register jushort t = *p; inlasm_acquire_reg(t); return t; } ++inline juint OrderAccess::load_acquire(volatile juint* p) { register juint t = *p; inlasm_acquire_reg(t); return t; } ++inline julong OrderAccess::load_acquire(volatile julong* p) { return (julong)load_acquire((volatile jlong*)p); } ++inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { register jfloat t = *p; inlasm_acquire(); return t; } ++inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { register jdouble t = *p; inlasm_acquire(); return t; } ++ ++inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return (intptr_t)load_acquire((volatile jlong*)p); } ++inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return (void*) load_acquire((volatile jlong*)p); } ++inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return (void*) load_acquire((volatile jlong*)p); } ++ ++inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jshort* p, jshort v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jint* p, jint v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jlong* p, jlong v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jushort* p, jushort v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile juint* p, juint v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile julong* p, julong v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { inlasm_release(); *p = v; } ++ ++inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { inlasm_release(); *(void* volatile *)p = v; } ++ ++inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jlong* p, jlong v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(julong* p, julong v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; inlasm_fence(); } ++ ++inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; inlasm_fence(); } ++ ++inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { inlasm_release(); *p = v; inlasm_fence(); } ++ ++inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { inlasm_release(); *(void* volatile *)p = v; inlasm_fence(); } ++ ++#undef inlasm_sync ++#undef inlasm_lwsync ++#undef inlasm_eieio ++#undef inlasm_isync ++#undef inlasm_release ++#undef inlasm_acquire ++#undef inlasm_fence ++ ++#endif // OS_CPU_AIX_OJDKPPC_VM_ORDERACCESS_AIX_PPC_INLINE_HPP +--- ./hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,565 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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. ++ * ++ */ ++ ++// no precompiled headers ++#include "assembler_ppc.inline.hpp" ++#include "classfile/classLoader.hpp" ++#include "classfile/systemDictionary.hpp" ++#include "classfile/vmSymbols.hpp" ++#include "code/icBuffer.hpp" ++#include "code/vtableStubs.hpp" ++#include "interpreter/interpreter.hpp" ++#include "jvm_aix.h" ++#include "memory/allocation.inline.hpp" ++#include "mutex_aix.inline.hpp" ++#include "nativeInst_ppc.hpp" ++#include "os_share_aix.hpp" ++#include "prims/jniFastGetField.hpp" ++#include "prims/jvm.h" ++#include "prims/jvm_misc.hpp" ++#include "runtime/arguments.hpp" ++#include "runtime/extendedPC.hpp" ++#include "runtime/frame.inline.hpp" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/java.hpp" ++#include "runtime/javaCalls.hpp" ++#include "runtime/mutexLocker.hpp" ++#include "runtime/osThread.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "runtime/thread.inline.hpp" ++#include "runtime/timer.hpp" ++#include "utilities/events.hpp" ++#include "utilities/vmError.hpp" ++#ifdef COMPILER1 ++#include "c1/c1_Runtime1.hpp" ++#endif ++#ifdef COMPILER2 ++#include "opto/runtime.hpp" ++#endif ++ ++// put OS-includes here ++# include ++ ++address os::current_stack_pointer() { ++ address csp; ++ ++#if !defined(USE_XLC_BUILTINS) ++ // inline assembly for `mr regno(csp), R1_SP': ++ __asm__ __volatile__ ("mr %0, 1":"=r"(csp):); ++#else ++ csp = (address) __builtin_frame_address(0); ++#endif ++ ++ return csp; ++} ++ ++char* os::non_memory_address_word() { ++ // Must never look like an address returned by reserve_memory, ++ // even in its subfields (as defined by the CPU immediate fields, ++ // if the CPU splits constants across multiple instructions). ++ ++ return (char*) -1; ++} ++ ++// OS specific thread initialization ++// ++// Calculate and store the limits of the memory stack. ++void os::initialize_thread(Thread *thread) { } ++ ++// Frame information (pc, sp, fp) retrieved via ucontext ++// always looks like a C-frame according to the frame ++// conventions in frame_ppc64.hpp. ++address os::Aix::ucontext_get_pc(ucontext_t * uc) { ++ return (address)uc->uc_mcontext.jmp_context.iar; ++} ++ ++intptr_t* os::Aix::ucontext_get_sp(ucontext_t * uc) { ++ // gpr1 holds the stack pointer on aix ++ return (intptr_t*)uc->uc_mcontext.jmp_context.gpr[1/*REG_SP*/]; ++} ++ ++intptr_t* os::Aix::ucontext_get_fp(ucontext_t * uc) { ++ return NULL; ++} ++ ++void os::Aix::ucontext_set_pc(ucontext_t* uc, address new_pc) { ++ uc->uc_mcontext.jmp_context.iar = (uint64_t) new_pc; ++} ++ ++ExtendedPC os::fetch_frame_from_context(void* ucVoid, ++ intptr_t** ret_sp, intptr_t** ret_fp) { ++ ++ ExtendedPC epc; ++ ucontext_t* uc = (ucontext_t*)ucVoid; ++ ++ if (uc != NULL) { ++ epc = ExtendedPC(os::Aix::ucontext_get_pc(uc)); ++ if (ret_sp) *ret_sp = os::Aix::ucontext_get_sp(uc); ++ if (ret_fp) *ret_fp = os::Aix::ucontext_get_fp(uc); ++ } else { ++ // construct empty ExtendedPC for return value checking ++ epc = ExtendedPC(NULL); ++ if (ret_sp) *ret_sp = (intptr_t *)NULL; ++ if (ret_fp) *ret_fp = (intptr_t *)NULL; ++ } ++ ++ return epc; ++} ++ ++frame os::fetch_frame_from_context(void* ucVoid) { ++ intptr_t* sp; ++ intptr_t* fp; ++ ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp); ++ // Avoid crash during crash if pc broken. ++ if (epc.pc()) { ++ frame fr(sp, epc.pc()); ++ return fr; ++ } ++ frame fr(sp); ++ return fr; ++} ++ ++frame os::get_sender_for_C_frame(frame* fr) { ++ if (*fr->sp() == NULL) { ++ // fr is the last C frame ++ return frame(NULL, NULL); ++ } ++ return frame(fr->sender_sp(), fr->sender_pc()); ++} ++ ++ ++frame os::current_frame() { ++ intptr_t* csp = (intptr_t*) *((intptr_t*) os::current_stack_pointer()); ++ // hack. ++ frame topframe(csp, (address)0x8); ++ // return sender of current topframe which hopefully has pc != NULL. ++ return os::get_sender_for_C_frame(&topframe); ++} ++ ++// Utility functions ++ ++extern "C" JNIEXPORT int ++JVM_handle_aix_signal(int sig, siginfo_t* info, void* ucVoid, int abort_if_unrecognized) { ++ ++ ucontext_t* uc = (ucontext_t*) ucVoid; ++ ++ Thread* t = ThreadLocalStorage::get_thread_slow(); // slow & steady ++ ++ SignalHandlerMark shm(t); ++ ++ // Note: it's not uncommon that JNI code uses signal/sigset to install ++ // then restore certain signal handler (e.g. to temporarily block SIGPIPE, ++ // or have a SIGILL handler when detecting CPU type). When that happens, ++ // JVM_handle_aix_signal() might be invoked with junk info/ucVoid. To ++ // avoid unnecessary crash when libjsig is not preloaded, try handle signals ++ // that do not require siginfo/ucontext first. ++ ++ if (sig == SIGPIPE) { ++ if (os::Aix::chained_handler(sig, info, ucVoid)) { ++ return 1; ++ } else { ++ if (PrintMiscellaneous && (WizardMode || Verbose)) { ++ warning("Ignoring SIGPIPE - see bug 4229104"); ++ } ++ return 1; ++ } ++ } ++ ++ JavaThread* thread = NULL; ++ VMThread* vmthread = NULL; ++ if (os::Aix::signal_handlers_are_installed) { ++ if (t != NULL) { ++ if(t->is_Java_thread()) { ++ thread = (JavaThread*)t; ++ } ++ else if(t->is_VM_thread()) { ++ vmthread = (VMThread *)t; ++ } ++ } ++ } ++ ++ // Decide if this trap can be handled by a stub. ++ address stub = NULL; ++ ++ // retrieve program counter ++ address const pc = uc ? os::Aix::ucontext_get_pc(uc) : NULL; ++ ++ // retrieve crash address ++ address const addr = info ? (const address) info->si_addr : NULL; ++ ++ // SafeFetch 32 handling: ++ // - make it work if _thread is null ++ // - make it use the standard os::...::ucontext_get/set_pc APIs ++ if (uc) { ++ address const pc = os::Aix::ucontext_get_pc(uc); ++ if (pc && StubRoutines::is_safefetch_fault(pc)) { ++ os::Aix::ucontext_set_pc(uc, StubRoutines::continuation_for_safefetch_fault(pc)); ++ return true; ++ } ++ } ++ ++ // Handle SIGDANGER right away. AIX would raise SIGDANGER whenever available swap ++ // space falls below 30%. This is only a chance for the process to gracefully abort. ++ // We can't hope to proceed after SIGDANGER since SIGKILL tailgates. ++ if (sig == SIGDANGER) { ++ goto report_and_die; ++ } ++ ++ if (info == NULL || uc == NULL || thread == NULL && vmthread == NULL) { ++ goto run_chained_handler; ++ } ++ ++ // If we are a java thread... ++ if (thread != NULL) { ++ ++ // Handle ALL stack overflow variations here ++ if (sig == SIGSEGV && (addr < thread->stack_base() && ++ addr >= thread->stack_base() - thread->stack_size())) { ++ // stack overflow ++ // ++ // If we are in a yellow zone and we are inside java, we disable the yellow zone and ++ // throw a stack overflow exception. ++ // If we are in native code or VM C code, we report-and-die. The original coding tried ++ // to continue with yellow zone disabled, but that doesn't buy us much and prevents ++ // hs_err_pid files. ++ if (thread->in_stack_yellow_zone(addr)) { ++ thread->disable_stack_yellow_zone(); ++ if (thread->thread_state() == _thread_in_Java) { ++ // Throw a stack overflow exception. ++ // Guard pages will be reenabled while unwinding the stack. ++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW); ++ goto run_stub; ++ } else { ++ // Thread was in the vm or native code. Return and try to finish. ++ return 1; ++ } ++ } else if (thread->in_stack_red_zone(addr)) { ++ // Fatal red zone violation. Disable the guard pages and fall through ++ // to handle_unexpected_exception way down below. ++ thread->disable_stack_red_zone(); ++ tty->print_raw_cr("An irrecoverable stack overflow has occurred."); ++ goto report_and_die; ++ } else { ++ // This means a segv happened inside our stack, but not in ++ // the guarded zone. I'd like to know when this happens, ++ tty->print_raw_cr("SIGSEGV happened inside stack but outside yellow and red zone."); ++ goto report_and_die; ++ } ++ ++ } // end handle SIGSEGV inside stack boundaries ++ ++ if (thread->thread_state() == _thread_in_Java) { ++ // Java thread running in Java code ++ ++ // The following signals are used for communicating VM events: ++ // ++ // SIGILL: the compiler generates illegal opcodes ++ // at places where it wishes to interrupt the VM: ++ // Safepoints, Unreachable Code, Entry points of Zombie methods, ++ // This results in a SIGILL with (*pc) == inserted illegal instruction. ++ // ++ // (so, SIGILLs with a pc inside the zero page are real errors) ++ // ++ // SIGTRAP: ++ // The ppc trap instruction raises a SIGTRAP and is very efficient if it ++ // does not trap. It is used for conditional branches that are expected ++ // to be never taken. These are: ++ // - zombie methods ++ // - IC (inline cache) misses. ++ // - null checks leading to UncommonTraps. ++ // - range checks leading to Uncommon Traps. ++ // On Aix, these are especially null checks, as the ImplicitNullCheck ++ // optimization works only in rare cases, as the page at address 0 is only ++ // write protected. // ++ // Note: !UseSIGTRAP is used to prevent SIGTRAPS altogether, to facilitate debugging. ++ // ++ // SIGSEGV: ++ // used for safe point polling: ++ // To notify all threads that they have to reach a safe point, safe point polling is used: ++ // All threads poll a certain mapped memory page. Normally, this page has read access. ++ // If the VM wants to inform the threads about impending safe points, it puts this ++ // page to read only ("poisens" the page), and the threads then reach a safe point. ++ // used for null checks: ++ // If the compiler finds a store it uses it for a null check. Unfortunately this ++ // happens rarely. In heap based and disjoint base compressd oop modes also loads ++ // are used for null checks. ++ ++ // A VM-related SIGILL may only occur if we are not in the zero page. ++ // On AIX, we get a SIGILL if we jump to 0x0 or to somewhere else ++ // in the zero page, because it is filled with 0x0. We ignore ++ // explicit SIGILLs in the zero page. ++ if (sig == SIGILL && (pc < (address) 0x200)) { ++ if (TraceTraps) { ++ tty->print_raw_cr("SIGILL happened inside zero page."); ++ } ++ goto report_and_die; ++ } ++ ++ // Handle signal from NativeJump::patch_verified_entry(). ++ if (( TrapBasedNotEntrantChecks && sig == SIGTRAP && nativeInstruction_at(pc)->is_sigtrap_zombie_not_entrant()) || ++ (!TrapBasedNotEntrantChecks && sig == SIGILL && nativeInstruction_at(pc)->is_sigill_zombie_not_entrant())) { ++ if (TraceTraps) { ++ tty->print_cr("trap: zombie_not_entrant (%s)", (sig == SIGTRAP) ? "SIGTRAP" : "SIGILL"); ++ } ++ stub = SharedRuntime::get_handle_wrong_method_stub(); ++ goto run_stub; ++ } ++ ++ else if (sig == SIGSEGV && os::is_poll_address(addr)) { ++ if (TraceTraps) { ++ tty->print_cr("trap: safepoint_poll at " INTPTR_FORMAT " (SIGSEGV)", pc); ++ } ++ stub = SharedRuntime::get_poll_stub(pc); ++ goto run_stub; ++ } ++ ++ // SIGTRAP-based ic miss check in compiled code. ++ else if (sig == SIGTRAP && TrapBasedICMissChecks && ++ nativeInstruction_at(pc)->is_sigtrap_ic_miss_check()) { ++ if (TraceTraps) { ++ tty->print_cr("trap: ic_miss_check at " INTPTR_FORMAT " (SIGTRAP)", pc); ++ } ++ stub = SharedRuntime::get_ic_miss_stub(); ++ goto run_stub; ++ } ++ ++ // SIGTRAP-based implicit null check in compiled code. ++ else if (sig == SIGTRAP && TrapBasedNullChecks && ++ nativeInstruction_at(pc)->is_sigtrap_null_check()) { ++ if (TraceTraps) { ++ tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGTRAP)", pc); ++ } ++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL); ++ goto run_stub; ++ } ++ ++ // SIGSEGV-based implicit null check in compiled code. ++ else if (sig == SIGSEGV && ImplicitNullChecks && ++ CodeCache::contains((void*) pc) && ++ !MacroAssembler::needs_explicit_null_check((intptr_t) info->si_addr)) { ++ if (TraceTraps) { ++ tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", pc); ++ } ++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL); ++ } ++ ++#ifdef COMPILER2 ++ // SIGTRAP-based implicit range check in compiled code. ++ else if (sig == SIGTRAP && TrapBasedRangeChecks && ++ nativeInstruction_at(pc)->is_sigtrap_range_check()) { ++ if (TraceTraps) { ++ tty->print_cr("trap: range_check at " INTPTR_FORMAT " (SIGTRAP)", pc); ++ } ++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL); ++ goto run_stub; ++ } ++#endif ++ ++ else if (sig == SIGFPE /* && info->si_code == FPE_INTDIV */) { ++ if (TraceTraps) { ++ tty->print_raw_cr("Fix SIGFPE handler, trying divide by zero handler."); ++ } ++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO); ++ goto run_stub; ++ } ++ ++ else if (sig == SIGBUS) { ++ // BugId 4454115: A read from a MappedByteBuffer can fault here if the ++ // underlying file has been truncated. Do not crash the VM in such a case. ++ CodeBlob* cb = CodeCache::find_blob_unsafe(pc); ++ nmethod* nm = cb->is_nmethod() ? (nmethod*)cb : NULL; ++ if (nm != NULL && nm->has_unsafe_access()) { ++ // We don't really need a stub here! Just set the pending exeption and ++ // continue at the next instruction after the faulting read. Returning ++ // garbage from this read is ok. ++ thread->set_pending_unsafe_access_error(); ++ uc->uc_mcontext.jmp_context.iar = ((unsigned long)pc) + 4; ++ return 1; ++ } ++ } ++ } ++ ++ else { // thread->thread_state() != _thread_in_Java ++ // Detect CPU features. This is only done at the very start of the VM. Later, the ++ // VM_Version::is_determine_features_test_running() flag should be false. ++ ++ if (sig == SIGILL && VM_Version::is_determine_features_test_running()) { ++ // SIGILL must be caused by VM_Version::determine_features(). ++ *(int *)pc = 0; // patch instruction to 0 to indicate that it causes a SIGILL, ++ // flushing of icache is not necessary. ++ stub = pc + 4; // continue with next instruction. ++ goto run_stub; ++ } ++ else if (thread->thread_state() == _thread_in_vm && ++ sig == SIGBUS && thread->doing_unsafe_access()) { ++ // We don't really need a stub here! Just set the pending exeption and ++ // continue at the next instruction after the faulting read. Returning ++ // garbage from this read is ok. ++ thread->set_pending_unsafe_access_error(); ++ uc->uc_mcontext.jmp_context.iar = ((unsigned long)pc) + 4; ++ return 1; ++ } ++ } ++ ++ // Check to see if we caught the safepoint code in the ++ // process of write protecting the memory serialization page. ++ // It write enables the page immediately after protecting it ++ // so we can just return to retry the write. ++ if ((sig == SIGSEGV) && ++ os::is_memory_serialize_page(thread, addr)) { ++ // Synchronization problem in the pseudo memory barrier code (bug id 6546278) ++ // Block current thread until the memory serialize page permission restored. ++ os::block_on_serialize_page_trap(); ++ return true; ++ } ++ } ++ ++run_stub: ++ ++ // One of the above code blocks ininitalized the stub, so we want to ++ // delegate control to that stub. ++ if (stub != NULL) { ++ // Save all thread context in case we need to restore it. ++ if (thread != NULL) thread->set_saved_exception_pc(pc); ++ uc->uc_mcontext.jmp_context.iar = (unsigned long)stub; ++ return 1; ++ } ++ ++run_chained_handler: ++ ++ // signal-chaining ++ if (os::Aix::chained_handler(sig, info, ucVoid)) { ++ return 1; ++ } ++ if (!abort_if_unrecognized) { ++ // caller wants another chance, so give it to him ++ return 0; ++ } ++ ++report_and_die: ++ ++ // Use sigthreadmask instead of sigprocmask on AIX and unmask current signal. ++ sigset_t newset; ++ sigemptyset(&newset); ++ sigaddset(&newset, sig); ++ sigthreadmask(SIG_UNBLOCK, &newset, NULL); ++ ++ VMError err(t, sig, pc, info, ucVoid); ++ err.report_and_die(); ++ ++ ShouldNotReachHere(); ++ return 0; ++} ++ ++void os::Aix::init_thread_fpu_state(void) { ++#if !defined(USE_XLC_BUILTINS) ++ // Disable FP exceptions. ++ __asm__ __volatile__ ("mtfsfi 6,0"); ++#else ++ __mtfsfi(6, 0); ++#endif ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// thread stack ++ ++size_t os::Aix::min_stack_allowed = 768*K; ++ ++// Aix is always in floating stack mode. The stack size for a new ++// thread can be set via pthread_attr_setstacksize(). ++bool os::Aix::supports_variable_stack_size() { return true; } ++ ++// return default stack size for thr_type ++size_t os::Aix::default_stack_size(os::ThreadType thr_type) { ++ // default stack size (compiler thread needs larger stack) ++ // Notice that the setting for compiler threads here have no impact ++ // because of the strange 'fallback logic' in os::create_thread(). ++ // Better set CompilerThreadStackSize in globals_.hpp if you want to ++ // specify a different stack size for compiler threads! ++ size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K); ++ return s; ++} ++ ++size_t os::Aix::default_guard_size(os::ThreadType thr_type) { ++ return 2 * page_size(); ++} ++ ++///////////////////////////////////////////////////////////////////////////// ++// helper functions for fatal error handler ++ ++void os::print_context(outputStream *st, void *context) { ++ if (context == NULL) return; ++ ++ ucontext_t* uc = (ucontext_t*)context; ++ ++ st->print_cr("Registers:"); ++ st->print("pc =" INTPTR_FORMAT " ", uc->uc_mcontext.jmp_context.iar); ++ st->print("lr =" INTPTR_FORMAT " ", uc->uc_mcontext.jmp_context.lr); ++ st->print("ctr=" INTPTR_FORMAT " ", uc->uc_mcontext.jmp_context.ctr); ++ st->cr(); ++ for (int i = 0; i < 32; i++) { ++ st->print("r%-2d=" INTPTR_FORMAT " ", i, uc->uc_mcontext.jmp_context.gpr[i]); ++ if (i % 3 == 2) st->cr(); ++ } ++ st->cr(); ++ st->cr(); ++ ++ intptr_t *sp = (intptr_t *)os::Aix::ucontext_get_sp(uc); ++ st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp); ++ print_hex_dump(st, (address)sp, (address)(sp + 128), sizeof(intptr_t)); ++ st->cr(); ++ ++ // Note: it may be unsafe to inspect memory near pc. For example, pc may ++ // point to garbage if entry point in an nmethod is corrupted. Leave ++ // this at the end, and hope for the best. ++ address pc = os::Aix::ucontext_get_pc(uc); ++ st->print_cr("Instructions: (pc=" PTR_FORMAT ")", pc); ++ print_hex_dump(st, pc - 64, pc + 64, /*instrsize=*/4); ++ st->cr(); ++ ++ // Try to decode the instructions. ++ st->print_cr("Decoded instructions: (pc=" PTR_FORMAT ")", pc); ++ st->print(""); ++ // TODO: PPC port Disassembler::decode(pc, 16, 16, st); ++ st->cr(); ++} ++ ++void os::print_register_info(outputStream *st, void *context) { ++ if (context == NULL) return; ++ st->print("Not ported - print_register_info\n"); ++} ++ ++extern "C" { ++ int SpinPause() { ++ return 0; ++ } ++} ++ ++#ifndef PRODUCT ++void os::verify_stack_alignment() { ++ assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment"); ++} ++#endif +--- ./hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_AIX_OJDKPPC_VM_OS_AIX_PPC_HPP ++#define OS_CPU_AIX_OJDKPPC_VM_OS_AIX_PPC_HPP ++ ++ static void setup_fpu() {} ++ ++ // Used to register dynamic code cache area with the OS ++ // Note: Currently only used in 64 bit Windows implementations ++ static bool register_code_area(char *low, char *high) { return true; } ++ ++#endif // OS_CPU_AIX_OJDKPPC_VM_OS_AIX_PPC_HPP +--- ./hotspot/src/os_cpu/aix_ppc/vm/prefetch_aix_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/prefetch_aix_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_AIX_PPC_64_VM_PREFETCH_AIX_PPC_64_INLINE_HPP ++#define OS_CPU_AIX_PPC_64_VM_PREFETCH_AIX_PPC_64_INLINE_HPP ++ ++#include "runtime/prefetch.hpp" ++ ++ ++inline void Prefetch::read(void *loc, intx interval) { ++#if !defined(USE_XLC_BUILTINS) ++ __asm__ __volatile__ ( ++ " dcbt 0, %0 \n" ++ : ++ : /*%0*/"r" ( ((address)loc) +((long)interval) ) ++ //: ++ ); ++#else ++ __dcbt(((address)loc) +((long)interval)); ++#endif ++} ++ ++inline void Prefetch::write(void *loc, intx interval) { ++#if !defined(USE_XLC_PREFETCH_WRITE_BUILTIN) ++ __asm__ __volatile__ ( ++ " dcbtst 0, %0 \n" ++ : ++ : /*%0*/"r" ( ((address)loc) +((long)interval) ) ++ //: ++ ); ++#else ++ __dcbtst( ((address)loc) +((long)interval) ); ++#endif ++} ++ ++#endif // OS_CPU_AIX_PPC_64_VM_PREFETCH_AIX_PPC_64_INLINE_HPP +--- ./hotspot/src/os_cpu/aix_ppc/vm/threadLS_aix_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/threadLS_aix_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,40 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "runtime/threadLocalStorage.hpp" ++#include "runtime/thread.hpp" ++ ++void ThreadLocalStorage::generate_code_for_get_thread() { ++ // Nothing we can do here for user-level thread. ++} ++ ++void ThreadLocalStorage::pd_init() { ++ // Nothing to do. ++} ++ ++void ThreadLocalStorage::pd_set_thread(Thread* thread) { ++ os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); ++} +--- ./hotspot/src/os_cpu/aix_ppc/vm/threadLS_aix_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/threadLS_aix_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_AIX_OJDKPPC_VM_THREADLS_AIX_PPC_HPP ++#define OS_CPU_AIX_OJDKPPC_VM_THREADLS_AIX_PPC_HPP ++ ++ // Processor dependent parts of ThreadLocalStorage ++ ++public: ++ static Thread* thread() { ++ return (Thread *) os::thread_local_storage_at(thread_index()); ++ } ++ ++#endif // OS_CPU_AIX_OJDKPPC_VM_THREADLS_AIX_PPC_HPP +--- ./hotspot/src/os_cpu/aix_ppc/vm/thread_aix_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/thread_aix_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "runtime/frame.hpp" ++#include "runtime/thread.hpp" ++ ++// Forte Analyzer AsyncGetCallTrace profiling support is not implemented on Aix/PPC. ++bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr, void* ucontext, bool isInJava) { ++ Unimplemented(); ++ return false; ++} ++ ++void JavaThread::cache_global_variables() { } +--- ./hotspot/src/os_cpu/aix_ppc/vm/thread_aix_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/thread_aix_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,79 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_AIX_OJDKPPC_VM_THREAD_AIX_PPC_HPP ++#define OS_CPU_AIX_OJDKPPC_VM_THREAD_AIX_PPC_HPP ++ ++ private: ++ void pd_initialize() { ++ _anchor.clear(); ++ _last_interpreter_fp = NULL; ++ } ++ ++ // The `last' frame is the youngest Java frame on the thread's stack. ++ frame pd_last_frame() { ++ assert(has_last_Java_frame(), "must have last_Java_sp() when suspended"); ++ ++ intptr_t* sp = last_Java_sp(); ++ address pc = _anchor.last_Java_pc(); ++ ++ // Last_Java_pc ist not set, if we come here from compiled code. ++ if (pc == NULL) ++ pc = (address) *(sp + 2); ++ ++ return frame(sp, pc); ++ } ++ ++ public: ++ void set_base_of_stack_pointer(intptr_t* base_sp) {} ++ intptr_t* base_of_stack_pointer() { return NULL; } ++ void record_base_of_stack_pointer() {} ++ ++ // These routines are only used on cpu architectures that ++ // have separate register stacks (Itanium). ++ static bool register_stack_overflow() { return false; } ++ static void enable_register_stack_guard() {} ++ static void disable_register_stack_guard() {} ++ ++ bool pd_get_top_frame_for_signal_handler(frame* fr_addr, void* ucontext, ++ bool isInJava); ++ ++ // -Xprof support ++ // ++ // In order to find the last Java fp from an async profile ++ // tick, we store the current interpreter fp in the thread. ++ // This value is only valid while we are in the C++ interpreter ++ // and profiling. ++ protected: ++ intptr_t *_last_interpreter_fp; ++ ++ public: ++ static ByteSize last_interpreter_fp_offset() { ++ return byte_offset_of(JavaThread, _last_interpreter_fp); ++ } ++ ++ intptr_t* last_interpreter_fp() { return _last_interpreter_fp; } ++ ++#endif // OS_CPU_AIX_OJDKPPC_VM_THREAD_AIX_PPC_HPP +--- ./hotspot/src/os_cpu/aix_ppc/vm/vmStructs_aix_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/aix_ppc/vm/vmStructs_aix_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_AIX_OJDKPPC_VM_VMSTRUCTS_AIX_PPC_HPP ++#define OS_CPU_AIX_OJDKPPC_VM_VMSTRUCTS_AIX_PPC_HPP ++ ++// These are the OS and CPU-specific fields, types and integer ++// constants required by the Serviceability Agent. This file is ++// referenced by vmStructs.cpp. ++ ++#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \ ++ \ ++ /******************************/ \ ++ /* Threads (NOTE: incomplete) */ \ ++ /******************************/ \ ++ nonstatic_field(OSThread, _thread_id, pid_t) \ ++ nonstatic_field(OSThread, _pthread_id, pthread_t) ++ ++ ++#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \ ++ \ ++ /**********************/ \ ++ /* Posix Thread IDs */ \ ++ /**********************/ \ ++ \ ++ declare_integer_type(pid_t) \ ++ declare_unsigned_integer_type(pthread_t) ++ ++#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) ++ ++#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) ++ ++#endif // OS_CPU_AIX_OJDKPPC_VM_VMSTRUCTS_AIX_PPC_HPP +--- ./hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -276,6 +276,8 @@ + # endif + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + address os::current_stack_pointer() { + #if defined(__clang__) || defined(__llvm__) + register void *esp; +@@ -492,6 +494,11 @@ + } + } + ++ if ((sig == SIGSEGV || sig == SIGBUS) && VM_Version::is_cpuinfo_segv_addr(pc)) { ++ // Verify that OS save/restore AVX registers. ++ stub = VM_Version::cpuinfo_cont_addr(); ++ } ++ + // We test if stub is already set (by the stack overflow code + // above) so it is not overwritten by the code that follows. This + // check is not required on other platforms, because on other +--- ./hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -36,7 +36,7 @@ + + // Atomically copy 64 bits of data + static void atomic_copy64(volatile void *src, volatile void *dst) { +-#if defined(PPC) && !defined(_LP64) ++#if defined(PPC32) + double tmp; + asm volatile ("lfd %0, 0(%1)\n" + "stfd %0, 0(%2)\n" +--- ./hotspot/src/os_cpu/linux_ppc/vm/atomic_linux_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/atomic_linux_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,401 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_LINUX_PPC_VM_ATOMIC_LINUX_PPC_INLINE_HPP ++#define OS_CPU_LINUX_PPC_VM_ATOMIC_LINUX_PPC_INLINE_HPP ++ ++#include "orderAccess_linux_ppc.inline.hpp" ++#include "runtime/atomic.hpp" ++#include "runtime/os.hpp" ++#include "vm_version_ppc.hpp" ++ ++#ifndef PPC64 ++#error "Atomic currently only implemented for PPC64" ++#endif ++ ++// Implementation of class atomic ++ ++inline void Atomic::store (jbyte store_value, jbyte* dest) { *dest = store_value; } ++inline void Atomic::store (jshort store_value, jshort* dest) { *dest = store_value; } ++inline void Atomic::store (jint store_value, jint* dest) { *dest = store_value; } ++inline void Atomic::store (jlong store_value, jlong* dest) { *dest = store_value; } ++inline void Atomic::store_ptr(intptr_t store_value, intptr_t* dest) { *dest = store_value; } ++inline void Atomic::store_ptr(void* store_value, void* dest) { *(void**)dest = store_value; } ++ ++inline void Atomic::store (jbyte store_value, volatile jbyte* dest) { *dest = store_value; } ++inline void Atomic::store (jshort store_value, volatile jshort* dest) { *dest = store_value; } ++inline void Atomic::store (jint store_value, volatile jint* dest) { *dest = store_value; } ++inline void Atomic::store (jlong store_value, volatile jlong* dest) { *dest = store_value; } ++inline void Atomic::store_ptr(intptr_t store_value, volatile intptr_t* dest) { *dest = store_value; } ++inline void Atomic::store_ptr(void* store_value, volatile void* dest) { *(void* volatile *)dest = store_value; } ++ ++inline jlong Atomic::load(volatile jlong* src) { return *src; } ++ ++// ++// machine barrier instructions: ++// ++// - sync two-way memory barrier, aka fence ++// - lwsync orders Store|Store, ++// Load|Store, ++// Load|Load, ++// but not Store|Load ++// - eieio orders memory accesses for device memory (only) ++// - isync invalidates speculatively executed instructions ++// From the POWER ISA 2.06 documentation: ++// "[...] an isync instruction prevents the execution of ++// instructions following the isync until instructions ++// preceding the isync have completed, [...]" ++// From IBM's AIX assembler reference: ++// "The isync [...] instructions causes the processor to ++// refetch any instructions that might have been fetched ++// prior to the isync instruction. The instruction isync ++// causes the processor to wait for all previous instructions ++// to complete. Then any instructions already fetched are ++// discarded and instruction processing continues in the ++// environment established by the previous instructions." ++// ++// semantic barrier instructions: ++// (as defined in orderAccess.hpp) ++// ++// - release orders Store|Store, (maps to lwsync) ++// Load|Store ++// - acquire orders Load|Store, (maps to lwsync) ++// Load|Load ++// - fence orders Store|Store, (maps to sync) ++// Load|Store, ++// Load|Load, ++// Store|Load ++// ++ ++#define strasm_sync "\n sync \n" ++#define strasm_lwsync "\n lwsync \n" ++#define strasm_isync "\n isync \n" ++#define strasm_release strasm_lwsync ++#define strasm_acquire strasm_lwsync ++#define strasm_fence strasm_sync ++#define strasm_nobarrier "" ++#define strasm_nobarrier_clobber_memory "" ++ ++inline jint Atomic::add (jint add_value, volatile jint* dest) { ++ ++ unsigned int result; ++ ++ __asm__ __volatile__ ( ++ strasm_lwsync ++ "1: lwarx %0, 0, %2 \n" ++ " add %0, %0, %1 \n" ++ " stwcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_isync ++ : /*%0*/"=&r" (result) ++ : /*%1*/"r" (add_value), /*%2*/"r" (dest) ++ : "cc", "memory" ); ++ ++ return (jint) result; ++} ++ ++ ++inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) { ++ ++ long result; ++ ++ __asm__ __volatile__ ( ++ strasm_lwsync ++ "1: ldarx %0, 0, %2 \n" ++ " add %0, %0, %1 \n" ++ " stdcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_isync ++ : /*%0*/"=&r" (result) ++ : /*%1*/"r" (add_value), /*%2*/"r" (dest) ++ : "cc", "memory" ); ++ ++ return (intptr_t) result; ++} ++ ++inline void* Atomic::add_ptr(intptr_t add_value, volatile void* dest) { ++ return (void*)add_ptr(add_value, (volatile intptr_t*)dest); ++} ++ ++ ++inline void Atomic::inc (volatile jint* dest) { ++ ++ unsigned int temp; ++ ++ __asm__ __volatile__ ( ++ strasm_nobarrier ++ "1: lwarx %0, 0, %2 \n" ++ " addic %0, %0, 1 \n" ++ " stwcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_nobarrier ++ : /*%0*/"=&r" (temp), "=m" (*dest) ++ : /*%2*/"r" (dest), "m" (*dest) ++ : "cc" strasm_nobarrier_clobber_memory); ++ ++} ++ ++inline void Atomic::inc_ptr(volatile intptr_t* dest) { ++ ++ long temp; ++ ++ __asm__ __volatile__ ( ++ strasm_nobarrier ++ "1: ldarx %0, 0, %2 \n" ++ " addic %0, %0, 1 \n" ++ " stdcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_nobarrier ++ : /*%0*/"=&r" (temp), "=m" (*dest) ++ : /*%2*/"r" (dest), "m" (*dest) ++ : "cc" strasm_nobarrier_clobber_memory); ++ ++} ++ ++inline void Atomic::inc_ptr(volatile void* dest) { ++ inc_ptr((volatile intptr_t*)dest); ++} ++ ++ ++inline void Atomic::dec (volatile jint* dest) { ++ ++ unsigned int temp; ++ ++ __asm__ __volatile__ ( ++ strasm_nobarrier ++ "1: lwarx %0, 0, %2 \n" ++ " addic %0, %0, -1 \n" ++ " stwcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_nobarrier ++ : /*%0*/"=&r" (temp), "=m" (*dest) ++ : /*%2*/"r" (dest), "m" (*dest) ++ : "cc" strasm_nobarrier_clobber_memory); ++ ++} ++ ++inline void Atomic::dec_ptr(volatile intptr_t* dest) { ++ ++ long temp; ++ ++ __asm__ __volatile__ ( ++ strasm_nobarrier ++ "1: ldarx %0, 0, %2 \n" ++ " addic %0, %0, -1 \n" ++ " stdcx. %0, 0, %2 \n" ++ " bne- 1b \n" ++ strasm_nobarrier ++ : /*%0*/"=&r" (temp), "=m" (*dest) ++ : /*%2*/"r" (dest), "m" (*dest) ++ : "cc" strasm_nobarrier_clobber_memory); ++ ++} ++ ++inline void Atomic::dec_ptr(volatile void* dest) { ++ dec_ptr((volatile intptr_t*)dest); ++} ++ ++inline jint Atomic::xchg(jint exchange_value, volatile jint* dest) { ++ ++ // Note that xchg_ptr doesn't necessarily do an acquire ++ // (see synchronizer.cpp). ++ ++ unsigned int old_value; ++ const uint64_t zero = 0; ++ ++ __asm__ __volatile__ ( ++ /* lwsync */ ++ strasm_lwsync ++ /* atomic loop */ ++ "1: \n" ++ " lwarx %[old_value], %[dest], %[zero] \n" ++ " stwcx. %[exchange_value], %[dest], %[zero] \n" ++ " bne- 1b \n" ++ /* isync */ ++ strasm_sync ++ /* exit */ ++ "2: \n" ++ /* out */ ++ : [old_value] "=&r" (old_value), ++ "=m" (*dest) ++ /* in */ ++ : [dest] "b" (dest), ++ [zero] "r" (zero), ++ [exchange_value] "r" (exchange_value), ++ "m" (*dest) ++ /* clobber */ ++ : "cc", ++ "memory" ++ ); ++ ++ return (jint) old_value; ++} ++ ++inline intptr_t Atomic::xchg_ptr(intptr_t exchange_value, volatile intptr_t* dest) { ++ ++ // Note that xchg_ptr doesn't necessarily do an acquire ++ // (see synchronizer.cpp). ++ ++ long old_value; ++ const uint64_t zero = 0; ++ ++ __asm__ __volatile__ ( ++ /* lwsync */ ++ strasm_lwsync ++ /* atomic loop */ ++ "1: \n" ++ " ldarx %[old_value], %[dest], %[zero] \n" ++ " stdcx. %[exchange_value], %[dest], %[zero] \n" ++ " bne- 1b \n" ++ /* isync */ ++ strasm_sync ++ /* exit */ ++ "2: \n" ++ /* out */ ++ : [old_value] "=&r" (old_value), ++ "=m" (*dest) ++ /* in */ ++ : [dest] "b" (dest), ++ [zero] "r" (zero), ++ [exchange_value] "r" (exchange_value), ++ "m" (*dest) ++ /* clobber */ ++ : "cc", ++ "memory" ++ ); ++ ++ return (intptr_t) old_value; ++} ++ ++inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) { ++ return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest); ++} ++ ++inline jint Atomic::cmpxchg(jint exchange_value, volatile jint* dest, jint compare_value) { ++ ++ // Note that cmpxchg guarantees a two-way memory barrier across ++ // the cmpxchg, so it's really a a 'fence_cmpxchg_acquire' ++ // (see atomic.hpp). ++ ++ unsigned int old_value; ++ const uint64_t zero = 0; ++ ++ __asm__ __volatile__ ( ++ /* fence */ ++ strasm_sync ++ /* simple guard */ ++ " lwz %[old_value], 0(%[dest]) \n" ++ " cmpw %[compare_value], %[old_value] \n" ++ " bne- 2f \n" ++ /* atomic loop */ ++ "1: \n" ++ " lwarx %[old_value], %[dest], %[zero] \n" ++ " cmpw %[compare_value], %[old_value] \n" ++ " bne- 2f \n" ++ " stwcx. %[exchange_value], %[dest], %[zero] \n" ++ " bne- 1b \n" ++ /* acquire */ ++ strasm_sync ++ /* exit */ ++ "2: \n" ++ /* out */ ++ : [old_value] "=&r" (old_value), ++ "=m" (*dest) ++ /* in */ ++ : [dest] "b" (dest), ++ [zero] "r" (zero), ++ [compare_value] "r" (compare_value), ++ [exchange_value] "r" (exchange_value), ++ "m" (*dest) ++ /* clobber */ ++ : "cc", ++ "memory" ++ ); ++ ++ return (jint) old_value; ++} ++ ++inline jlong Atomic::cmpxchg(jlong exchange_value, volatile jlong* dest, jlong compare_value) { ++ ++ // Note that cmpxchg guarantees a two-way memory barrier across ++ // the cmpxchg, so it's really a a 'fence_cmpxchg_acquire' ++ // (see atomic.hpp). ++ ++ long old_value; ++ const uint64_t zero = 0; ++ ++ __asm__ __volatile__ ( ++ /* fence */ ++ strasm_sync ++ /* simple guard */ ++ " ld %[old_value], 0(%[dest]) \n" ++ " cmpd %[compare_value], %[old_value] \n" ++ " bne- 2f \n" ++ /* atomic loop */ ++ "1: \n" ++ " ldarx %[old_value], %[dest], %[zero] \n" ++ " cmpd %[compare_value], %[old_value] \n" ++ " bne- 2f \n" ++ " stdcx. %[exchange_value], %[dest], %[zero] \n" ++ " bne- 1b \n" ++ /* acquire */ ++ strasm_sync ++ /* exit */ ++ "2: \n" ++ /* out */ ++ : [old_value] "=&r" (old_value), ++ "=m" (*dest) ++ /* in */ ++ : [dest] "b" (dest), ++ [zero] "r" (zero), ++ [compare_value] "r" (compare_value), ++ [exchange_value] "r" (exchange_value), ++ "m" (*dest) ++ /* clobber */ ++ : "cc", ++ "memory" ++ ); ++ ++ return (jlong) old_value; ++} ++ ++inline intptr_t Atomic::cmpxchg_ptr(intptr_t exchange_value, volatile intptr_t* dest, intptr_t compare_value) { ++ return (intptr_t)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value); ++} ++ ++inline void* Atomic::cmpxchg_ptr(void* exchange_value, volatile void* dest, void* compare_value) { ++ return (void*)cmpxchg((jlong)exchange_value, (volatile jlong*)dest, (jlong)compare_value); ++} ++ ++#undef strasm_sync ++#undef strasm_lwsync ++#undef strasm_isync ++#undef strasm_release ++#undef strasm_acquire ++#undef strasm_fence ++#undef strasm_nobarrier ++#undef strasm_nobarrier_clobber_memory ++ ++#endif // OS_CPU_LINUX_PPC_VM_ATOMIC_LINUX_PPC_INLINE_HPP +--- ./hotspot/src/os_cpu/linux_ppc/vm/bytes_linux_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/bytes_linux_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2014 Google Inc. 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 OS_CPU_LINUX_PPC_VM_BYTES_LINUX_PPC_INLINE_HPP ++#define OS_CPU_LINUX_PPC_VM_BYTES_LINUX_PPC_INLINE_HPP ++ ++#if defined(VM_LITTLE_ENDIAN) ++#include ++ ++// Efficient swapping of data bytes from Java byte ++// ordering to native byte ordering and vice versa. ++inline u2 Bytes::swap_u2(u2 x) { return bswap_16(x); } ++inline u4 Bytes::swap_u4(u4 x) { return bswap_32(x); } ++inline u8 Bytes::swap_u8(u8 x) { return bswap_64(x); } ++#endif // VM_LITTLE_ENDIAN ++ ++#endif // OS_CPU_LINUX_PPC_VM_BYTES_LINUX_PPC_INLINE_HPP +--- ./hotspot/src/os_cpu/linux_ppc/vm/globals_linux_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/globals_linux_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,54 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_LINUX_PPC_VM_GLOBALS_LINUX_PPC_HPP ++#define OS_CPU_LINUX_PPC_VM_GLOBALS_LINUX_PPC_HPP ++ ++// Sets the default values for platform dependent flags used by the runtime system. ++// (see globals.hpp) ++ ++define_pd_global(bool, DontYieldALot, false); ++define_pd_global(intx, ThreadStackSize, 2048); // 0 => use system default ++define_pd_global(intx, VMThreadStackSize, 2048); ++ ++// if we set CompilerThreadStackSize to a value different than 0, it will ++// be used in os::create_thread(). Otherwise, due the strange logic in os::create_thread(), ++// the stack size for compiler threads will default to VMThreadStackSize, although it ++// is defined to 4M in os::Linux::default_stack_size()! ++define_pd_global(intx, CompilerThreadStackSize, 4096); ++ ++// Allow extra space in DEBUG builds for asserts. ++define_pd_global(uintx,JVMInvokeMethodSlack, 8192); ++ ++define_pd_global(intx, StackYellowPages, 6); ++define_pd_global(intx, StackRedPages, 1); ++define_pd_global(intx, StackShadowPages, 6 DEBUG_ONLY(+2)); ++ ++// Only used on 64 bit platforms ++define_pd_global(uintx,HeapBaseMinAddress, 2*G); ++// Only used on 64 bit Windows platforms ++define_pd_global(bool, UseVectoredExceptions, false); ++ ++#endif // OS_CPU_LINUX_PPC_VM_GLOBALS_LINUX_PPC_HPP +--- ./hotspot/src/os_cpu/linux_ppc/vm/orderAccess_linux_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/orderAccess_linux_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,149 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_LINUX_PPC_VM_ORDERACCESS_LINUX_PPC_INLINE_HPP ++#define OS_CPU_LINUX_PPC_VM_ORDERACCESS_LINUX_PPC_INLINE_HPP ++ ++#include "runtime/orderAccess.hpp" ++#include "vm_version_ppc.hpp" ++ ++#ifndef PPC64 ++#error "OrderAccess currently only implemented for PPC64" ++#endif ++ ++// Implementation of class OrderAccess. ++ ++// ++// Machine barrier instructions: ++// ++// - sync Two-way memory barrier, aka fence. ++// - lwsync orders Store|Store, ++// Load|Store, ++// Load|Load, ++// but not Store|Load ++// - eieio orders Store|Store ++// - isync Invalidates speculatively executed instructions, ++// but isync may complete before storage accesses ++// associated with instructions preceding isync have ++// been performed. ++// ++// Semantic barrier instructions: ++// (as defined in orderAccess.hpp) ++// ++// - release orders Store|Store, (maps to lwsync) ++// Load|Store ++// - acquire orders Load|Store, (maps to lwsync) ++// Load|Load ++// - fence orders Store|Store, (maps to sync) ++// Load|Store, ++// Load|Load, ++// Store|Load ++// ++ ++#define inlasm_sync() __asm__ __volatile__ ("sync" : : : "memory"); ++#define inlasm_lwsync() __asm__ __volatile__ ("lwsync" : : : "memory"); ++#define inlasm_eieio() __asm__ __volatile__ ("eieio" : : : "memory"); ++#define inlasm_isync() __asm__ __volatile__ ("isync" : : : "memory"); ++#define inlasm_release() inlasm_lwsync(); ++#define inlasm_acquire() inlasm_lwsync(); ++// Use twi-isync for load_acquire (faster than lwsync). ++#define inlasm_acquire_reg(X) __asm__ __volatile__ ("twi 0,%0,0\n isync\n" : : "r" (X) : "memory"); ++#define inlasm_fence() inlasm_sync(); ++ ++inline void OrderAccess::loadload() { inlasm_lwsync(); } ++inline void OrderAccess::storestore() { inlasm_lwsync(); } ++inline void OrderAccess::loadstore() { inlasm_lwsync(); } ++inline void OrderAccess::storeload() { inlasm_fence(); } ++ ++inline void OrderAccess::acquire() { inlasm_acquire(); } ++inline void OrderAccess::release() { inlasm_release(); } ++inline void OrderAccess::fence() { inlasm_fence(); } ++ ++inline jbyte OrderAccess::load_acquire(volatile jbyte* p) { register jbyte t = *p; inlasm_acquire_reg(t); return t; } ++inline jshort OrderAccess::load_acquire(volatile jshort* p) { register jshort t = *p; inlasm_acquire_reg(t); return t; } ++inline jint OrderAccess::load_acquire(volatile jint* p) { register jint t = *p; inlasm_acquire_reg(t); return t; } ++inline jlong OrderAccess::load_acquire(volatile jlong* p) { register jlong t = *p; inlasm_acquire_reg(t); return t; } ++inline jubyte OrderAccess::load_acquire(volatile jubyte* p) { register jubyte t = *p; inlasm_acquire_reg(t); return t; } ++inline jushort OrderAccess::load_acquire(volatile jushort* p) { register jushort t = *p; inlasm_acquire_reg(t); return t; } ++inline juint OrderAccess::load_acquire(volatile juint* p) { register juint t = *p; inlasm_acquire_reg(t); return t; } ++inline julong OrderAccess::load_acquire(volatile julong* p) { return (julong)load_acquire((volatile jlong*)p); } ++inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { register jfloat t = *p; inlasm_acquire(); return t; } ++inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { register jdouble t = *p; inlasm_acquire(); return t; } ++ ++inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return (intptr_t)load_acquire((volatile jlong*)p); } ++inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return (void*) load_acquire((volatile jlong*)p); } ++inline void* OrderAccess::load_ptr_acquire(const volatile void* p) { return (void*) load_acquire((volatile jlong*)p); } ++ ++inline void OrderAccess::release_store(volatile jbyte* p, jbyte v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jshort* p, jshort v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jint* p, jint v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jlong* p, jlong v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jubyte* p, jubyte v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jushort* p, jushort v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile juint* p, juint v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile julong* p, julong v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { inlasm_release(); *p = v; } ++ ++inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { inlasm_release(); *p = v; } ++inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { inlasm_release(); *(void* volatile *)p = v; } ++ ++inline void OrderAccess::store_fence(jbyte* p, jbyte v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jshort* p, jshort v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jint* p, jint v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jlong* p, jlong v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jubyte* p, jubyte v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jushort* p, jushort v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(juint* p, juint v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(julong* p, julong v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; inlasm_fence(); } ++ ++inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { *p = v; inlasm_fence(); } ++inline void OrderAccess::store_ptr_fence(void** p, void* v) { *p = v; inlasm_fence(); } ++ ++inline void OrderAccess::release_store_fence(volatile jbyte* p, jbyte v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jshort* p, jshort v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jint* p, jint v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jlong* p, jlong v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { inlasm_release(); *p = v; inlasm_fence(); } ++ ++inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { inlasm_release(); *p = v; inlasm_fence(); } ++inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { inlasm_release(); *(void* volatile *)p = v; inlasm_fence(); } ++ ++#undef inlasm_sync ++#undef inlasm_lwsync ++#undef inlasm_eieio ++#undef inlasm_isync ++#undef inlasm_release ++#undef inlasm_acquire ++#undef inlasm_fence ++ ++#endif // OS_CPU_LINUX_PPC_VM_ORDERACCESS_LINUX_PPC_INLINE_HPP +--- ./hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,614 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 hat ++ * 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. ++ * ++ */ ++ ++// no precompiled headers ++#include "assembler_ppc.inline.hpp" ++#include "classfile/classLoader.hpp" ++#include "classfile/systemDictionary.hpp" ++#include "classfile/vmSymbols.hpp" ++#include "code/icBuffer.hpp" ++#include "code/vtableStubs.hpp" ++#include "interpreter/interpreter.hpp" ++#include "jvm_linux.h" ++#include "memory/allocation.inline.hpp" ++#include "mutex_linux.inline.hpp" ++#include "nativeInst_ppc.hpp" ++#include "os_share_linux.hpp" ++#include "prims/jniFastGetField.hpp" ++#include "prims/jvm.h" ++#include "prims/jvm_misc.hpp" ++#include "runtime/arguments.hpp" ++#include "runtime/extendedPC.hpp" ++#include "runtime/frame.inline.hpp" ++#include "runtime/interfaceSupport.hpp" ++#include "runtime/java.hpp" ++#include "runtime/javaCalls.hpp" ++#include "runtime/mutexLocker.hpp" ++#include "runtime/osThread.hpp" ++#include "runtime/sharedRuntime.hpp" ++#include "runtime/stubRoutines.hpp" ++#include "runtime/thread.inline.hpp" ++#include "runtime/timer.hpp" ++#include "utilities/events.hpp" ++#include "utilities/vmError.hpp" ++ ++// put OS-includes here ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++# include ++ ++ ++address os::current_stack_pointer() { ++ intptr_t* csp; ++ ++ // inline assembly `mr regno(csp), R1_SP': ++ __asm__ __volatile__ ("mr %0, 1":"=r"(csp):); ++ ++ return (address) csp; ++} ++ ++char* os::non_memory_address_word() { ++ // Must never look like an address returned by reserve_memory, ++ // even in its subfields (as defined by the CPU immediate fields, ++ // if the CPU splits constants across multiple instructions). ++ ++ return (char*) -1; ++} ++ ++void os::initialize_thread(Thread *thread) { } ++ ++// Frame information (pc, sp, fp) retrieved via ucontext ++// always looks like a C-frame according to the frame ++// conventions in frame_ppc64.hpp. ++address os::Linux::ucontext_get_pc(ucontext_t * uc) { ++ // On powerpc64, ucontext_t is not selfcontained but contains ++ // a pointer to an optional substructure (mcontext_t.regs) containing the volatile ++ // registers - NIP, among others. ++ // This substructure may or may not be there depending where uc came from: ++ // - if uc was handed over as the argument to a sigaction handler, a pointer to the ++ // substructure was provided by the kernel when calling the signal handler, and ++ // regs->nip can be accessed. ++ // - if uc was filled by getcontext(), it is undefined - getcontext() does not fill ++ // it because the volatile registers are not needed to make setcontext() work. ++ // Hopefully it was zero'd out beforehand. ++ guarantee(uc->uc_mcontext.regs != NULL, "only use ucontext_get_pc in sigaction context"); ++ return (address)uc->uc_mcontext.regs->nip; ++} ++ ++intptr_t* os::Linux::ucontext_get_sp(ucontext_t * uc) { ++ return (intptr_t*)uc->uc_mcontext.regs->gpr[1/*REG_SP*/]; ++} ++ ++intptr_t* os::Linux::ucontext_get_fp(ucontext_t * uc) { ++ return NULL; ++} ++ ++ExtendedPC os::fetch_frame_from_context(void* ucVoid, ++ intptr_t** ret_sp, intptr_t** ret_fp) { ++ ++ ExtendedPC epc; ++ ucontext_t* uc = (ucontext_t*)ucVoid; ++ ++ if (uc != NULL) { ++ epc = ExtendedPC(os::Linux::ucontext_get_pc(uc)); ++ if (ret_sp) *ret_sp = os::Linux::ucontext_get_sp(uc); ++ if (ret_fp) *ret_fp = os::Linux::ucontext_get_fp(uc); ++ } else { ++ // construct empty ExtendedPC for return value checking ++ epc = ExtendedPC(NULL); ++ if (ret_sp) *ret_sp = (intptr_t *)NULL; ++ if (ret_fp) *ret_fp = (intptr_t *)NULL; ++ } ++ ++ return epc; ++} ++ ++frame os::fetch_frame_from_context(void* ucVoid) { ++ intptr_t* sp; ++ intptr_t* fp; ++ ExtendedPC epc = fetch_frame_from_context(ucVoid, &sp, &fp); ++ return frame(sp, epc.pc()); ++} ++ ++frame os::get_sender_for_C_frame(frame* fr) { ++ if (*fr->sp() == 0) { ++ // fr is the last C frame ++ return frame(NULL, NULL); ++ } ++ return frame(fr->sender_sp(), fr->sender_pc()); ++} ++ ++ ++frame os::current_frame() { ++ intptr_t* csp = (intptr_t*) *((intptr_t*) os::current_stack_pointer()); ++ // hack. ++ frame topframe(csp, (address)0x8); ++ // return sender of current topframe which hopefully has pc != NULL. ++ return os::get_sender_for_C_frame(&topframe); ++} ++ ++// Utility functions ++ ++extern "C" JNIEXPORT int ++JVM_handle_linux_signal(int sig, ++ siginfo_t* info, ++ void* ucVoid, ++ int abort_if_unrecognized) { ++ ucontext_t* uc = (ucontext_t*) ucVoid; ++ ++ Thread* t = ThreadLocalStorage::get_thread_slow(); ++ ++ SignalHandlerMark shm(t); ++ ++ // Note: it's not uncommon that JNI code uses signal/sigset to install ++ // then restore certain signal handler (e.g. to temporarily block SIGPIPE, ++ // or have a SIGILL handler when detecting CPU type). When that happens, ++ // JVM_handle_linux_signal() might be invoked with junk info/ucVoid. To ++ // avoid unnecessary crash when libjsig is not preloaded, try handle signals ++ // that do not require siginfo/ucontext first. ++ ++ if (sig == SIGPIPE) { ++ if (os::Linux::chained_handler(sig, info, ucVoid)) { ++ return true; ++ } else { ++ if (PrintMiscellaneous && (WizardMode || Verbose)) { ++ warning("Ignoring SIGPIPE - see bug 4229104"); ++ } ++ return true; ++ } ++ } ++ ++ JavaThread* thread = NULL; ++ VMThread* vmthread = NULL; ++ if (os::Linux::signal_handlers_are_installed) { ++ if (t != NULL) { ++ if(t->is_Java_thread()) { ++ thread = (JavaThread*)t; ++ } else if(t->is_VM_thread()) { ++ vmthread = (VMThread *)t; ++ } ++ } ++ } ++ ++ // Moved SafeFetch32 handling outside thread!=NULL conditional block to make ++ // it work if no associated JavaThread object exists. ++ if (uc) { ++ address const pc = os::Linux::ucontext_get_pc(uc); ++ if (pc && StubRoutines::is_safefetch_fault(pc)) { ++ uc->uc_mcontext.regs->nip = (unsigned long)StubRoutines::continuation_for_safefetch_fault(pc); ++ return true; ++ } ++ } ++ ++ // decide if this trap can be handled by a stub ++ address stub = NULL; ++ address pc = NULL; ++ ++ //%note os_trap_1 ++ if (info != NULL && uc != NULL && thread != NULL) { ++ pc = (address) os::Linux::ucontext_get_pc(uc); ++ ++ // Handle ALL stack overflow variations here ++ if (sig == SIGSEGV) { ++ // Si_addr may not be valid due to a bug in the linux-ppc64 kernel (see ++ // comment below). Use get_stack_bang_address instead of si_addr. ++ address addr = ((NativeInstruction*)pc)->get_stack_bang_address(uc); ++ ++ // Check if fault address is within thread stack. ++ if (addr < thread->stack_base() && ++ addr >= thread->stack_base() - thread->stack_size()) { ++ // stack overflow ++ if (thread->in_stack_yellow_zone(addr)) { ++ thread->disable_stack_yellow_zone(); ++ if (thread->thread_state() == _thread_in_Java) { ++ // Throw a stack overflow exception. ++ // Guard pages will be reenabled while unwinding the stack. ++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::STACK_OVERFLOW); ++ } else { ++ // Thread was in the vm or native code. Return and try to finish. ++ return 1; ++ } ++ } else if (thread->in_stack_red_zone(addr)) { ++ // Fatal red zone violation. Disable the guard pages and fall through ++ // to handle_unexpected_exception way down below. ++ thread->disable_stack_red_zone(); ++ tty->print_raw_cr("An irrecoverable stack overflow has occurred."); ++ ++ // This is a likely cause, but hard to verify. Let's just print ++ // it as a hint. ++ tty->print_raw_cr("Please check if any of your loaded .so files has " ++ "enabled executable stack (see man page execstack(8))"); ++ } else { ++ // Accessing stack address below sp may cause SEGV if current ++ // thread has MAP_GROWSDOWN stack. This should only happen when ++ // current thread was created by user code with MAP_GROWSDOWN flag ++ // and then attached to VM. See notes in os_linux.cpp. ++ if (thread->osthread()->expanding_stack() == 0) { ++ thread->osthread()->set_expanding_stack(); ++ if (os::Linux::manually_expand_stack(thread, addr)) { ++ thread->osthread()->clear_expanding_stack(); ++ return 1; ++ } ++ thread->osthread()->clear_expanding_stack(); ++ } else { ++ fatal("recursive segv. expanding stack."); ++ } ++ } ++ } ++ } ++ ++ if (thread->thread_state() == _thread_in_Java) { ++ // Java thread running in Java code => find exception handler if any ++ // a fault inside compiled code, the interpreter, or a stub ++ ++ // A VM-related SIGILL may only occur if we are not in the zero page. ++ // On AIX, we get a SIGILL if we jump to 0x0 or to somewhere else ++ // in the zero page, because it is filled with 0x0. We ignore ++ // explicit SIGILLs in the zero page. ++ if (sig == SIGILL && (pc < (address) 0x200)) { ++ if (TraceTraps) { ++ tty->print_raw_cr("SIGILL happened inside zero page."); ++ } ++ goto report_and_die; ++ } ++ ++ // Handle signal from NativeJump::patch_verified_entry(). ++ if (( TrapBasedNotEntrantChecks && sig == SIGTRAP && nativeInstruction_at(pc)->is_sigtrap_zombie_not_entrant()) || ++ (!TrapBasedNotEntrantChecks && sig == SIGILL && nativeInstruction_at(pc)->is_sigill_zombie_not_entrant())) { ++ if (TraceTraps) { ++ tty->print_cr("trap: zombie_not_entrant (%s)", (sig == SIGTRAP) ? "SIGTRAP" : "SIGILL"); ++ } ++ stub = SharedRuntime::get_handle_wrong_method_stub(); ++ } ++ ++ else if (sig == SIGSEGV && ++ // A linux-ppc64 kernel before 2.6.6 doesn't set si_addr on some segfaults ++ // in 64bit mode (cf. http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.6), ++ // especially when we try to read from the safepoint polling page. So the check ++ // (address)info->si_addr == os::get_standard_polling_page() ++ // doesn't work for us. We use: ++ ((NativeInstruction*)pc)->is_safepoint_poll()) { ++ if (TraceTraps) { ++ tty->print_cr("trap: safepoint_poll at " INTPTR_FORMAT " (SIGSEGV)", pc); ++ } ++ stub = SharedRuntime::get_poll_stub(pc); ++ } ++ ++ // SIGTRAP-based ic miss check in compiled code. ++ else if (sig == SIGTRAP && TrapBasedICMissChecks && ++ nativeInstruction_at(pc)->is_sigtrap_ic_miss_check()) { ++ if (TraceTraps) { ++ tty->print_cr("trap: ic_miss_check at " INTPTR_FORMAT " (SIGTRAP)", pc); ++ } ++ stub = SharedRuntime::get_ic_miss_stub(); ++ } ++ ++ // SIGTRAP-based implicit null check in compiled code. ++ else if (sig == SIGTRAP && TrapBasedNullChecks && ++ nativeInstruction_at(pc)->is_sigtrap_null_check()) { ++ if (TraceTraps) { ++ tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGTRAP)", pc); ++ } ++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL); ++ } ++ ++ // SIGSEGV-based implicit null check in compiled code. ++ else if (sig == SIGSEGV && ImplicitNullChecks && ++ CodeCache::contains((void*) pc) && ++ !MacroAssembler::needs_explicit_null_check((intptr_t) info->si_addr)) { ++ if (TraceTraps) { ++ tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", pc); ++ } ++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL); ++ } ++ ++#ifdef COMPILER2 ++ // SIGTRAP-based implicit range check in compiled code. ++ else if (sig == SIGTRAP && TrapBasedRangeChecks && ++ nativeInstruction_at(pc)->is_sigtrap_range_check()) { ++ if (TraceTraps) { ++ tty->print_cr("trap: range_check at " INTPTR_FORMAT " (SIGTRAP)", pc); ++ } ++ stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL); ++ } ++#endif ++ else if (sig == SIGBUS) { ++ // BugId 4454115: A read from a MappedByteBuffer can fault here if the ++ // underlying file has been truncated. Do not crash the VM in such a case. ++ CodeBlob* cb = CodeCache::find_blob_unsafe(pc); ++ nmethod* nm = (cb != NULL && cb->is_nmethod()) ? (nmethod*)cb : NULL; ++ if (nm != NULL && nm->has_unsafe_access()) { ++ // We don't really need a stub here! Just set the pending exeption and ++ // continue at the next instruction after the faulting read. Returning ++ // garbage from this read is ok. ++ thread->set_pending_unsafe_access_error(); ++ uc->uc_mcontext.regs->nip = ((unsigned long)pc) + 4; ++ return true; ++ } ++ } ++ } ++ ++ else { // thread->thread_state() != _thread_in_Java ++ if (sig == SIGILL && VM_Version::is_determine_features_test_running()) { ++ // SIGILL must be caused by VM_Version::determine_features(). ++ *(int *)pc = 0; // patch instruction to 0 to indicate that it causes a SIGILL, ++ // flushing of icache is not necessary. ++ stub = pc + 4; // continue with next instruction. ++ } ++ else if (thread->thread_state() == _thread_in_vm && ++ sig == SIGBUS && thread->doing_unsafe_access()) { ++ // We don't really need a stub here! Just set the pending exeption and ++ // continue at the next instruction after the faulting read. Returning ++ // garbage from this read is ok. ++ thread->set_pending_unsafe_access_error(); ++ uc->uc_mcontext.regs->nip = ((unsigned long)pc) + 4; ++ return true; ++ } ++ } ++ ++ // Check to see if we caught the safepoint code in the ++ // process of write protecting the memory serialization page. ++ // It write enables the page immediately after protecting it ++ // so we can just return to retry the write. ++ if ((sig == SIGSEGV) && ++ // Si_addr may not be valid due to a bug in the linux-ppc64 kernel (see comment above). ++ // Use is_memory_serialization instead of si_addr. ++ ((NativeInstruction*)pc)->is_memory_serialization(thread, ucVoid)) { ++ // Synchronization problem in the pseudo memory barrier code (bug id 6546278) ++ // Block current thread until the memory serialize page permission restored. ++ os::block_on_serialize_page_trap(); ++ return true; ++ } ++ } ++ ++ if (stub != NULL) { ++ // Save all thread context in case we need to restore it. ++ if (thread != NULL) thread->set_saved_exception_pc(pc); ++ uc->uc_mcontext.regs->nip = (unsigned long)stub; ++ return true; ++ } ++ ++ // signal-chaining ++ if (os::Linux::chained_handler(sig, info, ucVoid)) { ++ return true; ++ } ++ ++ if (!abort_if_unrecognized) { ++ // caller wants another chance, so give it to him ++ return false; ++ } ++ ++ if (pc == NULL && uc != NULL) { ++ pc = os::Linux::ucontext_get_pc(uc); ++ } ++ ++report_and_die: ++ // unmask current signal ++ sigset_t newset; ++ sigemptyset(&newset); ++ sigaddset(&newset, sig); ++ sigprocmask(SIG_UNBLOCK, &newset, NULL); ++ ++ VMError err(t, sig, pc, info, ucVoid); ++ err.report_and_die(); ++ ++ ShouldNotReachHere(); ++ return false; ++} ++ ++void os::Linux::init_thread_fpu_state(void) { ++ // Disable FP exceptions. ++ __asm__ __volatile__ ("mtfsfi 6,0"); ++} ++ ++int os::Linux::get_fpu_control_word(void) { ++ // x86 has problems with FPU precision after pthread_cond_timedwait(). ++ // nothing to do on ppc64. ++ return 0; ++} ++ ++void os::Linux::set_fpu_control_word(int fpu_control) { ++ // x86 has problems with FPU precision after pthread_cond_timedwait(). ++ // nothing to do on ppc64. ++} ++ ++//////////////////////////////////////////////////////////////////////////////// ++// thread stack ++ ++size_t os::Linux::min_stack_allowed = 768*K; ++ ++bool os::Linux::supports_variable_stack_size() { return true; } ++ ++// return default stack size for thr_type ++size_t os::Linux::default_stack_size(os::ThreadType thr_type) { ++ // default stack size (compiler thread needs larger stack) ++ // Notice that the setting for compiler threads here have no impact ++ // because of the strange 'fallback logic' in os::create_thread(). ++ // Better set CompilerThreadStackSize in globals_.hpp if you want to ++ // specify a different stack size for compiler threads! ++ size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K); ++ return s; ++} ++ ++size_t os::Linux::default_guard_size(os::ThreadType thr_type) { ++ return 2 * page_size(); ++} ++ ++// Java thread: ++// ++// Low memory addresses ++// +------------------------+ ++// | |\ JavaThread created by VM does not have glibc ++// | glibc guard page | - guard, attached Java thread usually has ++// | |/ 1 page glibc guard. ++// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() ++// | |\ ++// | HotSpot Guard Pages | - red and yellow pages ++// | |/ ++// +------------------------+ JavaThread::stack_yellow_zone_base() ++// | |\ ++// | Normal Stack | - ++// | |/ ++// P2 +------------------------+ Thread::stack_base() ++// ++// Non-Java thread: ++// ++// Low memory addresses ++// +------------------------+ ++// | |\ ++// | glibc guard page | - usually 1 page ++// | |/ ++// P1 +------------------------+ Thread::stack_base() - Thread::stack_size() ++// | |\ ++// | Normal Stack | - ++// | |/ ++// P2 +------------------------+ Thread::stack_base() ++// ++// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from ++// pthread_attr_getstack() ++ ++static void current_stack_region(address * bottom, size_t * size) { ++ if (os::Linux::is_initial_thread()) { ++ // initial thread needs special handling because pthread_getattr_np() ++ // may return bogus value. ++ *bottom = os::Linux::initial_thread_stack_bottom(); ++ *size = os::Linux::initial_thread_stack_size(); ++ } else { ++ pthread_attr_t attr; ++ ++ int rslt = pthread_getattr_np(pthread_self(), &attr); ++ ++ // JVM needs to know exact stack location, abort if it fails ++ if (rslt != 0) { ++ if (rslt == ENOMEM) { ++ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); ++ } else { ++ fatal(err_msg("pthread_getattr_np failed with errno = %d", rslt)); ++ } ++ } ++ ++ if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { ++ fatal("Can not locate current stack attributes!"); ++ } ++ ++ pthread_attr_destroy(&attr); ++ ++ } ++ assert(os::current_stack_pointer() >= *bottom && ++ os::current_stack_pointer() < *bottom + *size, "just checking"); ++} ++ ++address os::current_stack_base() { ++ address bottom; ++ size_t size; ++ current_stack_region(&bottom, &size); ++ return (bottom + size); ++} ++ ++size_t os::current_stack_size() { ++ // stack size includes normal stack and HotSpot guard pages ++ address bottom; ++ size_t size; ++ current_stack_region(&bottom, &size); ++ return size; ++} ++ ++///////////////////////////////////////////////////////////////////////////// ++// helper functions for fatal error handler ++ ++void os::print_context(outputStream *st, void *context) { ++ if (context == NULL) return; ++ ++ ucontext_t* uc = (ucontext_t*)context; ++ ++ st->print_cr("Registers:"); ++ st->print("pc =" INTPTR_FORMAT " ", uc->uc_mcontext.regs->nip); ++ st->print("lr =" INTPTR_FORMAT " ", uc->uc_mcontext.regs->link); ++ st->print("ctr=" INTPTR_FORMAT " ", uc->uc_mcontext.regs->ctr); ++ st->cr(); ++ for (int i = 0; i < 32; i++) { ++ st->print("r%-2d=" INTPTR_FORMAT " ", i, uc->uc_mcontext.regs->gpr[i]); ++ if (i % 3 == 2) st->cr(); ++ } ++ st->cr(); ++ st->cr(); ++ ++ intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc); ++ st->print_cr("Top of Stack: (sp=" PTR_FORMAT ")", sp); ++ print_hex_dump(st, (address)sp, (address)(sp + 128), sizeof(intptr_t)); ++ st->cr(); ++ ++ // Note: it may be unsafe to inspect memory near pc. For example, pc may ++ // 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); ++ print_hex_dump(st, pc - 64, pc + 64, /*instrsize=*/4); ++ st->cr(); ++} ++ ++void os::print_register_info(outputStream *st, void *context) { ++ if (context == NULL) return; ++ ++ ucontext_t *uc = (ucontext_t*)context; ++ ++ st->print_cr("Register to memory mapping:"); ++ st->cr(); ++ ++ // this is only for the "general purpose" registers ++ for (int i = 0; i < 32; i++) { ++ st->print("r%-2d=", i); ++ print_location(st, uc->uc_mcontext.regs->gpr[i]); ++ } ++ st->cr(); ++} ++ ++extern "C" { ++ int SpinPause() { ++ return 0; ++ } ++} ++ ++#ifndef PRODUCT ++void os::verify_stack_alignment() { ++ assert(((intptr_t)os::current_stack_pointer() & (StackAlignmentInBytes-1)) == 0, "incorrect stack alignment"); ++} ++#endif +--- ./hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_LINUX_PPC_VM_OS_LINUX_PPC_HPP ++#define OS_CPU_LINUX_PPC_VM_OS_LINUX_PPC_HPP ++ ++ static void setup_fpu() {} ++ ++ // Used to register dynamic code cache area with the OS ++ // Note: Currently only used in 64 bit Windows implementations ++ static bool register_code_area(char *low, char *high) { return true; } ++ ++#endif // OS_CPU_LINUX_PPC_VM_OS_LINUX_PPC_HPP +--- ./hotspot/src/os_cpu/linux_ppc/vm/prefetch_linux_ppc.inline.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/prefetch_linux_ppc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_LINUX_PPC_VM_PREFETCH_LINUX_PPC_INLINE_HPP ++#define OS_CPU_LINUX_PPC_VM_PREFETCH_LINUX_PPC_INLINE_HPP ++ ++#include "runtime/prefetch.hpp" ++ ++ ++inline void Prefetch::read(void *loc, intx interval) { ++ __asm__ __volatile__ ( ++ " dcbt 0, %0 \n" ++ : ++ : /*%0*/"r" ( ((address)loc) +((long)interval) ) ++ //: ++ ); ++} ++ ++inline void Prefetch::write(void *loc, intx interval) { ++ __asm__ __volatile__ ( ++ " dcbtst 0, %0 \n" ++ : ++ : /*%0*/"r" ( ((address)loc) +((long)interval) ) ++ //: ++ ); ++} ++ ++#endif // OS_CPU_LINUX_PPC_VM_PREFETCH_LINUX_OJDKPPC_HPP +--- ./hotspot/src/os_cpu/linux_ppc/vm/threadLS_linux_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/threadLS_linux_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 "runtime/threadLocalStorage.hpp" ++ ++void ThreadLocalStorage::generate_code_for_get_thread() { ++ // nothing we can do here for user-level thread ++} ++ ++void ThreadLocalStorage::pd_init() { ++ // Nothing to do ++} ++ ++void ThreadLocalStorage::pd_set_thread(Thread* thread) { ++ os::thread_local_storage_at_put(ThreadLocalStorage::thread_index(), thread); ++} +--- ./hotspot/src/os_cpu/linux_ppc/vm/threadLS_linux_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/threadLS_linux_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_LINUX_PPC_VM_THREADLS_LINUX_PPC_HPP ++#define OS_CPU_LINUX_PPC_VM_THREADLS_LINUX_PPC_HPP ++ ++ // Processor dependent parts of ThreadLocalStorage ++ ++public: ++ static Thread* thread() { ++ return (Thread *) os::thread_local_storage_at(thread_index()); ++ } ++ ++#endif // OS_CPU_LINUX_PPC_VM_THREADLS_LINUX_PPC_HPP +--- ./hotspot/src/os_cpu/linux_ppc/vm/thread_linux_ppc.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/thread_linux_ppc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2014 SAP AG. 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 "runtime/frame.hpp" ++#include "runtime/thread.hpp" ++ ++// Forte Analyzer AsyncGetCallTrace profiling support is not implemented on Linux/PPC. ++bool JavaThread::pd_get_top_frame_for_signal_handler(frame* fr_addr, void* ucontext, bool isInJava) { ++ Unimplemented(); ++ return false; ++} ++ ++void JavaThread::cache_global_variables() { } +--- ./hotspot/src/os_cpu/linux_ppc/vm/thread_linux_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/thread_linux_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,83 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_LINUX_PPC_VM_THREAD_LINUX_PPC_HPP ++#define OS_CPU_LINUX_PPC_VM_THREAD_LINUX_PPC_HPP ++ ++ private: ++ ++ void pd_initialize() { ++ _anchor.clear(); ++ _last_interpreter_fp = NULL; ++ } ++ ++ // The `last' frame is the youngest Java frame on the thread's stack. ++ frame pd_last_frame() { ++ assert(has_last_Java_frame(), "must have last_Java_sp() when suspended"); ++ ++ intptr_t* sp = last_Java_sp(); ++ address pc = _anchor.last_Java_pc(); ++ ++ // Last_Java_pc ist not set, if we come here from compiled code. ++ if (pc == NULL) { ++ pc = (address) *(sp + 2); ++ } ++ ++ return frame(sp, pc); ++ } ++ ++ public: ++ ++ void set_base_of_stack_pointer(intptr_t* base_sp) {} ++ intptr_t* base_of_stack_pointer() { return NULL; } ++ void record_base_of_stack_pointer() {} ++ ++ // These routines are only used on cpu architectures that ++ // have separate register stacks (Itanium). ++ static bool register_stack_overflow() { return false; } ++ static void enable_register_stack_guard() {} ++ static void disable_register_stack_guard() {} ++ ++ bool pd_get_top_frame_for_signal_handler(frame* fr_addr, void* ucontext, bool isInJava); ++ ++ protected: ++ ++ // -Xprof support ++ // ++ // In order to find the last Java fp from an async profile ++ // tick, we store the current interpreter fp in the thread. ++ // This value is only valid while we are in the C++ interpreter ++ // and profiling. ++ intptr_t *_last_interpreter_fp; ++ ++ public: ++ ++ static ByteSize last_interpreter_fp_offset() { ++ return byte_offset_of(JavaThread, _last_interpreter_fp); ++ } ++ ++ intptr_t* last_interpreter_fp() { return _last_interpreter_fp; } ++ ++#endif // OS_CPU_LINUX_PPC_VM_THREAD_LINUX_PPC_HPP +--- ./hotspot/src/os_cpu/linux_ppc/vm/vmStructs_linux_ppc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os_cpu/linux_ppc/vm/vmStructs_linux_ppc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 OS_CPU_LINUX_PPC_VM_VMSTRUCTS_LINUX_PPC_HPP ++#define OS_CPU_LINUX_PPC_VM_VMSTRUCTS_LINUX_PPC_HPP ++ ++// These are the OS and CPU-specific fields, types and integer ++// constants required by the Serviceability Agent. This file is ++// referenced by vmStructs.cpp. ++ ++#define VM_STRUCTS_OS_CPU(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field, nonproduct_nonstatic_field, c2_nonstatic_field, unchecked_c1_static_field, unchecked_c2_static_field) \ ++ \ ++ /******************************/ \ ++ /* Threads (NOTE: incomplete) */ \ ++ /******************************/ \ ++ nonstatic_field(OSThread, _thread_id, pid_t) \ ++ nonstatic_field(OSThread, _pthread_id, pthread_t) ++ ++ ++#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \ ++ \ ++ /**********************/ \ ++ /* Posix Thread IDs */ \ ++ /**********************/ \ ++ \ ++ declare_integer_type(pid_t) \ ++ declare_unsigned_integer_type(pthread_t) ++ ++#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) ++ ++#define VM_LONG_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant) ++ ++#endif // OS_CPU_LINUX_PPC_VM_VMSTRUCTS_LINUX_PPC_HPP +--- ./hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -78,12 +78,12 @@ + __asm__ volatile( + "1: \n\t" + " ldx [%2], %%o2\n\t" +- " add %0, %%o2, %%o3\n\t" ++ " add %1, %%o2, %%o3\n\t" + " casx [%2], %%o2, %%o3\n\t" + " cmp %%o2, %%o3\n\t" + " bne %%xcc, 1b\n\t" + " nop\n\t" +- " add %0, %%o2, %0\n\t" ++ " add %1, %%o2, %0\n\t" + : "=r" (rv) + : "r" (add_value), "r" (dest) + : "memory", "o2", "o3"); +--- ./hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -302,29 +302,30 @@ + if (context == NULL) return; + + ucontext_t *uc = (ucontext_t*)context; ++ sigcontext* sc = (sigcontext*)context; + intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc); + + st->print_cr("Register to memory mapping:"); + st->cr(); + + // this is only for the "general purpose" registers +- st->print("G1="); print_location(st, SIG_REGS(sc).u_regs[CON__G1]); +- st->print("G2="); print_location(st, SIG_REGS(sc).u_regs[CON__G2]); +- st->print("G3="); print_location(st, SIG_REGS(sc).u_regs[CON__G3]); +- st->print("G4="); print_location(st, SIG_REGS(sc).u_regs[CON__G4]); +- st->print("G5="); print_location(st, SIG_REGS(sc).u_regs[CON__G5]); +- st->print("G6="); print_location(st, SIG_REGS(sc).u_regs[CON__G6]); +- st->print("G7="); print_location(st, SIG_REGS(sc).u_regs[CON__G7]); ++ st->print("G1="); print_location(st, SIG_REGS(sc).u_regs[CON_G1]); ++ st->print("G2="); print_location(st, SIG_REGS(sc).u_regs[CON_G2]); ++ st->print("G3="); print_location(st, SIG_REGS(sc).u_regs[CON_G3]); ++ st->print("G4="); print_location(st, SIG_REGS(sc).u_regs[CON_G4]); ++ st->print("G5="); print_location(st, SIG_REGS(sc).u_regs[CON_G5]); ++ st->print("G6="); print_location(st, SIG_REGS(sc).u_regs[CON_G6]); ++ st->print("G7="); print_location(st, SIG_REGS(sc).u_regs[CON_G7]); + st->cr(); + +- st->print("O0="); print_location(st, SIG_REGS(sc).u_regs[CON__O0]); +- st->print("O1="); print_location(st, SIG_REGS(sc).u_regs[CON__O1]); +- st->print("O2="); print_location(st, SIG_REGS(sc).u_regs[CON__O2]); +- st->print("O3="); print_location(st, SIG_REGS(sc).u_regs[CON__O3]); +- st->print("O4="); print_location(st, SIG_REGS(sc).u_regs[CON__O4]); +- st->print("O5="); print_location(st, SIG_REGS(sc).u_regs[CON__O5]); +- st->print("O6="); print_location(st, SIG_REGS(sc).u_regs[CON__O6]); +- st->print("O7="); print_location(st, SIG_REGS(sc).u_regs[CON__O7]); ++ st->print("O0="); print_location(st, SIG_REGS(sc).u_regs[CON_O0]); ++ st->print("O1="); print_location(st, SIG_REGS(sc).u_regs[CON_O1]); ++ st->print("O2="); print_location(st, SIG_REGS(sc).u_regs[CON_O2]); ++ st->print("O3="); print_location(st, SIG_REGS(sc).u_regs[CON_O3]); ++ st->print("O4="); print_location(st, SIG_REGS(sc).u_regs[CON_O4]); ++ st->print("O5="); print_location(st, SIG_REGS(sc).u_regs[CON_O5]); ++ st->print("O6="); print_location(st, SIG_REGS(sc).u_regs[CON_O6]); ++ st->print("O7="); print_location(st, SIG_REGS(sc).u_regs[CON_O7]); + st->cr(); + + st->print("L0="); print_location(st, sp[L0->sp_offset_in_saved_window()]); +@@ -516,7 +517,7 @@ + if (nativeInstruction_at(*pc)->is_ic_miss_trap()) { + #ifdef ASSERT + #ifdef TIERED +- CodeBlob* cb = CodeCache::find_blob_unsafe(pc); ++ CodeBlob* cb = CodeCache::find_blob_unsafe(*pc); + assert(cb->is_compiled_by_c2(), "Wrong compiler"); + #endif // TIERED + #endif // ASSERT +--- ./hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -88,6 +88,8 @@ + #define SPELL_REG_FP "ebp" + #endif // AMD64 + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + address os::current_stack_pointer() { + #ifdef SPARC_WORKS + register void *esp; +@@ -337,6 +339,11 @@ + } + } + ++ if ((sig == SIGSEGV) && VM_Version::is_cpuinfo_segv_addr(pc)) { ++ // Verify that OS save/restore AVX registers. ++ stub = VM_Version::cpuinfo_cont_addr(); ++ } ++ + if (thread->thread_state() == _thread_in_Java) { + // Java thread running in Java code => find exception handler if any + // a fault inside compiled code, the interpreter, or a stub +--- ./hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -36,7 +36,7 @@ + + // Atomically copy 64 bits of data + static void atomic_copy64(volatile void *src, volatile void *dst) { +-#if defined(PPC) && !defined(_LP64) ++#if defined(PPC32) + double tmp; + asm volatile ("lfd %0, 0(%1)\n" + "stfd %0, 0(%2)\n" +--- ./hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -75,13 +75,19 @@ + do_sysinfo(SI_ARCHITECTURE_64, "sparcv9", &features, generic_v9_m); + + // Extract valid instruction set extensions. +- uint_t av; +- uint_t avn = os::Solaris::getisax(&av, 1); +- assert(avn == 1, "should only return one av"); ++ uint_t avs[2]; ++ uint_t avn = os::Solaris::getisax(avs, 2); ++ assert(avn <= 2, "should return two or less av's"); ++ uint_t av = avs[0]; + + #ifndef PRODUCT +- if (PrintMiscellaneous && Verbose) +- tty->print_cr("getisax(2) returned: " PTR32_FORMAT, av); ++ if (PrintMiscellaneous && Verbose) { ++ tty->print("getisax(2) returned: " PTR32_FORMAT, av); ++ if (avn > 1) { ++ tty->print(", " PTR32_FORMAT, avs[1]); ++ } ++ tty->cr(); ++ } + #endif + + if (av & AV_SPARC_MUL32) features |= hardware_mul32_m; +@@ -91,6 +97,13 @@ + if (av & AV_SPARC_POPC) features |= hardware_popc_m; + if (av & AV_SPARC_VIS) features |= vis1_instructions_m; + if (av & AV_SPARC_VIS2) features |= vis2_instructions_m; ++ if (avn > 1) { ++ uint_t av2 = avs[1]; ++#ifndef AV2_SPARC_SPARC5 ++#define AV2_SPARC_SPARC5 0x00000008 /* The 29 new fp and sub instructions */ ++#endif ++ if (av2 & AV2_SPARC_SPARC5) features |= sparc5_instructions_m; ++ } + + // Next values are not defined before Solaris 10 + // but Solaris 8 is used for jdk6 update builds. +@@ -119,6 +132,11 @@ + #endif + if (av & AV_SPARC_CBCOND) features |= cbcond_instructions_m; + ++#ifndef AV_SPARC_AES ++#define AV_SPARC_AES 0x00020000 /* aes instrs supported */ ++#endif ++ if (av & AV_SPARC_AES) features |= aes_instructions_m; ++ + } else { + // getisax(2) failed, use the old legacy code. + #ifndef PRODUCT +--- ./hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -459,6 +459,11 @@ + } + } + ++ if ((sig == SIGSEGV) && VM_Version::is_cpuinfo_segv_addr(pc)) { ++ // Verify that OS save/restore AVX registers. ++ stub = VM_Version::cpuinfo_cont_addr(); ++ } ++ + if (thread->thread_state() == _thread_in_vm) { + if (sig == SIGBUS && info->si_code == BUS_OBJERR && thread->doing_unsafe_access()) { + stub = StubRoutines::handler_for_unsafe_access(); +@@ -475,9 +480,11 @@ + // here if the underlying file has been truncated. + // Do not crash the VM in such a case. + CodeBlob* cb = CodeCache::find_blob_unsafe(pc); +- nmethod* nm = cb->is_nmethod() ? (nmethod*)cb : NULL; +- if (nm != NULL && nm->has_unsafe_access()) { +- stub = StubRoutines::handler_for_unsafe_access(); ++ if (cb != NULL) { ++ nmethod* nm = cb->is_nmethod() ? (nmethod*)cb : NULL; ++ if (nm != NULL && nm->has_unsafe_access()) { ++ stub = StubRoutines::handler_for_unsafe_access(); ++ } + } + } + else +@@ -724,6 +731,7 @@ + err.report_and_die(); + + ShouldNotReachHere(); ++ return false; + } + + void os::print_context(outputStream *st, void *context) { +--- ./hotspot/src/share/tools/hsdis/Makefile Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/tools/hsdis/Makefile Wed Jul 30 03:51:43 2014 -0700 +@@ -27,6 +27,7 @@ + # Default arch; it is changed below as needed. + ARCH = i386 + OS = $(shell uname) ++AR = ar + + ## OS = SunOS ## + ifeq ($(OS),SunOS) +@@ -73,6 +74,7 @@ + ifdef LP64 + CFLAGS/sparcv9 += -m64 + CFLAGS/amd64 += -m64 ++CFLAGS/ppc64 += -m64 + else + ARCH=$(ARCH1:amd64=i386) + CFLAGS/i386 += -m32 +@@ -88,8 +90,20 @@ + DLDFLAGS += -shared + LDFLAGS += -ldl + OUTFLAGS += -o $@ +-## OS = Windows ## +-else # !SunOS, !Linux => Darwin or Windows ++else ++## OS = AIX ## ++ifeq ($(OS),AIX) ++OS = aix ++ARCH = ppc64 ++CC = xlc_r ++CFLAGS += -DAIX -g -qpic=large -q64 ++CFLAGS/ppc64 += -q64 ++AR = ar -X64 ++DLDFLAGS += -qmkshrobj -lz ++OUTFLAGS += -o $@ ++LIB_EXT = .so ++else ++## OS = Darwin ## + ifeq ($(OS),Darwin) + CPU = $(shell uname -m) + ARCH1=$(CPU:x86_64=amd64) +@@ -113,7 +127,8 @@ + DLDFLAGS += -lz + LDFLAGS += -ldl + OUTFLAGS += -o $@ +-else #Windows ++else ++## OS = Windows ## + OS = windows + CC = gcc + CFLAGS += /nologo /MD /W3 /WX /O2 /Fo$(@:.dll=.obj) /Gi- +@@ -123,6 +138,7 @@ + OUTFLAGS += /link /out:$@ + LIB_EXT = .dll + endif # Darwin ++endif # AIX + endif # Linux + endif # SunOS + +@@ -176,7 +192,7 @@ + if [ ! -f $@ ]; then cd $(TARGET_DIR); make all-opcodes; fi + + $(TARGET_DIR)/Makefile: +- (cd $(TARGET_DIR); CC=$(CC) CFLAGS="$(CFLAGS)" $(BINUTILSDIR)/configure --disable-nls $(CONFIGURE_ARGS)) ++ (cd $(TARGET_DIR); CC=$(CC) CFLAGS="$(CFLAGS)" AR="$(AR)" $(BINUTILSDIR)/configure --disable-nls $(CONFIGURE_ARGS)) + + $(TARGET): $(SOURCE) $(LIBS) $(LIBRARIES) $(TARGET_DIR) + $(CC) $(OUTFLAGS) $(CPPFLAGS) $(CFLAGS) $(SOURCE) $(DLDFLAGS) $(LIBRARIES) +--- ./hotspot/src/share/tools/hsdis/README Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/tools/hsdis/README Wed Jul 30 03:51:43 2014 -0700 +@@ -1,4 +1,4 @@ +-Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. ++Copyright (c) 2008, 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 +@@ -54,6 +54,17 @@ + disassembler library only. If you build demo it will build a demo + program that attempts to exercise the library. + ++With recent version of binutils (i.e. binutils-2.23.2) you may get the ++following build error: ++ ++WARNING: `makeinfo' is missing on your system. You should only need it if ++ you modified a `.texi' or `.texinfo' file, or any other file ++ ... ++ ++This is because of "Bug 15345 - binutils-2.23.2 tarball doesn't build ++without makeinfo" [2]. The easiest way to work around this problem is ++by doing a "touch $BINUTILS/bfd/doc/bfd.info". ++ + Windows + + In theory this should be buildable on Windows but getting a working +@@ -101,3 +112,13 @@ + + If the product mode of the JVM does not accept -XX:+PrintAssembly, + you do not have a version new enough to use the hsdis plugin. ++ ++* Wiki ++ ++More information can be found in the OpenJDK HotSpot Wiki [1]. ++ ++ ++Resources: ++ ++[1] https://wiki.openjdk.java.net/display/HotSpot/PrintAssembly ++[2] http://sourceware.org/bugzilla/show_bug.cgi?id=15345 +--- ./hotspot/src/share/tools/hsdis/hsdis.c Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/tools/hsdis/hsdis.c Wed Jul 30 03:51:43 2014 -0700 +@@ -307,7 +307,8 @@ + app_data->printf_stream, + app_data->printf_callback, + native_bfd, +- app_data->insn_options); ++ /* On PowerPC we get warnings, if we pass empty options */ ++ (caller_options == NULL) ? NULL : app_data->insn_options); + + /* Finish linking together the various callback blocks. */ + app_data->dinfo.application_data = (void*) app_data; +@@ -459,6 +460,9 @@ + #ifdef LIBARCH_sparcv9 + res = "sparc:v9b"; + #endif ++#ifdef LIBARCH_ppc64 ++ res = "powerpc:common64"; ++#endif + if (res == NULL) + res = "architecture not set in Makefile!"; + return res; +--- ./hotspot/src/share/vm/adlc/adlparse.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/adlc/adlparse.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -219,19 +219,21 @@ + else if (!strcmp(ident, "encode")) { + parse_err(SYNERR, "Instructions specify ins_encode, not encode\n"); + } +- else if (!strcmp(ident, "ins_encode")) ins_encode_parse(*instr); +- else if (!strcmp(ident, "opcode")) instr->_opcode = opcode_parse(instr); +- else if (!strcmp(ident, "size")) instr->_size = size_parse(instr); +- else if (!strcmp(ident, "effect")) effect_parse(instr); +- else if (!strcmp(ident, "expand")) instr->_exprule = expand_parse(instr); +- else if (!strcmp(ident, "rewrite")) instr->_rewrule = rewrite_parse(); ++ else if (!strcmp(ident, "ins_encode")) ins_encode_parse(*instr); ++ // Parse late expand keyword. ++ else if (!strcmp(ident, "postalloc_expand")) postalloc_expand_parse(*instr); ++ else if (!strcmp(ident, "opcode")) instr->_opcode = opcode_parse(instr); ++ else if (!strcmp(ident, "size")) instr->_size = size_parse(instr); ++ else if (!strcmp(ident, "effect")) effect_parse(instr); ++ else if (!strcmp(ident, "expand")) instr->_exprule = expand_parse(instr); ++ else if (!strcmp(ident, "rewrite")) instr->_rewrule = rewrite_parse(); + else if (!strcmp(ident, "constraint")) { + parse_err(SYNERR, "Instructions do not specify a constraint\n"); + } + else if (!strcmp(ident, "construct")) { + parse_err(SYNERR, "Instructions do not specify a construct\n"); + } +- else if (!strcmp(ident, "format")) instr->_format = format_parse(); ++ else if (!strcmp(ident, "format")) instr->_format = format_parse(); + else if (!strcmp(ident, "interface")) { + parse_err(SYNERR, "Instructions do not specify an interface\n"); + } +@@ -240,13 +242,14 @@ + // Check identifier to see if it is the name of an attribute + const Form *form = _globalNames[ident]; + AttributeForm *attr = form ? form->is_attribute() : NULL; +- if( attr && (attr->_atype == INS_ATTR) ) { ++ if (attr && (attr->_atype == INS_ATTR)) { + // Insert the new attribute into the linked list. + Attribute *temp = attr_parse(ident); + temp->_next = instr->_attribs; + instr->_attribs = temp; + } else { +- parse_err(SYNERR, "expected one of:\n predicate, match, encode, or the name of an instruction attribute at %s\n", ident); ++ parse_err(SYNERR, "expected one of:\n predicate, match, encode, or the name of" ++ " an instruction attribute at %s\n", ident); + } + } + skipws(); +@@ -258,13 +261,17 @@ + } + // Check for "Set" form of chain rule + adjust_set_rule(instr); +- if (_AD._pipeline ) { +- if( instr->expands() ) { +- if( instr->_ins_pipe ) +- parse_err(WARN, "ins_pipe and expand rule both specified for instruction \"%s\"; ins_pipe will be unused\n", instr->_ident); ++ if (_AD._pipeline) { ++ // No pipe required for late expand. ++ if (instr->expands() || instr->postalloc_expands()) { ++ if (instr->_ins_pipe) { ++ parse_err(WARN, "ins_pipe and expand rule both specified for instruction \"%s\";" ++ " ins_pipe will be unused\n", instr->_ident); ++ } + } else { +- if( !instr->_ins_pipe ) ++ if (!instr->_ins_pipe) { + parse_err(WARN, "No ins_pipe specified for instruction \"%s\"\n", instr->_ident); ++ } + } + } + // Add instruction to tail of instruction list +@@ -2779,11 +2786,13 @@ + encoding->add_parameter(opForm->_ident, param); + } + +- // Define a MacroAssembler instance for use by the encoding. The +- // name is chosen to match the __ idiom used for assembly in other +- // parts of hotspot and assumes the existence of the standard +- // #define __ _masm. +- encoding->add_code(" MacroAssembler _masm(&cbuf);\n"); ++ if (!inst._is_postalloc_expand) { ++ // Define a MacroAssembler instance for use by the encoding. The ++ // name is chosen to match the __ idiom used for assembly in other ++ // parts of hotspot and assumes the existence of the standard ++ // #define __ _masm. ++ encoding->add_code(" MacroAssembler _masm(&cbuf);\n"); ++ } + + // Parse the following %{ }% block + ins_encode_parse_block_impl(inst, encoding, ec_name); +@@ -2854,10 +2863,14 @@ + // Check if this instruct is a MachConstantNode. + if (strcmp(rep_var, "constanttablebase") == 0) { + // This instruct is a MachConstantNode. +- inst.set_is_mach_constant(true); ++ inst.set_needs_constant_base(true); ++ if (strncmp("MachCall", inst.mach_base_class(_globalNames), strlen("MachCall")) != 0 ) { ++ inst.set_is_mach_constant(true); ++ } + + if (_curchar == '(') { +- parse_err(SYNERR, "constanttablebase in instruct %s cannot have an argument (only constantaddress and constantoffset)", ec_name); ++ parse_err(SYNERR, "constanttablebase in instruct %s cannot have an argument " ++ "(only constantaddress and constantoffset)", ec_name); + return; + } + } +@@ -2955,18 +2968,34 @@ + while (_curchar != ')') { + char *param = get_ident_or_literal_constant("encoding operand"); + if ( param != NULL ) { +- // Found a parameter: +- // Check it is a local name, add it to the list, then check for more +- // New: allow hex constants as parameters to an encode method. +- // New: allow parenthesized expressions as parameters. +- // New: allow "primary", "secondary", "tertiary" as parameters. +- // New: allow user-defined register name as parameter +- if ( (inst._localNames[param] == NULL) && +- !ADLParser::is_literal_constant(param) && +- (Opcode::as_opcode_type(param) == Opcode::NOT_AN_OPCODE) && +- ((_AD._register == NULL ) || (_AD._register->getRegDef(param) == NULL)) ) { +- parse_err(SYNERR, "Using non-locally defined parameter %s for encoding %s.\n", param, ec_name); +- return; ++ ++ // Check if this instruct is a MachConstantNode. ++ if (strcmp(param, "constanttablebase") == 0) { ++ // This instruct is a MachConstantNode. ++ inst.set_needs_constant_base(true); ++ if (strncmp("MachCall", inst.mach_base_class(_globalNames), strlen("MachCall")) != 0 ) { ++ inst.set_is_mach_constant(true); ++ } ++ ++ if (_curchar == '(') { ++ parse_err(SYNERR, "constanttablebase in instruct %s cannot have an argument " ++ "(only constantaddress and constantoffset)", ec_name); ++ return; ++ } ++ } else { ++ // Found a parameter: ++ // Check it is a local name, add it to the list, then check for more ++ // New: allow hex constants as parameters to an encode method. ++ // New: allow parenthesized expressions as parameters. ++ // New: allow "primary", "secondary", "tertiary" as parameters. ++ // New: allow user-defined register name as parameter ++ if ( (inst._localNames[param] == NULL) && ++ !ADLParser::is_literal_constant(param) && ++ (Opcode::as_opcode_type(param) == Opcode::NOT_AN_OPCODE) && ++ ((_AD._register == NULL ) || (_AD._register->getRegDef(param) == NULL)) ) { ++ parse_err(SYNERR, "Using non-locally defined parameter %s for encoding %s.\n", param, ec_name); ++ return; ++ } + } + params->add_entry(param); + +@@ -3050,6 +3079,160 @@ + inst._insencode = encrule; + } + ++//------------------------------postalloc_expand_parse--------------------------- ++// Encode rules have the form ++// postalloc_expand( encode_class_name(parameter_list) ); ++// ++// The "encode_class_name" must be defined in the encode section. ++// The parameter list contains $names that are locals. ++// ++// This is just a copy of ins_encode_parse without the loop. ++void ADLParser::postalloc_expand_parse(InstructForm& inst) { ++ inst._is_postalloc_expand = true; ++ ++ // Parse encode class name. ++ skipws(); // Skip whitespace. ++ if (_curchar != '(') { ++ // Check for postalloc_expand %{ form ++ if ((_curchar == '%') && (*(_ptr+1) == '{')) { ++ next_char(); // Skip '%' ++ next_char(); // Skip '{' ++ ++ // Parse the block form of postalloc_expand ++ ins_encode_parse_block(inst); ++ return; ++ } ++ ++ parse_err(SYNERR, "missing '(' in postalloc_expand definition\n"); ++ return; ++ } ++ next_char(); // Move past '('. ++ skipws(); ++ ++ InsEncode *encrule = new InsEncode(); // Encode class for instruction. ++ encrule->_linenum = linenum(); ++ char *ec_name = NULL; // String representation of encode rule. ++ // identifier is optional. ++ if (_curchar != ')') { ++ ec_name = get_ident(); ++ if (ec_name == NULL) { ++ parse_err(SYNERR, "Invalid postalloc_expand class name after 'postalloc_expand('.\n"); ++ return; ++ } ++ // Check that encoding is defined in the encode section. ++ EncClass *encode_class = _AD._encode->encClass(ec_name); ++ ++ // Get list for encode method's parameters ++ NameAndList *params = encrule->add_encode(ec_name); ++ ++ // Parse the parameters to this encode method. ++ skipws(); ++ if (_curchar == '(') { ++ next_char(); // Move past '(' for parameters. ++ ++ // Parse the encode method's parameters. ++ while (_curchar != ')') { ++ char *param = get_ident_or_literal_constant("encoding operand"); ++ if (param != NULL) { ++ // Found a parameter: ++ ++ // First check for constant table support. ++ ++ // Check if this instruct is a MachConstantNode. ++ if (strcmp(param, "constanttablebase") == 0) { ++ // This instruct is a MachConstantNode. ++ inst.set_needs_constant_base(true); ++ if (strncmp("MachCall", inst.mach_base_class(_globalNames), strlen("MachCall")) != 0 ) { ++ inst.set_is_mach_constant(true); ++ } ++ ++ if (_curchar == '(') { ++ parse_err(SYNERR, "constanttablebase in instruct %s cannot have an argument " ++ "(only constantaddress and constantoffset)", ec_name); ++ return; ++ } ++ } ++ else if ((strcmp(param, "constantaddress") == 0) || ++ (strcmp(param, "constantoffset") == 0)) { ++ // This instruct is a MachConstantNode. ++ inst.set_is_mach_constant(true); ++ ++ // If the constant keyword has an argument, parse it. ++ if (_curchar == '(') constant_parse(inst); ++ } ++ ++ // Else check it is a local name, add it to the list, then check for more. ++ // New: allow hex constants as parameters to an encode method. ++ // New: allow parenthesized expressions as parameters. ++ // New: allow "primary", "secondary", "tertiary" as parameters. ++ // New: allow user-defined register name as parameter. ++ else if ((inst._localNames[param] == NULL) && ++ !ADLParser::is_literal_constant(param) && ++ (Opcode::as_opcode_type(param) == Opcode::NOT_AN_OPCODE) && ++ ((_AD._register == NULL) || (_AD._register->getRegDef(param) == NULL))) { ++ parse_err(SYNERR, "Using non-locally defined parameter %s for encoding %s.\n", param, ec_name); ++ return; ++ } ++ params->add_entry(param); ++ ++ skipws(); ++ if (_curchar == ',') { ++ // More parameters to come. ++ next_char(); // Move past ',' between parameters. ++ skipws(); // Skip to next parameter. ++ } else if (_curchar == ')') { ++ // Done with parameter list ++ } else { ++ // Only ',' or ')' are valid after a parameter name. ++ parse_err(SYNERR, "expected ',' or ')' after parameter %s.\n", ec_name); ++ return; ++ } ++ ++ } else { ++ skipws(); ++ // Did not find a parameter. ++ if (_curchar == ',') { ++ parse_err(SYNERR, "Expected encode parameter before ',' in postalloc_expand %s.\n", ec_name); ++ return; ++ } ++ if (_curchar != ')') { ++ parse_err(SYNERR, "Expected ')' after postalloc_expand parameters.\n"); ++ return; ++ } ++ } ++ } // WHILE loop collecting parameters. ++ next_char(); // Move past ')' at end of parameters. ++ } // Done with parameter list for encoding. ++ ++ // Check for ',' or ')' after encoding. ++ skipws(); // Move to character after parameters. ++ if (_curchar != ')') { ++ // Only a ')' is allowed. ++ parse_err(SYNERR, "Expected ')' after postalloc_expand %s.\n", ec_name); ++ return; ++ } ++ } // Done parsing postalloc_expand method and their parameters. ++ if (_curchar != ')') { ++ parse_err(SYNERR, "Missing ')' at end of postalloc_expand description.\n"); ++ return; ++ } ++ next_char(); // Move past ')'. ++ skipws(); // Skip leading whitespace. ++ ++ if (_curchar != ';') { ++ parse_err(SYNERR, "Missing ';' at end of postalloc_expand.\n"); ++ return; ++ } ++ next_char(); // Move past ';'. ++ skipws(); // Be friendly to oper_parse(). ++ ++ // Debug Stuff. ++ if (_AD._adl_debug > 1) fprintf(stderr, "Instruction postalloc_expand: %s\n", ec_name); ++ ++ // Set encode class of this instruction. ++ inst._insencode = encrule; ++} ++ + + //------------------------------constant_parse--------------------------------- + // Parse a constant expression. +@@ -3835,13 +4018,11 @@ + //------------------------------expand_parse----------------------------------- + ExpandRule* ADLParser::expand_parse(InstructForm *instr) { + char *ident, *ident2; +- OperandForm *oper; +- InstructForm *ins; + NameAndList *instr_and_operands = NULL; + ExpandRule *exp = new ExpandRule(); + +- // Expand is a block containing an ordered list of instructions, each of +- // which has an ordered list of operands. ++ // Expand is a block containing an ordered list of operands with initializers, ++ // or instructions, each of which has an ordered list of operands. + // Check for block delimiter + skipws(); // Skip leading whitespace + if ((_curchar != '%') +@@ -3855,12 +4036,30 @@ + if (ident == NULL) { + parse_err(SYNERR, "identifier expected at %c\n", _curchar); + continue; +- } // Check that you have a valid instruction ++ } ++ ++ // Check whether we should parse an instruction or operand. + const Form *form = _globalNames[ident]; +- ins = form ? form->is_instruction() : NULL; +- if (ins == NULL) { ++ bool parse_oper = false; ++ bool parse_ins = false; ++ if (form == NULL) { ++ skipws(); ++ // Check whether this looks like an instruction specification. If so, ++ // just parse the instruction. The declaration of the instruction is ++ // not needed here. ++ if (_curchar == '(') parse_ins = true; ++ } else if (form->is_instruction()) { ++ parse_ins = true; ++ } else if (form->is_operand()) { ++ parse_oper = true; ++ } else { ++ parse_err(SYNERR, "instruction/operand name expected at %s\n", ident); ++ continue; ++ } ++ ++ if (parse_oper) { + // This is a new operand +- oper = form ? form->is_operand() : NULL; ++ OperandForm *oper = form->is_operand(); + if (oper == NULL) { + parse_err(SYNERR, "instruction/operand name expected at %s\n", ident); + continue; +@@ -3895,6 +4094,7 @@ + skipws(); + } + else { ++ assert(parse_ins, "sanity"); + // Add instruction to list + instr_and_operands = new NameAndList(ident); + // Grab operands, build nameList of them, and then put into dictionary +@@ -3918,7 +4118,7 @@ + parse_err(SYNERR, "operand name expected at %s\n", ident2); + continue; + } +- oper = form2->is_operand(); ++ OperandForm *oper = form2->is_operand(); + if (oper == NULL && !form2->is_opclass()) { + parse_err(SYNERR, "operand name expected at %s\n", ident2); + continue; +--- ./hotspot/src/share/vm/adlc/adlparse.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/adlc/adlparse.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 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 +@@ -159,6 +159,8 @@ + void ins_encode_parse(InstructForm &inst); + void ins_encode_parse_block(InstructForm &inst); + void ins_encode_parse_block_impl(InstructForm& inst, EncClass* encoding, char* ec_name); ++ // Parse instruction postalloc expand rule. ++ void postalloc_expand_parse(InstructForm &inst); + + void constant_parse(InstructForm& inst); + void constant_parse_expression(EncClass* encoding, char* ec_name); +--- ./hotspot/src/share/vm/adlc/archDesc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/adlc/archDesc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -172,7 +172,8 @@ + _internalOps(cmpstr,hashstr, Form::arena), + _internalMatch(cmpstr,hashstr, Form::arena), + _chainRules(cmpstr,hashstr, Form::arena), +- _cisc_spill_operand(NULL) { ++ _cisc_spill_operand(NULL), ++ _needs_clone_jvms(false) { + + // Initialize the opcode to MatchList table with NULLs + for( int i=0; i<_last_opcode; ++i ) { +@@ -1192,15 +1193,12 @@ + || strcmp(idealName,"CmpF") == 0 + || strcmp(idealName,"FastLock") == 0 + || strcmp(idealName,"FastUnlock") == 0 +- || strcmp(idealName,"AddExactI") == 0 +- || strcmp(idealName,"AddExactL") == 0 +- || strcmp(idealName,"SubExactI") == 0 +- || strcmp(idealName,"SubExactL") == 0 +- || strcmp(idealName,"MulExactI") == 0 +- || strcmp(idealName,"MulExactL") == 0 +- || strcmp(idealName,"NegExactI") == 0 +- || strcmp(idealName,"NegExactL") == 0 +- || strcmp(idealName,"FlagsProj") == 0 ++ || strcmp(idealName,"OverflowAddI") == 0 ++ || strcmp(idealName,"OverflowAddL") == 0 ++ || strcmp(idealName,"OverflowSubI") == 0 ++ || strcmp(idealName,"OverflowSubL") == 0 ++ || strcmp(idealName,"OverflowMulI") == 0 ++ || strcmp(idealName,"OverflowMulL") == 0 + || strcmp(idealName,"Bool") == 0 + || strcmp(idealName,"Binary") == 0 ) { + // Removed ConI from the must_clone list. CPUs that cannot use +--- ./hotspot/src/share/vm/adlc/archDesc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/adlc/archDesc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -121,6 +121,12 @@ + // to access [stack_pointer + offset] + OperandForm *_cisc_spill_operand; + ++ // If a Call node uses $constanttablebase, it gets MachConstantBaseNode ++ // by the matcher and the matcher will modify the jvms. If so, jvm states ++ // always have to be cloned when a node is cloned. Adlc generates ++ // Compile::needs_clone_jvms() accordingly. ++ bool _needs_clone_jvms; ++ + // Methods for outputting the DFA + void gen_match(FILE *fp, MatchList &mlist, ProductionState &status, Dict &operands_chained_from); + void chain_rule(FILE *fp, const char *indent, const char *ideal, +@@ -289,6 +295,7 @@ + void addPreHeaderBlocks(FILE *fp_hpp); + void addHeaderBlocks(FILE *fp_hpp); + void addSourceBlocks(FILE *fp_cpp); ++ void generate_needs_clone_jvms(FILE *fp_cpp); + void generate_adlc_verification(FILE *fp_cpp); + + // output declaration of class State +@@ -311,6 +318,8 @@ + void defineEvalConstant(FILE *fp, InstructForm &node); + // Generator for Emit methods for instructions + void defineEmit (FILE *fp, InstructForm &node); ++ // Generator for postalloc_expand methods for instructions. ++ void define_postalloc_expand(FILE *fp, InstructForm &node); + + // Define a MachOper encode method + void define_oper_interface(FILE *fp, OperandForm &oper, FormDict &globals, +--- ./hotspot/src/share/vm/adlc/formssel.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/adlc/formssel.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -32,31 +32,33 @@ + _localNames(cmpstr, hashstr, Form::arena), + _effects(cmpstr, hashstr, Form::arena), + _is_mach_constant(false), ++ _needs_constant_base(false), + _has_call(false) + { + _ftype = Form::INS; + +- _matrule = NULL; +- _insencode = NULL; +- _constant = NULL; +- _opcode = NULL; +- _size = NULL; +- _attribs = NULL; +- _predicate = NULL; +- _exprule = NULL; +- _rewrule = NULL; +- _format = NULL; +- _peephole = NULL; +- _ins_pipe = NULL; +- _uniq_idx = NULL; +- _num_uniq = 0; +- _cisc_spill_operand = Not_cisc_spillable;// Which operand may cisc-spill ++ _matrule = NULL; ++ _insencode = NULL; ++ _constant = NULL; ++ _is_postalloc_expand = false; ++ _opcode = NULL; ++ _size = NULL; ++ _attribs = NULL; ++ _predicate = NULL; ++ _exprule = NULL; ++ _rewrule = NULL; ++ _format = NULL; ++ _peephole = NULL; ++ _ins_pipe = NULL; ++ _uniq_idx = NULL; ++ _num_uniq = 0; ++ _cisc_spill_operand = Not_cisc_spillable;// Which operand may cisc-spill + _cisc_spill_alternate = NULL; // possible cisc replacement +- _cisc_reg_mask_name = NULL; +- _is_cisc_alternate = false; +- _is_short_branch = false; +- _short_branch_form = NULL; +- _alignment = 1; ++ _cisc_reg_mask_name = NULL; ++ _is_cisc_alternate = false; ++ _is_short_branch = false; ++ _short_branch_form = NULL; ++ _alignment = 1; + } + + InstructForm::InstructForm(const char *id, InstructForm *instr, MatchRule *rule) +@@ -64,31 +66,33 @@ + _localNames(instr->_localNames), + _effects(instr->_effects), + _is_mach_constant(false), ++ _needs_constant_base(false), + _has_call(false) + { + _ftype = Form::INS; + +- _matrule = rule; +- _insencode = instr->_insencode; +- _constant = instr->_constant; +- _opcode = instr->_opcode; +- _size = instr->_size; +- _attribs = instr->_attribs; +- _predicate = instr->_predicate; +- _exprule = instr->_exprule; +- _rewrule = instr->_rewrule; +- _format = instr->_format; +- _peephole = instr->_peephole; +- _ins_pipe = instr->_ins_pipe; +- _uniq_idx = instr->_uniq_idx; +- _num_uniq = instr->_num_uniq; +- _cisc_spill_operand = Not_cisc_spillable;// Which operand may cisc-spill +- _cisc_spill_alternate = NULL; // possible cisc replacement +- _cisc_reg_mask_name = NULL; +- _is_cisc_alternate = false; +- _is_short_branch = false; +- _short_branch_form = NULL; +- _alignment = 1; ++ _matrule = rule; ++ _insencode = instr->_insencode; ++ _constant = instr->_constant; ++ _is_postalloc_expand = instr->_is_postalloc_expand; ++ _opcode = instr->_opcode; ++ _size = instr->_size; ++ _attribs = instr->_attribs; ++ _predicate = instr->_predicate; ++ _exprule = instr->_exprule; ++ _rewrule = instr->_rewrule; ++ _format = instr->_format; ++ _peephole = instr->_peephole; ++ _ins_pipe = instr->_ins_pipe; ++ _uniq_idx = instr->_uniq_idx; ++ _num_uniq = instr->_num_uniq; ++ _cisc_spill_operand = Not_cisc_spillable; // Which operand may cisc-spill ++ _cisc_spill_alternate = NULL; // possible cisc replacement ++ _cisc_reg_mask_name = NULL; ++ _is_cisc_alternate = false; ++ _is_short_branch = false; ++ _short_branch_form = NULL; ++ _alignment = 1; + // Copy parameters + const char *name; + instr->_parameters.reset(); +@@ -157,6 +161,11 @@ + return ( _exprule != NULL ); + } + ++// This instruction has a late expand rule? ++bool InstructForm::postalloc_expands() const { ++ return _is_postalloc_expand; ++} ++ + // This instruction has a peephole rule? + Peephole *InstructForm::peepholes() const { + return _peephole; +@@ -639,6 +648,8 @@ + if( strcmp(_matrule->_opType,"MemBarReleaseLock") == 0 ) return true; + if( strcmp(_matrule->_opType,"MemBarAcquireLock") == 0 ) return true; + if( strcmp(_matrule->_opType,"MemBarStoreStore") == 0 ) return true; ++ if( strcmp(_matrule->_opType,"StoreFence") == 0 ) return true; ++ if( strcmp(_matrule->_opType,"LoadFence") == 0 ) return true; + + return false; + } +@@ -649,6 +660,7 @@ + int USE_of_memory = 0; + int DEF_of_memory = 0; + const char* last_memory_DEF = NULL; // to test DEF/USE pairing in asserts ++ const char* last_memory_USE = NULL; + Component *unique = NULL; + Component *comp = NULL; + ComponentList &components = (ComponentList &)_components; +@@ -670,7 +682,16 @@ + assert(0 == strcmp(last_memory_DEF, comp->_name), "every memory DEF is followed by a USE of the same name"); + last_memory_DEF = NULL; + } +- USE_of_memory++; ++ // Handles same memory being used multiple times in the case of BMI1 instructions. ++ if (last_memory_USE != NULL) { ++ if (strcmp(comp->_name, last_memory_USE) != 0) { ++ USE_of_memory++; ++ } ++ } else { ++ USE_of_memory++; ++ } ++ last_memory_USE = comp->_name; ++ + if (DEF_of_memory == 0) // defs take precedence + unique = comp; + } else { +@@ -1269,11 +1290,11 @@ + return; + } + if (strcmp(rep_var, "constantoffset") == 0) { +- fprintf(fp, "st->print(\"#%%d\", constant_offset());\n"); ++ fprintf(fp, "st->print(\"#%%d\", constant_offset_unchecked());\n"); + return; + } + if (strcmp(rep_var, "constantaddress") == 0) { +- fprintf(fp, "st->print(\"constant table base + #%%d\", constant_offset());\n"); ++ fprintf(fp, "st->print(\"constant table base + #%%d\", constant_offset_unchecked());\n"); + return; + } + +@@ -1301,7 +1322,7 @@ + OperandForm* oper = form->is_operand(); + if (oper != NULL && oper->is_bound_register()) { + const RegDef* first = oper->get_RegClass()->find_first_elem(); +- fprintf(fp, " st->print(\"%s\");\n", first->_regname); ++ fprintf(fp, " st->print_raw(\"%s\");\n", first->_regname); + } else { + globalAD->syntax_err(_linenum, "In %s can't find format for %s %s", _ident, opc->_ident, rep_var); + } +@@ -2509,7 +2530,7 @@ + case Form::idealP: fprintf(fp," if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break; + case Form::idealNKlass: + case Form::idealN: fprintf(fp," if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break; +- case Form::idealL: fprintf(fp," st->print(\"#%%lld\", _c%d);\n", const_index); break; ++ case Form::idealL: fprintf(fp," st->print(\"#\" INT64_FORMAT, (int64_t)_c%d);\n", const_index); break; + case Form::idealF: fprintf(fp," st->print(\"#%%f\", _c%d);\n", const_index); break; + case Form::idealD: fprintf(fp," st->print(\"#%%f\", _c%d);\n", const_index); break; + default: +@@ -4045,13 +4066,15 @@ + bool MatchRule::is_ideal_membar() const { + if( !_opType ) return false; + return +- !strcmp(_opType,"MemBarAcquire" ) || +- !strcmp(_opType,"MemBarRelease" ) || ++ !strcmp(_opType,"MemBarAcquire") || ++ !strcmp(_opType,"MemBarRelease") || + !strcmp(_opType,"MemBarAcquireLock") || + !strcmp(_opType,"MemBarReleaseLock") || +- !strcmp(_opType,"MemBarVolatile" ) || +- !strcmp(_opType,"MemBarCPUOrder" ) || +- !strcmp(_opType,"MemBarStoreStore" ); ++ !strcmp(_opType,"LoadFence" ) || ++ !strcmp(_opType,"StoreFence") || ++ !strcmp(_opType,"MemBarVolatile") || ++ !strcmp(_opType,"MemBarCPUOrder") || ++ !strcmp(_opType,"MemBarStoreStore"); + } + + bool MatchRule::is_ideal_loadPC() const { +--- ./hotspot/src/share/vm/adlc/formssel.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/adlc/formssel.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -83,35 +83,37 @@ + const char *_cisc_reg_mask_name; + InstructForm *_short_branch_form; + bool _is_short_branch; +- bool _is_mach_constant; // true if Node is a MachConstantNode ++ bool _is_mach_constant; // True if Node is a MachConstantNode. ++ bool _needs_constant_base; // True if Node needs the mach_constant_base input. + uint _alignment; + + public: + // Public Data +- const char *_ident; // Name of this instruction +- NameList _parameters; // Locally defined names +- FormDict _localNames; // Table of operands & their types +- MatchRule *_matrule; // Matching rule for this instruction +- Opcode *_opcode; // Encoding of the opcode for instruction +- char *_size; // Size of instruction +- InsEncode *_insencode; // Encoding class instruction belongs to +- InsEncode *_constant; // Encoding class constant value belongs to +- Attribute *_attribs; // List of Attribute rules +- Predicate *_predicate; // Predicate test for this instruction +- FormDict _effects; // Dictionary of effect rules +- ExpandRule *_exprule; // Expand rule for this instruction +- RewriteRule *_rewrule; // Rewrite rule for this instruction +- FormatRule *_format; // Format for assembly generation +- Peephole *_peephole; // List of peephole rules for instruction +- const char *_ins_pipe; // Instruction Scheduling description class ++ const char *_ident; // Name of this instruction ++ NameList _parameters; // Locally defined names ++ FormDict _localNames; // Table of operands & their types ++ MatchRule *_matrule; // Matching rule for this instruction ++ Opcode *_opcode; // Encoding of the opcode for instruction ++ char *_size; // Size of instruction ++ InsEncode *_insencode; // Encoding class instruction belongs to ++ InsEncode *_constant; // Encoding class constant value belongs to ++ bool _is_postalloc_expand; // Indicates that encoding just does a lateExpand. ++ Attribute *_attribs; // List of Attribute rules ++ Predicate *_predicate; // Predicate test for this instruction ++ FormDict _effects; // Dictionary of effect rules ++ ExpandRule *_exprule; // Expand rule for this instruction ++ RewriteRule *_rewrule; // Rewrite rule for this instruction ++ FormatRule *_format; // Format for assembly generation ++ Peephole *_peephole; // List of peephole rules for instruction ++ const char *_ins_pipe; // Instruction Scheduling description class + +- uint *_uniq_idx; // Indexes of unique operands +- uint _uniq_idx_length; // Length of _uniq_idx array +- uint _num_uniq; // Number of unique operands +- ComponentList _components; // List of Components matches MachNode's +- // operand structure ++ uint *_uniq_idx; // Indexes of unique operands ++ uint _uniq_idx_length; // Length of _uniq_idx array ++ uint _num_uniq; // Number of unique operands ++ ComponentList _components; // List of Components matches MachNode's ++ // operand structure + +- bool _has_call; // contain a call and caller save registers should be saved? ++ bool _has_call; // contain a call and caller save registers should be saved? + + // Public Methods + InstructForm(const char *id, bool ideal_only = false); +@@ -133,6 +135,8 @@ + virtual uint num_defs_or_kills(); + // This instruction has an expand rule? + virtual bool expands() const ; ++ // This instruction has a late expand rule? ++ virtual bool postalloc_expands() const; + // Return this instruction's first peephole rule, or NULL + virtual Peephole *peepholes() const; + // Add a peephole rule to this instruction +@@ -259,6 +263,8 @@ + + bool is_mach_constant() const { return _is_mach_constant; } + void set_is_mach_constant(bool x) { _is_mach_constant = x; } ++ bool needs_constant_base() const { return _needs_constant_base; } ++ void set_needs_constant_base(bool x) { _needs_constant_base = x; } + + InstructForm *short_branch_form() { return _short_branch_form; } + bool has_short_branch_form() { return _short_branch_form != NULL; } +--- ./hotspot/src/share/vm/adlc/main.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/adlc/main.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -243,6 +243,11 @@ + AD.addInclude(AD._CPP_file, "nativeInst_arm.hpp"); + AD.addInclude(AD._CPP_file, "vmreg_arm.inline.hpp"); + #endif ++#ifdef TARGET_ARCH_ppc ++ AD.addInclude(AD._CPP_file, "assembler_ppc.inline.hpp"); ++ AD.addInclude(AD._CPP_file, "nativeInst_ppc.hpp"); ++ AD.addInclude(AD._CPP_file, "vmreg_ppc.inline.hpp"); ++#endif + AD.addInclude(AD._HPP_file, "memory/allocation.hpp"); + AD.addInclude(AD._HPP_file, "opto/machnode.hpp"); + AD.addInclude(AD._HPP_file, "opto/node.hpp"); +@@ -267,6 +272,7 @@ + AD.addInclude(AD._CPP_PIPELINE_file, "adfiles", get_basename(AD._HPP_file._name)); + AD.addInclude(AD._DFA_file, "precompiled.hpp"); + AD.addInclude(AD._DFA_file, "adfiles", get_basename(AD._HPP_file._name)); ++ AD.addInclude(AD._DFA_file, "opto/cfgnode.hpp"); // Use PROB_MAX in predicate. + AD.addInclude(AD._DFA_file, "opto/matcher.hpp"); + AD.addInclude(AD._DFA_file, "opto/opcodes.hpp"); + // Make sure each .cpp file starts with include lines: +@@ -300,6 +306,7 @@ + AD.buildInstructMatchCheck(AD._CPP_file._fp); // .cpp + // define methods for machine dependent frame management + AD.buildFrameMethods(AD._CPP_file._fp); // .cpp ++ AD.generate_needs_clone_jvms(AD._CPP_file._fp); + + // do this last: + AD.addPreprocessorChecks(AD._CPP_file._fp); // .cpp +--- ./hotspot/src/share/vm/adlc/output_c.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/adlc/output_c.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1570,6 +1570,13 @@ + new_id = expand_instr->name(); + + InstructForm* expand_instruction = (InstructForm*)globalAD->globalNames()[new_id]; ++ ++ if (!expand_instruction) { ++ globalAD->syntax_err(node->_linenum, "In %s: instruction %s used in expand not declared\n", ++ node->_ident, new_id); ++ continue; ++ } ++ + if (expand_instruction->has_temps()) { + globalAD->syntax_err(node->_linenum, "In %s: expand rules using instructs with TEMPs aren't supported: %s", + node->_ident, new_id); +@@ -1592,6 +1599,8 @@ + + if( node->is_ideal_fastlock() && new_inst->is_ideal_fastlock() ) { + fprintf(fp, " ((MachFastLockNode*)n%d)->_counters = _counters;\n",cnt); ++ fprintf(fp, " ((MachFastLockNode*)n%d)->_rtm_counters = _rtm_counters;\n",cnt); ++ fprintf(fp, " ((MachFastLockNode*)n%d)->_stack_rtm_counters = _stack_rtm_counters;\n",cnt); + } + + // Fill in the bottom_type where requested +@@ -1628,6 +1637,13 @@ + // Use 'parameter' at current position in list of new instruction's formals + // instead of 'opid' when looking up info internal to new_inst + const char *parameter = formal_lst->iter(); ++ if (!parameter) { ++ globalAD->syntax_err(node->_linenum, "Operand %s of expand instruction %s has" ++ " no equivalent in new instruction %s.", ++ opid, node->_ident, new_inst->_ident); ++ assert(0, "Wrong expand"); ++ } ++ + // Check for an operand which is created in the expand rule + if ((exp_pos = node->_exprule->_newopers.index(opid)) != -1) { + new_pos = new_inst->operand_position(parameter,Component::USE); +@@ -1825,18 +1841,26 @@ + + // If the node is a MachConstantNode, insert the MachConstantBaseNode edge. + // NOTE: this edge must be the last input (see MachConstantNode::mach_constant_base_node_input). +- if (node->is_mach_constant()) { +- fprintf(fp," add_req(C->mach_constant_base_node());\n"); ++ // There are nodes that don't use $constantablebase, but still require that it ++ // is an input to the node. Example: divF_reg_immN, Repl32B_imm on x86_64. ++ if (node->is_mach_constant() || node->needs_constant_base()) { ++ if (node->is_ideal_call() != Form::invalid_type && ++ node->is_ideal_call() != Form::JAVA_LEAF) { ++ fprintf(fp, " // MachConstantBaseNode added in matcher.\n"); ++ _needs_clone_jvms = true; ++ } else { ++ fprintf(fp, " add_req(C->mach_constant_base_node());\n"); ++ } + } + +- fprintf(fp,"\n"); +- if( node->expands() ) { +- fprintf(fp," return result;\n"); ++ fprintf(fp, "\n"); ++ if (node->expands()) { ++ fprintf(fp, " return result;\n"); + } else { +- fprintf(fp," return this;\n"); ++ fprintf(fp, " return this;\n"); + } +- fprintf(fp,"}\n"); +- fprintf(fp,"\n"); ++ fprintf(fp, "}\n"); ++ fprintf(fp, "\n"); + } + + +@@ -1938,9 +1962,9 @@ + else if ((strcmp(rep_var, "constanttablebase") == 0) || + (strcmp(rep_var, "constantoffset") == 0) || + (strcmp(rep_var, "constantaddress") == 0)) { +- if (!_inst.is_mach_constant()) { ++ if (!(_inst.is_mach_constant() || _inst.needs_constant_base())) { + _AD.syntax_err(_encoding._linenum, +- "Replacement variable %s not allowed in instruct %s (only in MachConstantNode).\n", ++ "Replacement variable %s not allowed in instruct %s (only in MachConstantNode or MachCall).\n", + rep_var, _encoding._name); + } + } +@@ -2103,16 +2127,21 @@ + if (strcmp(rep_var,"$reg") == 0 || reg_conversion(rep_var) != NULL) { + _reg_status = LITERAL_ACCESSED; + } else { ++ _AD.syntax_err(_encoding._linenum, ++ "Invalid access to literal register parameter '%s' in %s.\n", ++ rep_var, _encoding._name); + assert( false, "invalid access to literal register parameter"); + } + } + // literal constant parameters must be accessed as a 'constant' field +- if ( _constant_status != LITERAL_NOT_SEEN ) { +- assert( _constant_status == LITERAL_SEEN, "Must have seen constant literal before now"); +- if( strcmp(rep_var,"$constant") == 0 ) { +- _constant_status = LITERAL_ACCESSED; ++ if (_constant_status != LITERAL_NOT_SEEN) { ++ assert(_constant_status == LITERAL_SEEN, "Must have seen constant literal before now"); ++ if (strcmp(rep_var,"$constant") == 0) { ++ _constant_status = LITERAL_ACCESSED; + } else { +- assert( false, "invalid access to literal constant parameter"); ++ _AD.syntax_err(_encoding._linenum, ++ "Invalid access to literal constant parameter '%s' in %s.\n", ++ rep_var, _encoding._name); + } + } + } // end replacement and/or subfield +@@ -2294,6 +2323,7 @@ + #if defined(IA32) || defined(AMD64) + if (strcmp(rep_var,"$XMMRegister") == 0) return "as_XMMRegister"; + #endif ++ if (strcmp(rep_var,"$CondRegister") == 0) return "as_ConditionRegister"; + return NULL; + } + +@@ -2488,7 +2518,113 @@ + fprintf(fp, " return (VerifyOops ? MachNode::size(ra_) : %s);\n", inst._size); + + // (3) and (4) +- fprintf(fp,"}\n"); ++ fprintf(fp,"}\n\n"); ++} ++ ++// Emit postalloc expand function. ++void ArchDesc::define_postalloc_expand(FILE *fp, InstructForm &inst) { ++ InsEncode *ins_encode = inst._insencode; ++ ++ // Output instruction's postalloc_expand prototype. ++ fprintf(fp, "void %sNode::postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_) {\n", ++ inst._ident); ++ ++ assert((_encode != NULL) && (ins_encode != NULL), "You must define an encode section."); ++ ++ // Output each operand's offset into the array of registers. ++ inst.index_temps(fp, _globalNames); ++ ++ // Output variables "unsigned idx_", Node *n_ and "MachOpnd *op_" ++ // for each parameter specified in the encoding. ++ ins_encode->reset(); ++ const char *ec_name = ins_encode->encode_class_iter(); ++ assert(ec_name != NULL, "Postalloc expand must specify an encoding."); ++ ++ EncClass *encoding = _encode->encClass(ec_name); ++ if (encoding == NULL) { ++ fprintf(stderr, "User did not define contents of this encode_class: %s\n", ec_name); ++ abort(); ++ } ++ if (ins_encode->current_encoding_num_args() != encoding->num_args()) { ++ globalAD->syntax_err(ins_encode->_linenum, "In %s: passing %d arguments to %s but expecting %d", ++ inst._ident, ins_encode->current_encoding_num_args(), ++ ec_name, encoding->num_args()); ++ } ++ ++ fprintf(fp, " // Access to ins and operands for postalloc expand.\n"); ++ const int buflen = 2000; ++ char idxbuf[buflen]; char *ib = idxbuf; idxbuf[0] = '\0'; ++ char nbuf [buflen]; char *nb = nbuf; nbuf[0] = '\0'; ++ char opbuf [buflen]; char *ob = opbuf; opbuf[0] = '\0'; ++ ++ encoding->_parameter_type.reset(); ++ encoding->_parameter_name.reset(); ++ const char *type = encoding->_parameter_type.iter(); ++ const char *name = encoding->_parameter_name.iter(); ++ int param_no = 0; ++ for (; (type != NULL) && (name != NULL); ++ (type = encoding->_parameter_type.iter()), (name = encoding->_parameter_name.iter())) { ++ const char* arg_name = ins_encode->rep_var_name(inst, param_no); ++ int idx = inst.operand_position_format(arg_name); ++ if (strcmp(arg_name, "constanttablebase") == 0) { ++ ib += sprintf(ib, " unsigned idx_%-5s = mach_constant_base_node_input(); \t// %s, \t%s\n", ++ name, type, arg_name); ++ nb += sprintf(nb, " Node *n_%-7s = lookup(idx_%s);\n", name, name); ++ // There is no operand for the constanttablebase. ++ } else if (inst.is_noninput_operand(idx)) { ++ globalAD->syntax_err(inst._linenum, ++ "In %s: you can not pass the non-input %s to a postalloc expand encoding.\n", ++ inst._ident, arg_name); ++ } else { ++ ib += sprintf(ib, " unsigned idx_%-5s = idx%d; \t// %s, \t%s\n", ++ name, idx, type, arg_name); ++ nb += sprintf(nb, " Node *n_%-7s = lookup(idx_%s);\n", name, name); ++ ob += sprintf(ob, " %sOper *op_%s = (%sOper *)opnd_array(%d);\n", type, name, type, idx); ++ } ++ param_no++; ++ } ++ assert(ib < &idxbuf[buflen-1] && nb < &nbuf[buflen-1] && ob < &opbuf[buflen-1], "buffer overflow"); ++ ++ fprintf(fp, "%s", idxbuf); ++ fprintf(fp, " Node *n_region = lookup(0);\n"); ++ fprintf(fp, "%s%s", nbuf, opbuf); ++ fprintf(fp, " Compile *C = ra_->C;\n"); ++ ++ // Output this instruction's encodings. ++ fprintf(fp, " {"); ++ const char *ec_code = NULL; ++ const char *ec_rep_var = NULL; ++ assert(encoding == _encode->encClass(ec_name), ""); ++ ++ DefineEmitState pending(fp, *this, *encoding, *ins_encode, inst); ++ encoding->_code.reset(); ++ encoding->_rep_vars.reset(); ++ // Process list of user-defined strings, ++ // and occurrences of replacement variables. ++ // Replacement Vars are pushed into a list and then output. ++ while ((ec_code = encoding->_code.iter()) != NULL) { ++ if (! encoding->_code.is_signal(ec_code)) { ++ // Emit pending code. ++ pending.emit(); ++ pending.clear(); ++ // Emit this code section. ++ fprintf(fp, "%s", ec_code); ++ } else { ++ // A replacement variable or one of its subfields. ++ // Obtain replacement variable from list. ++ ec_rep_var = encoding->_rep_vars.iter(); ++ pending.add_rep_var(ec_rep_var); ++ } ++ } ++ // Emit pending code. ++ pending.emit(); ++ pending.clear(); ++ fprintf(fp, " }\n"); ++ ++ fprintf(fp, "}\n\n"); ++ ++ ec_name = ins_encode->encode_class_iter(); ++ assert(ec_name == NULL, "Postalloc expand may only have one encoding."); + } + + // defineEmit ----------------------------------------------------------------- +@@ -2841,7 +2977,7 @@ + } else if ( (strcmp(name,"disp") == 0) ) { + fprintf(fp,"(PhaseRegAlloc *ra_, const Node *node, int idx) const { \n"); + } else { +- fprintf(fp,"() const { \n"); ++ fprintf(fp, "() const {\n"); + } + + // Check for hexadecimal value OR replacement variable +@@ -2891,6 +3027,8 @@ + // Hex value + fprintf(fp," return %s;\n", encoding); + } else { ++ globalAD->syntax_err(oper._linenum, "In operand %s: Do not support this encode constant: '%s' for %s.", ++ oper._ident, encoding, name); + assert( false, "Do not support octal or decimal encode constants"); + } + fprintf(fp," }\n"); +@@ -3055,6 +3193,7 @@ + if( instr->expands() || instr->needs_projections() || + instr->has_temps() || + instr->is_mach_constant() || ++ instr->needs_constant_base() || + instr->_matrule != NULL && + instr->num_opnds() != instr->num_unique_opnds() ) + defineExpand(_CPP_EXPAND_file._fp, instr); +@@ -3142,7 +3281,15 @@ + // Ensure this is a machine-world instruction + if ( instr->ideal_only() ) continue; + +- if (instr->_insencode) defineEmit (fp, *instr); ++ if (instr->_insencode) { ++ if (instr->postalloc_expands()) { ++ // Don't write this to _CPP_EXPAND_file, as the code generated calls C-code ++ // from code sections in ad file that is dumped to fp. ++ define_postalloc_expand(fp, *instr); ++ } else { ++ defineEmit(fp, *instr); ++ } ++ } + if (instr->is_mach_constant()) defineEvalConstant(fp, *instr); + if (instr->_size) defineSize (fp, *instr); + +@@ -3503,6 +3650,11 @@ + return callconv; + } + ++void ArchDesc::generate_needs_clone_jvms(FILE *fp_cpp) { ++ fprintf(fp_cpp, "bool Compile::needs_clone_jvms() { return %s; }\n\n", ++ _needs_clone_jvms ? "true" : "false"); ++} ++ + //---------------------------generate_assertion_checks------------------- + void ArchDesc::generate_adlc_verification(FILE *fp_cpp) { + fprintf(fp_cpp, "\n"); +@@ -3819,8 +3971,10 @@ + } + + // Fill in the bottom_type where requested +- if ( inst->captures_bottom_type(_globalNames) ) { +- fprintf(fp_cpp, "%s node->_bottom_type = _leaf->bottom_type();\n", indent); ++ if (inst->captures_bottom_type(_globalNames)) { ++ if (strncmp("MachCall", inst->mach_base_class(_globalNames), strlen("MachCall"))) { ++ fprintf(fp_cpp, "%s node->_bottom_type = _leaf->bottom_type();\n", indent); ++ } + } + if( inst->is_ideal_if() ) { + fprintf(fp_cpp, "%s node->_prob = _leaf->as_If()->_prob;\n", indent); +@@ -3828,6 +3982,8 @@ + } + if( inst->is_ideal_fastlock() ) { + fprintf(fp_cpp, "%s node->_counters = _leaf->as_FastLock()->counters();\n", indent); ++ fprintf(fp_cpp, "%s node->_rtm_counters = _leaf->as_FastLock()->rtm_counters();\n", indent); ++ fprintf(fp_cpp, "%s node->_stack_rtm_counters = _leaf->as_FastLock()->stack_rtm_counters();\n", indent); + } + + } +--- ./hotspot/src/share/vm/adlc/output_h.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/adlc/output_h.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -26,7 +26,11 @@ + #include "adlc.hpp" + + // The comment delimiter used in format statements after assembler instructions. ++#if defined(PPC64) ++#define commentSeperator "\t//" ++#else + #define commentSeperator "!" ++#endif + + // Generate the #define that describes the number of registers. + static void defineRegCount(FILE *fp, RegisterForm *registers) { +@@ -382,14 +386,14 @@ + static void defineCCodeDump(OperandForm* oper, FILE *fp, int i) { + assert(oper != NULL, "what"); + CondInterface* cond = oper->_interface->is_CondInterface(); +- fprintf(fp, " if( _c%d == BoolTest::eq ) st->print(\"%s\");\n",i,cond->_equal_format); +- fprintf(fp, " else if( _c%d == BoolTest::ne ) st->print(\"%s\");\n",i,cond->_not_equal_format); +- fprintf(fp, " else if( _c%d == BoolTest::le ) st->print(\"%s\");\n",i,cond->_less_equal_format); +- fprintf(fp, " else if( _c%d == BoolTest::ge ) st->print(\"%s\");\n",i,cond->_greater_equal_format); +- fprintf(fp, " else if( _c%d == BoolTest::lt ) st->print(\"%s\");\n",i,cond->_less_format); +- fprintf(fp, " else if( _c%d == BoolTest::gt ) st->print(\"%s\");\n",i,cond->_greater_format); +- fprintf(fp, " else if( _c%d == BoolTest::overflow ) st->print(\"%s\");\n",i,cond->_overflow_format); +- fprintf(fp, " else if( _c%d == BoolTest::no_overflow ) st->print(\"%s\");\n",i,cond->_no_overflow_format); ++ fprintf(fp, " if( _c%d == BoolTest::eq ) st->print_raw(\"%s\");\n",i,cond->_equal_format); ++ fprintf(fp, " else if( _c%d == BoolTest::ne ) st->print_raw(\"%s\");\n",i,cond->_not_equal_format); ++ fprintf(fp, " else if( _c%d == BoolTest::le ) st->print_raw(\"%s\");\n",i,cond->_less_equal_format); ++ fprintf(fp, " else if( _c%d == BoolTest::ge ) st->print_raw(\"%s\");\n",i,cond->_greater_equal_format); ++ fprintf(fp, " else if( _c%d == BoolTest::lt ) st->print_raw(\"%s\");\n",i,cond->_less_format); ++ fprintf(fp, " else if( _c%d == BoolTest::gt ) st->print_raw(\"%s\");\n",i,cond->_greater_format); ++ fprintf(fp, " else if( _c%d == BoolTest::overflow ) st->print_raw(\"%s\");\n",i,cond->_overflow_format); ++ fprintf(fp, " else if( _c%d == BoolTest::no_overflow ) st->print_raw(\"%s\");\n",i,cond->_no_overflow_format); + } + + // Output code that dumps constant values, increment "i" if type is constant +@@ -412,8 +416,8 @@ + ++i; + } + else if (!strcmp(ideal_type, "ConL")) { +- fprintf(fp," st->print(\"#\" INT64_FORMAT, _c%d);\n", i); +- fprintf(fp," st->print(\"/\" PTR64_FORMAT, _c%d);\n", i); ++ fprintf(fp," st->print(\"#\" INT64_FORMAT, (int64_t)_c%d);\n", i); ++ fprintf(fp," st->print(\"/\" PTR64_FORMAT, (uint64_t)_c%d);\n", i); + ++i; + } + else if (!strcmp(ideal_type, "ConF")) { +@@ -425,7 +429,7 @@ + else if (!strcmp(ideal_type, "ConD")) { + fprintf(fp," st->print(\"#%%f\", _c%d);\n", i); + fprintf(fp," jlong _c%dl = JavaValue(_c%d).get_jlong();\n", i, i); +- fprintf(fp," st->print(\"/\" PTR64_FORMAT, _c%dl);\n", i); ++ fprintf(fp," st->print(\"/\" PTR64_FORMAT, (uint64_t)_c%dl);\n", i); + ++i; + } + else if (!strcmp(ideal_type, "Bool")) { +@@ -467,7 +471,7 @@ + if ( string != NameList::_signal ) { + // Normal string + // Pass through to st->print +- fprintf(fp," st->print(\"%s\");\n", string); ++ fprintf(fp," st->print_raw(\"%s\");\n", string); + } else { + // Replacement variable + const char *rep_var = oper._format->_rep_vars.iter(); +@@ -538,7 +542,7 @@ + if ( string != NameList::_signal ) { + // Normal string + // Pass through to st->print +- fprintf(fp," st->print(\"%s\");\n", string); ++ fprintf(fp," st->print_raw(\"%s\");\n", string); + } else { + // Replacement variable + const char *rep_var = oper._format->_rep_vars.iter(); +@@ -665,7 +669,7 @@ + } else if( string == NameList::_signal2 ) // Raw program text + fputs(inst._format->_strings.iter(), fp); + else +- fprintf(fp,"st->print(\"%s\");\n", string); ++ fprintf(fp,"st->print_raw(\"%s\");\n", string); + } // Done with all format strings + } // Done generating the user-defined portion of the format + +@@ -692,13 +696,13 @@ + default: + assert(0,"ShouldNotReachHere"); + } +- fprintf(fp, " st->print_cr(\"\");\n" ); ++ fprintf(fp, " st->cr();\n" ); + fprintf(fp, " if (_jvms) _jvms->format(ra, this, st); else st->print_cr(\" No JVM State Info\");\n" ); + fprintf(fp, " st->print(\" # \");\n" ); + fprintf(fp, " if( _jvms && _oop_map ) _oop_map->print_on(st);\n"); + } + else if(inst.is_ideal_safepoint()) { +- fprintf(fp, " st->print(\"\");\n" ); ++ fprintf(fp, " st->print_raw(\"\");\n" ); + fprintf(fp, " if (_jvms) _jvms->format(ra, this, st); else st->print_cr(\" No JVM State Info\");\n" ); + fprintf(fp, " st->print(\" # \");\n" ); + fprintf(fp, " if( _jvms && _oop_map ) _oop_map->print_on(st);\n"); +@@ -1551,7 +1555,20 @@ + if ( instr->is_ideal_jump() ) { + fprintf(fp, " GrowableArray _index2label;\n"); + } +- fprintf(fp,"public:\n"); ++ ++ fprintf(fp, "public:\n"); ++ ++ Attribute *att = instr->_attribs; ++ // Fields of the node specified in the ad file. ++ while (att != NULL) { ++ if (strncmp(att->_ident, "ins_field_", 10) == 0) { ++ const char *field_name = att->_ident+10; ++ const char *field_type = att->_val; ++ fprintf(fp, " %s _%s;\n", field_type, field_name); ++ } ++ att = (Attribute *)att->_next; ++ } ++ + fprintf(fp," MachOper *opnd_array(uint operand_index) const {\n"); + fprintf(fp," assert(operand_index < _num_opnds, \"invalid _opnd_array index\");\n"); + fprintf(fp," return _opnd_array[operand_index];\n"); +@@ -1596,16 +1613,20 @@ + // Each instruction attribute results in a virtual call of same name. + // The ins_cost is not handled here. + Attribute *attr = instr->_attribs; +- bool avoid_back_to_back = false; ++ Attribute *avoid_back_to_back_attr = NULL; + while (attr != NULL) { +- if (strcmp(attr->_ident,"ins_cost") && +- strcmp(attr->_ident,"ins_short_branch")) { +- fprintf(fp," int %s() const { return %s; }\n", +- attr->_ident, attr->_val); ++ if (strcmp (attr->_ident, "ins_is_TrapBasedCheckNode") == 0) { ++ fprintf(fp, " virtual bool is_TrapBasedCheckNode() const { return %s; }\n", attr->_val); ++ } else if (strcmp (attr->_ident, "ins_cost") != 0 && ++ strncmp(attr->_ident, "ins_field_", 10) != 0 && ++ // Must match function in node.hpp: return type bool, no prefix "ins_". ++ strcmp (attr->_ident, "ins_is_TrapBasedCheckNode") != 0 && ++ strcmp (attr->_ident, "ins_short_branch") != 0) { ++ fprintf(fp, " virtual int %s() const { return %s; }\n", attr->_ident, attr->_val); + } +- // Check value for ins_avoid_back_to_back, and if it is true (1), set the flag +- if (!strcmp(attr->_ident,"ins_avoid_back_to_back") && attr->int_val(*this) != 0) +- avoid_back_to_back = true; ++ if (strcmp(attr->_ident, "ins_avoid_back_to_back") == 0) { ++ avoid_back_to_back_attr = attr; ++ } + attr = (Attribute *)attr->_next; + } + +@@ -1619,7 +1640,12 @@ + // Output the opcode function and the encode function here using the + // encoding class information in the _insencode slot. + if ( instr->_insencode ) { +- fprintf(fp," virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;\n"); ++ if (instr->postalloc_expands()) { ++ fprintf(fp," virtual bool requires_postalloc_expand() const { return true; }\n"); ++ fprintf(fp," virtual void postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_);\n"); ++ } else { ++ fprintf(fp," virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const;\n"); ++ } + } + + // virtual function for getting the size of an instruction +@@ -1636,6 +1662,19 @@ + instr->ideal_Opcode(_globalNames) ); + } + ++ if (instr->needs_constant_base() && ++ !instr->is_mach_constant()) { // These inherit the funcion from MachConstantNode. ++ fprintf(fp," virtual uint mach_constant_base_node_input() const { "); ++ if (instr->is_ideal_call() != Form::invalid_type && ++ instr->is_ideal_call() != Form::JAVA_LEAF) { ++ // MachConstantBase goes behind arguments, but before jvms. ++ fprintf(fp,"assert(tf() && tf()->domain(), \"\"); return tf()->domain()->cnt();"); ++ } else { ++ fprintf(fp,"return req()-1;"); ++ } ++ fprintf(fp," }\n"); ++ } ++ + // Allow machine-independent optimization, invert the sense of the IF test + if( instr->is_ideal_if() ) { + fprintf(fp," virtual void negate() { \n"); +@@ -1759,11 +1798,11 @@ + } + + // flag: if this instruction should not be generated back to back. +- if ( avoid_back_to_back ) { +- if ( node_flags_set ) { +- fprintf(fp," | Flag_avoid_back_to_back"); ++ if (avoid_back_to_back_attr != NULL) { ++ if (node_flags_set) { ++ fprintf(fp," | (%s)", avoid_back_to_back_attr->_val); + } else { +- fprintf(fp,"init_flags(Flag_avoid_back_to_back"); ++ fprintf(fp,"init_flags((%s)", avoid_back_to_back_attr->_val); + node_flags_set = true; + } + } +@@ -1804,6 +1843,7 @@ + if( instr->expands() || instr->needs_projections() || + instr->has_temps() || + instr->is_mach_constant() || ++ instr->needs_constant_base() || + instr->_matrule != NULL && + instr->num_opnds() != instr->num_unique_opnds() ) { + fprintf(fp," virtual MachNode *Expand(State *state, Node_List &proj_list, Node* mem);\n"); +--- ./hotspot/src/share/vm/asm/assembler.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/asm/assembler.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -204,10 +204,11 @@ + CodeSection* _code_section; // section within the code buffer + OopRecorder* _oop_recorder; // support for relocInfo::oop_type + ++ public: + // Code emission & accessing + address addr_at(int pos) const { return code_section()->start() + pos; } + +- ++ protected: + // This routine is called with a label is used for an address. + // Labels and displacements truck in offsets, but target must return a PC. + address target(Label& L) { return code_section()->target(L, pc()); } +--- ./hotspot/src/share/vm/asm/codeBuffer.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/asm/codeBuffer.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -987,7 +987,7 @@ + for (csize_t step; ptr < end(); ptr += step) { + step = end() - ptr; + if (step > jintSize * 4) step = jintSize * 4; +- tty->print(PTR_FORMAT ": ", ptr); ++ tty->print(INTPTR_FORMAT ": ", p2i(ptr)); + while (step > 0) { + tty->print(" " PTR32_FORMAT, *(jint*)ptr); + ptr += jintSize; +@@ -1097,7 +1097,7 @@ + while (c && c->offset() == offset) { + stream->bol(); + stream->print(" ;; "); +- stream->print_cr(c->string()); ++ stream->print_cr("%s", c->string()); + c = c->next_comment(); + } + } +@@ -1153,10 +1153,10 @@ + void CodeSection::print(const char* name) { + csize_t locs_size = locs_end() - locs_start(); + tty->print_cr(" %7s.code = " PTR_FORMAT " : " PTR_FORMAT " : " PTR_FORMAT " (%d of %d)%s", +- name, start(), end(), limit(), size(), capacity(), ++ name, p2i(start()), p2i(end()), p2i(limit()), size(), capacity(), + is_frozen()? " [frozen]": ""); + tty->print_cr(" %7s.locs = " PTR_FORMAT " : " PTR_FORMAT " : " PTR_FORMAT " (%d of %d) point=%d", +- name, locs_start(), locs_end(), locs_limit(), locs_size, locs_capacity(), locs_point_off()); ++ name, p2i(locs_start()), p2i(locs_end()), p2i(locs_limit()), locs_size, locs_capacity(), locs_point_off()); + if (PrintRelocations) { + RelocIterator iter(this); + iter.print(); +--- ./hotspot/src/share/vm/asm/codeBuffer.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/asm/codeBuffer.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -173,7 +173,7 @@ + bool allocates(address pc) const { return pc >= _start && pc < _limit; } + bool allocates2(address pc) const { return pc >= _start && pc <= _limit; } + +- void set_end(address pc) { assert(allocates2(pc), err_msg("not in CodeBuffer memory: " PTR_FORMAT " <= " PTR_FORMAT " <= " PTR_FORMAT, _start, pc, _limit)); _end = pc; } ++ void set_end(address pc) { assert(allocates2(pc), err_msg("not in CodeBuffer memory: " PTR_FORMAT " <= " PTR_FORMAT " <= " INTPTR_FORMAT, p2i(_start), p2i(pc), p2i(_limit))); _end = pc; } + void set_mark(address pc) { assert(contains2(pc), "not in codeBuffer"); + _mark = pc; } + void set_mark_off(int offset) { assert(contains2(offset+_start),"not in codeBuffer"); +--- ./hotspot/src/share/vm/asm/register.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/asm/register.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -118,8 +118,8 @@ + ) { + assert( + a != b, +- err_msg_res("registers must be different: a=%d, b=%d", +- a, b) ++ err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT "", ++ p2i(a), p2i(b)) + ); + } + +@@ -132,8 +132,9 @@ + assert( + a != b && a != c + && b != c, +- err_msg_res("registers must be different: a=%d, b=%d, c=%d", +- a, b, c) ++ err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT ++ ", c=" INTPTR_FORMAT "", ++ p2i(a), p2i(b), p2i(c)) + ); + } + +@@ -148,8 +149,9 @@ + a != b && a != c && a != d + && b != c && b != d + && c != d, +- err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d", +- a, b, c, d) ++ err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT ++ ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT "", ++ p2i(a), p2i(b), p2i(c), p2i(d)) + ); + } + +@@ -166,8 +168,9 @@ + && b != c && b != d && b != e + && c != d && c != e + && d != e, +- err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d", +- a, b, c, d, e) ++ err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT ++ ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT "", ++ p2i(a), p2i(b), p2i(c), p2i(d), p2i(e)) + ); + } + +@@ -186,8 +189,10 @@ + && c != d && c != e && c != f + && d != e && d != f + && e != f, +- err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d, f=%d", +- a, b, c, d, e, f) ++ err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT ++ ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT ++ ", f=" INTPTR_FORMAT "", ++ p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f)) + ); + } + +@@ -208,8 +213,10 @@ + && d != e && d != f && d != g + && e != f && e != g + && f != g, +- err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d", +- a, b, c, d, e, f, g) ++ err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT ++ ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT ++ ", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT "", ++ p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g)) + ); + } + +@@ -232,8 +239,10 @@ + && e != f && e != g && e != h + && f != g && f != h + && g != h, +- err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d, h=%d", +- a, b, c, d, e, f, g, h) ++ err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT ++ ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT ++ ", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT "", ++ p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h)) + ); + } + +@@ -258,8 +267,11 @@ + && f != g && f != h && f != i + && g != h && g != i + && h != i, +- err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d, h=%d, i=%d", +- a, b, c, d, e, f, g, h, i) ++ err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT ++ ", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT ++ ", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT ++ ", i=" INTPTR_FORMAT "", ++ p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i)) + ); + } + +--- ./hotspot/src/share/vm/c1/c1_CFGPrinter.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_CFGPrinter.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2012, 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 +@@ -50,7 +50,7 @@ + + void inc_indent(); + void dec_indent(); +- void print(const char* format, ...); ++ void print(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + void print_begin(const char* tag); + void print_end(const char* tag); + +@@ -161,7 +161,7 @@ + + print("name \"%s\"", method_name(_compilation->method(), true)); + print("method \"%s\"", method_name(_compilation->method())); +- print("date "INT64_FORMAT, os::javaTimeMillis()); ++ print("date "INT64_FORMAT, (int64_t) os::javaTimeMillis()); + + print_end("compilation"); + } +--- ./hotspot/src/share/vm/c1/c1_Compilation.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_Compilation.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -546,6 +546,7 @@ + , _code(buffer_blob) + , _has_access_indexed(false) + , _current_instruction(NULL) ++, _interpreter_frame_size(0) + #ifndef PRODUCT + , _last_instruction_printed(NULL) + #endif // PRODUCT +--- ./hotspot/src/share/vm/c1/c1_Compilation.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_Compilation.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -88,6 +88,7 @@ + CodeOffsets _offsets; + CodeBuffer _code; + bool _has_access_indexed; ++ int _interpreter_frame_size; // Stack space needed in case of a deoptimization + + // compilation helpers + void initialize(); +@@ -259,6 +260,21 @@ + } + + ciKlass* cha_exact_type(ciType* type); ++ ++ // Dump inlining replay data to the stream. ++ void dump_inline_data(outputStream* out) { /* do nothing now */ } ++ ++ // How much stack space would the interpreter need in case of a ++ // deoptimization (worst case) ++ void update_interpreter_frame_size(int size) { ++ if (_interpreter_frame_size < size) { ++ _interpreter_frame_size = size; ++ } ++ } ++ ++ int interpreter_frame_size() const { ++ return _interpreter_frame_size; ++ } + }; + + +--- ./hotspot/src/share/vm/c1/c1_FrameMap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_FrameMap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -133,7 +133,7 @@ + } + } + +- intptr_t out_preserve = SharedRuntime::c_calling_convention(sig_bt, regs, sizeargs); ++ intptr_t out_preserve = SharedRuntime::c_calling_convention(sig_bt, regs, NULL, sizeargs); + LIR_OprList* args = new LIR_OprList(signature->length()); + for (i = 0; i < sizeargs;) { + BasicType t = sig_bt[i]; +--- ./hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1569,6 +1569,7 @@ + default: + constant = new Constant(as_ValueType(field_val)); + } ++ // Stable static fields are checked for non-default values in ciField::initialize_from(). + } + if (constant != NULL) { + push(type, append(constant)); +@@ -1610,6 +1611,10 @@ + default: + constant = new Constant(as_ValueType(field_val)); + } ++ if (FoldStableValues && field->is_stable() && field_val.is_null_or_zero()) { ++ // Stable field with default value can't be constant. ++ constant = NULL; ++ } + } else { + // For CallSite objects treat the target field as a compile time constant. + if (const_oop->is_call_site()) { +@@ -1697,6 +1702,15 @@ + return NULL; + } + ++void GraphBuilder::check_args_for_profiling(Values* obj_args, int expected) { ++#ifdef ASSERT ++ bool ignored_will_link; ++ ciSignature* declared_signature = NULL; ++ ciMethod* real_target = method()->get_method_at_bci(bci(), ignored_will_link, &declared_signature); ++ assert(expected == obj_args->length() || real_target->is_method_handle_intrinsic(), "missed on arg?"); ++#endif ++} ++ + // Collect arguments that we want to profile in a list + Values* GraphBuilder::collect_args_for_profiling(Values* args, ciMethod* target, bool may_have_receiver) { + int start = 0; +@@ -1705,13 +1719,14 @@ + return NULL; + } + int s = obj_args->size(); +- for (int i = start, j = 0; j < s; i++) { ++ // if called through method handle invoke, some arguments may have been popped ++ for (int i = start, j = 0; j < s && i < args->length(); i++) { + if (args->at(i)->type()->is_object_kind()) { + obj_args->push(args->at(i)); + j++; + } + } +- assert(s == obj_args->length(), "missed on arg?"); ++ check_args_for_profiling(obj_args, s); + return obj_args; + } + +@@ -1983,7 +1998,13 @@ + if (!UseInlineCaches && is_loaded && code == Bytecodes::_invokevirtual + && !target->can_be_statically_bound()) { + // Find a vtable index if one is available +- vtable_index = target->resolve_vtable_index(calling_klass, callee_holder); ++ // For arrays, callee_holder is Object. Resolving the call with ++ // Object would allow an illegal call to finalize() on an ++ // array. We use holder instead: illegal calls to finalize() won't ++ // be compiled as vtable calls (IC call resolution will catch the ++ // illegal call) and the few legal calls on array types won't be ++ // either. ++ vtable_index = target->resolve_vtable_index(calling_klass, holder); + } + #endif + +@@ -3767,11 +3788,14 @@ + } + + // now perform tests that are based on flag settings +- if (callee->force_inline()) { +- if (inline_level() > MaxForceInlineLevel) INLINE_BAILOUT("MaxForceInlineLevel"); +- print_inlining(callee, "force inline by annotation"); +- } else if (callee->should_inline()) { +- print_inlining(callee, "force inline by CompileOracle"); ++ if (callee->force_inline() || callee->should_inline()) { ++ if (inline_level() > MaxForceInlineLevel ) INLINE_BAILOUT("MaxForceInlineLevel"); ++ if (recursive_inline_level(callee) > MaxRecursiveInlineLevel) INLINE_BAILOUT("recursive inlining too deep"); ++ ++ const char* msg = ""; ++ if (callee->force_inline()) msg = "force inline by annotation"; ++ if (callee->should_inline()) msg = "force inline by CompileOracle"; ++ print_inlining(callee, msg); + } else { + // use heuristic controls on inlining + if (inline_level() > MaxInlineLevel ) INLINE_BAILOUT("inlining too deep"); +@@ -3840,14 +3864,7 @@ + j++; + } + } +-#ifdef ASSERT +- { +- bool ignored_will_link; +- ciSignature* declared_signature = NULL; +- ciMethod* real_target = method()->get_method_at_bci(bci(), ignored_will_link, &declared_signature); +- assert(s == obj_args->length() || real_target->is_method_handle_intrinsic(), "missed on arg?"); +- } +-#endif ++ check_args_for_profiling(obj_args, s); + } + profile_call(callee, recv, holder_known ? callee->holder() : NULL, obj_args, true); + } +@@ -4338,11 +4355,15 @@ + #endif // PRODUCT + + void GraphBuilder::profile_call(ciMethod* callee, Value recv, ciKlass* known_holder, Values* obj_args, bool inlined) { +- // A default method's holder is an interface +- if (known_holder != NULL && known_holder->is_interface()) { +- assert(known_holder->is_instance_klass() && ((ciInstanceKlass*)known_holder)->has_default_methods(), "should be default method"); +- known_holder = NULL; ++ assert(known_holder == NULL || (known_holder->is_instance_klass() && ++ (!known_holder->is_interface() || ++ ((ciInstanceKlass*)known_holder)->has_default_methods())), "should be default method"); ++ if (known_holder != NULL) { ++ if (known_holder->exact_klass() == NULL) { ++ known_holder = compilation()->cha_exact_type(known_holder); ++ } + } ++ + append(new ProfileCall(method(), bci(), callee, recv, known_holder, obj_args, inlined)); + } + +--- ./hotspot/src/share/vm/c1/c1_GraphBuilder.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_GraphBuilder.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -392,6 +392,7 @@ + + Values* args_list_for_profiling(ciMethod* target, int& start, bool may_have_receiver); + Values* collect_args_for_profiling(Values* args, ciMethod* target, bool may_have_receiver); ++ void check_args_for_profiling(Values* obj_args, int expected); + + public: + NOT_PRODUCT(void print_stats();) +--- ./hotspot/src/share/vm/c1/c1_IR.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_IR.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -226,8 +226,38 @@ + _oop_map->set_oop(name); + } + ++// Mirror the stack size calculation in the deopt code ++// How much stack space would we need at this point in the program in ++// case of deoptimization? ++int CodeEmitInfo::interpreter_frame_size() const { ++ ValueStack* state = _stack; ++ int size = 0; ++ int callee_parameters = 0; ++ int callee_locals = 0; ++ int extra_args = state->scope()->method()->max_stack() - state->stack_size(); + ++ while (state != NULL) { ++ int locks = state->locks_size(); ++ int temps = state->stack_size(); ++ bool is_top_frame = (state == _stack); ++ ciMethod* method = state->scope()->method(); + ++ int frame_size = BytesPerWord * Interpreter::size_activation(method->max_stack(), ++ temps + callee_parameters, ++ extra_args, ++ locks, ++ callee_parameters, ++ callee_locals, ++ is_top_frame); ++ size += frame_size; ++ ++ callee_parameters = method->size_of_parameters(); ++ callee_locals = method->max_locals(); ++ extra_args = 0; ++ state = state->caller_state(); ++ } ++ return size + Deoptimization::last_frame_adjust(0, callee_locals) * BytesPerWord; ++} + + // Implementation of IR + +--- ./hotspot/src/share/vm/c1/c1_IR.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_IR.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -280,6 +280,8 @@ + + bool is_method_handle_invoke() const { return _is_method_handle_invoke; } + void set_is_method_handle_invoke(bool x) { _is_method_handle_invoke = x; } ++ ++ int interpreter_frame_size() const; + }; + + +--- ./hotspot/src/share/vm/c1/c1_InstructionPrinter.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_InstructionPrinter.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -134,23 +134,23 @@ + if (value->is_null_object()) { + output()->print("null"); + } else if (!value->is_loaded()) { +- output()->print("", value); ++ output()->print("", p2i(value)); + } else { +- output()->print(""); + } + } else if (type->as_InstanceConstant() != NULL) { + ciInstance* value = type->as_InstanceConstant()->value(); + if (value->is_loaded()) { +- output()->print(""); + } else { +- output()->print("", value); ++ output()->print("", p2i(value)); + } + } else if (type->as_ArrayConstant() != NULL) { +- output()->print("", type->as_ArrayConstant()->value()->constant_encoding()); ++ output()->print("", p2i(type->as_ArrayConstant()->value()->constant_encoding())); + } else if (type->as_ClassConstant() != NULL) { + ciInstanceKlass* klass = type->as_ClassConstant()->value(); + if (!klass->is_loaded()) { +@@ -268,7 +268,7 @@ + + + void InstructionPrinter::print_unsafe_op(UnsafeOp* op, const char* name) { +- output()->print(name); ++ output()->print("%s", name); + output()->print(".("); + } + +@@ -479,7 +479,7 @@ + if (x->declared_type()->is_klass()) + print_klass(x->declared_type()->as_klass()); + else +- output()->print(type2name(x->declared_type()->basic_type())); ++ output()->print("%s", type2name(x->declared_type()->basic_type())); + } + + +--- ./hotspot/src/share/vm/c1/c1_LIR.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_LIR.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1083,7 +1083,7 @@ + + void LIR_OpArrayCopy::emit_code(LIR_Assembler* masm) { + masm->emit_arraycopy(this); +- masm->emit_code_stub(stub()); ++ masm->append_code_stub(stub()); + } + + void LIR_OpUpdateCRC32::emit_code(LIR_Assembler* masm) { +@@ -1100,20 +1100,20 @@ + + void LIR_OpAllocObj::emit_code(LIR_Assembler* masm) { + masm->emit_alloc_obj(this); +- masm->emit_code_stub(stub()); ++ masm->append_code_stub(stub()); + } + + void LIR_OpBranch::emit_code(LIR_Assembler* masm) { + masm->emit_opBranch(this); + if (stub()) { +- masm->emit_code_stub(stub()); ++ masm->append_code_stub(stub()); + } + } + + void LIR_OpConvert::emit_code(LIR_Assembler* masm) { + masm->emit_opConvert(this); + if (stub() != NULL) { +- masm->emit_code_stub(stub()); ++ masm->append_code_stub(stub()); + } + } + +@@ -1123,13 +1123,13 @@ + + void LIR_OpAllocArray::emit_code(LIR_Assembler* masm) { + masm->emit_alloc_array(this); +- masm->emit_code_stub(stub()); ++ masm->append_code_stub(stub()); + } + + void LIR_OpTypeCheck::emit_code(LIR_Assembler* masm) { + masm->emit_opTypeCheck(this); + if (stub()) { +- masm->emit_code_stub(stub()); ++ masm->append_code_stub(stub()); + } + } + +@@ -1144,7 +1144,7 @@ + void LIR_OpLock::emit_code(LIR_Assembler* masm) { + masm->emit_lock(this); + if (stub()) { +- masm->emit_code_stub(stub()); ++ masm->append_code_stub(stub()); + } + } + +@@ -1563,15 +1563,15 @@ + } else if (is_virtual()) { + out->print("R%d", vreg_number()); + } else if (is_single_cpu()) { +- out->print(as_register()->name()); ++ out->print("%s", as_register()->name()); + } else if (is_double_cpu()) { +- out->print(as_register_hi()->name()); +- out->print(as_register_lo()->name()); ++ out->print("%s", as_register_hi()->name()); ++ out->print("%s", as_register_lo()->name()); + #if defined(X86) + } else if (is_single_xmm()) { +- out->print(as_xmm_float_reg()->name()); ++ out->print("%s", as_xmm_float_reg()->name()); + } else if (is_double_xmm()) { +- out->print(as_xmm_double_reg()->name()); ++ out->print("%s", as_xmm_double_reg()->name()); + } else if (is_single_fpu()) { + out->print("fpu%d", fpu_regnr()); + } else if (is_double_fpu()) { +@@ -1583,9 +1583,9 @@ + out->print("d%d", fpu_regnrLo() >> 1); + #else + } else if (is_single_fpu()) { +- out->print(as_float_reg()->name()); ++ out->print("%s", as_float_reg()->name()); + } else if (is_double_fpu()) { +- out->print(as_double_reg()->name()); ++ out->print("%s", as_double_reg()->name()); + #endif + + } else if (is_illegal()) { +@@ -1611,9 +1611,9 @@ + case T_LONG: out->print("lng:" JLONG_FORMAT, as_jlong()); break; + case T_FLOAT: out->print("flt:%f", as_jfloat()); break; + case T_DOUBLE: out->print("dbl:%f", as_jdouble()); break; +- case T_OBJECT: out->print("obj:0x%x", as_jobject()); break; +- case T_METADATA: out->print("metadata:0x%x", as_metadata());break; +- default: out->print("%3d:0x%x",type(), as_jdouble()); break; ++ case T_OBJECT: out->print("obj:" INTPTR_FORMAT, p2i(as_jobject())); break; ++ case T_METADATA: out->print("metadata:" INTPTR_FORMAT, p2i(as_metadata()));break; ++ default: out->print("%3d:0x" UINT64_FORMAT_X, type(), (uint64_t)as_jlong()); break; + } + } + +@@ -1629,7 +1629,7 @@ + case times_8: out->print(" * 8"); break; + } + } +- out->print(" Disp: %d", _disp); ++ out->print(" Disp: " INTX_FORMAT, _disp); + } + + // debug output of block header without InstructionPrinter +@@ -1703,7 +1703,7 @@ + } else { + out->print(" "); + } +- out->print(name()); out->print(" "); ++ out->print("%s ", name()); + print_instr(out); + if (info() != NULL) out->print(" [bci:%d]", info()->stack()->bci()); + #ifdef ASSERT +@@ -1833,7 +1833,7 @@ + // LIR_OpJavaCall + void LIR_OpJavaCall::print_instr(outputStream* out) const { + out->print("call: "); +- out->print("[addr: 0x%x]", address()); ++ out->print("[addr: " INTPTR_FORMAT "]", p2i(address())); + if (receiver()->is_valid()) { + out->print(" [recv: "); receiver()->print(out); out->print("]"); + } +@@ -1844,7 +1844,7 @@ + + // LIR_OpLabel + void LIR_OpLabel::print_instr(outputStream* out) const { +- out->print("[label:0x%x]", _label); ++ out->print("[label:" INTPTR_FORMAT "]", p2i(_label)); + } + + // LIR_OpArrayCopy +@@ -1911,7 +1911,7 @@ + // LIR_Op1 + void LIR_OpRTCall::print_instr(outputStream* out) const { + intx a = (intx)addr(); +- out->print(Runtime1::name_for_address(addr())); ++ out->print("%s", Runtime1::name_for_address(addr())); + out->print(" "); + tmp()->print(out); + } +@@ -1934,10 +1934,10 @@ + } else if (stub() != NULL) { + out->print("["); + stub()->print_name(out); +- out->print(": 0x%x]", stub()); ++ out->print(": " INTPTR_FORMAT "]", p2i(stub())); + if (stub()->info() != NULL) out->print(" [bci:%d]", stub()->info()->stack()->bci()); + } else { +- out->print("[label:0x%x] ", label()); ++ out->print("[label:" INTPTR_FORMAT "] ", p2i(label())); + } + if (ublock() != NULL) { + out->print("unordered: [B%d] ", ublock()->block_id()); +@@ -2004,7 +2004,7 @@ + tmp4()->print(out); out->print(" "); + out->print("[hdr:%d]", header_size()); out->print(" "); + out->print("[obj:%d]", object_size()); out->print(" "); +- out->print("[lbl:0x%x]", stub()->entry()); ++ out->print("[lbl:" INTPTR_FORMAT "]", p2i(stub()->entry())); + } + + void LIR_OpRoundFP::print_instr(outputStream* out) const { +@@ -2037,7 +2037,7 @@ + tmp3()->print(out); out->print(" "); + tmp4()->print(out); out->print(" "); + out->print("[type:0x%x]", type()); out->print(" "); +- out->print("[label:0x%x]", stub()->entry()); ++ out->print("[label:" INTPTR_FORMAT "]", p2i(stub()->entry())); + } + + +@@ -2074,7 +2074,7 @@ + if (_scratch->is_valid()) { + _scratch->print(out); out->print(" "); + } +- out->print("[lbl:0x%x]", stub()->entry()); ++ out->print("[lbl:" INTPTR_FORMAT "]", p2i(stub()->entry())); + } + + #ifdef ASSERT +@@ -2082,7 +2082,7 @@ + print_condition(out, condition()); out->print(" "); + in_opr1()->print(out); out->print(" "); + in_opr2()->print(out); out->print(", \""); +- out->print(msg()); out->print("\""); ++ out->print("%s", msg()); out->print("\""); + } + #endif + +--- ./hotspot/src/share/vm/c1/c1_LIR.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_LIR.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1127,6 +1127,7 @@ + virtual void print_instr(outputStream* out) const = 0; + virtual void print_on(outputStream* st) const PRODUCT_RETURN; + ++ virtual bool is_patching() { return false; } + virtual LIR_OpCall* as_OpCall() { return NULL; } + virtual LIR_OpJavaCall* as_OpJavaCall() { return NULL; } + virtual LIR_OpLabel* as_OpLabel() { return NULL; } +@@ -1387,6 +1388,7 @@ + return (LIR_MoveKind)_flags; + } + ++ virtual bool is_patching() { return _patch != lir_patch_none; } + virtual void emit_code(LIR_Assembler* masm); + virtual LIR_Op1* as_Op1() { return this; } + virtual const char * name() const PRODUCT_RETURN0; +@@ -1619,6 +1621,7 @@ + int profiled_bci() const { return _profiled_bci; } + bool should_profile() const { return _should_profile; } + ++ virtual bool is_patching() { return _info_for_patch != NULL; } + virtual void emit_code(LIR_Assembler* masm); + virtual LIR_OpTypeCheck* as_OpTypeCheck() { return this; } + void print_instr(outputStream* out) const PRODUCT_RETURN; +--- ./hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_LIRAssembler.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -58,7 +58,7 @@ + _masm->nop(); + } + patch->install(_masm, patch_code, obj, info); +- append_patching_stub(patch); ++ append_code_stub(patch); + + #ifdef ASSERT + Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->stack()->bci()); +@@ -131,11 +131,6 @@ + } + + +-void LIR_Assembler::append_patching_stub(PatchingStub* stub) { +- _slow_case_stubs->append(stub); +-} +- +- + void LIR_Assembler::check_codespace() { + CodeSection* cs = _masm->code_section(); + if (cs->remaining() < (int)(NOT_LP64(1*K)LP64_ONLY(2*K))) { +@@ -144,7 +139,7 @@ + } + + +-void LIR_Assembler::emit_code_stub(CodeStub* stub) { ++void LIR_Assembler::append_code_stub(CodeStub* stub) { + _slow_case_stubs->append(stub); + } + +@@ -190,6 +185,13 @@ + return _masm->pc(); + } + ++// To bang the stack of this compiled method we use the stack size ++// that the interpreter would need in case of a deoptimization. This ++// removes the need to bang the stack in the deoptimization blob which ++// in turn simplifies stack overflow handling. ++int LIR_Assembler::bang_size_in_bytes() const { ++ return MAX2(initial_frame_size_in_bytes(), _compilation->interpreter_frame_size()); ++} + + void LIR_Assembler::emit_exception_entries(ExceptionInfoList* info_list) { + for (int i = 0; i < info_list->length(); i++) { +@@ -435,7 +437,7 @@ + + void LIR_Assembler::add_debug_info_for_null_check(int pc_offset, CodeEmitInfo* cinfo) { + ImplicitNullCheckStub* stub = new ImplicitNullCheckStub(pc_offset, cinfo); +- emit_code_stub(stub); ++ append_code_stub(stub); + } + + void LIR_Assembler::add_debug_info_for_div0_here(CodeEmitInfo* info) { +@@ -444,7 +446,7 @@ + + void LIR_Assembler::add_debug_info_for_div0(int pc_offset, CodeEmitInfo* cinfo) { + DivByZeroStub* stub = new DivByZeroStub(pc_offset, cinfo); +- emit_code_stub(stub); ++ append_code_stub(stub); + } + + void LIR_Assembler::emit_rtcall(LIR_OpRTCall* op) { +@@ -797,7 +799,7 @@ + + + void LIR_Assembler::build_frame() { +- _masm->build_frame(initial_frame_size_in_bytes()); ++ _masm->build_frame(initial_frame_size_in_bytes(), bang_size_in_bytes()); + } + + +@@ -858,9 +860,7 @@ + + void LIR_Assembler::verify_oop_map(CodeEmitInfo* info) { + #ifndef PRODUCT +- if (VerifyOopMaps || VerifyOops) { +- bool v = VerifyOops; +- VerifyOops = true; ++ if (VerifyOops) { + OopMapStream s(info->oop_map()); + while (!s.is_done()) { + OopMapValue v = s.current(); +@@ -883,7 +883,6 @@ + + s.next(); + } +- VerifyOops = v; + } + #endif + } +--- ./hotspot/src/share/vm/c1/c1_LIRAssembler.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_LIRAssembler.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -132,7 +132,8 @@ + int code_offset() const; + address pc() const; + +- int initial_frame_size_in_bytes(); ++ int initial_frame_size_in_bytes() const; ++ int bang_size_in_bytes() const; + + // test for constants which can be encoded directly in instructions + static bool is_small_constant(LIR_Opr opr); +@@ -143,7 +144,7 @@ + // stubs + void emit_slow_case_stubs(); + void emit_static_call_stub(); +- void emit_code_stub(CodeStub* op); ++ void append_code_stub(CodeStub* op); + void add_call_info_here(CodeEmitInfo* info) { add_call_info(code_offset(), info); } + + // code patterns +--- ./hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_LIRGenerator.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -2634,8 +2634,10 @@ + // LIR_Assembler::emit_profile_type() from emitting useless code + profiled_k = ciTypeEntries::with_status(result, profiled_k); + } +- if (exact_signature_k != NULL && exact_klass != exact_signature_k) { +- assert(exact_klass == NULL, "obj and signature disagree?"); ++ // exact_klass and exact_signature_k can be both non NULL but ++ // different if exact_klass is loaded after the ciObject for ++ // exact_signature_k is created. ++ if (exact_klass == NULL && exact_signature_k != NULL && exact_klass != exact_signature_k) { + // sometimes the type of the signature is better than the best type + // the compiler has + exact_klass = exact_signature_k; +@@ -2646,8 +2648,7 @@ + if (improved_klass == NULL) { + improved_klass = comp->cha_exact_type(callee_signature_k); + } +- if (improved_klass != NULL && exact_klass != improved_klass) { +- assert(exact_klass == NULL, "obj and signature disagree?"); ++ if (exact_klass == NULL && improved_klass != NULL && exact_klass != improved_klass) { + exact_klass = exact_signature_k; + } + } +@@ -3186,8 +3187,8 @@ + #ifdef ASSERT + Bytecodes::Code code = x->method()->raw_code_at_bci(x->bci_of_invoke()); + int n = x->nb_profiled_args(); +- assert(MethodData::profile_parameters() && x->inlined() && +- ((code == Bytecodes::_invokedynamic && n <= 1) || (code == Bytecodes::_invokehandle && n <= 2)), ++ assert(MethodData::profile_parameters() && (MethodData::profile_arguments_jsr292_only() || ++ (x->inlined() && ((code == Bytecodes::_invokedynamic && n <= 1) || (code == Bytecodes::_invokehandle && n <= 2)))), + "only at JSR292 bytecodes"); + #endif + } +@@ -3288,7 +3289,10 @@ + ciSignature* signature_at_call = NULL; + x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); + +- ciKlass* exact = profile_type(md, 0, md->byte_offset_of_slot(data, ret->type_offset()), ++ // The offset within the MDO of the entry to update may be too large ++ // to be used in load/store instructions on some platforms. So have ++ // profile_type() compute the address of the profile in a register. ++ ciKlass* exact = profile_type(md, md->byte_offset_of_slot(data, ret->type_offset()), 0, + ret->type(), x->ret(), mdp, + !x->needs_null_check(), + signature_at_call->return_type()->as_klass(), +--- ./hotspot/src/share/vm/c1/c1_LinearScan.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_LinearScan.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -2382,16 +2382,6 @@ + int arg_count = frame_map()->oop_map_arg_count(); + OopMap* map = new OopMap(frame_size, arg_count); + +- // Check if this is a patch site. +- bool is_patch_info = false; +- if (op->code() == lir_move) { +- assert(!is_call_site, "move must not be a call site"); +- assert(op->as_Op1() != NULL, "move must be LIR_Op1"); +- LIR_Op1* move = (LIR_Op1*)op; +- +- is_patch_info = move->patch_code() != lir_patch_none; +- } +- + // Iterate through active intervals + for (Interval* interval = iw->active_first(fixedKind); interval != Interval::end(); interval = interval->next()) { + int assigned_reg = interval->assigned_reg(); +@@ -2406,7 +2396,7 @@ + // moves, any intervals which end at this instruction are included + // in the oop map since we may safepoint while doing the patch + // before we've consumed the inputs. +- if (is_patch_info || op->id() < interval->current_to()) { ++ if (op->is_patching() || op->id() < interval->current_to()) { + + // caller-save registers must not be included into oop-maps at calls + assert(!is_call_site || assigned_reg >= nof_regs || !is_caller_save(assigned_reg), "interval is in a caller-save register at a call -> register will be overwritten"); +@@ -2451,6 +2441,9 @@ + CodeEmitInfo* info = visitor.info_at(i); + OopMap* oop_map = first_oop_map; + ++ // compute worst case interpreter size in case of a deoptimization ++ _compilation->update_interpreter_frame_size(info->interpreter_frame_size()); ++ + if (info->stack()->locks_size() != first_info->stack()->locks_size()) { + // this info has a different number of locks then the precomputed oop map + // (possible for lock and unlock instructions) -> compute oop map with +--- ./hotspot/src/share/vm/c1/c1_MacroAssembler.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_MacroAssembler.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -39,7 +39,7 @@ + void explicit_null_check(Register base); + + void inline_cache_check(Register receiver, Register iCache); +- void build_frame(int frame_size_in_bytes); ++ void build_frame(int frame_size_in_bytes, int bang_size_in_bytes); + void remove_frame(int frame_size_in_bytes); + + void unverified_entry(Register receiver, Register ic_klass); +--- ./hotspot/src/share/vm/c1/c1_RangeCheckElimination.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_RangeCheckElimination.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -62,10 +62,10 @@ + _optimistic = ir->compilation()->is_optimistic(); + + TRACE_RANGE_CHECK_ELIMINATION( +- tty->print_cr(""); ++ tty->cr(); + tty->print_cr("Range check elimination"); + ir->method()->print_name(tty); +- tty->print_cr(""); ++ tty->cr(); + ); + + TRACE_RANGE_CHECK_ELIMINATION( +@@ -1024,7 +1024,7 @@ + tty->print("i%d", phi->id()); + tty->print(": "); + bound->print(); +- tty->print_cr(""); ++ tty->cr(); + ); + } + }); +@@ -1039,7 +1039,7 @@ + tty->print("i%d", instr->id()); + tty->print(": "); + bound->print(); +- tty->print_cr(""); ++ tty->cr(); + ); + } + } +@@ -1400,7 +1400,7 @@ + + // print + void RangeCheckEliminator::Bound::print() { +- tty->print(""); ++ tty->print("%s", ""); + if (this->_lower_instr || this->_lower != min_jint) { + if (this->_lower_instr) { + tty->print("i%d", this->_lower_instr->id()); +--- ./hotspot/src/share/vm/c1/c1_Runtime1.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_Runtime1.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -532,8 +532,8 @@ + if (TraceExceptions) { + ttyLocker ttyl; + ResourceMark rm; +- tty->print_cr("Exception <%s> (0x%x) thrown in compiled method <%s> at PC " PTR_FORMAT " for thread 0x%x", +- exception->print_value_string(), (address)exception(), nm->method()->print_value_string(), pc, thread); ++ tty->print_cr("Exception <%s> (" INTPTR_FORMAT ") thrown in compiled method <%s> at PC " INTPTR_FORMAT " for thread " INTPTR_FORMAT "", ++ exception->print_value_string(), p2i((address)exception()), nm->method()->print_value_string(), p2i(pc), p2i(thread)); + } + // for AbortVMOnException flag + NOT_PRODUCT(Exceptions::debug_check_abort(exception)); +@@ -563,7 +563,7 @@ + ttyLocker ttyl; + ResourceMark rm; + tty->print_cr("Thread " PTR_FORMAT " continuing at PC " PTR_FORMAT " for exception thrown at PC " PTR_FORMAT, +- thread, continuation, pc); ++ p2i(thread), p2i(continuation), p2i(pc)); + } + + return continuation; +@@ -970,8 +970,8 @@ + address copy_buff = stub_location - *byte_skip - *byte_count; + address being_initialized_entry = stub_location - *being_initialized_entry_offset; + if (TracePatching) { +- tty->print_cr(" Patching %s at bci %d at address 0x%x (%s)", Bytecodes::name(code), bci, +- instr_pc, (stub_id == Runtime1::access_field_patching_id) ? "field" : "klass"); ++ tty->print_cr(" Patching %s at bci %d at address " INTPTR_FORMAT " (%s)", Bytecodes::name(code), bci, ++ p2i(instr_pc), (stub_id == Runtime1::access_field_patching_id) ? "field" : "klass"); + nmethod* caller_code = CodeCache::find_nmethod(caller_frame.pc()); + assert(caller_code != NULL, "nmethod not found"); + +@@ -1430,7 +1430,7 @@ + methodHandle inlinee = methodHandle(vfst.method()); + inlinee->print_short_name(&ss1); + m->print_short_name(&ss2); +- tty->print_cr("Predicate failed trap in method %s at bci %d inlined in %s at pc %x", ss1.as_string(), vfst.bci(), ss2.as_string(), caller_frame.pc()); ++ tty->print_cr("Predicate failed trap in method %s at bci %d inlined in %s at pc " INTPTR_FORMAT, ss1.as_string(), vfst.bci(), ss2.as_string(), p2i(caller_frame.pc())); + } + + +--- ./hotspot/src/share/vm/c1/c1_ValueType.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_ValueType.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -175,7 +175,7 @@ + ValueType* join(ValueType* y) const; + + // debugging +- void print(outputStream* s = tty) { s->print(name()); } ++ void print(outputStream* s = tty) { s->print("%s", name()); } + }; + + +--- ./hotspot/src/share/vm/c1/c1_globals.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/c1/c1_globals.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -47,6 +47,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "c1_globals_windows.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "c1_globals_aix.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "c1_globals_bsd.hpp" + #endif +@@ -269,9 +272,6 @@ + develop(bool, PrintNotLoaded, false, \ + "Prints where classes are not loaded during code generation") \ + \ +- notproduct(bool, VerifyOopMaps, false, \ +- "Adds oopmap verification code to the generated code") \ +- \ + develop(bool, PrintLIR, false, \ + "print low-level IR") \ + \ +--- ./hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -158,6 +158,9 @@ + + void BCEscapeAnalyzer::set_method_escape(ArgumentMap vars) { + clear_bits(vars, _arg_local); ++ if (vars.contains_allocated()) { ++ _allocated_escapes = true; ++ } + } + + void BCEscapeAnalyzer::set_global_escape(ArgumentMap vars, bool merge) { +@@ -1287,10 +1290,10 @@ + tty->print_cr("class of method is not initialized."); + else if (_level > MaxBCEAEstimateLevel) + tty->print_cr("level (%d) exceeds MaxBCEAEstimateLevel (%d).", +- _level, MaxBCEAEstimateLevel); ++ _level, (int) MaxBCEAEstimateLevel); + else if (method()->code_size() > MaxBCEAEstimateSize) +- tty->print_cr("code size (%d) exceeds MaxBCEAEstimateSize.", +- method()->code_size(), MaxBCEAEstimateSize); ++ tty->print_cr("code size (%d) exceeds MaxBCEAEstimateSize (%d).", ++ method()->code_size(), (int) MaxBCEAEstimateSize); + else + ShouldNotReachHere(); + } +--- ./hotspot/src/share/vm/ci/ciClassList.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciClassList.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -103,6 +103,7 @@ + friend class ciMethodType; \ + friend class ciReceiverTypeData; \ + friend class ciTypeEntries; \ ++friend class ciSpeculativeTrapData; \ + friend class ciSymbol; \ + friend class ciArray; \ + friend class ciObjArray; \ +--- ./hotspot/src/share/vm/ci/ciConstant.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciConstant.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -48,7 +48,7 @@ + tty->print("%d", _value._int); + break; + case T_LONG: +- tty->print(INT64_FORMAT, _value._long); ++ tty->print(INT64_FORMAT, (int64_t)(_value._long)); + break; + case T_FLOAT: + tty->print("%f", _value._float); +--- ./hotspot/src/share/vm/ci/ciEnv.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciEnv.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -926,7 +926,8 @@ + AbstractCompiler* compiler, + int comp_level, + bool has_unsafe_access, +- bool has_wide_vectors) { ++ bool has_wide_vectors, ++ RTMState rtm_state) { + VM_ENTRY_MARK; + nmethod* nm = NULL; + { +@@ -973,6 +974,15 @@ + + methodHandle method(THREAD, target->get_Method()); + ++#if INCLUDE_RTM_OPT ++ if (!failing() && (rtm_state != NoRTM) && ++ (method()->method_data() != NULL) && ++ (method()->method_data()->rtm_state() != rtm_state)) { ++ // Preemptive decompile if rtm state was changed. ++ record_failure("RTM state change invalidated rtm code"); ++ } ++#endif ++ + if (failing()) { + // While not a true deoptimization, it is a preemptive decompile. + MethodData* mdo = method()->method_data(); +@@ -999,13 +1009,15 @@ + frame_words, oop_map_set, + handler_table, inc_table, + compiler, comp_level); +- + // Free codeBlobs + code_buffer->free_blob(); + + if (nm != NULL) { + nm->set_has_unsafe_access(has_unsafe_access); + nm->set_has_wide_vectors(has_wide_vectors); ++#if INCLUDE_RTM_OPT ++ nm->set_rtm_state(rtm_state); ++#endif + + // Record successful registration. + // (Put nm into the task handle *before* publishing to the Java heap.) +@@ -1147,6 +1159,33 @@ + + // Don't change thread state and acquire any locks. + // Safe to call from VM error reporter. ++ ++void ciEnv::dump_compile_data(outputStream* out) { ++ CompileTask* task = this->task(); ++ Method* method = task->method(); ++ int entry_bci = task->osr_bci(); ++ int comp_level = task->comp_level(); ++ out->print("compile %s %s %s %d %d", ++ method->klass_name()->as_quoted_ascii(), ++ method->name()->as_quoted_ascii(), ++ method->signature()->as_quoted_ascii(), ++ entry_bci, comp_level); ++ if (compiler_data() != NULL) { ++ if (is_c2_compile(comp_level)) { // C2 or Shark ++#ifdef COMPILER2 ++ // Dump C2 inlining data. ++ ((Compile*)compiler_data())->dump_inline_data(out); ++#endif ++ } else if (is_c1_compile(comp_level)) { // C1 ++#ifdef COMPILER1 ++ // Dump C1 inlining data. ++ ((Compilation*)compiler_data())->dump_inline_data(out); ++#endif ++ } ++ } ++ out->cr(); ++} ++ + void ciEnv::dump_replay_data_unsafe(outputStream* out) { + ResourceMark rm; + #if INCLUDE_JVMTI +@@ -1160,16 +1199,7 @@ + for (int i = 0; i < objects->length(); i++) { + objects->at(i)->dump_replay_data(out); + } +- CompileTask* task = this->task(); +- Method* method = task->method(); +- int entry_bci = task->osr_bci(); +- int comp_level = task->comp_level(); +- // Klass holder = method->method_holder(); +- out->print_cr("compile %s %s %s %d %d", +- method->klass_name()->as_quoted_ascii(), +- method->name()->as_quoted_ascii(), +- method->signature()->as_quoted_ascii(), +- entry_bci, comp_level); ++ dump_compile_data(out); + out->flush(); + } + +@@ -1179,3 +1209,44 @@ + dump_replay_data_unsafe(out); + ) + } ++ ++void ciEnv::dump_replay_data(int compile_id) { ++ static char buffer[O_BUFLEN]; ++ int ret = jio_snprintf(buffer, O_BUFLEN, "replay_pid%p_compid%d.log", os::current_process_id(), compile_id); ++ if (ret > 0) { ++ int fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666); ++ if (fd != -1) { ++ FILE* replay_data_file = os::open(fd, "w"); ++ if (replay_data_file != NULL) { ++ fileStream replay_data_stream(replay_data_file, /*need_close=*/true); ++ dump_replay_data(&replay_data_stream); ++ tty->print_cr("# Compiler replay data is saved as: %s", buffer); ++ } else { ++ tty->print_cr("# Can't open file to dump replay data."); ++ } ++ } ++ } ++} ++ ++void ciEnv::dump_inline_data(int compile_id) { ++ static char buffer[O_BUFLEN]; ++ int ret = jio_snprintf(buffer, O_BUFLEN, "inline_pid%p_compid%d.log", os::current_process_id(), compile_id); ++ if (ret > 0) { ++ int fd = open(buffer, O_RDWR | O_CREAT | O_TRUNC, 0666); ++ if (fd != -1) { ++ FILE* inline_data_file = os::open(fd, "w"); ++ if (inline_data_file != NULL) { ++ fileStream replay_data_stream(inline_data_file, /*need_close=*/true); ++ GUARDED_VM_ENTRY( ++ MutexLocker ml(Compile_lock); ++ dump_compile_data(&replay_data_stream); ++ ) ++ replay_data_stream.flush(); ++ tty->print("# Compiler inline data is saved as: "); ++ tty->print_cr("%s", buffer); ++ } else { ++ tty->print_cr("# Can't open file to dump inline data."); ++ } ++ } ++ } ++} +--- ./hotspot/src/share/vm/ci/ciEnv.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciEnv.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -363,7 +363,8 @@ + AbstractCompiler* compiler, + int comp_level, + bool has_unsafe_access, +- bool has_wide_vectors); ++ bool has_wide_vectors, ++ RTMState rtm_state = NoRTM); + + + // Access to certain well known ciObjects. +@@ -451,8 +452,11 @@ + void metadata_do(void f(Metadata*)) { _factory->metadata_do(f); } + + // Dump the compilation replay data for the ciEnv to the stream. ++ void dump_replay_data(int compile_id); ++ void dump_inline_data(int compile_id); + void dump_replay_data(outputStream* out); + void dump_replay_data_unsafe(outputStream* out); ++ void dump_compile_data(outputStream* out); + }; + + #endif // SHARE_VM_CI_CIENV_HPP +--- ./hotspot/src/share/vm/ci/ciField.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciField.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -138,6 +138,17 @@ + return; + } + ++ // Access check based on declared_holder. canonical_holder should not be used ++ // to check access because it can erroneously succeed. If this check fails, ++ // propagate the declared holder to will_link() which in turn will bail out ++ // compilation for this field access. ++ if (!Reflection::verify_field_access(klass->get_Klass(), declared_holder->get_Klass(), canonical_holder, field_desc.access_flags(), true)) { ++ _holder = declared_holder; ++ _offset = -1; ++ _is_constant = false; ++ return; ++ } ++ + assert(canonical_holder == field_desc.field_holder(), "just checking"); + initialize_from(&field_desc); + } +--- ./hotspot/src/share/vm/ci/ciInstanceKlass.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciInstanceKlass.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -292,7 +292,7 @@ + // Implementation of the print method. + void ciInstanceKlass::print_impl(outputStream* st) { + ciKlass::print_impl(st); +- GUARDED_VM_ENTRY(st->print(" loader=0x%x", (address)loader());) ++ GUARDED_VM_ENTRY(st->print(" loader=" INTPTR_FORMAT, p2i((address)loader()));) + if (is_loaded()) { + st->print(" loaded=true initialized=%s finalized=%s subklass=%s size=%d flags=", + bool_to_str(is_initialized()), +@@ -618,7 +618,7 @@ + case T_SHORT: _out->print_cr("%d", mirror->short_field(fd->offset())); break; + case T_CHAR: _out->print_cr("%d", mirror->char_field(fd->offset())); break; + case T_INT: _out->print_cr("%d", mirror->int_field(fd->offset())); break; +- case T_LONG: _out->print_cr(INT64_FORMAT, mirror->long_field(fd->offset())); break; ++ case T_LONG: _out->print_cr(INT64_FORMAT, (int64_t)(mirror->long_field(fd->offset()))); break; + case T_FLOAT: { + float f = mirror->float_field(fd->offset()); + _out->print_cr("%d", *(int*)&f); +@@ -626,7 +626,7 @@ + } + case T_DOUBLE: { + double d = mirror->double_field(fd->offset()); +- _out->print_cr(INT64_FORMAT, *(jlong*)&d); ++ _out->print_cr(INT64_FORMAT, *(int64_t*)&d); + break; + } + case T_ARRAY: { +@@ -656,7 +656,7 @@ + _out->print_cr("\""); + } else { + const char* klass_name = value->klass()->name()->as_quoted_ascii(); +- _out->print_cr(klass_name); ++ _out->print_cr("%s", klass_name); + } + } else { + ShouldNotReachHere(); +--- ./hotspot/src/share/vm/ci/ciMetadata.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciMetadata.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -38,7 +38,7 @@ + void ciMetadata::print(outputStream* st) { + st->print("<%s", type_string()); + GUARDED_VM_ENTRY(print_impl(st);) +- st->print(" ident=%d address=0x%x>", ident(), (address)this); ++ st->print(" ident=%d address=" INTPTR_FORMAT ">", ident(), p2i((address)this)); + } + + +--- ./hotspot/src/share/vm/ci/ciMethod.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciMethod.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -80,6 +80,7 @@ + _code_size = h_m()->code_size(); + _intrinsic_id = h_m()->intrinsic_id(); + _handler_count = h_m()->exception_table_length(); ++ _size_of_parameters = h_m()->size_of_parameters(); + _uses_monitors = h_m()->access_flags().has_monitor_bytecodes(); + _balanced_monitors = !_uses_monitors || h_m()->access_flags().is_monitor_matching(); + _is_c1_compilable = !h_m()->is_not_c1_compilable(); +@@ -1362,15 +1363,21 @@ + + #undef FETCH_FLAG_FROM_VM + ++void ciMethod::dump_name_as_ascii(outputStream* st) { ++ Method* method = get_Method(); ++ st->print("%s %s %s", ++ method->klass_name()->as_quoted_ascii(), ++ method->name()->as_quoted_ascii(), ++ method->signature()->as_quoted_ascii()); ++} ++ + void ciMethod::dump_replay_data(outputStream* st) { + ResourceMark rm; + Method* method = get_Method(); + MethodCounters* mcs = method->method_counters(); +- Klass* holder = method->method_holder(); +- st->print_cr("ciMethod %s %s %s %d %d %d %d %d", +- holder->name()->as_quoted_ascii(), +- method->name()->as_quoted_ascii(), +- method->signature()->as_quoted_ascii(), ++ st->print("ciMethod "); ++ dump_name_as_ascii(st); ++ st->print_cr(" %d %d %d %d %d", + mcs == NULL ? 0 : mcs->invocation_counter()->raw_counter(), + mcs == NULL ? 0 : mcs->backedge_counter()->raw_counter(), + interpreter_invocation_count(), +--- ./hotspot/src/share/vm/ci/ciMethod.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciMethod.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -71,6 +71,7 @@ + int _interpreter_invocation_count; + int _interpreter_throwout_count; + int _instructions_size; ++ int _size_of_parameters; + + bool _uses_monitors; + bool _balanced_monitors; +@@ -166,6 +167,7 @@ + int exception_table_length() const { check_is_loaded(); return _handler_count; } + int interpreter_invocation_count() const { check_is_loaded(); return _interpreter_invocation_count; } + int interpreter_throwout_count() const { check_is_loaded(); return _interpreter_throwout_count; } ++ int size_of_parameters() const { check_is_loaded(); return _size_of_parameters; } + + // Code size for inlining decisions. + int code_size_for_inlining(); +@@ -241,7 +243,6 @@ + + ciField* get_field_at_bci( int bci, bool &will_link); + ciMethod* get_method_at_bci(int bci, bool &will_link, ciSignature* *declared_signature); +- + // Given a certain calling environment, find the monomorphic target + // for the call. Return NULL if the call is not monomorphic in + // its calling environment. +@@ -310,10 +311,13 @@ + bool is_accessor () const; + bool is_initializer () const; + bool can_be_statically_bound() const { return _can_be_statically_bound; } +- void dump_replay_data(outputStream* st); + bool is_boxing_method() const; + bool is_unboxing_method() const; + ++ // Replay data methods ++ void dump_name_as_ascii(outputStream* st); ++ void dump_replay_data(outputStream* st); ++ + // Print the bytecodes of this method. + void print_codes_on(outputStream* st); + void print_codes() { +--- ./hotspot/src/share/vm/ci/ciMethodData.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciMethodData.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -78,6 +78,36 @@ + _parameters = NULL; + } + ++void ciMethodData::load_extra_data() { ++ MethodData* mdo = get_MethodData(); ++ ++ // speculative trap entries also hold a pointer to a Method so need to be translated ++ DataLayout* dp_src = mdo->extra_data_base(); ++ DataLayout* end_src = mdo->extra_data_limit(); ++ DataLayout* dp_dst = extra_data_base(); ++ for (;; dp_src = MethodData::next_extra(dp_src), dp_dst = MethodData::next_extra(dp_dst)) { ++ assert(dp_src < end_src, "moved past end of extra data"); ++ // New traps in the MDO can be added as we translate the copy so ++ // look at the entries in the copy. ++ switch(dp_dst->tag()) { ++ case DataLayout::speculative_trap_data_tag: { ++ ciSpeculativeTrapData* data_dst = new ciSpeculativeTrapData(dp_dst); ++ SpeculativeTrapData* data_src = new SpeculativeTrapData(dp_src); ++ data_dst->translate_from(data_src); ++ break; ++ } ++ case DataLayout::bit_data_tag: ++ break; ++ case DataLayout::no_tag: ++ case DataLayout::arg_info_data_tag: ++ // An empty slot or ArgInfoData entry marks the end of the trap data ++ return; ++ default: ++ fatal(err_msg("bad tag = %d", dp_dst->tag())); ++ } ++ } ++} ++ + void ciMethodData::load_data() { + MethodData* mdo = get_MethodData(); + if (mdo == NULL) { +@@ -116,6 +146,8 @@ + parameters->translate_from(mdo->parameters_type_data()); + } + ++ load_extra_data(); ++ + // Note: Extra data are all BitData, and do not need translation. + _current_mileage = MethodData::mileage_of(mdo->method()); + _invocation_counter = mdo->invocation_count(); +@@ -156,6 +188,12 @@ + set_type(translate_klass(k)); + } + ++void ciSpeculativeTrapData::translate_from(const ProfileData* data) { ++ Method* m = data->as_SpeculativeTrapData()->method(); ++ ciMethod* ci_m = CURRENT_ENV->get_method(m); ++ set_method(ci_m); ++} ++ + // Get the data at an arbitrary (sort of) data index. + ciProfileData* ciMethodData::data_at(int data_index) { + if (out_of_bounds(data_index)) { +@@ -203,33 +241,65 @@ + return next; + } + +-// Translate a bci to its corresponding data, or NULL. +-ciProfileData* ciMethodData::bci_to_data(int bci) { +- ciProfileData* data = data_before(bci); +- for ( ; is_valid(data); data = next_data(data)) { +- if (data->bci() == bci) { +- set_hint_di(dp_to_di(data->dp())); +- return data; +- } else if (data->bci() > bci) { +- break; +- } +- } ++ciProfileData* ciMethodData::bci_to_extra_data(int bci, ciMethod* m, bool& two_free_slots) { + // bci_to_extra_data(bci) ... + DataLayout* dp = data_layout_at(data_size()); + DataLayout* end = data_layout_at(data_size() + extra_data_size()); +- for (; dp < end; dp = MethodData::next_extra(dp)) { +- if (dp->tag() == DataLayout::no_tag) { ++ two_free_slots = false; ++ for (;dp < end; dp = MethodData::next_extra(dp)) { ++ switch(dp->tag()) { ++ case DataLayout::no_tag: + _saw_free_extra_data = true; // observed an empty slot (common case) ++ two_free_slots = (MethodData::next_extra(dp)->tag() == DataLayout::no_tag); + return NULL; ++ case DataLayout::arg_info_data_tag: ++ return NULL; // ArgInfoData is at the end of extra data section. ++ case DataLayout::bit_data_tag: ++ if (m == NULL && dp->bci() == bci) { ++ return new ciBitData(dp); ++ } ++ break; ++ case DataLayout::speculative_trap_data_tag: { ++ ciSpeculativeTrapData* data = new ciSpeculativeTrapData(dp); ++ // data->method() might be null if the MDO is snapshotted ++ // concurrently with a trap ++ if (m != NULL && data->method() == m && dp->bci() == bci) { ++ return data; ++ } ++ break; + } +- if (dp->tag() == DataLayout::arg_info_data_tag) { +- break; // ArgInfoData is at the end of extra data section. ++ default: ++ fatal(err_msg("bad tag = %d", dp->tag())); + } +- if (dp->bci() == bci) { +- assert(dp->tag() == DataLayout::bit_data_tag, "sane"); +- return new ciBitData(dp); ++ } ++ return NULL; ++} ++ ++// Translate a bci to its corresponding data, or NULL. ++ciProfileData* ciMethodData::bci_to_data(int bci, ciMethod* m) { ++ // If m is not NULL we look for a SpeculativeTrapData entry ++ if (m == NULL) { ++ ciProfileData* data = data_before(bci); ++ for ( ; is_valid(data); data = next_data(data)) { ++ if (data->bci() == bci) { ++ set_hint_di(dp_to_di(data->dp())); ++ return data; ++ } else if (data->bci() > bci) { ++ break; ++ } + } + } ++ bool two_free_slots = false; ++ ciProfileData* result = bci_to_extra_data(bci, m, two_free_slots); ++ if (result != NULL) { ++ return result; ++ } ++ if (m != NULL && !two_free_slots) { ++ // We were looking for a SpeculativeTrapData entry we didn't ++ // find. Room is not available for more SpeculativeTrapData ++ // entries, look in the non SpeculativeTrapData entries. ++ return bci_to_data(bci, NULL); ++ } + return NULL; + } + +@@ -487,7 +557,7 @@ + if (round == 0) { + count++; + } else { +- out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii()); ++ out->print(" %d %s", (int)(dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t)), k->name()->as_quoted_ascii()); + } + } + } +@@ -499,7 +569,7 @@ + if (round == 0) { + count++; + } else { +- out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii()); ++ out->print(" %d %s", (int)(dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t)), k->name()->as_quoted_ascii()); + } + } + } +@@ -525,18 +595,25 @@ + st->print_cr("--- Extra data:"); + DataLayout* dp = data_layout_at(data_size()); + DataLayout* end = data_layout_at(data_size() + extra_data_size()); +- for (; dp < end; dp = MethodData::next_extra(dp)) { +- if (dp->tag() == DataLayout::no_tag) continue; +- if (dp->tag() == DataLayout::bit_data_tag) { ++ for (;; dp = MethodData::next_extra(dp)) { ++ assert(dp < end, "moved past end of extra data"); ++ switch (dp->tag()) { ++ case DataLayout::no_tag: ++ continue; ++ case DataLayout::bit_data_tag: + data = new BitData(dp); +- } else { +- assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo"); ++ break; ++ case DataLayout::arg_info_data_tag: + data = new ciArgInfoData(dp); + dp = end; // ArgInfoData is at the end of extra data section. ++ break; ++ default: ++ fatal(err_msg("unexpected tag %d", dp->tag())); + } + st->print("%d", dp_to_di(data->dp())); + st->fill_to(6); + data->print_data_on(st); ++ if (dp >= end) return; + } + } + +@@ -569,8 +646,8 @@ + st->cr(); + } + +-void ciCallTypeData::print_data_on(outputStream* st) const { +- print_shared(st, "ciCallTypeData"); ++void ciCallTypeData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "ciCallTypeData", extra); + if (has_arguments()) { + tab(st, true); + st->print("argument types"); +@@ -599,18 +676,18 @@ + } + } + +-void ciReceiverTypeData::print_data_on(outputStream* st) const { +- print_shared(st, "ciReceiverTypeData"); ++void ciReceiverTypeData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "ciReceiverTypeData", extra); + print_receiver_data_on(st); + } + +-void ciVirtualCallData::print_data_on(outputStream* st) const { +- print_shared(st, "ciVirtualCallData"); ++void ciVirtualCallData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "ciVirtualCallData", extra); + rtd_super()->print_receiver_data_on(st); + } + +-void ciVirtualCallTypeData::print_data_on(outputStream* st) const { +- print_shared(st, "ciVirtualCallTypeData"); ++void ciVirtualCallTypeData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "ciVirtualCallTypeData", extra); + rtd_super()->print_receiver_data_on(st); + if (has_arguments()) { + tab(st, true); +@@ -624,8 +701,15 @@ + } + } + +-void ciParametersTypeData::print_data_on(outputStream* st) const { +- st->print_cr("Parametertypes"); ++void ciParametersTypeData::print_data_on(outputStream* st, const char* extra) const { ++ st->print_cr("ciParametersTypeData"); + parameters()->print_data_on(st); + } ++ ++void ciSpeculativeTrapData::print_data_on(outputStream* st, const char* extra) const { ++ st->print_cr("ciSpeculativeTrapData"); ++ tab(st); ++ method()->print_short_name(st); ++ st->cr(); ++} + #endif +--- ./hotspot/src/share/vm/ci/ciMethodData.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciMethodData.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -31,6 +31,7 @@ + #include "ci/ciUtilities.hpp" + #include "oops/methodData.hpp" + #include "oops/oop.inline.hpp" ++#include "runtime/deoptimization.hpp" + + class ciBitData; + class ciCounterData; +@@ -44,6 +45,7 @@ + class ciCallTypeData; + class ciVirtualCallTypeData; + class ciParametersTypeData; ++class ciSpeculativeTrapData;; + + typedef ProfileData ciProfileData; + +@@ -173,7 +175,7 @@ + } + + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra) const; + #endif + }; + +@@ -200,7 +202,7 @@ + } + void translate_receiver_data_from(const ProfileData* data); + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra) const; + void print_receiver_data_on(outputStream* st) const; + #endif + }; +@@ -225,7 +227,7 @@ + rtd_super()->translate_receiver_data_from(data); + } + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra) const; + #endif + }; + +@@ -287,7 +289,7 @@ + } + + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra) const; + #endif + }; + +@@ -336,7 +338,26 @@ + } + + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra) const; ++#endif ++}; ++ ++class ciSpeculativeTrapData : public SpeculativeTrapData { ++public: ++ ciSpeculativeTrapData(DataLayout* layout) : SpeculativeTrapData(layout) {} ++ ++ virtual void translate_from(const ProfileData* data); ++ ++ ciMethod* method() const { ++ return (ciMethod*)intptr_at(method_offset); ++ } ++ ++ void set_method(ciMethod* m) { ++ set_intptr_at(method_offset, (intptr_t)m); ++ } ++ ++#ifndef PRODUCT ++ void print_data_on(outputStream* st, const char* extra) const; + #endif + }; + +@@ -436,6 +457,16 @@ + + ciArgInfoData *arg_info() const; + ++ address data_base() const { ++ return (address) _data; ++ } ++ DataLayout* limit_data_position() const { ++ return (DataLayout*)((address)data_base() + _data_size); ++ } ++ ++ void load_extra_data(); ++ ciProfileData* bci_to_extra_data(int bci, ciMethod* m, bool& two_free_slots); ++ + public: + bool is_method_data() const { return true; } + +@@ -447,6 +478,18 @@ + + int invocation_count() { return _invocation_counter; } + int backedge_count() { return _backedge_counter; } ++ ++#if INCLUDE_RTM_OPT ++ // return cached value ++ int rtm_state() { ++ if (is_empty()) { ++ return NoRTM; ++ } else { ++ return get_MethodData()->rtm_state(); ++ } ++ } ++#endif ++ + // Transfer information about the method to MethodData*. + // would_profile means we would like to profile this method, + // meaning it's not trivial. +@@ -475,9 +518,11 @@ + ciProfileData* next_data(ciProfileData* current); + bool is_valid(ciProfileData* current) { return current != NULL; } + +- // Get the data at an arbitrary bci, or NULL if there is none. +- ciProfileData* bci_to_data(int bci); +- ciProfileData* bci_to_extra_data(int bci, bool create_if_missing); ++ DataLayout* extra_data_base() const { return limit_data_position(); } ++ ++ // Get the data at an arbitrary bci, or NULL if there is none. If m ++ // is not NULL look for a SpeculativeTrapData if any first. ++ ciProfileData* bci_to_data(int bci, ciMethod* m = NULL); + + uint overflow_trap_count() const { + return _orig.overflow_trap_count(); +@@ -496,12 +541,13 @@ + + // Helpful query functions that decode trap_state. + int has_trap_at(ciProfileData* data, int reason); +- int has_trap_at(int bci, int reason) { +- return has_trap_at(bci_to_data(bci), reason); ++ int has_trap_at(int bci, ciMethod* m, int reason) { ++ assert((m != NULL) == Deoptimization::reason_is_speculate(reason), "inconsistent method/reason"); ++ return has_trap_at(bci_to_data(bci, m), reason); + } + int trap_recompiled_at(ciProfileData* data); +- int trap_recompiled_at(int bci) { +- return trap_recompiled_at(bci_to_data(bci)); ++ int trap_recompiled_at(int bci, ciMethod* m) { ++ return trap_recompiled_at(bci_to_data(bci, m)); + } + + void clear_escape_info(); +--- ./hotspot/src/share/vm/ci/ciObject.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciObject.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -214,9 +214,9 @@ + void ciObject::print(outputStream* st) { + st->print("<%s", type_string()); + GUARDED_VM_ENTRY(print_impl(st);) +- st->print(" ident=%d %s address=0x%x>", ident(), ++ st->print(" ident=%d %s address=" INTPTR_FORMAT ">", ident(), + is_scavengable() ? "SCAVENGABLE" : "", +- (address)this); ++ p2i((address)this)); + } + + // ------------------------------------------------------------------ +--- ./hotspot/src/share/vm/ci/ciReplay.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciReplay.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -24,6 +24,8 @@ + #include "precompiled.hpp" + #include "ci/ciMethodData.hpp" + #include "ci/ciReplay.hpp" ++#include "ci/ciSymbol.hpp" ++#include "ci/ciKlass.hpp" + #include "ci/ciUtilities.hpp" + #include "compiler/compileBroker.hpp" + #include "memory/allocation.inline.hpp" +@@ -37,74 +39,107 @@ + // ciReplay + + typedef struct _ciMethodDataRecord { +- const char* klass; +- const char* method; +- const char* signature; +- int state; +- int current_mileage; +- intptr_t* data; +- int data_length; +- char* orig_data; +- int orig_data_length; +- int oops_length; +- jobject* oops_handles; +- int* oops_offsets; ++ const char* _klass_name; ++ const char* _method_name; ++ const char* _signature; ++ ++ int _state; ++ int _current_mileage; ++ ++ intptr_t* _data; ++ char* _orig_data; ++ jobject* _oops_handles; ++ int* _oops_offsets; ++ int _data_length; ++ int _orig_data_length; ++ int _oops_length; + } ciMethodDataRecord; + + typedef struct _ciMethodRecord { +- const char* klass; +- const char* method; +- const char* signature; +- int instructions_size; +- int interpreter_invocation_count; +- int interpreter_throwout_count; +- int invocation_counter; +- int backedge_counter; ++ const char* _klass_name; ++ const char* _method_name; ++ const char* _signature; ++ ++ int _instructions_size; ++ int _interpreter_invocation_count; ++ int _interpreter_throwout_count; ++ int _invocation_counter; ++ int _backedge_counter; + } ciMethodRecord; + +-class CompileReplay; ++typedef struct _ciInlineRecord { ++ const char* _klass_name; ++ const char* _method_name; ++ const char* _signature; ++ ++ int _inline_depth; ++ int _inline_bci; ++} ciInlineRecord; ++ ++class CompileReplay; + static CompileReplay* replay_state; + + class CompileReplay : public StackObj { + private: +- FILE* stream; +- Thread* thread; +- Handle protection_domain; +- Handle loader; ++ FILE* _stream; ++ Thread* _thread; ++ Handle _protection_domain; ++ Handle _loader; + +- GrowableArray ci_method_records; +- GrowableArray ci_method_data_records; ++ GrowableArray _ci_method_records; ++ GrowableArray _ci_method_data_records; ++ ++ // Use pointer because we may need to return inline records ++ // without destroying them. ++ GrowableArray* _ci_inline_records; + + const char* _error_message; + +- char* bufptr; +- char* buffer; +- int buffer_length; +- int buffer_end; +- int line_no; ++ char* _bufptr; ++ char* _buffer; ++ int _buffer_length; ++ int _buffer_pos; ++ ++ // "compile" data ++ ciKlass* _iklass; ++ Method* _imethod; ++ int _entry_bci; ++ int _comp_level; + + public: + CompileReplay(const char* filename, TRAPS) { +- thread = THREAD; +- loader = Handle(thread, SystemDictionary::java_system_loader()); +- stream = fopen(filename, "rt"); +- if (stream == NULL) { ++ _thread = THREAD; ++ _loader = Handle(_thread, SystemDictionary::java_system_loader()); ++ _protection_domain = Handle(); ++ ++ _stream = fopen(filename, "rt"); ++ if (_stream == NULL) { + fprintf(stderr, "ERROR: Can't open replay file %s\n", filename); + } +- buffer_length = 32; +- buffer = NEW_RESOURCE_ARRAY(char, buffer_length); ++ ++ _ci_inline_records = NULL; + _error_message = NULL; + ++ _buffer_length = 32; ++ _buffer = NEW_RESOURCE_ARRAY(char, _buffer_length); ++ _bufptr = _buffer; ++ _buffer_pos = 0; ++ ++ _imethod = NULL; ++ _iklass = NULL; ++ _entry_bci = 0; ++ _comp_level = 0; ++ + test(); + } + + ~CompileReplay() { +- if (stream != NULL) fclose(stream); ++ if (_stream != NULL) fclose(_stream); + } + + void test() { +- strcpy(buffer, "1 2 foo 4 bar 0x9 \"this is it\""); +- bufptr = buffer; ++ strcpy(_buffer, "1 2 foo 4 bar 0x9 \"this is it\""); ++ _bufptr = _buffer; + assert(parse_int("test") == 1, "what"); + assert(parse_int("test") == 2, "what"); + assert(strcmp(parse_string(), "foo") == 0, "what"); +@@ -115,18 +150,18 @@ + } + + bool had_error() { +- return _error_message != NULL || thread->has_pending_exception(); ++ return _error_message != NULL || _thread->has_pending_exception(); + } + + bool can_replay() { +- return !(stream == NULL || had_error()); ++ return !(_stream == NULL || had_error()); + } + + void report_error(const char* msg) { + _error_message = msg; +- // Restore the buffer contents for error reporting +- for (int i = 0; i < buffer_end; i++) { +- if (buffer[i] == '\0') buffer[i] = ' '; ++ // Restore the _buffer contents for error reporting ++ for (int i = 0; i < _buffer_pos; i++) { ++ if (_buffer[i] == '\0') _buffer[i] = ' '; + } + } + +@@ -137,10 +172,10 @@ + + int v = 0; + int read; +- if (sscanf(bufptr, "%i%n", &v, &read) != 1) { ++ if (sscanf(_bufptr, "%i%n", &v, &read) != 1) { + report_error(label); + } else { +- bufptr += read; ++ _bufptr += read; + } + return v; + } +@@ -152,31 +187,31 @@ + + intptr_t v = 0; + int read; +- if (sscanf(bufptr, INTPTR_FORMAT "%n", &v, &read) != 1) { ++ if (sscanf(_bufptr, INTPTR_FORMAT "%n", &v, &read) != 1) { + report_error(label); + } else { +- bufptr += read; ++ _bufptr += read; + } + return v; + } + + void skip_ws() { + // Skip any leading whitespace +- while (*bufptr == ' ' || *bufptr == '\t') { +- bufptr++; ++ while (*_bufptr == ' ' || *_bufptr == '\t') { ++ _bufptr++; + } + } + + + char* scan_and_terminate(char delim) { +- char* str = bufptr; +- while (*bufptr != delim && *bufptr != '\0') { +- bufptr++; ++ char* str = _bufptr; ++ while (*_bufptr != delim && *_bufptr != '\0') { ++ _bufptr++; + } +- if (*bufptr != '\0') { +- *bufptr++ = '\0'; ++ if (*_bufptr != '\0') { ++ *_bufptr++ = '\0'; + } +- if (bufptr == str) { ++ if (_bufptr == str) { + // nothing here + return NULL; + } +@@ -195,8 +230,8 @@ + + skip_ws(); + +- if (*bufptr == '"') { +- bufptr++; ++ if (*_bufptr == '"') { ++ _bufptr++; + return scan_and_terminate('"'); + } else { + return scan_and_terminate(' '); +@@ -273,7 +308,12 @@ + const char* str = parse_escaped_string(); + Symbol* klass_name = SymbolTable::lookup(str, (int)strlen(str), CHECK_NULL); + if (klass_name != NULL) { +- Klass* k = SystemDictionary::resolve_or_fail(klass_name, loader, protection_domain, true, THREAD); ++ Klass* k = NULL; ++ if (_iklass != NULL) { ++ k = (Klass*)_iklass->find_klass(ciSymbol::make(klass_name->as_C_string()))->constant_encoding(); ++ } else { ++ k = SystemDictionary::resolve_or_fail(klass_name, _loader, _protection_domain, true, THREAD); ++ } + if (HAS_PENDING_EXCEPTION) { + oop throwable = PENDING_EXCEPTION; + java_lang_Throwable::print(throwable, tty); +@@ -289,7 +329,7 @@ + // Lookup a klass + Klass* resolve_klass(const char* klass, TRAPS) { + Symbol* klass_name = SymbolTable::lookup(klass, (int)strlen(klass), CHECK_NULL); +- return SystemDictionary::resolve_or_fail(klass_name, loader, protection_domain, true, CHECK_NULL); ++ return SystemDictionary::resolve_or_fail(klass_name, _loader, _protection_domain, true, CHECK_NULL); + } + + // Parse the standard tuple of +@@ -304,40 +344,49 @@ + return m; + } + ++ int get_line(int c) { ++ while(c != EOF) { ++ if (_buffer_pos + 1 >= _buffer_length) { ++ int new_length = _buffer_length * 2; ++ // Next call will throw error in case of OOM. ++ _buffer = REALLOC_RESOURCE_ARRAY(char, _buffer, _buffer_length, new_length); ++ _buffer_length = new_length; ++ } ++ if (c == '\n') { ++ c = getc(_stream); // get next char ++ break; ++ } else if (c == '\r') { ++ // skip LF ++ } else { ++ _buffer[_buffer_pos++] = c; ++ } ++ c = getc(_stream); ++ } ++ // null terminate it, reset the pointer ++ _buffer[_buffer_pos] = '\0'; // NL or EOF ++ _buffer_pos = 0; ++ _bufptr = _buffer; ++ return c; ++ } ++ + // Process each line of the replay file executing each command until + // the file ends. + void process(TRAPS) { +- line_no = 1; +- int pos = 0; +- int c = getc(stream); ++ int line_no = 1; ++ int c = getc(_stream); + while(c != EOF) { +- if (pos + 1 >= buffer_length) { +- int newl = buffer_length * 2; +- char* newb = NEW_RESOURCE_ARRAY(char, newl); +- memcpy(newb, buffer, pos); +- buffer = newb; +- buffer_length = newl; +- } +- if (c == '\n') { +- // null terminate it, reset the pointer and process the line +- buffer[pos] = '\0'; +- buffer_end = pos++; +- bufptr = buffer; +- process_command(CHECK); +- if (had_error()) { +- tty->print_cr("Error while parsing line %d: %s\n", line_no, _error_message); +- tty->print_cr("%s", buffer); ++ c = get_line(c); ++ process_command(THREAD); ++ if (had_error()) { ++ tty->print_cr("Error while parsing line %d: %s\n", line_no, _error_message); ++ if (ReplayIgnoreInitErrors) { ++ CLEAR_PENDING_EXCEPTION; ++ _error_message = NULL; ++ } else { + return; + } +- pos = 0; +- buffer_end = 0; +- line_no++; +- } else if (c == '\r') { +- // skip LF +- } else { +- buffer[pos++] = c; + } +- c = getc(stream); ++ line_no++; + } + } + +@@ -396,7 +445,37 @@ + return true; + } + +- // compile ++ // compile inline ... ++ void* process_inline(ciMethod* imethod, Method* m, int entry_bci, int comp_level, TRAPS) { ++ _imethod = m; ++ _iklass = imethod->holder(); ++ _entry_bci = entry_bci; ++ _comp_level = comp_level; ++ int line_no = 1; ++ int c = getc(_stream); ++ while(c != EOF) { ++ c = get_line(c); ++ // Expecting only lines with "compile" command in inline replay file. ++ char* cmd = parse_string(); ++ if (cmd == NULL || strcmp("compile", cmd) != 0) { ++ return NULL; ++ } ++ process_compile(CHECK_NULL); ++ if (had_error()) { ++ tty->print_cr("Error while parsing line %d: %s\n", line_no, _error_message); ++ tty->print_cr("%s", _buffer); ++ return NULL; ++ } ++ if (_ci_inline_records != NULL && _ci_inline_records->length() > 0) { ++ // Found inlining record for the requested method. ++ return _ci_inline_records; ++ } ++ line_no++; ++ } ++ return NULL; ++ } ++ ++ // compile inline ... + void process_compile(TRAPS) { + Method* method = parse_method(CHECK); + if (had_error()) return; +@@ -410,6 +489,43 @@ + if (!is_valid_comp_level(comp_level)) { + return; + } ++ if (_imethod != NULL) { ++ // Replay Inlining ++ if (entry_bci != _entry_bci || comp_level != _comp_level) { ++ return; ++ } ++ const char* iklass_name = _imethod->method_holder()->name()->as_utf8(); ++ const char* imethod_name = _imethod->name()->as_utf8(); ++ const char* isignature = _imethod->signature()->as_utf8(); ++ const char* klass_name = method->method_holder()->name()->as_utf8(); ++ const char* method_name = method->name()->as_utf8(); ++ const char* signature = method->signature()->as_utf8(); ++ if (strcmp(iklass_name, klass_name) != 0 || ++ strcmp(imethod_name, method_name) != 0 || ++ strcmp(isignature, signature) != 0) { ++ return; ++ } ++ } ++ int inline_count = 0; ++ if (parse_tag_and_count("inline", inline_count)) { ++ // Record inlining data ++ _ci_inline_records = new GrowableArray(); ++ for (int i = 0; i < inline_count; i++) { ++ int depth = parse_int("inline_depth"); ++ int bci = parse_int("inline_bci"); ++ if (had_error()) { ++ break; ++ } ++ Method* inl_method = parse_method(CHECK); ++ if (had_error()) { ++ break; ++ } ++ new_ciInlineRecord(inl_method, bci, depth); ++ } ++ } ++ if (_imethod != NULL) { ++ return; // Replay Inlining ++ } + Klass* k = method->method_holder(); + ((InstanceKlass*)k)->initialize(THREAD); + if (HAS_PENDING_EXCEPTION) { +@@ -442,21 +558,25 @@ + Method* method = parse_method(CHECK); + if (had_error()) return; + ciMethodRecord* rec = new_ciMethod(method); +- rec->invocation_counter = parse_int("invocation_counter"); +- rec->backedge_counter = parse_int("backedge_counter"); +- rec->interpreter_invocation_count = parse_int("interpreter_invocation_count"); +- rec->interpreter_throwout_count = parse_int("interpreter_throwout_count"); +- rec->instructions_size = parse_int("instructions_size"); ++ rec->_invocation_counter = parse_int("invocation_counter"); ++ rec->_backedge_counter = parse_int("backedge_counter"); ++ rec->_interpreter_invocation_count = parse_int("interpreter_invocation_count"); ++ rec->_interpreter_throwout_count = parse_int("interpreter_throwout_count"); ++ rec->_instructions_size = parse_int("instructions_size"); + } + + // ciMethodData orig # # ... data # # ... oops + void process_ciMethodData(TRAPS) { + Method* method = parse_method(CHECK); + if (had_error()) return; +- /* jsut copied from Method, to build interpret data*/ ++ /* just copied from Method, to build interpret data*/ + if (InstanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) { + return; + } ++ // To be properly initialized, some profiling in the MDO needs the ++ // method to be rewritten (number of arguments at a call for ++ // instance) ++ method->method_holder()->link_class(CHECK); + // methodOopDesc::build_interpreter_method_data(method, CHECK); + { + // Grab a lock here to prevent multiple +@@ -471,32 +591,32 @@ + + // collect and record all the needed information for later + ciMethodDataRecord* rec = new_ciMethodData(method); +- rec->state = parse_int("state"); +- rec->current_mileage = parse_int("current_mileage"); ++ rec->_state = parse_int("state"); ++ rec->_current_mileage = parse_int("current_mileage"); + +- rec->orig_data = parse_data("orig", rec->orig_data_length); +- if (rec->orig_data == NULL) { ++ rec->_orig_data = parse_data("orig", rec->_orig_data_length); ++ if (rec->_orig_data == NULL) { + return; + } +- rec->data = parse_intptr_data("data", rec->data_length); +- if (rec->data == NULL) { ++ rec->_data = parse_intptr_data("data", rec->_data_length); ++ if (rec->_data == NULL) { + return; + } +- if (!parse_tag_and_count("oops", rec->oops_length)) { ++ if (!parse_tag_and_count("oops", rec->_oops_length)) { + return; + } +- rec->oops_handles = NEW_RESOURCE_ARRAY(jobject, rec->oops_length); +- rec->oops_offsets = NEW_RESOURCE_ARRAY(int, rec->oops_length); +- for (int i = 0; i < rec->oops_length; i++) { ++ rec->_oops_handles = NEW_RESOURCE_ARRAY(jobject, rec->_oops_length); ++ rec->_oops_offsets = NEW_RESOURCE_ARRAY(int, rec->_oops_length); ++ for (int i = 0; i < rec->_oops_length; i++) { + int offset = parse_int("offset"); + if (had_error()) { + return; + } + Klass* k = parse_klass(CHECK); +- rec->oops_offsets[i] = offset; ++ rec->_oops_offsets[i] = offset; + KlassHandle *kh = NEW_C_HEAP_OBJ(KlassHandle, mtCompiler); + ::new ((void*)kh) KlassHandle(THREAD, k); +- rec->oops_handles[i] = (jobject)kh; ++ rec->_oops_handles[i] = (jobject)kh; + } + } + +@@ -570,6 +690,9 @@ + case JVM_CONSTANT_Utf8: + case JVM_CONSTANT_Integer: + case JVM_CONSTANT_Float: ++ case JVM_CONSTANT_MethodHandle: ++ case JVM_CONSTANT_MethodType: ++ case JVM_CONSTANT_InvokeDynamic: + if (tag != cp->tag_at(i).value()) { + report_error("tag mismatch: wrong class files?"); + return; +@@ -729,10 +852,10 @@ + // Create and initialize a record for a ciMethod + ciMethodRecord* new_ciMethod(Method* method) { + ciMethodRecord* rec = NEW_RESOURCE_OBJ(ciMethodRecord); +- rec->klass = method->method_holder()->name()->as_utf8(); +- rec->method = method->name()->as_utf8(); +- rec->signature = method->signature()->as_utf8(); +- ci_method_records.append(rec); ++ rec->_klass_name = method->method_holder()->name()->as_utf8(); ++ rec->_method_name = method->name()->as_utf8(); ++ rec->_signature = method->signature()->as_utf8(); ++ _ci_method_records.append(rec); + return rec; + } + +@@ -741,11 +864,11 @@ + const char* klass_name = method->method_holder()->name()->as_utf8(); + const char* method_name = method->name()->as_utf8(); + const char* signature = method->signature()->as_utf8(); +- for (int i = 0; i < ci_method_records.length(); i++) { +- ciMethodRecord* rec = ci_method_records.at(i); +- if (strcmp(rec->klass, klass_name) == 0 && +- strcmp(rec->method, method_name) == 0 && +- strcmp(rec->signature, signature) == 0) { ++ for (int i = 0; i < _ci_method_records.length(); i++) { ++ ciMethodRecord* rec = _ci_method_records.at(i); ++ if (strcmp(rec->_klass_name, klass_name) == 0 && ++ strcmp(rec->_method_name, method_name) == 0 && ++ strcmp(rec->_signature, signature) == 0) { + return rec; + } + } +@@ -755,10 +878,10 @@ + // Create and initialize a record for a ciMethodData + ciMethodDataRecord* new_ciMethodData(Method* method) { + ciMethodDataRecord* rec = NEW_RESOURCE_OBJ(ciMethodDataRecord); +- rec->klass = method->method_holder()->name()->as_utf8(); +- rec->method = method->name()->as_utf8(); +- rec->signature = method->signature()->as_utf8(); +- ci_method_data_records.append(rec); ++ rec->_klass_name = method->method_holder()->name()->as_utf8(); ++ rec->_method_name = method->name()->as_utf8(); ++ rec->_signature = method->signature()->as_utf8(); ++ _ci_method_data_records.append(rec); + return rec; + } + +@@ -767,25 +890,65 @@ + const char* klass_name = method->method_holder()->name()->as_utf8(); + const char* method_name = method->name()->as_utf8(); + const char* signature = method->signature()->as_utf8(); +- for (int i = 0; i < ci_method_data_records.length(); i++) { +- ciMethodDataRecord* rec = ci_method_data_records.at(i); +- if (strcmp(rec->klass, klass_name) == 0 && +- strcmp(rec->method, method_name) == 0 && +- strcmp(rec->signature, signature) == 0) { ++ for (int i = 0; i < _ci_method_data_records.length(); i++) { ++ ciMethodDataRecord* rec = _ci_method_data_records.at(i); ++ if (strcmp(rec->_klass_name, klass_name) == 0 && ++ strcmp(rec->_method_name, method_name) == 0 && ++ strcmp(rec->_signature, signature) == 0) { + return rec; + } + } + return NULL; + } + ++ // Create and initialize a record for a ciInlineRecord ++ ciInlineRecord* new_ciInlineRecord(Method* method, int bci, int depth) { ++ ciInlineRecord* rec = NEW_RESOURCE_OBJ(ciInlineRecord); ++ rec->_klass_name = method->method_holder()->name()->as_utf8(); ++ rec->_method_name = method->name()->as_utf8(); ++ rec->_signature = method->signature()->as_utf8(); ++ rec->_inline_bci = bci; ++ rec->_inline_depth = depth; ++ _ci_inline_records->append(rec); ++ return rec; ++ } ++ ++ // Lookup inlining data for a ciMethod ++ ciInlineRecord* find_ciInlineRecord(Method* method, int bci, int depth) { ++ if (_ci_inline_records != NULL) { ++ return find_ciInlineRecord(_ci_inline_records, method, bci, depth); ++ } ++ return NULL; ++ } ++ ++ static ciInlineRecord* find_ciInlineRecord(GrowableArray* records, ++ Method* method, int bci, int depth) { ++ if (records != NULL) { ++ const char* klass_name = method->method_holder()->name()->as_utf8(); ++ const char* method_name = method->name()->as_utf8(); ++ const char* signature = method->signature()->as_utf8(); ++ for (int i = 0; i < records->length(); i++) { ++ ciInlineRecord* rec = records->at(i); ++ if ((rec->_inline_bci == bci) && ++ (rec->_inline_depth == depth) && ++ (strcmp(rec->_klass_name, klass_name) == 0) && ++ (strcmp(rec->_method_name, method_name) == 0) && ++ (strcmp(rec->_signature, signature) == 0)) { ++ return rec; ++ } ++ } ++ } ++ return NULL; ++ } ++ + const char* error_message() { + return _error_message; + } + + void reset() { + _error_message = NULL; +- ci_method_records.clear(); +- ci_method_data_records.clear(); ++ _ci_method_records.clear(); ++ _ci_method_data_records.clear(); + } + + // Take an ascii string contain \u#### escapes and convert it to utf8 +@@ -845,6 +1008,37 @@ + vm_exit(exit_code); + } + ++void* ciReplay::load_inline_data(ciMethod* method, int entry_bci, int comp_level) { ++ if (FLAG_IS_DEFAULT(InlineDataFile)) { ++ tty->print_cr("ERROR: no inline replay data file specified (use -XX:InlineDataFile=inline_pid12345.txt)."); ++ return NULL; ++ } ++ ++ VM_ENTRY_MARK; ++ // Load and parse the replay data ++ CompileReplay rp(InlineDataFile, THREAD); ++ if (!rp.can_replay()) { ++ tty->print_cr("ciReplay: !rp.can_replay()"); ++ return NULL; ++ } ++ void* data = rp.process_inline(method, method->get_Method(), entry_bci, comp_level, THREAD); ++ if (HAS_PENDING_EXCEPTION) { ++ oop throwable = PENDING_EXCEPTION; ++ CLEAR_PENDING_EXCEPTION; ++ java_lang_Throwable::print(throwable, tty); ++ tty->cr(); ++ java_lang_Throwable::print_stack_trace(throwable, tty); ++ tty->cr(); ++ return NULL; ++ } ++ ++ if (rp.had_error()) { ++ tty->print_cr("ciReplay: Failed on %s", rp.error_message()); ++ return NULL; ++ } ++ return data; ++} ++ + int ciReplay::replay_impl(TRAPS) { + HandleMark hm; + ResourceMark rm; +@@ -890,7 +1084,6 @@ + return exit_code; + } + +- + void ciReplay::initialize(ciMethodData* m) { + if (replay_state == NULL) { + return; +@@ -909,28 +1102,28 @@ + method->print_name(tty); + tty->cr(); + } else { +- m->_state = rec->state; +- m->_current_mileage = rec->current_mileage; +- if (rec->data_length != 0) { +- assert(m->_data_size == rec->data_length * (int)sizeof(rec->data[0]), "must agree"); ++ m->_state = rec->_state; ++ m->_current_mileage = rec->_current_mileage; ++ if (rec->_data_length != 0) { ++ assert(m->_data_size == rec->_data_length * (int)sizeof(rec->_data[0]), "must agree"); + + // Write the correct ciObjects back into the profile data + ciEnv* env = ciEnv::current(); +- for (int i = 0; i < rec->oops_length; i++) { +- KlassHandle *h = (KlassHandle *)rec->oops_handles[i]; +- *(ciMetadata**)(rec->data + rec->oops_offsets[i]) = ++ for (int i = 0; i < rec->_oops_length; i++) { ++ KlassHandle *h = (KlassHandle *)rec->_oops_handles[i]; ++ *(ciMetadata**)(rec->_data + rec->_oops_offsets[i]) = + env->get_metadata((*h)()); + } + // Copy the updated profile data into place as intptr_ts + #ifdef _LP64 +- Copy::conjoint_jlongs_atomic((jlong *)rec->data, (jlong *)m->_data, rec->data_length); ++ Copy::conjoint_jlongs_atomic((jlong *)rec->_data, (jlong *)m->_data, rec->_data_length); + #else +- Copy::conjoint_jints_atomic((jint *)rec->data, (jint *)m->_data, rec->data_length); ++ Copy::conjoint_jints_atomic((jint *)rec->_data, (jint *)m->_data, rec->_data_length); + #endif + } + + // copy in the original header +- Copy::conjoint_jbytes(rec->orig_data, (char*)&m->_orig, rec->orig_data_length); ++ Copy::conjoint_jbytes(rec->_orig_data, (char*)&m->_orig, rec->_orig_data_length); + } + } + +@@ -939,12 +1132,38 @@ + if (replay_state == NULL) { + return false; + } +- + VM_ENTRY_MARK; + // ciMethod without a record shouldn't be inlined. + return replay_state->find_ciMethodRecord(method->get_Method()) == NULL; + } + ++bool ciReplay::should_inline(void* data, ciMethod* method, int bci, int inline_depth) { ++ if (data != NULL) { ++ GrowableArray* records = (GrowableArray*)data; ++ VM_ENTRY_MARK; ++ // Inline record are ordered by bci and depth. ++ return CompileReplay::find_ciInlineRecord(records, method->get_Method(), bci, inline_depth) != NULL; ++ } else if (replay_state != NULL) { ++ VM_ENTRY_MARK; ++ // Inline record are ordered by bci and depth. ++ return replay_state->find_ciInlineRecord(method->get_Method(), bci, inline_depth) != NULL; ++ } ++ return false; ++} ++ ++bool ciReplay::should_not_inline(void* data, ciMethod* method, int bci, int inline_depth) { ++ if (data != NULL) { ++ GrowableArray* records = (GrowableArray*)data; ++ VM_ENTRY_MARK; ++ // Inline record are ordered by bci and depth. ++ return CompileReplay::find_ciInlineRecord(records, method->get_Method(), bci, inline_depth) == NULL; ++ } else if (replay_state != NULL) { ++ VM_ENTRY_MARK; ++ // Inline record are ordered by bci and depth. ++ return replay_state->find_ciInlineRecord(method->get_Method(), bci, inline_depth) == NULL; ++ } ++ return false; ++} + + void ciReplay::initialize(ciMethod* m) { + if (replay_state == NULL) { +@@ -965,14 +1184,14 @@ + tty->cr(); + } else { + EXCEPTION_CONTEXT; +- // m->_instructions_size = rec->instructions_size; ++ // m->_instructions_size = rec->_instructions_size; + m->_instructions_size = -1; +- m->_interpreter_invocation_count = rec->interpreter_invocation_count; +- m->_interpreter_throwout_count = rec->interpreter_throwout_count; ++ m->_interpreter_invocation_count = rec->_interpreter_invocation_count; ++ m->_interpreter_throwout_count = rec->_interpreter_throwout_count; + MethodCounters* mcs = method->get_method_counters(CHECK_AND_CLEAR); + guarantee(mcs != NULL, "method counters allocation failed"); +- mcs->invocation_counter()->_counter = rec->invocation_counter; +- mcs->backedge_counter()->_counter = rec->backedge_counter; ++ mcs->invocation_counter()->_counter = rec->_invocation_counter; ++ mcs->backedge_counter()->_counter = rec->_backedge_counter; + } + } + +--- ./hotspot/src/share/vm/ci/ciReplay.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciReplay.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -29,6 +29,73 @@ + + // ciReplay + ++// ++// Replay compilation of a java method by using an information in replay file. ++// Replay inlining decisions during compilation by using an information in inline file. ++// ++// NOTE: these replay functions only exist in debug version of VM. ++// ++// Replay compilation. ++// ------------------- ++// ++// Replay data file replay.txt can be created by Serviceability Agent ++// from a core file, see agent/doc/cireplay.html ++// ++// $ java -cp /lib/sa-jdi.jar sun.jvm.hotspot.CLHSDB ++// hsdb> attach /bin/java ./core ++// hsdb> threads ++// t@10 Service Thread ++// t@9 C2 CompilerThread0 ++// t@8 Signal Dispatcher ++// t@7 Finalizer ++// t@6 Reference Handler ++// t@2 main ++// hsdb> dumpreplaydata t@9 > replay.txt ++// hsdb> quit ++// ++// (Note: SA could be also used to extract app.jar and boot.jar files ++// from core file to replay compilation if only core file is available) ++// ++// Replay data file replay_pid%p.log is also created when VM crashes ++// in Compiler thread during compilation. It is controlled by ++// DumpReplayDataOnError flag which is ON by default. ++// ++// Replay file replay_pid%p_compid%d.log can be created ++// for the specified java method during normal execution using ++// CompileCommand option DumpReplay: ++// ++// -XX:CompileCommand=option,Benchmark::test,DumpReplay ++// ++// In this case the file name has additional compilation id "_compid%d" ++// because the method could be compiled several times. ++// ++// To replay compilation the replay file should be specified: ++// ++// -XX:+ReplayCompiles -XX:ReplayDataFile=replay_pid2133.log ++// ++// VM thread reads data from the file immediately after VM initialization ++// and puts the compilation task on compile queue. After that it goes into ++// wait state (BackgroundCompilation flag is set to false) since there is no ++// a program to execute. VM exits when the compilation is finished. ++// ++// ++// Replay inlining. ++// ---------------- ++// ++// Replay inlining file inline_pid%p_compid%d.log is created for ++// a specific java method during normal execution of a java program ++// using CompileCommand option DumpInline: ++// ++// -XX:CompileCommand=option,Benchmark::test,DumpInline ++// ++// To replay inlining the replay file and the method should be specified: ++// ++// -XX:CompileCommand=option,Benchmark::test,ReplayInline -XX:InlineDataFile=inline_pid3244_compid6.log ++// ++// The difference from replay compilation is that replay inlining ++// is performed during normal java program execution. ++// ++ + class ciReplay { + CI_PACKAGE_ACCESS + +@@ -37,7 +104,11 @@ + static int replay_impl(TRAPS); + + public: ++ // Replay specified compilation and exit VM. + static void replay(TRAPS); ++ // Load inlining decisions from file and use them ++ // during compilation of specified method. ++ static void* load_inline_data(ciMethod* method, int entry_bci, int comp_level); + + // These are used by the CI to fill in the cached data from the + // replay file when replaying compiles. +@@ -48,6 +119,8 @@ + static bool is_loaded(Klass* klass); + + static bool should_not_inline(ciMethod* method); ++ static bool should_inline(void* data, ciMethod* method, int bci, int inline_depth); ++ static bool should_not_inline(void* data, ciMethod* method, int bci, int inline_depth); + + #endif + }; +--- ./hotspot/src/share/vm/ci/ciSignature.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciSignature.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -148,5 +148,5 @@ + print_signature(); + tty->print(" accessing_klass="); + _accessing_klass->print(); +- tty->print(" address=0x%x>", (address)this); ++ tty->print(" address=" INTPTR_FORMAT ">", p2i((address)this)); + } +--- ./hotspot/src/share/vm/ci/ciType.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/ci/ciType.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -87,7 +87,7 @@ + // Print the name of this type + void ciType::print_name_on(outputStream* st) { + ResourceMark rm; +- st->print(name()); ++ st->print("%s", name()); + } + + +--- ./hotspot/src/share/vm/classfile/altHashing.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/altHashing.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -39,18 +39,18 @@ + } + + // Seed value used for each alternative hash calculated. +-jint AltHashing::compute_seed() { ++juint AltHashing::compute_seed() { + jlong nanos = os::javaTimeNanos(); + jlong now = os::javaTimeMillis(); +- jint SEED_MATERIAL[8] = { +- (jint) object_hash(SystemDictionary::String_klass()), +- (jint) object_hash(SystemDictionary::System_klass()), +- (jint) os::random(), // current thread isn't a java thread +- (jint) (((julong)nanos) >> 32), +- (jint) nanos, +- (jint) (((julong)now) >> 32), +- (jint) now, +- (jint) (os::javaTimeNanos() >> 2) ++ int SEED_MATERIAL[8] = { ++ (int) object_hash(SystemDictionary::String_klass()), ++ (int) object_hash(SystemDictionary::System_klass()), ++ (int) os::random(), // current thread isn't a java thread ++ (int) (((julong)nanos) >> 32), ++ (int) nanos, ++ (int) (((julong)now) >> 32), ++ (int) now, ++ (int) (os::javaTimeNanos() >> 2) + }; + + return murmur3_32(SEED_MATERIAL, 8); +@@ -58,14 +58,14 @@ + + + // Murmur3 hashing for Symbol +-jint AltHashing::murmur3_32(jint seed, const jbyte* data, int len) { +- jint h1 = seed; ++juint AltHashing::murmur3_32(juint seed, const jbyte* data, int len) { ++ juint h1 = seed; + int count = len; + int offset = 0; + + // body + while (count >= 4) { +- jint k1 = (data[offset] & 0x0FF) ++ juint k1 = (data[offset] & 0x0FF) + | (data[offset + 1] & 0x0FF) << 8 + | (data[offset + 2] & 0x0FF) << 16 + | data[offset + 3] << 24; +@@ -85,7 +85,7 @@ + // tail + + if (count > 0) { +- jint k1 = 0; ++ juint k1 = 0; + + switch (count) { + case 3: +@@ -109,18 +109,18 @@ + h1 ^= len; + + // finalization mix force all bits of a hash block to avalanche +- h1 ^= ((unsigned int)h1) >> 16; ++ h1 ^= h1 >> 16; + h1 *= 0x85ebca6b; +- h1 ^= ((unsigned int)h1) >> 13; ++ h1 ^= h1 >> 13; + h1 *= 0xc2b2ae35; +- h1 ^= ((unsigned int)h1) >> 16; ++ h1 ^= h1 >> 16; + + return h1; + } + + // Murmur3 hashing for Strings +-jint AltHashing::murmur3_32(jint seed, const jchar* data, int len) { +- jint h1 = seed; ++juint AltHashing::murmur3_32(juint seed, const jchar* data, int len) { ++ juint h1 = seed; + + int off = 0; + int count = len; +@@ -129,7 +129,7 @@ + while (count >= 2) { + jchar d1 = data[off++] & 0xFFFF; + jchar d2 = data[off++]; +- jint k1 = (d1 | d2 << 16); ++ juint k1 = (d1 | d2 << 16); + + count -= 2; + +@@ -145,7 +145,7 @@ + // tail + + if (count > 0) { +- int k1 = data[off]; ++ juint k1 = (juint)data[off]; + + k1 *= 0xcc9e2d51; + k1 = Integer_rotateLeft(k1, 15); +@@ -157,25 +157,25 @@ + h1 ^= len * 2; // (Character.SIZE / Byte.SIZE); + + // finalization mix force all bits of a hash block to avalanche +- h1 ^= ((unsigned int)h1) >> 16; ++ h1 ^= h1 >> 16; + h1 *= 0x85ebca6b; +- h1 ^= ((unsigned int)h1) >> 13; ++ h1 ^= h1 >> 13; + h1 *= 0xc2b2ae35; +- h1 ^= ((unsigned int)h1) >> 16; ++ h1 ^= h1 >> 16; + + return h1; + } + + // Hash used for the seed. +-jint AltHashing::murmur3_32(jint seed, const int* data, int len) { +- jint h1 = seed; ++juint AltHashing::murmur3_32(juint seed, const int* data, int len) { ++ juint h1 = seed; + + int off = 0; + int end = len; + + // body + while (off < end) { +- jint k1 = data[off++]; ++ juint k1 = (juint)data[off++]; + + k1 *= 0xcc9e2d51; + k1 = Integer_rotateLeft(k1, 15); +@@ -193,26 +193,26 @@ + h1 ^= len * 4; // (Integer.SIZE / Byte.SIZE); + + // finalization mix force all bits of a hash block to avalanche +- h1 ^= ((juint)h1) >> 16; ++ h1 ^= h1 >> 16; + h1 *= 0x85ebca6b; +- h1 ^= ((juint)h1) >> 13; ++ h1 ^= h1 >> 13; + h1 *= 0xc2b2ae35; +- h1 ^= ((juint)h1) >> 16; ++ h1 ^= h1 >> 16; + + return h1; + } + +-jint AltHashing::murmur3_32(const int* data, int len) { ++juint AltHashing::murmur3_32(const int* data, int len) { + return murmur3_32(0, data, len); + } + + #ifndef PRODUCT + // Overloaded versions for internal test. +-jint AltHashing::murmur3_32(const jbyte* data, int len) { ++juint AltHashing::murmur3_32(const jbyte* data, int len) { + return murmur3_32(0, data, len); + } + +-jint AltHashing::murmur3_32(const jchar* data, int len) { ++juint AltHashing::murmur3_32(const jchar* data, int len) { + return murmur3_32(0, data, len); + } + +@@ -251,11 +251,11 @@ + + // Hash subranges {}, {0}, {0,1}, {0,1,2}, ..., {0,...,255} + for (int i = 0; i < 256; i++) { +- jint hash = murmur3_32(256 - i, vector, i); ++ juint hash = murmur3_32(256 - i, vector, i); + hashes[i * 4] = (jbyte) hash; +- hashes[i * 4 + 1] = (jbyte) (((juint)hash) >> 8); +- hashes[i * 4 + 2] = (jbyte) (((juint)hash) >> 16); +- hashes[i * 4 + 3] = (jbyte) (((juint)hash) >> 24); ++ hashes[i * 4 + 1] = (jbyte)(hash >> 8); ++ hashes[i * 4 + 2] = (jbyte)(hash >> 16); ++ hashes[i * 4 + 3] = (jbyte)(hash >> 24); + } + + // hash to get const result. +@@ -269,7 +269,7 @@ + } + + void AltHashing::testEquivalentHashes() { +- jint jbytes, jchars, ints; ++ juint jbytes, jchars, ints; + + // printf("testEquivalentHashes\n"); + +--- ./hotspot/src/share/vm/classfile/altHashing.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/altHashing.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, 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 +@@ -39,24 +39,24 @@ + class AltHashing : AllStatic { + + // utility function copied from java/lang/Integer +- static jint Integer_rotateLeft(jint i, int distance) { +- return (i << distance) | (((juint)i) >> (32-distance)); ++ static juint Integer_rotateLeft(juint i, int distance) { ++ return (i << distance) | (i >> (32-distance)); + } +- static jint murmur3_32(const int* data, int len); +- static jint murmur3_32(jint seed, const int* data, int len); ++ static juint murmur3_32(const int* data, int len); ++ static juint murmur3_32(juint seed, const int* data, int len); + + #ifndef PRODUCT + // Hashing functions used for internal testing +- static jint murmur3_32(const jbyte* data, int len); +- static jint murmur3_32(const jchar* data, int len); ++ static juint murmur3_32(const jbyte* data, int len); ++ static juint murmur3_32(const jchar* data, int len); + static void testMurmur3_32_ByteArray(); + static void testEquivalentHashes(); + #endif // PRODUCT + + public: +- static jint compute_seed(); +- static jint murmur3_32(jint seed, const jbyte* data, int len); +- static jint murmur3_32(jint seed, const jchar* data, int len); ++ static juint compute_seed(); ++ static juint murmur3_32(juint seed, const jbyte* data, int len); ++ static juint murmur3_32(juint seed, const jchar* data, int len); + NOT_PRODUCT(static void test_alt_hash();) + }; + #endif // SHARE_VM_CLASSFILE_ALTHASHING_HPP +--- ./hotspot/src/share/vm/classfile/classFileError.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classFileError.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2011, 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 +@@ -29,6 +29,9 @@ + + // Keep these in a separate file to prevent inlining + ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED ++ + void ClassFileParser::classfile_parse_error(const char* msg, TRAPS) { + ResourceMark rm(THREAD); + Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::java_lang_ClassFormatError(), +@@ -53,6 +56,8 @@ + msg, index, name, _class_name->as_C_string()); + } + ++PRAGMA_DIAG_POP ++ + void StackMapStream::stackmap_format_error(const char* msg, TRAPS) { + ResourceMark rm(THREAD); + Exceptions::fthrow( +--- ./hotspot/src/share/vm/classfile/classFileParser.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classFileParser.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -2793,6 +2793,11 @@ + "Short length on BootstrapMethods in class file %s", + CHECK); + ++ guarantee_property(attribute_byte_length >= sizeof(u2), ++ "Invalid BootstrapMethods attribute length %u in class file %s", ++ attribute_byte_length, ++ CHECK); ++ + // The attribute contains a counted array of counted tuples of shorts, + // represending bootstrap specifiers: + // length*{bootstrap_method_index, argument_count*{argument_index}} +@@ -3762,18 +3767,24 @@ + Exceptions::fthrow( + THREAD_AND_LOCATION, + vmSymbols::java_lang_UnsupportedClassVersionError(), +- "Unsupported major.minor version %u.%u", ++ "Unsupported class file version %u.%u, " ++ "this version of the Java Runtime only recognizes class file versions up to %u.%u", + major_version, +- minor_version); ++ minor_version, ++ JAVA_MAX_SUPPORTED_VERSION, ++ JAVA_MAX_SUPPORTED_MINOR_VERSION); + } else { + ResourceMark rm(THREAD); + Exceptions::fthrow( + THREAD_AND_LOCATION, + vmSymbols::java_lang_UnsupportedClassVersionError(), +- "%s : Unsupported major.minor version %u.%u", ++ "%s has been compiled by a more recent version of the Java Runtime (class file version %u.%u), " ++ "this version of the Java Runtime only recognizes class file versions up to %u.%u", + name->as_C_string(), + major_version, +- minor_version); ++ minor_version, ++ JAVA_MAX_SUPPORTED_VERSION, ++ JAVA_MAX_SUPPORTED_MINOR_VERSION); + } + return nullHandle; + } +@@ -4027,6 +4038,11 @@ + this_klass->set_major_version(major_version); + this_klass->set_has_default_methods(has_default_methods); + ++ if (!host_klass.is_null()) { ++ assert (this_klass->is_anonymous(), "should be the same"); ++ this_klass->set_host_klass(host_klass()); ++ } ++ + // Set up Method*::intrinsic_id as soon as we know the names of methods. + // (We used to do this lazily, but now we query it in Rewriter, + // which is eagerly done for every method, so we might as well do it now, +@@ -4186,8 +4202,12 @@ + + clear_class_metadata(); + +- // deallocate the klass if already created. +- MetadataFactory::free_metadata(_loader_data, _klass); ++ // deallocate the klass if already created. Don't directly deallocate, but add ++ // to the deallocate list so that the klass is removed from the CLD::_klasses list ++ // at a safepoint. ++ if (_klass != NULL) { ++ _loader_data->add_to_deallocate_list(_klass); ++ } + _klass = NULL; + } + +@@ -4516,8 +4536,8 @@ + break; // didn't find any match; get out + } + +- if (super_m->is_final() && +- // matching method in super is final ++ if (super_m->is_final() && !super_m->is_static() && ++ // matching method in super is final, and not static + (Reflection::verify_field_access(this_klass(), + super_m->method_holder(), + super_m->method_holder(), +--- ./hotspot/src/share/vm/classfile/classFileParser.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classFileParser.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -313,7 +313,9 @@ + if (!b) { classfile_parse_error(msg, CHECK); } + } + +- inline void assert_property(bool b, const char* msg, TRAPS) { ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED ++inline void assert_property(bool b, const char* msg, TRAPS) { + #ifdef ASSERT + if (!b) { + ResourceMark rm(THREAD); +@@ -330,6 +332,7 @@ + } + #endif + } ++PRAGMA_DIAG_POP + + inline void check_property(bool property, const char* msg, int index, TRAPS) { + if (_need_verify) { +--- ./hotspot/src/share/vm/classfile/classLoader.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classLoader.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -68,6 +68,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +@@ -340,7 +343,7 @@ + tty->print("[Meta index for %s=", entry->name()); + for (int i = 0; i < meta_packages.length(); i++) { + if (i > 0) tty->print(" "); +- tty->print(meta_packages.at(i)); ++ tty->print("%s", meta_packages.at(i)); + } + tty->print_cr("]"); + } +@@ -1296,7 +1299,7 @@ + e = e->next(); + } + jlong end = os::javaTimeMillis(); +- tty->print_cr("CompileTheWorld : Done (%d classes, %d methods, %d ms)", ++ tty->print_cr("CompileTheWorld : Done (%d classes, %d methods, " JLONG_FORMAT " ms)", + _compile_the_world_class_counter, _compile_the_world_method_counter, (end - start)); + { + // Print statistics as if before normal exit: +--- ./hotspot/src/share/vm/classfile/classLoaderData.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classLoaderData.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -269,10 +269,10 @@ + ResourceMark rm; + tty->print_cr("[TraceClassLoaderData] Adding k: " PTR_FORMAT " %s to CLD: " + PTR_FORMAT " loader: " PTR_FORMAT " %s", +- k, ++ p2i(k), + k->external_name(), +- k->class_loader_data(), +- (void *)k->class_loader(), ++ p2i(k->class_loader_data()), ++ p2i((void *)k->class_loader()), + loader_name()); + } + } +@@ -307,11 +307,11 @@ + + if (TraceClassLoaderData) { + ResourceMark rm; +- tty->print("[ClassLoaderData: unload loader data "PTR_FORMAT, this); +- tty->print(" for instance "PTR_FORMAT" of %s", (void *)class_loader(), ++ tty->print("[ClassLoaderData: unload loader data " INTPTR_FORMAT, p2i(this)); ++ tty->print(" for instance " INTPTR_FORMAT " of %s", p2i((void *)class_loader()), + loader_name()); + if (is_anonymous()) { +- tty->print(" for anonymous class "PTR_FORMAT " ", _klasses); ++ tty->print(" for anonymous class " INTPTR_FORMAT " ", p2i(_klasses)); + } + tty->print_cr("]"); + } +@@ -469,14 +469,14 @@ + void ClassLoaderData::dump(outputStream * const out) { + ResourceMark rm; + out->print("ClassLoaderData CLD: "PTR_FORMAT", loader: "PTR_FORMAT", loader_klass: "PTR_FORMAT" %s {", +- this, (void *)class_loader(), +- class_loader() != NULL ? class_loader()->klass() : NULL, loader_name()); ++ p2i(this), p2i((void *)class_loader()), ++ p2i(class_loader() != NULL ? class_loader()->klass() : NULL), loader_name()); + if (claimed()) out->print(" claimed "); + if (is_unloading()) out->print(" unloading "); +- out->print(" handles " INTPTR_FORMAT, handles()); ++ out->print(" handles " INTPTR_FORMAT, p2i(handles())); + out->cr(); + if (metaspace_or_null() != NULL) { +- out->print_cr("metaspace: " PTR_FORMAT, metaspace_or_null()); ++ out->print_cr("metaspace: " INTPTR_FORMAT, p2i(metaspace_or_null())); + metaspace_or_null()->dump(out); + } else { + out->print_cr("metaspace: NULL"); +@@ -520,12 +520,22 @@ + } + } + ++bool ClassLoaderData::contains_klass(Klass* klass) { ++ for (Klass* k = _klasses; k != NULL; k = k->next_link()) { ++ if (k == klass) return true; ++ } ++ return false; ++} ++ + + // GC root of class loader data created. + ClassLoaderData* ClassLoaderDataGraph::_head = NULL; + ClassLoaderData* ClassLoaderDataGraph::_unloading = NULL; ++ClassLoaderData* ClassLoaderDataGraph::_saved_unloading = NULL; + ClassLoaderData* ClassLoaderDataGraph::_saved_head = NULL; + ++bool ClassLoaderDataGraph::_should_purge = false; ++ + // Add a new class loader data node to the list. Assign the newly created + // ClassLoaderData into the java/lang/ClassLoader object as a hidden field + ClassLoaderData* ClassLoaderDataGraph::add(Handle loader, bool is_anonymous, TRAPS) { +@@ -563,8 +573,8 @@ + if (TraceClassLoaderData) { + ResourceMark rm; + tty->print("[ClassLoaderData: "); +- tty->print("create class loader data "PTR_FORMAT, cld); +- tty->print(" for instance "PTR_FORMAT" of %s", (void *)cld->class_loader(), ++ tty->print("create class loader data " INTPTR_FORMAT, p2i(cld)); ++ tty->print(" for instance " INTPTR_FORMAT " of %s", p2i((void *)cld->class_loader()), + cld->loader_name()); + tty->print_cr("]"); + } +@@ -619,7 +629,9 @@ + + void ClassLoaderDataGraph::classes_unloading_do(void f(Klass* const)) { + assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); +- for (ClassLoaderData* cld = _unloading; cld != NULL; cld = cld->next()) { ++ // Only walk the head until any clds not purged from prior unloading ++ // (CMS doesn't purge right away). ++ for (ClassLoaderData* cld = _unloading; cld != _saved_unloading; cld = cld->next()) { + cld->classes_do(f); + } + } +@@ -649,37 +661,6 @@ + } + + #ifndef PRODUCT +-// for debugging and hsfind(x) +-bool ClassLoaderDataGraph::contains(address x) { +- // I think we need the _metaspace_lock taken here because the class loader +- // data graph could be changing while we are walking it (new entries added, +- // new entries being unloaded, etc). +- if (DumpSharedSpaces) { +- // There are only two metaspaces to worry about. +- ClassLoaderData* ncld = ClassLoaderData::the_null_class_loader_data(); +- return (ncld->ro_metaspace()->contains(x) || ncld->rw_metaspace()->contains(x)); +- } +- +- if (UseSharedSpaces && MetaspaceShared::is_in_shared_space(x)) { +- return true; +- } +- +- for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) { +- if (cld->metaspace_or_null() != NULL && cld->metaspace_or_null()->contains(x)) { +- return true; +- } +- } +- +- // Could also be on an unloading list which is okay, ie. still allocated +- // for a little while. +- for (ClassLoaderData* ucld = _unloading; ucld != NULL; ucld = ucld->next()) { +- if (ucld->metaspace_or_null() != NULL && ucld->metaspace_or_null()->contains(x)) { +- return true; +- } +- } +- return false; +-} +- + bool ClassLoaderDataGraph::contains_loader_data(ClassLoaderData* loader_data) { + for (ClassLoaderData* data = _head; data != NULL; data = data->next()) { + if (loader_data == data) { +@@ -698,6 +679,11 @@ + ClassLoaderData* data = _head; + ClassLoaderData* prev = NULL; + bool seen_dead_loader = false; ++ ++ // Save previous _unloading pointer for CMS which may add to unloading list before ++ // purging and we don't want to rewalk the previously unloaded class loader data. ++ _saved_unloading = _unloading; ++ + // mark metadata seen on the stack and code cache so we can delete + // unneeded entries. + bool has_redefined_a_class = JvmtiExport::has_redefined_a_class(); +@@ -737,6 +723,7 @@ + } + + void ClassLoaderDataGraph::purge() { ++ assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!"); + ClassLoaderData* list = _unloading; + _unloading = NULL; + ClassLoaderData* next = list; +@@ -825,7 +812,7 @@ + if (class_loader() == NULL) { + out->print("NULL class_loader"); + } else { +- out->print("class loader "PTR_FORMAT, this); ++ out->print("class loader " INTPTR_FORMAT, p2i(this)); + class_loader()->print_value_on(out); + } + } +--- ./hotspot/src/share/vm/classfile/classLoaderData.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classLoaderData.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -66,6 +66,8 @@ + static ClassLoaderData* _unloading; + // CMS support. + static ClassLoaderData* _saved_head; ++ static ClassLoaderData* _saved_unloading; ++ static bool _should_purge; + + static ClassLoaderData* add(Handle class_loader, bool anonymous, TRAPS); + static void post_class_unload_events(void); +@@ -86,13 +88,21 @@ + static void remember_new_clds(bool remember) { _saved_head = (remember ? _head : NULL); } + static GrowableArray* new_clds(); + ++ static void set_should_purge(bool b) { _should_purge = b; } ++ static void purge_if_needed() { ++ // Only purge the CLDG for CMS if concurrent sweep is complete. ++ if (_should_purge) { ++ purge(); ++ // reset for next time. ++ set_should_purge(false); ++ } ++ } ++ + static void dump_on(outputStream * const out) PRODUCT_RETURN; + static void dump() { dump_on(tty); } + static void verify(); + + #ifndef PRODUCT +- // expensive test for pointer in metaspace for debugging +- static bool contains(address x); + static bool contains_loader_data(ClassLoaderData* loader_data); + #endif + +@@ -260,6 +270,7 @@ + jobject add_handle(Handle h); + void add_class(Klass* k); + void remove_class(Klass* k); ++ bool contains_klass(Klass* k); + void record_dependency(Klass* to, TRAPS); + void init_dependencies(TRAPS); + +--- ./hotspot/src/share/vm/classfile/defaultMethods.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/defaultMethods.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -390,20 +390,6 @@ + Symbol* get_exception_message() { return _exception_message; } + Symbol* get_exception_name() { return _exception_name; } + +- // Return true if the specified klass has a static method that matches +- // the name and signature of the target method. +- bool has_matching_static(InstanceKlass* root) { +- if (_members.length() > 0) { +- Pair entry = _members.at(0); +- Method* impl = root->find_method(entry.first->name(), +- entry.first->signature()); +- if ((impl != NULL) && impl->is_static()) { +- return true; +- } +- } +- return false; +- } +- + // Either sets the target or the exception error message + void determine_target(InstanceKlass* root, TRAPS) { + if (has_target() || throws_exception()) { +@@ -433,26 +419,24 @@ + // If the root klass has a static method with matching name and signature + // then do not generate an overpass method because it will hide the + // static method during resolution. +- if (!has_matching_static(root)) { +- if (qualified_methods.length() == 0) { +- _exception_message = generate_no_defaults_message(CHECK); +- } else { +- assert(root != NULL, "Null root class"); +- _exception_message = generate_method_message(root->name(), qualified_methods.at(0), CHECK); +- } +- _exception_name = vmSymbols::java_lang_AbstractMethodError(); ++ if (qualified_methods.length() == 0) { ++ _exception_message = generate_no_defaults_message(CHECK); ++ } else { ++ assert(root != NULL, "Null root class"); ++ _exception_message = generate_method_message(root->name(), qualified_methods.at(0), CHECK); + } ++ _exception_name = vmSymbols::java_lang_AbstractMethodError(); + + // If only one qualified method is default, select that + } else if (num_defaults == 1) { + _selected_target = qualified_methods.at(default_index); + +- } else if (num_defaults > 1 && !has_matching_static(root)) { ++ } else if (num_defaults > 1) { + _exception_message = generate_conflicts_message(&qualified_methods,CHECK); + _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError(); + if (TraceDefaultMethods) { + _exception_message->print_value_on(tty); +- tty->print_cr(""); ++ tty->cr(); + } + } + } +@@ -479,7 +463,7 @@ + if (_members.at(i).second == DISQUALIFIED) { + str->print(" (disqualified)"); + } +- str->print_cr(""); ++ str->cr(); + } + + if (_selected_target != NULL) { +@@ -496,7 +480,7 @@ + if (!method_holder->is_interface()) { + tty->print(" : in superclass"); + } +- str->print_cr(""); ++ str->cr(); + } + + void print_exception(outputStream* str, int indent) { +@@ -704,7 +688,7 @@ + for (int i = 0; i < slots->length(); ++i) { + tty->indent(); + slots->at(i)->print_on(tty); +- tty->print_cr(""); ++ tty->cr(); + } + } + #endif // ndef PRODUCT +@@ -844,7 +828,7 @@ + streamIndentor si(tty, 2); + tty->indent().print("Looking for default methods for slot "); + slot->print_on(tty); +- tty->print_cr(""); ++ tty->cr(); + } + #endif // ndef PRODUCT + +@@ -962,7 +946,7 @@ + if (TraceDefaultMethods) { + tty->print("for slot: "); + slot->print_on(tty); +- tty->print_cr(""); ++ tty->cr(); + if (method->has_target()) { + method->print_selected(tty, 1); + } else if (method->throws_exception()) { +--- ./hotspot/src/share/vm/classfile/dictionary.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/dictionary.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,6 +30,7 @@ + #include "prims/jvmtiRedefineClassesTrace.hpp" + #include "utilities/hashtable.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + DictionaryEntry* Dictionary::_current_class_entry = NULL; + int Dictionary::_current_class_index = 0; +@@ -707,7 +708,7 @@ + loader_data->class_loader() == NULL || + loader_data->class_loader()->is_instance(), + "checking type of class_loader"); +- e->verify(/*check_dictionary*/false); ++ e->verify(); + probe->verify_protection_domain_set(); + element_count++; + } +--- ./hotspot/src/share/vm/classfile/dictionary.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/dictionary.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -379,7 +379,7 @@ + } + if (method_type() != NULL) { + if (printed) st->print(" and "); +- st->print(INTPTR_FORMAT, (void *)method_type()); ++ st->print(INTPTR_FORMAT, p2i((void *)method_type())); + printed = true; + } + st->print_cr(printed ? "" : "(empty)"); +--- ./hotspot/src/share/vm/classfile/javaClasses.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -51,6 +51,8 @@ + #include "runtime/vframe.hpp" + #include "utilities/preserveException.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java) \ + klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum); + +@@ -482,8 +484,8 @@ + } + } + +-static void initialize_static_field(fieldDescriptor* fd, TRAPS) { +- Handle mirror (THREAD, fd->field_holder()->java_mirror()); ++ ++static void initialize_static_field(fieldDescriptor* fd, Handle mirror, TRAPS) { + assert(mirror.not_null() && fd->is_static(), "just checking"); + if (fd->has_initial_value()) { + BasicType t = fd->field_type(); +@@ -550,21 +552,45 @@ + create_mirror(k, Handle(NULL), CHECK); + } + +-oop java_lang_Class::create_mirror(KlassHandle k, Handle protection_domain, TRAPS) { ++void java_lang_Class::initialize_mirror_fields(KlassHandle k, ++ Handle mirror, ++ Handle protection_domain, ++ TRAPS) { ++ // Allocate a simple java object for a lock. ++ // This needs to be a java object because during class initialization ++ // it can be held across a java call. ++ typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK); ++ set_init_lock(mirror(), r); ++ ++ // Set protection domain also ++ set_protection_domain(mirror(), protection_domain()); ++ ++ // Initialize static fields ++ InstanceKlass::cast(k())->do_local_static_fields(&initialize_static_field, mirror, CHECK); ++} ++ ++void java_lang_Class::create_mirror(KlassHandle k, Handle protection_domain, TRAPS) { + assert(k->java_mirror() == NULL, "should only assign mirror once"); + // Use this moment of initialization to cache modifier_flags also, + // to support Class.getModifiers(). Instance classes recalculate + // the cached flags after the class file is parsed, but before the + // class is put into the system dictionary. +- int computed_modifiers = k->compute_modifier_flags(CHECK_0); ++ int computed_modifiers = k->compute_modifier_flags(CHECK); + k->set_modifier_flags(computed_modifiers); + // Class_klass has to be loaded because it is used to allocate + // the mirror. + if (SystemDictionary::Class_klass_loaded()) { + // Allocate mirror (java.lang.Class instance) +- Handle mirror = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0); ++ Handle mirror = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK); ++ ++ // Setup indirection from mirror->klass ++ if (!k.is_null()) { ++ java_lang_Class::set_klass(mirror(), k()); ++ } + + InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass()); ++ assert(oop_size(mirror()) == mk->instance_size(k), "should have been set"); ++ + java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror())); + + // It might also have a component mirror. This mirror must already exist. +@@ -577,29 +603,32 @@ + assert(k->oop_is_objArray(), "Must be"); + Klass* element_klass = ObjArrayKlass::cast(k())->element_klass(); + assert(element_klass != NULL, "Must have an element klass"); +- comp_mirror = element_klass->java_mirror(); ++ comp_mirror = element_klass->java_mirror(); + } + assert(comp_mirror.not_null(), "must have a mirror"); + +- // Two-way link between the array klass and its component mirror: ++ // Two-way link between the array klass and its component mirror: + ArrayKlass::cast(k())->set_component_mirror(comp_mirror()); + set_array_klass(comp_mirror(), k()); + } else { + assert(k->oop_is_instance(), "Must be"); + +- // Allocate a simple java object for a lock. +- // This needs to be a java object because during class initialization +- // it can be held across a java call. +- typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK_NULL); +- set_init_lock(mirror(), r); +- +- // Set protection domain also +- set_protection_domain(mirror(), protection_domain()); +- +- // Initialize static fields +- InstanceKlass::cast(k())->do_local_static_fields(&initialize_static_field, CHECK_NULL); ++ initialize_mirror_fields(k, mirror, protection_domain, THREAD); ++ if (HAS_PENDING_EXCEPTION) { ++ // If any of the fields throws an exception like OOM remove the klass field ++ // from the mirror so GC doesn't follow it after the klass has been deallocated. ++ // This mirror looks like a primitive type, which logically it is because it ++ // it represents no class. ++ java_lang_Class::set_klass(mirror(), NULL); ++ return; ++ } + } +- return mirror(); ++ ++ // Setup indirection from klass->mirror last ++ // after any exceptions can happen during allocations. ++ if (!k.is_null()) { ++ k->set_java_mirror(mirror()); ++ } + } else { + if (fixup_mirror_list() == NULL) { + GrowableArray* list = +@@ -607,12 +636,10 @@ + set_fixup_mirror_list(list); + } + fixup_mirror_list()->push(k()); +- return NULL; + } + } + + +- + int java_lang_Class::oop_size(oop java_class) { + assert(_oop_size_offset != 0, "must be set"); + return java_class->int_field(_oop_size_offset); +@@ -1456,7 +1483,7 @@ + while (h_throwable.not_null()) { + objArrayHandle result (THREAD, objArrayOop(backtrace(h_throwable()))); + if (result.is_null()) { +- st->print_cr(no_stack_trace_message()); ++ st->print_cr("%s", no_stack_trace_message()); + return; + } + +--- ./hotspot/src/share/vm/classfile/javaClasses.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/javaClasses.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -61,10 +61,6 @@ + + static Handle basic_create(int length, TRAPS); + +- static void set_value( oop string, typeArrayOop buffer) { +- assert(initialized, "Must be initialized"); +- string->obj_field_put(value_offset, (oop)buffer); +- } + static void set_offset(oop string, int offset) { + assert(initialized, "Must be initialized"); + if (offset_offset > 0) { +@@ -122,12 +118,26 @@ + return hash_offset; + } + ++ static void set_value(oop string, typeArrayOop buffer) { ++ assert(initialized && (value_offset > 0), "Must be initialized"); ++ string->obj_field_put(value_offset, (oop)buffer); ++ } ++ static void set_hash(oop string, unsigned int hash) { ++ assert(initialized && (hash_offset > 0), "Must be initialized"); ++ string->int_field_put(hash_offset, hash); ++ } ++ + // Accessors + static typeArrayOop value(oop java_string) { + assert(initialized && (value_offset > 0), "Must be initialized"); + assert(is_instance(java_string), "must be java_string"); + return (typeArrayOop) java_string->obj_field(value_offset); + } ++ static unsigned int hash(oop java_string) { ++ assert(initialized && (hash_offset > 0), "Must be initialized"); ++ assert(is_instance(java_string), "must be java_string"); ++ return java_string->int_field(hash_offset); ++ } + static int offset(oop java_string) { + assert(initialized, "Must be initialized"); + assert(is_instance(java_string), "must be java_string"); +@@ -236,11 +246,12 @@ + + static void set_init_lock(oop java_class, oop init_lock); + static void set_protection_domain(oop java_class, oop protection_domain); ++ static void initialize_mirror_fields(KlassHandle k, Handle mirror, Handle protection_domain, TRAPS); + public: + static void compute_offsets(); + + // Instance creation +- static oop create_mirror(KlassHandle k, Handle protection_domain, TRAPS); ++ static void create_mirror(KlassHandle k, Handle protection_domain, TRAPS); + static void fixup_mirror(KlassHandle k, TRAPS); + static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); + // Conversion +--- ./hotspot/src/share/vm/classfile/symbolTable.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/symbolTable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -35,9 +35,17 @@ + #include "oops/oop.inline2.hpp" + #include "runtime/mutexLocker.hpp" + #include "utilities/hashtable.inline.hpp" ++#if INCLUDE_ALL_GCS ++#include "gc_implementation/g1/g1StringDedup.hpp" ++#endif ++ ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + // -------------------------------------------------------------------------- + ++// the number of buckets a thread claims ++const int ClaimChunkSize = 32; ++ + SymbolTable* SymbolTable::_the_table = NULL; + // Static arena for symbols that are not deallocated + Arena* SymbolTable::_arena = NULL; +@@ -83,16 +91,12 @@ + } + } + +-int SymbolTable::symbols_removed = 0; +-int SymbolTable::symbols_counted = 0; ++int SymbolTable::_symbols_removed = 0; ++int SymbolTable::_symbols_counted = 0; ++volatile int SymbolTable::_parallel_claimed_idx = 0; + +-// Remove unreferenced symbols from the symbol table +-// This is done late during GC. +-void SymbolTable::unlink() { +- int removed = 0; +- int total = 0; +- size_t memory_total = 0; +- for (int i = 0; i < the_table()->table_size(); ++i) { ++void SymbolTable::buckets_unlink(int start_idx, int end_idx, int* processed, int* removed, size_t* memory_total) { ++ for (int i = start_idx; i < end_idx; ++i) { + HashtableEntry** p = the_table()->bucket_addr(i); + HashtableEntry* entry = the_table()->bucket(i); + while (entry != NULL) { +@@ -104,14 +108,14 @@ + break; + } + Symbol* s = entry->literal(); +- memory_total += s->size(); +- total++; ++ (*memory_total) += s->size(); ++ (*processed)++; + assert(s != NULL, "just checking"); + // If reference count is zero, remove. + if (s->refcount() == 0) { + assert(!entry->is_shared(), "shared entries should be kept live"); + delete s; +- removed++; ++ (*removed)++; + *p = entry->next(); + the_table()->free_entry(entry); + } else { +@@ -121,12 +125,45 @@ + entry = (HashtableEntry*)HashtableEntry::make_ptr(*p); + } + } +- symbols_removed += removed; +- symbols_counted += total; ++} ++ ++// Remove unreferenced symbols from the symbol table ++// This is done late during GC. ++void SymbolTable::unlink(int* processed, int* removed) { ++ size_t memory_total = 0; ++ buckets_unlink(0, the_table()->table_size(), processed, removed, &memory_total); ++ _symbols_removed += *removed; ++ _symbols_counted += *processed; + // Exclude printing for normal PrintGCDetails because people parse + // this output. + if (PrintGCDetails && Verbose && WizardMode) { +- gclog_or_tty->print(" [Symbols=%d size=" SIZE_FORMAT "K] ", total, ++ gclog_or_tty->print(" [Symbols=%d size=" SIZE_FORMAT "K] ", *processed, ++ (memory_total*HeapWordSize)/1024); ++ } ++} ++ ++void SymbolTable::possibly_parallel_unlink(int* processed, int* removed) { ++ const int limit = the_table()->table_size(); ++ ++ size_t memory_total = 0; ++ ++ for (;;) { ++ // Grab next set of buckets to scan ++ int start_idx = Atomic::add(ClaimChunkSize, &_parallel_claimed_idx) - ClaimChunkSize; ++ if (start_idx >= limit) { ++ // End of table ++ break; ++ } ++ ++ int end_idx = MIN2(limit, start_idx + ClaimChunkSize); ++ buckets_unlink(start_idx, end_idx, processed, removed, &memory_total); ++ } ++ Atomic::add(*processed, &_symbols_counted); ++ Atomic::add(*removed, &_symbols_removed); ++ // Exclude printing for normal PrintGCDetails because people parse ++ // this output. ++ if (PrintGCDetails && Verbose && WizardMode) { ++ gclog_or_tty->print(" [Symbols: scanned=%d removed=%d size=" SIZE_FORMAT "K] ", *processed, *removed, + (memory_total*HeapWordSize)/1024); + } + } +@@ -494,11 +531,11 @@ + tty->print_cr("Total number of symbols %5d", count); + tty->print_cr("Total size in memory %5dK", + (memory_total*HeapWordSize)/1024); +- tty->print_cr("Total counted %5d", symbols_counted); +- tty->print_cr("Total removed %5d", symbols_removed); +- if (symbols_counted > 0) { ++ tty->print_cr("Total counted %5d", _symbols_counted); ++ tty->print_cr("Total removed %5d", _symbols_removed); ++ if (_symbols_counted > 0) { + tty->print_cr("Percent removed %3.2f", +- ((float)symbols_removed/(float)symbols_counted)* 100); ++ ((float)_symbols_removed/(float)_symbols_counted)* 100); + } + tty->print_cr("Reference counts %5d", Symbol::_total_count); + tty->print_cr("Symbol arena size %5d used %5d", +@@ -696,6 +733,15 @@ + string = java_lang_String::create_from_unicode(name, len, CHECK_NULL); + } + ++#if INCLUDE_ALL_GCS ++ if (G1StringDedup::is_enabled()) { ++ // Deduplicate the string before it is interned. Note that we should never ++ // deduplicate a string after it has been interned. Doing so will counteract ++ // compiler optimizations done on e.g. interned string literals. ++ G1StringDedup::deduplicate(string()); ++ } ++#endif ++ + // Grab the StringTable_lock before getting the_table() because it could + // change at safepoint. + MutexLocker ml(StringTable_lock, THREAD); +@@ -739,39 +785,38 @@ + return result; + } + +-void StringTable::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f) { ++void StringTable::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int* processed, int* removed) { ++ buckets_unlink_or_oops_do(is_alive, f, 0, the_table()->table_size(), processed, removed); ++} ++ ++void StringTable::possibly_parallel_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int* processed, int* removed) { + // Readers of the table are unlocked, so we should only be removing + // entries at a safepoint. + assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint"); +- for (int i = 0; i < the_table()->table_size(); ++i) { +- HashtableEntry** p = the_table()->bucket_addr(i); +- HashtableEntry* entry = the_table()->bucket(i); +- while (entry != NULL) { +- assert(!entry->is_shared(), "CDS not used for the StringTable"); ++ const int limit = the_table()->table_size(); + +- if (is_alive->do_object_b(entry->literal())) { +- if (f != NULL) { +- f->do_oop((oop*)entry->literal_addr()); +- } +- p = entry->next_addr(); +- } else { +- *p = entry->next(); +- the_table()->free_entry(entry); +- } +- entry = *p; ++ for (;;) { ++ // Grab next set of buckets to scan ++ int start_idx = Atomic::add(ClaimChunkSize, &_parallel_claimed_idx) - ClaimChunkSize; ++ if (start_idx >= limit) { ++ // End of table ++ break; + } ++ ++ int end_idx = MIN2(limit, start_idx + ClaimChunkSize); ++ buckets_unlink_or_oops_do(is_alive, f, start_idx, end_idx, processed, removed); + } + } + +-void StringTable::buckets_do(OopClosure* f, int start_idx, int end_idx) { ++void StringTable::buckets_oops_do(OopClosure* f, int start_idx, int end_idx) { + const int limit = the_table()->table_size(); + + assert(0 <= start_idx && start_idx <= limit, +- err_msg("start_idx (" INT32_FORMAT ") oob?", start_idx)); ++ err_msg("start_idx (" INT32_FORMAT ") is out of bounds", start_idx)); + assert(0 <= end_idx && end_idx <= limit, +- err_msg("end_idx (" INT32_FORMAT ") oob?", end_idx)); ++ err_msg("end_idx (" INT32_FORMAT ") is out of bounds", end_idx)); + assert(start_idx <= end_idx, +- err_msg("Ordering: start_idx=" INT32_FORMAT", end_idx=" INT32_FORMAT, ++ err_msg("Index ordering: start_idx=" INT32_FORMAT", end_idx=" INT32_FORMAT, + start_idx, end_idx)); + + for (int i = start_idx; i < end_idx; i += 1) { +@@ -786,12 +831,44 @@ + } + } + ++void StringTable::buckets_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int start_idx, int end_idx, int* processed, int* removed) { ++ const int limit = the_table()->table_size(); ++ ++ assert(0 <= start_idx && start_idx <= limit, ++ err_msg("start_idx (" INT32_FORMAT ") is out of bounds", start_idx)); ++ assert(0 <= end_idx && end_idx <= limit, ++ err_msg("end_idx (" INT32_FORMAT ") is out of bounds", end_idx)); ++ assert(start_idx <= end_idx, ++ err_msg("Index ordering: start_idx=" INT32_FORMAT", end_idx=" INT32_FORMAT, ++ start_idx, end_idx)); ++ ++ for (int i = start_idx; i < end_idx; ++i) { ++ HashtableEntry** p = the_table()->bucket_addr(i); ++ HashtableEntry* entry = the_table()->bucket(i); ++ while (entry != NULL) { ++ assert(!entry->is_shared(), "CDS not used for the StringTable"); ++ ++ if (is_alive->do_object_b(entry->literal())) { ++ if (f != NULL) { ++ f->do_oop((oop*)entry->literal_addr()); ++ } ++ p = entry->next_addr(); ++ } else { ++ *p = entry->next(); ++ the_table()->free_entry(entry); ++ (*removed)++; ++ } ++ (*processed)++; ++ entry = *p; ++ } ++ } ++} ++ + void StringTable::oops_do(OopClosure* f) { +- buckets_do(f, 0, the_table()->table_size()); ++ buckets_oops_do(f, 0, the_table()->table_size()); + } + + void StringTable::possibly_parallel_oops_do(OopClosure* f) { +- const int ClaimChunkSize = 32; + const int limit = the_table()->table_size(); + + for (;;) { +@@ -803,7 +880,7 @@ + } + + int end_idx = MIN2(limit, start_idx + ClaimChunkSize); +- buckets_do(f, start_idx, end_idx); ++ buckets_oops_do(f, start_idx, end_idx); + } + } + +--- ./hotspot/src/share/vm/classfile/symbolTable.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/symbolTable.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -86,8 +86,8 @@ + static bool _needs_rehashing; + + // For statistics +- static int symbols_removed; +- static int symbols_counted; ++ static int _symbols_removed; ++ static int _symbols_counted; + + Symbol* allocate_symbol(const u1* name, int len, bool c_heap, TRAPS); // Assumes no characters larger than 0x7F + +@@ -121,6 +121,11 @@ + static Arena* arena() { return _arena; } // called for statistics + + static void initialize_symbols(int arena_alloc_size = 0); ++ ++ static volatile int _parallel_claimed_idx; ++ ++ // Release any dead symbols ++ static void buckets_unlink(int start_idx, int end_idx, int* processed, int* removed, size_t* memory_total); + public: + enum { + symbol_alloc_batch_size = 8, +@@ -177,7 +182,14 @@ + unsigned int* hashValues, TRAPS); + + // Release any dead symbols +- static void unlink(); ++ static void unlink() { ++ int processed = 0; ++ int removed = 0; ++ unlink(&processed, &removed); ++ } ++ static void unlink(int* processed, int* removed); ++ // Release any dead symbols, possibly parallel version ++ static void possibly_parallel_unlink(int* processed, int* removed); + + // iterate over symbols + static void symbols_do(SymbolClosure *cl); +@@ -235,6 +247,9 @@ + // Rehash the symbol table if it gets out of balance + static void rehash_table(); + static bool needs_rehashing() { return _needs_rehashing; } ++ // Parallel chunked scanning ++ static void clear_parallel_claimed_index() { _parallel_claimed_idx = 0; } ++ static int parallel_claimed_index() { return _parallel_claimed_idx; } + }; + + class StringTable : public Hashtable { +@@ -258,7 +273,10 @@ + + // Apply the give oop closure to the entries to the buckets + // in the range [start_idx, end_idx). +- static void buckets_do(OopClosure* f, int start_idx, int end_idx); ++ static void buckets_oops_do(OopClosure* f, int start_idx, int end_idx); ++ // Unlink or apply the give oop closure to the entries to the buckets ++ // in the range [start_idx, end_idx). ++ static void buckets_unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* f, int start_idx, int end_idx, int* processed, int* removed); + + StringTable() : Hashtable((int)StringTableSize, + sizeof (HashtableEntry)) {} +@@ -280,15 +298,28 @@ + + // GC support + // Delete pointers to otherwise-unreachable objects. +- static void unlink_or_oops_do(BoolObjectClosure* cl, OopClosure* f); ++ static void unlink_or_oops_do(BoolObjectClosure* cl, OopClosure* f) { ++ int processed = 0; ++ int removed = 0; ++ unlink_or_oops_do(cl, f, &processed, &removed); ++ } + static void unlink(BoolObjectClosure* cl) { +- unlink_or_oops_do(cl, NULL); ++ int processed = 0; ++ int removed = 0; ++ unlink_or_oops_do(cl, NULL, &processed, &removed); + } +- ++ static void unlink_or_oops_do(BoolObjectClosure* cl, OopClosure* f, int* processed, int* removed); ++ static void unlink(BoolObjectClosure* cl, int* processed, int* removed) { ++ unlink_or_oops_do(cl, NULL, processed, removed); ++ } + // Serially invoke "f->do_oop" on the locations of all oops in the table. + static void oops_do(OopClosure* f); + +- // Possibly parallel version of the above ++ // Possibly parallel versions of the above ++ static void possibly_parallel_unlink_or_oops_do(BoolObjectClosure* cl, OopClosure* f, int* processed, int* removed); ++ static void possibly_parallel_unlink(BoolObjectClosure* cl, int* processed, int* removed) { ++ possibly_parallel_unlink_or_oops_do(cl, NULL, processed, removed); ++ } + static void possibly_parallel_oops_do(OopClosure* f); + + // Hashing algorithm, used as the hash value used by the +@@ -349,5 +380,6 @@ + + // Parallel chunked scanning + static void clear_parallel_claimed_index() { _parallel_claimed_idx = 0; } ++ static int parallel_claimed_index() { return _parallel_claimed_idx; } + }; + #endif // SHARE_VM_CLASSFILE_SYMBOLTABLE_HPP +--- ./hotspot/src/share/vm/classfile/systemDictionary.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/systemDictionary.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -826,47 +826,6 @@ + } + } // load_instance_class loop + +- if (HAS_PENDING_EXCEPTION) { +- // An exception, such as OOM could have happened at various places inside +- // load_instance_class. We might have partially initialized a shared class +- // and need to clean it up. +- if (class_loader.is_null()) { +- // In some cases k may be null. Let's find the shared class again. +- instanceKlassHandle ik(THREAD, find_shared_class(name)); +- if (ik.not_null()) { +- if (ik->class_loader_data() == NULL) { +- // We didn't go as far as Klass::restore_unshareable_info(), +- // so nothing to clean up. +- } else { +- Klass *kk; +- { +- MutexLocker mu(SystemDictionary_lock, THREAD); +- kk = find_class(d_index, d_hash, name, ik->class_loader_data()); +- } +- if (kk != NULL) { +- // No clean up is needed if the shared class has been entered +- // into system dictionary, as load_shared_class() won't be called +- // again. +- } else { +- // This must be done outside of the SystemDictionary_lock to +- // avoid deadlock. +- // +- // Note that Klass::restore_unshareable_info (called via +- // load_instance_class above) is also called outside +- // of SystemDictionary_lock. Other threads are blocked from +- // loading this class because they are waiting on the +- // SystemDictionary_lock until this thread removes +- // the placeholder below. +- // +- // This need to be re-thought when parallel-capable non-boot +- // classloaders are supported by CDS (today they're not). +- clean_up_shared_class(ik, class_loader, THREAD); +- } +- } +- } +- } +- } +- + if (load_instance_added == true) { + // clean up placeholder entries for LOAD_INSTANCE success or error + // This brackets the SystemDictionary updates for both defining +@@ -1038,7 +997,6 @@ + + if (host_klass.not_null() && k.not_null()) { + assert(EnableInvokeDynamic, ""); +- k->set_host_klass(host_klass()); + // If it's anonymous, initialize it now, since nobody else will. + + { +@@ -1272,19 +1230,6 @@ + return ik; + } + +-void SystemDictionary::clean_up_shared_class(instanceKlassHandle ik, Handle class_loader, TRAPS) { +- // Updating methods must be done under a lock so multiple +- // threads don't update these in parallel +- // Shared classes are all currently loaded by the bootstrap +- // classloader, so this will never cause a deadlock on +- // a custom class loader lock. +- { +- Handle lockObject = compute_loader_lock_object(class_loader, THREAD); +- check_loader_lock_contention(lockObject, THREAD); +- ObjectLocker ol(lockObject, THREAD, true); +- ik->remove_unshareable_info(); +- } +-} + + instanceKlassHandle SystemDictionary::load_instance_class(Symbol* class_name, Handle class_loader, TRAPS) { + instanceKlassHandle nh = instanceKlassHandle(); // null Handle +@@ -2322,7 +2267,7 @@ + oop appendix = appendix_box->obj_at(0); + if (TraceMethodHandles) { + #ifndef PRODUCT +- tty->print("Linked method="INTPTR_FORMAT": ", m); ++ tty->print("Linked method=" INTPTR_FORMAT ": ", p2i(m)); + m->print(); + if (appendix != NULL) { tty->print("appendix = "); appendix->print(); } + tty->cr(); +@@ -2650,23 +2595,6 @@ + constraints()->verify(dictionary(), placeholders()); + } + +- +-void SystemDictionary::verify_obj_klass_present(Symbol* class_name, +- ClassLoaderData* loader_data) { +- GCMutexLocker mu(SystemDictionary_lock); +- Symbol* name; +- +- Klass* probe = find_class(class_name, loader_data); +- if (probe == NULL) { +- probe = SystemDictionary::find_shared_class(class_name); +- if (probe == NULL) { +- name = find_placeholder(class_name, loader_data); +- } +- } +- guarantee(probe != NULL || name != NULL, +- "Loaded klasses should be in SystemDictionary"); +-} +- + // utility function for class load event + void SystemDictionary::post_class_load_event(const Ticks& start_time, + instanceKlassHandle k, +--- ./hotspot/src/share/vm/classfile/systemDictionary.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/systemDictionary.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -375,10 +375,6 @@ + static bool is_internal_format(Symbol* class_name); + #endif + +- // Verify class is in dictionary +- static void verify_obj_klass_present(Symbol* class_name, +- ClassLoaderData* loader_data); +- + // Initialization + static void initialize(TRAPS); + +@@ -621,7 +617,6 @@ + Handle class_loader, TRAPS); + static instanceKlassHandle load_shared_class(instanceKlassHandle ik, + Handle class_loader, TRAPS); +- static void clean_up_shared_class(instanceKlassHandle ik, Handle class_loader, TRAPS); + static instanceKlassHandle load_instance_class(Symbol* class_name, Handle class_loader, TRAPS); + static Handle compute_loader_lock_object(Handle class_loader, TRAPS); + static void check_loader_lock_contention(Handle loader_lock, TRAPS); +--- ./hotspot/src/share/vm/classfile/verificationType.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verificationType.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -299,7 +299,7 @@ + int dimensions() const { + assert(is_array(), "Must be an array"); + int index = 0; +- while (name()->byte_at(index++) == '['); ++ while (name()->byte_at(index) == '[') index++; + return index; + } + +--- ./hotspot/src/share/vm/classfile/verifier.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verifier.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -364,7 +364,7 @@ + + void ErrorContext::details(outputStream* ss, const Method* method) const { + if (is_valid()) { +- ss->print_cr(""); ++ ss->cr(); + ss->print_cr("Exception Details:"); + location_details(ss, method); + reason_details(ss); +@@ -379,7 +379,7 @@ + streamIndentor si(ss); + ss->indent().print_cr("Reason:"); + streamIndentor si2(ss); +- ss->indent().print(""); ++ ss->indent().print("%s", ""); + switch (_fault) { + case INVALID_BYTECODE: + ss->print("Error exists in the bytecode"); +@@ -432,7 +432,7 @@ + ShouldNotReachHere(); + ss->print_cr("Unknown"); + } +- ss->print_cr(""); ++ ss->cr(); + } + + void ErrorContext::location_details(outputStream* ss, const Method* method) const { +@@ -507,7 +507,7 @@ + for (u2 i = 0; i < sm_table->number_of_entries(); ++i) { + ss->indent(); + sm_frame->print_on(ss, current_offset); +- ss->print_cr(""); ++ ss->cr(); + current_offset += sm_frame->offset_delta(); + sm_frame = sm_frame->next(); + } +@@ -579,7 +579,8 @@ + tty->print_cr("Verifying method %s", m->name_and_sig_as_C_string()); + } + +- const char* bad_type_msg = "Bad type on operand stack in %s"; ++// For clang, the only good constant format string is a literal constant format string. ++#define bad_type_msg "Bad type on operand stack in %s" + + int32_t max_stack = m->verifier_max_stack(); + int32_t max_locals = m->max_locals(); +@@ -1679,6 +1680,8 @@ + } + } + ++#undef bad_type_message ++ + char* ClassVerifier::generate_code_data(methodHandle m, u4 code_length, TRAPS) { + char* code_data = NEW_RESOURCE_ARRAY(char, code_length); + memset(code_data, 0, sizeof(char) * code_length); +@@ -1946,7 +1949,7 @@ + InstanceKlass* target_instance = InstanceKlass::cast(target_class); + fieldDescriptor fd; + if (is_method) { +- Method* m = target_instance->uncached_lookup_method(field_name, field_sig); ++ Method* m = target_instance->uncached_lookup_method(field_name, field_sig, Klass::normal); + if (m != NULL && m->is_protected()) { + if (!this_class->is_same_class_package(m->method_holder())) { + return true; +@@ -2306,7 +2309,7 @@ + ref_class_type.name(), CHECK_VERIFY(this)); + Method* m = InstanceKlass::cast(ref_klass)->uncached_lookup_method( + vmSymbols::object_initializer_name(), +- cp->signature_ref_at(bcs->get_index_u2())); ++ cp->signature_ref_at(bcs->get_index_u2()), Klass::normal); + // Do nothing if method is not found. Let resolution detect the error. + if (m != NULL) { + instanceKlassHandle mh(THREAD, m->method_holder()); +@@ -2391,11 +2394,12 @@ + if (opcode == Bytecodes::_invokedynamic) { + if (!EnableInvokeDynamic || + _klass->major_version() < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { +- class_format_error( +- (!EnableInvokeDynamic ? +- "invokedynamic instructions not enabled in this JVM" : +- "invokedynamic instructions not supported by this class file version"), +- _klass->external_name()); ++ if (!EnableInvokeDynamic) { ++ class_format_error("invokedynamic instructions not enabled in this JVM"); ++ } else { ++ class_format_error("invokedynamic instructions not supported by this class file version (%d), class %s", ++ _klass->major_version(), _klass->external_name()); ++ } + return; + } + } else { +--- ./hotspot/src/share/vm/classfile/verifier.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verifier.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -378,15 +378,15 @@ + bool has_error() const { return result() != NULL; } + char* exception_message() { + stringStream ss; +- ss.print(_message); ++ ss.print("%s", _message); + _error_context.details(&ss, _method()); + return ss.as_string(); + } + + // Called when verify or class format errors are encountered. + // May throw an exception based upon the mode. +- void verify_error(ErrorContext ctx, const char* fmt, ...); +- void class_format_error(const char* fmt, ...); ++ void verify_error(ErrorContext ctx, const char* fmt, ...) ATTRIBUTE_PRINTF(3, 4); ++ void class_format_error(const char* fmt, ...) ATTRIBUTE_PRINTF(2, 3); + + Klass* load_class(Symbol* name, TRAPS); + +--- ./hotspot/src/share/vm/classfile/vmSymbols.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/vmSymbols.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -533,7 +533,7 @@ + xtty->begin_elem("intrinsic_misdeclared actual='%s' declared='%s'", + actual_name, declared_name); + xtty->method(mh); +- xtty->end_elem(""); ++ xtty->end_elem("%s", ""); + } + if (PrintMiscellaneous && (WizardMode || Verbose)) { + tty->print_cr("*** misidentified method; %s(%d) should be %s(%d):", +--- ./hotspot/src/share/vm/classfile/vmSymbols.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -654,9 +654,9 @@ + do_intrinsic(_addExactI, java_lang_Math, addExact_name, int2_int_signature, F_S) \ + do_intrinsic(_addExactL, java_lang_Math, addExact_name, long2_long_signature, F_S) \ + do_intrinsic(_decrementExactI, java_lang_Math, decrementExact_name, int_int_signature, F_S) \ +- do_intrinsic(_decrementExactL, java_lang_Math, decrementExact_name, long2_long_signature, F_S) \ ++ do_intrinsic(_decrementExactL, java_lang_Math, decrementExact_name, long_long_signature, F_S) \ + do_intrinsic(_incrementExactI, java_lang_Math, incrementExact_name, int_int_signature, F_S) \ +- do_intrinsic(_incrementExactL, java_lang_Math, incrementExact_name, long2_long_signature, F_S) \ ++ do_intrinsic(_incrementExactL, java_lang_Math, incrementExact_name, long_long_signature, F_S) \ + do_intrinsic(_multiplyExactI, java_lang_Math, multiplyExact_name, int2_int_signature, F_S) \ + do_intrinsic(_multiplyExactL, java_lang_Math, multiplyExact_name, long2_long_signature, F_S) \ + do_intrinsic(_negateExactI, java_lang_Math, negateExact_name, int_int_signature, F_S) \ +@@ -774,7 +774,7 @@ + /* java/lang/ref/Reference */ \ + do_intrinsic(_Reference_get, java_lang_ref_Reference, get_name, void_object_signature, F_R) \ + \ +- /* support for com.sum.crypto.provider.AESCrypt and some of its callers */ \ ++ /* support for com.sun.crypto.provider.AESCrypt and some of its callers */ \ + do_class(com_sun_crypto_provider_aescrypt, "com/sun/crypto/provider/AESCrypt") \ + do_intrinsic(_aescrypt_encryptBlock, com_sun_crypto_provider_aescrypt, encryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ + do_intrinsic(_aescrypt_decryptBlock, com_sun_crypto_provider_aescrypt, decryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ +@@ -787,7 +787,7 @@ + do_intrinsic(_cipherBlockChaining_decryptAESCrypt, com_sun_crypto_provider_cipherBlockChaining, decrypt_name, byteArray_int_int_byteArray_int_signature, F_R) \ + do_name( encrypt_name, "encrypt") \ + do_name( decrypt_name, "decrypt") \ +- do_signature(byteArray_int_int_byteArray_int_signature, "([BII[BI)V") \ ++ do_signature(byteArray_int_int_byteArray_int_signature, "([BII[BI)I") \ + \ + /* support for java.util.zip */ \ + do_class(java_util_zip_CRC32, "java/util/zip/CRC32") \ +--- ./hotspot/src/share/vm/code/codeBlob.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/codeBlob.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -530,7 +530,7 @@ + } + + void CodeBlob::print_on(outputStream* st) const { +- st->print_cr("[CodeBlob (" INTPTR_FORMAT ")]", this); ++ st->print_cr("[CodeBlob (" INTPTR_FORMAT ")]", p2i(this)); + st->print_cr("Framesize: %d", _frame_size); + } + +@@ -548,7 +548,7 @@ + } + + void BufferBlob::print_value_on(outputStream* st) const { +- st->print_cr("BufferBlob (" INTPTR_FORMAT ") used for %s", this, name()); ++ st->print_cr("BufferBlob (" INTPTR_FORMAT ") used for %s", p2i(this), name()); + } + + void RuntimeStub::verify() { +@@ -558,13 +558,13 @@ + void RuntimeStub::print_on(outputStream* st) const { + ttyLocker ttyl; + CodeBlob::print_on(st); +- st->print("Runtime Stub (" INTPTR_FORMAT "): ", this); +- st->print_cr(name()); ++ st->print("Runtime Stub (" INTPTR_FORMAT "): ", p2i(this)); ++ st->print_cr("%s", name()); + Disassembler::decode((CodeBlob*)this, st); + } + + void RuntimeStub::print_value_on(outputStream* st) const { +- st->print("RuntimeStub (" INTPTR_FORMAT "): ", this); st->print(name()); ++ st->print("RuntimeStub (" INTPTR_FORMAT "): ", p2i(this)); st->print("%s", name()); + } + + void SingletonBlob::verify() { +@@ -574,12 +574,12 @@ + void SingletonBlob::print_on(outputStream* st) const { + ttyLocker ttyl; + CodeBlob::print_on(st); +- st->print_cr(name()); ++ st->print_cr("%s", name()); + Disassembler::decode((CodeBlob*)this, st); + } + + void SingletonBlob::print_value_on(outputStream* st) const { +- st->print_cr(name()); ++ st->print_cr("%s", name()); + } + + void DeoptimizationBlob::print_value_on(outputStream* st) const { +--- ./hotspot/src/share/vm/code/codeCache.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/codeCache.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -81,10 +81,10 @@ + bool is_empty() { return count == 0; } + + void print(const char* title) { +- tty->print_cr(" #%d %s = %dK (hdr %d%%, loc %d%%, code %d%%, stub %d%%, [oops %d%%, data %d%%, pcs %d%%])", ++ tty->print_cr(" #%d %s = %dK (hdr %d%%, loc %d%%, code %d%%, stub %d%%, [oops %d%%, metadata %d%%, data %d%%, pcs %d%%])", + count, + title, +- total() / K, ++ (int)(total() / K), + header_size * 100 / total_size, + relocation_size * 100 / total_size, + code_size * 100 / total_size, +@@ -191,7 +191,7 @@ + } + if (PrintCodeCacheExtension) { + ResourceMark rm; +- tty->print_cr("code cache extended to [" INTPTR_FORMAT ", " INTPTR_FORMAT "] (%d bytes)", ++ tty->print_cr("code cache extended to [" INTPTR_FORMAT ", " INTPTR_FORMAT "] (" SSIZE_FORMAT " bytes)", + (intptr_t)_heap->low_boundary(), (intptr_t)_heap->high(), + (address)_heap->high() - (address)_heap->low_boundary()); + } +@@ -496,7 +496,7 @@ + if (CompiledIC::is_icholder_call_site(iter.virtual_call_reloc())) { + CompiledIC *ic = CompiledIC_at(iter.reloc()); + if (TraceCompiledIC) { +- tty->print("noticed icholder " INTPTR_FORMAT " ", ic->cached_icholder()); ++ tty->print("noticed icholder " INTPTR_FORMAT " ", p2i(ic->cached_icholder())); + ic->print(); + } + assert(ic->cached_icholder() != NULL, "must be non-NULL"); +@@ -775,7 +775,7 @@ + if (PrintCodeCache2) { // Need to add a new flag + ResourceMark rm; + if (size == 0) size = cb->size(); +- tty->print_cr("CodeCache %s: addr: " INTPTR_FORMAT ", size: 0x%x", event, cb, size); ++ tty->print_cr("CodeCache %s: addr: " INTPTR_FORMAT ", size: 0x%x", event, p2i(cb), size); + } + } + +@@ -900,7 +900,7 @@ + + tty->print_cr("CodeCache:"); + +- tty->print_cr("nmethod dependency checking time %f", dependentCheckTime.seconds(), ++ tty->print_cr("nmethod dependency checking time %f, per dependent %f", dependentCheckTime.seconds(), + dependentCheckTime.seconds() / dependentCheckCount); + + if (!live.is_empty()) { +@@ -947,9 +947,9 @@ + + if (detailed) { + st->print_cr(" bounds [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT "]", +- _heap->low_boundary(), +- _heap->high(), +- _heap->high_boundary()); ++ p2i(_heap->low_boundary()), ++ p2i(_heap->high()), ++ p2i(_heap->high_boundary())); + st->print_cr(" total_blobs=" UINT32_FORMAT " nmethods=" UINT32_FORMAT + " adapters=" UINT32_FORMAT, + nof_blobs(), nof_nmethods(), nof_adapters()); +--- ./hotspot/src/share/vm/code/compiledIC.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/compiledIC.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -88,9 +88,9 @@ + if (TraceCompiledIC) { + tty->print(" "); + print_compiled_ic(); +- tty->print(" changing destination to " INTPTR_FORMAT, entry_point); ++ tty->print(" changing destination to " INTPTR_FORMAT, p2i(entry_point)); + if (!is_optimized()) { +- tty->print(" changing cached %s to " INTPTR_FORMAT, is_icholder ? "icholder" : "metadata", (address)cache); ++ tty->print(" changing cached %s to " INTPTR_FORMAT, is_icholder ? "icholder" : "metadata", p2i((address)cache)); + } + if (is_icstub) { + tty->print(" (icstub)"); +@@ -195,7 +195,7 @@ + if (TraceICs) { + ResourceMark rm; + tty->print_cr ("IC@" INTPTR_FORMAT ": to megamorphic %s entry: " INTPTR_FORMAT, +- instruction_address(), call_info->selected_method()->print_value_string(), entry); ++ p2i(instruction_address()), call_info->selected_method()->print_value_string(), p2i(entry)); + } + + // We can't check this anymore. With lazy deopt we could have already +@@ -272,7 +272,7 @@ + void CompiledIC::set_to_clean() { + assert(SafepointSynchronize::is_at_safepoint() || CompiledIC_lock->is_locked() , "MT-unsafe call"); + if (TraceInlineCacheClearing || TraceICs) { +- tty->print_cr("IC@" INTPTR_FORMAT ": set to clean", instruction_address()); ++ tty->print_cr("IC@" INTPTR_FORMAT ": set to clean", p2i(instruction_address())); + print(); + } + +@@ -354,7 +354,7 @@ + if (TraceICs) { + ResourceMark rm(thread); + tty->print_cr ("IC@" INTPTR_FORMAT ": monomorphic to interpreter: %s", +- instruction_address(), ++ p2i(instruction_address()), + method->print_value_string()); + } + } else { +@@ -362,7 +362,7 @@ + InlineCacheBuffer::create_transition_stub(this, info.claim_cached_icholder(), info.entry()); + if (TraceICs) { + ResourceMark rm(thread); +- tty->print_cr ("IC@" INTPTR_FORMAT ": monomorphic to interpreter via icholder ", instruction_address()); ++ tty->print_cr ("IC@" INTPTR_FORMAT ": monomorphic to interpreter via icholder ", p2i(instruction_address())); + } + } + } else { +@@ -392,7 +392,7 @@ + ResourceMark rm(thread); + assert(info.cached_metadata() == NULL || info.cached_metadata()->is_klass(), "must be"); + tty->print_cr ("IC@" INTPTR_FORMAT ": monomorphic to compiled (rcvr klass) %s: %s", +- instruction_address(), ++ p2i(instruction_address()), + ((Klass*)info.cached_metadata())->print_value_string(), + (safe) ? "" : "via stub"); + } +@@ -530,8 +530,8 @@ + if (TraceICs) { + ResourceMark rm; + tty->print_cr("CompiledStaticCall@" INTPTR_FORMAT ": set_to_compiled " INTPTR_FORMAT, +- instruction_address(), +- info.entry()); ++ p2i(instruction_address()), ++ p2i(info.entry())); + } + // Call to compiled code + assert (CodeCache::contains(info.entry()), "wrong entry point"); +@@ -600,11 +600,11 @@ + + void CompiledIC::print_compiled_ic() { + tty->print("Inline cache at " INTPTR_FORMAT ", calling %s " INTPTR_FORMAT " cached_value " INTPTR_FORMAT, +- instruction_address(), is_call_to_interpreted() ? "interpreted " : "", ic_destination(), is_optimized() ? NULL : cached_value()); ++ p2i(instruction_address()), is_call_to_interpreted() ? "interpreted " : "", p2i(ic_destination()), p2i(is_optimized() ? NULL : cached_value())); + } + + void CompiledStaticCall::print() { +- tty->print("static call at " INTPTR_FORMAT " -> ", instruction_address()); ++ tty->print("static call at " INTPTR_FORMAT " -> ", p2i(instruction_address())); + if (is_clean()) { + tty->print("clean"); + } else if (is_call_to_compiled()) { +--- ./hotspot/src/share/vm/code/compressedStream.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/compressedStream.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -212,6 +212,8 @@ + return h ^ l; + } + ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_IGNORED // Someone needs to deal with this. + void test_compressed_stream(int trace) { + CompressedWriteStream bytes(stretch_limit * 100); + jint n; +@@ -275,6 +277,7 @@ + guarantee(length == length2, "bad length"); + guarantee(fails == 0, "test failures"); + } ++PRAGMA_DIAG_POP + + #if defined(_MSC_VER) &&_MSC_VER >=1400 && !defined(_WIN64) + #pragma warning(default: 4748) +--- ./hotspot/src/share/vm/code/debugInfo.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/debugInfo.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -28,7 +28,9 @@ + #include "code/nmethod.hpp" + #include "runtime/handles.inline.hpp" + +-// Comstructors ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ ++// Constructors + + DebugInfoWriteStream::DebugInfoWriteStream(DebugInformationRecorder* recorder, int initial_size) + : CompressedWriteStream(initial_size) { +--- ./hotspot/src/share/vm/code/debugInfo.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/debugInfo.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -273,8 +273,8 @@ + } + Method* read_method() { + Method* o = (Method*)(code()->metadata_at(read_int())); +- assert(o == NULL || +- o->is_metaspace_object(), "meta data only"); ++ // is_metadata() is a faster check than is_metaspace_object() ++ assert(o == NULL || o->is_metadata(), "meta data only"); + return o; + } + ScopeValue* read_object_value(); +--- ./hotspot/src/share/vm/code/dependencies.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/dependencies.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -655,8 +655,6 @@ + } else { + o = _deps->oop_recorder()->metadata_at(i); + } +- assert(o == NULL || o->is_metaspace_object(), +- err_msg("Should be metadata " PTR_FORMAT, o)); + return o; + } + +--- ./hotspot/src/share/vm/code/exceptionHandlerTable.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/exceptionHandlerTable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2010, 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 +@@ -27,6 +27,8 @@ + #include "code/nmethod.hpp" + #include "memory/allocation.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + void ExceptionHandlerTable::add_entry(HandlerTableEntry entry) { + _nesting.check(); + if (_length >= _size) { +--- ./hotspot/src/share/vm/code/icBuffer.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/icBuffer.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -39,6 +39,7 @@ + #include "runtime/mutexLocker.hpp" + #include "runtime/stubRoutines.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + DEF_STUB_INTERFACE(ICStub); + +--- ./hotspot/src/share/vm/code/nmethod.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/nmethod.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -46,6 +46,8 @@ + #include "shark/sharkCompiler.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #ifdef DTRACE_ENABLED + + // Only bother with this argument setup if dtrace is available +@@ -481,7 +483,9 @@ + _scavenge_root_link = NULL; + _scavenge_root_state = 0; + _compiler = NULL; +- ++#if INCLUDE_RTM_OPT ++ _rtm_state = NoRTM; ++#endif + #ifdef HAVE_DTRACE_H + _trap_offset = 0; + #endif // def HAVE_DTRACE_H +@@ -619,7 +623,7 @@ + InstanceKlass::cast(klass)->add_dependent_nmethod(nm); + } + NOT_PRODUCT(nmethod_stats.note_nmethod(nm)); +- if (PrintAssembly) { ++ if (PrintAssembly || CompilerOracle::has_option_string(method, "PrintAssembly")) { + Disassembler::decode(nm); + } + } +@@ -769,7 +773,11 @@ + _hotness_counter = NMethodSweeper::hotness_counter_reset_val(); + + code_buffer->copy_values_to(this); +- debug_only(verify_scavenge_root_oops()); ++ if (ScavengeRootsInCode && detect_scavenge_root_oops()) { ++ CodeCache::add_scavenge_root_nmethod(this); ++ Universe::heap()->register_nmethod(this); ++ } ++ DEBUG_ONLY(verify_scavenge_root_oops();) + CodeCache::commit(this); + } + +--- ./hotspot/src/share/vm/code/nmethod.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/nmethod.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -193,6 +193,12 @@ + + jbyte _scavenge_root_state; + ++#if INCLUDE_RTM_OPT ++ // RTM state at compile time. Used during deoptimization to decide ++ // whether to restart collecting RTM locking abort statistic again. ++ RTMState _rtm_state; ++#endif ++ + // Nmethod Flushing lock. If non-zero, then the nmethod is not removed + // and is not made into a zombie. However, once the nmethod is made into + // a zombie, it will be locked one final time if CompiledMethodUnload +@@ -414,6 +420,12 @@ + bool is_zombie() const { return _state == zombie; } + bool is_unloaded() const { return _state == unloaded; } + ++#if INCLUDE_RTM_OPT ++ // rtm state accessing and manipulating ++ RTMState rtm_state() const { return _rtm_state; } ++ void set_rtm_state(RTMState state) { _rtm_state = state; } ++#endif ++ + // Make the nmethod non entrant. The nmethod will continue to be + // alive. It is used when an uncommon trap happens. Returns true + // if this thread changed the state of the nmethod or false if +--- ./hotspot/src/share/vm/code/pcDesc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/pcDesc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2010, 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 +@@ -29,6 +29,8 @@ + #include "code/scopeDesc.hpp" + #include "memory/resourceArea.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + PcDesc::PcDesc(int pc_offset, int scope_decode_offset, int obj_decode_offset) { + _pc_offset = pc_offset; + _scope_decode_offset = scope_decode_offset; +--- ./hotspot/src/share/vm/code/relocInfo.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/relocInfo.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -31,6 +31,7 @@ + #include "runtime/stubCodeGenerator.hpp" + #include "utilities/copy.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + const RelocationHolder RelocationHolder::none; // its type is relocInfo::none + +@@ -582,6 +583,18 @@ + _static_call = address_from_scaled_offset(unpack_1_int(), base); + } + ++void trampoline_stub_Relocation::pack_data_to(CodeSection* dest ) { ++ short* p = (short*) dest->locs_end(); ++ CodeSection* insts = dest->outer()->insts(); ++ normalize_address(_owner, insts); ++ p = pack_1_int_to(p, scaled_offset(_owner, insts->start())); ++ dest->set_locs_end((relocInfo*) p); ++} ++ ++void trampoline_stub_Relocation::unpack_data() { ++ address base = binding()->section_start(CodeBuffer::SECT_INSTS); ++ _owner = address_from_scaled_offset(unpack_1_int(), base); ++} + + void external_word_Relocation::pack_data_to(CodeSection* dest) { + short* p = (short*) dest->locs_end(); +@@ -811,6 +824,25 @@ + return NULL; + } + ++// Finds the trampoline address for a call. If no trampoline stub is ++// found NULL is returned which can be handled by the caller. ++address trampoline_stub_Relocation::get_trampoline_for(address call, nmethod* code) { ++ // There are no relocations available when the code gets relocated ++ // because of CodeBuffer expansion. ++ if (code->relocation_size() == 0) ++ return NULL; ++ ++ RelocIterator iter(code, call); ++ while (iter.next()) { ++ if (iter.type() == relocInfo::trampoline_stub_type) { ++ if (iter.trampoline_stub_reloc()->owner() == call) { ++ return iter.addr(); ++ } ++ } ++ } ++ ++ return NULL; ++} + + void static_stub_Relocation::clear_inline_cache() { + // Call stub is only used when calling the interpreted code. +@@ -975,6 +1007,12 @@ + tty->print(" | [static_call=" INTPTR_FORMAT "]", r->static_call()); + break; + } ++ case relocInfo::trampoline_stub_type: ++ { ++ trampoline_stub_Relocation* r = (trampoline_stub_Relocation*) reloc(); ++ tty->print(" | [trampoline owner=" INTPTR_FORMAT "]", r->owner()); ++ break; ++ } + } + tty->cr(); + } +--- ./hotspot/src/share/vm/code/relocInfo.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/relocInfo.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -260,8 +260,8 @@ + poll_type = 10, // polling instruction for safepoints + poll_return_type = 11, // polling instruction for safepoints at return + metadata_type = 12, // metadata that used to be oops +- yet_unused_type_1 = 13, // Still unused +- yet_unused_type_2 = 14, // Still unused ++ trampoline_stub_type = 13, // stub-entry for trampoline ++ yet_unused_type_1 = 14, // Still unused + data_prefix_tag = 15, // tag for a prefix (carries data arguments) + type_mask = 15 // A mask which selects only the above values + }; +@@ -301,6 +301,7 @@ + visitor(poll) \ + visitor(poll_return) \ + visitor(section_word) \ ++ visitor(trampoline_stub) \ + + + public: +@@ -364,7 +365,7 @@ + // "immediate" in the prefix header word itself. This optimization + // is invisible outside this module.) + +- inline friend relocInfo prefix_relocInfo(int datalen = 0); ++ inline friend relocInfo prefix_relocInfo(int datalen); + + protected: + // an immediate relocInfo optimizes a prefix with one 10-bit unsigned value +@@ -459,7 +460,7 @@ + return relocInfo(relocInfo::none, relocInfo::offset_limit() - relocInfo::offset_unit); + } + +-inline relocInfo prefix_relocInfo(int datalen) { ++inline relocInfo prefix_relocInfo(int datalen = 0) { + assert(relocInfo::fits_into_immediate(datalen), "datalen in limits"); + return relocInfo(relocInfo::data_prefix_tag, relocInfo::RAW_BITS, relocInfo::datalen_tag | datalen); + } +@@ -1150,6 +1151,43 @@ + public: + }; + ++// Trampoline Relocations. ++// A trampoline allows to encode a small branch in the code, even if there ++// is the chance that this branch can not reach all possible code locations. ++// If the relocation finds that a branch is too far for the instruction ++// in the code, it can patch it to jump to the trampoline where is ++// sufficient space for a far branch. Needed on PPC. ++class trampoline_stub_Relocation : public Relocation { ++ relocInfo::relocType type() { return relocInfo::trampoline_stub_type; } ++ ++ public: ++ static RelocationHolder spec(address static_call) { ++ RelocationHolder rh = newHolder(); ++ return (new (rh) trampoline_stub_Relocation(static_call)); ++ } ++ ++ private: ++ address _owner; // Address of the NativeCall that owns the trampoline. ++ ++ trampoline_stub_Relocation(address owner) { ++ _owner = owner; ++ } ++ ++ friend class RelocIterator; ++ trampoline_stub_Relocation() { } ++ ++ public: ++ ++ // Return the address of the NativeCall that owns the trampoline. ++ address owner() { return _owner; } ++ ++ void pack_data_to(CodeSection * dest); ++ void unpack_data(); ++ ++ // Find the trampoline stub for a call. ++ static address get_trampoline_for(address call, nmethod* code); ++}; ++ + class external_word_Relocation : public DataRelocation { + relocInfo::relocType type() { return relocInfo::external_word_type; } + +--- ./hotspot/src/share/vm/code/scopeDesc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/scopeDesc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -30,6 +30,7 @@ + #include "oops/oop.inline.hpp" + #include "runtime/handles.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, int obj_decode_offset, bool reexecute, bool return_oop) { + _code = code; +--- ./hotspot/src/share/vm/code/stubs.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/stubs.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -36,6 +36,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +--- ./hotspot/src/share/vm/code/vmreg.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/vmreg.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -47,8 +47,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/adGlobals_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/adGlobals_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/adGlobals_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/adGlobals_ppc_64.hpp" + #endif + #endif + +@@ -70,7 +73,7 @@ + // friend class Location; + private: + enum { +- BAD = -1 ++ BAD_REG = -1 + }; + + +@@ -83,7 +86,7 @@ + + public: + +- static VMReg as_VMReg(int val, bool bad_ok = false) { assert(val > BAD || bad_ok, "invalid"); return (VMReg) (intptr_t) val; } ++ static VMReg as_VMReg(int val, bool bad_ok = false) { assert(val > BAD_REG || bad_ok, "invalid"); return (VMReg) (intptr_t) val; } + + const char* name() { + if (is_reg()) { +@@ -95,8 +98,8 @@ + return "STACKED REG"; + } + } +- static VMReg Bad() { return (VMReg) (intptr_t) BAD; } +- bool is_valid() const { return ((intptr_t) this) != BAD; } ++ static VMReg Bad() { return (VMReg) (intptr_t) BAD_REG; } ++ bool is_valid() const { return ((intptr_t) this) != BAD_REG; } + bool is_stack() const { return (intptr_t) this >= (intptr_t) stack0; } + bool is_reg() const { return is_valid() && !is_stack(); } + +--- ./hotspot/src/share/vm/code/vtableStubs.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/vtableStubs.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -39,6 +39,8 @@ + #include "opto/matcher.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // ----------------------------------------------------------------------------------------- + // Implementation of VtableStub + +@@ -55,6 +57,9 @@ + const int chunk_factor = 32; + if (_chunk == NULL || _chunk + real_size > _chunk_end) { + const int bytes = chunk_factor * real_size + pd_code_alignment(); ++ ++ // There is a dependency on the name of the blob in src/share/vm/prims/jvmtiCodeBlobEvents.cpp ++ // If changing the name, update the other file accordingly. + BufferBlob* blob = BufferBlob::create("vtable chunks", bytes); + if (blob == NULL) { + return NULL; +@@ -62,12 +67,6 @@ + _chunk = blob->content_begin(); + _chunk_end = _chunk + bytes; + Forte::register_stub("vtable stub", _chunk, _chunk_end); +- // Notify JVMTI about this stub. The event will be recorded by the enclosing +- // JvmtiDynamicCodeEventCollector and posted when this thread has released +- // all locks. +- if (JvmtiExport::should_post_dynamic_code_generated()) { +- JvmtiExport::post_dynamic_code_generated_while_holding_locks("vtable stub", _chunk, _chunk_end); +- } + align_chunk(); + } + assert(_chunk + real_size <= _chunk_end, "bad allocation"); +@@ -130,6 +129,13 @@ + is_vtable_stub? "vtbl": "itbl", vtable_index, VtableStub::receiver_location()); + Disassembler::decode(s->code_begin(), s->code_end()); + } ++ // Notify JVMTI about this stub. The event will be recorded by the enclosing ++ // JvmtiDynamicCodeEventCollector and posted when this thread has released ++ // all locks. ++ if (JvmtiExport::should_post_dynamic_code_generated()) { ++ JvmtiExport::post_dynamic_code_generated_while_holding_locks(is_vtable_stub? "vtable stub": "itable stub", ++ s->code_begin(), s->code_end()); ++ } + } + return s->entry_point(); + } +@@ -195,6 +201,14 @@ + VtableStubs::initialize(); + } + ++void VtableStubs::vtable_stub_do(void f(VtableStub*)) { ++ for (int i = 0; i < N; i++) { ++ for (VtableStub* s = _table[i]; s != NULL; s = s->next()) { ++ f(s); ++ } ++ } ++} ++ + + //----------------------------------------------------------------------------------------------------- + // Non-product code +--- ./hotspot/src/share/vm/code/vtableStubs.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/code/vtableStubs.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -131,6 +131,7 @@ + static VtableStub* stub_containing(address pc); // stub containing pc or NULL + static int number_of_vtable_stubs() { return _number_of_vtable_stubs; } + static void initialize(); ++ static void vtable_stub_do(void f(VtableStub*)); // iterates over all vtable stubs + }; + + #endif // SHARE_VM_CODE_VTABLESTUBS_HPP +--- ./hotspot/src/share/vm/compiler/compileBroker.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/compiler/compileBroker.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -132,9 +132,9 @@ + // The installed compiler(s) + AbstractCompiler* CompileBroker::_compilers[2]; + +-// These counters are used for assigning id's to each compilation +-uint CompileBroker::_compilation_id = 0; +-uint CompileBroker::_osr_compilation_id = 0; ++// These counters are used to assign an unique ID to each compilation. ++volatile jint CompileBroker::_compilation_id = 0; ++volatile jint CompileBroker::_osr_compilation_id = 0; + + // Debugging information + int CompileBroker::_last_compile_type = no_compile; +@@ -206,7 +206,7 @@ + void log_nmethod(JavaThread* thread, nmethod* nm) { + log(thread, "nmethod %d%s " INTPTR_FORMAT " code ["INTPTR_FORMAT ", " INTPTR_FORMAT "]", + nm->compile_id(), nm->is_osr_method() ? "%" : "", +- nm, nm->code_begin(), nm->code_end()); ++ p2i(nm), p2i(nm->code_begin()), p2i(nm->code_end())); + } + + void log_failure(JavaThread* thread, CompileTask* task, const char* reason, const char* retry_message) { +@@ -1158,7 +1158,7 @@ + // We now know that this compilation is not pending, complete, + // or prohibited. Assign a compile_id to this compilation + // and check to see if it is in our [Start..Stop) range. +- uint compile_id = assign_compile_id(method, osr_bci); ++ int compile_id = assign_compile_id(method, osr_bci); + if (compile_id == 0) { + // The compilation falls outside the allowed range. + return; +@@ -1305,18 +1305,12 @@ + // do the compilation + if (method->is_native()) { + if (!PreferInterpreterNativeStubs || method->is_method_handle_intrinsic()) { +- // Acquire our lock. +- int compile_id; +- { +- MutexLocker locker(MethodCompileQueue_lock, THREAD); +- compile_id = assign_compile_id(method, standard_entry_bci); +- } + // To properly handle the appendix argument for out-of-line calls we are using a small trampoline that + // pops off the appendix argument and jumps to the target (see gen_special_dispatch in SharedRuntime). + // + // Since normal compiled-to-compiled calls are not able to handle such a thing we MUST generate an adapter + // in this case. If we can't generate one and use it we can not execute the out-of-line method handle calls. +- (void) AdapterHandlerLibrary::create_native_wrapper(method, compile_id); ++ AdapterHandlerLibrary::create_native_wrapper(method); + } else { + return NULL; + } +@@ -1419,27 +1413,28 @@ + return false; + } + +- +-// ------------------------------------------------------------------ +-// CompileBroker::assign_compile_id +-// +-// Assign a serialized id number to this compilation request. If the +-// number falls out of the allowed range, return a 0. OSR +-// compilations may be numbered separately from regular compilations +-// if certain debugging flags are used. +-uint CompileBroker::assign_compile_id(methodHandle method, int osr_bci) { +- assert(MethodCompileQueue_lock->owner() == Thread::current(), +- "must hold the compilation queue lock"); ++/** ++ * Generate serialized IDs for compilation requests. If certain debugging flags are used ++ * and the ID is not within the specified range, the method is not compiled and 0 is returned. ++ * The function also allows to generate separate compilation IDs for OSR compilations. ++ */ ++int CompileBroker::assign_compile_id(methodHandle method, int osr_bci) { ++#ifdef ASSERT + bool is_osr = (osr_bci != standard_entry_bci); +- uint id; +- if (CICountOSR && is_osr) { +- id = ++_osr_compilation_id; +- if ((uint)CIStartOSR <= id && id < (uint)CIStopOSR) { ++ int id; ++ if (method->is_native()) { ++ assert(!is_osr, "can't be osr"); ++ // Adapters, native wrappers and method handle intrinsics ++ // should be generated always. ++ return Atomic::add(1, &_compilation_id); ++ } else if (CICountOSR && is_osr) { ++ id = Atomic::add(1, &_osr_compilation_id); ++ if (CIStartOSR <= id && id < CIStopOSR) { + return id; + } + } else { +- id = ++_compilation_id; +- if ((uint)CIStart <= id && id < (uint)CIStop) { ++ id = Atomic::add(1, &_compilation_id); ++ if (CIStart <= id && id < CIStop) { + return id; + } + } +@@ -1447,6 +1442,11 @@ + // Method was not in the appropriate compilation range. + method->set_not_compilable_quietly(); + return 0; ++#else ++ // CICountOSR is a develop flag and set to 'false' by default. In a product built, ++ // only _compilation_id is incremented. ++ return Atomic::add(1, &_compilation_id); ++#endif + } + + +@@ -1791,7 +1791,7 @@ + if (xtty != NULL) { + ttyLocker ttyl; + // Record any per thread log files +- xtty->elem("thread_logfile thread='%d' filename='%s'", thread_id, file_name); ++ xtty->elem("thread_logfile thread='" INTX_FORMAT "' filename='%s'", thread_id, file_name); + } + return; + } +@@ -1822,7 +1822,7 @@ + if (_should_block) { + #ifndef PRODUCT + if (PrintCompilation && (Verbose || WizardMode)) +- tty->print_cr("compiler thread " INTPTR_FORMAT " poll detects block request", Thread::current()); ++ tty->print_cr("compiler thread " INTPTR_FORMAT " poll detects block request", p2i(Thread::current())); + #endif + ThreadInVMfromNative tivfn(JavaThread::current()); + } +@@ -1839,7 +1839,7 @@ + CodeCache::print_summary(&s, detailed); + } + ttyLocker ttyl; +- tty->print(s.as_string()); ++ tty->print("%s", s.as_string()); + } + + // ------------------------------------------------------------------ +@@ -2044,7 +2044,7 @@ + // Lock to prevent tearing + ttyLocker ttyl; + xtty->begin_elem("code_cache_full"); +- xtty->print(s.as_string()); ++ xtty->print("%s", s.as_string()); + xtty->stamp(); + xtty->end_elem(); + } +--- ./hotspot/src/share/vm/compiler/compileBroker.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/compiler/compileBroker.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -246,6 +246,8 @@ + + // Compile type Information for print_last_compile() and CompilerCounters + enum { no_compile, normal_compile, osr_compile, native_compile }; ++ static int assign_compile_id (methodHandle method, int osr_bci); ++ + + private: + static bool _initialized; +@@ -258,9 +260,8 @@ + static AbstractCompiler* _compilers[2]; + + // These counters are used for assigning id's to each compilation +- static uint _compilation_id; +- static uint _osr_compilation_id; +- static uint _native_compilation_id; ++ static volatile jint _compilation_id; ++ static volatile jint _osr_compilation_id; + + static int _last_compile_type; + static int _last_compile_level; +@@ -321,7 +322,6 @@ + static void init_compiler_threads(int c1_compiler_count, int c2_compiler_count); + static bool compilation_is_complete (methodHandle method, int osr_bci, int comp_level); + static bool compilation_is_prohibited(methodHandle method, int osr_bci, int comp_level); +- static uint assign_compile_id (methodHandle method, int osr_bci); + static bool is_compile_blocking (methodHandle method, int osr_bci); + static void preload_classes (methodHandle method, TRAPS); + +--- ./hotspot/src/share/vm/compiler/compileLog.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/compiler/compileLog.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -294,7 +294,7 @@ + // Print about successful method inlining. + void CompileLog::inline_success(const char* reason) { + begin_elem("inline_success reason='"); +- text(reason); ++ text("%s", reason); + end_elem("'"); + } + +@@ -304,7 +304,7 @@ + // Print about failed method inlining. + void CompileLog::inline_fail(const char* reason) { + begin_elem("inline_fail reason='"); +- text(reason); ++ text("%s", reason); + end_elem("'"); + } + +@@ -330,5 +330,5 @@ + void CompileLog::code_cache_state() { + begin_elem("code_cache"); + CodeCache::log_state(this); +- end_elem(""); ++ end_elem("%s", ""); + } +--- ./hotspot/src/share/vm/compiler/compileLog.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/compiler/compileLog.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -54,7 +54,7 @@ + + static CompileLog* _first; // head of static chain + +- void va_tag(bool push, const char* format, va_list ap); ++ void va_tag(bool push, const char* format, va_list ap) ATTRIBUTE_PRINTF(3, 0); + + public: + CompileLog(const char* file_name, FILE* fp, intx thread_id); +@@ -68,7 +68,7 @@ + // or reset, context string will be silently ignored + stringStream* context() { return &_context; } + void clear_context() { context()->reset(); } +- void set_context(const char* format, ...); ++ void set_context(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + + void name(ciSymbol* s); // name='s' + void name(Symbol* s) { xmlStream::name(s); } +--- ./hotspot/src/share/vm/compiler/compilerOracle.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/compiler/compilerOracle.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -539,7 +539,7 @@ + tty->print_cr("CompilerOracle: unrecognized line"); + tty->print_cr(" \"%s\"", original_line); + if (error_msg != NULL) { +- tty->print_cr(error_msg); ++ tty->print_cr("%s", error_msg); + } + } + } +@@ -661,7 +661,7 @@ + char method_sep = have_colon ? ':' : '.'; + + if (Verbose) { +- tty->print_cr(line); ++ tty->print_cr("%s", line); + } + + ResourceMark rm; +--- ./hotspot/src/share/vm/compiler/disassembler.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/compiler/disassembler.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2008, 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 +@@ -51,6 +51,8 @@ + #include "shark/sharkEntry.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + void* Disassembler::_library = NULL; + bool Disassembler::_tried_to_load_library = false; + +@@ -411,6 +413,7 @@ + return env->handle_event(event, (address) arg); + } + ++ATTRIBUTE_PRINTF(2, 3) + static int printf_to_env(void* env_pv, const char* format, ...) { + decode_env* env = (decode_env*) env_pv; + outputStream* st = env->output(); +--- ./hotspot/src/share/vm/compiler/disassembler.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/compiler/disassembler.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -36,6 +36,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +--- ./hotspot/src/share/vm/compiler/methodLiveness.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/compiler/methodLiveness.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2011, 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 +@@ -32,6 +32,8 @@ + #include "memory/allocation.inline.hpp" + #include "utilities/bitMap.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // The MethodLiveness class performs a simple liveness analysis on a method + // in order to decide which locals are live (that is, will be used again) at + // a particular bytecode index (bci). +--- ./hotspot/src/share/vm/compiler/oopMap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/compiler/oopMap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -646,8 +646,8 @@ + tty->print_cr( + "Add derived pointer@" INTPTR_FORMAT + " - Derived: " INTPTR_FORMAT +- " Base: " INTPTR_FORMAT " (@" INTPTR_FORMAT ") (Offset: %d)", +- derived_loc, (address)*derived_loc, (address)*base_loc, base_loc, offset ++ " Base: " INTPTR_FORMAT " (@" INTPTR_FORMAT ") (Offset: " INTX_FORMAT ")", ++ p2i(derived_loc), p2i((address)*derived_loc), p2i((address)*base_loc), p2i(base_loc), offset + ); + } + // Set derived oop location to point to base. +@@ -674,8 +674,8 @@ + + if (TraceDerivedPointers) { + tty->print_cr("Updating derived pointer@" INTPTR_FORMAT +- " - Derived: " INTPTR_FORMAT " Base: " INTPTR_FORMAT " (Offset: %d)", +- derived_loc, (address)*derived_loc, (address)base, offset); ++ " - Derived: " INTPTR_FORMAT " Base: " INTPTR_FORMAT " (Offset: " INTX_FORMAT ")", ++ p2i(derived_loc), p2i((address)*derived_loc), p2i((address)base), offset); + } + + // Delete entry +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -122,7 +122,7 @@ + + template + void AdaptiveFreeList::return_chunk_at_tail(Chunk* chunk) { +- return_chunk_at_tail(chunk, true); ++ AdaptiveFreeList::return_chunk_at_tail(chunk, true); + } + + template +@@ -157,7 +157,7 @@ + " split_deaths(" SIZE_FORMAT ")" + " coal_deaths(" SIZE_FORMAT ")" + " + count(" SSIZE_FORMAT ")", +- this, size(), _allocation_stats.prev_sweep(), _allocation_stats.split_births(), ++ p2i(this), size(), _allocation_stats.prev_sweep(), _allocation_stats.split_births(), + _allocation_stats.split_births(), _allocation_stats.split_deaths(), + _allocation_stats.coal_deaths(), count())); + } +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -37,6 +37,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -427,7 +427,7 @@ + void LinearAllocBlock::print_on(outputStream* st) const { + st->print_cr(" LinearAllocBlock: ptr = " PTR_FORMAT ", word_size = " SIZE_FORMAT + ", refillsize = " SIZE_FORMAT ", allocation_size_limit = " SIZE_FORMAT, +- _ptr, _word_size, _refillSize, _allocation_size_limit); ++ p2i(_ptr), _word_size, _refillSize, _allocation_size_limit); + } + + void CompactibleFreeListSpace::print_on(outputStream* st) const { +@@ -458,7 +458,7 @@ + for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; + fc = fc->next()) { + gclog_or_tty->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s", +- fc, (HeapWord*)fc + i, ++ p2i(fc), p2i((HeapWord*)fc + i), + fc->cantCoalesce() ? "\t CC" : ""); + } + } +@@ -502,7 +502,7 @@ + if (_sp->block_is_obj(addr)) { + const bool dead = _post_remark && !_live_bit_map->isMarked(addr); + _st->print_cr(PTR_FORMAT ": %s object of size " SIZE_FORMAT "%s", +- addr, ++ p2i(addr), + dead ? "dead" : "live", + sz, + (!dead && CMSPrintObjectsInDump) ? ":" : "."); +@@ -512,7 +512,7 @@ + } + } else { // free block + _st->print_cr(PTR_FORMAT ": free block of size " SIZE_FORMAT "%s", +- addr, sz, CMSPrintChunksInDump ? ":" : "."); ++ p2i(addr), sz, CMSPrintChunksInDump ? ":" : "."); + if (CMSPrintChunksInDump) { + ((FreeChunk*)addr)->print_on(_st); + _st->print_cr("--------------------------------------"); +@@ -564,11 +564,11 @@ + "--------------------------------\n"); + size_t total_size = totalSizeInIndexedFreeLists(); + size_t free_blocks = numFreeBlocksInIndexedFreeLists(); +- gclog_or_tty->print("Total Free Space: %d\n", total_size); +- gclog_or_tty->print("Max Chunk Size: %d\n", maxChunkSizeInIndexedFreeLists()); +- gclog_or_tty->print("Number of Blocks: %d\n", free_blocks); ++ gclog_or_tty->print("Total Free Space: " SIZE_FORMAT "\n", total_size); ++ gclog_or_tty->print("Max Chunk Size: " SIZE_FORMAT "\n", maxChunkSizeInIndexedFreeLists()); ++ gclog_or_tty->print("Number of Blocks: " SIZE_FORMAT "\n", free_blocks); + if (free_blocks != 0) { +- gclog_or_tty->print("Av. Block Size: %d\n", total_size/free_blocks); ++ gclog_or_tty->print("Av. Block Size: " SIZE_FORMAT "\n", total_size/free_blocks); + } + } + +@@ -997,6 +997,13 @@ + if (FreeChunk::indicatesFreeChunk(p)) { + volatile FreeChunk* fc = (volatile FreeChunk*)p; + size_t res = fc->size(); ++ ++ // Bugfix for systems with weak memory model (PPC64/IA64). The ++ // block's free bit was set and we have read the size of the ++ // block. Acquire and check the free bit again. If the block is ++ // still free, the read size is correct. ++ OrderAccess::acquire(); ++ + // If the object is still a free chunk, return the size, else it + // has been allocated so try again. + if (FreeChunk::indicatesFreeChunk(p)) { +@@ -1010,6 +1017,12 @@ + assert(k->is_klass(), "Should really be klass oop."); + oop o = (oop)p; + assert(o->is_oop(true /* ignore mark word */), "Should be an oop."); ++ ++ // Bugfix for systems with weak memory model (PPC64/IA64). ++ // The object o may be an array. Acquire to make sure that the array ++ // size (third word) is consistent. ++ OrderAccess::acquire(); ++ + size_t res = o->size_given_klass(k); + res = adjustObjectSize(res); + assert(res != 0, "Block size should not be 0"); +@@ -1040,6 +1053,13 @@ + if (FreeChunk::indicatesFreeChunk(p)) { + volatile FreeChunk* fc = (volatile FreeChunk*)p; + size_t res = fc->size(); ++ ++ // Bugfix for systems with weak memory model (PPC64/IA64). The ++ // free bit of the block was set and we have read the size of ++ // the block. Acquire and check the free bit again. If the ++ // block is still free, the read size is correct. ++ OrderAccess::acquire(); ++ + if (FreeChunk::indicatesFreeChunk(p)) { + assert(res != 0, "Block size should not be 0"); + assert(loops == 0, "Should be 0"); +@@ -1055,6 +1075,12 @@ + assert(k->is_klass(), "Should really be klass oop."); + oop o = (oop)p; + assert(o->is_oop(), "Should be an oop"); ++ ++ // Bugfix for systems with weak memory model (PPC64/IA64). ++ // The object o may be an array. Acquire to make sure that the array ++ // size (third word) is consistent. ++ OrderAccess::acquire(); ++ + size_t res = o->size_given_klass(k); + res = adjustObjectSize(res); + assert(res != 0, "Block size should not be 0"); +@@ -1704,8 +1730,8 @@ + _dictionary->return_chunk(chunk); + #ifndef PRODUCT + if (CMSCollector::abstract_state() != CMSCollector::Sweeping) { +- TreeChunk* tc = TreeChunk::as_TreeChunk(chunk); +- TreeList* tl = tc->list(); ++ TreeChunk >* tc = TreeChunk >::as_TreeChunk(chunk); ++ TreeList >* tl = tc->list(); + tl->verify_stats(); + } + #endif // PRODUCT +@@ -1985,7 +2011,7 @@ + assert(ur.contains(urasm), + err_msg(" Error at save_marks(): [" PTR_FORMAT "," PTR_FORMAT ")" + " should contain [" PTR_FORMAT "," PTR_FORMAT ")", +- ur.start(), ur.end(), urasm.start(), urasm.end())); ++ p2i(ur.start()), p2i(ur.end()), p2i(urasm.start()), p2i(urasm.end()))); + #endif + // inform allocator that promotions should be tracked. + assert(_promoInfo.noPromotions(), "_promoInfo inconsistency"); +@@ -2155,7 +2181,7 @@ + for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { + AdaptiveFreeList* fl = &_indexedFreeList[i]; + if (PrintFLSStatistics > 1) { +- gclog_or_tty->print("size[%d] : ", i); ++ gclog_or_tty->print("size[" SIZE_FORMAT "] : ", i); + } + fl->compute_desired(inter_sweep_current, inter_sweep_estimate, intra_sweep_estimate); + fl->set_coal_desired((ssize_t)((double)fl->desired() * CMSSmallCoalSurplusPercent)); +@@ -2208,7 +2234,7 @@ + if (PrintFLSStatistics > 0) { + HeapWord* largestAddr = (HeapWord*) dictionary()->find_largest_dict(); + gclog_or_tty->print_cr("CMS: Large block " PTR_FORMAT, +- largestAddr); ++ p2i(largestAddr)); + } + setFLSurplus(); + setFLHints(); +@@ -2357,8 +2383,8 @@ + gclog_or_tty->print_cr( + " Current: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n" + " Previous: addr = " PTR_FORMAT ", size = " SIZE_FORMAT ", obj = %s, live = %s \n", +- addr, res, was_obj ?"true":"false", was_live ?"true":"false", +- _last_addr, _last_size, _last_was_obj?"true":"false", _last_was_live?"true":"false"); ++ p2i(addr), res, was_obj ?"true":"false", was_live ?"true":"false", ++ p2i(_last_addr), _last_size, _last_was_obj?"true":"false", _last_was_live?"true":"false"); + _sp->print_on(gclog_or_tty); + guarantee(false, "Seppuku!"); + } +@@ -2515,10 +2541,10 @@ + + #ifndef PRODUCT + void CompactibleFreeListSpace::check_free_list_consistency() const { +- assert((TreeChunk::min_size() <= IndexSetSize), ++ assert((TreeChunk >::min_size() <= IndexSetSize), + "Some sizes can't be allocated without recourse to" + " linear allocation buffers"); +- assert((TreeChunk::min_size()*HeapWordSize == sizeof(TreeChunk)), ++ assert((TreeChunk >::min_size()*HeapWordSize == sizeof(TreeChunk >)), + "else MIN_TREE_CHUNK_SIZE is wrong"); + assert(IndexSetStart != 0, "IndexSetStart not initialized"); + assert(IndexSetStride != 0, "IndexSetStride not initialized"); +@@ -2686,7 +2712,7 @@ + _global_num_workers[i] = 0; + _global_num_blocks[i] = 0; + if (PrintOldPLAB) { +- gclog_or_tty->print_cr("[%d]: %d", i, (size_t)_blocks_to_claim[i].average()); ++ gclog_or_tty->print_cr("[" SIZE_FORMAT "]: " SIZE_FORMAT, i, (size_t)_blocks_to_claim[i].average()); + } + } + } +@@ -2725,7 +2751,7 @@ + } + } + if (PrintOldPLAB) { +- gclog_or_tty->print_cr("%d[%d]: %d/%d/%d", ++ gclog_or_tty->print_cr("%d[" SIZE_FORMAT "]: " SIZE_FORMAT "/" SIZE_FORMAT "/" SIZE_FORMAT, + tid, i, num_retire, _num_blocks[i], (size_t)_blocks_to_claim[i].average()); + } + // Reset stats for next round +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -404,7 +404,7 @@ + if (CMSTraceSweeper) { + gclog_or_tty->print_cr(">>>>> Saving sweep limit " PTR_FORMAT + " for space [" PTR_FORMAT "," PTR_FORMAT ") <<<<<<", +- _sweep_limit, bottom(), end()); ++ p2i(_sweep_limit), p2i(bottom()), p2i(end())); + } + } + NOT_PRODUCT( +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -63,6 +63,8 @@ + #include "services/memoryService.hpp" + #include "services/runtimeService.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // statics + CMSCollector* ConcurrentMarkSweepGeneration::_collector = NULL; + bool CMSCollector::_full_gc_requested = false; +@@ -308,8 +310,7 @@ + _cmsGen->refs_discovery_is_mt(), // mt discovery + (int) MAX2(ConcGCThreads, ParallelGCThreads), // mt discovery degree + _cmsGen->refs_discovery_is_atomic(), // discovery is not atomic +- &_is_alive_closure, // closure for liveness info +- false); // next field updates do not need write barrier ++ &_is_alive_closure); // closure for liveness info + // Initialize the _ref_processor field of CMSGen + _cmsGen->set_ref_processor(_ref_processor); + +@@ -1181,7 +1182,7 @@ + gclog_or_tty->print(" icms alloc limits: " + PTR_FORMAT "," PTR_FORMAT + " (" SIZE_FORMAT "%%," SIZE_FORMAT "%%) ", +- _icms_start_limit, _icms_stop_limit, ++ p2i(_icms_start_limit), p2i(_icms_stop_limit), + percent_of_space(eden, _icms_start_limit), + percent_of_space(eden, _icms_stop_limit)); + if (Verbose) { +@@ -1209,7 +1210,7 @@ + gclog_or_tty->print_cr(" start limit top=" PTR_FORMAT + ", new limit=" PTR_FORMAT + " (" SIZE_FORMAT "%%)", +- top, _icms_stop_limit, ++ p2i(top), p2i(_icms_stop_limit), + percent_of_space(space, _icms_stop_limit)); + } + ConcurrentMarkSweepThread::start_icms(); +@@ -1226,7 +1227,7 @@ + gclog_or_tty->print_cr(" +stop limit top=" PTR_FORMAT + ", new limit=" PTR_FORMAT + " (" SIZE_FORMAT "%%)", +- top, space->end(), ++ p2i(top), p2i(space->end()), + percent_of_space(space, space->end())); + } + ConcurrentMarkSweepThread::stop_icms(); +@@ -1501,7 +1502,7 @@ + if (PrintCMSInitiationStatistics && stats().valid()) { + gclog_or_tty->print("CMSCollector shouldConcurrentCollect: "); + gclog_or_tty->stamp(); +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + stats().print_on(gclog_or_tty); + gclog_or_tty->print_cr("time_until_cms_gen_full %3.7f", + stats().time_until_cms_gen_full()); +@@ -2496,7 +2497,8 @@ + } + + void CMSCollector::report_heap_summary(GCWhen::Type when) { +- _gc_tracer_cm->report_gc_heap_summary(when, _last_heap_summary, _last_metaspace_summary); ++ _gc_tracer_cm->report_gc_heap_summary(when, _last_heap_summary); ++ _gc_tracer_cm->report_metaspace_summary(when, _last_metaspace_summary); + } + + void CMSCollector::collect_in_foreground(bool clear_all_soft_refs, GCCause::Cause cause) { +@@ -3576,7 +3578,7 @@ + _collector->cmsGen()->short_name(), + _phase, _collector->timerValue(), _wallclock.seconds()); + if (_print_cr) { +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + } + if (PrintCMSStatistics != 0) { + gclog_or_tty->print_cr(" (CMS-concurrent-%s yielded %d times)", _phase, +@@ -6362,7 +6364,9 @@ + verify_overflow_empty(); + + if (should_unload_classes()) { +- ClassLoaderDataGraph::purge(); ++ // Delay purge to the beginning of the next safepoint. Metaspace::contains ++ // requires that the virtual spaces are stable and not deleted. ++ ClassLoaderDataGraph::set_should_purge(true); + } + + _intra_sweep_timer.stop(); +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -111,7 +111,7 @@ + // From this time Thread::current() should be working. + assert(this == Thread::current(), "just checking"); + if (BindCMSThreadToCPU && !os::bind_to_processor(CPUForCMSThread)) { +- warning("Couldn't bind CMS thread to processor %u", CPUForCMSThread); ++ warning("Couldn't bind CMS thread to processor " UINTX_FORMAT, CPUForCMSThread); + } + // Wait until Universe::is_fully_initialized() + { +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -241,7 +241,7 @@ + jio_snprintf(buf, sizeof(buf), " [%.3f: CMSThread %s] ", + ts.seconds(), desc); + buf[sizeof(buf) - 1] = '\0'; +- gclog_or_tty->print(buf); ++ gclog_or_tty->print("%s", buf); + } + } + +@@ -273,7 +273,7 @@ + inline void tick() { + _ticks++; + if (CMSLoopWarn && _ticks % _threshold == 0) { +- warning("%s has looped %d times %s", _src, _ticks, _msg); ++ warning("%s has looped " INTX_FORMAT " times %s", _src, _ticks, _msg); + } + } + }; +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,6 +27,8 @@ + #include "memory/freeBlockDictionary.hpp" + #include "utilities/copy.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #ifndef PRODUCT + + #define baadbabeHeapWord badHeapWordVal +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2010, 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 +@@ -28,6 +28,8 @@ + #include "oops/markOop.inline.hpp" + #include "oops/oop.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + ///////////////////////////////////////////////////////////////////////// + //// PromotionInfo + ///////////////////////////////////////////////////////////////////////// +--- ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -34,6 +34,7 @@ + #include "runtime/os.hpp" + #include "utilities/dtrace.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + #ifndef USDT2 + HS_DTRACE_PROBE_DECL(hs_private, cms__initmark__begin); +--- ./hotspot/src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -98,116 +98,4 @@ + _closure_app_seconds(0.0) { } + }; + +-class BufferingOopsInGenClosure: public OopsInGenClosure { +- BufferingOopClosure _boc; +- OopsInGenClosure* _oc; +- protected: +- template inline void do_oop_work(T* p) { +- assert(generation()->is_in_reserved((void*)p), "Must be in!"); +- _boc.do_oop(p); +- } +- public: +- BufferingOopsInGenClosure(OopsInGenClosure *oc) : +- _boc(oc), _oc(oc) {} +- +- virtual void do_oop(narrowOop* p) { do_oop_work(p); } +- virtual void do_oop(oop* p) { do_oop_work(p); } +- +- void done() { +- _boc.done(); +- } +- +- double closure_app_seconds () { +- return _boc.closure_app_seconds(); +- } +- +- void set_generation(Generation* gen) { +- OopsInGenClosure::set_generation(gen); +- _oc->set_generation(gen); +- } +- +- void reset_generation() { +- // Make sure we finish the current work with the current generation. +- _boc.done(); +- OopsInGenClosure::reset_generation(); +- _oc->reset_generation(); +- } +- +-}; +- +- +-class BufferingOopsInHeapRegionClosure: public OopsInHeapRegionClosure { +-private: +- enum PrivateConstants { +- BufferLength = 1024 +- }; +- +- StarTask _buffer[BufferLength]; +- StarTask* _buffer_top; +- StarTask* _buffer_curr; +- +- HeapRegion* _hr_buffer[BufferLength]; +- HeapRegion** _hr_curr; +- +- OopsInHeapRegionClosure* _oc; +- double _closure_app_seconds; +- +- void process_buffer () { +- +- assert((_hr_curr - _hr_buffer) == (_buffer_curr - _buffer), +- "the two lengths should be the same"); +- +- double start = os::elapsedTime(); +- HeapRegion** hr_curr = _hr_buffer; +- HeapRegion* hr_prev = NULL; +- for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) { +- HeapRegion* region = *hr_curr; +- if (region != hr_prev) { +- _oc->set_region(region); +- hr_prev = region; +- } +- if (curr->is_narrow()) { +- assert(UseCompressedOops, "Error"); +- _oc->do_oop((narrowOop*)(*curr)); +- } else { +- _oc->do_oop((oop*)(*curr)); +- } +- ++hr_curr; +- } +- _buffer_curr = _buffer; +- _hr_curr = _hr_buffer; +- _closure_app_seconds += (os::elapsedTime() - start); +- } +- +-public: +- virtual void do_oop(narrowOop* p) { do_oop_work(p); } +- virtual void do_oop( oop* p) { do_oop_work(p); } +- +- template void do_oop_work(T* p) { +- if (_buffer_curr == _buffer_top) { +- assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr"); +- process_buffer(); +- } +- StarTask new_ref(p); +- *_buffer_curr = new_ref; +- ++_buffer_curr; +- *_hr_curr = _from; +- ++_hr_curr; +- } +- void done () { +- if (_buffer_curr > _buffer) { +- assert(_hr_curr > _hr_buffer, "_hr_curr should be consistent with _buffer_curr"); +- process_buffer(); +- } +- } +- double closure_app_seconds () { +- return _closure_app_seconds; +- } +- BufferingOopsInHeapRegionClosure (OopsInHeapRegionClosure *oc) : +- _oc(oc), +- _buffer_curr(_buffer), _buffer_top(_buffer + BufferLength), +- _hr_curr(_hr_buffer), +- _closure_app_seconds(0.0) { } +-}; +- + #endif // SHARE_VM_GC_IMPLEMENTATION_G1_BUFFERINGOOPCLOSURE_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -57,10 +57,10 @@ + + _threads = NEW_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _n_threads, mtGC); + +- int worker_id_offset = (int)DirtyCardQueueSet::num_par_ids(); ++ uint worker_id_offset = DirtyCardQueueSet::num_par_ids(); + + ConcurrentG1RefineThread *next = NULL; +- for (int i = _n_threads - 1; i >= 0; i--) { ++ for (uint i = _n_threads - 1; i != UINT_MAX; i--) { + ConcurrentG1RefineThread* t = new ConcurrentG1RefineThread(this, next, worker_id_offset, i); + assert(t != NULL, "Conc refine should have been created"); + if (t->osthread() == NULL) { +@@ -87,7 +87,7 @@ + + void ConcurrentG1Refine::stop() { + if (_threads != NULL) { +- for (int i = 0; i < _n_threads; i++) { ++ for (uint i = 0; i < _n_threads; i++) { + _threads[i]->stop(); + } + } +@@ -96,7 +96,7 @@ + void ConcurrentG1Refine::reinitialize_threads() { + reset_threshold_step(); + if (_threads != NULL) { +- for (int i = 0; i < _n_threads; i++) { ++ for (uint i = 0; i < _n_threads; i++) { + _threads[i]->initialize(); + } + } +@@ -104,7 +104,7 @@ + + ConcurrentG1Refine::~ConcurrentG1Refine() { + if (_threads != NULL) { +- for (int i = 0; i < _n_threads; i++) { ++ for (uint i = 0; i < _n_threads; i++) { + delete _threads[i]; + } + FREE_C_HEAP_ARRAY(ConcurrentG1RefineThread*, _threads, mtGC); +@@ -113,7 +113,7 @@ + + void ConcurrentG1Refine::threads_do(ThreadClosure *tc) { + if (_threads != NULL) { +- for (int i = 0; i < _n_threads; i++) { ++ for (uint i = 0; i < _n_threads; i++) { + tc->do_thread(_threads[i]); + } + } +@@ -121,20 +121,20 @@ + + void ConcurrentG1Refine::worker_threads_do(ThreadClosure * tc) { + if (_threads != NULL) { +- for (int i = 0; i < worker_thread_num(); i++) { ++ for (uint i = 0; i < worker_thread_num(); i++) { + tc->do_thread(_threads[i]); + } + } + } + +-int ConcurrentG1Refine::thread_num() { +- int n_threads = (G1ConcRefinementThreads > 0) ? G1ConcRefinementThreads ++uint ConcurrentG1Refine::thread_num() { ++ uint n_threads = (G1ConcRefinementThreads > 0) ? G1ConcRefinementThreads + : ParallelGCThreads; +- return MAX2(n_threads, 1); ++ return MAX2(n_threads, 1); + } + + void ConcurrentG1Refine::print_worker_threads_on(outputStream* st) const { +- for (int i = 0; i < _n_threads; ++i) { ++ for (uint i = 0; i < _n_threads; ++i) { + _threads[i]->print_on(st); + st->cr(); + } +--- ./hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -39,8 +39,8 @@ + + class ConcurrentG1Refine: public CHeapObj { + ConcurrentG1RefineThread** _threads; +- int _n_threads; +- int _n_worker_threads; ++ uint _n_threads; ++ uint _n_worker_threads; + /* + * The value of the update buffer queue length falls into one of 3 zones: + * green, yellow, red. If the value is in [0, green) nothing is +@@ -88,7 +88,7 @@ + // The RS sampling thread + ConcurrentG1RefineThread * sampling_thread() const; + +- static int thread_num(); ++ static uint thread_num(); + + void print_worker_threads_on(outputStream* st) const; + +@@ -100,8 +100,8 @@ + int yellow_zone() const { return _yellow_zone; } + int red_zone() const { return _red_zone; } + +- int total_thread_num() const { return _n_threads; } +- int worker_thread_num() const { return _n_worker_threads; } ++ uint total_thread_num() const { return _n_threads; } ++ uint worker_thread_num() const { return _n_worker_threads; } + + int thread_threshold_step() const { return _thread_threshold_step; } + +--- ./hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -33,7 +33,7 @@ + + ConcurrentG1RefineThread:: + ConcurrentG1RefineThread(ConcurrentG1Refine* cg1r, ConcurrentG1RefineThread *next, +- int worker_id_offset, int worker_id) : ++ uint worker_id_offset, uint worker_id) : + ConcurrentGCThread(), + _worker_id_offset(worker_id_offset), + _worker_id(worker_id), +--- ./hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -38,8 +38,8 @@ + + double _vtime_start; // Initial virtual time. + double _vtime_accum; // Initial virtual time. +- int _worker_id; +- int _worker_id_offset; ++ uint _worker_id; ++ uint _worker_id_offset; + + // The refinement threads collection is linked list. A predecessor can activate a successor + // when the number of the rset update buffer crosses a certain threshold. A successor +@@ -71,7 +71,7 @@ + virtual void run(); + // Constructor + ConcurrentG1RefineThread(ConcurrentG1Refine* cg1r, ConcurrentG1RefineThread* next, +- int worker_id_offset, int worker_id); ++ uint worker_id_offset, uint worker_id); + + void initialize(); + +--- ./hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -537,7 +537,7 @@ + + if (verbose_low()) { + gclog_or_tty->print_cr("[global] init, heap start = "PTR_FORMAT", " +- "heap end = "PTR_FORMAT, _heap_start, _heap_end); ++ "heap end = " INTPTR_FORMAT, p2i(_heap_start), p2i(_heap_end)); + } + + if (!_markBitMap1.allocate(heap_rs)) { +@@ -567,8 +567,8 @@ + _root_regions.init(_g1h, this); + + if (ConcGCThreads > ParallelGCThreads) { +- warning("Can't have more ConcGCThreads (" UINT32_FORMAT ") " +- "than ParallelGCThreads (" UINT32_FORMAT ").", ++ warning("Can't have more ConcGCThreads (" UINTX_FORMAT ") " ++ "than ParallelGCThreads (" UINTX_FORMAT ").", + ConcGCThreads, ParallelGCThreads); + return; + } +@@ -651,7 +651,7 @@ + if (!(mark_stack_size >= 1 && mark_stack_size <= MarkStackSizeMax)) { + warning("Invalid value calculated for MarkStackSize (" UINTX_FORMAT "): " + "must be between " UINTX_FORMAT " and " UINTX_FORMAT, +- mark_stack_size, 1, MarkStackSizeMax); ++ mark_stack_size, (uintx) 1, MarkStackSizeMax); + return; + } + FLAG_SET_ERGO(uintx, MarkStackSize, mark_stack_size); +@@ -662,7 +662,7 @@ + if (!(MarkStackSize >= 1 && MarkStackSize <= MarkStackSizeMax)) { + warning("Invalid value specified for MarkStackSize (" UINTX_FORMAT "): " + "must be between " UINTX_FORMAT " and " UINTX_FORMAT, +- MarkStackSize, 1, MarkStackSizeMax); ++ MarkStackSize, (uintx) 1, MarkStackSizeMax); + return; + } + } else if (FLAG_IS_CMDLINE(MarkStackSizeMax)) { +@@ -819,9 +819,9 @@ + // false before we start remark. At this point we should also be + // in a STW phase. + assert(!concurrent_marking_in_progress(), "invariant"); +- assert(_finger == _heap_end, ++ assert(out_of_regions(), + err_msg("only way to get here: _finger: "PTR_FORMAT", _heap_end: "PTR_FORMAT, +- _finger, _heap_end)); ++ p2i(_finger), p2i(_heap_end))); + update_g1_committed(true); + } + } +@@ -978,7 +978,9 @@ + if (concurrent()) { + ConcurrentGCThread::stsLeave(); + } +- _first_overflow_barrier_sync.enter(); ++ ++ bool barrier_aborted = !_first_overflow_barrier_sync.enter(); ++ + if (concurrent()) { + ConcurrentGCThread::stsJoin(); + } +@@ -986,7 +988,17 @@ + // more work + + if (verbose_low()) { +- gclog_or_tty->print_cr("[%u] leaving first barrier", worker_id); ++ if (barrier_aborted) { ++ gclog_or_tty->print_cr("[%u] aborted first barrier", worker_id); ++ } else { ++ gclog_or_tty->print_cr("[%u] leaving first barrier", worker_id); ++ } ++ } ++ ++ if (barrier_aborted) { ++ // If the barrier aborted we ignore the overflow condition and ++ // just abort the whole marking phase as quickly as possible. ++ return; + } + + // If we're executing the concurrent phase of marking, reset the marking +@@ -1026,14 +1038,20 @@ + if (concurrent()) { + ConcurrentGCThread::stsLeave(); + } +- _second_overflow_barrier_sync.enter(); ++ ++ bool barrier_aborted = !_second_overflow_barrier_sync.enter(); ++ + if (concurrent()) { + ConcurrentGCThread::stsJoin(); + } + // at this point everything should be re-initialized and ready to go + + if (verbose_low()) { +- gclog_or_tty->print_cr("[%u] leaving second barrier", worker_id); ++ if (barrier_aborted) { ++ gclog_or_tty->print_cr("[%u] aborted second barrier", worker_id); ++ } else { ++ gclog_or_tty->print_cr("[%u] leaving second barrier", worker_id); ++ } + } + } + +@@ -1422,7 +1440,7 @@ + assert(start <= hr->end() && start <= ntams && ntams <= hr->end(), + err_msg("Preconditions not met - " + "start: "PTR_FORMAT", ntams: "PTR_FORMAT", end: "PTR_FORMAT, +- start, ntams, hr->end())); ++ p2i(start), p2i(ntams), p2i(hr->end()))); + + // Find the first marked object at or after "start". + start = _bm->getNextMarkedWordAddress(start, ntams); +@@ -1607,7 +1625,7 @@ + if (failures > 0 && _verbose) { + gclog_or_tty->print_cr("Region " HR_FORMAT ", ntams: " PTR_FORMAT ", " + "marked_bytes: calc/actual " SIZE_FORMAT "/" SIZE_FORMAT, +- HR_FORMAT_PARAMS(hr), hr->next_top_at_mark_start(), ++ HR_FORMAT_PARAMS(hr), p2i(hr->next_top_at_mark_start()), + _calc_cl.region_marked_bytes(), hr->next_marked_bytes()); + } + +@@ -1619,7 +1637,6 @@ + } + }; + +- + class G1ParVerifyFinalCountTask: public AbstractGangTask { + protected: + G1CollectedHeap* _g1h; +@@ -1805,34 +1822,32 @@ + + class G1NoteEndOfConcMarkClosure : public HeapRegionClosure { + G1CollectedHeap* _g1; +- int _worker_num; + size_t _max_live_bytes; + uint _regions_claimed; + size_t _freed_bytes; + FreeRegionList* _local_cleanup_list; +- OldRegionSet* _old_proxy_set; +- HumongousRegionSet* _humongous_proxy_set; ++ HeapRegionSetCount _old_regions_removed; ++ HeapRegionSetCount _humongous_regions_removed; + HRRSCleanupTask* _hrrs_cleanup_task; + double _claimed_region_time; + double _max_region_time; + + public: + G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1, +- int worker_num, + FreeRegionList* local_cleanup_list, +- OldRegionSet* old_proxy_set, +- HumongousRegionSet* humongous_proxy_set, + HRRSCleanupTask* hrrs_cleanup_task) : +- _g1(g1), _worker_num(worker_num), ++ _g1(g1), + _max_live_bytes(0), _regions_claimed(0), + _freed_bytes(0), + _claimed_region_time(0.0), _max_region_time(0.0), + _local_cleanup_list(local_cleanup_list), +- _old_proxy_set(old_proxy_set), +- _humongous_proxy_set(humongous_proxy_set), ++ _old_regions_removed(), ++ _humongous_regions_removed(), + _hrrs_cleanup_task(hrrs_cleanup_task) { } + + size_t freed_bytes() { return _freed_bytes; } ++ const HeapRegionSetCount& old_regions_removed() { return _old_regions_removed; } ++ const HeapRegionSetCount& humongous_regions_removed() { return _humongous_regions_removed; } + + bool doHeapRegion(HeapRegion *hr) { + if (hr->continuesHumongous()) { +@@ -1845,13 +1860,22 @@ + _regions_claimed++; + hr->note_end_of_marking(); + _max_live_bytes += hr->max_live_bytes(); +- _g1->free_region_if_empty(hr, +- &_freed_bytes, +- _local_cleanup_list, +- _old_proxy_set, +- _humongous_proxy_set, +- _hrrs_cleanup_task, +- true /* par */); ++ ++ if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) { ++ _freed_bytes += hr->used(); ++ hr->set_containing_set(NULL); ++ if (hr->isHumongous()) { ++ assert(hr->startsHumongous(), "we should only see starts humongous"); ++ _humongous_regions_removed.increment(1u, hr->capacity()); ++ _g1->free_humongous_region(hr, _local_cleanup_list, true); ++ } else { ++ _old_regions_removed.increment(1u, hr->capacity()); ++ _g1->free_region(hr, _local_cleanup_list, true); ++ } ++ } else { ++ hr->rem_set()->do_cleanup_work(_hrrs_cleanup_task); ++ } ++ + double region_time = (os::elapsedTime() - start); + _claimed_region_time += region_time; + if (region_time > _max_region_time) { +@@ -1884,12 +1908,8 @@ + void work(uint worker_id) { + double start = os::elapsedTime(); + FreeRegionList local_cleanup_list("Local Cleanup List"); +- OldRegionSet old_proxy_set("Local Cleanup Old Proxy Set"); +- HumongousRegionSet humongous_proxy_set("Local Cleanup Humongous Proxy Set"); + HRRSCleanupTask hrrs_cleanup_task; +- G1NoteEndOfConcMarkClosure g1_note_end(_g1h, worker_id, &local_cleanup_list, +- &old_proxy_set, +- &humongous_proxy_set, ++ G1NoteEndOfConcMarkClosure g1_note_end(_g1h, &local_cleanup_list, + &hrrs_cleanup_task); + if (G1CollectedHeap::use_parallel_gc_threads()) { + _g1h->heap_region_par_iterate_chunked(&g1_note_end, worker_id, +@@ -1901,13 +1921,10 @@ + assert(g1_note_end.complete(), "Shouldn't have yielded!"); + + // Now update the lists +- _g1h->update_sets_after_freeing_regions(g1_note_end.freed_bytes(), +- NULL /* free_list */, +- &old_proxy_set, +- &humongous_proxy_set, +- true /* par */); ++ _g1h->remove_from_old_sets(g1_note_end.old_regions_removed(), g1_note_end.humongous_regions_removed()); + { + MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); ++ _g1h->decrement_summary_bytes(g1_note_end.freed_bytes()); + _max_live_bytes += g1_note_end.max_live_bytes(); + _freed_bytes += g1_note_end.freed_bytes(); + +@@ -1921,14 +1938,14 @@ + + G1HRPrinter* hr_printer = _g1h->hr_printer(); + if (hr_printer->is_active()) { +- HeapRegionLinkedListIterator iter(&local_cleanup_list); ++ FreeRegionListIterator iter(&local_cleanup_list); + while (iter.more_available()) { + HeapRegion* hr = iter.get_next(); + hr_printer->cleanup(hr); + } + } + +- _cleanup_list->add_as_tail(&local_cleanup_list); ++ _cleanup_list->add_ordered(&local_cleanup_list); + assert(local_cleanup_list.is_empty(), "post-condition"); + + HeapRegionRemSet::finish_cleanup_task(&hrrs_cleanup_task); +@@ -1972,7 +1989,6 @@ + return; + } + +- HRSPhaseSetter x(HRSPhaseCleanup); + g1h->verify_region_sets_optional(); + + if (VerifyDuringGC) { +@@ -2158,9 +2174,9 @@ + // so it's not necessary to take any locks + while (!_cleanup_list.is_empty()) { + HeapRegion* hr = _cleanup_list.remove_head(); +- assert(hr != NULL, "the list was not empty"); ++ assert(hr != NULL, "Got NULL from a non-empty list"); + hr->par_clear(); +- tmp_free_list.add_as_tail(hr); ++ tmp_free_list.add_ordered(hr); + + // Instead of adding one region at a time to the secondary_free_list, + // we accumulate them in the local list and move them a few at a +@@ -2180,7 +2196,7 @@ + + { + MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); +- g1h->secondary_free_list_add_as_tail(&tmp_free_list); ++ g1h->secondary_free_list_add(&tmp_free_list); + SecondaryFreeList_lock->notify_all(); + } + +@@ -2239,7 +2255,7 @@ + if (_cm->verbose_high()) { + gclog_or_tty->print_cr("\t[%u] we're looking at location " + "*"PTR_FORMAT" = "PTR_FORMAT, +- _task->worker_id(), p, (void*) obj); ++ _task->worker_id(), p2i(p), p2i((void*) obj)); + } + + _task->deal_with_reference(obj); +@@ -2529,10 +2545,14 @@ + assert(!rp->discovery_enabled(), "Post condition"); + } + +- // Now clean up stale oops in StringTable +- StringTable::unlink(&g1_is_alive); +- // Clean up unreferenced symbols in symbol table. +- SymbolTable::unlink(); ++ if (has_overflown()) { ++ // We can not trust g1_is_alive if the marking stack overflowed ++ return; ++ } ++ ++ g1h->unlink_string_and_symbol_table(&g1_is_alive, ++ /* process_strings */ false, // currently strings are always roots ++ /* process_symbols */ true); + } + + void ConcurrentMark::swapMarkBitMaps() { +@@ -2670,7 +2690,7 @@ + } + + _out->print_cr(" "PTR_FORMAT": "PTR_FORMAT"%s%s", +- p, (void*) obj, str, str2); ++ p2i(p), p2i((void*) obj), str, str2); + } + }; + +@@ -2697,7 +2717,7 @@ + + if (print_it) { + _out->print_cr(" "PTR_FORMAT"%s", +- (void *)o, (over_tams) ? " >" : (marked) ? " M" : ""); ++ p2i((void *)o), (over_tams) ? " >" : (marked) ? " M" : ""); + PrintReachableOopClosure oopCl(_out, _vo, _all); + o->oop_iterate_no_header(&oopCl); + } +@@ -2718,14 +2738,14 @@ + HeapWord* t = hr->top(); + HeapWord* p = _g1h->top_at_mark_start(hr, _vo); + _out->print_cr("** ["PTR_FORMAT", "PTR_FORMAT"] top: "PTR_FORMAT" " +- "TAMS: "PTR_FORMAT, b, e, t, p); ++ "TAMS: " PTR_FORMAT, p2i(b), p2i(e), p2i(t), p2i(p)); + _out->cr(); + + HeapWord* from = b; + HeapWord* to = t; + + if (to > from) { +- _out->print_cr("Objects in ["PTR_FORMAT", "PTR_FORMAT"]", from, to); ++ _out->print_cr("Objects in [" PTR_FORMAT ", " PTR_FORMAT "]", p2i(from), p2i(to)); + _out->cr(); + PrintReachableObjectClosure ocl(_out, _vo, _all, hr); + hr->object_iterate_mem_careful(MemRegion(from, to), &ocl); +@@ -2841,7 +2861,7 @@ + gclog_or_tty->print_cr("[%u] curr_region = "PTR_FORMAT" " + "["PTR_FORMAT", "PTR_FORMAT"), " + "limit = "PTR_FORMAT, +- worker_id, curr_region, bottom, end, limit); ++ worker_id, p2i(curr_region), p2i(bottom), p2i(end), p2i(limit)); + } + + // Is the gap between reading the finger and doing the CAS too long? +@@ -2855,13 +2875,13 @@ + + if (verbose_low()) { + gclog_or_tty->print_cr("[%u] we were successful with region = " +- PTR_FORMAT, worker_id, curr_region); ++ PTR_FORMAT, worker_id, p2i(curr_region)); + } + + if (limit > bottom) { + if (verbose_low()) { + gclog_or_tty->print_cr("[%u] region "PTR_FORMAT" is not empty, " +- "returning it ", worker_id, curr_region); ++ "returning it ", worker_id, p2i(curr_region)); + } + return curr_region; + } else { +@@ -2869,7 +2889,7 @@ + "the region limit should be at bottom"); + if (verbose_low()) { + gclog_or_tty->print_cr("[%u] region "PTR_FORMAT" is empty, " +- "returning NULL", worker_id, curr_region); ++ "returning NULL", worker_id, p2i(curr_region)); + } + // we return NULL and the caller should try calling + // claim_region() again. +@@ -2881,7 +2901,7 @@ + gclog_or_tty->print_cr("[%u] somebody else moved the finger, " + "global finger = "PTR_FORMAT", " + "our finger = "PTR_FORMAT, +- worker_id, _finger, finger); ++ worker_id, p2i(_finger), p2i(finger)); + } + + // read it again +@@ -2920,7 +2940,7 @@ + void do_object_work(oop obj) { + guarantee(!_g1h->obj_in_cs(obj), + err_msg("obj: "PTR_FORMAT" in CSet, phase: %s, info: %d", +- (void*) obj, phase_str(), _info)); ++ p2i((void*) obj), phase_str(), _info)); + } + + public: +@@ -2999,7 +3019,7 @@ + HeapRegion* global_hr = _g1h->heap_region_containing_raw(global_finger); + guarantee(global_finger == global_hr->bottom(), + err_msg("global finger: "PTR_FORMAT" region: "HR_FORMAT, +- global_finger, HR_FORMAT_PARAMS(global_hr))); ++ p2i(global_finger), HR_FORMAT_PARAMS(global_hr))); + } + + // Verify the task fingers +@@ -3013,7 +3033,7 @@ + guarantee(task_finger == task_hr->bottom() || + !task_hr->in_collection_set(), + err_msg("task finger: "PTR_FORMAT" region: "HR_FORMAT, +- task_finger, HR_FORMAT_PARAMS(task_hr))); ++ p2i(task_finger), HR_FORMAT_PARAMS(task_hr))); + } + } + } +@@ -3057,7 +3077,7 @@ + err_msg("Preconditions not met - " + "start: "PTR_FORMAT", limit: "PTR_FORMAT", " + "top: "PTR_FORMAT", end: "PTR_FORMAT, +- start, limit, hr->top(), hr->end())); ++ p2i(start), p2i(limit), p2i(hr->top()), p2i(hr->end()))); + + assert(hr->next_marked_bytes() == 0, "Precondition"); + +@@ -3230,6 +3250,8 @@ + for (uint i = 0; i < _max_worker_id; ++i) { + _tasks[i]->clear_region_fields(); + } ++ _first_overflow_barrier_sync.abort(); ++ _second_overflow_barrier_sync.abort(); + _has_aborted = true; + + SATBMarkQueueSet& satb_mq_set = JavaThread::satb_mark_queue_set(); +@@ -3293,7 +3315,7 @@ + + void ConcurrentMark::print_on_error(outputStream* st) const { + st->print_cr("Marking Bits (Prev, Next): (CMBitMap*) " PTR_FORMAT ", (CMBitMap*) " PTR_FORMAT, +- _prevMarkBitMap, _nextMarkBitMap); ++ p2i(_prevMarkBitMap), p2i(_nextMarkBitMap)); + _prevMarkBitMap->print_on_error(st, " Prev Bits: "); + _nextMarkBitMap->print_on_error(st, " Next Bits: "); + } +@@ -3330,11 +3352,11 @@ + // for debugging purposes + void ConcurrentMark::print_finger() { + gclog_or_tty->print_cr("heap ["PTR_FORMAT", "PTR_FORMAT"), global finger = "PTR_FORMAT, +- _heap_start, _heap_end, _finger); ++ p2i(_heap_start), p2i(_heap_end), p2i(_finger)); + for (uint i = 0; i < _max_worker_id; ++i) { +- gclog_or_tty->print(" %u: "PTR_FORMAT, i, _tasks[i]->finger()); ++ gclog_or_tty->print(" %u: " PTR_FORMAT, i, p2i(_tasks[i]->finger())); + } +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + } + #endif + +@@ -3343,7 +3365,7 @@ + + if (_cm->verbose_high()) { + gclog_or_tty->print_cr("[%u] we're scanning object "PTR_FORMAT, +- _worker_id, (void*) obj); ++ _worker_id, p2i((void*) obj)); + } + + size_t obj_size = obj->size(); +@@ -3423,7 +3445,7 @@ + + if (_cm->verbose_low()) { + gclog_or_tty->print_cr("[%u] setting up for region "PTR_FORMAT, +- _worker_id, hr); ++ _worker_id, p2i(hr)); + } + + _curr_region = hr; +@@ -3440,7 +3462,7 @@ + if (_cm->verbose_low()) { + gclog_or_tty->print_cr("[%u] found an empty region " + "["PTR_FORMAT", "PTR_FORMAT")", +- _worker_id, bottom, limit); ++ _worker_id, p2i(bottom), p2i(limit)); + } + // The region was collected underneath our feet. + // We set the finger to bottom to ensure that the bitmap +@@ -3472,7 +3494,7 @@ + assert(_curr_region != NULL, "invariant"); + if (_cm->verbose_low()) { + gclog_or_tty->print_cr("[%u] giving up region "PTR_FORMAT, +- _worker_id, _curr_region); ++ _worker_id, p2i(_curr_region)); + } + clear_region_fields(); + } +@@ -3752,7 +3774,7 @@ + + if (_task_queue->size() > target_size) { + if (_cm->verbose_high()) { +- gclog_or_tty->print_cr("[%u] draining local queue, target size = %d", ++ gclog_or_tty->print_cr("[%u] draining local queue, target size = " SIZE_FORMAT, + _worker_id, target_size); + } + +@@ -3763,7 +3785,7 @@ + + if (_cm->verbose_high()) { + gclog_or_tty->print_cr("[%u] popped "PTR_FORMAT, _worker_id, +- (void*) obj); ++ p2i((void*) obj)); + } + + assert(_g1h->is_in_g1_reserved((HeapWord*) obj), "invariant" ); +@@ -3808,7 +3830,7 @@ + + if (_cm->mark_stack_size() > target_size) { + if (_cm->verbose_low()) { +- gclog_or_tty->print_cr("[%u] draining global_stack, target size %d", ++ gclog_or_tty->print_cr("[%u] draining global_stack, target size " SIZE_FORMAT, + _worker_id, target_size); + } + +@@ -3818,7 +3840,7 @@ + } + + if (_cm->verbose_low()) { +- gclog_or_tty->print_cr("[%u] drained global stack, size = %d", ++ gclog_or_tty->print_cr("[%u] drained global stack, size = " SIZE_FORMAT, + _worker_id, _cm->mark_stack_size()); + } + } +@@ -4148,7 +4170,7 @@ + gclog_or_tty->print_cr("[%u] we're scanning part " + "["PTR_FORMAT", "PTR_FORMAT") " + "of region "HR_FORMAT, +- _worker_id, _finger, _region_limit, ++ _worker_id, p2i(_finger), p2i(_region_limit), + HR_FORMAT_PARAMS(_curr_region)); + } + +@@ -4235,7 +4257,7 @@ + if (_cm->verbose_low()) { + gclog_or_tty->print_cr("[%u] we successfully claimed " + "region "PTR_FORMAT, +- _worker_id, claimed_region); ++ _worker_id, p2i(claimed_region)); + } + + setup_for_region(claimed_region); +@@ -4296,7 +4318,7 @@ + if (_cm->try_stealing(_worker_id, &_hash_seed, obj)) { + if (_cm->verbose_medium()) { + gclog_or_tty->print_cr("[%u] stolen "PTR_FORMAT" successfully", +- _worker_id, (void*) obj); ++ _worker_id, p2i((void*) obj)); + } + + statsOnly( ++_steals ); +@@ -4544,8 +4566,8 @@ + G1PPRL_SUM_ADDR_FORMAT("committed") + G1PPRL_SUM_ADDR_FORMAT("reserved") + G1PPRL_SUM_BYTE_FORMAT("region-size"), +- g1_committed.start(), g1_committed.end(), +- g1_reserved.start(), g1_reserved.end(), ++ p2i(g1_committed.start()), p2i(g1_committed.end()), ++ p2i(g1_reserved.start()), p2i(g1_reserved.end()), + HeapRegion::GrainBytes); + _out->print_cr(G1PPRL_LINE_PREFIX); + _out->print_cr(G1PPRL_LINE_PREFIX +@@ -4662,7 +4684,7 @@ + G1PPRL_DOUBLE_FORMAT + G1PPRL_BYTE_FORMAT + G1PPRL_BYTE_FORMAT, +- type, bottom, end, ++ type, p2i(bottom), p2i(end), + used_bytes, prev_live_bytes, next_live_bytes, gc_eff, + remset_bytes, strong_code_roots_bytes); + +--- ./hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -25,7 +25,7 @@ + #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP + #define SHARE_VM_GC_IMPLEMENTATION_G1_CONCURRENTMARK_HPP + +-#include "gc_implementation/g1/heapRegionSets.hpp" ++#include "gc_implementation/g1/heapRegionSet.hpp" + #include "utilities/taskqueue.hpp" + + class G1CollectedHeap; +@@ -542,8 +542,12 @@ + // frequently. + HeapRegion* claim_region(uint worker_id); + +- // It determines whether we've run out of regions to scan. +- bool out_of_regions() { return _finger == _heap_end; } ++ // It determines whether we've run out of regions to scan. Note that ++ // the finger can point past the heap end in case the heap was expanded ++ // to satisfy an allocation without doing a GC. This is fine, because all ++ // objects in those regions will be considered live anyway because of ++ // SATB guarantees (i.e. their TAMS will be equal to bottom). ++ bool out_of_regions() { return _finger >= _heap_end; } + + // Returns the task with the given id + CMTask* task(int id) { +--- ./hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -277,7 +277,7 @@ + assert(_nextMarkBitMap->isMarked(objAddr), "invariant"); + + if (_cm->verbose_high()) { +- gclog_or_tty->print_cr("[%u] pushing "PTR_FORMAT, _worker_id, (void*) obj); ++ gclog_or_tty->print_cr("[%u] pushing " PTR_FORMAT, _worker_id, p2i((void*) obj)); + } + + if (!_task_queue->push(obj)) { +@@ -317,7 +317,7 @@ + inline void CMTask::deal_with_reference(oop obj) { + if (_cm->verbose_high()) { + gclog_or_tty->print_cr("[%u] we're dealing with reference = "PTR_FORMAT, +- _worker_id, (void*) obj); ++ _worker_id, p2i((void*) obj)); + } + + ++_refs_reached; +@@ -334,7 +334,7 @@ + if (!hr->obj_allocated_since_next_marking(obj)) { + if (_cm->verbose_high()) { + gclog_or_tty->print_cr("[%u] "PTR_FORMAT" is not considered marked", +- _worker_id, (void*) obj); ++ _worker_id, p2i((void*) obj)); + } + + // we need to mark it first +@@ -349,7 +349,7 @@ + if (_finger != NULL && objAddr < _finger) { + if (_cm->verbose_high()) { + gclog_or_tty->print_cr("[%u] below the local finger ("PTR_FORMAT"), " +- "pushing it", _worker_id, _finger); ++ "pushing it", _worker_id, p2i(_finger)); + } + push(obj); + } else if (_curr_region != NULL && objAddr < _region_limit) { +@@ -367,7 +367,7 @@ + if (_cm->verbose_high()) { + gclog_or_tty->print_cr("[%u] below the global finger " + "("PTR_FORMAT"), pushing it", +- _worker_id, global_finger); ++ _worker_id, p2i(global_finger)); + } + push(obj); + } else { +@@ -382,7 +382,7 @@ + if (_cm->verbose_high()) { + gclog_or_tty->print_cr("[%u] below the global finger " + "("PTR_FORMAT"), pushing it", +- _worker_id, global_finger); ++ _worker_id, p2i(global_finger)); + } + push(obj); + } +--- ./hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -89,6 +89,10 @@ + while (!_should_terminate) { + // wait until started is set. + sleepBeforeNextCycle(); ++ if (_should_terminate) { ++ break; ++ } ++ + { + ResourceMark rm; + HandleMark hm; +@@ -303,11 +307,21 @@ + } + + void ConcurrentMarkThread::stop() { +- // it is ok to take late safepoints here, if needed +- MutexLockerEx mu(Terminator_lock); +- _should_terminate = true; +- while (!_has_terminated) { +- Terminator_lock->wait(); ++ { ++ MutexLockerEx ml(Terminator_lock); ++ _should_terminate = true; ++ } ++ ++ { ++ MutexLockerEx ml(CGC_lock, Mutex::_no_safepoint_check_flag); ++ CGC_lock->notify_all(); ++ } ++ ++ { ++ MutexLockerEx ml(Terminator_lock); ++ while (!_has_terminated) { ++ Terminator_lock->wait(); ++ } + } + } + +@@ -327,11 +341,14 @@ + assert(!in_progress(), "should have been cleared"); + + MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag); +- while (!started()) { ++ while (!started() && !_should_terminate) { + CGC_lock->wait(Mutex::_no_safepoint_check_flag); + } +- set_in_progress(); +- clear_started(); ++ ++ if (started()) { ++ set_in_progress(); ++ clear_started(); ++ } + } + + // Note: As is the case with CMS - this method, although exported +--- ./hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -24,6 +24,7 @@ + + #include "precompiled.hpp" + #include "gc_implementation/g1/dirtyCardQueue.hpp" ++#include "gc_implementation/g1/g1CollectedHeap.inline.hpp" + #include "gc_implementation/g1/heapRegionRemSet.hpp" + #include "runtime/atomic.hpp" + #include "runtime/mutexLocker.hpp" +@@ -33,12 +34,12 @@ + + bool DirtyCardQueue::apply_closure(CardTableEntryClosure* cl, + bool consume, +- size_t worker_i) { ++ uint worker_i) { + bool res = true; + if (_buf != NULL) { + res = apply_closure_to_buffer(cl, _buf, _index, _sz, + consume, +- (int) worker_i); ++ worker_i); + if (res && consume) _index = _sz; + } + return res; +@@ -48,7 +49,7 @@ + void** buf, + size_t index, size_t sz, + bool consume, +- int worker_i) { ++ uint worker_i) { + if (cl == NULL) return true; + for (size_t i = index; i < sz; i += oopSize) { + int ind = byte_index_to_index((int)i); +@@ -78,8 +79,8 @@ + } + + // Determines how many mutator threads can process the buffers in parallel. +-size_t DirtyCardQueueSet::num_par_ids() { +- return os::processor_count(); ++uint DirtyCardQueueSet::num_par_ids() { ++ return (uint)os::processor_count(); + } + + void DirtyCardQueueSet::initialize(Monitor* cbl_mon, Mutex* fl_lock, +@@ -102,7 +103,7 @@ + } + + void DirtyCardQueueSet::iterate_closure_all_threads(bool consume, +- size_t worker_i) { ++ uint worker_i) { + assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint."); + for(JavaThread* t = Threads::first(); t; t = t->next()) { + bool b = t->dirty_card_queue().apply_closure(_closure, consume); +@@ -125,11 +126,11 @@ + + // We get the the number of any par_id that this thread + // might have already claimed. +- int worker_i = thread->get_claimed_par_id(); ++ uint worker_i = thread->get_claimed_par_id(); + +- // If worker_i is not -1 then the thread has already claimed ++ // If worker_i is not UINT_MAX then the thread has already claimed + // a par_id. We make note of it using the already_claimed value +- if (worker_i != -1) { ++ if (worker_i != UINT_MAX) { + already_claimed = true; + } else { + +@@ -141,7 +142,7 @@ + } + + bool b = false; +- if (worker_i != -1) { ++ if (worker_i != UINT_MAX) { + b = DirtyCardQueue::apply_closure_to_buffer(_closure, buf, 0, + _sz, true, worker_i); + if (b) Atomic::inc(&_processed_buffers_mut); +@@ -153,8 +154,8 @@ + // we release the id + _free_ids->release_par_id(worker_i); + +- // and set the claimed_id in the thread to -1 +- thread->set_claimed_par_id(-1); ++ // and set the claimed_id in the thread to UINT_MAX ++ thread->set_claimed_par_id(UINT_MAX); + } + } + return b; +@@ -185,7 +186,7 @@ + + bool DirtyCardQueueSet:: + apply_closure_to_completed_buffer_helper(CardTableEntryClosure* cl, +- int worker_i, ++ uint worker_i, + BufferNode* nd) { + if (nd != NULL) { + void **buf = BufferNode::make_buffer_from_node(nd); +@@ -207,7 +208,7 @@ + } + + bool DirtyCardQueueSet::apply_closure_to_completed_buffer(CardTableEntryClosure* cl, +- int worker_i, ++ uint worker_i, + int stop_at, + bool during_pause) { + assert(!during_pause || stop_at == 0, "Should not leave any completed buffers during a pause"); +@@ -217,7 +218,7 @@ + return res; + } + +-bool DirtyCardQueueSet::apply_closure_to_completed_buffer(int worker_i, ++bool DirtyCardQueueSet::apply_closure_to_completed_buffer(uint worker_i, + int stop_at, + bool during_pause) { + return apply_closure_to_completed_buffer(_closure, worker_i, +--- ./hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -36,7 +36,7 @@ + public: + // Process the card whose card table entry is "card_ptr". If returns + // "false", terminate the iteration early. +- virtual bool do_card_ptr(jbyte* card_ptr, int worker_i = 0) = 0; ++ virtual bool do_card_ptr(jbyte* card_ptr, uint worker_i = 0) = 0; + }; + + // A ptrQueue whose elements are "oops", pointers to object heads. +@@ -53,7 +53,7 @@ + // deletes processed entries from logs. + bool apply_closure(CardTableEntryClosure* cl, + bool consume = true, +- size_t worker_i = 0); ++ uint worker_i = 0); + + // Apply the closure to all elements of "buf", down to "index" + // (inclusive.) If returns "false", then a closure application returned +@@ -63,7 +63,7 @@ + static bool apply_closure_to_buffer(CardTableEntryClosure* cl, + void** buf, size_t index, size_t sz, + bool consume = true, +- int worker_i = 0); ++ uint worker_i = 0); + void **get_buf() { return _buf;} + void set_buf(void **buf) {_buf = buf;} + size_t get_index() { return _index;} +@@ -98,7 +98,7 @@ + + // The number of parallel ids that can be claimed to allow collector or + // mutator threads to do card-processing work. +- static size_t num_par_ids(); ++ static uint num_par_ids(); + + static void handle_zero_index_for_thread(JavaThread* t); + +@@ -115,7 +115,7 @@ + // change in the future.) If "consume" is true, processed entries are + // discarded. + void iterate_closure_all_threads(bool consume = true, +- size_t worker_i = 0); ++ uint worker_i = 0); + + // If there exists some completed buffer, pop it, then apply the + // registered closure to all its elements, nulling out those elements +@@ -124,7 +124,7 @@ + // but is only partially completed before a "yield" happens, the + // partially completed buffer (with its processed elements set to NULL) + // is returned to the completed buffer set, and this call returns false. +- bool apply_closure_to_completed_buffer(int worker_i = 0, ++ bool apply_closure_to_completed_buffer(uint worker_i = 0, + int stop_at = 0, + bool during_pause = false); + +@@ -136,13 +136,13 @@ + // partially completed buffer (with its processed elements set to NULL) + // is returned to the completed buffer set, and this call returns false. + bool apply_closure_to_completed_buffer(CardTableEntryClosure* cl, +- int worker_i = 0, ++ uint worker_i = 0, + int stop_at = 0, + bool during_pause = false); + + // Helper routine for the above. + bool apply_closure_to_completed_buffer_helper(CardTableEntryClosure* cl, +- int worker_i, ++ uint worker_i, + BufferNode* nd); + + BufferNode* get_completed_buffer(int stop_at); +--- ./hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -142,7 +142,7 @@ + void G1AllocRegion::fill_in_ext_msg(ar_ext_msg* msg, const char* message) { + msg->append("[%s] %s c: %u b: %s r: "PTR_FORMAT" u: "SIZE_FORMAT, + _name, message, _count, BOOL_TO_STR(_bot_updates), +- _alloc_region, _used_bytes_before); ++ p2i(_alloc_region), _used_bytes_before); + } + + void G1AllocRegion::init() { +--- ./hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -184,7 +184,7 @@ + + class ar_ext_msg : public err_msg { + public: +- ar_ext_msg(G1AllocRegion* alloc_region, const char *message) : err_msg("") { ++ ar_ext_msg(G1AllocRegion* alloc_region, const char *message) : err_msg("%s", "") { + alloc_region->fill_in_ext_msg(this, message); + } + }; +--- ./hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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,14 @@ + + #include "precompiled.hpp" + #include "gc_implementation/g1/g1BiasedArray.hpp" ++#include "memory/padded.inline.hpp" ++ ++// Allocate a new array, generic version. ++address G1BiasedMappedArrayBase::create_new_base_array(size_t length, size_t elem_size) { ++ assert(length > 0, "just checking"); ++ assert(elem_size > 0, "just checking"); ++ return PaddedPrimitiveArray::create_unfreeable(length * elem_size); ++} + + #ifndef PRODUCT + void G1BiasedMappedArrayBase::verify_index(idx_t index) const { +@@ -57,7 +65,7 @@ + REGION_SIZE_IN_WORDS * HeapWordSize); + // Check address calculation (bounds) + assert(array.bottom_address_mapped() == fake_heap, +- err_msg("bottom mapped address should be "PTR_FORMAT", but is "PTR_FORMAT, fake_heap, array.bottom_address_mapped())); ++ err_msg("bottom mapped address should be " PTR_FORMAT ", but is " PTR_FORMAT, p2i(fake_heap), p2i(array.bottom_address_mapped()))); + assert(array.end_address_mapped() == (fake_heap + REGION_SIZE_IN_WORDS * NUM_REGIONS), "must be"); + + int* bottom = array.address_mapped_to(fake_heap); +--- ./hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -25,8 +25,8 @@ + #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1BIASEDARRAY_HPP + #define SHARE_VM_GC_IMPLEMENTATION_G1_G1BIASEDARRAY_HPP + ++#include "memory/allocation.hpp" + #include "utilities/debug.hpp" +-#include "memory/allocation.inline.hpp" + + // Implements the common base functionality for arrays that contain provisions + // for accessing its elements using a biased index. +@@ -48,18 +48,14 @@ + _bias(0), _shift_by(0) { } + + // Allocate a new array, generic version. +- static address create_new_base_array(size_t length, size_t elem_size) { +- assert(length > 0, "just checking"); +- assert(elem_size > 0, "just checking"); +- return NEW_C_HEAP_ARRAY(u_char, length * elem_size, mtGC); +- } ++ static address create_new_base_array(size_t length, size_t elem_size); + + // Initialize the members of this class. The biased start address of this array + // is the bias (in elements) multiplied by the element size. + void initialize_base(address base, size_t length, size_t bias, size_t elem_size, uint shift_by) { + assert(base != NULL, "just checking"); + assert(length > 0, "just checking"); +- assert(shift_by < sizeof(uintptr_t) * 8, err_msg("Shifting by %zd, larger than word size?", shift_by)); ++ assert(shift_by < sizeof(uintptr_t) * 8, err_msg("Shifting by " SSIZE_FORMAT ", larger than word size?", (size_t) shift_by)); + _base = base; + _length = length; + _biased_base = base - (bias * elem_size); +@@ -74,11 +70,11 @@ + assert(is_power_of_2(mapping_granularity_in_bytes), + err_msg("mapping granularity must be power of 2, is %zd", mapping_granularity_in_bytes)); + assert((uintptr_t)bottom % mapping_granularity_in_bytes == 0, +- err_msg("bottom mapping area address must be a multiple of mapping granularity %zd, is "PTR_FORMAT, +- mapping_granularity_in_bytes, bottom)); ++ err_msg("bottom mapping area address must be a multiple of mapping granularity %zd, is " PTR_FORMAT, ++ mapping_granularity_in_bytes, p2i(bottom))); + assert((uintptr_t)end % mapping_granularity_in_bytes == 0, +- err_msg("end mapping area address must be a multiple of mapping granularity %zd, is "PTR_FORMAT, +- mapping_granularity_in_bytes, end)); ++ err_msg("end mapping area address must be a multiple of mapping granularity %zd, is " PTR_FORMAT, ++ mapping_granularity_in_bytes, p2i(end))); + size_t num_target_elems = (end - bottom) / (mapping_granularity_in_bytes / HeapWordSize); + idx_t bias = (uintptr_t)bottom / mapping_granularity_in_bytes; + address base = create_new_base_array(num_target_elems, target_elem_size_in_bytes); +--- ./hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,6 +29,8 @@ + #include "runtime/java.hpp" + #include "services/memTracker.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + ////////////////////////////////////////////////////////////////////// + // G1BlockOffsetSharedArray + ////////////////////////////////////////////////////////////////////// +--- ./hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -80,7 +80,7 @@ + virtual void set_bottom(HeapWord* new_bottom) { + assert(new_bottom <= _end, + err_msg("new_bottom (" PTR_FORMAT ") > _end (" PTR_FORMAT ")", +- new_bottom, _end)); ++ p2i(new_bottom), p2i(_end))); + _bottom = new_bottom; + resize(pointer_delta(_end, _bottom)); + } +@@ -146,7 +146,7 @@ + void check_offset(size_t offset, const char* msg) const { + assert(offset <= N_words, + err_msg("%s - " +- "offset: " UINT32_FORMAT", N_words: " UINT32_FORMAT, ++ "offset: " SIZE_FORMAT ", N_words: " UINT32_FORMAT, + msg, offset, N_words)); + } + +--- ./hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1BlockOffsetTable.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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,7 @@ + assert(pc >= (char*)_reserved.start() && + pc < (char*)_reserved.end(), + err_msg("p (" PTR_FORMAT ") not in reserved [" PTR_FORMAT ", " PTR_FORMAT ")", +- p, (char*)_reserved.start(), (char*)_reserved.end())); ++ p2i(p), p2i(_reserved.start()), p2i(_reserved.end()))); + size_t delta = pointer_delta(pc, _reserved.start(), sizeof(char)); + size_t result = delta >> LogN; + check_index(result, "bad index from address"); +@@ -65,7 +65,7 @@ + err_msg("bad address from index result " PTR_FORMAT + " _reserved.start() " PTR_FORMAT " _reserved.end() " + PTR_FORMAT, +- result, _reserved.start(), _reserved.end())); ++ p2i(result), p2i(_reserved.start()), p2i(_reserved.end()))); + return result; + } + +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -31,6 +31,8 @@ + #include "services/memTracker.hpp" + #include "utilities/copy.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + void G1CardCounts::clear_range(size_t from_card_num, size_t to_card_num) { + if (has_count_table()) { + assert(from_card_num >= 0 && from_card_num < _committed_max_card_num, +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -77,10 +77,10 @@ + err_msg("Invalid card pointer: " + "card_ptr: " PTR_FORMAT ", " + "_ct_bot: " PTR_FORMAT, +- card_ptr, _ct_bot)); ++ p2i(card_ptr), p2i(_ct_bot))); + size_t card_num = pointer_delta(card_ptr, _ct_bot, sizeof(jbyte)); + assert(card_num >= 0 && card_num < _committed_max_card_num, +- err_msg("card pointer out of range: " PTR_FORMAT, card_ptr)); ++ err_msg("card pointer out of range: " PTR_FORMAT, p2i(card_ptr))); + return card_num; + } + +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CodeCacheRemSet.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CodeCacheRemSet.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,319 @@ ++/* ++ * 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 "code/nmethod.hpp" ++#include "gc_implementation/g1/g1CodeCacheRemSet.hpp" ++#include "memory/iterator.hpp" ++ ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ ++G1CodeRootChunk::G1CodeRootChunk() : _top(NULL), _next(NULL), _prev(NULL) { ++ _top = bottom(); ++} ++ ++void G1CodeRootChunk::reset() { ++ _next = _prev = NULL; ++ _top = bottom(); ++} ++ ++void G1CodeRootChunk::nmethods_do(CodeBlobClosure* cl) { ++ nmethod** cur = bottom(); ++ while (cur != _top) { ++ cl->do_code_blob(*cur); ++ cur++; ++ } ++} ++ ++FreeList G1CodeRootSet::_free_list; ++size_t G1CodeRootSet::_num_chunks_handed_out = 0; ++ ++G1CodeRootChunk* G1CodeRootSet::new_chunk() { ++ G1CodeRootChunk* result = _free_list.get_chunk_at_head(); ++ if (result == NULL) { ++ result = new G1CodeRootChunk(); ++ } ++ G1CodeRootSet::_num_chunks_handed_out++; ++ result->reset(); ++ return result; ++} ++ ++void G1CodeRootSet::free_chunk(G1CodeRootChunk* chunk) { ++ _free_list.return_chunk_at_head(chunk); ++ G1CodeRootSet::_num_chunks_handed_out--; ++} ++ ++void G1CodeRootSet::free_all_chunks(FreeList* list) { ++ G1CodeRootSet::_num_chunks_handed_out -= list->count(); ++ _free_list.prepend(list); ++} ++ ++void G1CodeRootSet::purge_chunks(size_t keep_ratio) { ++ size_t keep = G1CodeRootSet::_num_chunks_handed_out * keep_ratio / 100; ++ ++ if (keep >= (size_t)_free_list.count()) { ++ return; ++ } ++ ++ FreeList temp; ++ temp.initialize(); ++ temp.set_size(G1CodeRootChunk::word_size()); ++ ++ _free_list.getFirstNChunksFromList((size_t)_free_list.count() - keep, &temp); ++ ++ G1CodeRootChunk* cur = temp.get_chunk_at_head(); ++ while (cur != NULL) { ++ delete cur; ++ cur = temp.get_chunk_at_head(); ++ } ++} ++ ++size_t G1CodeRootSet::static_mem_size() { ++ return sizeof(_free_list) + sizeof(_num_chunks_handed_out); ++} ++ ++size_t G1CodeRootSet::fl_mem_size() { ++ return _free_list.count() * _free_list.size(); ++} ++ ++void G1CodeRootSet::initialize() { ++ _free_list.initialize(); ++ _free_list.set_size(G1CodeRootChunk::word_size()); ++} ++ ++G1CodeRootSet::G1CodeRootSet() : _list(), _length(0) { ++ _list.initialize(); ++ _list.set_size(G1CodeRootChunk::word_size()); ++} ++ ++G1CodeRootSet::~G1CodeRootSet() { ++ clear(); ++} ++ ++void G1CodeRootSet::add(nmethod* method) { ++ if (!contains(method)) { ++ // Try to add the nmethod. If there is not enough space, get a new chunk. ++ if (_list.head() == NULL || _list.head()->is_full()) { ++ G1CodeRootChunk* cur = new_chunk(); ++ _list.return_chunk_at_head(cur); ++ } ++ bool result = _list.head()->add(method); ++ guarantee(result, err_msg("Not able to add nmethod "PTR_FORMAT" to newly allocated chunk.", method)); ++ _length++; ++ } ++} ++ ++void G1CodeRootSet::remove(nmethod* method) { ++ G1CodeRootChunk* found = find(method); ++ if (found != NULL) { ++ bool result = found->remove(method); ++ guarantee(result, err_msg("could not find nmethod "PTR_FORMAT" during removal although we previously found it", method)); ++ // eventually free completely emptied chunk ++ if (found->is_empty()) { ++ _list.remove_chunk(found); ++ free(found); ++ } ++ _length--; ++ } ++ assert(!contains(method), err_msg(PTR_FORMAT" still contains nmethod "PTR_FORMAT, this, method)); ++} ++ ++nmethod* G1CodeRootSet::pop() { ++ do { ++ G1CodeRootChunk* cur = _list.head(); ++ if (cur == NULL) { ++ assert(_length == 0, "when there are no chunks, there should be no elements"); ++ return NULL; ++ } ++ nmethod* result = cur->pop(); ++ if (result != NULL) { ++ _length--; ++ return result; ++ } else { ++ free(_list.get_chunk_at_head()); ++ } ++ } while (true); ++} ++ ++G1CodeRootChunk* G1CodeRootSet::find(nmethod* method) { ++ G1CodeRootChunk* cur = _list.head(); ++ while (cur != NULL) { ++ if (cur->contains(method)) { ++ return cur; ++ } ++ cur = (G1CodeRootChunk*)cur->next(); ++ } ++ return NULL; ++} ++ ++void G1CodeRootSet::free(G1CodeRootChunk* chunk) { ++ free_chunk(chunk); ++} ++ ++bool G1CodeRootSet::contains(nmethod* method) { ++ return find(method) != NULL; ++} ++ ++void G1CodeRootSet::clear() { ++ free_all_chunks(&_list); ++ _length = 0; ++} ++ ++void G1CodeRootSet::nmethods_do(CodeBlobClosure* blk) const { ++ G1CodeRootChunk* cur = _list.head(); ++ while (cur != NULL) { ++ cur->nmethods_do(blk); ++ cur = (G1CodeRootChunk*)cur->next(); ++ } ++} ++ ++size_t G1CodeRootSet::mem_size() { ++ return sizeof(this) + _list.count() * _list.size(); ++} ++ ++#ifndef PRODUCT ++ ++void G1CodeRootSet::test() { ++ initialize(); ++ ++ assert(_free_list.count() == 0, "Free List must be empty"); ++ assert(_num_chunks_handed_out == 0, "No elements must have been handed out yet"); ++ ++ // The number of chunks that we allocate for purge testing. ++ size_t const num_chunks = 10; ++ { ++ G1CodeRootSet set1; ++ assert(set1.is_empty(), "Code root set must be initially empty but is not."); ++ ++ set1.add((nmethod*)1); ++ assert(_num_chunks_handed_out == 1, ++ err_msg("Must have allocated and handed out one chunk, but handed out " ++ SIZE_FORMAT" chunks", _num_chunks_handed_out)); ++ assert(set1.length() == 1, err_msg("Added exactly one element, but set contains " ++ SIZE_FORMAT" elements", set1.length())); ++ ++ // G1CodeRootChunk::word_size() is larger than G1CodeRootChunk::num_entries which ++ // we cannot access. ++ for (uint i = 0; i < G1CodeRootChunk::word_size() + 1; i++) { ++ set1.add((nmethod*)1); ++ } ++ assert(_num_chunks_handed_out == 1, ++ err_msg("Duplicate detection must have prevented allocation of further " ++ "chunks but contains "SIZE_FORMAT, _num_chunks_handed_out)); ++ assert(set1.length() == 1, ++ err_msg("Duplicate detection should not have increased the set size but " ++ "is "SIZE_FORMAT, set1.length())); ++ ++ size_t num_total_after_add = G1CodeRootChunk::word_size() + 1; ++ for (size_t i = 0; i < num_total_after_add - 1; i++) { ++ set1.add((nmethod*)(2 + i)); ++ } ++ assert(_num_chunks_handed_out > 1, ++ "After adding more code roots, more than one chunks should have been handed out"); ++ assert(set1.length() == num_total_after_add, ++ err_msg("After adding in total "SIZE_FORMAT" distinct code roots, they " ++ "need to be in the set, but there are only "SIZE_FORMAT, ++ num_total_after_add, set1.length())); ++ ++ size_t num_popped = 0; ++ while (set1.pop() != NULL) { ++ num_popped++; ++ } ++ assert(num_popped == num_total_after_add, ++ err_msg("Managed to pop "SIZE_FORMAT" code roots, but only "SIZE_FORMAT" " ++ "were added", num_popped, num_total_after_add)); ++ assert(_num_chunks_handed_out == 0, ++ err_msg("After popping all elements, all chunks must have been returned " ++ "but are still "SIZE_FORMAT, _num_chunks_handed_out)); ++ ++ purge_chunks(0); ++ assert(_free_list.count() == 0, ++ err_msg("After purging everything, the free list must be empty but still " ++ "contains "SIZE_FORMAT" chunks", _free_list.count())); ++ ++ // Add some more handed out chunks. ++ size_t i = 0; ++ while (_num_chunks_handed_out < num_chunks) { ++ set1.add((nmethod*)i); ++ i++; ++ } ++ ++ { ++ // Generate chunks on the free list. ++ G1CodeRootSet set2; ++ size_t i = 0; ++ while (_num_chunks_handed_out < num_chunks * 2) { ++ set2.add((nmethod*)i); ++ i++; ++ } ++ // Exit of the scope of the set2 object will call the destructor that generates ++ // num_chunks elements on the free list. ++ } ++ ++ assert(_num_chunks_handed_out == num_chunks, ++ err_msg("Deletion of the second set must have resulted in giving back " ++ "those, but there is still "SIZE_FORMAT" handed out, expecting " ++ SIZE_FORMAT, _num_chunks_handed_out, num_chunks)); ++ assert((size_t)_free_list.count() == num_chunks, ++ err_msg("After freeing "SIZE_FORMAT" chunks, they must be on the free list " ++ "but there are only "SIZE_FORMAT, num_chunks, _free_list.count())); ++ ++ size_t const test_percentage = 50; ++ purge_chunks(test_percentage); ++ assert(_num_chunks_handed_out == num_chunks, ++ err_msg("Purging must not hand out chunks but there are "SIZE_FORMAT, ++ _num_chunks_handed_out)); ++ assert((size_t)_free_list.count() == (ssize_t)(num_chunks * test_percentage / 100), ++ err_msg("Must have purged "SIZE_FORMAT" percent of "SIZE_FORMAT" chunks" ++ "but there are "SSIZE_FORMAT, test_percentage, num_chunks, ++ _free_list.count())); ++ // Purge the remainder of the chunks on the free list. ++ purge_chunks(0); ++ assert(_free_list.count() == 0, "Free List must be empty"); ++ assert(_num_chunks_handed_out == num_chunks, ++ err_msg("Expected to be "SIZE_FORMAT" chunks handed out from the first set " ++ "but there are "SIZE_FORMAT, num_chunks, _num_chunks_handed_out)); ++ ++ // Exit of the scope of the set1 object will call the destructor that generates ++ // num_chunks additional elements on the free list. ++ } ++ ++ assert(_num_chunks_handed_out == 0, ++ err_msg("Deletion of the only set must have resulted in no chunks handed " ++ "out, but there is still "SIZE_FORMAT" handed out", _num_chunks_handed_out)); ++ assert((size_t)_free_list.count() == num_chunks, ++ err_msg("After freeing "SIZE_FORMAT" chunks, they must be on the free list " ++ "but there are only "SSIZE_FORMAT, num_chunks, _free_list.count())); ++ ++ // Restore initial state. ++ purge_chunks(0); ++ assert(_free_list.count() == 0, "Free List must be empty"); ++ assert(_num_chunks_handed_out == 0, "No elements must have been handed out yet"); ++} ++ ++void TestCodeCacheRemSet_test() { ++ G1CodeRootSet::test(); ++} ++#endif +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CodeCacheRemSet.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CodeCacheRemSet.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,188 @@ ++/* ++ * 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_GC_IMPLEMENTATION_G1_G1CODECACHEREMSET_HPP ++#define SHARE_VM_GC_IMPLEMENTATION_G1_G1CODECACHEREMSET_HPP ++ ++#include "memory/allocation.hpp" ++#include "memory/freeList.hpp" ++#include "runtime/globals.hpp" ++ ++class CodeBlobClosure; ++ ++class G1CodeRootChunk : public CHeapObj { ++ private: ++ static const int NUM_ENTRIES = 32; ++ public: ++ G1CodeRootChunk* _next; ++ G1CodeRootChunk* _prev; ++ ++ nmethod** _top; ++ ++ nmethod* _data[NUM_ENTRIES]; ++ ++ nmethod** bottom() const { ++ return (nmethod**) &(_data[0]); ++ } ++ ++ nmethod** end() const { ++ return (nmethod**) &(_data[NUM_ENTRIES]); ++ } ++ ++ public: ++ G1CodeRootChunk(); ++ ~G1CodeRootChunk() {} ++ ++ static size_t word_size() { return (size_t)(align_size_up_(sizeof(G1CodeRootChunk), HeapWordSize) / HeapWordSize); } ++ ++ // FreeList "interface" methods ++ ++ G1CodeRootChunk* next() const { return _next; } ++ G1CodeRootChunk* prev() const { return _prev; } ++ void set_next(G1CodeRootChunk* v) { _next = v; assert(v != this, "Boom");} ++ void set_prev(G1CodeRootChunk* v) { _prev = v; assert(v != this, "Boom");} ++ void clear_next() { set_next(NULL); } ++ void clear_prev() { set_prev(NULL); } ++ ++ size_t size() const { return word_size(); } ++ ++ void link_next(G1CodeRootChunk* ptr) { set_next(ptr); } ++ void link_prev(G1CodeRootChunk* ptr) { set_prev(ptr); } ++ void link_after(G1CodeRootChunk* ptr) { ++ link_next(ptr); ++ if (ptr != NULL) ptr->link_prev((G1CodeRootChunk*)this); ++ } ++ ++ bool is_free() { return true; } ++ ++ // New G1CodeRootChunk routines ++ ++ void reset(); ++ ++ bool is_empty() const { ++ return _top == bottom(); ++ } ++ ++ bool is_full() const { ++ return _top == (nmethod**)end(); ++ } ++ ++ bool contains(nmethod* method) { ++ nmethod** cur = bottom(); ++ while (cur != _top) { ++ if (*cur == method) return true; ++ cur++; ++ } ++ return false; ++ } ++ ++ bool add(nmethod* method) { ++ if (is_full()) return false; ++ *_top = method; ++ _top++; ++ return true; ++ } ++ ++ bool remove(nmethod* method) { ++ nmethod** cur = bottom(); ++ while (cur != _top) { ++ if (*cur == method) { ++ memmove(cur, cur + 1, (_top - (cur + 1)) * sizeof(nmethod**)); ++ _top--; ++ return true; ++ } ++ cur++; ++ } ++ return false; ++ } ++ ++ void nmethods_do(CodeBlobClosure* blk); ++ ++ nmethod* pop() { ++ if (is_empty()) { ++ return NULL; ++ } ++ _top--; ++ return *_top; ++ } ++}; ++ ++// Implements storage for a set of code roots. ++// All methods that modify the set are not thread-safe except if otherwise noted. ++class G1CodeRootSet VALUE_OBJ_CLASS_SPEC { ++ private: ++ // Global free chunk list management ++ static FreeList _free_list; ++ // Total number of chunks handed out ++ static size_t _num_chunks_handed_out; ++ ++ static G1CodeRootChunk* new_chunk(); ++ static void free_chunk(G1CodeRootChunk* chunk); ++ // Free all elements of the given list. ++ static void free_all_chunks(FreeList* list); ++ ++ // Return the chunk that contains the given nmethod, NULL otherwise. ++ // Scans the list of chunks backwards, as this method is used to add new ++ // entries, which are typically added in bulk for a single nmethod. ++ G1CodeRootChunk* find(nmethod* method); ++ void free(G1CodeRootChunk* chunk); ++ ++ size_t _length; ++ FreeList _list; ++ ++ public: ++ G1CodeRootSet(); ++ ~G1CodeRootSet(); ++ ++ static void initialize(); ++ static void purge_chunks(size_t keep_ratio); ++ ++ static size_t static_mem_size(); ++ static size_t fl_mem_size(); ++ ++ // Search for the code blob from the recently allocated ones to find duplicates more quickly, as this ++ // method is likely to be repeatedly called with the same nmethod. ++ void add(nmethod* method); ++ ++ void remove(nmethod* method); ++ nmethod* pop(); ++ ++ bool contains(nmethod* method); ++ ++ void clear(); ++ ++ void nmethods_do(CodeBlobClosure* blk) const; ++ ++ bool is_empty() { return length() == 0; } ++ ++ // Length in elements ++ size_t length() const { return _length; } ++ ++ // Memory size in bytes taken by this set. ++ size_t mem_size(); ++ ++ static void test() PRODUCT_RETURN; ++}; ++ ++#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1CODECACHEREMSET_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -22,6 +22,10 @@ + * + */ + ++#if !defined(__clang_major__) && defined(__GNUC__) ++#define ATTRIBUTE_PRINTF(x,y) // FIXME, formats are a mess. ++#endif ++ + #include "precompiled.hpp" + #include "code/codeCache.hpp" + #include "code/icBuffer.hpp" +@@ -39,6 +43,7 @@ + #include "gc_implementation/g1/g1MarkSweep.hpp" + #include "gc_implementation/g1/g1OopClosures.inline.hpp" + #include "gc_implementation/g1/g1RemSet.inline.hpp" ++#include "gc_implementation/g1/g1StringDedup.hpp" + #include "gc_implementation/g1/g1YCTypes.hpp" + #include "gc_implementation/g1/heapRegion.inline.hpp" + #include "gc_implementation/g1/heapRegionRemSet.hpp" +@@ -50,8 +55,8 @@ + #include "gc_implementation/shared/gcTraceTime.hpp" + #include "gc_implementation/shared/isGCActiveMark.hpp" + #include "memory/gcLocker.inline.hpp" +-#include "memory/genOopClosures.inline.hpp" + #include "memory/generationSpec.hpp" ++#include "memory/iterator.hpp" + #include "memory/referenceProcessor.hpp" + #include "oops/oop.inline.hpp" + #include "oops/oop.pcgc.inline.hpp" +@@ -101,7 +106,7 @@ + ConcurrentG1Refine* cg1r) : + _sts(sts), _g1rs(g1rs), _cg1r(cg1r), _concurrent(true) + {} +- bool do_card_ptr(jbyte* card_ptr, int worker_i) { ++ bool do_card_ptr(jbyte* card_ptr, uint worker_i) { + bool oops_into_cset = _g1rs->refine_card(card_ptr, worker_i, false); + // This path is executed by the concurrent refine or mutator threads, + // concurrently, and so we do not care if card_ptr contains references +@@ -130,7 +135,7 @@ + { + for (int i = 0; i < 256; i++) _histo[i] = 0; + } +- bool do_card_ptr(jbyte* card_ptr, int worker_i) { ++ bool do_card_ptr(jbyte* card_ptr, uint worker_i) { + if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) { + _calls++; + unsigned char* ujb = (unsigned char*)card_ptr; +@@ -159,7 +164,7 @@ + RedirtyLoggedCardTableEntryClosure() : + _calls(0), _g1h(G1CollectedHeap::heap()), _ctbs(_g1h->g1_barrier_set()) {} + +- bool do_card_ptr(jbyte* card_ptr, int worker_i) { ++ bool do_card_ptr(jbyte* card_ptr, uint worker_i) { + if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) { + _calls++; + *card_ptr = 0; +@@ -169,14 +174,6 @@ + int calls() { return _calls; } + }; + +-class RedirtyLoggedCardTableEntryFastClosure : public CardTableEntryClosure { +-public: +- bool do_card_ptr(jbyte* card_ptr, int worker_i) { +- *card_ptr = CardTableModRefBS::dirty_card_val(); +- return true; +- } +-}; +- + YoungList::YoungList(G1CollectedHeap* g1h) : + _g1h(g1h), _head(NULL), _length(0), _last_sampled_rs_lengths(0), + _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0) { +@@ -379,7 +376,7 @@ + } + } + +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + } + + void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr) +@@ -435,11 +432,6 @@ + return hr; + } + +-void G1CollectedHeap::stop_conc_gc_threads() { +- _cg1r->stop(); +- _cmThread->stop(); +-} +- + #ifdef ASSERT + // A region is added to the collection set as it is retired + // so an address p can point to a region which will be in the +@@ -524,7 +516,7 @@ + // Private methods. + + HeapRegion* +-G1CollectedHeap::new_region_try_secondary_free_list() { ++G1CollectedHeap::new_region_try_secondary_free_list(bool is_old) { + MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); + while (!_secondary_free_list.is_empty() || free_regions_coming()) { + if (!_secondary_free_list.is_empty()) { +@@ -540,7 +532,7 @@ + + assert(!_free_list.is_empty(), "if the secondary_free_list was not " + "empty we should have moved at least one entry to the free_list"); +- HeapRegion* res = _free_list.remove_head(); ++ HeapRegion* res = _free_list.remove_region(is_old); + if (G1ConcRegionFreeingVerbose) { + gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " + "allocated "HR_FORMAT" from secondary_free_list", +@@ -562,7 +554,7 @@ + return NULL; + } + +-HeapRegion* G1CollectedHeap::new_region(size_t word_size, bool do_expand) { ++HeapRegion* G1CollectedHeap::new_region(size_t word_size, bool is_old, bool do_expand) { + assert(!isHumongous(word_size) || word_size <= HeapRegion::GrainWords, + "the only time we use this to allocate a humongous region is " + "when we are allocating a single humongous region"); +@@ -574,19 +566,21 @@ + gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " + "forced to look at the secondary_free_list"); + } +- res = new_region_try_secondary_free_list(); ++ res = new_region_try_secondary_free_list(is_old); + if (res != NULL) { + return res; + } + } + } +- res = _free_list.remove_head_or_null(); ++ ++ res = _free_list.remove_region(is_old); ++ + if (res == NULL) { + if (G1ConcRegionFreeingVerbose) { + gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : " + "res == NULL, trying the secondary_free_list"); + } +- res = new_region_try_secondary_free_list(); ++ res = new_region_try_secondary_free_list(is_old); + } + if (res == NULL && do_expand && _expand_heap_after_alloc_failure) { + // Currently, only attempts to allocate GC alloc regions set +@@ -603,12 +597,9 @@ + if (expand(word_size * HeapWordSize)) { + // Given that expand() succeeded in expanding the heap, and we + // always expand the heap by an amount aligned to the heap +- // region size, the free list should in theory not be empty. So +- // it would probably be OK to use remove_head(). But the extra +- // check for NULL is unlikely to be a performance issue here (we +- // just expanded the heap!) so let's just be conservative and +- // use remove_head_or_null(). +- res = _free_list.remove_head_or_null(); ++ // region size, the free list should in theory not be empty. ++ // In either case remove_region() will check for NULL. ++ res = _free_list.remove_region(is_old); + } else { + _expand_heap_after_alloc_failure = false; + } +@@ -626,7 +617,7 @@ + // Only one region to allocate, no need to go through the slower + // path. The caller will attempt the expansion if this fails, so + // let's not try to expand here too. +- HeapRegion* hr = new_region(word_size, false /* do_expand */); ++ HeapRegion* hr = new_region(word_size, true /* is_old */, false /* do_expand */); + if (hr != NULL) { + first = hr->hrs_index(); + } else { +@@ -1296,9 +1287,8 @@ + print_heap_before_gc(); + trace_heap_before_gc(gc_tracer); + +- size_t metadata_prev_used = MetaspaceAux::allocated_used_bytes(); +- +- HRSPhaseSetter x(HRSPhaseFullGC); ++ size_t metadata_prev_used = MetaspaceAux::used_bytes(); ++ + verify_region_sets_optional(); + + const bool do_clear_all_soft_refs = clear_all_soft_refs || +@@ -1575,8 +1565,6 @@ + void + G1CollectedHeap:: + resize_if_necessary_after_full_collection(size_t word_size) { +- assert(MinHeapFreeRatio <= MaxHeapFreeRatio, "sanity check"); +- + // Include the current allocation, if any, and bytes that will be + // pre-allocated to support collections, as "used". + const size_t used_after_gc = used(); +@@ -1930,10 +1918,10 @@ + _g1mm(NULL), + _refine_cte_cl(NULL), + _full_collection(false), +- _free_list("Master Free List"), +- _secondary_free_list("Secondary Free List"), +- _old_set("Old Set"), +- _humongous_set("Master Humongous Set"), ++ _free_list("Master Free List", new MasterFreeRegionListMtSafeChecker()), ++ _secondary_free_list("Secondary Free List", new SecondaryFreeRegionListMtSafeChecker()), ++ _old_set("Old Set", false /* humongous */, new OldRegionSetMtSafeChecker()), ++ _humongous_set("Master Humongous Set", true /* humongous */, new HumongousRegionSetMtSafeChecker()), + _free_regions_coming(false), + _young_list(new YoungList(this)), + _gc_time_stamp(0), +@@ -1965,7 +1953,7 @@ + int n_queues = MAX2((int)ParallelGCThreads, 1); + _task_queues = new RefToScanQueueSet(n_queues); + +- int n_rem_sets = HeapRegionRemSet::num_par_rem_sets(); ++ uint n_rem_sets = HeapRegionRemSet::num_par_rem_sets(); + assert(n_rem_sets > 0, "Invariant."); + + _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues, mtGC); +@@ -2081,7 +2069,7 @@ + guarantee(HeapRegion::CardsPerRegion < max_cards_per_region, + "too many cards per region"); + +- HeapRegionSet::set_unrealistically_long_length(max_regions() + 1); ++ FreeRegionList::set_unrealistically_long_length(max_regions() + 1); + + _bot_shared = new G1BlockOffsetSharedArray(_reserved, + heap_word_size(init_byte_size)); +@@ -2184,9 +2172,22 @@ + // values in the heap have been properly initialized. + _g1mm = new G1MonitoringSupport(this); + ++ G1StringDedup::initialize(); ++ + return JNI_OK; + } + ++void G1CollectedHeap::stop() { ++ // Stop all concurrent threads. We do this to make sure these threads ++ // do not continue to execute and access resources (e.g. gclog_or_tty) ++ // that are destroyed during shutdown. ++ _cg1r->stop(); ++ _cmThread->stop(); ++ if (G1StringDedup::is_enabled()) { ++ G1StringDedup::stop(); ++ } ++} ++ + size_t G1CollectedHeap::conservative_max_heap_alignment() { + return HeapRegion::max_region_size(); + } +@@ -2243,12 +2244,9 @@ + // degree of mt discovery + false, + // Reference discovery is not atomic +- &_is_alive_closure_cm, ++ &_is_alive_closure_cm); + // is alive closure + // (for efficiency/performance) +- true); +- // Setting next fields of discovered +- // lists requires a barrier. + + // STW ref processor + _ref_processor_stw = +@@ -2263,12 +2261,9 @@ + // degree of mt discovery + true, + // Reference discovery is atomic +- &_is_alive_closure_stw, ++ &_is_alive_closure_stw); + // is alive closure + // (for efficiency/performance) +- false); +- // Setting next fields of discovered +- // lists requires a barrier. + } + + size_t G1CollectedHeap::capacity() const { +@@ -2323,7 +2318,7 @@ + void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl, + DirtyCardQueue* into_cset_dcq, + bool concurrent, +- int worker_i) { ++ uint worker_i) { + // Clean cards in the hot card cache + G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache(); + hot_card_cache->drain(worker_i, g1_rem_set(), into_cset_dcq); +@@ -2371,8 +2366,12 @@ + }; + + size_t G1CollectedHeap::recalculate_used() const { ++ double recalculate_used_start = os::elapsedTime(); ++ + SumUsedClosure blk; + heap_region_iterate(&blk); ++ ++ g1_policy()->phase_times()->record_evac_fail_recalc_used_time((os::elapsedTime() - recalculate_used_start) * 1000.0); + return blk.result(); + } + +@@ -2867,7 +2866,7 @@ + + // Given the id of a worker, obtain or calculate a suitable + // starting region for iterating over the current collection set. +-HeapRegion* G1CollectedHeap::start_cset_region_for_worker(int worker_i) { ++HeapRegion* G1CollectedHeap::start_cset_region_for_worker(uint worker_i) { + assert(get_gc_time_stamp() > 0, "should have been updated by now"); + + HeapRegion* result = NULL; +@@ -3015,7 +3014,17 @@ + } + + size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const { +- return HeapRegion::GrainBytes; ++ return (_g1_policy->young_list_target_length() - young_list()->survivor_length()) * HeapRegion::GrainBytes; ++} ++ ++size_t G1CollectedHeap::tlab_used(Thread* ignored) const { ++ return young_list()->eden_used_bytes(); ++} ++ ++// For G1 TLABs should not contain humongous objects, so the maximum TLAB size ++// must be smaller than the humongous object limit. ++size_t G1CollectedHeap::max_tlab_size() const { ++ return align_size_down(_humongous_object_threshold_in_words - 1, MinObjAlignment); + } + + size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const { +@@ -3027,11 +3036,11 @@ + // humongous objects. + + HeapRegion* hr = _mutator_alloc_region.get(); +- size_t max_tlab_size = _humongous_object_threshold_in_words * wordSize; ++ size_t max_tlab = max_tlab_size() * wordSize; + if (hr == NULL) { +- return max_tlab_size; ++ return max_tlab; + } else { +- return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab_size); ++ return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab); + } + } + +@@ -3096,11 +3105,7 @@ + return NULL; // keep some compilers happy + } + +-// TODO: VerifyRootsClosure extends OopsInGenClosure so that we can +-// pass it as the perm_blk to SharedHeap::process_strong_roots. +-// When process_strong_roots stop calling perm_blk->younger_refs_iterate +-// we can change this closure to extend the simpler OopClosure. +-class VerifyRootsClosure: public OopsInGenClosure { ++class VerifyRootsClosure: public OopClosure { + private: + G1CollectedHeap* _g1h; + VerifyOption _vo; +@@ -3136,7 +3141,7 @@ + void do_oop(narrowOop* p) { do_oop_nv(p); } + }; + +-class G1VerifyCodeRootOopClosure: public OopsInGenClosure { ++class G1VerifyCodeRootOopClosure: public OopClosure { + G1CollectedHeap* _g1h; + OopClosure* _root_cl; + nmethod* _nm; +@@ -3476,13 +3481,18 @@ + if (!silent) gclog_or_tty->print("RemSet "); + rem_set()->verify(); + ++ if (G1StringDedup::is_enabled()) { ++ if (!silent) gclog_or_tty->print("StrDedup "); ++ G1StringDedup::verify(); ++ } ++ + if (failures) { + gclog_or_tty->print_cr("Heap:"); + // It helps to have the per-region information in the output to + // help us track down what went wrong. This is why we call + // print_extended_on() instead of print_on(). + print_extended_on(gclog_or_tty); +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + #ifndef PRODUCT + if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) { + concurrent_mark()->print_reachable("at-verification-failure", +@@ -3493,8 +3503,13 @@ + } + guarantee(!failures, "there should not have been any failures"); + } else { +- if (!silent) +- gclog_or_tty->print("(SKIPPING roots, heapRegionSets, heapRegions, remset) "); ++ if (!silent) { ++ gclog_or_tty->print("(SKIPPING Roots, HeapRegionSets, HeapRegions, RemSet"); ++ if (G1StringDedup::is_enabled()) { ++ gclog_or_tty->print(", StrDedup"); ++ } ++ gclog_or_tty->print(") "); ++ } + } + } + +@@ -3536,6 +3551,29 @@ + } + }; + ++bool G1CollectedHeap::is_obj_dead_cond(const oop obj, ++ const HeapRegion* hr, ++ const VerifyOption vo) const { ++ switch (vo) { ++ case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj, hr); ++ case VerifyOption_G1UseNextMarking: return is_obj_ill(obj, hr); ++ case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked(); ++ default: ShouldNotReachHere(); ++ } ++ return false; // keep some compilers happy ++} ++ ++bool G1CollectedHeap::is_obj_dead_cond(const oop obj, ++ const VerifyOption vo) const { ++ switch (vo) { ++ case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj); ++ case VerifyOption_G1UseNextMarking: return is_obj_ill(obj); ++ case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked(); ++ default: ShouldNotReachHere(); ++ } ++ return false; // keep some compilers happy ++} ++ + void G1CollectedHeap::print_on(outputStream* st) const { + st->print(" %-20s", "garbage-first heap"); + st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K", +@@ -3587,6 +3625,9 @@ + st->cr(); + _cm->print_worker_threads_on(st); + _cg1r->print_worker_threads_on(st); ++ if (G1StringDedup::is_enabled()) { ++ G1StringDedup::print_worker_threads_on(st); ++ } + } + + void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const { +@@ -3595,6 +3636,9 @@ + } + tc->do_thread(_cmThread); + _cg1r->threads_do(tc); ++ if (G1StringDedup::is_enabled()) { ++ G1StringDedup::threads_do(tc); ++ } + } + + void G1CollectedHeap::print_tracing_info() const { +@@ -3642,7 +3686,7 @@ + PrintRSetsClosure(const char* msg) : _msg(msg), _occupied_sum(0) { + gclog_or_tty->cr(); + gclog_or_tty->print_cr("========================================"); +- gclog_or_tty->print_cr(msg); ++ gclog_or_tty->print_cr("%s", msg); + gclog_or_tty->cr(); + } + +@@ -3674,6 +3718,7 @@ + // always_do_update_barrier = false; + assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer"); + // Fill TLAB's and such ++ accumulate_statistics_all_tlabs(); + ensure_parsability(true); + + if (G1SummarizeRSetStats && (G1SummarizeRSetStatsPeriod > 0) && +@@ -3698,6 +3743,8 @@ + "derived pointer present")); + // always_do_update_barrier = true; + ++ resize_all_tlabs(); ++ + // We have just completed a GC. Update the soft reference + // policy with the new heap occupancy + Universe::update_heap_info_at_gc(); +@@ -3898,7 +3945,6 @@ + print_heap_before_gc(); + trace_heap_before_gc(_gc_tracer_stw); + +- HRSPhaseSetter x(HRSPhaseEvacuation); + verify_region_sets_optional(); + verify_dirty_young_regions(); + +@@ -4397,6 +4443,8 @@ + void G1CollectedHeap::remove_self_forwarding_pointers() { + assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity"); + ++ double remove_self_forwards_start = os::elapsedTime(); ++ + G1ParRemoveSelfForwardPtrsTask rsfp_task(this); + + if (G1CollectedHeap::use_parallel_gc_threads()) { +@@ -4424,6 +4472,8 @@ + } + _objs_with_preserved_marks.clear(true); + _preserved_marks_of_objs.clear(true); ++ ++ g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0); + } + + void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) { +@@ -4545,7 +4595,7 @@ + G1ParGCAllocBuffer::G1ParGCAllocBuffer(size_t gclab_word_size) : + ParGCAllocBuffer(gclab_word_size), _retired(false) { } + +-G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num) ++G1ParScanThreadState::G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num, ReferenceProcessor* rp) + : _g1h(g1h), + _refs(g1h->task_queue(queue_num)), + _dcq(&g1h->dirty_card_queue_set()), +@@ -4555,7 +4605,7 @@ + _term_attempts(0), + _surviving_alloc_buffer(g1h->desired_plab_sz(GCAllocForSurvived)), + _tenured_alloc_buffer(g1h->desired_plab_sz(GCAllocForTenured)), +- _age_table(false), ++ _age_table(false), _scanner(g1h, this, rp), + _strong_roots_time(0), _term_time(0), + _alloc_buffer_waste(0), _undo_waste(0) { + // we allocate G1YoungSurvRateNumRegions plus one entries, since +@@ -4645,9 +4695,7 @@ + #endif // ASSERT + + void G1ParScanThreadState::trim_queue() { +- assert(_evac_cl != NULL, "not set"); + assert(_evac_failure_cl != NULL, "not set"); +- assert(_partial_scan_cl != NULL, "not set"); + + StarTask ref; + do { +@@ -4664,14 +4712,10 @@ + + G1ParClosureSuper::G1ParClosureSuper(G1CollectedHeap* g1, + G1ParScanThreadState* par_scan_state) : +- _g1(g1), _g1_rem(_g1->g1_rem_set()), _cm(_g1->concurrent_mark()), +- _par_scan_state(par_scan_state), +- _worker_id(par_scan_state->queue_num()), +- _during_initial_mark(_g1->g1_policy()->during_initial_mark_pause()), +- _mark_in_progress(_g1->mark_in_progress()) { } +- +-template +-void G1ParCopyClosure::mark_object(oop obj) { ++ _g1(g1), _par_scan_state(par_scan_state), ++ _worker_id(par_scan_state->queue_num()) { } ++ ++void G1ParCopyHelper::mark_object(oop obj) { + #ifdef ASSERT + HeapRegion* hr = _g1->heap_region_containing(obj); + assert(hr != NULL, "sanity"); +@@ -4682,9 +4726,7 @@ + _cm->grayRoot(obj, (size_t) obj->size(), _worker_id); + } + +-template +-void G1ParCopyClosure +- ::mark_forwarded_object(oop from_obj, oop to_obj) { ++void G1ParCopyHelper::mark_forwarded_object(oop from_obj, oop to_obj) { + #ifdef ASSERT + assert(from_obj->is_forwarded(), "from obj should be forwarded"); + assert(from_obj->forwardee() == to_obj, "to obj should be the forwardee"); +@@ -4706,27 +4748,25 @@ + _cm->grayRoot(to_obj, (size_t) from_obj->size(), _worker_id); + } + +-template +-oop G1ParCopyClosure +- ::copy_to_survivor_space(oop old) { ++oop G1ParScanThreadState::copy_to_survivor_space(oop const old) { + size_t word_sz = old->size(); +- HeapRegion* from_region = _g1->heap_region_containing_raw(old); ++ HeapRegion* from_region = _g1h->heap_region_containing_raw(old); + // +1 to make the -1 indexes valid... + int young_index = from_region->young_index_in_cset()+1; + assert( (from_region->is_young() && young_index > 0) || + (!from_region->is_young() && young_index == 0), "invariant" ); +- G1CollectorPolicy* g1p = _g1->g1_policy(); ++ G1CollectorPolicy* g1p = _g1h->g1_policy(); + markOop m = old->mark(); + int age = m->has_displaced_mark_helper() ? m->displaced_mark_helper()->age() + : m->age(); + GCAllocPurpose alloc_purpose = g1p->evacuation_destination(from_region, age, + word_sz); +- HeapWord* obj_ptr = _par_scan_state->allocate(alloc_purpose, word_sz); ++ HeapWord* obj_ptr = allocate(alloc_purpose, word_sz); + #ifndef PRODUCT + // Should this evacuation fail? +- if (_g1->evacuation_should_fail()) { ++ if (_g1h->evacuation_should_fail()) { + if (obj_ptr != NULL) { +- _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz); ++ undo_allocation(alloc_purpose, obj_ptr, word_sz); + obj_ptr = NULL; + } + } +@@ -4735,7 +4775,7 @@ + if (obj_ptr == NULL) { + // This will either forward-to-self, or detect that someone else has + // installed a forwarding pointer. +- return _g1->handle_evacuation_failure_par(_par_scan_state, old); ++ return _g1h->handle_evacuation_failure_par(this, old); + } + + oop obj = oop(obj_ptr); +@@ -4746,6 +4786,12 @@ + oop forward_ptr = old->forward_to_atomic(obj); + if (forward_ptr == NULL) { + Copy::aligned_disjoint_words((HeapWord*) old, obj_ptr, word_sz); ++ ++ // alloc_purpose is just a hint to allocate() above, recheck the type of region ++ // we actually allocated from and update alloc_purpose accordingly ++ HeapRegion* to_region = _g1h->heap_region_containing_raw(obj_ptr); ++ alloc_purpose = to_region->is_young() ? GCAllocForSurvived : GCAllocForTenured; ++ + if (g1p->track_object_age(alloc_purpose)) { + // We could simply do obj->incr_age(). However, this causes a + // performance issue. obj->incr_age() will first check whether +@@ -4768,12 +4814,19 @@ + m = m->incr_age(); + obj->set_mark(m); + } +- _par_scan_state->age_table()->add(obj, word_sz); ++ age_table()->add(obj, word_sz); + } else { + obj->set_mark(m); + } + +- size_t* surv_young_words = _par_scan_state->surviving_young_words(); ++ if (G1StringDedup::is_enabled()) { ++ G1StringDedup::enqueue_from_evacuation(from_region->is_young(), ++ to_region->is_young(), ++ queue_num(), ++ obj); ++ } ++ ++ size_t* surv_young_words = surviving_young_words(); + surv_young_words[young_index] += word_sz; + + if (obj->is_objArray() && arrayOop(obj)->length() >= ParGCArrayScanChunk) { +@@ -4782,15 +4835,15 @@ + // length field of the from-space object. + arrayOop(obj)->set_length(0); + oop* old_p = set_partial_array_mask(old); +- _par_scan_state->push_on_queue(old_p); ++ push_on_queue(old_p); + } else { + // No point in using the slower heap_region_containing() method, + // given that we know obj is in the heap. +- _scanner.set_region(_g1->heap_region_containing_raw(obj)); ++ _scanner.set_region(_g1h->heap_region_containing_raw(obj)); + obj->oop_iterate_backwards(&_scanner); + } + } else { +- _par_scan_state->undo_allocation(alloc_purpose, obj_ptr, word_sz); ++ undo_allocation(alloc_purpose, obj_ptr, word_sz); + obj = forward_ptr; + } + return obj; +@@ -4803,23 +4856,25 @@ + } + } + +-template ++template + template +-void G1ParCopyClosure +-::do_oop_work(T* p) { +- oop obj = oopDesc::load_decode_heap_oop(p); +- assert(barrier != G1BarrierRS || obj != NULL, +- "Precondition: G1BarrierRS implies obj is non-NULL"); ++void G1ParCopyClosure::do_oop_work(T* p) { ++ T heap_oop = oopDesc::load_heap_oop(p); ++ ++ if (oopDesc::is_null(heap_oop)) { ++ return; ++ } ++ ++ oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); + + assert(_worker_id == _par_scan_state->queue_num(), "sanity"); + +- // here the null check is implicit in the cset_fast_test() test + if (_g1->in_cset_fast_test(obj)) { + oop forwardee; + if (obj->is_forwarded()) { + forwardee = obj->forwardee(); + } else { +- forwardee = copy_to_survivor_space(obj); ++ forwardee = _par_scan_state->copy_to_survivor_space(obj); + } + assert(forwardee != NULL, "forwardee should not be NULL"); + oopDesc::encode_store_heap_oop(p, forwardee); +@@ -4829,81 +4884,25 @@ + mark_forwarded_object(obj, forwardee); + } + +- // When scanning the RS, we only care about objs in CS. +- if (barrier == G1BarrierRS) { +- _par_scan_state->update_rs(_from, p, _worker_id); +- } else if (barrier == G1BarrierKlass) { ++ if (barrier == G1BarrierKlass) { + do_klass_barrier(p, forwardee); + } + } else { + // The object is not in collection set. If we're a root scanning + // closure during an initial mark pause (i.e. do_mark_object will + // be true) then attempt to mark the object. +- if (do_mark_object && _g1->is_in_g1_reserved(obj)) { ++ if (do_mark_object) { + mark_object(obj); + } + } + +- if (barrier == G1BarrierEvac && obj != NULL) { ++ if (barrier == G1BarrierEvac) { + _par_scan_state->update_rs(_from, p, _worker_id); + } +- +- if (do_gen_barrier && obj != NULL) { +- par_do_barrier(p); +- } +-} +- +-template void G1ParCopyClosure::do_oop_work(oop* p); +-template void G1ParCopyClosure::do_oop_work(narrowOop* p); +- +-template void G1ParScanPartialArrayClosure::do_oop_nv(T* p) { +- assert(has_partial_array_mask(p), "invariant"); +- oop from_obj = clear_partial_array_mask(p); +- +- assert(Universe::heap()->is_in_reserved(from_obj), "must be in heap."); +- assert(from_obj->is_objArray(), "must be obj array"); +- objArrayOop from_obj_array = objArrayOop(from_obj); +- // The from-space object contains the real length. +- int length = from_obj_array->length(); +- +- assert(from_obj->is_forwarded(), "must be forwarded"); +- oop to_obj = from_obj->forwardee(); +- assert(from_obj != to_obj, "should not be chunking self-forwarded objects"); +- objArrayOop to_obj_array = objArrayOop(to_obj); +- // We keep track of the next start index in the length field of the +- // to-space object. +- int next_index = to_obj_array->length(); +- assert(0 <= next_index && next_index < length, +- err_msg("invariant, next index: %d, length: %d", next_index, length)); +- +- int start = next_index; +- int end = length; +- int remainder = end - start; +- // We'll try not to push a range that's smaller than ParGCArrayScanChunk. +- if (remainder > 2 * ParGCArrayScanChunk) { +- end = start + ParGCArrayScanChunk; +- to_obj_array->set_length(end); +- // Push the remainder before we process the range in case another +- // worker has run out of things to do and can steal it. +- oop* from_obj_p = set_partial_array_mask(from_obj); +- _par_scan_state->push_on_queue(from_obj_p); +- } else { +- assert(length == end, "sanity"); +- // We'll process the final range for this object. Restore the length +- // so that the heap remains parsable in case of evacuation failure. +- to_obj_array->set_length(end); +- } +- _scanner.set_region(_g1->heap_region_containing_raw(to_obj)); +- // Process indexes [start,end). It will also process the header +- // along with the first chunk (i.e., the chunk with start == 0). +- // Note that at this point the length field of to_obj_array is not +- // correct given that we are using it to keep track of the next +- // start index. oop_iterate_range() (thankfully!) ignores the length +- // field and only relies on the start / end parameters. It does +- // however return the size of the object which will be incorrect. So +- // we have to ignore it even if we wanted to use it. +- to_obj_array->oop_iterate_range(&_scanner, start, end); +-} ++} ++ ++template void G1ParCopyClosure::do_oop_work(oop* p); ++template void G1ParCopyClosure::do_oop_work(narrowOop* p); + + class G1ParEvacuateFollowersClosure : public VoidClosure { + protected: +@@ -5045,14 +5044,10 @@ + + ReferenceProcessor* rp = _g1h->ref_processor_stw(); + +- G1ParScanThreadState pss(_g1h, worker_id); +- G1ParScanHeapEvacClosure scan_evac_cl(_g1h, &pss, rp); ++ G1ParScanThreadState pss(_g1h, worker_id, rp); + G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, rp); +- G1ParScanPartialArrayClosure partial_scan_cl(_g1h, &pss, rp); +- +- pss.set_evac_closure(&scan_evac_cl); ++ + pss.set_evac_failure_closure(&evac_failure_cl); +- pss.set_partial_scan_closure(&partial_scan_cl); + + G1ParScanExtRootClosure only_scan_root_cl(_g1h, &pss, rp); + G1ParScanMetadataClosure only_scan_metadata_cl(_g1h, &pss, rp); +@@ -5130,7 +5125,7 @@ + OopClosure* scan_non_heap_roots, + OopsInHeapRegionClosure* scan_rs, + G1KlassScanClosure* scan_klasses, +- int worker_i) { ++ uint worker_i) { + + // First scan the strong roots + double ext_roots_start = os::elapsedTime(); +@@ -5212,6 +5207,129 @@ + SharedHeap::process_weak_roots(root_closure, &roots_in_blobs); + } + ++class G1StringSymbolTableUnlinkTask : public AbstractGangTask { ++private: ++ BoolObjectClosure* _is_alive; ++ int _initial_string_table_size; ++ int _initial_symbol_table_size; ++ ++ bool _process_strings; ++ int _strings_processed; ++ int _strings_removed; ++ ++ bool _process_symbols; ++ int _symbols_processed; ++ int _symbols_removed; ++ ++ bool _do_in_parallel; ++public: ++ G1StringSymbolTableUnlinkTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols) : ++ AbstractGangTask("Par String/Symbol table unlink"), _is_alive(is_alive), ++ _do_in_parallel(G1CollectedHeap::use_parallel_gc_threads()), ++ _process_strings(process_strings), _strings_processed(0), _strings_removed(0), ++ _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0) { ++ ++ _initial_string_table_size = StringTable::the_table()->table_size(); ++ _initial_symbol_table_size = SymbolTable::the_table()->table_size(); ++ if (process_strings) { ++ StringTable::clear_parallel_claimed_index(); ++ } ++ if (process_symbols) { ++ SymbolTable::clear_parallel_claimed_index(); ++ } ++ } ++ ++ ~G1StringSymbolTableUnlinkTask() { ++ guarantee(!_process_strings || !_do_in_parallel || StringTable::parallel_claimed_index() >= _initial_string_table_size, ++ err_msg("claim value "INT32_FORMAT" after unlink less than initial string table size "INT32_FORMAT, ++ StringTable::parallel_claimed_index(), _initial_string_table_size)); ++ guarantee(!_process_symbols || !_do_in_parallel || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size, ++ err_msg("claim value "INT32_FORMAT" after unlink less than initial symbol table size "INT32_FORMAT, ++ SymbolTable::parallel_claimed_index(), _initial_symbol_table_size)); ++ } ++ ++ void work(uint worker_id) { ++ if (_do_in_parallel) { ++ int strings_processed = 0; ++ int strings_removed = 0; ++ int symbols_processed = 0; ++ int symbols_removed = 0; ++ if (_process_strings) { ++ StringTable::possibly_parallel_unlink(_is_alive, &strings_processed, &strings_removed); ++ Atomic::add(strings_processed, &_strings_processed); ++ Atomic::add(strings_removed, &_strings_removed); ++ } ++ if (_process_symbols) { ++ SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed); ++ Atomic::add(symbols_processed, &_symbols_processed); ++ Atomic::add(symbols_removed, &_symbols_removed); ++ } ++ } else { ++ if (_process_strings) { ++ StringTable::unlink(_is_alive, &_strings_processed, &_strings_removed); ++ } ++ if (_process_symbols) { ++ SymbolTable::unlink(&_symbols_processed, &_symbols_removed); ++ } ++ } ++ } ++ ++ size_t strings_processed() const { return (size_t)_strings_processed; } ++ size_t strings_removed() const { return (size_t)_strings_removed; } ++ ++ size_t symbols_processed() const { return (size_t)_symbols_processed; } ++ size_t symbols_removed() const { return (size_t)_symbols_removed; } ++}; ++ ++void G1CollectedHeap::unlink_string_and_symbol_table(BoolObjectClosure* is_alive, ++ bool process_strings, bool process_symbols) { ++ uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ? ++ _g1h->workers()->active_workers() : 1); ++ ++ G1StringSymbolTableUnlinkTask g1_unlink_task(is_alive, process_strings, process_symbols); ++ if (G1CollectedHeap::use_parallel_gc_threads()) { ++ set_par_threads(n_workers); ++ workers()->run_task(&g1_unlink_task); ++ set_par_threads(0); ++ } else { ++ g1_unlink_task.work(0); ++ } ++ if (G1TraceStringSymbolTableScrubbing) { ++ gclog_or_tty->print_cr("Cleaned string and symbol table, " ++ "strings: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed, " ++ "symbols: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed", ++ g1_unlink_task.strings_processed(), g1_unlink_task.strings_removed(), ++ g1_unlink_task.symbols_processed(), g1_unlink_task.symbols_removed()); ++ } ++ ++ if (G1StringDedup::is_enabled()) { ++ G1StringDedup::unlink(is_alive); ++ } ++} ++ ++class RedirtyLoggedCardTableEntryFastClosure : public CardTableEntryClosure { ++public: ++ bool do_card_ptr(jbyte* card_ptr, uint worker_i) { ++ *card_ptr = CardTableModRefBS::dirty_card_val(); ++ return true; ++ } ++}; ++ ++void G1CollectedHeap::redirty_logged_cards() { ++ guarantee(G1DeferredRSUpdate, "Must only be called when using deferred RS updates."); ++ double redirty_logged_cards_start = os::elapsedTime(); ++ ++ RedirtyLoggedCardTableEntryFastClosure redirty; ++ dirty_card_queue_set().set_closure(&redirty); ++ dirty_card_queue_set().apply_closure_to_all_completed_buffers(); ++ ++ DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set(); ++ dcq.merge_bufferlists(&dirty_card_queue_set()); ++ assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed"); ++ ++ g1_policy()->phase_times()->record_redirty_logged_cards_time_ms((os::elapsedTime() - redirty_logged_cards_start) * 1000.0); ++} ++ + // Weak Reference Processing support + + // An always "is_alive" closure that is used to preserve referents. +@@ -5302,7 +5420,7 @@ + if (_g1h->is_in_g1_reserved(p)) { + _par_scan_state->push_on_queue(p); + } else { +- assert(!ClassLoaderDataGraph::contains((address)p), ++ assert(!Metaspace::contains((const void*)p), + err_msg("Otherwise need to call _copy_metadata_obj_cl->do_oop(p) " + PTR_FORMAT, p)); + _copy_non_heap_obj_cl->do_oop(p); +@@ -5392,15 +5510,10 @@ + + G1STWIsAliveClosure is_alive(_g1h); + +- G1ParScanThreadState pss(_g1h, worker_id); +- +- G1ParScanHeapEvacClosure scan_evac_cl(_g1h, &pss, NULL); ++ G1ParScanThreadState pss(_g1h, worker_id, NULL); + G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL); +- G1ParScanPartialArrayClosure partial_scan_cl(_g1h, &pss, NULL); +- +- pss.set_evac_closure(&scan_evac_cl); ++ + pss.set_evac_failure_closure(&evac_failure_cl); +- pss.set_partial_scan_closure(&partial_scan_cl); + + G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL); + G1ParScanMetadataClosure only_copy_metadata_cl(_g1h, &pss, NULL); +@@ -5504,14 +5617,10 @@ + ResourceMark rm; + HandleMark hm; + +- G1ParScanThreadState pss(_g1h, worker_id); +- G1ParScanHeapEvacClosure scan_evac_cl(_g1h, &pss, NULL); ++ G1ParScanThreadState pss(_g1h, worker_id, NULL); + G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL); +- G1ParScanPartialArrayClosure partial_scan_cl(_g1h, &pss, NULL); +- +- pss.set_evac_closure(&scan_evac_cl); ++ + pss.set_evac_failure_closure(&evac_failure_cl); +- pss.set_partial_scan_closure(&partial_scan_cl); + + assert(pss.refs()->is_empty(), "both queue and overflow should be empty"); + +@@ -5630,18 +5739,14 @@ + // JNI refs. + + // Use only a single queue for this PSS. +- G1ParScanThreadState pss(this, 0); ++ G1ParScanThreadState pss(this, 0, NULL); + + // We do not embed a reference processor in the copying/scanning + // closures while we're actually processing the discovered + // reference objects. +- G1ParScanHeapEvacClosure scan_evac_cl(this, &pss, NULL); + G1ParScanHeapEvacFailureClosure evac_failure_cl(this, &pss, NULL); +- G1ParScanPartialArrayClosure partial_scan_cl(this, &pss, NULL); +- +- pss.set_evac_closure(&scan_evac_cl); ++ + pss.set_evac_failure_closure(&evac_failure_cl); +- pss.set_partial_scan_closure(&partial_scan_cl); + + assert(pss.refs()->is_empty(), "pre-condition"); + +@@ -5823,6 +5928,9 @@ + G1STWIsAliveClosure is_alive(this); + G1KeepAliveClosure keep_alive(this); + JNIHandles::weak_oops_do(&is_alive, &keep_alive); ++ if (G1StringDedup::is_enabled()) { ++ G1StringDedup::unlink_or_oops_do(&is_alive, &keep_alive); ++ } + } + + release_gc_alloc_regions(n_workers, evacuation_info); +@@ -5840,6 +5948,8 @@ + // strong code roots for a particular heap region. + migrate_strong_code_roots(); + ++ purge_code_root_memory(); ++ + if (g1_policy()->during_initial_mark_pause()) { + // Reset the claim values set during marking the strong code roots + reset_heap_region_claim_values(); +@@ -5866,41 +5976,15 @@ + enqueue_discovered_references(n_workers); + + if (G1DeferredRSUpdate) { +- RedirtyLoggedCardTableEntryFastClosure redirty; +- dirty_card_queue_set().set_closure(&redirty); +- dirty_card_queue_set().apply_closure_to_all_completed_buffers(); +- +- DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set(); +- dcq.merge_bufferlists(&dirty_card_queue_set()); +- assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed"); ++ redirty_logged_cards(); + } + COMPILER2_PRESENT(DerivedPointerTable::update_pointers()); + } + +-void G1CollectedHeap::free_region_if_empty(HeapRegion* hr, +- size_t* pre_used, +- FreeRegionList* free_list, +- OldRegionSet* old_proxy_set, +- HumongousRegionSet* humongous_proxy_set, +- HRRSCleanupTask* hrrs_cleanup_task, +- bool par) { +- if (hr->used() > 0 && hr->max_live_bytes() == 0 && !hr->is_young()) { +- if (hr->isHumongous()) { +- assert(hr->startsHumongous(), "we should only see starts humongous"); +- free_humongous_region(hr, pre_used, free_list, humongous_proxy_set, par); +- } else { +- _old_set.remove_with_proxy(hr, old_proxy_set); +- free_region(hr, pre_used, free_list, par); +- } +- } else { +- hr->rem_set()->do_cleanup_work(hrrs_cleanup_task); +- } +-} +- + void G1CollectedHeap::free_region(HeapRegion* hr, +- size_t* pre_used, + FreeRegionList* free_list, +- bool par) { ++ bool par, ++ bool locked) { + assert(!hr->isHumongous(), "this is only for non-humongous regions"); + assert(!hr->is_empty(), "the region should not be empty"); + assert(free_list != NULL, "pre-condition"); +@@ -5911,70 +5995,56 @@ + if (!hr->is_young()) { + _cg1r->hot_card_cache()->reset_card_counts(hr); + } +- *pre_used += hr->used(); +- hr->hr_clear(par, true /* clear_space */); +- free_list->add_as_head(hr); ++ hr->hr_clear(par, true /* clear_space */, locked /* locked */); ++ free_list->add_ordered(hr); + } + + void G1CollectedHeap::free_humongous_region(HeapRegion* hr, +- size_t* pre_used, + FreeRegionList* free_list, +- HumongousRegionSet* humongous_proxy_set, + bool par) { + assert(hr->startsHumongous(), "this is only for starts humongous regions"); + assert(free_list != NULL, "pre-condition"); +- assert(humongous_proxy_set != NULL, "pre-condition"); +- +- size_t hr_used = hr->used(); ++ + size_t hr_capacity = hr->capacity(); +- size_t hr_pre_used = 0; +- _humongous_set.remove_with_proxy(hr, humongous_proxy_set); + // We need to read this before we make the region non-humongous, + // otherwise the information will be gone. + uint last_index = hr->last_hc_index(); + hr->set_notHumongous(); +- free_region(hr, &hr_pre_used, free_list, par); ++ free_region(hr, free_list, par); + + uint i = hr->hrs_index() + 1; + while (i < last_index) { + HeapRegion* curr_hr = region_at(i); + assert(curr_hr->continuesHumongous(), "invariant"); + curr_hr->set_notHumongous(); +- free_region(curr_hr, &hr_pre_used, free_list, par); ++ free_region(curr_hr, free_list, par); + i += 1; + } +- assert(hr_pre_used == hr_used, +- err_msg("hr_pre_used: "SIZE_FORMAT" and hr_used: "SIZE_FORMAT" " +- "should be the same", hr_pre_used, hr_used)); +- *pre_used += hr_pre_used; +-} +- +-void G1CollectedHeap::update_sets_after_freeing_regions(size_t pre_used, +- FreeRegionList* free_list, +- OldRegionSet* old_proxy_set, +- HumongousRegionSet* humongous_proxy_set, +- bool par) { +- if (pre_used > 0) { +- Mutex* lock = (par) ? ParGCRareEvent_lock : NULL; +- MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag); +- assert(_summary_bytes_used >= pre_used, +- err_msg("invariant: _summary_bytes_used: "SIZE_FORMAT" " +- "should be >= pre_used: "SIZE_FORMAT, +- _summary_bytes_used, pre_used)); +- _summary_bytes_used -= pre_used; +- } +- if (free_list != NULL && !free_list->is_empty()) { ++} ++ ++void G1CollectedHeap::remove_from_old_sets(const HeapRegionSetCount& old_regions_removed, ++ const HeapRegionSetCount& humongous_regions_removed) { ++ if (old_regions_removed.length() > 0 || humongous_regions_removed.length() > 0) { ++ MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag); ++ _old_set.bulk_remove(old_regions_removed); ++ _humongous_set.bulk_remove(humongous_regions_removed); ++ } ++ ++} ++ ++void G1CollectedHeap::prepend_to_freelist(FreeRegionList* list) { ++ assert(list != NULL, "list can't be null"); ++ if (!list->is_empty()) { + MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag); +- _free_list.add_as_head(free_list); +- } +- if (old_proxy_set != NULL && !old_proxy_set->is_empty()) { +- MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag); +- _old_set.update_from_proxy(old_proxy_set); +- } +- if (humongous_proxy_set != NULL && !humongous_proxy_set->is_empty()) { +- MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag); +- _humongous_set.update_from_proxy(humongous_proxy_set); +- } ++ _free_list.add_ordered(list); ++ } ++} ++ ++void G1CollectedHeap::decrement_summary_bytes(size_t bytes) { ++ assert(_summary_bytes_used >= bytes, ++ err_msg("invariant: _summary_bytes_used: "SIZE_FORMAT" should be >= bytes: "SIZE_FORMAT, ++ _summary_bytes_used, bytes)); ++ _summary_bytes_used -= bytes; + } + + class G1ParCleanupCTTask : public AbstractGangTask { +@@ -6134,7 +6204,7 @@ + } + } + +- rs_lengths += cur->rem_set()->occupied(); ++ rs_lengths += cur->rem_set()->occupied_locked(); + + HeapRegion* next = cur->next_in_collection_set(); + assert(cur->in_collection_set(), "bad CS"); +@@ -6167,7 +6237,8 @@ + + // And the region is empty. + assert(!used_mr.is_empty(), "Should not have empty regions in a CS."); +- free_region(cur, &pre_used, &local_free_list, false /* par */); ++ pre_used += cur->used(); ++ free_region(cur, &local_free_list, false /* par */, true /* locked */); + } else { + cur->uninstall_surv_rate_group(); + if (cur->is_young()) { +@@ -6195,10 +6266,8 @@ + young_time_ms += elapsed_ms; + } + +- update_sets_after_freeing_regions(pre_used, &local_free_list, +- NULL /* old_proxy_set */, +- NULL /* humongous_proxy_set */, +- false /* par */); ++ prepend_to_freelist(&local_free_list); ++ decrement_summary_bytes(pre_used); + policy->phase_times()->record_young_free_cset_time_ms(young_time_ms); + policy->phase_times()->record_non_young_free_cset_time_ms(non_young_time_ms); + } +@@ -6310,10 +6379,10 @@ + + class TearDownRegionSetsClosure : public HeapRegionClosure { + private: +- OldRegionSet *_old_set; ++ HeapRegionSet *_old_set; + + public: +- TearDownRegionSetsClosure(OldRegionSet* old_set) : _old_set(old_set) { } ++ TearDownRegionSetsClosure(HeapRegionSet* old_set) : _old_set(old_set) { } + + bool doHeapRegion(HeapRegion* r) { + if (r->is_empty()) { +@@ -6342,9 +6411,10 @@ + TearDownRegionSetsClosure cl(&_old_set); + heap_region_iterate(&cl); + +- // Need to do this after the heap iteration to be able to +- // recognize the young regions and ignore them during the iteration. +- _young_list->empty_list(); ++ // Note that emptying the _young_list is postponed and instead done as ++ // the first step when rebuilding the regions sets again. The reason for ++ // this is that during a full GC string deduplication needs to know if ++ // a collected region was young or old when the full GC was initiated. + } + _free_list.remove_all(); + } +@@ -6352,13 +6422,13 @@ + class RebuildRegionSetsClosure : public HeapRegionClosure { + private: + bool _free_list_only; +- OldRegionSet* _old_set; ++ HeapRegionSet* _old_set; + FreeRegionList* _free_list; + size_t _total_used; + + public: + RebuildRegionSetsClosure(bool free_list_only, +- OldRegionSet* old_set, FreeRegionList* free_list) : ++ HeapRegionSet* old_set, FreeRegionList* free_list) : + _free_list_only(free_list_only), + _old_set(old_set), _free_list(free_list), _total_used(0) { + assert(_free_list->is_empty(), "pre-condition"); +@@ -6398,6 +6468,10 @@ + void G1CollectedHeap::rebuild_region_sets(bool free_list_only) { + assert_at_safepoint(true /* should_be_vm_thread */); + ++ if (!free_list_only) { ++ _young_list->empty_list(); ++ } ++ + RebuildRegionSetsClosure cl(free_list_only, &_old_set, &_free_list); + heap_region_iterate(&cl); + +@@ -6433,6 +6507,7 @@ + bool young_list_full = g1_policy()->is_young_list_full(); + if (force || !young_list_full) { + HeapRegion* new_alloc_region = new_region(word_size, ++ false /* is_old */, + false /* do_expand */); + if (new_alloc_region != NULL) { + set_region_short_lived_locked(new_alloc_region); +@@ -6491,14 +6566,16 @@ + assert(FreeList_lock->owned_by_self(), "pre-condition"); + + if (count < g1_policy()->max_regions(ap)) { ++ bool survivor = (ap == GCAllocForSurvived); + HeapRegion* new_alloc_region = new_region(word_size, ++ !survivor, + true /* do_expand */); + if (new_alloc_region != NULL) { + // We really only need to do this for old regions given that we + // should never scan survivors. But it doesn't hurt to do it + // for survivors too. + new_alloc_region->set_saved_mark(); +- if (ap == GCAllocForSurvived) { ++ if (survivor) { + new_alloc_region->set_survivor(); + _hr_printer.alloc(new_alloc_region, G1HRPrinter::Survivor); + } else { +@@ -6555,23 +6632,22 @@ + + class VerifyRegionListsClosure : public HeapRegionClosure { + private: +- FreeRegionList* _free_list; +- OldRegionSet* _old_set; +- HumongousRegionSet* _humongous_set; +- uint _region_count; ++ HeapRegionSet* _old_set; ++ HeapRegionSet* _humongous_set; ++ FreeRegionList* _free_list; + + public: +- VerifyRegionListsClosure(OldRegionSet* old_set, +- HumongousRegionSet* humongous_set, ++ HeapRegionSetCount _old_count; ++ HeapRegionSetCount _humongous_count; ++ HeapRegionSetCount _free_count; ++ ++ VerifyRegionListsClosure(HeapRegionSet* old_set, ++ HeapRegionSet* humongous_set, + FreeRegionList* free_list) : +- _old_set(old_set), _humongous_set(humongous_set), +- _free_list(free_list), _region_count(0) { } +- +- uint region_count() { return _region_count; } ++ _old_set(old_set), _humongous_set(humongous_set), _free_list(free_list), ++ _old_count(), _humongous_count(), _free_count(){ } + + bool doHeapRegion(HeapRegion* hr) { +- _region_count += 1; +- + if (hr->continuesHumongous()) { + return false; + } +@@ -6579,14 +6655,31 @@ + if (hr->is_young()) { + // TODO + } else if (hr->startsHumongous()) { +- _humongous_set->verify_next_region(hr); ++ assert(hr->containing_set() == _humongous_set, err_msg("Heap region %u is starts humongous but not in humongous set.", hr->region_num())); ++ _humongous_count.increment(1u, hr->capacity()); + } else if (hr->is_empty()) { +- _free_list->verify_next_region(hr); ++ assert(hr->containing_set() == _free_list, err_msg("Heap region %u is empty but not on the free list.", hr->region_num())); ++ _free_count.increment(1u, hr->capacity()); + } else { +- _old_set->verify_next_region(hr); ++ assert(hr->containing_set() == _old_set, err_msg("Heap region %u is old but not in the old set.", hr->region_num())); ++ _old_count.increment(1u, hr->capacity()); + } + return false; + } ++ ++ void verify_counts(HeapRegionSet* old_set, HeapRegionSet* humongous_set, FreeRegionList* free_list) { ++ guarantee(old_set->length() == _old_count.length(), err_msg("Old set count mismatch. Expected %u, actual %u.", old_set->length(), _old_count.length())); ++ guarantee(old_set->total_capacity_bytes() == _old_count.capacity(), err_msg("Old set capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT, ++ old_set->total_capacity_bytes(), _old_count.capacity())); ++ ++ guarantee(humongous_set->length() == _humongous_count.length(), err_msg("Hum set count mismatch. Expected %u, actual %u.", humongous_set->length(), _humongous_count.length())); ++ guarantee(humongous_set->total_capacity_bytes() == _humongous_count.capacity(), err_msg("Hum set capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT, ++ humongous_set->total_capacity_bytes(), _humongous_count.capacity())); ++ ++ guarantee(free_list->length() == _free_count.length(), err_msg("Free list count mismatch. Expected %u, actual %u.", free_list->length(), _free_count.length())); ++ guarantee(free_list->total_capacity_bytes() == _free_count.capacity(), err_msg("Free list capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT, ++ free_list->total_capacity_bytes(), _free_count.capacity())); ++ } + }; + + HeapRegion* G1CollectedHeap::new_heap_region(uint hrs_index, +@@ -6602,16 +6695,14 @@ + assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */); + + // First, check the explicit lists. +- _free_list.verify(); ++ _free_list.verify_list(); + { + // Given that a concurrent operation might be adding regions to + // the secondary free list we have to take the lock before + // verifying it. + MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag); +- _secondary_free_list.verify(); +- } +- _old_set.verify(); +- _humongous_set.verify(); ++ _secondary_free_list.verify_list(); ++ } + + // If a concurrent region freeing operation is in progress it will + // be difficult to correctly attributed any free regions we come +@@ -6634,16 +6725,10 @@ + + // Finally, make sure that the region accounting in the lists is + // consistent with what we see in the heap. +- _old_set.verify_start(); +- _humongous_set.verify_start(); +- _free_list.verify_start(); + + VerifyRegionListsClosure cl(&_old_set, &_humongous_set, &_free_list); + heap_region_iterate(&cl); +- +- _old_set.verify_end(); +- _humongous_set.verify_end(); +- _free_list.verify_end(); ++ cl.verify_counts(&_old_set, &_humongous_set, &_free_list); + } + + // Optimized nmethod scanning +@@ -6744,6 +6829,13 @@ + g1_policy()->phase_times()->record_strong_code_root_migration_time(migration_time_ms); + } + ++void G1CollectedHeap::purge_code_root_memory() { ++ double purge_start = os::elapsedTime(); ++ G1CodeRootSet::purge_chunks(G1CodeRootsChunkCacheKeepPercent); ++ double purge_time_ms = (os::elapsedTime() - purge_start) * 1000.0; ++ g1_policy()->phase_times()->record_strong_code_root_purge_time(purge_time_ms); ++} ++ + // Mark all the code roots that point into regions *not* in the + // collection set. + // +@@ -6814,7 +6906,7 @@ + // Code roots should never be attached to a continuation of a humongous region + assert(hrrs->strong_code_roots_list_length() == 0, + err_msg("code roots should never be attached to continuations of humongous region "HR_FORMAT +- " starting at "HR_FORMAT", but has "INT32_FORMAT, ++ " starting at "HR_FORMAT", but has "SIZE_FORMAT, + HR_FORMAT_PARAMS(hr), HR_FORMAT_PARAMS(hr->humongous_start_region()), + hrrs->strong_code_roots_list_length())); + return false; +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -34,7 +34,7 @@ + #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" + #include "gc_implementation/g1/g1YCTypes.hpp" + #include "gc_implementation/g1/heapRegionSeq.hpp" +-#include "gc_implementation/g1/heapRegionSets.hpp" ++#include "gc_implementation/g1/heapRegionSet.hpp" + #include "gc_implementation/shared/hSpaceCounters.hpp" + #include "gc_implementation/shared/parGCAllocBuffer.hpp" + #include "memory/barrierSet.hpp" +@@ -209,7 +209,7 @@ + friend class OldGCAllocRegion; + + // Closures used in implementation. +- template ++ template + friend class G1ParCopyClosure; + friend class G1IsAliveClosure; + friend class G1EvacuateFollowersClosure; +@@ -243,18 +243,18 @@ + MemRegion _g1_committed; + + // The master free list. It will satisfy all new region allocations. +- MasterFreeRegionList _free_list; ++ FreeRegionList _free_list; + + // The secondary free list which contains regions that have been + // freed up during the cleanup process. This will be appended to the + // master free list when appropriate. +- SecondaryFreeRegionList _secondary_free_list; ++ FreeRegionList _secondary_free_list; + + // It keeps track of the old regions. +- MasterOldRegionSet _old_set; ++ HeapRegionSet _old_set; + + // It keeps track of the humongous regions. +- MasterHumongousRegionSet _humongous_set; ++ HeapRegionSet _humongous_set; + + // The number of regions we could create by expansion. + uint _expansion_regions; +@@ -497,13 +497,14 @@ + // check whether there's anything available on the + // secondary_free_list and/or wait for more regions to appear on + // that list, if _free_regions_coming is set. +- HeapRegion* new_region_try_secondary_free_list(); ++ HeapRegion* new_region_try_secondary_free_list(bool is_old); + + // Try to allocate a single non-humongous HeapRegion sufficient for + // an allocation of the given word_size. If do_expand is true, + // attempt to expand the heap if necessary to satisfy the allocation +- // request. +- HeapRegion* new_region(size_t word_size, bool do_expand); ++ // request. If the region is to be used as an old region or for a ++ // humongous object, set is_old to true. If not, to false. ++ HeapRegion* new_region(size_t word_size, bool is_old, bool do_expand); + + // Attempt to satisfy a humongous allocation request of the given + // size by finding a contiguous set of free regions of num_regions +@@ -606,6 +607,11 @@ + // may not be a humongous - it must fit into a single heap region. + HeapWord* par_allocate_during_gc(GCAllocPurpose purpose, size_t word_size); + ++ HeapWord* allocate_during_gc_slow(GCAllocPurpose purpose, ++ HeapRegion* alloc_region, ++ bool par, ++ size_t word_size); ++ + // Ensure that no further allocations can happen in "r", bearing in mind + // that parallel threads might be attempting allocations. + void par_allocate_remaining_space(HeapRegion* r); +@@ -698,24 +704,9 @@ + } + + // This is a fast test on whether a reference points into the +- // collection set or not. It does not assume that the reference +- // points into the heap; if it doesn't, it will return false. +- bool in_cset_fast_test(oop obj) { +- assert(_in_cset_fast_test != NULL, "sanity"); +- if (_g1_committed.contains((HeapWord*) obj)) { +- // no need to subtract the bottom of the heap from obj, +- // _in_cset_fast_test is biased +- uintx index = cast_from_oop(obj) >> HeapRegion::LogOfHRGrainBytes; +- bool ret = _in_cset_fast_test[index]; +- // let's make sure the result is consistent with what the slower +- // test returns +- assert( ret || !obj_in_cs(obj), "sanity"); +- assert(!ret || obj_in_cs(obj), "sanity"); +- return ret; +- } else { +- return false; +- } +- } ++ // collection set or not. Assume that the reference ++ // points into the heap. ++ inline bool in_cset_fast_test(oop obj); + + void clear_cset_fast_test() { + assert(_in_cset_fast_test_base != NULL, "sanity"); +@@ -755,6 +746,29 @@ + + G1HRPrinter* hr_printer() { return &_hr_printer; } + ++ // Frees a non-humongous region by initializing its contents and ++ // adding it to the free list that's passed as a parameter (this is ++ // usually a local list which will be appended to the master free ++ // list later). The used bytes of freed regions are accumulated in ++ // pre_used. If par is true, the region's RSet will not be freed ++ // up. The assumption is that this will be done later. ++ // The locked parameter indicates if the caller has already taken ++ // care of proper synchronization. This may allow some optimizations. ++ void free_region(HeapRegion* hr, ++ FreeRegionList* free_list, ++ bool par, ++ bool locked = false); ++ ++ // Frees a humongous region by collapsing it into individual regions ++ // and calling free_region() for each of them. The freed regions ++ // will be added to the free list that's passed as a parameter (this ++ // is usually a local list which will be appended to the master free ++ // list later). The used bytes of freed regions are accumulated in ++ // pre_used. If par is true, the region's RSet will not be freed ++ // up. The assumption is that this will be done later. ++ void free_humongous_region(HeapRegion* hr, ++ FreeRegionList* free_list, ++ bool par); + protected: + + // Shrink the garbage-first heap by at most the given size (in bytes!). +@@ -831,37 +845,13 @@ + OopClosure* scan_non_heap_roots, + OopsInHeapRegionClosure* scan_rs, + G1KlassScanClosure* scan_klasses, +- int worker_i); ++ uint worker_i); + + // Apply "blk" to all the weak roots of the system. These include + // JNI weak roots, the code cache, system dictionary, symbol table, + // string table, and referents of reachable weak refs. + void g1_process_weak_roots(OopClosure* root_closure); + +- // Frees a non-humongous region by initializing its contents and +- // adding it to the free list that's passed as a parameter (this is +- // usually a local list which will be appended to the master free +- // list later). The used bytes of freed regions are accumulated in +- // pre_used. If par is true, the region's RSet will not be freed +- // up. The assumption is that this will be done later. +- void free_region(HeapRegion* hr, +- size_t* pre_used, +- FreeRegionList* free_list, +- bool par); +- +- // Frees a humongous region by collapsing it into individual regions +- // and calling free_region() for each of them. The freed regions +- // will be added to the free list that's passed as a parameter (this +- // is usually a local list which will be appended to the master free +- // list later). The used bytes of freed regions are accumulated in +- // pre_used. If par is true, the region's RSet will not be freed +- // up. The assumption is that this will be done later. +- void free_humongous_region(HeapRegion* hr, +- size_t* pre_used, +- FreeRegionList* free_list, +- HumongousRegionSet* humongous_proxy_set, +- bool par); +- + // Notifies all the necessary spaces that the committed space has + // been updated (either expanded or shrunk). It should be called + // after _g1_storage is updated. +@@ -1092,6 +1082,8 @@ + // specified by the policy object. + jint initialize(); + ++ virtual void stop(); ++ + // Return the (conservative) maximum heap alignment for any G1 heap + static size_t conservative_max_heap_alignment(); + +@@ -1154,7 +1146,7 @@ + + void iterate_dirty_card_closure(CardTableEntryClosure* cl, + DirtyCardQueue* into_cset_dcq, +- bool concurrent, int worker_i); ++ bool concurrent, uint worker_i); + + // The shared block offset table array. + G1BlockOffsetSharedArray* bot_shared() const { return _bot_shared; } +@@ -1240,21 +1232,17 @@ + bool is_on_master_free_list(HeapRegion* hr) { + return hr->containing_set() == &_free_list; + } +- +- bool is_in_humongous_set(HeapRegion* hr) { +- return hr->containing_set() == &_humongous_set; +- } + #endif // ASSERT + + // Wrapper for the region list operations that can be called from + // methods outside this class. + +- void secondary_free_list_add_as_tail(FreeRegionList* list) { +- _secondary_free_list.add_as_tail(list); ++ void secondary_free_list_add(FreeRegionList* list) { ++ _secondary_free_list.add_ordered(list); + } + + void append_secondary_free_list() { +- _free_list.add_as_head(&_secondary_free_list); ++ _free_list.add_ordered(&_secondary_free_list); + } + + void append_secondary_free_list_if_not_empty_with_lock() { +@@ -1266,9 +1254,7 @@ + } + } + +- void old_set_remove(HeapRegion* hr) { +- _old_set.remove(hr); +- } ++ inline void old_set_remove(HeapRegion* hr); + + size_t non_young_capacity_bytes() { + return _old_set.total_capacity_bytes() + _humongous_set.total_capacity_bytes(); +@@ -1296,27 +1282,9 @@ + // True iff an evacuation has failed in the most-recent collection. + bool evacuation_failed() { return _evacuation_failed; } + +- // It will free a region if it has allocated objects in it that are +- // all dead. It calls either free_region() or +- // free_humongous_region() depending on the type of the region that +- // is passed to it. +- void free_region_if_empty(HeapRegion* hr, +- size_t* pre_used, +- FreeRegionList* free_list, +- OldRegionSet* old_proxy_set, +- HumongousRegionSet* humongous_proxy_set, +- HRRSCleanupTask* hrrs_cleanup_task, +- bool par); +- +- // It appends the free list to the master free list and updates the +- // master humongous list according to the contents of the proxy +- // list. It also adjusts the total used bytes according to pre_used +- // (if par is true, it will do so by taking the ParGCRareEvent_lock). +- void update_sets_after_freeing_regions(size_t pre_used, +- FreeRegionList* free_list, +- OldRegionSet* old_proxy_set, +- HumongousRegionSet* humongous_proxy_set, +- bool par); ++ void remove_from_old_sets(const HeapRegionSetCount& old_regions_removed, const HeapRegionSetCount& humongous_regions_removed); ++ void prepend_to_freelist(FreeRegionList* list); ++ void decrement_summary_bytes(size_t bytes); + + // Returns "TRUE" iff "p" points into the committed areas of the heap. + virtual bool is_in(const void* p) const; +@@ -1377,7 +1345,7 @@ + void heap_region_iterate(HeapRegionClosure* blk) const; + + // Return the region with the given index. It assumes the index is valid. +- HeapRegion* region_at(uint index) const { return _hrs.at(index); } ++ inline HeapRegion* region_at(uint index) const; + + // Divide the heap region sequence into "chunks" of some size (the number + // of regions divided by the number of parallel threads times some +@@ -1418,7 +1386,7 @@ + + // Given the id of a worker, obtain or calculate a suitable + // starting region for iterating over the current collection set. +- HeapRegion* start_cset_region_for_worker(int worker_i); ++ HeapRegion* start_cset_region_for_worker(uint worker_i); + + // This is a convenience method that is used by the + // HeapRegionIterator classes to calculate the starting region for +@@ -1479,9 +1447,11 @@ + // Section on thread-local allocation buffers (TLABs) + // See CollectedHeap for semantics. + +- virtual bool supports_tlab_allocation() const; +- virtual size_t tlab_capacity(Thread* thr) const; +- virtual size_t unsafe_max_tlab_alloc(Thread* thr) const; ++ bool supports_tlab_allocation() const; ++ size_t tlab_capacity(Thread* ignored) const; ++ size_t tlab_used(Thread* ignored) const; ++ size_t max_tlab_size() const; ++ size_t unsafe_max_tlab_alloc(Thread* ignored) const; + + // Can a compiler initialize a new object without store barriers? + // This permission only extends from the creation of a new object +@@ -1504,10 +1474,7 @@ + return true; + } + +- bool is_in_young(const oop obj) { +- HeapRegion* hr = heap_region_containing(obj); +- return hr != NULL && hr->is_young(); +- } ++ inline bool is_in_young(const oop obj); + + #ifdef ASSERT + virtual bool is_in_partial_collection(const void* p); +@@ -1520,9 +1487,7 @@ + // pre-value that needs to be remembered; for the remembered-set + // update logging post-barrier, we don't maintain remembered set + // information for young gen objects. +- virtual bool can_elide_initializing_store_barrier(oop new_obj) { +- return is_in_young(new_obj); +- } ++ virtual inline bool can_elide_initializing_store_barrier(oop new_obj); + + // Returns "true" iff the given word_size is "very large". + static bool isHumongous(size_t word_size) { +@@ -1566,7 +1531,7 @@ + void set_region_short_lived_locked(HeapRegion* hr); + // add appropriate methods for any other surv rate groups + +- YoungList* young_list() { return _young_list; } ++ YoungList* young_list() const { return _young_list; } + + // debugging + bool check_young_list_well_formed() { +@@ -1616,23 +1581,9 @@ + + // Added if it is NULL it isn't dead. + +- bool is_obj_dead(const oop obj) const { +- const HeapRegion* hr = heap_region_containing(obj); +- if (hr == NULL) { +- if (obj == NULL) return false; +- else return true; +- } +- else return is_obj_dead(obj, hr); +- } ++ inline bool is_obj_dead(const oop obj) const; + +- bool is_obj_ill(const oop obj) const { +- const HeapRegion* hr = heap_region_containing(obj); +- if (hr == NULL) { +- if (obj == NULL) return false; +- else return true; +- } +- else return is_obj_ill(obj, hr); +- } ++ inline bool is_obj_ill(const oop obj) const; + + bool allocated_since_marking(oop obj, HeapRegion* hr, VerifyOption vo); + HeapWord* top_at_mark_start(HeapRegion* hr, VerifyOption vo); +@@ -1669,6 +1620,9 @@ + // that were not successfullly evacuated are not migrated. + void migrate_strong_code_roots(); + ++ // Free up superfluous code root memory. ++ void purge_code_root_memory(); ++ + // During an initial mark pause, mark all the code roots that + // point into regions *not* in the collection set. + void mark_strong_code_roots(uint worker_id); +@@ -1677,6 +1631,12 @@ + // after a full GC + void rebuild_strong_code_roots(); + ++ // Delete entries for dead interned string and clean up unreferenced symbols ++ // in symbol table, possibly in parallel. ++ void unlink_string_and_symbol_table(BoolObjectClosure* is_alive, bool unlink_strings = true, bool unlink_symbols = true); ++ ++ // Redirty logged cards in the refinement queue. ++ void redirty_logged_cards(); + // Verification + + // The following is just to alert the verification code +@@ -1717,26 +1677,10 @@ + + bool is_obj_dead_cond(const oop obj, + const HeapRegion* hr, +- const VerifyOption vo) const { +- switch (vo) { +- case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj, hr); +- case VerifyOption_G1UseNextMarking: return is_obj_ill(obj, hr); +- case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked(); +- default: ShouldNotReachHere(); +- } +- return false; // keep some compilers happy +- } ++ const VerifyOption vo) const; + + bool is_obj_dead_cond(const oop obj, +- const VerifyOption vo) const { +- switch (vo) { +- case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj); +- case VerifyOption_G1UseNextMarking: return is_obj_ill(obj); +- case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked(); +- default: ShouldNotReachHere(); +- } +- return false; // keep some compilers happy +- } ++ const VerifyOption vo) const; + + // Printing + +@@ -1755,8 +1699,6 @@ + void print_all_rsets() PRODUCT_RETURN; + + public: +- void stop_conc_gc_threads(); +- + size_t pending_card_num(); + size_t cards_scanned(); + +@@ -1782,95 +1724,6 @@ + ParGCAllocBuffer::retire(end_of_gc, retain); + _retired = true; + } +- +- bool is_retired() { +- return _retired; +- } +-}; +- +-class G1ParGCAllocBufferContainer { +-protected: +- static int const _priority_max = 2; +- G1ParGCAllocBuffer* _priority_buffer[_priority_max]; +- +-public: +- G1ParGCAllocBufferContainer(size_t gclab_word_size) { +- for (int pr = 0; pr < _priority_max; ++pr) { +- _priority_buffer[pr] = new G1ParGCAllocBuffer(gclab_word_size); +- } +- } +- +- ~G1ParGCAllocBufferContainer() { +- for (int pr = 0; pr < _priority_max; ++pr) { +- assert(_priority_buffer[pr]->is_retired(), "alloc buffers should all retire at this point."); +- delete _priority_buffer[pr]; +- } +- } +- +- HeapWord* allocate(size_t word_sz) { +- HeapWord* obj; +- for (int pr = 0; pr < _priority_max; ++pr) { +- obj = _priority_buffer[pr]->allocate(word_sz); +- if (obj != NULL) return obj; +- } +- return obj; +- } +- +- bool contains(void* addr) { +- for (int pr = 0; pr < _priority_max; ++pr) { +- if (_priority_buffer[pr]->contains(addr)) return true; +- } +- return false; +- } +- +- void undo_allocation(HeapWord* obj, size_t word_sz) { +- bool finish_undo; +- for (int pr = 0; pr < _priority_max; ++pr) { +- if (_priority_buffer[pr]->contains(obj)) { +- _priority_buffer[pr]->undo_allocation(obj, word_sz); +- finish_undo = true; +- } +- } +- if (!finish_undo) ShouldNotReachHere(); +- } +- +- size_t words_remaining() { +- size_t result = 0; +- for (int pr = 0; pr < _priority_max; ++pr) { +- result += _priority_buffer[pr]->words_remaining(); +- } +- return result; +- } +- +- size_t words_remaining_in_retired_buffer() { +- G1ParGCAllocBuffer* retired = _priority_buffer[0]; +- return retired->words_remaining(); +- } +- +- void flush_stats_and_retire(PLABStats* stats, bool end_of_gc, bool retain) { +- for (int pr = 0; pr < _priority_max; ++pr) { +- _priority_buffer[pr]->flush_stats_and_retire(stats, end_of_gc, retain); +- } +- } +- +- void update(bool end_of_gc, bool retain, HeapWord* buf, size_t word_sz) { +- G1ParGCAllocBuffer* retired_and_set = _priority_buffer[0]; +- retired_and_set->retire(end_of_gc, retain); +- retired_and_set->set_buf(buf); +- retired_and_set->set_word_size(word_sz); +- adjust_priority_order(); +- } +- +-private: +- void adjust_priority_order() { +- G1ParGCAllocBuffer* retired_and_set = _priority_buffer[0]; +- +- int last = _priority_max - 1; +- for (int pr = 0; pr < last; ++pr) { +- _priority_buffer[pr] = _priority_buffer[pr + 1]; +- } +- _priority_buffer[last] = retired_and_set; +- } + }; + + class G1ParScanThreadState : public StackObj { +@@ -1881,17 +1734,17 @@ + G1SATBCardTableModRefBS* _ct_bs; + G1RemSet* _g1_rem; + +- G1ParGCAllocBufferContainer _surviving_alloc_buffer; +- G1ParGCAllocBufferContainer _tenured_alloc_buffer; +- G1ParGCAllocBufferContainer* _alloc_buffers[GCAllocPurposeCount]; ++ G1ParGCAllocBuffer _surviving_alloc_buffer; ++ G1ParGCAllocBuffer _tenured_alloc_buffer; ++ G1ParGCAllocBuffer* _alloc_buffers[GCAllocPurposeCount]; + ageTable _age_table; + ++ G1ParScanClosure _scanner; ++ + size_t _alloc_buffer_waste; + size_t _undo_waste; + + OopsInHeapRegionClosure* _evac_failure_cl; +- G1ParScanHeapEvacClosure* _evac_cl; +- G1ParScanPartialArrayClosure* _partial_scan_cl; + + int _hash_seed; + uint _queue_num; +@@ -1919,11 +1772,7 @@ + DirtyCardQueue& dirty_card_queue() { return _dcq; } + G1SATBCardTableModRefBS* ctbs() { return _ct_bs; } + +- template void immediate_rs_update(HeapRegion* from, T* p, int tid) { +- if (!from->is_survivor()) { +- _g1_rem->par_write_ref(from, p, tid); +- } +- } ++ template inline void immediate_rs_update(HeapRegion* from, T* p, int tid); + + template void deferred_rs_update(HeapRegion* from, T* p, int tid) { + // If the new value of the field points to the same region or +@@ -1938,7 +1787,7 @@ + } + + public: +- G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num); ++ G1ParScanThreadState(G1CollectedHeap* g1h, uint queue_num, ReferenceProcessor* rp); + + ~G1ParScanThreadState() { + FREE_C_HEAP_ARRAY(size_t, _surviving_young_words_base, mtGC); +@@ -1947,7 +1796,7 @@ + RefToScanQueue* refs() { return _refs; } + ageTable* age_table() { return &_age_table; } + +- G1ParGCAllocBufferContainer* alloc_buffer(GCAllocPurpose purpose) { ++ G1ParGCAllocBuffer* alloc_buffer(GCAllocPurpose purpose) { + return _alloc_buffers[purpose]; + } + +@@ -1965,25 +1814,21 @@ + refs()->push(ref); + } + +- template void update_rs(HeapRegion* from, T* p, int tid) { +- if (G1DeferredRSUpdate) { +- deferred_rs_update(from, p, tid); +- } else { +- immediate_rs_update(from, p, tid); +- } +- } ++ template inline void update_rs(HeapRegion* from, T* p, int tid); + + HeapWord* allocate_slow(GCAllocPurpose purpose, size_t word_sz) { + HeapWord* obj = NULL; + size_t gclab_word_size = _g1h->desired_plab_sz(purpose); + if (word_sz * 100 < gclab_word_size * ParallelGCBufferWastePct) { +- G1ParGCAllocBufferContainer* alloc_buf = alloc_buffer(purpose); ++ G1ParGCAllocBuffer* alloc_buf = alloc_buffer(purpose); ++ add_to_alloc_buffer_waste(alloc_buf->words_remaining()); ++ alloc_buf->retire(false /* end_of_gc */, false /* retain */); + + HeapWord* buf = _g1h->par_allocate_during_gc(purpose, gclab_word_size); + if (buf == NULL) return NULL; // Let caller handle allocation failure. +- +- add_to_alloc_buffer_waste(alloc_buf->words_remaining_in_retired_buffer()); +- alloc_buf->update(false /* end_of_gc */, false /* retain */, buf, gclab_word_size); ++ // Otherwise. ++ alloc_buf->set_word_size(gclab_word_size); ++ alloc_buf->set_buf(buf); + + obj = alloc_buf->allocate(word_sz); + assert(obj != NULL, "buffer was definitely big enough..."); +@@ -2017,14 +1862,6 @@ + return _evac_failure_cl; + } + +- void set_evac_closure(G1ParScanHeapEvacClosure* evac_cl) { +- _evac_cl = evac_cl; +- } +- +- void set_partial_scan_closure(G1ParScanPartialArrayClosure* partial_scan_cl) { +- _partial_scan_cl = partial_scan_cl; +- } +- + int* hash_seed() { return &_hash_seed; } + uint queue_num() { return _queue_num; } + +@@ -2072,29 +1909,70 @@ + false /* retain */); + } + } ++private: ++ #define G1_PARTIAL_ARRAY_MASK 0x2 + +- template void deal_with_reference(T* ref_to_scan) { +- if (has_partial_array_mask(ref_to_scan)) { +- _partial_scan_cl->do_oop_nv(ref_to_scan); +- } else { +- // Note: we can use "raw" versions of "region_containing" because +- // "obj_to_scan" is definitely in the heap, and is not in a +- // humongous region. +- HeapRegion* r = _g1h->heap_region_containing_raw(ref_to_scan); +- _evac_cl->set_region(r); +- _evac_cl->do_oop_nv(ref_to_scan); +- } ++ inline bool has_partial_array_mask(oop* ref) const { ++ return ((uintptr_t)ref & G1_PARTIAL_ARRAY_MASK) == G1_PARTIAL_ARRAY_MASK; + } + +- void deal_with_reference(StarTask ref) { +- assert(verify_task(ref), "sanity"); +- if (ref.is_narrow()) { +- deal_with_reference((narrowOop*)ref); +- } else { +- deal_with_reference((oop*)ref); +- } ++ // We never encode partial array oops as narrowOop*, so return false immediately. ++ // This allows the compiler to create optimized code when popping references from ++ // the work queue. ++ inline bool has_partial_array_mask(narrowOop* ref) const { ++ assert(((uintptr_t)ref & G1_PARTIAL_ARRAY_MASK) != G1_PARTIAL_ARRAY_MASK, "Partial array oop reference encoded as narrowOop*"); ++ return false; + } + ++ // Only implement set_partial_array_mask() for regular oops, not for narrowOops. ++ // We always encode partial arrays as regular oop, to allow the ++ // specialization for has_partial_array_mask() for narrowOops above. ++ // This means that unintentional use of this method with narrowOops are caught ++ // by the compiler. ++ inline oop* set_partial_array_mask(oop obj) const { ++ assert(((uintptr_t)(void *)obj & G1_PARTIAL_ARRAY_MASK) == 0, "Information loss!"); ++ return (oop*) ((uintptr_t)(void *)obj | G1_PARTIAL_ARRAY_MASK); ++ } ++ ++ inline oop clear_partial_array_mask(oop* ref) const { ++ return cast_to_oop((intptr_t)ref & ~G1_PARTIAL_ARRAY_MASK); ++ } ++ ++ inline void do_oop_partial_array(oop* p); ++ ++ // This method is applied to the fields of the objects that have just been copied. ++ template void do_oop_evac(T* p, HeapRegion* from) { ++ assert(!oopDesc::is_null(oopDesc::load_decode_heap_oop(p)), ++ "Reference should not be NULL here as such are never pushed to the task queue."); ++ oop obj = oopDesc::load_decode_heap_oop_not_null(p); ++ ++ // Although we never intentionally push references outside of the collection ++ // set, due to (benign) races in the claim mechanism during RSet scanning more ++ // than one thread might claim the same card. So the same card may be ++ // processed multiple times. So redo this check. ++ if (_g1h->in_cset_fast_test(obj)) { ++ oop forwardee; ++ if (obj->is_forwarded()) { ++ forwardee = obj->forwardee(); ++ } else { ++ forwardee = copy_to_survivor_space(obj); ++ } ++ assert(forwardee != NULL, "forwardee should not be NULL"); ++ oopDesc::encode_store_heap_oop(p, forwardee); ++ } ++ ++ assert(obj != NULL, "Must be"); ++ update_rs(from, p, queue_num()); ++ } ++public: ++ ++ oop copy_to_survivor_space(oop const obj); ++ ++ template inline void deal_with_reference(T* ref_to_scan); ++ ++ inline void deal_with_reference(StarTask ref); ++ ++public: + void trim_queue(); + }; + +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,12 +29,17 @@ + #include "gc_implementation/g1/g1CollectedHeap.hpp" + #include "gc_implementation/g1/g1AllocRegion.inline.hpp" + #include "gc_implementation/g1/g1CollectorPolicy.hpp" ++#include "gc_implementation/g1/g1RemSet.inline.hpp" + #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" ++#include "gc_implementation/g1/heapRegionSet.inline.hpp" + #include "gc_implementation/g1/heapRegionSeq.inline.hpp" + #include "utilities/taskqueue.hpp" + + // Inline functions for G1CollectedHeap + ++// Return the region with the given index. It assumes the index is valid. ++inline HeapRegion* G1CollectedHeap::region_at(uint index) const { return _hrs.at(index); } ++ + template + inline HeapRegion* + G1CollectedHeap::heap_region_containing(const T addr) const { +@@ -54,6 +59,10 @@ + return res; + } + ++inline void G1CollectedHeap::old_set_remove(HeapRegion* hr) { ++ _old_set.remove(hr); ++} ++ + inline bool G1CollectedHeap::obj_in_cs(oop obj) { + HeapRegion* r = _hrs.addr_to_region((HeapWord*) obj); + return r != NULL && r->in_collection_set(); +@@ -150,6 +159,24 @@ + return _cm->nextMarkBitMap()->isMarked((HeapWord *)obj); + } + ++ ++// This is a fast test on whether a reference points into the ++// collection set or not. Assume that the reference ++// points into the heap. ++inline bool G1CollectedHeap::in_cset_fast_test(oop obj) { ++ assert(_in_cset_fast_test != NULL, "sanity"); ++ assert(_g1_committed.contains((HeapWord*) obj), err_msg("Given reference outside of heap, is "PTR_FORMAT, p2i((HeapWord*)obj))); ++ // no need to subtract the bottom of the heap from obj, ++ // _in_cset_fast_test is biased ++ uintx index = cast_from_oop(obj) >> HeapRegion::LogOfHRGrainBytes; ++ bool ret = _in_cset_fast_test[index]; ++ // let's make sure the result is consistent with what the slower ++ // test returns ++ assert( ret || !obj_in_cs(obj), "sanity"); ++ assert(!ret || obj_in_cs(obj), "sanity"); ++ return ret; ++} ++ + #ifndef PRODUCT + // Support for G1EvacuationFailureALot + +@@ -223,4 +250,121 @@ + } + #endif // #ifndef PRODUCT + ++inline bool G1CollectedHeap::is_in_young(const oop obj) { ++ HeapRegion* hr = heap_region_containing(obj); ++ return hr != NULL && hr->is_young(); ++} ++ ++// We don't need barriers for initializing stores to objects ++// in the young gen: for the SATB pre-barrier, there is no ++// pre-value that needs to be remembered; for the remembered-set ++// update logging post-barrier, we don't maintain remembered set ++// information for young gen objects. ++inline bool G1CollectedHeap::can_elide_initializing_store_barrier(oop new_obj) { ++ return is_in_young(new_obj); ++} ++ ++inline bool G1CollectedHeap::is_obj_dead(const oop obj) const { ++ const HeapRegion* hr = heap_region_containing(obj); ++ if (hr == NULL) { ++ if (obj == NULL) return false; ++ else return true; ++ } ++ else return is_obj_dead(obj, hr); ++} ++ ++inline bool G1CollectedHeap::is_obj_ill(const oop obj) const { ++ const HeapRegion* hr = heap_region_containing(obj); ++ if (hr == NULL) { ++ if (obj == NULL) return false; ++ else return true; ++ } ++ else return is_obj_ill(obj, hr); ++} ++ ++template inline void G1ParScanThreadState::immediate_rs_update(HeapRegion* from, T* p, int tid) { ++ if (!from->is_survivor()) { ++ _g1_rem->par_write_ref(from, p, tid); ++ } ++} ++ ++template void G1ParScanThreadState::update_rs(HeapRegion* from, T* p, int tid) { ++ if (G1DeferredRSUpdate) { ++ deferred_rs_update(from, p, tid); ++ } else { ++ immediate_rs_update(from, p, tid); ++ } ++} ++ ++ ++inline void G1ParScanThreadState::do_oop_partial_array(oop* p) { ++ assert(has_partial_array_mask(p), "invariant"); ++ oop from_obj = clear_partial_array_mask(p); ++ ++ assert(Universe::heap()->is_in_reserved(from_obj), "must be in heap."); ++ assert(from_obj->is_objArray(), "must be obj array"); ++ objArrayOop from_obj_array = objArrayOop(from_obj); ++ // The from-space object contains the real length. ++ int length = from_obj_array->length(); ++ ++ assert(from_obj->is_forwarded(), "must be forwarded"); ++ oop to_obj = from_obj->forwardee(); ++ assert(from_obj != to_obj, "should not be chunking self-forwarded objects"); ++ objArrayOop to_obj_array = objArrayOop(to_obj); ++ // We keep track of the next start index in the length field of the ++ // to-space object. ++ int next_index = to_obj_array->length(); ++ assert(0 <= next_index && next_index < length, ++ err_msg("invariant, next index: %d, length: %d", next_index, length)); ++ ++ int start = next_index; ++ int end = length; ++ int remainder = end - start; ++ // We'll try not to push a range that's smaller than ParGCArrayScanChunk. ++ if (remainder > 2 * ParGCArrayScanChunk) { ++ end = start + ParGCArrayScanChunk; ++ to_obj_array->set_length(end); ++ // Push the remainder before we process the range in case another ++ // worker has run out of things to do and can steal it. ++ oop* from_obj_p = set_partial_array_mask(from_obj); ++ push_on_queue(from_obj_p); ++ } else { ++ assert(length == end, "sanity"); ++ // We'll process the final range for this object. Restore the length ++ // so that the heap remains parsable in case of evacuation failure. ++ to_obj_array->set_length(end); ++ } ++ _scanner.set_region(_g1h->heap_region_containing_raw(to_obj)); ++ // Process indexes [start,end). It will also process the header ++ // along with the first chunk (i.e., the chunk with start == 0). ++ // Note that at this point the length field of to_obj_array is not ++ // correct given that we are using it to keep track of the next ++ // start index. oop_iterate_range() (thankfully!) ignores the length ++ // field and only relies on the start / end parameters. It does ++ // however return the size of the object which will be incorrect. So ++ // we have to ignore it even if we wanted to use it. ++ to_obj_array->oop_iterate_range(&_scanner, start, end); ++} ++ ++template inline void G1ParScanThreadState::deal_with_reference(T* ref_to_scan) { ++ if (!has_partial_array_mask(ref_to_scan)) { ++ // Note: we can use "raw" versions of "region_containing" because ++ // "obj_to_scan" is definitely in the heap, and is not in a ++ // humongous region. ++ HeapRegion* r = _g1h->heap_region_containing_raw(ref_to_scan); ++ do_oop_evac(ref_to_scan, r); ++ } else { ++ do_oop_partial_array((oop*)ref_to_scan); ++ } ++} ++ ++inline void G1ParScanThreadState::deal_with_reference(StarTask ref) { ++ assert(verify_task(ref), "sanity"); ++ if (ref.is_narrow()) { ++ deal_with_reference((narrowOop*)ref); ++ } else { ++ deal_with_reference((oop*)ref); ++ } ++} ++ + #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1COLLECTEDHEAP_INLINE_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -22,6 +22,10 @@ + * + */ + ++#ifndef __clang_major__ ++#define ATTRIBUTE_PRINTF(x,y) // FIXME, formats are a mess. ++#endif ++ + #include "precompiled.hpp" + #include "gc_implementation/g1/concurrentG1Refine.hpp" + #include "gc_implementation/g1/concurrentMark.hpp" +@@ -965,7 +969,7 @@ + + #ifndef PRODUCT + if (G1YoungSurvRateVerbose) { +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + _short_lived_surv_rate_group->print(); + // do that for any other surv rate groups too + } +@@ -1204,7 +1208,7 @@ + (_young_list_target_length * HeapRegion::GrainBytes) - _survivor_used_bytes_before_gc; + + if (full) { +- _metaspace_used_bytes_before_gc = MetaspaceAux::allocated_used_bytes(); ++ _metaspace_used_bytes_before_gc = MetaspaceAux::used_bytes(); + } + } + +@@ -2222,11 +2226,11 @@ + + gclog_or_tty->print_cr("ALL PAUSES"); + print_summary_sd(" Total", &_total); +- gclog_or_tty->print_cr(""); +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); ++ gclog_or_tty->cr(); + gclog_or_tty->print_cr(" Young GC Pauses: %8d", _young_pause_num); + gclog_or_tty->print_cr(" Mixed GC Pauses: %8d", _mixed_pause_num); +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + + gclog_or_tty->print_cr("EVACUATION PAUSES"); + +@@ -2246,7 +2250,7 @@ + print_summary(" Clear CT", &_clear_ct); + print_summary(" Other", &_other); + } +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + + gclog_or_tty->print_cr("MISC"); + print_summary_sd(" Stop World", &_all_stop_world_times_ms); +--- ./hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -820,6 +820,8 @@ + // do that for any other surv rate groups + } + ++ size_t young_list_target_length() const { return _young_list_target_length; } ++ + bool is_young_list_full() { + uint young_list_length = _g1->young_list()->length(); + uint young_list_target_length = _young_list_target_length; +--- ./hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 2014 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,6 +27,7 @@ + #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" + #include "gc_implementation/g1/g1GCPhaseTimes.hpp" + #include "gc_implementation/g1/g1Log.hpp" ++#include "gc_implementation/g1/g1StringDedup.hpp" + + // Helper class for avoiding interleaved logging + class LineBuffer: public StackObj { +@@ -38,7 +39,7 @@ + int _indent_level; + int _cur; + +- void vappend(const char* format, va_list ap) { ++ void vappend(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0) { + int res = vsnprintf(&_buffer[_cur], BUFFER_LEN - _cur, format, ap); + if (res != -1) { + _cur += res; +@@ -62,14 +63,14 @@ + } + #endif + +- void append(const char* format, ...) { ++ void append(const char* format, ...) ATTRIBUTE_PRINTF(2, 3) { + va_list ap; + va_start(ap, format); + vappend(format, ap); + va_end(ap); + } + +- void append_and_print_cr(const char* format, ...) { ++ void append_and_print_cr(const char* format, ...) ATTRIBUTE_PRINTF(2, 3) { + va_list ap; + va_start(ap, format); + vappend(format, ap); +@@ -79,6 +80,8 @@ + } + }; + ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED + template + void WorkerDataArray::print(int level, const char* title) { + if (_length == 1) { +@@ -108,7 +111,7 @@ + } + + if (G1Log::finest()) { +- buf.append_and_print_cr(""); ++ buf.append_and_print_cr("%s", ""); + } + + double avg = (double)sum / (double)_length; +@@ -128,6 +131,7 @@ + } + buf.append_and_print_cr("]"); + } ++PRAGMA_DIAG_POP + + #ifndef PRODUCT + +@@ -168,7 +172,9 @@ + _last_termination_attempts(_max_gc_threads, SIZE_FORMAT), + _last_gc_worker_end_times_ms(_max_gc_threads, "%.1lf", false), + _last_gc_worker_times_ms(_max_gc_threads, "%.1lf"), +- _last_gc_worker_other_times_ms(_max_gc_threads, "%.1lf") ++ _last_gc_worker_other_times_ms(_max_gc_threads, "%.1lf"), ++ _cur_string_dedup_queue_fixup_worker_times_ms(_max_gc_threads, "%.1lf"), ++ _cur_string_dedup_table_fixup_worker_times_ms(_max_gc_threads, "%.1lf") + { + assert(max_gc_threads > 0, "Must have some GC threads"); + } +@@ -229,12 +235,22 @@ + _last_gc_worker_other_times_ms.verify(); + } + ++void G1GCPhaseTimes::note_string_dedup_fixup_start() { ++ _cur_string_dedup_queue_fixup_worker_times_ms.reset(); ++ _cur_string_dedup_table_fixup_worker_times_ms.reset(); ++} ++ ++void G1GCPhaseTimes::note_string_dedup_fixup_end() { ++ _cur_string_dedup_queue_fixup_worker_times_ms.verify(); ++ _cur_string_dedup_table_fixup_worker_times_ms.verify(); ++} ++ + void G1GCPhaseTimes::print_stats(int level, const char* str, double value) { + LineBuffer(level).append_and_print_cr("[%s: %.1lf ms]", str, value); + } + +-void G1GCPhaseTimes::print_stats(int level, const char* str, double value, int workers) { +- LineBuffer(level).append_and_print_cr("[%s: %.1lf ms, GC Workers: %d]", str, value, workers); ++void G1GCPhaseTimes::print_stats(int level, const char* str, double value, uint workers) { ++ LineBuffer(level).append_and_print_cr("[%s: %.1lf ms, GC Workers: " UINT32_FORMAT "]", str, value, workers); + } + + double G1GCPhaseTimes::accounted_time_ms() { +@@ -250,6 +266,14 @@ + // Strong code root migration time + misc_time_ms += _cur_strong_code_root_migration_time_ms; + ++ // Strong code root purge time ++ misc_time_ms += _cur_strong_code_root_purge_time_ms; ++ ++ if (G1StringDedup::is_enabled()) { ++ // String dedup fixup time ++ misc_time_ms += _cur_string_dedup_fixup_time_ms; ++ } ++ + // Subtract the time taken to clean the card table from the + // current value of "other time" + misc_time_ms += _cur_clear_ct_time_ms; +@@ -299,20 +323,43 @@ + } + print_stats(1, "Code Root Fixup", _cur_collection_code_root_fixup_time_ms); + print_stats(1, "Code Root Migration", _cur_strong_code_root_migration_time_ms); ++ print_stats(1, "Code Root Purge", _cur_strong_code_root_purge_time_ms); ++ if (G1StringDedup::is_enabled()) { ++ print_stats(1, "String Dedup Fixup", _cur_string_dedup_fixup_time_ms, _active_gc_threads); ++ _cur_string_dedup_queue_fixup_worker_times_ms.print(2, "Queue Fixup (ms)"); ++ _cur_string_dedup_table_fixup_worker_times_ms.print(2, "Table Fixup (ms)"); ++ } + print_stats(1, "Clear CT", _cur_clear_ct_time_ms); + double misc_time_ms = pause_time_sec * MILLIUNITS - accounted_time_ms(); + print_stats(1, "Other", misc_time_ms); + if (_cur_verify_before_time_ms > 0.0) { + print_stats(2, "Verify Before", _cur_verify_before_time_ms); + } ++ if (G1CollectedHeap::heap()->evacuation_failed()) { ++ double evac_fail_handling = _cur_evac_fail_recalc_used + _cur_evac_fail_remove_self_forwards + ++ _cur_evac_fail_restore_remsets; ++ print_stats(2, "Evacuation Failure", evac_fail_handling); ++ if (G1Log::finest()) { ++ print_stats(3, "Recalculate Used", _cur_evac_fail_recalc_used); ++ print_stats(3, "Remove Self Forwards", _cur_evac_fail_remove_self_forwards); ++ print_stats(3, "Restore RemSet", _cur_evac_fail_restore_remsets); ++ } ++ } + print_stats(2, "Choose CSet", + (_recorded_young_cset_choice_time_ms + + _recorded_non_young_cset_choice_time_ms)); + print_stats(2, "Ref Proc", _cur_ref_proc_time_ms); + print_stats(2, "Ref Enq", _cur_ref_enq_time_ms); ++ if (G1DeferredRSUpdate) { ++ print_stats(2, "Redirty Cards", _recorded_redirty_logged_cards_time_ms); ++ } + print_stats(2, "Free CSet", + (_recorded_young_free_cset_time_ms + + _recorded_non_young_free_cset_time_ms)); ++ if (G1Log::finest()) { ++ print_stats(3, "Young Free CSet", _recorded_young_free_cset_time_ms); ++ print_stats(3, "Non-Young Free CSet", _recorded_non_young_free_cset_time_ms); ++ } + if (_cur_verify_after_time_ms > 0.0) { + print_stats(2, "Verify After", _cur_verify_after_time_ms); + } +--- ./hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -131,6 +131,15 @@ + double _cur_collection_par_time_ms; + double _cur_collection_code_root_fixup_time_ms; + double _cur_strong_code_root_migration_time_ms; ++ double _cur_strong_code_root_purge_time_ms; ++ ++ double _cur_evac_fail_recalc_used; ++ double _cur_evac_fail_restore_remsets; ++ double _cur_evac_fail_remove_self_forwards; ++ ++ double _cur_string_dedup_fixup_time_ms; ++ WorkerDataArray _cur_string_dedup_queue_fixup_worker_times_ms; ++ WorkerDataArray _cur_string_dedup_table_fixup_worker_times_ms; + + double _cur_clear_ct_time_ms; + double _cur_ref_proc_time_ms; +@@ -142,6 +151,8 @@ + double _recorded_young_cset_choice_time_ms; + double _recorded_non_young_cset_choice_time_ms; + ++ double _recorded_redirty_logged_cards_time_ms; ++ + double _recorded_young_free_cset_time_ms; + double _recorded_non_young_free_cset_time_ms; + +@@ -150,7 +161,7 @@ + + // Helper methods for detailed logging + void print_stats(int level, const char* str, double value); +- void print_stats(int level, const char* str, double value, int workers); ++ void print_stats(int level, const char* str, double value, uint workers); + + public: + G1GCPhaseTimes(uint max_gc_threads); +@@ -223,6 +234,37 @@ + _cur_strong_code_root_migration_time_ms = ms; + } + ++ void record_strong_code_root_purge_time(double ms) { ++ _cur_strong_code_root_purge_time_ms = ms; ++ } ++ ++ void record_evac_fail_recalc_used_time(double ms) { ++ _cur_evac_fail_recalc_used = ms; ++ } ++ ++ void record_evac_fail_restore_remsets(double ms) { ++ _cur_evac_fail_restore_remsets = ms; ++ } ++ ++ void record_evac_fail_remove_self_forwards(double ms) { ++ _cur_evac_fail_remove_self_forwards = ms; ++ } ++ ++ void note_string_dedup_fixup_start(); ++ void note_string_dedup_fixup_end(); ++ ++ void record_string_dedup_fixup_time(double ms) { ++ _cur_string_dedup_fixup_time_ms = ms; ++ } ++ ++ void record_string_dedup_queue_fixup_worker_time(uint worker_id, double ms) { ++ _cur_string_dedup_queue_fixup_worker_times_ms.set(worker_id, ms); ++ } ++ ++ void record_string_dedup_table_fixup_worker_time(uint worker_id, double ms) { ++ _cur_string_dedup_table_fixup_worker_times_ms.set(worker_id, ms); ++ } ++ + void record_ref_proc_time(double ms) { + _cur_ref_proc_time_ms = ms; + } +@@ -251,6 +293,10 @@ + _recorded_non_young_cset_choice_time_ms = time_ms; + } + ++ void record_redirty_logged_cards_time_ms(double time_ms) { ++ _recorded_redirty_logged_cards_time_ms = time_ms; ++ } ++ + void record_cur_collection_start_sec(double time_ms) { + _cur_collection_start_sec = time_ms; + } +--- ./hotspot/src/share/vm/gc_implementation/g1/g1HRPrinter.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1HRPrinter.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 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 +@@ -27,6 +27,8 @@ + #include "gc_implementation/g1/heapRegion.hpp" + #include "utilities/ostream.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + const char* G1HRPrinter::action_name(ActionType action) { + switch(action) { + case Alloc: return "ALLOC"; +--- ./hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -44,9 +44,9 @@ + _hot_cache_idx = 0; + + // For refining the cards in the hot cache in parallel +- int n_workers = (ParallelGCThreads > 0 ? ++ uint n_workers = (ParallelGCThreads > 0 ? + _g1h->workers()->total_workers() : 1); +- _hot_cache_par_chunk_size = MAX2(1, _hot_cache_size / n_workers); ++ _hot_cache_par_chunk_size = MAX2(1, _hot_cache_size / (int)n_workers); + _hot_cache_par_claimed_idx = 0; + + _card_counts.initialize(); +@@ -89,7 +89,7 @@ + return res; + } + +-void G1HotCardCache::drain(int worker_i, ++void G1HotCardCache::drain(uint worker_i, + G1RemSet* g1rs, + DirtyCardQueue* into_cset_dcq) { + if (!default_use_cache()) { +@@ -122,8 +122,8 @@ + // RSet updating while within an evacuation pause. + // In this case worker_i should be the id of a GC worker thread + assert(SafepointSynchronize::is_at_safepoint(), "Should be at a safepoint"); +- assert(worker_i < (int) (ParallelGCThreads == 0 ? 1 : ParallelGCThreads), +- err_msg("incorrect worker id: "INT32_FORMAT, worker_i)); ++ assert(worker_i < (ParallelGCThreads == 0 ? 1 : ParallelGCThreads), ++ err_msg("incorrect worker id: "UINT32_FORMAT, worker_i)); + + into_cset_dcq->enqueue(card_ptr); + } +--- ./hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1HotCardCache.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -99,7 +99,7 @@ + + // Refine the cards that have delayed as a result of + // being in the cache. +- void drain(int worker_i, G1RemSet* g1rs, DirtyCardQueue* into_cset_dcq); ++ void drain(uint worker_i, G1RemSet* g1rs, DirtyCardQueue* into_cset_dcq); + + // Set up for parallel processing of the cards in the hot cache + void reset_hot_cache_claimed_index() { +--- ./hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -31,6 +31,7 @@ + #include "code/icBuffer.hpp" + #include "gc_implementation/g1/g1Log.hpp" + #include "gc_implementation/g1/g1MarkSweep.hpp" ++#include "gc_implementation/g1/g1StringDedup.hpp" + #include "gc_implementation/shared/gcHeapSummary.hpp" + #include "gc_implementation/shared/gcTimer.hpp" + #include "gc_implementation/shared/gcTrace.hpp" +@@ -163,11 +164,8 @@ + // Prune dead klasses from subklass/sibling/implementor lists. + Klass::clean_weak_klass_links(&GenMarkSweep::is_alive); + +- // Delete entries for dead interned strings. +- StringTable::unlink(&GenMarkSweep::is_alive); +- +- // Clean up unreferenced symbols in symbol table. +- SymbolTable::unlink(); ++ // Delete entries for dead interned string and clean up unreferenced symbols in symbol table. ++ G1CollectedHeap::heap()->unlink_string_and_symbol_table(&GenMarkSweep::is_alive); + + if (VerifyDuringGC) { + HandleMark hm; // handle scope +@@ -199,17 +197,19 @@ + G1CollectedHeap* _g1h; + ModRefBarrierSet* _mrbs; + CompactPoint _cp; +- HumongousRegionSet _humongous_proxy_set; ++ HeapRegionSetCount _humongous_regions_removed; + + void free_humongous_region(HeapRegion* hr) { + HeapWord* end = hr->end(); +- size_t dummy_pre_used; + FreeRegionList dummy_free_list("Dummy Free List for G1MarkSweep"); + + assert(hr->startsHumongous(), + "Only the start of a humongous region should be freed."); +- _g1h->free_humongous_region(hr, &dummy_pre_used, &dummy_free_list, +- &_humongous_proxy_set, false /* par */); ++ ++ hr->set_containing_set(NULL); ++ _humongous_regions_removed.increment(1u, hr->capacity()); ++ ++ _g1h->free_humongous_region(hr, &dummy_free_list, false /* par */); + hr->prepare_for_compaction(&_cp); + // Also clear the part of the card table that will be unused after + // compaction. +@@ -222,16 +222,13 @@ + : _g1h(G1CollectedHeap::heap()), + _mrbs(_g1h->g1_barrier_set()), + _cp(NULL, cs, cs->initialize_threshold()), +- _humongous_proxy_set("G1MarkSweep Humongous Proxy Set") { } ++ _humongous_regions_removed() { } + + void update_sets() { + // We'll recalculate total used bytes and recreate the free list + // at the end of the GC, so no point in updating those values here. +- _g1h->update_sets_after_freeing_regions(0, /* pre_used */ +- NULL, /* free_list */ +- NULL, /* old_proxy_set */ +- &_humongous_proxy_set, +- false /* par */); ++ HeapRegionSetCount empty_set; ++ _g1h->remove_from_old_sets(empty_set, _humongous_regions_removed); + } + + bool doHeapRegion(HeapRegion* hr) { +@@ -324,6 +321,10 @@ + // have been cleared if they pointed to non-surviving objects.) + g1h->g1_process_weak_roots(&GenMarkSweep::adjust_pointer_closure); + ++ if (G1StringDedup::is_enabled()) { ++ G1StringDedup::oops_do(&GenMarkSweep::adjust_pointer_closure); ++ } ++ + GenMarkSweep::adjust_marks(); + + G1AdjustPointersClosure blk; +--- ./hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,31 @@ ++/* ++ * 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 "gc_implementation/g1/g1CollectedHeap.inline.hpp" ++#include "gc_implementation/g1/g1OopClosures.inline.hpp" ++ ++G1ParCopyHelper::G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : ++ G1ParClosureSuper(g1, par_scan_state), _scanned_klass(NULL), ++ _cm(_g1->concurrent_mark()) {} +--- ./hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -38,7 +38,7 @@ + + // A class that scans oops in a given heap region (much as OopsInGenClosure + // scans oops in a generation.) +-class OopsInHeapRegionClosure: public OopsInGenClosure { ++class OopsInHeapRegionClosure: public ExtendedOopClosure { + protected: + HeapRegion* _from; + public: +@@ -48,12 +48,8 @@ + class G1ParClosureSuper : public OopsInHeapRegionClosure { + protected: + G1CollectedHeap* _g1; +- G1RemSet* _g1_rem; +- ConcurrentMark* _cm; + G1ParScanThreadState* _par_scan_state; + uint _worker_id; +- bool _during_initial_mark; +- bool _mark_in_progress; + public: + G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state); + bool apply_to_weak_ref_discovered_field() { return true; } +@@ -84,59 +80,12 @@ + virtual void do_oop(narrowOop* p) { do_oop_nv(p); } + }; + +-#define G1_PARTIAL_ARRAY_MASK 0x2 +- +-template inline bool has_partial_array_mask(T* ref) { +- return ((uintptr_t)ref & G1_PARTIAL_ARRAY_MASK) == G1_PARTIAL_ARRAY_MASK; +-} +- +-template inline T* set_partial_array_mask(T obj) { +- assert(((uintptr_t)(void *)obj & G1_PARTIAL_ARRAY_MASK) == 0, "Information loss!"); +- return (T*) ((uintptr_t)(void *)obj | G1_PARTIAL_ARRAY_MASK); +-} +- +-template inline oop clear_partial_array_mask(T* ref) { +- return cast_to_oop((intptr_t)ref & ~G1_PARTIAL_ARRAY_MASK); +-} +- +-class G1ParScanPartialArrayClosure : public G1ParClosureSuper { +- G1ParScanClosure _scanner; +- +-public: +- G1ParScanPartialArrayClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, ReferenceProcessor* rp) : +- G1ParClosureSuper(g1, par_scan_state), _scanner(g1, par_scan_state, rp) +- { +- assert(_ref_processor == NULL, "sanity"); +- } +- +- G1ParScanClosure* scanner() { +- return &_scanner; +- } +- +- template void do_oop_nv(T* p); +- virtual void do_oop(oop* p) { do_oop_nv(p); } +- virtual void do_oop(narrowOop* p) { do_oop_nv(p); } +-}; +- + // Add back base class for metadata + class G1ParCopyHelper : public G1ParClosureSuper { ++protected: + Klass* _scanned_klass; ++ ConcurrentMark* _cm; + +- public: +- G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) : +- _scanned_klass(NULL), +- G1ParClosureSuper(g1, par_scan_state) {} +- +- void set_scanned_klass(Klass* k) { _scanned_klass = k; } +- template void do_klass_barrier(T* p, oop new_obj); +-}; +- +-template +-class G1ParCopyClosure : public G1ParCopyHelper { +- G1ParScanClosure _scanner; +- template void do_oop_work(T* p); +- +-protected: + // Mark the object if it's not already marked. This is used to mark + // objects pointed to by roots that are guaranteed not to move + // during the GC (i.e., non-CSet objects). It is MT-safe. +@@ -146,50 +95,41 @@ + // objects pointed to by roots that have been forwarded during a + // GC. It is MT-safe. + void mark_forwarded_object(oop from_obj, oop to_obj); ++ public: ++ G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state); + +- oop copy_to_survivor_space(oop obj); ++ void set_scanned_klass(Klass* k) { _scanned_klass = k; } ++ template void do_klass_barrier(T* p, oop new_obj); ++}; ++ ++template ++class G1ParCopyClosure : public G1ParCopyHelper { ++private: ++ template void do_oop_work(T* p); + + public: + G1ParCopyClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state, + ReferenceProcessor* rp) : +- _scanner(g1, par_scan_state, rp), + G1ParCopyHelper(g1, par_scan_state) { + assert(_ref_processor == NULL, "sanity"); + } + +- G1ParScanClosure* scanner() { return &_scanner; } +- +- template void do_oop_nv(T* p) { +- do_oop_work(p); +- } ++ template void do_oop_nv(T* p) { do_oop_work(p); } + virtual void do_oop(oop* p) { do_oop_nv(p); } + virtual void do_oop(narrowOop* p) { do_oop_nv(p); } + }; + +-typedef G1ParCopyClosure G1ParScanExtRootClosure; +-typedef G1ParCopyClosure G1ParScanMetadataClosure; ++typedef G1ParCopyClosure G1ParScanExtRootClosure; ++typedef G1ParCopyClosure G1ParScanMetadataClosure; + + +-typedef G1ParCopyClosure G1ParScanAndMarkExtRootClosure; +-typedef G1ParCopyClosure G1ParScanAndMarkClosure; +-typedef G1ParCopyClosure G1ParScanAndMarkMetadataClosure; +- +-// The following closure types are no longer used but are retained +-// for historical reasons: +-// typedef G1ParCopyClosure G1ParScanHeapRSClosure; +-// typedef G1ParCopyClosure G1ParScanAndMarkHeapRSClosure; +- +-// The following closure type is defined in g1_specialized_oop_closures.hpp: +-// +-// typedef G1ParCopyClosure G1ParScanHeapEvacClosure; ++typedef G1ParCopyClosure G1ParScanAndMarkExtRootClosure; ++typedef G1ParCopyClosure G1ParScanAndMarkMetadataClosure; + + // We use a separate closure to handle references during evacuation + // failure processing. +-// We could have used another instance of G1ParScanHeapEvacClosure +-// (since that closure no longer assumes that the references it +-// handles point into the collection set). + +-typedef G1ParCopyClosure G1ParScanHeapEvacFailureClosure; ++typedef G1ParCopyClosure G1ParScanHeapEvacFailureClosure; + + class FilterIntoCSClosure: public ExtendedOopClosure { + G1CollectedHeap* _g1; +@@ -294,14 +234,14 @@ + HeapRegion* _from; + OopsInHeapRegionClosure* _push_ref_cl; + bool _record_refs_into_cset; +- int _worker_i; ++ uint _worker_i; + + public: + G1UpdateRSOrPushRefOopClosure(G1CollectedHeap* g1h, + G1RemSet* rs, + OopsInHeapRegionClosure* push_ref_cl, + bool record_refs_into_cset, +- int worker_i = 0); ++ uint worker_i = 0); + + void set_from(HeapRegion* from) { + assert(from != NULL, "from region must be non-NULL"); +--- ./hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,6 +29,7 @@ + #include "gc_implementation/g1/g1CollectedHeap.hpp" + #include "gc_implementation/g1/g1OopClosures.hpp" + #include "gc_implementation/g1/g1RemSet.hpp" ++#include "gc_implementation/g1/g1RemSet.inline.hpp" + #include "gc_implementation/g1/heapRegionRemSet.hpp" + + /* +@@ -82,7 +83,7 @@ + + _par_scan_state->push_on_queue(p); + } else { +- _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num()); ++ _par_scan_state->update_rs(_from, p, _worker_id); + } + } + } +@@ -113,7 +114,7 @@ + if (_cm->verbose_high()) { + gclog_or_tty->print_cr("[%u] we're looking at location " + "*"PTR_FORMAT" = "PTR_FORMAT, +- _task->worker_id(), p, (void*) obj); ++ _task->worker_id(), p2i(p), p2i((void*) obj)); + } + _task->deal_with_reference(obj); + } +--- ./hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -39,6 +39,8 @@ + #include "oops/oop.inline.hpp" + #include "utilities/intHisto.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #define CARD_REPEAT_HISTO 0 + + #if CARD_REPEAT_HISTO +@@ -114,14 +116,14 @@ + G1SATBCardTableModRefBS *_ct_bs; + + double _strong_code_root_scan_time_sec; +- int _worker_i; ++ uint _worker_i; + int _block_size; + bool _try_claimed; + + public: + ScanRSClosure(OopsInHeapRegionClosure* oc, + CodeBlobToOopClosure* code_root_cl, +- int worker_i) : ++ uint worker_i) : + _oc(oc), + _code_root_cl(code_root_cl), + _strong_code_root_scan_time_sec(0.0), +@@ -163,7 +165,7 @@ + + void printCard(HeapRegion* card_region, size_t card_index, + HeapWord* card_start) { +- gclog_or_tty->print_cr("T %d Region [" PTR_FORMAT ", " PTR_FORMAT ") " ++ gclog_or_tty->print_cr("T " UINT32_FORMAT " Region [" PTR_FORMAT ", " PTR_FORMAT ") " + "RS names card %p: " + "[" PTR_FORMAT ", " PTR_FORMAT ")", + _worker_i, +@@ -242,7 +244,7 @@ + + void G1RemSet::scanRS(OopsInHeapRegionClosure* oc, + CodeBlobToOopClosure* code_root_cl, +- int worker_i) { ++ uint worker_i) { + double rs_time_start = os::elapsedTime(); + HeapRegion *startRegion = _g1->start_cset_region_for_worker(worker_i); + +@@ -275,13 +277,13 @@ + DirtyCardQueue* into_cset_dcq) : + _g1rs(g1h->g1_rem_set()), _into_cset_dcq(into_cset_dcq) + {} +- bool do_card_ptr(jbyte* card_ptr, int worker_i) { ++ bool do_card_ptr(jbyte* card_ptr, uint worker_i) { + // The only time we care about recording cards that + // contain references that point into the collection set + // is during RSet updating within an evacuation pause. + // In this case worker_i should be the id of a GC worker thread. + assert(SafepointSynchronize::is_at_safepoint(), "not during an evacuation pause"); +- assert(worker_i < (int) (ParallelGCThreads == 0 ? 1 : ParallelGCThreads), "should be a GC worker"); ++ assert(worker_i < (ParallelGCThreads == 0 ? 1 : ParallelGCThreads), "should be a GC worker"); + + if (_g1rs->refine_card(card_ptr, worker_i, true)) { + // 'card_ptr' contains references that point into the collection +@@ -296,7 +298,7 @@ + } + }; + +-void G1RemSet::updateRS(DirtyCardQueue* into_cset_dcq, int worker_i) { ++void G1RemSet::updateRS(DirtyCardQueue* into_cset_dcq, uint worker_i) { + double start = os::elapsedTime(); + // Apply the given closure to all remaining log entries. + RefineRecordRefsIntoCSCardTableEntryClosure into_cset_update_rs_cl(_g1, into_cset_dcq); +@@ -321,14 +323,14 @@ + + void G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc, + CodeBlobToOopClosure* code_root_cl, +- int worker_i) { ++ uint worker_i) { + #if CARD_REPEAT_HISTO + ct_freq_update_histo_and_reset(); + #endif + + // We cache the value of 'oc' closure into the appropriate slot in the + // _cset_rs_update_cl for this worker +- assert(worker_i < (int)n_workers(), "sanity"); ++ assert(worker_i < n_workers(), "sanity"); + _cset_rs_update_cl[worker_i] = oc; + + // A DirtyCardQueue that is used to hold cards containing references +@@ -400,7 +402,7 @@ + _g1(g1), _ct_bs(bs) + { } + +- bool do_card_ptr(jbyte* card_ptr, int worker_i) { ++ bool do_card_ptr(jbyte* card_ptr, uint worker_i) { + // Construct the region representing the card. + HeapWord* start = _ct_bs->addr_for(card_ptr); + // And find the region containing it. +@@ -463,8 +465,9 @@ + int into_cset_n_buffers = into_cset_dcqs.completed_buffers_num(); + + if (_g1->evacuation_failed()) { ++ double restore_remembered_set_start = os::elapsedTime(); ++ + // Restore remembered sets for the regions pointing into the collection set. +- + if (G1DeferredRSUpdate) { + // If deferred RS updates are enabled then we just need to transfer + // the completed buffers from (a) the DirtyCardQueueSet used to hold +@@ -483,6 +486,8 @@ + } + assert(n_completed_buffers == into_cset_n_buffers, "missed some buffers"); + } ++ ++ _g1->g1_policy()->phase_times()->record_evac_fail_restore_remsets((os::elapsedTime() - restore_remembered_set_start) * 1000.0); + } + + // Free any completed buffers in the DirtyCardQueueSet used to hold cards +@@ -541,7 +546,7 @@ + G1RemSet* rs, + OopsInHeapRegionClosure* push_ref_cl, + bool record_refs_into_cset, +- int worker_i) : ++ uint worker_i) : + _g1(g1h), _g1_rem_set(rs), _from(NULL), + _record_refs_into_cset(record_refs_into_cset), + _push_ref_cl(push_ref_cl), _worker_i(worker_i) { } +@@ -550,7 +555,7 @@ + // into the collection set, if we're checking for such references; + // false otherwise. + +-bool G1RemSet::refine_card(jbyte* card_ptr, int worker_i, ++bool G1RemSet::refine_card(jbyte* card_ptr, uint worker_i, + bool check_for_refs_into_cset) { + + // If the card is no longer dirty, nothing to do. +--- ./hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -97,7 +97,7 @@ + // In the sequential case this param will be ignored. + void oops_into_collection_set_do(OopsInHeapRegionClosure* blk, + CodeBlobToOopClosure* code_root_cl, +- int worker_i); ++ uint worker_i); + + // Prepare for and cleanup after an oops_into_collection_set_do + // call. Must call each of these once before and after (in sequential +@@ -109,9 +109,9 @@ + + void scanRS(OopsInHeapRegionClosure* oc, + CodeBlobToOopClosure* code_root_cl, +- int worker_i); ++ uint worker_i); + +- void updateRS(DirtyCardQueue* into_cset_dcq, int worker_i); ++ void updateRS(DirtyCardQueue* into_cset_dcq, uint worker_i); + + CardTableModRefBS* ct_bs() { return _ct_bs; } + size_t cardsScanned() { return _total_cards_scanned; } +@@ -138,7 +138,7 @@ + // if the given card contains oops that have references into the + // current collection set. + virtual bool refine_card(jbyte* card_ptr, +- int worker_i, ++ uint worker_i, + bool check_for_refs_into_cset); + + // Print accumulated summary info from the start of the VM. +@@ -171,12 +171,12 @@ + class UpdateRSOopClosure: public ExtendedOopClosure { + HeapRegion* _from; + G1RemSet* _rs; +- int _worker_i; ++ uint _worker_i; + + template void do_oop_work(T* p); + + public: +- UpdateRSOopClosure(G1RemSet* rs, int worker_i = 0) : ++ UpdateRSOopClosure(G1RemSet* rs, uint worker_i = 0) : + _from(NULL), _rs(rs), _worker_i(worker_i) + {} + +--- ./hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -95,7 +95,15 @@ + jbyte *const first = byte_for(mr.start()); + jbyte *const last = byte_after(mr.last()); + +- memset(first, g1_young_gen, last - first); ++ // Below we may use an explicit loop instead of memset() because on ++ // certain platforms memset() can give concurrent readers phantom zeros. ++ if (UseMemSetInBOT) { ++ memset(first, g1_young_gen, last - first); ++ } else { ++ for (jbyte* i = first; i < last; i++) { ++ *i = g1_young_gen; ++ } ++ } + } + + #ifndef PRODUCT +@@ -115,7 +123,8 @@ + + void + G1SATBCardTableLoggingModRefBS::write_ref_field_work(void* field, +- oop new_val) { ++ oop new_val, ++ bool release) { + volatile jbyte* byte = byte_for(field); + if (*byte == g1_young_gen) { + return; +--- ./hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -151,7 +151,7 @@ + G1SATBCardTableModRefBS::is_a(bsn); + } + +- void write_ref_field_work(void* field, oop new_val); ++ void write_ref_field_work(void* field, oop new_val, bool release = false); + + // Can be called from static contexts. + static void write_ref_field_static(void* field, oop new_val); +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,213 @@ ++/* ++ * 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 "classfile/javaClasses.hpp" ++#include "gc_implementation/g1/g1CollectedHeap.inline.hpp" ++#include "gc_implementation/g1/g1GCPhaseTimes.hpp" ++#include "gc_implementation/g1/g1StringDedup.hpp" ++#include "gc_implementation/g1/g1StringDedupQueue.hpp" ++#include "gc_implementation/g1/g1StringDedupStat.hpp" ++#include "gc_implementation/g1/g1StringDedupTable.hpp" ++#include "gc_implementation/g1/g1StringDedupThread.hpp" ++ ++bool G1StringDedup::_enabled = false; ++ ++void G1StringDedup::initialize() { ++ assert(UseG1GC, "String deduplication only available with G1"); ++ if (UseStringDeduplication) { ++ _enabled = true; ++ G1StringDedupQueue::create(); ++ G1StringDedupTable::create(); ++ G1StringDedupThread::create(); ++ } ++} ++ ++void G1StringDedup::stop() { ++ assert(is_enabled(), "String deduplication not enabled"); ++ G1StringDedupThread::stop(); ++} ++ ++bool G1StringDedup::is_candidate_from_mark(oop obj) { ++ if (java_lang_String::is_instance(obj)) { ++ bool from_young = G1CollectedHeap::heap()->heap_region_containing_raw(obj)->is_young(); ++ if (from_young && obj->age() < StringDeduplicationAgeThreshold) { ++ // Candidate found. String is being evacuated from young to old but has not ++ // reached the deduplication age threshold, i.e. has not previously been a ++ // candidate during its life in the young generation. ++ return true; ++ } ++ } ++ ++ // Not a candidate ++ return false; ++} ++ ++void G1StringDedup::enqueue_from_mark(oop java_string) { ++ assert(is_enabled(), "String deduplication not enabled"); ++ if (is_candidate_from_mark(java_string)) { ++ G1StringDedupQueue::push(0 /* worker_id */, java_string); ++ } ++} ++ ++bool G1StringDedup::is_candidate_from_evacuation(bool from_young, bool to_young, oop obj) { ++ if (from_young && java_lang_String::is_instance(obj)) { ++ if (to_young && obj->age() == StringDeduplicationAgeThreshold) { ++ // Candidate found. String is being evacuated from young to young and just ++ // reached the deduplication age threshold. ++ return true; ++ } ++ if (!to_young && obj->age() < StringDeduplicationAgeThreshold) { ++ // Candidate found. String is being evacuated from young to old but has not ++ // reached the deduplication age threshold, i.e. has not previously been a ++ // candidate during its life in the young generation. ++ return true; ++ } ++ } ++ ++ // Not a candidate ++ return false; ++} ++ ++void G1StringDedup::enqueue_from_evacuation(bool from_young, bool to_young, uint worker_id, oop java_string) { ++ assert(is_enabled(), "String deduplication not enabled"); ++ if (is_candidate_from_evacuation(from_young, to_young, java_string)) { ++ G1StringDedupQueue::push(worker_id, java_string); ++ } ++} ++ ++void G1StringDedup::deduplicate(oop java_string) { ++ assert(is_enabled(), "String deduplication not enabled"); ++ G1StringDedupStat dummy; // Statistics from this path is never used ++ G1StringDedupTable::deduplicate(java_string, dummy); ++} ++ ++void G1StringDedup::oops_do(OopClosure* keep_alive) { ++ assert(is_enabled(), "String deduplication not enabled"); ++ unlink_or_oops_do(NULL, keep_alive); ++} ++ ++void G1StringDedup::unlink(BoolObjectClosure* is_alive) { ++ assert(is_enabled(), "String deduplication not enabled"); ++ // Don't allow a potential resize or rehash during unlink, as the unlink ++ // operation itself might remove enough entries to invalidate such a decision. ++ unlink_or_oops_do(is_alive, NULL, false /* allow_resize_and_rehash */); ++} ++ ++// ++// Task for parallel unlink_or_oops_do() operation on the deduplication queue ++// and table. ++// ++class G1StringDedupUnlinkOrOopsDoTask : public AbstractGangTask { ++private: ++ G1StringDedupUnlinkOrOopsDoClosure _cl; ++ ++public: ++ G1StringDedupUnlinkOrOopsDoTask(BoolObjectClosure* is_alive, ++ OopClosure* keep_alive, ++ bool allow_resize_and_rehash) : ++ AbstractGangTask("G1StringDedupUnlinkOrOopsDoTask"), ++ _cl(is_alive, keep_alive, allow_resize_and_rehash) { ++ } ++ ++ virtual void work(uint worker_id) { ++ double queue_fixup_start = os::elapsedTime(); ++ G1StringDedupQueue::unlink_or_oops_do(&_cl); ++ ++ double table_fixup_start = os::elapsedTime(); ++ G1StringDedupTable::unlink_or_oops_do(&_cl, worker_id); ++ ++ double queue_fixup_time_ms = (table_fixup_start - queue_fixup_start) * 1000.0; ++ double table_fixup_time_ms = (os::elapsedTime() - table_fixup_start) * 1000.0; ++ G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy(); ++ g1p->phase_times()->record_string_dedup_queue_fixup_worker_time(worker_id, queue_fixup_time_ms); ++ g1p->phase_times()->record_string_dedup_table_fixup_worker_time(worker_id, table_fixup_time_ms); ++ } ++}; ++ ++void G1StringDedup::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, bool allow_resize_and_rehash) { ++ assert(is_enabled(), "String deduplication not enabled"); ++ G1CollectorPolicy* g1p = G1CollectedHeap::heap()->g1_policy(); ++ g1p->phase_times()->note_string_dedup_fixup_start(); ++ double fixup_start = os::elapsedTime(); ++ ++ G1StringDedupUnlinkOrOopsDoTask task(is_alive, keep_alive, allow_resize_and_rehash); ++ if (G1CollectedHeap::use_parallel_gc_threads()) { ++ G1CollectedHeap* g1h = G1CollectedHeap::heap(); ++ g1h->set_par_threads(); ++ g1h->workers()->run_task(&task); ++ g1h->set_par_threads(0); ++ } else { ++ task.work(0); ++ } ++ ++ double fixup_time_ms = (os::elapsedTime() - fixup_start) * 1000.0; ++ g1p->phase_times()->record_string_dedup_fixup_time(fixup_time_ms); ++ g1p->phase_times()->note_string_dedup_fixup_end(); ++} ++ ++void G1StringDedup::threads_do(ThreadClosure* tc) { ++ assert(is_enabled(), "String deduplication not enabled"); ++ tc->do_thread(G1StringDedupThread::thread()); ++} ++ ++void G1StringDedup::print_worker_threads_on(outputStream* st) { ++ assert(is_enabled(), "String deduplication not enabled"); ++ G1StringDedupThread::thread()->print_on(st); ++ st->cr(); ++} ++ ++void G1StringDedup::verify() { ++ assert(is_enabled(), "String deduplication not enabled"); ++ G1StringDedupQueue::verify(); ++ G1StringDedupTable::verify(); ++} ++ ++G1StringDedupUnlinkOrOopsDoClosure::G1StringDedupUnlinkOrOopsDoClosure(BoolObjectClosure* is_alive, ++ OopClosure* keep_alive, ++ bool allow_resize_and_rehash) : ++ _is_alive(is_alive), ++ _keep_alive(keep_alive), ++ _resized_table(NULL), ++ _rehashed_table(NULL), ++ _next_queue(0), ++ _next_bucket(0) { ++ if (allow_resize_and_rehash) { ++ // If both resize and rehash is needed, only do resize. Rehash of ++ // the table will eventually happen if the situation persists. ++ _resized_table = G1StringDedupTable::prepare_resize(); ++ if (!is_resizing()) { ++ _rehashed_table = G1StringDedupTable::prepare_rehash(); ++ } ++ } ++} ++ ++G1StringDedupUnlinkOrOopsDoClosure::~G1StringDedupUnlinkOrOopsDoClosure() { ++ assert(!is_resizing() || !is_rehashing(), "Can not both resize and rehash"); ++ if (is_resizing()) { ++ G1StringDedupTable::finish_resize(_resized_table); ++ } else if (is_rehashing()) { ++ G1StringDedupTable::finish_rehash(_rehashed_table); ++ } ++} +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedup.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,206 @@ ++/* ++ * 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_GC_IMPLEMENTATION_G1_G1STRINGDEDUP_HPP ++#define SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUP_HPP ++ ++// ++// String Deduplication ++// ++// String deduplication aims to reduce the heap live-set by deduplicating identical ++// instances of String so that they share the same backing character array. ++// ++// The deduplication process is divided in two main parts, 1) finding the objects to ++// deduplicate, and 2) deduplicating those objects. The first part is done as part of ++// a normal GC cycle when objects are marked or evacuated. At this time a check is ++// applied on each object to check if it is a candidate for deduplication. If so, the ++// object is placed on the deduplication queue for later processing. The second part, ++// processing the objects on the deduplication queue, is a concurrent phase which ++// starts right after the stop-the-wold marking/evacuation phase. This phase is ++// executed by the deduplication thread, which pulls deduplication candidates of the ++// deduplication queue and tries to deduplicate them. ++// ++// A deduplication hashtable is used to keep track of all unique character arrays ++// used by String objects. When deduplicating, a lookup is made in this table to see ++// if there is already an identical character array somewhere on the heap. If so, the ++// String object is adjusted to point to that character array, releasing the reference ++// to the original array allowing it to eventually be garbage collected. If the lookup ++// fails the character array is instead inserted into the hashtable so that this array ++// can be shared at some point in the future. ++// ++// Candidate selection ++// ++// An object is considered a deduplication candidate if all of the following ++// statements are true: ++// ++// - The object is an instance of java.lang.String ++// ++// - The object is being evacuated from a young heap region ++// ++// - The object is being evacuated to a young/survivor heap region and the ++// object's age is equal to the deduplication age threshold ++// ++// or ++// ++// The object is being evacuated to an old heap region and the object's age is ++// less than the deduplication age threshold ++// ++// Once an string object has been promoted to an old region, or its age is higher ++// than the deduplication age threshold, is will never become a candidate again. ++// This approach avoids making the same object a candidate more than once. ++// ++// Interned strings are a bit special. They are explicitly deduplicated just before ++// being inserted into the StringTable (to avoid counteracting C2 optimizations done ++// on string literals), then they also become deduplication candidates if they reach ++// the deduplication age threshold or are evacuated to an old heap region. The second ++// attempt to deduplicate such strings will be in vain, but we have no fast way of ++// filtering them out. This has not shown to be a problem, as the number of interned ++// strings is usually dwarfed by the number of normal (non-interned) strings. ++// ++// For additional information on string deduplication, please see JEP 192, ++// http://openjdk.java.net/jeps/192 ++// ++ ++#include "memory/allocation.hpp" ++#include "oops/oop.hpp" ++ ++class OopClosure; ++class BoolObjectClosure; ++class ThreadClosure; ++class outputStream; ++class G1StringDedupTable; ++ ++// ++// Main interface for interacting with string deduplication. ++// ++class G1StringDedup : public AllStatic { ++private: ++ // Single state for checking if both G1 and string deduplication is enabled. ++ static bool _enabled; ++ ++ // Candidate selection policies, returns true if the given object is ++ // candidate for string deduplication. ++ static bool is_candidate_from_mark(oop obj); ++ static bool is_candidate_from_evacuation(bool from_young, bool to_young, oop obj); ++ ++public: ++ // Returns true if both G1 and string deduplication is enabled. ++ static bool is_enabled() { ++ return _enabled; ++ } ++ ++ // Initialize string deduplication. ++ static void initialize(); ++ ++ // Stop the deduplication thread. ++ static void stop(); ++ ++ // Immediately deduplicates the given String object, bypassing the ++ // the deduplication queue. ++ static void deduplicate(oop java_string); ++ ++ // Enqueues a deduplication candidate for later processing by the deduplication ++ // thread. Before enqueuing, these functions apply the appropriate candidate ++ // selection policy to filters out non-candidates. ++ static void enqueue_from_mark(oop java_string); ++ static void enqueue_from_evacuation(bool from_young, bool to_young, ++ unsigned int queue, oop java_string); ++ ++ static void oops_do(OopClosure* keep_alive); ++ static void unlink(BoolObjectClosure* is_alive); ++ static void unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive, ++ bool allow_resize_and_rehash = true); ++ ++ static void threads_do(ThreadClosure* tc); ++ static void print_worker_threads_on(outputStream* st); ++ static void verify(); ++}; ++ ++// ++// This closure encapsulates the state and the closures needed when scanning ++// the deduplication queue and table during the unlink_or_oops_do() operation. ++// A single instance of this closure is created and then shared by all worker ++// threads participating in the scan. The _next_queue and _next_bucket fields ++// provide a simple mechanism for GC workers to claim exclusive access to a ++// queue or a table partition. ++// ++class G1StringDedupUnlinkOrOopsDoClosure : public StackObj { ++private: ++ BoolObjectClosure* _is_alive; ++ OopClosure* _keep_alive; ++ G1StringDedupTable* _resized_table; ++ G1StringDedupTable* _rehashed_table; ++ size_t _next_queue; ++ size_t _next_bucket; ++ ++public: ++ G1StringDedupUnlinkOrOopsDoClosure(BoolObjectClosure* is_alive, ++ OopClosure* keep_alive, ++ bool allow_resize_and_rehash); ++ ~G1StringDedupUnlinkOrOopsDoClosure(); ++ ++ bool is_resizing() { ++ return _resized_table != NULL; ++ } ++ ++ G1StringDedupTable* resized_table() { ++ return _resized_table; ++ } ++ ++ bool is_rehashing() { ++ return _rehashed_table != NULL; ++ } ++ ++ // Atomically claims the next available queue for exclusive access by ++ // the current thread. Returns the queue number of the claimed queue. ++ size_t claim_queue() { ++ return (size_t)Atomic::add_ptr(1, &_next_queue) - 1; ++ } ++ ++ // Atomically claims the next available table partition for exclusive ++ // access by the current thread. Returns the table bucket number where ++ // the claimed partition starts. ++ size_t claim_table_partition(size_t partition_size) { ++ return (size_t)Atomic::add_ptr(partition_size, &_next_bucket) - partition_size; ++ } ++ ++ // Applies and returns the result from the is_alive closure, or ++ // returns true if no such closure was provided. ++ bool is_alive(oop o) { ++ if (_is_alive != NULL) { ++ return _is_alive->do_object_b(o); ++ } ++ return true; ++ } ++ ++ // Applies the keep_alive closure, or does nothing if no such ++ // closure was provided. ++ void keep_alive(oop* p) { ++ if (_keep_alive != NULL) { ++ _keep_alive->do_oop(p); ++ } ++ } ++}; ++ ++#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUP_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,169 @@ ++/* ++ * 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 "classfile/javaClasses.hpp" ++#include "gc_implementation/g1/g1StringDedupQueue.hpp" ++#include "memory/gcLocker.hpp" ++#include "runtime/mutexLocker.hpp" ++#include "utilities/stack.inline.hpp" ++ ++G1StringDedupQueue* G1StringDedupQueue::_queue = NULL; ++const size_t G1StringDedupQueue::_max_size = 1000000; // Max number of elements per queue ++const size_t G1StringDedupQueue::_max_cache_size = 0; // Max cache size per queue ++ ++G1StringDedupQueue::G1StringDedupQueue() : ++ _cursor(0), ++ _cancel(false), ++ _empty(true), ++ _dropped(0) { ++ _nqueues = MAX2(ParallelGCThreads, (size_t)1); ++ _queues = NEW_C_HEAP_ARRAY(G1StringDedupWorkerQueue, _nqueues, mtGC); ++ for (size_t i = 0; i < _nqueues; i++) { ++ new (_queues + i) G1StringDedupWorkerQueue(G1StringDedupWorkerQueue::default_segment_size(), _max_cache_size, _max_size); ++ } ++} ++ ++G1StringDedupQueue::~G1StringDedupQueue() { ++ ShouldNotReachHere(); ++} ++ ++void G1StringDedupQueue::create() { ++ assert(_queue == NULL, "One string deduplication queue allowed"); ++ _queue = new G1StringDedupQueue(); ++} ++ ++void G1StringDedupQueue::wait() { ++ MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag); ++ while (_queue->_empty && !_queue->_cancel) { ++ ml.wait(Mutex::_no_safepoint_check_flag); ++ } ++} ++ ++void G1StringDedupQueue::cancel_wait() { ++ MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag); ++ _queue->_cancel = true; ++ ml.notify(); ++} ++ ++void G1StringDedupQueue::push(uint worker_id, oop java_string) { ++ assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint"); ++ assert(worker_id < _queue->_nqueues, "Invalid queue"); ++ ++ // Push and notify waiter ++ G1StringDedupWorkerQueue& worker_queue = _queue->_queues[worker_id]; ++ if (!worker_queue.is_full()) { ++ worker_queue.push(java_string); ++ if (_queue->_empty) { ++ MonitorLockerEx ml(StringDedupQueue_lock, Mutex::_no_safepoint_check_flag); ++ if (_queue->_empty) { ++ // Mark non-empty and notify waiter ++ _queue->_empty = false; ++ ml.notify(); ++ } ++ } ++ } else { ++ // Queue is full, drop the string and update the statistics ++ Atomic::inc_ptr(&_queue->_dropped); ++ } ++} ++ ++oop G1StringDedupQueue::pop() { ++ assert(!SafepointSynchronize::is_at_safepoint(), "Must not be at safepoint"); ++ No_Safepoint_Verifier nsv; ++ ++ // Try all queues before giving up ++ for (size_t tries = 0; tries < _queue->_nqueues; tries++) { ++ // The cursor indicates where we left of last time ++ G1StringDedupWorkerQueue* queue = &_queue->_queues[_queue->_cursor]; ++ while (!queue->is_empty()) { ++ oop obj = queue->pop(); ++ // The oop we pop can be NULL if it was marked ++ // dead. Just ignore those and pop the next oop. ++ if (obj != NULL) { ++ return obj; ++ } ++ } ++ ++ // Try next queue ++ _queue->_cursor = (_queue->_cursor + 1) % _queue->_nqueues; ++ } ++ ++ // Mark empty ++ _queue->_empty = true; ++ ++ return NULL; ++} ++ ++void G1StringDedupQueue::unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl) { ++ // A worker thread first claims a queue, which ensures exclusive ++ // access to that queue, then continues to process it. ++ for (;;) { ++ // Grab next queue to scan ++ size_t queue = cl->claim_queue(); ++ if (queue >= _queue->_nqueues) { ++ // End of queues ++ break; ++ } ++ ++ // Scan the queue ++ unlink_or_oops_do(cl, queue); ++ } ++} ++ ++void G1StringDedupQueue::unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl, size_t queue) { ++ assert(queue < _queue->_nqueues, "Invalid queue"); ++ StackIterator iter(_queue->_queues[queue]); ++ while (!iter.is_empty()) { ++ oop* p = iter.next_addr(); ++ if (*p != NULL) { ++ if (cl->is_alive(*p)) { ++ cl->keep_alive(p); ++ } else { ++ // Clear dead reference ++ *p = NULL; ++ } ++ } ++ } ++} ++ ++void G1StringDedupQueue::print_statistics(outputStream* st) { ++ st->print_cr( ++ " [Queue]\n" ++ " [Dropped: "UINTX_FORMAT"]", _queue->_dropped); ++} ++ ++void G1StringDedupQueue::verify() { ++ for (size_t i = 0; i < _queue->_nqueues; i++) { ++ StackIterator iter(_queue->_queues[i]); ++ while (!iter.is_empty()) { ++ oop obj = iter.next(); ++ if (obj != NULL) { ++ guarantee(Universe::heap()->is_in_reserved(obj), "Object must be on the heap"); ++ guarantee(!obj->is_forwarded(), "Object must not be forwarded"); ++ guarantee(java_lang_String::is_instance(obj), "Object must be a String"); ++ } ++ } ++ } ++} +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupQueue.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,101 @@ ++/* ++ * 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_GC_IMPLEMENTATION_G1_G1STRINGDEDUPQUEUE_HPP ++#define SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPQUEUE_HPP ++ ++#include "memory/allocation.hpp" ++#include "oops/oop.hpp" ++#include "utilities/stack.hpp" ++ ++class G1StringDedupUnlinkOrOopsDoClosure; ++ ++// ++// The deduplication queue acts as the communication channel between the stop-the-world ++// mark/evacuation phase and the concurrent deduplication phase. Deduplication candidates ++// found during mark/evacuation are placed on this queue for later processing in the ++// deduplication thread. A queue entry is an oop pointing to a String object (as opposed ++// to entries in the deduplication hashtable which points to character arrays). ++// ++// While users of the queue treat it as a single queue, it is implemented as a set of ++// queues, one queue per GC worker thread, to allow lock-free and cache-friendly enqueue ++// operations by the GC workers. ++// ++// The oops in the queue are treated as weak pointers, meaning the objects they point to ++// can become unreachable and pruned (cleared) before being popped by the deduplication ++// thread. ++// ++// Pushing to the queue is thread safe (this relies on each thread using a unique worker ++// id), but only allowed during a safepoint. Popping from the queue is NOT thread safe ++// and can only be done by the deduplication thread outside a safepoint. ++// ++// The StringDedupQueue_lock is only used for blocking and waking up the deduplication ++// thread in case the queue is empty or becomes non-empty, respectively. This lock does ++// not otherwise protect the queue content. ++// ++class G1StringDedupQueue : public CHeapObj { ++private: ++ typedef Stack G1StringDedupWorkerQueue; ++ ++ static G1StringDedupQueue* _queue; ++ static const size_t _max_size; ++ static const size_t _max_cache_size; ++ ++ G1StringDedupWorkerQueue* _queues; ++ size_t _nqueues; ++ size_t _cursor; ++ bool _cancel; ++ volatile bool _empty; ++ ++ // Statistics counter, only used for logging. ++ uintx _dropped; ++ ++ G1StringDedupQueue(); ++ ~G1StringDedupQueue(); ++ ++ static void unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl, size_t queue); ++ ++public: ++ static void create(); ++ ++ // Blocks and waits for the queue to become non-empty. ++ static void wait(); ++ ++ // Wakes up any thread blocked waiting for the queue to become non-empty. ++ static void cancel_wait(); ++ ++ // Pushes a deduplication candidate onto a specific GC worker queue. ++ static void push(uint worker_id, oop java_string); ++ ++ // Pops a deduplication candidate from any queue, returns NULL if ++ // all queues are empty. ++ static oop pop(); ++ ++ static void unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl); ++ ++ static void print_statistics(outputStream* st); ++ static void verify(); ++}; ++ ++#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPQUEUE_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupStat.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupStat.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,162 @@ ++/* ++ * 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 "gc_implementation/g1/g1StringDedupStat.hpp" ++ ++G1StringDedupStat::G1StringDedupStat() : ++ _inspected(0), ++ _skipped(0), ++ _hashed(0), ++ _known(0), ++ _new(0), ++ _new_bytes(0), ++ _deduped(0), ++ _deduped_bytes(0), ++ _deduped_young(0), ++ _deduped_young_bytes(0), ++ _deduped_old(0), ++ _deduped_old_bytes(0), ++ _idle(0), ++ _exec(0), ++ _block(0), ++ _start(0.0), ++ _idle_elapsed(0.0), ++ _exec_elapsed(0.0), ++ _block_elapsed(0.0) { ++} ++ ++void G1StringDedupStat::add(const G1StringDedupStat& stat) { ++ _inspected += stat._inspected; ++ _skipped += stat._skipped; ++ _hashed += stat._hashed; ++ _known += stat._known; ++ _new += stat._new; ++ _new_bytes += stat._new_bytes; ++ _deduped += stat._deduped; ++ _deduped_bytes += stat._deduped_bytes; ++ _deduped_young += stat._deduped_young; ++ _deduped_young_bytes += stat._deduped_young_bytes; ++ _deduped_old += stat._deduped_old; ++ _deduped_old_bytes += stat._deduped_old_bytes; ++ _idle += stat._idle; ++ _exec += stat._exec; ++ _block += stat._block; ++ _idle_elapsed += stat._idle_elapsed; ++ _exec_elapsed += stat._exec_elapsed; ++ _block_elapsed += stat._block_elapsed; ++} ++ ++void G1StringDedupStat::print_summary(outputStream* st, const G1StringDedupStat& last_stat, const G1StringDedupStat& total_stat) { ++ double total_deduped_bytes_percent = 0.0; ++ ++ if (total_stat._new_bytes > 0) { ++ // Avoid division by zero ++ total_deduped_bytes_percent = (double)total_stat._deduped_bytes / (double)total_stat._new_bytes * 100.0; ++ } ++ ++ st->date_stamp(PrintGCDateStamps); ++ st->stamp(PrintGCTimeStamps); ++ st->print_cr( ++ "[GC concurrent-string-deduplication, " ++ G1_STRDEDUP_BYTES_FORMAT_NS"->"G1_STRDEDUP_BYTES_FORMAT_NS"("G1_STRDEDUP_BYTES_FORMAT_NS"), avg " ++ G1_STRDEDUP_PERCENT_FORMAT_NS", "G1_STRDEDUP_TIME_FORMAT"]", ++ G1_STRDEDUP_BYTES_PARAM(last_stat._new_bytes), ++ G1_STRDEDUP_BYTES_PARAM(last_stat._new_bytes - last_stat._deduped_bytes), ++ G1_STRDEDUP_BYTES_PARAM(last_stat._deduped_bytes), ++ total_deduped_bytes_percent, ++ last_stat._exec_elapsed); ++} ++ ++void G1StringDedupStat::print_statistics(outputStream* st, const G1StringDedupStat& stat, bool total) { ++ double young_percent = 0.0; ++ double old_percent = 0.0; ++ double skipped_percent = 0.0; ++ double hashed_percent = 0.0; ++ double known_percent = 0.0; ++ double new_percent = 0.0; ++ double deduped_percent = 0.0; ++ double deduped_bytes_percent = 0.0; ++ double deduped_young_percent = 0.0; ++ double deduped_young_bytes_percent = 0.0; ++ double deduped_old_percent = 0.0; ++ double deduped_old_bytes_percent = 0.0; ++ ++ if (stat._inspected > 0) { ++ // Avoid division by zero ++ skipped_percent = (double)stat._skipped / (double)stat._inspected * 100.0; ++ hashed_percent = (double)stat._hashed / (double)stat._inspected * 100.0; ++ known_percent = (double)stat._known / (double)stat._inspected * 100.0; ++ new_percent = (double)stat._new / (double)stat._inspected * 100.0; ++ } ++ ++ if (stat._new > 0) { ++ // Avoid division by zero ++ deduped_percent = (double)stat._deduped / (double)stat._new * 100.0; ++ } ++ ++ if (stat._deduped > 0) { ++ // Avoid division by zero ++ deduped_young_percent = (double)stat._deduped_young / (double)stat._deduped * 100.0; ++ deduped_old_percent = (double)stat._deduped_old / (double)stat._deduped * 100.0; ++ } ++ ++ if (stat._new_bytes > 0) { ++ // Avoid division by zero ++ deduped_bytes_percent = (double)stat._deduped_bytes / (double)stat._new_bytes * 100.0; ++ } ++ ++ if (stat._deduped_bytes > 0) { ++ // Avoid division by zero ++ deduped_young_bytes_percent = (double)stat._deduped_young_bytes / (double)stat._deduped_bytes * 100.0; ++ deduped_old_bytes_percent = (double)stat._deduped_old_bytes / (double)stat._deduped_bytes * 100.0; ++ } ++ ++ if (total) { ++ st->print_cr( ++ " [Total Exec: "UINTX_FORMAT"/"G1_STRDEDUP_TIME_FORMAT", Idle: "UINTX_FORMAT"/"G1_STRDEDUP_TIME_FORMAT", Blocked: "UINTX_FORMAT"/"G1_STRDEDUP_TIME_FORMAT"]", ++ stat._exec, stat._exec_elapsed, stat._idle, stat._idle_elapsed, stat._block, stat._block_elapsed); ++ } else { ++ st->print_cr( ++ " [Last Exec: "G1_STRDEDUP_TIME_FORMAT", Idle: "G1_STRDEDUP_TIME_FORMAT", Blocked: "UINTX_FORMAT"/"G1_STRDEDUP_TIME_FORMAT"]", ++ stat._exec_elapsed, stat._idle_elapsed, stat._block, stat._block_elapsed); ++ } ++ st->print_cr( ++ " [Inspected: "G1_STRDEDUP_OBJECTS_FORMAT"]\n" ++ " [Skipped: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" ++ " [Hashed: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" ++ " [Known: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" ++ " [New: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT") "G1_STRDEDUP_BYTES_FORMAT"]\n" ++ " [Deduplicated: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT") "G1_STRDEDUP_BYTES_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" ++ " [Young: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT") "G1_STRDEDUP_BYTES_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]\n" ++ " [Old: "G1_STRDEDUP_OBJECTS_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT") "G1_STRDEDUP_BYTES_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT")]", ++ stat._inspected, ++ stat._skipped, skipped_percent, ++ stat._hashed, hashed_percent, ++ stat._known, known_percent, ++ stat._new, new_percent, G1_STRDEDUP_BYTES_PARAM(stat._new_bytes), ++ stat._deduped, deduped_percent, G1_STRDEDUP_BYTES_PARAM(stat._deduped_bytes), deduped_bytes_percent, ++ stat._deduped_young, deduped_young_percent, G1_STRDEDUP_BYTES_PARAM(stat._deduped_young_bytes), deduped_young_bytes_percent, ++ stat._deduped_old, deduped_old_percent, G1_STRDEDUP_BYTES_PARAM(stat._deduped_old_bytes), deduped_old_bytes_percent); ++} +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupStat.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupStat.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,142 @@ ++/* ++ * 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_GC_IMPLEMENTATION_G1_G1STRINGDEDUPSTAT_HPP ++#define SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPSTAT_HPP ++ ++#include "memory/allocation.hpp" ++#include "runtime/os.hpp" ++ ++// Macros for GC log output formating ++#define G1_STRDEDUP_OBJECTS_FORMAT UINTX_FORMAT_W(12) ++#define G1_STRDEDUP_TIME_FORMAT "%1.7lf secs" ++#define G1_STRDEDUP_PERCENT_FORMAT "%5.1lf%%" ++#define G1_STRDEDUP_PERCENT_FORMAT_NS "%.1lf%%" ++#define G1_STRDEDUP_BYTES_FORMAT "%8.1lf%s" ++#define G1_STRDEDUP_BYTES_FORMAT_NS "%.1lf%s" ++#define G1_STRDEDUP_BYTES_PARAM(bytes) byte_size_in_proper_unit((double)(bytes)), proper_unit_for_byte_size((bytes)) ++ ++// ++// Statistics gathered by the deduplication thread. ++// ++class G1StringDedupStat : public StackObj { ++private: ++ // Counters ++ uintx _inspected; ++ uintx _skipped; ++ uintx _hashed; ++ uintx _known; ++ uintx _new; ++ uintx _new_bytes; ++ uintx _deduped; ++ uintx _deduped_bytes; ++ uintx _deduped_young; ++ uintx _deduped_young_bytes; ++ uintx _deduped_old; ++ uintx _deduped_old_bytes; ++ uintx _idle; ++ uintx _exec; ++ uintx _block; ++ ++ // Time spent by the deduplication thread in different phases ++ double _start; ++ double _idle_elapsed; ++ double _exec_elapsed; ++ double _block_elapsed; ++ ++public: ++ G1StringDedupStat(); ++ ++ void inc_inspected() { ++ _inspected++; ++ } ++ ++ void inc_skipped() { ++ _skipped++; ++ } ++ ++ void inc_hashed() { ++ _hashed++; ++ } ++ ++ void inc_known() { ++ _known++; ++ } ++ ++ void inc_new(uintx bytes) { ++ _new++; ++ _new_bytes += bytes; ++ } ++ ++ void inc_deduped_young(uintx bytes) { ++ _deduped++; ++ _deduped_bytes += bytes; ++ _deduped_young++; ++ _deduped_young_bytes += bytes; ++ } ++ ++ void inc_deduped_old(uintx bytes) { ++ _deduped++; ++ _deduped_bytes += bytes; ++ _deduped_old++; ++ _deduped_old_bytes += bytes; ++ } ++ ++ void mark_idle() { ++ _start = os::elapsedTime(); ++ _idle++; ++ } ++ ++ void mark_exec() { ++ double now = os::elapsedTime(); ++ _idle_elapsed = now - _start; ++ _start = now; ++ _exec++; ++ } ++ ++ void mark_block() { ++ double now = os::elapsedTime(); ++ _exec_elapsed += now - _start; ++ _start = now; ++ _block++; ++ } ++ ++ void mark_unblock() { ++ double now = os::elapsedTime(); ++ _block_elapsed += now - _start; ++ _start = now; ++ } ++ ++ void mark_done() { ++ double now = os::elapsedTime(); ++ _exec_elapsed += now - _start; ++ } ++ ++ void add(const G1StringDedupStat& stat); ++ ++ static void print_summary(outputStream* st, const G1StringDedupStat& last_stat, const G1StringDedupStat& total_stat); ++ static void print_statistics(outputStream* st, const G1StringDedupStat& stat, bool total); ++}; ++ ++#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPSTAT_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupTable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,569 @@ ++/* ++ * 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 "classfile/altHashing.hpp" ++#include "classfile/javaClasses.hpp" ++#include "gc_implementation/g1/g1CollectedHeap.inline.hpp" ++#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" ++#include "gc_implementation/g1/g1StringDedupTable.hpp" ++#include "memory/gcLocker.hpp" ++#include "memory/padded.inline.hpp" ++#include "oops/typeArrayOop.hpp" ++#include "runtime/mutexLocker.hpp" ++ ++// ++// Freelist in the deduplication table entry cache. Links table ++// entries together using their _next fields. ++// ++class G1StringDedupEntryFreeList : public CHeapObj { ++private: ++ G1StringDedupEntry* _list; ++ size_t _length; ++ ++public: ++ G1StringDedupEntryFreeList() : ++ _list(NULL), ++ _length(0) { ++ } ++ ++ void add(G1StringDedupEntry* entry) { ++ entry->set_next(_list); ++ _list = entry; ++ _length++; ++ } ++ ++ G1StringDedupEntry* remove() { ++ G1StringDedupEntry* entry = _list; ++ if (entry != NULL) { ++ _list = entry->next(); ++ _length--; ++ } ++ return entry; ++ } ++ ++ size_t length() { ++ return _length; ++ } ++}; ++ ++// ++// Cache of deduplication table entries. This cache provides fast allocation and ++// reuse of table entries to lower the pressure on the underlying allocator. ++// But more importantly, it provides fast/deferred freeing of table entries. This ++// is important because freeing of table entries is done during stop-the-world ++// phases and it is not uncommon for large number of entries to be freed at once. ++// Tables entries that are freed during these phases are placed onto a freelist in ++// the cache. The deduplication thread, which executes in a concurrent phase, will ++// later reuse or free the underlying memory for these entries. ++// ++// The cache allows for single-threaded allocations and multi-threaded frees. ++// Allocations are synchronized by StringDedupTable_lock as part of a table ++// modification. ++// ++class G1StringDedupEntryCache : public CHeapObj { ++private: ++ // One freelist per GC worker to allow lock less freeing of ++ // entries while doing a parallel scan of the table. Using ++ // PaddedEnd to avoid false sharing. ++ PaddedEnd* _lists; ++ size_t _nlists; ++ ++public: ++ G1StringDedupEntryCache(); ++ ~G1StringDedupEntryCache(); ++ ++ // Get a table entry from the cache freelist, or allocate a new ++ // entry if the cache is empty. ++ G1StringDedupEntry* alloc(); ++ ++ // Insert a table entry into the cache freelist. ++ void free(G1StringDedupEntry* entry, uint worker_id); ++ ++ // Returns current number of entries in the cache. ++ size_t size(); ++ ++ // If the cache has grown above the given max size, trim it down ++ // and deallocate the memory occupied by trimmed of entries. ++ void trim(size_t max_size); ++}; ++ ++G1StringDedupEntryCache::G1StringDedupEntryCache() { ++ _nlists = MAX2(ParallelGCThreads, (size_t)1); ++ _lists = PaddedArray::create_unfreeable((uint)_nlists); ++} ++ ++G1StringDedupEntryCache::~G1StringDedupEntryCache() { ++ ShouldNotReachHere(); ++} ++ ++G1StringDedupEntry* G1StringDedupEntryCache::alloc() { ++ for (size_t i = 0; i < _nlists; i++) { ++ G1StringDedupEntry* entry = _lists[i].remove(); ++ if (entry != NULL) { ++ return entry; ++ } ++ } ++ return new G1StringDedupEntry(); ++} ++ ++void G1StringDedupEntryCache::free(G1StringDedupEntry* entry, uint worker_id) { ++ assert(entry->obj() != NULL, "Double free"); ++ assert(worker_id < _nlists, "Invalid worker id"); ++ entry->set_obj(NULL); ++ entry->set_hash(0); ++ _lists[worker_id].add(entry); ++} ++ ++size_t G1StringDedupEntryCache::size() { ++ size_t size = 0; ++ for (size_t i = 0; i < _nlists; i++) { ++ size += _lists[i].length(); ++ } ++ return size; ++} ++ ++void G1StringDedupEntryCache::trim(size_t max_size) { ++ size_t cache_size = 0; ++ for (size_t i = 0; i < _nlists; i++) { ++ G1StringDedupEntryFreeList* list = &_lists[i]; ++ cache_size += list->length(); ++ while (cache_size > max_size) { ++ G1StringDedupEntry* entry = list->remove(); ++ assert(entry != NULL, "Should not be null"); ++ cache_size--; ++ delete entry; ++ } ++ } ++} ++ ++G1StringDedupTable* G1StringDedupTable::_table = NULL; ++G1StringDedupEntryCache* G1StringDedupTable::_entry_cache = NULL; ++ ++const size_t G1StringDedupTable::_min_size = (1 << 10); // 1024 ++const size_t G1StringDedupTable::_max_size = (1 << 24); // 16777216 ++const double G1StringDedupTable::_grow_load_factor = 2.0; // Grow table at 200% load ++const double G1StringDedupTable::_shrink_load_factor = _grow_load_factor / 3.0; // Shrink table at 67% load ++const double G1StringDedupTable::_max_cache_factor = 0.1; // Cache a maximum of 10% of the table size ++const uintx G1StringDedupTable::_rehash_multiple = 60; // Hash bucket has 60 times more collisions than expected ++const uintx G1StringDedupTable::_rehash_threshold = (uintx)(_rehash_multiple * _grow_load_factor); ++ ++uintx G1StringDedupTable::_entries_added = 0; ++uintx G1StringDedupTable::_entries_removed = 0; ++uintx G1StringDedupTable::_resize_count = 0; ++uintx G1StringDedupTable::_rehash_count = 0; ++ ++G1StringDedupTable::G1StringDedupTable(size_t size, jint hash_seed) : ++ _size(size), ++ _entries(0), ++ _grow_threshold((uintx)(size * _grow_load_factor)), ++ _shrink_threshold((uintx)(size * _shrink_load_factor)), ++ _rehash_needed(false), ++ _hash_seed(hash_seed) { ++ assert(is_power_of_2(size), "Table size must be a power of 2"); ++ _buckets = NEW_C_HEAP_ARRAY(G1StringDedupEntry*, _size, mtGC); ++ memset(_buckets, 0, _size * sizeof(G1StringDedupEntry*)); ++} ++ ++G1StringDedupTable::~G1StringDedupTable() { ++ FREE_C_HEAP_ARRAY(G1StringDedupEntry*, _buckets, mtGC); ++} ++ ++void G1StringDedupTable::create() { ++ assert(_table == NULL, "One string deduplication table allowed"); ++ _entry_cache = new G1StringDedupEntryCache(); ++ _table = new G1StringDedupTable(_min_size); ++} ++ ++void G1StringDedupTable::add(typeArrayOop value, unsigned int hash, G1StringDedupEntry** list) { ++ G1StringDedupEntry* entry = _entry_cache->alloc(); ++ entry->set_obj(value); ++ entry->set_hash(hash); ++ entry->set_next(*list); ++ *list = entry; ++ _entries++; ++} ++ ++void G1StringDedupTable::remove(G1StringDedupEntry** pentry, uint worker_id) { ++ G1StringDedupEntry* entry = *pentry; ++ *pentry = entry->next(); ++ _entry_cache->free(entry, worker_id); ++} ++ ++void G1StringDedupTable::transfer(G1StringDedupEntry** pentry, G1StringDedupTable* dest) { ++ G1StringDedupEntry* entry = *pentry; ++ *pentry = entry->next(); ++ unsigned int hash = entry->hash(); ++ size_t index = dest->hash_to_index(hash); ++ G1StringDedupEntry** list = dest->bucket(index); ++ entry->set_next(*list); ++ *list = entry; ++} ++ ++bool G1StringDedupTable::equals(typeArrayOop value1, typeArrayOop value2) { ++ return (value1 == value2 || ++ (value1->length() == value2->length() && ++ (!memcmp(value1->base(T_CHAR), ++ value2->base(T_CHAR), ++ value1->length() * sizeof(jchar))))); ++} ++ ++typeArrayOop G1StringDedupTable::lookup(typeArrayOop value, unsigned int hash, ++ G1StringDedupEntry** list, uintx &count) { ++ for (G1StringDedupEntry* entry = *list; entry != NULL; entry = entry->next()) { ++ if (entry->hash() == hash) { ++ typeArrayOop existing_value = entry->obj(); ++ if (equals(value, existing_value)) { ++ // Match found ++ return existing_value; ++ } ++ } ++ count++; ++ } ++ ++ // Not found ++ return NULL; ++} ++ ++typeArrayOop G1StringDedupTable::lookup_or_add_inner(typeArrayOop value, unsigned int hash) { ++ size_t index = hash_to_index(hash); ++ G1StringDedupEntry** list = bucket(index); ++ uintx count = 0; ++ ++ // Lookup in list ++ typeArrayOop existing_value = lookup(value, hash, list, count); ++ ++ // Check if rehash is needed ++ if (count > _rehash_threshold) { ++ _rehash_needed = true; ++ } ++ ++ if (existing_value == NULL) { ++ // Not found, add new entry ++ add(value, hash, list); ++ ++ // Update statistics ++ _entries_added++; ++ } ++ ++ return existing_value; ++} ++ ++unsigned int G1StringDedupTable::hash_code(typeArrayOop value) { ++ unsigned int hash; ++ int length = value->length(); ++ const jchar* data = (jchar*)value->base(T_CHAR); ++ ++ if (use_java_hash()) { ++ hash = java_lang_String::hash_code(data, length); ++ } else { ++ hash = AltHashing::murmur3_32(_table->_hash_seed, data, length); ++ } ++ ++ return hash; ++} ++ ++void G1StringDedupTable::deduplicate(oop java_string, G1StringDedupStat& stat) { ++ assert(java_lang_String::is_instance(java_string), "Must be a string"); ++ No_Safepoint_Verifier nsv; ++ ++ stat.inc_inspected(); ++ ++ typeArrayOop value = java_lang_String::value(java_string); ++ if (value == NULL) { ++ // String has no value ++ stat.inc_skipped(); ++ return; ++ } ++ ++ unsigned int hash = 0; ++ ++ if (use_java_hash()) { ++ // Get hash code from cache ++ hash = java_lang_String::hash(java_string); ++ } ++ ++ if (hash == 0) { ++ // Compute hash ++ hash = hash_code(value); ++ stat.inc_hashed(); ++ } ++ ++ if (use_java_hash() && hash != 0) { ++ // Store hash code in cache ++ java_lang_String::set_hash(java_string, hash); ++ } ++ ++ typeArrayOop existing_value = lookup_or_add(value, hash); ++ if (existing_value == value) { ++ // Same value, already known ++ stat.inc_known(); ++ return; ++ } ++ ++ // Get size of value array ++ uintx size_in_bytes = value->size() * HeapWordSize; ++ stat.inc_new(size_in_bytes); ++ ++ if (existing_value != NULL) { ++ // Enqueue the reference to make sure it is kept alive. Concurrent mark might ++ // otherwise declare it dead if there are no other strong references to this object. ++ G1SATBCardTableModRefBS::enqueue(existing_value); ++ ++ // Existing value found, deduplicate string ++ java_lang_String::set_value(java_string, existing_value); ++ ++ if (G1CollectedHeap::heap()->is_in_young(value)) { ++ stat.inc_deduped_young(size_in_bytes); ++ } else { ++ stat.inc_deduped_old(size_in_bytes); ++ } ++ } ++} ++ ++G1StringDedupTable* G1StringDedupTable::prepare_resize() { ++ size_t size = _table->_size; ++ ++ // Check if the hashtable needs to be resized ++ if (_table->_entries > _table->_grow_threshold) { ++ // Grow table, double the size ++ size *= 2; ++ if (size > _max_size) { ++ // Too big, don't resize ++ return NULL; ++ } ++ } else if (_table->_entries < _table->_shrink_threshold) { ++ // Shrink table, half the size ++ size /= 2; ++ if (size < _min_size) { ++ // Too small, don't resize ++ return NULL; ++ } ++ } else if (StringDeduplicationResizeALot) { ++ // Force grow ++ size *= 2; ++ if (size > _max_size) { ++ // Too big, force shrink instead ++ size /= 4; ++ } ++ } else { ++ // Resize not needed ++ return NULL; ++ } ++ ++ // Update statistics ++ _resize_count++; ++ ++ // Allocate the new table. The new table will be populated by workers ++ // calling unlink_or_oops_do() and finally installed by finish_resize(). ++ return new G1StringDedupTable(size, _table->_hash_seed); ++} ++ ++void G1StringDedupTable::finish_resize(G1StringDedupTable* resized_table) { ++ assert(resized_table != NULL, "Invalid table"); ++ ++ resized_table->_entries = _table->_entries; ++ ++ // Free old table ++ delete _table; ++ ++ // Install new table ++ _table = resized_table; ++} ++ ++void G1StringDedupTable::unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl, uint worker_id) { ++ // The table is divided into partitions to allow lock-less parallel processing by ++ // multiple worker threads. A worker thread first claims a partition, which ensures ++ // exclusive access to that part of the table, then continues to process it. To allow ++ // shrinking of the table in parallel we also need to make sure that the same worker ++ // thread processes all partitions where entries will hash to the same destination ++ // partition. Since the table size is always a power of two and we always shrink by ++ // dividing the table in half, we know that for a given partition there is only one ++ // other partition whoes entries will hash to the same destination partition. That ++ // other partition is always the sibling partition in the second half of the table. ++ // For example, if the table is divided into 8 partitions, the sibling of partition 0 ++ // is partition 4, the sibling of partition 1 is partition 5, etc. ++ size_t table_half = _table->_size / 2; ++ ++ // Let each partition be one page worth of buckets ++ size_t partition_size = MIN2(table_half, os::vm_page_size() / sizeof(G1StringDedupEntry*)); ++ assert(table_half % partition_size == 0, "Invalid partition size"); ++ ++ // Number of entries removed during the scan ++ uintx removed = 0; ++ ++ for (;;) { ++ // Grab next partition to scan ++ size_t partition_begin = cl->claim_table_partition(partition_size); ++ size_t partition_end = partition_begin + partition_size; ++ if (partition_begin >= table_half) { ++ // End of table ++ break; ++ } ++ ++ // Scan the partition followed by the sibling partition in the second half of the table ++ removed += unlink_or_oops_do(cl, partition_begin, partition_end, worker_id); ++ removed += unlink_or_oops_do(cl, table_half + partition_begin, table_half + partition_end, worker_id); ++ } ++ ++ // Delayed update avoid contention on the table lock ++ if (removed > 0) { ++ MutexLockerEx ml(StringDedupTable_lock, Mutex::_no_safepoint_check_flag); ++ _table->_entries -= removed; ++ _entries_removed += removed; ++ } ++} ++ ++uintx G1StringDedupTable::unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl, ++ size_t partition_begin, ++ size_t partition_end, ++ uint worker_id) { ++ uintx removed = 0; ++ for (size_t bucket = partition_begin; bucket < partition_end; bucket++) { ++ G1StringDedupEntry** entry = _table->bucket(bucket); ++ while (*entry != NULL) { ++ oop* p = (oop*)(*entry)->obj_addr(); ++ if (cl->is_alive(*p)) { ++ cl->keep_alive(p); ++ if (cl->is_resizing()) { ++ // We are resizing the table, transfer entry to the new table ++ _table->transfer(entry, cl->resized_table()); ++ } else { ++ if (cl->is_rehashing()) { ++ // We are rehashing the table, rehash the entry but keep it ++ // in the table. We can't transfer entries into the new table ++ // at this point since we don't have exclusive access to all ++ // destination partitions. finish_rehash() will do a single ++ // threaded transfer of all entries. ++ typeArrayOop value = (typeArrayOop)*p; ++ unsigned int hash = hash_code(value); ++ (*entry)->set_hash(hash); ++ } ++ ++ // Move to next entry ++ entry = (*entry)->next_addr(); ++ } ++ } else { ++ // Not alive, remove entry from table ++ _table->remove(entry, worker_id); ++ removed++; ++ } ++ } ++ } ++ ++ return removed; ++} ++ ++G1StringDedupTable* G1StringDedupTable::prepare_rehash() { ++ if (!_table->_rehash_needed && !StringDeduplicationRehashALot) { ++ // Rehash not needed ++ return NULL; ++ } ++ ++ // Update statistics ++ _rehash_count++; ++ ++ // Compute new hash seed ++ _table->_hash_seed = AltHashing::compute_seed(); ++ ++ // Allocate the new table, same size and hash seed ++ return new G1StringDedupTable(_table->_size, _table->_hash_seed); ++} ++ ++void G1StringDedupTable::finish_rehash(G1StringDedupTable* rehashed_table) { ++ assert(rehashed_table != NULL, "Invalid table"); ++ ++ // Move all newly rehashed entries into the correct buckets in the new table ++ for (size_t bucket = 0; bucket < _table->_size; bucket++) { ++ G1StringDedupEntry** entry = _table->bucket(bucket); ++ while (*entry != NULL) { ++ _table->transfer(entry, rehashed_table); ++ } ++ } ++ ++ rehashed_table->_entries = _table->_entries; ++ ++ // Free old table ++ delete _table; ++ ++ // Install new table ++ _table = rehashed_table; ++} ++ ++void G1StringDedupTable::verify() { ++ for (size_t bucket = 0; bucket < _table->_size; bucket++) { ++ // Verify entries ++ G1StringDedupEntry** entry = _table->bucket(bucket); ++ while (*entry != NULL) { ++ typeArrayOop value = (*entry)->obj(); ++ guarantee(value != NULL, "Object must not be NULL"); ++ guarantee(Universe::heap()->is_in_reserved(value), "Object must be on the heap"); ++ guarantee(!value->is_forwarded(), "Object must not be forwarded"); ++ guarantee(value->is_typeArray(), "Object must be a typeArrayOop"); ++ unsigned int hash = hash_code(value); ++ guarantee((*entry)->hash() == hash, "Table entry has inorrect hash"); ++ guarantee(_table->hash_to_index(hash) == bucket, "Table entry has incorrect index"); ++ entry = (*entry)->next_addr(); ++ } ++ ++ // Verify that we do not have entries with identical oops or identical arrays. ++ // We only need to compare entries in the same bucket. If the same oop or an ++ // identical array has been inserted more than once into different/incorrect ++ // buckets the verification step above will catch that. ++ G1StringDedupEntry** entry1 = _table->bucket(bucket); ++ while (*entry1 != NULL) { ++ typeArrayOop value1 = (*entry1)->obj(); ++ G1StringDedupEntry** entry2 = (*entry1)->next_addr(); ++ while (*entry2 != NULL) { ++ typeArrayOop value2 = (*entry2)->obj(); ++ guarantee(!equals(value1, value2), "Table entries must not have identical arrays"); ++ entry2 = (*entry2)->next_addr(); ++ } ++ entry1 = (*entry1)->next_addr(); ++ } ++ } ++} ++ ++void G1StringDedupTable::trim_entry_cache() { ++ MutexLockerEx ml(StringDedupTable_lock, Mutex::_no_safepoint_check_flag); ++ size_t max_cache_size = (size_t)(_table->_size * _max_cache_factor); ++ _entry_cache->trim(max_cache_size); ++} ++ ++void G1StringDedupTable::print_statistics(outputStream* st) { ++ st->print_cr( ++ " [Table]\n" ++ " [Memory Usage: "G1_STRDEDUP_BYTES_FORMAT_NS"]\n" ++ " [Size: "SIZE_FORMAT", Min: "SIZE_FORMAT", Max: "SIZE_FORMAT"]\n" ++ " [Entries: "UINTX_FORMAT", Load: "G1_STRDEDUP_PERCENT_FORMAT_NS", Cached: " UINTX_FORMAT ", Added: "UINTX_FORMAT", Removed: "UINTX_FORMAT"]\n" ++ " [Resize Count: "UINTX_FORMAT", Shrink Threshold: "UINTX_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT_NS"), Grow Threshold: "UINTX_FORMAT"("G1_STRDEDUP_PERCENT_FORMAT_NS")]\n" ++ " [Rehash Count: "UINTX_FORMAT", Rehash Threshold: "UINTX_FORMAT", Hash Seed: 0x%x]\n" ++ " [Age Threshold: "UINTX_FORMAT"]", ++ G1_STRDEDUP_BYTES_PARAM(_table->_size * sizeof(G1StringDedupEntry*) + (_table->_entries + _entry_cache->size()) * sizeof(G1StringDedupEntry)), ++ _table->_size, _min_size, _max_size, ++ _table->_entries, (double)_table->_entries / (double)_table->_size * 100.0, _entry_cache->size(), _entries_added, _entries_removed, ++ _resize_count, _table->_shrink_threshold, _shrink_load_factor * 100.0, _table->_grow_threshold, _grow_load_factor * 100.0, ++ _rehash_count, _rehash_threshold, _table->_hash_seed, ++ StringDeduplicationAgeThreshold); ++} +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupTable.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupTable.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,230 @@ ++/* ++ * 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_GC_IMPLEMENTATION_G1_G1STRINGDEDUPTABLE_HPP ++#define SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPTABLE_HPP ++ ++#include "gc_implementation/g1/g1StringDedupStat.hpp" ++#include "runtime/mutexLocker.hpp" ++ ++class G1StringDedupEntryCache; ++ ++// ++// Table entry in the deduplication hashtable. Points weakly to the ++// character array. Can be chained in a linked list in case of hash ++// collisions or when placed in a freelist in the entry cache. ++// ++class G1StringDedupEntry : public CHeapObj { ++private: ++ G1StringDedupEntry* _next; ++ unsigned int _hash; ++ typeArrayOop _obj; ++ ++public: ++ G1StringDedupEntry() : ++ _next(NULL), ++ _hash(0), ++ _obj(NULL) { ++ } ++ ++ G1StringDedupEntry* next() { ++ return _next; ++ } ++ ++ G1StringDedupEntry** next_addr() { ++ return &_next; ++ } ++ ++ void set_next(G1StringDedupEntry* next) { ++ _next = next; ++ } ++ ++ unsigned int hash() { ++ return _hash; ++ } ++ ++ void set_hash(unsigned int hash) { ++ _hash = hash; ++ } ++ ++ typeArrayOop obj() { ++ return _obj; ++ } ++ ++ typeArrayOop* obj_addr() { ++ return &_obj; ++ } ++ ++ void set_obj(typeArrayOop obj) { ++ _obj = obj; ++ } ++}; ++ ++// ++// The deduplication hashtable keeps track of all unique character arrays used ++// by String objects. Each table entry weakly points to an character array, allowing ++// otherwise unreachable character arrays to be declared dead and pruned from the ++// table. ++// ++// The table is dynamically resized to accommodate the current number of table entries. ++// The table has hash buckets with chains for hash collision. If the average chain ++// length goes above or below given thresholds the table grows or shrinks accordingly. ++// ++// The table is also dynamically rehashed (using a new hash seed) if it becomes severely ++// unbalanced, i.e., a hash chain is significantly longer than average. ++// ++// All access to the table is protected by the StringDedupTable_lock, except under ++// safepoints in which case GC workers are allowed to access a table partitions they ++// have claimed without first acquiring the lock. Note however, that this applies only ++// the table partition (i.e. a range of elements in _buckets), not other parts of the ++// table such as the _entries field, statistics counters, etc. ++// ++class G1StringDedupTable : public CHeapObj { ++private: ++ // The currently active hashtable instance. Only modified when ++ // the table is resizes or rehashed. ++ static G1StringDedupTable* _table; ++ ++ // Cache for reuse and fast alloc/free of table entries. ++ static G1StringDedupEntryCache* _entry_cache; ++ ++ G1StringDedupEntry** _buckets; ++ size_t _size; ++ uintx _entries; ++ uintx _shrink_threshold; ++ uintx _grow_threshold; ++ bool _rehash_needed; ++ ++ // The hash seed also dictates which hash function to use. A ++ // zero hash seed means we will use the Java compatible hash ++ // function (which doesn't use a seed), and a non-zero hash ++ // seed means we use the murmur3 hash function. ++ jint _hash_seed; ++ ++ // Constants governing table resize/rehash/cache. ++ static const size_t _min_size; ++ static const size_t _max_size; ++ static const double _grow_load_factor; ++ static const double _shrink_load_factor; ++ static const uintx _rehash_multiple; ++ static const uintx _rehash_threshold; ++ static const double _max_cache_factor; ++ ++ // Table statistics, only used for logging. ++ static uintx _entries_added; ++ static uintx _entries_removed; ++ static uintx _resize_count; ++ static uintx _rehash_count; ++ ++ G1StringDedupTable(size_t size, jint hash_seed = 0); ++ ~G1StringDedupTable(); ++ ++ // Returns the hash bucket at the given index. ++ G1StringDedupEntry** bucket(size_t index) { ++ return _buckets + index; ++ } ++ ++ // Returns the hash bucket index for the given hash code. ++ size_t hash_to_index(unsigned int hash) { ++ return (size_t)hash & (_size - 1); ++ } ++ ++ // Adds a new table entry to the given hash bucket. ++ void add(typeArrayOop value, unsigned int hash, G1StringDedupEntry** list); ++ ++ // Removes the given table entry from the table. ++ void remove(G1StringDedupEntry** pentry, uint worker_id); ++ ++ // Transfers a table entry from the current table to the destination table. ++ void transfer(G1StringDedupEntry** pentry, G1StringDedupTable* dest); ++ ++ // Returns an existing character array in the given hash bucket, or NULL ++ // if no matching character array exists. ++ typeArrayOop lookup(typeArrayOop value, unsigned int hash, ++ G1StringDedupEntry** list, uintx &count); ++ ++ // Returns an existing character array in the table, or inserts a new ++ // table entry if no matching character array exists. ++ typeArrayOop lookup_or_add_inner(typeArrayOop value, unsigned int hash); ++ ++ // Thread safe lookup or add of table entry ++ static typeArrayOop lookup_or_add(typeArrayOop value, unsigned int hash) { ++ // Protect the table from concurrent access. Also note that this lock ++ // acts as a fence for _table, which could have been replaced by a new ++ // instance if the table was resized or rehashed. ++ MutexLockerEx ml(StringDedupTable_lock, Mutex::_no_safepoint_check_flag); ++ return _table->lookup_or_add_inner(value, hash); ++ } ++ ++ // Returns true if the hashtable is currently using a Java compatible ++ // hash function. ++ static bool use_java_hash() { ++ return _table->_hash_seed == 0; ++ } ++ ++ static bool equals(typeArrayOop value1, typeArrayOop value2); ++ ++ // Computes the hash code for the given character array, using the ++ // currently active hash function and hash seed. ++ static unsigned int hash_code(typeArrayOop value); ++ ++ static uintx unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl, ++ size_t partition_begin, ++ size_t partition_end, ++ uint worker_id); ++ ++public: ++ static void create(); ++ ++ // Deduplicates the given String object, or adds its backing ++ // character array to the deduplication hashtable. ++ static void deduplicate(oop java_string, G1StringDedupStat& stat); ++ ++ // If a table resize is needed, returns a newly allocated empty ++ // hashtable of the proper size. ++ static G1StringDedupTable* prepare_resize(); ++ ++ // Installs a newly resized table as the currently active table ++ // and deletes the previously active table. ++ static void finish_resize(G1StringDedupTable* resized_table); ++ ++ // If a table rehash is needed, returns a newly allocated empty ++ // hashtable and updates the hash seed. ++ static G1StringDedupTable* prepare_rehash(); ++ ++ // Transfers rehashed entries from the currently active table into ++ // the new table. Installs the new table as the currently active table ++ // and deletes the previously active table. ++ static void finish_rehash(G1StringDedupTable* rehashed_table); ++ ++ // If the table entry cache has grown too large, trim it down according to policy ++ static void trim_entry_cache(); ++ ++ static void unlink_or_oops_do(G1StringDedupUnlinkOrOopsDoClosure* cl, uint worker_id); ++ ++ static void print_statistics(outputStream* st); ++ static void verify(); ++}; ++ ++#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPTABLE_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,143 @@ ++/* ++ * 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 "gc_implementation/g1/g1Log.hpp" ++#include "gc_implementation/g1/g1StringDedup.hpp" ++#include "gc_implementation/g1/g1StringDedupTable.hpp" ++#include "gc_implementation/g1/g1StringDedupThread.hpp" ++#include "gc_implementation/g1/g1StringDedupQueue.hpp" ++ ++G1StringDedupThread* G1StringDedupThread::_thread = NULL; ++ ++G1StringDedupThread::G1StringDedupThread() : ++ ConcurrentGCThread() { ++ set_name("String Deduplication Thread"); ++ create_and_start(); ++} ++ ++G1StringDedupThread::~G1StringDedupThread() { ++ ShouldNotReachHere(); ++} ++ ++void G1StringDedupThread::create() { ++ assert(G1StringDedup::is_enabled(), "String deduplication not enabled"); ++ assert(_thread == NULL, "One string deduplication thread allowed"); ++ _thread = new G1StringDedupThread(); ++} ++ ++G1StringDedupThread* G1StringDedupThread::thread() { ++ assert(G1StringDedup::is_enabled(), "String deduplication not enabled"); ++ assert(_thread != NULL, "String deduplication thread not created"); ++ return _thread; ++} ++ ++void G1StringDedupThread::print_on(outputStream* st) const { ++ st->print("\"%s\" ", name()); ++ Thread::print_on(st); ++ st->cr(); ++} ++ ++void G1StringDedupThread::run() { ++ G1StringDedupStat total_stat; ++ ++ initialize_in_thread(); ++ wait_for_universe_init(); ++ ++ // Main loop ++ for (;;) { ++ G1StringDedupStat stat; ++ ++ stat.mark_idle(); ++ ++ // Wait for the queue to become non-empty ++ G1StringDedupQueue::wait(); ++ if (_should_terminate) { ++ break; ++ } ++ ++ // Include this thread in safepoints ++ stsJoin(); ++ ++ stat.mark_exec(); ++ ++ // Process the queue ++ for (;;) { ++ oop java_string = G1StringDedupQueue::pop(); ++ if (java_string == NULL) { ++ break; ++ } ++ ++ G1StringDedupTable::deduplicate(java_string, stat); ++ ++ // Safepoint this thread if needed ++ if (stsShouldYield()) { ++ stat.mark_block(); ++ stsYield(NULL); ++ stat.mark_unblock(); ++ } ++ } ++ ++ G1StringDedupTable::trim_entry_cache(); ++ ++ stat.mark_done(); ++ ++ // Print statistics ++ total_stat.add(stat); ++ print(gclog_or_tty, stat, total_stat); ++ ++ // Exclude this thread from safepoints ++ stsLeave(); ++ } ++ ++ terminate(); ++} ++ ++void G1StringDedupThread::stop() { ++ { ++ MonitorLockerEx ml(Terminator_lock); ++ _thread->_should_terminate = true; ++ } ++ ++ G1StringDedupQueue::cancel_wait(); ++ ++ { ++ MonitorLockerEx ml(Terminator_lock); ++ while (!_thread->_has_terminated) { ++ ml.wait(); ++ } ++ } ++} ++ ++void G1StringDedupThread::print(outputStream* st, const G1StringDedupStat& last_stat, const G1StringDedupStat& total_stat) { ++ if (G1Log::fine() || PrintStringDeduplicationStatistics) { ++ G1StringDedupStat::print_summary(st, last_stat, total_stat); ++ if (PrintStringDeduplicationStatistics) { ++ G1StringDedupStat::print_statistics(st, last_stat, false); ++ G1StringDedupStat::print_statistics(st, total_stat, true); ++ G1StringDedupTable::print_statistics(st); ++ G1StringDedupQueue::print_statistics(st); ++ } ++ } ++} +--- ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPTHREAD_HPP ++#define SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPTHREAD_HPP ++ ++#include "gc_implementation/g1/g1StringDedupStat.hpp" ++#include "gc_implementation/shared/concurrentGCThread.hpp" ++ ++// ++// The deduplication thread is where the actual deduplication occurs. It waits for ++// deduplication candidates to appear on the deduplication queue, removes them from ++// the queue and tries to deduplicate them. It uses the deduplication hashtable to ++// find identical, already existing, character arrays on the heap. The thread runs ++// concurrently with the Java application but participates in safepoints to allow ++// the GC to adjust and unlink oops from the deduplication queue and table. ++// ++class G1StringDedupThread: public ConcurrentGCThread { ++private: ++ static G1StringDedupThread* _thread; ++ ++ G1StringDedupThread(); ++ ~G1StringDedupThread(); ++ ++ void print(outputStream* st, const G1StringDedupStat& last_stat, const G1StringDedupStat& total_stat); ++ ++public: ++ static void create(); ++ static void stop(); ++ ++ static G1StringDedupThread* thread(); ++ ++ virtual void run(); ++ virtual void print_on(outputStream* st) const; ++}; ++ ++#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPTHREAD_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -71,6 +71,9 @@ + diagnostic(bool, G1TraceConcRefinement, false, \ + "Trace G1 concurrent refinement") \ + \ ++ experimental(bool, G1TraceStringSymbolTableScrubbing, false, \ ++ "Trace information string and symbol table scrubbing.") \ ++ \ + product(double, G1ConcMarkStepDurationMillis, 10.0, \ + "Target duration of individual concurrent marking steps " \ + "in milliseconds.") \ +@@ -282,6 +285,10 @@ + product(uintx, G1MixedGCCountTarget, 8, \ + "The target number of mixed GCs after a marking cycle.") \ + \ ++ experimental(uintx, G1CodeRootsChunkCacheKeepPercent, 10, \ ++ "The amount of code root chunks that should be kept at most " \ ++ "as percentage of already allocated.") \ ++ \ + experimental(uintx, G1OldCSetRegionThresholdPercent, 10, \ + "An upper bound for the number of old CSet regions expressed " \ + "as a percentage of the heap size.") \ +--- ./hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -33,19 +33,16 @@ + // Forward declarations. + enum G1Barrier { + G1BarrierNone, +- G1BarrierRS, + G1BarrierEvac, + G1BarrierKlass + }; + +-template ++template + class G1ParCopyClosure; + + class G1ParScanClosure; + class G1ParPushHeapRSClosure; + +-typedef G1ParCopyClosure G1ParScanHeapEvacClosure; +- + class FilterIntoCSClosure; + class FilterOutOfRegionClosure; + class G1CMOopClosure; +@@ -62,7 +59,6 @@ + #endif + + #define FURTHER_SPECIALIZED_OOP_OOP_ITERATE_CLOSURES(f) \ +- f(G1ParScanHeapEvacClosure,_nv) \ + f(G1ParScanClosure,_nv) \ + f(G1ParPushHeapRSClosure,_nv) \ + f(FilterIntoCSClosure,_nv) \ +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -34,6 +34,8 @@ + #include "memory/iterator.hpp" + #include "oops/oop.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + int HeapRegion::LogOfHRGrainBytes = 0; + int HeapRegion::LogOfHRGrainWords = 0; + size_t HeapRegion::GrainBytes = 0; +@@ -205,7 +207,7 @@ + init_top_at_mark_start(); + } + +-void HeapRegion::hr_clear(bool par, bool clear_space) { ++void HeapRegion::hr_clear(bool par, bool clear_space, bool locked) { + assert(_humongous_type == NotHumongous, + "we should have already filtered out humongous regions"); + assert(_humongous_start_region == NULL, +@@ -223,7 +225,11 @@ + if (!par) { + // If this is parallel, this will be done later. + HeapRegionRemSet* hrrs = rem_set(); +- hrrs->clear(); ++ if (locked) { ++ hrrs->clear_locked(); ++ } else { ++ hrrs->clear(); ++ } + _claimed = InitialClaimValue; + } + zero_marked_bytes(); +@@ -352,7 +358,7 @@ + _claimed(InitialClaimValue), _evacuation_failed(false), + _prev_marked_bytes(0), _next_marked_bytes(0), _gc_efficiency(0.0), + _young_type(NotYoung), _next_young_region(NULL), +- _next_dirty_cards_region(NULL), _next(NULL), _pending_removal(false), ++ _next_dirty_cards_region(NULL), _next(NULL), _prev(NULL), _pending_removal(false), + #ifdef ASSERT + _containing_set(NULL), + #endif // ASSERT +@@ -710,14 +716,14 @@ + } + + HeapRegionRemSet* hrrs = rem_set(); +- int strong_code_roots_length = hrrs->strong_code_roots_list_length(); ++ size_t strong_code_roots_length = hrrs->strong_code_roots_list_length(); + + // if this region is empty then there should be no entries + // on its strong code root list + if (is_empty()) { + if (strong_code_roots_length > 0) { + gclog_or_tty->print_cr("region ["PTR_FORMAT","PTR_FORMAT"] is empty " +- "but has "INT32_FORMAT" code root entries", ++ "but has "SIZE_FORMAT" code root entries", + bottom(), end(), strong_code_roots_length); + *failures = true; + } +@@ -727,7 +733,7 @@ + if (continuesHumongous()) { + if (strong_code_roots_length > 0) { + gclog_or_tty->print_cr("region "HR_FORMAT" is a continuation of a humongous " +- "region but has "INT32_FORMAT" code root entries", ++ "region but has "SIZE_FORMAT" code root entries", + HR_FORMAT_PARAMS(this), strong_code_roots_length); + *failures = true; + } +@@ -825,7 +831,7 @@ + Mutex::_no_safepoint_check_flag); + + if (!_failures) { +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + gclog_or_tty->print_cr("----------"); + } + if (!_g1h->is_in_closed_subset(obj)) { +@@ -880,7 +886,7 @@ + Mutex::_no_safepoint_check_flag); + + if (!_failures) { +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + gclog_or_tty->print_cr("----------"); + } + gclog_or_tty->print_cr("Missing rem set entry:"); +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -61,7 +61,7 @@ + (_hr_)->startsHumongous() ? "HS" : \ + (_hr_)->continuesHumongous() ? "HC" : \ + !(_hr_)->is_empty() ? "O" : "F", \ +- (_hr_)->bottom(), (_hr_)->top(), (_hr_)->end() ++ p2i((_hr_)->bottom()), p2i((_hr_)->top()), p2i((_hr_)->end()) + + // sentinel value for hrs_index + #define G1_NULL_HRS_INDEX ((uint) -1) +@@ -271,6 +271,7 @@ + + // Fields used by the HeapRegionSetBase class and subclasses. + HeapRegion* _next; ++ HeapRegion* _prev; + #ifdef ASSERT + HeapRegionSetBase* _containing_set; + #endif // ASSERT +@@ -531,11 +532,13 @@ + + // Methods used by the HeapRegionSetBase class and subclasses. + +- // Getter and setter for the next field used to link regions into ++ // Getter and setter for the next and prev fields used to link regions into + // linked lists. + HeapRegion* next() { return _next; } ++ HeapRegion* prev() { return _prev; } + + void set_next(HeapRegion* next) { _next = next; } ++ void set_prev(HeapRegion* prev) { _prev = prev; } + + // Every region added to a set is tagged with a reference to that + // set. This is used for doing consistency checking to make sure that +@@ -547,7 +550,7 @@ + (containing_set != NULL && _containing_set == NULL), + err_msg("containing_set: "PTR_FORMAT" " + "_containing_set: "PTR_FORMAT, +- containing_set, _containing_set)); ++ p2i(containing_set), p2i(_containing_set))); + + _containing_set = containing_set; + } +@@ -596,7 +599,7 @@ + void save_marks(); + + // Reset HR stuff to default values. +- void hr_clear(bool par, bool clear_space); ++ void hr_clear(bool par, bool clear_space, bool locked = false); + void par_clear(); + + // Get the start of the unmarked area in this region. +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,12 +29,15 @@ + #include "gc_implementation/g1/heapRegionRemSet.hpp" + #include "gc_implementation/g1/heapRegionSeq.inline.hpp" + #include "memory/allocation.hpp" ++#include "memory/padded.inline.hpp" + #include "memory/space.inline.hpp" + #include "oops/oop.inline.hpp" + #include "utilities/bitMap.inline.hpp" + #include "utilities/globalDefinitions.hpp" + #include "utilities/growableArray.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + class PerRegionTable: public CHeapObj { + friend class OtherRegionsTable; + friend class HeapRegionRemSetIterator; +@@ -259,10 +262,9 @@ + size_t OtherRegionsTable::_fine_eviction_stride = 0; + size_t OtherRegionsTable::_fine_eviction_sample_size = 0; + +-OtherRegionsTable::OtherRegionsTable(HeapRegion* hr) : ++OtherRegionsTable::OtherRegionsTable(HeapRegion* hr, Mutex* m) : + _g1h(G1CollectedHeap::heap()), +- _m(Mutex::leaf, "An OtherRegionsTable lock", true), +- _hr(hr), ++ _hr(hr), _m(m), + _coarse_map(G1CollectedHeap::heap()->max_regions(), + false /* in-resource-area */), + _fine_grain_regions(NULL), +@@ -358,46 +360,66 @@ + "just checking"); + } + +-int** OtherRegionsTable::_from_card_cache = NULL; +-size_t OtherRegionsTable::_from_card_cache_max_regions = 0; +-size_t OtherRegionsTable::_from_card_cache_mem_size = 0; ++int** FromCardCache::_cache = NULL; ++uint FromCardCache::_max_regions = 0; ++size_t FromCardCache::_static_mem_size = 0; + +-void OtherRegionsTable::init_from_card_cache(size_t max_regions) { +- _from_card_cache_max_regions = max_regions; ++void FromCardCache::initialize(uint n_par_rs, uint max_num_regions) { ++ guarantee(_cache == NULL, "Should not call this multiple times"); + +- int n_par_rs = HeapRegionRemSet::num_par_rem_sets(); +- _from_card_cache = NEW_C_HEAP_ARRAY(int*, n_par_rs, mtGC); +- for (int i = 0; i < n_par_rs; i++) { +- _from_card_cache[i] = NEW_C_HEAP_ARRAY(int, max_regions, mtGC); +- for (size_t j = 0; j < max_regions; j++) { +- _from_card_cache[i][j] = -1; // An invalid value. ++ _max_regions = max_num_regions; ++ _cache = Padded2DArray::create_unfreeable(n_par_rs, ++ _max_regions, ++ &_static_mem_size); ++ ++ for (uint i = 0; i < n_par_rs; i++) { ++ for (uint j = 0; j < _max_regions; j++) { ++ set(i, j, InvalidCard); + } + } +- _from_card_cache_mem_size = n_par_rs * max_regions * sizeof(int); + } + +-void OtherRegionsTable::shrink_from_card_cache(size_t new_n_regs) { +- for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets(); i++) { +- assert(new_n_regs <= _from_card_cache_max_regions, "Must be within max."); +- for (size_t j = new_n_regs; j < _from_card_cache_max_regions; j++) { +- _from_card_cache[i][j] = -1; // An invalid value. ++void FromCardCache::shrink(uint new_num_regions) { ++ for (uint i = 0; i < HeapRegionRemSet::num_par_rem_sets(); i++) { ++ assert(new_num_regions <= _max_regions, "Must be within max."); ++ for (uint j = new_num_regions; j < _max_regions; j++) { ++ set(i, j, InvalidCard); + } + } + } + + #ifndef PRODUCT +-void OtherRegionsTable::print_from_card_cache() { +- for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets(); i++) { +- for (size_t j = 0; j < _from_card_cache_max_regions; j++) { +- gclog_or_tty->print_cr("_from_card_cache[%d][%d] = %d.", +- i, j, _from_card_cache[i][j]); ++void FromCardCache::print(outputStream* out) { ++ for (uint i = 0; i < HeapRegionRemSet::num_par_rem_sets(); i++) { ++ for (uint j = 0; j < _max_regions; j++) { ++ out->print_cr("_from_card_cache["UINT32_FORMAT"]["UINT32_FORMAT"] = "INT32_FORMAT".", ++ i, j, at(i, j)); + } + } + } + #endif + ++void FromCardCache::clear(uint region_idx) { ++ uint num_par_remsets = HeapRegionRemSet::num_par_rem_sets(); ++ for (uint i = 0; i < num_par_remsets; i++) { ++ set(i, region_idx, InvalidCard); ++ } ++} ++ ++void OtherRegionsTable::init_from_card_cache(uint max_regions) { ++ FromCardCache::initialize(HeapRegionRemSet::num_par_rem_sets(), max_regions); ++} ++ ++void OtherRegionsTable::shrink_from_card_cache(uint new_num_regions) { ++ FromCardCache::shrink(new_num_regions); ++} ++ ++void OtherRegionsTable::print_from_card_cache() { ++ FromCardCache::print(); ++} ++ + void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, int tid) { +- size_t cur_hrs_ind = (size_t) hr()->hrs_index(); ++ uint cur_hrs_ind = hr()->hrs_index(); + + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").", +@@ -410,19 +432,17 @@ + int from_card = (int)(uintptr_t(from) >> CardTableModRefBS::card_shift); + + if (G1TraceHeapRegionRememberedSet) { +- gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = %d)", ++ gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = "INT32_FORMAT")", + hr()->bottom(), from_card, +- _from_card_cache[tid][cur_hrs_ind]); ++ FromCardCache::at((uint)tid, cur_hrs_ind)); + } + +- if (from_card == _from_card_cache[tid][cur_hrs_ind]) { ++ if (FromCardCache::contains_or_replace((uint)tid, cur_hrs_ind, from_card)) { + if (G1TraceHeapRegionRememberedSet) { + gclog_or_tty->print_cr(" from-card cache hit."); + } + assert(contains_reference(from), "We just added it!"); + return; +- } else { +- _from_card_cache[tid][cur_hrs_ind] = from_card; + } + + // Note that this may be a continued H region. +@@ -442,7 +462,7 @@ + size_t ind = from_hrs_ind & _mod_max_fine_entries_mask; + PerRegionTable* prt = find_region_table(ind, from_hr); + if (prt == NULL) { +- MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag); ++ MutexLockerEx x(_m, Mutex::_no_safepoint_check_flag); + // Confirm that it's really not there... + prt = find_region_table(ind, from_hr); + if (prt == NULL) { +@@ -544,7 +564,7 @@ + jint OtherRegionsTable::_n_coarsenings = 0; + + PerRegionTable* OtherRegionsTable::delete_region_table() { +- assert(_m.owned_by_self(), "Precondition"); ++ assert(_m->owned_by_self(), "Precondition"); + assert(_n_fine_entries == _max_fine_entries, "Precondition"); + PerRegionTable* max = NULL; + jint max_occ = 0; +@@ -676,8 +696,6 @@ + + + size_t OtherRegionsTable::occupied() const { +- // Cast away const in this case. +- MutexLockerEx x((Mutex*)&_m, Mutex::_no_safepoint_check_flag); + size_t sum = occ_fine(); + sum += occ_sparse(); + sum += occ_coarse(); +@@ -707,8 +725,6 @@ + } + + size_t OtherRegionsTable::mem_size() const { +- // Cast away const in this case. +- MutexLockerEx x((Mutex*)&_m, Mutex::_no_safepoint_check_flag); + size_t sum = 0; + // all PRTs are of the same size so it is sufficient to query only one of them. + if (_first_all_fine_prts != NULL) { +@@ -724,7 +740,7 @@ + } + + size_t OtherRegionsTable::static_mem_size() { +- return _from_card_cache_mem_size; ++ return FromCardCache::static_mem_size(); + } + + size_t OtherRegionsTable::fl_mem_size() { +@@ -732,14 +748,10 @@ + } + + void OtherRegionsTable::clear_fcc() { +- size_t hrs_idx = hr()->hrs_index(); +- for (int i = 0; i < HeapRegionRemSet::num_par_rem_sets(); i++) { +- _from_card_cache[i][hrs_idx] = -1; +- } ++ FromCardCache::clear(hr()->hrs_index()); + } + + void OtherRegionsTable::clear() { +- MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag); + // if there are no entries, skip this step + if (_first_all_fine_prts != NULL) { + guarantee(_first_all_fine_prts != NULL && _last_all_fine_prts != NULL, "just checking"); +@@ -759,7 +771,7 @@ + } + + void OtherRegionsTable::clear_incoming_entry(HeapRegion* from_hr) { +- MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag); ++ MutexLockerEx x(_m, Mutex::_no_safepoint_check_flag); + size_t hrs_ind = (size_t) from_hr->hrs_index(); + size_t ind = hrs_ind & _mod_max_fine_entries_mask; + if (del_single_region_table(ind, from_hr)) { +@@ -768,15 +780,15 @@ + _coarse_map.par_at_put(hrs_ind, 0); + } + // Check to see if any of the fcc entries come from here. +- size_t hr_ind = (size_t) hr()->hrs_index(); +- for (int tid = 0; tid < HeapRegionRemSet::num_par_rem_sets(); tid++) { +- int fcc_ent = _from_card_cache[tid][hr_ind]; +- if (fcc_ent != -1) { ++ uint hr_ind = hr()->hrs_index(); ++ for (uint tid = 0; tid < HeapRegionRemSet::num_par_rem_sets(); tid++) { ++ int fcc_ent = FromCardCache::at(tid, hr_ind); ++ if (fcc_ent != FromCardCache::InvalidCard) { + HeapWord* card_addr = (HeapWord*) + (uintptr_t(fcc_ent) << CardTableModRefBS::card_shift); + if (hr()->is_in_reserved(card_addr)) { + // Clear the from card cache. +- _from_card_cache[tid][hr_ind] = -1; ++ FromCardCache::set(tid, hr_ind, FromCardCache::InvalidCard); + } + } + } +@@ -805,7 +817,7 @@ + + bool OtherRegionsTable::contains_reference(OopOrNarrowOopStar from) const { + // Cast away const in this case. +- MutexLockerEx x((Mutex*)&_m, Mutex::_no_safepoint_check_flag); ++ MutexLockerEx x((Mutex*)_m, Mutex::_no_safepoint_check_flag); + return contains_reference_locked(from); + } + +@@ -832,8 +844,6 @@ + "Must be in range."); + return _sparse_table.contains_card(hr_ind, card_index); + } +- +- + } + + void +@@ -844,13 +854,15 @@ + // Determines how many threads can add records to an rset in parallel. + // This can be done by either mutator threads together with the + // concurrent refinement threads or GC threads. +-int HeapRegionRemSet::num_par_rem_sets() { +- return (int)MAX2(DirtyCardQueueSet::num_par_ids() + ConcurrentG1Refine::thread_num(), ParallelGCThreads); ++uint HeapRegionRemSet::num_par_rem_sets() { ++ return MAX2(DirtyCardQueueSet::num_par_ids() + ConcurrentG1Refine::thread_num(), (uint)ParallelGCThreads); + } + + HeapRegionRemSet::HeapRegionRemSet(G1BlockOffsetSharedArray* bosa, + HeapRegion* hr) +- : _bosa(bosa), _strong_code_roots_list(NULL), _other_regions(hr) { ++ : _bosa(bosa), ++ _m(Mutex::leaf, FormatBuffer<128>("HeapRegionRemSet lock #"UINT32_FORMAT, hr->hrs_index()), true), ++ _code_roots(), _other_regions(hr, &_m) { + reset_for_par_iteration(); + } + +@@ -883,7 +895,7 @@ + } + + #ifndef PRODUCT +-void HeapRegionRemSet::print() const { ++void HeapRegionRemSet::print() { + HeapRegionRemSetIterator iter(this); + size_t card_index; + while (iter.has_next(card_index)) { +@@ -909,14 +921,14 @@ + } + + void HeapRegionRemSet::clear() { +- if (_strong_code_roots_list != NULL) { +- delete _strong_code_roots_list; +- } +- _strong_code_roots_list = new (ResourceObj::C_HEAP, mtGC) +- GrowableArray(10, 0, NULL, true); ++ MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag); ++ clear_locked(); ++} + ++void HeapRegionRemSet::clear_locked() { ++ _code_roots.clear(); + _other_regions.clear(); +- assert(occupied() == 0, "Should be clear."); ++ assert(occupied_locked() == 0, "Should be clear."); + reset_for_par_iteration(); + } + +@@ -932,27 +944,18 @@ + _other_regions.scrub(ctbs, region_bm, card_bm); + } + +- + // Code roots support + + void HeapRegionRemSet::add_strong_code_root(nmethod* nm) { + assert(nm != NULL, "sanity"); +- // Search for the code blob from the RHS to avoid +- // duplicate entries as much as possible +- if (_strong_code_roots_list->find_from_end(nm) < 0) { +- // Code blob isn't already in the list +- _strong_code_roots_list->push(nm); +- } ++ _code_roots.add(nm); + } + + void HeapRegionRemSet::remove_strong_code_root(nmethod* nm) { + assert(nm != NULL, "sanity"); +- int idx = _strong_code_roots_list->find(nm); +- if (idx >= 0) { +- _strong_code_roots_list->remove_at(idx); +- } ++ _code_roots.remove(nm); + // Check that there were no duplicates +- guarantee(_strong_code_roots_list->find(nm) < 0, "duplicate entry found"); ++ guarantee(!_code_roots.contains(nm), "duplicate entry found"); + } + + class NMethodMigrationOopClosure : public OopClosure { +@@ -1014,8 +1017,8 @@ + GrowableArray to_be_retained(10); + G1CollectedHeap* g1h = G1CollectedHeap::heap(); + +- while (_strong_code_roots_list->is_nonempty()) { +- nmethod *nm = _strong_code_roots_list->pop(); ++ while (!_code_roots.is_empty()) { ++ nmethod *nm = _code_roots.pop(); + if (nm != NULL) { + NMethodMigrationOopClosure oop_cl(g1h, hr(), nm); + nm->oops_do(&oop_cl); +@@ -1038,20 +1041,16 @@ + } + + void HeapRegionRemSet::strong_code_roots_do(CodeBlobClosure* blk) const { +- for (int i = 0; i < _strong_code_roots_list->length(); i += 1) { +- nmethod* nm = _strong_code_roots_list->at(i); +- blk->do_code_blob(nm); +- } ++ _code_roots.nmethods_do(blk); + } + + size_t HeapRegionRemSet::strong_code_roots_mem_size() { +- return sizeof(GrowableArray) + +- _strong_code_roots_list->max_length() * sizeof(nmethod*); ++ return _code_roots.mem_size(); + } + + //-------------------- Iteration -------------------- + +-HeapRegionRemSetIterator:: HeapRegionRemSetIterator(const HeapRegionRemSet* hrrs) : ++HeapRegionRemSetIterator:: HeapRegionRemSetIterator(HeapRegionRemSet* hrrs) : + _hrrs(hrrs), + _g1h(G1CollectedHeap::heap()), + _coarse_map(&hrrs->_other_regions._coarse_map), +@@ -1247,7 +1246,7 @@ + while (cur_evnt < _n_recorded_events && i == cur_evnt_ind) { + gclog_or_tty->print("Event: "); + print_event(gclog_or_tty, cur_evnt_kind); +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + cur_evnt++; + if (cur_evnt < MaxRecordedEvents) { + cur_evnt_kind = _recorded_events[cur_evnt]; +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -25,6 +25,7 @@ + #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONREMSET_HPP + #define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONREMSET_HPP + ++#include "gc_implementation/g1/g1CodeCacheRemSet.hpp" + #include "gc_implementation/g1/sparsePRT.hpp" + + // Remembered set for a heap region. Represent a set of "cards" that +@@ -44,6 +45,54 @@ + class HRRSCleanupTask : public SparsePRTCleanupTask { + }; + ++// The FromCardCache remembers the most recently processed card on the heap on ++// a per-region and per-thread basis. ++class FromCardCache : public AllStatic { ++ private: ++ // Array of card indices. Indexed by thread X and heap region to minimize ++ // thread contention. ++ static int** _cache; ++ static uint _max_regions; ++ static size_t _static_mem_size; ++ ++ public: ++ enum { ++ InvalidCard = -1 // Card value of an invalid card, i.e. a card index not otherwise used. ++ }; ++ ++ static void clear(uint region_idx); ++ ++ // Returns true if the given card is in the cache at the given location, or ++ // replaces the card at that location and returns false. ++ static bool contains_or_replace(uint worker_id, uint region_idx, int card) { ++ int card_in_cache = at(worker_id, region_idx); ++ if (card_in_cache == card) { ++ return true; ++ } else { ++ set(worker_id, region_idx, card); ++ return false; ++ } ++ } ++ ++ static int at(uint worker_id, uint region_idx) { ++ return _cache[worker_id][region_idx]; ++ } ++ ++ static void set(uint worker_id, uint region_idx, int val) { ++ _cache[worker_id][region_idx] = val; ++ } ++ ++ static void initialize(uint n_par_rs, uint max_num_regions); ++ ++ static void shrink(uint new_num_regions); ++ ++ static void print(outputStream* out = gclog_or_tty) PRODUCT_RETURN; ++ ++ static size_t static_mem_size() { ++ return _static_mem_size; ++ } ++}; ++ + // The "_coarse_map" is a bitmap with one bit for each region, where set + // bits indicate that the corresponding region may contain some pointer + // into the owning region. +@@ -72,7 +121,7 @@ + friend class HeapRegionRemSetIterator; + + G1CollectedHeap* _g1h; +- Mutex _m; ++ Mutex* _m; + HeapRegion* _hr; + + // These are protected by "_m". +@@ -118,18 +167,13 @@ + // false. + bool del_single_region_table(size_t ind, HeapRegion* hr); + +- // Indexed by thread X heap region, to minimize thread contention. +- static int** _from_card_cache; +- static size_t _from_card_cache_max_regions; +- static size_t _from_card_cache_mem_size; +- + // link/add the given fine grain remembered set into the "all" list + void link_to_all(PerRegionTable * prt); + // unlink/remove the given fine grain remembered set into the "all" list + void unlink_from_all(PerRegionTable * prt); + + public: +- OtherRegionsTable(HeapRegion* hr); ++ OtherRegionsTable(HeapRegion* hr, Mutex* m); + + HeapRegion* hr() const { return _hr; } + +@@ -141,7 +185,6 @@ + // objects. + void scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm); + +- // Not const because it takes a lock. + size_t occupied() const; + size_t occ_fine() const; + size_t occ_coarse() const; +@@ -170,11 +213,11 @@ + + // Declare the heap size (in # of regions) to the OtherRegionsTable. + // (Uses it to initialize from_card_cache). +- static void init_from_card_cache(size_t max_regions); ++ static void init_from_card_cache(uint max_regions); + + // Declares that only regions i s.t. 0 <= i < new_n_regs are in use. + // Make sure any entries for higher regions are invalid. +- static void shrink_from_card_cache(size_t new_n_regs); ++ static void shrink_from_card_cache(uint new_num_regions); + + static void print_from_card_cache(); + }; +@@ -192,9 +235,11 @@ + G1BlockOffsetSharedArray* _bosa; + G1BlockOffsetSharedArray* bosa() const { return _bosa; } + +- // A list of code blobs (nmethods) whose code contains pointers into ++ // A set of code blobs (nmethods) whose code contains pointers into + // the region that owns this RSet. +- GrowableArray* _strong_code_roots_list; ++ G1CodeRootSet _code_roots; ++ ++ Mutex _m; + + OtherRegionsTable _other_regions; + +@@ -218,17 +263,20 @@ + static void print_event(outputStream* str, Event evnt); + + public: +- HeapRegionRemSet(G1BlockOffsetSharedArray* bosa, +- HeapRegion* hr); ++ HeapRegionRemSet(G1BlockOffsetSharedArray* bosa, HeapRegion* hr); + +- static int num_par_rem_sets(); ++ static uint num_par_rem_sets(); + static void setup_remset_size(); + + HeapRegion* hr() const { + return _other_regions.hr(); + } + +- size_t occupied() const { ++ size_t occupied() { ++ MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag); ++ return occupied_locked(); ++ } ++ size_t occupied_locked() { + return _other_regions.occupied(); + } + size_t occ_fine() const { +@@ -260,6 +308,7 @@ + // The region is being reclaimed; clear its remset, and any mention of + // entries for this region in other remsets. + void clear(); ++ void clear_locked(); + + // Attempt to claim the region. Returns true iff this call caused an + // atomic transition from Unclaimed to Claimed. +@@ -289,6 +338,7 @@ + // The actual # of bytes this hr_remset takes up. + // Note also includes the strong code root set. + size_t mem_size() { ++ MutexLockerEx x(&_m, Mutex::_no_safepoint_check_flag); + return _other_regions.mem_size() + // This correction is necessary because the above includes the second + // part. +@@ -299,13 +349,13 @@ + // Returns the memory occupancy of all static data structures associated + // with remembered sets. + static size_t static_mem_size() { +- return OtherRegionsTable::static_mem_size(); ++ return OtherRegionsTable::static_mem_size() + G1CodeRootSet::static_mem_size(); + } + + // Returns the memory occupancy of all free_list data structures associated + // with remembered sets. + static size_t fl_mem_size() { +- return OtherRegionsTable::fl_mem_size(); ++ return OtherRegionsTable::fl_mem_size() + G1CodeRootSet::fl_mem_size(); + } + + bool contains_reference(OopOrNarrowOopStar from) const { +@@ -328,21 +378,21 @@ + void strong_code_roots_do(CodeBlobClosure* blk) const; + + // Returns the number of elements in the strong code roots list +- int strong_code_roots_list_length() { +- return _strong_code_roots_list->length(); ++ size_t strong_code_roots_list_length() { ++ return _code_roots.length(); + } + + // Returns true if the strong code roots contains the given + // nmethod. + bool strong_code_roots_list_contains(nmethod* nm) { +- return _strong_code_roots_list->contains(nm); ++ return _code_roots.contains(nm); + } + + // Returns the amount of memory, in bytes, currently + // consumed by the strong code roots. + size_t strong_code_roots_mem_size(); + +- void print() const; ++ void print() PRODUCT_RETURN; + + // Called during a stop-world phase to perform any deferred cleanups. + static void cleanup(); +@@ -350,12 +400,13 @@ + // Declare the heap size (in # of regions) to the HeapRegionRemSet(s). + // (Uses it to initialize from_card_cache). + static void init_heap(uint max_regions) { +- OtherRegionsTable::init_from_card_cache((size_t) max_regions); ++ G1CodeRootSet::initialize(); ++ OtherRegionsTable::init_from_card_cache(max_regions); + } + + // Declares that only regions i s.t. 0 <= i < new_n_regs are in use. + static void shrink_heap(uint new_n_regs) { +- OtherRegionsTable::shrink_from_card_cache((size_t) new_n_regs); ++ OtherRegionsTable::shrink_from_card_cache(new_n_regs); + } + + #ifndef PRODUCT +@@ -384,7 +435,7 @@ + class HeapRegionRemSetIterator : public StackObj { + + // The region RSet over which we're iterating. +- const HeapRegionRemSet* _hrrs; ++ HeapRegionRemSet* _hrrs; + + // Local caching of HRRS fields. + const BitMap* _coarse_map; +@@ -441,7 +492,7 @@ + public: + // We require an iterator to be initialized before use, so the + // constructor does little. +- HeapRegionRemSetIterator(const HeapRegionRemSet* hrrs); ++ HeapRegionRemSetIterator(HeapRegionRemSet* hrrs); + + // If there remains one or more cards to be yielded, returns true and + // sets "card_index" to one of those cards (which is then considered +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -25,7 +25,7 @@ + #include "precompiled.hpp" + #include "gc_implementation/g1/heapRegion.hpp" + #include "gc_implementation/g1/heapRegionSeq.inline.hpp" +-#include "gc_implementation/g1/heapRegionSets.hpp" ++#include "gc_implementation/g1/heapRegionSet.hpp" + #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" + #include "memory/allocation.hpp" + +@@ -233,7 +233,7 @@ + guarantee(hr != NULL, err_msg("invariant: i: %u", i)); + guarantee(hr->bottom() == prev_end, + err_msg("invariant i: %u "HR_FORMAT" prev_end: "PTR_FORMAT, +- i, HR_FORMAT_PARAMS(hr), prev_end)); ++ i, HR_FORMAT_PARAMS(hr), p2i(prev_end))); + guarantee(hr->hrs_index() == i, + err_msg("invariant: i: %u hrs_index(): %u", i, hr->hrs_index())); + if (i < length()) { +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -37,7 +37,7 @@ + inline HeapRegion* HeapRegionSeq::addr_to_region(HeapWord* addr) const { + if (addr != NULL && addr < heap_end()) { + assert(addr >= heap_bottom(), +- err_msg("addr: "PTR_FORMAT" bottom: "PTR_FORMAT, addr, heap_bottom())); ++ err_msg("addr: " PTR_FORMAT " bottom: " PTR_FORMAT, p2i(addr), p2i(heap_bottom()))); + return addr_to_region_unsafe(addr); + } + return NULL; +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -23,171 +23,62 @@ + */ + + #include "precompiled.hpp" ++#include "gc_implementation/g1/heapRegionRemSet.hpp" + #include "gc_implementation/g1/heapRegionSet.inline.hpp" + +-uint HeapRegionSetBase::_unrealistically_long_length = 0; +-HRSPhase HeapRegionSetBase::_phase = HRSPhaseNone; ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + +-//////////////////// HeapRegionSetBase //////////////////// +- +-void HeapRegionSetBase::set_unrealistically_long_length(uint len) { +- guarantee(_unrealistically_long_length == 0, "should only be set once"); +- _unrealistically_long_length = len; +-} ++uint FreeRegionList::_unrealistically_long_length = 0; + + void HeapRegionSetBase::fill_in_ext_msg(hrs_ext_msg* msg, const char* message) { +- msg->append("[%s] %s ln: %u rn: %u cy: "SIZE_FORMAT" ud: "SIZE_FORMAT, +- name(), message, length(), region_num(), +- total_capacity_bytes(), total_used_bytes()); ++ msg->append("[%s] %s ln: %u cy: "SIZE_FORMAT, ++ name(), message, length(), total_capacity_bytes()); + fill_in_ext_msg_extra(msg); + } + +-bool HeapRegionSetBase::verify_region(HeapRegion* hr, +- HeapRegionSetBase* expected_containing_set) { +- const char* error_message = NULL; +- +- if (!regions_humongous()) { +- if (hr->isHumongous()) { +- error_message = "the region should not be humongous"; +- } +- } else { +- if (!hr->isHumongous() || !hr->startsHumongous()) { +- error_message = "the region should be 'starts humongous'"; +- } +- } +- +- if (!regions_empty()) { +- if (hr->is_empty()) { +- error_message = "the region should not be empty"; +- } +- } else { +- if (!hr->is_empty()) { +- error_message = "the region should be empty"; +- } +- } +- +-#ifdef ASSERT +- // The _containing_set field is only available when ASSERT is defined. +- if (hr->containing_set() != expected_containing_set) { +- error_message = "inconsistent containing set found"; +- } +-#endif // ASSERT +- +- const char* extra_error_message = verify_region_extra(hr); +- if (extra_error_message != NULL) { +- error_message = extra_error_message; +- } +- +- if (error_message != NULL) { +- outputStream* out = tty; +- out->cr(); +- out->print_cr("## [%s] %s", name(), error_message); +- out->print_cr("## Offending Region: "PTR_FORMAT, hr); +- out->print_cr(" "HR_FORMAT, HR_FORMAT_PARAMS(hr)); +-#ifdef ASSERT +- out->print_cr(" containing set: "PTR_FORMAT, hr->containing_set()); +-#endif // ASSERT +- out->print_cr("## Offending Region Set: "PTR_FORMAT, this); +- print_on(out); +- return false; +- } else { +- return true; +- } ++#ifndef PRODUCT ++void HeapRegionSetBase::verify_region(HeapRegion* hr) { ++ assert(hr->containing_set() == this, err_msg("Inconsistent containing set for %u", hr->hrs_index())); ++ assert(!hr->is_young(), err_msg("Adding young region %u", hr->hrs_index())); // currently we don't use these sets for young regions ++ assert(hr->isHumongous() == regions_humongous(), err_msg("Wrong humongous state for region %u and set %s", hr->hrs_index(), name())); ++ assert(hr->is_empty() == regions_empty(), err_msg("Wrong empty state for region %u and set %s", hr->hrs_index(), name())); ++ assert(hr->rem_set()->verify_ready_for_par_iteration(), err_msg("Wrong iteration state %u", hr->hrs_index())); + } ++#endif + + void HeapRegionSetBase::verify() { + // It's important that we also observe the MT safety protocol even + // for the verification calls. If we do verification without the + // appropriate locks and the set changes underneath our feet + // verification might fail and send us on a wild goose chase. +- hrs_assert_mt_safety_ok(this); ++ check_mt_safety(); + +- guarantee(( is_empty() && length() == 0 && region_num() == 0 && +- total_used_bytes() == 0 && total_capacity_bytes() == 0) || +- (!is_empty() && length() >= 0 && region_num() >= 0 && +- total_used_bytes() >= 0 && total_capacity_bytes() >= 0), +- hrs_ext_msg(this, "invariant")); +- +- guarantee((!regions_humongous() && region_num() == length()) || +- ( regions_humongous() && region_num() >= length()), +- hrs_ext_msg(this, "invariant")); +- +- guarantee(!regions_empty() || total_used_bytes() == 0, +- hrs_ext_msg(this, "invariant")); +- +- guarantee(total_used_bytes() <= total_capacity_bytes(), ++ guarantee(( is_empty() && length() == 0 && total_capacity_bytes() == 0) || ++ (!is_empty() && length() >= 0 && total_capacity_bytes() >= 0), + hrs_ext_msg(this, "invariant")); + } + + void HeapRegionSetBase::verify_start() { + // See comment in verify() about MT safety and verification. +- hrs_assert_mt_safety_ok(this); ++ check_mt_safety(); + assert(!_verify_in_progress, + hrs_ext_msg(this, "verification should not be in progress")); + + // Do the basic verification first before we do the checks over the regions. + HeapRegionSetBase::verify(); + +- _calc_length = 0; +- _calc_region_num = 0; +- _calc_total_capacity_bytes = 0; +- _calc_total_used_bytes = 0; + _verify_in_progress = true; + } + +-void HeapRegionSetBase::verify_next_region(HeapRegion* hr) { +- // See comment in verify() about MT safety and verification. +- hrs_assert_mt_safety_ok(this); +- assert(_verify_in_progress, +- hrs_ext_msg(this, "verification should be in progress")); +- +- guarantee(verify_region(hr, this), hrs_ext_msg(this, "region verification")); +- +- _calc_length += 1; +- _calc_region_num += hr->region_num(); +- _calc_total_capacity_bytes += hr->capacity(); +- _calc_total_used_bytes += hr->used(); +-} +- + void HeapRegionSetBase::verify_end() { + // See comment in verify() about MT safety and verification. +- hrs_assert_mt_safety_ok(this); ++ check_mt_safety(); + assert(_verify_in_progress, + hrs_ext_msg(this, "verification should be in progress")); + +- guarantee(length() == _calc_length, +- hrs_err_msg("[%s] length: %u should be == calc length: %u", +- name(), length(), _calc_length)); +- +- guarantee(region_num() == _calc_region_num, +- hrs_err_msg("[%s] region num: %u should be == calc region num: %u", +- name(), region_num(), _calc_region_num)); +- +- guarantee(total_capacity_bytes() == _calc_total_capacity_bytes, +- hrs_err_msg("[%s] capacity bytes: "SIZE_FORMAT" should be == " +- "calc capacity bytes: "SIZE_FORMAT, +- name(), +- total_capacity_bytes(), _calc_total_capacity_bytes)); +- +- guarantee(total_used_bytes() == _calc_total_used_bytes, +- hrs_err_msg("[%s] used bytes: "SIZE_FORMAT" should be == " +- "calc used bytes: "SIZE_FORMAT, +- name(), total_used_bytes(), _calc_total_used_bytes)); +- + _verify_in_progress = false; + } + +-void HeapRegionSetBase::clear_phase() { +- assert(_phase != HRSPhaseNone, "pre-condition"); +- _phase = HRSPhaseNone; +-} +- +-void HeapRegionSetBase::set_phase(HRSPhase phase) { +- assert(_phase == HRSPhaseNone, "pre-condition"); +- assert(phase != HRSPhaseNone, "pre-condition"); +- _phase = phase; +-} +- + void HeapRegionSetBase::print_on(outputStream* out, bool print_contents) { + out->cr(); + out->print_cr("Set: %s ("PTR_FORMAT")", name(), this); +@@ -196,76 +87,38 @@ + out->print_cr(" empty : %s", BOOL_TO_STR(regions_empty())); + out->print_cr(" Attributes"); + out->print_cr(" length : %14u", length()); +- out->print_cr(" region num : %14u", region_num()); + out->print_cr(" total capacity : "SIZE_FORMAT_W(14)" bytes", + total_capacity_bytes()); +- out->print_cr(" total used : "SIZE_FORMAT_W(14)" bytes", +- total_used_bytes()); + } + +-void HeapRegionSetBase::clear() { +- _length = 0; +- _region_num = 0; +- _total_used_bytes = 0; ++HeapRegionSetBase::HeapRegionSetBase(const char* name, bool humongous, bool empty, HRSMtSafeChecker* mt_safety_checker) ++ : _name(name), _verify_in_progress(false), ++ _is_humongous(humongous), _is_empty(empty), _mt_safety_checker(mt_safety_checker), ++ _count() ++{ } ++ ++void FreeRegionList::set_unrealistically_long_length(uint len) { ++ guarantee(_unrealistically_long_length == 0, "should only be set once"); ++ _unrealistically_long_length = len; + } + +-HeapRegionSetBase::HeapRegionSetBase(const char* name) +- : _name(name), _verify_in_progress(false), +- _calc_length(0), _calc_region_num(0), +- _calc_total_capacity_bytes(0), _calc_total_used_bytes(0) { } +- +-//////////////////// HeapRegionSet //////////////////// +- +-void HeapRegionSet::update_from_proxy(HeapRegionSet* proxy_set) { +- hrs_assert_mt_safety_ok(this); +- hrs_assert_mt_safety_ok(proxy_set); +- hrs_assert_sets_match(this, proxy_set); +- +- verify_optional(); +- proxy_set->verify_optional(); +- +- if (proxy_set->is_empty()) return; +- +- assert(proxy_set->length() <= _length, +- hrs_err_msg("[%s] proxy set length: %u should be <= length: %u", +- name(), proxy_set->length(), _length)); +- _length -= proxy_set->length(); +- +- assert(proxy_set->region_num() <= _region_num, +- hrs_err_msg("[%s] proxy set region num: %u should be <= region num: %u", +- name(), proxy_set->region_num(), _region_num)); +- _region_num -= proxy_set->region_num(); +- +- assert(proxy_set->total_used_bytes() <= _total_used_bytes, +- hrs_err_msg("[%s] proxy set used bytes: "SIZE_FORMAT" " +- "should be <= used bytes: "SIZE_FORMAT, +- name(), proxy_set->total_used_bytes(), +- _total_used_bytes)); +- _total_used_bytes -= proxy_set->total_used_bytes(); +- +- proxy_set->clear(); +- +- verify_optional(); +- proxy_set->verify_optional(); +-} +- +-//////////////////// HeapRegionLinkedList //////////////////// +- +-void HeapRegionLinkedList::fill_in_ext_msg_extra(hrs_ext_msg* msg) { ++void FreeRegionList::fill_in_ext_msg_extra(hrs_ext_msg* msg) { + msg->append(" hd: "PTR_FORMAT" tl: "PTR_FORMAT, head(), tail()); + } + +-void HeapRegionLinkedList::add_as_head(HeapRegionLinkedList* from_list) { +- hrs_assert_mt_safety_ok(this); +- hrs_assert_mt_safety_ok(from_list); ++void FreeRegionList::add_as_head_or_tail(FreeRegionList* from_list, bool as_head) { ++ check_mt_safety(); ++ from_list->check_mt_safety(); + + verify_optional(); + from_list->verify_optional(); + +- if (from_list->is_empty()) return; ++ if (from_list->is_empty()) { ++ return; ++ } + + #ifdef ASSERT +- HeapRegionLinkedListIterator iter(from_list); ++ FreeRegionListIterator iter(from_list); + while (iter.more_available()) { + HeapRegion* hr = iter.get_next(); + // In set_containing_set() we check that we either set the value +@@ -276,35 +129,75 @@ + } + #endif // ASSERT + +- if (_head != NULL) { +- assert(length() > 0 && _tail != NULL, hrs_ext_msg(this, "invariant")); +- from_list->_tail->set_next(_head); ++ if (_head == NULL) { ++ assert(length() == 0 && _tail == NULL, hrs_ext_msg(this, "invariant")); ++ _head = from_list->_head; ++ _tail = from_list->_tail; + } else { +- assert(length() == 0 && _tail == NULL, hrs_ext_msg(this, "invariant")); +- _tail = from_list->_tail; ++ assert(length() > 0 && _tail != NULL, hrs_ext_msg(this, "invariant")); ++ if (as_head) { ++ from_list->_tail->set_next(_head); ++ _head->set_prev(from_list->_tail); ++ _head = from_list->_head; ++ } else { ++ _tail->set_next(from_list->_head); ++ from_list->_head->set_prev(_tail); ++ _tail = from_list->_tail; ++ } + } +- _head = from_list->_head; + +- _length += from_list->length(); +- _region_num += from_list->region_num(); +- _total_used_bytes += from_list->total_used_bytes(); ++ _count.increment(from_list->length(), from_list->total_capacity_bytes()); + from_list->clear(); + + verify_optional(); + from_list->verify_optional(); + } + +-void HeapRegionLinkedList::add_as_tail(HeapRegionLinkedList* from_list) { +- hrs_assert_mt_safety_ok(this); +- hrs_assert_mt_safety_ok(from_list); ++void FreeRegionList::add_as_head(FreeRegionList* from_list) { ++ add_as_head_or_tail(from_list, true /* as_head */); ++} ++ ++void FreeRegionList::add_as_tail(FreeRegionList* from_list) { ++ add_as_head_or_tail(from_list, false /* as_head */); ++} ++ ++void FreeRegionList::remove_all() { ++ check_mt_safety(); ++ verify_optional(); ++ ++ HeapRegion* curr = _head; ++ while (curr != NULL) { ++ verify_region(curr); ++ ++ HeapRegion* next = curr->next(); ++ curr->set_next(NULL); ++ curr->set_prev(NULL); ++ curr->set_containing_set(NULL); ++ curr = next; ++ } ++ clear(); ++ ++ verify_optional(); ++} ++ ++void FreeRegionList::add_ordered(FreeRegionList* from_list) { ++ check_mt_safety(); ++ from_list->check_mt_safety(); + + verify_optional(); + from_list->verify_optional(); + +- if (from_list->is_empty()) return; ++ if (from_list->is_empty()) { ++ return; ++ } + +-#ifdef ASSERT +- HeapRegionLinkedListIterator iter(from_list); ++ if (is_empty()) { ++ add_as_head(from_list); ++ return; ++ } ++ ++ #ifdef ASSERT ++ FreeRegionListIterator iter(from_list); + while (iter.more_available()) { + HeapRegion* hr = iter.get_next(); + // In set_containing_set() we check that we either set the value +@@ -313,46 +206,50 @@ + hr->set_containing_set(NULL); + hr->set_containing_set(this); + } +-#endif // ASSERT ++ #endif // ASSERT + +- if (_tail != NULL) { +- assert(length() > 0 && _head != NULL, hrs_ext_msg(this, "invariant")); +- _tail->set_next(from_list->_head); +- } else { +- assert(length() == 0 && _head == NULL, hrs_ext_msg(this, "invariant")); +- _head = from_list->_head; ++ HeapRegion* curr_to = _head; ++ HeapRegion* curr_from = from_list->_head; ++ ++ while (curr_from != NULL) { ++ while (curr_to != NULL && curr_to->hrs_index() < curr_from->hrs_index()) { ++ curr_to = curr_to->next(); ++ } ++ ++ if (curr_to == NULL) { ++ // The rest of the from list should be added as tail ++ _tail->set_next(curr_from); ++ curr_from->set_prev(_tail); ++ curr_from = NULL; ++ } else { ++ HeapRegion* next_from = curr_from->next(); ++ ++ curr_from->set_next(curr_to); ++ curr_from->set_prev(curr_to->prev()); ++ if (curr_to->prev() == NULL) { ++ _head = curr_from; ++ } else { ++ curr_to->prev()->set_next(curr_from); ++ } ++ curr_to->set_prev(curr_from); ++ ++ curr_from = next_from; ++ } + } +- _tail = from_list->_tail; + +- _length += from_list->length(); +- _region_num += from_list->region_num(); +- _total_used_bytes += from_list->total_used_bytes(); ++ if (_tail->hrs_index() < from_list->_tail->hrs_index()) { ++ _tail = from_list->_tail; ++ } ++ ++ _count.increment(from_list->length(), from_list->total_capacity_bytes()); + from_list->clear(); + + verify_optional(); + from_list->verify_optional(); + } + +-void HeapRegionLinkedList::remove_all() { +- hrs_assert_mt_safety_ok(this); +- verify_optional(); +- +- HeapRegion* curr = _head; +- while (curr != NULL) { +- hrs_assert_region_ok(this, curr, this); +- +- HeapRegion* next = curr->next(); +- curr->set_next(NULL); +- curr->set_containing_set(NULL); +- curr = next; +- } +- clear(); +- +- verify_optional(); +-} +- +-void HeapRegionLinkedList::remove_all_pending(uint target_count) { +- hrs_assert_mt_safety_ok(this); ++void FreeRegionList::remove_all_pending(uint target_count) { ++ check_mt_safety(); + assert(target_count > 1, hrs_ext_msg(this, "pre-condition")); + assert(!is_empty(), hrs_ext_msg(this, "pre-condition")); + +@@ -360,11 +257,11 @@ + DEBUG_ONLY(uint old_length = length();) + + HeapRegion* curr = _head; +- HeapRegion* prev = NULL; + uint count = 0; + while (curr != NULL) { +- hrs_assert_region_ok(this, curr, this); ++ verify_region(curr); + HeapRegion* next = curr->next(); ++ HeapRegion* prev = curr->prev(); + + if (curr->pending_removal()) { + assert(count < target_count, +@@ -384,10 +281,15 @@ + _tail = prev; + } else { + assert(_tail != curr, hrs_ext_msg(this, "invariant")); ++ next->set_prev(prev); ++ } ++ if (_last = curr) { ++ _last = NULL; + } + + curr->set_next(NULL); +- remove_internal(curr); ++ curr->set_prev(NULL); ++ remove(curr); + curr->set_pending_removal(false); + + count += 1; +@@ -397,8 +299,6 @@ + // carry on iterating to make sure there are not more regions + // tagged with pending removal. + DEBUG_ONLY(if (count == target_count) break;) +- } else { +- prev = curr; + } + curr = next; + } +@@ -414,46 +314,27 @@ + verify_optional(); + } + +-void HeapRegionLinkedList::verify() { ++void FreeRegionList::verify() { + // See comment in HeapRegionSetBase::verify() about MT safety and + // verification. +- hrs_assert_mt_safety_ok(this); ++ check_mt_safety(); + + // This will also do the basic verification too. + verify_start(); + +- HeapRegion* curr = _head; +- HeapRegion* prev1 = NULL; +- HeapRegion* prev0 = NULL; +- uint count = 0; +- while (curr != NULL) { +- verify_next_region(curr); +- +- count += 1; +- guarantee(count < _unrealistically_long_length, +- hrs_err_msg("[%s] the calculated length: %u " +- "seems very long, is there maybe a cycle? " +- "curr: "PTR_FORMAT" prev0: "PTR_FORMAT" " +- "prev1: "PTR_FORMAT" length: %u", +- name(), count, curr, prev0, prev1, length())); +- +- prev1 = prev0; +- prev0 = curr; +- curr = curr->next(); +- } +- +- guarantee(_tail == prev0, hrs_ext_msg(this, "post-condition")); ++ verify_list(); + + verify_end(); + } + +-void HeapRegionLinkedList::clear() { +- HeapRegionSetBase::clear(); ++void FreeRegionList::clear() { ++ _count = HeapRegionSetCount(); + _head = NULL; + _tail = NULL; ++ _last = NULL; + } + +-void HeapRegionLinkedList::print_on(outputStream* out, bool print_contents) { ++void FreeRegionList::print_on(outputStream* out, bool print_contents) { + HeapRegionSetBase::print_on(out, print_contents); + out->print_cr(" Linking"); + out->print_cr(" head : "PTR_FORMAT, _head); +@@ -461,10 +342,124 @@ + + if (print_contents) { + out->print_cr(" Contents"); +- HeapRegionLinkedListIterator iter(this); ++ FreeRegionListIterator iter(this); + while (iter.more_available()) { + HeapRegion* hr = iter.get_next(); + hr->print_on(out); + } + } + } ++ ++void FreeRegionList::verify_list() { ++ HeapRegion* curr = head(); ++ HeapRegion* prev1 = NULL; ++ HeapRegion* prev0 = NULL; ++ uint count = 0; ++ size_t capacity = 0; ++ uint last_index = 0; ++ ++ guarantee(_head == NULL || _head->prev() == NULL, "_head should not have a prev"); ++ while (curr != NULL) { ++ verify_region(curr); ++ ++ count++; ++ guarantee(count < _unrealistically_long_length, ++ hrs_err_msg("[%s] the calculated length: %u seems very long, is there maybe a cycle? curr: "PTR_FORMAT" prev0: "PTR_FORMAT" " "prev1: "PTR_FORMAT" length: %u", name(), count, curr, prev0, prev1, length())); ++ ++ if (curr->next() != NULL) { ++ guarantee(curr->next()->prev() == curr, "Next or prev pointers messed up"); ++ } ++ guarantee(curr->hrs_index() == 0 || curr->hrs_index() > last_index, "List should be sorted"); ++ last_index = curr->hrs_index(); ++ ++ capacity += curr->capacity(); ++ ++ prev1 = prev0; ++ prev0 = curr; ++ curr = curr->next(); ++ } ++ ++ guarantee(tail() == prev0, err_msg("Expected %s to end with %u but it ended with %u.", name(), tail()->hrs_index(), prev0->hrs_index())); ++ guarantee(_tail == NULL || _tail->next() == NULL, "_tail should not have a next"); ++ guarantee(length() == count, err_msg("%s count mismatch. Expected %u, actual %u.", name(), length(), count)); ++ guarantee(total_capacity_bytes() == capacity, err_msg("%s capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT, ++ name(), total_capacity_bytes(), capacity)); ++} ++ ++// Note on the check_mt_safety() methods below: ++// ++// Verification of the "master" heap region sets / lists that are ++// maintained by G1CollectedHeap is always done during a STW pause and ++// by the VM thread at the start / end of the pause. The standard ++// verification methods all assert check_mt_safety(). This is ++// important as it ensures that verification is done without ++// concurrent updates taking place at the same time. It follows, that, ++// for the "master" heap region sets / lists, the check_mt_safety() ++// method should include the VM thread / STW case. ++ ++void MasterFreeRegionListMtSafeChecker::check() { ++ // Master Free List MT safety protocol: ++ // (a) If we're at a safepoint, operations on the master free list ++ // should be invoked by either the VM thread (which will serialize ++ // them) or by the GC workers while holding the ++ // FreeList_lock. ++ // (b) If we're not at a safepoint, operations on the master free ++ // list should be invoked while holding the Heap_lock. ++ ++ if (SafepointSynchronize::is_at_safepoint()) { ++ guarantee(Thread::current()->is_VM_thread() || ++ FreeList_lock->owned_by_self(), "master free list MT safety protocol at a safepoint"); ++ } else { ++ guarantee(Heap_lock->owned_by_self(), "master free list MT safety protocol outside a safepoint"); ++ } ++} ++ ++void SecondaryFreeRegionListMtSafeChecker::check() { ++ // Secondary Free List MT safety protocol: ++ // Operations on the secondary free list should always be invoked ++ // while holding the SecondaryFreeList_lock. ++ ++ guarantee(SecondaryFreeList_lock->owned_by_self(), "secondary free list MT safety protocol"); ++} ++ ++void OldRegionSetMtSafeChecker::check() { ++ // Master Old Set MT safety protocol: ++ // (a) If we're at a safepoint, operations on the master old set ++ // should be invoked: ++ // - by the VM thread (which will serialize them), or ++ // - by the GC workers while holding the FreeList_lock, if we're ++ // at a safepoint for an evacuation pause (this lock is taken ++ // anyway when an GC alloc region is retired so that a new one ++ // is allocated from the free list), or ++ // - by the GC workers while holding the OldSets_lock, if we're at a ++ // safepoint for a cleanup pause. ++ // (b) If we're not at a safepoint, operations on the master old set ++ // should be invoked while holding the Heap_lock. ++ ++ if (SafepointSynchronize::is_at_safepoint()) { ++ guarantee(Thread::current()->is_VM_thread() ++ || FreeList_lock->owned_by_self() || OldSets_lock->owned_by_self(), ++ "master old set MT safety protocol at a safepoint"); ++ } else { ++ guarantee(Heap_lock->owned_by_self(), "master old set MT safety protocol outside a safepoint"); ++ } ++} ++ ++void HumongousRegionSetMtSafeChecker::check() { ++ // Humongous Set MT safety protocol: ++ // (a) If we're at a safepoint, operations on the master humongous ++ // set should be invoked by either the VM thread (which will ++ // serialize them) or by the GC workers while holding the ++ // OldSets_lock. ++ // (b) If we're not at a safepoint, operations on the master ++ // humongous set should be invoked while holding the Heap_lock. ++ ++ if (SafepointSynchronize::is_at_safepoint()) { ++ guarantee(Thread::current()->is_VM_thread() || ++ OldSets_lock->owned_by_self(), ++ "master humongous set MT safety protocol at a safepoint"); ++ } else { ++ guarantee(Heap_lock->owned_by_self(), ++ "master humongous set MT safety protocol outside a safepoint"); ++ } ++} +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -38,135 +38,108 @@ + #define HEAP_REGION_SET_FORCE_VERIFY defined(ASSERT) + #endif // HEAP_REGION_SET_FORCE_VERIFY + +-//////////////////// HeapRegionSetBase //////////////////// ++class hrs_ext_msg; ++ ++class HRSMtSafeChecker : public CHeapObj { ++public: ++ virtual void check() = 0; ++}; ++ ++class MasterFreeRegionListMtSafeChecker : public HRSMtSafeChecker { public: void check(); }; ++class SecondaryFreeRegionListMtSafeChecker : public HRSMtSafeChecker { public: void check(); }; ++class HumongousRegionSetMtSafeChecker : public HRSMtSafeChecker { public: void check(); }; ++class OldRegionSetMtSafeChecker : public HRSMtSafeChecker { public: void check(); }; ++ ++class HeapRegionSetCount VALUE_OBJ_CLASS_SPEC { ++ friend class VMStructs; ++ uint _length; ++ size_t _capacity; ++ ++public: ++ HeapRegionSetCount() : _length(0), _capacity(0) { } ++ ++ const uint length() const { return _length; } ++ const size_t capacity() const { return _capacity; } ++ ++ void increment(uint length_to_add, size_t capacity_to_add) { ++ _length += length_to_add; ++ _capacity += capacity_to_add; ++ } ++ ++ void decrement(const uint length_to_remove, const size_t capacity_to_remove) { ++ _length -= length_to_remove; ++ _capacity -= capacity_to_remove; ++ } ++}; + + // Base class for all the classes that represent heap region sets. It + // contains the basic attributes that each set needs to maintain + // (e.g., length, region num, used bytes sum) plus any shared + // functionality (e.g., verification). + +-class hrs_ext_msg; +- +-typedef enum { +- HRSPhaseNone, +- HRSPhaseEvacuation, +- HRSPhaseCleanup, +- HRSPhaseFullGC +-} HRSPhase; +- +-class HRSPhaseSetter; +- + class HeapRegionSetBase VALUE_OBJ_CLASS_SPEC { +- friend class hrs_ext_msg; +- friend class HRSPhaseSetter; + friend class VMStructs; ++private: ++ bool _is_humongous; ++ bool _is_empty; ++ HRSMtSafeChecker* _mt_safety_checker; + + protected: +- static uint _unrealistically_long_length; +- + // The number of regions added to the set. If the set contains + // only humongous regions, this reflects only 'starts humongous' + // regions and does not include 'continues humongous' ones. +- uint _length; +- +- // The total number of regions represented by the set. If the set +- // does not contain humongous regions, this should be the same as +- // _length. If the set contains only humongous regions, this will +- // include the 'continues humongous' regions. +- uint _region_num; +- +- // We don't keep track of the total capacity explicitly, we instead +- // recalculate it based on _region_num and the heap region size. +- +- // The sum of used bytes in the all the regions in the set. +- size_t _total_used_bytes; ++ HeapRegionSetCount _count; + + const char* _name; + +- bool _verify_in_progress; +- uint _calc_length; +- uint _calc_region_num; +- size_t _calc_total_capacity_bytes; +- size_t _calc_total_used_bytes; +- +- // This is here so that it can be used in the subclasses to assert +- // something different depending on which phase the GC is in. This +- // can be particularly helpful in the check_mt_safety() methods. +- static HRSPhase _phase; +- +- // Only used by HRSPhaseSetter. +- static void clear_phase(); +- static void set_phase(HRSPhase phase); ++ bool _verify_in_progress; + + // verify_region() is used to ensure that the contents of a region +- // added to / removed from a set are consistent. Different sets +- // make different assumptions about the regions added to them. So +- // each set can override verify_region_extra(), which is called +- // from verify_region(), and do any extra verification it needs to +- // perform in that. +- virtual const char* verify_region_extra(HeapRegion* hr) { return NULL; } +- bool verify_region(HeapRegion* hr, +- HeapRegionSetBase* expected_containing_set); ++ // added to / removed from a set are consistent. ++ void verify_region(HeapRegion* hr) PRODUCT_RETURN; + + // Indicates whether all regions in the set should be humongous or + // not. Only used during verification. +- virtual bool regions_humongous() = 0; ++ bool regions_humongous() { return _is_humongous; } + + // Indicates whether all regions in the set should be empty or + // not. Only used during verification. +- virtual bool regions_empty() = 0; ++ bool regions_empty() { return _is_empty; } + +- // Subclasses can optionally override this to do MT safety protocol +- // checks. It is called in an assert from all methods that perform +- // updates on the set (and subclasses should also call it too). +- virtual bool check_mt_safety() { return true; } ++ void check_mt_safety() { ++ if (_mt_safety_checker != NULL) { ++ _mt_safety_checker->check(); ++ } ++ } ++ ++ virtual void fill_in_ext_msg_extra(hrs_ext_msg* msg) { } ++ ++ HeapRegionSetBase(const char* name, bool humongous, bool empty, HRSMtSafeChecker* mt_safety_checker); ++ ++public: ++ const char* name() { return _name; } ++ ++ uint length() { return _count.length(); } ++ ++ bool is_empty() { return _count.length() == 0; } ++ ++ size_t total_capacity_bytes() { ++ return _count.capacity(); ++ } ++ ++ // It updates the fields of the set to reflect hr being added to ++ // the set and tags the region appropriately. ++ inline void add(HeapRegion* hr); ++ ++ // It updates the fields of the set to reflect hr being removed ++ // from the set and tags the region appropriately. ++ inline void remove(HeapRegion* hr); + + // fill_in_ext_msg() writes the the values of the set's attributes + // in the custom err_msg (hrs_ext_msg). fill_in_ext_msg_extra() + // allows subclasses to append further information. +- virtual void fill_in_ext_msg_extra(hrs_ext_msg* msg) { } + void fill_in_ext_msg(hrs_ext_msg* msg, const char* message); + +- // It updates the fields of the set to reflect hr being added to +- // the set. +- inline void update_for_addition(HeapRegion* hr); +- +- // It updates the fields of the set to reflect hr being added to +- // the set and tags the region appropriately. +- inline void add_internal(HeapRegion* hr); +- +- // It updates the fields of the set to reflect hr being removed +- // from the set. +- inline void update_for_removal(HeapRegion* hr); +- +- // It updates the fields of the set to reflect hr being removed +- // from the set and tags the region appropriately. +- inline void remove_internal(HeapRegion* hr); +- +- // It clears all the fields of the sets. Note: it will not iterate +- // over the set and remove regions from it. It assumes that the +- // caller has already done so. It will literally just clear the fields. +- virtual void clear(); +- +- HeapRegionSetBase(const char* name); +- +-public: +- static void set_unrealistically_long_length(uint len); +- +- const char* name() { return _name; } +- +- uint length() { return _length; } +- +- bool is_empty() { return _length == 0; } +- +- uint region_num() { return _region_num; } +- +- size_t total_capacity_bytes() { +- return (size_t) region_num() << HeapRegion::LogOfHRGrainBytes; +- } +- +- size_t total_used_bytes() { return _total_used_bytes; } +- + virtual void verify(); + void verify_start(); + void verify_next_region(HeapRegion* hr); +@@ -187,40 +160,13 @@ + // assert/guarantee-specific message it also prints out the values of + // the fields of the associated set. This can be very helpful in + // diagnosing failures. +- + class hrs_ext_msg : public hrs_err_msg { + public: +- hrs_ext_msg(HeapRegionSetBase* set, const char* message) : hrs_err_msg("") { ++ hrs_ext_msg(HeapRegionSetBase* set, const char* message) : hrs_err_msg("%s","") { + set->fill_in_ext_msg(this, message); + } + }; + +-class HRSPhaseSetter { +-public: +- HRSPhaseSetter(HRSPhase phase) { +- HeapRegionSetBase::set_phase(phase); +- } +- ~HRSPhaseSetter() { +- HeapRegionSetBase::clear_phase(); +- } +-}; +- +-// These two macros are provided for convenience, to keep the uses of +-// these two asserts a bit more concise. +- +-#define hrs_assert_mt_safety_ok(_set_) \ +- do { \ +- assert((_set_)->check_mt_safety(), hrs_ext_msg((_set_), "MT safety")); \ +- } while (0) +- +-#define hrs_assert_region_ok(_set_, _hr_, _expected_) \ +- do { \ +- assert((_set_)->verify_region((_hr_), (_expected_)), \ +- hrs_ext_msg((_set_), "region verification")); \ +- } while (0) +- +-//////////////////// HeapRegionSet //////////////////// +- + #define hrs_assert_sets_match(_set1_, _set2_) \ + do { \ + assert(((_set1_)->regions_humongous() == \ +@@ -236,63 +182,41 @@ + // the same interface (namely, the HeapRegionSetBase API). + + class HeapRegionSet : public HeapRegionSetBase { +-protected: +- virtual const char* verify_region_extra(HeapRegion* hr) { +- if (hr->next() != NULL) { +- return "next() should always be NULL as we do not link the regions"; +- } ++public: ++ HeapRegionSet(const char* name, bool humongous, HRSMtSafeChecker* mt_safety_checker): ++ HeapRegionSetBase(name, humongous, false /* empty */, mt_safety_checker) { } + +- return HeapRegionSetBase::verify_region_extra(hr); ++ void bulk_remove(const HeapRegionSetCount& removed) { ++ _count.decrement(removed.length(), removed.capacity()); + } +- +- HeapRegionSet(const char* name) : HeapRegionSetBase(name) { +- clear(); +- } +- +-public: +- // It adds hr to the set. The region should not be a member of +- // another set. +- inline void add(HeapRegion* hr); +- +- // It removes hr from the set. The region should be a member of +- // this set. +- inline void remove(HeapRegion* hr); +- +- // It removes a region from the set. Instead of updating the fields +- // of the set to reflect this removal, it accumulates the updates +- // in proxy_set. The idea is that proxy_set is thread-local to +- // avoid multiple threads updating the fields of the set +- // concurrently and having to synchronize. The method +- // update_from_proxy() will update the fields of the set from the +- // proxy_set. +- inline void remove_with_proxy(HeapRegion* hr, HeapRegionSet* proxy_set); +- +- // After multiple calls to remove_with_proxy() the updates to the +- // fields of the set are accumulated in proxy_set. This call +- // updates the fields of the set from proxy_set. +- void update_from_proxy(HeapRegionSet* proxy_set); + }; + +-//////////////////// HeapRegionLinkedList //////////////////// +- +-// A set that links all the regions added to it in a singly-linked ++// A set that links all the regions added to it in a doubly-linked + // list. We should try to avoid doing operations that iterate over + // such lists in performance critical paths. Typically we should +-// add / remove one region at a time or concatenate two lists. All +-// those operations are done in constant time. ++// add / remove one region at a time or concatenate two lists. There are ++// two ways to treat your lists, ordered and un-ordered. All un-ordered ++// operations are done in constant time. To keep a list ordered only use ++// add_ordered() to add elements to the list. If a list is not ordered ++// from start, there is no way to sort it later. + +-class HeapRegionLinkedListIterator; ++class FreeRegionListIterator; + +-class HeapRegionLinkedList : public HeapRegionSetBase { +- friend class HeapRegionLinkedListIterator; ++class FreeRegionList : public HeapRegionSetBase { ++ friend class FreeRegionListIterator; + + private: + HeapRegion* _head; + HeapRegion* _tail; + +- // These are provided for use by the friend classes. +- HeapRegion* head() { return _head; } +- HeapRegion* tail() { return _tail; } ++ // _last is used to keep track of where we added an element the last ++ // time in ordered lists. It helps to improve performance when adding ++ // several ordered items in a row. ++ HeapRegion* _last; ++ ++ static uint _unrealistically_long_length; ++ ++ void add_as_head_or_tail(FreeRegionList* from_list, bool as_head); + + protected: + virtual void fill_in_ext_msg_extra(hrs_ext_msg* msg); +@@ -300,11 +224,24 @@ + // See the comment for HeapRegionSetBase::clear() + virtual void clear(); + +- HeapRegionLinkedList(const char* name) : HeapRegionSetBase(name) { ++public: ++ FreeRegionList(const char* name, HRSMtSafeChecker* mt_safety_checker = NULL): ++ HeapRegionSetBase(name, false /* humongous */, true /* empty */, mt_safety_checker) { + clear(); + } + +-public: ++ void verify_list(); ++ ++ HeapRegion* head() { return _head; } ++ HeapRegion* tail() { return _tail; } ++ ++ static void set_unrealistically_long_length(uint len); ++ ++ // Add hr to the list. The region should not be a member of another set. ++ // Assumes that the list is ordered and will preserve that order. The order ++ // is determined by hrs_index. ++ inline void add_ordered(HeapRegion* hr); ++ + // It adds hr to the list as the new head. The region should not be + // a member of another set. + inline void add_as_head(HeapRegion* hr); +@@ -320,15 +257,29 @@ + // Convenience method. + inline HeapRegion* remove_head_or_null(); + ++ // Removes and returns the last element (_tail) of the list. It assumes ++ // that the list isn't empty so that it can return a non-NULL value. ++ inline HeapRegion* remove_tail(); ++ ++ // Convenience method ++ inline HeapRegion* remove_tail_or_null(); ++ ++ // Removes from head or tail based on the given argument. ++ inline HeapRegion* remove_region(bool from_head); ++ ++ // Merge two ordered lists. The result is also ordered. The order is ++ // determined by hrs_index. ++ void add_ordered(FreeRegionList* from_list); ++ + // It moves the regions from from_list to this list and empties + // from_list. The new regions will appear in the same order as they + // were in from_list and be linked in the beginning of this list. +- void add_as_head(HeapRegionLinkedList* from_list); ++ void add_as_head(FreeRegionList* from_list); + + // It moves the regions from from_list to this list and empties + // from_list. The new regions will appear in the same order as they + // were in from_list and be linked in the end of this list. +- void add_as_tail(HeapRegionLinkedList* from_list); ++ void add_as_tail(FreeRegionList* from_list); + + // It empties the list by removing all regions from it. + void remove_all(); +@@ -346,15 +297,13 @@ + virtual void print_on(outputStream* out, bool print_contents = false); + }; + +-//////////////////// HeapRegionLinkedListIterator //////////////////// +- + // Iterator class that provides a convenient way to iterate over the + // regions of a HeapRegionLinkedList instance. + +-class HeapRegionLinkedListIterator : public StackObj { ++class FreeRegionListIterator : public StackObj { + private: +- HeapRegionLinkedList* _list; +- HeapRegion* _curr; ++ FreeRegionList* _list; ++ HeapRegion* _curr; + + public: + bool more_available() { +@@ -369,13 +318,12 @@ + // do the "cycle" check. + + HeapRegion* hr = _curr; +- assert(_list->verify_region(hr, _list), "region verification"); ++ _list->verify_region(hr); + _curr = hr->next(); + return hr; + } + +- HeapRegionLinkedListIterator(HeapRegionLinkedList* list) +- : _curr(NULL), _list(list) { ++ FreeRegionListIterator(FreeRegionList* list) : _curr(NULL), _list(list) { + _curr = list->head(); + } + }; +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSet.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -27,116 +27,110 @@ + + #include "gc_implementation/g1/heapRegionSet.hpp" + +-//////////////////// HeapRegionSetBase //////////////////// ++inline void HeapRegionSetBase::add(HeapRegion* hr) { ++ check_mt_safety(); ++ assert(hr->containing_set() == NULL, hrs_ext_msg(this, "should not already have a containing set %u")); ++ assert(hr->next() == NULL && hr->prev() == NULL, hrs_ext_msg(this, "should not already be linked")); + +-inline void HeapRegionSetBase::update_for_addition(HeapRegion* hr) { +- // Assumes the caller has already verified the region. +- +- _length += 1; +- _region_num += hr->region_num(); +- _total_used_bytes += hr->used(); ++ _count.increment(1u, hr->capacity()); ++ hr->set_containing_set(this); ++ verify_region(hr); + } + +-inline void HeapRegionSetBase::add_internal(HeapRegion* hr) { +- hrs_assert_region_ok(this, hr, NULL); +- assert(hr->next() == NULL, hrs_ext_msg(this, "should not already be linked")); ++inline void HeapRegionSetBase::remove(HeapRegion* hr) { ++ check_mt_safety(); ++ verify_region(hr); ++ assert(hr->next() == NULL && hr->prev() == NULL, hrs_ext_msg(this, "should already be unlinked")); + +- update_for_addition(hr); +- hr->set_containing_set(this); ++ hr->set_containing_set(NULL); ++ assert(_count.length() > 0, hrs_ext_msg(this, "pre-condition")); ++ _count.decrement(1u, hr->capacity()); + } + +-inline void HeapRegionSetBase::update_for_removal(HeapRegion* hr) { +- // Assumes the caller has already verified the region. +- assert(_length > 0, hrs_ext_msg(this, "pre-condition")); +- _length -= 1; +- +- uint region_num_diff = hr->region_num(); +- assert(region_num_diff <= _region_num, +- hrs_err_msg("[%s] region's region num: %u " +- "should be <= region num: %u", +- name(), region_num_diff, _region_num)); +- _region_num -= region_num_diff; +- +- size_t used_bytes = hr->used(); +- assert(used_bytes <= _total_used_bytes, +- hrs_err_msg("[%s] region's used bytes: "SIZE_FORMAT" " +- "should be <= used bytes: "SIZE_FORMAT, +- name(), used_bytes, _total_used_bytes)); +- _total_used_bytes -= used_bytes; +-} +- +-inline void HeapRegionSetBase::remove_internal(HeapRegion* hr) { +- hrs_assert_region_ok(this, hr, this); +- assert(hr->next() == NULL, hrs_ext_msg(this, "should already be unlinked")); +- +- hr->set_containing_set(NULL); +- update_for_removal(hr); +-} +- +-//////////////////// HeapRegionSet //////////////////// +- +-inline void HeapRegionSet::add(HeapRegion* hr) { +- hrs_assert_mt_safety_ok(this); +- // add_internal() will verify the region. +- add_internal(hr); +-} +- +-inline void HeapRegionSet::remove(HeapRegion* hr) { +- hrs_assert_mt_safety_ok(this); +- // remove_internal() will verify the region. +- remove_internal(hr); +-} +- +-inline void HeapRegionSet::remove_with_proxy(HeapRegion* hr, +- HeapRegionSet* proxy_set) { +- // No need to fo the MT safety check here given that this method +- // does not update the contents of the set but instead accumulates +- // the changes in proxy_set which is assumed to be thread-local. +- hrs_assert_sets_match(this, proxy_set); +- hrs_assert_region_ok(this, hr, this); +- +- hr->set_containing_set(NULL); +- proxy_set->update_for_addition(hr); +-} +- +-//////////////////// HeapRegionLinkedList //////////////////// +- +-inline void HeapRegionLinkedList::add_as_head(HeapRegion* hr) { +- hrs_assert_mt_safety_ok(this); ++inline void FreeRegionList::add_ordered(HeapRegion* hr) { ++ check_mt_safety(); + assert((length() == 0 && _head == NULL && _tail == NULL) || + (length() > 0 && _head != NULL && _tail != NULL), + hrs_ext_msg(this, "invariant")); +- // add_internal() will verify the region. +- add_internal(hr); ++ // add() will verify the region and check mt safety. ++ add(hr); ++ ++ // Now link the region ++ if (_head != NULL) { ++ HeapRegion* curr; ++ ++ if (_last != NULL && _last->hrs_index() < hr->hrs_index()) { ++ curr = _last; ++ } else { ++ curr = _head; ++ } ++ ++ // Find first entry with a Region Index larger than entry to insert. ++ while (curr != NULL && curr->hrs_index() < hr->hrs_index()) { ++ curr = curr->next(); ++ } ++ ++ hr->set_next(curr); ++ ++ if (curr == NULL) { ++ // Adding at the end ++ hr->set_prev(_tail); ++ _tail->set_next(hr); ++ _tail = hr; ++ } else if (curr->prev() == NULL) { ++ // Adding at the beginning ++ hr->set_prev(NULL); ++ _head = hr; ++ curr->set_prev(hr); ++ } else { ++ hr->set_prev(curr->prev()); ++ hr->prev()->set_next(hr); ++ curr->set_prev(hr); ++ } ++ } else { ++ // The list was empty ++ _tail = hr; ++ _head = hr; ++ } ++ _last = hr; ++} ++ ++inline void FreeRegionList::add_as_head(HeapRegion* hr) { ++ assert((length() == 0 && _head == NULL && _tail == NULL) || ++ (length() > 0 && _head != NULL && _tail != NULL), ++ hrs_ext_msg(this, "invariant")); ++ // add() will verify the region and check mt safety. ++ add(hr); + + // Now link the region. + if (_head != NULL) { + hr->set_next(_head); ++ _head->set_prev(hr); + } else { + _tail = hr; + } + _head = hr; + } + +-inline void HeapRegionLinkedList::add_as_tail(HeapRegion* hr) { +- hrs_assert_mt_safety_ok(this); ++inline void FreeRegionList::add_as_tail(HeapRegion* hr) { ++ check_mt_safety(); + assert((length() == 0 && _head == NULL && _tail == NULL) || + (length() > 0 && _head != NULL && _tail != NULL), + hrs_ext_msg(this, "invariant")); +- // add_internal() will verify the region. +- add_internal(hr); ++ // add() will verify the region and check mt safety. ++ add(hr); + + // Now link the region. + if (_tail != NULL) { + _tail->set_next(hr); ++ hr->set_prev(_tail); + } else { + _head = hr; + } + _tail = hr; + } + +-inline HeapRegion* HeapRegionLinkedList::remove_head() { +- hrs_assert_mt_safety_ok(this); ++inline HeapRegion* FreeRegionList::remove_head() { + assert(!is_empty(), hrs_ext_msg(this, "the list should not be empty")); + assert(length() > 0 && _head != NULL && _tail != NULL, + hrs_ext_msg(this, "invariant")); +@@ -146,17 +140,22 @@ + _head = hr->next(); + if (_head == NULL) { + _tail = NULL; ++ } else { ++ _head->set_prev(NULL); + } + hr->set_next(NULL); + +- // remove_internal() will verify the region. +- remove_internal(hr); ++ if (_last == hr) { ++ _last = NULL; ++ } ++ ++ // remove() will verify the region and check mt safety. ++ remove(hr); + return hr; + } + +-inline HeapRegion* HeapRegionLinkedList::remove_head_or_null() { +- hrs_assert_mt_safety_ok(this); +- ++inline HeapRegion* FreeRegionList::remove_head_or_null() { ++ check_mt_safety(); + if (!is_empty()) { + return remove_head(); + } else { +@@ -164,4 +163,47 @@ + } + } + ++inline HeapRegion* FreeRegionList::remove_tail() { ++ assert(!is_empty(), hrs_ext_msg(this, "The list should not be empty")); ++ assert(length() > 0 && _head != NULL && _tail != NULL, ++ hrs_ext_msg(this, "invariant")); ++ ++ // We need to unlink it first ++ HeapRegion* hr = _tail; ++ ++ _tail = hr->prev(); ++ if (_tail == NULL) { ++ _head = NULL; ++ } else { ++ _tail->set_next(NULL); ++ } ++ hr->set_prev(NULL); ++ ++ if (_last == hr) { ++ _last = NULL; ++ } ++ ++ // remove() will verify the region and check mt safety. ++ remove(hr); ++ return hr; ++} ++ ++inline HeapRegion* FreeRegionList::remove_tail_or_null() { ++ check_mt_safety(); ++ ++ if (!is_empty()) { ++ return remove_tail(); ++ } else { ++ return NULL; ++ } ++} ++ ++inline HeapRegion* FreeRegionList::remove_region(bool from_head) { ++ if (from_head) { ++ return remove_head_or_null(); ++ } else { ++ return remove_tail_or_null(); ++ } ++} ++ + #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSET_INLINE_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSets.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSets.cpp Thu Jan 01 00:00:00 1970 +0000 +@@ -1,175 +0,0 @@ +-/* +- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. +- * +- * This code is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * version 2 for more details (a copy is included in the LICENSE file that +- * accompanied this code). +- * +- * You should have received a copy of the GNU General Public License version +- * 2 along with this work; if not, write to the Free Software Foundation, +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +- * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- * +- */ +- +-#include "precompiled.hpp" +-#include "gc_implementation/g1/heapRegionRemSet.hpp" +-#include "gc_implementation/g1/heapRegionSets.hpp" +- +-// Note on the check_mt_safety() methods below: +-// +-// Verification of the "master" heap region sets / lists that are +-// maintained by G1CollectedHeap is always done during a STW pause and +-// by the VM thread at the start / end of the pause. The standard +-// verification methods all assert check_mt_safety(). This is +-// important as it ensures that verification is done without +-// concurrent updates taking place at the same time. It follows, that, +-// for the "master" heap region sets / lists, the check_mt_safety() +-// method should include the VM thread / STW case. +- +-//////////////////// FreeRegionList //////////////////// +- +-const char* FreeRegionList::verify_region_extra(HeapRegion* hr) { +- if (hr->is_young()) { +- return "the region should not be young"; +- } +- // The superclass will check that the region is empty and +- // not humongous. +- return HeapRegionLinkedList::verify_region_extra(hr); +-} +- +-//////////////////// MasterFreeRegionList //////////////////// +- +-const char* MasterFreeRegionList::verify_region_extra(HeapRegion* hr) { +- // We should reset the RSet for parallel iteration before we add it +- // to the master free list so that it is ready when the region is +- // re-allocated. +- if (!hr->rem_set()->verify_ready_for_par_iteration()) { +- return "the region's RSet should be ready for parallel iteration"; +- } +- return FreeRegionList::verify_region_extra(hr); +-} +- +-bool MasterFreeRegionList::check_mt_safety() { +- // Master Free List MT safety protocol: +- // (a) If we're at a safepoint, operations on the master free list +- // should be invoked by either the VM thread (which will serialize +- // them) or by the GC workers while holding the +- // FreeList_lock. +- // (b) If we're not at a safepoint, operations on the master free +- // list should be invoked while holding the Heap_lock. +- +- if (SafepointSynchronize::is_at_safepoint()) { +- guarantee(Thread::current()->is_VM_thread() || +- FreeList_lock->owned_by_self(), +- hrs_ext_msg(this, "master free list MT safety protocol " +- "at a safepoint")); +- } else { +- guarantee(Heap_lock->owned_by_self(), +- hrs_ext_msg(this, "master free list MT safety protocol " +- "outside a safepoint")); +- } +- +- return FreeRegionList::check_mt_safety(); +-} +- +-//////////////////// SecondaryFreeRegionList //////////////////// +- +-bool SecondaryFreeRegionList::check_mt_safety() { +- // Secondary Free List MT safety protocol: +- // Operations on the secondary free list should always be invoked +- // while holding the SecondaryFreeList_lock. +- +- guarantee(SecondaryFreeList_lock->owned_by_self(), +- hrs_ext_msg(this, "secondary free list MT safety protocol")); +- +- return FreeRegionList::check_mt_safety(); +-} +- +-//////////////////// OldRegionSet //////////////////// +- +-const char* OldRegionSet::verify_region_extra(HeapRegion* hr) { +- if (hr->is_young()) { +- return "the region should not be young"; +- } +- // The superclass will check that the region is not empty and not +- // humongous. +- return HeapRegionSet::verify_region_extra(hr); +-} +- +-//////////////////// MasterOldRegionSet //////////////////// +- +-bool MasterOldRegionSet::check_mt_safety() { +- // Master Old Set MT safety protocol: +- // (a) If we're at a safepoint, operations on the master old set +- // should be invoked: +- // - by the VM thread (which will serialize them), or +- // - by the GC workers while holding the FreeList_lock, if we're +- // at a safepoint for an evacuation pause (this lock is taken +- // anyway when an GC alloc region is retired so that a new one +- // is allocated from the free list), or +- // - by the GC workers while holding the OldSets_lock, if we're at a +- // safepoint for a cleanup pause. +- // (b) If we're not at a safepoint, operations on the master old set +- // should be invoked while holding the Heap_lock. +- +- if (SafepointSynchronize::is_at_safepoint()) { +- guarantee(Thread::current()->is_VM_thread() || +- _phase == HRSPhaseEvacuation && FreeList_lock->owned_by_self() || +- _phase == HRSPhaseCleanup && OldSets_lock->owned_by_self(), +- hrs_ext_msg(this, "master old set MT safety protocol " +- "at a safepoint")); +- } else { +- guarantee(Heap_lock->owned_by_self(), +- hrs_ext_msg(this, "master old set MT safety protocol " +- "outside a safepoint")); +- } +- +- return OldRegionSet::check_mt_safety(); +-} +- +-//////////////////// HumongousRegionSet //////////////////// +- +-const char* HumongousRegionSet::verify_region_extra(HeapRegion* hr) { +- if (hr->is_young()) { +- return "the region should not be young"; +- } +- // The superclass will check that the region is not empty and +- // humongous. +- return HeapRegionSet::verify_region_extra(hr); +-} +- +-//////////////////// MasterHumongousRegionSet //////////////////// +- +-bool MasterHumongousRegionSet::check_mt_safety() { +- // Master Humongous Set MT safety protocol: +- // (a) If we're at a safepoint, operations on the master humongous +- // set should be invoked by either the VM thread (which will +- // serialize them) or by the GC workers while holding the +- // OldSets_lock. +- // (b) If we're not at a safepoint, operations on the master +- // humongous set should be invoked while holding the Heap_lock. +- +- if (SafepointSynchronize::is_at_safepoint()) { +- guarantee(Thread::current()->is_VM_thread() || +- OldSets_lock->owned_by_self(), +- hrs_ext_msg(this, "master humongous set MT safety protocol " +- "at a safepoint")); +- } else { +- guarantee(Heap_lock->owned_by_self(), +- hrs_ext_msg(this, "master humongous set MT safety protocol " +- "outside a safepoint")); +- } +- +- return HumongousRegionSet::check_mt_safety(); +-} +--- ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSets.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/heapRegionSets.hpp Thu Jan 01 00:00:00 1970 +0000 +@@ -1,111 +0,0 @@ +-/* +- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. +- * +- * This code is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * version 2 for more details (a copy is included in the LICENSE file that +- * accompanied this code). +- * +- * You should have received a copy of the GNU General Public License version +- * 2 along with this work; if not, write to the Free Software Foundation, +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +- * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- * +- */ +- +-#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSETS_HPP +-#define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSETS_HPP +- +-#include "gc_implementation/g1/heapRegionSet.inline.hpp" +- +-//////////////////// FreeRegionList //////////////////// +- +-class FreeRegionList : public HeapRegionLinkedList { +-protected: +- virtual const char* verify_region_extra(HeapRegion* hr); +- +- virtual bool regions_humongous() { return false; } +- virtual bool regions_empty() { return true; } +- +-public: +- FreeRegionList(const char* name) : HeapRegionLinkedList(name) { } +-}; +- +-//////////////////// MasterFreeRegionList //////////////////// +- +-class MasterFreeRegionList : public FreeRegionList { +-protected: +- virtual const char* verify_region_extra(HeapRegion* hr); +- virtual bool check_mt_safety(); +- +-public: +- MasterFreeRegionList(const char* name) : FreeRegionList(name) { } +-}; +- +-//////////////////// SecondaryFreeRegionList //////////////////// +- +-class SecondaryFreeRegionList : public FreeRegionList { +-protected: +- virtual bool check_mt_safety(); +- +-public: +- SecondaryFreeRegionList(const char* name) : FreeRegionList(name) { } +-}; +- +-//////////////////// OldRegionSet //////////////////// +- +-class OldRegionSet : public HeapRegionSet { +-protected: +- virtual const char* verify_region_extra(HeapRegion* hr); +- +- virtual bool regions_humongous() { return false; } +- virtual bool regions_empty() { return false; } +- +-public: +- OldRegionSet(const char* name) : HeapRegionSet(name) { } +-}; +- +-//////////////////// MasterOldRegionSet //////////////////// +- +-class MasterOldRegionSet : public OldRegionSet { +-private: +-protected: +- virtual bool check_mt_safety(); +- +-public: +- MasterOldRegionSet(const char* name) : OldRegionSet(name) { } +-}; +- +-//////////////////// HumongousRegionSet //////////////////// +- +-class HumongousRegionSet : public HeapRegionSet { +-protected: +- virtual const char* verify_region_extra(HeapRegion* hr); +- +- virtual bool regions_humongous() { return true; } +- virtual bool regions_empty() { return false; } +- +-public: +- HumongousRegionSet(const char* name) : HeapRegionSet(name) { } +-}; +- +-//////////////////// MasterHumongousRegionSet //////////////////// +- +-class MasterHumongousRegionSet : public HumongousRegionSet { +-protected: +- virtual bool check_mt_safety(); +- +-public: +- MasterHumongousRegionSet(const char* name) : HumongousRegionSet(name) { } +-}; +- +-#endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSETS_HPP +--- ./hotspot/src/share/vm/gc_implementation/g1/satbQueue.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/satbQueue.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -32,6 +32,8 @@ + #include "runtime/thread.hpp" + #include "runtime/vmThread.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + void ObjPtrQueue::flush() { + // The buffer might contain refs into the CSet. We have to filter it + // first before we flush it, otherwise we might end up with an +@@ -219,58 +221,52 @@ + } + + #ifdef ASSERT +-void SATBMarkQueueSet::dump_active_values(JavaThread* first, +- bool expected_active) { +- gclog_or_tty->print_cr("SATB queue active values for Java Threads"); +- gclog_or_tty->print_cr(" SATB queue set: active is %s", +- (is_active()) ? "TRUE" : "FALSE"); +- gclog_or_tty->print_cr(" expected_active is %s", +- (expected_active) ? "TRUE" : "FALSE"); +- for (JavaThread* t = first; t; t = t->next()) { +- bool active = t->satb_mark_queue().is_active(); +- gclog_or_tty->print_cr(" thread %s, active is %s", +- t->name(), (active) ? "TRUE" : "FALSE"); ++void SATBMarkQueueSet::dump_active_states(bool expected_active) { ++ gclog_or_tty->print_cr("Expected SATB active state: %s", ++ expected_active ? "ACTIVE" : "INACTIVE"); ++ gclog_or_tty->print_cr("Actual SATB active states:"); ++ gclog_or_tty->print_cr(" Queue set: %s", is_active() ? "ACTIVE" : "INACTIVE"); ++ for (JavaThread* t = Threads::first(); t; t = t->next()) { ++ gclog_or_tty->print_cr(" Thread \"%s\" queue: %s", t->name(), ++ t->satb_mark_queue().is_active() ? "ACTIVE" : "INACTIVE"); ++ } ++ gclog_or_tty->print_cr(" Shared queue: %s", ++ shared_satb_queue()->is_active() ? "ACTIVE" : "INACTIVE"); ++} ++ ++void SATBMarkQueueSet::verify_active_states(bool expected_active) { ++ // Verify queue set state ++ if (is_active() != expected_active) { ++ dump_active_states(expected_active); ++ guarantee(false, "SATB queue set has an unexpected active state"); ++ } ++ ++ // Verify thread queue states ++ for (JavaThread* t = Threads::first(); t; t = t->next()) { ++ if (t->satb_mark_queue().is_active() != expected_active) { ++ dump_active_states(expected_active); ++ guarantee(false, "Thread SATB queue has an unexpected active state"); ++ } ++ } ++ ++ // Verify shared queue state ++ if (shared_satb_queue()->is_active() != expected_active) { ++ dump_active_states(expected_active); ++ guarantee(false, "Shared SATB queue has an unexpected active state"); + } + } + #endif // ASSERT + +-void SATBMarkQueueSet::set_active_all_threads(bool b, +- bool expected_active) { ++void SATBMarkQueueSet::set_active_all_threads(bool active, bool expected_active) { + assert(SafepointSynchronize::is_at_safepoint(), "Must be at safepoint."); +- JavaThread* first = Threads::first(); +- + #ifdef ASSERT +- if (_all_active != expected_active) { +- dump_active_values(first, expected_active); +- +- // I leave this here as a guarantee, instead of an assert, so +- // that it will still be compiled in if we choose to uncomment +- // the #ifdef ASSERT in a product build. The whole block is +- // within an #ifdef ASSERT so the guarantee will not be compiled +- // in a product build anyway. +- guarantee(false, +- "SATB queue set has an unexpected active value"); ++ verify_active_states(expected_active); ++#endif // ASSERT ++ _all_active = active; ++ for (JavaThread* t = Threads::first(); t; t = t->next()) { ++ t->satb_mark_queue().set_active(active); + } +-#endif // ASSERT +- _all_active = b; +- +- for (JavaThread* t = first; t; t = t->next()) { +-#ifdef ASSERT +- bool active = t->satb_mark_queue().is_active(); +- if (active != expected_active) { +- dump_active_values(first, expected_active); +- +- // I leave this here as a guarantee, instead of an assert, so +- // that it will still be compiled in if we choose to uncomment +- // the #ifdef ASSERT in a product build. The whole block is +- // within an #ifdef ASSERT so the guarantee will not be compiled +- // in a product build anyway. +- guarantee(false, +- "thread has an unexpected active value in its SATB queue"); +- } +-#endif // ASSERT +- t->satb_mark_queue().set_active(b); +- } ++ shared_satb_queue()->set_active(active); + } + + void SATBMarkQueueSet::filter_thread_buffers() { +@@ -296,7 +292,7 @@ + shared_satb_queue()->apply_closure_and_empty(_closure); + } + +-void SATBMarkQueueSet::par_iterate_closure_all_threads(int worker) { ++void SATBMarkQueueSet::par_iterate_closure_all_threads(uint worker) { + SharedHeap* sh = SharedHeap::heap(); + int parity = sh->strong_roots_parity(); + +@@ -321,7 +317,7 @@ + } + + bool SATBMarkQueueSet::apply_closure_to_completed_buffer_work(bool par, +- int worker) { ++ uint worker) { + BufferNode* nd = NULL; + { + MutexLockerEx x(_cbl_mon, Mutex::_no_safepoint_check_flag); +--- ./hotspot/src/share/vm/gc_implementation/g1/satbQueue.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/satbQueue.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -84,10 +84,11 @@ + // Utility function to support sequential and parallel versions. If + // "par" is true, then "worker" is the par thread id; if "false", worker + // is ignored. +- bool apply_closure_to_completed_buffer_work(bool par, int worker); ++ bool apply_closure_to_completed_buffer_work(bool par, uint worker); + + #ifdef ASSERT +- void dump_active_values(JavaThread* first, bool expected_active); ++ void dump_active_states(bool expected_active); ++ void verify_active_states(bool expected_active); + #endif // ASSERT + + public: +@@ -99,11 +100,11 @@ + + static void handle_zero_index_for_thread(JavaThread* t); + +- // Apply "set_active(b)" to all Java threads' SATB queues. It should be ++ // Apply "set_active(active)" to all SATB queues in the set. It should be + // called only with the world stopped. The method will assert that the + // SATB queues of all threads it visits, as well as the SATB queue + // set itself, has an active value same as expected_active. +- void set_active_all_threads(bool b, bool expected_active); ++ void set_active_all_threads(bool active, bool expected_active); + + // Filter all the currently-active SATB buffers. + void filter_thread_buffers(); +@@ -123,7 +124,7 @@ + // be called serially and at a safepoint. + void iterate_closure_all_threads(); + // Parallel version of the above. +- void par_iterate_closure_all_threads(int worker); ++ void par_iterate_closure_all_threads(uint worker); + + // If there exists some completed buffer, pop it, then apply the + // registered closure to all its elements, and return true. If no +@@ -132,7 +133,7 @@ + return apply_closure_to_completed_buffer_work(false, 0); + } + // Parallel version of the above. +- bool par_apply_closure_to_completed_buffer(int worker) { ++ bool par_apply_closure_to_completed_buffer(uint worker) { + return apply_closure_to_completed_buffer_work(true, worker); + } + +--- ./hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/sparsePRT.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -25,7 +25,7 @@ + #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_SPARSEPRT_HPP + #define SHARE_VM_GC_IMPLEMENTATION_G1_SPARSEPRT_HPP + +-#include "gc_implementation/g1/g1CollectedHeap.inline.hpp" ++#include "gc_implementation/g1/g1CollectedHeap.hpp" + #include "gc_implementation/g1/heapRegion.hpp" + #include "memory/allocation.hpp" + #include "memory/cardTableModRefBS.hpp" +--- ./hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/survRateGroup.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,6 +29,8 @@ + #include "gc_implementation/g1/survRateGroup.hpp" + #include "memory/allocation.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + SurvRateGroup::SurvRateGroup(G1CollectorPolicy* g1p, + const char* name, + size_t summary_surv_rates_len) : +@@ -202,7 +204,7 @@ + if (length == 0) + return; + +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + gclog_or_tty->print_cr("%s Rate Summary (for up to age %d)", _name, length-1); + gclog_or_tty->print_cr(" age range survival rate (avg) samples (avg)"); + gclog_or_tty->print_cr(" ---------------------------------------------------------"); +--- ./hotspot/src/share/vm/gc_implementation/g1/vmStructs_g1.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/g1/vmStructs_g1.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -57,9 +57,10 @@ + nonstatic_field(G1MonitoringSupport, _old_committed, size_t) \ + nonstatic_field(G1MonitoringSupport, _old_used, size_t) \ + \ +- nonstatic_field(HeapRegionSetBase, _length, uint) \ +- nonstatic_field(HeapRegionSetBase, _region_num, uint) \ +- nonstatic_field(HeapRegionSetBase, _total_used_bytes, size_t) \ ++ nonstatic_field(HeapRegionSetBase, _count, HeapRegionSetCount) \ ++ \ ++ nonstatic_field(HeapRegionSetCount, _length, uint) \ ++ nonstatic_field(HeapRegionSetCount, _capacity, size_t) \ + + + #define VM_TYPES_G1(declare_type, declare_toplevel_type) \ +@@ -71,6 +72,7 @@ + declare_type(HeapRegion, ContiguousSpace) \ + declare_toplevel_type(HeapRegionSeq) \ + declare_toplevel_type(HeapRegionSetBase) \ ++ declare_toplevel_type(HeapRegionSetCount) \ + declare_toplevel_type(G1MonitoringSupport) \ + \ + declare_toplevel_type(G1CollectedHeap*) \ +--- ./hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -259,22 +259,22 @@ + requested_eden_size, requested_survivor_size); + gclog_or_tty->print_cr(" eden: [" PTR_FORMAT ".." PTR_FORMAT ") " + SIZE_FORMAT, +- eden()->bottom(), +- eden()->end(), ++ p2i(eden()->bottom()), ++ p2i(eden()->end()), + pointer_delta(eden()->end(), + eden()->bottom(), + sizeof(char))); + gclog_or_tty->print_cr(" from: [" PTR_FORMAT ".." PTR_FORMAT ") " + SIZE_FORMAT, +- from()->bottom(), +- from()->end(), ++ p2i(from()->bottom()), ++ p2i(from()->end()), + pointer_delta(from()->end(), + from()->bottom(), + sizeof(char))); + gclog_or_tty->print_cr(" to: [" PTR_FORMAT ".." PTR_FORMAT ") " + SIZE_FORMAT, +- to()->bottom(), +- to()->end(), ++ p2i(to()->bottom()), ++ p2i(to()->end()), + pointer_delta( to()->end(), + to()->bottom(), + sizeof(char))); +@@ -382,18 +382,18 @@ + if (PrintAdaptiveSizePolicy && Verbose) { + gclog_or_tty->print_cr(" [eden_start .. eden_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- eden_start, +- eden_end, ++ p2i(eden_start), ++ p2i(eden_end), + pointer_delta(eden_end, eden_start, sizeof(char))); + gclog_or_tty->print_cr(" [from_start .. from_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- from_start, +- from_end, ++ p2i(from_start), ++ p2i(from_end), + pointer_delta(from_end, from_start, sizeof(char))); + gclog_or_tty->print_cr(" [ to_start .. to_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- to_start, +- to_end, ++ p2i(to_start), ++ p2i(to_end), + pointer_delta( to_end, to_start, sizeof(char))); + } + } else { +@@ -473,18 +473,18 @@ + if (PrintAdaptiveSizePolicy && Verbose) { + gclog_or_tty->print_cr(" [eden_start .. eden_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- eden_start, +- eden_end, ++ p2i(eden_start), ++ p2i(eden_end), + pointer_delta(eden_end, eden_start, sizeof(char))); + gclog_or_tty->print_cr(" [ to_start .. to_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- to_start, +- to_end, ++ p2i(to_start), ++ p2i(to_end), + pointer_delta( to_end, to_start, sizeof(char))); + gclog_or_tty->print_cr(" [from_start .. from_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- from_start, +- from_end, ++ p2i(from_start), ++ p2i(from_end), + pointer_delta(from_end, from_start, sizeof(char))); + } + } +--- ./hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2007, 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 +@@ -35,6 +35,8 @@ + #include "runtime/virtualspace.hpp" + #include "runtime/vmThread.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + void CardTableModRefBS::non_clean_card_iterate_parallel_work(Space* sp, MemRegion mr, + OopsInGenClosure* cl, + CardTableRS* ct, +--- ./hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -55,6 +55,8 @@ + #include "utilities/globalDefinitions.hpp" + #include "utilities/workgroup.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #ifdef _MSC_VER + #pragma warning( push ) + #pragma warning( disable:4355 ) // 'this' : used in base member initializer list +@@ -1636,8 +1638,7 @@ + refs_discovery_is_mt(), // mt discovery + (int) ParallelGCThreads, // mt discovery degree + refs_discovery_is_atomic(), // atomic_discovery +- NULL, // is_alive_non_header +- false); // write barrier for next field updates ++ NULL); // is_alive_non_header + } + } + +--- ./hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2007, 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 +@@ -79,12 +79,12 @@ + if ((HeapWord*)obj < _boundary) { + #ifndef PRODUCT + if (_g->to()->is_in_reserved(obj)) { +- tty->print_cr("Scanning field (" PTR_FORMAT ") twice?", p); ++ tty->print_cr("Scanning field (" PTR_FORMAT ") twice?", p2i(p)); + GenCollectedHeap* gch = (GenCollectedHeap*)Universe::heap(); + Space* sp = gch->space_containing(p); + oop obj = oop(sp->block_start(p)); + assert((HeapWord*)obj < (HeapWord*)p, "Error"); +- tty->print_cr("Object: " PTR_FORMAT, (void *)obj); ++ tty->print_cr("Object: " PTR_FORMAT, p2i((void *)obj)); + tty->print_cr("-------"); + obj->print(); + tty->print_cr("-----"); +@@ -110,7 +110,7 @@ + if (TraceScavenge) { + gclog_or_tty->print_cr("{%s %s ( " PTR_FORMAT " ) " PTR_FORMAT " -> " PTR_FORMAT " (%d)}", + "forwarded ", +- new_obj->klass()->internal_name(), p, (void *)obj, (void *)new_obj, new_obj->size()); ++ new_obj->klass()->internal_name(), p2i(p), p2i((void *)obj), p2i((void *)new_obj), new_obj->size()); + } + #endif + +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -143,7 +143,7 @@ + + if (TraceAdaptiveGCBoundary) { + gclog_or_tty->print_cr("Before expansion of old gen with boundary move"); +- gclog_or_tty->print_cr(" Requested change: 0x%x Attempted change: 0x%x", ++ gclog_or_tty->print_cr(" Requested change: " SIZE_FORMAT_HEX " Attempted change: " SIZE_FORMAT_HEX, + expand_in_bytes, change_in_bytes); + if (!PrintHeapAtGC) { + Universe::print_on(gclog_or_tty); +@@ -201,7 +201,7 @@ + + if (TraceAdaptiveGCBoundary) { + gclog_or_tty->print_cr("Before expansion of young gen with boundary move"); +- gclog_or_tty->print_cr(" Requested change: 0x%x Attempted change: 0x%x", ++ gclog_or_tty->print_cr(" Requested change: " SIZE_FORMAT_HEX " Attempted change: " SIZE_FORMAT_HEX, + expand_in_bytes, change_in_bytes); + if (!PrintHeapAtGC) { + Universe::print_on(gclog_or_tty); +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSOldGen.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSOldGen.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -127,22 +127,22 @@ + size_t result_aligned = align_size_down(result, gen_alignment); + if (PrintAdaptiveSizePolicy && Verbose) { + gclog_or_tty->print_cr("\nASPSOldGen::available_for_contraction:" +- " %d K / 0x%x", result_aligned/K, result_aligned); +- gclog_or_tty->print_cr(" reserved().byte_size() %d K / 0x%x ", +- reserved().byte_size()/K, reserved().byte_size()); ++ " " SSIZE_FORMAT " K / " SIZE_FORMAT_HEX, (result_aligned/K), result_aligned); ++ gclog_or_tty->print_cr(" reserved().byte_size() " SSIZE_FORMAT " K / " SIZE_FORMAT_HEX " ", ++ (reserved().byte_size()/K), reserved().byte_size()); + size_t working_promoted = (size_t) policy->avg_promoted()->padded_average(); +- gclog_or_tty->print_cr(" padded promoted %d K / 0x%x", +- working_promoted/K, working_promoted); +- gclog_or_tty->print_cr(" used %d K / 0x%x", +- used_in_bytes()/K, used_in_bytes()); +- gclog_or_tty->print_cr(" min_gen_size() %d K / 0x%x", +- min_gen_size()/K, min_gen_size()); +- gclog_or_tty->print_cr(" max_contraction %d K / 0x%x", +- max_contraction/K, max_contraction); +- gclog_or_tty->print_cr(" without alignment %d K / 0x%x", +- policy->promo_increment(max_contraction)/K, ++ gclog_or_tty->print_cr(" padded promoted " SSIZE_FORMAT " K / " SIZE_FORMAT_HEX, ++ (working_promoted/K), working_promoted); ++ gclog_or_tty->print_cr(" used " SSIZE_FORMAT " K / " SIZE_FORMAT_HEX, ++ (used_in_bytes()/K), used_in_bytes()); ++ gclog_or_tty->print_cr(" min_gen_size() " SSIZE_FORMAT " K / " SIZE_FORMAT_HEX, ++ (min_gen_size()/K), min_gen_size()); ++ gclog_or_tty->print_cr(" max_contraction " SSIZE_FORMAT " K / " SIZE_FORMAT_HEX, ++ (max_contraction/K), max_contraction); ++ gclog_or_tty->print_cr(" without alignment " SSIZE_FORMAT " K / " SIZE_FORMAT_HEX, ++ (policy->promo_increment(max_contraction)/K), + policy->promo_increment(max_contraction)); +- gclog_or_tty->print_cr(" alignment 0x%x", gen_alignment); ++ gclog_or_tty->print_cr(" alignment " SIZE_FORMAT_HEX, gen_alignment); + } + assert(result_aligned <= max_contraction, "arithmetic is wrong"); + return result_aligned; +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -112,11 +112,11 @@ + size_t result = policy->eden_increment_aligned_down(max_contraction); + size_t result_aligned = align_size_down(result, gen_alignment); + if (PrintAdaptiveSizePolicy && Verbose) { +- gclog_or_tty->print_cr("ASPSYoungGen::available_for_contraction: %d K", ++ gclog_or_tty->print_cr("ASPSYoungGen::available_for_contraction: " SIZE_FORMAT " K", + result_aligned/K); +- gclog_or_tty->print_cr(" max_contraction %d K", max_contraction/K); +- gclog_or_tty->print_cr(" eden_avail %d K", eden_avail/K); +- gclog_or_tty->print_cr(" gen_avail %d K", gen_avail/K); ++ gclog_or_tty->print_cr(" max_contraction " SIZE_FORMAT " K", max_contraction/K); ++ gclog_or_tty->print_cr(" eden_avail " SIZE_FORMAT " K", eden_avail/K); ++ gclog_or_tty->print_cr(" gen_avail " SIZE_FORMAT " K", gen_avail/K); + } + return result_aligned; + } +@@ -252,22 +252,22 @@ + requested_eden_size, requested_survivor_size); + gclog_or_tty->print_cr(" eden: [" PTR_FORMAT ".." PTR_FORMAT ") " + SIZE_FORMAT, +- eden_space()->bottom(), +- eden_space()->end(), ++ p2i(eden_space()->bottom()), ++ p2i(eden_space()->end()), + pointer_delta(eden_space()->end(), + eden_space()->bottom(), + sizeof(char))); + gclog_or_tty->print_cr(" from: [" PTR_FORMAT ".." PTR_FORMAT ") " + SIZE_FORMAT, +- from_space()->bottom(), +- from_space()->end(), ++ p2i(from_space()->bottom()), ++ p2i(from_space()->end()), + pointer_delta(from_space()->end(), + from_space()->bottom(), + sizeof(char))); + gclog_or_tty->print_cr(" to: [" PTR_FORMAT ".." PTR_FORMAT ") " + SIZE_FORMAT, +- to_space()->bottom(), +- to_space()->end(), ++ p2i(to_space()->bottom()), ++ p2i(to_space()->end()), + pointer_delta( to_space()->end(), + to_space()->bottom(), + sizeof(char))); +@@ -373,18 +373,18 @@ + if (PrintAdaptiveSizePolicy && Verbose) { + gclog_or_tty->print_cr(" [eden_start .. eden_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- eden_start, +- eden_end, ++ p2i(eden_start), ++ p2i(eden_end), + pointer_delta(eden_end, eden_start, sizeof(char))); + gclog_or_tty->print_cr(" [from_start .. from_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- from_start, +- from_end, ++ p2i(from_start), ++ p2i(from_end), + pointer_delta(from_end, from_start, sizeof(char))); + gclog_or_tty->print_cr(" [ to_start .. to_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- to_start, +- to_end, ++ p2i(to_start), ++ p2i(to_end), + pointer_delta( to_end, to_start, sizeof(char))); + } + } else { +@@ -427,18 +427,18 @@ + if (PrintAdaptiveSizePolicy && Verbose) { + gclog_or_tty->print_cr(" [eden_start .. eden_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- eden_start, +- eden_end, ++ p2i(eden_start), ++ p2i(eden_end), + pointer_delta(eden_end, eden_start, sizeof(char))); + gclog_or_tty->print_cr(" [ to_start .. to_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- to_start, +- to_end, ++ p2i(to_start), ++ p2i(to_end), + pointer_delta( to_end, to_start, sizeof(char))); + gclog_or_tty->print_cr(" [from_start .. from_end): " + "[" PTR_FORMAT " .. " PTR_FORMAT ") " SIZE_FORMAT, +- from_start, +- from_end, ++ p2i(from_start), ++ p2i(from_end), + pointer_delta(from_end, from_start, sizeof(char))); + } + } +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -478,23 +478,23 @@ + gclog_or_tty->print_cr(" " + " _covered[%d].start(): " INTPTR_FORMAT + " _covered[%d].last(): " INTPTR_FORMAT, +- ind, _covered[ind].start(), +- ind, _covered[ind].last()); ++ ind, p2i(_covered[ind].start()), ++ ind, p2i(_covered[ind].last())); + gclog_or_tty->print_cr(" " + " _committed[%d].start(): " INTPTR_FORMAT + " _committed[%d].last(): " INTPTR_FORMAT, +- ind, _committed[ind].start(), +- ind, _committed[ind].last()); ++ ind, p2i(_committed[ind].start()), ++ ind, p2i(_committed[ind].last())); + gclog_or_tty->print_cr(" " + " byte_for(start): " INTPTR_FORMAT + " byte_for(last): " INTPTR_FORMAT, +- byte_for(_covered[ind].start()), +- byte_for(_covered[ind].last())); ++ p2i(byte_for(_covered[ind].start())), ++ p2i(byte_for(_covered[ind].last()))); + gclog_or_tty->print_cr(" " + " addr_for(start): " INTPTR_FORMAT + " addr_for(last): " INTPTR_FORMAT, +- addr_for((jbyte*) _committed[ind].start()), +- addr_for((jbyte*) _committed[ind].last())); ++ p2i(addr_for((jbyte*) _committed[ind].start())), ++ p2i(addr_for((jbyte*) _committed[ind].last()))); + } + debug_only(verify_guard();) + } +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2012, 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 +@@ -31,6 +31,8 @@ + #include "runtime/mutex.hpp" + #include "runtime/mutexLocker.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // + // GCTask + // +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,6 +1,6 @@ + + /* +- * Copyright (c) 2002, 2013, 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 +@@ -34,6 +34,8 @@ + #include "runtime/os.hpp" + #include "runtime/thread.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + GCTaskThread::GCTaskThread(GCTaskManager* manager, + uint which, + uint processor_id) : +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -139,11 +139,6 @@ + return true; + } + } +- // No object starts in this slice; verify this using +- // more traditional methods: Note that no object can +- // start before the start_addr. +- assert(end_addr == start_addr || +- object_start(end_addr - 1) <= start_addr, +- "Oops an object does start in this slice?"); ++ + return false; + } +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -38,6 +38,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -155,7 +155,7 @@ + static inline idx_t bits_required(MemRegion covered_region); + + void print_on_error(outputStream* st) const { +- st->print_cr("Marking Bits: (ParMarkBitMap*) " PTR_FORMAT, this); ++ st->print_cr("Marking Bits: (ParMarkBitMap*) " PTR_FORMAT, p2i(this)); + _beg_bits.print_on_error(st, " Begin Bits: "); + _end_bits.print_on_error(st, " End Bits: "); + } +@@ -390,9 +390,9 @@ + inline void ParMarkBitMap::verify_addr(HeapWord* addr) const { + // Allow one past the last valid address; useful for loop bounds. + assert(addr >= region_start(), +- err_msg("addr too small, addr: " PTR_FORMAT " region start: " PTR_FORMAT, addr, region_start())); ++ err_msg("addr too small, addr: " PTR_FORMAT " region start: " PTR_FORMAT, p2i(addr), p2i(region_start()))); + assert(addr <= region_end(), +- err_msg("addr too big, addr: " PTR_FORMAT " region end: " PTR_FORMAT, addr, region_end())); ++ err_msg("addr too big, addr: " PTR_FORMAT " region end: " PTR_FORMAT, p2i(addr), p2i(region_end()))); + } + #endif // #ifdef ASSERT + +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -373,7 +373,7 @@ + if ((result == NULL) && (QueuedAllocationWarningCount > 0) && + (loop_count % QueuedAllocationWarningCount == 0)) { + warning("ParallelScavengeHeap::mem_allocate retries %d times \n\t" +- " size=%d", loop_count, size); ++ " size=" SIZE_FORMAT, loop_count, size); + } + } + +@@ -492,6 +492,10 @@ + return young_gen()->eden_space()->tlab_capacity(thr); + } + ++size_t ParallelScavengeHeap::tlab_used(Thread* thr) const { ++ return young_gen()->eden_space()->tlab_used(thr); ++} ++ + size_t ParallelScavengeHeap::unsafe_max_tlab_alloc(Thread* thr) const { + return young_gen()->eden_space()->unsafe_max_tlab_alloc(thr); + } +@@ -665,8 +669,10 @@ + + void ParallelScavengeHeap::trace_heap(GCWhen::Type when, GCTracer* gc_tracer) { + const PSHeapSummary& heap_summary = create_ps_heap_summary(); ++ gc_tracer->report_gc_heap_summary(when, heap_summary); ++ + const MetaspaceSummary& metaspace_summary = create_metaspace_summary(); +- gc_tracer->report_gc_heap_summary(when, heap_summary, metaspace_summary); ++ gc_tracer->report_metaspace_summary(when, metaspace_summary); + } + + ParallelScavengeHeap* ParallelScavengeHeap::heap() { +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -189,6 +189,7 @@ + bool supports_tlab_allocation() const { return true; } + + size_t tlab_capacity(Thread* thr) const; ++ size_t tlab_used(Thread* thr) const; + size_t unsafe_max_tlab_alloc(Thread* thr) const; + + // Can a compiler initialize a new object without store barriers? +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -52,7 +52,7 @@ + const void* loc = (void*) p; + bool result = ((HeapWord*)p) >= young_gen()->reserved().start(); + assert(result == young_gen()->is_in_reserved(p), +- err_msg("incorrect test - result=%d, p=" PTR_FORMAT, result, (void*)p)); ++ err_msg("incorrect test - result=%d, p=" PTR_FORMAT, result, p2i((void*)p))); + return result; + } + #endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PARALLELSCAVENGEHEAP_INLINE_HPP +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -41,6 +41,8 @@ + #include "runtime/vmThread.hpp" + #include "services/management.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // + // ThreadRootsMarkingTask + // +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -23,6 +23,7 @@ + */ + + #include "precompiled.hpp" ++#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp" + #include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp" + #include "gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp" + #include "gc_implementation/parallelScavenge/psScavenge.hpp" +@@ -34,6 +35,8 @@ + + #include + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + PSAdaptiveSizePolicy::PSAdaptiveSizePolicy(size_t init_eden_size, + size_t init_promo_size, + size_t init_survivor_size, +@@ -76,6 +79,38 @@ + _old_gen_policy_is_ready = false; + } + ++size_t PSAdaptiveSizePolicy::calculate_free_based_on_live(size_t live, uintx ratio_as_percentage) { ++ // We want to calculate how much free memory there can be based on the ++ // amount of live data currently in the old gen. Using the formula: ++ // ratio * (free + live) = free ++ // Some equation solving later we get: ++ // free = (live * ratio) / (1 - ratio) ++ ++ const double ratio = ratio_as_percentage / 100.0; ++ const double ratio_inverse = 1.0 - ratio; ++ const double tmp = live * ratio; ++ size_t free = (size_t)(tmp / ratio_inverse); ++ ++ return free; ++} ++ ++size_t PSAdaptiveSizePolicy::calculated_old_free_size_in_bytes() const { ++ size_t free_size = (size_t)(_promo_size + avg_promoted()->padded_average()); ++ size_t live = ParallelScavengeHeap::heap()->old_gen()->used_in_bytes(); ++ ++ if (MinHeapFreeRatio != 0) { ++ size_t min_free = calculate_free_based_on_live(live, MinHeapFreeRatio); ++ free_size = MAX2(free_size, min_free); ++ } ++ ++ if (MaxHeapFreeRatio != 100) { ++ size_t max_free = calculate_free_based_on_live(live, MaxHeapFreeRatio); ++ free_size = MIN2(max_free, free_size); ++ } ++ ++ return free_size; ++} ++ + void PSAdaptiveSizePolicy::major_collection_begin() { + // Update the interval time + _major_timer.stop(); +@@ -1000,7 +1035,7 @@ + "AdaptiveSizePolicy::adjust_promo_for_footprint " + "adjusting tenured gen for footprint. " + "starting promo size " SIZE_FORMAT +- " reduced promo size " SIZE_FORMAT, ++ " reduced promo size " SIZE_FORMAT + " promo delta " SIZE_FORMAT, + desired_promo_size, reduced_size, change ); + } +@@ -1292,3 +1327,18 @@ + st, + PSScavenge::tenuring_threshold()); + } ++ ++#ifndef PRODUCT ++ ++void TestOldFreeSpaceCalculation_test() { ++ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 20) == 25, "Calculation of free memory failed"); ++ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 50) == 100, "Calculation of free memory failed"); ++ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 60) == 150, "Calculation of free memory failed"); ++ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(100, 75) == 300, "Calculation of free memory failed"); ++ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 20) == 100, "Calculation of free memory failed"); ++ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 50) == 400, "Calculation of free memory failed"); ++ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 60) == 600, "Calculation of free memory failed"); ++ assert(PSAdaptiveSizePolicy::calculate_free_based_on_live(400, 75) == 1200, "Calculation of free memory failed"); ++} ++ ++#endif /* !PRODUCT */ +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -240,7 +240,6 @@ + void major_collection_begin(); + void major_collection_end(size_t amount_live, GCCause::Cause gc_cause); + +- // + void tenured_allocation(size_t size) { + _avg_pretenured->sample(size); + } +@@ -248,9 +247,9 @@ + // Accessors + // NEEDS_CLEANUP should use sizes.hpp + +- size_t calculated_old_free_size_in_bytes() const { +- return (size_t)(_promo_size + avg_promoted()->padded_average()); +- } ++ static size_t calculate_free_based_on_live(size_t live, uintx ratio_as_percentage); ++ ++ size_t calculated_old_free_size_in_bytes() const; + + size_t average_old_live_in_bytes() const { + return (size_t) avg_old_live()->average(); +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -54,6 +54,8 @@ + #include "utilities/events.hpp" + #include "utilities/stack.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + elapsedTimer PSMarkSweep::_accumulated_time; + jlong PSMarkSweep::_time_of_last_gc = 0; + CollectorCounters* PSMarkSweep::_counters = NULL; +@@ -184,7 +186,7 @@ + size_t prev_used = heap->used(); + + // Capture metadata size before collection for sizing. +- size_t metadata_prev_used = MetaspaceAux::allocated_used_bytes(); ++ size_t metadata_prev_used = MetaspaceAux::used_bytes(); + + // For PrintGCDetails + size_t old_gen_prev_used = old_gen->used_in_bytes(); +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -33,6 +33,8 @@ + #include "oops/oop.inline.hpp" + #include "runtime/java.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + inline const char* PSOldGen::select_name() { + return UseParallelOldGC ? "ParOldGen" : "PSOldGen"; + } +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -61,6 +61,8 @@ + + #include + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // All sizes are in HeapWords. + const size_t ParallelCompactData::Log2RegionSize = 16; // 64K words + const size_t ParallelCompactData::RegionSize = (size_t)1 << Log2RegionSize; +@@ -851,8 +853,7 @@ + true, // mt discovery + (int) ParallelGCThreads, // mt discovery degree + true, // atomic_discovery +- &_is_alive_closure, // non-header is alive closure +- false); // write barrier for next field updates ++ &_is_alive_closure); // non-header is alive closure + _counters = new CollectorCounters("PSParallelCompact", 1); + + // Initialize static fields in ParCompactionManager. +@@ -927,7 +928,7 @@ + _heap_used = heap->used(); + _young_gen_used = heap->young_gen()->used_in_bytes(); + _old_gen_used = heap->old_gen()->used_in_bytes(); +- _metadata_used = MetaspaceAux::allocated_used_bytes(); ++ _metadata_used = MetaspaceAux::used_bytes(); + }; + + size_t heap_used() const { return _heap_used; } +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -35,6 +35,8 @@ + #include "oops/oop.inline.hpp" + #include "oops/oop.psgc.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + PaddedEnd* PSPromotionManager::_manager_array = NULL; + OopStarTaskQueueSet* PSPromotionManager::_stack_array_depth = NULL; + PSOldGen* PSPromotionManager::_old_gen = NULL; +@@ -136,7 +138,7 @@ + } + + const uint hlines = sizeof(pm_stats_hdr) / sizeof(pm_stats_hdr[0]); +- for (uint i = 0; i < hlines; ++i) tty->print_cr(pm_stats_hdr[i]); ++ for (uint i = 0; i < hlines; ++i) tty->print_cr("%s", pm_stats_hdr[i]); + for (uint i = 0; i < ParallelGCThreads + 1; ++i) { + manager_array(i)->print_local_stats(i); + } +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -28,6 +28,7 @@ + #include "gc_implementation/parallelScavenge/psOldGen.hpp" + #include "gc_implementation/parallelScavenge/psPromotionManager.hpp" + #include "gc_implementation/parallelScavenge/psScavenge.hpp" ++#include "oops/oop.psgc.inline.hpp" + + inline PSPromotionManager* PSPromotionManager::manager_array(int index) { + assert(_manager_array != NULL, "access of NULL manager_array"); +@@ -225,7 +226,7 @@ + if (TraceScavenge) { + gclog_or_tty->print_cr("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}", + PSScavenge::should_scavenge(&new_obj) ? "copying" : "tenuring", +- new_obj->klass()->internal_name(), (void *)o, (void *)new_obj, new_obj->size()); ++ new_obj->klass()->internal_name(), p2i((void *)o), p2i((void *)new_obj), new_obj->size()); + } + #endif + +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -56,6 +56,7 @@ + #include "services/memoryService.hpp" + #include "utilities/stack.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + HeapWord* PSScavenge::_to_space_top_before_gc = NULL; + int PSScavenge::_consecutive_skipped_scavenges = 0; +@@ -466,10 +467,12 @@ + } + } + +- GCTraceTime tm("StringTable", false, false, &_gc_timer); +- // Unlink any dead interned Strings and process the remaining live ones. +- PSScavengeRootsClosure root_closure(promotion_manager); +- StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure); ++ { ++ GCTraceTime tm("StringTable", false, false, &_gc_timer); ++ // Unlink any dead interned Strings and process the remaining live ones. ++ PSScavengeRootsClosure root_closure(promotion_manager); ++ StringTable::unlink_or_oops_do(&_is_alive_closure, &root_closure); ++ } + + // Finally, flush the promotion_manager's labs, and deallocate its stacks. + promotion_failure_occurred = PSPromotionManager::post_scavenge(_gc_tracer); +@@ -527,8 +530,19 @@ + counters->update_survivor_overflowed(_survivor_overflow); + } + ++ size_t max_young_size = young_gen->max_size(); ++ ++ // Deciding a free ratio in the young generation is tricky, so if ++ // MinHeapFreeRatio or MaxHeapFreeRatio are in use (implicating ++ // that the old generation size may have been limited because of them) we ++ // should then limit our young generation size using NewRatio to have it ++ // follow the old generation size. ++ if (MinHeapFreeRatio != 0 || MaxHeapFreeRatio != 100) { ++ max_young_size = MIN2(old_gen->capacity_in_bytes() / NewRatio, young_gen->max_size()); ++ } ++ + size_t survivor_limit = +- size_policy->max_survivor_size(young_gen->max_size()); ++ size_policy->max_survivor_size(max_young_size); + _tenuring_threshold = + size_policy->compute_survivor_space_size_and_threshold( + _survivor_overflow, +@@ -551,8 +565,7 @@ + // Do call at minor collections? + // Don't check if the size_policy is ready at this + // level. Let the size_policy check that internally. +- if (UseAdaptiveSizePolicy && +- UseAdaptiveGenerationSizePolicyAtMinorCollection && ++ if (UseAdaptiveGenerationSizePolicyAtMinorCollection && + ((gc_cause != GCCause::_java_lang_system_gc) || + UseAdaptiveSizePolicyWithSystemGC)) { + +@@ -566,7 +579,7 @@ + size_t eden_live = young_gen->eden_space()->used_in_bytes(); + size_t cur_eden = young_gen->eden_space()->capacity_in_bytes(); + size_t max_old_gen_size = old_gen->max_gen_size(); +- size_t max_eden_size = young_gen->max_size() - ++ size_t max_eden_size = max_young_size - + young_gen->from_space()->capacity_in_bytes() - + young_gen->to_space()->capacity_in_bytes(); + +@@ -848,8 +861,7 @@ + true, // mt discovery + (int) ParallelGCThreads, // mt discovery degree + true, // atomic_discovery +- NULL, // header provides liveness info +- false); // next field updates do not need write barrier ++ NULL); // header provides liveness info + + // Cache the cardtable + BarrierSet* bs = Universe::heap()->barrier_set(); +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -81,7 +81,7 @@ + if (TraceScavenge && o->is_forwarded()) { + gclog_or_tty->print_cr("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}", + "forwarding", +- new_obj->klass()->internal_name(), (void *)o, (void *)new_obj, new_obj->size()); ++ new_obj->klass()->internal_name(), p2i((void *)o), p2i((void *)new_obj), new_obj->size()); + } + #endif + +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -35,10 +35,15 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // PSVirtualSpace + + PSVirtualSpace::PSVirtualSpace(ReservedSpace rs, size_t alignment) : +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -33,6 +33,8 @@ + #include "oops/oop.inline.hpp" + #include "runtime/java.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + PSYoungGen::PSYoungGen(size_t initial_size, + size_t min_size, + size_t max_size) : +--- ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -127,7 +127,7 @@ + void adjust_pointers(); + void compact(); + +- // Called during/after gc ++ // Called during/after GC + void swap_spaces(); + + // Resize generation using suggested free space size and survivor size +@@ -146,14 +146,14 @@ + size_t free_in_words() const; + + // The max this generation can grow to +- size_t max_size() const { return _reserved.byte_size(); } ++ size_t max_size() const { return _reserved.byte_size(); } + + // The max this generation can grow to if the boundary between + // the generations are allowed to move. + size_t gen_size_limit() const { return _max_gen_size; } + + bool is_maximal_no_gc() const { +- return true; // never expands except at a GC ++ return true; // Never expands except at a GC + } + + // Allocation +--- ./hotspot/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/adaptiveSizePolicy.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2004, 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 +@@ -171,8 +171,8 @@ + "active_workers(): %d new_acitve_workers: %d " + "prev_active_workers: %d\n" + " active_workers_by_JT: %d active_workers_by_heap_size: %d", +- active_workers, new_active_workers, prev_active_workers, +- active_workers_by_JT, active_workers_by_heap_size); ++ (int) active_workers, (int) new_active_workers, (int) prev_active_workers, ++ (int) active_workers_by_JT, (int) active_workers_by_heap_size); + } + assert(new_active_workers > 0, "Always need at least 1"); + return new_active_workers; +@@ -545,13 +545,13 @@ + if (UseGCOverheadLimit && PrintGCDetails && Verbose) { + if (gc_overhead_limit_exceeded()) { + gclog_or_tty->print_cr(" GC is exceeding overhead limit " +- "of %d%%", GCTimeLimit); ++ "of %d%%", (int) GCTimeLimit); + reset_gc_overhead_limit_count(); + } else if (print_gc_overhead_limit_would_be_exceeded) { + assert(gc_overhead_limit_count() > 0, "Should not be printing"); + gclog_or_tty->print_cr(" GC would exceed overhead limit " + "of %d%% %d consecutive time(s)", +- GCTimeLimit, gc_overhead_limit_count()); ++ (int) GCTimeLimit, gc_overhead_limit_count()); + } + } + } +--- ./hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/ageTable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -97,7 +97,7 @@ + if (PrintTenuringDistribution) { + gclog_or_tty->cr(); + gclog_or_tty->print_cr("Desired survivor size " SIZE_FORMAT " bytes, new threshold %u (max %u)", +- desired_survivor_size*oopSize, result, MaxTenuringThreshold); ++ desired_survivor_size*oopSize, result, (int) MaxTenuringThreshold); + } + + total = 0; +@@ -106,8 +106,8 @@ + total += sizes[age]; + if (sizes[age] > 0) { + if (PrintTenuringDistribution) { +- gclog_or_tty->print_cr("- age %3u: %10ld bytes, %10ld total", +- age, sizes[age]*oopSize, total*oopSize); ++ gclog_or_tty->print_cr("- age %3u: " SIZE_FORMAT_W(10) " bytes, " SIZE_FORMAT_W(10) " total", ++ age, sizes[age]*oopSize, total*oopSize); + } + } + if (UsePerfData) { +--- ./hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -107,7 +107,7 @@ + assert(demand >= 0, + err_msg("Demand (" SSIZE_FORMAT ") should be non-negative for " + PTR_FORMAT " (size=" SIZE_FORMAT ")", +- demand, this, count)); ++ demand, p2i(this), count)); + // Defensive: adjust for imprecision in event counting + if (demand < 0) { + demand = 0; +@@ -120,8 +120,9 @@ + float delta_ise = (CMSExtrapolateSweep ? intra_sweep_estimate : 0.0); + _desired = (ssize_t)(new_rate * (inter_sweep_estimate + delta_ise)); + if (PrintFLSStatistics > 1) { +- gclog_or_tty->print_cr("demand: %d, old_rate: %f, current_rate: %f, new_rate: %f, old_desired: %d, new_desired: %d", +- demand, old_rate, rate, new_rate, old_desired, _desired); ++ gclog_or_tty->print_cr( ++ "demand: " SSIZE_FORMAT ", old_rate: %f, current_rate: %f, new_rate: %f, old_desired: " SSIZE_FORMAT ", new_desired: " SSIZE_FORMAT, ++ demand, old_rate, rate, new_rate, old_desired, _desired); + } + } + } +--- ./hotspot/src/share/vm/gc_implementation/shared/gcHeapSummary.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/gcHeapSummary.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -26,6 +26,7 @@ + #define SHARE_VM_GC_IMPLEMENTATION_SHARED_GCHEAPSUMMARY_HPP + + #include "memory/allocation.hpp" ++#include "memory/metaspaceChunkFreeListSummary.hpp" + + class VirtualSpaceSummary : public StackObj { + HeapWord* _start; +@@ -61,16 +62,16 @@ + }; + + class MetaspaceSizes : public StackObj { +- size_t _capacity; ++ size_t _committed; + size_t _used; + size_t _reserved; + + public: +- MetaspaceSizes() : _capacity(0), _used(0), _reserved(0) {} +- MetaspaceSizes(size_t capacity, size_t used, size_t reserved) : +- _capacity(capacity), _used(used), _reserved(reserved) {} ++ MetaspaceSizes() : _committed(0), _used(0), _reserved(0) {} ++ MetaspaceSizes(size_t committed, size_t used, size_t reserved) : ++ _committed(committed), _used(used), _reserved(reserved) {} + +- size_t capacity() const { return _capacity; } ++ size_t committed() const { return _committed; } + size_t used() const { return _used; } + size_t reserved() const { return _reserved; } + }; +@@ -125,18 +126,49 @@ + }; + + class MetaspaceSummary : public StackObj { ++ size_t _capacity_until_GC; + MetaspaceSizes _meta_space; + MetaspaceSizes _data_space; + MetaspaceSizes _class_space; ++ MetaspaceChunkFreeListSummary _metaspace_chunk_free_list_summary; ++ MetaspaceChunkFreeListSummary _class_chunk_free_list_summary; + + public: +- MetaspaceSummary() : _meta_space(), _data_space(), _class_space() {} +- MetaspaceSummary(const MetaspaceSizes& meta_space, const MetaspaceSizes& data_space, const MetaspaceSizes& class_space) : +- _meta_space(meta_space), _data_space(data_space), _class_space(class_space) { } ++ MetaspaceSummary() : ++ _capacity_until_GC(0), ++ _meta_space(), ++ _data_space(), ++ _class_space(), ++ _metaspace_chunk_free_list_summary(), ++ _class_chunk_free_list_summary() ++ {} ++ MetaspaceSummary(size_t capacity_until_GC, ++ const MetaspaceSizes& meta_space, ++ const MetaspaceSizes& data_space, ++ const MetaspaceSizes& class_space, ++ const MetaspaceChunkFreeListSummary& metaspace_chunk_free_list_summary, ++ const MetaspaceChunkFreeListSummary& class_chunk_free_list_summary) : ++ _capacity_until_GC(capacity_until_GC), ++ _meta_space(meta_space), ++ _data_space(data_space), ++ _class_space(class_space), ++ _metaspace_chunk_free_list_summary(metaspace_chunk_free_list_summary), ++ _class_chunk_free_list_summary(class_chunk_free_list_summary) ++ {} + ++ size_t capacity_until_GC() const { return _capacity_until_GC; } + const MetaspaceSizes& meta_space() const { return _meta_space; } + const MetaspaceSizes& data_space() const { return _data_space; } + const MetaspaceSizes& class_space() const { return _class_space; } ++ ++ const MetaspaceChunkFreeListSummary& metaspace_chunk_free_list_summary() const { ++ return _metaspace_chunk_free_list_summary; ++ } ++ ++ const MetaspaceChunkFreeListSummary& class_chunk_free_list_summary() const { ++ return _class_chunk_free_list_summary; ++ } ++ + }; + + #endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_GCHEAPSUMMARY_HPP +--- ./hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -139,11 +139,21 @@ + } + #endif // INCLUDE_SERVICES + +-void GCTracer::report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary, const MetaspaceSummary& meta_space_summary) const { ++void GCTracer::report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary) const { + assert_set_gc_id(); + + send_gc_heap_summary_event(when, heap_summary); +- send_meta_space_summary_event(when, meta_space_summary); ++} ++ ++void GCTracer::report_metaspace_summary(GCWhen::Type when, const MetaspaceSummary& summary) const { ++ assert_set_gc_id(); ++ ++ send_meta_space_summary_event(when, summary); ++ ++ send_metaspace_chunk_free_list_summary(when, Metaspace::NonClassType, summary.metaspace_chunk_free_list_summary()); ++ if (UseCompressedClassPointers) { ++ send_metaspace_chunk_free_list_summary(when, Metaspace::ClassType, summary.class_chunk_free_list_summary()); ++ } + } + + void YoungGCTracer::report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions) { +--- ./hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -30,6 +30,7 @@ + #include "gc_implementation/shared/gcWhen.hpp" + #include "gc_implementation/shared/copyFailedInfo.hpp" + #include "memory/allocation.hpp" ++#include "memory/metaspace.hpp" + #include "memory/referenceType.hpp" + #if INCLUDE_ALL_GCS + #include "gc_implementation/g1/g1YCTypes.hpp" +@@ -41,6 +42,7 @@ + + class EvacuationInfo; + class GCHeapSummary; ++class MetaspaceChunkFreeListSummary; + class MetaspaceSummary; + class PSHeapSummary; + class ReferenceProcessorStats; +@@ -124,7 +126,8 @@ + public: + void report_gc_start(GCCause::Cause cause, const Ticks& timestamp); + void report_gc_end(const Ticks& timestamp, TimePartitions* time_partitions); +- void report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary, const MetaspaceSummary& meta_space_summary) const; ++ void report_gc_heap_summary(GCWhen::Type when, const GCHeapSummary& heap_summary) const; ++ void report_metaspace_summary(GCWhen::Type when, const MetaspaceSummary& metaspace_summary) const; + void report_gc_reference_stats(const ReferenceProcessorStats& rp) const; + void report_object_count_after_gc(BoolObjectClosure* object_filter) NOT_SERVICES_RETURN; + bool has_reported_gc_start() const; +@@ -138,6 +141,7 @@ + void send_garbage_collection_event() const; + void send_gc_heap_summary_event(GCWhen::Type when, const GCHeapSummary& heap_summary) const; + void send_meta_space_summary_event(GCWhen::Type when, const MetaspaceSummary& meta_space_summary) const; ++ void send_metaspace_chunk_free_list_summary(GCWhen::Type when, Metaspace::MetadataType mdtype, const MetaspaceChunkFreeListSummary& summary) const; + void send_reference_stats_event(ReferenceType type, size_t count) const; + void send_phase_events(TimePartitions* time_partitions) const; + }; +--- ./hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -64,6 +64,30 @@ + } + } + ++void GCTracer::send_metaspace_chunk_free_list_summary(GCWhen::Type when, Metaspace::MetadataType mdtype, ++ const MetaspaceChunkFreeListSummary& summary) const { ++ EventMetaspaceChunkFreeListSummary e; ++ if (e.should_commit()) { ++ e.set_gcId(_shared_gc_info.id()); ++ e.set_when(when); ++ e.set_metadataType(mdtype); ++ ++ e.set_specializedChunks(summary.num_specialized_chunks()); ++ e.set_specializedChunksTotalSize(summary.specialized_chunks_size_in_bytes()); ++ ++ e.set_smallChunks(summary.num_small_chunks()); ++ e.set_smallChunksTotalSize(summary.small_chunks_size_in_bytes()); ++ ++ e.set_mediumChunks(summary.num_medium_chunks()); ++ e.set_mediumChunksTotalSize(summary.medium_chunks_size_in_bytes()); ++ ++ e.set_humongousChunks(summary.num_humongous_chunks()); ++ e.set_humongousChunksTotalSize(summary.humongous_chunks_size_in_bytes()); ++ ++ e.commit(); ++ } ++} ++ + void ParallelOldTracer::send_parallel_old_event() const { + EventGCParallelOld e(UNTIMED); + if (e.should_commit()) { +@@ -234,7 +258,7 @@ + static TraceStructMetaspaceSizes to_trace_struct(const MetaspaceSizes& sizes) { + TraceStructMetaspaceSizes meta_sizes; + +- meta_sizes.set_capacity(sizes.capacity()); ++ meta_sizes.set_committed(sizes.committed()); + meta_sizes.set_used(sizes.used()); + meta_sizes.set_reserved(sizes.reserved()); + +@@ -246,6 +270,7 @@ + if (e.should_commit()) { + e.set_gcId(_shared_gc_info.id()); + e.set_when((u1) when); ++ e.set_gcThreshold(meta_space_summary.capacity_until_GC()); + e.set_metaspace(to_trace_struct(meta_space_summary.meta_space())); + e.set_dataSpace(to_trace_struct(meta_space_summary.data_space())); + e.set_classSpace(to_trace_struct(meta_space_summary.class_space())); +--- ./hotspot/src/share/vm/gc_implementation/shared/immutableSpace.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/immutableSpace.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -66,7 +66,7 @@ + + void ImmutableSpace::print() const { + print_short(); +- tty->print_cr(" [%#-6lx,%#-6lx)", bottom(), end()); ++ tty->print_cr(" [" INTPTR_FORMAT_W(#-6) "," INTPTR_FORMAT_W(#-6) ")", p2i(bottom()), p2i(end())); + } + + #endif +--- ./hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/markSweep.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -32,6 +32,8 @@ + #include "oops/objArrayKlass.inline.hpp" + #include "oops/oop.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + uint MarkSweep::_total_invocations = 0; + + Stack MarkSweep::_marking_stack; +--- ./hotspot/src/share/vm/gc_implementation/shared/markSweep.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/markSweep.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,10 +30,18 @@ + #include "utilities/stack.inline.hpp" + #include "utilities/macros.hpp" + #if INCLUDE_ALL_GCS ++#include "gc_implementation/g1/g1StringDedup.hpp" + #include "gc_implementation/parallelScavenge/psParallelCompact.hpp" + #endif // INCLUDE_ALL_GCS + + inline void MarkSweep::mark_object(oop obj) { ++#if INCLUDE_ALL_GCS ++ if (G1StringDedup::is_enabled()) { ++ // We must enqueue the object before it is marked ++ // as we otherwise can't read the object's age. ++ G1StringDedup::enqueue_from_mark(obj); ++ } ++#endif + // some marks may contain information we need to preserve so we store them away + // and overwrite the mark. We'll restore it at the end of markSweep. + markOop mark = obj->mark(); +--- ./hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,6 +1,6 @@ + + /* +- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,6 +30,8 @@ + #include "oops/oop.inline.hpp" + #include "runtime/thread.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment) { + _lgrp_spaces = new (ResourceObj::C_HEAP, mtGC) GrowableArray(0, true); + _page_size = os::vm_page_size(); +@@ -173,6 +175,26 @@ + return lgrp_spaces()->at(i)->space()->capacity_in_bytes(); + } + ++size_t MutableNUMASpace::tlab_used(Thread *thr) const { ++ // Please see the comments for tlab_capacity(). ++ guarantee(thr != NULL, "No thread"); ++ int lgrp_id = thr->lgrp_id(); ++ if (lgrp_id == -1) { ++ if (lgrp_spaces()->length() > 0) { ++ return (used_in_bytes()) / lgrp_spaces()->length(); ++ } else { ++ assert(false, "There should be at least one locality group"); ++ return 0; ++ } ++ } ++ int i = lgrp_spaces()->find(&lgrp_id, LGRPSpace::equals); ++ if (i == -1) { ++ return 0; ++ } ++ return lgrp_spaces()->at(i)->space()->used_in_bytes(); ++} ++ ++ + size_t MutableNUMASpace::unsafe_max_tlab_alloc(Thread *thr) const { + // Please see the comments for tlab_capacity(). + guarantee(thr != NULL, "No thread"); +--- ./hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -217,6 +217,7 @@ + using MutableSpace::capacity_in_words; + virtual size_t capacity_in_words(Thread* thr) const; + virtual size_t tlab_capacity(Thread* thr) const; ++ virtual size_t tlab_used(Thread* thr) const; + virtual size_t unsafe_max_tlab_alloc(Thread* thr) const; + + // Allocation (return NULL if full) +--- ./hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/mutableSpace.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -32,6 +32,8 @@ + #include "runtime/thread.hpp" + #endif // INCLUDE_ALL_GCS + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + MutableSpace::MutableSpace(size_t alignment): ImmutableSpace(), _top(NULL), _alignment(alignment) { + assert(MutableSpace::alignment() >= 0 && + MutableSpace::alignment() % os::vm_page_size() == 0, +--- ./hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/mutableSpace.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -124,6 +124,7 @@ + virtual size_t used_in_words() const { return pointer_delta(top(), bottom()); } + virtual size_t free_in_words() const { return pointer_delta(end(), top()); } + virtual size_t tlab_capacity(Thread* thr) const { return capacity_in_bytes(); } ++ virtual size_t tlab_used(Thread* thr) const { return used_in_bytes(); } + virtual size_t unsafe_max_tlab_alloc(Thread* thr) const { return free_in_bytes(); } + + // Allocation (return NULL if full) +--- ./hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -28,6 +28,8 @@ + #include "oops/arrayOop.hpp" + #include "oops/oop.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + ParGCAllocBuffer::ParGCAllocBuffer(size_t desired_plab_sz_) : + _word_sz(desired_plab_sz_), _bottom(NULL), _top(NULL), + _end(NULL), _hard_end(NULL), +@@ -89,6 +91,10 @@ + // scavenge; it clears the sensor accumulators. + void PLABStats::adjust_desired_plab_sz(uint no_of_gc_workers) { + assert(ResizePLAB, "Not set"); ++ ++ assert(is_object_aligned(max_size()) && min_size() <= max_size(), ++ "PLAB clipping computation may be incorrect"); ++ + if (_allocated == 0) { + assert(_unused == 0, + err_msg("Inconsistency in PLAB stats: " +--- ./hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -158,7 +158,7 @@ + // Fills in the unallocated portion of the buffer with a garbage object. + // If "end_of_gc" is TRUE, is after the last use in the GC. IF "retain" + // is true, attempt to re-use the unused portion in the next GC. +- virtual void retire(bool end_of_gc, bool retain); ++ void retire(bool end_of_gc, bool retain); + + void print() PRODUCT_RETURN; + }; +@@ -181,16 +181,7 @@ + _used(0), + _desired_plab_sz(desired_plab_sz_), + _filter(wt) +- { +- size_t min_sz = min_size(); +- size_t max_sz = max_size(); +- size_t aligned_min_sz = align_object_size(min_sz); +- size_t aligned_max_sz = align_object_size(max_sz); +- assert(min_sz <= aligned_min_sz && max_sz >= aligned_max_sz && +- min_sz <= max_sz, +- "PLAB clipping computation in adjust_desired_plab_sz()" +- " may be incorrect"); +- } ++ { } + + static const size_t min_size() { + return ParGCAllocBuffer::min_size(); +--- ./hotspot/src/share/vm/gc_implementation/shared/spaceDecorator.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/spaceDecorator.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2010, 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 +@@ -27,6 +27,8 @@ + #include "memory/space.inline.hpp" + #include "utilities/copy.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // Catch-all file for utility classes + + #ifndef PRODUCT +--- ./hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -103,6 +103,15 @@ + assert(((_gc_cause != GCCause::_no_gc) && + (_gc_cause != GCCause::_no_cause_specified)), "Illegal GCCause"); + ++ // To be able to handle a GC the VM initialization needs to be completed. ++ if (!is_init_completed()) { ++ vm_exit_during_initialization( ++ err_msg("GC triggered before VM initialization completed. Try increasing " ++ "NewSize, current value " UINTX_FORMAT "%s.", ++ byte_size_in_proper_unit(NewSize), ++ proper_unit_for_byte_size(NewSize))); ++ } ++ + acquire_pending_list_lock(); + // If the GC count has changed someone beat us to the collection + // Get the Heap_lock after the pending_list_lock. +--- ./hotspot/src/share/vm/gc_interface/collectedHeap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_interface/collectedHeap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -85,19 +85,25 @@ + + MetaspaceSummary CollectedHeap::create_metaspace_summary() { + const MetaspaceSizes meta_space( +- MetaspaceAux::allocated_capacity_bytes(), +- MetaspaceAux::allocated_used_bytes(), ++ MetaspaceAux::committed_bytes(), ++ MetaspaceAux::used_bytes(), + MetaspaceAux::reserved_bytes()); + const MetaspaceSizes data_space( +- MetaspaceAux::allocated_capacity_bytes(Metaspace::NonClassType), +- MetaspaceAux::allocated_used_bytes(Metaspace::NonClassType), ++ MetaspaceAux::committed_bytes(Metaspace::NonClassType), ++ MetaspaceAux::used_bytes(Metaspace::NonClassType), + MetaspaceAux::reserved_bytes(Metaspace::NonClassType)); + const MetaspaceSizes class_space( +- MetaspaceAux::allocated_capacity_bytes(Metaspace::ClassType), +- MetaspaceAux::allocated_used_bytes(Metaspace::ClassType), ++ MetaspaceAux::committed_bytes(Metaspace::ClassType), ++ MetaspaceAux::used_bytes(Metaspace::ClassType), + MetaspaceAux::reserved_bytes(Metaspace::ClassType)); + +- return MetaspaceSummary(meta_space, data_space, class_space); ++ const MetaspaceChunkFreeListSummary& ms_chunk_free_list_summary = ++ MetaspaceAux::chunk_free_list_summary(Metaspace::NonClassType); ++ const MetaspaceChunkFreeListSummary& class_chunk_free_list_summary = ++ MetaspaceAux::chunk_free_list_summary(Metaspace::ClassType); ++ ++ return MetaspaceSummary(MetaspaceGC::capacity_until_GC(), meta_space, data_space, class_space, ++ ms_chunk_free_list_summary, class_chunk_free_list_summary); + } + + void CollectedHeap::print_heap_before_gc() { +@@ -128,8 +134,10 @@ + + void CollectedHeap::trace_heap(GCWhen::Type when, GCTracer* gc_tracer) { + const GCHeapSummary& heap_summary = create_heap_summary(); ++ gc_tracer->report_gc_heap_summary(when, heap_summary); ++ + const MetaspaceSummary& metaspace_summary = create_metaspace_summary(); +- gc_tracer->report_gc_heap_summary(when, heap_summary, metaspace_summary); ++ gc_tracer->report_metaspace_summary(when, metaspace_summary); + } + + void CollectedHeap::trace_heap_before_gc(GCTracer* gc_tracer) { +@@ -320,6 +328,21 @@ + assert(thread->deferred_card_mark().is_empty(), "invariant"); + } + ++size_t CollectedHeap::max_tlab_size() const { ++ // TLABs can't be bigger than we can fill with a int[Integer.MAX_VALUE]. ++ // This restriction could be removed by enabling filling with multiple arrays. ++ // If we compute that the reasonable way as ++ // header_size + ((sizeof(jint) * max_jint) / HeapWordSize) ++ // we'll overflow on the multiply, so we do the divide first. ++ // We actually lose a little by dividing first, ++ // but that just makes the TLAB somewhat smaller than the biggest array, ++ // which is fine, since we'll be able to fill that. ++ size_t max_int_size = typeArrayOopDesc::header_size(T_INT) + ++ sizeof(jint) * ++ ((juint) max_jint / (size_t) HeapWordSize); ++ return align_size_down(max_int_size, MinObjAlignment); ++} ++ + // Helper for ReduceInitialCardMarks. For performance, + // compiled code may elide card-marks for initializing stores + // to a newly allocated object along the fast-path. We +@@ -559,36 +582,6 @@ + } + } + +-oop CollectedHeap::Class_obj_allocate(KlassHandle klass, int size, KlassHandle real_klass, TRAPS) { +- debug_only(check_for_valid_allocation_state()); +- assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); +- assert(size >= 0, "int won't convert to size_t"); +- HeapWord* obj; +- assert(ScavengeRootsInCode > 0, "must be"); +- obj = common_mem_allocate_init(real_klass, size, CHECK_NULL); +- post_allocation_setup_common(klass, obj); +- assert(Universe::is_bootstrapping() || +- !((oop)obj)->is_array(), "must not be an array"); +- NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); +- oop mirror = (oop)obj; +- +- java_lang_Class::set_oop_size(mirror, size); +- +- // Setup indirections +- if (!real_klass.is_null()) { +- java_lang_Class::set_klass(mirror, real_klass()); +- real_klass->set_java_mirror(mirror); +- } +- +- InstanceMirrorKlass* mk = InstanceMirrorKlass::cast(mirror->klass()); +- assert(size == mk->instance_size(real_klass), "should have been set"); +- +- // notify jvmti and dtrace +- post_allocation_notify(klass, (oop)obj); +- +- return mirror; +-} +- + /////////////// Unit tests /////////////// + + #ifndef PRODUCT +@@ -606,12 +599,12 @@ + assert(heap_start >= ((uintptr_t)NULL + epsilon), "sanity"); + void* before_heap = (void*)(heap_start - epsilon); + assert(!heap->is_in(before_heap), +- err_msg("before_heap: " PTR_FORMAT " is unexpectedly in the heap", before_heap)); ++ err_msg("before_heap: " PTR_FORMAT " is unexpectedly in the heap", p2i(before_heap))); + + // Test that a pointer to after the heap end is reported as outside the heap. + assert(heap_end <= ((uintptr_t)-1 - epsilon), "sanity"); + void* after_heap = (void*)(heap_end + epsilon); + assert(!heap->is_in(after_heap), +- err_msg("after_heap: " PTR_FORMAT " is unexpectedly in the heap", after_heap)); ++ err_msg("after_heap: " PTR_FORMAT " is unexpectedly in the heap", p2i(after_heap))); + } + #endif +--- ./hotspot/src/share/vm/gc_interface/collectedHeap.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_interface/collectedHeap.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -151,7 +151,7 @@ + inline static void post_allocation_setup_no_klass_install(KlassHandle klass, + HeapWord* objPtr); + +- inline static void post_allocation_setup_obj(KlassHandle klass, HeapWord* obj); ++ inline static void post_allocation_setup_obj(KlassHandle klass, HeapWord* obj, int size); + + inline static void post_allocation_setup_array(KlassHandle klass, + HeapWord* obj, int length); +@@ -208,6 +208,9 @@ + // This is the correct place to place such initialization methods. + virtual void post_initialize() = 0; + ++ // Stop any onging concurrent work and prepare for exit. ++ virtual void stop() {} ++ + MemRegion reserved_region() const { return _reserved; } + address base() const { return (address)reserved_region().start(); } + +@@ -312,9 +315,6 @@ + // May be overridden to set additional parallelism. + virtual void set_par_threads(uint t) { _n_par_threads = t; }; + +- // Allocate and initialize instances of Class +- static oop Class_obj_allocate(KlassHandle klass, int size, KlassHandle real_klass, TRAPS); +- + // General obj/array allocation facilities. + inline static oop obj_allocate(KlassHandle klass, int size, TRAPS); + inline static oop array_allocate(KlassHandle klass, int size, int length, TRAPS); +@@ -403,14 +403,16 @@ + // the following methods: + // Returns "true" iff the heap supports thread-local allocation buffers. + // The default is "no". +- virtual bool supports_tlab_allocation() const { +- return false; +- } ++ virtual bool supports_tlab_allocation() const = 0; ++ + // The amount of space available for thread-local allocation buffers. +- virtual size_t tlab_capacity(Thread *thr) const { +- guarantee(false, "thread-local allocation buffers not supported"); +- return 0; +- } ++ virtual size_t tlab_capacity(Thread *thr) const = 0; ++ ++ // The amount of used space for thread-local allocation buffers for the given thread. ++ virtual size_t tlab_used(Thread *thr) const = 0; ++ ++ virtual size_t max_tlab_size() const; ++ + // An estimate of the maximum allocation that could be performed + // for thread-local allocation buffers without triggering any + // collection or expansion activity. +--- ./hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/gc_interface/collectedHeap.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -70,7 +70,7 @@ + } + + // Support for jvmti and dtrace +-inline void post_allocation_notify(KlassHandle klass, oop obj) { ++inline void post_allocation_notify(KlassHandle klass, oop obj, int size) { + // support low memory notifications (no-op if not enabled) + LowMemoryDetector::detect_low_memory_for_collected_pools(); + +@@ -80,18 +80,19 @@ + if (DTraceAllocProbes) { + // support for Dtrace object alloc event (no-op most of the time) + if (klass() != NULL && klass()->name() != NULL) { +- SharedRuntime::dtrace_object_alloc(obj); ++ SharedRuntime::dtrace_object_alloc(obj, size); + } + } + } + + void CollectedHeap::post_allocation_setup_obj(KlassHandle klass, +- HeapWord* obj) { ++ HeapWord* obj, ++ int size) { + post_allocation_setup_common(klass, obj); + assert(Universe::is_bootstrapping() || + !((oop)obj)->is_array(), "must not be an array"); + // notify jvmti and dtrace +- post_allocation_notify(klass, (oop)obj); ++ post_allocation_notify(klass, (oop)obj, size); + } + + void CollectedHeap::post_allocation_setup_array(KlassHandle klass, +@@ -103,9 +104,10 @@ + assert(length >= 0, "length should be non-negative"); + ((arrayOop)obj)->set_length(length); + post_allocation_setup_common(klass, obj); +- assert(((oop)obj)->is_array(), "must be an array"); ++ oop new_obj = (oop)obj; ++ assert(new_obj->is_array(), "must be an array"); + // notify jvmti and dtrace (must be after length is set for dtrace) +- post_allocation_notify(klass, (oop)obj); ++ post_allocation_notify(klass, new_obj, new_obj->size()); + } + + HeapWord* CollectedHeap::common_mem_allocate_noinit(KlassHandle klass, size_t size, TRAPS) { +@@ -199,7 +201,7 @@ + assert(!Universe::heap()->is_gc_active(), "Allocation during gc not allowed"); + assert(size >= 0, "int won't convert to size_t"); + HeapWord* obj = common_mem_allocate_init(klass, size, CHECK_NULL); +- post_allocation_setup_obj(klass, obj); ++ post_allocation_setup_obj(klass, obj, size); + NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value(obj, size)); + return (oop)obj; + } +--- ./hotspot/src/share/vm/interpreter/abstractInterpreter.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/abstractInterpreter.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -42,8 +42,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "interp_masm_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "interp_masm_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "interp_masm_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "interp_masm_ppc_64.hpp" + #endif + + // This file contains the platform-independent parts +@@ -178,30 +181,16 @@ + // Deoptimization should reexecute this bytecode + static bool bytecode_should_reexecute(Bytecodes::Code code); + +- // share implementation of size_activation and layout_activation: +- static int size_activation(Method* method, ++ // deoptimization support ++ static int size_activation(int max_stack, + int temps, +- int popframe_args, ++ int extra_args, + int monitors, +- int caller_actual_parameters, + int callee_params, + int callee_locals, +- bool is_top_frame, +- bool is_bottom_frame) { +- return layout_activation(method, +- temps, +- popframe_args, +- monitors, +- caller_actual_parameters, +- callee_params, +- callee_locals, +- (frame*)NULL, +- (frame*)NULL, +- is_top_frame, +- is_bottom_frame); +- } ++ bool is_top_frame); + +- static int layout_activation(Method* method, ++ static void layout_activation(Method* method, + int temps, + int popframe_args, + int monitors, +--- ./hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -28,14 +28,16 @@ + #include "interpreter/bytecodeHistogram.hpp" + #include "interpreter/bytecodeInterpreter.hpp" + #include "interpreter/bytecodeInterpreter.inline.hpp" ++#include "interpreter/bytecodeInterpreterProfiling.hpp" + #include "interpreter/interpreter.hpp" + #include "interpreter/interpreterRuntime.hpp" +-#include "memory/cardTableModRefBS.hpp" + #include "memory/resourceArea.hpp" + #include "oops/methodCounters.hpp" + #include "oops/objArrayKlass.hpp" + #include "oops/oop.inline.hpp" + #include "prims/jvmtiExport.hpp" ++#include "prims/jvmtiThreadState.hpp" ++#include "runtime/biasedLocking.hpp" + #include "runtime/frame.inline.hpp" + #include "runtime/handles.inline.hpp" + #include "runtime/interfaceSupport.hpp" +@@ -66,6 +68,9 @@ + #ifdef TARGET_OS_ARCH_linux_ppc + # include "orderAccess_linux_ppc.inline.hpp" + #endif ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "orderAccess_aix_ppc.inline.hpp" ++#endif + #ifdef TARGET_OS_ARCH_bsd_x86 + # include "orderAccess_bsd_x86.inline.hpp" + #endif +@@ -138,19 +143,20 @@ + * is no entry point to do the transition to vm so we just + * do it by hand here. + */ +-#define VM_JAVA_ERROR_NO_JUMP(name, msg) \ ++#define VM_JAVA_ERROR_NO_JUMP(name, msg, note_a_trap) \ + DECACHE_STATE(); \ + SET_LAST_JAVA_FRAME(); \ + { \ ++ InterpreterRuntime::note_a_trap(THREAD, istate->method(), BCI()); \ + ThreadInVMfromJava trans(THREAD); \ + Exceptions::_throw_msg(THREAD, __FILE__, __LINE__, name, msg); \ + } \ + RESET_LAST_JAVA_FRAME(); \ + CACHE_STATE(); + +-// Normal throw of a java error +-#define VM_JAVA_ERROR(name, msg) \ +- VM_JAVA_ERROR_NO_JUMP(name, msg) \ ++// Normal throw of a java error. ++#define VM_JAVA_ERROR(name, msg, note_a_trap) \ ++ VM_JAVA_ERROR_NO_JUMP(name, msg, note_a_trap) \ + goto handle_exception; + + #ifdef PRODUCT +@@ -197,6 +203,10 @@ + !THREAD->pop_frame_in_process()) { \ + goto handle_Pop_Frame; \ + } \ ++ if (THREAD->jvmti_thread_state() && \ ++ THREAD->jvmti_thread_state()->is_earlyret_pending()) { \ ++ goto handle_Early_Return; \ ++ } \ + opcode = *pc; \ + } \ + } \ +@@ -332,12 +342,30 @@ + if (UseLoopCounter) { \ + bool do_OSR = UseOnStackReplacement; \ + mcs->backedge_counter()->increment(); \ +- if (do_OSR) do_OSR = mcs->backedge_counter()->reached_InvocationLimit(); \ ++ if (ProfileInterpreter) { \ ++ BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception); \ ++ /* Check for overflow against MDO count. */ \ ++ do_OSR = do_OSR \ ++ && (mdo_last_branch_taken_count >= (uint)InvocationCounter::InterpreterBackwardBranchLimit)\ ++ /* When ProfileInterpreter is on, the backedge_count comes */ \ ++ /* from the methodDataOop, which value does not get reset on */ \ ++ /* the call to frequency_counter_overflow(). To avoid */ \ ++ /* excessive calls to the overflow routine while the method is */ \ ++ /* being compiled, add a second test to make sure the overflow */ \ ++ /* function is called only once every overflow_frequency. */ \ ++ && (!(mdo_last_branch_taken_count & 1023)); \ ++ } else { \ ++ /* check for overflow of backedge counter */ \ ++ do_OSR = do_OSR \ ++ && mcs->invocation_counter()->reached_InvocationLimit(mcs->backedge_counter()); \ ++ } \ + if (do_OSR) { \ +- nmethod* osr_nmethod; \ ++ nmethod* osr_nmethod; \ + OSR_REQUEST(osr_nmethod, branch_pc); \ + if (osr_nmethod != NULL && osr_nmethod->osr_entry_bci() != InvalidOSREntryBci) { \ +- intptr_t* buf = SharedRuntime::OSR_migration_begin(THREAD); \ ++ intptr_t* buf; \ ++ /* Call OSR migration with last java frame only, no checks. */ \ ++ CALL_VM_NAKED_LJF(buf=SharedRuntime::OSR_migration_begin(THREAD)); \ + istate->set_msg(do_osr); \ + istate->set_osr_buf((address)buf); \ + istate->set_osr_entry(osr_nmethod->osr_entry()); \ +@@ -345,7 +373,6 @@ + } \ + } \ + } /* UseCompiler ... */ \ +- mcs->invocation_counter()->increment(); \ + SAFEPOINT; \ + } + +@@ -378,17 +405,21 @@ + #undef CACHE_FRAME + #define CACHE_FRAME() + ++// BCI() returns the current bytecode-index. ++#undef BCI ++#define BCI() ((int)(intptr_t)(pc - (intptr_t)istate->method()->code_base())) ++ + /* + * CHECK_NULL - Macro for throwing a NullPointerException if the object + * passed is a null ref. + * On some architectures/platforms it should be possible to do this implicitly + */ + #undef CHECK_NULL +-#define CHECK_NULL(obj_) \ +- if ((obj_) == NULL) { \ +- VM_JAVA_ERROR(vmSymbols::java_lang_NullPointerException(), ""); \ +- } \ +- VERIFY_OOP(obj_) ++#define CHECK_NULL(obj_) \ ++ if ((obj_) == NULL) { \ ++ VM_JAVA_ERROR(vmSymbols::java_lang_NullPointerException(), NULL, note_nullCheck_trap); \ ++ } \ ++ VERIFY_OOP(obj_) + + #define VMdoubleConstZero() 0.0 + #define VMdoubleConstOne() 1.0 +@@ -410,22 +441,30 @@ + CACHE_CP(); \ + CACHE_LOCALS(); + +-// Call the VM don't check for pending exceptions +-#define CALL_VM_NOCHECK(func) \ +- DECACHE_STATE(); \ +- SET_LAST_JAVA_FRAME(); \ +- func; \ +- RESET_LAST_JAVA_FRAME(); \ +- CACHE_STATE(); \ +- if (THREAD->pop_frame_pending() && \ +- !THREAD->pop_frame_in_process()) { \ +- goto handle_Pop_Frame; \ +- } ++// Call the VM with last java frame only. ++#define CALL_VM_NAKED_LJF(func) \ ++ DECACHE_STATE(); \ ++ SET_LAST_JAVA_FRAME(); \ ++ func; \ ++ RESET_LAST_JAVA_FRAME(); \ ++ CACHE_STATE(); ++ ++// Call the VM. Don't check for pending exceptions. ++#define CALL_VM_NOCHECK(func) \ ++ CALL_VM_NAKED_LJF(func) \ ++ if (THREAD->pop_frame_pending() && \ ++ !THREAD->pop_frame_in_process()) { \ ++ goto handle_Pop_Frame; \ ++ } \ ++ if (THREAD->jvmti_thread_state() && \ ++ THREAD->jvmti_thread_state()->is_earlyret_pending()) { \ ++ goto handle_Early_Return; \ ++ } + + // Call the VM and check for pending exceptions +-#define CALL_VM(func, label) { \ +- CALL_VM_NOCHECK(func); \ +- if (THREAD->has_pending_exception()) goto label; \ ++#define CALL_VM(func, label) { \ ++ CALL_VM_NOCHECK(func); \ ++ if (THREAD->has_pending_exception()) goto label; \ + } + + /* +@@ -502,8 +541,6 @@ + interpreterState orig = istate; + #endif + +- static volatile jbyte* _byte_map_base; // adjusted card table base for oop store barrier +- + register intptr_t* topOfStack = (intptr_t *)istate->stack(); /* access with STACK macros */ + register address pc = istate->bcp(); + register jubyte opcode; +@@ -511,12 +548,9 @@ + register ConstantPoolCache* cp = istate->constants(); // method()->constants()->cache() + #ifdef LOTS_OF_REGS + register JavaThread* THREAD = istate->thread(); +- register volatile jbyte* BYTE_MAP_BASE = _byte_map_base; + #else + #undef THREAD + #define THREAD istate->thread() +-#undef BYTE_MAP_BASE +-#define BYTE_MAP_BASE _byte_map_base + #endif + + #ifdef USELABELS +@@ -622,16 +656,20 @@ + topOfStack < istate->stack_base(), + "Stack top out of range"); + ++#ifdef CC_INTERP_PROFILE ++ // MethodData's last branch taken count. ++ uint mdo_last_branch_taken_count = 0; ++#else ++ const uint mdo_last_branch_taken_count = 0; ++#endif ++ + switch (istate->msg()) { + case initialize: { +- if (initialized++) ShouldNotReachHere(); // Only one initialize call ++ if (initialized++) ShouldNotReachHere(); // Only one initialize call. + _compiling = (UseCompiler || CountCompiledCalls); + #ifdef VM_JVMTI + _jvmti_interp_events = JvmtiExport::can_post_interpreter_events(); + #endif +- BarrierSet* bs = Universe::heap()->barrier_set(); +- assert(bs->kind() == BarrierSet::CardTableModRef, "Wrong barrier set kind"); +- _byte_map_base = (volatile jbyte*)(((CardTableModRefBS*)bs)->byte_map_base); + return; + } + break; +@@ -646,15 +684,12 @@ + METHOD->increment_interpreter_invocation_count(THREAD); + } + mcs->invocation_counter()->increment(); +- if (mcs->invocation_counter()->reached_InvocationLimit()) { +- CALL_VM((void)InterpreterRuntime::frequency_counter_overflow(THREAD, NULL), handle_exception); +- +- // We no longer retry on a counter overflow +- +- // istate->set_msg(retry_method); +- // THREAD->clr_do_not_unlock(); +- // return; ++ if (mcs->invocation_counter()->reached_InvocationLimit(mcs->backedge_counter())) { ++ CALL_VM((void)InterpreterRuntime::frequency_counter_overflow(THREAD, NULL), handle_exception); ++ // We no longer retry on a counter overflow. + } ++ // Get or create profile data. Check for pending (async) exceptions. ++ BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception); + SAFEPOINT; + } + +@@ -676,117 +711,99 @@ + } + #endif // HACK + +- +- // lock method if synchronized ++ // Lock method if synchronized. + if (METHOD->is_synchronized()) { +- // oop rcvr = locals[0].j.r; +- oop rcvr; +- if (METHOD->is_static()) { +- rcvr = METHOD->constants()->pool_holder()->java_mirror(); +- } else { +- rcvr = LOCALS_OBJECT(0); +- VERIFY_OOP(rcvr); +- } +- // The initial monitor is ours for the taking +- BasicObjectLock* mon = &istate->monitor_base()[-1]; +- oop monobj = mon->obj(); +- assert(mon->obj() == rcvr, "method monitor mis-initialized"); +- +- bool success = UseBiasedLocking; +- if (UseBiasedLocking) { +- markOop mark = rcvr->mark(); +- if (mark->has_bias_pattern()) { +- // The bias pattern is present in the object's header. Need to check +- // whether the bias owner and the epoch are both still current. +- intptr_t xx = ((intptr_t) THREAD) ^ (intptr_t) mark; +- xx = (intptr_t) rcvr->klass()->prototype_header() ^ xx; +- intptr_t yy = (xx & ~((int) markOopDesc::age_mask_in_place)); +- if (yy != 0 ) { +- // At this point we know that the header has the bias pattern and +- // that we are not the bias owner in the current epoch. We need to +- // figure out more details about the state of the header in order to +- // know what operations can be legally performed on the object's +- // header. +- +- // If the low three bits in the xor result aren't clear, that means +- // the prototype header is no longer biased and we have to revoke +- // the bias on this object. +- +- if (yy & markOopDesc::biased_lock_mask_in_place == 0 ) { +- // Biasing is still enabled for this data type. See whether the +- // epoch of the current bias is still valid, meaning that the epoch +- // bits of the mark word are equal to the epoch bits of the +- // prototype header. (Note that the prototype header's epoch bits +- // only change at a safepoint.) If not, attempt to rebias the object +- // toward the current thread. Note that we must be absolutely sure +- // that the current epoch is invalid in order to do this because +- // otherwise the manipulations it performs on the mark word are +- // illegal. +- if (yy & markOopDesc::epoch_mask_in_place == 0) { +- // The epoch of the current bias is still valid but we know nothing +- // about the owner; it might be set or it might be clear. 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. +- // Note that we first construct the presumed unbiased header so we +- // don't accidentally blow away another thread's valid bias. +- intptr_t unbiased = (intptr_t) mark & (markOopDesc::biased_lock_mask_in_place | +- markOopDesc::age_mask_in_place | +- markOopDesc::epoch_mask_in_place); +- if (Atomic::cmpxchg_ptr((intptr_t)THREAD | unbiased, (intptr_t*) rcvr->mark_addr(), unbiased) != unbiased) { +- CALL_VM(InterpreterRuntime::monitorenter(THREAD, mon), handle_exception); +- } +- } else { +- try_rebias: +- // At this point we know the epoch has expired, meaning that the +- // current "bias owner", if any, is actually invalid. Under these +- // circumstances _only_, we are allowed to use the current header's +- // value as the comparison value when doing the cas to acquire the +- // bias in the current epoch. In other words, we allow transfer of +- // the bias from one thread to another directly in this situation. +- xx = (intptr_t) rcvr->klass()->prototype_header() | (intptr_t) THREAD; +- if (Atomic::cmpxchg_ptr((intptr_t)THREAD | (intptr_t) rcvr->klass()->prototype_header(), +- (intptr_t*) rcvr->mark_addr(), +- (intptr_t) mark) != (intptr_t) mark) { +- CALL_VM(InterpreterRuntime::monitorenter(THREAD, mon), handle_exception); +- } +- } +- } else { +- try_revoke_bias: +- // The prototype mark in the klass doesn't have the bias bit set any +- // more, indicating that objects of this data type are not supposed +- // to be biased any more. 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. Note that if our CAS fails, it means +- // that another thread raced us for the privilege of revoking the +- // bias of this particular object, so it's okay to continue in the +- // normal locking code. +- // +- xx = (intptr_t) rcvr->klass()->prototype_header() | (intptr_t) THREAD; +- if (Atomic::cmpxchg_ptr(rcvr->klass()->prototype_header(), +- (intptr_t*) rcvr->mark_addr(), +- mark) == mark) { +- // (*counters->revoked_lock_entry_count_addr())++; +- success = false; +- } +- } ++ // oop rcvr = locals[0].j.r; ++ oop rcvr; ++ if (METHOD->is_static()) { ++ rcvr = METHOD->constants()->pool_holder()->java_mirror(); ++ } else { ++ rcvr = LOCALS_OBJECT(0); ++ VERIFY_OOP(rcvr); ++ } ++ // The initial monitor is ours for the taking. ++ // Monitor not filled in frame manager any longer as this caused race condition with biased locking. ++ BasicObjectLock* mon = &istate->monitor_base()[-1]; ++ mon->set_obj(rcvr); ++ bool success = false; ++ uintptr_t epoch_mask_in_place = (uintptr_t)markOopDesc::epoch_mask_in_place; ++ markOop mark = rcvr->mark(); ++ intptr_t hash = (intptr_t) markOopDesc::no_hash; ++ // Implies UseBiasedLocking. ++ if (mark->has_bias_pattern()) { ++ uintptr_t thread_ident; ++ uintptr_t anticipated_bias_locking_value; ++ thread_ident = (uintptr_t)istate->thread(); ++ anticipated_bias_locking_value = ++ (((uintptr_t)rcvr->klass()->prototype_header() | thread_ident) ^ (uintptr_t)mark) & ++ ~((uintptr_t) markOopDesc::age_mask_in_place); ++ ++ if (anticipated_bias_locking_value == 0) { ++ // Already biased towards this thread, nothing to do. ++ if (PrintBiasedLockingStatistics) { ++ (* BiasedLocking::biased_lock_entry_count_addr())++; ++ } ++ success = true; ++ } else if ((anticipated_bias_locking_value & markOopDesc::biased_lock_mask_in_place) != 0) { ++ // Try to revoke bias. ++ markOop header = rcvr->klass()->prototype_header(); ++ if (hash != markOopDesc::no_hash) { ++ header = header->copy_set_hash(hash); ++ } ++ if (Atomic::cmpxchg_ptr(header, rcvr->mark_addr(), mark) == mark) { ++ if (PrintBiasedLockingStatistics) ++ (*BiasedLocking::revoked_lock_entry_count_addr())++; ++ } ++ } else if ((anticipated_bias_locking_value & epoch_mask_in_place) != 0) { ++ // Try to rebias. ++ markOop new_header = (markOop) ( (intptr_t) rcvr->klass()->prototype_header() | thread_ident); ++ if (hash != markOopDesc::no_hash) { ++ new_header = new_header->copy_set_hash(hash); ++ } ++ if (Atomic::cmpxchg_ptr((void*)new_header, rcvr->mark_addr(), mark) == mark) { ++ if (PrintBiasedLockingStatistics) { ++ (* BiasedLocking::rebiased_lock_entry_count_addr())++; + } + } else { +- cas_label: +- success = false; ++ CALL_VM(InterpreterRuntime::monitorenter(THREAD, mon), handle_exception); ++ } ++ success = true; ++ } else { ++ // Try to bias towards thread in case object is anonymously biased. ++ markOop header = (markOop) ((uintptr_t) mark & ++ ((uintptr_t)markOopDesc::biased_lock_mask_in_place | ++ (uintptr_t)markOopDesc::age_mask_in_place | epoch_mask_in_place)); ++ if (hash != markOopDesc::no_hash) { ++ header = header->copy_set_hash(hash); ++ } ++ markOop new_header = (markOop) ((uintptr_t) header | thread_ident); ++ // Debugging hint. ++ DEBUG_ONLY(mon->lock()->set_displaced_header((markOop) (uintptr_t) 0xdeaddead);) ++ if (Atomic::cmpxchg_ptr((void*)new_header, rcvr->mark_addr(), header) == header) { ++ if (PrintBiasedLockingStatistics) { ++ (* BiasedLocking::anonymously_biased_lock_entry_count_addr())++; ++ } ++ } else { ++ CALL_VM(InterpreterRuntime::monitorenter(THREAD, mon), handle_exception); ++ } ++ success = true; ++ } ++ } ++ ++ // Traditional lightweight locking. ++ if (!success) { ++ markOop displaced = rcvr->mark()->set_unlocked(); ++ mon->lock()->set_displaced_header(displaced); ++ bool call_vm = UseHeavyMonitors; ++ if (call_vm || Atomic::cmpxchg_ptr(mon, rcvr->mark_addr(), displaced) != displaced) { ++ // Is it simple recursive case? ++ if (!call_vm && THREAD->is_lock_owned((address) displaced->clear_lock_bits())) { ++ mon->lock()->set_displaced_header(NULL); ++ } else { ++ CALL_VM(InterpreterRuntime::monitorenter(THREAD, mon), handle_exception); + } + } +- if (!success) { +- markOop displaced = rcvr->mark()->set_unlocked(); +- mon->lock()->set_displaced_header(displaced); +- if (Atomic::cmpxchg_ptr(mon, rcvr->mark_addr(), displaced) != displaced) { +- // Is it simple recursive case? +- if (THREAD->is_lock_owned((address) displaced->clear_lock_bits())) { +- mon->lock()->set_displaced_header(NULL); +- } else { +- CALL_VM(InterpreterRuntime::monitorenter(THREAD, mon), handle_exception); +- } +- } +- } ++ } + } + THREAD->clr_do_not_unlock(); + +@@ -808,9 +825,14 @@ + case popping_frame: { + // returned from a java call to pop the frame, restart the call + // clear the message so we don't confuse ourselves later +- ShouldNotReachHere(); // we don't return this. + assert(THREAD->pop_frame_in_process(), "wrong frame pop state"); + istate->set_msg(no_request); ++ if (_compiling) { ++ // Set MDX back to the ProfileData of the invoke bytecode that will be ++ // restarted. ++ SET_MDX(NULL); ++ BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception); ++ } + THREAD->clr_pop_frame_in_process(); + goto run; + } +@@ -836,10 +858,19 @@ + if (THREAD->pop_frame_pending() && !THREAD->pop_frame_in_process()) { + goto handle_Pop_Frame; + } ++ if (THREAD->jvmti_thread_state() && ++ THREAD->jvmti_thread_state()->is_earlyret_pending()) { ++ goto handle_Early_Return; ++ } + + if (THREAD->has_pending_exception()) goto handle_exception; + // Update the pc by the saved amount of the invoke bytecode size + UPDATE_PC(istate->bcp_advance()); ++ ++ if (_compiling) { ++ // Get or create profile data. Check for pending (async) exceptions. ++ BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception); ++ } + goto run; + } + +@@ -847,6 +878,11 @@ + // Returned from an opcode that will reexecute. Deopt was + // a result of a PopFrame request. + // ++ ++ if (_compiling) { ++ // Get or create profile data. Check for pending (async) exceptions. ++ BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception); ++ } + goto run; + } + +@@ -869,6 +905,11 @@ + } + UPDATE_PC(Bytecodes::length_at(METHOD, pc)); + if (THREAD->has_pending_exception()) goto handle_exception; ++ ++ if (_compiling) { ++ // Get or create profile data. Check for pending (async) exceptions. ++ BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception); ++ } + goto run; + } + case got_monitors: { +@@ -881,15 +922,84 @@ + BasicObjectLock* entry = (BasicObjectLock*) istate->stack_base(); + assert(entry->obj() == NULL, "Frame manager didn't allocate the monitor"); + entry->set_obj(lockee); +- +- markOop displaced = lockee->mark()->set_unlocked(); +- entry->lock()->set_displaced_header(displaced); +- if (Atomic::cmpxchg_ptr(entry, lockee->mark_addr(), displaced) != displaced) { +- // Is it simple recursive case? +- if (THREAD->is_lock_owned((address) displaced->clear_lock_bits())) { +- entry->lock()->set_displaced_header(NULL); ++ bool success = false; ++ uintptr_t epoch_mask_in_place = (uintptr_t)markOopDesc::epoch_mask_in_place; ++ ++ markOop mark = lockee->mark(); ++ intptr_t hash = (intptr_t) markOopDesc::no_hash; ++ // implies UseBiasedLocking ++ if (mark->has_bias_pattern()) { ++ uintptr_t thread_ident; ++ uintptr_t anticipated_bias_locking_value; ++ thread_ident = (uintptr_t)istate->thread(); ++ anticipated_bias_locking_value = ++ (((uintptr_t)lockee->klass()->prototype_header() | thread_ident) ^ (uintptr_t)mark) & ++ ~((uintptr_t) markOopDesc::age_mask_in_place); ++ ++ if (anticipated_bias_locking_value == 0) { ++ // already biased towards this thread, nothing to do ++ if (PrintBiasedLockingStatistics) { ++ (* BiasedLocking::biased_lock_entry_count_addr())++; ++ } ++ success = true; ++ } else if ((anticipated_bias_locking_value & markOopDesc::biased_lock_mask_in_place) != 0) { ++ // try revoke bias ++ markOop header = lockee->klass()->prototype_header(); ++ if (hash != markOopDesc::no_hash) { ++ header = header->copy_set_hash(hash); ++ } ++ if (Atomic::cmpxchg_ptr(header, lockee->mark_addr(), mark) == mark) { ++ if (PrintBiasedLockingStatistics) { ++ (*BiasedLocking::revoked_lock_entry_count_addr())++; ++ } ++ } ++ } else if ((anticipated_bias_locking_value & epoch_mask_in_place) !=0) { ++ // try rebias ++ markOop new_header = (markOop) ( (intptr_t) lockee->klass()->prototype_header() | thread_ident); ++ if (hash != markOopDesc::no_hash) { ++ new_header = new_header->copy_set_hash(hash); ++ } ++ if (Atomic::cmpxchg_ptr((void*)new_header, lockee->mark_addr(), mark) == mark) { ++ if (PrintBiasedLockingStatistics) { ++ (* BiasedLocking::rebiased_lock_entry_count_addr())++; ++ } ++ } else { ++ CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); ++ } ++ success = true; + } else { +- CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); ++ // try to bias towards thread in case object is anonymously biased ++ markOop header = (markOop) ((uintptr_t) mark & ((uintptr_t)markOopDesc::biased_lock_mask_in_place | ++ (uintptr_t)markOopDesc::age_mask_in_place | epoch_mask_in_place)); ++ if (hash != markOopDesc::no_hash) { ++ header = header->copy_set_hash(hash); ++ } ++ markOop new_header = (markOop) ((uintptr_t) header | thread_ident); ++ // debugging hint ++ DEBUG_ONLY(entry->lock()->set_displaced_header((markOop) (uintptr_t) 0xdeaddead);) ++ if (Atomic::cmpxchg_ptr((void*)new_header, lockee->mark_addr(), header) == header) { ++ if (PrintBiasedLockingStatistics) { ++ (* BiasedLocking::anonymously_biased_lock_entry_count_addr())++; ++ } ++ } else { ++ CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); ++ } ++ success = true; ++ } ++ } ++ ++ // traditional lightweight locking ++ if (!success) { ++ markOop displaced = lockee->mark()->set_unlocked(); ++ entry->lock()->set_displaced_header(displaced); ++ bool call_vm = UseHeavyMonitors; ++ if (call_vm || Atomic::cmpxchg_ptr(entry, lockee->mark_addr(), displaced) != displaced) { ++ // Is it simple recursive case? ++ if (!call_vm && THREAD->is_lock_owned((address) displaced->clear_lock_bits())) { ++ entry->lock()->set_displaced_header(NULL); ++ } else { ++ CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); ++ } + } + } + UPDATE_PC_AND_TOS(1, -1); +@@ -1050,6 +1160,11 @@ + uint16_t reg = Bytes::get_Java_u2(pc + 2); + + opcode = pc[1]; ++ ++ // Wide and it's sub-bytecode are counted as separate instructions. If we ++ // don't account for this here, the bytecode trace skips the next bytecode. ++ DO_UPDATE_INSTRUCTION_COUNT(opcode); ++ + switch(opcode) { + case Bytecodes::_aload: + VERIFY_OOP(LOCALS_OBJECT(reg)); +@@ -1093,10 +1208,13 @@ + UPDATE_PC_AND_CONTINUE(6); + } + case Bytecodes::_ret: ++ // Profile ret. ++ BI_PROFILE_UPDATE_RET(/*bci=*/((int)(intptr_t)(LOCALS_ADDR(reg)))); ++ // Now, update the pc. + pc = istate->method()->code_base() + (intptr_t)(LOCALS_ADDR(reg)); + UPDATE_PC_AND_CONTINUE(0); + default: +- VM_JAVA_ERROR(vmSymbols::java_lang_InternalError(), "undefined opcode"); ++ VM_JAVA_ERROR(vmSymbols::java_lang_InternalError(), "undefined opcode", note_no_trap); + } + } + +@@ -1177,7 +1295,7 @@ + CASE(_i##opcname): \ + if (test && (STACK_INT(-1) == 0)) { \ + VM_JAVA_ERROR(vmSymbols::java_lang_ArithmeticException(), \ +- "/ by zero"); \ ++ "/ by zero", note_div0Check_trap); \ + } \ + SET_STACK_INT(VMint##opname(STACK_INT(-2), \ + STACK_INT(-1)), \ +@@ -1189,7 +1307,7 @@ + jlong l1 = STACK_LONG(-1); \ + if (VMlongEqz(l1)) { \ + VM_JAVA_ERROR(vmSymbols::java_lang_ArithmeticException(), \ +- "/ by long zero"); \ ++ "/ by long zero", note_div0Check_trap); \ + } \ + } \ + /* First long at (-1,-2) next long at (-3,-4) */ \ +@@ -1402,17 +1520,23 @@ + + #define COMPARISON_OP(name, comparison) \ + CASE(_if_icmp##name): { \ +- int skip = (STACK_INT(-2) comparison STACK_INT(-1)) \ ++ const bool cmp = (STACK_INT(-2) comparison STACK_INT(-1)); \ ++ int skip = cmp \ + ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3; \ + address branch_pc = pc; \ ++ /* Profile branch. */ \ ++ BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp); \ + UPDATE_PC_AND_TOS(skip, -2); \ + DO_BACKEDGE_CHECKS(skip, branch_pc); \ + CONTINUE; \ + } \ + CASE(_if##name): { \ +- int skip = (STACK_INT(-1) comparison 0) \ ++ const bool cmp = (STACK_INT(-1) comparison 0); \ ++ int skip = cmp \ + ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3; \ + address branch_pc = pc; \ ++ /* Profile branch. */ \ ++ BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp); \ + UPDATE_PC_AND_TOS(skip, -1); \ + DO_BACKEDGE_CHECKS(skip, branch_pc); \ + CONTINUE; \ +@@ -1421,9 +1545,12 @@ + #define COMPARISON_OP2(name, comparison) \ + COMPARISON_OP(name, comparison) \ + CASE(_if_acmp##name): { \ +- int skip = (STACK_OBJECT(-2) comparison STACK_OBJECT(-1)) \ ++ const bool cmp = (STACK_OBJECT(-2) comparison STACK_OBJECT(-1)); \ ++ int skip = cmp \ + ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3; \ + address branch_pc = pc; \ ++ /* Profile branch. */ \ ++ BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp); \ + UPDATE_PC_AND_TOS(skip, -2); \ + DO_BACKEDGE_CHECKS(skip, branch_pc); \ + CONTINUE; \ +@@ -1431,9 +1558,12 @@ + + #define NULL_COMPARISON_NOT_OP(name) \ + CASE(_if##name): { \ +- int skip = (!(STACK_OBJECT(-1) == NULL)) \ ++ const bool cmp = (!(STACK_OBJECT(-1) == NULL)); \ ++ int skip = cmp \ + ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3; \ + address branch_pc = pc; \ ++ /* Profile branch. */ \ ++ BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp); \ + UPDATE_PC_AND_TOS(skip, -1); \ + DO_BACKEDGE_CHECKS(skip, branch_pc); \ + CONTINUE; \ +@@ -1441,9 +1571,12 @@ + + #define NULL_COMPARISON_OP(name) \ + CASE(_if##name): { \ +- int skip = ((STACK_OBJECT(-1) == NULL)) \ ++ const bool cmp = ((STACK_OBJECT(-1) == NULL)); \ ++ int skip = cmp \ + ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3; \ + address branch_pc = pc; \ ++ /* Profile branch. */ \ ++ BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp); \ + UPDATE_PC_AND_TOS(skip, -1); \ + DO_BACKEDGE_CHECKS(skip, branch_pc); \ + CONTINUE; \ +@@ -1466,30 +1599,42 @@ + int32_t high = Bytes::get_Java_u4((address)&lpc[2]); + int32_t skip; + key -= low; +- skip = ((uint32_t) key > (uint32_t)(high - low)) +- ? Bytes::get_Java_u4((address)&lpc[0]) +- : Bytes::get_Java_u4((address)&lpc[key + 3]); +- // Does this really need a full backedge check (osr?) ++ if (((uint32_t) key > (uint32_t)(high - low))) { ++ key = -1; ++ skip = Bytes::get_Java_u4((address)&lpc[0]); ++ } else { ++ skip = Bytes::get_Java_u4((address)&lpc[key + 3]); ++ } ++ // Profile switch. ++ BI_PROFILE_UPDATE_SWITCH(/*switch_index=*/key); ++ // Does this really need a full backedge check (osr)? + address branch_pc = pc; + UPDATE_PC_AND_TOS(skip, -1); + DO_BACKEDGE_CHECKS(skip, branch_pc); + CONTINUE; + } + +- /* Goto pc whose table entry matches specified key */ ++ /* Goto pc whose table entry matches specified key. */ + + CASE(_lookupswitch): { + jint* lpc = (jint*)VMalignWordUp(pc+1); + int32_t key = STACK_INT(-1); + int32_t skip = Bytes::get_Java_u4((address) lpc); /* default amount */ ++ // Remember index. ++ int index = -1; ++ int newindex = 0; + int32_t npairs = Bytes::get_Java_u4((address) &lpc[1]); + while (--npairs >= 0) { +- lpc += 2; +- if (key == (int32_t)Bytes::get_Java_u4((address)lpc)) { +- skip = Bytes::get_Java_u4((address)&lpc[1]); +- break; +- } ++ lpc += 2; ++ if (key == (int32_t)Bytes::get_Java_u4((address)lpc)) { ++ skip = Bytes::get_Java_u4((address)&lpc[1]); ++ index = newindex; ++ break; ++ } ++ newindex += 1; + } ++ // Profile switch. ++ BI_PROFILE_UPDATE_SWITCH(/*switch_index=*/index); + address branch_pc = pc; + UPDATE_PC_AND_TOS(skip, -1); + DO_BACKEDGE_CHECKS(skip, branch_pc); +@@ -1574,7 +1719,7 @@ + if ((uint32_t)index >= (uint32_t)arrObj->length()) { \ + sprintf(message, "%d", index); \ + VM_JAVA_ERROR(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), \ +- message); \ ++ message, note_rangeCheck_trap); \ + } + + /* 32-bit loads. These handle conversion from < 32-bit types */ +@@ -1600,8 +1745,11 @@ + ARRAY_LOADTO32(T_INT, jint, "%d", STACK_INT, 0); + CASE(_faload): + ARRAY_LOADTO32(T_FLOAT, jfloat, "%f", STACK_FLOAT, 0); +- CASE(_aaload): +- ARRAY_LOADTO32(T_OBJECT, oop, INTPTR_FORMAT, STACK_OBJECT, 0); ++ CASE(_aaload): { ++ ARRAY_INTRO(-2); ++ SET_STACK_OBJECT(((objArrayOop) arrObj)->obj_at(index), -2); ++ UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1); ++ } + CASE(_baload): + ARRAY_LOADTO32(T_BYTE, jbyte, "%d", STACK_INT, 0); + CASE(_caload): +@@ -1645,21 +1793,24 @@ + // arrObj, index are set + if (rhsObject != NULL) { + /* Check assignability of rhsObject into arrObj */ +- Klass* rhsKlassOop = rhsObject->klass(); // EBX (subclass) +- Klass* elemKlassOop = ObjArrayKlass::cast(arrObj->klass())->element_klass(); // superklass EAX ++ Klass* rhsKlass = rhsObject->klass(); // EBX (subclass) ++ Klass* elemKlass = ObjArrayKlass::cast(arrObj->klass())->element_klass(); // superklass EAX + // + // Check for compatibilty. This check must not GC!! + // Seems way more expensive now that we must dispatch + // +- if (rhsKlassOop != elemKlassOop && !rhsKlassOop->is_subtype_of(elemKlassOop)) { // ebx->is... +- VM_JAVA_ERROR(vmSymbols::java_lang_ArrayStoreException(), ""); ++ if (rhsKlass != elemKlass && !rhsKlass->is_subtype_of(elemKlass)) { // ebx->is... ++ // Decrement counter if subtype check failed. ++ BI_PROFILE_SUBTYPECHECK_FAILED(rhsKlass); ++ VM_JAVA_ERROR(vmSymbols::java_lang_ArrayStoreException(), "", note_arrayCheck_trap); + } ++ // Profile checkcast with null_seen and receiver. ++ BI_PROFILE_UPDATE_CHECKCAST(/*null_seen=*/false, rhsKlass); ++ } else { ++ // Profile checkcast with null_seen and receiver. ++ BI_PROFILE_UPDATE_CHECKCAST(/*null_seen=*/true, NULL); + } +- oop* elem_loc = (oop*)(((address) arrObj->base(T_OBJECT)) + index * sizeof(oop)); +- // *(oop*)(((address) arrObj->base(T_OBJECT)) + index * sizeof(oop)) = rhsObject; +- *elem_loc = rhsObject; +- // Mark the card +- OrderAccess::release_store(&BYTE_MAP_BASE[(uintptr_t)elem_loc >> CardTableModRefBS::card_shift], 0); ++ ((objArrayOop) arrObj)->obj_at_put(index, rhsObject); + UPDATE_PC_AND_TOS_AND_CONTINUE(1, -3); + } + CASE(_bastore): +@@ -1700,14 +1851,87 @@ + } + if (entry != NULL) { + entry->set_obj(lockee); +- markOop displaced = lockee->mark()->set_unlocked(); +- entry->lock()->set_displaced_header(displaced); +- if (Atomic::cmpxchg_ptr(entry, lockee->mark_addr(), displaced) != displaced) { +- // Is it simple recursive case? +- if (THREAD->is_lock_owned((address) displaced->clear_lock_bits())) { +- entry->lock()->set_displaced_header(NULL); +- } else { +- CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); ++ int success = false; ++ uintptr_t epoch_mask_in_place = (uintptr_t)markOopDesc::epoch_mask_in_place; ++ ++ markOop mark = lockee->mark(); ++ intptr_t hash = (intptr_t) markOopDesc::no_hash; ++ // implies UseBiasedLocking ++ if (mark->has_bias_pattern()) { ++ uintptr_t thread_ident; ++ uintptr_t anticipated_bias_locking_value; ++ thread_ident = (uintptr_t)istate->thread(); ++ anticipated_bias_locking_value = ++ (((uintptr_t)lockee->klass()->prototype_header() | thread_ident) ^ (uintptr_t)mark) & ++ ~((uintptr_t) markOopDesc::age_mask_in_place); ++ ++ if (anticipated_bias_locking_value == 0) { ++ // already biased towards this thread, nothing to do ++ if (PrintBiasedLockingStatistics) { ++ (* BiasedLocking::biased_lock_entry_count_addr())++; ++ } ++ success = true; ++ } ++ else if ((anticipated_bias_locking_value & markOopDesc::biased_lock_mask_in_place) != 0) { ++ // try revoke bias ++ markOop header = lockee->klass()->prototype_header(); ++ if (hash != markOopDesc::no_hash) { ++ header = header->copy_set_hash(hash); ++ } ++ if (Atomic::cmpxchg_ptr(header, lockee->mark_addr(), mark) == mark) { ++ if (PrintBiasedLockingStatistics) ++ (*BiasedLocking::revoked_lock_entry_count_addr())++; ++ } ++ } ++ else if ((anticipated_bias_locking_value & epoch_mask_in_place) !=0) { ++ // try rebias ++ markOop new_header = (markOop) ( (intptr_t) lockee->klass()->prototype_header() | thread_ident); ++ if (hash != markOopDesc::no_hash) { ++ new_header = new_header->copy_set_hash(hash); ++ } ++ if (Atomic::cmpxchg_ptr((void*)new_header, lockee->mark_addr(), mark) == mark) { ++ if (PrintBiasedLockingStatistics) ++ (* BiasedLocking::rebiased_lock_entry_count_addr())++; ++ } ++ else { ++ CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); ++ } ++ success = true; ++ } ++ else { ++ // try to bias towards thread in case object is anonymously biased ++ markOop header = (markOop) ((uintptr_t) mark & ((uintptr_t)markOopDesc::biased_lock_mask_in_place | ++ (uintptr_t)markOopDesc::age_mask_in_place | ++ epoch_mask_in_place)); ++ if (hash != markOopDesc::no_hash) { ++ header = header->copy_set_hash(hash); ++ } ++ markOop new_header = (markOop) ((uintptr_t) header | thread_ident); ++ // debugging hint ++ DEBUG_ONLY(entry->lock()->set_displaced_header((markOop) (uintptr_t) 0xdeaddead);) ++ if (Atomic::cmpxchg_ptr((void*)new_header, lockee->mark_addr(), header) == header) { ++ if (PrintBiasedLockingStatistics) ++ (* BiasedLocking::anonymously_biased_lock_entry_count_addr())++; ++ } ++ else { ++ CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); ++ } ++ success = true; ++ } ++ } ++ ++ // traditional lightweight locking ++ if (!success) { ++ markOop displaced = lockee->mark()->set_unlocked(); ++ entry->lock()->set_displaced_header(displaced); ++ bool call_vm = UseHeavyMonitors; ++ if (call_vm || Atomic::cmpxchg_ptr(entry, lockee->mark_addr(), displaced) != displaced) { ++ // Is it simple recursive case? ++ if (!call_vm && THREAD->is_lock_owned((address) displaced->clear_lock_bits())) { ++ entry->lock()->set_displaced_header(NULL); ++ } else { ++ CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception); ++ } + } + } + UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1); +@@ -1729,12 +1953,15 @@ + BasicLock* lock = most_recent->lock(); + markOop header = lock->displaced_header(); + most_recent->set_obj(NULL); +- // If it isn't recursive we either must swap old header or call the runtime +- if (header != NULL) { +- if (Atomic::cmpxchg_ptr(header, lockee->mark_addr(), lock) != lock) { +- // restore object for the slow case +- most_recent->set_obj(lockee); +- CALL_VM(InterpreterRuntime::monitorexit(THREAD, most_recent), handle_exception); ++ if (!lockee->mark()->has_bias_pattern()) { ++ bool call_vm = UseHeavyMonitors; ++ // If it isn't recursive we either must swap old header or call the runtime ++ if (header != NULL || call_vm) { ++ if (call_vm || Atomic::cmpxchg_ptr(header, lockee->mark_addr(), lock) != lock) { ++ // restore object for the slow case ++ most_recent->set_obj(lockee); ++ CALL_VM(InterpreterRuntime::monitorexit(THREAD, most_recent), handle_exception); ++ } + } + } + UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1); +@@ -1807,6 +2034,9 @@ + TosState tos_type = cache->flag_state(); + int field_offset = cache->f2_as_index(); + if (cache->is_volatile()) { ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ OrderAccess::fence(); ++ } + if (tos_type == atos) { + VERIFY_OOP(obj->obj_field_acquire(field_offset)); + SET_STACK_OBJECT(obj->obj_field_acquire(field_offset), -1); +@@ -1923,7 +2153,6 @@ + } else if (tos_type == atos) { + VERIFY_OOP(STACK_OBJECT(-1)); + obj->release_obj_field_put(field_offset, STACK_OBJECT(-1)); +- OrderAccess::release_store(&BYTE_MAP_BASE[(uintptr_t)obj >> CardTableModRefBS::card_shift], 0); + } else if (tos_type == btos) { + obj->release_byte_field_put(field_offset, STACK_INT(-1)); + } else if (tos_type == ltos) { +@@ -1944,7 +2173,6 @@ + } else if (tos_type == atos) { + VERIFY_OOP(STACK_OBJECT(-1)); + obj->obj_field_put(field_offset, STACK_OBJECT(-1)); +- OrderAccess::release_store(&BYTE_MAP_BASE[(uintptr_t)obj >> CardTableModRefBS::card_shift], 0); + } else if (tos_type == btos) { + obj->byte_field_put(field_offset, STACK_INT(-1)); + } else if (tos_type == ltos) { +@@ -1981,10 +2209,14 @@ + if (UseTLAB) { + result = (oop) THREAD->tlab().allocate(obj_size); + } ++ // Disable non-TLAB-based fast-path, because profiling requires that all ++ // allocations go through InterpreterRuntime::_new() if THREAD->tlab().allocate ++ // returns NULL. ++#ifndef CC_INTERP_PROFILE + if (result == NULL) { + need_zero = true; + // Try allocate in shared eden +- retry: ++ retry: + HeapWord* compare_to = *Universe::heap()->top_addr(); + HeapWord* new_top = compare_to + obj_size; + if (new_top <= *Universe::heap()->end_addr()) { +@@ -1994,6 +2226,7 @@ + result = (oop) compare_to; + } + } ++#endif + if (result != NULL) { + // Initialize object (if nonzero size and need) and then the header + if (need_zero ) { +@@ -2010,6 +2243,9 @@ + } + result->set_klass_gap(0); + result->set_klass(k_entry); ++ // Must prevent reordering of stores for object initialization ++ // with stores that publish the new object. ++ OrderAccess::storestore(); + SET_STACK_OBJECT(result, 0); + UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1); + } +@@ -2018,6 +2254,9 @@ + // Slow case allocation + CALL_VM(InterpreterRuntime::_new(THREAD, METHOD->constants(), index), + handle_exception); ++ // Must prevent reordering of stores for object initialization ++ // with stores that publish the new object. ++ OrderAccess::storestore(); + SET_STACK_OBJECT(THREAD->vm_result(), 0); + THREAD->set_vm_result(NULL); + UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1); +@@ -2027,6 +2266,9 @@ + jint size = STACK_INT(-1); + CALL_VM(InterpreterRuntime::anewarray(THREAD, METHOD->constants(), index, size), + handle_exception); ++ // Must prevent reordering of stores for object initialization ++ // with stores that publish the new object. ++ OrderAccess::storestore(); + SET_STACK_OBJECT(THREAD->vm_result(), -1); + THREAD->set_vm_result(NULL); + UPDATE_PC_AND_CONTINUE(3); +@@ -2041,6 +2283,9 @@ + //adjust pointer to start of stack element + CALL_VM(InterpreterRuntime::multianewarray(THREAD, dimarray), + handle_exception); ++ // Must prevent reordering of stores for object initialization ++ // with stores that publish the new object. ++ OrderAccess::storestore(); + SET_STACK_OBJECT(THREAD->vm_result(), -dims); + THREAD->set_vm_result(NULL); + UPDATE_PC_AND_TOS_AND_CONTINUE(4, -(dims-1)); +@@ -2049,61 +2294,63 @@ + if (STACK_OBJECT(-1) != NULL) { + VERIFY_OOP(STACK_OBJECT(-1)); + u2 index = Bytes::get_Java_u2(pc+1); +- if (ProfileInterpreter) { +- // needs Profile_checkcast QQQ +- ShouldNotReachHere(); +- } + // Constant pool may have actual klass or unresolved klass. If it is +- // unresolved we must resolve it ++ // unresolved we must resolve it. + if (METHOD->constants()->tag_at(index).is_unresolved_klass()) { + CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception); + } + Klass* klassOf = (Klass*) METHOD->constants()->slot_at(index).get_klass(); +- Klass* objKlassOop = STACK_OBJECT(-1)->klass(); //ebx ++ Klass* objKlass = STACK_OBJECT(-1)->klass(); // ebx + // + // Check for compatibilty. This check must not GC!! +- // Seems way more expensive now that we must dispatch ++ // Seems way more expensive now that we must dispatch. + // +- if (objKlassOop != klassOf && +- !objKlassOop->is_subtype_of(klassOf)) { ++ if (objKlass != klassOf && !objKlass->is_subtype_of(klassOf)) { ++ // Decrement counter at checkcast. ++ BI_PROFILE_SUBTYPECHECK_FAILED(objKlass); + ResourceMark rm(THREAD); +- const char* objName = objKlassOop->external_name(); ++ const char* objName = objKlass->external_name(); + const char* klassName = klassOf->external_name(); + char* message = SharedRuntime::generate_class_cast_message( + objName, klassName); +- VM_JAVA_ERROR(vmSymbols::java_lang_ClassCastException(), message); ++ VM_JAVA_ERROR(vmSymbols::java_lang_ClassCastException(), message, note_classCheck_trap); + } ++ // Profile checkcast with null_seen and receiver. ++ BI_PROFILE_UPDATE_CHECKCAST(/*null_seen=*/false, objKlass); + } else { +- if (UncommonNullCast) { +-// istate->method()->set_null_cast_seen(); +-// [RGV] Not sure what to do here! +- +- } ++ // Profile checkcast with null_seen and receiver. ++ BI_PROFILE_UPDATE_CHECKCAST(/*null_seen=*/true, NULL); + } + UPDATE_PC_AND_CONTINUE(3); + + CASE(_instanceof): + if (STACK_OBJECT(-1) == NULL) { + SET_STACK_INT(0, -1); ++ // Profile instanceof with null_seen and receiver. ++ BI_PROFILE_UPDATE_INSTANCEOF(/*null_seen=*/true, NULL); + } else { + VERIFY_OOP(STACK_OBJECT(-1)); + u2 index = Bytes::get_Java_u2(pc+1); + // Constant pool may have actual klass or unresolved klass. If it is +- // unresolved we must resolve it ++ // unresolved we must resolve it. + if (METHOD->constants()->tag_at(index).is_unresolved_klass()) { + CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception); + } + Klass* klassOf = (Klass*) METHOD->constants()->slot_at(index).get_klass(); +- Klass* objKlassOop = STACK_OBJECT(-1)->klass(); ++ Klass* objKlass = STACK_OBJECT(-1)->klass(); + // + // Check for compatibilty. This check must not GC!! +- // Seems way more expensive now that we must dispatch ++ // Seems way more expensive now that we must dispatch. + // +- if ( objKlassOop == klassOf || objKlassOop->is_subtype_of(klassOf)) { ++ if ( objKlass == klassOf || objKlass->is_subtype_of(klassOf)) { + SET_STACK_INT(1, -1); + } else { + SET_STACK_INT(0, -1); ++ // Decrement counter at checkcast. ++ BI_PROFILE_SUBTYPECHECK_FAILED(objKlass); + } ++ // Profile instanceof with null_seen and receiver. ++ BI_PROFILE_UPDATE_INSTANCEOF(/*null_seen=*/false, objKlass); + } + UPDATE_PC_AND_CONTINUE(3); + +@@ -2246,6 +2493,9 @@ + istate->set_callee_entry_point(method->from_interpreted_entry()); + istate->set_bcp_advance(5); + ++ // Invokedynamic has got a call counter, just like an invokestatic -> increment! ++ BI_PROFILE_UPDATE_CALL(); ++ + UPDATE_PC_AND_RETURN(0); // I'll be back... + } + +@@ -2278,6 +2528,9 @@ + istate->set_callee_entry_point(method->from_interpreted_entry()); + istate->set_bcp_advance(3); + ++ // Invokehandle has got a call counter, just like a final call -> increment! ++ BI_PROFILE_UPDATE_FINALCALL(); ++ + UPDATE_PC_AND_RETURN(0); // I'll be back... + } + +@@ -2305,14 +2558,18 @@ + CHECK_NULL(STACK_OBJECT(-(cache->parameter_size()))); + if (cache->is_vfinal()) { + callee = cache->f2_as_vfinal_method(); ++ // Profile 'special case of invokeinterface' final call. ++ BI_PROFILE_UPDATE_FINALCALL(); + } else { +- // get receiver ++ // Get receiver. + int parms = cache->parameter_size(); +- // Same comments as invokevirtual apply here +- VERIFY_OOP(STACK_OBJECT(-parms)); +- InstanceKlass* rcvrKlass = (InstanceKlass*) +- STACK_OBJECT(-parms)->klass(); ++ // Same comments as invokevirtual apply here. ++ oop rcvr = STACK_OBJECT(-parms); ++ VERIFY_OOP(rcvr); ++ InstanceKlass* rcvrKlass = (InstanceKlass*)rcvr->klass(); + callee = (Method*) rcvrKlass->start_of_vtable()[ cache->f2_as_index()]; ++ // Profile 'special case of invokeinterface' virtual call. ++ BI_PROFILE_UPDATE_VIRTUALCALL(rcvr->klass()); + } + istate->set_callee(callee); + istate->set_callee_entry_point(callee->from_interpreted_entry()); +@@ -2343,15 +2600,18 @@ + // interface. The link resolver checks this but only for the first + // time this interface is called. + if (i == int2->itable_length()) { +- VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), ""); ++ VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), "", note_no_trap); + } + int mindex = cache->f2_as_index(); + itableMethodEntry* im = ki->first_method_entry(rcvr->klass()); + callee = im[mindex].method(); + if (callee == NULL) { +- VM_JAVA_ERROR(vmSymbols::java_lang_AbstractMethodError(), ""); ++ VM_JAVA_ERROR(vmSymbols::java_lang_AbstractMethodError(), "", note_no_trap); + } + ++ // Profile virtual call. ++ BI_PROFILE_UPDATE_VIRTUALCALL(rcvr->klass()); ++ + istate->set_callee(callee); + istate->set_callee_entry_point(callee->from_interpreted_entry()); + #ifdef VM_JVMTI +@@ -2383,8 +2643,11 @@ + Method* callee; + if ((Bytecodes::Code)opcode == Bytecodes::_invokevirtual) { + CHECK_NULL(STACK_OBJECT(-(cache->parameter_size()))); +- if (cache->is_vfinal()) callee = cache->f2_as_vfinal_method(); +- else { ++ if (cache->is_vfinal()) { ++ callee = cache->f2_as_vfinal_method(); ++ // Profile final call. ++ BI_PROFILE_UPDATE_FINALCALL(); ++ } else { + // get receiver + int parms = cache->parameter_size(); + // this works but needs a resourcemark and seems to create a vtable on every call: +@@ -2393,8 +2656,9 @@ + // this fails with an assert + // InstanceKlass* rcvrKlass = InstanceKlass::cast(STACK_OBJECT(-parms)->klass()); + // but this works +- VERIFY_OOP(STACK_OBJECT(-parms)); +- InstanceKlass* rcvrKlass = (InstanceKlass*) STACK_OBJECT(-parms)->klass(); ++ oop rcvr = STACK_OBJECT(-parms); ++ VERIFY_OOP(rcvr); ++ InstanceKlass* rcvrKlass = (InstanceKlass*)rcvr->klass(); + /* + Executing this code in java.lang.String: + public String(char value[]) { +@@ -2412,12 +2676,17 @@ + + */ + callee = (Method*) rcvrKlass->start_of_vtable()[ cache->f2_as_index()]; ++ // Profile virtual call. ++ BI_PROFILE_UPDATE_VIRTUALCALL(rcvr->klass()); + } + } else { + if ((Bytecodes::Code)opcode == Bytecodes::_invokespecial) { + CHECK_NULL(STACK_OBJECT(-(cache->parameter_size()))); + } + callee = cache->f1_as_method(); ++ ++ // Profile call. ++ BI_PROFILE_UPDATE_CALL(); + } + + istate->set_callee(callee); +@@ -2439,6 +2708,9 @@ + jint size = STACK_INT(-1); + CALL_VM(InterpreterRuntime::newarray(THREAD, atype, size), + handle_exception); ++ // Must prevent reordering of stores for object initialization ++ // with stores that publish the new object. ++ OrderAccess::storestore(); + SET_STACK_OBJECT(THREAD->vm_result(), -1); + THREAD->set_vm_result(NULL); + +@@ -2469,6 +2741,8 @@ + CASE(_goto): + { + int16_t offset = (int16_t)Bytes::get_Java_u2(pc + 1); ++ // Profile jump. ++ BI_PROFILE_UPDATE_JUMP(); + address branch_pc = pc; + UPDATE_PC(offset); + DO_BACKEDGE_CHECKS(offset, branch_pc); +@@ -2485,6 +2759,8 @@ + CASE(_goto_w): + { + int32_t offset = Bytes::get_Java_u4(pc + 1); ++ // Profile jump. ++ BI_PROFILE_UPDATE_JUMP(); + address branch_pc = pc; + UPDATE_PC(offset); + DO_BACKEDGE_CHECKS(offset, branch_pc); +@@ -2494,6 +2770,9 @@ + /* return from a jsr or jsr_w */ + + CASE(_ret): { ++ // Profile ret. ++ BI_PROFILE_UPDATE_RET(/*bci=*/((int)(intptr_t)(LOCALS_ADDR(pc[1])))); ++ // Now, update the pc. + pc = istate->method()->code_base() + (intptr_t)(LOCALS_ADDR(pc[1])); + UPDATE_PC_AND_CONTINUE(0); + } +@@ -2567,23 +2846,26 @@ + if (TraceExceptions) { + ttyLocker ttyl; + ResourceMark rm; +- tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", except_oop->print_value_string(), except_oop()); ++ tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", except_oop->print_value_string(), (void*)except_oop()); + tty->print_cr(" thrown in interpreter method <%s>", METHOD->print_value_string()); + tty->print_cr(" at bci %d, continuing at %d for thread " INTPTR_FORMAT, +- pc - (intptr_t)METHOD->code_base(), ++ istate->bcp() - (intptr_t)METHOD->code_base(), + continuation_bci, THREAD); + } + // for AbortVMOnException flag + NOT_PRODUCT(Exceptions::debug_check_abort(except_oop)); ++ ++ // Update profiling data. ++ BI_PROFILE_ALIGN_TO_CURRENT_BCI(); + goto run; + } + if (TraceExceptions) { + ttyLocker ttyl; + ResourceMark rm; +- tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", except_oop->print_value_string(), except_oop()); ++ tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", except_oop->print_value_string(), (void*)except_oop()); + tty->print_cr(" thrown in interpreter method <%s>", METHOD->print_value_string()); + tty->print_cr(" at bci %d, unwinding for thread " INTPTR_FORMAT, +- pc - (intptr_t) METHOD->code_base(), ++ istate->bcp() - (intptr_t)METHOD->code_base(), + THREAD); + } + // for AbortVMOnException flag +@@ -2591,32 +2873,87 @@ + // No handler in this activation, unwind and try again + THREAD->set_pending_exception(except_oop(), NULL, 0); + goto handle_return; +- } /* handle_exception: */ +- +- ++ } // handle_exception: + + // Return from an interpreter invocation with the result of the interpretation + // on the top of the Java Stack (or a pending exception) + +-handle_Pop_Frame: +- +- // We don't really do anything special here except we must be aware +- // that we can get here without ever locking the method (if sync). +- // Also we skip the notification of the exit. +- +- istate->set_msg(popping_frame); +- // Clear pending so while the pop is in process +- // we don't start another one if a call_vm is done. +- THREAD->clr_pop_frame_pending(); +- // Let interpreter (only) see the we're in the process of popping a frame +- THREAD->set_pop_frame_in_process(); +- +-handle_return: +- { ++ handle_Pop_Frame: { ++ ++ // We don't really do anything special here except we must be aware ++ // that we can get here without ever locking the method (if sync). ++ // Also we skip the notification of the exit. ++ ++ istate->set_msg(popping_frame); ++ // Clear pending so while the pop is in process ++ // we don't start another one if a call_vm is done. ++ THREAD->clr_pop_frame_pending(); ++ // Let interpreter (only) see the we're in the process of popping a frame ++ THREAD->set_pop_frame_in_process(); ++ ++ goto handle_return; ++ ++ } // handle_Pop_Frame ++ ++ // ForceEarlyReturn ends a method, and returns to the caller with a return value ++ // given by the invoker of the early return. ++ handle_Early_Return: { ++ ++ istate->set_msg(early_return); ++ ++ // Clear expression stack. ++ topOfStack = istate->stack_base() - Interpreter::stackElementWords; ++ ++ JvmtiThreadState *ts = THREAD->jvmti_thread_state(); ++ ++ // Push the value to be returned. ++ switch (istate->method()->result_type()) { ++ case T_BOOLEAN: ++ case T_SHORT: ++ case T_BYTE: ++ case T_CHAR: ++ case T_INT: ++ SET_STACK_INT(ts->earlyret_value().i, 0); ++ MORE_STACK(1); ++ break; ++ case T_LONG: ++ SET_STACK_LONG(ts->earlyret_value().j, 1); ++ MORE_STACK(2); ++ break; ++ case T_FLOAT: ++ SET_STACK_FLOAT(ts->earlyret_value().f, 0); ++ MORE_STACK(1); ++ break; ++ case T_DOUBLE: ++ SET_STACK_DOUBLE(ts->earlyret_value().d, 1); ++ MORE_STACK(2); ++ break; ++ case T_ARRAY: ++ case T_OBJECT: ++ SET_STACK_OBJECT(ts->earlyret_oop(), 0); ++ MORE_STACK(1); ++ break; ++ } ++ ++ ts->clr_earlyret_value(); ++ ts->set_earlyret_oop(NULL); ++ ts->clr_earlyret_pending(); ++ ++ // Fall through to handle_return. ++ ++ } // handle_Early_Return ++ ++ handle_return: { ++ // A storestore barrier is required to order initialization of ++ // final fields with publishing the reference to the object that ++ // holds the field. Without the barrier the value of final fields ++ // can be observed to change. ++ OrderAccess::storestore(); ++ + DECACHE_STATE(); + +- bool suppress_error = istate->msg() == popping_frame; +- bool suppress_exit_event = THREAD->has_pending_exception() || suppress_error; ++ bool suppress_error = istate->msg() == popping_frame || istate->msg() == early_return; ++ bool suppress_exit_event = THREAD->has_pending_exception() || istate->msg() == popping_frame; + Handle original_exception(THREAD, THREAD->pending_exception()); + Handle illegal_state_oop(THREAD, NULL); + +@@ -2677,15 +3014,18 @@ + BasicLock* lock = end->lock(); + markOop header = lock->displaced_header(); + end->set_obj(NULL); +- // If it isn't recursive we either must swap old header or call the runtime +- if (header != NULL) { +- if (Atomic::cmpxchg_ptr(header, lockee->mark_addr(), lock) != lock) { +- // restore object for the slow case +- end->set_obj(lockee); +- { +- // Prevent any HandleMarkCleaner from freeing our live handles +- HandleMark __hm(THREAD); +- CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(THREAD, end)); ++ ++ if (!lockee->mark()->has_bias_pattern()) { ++ // If it isn't recursive we either must swap old header or call the runtime ++ if (header != NULL) { ++ if (Atomic::cmpxchg_ptr(header, lockee->mark_addr(), lock) != lock) { ++ // restore object for the slow case ++ end->set_obj(lockee); ++ { ++ // Prevent any HandleMarkCleaner from freeing our live handles ++ HandleMark __hm(THREAD); ++ CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(THREAD, end)); ++ } + } + } + } +@@ -2730,27 +3070,41 @@ + oop rcvr = base->obj(); + if (rcvr == NULL) { + if (!suppress_error) { +- VM_JAVA_ERROR_NO_JUMP(vmSymbols::java_lang_NullPointerException(), ""); ++ VM_JAVA_ERROR_NO_JUMP(vmSymbols::java_lang_NullPointerException(), "", note_nullCheck_trap); + illegal_state_oop = THREAD->pending_exception(); + THREAD->clear_pending_exception(); + } ++ } else if (UseHeavyMonitors) { ++ { ++ // Prevent any HandleMarkCleaner from freeing our live handles. ++ HandleMark __hm(THREAD); ++ CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(THREAD, base)); ++ } ++ if (THREAD->has_pending_exception()) { ++ if (!suppress_error) illegal_state_oop = THREAD->pending_exception(); ++ THREAD->clear_pending_exception(); ++ } + } else { + BasicLock* lock = base->lock(); + markOop header = lock->displaced_header(); + base->set_obj(NULL); +- // If it isn't recursive we either must swap old header or call the runtime +- if (header != NULL) { +- if (Atomic::cmpxchg_ptr(header, rcvr->mark_addr(), lock) != lock) { +- // restore object for the slow case +- base->set_obj(rcvr); +- { +- // Prevent any HandleMarkCleaner from freeing our live handles +- HandleMark __hm(THREAD); +- CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(THREAD, base)); +- } +- if (THREAD->has_pending_exception()) { +- if (!suppress_error) illegal_state_oop = THREAD->pending_exception(); +- THREAD->clear_pending_exception(); ++ ++ if (!rcvr->mark()->has_bias_pattern()) { ++ base->set_obj(NULL); ++ // If it isn't recursive we either must swap old header or call the runtime ++ if (header != NULL) { ++ if (Atomic::cmpxchg_ptr(header, rcvr->mark_addr(), lock) != lock) { ++ // restore object for the slow case ++ base->set_obj(rcvr); ++ { ++ // Prevent any HandleMarkCleaner from freeing our live handles ++ HandleMark __hm(THREAD); ++ CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(THREAD, base)); ++ } ++ if (THREAD->has_pending_exception()) { ++ if (!suppress_error) illegal_state_oop = THREAD->pending_exception(); ++ THREAD->clear_pending_exception(); ++ } + } + } + } +@@ -2758,6 +3112,8 @@ + } + } + } ++ // Clear the do_not_unlock flag now. ++ THREAD->clr_do_not_unlock(); + + // + // Notify jvmti/jvmdi +@@ -2802,15 +3158,14 @@ + // A pending exception that was pending prior to a possible popping frame + // overrides the popping frame. + // +- assert(!suppress_error || suppress_error && illegal_state_oop() == NULL, "Error was not suppressed"); ++ assert(!suppress_error || (suppress_error && illegal_state_oop() == NULL), "Error was not suppressed"); + if (illegal_state_oop() != NULL || original_exception() != NULL) { +- // inform the frame manager we have no result ++ // Inform the frame manager we have no result. + istate->set_msg(throwing_exception); + if (illegal_state_oop() != NULL) + THREAD->set_pending_exception(illegal_state_oop(), NULL, 0); + else + THREAD->set_pending_exception(original_exception(), NULL, 0); +- istate->set_return_kind((Bytecodes::Code)opcode); + UPDATE_PC_AND_RETURN(0); + } + +@@ -2829,13 +3184,12 @@ + LOCALS_SLOT(METHOD->size_of_parameters() - 1)); + THREAD->set_popframe_condition_bit(JavaThread::popframe_force_deopt_reexecution_bit); + } +- THREAD->clr_pop_frame_in_process(); ++ } else { ++ istate->set_msg(return_from_method); + } + + // Normal return + // Advance the pc and return to frame manager +- istate->set_msg(return_from_method); +- istate->set_return_kind((Bytecodes::Code)opcode); + UPDATE_PC_AND_RETURN(1); + } /* handle_return: */ + +@@ -2883,7 +3237,7 @@ + } + + oop BytecodeInterpreter::stack_object(intptr_t *tos, int offset) { +- return (oop)tos [Interpreter::expr_index_at(-offset)]; ++ return cast_to_oop(tos [Interpreter::expr_index_at(-offset)]); + } + + jdouble BytecodeInterpreter::stack_double(intptr_t *tos, int offset) { +@@ -2952,7 +3306,7 @@ + return (jfloat)locals[Interpreter::local_index_at(-offset)]; + } + oop BytecodeInterpreter::locals_object(intptr_t* locals, int offset) { +- return (oop)locals[Interpreter::local_index_at(-offset)]; ++ return cast_to_oop(locals[Interpreter::local_index_at(-offset)]); + } + jdouble BytecodeInterpreter::locals_double(intptr_t* locals, int offset) { + return ((VMJavaVal64*)&locals[Interpreter::local_index_at(-(offset+1))])->d; +@@ -3110,9 +3464,8 @@ + tty->print_cr("result_to_call._bcp_advance: %d ", this->_result._to_call._bcp_advance); + tty->print_cr("osr._osr_buf: " INTPTR_FORMAT, (uintptr_t) this->_result._osr._osr_buf); + tty->print_cr("osr._osr_entry: " INTPTR_FORMAT, (uintptr_t) this->_result._osr._osr_entry); +- tty->print_cr("result_return_kind 0x%x ", (int) this->_result._return_kind); + tty->print_cr("prev_link: " INTPTR_FORMAT, (uintptr_t) this->_prev_link); +- tty->print_cr("native_mirror: " INTPTR_FORMAT, (uintptr_t) this->_oop_temp); ++ tty->print_cr("native_mirror: " INTPTR_FORMAT, (void*) this->_oop_temp); + tty->print_cr("stack_base: " INTPTR_FORMAT, (uintptr_t) this->_stack_base); + tty->print_cr("stack_limit: " INTPTR_FORMAT, (uintptr_t) this->_stack_limit); + tty->print_cr("monitor_base: " INTPTR_FORMAT, (uintptr_t) this->_monitor_base); +@@ -3129,9 +3482,9 @@ + } + + extern "C" { +- void PI(uintptr_t arg) { +- ((BytecodeInterpreter*)arg)->print(); +- } ++ void PI(uintptr_t arg) { ++ ((BytecodeInterpreter*)arg)->print(); ++ } + } + #endif // PRODUCT + +--- ./hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -66,27 +66,26 @@ + typedef class BytecodeInterpreter* interpreterState; + + struct call_message { +- class Method* _callee; /* method to call during call_method request */ +- address _callee_entry_point; /* address to jump to for call_method request */ +- int _bcp_advance; /* size of the invoke bytecode operation */ ++ class Method* _callee; // method to call during call_method request ++ address _callee_entry_point; // address to jump to for call_method request ++ int _bcp_advance; // size of the invoke bytecode operation + }; + + struct osr_message { +- address _osr_buf; /* the osr buffer */ +- address _osr_entry; /* the entry to the osr method */ ++ address _osr_buf; // the osr buffer ++ address _osr_entry; // the entry to the osr method + }; + + struct osr_result { +- nmethod* nm; /* osr nmethod */ +- address return_addr; /* osr blob return address */ ++ nmethod* nm; // osr nmethod ++ address return_addr; // osr blob return address + }; + + // Result returned to frame manager + union frame_manager_message { +- call_message _to_call; /* describes callee */ +- Bytecodes::Code _return_kind; /* i_return, a_return, ... */ +- osr_message _osr; /* describes the osr */ +- osr_result _osr_result; /* result of OSR request */ ++ call_message _to_call; // describes callee ++ osr_message _osr; // describes the osr ++ osr_result _osr_result; // result of OSR request + }; + + class BytecodeInterpreter : StackObj { +@@ -115,7 +114,8 @@ + more_monitors, // need a new monitor + throwing_exception, // unwind stack and rethrow + popping_frame, // unwind call and retry call +- do_osr // request this invocation be OSR's ++ do_osr, // request this invocation be OSR's ++ early_return // early return as commanded by jvmti + }; + + private: +@@ -216,8 +216,6 @@ + inline int bcp_advance() { return _result._to_call._bcp_advance; } + inline void set_bcp_advance(int count) { _result._to_call._bcp_advance = count; } + +-inline void set_return_kind(Bytecodes::Code kind) { _result._return_kind = kind; } +- + inline interpreterState prev() { return _prev_link; } + + inline intptr_t* stack() { return _stack; } +--- ./hotspot/src/share/vm/interpreter/bytecodeInterpreterProfiling.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/interpreter/bytecodeInterpreterProfiling.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,308 @@ ++/* ++ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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 defines a set of macros which are used by the c++-interpreter ++// for updating a method's methodData object. ++ ++ ++#ifndef SHARE_VM_INTERPRETER_BYTECODEINTERPRETERPROFILING_HPP ++#define SHARE_VM_INTERPRETER_BYTECODEINTERPRETERPROFILING_HPP ++ ++ ++// Global settings ///////////////////////////////////////////////////////////// ++ ++ ++// Enables profiling support. ++#if defined(COMPILER2) ++#define CC_INTERP_PROFILE ++#endif ++ ++// Enables assertions for profiling code (also works in product-builds). ++// #define CC_INTERP_PROFILE_WITH_ASSERTIONS ++ ++ ++#ifdef CC_INTERP ++ ++// Empty dummy implementations if profiling code is switched off. ////////////// ++ ++#ifndef CC_INTERP_PROFILE ++ ++#define SET_MDX(mdx) ++ ++#define BI_PROFILE_GET_OR_CREATE_METHOD_DATA(exception_handler) \ ++ if (ProfileInterpreter) { \ ++ ShouldNotReachHere(); \ ++ } ++ ++#define BI_PROFILE_ALIGN_TO_CURRENT_BCI() ++ ++#define BI_PROFILE_UPDATE_JUMP() ++#define BI_PROFILE_UPDATE_BRANCH(is_taken) ++#define BI_PROFILE_UPDATE_RET(bci) ++#define BI_PROFILE_SUBTYPECHECK_FAILED(receiver) ++#define BI_PROFILE_UPDATE_CHECKCAST(null_seen, receiver) ++#define BI_PROFILE_UPDATE_INSTANCEOF(null_seen, receiver) ++#define BI_PROFILE_UPDATE_CALL() ++#define BI_PROFILE_UPDATE_FINALCALL() ++#define BI_PROFILE_UPDATE_VIRTUALCALL(receiver) ++#define BI_PROFILE_UPDATE_SWITCH(switch_index) ++ ++ ++#else ++ ++ ++// Non-dummy implementations /////////////////////////////////////////////////// ++ ++// Accessors for the current method data pointer 'mdx'. ++#define MDX() (istate->mdx()) ++#define SET_MDX(mdx) \ ++ if (TraceProfileInterpreter) { \ ++ /* Let it look like TraceBytecodes' format. */ \ ++ tty->print_cr("[%d] %4d " \ ++ "mdx " PTR_FORMAT "(%d)" \ ++ " " \ ++ " \t-> " PTR_FORMAT "(%d)", \ ++ (int) THREAD->osthread()->thread_id(), \ ++ BCI(), \ ++ MDX(), \ ++ (MDX() == NULL \ ++ ? 0 \ ++ : istate->method()->method_data()->dp_to_di((address)MDX())), \ ++ mdx, \ ++ istate->method()->method_data()->dp_to_di((address)mdx) \ ++ ); \ ++ }; \ ++ istate->set_mdx(mdx); ++ ++ ++// Dumps the profiling method data for the current method. ++#ifdef PRODUCT ++#define BI_PROFILE_PRINT_METHOD_DATA() ++#else // PRODUCT ++#define BI_PROFILE_PRINT_METHOD_DATA() \ ++ { \ ++ ttyLocker ttyl; \ ++ MethodData *md = istate->method()->method_data(); \ ++ tty->cr(); \ ++ tty->print("method data at mdx " PTR_FORMAT "(0) for", \ ++ md->data_layout_at(md->bci_to_di(0))); \ ++ istate->method()->print_short_name(tty); \ ++ tty->cr(); \ ++ if (md != NULL) { \ ++ md->print_data_on(tty); \ ++ address mdx = (address) MDX(); \ ++ if (mdx != NULL) { \ ++ tty->print_cr("current mdx " PTR_FORMAT "(%d)", \ ++ mdx, \ ++ istate->method()->method_data()->dp_to_di(mdx)); \ ++ } \ ++ } else { \ ++ tty->print_cr("no method data"); \ ++ } \ ++ } ++#endif // PRODUCT ++ ++ ++// Gets or creates the profiling method data and initializes mdx. ++#define BI_PROFILE_GET_OR_CREATE_METHOD_DATA(exception_handler) \ ++ if (ProfileInterpreter && MDX() == NULL) { \ ++ /* Mdx is not yet initialized for this activation. */ \ ++ MethodData *md = istate->method()->method_data(); \ ++ if (md == NULL) { \ ++ MethodCounters* mcs; \ ++ GET_METHOD_COUNTERS(mcs); \ ++ /* The profiling method data doesn't exist for this method, */ \ ++ /* create it if the counters have overflowed. */ \ ++ if (mcs->invocation_counter() \ ++ ->reached_ProfileLimit(mcs->backedge_counter())) { \ ++ /* Must use CALL_VM, because an async exception may be pending. */ \ ++ CALL_VM((InterpreterRuntime::profile_method(THREAD)), \ ++ exception_handler); \ ++ md = istate->method()->method_data(); \ ++ if (md != NULL) { \ ++ if (TraceProfileInterpreter) { \ ++ BI_PROFILE_PRINT_METHOD_DATA(); \ ++ } \ ++ Method *m = istate->method(); \ ++ int bci = m->bci_from(pc); \ ++ jint di = md->bci_to_di(bci); \ ++ SET_MDX(md->data_layout_at(di)); \ ++ } \ ++ } \ ++ } else { \ ++ /* The profiling method data exists, align the method data pointer */ \ ++ /* mdx to the current bytecode index. */ \ ++ if (TraceProfileInterpreter) { \ ++ BI_PROFILE_PRINT_METHOD_DATA(); \ ++ } \ ++ SET_MDX(md->data_layout_at(md->bci_to_di(BCI()))); \ ++ } \ ++ } ++ ++ ++// Asserts that the current method data pointer mdx corresponds ++// to the current bytecode. ++#if defined(CC_INTERP_PROFILE_WITH_ASSERTIONS) ++#define BI_PROFILE_CHECK_MDX() \ ++ { \ ++ MethodData *md = istate->method()->method_data(); \ ++ address mdx = (address) MDX(); \ ++ address mdx2 = (address) md->data_layout_at(md->bci_to_di(BCI())); \ ++ guarantee(md != NULL, "1"); \ ++ guarantee(mdx != NULL, "2"); \ ++ guarantee(mdx2 != NULL, "3"); \ ++ if (mdx != mdx2) { \ ++ BI_PROFILE_PRINT_METHOD_DATA(); \ ++ fatal3("invalid mdx at bci %d:" \ ++ " was " PTR_FORMAT \ ++ " but expected " PTR_FORMAT, \ ++ BCI(), \ ++ mdx, \ ++ mdx2); \ ++ } \ ++ } ++#else ++#define BI_PROFILE_CHECK_MDX() ++#endif ++ ++ ++// Aligns the method data pointer mdx to the current bytecode index. ++#define BI_PROFILE_ALIGN_TO_CURRENT_BCI() \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ MethodData *md = istate->method()->method_data(); \ ++ SET_MDX(md->data_layout_at(md->bci_to_di(BCI()))); \ ++ } ++ ++ ++// Updates profiling data for a jump. ++#define BI_PROFILE_UPDATE_JUMP() \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ BI_PROFILE_CHECK_MDX(); \ ++ JumpData::increment_taken_count_no_overflow(MDX()); \ ++ /* Remember last branch taken count. */ \ ++ mdo_last_branch_taken_count = JumpData::taken_count(MDX()); \ ++ SET_MDX(JumpData::advance_taken(MDX())); \ ++ } ++ ++ ++// Updates profiling data for a taken/not taken branch. ++#define BI_PROFILE_UPDATE_BRANCH(is_taken) \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ BI_PROFILE_CHECK_MDX(); \ ++ if (is_taken) { \ ++ BranchData::increment_taken_count_no_overflow(MDX()); \ ++ /* Remember last branch taken count. */ \ ++ mdo_last_branch_taken_count = BranchData::taken_count(MDX()); \ ++ SET_MDX(BranchData::advance_taken(MDX())); \ ++ } else { \ ++ BranchData::increment_not_taken_count_no_overflow(MDX()); \ ++ SET_MDX(BranchData::advance_not_taken(MDX())); \ ++ } \ ++ } ++ ++ ++// Updates profiling data for a ret with given bci. ++#define BI_PROFILE_UPDATE_RET(bci) \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ BI_PROFILE_CHECK_MDX(); \ ++ MethodData *md = istate->method()->method_data(); \ ++/* FIXME: there is more to do here than increment and advance(mdx)! */ \ ++ CounterData::increment_count_no_overflow(MDX()); \ ++ SET_MDX(RetData::advance(md, bci)); \ ++ } ++ ++// Decrement counter at checkcast if the subtype check fails (as template ++// interpreter does!). ++#define BI_PROFILE_SUBTYPECHECK_FAILED(receiver) \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ BI_PROFILE_CHECK_MDX(); \ ++ ReceiverTypeData::increment_receiver_count_no_overflow(MDX(), receiver); \ ++ ReceiverTypeData::decrement_count(MDX()); \ ++ } ++ ++// Updates profiling data for a checkcast (was a null seen? which receiver?). ++#define BI_PROFILE_UPDATE_CHECKCAST(null_seen, receiver) \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ BI_PROFILE_CHECK_MDX(); \ ++ if (null_seen) { \ ++ ReceiverTypeData::set_null_seen(MDX()); \ ++ } else { \ ++ /* Template interpreter doesn't increment count. */ \ ++ /* ReceiverTypeData::increment_count_no_overflow(MDX()); */ \ ++ ReceiverTypeData::increment_receiver_count_no_overflow(MDX(), receiver); \ ++ } \ ++ SET_MDX(ReceiverTypeData::advance(MDX())); \ ++ } ++ ++ ++// Updates profiling data for an instanceof (was a null seen? which receiver?). ++#define BI_PROFILE_UPDATE_INSTANCEOF(null_seen, receiver) \ ++ BI_PROFILE_UPDATE_CHECKCAST(null_seen, receiver) ++ ++ ++// Updates profiling data for a call. ++#define BI_PROFILE_UPDATE_CALL() \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ BI_PROFILE_CHECK_MDX(); \ ++ CounterData::increment_count_no_overflow(MDX()); \ ++ SET_MDX(CounterData::advance(MDX())); \ ++ } ++ ++ ++// Updates profiling data for a final call. ++#define BI_PROFILE_UPDATE_FINALCALL() \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ BI_PROFILE_CHECK_MDX(); \ ++ VirtualCallData::increment_count_no_overflow(MDX()); \ ++ SET_MDX(VirtualCallData::advance(MDX())); \ ++ } ++ ++ ++// Updates profiling data for a virtual call with given receiver Klass. ++#define BI_PROFILE_UPDATE_VIRTUALCALL(receiver) \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ BI_PROFILE_CHECK_MDX(); \ ++ VirtualCallData::increment_receiver_count_no_overflow(MDX(), receiver); \ ++ SET_MDX(VirtualCallData::advance(MDX())); \ ++ } ++ ++ ++// Updates profiling data for a switch (tabelswitch or lookupswitch) with ++// given taken index (-1 means default case was taken). ++#define BI_PROFILE_UPDATE_SWITCH(switch_index) \ ++ if (ProfileInterpreter && MDX() != NULL) { \ ++ BI_PROFILE_CHECK_MDX(); \ ++ MultiBranchData::increment_count_no_overflow(MDX(), switch_index); \ ++ SET_MDX(MultiBranchData::advance(MDX(), switch_index)); \ ++ } ++ ++ ++// The end ///////////////////////////////////////////////////////////////////// ++ ++#endif // CC_INTERP_PROFILE ++ ++#endif // CC_INTERP ++ ++#endif // SHARE_VM_INTERPRETER_BYTECODECINTERPRETERPROFILING_HPP +--- ./hotspot/src/share/vm/interpreter/bytecodeTracer.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/bytecodeTracer.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -215,7 +215,7 @@ + st->print_cr(" %s", buf); + } + } else { +- st->print_cr(" " PTR_FORMAT, (void *)value); ++ st->print_cr(" " PTR_FORMAT, p2i((void *)value)); + } + } + +@@ -284,7 +284,7 @@ + if (i >= 0 && i < climit) { + cp_index = cache->entry_at(i)->constant_pool_index(); + } else { +- st->print_cr(" not in CP[*]?", i); ++ st->print_cr("%d not in CP[*]?", i); + return false; + } + return true; +@@ -299,7 +299,7 @@ + cp_index = constants->object_to_cp_index(i); + return true; + } else { +- st->print_cr(" not in OBJ[*]?", i); ++ st->print_cr("%d not in OBJ[*]?", i); + return false; + } + } +@@ -323,7 +323,7 @@ + if (tag.is_int()) { + st->print_cr(" " INT32_FORMAT, constants->int_at(i)); + } else if (tag.is_long()) { +- st->print_cr(" " INT64_FORMAT, constants->long_at(i)); ++ st->print_cr(" " INT64_FORMAT, (int64_t)(constants->long_at(i))); + } else if (tag.is_float()) { + st->print_cr(" %f", constants->float_at(i)); + } else if (tag.is_double()) { +@@ -342,7 +342,7 @@ + } else if (tag.is_method_handle()) { + int kind = constants->method_handle_ref_kind_at(i); + int i2 = constants->method_handle_index_at(i); +- st->print(" ", kind, i2); ++ st->print(" ", kind, i2); + print_field_or_method(-i, i2, st); + } else { + st->print_cr(" bad tag=%d at %d", tag.value(), i); +@@ -391,6 +391,7 @@ + } + + ++PRAGMA_FORMAT_NONLITERAL_IGNORED_EXTERNAL + void BytecodePrinter::print_attributes(int bci, outputStream* st) { + // Show attributes of pre-rewritten codes + Bytecodes::Code code = Bytecodes::java_code(raw_code()); +@@ -517,7 +518,10 @@ + int idx = ll - lo; + const char *format = first ? " %d:" INT32_FORMAT " (delta: %d)" : + ", %d:" INT32_FORMAT " (delta: %d)"; ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL + st->print(format, ll, dest[idx], dest[idx]-bci); ++PRAGMA_DIAG_POP + } + st->cr(); + } +@@ -537,7 +541,10 @@ + for (int ll = 0; ll < len; ll++, first = false) { + const char *format = first ? " " INT32_FORMAT ":" INT32_FORMAT : + ", " INT32_FORMAT ":" INT32_FORMAT ; ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL + st->print(format, key[ll], dest[ll]); ++PRAGMA_DIAG_POP + } + st->cr(); + } +@@ -596,7 +603,7 @@ + if (data != NULL) { + st->print(" %d", mdo->dp_to_di(data->dp())); + st->fill_to(6); +- data->print_data_on(st); ++ data->print_data_on(st, mdo); + } + } + } +--- ./hotspot/src/share/vm/interpreter/interpreter.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/interpreter.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -72,7 +72,7 @@ + if (description() != NULL) st->print("%s ", description()); + if (bytecode() >= 0 ) st->print("%d %s ", bytecode(), Bytecodes::name(bytecode())); + st->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "] %d bytes", +- code_begin(), code_end(), code_size()); ++ p2i(code_begin()), p2i(code_end()), code_size()); + + if (PrintInterpreter) { + st->cr(); +--- ./hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -75,6 +75,8 @@ + #include "opto/runtime.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + class UnlockFlagSaver { + private: + JavaThread* _thread; +@@ -241,18 +243,15 @@ + //------------------------------------------------------------------------------------------------------------------------ + // Exceptions + +-// Assume the compiler is (or will be) interested in this event. +-// If necessary, create an MDO to hold the information, and record it. +-void InterpreterRuntime::note_trap(JavaThread* thread, int reason, TRAPS) { +- assert(ProfileTraps, "call me only if profiling"); +- methodHandle trap_method(thread, method(thread)); +- ++void InterpreterRuntime::note_trap_inner(JavaThread* thread, int reason, ++ methodHandle trap_method, int trap_bci, TRAPS) { + if (trap_method.not_null()) { + MethodData* trap_mdo = trap_method->method_data(); + if (trap_mdo == NULL) { + Method::build_interpreter_method_data(trap_method, THREAD); + if (HAS_PENDING_EXCEPTION) { +- assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here"); ++ assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), ++ "we expect only an OOM error here"); + CLEAR_PENDING_EXCEPTION; + } + trap_mdo = trap_method->method_data(); +@@ -261,12 +260,42 @@ + if (trap_mdo != NULL) { + // Update per-method count of trap events. The interpreter + // is updating the MDO to simulate the effect of compiler traps. +- int trap_bci = trap_method->bci_from(bcp(thread)); + Deoptimization::update_method_data_from_interpreter(trap_mdo, trap_bci, reason); + } + } + } + ++// Assume the compiler is (or will be) interested in this event. ++// If necessary, create an MDO to hold the information, and record it. ++void InterpreterRuntime::note_trap(JavaThread* thread, int reason, TRAPS) { ++ assert(ProfileTraps, "call me only if profiling"); ++ methodHandle trap_method(thread, method(thread)); ++ int trap_bci = trap_method->bci_from(bcp(thread)); ++ note_trap_inner(thread, reason, trap_method, trap_bci, THREAD); ++} ++ ++#ifdef CC_INTERP ++// As legacy note_trap, but we have more arguments. ++IRT_ENTRY(void, InterpreterRuntime::note_trap(JavaThread* thread, int reason, Method *method, int trap_bci)) ++ methodHandle trap_method(method); ++ note_trap_inner(thread, reason, trap_method, trap_bci, THREAD); ++IRT_END ++ ++// Class Deoptimization is not visible in BytecodeInterpreter, so we need a wrapper ++// for each exception. ++void InterpreterRuntime::note_nullCheck_trap(JavaThread* thread, Method *method, int trap_bci) ++ { if (ProfileTraps) note_trap(thread, Deoptimization::Reason_null_check, method, trap_bci); } ++void InterpreterRuntime::note_div0Check_trap(JavaThread* thread, Method *method, int trap_bci) ++ { if (ProfileTraps) note_trap(thread, Deoptimization::Reason_div0_check, method, trap_bci); } ++void InterpreterRuntime::note_rangeCheck_trap(JavaThread* thread, Method *method, int trap_bci) ++ { if (ProfileTraps) note_trap(thread, Deoptimization::Reason_range_check, method, trap_bci); } ++void InterpreterRuntime::note_classCheck_trap(JavaThread* thread, Method *method, int trap_bci) ++ { if (ProfileTraps) note_trap(thread, Deoptimization::Reason_class_check, method, trap_bci); } ++void InterpreterRuntime::note_arrayCheck_trap(JavaThread* thread, Method *method, int trap_bci) ++ { if (ProfileTraps) note_trap(thread, Deoptimization::Reason_array_check, method, trap_bci); } ++#endif // CC_INTERP ++ ++ + static Handle get_preinitialized_exception(Klass* k, TRAPS) { + // get klass + InstanceKlass* klass = InstanceKlass::cast(k); +--- ./hotspot/src/share/vm/interpreter/interpreterRuntime.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/interpreterRuntime.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -66,9 +66,15 @@ + + static ConstantPoolCacheEntry* cache_entry_at(JavaThread *thread, int i) { return method(thread)->constants()->cache()->entry_at(i); } + static ConstantPoolCacheEntry* cache_entry(JavaThread *thread) { return cache_entry_at(thread, Bytes::get_native_u2(bcp(thread) + 1)); } ++ static void note_trap_inner(JavaThread* thread, int reason, ++ methodHandle trap_method, int trap_bci, TRAPS); + static void note_trap(JavaThread *thread, int reason, TRAPS); ++#ifdef CC_INTERP ++ // Profile traps in C++ interpreter. ++ static void note_trap(JavaThread* thread, int reason, Method *method, int trap_bci); ++#endif // CC_INTERP + +- // Inner work method for Interpreter's frequency counter overflow ++ // Inner work method for Interpreter's frequency counter overflow. + static nmethod* frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp); + + public: +@@ -100,6 +106,17 @@ + #endif + static void throw_pending_exception(JavaThread* thread); + ++#ifdef CC_INTERP ++ // Profile traps in C++ interpreter. ++ static void note_nullCheck_trap (JavaThread* thread, Method *method, int trap_bci); ++ static void note_div0Check_trap (JavaThread* thread, Method *method, int trap_bci); ++ static void note_rangeCheck_trap(JavaThread* thread, Method *method, int trap_bci); ++ static void note_classCheck_trap(JavaThread* thread, Method *method, int trap_bci); ++ static void note_arrayCheck_trap(JavaThread* thread, Method *method, int trap_bci); ++ // A dummy for makros that shall not profile traps. ++ static void note_no_trap(JavaThread* thread, Method *method, int trap_bci) {} ++#endif // CC_INTERP ++ + // Statics & fields + static void resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode); + +--- ./hotspot/src/share/vm/interpreter/invocationCounter.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/invocationCounter.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -99,16 +99,24 @@ + int get_BackwardBranchLimit() const { return InterpreterBackwardBranchLimit >> number_of_noncount_bits; } + int get_ProfileLimit() const { return InterpreterProfileLimit >> number_of_noncount_bits; } + ++#ifdef CC_INTERP + // Test counter using scaled limits like the asm interpreter would do rather than doing + // the shifts to normalize the counter. +- +- bool reached_InvocationLimit() const { return _counter >= (unsigned int) InterpreterInvocationLimit; } +- bool reached_BackwardBranchLimit() const { return _counter >= (unsigned int) InterpreterBackwardBranchLimit; } +- +- // Do this just like asm interpreter does for max speed +- bool reached_ProfileLimit(InvocationCounter *back_edge_count) const { +- return (_counter && count_mask) + back_edge_count->_counter >= (unsigned int) InterpreterProfileLimit; ++ // Checks sum of invocation_counter and backedge_counter as the template interpreter does. ++ bool reached_InvocationLimit(InvocationCounter *back_edge_count) const { ++ return (_counter & count_mask) + (back_edge_count->_counter & count_mask) >= ++ (unsigned int) InterpreterInvocationLimit; + } ++ bool reached_BackwardBranchLimit(InvocationCounter *back_edge_count) const { ++ return (_counter & count_mask) + (back_edge_count->_counter & count_mask) >= ++ (unsigned int) InterpreterBackwardBranchLimit; ++ } ++ // Do this just like asm interpreter does for max speed. ++ bool reached_ProfileLimit(InvocationCounter *back_edge_count) const { ++ return (_counter & count_mask) + (back_edge_count->_counter & count_mask) >= ++ (unsigned int) InterpreterProfileLimit; ++ } ++#endif // CC_INTERP + + void increment() { _counter += count_increment; } + +--- ./hotspot/src/share/vm/interpreter/linkResolver.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/linkResolver.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -243,7 +243,8 @@ + // Look up method in klasses, including static methods + // Then look up local default methods + void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS) { +- Method* result_oop = klass->uncached_lookup_method(name, signature); ++ // Ignore overpasses so statics can be found during resolution ++ Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::skip_overpass); + + // JDK 8, JVMS 5.4.3.4: Interface method resolution should + // ignore static and non-public methods of java.lang.Object, +@@ -256,6 +257,12 @@ + result_oop = NULL; + } + ++ // Before considering default methods, check for an overpass in the ++ // current class if a method has not been found. ++ if (result_oop == NULL) { ++ result_oop = InstanceKlass::cast(klass())->find_method(name, signature); ++ } ++ + if (result_oop == NULL) { + Array* default_methods = InstanceKlass::cast(klass())->default_methods(); + if (default_methods != NULL) { +@@ -276,11 +283,11 @@ + // returns first instance method + // Looks up method in classes, then looks up local default methods + void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) { +- Method* result_oop = klass->uncached_lookup_method(name, signature); ++ Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::normal); + result = methodHandle(THREAD, result_oop); + while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) { + KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super()); +- result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature)); ++ result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, Klass::normal)); + } + + if (result.is_null()) { +@@ -302,7 +309,7 @@ + // First check in default method array + if (!resolved_method->is_abstract() && + (InstanceKlass::cast(klass())->default_methods() != NULL)) { +- int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature); ++ int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature, false); + if (index >= 0 ) { + vtable_index = InstanceKlass::cast(klass())->default_vtable_indices()->at(index); + } +@@ -322,7 +329,7 @@ + // Specify 'true' in order to skip default methods when searching the + // interfaces. Function lookup_method_in_klasses() already looked for + // the method in the default methods table. +- result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, true)); ++ result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, Klass::skip_defaults)); + } + + void LinkResolver::lookup_polymorphic_method(methodHandle& result, +@@ -564,16 +571,7 @@ + } + } + +- // 5. check if method is concrete +- if (resolved_method->is_abstract() && !resolved_klass->is_abstract()) { +- ResourceMark rm(THREAD); +- THROW_MSG(vmSymbols::java_lang_AbstractMethodError(), +- Method::name_and_sig_as_C_string(resolved_klass(), +- method_name, +- method_signature)); +- } +- +- // 6. access checks, access checking may be turned off when calling from within the VM. ++ // 5. access checks, access checking may be turned off when calling from within the VM. + if (check_access) { + assert(current_klass.not_null() , "current_klass should not be null"); + +@@ -649,16 +647,6 @@ + } + } + +- if (nostatics && resolved_method->is_static()) { +- ResourceMark rm(THREAD); +- char buf[200]; +- jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s", Method::name_and_sig_as_C_string(resolved_klass(), +- resolved_method->name(), +- resolved_method->signature())); +- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); +- } +- +- + if (check_access) { + // JDK8 adds non-public interface methods, and accessability check requirement + assert(current_klass.not_null() , "current_klass should not be null"); +@@ -702,6 +690,15 @@ + } + } + ++ if (nostatics && resolved_method->is_static()) { ++ ResourceMark rm(THREAD); ++ char buf[200]; ++ jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s", ++ Method::name_and_sig_as_C_string(resolved_klass(), ++ resolved_method->name(), resolved_method->signature())); ++ THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); ++ } ++ + if (TraceItables && Verbose) { + ResourceMark rm(THREAD); + tty->print("invokeinterface resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ", +@@ -1633,7 +1630,7 @@ + THREAD); + if (HAS_PENDING_EXCEPTION) { + if (TraceMethodHandles) { +- tty->print_cr("invokedynamic throws BSME for "INTPTR_FORMAT, (void *)PENDING_EXCEPTION); ++ tty->print_cr("invokedynamic throws BSME for " INTPTR_FORMAT, p2i((void *)PENDING_EXCEPTION)); + PENDING_EXCEPTION->print(); + } + if (PENDING_EXCEPTION->is_a(SystemDictionary::BootstrapMethodError_klass())) { +--- ./hotspot/src/share/vm/interpreter/oopMapCache.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/oopMapCache.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -31,6 +31,8 @@ + #include "runtime/handles.inline.hpp" + #include "runtime/signature.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + class OopMapCacheEntry: private InterpreterOopMap { + friend class InterpreterOopMap; + friend class OopMapForCacheEntry; +--- ./hotspot/src/share/vm/interpreter/rewriter.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/rewriter.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -250,8 +250,8 @@ + // We will reverse the bytecode rewriting _after_ adjusting them. + // Adjust the cache index by offset to the invokedynamic entries in the + // cpCache plus the delta if the invokedynamic bytecodes were adjusted. +- cache_index = cp_cache_delta() + _first_iteration_cp_cache_limit; +- int cp_index = invokedynamic_cp_cache_entry_pool_index(cache_index); ++ int adjustment = cp_cache_delta() + _first_iteration_cp_cache_limit; ++ int cp_index = invokedynamic_cp_cache_entry_pool_index(cache_index - adjustment); + assert(_pool->tag_at(cp_index).is_invoke_dynamic(), "wrong index"); + // zero out 4 bytes + Bytes::put_Java_u4(p, 0); +@@ -453,18 +453,7 @@ + return method; + } + +-void Rewriter::rewrite(instanceKlassHandle klass, TRAPS) { +- ResourceMark rm(THREAD); +- Rewriter rw(klass, klass->constants(), klass->methods(), CHECK); +- // (That's all, folks.) +-} +- +- +-Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array* methods, TRAPS) +- : _klass(klass), +- _pool(cpool), +- _methods(methods) +-{ ++void Rewriter::rewrite_bytecodes(TRAPS) { + assert(_pool->cache() == NULL, "constant pool cache must not be set yet"); + + // determine index maps for Method* rewriting +@@ -508,6 +497,29 @@ + // May have to fix invokedynamic bytecodes if invokestatic/InterfaceMethodref + // entries had to be added. + patch_invokedynamic_bytecodes(); ++} ++ ++void Rewriter::rewrite(instanceKlassHandle klass, TRAPS) { ++ ResourceMark rm(THREAD); ++ Rewriter rw(klass, klass->constants(), klass->methods(), CHECK); ++ // (That's all, folks.) ++} ++ ++ ++Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array* methods, TRAPS) ++ : _klass(klass), ++ _pool(cpool), ++ _methods(methods) ++{ ++ ++ // Rewrite bytecodes - exception here exits. ++ rewrite_bytecodes(CHECK); ++ ++ // Stress restoring bytecodes ++ if (StressRewriter) { ++ restore_bytecodes(); ++ rewrite_bytecodes(CHECK); ++ } + + // allocate constant pool cache, now that we've seen all the bytecodes + make_constant_pool_cache(THREAD); +@@ -523,6 +535,7 @@ + // so methods with jsrs in custom class lists in aren't attempted to be + // rewritten in the RO section of the shared archive. + // Relocated bytecodes don't have to be restored, only the cp cache entries ++ int len = _methods->length(); + for (int i = len-1; i >= 0; i--) { + methodHandle m(THREAD, _methods->at(i)); + +--- ./hotspot/src/share/vm/interpreter/rewriter.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/rewriter.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -199,6 +199,9 @@ + + void patch_invokedynamic_bytecodes(); + ++ // Do all the work. ++ void rewrite_bytecodes(TRAPS); ++ + // Revert bytecodes in case of an exception. + void restore_bytecodes(); + +--- ./hotspot/src/share/vm/interpreter/templateInterpreter.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/templateInterpreter.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -104,7 +104,7 @@ + tty->print("["); + for (int i = 0; i < number_of_states; i++) { + if (i > 0) tty->print(", "); +- tty->print(INTPTR_FORMAT, _entry[i]); ++ tty->print(INTPTR_FORMAT, p2i(_entry[i])); + } + tty->print("]"); + } +--- ./hotspot/src/share/vm/interpreter/templateTable.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/templateTable.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -40,8 +40,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "interp_masm_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "interp_masm_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "interp_masm_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "interp_masm_ppc_64.hpp" + #endif + + #ifndef CC_INTERP +@@ -370,8 +373,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "templateTable_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "templateTable_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "templateTable_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "templateTable_ppc_64.hpp" + #endif + + }; +--- ./hotspot/src/share/vm/libadt/dict.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/libadt/dict.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2010, 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 +@@ -38,6 +38,8 @@ + + #include + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // The iostream is not needed and it gets confused for gcc by the + // define of bool. + // +--- ./hotspot/src/share/vm/libadt/port.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/libadt/port.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -91,8 +91,6 @@ + #define IMPLEMENTATION + #include + #include +-inline int min( int a, int b) { return a < b ? a : b; } +-inline int max( int a, int b) { return a > b ? a : b; } + + #elif defined(_MSC_VER) + // Microsoft Visual C++ +--- ./hotspot/src/share/vm/libadt/set.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/libadt/set.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -116,7 +116,7 @@ + void Set::print() const + { + char *printable_set = setstr(); +- tty->print_cr(printable_set); ++ tty->print_cr("%s", printable_set); + FreeHeap(printable_set); + } + +--- ./hotspot/src/share/vm/memory/allocation.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/allocation.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -45,6 +45,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +@@ -71,13 +74,12 @@ + return MetaspaceShared::is_in_shared_space(this); + } + +- + bool MetaspaceObj::is_metaspace_object() const { + return Metaspace::contains((void*)this); + } + + void MetaspaceObj::print_address_on(outputStream* st) const { +- st->print(" {"INTPTR_FORMAT"}", this); ++ st->print(" {" INTPTR_FORMAT "}", p2i(this)); + } + + void* ResourceObj::operator new(size_t size, allocation_type type, MEMFLAGS flags) throw() { +@@ -140,7 +142,7 @@ + void ResourceObj::set_allocation_type(address res, allocation_type type) { + // Set allocation type in the resource object + uintptr_t allocation = (uintptr_t)res; +- assert((allocation & allocation_mask) == 0, "address should be aligned to 4 bytes at least"); ++ assert((allocation & allocation_mask) == 0, err_msg("address should be aligned to 4 bytes at least: " INTPTR_FORMAT, p2i(res))); + assert(type <= allocation_mask, "incorrect allocation type"); + ResourceObj* resobj = (ResourceObj *)res; + resobj->_allocation_t[0] = ~(allocation + type); +@@ -177,7 +179,7 @@ + // Operator new() was called and type was set. + assert(!allocated_on_stack(), + err_msg("not embedded or stack, this(" PTR_FORMAT ") type %d a[0]=(" PTR_FORMAT ") a[1]=(" PTR_FORMAT ")", +- this, get_allocation_type(), _allocation_t[0], _allocation_t[1])); ++ p2i(this), get_allocation_type(), _allocation_t[0], _allocation_t[1])); + } else { + // Operator new() was not called. + // Assume that it is embedded or stack object. +@@ -191,7 +193,7 @@ + // Note: garbage may resembles valid value. + assert(~(_allocation_t[0] | allocation_mask) != (uintptr_t)this || !is_type_set(), + err_msg("embedded or stack only, this(" PTR_FORMAT ") type %d a[0]=(" PTR_FORMAT ") a[1]=(" PTR_FORMAT ")", +- this, get_allocation_type(), _allocation_t[0], _allocation_t[1])); ++ p2i(this), get_allocation_type(), _allocation_t[0], _allocation_t[1])); + set_allocation_type((address)this, STACK_OR_EMBEDDED); + _allocation_t[1] = 0; // Zap verification value + } +@@ -200,7 +202,7 @@ + // Used in InlineTree::ok_to_inline() for WarmCallInfo. + assert(allocated_on_stack(), + err_msg("copy only into local, this(" PTR_FORMAT ") type %d a[0]=(" PTR_FORMAT ") a[1]=(" PTR_FORMAT ")", +- this, get_allocation_type(), _allocation_t[0], _allocation_t[1])); ++ p2i(this), get_allocation_type(), _allocation_t[0], _allocation_t[1])); + // Keep current _allocation_t value; + return *this; + } +@@ -216,13 +218,13 @@ + + void trace_heap_malloc(size_t size, const char* name, void* p) { + // A lock is not needed here - tty uses a lock internally +- tty->print_cr("Heap malloc " INTPTR_FORMAT " " SIZE_FORMAT " %s", p, size, name == NULL ? "" : name); ++ tty->print_cr("Heap malloc " INTPTR_FORMAT " " SIZE_FORMAT " %s", p2i(p), size, name == NULL ? "" : name); + } + + + void trace_heap_free(void* p) { + // A lock is not needed here - tty uses a lock internally +- tty->print_cr("Heap free " INTPTR_FORMAT, p); ++ tty->print_cr("Heap free " INTPTR_FORMAT, p2i(p)); + } + + //-------------------------------------------------------------------------------------- +@@ -559,6 +561,7 @@ + _chunk = new (alloc_failmode, len) Chunk(len); + + if (_chunk == NULL) { ++ _chunk = k; // restore the previous value of _chunk + return NULL; + } + if (k) k->set_next(_chunk); // Append new chunk to end of linked list +@@ -721,11 +724,11 @@ + void AllocatedObj::print_value() const { print_value_on(tty); } + + void AllocatedObj::print_on(outputStream* st) const { +- st->print_cr("AllocatedObj(" INTPTR_FORMAT ")", this); ++ st->print_cr("AllocatedObj(" INTPTR_FORMAT ")", p2i(this)); + } + + void AllocatedObj::print_value_on(outputStream* st) const { +- st->print("AllocatedObj(" INTPTR_FORMAT ")", this); ++ st->print("AllocatedObj(" INTPTR_FORMAT ")", p2i(this)); + } + + julong Arena::_bytes_allocated = 0; +--- ./hotspot/src/share/vm/memory/allocation.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/allocation.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -220,8 +220,11 @@ + class StackObj ALLOCATION_SUPER_CLASS_SPEC { + private: + void* operator new(size_t size) throw(); ++ void* operator new [](size_t size) throw(); ++#ifdef __IBMCPP__ ++ public: ++#endif + void operator delete(void* p); +- void* operator new [](size_t size) throw(); + void operator delete [](void* p); + }; + +@@ -264,7 +267,7 @@ + + class MetaspaceObj { + public: +- bool is_metaspace_object() const; // more specific test but slower ++ bool is_metaspace_object() const; + bool is_shared() const; + void print_address_on(outputStream* st) const; // nonvirtual address printing + +--- ./hotspot/src/share/vm/memory/barrierSet.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/barrierSet.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -100,9 +100,9 @@ + public: + + // ...then the post-write version. +- inline void write_ref_field(void* field, oop new_val); ++ inline void write_ref_field(void* field, oop new_val, bool release = false); + protected: +- virtual void write_ref_field_work(void* field, oop new_val) = 0; ++ virtual void write_ref_field_work(void* field, oop new_val, bool release = false) = 0; + public: + + // Invoke the barrier, if any, necessary when writing the "bytes"-byte +--- ./hotspot/src/share/vm/memory/barrierSet.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/barrierSet.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -40,11 +40,11 @@ + } + } + +-void BarrierSet::write_ref_field(void* field, oop new_val) { ++void BarrierSet::write_ref_field(void* field, oop new_val, bool release) { + if (kind() == CardTableModRef) { +- ((CardTableModRefBS*)this)->inline_write_ref_field(field, new_val); ++ ((CardTableModRefBS*)this)->inline_write_ref_field(field, new_val, release); + } else { +- write_ref_field_work(field, new_val); ++ write_ref_field_work(field, new_val, release); + } + } + +--- ./hotspot/src/share/vm/memory/binaryTreeDictionary.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/binaryTreeDictionary.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -44,16 +44,16 @@ + // This is currently used in the Concurrent Mark&Sweep implementation. + //////////////////////////////////////////////////////////////////////////////// + +-template class FreeList_t> ++template + size_t TreeChunk::_min_tree_chunk_size = sizeof(TreeChunk)/HeapWordSize; + +-template class FreeList_t> ++template + TreeChunk* TreeChunk::as_TreeChunk(Chunk_t* fc) { + // Do some assertion checking here. + return (TreeChunk*) fc; + } + +-template class FreeList_t> ++template + void TreeChunk::verify_tree_chunk_list() const { + TreeChunk* nextTC = (TreeChunk*)next(); + if (prev() != NULL) { // interior list node shouldn'r have tree fields +@@ -67,11 +67,11 @@ + } + } + +-template class FreeList_t> ++template + TreeList::TreeList() : _parent(NULL), + _left(NULL), _right(NULL) {} + +-template class FreeList_t> ++template + TreeList* + TreeList::as_TreeList(TreeChunk* tc) { + // This first free chunk in the list will be the tree list. +@@ -88,20 +88,7 @@ + return tl; + } + +- +-template class FreeList_t> +-TreeList* +-get_chunk(size_t size, enum FreeBlockDictionary::Dither dither) { +- FreeBlockDictionary::verify_par_locked(); +- Chunk_t* res = get_chunk_from_tree(size, dither); +- assert(res == NULL || res->is_free(), +- "Should be returning a free chunk"); +- assert(dither != FreeBlockDictionary::exactly || +- res->size() == size, "Not correct size"); +- return res; +-} +- +-template class FreeList_t> ++template + TreeList* + TreeList::as_TreeList(HeapWord* addr, size_t size) { + TreeChunk* tc = (TreeChunk*) addr; +@@ -125,17 +112,17 @@ + // an over populated size. The general get_better_list() just returns + // the current list. + template <> +-TreeList* +-TreeList::get_better_list( +- BinaryTreeDictionary* dictionary) { ++TreeList >* ++TreeList >::get_better_list( ++ BinaryTreeDictionary >* dictionary) { + // A candidate chunk has been found. If it is already under + // populated, get a chunk associated with the hint for this + // chunk. + +- TreeList* curTL = this; ++ TreeList >* curTL = this; + if (surplus() <= 0) { + /* Use the hint to find a size with a surplus, and reset the hint. */ +- TreeList* hintTL = this; ++ TreeList >* hintTL = this; + while (hintTL->hint() != 0) { + assert(hintTL->hint() > hintTL->size(), + "hint points in the wrong direction"); +@@ -163,14 +150,14 @@ + } + #endif // INCLUDE_ALL_GCS + +-template class FreeList_t> ++template + TreeList* + TreeList::get_better_list( + BinaryTreeDictionary* dictionary) { + return this; + } + +-template class FreeList_t> ++template + TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk* tc) { + + TreeList* retTL = this; +@@ -286,7 +273,7 @@ + return retTL; + } + +-template class FreeList_t> ++template + void TreeList::return_chunk_at_tail(TreeChunk* chunk) { + assert(chunk != NULL, "returning NULL chunk"); + assert(chunk->list() == this, "list should be set for chunk"); +@@ -301,7 +288,7 @@ + this->link_tail(chunk); + + assert(!tail() || size() == tail()->size(), "Wrong sized chunk in list"); +- FreeList_t::increment_count(); ++ FreeList_t::increment_count(); + debug_only(this->increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) + assert(head() == NULL || head()->prev() == NULL, "list invariant"); + assert(tail() == NULL || tail()->next() == NULL, "list invariant"); +@@ -311,7 +298,7 @@ + // is defined to be after the chunk pointer to by head(). This is + // because the TreeList is embedded in the first TreeChunk in the + // list. See the definition of TreeChunk. +-template class FreeList_t> ++template + void TreeList::return_chunk_at_head(TreeChunk* chunk) { + assert(chunk->list() == this, "list should be set for chunk"); + assert(head() != NULL, "The tree list is embedded in the first chunk"); +@@ -329,13 +316,13 @@ + } + head()->link_after(chunk); + assert(!head() || size() == head()->size(), "Wrong sized chunk in list"); +- FreeList_t::increment_count(); ++ FreeList_t::increment_count(); + debug_only(this->increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) + assert(head() == NULL || head()->prev() == NULL, "list invariant"); + assert(tail() == NULL || tail()->next() == NULL, "list invariant"); + } + +-template class FreeList_t> ++template + void TreeChunk::assert_is_mangled() const { + assert((ZapUnusedHeapArea && + SpaceMangler::is_mangled((HeapWord*) Chunk_t::size_addr()) && +@@ -345,14 +332,14 @@ + "Space should be clear or mangled"); + } + +-template class FreeList_t> ++template + TreeChunk* TreeList::head_as_TreeChunk() { + assert(head() == NULL || (TreeChunk::as_TreeChunk(head())->list() == this), + "Wrong type of chunk?"); + return TreeChunk::as_TreeChunk(head()); + } + +-template class FreeList_t> ++template + TreeChunk* TreeList::first_available() { + assert(head() != NULL, "The head of the list cannot be NULL"); + Chunk_t* fc = head()->next(); +@@ -369,7 +356,7 @@ + // Returns the block with the largest heap address amongst + // those in the list for this size; potentially slow and expensive, + // use with caution! +-template class FreeList_t> ++template + TreeChunk* TreeList::largest_address() { + assert(head() != NULL, "The head of the list cannot be NULL"); + Chunk_t* fc = head()->next(); +@@ -392,7 +379,7 @@ + return retTC; + } + +-template class FreeList_t> ++template + BinaryTreeDictionary::BinaryTreeDictionary(MemRegion mr) { + assert((mr.byte_size() > min_size()), "minimum chunk size"); + +@@ -405,17 +392,17 @@ + assert(total_free_blocks() == 1, "reset check failed"); + } + +-template class FreeList_t> ++template + void BinaryTreeDictionary::inc_total_size(size_t inc) { + _total_size = _total_size + inc; + } + +-template class FreeList_t> ++template + void BinaryTreeDictionary::dec_total_size(size_t dec) { + _total_size = _total_size - dec; + } + +-template class FreeList_t> ++template + void BinaryTreeDictionary::reset(MemRegion mr) { + assert((mr.byte_size() > min_size()), "minimum chunk size"); + set_root(TreeList::as_TreeList(mr.start(), mr.word_size())); +@@ -423,13 +410,13 @@ + set_total_free_blocks(1); + } + +-template class FreeList_t> ++template + void BinaryTreeDictionary::reset(HeapWord* addr, size_t byte_size) { + MemRegion mr(addr, heap_word_size(byte_size)); + reset(mr); + } + +-template class FreeList_t> ++template + void BinaryTreeDictionary::reset() { + set_root(NULL); + set_total_size(0); +@@ -437,7 +424,7 @@ + } + + // Get a free block of size at least size from tree, or NULL. +-template class FreeList_t> ++template + TreeChunk* + BinaryTreeDictionary::get_chunk_from_tree( + size_t size, +@@ -496,7 +483,7 @@ + return retTC; + } + +-template class FreeList_t> ++template + TreeList* BinaryTreeDictionary::find_list(size_t size) const { + TreeList* curTL; + for (curTL = root(); curTL != NULL;) { +@@ -515,7 +502,7 @@ + } + + +-template class FreeList_t> ++template + bool BinaryTreeDictionary::verify_chunk_in_free_list(Chunk_t* tc) const { + size_t size = tc->size(); + TreeList* tl = find_list(size); +@@ -526,7 +513,7 @@ + } + } + +-template class FreeList_t> ++template + Chunk_t* BinaryTreeDictionary::find_largest_dict() const { + TreeList *curTL = root(); + if (curTL != NULL) { +@@ -541,7 +528,7 @@ + // chunk in a list on a tree node, just unlink it. + // If it is the last chunk in the list (the next link is NULL), + // remove the node and repair the tree. +-template class FreeList_t> ++template + TreeChunk* + BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { + assert(tc != NULL, "Should not call with a NULL chunk"); +@@ -682,7 +669,7 @@ + // Remove the leftmost node (lm) in the tree and return it. + // If lm has a right child, link it to the left node of + // the parent of lm. +-template class FreeList_t> ++template + TreeList* BinaryTreeDictionary::remove_tree_minimum(TreeList* tl) { + assert(tl != NULL && tl->parent() != NULL, "really need a proper sub-tree"); + // locate the subtree minimum by walking down left branches +@@ -717,7 +704,7 @@ + return curTL; + } + +-template class FreeList_t> ++template + void BinaryTreeDictionary::insert_chunk_in_tree(Chunk_t* fc) { + TreeList *curTL, *prevTL; + size_t size = fc->size(); +@@ -783,7 +770,7 @@ + } + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::max_chunk_size() const { + FreeBlockDictionary::verify_par_locked(); + TreeList* tc = root(); +@@ -792,7 +779,7 @@ + return tc->size(); + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::total_list_length(TreeList* tl) const { + size_t res; + res = tl->count(); +@@ -805,7 +792,7 @@ + return res; + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::total_size_in_tree(TreeList* tl) const { + if (tl == NULL) + return 0; +@@ -814,7 +801,7 @@ + total_size_in_tree(tl->right()); + } + +-template class FreeList_t> ++template + double BinaryTreeDictionary::sum_of_squared_block_sizes(TreeList* const tl) const { + if (tl == NULL) { + return 0.0; +@@ -826,7 +813,7 @@ + return curr; + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::total_free_blocks_in_tree(TreeList* tl) const { + if (tl == NULL) + return 0; +@@ -835,14 +822,14 @@ + total_free_blocks_in_tree(tl->right()); + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::num_free_blocks() const { + assert(total_free_blocks_in_tree(root()) == total_free_blocks(), + "_total_free_blocks inconsistency"); + return total_free_blocks(); + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::tree_height_helper(TreeList* tl) const { + if (tl == NULL) + return 0; +@@ -850,12 +837,12 @@ + tree_height_helper(tl->right())); + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::tree_height() const { + return tree_height_helper(root()); + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::total_nodes_helper(TreeList* tl) const { + if (tl == NULL) { + return 0; +@@ -864,18 +851,18 @@ + total_nodes_helper(tl->right()); + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::total_nodes_in_tree(TreeList* tl) const { + return total_nodes_helper(root()); + } + +-template class FreeList_t> ++template + void BinaryTreeDictionary::dict_census_update(size_t size, bool split, bool birth){} + + #if INCLUDE_ALL_GCS + template <> +-void AFLBinaryTreeDictionary::dict_census_update(size_t size, bool split, bool birth){ +- TreeList* nd = find_list(size); ++void AFLBinaryTreeDictionary::dict_census_update(size_t size, bool split, bool birth) { ++ TreeList >* nd = find_list(size); + if (nd) { + if (split) { + if (birth) { +@@ -903,7 +890,7 @@ + } + #endif // INCLUDE_ALL_GCS + +-template class FreeList_t> ++template + bool BinaryTreeDictionary::coal_dict_over_populated(size_t size) { + // For the general type of freelists, encourage coalescing by + // returning true. +@@ -915,7 +902,7 @@ + bool AFLBinaryTreeDictionary::coal_dict_over_populated(size_t size) { + if (FLSAlwaysCoalesceLarge) return true; + +- TreeList* list_of_size = find_list(size); ++ TreeList >* list_of_size = find_list(size); + // None of requested size implies overpopulated. + return list_of_size == NULL || list_of_size->coal_desired() <= 0 || + list_of_size->count() > list_of_size->coal_desired(); +@@ -928,15 +915,15 @@ + // do_tree() walks the nodes in the binary tree applying do_list() + // to each list at each node. + +-template class FreeList_t> ++template + class TreeCensusClosure : public StackObj { + protected: +- virtual void do_list(FreeList_t* fl) = 0; ++ virtual void do_list(FreeList_t* fl) = 0; + public: + virtual void do_tree(TreeList* tl) = 0; + }; + +-template class FreeList_t> ++template + class AscendTreeCensusClosure : public TreeCensusClosure { + public: + void do_tree(TreeList* tl) { +@@ -948,7 +935,7 @@ + } + }; + +-template class FreeList_t> ++template + class DescendTreeCensusClosure : public TreeCensusClosure { + public: + void do_tree(TreeList* tl) { +@@ -962,7 +949,7 @@ + + // For each list in the tree, calculate the desired, desired + // coalesce, count before sweep, and surplus before sweep. +-template class FreeList_t> ++template + class BeginSweepClosure : public AscendTreeCensusClosure { + double _percentage; + float _inter_sweep_current; +@@ -995,16 +982,16 @@ + // Similar to TreeCensusClosure but searches the + // tree and returns promptly when found. + +-template class FreeList_t> ++template + class TreeSearchClosure : public StackObj { + protected: +- virtual bool do_list(FreeList_t* fl) = 0; ++ virtual bool do_list(FreeList_t* fl) = 0; + public: + virtual bool do_tree(TreeList* tl) = 0; + }; + + #if 0 // Don't need this yet but here for symmetry. +-template class FreeList_t> ++template + class AscendTreeSearchClosure : public TreeSearchClosure { + public: + bool do_tree(TreeList* tl) { +@@ -1018,7 +1005,7 @@ + }; + #endif + +-template class FreeList_t> ++template + class DescendTreeSearchClosure : public TreeSearchClosure { + public: + bool do_tree(TreeList* tl) { +@@ -1033,14 +1020,14 @@ + + // Searches the tree for a chunk that ends at the + // specified address. +-template class FreeList_t> ++template + class EndTreeSearchClosure : public DescendTreeSearchClosure { + HeapWord* _target; + Chunk_t* _found; + + public: + EndTreeSearchClosure(HeapWord* target) : _target(target), _found(NULL) {} +- bool do_list(FreeList_t* fl) { ++ bool do_list(FreeList_t* fl) { + Chunk_t* item = fl->head(); + while (item != NULL) { + if (item->end() == (uintptr_t*) _target) { +@@ -1054,7 +1041,7 @@ + Chunk_t* found() { return _found; } + }; + +-template class FreeList_t> ++template + Chunk_t* BinaryTreeDictionary::find_chunk_ends_at(HeapWord* target) const { + EndTreeSearchClosure etsc(target); + bool found_target = etsc.do_tree(root()); +@@ -1063,7 +1050,7 @@ + return etsc.found(); + } + +-template class FreeList_t> ++template + void BinaryTreeDictionary::begin_sweep_dict_census(double coalSurplusPercent, + float inter_sweep_current, float inter_sweep_estimate, float intra_sweep_estimate) { + BeginSweepClosure bsc(coalSurplusPercent, inter_sweep_current, +@@ -1075,32 +1062,32 @@ + // Closures and methods for calculating total bytes returned to the + // free lists in the tree. + #ifndef PRODUCT +-template class FreeList_t> ++template + class InitializeDictReturnedBytesClosure : public AscendTreeCensusClosure { + public: +- void do_list(FreeList_t* fl) { ++ void do_list(FreeList_t* fl) { + fl->set_returned_bytes(0); + } + }; + +-template class FreeList_t> ++template + void BinaryTreeDictionary::initialize_dict_returned_bytes() { + InitializeDictReturnedBytesClosure idrb; + idrb.do_tree(root()); + } + +-template class FreeList_t> ++template + class ReturnedBytesClosure : public AscendTreeCensusClosure { + size_t _dict_returned_bytes; + public: + ReturnedBytesClosure() { _dict_returned_bytes = 0; } +- void do_list(FreeList_t* fl) { ++ void do_list(FreeList_t* fl) { + _dict_returned_bytes += fl->returned_bytes(); + } + size_t dict_returned_bytes() { return _dict_returned_bytes; } + }; + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::sum_dict_returned_bytes() { + ReturnedBytesClosure rbc; + rbc.do_tree(root()); +@@ -1109,17 +1096,17 @@ + } + + // Count the number of entries in the tree. +-template class FreeList_t> ++template + class treeCountClosure : public DescendTreeCensusClosure { + public: + uint count; + treeCountClosure(uint c) { count = c; } +- void do_list(FreeList_t* fl) { ++ void do_list(FreeList_t* fl) { + count++; + } + }; + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::total_count() { + treeCountClosure ctc(0); + ctc.do_tree(root()); +@@ -1128,7 +1115,7 @@ + #endif // PRODUCT + + // Calculate surpluses for the lists in the tree. +-template class FreeList_t> ++template + class setTreeSurplusClosure : public AscendTreeCensusClosure { + double percentage; + public: +@@ -1144,14 +1131,14 @@ + #endif // INCLUDE_ALL_GCS + }; + +-template class FreeList_t> ++template + void BinaryTreeDictionary::set_tree_surplus(double splitSurplusPercent) { + setTreeSurplusClosure sts(splitSurplusPercent); + sts.do_tree(root()); + } + + // Set hints for the lists in the tree. +-template class FreeList_t> ++template + class setTreeHintsClosure : public DescendTreeCensusClosure { + size_t hint; + public: +@@ -1170,14 +1157,14 @@ + #endif // INCLUDE_ALL_GCS + }; + +-template class FreeList_t> ++template + void BinaryTreeDictionary::set_tree_hints(void) { + setTreeHintsClosure sth(0); + sth.do_tree(root()); + } + + // Save count before previous sweep and splits and coalesces. +-template class FreeList_t> ++template + class clearTreeCensusClosure : public AscendTreeCensusClosure { + void do_list(FreeList* fl) {} + +@@ -1192,14 +1179,14 @@ + #endif // INCLUDE_ALL_GCS + }; + +-template class FreeList_t> ++template + void BinaryTreeDictionary::clear_tree_census(void) { + clearTreeCensusClosure ctc; + ctc.do_tree(root()); + } + + // Do reporting and post sweep clean up. +-template class FreeList_t> ++template + void BinaryTreeDictionary::end_sweep_dict_census(double splitSurplusPercent) { + // Does walking the tree 3 times hurt? + set_tree_surplus(splitSurplusPercent); +@@ -1211,41 +1198,41 @@ + } + + // Print summary statistics +-template class FreeList_t> ++template + void BinaryTreeDictionary::report_statistics() const { + FreeBlockDictionary::verify_par_locked(); + gclog_or_tty->print("Statistics for BinaryTreeDictionary:\n" + "------------------------------------\n"); + size_t total_size = total_chunk_size(debug_only(NULL)); + size_t free_blocks = num_free_blocks(); +- gclog_or_tty->print("Total Free Space: %d\n", total_size); +- gclog_or_tty->print("Max Chunk Size: %d\n", max_chunk_size()); +- gclog_or_tty->print("Number of Blocks: %d\n", free_blocks); ++ gclog_or_tty->print("Total Free Space: " SIZE_FORMAT "\n", total_size); ++ gclog_or_tty->print("Max Chunk Size: " SIZE_FORMAT "\n", max_chunk_size()); ++ gclog_or_tty->print("Number of Blocks: " SIZE_FORMAT "\n", free_blocks); + if (free_blocks > 0) { +- gclog_or_tty->print("Av. Block Size: %d\n", total_size/free_blocks); ++ gclog_or_tty->print("Av. Block Size: " SIZE_FORMAT "\n", total_size/free_blocks); + } +- gclog_or_tty->print("Tree Height: %d\n", tree_height()); ++ gclog_or_tty->print("Tree Height: " SIZE_FORMAT "\n", tree_height()); + } + + // Print census information - counts, births, deaths, etc. + // for each list in the tree. Also print some summary + // information. +-template class FreeList_t> ++template + class PrintTreeCensusClosure : public AscendTreeCensusClosure { + int _print_line; + size_t _total_free; +- FreeList_t _total; ++ FreeList_t _total; + + public: + PrintTreeCensusClosure() { + _print_line = 0; + _total_free = 0; + } +- FreeList_t* total() { return &_total; } ++ FreeList_t* total() { return &_total; } + size_t total_free() { return _total_free; } + void do_list(FreeList* fl) { + if (++_print_line >= 40) { +- FreeList_t::print_labels_on(gclog_or_tty, "size"); ++ FreeList_t::print_labels_on(gclog_or_tty, "size"); + _print_line = 0; + } + fl->print_on(gclog_or_tty); +@@ -1256,7 +1243,7 @@ + #if INCLUDE_ALL_GCS + void do_list(AdaptiveFreeList* fl) { + if (++_print_line >= 40) { +- FreeList_t::print_labels_on(gclog_or_tty, "size"); ++ FreeList_t::print_labels_on(gclog_or_tty, "size"); + _print_line = 0; + } + fl->print_on(gclog_or_tty); +@@ -1275,16 +1262,16 @@ + #endif // INCLUDE_ALL_GCS + }; + +-template class FreeList_t> ++template + void BinaryTreeDictionary::print_dict_census(void) const { + + gclog_or_tty->print("\nBinaryTree\n"); +- FreeList_t::print_labels_on(gclog_or_tty, "size"); ++ FreeList_t::print_labels_on(gclog_or_tty, "size"); + PrintTreeCensusClosure ptc; + ptc.do_tree(root()); + +- FreeList_t* total = ptc.total(); +- FreeList_t::print_labels_on(gclog_or_tty, " "); ++ FreeList_t* total = ptc.total(); ++ FreeList_t::print_labels_on(gclog_or_tty, " "); + } + + #if INCLUDE_ALL_GCS +@@ -1293,7 +1280,7 @@ + + gclog_or_tty->print("\nBinaryTree\n"); + AdaptiveFreeList::print_labels_on(gclog_or_tty, "size"); +- PrintTreeCensusClosure ptc; ++ PrintTreeCensusClosure > ptc; + ptc.do_tree(root()); + + AdaptiveFreeList* total = ptc.total(); +@@ -1311,7 +1298,7 @@ + } + #endif // INCLUDE_ALL_GCS + +-template class FreeList_t> ++template + class PrintFreeListsClosure : public AscendTreeCensusClosure { + outputStream* _st; + int _print_line; +@@ -1321,9 +1308,9 @@ + _st = st; + _print_line = 0; + } +- void do_list(FreeList_t* fl) { ++ void do_list(FreeList_t* fl) { + if (++_print_line >= 40) { +- FreeList_t::print_labels_on(_st, "size"); ++ FreeList_t::print_labels_on(_st, "size"); + _print_line = 0; + } + fl->print_on(gclog_or_tty); +@@ -1331,16 +1318,16 @@ + for (Chunk_t* fc = fl->head(); fc != NULL; + fc = fc->next()) { + _st->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s", +- fc, (HeapWord*)fc + sz, ++ p2i(fc), p2i((HeapWord*)fc + sz), + fc->cantCoalesce() ? "\t CC" : ""); + } + } + }; + +-template class FreeList_t> ++template + void BinaryTreeDictionary::print_free_lists(outputStream* st) const { + +- FreeList_t::print_labels_on(st, "size"); ++ FreeList_t::print_labels_on(st, "size"); + PrintFreeListsClosure pflc(st); + pflc.do_tree(root()); + } +@@ -1349,7 +1336,7 @@ + // . _root has no parent + // . parent and child point to each other + // . each node's key correctly related to that of its child(ren) +-template class FreeList_t> ++template + void BinaryTreeDictionary::verify_tree() const { + guarantee(root() == NULL || total_free_blocks() == 0 || + total_size() != 0, "_total_size should't be 0?"); +@@ -1357,7 +1344,7 @@ + verify_tree_helper(root()); + } + +-template class FreeList_t> ++template + size_t BinaryTreeDictionary::verify_prev_free_ptrs(TreeList* tl) { + size_t ct = 0; + for (Chunk_t* curFC = tl->head(); curFC != NULL; curFC = curFC->next()) { +@@ -1371,7 +1358,7 @@ + // Note: this helper is recursive rather than iterative, so use with + // caution on very deep trees; and watch out for stack overflow errors; + // In general, to be used only for debugging. +-template class FreeList_t> ++template + void BinaryTreeDictionary::verify_tree_helper(TreeList* tl) const { + if (tl == NULL) + return; +@@ -1400,25 +1387,25 @@ + verify_tree_helper(tl->right()); + } + +-template class FreeList_t> ++template + void BinaryTreeDictionary::verify() const { + verify_tree(); + guarantee(total_size() == total_size_in_tree(root()), "Total Size inconsistency"); + } + +-template class TreeList; +-template class BinaryTreeDictionary; +-template class TreeChunk; ++template class TreeList >; ++template class BinaryTreeDictionary >; ++template class TreeChunk >; + +-template class TreeList; +-template class BinaryTreeDictionary; +-template class TreeChunk; ++template class TreeList >; ++template class BinaryTreeDictionary >; ++template class TreeChunk >; + + + #if INCLUDE_ALL_GCS + // Explicitly instantiate these types for FreeChunk. +-template class TreeList; +-template class BinaryTreeDictionary; +-template class TreeChunk; ++template class TreeList >; ++template class BinaryTreeDictionary >; ++template class TreeChunk >; + + #endif // INCLUDE_ALL_GCS +--- ./hotspot/src/share/vm/memory/binaryTreeDictionary.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/binaryTreeDictionary.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -37,18 +37,18 @@ + // A TreeList is a FreeList which can be used to maintain a + // binary tree of free lists. + +-template class FreeList_t> class TreeChunk; +-template class FreeList_t> class BinaryTreeDictionary; +-template class FreeList_t> class AscendTreeCensusClosure; +-template class FreeList_t> class DescendTreeCensusClosure; +-template class FreeList_t> class DescendTreeSearchClosure; ++template class TreeChunk; ++template class BinaryTreeDictionary; ++template class AscendTreeCensusClosure; ++template class DescendTreeCensusClosure; ++template class DescendTreeSearchClosure; + + class FreeChunk; + template class AdaptiveFreeList; +-typedef BinaryTreeDictionary AFLBinaryTreeDictionary; ++typedef BinaryTreeDictionary > AFLBinaryTreeDictionary; + +-template class FreeList_t> +-class TreeList : public FreeList_t { ++template ++class TreeList : public FreeList_t { + friend class TreeChunk; + friend class BinaryTreeDictionary; + friend class AscendTreeCensusClosure; +@@ -66,12 +66,12 @@ + TreeList* right() const { return _right; } + + // Wrapper on call to base class, to get the template to compile. +- Chunk_t* head() const { return FreeList_t::head(); } +- Chunk_t* tail() const { return FreeList_t::tail(); } +- void set_head(Chunk_t* head) { FreeList_t::set_head(head); } +- void set_tail(Chunk_t* tail) { FreeList_t::set_tail(tail); } ++ Chunk_t* head() const { return FreeList_t::head(); } ++ Chunk_t* tail() const { return FreeList_t::tail(); } ++ void set_head(Chunk_t* head) { FreeList_t::set_head(head); } ++ void set_tail(Chunk_t* tail) { FreeList_t::set_tail(tail); } + +- size_t size() const { return FreeList_t::size(); } ++ size_t size() const { return FreeList_t::size(); } + + // Accessors for links in tree. + +@@ -90,7 +90,7 @@ + void clear_left() { _left = NULL; } + void clear_right() { _right = NULL; } + void clear_parent() { _parent = NULL; } +- void initialize() { clear_left(); clear_right(), clear_parent(); FreeList_t::initialize(); } ++ void initialize() { clear_left(); clear_right(), clear_parent(); FreeList_t::initialize(); } + + // For constructing a TreeList from a Tree chunk or + // address and size. +@@ -139,7 +139,7 @@ + // on the free list for a node in the tree and is only removed if + // it is the last chunk on the free list. + +-template class FreeList_t> ++template + class TreeChunk : public Chunk_t { + friend class TreeList; + TreeList* _list; +@@ -173,7 +173,7 @@ + }; + + +-template class FreeList_t> ++template + class BinaryTreeDictionary: public FreeBlockDictionary { + friend class VMStructs; + size_t _total_size; +--- ./hotspot/src/share/vm/memory/blockOffsetTable.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/blockOffsetTable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -59,12 +59,12 @@ + " rs.base(): " INTPTR_FORMAT + " rs.size(): " INTPTR_FORMAT + " rs end(): " INTPTR_FORMAT, +- rs.base(), rs.size(), rs.base() + rs.size()); ++ p2i(rs.base()), rs.size(), p2i(rs.base() + rs.size())); + gclog_or_tty->print_cr(" " + " _vs.low_boundary(): " INTPTR_FORMAT + " _vs.high_boundary(): " INTPTR_FORMAT, +- _vs.low_boundary(), +- _vs.high_boundary()); ++ p2i(_vs.low_boundary()), ++ p2i(_vs.high_boundary())); + } + } + +@@ -537,10 +537,10 @@ + q -= (N_words * n_cards_back); + assert(q >= _sp->bottom(), + err_msg("q = " PTR_FORMAT " crossed below bottom = " PTR_FORMAT, +- q, _sp->bottom())); ++ p2i(q), p2i(_sp->bottom()))); + assert(q < _sp->end(), + err_msg("q = " PTR_FORMAT " crossed above end = " PTR_FORMAT, +- q, _sp->end())); ++ p2i(q), p2i(_sp->end()))); + index -= n_cards_back; + offset = _array->offset_array(index); + } +@@ -549,10 +549,10 @@ + q -= offset; + assert(q >= _sp->bottom(), + err_msg("q = " PTR_FORMAT " crossed below bottom = " PTR_FORMAT, +- q, _sp->bottom())); ++ p2i(q), p2i(_sp->bottom()))); + assert(q < _sp->end(), + err_msg("q = " PTR_FORMAT " crossed above end = " PTR_FORMAT, +- q, _sp->end())); ++ p2i(q), p2i(_sp->end()))); + HeapWord* n = q; + + while (n <= addr) { +@@ -563,14 +563,14 @@ + err_msg("Looping at n = " PTR_FORMAT " with last = " PTR_FORMAT"," + " while querying blk_start(" PTR_FORMAT ")" + " on _sp = [" PTR_FORMAT "," PTR_FORMAT ")", +- n, last, addr, _sp->bottom(), _sp->end())); ++ p2i(n), p2i(last), p2i(addr), p2i(_sp->bottom()), p2i(_sp->end()))); + } + assert(q <= addr, + err_msg("wrong order for current (" INTPTR_FORMAT ")" " <= arg (" INTPTR_FORMAT ")", +- q, addr)); ++ p2i(q), p2i(addr))); + assert(addr <= n, + err_msg("wrong order for arg (" INTPTR_FORMAT ") <= next (" INTPTR_FORMAT ")", +- addr, n)); ++ p2i(addr), p2i(n))); + return q; + } + +--- ./hotspot/src/share/vm/memory/cardTableModRefBS.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/cardTableModRefBS.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -138,11 +138,11 @@ + gclog_or_tty->print_cr(" " + " &_byte_map[0]: " INTPTR_FORMAT + " &_byte_map[_last_valid_index]: " INTPTR_FORMAT, +- &_byte_map[0], +- &_byte_map[_last_valid_index]); ++ p2i(&_byte_map[0]), ++ p2i(&_byte_map[_last_valid_index])); + gclog_or_tty->print_cr(" " + " byte_map_base: " INTPTR_FORMAT, +- byte_map_base); ++ p2i(byte_map_base)); + } + } + +@@ -392,23 +392,23 @@ + gclog_or_tty->print_cr(" " + " _covered[%d].start(): " INTPTR_FORMAT + " _covered[%d].last(): " INTPTR_FORMAT, +- ind, _covered[ind].start(), +- ind, _covered[ind].last()); ++ ind, p2i(_covered[ind].start()), ++ ind, p2i(_covered[ind].last())); + gclog_or_tty->print_cr(" " + " _committed[%d].start(): " INTPTR_FORMAT + " _committed[%d].last(): " INTPTR_FORMAT, +- ind, _committed[ind].start(), +- ind, _committed[ind].last()); ++ ind, p2i(_committed[ind].start()), ++ ind, p2i(_committed[ind].last())); + gclog_or_tty->print_cr(" " + " byte_for(start): " INTPTR_FORMAT + " byte_for(last): " INTPTR_FORMAT, +- byte_for(_covered[ind].start()), +- byte_for(_covered[ind].last())); ++ p2i(byte_for(_covered[ind].start())), ++ p2i(byte_for(_covered[ind].last()))); + gclog_or_tty->print_cr(" " + " addr_for(start): " INTPTR_FORMAT + " addr_for(last): " INTPTR_FORMAT, +- addr_for((jbyte*) _committed[ind].start()), +- addr_for((jbyte*) _committed[ind].last())); ++ p2i(addr_for((jbyte*) _committed[ind].start())), ++ p2i(addr_for((jbyte*) _committed[ind].last()))); + } + // Touch the last card of the covered region to show that it + // is committed (or SEGV). +@@ -419,8 +419,8 @@ + // Note that these versions are precise! The scanning code has to handle the + // fact that the write barrier may be either precise or imprecise. + +-void CardTableModRefBS::write_ref_field_work(void* field, oop newVal) { +- inline_write_ref_field(field, newVal); ++void CardTableModRefBS::write_ref_field_work(void* field, oop newVal, bool release) { ++ inline_write_ref_field(field, newVal, release); + } + + +@@ -657,14 +657,14 @@ + if (failed) { + if (!failures) { + tty->cr(); +- tty->print_cr("== CT verification failed: ["PTR_FORMAT","PTR_FORMAT"]", start, end); ++ tty->print_cr("== CT verification failed: [" INTPTR_FORMAT "," INTPTR_FORMAT "]", p2i(start), p2i(end)); + tty->print_cr("== %sexpecting value: %d", + (val_equals) ? "" : "not ", val); + failures = true; + } + tty->print_cr("== card "PTR_FORMAT" ["PTR_FORMAT","PTR_FORMAT"], " +- "val: %d", curr, addr_for(curr), +- (HeapWord*) (((size_t) addr_for(curr)) + card_size), ++ "val: %d", p2i(curr), p2i(addr_for(curr)), ++ p2i((HeapWord*) (((size_t) addr_for(curr)) + card_size)), + (int) curr_val); + } + } +@@ -682,7 +682,7 @@ + + void CardTableModRefBS::print_on(outputStream* st) const { + st->print_cr("Card table byte_map: [" INTPTR_FORMAT "," INTPTR_FORMAT "] byte_map_base: " INTPTR_FORMAT, +- _byte_map, _byte_map + _byte_map_size, byte_map_base); ++ p2i(_byte_map), p2i(_byte_map + _byte_map_size), p2i(byte_map_base)); + } + + bool CardTableModRefBSForCTRS::card_will_be_scanned(jbyte cv) { +--- ./hotspot/src/share/vm/memory/cardTableModRefBS.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/cardTableModRefBS.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -155,7 +155,7 @@ + assert(_whole_heap.contains(p), + err_msg("Attempt to access p = "PTR_FORMAT" out of bounds of " + " card marking array's _whole_heap = ["PTR_FORMAT","PTR_FORMAT")", +- p, _whole_heap.start(), _whole_heap.end())); ++ p2i(p), p2i(_whole_heap.start()), p2i(_whole_heap.end()))); + jbyte* result = &byte_map_base[uintptr_t(p) >> card_shift]; + assert(result >= _byte_map && result < _byte_map + _byte_map_size, + "out of bounds accessor for card marking array"); +@@ -292,7 +292,7 @@ + // these functions here for performance. + protected: + void write_ref_field_work(oop obj, size_t offset, oop newVal); +- virtual void write_ref_field_work(void* field, oop newVal); ++ virtual void write_ref_field_work(void* field, oop newVal, bool release = false); + public: + + bool has_write_ref_array_opt() { return true; } +@@ -324,9 +324,14 @@ + + template inline void inline_write_ref_field_pre(T* field, oop newVal) {} + +- template inline void inline_write_ref_field(T* field, oop newVal) { ++ template inline void inline_write_ref_field(T* field, oop newVal, bool release) { + jbyte* byte = byte_for((void*)field); +- *byte = dirty_card; ++ if (release) { ++ // Perform a releasing store if requested. ++ OrderAccess::release_store((volatile jbyte*) byte, dirty_card); ++ } else { ++ *byte = dirty_card; ++ } + } + + // These are used by G1, when it uses the card table as a temporary data +@@ -426,7 +431,7 @@ + assert(_whole_heap.contains(result), + err_msg("Returning result = "PTR_FORMAT" out of bounds of " + " card marking array's _whole_heap = ["PTR_FORMAT","PTR_FORMAT")", +- result, _whole_heap.start(), _whole_heap.end())); ++ p2i(result), p2i(_whole_heap.start()), p2i(_whole_heap.end()))); + return result; + } + +@@ -435,7 +440,7 @@ + assert(_whole_heap.contains(p), + err_msg("Attempt to access p = "PTR_FORMAT" out of bounds of " + " card marking array's _whole_heap = ["PTR_FORMAT","PTR_FORMAT")", +- p, _whole_heap.start(), _whole_heap.end())); ++ p2i(p), p2i(_whole_heap.start()), p2i(_whole_heap.end()))); + return byte_for(p) - _byte_map; + } + +--- ./hotspot/src/share/vm/memory/cardTableRS.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/cardTableRS.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -288,14 +288,14 @@ + err_msg("Did you forget to call save_marks()? " + "[" PTR_FORMAT ", " PTR_FORMAT ") is not contained in " + "[" PTR_FORMAT ", " PTR_FORMAT ")", +- urasm.start(), urasm.end(), ur.start(), ur.end())); ++ p2i(urasm.start()), p2i(urasm.end()), p2i(ur.start()), p2i(ur.end()))); + // In the case of CMS+ParNew, issue a warning + if (!ur.contains(urasm)) { + assert(UseConcMarkSweepGC && UseParNewGC, "Tautology: see assert above"); + warning("CMS+ParNew: Did you forget to call save_marks()? " + "[" PTR_FORMAT ", " PTR_FORMAT ") is not contained in " + "[" PTR_FORMAT ", " PTR_FORMAT ")", +- urasm.start(), urasm.end(), ur.start(), ur.end()); ++ p2i(urasm.start()), p2i(urasm.end()), p2i(ur.start()), p2i(ur.end())); + MemRegion ur2 = sp->used_region(); + MemRegion urasm2 = sp->used_region_at_save_marks(); + if (!ur.equals(ur2)) { +@@ -349,12 +349,12 @@ + assert(jp >= _begin && jp < _end, + err_msg("Error: jp " PTR_FORMAT " should be within " + "[_begin, _end) = [" PTR_FORMAT "," PTR_FORMAT ")", +- jp, _begin, _end)); ++ p2i(jp), p2i(_begin), p2i(_end))); + oop obj = oopDesc::load_decode_heap_oop(p); + guarantee(obj == NULL || (HeapWord*)obj >= _boundary, + err_msg("pointer " PTR_FORMAT " at " PTR_FORMAT " on " + "clean card crosses boundary" PTR_FORMAT, +- (HeapWord*)obj, jp, _boundary)); ++ p2i((HeapWord*)obj), p2i(jp), p2i(_boundary))); + } + + public: +@@ -362,10 +362,10 @@ + _boundary(b), _begin(begin), _end(end) { + assert(b <= begin, + err_msg("Error: boundary " PTR_FORMAT " should be at or below begin " PTR_FORMAT, +- b, begin)); ++ p2i(b), p2i(begin))); + assert(begin <= end, + err_msg("Error: begin " PTR_FORMAT " should be strictly below end " PTR_FORMAT, +- begin, end)); ++ p2i(begin), p2i(end))); + } + + virtual void do_oop(oop* p) { VerifyCleanCardClosure::do_oop_work(p); } +--- ./hotspot/src/share/vm/memory/collectorPolicy.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/collectorPolicy.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -307,10 +307,13 @@ + } + + // Now take the actual NewSize into account. We will silently increase NewSize +- // if the user specified a smaller value. ++ // if the user specified a smaller or unaligned value. + smallest_new_size = MAX2(smallest_new_size, (uintx)align_size_down(NewSize, _gen_alignment)); + if (smallest_new_size != NewSize) { +- FLAG_SET_ERGO(uintx, NewSize, smallest_new_size); ++ // Do not use FLAG_SET_ERGO to update NewSize here, since this will override ++ // if NewSize was set on the command line or not. This information is needed ++ // later when setting the initial and minimum young generation size. ++ NewSize = smallest_new_size; + } + _initial_gen0_size = NewSize; + +@@ -450,18 +453,20 @@ + _max_gen0_size = max_new_size; + } else { + size_t desired_new_size = 0; +- if (!FLAG_IS_DEFAULT(NewSize)) { +- // If NewSize is set ergonomically (for example by cms), it +- // would make sense to use it. If it is used, also use it +- // to set the initial size. Although there is no reason +- // the minimum size and the initial size have to be the same, +- // the current implementation gets into trouble during the calculation +- // of the tenured generation sizes if they are different. +- // Note that this makes the initial size and the minimum size +- // generally small compared to the NewRatio calculation. ++ if (FLAG_IS_CMDLINE(NewSize)) { ++ // If NewSize is set on the command line, we must use it as ++ // the initial size and it also makes sense to use it as the ++ // lower limit. + _min_gen0_size = NewSize; + desired_new_size = NewSize; + max_new_size = MAX2(max_new_size, NewSize); ++ } else if (FLAG_IS_ERGO(NewSize)) { ++ // If NewSize is set ergonomically, we should use it as a lower ++ // limit, but use NewRatio to calculate the initial size. ++ _min_gen0_size = NewSize; ++ desired_new_size = ++ MAX2(scale_by_NewRatio_aligned(_initial_heap_byte_size), NewSize); ++ max_new_size = MAX2(max_new_size, NewSize); + } else { + // For the case where NewSize is the default, use NewRatio + // to size the minimum and initial generation sizes. +@@ -764,7 +769,7 @@ + if ((QueuedAllocationWarningCount > 0) && + (try_count % QueuedAllocationWarningCount == 0)) { + warning("TwoGenerationCollectorPolicy::mem_allocate_work retries %d times \n\t" +- " size=%d %s", try_count, size, is_tlab ? "(TLAB)" : ""); ++ " size=" SIZE_FORMAT " %s", try_count, size, is_tlab ? "(TLAB)" : ""); + } + } + } +@@ -933,7 +938,7 @@ + if ((QueuedAllocationWarningCount > 0) && + (loop_count % QueuedAllocationWarningCount == 0)) { + warning("satisfy_failed_metadata_allocation() retries %d times \n\t" +- " size=%d", loop_count, word_size); ++ " size=" SIZE_FORMAT, loop_count, word_size); + } + } while (true); // Until a GC is done + } +@@ -989,3 +994,110 @@ + _gc_policy_counters = new GCPolicyCounters("Copy:MSC", 2, 3); + } + } ++ ++/////////////// Unit tests /////////////// ++ ++#ifndef PRODUCT ++// Testing that the NewSize flag is handled correct is hard because it ++// depends on so many other configurable variables. This test only tries to ++// verify that there are some basic rules for NewSize honored by the policies. ++class TestGenCollectorPolicy { ++public: ++ static void test() { ++ size_t flag_value; ++ ++ save_flags(); ++ ++ // Set some limits that makes the math simple. ++ FLAG_SET_ERGO(uintx, MaxHeapSize, 180 * M); ++ FLAG_SET_ERGO(uintx, InitialHeapSize, 120 * M); ++ Arguments::set_min_heap_size(40 * M); ++ ++ // If NewSize is set on the command line, it should be used ++ // for both min and initial young size if less than min heap. ++ flag_value = 20 * M; ++ FLAG_SET_CMDLINE(uintx, NewSize, flag_value); ++ verify_min(flag_value); ++ verify_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; ++ FLAG_SET_CMDLINE(uintx, NewSize, flag_value); ++ verify_initial(flag_value); ++ ++ // If NewSize has been ergonomically set, the collector policy ++ // should use it for min but calculate the initial young size ++ // using NewRatio. ++ flag_value = 20 * M; ++ FLAG_SET_ERGO(uintx, NewSize, flag_value); ++ verify_min(flag_value); ++ verify_scaled_initial(InitialHeapSize); ++ ++ restore_flags(); ++ ++ } ++ ++ static void verify_min(size_t expected) { ++ MarkSweepPolicy msp; ++ msp.initialize_all(); ++ ++ assert(msp.min_gen0_size() <= expected, err_msg("%zu > %zu", msp.min_gen0_size(), expected)); ++ } ++ ++ static void verify_initial(size_t expected) { ++ MarkSweepPolicy msp; ++ msp.initialize_all(); ++ ++ assert(msp.initial_gen0_size() == expected, err_msg("%zu != %zu", msp.initial_gen0_size(), expected)); ++ } ++ ++ static void verify_scaled_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(FLAG_IS_ERGO(NewSize) && NewSize == expected, ++ err_msg("NewSize should have been set ergonomically to %zu, but was %zu", expected, NewSize)); ++ } ++ ++private: ++ static size_t original_InitialHeapSize; ++ static size_t original_MaxHeapSize; ++ static size_t original_MaxNewSize; ++ static size_t original_MinHeapDeltaBytes; ++ static size_t original_NewSize; ++ static size_t original_OldSize; ++ ++ static void save_flags() { ++ original_InitialHeapSize = InitialHeapSize; ++ original_MaxHeapSize = MaxHeapSize; ++ original_MaxNewSize = MaxNewSize; ++ original_MinHeapDeltaBytes = MinHeapDeltaBytes; ++ original_NewSize = NewSize; ++ original_OldSize = OldSize; ++ } ++ ++ static void restore_flags() { ++ InitialHeapSize = original_InitialHeapSize; ++ MaxHeapSize = original_MaxHeapSize; ++ MaxNewSize = original_MaxNewSize; ++ MinHeapDeltaBytes = original_MinHeapDeltaBytes; ++ NewSize = original_NewSize; ++ OldSize = original_OldSize; ++ } ++}; ++ ++size_t TestGenCollectorPolicy::original_InitialHeapSize = 0; ++size_t TestGenCollectorPolicy::original_MaxHeapSize = 0; ++size_t TestGenCollectorPolicy::original_MaxNewSize = 0; ++size_t TestGenCollectorPolicy::original_MinHeapDeltaBytes = 0; ++size_t TestGenCollectorPolicy::original_NewSize = 0; ++size_t TestGenCollectorPolicy::original_OldSize = 0; ++ ++void TestNewSize_test() { ++ TestGenCollectorPolicy::test(); ++} ++ ++#endif +--- ./hotspot/src/share/vm/memory/collectorPolicy.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/collectorPolicy.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -220,6 +220,7 @@ + }; + + class GenCollectorPolicy : public CollectorPolicy { ++friend class TestGenCollectorPolicy; + protected: + size_t _min_gen0_size; + size_t _initial_gen0_size; +--- ./hotspot/src/share/vm/memory/defNewGeneration.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/defNewGeneration.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -46,6 +46,8 @@ + #include "utilities/copy.hpp" + #include "utilities/stack.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // + // DefNewGeneration functions. + +@@ -1086,6 +1088,10 @@ + return eden()->capacity(); + } + ++size_t DefNewGeneration::tlab_used() const { ++ return eden()->used(); ++} ++ + size_t DefNewGeneration::unsafe_max_tlab_alloc() const { + return unsafe_max_alloc_nogc(); + } +--- ./hotspot/src/share/vm/memory/defNewGeneration.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/defNewGeneration.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -239,6 +239,7 @@ + // Thread-local allocation buffers + bool supports_tlab_allocation() const { return true; } + size_t tlab_capacity() const; ++ size_t tlab_used() const; + size_t unsafe_max_tlab_alloc() const; + + // Grow the generation by the specified number of bytes. +--- ./hotspot/src/share/vm/memory/filemap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/filemap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -40,6 +40,7 @@ + #define O_BINARY 0 // otherwise do nothing. + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + extern address JVM_FunctionAtStart(); + extern address JVM_FunctionAtEnd(); +--- ./hotspot/src/share/vm/memory/freeList.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/freeList.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -34,6 +34,7 @@ + + #if INCLUDE_ALL_GCS + #include "gc_implementation/concurrentMarkSweep/freeChunk.hpp" ++#include "gc_implementation/g1/g1CodeCacheRemSet.hpp" + #endif // INCLUDE_ALL_GCS + + // Free list. A FreeList is used to access a linked list of chunks +@@ -332,4 +333,5 @@ + template class FreeList; + #if INCLUDE_ALL_GCS + template class FreeList; ++template class FreeList; + #endif // INCLUDE_ALL_GCS +--- ./hotspot/src/share/vm/memory/gcLocker.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/gcLocker.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -28,7 +28,6 @@ + #include "memory/sharedHeap.hpp" + + volatile jint GC_locker::_jni_lock_count = 0; +-volatile jint GC_locker::_lock_count = 0; + volatile bool GC_locker::_needs_gc = false; + volatile bool GC_locker::_doing_gc = false; + +@@ -52,7 +51,7 @@ + tty->print_cr("critical counts don't match: %d != %d", _jni_lock_count, count); + for (JavaThread* thr = Threads::first(); thr; thr = thr->next()) { + if (thr->in_critical()) { +- tty->print_cr(INTPTR_FORMAT " in_critical %d", thr, thr->in_critical()); ++ tty->print_cr(INTPTR_FORMAT " in_critical %d", p2i(thr), thr->in_critical()); + } + } + } +@@ -102,7 +101,7 @@ + // We check that at least one thread is in a critical region before + // blocking because blocked threads are woken up by a thread exiting + // a JNI critical region. +- while ((needs_gc() && is_jni_active()) || _doing_gc) { ++ while (is_active_and_needs_gc() || _doing_gc) { + JNICritical_lock->wait(); + } + thread->enter_critical(); +@@ -116,27 +115,20 @@ + _jni_lock_count--; + decrement_debug_jni_lock_count(); + thread->exit_critical(); +- if (needs_gc() && !is_jni_active()) { ++ if (needs_gc() && !is_active_internal()) { + // We're the last thread out. Cause a GC to occur. +- // GC will also check is_active, so this check is not +- // strictly needed. It's added here to make it clear that +- // the GC will NOT be performed if any other caller +- // of GC_locker::lock() still needs GC locked. +- if (!is_active_internal()) { +- _doing_gc = true; +- { +- // Must give up the lock while at a safepoint +- MutexUnlocker munlock(JNICritical_lock); +- if (PrintJNIGCStalls && PrintGCDetails) { +- ResourceMark rm; // JavaThread::name() allocates to convert to UTF8 +- gclog_or_tty->print_cr("%.3f: Thread \"%s\" is performing GC after exiting critical section, %d locked", +- gclog_or_tty->time_stamp().seconds(), Thread::current()->name(), _jni_lock_count); +- } +- Universe::heap()->collect(GCCause::_gc_locker); ++ _doing_gc = true; ++ { ++ // Must give up the lock while at a safepoint ++ MutexUnlocker munlock(JNICritical_lock); ++ if (PrintJNIGCStalls && PrintGCDetails) { ++ ResourceMark rm; // JavaThread::name() allocates to convert to UTF8 ++ gclog_or_tty->print_cr("%.3f: Thread \"%s\" is performing GC after exiting critical section, %d locked", ++ gclog_or_tty->time_stamp().seconds(), Thread::current()->name(), _jni_lock_count); + } +- _doing_gc = false; ++ Universe::heap()->collect(GCCause::_gc_locker); + } +- ++ _doing_gc = false; + _needs_gc = false; + JNICritical_lock->notify_all(); + } +--- ./hotspot/src/share/vm/memory/gcLocker.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/gcLocker.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -54,8 +54,6 @@ + // safepointing and decremented during the slow path of GC_locker + // unlocking. + static volatile jint _jni_lock_count; // number of jni active instances. +- +- static volatile jint _lock_count; // number of other active instances + static volatile bool _needs_gc; // heap is filling, we need a GC + // note: bool is typedef'd as jint + static volatile bool _doing_gc; // unlock_critical() is doing a GC +@@ -66,12 +64,6 @@ + static volatile jint _debug_jni_lock_count; + #endif + +- // Accessors +- static bool is_jni_active() { +- assert(_needs_gc, "only valid when _needs_gc is set"); +- return _jni_lock_count > 0; +- } +- + // At a safepoint, visit all threads and count the number of active + // critical sections. This is used to ensure that all active + // critical sections are exited before a new one is started. +@@ -82,7 +74,7 @@ + + static bool is_active_internal() { + verify_critical_count(); +- return _lock_count > 0 || _jni_lock_count > 0; ++ return _jni_lock_count > 0; + } + + public: +@@ -132,10 +124,6 @@ + // not a stable predicate. + static void stall_until_clear(); + +- // Non-structured GC locking: currently needed for JNI. Use with care! +- static void lock(); +- static void unlock(); +- + // The following two methods are used for JNI critical regions. + // If we find that we failed to perform a GC because the GC_locker + // was active, arrange for one as soon as possible by allowing +--- ./hotspot/src/share/vm/memory/gcLocker.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/gcLocker.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -27,22 +27,6 @@ + + #include "memory/gcLocker.hpp" + +-inline void GC_locker::lock() { +- // cast away volatile +- Atomic::inc(&_lock_count); +- CHECK_UNHANDLED_OOPS_ONLY( +- if (CheckUnhandledOops) { Thread::current()->_gc_locked_out_count++; }) +- assert(Universe::heap() == NULL || +- !Universe::heap()->is_gc_active(), "locking failed"); +-} +- +-inline void GC_locker::unlock() { +- // cast away volatile +- Atomic::dec(&_lock_count); +- CHECK_UNHANDLED_OOPS_ONLY( +- if (CheckUnhandledOops) { Thread::current()->_gc_locked_out_count--; }) +-} +- + inline void GC_locker::lock_critical(JavaThread* thread) { + if (!thread->in_critical()) { + if (needs_gc()) { +--- ./hotspot/src/share/vm/memory/genCollectedHeap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/genCollectedHeap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -374,7 +374,7 @@ + + ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy()); + +- const size_t metadata_prev_used = MetaspaceAux::allocated_used_bytes(); ++ const size_t metadata_prev_used = MetaspaceAux::used_bytes(); + + print_heap_before_gc(); + +@@ -809,7 +809,7 @@ + bool GenCollectedHeap::is_in_young(oop p) { + bool result = ((HeapWord*)p) < _gens[_n_gens - 1]->reserved().start(); + assert(result == _gens[0]->is_in_reserved(p), +- err_msg("incorrect test - result=%d, p=" PTR_FORMAT, result, (void*)p)); ++ err_msg("incorrect test - result=%d, p=" PTR_FORMAT, result, p2i((void*)p))); + return result; + } + +@@ -937,6 +937,16 @@ + return result; + } + ++size_t GenCollectedHeap::tlab_used(Thread* thr) const { ++ size_t result = 0; ++ for (int i = 0; i < _n_gens; i += 1) { ++ if (_gens[i]->supports_tlab_allocation()) { ++ result += _gens[i]->tlab_used(); ++ } ++ } ++ return result; ++} ++ + size_t GenCollectedHeap::unsafe_max_tlab_alloc(Thread* thr) const { + size_t result = 0; + for (int i = 0; i < _n_gens; i += 1) { +@@ -1078,7 +1088,7 @@ + for (int i = _n_gens-1; i >= 0; i--) { + Generation* g = _gens[i]; + if (!silent) { +- gclog_or_tty->print(g->name()); ++ gclog_or_tty->print("%s", g->name()); + gclog_or_tty->print(" "); + } + g->verify(); +@@ -1281,7 +1291,7 @@ + // back a time later than 'now'. + jlong retVal = now - tolgc_cl.time(); + if (retVal < 0) { +- NOT_PRODUCT(warning("time warp: "INT64_FORMAT, retVal);) ++ NOT_PRODUCT(warning("time warp: "INT64_FORMAT, (int64_t) retVal);) + return 0; + } + return retVal; +--- ./hotspot/src/share/vm/memory/genCollectedHeap.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/genCollectedHeap.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -256,6 +256,7 @@ + // Section on TLAB's. + virtual bool supports_tlab_allocation() const; + virtual size_t tlab_capacity(Thread* thr) const; ++ virtual size_t tlab_used(Thread* thr) const; + virtual size_t unsafe_max_tlab_alloc(Thread* thr) const; + virtual HeapWord* allocate_new_tlab(size_t size); + +--- ./hotspot/src/share/vm/memory/genOopClosures.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/genOopClosures.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -199,7 +199,7 @@ + protected: + template inline void do_oop_work(T* p) { + oop obj = oopDesc::load_decode_heap_oop(p); +- guarantee(obj->is_oop_or_null(), err_msg("invalid oop: " INTPTR_FORMAT, (oopDesc*) obj)); ++ guarantee(obj->is_oop_or_null(), err_msg("invalid oop: " INTPTR_FORMAT, p2i((oopDesc*) obj))); + } + public: + virtual void do_oop(oop* p); +--- ./hotspot/src/share/vm/memory/generation.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/generation.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -43,6 +43,8 @@ + #include "utilities/copy.hpp" + #include "utilities/events.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + Generation::Generation(ReservedSpace rs, size_t initial_size, int level) : + _level(level), + _ref_processor(NULL) { +--- ./hotspot/src/share/vm/memory/generation.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/generation.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -299,6 +299,10 @@ + guarantee(false, "Generation doesn't support thread local allocation buffers"); + return 0; + } ++ virtual size_t tlab_used() const { ++ guarantee(false, "Generation doesn't support thread local allocation buffers"); ++ return 0; ++ } + virtual size_t unsafe_max_tlab_alloc() const { + guarantee(false, "Generation doesn't support thread local allocation buffers"); + return 0; +@@ -418,7 +422,7 @@ + // have to guard against non-monotonicity. + NOT_PRODUCT( + if (now < _time_of_last_gc) { +- warning("time warp: "INT64_FORMAT" to "INT64_FORMAT, _time_of_last_gc, now); ++ warning("time warp: "INT64_FORMAT" to "INT64_FORMAT, (int64_t)_time_of_last_gc, (int64_t)now); + } + ) + return _time_of_last_gc; +--- ./hotspot/src/share/vm/memory/heapInspection.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/heapInspection.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -35,6 +35,8 @@ + #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp" + #endif // INCLUDE_ALL_GCS + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // HeapInspection + + int KlassInfoEntry::compare(KlassInfoEntry* e1, KlassInfoEntry* e2) { +@@ -270,6 +272,7 @@ + return true; + } + ++PRAGMA_FORMAT_NONLITERAL_IGNORED_EXTERNAL + void KlassInfoHisto::print_title(outputStream* st, bool csv_format, + bool selected[], int width_table[], + const char *name_table[]) { +@@ -282,7 +285,10 @@ + } else { + st->print("Index Super"); + for (int c=0; cprint(str_fmt(width_table[c]), name_table[c]);} ++PRAGMA_DIAG_POP + } + st->print(" ClassName"); + } +@@ -395,12 +401,18 @@ + case KlassSizeStats::_index_inst_size: + case KlassSizeStats::_index_inst_count: + case KlassSizeStats::_index_method_count: ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL + st->print(str_fmt(width_table[c]), "-"); ++PRAGMA_DIAG_POP + break; + default: + { + double perc = (double)(100) * (double)(colsum_table[c]) / (double)sz_sum._total_bytes; ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL + st->print(perc_fmt(width_table[c]), perc); ++PRAGMA_DIAG_POP + } + } + } +--- ./hotspot/src/share/vm/memory/heapInspection.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/heapInspection.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -295,6 +295,9 @@ + // returns a format string to print a julong with the given width. E.g, + // printf(num_fmt(6), julong(10)) would print out the number 10 with 4 + // leading spaces. ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED ++ + static void print_julong(outputStream* st, int width, julong n) { + int num_spaces = width - julong_width(n); + if (num_spaces > 0) { +@@ -302,6 +305,7 @@ + } + st->print(JULONG_FORMAT, n); + } ++PRAGMA_DIAG_POP + + static char* perc_fmt(int width) { + static char buf[32]; +--- ./hotspot/src/share/vm/memory/metachunk.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/metachunk.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -28,6 +28,8 @@ + #include "utilities/copy.hpp" + #include "utilities/debug.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + class VirtualSpaceNode; + + const size_t metadata_chunk_initialize = 0xf7f7f7f7; +--- ./hotspot/src/share/vm/memory/metachunk.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/metachunk.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -143,6 +143,8 @@ + void set_is_tagged_free(bool v) { _is_tagged_free = v; } + #endif + ++ bool contains(const void* ptr) { return bottom() <= ptr && ptr < _top; } ++ + NOT_PRODUCT(void mangle();) + + void print_on(outputStream* st) const; +--- ./hotspot/src/share/vm/memory/metaspace.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/metaspace.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -32,7 +32,9 @@ + #include "memory/gcLocker.hpp" + #include "memory/metachunk.hpp" + #include "memory/metaspace.hpp" ++#include "memory/metaspaceGCThresholdUpdater.hpp" + #include "memory/metaspaceShared.hpp" ++#include "memory/metaspaceTracer.hpp" + #include "memory/resourceArea.hpp" + #include "memory/universe.hpp" + #include "runtime/atomic.inline.hpp" +@@ -46,8 +48,10 @@ + #include "utilities/copy.hpp" + #include "utilities/debug.hpp" + +-typedef BinaryTreeDictionary BlockTreeDictionary; +-typedef BinaryTreeDictionary ChunkTreeDictionary; ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ ++typedef BinaryTreeDictionary > BlockTreeDictionary; ++typedef BinaryTreeDictionary > ChunkTreeDictionary; + + // Set this constant to enable slow integrity checking of the free chunk lists + const bool metaspace_slow_verify = false; +@@ -57,6 +61,7 @@ + MetaWord* last_allocated = 0; + + size_t Metaspace::_compressed_class_space_size; ++const MetaspaceTracer* Metaspace::_tracer = NULL; + + // Used in declarations in SpaceManager and ChunkManager + enum ChunkIndex { +@@ -182,6 +187,48 @@ + // Remove from a list by size. Selects list based on size of chunk. + Metachunk* free_chunks_get(size_t chunk_word_size); + ++#define index_bounds_check(index) \ ++ assert(index == SpecializedIndex || \ ++ index == SmallIndex || \ ++ index == MediumIndex || \ ++ index == HumongousIndex, err_msg("Bad index: %d", (int) index)) ++ ++ size_t num_free_chunks(ChunkIndex index) const { ++ index_bounds_check(index); ++ ++ if (index == HumongousIndex) { ++ return _humongous_dictionary.total_free_blocks(); ++ } ++ ++ ssize_t count = _free_chunks[index].count(); ++ return count == -1 ? 0 : (size_t) count; ++ } ++ ++ size_t size_free_chunks_in_bytes(ChunkIndex index) const { ++ index_bounds_check(index); ++ ++ size_t word_size = 0; ++ if (index == HumongousIndex) { ++ word_size = _humongous_dictionary.total_size(); ++ } else { ++ const size_t size_per_chunk_in_words = _free_chunks[index].size(); ++ word_size = size_per_chunk_in_words * num_free_chunks(index); ++ } ++ ++ return word_size * BytesPerWord; ++ } ++ ++ MetaspaceChunkFreeListSummary chunk_free_list_summary() const { ++ return MetaspaceChunkFreeListSummary(num_free_chunks(SpecializedIndex), ++ num_free_chunks(SmallIndex), ++ num_free_chunks(MediumIndex), ++ num_free_chunks(HumongousIndex), ++ size_free_chunks_in_bytes(SpecializedIndex), ++ size_free_chunks_in_bytes(SmallIndex), ++ size_free_chunks_in_bytes(MediumIndex), ++ size_free_chunks_in_bytes(HumongousIndex)); ++ } ++ + // Debug support + void verify(); + void slow_verify() { +@@ -269,6 +316,8 @@ + MetaWord* bottom() const { return (MetaWord*) _virtual_space.low(); } + MetaWord* end() const { return (MetaWord*) _virtual_space.high(); } + ++ bool contains(const void* ptr) { return ptr >= low() && ptr < high(); } ++ + size_t reserved_words() const { return _virtual_space.reserved_size() / BytesPerWord; } + size_t committed_words() const { return _virtual_space.actual_committed_size() / BytesPerWord; } + +@@ -510,11 +559,11 @@ + void inc_virtual_space_count(); + void dec_virtual_space_count(); + ++ bool contains(const void* ptr); ++ + // Unlink empty VirtualSpaceNodes and free it. + void purge(ChunkManager* chunk_manager); + +- bool contains(const void *ptr); +- + void print_on(outputStream* st) const; + + class VirtualSpaceListIterator : public StackObj { +@@ -558,7 +607,7 @@ + + private: + +- // protects allocations and contains. ++ // protects allocations + Mutex* const _lock; + + // Type of metadata allocated. +@@ -595,7 +644,9 @@ + private: + // Accessors + Metachunk* chunks_in_use(ChunkIndex index) const { return _chunks_in_use[index]; } +- void set_chunks_in_use(ChunkIndex index, Metachunk* v) { _chunks_in_use[index] = v; } ++ void set_chunks_in_use(ChunkIndex index, Metachunk* v) { ++ _chunks_in_use[index] = v; ++ } + + BlockFreelist* block_freelists() const { + return (BlockFreelist*) &_block_freelists; +@@ -786,7 +837,7 @@ + return NULL; + } + +- if (word_size < TreeChunk::min_size()) { ++ if (word_size < TreeChunk >::min_size()) { + // Dark matter. Too small for dictionary. + return NULL; + } +@@ -806,7 +857,7 @@ + MetaWord* new_block = (MetaWord*)free_block; + assert(block_size >= word_size, "Incorrect size of block from freelist"); + const size_t unused = block_size - word_size; +- if (unused >= TreeChunk::min_size()) { ++ if (unused >= TreeChunk >::min_size()) { + return_block(new_block + word_size, unused); + } + +@@ -1027,6 +1078,7 @@ + // nodes with a 0 container_count. Remove Metachunks in + // the node from their respective freelists. + void VirtualSpaceList::purge(ChunkManager* chunk_manager) { ++ assert(SafepointSynchronize::is_at_safepoint(), "must be called at safepoint for contains to work"); + assert_lock_strong(SpaceManager::expand_lock()); + // Don't use a VirtualSpaceListIterator because this + // list is being changed and a straightforward use of an iterator is not safe. +@@ -1060,8 +1112,8 @@ + } + #ifdef ASSERT + if (purged_vsl != NULL) { +- // List should be stable enough to use an iterator here. +- VirtualSpaceListIterator iter(virtual_space_list()); ++ // List should be stable enough to use an iterator here. ++ VirtualSpaceListIterator iter(virtual_space_list()); + while (iter.repeat()) { + VirtualSpaceNode* vsl = iter.get_next(); + assert(vsl != purged_vsl, "Purge of vsl failed"); +@@ -1070,6 +1122,23 @@ + #endif + } + ++ ++// This function looks at the mmap regions in the metaspace without locking. ++// The chunks are added with store ordering and not deleted except for at ++// unloading time during a safepoint. ++bool VirtualSpaceList::contains(const void* ptr) { ++ // List should be stable enough to use an iterator here because removing virtual ++ // space nodes is only allowed at a safepoint. ++ VirtualSpaceListIterator iter(virtual_space_list()); ++ while (iter.repeat()) { ++ VirtualSpaceNode* vsn = iter.get_next(); ++ if (vsn->contains(ptr)) { ++ return true; ++ } ++ } ++ return false; ++} ++ + void VirtualSpaceList::retire_current_virtual_space() { + assert_lock_strong(SpaceManager::expand_lock()); + +@@ -1287,19 +1356,6 @@ + } + } + +-bool VirtualSpaceList::contains(const void *ptr) { +- VirtualSpaceNode* list = virtual_space_list(); +- VirtualSpaceListIterator iter(list); +- while (iter.repeat()) { +- VirtualSpaceNode* node = iter.get_next(); +- if (node->reserved()->contains(ptr)) { +- return true; +- } +- } +- return false; +-} +- +- + // MetaspaceGC methods + + // VM_CollectForMetadataAllocation is the vm operation used to GC. +@@ -1367,6 +1423,17 @@ + return (size_t)Atomic::add_ptr(-(intptr_t)v, &_capacity_until_GC); + } + ++void MetaspaceGC::initialize() { ++ // Set the high-water mark to MaxMetapaceSize during VM initializaton since ++ // we can't do a GC during initialization. ++ _capacity_until_GC = MaxMetaspaceSize; ++} ++ ++void MetaspaceGC::post_initialize() { ++ // Reset the high-water mark once the VM initialization is done. ++ _capacity_until_GC = MAX2(MetaspaceAux::committed_bytes(), MetaspaceSize); ++} ++ + bool MetaspaceGC::can_expand(size_t word_size, bool is_class) { + // Check if the compressed class space is full. + if (is_class && Metaspace::using_class_space()) { +@@ -1387,21 +1454,13 @@ + + size_t MetaspaceGC::allowed_expansion() { + size_t committed_bytes = MetaspaceAux::committed_bytes(); ++ size_t capacity_until_gc = capacity_until_GC(); ++ ++ assert(capacity_until_gc >= committed_bytes, ++ err_msg("capacity_until_gc: " SIZE_FORMAT " < committed_bytes: " SIZE_FORMAT, ++ capacity_until_gc, committed_bytes)); + + size_t left_until_max = MaxMetaspaceSize - committed_bytes; +- +- // Always grant expansion if we are initiating the JVM, +- // or if the GC_locker is preventing GCs. +- if (!is_init_completed() || GC_locker::is_active_and_needs_gc()) { +- return left_until_max / BytesPerWord; +- } +- +- size_t capacity_until_gc = capacity_until_GC(); +- +- if (capacity_until_gc <= committed_bytes) { +- return 0; +- } +- + size_t left_until_GC = capacity_until_gc - committed_bytes; + size_t left_to_commit = MIN2(left_until_GC, left_until_max); + +@@ -1413,7 +1472,15 @@ + uint current_shrink_factor = _shrink_factor; + _shrink_factor = 0; + +- const size_t used_after_gc = MetaspaceAux::allocated_capacity_bytes(); ++ // Using committed_bytes() for used_after_gc is an overestimation, since the ++ // chunk free lists are included in committed_bytes() and the memory in an ++ // un-fragmented chunk free list is available for future allocations. ++ // However, if the chunk free lists becomes fragmented, then the memory may ++ // not be available for future allocations and the memory is therefore "in use". ++ // Including the chunk free lists in the definition of "in use" is therefore ++ // necessary. Not including the chunk free lists can cause capacity_until_GC to ++ // shrink below committed_bytes() and this has caused serious bugs in the past. ++ const size_t used_after_gc = MetaspaceAux::committed_bytes(); + const size_t capacity_until_GC = MetaspaceGC::capacity_until_GC(); + + const double minimum_free_percentage = MinMetaspaceFreeRatio / 100.0; +@@ -1447,19 +1514,21 @@ + expand_bytes = align_size_up(expand_bytes, Metaspace::commit_alignment()); + // Don't expand unless it's significant + if (expand_bytes >= MinMetaspaceExpansion) { +- MetaspaceGC::inc_capacity_until_GC(expand_bytes); +- } +- if (PrintGCDetails && Verbose) { +- size_t new_capacity_until_GC = capacity_until_GC; +- gclog_or_tty->print_cr(" expanding:" +- " minimum_desired_capacity: %6.1fKB" +- " expand_bytes: %6.1fKB" +- " MinMetaspaceExpansion: %6.1fKB" +- " new metaspace HWM: %6.1fKB", +- minimum_desired_capacity / (double) K, +- expand_bytes / (double) K, +- MinMetaspaceExpansion / (double) K, +- new_capacity_until_GC / (double) K); ++ size_t new_capacity_until_GC = MetaspaceGC::inc_capacity_until_GC(expand_bytes); ++ Metaspace::tracer()->report_gc_threshold(capacity_until_GC, ++ new_capacity_until_GC, ++ MetaspaceGCThresholdUpdater::ComputeNewSize); ++ if (PrintGCDetails && Verbose) { ++ gclog_or_tty->print_cr(" expanding:" ++ " minimum_desired_capacity: %6.1fKB" ++ " expand_bytes: %6.1fKB" ++ " MinMetaspaceExpansion: %6.1fKB" ++ " new metaspace HWM: %6.1fKB", ++ minimum_desired_capacity / (double) K, ++ expand_bytes / (double) K, ++ MinMetaspaceExpansion / (double) K, ++ new_capacity_until_GC / (double) K); ++ } + } + return; + } +@@ -1538,7 +1607,10 @@ + // Don't shrink unless it's significant + if (shrink_bytes >= MinMetaspaceExpansion && + ((capacity_until_GC - shrink_bytes) >= MetaspaceSize)) { +- MetaspaceGC::dec_capacity_until_GC(shrink_bytes); ++ size_t new_capacity_until_GC = MetaspaceGC::dec_capacity_until_GC(shrink_bytes); ++ Metaspace::tracer()->report_gc_threshold(capacity_until_GC, ++ new_capacity_until_GC, ++ MetaspaceGCThresholdUpdater::ComputeNewSize); + } + } + +@@ -1921,7 +1993,7 @@ + st->print_cr(" free " SIZE_FORMAT, + chunk->free_word_size()); + } else { +- st->print_cr(""); ++ st->cr(); + } + } + +@@ -2205,7 +2277,7 @@ + humongous_chunks = next_humongous_chunks; + } + if (TraceMetadataChunkAllocation && Verbose) { +- gclog_or_tty->print_cr(""); ++ gclog_or_tty->cr(); + gclog_or_tty->print_cr("updated dictionary count %d %s", + chunk_manager()->humongous_dictionary()->total_count(), + chunk_size_name(HumongousIndex)); +@@ -2250,7 +2322,7 @@ + void SpaceManager::deallocate(MetaWord* p, size_t word_size) { + assert_lock_strong(_lock); + size_t raw_word_size = get_raw_word_size(word_size); +- size_t min_size = TreeChunk::min_size(); ++ size_t min_size = TreeChunk >::min_size(); + assert(raw_word_size >= min_size, + err_msg("Should not deallocate dark matter " SIZE_FORMAT "<" SIZE_FORMAT, word_size, min_size)); + block_freelists()->return_block(p, raw_word_size); +@@ -2306,7 +2378,7 @@ + void SpaceManager::retire_current_chunk() { + if (current_chunk() != NULL) { + size_t remaining_words = current_chunk()->free_word_size(); +- if (remaining_words >= TreeChunk::min_size()) { ++ if (remaining_words >= TreeChunk >::min_size()) { + block_freelists()->return_block(current_chunk()->allocate(remaining_words), remaining_words); + inc_used_metrics(remaining_words); + } +@@ -2483,8 +2555,8 @@ + // MetaspaceAux + + +-size_t MetaspaceAux::_allocated_capacity_words[] = {0, 0}; +-size_t MetaspaceAux::_allocated_used_words[] = {0, 0}; ++size_t MetaspaceAux::_capacity_words[] = {0, 0}; ++size_t MetaspaceAux::_used_words[] = {0, 0}; + + size_t MetaspaceAux::free_bytes(Metaspace::MetadataType mdtype) { + VirtualSpaceList* list = Metaspace::get_space_list(mdtype); +@@ -2497,38 +2569,38 @@ + + void MetaspaceAux::dec_capacity(Metaspace::MetadataType mdtype, size_t words) { + assert_lock_strong(SpaceManager::expand_lock()); +- assert(words <= allocated_capacity_words(mdtype), ++ assert(words <= capacity_words(mdtype), + err_msg("About to decrement below 0: words " SIZE_FORMAT +- " is greater than _allocated_capacity_words[%u] " SIZE_FORMAT, +- words, mdtype, allocated_capacity_words(mdtype))); +- _allocated_capacity_words[mdtype] -= words; ++ " is greater than _capacity_words[%u] " SIZE_FORMAT, ++ words, mdtype, capacity_words(mdtype))); ++ _capacity_words[mdtype] -= words; + } + + void MetaspaceAux::inc_capacity(Metaspace::MetadataType mdtype, size_t words) { + assert_lock_strong(SpaceManager::expand_lock()); + // Needs to be atomic +- _allocated_capacity_words[mdtype] += words; ++ _capacity_words[mdtype] += words; + } + + void MetaspaceAux::dec_used(Metaspace::MetadataType mdtype, size_t words) { +- assert(words <= allocated_used_words(mdtype), ++ assert(words <= used_words(mdtype), + err_msg("About to decrement below 0: words " SIZE_FORMAT +- " is greater than _allocated_used_words[%u] " SIZE_FORMAT, +- words, mdtype, allocated_used_words(mdtype))); ++ " is greater than _used_words[%u] " SIZE_FORMAT, ++ words, mdtype, used_words(mdtype))); + // For CMS deallocation of the Metaspaces occurs during the + // sweep which is a concurrent phase. Protection by the expand_lock() + // is not enough since allocation is on a per Metaspace basis + // and protected by the Metaspace lock. + jlong minus_words = (jlong) - (jlong) words; +- Atomic::add_ptr(minus_words, &_allocated_used_words[mdtype]); ++ Atomic::add_ptr(minus_words, &_used_words[mdtype]); + } + + void MetaspaceAux::inc_used(Metaspace::MetadataType mdtype, size_t words) { +- // _allocated_used_words tracks allocations for ++ // _used_words tracks allocations for + // each piece of metadata. Those allocations are + // generally done concurrently by different application + // threads so must be done atomically. +- Atomic::add_ptr(words, &_allocated_used_words[mdtype]); ++ Atomic::add_ptr(words, &_used_words[mdtype]); + } + + size_t MetaspaceAux::used_bytes_slow(Metaspace::MetadataType mdtype) { +@@ -2575,16 +2647,16 @@ + + size_t MetaspaceAux::capacity_bytes_slow() { + #ifdef PRODUCT +- // Use allocated_capacity_bytes() in PRODUCT instead of this function. ++ // Use capacity_bytes() in PRODUCT instead of this function. + guarantee(false, "Should not call capacity_bytes_slow() in the PRODUCT"); + #endif + size_t class_capacity = capacity_bytes_slow(Metaspace::ClassType); + size_t non_class_capacity = capacity_bytes_slow(Metaspace::NonClassType); +- assert(allocated_capacity_bytes() == class_capacity + non_class_capacity, +- err_msg("bad accounting: allocated_capacity_bytes() " SIZE_FORMAT ++ assert(capacity_bytes() == class_capacity + non_class_capacity, ++ err_msg("bad accounting: capacity_bytes() " SIZE_FORMAT + " class_capacity + non_class_capacity " SIZE_FORMAT + " class_capacity " SIZE_FORMAT " non_class_capacity " SIZE_FORMAT, +- allocated_capacity_bytes(), class_capacity + non_class_capacity, ++ capacity_bytes(), class_capacity + non_class_capacity, + class_capacity, non_class_capacity)); + + return class_capacity + non_class_capacity; +@@ -2624,6 +2696,19 @@ + return free_chunks_total_words() * BytesPerWord; + } + ++bool MetaspaceAux::has_chunk_free_list(Metaspace::MetadataType mdtype) { ++ return Metaspace::get_chunk_manager(mdtype) != NULL; ++} ++ ++MetaspaceChunkFreeListSummary MetaspaceAux::chunk_free_list_summary(Metaspace::MetadataType mdtype) { ++ if (!has_chunk_free_list(mdtype)) { ++ return MetaspaceChunkFreeListSummary(); ++ } ++ ++ const ChunkManager* cm = Metaspace::get_chunk_manager(mdtype); ++ return cm->chunk_free_list_summary(); ++} ++ + void MetaspaceAux::print_metaspace_change(size_t prev_metadata_used) { + gclog_or_tty->print(", [Metaspace:"); + if (PrintGCDetails && Verbose) { +@@ -2631,14 +2716,14 @@ + "->" SIZE_FORMAT + "(" SIZE_FORMAT ")", + prev_metadata_used, +- allocated_used_bytes(), ++ used_bytes(), + reserved_bytes()); + } else { + gclog_or_tty->print(" " SIZE_FORMAT "K" + "->" SIZE_FORMAT "K" + "(" SIZE_FORMAT "K)", + prev_metadata_used/K, +- allocated_used_bytes()/K, ++ used_bytes()/K, + reserved_bytes()/K); + } + +@@ -2654,8 +2739,8 @@ + "capacity " SIZE_FORMAT "K, " + "committed " SIZE_FORMAT "K, " + "reserved " SIZE_FORMAT "K", +- allocated_used_bytes()/K, +- allocated_capacity_bytes()/K, ++ used_bytes()/K, ++ capacity_bytes()/K, + committed_bytes()/K, + reserved_bytes()/K); + +@@ -2666,8 +2751,8 @@ + "capacity " SIZE_FORMAT "K, " + "committed " SIZE_FORMAT "K, " + "reserved " SIZE_FORMAT "K", +- allocated_used_bytes(ct)/K, +- allocated_capacity_bytes(ct)/K, ++ used_bytes(ct)/K, ++ capacity_bytes(ct)/K, + committed_bytes(ct)/K, + reserved_bytes(ct)/K); + } +@@ -2769,42 +2854,42 @@ + + void MetaspaceAux::verify_capacity() { + #ifdef ASSERT +- size_t running_sum_capacity_bytes = allocated_capacity_bytes(); ++ size_t running_sum_capacity_bytes = capacity_bytes(); + // For purposes of the running sum of capacity, verify against capacity + size_t capacity_in_use_bytes = capacity_bytes_slow(); + assert(running_sum_capacity_bytes == capacity_in_use_bytes, +- err_msg("allocated_capacity_words() * BytesPerWord " SIZE_FORMAT ++ err_msg("capacity_words() * BytesPerWord " SIZE_FORMAT + " capacity_bytes_slow()" SIZE_FORMAT, + running_sum_capacity_bytes, capacity_in_use_bytes)); + for (Metaspace::MetadataType i = Metaspace::ClassType; + i < Metaspace:: MetadataTypeCount; + i = (Metaspace::MetadataType)(i + 1)) { + size_t capacity_in_use_bytes = capacity_bytes_slow(i); +- assert(allocated_capacity_bytes(i) == capacity_in_use_bytes, +- err_msg("allocated_capacity_bytes(%u) " SIZE_FORMAT ++ assert(capacity_bytes(i) == capacity_in_use_bytes, ++ err_msg("capacity_bytes(%u) " SIZE_FORMAT + " capacity_bytes_slow(%u)" SIZE_FORMAT, +- i, allocated_capacity_bytes(i), i, capacity_in_use_bytes)); ++ i, capacity_bytes(i), i, capacity_in_use_bytes)); + } + #endif + } + + void MetaspaceAux::verify_used() { + #ifdef ASSERT +- size_t running_sum_used_bytes = allocated_used_bytes(); ++ size_t running_sum_used_bytes = used_bytes(); + // For purposes of the running sum of used, verify against used + size_t used_in_use_bytes = used_bytes_slow(); +- assert(allocated_used_bytes() == used_in_use_bytes, +- err_msg("allocated_used_bytes() " SIZE_FORMAT ++ assert(used_bytes() == used_in_use_bytes, ++ err_msg("used_bytes() " SIZE_FORMAT + " used_bytes_slow()" SIZE_FORMAT, +- allocated_used_bytes(), used_in_use_bytes)); ++ used_bytes(), used_in_use_bytes)); + for (Metaspace::MetadataType i = Metaspace::ClassType; + i < Metaspace:: MetadataTypeCount; + i = (Metaspace::MetadataType)(i + 1)) { + size_t used_in_use_bytes = used_bytes_slow(i); +- assert(allocated_used_bytes(i) == used_in_use_bytes, +- err_msg("allocated_used_bytes(%u) " SIZE_FORMAT ++ assert(used_bytes(i) == used_in_use_bytes, ++ err_msg("used_bytes(%u) " SIZE_FORMAT + " used_bytes_slow(%u)" SIZE_FORMAT, +- i, allocated_used_bytes(i), i, used_in_use_bytes)); ++ i, used_bytes(i), i, used_in_use_bytes)); + } + #endif + } +@@ -3019,6 +3104,8 @@ + } + + void Metaspace::global_initialize() { ++ MetaspaceGC::initialize(); ++ + // Initialize the alignment for shared spaces. + int max_alignment = os::vm_page_size(); + size_t cds_total = 0; +@@ -3126,7 +3213,11 @@ + } + } + +- MetaspaceGC::initialize(); ++ _tracer = new MetaspaceTracer(); ++} ++ ++void Metaspace::post_initialize() { ++ MetaspaceGC::post_initialize(); + } + + Metachunk* Metaspace::get_initialization_chunk(MetadataType mdtype, +@@ -3215,8 +3306,12 @@ + assert(delta_bytes > 0, "Must be"); + + size_t after_inc = MetaspaceGC::inc_capacity_until_GC(delta_bytes); ++ ++ // capacity_until_GC might be updated concurrently, must calculate previous value. + size_t before_inc = after_inc - delta_bytes; + ++ tracer()->report_gc_threshold(before_inc, after_inc, ++ MetaspaceGCThresholdUpdater::ExpandAndAllocate); + if (PrintGCDetails && Verbose) { + gclog_or_tty->print_cr("Increase capacity to GC from " SIZE_FORMAT + " to " SIZE_FORMAT, before_inc, after_inc); +@@ -3274,7 +3369,7 @@ + assert(Thread::current()->is_VM_thread(), "should be the VM thread"); + // Don't take Heap_lock + MutexLockerEx ml(vsm()->lock(), Mutex::_no_safepoint_check_flag); +- if (word_size < TreeChunk::min_size()) { ++ if (word_size < TreeChunk >::min_size()) { + // Dark matter. Too small for dictionary. + #ifdef ASSERT + Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5); +@@ -3289,7 +3384,7 @@ + } else { + MutexLockerEx ml(vsm()->lock(), Mutex::_no_safepoint_check_flag); + +- if (word_size < TreeChunk::min_size()) { ++ if (word_size < TreeChunk >::min_size()) { + // Dark matter. Too small for dictionary. + #ifdef ASSERT + Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5); +@@ -3340,6 +3435,8 @@ + MetaWord* result = loader_data->metaspace_non_null()->allocate(word_size, mdtype); + + if (result == NULL) { ++ tracer()->report_metaspace_allocation_failure(loader_data, word_size, type, mdtype); ++ + // Allocation failed. + if (is_init_completed()) { + // Only start a GC if the bootstrapping has completed. +@@ -3351,7 +3448,7 @@ + } + + if (result == NULL) { +- report_metadata_oome(loader_data, word_size, mdtype, CHECK_NULL); ++ report_metadata_oome(loader_data, word_size, type, mdtype, CHECK_NULL); + } + + // Zero initialize. +@@ -3365,7 +3462,9 @@ + return class_vsm()->calc_chunk_size(word_size); + } + +-void Metaspace::report_metadata_oome(ClassLoaderData* loader_data, size_t word_size, MetadataType mdtype, TRAPS) { ++void Metaspace::report_metadata_oome(ClassLoaderData* loader_data, size_t word_size, MetaspaceObj::Type type, MetadataType mdtype, TRAPS) { ++ tracer()->report_metadata_oom(loader_data, word_size, type, mdtype); ++ + // If result is still null, we are out of memory. + if (Verbose && TraceMetadataChunkAllocation) { + gclog_or_tty->print_cr("Metaspace allocation failed for size " +@@ -3408,6 +3507,16 @@ + } + } + ++const char* Metaspace::metadata_type_name(Metaspace::MetadataType mdtype) { ++ switch (mdtype) { ++ case Metaspace::ClassType: return "Class"; ++ case Metaspace::NonClassType: return "Metadata"; ++ default: ++ assert(false, err_msg("Got bad mdtype: %d", (int) mdtype)); ++ return NULL; ++ } ++} ++ + void Metaspace::record_allocation(void* ptr, MetaspaceObj::Type type, size_t word_size) { + assert(DumpSharedSpaces, "sanity"); + +@@ -3463,17 +3572,16 @@ + } + } + +-bool Metaspace::contains(const void * ptr) { +- if (MetaspaceShared::is_in_shared_space(ptr)) { ++bool Metaspace::contains(const void* ptr) { ++ if (UseSharedSpaces && MetaspaceShared::is_in_shared_space(ptr)) { + return true; + } +- // This is checked while unlocked. As long as the virtualspaces are added +- // at the end, the pointer will be in one of them. The virtual spaces +- // aren't deleted presently. When they are, some sort of locking might +- // be needed. Note, locking this can cause inversion problems with the +- // caller in MetaspaceObj::is_metadata() function. +- return space_list()->contains(ptr) || +- (using_class_space() && class_space_list()->contains(ptr)); ++ ++ if (using_class_space() && get_space_list(ClassType)->contains(ptr)) { ++ return true; ++ } ++ ++ return get_space_list(NonClassType)->contains(ptr); + } + + void Metaspace::verify() { +@@ -3718,5 +3826,4 @@ + TestVirtualSpaceNodeTest::test(); + TestVirtualSpaceNodeTest::test_is_available(); + } +- + #endif +--- ./hotspot/src/share/vm/memory/metaspace.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/metaspace.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -26,6 +26,7 @@ + + #include "memory/allocation.hpp" + #include "memory/memRegion.hpp" ++#include "memory/metaspaceChunkFreeListSummary.hpp" + #include "runtime/virtualspace.hpp" + #include "utilities/exceptions.hpp" + +@@ -60,6 +61,7 @@ + class ClassLoaderData; + class Metablock; + class Metachunk; ++class MetaspaceTracer; + class MetaWord; + class Mutex; + class outputStream; +@@ -120,6 +122,7 @@ + static size_t compressed_class_space_size() { + return _compressed_class_space_size; + } ++ + static void set_compressed_class_space_size(size_t size) { + _compressed_class_space_size = size; + } +@@ -148,6 +151,8 @@ + static ChunkManager* _chunk_manager_metadata; + static ChunkManager* _chunk_manager_class; + ++ static const MetaspaceTracer* _tracer; ++ + public: + static VirtualSpaceList* space_list() { return _space_list; } + static VirtualSpaceList* class_space_list() { return _class_space_list; } +@@ -163,6 +168,8 @@ + return mdtype == ClassType ? chunk_manager_class() : chunk_manager_metadata(); + } + ++ static const MetaspaceTracer* tracer() { return _tracer; } ++ + private: + // This is used by DumpSharedSpaces only, where only _vsm is used. So we will + // maintain a single list for now. +@@ -201,6 +208,7 @@ + + static void ergo_initialize(); + static void global_initialize(); ++ static void post_initialize(); + + static size_t first_chunk_word_size() { return _first_chunk_word_size; } + static size_t first_class_chunk_word_size() { return _first_class_chunk_word_size; } +@@ -225,7 +233,8 @@ + MetaWord* expand_and_allocate(size_t size, + MetadataType mdtype); + +- static bool contains(const void *ptr); ++ static bool contains(const void* ptr); ++ + void dump(outputStream* const out) const; + + // Free empty virtualspaces +@@ -233,7 +242,9 @@ + static void purge(); + + static void report_metadata_oome(ClassLoaderData* loader_data, size_t word_size, +- MetadataType mdtype, TRAPS); ++ MetaspaceObj::Type type, MetadataType mdtype, TRAPS); ++ ++ static const char* metadata_type_name(Metaspace::MetadataType mdtype); + + void print_on(outputStream* st) const; + // Debugging support +@@ -271,11 +282,11 @@ + // allocated to a Metaspace. This is used instead of + // iterating over all the classloaders. One for each + // type of Metadata +- static size_t _allocated_capacity_words[Metaspace:: MetadataTypeCount]; +- // Running sum of space in all Metachunks that have ++ static size_t _capacity_words[Metaspace:: MetadataTypeCount]; ++ // Running sum of space in all Metachunks that + // are being used for metadata. One for each + // type of Metadata. +- static size_t _allocated_used_words[Metaspace:: MetadataTypeCount]; ++ static size_t _used_words[Metaspace:: MetadataTypeCount]; + + public: + // Decrement and increment _allocated_capacity_words +@@ -299,32 +310,32 @@ + static size_t free_chunks_total_bytes(); + static size_t free_chunks_total_bytes(Metaspace::MetadataType mdtype); + +- static size_t allocated_capacity_words(Metaspace::MetadataType mdtype) { +- return _allocated_capacity_words[mdtype]; ++ static size_t capacity_words(Metaspace::MetadataType mdtype) { ++ return _capacity_words[mdtype]; + } +- static size_t allocated_capacity_words() { +- return allocated_capacity_words(Metaspace::NonClassType) + +- allocated_capacity_words(Metaspace::ClassType); ++ static size_t capacity_words() { ++ return capacity_words(Metaspace::NonClassType) + ++ capacity_words(Metaspace::ClassType); + } +- static size_t allocated_capacity_bytes(Metaspace::MetadataType mdtype) { +- return allocated_capacity_words(mdtype) * BytesPerWord; ++ static size_t capacity_bytes(Metaspace::MetadataType mdtype) { ++ return capacity_words(mdtype) * BytesPerWord; + } +- static size_t allocated_capacity_bytes() { +- return allocated_capacity_words() * BytesPerWord; ++ static size_t capacity_bytes() { ++ return capacity_words() * BytesPerWord; + } + +- static size_t allocated_used_words(Metaspace::MetadataType mdtype) { +- return _allocated_used_words[mdtype]; ++ static size_t used_words(Metaspace::MetadataType mdtype) { ++ return _used_words[mdtype]; + } +- static size_t allocated_used_words() { +- return allocated_used_words(Metaspace::NonClassType) + +- allocated_used_words(Metaspace::ClassType); ++ static size_t used_words() { ++ return used_words(Metaspace::NonClassType) + ++ used_words(Metaspace::ClassType); + } +- static size_t allocated_used_bytes(Metaspace::MetadataType mdtype) { +- return allocated_used_words(mdtype) * BytesPerWord; ++ static size_t used_bytes(Metaspace::MetadataType mdtype) { ++ return used_words(mdtype) * BytesPerWord; + } +- static size_t allocated_used_bytes() { +- return allocated_used_words() * BytesPerWord; ++ static size_t used_bytes() { ++ return used_words() * BytesPerWord; + } + + static size_t free_bytes(); +@@ -347,6 +358,9 @@ + return min_chunk_size_words() * BytesPerWord; + } + ++ static bool has_chunk_free_list(Metaspace::MetadataType mdtype); ++ static MetaspaceChunkFreeListSummary chunk_free_list_summary(Metaspace::MetadataType mdtype); ++ + // Print change in used metadata. + static void print_metaspace_change(size_t prev_metadata_used); + static void print_on(outputStream * out); +@@ -385,7 +399,8 @@ + + public: + +- static void initialize() { _capacity_until_GC = MetaspaceSize; } ++ static void initialize(); ++ static void post_initialize(); + + static size_t capacity_until_GC(); + static size_t inc_capacity_until_GC(size_t v); +--- ./hotspot/src/share/vm/memory/metaspaceChunkFreeListSummary.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/memory/metaspaceChunkFreeListSummary.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,103 @@ ++/* ++ * 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_MEMORY_METASPACE_CHUNK_FREE_LIST_SUMMARY_HPP ++#define SHARE_VM_MEMORY_METASPACE_CHUNK_FREE_LIST_SUMMARY_HPP ++ ++#include "memory/allocation.hpp" ++ ++class MetaspaceChunkFreeListSummary VALUE_OBJ_CLASS_SPEC { ++ size_t _num_specialized_chunks; ++ size_t _num_small_chunks; ++ size_t _num_medium_chunks; ++ size_t _num_humongous_chunks; ++ ++ size_t _specialized_chunks_size_in_bytes; ++ size_t _small_chunks_size_in_bytes; ++ size_t _medium_chunks_size_in_bytes; ++ size_t _humongous_chunks_size_in_bytes; ++ ++ public: ++ MetaspaceChunkFreeListSummary() : ++ _num_specialized_chunks(0), ++ _num_small_chunks(0), ++ _num_medium_chunks(0), ++ _num_humongous_chunks(0), ++ _specialized_chunks_size_in_bytes(0), ++ _small_chunks_size_in_bytes(0), ++ _medium_chunks_size_in_bytes(0), ++ _humongous_chunks_size_in_bytes(0) ++ {} ++ ++ MetaspaceChunkFreeListSummary(size_t num_specialized_chunks, ++ size_t num_small_chunks, ++ size_t num_medium_chunks, ++ size_t num_humongous_chunks, ++ size_t specialized_chunks_size_in_bytes, ++ size_t small_chunks_size_in_bytes, ++ size_t medium_chunks_size_in_bytes, ++ size_t humongous_chunks_size_in_bytes) : ++ _num_specialized_chunks(num_specialized_chunks), ++ _num_small_chunks(num_small_chunks), ++ _num_medium_chunks(num_medium_chunks), ++ _num_humongous_chunks(num_humongous_chunks), ++ _specialized_chunks_size_in_bytes(specialized_chunks_size_in_bytes), ++ _small_chunks_size_in_bytes(small_chunks_size_in_bytes), ++ _medium_chunks_size_in_bytes(medium_chunks_size_in_bytes), ++ _humongous_chunks_size_in_bytes(humongous_chunks_size_in_bytes) ++ {} ++ ++ size_t num_specialized_chunks() const { ++ return _num_specialized_chunks; ++ } ++ ++ size_t num_small_chunks() const { ++ return _num_small_chunks; ++ } ++ ++ size_t num_medium_chunks() const { ++ return _num_medium_chunks; ++ } ++ ++ size_t num_humongous_chunks() const { ++ return _num_humongous_chunks; ++ } ++ ++ size_t specialized_chunks_size_in_bytes() const { ++ return _specialized_chunks_size_in_bytes; ++ } ++ ++ size_t small_chunks_size_in_bytes() const { ++ return _small_chunks_size_in_bytes; ++ } ++ ++ size_t medium_chunks_size_in_bytes() const { ++ return _medium_chunks_size_in_bytes; ++ } ++ ++ size_t humongous_chunks_size_in_bytes() const { ++ return _humongous_chunks_size_in_bytes; ++ } ++}; ++ ++#endif // SHARE_VM_MEMORY_METASPACE_CHUNK_FREE_LIST_SUMMARY_HPP +--- ./hotspot/src/share/vm/memory/metaspaceCounters.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/metaspaceCounters.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -66,7 +66,7 @@ + MetaspacePerfCounters* MetaspaceCounters::_perf_counters = NULL; + + size_t MetaspaceCounters::used() { +- return MetaspaceAux::allocated_used_bytes(); ++ return MetaspaceAux::used_bytes(); + } + + size_t MetaspaceCounters::capacity() { +@@ -98,7 +98,7 @@ + MetaspacePerfCounters* CompressedClassSpaceCounters::_perf_counters = NULL; + + size_t CompressedClassSpaceCounters::used() { +- return MetaspaceAux::allocated_used_bytes(Metaspace::ClassType); ++ return MetaspaceAux::used_bytes(Metaspace::ClassType); + } + + size_t CompressedClassSpaceCounters::capacity() { +--- ./hotspot/src/share/vm/memory/metaspaceGCThresholdUpdater.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/memory/metaspaceGCThresholdUpdater.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,52 @@ ++/* ++ * 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_MEMORY_METASPACE_GC_THRESHOLD_UPDATER_HPP ++#define SHARE_VM_MEMORY_METASPACE_GC_THRESHOLD_UPDATER_HPP ++ ++#include "memory/allocation.hpp" ++#include "utilities/debug.hpp" ++ ++class MetaspaceGCThresholdUpdater : public AllStatic { ++ public: ++ enum Type { ++ ComputeNewSize, ++ ExpandAndAllocate, ++ Last ++ }; ++ ++ static const char* to_string(MetaspaceGCThresholdUpdater::Type updater) { ++ switch (updater) { ++ case ComputeNewSize: ++ return "compute_new_size"; ++ case ExpandAndAllocate: ++ return "expand_and_allocate"; ++ default: ++ assert(false, err_msg("Got bad updater: %d", (int) updater)); ++ return NULL; ++ }; ++ } ++}; ++ ++#endif // SHARE_VM_MEMORY_METASPACE_GC_THRESHOLD_UPDATER_HPP +--- ./hotspot/src/share/vm/memory/metaspaceShared.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/metaspaceShared.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -40,6 +40,7 @@ + #include "runtime/vmThread.hpp" + #include "utilities/hashtable.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + int MetaspaceShared::_max_alignment = 0; + +@@ -337,13 +338,14 @@ + int all_rw_count = 0; + int all_rw_bytes = 0; + +- const char *fmt = "%-20s: %8d %10d %5.1f | %8d %10d %5.1f | %8d %10d %5.1f"; ++// To make fmt_stats be a syntactic constant (for format warnings), use #define. ++#define fmt_stats "%-20s: %8d %10d %5.1f | %8d %10d %5.1f | %8d %10d %5.1f" + const char *sep = "--------------------+---------------------------+---------------------------+--------------------------"; + const char *hdr = " ro_cnt ro_bytes % | rw_cnt rw_bytes % | all_cnt all_bytes %"; + + tty->print_cr("Detailed metadata info (rw includes md and mc):"); +- tty->print_cr(hdr); +- tty->print_cr(sep); ++ tty->print_cr("%s", hdr); ++ tty->print_cr("%s", sep); + for (int type = 0; type < int(_number_of_types); type ++) { + const char *name = type_name((Type)type); + int ro_count = _counts[RO][type]; +@@ -357,7 +359,7 @@ + double rw_perc = 100.0 * double(rw_bytes) / double(rw_all); + double perc = 100.0 * double(bytes) / double(ro_all + rw_all); + +- tty->print_cr(fmt, name, ++ tty->print_cr(fmt_stats, name, + ro_count, ro_bytes, ro_perc, + rw_count, rw_bytes, rw_perc, + count, bytes, perc); +@@ -375,14 +377,15 @@ + double all_rw_perc = 100.0 * double(all_rw_bytes) / double(rw_all); + double all_perc = 100.0 * double(all_bytes) / double(ro_all + rw_all); + +- tty->print_cr(sep); +- tty->print_cr(fmt, "Total", ++ tty->print_cr("%s", sep); ++ tty->print_cr(fmt_stats, "Total", + all_ro_count, all_ro_bytes, all_ro_perc, + all_rw_count, all_rw_bytes, all_rw_perc, + all_count, all_bytes, all_perc); + + assert(all_ro_bytes == ro_all, "everything should have been counted"); + assert(all_rw_bytes == rw_all, "everything should have been counted"); ++#undef fmt_stats + } + + // Populate the shared space. +@@ -514,7 +517,8 @@ + md_top = wc.get_top(); + + // Print shared spaces all the time +- const char* fmt = "%s space: %9d [ %4.1f%% of total] out of %9d bytes [%4.1f%% used] at " PTR_FORMAT; ++// To make fmt_space be a syntactic constant (for format warnings), use #define. ++#define fmt_space "%s space: %9d [ %4.1f%% of total] out of %9d bytes [%4.1f%% used] at " PTR_FORMAT + Metaspace* ro_space = _loader_data->ro_metaspace(); + Metaspace* rw_space = _loader_data->rw_metaspace(); + +@@ -545,10 +549,10 @@ + const double mc_u_perc = mc_bytes / double(mc_alloced) * 100.0; + const double total_u_perc = total_bytes / double(total_alloced) * 100.0; + +- tty->print_cr(fmt, "ro", ro_bytes, ro_t_perc, ro_alloced, ro_u_perc, ro_space->bottom()); +- tty->print_cr(fmt, "rw", rw_bytes, rw_t_perc, rw_alloced, rw_u_perc, rw_space->bottom()); +- tty->print_cr(fmt, "md", md_bytes, md_t_perc, md_alloced, md_u_perc, md_low); +- tty->print_cr(fmt, "mc", mc_bytes, mc_t_perc, mc_alloced, mc_u_perc, mc_low); ++ tty->print_cr(fmt_space, "ro", ro_bytes, ro_t_perc, ro_alloced, ro_u_perc, ro_space->bottom()); ++ tty->print_cr(fmt_space, "rw", rw_bytes, rw_t_perc, rw_alloced, rw_u_perc, rw_space->bottom()); ++ tty->print_cr(fmt_space, "md", md_bytes, md_t_perc, md_alloced, md_u_perc, md_low); ++ tty->print_cr(fmt_space, "mc", mc_bytes, mc_t_perc, mc_alloced, mc_u_perc, mc_low); + tty->print_cr("total : %9d [100.0%% of total] out of %9d bytes [%4.1f%% used]", + total_bytes, total_alloced, total_u_perc); + +@@ -603,6 +607,7 @@ + + dac.dump_stats(int(ro_bytes), int(rw_bytes), int(md_bytes), int(mc_bytes)); + } ++#undef fmt_space + } + + static void link_shared_classes(Klass* obj, TRAPS) { +@@ -645,9 +650,6 @@ + TraceTime timer("Dump Shared Spaces", TraceStartupTime); + ResourceMark rm; + +- // Lock out GC - is it necessary? I don't think we care. +- No_GC_Verifier no_gc; +- + // Preload classes to be shared. + // Should use some os:: method rather than fopen() here. aB. + // Construct the path to the class list (in jre/lib) +--- ./hotspot/src/share/vm/memory/metaspaceTracer.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/memory/metaspaceTracer.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,82 @@ ++/* ++ * 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 "classfile/classLoaderData.hpp" ++#include "memory/metaspaceTracer.hpp" ++#include "oops/oop.inline.hpp" ++#include "trace/tracing.hpp" ++#include "trace/traceBackend.hpp" ++ ++void MetaspaceTracer::report_gc_threshold(size_t old_val, ++ size_t new_val, ++ MetaspaceGCThresholdUpdater::Type updater) const { ++ EventMetaspaceGCThreshold event; ++ if (event.should_commit()) { ++ event.set_oldValue(old_val); ++ event.set_newValue(new_val); ++ event.set_updater((u1)updater); ++ event.commit(); ++ } ++} ++ ++void MetaspaceTracer::report_metaspace_allocation_failure(ClassLoaderData *cld, ++ size_t word_size, ++ MetaspaceObj::Type objtype, ++ Metaspace::MetadataType mdtype) const { ++ send_allocation_failure_event(cld, word_size, objtype, mdtype); ++} ++ ++void MetaspaceTracer::report_metadata_oom(ClassLoaderData *cld, ++ size_t word_size, ++ MetaspaceObj::Type objtype, ++ Metaspace::MetadataType mdtype) const { ++ send_allocation_failure_event(cld, word_size, objtype, mdtype); ++} ++ ++template ++void MetaspaceTracer::send_allocation_failure_event(ClassLoaderData *cld, ++ size_t word_size, ++ MetaspaceObj::Type objtype, ++ Metaspace::MetadataType mdtype) const { ++ E event; ++ if (event.should_commit()) { ++ if (cld->is_anonymous()) { ++ event.set_classLoader(NULL); ++ event.set_anonymousClassLoader(true); ++ } else { ++ if (cld->is_the_null_class_loader_data()) { ++ event.set_classLoader((Klass*) NULL); ++ } else { ++ event.set_classLoader(cld->class_loader()->klass()); ++ } ++ event.set_anonymousClassLoader(false); ++ } ++ ++ event.set_size(word_size * BytesPerWord); ++ event.set_metadataType((u1) mdtype); ++ event.set_metaspaceObjectType((u1) objtype); ++ event.commit(); ++ } ++} +--- ./hotspot/src/share/vm/memory/metaspaceTracer.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/memory/metaspaceTracer.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * 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_MEMORY_METASPACE_TRACER_HPP ++#define SHARE_VM_MEMORY_METASPACE_TRACER_HPP ++ ++#include "memory/allocation.hpp" ++#include "memory/metaspace.hpp" ++#include "memory/metaspaceGCThresholdUpdater.hpp" ++ ++class ClassLoaderData; ++ ++class MetaspaceTracer : public CHeapObj { ++ template ++ void send_allocation_failure_event(ClassLoaderData *cld, ++ size_t word_size, ++ MetaspaceObj::Type objtype, ++ Metaspace::MetadataType mdtype) const; ++ public: ++ void report_gc_threshold(size_t old_val, ++ size_t new_val, ++ MetaspaceGCThresholdUpdater::Type updater) const; ++ void report_metaspace_allocation_failure(ClassLoaderData *cld, ++ size_t word_size, ++ MetaspaceObj::Type objtype, ++ Metaspace::MetadataType mdtype) const; ++ void report_metadata_oom(ClassLoaderData *cld, ++ size_t word_size, ++ MetaspaceObj::Type objtype, ++ Metaspace::MetadataType mdtype) const; ++ ++}; ++ ++#endif // SHARE_VM_MEMORY_METASPACE_TRACER_HPP +--- ./hotspot/src/share/vm/memory/modRefBarrierSet.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/modRefBarrierSet.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -60,7 +60,7 @@ + void read_ref_field(void* field) {} + void read_prim_field(HeapWord* field, size_t bytes) {} + protected: +- virtual void write_ref_field_work(void* field, oop new_val) = 0; ++ virtual void write_ref_field_work(void* field, oop new_val, bool release = false) = 0; + public: + void write_prim_field(HeapWord* field, size_t bytes, + juint val1, juint val2) {} +--- ./hotspot/src/share/vm/memory/padded.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/padded.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -90,4 +90,23 @@ + static PaddedEnd* create_unfreeable(uint length); + }; + ++// Helper class to create an array of references to arrays of primitive types ++// Both the array of references and the data arrays are aligned to the given ++// alignment. The allocated memory is zero-filled. ++template ++class Padded2DArray { ++ public: ++ // Creates an aligned padded 2D array. ++ // The memory cannot be deleted since the raw memory chunk is not returned. ++ static T** create_unfreeable(uint rows, uint columns, size_t* allocation_size = NULL); ++}; ++ ++// Helper class to create an array of T objects. The array as a whole will ++// start at a multiple of alignment and its size will be aligned to alignment. ++template ++class PaddedPrimitiveArray { ++ public: ++ static T* create_unfreeable(size_t length); ++}; ++ + #endif // SHARE_VM_MEMORY_PADDED_HPP +--- ./hotspot/src/share/vm/memory/padded.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/padded.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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,3 +47,42 @@ + + return aligned_padded_array; + } ++ ++template ++T** Padded2DArray::create_unfreeable(uint rows, uint columns, size_t* allocation_size) { ++ // Calculate and align the size of the first dimension's table. ++ size_t table_size = align_size_up_(rows * sizeof(T*), alignment); ++ // The size of the separate rows. ++ size_t row_size = align_size_up_(columns * sizeof(T), alignment); ++ // Total size consists of the indirection table plus the rows. ++ size_t total_size = table_size + rows * row_size + alignment; ++ ++ // Allocate a chunk of memory large enough to allow alignment of the chunk. ++ void* chunk = AllocateHeap(total_size, flags); ++ // Clear the allocated memory. ++ memset(chunk, 0, total_size); ++ // Align the chunk of memory. ++ T** result = (T**)align_pointer_up(chunk, alignment); ++ void* data_start = (void*)((uintptr_t)result + table_size); ++ ++ // Fill in the row table. ++ for (size_t i = 0; i < rows; i++) { ++ result[i] = (T*)((uintptr_t)data_start + i * row_size); ++ } ++ ++ if (allocation_size != NULL) { ++ *allocation_size = total_size; ++ } ++ ++ return result; ++} ++ ++template ++T* PaddedPrimitiveArray::create_unfreeable(size_t length) { ++ // Allocate a chunk of memory large enough to allow for some alignment. ++ void* chunk = AllocateHeap(length * sizeof(T) + alignment, flags); ++ ++ memset(chunk, 0, length * sizeof(T) + alignment); ++ ++ return (T*)align_pointer_up(chunk, alignment); ++} +--- ./hotspot/src/share/vm/memory/referenceProcessor.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/referenceProcessor.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -35,6 +35,8 @@ + #include "runtime/java.hpp" + #include "runtime/jniHandles.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + ReferencePolicy* ReferenceProcessor::_always_clear_soft_ref_policy = NULL; + ReferencePolicy* ReferenceProcessor::_default_soft_ref_policy = NULL; + bool ReferenceProcessor::_pending_list_uses_discovered_field = false; +@@ -94,13 +96,10 @@ + bool mt_discovery, + uint mt_discovery_degree, + bool atomic_discovery, +- BoolObjectClosure* is_alive_non_header, +- bool discovered_list_needs_barrier) : ++ BoolObjectClosure* is_alive_non_header) : + _discovering_refs(false), + _enqueuing_is_done(false), + _is_alive_non_header(is_alive_non_header), +- _discovered_list_needs_barrier(discovered_list_needs_barrier), +- _bs(NULL), + _processing_is_mt(mt_processing), + _next_id(0) + { +@@ -126,10 +125,6 @@ + _discovered_refs[i].set_length(0); + } + +- // If we do barriers, cache a copy of the barrier set. +- if (discovered_list_needs_barrier) { +- _bs = Universe::heap()->barrier_set(); +- } + setup_policy(false /* default soft ref policy */); + } + +@@ -317,13 +312,9 @@ + // Enqueue references that are not made active again, and + // clear the decks for the next collection (cycle). + ref->enqueue_discovered_reflists((HeapWord*)pending_list_addr, task_executor); +- // Do the oop-check on pending_list_addr missed in +- // enqueue_discovered_reflist. We should probably +- // do a raw oop_check so that future such idempotent +- // oop_stores relying on the oop-check side-effect +- // may be elided automatically and safely without +- // affecting correctness. +- oop_store(pending_list_addr, oopDesc::load_decode_heap_oop(pending_list_addr)); ++ // Do the post-barrier on pending_list_addr missed in ++ // enqueue_discovered_reflist. ++ oopDesc::bs()->write_ref_field(pending_list_addr, oopDesc::load_decode_heap_oop(pending_list_addr)); + + // Stop treating discovered references specially. + ref->disable_discovery(); +@@ -347,10 +338,18 @@ + // (java.lang.ref.Reference.discovered), self-loop their "next" field + // thus distinguishing them from active References, then + // prepend them to the pending list. ++ // ++ // The Java threads will see the Reference objects linked together through ++ // the discovered field. Instead of trying to do the write barrier updates ++ // in all places in the reference processor where we manipulate the discovered ++ // field we make sure to do the barrier here where we anyway iterate through ++ // all linked Reference objects. Note that it is important to not dirty any ++ // cards during reference processing since this will cause card table ++ // verification to fail for G1. ++ // + // BKWRD COMPATIBILITY NOTE: For older JDKs (prior to the fix for 4956777), + // the "next" field is used to chain the pending list, not the discovered + // field. +- + if (TraceReferenceGC && PrintGCDetails) { + gclog_or_tty->print_cr("ReferenceProcessor::enqueue_discovered_reflist list " + INTPTR_FORMAT, (address)refs_list.head()); +@@ -358,7 +357,7 @@ + + oop obj = NULL; + oop next_d = refs_list.head(); +- if (pending_list_uses_discovered_field()) { // New behaviour ++ if (pending_list_uses_discovered_field()) { // New behavior + // Walk down the list, self-looping the next field + // so that the References are not considered active. + while (obj != next_d) { +@@ -372,15 +371,17 @@ + assert(java_lang_ref_Reference::next(obj) == NULL, + "Reference not active; should not be discovered"); + // Self-loop next, so as to make Ref not active. +- java_lang_ref_Reference::set_next(obj, obj); +- if (next_d == obj) { // obj is last +- // Swap refs_list into pendling_list_addr and ++ java_lang_ref_Reference::set_next_raw(obj, obj); ++ if (next_d != obj) { ++ oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), next_d); ++ } else { ++ // This is the last object. ++ // Swap refs_list into pending_list_addr and + // set obj's discovered to what we read from pending_list_addr. + oop old = oopDesc::atomic_exchange_oop(refs_list.head(), pending_list_addr); +- // Need oop_check on pending_list_addr above; +- // see special oop-check code at the end of +- // enqueue_discovered_reflists() further below. +- java_lang_ref_Reference::set_discovered(obj, old); // old may be NULL ++ // Need post-barrier on pending_list_addr. See enqueue_discovered_ref_helper() above. ++ java_lang_ref_Reference::set_discovered_raw(obj, old); // old may be NULL ++ oopDesc::bs()->write_ref_field(java_lang_ref_Reference::discovered_addr(obj), old); + } + } + } else { // Old behaviour +@@ -497,37 +498,28 @@ + } else { + new_next = _next; + } +- +- if (UseCompressedOops) { +- // Remove Reference object from list. +- oopDesc::encode_store_heap_oop((narrowOop*)_prev_next, new_next); +- } else { +- // Remove Reference object from list. +- oopDesc::store_heap_oop((oop*)_prev_next, new_next); +- } ++ // Remove Reference object from discovered list. Note that G1 does not need a ++ // pre-barrier here because we know the Reference has already been found/marked, ++ // that's how it ended up in the discovered list in the first place. ++ oop_store_raw(_prev_next, new_next); + NOT_PRODUCT(_removed++); + _refs_list.dec_length(1); + } + + // Make the Reference object active again. + void DiscoveredListIterator::make_active() { +- // For G1 we don't want to use set_next - it +- // will dirty the card for the next field of +- // the reference object and will fail +- // CT verification. ++ // The pre barrier for G1 is probably just needed for the old ++ // reference processing behavior. Should we guard this with ++ // ReferenceProcessor::pending_list_uses_discovered_field() ? + if (UseG1GC) { +- BarrierSet* bs = oopDesc::bs(); + HeapWord* next_addr = java_lang_ref_Reference::next_addr(_ref); +- + if (UseCompressedOops) { +- bs->write_ref_field_pre((narrowOop*)next_addr, NULL); ++ oopDesc::bs()->write_ref_field_pre((narrowOop*)next_addr, NULL); + } else { +- bs->write_ref_field_pre((oop*)next_addr, NULL); ++ oopDesc::bs()->write_ref_field_pre((oop*)next_addr, NULL); + } +- java_lang_ref_Reference::set_next_raw(_ref, NULL); +- } else { +- java_lang_ref_Reference::set_next(_ref, NULL); + } ++ java_lang_ref_Reference::set_next_raw(_ref, NULL); + } + + void DiscoveredListIterator::clear_referent() { +@@ -789,14 +781,6 @@ + bool _clear_referent; + }; + +-void ReferenceProcessor::set_discovered(oop ref, oop value) { +- if (_discovered_list_needs_barrier) { +- java_lang_ref_Reference::set_discovered(ref, value); +- } else { +- java_lang_ref_Reference::set_discovered_raw(ref, value); +- } +-} +- + // Balances reference queues. + // Move entries from all queues[0, 1, ..., _max_num_q-1] to + // queues[0, 1, ..., _num_q-1] because only the first _num_q +@@ -854,9 +838,9 @@ + // Add the chain to the to list. + if (ref_lists[to_idx].head() == NULL) { + // to list is empty. Make a loop at the end. +- set_discovered(move_tail, move_tail); ++ java_lang_ref_Reference::set_discovered_raw(move_tail, move_tail); + } else { +- set_discovered(move_tail, ref_lists[to_idx].head()); ++ java_lang_ref_Reference::set_discovered_raw(move_tail, ref_lists[to_idx].head()); + } + ref_lists[to_idx].set_head(move_head); + ref_lists[to_idx].inc_length(refs_to_move); +@@ -1079,16 +1063,6 @@ + // The last ref must have its discovered field pointing to itself. + oop next_discovered = (current_head != NULL) ? current_head : obj; + +- // Note: In the case of G1, this specific pre-barrier is strictly +- // not necessary because the only case we are interested in +- // here is when *discovered_addr is NULL (see the CAS further below), +- // so this will expand to nothing. As a result, we have manually +- // elided this out for G1, but left in the test for some future +- // collector that might have need for a pre-barrier here, e.g.:- +- // _bs->write_ref_field_pre((oop* or narrowOop*)discovered_addr, next_discovered); +- assert(!_discovered_list_needs_barrier || UseG1GC, +- "Need to check non-G1 collector: " +- "may need a pre-write-barrier for CAS from NULL below"); + oop retest = oopDesc::atomic_compare_exchange_oop(next_discovered, discovered_addr, + NULL); + if (retest == NULL) { +@@ -1097,9 +1071,6 @@ + // is necessary. + refs_list.set_head(obj); + refs_list.inc_length(1); +- if (_discovered_list_needs_barrier) { +- _bs->write_ref_field((void*)discovered_addr, next_discovered); +- } + + if (TraceReferenceGC) { + gclog_or_tty->print_cr("Discovered reference (mt) (" INTPTR_FORMAT ": %s)", +@@ -1250,24 +1221,14 @@ + if (_discovery_is_mt) { + add_to_discovered_list_mt(*list, obj, discovered_addr); + } else { +- // If "_discovered_list_needs_barrier", we do write barriers when +- // updating the discovered reference list. Otherwise, we do a raw store +- // here: the field will be visited later when processing the discovered +- // references. ++ // We do a raw store here: the field will be visited later when processing ++ // the discovered references. + oop current_head = list->head(); + // The last ref must have its discovered field pointing to itself. + oop next_discovered = (current_head != NULL) ? current_head : obj; + +- // As in the case further above, since we are over-writing a NULL +- // pre-value, we can safely elide the pre-barrier here for the case of G1. +- // e.g.:- _bs->write_ref_field_pre((oop* or narrowOop*)discovered_addr, next_discovered); + assert(discovered == NULL, "control point invariant"); +- assert(!_discovered_list_needs_barrier || UseG1GC, +- "For non-G1 collector, may need a pre-write-barrier for CAS from NULL below"); + oop_store_raw(discovered_addr, next_discovered); +- if (_discovered_list_needs_barrier) { +- _bs->write_ref_field((void*)discovered_addr, next_discovered); +- } + list->set_head(obj); + list->inc_length(1); + +--- ./hotspot/src/share/vm/memory/referenceProcessor.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/referenceProcessor.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -227,15 +227,6 @@ + // other collectors in configuration + bool _discovery_is_mt; // true if reference discovery is MT. + +- // If true, setting "next" field of a discovered refs list requires +- // write barrier(s). (Must be true if used in a collector in which +- // elements of a discovered list may be moved during discovery: for +- // example, a collector like Garbage-First that moves objects during a +- // long-term concurrent marking phase that does weak reference +- // discovery.) +- bool _discovered_list_needs_barrier; +- +- BarrierSet* _bs; // Cached copy of BarrierSet. + bool _enqueuing_is_done; // true if all weak references enqueued + bool _processing_is_mt; // true during phases when + // reference processing is MT. +@@ -380,11 +371,6 @@ + void enqueue_discovered_reflists(HeapWord* pending_list_addr, AbstractRefProcTaskExecutor* task_executor); + + protected: +- // Set the 'discovered' field of the given reference to +- // the given value - emitting barriers depending upon +- // the value of _discovered_list_needs_barrier. +- void set_discovered(oop ref, oop value); +- + // "Preclean" the given discovered reference list + // by removing references with strongly reachable referents. + // Currently used in support of CMS only. +@@ -420,32 +406,12 @@ + void update_soft_ref_master_clock(); + + public: +- // constructor +- ReferenceProcessor(): +- _span((HeapWord*)NULL, (HeapWord*)NULL), +- _discovered_refs(NULL), +- _discoveredSoftRefs(NULL), _discoveredWeakRefs(NULL), +- _discoveredFinalRefs(NULL), _discoveredPhantomRefs(NULL), +- _discovering_refs(false), +- _discovery_is_atomic(true), +- _enqueuing_is_done(false), +- _discovery_is_mt(false), +- _discovered_list_needs_barrier(false), +- _bs(NULL), +- _is_alive_non_header(NULL), +- _num_q(0), +- _max_num_q(0), +- _processing_is_mt(false), +- _next_id(0) +- { } +- + // Default parameters give you a vanilla reference processor. + ReferenceProcessor(MemRegion span, + bool mt_processing = false, uint mt_processing_degree = 1, + bool mt_discovery = false, uint mt_discovery_degree = 1, + bool atomic_discovery = true, +- BoolObjectClosure* is_alive_non_header = NULL, +- bool discovered_list_needs_barrier = false); ++ BoolObjectClosure* is_alive_non_header = NULL); + + // RefDiscoveryPolicy values + enum DiscoveryPolicy { +--- ./hotspot/src/share/vm/memory/sharedHeap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/sharedHeap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -35,6 +35,8 @@ + #include "utilities/copy.hpp" + #include "utilities/workgroup.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + SharedHeap* SharedHeap::_sh; + + // The set of potentially parallel tasks in strong root scanning. +--- ./hotspot/src/share/vm/memory/space.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/space.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -45,6 +45,8 @@ + void SpaceMemRegionOopsIterClosure::do_oop(oop* p) { SpaceMemRegionOopsIterClosure::do_oop_work(p); } + void SpaceMemRegionOopsIterClosure::do_oop(narrowOop* p) { SpaceMemRegionOopsIterClosure::do_oop_work(p); } + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + HeapWord* DirtyCardToOopClosure::get_actual_top(HeapWord* top, + HeapWord* top_obj) { + if (top_obj != NULL) { +--- ./hotspot/src/share/vm/memory/space.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/space.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -45,6 +45,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +--- ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -31,9 +31,12 @@ + #include "runtime/thread.inline.hpp" + #include "utilities/copy.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // Thread-Local Edens support + + // static member initialization ++size_t ThreadLocalAllocBuffer::_max_size = 0; + unsigned ThreadLocalAllocBuffer::_target_refills = 0; + GlobalTLABStats* ThreadLocalAllocBuffer::_global_stats = NULL; + +@@ -45,7 +48,7 @@ + void ThreadLocalAllocBuffer::accumulate_statistics_before_gc() { + global_stats()->initialize(); + +- for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) { ++ for (JavaThread *thread = Threads::first(); thread != NULL; thread = thread->next()) { + thread->tlab().accumulate_statistics(); + thread->tlab().initialize_statistics(); + } +@@ -60,28 +63,32 @@ + } + + void ThreadLocalAllocBuffer::accumulate_statistics() { +- size_t capacity = Universe::heap()->tlab_capacity(myThread()) / HeapWordSize; +- size_t unused = Universe::heap()->unsafe_max_tlab_alloc(myThread()) / HeapWordSize; +- size_t used = capacity - unused; +- +- // Update allocation history if a reasonable amount of eden was allocated. +- bool update_allocation_history = used > 0.5 * capacity; ++ Thread* thread = myThread(); ++ size_t capacity = Universe::heap()->tlab_capacity(thread); ++ size_t used = Universe::heap()->tlab_used(thread); + + _gc_waste += (unsigned)remaining(); ++ size_t total_allocated = thread->allocated_bytes(); ++ size_t allocated_since_last_gc = total_allocated - _allocated_before_last_gc; ++ _allocated_before_last_gc = total_allocated; + + if (PrintTLAB && (_number_of_refills > 0 || Verbose)) { + print_stats("gc"); + } + + if (_number_of_refills > 0) { ++ // Update allocation history if a reasonable amount of eden was allocated. ++ bool update_allocation_history = used > 0.5 * capacity; + + if (update_allocation_history) { + // Average the fraction of eden allocated in a tlab by this + // thread for use in the next resize operation. + // _gc_waste is not subtracted because it's included in + // "used". +- size_t allocation = _number_of_refills * desired_size(); +- double alloc_frac = allocation / (double) used; ++ // The result can be larger than 1.0 due to direct to old allocations. ++ // These allocations should ideally not be counted but since it is not possible ++ // to filter them out here we just cap the fraction to be at most 1.0. ++ double alloc_frac = MIN2(1.0, (double) allocated_since_last_gc / used); + _allocation_fraction.sample(alloc_frac); + } + global_stats()->update_allocating_threads(); +@@ -126,33 +133,32 @@ + } + + void ThreadLocalAllocBuffer::resize_all_tlabs() { +- for(JavaThread *thread = Threads::first(); thread; thread = thread->next()) { +- thread->tlab().resize(); ++ if (ResizeTLAB) { ++ for (JavaThread *thread = Threads::first(); thread != NULL; thread = thread->next()) { ++ thread->tlab().resize(); ++ } + } + } + + void ThreadLocalAllocBuffer::resize() { ++ // Compute the next tlab size using expected allocation amount ++ assert(ResizeTLAB, "Should not call this otherwise"); ++ size_t alloc = (size_t)(_allocation_fraction.average() * ++ (Universe::heap()->tlab_capacity(myThread()) / HeapWordSize)); ++ size_t new_size = alloc / _target_refills; + +- if (ResizeTLAB) { +- // Compute the next tlab size using expected allocation amount +- size_t alloc = (size_t)(_allocation_fraction.average() * +- (Universe::heap()->tlab_capacity(myThread()) / HeapWordSize)); +- size_t new_size = alloc / _target_refills; ++ new_size = MIN2(MAX2(new_size, min_size()), max_size()); + +- new_size = MIN2(MAX2(new_size, min_size()), max_size()); ++ size_t aligned_new_size = align_object_size(new_size); + +- size_t aligned_new_size = align_object_size(new_size); +- +- if (PrintTLAB && Verbose) { +- gclog_or_tty->print("TLAB new size: thread: " INTPTR_FORMAT " [id: %2d]" +- " refills %d alloc: %8.6f desired_size: " SIZE_FORMAT " -> " SIZE_FORMAT "\n", +- myThread(), myThread()->osthread()->thread_id(), +- _target_refills, _allocation_fraction.average(), desired_size(), aligned_new_size); +- } +- set_desired_size(aligned_new_size); +- +- set_refill_waste_limit(initial_refill_waste_limit()); ++ if (PrintTLAB && Verbose) { ++ gclog_or_tty->print("TLAB new size: thread: " INTPTR_FORMAT " [id: %2d]" ++ " refills %d alloc: %8.6f desired_size: " SIZE_FORMAT " -> " SIZE_FORMAT "\n", ++ myThread(), myThread()->osthread()->thread_id(), ++ _target_refills, _allocation_fraction.average(), desired_size(), aligned_new_size); + } ++ set_desired_size(aligned_new_size); ++ set_refill_waste_limit(initial_refill_waste_limit()); + } + + void ThreadLocalAllocBuffer::initialize_statistics() { +@@ -248,31 +254,13 @@ + return init_sz; + } + +-const size_t ThreadLocalAllocBuffer::max_size() { +- +- // TLABs can't be bigger than we can fill with a int[Integer.MAX_VALUE]. +- // This restriction could be removed by enabling filling with multiple arrays. +- // If we compute that the reasonable way as +- // header_size + ((sizeof(jint) * max_jint) / HeapWordSize) +- // we'll overflow on the multiply, so we do the divide first. +- // We actually lose a little by dividing first, +- // but that just makes the TLAB somewhat smaller than the biggest array, +- // which is fine, since we'll be able to fill that. +- +- size_t unaligned_max_size = typeArrayOopDesc::header_size(T_INT) + +- sizeof(jint) * +- ((juint) max_jint / (size_t) HeapWordSize); +- return align_size_down(unaligned_max_size, MinObjAlignment); +-} +- + void ThreadLocalAllocBuffer::print_stats(const char* tag) { + Thread* thrd = myThread(); + size_t waste = _gc_waste + _slow_refill_waste + _fast_refill_waste; + size_t alloc = _number_of_refills * _desired_size; + double waste_percent = alloc == 0 ? 0.0 : + 100.0 * waste / alloc; +- size_t tlab_used = Universe::heap()->tlab_capacity(thrd) - +- Universe::heap()->unsafe_max_tlab_alloc(thrd); ++ size_t tlab_used = Universe::heap()->tlab_used(thrd); + gclog_or_tty->print("TLAB: %s thread: " INTPTR_FORMAT " [id: %2d]" + " desired_size: " SIZE_FORMAT "KB" + " slow allocs: %d refill waste: " SIZE_FORMAT "B" +--- ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -45,7 +45,9 @@ + HeapWord* _end; // allocation end (excluding alignment_reserve) + size_t _desired_size; // desired size (including alignment_reserve) + size_t _refill_waste_limit; // hold onto tlab if free() is larger than this ++ size_t _allocated_before_last_gc; // total bytes allocated up until the last gc + ++ static size_t _max_size; // maximum size of any TLAB + static unsigned _target_refills; // expected number of refills between GCs + + unsigned _number_of_refills; +@@ -99,12 +101,13 @@ + static GlobalTLABStats* global_stats() { return _global_stats; } + + public: +- ThreadLocalAllocBuffer() : _allocation_fraction(TLABAllocationWeight) { ++ ThreadLocalAllocBuffer() : _allocation_fraction(TLABAllocationWeight), _allocated_before_last_gc(0) { + // do nothing. tlabs must be inited by initialize() calls + } + + static const size_t min_size() { return align_object_size(MinTLABSize / HeapWordSize); } +- static const size_t max_size(); ++ static const size_t max_size() { assert(_max_size != 0, "max_size not set up"); return _max_size; } ++ static void set_max_size(size_t max_size) { _max_size = max_size; } + + HeapWord* start() const { return _start; } + HeapWord* end() const { return _end; } +--- ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/threadLocalAllocBuffer.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -98,7 +98,7 @@ + " obj: "SIZE_FORMAT + " free: "SIZE_FORMAT + " waste: "SIZE_FORMAT"\n", +- "slow", thrd, thrd->osthread()->thread_id(), ++ "slow", p2i(thrd), thrd->osthread()->thread_id(), + obj_size, free(), refill_waste_limit()); + } + } +--- ./hotspot/src/share/vm/memory/universe.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/memory/universe.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -78,6 +78,8 @@ + #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp" + #endif // INCLUDE_ALL_GCS + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // Known objects + Klass* Universe::_boolArrayKlassObj = NULL; + Klass* Universe::_byteArrayKlassObj = NULL; +@@ -632,7 +634,6 @@ + guarantee(sizeof(oop) % sizeof(HeapWord) == 0, + "oop size is not not a multiple of HeapWord size"); + TraceTime timer("Genesis", TraceStartupTime); +- GC_locker::lock(); // do not allow gc during bootstrapping + JavaClasses::compute_hard_coded_offsets(); + + jint status = Universe::initialize_heap(); +@@ -759,7 +760,7 @@ + // the correct no-access prefix. + // The final value will be set in initialize_heap() below. + Universe::set_narrow_oop_base((address)UnscaledOopHeapMax); +-#ifdef _WIN64 ++#if defined(_WIN64) || defined(AIX) + if (UseLargePages) { + // Cannot allocate guard pages for implicit checks in indexed + // addressing mode when large pages are specified on windows. +@@ -816,6 +817,8 @@ + Universe::_collectedHeap = new GenCollectedHeap(gc_policy); + } + ++ ThreadLocalAllocBuffer::set_max_size(Universe::heap()->max_tlab_size()); ++ + jint status = Universe::heap()->initialize(); + if (status != JNI_OK) { + return status; +@@ -839,6 +842,11 @@ + // Can't reserve heap below 32Gb. + // keep the Universe::narrow_oop_base() set in Universe::reserve_heap() + Universe::set_narrow_oop_shift(LogMinObjAlignmentInBytes); ++#ifdef AIX ++ // There is no protected page before the heap. This assures all oops ++ // are decoded so that NULL is preserved, so this page will not be accessed. ++ Universe::set_narrow_oop_use_implicit_null_checks(false); ++#endif + if (verbose) { + tty->print(", %s: "PTR_FORMAT, + narrow_oop_mode_to_string(HeapBasedNarrowOop), +@@ -1157,8 +1165,6 @@ + + MemoryService::add_metaspace_memory_pools(); + +- GC_locker::unlock(); // allow gc after bootstrapping +- + MemoryService::set_universe_heap(Universe::_collectedHeap); + return true; + } +@@ -1344,7 +1350,7 @@ + HandleMark hm; // Handles created during verification can be zapped + _verify_count++; + +- if (!silent) gclog_or_tty->print(prefix); ++ if (!silent) gclog_or_tty->print("%s", prefix); + if (!silent) gclog_or_tty->print("[Verifying "); + if (!silent) gclog_or_tty->print("threads "); + Threads::verify(); +--- ./hotspot/src/share/vm/oops/annotations.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/annotations.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -76,7 +76,7 @@ + + + void Annotations::print_value_on(outputStream* st) const { +- st->print("Anotations(" INTPTR_FORMAT ")", this); ++ st->print("Anotations(" INTPTR_FORMAT ")", p2i(this)); + } + + #if INCLUDE_SERVICES +--- ./hotspot/src/share/vm/oops/arrayKlass.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/arrayKlass.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -64,10 +64,10 @@ + return NULL; + } + +-Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const { ++Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const { + // There are no methods in an array klass but the super class (Object) has some + assert(super(), "super klass must be present"); +- return super()->uncached_lookup_method(name, signature); ++ return super()->uncached_lookup_method(name, signature, mode); + } + + ArrayKlass::ArrayKlass(Symbol* name) { +@@ -214,8 +214,8 @@ + + // Verification + +-void ArrayKlass::verify_on(outputStream* st, bool check_dictionary) { +- Klass::verify_on(st, check_dictionary); ++void ArrayKlass::verify_on(outputStream* st) { ++ Klass::verify_on(st); + + if (component_mirror() != NULL) { + guarantee(component_mirror()->klass() != NULL, "should have a class"); +--- ./hotspot/src/share/vm/oops/arrayKlass.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/arrayKlass.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -86,7 +86,7 @@ + objArrayOop allocate_arrayArray(int n, int length, TRAPS); + + // Lookup operations +- Method* uncached_lookup_method(Symbol* name, Symbol* signature) const; ++ Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const; + + // Casting from Klass* + static ArrayKlass* cast(Klass* k) { +@@ -146,7 +146,7 @@ + void oop_print_on(oop obj, outputStream* st); + + // Verification +- void verify_on(outputStream* st, bool check_dictionary); ++ void verify_on(outputStream* st); + + void oop_verify_on(oop obj, outputStream* st); + }; +--- ./hotspot/src/share/vm/oops/constMethod.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/constMethod.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -388,8 +388,8 @@ + void ConstMethod::print_on(outputStream* st) const { + ResourceMark rm; + assert(is_constMethod(), "must be constMethod"); +- st->print_cr(internal_name()); +- st->print(" - method: " INTPTR_FORMAT " ", (address)method()); ++ st->print_cr("%s", internal_name()); ++ st->print(" - method: " INTPTR_FORMAT " ", p2i((address)method())); + method()->print_value_on(st); st->cr(); + if (has_stackmap_table()) { + st->print(" - stackmap data: "); +--- ./hotspot/src/share/vm/oops/constantPool.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/constantPool.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -42,6 +42,8 @@ + #include "runtime/signature.hpp" + #include "runtime/vframe.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + ConstantPool* ConstantPool::allocate(ClassLoaderData* loader_data, int length, TRAPS) { + // Tags are RW but comment below applies to tags also. + Array* tags = MetadataFactory::new_writeable_array(loader_data, length, 0, CHECK_NULL); +@@ -82,6 +84,9 @@ + void ConstantPool::deallocate_contents(ClassLoaderData* loader_data) { + MetadataFactory::free_metadata(loader_data, cache()); + set_cache(NULL); ++ MetadataFactory::free_array(loader_data, reference_map()); ++ set_reference_map(NULL); ++ + MetadataFactory::free_array(loader_data, operands()); + set_operands(NULL); + +@@ -141,6 +146,10 @@ + // CDS support. Create a new resolved_references array. + void ConstantPool::restore_unshareable_info(TRAPS) { + ++ // Only create the new resolved references array and lock if it hasn't been ++ // attempted before ++ if (resolved_references() != NULL) return; ++ + // restore the C++ vtable from the shared archive + restore_vtable(); + +@@ -1292,6 +1301,7 @@ + } break; + + case JVM_CONSTANT_UnresolvedClass: ++ case JVM_CONSTANT_UnresolvedClassInError: + { + // Can be resolved after checking tag, so check the slot first. + CPSlot entry = from_cp->slot_at(from_i); +@@ -1876,7 +1886,7 @@ + void ConstantPool::print_on(outputStream* st) const { + EXCEPTION_MARK; + assert(is_constantPool(), "must be constantPool"); +- st->print_cr(internal_name()); ++ st->print_cr("%s", internal_name()); + if (flags() != 0) { + st->print(" - flags: 0x%x", flags()); + if (has_preresolution()) st->print(" has_preresolution"); +--- ./hotspot/src/share/vm/oops/cpCache.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/cpCache.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -38,8 +38,9 @@ + # include "gc_implementation/parallelScavenge/psPromotionManager.hpp" + #endif // INCLUDE_ALL_GCS + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + +-// Implememtation of ConstantPoolCacheEntry ++// Implementation of ConstantPoolCacheEntry + + void ConstantPoolCacheEntry::initialize_entry(int index) { + assert(0 < index && index < 0x10000, "sanity check"); +@@ -363,7 +364,7 @@ + // Decode the action of set_method and set_interface_call + Bytecodes::Code invoke_code = bytecode_1(); + if (invoke_code != (Bytecodes::Code)0) { +- Metadata* f1 = (Metadata*)_f1; ++ Metadata* f1 = f1_ord(); + if (f1 != NULL) { + switch (invoke_code) { + case Bytecodes::_invokeinterface: +@@ -405,7 +406,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(); +@@ -414,7 +415,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(); +@@ -667,7 +668,7 @@ + + void ConstantPoolCache::print_on(outputStream* st) const { + assert(is_constantPoolCache(), "obj must be constant pool cache"); +- st->print_cr(internal_name()); ++ st->print_cr("%s", internal_name()); + // print constant pool cache entries + for (int i = 0; i < length(); i++) entry_at(i)->print(st, i); + } +--- ./hotspot/src/share/vm/oops/cpCache.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/cpCache.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -138,7 +138,7 @@ + + void set_bytecode_1(Bytecodes::Code code); + void set_bytecode_2(Bytecodes::Code code); +- void set_f1(Metadata* f1) { ++ void set_f1(Metadata* f1) { + Metadata* existing_f1 = (Metadata*)_f1; // read once + assert(existing_f1 == NULL || existing_f1 == f1, "illegal field change"); + _f1 = f1; +@@ -325,22 +325,29 @@ + + // Accessors + int indices() const { return _indices; } ++ int indices_ord() const { return (intx)OrderAccess::load_ptr_acquire(&_indices); } + int constant_pool_index() const { return (indices() & cp_index_mask); } +- Bytecodes::Code bytecode_1() const { return Bytecodes::cast((indices() >> bytecode_1_shift) & bytecode_1_mask); } +- Bytecodes::Code bytecode_2() const { return Bytecodes::cast((indices() >> bytecode_2_shift) & bytecode_2_mask); } +- Method* f1_as_method() const { Metadata* f1 = (Metadata*)_f1; assert(f1 == NULL || f1->is_method(), ""); return (Method*)f1; } +- Klass* f1_as_klass() const { Metadata* f1 = (Metadata*)_f1; assert(f1 == NULL || f1->is_klass(), ""); return (Klass*)f1; } +- bool is_f1_null() const { Metadata* f1 = (Metadata*)_f1; return f1 == NULL; } // classifies a CPC entry as unbound ++ Bytecodes::Code bytecode_1() const { return Bytecodes::cast((indices_ord() >> bytecode_1_shift) & bytecode_1_mask); } ++ Bytecodes::Code bytecode_2() const { return Bytecodes::cast((indices_ord() >> bytecode_2_shift) & bytecode_2_mask); } ++ Metadata* f1_ord() const { return (Metadata *)OrderAccess::load_ptr_acquire(&_f1); } ++ Method* f1_as_method() const { Metadata* f1 = f1_ord(); assert(f1 == NULL || f1->is_method(), ""); return (Method*)f1; } ++ Klass* f1_as_klass() const { Metadata* f1 = f1_ord(); assert(f1 == NULL || f1->is_klass(), ""); return (Klass*)f1; } ++ // Use the accessor f1() to acquire _f1's value. This is needed for ++ // example in BytecodeInterpreter::run(), where is_f1_null() is ++ // called to check if an invokedynamic call is resolved. This load ++ // of _f1 must be ordered with the loads performed by ++ // cache->main_entry_index(). ++ bool is_f1_null() const { Metadata* f1 = f1_ord(); return f1 == NULL; } // classifies a CPC entry as unbound + int f2_as_index() const { assert(!is_vfinal(), ""); return (int) _f2; } +- Method* f2_as_vfinal_method() const { assert(is_vfinal(), ""); return (Method*)_f2; } ++ Method* f2_as_vfinal_method() const { assert(is_vfinal(), ""); return (Method*)_f2; } + int field_index() const { assert(is_field_entry(), ""); return (_flags & field_index_mask); } + int parameter_size() const { assert(is_method_entry(), ""); return (_flags & parameter_size_mask); } + bool is_volatile() const { return (_flags & (1 << is_volatile_shift)) != 0; } + 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; } +--- ./hotspot/src/share/vm/oops/generateOopMap.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/generateOopMap.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -412,9 +412,9 @@ + int copy_cts (CellTypeState *dst, CellTypeState *src); + + // Error handling +- void error_work (const char *format, va_list ap); +- void report_error (const char *format, ...); +- void verify_error (const char *format, ...); ++ void error_work (const char *format, va_list ap) ATTRIBUTE_PRINTF(2, 0); ++ void report_error (const char *format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void verify_error (const char *format, ...) ATTRIBUTE_PRINTF(2, 3); + bool got_error() { return _got_error; } + + // Create result set +--- ./hotspot/src/share/vm/oops/instanceKlass.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -75,6 +75,8 @@ + #include "c1/c1_Compiler.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #ifdef DTRACE_ENABLED + + #ifndef USDT2 +@@ -1203,7 +1205,11 @@ + MutexLocker x(OopMapCacheAlloc_lock); + // First time use. Allocate a cache in C heap + if (_oop_map_cache == NULL) { +- _oop_map_cache = new OopMapCache(); ++ // Release stores from OopMapCache constructor before assignment ++ // to _oop_map_cache. C++ compilers on ppc do not emit the ++ // required memory barrier only because of the volatile ++ // qualifier of _oop_map_cache. ++ OrderAccess::release_store_ptr(&_oop_map_cache, new OopMapCache()); + } + } + // _oop_map_cache is constant after init; lookup below does is own locking. +@@ -1325,17 +1331,18 @@ + } + + +-void InstanceKlass::do_local_static_fields(void f(fieldDescriptor*, TRAPS), TRAPS) { ++void InstanceKlass::do_local_static_fields(void f(fieldDescriptor*, Handle, TRAPS), Handle mirror, TRAPS) { + instanceKlassHandle h_this(THREAD, this); +- do_local_static_fields_impl(h_this, f, CHECK); ++ do_local_static_fields_impl(h_this, f, mirror, CHECK); + } + + +-void InstanceKlass::do_local_static_fields_impl(instanceKlassHandle this_oop, void f(fieldDescriptor* fd, TRAPS), TRAPS) { +- for (JavaFieldStream fs(this_oop()); !fs.done(); fs.next()) { ++void InstanceKlass::do_local_static_fields_impl(instanceKlassHandle this_k, ++ void f(fieldDescriptor* fd, Handle mirror, TRAPS), Handle mirror, TRAPS) { ++ for (JavaFieldStream fs(this_k()); !fs.done(); fs.next()) { + if (fs.access_flags().is_static()) { + fieldDescriptor& fd = fs.field_descriptor(); +- f(&fd, CHECK); ++ f(&fd, mirror, CHECK); + } + } + } +@@ -1424,7 +1431,11 @@ + + // find_method looks up the name/signature in the local methods array + Method* InstanceKlass::find_method(Symbol* name, Symbol* signature) const { +- return InstanceKlass::find_method(methods(), name, signature); ++ return find_method_impl(name, signature, false); ++} ++ ++Method* InstanceKlass::find_method_impl(Symbol* name, Symbol* signature, bool skipping_overpass) const { ++ return InstanceKlass::find_method_impl(methods(), name, signature, skipping_overpass); + } + + // find_instance_method looks up the name/signature in the local methods array +@@ -1441,40 +1452,49 @@ + // find_method looks up the name/signature in the local methods array + Method* InstanceKlass::find_method( + Array* methods, Symbol* name, Symbol* signature) { +- int hit = find_method_index(methods, name, signature); ++ return InstanceKlass::find_method_impl(methods, name, signature, false); ++} ++ ++Method* InstanceKlass::find_method_impl( ++ Array* methods, Symbol* name, Symbol* signature, bool skipping_overpass) { ++ int hit = find_method_index(methods, name, signature, skipping_overpass); + return hit >= 0 ? methods->at(hit): NULL; + } + + // Used directly for default_methods to find the index into the + // default_vtable_indices, and indirectly by find_method + // find_method_index looks in the local methods array to return the index +-// of the matching name/signature ++// of the matching name/signature. If, overpass methods are being ignored, ++// the search continues to find a potential non-overpass match. This capability ++// is important during method resolution to prefer a static method, for example, ++// over an overpass method. + int InstanceKlass::find_method_index( +- Array* methods, Symbol* name, Symbol* signature) { ++ Array* methods, Symbol* name, Symbol* signature, bool skipping_overpass) { + int hit = binary_search(methods, name); + if (hit != -1) { + Method* m = methods->at(hit); + // Do linear search to find matching signature. First, quick check +- // for common case +- if (m->signature() == signature) return hit; ++ // for common case, ignoring overpasses if requested. ++ if ((m->signature() == signature) && (!skipping_overpass || !m->is_overpass())) return hit; ++ + // search downwards through overloaded methods + int i; + for (i = hit - 1; i >= 0; --i) { + Method* m = methods->at(i); + assert(m->is_method(), "must be method"); + if (m->name() != name) break; +- if (m->signature() == signature) return i; ++ if ((m->signature() == signature) && (!skipping_overpass || !m->is_overpass())) return i; + } + // search upwards + for (i = hit + 1; i < methods->length(); ++i) { + Method* m = methods->at(i); + assert(m->is_method(), "must be method"); + if (m->name() != name) break; +- if (m->signature() == signature) return i; ++ if ((m->signature() == signature) && (!skipping_overpass || !m->is_overpass())) return i; + } + // not found + #ifdef ASSERT +- int index = linear_search(methods, name, signature); ++ int index = skipping_overpass ? -1 : linear_search(methods, name, signature); + assert(index == -1, err_msg("binary search should have found entry %d", index)); + #endif + } +@@ -1500,16 +1520,16 @@ + + // uncached_lookup_method searches both the local class methods array and all + // superclasses methods arrays, skipping any overpass methods in superclasses. +-Method* InstanceKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const { ++Method* InstanceKlass::uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const { ++ MethodLookupMode lookup_mode = mode; + Klass* klass = const_cast(this); +- bool dont_ignore_overpasses = true; // For the class being searched, find its overpasses. + while (klass != NULL) { +- Method* method = InstanceKlass::cast(klass)->find_method(name, signature); +- if ((method != NULL) && (dont_ignore_overpasses || !method->is_overpass())) { ++ Method* method = InstanceKlass::cast(klass)->find_method_impl(name, signature, (lookup_mode == skip_overpass)); ++ if (method != NULL) { + return method; + } + klass = InstanceKlass::cast(klass)->super(); +- dont_ignore_overpasses = false; // Ignore overpass methods in all superclasses. ++ lookup_mode = skip_overpass; // Always ignore overpass methods in superclasses + } + return NULL; + } +@@ -1524,7 +1544,7 @@ + } + // Look up interfaces + if (m == NULL) { +- m = lookup_method_in_all_interfaces(name, signature, false); ++ m = lookup_method_in_all_interfaces(name, signature, normal); + } + return m; + } +@@ -1534,7 +1554,7 @@ + // They should only be found in the initial InterfaceMethodRef + Method* InstanceKlass::lookup_method_in_all_interfaces(Symbol* name, + Symbol* signature, +- bool skip_default_methods) const { ++ MethodLookupMode mode) const { + Array* all_ifs = transitive_interfaces(); + int num_ifs = all_ifs->length(); + InstanceKlass *ik = NULL; +@@ -1542,7 +1562,7 @@ + ik = InstanceKlass::cast(all_ifs->at(i)); + Method* m = ik->lookup_method(name, signature); + if (m != NULL && m->is_public() && !m->is_static() && +- (!skip_default_methods || !m->is_default_method())) { ++ ((mode != skip_defaults) || !m->is_default_method())) { + return m; + } + } +@@ -2234,15 +2254,7 @@ + for (int m = 0; m < methods()->length(); m++) { + MethodData* mdo = methods()->at(m)->method_data(); + if (mdo != NULL) { +- for (ProfileData* data = mdo->first_data(); +- mdo->is_valid(data); +- data = mdo->next_data(data)) { +- data->clean_weak_klass_links(is_alive); +- } +- ParametersTypeData* parameters = mdo->parameters_type_data(); +- if (parameters != NULL) { +- parameters->clean_weak_klass_links(is_alive); +- } ++ mdo->clean_method_data(is_alive); + } + } + } +@@ -2284,9 +2296,7 @@ + int num_methods = methods->length(); + for (int index2 = 0; index2 < num_methods; ++index2) { + methodHandle m(THREAD, methods->at(index2)); +- m()->link_method(m, CHECK); +- // restore method's vtable by calling a virtual function +- m->restore_vtable(); ++ m->restore_unshareable_info(CHECK); + } + if (JvmtiExport::has_redefined_a_class()) { + // Reinitialize vtable because RedefineClasses may have changed some +@@ -2761,7 +2771,7 @@ + Method* m = n->method(); + // Search for match + while(cur != NULL && cur != n) { +- if (TieredCompilation) { ++ if (TieredCompilation && m == cur->method()) { + // Find max level before n + max_level = MAX2(max_level, cur->comp_level()); + } +@@ -2783,7 +2793,9 @@ + cur = next; + while (cur != NULL) { + // Find max level after n +- max_level = MAX2(max_level, cur->comp_level()); ++ if (m == cur->method()) { ++ max_level = MAX2(max_level, cur->comp_level()); ++ } + cur = cur->osr_link(); + } + m->set_highest_osr_comp_level(max_level); +@@ -2887,7 +2899,7 @@ + st->print(BULLET"instance size: %d", size_helper()); st->cr(); + st->print(BULLET"klass size: %d", size()); st->cr(); + st->print(BULLET"access: "); access_flags().print_on(st); st->cr(); +- st->print(BULLET"state: "); st->print_cr(state_names[_init_state]); ++ st->print(BULLET"state: "); st->print_cr("%s", state_names[_init_state]); + st->print(BULLET"name: "); name()->print_value_on(st); st->cr(); + st->print(BULLET"super: "); super()->print_value_on_maybe_null(st); st->cr(); + st->print(BULLET"sub: "); +@@ -3180,7 +3192,7 @@ + virtual void do_oop(narrowOop* p) { VerifyFieldClosure::do_oop_work(p); } + }; + +-void InstanceKlass::verify_on(outputStream* st, bool check_dictionary) { ++void InstanceKlass::verify_on(outputStream* st) { + #ifndef PRODUCT + // Avoid redundant verifies, this really should be in product. + if (_verify_count == Universe::verify_count()) return; +@@ -3188,14 +3200,11 @@ + #endif + + // Verify Klass +- Klass::verify_on(st, check_dictionary); +- +- // Verify that klass is present in SystemDictionary if not already +- // verifying the SystemDictionary. +- if (is_loaded() && !is_anonymous() && check_dictionary) { +- Symbol* h_name = name(); +- SystemDictionary::verify_obj_klass_present(h_name, class_loader_data()); +- } ++ Klass::verify_on(st); ++ ++ // Verify that klass is present in ClassLoaderData ++ guarantee(class_loader_data()->contains_klass(this), ++ "this class isn't found in class loader data"); + + // Verify vtables + if (is_linked()) { +--- ./hotspot/src/share/vm/oops/instanceKlass.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/instanceKlass.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -306,7 +306,7 @@ + // three cases: + // NULL: no implementor. + // A Klass* that's not itself: one implementor. +- // Itsef: more than one implementors. ++ // Itself: more than one implementors. + // embedded host klass follows here + // The embedded host klass only exists in an anonymous class for + // dynamic language support (JSR 292 enabled). The host class grants +@@ -518,14 +518,14 @@ + static Method* find_instance_method(Array* methods, Symbol* name, Symbol* signature); + + // find a local method index in default_methods (returns -1 if not found) +- static int find_method_index(Array* methods, Symbol* name, Symbol* signature); ++ static int find_method_index(Array* methods, Symbol* name, Symbol* signature, bool skipping_overpass); + + // lookup operation (returns NULL if not found) +- Method* uncached_lookup_method(Symbol* name, Symbol* signature) const; ++ Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const; + + // lookup a method in all the interfaces that this class implements + // (returns NULL if not found) +- Method* lookup_method_in_all_interfaces(Symbol* name, Symbol* signature, bool skip_default_methods) const; ++ Method* lookup_method_in_all_interfaces(Symbol* name, Symbol* signature, MethodLookupMode mode) const; + + // lookup a method in local defaults then in all interfaces + // (returns NULL if not found) +@@ -554,6 +554,7 @@ + if (hk == NULL) { + return NULL; + } else { ++ assert(*hk != NULL, "host klass should always be set if the address is not null"); + return *hk; + } + } +@@ -829,7 +830,7 @@ + // Iterators + void do_local_static_fields(FieldClosure* cl); + void do_nonstatic_fields(FieldClosure* cl); // including inherited fields +- void do_local_static_fields(void f(fieldDescriptor*, TRAPS), TRAPS); ++ void do_local_static_fields(void f(fieldDescriptor*, Handle, TRAPS), Handle, TRAPS); + + void methods_do(void f(Method* method)); + void array_klasses_do(void f(Klass* k)); +@@ -1037,7 +1038,7 @@ + static void set_initialization_state_and_notify_impl (instanceKlassHandle this_oop, ClassState state, TRAPS); + static void call_class_initializer_impl (instanceKlassHandle this_oop, TRAPS); + static Klass* array_klass_impl (instanceKlassHandle this_oop, bool or_null, int n, TRAPS); +- static void do_local_static_fields_impl (instanceKlassHandle this_oop, void f(fieldDescriptor* fd, TRAPS), TRAPS); ++ static void do_local_static_fields_impl (instanceKlassHandle this_oop, void f(fieldDescriptor* fd, Handle, TRAPS), Handle, TRAPS); + /* jni_id_for_impl for jfieldID only */ + static JNIid* jni_id_for_impl (instanceKlassHandle this_oop, int offset); + +@@ -1047,6 +1048,10 @@ + // Returns the array class with this class as element type + Klass* array_klass_impl(bool or_null, TRAPS); + ++ // find a local method (returns NULL if not found) ++ Method* find_method_impl(Symbol* name, Symbol* signature, bool skipping_overpass) const; ++ static Method* find_method_impl(Array* methods, Symbol* name, Symbol* signature, bool skipping_overpass); ++ + // Free CHeap allocated fields. + void release_C_heap_structures(); + public: +@@ -1086,7 +1091,7 @@ + const char* internal_name() const; + + // Verification +- void verify_on(outputStream* st, bool check_dictionary); ++ void verify_on(outputStream* st); + + void oop_verify_on(oop obj, outputStream* st); + }; +--- ./hotspot/src/share/vm/oops/instanceMirrorKlass.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/instanceMirrorKlass.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -367,7 +367,12 @@ + // Query before forming handle. + int size = instance_size(k); + KlassHandle h_k(THREAD, this); +- instanceOop i = (instanceOop) CollectedHeap::Class_obj_allocate(h_k, size, k, CHECK_NULL); ++ instanceOop i = (instanceOop)CollectedHeap::obj_allocate(h_k, size, CHECK_NULL); ++ ++ // Since mirrors can be variable sized because of the static fields, store ++ // the size in the mirror itself. ++ java_lang_Class::set_oop_size(i, size); ++ + return i; + } + +--- ./hotspot/src/share/vm/oops/instanceRefKlass.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/instanceRefKlass.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -45,6 +45,8 @@ + #include "oops/oop.pcgc.inline.hpp" + #endif // INCLUDE_ALL_GCS + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + template + void specialized_oop_follow_contents(InstanceRefKlass* ref, oop obj) { + T* referent_addr = (T*)java_lang_ref_Reference::referent_addr(obj); +--- ./hotspot/src/share/vm/oops/klass.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/klass.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -129,7 +129,7 @@ + } + + +-Method* Klass::uncached_lookup_method(Symbol* name, Symbol* signature) const { ++Method* Klass::uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const { + #ifdef ASSERT + tty->print_cr("Error: uncached_lookup_method called on a klass oop." + " Likely error: reflection method does not correctly" +@@ -376,8 +376,6 @@ + } + + bool Klass::is_loader_alive(BoolObjectClosure* is_alive) { +- assert(ClassLoaderDataGraph::contains((address)this), "is in the metaspace"); +- + #ifdef ASSERT + // The class is alive iff the class loader is alive. + oop loader = class_loader(); +@@ -485,12 +483,8 @@ + } + + void Klass::remove_unshareable_info() { +- if (!DumpSharedSpaces) { +- // Clean up after OOM during class loading +- if (class_loader_data() != NULL) { +- class_loader_data()->remove_class(this); +- } +- } ++ assert (DumpSharedSpaces, "only called for DumpSharedSpaces"); ++ + set_subklass(NULL); + set_next_sibling(NULL); + // Clear the java mirror +@@ -502,17 +496,27 @@ + } + + void Klass::restore_unshareable_info(TRAPS) { +- ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data(); +- // Restore class_loader_data to the null class loader data +- set_class_loader_data(loader_data); ++ TRACE_INIT_ID(this); ++ // If an exception happened during CDS restore, some of these fields may already be ++ // set. We leave the class on the CLD list, even if incomplete so that we don't ++ // modify the CLD list outside a safepoint. ++ if (class_loader_data() == NULL) { ++ ClassLoaderData* loader_data = ClassLoaderData::the_null_class_loader_data(); ++ // Restore class_loader_data to the null class loader data ++ set_class_loader_data(loader_data); + +- // Add to null class loader list first before creating the mirror +- // (same order as class file parsing) +- loader_data->add_class(this); ++ // Add to null class loader list first before creating the mirror ++ // (same order as class file parsing) ++ loader_data->add_class(this); ++ } + + // Recreate the class mirror. The protection_domain is always null for + // boot loader, for now. +- java_lang_Class::create_mirror(this, Handle(NULL), CHECK); ++ // Only recreate it if not present. A previous attempt to restore may have ++ // gotten an OOM later but keep the mirror if it was created. ++ if (java_mirror() == NULL) { ++ java_lang_Class::create_mirror(this, Handle(NULL), CHECK); ++ } + } + + Klass* Klass::array_klass_or_null(int rank) { +@@ -640,11 +644,11 @@ + + // Verification + +-void Klass::verify_on(outputStream* st, bool check_dictionary) { ++void Klass::verify_on(outputStream* st) { + + // This can be expensive, but it is worth checking that this klass is actually + // in the CLD graph but not in production. +- assert(ClassLoaderDataGraph::contains((address)this), "Should be"); ++ assert(Metaspace::contains((address)this), "Should be"); + + guarantee(this->is_klass(),"should be klass"); + +--- ./hotspot/src/share/vm/oops/klass.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/klass.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -182,6 +182,8 @@ + void* operator new(size_t size, ClassLoaderData* loader_data, size_t word_size, TRAPS) throw(); + + public: ++ enum MethodLookupMode { normal, skip_overpass, skip_defaults }; ++ + bool is_klass() const volatile { return true; } + + // super +@@ -421,10 +423,10 @@ + virtual void initialize(TRAPS); + // lookup operation for MethodLookupCache + friend class MethodLookupCache; +- virtual Method* uncached_lookup_method(Symbol* name, Symbol* signature) const; ++ virtual Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const; + public: + Method* lookup_method(Symbol* name, Symbol* signature) const { +- return uncached_lookup_method(name, signature); ++ return uncached_lookup_method(name, signature, normal); + } + + // array class with specific rank +@@ -695,8 +697,8 @@ + virtual const char* internal_name() const = 0; + + // Verification +- virtual void verify_on(outputStream* st, bool check_dictionary); +- void verify(bool check_dictionary = true) { verify_on(tty, check_dictionary); } ++ virtual void verify_on(outputStream* st); ++ void verify() { verify_on(tty); } + + #ifndef PRODUCT + bool verify_vtable_index(int index); +--- ./hotspot/src/share/vm/oops/klass.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/klass.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -63,7 +63,7 @@ + assert(!is_null(v), "narrow klass value can never be zero"); + int shift = Universe::narrow_klass_shift(); + Klass* result = (Klass*)(void*)((uintptr_t)Universe::narrow_klass_base() + ((uintptr_t)v << shift)); +- assert(check_klass_alignment(result), err_msg("address not aligned: " PTR_FORMAT, (void*) result)); ++ assert(check_klass_alignment(result), err_msg("address not aligned: " INTPTR_FORMAT, p2i((void*) result))); + return result; + } + +--- ./hotspot/src/share/vm/oops/klassVtable.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/klassVtable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -39,6 +39,8 @@ + #include "runtime/handles.inline.hpp" + #include "utilities/copy.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + inline InstanceKlass* klassVtable::ik() const { + Klass* k = _klass(); + assert(k->oop_is_instance(), "not an InstanceKlass"); +@@ -643,7 +645,7 @@ + // this check for all access permissions. + InstanceKlass *sk = InstanceKlass::cast(super); + if (sk->has_miranda_methods()) { +- if (sk->lookup_method_in_all_interfaces(name, signature, false) != NULL) { ++ if (sk->lookup_method_in_all_interfaces(name, signature, Klass::normal) != NULL) { + return false; // found a matching miranda; we do not need a new entry + } + } +@@ -719,7 +721,7 @@ + && mo->method_holder() != NULL + && mo->method_holder()->super() != NULL) + { +- mo = mo->method_holder()->super()->uncached_lookup_method(name, signature); ++ mo = mo->method_holder()->super()->uncached_lookup_method(name, signature, Klass::normal); + } + if (mo == NULL || mo->access_flags().is_private() ) { + // super class hierarchy does not implement it or protection is different +@@ -764,7 +766,7 @@ + if (is_miranda(im, class_methods, default_methods, super)) { // is it a miranda at all? + InstanceKlass *sk = InstanceKlass::cast(super); + // check if it is a duplicate of a super's miranda +- if (sk->lookup_method_in_all_interfaces(im->name(), im->signature(), false) == NULL) { ++ if (sk->lookup_method_in_all_interfaces(im->name(), im->signature(), Klass::normal) == NULL) { + new_mirandas->append(im); + } + if (all_mirandas != NULL) { +--- ./hotspot/src/share/vm/oops/markOop.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/markOop.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -26,9 +26,11 @@ + #include "oops/markOop.hpp" + #include "runtime/thread.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + void markOopDesc::print_on(outputStream* st) const { + if (is_locked()) { +- st->print("locked(0x%lx)->", value()); ++ st->print("locked(" INTPTR_FORMAT ")->", value()); + markOop(*(markOop*)value())->print_on(st); + } else { + assert(is_unlocked() || has_bias_pattern(), "just checking"); +--- ./hotspot/src/share/vm/oops/metadata.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/metadata.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -40,8 +40,9 @@ + int identity_hash() { return (int)(uintptr_t)this; } + + // Rehashing support for tables containing pointers to this +- unsigned int new_hash(jint seed) { ShouldNotReachHere(); return 0; } ++ unsigned int new_hash(juint seed) { ShouldNotReachHere(); return 0; } + ++ virtual bool is_metadata() const volatile { return true; } + virtual bool is_klass() const volatile { return false; } + virtual bool is_method() const volatile { return false; } + virtual bool is_methodData() const volatile { return false; } +--- ./hotspot/src/share/vm/oops/method.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/method.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -55,6 +55,7 @@ + #include "utilities/quickSort.hpp" + #include "utilities/xmlstream.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + // Implementation of Method + +@@ -273,7 +274,7 @@ + } + + address Method::bcp_from(int bci) const { +- assert((is_native() && bci == 0) || (!is_native() && 0 <= bci && bci < code_size()), "illegal bci"); ++ assert((is_native() && bci == 0) || (!is_native() && 0 <= bci && bci < code_size()), err_msg("illegal bci: %d", bci)); + address bcp = code_base() + bci; + assert(is_native() && bcp == code_base() || contains(bcp), "bcp doesn't belong to this method"); + return bcp; +@@ -905,6 +906,19 @@ + return adapter->get_c2i_entry(); + } + ++void Method::restore_unshareable_info(TRAPS) { ++ // Since restore_unshareable_info can be called more than once for a method, don't ++ // redo any work. If this field is restored, there is nothing to do. ++ if (_from_compiled_entry == NULL) { ++ // restore method's vtable by calling a virtual function ++ restore_vtable(); ++ ++ methodHandle mh(THREAD, this); ++ link_method(mh, CHECK); ++ } ++} ++ ++ + // The verified_code_entry() must be called when a invoke is resolved + // on this method. + +@@ -1413,7 +1427,7 @@ + + void type_name(const char* name) { + if (_use_separator) _st->print(", "); +- _st->print(name); ++ _st->print("%s", name); + _use_separator = true; + } + +@@ -1860,6 +1874,14 @@ + loader_data->jmethod_ids()->clear_all_methods(); + } + ++bool Method::has_method_vptr(const void* ptr) { ++ Method m; ++ // This assumes that the vtbl pointer is the first word of a C++ object. ++ // This assumption is also in universe.cpp patch_klass_vtble ++ void* vtbl2 = dereference_vptr((const void*)&m); ++ void* this_vtbl = dereference_vptr(ptr); ++ return vtbl2 == this_vtbl; ++} + + // Check that this pointer is valid by checking that the vtbl pointer matches + bool Method::is_valid_method() const { +@@ -1868,12 +1890,7 @@ + } else if (!is_metaspace_object()) { + return false; + } else { +- Method m; +- // This assumes that the vtbl pointer is the first word of a C++ object. +- // This assumption is also in universe.cpp patch_klass_vtble +- void* vtbl2 = dereference_vptr((void*)&m); +- void* this_vtbl = dereference_vptr((void*)this); +- return vtbl2 == this_vtbl; ++ return has_method_vptr((const void*)this); + } + } + +@@ -1891,7 +1908,7 @@ + void Method::print_on(outputStream* st) const { + ResourceMark rm; + assert(is_method(), "must be method"); +- st->print_cr(internal_name()); ++ st->print_cr("%s", internal_name()); + // get the effect of PrintOopAddress, always, for methods: + st->print_cr(" - this oop: "INTPTR_FORMAT, (intptr_t)this); + st->print (" - method holder: "); method_holder()->print_value_on(st); st->cr(); +@@ -1974,7 +1991,7 @@ + + void Method::print_value_on(outputStream* st) const { + assert(is_method(), "must be method"); +- st->print(internal_name()); ++ st->print("%s", internal_name()); + print_address_on(st); + st->print(" "); + name()->print_value_on(st); +--- ./hotspot/src/share/vm/oops/method.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/method.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -156,6 +156,8 @@ + void restore_vtable() { guarantee(is_method(), "vtable restored by this call"); } + bool is_method() const volatile { return true; } + ++ void restore_unshareable_info(TRAPS); ++ + // accessors for instance variables + + ConstMethod* constMethod() const { return _constMethod; } +@@ -350,16 +352,21 @@ + } + + void set_method_data(MethodData* data) { +- _method_data = data; ++ // The store into method must be released. On platforms without ++ // total store order (TSO) the reference may become visible before ++ // the initialization of data otherwise. ++ OrderAccess::release_store_ptr((volatile void *)&_method_data, data); + } + + MethodCounters* method_counters() const { + return _method_counters; + } + +- + void set_method_counters(MethodCounters* counters) { +- _method_counters = counters; ++ // The store into method must be released. On platforms without ++ // total store order (TSO) the reference may become visible before ++ // the initialization of data otherwise. ++ OrderAccess::release_store_ptr((volatile void *)&_method_counters, counters); + } + + #ifdef TIERED +@@ -861,6 +868,7 @@ + const char* internal_name() const { return "{method}"; } + + // Check for valid method pointer ++ static bool has_method_vptr(const void* ptr); + bool is_valid_method() const; + + // Verify +--- ./hotspot/src/share/vm/oops/methodData.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/methodData.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -24,6 +24,7 @@ + + #include "precompiled.hpp" + #include "classfile/systemDictionary.hpp" ++#include "compiler/compilerOracle.hpp" + #include "interpreter/bytecode.hpp" + #include "interpreter/bytecodeStream.hpp" + #include "interpreter/linkResolver.hpp" +@@ -34,6 +35,8 @@ + #include "runtime/deoptimization.hpp" + #include "runtime/handles.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // ================================================================== + // DataLayout + // +@@ -80,8 +83,42 @@ + _data = NULL; + } + ++char* ProfileData::print_data_on_helper(const MethodData* md) const { ++ DataLayout* dp = md->extra_data_base(); ++ DataLayout* end = md->extra_data_limit(); ++ stringStream ss; ++ for (;; dp = MethodData::next_extra(dp)) { ++ assert(dp < end, "moved past end of extra data"); ++ switch(dp->tag()) { ++ case DataLayout::speculative_trap_data_tag: ++ if (dp->bci() == bci()) { ++ SpeculativeTrapData* data = new SpeculativeTrapData(dp); ++ int trap = data->trap_state(); ++ char buf[100]; ++ ss.print("trap/"); ++ data->method()->print_short_name(&ss); ++ ss.print("(%s) ", Deoptimization::format_trap_state(buf, sizeof(buf), trap)); ++ } ++ break; ++ case DataLayout::bit_data_tag: ++ break; ++ case DataLayout::no_tag: ++ case DataLayout::arg_info_data_tag: ++ return ss.as_string(); ++ break; ++ default: ++ fatal(err_msg("unexpected tag %d", dp->tag())); ++ } ++ } ++ return NULL; ++} ++ ++void ProfileData::print_data_on(outputStream* st, const MethodData* md) const { ++ print_data_on(st, print_data_on_helper(md)); ++} ++ + #ifndef PRODUCT +-void ProfileData::print_shared(outputStream* st, const char* name) const { ++void ProfileData::print_shared(outputStream* st, const char* name, const char* extra) const { + st->print("bci: %d", bci()); + st->fill_to(tab_width_one); + st->print("%s", name); +@@ -91,9 +128,13 @@ + char buf[100]; + st->print("trap(%s) ", Deoptimization::format_trap_state(buf, sizeof(buf), trap)); + } ++ if (extra != NULL) { ++ st->print("%s", extra); ++ } + int flags = data()->flags(); +- if (flags != 0) ++ if (flags != 0) { + st->print("flags(%d) ", flags); ++ } + } + + void ProfileData::tab(outputStream* st, bool first) const { +@@ -109,8 +150,8 @@ + + + #ifndef PRODUCT +-void BitData::print_data_on(outputStream* st) const { +- print_shared(st, "BitData"); ++void BitData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "BitData", extra); + } + #endif // !PRODUCT + +@@ -120,8 +161,8 @@ + // A CounterData corresponds to a simple counter. + + #ifndef PRODUCT +-void CounterData::print_data_on(outputStream* st) const { +- print_shared(st, "CounterData"); ++void CounterData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "CounterData", extra); + st->print_cr("count(%u)", count()); + } + #endif // !PRODUCT +@@ -150,8 +191,8 @@ + } + + #ifndef PRODUCT +-void JumpData::print_data_on(outputStream* st) const { +- print_shared(st, "JumpData"); ++void JumpData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "JumpData", extra); + st->print_cr("taken(%u) displacement(%d)", taken(), displacement()); + } + #endif // !PRODUCT +@@ -332,8 +373,8 @@ + st->cr(); + } + +-void CallTypeData::print_data_on(outputStream* st) const { +- CounterData::print_data_on(st); ++void CallTypeData::print_data_on(outputStream* st, const char* extra) const { ++ CounterData::print_data_on(st, extra); + if (has_arguments()) { + tab(st, true); + st->print("argument types"); +@@ -346,8 +387,8 @@ + } + } + +-void VirtualCallTypeData::print_data_on(outputStream* st) const { +- VirtualCallData::print_data_on(st); ++void VirtualCallTypeData::print_data_on(outputStream* st, const char* extra) const { ++ VirtualCallData::print_data_on(st, extra); + if (has_arguments()) { + tab(st, true); + st->print("argument types"); +@@ -400,12 +441,12 @@ + } + } + } +-void ReceiverTypeData::print_data_on(outputStream* st) const { +- print_shared(st, "ReceiverTypeData"); ++void ReceiverTypeData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "ReceiverTypeData", extra); + print_receiver_data_on(st); + } +-void VirtualCallData::print_data_on(outputStream* st) const { +- print_shared(st, "VirtualCallData"); ++void VirtualCallData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "VirtualCallData", extra); + print_receiver_data_on(st); + } + #endif // !PRODUCT +@@ -454,10 +495,15 @@ + return mdp; + } + ++#ifdef CC_INTERP ++DataLayout* RetData::advance(MethodData *md, int bci) { ++ return (DataLayout*) md->bci_to_dp(bci); ++} ++#endif // CC_INTERP + + #ifndef PRODUCT +-void RetData::print_data_on(outputStream* st) const { +- print_shared(st, "RetData"); ++void RetData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "RetData", extra); + uint row; + int entries = 0; + for (row = 0; row < row_limit(); row++) { +@@ -491,8 +537,8 @@ + } + + #ifndef PRODUCT +-void BranchData::print_data_on(outputStream* st) const { +- print_shared(st, "BranchData"); ++void BranchData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "BranchData", extra); + st->print_cr("taken(%u) displacement(%d)", + taken(), displacement()); + tab(st); +@@ -565,8 +611,8 @@ + } + + #ifndef PRODUCT +-void MultiBranchData::print_data_on(outputStream* st) const { +- print_shared(st, "MultiBranchData"); ++void MultiBranchData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "MultiBranchData", extra); + st->print_cr("default_count(%u) displacement(%d)", + default_count(), default_displacement()); + int cases = number_of_cases(); +@@ -579,8 +625,8 @@ + #endif + + #ifndef PRODUCT +-void ArgInfoData::print_data_on(outputStream* st) const { +- print_shared(st, "ArgInfoData"); ++void ArgInfoData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "ArgInfoData", extra); + int nargs = number_of_args(); + for (int i = 0; i < nargs; i++) { + st->print(" 0x%x", arg_modified(i)); +@@ -611,10 +657,17 @@ + } + + #ifndef PRODUCT +-void ParametersTypeData::print_data_on(outputStream* st) const { +- st->print("parameter types"); ++void ParametersTypeData::print_data_on(outputStream* st, const char* extra) const { ++ st->print("parameter types"); // FIXME extra ignored? + _parameters.print_data_on(st); + } ++ ++void SpeculativeTrapData::print_data_on(outputStream* st, const char* extra) const { ++ print_shared(st, "SpeculativeTrapData", extra); ++ tab(st); ++ method()->print_short_name(st); ++ st->cr(); ++} + #endif + + // ================================================================== +@@ -740,7 +793,27 @@ + return DataLayout::compute_size_in_bytes(cell_count); + } + +-int MethodData::compute_extra_data_count(int data_size, int empty_bc_count) { ++bool MethodData::is_speculative_trap_bytecode(Bytecodes::Code code) { ++ // Bytecodes for which we may use speculation ++ switch (code) { ++ case Bytecodes::_checkcast: ++ case Bytecodes::_instanceof: ++ case Bytecodes::_aastore: ++ case Bytecodes::_invokevirtual: ++ case Bytecodes::_invokeinterface: ++ case Bytecodes::_if_acmpeq: ++ case Bytecodes::_if_acmpne: ++ case Bytecodes::_invokestatic: ++#ifdef COMPILER2 ++ return UseTypeSpeculation; ++#endif ++ default: ++ return false; ++ } ++ return false; ++} ++ ++int MethodData::compute_extra_data_count(int data_size, int empty_bc_count, bool needs_speculative_traps) { + if (ProfileTraps) { + // Assume that up to 3% of BCIs with no MDP will need to allocate one. + int extra_data_count = (uint)(empty_bc_count * 3) / 128 + 1; +@@ -751,7 +824,18 @@ + extra_data_count = one_percent_of_data; + if (extra_data_count > empty_bc_count) + extra_data_count = empty_bc_count; // no need for more +- return extra_data_count; ++ ++ // Make sure we have a minimum number of extra data slots to ++ // allocate SpeculativeTrapData entries. We would want to have one ++ // entry per compilation that inlines this method and for which ++ // some type speculation assumption fails. So the room we need for ++ // the SpeculativeTrapData entries doesn't directly depend on the ++ // size of the method. Because it's hard to estimate, we reserve ++ // space for an arbitrary number of entries. ++ int spec_data_count = (needs_speculative_traps ? SpecTrapLimitExtraEntries : 0) * ++ (SpeculativeTrapData::static_cell_count() + DataLayout::header_size_in_cells()); ++ ++ return MAX2(extra_data_count, spec_data_count); + } else { + return 0; + } +@@ -764,15 +848,17 @@ + BytecodeStream stream(method); + Bytecodes::Code c; + int empty_bc_count = 0; // number of bytecodes lacking data ++ bool needs_speculative_traps = false; + while ((c = stream.next()) >= 0) { + int size_in_bytes = compute_data_size(&stream); + data_size += size_in_bytes; + if (size_in_bytes == 0) empty_bc_count += 1; ++ needs_speculative_traps = needs_speculative_traps || is_speculative_trap_bytecode(c); + } + int object_size = in_bytes(data_offset()) + data_size; + + // Add some extra DataLayout cells (at least one) to track stray traps. +- int extra_data_count = compute_extra_data_count(data_size, empty_bc_count); ++ int extra_data_count = compute_extra_data_count(data_size, empty_bc_count, needs_speculative_traps); + object_size += extra_data_count * DataLayout::compute_size_in_bytes(0); + + // Add a cell to record information about modified arguments. +@@ -988,7 +1074,8 @@ + } + + // Initialize the MethodData* corresponding to a given method. +-MethodData::MethodData(methodHandle method, int size, TRAPS) { ++MethodData::MethodData(methodHandle method, int size, TRAPS) ++ : _extra_data_lock(Monitor::leaf, "MDO extra data lock") { + No_Safepoint_Verifier no_safepoint; // init function atomic wrt GC + ResourceMark rm; + // Set the method back-pointer. +@@ -1004,18 +1091,23 @@ + _data[0] = 0; // apparently not set below. + BytecodeStream stream(method); + Bytecodes::Code c; ++ bool needs_speculative_traps = false; + while ((c = stream.next()) >= 0) { + int size_in_bytes = initialize_data(&stream, data_size); + data_size += size_in_bytes; + if (size_in_bytes == 0) empty_bc_count += 1; ++ needs_speculative_traps = needs_speculative_traps || is_speculative_trap_bytecode(c); + } + _data_size = data_size; + int object_size = in_bytes(data_offset()) + data_size; + + // Add some extra DataLayout cells (at least one) to track stray traps. +- int extra_data_count = compute_extra_data_count(data_size, empty_bc_count); ++ int extra_data_count = compute_extra_data_count(data_size, empty_bc_count, needs_speculative_traps); + int extra_size = extra_data_count * DataLayout::compute_size_in_bytes(0); + ++ // Let's zero the space for the extra data ++ Copy::zero_to_bytes(((address)_data) + data_size, extra_size); ++ + // Add a cell to record information about modified arguments. + // Set up _args_modified array after traps cells so that + // the code for traps cells works. +@@ -1027,17 +1119,17 @@ + int arg_data_size = DataLayout::compute_size_in_bytes(arg_size+1); + object_size += extra_size + arg_data_size; + +- int args_cell = ParametersTypeData::compute_cell_count(method()); ++ int parms_cell = ParametersTypeData::compute_cell_count(method()); + // If we are profiling parameters, we reserver an area near the end + // of the MDO after the slots for bytecodes (because there's no bci + // for method entry so they don't fit with the framework for the + // profiling of bytecodes). We store the offset within the MDO of + // this area (or -1 if no parameter is profiled) +- if (args_cell > 0) { +- object_size += DataLayout::compute_size_in_bytes(args_cell); ++ if (parms_cell > 0) { ++ object_size += DataLayout::compute_size_in_bytes(parms_cell); + _parameters_type_data_di = data_size + extra_size + arg_data_size; + DataLayout *dp = data_layout_at(data_size + extra_size + arg_data_size); +- dp->initialize(DataLayout::parameters_type_data_tag, 0, args_cell); ++ dp->initialize(DataLayout::parameters_type_data_tag, 0, parms_cell); + } else { + _parameters_type_data_di = -1; + } +@@ -1064,6 +1156,21 @@ + _highest_osr_comp_level = 0; + _would_profile = true; + ++#if INCLUDE_RTM_OPT ++ _rtm_state = NoRTM; // No RTM lock eliding by default ++ if (UseRTMLocking && ++ !CompilerOracle::has_option_string(_method, "NoRTMLockEliding")) { ++ if (CompilerOracle::has_option_string(_method, "UseRTMLockEliding") || !UseRTMDeopt) { ++ // Generate RTM lock eliding code without abort ratio calculation code. ++ _rtm_state = UseRTM; ++ } else if (UseRTMDeopt) { ++ // Generate RTM lock eliding code and include abort ratio calculation ++ // code if UseRTMDeopt is on. ++ _rtm_state = ProfileRTM; ++ } ++ } ++#endif ++ + // Initialize flags and trap history. + _nof_decompiles = 0; + _nof_overflow_recompiles = 0; +@@ -1128,39 +1235,114 @@ + break; + } + } +- return bci_to_extra_data(bci, false); ++ return bci_to_extra_data(bci, NULL, false); + } + +-// Translate a bci to its corresponding extra data, or NULL. +-ProfileData* MethodData::bci_to_extra_data(int bci, bool create_if_missing) { +- DataLayout* dp = extra_data_base(); +- DataLayout* end = extra_data_limit(); +- DataLayout* avail = NULL; +- for (; dp < end; dp = next_extra(dp)) { ++DataLayout* MethodData::next_extra(DataLayout* dp) { ++ int nb_cells = 0; ++ switch(dp->tag()) { ++ case DataLayout::bit_data_tag: ++ case DataLayout::no_tag: ++ nb_cells = BitData::static_cell_count(); ++ break; ++ case DataLayout::speculative_trap_data_tag: ++ nb_cells = SpeculativeTrapData::static_cell_count(); ++ break; ++ default: ++ fatal(err_msg("unexpected tag %d", dp->tag())); ++ } ++ return (DataLayout*)((address)dp + DataLayout::compute_size_in_bytes(nb_cells)); ++} ++ ++ProfileData* MethodData::bci_to_extra_data_helper(int bci, Method* m, DataLayout*& dp, bool concurrent) { ++ DataLayout* end = extra_data_limit(); ++ ++ for (;; dp = next_extra(dp)) { ++ assert(dp < end, "moved past end of extra data"); + // No need for "OrderAccess::load_acquire" ops, + // since the data structure is monotonic. +- if (dp->tag() == DataLayout::no_tag) break; +- if (dp->tag() == DataLayout::arg_info_data_tag) { +- dp = end; // ArgInfoData is at the end of extra data section. ++ switch(dp->tag()) { ++ case DataLayout::no_tag: ++ return NULL; ++ case DataLayout::arg_info_data_tag: ++ dp = end; ++ return NULL; // ArgInfoData is at the end of extra data section. ++ case DataLayout::bit_data_tag: ++ if (m == NULL && dp->bci() == bci) { ++ return new BitData(dp); ++ } + break; +- } +- if (dp->bci() == bci) { +- assert(dp->tag() == DataLayout::bit_data_tag, "sane"); +- return new BitData(dp); ++ case DataLayout::speculative_trap_data_tag: ++ if (m != NULL) { ++ SpeculativeTrapData* data = new SpeculativeTrapData(dp); ++ // data->method() may be null in case of a concurrent ++ // allocation. Maybe it's for the same method. Try to use that ++ // entry in that case. ++ if (dp->bci() == bci) { ++ if (data->method() == NULL) { ++ assert(concurrent, "impossible because no concurrent allocation"); ++ return NULL; ++ } else if (data->method() == m) { ++ return data; ++ } ++ } ++ } ++ break; ++ default: ++ fatal(err_msg("unexpected tag %d", dp->tag())); + } + } ++ return NULL; ++} ++ ++ ++// Translate a bci to its corresponding extra data, or NULL. ++ProfileData* MethodData::bci_to_extra_data(int bci, Method* m, bool create_if_missing) { ++ // This code assumes an entry for a SpeculativeTrapData is 2 cells ++ assert(2*DataLayout::compute_size_in_bytes(BitData::static_cell_count()) == ++ DataLayout::compute_size_in_bytes(SpeculativeTrapData::static_cell_count()), ++ "code needs to be adjusted"); ++ ++ DataLayout* dp = extra_data_base(); ++ DataLayout* end = extra_data_limit(); ++ ++ // Allocation in the extra data space has to be atomic because not ++ // all entries have the same size and non atomic concurrent ++ // allocation would result in a corrupted extra data space. ++ ProfileData* result = bci_to_extra_data_helper(bci, m, dp, true); ++ if (result != NULL) { ++ return result; ++ } ++ + if (create_if_missing && dp < end) { +- // Allocate this one. There is no mutual exclusion, +- // so two threads could allocate different BCIs to the +- // same data layout. This means these extra data +- // records, like most other MDO contents, must not be +- // trusted too much. ++ MutexLocker ml(&_extra_data_lock); ++ // Check again now that we have the lock. Another thread may ++ // have added extra data entries. ++ ProfileData* result = bci_to_extra_data_helper(bci, m, dp, false); ++ if (result != NULL || dp >= end) { ++ return result; ++ } ++ ++ assert(dp->tag() == DataLayout::no_tag || (dp->tag() == DataLayout::speculative_trap_data_tag && m != NULL), "should be free"); ++ assert(next_extra(dp)->tag() == DataLayout::no_tag || next_extra(dp)->tag() == DataLayout::arg_info_data_tag, "should be free or arg info"); ++ u1 tag = m == NULL ? DataLayout::bit_data_tag : DataLayout::speculative_trap_data_tag; ++ // SpeculativeTrapData is 2 slots. Make sure we have room. ++ if (m != NULL && next_extra(dp)->tag() != DataLayout::no_tag) { ++ return NULL; ++ } + DataLayout temp; +- temp.initialize(DataLayout::bit_data_tag, bci, 0); +- dp->release_set_header(temp.header()); +- assert(dp->tag() == DataLayout::bit_data_tag, "sane"); +- //NO: assert(dp->bci() == bci, "no concurrent allocation"); +- return new BitData(dp); ++ temp.initialize(tag, bci, 0); ++ ++ dp->set_header(temp.header()); ++ assert(dp->tag() == tag, "sane"); ++ assert(dp->bci() == bci, "no concurrent allocation"); ++ if (tag == DataLayout::bit_data_tag) { ++ return new BitData(dp); ++ } else { ++ SpeculativeTrapData* data = new SpeculativeTrapData(dp); ++ data->set_method(m); ++ return data; ++ } + } + return NULL; + } +@@ -1205,25 +1387,35 @@ + for ( ; is_valid(data); data = next_data(data)) { + st->print("%d", dp_to_di(data->dp())); + st->fill_to(6); +- data->print_data_on(st); ++ data->print_data_on(st, this); + } + st->print_cr("--- Extra data:"); + DataLayout* dp = extra_data_base(); + DataLayout* end = extra_data_limit(); +- for (; dp < end; dp = next_extra(dp)) { ++ for (;; dp = next_extra(dp)) { ++ assert(dp < end, "moved past end of extra data"); + // No need for "OrderAccess::load_acquire" ops, + // since the data structure is monotonic. +- if (dp->tag() == DataLayout::no_tag) continue; +- if (dp->tag() == DataLayout::bit_data_tag) { ++ switch(dp->tag()) { ++ case DataLayout::no_tag: ++ continue; ++ case DataLayout::bit_data_tag: + data = new BitData(dp); +- } else { +- assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo"); ++ break; ++ case DataLayout::speculative_trap_data_tag: ++ data = new SpeculativeTrapData(dp); ++ break; ++ case DataLayout::arg_info_data_tag: + data = new ArgInfoData(dp); + dp = end; // ArgInfoData is at the end of extra data section. ++ break; ++ default: ++ fatal(err_msg("unexpected tag %d", dp->tag())); + } + st->print("%d", dp_to_di(data->dp())); + st->fill_to(6); + data->print_data_on(st); ++ if (dp >= end) return; + } + } + #endif +@@ -1346,3 +1538,110 @@ + assert(profile_parameters_jsr292_only(), "inconsistent"); + return m->is_compiled_lambda_form(); + } ++ ++void MethodData::clean_extra_data_helper(DataLayout* dp, int shift, bool reset) { ++ if (shift == 0) { ++ return; ++ } ++ if (!reset) { ++ // Move all cells of trap entry at dp left by "shift" cells ++ intptr_t* start = (intptr_t*)dp; ++ intptr_t* end = (intptr_t*)next_extra(dp); ++ for (intptr_t* ptr = start; ptr < end; ptr++) { ++ *(ptr-shift) = *ptr; ++ } ++ } else { ++ // Reset "shift" cells stopping at dp ++ intptr_t* start = ((intptr_t*)dp) - shift; ++ intptr_t* end = (intptr_t*)dp; ++ for (intptr_t* ptr = start; ptr < end; ptr++) { ++ *ptr = 0; ++ } ++ } ++} ++ ++// Remove SpeculativeTrapData entries that reference an unloaded ++// method ++void MethodData::clean_extra_data(BoolObjectClosure* is_alive) { ++ DataLayout* dp = extra_data_base(); ++ DataLayout* end = extra_data_limit(); ++ ++ int shift = 0; ++ for (; dp < end; dp = next_extra(dp)) { ++ switch(dp->tag()) { ++ case DataLayout::speculative_trap_data_tag: { ++ SpeculativeTrapData* data = new SpeculativeTrapData(dp); ++ Method* m = data->method(); ++ assert(m != NULL, "should have a method"); ++ if (!m->method_holder()->is_loader_alive(is_alive)) { ++ // "shift" accumulates the number of cells for dead ++ // SpeculativeTrapData entries that have been seen so ++ // far. Following entries must be shifted left by that many ++ // cells to remove the dead SpeculativeTrapData entries. ++ shift += (int)((intptr_t*)next_extra(dp) - (intptr_t*)dp); ++ } else { ++ // Shift this entry left if it follows dead ++ // SpeculativeTrapData entries ++ clean_extra_data_helper(dp, shift); ++ } ++ break; ++ } ++ case DataLayout::bit_data_tag: ++ // Shift this entry left if it follows dead SpeculativeTrapData ++ // entries ++ clean_extra_data_helper(dp, shift); ++ continue; ++ case DataLayout::no_tag: ++ case DataLayout::arg_info_data_tag: ++ // We are at end of the live trap entries. The previous "shift" ++ // cells contain entries that are either dead or were shifted ++ // left. They need to be reset to no_tag ++ clean_extra_data_helper(dp, shift, true); ++ return; ++ default: ++ fatal(err_msg("unexpected tag %d", dp->tag())); ++ } ++ } ++} ++ ++// Verify there's no unloaded method referenced by a ++// SpeculativeTrapData entry ++void MethodData::verify_extra_data_clean(BoolObjectClosure* is_alive) { ++#ifdef ASSERT ++ DataLayout* dp = extra_data_base(); ++ DataLayout* end = extra_data_limit(); ++ ++ for (; dp < end; dp = next_extra(dp)) { ++ switch(dp->tag()) { ++ case DataLayout::speculative_trap_data_tag: { ++ SpeculativeTrapData* data = new SpeculativeTrapData(dp); ++ Method* m = data->method(); ++ assert(m != NULL && m->method_holder()->is_loader_alive(is_alive), "Method should exist"); ++ break; ++ } ++ case DataLayout::bit_data_tag: ++ continue; ++ case DataLayout::no_tag: ++ case DataLayout::arg_info_data_tag: ++ return; ++ default: ++ fatal(err_msg("unexpected tag %d", dp->tag())); ++ } ++ } ++#endif ++} ++ ++void MethodData::clean_method_data(BoolObjectClosure* is_alive) { ++ for (ProfileData* data = first_data(); ++ is_valid(data); ++ data = next_data(data)) { ++ data->clean_weak_klass_links(is_alive); ++ } ++ ParametersTypeData* parameters = parameters_type_data(); ++ if (parameters != NULL) { ++ parameters->clean_weak_klass_links(is_alive); ++ } ++ ++ clean_extra_data(is_alive); ++ verify_extra_data_clean(is_alive); ++} +--- ./hotspot/src/share/vm/oops/methodData.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/methodData.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -120,7 +120,8 @@ + arg_info_data_tag, + call_type_data_tag, + virtual_call_type_data_tag, +- parameters_type_data_tag ++ parameters_type_data_tag, ++ speculative_trap_data_tag + }; + + enum { +@@ -189,9 +190,6 @@ + void set_header(intptr_t value) { + _header._bits = value; + } +- void release_set_header(intptr_t value) { +- OrderAccess::release_store_ptr(&_header._bits, value); +- } + intptr_t header() { + return _header._bits; + } +@@ -230,6 +228,11 @@ + static ByteSize cell_offset(int index) { + return byte_offset_of(DataLayout, _cells) + in_ByteSize(index * cell_size); + } ++#ifdef CC_INTERP ++ static int cell_offset_in_bytes(int index) { ++ return (int)offset_of(DataLayout, _cells[index]); ++ } ++#endif // CC_INTERP + // Return a value which, when or-ed as a byte into _flags, sets the flag. + static int flag_number_to_byte_constant(int flag_number) { + assert(0 <= flag_number && flag_number < flag_limit, "oob"); +@@ -266,6 +269,7 @@ + class MultiBranchData; + class ArgInfoData; + class ParametersTypeData; ++class SpeculativeTrapData; + + // ProfileData + // +@@ -286,6 +290,8 @@ + // This is a pointer to a section of profiling data. + DataLayout* _data; + ++ char* print_data_on_helper(const MethodData* md) const; ++ + protected: + DataLayout* data() { return _data; } + const DataLayout* data() const { return _data; } +@@ -367,6 +373,41 @@ + _data = data; + } + ++#ifdef CC_INTERP ++ // Static low level accessors for DataLayout with ProfileData's semantics. ++ ++ static int cell_offset_in_bytes(int index) { ++ return DataLayout::cell_offset_in_bytes(index); ++ } ++ ++ static void increment_uint_at_no_overflow(DataLayout* layout, int index, ++ int inc = DataLayout::counter_increment) { ++ uint count = ((uint)layout->cell_at(index)) + inc; ++ if (count == 0) return; ++ layout->set_cell_at(index, (intptr_t) count); ++ } ++ ++ static int int_at(DataLayout* layout, int index) { ++ return (int)layout->cell_at(index); ++ } ++ ++ static int uint_at(DataLayout* layout, int index) { ++ return (uint)layout->cell_at(index); ++ } ++ ++ static oop oop_at(DataLayout* layout, int index) { ++ return cast_to_oop(layout->cell_at(index)); ++ } ++ ++ static void set_intptr_at(DataLayout* layout, int index, intptr_t value) { ++ layout->set_cell_at(index, (intptr_t) value); ++ } ++ ++ static void set_flag_at(DataLayout* layout, int flag_number) { ++ layout->set_flag_at(flag_number); ++ } ++#endif // CC_INTERP ++ + public: + // Constructor for invalid ProfileData. + ProfileData(); +@@ -400,6 +441,7 @@ + virtual bool is_CallTypeData() const { return false; } + virtual bool is_VirtualCallTypeData()const { return false; } + virtual bool is_ParametersTypeData() const { return false; } ++ virtual bool is_SpeculativeTrapData()const { return false; } + + + BitData* as_BitData() const { +@@ -454,6 +496,10 @@ + assert(is_ParametersTypeData(), "wrong type"); + return is_ParametersTypeData() ? (ParametersTypeData*)this : NULL; + } ++ SpeculativeTrapData* as_SpeculativeTrapData() const { ++ assert(is_SpeculativeTrapData(), "wrong type"); ++ return is_SpeculativeTrapData() ? (SpeculativeTrapData*)this : NULL; ++ } + + + // Subclass specific initialization +@@ -469,12 +515,14 @@ + // translation here, and the required translators are in the ci subclasses. + virtual void translate_from(const ProfileData* data) {} + +- virtual void print_data_on(outputStream* st) const { ++ virtual void print_data_on(outputStream* st, const char* extra = NULL) const { + ShouldNotReachHere(); + } + ++ void print_data_on(outputStream* st, const MethodData* md) const; ++ + #ifndef PRODUCT +- void print_shared(outputStream* st, const char* name) const; ++ void print_shared(outputStream* st, const char* name, const char* extra) const; + void tab(outputStream* st, bool first = false) const; + #endif + }; +@@ -521,8 +569,22 @@ + return cell_offset(bit_cell_count); + } + ++#ifdef CC_INTERP ++ static int bit_data_size_in_bytes() { ++ return cell_offset_in_bytes(bit_cell_count); ++ } ++ ++ static void set_null_seen(DataLayout* layout) { ++ set_flag_at(layout, null_seen_flag); ++ } ++ ++ static DataLayout* advance(DataLayout* layout) { ++ return (DataLayout*) (((address)layout) + (ssize_t)BitData::bit_data_size_in_bytes()); ++ } ++#endif // CC_INTERP ++ + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -565,8 +627,27 @@ + set_uint_at(count_off, count); + } + ++#ifdef CC_INTERP ++ static int counter_data_size_in_bytes() { ++ return cell_offset_in_bytes(counter_cell_count); ++ } ++ ++ static void increment_count_no_overflow(DataLayout* layout) { ++ increment_uint_at_no_overflow(layout, count_off); ++ } ++ ++ // Support counter decrementation at checkcast / subtype check failed. ++ static void decrement_count(DataLayout* layout) { ++ increment_uint_at_no_overflow(layout, count_off, -1); ++ } ++ ++ static DataLayout* advance(DataLayout* layout) { ++ return (DataLayout*) (((address)layout) + (ssize_t)CounterData::counter_data_size_in_bytes()); ++ } ++#endif // CC_INTERP ++ + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -635,11 +716,25 @@ + return cell_offset(displacement_off_set); + } + ++#ifdef CC_INTERP ++ static void increment_taken_count_no_overflow(DataLayout* layout) { ++ increment_uint_at_no_overflow(layout, taken_off_set); ++ } ++ ++ static DataLayout* advance_taken(DataLayout* layout) { ++ return (DataLayout*) (((address)layout) + (ssize_t)int_at(layout, displacement_off_set)); ++ } ++ ++ static uint taken_count(DataLayout* layout) { ++ return (uint) uint_at(layout, taken_off_set); ++ } ++#endif // CC_INTERP ++ + // Specific initialization. + void post_initialize(BytecodeStream* stream, MethodData* mdo); + + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -927,6 +1022,11 @@ + static ByteSize argument_type_offset(int i) { + return in_ByteSize(argument_type_local_offset(i) * DataLayout::cell_size); + } ++ ++ static ByteSize return_only_size() { ++ return ReturnTypeEntry::size() + in_ByteSize(header_cell_count() * DataLayout::cell_size); ++ } ++ + }; + + // CallTypeData +@@ -1050,7 +1150,7 @@ + } + + #ifndef PRODUCT +- virtual void print_data_on(outputStream* st) const; ++ virtual void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -1156,9 +1256,46 @@ + // GC support + virtual void clean_weak_klass_links(BoolObjectClosure* is_alive_closure); + ++#ifdef CC_INTERP ++ static int receiver_type_data_size_in_bytes() { ++ return cell_offset_in_bytes(static_cell_count()); ++ } ++ ++ static Klass *receiver_unchecked(DataLayout* layout, uint row) { ++ Klass* recv = (Klass*)layout->cell_at(receiver_cell_index(row)); ++ return recv; ++ } ++ ++ static void increment_receiver_count_no_overflow(DataLayout* layout, Klass *rcvr) { ++ const int num_rows = row_limit(); ++ // Receiver already exists? ++ for (int row = 0; row < num_rows; row++) { ++ if (receiver_unchecked(layout, row) == rcvr) { ++ increment_uint_at_no_overflow(layout, receiver_count_cell_index(row)); ++ return; ++ } ++ } ++ // New receiver, find a free slot. ++ for (int row = 0; row < num_rows; row++) { ++ if (receiver_unchecked(layout, row) == NULL) { ++ set_intptr_at(layout, receiver_cell_index(row), (intptr_t)rcvr); ++ increment_uint_at_no_overflow(layout, receiver_count_cell_index(row)); ++ return; ++ } ++ } ++ // Receiver did not match any saved receiver and there is no empty row for it. ++ // Increment total counter to indicate polymorphic case. ++ increment_count_no_overflow(layout); ++ } ++ ++ static DataLayout* advance(DataLayout* layout) { ++ return (DataLayout*) (((address)layout) + (ssize_t)ReceiverTypeData::receiver_type_data_size_in_bytes()); ++ } ++#endif // CC_INTERP ++ + #ifndef PRODUCT + void print_receiver_data_on(outputStream* st) const; +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -1190,8 +1327,18 @@ + return cell_offset(static_cell_count()); + } + ++#ifdef CC_INTERP ++ static int virtual_call_data_size_in_bytes() { ++ return cell_offset_in_bytes(static_cell_count()); ++ } ++ ++ static DataLayout* advance(DataLayout* layout) { ++ return (DataLayout*) (((address)layout) + (ssize_t)VirtualCallData::virtual_call_data_size_in_bytes()); ++ } ++#endif // CC_INTERP ++ + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -1317,7 +1464,7 @@ + } + + #ifndef PRODUCT +- virtual void print_data_on(outputStream* st) const; ++ virtual void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -1412,11 +1559,15 @@ + return cell_offset(bci_displacement_cell_index(row)); + } + ++#ifdef CC_INTERP ++ static DataLayout* advance(MethodData *md, int bci); ++#endif // CC_INTERP ++ + // Specific initialization. + void post_initialize(BytecodeStream* stream, MethodData* mdo); + + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -1476,11 +1627,25 @@ + return cell_offset(branch_cell_count); + } + ++#ifdef CC_INTERP ++ static int branch_data_size_in_bytes() { ++ return cell_offset_in_bytes(branch_cell_count); ++ } ++ ++ static void increment_not_taken_count_no_overflow(DataLayout* layout) { ++ increment_uint_at_no_overflow(layout, not_taken_off_set); ++ } ++ ++ static DataLayout* advance_not_taken(DataLayout* layout) { ++ return (DataLayout*) (((address)layout) + (ssize_t)BranchData::branch_data_size_in_bytes()); ++ } ++#endif // CC_INTERP ++ + // Specific initialization. + void post_initialize(BytecodeStream* stream, MethodData* mdo); + + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -1515,6 +1680,20 @@ + set_int_at(aindex, value); + } + ++#ifdef CC_INTERP ++ // Static low level accessors for DataLayout with ArrayData's semantics. ++ ++ static void increment_array_uint_at_no_overflow(DataLayout* layout, int index) { ++ int aindex = index + array_start_off_set; ++ increment_uint_at_no_overflow(layout, aindex); ++ } ++ ++ static int array_int_at(DataLayout* layout, int index) { ++ int aindex = index + array_start_off_set; ++ return int_at(layout, aindex); ++ } ++#endif // CC_INTERP ++ + // Code generation support for subclasses. + static ByteSize array_element_offset(int index) { + return cell_offset(array_start_off_set + index); +@@ -1633,11 +1812,33 @@ + return in_ByteSize(relative_displacement_off_set) * cell_size; + } + ++#ifdef CC_INTERP ++ static void increment_count_no_overflow(DataLayout* layout, int index) { ++ if (index == -1) { ++ increment_array_uint_at_no_overflow(layout, default_count_off_set); ++ } else { ++ increment_array_uint_at_no_overflow(layout, case_array_start + ++ index * per_case_cell_count + ++ relative_count_off_set); ++ } ++ } ++ ++ static DataLayout* advance(DataLayout* layout, int index) { ++ if (index == -1) { ++ return (DataLayout*) (((address)layout) + (ssize_t)array_int_at(layout, default_disaplacement_off_set)); ++ } else { ++ return (DataLayout*) (((address)layout) + (ssize_t)array_int_at(layout, case_array_start + ++ index * per_case_cell_count + ++ relative_displacement_off_set)); ++ } ++ } ++#endif // CC_INTERP ++ + // Specific initialization. + void post_initialize(BytecodeStream* stream, MethodData* mdo); + + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -1664,7 +1865,7 @@ + } + + #ifndef PRODUCT +- void print_data_on(outputStream* st) const; ++ void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + }; + +@@ -1725,7 +1926,7 @@ + } + + #ifndef PRODUCT +- virtual void print_data_on(outputStream* st) const; ++ virtual void print_data_on(outputStream* st, const char* extra = NULL) const; + #endif + + static ByteSize stack_slot_offset(int i) { +@@ -1737,6 +1938,54 @@ + } + }; + ++// SpeculativeTrapData ++// ++// A SpeculativeTrapData is used to record traps due to type ++// speculation. It records the root of the compilation: that type ++// speculation is wrong in the context of one compilation (for ++// method1) doesn't mean it's wrong in the context of another one (for ++// method2). Type speculation could have more/different data in the ++// context of the compilation of method2 and it's worthwhile to try an ++// optimization that failed for compilation of method1 in the context ++// of compilation of method2. ++// Space for SpeculativeTrapData entries is allocated from the extra ++// data space in the MDO. If we run out of space, the trap data for ++// the ProfileData at that bci is updated. ++class SpeculativeTrapData : public ProfileData { ++protected: ++ enum { ++ method_offset, ++ speculative_trap_cell_count ++ }; ++public: ++ SpeculativeTrapData(DataLayout* layout) : ProfileData(layout) { ++ assert(layout->tag() == DataLayout::speculative_trap_data_tag, "wrong type"); ++ } ++ ++ virtual bool is_SpeculativeTrapData() const { return true; } ++ ++ static int static_cell_count() { ++ return speculative_trap_cell_count; ++ } ++ ++ virtual int cell_count() const { ++ return static_cell_count(); ++ } ++ ++ // Direct accessor ++ Method* method() const { ++ return (Method*)intptr_at(method_offset); ++ } ++ ++ void set_method(Method* m) { ++ set_intptr_at(method_offset, (intptr_t)m); ++ } ++ ++#ifndef PRODUCT ++ virtual void print_data_on(outputStream* st, const char* extra = NULL) const; ++#endif ++}; ++ + // MethodData* + // + // A MethodData* holds information which has been collected about +@@ -1780,8 +2029,11 @@ + // adjusted in the event of a change in control flow. + // + ++CC_INTERP_ONLY(class BytecodeInterpreter;) ++ + class MethodData : public Metadata { + friend class VMStructs; ++ CC_INTERP_ONLY(friend class BytecodeInterpreter;) + private: + friend class ProfileData; + +@@ -1794,16 +2046,18 @@ + // Cached hint for bci_to_dp and bci_to_data + int _hint_di; + ++ Mutex _extra_data_lock; ++ + MethodData(methodHandle method, int size, TRAPS); + public: + static MethodData* allocate(ClassLoaderData* loader_data, methodHandle method, TRAPS); +- MethodData() {}; // For ciMethodData ++ MethodData() : _extra_data_lock(Monitor::leaf, "MDO extra data lock") {}; // For ciMethodData + + bool is_methodData() const volatile { return true; } + + // Whole-method sticky bits and flags + enum { +- _trap_hist_limit = 17, // decoupled from Deoptimization::Reason_LIMIT ++ _trap_hist_limit = 19, // decoupled from Deoptimization::Reason_LIMIT + _trap_hist_mask = max_jubyte, + _extra_data_count = 4 // extra DataLayout headers, for trap history + }; // Public flag values +@@ -1834,6 +2088,12 @@ + // Counter values at the time profiling started. + int _invocation_counter_start; + int _backedge_counter_start; ++ ++#if INCLUDE_RTM_OPT ++ // State of RTM code generation during compilation of the method ++ int _rtm_state; ++#endif ++ + // Number of loops and blocks is computed when compiling the first + // time with C1. It is used to determine if method is trivial. + short _num_loops; +@@ -1858,6 +2118,7 @@ + // Helper for size computation + static int compute_data_size(BytecodeStream* stream); + static int bytecode_cell_count(Bytecodes::Code code); ++ static bool is_speculative_trap_bytecode(Bytecodes::Code code); + enum { no_profile_data = -1, variable_cell_count = -2 }; + + // Helper for initialization +@@ -1901,8 +2162,9 @@ + // What is the index of the first data entry? + int first_di() const { return 0; } + ++ ProfileData* bci_to_extra_data_helper(int bci, Method* m, DataLayout*& dp, bool concurrent); + // Find or create an extra ProfileData: +- ProfileData* bci_to_extra_data(int bci, bool create_if_missing); ++ ProfileData* bci_to_extra_data(int bci, Method* m, bool create_if_missing); + + // return the argument info cell + ArgInfoData *arg_info(); +@@ -1915,7 +2177,6 @@ + + static bool profile_jsr292(methodHandle m, int bci); + static int profile_arguments_flag(); +- static bool profile_arguments_jsr292_only(); + static bool profile_all_arguments(); + static bool profile_arguments_for_invoke(methodHandle m, int bci); + static int profile_return_flag(); +@@ -1925,6 +2186,10 @@ + static bool profile_parameters_jsr292_only(); + static bool profile_all_parameters(); + ++ void clean_extra_data(BoolObjectClosure* is_alive); ++ void clean_extra_data_helper(DataLayout* dp, int shift, bool reset = false); ++ void verify_extra_data_clean(BoolObjectClosure* is_alive); ++ + public: + static int header_size() { + return sizeof(MethodData)/wordSize; +@@ -1933,7 +2198,7 @@ + // Compute the size of a MethodData* before it is created. + static int compute_allocation_size_in_bytes(methodHandle method); + static int compute_allocation_size_in_words(methodHandle method); +- static int compute_extra_data_count(int data_size, int empty_bc_count); ++ static int compute_extra_data_count(int data_size, int empty_bc_count, bool needs_speculative_traps); + + // Determine if a given bytecode can have profile information. + static bool bytecode_has_profile(Bytecodes::Code code) { +@@ -1991,6 +2256,22 @@ + InvocationCounter* invocation_counter() { return &_invocation_counter; } + InvocationCounter* backedge_counter() { return &_backedge_counter; } + ++#if INCLUDE_RTM_OPT ++ int rtm_state() const { ++ return _rtm_state; ++ } ++ void set_rtm_state(RTMState rstate) { ++ _rtm_state = (int)rstate; ++ } ++ void atomic_set_rtm_state(RTMState rstate) { ++ Atomic::store((int)rstate, &_rtm_state); ++ } ++ ++ static int rtm_state_offset_in_bytes() { ++ return offset_of(MethodData, _rtm_state); ++ } ++#endif ++ + void set_would_profile(bool p) { _would_profile = p; } + bool would_profile() const { return _would_profile; } + +@@ -2074,9 +2355,26 @@ + ProfileData* bci_to_data(int bci); + + // Same, but try to create an extra_data record if one is needed: +- ProfileData* allocate_bci_to_data(int bci) { +- ProfileData* data = bci_to_data(bci); +- return (data != NULL) ? data : bci_to_extra_data(bci, true); ++ ProfileData* allocate_bci_to_data(int bci, Method* m) { ++ ProfileData* data = NULL; ++ // If m not NULL, try to allocate a SpeculativeTrapData entry ++ if (m == NULL) { ++ data = bci_to_data(bci); ++ } ++ if (data != NULL) { ++ return data; ++ } ++ data = bci_to_extra_data(bci, m, true); ++ if (data != NULL) { ++ return data; ++ } ++ // If SpeculativeTrapData allocation fails try to allocate a ++ // regular entry ++ data = bci_to_data(bci); ++ if (data != NULL) { ++ return data; ++ } ++ return bci_to_extra_data(bci, NULL, true); + } + + // Add a handful of extra data records, for trap tracking. +@@ -2084,7 +2382,7 @@ + DataLayout* extra_data_limit() const { return (DataLayout*)((address)this + size_in_bytes()); } + int extra_data_size() const { return (address)extra_data_limit() + - (address)extra_data_base(); } +- static DataLayout* next_extra(DataLayout* dp) { return (DataLayout*)((address)dp + in_bytes(DataLayout::cell_offset(0))); } ++ static DataLayout* next_extra(DataLayout* dp); + + // Return (uint)-1 for overflow. + uint trap_count(int reason) const { +@@ -2181,9 +2479,12 @@ + + static bool profile_parameters_for_method(methodHandle m); + static bool profile_arguments(); ++ static bool profile_arguments_jsr292_only(); + static bool profile_return(); + static bool profile_parameters(); + static bool profile_return_jsr292_only(); ++ ++ void clean_method_data(BoolObjectClosure* is_alive); + }; + + #endif // SHARE_VM_OOPS_METHODDATAOOP_HPP +--- ./hotspot/src/share/vm/oops/objArrayKlass.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/objArrayKlass.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -674,8 +674,8 @@ + + // Verification + +-void ObjArrayKlass::verify_on(outputStream* st, bool check_dictionary) { +- ArrayKlass::verify_on(st, check_dictionary); ++void ObjArrayKlass::verify_on(outputStream* st) { ++ ArrayKlass::verify_on(st); + guarantee(element_klass()->is_klass(), "should be klass"); + guarantee(bottom_klass()->is_klass(), "should be klass"); + Klass* bk = bottom_klass(); +--- ./hotspot/src/share/vm/oops/objArrayKlass.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/objArrayKlass.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -151,7 +151,7 @@ + const char* internal_name() const; + + // Verification +- void verify_on(outputStream* st, bool check_dictionary); ++ void verify_on(outputStream* st); + + void oop_verify_on(oop obj, outputStream* st); + }; +--- ./hotspot/src/share/vm/oops/oop.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/oop.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -30,6 +30,8 @@ + #include "runtime/thread.inline.hpp" + #include "utilities/copy.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + bool always_do_update_barrier = false; + + BarrierSet* oopDesc::_bs = NULL; +@@ -102,7 +104,7 @@ + } + + // When String table needs to rehash +-unsigned int oopDesc::new_hash(jint seed) { ++unsigned int oopDesc::new_hash(juint seed) { + EXCEPTION_MARK; + ResourceMark rm; + int length; +--- ./hotspot/src/share/vm/oops/oop.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/oop.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -362,7 +362,7 @@ + intptr_t slow_identity_hash(); + + // Alternate hashing code if string table is rehashed +- unsigned int new_hash(jint seed); ++ unsigned int new_hash(juint seed); + + // marks are forwarded to stack when object is locked + bool has_displaced_mark() const; +--- ./hotspot/src/share/vm/oops/oop.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/oop.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -209,7 +209,7 @@ + address base = Universe::narrow_oop_base(); + int shift = Universe::narrow_oop_shift(); + oop result = (oop)(void*)((uintptr_t)base + ((uintptr_t)v << shift)); +- assert(check_obj_alignment(result), err_msg("address not aligned: " PTR_FORMAT, (void*) result)); ++ assert(check_obj_alignment(result), err_msg("address not aligned: " INTPTR_FORMAT, p2i((void*) result))); + return result; + } + +@@ -490,9 +490,9 @@ + return size_given_klass(klass()); + } + +-inline void update_barrier_set(void* p, oop v) { ++inline void update_barrier_set(void* p, oop v, bool release = false) { + assert(oopDesc::bs() != NULL, "Uninitialized bs in oop!"); +- oopDesc::bs()->write_ref_field(p, v); ++ oopDesc::bs()->write_ref_field(p, v, release); + } + + template inline void update_barrier_set_pre(T* p, oop v) { +@@ -505,7 +505,10 @@ + } else { + update_barrier_set_pre(p, v); + oopDesc::encode_store_heap_oop(p, v); +- update_barrier_set((void*)p, v); // cast away type ++ // always_do_update_barrier == false => ++ // Either we are at a safepoint (in GC) or CMS is not used. In both ++ // cases it's unnecessary to mark the card as dirty with release sematics. ++ update_barrier_set((void*)p, v, false /* release */); // cast away type + } + } + +@@ -513,7 +516,12 @@ + update_barrier_set_pre((T*)p, v); // cast away volatile + // Used by release_obj_field_put, so use release_store_ptr. + oopDesc::release_encode_store_heap_oop(p, v); +- update_barrier_set((void*)p, v); // cast away type ++ // When using CMS we must mark the card corresponding to p as dirty ++ // with release sematics to prevent that CMS sees the dirty card but ++ // not the new value v at p due to reordering of the two ++ // stores. Note that CMS has a concurrent precleaning phase, where ++ // it reads the card table while the Java threads are running. ++ update_barrier_set((void*)p, v, true /* release */); // cast away type + } + + // Should replace *addr = oop assignments where addr type depends on UseCompressedOops +--- ./hotspot/src/share/vm/oops/symbol.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/symbol.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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,7 +207,7 @@ + } + + // Alternate hashing for unbalanced symbol tables. +-unsigned int Symbol::new_hash(jint seed) { ++unsigned int Symbol::new_hash(juint seed) { + ResourceMark rm; + // Use alternate hashing algorithm on this symbol. + return AltHashing::murmur3_32(seed, (const jbyte*)as_C_string(), utf8_length()); +--- ./hotspot/src/share/vm/oops/symbol.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/symbol.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -154,7 +154,7 @@ + int identity_hash() { return _identity_hash; } + + // For symbol table alternate hashing +- unsigned int new_hash(jint seed); ++ unsigned int new_hash(juint seed); + + // Reference counting. See comments above this class for when to use. + int refcount() const { return _refcount; } +--- ./hotspot/src/share/vm/oops/typeArrayOop.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/oops/typeArrayOop.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -51,6 +51,9 @@ + #ifdef TARGET_OS_ARCH_linux_ppc + # include "orderAccess_linux_ppc.inline.hpp" + #endif ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "orderAccess_aix_ppc.inline.hpp" ++#endif + #ifdef TARGET_OS_ARCH_bsd_x86 + # include "orderAccess_bsd_x86.inline.hpp" + #endif +--- ./hotspot/src/share/vm/opto/block.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/block.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -144,6 +144,10 @@ + remove_node(find_node(n)); + } + ++bool Block::contains(const Node *n) const { ++ return _nodes.contains(n); ++} ++ + // Return empty status of a block. Empty blocks contain only the head, other + // ideal nodes, and an optional trailing goto. + int Block::is_Empty() const { +@@ -335,7 +339,7 @@ + st->print(" FRegPressure: %d",_freg_pressure); + st->print(" FHRP Index: %d",_fhrp_index); + } +- st->print_cr(""); ++ st->cr(); + } + + void Block::dump() const { +@@ -526,18 +530,27 @@ + + // Does this block end in a multiway branch that cannot have the default case + // flipped for another case? +-static bool no_flip_branch( Block *b ) { ++static bool no_flip_branch(Block *b) { + int branch_idx = b->number_of_nodes() - b->_num_succs-1; +- if( branch_idx < 1 ) return false; +- Node *bra = b->get_node(branch_idx); +- if( bra->is_Catch() ) ++ if (branch_idx < 1) { ++ return false; ++ } ++ Node *branch = b->get_node(branch_idx); ++ if (branch->is_Catch()) { + return true; +- if( bra->is_Mach() ) { +- if( bra->is_MachNullCheck() ) ++ } ++ if (branch->is_Mach()) { ++ if (branch->is_MachNullCheck()) { + return true; +- int iop = bra->as_Mach()->ideal_Opcode(); +- if( iop == Op_FastLock || iop == Op_FastUnlock ) ++ } ++ int iop = branch->as_Mach()->ideal_Opcode(); ++ if (iop == Op_FastLock || iop == Op_FastUnlock) { + return true; ++ } ++ // Don't flip if branch has an implicit check. ++ if (branch->as_Mach()->is_TrapBasedCheckNode()) { ++ return true; ++ } + } + return false; + } +@@ -696,10 +709,66 @@ + } // End of for all blocks + } + ++Block *PhaseCFG::fixup_trap_based_check(Node *branch, Block *block, int block_pos, Block *bnext) { ++ // Trap based checks must fall through to the successor with ++ // PROB_ALWAYS. ++ // They should be an If with 2 successors. ++ assert(branch->is_MachIf(), "must be If"); ++ assert(block->_num_succs == 2, "must have 2 successors"); ++ ++ // Get the If node and the projection for the first successor. ++ MachIfNode *iff = block->get_node(block->number_of_nodes()-3)->as_MachIf(); ++ ProjNode *proj0 = block->get_node(block->number_of_nodes()-2)->as_Proj(); ++ ProjNode *proj1 = block->get_node(block->number_of_nodes()-1)->as_Proj(); ++ ProjNode *projt = (proj0->Opcode() == Op_IfTrue) ? proj0 : proj1; ++ ProjNode *projf = (proj0->Opcode() == Op_IfFalse) ? proj0 : proj1; ++ ++ // Assert that proj0 and succs[0] match up. Similarly for proj1 and succs[1]. ++ assert(proj0->raw_out(0) == block->_succs[0]->head(), "Mismatch successor 0"); ++ assert(proj1->raw_out(0) == block->_succs[1]->head(), "Mismatch successor 1"); ++ ++ ProjNode *proj_always; ++ ProjNode *proj_never; ++ // We must negate the branch if the implicit check doesn't follow ++ // the branch's TRUE path. Then, the new TRUE branch target will ++ // be the old FALSE branch target. ++ if (iff->_prob <= 2*PROB_NEVER) { // There are small rounding errors. ++ proj_never = projt; ++ proj_always = projf; ++ } else { ++ // We must negate the branch if the trap doesn't follow the ++ // branch's TRUE path. Then, the new TRUE branch target will ++ // be the old FALSE branch target. ++ proj_never = projf; ++ proj_always = projt; ++ iff->negate(); ++ } ++ assert(iff->_prob <= 2*PROB_NEVER, "Trap based checks are expected to trap never!"); ++ // Map the successors properly ++ block->_succs.map(0, get_block_for_node(proj_never ->raw_out(0))); // The target of the trap. ++ block->_succs.map(1, get_block_for_node(proj_always->raw_out(0))); // The fall through target. ++ ++ if (block->get_node(block->number_of_nodes() - block->_num_succs + 1) != proj_always) { ++ block->map_node(proj_never, block->number_of_nodes() - block->_num_succs + 0); ++ block->map_node(proj_always, block->number_of_nodes() - block->_num_succs + 1); ++ } ++ ++ // Place the fall through block after this block. ++ Block *bs1 = block->non_connector_successor(1); ++ if (bs1 != bnext && move_to_next(bs1, block_pos)) { ++ bnext = bs1; ++ } ++ // If the fall through block still is not the next block, insert a goto. ++ if (bs1 != bnext) { ++ insert_goto_at(block_pos, 1); ++ } ++ return bnext; ++} ++ + // Fix up the final control flow for basic blocks. + void PhaseCFG::fixup_flow() { + // Fixup final control flow for the blocks. Remove jump-to-next +- // block. If neither arm of a IF follows the conditional branch, we ++ // block. If neither arm of an IF follows the conditional branch, we + // have to add a second jump after the conditional. We place the + // TRUE branch target in succs[0] for both GOTOs and IFs. + for (uint i = 0; i < number_of_blocks(); i++) { +@@ -719,25 +788,39 @@ + // Check for multi-way branches where I cannot negate the test to + // exchange the true and false targets. + if (no_flip_branch(block)) { +- // Find fall through case - if must fall into its target ++ // Find fall through case - if must fall into its target. ++ // Get the index of the branch's first successor. + int branch_idx = block->number_of_nodes() - block->_num_succs; +- for (uint j2 = 0; j2 < block->_num_succs; j2++) { +- const ProjNode* p = block->get_node(branch_idx + j2)->as_Proj(); +- if (p->_con == 0) { +- // successor j2 is fall through case +- if (block->non_connector_successor(j2) != bnext) { +- // but it is not the next block => insert a goto +- insert_goto_at(i, j2); ++ ++ // The branch is 1 before the branch's first successor. ++ Node *branch = block->get_node(branch_idx-1); ++ ++ // Handle no-flip branches which have implicit checks and which require ++ // special block ordering and individual semantics of the 'fall through ++ // case'. ++ if ((TrapBasedNullChecks || TrapBasedRangeChecks) && ++ branch->is_Mach() && branch->as_Mach()->is_TrapBasedCheckNode()) { ++ bnext = fixup_trap_based_check(branch, block, i, bnext); ++ } else { ++ // Else, default handling for no-flip branches ++ for (uint j2 = 0; j2 < block->_num_succs; j2++) { ++ const ProjNode* p = block->get_node(branch_idx + j2)->as_Proj(); ++ if (p->_con == 0) { ++ // successor j2 is fall through case ++ if (block->non_connector_successor(j2) != bnext) { ++ // but it is not the next block => insert a goto ++ insert_goto_at(i, j2); ++ } ++ // Put taken branch in slot 0 ++ if (j2 == 0 && block->_num_succs == 2) { ++ // Flip targets in succs map ++ Block *tbs0 = block->_succs[0]; ++ Block *tbs1 = block->_succs[1]; ++ block->_succs.map(0, tbs1); ++ block->_succs.map(1, tbs0); ++ } ++ break; + } +- // Put taken branch in slot 0 +- if (j2 == 0 && block->_num_succs == 2) { +- // Flip targets in succs map +- Block *tbs0 = block->_succs[0]; +- Block *tbs1 = block->_succs[1]; +- block->_succs.map(0, tbs1); +- block->_succs.map(1, tbs0); +- } +- break; + } + } + +@@ -844,6 +927,228 @@ + } + + ++// postalloc_expand: Expand nodes after register allocation. ++// ++// postalloc_expand has to be called after register allocation, just ++// before output (i.e. scheduling). It only gets called if ++// Matcher::require_postalloc_expand is true. ++// ++// Background: ++// ++// Nodes that are expandend (one compound node requiring several ++// assembler instructions to be implemented split into two or more ++// non-compound nodes) after register allocation are not as nice as ++// the ones expanded before register allocation - they don't ++// participate in optimizations as global code motion. But after ++// register allocation we can expand nodes that use registers which ++// are not spillable or registers that are not allocated, because the ++// old compound node is simply replaced (in its location in the basic ++// block) by a new subgraph which does not contain compound nodes any ++// more. The scheduler called during output can later on process these ++// non-compound nodes. ++// ++// Implementation: ++// ++// Nodes requiring postalloc expand are specified in the ad file by using ++// a postalloc_expand statement instead of ins_encode. A postalloc_expand ++// contains a single call to an encoding, as does an ins_encode ++// statement. Instead of an emit() function a postalloc_expand() function ++// is generated that doesn't emit assembler but creates a new ++// subgraph. The code below calls this postalloc_expand function for each ++// node with the appropriate attribute. This function returns the new ++// nodes generated in an array passed in the call. The old node, ++// potential MachTemps before and potential Projs after it then get ++// disconnected and replaced by the new nodes. The instruction ++// generating the result has to be the last one in the array. In ++// general it is assumed that Projs after the node expanded are ++// kills. These kills are not required any more after expanding as ++// there are now explicitly visible def-use chains and the Projs are ++// removed. This does not hold for calls: They do not only have ++// kill-Projs but also Projs defining values. Therefore Projs after ++// the node expanded are removed for all but for calls. If a node is ++// to be reused, it must be added to the nodes list returned, and it ++// will be added again. ++// ++// Implementing the postalloc_expand function for a node in an enc_class ++// is rather tedious. It requires knowledge about many node details, as ++// the nodes and the subgraph must be hand crafted. To simplify this, ++// adlc generates some utility variables into the postalloc_expand function, ++// e.g., holding the operands as specified by the postalloc_expand encoding ++// specification, e.g.: ++// * unsigned idx_ holding the index of the node in the ins ++// * Node *n_ holding the node loaded from the ins ++// * MachOpnd *op_ holding the corresponding operand ++// ++// The ordering of operands can not be determined by looking at a ++// rule. Especially if a match rule matches several different trees, ++// several nodes are generated from one instruct specification with ++// different operand orderings. In this case the adlc generated ++// variables are the only way to access the ins and operands ++// deterministically. ++// ++// If assigning a register to a node that contains an oop, don't ++// forget to call ra_->set_oop() for the node. ++void PhaseCFG::postalloc_expand(PhaseRegAlloc* _ra) { ++ GrowableArray new_nodes(32); // Array with new nodes filled by postalloc_expand function of node. ++ GrowableArray remove(32); ++ GrowableArray succs(32); ++ unsigned int max_idx = C->unique(); // Remember to distinguish new from old nodes. ++ DEBUG_ONLY(bool foundNode = false); ++ ++ // for all blocks ++ for (uint i = 0; i < number_of_blocks(); i++) { ++ Block *b = _blocks[i]; ++ // For all instructions in the current block. ++ for (uint j = 0; j < b->number_of_nodes(); j++) { ++ Node *n = b->get_node(j); ++ if (n->is_Mach() && n->as_Mach()->requires_postalloc_expand()) { ++#ifdef ASSERT ++ if (TracePostallocExpand) { ++ if (!foundNode) { ++ foundNode = true; ++ tty->print("POSTALLOC EXPANDING %d %s\n", C->compile_id(), ++ C->method() ? C->method()->name()->as_utf8() : C->stub_name()); ++ } ++ tty->print(" postalloc expanding "); n->dump(); ++ if (Verbose) { ++ tty->print(" with ins:\n"); ++ for (uint k = 0; k < n->len(); ++k) { ++ if (n->in(k)) { tty->print(" "); n->in(k)->dump(); } ++ } ++ } ++ } ++#endif ++ new_nodes.clear(); ++ // Collect nodes that have to be removed from the block later on. ++ uint req = n->req(); ++ remove.clear(); ++ for (uint k = 0; k < req; ++k) { ++ if (n->in(k) && n->in(k)->is_MachTemp()) { ++ remove.push(n->in(k)); // MachTemps which are inputs to the old node have to be removed. ++ n->in(k)->del_req(0); ++ j--; ++ } ++ } ++ ++ // Check whether we can allocate enough nodes. We set a fix limit for ++ // the size of postalloc expands with this. ++ uint unique_limit = C->unique() + 40; ++ if (unique_limit >= _ra->node_regs_max_index()) { ++ Compile::current()->record_failure("out of nodes in postalloc expand"); ++ return; ++ } ++ ++ // Emit (i.e. generate new nodes). ++ n->as_Mach()->postalloc_expand(&new_nodes, _ra); ++ ++ assert(C->unique() < unique_limit, "You allocated too many nodes in your postalloc expand."); ++ ++ // Disconnect the inputs of the old node. ++ // ++ // We reuse MachSpillCopy nodes. If we need to expand them, there ++ // are many, so reusing pays off. If reused, the node already ++ // has the new ins. n must be the last node on new_nodes list. ++ if (!n->is_MachSpillCopy()) { ++ for (int k = req - 1; k >= 0; --k) { ++ n->del_req(k); ++ } ++ } ++ ++#ifdef ASSERT ++ // Check that all nodes have proper operands. ++ for (int k = 0; k < new_nodes.length(); ++k) { ++ if (new_nodes.at(k)->_idx < max_idx || !new_nodes.at(k)->is_Mach()) continue; // old node, Proj ... ++ MachNode *m = new_nodes.at(k)->as_Mach(); ++ for (unsigned int l = 0; l < m->num_opnds(); ++l) { ++ if (MachOper::notAnOper(m->_opnds[l])) { ++ outputStream *os = tty; ++ os->print("Node %s ", m->Name()); ++ os->print("has invalid opnd %d: %p\n", l, m->_opnds[l]); ++ assert(0, "Invalid operands, see inline trace in hs_err_pid file."); ++ } ++ } ++ } ++#endif ++ ++ // Collect succs of old node in remove (for projections) and in succs (for ++ // all other nodes) do _not_ collect projections in remove (but in succs) ++ // in case the node is a call. We need the projections for calls as they are ++ // associated with registes (i.e. they are defs). ++ succs.clear(); ++ for (DUIterator k = n->outs(); n->has_out(k); k++) { ++ if (n->out(k)->is_Proj() && !n->is_MachCall() && !n->is_MachBranch()) { ++ remove.push(n->out(k)); ++ } else { ++ succs.push(n->out(k)); ++ } ++ } ++ // Replace old node n as input of its succs by last of the new nodes. ++ for (int k = 0; k < succs.length(); ++k) { ++ Node *succ = succs.at(k); ++ for (uint l = 0; l < succ->req(); ++l) { ++ if (succ->in(l) == n) { ++ succ->set_req(l, new_nodes.at(new_nodes.length() - 1)); ++ } ++ } ++ for (uint l = succ->req(); l < succ->len(); ++l) { ++ if (succ->in(l) == n) { ++ succ->set_prec(l, new_nodes.at(new_nodes.length() - 1)); ++ } ++ } ++ } ++ ++ // Index of old node in block. ++ uint index = b->find_node(n); ++ // Insert new nodes into block and map them in nodes->blocks array ++ // and remember last node in n2. ++ Node *n2 = NULL; ++ for (int k = 0; k < new_nodes.length(); ++k) { ++ n2 = new_nodes.at(k); ++ b->insert_node(n2, ++index); ++ map_node_to_block(n2, b); ++ } ++ ++ // Add old node n to remove and remove them all from block. ++ remove.push(n); ++ j--; ++#ifdef ASSERT ++ if (TracePostallocExpand && Verbose) { ++ tty->print(" removing:\n"); ++ for (int k = 0; k < remove.length(); ++k) { ++ tty->print(" "); remove.at(k)->dump(); ++ } ++ tty->print(" inserting:\n"); ++ for (int k = 0; k < new_nodes.length(); ++k) { ++ tty->print(" "); new_nodes.at(k)->dump(); ++ } ++ } ++#endif ++ for (int k = 0; k < remove.length(); ++k) { ++ if (b->contains(remove.at(k))) { ++ b->find_remove(remove.at(k)); ++ } else { ++ assert(remove.at(k)->is_Proj() && (remove.at(k)->in(0)->is_MachBranch()), ""); ++ } ++ } ++ // If anything has been inserted (n2 != NULL), continue after last node inserted. ++ // This does not always work. Some postalloc expands don't insert any nodes, if they ++ // do optimizations (e.g., max(x,x)). In this case we decrement j accordingly. ++ j = n2 ? b->find_node(n2) : j; ++ } ++ } ++ } ++ ++#ifdef ASSERT ++ if (foundNode) { ++ tty->print("FINISHED %d %s\n", C->compile_id(), ++ C->method() ? C->method()->name()->as_utf8() : C->stub_name()); ++ tty->flush(); ++ } ++#endif ++} ++ ++ ++//------------------------------dump------------------------------------------- + #ifndef PRODUCT + void PhaseCFG::_dump_cfg( const Node *end, VectorSet &visited ) const { + const Node *x = end->is_block_proj(); +--- ./hotspot/src/share/vm/opto/block.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/block.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -313,10 +313,12 @@ + // Add an instruction to an existing block. It must go after the head + // instruction and before the end instruction. + void add_inst( Node *n ) { insert_node(n, end_idx()); } +- // Find node in block ++ // Find node in block. Fails if node not in block. + uint find_node( const Node *n ) const; + // Find and remove n from block list + void find_remove( const Node *n ); ++ // Check wether the node is in the block. ++ bool contains (const Node *n) const; + + // Return the empty status of a block + enum { not_empty, empty_with_goto, completely_empty }; +@@ -588,6 +590,7 @@ + + // Remove empty basic blocks + void remove_empty_blocks(); ++ Block *fixup_trap_based_check(Node *branch, Block *block, int block_pos, Block *bnext); + void fixup_flow(); + + // Insert a node into a block at index and map the node to the block +@@ -596,6 +599,9 @@ + map_node_to_block(n, b); + } + ++ // Check all nodes and postalloc_expand them if necessary. ++ void postalloc_expand(PhaseRegAlloc* _ra); ++ + #ifndef PRODUCT + bool trace_opto_pipelining() const { return _trace_opto_pipelining; } + +--- ./hotspot/src/share/vm/opto/bytecodeInfo.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/bytecodeInfo.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -50,7 +50,10 @@ + _subtrees(c->comp_arena(), 2, 0, NULL), + _msg(NULL) + { +- NOT_PRODUCT(_count_inlines = 0;) ++#ifndef PRODUCT ++ _count_inlines = 0; ++ _forced_inline = false; ++#endif + if (_caller_jvms != NULL) { + // Keep a private copy of the caller_jvms: + _caller_jvms = new (C) JVMState(caller_jvms->method(), caller_tree->caller_jvms()); +@@ -60,31 +63,14 @@ + assert(_caller_jvms->same_calls_as(caller_jvms), "consistent JVMS"); + assert((caller_tree == NULL ? 0 : caller_tree->stack_depth() + 1) == stack_depth(), "correct (redundant) depth parameter"); + assert(caller_bci == this->caller_bci(), "correct (redundant) bci parameter"); +- if (UseOldInlining) { +- // Update hierarchical counts, count_inline_bcs() and count_inlines() +- InlineTree *caller = (InlineTree *)caller_tree; +- for( ; caller != NULL; caller = ((InlineTree *)(caller->caller_tree())) ) { +- caller->_count_inline_bcs += count_inline_bcs(); +- NOT_PRODUCT(caller->_count_inlines++;) +- } ++ // Update hierarchical counts, count_inline_bcs() and count_inlines() ++ InlineTree *caller = (InlineTree *)caller_tree; ++ for( ; caller != NULL; caller = ((InlineTree *)(caller->caller_tree())) ) { ++ caller->_count_inline_bcs += count_inline_bcs(); ++ NOT_PRODUCT(caller->_count_inlines++;) + } + } + +-InlineTree::InlineTree(Compile* c, ciMethod* callee_method, JVMState* caller_jvms, +- float site_invoke_ratio, int max_inline_level) : +- C(c), +- _caller_jvms(caller_jvms), +- _caller_tree(NULL), +- _method(callee_method), +- _site_invoke_ratio(site_invoke_ratio), +- _max_inline_level(max_inline_level), +- _count_inline_bcs(method()->code_size()), +- _msg(NULL) +-{ +- NOT_PRODUCT(_count_inlines = 0;) +- assert(!UseOldInlining, "do not use for old stuff"); +-} +- + /** + * Return true when EA is ON and a java constructor is called or + * a super constructor is called from an inlined java constructor. +@@ -128,9 +114,19 @@ + tty->print_cr("Inlined method is hot: "); + } + set_msg("force inline by CompilerOracle"); ++ _forced_inline = true; + return true; + } + ++#ifndef PRODUCT ++ int inline_depth = inline_level()+1; ++ if (ciReplay::should_inline(C->replay_inline_data(), callee_method, caller_bci, inline_depth)) { ++ set_msg("force inline by ciReplay"); ++ _forced_inline = true; ++ return true; ++ } ++#endif ++ + int size = callee_method->code_size_for_inlining(); + + // Check for too many throws (and not too huge) +@@ -145,11 +141,6 @@ + return true; + } + +- if (!UseOldInlining) { +- set_msg("!UseOldInlining"); +- return true; // size and frequency are represented in a new way +- } +- + int default_max_inline_size = C->max_inline_size(); + int inline_small_code_size = InlineSmallCode / 4; + int max_inline_size = default_max_inline_size; +@@ -213,35 +204,6 @@ + fail_msg = "don't inline by annotation"; + } + +- if (!UseOldInlining) { +- if (fail_msg != NULL) { +- *wci_result = *(WarmCallInfo::always_cold()); +- set_msg(fail_msg); +- return true; +- } +- +- if (callee_method->has_unloaded_classes_in_signature()) { +- wci_result->set_profit(wci_result->profit() * 0.1); +- } +- +- // don't inline exception code unless the top method belongs to an +- // exception class +- if (callee_method->holder()->is_subclass_of(C->env()->Throwable_klass())) { +- ciMethod* top_method = jvms->caller() != NULL ? jvms->caller()->of_depth(1)->method() : method(); +- if (!top_method->holder()->is_subclass_of(C->env()->Throwable_klass())) { +- wci_result->set_profit(wci_result->profit() * 0.1); +- } +- } +- +- if (callee_method->has_compiled_code() && +- callee_method->instructions_size() > InlineSmallCode) { +- wci_result->set_profit(wci_result->profit() * 0.1); +- // %%% adjust wci_result->size()? +- } +- +- return false; +- } +- + // one more inlining restriction + if (fail_msg == NULL && callee_method->has_unloaded_classes_in_signature()) { + fail_msg = "unloaded signature classes"; +@@ -264,6 +226,18 @@ + } + + #ifndef PRODUCT ++ int caller_bci = jvms->bci(); ++ int inline_depth = inline_level()+1; ++ if (ciReplay::should_inline(C->replay_inline_data(), callee_method, caller_bci, inline_depth)) { ++ set_msg("force inline by ciReplay"); ++ return false; ++ } ++ ++ if (ciReplay::should_not_inline(C->replay_inline_data(), callee_method, caller_bci, inline_depth)) { ++ set_msg("disallowed by ciReplay"); ++ return true; ++ } ++ + if (ciReplay::should_not_inline(callee_method)) { + set_msg("disallowed by ciReplay"); + return true; +@@ -332,9 +306,7 @@ + int caller_bci, JVMState* jvms, ciCallProfile& profile, + WarmCallInfo* wci_result, bool& should_delay) { + +- // Old algorithm had funny accumulating BC-size counters +- if (UseOldInlining && ClipInlining +- && (int)count_inline_bcs() >= DesiredMethodLimit) { ++ if (ClipInlining && (int)count_inline_bcs() >= DesiredMethodLimit) { + if (!callee_method->force_inline() || !IncrementalInline) { + set_msg("size > DesiredMethodLimit"); + return false; +@@ -343,6 +315,7 @@ + } + } + ++ _forced_inline = false; // Reset + if (!should_inline(callee_method, caller_method, caller_bci, profile, + wci_result)) { + return false; +@@ -373,10 +346,10 @@ + + if ((!UseInterpreter || CompileTheWorld) && + is_init_with_ea(callee_method, caller_method, C)) { +- + // Escape Analysis stress testing when running Xcomp or CTW: + // inline constructors even if they are not reached. +- ++ } else if (forced_inline()) { ++ // Inlining was forced by CompilerOracle or ciReplay + } else if (profile.count() == 0) { + // don't inline unreached call sites + set_msg("call site not reached"); +@@ -388,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; +@@ -436,8 +412,7 @@ + + int size = callee_method->code_size_for_inlining(); + +- if (UseOldInlining && ClipInlining +- && (int)count_inline_bcs() + size >= DesiredMethodLimit) { ++ if (ClipInlining && (int)count_inline_bcs() + size >= DesiredMethodLimit) { + if (!callee_method->force_inline() || !IncrementalInline) { + set_msg("size > DesiredMethodLimit"); + return false; +@@ -555,8 +530,7 @@ + jvms, profile, &wci, should_delay); + + #ifndef PRODUCT +- if (UseOldInlining && InlineWarmCalls +- && (PrintOpto || C->print_inlining())) { ++ if (InlineWarmCalls && (PrintOpto || C->print_inlining())) { + bool cold = wci.is_cold(); + bool hot = !cold && wci.is_hot(); + bool old_cold = !success; +@@ -570,13 +544,12 @@ + } + } + #endif +- if (UseOldInlining) { +- if (success) { +- wci = *(WarmCallInfo::always_hot()); +- } else { +- wci = *(WarmCallInfo::always_cold()); +- } ++ if (success) { ++ wci = *(WarmCallInfo::always_hot()); ++ } else { ++ wci = *(WarmCallInfo::always_cold()); + } ++ + if (!InlineWarmCalls) { + if (!wci.is_cold() && !wci.is_hot()) { + // Do not inline the warm calls. +@@ -590,8 +563,7 @@ + set_msg("inline (hot)"); + } + print_inlining(callee_method, caller_bci, true /* success */); +- if (UseOldInlining) +- build_inline_tree_for_callee(callee_method, jvms, caller_bci); ++ build_inline_tree_for_callee(callee_method, jvms, caller_bci); + if (InlineWarmCalls && !wci.is_hot()) + return new (C) WarmCallInfo(wci); // copy to heap + return WarmCallInfo::always_hot(); +@@ -700,12 +672,28 @@ + return iltp; + } + ++// Count number of nodes in this subtree ++int InlineTree::count() const { ++ int result = 1; ++ for (int i = 0 ; i < _subtrees.length(); i++) { ++ result += _subtrees.at(i)->count(); ++ } ++ return result; ++} ++ ++void InlineTree::dump_replay_data(outputStream* out) { ++ out->print(" %d %d ", inline_level(), caller_bci()); ++ method()->dump_name_as_ascii(out); ++ for (int i = 0 ; i < _subtrees.length(); i++) { ++ _subtrees.at(i)->dump_replay_data(out); ++ } ++} + + + #ifndef PRODUCT + void InlineTree::print_impl(outputStream* st, int indent) const { + for (int i = 0; i < indent; i++) st->print(" "); +- st->print(" @ %d ", caller_bci()); ++ st->print(" @ %d", caller_bci()); + method()->print_short_name(st); + st->cr(); + +--- ./hotspot/src/share/vm/opto/c2_globals.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/c2_globals.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -35,6 +35,9 @@ + #ifdef TARGET_ARCH_arm + # include "c2_globals_arm.hpp" + #endif ++#ifdef TARGET_ARCH_ppc ++# include "c2_globals_ppc.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_linux + # include "c2_globals_linux.hpp" + #endif +@@ -44,6 +47,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "c2_globals_windows.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "c2_globals_aix.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "c2_globals_bsd.hpp" + #endif +@@ -223,7 +229,8 @@ + diagnostic(bool, UnrollLimitCheck, true, \ + "Additional overflow checks during loop unroll") \ + \ +- product(bool, OptimizeFill, true, \ ++ /* OptimizeFill not yet supported on PowerPC. */ \ ++ product(bool, OptimizeFill, true PPC64_ONLY(&& false), \ + "convert fill/copy loops into intrinsic") \ + \ + develop(bool, TraceOptimizeFill, false, \ +@@ -442,13 +449,16 @@ + diagnostic(bool, PrintPreciseBiasedLockingStatistics, false, \ + "Print per-lock-site statistics of biased locking in JVM") \ + \ ++ diagnostic(bool, PrintPreciseRTMLockingStatistics, false, \ ++ "Print per-lock-site statistics of rtm locking in JVM") \ ++ \ + notproduct(bool, PrintEliminateLocks, false, \ + "Print out when locks are eliminated") \ + \ +- product(bool, EliminateAutoBox, false, \ ++ product(bool, EliminateAutoBox, true, \ + "Control optimizations for autobox elimination") \ + \ +- experimental(bool, UseImplicitStableValues, false, \ ++ diagnostic(bool, UseImplicitStableValues, true, \ + "Mark well-known stable fields as such (e.g. String.value)") \ + \ + product(intx, AutoBoxCacheMax, 128, \ +@@ -457,6 +467,9 @@ + experimental(bool, AggressiveUnboxing, false, \ + "Control optimizations for aggressive boxing elimination") \ + \ ++ develop(bool, TracePostallocExpand, false, "Trace expanding nodes after" \ ++ " register allocation.") \ ++ \ + product(bool, DoEscapeAnalysis, true, \ + "Perform escape analysis") \ + \ +@@ -637,14 +650,22 @@ + diagnostic(bool, OptimizeExpensiveOps, true, \ + "Find best control for expensive operations") \ + \ +- experimental(bool, UseMathExactIntrinsics, false, \ ++ 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") \ + \ +- experimental(bool, UseTypeSpeculation, false, \ +- "Speculatively propagate types from profiles") ++ product(bool, UseTypeSpeculation, true, \ ++ "Speculatively propagate types from profiles") \ ++ \ ++ diagnostic(bool, UseInlineDepthForSpeculativeTypes, true, \ ++ "Carry inline depth of profile point with speculative type " \ ++ "and give priority to profiling from lower inline depth") \ ++ \ ++ product_pd(bool, TrapBasedRangeChecks, \ ++ "Generate code for range checks that uses a cmp and trap " \ ++ "instruction raising SIGTRAP. Used on PPC64.") \ + + C2_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_EXPERIMENTAL_FLAG, DECLARE_NOTPRODUCT_FLAG) + +--- ./hotspot/src/share/vm/opto/c2compiler.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/c2compiler.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -40,8 +40,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" + #endif + + // register information defined by ADLC +--- ./hotspot/src/share/vm/opto/callGenerator.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/callGenerator.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -201,7 +201,7 @@ + // Block::implicit_null_check() only looks for loads and stores, not calls. + ciMethod *caller = kit.method(); + ciMethodData *caller_md = (caller == NULL) ? NULL : caller->method_data(); +- if (!UseInlineCaches || !ImplicitNullChecks || ++ if (!UseInlineCaches || !ImplicitNullChecks || !os::zero_page_read_protected() || + ((ImplicitNullCheckThreshold > 0) && caller_md && + (caller_md->trap_count(Deoptimization::Reason_null_check) + >= (uint)ImplicitNullCheckThreshold))) { +@@ -381,7 +381,7 @@ + } + + // Setup default node notes to be picked up by the inlining +- Node_Notes* old_nn = C->default_node_notes(); ++ Node_Notes* old_nn = C->node_notes_at(call->_idx); + if (old_nn != NULL) { + Node_Notes* entry_nn = old_nn->clone(C); + entry_nn->set_jvms(jvms); +@@ -722,7 +722,7 @@ + Node* m = kit.map()->in(i); + Node* n = slow_map->in(i); + if (m != n) { +- const Type* t = gvn.type(m)->meet(gvn.type(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)); +@@ -837,8 +837,11 @@ + Node* receiver_node = kit.argument(0); + const TypeOopPtr* receiver_type = gvn.type(receiver_node)->isa_oopptr(); + // call_does_dispatch and vtable_index are out-parameters. They might be changed. +- target = C->optimize_virtual_call(caller, jvms->bci(), klass, target, receiver_type, +- is_virtual, ++ // optimize_virtual_call() takes 2 different holder ++ // arguments for a corner case that doesn't apply here (see ++ // Parse::do_call()) ++ target = C->optimize_virtual_call(caller, jvms->bci(), klass, klass, ++ target, receiver_type, is_virtual, + call_does_dispatch, vtable_index); // out-parameters + // We lack profiling at this call but type speculation may + // provide us with a type +@@ -975,7 +978,7 @@ + Node* m = kit.map()->in(i); + Node* n = slow_map->in(i); + if (m != n) { +- const Type* t = gvn.type(m)->meet(gvn.type(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)); +--- ./hotspot/src/share/vm/opto/callnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/callnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -111,7 +111,7 @@ + #ifndef PRODUCT + void ParmNode::dump_spec(outputStream *st) const { + if( _con < TypeFunc::Parms ) { +- st->print(names[_con]); ++ st->print("%s", names[_con]); + } else { + st->print("Parm%d: ",_con-TypeFunc::Parms); + // Verbose and WizardMode dump bottom_type for all nodes +@@ -342,24 +342,24 @@ + st->print(" %s%d]=#"INT32_FORMAT,msg,i,t->is_int()->get_con()); + break; + case Type::AnyPtr: +- assert( t == TypePtr::NULL_PTR, "" ); ++ assert( t == TypePtr::NULL_PTR || n->in_dump(), "" ); + st->print(" %s%d]=#NULL",msg,i); + break; + case Type::AryPtr: + case Type::InstPtr: +- st->print(" %s%d]=#Ptr" INTPTR_FORMAT,msg,i,t->isa_oopptr()->const_oop()); ++ st->print(" %s%d]=#Ptr" INTPTR_FORMAT,msg,i,p2i(t->isa_oopptr()->const_oop())); + break; + case Type::KlassPtr: +- st->print(" %s%d]=#Ptr" INTPTR_FORMAT,msg,i,t->make_ptr()->isa_klassptr()->klass()); ++ st->print(" %s%d]=#Ptr" INTPTR_FORMAT,msg,i,p2i(t->make_ptr()->isa_klassptr()->klass())); + break; + case Type::MetadataPtr: +- st->print(" %s%d]=#Ptr" INTPTR_FORMAT,msg,i,t->make_ptr()->isa_metadataptr()->metadata()); ++ st->print(" %s%d]=#Ptr" INTPTR_FORMAT,msg,i,p2i(t->make_ptr()->isa_metadataptr()->metadata())); + break; + case Type::NarrowOop: +- st->print(" %s%d]=#Ptr" INTPTR_FORMAT,msg,i,t->make_ptr()->isa_oopptr()->const_oop()); ++ st->print(" %s%d]=#Ptr" INTPTR_FORMAT,msg,i,p2i(t->make_ptr()->isa_oopptr()->const_oop())); + break; + case Type::RawPtr: +- st->print(" %s%d]=#Raw" INTPTR_FORMAT,msg,i,t->is_rawptr()); ++ st->print(" %s%d]=#Raw" INTPTR_FORMAT,msg,i,p2i(t->is_rawptr())); + break; + case Type::DoubleCon: + st->print(" %s%d]=#%fD",msg,i,t->is_double_constant()->_d); +@@ -368,7 +368,7 @@ + st->print(" %s%d]=#%fF",msg,i,t->is_float_constant()->_f); + break; + case Type::Long: +- st->print(" %s%d]=#"INT64_FORMAT,msg,i,t->is_long()->get_con()); ++ st->print(" %s%d]=#"INT64_FORMAT,msg,i,(int64_t)(t->is_long()->get_con())); + break; + case Type::Half: + case Type::Top: +@@ -427,7 +427,7 @@ + + for (i = 0; i < (uint)scobjs.length(); i++) { + // Scalar replaced objects. +- st->print_cr(""); ++ st->cr(); + st->print(" # ScObj" INT32_FORMAT " ", i); + SafePointScalarObjectNode* spobj = scobjs.at(i); + ciKlass* cik = spobj->bottom_type()->is_oopptr()->klass(); +@@ -484,7 +484,7 @@ + st->print(" }"); + } + } +- st->print_cr(""); ++ st->cr(); + if (caller() != NULL) caller()->format(regalloc, n, st); + } + +@@ -595,6 +595,51 @@ + } + } + ++// Adapt offsets in in-array after adding or removing an edge. ++// Prerequisite is that the JVMState is used by only one node. ++void JVMState::adapt_position(int delta) { ++ for (JVMState* jvms = this; jvms != NULL; jvms = jvms->caller()) { ++ jvms->set_locoff(jvms->locoff() + delta); ++ jvms->set_stkoff(jvms->stkoff() + delta); ++ jvms->set_monoff(jvms->monoff() + delta); ++ jvms->set_scloff(jvms->scloff() + delta); ++ jvms->set_endoff(jvms->endoff() + delta); ++ } ++} ++ ++// Mirror the stack size calculation in the deopt code ++// How much stack space would we need at this point in the program in ++// case of deoptimization? ++int JVMState::interpreter_frame_size() const { ++ const JVMState* jvms = this; ++ int size = 0; ++ int callee_parameters = 0; ++ int callee_locals = 0; ++ int extra_args = method()->max_stack() - stk_size(); ++ ++ while (jvms != NULL) { ++ int locks = jvms->nof_monitors(); ++ int temps = jvms->stk_size(); ++ bool is_top_frame = (jvms == this); ++ ciMethod* method = jvms->method(); ++ ++ int frame_size = BytesPerWord * Interpreter::size_activation(method->max_stack(), ++ temps + callee_parameters, ++ extra_args, ++ locks, ++ callee_parameters, ++ callee_locals, ++ is_top_frame); ++ size += frame_size; ++ ++ callee_parameters = method->size_of_parameters(); ++ callee_locals = method->max_locals(); ++ extra_args = 0; ++ jvms = jvms->caller(); ++ } ++ return size + Deoptimization::last_frame_adjust(0, callee_locals) * BytesPerWord; ++} ++ + //============================================================================= + uint CallNode::cmp( const Node &n ) const + { return _tf == ((CallNode&)n)._tf && _jvms == ((CallNode&)n)._jvms; } +@@ -887,7 +932,7 @@ + if (!(call->req() > TypeFunc::Parms && + call->in(TypeFunc::Parms) != NULL && + call->in(TypeFunc::Parms)->is_Con())) { +- assert(_in_dump_cnt != 0, "OK if dumping"); ++ assert(in_dump() != 0, "OK if dumping"); + tty->print("[bad uncommon trap]"); + return 0; + } +@@ -935,7 +980,7 @@ + #ifndef PRODUCT + void CallRuntimeNode::dump_spec(outputStream *st) const { + st->print("# "); +- st->print(_name); ++ st->print("%s", _name); + CallNode::dump_spec(st); + } + #endif +@@ -953,7 +998,7 @@ + #ifndef PRODUCT + void CallLeafNode::dump_spec(outputStream *st) const { + st->print("# "); +- st->print(_name); ++ st->print("%s", _name); + CallNode::dump_spec(st); + } + #endif +--- ./hotspot/src/share/vm/opto/callnode.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/callnode.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -299,6 +299,8 @@ + JVMState* clone_deep(Compile* C) const; // recursively clones caller chain + JVMState* clone_shallow(Compile* C) const; // retains uncloned caller + void set_map_deep(SafePointNode *map);// reset map for all callers ++ void adapt_position(int delta); // Adapt offsets in in-array after adding an edge. ++ int interpreter_frame_size() const; + + #ifndef PRODUCT + void format(PhaseRegAlloc *regalloc, const Node *n, outputStream* st) const; +@@ -559,9 +561,15 @@ + // Are we guaranteed that this node is a safepoint? Not true for leaf calls and + // for some macro nodes whose expansion does not have a safepoint on the fast path. + virtual bool guaranteed_safepoint() { return true; } +- // For macro nodes, the JVMState gets modified during expansion, so when cloning +- // the node the JVMState must be cloned. +- virtual void clone_jvms(Compile* C) { } // default is not to clone ++ // For macro nodes, the JVMState gets modified during expansion. If calls ++ // use MachConstantBase, it gets modified during matching. So when cloning ++ // the node the JVMState must be cloned. Default is not to clone. ++ virtual void clone_jvms(Compile* C) { ++ if (C->needs_clone_jvms() && jvms() != NULL) { ++ set_jvms(jvms()->clone_deep(C)); ++ jvms()->set_map_deep(this); ++ } ++ } + + // Returns true if the call may modify n + virtual bool may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase); +--- ./hotspot/src/share/vm/opto/cfgnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/cfgnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -951,7 +951,7 @@ + if (is_intf != ti_is_intf) + { t = _type; break; } + } +- t = t->meet(ti); ++ t = t->meet_speculative(ti); + } + } + +@@ -968,11 +968,11 @@ + // + // It is not possible to see Type::BOTTOM values as phi inputs, + // because the ciTypeFlow pre-pass produces verifier-quality types. +- const Type* ft = t->filter(_type); // Worst case type ++ const Type* ft = t->filter_speculative(_type); // Worst case type + + #ifdef ASSERT + // The following logic has been moved into TypeOopPtr::filter. +- const Type* jt = t->join(_type); ++ const Type* jt = t->join_speculative(_type); + if( jt->empty() ) { // Emptied out??? + + // Check for evil case of 't' being a class and '_type' expecting an +@@ -1018,7 +1018,7 @@ + !jtkp->klass_is_exact() && // Keep exact interface klass (6894807) + ttkp->is_loaded() && !ttkp->klass()->is_interface() ) { + assert(ft == ttkp->cast_to_ptr_type(jtkp->ptr()) || +- ft->isa_narrowoop() && ft->make_ptr() == ttkp->cast_to_ptr_type(jtkp->ptr()), ""); ++ ft->isa_narrowklass() && ft->make_ptr() == ttkp->cast_to_ptr_type(jtkp->ptr()), ""); + jt = ft; + } + } +@@ -1757,7 +1757,7 @@ + break; + } + // Accumulate type for resulting Phi +- type = type->meet(in(i)->in(AddPNode::Base)->bottom_type()); ++ type = type->meet_speculative(in(i)->in(AddPNode::Base)->bottom_type()); + } + Node* base = NULL; + if (doit) { +--- ./hotspot/src/share/vm/opto/chaitin.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/chaitin.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -761,7 +761,7 @@ + // processes as vector in RA. + if (RegMask::is_vector(ireg)) + lrg._is_vector = 1; +- assert(n_type->isa_vect() == NULL || lrg._is_vector || ireg == Op_RegD, ++ assert(n_type->isa_vect() == NULL || lrg._is_vector || ireg == Op_RegD || ireg == Op_RegL, + "vector must be in vector registers"); + + // Check for bound register masks +@@ -961,7 +961,7 @@ + int kreg = n->in(k)->ideal_reg(); + bool is_vect = RegMask::is_vector(kreg); + assert(n->in(k)->bottom_type()->isa_vect() == NULL || +- is_vect || kreg == Op_RegD, ++ is_vect || kreg == Op_RegD || kreg == Op_RegL, + "vector must be in vector registers"); + if (lrgmask.is_bound(kreg)) + lrg._is_bound = 1; +@@ -1682,9 +1682,21 @@ + // (where top() node is placed). + base->init_req(0, _cfg.get_root_node()); + Block *startb = _cfg.get_block_for_node(C->top()); +- startb->insert_node(base, startb->find_node(C->top())); ++ uint node_pos = startb->find_node(C->top()); ++ startb->insert_node(base, node_pos); + _cfg.map_node_to_block(base, startb); + assert(_lrg_map.live_range_id(base) == 0, "should not have LRG yet"); ++ ++ // The loadConP0 might have projection nodes depending on architecture ++ // Add the projection nodes to the CFG ++ for (DUIterator_Fast imax, i = base->fast_outs(imax); i < imax; i++) { ++ Node* use = base->fast_out(i); ++ if (use->is_MachProj()) { ++ startb->insert_node(use, ++node_pos); ++ _cfg.map_node_to_block(use, startb); ++ new_lrg(use, maxlrg++); ++ } ++ } + } + if (_lrg_map.live_range_id(base) == 0) { + new_lrg(base, maxlrg++); +@@ -2007,25 +2019,25 @@ + tty->print_cr("new LRG"); + } + } +- tty->print_cr(""); ++ tty->cr(); + + // Dump lo-degree list + tty->print("Lo degree: "); + for(uint i3 = _lo_degree; i3; i3 = lrgs(i3)._next ) + tty->print("L%d ",i3); +- tty->print_cr(""); ++ tty->cr(); + + // Dump lo-stk-degree list + tty->print("Lo stk degree: "); + for(uint i4 = _lo_stk_degree; i4; i4 = lrgs(i4)._next ) + tty->print("L%d ",i4); +- tty->print_cr(""); ++ tty->cr(); + + // Dump lo-degree list + tty->print("Hi degree: "); + for(uint i5 = _hi_degree; i5; i5 = lrgs(i5)._next ) + tty->print("L%d ",i5); +- tty->print_cr(""); ++ tty->cr(); + } + + void PhaseChaitin::dump_degree_lists() const { +@@ -2033,26 +2045,26 @@ + tty->print("Lo degree: "); + for( uint i = _lo_degree; i; i = lrgs(i)._next ) + tty->print("L%d ",i); +- tty->print_cr(""); ++ tty->cr(); + + // Dump lo-stk-degree list + tty->print("Lo stk degree: "); + for(uint i2 = _lo_stk_degree; i2; i2 = lrgs(i2)._next ) + tty->print("L%d ",i2); +- tty->print_cr(""); ++ tty->cr(); + + // Dump lo-degree list + tty->print("Hi degree: "); + for(uint i3 = _hi_degree; i3; i3 = lrgs(i3)._next ) + tty->print("L%d ",i3); +- tty->print_cr(""); ++ tty->cr(); + } + + void PhaseChaitin::dump_simplified() const { + tty->print("Simplified: "); + for( uint i = _simplified; i; i = lrgs(i)._next ) + tty->print("L%d ",i); +- tty->print_cr(""); ++ tty->cr(); + } + + static char *print_reg( OptoReg::Name reg, const PhaseChaitin *pc, char *buf ) { +@@ -2131,7 +2143,7 @@ + } + tty->print(" : parm %d: ", k); + domain->field_at(k + TypeFunc::Parms)->dump(); +- tty->print_cr(""); ++ tty->cr(); + } + } + +@@ -2153,7 +2165,7 @@ + _matcher._parm_regs[j].second() == reg ) { + tty->print("parm %d: ",j); + domain->field_at(j + TypeFunc::Parms)->dump(); +- tty->print_cr(""); ++ tty->cr(); + break; + } + } +--- ./hotspot/src/share/vm/opto/classes.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/classes.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -29,8 +29,6 @@ + macro(AbsF) + macro(AbsI) + macro(AddD) +-macro(AddExactI) +-macro(AddExactL) + macro(AddF) + macro(AddI) + macro(AddL) +@@ -135,7 +133,6 @@ + macro(ExpD) + macro(FastLock) + macro(FastUnlock) +-macro(FlagsProj) + macro(Goto) + macro(Halt) + macro(If) +@@ -170,14 +167,13 @@ + macro(LoopLimit) + macro(Mach) + macro(MachProj) +-macro(MathExact) +-macro(MathExactI) +-macro(MathExactL) + macro(MaxI) + macro(MemBarAcquire) ++macro(LoadFence) + macro(MemBarAcquireLock) + macro(MemBarCPUOrder) + macro(MemBarRelease) ++macro(StoreFence) + macro(MemBarReleaseLock) + macro(MemBarVolatile) + macro(MemBarStoreStore) +@@ -192,22 +188,25 @@ + macro(MoveL2D) + macro(MoveD2L) + macro(MulD) +-macro(MulExactI) +-macro(MulExactL) + macro(MulF) + macro(MulHiL) + macro(MulI) + macro(MulL) + macro(Multi) + macro(NegD) +-macro(NegExactI) +-macro(NegExactL) + macro(NegF) + macro(NeverBranch) + macro(Opaque1) + macro(Opaque2) ++macro(Opaque3) + macro(OrI) + macro(OrL) ++macro(OverflowAddI) ++macro(OverflowSubI) ++macro(OverflowMulI) ++macro(OverflowAddL) ++macro(OverflowSubL) ++macro(OverflowMulL) + macro(PCTable) + macro(Parm) + macro(PartialSubtypeCheck) +@@ -251,8 +250,6 @@ + macro(StrEquals) + macro(StrIndexOf) + macro(SubD) +-macro(SubExactI) +-macro(SubExactL) + macro(SubF) + macro(SubI) + macro(SubL) +--- ./hotspot/src/share/vm/opto/compile.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/compile.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -25,6 +25,7 @@ + #include "precompiled.hpp" + #include "asm/macroAssembler.hpp" + #include "asm/macroAssembler.inline.hpp" ++#include "ci/ciReplay.hpp" + #include "classfile/systemDictionary.hpp" + #include "code/exceptionHandlerTable.hpp" + #include "code/nmethod.hpp" +@@ -81,8 +82,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" + #endif + + +@@ -435,6 +439,14 @@ + return words; + } + ++// To bang the stack of this compiled method we use the stack size ++// that the interpreter would need in case of a deoptimization. This ++// removes the need to bang the stack in the deoptimization blob which ++// in turn simplifies stack overflow handling. ++int Compile::bang_size_in_bytes() const { ++ return MAX2(_interpreter_frame_size, frame_size_in_bytes()); ++} ++ + // ============================================================================ + //------------------------------CompileWrapper--------------------------------- + class CompileWrapper : public StackObj { +@@ -644,9 +656,11 @@ + _dead_node_count(0), + #ifndef PRODUCT + _trace_opto_output(TraceOptoOutput || method()->has_option("TraceOptoOutput")), ++ _in_dump_cnt(0), + _printer(IdealGraphPrinter::printer()), + #endif + _congraph(NULL), ++ _replay_inline_data(NULL), + _late_inlines(comp_arena(), 2, 0, NULL), + _string_late_inlines(comp_arena(), 2, 0, NULL), + _boxing_late_inlines(comp_arena(), 2, 0, NULL), +@@ -656,7 +670,8 @@ + _inlining_incrementally(false), + _print_inlining_list(NULL), + _print_inlining_idx(0), +- _preserve_jvm_state(0) { ++ _preserve_jvm_state(0), ++ _interpreter_frame_size(0) { + C = this; + + CompileWrapper cw(this); +@@ -680,13 +695,19 @@ + } + set_print_assembly(print_opto_assembly); + set_parsed_irreducible_loop(false); ++ ++ if (method()->has_option("ReplayInline")) { ++ _replay_inline_data = ciReplay::load_inline_data(method(), entry_bci(), ci_env->comp_level()); ++ } + #endif + set_print_inlining(PrintInlining || method()->has_option("PrintInlining") NOT_PRODUCT( || PrintOptoInlining)); + set_print_intrinsics(PrintIntrinsics || method()->has_option("PrintIntrinsics")); +- +- if (ProfileTraps) { ++ set_has_irreducible_loop(true); // conservative until build_loop_tree() reset it ++ ++ if (ProfileTraps RTM_OPT_ONLY( || UseRTMLocking )) { + // Make sure the method being compiled gets its own MDO, + // so we can at least track the decompile_count(). ++ // Need MDO to record RTM code generation state. + method()->ensure_method_data(); + } + +@@ -695,10 +716,7 @@ + + print_compile_messages(); + +- if (UseOldInlining || PrintCompilation NOT_PRODUCT( || PrintOpto) ) +- _ilt = InlineTree::build_inline_tree_root(); +- else +- _ilt = NULL; ++ _ilt = InlineTree::build_inline_tree_root(); + + // Even if NO memory addresses are used, MergeMem nodes must have at least 1 slice + assert(num_alias_types() >= AliasIdxRaw, ""); +@@ -849,6 +867,15 @@ + #endif + + NOT_PRODUCT( verify_barriers(); ) ++ ++ // Dump compilation data to replay it. ++ if (method()->has_option("DumpReplay")) { ++ env()->dump_replay_data(_compile_id); ++ } ++ if (method()->has_option("DumpInline") && (ilt() != NULL)) { ++ env()->dump_inline_data(_compile_id); ++ } ++ + // Now that we know the size of all the monitors we can add a fixed slot + // for the original deopt pc. + +@@ -856,6 +883,10 @@ + int next_slot = _orig_pc_slot + (sizeof(address) / VMRegImpl::stack_slot_size); + set_fixed_slots(next_slot); + ++ // Compute when to use implicit null checks. Used by matching trap based ++ // nodes and NullCheck optimization. ++ set_allowed_deopt_reasons(); ++ + // Now generate code + Code_Gen(); + if (failing()) return; +@@ -887,7 +918,8 @@ + compiler, + env()->comp_level(), + has_unsafe_access(), +- SharedRuntime::is_wide_vector(max_vector_size()) ++ SharedRuntime::is_wide_vector(max_vector_size()), ++ rtm_state() + ); + + if (log() != NULL) // Print code cache state into compiler log +@@ -933,17 +965,21 @@ + _inner_loops(0), + #ifndef PRODUCT + _trace_opto_output(TraceOptoOutput), ++ _in_dump_cnt(0), + _printer(NULL), + #endif + _dead_node_list(comp_arena()), + _dead_node_count(0), + _congraph(NULL), ++ _replay_inline_data(NULL), + _number_of_mh_late_inlines(0), + _inlining_progress(false), + _inlining_incrementally(false), + _print_inlining_list(NULL), + _print_inlining_idx(0), +- _preserve_jvm_state(0) { ++ _preserve_jvm_state(0), ++ _allowed_reasons(0), ++ _interpreter_frame_size(0) { + C = this; + + #ifndef PRODUCT +@@ -952,6 +988,8 @@ + set_print_assembly(PrintFrameConverterAssembly); + set_parsed_irreducible_loop(false); + #endif ++ set_has_irreducible_loop(false); // no loops ++ + CompileWrapper cw(this); + Init(/*AliasLevel=*/ 0); + init_tf((*generator)()); +@@ -1050,7 +1088,23 @@ + set_do_scheduling(OptoScheduling); + set_do_count_invocations(false); + set_do_method_data_update(false); +- ++ set_rtm_state(NoRTM); // No RTM lock eliding by default ++#if INCLUDE_RTM_OPT ++ if (UseRTMLocking && has_method() && (method()->method_data_or_null() != NULL)) { ++ int rtm_state = method()->method_data()->rtm_state(); ++ if (method_has_option("NoRTMLockEliding") || ((rtm_state & NoRTM) != 0)) { ++ // Don't generate RTM lock eliding code. ++ set_rtm_state(NoRTM); ++ } else if (method_has_option("UseRTMLockEliding") || ((rtm_state & UseRTM) != 0) || !UseRTMDeopt) { ++ // Generate RTM lock eliding code without abort ratio calculation code. ++ set_rtm_state(UseRTM); ++ } else if (UseRTMDeopt) { ++ // Generate RTM lock eliding code and include abort ratio calculation ++ // code if UseRTMDeopt is on. ++ set_rtm_state(ProfileRTM); ++ } ++ } ++#endif + if (debug_info()->recording_non_safepoints()) { + set_node_note_array(new(comp_arena()) GrowableArray + (comp_arena(), 8, 0, NULL)); +@@ -1106,7 +1160,7 @@ + if( start->is_Start() ) + return start->as_Start(); + } +- ShouldNotReachHere(); ++ fatal("Did not find Start node!"); + return NULL; + } + +@@ -2248,6 +2302,12 @@ + peep.do_transform(); + } + ++ // Do late expand if CPU requires this. ++ if (Matcher::require_postalloc_expand) { ++ NOT_PRODUCT(TracePhase t2c("postalloc_expand", &_t_postalloc_expand, true)); ++ cfg.postalloc_expand(_regalloc); ++ } ++ + // Convert Nodes to instruction bits in a buffer + { + // %%%% workspace merge brought two timers together for one job +@@ -2361,7 +2421,7 @@ + starts_bundle = ' '; + tty->print("\t"); + delay->format(_regalloc, tty); +- tty->print_cr(""); ++ tty->cr(); + delay = NULL; + } + +@@ -2375,12 +2435,12 @@ + if (pcs && n->_idx < pc_limit) + tty->print_cr("%3.3x", pcs[n->_idx]); + else +- tty->print_cr(""); ++ tty->cr(); + + assert(cut_short || delay == NULL, "no unconditional delay branch"); + + } // End of per-block dump +- tty->print_cr(""); ++ tty->cr(); + + if (cut_short) tty->print_cr("*** disassembly is cut short ***"); + } +@@ -2552,6 +2612,7 @@ + break; + case Op_Opaque1: // Remove Opaque Nodes before matching + case Op_Opaque2: // Remove Opaque Nodes before matching ++ case Op_Opaque3: + n->subsume_by(n->in(1), this); + break; + case Op_CallStaticJava: +@@ -2999,42 +3060,6 @@ + n->set_req(MemBarNode::Precedent, top()); + } + break; +- // Must set a control edge on all nodes that produce a FlagsProj +- // so they can't escape the block that consumes the flags. +- // Must also set the non throwing branch as the control +- // for all nodes that depends on the result. Unless the node +- // already have a control that isn't the control of the +- // flag producer +- case Op_FlagsProj: +- { +- MathExactNode* math = (MathExactNode*) n->in(0); +- Node* ctrl = math->control_node(); +- Node* non_throwing = math->non_throwing_branch(); +- math->set_req(0, ctrl); +- +- Node* result = math->result_node(); +- if (result != NULL) { +- for (DUIterator_Fast jmax, j = result->fast_outs(jmax); j < jmax; j++) { +- Node* out = result->fast_out(j); +- // Phi nodes shouldn't be moved. They would only match below if they +- // had the same control as the MathExactNode. The only time that +- // would happen is if the Phi is also an input to the MathExact +- // +- // Cmp nodes shouldn't have control set at all. +- if (out->is_Phi() || +- out->is_Cmp()) { +- continue; +- } +- +- if (out->in(0) == NULL) { +- out->set_req(0, non_throwing); +- } else if (out->in(0) == ctrl) { +- out->set_req(0, non_throwing); +- } +- } +- } +- } +- break; + default: + assert( !n->is_Call(), "" ); + assert( !n->is_Mem(), "" ); +@@ -3063,8 +3088,12 @@ + Node* m = n->in(i); + ++i; + if (m != NULL && !frc._visited.test_set(m->_idx)) { +- if (m->is_SafePoint() && m->as_SafePoint()->jvms() != NULL) ++ if (m->is_SafePoint() && m->as_SafePoint()->jvms() != NULL) { ++ // compute worst case interpreter size in case of a deoptimization ++ update_interpreter_frame_size(m->as_SafePoint()->jvms()->interpreter_frame_size()); ++ + sfpt.push(m); ++ } + cnt = m->req(); + nstack.push(n, i); // put on stack parent and next input's index + n = m; +@@ -3256,7 +3285,8 @@ + // because of a transient condition during start-up in the interpreter. + return false; + } +- if (md->has_trap_at(bci, reason) != 0) { ++ ciMethod* m = Deoptimization::reason_is_speculate(reason) ? this->method() : NULL; ++ if (md->has_trap_at(bci, m, reason) != 0) { + // Assume PerBytecodeTrapLimit==0, for a more conservative heuristic. + // Also, if there are multiple reasons, or if there is no per-BCI record, + // assume the worst. +@@ -3274,7 +3304,7 @@ + // Less-accurate variant which does not require a method and bci. + bool Compile::too_many_traps(Deoptimization::DeoptReason reason, + ciMethodData* logmd) { +- if (trap_count(reason) >= (uint)PerMethodTrapLimit) { ++ if (trap_count(reason) >= Deoptimization::per_method_trap_limit(reason)) { + // Too many traps globally. + // Note that we use cumulative trap_count, not just md->trap_count. + if (log()) { +@@ -3309,10 +3339,11 @@ + uint m_cutoff = (uint) PerMethodRecompilationCutoff / 2 + 1; // not zero + Deoptimization::DeoptReason per_bc_reason + = Deoptimization::reason_recorded_per_bytecode_if_any(reason); ++ ciMethod* m = Deoptimization::reason_is_speculate(reason) ? this->method() : NULL; + if ((per_bc_reason == Deoptimization::Reason_none +- || md->has_trap_at(bci, reason) != 0) ++ || md->has_trap_at(bci, m, reason) != 0) + // The trap frequency measure we care about is the recompile count: +- && md->trap_recompiled_at(bci) ++ && md->trap_recompiled_at(bci, m) + && md->overflow_recompile_count() >= bc_cutoff) { + // Do not emit a trap here if it has already caused recompilations. + // Also, if there are multiple reasons, or if there is no per-BCI record, +@@ -3339,6 +3370,19 @@ + } + } + ++// Compute when not to trap. Used by matching trap based nodes and ++// NullCheck optimization. ++void Compile::set_allowed_deopt_reasons() { ++ _allowed_reasons = 0; ++ if (is_method_compilation()) { ++ for (int rs = (int)Deoptimization::Reason_none+1; rs < Compile::trapHistLength; rs++) { ++ assert(rs < BitsPerInt, "recode bit map"); ++ if (!too_many_traps((Deoptimization::DeoptReason) rs)) { ++ _allowed_reasons |= nth_bit(rs); ++ } ++ } ++ } ++} + + #ifndef PRODUCT + //------------------------------verify_graph_edges--------------------------- +@@ -3641,7 +3685,8 @@ + default: ShouldNotReachHere(); + } + assert(constant_addr, "consts section too small"); +- assert((constant_addr - _masm.code()->consts()->start()) == con.offset(), err_msg_res("must be: %d == %d", constant_addr - _masm.code()->consts()->start(), con.offset())); ++ assert((constant_addr - _masm.code()->consts()->start()) == con.offset(), ++ err_msg_res("must be: %d == %d", (int) (constant_addr - _masm.code()->consts()->start()), (int)(con.offset()))); + } + } + +@@ -3721,7 +3766,7 @@ + + for (uint i = 0; i < n->outcnt(); i++) { + address* constant_addr = &jump_table_base[i]; +- assert(*constant_addr == (((address) n) + i), err_msg_res("all jump-table entries must contain adjusted node pointer: " INTPTR_FORMAT " == " INTPTR_FORMAT, *constant_addr, (((address) n) + i))); ++ assert(*constant_addr == (((address) n) + i), err_msg_res("all jump-table entries must contain adjusted node pointer: " INTPTR_FORMAT " == " INTPTR_FORMAT, p2i(*constant_addr), p2i(((address) n) + i))); + *constant_addr = cb.consts()->target(*labels.at(i), (address) constant_addr); + cb.consts()->relocate((address) constant_addr, relocInfo::internal_word_type); + } +@@ -3752,11 +3797,21 @@ + } + } + for (int i = 0; i < _print_inlining_list->length(); i++) { +- tty->print(_print_inlining_list->adr_at(i)->ss()->as_string()); ++ tty->print("%s", _print_inlining_list->adr_at(i)->ss()->as_string()); + } + } + } + ++// Dump inlining replay data to the stream. ++// Don't change thread state and acquire any locks. ++void Compile::dump_inline_data(outputStream* out) { ++ InlineTree* inl_tree = ilt(); ++ if (inl_tree != NULL) { ++ out->print(" inline %d", inl_tree->count()); ++ inl_tree->dump_replay_data(out); ++ } ++} ++ + int Compile::cmp_expensive_nodes(Node* n1, Node* n2) { + if (n1->Opcode() < n2->Opcode()) return -1; + else if (n1->Opcode() > n2->Opcode()) return 1; +@@ -3893,16 +3948,18 @@ + // which may optimize it out. + for (uint next = 0; next < worklist.size(); ++next) { + Node *n = worklist.at(next); +- if (n->is_Type() && n->as_Type()->type()->isa_oopptr() != NULL && +- n->as_Type()->type()->is_oopptr()->speculative() != NULL) { ++ if (n->is_Type()) { + TypeNode* tn = n->as_Type(); +- const TypeOopPtr* t = tn->type()->is_oopptr(); +- bool in_hash = igvn.hash_delete(n); +- assert(in_hash, "node should be in igvn hash table"); +- tn->set_type(t->remove_speculative()); +- igvn.hash_insert(n); +- igvn._worklist.push(n); // give it a chance to go away +- modified++; ++ const Type* t = tn->type(); ++ const Type* t_no_spec = t->remove_speculative(); ++ if (t_no_spec != t) { ++ bool in_hash = igvn.hash_delete(n); ++ assert(in_hash, "node should be in igvn hash table"); ++ tn->set_type(t_no_spec); ++ igvn.hash_insert(n); ++ igvn._worklist.push(n); // give it a chance to go away ++ modified++; ++ } + } + uint max = n->len(); + for( uint i = 0; i < max; ++i ) { +@@ -3916,6 +3973,27 @@ + if (modified > 0) { + igvn.optimize(); + } ++#ifdef ASSERT ++ // Verify that after the IGVN is over no speculative type has resurfaced ++ worklist.clear(); ++ worklist.push(root()); ++ for (uint next = 0; next < worklist.size(); ++next) { ++ Node *n = worklist.at(next); ++ const Type* t = igvn.type_or_null(n); ++ assert((t == NULL) || (t == t->remove_speculative()), "no more speculative types"); ++ if (n->is_Type()) { ++ t = n->as_Type()->type(); ++ assert(t == t->remove_speculative(), "no more speculative types"); ++ } ++ uint max = n->len(); ++ for( uint i = 0; i < max; ++i ) { ++ Node *m = n->in(i); ++ if (not_a_node(m)) continue; ++ worklist.push(m); ++ } ++ } ++ igvn.check_no_speculative_types(); ++#endif + } + } + +--- ./hotspot/src/share/vm/opto/compile.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/compile.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -319,9 +319,10 @@ + bool _trace_opto_output; + bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing + #endif +- ++ bool _has_irreducible_loop; // Found irreducible loops + // JSR 292 + bool _has_method_handle_invokes; // True if this method has MethodHandle invokes. ++ RTMState _rtm_state; // State of Restricted Transactional Memory usage + + // Compilation environment. + Arena _comp_arena; // Arena with lifetime equivalent to Compile +@@ -431,6 +432,8 @@ + // Are we within a PreserveJVMState block? + int _preserve_jvm_state; + ++ void* _replay_inline_data; // Pointer to data loaded from file ++ + public: + + outputStream* print_inlining_stream() const { +@@ -462,9 +465,14 @@ + void print_inlining(ciMethod* method, int inline_level, int bci, const char* msg = NULL) { + stringStream ss; + CompileTask::print_inlining(&ss, method, inline_level, bci, msg); +- print_inlining_stream()->print(ss.as_string()); ++ print_inlining_stream()->print("%s", ss.as_string()); + } + ++ void* replay_inline_data() const { return _replay_inline_data; } ++ ++ // Dump inlining replay data to the stream. ++ void dump_inline_data(outputStream* out); ++ + private: + // Matching, CFG layout, allocation, code generation + PhaseCFG* _cfg; // Results of CFG finding +@@ -479,6 +487,7 @@ + RegMask _FIRST_STACK_mask; // All stack slots usable for spills (depends on frame layout) + Arena* _indexSet_arena; // control IndexSet allocation within PhaseChaitin + void* _indexSet_free_block_list; // free list of IndexSet bit blocks ++ int _interpreter_frame_size; + + uint _node_bundling_limit; + Bundle* _node_bundling_base; // Information for instruction bundling +@@ -584,6 +593,10 @@ + void set_print_inlining(bool z) { _print_inlining = z; } + bool print_intrinsics() const { return _print_intrinsics; } + void set_print_intrinsics(bool z) { _print_intrinsics = z; } ++ RTMState rtm_state() const { return _rtm_state; } ++ void set_rtm_state(RTMState s) { _rtm_state = s; } ++ bool use_rtm() const { return (_rtm_state & NoRTM) == 0; } ++ bool profile_rtm() const { return _rtm_state == ProfileRTM; } + // check the CompilerOracle for special behaviours for this compile + bool method_has_option(const char * option) { + return method() != NULL && method()->has_option(option); +@@ -592,7 +605,10 @@ + bool trace_opto_output() const { return _trace_opto_output; } + bool parsed_irreducible_loop() const { return _parsed_irreducible_loop; } + void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; } ++ int _in_dump_cnt; // Required for dumping ir nodes. + #endif ++ bool has_irreducible_loop() const { return _has_irreducible_loop; } ++ void set_has_irreducible_loop(bool z) { _has_irreducible_loop = z; } + + // JSR 292 + bool has_method_handle_invokes() const { return _has_method_handle_invokes; } +@@ -757,6 +773,8 @@ + + MachConstantBaseNode* mach_constant_base_node(); + bool has_mach_constant_base_node() const { return _mach_constant_base_node != NULL; } ++ // Generated by adlc, true if CallNode requires MachConstantBase. ++ bool needs_clone_jvms(); + + // Handy undefined Node + Node* top() const { return _top; } +@@ -836,8 +854,8 @@ + + // Helper functions to identify inlining potential at call-site + ciMethod* optimize_virtual_call(ciMethod* caller, int bci, ciInstanceKlass* klass, +- ciMethod* callee, const TypeOopPtr* receiver_type, +- bool is_virtual, ++ ciKlass* holder, ciMethod* callee, ++ const TypeOopPtr* receiver_type, bool is_virtual, + bool &call_does_dispatch, int &vtable_index); + ciMethod* optimize_inlining(ciMethod* caller, int bci, ciInstanceKlass* klass, + ciMethod* callee, const TypeOopPtr* receiver_type); +@@ -853,6 +871,11 @@ + ciMethodData* logmd = NULL); + // Report if there were too many recompiles at a method and bci. + bool too_many_recompiles(ciMethod* method, int bci, Deoptimization::DeoptReason reason); ++ // Return a bitset with the reasons where deoptimization is allowed, ++ // i.e., where there were not too many uncommon traps. ++ int _allowed_reasons; ++ int allowed_deopt_reasons() { return _allowed_reasons; } ++ void set_allowed_deopt_reasons(); + + // Parsing, optimization + PhaseGVN* initial_gvn() { return _initial_gvn; } +@@ -924,6 +947,7 @@ + PhaseRegAlloc* regalloc() { return _regalloc; } + int frame_slots() const { return _frame_slots; } + int frame_size_in_words() const; // frame_slots in units of the polymorphic 'words' ++ int frame_size_in_bytes() const { return _frame_slots << LogBytesPerInt; } + RegMask& FIRST_STACK_mask() { return _FIRST_STACK_mask; } + Arena* indexSet_arena() { return _indexSet_arena; } + void* indexSet_free_block_list() { return _indexSet_free_block_list; } +@@ -935,6 +959,13 @@ + bool need_stack_bang(int frame_size_in_bytes) const; + bool need_register_stack_bang() const; + ++ void update_interpreter_frame_size(int size) { ++ if (_interpreter_frame_size < size) { ++ _interpreter_frame_size = size; ++ } ++ } ++ int bang_size_in_bytes() const; ++ + void set_matcher(Matcher* m) { _matcher = m; } + //void set_regalloc(PhaseRegAlloc* ra) { _regalloc = ra; } + void set_indexSet_arena(Arena* a) { _indexSet_arena = a; } +--- ./hotspot/src/share/vm/opto/connode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/connode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -188,7 +188,7 @@ + const Type *CMoveNode::Value( PhaseTransform *phase ) const { + if( phase->type(in(Condition)) == Type::TOP ) + return Type::TOP; +- return phase->type(in(IfFalse))->meet(phase->type(in(IfTrue))); ++ return phase->type(in(IfFalse))->meet_speculative(phase->type(in(IfTrue))); + } + + //------------------------------make------------------------------------------- +@@ -392,14 +392,14 @@ + //============================================================================= + // If input is already higher or equal to cast type, then this is an identity. + Node *ConstraintCastNode::Identity( PhaseTransform *phase ) { +- return phase->type(in(1))->higher_equal(_type) ? in(1) : this; ++ return phase->type(in(1))->higher_equal_speculative(_type) ? in(1) : this; + } + + //------------------------------Value------------------------------------------ + // Take 'join' of input and cast-up type + const Type *ConstraintCastNode::Value( PhaseTransform *phase ) const { + if( in(0) && phase->type(in(0)) == Type::TOP ) return Type::TOP; +- const Type* ft = phase->type(in(1))->filter(_type); ++const Type* ft = phase->type(in(1))->filter_speculative(_type); + + #ifdef ASSERT + // Previous versions of this function had some special case logic, +@@ -409,7 +409,7 @@ + { + const Type* t1 = phase->type(in(1)); + if( t1 == Type::TOP ) assert(ft == Type::TOP, "special case #1"); +- const Type* rt = t1->join(_type); ++ const Type* rt = t1->join_speculative(_type); + if (rt->empty()) assert(ft == Type::TOP, "special case #2"); + break; + } +--- ./hotspot/src/share/vm/opto/connode.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/connode.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -36,7 +36,7 @@ + // Simple constants + class ConNode : public TypeNode { + public: +- ConNode( const Type *t ) : TypeNode(t,1) { ++ ConNode( const Type *t ) : TypeNode(t->remove_speculative(),1) { + init_req(0, (Node*)Compile::current()->root()); + init_flags(Flag_is_Con); + } +@@ -642,6 +642,19 @@ + virtual const Type *bottom_type() const { return TypeInt::INT; } + }; + ++//------------------------------Opaque3Node------------------------------------ ++// A node to prevent unwanted optimizations. Will be optimized only during ++// macro nodes expansion. ++class Opaque3Node : public Opaque2Node { ++ int _opt; // what optimization it was used for ++public: ++ enum { RTM_OPT }; ++ Opaque3Node(Compile* C, Node *n, int opt) : Opaque2Node(C, n), _opt(opt) {} ++ virtual int Opcode() const; ++ bool rtm_opt() const { return (_opt == RTM_OPT); } ++}; ++ ++ + //----------------------PartialSubtypeCheckNode-------------------------------- + // The 2nd slow-half of a subtype check. Scan the subklass's 2ndary superklass + // array for an instance of the superklass. Set a hidden internal cache on a +--- ./hotspot/src/share/vm/opto/doCall.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/doCall.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -56,7 +56,7 @@ + out->print(" \\-> TypeProfile (%d/%d counts) = ", receiver_count, site_count); + stringStream ss; + prof_klass->name()->print_symbol_on(&ss); +- out->print(ss.as_string()); ++ out->print("%s", ss.as_string()); + out->cr(); + } + } +@@ -161,19 +161,8 @@ + + // Try inlining a bytecoded method: + if (!call_does_dispatch) { +- InlineTree* ilt; +- if (UseOldInlining) { +- ilt = InlineTree::find_subtree_from_root(this->ilt(), jvms->caller(), jvms->method()); +- } else { +- // Make a disembodied, stateless ILT. +- // TO DO: When UseOldInlining is removed, copy the ILT code elsewhere. +- float site_invoke_ratio = prof_factor; +- // Note: ilt is for the root of this parse, not the present call site. +- ilt = new InlineTree(this, jvms->method(), jvms->caller(), site_invoke_ratio, MaxInlineLevel); +- } ++ InlineTree* ilt = InlineTree::find_subtree_from_root(this->ilt(), jvms->caller(), jvms->method()); + WarmCallInfo scratch_ci; +- if (!UseOldInlining) +- scratch_ci.init(jvms, callee, profile, prof_factor); + bool should_delay = false; + WarmCallInfo* ci = ilt->ok_to_inline(callee, jvms, profile, &scratch_ci, should_delay); + assert(ci != &scratch_ci, "do not let this pointer escape"); +@@ -261,7 +250,7 @@ + CallGenerator* miss_cg; + Deoptimization::DeoptReason reason = morphism == 2 ? + Deoptimization::Reason_bimorphic : +- Deoptimization::Reason_class_check; ++ (speculative_receiver_type == NULL ? Deoptimization::Reason_class_check : Deoptimization::Reason_speculate_class_check); + if ((morphism == 1 || (morphism == 2 && next_hit_cg != NULL)) && + !too_many_traps(jvms->method(), jvms->bci(), reason) + ) { +@@ -369,7 +358,7 @@ + bool Compile::should_delay_boxing_inlining(ciMethod* call_method, JVMState* jvms) { + if (eliminate_boxing() && call_method->is_boxing_method()) { + set_has_boxed_value(true); +- return true; ++ return aggressive_unboxing(); + } + return false; + } +@@ -471,8 +460,14 @@ + Node* receiver_node = stack(sp() - nargs); + const TypeOopPtr* receiver_type = _gvn.type(receiver_node)->isa_oopptr(); + // call_does_dispatch and vtable_index are out-parameters. They might be changed. +- callee = C->optimize_virtual_call(method(), bci(), klass, orig_callee, receiver_type, +- is_virtual, ++ // For arrays, klass below is Object. When vtable calls are used, ++ // resolving the call with Object would allow an illegal call to ++ // finalize() on an array. We use holder instead: illegal calls to ++ // finalize() won't be compiled as vtable calls (IC call ++ // resolution will catch the illegal call) and the few legal calls ++ // on array types won't be either. ++ callee = C->optimize_virtual_call(method(), bci(), klass, holder, orig_callee, ++ receiver_type, is_virtual, + call_does_dispatch, vtable_index); // out-parameters + speculative_receiver_type = receiver_type != NULL ? receiver_type->speculative_type() : NULL; + } +@@ -948,8 +943,8 @@ + + + ciMethod* Compile::optimize_virtual_call(ciMethod* caller, int bci, ciInstanceKlass* klass, +- ciMethod* callee, const TypeOopPtr* receiver_type, +- bool is_virtual, ++ ciKlass* holder, ciMethod* callee, ++ const TypeOopPtr* receiver_type, bool is_virtual, + bool& call_does_dispatch, int& vtable_index) { + // Set default values for out-parameters. + call_does_dispatch = true; +@@ -964,7 +959,7 @@ + call_does_dispatch = false; + } else if (!UseInlineCaches && is_virtual && callee->is_loaded()) { + // We can make a vtable call at this site +- vtable_index = callee->resolve_vtable_index(caller->holder(), klass); ++ vtable_index = callee->resolve_vtable_index(caller->holder(), holder); + } + return callee; + } +@@ -987,8 +982,10 @@ + ciInstanceKlass* actual_receiver = klass; + if (receiver_type != NULL) { + // Array methods are all inherited from Object, and are monomorphic. ++ // finalize() call on array is not allowed. + if (receiver_type->isa_aryptr() && +- callee->holder() == env()->Object_klass()) { ++ callee->holder() == env()->Object_klass() && ++ callee->name() != ciSymbol::finalize_method_name()) { + return callee; + } + +--- ./hotspot/src/share/vm/opto/escape.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/escape.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -710,7 +710,7 @@ + Node *val = n->in(MemNode::ValueIn); + PointsToNode* ptn = ptnode_adr(val->_idx); + assert(ptn != NULL, "node should be registered"); +- ptn->set_escape_state(PointsToNode::GlobalEscape); ++ set_escape_state(ptn, PointsToNode::GlobalEscape); + // Add edge to object for unsafe access with offset. + PointsToNode* adr_ptn = ptnode_adr(adr->_idx); + assert(adr_ptn != NULL, "node should be registered"); +@@ -1579,9 +1579,20 @@ + jobj->set_scalar_replaceable(false); + return; + } ++ // 2. An object is not scalar replaceable if the field into which it is ++ // stored has multiple bases one of which is null. ++ if (field->base_count() > 1) { ++ for (BaseIterator i(field); i.has_next(); i.next()) { ++ PointsToNode* base = i.get(); ++ if (base == null_obj) { ++ jobj->set_scalar_replaceable(false); ++ return; ++ } ++ } ++ } + } + assert(use->is_Field() || use->is_LocalVar(), "sanity"); +- // 2. An object is not scalar replaceable if it is merged with other objects. ++ // 3. An object is not scalar replaceable if it is merged with other objects. + for (EdgeIterator j(use); j.has_next(); j.next()) { + PointsToNode* ptn = j.get(); + if (ptn->is_JavaObject() && ptn != jobj) { +@@ -1600,13 +1611,13 @@ + FieldNode* field = j.get()->as_Field(); + int offset = field->as_Field()->offset(); + +- // 3. An object is not scalar replaceable if it has a field with unknown ++ // 4. An object is not scalar replaceable if it has a field with unknown + // offset (array's element is accessed in loop). + if (offset == Type::OffsetBot) { + jobj->set_scalar_replaceable(false); + return; + } +- // 4. Currently an object is not scalar replaceable if a LoadStore node ++ // 5. Currently an object is not scalar replaceable if a LoadStore node + // access its field since the field value is unknown after it. + // + Node* n = field->ideal_node(); +@@ -1617,7 +1628,7 @@ + } + } + +- // 5. Or the address may point to more then one object. This may produce ++ // 6. Or the address may point to more then one object. This may produce + // the false positive result (set not scalar replaceable) + // since the flow-insensitive escape analysis can't separate + // the case when stores overwrite the field's value from the case +--- ./hotspot/src/share/vm/opto/gcm.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/gcm.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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,9 +50,13 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" + #endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" ++#endif ++ + + // Portions of code courtesy of Clifford Click + +@@ -1326,15 +1330,6 @@ + // with suitable memory ops nearby. Use the memory op to do the NULL check. + // I can generate a memory op if there is not one nearby. + if (C->is_method_compilation()) { +- // Don't do it for natives, adapters, or runtime stubs +- int allowed_reasons = 0; +- // ...and don't do it when there have been too many traps, globally. +- for (int reason = (int)Deoptimization::Reason_none+1; +- reason < Compile::trapHistLength; reason++) { +- assert(reason < BitsPerInt, "recode bit map"); +- if (!C->too_many_traps((Deoptimization::DeoptReason) reason)) +- allowed_reasons |= nth_bit(reason); +- } + // By reversing the loop direction we get a very minor gain on mpegaudio. + // Feel free to revert to a forward loop for clarity. + // for( int i=0; i < (int)matcher._null_check_tests.size(); i+=2 ) { +@@ -1342,7 +1337,7 @@ + Node* proj = _matcher._null_check_tests[i]; + Node* val = _matcher._null_check_tests[i + 1]; + Block* block = get_block_for_node(proj); +- implicit_null_check(block, proj, val, allowed_reasons); ++ implicit_null_check(block, proj, val, C->allowed_deopt_reasons()); + // The implicit_null_check will only perform the transformation + // if the null branch is truly uncommon, *and* it leads to an + // uncommon trap. Combined with the too_many_traps guards +@@ -2019,7 +2014,7 @@ + tty->print("%s: %d trip_count: %6.0f freq: %6.0f\n", + _depth == 0 ? "Method" : "Loop", _id, trip_count(), _freq); + for (int i = 0; i < _depth; i++) tty->print(" "); +- tty->print(" members:", _id); ++ tty->print(" members:"); + int k = 0; + for (int i = 0; i < _members.length(); i++) { + if (k++ >= 6) { +--- ./hotspot/src/share/vm/opto/generateOptoStub.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/generateOptoStub.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -104,13 +104,12 @@ + // + Node *adr_sp = basic_plus_adr(top(), thread, in_bytes(JavaThread::last_Java_sp_offset())); + Node *last_sp = basic_plus_adr(top(), frameptr(), (intptr_t) STACK_BIAS); +- store_to_memory(NULL, adr_sp, last_sp, T_ADDRESS, NoAlias); ++ store_to_memory(NULL, adr_sp, last_sp, T_ADDRESS, NoAlias, MemNode::unordered); + + // Set _thread_in_native + // The order of stores into TLS is critical! Setting _thread_in_native MUST + // be last, because a GC is allowed at any time after setting it and the GC + // will require last_Java_pc and last_Java_sp. +- Node* adr_state = basic_plus_adr(top(), thread, in_bytes(JavaThread::thread_state_offset())); + + //----------------------------- + // Compute signature for C call. Varies from the Java signature! +@@ -118,8 +117,16 @@ + uint cnt = TypeFunc::Parms; + // The C routines gets the base of thread-local storage passed in as an + // extra argument. Not all calls need it, but its cheap to add here. +- for( ; cntfield_at(cnt); ++ for (uint pcnt = cnt; pcnt < parm_cnt; pcnt++, cnt++) { ++ // Convert ints to longs if required. ++ if (CCallingConventionRequiresIntsAsLongs && jdomain->field_at(pcnt)->isa_int()) { ++ fields[cnt++] = TypeLong::LONG; ++ fields[cnt] = Type::HALF; // must add an additional half for a long ++ } else { ++ fields[cnt] = jdomain->field_at(pcnt); ++ } ++ } ++ + fields[cnt++] = TypeRawPtr::BOTTOM; // Thread-local storage + // Also pass in the caller's PC, if asked for. + if( return_pc ) +@@ -170,12 +177,20 @@ + + // Set fixed predefined input arguments + cnt = 0; +- for( i=0; iinit_req( cnt++, map()->in(i) ); ++ for (i = 0; i < TypeFunc::Parms; i++) ++ call->init_req(cnt++, map()->in(i)); + // A little too aggressive on the parm copy; return address is not an input + call->set_req(TypeFunc::ReturnAdr, top()); +- for( ; iinit_req( cnt++, map()->in(i) ); ++ 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))); ++ call->init_req(cnt++, int_as_long); // long ++ call->init_req(cnt++, top()); // half ++ } else { ++ call->init_req(cnt++, map()->in(i)); ++ } ++ } + + call->init_req( cnt++, thread ); + if( return_pc ) // Return PC, if asked for +@@ -209,16 +224,15 @@ + //----------------------------- + + // Clear last_Java_sp +- store_to_memory(NULL, adr_sp, null(), T_ADDRESS, NoAlias); ++ store_to_memory(NULL, adr_sp, null(), T_ADDRESS, NoAlias, MemNode::unordered); + // Clear last_Java_pc and (optionally)_flags +- store_to_memory(NULL, adr_last_Java_pc, null(), T_ADDRESS, NoAlias); ++ store_to_memory(NULL, adr_last_Java_pc, null(), T_ADDRESS, NoAlias, MemNode::unordered); + #if defined(SPARC) +- store_to_memory(NULL, adr_flags, intcon(0), T_INT, NoAlias); ++ store_to_memory(NULL, adr_flags, intcon(0), T_INT, NoAlias, MemNode::unordered); + #endif /* defined(SPARC) */ +-#ifdef IA64 ++#if (defined(IA64) && !defined(AIX)) + Node* adr_last_Java_fp = basic_plus_adr(top(), thread, in_bytes(JavaThread::last_Java_fp_offset())); +- if( os::is_MP() ) insert_mem_bar(Op_MemBarRelease); +- store_to_memory(NULL, adr_last_Java_fp, null(), T_ADDRESS, NoAlias); ++ store_to_memory(NULL, adr_last_Java_fp, null(), T_ADDRESS, NoAlias, MemNode::unordered); + #endif + + // For is-fancy-jump, the C-return value is also the branch target +@@ -226,16 +240,16 @@ + // Runtime call returning oop in TLS? Fetch it out + if( pass_tls ) { + Node* adr = basic_plus_adr(top(), thread, in_bytes(JavaThread::vm_result_offset())); +- Node* vm_result = make_load(NULL, adr, TypeOopPtr::BOTTOM, T_OBJECT, NoAlias, false); ++ Node* vm_result = make_load(NULL, adr, TypeOopPtr::BOTTOM, T_OBJECT, NoAlias, MemNode::unordered); + map()->set_req(TypeFunc::Parms, vm_result); // vm_result passed as result + // clear thread-local-storage(tls) +- store_to_memory(NULL, adr, null(), T_ADDRESS, NoAlias); ++ store_to_memory(NULL, adr, null(), T_ADDRESS, NoAlias, MemNode::unordered); + } + + //----------------------------- + // check exception + Node* adr = basic_plus_adr(top(), thread, in_bytes(Thread::pending_exception_offset())); +- Node* pending = make_load(NULL, adr, TypeOopPtr::BOTTOM, T_OBJECT, NoAlias, false); ++ Node* pending = make_load(NULL, adr, TypeOopPtr::BOTTOM, T_OBJECT, NoAlias, MemNode::unordered); + + Node* exit_memory = reset_memory(); + +--- ./hotspot/src/share/vm/opto/graphKit.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/graphKit.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -420,7 +420,7 @@ + } + const Type* srctype = _gvn.type(src); + if (phi->type() != srctype) { +- const Type* dsttype = phi->type()->meet(srctype); ++ const Type* dsttype = phi->type()->meet_speculative(srctype); + if (phi->type() != dsttype) { + phi->set_type(dsttype); + _gvn.set_type(phi, dsttype); +@@ -494,7 +494,7 @@ + // first must access the should_post_on_exceptions_flag in this thread's JavaThread + Node* jthread = _gvn.transform(new (C) 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, false); ++ 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)) ); +@@ -596,7 +596,8 @@ + + Node *adr = basic_plus_adr(ex_node, ex_node, offset); + const TypeOopPtr* val_type = TypeOopPtr::make_from_klass(env()->String_klass()); +- Node *store = store_oop_to_object(control(), ex_node, adr, adr_typ, null(), val_type, T_OBJECT); ++ // Conservatively release stores of object references. ++ Node *store = store_oop_to_object(control(), ex_node, adr, adr_typ, null(), val_type, T_OBJECT, MemNode::release); + + add_exception_state(make_exception_state(ex_node)); + return; +@@ -611,9 +612,10 @@ + // Usual case: Bail to interpreter. + // Reserve the right to recompile if we haven't seen anything yet. + ++ assert(!Deoptimization::reason_is_speculate(reason), "unsupported"); + Deoptimization::DeoptAction action = Deoptimization::Action_maybe_recompile; + if (treat_throw_as_hot +- && (method()->method_data()->trap_recompiled_at(bci()) ++ && (method()->method_data()->trap_recompiled_at(bci(), NULL) + || C->too_many_traps(reason))) { + // We cannot afford to take more traps here. Suffer in the interpreter. + if (C->log() != NULL) +@@ -1123,6 +1125,17 @@ + } + return _gvn.transform( new (C) ConvI2LNode(offset)); + } ++ ++Node* GraphKit::ConvI2UL(Node* offset) { ++ juint offset_con = (juint) find_int_con(offset, Type::OffsetBot); ++ if (offset_con != (juint) Type::OffsetBot) { ++ return longcon((julong) offset_con); ++ } ++ Node* conv = _gvn.transform( new (C) ConvI2LNode(offset)); ++ Node* mask = _gvn.transform( ConLNode::make(C, (julong) max_juint) ); ++ return _gvn.transform( new (C) AndLNode(conv, mask) ); ++} ++ + Node* GraphKit::ConvL2I(Node* offset) { + // short-circuit a common case + jlong offset_con = find_long_con(offset, (jlong)Type::OffsetBot); +@@ -1223,7 +1236,7 @@ + // See if mixing in the NULL pointer changes type. + // If so, then the NULL pointer was not allowed in the original + // type. In other words, "value" was not-null. +- if (t->meet(TypePtr::NULL_PTR) != t) { ++ if (t->meet(TypePtr::NULL_PTR) != t->remove_speculative()) { + // same as: if (!TypePtr::NULL_PTR->higher_equal(t)) ... + explicit_null_checks_elided++; + return value; // Elided null check quickly! +@@ -1356,7 +1369,7 @@ + // Cast obj to not-null on this path + Node* GraphKit::cast_not_null(Node* obj, bool do_replace_in_map) { + const Type *t = _gvn.type(obj); +- const Type *t_not_null = t->join(TypePtr::NOTNULL); ++ const Type *t_not_null = t->join_speculative(TypePtr::NOTNULL); + // Object is already not-null? + if( t == t_not_null ) return obj; + +@@ -1483,16 +1496,16 @@ + // factory methods in "int adr_idx" + Node* GraphKit::make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, + int adr_idx, +- bool require_atomic_access) { ++ MemNode::MemOrd mo, bool require_atomic_access) { + assert(adr_idx != Compile::AliasIdxTop, "use other make_load factory" ); + const TypePtr* adr_type = NULL; // debug-mode-only argument + debug_only(adr_type = C->get_adr_type(adr_idx)); + Node* mem = memory(adr_idx); + Node* ld; + if (require_atomic_access && bt == T_LONG) { +- ld = LoadLNode::make_atomic(C, ctl, mem, adr, adr_type, t); ++ ld = LoadLNode::make_atomic(C, ctl, mem, adr, adr_type, t, mo); + } else { +- ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt); ++ ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt, mo); + } + ld = _gvn.transform(ld); + if ((bt == T_OBJECT) && C->do_escape_analysis() || C->eliminate_boxing()) { +@@ -1504,6 +1517,7 @@ + + Node* GraphKit::store_to_memory(Node* ctl, Node* adr, Node *val, BasicType bt, + int adr_idx, ++ MemNode::MemOrd mo, + bool require_atomic_access) { + assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" ); + const TypePtr* adr_type = NULL; +@@ -1511,9 +1525,9 @@ + Node *mem = memory(adr_idx); + Node* st; + if (require_atomic_access && bt == T_LONG) { +- st = StoreLNode::make_atomic(C, ctl, mem, adr, adr_type, val); ++ st = StoreLNode::make_atomic(C, ctl, mem, adr, adr_type, val, mo); + } else { +- st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt); ++ st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt, mo); + } + st = _gvn.transform(st); + set_memory(st, adr_idx); +@@ -1613,7 +1627,8 @@ + Node* val, + const TypeOopPtr* val_type, + BasicType bt, +- bool use_precise) { ++ bool use_precise, ++ MemNode::MemOrd mo) { + // Transformation of a value which could be NULL pointer (CastPP #NULL) + // could be delayed during Parse (for example, in adjust_map_after_if()). + // Execute transformation here to avoid barrier generation in such case. +@@ -1633,7 +1648,7 @@ + NULL /* pre_val */, + bt); + +- Node* store = store_to_memory(control(), adr, val, bt, adr_idx); ++ Node* store = store_to_memory(control(), adr, val, bt, adr_idx, mo); + post_barrier(control(), store, obj, adr, adr_idx, val, bt, use_precise); + return store; + } +@@ -1644,7 +1659,8 @@ + Node* adr, // actual adress to store val at + const TypePtr* adr_type, + Node* val, +- BasicType bt) { ++ BasicType bt, ++ MemNode::MemOrd mo) { + Compile::AliasType* at = C->alias_type(adr_type); + const TypeOopPtr* val_type = NULL; + if (adr_type->isa_instptr()) { +@@ -1663,7 +1679,7 @@ + if (val_type == NULL) { + val_type = TypeInstPtr::BOTTOM; + } +- return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, true); ++ return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, true, mo); + } + + +@@ -1707,7 +1723,7 @@ + const Type* elemtype = arytype->elem(); + BasicType elembt = elemtype->array_element_basic_type(); + Node* adr = array_element_address(ary, idx, elembt, arytype->size()); +- Node* ld = make_load(ctl, adr, elemtype, elembt, arytype); ++ Node* ld = make_load(ctl, adr, elemtype, elembt, arytype, MemNode::unordered); + return ld; + } + +@@ -1942,9 +1958,9 @@ + void GraphKit::increment_counter(Node* counter_addr) { + int adr_type = Compile::AliasIdxRaw; + Node* ctrl = control(); +- Node* cnt = make_load(ctrl, counter_addr, TypeInt::INT, T_INT, adr_type); ++ 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))); +- store_to_memory( ctrl, counter_addr, incr, T_INT, adr_type ); ++ store_to_memory(ctrl, counter_addr, incr, T_INT, adr_type, MemNode::unordered); + } + + +@@ -2108,30 +2124,33 @@ + * @return node with improved type + */ + Node* GraphKit::record_profile_for_speculation(Node* n, ciKlass* exact_kls) { +- const TypeOopPtr* current_type = _gvn.type(n)->isa_oopptr(); ++ const Type* current_type = _gvn.type(n); + assert(UseTypeSpeculation, "type speculation must be on"); +- if (exact_kls != NULL && +- // nothing to improve if type is already exact +- (current_type == NULL || +- (!current_type->klass_is_exact() && +- (current_type->speculative() == NULL || +- !current_type->speculative()->klass_is_exact())))) { ++ ++ const TypeOopPtr* speculative = current_type->speculative(); ++ ++ if (current_type->would_improve_type(exact_kls, jvms()->depth())) { + const TypeKlassPtr* tklass = TypeKlassPtr::make(exact_kls); + const TypeOopPtr* xtype = tklass->as_instance_type(); + assert(xtype->klass_is_exact(), "Should be exact"); +- ++ // record the new speculative type's depth ++ speculative = xtype->with_inline_depth(jvms()->depth()); ++ } ++ ++ if (speculative != current_type->speculative()) { + // Build a type with a speculative type (what we think we know + // about the type but will need a guard when we use it) +- const TypeOopPtr* spec_type = TypeOopPtr::make(TypePtr::BotPTR, Type::OffsetBot, TypeOopPtr::InstanceBot, xtype); +- // We're changing the type, we need a new cast node to carry 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) CastPPNode(n, spec_type); +- cast->init_req(0, control()); ++ const TypeOopPtr* spec_type = TypeOopPtr::make(TypePtr::BotPTR, Type::OffsetBot, TypeOopPtr::InstanceBot, speculative); ++ // We're changing the type, we need a new CheckCast node to carry ++ // 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)); + cast = _gvn.transform(cast); + replace_in_map(n, cast); + n = cast; + } ++ + return n; + } + +@@ -2141,7 +2160,7 @@ + * + * @param n receiver node + * +- * @return node with improved type ++ * @return node with improved type + */ + Node* GraphKit::record_profiled_receiver_for_speculation(Node* n) { + if (!UseTypeSpeculation) { +@@ -2439,7 +2458,7 @@ + + //------------------------------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 +@@ -2453,11 +2472,17 @@ + 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 (C) CreateExNode(ex_type, control(), i_o); ++ add_exception_state(make_exception_state(_gvn.transform(ex_oop))); ++ } + } + } + +@@ -2525,7 +2550,8 @@ + + // 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 (C) 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); + +@@ -2734,12 +2760,14 @@ + // Subsequent type checks will always fold up. + Node* GraphKit::maybe_cast_profiled_receiver(Node* not_null_obj, + ciKlass* require_klass, +- ciKlass* spec_klass, ++ ciKlass* spec_klass, + bool safe_for_replace) { + if (!UseTypeProfile || !TypeProfileCasts) return NULL; + ++ Deoptimization::DeoptReason reason = spec_klass == NULL ? Deoptimization::Reason_class_check : Deoptimization::Reason_speculate_class_check; ++ + // Make sure we haven't already deoptimized from this tactic. +- if (too_many_traps(Deoptimization::Reason_class_check)) ++ if (too_many_traps(reason)) + return NULL; + + // (No, this isn't a call, but it's enough like a virtual call +@@ -2761,7 +2789,7 @@ + &exact_obj); + { PreserveJVMState pjvms(this); + set_control(slow_ctl); +- uncommon_trap(Deoptimization::Reason_class_check, ++ uncommon_trap(reason, + Deoptimization::Action_maybe_recompile); + } + if (safe_for_replace) { +@@ -2788,8 +2816,10 @@ + bool not_null) { + // type == NULL if profiling tells us this object is always null + if (type != NULL) { +- if (!too_many_traps(Deoptimization::Reason_null_check) && +- !too_many_traps(Deoptimization::Reason_class_check)) { ++ Deoptimization::DeoptReason class_reason = Deoptimization::Reason_speculate_class_check; ++ Deoptimization::DeoptReason null_reason = Deoptimization::Reason_null_check; ++ if (!too_many_traps(null_reason) && ++ !too_many_traps(class_reason)) { + Node* not_null_obj = NULL; + // not_null is true if we know the object is not null and + // there's no need for a null check +@@ -2808,7 +2838,7 @@ + { + PreserveJVMState pjvms(this); + set_control(slow_ctl); +- uncommon_trap(Deoptimization::Reason_class_check, ++ uncommon_trap(class_reason, + Deoptimization::Action_maybe_recompile); + } + replace_in_map(not_null_obj, exact_obj); +@@ -2877,7 +2907,7 @@ + } + + if (known_statically && UseTypeSpeculation) { +- // If we know the type check always succeed then we don't use the ++ // If we know the type check always succeeds then we don't use the + // profiling data at this bytecode. Don't lose it, feed it to the + // type system as a speculative type. + not_null_obj = record_profiled_receiver_for_speculation(not_null_obj); +@@ -2994,22 +3024,28 @@ + } + + Node* cast_obj = NULL; +- const TypeOopPtr* obj_type = _gvn.type(obj)->is_oopptr(); +- // We may not have profiling here or it may not help us. If we have +- // a speculative type use it to perform an exact cast. +- ciKlass* spec_obj_type = obj_type->speculative_type(); +- if (spec_obj_type != NULL || +- (data != NULL && +- // Counter has never been decremented (due to cast failure). +- // ...This is a reasonable thing to expect. It is true of +- // all casts inserted by javac to implement generic types. +- data->as_CounterData()->count() >= 0)) { +- cast_obj = maybe_cast_profiled_receiver(not_null_obj, tk->klass(), spec_obj_type, safe_for_replace); +- if (cast_obj != NULL) { +- if (failure_control != NULL) // failure is now impossible +- (*failure_control) = top(); +- // adjust the type of the phi to the exact klass: +- phi->raise_bottom_type(_gvn.type(cast_obj)->meet(TypePtr::NULL_PTR)); ++ if (tk->klass_is_exact()) { ++ // The following optimization tries to statically cast the speculative type of the object ++ // (for example obtained during profiling) to the type of the superklass and then do a ++ // dynamic check that the type of the object is what we expect. To work correctly ++ // for checkcast and aastore the type of superklass should be exact. ++ const TypeOopPtr* obj_type = _gvn.type(obj)->is_oopptr(); ++ // We may not have profiling here or it may not help us. If we have ++ // a speculative type use it to perform an exact cast. ++ ciKlass* spec_obj_type = obj_type->speculative_type(); ++ if (spec_obj_type != NULL || ++ (data != NULL && ++ // Counter has never been decremented (due to cast failure). ++ // ...This is a reasonable thing to expect. It is true of ++ // all casts inserted by javac to implement generic types. ++ data->as_CounterData()->count() >= 0)) { ++ cast_obj = maybe_cast_profiled_receiver(not_null_obj, tk->klass(), spec_obj_type, safe_for_replace); ++ if (cast_obj != NULL) { ++ if (failure_control != NULL) // failure is now impossible ++ (*failure_control) = top(); ++ // adjust the type of the phi to the exact klass: ++ phi->raise_bottom_type(_gvn.type(cast_obj)->meet_speculative(TypePtr::NULL_PTR)); ++ } + } + } + +@@ -3132,10 +3168,14 @@ + Node* mem = reset_memory(); + + FastLockNode * flock = _gvn.transform(new (C) FastLockNode(0, obj, box) )->as_FastLock(); +- if (PrintPreciseBiasedLockingStatistics) { ++ if (UseBiasedLocking && PrintPreciseBiasedLockingStatistics) { + // Create the counters for this fast lock. + flock->create_lock_counter(sync_jvms()); // sync_jvms used to get current bci + } ++ ++ // Create the rtm counters for this fast lock if needed. ++ flock->create_rtm_lock_counter(sync_jvms()); // sync_jvms used to get current bci ++ + // Add monitor to debug info for the slow path. If we block inside the + // slow path and de-opt, we need the monitor hanging around + map()->push_monitor( flock ); +@@ -3238,7 +3278,7 @@ + } + constant_value = Klass::_lh_neutral_value; // put in a known value + Node* lhp = basic_plus_adr(klass_node, klass_node, in_bytes(Klass::layout_helper_offset())); +- return make_load(NULL, lhp, TypeInt::INT, T_INT); ++ return make_load(NULL, lhp, TypeInt::INT, T_INT, MemNode::unordered); + } + + // We just put in an allocate/initialize with a big raw-memory effect. +@@ -3256,7 +3296,8 @@ + + //---------------------------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); +@@ -3264,7 +3305,7 @@ + set_control( _gvn.transform(new (C) 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); ++ 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)); +@@ -3342,9 +3383,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. +@@ -3413,7 +3456,7 @@ + size, klass_node, + initial_slow_test); + +- return set_output_for_allocation(alloc, oop_type); ++ return set_output_for_allocation(alloc, oop_type, deoptimize_on_exception); + } + + //-------------------------------new_array------------------------------------- +@@ -3423,7 +3466,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); +@@ -3566,7 +3610,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) { +@@ -3773,7 +3817,7 @@ + + // Smash zero into card + if( !UseConcMarkSweepGC ) { +- __ store(__ ctrl(), card_adr, zero, bt, adr_type); ++ __ store(__ ctrl(), card_adr, zero, bt, adr_type, MemNode::release); + } else { + // Specialized path for CM store barrier + __ storeCM(__ ctrl(), card_adr, zero, oop_store, adr_idx, bt, adr_type); +@@ -3870,9 +3914,9 @@ + + // Now get the buffer location we will log the previous value into and store it + Node *log_addr = __ AddP(no_base, buffer, next_index); +- __ store(__ ctrl(), log_addr, pre_val, T_OBJECT, Compile::AliasIdxRaw); ++ __ store(__ ctrl(), log_addr, pre_val, T_OBJECT, Compile::AliasIdxRaw, MemNode::unordered); + // update the index +- __ store(__ ctrl(), index_adr, next_index, index_bt, Compile::AliasIdxRaw); ++ __ store(__ ctrl(), index_adr, next_index, index_bt, Compile::AliasIdxRaw, MemNode::unordered); + + } __ else_(); { + +@@ -3912,8 +3956,9 @@ + Node* next_index = _gvn.transform(new (C) SubXNode(index, __ ConX(sizeof(intptr_t)))); + Node* log_addr = __ AddP(no_base, buffer, next_index); + +- __ store(__ ctrl(), log_addr, card_adr, T_ADDRESS, Compile::AliasIdxRaw); +- __ store(__ ctrl(), index_adr, next_index, TypeX_X->basic_type(), Compile::AliasIdxRaw); ++ // Order, see storeCM. ++ __ store(__ ctrl(), log_addr, card_adr, T_ADDRESS, Compile::AliasIdxRaw, MemNode::unordered); ++ __ store(__ ctrl(), index_adr, next_index, TypeX_X->basic_type(), Compile::AliasIdxRaw, MemNode::unordered); + + } __ else_(); { + __ make_leaf_call(tf, CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), "g1_wb_post", card_adr, __ thread()); +@@ -4043,7 +4088,7 @@ + int offset_field_idx = C->get_alias_index(offset_field_type); + return make_load(ctrl, + basic_plus_adr(str, str, offset_offset), +- TypeInt::INT, T_INT, offset_field_idx); ++ TypeInt::INT, T_INT, offset_field_idx, MemNode::unordered); + } else { + return intcon(0); + } +@@ -4058,7 +4103,7 @@ + int count_field_idx = C->get_alias_index(count_field_type); + return make_load(ctrl, + basic_plus_adr(str, str, count_offset), +- TypeInt::INT, T_INT, count_field_idx); ++ TypeInt::INT, T_INT, count_field_idx, MemNode::unordered); + } else { + return load_array_length(load_String_value(ctrl, str)); + } +@@ -4074,7 +4119,7 @@ + ciTypeArrayKlass::make(T_CHAR), true, 0); + int value_field_idx = C->get_alias_index(value_field_type); + Node* load = make_load(ctrl, basic_plus_adr(str, str, value_offset), +- value_type, T_OBJECT, value_field_idx); ++ value_type, T_OBJECT, value_field_idx, MemNode::unordered); + // String.value field is known to be @Stable. + if (UseImplicitStableValues) { + load = cast_array_to_stable(load, value_type); +@@ -4089,7 +4134,7 @@ + const TypePtr* offset_field_type = string_type->add_offset(offset_offset); + int offset_field_idx = C->get_alias_index(offset_field_type); + store_to_memory(ctrl, basic_plus_adr(str, offset_offset), +- value, T_INT, offset_field_idx); ++ value, T_INT, offset_field_idx, MemNode::unordered); + } + + void GraphKit::store_String_value(Node* ctrl, Node* str, Node* value) { +@@ -4099,7 +4144,7 @@ + const TypePtr* value_field_type = string_type->add_offset(value_offset); + + store_oop_to_object(ctrl, str, basic_plus_adr(str, value_offset), value_field_type, +- value, TypeAryPtr::CHARS, T_OBJECT); ++ value, TypeAryPtr::CHARS, T_OBJECT, MemNode::unordered); + } + + void GraphKit::store_String_length(Node* ctrl, Node* str, Node* value) { +@@ -4109,7 +4154,7 @@ + const TypePtr* count_field_type = string_type->add_offset(count_offset); + int count_field_idx = C->get_alias_index(count_field_type); + store_to_memory(ctrl, basic_plus_adr(str, count_offset), +- value, T_INT, count_field_idx); ++ value, T_INT, count_field_idx, MemNode::unordered); + } + + Node* GraphKit::cast_array_to_stable(Node* ary, const TypeAryPtr* ary_type) { +--- ./hotspot/src/share/vm/opto/graphKit.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/graphKit.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -338,6 +338,7 @@ + // Convert between int and long, and size_t. + // (See macros ConvI2X, etc., in type.hpp for ConvI2X, etc.) + Node* ConvI2L(Node* offset); ++ Node* ConvI2UL(Node* offset); + Node* ConvL2I(Node* offset); + // Find out the klass of an object. + Node* load_object_klass(Node* object); +@@ -406,7 +407,7 @@ + // Use the type profile to narrow an object type. + Node* maybe_cast_profiled_receiver(Node* not_null_obj, + ciKlass* require_klass, +- ciKlass* spec, ++ ciKlass* spec, + bool safe_for_replace); + + // Cast obj to type and emit guard unless we had too many traps here already +@@ -510,36 +511,50 @@ + + // Create a LoadNode, reading from the parser's memory state. + // (Note: require_atomic_access is useful only with T_LONG.) ++ // ++ // We choose the unordered semantics by default because we have ++ // adapted the `do_put_xxx' and `do_get_xxx' procedures for the case ++ // of volatile fields. + Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, +- bool require_atomic_access = false) { ++ MemNode::MemOrd mo, bool require_atomic_access = false) { + // This version computes alias_index from bottom_type + return make_load(ctl, adr, t, bt, adr->bottom_type()->is_ptr(), +- require_atomic_access); ++ mo, require_atomic_access); + } +- Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, const TypePtr* adr_type, bool require_atomic_access = false) { ++ Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, const TypePtr* adr_type, ++ MemNode::MemOrd mo, bool require_atomic_access = false) { + // This version computes alias_index from an address type + assert(adr_type != NULL, "use other make_load factory"); + return make_load(ctl, adr, t, bt, C->get_alias_index(adr_type), +- require_atomic_access); ++ mo, require_atomic_access); + } + // This is the base version which is given an alias index. +- Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, int adr_idx, bool require_atomic_access = false); ++ Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, int adr_idx, ++ MemNode::MemOrd mo, bool require_atomic_access = false); + + // Create & transform a StoreNode and store the effect into the + // parser's memory state. ++ // ++ // We must ensure that stores of object references will be visible ++ // only after the object's initialization. So the clients of this ++ // procedure must indicate that the store requires `release' ++ // semantics, if the stored value is an object reference that might ++ // point to a new object and may become externally visible. + Node* store_to_memory(Node* ctl, Node* adr, Node* val, BasicType bt, + const TypePtr* adr_type, ++ MemNode::MemOrd mo, + bool require_atomic_access = false) { + // This version computes alias_index from an address type + assert(adr_type != NULL, "use other store_to_memory factory"); + return store_to_memory(ctl, adr, val, bt, + C->get_alias_index(adr_type), +- require_atomic_access); ++ mo, require_atomic_access); + } + // This is the base version which is given alias index + // Return the new StoreXNode + Node* store_to_memory(Node* ctl, Node* adr, Node* val, BasicType bt, + int adr_idx, ++ MemNode::MemOrd, + bool require_atomic_access = false); + + +@@ -557,40 +572,44 @@ + + Node* store_oop(Node* ctl, + Node* obj, // containing obj +- Node* adr, // actual adress to store val at ++ Node* adr, // actual adress to store val at + const TypePtr* adr_type, + Node* val, + const TypeOopPtr* val_type, + BasicType bt, +- bool use_precise); ++ bool use_precise, ++ MemNode::MemOrd mo); + + Node* store_oop_to_object(Node* ctl, + Node* obj, // containing obj +- Node* adr, // actual adress to store val at ++ Node* adr, // actual adress to store val at + const TypePtr* adr_type, + Node* val, + const TypeOopPtr* val_type, +- BasicType bt) { +- return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, false); ++ BasicType bt, ++ MemNode::MemOrd mo) { ++ return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, false, mo); + } + + Node* store_oop_to_array(Node* ctl, + Node* obj, // containing obj +- Node* adr, // actual adress to store val at ++ Node* adr, // actual adress to store val at + const TypePtr* adr_type, + Node* val, + const TypeOopPtr* val_type, +- BasicType bt) { +- return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, true); ++ BasicType bt, ++ MemNode::MemOrd mo) { ++ return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, true, mo); + } + + // Could be an array or object we don't know at compile time (unsafe ref.) + Node* store_oop_to_unknown(Node* ctl, + Node* obj, // containing obj +- Node* adr, // actual adress to store val at ++ Node* adr, // actual adress to store val at + const TypePtr* adr_type, + Node* val, +- BasicType bt); ++ BasicType bt, ++ MemNode::MemOrd mo); + + // For the few case where the barriers need special help + void pre_barrier(bool do_load, Node* ctl, +@@ -783,7 +802,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(); +@@ -825,13 +844,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); +--- ./hotspot/src/share/vm/opto/idealGraphPrinter.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/idealGraphPrinter.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2007, 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 +@@ -155,7 +155,7 @@ + } else { + // It would be nice if we could shut down cleanly but it should + // be an error if we can't connect to the visualizer. +- fatal(err_msg_res("Couldn't connect to visualizer at %s:%d", ++ fatal(err_msg_res("Couldn't connect to visualizer at %s:" INTX_FORMAT, + PrintIdealGraphAddress, PrintIdealGraphPort)); + } + } +@@ -195,7 +195,7 @@ + + + void IdealGraphPrinter::begin_elem(const char *s) { +- _xml->begin_elem(s); ++ _xml->begin_elem("%s", s); + } + + void IdealGraphPrinter::end_elem() { +@@ -203,7 +203,7 @@ + } + + void IdealGraphPrinter::begin_head(const char *s) { +- _xml->begin_head(s); ++ _xml->begin_head("%s", s); + } + + void IdealGraphPrinter::end_head() { +@@ -223,7 +223,7 @@ + } + + void IdealGraphPrinter::head(const char *name) { +- _xml->head(name); ++ _xml->head("%s", name); + } + + void IdealGraphPrinter::tail(const char *name) { +@@ -231,7 +231,7 @@ + } + + void IdealGraphPrinter::text(const char *s) { +- _xml->text(s); ++ _xml->text("%s", s); + } + + void IdealGraphPrinter::print_prop(const char *name, int val) { +@@ -359,7 +359,7 @@ + void IdealGraphPrinter::print_indent() { + tty->print_cr("printing ident %d", _depth); + for (int i = 0; i < _depth; i++) { +- _xml->print(INDENT); ++ _xml->print("%s", INDENT); + } + } + +@@ -404,7 +404,7 @@ + + Node *node = n; + #ifndef PRODUCT +- node->_in_dump_cnt++; ++ Compile::current()->_in_dump_cnt++; + print_prop(NODE_NAME_PROPERTY, (const char *)node->Name()); + const Type *t = node->bottom_type(); + print_prop("type", t->msg()); +@@ -623,7 +623,7 @@ + print_prop("lrg", lrg_id); + } + +- node->_in_dump_cnt--; ++ Compile::current()->_in_dump_cnt--; + #endif + + tail(PROPERTIES_ELEMENT); +--- ./hotspot/src/share/vm/opto/idealKit.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/idealKit.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -359,25 +359,25 @@ + Node* mem = memory(adr_idx); + Node* ld; + if (require_atomic_access && bt == T_LONG) { +- ld = LoadLNode::make_atomic(C, ctl, mem, adr, adr_type, t); ++ ld = LoadLNode::make_atomic(C, ctl, mem, adr, adr_type, t, MemNode::unordered); + } else { +- ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt); ++ ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt, MemNode::unordered); + } + return transform(ld); + } + + Node* IdealKit::store(Node* ctl, Node* adr, Node *val, BasicType bt, +- int adr_idx, +- bool require_atomic_access) { +- assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" ); ++ int adr_idx, ++ MemNode::MemOrd mo, bool require_atomic_access) { ++ assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory"); + const TypePtr* adr_type = NULL; + debug_only(adr_type = C->get_adr_type(adr_idx)); + Node *mem = memory(adr_idx); + Node* st; + if (require_atomic_access && bt == T_LONG) { +- st = StoreLNode::make_atomic(C, ctl, mem, adr, adr_type, val); ++ st = StoreLNode::make_atomic(C, ctl, mem, adr, adr_type, val, mo); + } else { +- st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt); ++ st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt, mo); + } + st = transform(st); + set_memory(st, adr_idx); +--- ./hotspot/src/share/vm/opto/idealKit.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/idealKit.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -226,6 +226,7 @@ + Node* val, + BasicType bt, + int adr_idx, ++ MemNode::MemOrd mo, + bool require_atomic_access = false); + + // Store a card mark ordered after store_oop +--- ./hotspot/src/share/vm/opto/ifg.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/ifg.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -257,7 +257,7 @@ + for( i = 0; i < _maxlrg*2; i++ ) + if( h_cnt[i] ) + tty->print("%d/%d ",i,h_cnt[i]); +- tty->print_cr(""); ++ tty->cr(); + } + + void PhaseIFG::verify( const PhaseChaitin *pc ) const { +--- ./hotspot/src/share/vm/opto/ifnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/ifnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -76,7 +76,6 @@ + if( !i1->is_Bool() ) return NULL; + BoolNode *b = i1->as_Bool(); + Node *cmp = b->in(1); +- if( cmp->is_FlagsProj() ) return NULL; + if( !cmp->is_Cmp() ) return NULL; + i1 = cmp->in(1); + if( i1 == NULL || !i1->is_Phi() ) return NULL; +@@ -674,7 +673,7 @@ + // / Region + // + Node* IfNode::fold_compares(PhaseGVN* phase) { +- if (!phase->C->eliminate_boxing() || Opcode() != Op_If) return NULL; ++ if (Opcode() != Op_If) return NULL; + + Node* this_cmp = in(1)->in(1); + if (this_cmp != NULL && this_cmp->Opcode() == Op_CmpI && +--- ./hotspot/src/share/vm/opto/lcm.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/lcm.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -45,12 +45,52 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" + #endif + + // Optimization - Graph Style + ++// Check whether val is not-null-decoded compressed oop, ++// i.e. will grab into the base of the heap if it represents NULL. ++static bool accesses_heap_base_zone(Node *val) { ++ if (Universe::narrow_oop_base() > 0) { // Implies UseCompressedOops. ++ if (val && val->is_Mach()) { ++ if (val->as_Mach()->ideal_Opcode() == Op_DecodeN) { ++ // This assumes all Decodes with TypePtr::NotNull are matched to nodes that ++ // decode NULL to point to the heap base (Decode_NN). ++ if (val->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull) { ++ return true; ++ } ++ } ++ // Must recognize load operation with Decode matched in memory operand. ++ // We should not reach here exept for PPC/AIX, as os::zero_page_read_protected() ++ // returns true everywhere else. On PPC, no such memory operands ++ // exist, therefore we did not yet implement a check for such operands. ++ NOT_AIX(Unimplemented()); ++ } ++ } ++ return false; ++} ++ ++static bool needs_explicit_null_check_for_read(Node *val) { ++ // On some OSes (AIX) the page at address 0 is only write protected. ++ // If so, only Store operations will trap. ++ if (os::zero_page_read_protected()) { ++ return false; // Implicit null check will work. ++ } ++ // Also a read accessing the base of a heap-based compressed heap will trap. ++ if (accesses_heap_base_zone(val) && // Hits the base zone page. ++ Universe::narrow_oop_use_implicit_null_checks()) { // Base zone page is protected. ++ return false; ++ } ++ ++ return true; ++} ++ + //------------------------------implicit_null_check---------------------------- + // Detect implicit-null-check opportunities. Basically, find NULL checks + // with suitable memory ops nearby. Use the memory op to do the NULL check. +@@ -206,6 +246,14 @@ + } + break; + } ++ ++ // On some OSes (AIX) the page at address 0 is only write protected. ++ // If so, only Store operations will trap. ++ // But a read accessing the base of a heap-based compressed heap will trap. ++ if (!was_store && needs_explicit_null_check_for_read(val)) { ++ continue; ++ } ++ + // check if the offset is not too high for implicit exception + { + intptr_t offset = 0; +@@ -472,13 +520,6 @@ + break; + } + +- // For nodes that produce a FlagsProj, make the node adjacent to the +- // use of the FlagsProj +- if (use->is_FlagsProj() && get_block_for_node(use) == block) { +- found_machif = true; +- break; +- } +- + // More than this instruction pending for successor to be ready, + // don't choose this if other opportunities are ready + if (ready_cnt.at(use->_idx) > 1) +--- ./hotspot/src/share/vm/opto/library_call.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/library_call.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -203,7 +203,9 @@ + bool inline_math_native(vmIntrinsics::ID id); + bool inline_trig(vmIntrinsics::ID id); + bool inline_math(vmIntrinsics::ID id); +- void inline_math_mathExact(Node* math); ++ template ++ bool inline_math_overflow(Node* arg1, Node* arg2); ++ void inline_math_mathExact(Node* math, Node* test); + bool inline_math_addExactI(bool is_increment); + bool inline_math_addExactL(bool is_increment); + bool inline_math_multiplyExactI(); +@@ -214,7 +216,7 @@ + bool inline_math_subtractExactL(bool is_decrement); + bool inline_exp(); + bool inline_pow(); +- void finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName); ++ Node* finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName); + bool inline_min_max(vmIntrinsics::ID id); + Node* generate_min_max(vmIntrinsics::ID id, Node* x, Node* y); + // This returns Type::AnyPtr, RawPtr, or OopPtr. +@@ -304,6 +306,7 @@ + bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); + 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_encodeISOArray(); + bool inline_updateCRC32(); + bool inline_updateBytesCRC32(); +@@ -516,31 +519,31 @@ + + case vmIntrinsics::_incrementExactI: + case vmIntrinsics::_addExactI: +- if (!Matcher::match_rule_supported(Op_AddExactI) || !UseMathExactIntrinsics) return NULL; ++ if (!Matcher::match_rule_supported(Op_OverflowAddI) || !UseMathExactIntrinsics) return NULL; + break; + case vmIntrinsics::_incrementExactL: + case vmIntrinsics::_addExactL: +- if (!Matcher::match_rule_supported(Op_AddExactL) || !UseMathExactIntrinsics) return NULL; ++ if (!Matcher::match_rule_supported(Op_OverflowAddL) || !UseMathExactIntrinsics) return NULL; + break; + case vmIntrinsics::_decrementExactI: + case vmIntrinsics::_subtractExactI: +- if (!Matcher::match_rule_supported(Op_SubExactI) || !UseMathExactIntrinsics) return NULL; ++ if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL; + break; + case vmIntrinsics::_decrementExactL: + case vmIntrinsics::_subtractExactL: +- if (!Matcher::match_rule_supported(Op_SubExactL) || !UseMathExactIntrinsics) return NULL; ++ if (!Matcher::match_rule_supported(Op_OverflowSubL) || !UseMathExactIntrinsics) return NULL; + break; + case vmIntrinsics::_negateExactI: +- if (!Matcher::match_rule_supported(Op_NegExactI) || !UseMathExactIntrinsics) return NULL; ++ if (!Matcher::match_rule_supported(Op_OverflowSubI) || !UseMathExactIntrinsics) return NULL; + break; + case vmIntrinsics::_negateExactL: +- if (!Matcher::match_rule_supported(Op_NegExactL) || !UseMathExactIntrinsics) return NULL; ++ if (!Matcher::match_rule_supported(Op_OverflowSubL) || !UseMathExactIntrinsics) return NULL; + break; + case vmIntrinsics::_multiplyExactI: +- if (!Matcher::match_rule_supported(Op_MulExactI) || !UseMathExactIntrinsics) return NULL; ++ if (!Matcher::match_rule_supported(Op_OverflowMulI) || !UseMathExactIntrinsics) return NULL; + break; + case vmIntrinsics::_multiplyExactL: +- if (!Matcher::match_rule_supported(Op_MulExactL) || !UseMathExactIntrinsics) return NULL; ++ if (!Matcher::match_rule_supported(Op_OverflowMulL) || !UseMathExactIntrinsics) return NULL; + break; + + default: +@@ -1057,7 +1060,7 @@ + const Type* thread_type = TypeOopPtr::make_from_klass(thread_klass)->cast_to_ptr_type(TypePtr::NotNull); + Node* thread = _gvn.transform(new (C) ThreadLocalNode()); + Node* p = basic_plus_adr(top()/*!oop*/, thread, in_bytes(JavaThread::threadObj_offset())); +- Node* threadObj = make_load(NULL, p, thread_type, T_OBJECT); ++ Node* threadObj = make_load(NULL, p, thread_type, T_OBJECT, MemNode::unordered); + tls_output = thread; + return threadObj; + } +@@ -1675,7 +1678,7 @@ + return true; + } + +-void LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName) { ++Node* LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName) { + //------------------- + //result=(result.isNaN())? funcAddr():result; + // Check: If isNaN() by checking result!=result? then either trap +@@ -1691,7 +1694,7 @@ + uncommon_trap(Deoptimization::Reason_intrinsic, + Deoptimization::Action_make_not_entrant); + } +- set_result(result); ++ return result; + } else { + // If this inlining ever returned NaN in the past, we compile a call + // to the runtime to properly handle corner cases +@@ -1721,9 +1724,10 @@ + + result_region->init_req(2, control()); + result_val->init_req(2, value); +- set_result(result_region, result_val); ++ set_control(_gvn.transform(result_region)); ++ return _gvn.transform(result_val); + } else { +- set_result(result); ++ return result; + } + } + } +@@ -1735,7 +1739,8 @@ + Node* arg = round_double_node(argument(0)); + Node* n = _gvn.transform(new (C) ExpDNode(C, control(), arg)); + +- finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); ++ n = finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); ++ set_result(n); + + C->set_has_split_ifs(true); // Has chance for split-if optimization + return true; +@@ -1745,27 +1750,48 @@ + // Inline power instructions, if possible. + bool LibraryCallKit::inline_pow() { + // Pseudocode for pow +- // if (x <= 0.0) { +- // long longy = (long)y; +- // if ((double)longy == y) { // if y is long +- // if (y + 1 == y) longy = 0; // huge number: even +- // result = ((1&longy) == 0)?-DPow(abs(x), y):DPow(abs(x), y); ++ // if (y == 2) { ++ // return x * x; ++ // } else { ++ // if (x <= 0.0) { ++ // long longy = (long)y; ++ // if ((double)longy == y) { // if y is long ++ // if (y + 1 == y) longy = 0; // huge number: even ++ // result = ((1&longy) == 0)?-DPow(abs(x), y):DPow(abs(x), y); ++ // } else { ++ // result = NaN; ++ // } + // } else { +- // result = NaN; ++ // result = DPow(x,y); + // } +- // } else { +- // result = DPow(x,y); ++ // if (result != result)? { ++ // result = uncommon_trap() or runtime_call(); ++ // } ++ // return result; + // } +- // if (result != result)? { +- // result = uncommon_trap() or runtime_call(); +- // } +- // return result; + + Node* x = round_double_node(argument(0)); + Node* y = round_double_node(argument(2)); + + 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)); ++ 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); ++ region_node->init_req(1, if_true); ++ ++ Node* phi_node = new (C) 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))); ++ ++ // 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)); +@@ -1889,7 +1915,15 @@ + result = _gvn.transform(phi); + } + +- finish_pow_exp(result, x, y, OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); ++ result = finish_pow_exp(result, x, y, OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); ++ ++ // control from finish_pow_exp is now input to the region node ++ region_node->set_req(2, control()); ++ // the result from finish_pow_exp is now input to the phi node ++ phi_node->init_req(2, result); ++ set_control(_gvn.transform(region_node)); ++ record_for_igvn(region_node); ++ set_result(_gvn.transform(phi_node)); + + C->set_has_split_ifs(true); // Has chance for split-if optimization + return true; +@@ -1936,7 +1970,7 @@ + runtime_math(OptoRuntime::Math_D_D_Type(), FN_PTR(SharedRuntime::dlog10), "LOG10"); + + // These intrinsics are supported on all hardware +- case vmIntrinsics::_dsqrt: return Matcher::has_match_rule(Op_SqrtD) ? inline_math(id) : false; ++ case vmIntrinsics::_dsqrt: return Matcher::match_rule_supported(Op_SqrtD) ? inline_math(id) : false; + case vmIntrinsics::_dabs: return Matcher::has_match_rule(Op_AbsD) ? inline_math(id) : false; + + case vmIntrinsics::_dexp: return Matcher::has_match_rule(Op_ExpD) ? inline_exp() : +@@ -1969,18 +2003,8 @@ + return true; + } + +-void LibraryCallKit::inline_math_mathExact(Node* math) { +- // If we didn't get the expected opcode it means we have optimized +- // the node to something else and don't need the exception edge. +- if (!math->is_MathExact()) { +- set_result(math); +- return; +- } +- +- Node* result = _gvn.transform( new(C) ProjNode(math, MathExactNode::result_proj_node)); +- Node* flags = _gvn.transform( new(C) FlagsProjNode(math, MathExactNode::flags_proj_node)); +- +- Node* bol = _gvn.transform( new (C) BoolNode(flags, BoolTest::overflow) ); ++void LibraryCallKit::inline_math_mathExact(Node* math, Node *test) { ++ Node* bol = _gvn.transform( new (C) 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) ); +@@ -1998,108 +2022,50 @@ + } + + set_control(fast_path); +- set_result(result); ++ set_result(math); + } + +-bool LibraryCallKit::inline_math_addExactI(bool is_increment) { +- Node* arg1 = argument(0); +- Node* arg2 = NULL; +- +- if (is_increment) { +- arg2 = intcon(1); +- } else { +- arg2 = argument(1); +- } +- +- Node* add = _gvn.transform( new(C) AddExactINode(NULL, arg1, arg2) ); +- inline_math_mathExact(add); ++template ++bool LibraryCallKit::inline_math_overflow(Node* arg1, Node* arg2) { ++ typedef typename OverflowOp::MathOp MathOp; ++ ++ MathOp* mathOp = new(C) MathOp(arg1, arg2); ++ Node* operation = _gvn.transform( mathOp ); ++ Node* ofcheck = _gvn.transform( new(C) OverflowOp(arg1, arg2) ); ++ inline_math_mathExact(operation, ofcheck); + return true; + } + ++bool LibraryCallKit::inline_math_addExactI(bool is_increment) { ++ return inline_math_overflow(argument(0), is_increment ? intcon(1) : argument(1)); ++} ++ + bool LibraryCallKit::inline_math_addExactL(bool is_increment) { +- Node* arg1 = argument(0); // type long +- // argument(1) == TOP +- Node* arg2 = NULL; +- +- if (is_increment) { +- arg2 = longcon(1); +- } else { +- arg2 = argument(2); // type long +- // argument(3) == TOP +- } +- +- Node* add = _gvn.transform(new(C) AddExactLNode(NULL, arg1, arg2)); +- inline_math_mathExact(add); +- return true; ++ return inline_math_overflow(argument(0), is_increment ? longcon(1) : argument(2)); + } + + bool LibraryCallKit::inline_math_subtractExactI(bool is_decrement) { +- Node* arg1 = argument(0); +- Node* arg2 = NULL; +- +- if (is_decrement) { +- arg2 = intcon(1); +- } else { +- arg2 = argument(1); +- } +- +- Node* sub = _gvn.transform(new(C) SubExactINode(NULL, arg1, arg2)); +- inline_math_mathExact(sub); +- return true; ++ return inline_math_overflow(argument(0), is_decrement ? intcon(1) : argument(1)); + } + + bool LibraryCallKit::inline_math_subtractExactL(bool is_decrement) { +- Node* arg1 = argument(0); // type long +- // argument(1) == TOP +- Node* arg2 = NULL; +- +- if (is_decrement) { +- arg2 = longcon(1); +- } else { +- arg2 = argument(2); // type long +- // argument(3) == TOP +- } +- +- Node* sub = _gvn.transform(new(C) SubExactLNode(NULL, arg1, arg2)); +- inline_math_mathExact(sub); +- return true; ++ return inline_math_overflow(argument(0), is_decrement ? longcon(1) : argument(2)); + } + + bool LibraryCallKit::inline_math_negateExactI() { +- Node* arg1 = argument(0); +- +- Node* neg = _gvn.transform(new(C) NegExactINode(NULL, arg1)); +- inline_math_mathExact(neg); +- return true; ++ return inline_math_overflow(intcon(0), argument(0)); + } + + bool LibraryCallKit::inline_math_negateExactL() { +- Node* arg1 = argument(0); +- // argument(1) == TOP +- +- Node* neg = _gvn.transform(new(C) NegExactLNode(NULL, arg1)); +- inline_math_mathExact(neg); +- return true; ++ return inline_math_overflow(longcon(0), argument(0)); + } + + bool LibraryCallKit::inline_math_multiplyExactI() { +- Node* arg1 = argument(0); +- Node* arg2 = argument(1); +- +- Node* mul = _gvn.transform(new(C) MulExactINode(NULL, arg1, arg2)); +- inline_math_mathExact(mul); +- return true; ++ return inline_math_overflow(argument(0), argument(1)); + } + + bool LibraryCallKit::inline_math_multiplyExactL() { +- Node* arg1 = argument(0); +- // argument(1) == TOP +- Node* arg2 = argument(2); +- // argument(3) == TOP +- +- Node* mul = _gvn.transform(new(C) MulExactLNode(NULL, arg1, arg2)); +- inline_math_mathExact(mul); +- return true; ++ return inline_math_overflow(argument(0), argument(2)); + } + + Node* +@@ -2627,8 +2593,13 @@ + // rough approximation of type. + need_mem_bar = true; + // For Stores, place a memory ordering barrier now. +- if (is_store) ++ if (is_store) { + insert_mem_bar(Op_MemBarRelease); ++ } else { ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ insert_mem_bar(Op_MemBarVolatile); ++ } ++ } + } + + // Memory barrier to prevent normal and 'unsafe' accesses from +@@ -2640,7 +2611,7 @@ + if (need_mem_bar) insert_mem_bar(Op_MemBarCPUOrder); + + if (!is_store) { +- Node* p = make_load(control(), adr, value_type, type, adr_type, is_volatile); ++ Node* p = make_load(control(), adr, value_type, type, adr_type, MemNode::unordered, is_volatile); + // load value + switch (type) { + case T_BOOLEAN: +@@ -2660,7 +2631,7 @@ + case T_ADDRESS: + // Cast to an int type. + p = _gvn.transform(new (C) CastP2XNode(NULL, p)); +- p = ConvX2L(p); ++ p = ConvX2UL(p); + break; + default: + fatal(err_msg_res("unexpected type %d: %s", type, type2name(type))); +@@ -2684,13 +2655,14 @@ + break; + } + ++ MemNode::MemOrd mo = is_volatile ? MemNode::release : MemNode::unordered; + if (type != T_OBJECT ) { +- (void) store_to_memory(control(), adr, val, type, adr_type, is_volatile); ++ (void) store_to_memory(control(), adr, val, type, adr_type, mo, is_volatile); + } else { + // Possibly an oop being stored to Java heap or native memory + if (!TypePtr::NULL_PTR->higher_equal(_gvn.type(heap_base_oop))) { + // oop to Java heap. +- (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type); ++ (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type, mo); + } else { + // We can't tell at compile time if we are storing in the Java heap or outside + // of it. So we need to emit code to conditionally do the proper type of +@@ -2702,11 +2674,11 @@ + __ if_then(heap_base_oop, BoolTest::ne, null(), PROB_UNLIKELY(0.999)); { + // Sync IdealKit and graphKit. + sync_kit(ideal); +- Node* st = store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type); ++ Node* st = store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type, mo); + // Update IdealKit memory. + __ sync_kit(this); + } __ else_(); { +- __ store(__ ctrl(), adr, val, type, alias_type->index(), is_volatile); ++ __ store(__ ctrl(), adr, val, type, alias_type->index(), mo, is_volatile); + } __ end_if(); + // Final sync IdealKit and GraphKit. + final_sync(ideal); +@@ -2716,10 +2688,13 @@ + } + + if (is_volatile) { +- if (!is_store) ++ if (!is_store) { + insert_mem_bar(Op_MemBarAcquire); +- else +- insert_mem_bar(Op_MemBarVolatile); ++ } else { ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ insert_mem_bar(Op_MemBarVolatile); ++ } ++ } + } + + if (need_mem_bar) insert_mem_bar(Op_MemBarCPUOrder); +@@ -2979,12 +2954,12 @@ + Node *newval_enc = _gvn.transform(new (C) 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())); ++ 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, +- newval_enc, oldval_enc)); ++ newval_enc, oldval_enc)); + } + } else + #endif +@@ -3090,9 +3065,9 @@ + const bool require_atomic_access = true; + Node* store; + if (type == T_OBJECT) // reference stores need a store barrier. +- store = store_oop_to_unknown(control(), base, adr, adr_type, val, type); ++ store = store_oop_to_unknown(control(), base, adr, adr_type, val, type, MemNode::release); + else { +- store = store_to_memory(control(), adr, val, type, adr_type, require_atomic_access); ++ store = store_to_memory(control(), adr, val, type, adr_type, MemNode::release, require_atomic_access); + } + insert_mem_bar(Op_MemBarCPUOrder); + return true; +@@ -3104,10 +3079,10 @@ + insert_mem_bar(Op_MemBarCPUOrder); + switch(id) { + case vmIntrinsics::_loadFence: +- insert_mem_bar(Op_MemBarAcquire); ++ insert_mem_bar(Op_LoadFence); + return true; + case vmIntrinsics::_storeFence: +- insert_mem_bar(Op_MemBarRelease); ++ insert_mem_bar(Op_StoreFence); + return true; + case vmIntrinsics::_fullFence: + insert_mem_bar(Op_MemBarVolatile); +@@ -3152,7 +3127,7 @@ + Node* insp = basic_plus_adr(kls, in_bytes(InstanceKlass::init_state_offset())); + // Use T_BOOLEAN for InstanceKlass::_init_state so the compiler + // can generate code to load it as unsigned byte. +- Node* inst = make_load(NULL, insp, TypeInt::UBYTE, T_BOOLEAN); ++ 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)); + // The 'test' is non-zero if we need to take a slow path. +@@ -3176,14 +3151,14 @@ + kls = null_check(kls, T_OBJECT); + ByteSize offset = TRACE_ID_OFFSET; + Node* insp = basic_plus_adr(kls, in_bytes(offset)); +- Node* tvalue = make_load(NULL, insp, TypeLong::LONG, T_LONG); ++ 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* clsused = longcon(0x01l); // set the class bit + Node* orl = _gvn.transform(new (C) OrLNode(tvalue, clsused)); + + const TypePtr *adr_type = _gvn.type(insp)->isa_ptr(); +- store_to_memory(control(), insp, orl, T_LONG, adr_type); ++ store_to_memory(control(), insp, orl, T_LONG, adr_type, MemNode::unordered); + set_result(andl); + return true; + } +@@ -3192,15 +3167,15 @@ + Node* tls_ptr = NULL; + Node* cur_thr = generate_current_thread(tls_ptr); + Node* p = basic_plus_adr(top()/*!oop*/, tls_ptr, in_bytes(JavaThread::osthread_offset())); +- Node* osthread = make_load(NULL, p, TypeRawPtr::NOTNULL, T_ADDRESS); ++ Node* osthread = make_load(NULL, p, TypeRawPtr::NOTNULL, T_ADDRESS, MemNode::unordered); + p = basic_plus_adr(top()/*!oop*/, osthread, in_bytes(OSThread::thread_id_offset())); + + Node* threadid = NULL; + size_t thread_id_size = OSThread::thread_id_size(); + if (thread_id_size == (size_t) BytesPerLong) { +- threadid = ConvL2I(make_load(control(), p, TypeLong::LONG, T_LONG)); ++ threadid = ConvL2I(make_load(control(), p, TypeLong::LONG, T_LONG, MemNode::unordered)); + } else if (thread_id_size == (size_t) BytesPerInt) { +- threadid = make_load(control(), p, TypeInt::INT, T_INT); ++ threadid = make_load(control(), p, TypeInt::INT, T_INT, MemNode::unordered); + } else { + ShouldNotReachHere(); + } +@@ -3236,7 +3211,8 @@ + // private native boolean java.lang.Thread.isInterrupted(boolean ClearInterrupted); + bool LibraryCallKit::inline_native_isInterrupted() { + // Add a fast path to t.isInterrupted(clear_int): +- // (t == Thread.current() && (!TLS._osthread._interrupted || !clear_int)) ++ // (t == Thread.current() && ++ // (!TLS._osthread._interrupted || WINDOWS_ONLY(false) NOT_WINDOWS(!clear_int))) + // ? TLS._osthread._interrupted : /*slow path:*/ t.isInterrupted(clear_int) + // So, in the common case that the interrupt bit is false, + // we avoid making a call into the VM. Even if the interrupt bit +@@ -3275,11 +3251,11 @@ + + // (b) Interrupt bit on TLS must be false. + Node* p = basic_plus_adr(top()/*!oop*/, tls_ptr, in_bytes(JavaThread::osthread_offset())); +- Node* osthread = make_load(NULL, p, TypeRawPtr::NOTNULL, T_ADDRESS); ++ Node* osthread = make_load(NULL, p, TypeRawPtr::NOTNULL, T_ADDRESS, MemNode::unordered); + p = basic_plus_adr(top()/*!oop*/, osthread, in_bytes(OSThread::interrupted_offset())); + + // 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); ++ 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)); + +@@ -3293,6 +3269,7 @@ + // drop through to next case + set_control( _gvn.transform(new (C) 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))); +@@ -3306,6 +3283,10 @@ + + // drop through to next case + set_control( _gvn.transform(new (C) 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. ++#endif // TARGET_OS_FAMILY_windows + + // (d) Otherwise, go to the slow path. + slow_region->add_req(control()); +@@ -3347,7 +3328,7 @@ + // Given a klass oop, load its java mirror (a java.lang.Class oop). + Node* LibraryCallKit::load_mirror_from_klass(Node* klass) { + Node* p = basic_plus_adr(klass, in_bytes(Klass::java_mirror_offset())); +- return make_load(NULL, p, TypeInstPtr::MIRROR, T_OBJECT); ++ return make_load(NULL, p, TypeInstPtr::MIRROR, T_OBJECT, MemNode::unordered); + } + + //-----------------------load_klass_from_mirror_common------------------------- +@@ -3384,7 +3365,7 @@ + // Branch around if the given klass has the given modifier bit set. + // Like generate_guard, adds a new path onto the region. + Node* modp = basic_plus_adr(kls, in_bytes(Klass::access_flags_offset())); +- Node* mods = make_load(NULL, modp, TypeInt::INT, T_INT); ++ 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)); +@@ -3501,7 +3482,7 @@ + + case vmIntrinsics::_getModifiers: + p = basic_plus_adr(kls, in_bytes(Klass::modifier_flags_offset())); +- query_value = make_load(NULL, p, TypeInt::INT, T_INT); ++ query_value = make_load(NULL, p, TypeInt::INT, T_INT, MemNode::unordered); + break; + + case vmIntrinsics::_isInterface: +@@ -3559,7 +3540,7 @@ + // Be sure to pin the oop load to the guard edge just created: + Node* is_array_ctrl = region->in(region->req()-1); + Node* cma = basic_plus_adr(kls, in_bytes(ArrayKlass::component_mirror_offset())); +- Node* cmo = make_load(is_array_ctrl, cma, TypeInstPtr::MIRROR, T_OBJECT); ++ Node* cmo = make_load(is_array_ctrl, cma, TypeInstPtr::MIRROR, T_OBJECT, MemNode::unordered); + phi->add_req(cmo); + } + query_value = null(); // non-array case is null +@@ -3567,7 +3548,7 @@ + + case vmIntrinsics::_getClassAccessFlags: + p = basic_plus_adr(kls, in_bytes(Klass::access_flags_offset())); +- query_value = make_load(NULL, p, TypeInt::INT, T_INT); ++ query_value = make_load(NULL, p, TypeInt::INT, T_INT, MemNode::unordered); + break; + + default: +@@ -3933,7 +3914,7 @@ + vtable_index*vtableEntry::size()) * wordSize + + vtableEntry::method_offset_in_bytes(); + Node* entry_addr = basic_plus_adr(obj_klass, entry_offset); +- Node* target_call = make_load(NULL, entry_addr, TypePtr::NOTNULL, T_ADDRESS); ++ Node* target_call = make_load(NULL, entry_addr, TypePtr::NOTNULL, T_ADDRESS, MemNode::unordered); + + // Compare the target method with the expected method (e.g., Object.hashCode). + const TypePtr* native_call_addr = TypeMetadataPtr::make(method); +@@ -3997,8 +3978,11 @@ + } + + +-//------------------------------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"); +@@ -4006,11 +3990,9 @@ + 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_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); ++ PhiNode* result_mem = new(C) PhiNode(result_reg, Type::MEMORY, TypePtr::BOTTOM); + Node* obj = NULL; + if (!is_static) { + // Check for hashing null object +@@ -4036,12 +4018,6 @@ + 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); +@@ -4054,19 +4030,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()); ++ // 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 *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* lock_mask = _gvn.MakeConX(markOopDesc::biased_lock_mask_in_place); ++ Node* lmasked_header = _gvn.transform(new (C) 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)); + + generate_slow_guard(test_unlocked, slow_region); + +@@ -4074,19 +4055,19 @@ + // We depend on hash_mask being at most 32 bits and avoid the use of + // hash_mask_in_place because it could be larger than 32 bits in a 64-bit + // 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* 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)); + // 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 *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* hash_val = _gvn.transform(new (C) 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)); + + generate_slow_guard(test_assigned, slow_region); + +@@ -4595,7 +4576,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()); + +@@ -5480,7 +5464,7 @@ + // Store a zero to the immediately preceding jint: + Node* x1 = _gvn.transform(new(C) 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); ++ mem = StoreNode::make(_gvn, control(), mem, p1, adr_type, intcon(0), T_INT, MemNode::unordered); + mem = _gvn.transform(mem); + } + } +@@ -5530,8 +5514,8 @@ + ((src_off ^ dest_off) & (BytesPerLong-1)) == 0) { + Node* sptr = basic_plus_adr(src, src_off); + Node* dptr = basic_plus_adr(dest, dest_off); +- Node* sval = make_load(control(), sptr, TypeInt::INT, T_INT, adr_type); +- store_to_memory(control(), dptr, sval, T_INT, adr_type); ++ Node* sval = make_load(control(), sptr, TypeInt::INT, T_INT, adr_type, MemNode::unordered); ++ store_to_memory(control(), dptr, sval, T_INT, adr_type, MemNode::unordered); + src_off += BytesPerInt; + dest_off += BytesPerInt; + } else { +@@ -5596,7 +5580,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()); ++ Node* n3 = new(C) 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; + +@@ -5737,7 +5721,7 @@ + Node* base = makecon(TypeRawPtr::make(StubRoutines::crc_table_addr())); + Node* offset = _gvn.transform(new (C) LShiftINode(result, intcon(0x2))); + Node* adr = basic_plus_adr(top(), base, ConvI2X(offset)); +- result = make_load(control(), adr, TypeInt::INT, T_INT); ++ 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)); +@@ -5838,7 +5822,7 @@ + const TypeOopPtr* object_type = TypeOopPtr::make_from_klass(klass); + + Node* no_ctrl = NULL; +- Node* result = make_load(no_ctrl, adr, object_type, T_OBJECT); ++ Node* result = make_load(no_ctrl, adr, object_type, T_OBJECT, MemNode::unordered); + + // Use the pre-barrier to record the value in the referent field + pre_barrier(false /* do_load */, +@@ -5885,7 +5869,7 @@ + const Type *type = TypeOopPtr::make_from_klass(field_klass->as_klass()); + + // Build the load. +- Node* loadedField = make_load(NULL, adr, type, bt, adr_type, is_vol); ++ Node* loadedField = make_load(NULL, adr, type, bt, adr_type, MemNode::unordered, is_vol); + return loadedField; + } + +@@ -5936,10 +5920,22 @@ + Node* k_start = get_key_start_from_aescrypt_object(aescrypt_object); + if (k_start == NULL) return false; + +- // Call the stub. +- make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::aescrypt_block_Type(), +- stubAddr, stubName, TypePtr::BOTTOM, +- src_start, dest_start, k_start); ++ if (Matcher::pass_original_key_for_aes()) { ++ // on SPARC we need to pass the original key since key expansion needs to happen in intrinsics due to ++ // compatibility issues between Java key expansion and SPARC crypto instructions ++ Node* original_k_start = get_original_key_start_from_aescrypt_object(aescrypt_object); ++ if (original_k_start == NULL) return false; ++ ++ // Call the stub. ++ make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::aescrypt_block_Type(), ++ stubAddr, stubName, TypePtr::BOTTOM, ++ src_start, dest_start, k_start, original_k_start); ++ } else { ++ // Call the stub. ++ make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::aescrypt_block_Type(), ++ stubAddr, stubName, TypePtr::BOTTOM, ++ src_start, dest_start, k_start); ++ } + + return true; + } +@@ -6017,14 +6013,29 @@ + if (objRvec == NULL) return false; + Node* r_start = array_element_address(objRvec, intcon(0), T_BYTE); + +- // Call the stub, passing src_start, dest_start, k_start, r_start and src_len +- make_runtime_call(RC_LEAF|RC_NO_FP, +- OptoRuntime::cipherBlockChaining_aescrypt_Type(), +- stubAddr, stubName, TypePtr::BOTTOM, +- src_start, dest_start, k_start, r_start, len); +- +- // return is void so no result needs to be pushed +- ++ Node* cbcCrypt; ++ if (Matcher::pass_original_key_for_aes()) { ++ // on SPARC we need to pass the original key since key expansion needs to happen in intrinsics due to ++ // compatibility issues between Java key expansion and SPARC crypto instructions ++ Node* original_k_start = get_original_key_start_from_aescrypt_object(aescrypt_object); ++ if (original_k_start == NULL) return false; ++ ++ // Call the stub, passing src_start, dest_start, k_start, r_start, src_len and original_k_start ++ cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP, ++ OptoRuntime::cipherBlockChaining_aescrypt_Type(), ++ stubAddr, stubName, TypePtr::BOTTOM, ++ src_start, dest_start, k_start, r_start, len, original_k_start); ++ } else { ++ // Call the stub, passing src_start, dest_start, k_start, r_start and src_len ++ cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP, ++ OptoRuntime::cipherBlockChaining_aescrypt_Type(), ++ stubAddr, stubName, TypePtr::BOTTOM, ++ src_start, dest_start, k_start, r_start, len); ++ } ++ ++ // return cipher length (int) ++ Node* retvalue = _gvn.transform(new (C) ProjNode(cbcCrypt, TypeFunc::Parms)); ++ set_result(retvalue); + return true; + } + +@@ -6039,6 +6050,17 @@ + return k_start; + } + ++//------------------------------get_original_key_start_from_aescrypt_object----------------------- ++Node * LibraryCallKit::get_original_key_start_from_aescrypt_object(Node *aescrypt_object) { ++ Node* objAESCryptKey = load_field_from_object(aescrypt_object, "lastKey", "[B", /*is_exact*/ false); ++ assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt"); ++ if (objAESCryptKey == NULL) return (Node *) NULL; ++ ++ // now have the array, need to get the start address of the lastKey array ++ Node* original_k_start = array_element_address(objAESCryptKey, intcon(0), T_BYTE); ++ return original_k_start; ++} ++ + //----------------------------inline_cipherBlockChaining_AESCrypt_predicate---------------------------- + // Return node representing slow path of predicate check. + // the pseudo code we want to emulate with this predicate is: +--- ./hotspot/src/share/vm/opto/locknode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/locknode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -136,6 +136,8 @@ + //-----------------------------hash-------------------------------------------- + uint FastLockNode::hash() const { return NO_HASH; } + ++uint FastLockNode::size_of() const { return sizeof(*this); } ++ + //------------------------------cmp-------------------------------------------- + uint FastLockNode::cmp( const Node &n ) const { + return (&n == this); // Always fail except on self +@@ -159,6 +161,22 @@ + _counters = blnc->counters(); + } + ++void FastLockNode::create_rtm_lock_counter(JVMState* state) { ++#if INCLUDE_RTM_OPT ++ Compile* C = Compile::current(); ++ if (C->profile_rtm() || (PrintPreciseRTMLockingStatistics && C->use_rtm())) { ++ RTMLockingNamedCounter* rlnc = (RTMLockingNamedCounter*) ++ OptoRuntime::new_named_counter(state, NamedCounter::RTMLockingCounter); ++ _rtm_counters = rlnc->counters(); ++ if (UseRTMForStackLocks) { ++ rlnc = (RTMLockingNamedCounter*) ++ OptoRuntime::new_named_counter(state, NamedCounter::RTMLockingCounter); ++ _stack_rtm_counters = rlnc->counters(); ++ } ++ } ++#endif ++} ++ + //============================================================================= + //------------------------------do_monitor_enter------------------------------- + void Parse::do_monitor_enter() { +--- ./hotspot/src/share/vm/opto/locknode.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/locknode.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -43,8 +43,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" + #endif + + //------------------------------BoxLockNode------------------------------------ +@@ -89,13 +92,17 @@ + //------------------------------FastLockNode----------------------------------- + class FastLockNode: public CmpNode { + private: +- BiasedLockingCounters* _counters; ++ BiasedLockingCounters* _counters; ++ RTMLockingCounters* _rtm_counters; // RTM lock counters for inflated locks ++ RTMLockingCounters* _stack_rtm_counters; // RTM lock counters for stack locks + + public: + FastLockNode(Node *ctrl, Node *oop, Node *box) : CmpNode(oop,box) { + init_req(0,ctrl); + init_class_id(Class_FastLock); + _counters = NULL; ++ _rtm_counters = NULL; ++ _stack_rtm_counters = NULL; + } + Node* obj_node() const { return in(1); } + Node* box_node() const { return in(2); } +@@ -104,13 +111,17 @@ + // FastLock and FastUnlockNode do not hash, we need one for each correspoding + // LockNode/UnLockNode to avoid creating Phi's. + virtual uint hash() const ; // { return NO_HASH; } ++ virtual uint size_of() const; + virtual uint cmp( const Node &n ) const ; // Always fail, except on self + virtual int Opcode() const; + virtual const Type *Value( PhaseTransform *phase ) const { return TypeInt::CC; } + const Type *sub(const Type *t1, const Type *t2) const { return TypeInt::CC;} + + void create_lock_counter(JVMState* s); +- BiasedLockingCounters* counters() const { return _counters; } ++ void create_rtm_lock_counter(JVMState* state); ++ BiasedLockingCounters* counters() const { return _counters; } ++ RTMLockingCounters* rtm_counters() const { return _rtm_counters; } ++ RTMLockingCounters* stack_rtm_counters() const { return _stack_rtm_counters; } + }; + + +--- ./hotspot/src/share/vm/opto/loopPredicate.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/loopPredicate.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -637,7 +637,7 @@ + + if (TraceLoopPredicate) { + predString->print_cr("print(predString->as_string()); ++ tty->print("%s", predString->as_string()); + } + return bol; + } +--- ./hotspot/src/share/vm/opto/loopTransform.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/loopTransform.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -617,6 +617,15 @@ + case Op_AryEq: { + return false; + } ++#if INCLUDE_RTM_OPT ++ case Op_FastLock: ++ case Op_FastUnlock: { ++ // Don't unroll RTM locking code because it is large. ++ if (UseRTMLocking) { ++ return false; ++ } ++ } ++#endif + } // switch + } + +@@ -713,10 +722,6 @@ + case Op_ModL: body_size += 30; break; + case Op_DivL: body_size += 30; break; + case Op_MulL: body_size += 10; break; +- case Op_FlagsProj: +- // Can't handle unrolling of loops containing +- // nodes that generate a FlagsProj at the moment +- return false; + case Op_StrComp: + case Op_StrEquals: + case Op_StrIndexOf: +@@ -726,6 +731,15 @@ + // String intrinsics are large and have loops. + return false; + } ++#if INCLUDE_RTM_OPT ++ case Op_FastLock: ++ case Op_FastUnlock: { ++ // Don't unroll RTM locking code because it is large. ++ if (UseRTMLocking) { ++ return false; ++ } ++ } ++#endif + } // switch + } + +@@ -780,10 +794,6 @@ + continue; // not RC + + Node *cmp = bol->in(1); +- if (cmp->is_FlagsProj()) { +- continue; +- } +- + Node *rc_exp = cmp->in(1); + Node *limit = cmp->in(2); + +@@ -1137,6 +1147,7 @@ + // Now force out all loop-invariant dominating tests. The optimizer + // finds some, but we _know_ they are all useless. + peeled_dom_test_elim(loop,old_new); ++ loop->record_for_igvn(); + } + + //------------------------------is_invariant----------------------------- +@@ -2699,27 +2710,38 @@ + _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); ++ _igvn.register_new_node_with_optimizer(store_value); ++ } ++ + Node* mem_phi = store->in(MemNode::Memory); + 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)); +- call->init_req(TypeFunc::Parms+0, from); +- call->init_req(TypeFunc::Parms+1, store_value); ++ uint cnt = 0; ++ call->init_req(TypeFunc::Parms + cnt++, from); ++ call->init_req(TypeFunc::Parms + cnt++, store_value); ++ if (CCallingConventionRequiresIntsAsLongs) { ++ call->init_req(TypeFunc::Parms + cnt++, C->top()); ++ } + #ifdef _LP64 + len = new (C) ConvI2LNode(len); + _igvn.register_new_node_with_optimizer(len); + #endif +- call->init_req(TypeFunc::Parms+2, len); ++ call->init_req(TypeFunc::Parms + cnt++, len); + #ifdef _LP64 +- call->init_req(TypeFunc::Parms+3, C->top()); ++ call->init_req(TypeFunc::Parms + cnt++, C->top()); + #endif +- call->init_req( TypeFunc::Control, head->init_control()); +- call->init_req( TypeFunc::I_O , C->top() ) ; // does no i/o +- call->init_req( TypeFunc::Memory , mem_phi->in(LoopNode::EntryControl) ); +- call->init_req( TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr) ); +- call->init_req( TypeFunc::FramePtr, C->start()->proj_out(TypeFunc::FramePtr) ); ++ call->init_req(TypeFunc::Control, head->init_control()); ++ call->init_req(TypeFunc::I_O, C->top()); // Does no I/O. ++ call->init_req(TypeFunc::Memory, mem_phi->in(LoopNode::EntryControl)); ++ 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); + _igvn.register_new_node_with_optimizer(result_ctrl); +--- ./hotspot/src/share/vm/opto/loopnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/loopnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -266,9 +266,9 @@ + + // Counted loop head must be a good RegionNode with only 3 not NULL + // control input edges: Self, Entry, LoopBack. +- if (x->in(LoopNode::Self) == NULL || x->req() != 3) ++ if (x->in(LoopNode::Self) == NULL || x->req() != 3 || loop->_irreducible) { + return false; +- ++ } + Node *init_control = x->in(LoopNode::EntryControl); + Node *back_control = x->in(LoopNode::LoopBackControl); + if (init_control == NULL || back_control == NULL) // Partially dead +@@ -1522,11 +1522,11 @@ + + // If I have one hot backedge, peel off myself loop. + // I better be the outermost loop. +- if( _head->req() > 3 ) { ++ if (_head->req() > 3 && !_irreducible) { + split_outer_loop( phase ); + result = true; + +- } else if( !_head->is_Loop() && !_irreducible ) { ++ } 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) ); + l = igvn.register_new_node_with_optimizer(l, _head); +@@ -2938,6 +2938,7 @@ + return pre_order; + } + } ++ C->set_has_irreducible_loop(_has_irreducible_loops); + } + + // This Node might be a decision point for loops. It is only if +@@ -3171,17 +3172,16 @@ + bool had_error = false; + #ifdef ASSERT + if (early != C->root()) { +- // Make sure that there's a dominance path from use to LCA +- Node* d = use; +- while (d != LCA) { +- d = idom(d); ++ // Make sure that there's a dominance path from LCA to early ++ Node* d = LCA; ++ while (d != early) { + if (d == C->root()) { +- tty->print_cr("*** Use %d isn't dominated by def %s", use->_idx, n->_idx); +- n->dump(); +- use->dump(); ++ dump_bad_graph("Bad graph detected in compute_lca_of_uses", n, early, LCA); ++ tty->print_cr("*** Use %d isn't dominated by def %d ***", use->_idx, n->_idx); + had_error = true; + break; + } ++ d = idom(d); + } + } + #endif +@@ -3434,6 +3434,13 @@ + _igvn._worklist.push(n); // Maybe we'll normalize it, if no more loops. + } + ++#ifdef ASSERT ++ if (_verify_only && !n->is_CFG()) { ++ // Check def-use domination. ++ compute_lca_of_uses(n, get_ctrl(n), true /* verify */); ++ } ++#endif ++ + // CFG and pinned nodes already handled + if( n->in(0) ) { + if( n->in(0)->is_top() ) return; // Dead? +@@ -3561,7 +3568,7 @@ + + #ifdef ASSERT + void PhaseIdealLoop::dump_bad_graph(const char* msg, Node* n, Node* early, Node* LCA) { +- tty->print_cr(msg); ++ tty->print_cr("%s", msg); + tty->print("n: "); n->dump(); + tty->print("early(n): "); early->dump(); + if (n->in(0) != NULL && !n->in(0)->is_top() && +--- ./hotspot/src/share/vm/opto/loopopts.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/loopopts.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -43,12 +43,6 @@ + return NULL; + } + +- if (n->is_MathExact()) { +- // MathExact has projections that are not correctly handled in the code +- // below. +- return NULL; +- } +- + int wins = 0; + assert(!n->is_CFG(), ""); + assert(region->is_Region(), ""); +@@ -1115,8 +1109,8 @@ + Node *n2 = phi->in(i)->in(1)->in(2); + phi1->set_req( i, n1 ); + phi2->set_req( i, n2 ); +- phi1->set_type( phi1->type()->meet(n1->bottom_type()) ); +- phi2->set_type( phi2->type()->meet(n2->bottom_type()) ); ++ phi1->set_type( phi1->type()->meet_speculative(n1->bottom_type())); ++ phi2->set_type( phi2->type()->meet_speculative(n2->bottom_type())); + } + // See if these Phis have been made before. + // Register with optimizer +@@ -1189,8 +1183,8 @@ + } + phi1->set_req( j, n1 ); + phi2->set_req( j, n2 ); +- phi1->set_type( phi1->type()->meet(n1->bottom_type()) ); +- phi2->set_type( phi2->type()->meet(n2->bottom_type()) ); ++ phi1->set_type(phi1->type()->meet_speculative(n1->bottom_type())); ++ phi2->set_type(phi2->type()->meet_speculative(n2->bottom_type())); + } + + // See if these Phis have been made before. +@@ -1407,7 +1401,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 ) +@@ -2362,8 +2357,7 @@ + opc == Op_Catch || + opc == Op_CatchProj || + opc == Op_Jump || +- opc == Op_JumpProj || +- opc == Op_FlagsProj) { ++ opc == Op_JumpProj) { + #if !defined(PRODUCT) + if (TracePartialPeeling) { + tty->print_cr("\nExit control too complex: lp: %d", head->_idx); +@@ -2705,6 +2699,7 @@ + // Inhibit more partial peeling on this loop + new_head_clone->set_partial_peel_loop(); + C->set_major_progress(); ++ loop->record_for_igvn(); + + #if !defined(PRODUCT) + if (TracePartialPeeling) { +@@ -2774,11 +2769,11 @@ + // 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 ); ++ 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 ); ++ register_new_node(post, exit); + _igvn.rehash_node_delayed(use); + for (uint j = 1; j < use->req(); j++) { + if (use->in(j) == phi) +--- ./hotspot/src/share/vm/opto/machnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/machnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -134,6 +134,10 @@ + ShouldNotCallThis(); + } + ++//---------------------------postalloc_expand---------------------------------- ++// Expand node after register allocation. ++void MachNode::postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_) {} ++ + //------------------------------size------------------------------------------- + // Size of instruction in bytes + uint MachNode::size(PhaseRegAlloc *ra_) const { +@@ -393,6 +397,17 @@ + return skipped; + } + ++int MachNode::operand_index(const MachOper *oper) const { ++ uint skipped = oper_input_base(); // Sum of leaves skipped so far ++ uint opcnt; ++ for (opcnt = 1; opcnt < num_opnds(); opcnt++) { ++ if (_opnds[opcnt] == oper) break; ++ uint num_edges = _opnds[opcnt]->num_edges(); // leaves for operand ++ skipped += num_edges; ++ } ++ if (_opnds[opcnt] != oper) return -1; ++ return skipped; ++} + + //------------------------------peephole--------------------------------------- + // Apply peephole rule(s) to this instruction +@@ -501,6 +516,9 @@ + return _constant.offset(); + } + ++int MachConstantNode::constant_offset_unchecked() const { ++ return _constant.offset(); ++} + + //============================================================================= + #ifndef PRODUCT +@@ -641,10 +659,15 @@ + + + //------------------------------Registers-------------------------------------- +-const RegMask &MachCallNode::in_RegMask( uint idx ) const { ++const RegMask &MachCallNode::in_RegMask(uint idx) const { + // Values in the domain use the users calling convention, embodied in the + // _in_rms array of RegMasks. +- if (idx < tf()->domain()->cnt()) return _in_rms[idx]; ++ if (idx < tf()->domain()->cnt()) { ++ return _in_rms[idx]; ++ } ++ if (idx == mach_constant_base_node_input()) { ++ return MachConstantBaseNode::static_out_RegMask(); ++ } + // Values outside the domain represent debug info + return *Compile::current()->matcher()->idealreg2debugmask[in(idx)->ideal_reg()]; + } +@@ -671,7 +694,12 @@ + const RegMask &MachCallJavaNode::in_RegMask(uint idx) const { + // Values in the domain use the users calling convention, embodied in the + // _in_rms array of RegMasks. +- if (idx < tf()->domain()->cnt()) return _in_rms[idx]; ++ if (idx < tf()->domain()->cnt()) { ++ return _in_rms[idx]; ++ } ++ if (idx == mach_constant_base_node_input()) { ++ return MachConstantBaseNode::static_out_RegMask(); ++ } + // Values outside the domain represent debug info + Matcher* m = Compile::current()->matcher(); + // If this call is a MethodHandle invoke we have to use a different +--- ./hotspot/src/share/vm/opto/machnode.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/machnode.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -31,6 +31,7 @@ + #include "opto/node.hpp" + #include "opto/regmask.hpp" + ++class BiasedLockingCounters; + class BufferBlob; + class CodeBuffer; + class JVMState; +@@ -52,6 +53,7 @@ + class Matcher; + class PhaseRegAlloc; + class RegMask; ++class RTMLockingCounters; + class State; + + //---------------------------MachOper------------------------------------------ +@@ -102,6 +104,15 @@ + return ::as_XMMRegister(reg(ra_, node, idx)); + } + #endif ++ // CondRegister reg converter ++#if defined(PPC64) ++ ConditionRegister as_ConditionRegister(PhaseRegAlloc *ra_, const Node *node) const { ++ return ::as_ConditionRegister(reg(ra_, node)); ++ } ++ ConditionRegister as_ConditionRegister(PhaseRegAlloc *ra_, const Node *node, int idx) const { ++ return ::as_ConditionRegister(reg(ra_, node, idx)); ++ } ++#endif + + virtual intptr_t constant() const; + virtual relocInfo::relocType constant_reloc() const; +@@ -155,7 +166,15 @@ + virtual void ext_format(PhaseRegAlloc *,const MachNode *node,int idx, outputStream *st) const=0; + + virtual void dump_spec(outputStream *st) const; // Print per-operand info +-#endif ++ ++ // Check whether o is a valid oper. ++ static bool notAnOper(const MachOper *o) { ++ if (o == NULL) return true; ++ if (((intptr_t)o & 1) != 0) return true; ++ if (*(address*)o == badAddress) return true; // kill by Node::destruct ++ return false; ++ } ++#endif // !PRODUCT + }; + + //------------------------------MachNode--------------------------------------- +@@ -173,6 +192,9 @@ + // Number of inputs which come before the first operand. + // Generally at least 1, to skip the Control input + virtual uint oper_input_base() const { return 1; } ++ // Position of constant base node in node's inputs. -1 if ++ // no constant base node input. ++ virtual uint mach_constant_base_node_input() const { return (uint)-1; } + + // Copy inputs and operands to new node of instruction. + // Called from cisc_version() and short_branch_version(). +@@ -188,13 +210,21 @@ + bool may_be_short_branch() const { return (flags() & Flag_may_be_short_branch) != 0; } + + // Avoid back to back some instructions on some CPUs. +- bool avoid_back_to_back() const { return (flags() & Flag_avoid_back_to_back) != 0; } ++ enum AvoidBackToBackFlag { AVOID_NONE = 0, ++ AVOID_BEFORE = Flag_avoid_back_to_back_before, ++ AVOID_AFTER = Flag_avoid_back_to_back_after, ++ AVOID_BEFORE_AND_AFTER = AVOID_BEFORE | AVOID_AFTER }; ++ ++ bool avoid_back_to_back(AvoidBackToBackFlag flag_value) const { ++ return (flags() & flag_value) == flag_value; ++ } + + // instruction implemented with a call + bool has_call() const { return (flags() & Flag_has_call) != 0; } + + // First index in _in[] corresponding to operand, or -1 if there is none + int operand_index(uint operand) const; ++ int operand_index(const MachOper *oper) const; + + // Register class input is expected in + virtual const RegMask &in_RegMask(uint) const; +@@ -220,6 +250,12 @@ + + // Emit bytes into cbuf + virtual void emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const; ++ // Expand node after register allocation. ++ // Node is replaced by several nodes in the postalloc expand phase. ++ // Corresponding methods are generated for nodes if they specify ++ // postalloc_expand. See block.cpp for more documentation. ++ virtual bool requires_postalloc_expand() const { return false; } ++ virtual void postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_); + // Size of instruction in bytes + virtual uint size(PhaseRegAlloc *ra_) const; + // Helper function that computes size by emitting code +@@ -236,6 +272,9 @@ + // Return number of relocatable values contained in this instruction + virtual int reloc() const { return 0; } + ++ // Return number of words used for double constants in this instruction ++ virtual int ins_num_consts() const { return 0; } ++ + // Hash and compare over operands. Used to do GVN on machine Nodes. + virtual uint hash() const; + virtual uint cmp( const Node &n ) const; +@@ -293,6 +332,9 @@ + static const Pipeline *pipeline_class(); + virtual const Pipeline *pipeline() const; + ++ // Returns true if this node is a check that can be implemented with a trap. ++ virtual bool is_TrapBasedCheckNode() const { return false; } ++ + #ifndef PRODUCT + virtual const char *Name() const = 0; // Machine-specific name + virtual void dump_spec(outputStream *st) const; // Print per-node info +@@ -356,6 +398,9 @@ + virtual uint ideal_reg() const { return Op_RegP; } + virtual uint oper_input_base() const { return 1; } + ++ virtual bool requires_postalloc_expand() const; ++ virtual void postalloc_expand(GrowableArray *nodes, PhaseRegAlloc *ra_); ++ + virtual void emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const; + virtual uint size(PhaseRegAlloc* ra_) const; + virtual bool pinned() const { return UseRDPCForConstantTableBase; } +@@ -395,10 +440,12 @@ + } + + // Input edge of MachConstantBaseNode. +- uint mach_constant_base_node_input() const { return req() - 1; } ++ virtual uint mach_constant_base_node_input() const { return req() - 1; } + + int constant_offset(); + int constant_offset() const { return ((MachConstantNode*) this)->constant_offset(); } ++ // Unchecked version to avoid assertions in debug output. ++ int constant_offset_unchecked() const; + }; + + //------------------------------MachUEPNode----------------------------------- +@@ -620,8 +667,9 @@ + class MachFastLockNode : public MachNode { + virtual uint size_of() const { return sizeof(*this); } // Size is bigger + public: +- BiasedLockingCounters* _counters; +- ++ BiasedLockingCounters* _counters; ++ RTMLockingCounters* _rtm_counters; // RTM lock counters for inflated locks ++ RTMLockingCounters* _stack_rtm_counters; // RTM lock counters for stack locks + MachFastLockNode() : MachNode() {} + }; + +--- ./hotspot/src/share/vm/opto/macro.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/macro.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1084,7 +1084,7 @@ + Node* PhaseMacroExpand::make_load(Node* ctl, Node* mem, Node* base, int offset, const Type* value_type, BasicType bt) { + Node* adr = basic_plus_adr(base, offset); + const TypePtr* adr_type = adr->bottom_type()->is_ptr(); +- Node* value = LoadNode::make(_igvn, ctl, mem, adr, adr_type, value_type, bt); ++ Node* value = LoadNode::make(_igvn, ctl, mem, adr, adr_type, value_type, bt, MemNode::unordered); + transform_later(value); + return value; + } +@@ -1092,7 +1092,7 @@ + + Node* PhaseMacroExpand::make_store(Node* ctl, Node* mem, Node* base, int offset, Node* value, BasicType bt) { + Node* adr = basic_plus_adr(base, offset); +- mem = StoreNode::make(_igvn, ctl, mem, adr, NULL, value, bt); ++ mem = StoreNode::make(_igvn, ctl, mem, adr, NULL, value, bt, MemNode::unordered); + transform_later(mem); + return mem; + } +@@ -1272,8 +1272,8 @@ + // 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) +- : new (C) LoadPLockedNode(contended_region, contended_phi_rawmem, eden_top_adr); ++ ? 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); + + transform_later(old_eden_top); + // Add to heap top to get a new heap top +@@ -1320,7 +1320,7 @@ + if (UseTLAB) { + Node* store_eden_top = + new (C) StorePNode(needgc_false, contended_phi_rawmem, eden_top_adr, +- TypeRawPtr::BOTTOM, new_eden_top); ++ 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; +@@ -1700,9 +1700,10 @@ + _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 (C) LoadPNode(needgc_false, + contended_phi_rawmem, eden_pf_adr, +- TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM ); ++ TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, ++ MemNode::unordered); + transform_later(old_pf_wm); + + // check against new_eden_top +@@ -1726,9 +1727,10 @@ + 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 (C) StorePNode(need_pf_true, + contended_phi_rawmem, eden_pf_adr, +- TypeRawPtr::BOTTOM, new_pf_wmt ); ++ TypeRawPtr::BOTTOM, new_pf_wmt, ++ MemNode::unordered); + transform_later(store_new_wmt); + + // adding prefetches +@@ -2437,6 +2439,7 @@ + } + } + // Next, attempt to eliminate allocations ++ _has_locks = false; + progress = true; + while (progress) { + progress = false; +@@ -2455,11 +2458,13 @@ + case Node::Class_Lock: + case Node::Class_Unlock: + assert(!n->as_AbstractLock()->is_eliminated(), "sanity"); ++ _has_locks = true; + break; + default: + assert(n->Opcode() == Op_LoopLimit || + n->Opcode() == Op_Opaque1 || +- n->Opcode() == Op_Opaque2, "unknown node type in macro list"); ++ n->Opcode() == Op_Opaque2 || ++ n->Opcode() == Op_Opaque3, "unknown node type in macro list"); + } + assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); + progress = progress || success; +@@ -2500,6 +2505,30 @@ + } else if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) { + _igvn.replace_node(n, n->in(1)); + success = true; ++#if INCLUDE_RTM_OPT ++ } else if ((n->Opcode() == Op_Opaque3) && ((Opaque3Node*)n)->rtm_opt()) { ++ assert(C->profile_rtm(), "should be used only in rtm deoptimization code"); ++ assert((n->outcnt() == 1) && n->unique_out()->is_Cmp(), ""); ++ Node* cmp = n->unique_out(); ++#ifdef ASSERT ++ // Validate graph. ++ assert((cmp->outcnt() == 1) && cmp->unique_out()->is_Bool(), ""); ++ BoolNode* bol = cmp->unique_out()->as_Bool(); ++ assert((bol->outcnt() == 1) && bol->unique_out()->is_If() && ++ (bol->_test._test == BoolTest::ne), ""); ++ IfNode* ifn = bol->unique_out()->as_If(); ++ assert((ifn->outcnt() == 2) && ++ ifn->proj_out(1)->is_uncommon_trap_proj(Deoptimization::Reason_rtm_state_change), ""); ++#endif ++ Node* repl = n->in(1); ++ if (!_has_locks) { ++ // Remove RTM state check if there are no locks in the code. ++ // Replace input to compare the same value. ++ repl = (cmp->in(1) == n) ? cmp->in(2) : cmp->in(1); ++ } ++ _igvn.replace_node(n, repl); ++ success = true; ++#endif + } + assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count"); + progress = progress || success; +--- ./hotspot/src/share/vm/opto/macro.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/macro.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -76,6 +76,8 @@ + ProjNode *_memproj_catchall; + ProjNode *_resproj; + ++ // Additional data collected during macro expansion ++ bool _has_locks; + + void expand_allocate(AllocateNode *alloc); + void expand_allocate_array(AllocateArrayNode *alloc); +@@ -118,7 +120,7 @@ + Node* length); + + public: +- PhaseMacroExpand(PhaseIterGVN &igvn) : Phase(Macro_Expand), _igvn(igvn) { ++ PhaseMacroExpand(PhaseIterGVN &igvn) : Phase(Macro_Expand), _igvn(igvn), _has_locks(false) { + _igvn.set_delay_transform(true); + } + void eliminate_macro_nodes(); +--- ./hotspot/src/share/vm/opto/matcher.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/matcher.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -53,8 +53,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" + #endif + + OptoReg::Name OptoReg::c_frame_pointer; +@@ -842,16 +845,15 @@ + + // Compute generic short-offset Loads + #ifdef _LP64 +- MachNode *spillCP = match_tree(new (C) LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM)); ++ MachNode *spillCP = match_tree(new (C) LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered)); + #endif +- MachNode *spillI = match_tree(new (C) LoadINode(NULL,mem,fp,atp)); +- MachNode *spillL = match_tree(new (C) LoadLNode(NULL,mem,fp,atp)); +- MachNode *spillF = match_tree(new (C) LoadFNode(NULL,mem,fp,atp)); +- MachNode *spillD = match_tree(new (C) LoadDNode(NULL,mem,fp,atp)); +- MachNode *spillP = match_tree(new (C) LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM)); ++ 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)); + assert(spillI != NULL && spillL != NULL && spillF != NULL && + spillD != NULL && spillP != NULL, ""); +- + // Get the ADLC notion of the right regmask, for each basic type. + #ifdef _LP64 + idealreg2regmask[Op_RegN] = &spillCP->out_RegMask(); +@@ -1336,12 +1338,24 @@ + } + + // Debug inputs begin just after the last incoming parameter +- assert( (mcall == NULL) || (mcall->jvms() == NULL) || +- (mcall->jvms()->debug_start() + mcall->_jvmadj == mcall->tf()->domain()->cnt()), "" ); ++ assert((mcall == NULL) || (mcall->jvms() == NULL) || ++ (mcall->jvms()->debug_start() + mcall->_jvmadj == mcall->tf()->domain()->cnt()), ""); + + // Move the OopMap + msfpt->_oop_map = sfpt->_oop_map; + ++ // Add additional edges. ++ if (msfpt->mach_constant_base_node_input() != (uint)-1 && !msfpt->is_MachCallLeaf()) { ++ // For these calls we can not add MachConstantBase in expand(), as the ++ // ins are not complete then. ++ msfpt->ins_req(msfpt->mach_constant_base_node_input(), C->mach_constant_base_node()); ++ if (msfpt->jvms() && ++ msfpt->mach_constant_base_node_input() <= msfpt->jvms()->debug_start() + msfpt->_jvmadj) { ++ // We added an edge before jvms, so we must adapt the position of the ins. ++ msfpt->jvms()->adapt_position(+1); ++ } ++ } ++ + // Registers killed by the call are set in the local scheduling pass + // of Global Code Motion. + return msfpt; +@@ -1908,6 +1922,105 @@ + return OptoReg::as_OptoReg(regs.first()); + } + ++// This function identifies sub-graphs in which a 'load' node is ++// input to two different nodes, and such that it can be matched ++// with BMI instructions like blsi, blsr, etc. ++// Example : for b = -a[i] & a[i] can be matched to blsi r32, m32. ++// The graph is (AndL (SubL Con0 LoadL*) LoadL*), where LoadL* ++// refers to the same node. ++#ifdef X86 ++// Match the generic fused operations pattern (op1 (op2 Con{ConType} mop) mop) ++// This is a temporary solution until we make DAGs expressible in ADL. ++template ++class FusedPatternMatcher { ++ Node* _op1_node; ++ Node* _mop_node; ++ int _con_op; ++ ++ static int match_next(Node* n, int next_op, int next_op_idx) { ++ if (n->in(1) == NULL || n->in(2) == NULL) { ++ return -1; ++ } ++ ++ if (next_op_idx == -1) { // n is commutative, try rotations ++ if (n->in(1)->Opcode() == next_op) { ++ return 1; ++ } else if (n->in(2)->Opcode() == next_op) { ++ return 2; ++ } ++ } else { ++ assert(next_op_idx > 0 && next_op_idx <= 2, "Bad argument index"); ++ if (n->in(next_op_idx)->Opcode() == next_op) { ++ return next_op_idx; ++ } ++ } ++ return -1; ++ } ++public: ++ FusedPatternMatcher(Node* op1_node, Node *mop_node, int con_op) : ++ _op1_node(op1_node), _mop_node(mop_node), _con_op(con_op) { } ++ ++ bool match(int op1, int op1_op2_idx, // op1 and the index of the op1->op2 edge, -1 if op1 is commutative ++ int op2, int op2_con_idx, // op2 and the index of the op2->con edge, -1 if op2 is commutative ++ typename ConType::NativeType con_value) { ++ if (_op1_node->Opcode() != op1) { ++ return false; ++ } ++ if (_mop_node->outcnt() > 2) { ++ return false; ++ } ++ op1_op2_idx = match_next(_op1_node, op2, op1_op2_idx); ++ if (op1_op2_idx == -1) { ++ return false; ++ } ++ // Memory operation must be the other edge ++ int op1_mop_idx = (op1_op2_idx & 1) + 1; ++ ++ // Check that the mop node is really what we want ++ if (_op1_node->in(op1_mop_idx) == _mop_node) { ++ Node *op2_node = _op1_node->in(op1_op2_idx); ++ if (op2_node->outcnt() > 1) { ++ return false; ++ } ++ assert(op2_node->Opcode() == op2, "Should be"); ++ op2_con_idx = match_next(op2_node, _con_op, op2_con_idx); ++ if (op2_con_idx == -1) { ++ return false; ++ } ++ // Memory operation must be the other edge ++ int op2_mop_idx = (op2_con_idx & 1) + 1; ++ // Check that the memory operation is the same node ++ if (op2_node->in(op2_mop_idx) == _mop_node) { ++ // Now check the constant ++ const Type* con_type = op2_node->in(op2_con_idx)->bottom_type(); ++ if (con_type != Type::TOP && ConType::as_self(con_type)->get_con() == con_value) { ++ return true; ++ } ++ } ++ } ++ return false; ++ } ++}; ++ ++ ++bool Matcher::is_bmi_pattern(Node *n, Node *m) { ++ if (n != NULL && m != NULL) { ++ if (m->Opcode() == Op_LoadI) { ++ FusedPatternMatcher bmii(n, m, Op_ConI); ++ return bmii.match(Op_AndI, -1, Op_SubI, 1, 0) || ++ bmii.match(Op_AndI, -1, Op_AddI, -1, -1) || ++ bmii.match(Op_XorI, -1, Op_AddI, -1, -1); ++ } else if (m->Opcode() == Op_LoadL) { ++ FusedPatternMatcher bmil(n, m, Op_ConL); ++ return bmil.match(Op_AndL, -1, Op_SubL, 1, 0) || ++ bmil.match(Op_AndL, -1, Op_AddL, -1, -1) || ++ bmil.match(Op_XorL, -1, Op_AddL, -1, -1); ++ } ++ } ++ return false; ++} ++#endif // X86 ++ + // A method-klass-holder may be passed in the inline_cache_reg + // and then expanded into the inline_cache_reg and a method_oop register + // defined in ad_.cpp +@@ -1984,7 +2097,6 @@ + case Op_Catch: + case Op_CatchProj: + case Op_CProj: +- case Op_FlagsProj: + case Op_JumpProj: + case Op_JProj: + case Op_NeverBranch: +@@ -2064,6 +2176,14 @@ + set_shared(m->in(AddPNode::Base)->in(1)); + } + ++ // if 'n' and 'm' are part of a graph for BMI instruction, clone this node. ++#ifdef X86 ++ if (UseBMI1Instructions && is_bmi_pattern(n, m)) { ++ mstack.push(m, Visit); ++ continue; ++ } ++#endif ++ + // Clone addressing expressions as they are "free" in memory access instructions + if( mem_op && i == MemNode::Address && mop == Op_AddP ) { + // Some inputs for address expression are not put on stack +@@ -2331,7 +2451,7 @@ + bool Matcher::post_store_load_barrier(const Node* vmb) { + Compile* C = Compile::current(); + assert(vmb->is_MemBar(), ""); +- assert(vmb->Opcode() != Op_MemBarAcquire, ""); ++ assert(vmb->Opcode() != Op_MemBarAcquire && vmb->Opcode() != Op_LoadFence, ""); + const MemBarNode* membar = vmb->as_MemBar(); + + // Get the Ideal Proj node, ctrl, that can be used to iterate forward +@@ -2376,7 +2496,7 @@ + if (x->is_MemBar()) { + // We must retain this membar if there is an upcoming volatile + // load, which will be followed by acquire membar. +- if (xop == Op_MemBarAcquire) { ++ if (xop == Op_MemBarAcquire || xop == Op_LoadFence) { + return false; + } else { + // For other kinds of barriers, check by pretending we +@@ -2393,6 +2513,69 @@ + return false; + } + ++// Check whether node n is a branch to an uncommon trap that we could ++// optimize as test with very high branch costs in case of going to ++// the uncommon trap. The code must be able to be recompiled to use ++// a cheaper test. ++bool Matcher::branches_to_uncommon_trap(const Node *n) { ++ // Don't do it for natives, adapters, or runtime stubs ++ Compile *C = Compile::current(); ++ if (!C->is_method_compilation()) return false; ++ ++ assert(n->is_If(), "You should only call this on if nodes."); ++ IfNode *ifn = n->as_If(); ++ ++ Node *ifFalse = NULL; ++ for (DUIterator_Fast imax, i = ifn->fast_outs(imax); i < imax; i++) { ++ if (ifn->fast_out(i)->is_IfFalse()) { ++ ifFalse = ifn->fast_out(i); ++ break; ++ } ++ } ++ assert(ifFalse, "An If should have an ifFalse. Graph is broken."); ++ ++ Node *reg = ifFalse; ++ int cnt = 4; // We must protect against cycles. Limit to 4 iterations. ++ // Alternatively use visited set? Seems too expensive. ++ while (reg != NULL && cnt > 0) { ++ CallNode *call = NULL; ++ RegionNode *nxt_reg = NULL; ++ for (DUIterator_Fast imax, i = reg->fast_outs(imax); i < imax; i++) { ++ Node *o = reg->fast_out(i); ++ if (o->is_Call()) { ++ call = o->as_Call(); ++ } ++ if (o->is_Region()) { ++ nxt_reg = o->as_Region(); ++ } ++ } ++ ++ if (call && ++ call->entry_point() == SharedRuntime::uncommon_trap_blob()->entry_point()) { ++ const Type* trtype = call->in(TypeFunc::Parms)->bottom_type(); ++ if (trtype->isa_int() && trtype->is_int()->is_con()) { ++ jint tr_con = trtype->is_int()->get_con(); ++ Deoptimization::DeoptReason reason = Deoptimization::trap_request_reason(tr_con); ++ Deoptimization::DeoptAction action = Deoptimization::trap_request_action(tr_con); ++ assert((int)reason < (int)BitsPerInt, "recode bit map"); ++ ++ if (is_set_nth_bit(C->allowed_deopt_reasons(), (int)reason) ++ && action != Deoptimization::Action_none) { ++ // This uncommon trap is sure to recompile, eventually. ++ // When that happens, C->too_many_traps will prevent ++ // this transformation from happening again. ++ return true; ++ } ++ } ++ } ++ ++ reg = nxt_reg; ++ cnt--; ++ } ++ ++ return false; ++} ++ + //============================================================================= + //---------------------------State--------------------------------------------- + State::State(void) { +@@ -2439,7 +2622,7 @@ + tty->print_cr("%s %d %s", + ruleName[i], _cost[i], ruleName[_rule[i]] ); + } +- tty->print_cr(""); ++ tty->cr(); + + for( i=0; i<2; i++ ) + if( _kids[i] ) +--- ./hotspot/src/share/vm/opto/matcher.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/matcher.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -79,6 +79,9 @@ + + // Find shared Nodes, or Nodes that otherwise are Matcher roots + void find_shared( Node *n ); ++#ifdef X86 ++ bool is_bmi_pattern(Node *n, Node *m); ++#endif + + // Debug and profile information for nodes in old space: + GrowableArray* _old_node_note_array; +@@ -286,6 +289,9 @@ + // CPU supports misaligned vectors store/load. + static const bool misaligned_vectors_ok(); + ++ // Should original key array reference be passed to AES stubs ++ static const bool pass_original_key_for_aes(); ++ + // Used to determine a "low complexity" 64-bit constant. (Zero is simple.) + // The standard of comparison is one (StoreL ConL) vs. two (StoreI ConI). + // Depends on the details of 64-bit constant generation on the CPU. +@@ -337,10 +343,6 @@ + // Register for MODL projection of divmodL + static RegMask modL_proj_mask(); + +- static const RegMask mathExactI_result_proj_mask(); +- static const RegMask mathExactL_result_proj_mask(); +- static const RegMask mathExactI_flags_proj_mask(); +- + // Use hardware DIV instruction when it is faster than + // a code which use multiply for division by constant. + static bool use_asm_for_ldiv_by_con( jlong divisor ); +@@ -449,6 +451,10 @@ + // aligned. + static const bool misaligned_doubles_ok; + ++ // Does the CPU require postalloc expand (see block.cpp for description of ++ // postalloc expand)? ++ static const bool require_postalloc_expand; ++ + // Perform a platform dependent implicit null fixup. This is needed + // on windows95 to take care of some unusual register constraints. + void pd_implicit_null_fixup(MachNode *load, uint idx); +@@ -481,6 +487,8 @@ + // retain the Node to act as a compiler ordering barrier. + static bool post_store_load_barrier(const Node* mb); + ++ // Does n lead to an uncommon trap that can cause deoptimization? ++ static bool branches_to_uncommon_trap(const Node *n); + + #ifdef ASSERT + void dump_old2new_map(); // machine-independent to machine-dependent +--- ./hotspot/src/share/vm/opto/mathexactnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/mathexactnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -31,358 +31,93 @@ + #include "opto/mathexactnode.hpp" + #include "opto/subnode.hpp" + +-MathExactNode::MathExactNode(Node* ctrl, Node* in1) : MultiNode(2) { +- init_class_id(Class_MathExact); +- init_req(0, ctrl); +- init_req(1, in1); ++template ++class AddHelper { ++public: ++ typedef typename OverflowOp::TypeClass TypeClass; ++ typedef typename TypeClass::NativeType NativeType; ++ ++ static bool will_overflow(NativeType value1, NativeType value2) { ++ NativeType result = value1 + value2; ++ // Hacker's Delight 2-12 Overflow if both arguments have the opposite sign of the result ++ if (((value1 ^ result) & (value2 ^ result)) >= 0) { ++ return false; ++ } ++ return true; ++ } ++ ++ static bool can_overflow(const Type* type1, const Type* type2) { ++ if (type1 == TypeClass::ZERO || type2 == TypeClass::ZERO) { ++ return false; ++ } ++ return true; ++ } ++}; ++ ++template ++class SubHelper { ++public: ++ typedef typename OverflowOp::TypeClass TypeClass; ++ typedef typename TypeClass::NativeType NativeType; ++ ++ static bool will_overflow(NativeType value1, NativeType value2) { ++ NativeType result = value1 - value2; ++ // hacker's delight 2-12 overflow iff the arguments have different signs and ++ // the sign of the result is different than the sign of arg1 ++ if (((value1 ^ value2) & (value1 ^ result)) >= 0) { ++ return false; ++ } ++ return true; ++ } ++ ++ static bool can_overflow(const Type* type1, const Type* type2) { ++ if (type2 == TypeClass::ZERO) { ++ return false; ++ } ++ return true; ++ } ++}; ++ ++template ++class MulHelper { ++public: ++ typedef typename OverflowOp::TypeClass TypeClass; ++ ++ static bool can_overflow(const Type* type1, const Type* type2) { ++ if (type1 == TypeClass::ZERO || type2 == TypeClass::ZERO) { ++ return false; ++ } else if (type1 == TypeClass::ONE || type2 == TypeClass::ONE) { ++ return false; ++ } ++ return true; ++ } ++}; ++ ++bool OverflowAddINode::will_overflow(jint v1, jint v2) const { ++ return AddHelper::will_overflow(v1, v2); + } + +-MathExactNode::MathExactNode(Node* ctrl, Node* in1, Node* in2) : MultiNode(3) { +- init_class_id(Class_MathExact); +- init_req(0, ctrl); +- init_req(1, in1); +- init_req(2, in2); ++bool OverflowSubINode::will_overflow(jint v1, jint v2) const { ++ return SubHelper::will_overflow(v1, v2); + } + +-BoolNode* MathExactNode::bool_node() const { +- Node* flags = flags_node(); +- BoolNode* boolnode = flags->unique_out()->as_Bool(); +- assert(boolnode != NULL, "must have BoolNode"); +- return boolnode; ++bool OverflowMulINode::will_overflow(jint v1, jint v2) const { ++ jlong result = (jlong) v1 * (jlong) v2; ++ if ((jint) result == result) { ++ return false; ++ } ++ return true; + } + +-IfNode* MathExactNode::if_node() const { +- BoolNode* boolnode = bool_node(); +- IfNode* ifnode = boolnode->unique_out()->as_If(); +- assert(ifnode != NULL, "must have IfNode"); +- return ifnode; ++bool OverflowAddLNode::will_overflow(jlong v1, jlong v2) const { ++ return AddHelper::will_overflow(v1, v2); + } + +-Node* MathExactNode::control_node() const { +- IfNode* ifnode = if_node(); +- return ifnode->in(0); ++bool OverflowSubLNode::will_overflow(jlong v1, jlong v2) const { ++ return SubHelper::will_overflow(v1, v2); + } + +-Node* MathExactNode::non_throwing_branch() const { +- IfNode* ifnode = if_node(); +- if (bool_node()->_test._test == BoolTest::overflow) { +- return ifnode->proj_out(0); +- } +- return ifnode->proj_out(1); +-} +- +-// If the MathExactNode won't overflow we have to replace the +-// FlagsProjNode and ProjNode that is generated by the MathExactNode +-Node* MathExactNode::no_overflow(PhaseGVN* phase, Node* new_result) { +- PhaseIterGVN* igvn = phase->is_IterGVN(); +- if (igvn) { +- ProjNode* result = result_node(); +- ProjNode* flags = flags_node(); +- +- if (result != NULL) { +- igvn->replace_node(result, new_result); +- } +- +- if (flags != NULL) { +- BoolNode* boolnode = bool_node(); +- switch (boolnode->_test._test) { +- case BoolTest::overflow: +- // if the check is for overflow - never taken +- igvn->replace_node(boolnode, phase->intcon(0)); +- break; +- case BoolTest::no_overflow: +- // if the check is for no overflow - always taken +- igvn->replace_node(boolnode, phase->intcon(1)); +- break; +- default: +- fatal("Unexpected value of BoolTest"); +- break; +- } +- flags->del_req(0); +- } +- } +- return new_result; +-} +- +-Node* MathExactINode::match(const ProjNode* proj, const Matcher* m) { +- uint ideal_reg = proj->ideal_reg(); +- RegMask rm; +- if (proj->_con == result_proj_node) { +- rm = m->mathExactI_result_proj_mask(); +- } else { +- assert(proj->_con == flags_proj_node, "must be result or flags"); +- assert(ideal_reg == Op_RegFlags, "sanity"); +- rm = m->mathExactI_flags_proj_mask(); +- } +- return new (m->C) MachProjNode(this, proj->_con, rm, ideal_reg); +-} +- +-Node* MathExactLNode::match(const ProjNode* proj, const Matcher* m) { +- uint ideal_reg = proj->ideal_reg(); +- RegMask rm; +- if (proj->_con == result_proj_node) { +- rm = m->mathExactL_result_proj_mask(); +- } else { +- assert(proj->_con == flags_proj_node, "must be result or flags"); +- assert(ideal_reg == Op_RegFlags, "sanity"); +- rm = m->mathExactI_flags_proj_mask(); +- } +- return new (m->C) MachProjNode(this, proj->_con, rm, ideal_reg); +-} +- +-Node* AddExactINode::Ideal(PhaseGVN* phase, bool can_reshape) { +- Node* arg1 = in(1); +- Node* arg2 = in(2); +- +- const Type* type1 = phase->type(arg1); +- const Type* type2 = phase->type(arg2); +- +- if (type1 != Type::TOP && type1->singleton() && +- type2 != Type::TOP && type2->singleton()) { +- jint val1 = arg1->get_int(); +- jint val2 = arg2->get_int(); +- jint result = val1 + val2; +- // Hacker's Delight 2-12 Overflow if both arguments have the opposite sign of the result +- if ( (((val1 ^ result) & (val2 ^ result)) >= 0)) { +- Node* con_result = ConINode::make(phase->C, result); +- return no_overflow(phase, con_result); +- } +- return NULL; +- } +- +- if (type1 == TypeInt::ZERO || type2 == TypeInt::ZERO) { // (Add 0 x) == x +- Node* add_result = new (phase->C) AddINode(arg1, arg2); +- return no_overflow(phase, add_result); +- } +- +- if (type2->singleton()) { +- return NULL; // no change - keep constant on the right +- } +- +- if (type1->singleton()) { +- // Make it x + Constant - move constant to the right +- swap_edges(1, 2); +- return this; +- } +- +- if (arg2->is_Load()) { +- return NULL; // no change - keep load on the right +- } +- +- if (arg1->is_Load()) { +- // Make it x + Load - move load to the right +- swap_edges(1, 2); +- return this; +- } +- +- if (arg1->_idx > arg2->_idx) { +- // Sort the edges +- swap_edges(1, 2); +- return this; +- } +- +- return NULL; +-} +- +-Node* AddExactLNode::Ideal(PhaseGVN* phase, bool can_reshape) { +- Node* arg1 = in(1); +- Node* arg2 = in(2); +- +- const Type* type1 = phase->type(arg1); +- const Type* type2 = phase->type(arg2); +- +- if (type1 != Type::TOP && type1->singleton() && +- type2 != Type::TOP && type2->singleton()) { +- jlong val1 = arg1->get_long(); +- jlong val2 = arg2->get_long(); +- jlong result = val1 + val2; +- // Hacker's Delight 2-12 Overflow if both arguments have the opposite sign of the result +- if ( (((val1 ^ result) & (val2 ^ result)) >= 0)) { +- Node* con_result = ConLNode::make(phase->C, result); +- return no_overflow(phase, con_result); +- } +- return NULL; +- } +- +- if (type1 == TypeLong::ZERO || type2 == TypeLong::ZERO) { // (Add 0 x) == x +- Node* add_result = new (phase->C) AddLNode(arg1, arg2); +- return no_overflow(phase, add_result); +- } +- +- if (type2->singleton()) { +- return NULL; // no change - keep constant on the right +- } +- +- if (type1->singleton()) { +- // Make it x + Constant - move constant to the right +- swap_edges(1, 2); +- return this; +- } +- +- if (arg2->is_Load()) { +- return NULL; // no change - keep load on the right +- } +- +- if (arg1->is_Load()) { +- // Make it x + Load - move load to the right +- swap_edges(1, 2); +- return this; +- } +- +- if (arg1->_idx > arg2->_idx) { +- // Sort the edges +- swap_edges(1, 2); +- return this; +- } +- +- return NULL; +-} +- +-Node* SubExactINode::Ideal(PhaseGVN* phase, bool can_reshape) { +- Node* arg1 = in(1); +- Node* arg2 = in(2); +- +- const Type* type1 = phase->type(arg1); +- const Type* type2 = phase->type(arg2); +- +- if (type1 != Type::TOP && type1->singleton() && +- type2 != Type::TOP && type2->singleton()) { +- jint val1 = arg1->get_int(); +- jint val2 = arg2->get_int(); +- jint result = val1 - val2; +- +- // Hacker's Delight 2-12 Overflow iff the arguments have different signs and +- // the sign of the result is different than the sign of arg1 +- if (((val1 ^ val2) & (val1 ^ result)) >= 0) { +- Node* con_result = ConINode::make(phase->C, result); +- return no_overflow(phase, con_result); +- } +- return NULL; +- } +- +- if (type1 == TypeInt::ZERO || type2 == TypeInt::ZERO) { +- // Sub with zero is the same as add with zero +- Node* add_result = new (phase->C) AddINode(arg1, arg2); +- return no_overflow(phase, add_result); +- } +- +- return NULL; +-} +- +-Node* SubExactLNode::Ideal(PhaseGVN* phase, bool can_reshape) { +- Node* arg1 = in(1); +- Node* arg2 = in(2); +- +- const Type* type1 = phase->type(arg1); +- const Type* type2 = phase->type(arg2); +- +- if (type1 != Type::TOP && type1->singleton() && +- type2 != Type::TOP && type2->singleton()) { +- jlong val1 = arg1->get_long(); +- jlong val2 = arg2->get_long(); +- jlong result = val1 - val2; +- +- // Hacker's Delight 2-12 Overflow iff the arguments have different signs and +- // the sign of the result is different than the sign of arg1 +- if (((val1 ^ val2) & (val1 ^ result)) >= 0) { +- Node* con_result = ConLNode::make(phase->C, result); +- return no_overflow(phase, con_result); +- } +- return NULL; +- } +- +- if (type1 == TypeLong::ZERO || type2 == TypeLong::ZERO) { +- // Sub with zero is the same as add with zero +- Node* add_result = new (phase->C) AddLNode(arg1, arg2); +- return no_overflow(phase, add_result); +- } +- +- return NULL; +-} +- +-Node* NegExactINode::Ideal(PhaseGVN* phase, bool can_reshape) { +- Node *arg = in(1); +- +- const Type* type = phase->type(arg); +- if (type != Type::TOP && type->singleton()) { +- jint value = arg->get_int(); +- if (value != min_jint) { +- Node* neg_result = ConINode::make(phase->C, -value); +- return no_overflow(phase, neg_result); +- } +- } +- return NULL; +-} +- +-Node* NegExactLNode::Ideal(PhaseGVN* phase, bool can_reshape) { +- Node *arg = in(1); +- +- const Type* type = phase->type(arg); +- if (type != Type::TOP && type->singleton()) { +- jlong value = arg->get_long(); +- if (value != min_jlong) { +- Node* neg_result = ConLNode::make(phase->C, -value); +- return no_overflow(phase, neg_result); +- } +- } +- return NULL; +-} +- +-Node* MulExactINode::Ideal(PhaseGVN* phase, bool can_reshape) { +- Node* arg1 = in(1); +- Node* arg2 = in(2); +- +- const Type* type1 = phase->type(arg1); +- const Type* type2 = phase->type(arg2); +- +- if (type1 != Type::TOP && type1->singleton() && +- type2 != Type::TOP && type2->singleton()) { +- jint val1 = arg1->get_int(); +- jint val2 = arg2->get_int(); +- jlong result = (jlong) val1 * (jlong) val2; +- if ((jint) result == result) { +- // no overflow +- Node* mul_result = ConINode::make(phase->C, result); +- return no_overflow(phase, mul_result); +- } +- } +- +- if (type1 == TypeInt::ZERO || type2 == TypeInt::ZERO) { +- return no_overflow(phase, ConINode::make(phase->C, 0)); +- } +- +- if (type1 == TypeInt::ONE) { +- Node* mul_result = new (phase->C) AddINode(arg2, phase->intcon(0)); +- return no_overflow(phase, mul_result); +- } +- if (type2 == TypeInt::ONE) { +- Node* mul_result = new (phase->C) AddINode(arg1, phase->intcon(0)); +- return no_overflow(phase, mul_result); +- } +- +- if (type1 == TypeInt::MINUS_1) { +- return new (phase->C) NegExactINode(NULL, arg2); +- } +- +- if (type2 == TypeInt::MINUS_1) { +- return new (phase->C) NegExactINode(NULL, arg1); +- } +- +- return NULL; +-} +- +-Node* MulExactLNode::Ideal(PhaseGVN* phase, bool can_reshape) { +- Node* arg1 = in(1); +- Node* arg2 = in(2); +- +- const Type* type1 = phase->type(arg1); +- const Type* type2 = phase->type(arg2); +- +- if (type1 != Type::TOP && type1->singleton() && +- type2 != Type::TOP && type2->singleton()) { +- jlong val1 = arg1->get_long(); +- jlong val2 = arg2->get_long(); +- ++bool OverflowMulLNode::will_overflow(jlong val1, jlong val2) const { + jlong result = val1 * val2; + jlong ax = (val1 < 0 ? -val1 : val1); + jlong ay = (val2 < 0 ? -val2 : val2); +@@ -398,33 +133,125 @@ + } + } + +- if (!overflow) { +- Node* mul_result = ConLNode::make(phase->C, result); +- return no_overflow(phase, mul_result); ++ return overflow; ++} ++ ++bool OverflowAddINode::can_overflow(const Type* t1, const Type* t2) const { ++ return AddHelper::can_overflow(t1, t2); ++} ++ ++bool OverflowSubINode::can_overflow(const Type* t1, const Type* t2) const { ++ if (in(1) == in(2)) { ++ return false; ++ } ++ return SubHelper::can_overflow(t1, t2); ++} ++ ++bool OverflowMulINode::can_overflow(const Type* t1, const Type* t2) const { ++ return MulHelper::can_overflow(t1, t2); ++} ++ ++bool OverflowAddLNode::can_overflow(const Type* t1, const Type* t2) const { ++ return AddHelper::can_overflow(t1, t2); ++} ++ ++bool OverflowSubLNode::can_overflow(const Type* t1, const Type* t2) const { ++ if (in(1) == in(2)) { ++ return false; ++ } ++ return SubHelper::can_overflow(t1, t2); ++} ++ ++bool OverflowMulLNode::can_overflow(const Type* t1, const Type* t2) const { ++ return MulHelper::can_overflow(t1, t2); ++} ++ ++const Type* OverflowNode::sub(const Type* t1, const Type* t2) const { ++ fatal(err_msg_res("sub() should not be called for '%s'", NodeClassNames[this->Opcode()])); ++ return TypeInt::CC; ++} ++ ++template ++struct IdealHelper { ++ typedef typename OverflowOp::TypeClass TypeClass; // TypeInt, TypeLong ++ typedef typename TypeClass::NativeType NativeType; ++ ++ static Node* Ideal(const OverflowOp* node, PhaseGVN* phase, bool can_reshape) { ++ Node* arg1 = node->in(1); ++ Node* arg2 = node->in(2); ++ const Type* type1 = phase->type(arg1); ++ const Type* type2 = phase->type(arg2); ++ ++ if (type1 == NULL || type2 == NULL) { ++ return NULL; + } ++ ++ if (type1 != Type::TOP && type1->singleton() && ++ type2 != Type::TOP && type2->singleton()) { ++ NativeType val1 = TypeClass::as_self(type1)->get_con(); ++ NativeType val2 = TypeClass::as_self(type2)->get_con(); ++ if (node->will_overflow(val1, val2) == false) { ++ Node* con_result = ConINode::make(phase->C, 0); ++ return con_result; ++ } ++ return NULL; ++ } ++ return NULL; + } + +- if (type1 == TypeLong::ZERO || type2 == TypeLong::ZERO) { +- return no_overflow(phase, ConLNode::make(phase->C, 0)); ++ static const Type* Value(const OverflowOp* node, PhaseTransform* phase) { ++ const Type *t1 = phase->type( node->in(1) ); ++ const Type *t2 = phase->type( node->in(2) ); ++ if( t1 == Type::TOP ) return Type::TOP; ++ if( t2 == Type::TOP ) return Type::TOP; ++ ++ const TypeClass* i1 = TypeClass::as_self(t1); ++ const TypeClass* i2 = TypeClass::as_self(t2); ++ ++ if (i1 == NULL || i2 == NULL) { ++ return TypeInt::CC; ++ } ++ ++ if (t1->singleton() && t2->singleton()) { ++ NativeType val1 = i1->get_con(); ++ NativeType val2 = i2->get_con(); ++ if (node->will_overflow(val1, val2)) { ++ return TypeInt::CC; ++ } ++ return TypeInt::ZERO; ++ } else if (i1 != TypeClass::TYPE_DOMAIN && i2 != TypeClass::TYPE_DOMAIN) { ++ if (node->will_overflow(i1->_lo, i2->_lo)) { ++ return TypeInt::CC; ++ } else if (node->will_overflow(i1->_lo, i2->_hi)) { ++ return TypeInt::CC; ++ } else if (node->will_overflow(i1->_hi, i2->_lo)) { ++ return TypeInt::CC; ++ } else if (node->will_overflow(i1->_hi, i2->_hi)) { ++ return TypeInt::CC; ++ } ++ return TypeInt::ZERO; ++ } ++ ++ if (!node->can_overflow(t1, t2)) { ++ return TypeInt::ZERO; ++ } ++ return TypeInt::CC; + } ++}; + +- if (type1 == TypeLong::ONE) { +- Node* mul_result = new (phase->C) AddLNode(arg2, phase->longcon(0)); +- return no_overflow(phase, mul_result); +- } +- if (type2 == TypeLong::ONE) { +- Node* mul_result = new (phase->C) AddLNode(arg1, phase->longcon(0)); +- return no_overflow(phase, mul_result); +- } +- +- if (type1 == TypeLong::MINUS_1) { +- return new (phase->C) NegExactLNode(NULL, arg2); +- } +- +- if (type2 == TypeLong::MINUS_1) { +- return new (phase->C) NegExactLNode(NULL, arg1); +- } +- +- return NULL; ++Node* OverflowINode::Ideal(PhaseGVN* phase, bool can_reshape) { ++ return IdealHelper::Ideal(this, phase, can_reshape); + } + ++Node* OverflowLNode::Ideal(PhaseGVN* phase, bool can_reshape) { ++ return IdealHelper::Ideal(this, phase, can_reshape); ++} ++ ++const Type* OverflowINode::Value(PhaseTransform* phase) const { ++ return IdealHelper::Value(this, phase); ++} ++ ++const Type* OverflowLNode::Value(PhaseTransform* phase) const { ++ return IdealHelper::Value(this, phase); ++} ++ +--- ./hotspot/src/share/vm/opto/mathexactnode.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/mathexactnode.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -27,128 +27,111 @@ + + #include "opto/multnode.hpp" + #include "opto/node.hpp" ++#include "opto/addnode.hpp" + #include "opto/subnode.hpp" + #include "opto/type.hpp" + +-class BoolNode; +-class IfNode; +-class Node; +- + class PhaseGVN; + class PhaseTransform; + +-class MathExactNode : public MultiNode { ++class OverflowNode : public CmpNode { + public: +- MathExactNode(Node* ctrl, Node* in1); +- MathExactNode(Node* ctrl, Node* in1, Node* in2); +- enum { +- result_proj_node = 0, +- flags_proj_node = 1 +- }; +- virtual int Opcode() const; +- virtual Node* Identity(PhaseTransform* phase) { return this; } +- virtual Node* Ideal(PhaseGVN* phase, bool can_reshape) { return NULL; } +- virtual const Type* Value(PhaseTransform* phase) const { return bottom_type(); } +- virtual uint hash() const { return NO_HASH; } +- virtual bool is_CFG() const { return false; } +- virtual uint ideal_reg() const { return NotAMachineReg; } ++ OverflowNode(Node* in1, Node* in2) : CmpNode(in1, in2) {} + +- ProjNode* result_node() const { return proj_out(result_proj_node); } +- ProjNode* flags_node() const { return proj_out(flags_proj_node); } +- Node* control_node() const; +- Node* non_throwing_branch() const; +-protected: +- IfNode* if_node() const; +- BoolNode* bool_node() const; +- Node* no_overflow(PhaseGVN *phase, Node* new_result); ++ virtual uint ideal_reg() const { return Op_RegFlags; } ++ virtual const Type* sub(const Type* t1, const Type* t2) const; + }; + +-class MathExactINode : public MathExactNode { +- public: +- MathExactINode(Node* ctrl, Node* in1) : MathExactNode(ctrl, in1) {} +- MathExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactNode(ctrl, in1, in2) {} +- virtual int Opcode() const; +- virtual Node* match(const ProjNode* proj, const Matcher* m); +- virtual const Type* bottom_type() const { return TypeTuple::INT_CC_PAIR; } ++class OverflowINode : public OverflowNode { ++public: ++ typedef TypeInt TypeClass; ++ ++ OverflowINode(Node* in1, Node* in2) : OverflowNode(in1, in2) {} ++ virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); ++ virtual const Type* Value(PhaseTransform* phase) const; ++ ++ virtual bool will_overflow(jint v1, jint v2) const = 0; ++ virtual bool can_overflow(const Type* t1, const Type* t2) const = 0; + }; + +-class MathExactLNode : public MathExactNode { ++ ++class OverflowLNode : public OverflowNode { + public: +- MathExactLNode(Node* ctrl, Node* in1) : MathExactNode(ctrl, in1) {} +- MathExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactNode(ctrl, in1, in2) {} +- virtual int Opcode() const; +- virtual Node* match(const ProjNode* proj, const Matcher* m); +- virtual const Type* bottom_type() const { return TypeTuple::LONG_CC_PAIR; } ++ typedef TypeLong TypeClass; ++ ++ OverflowLNode(Node* in1, Node* in2) : OverflowNode(in1, in2) {} ++ virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); ++ virtual const Type* Value(PhaseTransform* phase) const; ++ ++ virtual bool will_overflow(jlong v1, jlong v2) const = 0; ++ virtual bool can_overflow(const Type* t1, const Type* t2) const = 0; + }; + +-class AddExactINode : public MathExactINode { ++class OverflowAddINode : public OverflowINode { + public: +- AddExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactINode(ctrl, in1, in2) {} ++ typedef AddINode MathOp; ++ ++ OverflowAddINode(Node* in1, Node* in2) : OverflowINode(in1, in2) {} + virtual int Opcode() const; +- virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); ++ ++ virtual bool will_overflow(jint v1, jint v2) const; ++ virtual bool can_overflow(const Type* t1, const Type* t2) const; + }; + +-class AddExactLNode : public MathExactLNode { ++class OverflowSubINode : public OverflowINode { + public: +- AddExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactLNode(ctrl, in1, in2) {} ++ typedef SubINode MathOp; ++ ++ OverflowSubINode(Node* in1, Node* in2) : OverflowINode(in1, in2) {} + virtual int Opcode() const; +- virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); ++ ++ virtual bool will_overflow(jint v1, jint v2) const; ++ virtual bool can_overflow(const Type* t1, const Type* t2) const; + }; + +-class SubExactINode : public MathExactINode { ++class OverflowMulINode : public OverflowINode { + public: +- SubExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactINode(ctrl, in1, in2) {} ++ typedef MulINode MathOp; ++ ++ OverflowMulINode(Node* in1, Node* in2) : OverflowINode(in1, in2) {} + virtual int Opcode() const; +- virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); ++ ++ virtual bool will_overflow(jint v1, jint v2) const; ++ virtual bool can_overflow(const Type* t1, const Type* t2) const; + }; + +-class SubExactLNode : public MathExactLNode { ++class OverflowAddLNode : public OverflowLNode { + public: +- SubExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactLNode(ctrl, in1, in2) {} ++ typedef AddLNode MathOp; ++ ++ OverflowAddLNode(Node* in1, Node* in2) : OverflowLNode(in1, in2) {} + virtual int Opcode() const; +- virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); ++ ++ virtual bool will_overflow(jlong v1, jlong v2) const; ++ virtual bool can_overflow(const Type* t1, const Type* t2) const; + }; + +-class NegExactINode : public MathExactINode { ++class OverflowSubLNode : public OverflowLNode { + public: +- NegExactINode(Node* ctrl, Node* in1) : MathExactINode(ctrl, in1) {} ++ typedef SubLNode MathOp; ++ ++ OverflowSubLNode(Node* in1, Node* in2) : OverflowLNode(in1, in2) {} + virtual int Opcode() const; +- virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); ++ ++ virtual bool will_overflow(jlong v1, jlong v2) const; ++ virtual bool can_overflow(const Type* t1, const Type* t2) const; + }; + +-class NegExactLNode : public MathExactLNode { ++class OverflowMulLNode : public OverflowLNode { + public: +- NegExactLNode(Node* ctrl, Node* in1) : MathExactLNode(ctrl, in1) {} ++ typedef MulLNode MathOp; ++ ++ OverflowMulLNode(Node* in1, Node* in2) : OverflowLNode(in1, in2) {} + virtual int Opcode() const; +- virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); ++ ++ virtual bool will_overflow(jlong v1, jlong v2) const; ++ virtual bool can_overflow(const Type* t1, const Type* t2) const; + }; + +-class MulExactINode : public MathExactINode { +-public: +- MulExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactINode(ctrl, in1, in2) {} +- virtual int Opcode() const; +- virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); +-}; +- +-class MulExactLNode : public MathExactLNode { +-public: +- MulExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactLNode(ctrl, in1, in2) {} +- virtual int Opcode() const; +- virtual Node* Ideal(PhaseGVN* phase, bool can_reshape); +-}; +- +-class FlagsProjNode : public ProjNode { +-public: +- FlagsProjNode(Node* src, uint con) : ProjNode(src, con) { +- init_class_id(Class_FlagsProj); +- } +- +- virtual int Opcode() const; +- virtual bool is_CFG() const { return false; } +- virtual const Type* bottom_type() const { return TypeInt::CC; } +- virtual uint ideal_reg() const { return Op_RegFlags; } +-}; +- +- + #endif + +--- ./hotspot/src/share/vm/opto/memnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/memnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -306,33 +306,16 @@ + int alias_idx = phase->C->get_alias_index(t_adr->is_ptr()); + } + +-#ifdef ASSERT + Node* base = NULL; +- if (address->is_AddP()) ++ if (address->is_AddP()) { + base = address->in(AddPNode::Base); ++ } + if (base != NULL && phase->type(base)->higher_equal(TypePtr::NULL_PTR) && + !t_adr->isa_rawptr()) { + // Note: raw address has TOP base and top->higher_equal(TypePtr::NULL_PTR) is true. +- Compile* C = phase->C; +- tty->cr(); +- tty->print_cr("===== NULL+offs not RAW address ====="); +- if (C->is_dead_node(this->_idx)) tty->print_cr("'this' is dead"); +- if ((ctl != NULL) && C->is_dead_node(ctl->_idx)) tty->print_cr("'ctl' is dead"); +- if (C->is_dead_node(mem->_idx)) tty->print_cr("'mem' is dead"); +- if (C->is_dead_node(address->_idx)) tty->print_cr("'address' is dead"); +- if (C->is_dead_node(base->_idx)) tty->print_cr("'base' is dead"); +- tty->cr(); +- base->dump(1); +- tty->cr(); +- this->dump(2); +- tty->print("this->adr_type(): "); adr_type()->dump(); tty->cr(); +- tty->print("phase->type(address): "); t_adr->dump(); tty->cr(); +- tty->print("phase->type(base): "); phase->type(address)->dump(); tty->cr(); +- tty->cr(); ++ // Skip this node optimization if its address has TOP base. ++ return NodeSentinel; // caller will return NULL + } +- assert(base == NULL || t_adr->isa_rawptr() || +- !phase->type(base)->higher_equal(TypePtr::NULL_PTR), "NULL+offs not RAW address?"); +-#endif + + // Avoid independent memory operations + Node* old_mem = mem; +@@ -657,7 +640,7 @@ + // disregarding "null"-ness. + // (We make an exception for TypeRawPtr::BOTTOM, which is a bit bucket.) + const TypePtr* tp_notnull = tp->join(TypePtr::NOTNULL)->is_ptr(); +- assert(cross_check->meet(tp_notnull) == cross_check, ++ assert(cross_check->meet(tp_notnull) == cross_check->remove_speculative(), + "real address must not escape from expected memory type"); + } + #endif +@@ -907,7 +890,7 @@ + + //----------------------------LoadNode::make----------------------------------- + // Polymorphic factory method: +-Node *LoadNode::make( PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const TypePtr* adr_type, const Type *rt, BasicType bt ) { ++Node *LoadNode::make(PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const TypePtr* adr_type, const Type *rt, BasicType bt, MemOrd mo) { + Compile* C = gvn.C; + + // sanity check the alias category against the created node type +@@ -923,34 +906,34 @@ + 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() ); +- case T_BYTE: return new (C) LoadBNode (ctl, mem, adr, adr_type, rt->is_int() ); +- case T_INT: return new (C) LoadINode (ctl, mem, adr, adr_type, rt->is_int() ); +- case T_CHAR: return new (C) LoadUSNode(ctl, mem, adr, adr_type, rt->is_int() ); +- case T_SHORT: return new (C) LoadSNode (ctl, mem, adr, adr_type, rt->is_int() ); +- case T_LONG: return new (C) LoadLNode (ctl, mem, adr, adr_type, rt->is_long() ); +- case T_FLOAT: return new (C) LoadFNode (ctl, mem, adr, adr_type, rt ); +- case T_DOUBLE: return new (C) LoadDNode (ctl, mem, adr, adr_type, rt ); +- case T_ADDRESS: return new (C) LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr() ); ++ 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_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())); ++ 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()); + } 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()); ++ return new (C) LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo); + } + } + ShouldNotReachHere(); + return (LoadNode*)NULL; + } + +-LoadLNode* LoadLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt) { ++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(), require_atomic); ++ return new (C) LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic); + } + + +@@ -1002,9 +985,13 @@ + // a synchronized region. + while (current->is_Proj()) { + int opc = current->in(0)->Opcode(); +- if ((final && (opc == Op_MemBarAcquire || opc == Op_MemBarAcquireLock)) || +- opc == Op_MemBarRelease || opc == Op_MemBarCPUOrder || +- opc == Op_MemBarReleaseLock) { ++ if ((final && (opc == Op_MemBarAcquire || ++ opc == Op_MemBarAcquireLock || ++ opc == Op_LoadFence)) || ++ opc == Op_MemBarRelease || ++ opc == Op_StoreFence || ++ opc == Op_MemBarReleaseLock || ++ opc == Op_MemBarCPUOrder) { + Node* mem = current->in(0)->in(TypeFunc::Memory); + if (mem->is_MergeMem()) { + MergeMemNode* merge = mem->as_MergeMem(); +@@ -1589,35 +1576,33 @@ + + // Try to constant-fold a stable array element. + static const Type* fold_stable_ary_elem(const TypeAryPtr* ary, int off, BasicType loadbt) { ++ assert(ary->const_oop(), "array should be constant"); + assert(ary->is_stable(), "array should be stable"); + +- if (ary->const_oop() != NULL) { +- // Decode the results of GraphKit::array_element_address. +- ciArray* aobj = ary->const_oop()->as_array(); +- ciConstant con = aobj->element_value_by_offset(off); +- +- if (con.basic_type() != T_ILLEGAL && !con.is_null_or_zero()) { +- const Type* con_type = Type::make_from_constant(con); +- if (con_type != NULL) { +- if (con_type->isa_aryptr()) { +- // Join with the array element type, in case it is also stable. +- int dim = ary->stable_dimension(); +- con_type = con_type->is_aryptr()->cast_to_stable(true, dim-1); +- } +- if (loadbt == T_NARROWOOP && con_type->isa_oopptr()) { +- con_type = con_type->make_narrowoop(); +- } ++ // Decode the results of GraphKit::array_element_address. ++ ciArray* aobj = ary->const_oop()->as_array(); ++ ciConstant con = aobj->element_value_by_offset(off); ++ ++ if (con.basic_type() != T_ILLEGAL && !con.is_null_or_zero()) { ++ const Type* con_type = Type::make_from_constant(con); ++ if (con_type != NULL) { ++ if (con_type->isa_aryptr()) { ++ // Join with the array element type, in case it is also stable. ++ int dim = ary->stable_dimension(); ++ con_type = con_type->is_aryptr()->cast_to_stable(true, dim-1); ++ } ++ if (loadbt == T_NARROWOOP && con_type->isa_oopptr()) { ++ con_type = con_type->make_narrowoop(); ++ } + #ifndef PRODUCT +- if (TraceIterativeGVN) { +- tty->print("FoldStableValues: array element [off=%d]: con_type=", off); +- con_type->dump(); tty->cr(); +- } ++ if (TraceIterativeGVN) { ++ tty->print("FoldStableValues: array element [off=%d]: con_type=", off); ++ con_type->dump(); tty->cr(); ++ } + #endif //PRODUCT +- return con_type; +- } ++ return con_type; + } + } +- + return NULL; + } + +@@ -1637,7 +1622,7 @@ + // Try to guess loaded type from pointer type + if (tp->isa_aryptr()) { + const TypeAryPtr* ary = tp->is_aryptr(); +- const Type *t = ary->elem(); ++ const Type* t = ary->elem(); + + // Determine whether the reference is beyond the header or not, by comparing + // the offset against the offset of the start of the array's data. +@@ -1649,10 +1634,9 @@ + const bool off_beyond_header = ((uint)off >= (uint)min_base_off); + + // Try to constant-fold a stable array element. +- if (FoldStableValues && ary->is_stable()) { +- // Make sure the reference is not into the header +- if (off_beyond_header && off != Type::OffsetBot) { +- assert(adr->is_AddP() && adr->in(AddPNode::Offset)->is_Con(), "offset is a constant"); ++ if (FoldStableValues && ary->is_stable() && ary->const_oop() != NULL) { ++ // Make sure the reference is not into the header and the offset is constant ++ if (off_beyond_header && adr->is_AddP() && off != Type::OffsetBot) { + const Type* con_type = fold_stable_ary_elem(ary, off, memory_type()); + if (con_type != NULL) { + return con_type; +@@ -1681,7 +1665,7 @@ + // t might actually be lower than _type, if _type is a unique + // concrete subclass of abstract class t. + if (off_beyond_header) { // is the offset beyond the header? +- const Type* jt = t->join(_type); ++ const Type* jt = t->join_speculative(_type); + // In any case, do not allow the join, per se, to empty out the type. + if (jt->empty() && !t->empty()) { + // This can happen if a interface-typed array narrows to a class type. +@@ -2032,12 +2016,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())); ++ 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()); + } + #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); ++ return new (C) LoadKlassNode(ctl, mem, adr, at, tk, MemNode::unordered); + } + + //------------------------------Value------------------------------------------ +@@ -2352,45 +2336,46 @@ + //============================================================================= + //---------------------------StoreNode::make----------------------------------- + // Polymorphic factory method: +-StoreNode* StoreNode::make( PhaseGVN& gvn, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, BasicType bt ) { ++StoreNode* StoreNode::make(PhaseGVN& gvn, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, BasicType bt, MemOrd mo) { ++ assert((mo == unordered || mo == release), "unexpected"); + Compile* C = gvn.C; +- assert( C->get_alias_index(adr_type) != Compile::AliasIdxRaw || +- ctl != NULL, "raw memory operations should have control edge"); ++ assert(C->get_alias_index(adr_type) != Compile::AliasIdxRaw || ++ ctl != NULL, "raw memory operations should have control edge"); + + switch (bt) { + case T_BOOLEAN: +- case T_BYTE: return new (C) StoreBNode(ctl, mem, adr, adr_type, val); +- case T_INT: return new (C) StoreINode(ctl, mem, adr, adr_type, val); ++ 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_CHAR: +- case T_SHORT: return new (C) StoreCNode(ctl, mem, adr, adr_type, val); +- case T_LONG: return new (C) StoreLNode(ctl, mem, adr, adr_type, val); +- case T_FLOAT: return new (C) StoreFNode(ctl, mem, adr, adr_type, val); +- case T_DOUBLE: return new (C) StoreDNode(ctl, mem, adr, adr_type, val); ++ 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_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); ++ return new (C) 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); ++ return new (C) StoreNKlassNode(ctl, mem, adr, adr_type, val, mo); + } + #endif + { +- return new (C) StorePNode(ctl, mem, adr, adr_type, val); ++ return new (C) StorePNode(ctl, mem, adr, adr_type, val, mo); + } + } + ShouldNotReachHere(); + return (StoreNode*)NULL; + } + +-StoreLNode* StoreLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val) { ++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, require_atomic); ++ return new (C) StoreLNode(ctl, mem, adr, adr_type, val, mo, require_atomic); + } + + +@@ -2783,12 +2768,12 @@ + + Node *zero = phase->makecon(TypeLong::ZERO); + Node *off = phase->MakeConX(BytesPerLong); +- mem = new (phase->C) StoreLNode(in(0),mem,adr,atp,zero); ++ mem = new (phase->C) 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); ++ mem = new (phase->C) StoreLNode(in(0),mem,adr,atp,zero,MemNode::unordered,false); + } + return mem; + } +@@ -2832,7 +2817,7 @@ + Node* adr = new (C) 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); ++ mem = StoreNode::make(*phase, ctl, mem, adr, atp, phase->zerocon(T_INT), T_INT, MemNode::unordered); + mem = phase->transform(mem); + offset += BytesPerInt; + } +@@ -2893,7 +2878,7 @@ + Node* adr = new (C) 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); ++ mem = StoreNode::make(*phase, ctl, mem, adr, atp, phase->zerocon(T_INT), T_INT, MemNode::unordered); + mem = phase->transform(mem); + done_offset += BytesPerInt; + } +@@ -2977,15 +2962,17 @@ + //------------------------------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_MemBarRelease: return new(C) MemBarReleaseNode(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); +- default: ShouldNotReachHere(); return NULL; ++ 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); ++ default: ShouldNotReachHere(); return NULL; + } + } + +@@ -3767,14 +3754,14 @@ + ++new_long; + off[nst] = offset; + st[nst++] = StoreNode::make(*phase, ctl, zmem, adr, atp, +- phase->longcon(con), T_LONG); ++ phase->longcon(con), T_LONG, MemNode::unordered); + } else { + // Omit either if it is a zero. + if (con0 != 0) { + ++new_int; + off[nst] = offset; + st[nst++] = StoreNode::make(*phase, ctl, zmem, adr, atp, +- phase->intcon(con0), T_INT); ++ phase->intcon(con0), T_INT, MemNode::unordered); + } + if (con1 != 0) { + ++new_int; +@@ -3782,7 +3769,7 @@ + adr = make_raw_address(offset, phase); + off[nst] = offset; + st[nst++] = StoreNode::make(*phase, ctl, zmem, adr, atp, +- phase->intcon(con1), T_INT); ++ phase->intcon(con1), T_INT, MemNode::unordered); + } + } + +@@ -4036,7 +4023,7 @@ + intptr_t st_off = get_store_offset(st, phase); + if (st_off < 0) continue; // ignore dead garbage + if (last_off > st_off) { +- tty->print_cr("*** bad store offset at %d: %d > %d", i, last_off, st_off); ++ tty->print_cr("*** bad store offset at %d: " INTX_FORMAT " > " INTX_FORMAT, i, last_off, st_off); + this->dump(2); + assert(false, "ascending store offsets"); + return false; +--- ./hotspot/src/share/vm/opto/memnode.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/memnode.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -51,6 +51,10 @@ + ValueIn, // Value to store + OopStore // Preceeding oop store, only in StoreCM + }; ++ typedef enum { unordered = 0, ++ acquire, // Load has to acquire or be succeeded by MemBarAcquire. ++ release // Store has to release or be preceded by MemBarRelease. ++ } MemOrd; + protected: + MemNode( Node *c0, Node *c1, Node *c2, const TypePtr* at ) + : Node(c0,c1,c2 ) { +@@ -134,20 +138,32 @@ + //------------------------------LoadNode--------------------------------------- + // Load value; requires Memory and Address + class LoadNode : public MemNode { ++private: ++ // On platforms with weak memory ordering (e.g., PPC, Ia64) we distinguish ++ // loads that can be reordered, and such requiring acquire semantics to ++ // adhere to the Java specification. The required behaviour is stored in ++ // this field. ++ const MemOrd _mo; ++ + protected: +- virtual uint cmp( const Node &n ) const; ++ virtual uint cmp(const Node &n) const; + virtual uint size_of() const; // Size is bigger + const Type* const _type; // What kind of value is loaded? + public: + +- LoadNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt ) +- : MemNode(c,mem,adr,at), _type(rt) { ++ LoadNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt, MemOrd mo) ++ : MemNode(c,mem,adr,at), _type(rt), _mo(mo) { + init_class_id(Class_Load); + } ++ inline bool is_unordered() const { return !is_acquire(); } ++ inline bool is_acquire() const { ++ assert(_mo == unordered || _mo == acquire, "unexpected"); ++ return _mo == acquire; ++ } + + // Polymorphic factory method: +- static Node* make( PhaseGVN& gvn, Node *c, Node *mem, Node *adr, +- const TypePtr* at, const Type *rt, BasicType bt ); ++ static Node* make(PhaseGVN& gvn, Node *c, Node *mem, Node *adr, ++ const TypePtr* at, const Type *rt, BasicType bt, MemOrd mo); + + virtual uint hash() const; // Check the type + +@@ -221,8 +237,8 @@ + // Load a byte (8bits signed) from memory + class LoadBNode : public LoadNode { + public: +- LoadBNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE ) +- : LoadNode(c,mem,adr,at,ti) {} ++ LoadBNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo) ++ : LoadNode(c, mem, adr, at, ti, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegI; } + virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); +@@ -235,8 +251,8 @@ + // Load a unsigned byte (8bits unsigned) from memory + class LoadUBNode : public LoadNode { + public: +- LoadUBNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt* ti = TypeInt::UBYTE ) +- : LoadNode(c, mem, adr, at, ti) {} ++ LoadUBNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt* ti, MemOrd mo) ++ : LoadNode(c, mem, adr, at, ti, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegI; } + virtual Node* Ideal(PhaseGVN *phase, bool can_reshape); +@@ -249,8 +265,8 @@ + // Load an unsigned short/char (16bits unsigned) from memory + class LoadUSNode : public LoadNode { + public: +- LoadUSNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR ) +- : LoadNode(c,mem,adr,at,ti) {} ++ LoadUSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo) ++ : LoadNode(c, mem, adr, at, ti, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegI; } + virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); +@@ -263,8 +279,8 @@ + // Load a short (16bits signed) from memory + class LoadSNode : public LoadNode { + public: +- LoadSNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT ) +- : LoadNode(c,mem,adr,at,ti) {} ++ LoadSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo) ++ : LoadNode(c, mem, adr, at, ti, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegI; } + virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); +@@ -277,8 +293,8 @@ + // Load an integer from memory + class LoadINode : public LoadNode { + public: +- LoadINode( Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT ) +- : LoadNode(c,mem,adr,at,ti) {} ++ LoadINode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo) ++ : LoadNode(c, mem, adr, at, ti, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegI; } + virtual int store_Opcode() const { return Op_StoreI; } +@@ -289,8 +305,8 @@ + // Load an array length from the array + class LoadRangeNode : public LoadINode { + public: +- LoadRangeNode( Node *c, Node *mem, Node *adr, const TypeInt *ti = TypeInt::POS ) +- : LoadINode(c,mem,adr,TypeAryPtr::RANGE,ti) {} ++ LoadRangeNode(Node *c, Node *mem, Node *adr, const TypeInt *ti = TypeInt::POS) ++ : LoadINode(c, mem, adr, TypeAryPtr::RANGE, ti, MemNode::unordered) {} + virtual int Opcode() const; + virtual const Type *Value( PhaseTransform *phase ) const; + virtual Node *Identity( PhaseTransform *phase ); +@@ -309,18 +325,16 @@ + const bool _require_atomic_access; // is piecewise load forbidden? + + public: +- LoadLNode( Node *c, Node *mem, Node *adr, const TypePtr* at, +- const TypeLong *tl = TypeLong::LONG, +- bool require_atomic_access = false ) +- : LoadNode(c,mem,adr,at,tl) +- , _require_atomic_access(require_atomic_access) +- {} ++ LoadLNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeLong *tl, ++ MemOrd mo, bool require_atomic_access = false) ++ : LoadNode(c, mem, adr, at, tl, mo), _require_atomic_access(require_atomic_access) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegL; } + virtual int store_Opcode() const { return Op_StoreL; } + virtual BasicType memory_type() const { return T_LONG; } + bool require_atomic_access() { return _require_atomic_access; } +- static LoadLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt); ++ static LoadLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, ++ const Type* rt, MemOrd mo); + #ifndef PRODUCT + virtual void dump_spec(outputStream *st) const { + LoadNode::dump_spec(st); +@@ -333,8 +347,8 @@ + // Load a long from unaligned memory + class LoadL_unalignedNode : public LoadLNode { + public: +- LoadL_unalignedNode( Node *c, Node *mem, Node *adr, const TypePtr* at ) +- : LoadLNode(c,mem,adr,at) {} ++ LoadL_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo) ++ : LoadLNode(c, mem, adr, at, TypeLong::LONG, mo) {} + virtual int Opcode() const; + }; + +@@ -342,8 +356,8 @@ + // Load a float (64 bits) from memory + class LoadFNode : public LoadNode { + public: +- LoadFNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t = Type::FLOAT ) +- : LoadNode(c,mem,adr,at,t) {} ++ LoadFNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t, MemOrd mo) ++ : LoadNode(c, mem, adr, at, t, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegF; } + virtual int store_Opcode() const { return Op_StoreF; } +@@ -354,8 +368,8 @@ + // Load a double (64 bits) from memory + class LoadDNode : public LoadNode { + public: +- LoadDNode( Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t = Type::DOUBLE ) +- : LoadNode(c,mem,adr,at,t) {} ++ LoadDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t, MemOrd mo) ++ : LoadNode(c, mem, adr, at, t, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegD; } + virtual int store_Opcode() const { return Op_StoreD; } +@@ -366,8 +380,8 @@ + // Load a double from unaligned memory + class LoadD_unalignedNode : public LoadDNode { + public: +- LoadD_unalignedNode( Node *c, Node *mem, Node *adr, const TypePtr* at ) +- : LoadDNode(c,mem,adr,at) {} ++ LoadD_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo) ++ : LoadDNode(c, mem, adr, at, Type::DOUBLE, mo) {} + virtual int Opcode() const; + }; + +@@ -375,8 +389,8 @@ + // Load a pointer from memory (either object or array) + class LoadPNode : public LoadNode { + public: +- LoadPNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypePtr* t ) +- : LoadNode(c,mem,adr,at,t) {} ++ LoadPNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypePtr* t, MemOrd mo) ++ : LoadNode(c, mem, adr, at, t, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegP; } + virtual int store_Opcode() const { return Op_StoreP; } +@@ -388,8 +402,8 @@ + // Load a narrow oop from memory (either object or array) + class LoadNNode : public LoadNode { + public: +- LoadNNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const Type* t ) +- : LoadNode(c,mem,adr,at,t) {} ++ LoadNNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const Type* t, MemOrd mo) ++ : LoadNode(c, mem, adr, at, t, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegN; } + virtual int store_Opcode() const { return Op_StoreN; } +@@ -400,8 +414,8 @@ + // Load a Klass from an object + class LoadKlassNode : public LoadPNode { + public: +- LoadKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeKlassPtr *tk ) +- : LoadPNode(c,mem,adr,at,tk) {} ++ LoadKlassNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeKlassPtr *tk, MemOrd mo) ++ : LoadPNode(c, mem, adr, at, tk, mo) {} + virtual int Opcode() const; + virtual const Type *Value( PhaseTransform *phase ) const; + virtual Node *Identity( PhaseTransform *phase ); +@@ -416,8 +430,8 @@ + // Load a narrow Klass from an object. + class LoadNKlassNode : public LoadNNode { + public: +- LoadNKlassNode( Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeNarrowKlass *tk ) +- : LoadNNode(c,mem,adr,at,tk) {} ++ LoadNKlassNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypeNarrowKlass *tk, MemOrd mo) ++ : LoadNNode(c, mem, adr, at, tk, mo) {} + virtual int Opcode() const; + virtual uint ideal_reg() const { return Op_RegN; } + virtual int store_Opcode() const { return Op_StoreNKlass; } +@@ -432,6 +446,14 @@ + //------------------------------StoreNode-------------------------------------- + // Store value; requires Store, Address and Value + class StoreNode : public MemNode { ++private: ++ // On platforms with weak memory ordering (e.g., PPC, Ia64) we distinguish ++ // stores that can be reordered, and such requiring release semantics to ++ // adhere to the Java specification. The required behaviour is stored in ++ // this field. ++ const MemOrd _mo; ++ // Needed for proper cloning. ++ virtual uint size_of() const { return sizeof(*this); } + protected: + virtual uint cmp( const Node &n ) const; + virtual bool depends_only_on_test() const { return false; } +@@ -440,18 +462,44 @@ + Node *Ideal_sign_extended_input(PhaseGVN *phase, int num_bits); + + public: +- StoreNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) +- : MemNode(c,mem,adr,at,val) { ++ // We must ensure that stores of object references will be visible ++ // only after the object's initialization. So the callers of this ++ // procedure must indicate that the store requires `release' ++ // semantics, if the stored value is an object reference that might ++ // point to a new object and may become externally visible. ++ StoreNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) ++ : MemNode(c, mem, adr, at, val), _mo(mo) { + init_class_id(Class_Store); + } +- StoreNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, Node *oop_store ) +- : MemNode(c,mem,adr,at,val,oop_store) { ++ StoreNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, Node *oop_store, MemOrd mo) ++ : MemNode(c, mem, adr, at, val, oop_store), _mo(mo) { + init_class_id(Class_Store); + } + +- // Polymorphic factory method: +- static StoreNode* make( PhaseGVN& gvn, Node *c, Node *mem, Node *adr, +- const TypePtr* at, Node *val, BasicType bt ); ++ inline bool is_unordered() const { return !is_release(); } ++ inline bool is_release() const { ++ assert((_mo == unordered || _mo == release), "unexpected"); ++ return _mo == release; ++ } ++ ++ // Conservatively release stores of object references in order to ++ // ensure visibility of object initialization. ++ static inline MemOrd release_if_reference(const BasicType t) { ++ const MemOrd mo = (t == T_ARRAY || ++ t == T_ADDRESS || // Might be the address of an object reference (`boxing'). ++ t == T_OBJECT) ? release : unordered; ++ return mo; ++ } ++ ++ // Polymorphic factory method ++ // ++ // We must ensure that stores of object references will be visible ++ // only after the object's initialization. So the callers of this ++ // procedure must indicate that the store requires `release' ++ // semantics, if the stored value is an object reference that might ++ // point to a new object and may become externally visible. ++ static StoreNode* make(PhaseGVN& gvn, Node *c, Node *mem, Node *adr, ++ const TypePtr* at, Node *val, BasicType bt, MemOrd mo); + + virtual uint hash() const; // Check the type + +@@ -482,7 +530,8 @@ + // Store byte to memory + class StoreBNode : public StoreNode { + public: +- StoreBNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} ++ StoreBNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) ++ : StoreNode(c, mem, adr, at, val, mo) {} + virtual int Opcode() const; + virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); + virtual BasicType memory_type() const { return T_BYTE; } +@@ -492,7 +541,8 @@ + // Store char/short to memory + class StoreCNode : public StoreNode { + public: +- StoreCNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} ++ StoreCNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) ++ : StoreNode(c, mem, adr, at, val, mo) {} + virtual int Opcode() const; + virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); + virtual BasicType memory_type() const { return T_CHAR; } +@@ -502,7 +552,8 @@ + // Store int to memory + class StoreINode : public StoreNode { + public: +- StoreINode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} ++ StoreINode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) ++ : StoreNode(c, mem, adr, at, val, mo) {} + virtual int Opcode() const; + virtual BasicType memory_type() const { return T_INT; } + }; +@@ -519,15 +570,12 @@ + const bool _require_atomic_access; // is piecewise store forbidden? + + public: +- StoreLNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, +- bool require_atomic_access = false ) +- : StoreNode(c,mem,adr,at,val) +- , _require_atomic_access(require_atomic_access) +- {} ++ StoreLNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo, bool require_atomic_access = false) ++ : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {} + virtual int Opcode() const; + virtual BasicType memory_type() const { return T_LONG; } + bool require_atomic_access() { return _require_atomic_access; } +- static StoreLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val); ++ static StoreLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo); + #ifndef PRODUCT + virtual void dump_spec(outputStream *st) const { + StoreNode::dump_spec(st); +@@ -540,7 +588,8 @@ + // Store float to memory + class StoreFNode : public StoreNode { + public: +- StoreFNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} ++ StoreFNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) ++ : StoreNode(c, mem, adr, at, val, mo) {} + virtual int Opcode() const; + virtual BasicType memory_type() const { return T_FLOAT; } + }; +@@ -549,7 +598,8 @@ + // Store double to memory + class StoreDNode : public StoreNode { + public: +- StoreDNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} ++ StoreDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) ++ : StoreNode(c, mem, adr, at, val, mo) {} + virtual int Opcode() const; + virtual BasicType memory_type() const { return T_DOUBLE; } + }; +@@ -558,7 +608,8 @@ + // Store pointer to memory + class StorePNode : public StoreNode { + public: +- StorePNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} ++ StorePNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) ++ : StoreNode(c, mem, adr, at, val, mo) {} + virtual int Opcode() const; + virtual BasicType memory_type() const { return T_ADDRESS; } + }; +@@ -567,7 +618,8 @@ + // Store narrow oop to memory + class StoreNNode : public StoreNode { + public: +- StoreNNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNode(c,mem,adr,at,val) {} ++ StoreNNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) ++ : StoreNode(c, mem, adr, at, val, mo) {} + virtual int Opcode() const; + virtual BasicType memory_type() const { return T_NARROWOOP; } + }; +@@ -576,7 +628,8 @@ + // Store narrow klass to memory + class StoreNKlassNode : public StoreNNode { + public: +- StoreNKlassNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val ) : StoreNNode(c,mem,adr,at,val) {} ++ StoreNKlassNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) ++ : StoreNNode(c, mem, adr, at, val, mo) {} + virtual int Opcode() const; + virtual BasicType memory_type() const { return T_NARROWKLASS; } + }; +@@ -597,7 +650,7 @@ + + public: + StoreCMNode( Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, Node *oop_store, int oop_alias_idx ) : +- StoreNode(c,mem,adr,at,val,oop_store), ++ StoreNode(c, mem, adr, at, val, oop_store, MemNode::release), + _oop_alias_idx(oop_alias_idx) { + assert(_oop_alias_idx >= Compile::AliasIdxRaw || + _oop_alias_idx == Compile::AliasIdxBot && Compile::current()->AliasLevel() == 0, +@@ -617,8 +670,8 @@ + // On PowerPC and friends it's a real load-locked. + class LoadPLockedNode : public LoadPNode { + public: +- LoadPLockedNode( Node *c, Node *mem, Node *adr ) +- : LoadPNode(c,mem,adr,TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM) {} ++ LoadPLockedNode(Node *c, Node *mem, Node *adr, MemOrd mo) ++ : LoadPNode(c, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM, mo) {} + virtual int Opcode() const; + virtual int store_Opcode() const { return Op_StorePConditional; } + virtual bool depends_only_on_test() const { return true; } +@@ -941,6 +994,17 @@ + virtual int Opcode() const; + }; + ++// "Acquire" - no following ref can move before (but earlier refs can ++// follow, like an early Load stalled in cache). Requires multi-cpu ++// visibility. Inserted independ of any load, as required ++// for intrinsic sun.misc.Unsafe.loadFence(). ++class LoadFenceNode: public MemBarNode { ++public: ++ LoadFenceNode(Compile* C, int alias_idx, Node* precedent) ++ : MemBarNode(C, alias_idx, precedent) {} ++ virtual int Opcode() const; ++}; ++ + // "Release" - no earlier ref can move after (but later refs can move + // up, like a speculative pipelined cache-hitting Load). Requires + // multi-cpu visibility. Inserted before a volatile store. +@@ -951,6 +1015,17 @@ + virtual int Opcode() const; + }; + ++// "Release" - no earlier ref can move after (but later refs can move ++// up, like a speculative pipelined cache-hitting Load). Requires ++// multi-cpu visibility. Inserted independent of any store, as required ++// for intrinsic sun.misc.Unsafe.storeFence(). ++class StoreFenceNode: public MemBarNode { ++public: ++ StoreFenceNode(Compile* C, int alias_idx, Node* precedent) ++ : MemBarNode(C, alias_idx, precedent) {} ++ virtual int Opcode() const; ++}; ++ + // "Acquire" - no following ref can move before (but earlier refs can + // follow, like an early Load stalled in cache). Requires multi-cpu + // visibility. Inserted after a FastLock. +--- ./hotspot/src/share/vm/opto/mulnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/mulnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -485,7 +485,8 @@ + Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), +- load->adr_type()); ++ load->adr_type(), ++ TypeInt::CHAR, MemNode::unordered); + ldus = phase->transform(ldus); + return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); + } +@@ -496,7 +497,8 @@ + Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), +- load->adr_type()); ++ load->adr_type(), ++ TypeInt::UBYTE, MemNode::unordered); + ldub = phase->transform(ldub); + return new (phase->C) AndINode(ldub, phase->intcon(mask)); + } +@@ -931,9 +933,10 @@ + 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()); ++ 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 +--- ./hotspot/src/share/vm/opto/multnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/multnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -54,11 +54,6 @@ + assert(Opcode() != Op_If || proj->Opcode() == (which_proj?Op_IfTrue:Op_IfFalse), "bad if #2"); + return proj; + } +- } else if (p->is_FlagsProj()) { +- FlagsProjNode *proj = p->as_FlagsProj(); +- if (proj->_con == which_proj) { +- return proj; +- } + } else { + assert(p == this && this->is_Start(), "else must be proj"); + continue; +@@ -94,7 +89,7 @@ + if ((_con == TypeFunc::Parms) && + n->is_CallStaticJava() && n->as_CallStaticJava()->is_boxing_method()) { + // The result of autoboxing is always non-null on normal path. +- t = t->join(TypePtr::NOTNULL); ++ t = t->join_speculative(TypePtr::NOTNULL); + } + return t; + } +--- ./hotspot/src/share/vm/opto/node.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/node.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -27,6 +27,7 @@ + #include "memory/allocation.inline.hpp" + #include "opto/cfgnode.hpp" + #include "opto/connode.hpp" ++#include "opto/loopnode.hpp" + #include "opto/machnode.hpp" + #include "opto/matcher.hpp" + #include "opto/node.hpp" +@@ -995,13 +996,13 @@ + if (is_Type()) { + TypeNode *n = this->as_Type(); + if (VerifyAliases) { +- assert(new_type->higher_equal(n->type()), "new type must refine old type"); ++ assert(new_type->higher_equal_speculative(n->type()), "new type must refine old type"); + } + n->set_type(new_type); + } else if (is_Load()) { + LoadNode *n = this->as_Load(); + if (VerifyAliases) { +- assert(new_type->higher_equal(n->type()), "new type must refine old type"); ++ assert(new_type->higher_equal_speculative(n->type()), "new type must refine old type"); + } + n->set_type(new_type); + } +@@ -1255,6 +1256,7 @@ + + Node *top = igvn->C->top(); + nstack.push(dead); ++ bool has_irreducible_loop = igvn->C->has_irreducible_loop(); + + while (nstack.size() > 0) { + dead = nstack.pop(); +@@ -1269,13 +1271,31 @@ + assert (!use->is_Con(), "Control for Con node should be Root node."); + use->set_req(0, top); // Cut dead edge to prevent processing + nstack.push(use); // the dead node again. ++ } else if (!has_irreducible_loop && // Backedge could be alive in irreducible loop ++ use->is_Loop() && !use->is_Root() && // Don't kill Root (RootNode extends LoopNode) ++ use->in(LoopNode::EntryControl) == dead) { // Dead loop if its entry is dead ++ use->set_req(LoopNode::EntryControl, top); // Cut dead edge to prevent processing ++ use->set_req(0, top); // Cut self edge ++ nstack.push(use); + } else { // Else found a not-dead user ++ // Dead if all inputs are top or null ++ bool dead_use = !use->is_Root(); // Keep empty graph alive + for (uint j = 1; j < use->req(); j++) { +- if (use->in(j) == dead) { // Turn all dead inputs into TOP ++ Node* in = use->in(j); ++ if (in == dead) { // Turn all dead inputs into TOP + use->set_req(j, top); ++ } else if (in != NULL && !in->is_top()) { ++ dead_use = false; + } + } +- igvn->_worklist.push(use); ++ if (dead_use) { ++ if (use->is_Region()) { ++ use->set_req(0, top); // Cut self edge ++ } ++ nstack.push(use); ++ } else { ++ igvn->_worklist.push(use); ++ } + } + // Refresh the iterator, since any number of kills might have happened. + k = dead->last_outs(kmin); +@@ -1523,7 +1543,6 @@ + + + #ifndef PRODUCT +-int Node::_in_dump_cnt = 0; + + // -----------------------------Name------------------------------------------- + extern const char *NodeClassNames[]; +@@ -1595,7 +1614,7 @@ + void Node::dump(const char* suffix, outputStream *st) const { + Compile* C = Compile::current(); + bool is_new = C->node_arena()->contains(this); +- _in_dump_cnt++; ++ C->_in_dump_cnt++; + st->print("%c%d\t%s\t=== ", is_new ? ' ' : 'o', _idx, Name()); + + // Dump the required and precedence inputs +@@ -1610,7 +1629,7 @@ + dump_orig(debug_orig(), st); + #endif + st->cr(); +- _in_dump_cnt--; ++ C->_in_dump_cnt--; + return; // don't process dead nodes + } + +@@ -1661,8 +1680,8 @@ + } + } + } +- if (suffix) st->print(suffix); +- _in_dump_cnt--; ++ if (suffix) st->print("%s", suffix); ++ C->_in_dump_cnt--; + } + + //------------------------------dump_req-------------------------------------- +--- ./hotspot/src/share/vm/opto/node.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/node.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -69,7 +69,6 @@ + class EncodePKlassNode; + class FastLockNode; + class FastUnlockNode; +-class FlagsProjNode; + class IfNode; + class IfFalseNode; + class IfTrueNode; +@@ -100,7 +99,6 @@ + class MachSpillCopyNode; + class MachTempNode; + class Matcher; +-class MathExactNode; + class MemBarNode; + class MemBarStoreStoreNode; + class MemNode; +@@ -357,6 +355,8 @@ + + // Reference to the i'th input Node. Error if out of bounds. + Node* in(uint i) const { assert(i < _max, err_msg_res("oob: i=%d, _max=%d", i, _max)); return _in[i]; } ++ // Reference to the i'th input Node. NULL if out of bounds. ++ Node* lookup(uint i) const { return ((i < _max) ? _in[i] : NULL); } + // Reference to the i'th output Node. Error if out of bounds. + // Use this accessor sparingly. We are going trying to use iterators instead. + Node* raw_out(uint i) const { assert(i < _outcnt,"oob"); return _out[i]; } +@@ -384,6 +384,10 @@ + + // Set a required input edge, also updates corresponding output edge + void add_req( Node *n ); // Append a NEW required input ++ void add_req( Node *n0, Node *n1 ) { ++ add_req(n0); add_req(n1); } ++ void add_req( Node *n0, Node *n1, Node *n2 ) { ++ add_req(n0); add_req(n1); add_req(n2); } + void add_req_batch( Node* n, uint m ); // Append m NEW required inputs (all n). + void del_req( uint idx ); // Delete required edge & compact + void del_req_ordered( uint idx ); // Delete required edge & compact with preserved order +@@ -569,7 +573,6 @@ + DEFINE_CLASS_ID(MemBar, Multi, 3) + DEFINE_CLASS_ID(Initialize, MemBar, 0) + DEFINE_CLASS_ID(MemBarStoreStore, MemBar, 1) +- DEFINE_CLASS_ID(MathExact, Multi, 4) + + DEFINE_CLASS_ID(Mach, Node, 1) + DEFINE_CLASS_ID(MachReturn, Mach, 0) +@@ -626,7 +629,6 @@ + DEFINE_CLASS_ID(Cmp, Sub, 0) + DEFINE_CLASS_ID(FastLock, Cmp, 0) + DEFINE_CLASS_ID(FastUnlock, Cmp, 1) +- DEFINE_CLASS_ID(FlagsProj, Cmp, 2) + + DEFINE_CLASS_ID(MergeMem, Node, 7) + DEFINE_CLASS_ID(Bool, Node, 8) +@@ -643,17 +645,18 @@ + + // Flags are sorted by usage frequency. + enum NodeFlags { +- Flag_is_Copy = 0x01, // should be first bit to avoid shift +- Flag_rematerialize = Flag_is_Copy << 1, ++ Flag_is_Copy = 0x01, // should be first bit to avoid shift ++ Flag_rematerialize = Flag_is_Copy << 1, + Flag_needs_anti_dependence_check = Flag_rematerialize << 1, +- Flag_is_macro = Flag_needs_anti_dependence_check << 1, +- Flag_is_Con = Flag_is_macro << 1, +- Flag_is_cisc_alternate = Flag_is_Con << 1, +- Flag_is_dead_loop_safe = Flag_is_cisc_alternate << 1, +- Flag_may_be_short_branch = Flag_is_dead_loop_safe << 1, +- Flag_avoid_back_to_back = Flag_may_be_short_branch << 1, +- Flag_has_call = Flag_avoid_back_to_back << 1, +- Flag_is_expensive = Flag_has_call << 1, ++ Flag_is_macro = Flag_needs_anti_dependence_check << 1, ++ Flag_is_Con = Flag_is_macro << 1, ++ Flag_is_cisc_alternate = Flag_is_Con << 1, ++ Flag_is_dead_loop_safe = Flag_is_cisc_alternate << 1, ++ Flag_may_be_short_branch = Flag_is_dead_loop_safe << 1, ++ Flag_avoid_back_to_back_before = Flag_may_be_short_branch << 1, ++ Flag_avoid_back_to_back_after = Flag_avoid_back_to_back_before << 1, ++ Flag_has_call = Flag_avoid_back_to_back_after << 1, ++ Flag_is_expensive = Flag_has_call << 1, + _max_flags = (Flag_is_expensive << 1) - 1 // allow flags combination + }; + +@@ -730,7 +733,6 @@ + DEFINE_CLASS_QUERY(EncodePKlass) + DEFINE_CLASS_QUERY(FastLock) + DEFINE_CLASS_QUERY(FastUnlock) +- DEFINE_CLASS_QUERY(FlagsProj) + DEFINE_CLASS_QUERY(If) + DEFINE_CLASS_QUERY(IfFalse) + DEFINE_CLASS_QUERY(IfTrue) +@@ -759,7 +761,6 @@ + DEFINE_CLASS_QUERY(MachSafePoint) + DEFINE_CLASS_QUERY(MachSpillCopy) + DEFINE_CLASS_QUERY(MachTemp) +- DEFINE_CLASS_QUERY(MathExact) + DEFINE_CLASS_QUERY(Mem) + DEFINE_CLASS_QUERY(MemBar) + DEFINE_CLASS_QUERY(MemBarStoreStore) +@@ -1027,8 +1028,7 @@ + // RegMask Print Functions + void dump_in_regmask(int idx) { in_RegMask(idx).dump(); } + void dump_out_regmask() { out_RegMask().dump(); } +- static int _in_dump_cnt; +- static bool in_dump() { return _in_dump_cnt > 0; } ++ static bool in_dump() { return Compile::current()->_in_dump_cnt > 0; } + void fast_dump() const { + tty->print("%4d: %-17s", _idx, Name()); + for (uint i = 0; i < len(); i++) +@@ -1350,7 +1350,7 @@ + public: + Node_List() : Node_Array(Thread::current()->resource_area()), _cnt(0) {} + Node_List(Arena *a) : Node_Array(a), _cnt(0) {} +- bool contains(Node* n) { ++ bool contains(const Node* n) const { + for (uint e = 0; e < size(); e++) { + if (at(e) == n) return true; + } +--- ./hotspot/src/share/vm/opto/output.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/output.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -42,18 +42,12 @@ + #include "runtime/handles.inline.hpp" + #include "utilities/xmlstream.hpp" + +-extern uint size_exception_handler(); +-extern uint size_deopt_handler(); +- + #ifndef PRODUCT + #define DEBUG_ARG(x) , x + #else + #define DEBUG_ARG(x) + #endif + +-extern int emit_exception_handler(CodeBuffer &cbuf); +-extern int emit_deopt_handler(CodeBuffer &cbuf); +- + // Convert Nodes to instruction bits and pass off to the VM + void Compile::Output() { + // RootNode goes +@@ -171,8 +165,13 @@ + // Determine if we need to generate a stack overflow check. + // Do it if the method is not a stub function and + // has java calls or has frame size > vm_page_size/8. ++ // The debug VM checks that deoptimization doesn't trigger an ++ // unexpected stack overflow (compiled method stack banging should ++ // guarantee it doesn't happen) so we always need the stack bang in ++ // a debug VM. + return (UseStackBanging && stub_function() == NULL && +- (has_java_calls() || frame_size_in_bytes > os::vm_page_size()>>3)); ++ (has_java_calls() || frame_size_in_bytes > os::vm_page_size()>>3 ++ DEBUG_ONLY(|| true))); + } + + bool Compile::need_register_stack_bang() const { +@@ -394,6 +393,11 @@ + blk_size += (mach->alignment_required() - 1) * relocInfo::addr_unit(); // assume worst case padding + reloc_size += mach->reloc(); + if (mach->is_MachCall()) { ++ // add size information for trampoline stub ++ // class CallStubImpl is platform-specific and defined in the *.ad files. ++ stub_size += CallStubImpl::size_call_trampoline(); ++ reloc_size += CallStubImpl::reloc_call_trampoline(); ++ + MachCallNode *mcall = mach->as_MachCall(); + // This destination address is NOT PC-relative + +@@ -412,7 +416,7 @@ + blk_size += nop_size; + } + } +- if (mach->avoid_back_to_back()) { ++ if (mach->avoid_back_to_back(MachNode::AVOID_BEFORE)) { + // Nop is inserted between "avoid back to back" instructions. + // ScheduleAndBundle() can rearrange nodes in a block, + // check for all offsets inside this block. +@@ -440,7 +444,7 @@ + last_call_adr = blk_starts[i]+blk_size; + } + // Remember end of avoid_back_to_back offset +- if (nj->is_Mach() && nj->as_Mach()->avoid_back_to_back()) { ++ if (nj->is_Mach() && nj->as_Mach()->avoid_back_to_back(MachNode::AVOID_AFTER)) { + last_avoid_back_to_back_adr = blk_starts[i]+blk_size; + } + } +@@ -526,11 +530,11 @@ + int new_size = replacement->size(_regalloc); + int diff = br_size - new_size; + assert(diff >= (int)nop_size, "short_branch size should be smaller"); +- // Conservatively take into accound padding between ++ // Conservatively take into account padding between + // avoid_back_to_back branches. Previous branch could be + // converted into avoid_back_to_back branch during next + // rounds. +- if (needs_padding && replacement->avoid_back_to_back()) { ++ if (needs_padding && replacement->avoid_back_to_back(MachNode::AVOID_BEFORE)) { + jmp_offset[i] += nop_size; + diff -= nop_size; + } +@@ -549,7 +553,7 @@ + } + } // (mach->may_be_short_branch()) + if (mach != NULL && (mach->may_be_short_branch() || +- mach->avoid_back_to_back())) { ++ mach->avoid_back_to_back(MachNode::AVOID_AFTER))) { + last_may_be_short_branch_adr = blk_starts[i] + jmp_offset[i] + jmp_size[i]; + } + blk_starts[i+1] -= adjust_block_start; +@@ -1078,7 +1082,7 @@ + // Compute prolog code size + _method_size = 0; + _frame_slots = OptoReg::reg2stack(_matcher->_old_SP)+_regalloc->_framesize; +-#ifdef IA64 ++#if defined(IA64) && !defined(AIX) + if (save_argument_registers()) { + // 4815101: this is a stub with implicit and unknown precision fp args. + // The usual spill mechanism can only generate stfd's in this case, which +@@ -1096,6 +1100,7 @@ + assert(_frame_slots >= 0 && _frame_slots < 1000000, "sanity check"); + + if (has_mach_constant_base_node()) { ++ uint add_size = 0; + // Fill the constant table. + // Note: This must happen before shorten_branches. + for (uint i = 0; i < _cfg->number_of_blocks(); i++) { +@@ -1109,6 +1114,9 @@ + if (n->is_MachConstant()) { + MachConstantNode* machcon = n->as_MachConstant(); + machcon->eval_constant(C); ++ } else if (n->is_Mach()) { ++ // On Power there are more nodes that issue constants. ++ add_size += (n->as_Mach()->ins_num_consts() * 8); + } + } + } +@@ -1116,7 +1124,7 @@ + // Calculate the offsets of the constants and the size of the + // constant table (including the padding to the next section). + constant_table().calculate_offsets_and_size(); +- const_req = constant_table().size(); ++ const_req = constant_table().size() + add_size; + } + + // Initialize the space for the BufferBlob used to find and verify +@@ -1129,10 +1137,9 @@ + shorten_branches(blk_starts, code_req, locs_req, stub_req); + + // nmethod and CodeBuffer count stubs & constants as part of method's code. +- int exception_handler_req = size_exception_handler(); +- int deopt_handler_req = size_deopt_handler(); +- exception_handler_req += MAX_stubs_size; // add marginal slop for handler +- deopt_handler_req += MAX_stubs_size; // add marginal slop for handler ++ // class HandlerImpl is platform-specific and defined in the *.ad files. ++ int exception_handler_req = HandlerImpl::size_exception_handler() + MAX_stubs_size; // add marginal slop for handler ++ int deopt_handler_req = HandlerImpl::size_deopt_handler() + MAX_stubs_size; // add marginal slop for handler + stub_req += MAX_stubs_size; // ensure per-stub margin + code_req += MAX_inst_size; // ensure per-instruction margin + +@@ -1311,7 +1318,7 @@ + if (is_sfn && !is_mcall && padding == 0 && current_offset == last_call_offset) { + padding = nop_size; + } +- if (padding == 0 && mach->avoid_back_to_back() && ++ if (padding == 0 && mach->avoid_back_to_back(MachNode::AVOID_BEFORE) && + current_offset == last_avoid_back_to_back_offset) { + // Avoid back to back some instructions. + padding = nop_size; +@@ -1387,7 +1394,7 @@ + int offset = blk_starts[block_num] - current_offset; + if (block_num >= i) { + // Current and following block's offset are not +- // finilized yet, adjust distance by the difference ++ // finalized yet, adjust distance by the difference + // between calculated and final offsets of current block. + offset -= (blk_starts[i] - blk_offset); + } +@@ -1405,7 +1412,7 @@ + int new_size = replacement->size(_regalloc); + 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()) { ++ if (needs_padding && replacement->avoid_back_to_back(MachNode::AVOID_BEFORE)) { + MachNode *nop = new (this) MachNopNode(); + block->insert_node(nop, j++); + _cfg->map_node_to_block(nop, block); +@@ -1468,6 +1475,12 @@ + // Intel all the time, with add-to-memory kind of opcodes. + previous_offset = current_offset; + } ++ ++ // Not an else-if! ++ // If this is a trap based cmp then add its offset to the list. ++ if (mach->is_TrapBasedCheckNode()) { ++ inct_starts[inct_cnt++] = current_offset; ++ } + } + + // Verify that there is sufficient space remaining +@@ -1507,7 +1520,7 @@ + last_call_offset = current_offset; + } + +- if (n->is_Mach() && n->as_Mach()->avoid_back_to_back()) { ++ if (n->is_Mach() && n->as_Mach()->avoid_back_to_back(MachNode::AVOID_AFTER)) { + // Avoid back to back some instructions. + last_avoid_back_to_back_offset = current_offset; + } +@@ -1612,17 +1625,18 @@ + FillExceptionTables(inct_cnt, call_returns, inct_starts, blk_labels); + + // Only java methods have exception handlers and deopt handlers ++ // class HandlerImpl is platform-specific and defined in the *.ad files. + if (_method) { + // Emit the exception handler code. +- _code_offsets.set_value(CodeOffsets::Exceptions, emit_exception_handler(*cb)); ++ _code_offsets.set_value(CodeOffsets::Exceptions, HandlerImpl::emit_exception_handler(*cb)); + // Emit the deopt handler code. +- _code_offsets.set_value(CodeOffsets::Deopt, emit_deopt_handler(*cb)); ++ _code_offsets.set_value(CodeOffsets::Deopt, HandlerImpl::emit_deopt_handler(*cb)); + + // Emit the MethodHandle deopt handler code (if required). + if (has_method_handle_invokes()) { + // We can use the same code as for the normal deopt handler, we + // just need a different entry point address. +- _code_offsets.set_value(CodeOffsets::DeoptMH, emit_deopt_handler(*cb)); ++ _code_offsets.set_value(CodeOffsets::DeoptMH, HandlerImpl::emit_deopt_handler(*cb)); + } + } + +@@ -1734,6 +1748,12 @@ + _inc_table.append(inct_starts[inct_cnt++], blk_labels[block_num].loc_pos()); + continue; + } ++ // Handle implicit exception table updates: trap instructions. ++ if (n->is_Mach() && n->as_Mach()->is_TrapBasedCheckNode()) { ++ uint block_num = block->non_connector_successor(0)->_pre_order; ++ _inc_table.append(inct_starts[inct_cnt++], blk_labels[block_num].loc_pos()); ++ continue; ++ } + } // End of for all blocks fill in exception table entries + } + +--- ./hotspot/src/share/vm/opto/output.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/output.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -42,8 +42,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" + #endif + + class Arena; +--- ./hotspot/src/share/vm/opto/parse.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/parse.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -141,6 +141,13 @@ + GrowableArray subtrees() { return _subtrees; } + + void print_value_on(outputStream* st) const PRODUCT_RETURN; ++ ++ bool _forced_inline; // Inlining was forced by CompilerOracle or ciReplay ++ bool forced_inline() const { return _forced_inline; } ++ // Count number of nodes in this subtree ++ int count() const; ++ // Dump inlining replay data to the stream. ++ void dump_replay_data(outputStream* out); + }; + + +@@ -330,7 +337,8 @@ + + GraphKit _exits; // Record all normal returns and throws here. + bool _wrote_final; // Did we write a final field? +- bool _count_invocations; // update and test invocation counter ++ bool _wrote_volatile; // Did we write a volatile field? ++ bool _count_invocations; // update and test invocation counter + bool _method_data_update; // update method data oop + Node* _alloc_with_final; // An allocation node with final field + +@@ -373,6 +381,8 @@ + GraphKit& exits() { return _exits; } + bool wrote_final() const { return _wrote_final; } + void set_wrote_final(bool z) { _wrote_final = z; } ++ bool wrote_volatile() const { return _wrote_volatile; } ++ void set_wrote_volatile(bool z) { _wrote_volatile = z; } + bool count_invocations() const { return _count_invocations; } + bool method_data_update() const { return _method_data_update; } + Node* alloc_with_final() const { return _alloc_with_final; } +@@ -470,6 +480,8 @@ + // Helper function to compute array addressing + Node* array_addressing(BasicType type, int vals, const Type* *result2=NULL); + ++ void rtm_deopt(); ++ + // Pass current map to exits + void return_current(Node* value); + +--- ./hotspot/src/share/vm/opto/parse1.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/parse1.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -106,24 +106,24 @@ + // Very similar to LoadNode::make, except we handle un-aligned longs and + // 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 ); break; +- case T_FLOAT: l = new (C) LoadFNode( ctl, mem, adr, TypeRawPtr::BOTTOM ); break; +- case T_ADDRESS: l = new (C) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeRawPtr::BOTTOM ); break; +- case T_OBJECT: l = new (C) LoadPNode( ctl, mem, adr, TypeRawPtr::BOTTOM, TypeInstPtr::BOTTOM ); break; ++ 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_LONG: + case T_DOUBLE: { + // Since arguments are in reverse order, the argument address 'adr' + // refers to the back half of the long/double. Recompute adr. +- adr = basic_plus_adr( local_addrs_base, local_addrs, -(index+1)*wordSize ); +- if( Matcher::misaligned_doubles_ok ) { ++ 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 ) +- : (Node*)new (C) LoadLNode( ctl, mem, adr, TypeRawPtr::BOTTOM ); ++ ? (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); + } else { + l = (bt == T_DOUBLE) +- ? (Node*)new (C) LoadD_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM ) +- : (Node*)new (C) LoadL_unalignedNode( ctl, mem, adr, TypeRawPtr::BOTTOM ); ++ ? (Node*)new (C) LoadD_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered) ++ : (Node*)new (C) LoadL_unalignedNode(ctl, mem, adr, TypeRawPtr::BOTTOM, MemNode::unordered); + } + break; + } +@@ -229,7 +229,7 @@ + Node *displaced_hdr = fetch_interpreter_state((index*2) + 1, T_ADDRESS, monitors_addr, osr_buf); + + +- store_to_memory(control(), box, displaced_hdr, T_ADDRESS, Compile::AliasIdxRaw); ++ store_to_memory(control(), box, displaced_hdr, T_ADDRESS, Compile::AliasIdxRaw, MemNode::unordered); + + // Build a bogus FastLockNode (no code will be generated) and push the + // monitor into our debug info. +@@ -390,6 +390,7 @@ + _expected_uses = expected_uses; + _depth = 1 + (caller->has_method() ? caller->depth() : 0); + _wrote_final = false; ++ _wrote_volatile = false; + _alloc_with_final = NULL; + _entry_bci = InvocationEntryBci; + _tf = NULL; +@@ -564,6 +565,10 @@ + set_map(entry_map); + do_method_entry(); + } ++ if (depth() == 1) { ++ // Add check to deoptimize the nmethod if RTM state was changed ++ rtm_deopt(); ++ } + + // Check for bailouts during method entry. + if (failing()) { +@@ -602,7 +607,7 @@ + set_map(entry_map); + do_exits(); + +- if (log) log->done("parse nodes='%d' live='%d' memory='%d'", ++ if (log) log->done("parse nodes='%d' live='%d' memory='" SIZE_FORMAT "'", + C->unique(), C->live_nodes(), C->node_arena()->used()); + } + +@@ -907,7 +912,13 @@ + Node* iophi = _exits.i_o(); + _exits.set_i_o(gvn().transform(iophi)); + +- if (wrote_final()) { ++ // On PPC64, also add MemBarRelease for constructors which write ++ // volatile fields. As support_IRIW_for_not_multiple_copy_atomic_cpu ++ // is set on PPC64, no sync instruction is issued after volatile ++ // stores. We want to quarantee the same behaviour as on platforms ++ // with total store order, although this is not required by the Java ++ // memory model. So as with finals, we add a barrier here. ++ if (wrote_final() PPC64_ONLY(|| (wrote_volatile() && method()->is_initializer()))) { + // This method (which must be a constructor by the rules of Java) + // wrote a final. The effects of all initializations must be + // committed to memory before any code after the constructor +@@ -1358,7 +1369,7 @@ + tty->print((( i < ns) ? " %d" : " %d(e)"), b->successor_at(i)->rpo()); + } + if (b->is_loop_head()) tty->print(" lphd"); +- tty->print_cr(""); ++ tty->cr(); + } + + assert(block()->is_merged(), "must be merged before being parsed"); +@@ -1649,7 +1660,7 @@ + assert(bt1 != Type::BOTTOM, "should not be building conflict phis"); + map()->set_req(j, _gvn.transform_no_reclaim(phi)); + debug_only(const Type* bt2 = phi->bottom_type()); +- assert(bt2->higher_equal(bt1), "must be consistent with type-flow"); ++ assert(bt2->higher_equal_speculative(bt1), "must be consistent with type-flow"); + record_for_igvn(phi); + } + } +@@ -1931,7 +1942,7 @@ + Node* klass = _gvn.transform( LoadKlassNode::make(_gvn, immutable_memory(), klass_addr, TypeInstPtr::KLASS) ); + + 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); ++ 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))); +@@ -1975,6 +1986,42 @@ + set_control( _gvn.transform(result_rgn) ); + } + ++// Add check to deoptimize if RTM state is not ProfileRTM ++void Parse::rtm_deopt() { ++#if INCLUDE_RTM_OPT ++ if (C->profile_rtm()) { ++ assert(C->method() != NULL, "only for normal compilations"); ++ assert(!C->method()->method_data()->is_empty(), "MDO is needed to record RTM state"); ++ assert(depth() == 1, "generate check only for main compiled method"); ++ ++ // Set starting bci for uncommon trap. ++ set_parse_bci(is_osr_parse() ? osr_bci() : 0); ++ ++ // Load the rtm_state from the MethodData. ++ const TypePtr* adr_type = TypeMetadataPtr::make(C->method()->method_data()); ++ Node* mdo = makecon(adr_type); ++ int offset = MethodData::rtm_state_offset_in_bytes(); ++ Node* adr_node = basic_plus_adr(mdo, mdo, offset); ++ Node* rtm_state = make_load(control(), adr_node, TypeInt::INT, T_INT, adr_type, MemNode::unordered); ++ ++ // Separate Load from Cmp by Opaque. ++ // In expand_macro_nodes() it will be replaced either ++ // with this load when there are locks in the code ++ // 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) ); ++ // Branch to failure if state was changed ++ { BuildCutout unless(this, tst, PROB_ALWAYS); ++ uncommon_trap(Deoptimization::Reason_rtm_state_change, ++ Deoptimization::Action_make_not_entrant); ++ } ++ } ++#endif ++} ++ + //------------------------------return_current--------------------------------- + // Append current _map to _exit_return + void Parse::return_current(Node* value) { +@@ -2022,7 +2069,7 @@ + !tp->klass()->is_interface()) { + // sharpen the type eagerly; this eases certain assert checking + if (tp->higher_equal(TypeInstPtr::NOTNULL)) +- tr = tr->join(TypeInstPtr::NOTNULL)->is_instptr(); ++ tr = tr->join_speculative(TypeInstPtr::NOTNULL)->is_instptr(); + value = _gvn.transform(new (C) CheckCastPPNode(0,value,tr)); + } + } +--- ./hotspot/src/share/vm/opto/parse2.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/parse2.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -50,7 +50,7 @@ + if (stopped()) return; // guaranteed null or range check + dec_sp(2); // Pop array and index + const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type); +- Node* ld = make_load(control(), adr, elem, elem_type, adr_type); ++ Node* ld = make_load(control(), adr, elem, elem_type, adr_type, MemNode::unordered); + push(ld); + } + +@@ -62,7 +62,7 @@ + Node* val = pop(); + dec_sp(2); // Pop array and index + const TypeAryPtr* adr_type = TypeAryPtr::get_array_body_type(elem_type); +- store_to_memory(control(), adr, val, elem_type, adr_type); ++ store_to_memory(control(), adr, val, elem_type, adr_type, StoreNode::release_if_reference(elem_type)); + } + + +@@ -88,7 +88,7 @@ + if (toop->klass()->as_instance_klass()->unique_concrete_subklass()) { + // If we load from "AbstractClass[]" we must see "ConcreteSubClass". + const Type* subklass = Type::get_const_type(toop->klass()); +- elemtype = subklass->join(el); ++ elemtype = subklass->join_speculative(el); + } + } + } +@@ -626,7 +626,7 @@ + _method->print_short_name(); + tty->print_cr(" switch decision tree"); + tty->print_cr(" %d ranges (%d singletons), max_depth=%d, est_depth=%d", +- hi-lo+1, nsing, _max_switch_depth, _est_switch_depth); ++ (int) (hi-lo+1), nsing, _max_switch_depth, _est_switch_depth); + if (_max_switch_depth > _est_switch_depth) { + tty->print_cr("******** BAD SWITCH DEPTH ********"); + } +@@ -634,7 +634,7 @@ + for( r = lo; r <= hi; r++ ) { + r->print(); + } +- tty->print_cr(""); ++ tty->cr(); + } + #endif + } +@@ -1278,7 +1278,7 @@ + // Bool(CmpP(LoadKlass(obj._klass), ConP(Foo.klass)), [eq]) + // or the narrowOop equivalent. + const Type* obj_type = _gvn.type(obj); +- const TypeOopPtr* tboth = obj_type->join(con_type)->isa_oopptr(); ++ const TypeOopPtr* tboth = obj_type->join_speculative(con_type)->isa_oopptr(); + if (tboth != NULL && tboth->klass_is_exact() && tboth != obj_type && + tboth->higher_equal(obj_type)) { + // obj has to be of the exact type Foo if the CmpP succeeds. +@@ -1288,7 +1288,7 @@ + (jvms->is_loc(obj_in_map) || jvms->is_stk(obj_in_map))) { + TypeNode* ccast = new (C) CheckCastPPNode(control(), obj, tboth); + const Type* tcc = ccast->as_Type()->type(); +- assert(tcc != obj_type && tcc->higher_equal(obj_type), "must improve"); ++ assert(tcc != obj_type && tcc->higher_equal_speculative(obj_type), "must improve"); + // Delay transform() call to allow recovery of pre-cast value + // at the control merge. + _gvn.set_type_bottom(ccast); +@@ -1318,7 +1318,7 @@ + switch (btest) { + case BoolTest::eq: // Constant test? + { +- const Type* tboth = tcon->join(tval); ++ const Type* tboth = tcon->join_speculative(tval); + if (tboth == tval) break; // Nothing to gain. + if (tcon->isa_int()) { + ccast = new (C) CastIINode(val, tboth); +@@ -1352,7 +1352,7 @@ + + if (ccast != NULL) { + const Type* tcc = ccast->as_Type()->type(); +- assert(tcc != tval && tcc->higher_equal(tval), "must improve"); ++ assert(tcc != tval && tcc->higher_equal_speculative(tval), "must improve"); + // Delay transform() call to allow recovery of pre-cast value + // at the control merge. + ccast->set_req(0, control()); +@@ -1720,14 +1720,14 @@ + a = array_addressing(T_LONG, 0); + if (stopped()) return; // guaranteed null or range check + dec_sp(2); // Pop array and index +- push_pair(make_load(control(), a, TypeLong::LONG, T_LONG, TypeAryPtr::LONGS)); ++ push_pair(make_load(control(), a, TypeLong::LONG, T_LONG, TypeAryPtr::LONGS, MemNode::unordered)); + break; + } + case Bytecodes::_daload: { + a = array_addressing(T_DOUBLE, 0); + if (stopped()) return; // guaranteed null or range check + dec_sp(2); // Pop array and index +- push_pair(make_load(control(), a, Type::DOUBLE, T_DOUBLE, TypeAryPtr::DOUBLES)); ++ push_pair(make_load(control(), a, Type::DOUBLE, T_DOUBLE, TypeAryPtr::DOUBLES, MemNode::unordered)); + break; + } + case Bytecodes::_bastore: array_store(T_BYTE); break; +@@ -1744,7 +1744,7 @@ + a = pop(); // the array itself + const TypeOopPtr* elemtype = _gvn.type(a)->is_aryptr()->elem()->make_oopptr(); + const TypeAryPtr* adr_type = TypeAryPtr::OOPS; +- Node* store = store_oop_to_array(control(), a, d, adr_type, c, elemtype, T_OBJECT); ++ Node* store = store_oop_to_array(control(), a, d, adr_type, c, elemtype, T_OBJECT, MemNode::release); + break; + } + case Bytecodes::_lastore: { +@@ -1752,7 +1752,7 @@ + if (stopped()) return; // guaranteed null or range check + c = pop_pair(); + dec_sp(2); // Pop array and index +- store_to_memory(control(), a, c, T_LONG, TypeAryPtr::LONGS); ++ store_to_memory(control(), a, c, T_LONG, TypeAryPtr::LONGS, MemNode::unordered); + break; + } + case Bytecodes::_dastore: { +@@ -1761,7 +1761,7 @@ + c = pop_pair(); + dec_sp(2); // Pop array and index + c = dstore_rounding(c); +- store_to_memory(control(), a, c, T_DOUBLE, TypeAryPtr::DOUBLES); ++ store_to_memory(control(), a, c, T_DOUBLE, TypeAryPtr::DOUBLES, MemNode::unordered); + break; + } + case Bytecodes::_getfield: +--- ./hotspot/src/share/vm/opto/parse3.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/parse3.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -227,8 +227,13 @@ + } else { + type = Type::get_const_basic_type(bt); + } ++ if (support_IRIW_for_not_multiple_copy_atomic_cpu && field->is_volatile()) { ++ insert_mem_bar(Op_MemBarVolatile); // StoreLoad barrier ++ } + // Build the load. +- Node* ld = make_load(NULL, adr, type, bt, adr_type, is_vol); ++ // ++ MemNode::MemOrd mo = is_vol ? MemNode::acquire : MemNode::unordered; ++ Node* ld = make_load(NULL, adr, type, bt, adr_type, mo, is_vol); + + // Adjust Java stack + if (type2size[bt] == 1) +@@ -288,6 +293,16 @@ + // Round doubles before storing + if (bt == T_DOUBLE) val = dstore_rounding(val); + ++ // Conservatively release stores of object references. ++ const MemNode::MemOrd mo = ++ is_vol ? ++ // Volatile fields need releasing stores. ++ MemNode::release : ++ // Non-volatile fields also need releasing stores if they hold an ++ // object reference, because the object reference might point to ++ // a freshly created object. ++ StoreNode::release_if_reference(bt); ++ + // Store the value. + Node* store; + if (bt == T_OBJECT) { +@@ -297,15 +312,24 @@ + } else { + field_type = TypeOopPtr::make_from_klass(field->type()->as_klass()); + } +- store = store_oop_to_object( control(), obj, adr, adr_type, val, field_type, bt); ++ store = store_oop_to_object(control(), obj, adr, adr_type, val, field_type, bt, mo); + } else { +- store = store_to_memory( control(), adr, val, bt, adr_type, is_vol ); ++ store = store_to_memory(control(), adr, val, bt, adr_type, mo, is_vol); + } + + // If reference is volatile, prevent following volatiles ops from + // floating up before the volatile write. + if (is_vol) { +- insert_mem_bar(Op_MemBarVolatile); // Use fat membar ++ // If not multiple copy atomic, we do the MemBarVolatile before the load. ++ if (!support_IRIW_for_not_multiple_copy_atomic_cpu) { ++ insert_mem_bar(Op_MemBarVolatile); // Use fat membar ++ } ++ // Remember we wrote a volatile field. ++ // For not multiple copy atomic cpu (ppc64) a barrier should be issued ++ // in constructors which have such stores. See do_exits() in parse1.cpp. ++ if (is_field) { ++ set_wrote_volatile(true); ++ } + } + + // If the field is final, the rules of Java say we are in or . +@@ -337,7 +361,7 @@ + // should_be_constant = (oop not scavengable || ScavengeRootsInCode >= 2) + // An oop is not scavengable if it is in the perm gen. + if (stable_type != NULL && con_type != NULL && con_type->isa_oopptr()) +- con_type = con_type->join(stable_type); ++ con_type = con_type->join_speculative(stable_type); + break; + + case T_ILLEGAL: +@@ -414,7 +438,7 @@ + Node* elem = expand_multianewarray(array_klass_1, &lengths[1], ndimensions-1, nargs); + intptr_t offset = header + ((intptr_t)i << LogBytesPerHeapOop); + Node* eaddr = basic_plus_adr(array, offset); +- store_oop_to_array(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT); ++ store_oop_to_array(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT, MemNode::unordered); + } + } + return array; +@@ -503,7 +527,7 @@ + // Fill-in it with values + for (j = 0; j < ndimensions; j++) { + Node *dims_elem = array_element_address(dims, intcon(j), T_INT); +- store_to_memory(control(), dims_elem, length[j], T_INT, TypeAryPtr::INTS); ++ store_to_memory(control(), dims_elem, length[j], T_INT, TypeAryPtr::INTS, MemNode::unordered); + } + } + +--- ./hotspot/src/share/vm/opto/parseHelper.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/parseHelper.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -222,7 +222,7 @@ + + Node* init_thread_offset = _gvn.MakeConX(in_bytes(InstanceKlass::init_thread_offset())); + Node* adr_node = basic_plus_adr(kls, kls, init_thread_offset); +- Node* init_thread = make_load(NULL, adr_node, TypeRawPtr::BOTTOM, T_ADDRESS); ++ Node* init_thread = make_load(NULL, adr_node, TypeRawPtr::BOTTOM, T_ADDRESS, MemNode::unordered); + Node *tst = Bool( CmpP( init_thread, cur_thread), BoolTest::eq); + IfNode* iff = create_and_map_if(control(), tst, PROB_ALWAYS, COUNT_UNKNOWN); + set_control(IfTrue(iff)); +@@ -232,7 +232,7 @@ + adr_node = basic_plus_adr(kls, kls, init_state_offset); + // Use T_BOOLEAN for InstanceKlass::_init_state so the compiler + // can generate code to load it as unsigned byte. +- Node* init_state = make_load(NULL, adr_node, TypeInt::UBYTE, T_BOOLEAN); ++ Node* init_state = make_load(NULL, adr_node, TypeInt::UBYTE, T_BOOLEAN, MemNode::unordered); + Node* being_init = _gvn.intcon(InstanceKlass::being_initialized); + tst = Bool( CmpI( init_state, being_init), BoolTest::eq); + iff = create_and_map_if(control(), tst, PROB_ALWAYS, COUNT_UNKNOWN); +@@ -354,13 +354,13 @@ + Node *counters_node = makecon(adr_type); + Node* adr_iic_node = basic_plus_adr(counters_node, counters_node, + MethodCounters::interpreter_invocation_counter_offset_in_bytes()); +- Node* cnt = make_load(ctrl, adr_iic_node, TypeInt::INT, T_INT, adr_type); ++ Node* cnt = make_load(ctrl, adr_iic_node, TypeInt::INT, T_INT, adr_type, MemNode::unordered); + + test_counter_against_threshold(cnt, limit); + + // Add one to the counter and store + Node* incr = _gvn.transform(new (C) AddINode(cnt, _gvn.intcon(1))); +- store_to_memory( ctrl, adr_iic_node, incr, T_INT, adr_type ); ++ store_to_memory(ctrl, adr_iic_node, incr, T_INT, adr_type, MemNode::unordered); + } + + //----------------------------method_data_addressing--------------------------- +@@ -392,9 +392,9 @@ + Node* adr_node = method_data_addressing(md, data, counter_offset, idx, stride); + + const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr(); +- Node* cnt = make_load(NULL, adr_node, TypeInt::INT, T_INT, adr_type); ++ 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))); +- store_to_memory(NULL, adr_node, incr, T_INT, adr_type ); ++ store_to_memory(NULL, adr_node, incr, T_INT, adr_type, MemNode::unordered); + } + + //--------------------------test_for_osr_md_counter_at------------------------- +@@ -402,7 +402,7 @@ + Node* adr_node = method_data_addressing(md, data, counter_offset); + + const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr(); +- Node* cnt = make_load(NULL, adr_node, TypeInt::INT, T_INT, adr_type); ++ Node* cnt = make_load(NULL, adr_node, TypeInt::INT, T_INT, adr_type, MemNode::unordered); + + test_counter_against_threshold(cnt, limit); + } +@@ -412,9 +412,9 @@ + Node* adr_node = method_data_addressing(md, data, DataLayout::flags_offset()); + + const TypePtr* adr_type = _gvn.type(adr_node)->is_ptr(); +- Node* flags = make_load(NULL, adr_node, TypeInt::BYTE, T_BYTE, adr_type); ++ 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))); +- store_to_memory(NULL, adr_node, incr, T_BYTE, adr_type); ++ store_to_memory(NULL, adr_node, incr, T_BYTE, adr_type, MemNode::unordered); + } + + //----------------------------profile_taken_branch----------------------------- +--- ./hotspot/src/share/vm/opto/phase.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/phase.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -26,6 +26,7 @@ + #include "code/nmethod.hpp" + #include "compiler/compileBroker.hpp" + #include "opto/compile.hpp" ++#include "opto/matcher.hpp" + #include "opto/node.hpp" + #include "opto/phase.hpp" + +@@ -55,6 +56,7 @@ + elapsedTimer Phase::_t_macroEliminate; + elapsedTimer Phase::_t_macroExpand; + elapsedTimer Phase::_t_peephole; ++elapsedTimer Phase::_t_postalloc_expand; + elapsedTimer Phase::_t_codeGeneration; + elapsedTimer Phase::_t_registerMethod; + elapsedTimer Phase::_t_temporaryTimer1; +@@ -144,6 +146,9 @@ + } + tty->print_cr (" blockOrdering : %3.3f sec", Phase::_t_blockOrdering.seconds()); + tty->print_cr (" peephole : %3.3f sec", Phase::_t_peephole.seconds()); ++ if (Matcher::require_postalloc_expand) { ++ tty->print_cr (" postalloc_expand: %3.3f sec", Phase::_t_postalloc_expand.seconds()); ++ } + tty->print_cr (" codeGen : %3.3f sec", Phase::_t_codeGeneration.seconds()); + tty->print_cr (" install_code : %3.3f sec", Phase::_t_registerMethod.seconds()); + tty->print_cr (" -------------- : ----------"); +--- ./hotspot/src/share/vm/opto/phase.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/phase.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -91,6 +91,7 @@ + static elapsedTimer _t_macroEliminate; + static elapsedTimer _t_macroExpand; + static elapsedTimer _t_peephole; ++ static elapsedTimer _t_postalloc_expand; + static elapsedTimer _t_codeGeneration; + static elapsedTimer _t_registerMethod; + static elapsedTimer _t_temporaryTimer1; +--- ./hotspot/src/share/vm/opto/phaseX.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/phaseX.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -323,6 +323,23 @@ + } + } + ++ ++void NodeHash::check_no_speculative_types() { ++#ifdef ASSERT ++ uint max = size(); ++ Node *sentinel_node = sentinel(); ++ for (uint i = 0; i < max; ++i) { ++ Node *n = at(i); ++ if(n != NULL && n != sentinel_node && n->is_Type()) { ++ TypeNode* tn = n->as_Type(); ++ const Type* t = tn->type(); ++ const Type* t_no_spec = t->remove_speculative(); ++ assert(t == t_no_spec, "dead node in hash table or missed node during speculative cleanup"); ++ } ++ } ++#endif ++} ++ + #ifndef PRODUCT + //------------------------------dump------------------------------------------- + // Dump statistics for the hash table +@@ -985,10 +1002,10 @@ + if ( VerifyIterativeGVN && PrintOpto ) { + if ( _verify_counter == _verify_full_passes ) + tty->print_cr("VerifyIterativeGVN: %d transforms and verify passes", +- _verify_full_passes); ++ (int) _verify_full_passes); + else + tty->print_cr("VerifyIterativeGVN: %d transforms, %d full verify passes", +- _verify_counter, _verify_full_passes); ++ (int) _verify_counter, (int) _verify_full_passes); + } + #endif + } +@@ -1362,6 +1379,15 @@ + _worklist.push(u); + } + } ++ // If changed AddI/SubI inputs, check CmpU for range check optimization. ++ if (use_op == Op_AddI || use_op == Op_SubI) { ++ for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) { ++ Node* u = use->fast_out(i2); ++ if (u->is_Cmp() && (u->Opcode() == Op_CmpU)) { ++ _worklist.push(u); ++ } ++ } ++ } + // If changed AddP inputs, check Stores for loop invariant + if( use_op == Op_AddP ) { + for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) { +@@ -1392,11 +1418,11 @@ + assert(UseTypeSpeculation, "speculation is off"); + for (uint i = 0; i < _types.Size(); i++) { + const Type* t = _types.fast_lookup(i); +- if (t != NULL && t->isa_oopptr()) { +- const TypeOopPtr* to = t->is_oopptr(); +- _types.map(i, to->remove_speculative()); ++ if (t != NULL) { ++ _types.map(i, t->remove_speculative()); + } + } ++ _table.check_no_speculative_types(); + } + + //============================================================================= +--- ./hotspot/src/share/vm/opto/phaseX.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/phaseX.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -92,7 +92,8 @@ + } + + void remove_useless_nodes(VectorSet &useful); // replace with sentinel +- void replace_with(NodeHash* nh); ++ void replace_with(NodeHash* nh); ++ void check_no_speculative_types(); // Check no speculative part for type nodes in table + + Node *sentinel() { return _sentinel; } + +@@ -501,6 +502,9 @@ + Deoptimization::DeoptReason reason); + + void remove_speculative_types(); ++ void check_no_speculative_types() { ++ _table.check_no_speculative_types(); ++ } + + #ifndef PRODUCT + protected: +--- ./hotspot/src/share/vm/opto/regalloc.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/regalloc.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -77,7 +77,9 @@ + assert( reg < _matcher._old_SP || + (reg >= OptoReg::add(_matcher._old_SP,C->out_preserve_stack_slots()) && + reg < _matcher._in_arg_limit) || +- reg >= OptoReg::add(_matcher._new_SP,C->out_preserve_stack_slots()), ++ reg >= OptoReg::add(_matcher._new_SP, C->out_preserve_stack_slots()) || ++ // Allow return_addr in the out-preserve area. ++ reg == _matcher.return_addr(), + "register allocated in a preserve area" ); + return reg2offset_unchecked( reg ); + } +--- ./hotspot/src/share/vm/opto/regmask.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/regmask.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -40,8 +40,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" + #endif + + #define RM_SIZE _RM_SIZE /* a constant private to the class RegMask */ +@@ -113,7 +116,7 @@ + case Special: st->print("r---"); break; + case Bad: st->print("rBAD"); break; + default: +- if (r < _last_Mach_Reg) st->print(Matcher::regName[r]); ++ if (r < _last_Mach_Reg) st->print("%s", Matcher::regName[r]); + else st->print("rS%d",r); + break; + } +--- ./hotspot/src/share/vm/opto/regmask.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/regmask.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -43,8 +43,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/adGlobals_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/adGlobals_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/adGlobals_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/adGlobals_ppc_64.hpp" + #endif + + // Some fun naming (textual) substitutions: +--- ./hotspot/src/share/vm/opto/runtime.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/runtime.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -83,8 +83,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" + #endif + + +@@ -793,11 +796,20 @@ + + + const TypeFunc* OptoRuntime::array_fill_Type() { ++ const Type** fields; ++ int argp = TypeFunc::Parms; ++ if (CCallingConventionRequiresIntsAsLongs) { + // create input type (domain): pointer, int, size_t +- const Type** fields = TypeTuple::fields(3 LP64_ONLY( + 1)); +- int argp = TypeFunc::Parms; +- fields[argp++] = TypePtr::NOTNULL; +- fields[argp++] = TypeInt::INT; ++ fields = TypeTuple::fields(3 LP64_ONLY( + 2)); ++ fields[argp++] = TypePtr::NOTNULL; ++ fields[argp++] = TypeLong::LONG; ++ fields[argp++] = Type::HALF; ++ } else { ++ // create input type (domain): pointer, int, size_t ++ fields = TypeTuple::fields(3 LP64_ONLY( + 1)); ++ fields[argp++] = TypePtr::NOTNULL; ++ fields[argp++] = TypeInt::INT; ++ } + fields[argp++] = TypeX_X; // size in whatevers (size_t) + LP64_ONLY(fields[argp++] = Type::HALF); // other half of long length + const TypeTuple *domain = TypeTuple::make(argp, fields); +@@ -814,12 +826,18 @@ + const TypeFunc* OptoRuntime::aescrypt_block_Type() { + // create input type (domain) + int num_args = 3; ++ if (Matcher::pass_original_key_for_aes()) { ++ num_args = 4; ++ } + int argcnt = num_args; + const Type** fields = TypeTuple::fields(argcnt); + int argp = TypeFunc::Parms; + fields[argp++] = TypePtr::NOTNULL; // src + fields[argp++] = TypePtr::NOTNULL; // dest + fields[argp++] = TypePtr::NOTNULL; // k array ++ if (Matcher::pass_original_key_for_aes()) { ++ fields[argp++] = TypePtr::NOTNULL; // original k array ++ } + assert(argp == TypeFunc::Parms+argcnt, "correct decoding"); + const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields); + +@@ -852,10 +870,13 @@ + return TypeFunc::make(domain, range); + } + +-// for cipherBlockChaining calls of aescrypt encrypt/decrypt, four pointers and a length, returning void ++// for cipherBlockChaining calls of aescrypt encrypt/decrypt, four pointers and a length, returning int + const TypeFunc* OptoRuntime::cipherBlockChaining_aescrypt_Type() { + // create input type (domain) + int num_args = 5; ++ if (Matcher::pass_original_key_for_aes()) { ++ num_args = 6; ++ } + int argcnt = num_args; + const Type** fields = TypeTuple::fields(argcnt); + int argp = TypeFunc::Parms; +@@ -864,13 +885,16 @@ + fields[argp++] = TypePtr::NOTNULL; // k array + fields[argp++] = TypePtr::NOTNULL; // r array + fields[argp++] = TypeInt::INT; // src len ++ if (Matcher::pass_original_key_for_aes()) { ++ fields[argp++] = TypePtr::NOTNULL; // original k array ++ } + assert(argp == TypeFunc::Parms+argcnt, "correct decoding"); + const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields); + +- // no result type needed ++ // returning cipher len (int) + fields = TypeTuple::fields(1); +- fields[TypeFunc::Parms+0] = NULL; // void +- const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields); ++ fields[TypeFunc::Parms+0] = TypeInt::INT; ++ const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+1, fields); + return TypeFunc::make(domain, range); + } + +@@ -1035,7 +1059,7 @@ + } + + // If we are forcing an unwind because of stack overflow then deopt is +- // irrelevant sice we are throwing the frame away anyway. ++ // irrelevant since we are throwing the frame away anyway. + + if (deopting && !force_unwind) { + handler_address = SharedRuntime::deopt_blob()->unpack_with_exception(); +@@ -1078,7 +1102,7 @@ + // Note we enter without the usual JRT wrapper. We will call a helper routine that + // will do the normal VM entry. We do it this way so that we can see if the nmethod + // we looked up the handler for has been deoptimized in the meantime. If it has been +-// we must not use the handler and instread return the deopt blob. ++// we must not use the handler and instead return the deopt blob. + address OptoRuntime::handle_exception_C(JavaThread* thread) { + // + // We are in Java not VM and in debug mode we have a NoHandleMark +@@ -1287,6 +1311,14 @@ + tty->print_cr("%s", c->name()); + blc->print_on(tty); + } ++#if INCLUDE_RTM_OPT ++ } else if (c->tag() == NamedCounter::RTMLockingCounter) { ++ RTMLockingCounters* rlc = ((RTMLockingNamedCounter*)c)->counters(); ++ if (rlc->nonzero()) { ++ tty->print_cr("%s", c->name()); ++ rlc->print_on(tty); ++ } ++#endif + } + c = c->next(); + } +@@ -1326,6 +1358,8 @@ + NamedCounter* c; + if (tag == NamedCounter::BiasedLockingCounter) { + c = new BiasedLockingNamedCounter(strdup(st.as_string())); ++ } else if (tag == NamedCounter::RTMLockingCounter) { ++ c = new RTMLockingNamedCounter(strdup(st.as_string())); + } else { + c = new NamedCounter(strdup(st.as_string()), tag); + } +@@ -1334,6 +1368,7 @@ + // add counters so this is safe. + NamedCounter* head; + do { ++ c->set_next(NULL); + head = _named_counters; + c->set_next(head); + } while (Atomic::cmpxchg_ptr(c, &_named_counters, head) != head); +@@ -1360,7 +1395,7 @@ + } else { + tty->print(""); + } +- tty->print(" at " INTPTR_FORMAT, exception_pc); ++ tty->print(" at " INTPTR_FORMAT, p2i(exception_pc)); + tty->print_cr("]"); + } + +--- ./hotspot/src/share/vm/opto/runtime.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/runtime.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -29,6 +29,7 @@ + #include "opto/machnode.hpp" + #include "opto/type.hpp" + #include "runtime/biasedLocking.hpp" ++#include "runtime/rtmLocking.hpp" + #include "runtime/deoptimization.hpp" + #include "runtime/vframe.hpp" + +@@ -61,7 +62,8 @@ + NoTag, + LockCounter, + EliminatedLockCounter, +- BiasedLockingCounter ++ BiasedLockingCounter, ++ RTMLockingCounter + }; + + private: +@@ -85,7 +87,7 @@ + + NamedCounter* next() const { return _next; } + void set_next(NamedCounter* next) { +- assert(_next == NULL, "already set"); ++ assert(_next == NULL || next == NULL, "already set"); + _next = next; + } + +@@ -102,6 +104,18 @@ + BiasedLockingCounters* counters() { return &_counters; } + }; + ++ ++class RTMLockingNamedCounter : public NamedCounter { ++ private: ++ RTMLockingCounters _counters; ++ ++ public: ++ RTMLockingNamedCounter(const char *n) : ++ NamedCounter(n, RTMLockingCounter), _counters() {} ++ ++ RTMLockingCounters* counters() { return &_counters; } ++}; ++ + typedef const TypeFunc*(*TypeFunc_generator)(); + + class OptoRuntime : public AllStatic { +--- ./hotspot/src/share/vm/opto/stringopts.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/stringopts.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1122,7 +1122,8 @@ + + return kit.make_load(NULL, kit.basic_plus_adr(klass_node, field->offset_in_bytes()), + type, T_OBJECT, +- C->get_alias_index(mirror_type->add_offset(field->offset_in_bytes()))); ++ C->get_alias_index(mirror_type->add_offset(field->offset_in_bytes())), ++ MemNode::unordered); + } + + Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) { +@@ -1314,7 +1315,7 @@ + Node* ch = __ AddI(r, __ intcon('0')); + + Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR), +- ch, T_CHAR, char_adr_idx); ++ ch, T_CHAR, char_adr_idx, MemNode::unordered); + + + IfNode* iff = kit.create_and_map_if(head, __ Bool(__ CmpI(q, __ intcon(0)), BoolTest::ne), +@@ -1356,7 +1357,7 @@ + } else { + Node* m1 = __ SubI(charPos, __ intcon(1)); + Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR), +- sign, T_CHAR, char_adr_idx); ++ sign, T_CHAR, char_adr_idx, MemNode::unordered); + + final_merge->init_req(1, kit.control()); + final_mem->init_req(1, st); +@@ -1387,7 +1388,8 @@ + ciTypeArray* value_array = t->const_oop()->as_type_array(); + for (int e = 0; e < c; e++) { + __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), +- __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx); ++ __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx, ++ MemNode::unordered); + start = __ AddI(start, __ intcon(1)); + } + } else { +@@ -1607,7 +1609,7 @@ + } + case StringConcat::CharMode: { + __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), +- arg, T_CHAR, char_adr_idx); ++ arg, T_CHAR, char_adr_idx, MemNode::unordered); + start = __ AddI(start, __ intcon(1)); + break; + } +--- ./hotspot/src/share/vm/opto/subnode.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/subnode.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -80,7 +80,7 @@ + + //------------------------------Value------------------------------------------ + // A subtract node differences it's two inputs. +-const Type *SubNode::Value( PhaseTransform *phase ) const { ++const Type* SubNode::Value_common(PhaseTransform *phase) const { + const Node* in1 = in(1); + const Node* in2 = in(2); + // Either input is TOP ==> the result is TOP +@@ -97,6 +97,16 @@ + if( t1 == Type::BOTTOM || t2 == Type::BOTTOM ) + return bottom_type(); + ++ return NULL; ++} ++ ++const Type* SubNode::Value(PhaseTransform *phase) const { ++ const Type* t = Value_common(phase); ++ if (t != NULL) { ++ return t; ++ } ++ const Type* t1 = phase->type(in(1)); ++ const Type* t2 = phase->type(in(2)); + return sub(t1,t2); // Local flavor of type subtraction + + } +@@ -570,6 +580,81 @@ + return TypeInt::CC; // else use worst case results + } + ++const Type* CmpUNode::Value(PhaseTransform *phase) const { ++ const Type* t = SubNode::Value_common(phase); ++ if (t != NULL) { ++ return t; ++ } ++ const Node* in1 = in(1); ++ const Node* in2 = in(2); ++ const Type* t1 = phase->type(in1); ++ const Type* t2 = phase->type(in2); ++ assert(t1->isa_int(), "CmpU has only Int type inputs"); ++ if (t2 == TypeInt::INT) { // Compare to bottom? ++ return bottom_type(); ++ } ++ uint in1_op = in1->Opcode(); ++ if (in1_op == Op_AddI || in1_op == Op_SubI) { ++ // The problem rise when result of AddI(SubI) may overflow ++ // signed integer value. Let say the input type is ++ // [256, maxint] then +128 will create 2 ranges due to ++ // overflow: [minint, minint+127] and [384, maxint]. ++ // But C2 type system keep only 1 type range and as result ++ // it use general [minint, maxint] for this case which we ++ // can't optimize. ++ // ++ // Make 2 separate type ranges based on types of AddI(SubI) inputs ++ // and compare results of their compare. If results are the same ++ // CmpU node can be optimized. ++ const Node* in11 = in1->in(1); ++ const Node* in12 = in1->in(2); ++ const Type* t11 = (in11 == in1) ? Type::TOP : phase->type(in11); ++ const Type* t12 = (in12 == in1) ? Type::TOP : phase->type(in12); ++ // Skip cases when input types are top or bottom. ++ if ((t11 != Type::TOP) && (t11 != TypeInt::INT) && ++ (t12 != Type::TOP) && (t12 != TypeInt::INT)) { ++ const TypeInt *r0 = t11->is_int(); ++ const TypeInt *r1 = t12->is_int(); ++ jlong lo_r0 = r0->_lo; ++ jlong hi_r0 = r0->_hi; ++ jlong lo_r1 = r1->_lo; ++ jlong hi_r1 = r1->_hi; ++ if (in1_op == Op_SubI) { ++ jlong tmp = hi_r1; ++ hi_r1 = -lo_r1; ++ lo_r1 = -tmp; ++ // Note, for substructing [minint,x] type range ++ // long arithmetic provides correct overflow answer. ++ // The confusion come from the fact that in 32-bit ++ // -minint == minint but in 64-bit -minint == maxint+1. ++ } ++ jlong lo_long = lo_r0 + lo_r1; ++ jlong hi_long = hi_r0 + hi_r1; ++ int lo_tr1 = min_jint; ++ int hi_tr1 = (int)hi_long; ++ int lo_tr2 = (int)lo_long; ++ int hi_tr2 = max_jint; ++ bool underflow = lo_long != (jlong)lo_tr2; ++ bool overflow = hi_long != (jlong)hi_tr1; ++ // Use sub(t1, t2) when there is no overflow (one type range) ++ // or when both overflow and underflow (too complex). ++ if ((underflow != overflow) && (hi_tr1 < lo_tr2)) { ++ // Overflow only on one boundary, compare 2 separate type ranges. ++ int w = MAX2(r0->_widen, r1->_widen); // _widen does not matter here ++ const TypeInt* tr1 = TypeInt::make(lo_tr1, hi_tr1, w); ++ const TypeInt* tr2 = TypeInt::make(lo_tr2, hi_tr2, w); ++ const Type* cmp1 = sub(tr1, t2); ++ const Type* cmp2 = sub(tr2, t2); ++ if (cmp1 == cmp2) { ++ return cmp1; // Hit! ++ } ++ } ++ } ++ } ++ ++ return sub(t1, t2); // Local flavor of type subtraction ++} ++ + bool CmpUNode::is_index_range_check() const { + // Check for the "(X ModI Y) CmpU Y" shape + return (in(1)->Opcode() == Op_ModI && +@@ -1065,7 +1150,7 @@ + #ifndef PRODUCT + void BoolTest::dump_on(outputStream *st) const { + const char *msg[] = {"eq","gt","of","lt","ne","le","nof","ge"}; +- st->print(msg[_test]); ++ st->print("%s", msg[_test]); + } + #endif + +@@ -1126,11 +1211,15 @@ + Node *cmp = in(1); + if( !cmp->is_Sub() ) return NULL; + int cop = cmp->Opcode(); +- if( cop == Op_FastLock || cop == Op_FastUnlock || cop == Op_FlagsProj) return NULL; ++ if( cop == Op_FastLock || cop == Op_FastUnlock) return NULL; + Node *cmp1 = cmp->in(1); + Node *cmp2 = cmp->in(2); + if( !cmp1 ) return NULL; + ++ if (_test._test == BoolTest::overflow || _test._test == BoolTest::no_overflow) { ++ return NULL; ++ } ++ + // Constant on left? + Node *con = cmp1; + uint op2 = cmp2->Opcode(); +--- ./hotspot/src/share/vm/opto/subnode.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/subnode.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -50,6 +50,7 @@ + // Compute a new Type for this node. Basically we just do the pre-check, + // then call the virtual add() to set the type. + virtual const Type *Value( PhaseTransform *phase ) const; ++ const Type* Value_common( PhaseTransform *phase ) const; + + // Supplied function returns the subtractend of the inputs. + // This also type-checks the inputs for sanity. Guaranteed never to +@@ -158,6 +159,7 @@ + CmpUNode( Node *in1, Node *in2 ) : CmpNode(in1,in2) {} + virtual int Opcode() const; + virtual const Type *sub( const Type *, const Type * ) const; ++ const Type *Value( PhaseTransform *phase ) const; + bool is_index_range_check() const; + }; + +--- ./hotspot/src/share/vm/opto/superword.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/superword.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1262,8 +1262,9 @@ + memops.clear(); + for (DUIterator i = upper_insert_pt->outs(); upper_insert_pt->has_out(i); i++) { + Node* use = upper_insert_pt->out(i); +- if (!use->is_Store()) ++ if (use->is_Mem() && !use->is_Store()) { + memops.push(use); ++ } + } + + MemNode* lower_insert_pt = last; +--- ./hotspot/src/share/vm/opto/type.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/type.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -41,6 +41,8 @@ + #include "opto/opcodes.hpp" + #include "opto/type.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // Portions of code courtesy of Clifford Click + + // Optimization - Graph Style +@@ -61,17 +63,22 @@ + { Bad, T_ILLEGAL, "tuple:", false, Node::NotAMachineReg, relocInfo::none }, // Tuple + { Bad, T_ARRAY, "array:", false, Node::NotAMachineReg, relocInfo::none }, // Array + +-#ifndef SPARC ++#ifdef SPARC ++ { Bad, T_ILLEGAL, "vectors:", false, 0, relocInfo::none }, // VectorS ++ { Bad, T_ILLEGAL, "vectord:", false, Op_RegD, relocInfo::none }, // VectorD ++ { Bad, T_ILLEGAL, "vectorx:", false, 0, relocInfo::none }, // VectorX ++ { Bad, T_ILLEGAL, "vectory:", false, 0, relocInfo::none }, // VectorY ++#elif defined(PPC64) ++ { Bad, T_ILLEGAL, "vectors:", false, 0, relocInfo::none }, // VectorS ++ { Bad, T_ILLEGAL, "vectord:", false, Op_RegL, relocInfo::none }, // VectorD ++ { Bad, T_ILLEGAL, "vectorx:", false, 0, relocInfo::none }, // VectorX ++ { Bad, T_ILLEGAL, "vectory:", false, 0, relocInfo::none }, // VectorY ++#else // all other + { Bad, T_ILLEGAL, "vectors:", false, Op_VecS, relocInfo::none }, // VectorS + { Bad, T_ILLEGAL, "vectord:", false, Op_VecD, relocInfo::none }, // VectorD + { Bad, T_ILLEGAL, "vectorx:", false, Op_VecX, relocInfo::none }, // VectorX + { Bad, T_ILLEGAL, "vectory:", false, Op_VecY, relocInfo::none }, // VectorY +-#else +- { Bad, T_ILLEGAL, "vectors:", false, 0, relocInfo::none }, // VectorS +- { Bad, T_ILLEGAL, "vectord:", false, Op_RegD, relocInfo::none }, // VectorD +- { Bad, T_ILLEGAL, "vectorx:", false, 0, relocInfo::none }, // VectorX +- { Bad, T_ILLEGAL, "vectory:", false, 0, relocInfo::none }, // VectorY +-#endif // IA32 || AMD64 ++#endif + { Bad, T_ADDRESS, "anyptr:", false, Op_RegP, relocInfo::none }, // AnyPtr + { Bad, T_ADDRESS, "rawptr:", false, Op_RegP, relocInfo::none }, // RawPtr + { Bad, T_OBJECT, "oop:", true, Op_RegP, relocInfo::oop_type }, // OopPtr +@@ -236,6 +243,13 @@ + return !t1->eq(t2); // Return ZERO if equal + } + ++const Type* Type::maybe_remove_speculative(bool include_speculative) const { ++ if (!include_speculative) { ++ return remove_speculative(); ++ } ++ return this; ++} ++ + //------------------------------hash------------------------------------------- + int Type::uhash( const Type *const t ) { + return t->hash(); +@@ -294,6 +308,7 @@ + TypeInt::POS1 = TypeInt::make(1,max_jint, WidenMin); // Positive values + TypeInt::INT = TypeInt::make(min_jint,max_jint, WidenMax); // 32-bit integers + TypeInt::SYMINT = TypeInt::make(-max_jint,max_jint,WidenMin); // symmetric range ++ TypeInt::TYPE_DOMAIN = TypeInt::INT; + // CmpL is overloaded both as the bytecode computation returning + // a trinary (-1,0,+1) integer result AND as an efficient long + // compare returning optimizer ideal-type flags. +@@ -310,6 +325,7 @@ + TypeLong::LONG = TypeLong::make(min_jlong,max_jlong,WidenMax); // 64-bit integers + TypeLong::INT = TypeLong::make((jlong)min_jint,(jlong)max_jint,WidenMin); + TypeLong::UINT = TypeLong::make(0,(jlong)max_juint,WidenMin); ++ TypeLong::TYPE_DOMAIN = TypeLong::LONG; + + const Type **fboth =(const Type**)shared_type_arena->Amalloc_4(2*sizeof(Type*)); + fboth[0] = Type::CONTROL; +@@ -628,41 +644,44 @@ + //------------------------------meet------------------------------------------- + // Compute the MEET of two types. NOT virtual. It enforces that meet is + // commutative and the lattice is symmetric. +-const Type *Type::meet( const Type *t ) const { ++const Type *Type::meet_helper(const Type *t, bool include_speculative) const { + if (isa_narrowoop() && t->isa_narrowoop()) { +- const Type* result = make_ptr()->meet(t->make_ptr()); ++ const Type* result = make_ptr()->meet_helper(t->make_ptr(), include_speculative); + return result->make_narrowoop(); + } + if (isa_narrowklass() && t->isa_narrowklass()) { +- const Type* result = make_ptr()->meet(t->make_ptr()); ++ const Type* result = make_ptr()->meet_helper(t->make_ptr(), include_speculative); + return result->make_narrowklass(); + } + +- const Type *mt = xmeet(t); ++ const Type *this_t = maybe_remove_speculative(include_speculative); ++ t = t->maybe_remove_speculative(include_speculative); ++ ++ const Type *mt = this_t->xmeet(t); + if (isa_narrowoop() || t->isa_narrowoop()) return mt; + if (isa_narrowklass() || t->isa_narrowklass()) return mt; + #ifdef ASSERT +- assert( mt == t->xmeet(this), "meet not commutative" ); ++ assert(mt == t->xmeet(this_t), "meet not commutative"); + const Type* dual_join = mt->_dual; + const Type *t2t = dual_join->xmeet(t->_dual); +- const Type *t2this = dual_join->xmeet( _dual); ++ const Type *t2this = dual_join->xmeet(this_t->_dual); + + // Interface meet Oop is Not Symmetric: + // Interface:AnyNull meet Oop:AnyNull == Interface:AnyNull + // Interface:NotNull meet Oop:NotNull == java/lang/Object:NotNull + +- if( !interface_vs_oop(t) && (t2t != t->_dual || t2this != _dual) ) { ++ if( !interface_vs_oop(t) && (t2t != t->_dual || t2this != this_t->_dual) ) { + tty->print_cr("=== Meet Not Symmetric ==="); +- tty->print("t = "); t->dump(); tty->cr(); +- tty->print("this= "); dump(); tty->cr(); +- tty->print("mt=(t meet this)= "); mt->dump(); tty->cr(); +- +- tty->print("t_dual= "); t->_dual->dump(); tty->cr(); +- tty->print("this_dual= "); _dual->dump(); tty->cr(); +- tty->print("mt_dual= "); mt->_dual->dump(); tty->cr(); +- +- tty->print("mt_dual meet t_dual= "); t2t ->dump(); tty->cr(); +- tty->print("mt_dual meet this_dual= "); t2this ->dump(); tty->cr(); ++ tty->print("t = "); t->dump(); tty->cr(); ++ tty->print("this= "); this_t->dump(); tty->cr(); ++ tty->print("mt=(t meet this)= "); mt->dump(); tty->cr(); ++ ++ tty->print("t_dual= "); t->_dual->dump(); tty->cr(); ++ tty->print("this_dual= "); this_t->_dual->dump(); tty->cr(); ++ tty->print("mt_dual= "); mt->_dual->dump(); tty->cr(); ++ ++ tty->print("mt_dual meet t_dual= "); t2t ->dump(); tty->cr(); ++ tty->print("mt_dual meet this_dual= "); t2this ->dump(); tty->cr(); + + fatal("meet not symmetric" ); + } +@@ -754,8 +773,8 @@ + } + + //-----------------------------filter------------------------------------------ +-const Type *Type::filter( const Type *kills ) const { +- const Type* ft = join(kills); ++const Type *Type::filter_helper(const Type *kills, bool include_speculative) const { ++ const Type* ft = join_helper(kills, include_speculative); + if (ft->empty()) + return Type::TOP; // Canonical empty value + return ft; +@@ -825,7 +844,7 @@ + #ifndef PRODUCT + //------------------------------dump2------------------------------------------ + void Type::dump2( Dict &d, uint depth, outputStream *st ) const { +- st->print(_type_info[_base].msg); ++ st->print("%s", _type_info[_base].msg); + } + + //------------------------------dump------------------------------------------- +@@ -1146,6 +1165,7 @@ + const TypeInt *TypeInt::POS1; // Positive 32-bit integers + const TypeInt *TypeInt::INT; // 32-bit integers + const TypeInt *TypeInt::SYMINT; // symmetric range [-max_jint..max_jint] ++const TypeInt *TypeInt::TYPE_DOMAIN; // alias for TypeInt::INT + + //------------------------------TypeInt---------------------------------------- + TypeInt::TypeInt( jint lo, jint hi, int w ) : Type(Int), _lo(lo), _hi(hi), _widen(w) { +@@ -1309,8 +1329,8 @@ + } + + //-----------------------------filter------------------------------------------ +-const Type *TypeInt::filter( const Type *kills ) const { +- const TypeInt* ft = join(kills)->isa_int(); ++const Type *TypeInt::filter_helper(const Type *kills, bool include_speculative) const { ++ const TypeInt* ft = join_helper(kills, include_speculative)->isa_int(); + if (ft == NULL || ft->empty()) + return Type::TOP; // Canonical empty value + if (ft->_widen < this->_widen) { +@@ -1403,6 +1423,7 @@ + const TypeLong *TypeLong::LONG; // 64-bit integers + const TypeLong *TypeLong::INT; // 32-bit subrange + const TypeLong *TypeLong::UINT; // 32-bit unsigned subrange ++const TypeLong *TypeLong::TYPE_DOMAIN; // alias for TypeLong::LONG + + //------------------------------TypeLong--------------------------------------- + TypeLong::TypeLong( jlong lo, jlong hi, int w ) : Type(Long), _lo(lo), _hi(hi), _widen(w) { +@@ -1570,8 +1591,8 @@ + } + + //-----------------------------filter------------------------------------------ +-const Type *TypeLong::filter( const Type *kills ) const { +- const TypeLong* ft = join(kills)->isa_long(); ++const Type *TypeLong::filter_helper(const Type *kills, bool include_speculative) const { ++ const TypeLong* ft = join_helper(kills, include_speculative)->isa_long(); + if (ft == NULL || ft->empty()) + return Type::TOP; // Canonical empty value + if (ft->_widen < this->_widen) { +@@ -1726,7 +1747,7 @@ + total_fields++; + field_array = fields(total_fields); + // Use get_const_type here because it respects UseUniqueSubclasses: +- field_array[pos++] = get_const_type(recv)->join(TypePtr::NOTNULL); ++ field_array[pos++] = get_const_type(recv)->join_speculative(TypePtr::NOTNULL); + } else { + field_array = fields(total_fields); + } +@@ -1916,7 +1937,7 @@ + + case Array: { // Meeting 2 arrays? + const TypeAry *a = t->is_ary(); +- return TypeAry::make(_elem->meet(a->_elem), ++ return TypeAry::make(_elem->meet_speculative(a->_elem), + _size->xmeet(a->_size)->is_int(), + _stable & a->_stable); + } +@@ -1949,6 +1970,13 @@ + return (intptr_t)_elem + (intptr_t)_size + (_stable ? 43 : 0); + } + ++/** ++ * Return same type without a speculative part in the element ++ */ ++const Type* TypeAry::remove_speculative() const { ++ return make(_elem->remove_speculative(), _size, _stable); ++} ++ + //----------------------interface_vs_oop--------------------------------------- + #ifdef ASSERT + bool TypeAry::interface_vs_oop(const Type *t) const { +@@ -2035,6 +2063,7 @@ + switch (Matcher::vector_ideal_reg(size)) { + case Op_VecS: + return (TypeVect*)(new TypeVectS(elem, length))->hashcons(); ++ case Op_RegL: + case Op_VecD: + case Op_RegD: + return (TypeVect*)(new TypeVectD(elem, length))->hashcons(); +@@ -2436,7 +2465,7 @@ + const TypeOopPtr *TypeOopPtr::BOTTOM; + + //------------------------------TypeOopPtr------------------------------------- +-TypeOopPtr::TypeOopPtr(TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id, const TypeOopPtr* speculative) ++TypeOopPtr::TypeOopPtr(TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id, const TypeOopPtr* speculative, int inline_depth) + : TypePtr(t, ptr, offset), + _const_oop(o), _klass(k), + _klass_is_exact(xk), +@@ -2444,7 +2473,8 @@ + _is_ptr_to_narrowklass(false), + _is_ptr_to_boxed_value(false), + _instance_id(instance_id), +- _speculative(speculative) { ++ _speculative(speculative), ++ _inline_depth(inline_depth){ + if (Compile::current()->eliminate_boxing() && (t == InstPtr) && + (offset > 0) && xk && (k != 0) && k->is_instance_klass()) { + _is_ptr_to_boxed_value = k->as_instance_klass()->is_boxed_value_offset(offset); +@@ -2511,12 +2541,12 @@ + + //------------------------------make------------------------------------------- + const TypeOopPtr *TypeOopPtr::make(PTR ptr, +- int offset, int instance_id, const TypeOopPtr* speculative) { ++ int offset, int instance_id, const TypeOopPtr* speculative, int inline_depth) { + assert(ptr != Constant, "no constant generic pointers"); + ciKlass* k = Compile::current()->env()->Object_klass(); + bool xk = false; + ciObject* o = NULL; +- return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, instance_id, speculative))->hashcons(); ++ return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, instance_id, speculative, inline_depth))->hashcons(); + } + + +@@ -2524,7 +2554,7 @@ + const Type *TypeOopPtr::cast_to_ptr_type(PTR ptr) const { + assert(_base == OopPtr, "subclass must override cast_to_ptr_type"); + if( ptr == _ptr ) return this; +- return make(ptr, _offset, _instance_id, _speculative); ++ return make(ptr, _offset, _instance_id, _speculative, _inline_depth); + } + + //-----------------------------cast_to_instance_id---------------------------- +@@ -2560,14 +2590,14 @@ + return res; + } + +- if (res->isa_oopptr() != NULL) { ++ const TypeOopPtr* res_oopptr = res->is_oopptr(); ++ if (res_oopptr->speculative() != NULL) { + // type->speculative() == NULL means that speculation is no better + // than type, i.e. type->speculative() == type. So there are 2 + // ways to represent the fact that we have no useful speculative + // data and we should use a single one to be able to test for + // equality between types. Check whether type->speculative() == + // type and set speculative to NULL if it is the case. +- const TypeOopPtr* res_oopptr = res->is_oopptr(); + if (res_oopptr->remove_speculative() == res_oopptr->speculative()) { + return res_oopptr->remove_speculative(); + } +@@ -2621,7 +2651,7 @@ + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); + const TypeOopPtr* speculative = _speculative; +- return make(ptr, offset, instance_id, speculative); ++ return make(ptr, offset, instance_id, speculative, _inline_depth); + } + case BotPTR: + case NotNull: +@@ -2633,8 +2663,9 @@ + case OopPtr: { // Meeting to other OopPtrs + const TypeOopPtr *tp = t->is_oopptr(); + int instance_id = meet_instance_id(tp->instance_id()); +- const TypeOopPtr* speculative = meet_speculative(tp); +- return make(meet_ptr(tp->ptr()), meet_offset(tp->offset()), instance_id, speculative); ++ const TypeOopPtr* speculative = xmeet_speculative(tp); ++ int depth = meet_inline_depth(tp->inline_depth()); ++ return make(meet_ptr(tp->ptr()), meet_offset(tp->offset()), instance_id, speculative, depth); + } + + case InstPtr: // For these, flip the call around to cut down +@@ -2651,7 +2682,7 @@ + const Type *TypeOopPtr::xdual() const { + assert(klass() == Compile::current()->env()->Object_klass(), "no klasses here"); + assert(const_oop() == NULL, "no constants here"); +- return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id(), dual_speculative()); ++ return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id(), dual_speculative(), dual_inline_depth()); + } + + //--------------------------make_from_klass_common----------------------------- +@@ -2742,7 +2773,7 @@ + } else if (!o->should_be_constant()) { + return TypeAryPtr::make(TypePtr::NotNull, arr0, klass, true, 0); + } +- const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0, InstanceBot, NULL, is_autobox_cache); ++ const TypeAryPtr* arr = TypeAryPtr::make(TypePtr::Constant, o, arr0, klass, true, 0, InstanceBot, NULL, InlineDepthBottom, is_autobox_cache); + return arr; + } else if (klass->is_type_array_klass()) { + // Element is an typeArray +@@ -2787,9 +2818,9 @@ + + //-----------------------------filter------------------------------------------ + // Do not allow interface-vs.-noninterface joins to collapse to top. +-const Type *TypeOopPtr::filter(const Type *kills) const { +- +- const Type* ft = join(kills); ++const Type *TypeOopPtr::filter_helper(const Type *kills, bool include_speculative) const { ++ ++ const Type* ft = join_helper(kills, include_speculative); + const TypeInstPtr* ftip = ft->isa_instptr(); + const TypeInstPtr* ktip = kills->isa_instptr(); + +@@ -2831,7 +2862,8 @@ + const TypeOopPtr *a = (const TypeOopPtr*)t; + if (_klass_is_exact != a->_klass_is_exact || + _instance_id != a->_instance_id || +- !eq_speculative(a)) return false; ++ !eq_speculative(a) || ++ _inline_depth != a->_inline_depth) return false; + ciObject* one = const_oop(); + ciObject* two = a->const_oop(); + if (one == NULL || two == NULL) { +@@ -2849,6 +2881,7 @@ + _klass_is_exact + + _instance_id + + hash_speculative() + ++ _inline_depth + + TypePtr::hash(); + } + +@@ -2869,6 +2902,7 @@ + else if (_instance_id != InstanceBot) + st->print(",iid=%d",_instance_id); + ++ dump_inline_depth(st); + dump_speculative(st); + } + +@@ -2882,6 +2916,16 @@ + st->print(")"); + } + } ++ ++void TypeOopPtr::dump_inline_depth(outputStream *st) const { ++ if (_inline_depth != InlineDepthBottom) { ++ if (_inline_depth == InlineDepthTop) { ++ st->print(" (inline_depth=InlineDepthTop)"); ++ } else { ++ st->print(" (inline_depth=%d)", _inline_depth); ++ } ++ } ++} + #endif + + //------------------------------singleton-------------------------------------- +@@ -2895,14 +2939,62 @@ + + //------------------------------add_offset------------------------------------- + const TypePtr *TypeOopPtr::add_offset(intptr_t offset) const { +- return make(_ptr, xadd_offset(offset), _instance_id, add_offset_speculative(offset)); ++ return make(_ptr, xadd_offset(offset), _instance_id, add_offset_speculative(offset), _inline_depth); + } + + /** + * Return same type without a speculative part + */ +-const TypeOopPtr* TypeOopPtr::remove_speculative() const { +- return make(_ptr, _offset, _instance_id, NULL); ++const Type* TypeOopPtr::remove_speculative() const { ++ if (_speculative == NULL) { ++ return this; ++ } ++ assert(_inline_depth == InlineDepthTop || _inline_depth == InlineDepthBottom, "non speculative type shouldn't have inline depth"); ++ return make(_ptr, _offset, _instance_id, NULL, _inline_depth); ++} ++ ++/** ++ * Return same type but with a different inline depth (used for speculation) ++ * ++ * @param depth depth to meet with ++ */ ++const TypeOopPtr* TypeOopPtr::with_inline_depth(int depth) const { ++ if (!UseInlineDepthForSpeculativeTypes) { ++ return this; ++ } ++ return make(_ptr, _offset, _instance_id, _speculative, depth); ++} ++ ++/** ++ * Check whether new profiling would improve speculative type ++ * ++ * @param exact_kls class from profiling ++ * @param inline_depth inlining depth of profile point ++ * ++ * @return true if type profile is valuable ++ */ ++bool TypeOopPtr::would_improve_type(ciKlass* exact_kls, int inline_depth) const { ++ // no way to improve an already exact type ++ if (klass_is_exact()) { ++ return false; ++ } ++ // no profiling? ++ if (exact_kls == NULL) { ++ return false; ++ } ++ // no speculative type or non exact speculative type? ++ if (speculative_type() == NULL) { ++ return true; ++ } ++ // If the node already has an exact speculative type keep it, ++ // unless it was provided by profiling that is at a deeper ++ // inlining level. Profiling at a higher inlining depth is ++ // expected to be less accurate. ++ if (_speculative->inline_depth() == InlineDepthBottom) { ++ return false; ++ } ++ assert(_speculative->inline_depth() != InlineDepthTop, "can't do the comparison"); ++ return inline_depth < _speculative->inline_depth(); + } + + //------------------------------meet_instance_id-------------------------------- +@@ -2927,7 +3019,7 @@ + * + * @param other type to meet with + */ +-const TypeOopPtr* TypeOopPtr::meet_speculative(const TypeOopPtr* other) const { ++const TypeOopPtr* TypeOopPtr::xmeet_speculative(const TypeOopPtr* other) const { + bool this_has_spec = (_speculative != NULL); + bool other_has_spec = (other->speculative() != NULL); + +@@ -2952,7 +3044,7 @@ + other_spec = other; + } + +- return this_spec->meet(other_spec)->is_oopptr(); ++ return this_spec->meet_speculative(other_spec)->is_oopptr(); + } + + /** +@@ -3005,6 +3097,21 @@ + return _speculative->hash(); + } + ++/** ++ * dual of the inline depth for this type (used for speculation) ++ */ ++int TypeOopPtr::dual_inline_depth() const { ++ return -inline_depth(); ++} ++ ++/** ++ * meet of 2 inline depth (used for speculation) ++ * ++ * @param depth depth to meet with ++ */ ++int TypeOopPtr::meet_inline_depth(int depth) const { ++ return MAX2(inline_depth(), depth); ++} + + //============================================================================= + // Convenience common pre-built types. +@@ -3015,8 +3122,8 @@ + const TypeInstPtr *TypeInstPtr::KLASS; + + //------------------------------TypeInstPtr------------------------------------- +-TypeInstPtr::TypeInstPtr(PTR ptr, ciKlass* k, bool xk, ciObject* o, int off, int instance_id, const TypeOopPtr* speculative) +- : TypeOopPtr(InstPtr, ptr, k, xk, o, off, instance_id, speculative), _name(k->name()) { ++TypeInstPtr::TypeInstPtr(PTR ptr, ciKlass* k, bool xk, ciObject* o, int off, int instance_id, const TypeOopPtr* speculative, int inline_depth) ++ : TypeOopPtr(InstPtr, ptr, k, xk, o, off, instance_id, speculative, inline_depth), _name(k->name()) { + assert(k != NULL && + (k->is_loaded() || o == NULL), + "cannot have constants with non-loaded klass"); +@@ -3029,7 +3136,8 @@ + ciObject* o, + int offset, + int instance_id, +- const TypeOopPtr* speculative) { ++ const TypeOopPtr* speculative, ++ int inline_depth) { + assert( !k->is_loaded() || k->is_instance_klass(), "Must be for instance"); + // Either const_oop() is NULL or else ptr is Constant + assert( (!o && ptr != Constant) || (o && ptr == Constant), +@@ -3050,7 +3158,7 @@ + + // Now hash this baby + TypeInstPtr *result = +- (TypeInstPtr*)(new TypeInstPtr(ptr, k, xk, o ,offset, instance_id, speculative))->hashcons(); ++ (TypeInstPtr*)(new TypeInstPtr(ptr, k, xk, o ,offset, instance_id, speculative, inline_depth))->hashcons(); + + return result; + } +@@ -3083,7 +3191,7 @@ + if( ptr == _ptr ) return this; + // Reconstruct _sig info here since not a problem with later lazy + // construction, _sig will show up on demand. +- return make(ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id, _speculative); ++ return make(ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id, _speculative, _inline_depth); + } + + +@@ -3095,13 +3203,13 @@ + ciInstanceKlass* ik = _klass->as_instance_klass(); + if( (ik->is_final() || _const_oop) ) return this; // cannot clear xk + if( ik->is_interface() ) return this; // cannot set xk +- return make(ptr(), klass(), klass_is_exact, const_oop(), _offset, _instance_id, _speculative); ++ return make(ptr(), klass(), klass_is_exact, const_oop(), _offset, _instance_id, _speculative, _inline_depth); + } + + //-----------------------------cast_to_instance_id---------------------------- + const TypeOopPtr *TypeInstPtr::cast_to_instance_id(int instance_id) const { + if( instance_id == _instance_id ) return this; +- return make(_ptr, klass(), _klass_is_exact, const_oop(), _offset, instance_id, _speculative); ++ return make(_ptr, klass(), _klass_is_exact, const_oop(), _offset, instance_id, _speculative, _inline_depth); + } + + //------------------------------xmeet_unloaded--------------------------------- +@@ -3111,7 +3219,8 @@ + int off = meet_offset(tinst->offset()); + PTR ptr = meet_ptr(tinst->ptr()); + int instance_id = meet_instance_id(tinst->instance_id()); +- const TypeOopPtr* speculative = meet_speculative(tinst); ++ const TypeOopPtr* speculative = xmeet_speculative(tinst); ++ int depth = meet_inline_depth(tinst->inline_depth()); + + const TypeInstPtr *loaded = is_loaded() ? this : tinst; + const TypeInstPtr *unloaded = is_loaded() ? tinst : this; +@@ -3132,7 +3241,7 @@ + assert(loaded->ptr() != TypePtr::Null, "insanity check"); + // + if( loaded->ptr() == TypePtr::TopPTR ) { return unloaded; } +- else if (loaded->ptr() == TypePtr::AnyNull) { return TypeInstPtr::make(ptr, unloaded->klass(), false, NULL, off, instance_id, speculative); } ++ else if (loaded->ptr() == TypePtr::AnyNull) { return TypeInstPtr::make(ptr, unloaded->klass(), false, NULL, off, instance_id, speculative, depth); } + else if (loaded->ptr() == TypePtr::BotPTR ) { return TypeInstPtr::BOTTOM; } + else if (loaded->ptr() == TypePtr::Constant || loaded->ptr() == TypePtr::NotNull) { + if (unloaded->ptr() == TypePtr::BotPTR ) { return TypeInstPtr::BOTTOM; } +@@ -3188,7 +3297,8 @@ + int offset = meet_offset(tp->offset()); + PTR ptr = meet_ptr(tp->ptr()); + int instance_id = meet_instance_id(tp->instance_id()); +- const TypeOopPtr* speculative = meet_speculative(tp); ++ const TypeOopPtr* speculative = xmeet_speculative(tp); ++ int depth = meet_inline_depth(tp->inline_depth()); + switch (ptr) { + case TopPTR: + case AnyNull: // Fall 'down' to dual of object klass +@@ -3196,12 +3306,12 @@ + // below the centerline when the superclass is exact. We need to + // do the same here. + if (klass()->equals(ciEnv::current()->Object_klass()) && !klass_is_exact()) { +- return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id, speculative); ++ return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id, speculative, depth); + } else { + // cannot subclass, so the meet has to fall badly below the centerline + ptr = NotNull; + instance_id = InstanceBot; +- return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id, speculative); ++ return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id, speculative, depth); + } + case Constant: + case NotNull: +@@ -3216,7 +3326,7 @@ + if (klass()->equals(ciEnv::current()->Object_klass()) && !klass_is_exact()) { + // that is, tp's array type is a subtype of my klass + return TypeAryPtr::make(ptr, (ptr == Constant ? tp->const_oop() : NULL), +- tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id, speculative); ++ tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id, speculative, depth); + } + } + // The other case cannot happen, since I cannot be a subtype of an array. +@@ -3224,7 +3334,7 @@ + if( ptr == Constant ) + ptr = NotNull; + instance_id = InstanceBot; +- return make(ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id, speculative); ++ return make(ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id, speculative, depth); + default: typerr(t); + } + } +@@ -3238,15 +3348,17 @@ + case TopPTR: + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); +- const TypeOopPtr* speculative = meet_speculative(tp); ++ const TypeOopPtr* speculative = xmeet_speculative(tp); ++ int depth = meet_inline_depth(tp->inline_depth()); + return make(ptr, klass(), klass_is_exact(), +- (ptr == Constant ? const_oop() : NULL), offset, instance_id, speculative); ++ (ptr == Constant ? const_oop() : NULL), offset, instance_id, speculative, depth); + } + case NotNull: + case BotPTR: { + int instance_id = meet_instance_id(tp->instance_id()); +- const TypeOopPtr* speculative = meet_speculative(tp); +- return TypeOopPtr::make(ptr, offset, instance_id, speculative); ++ const TypeOopPtr* speculative = xmeet_speculative(tp); ++ int depth = meet_inline_depth(tp->inline_depth()); ++ return TypeOopPtr::make(ptr, offset, instance_id, speculative, depth); + } + default: typerr(t); + } +@@ -3266,7 +3378,7 @@ + int instance_id = meet_instance_id(InstanceTop); + const TypeOopPtr* speculative = _speculative; + return make(ptr, klass(), klass_is_exact(), +- (ptr == Constant ? const_oop() : NULL), offset, instance_id, speculative); ++ (ptr == Constant ? const_oop() : NULL), offset, instance_id, speculative, _inline_depth); + } + case NotNull: + case BotPTR: +@@ -3297,14 +3409,15 @@ + int off = meet_offset( tinst->offset() ); + PTR ptr = meet_ptr( tinst->ptr() ); + int instance_id = meet_instance_id(tinst->instance_id()); +- const TypeOopPtr* speculative = meet_speculative(tinst); ++ const TypeOopPtr* speculative = xmeet_speculative(tinst); ++ int depth = meet_inline_depth(tinst->inline_depth()); + + // Check for easy case; klasses are equal (and perhaps not loaded!) + // If we have constants, then we created oops so classes are loaded + // and we can handle the constants further down. This case handles + // both-not-loaded or both-loaded classes + if (ptr != Constant && klass()->equals(tinst->klass()) && klass_is_exact() == tinst->klass_is_exact()) { +- return make(ptr, klass(), klass_is_exact(), NULL, off, instance_id, speculative); ++ return make(ptr, klass(), klass_is_exact(), NULL, off, instance_id, speculative, depth); + } + + // Classes require inspection in the Java klass hierarchy. Must be loaded. +@@ -3368,7 +3481,7 @@ + // Find out which constant. + o = (this_klass == klass()) ? const_oop() : tinst->const_oop(); + } +- return make(ptr, k, xk, o, off, instance_id, speculative); ++ return make(ptr, k, xk, o, off, instance_id, speculative, depth); + } + + // Either oop vs oop or interface vs interface or interface vs Object +@@ -3445,7 +3558,7 @@ + else + ptr = NotNull; + } +- return make(ptr, this_klass, this_xk, o, off, instance_id, speculative); ++ return make(ptr, this_klass, this_xk, o, off, instance_id, speculative, depth); + } // Else classes are not equal + + // Since klasses are different, we require a LCA in the Java +@@ -3456,7 +3569,7 @@ + + // Now we find the LCA of Java classes + ciKlass* k = this_klass->least_common_ancestor(tinst_klass); +- return make(ptr, k, false, NULL, off, instance_id, speculative); ++ return make(ptr, k, false, NULL, off, instance_id, speculative, depth); + } // End of case InstPtr + + } // End of switch +@@ -3480,7 +3593,7 @@ + // Dual: do NOT dual on klasses. This means I do NOT understand the Java + // inheritance mechanism. + const Type *TypeInstPtr::xdual() const { +- return new TypeInstPtr(dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id(), dual_speculative()); ++ return new TypeInstPtr(dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id(), dual_speculative(), dual_inline_depth()); + } + + //------------------------------eq--------------------------------------------- +@@ -3537,6 +3650,7 @@ + else if (_instance_id != InstanceBot) + st->print(",iid=%d",_instance_id); + ++ dump_inline_depth(st); + dump_speculative(st); + } + #endif +@@ -3546,8 +3660,19 @@ + return make(_ptr, klass(), klass_is_exact(), const_oop(), xadd_offset(offset), _instance_id, add_offset_speculative(offset)); + } + +-const TypeOopPtr *TypeInstPtr::remove_speculative() const { +- return make(_ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id, NULL); ++const Type *TypeInstPtr::remove_speculative() const { ++ if (_speculative == NULL) { ++ return this; ++ } ++ assert(_inline_depth == InlineDepthTop || _inline_depth == InlineDepthBottom, "non speculative type shouldn't have inline depth"); ++ return make(_ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id, NULL, _inline_depth); ++} ++ ++const TypeOopPtr *TypeInstPtr::with_inline_depth(int depth) const { ++ if (!UseInlineDepthForSpeculativeTypes) { ++ return this; ++ } ++ return make(_ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id, _speculative, depth); + } + + //============================================================================= +@@ -3564,30 +3689,30 @@ + const TypeAryPtr *TypeAryPtr::DOUBLES; + + //------------------------------make------------------------------------------- +-const TypeAryPtr *TypeAryPtr::make(PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id, const TypeOopPtr* speculative) { ++const TypeAryPtr *TypeAryPtr::make(PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id, const TypeOopPtr* speculative, int inline_depth) { + assert(!(k == NULL && ary->_elem->isa_int()), + "integral arrays must be pre-equipped with a class"); + if (!xk) xk = ary->ary_must_be_exact(); + assert(instance_id <= 0 || xk || !UseExactTypes, "instances are always exactly typed"); + if (!UseExactTypes) xk = (ptr == Constant); +- return (TypeAryPtr*)(new TypeAryPtr(ptr, NULL, ary, k, xk, offset, instance_id, false, speculative))->hashcons(); ++ return (TypeAryPtr*)(new TypeAryPtr(ptr, NULL, ary, k, xk, offset, instance_id, false, speculative, inline_depth))->hashcons(); + } + + //------------------------------make------------------------------------------- +-const TypeAryPtr *TypeAryPtr::make(PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id, const TypeOopPtr* speculative, bool is_autobox_cache) { ++const TypeAryPtr *TypeAryPtr::make(PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id, const TypeOopPtr* speculative, int inline_depth, bool is_autobox_cache) { + assert(!(k == NULL && ary->_elem->isa_int()), + "integral arrays must be pre-equipped with a class"); + assert( (ptr==Constant && o) || (ptr!=Constant && !o), "" ); + if (!xk) xk = (o != NULL) || ary->ary_must_be_exact(); + assert(instance_id <= 0 || xk || !UseExactTypes, "instances are always exactly typed"); + if (!UseExactTypes) xk = (ptr == Constant); +- return (TypeAryPtr*)(new TypeAryPtr(ptr, o, ary, k, xk, offset, instance_id, is_autobox_cache, speculative))->hashcons(); ++ return (TypeAryPtr*)(new TypeAryPtr(ptr, o, ary, k, xk, offset, instance_id, is_autobox_cache, speculative, inline_depth))->hashcons(); + } + + //------------------------------cast_to_ptr_type------------------------------- + const Type *TypeAryPtr::cast_to_ptr_type(PTR ptr) const { + if( ptr == _ptr ) return this; +- return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset, _instance_id, _speculative); ++ return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset, _instance_id, _speculative, _inline_depth); + } + + +@@ -3596,13 +3721,13 @@ + if( klass_is_exact == _klass_is_exact ) return this; + if (!UseExactTypes) return this; + if (_ary->ary_must_be_exact()) return this; // cannot clear xk +- return make(ptr(), const_oop(), _ary, klass(), klass_is_exact, _offset, _instance_id, _speculative); ++ return make(ptr(), const_oop(), _ary, klass(), klass_is_exact, _offset, _instance_id, _speculative, _inline_depth); + } + + //-----------------------------cast_to_instance_id---------------------------- + const TypeOopPtr *TypeAryPtr::cast_to_instance_id(int instance_id) const { + if( instance_id == _instance_id ) return this; +- return make(_ptr, const_oop(), _ary, klass(), _klass_is_exact, _offset, instance_id, _speculative); ++ return make(_ptr, const_oop(), _ary, klass(), _klass_is_exact, _offset, instance_id, _speculative, _inline_depth); + } + + //-----------------------------narrow_size_type------------------------------- +@@ -3665,7 +3790,7 @@ + new_size = narrow_size_type(new_size); + if (new_size == size()) return this; + const TypeAry* new_ary = TypeAry::make(elem(), new_size, is_stable()); +- return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id, _speculative); ++ return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id, _speculative, _inline_depth); + } + + +@@ -3744,19 +3869,20 @@ + const TypeOopPtr *tp = t->is_oopptr(); + int offset = meet_offset(tp->offset()); + PTR ptr = meet_ptr(tp->ptr()); ++ int depth = meet_inline_depth(tp->inline_depth()); + switch (tp->ptr()) { + case TopPTR: + case AnyNull: { + int instance_id = meet_instance_id(InstanceTop); +- const TypeOopPtr* speculative = meet_speculative(tp); ++ const TypeOopPtr* speculative = xmeet_speculative(tp); + return make(ptr, (ptr == Constant ? const_oop() : NULL), +- _ary, _klass, _klass_is_exact, offset, instance_id, speculative); ++ _ary, _klass, _klass_is_exact, offset, instance_id, speculative, depth); + } + case BotPTR: + case NotNull: { + int instance_id = meet_instance_id(tp->instance_id()); +- const TypeOopPtr* speculative = meet_speculative(tp); +- return TypeOopPtr::make(ptr, offset, instance_id, speculative); ++ const TypeOopPtr* speculative = xmeet_speculative(tp); ++ return TypeOopPtr::make(ptr, offset, instance_id, speculative, depth); + } + default: ShouldNotReachHere(); + } +@@ -3780,7 +3906,7 @@ + int instance_id = meet_instance_id(InstanceTop); + const TypeOopPtr* speculative = _speculative; + return make(ptr, (ptr == Constant ? const_oop() : NULL), +- _ary, _klass, _klass_is_exact, offset, instance_id, speculative); ++ _ary, _klass, _klass_is_exact, offset, instance_id, speculative, _inline_depth); + } + default: ShouldNotReachHere(); + } +@@ -3793,10 +3919,11 @@ + case AryPtr: { // Meeting 2 references? + const TypeAryPtr *tap = t->is_aryptr(); + int off = meet_offset(tap->offset()); +- const TypeAry *tary = _ary->meet(tap->_ary)->is_ary(); ++ const TypeAry *tary = _ary->meet_speculative(tap->_ary)->is_ary(); + PTR ptr = meet_ptr(tap->ptr()); + int instance_id = meet_instance_id(tap->instance_id()); +- const TypeOopPtr* speculative = meet_speculative(tap); ++ const TypeOopPtr* speculative = xmeet_speculative(tap); ++ int depth = meet_inline_depth(tap->inline_depth()); + ciKlass* lazy_klass = NULL; + if (tary->_elem->isa_int()) { + // Integral array element types have irrelevant lattice relations. +@@ -3812,17 +3939,17 @@ + tary = TypeAry::make(Type::BOTTOM, tary->_size, tary->_stable); + } + } else // Non integral arrays. +- // Must fall to bottom if exact klasses in upper lattice +- // are not equal or super klass is exact. +- if ( above_centerline(ptr) && klass() != tap->klass() && +- // meet with top[] and bottom[] are processed further down: +- tap ->_klass != NULL && this->_klass != NULL && +- // both are exact and not equal: +- ((tap ->_klass_is_exact && this->_klass_is_exact) || +- // 'tap' is exact and super or unrelated: +- (tap ->_klass_is_exact && !tap->klass()->is_subtype_of(klass())) || +- // 'this' is exact and super or unrelated: +- (this->_klass_is_exact && !klass()->is_subtype_of(tap->klass())))) { ++ // Must fall to bottom if exact klasses in upper lattice ++ // are not equal or super klass is exact. ++ if ((above_centerline(ptr) || ptr == Constant) && klass() != tap->klass() && ++ // meet with top[] and bottom[] are processed further down: ++ tap->_klass != NULL && this->_klass != NULL && ++ // both are exact and not equal: ++ ((tap->_klass_is_exact && this->_klass_is_exact) || ++ // 'tap' is exact and super or unrelated: ++ (tap->_klass_is_exact && !tap->klass()->is_subtype_of(klass())) || ++ // 'this' is exact and super or unrelated: ++ (this->_klass_is_exact && !klass()->is_subtype_of(tap->klass())))) { + tary = TypeAry::make(Type::BOTTOM, tary->_size, tary->_stable); + return make(NotNull, NULL, tary, lazy_klass, false, off, InstanceBot); + } +@@ -3837,7 +3964,7 @@ + } else { + xk = (tap->_klass_is_exact | this->_klass_is_exact); + } +- return make(ptr, const_oop(), tary, lazy_klass, xk, off, instance_id, speculative); ++ return make(ptr, const_oop(), tary, lazy_klass, xk, off, instance_id, speculative, depth); + case Constant: { + ciObject* o = const_oop(); + if( _ptr == Constant ) { +@@ -3856,7 +3983,7 @@ + // Only precise for identical arrays + xk = this->_klass_is_exact && (klass() == tap->klass()); + } +- return TypeAryPtr::make(ptr, o, tary, lazy_klass, xk, off, instance_id, speculative); ++ return TypeAryPtr::make(ptr, o, tary, lazy_klass, xk, off, instance_id, speculative, depth); + } + case NotNull: + case BotPTR: +@@ -3865,7 +3992,7 @@ + xk = tap->_klass_is_exact; + else xk = (tap->_klass_is_exact & this->_klass_is_exact) && + (klass() == tap->klass()); // Only precise for identical arrays +- return TypeAryPtr::make(ptr, NULL, tary, lazy_klass, xk, off, instance_id, speculative); ++ return TypeAryPtr::make(ptr, NULL, tary, lazy_klass, xk, off, instance_id, speculative, depth); + default: ShouldNotReachHere(); + } + } +@@ -3876,7 +4003,8 @@ + int offset = meet_offset(tp->offset()); + PTR ptr = meet_ptr(tp->ptr()); + int instance_id = meet_instance_id(tp->instance_id()); +- const TypeOopPtr* speculative = meet_speculative(tp); ++ const TypeOopPtr* speculative = xmeet_speculative(tp); ++ int depth = meet_inline_depth(tp->inline_depth()); + switch (ptr) { + case TopPTR: + case AnyNull: // Fall 'down' to dual of object klass +@@ -3884,12 +4012,12 @@ + // below the centerline when the superclass is exact. We need to + // do the same here. + if (tp->klass()->equals(ciEnv::current()->Object_klass()) && !tp->klass_is_exact()) { +- return TypeAryPtr::make(ptr, _ary, _klass, _klass_is_exact, offset, instance_id, speculative); ++ return TypeAryPtr::make(ptr, _ary, _klass, _klass_is_exact, offset, instance_id, speculative, depth); + } else { + // cannot subclass, so the meet has to fall badly below the centerline + ptr = NotNull; + instance_id = InstanceBot; +- return TypeInstPtr::make(ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id, speculative); ++ return TypeInstPtr::make(ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id, speculative, depth); + } + case Constant: + case NotNull: +@@ -3904,7 +4032,7 @@ + if (tp->klass()->equals(ciEnv::current()->Object_klass()) && !tp->klass_is_exact()) { + // that is, my array type is a subtype of 'tp' klass + return make(ptr, (ptr == Constant ? const_oop() : NULL), +- _ary, _klass, _klass_is_exact, offset, instance_id, speculative); ++ _ary, _klass, _klass_is_exact, offset, instance_id, speculative, depth); + } + } + // The other case cannot happen, since t cannot be a subtype of an array. +@@ -3912,7 +4040,7 @@ + if( ptr == Constant ) + ptr = NotNull; + instance_id = InstanceBot; +- return TypeInstPtr::make(ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id, speculative); ++ return TypeInstPtr::make(ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id, speculative, depth); + default: typerr(t); + } + } +@@ -3923,7 +4051,7 @@ + //------------------------------xdual------------------------------------------ + // Dual: compute field-by-field dual + const Type *TypeAryPtr::xdual() const { +- return new TypeAryPtr(dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance_id(), is_autobox_cache(), dual_speculative()); ++ return new TypeAryPtr(dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance_id(), is_autobox_cache(), dual_speculative(), dual_inline_depth()); + } + + //----------------------interface_vs_oop--------------------------------------- +@@ -3976,6 +4104,7 @@ + else if (_instance_id != InstanceBot) + st->print(",iid=%d",_instance_id); + ++ dump_inline_depth(st); + dump_speculative(st); + } + #endif +@@ -3987,11 +4116,22 @@ + + //------------------------------add_offset------------------------------------- + const TypePtr *TypeAryPtr::add_offset(intptr_t offset) const { +- return make(_ptr, _const_oop, _ary, _klass, _klass_is_exact, xadd_offset(offset), _instance_id, add_offset_speculative(offset)); +-} +- +-const TypeOopPtr *TypeAryPtr::remove_speculative() const { +- return make(_ptr, _const_oop, _ary, _klass, _klass_is_exact, _offset, _instance_id, NULL); ++ return make(_ptr, _const_oop, _ary, _klass, _klass_is_exact, xadd_offset(offset), _instance_id, add_offset_speculative(offset), _inline_depth); ++} ++ ++const Type *TypeAryPtr::remove_speculative() const { ++ if (_speculative == NULL) { ++ return this; ++ } ++ assert(_inline_depth == InlineDepthTop || _inline_depth == InlineDepthBottom, "non speculative type shouldn't have inline depth"); ++ return make(_ptr, _const_oop, _ary->remove_speculative()->is_ary(), _klass, _klass_is_exact, _offset, _instance_id, NULL, _inline_depth); ++} ++ ++const TypeOopPtr *TypeAryPtr::with_inline_depth(int depth) const { ++ if (!UseInlineDepthForSpeculativeTypes) { ++ return this; ++ } ++ return make(_ptr, _const_oop, _ary->remove_speculative()->is_ary(), _klass, _klass_is_exact, _offset, _instance_id, _speculative, depth); + } + + //============================================================================= +@@ -4031,9 +4171,9 @@ + } + + +-const Type *TypeNarrowPtr::filter( const Type *kills ) const { ++const Type *TypeNarrowPtr::filter_helper(const Type *kills, bool include_speculative) const { + if (isa_same_narrowptr(kills)) { +- const Type* ft =_ptrtype->filter(is_same_narrowptr(kills)->_ptrtype); ++ const Type* ft =_ptrtype->filter_helper(is_same_narrowptr(kills)->_ptrtype, include_speculative); + if (ft->empty()) + return Type::TOP; // Canonical empty value + if (ft->isa_ptr()) { +@@ -4041,7 +4181,7 @@ + } + return ft; + } else if (kills->isa_ptr()) { +- const Type* ft = _ptrtype->join(kills); ++ const Type* ft = _ptrtype->join_helper(kills, include_speculative); + if (ft->empty()) + return Type::TOP; // Canonical empty value + return ft; +@@ -4171,8 +4311,8 @@ + + //-----------------------------filter------------------------------------------ + // Do not allow interface-vs.-noninterface joins to collapse to top. +-const Type *TypeMetadataPtr::filter( const Type *kills ) const { +- const TypeMetadataPtr* ft = join(kills)->isa_metadataptr(); ++const Type *TypeMetadataPtr::filter_helper(const Type *kills, bool include_speculative) const { ++ const TypeMetadataPtr* ft = join_helper(kills, include_speculative)->isa_metadataptr(); + if (ft == NULL || ft->empty()) + return Type::TOP; // Canonical empty value + return ft; +@@ -4242,7 +4382,7 @@ + // else fall through: + case TopPTR: + case AnyNull: { +- return make(ptr, NULL, offset); ++ return make(ptr, _metadata, offset); + } + case BotPTR: + case NotNull: +@@ -4374,10 +4514,10 @@ + } + + // Do not allow interface-vs.-noninterface joins to collapse to top. +-const Type *TypeKlassPtr::filter(const Type *kills) const { ++const Type *TypeKlassPtr::filter_helper(const Type *kills, bool include_speculative) const { + // logic here mirrors the one from TypeOopPtr::filter. See comments + // there. +- const Type* ft = join(kills); ++ const Type* ft = join_helper(kills, include_speculative); + const TypeKlassPtr* ftkp = ft->isa_klassptr(); + const TypeKlassPtr* ktkp = kills->isa_klassptr(); + +--- ./hotspot/src/share/vm/opto/type.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/type.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -164,6 +164,8 @@ + virtual bool interface_vs_oop_helper(const Type *t) const; + #endif + ++ const Type *meet_helper(const Type *t, bool include_speculative) const; ++ + protected: + // Each class of type is also identified by its base. + const TYPES _base; // Enum of Types type +@@ -171,6 +173,10 @@ + Type( TYPES t ) : _dual(NULL), _base(t) {} // Simple types + // ~Type(); // Use fast deallocation + const Type *hashcons(); // Hash-cons the type ++ virtual const Type *filter_helper(const Type *kills, bool include_speculative) const; ++ const Type *join_helper(const Type *t, bool include_speculative) const { ++ return dual()->meet_helper(t->dual(), include_speculative)->dual(); ++ } + + public: + +@@ -202,10 +208,24 @@ + // Test for equivalence of types + static int cmp( const Type *const t1, const Type *const t2 ); + // Test for higher or equal in lattice +- int higher_equal( const Type *t ) const { return !cmp(meet(t),t); } ++ // Variant that drops the speculative part of the types ++ int higher_equal(const Type *t) const { ++ return !cmp(meet(t),t->remove_speculative()); ++ } ++ // Variant that keeps the speculative part of the types ++ int higher_equal_speculative(const Type *t) const { ++ return !cmp(meet_speculative(t),t); ++ } + + // MEET operation; lower in lattice. +- const Type *meet( const Type *t ) const; ++ // Variant that drops the speculative part of the types ++ const Type *meet(const Type *t) const { ++ return meet_helper(t, false); ++ } ++ // Variant that keeps the speculative part of the types ++ const Type *meet_speculative(const Type *t) const { ++ return meet_helper(t, true); ++ } + // WIDEN: 'widens' for Ints and other range types + virtual const Type *widen( const Type *old, const Type* limit ) const { return this; } + // NARROW: complement for widen, used by pessimistic phases +@@ -221,13 +241,26 @@ + + // JOIN operation; higher in lattice. Done by finding the dual of the + // meet of the dual of the 2 inputs. +- const Type *join( const Type *t ) const { +- return dual()->meet(t->dual())->dual(); } ++ // Variant that drops the speculative part of the types ++ const Type *join(const Type *t) const { ++ return join_helper(t, false); ++ } ++ // Variant that keeps the speculative part of the types ++ const Type *join_speculative(const Type *t) const { ++ return join_helper(t, true); ++ } + + // Modified version of JOIN adapted to the needs Node::Value. + // Normalizes all empty values to TOP. Does not kill _widen bits. + // Currently, it also works around limitations involving interface types. +- virtual const Type *filter( const Type *kills ) const; ++ // Variant that drops the speculative part of the types ++ const Type *filter(const Type *kills) const { ++ return filter_helper(kills, false); ++ } ++ // Variant that keeps the speculative part of the types ++ const Type *filter_speculative(const Type *kills) const { ++ return filter_helper(kills, true); ++ } + + #ifdef ASSERT + // One type is interface, the other is oop +@@ -382,7 +415,14 @@ + bool is_autobox_cache = false); + + // Speculative type. See TypeInstPtr ++ virtual const TypeOopPtr* speculative() const { return NULL; } + virtual ciKlass* speculative_type() const { return NULL; } ++ const Type* maybe_remove_speculative(bool include_speculative) const; ++ virtual const Type* remove_speculative() const { return this; } ++ ++ virtual bool would_improve_type(ciKlass* exact_kls, int inline_depth) const { ++ return exact_kls != NULL; ++ } + + private: + // support arrays +@@ -450,12 +490,15 @@ + // upper bound, inclusive. + class TypeInt : public Type { + TypeInt( jint lo, jint hi, int w ); ++protected: ++ virtual const Type *filter_helper(const Type *kills, bool include_speculative) const; ++ + public: ++ typedef jint NativeType; + virtual bool eq( const Type *t ) const; + virtual int hash() const; // Type specific hashing + virtual bool singleton(void) const; // TRUE if type is a singleton + virtual bool empty(void) const; // TRUE if type is vacuous +-public: + const jint _lo, _hi; // Lower bound, upper bound + const short _widen; // Limit on times we widen this sucker + +@@ -475,7 +518,6 @@ + virtual const Type *widen( const Type *t, const Type* limit_type ) const; + virtual const Type *narrow( const Type *t ) const; + // Do not kill _widen bits. +- virtual const Type *filter( const Type *kills ) const; + // Convenience common pre-built types. + static const TypeInt *MINUS_1; + static const TypeInt *ZERO; +@@ -495,6 +537,9 @@ + static const TypeInt *POS1; + static const TypeInt *INT; + static const TypeInt *SYMINT; // symmetric range [-max_jint..max_jint] ++ static const TypeInt *TYPE_DOMAIN; // alias for TypeInt::INT ++ ++ static const TypeInt *as_self(const Type *t) { return t->is_int(); } + #ifndef PRODUCT + virtual void dump2( Dict &d, uint depth, outputStream *st ) const; + #endif +@@ -506,7 +551,11 @@ + // an upper bound, inclusive. + class TypeLong : public Type { + TypeLong( jlong lo, jlong hi, int w ); ++protected: ++ // Do not kill _widen bits. ++ virtual const Type *filter_helper(const Type *kills, bool include_speculative) const; + public: ++ typedef jlong NativeType; + virtual bool eq( const Type *t ) const; + virtual int hash() const; // Type specific hashing + virtual bool singleton(void) const; // TRUE if type is a singleton +@@ -524,14 +573,16 @@ + bool is_con(int i) const { return is_con() && _lo == i; } + jlong get_con() const { assert( is_con(), "" ); return _lo; } + ++ // Check for positive 32-bit value. ++ int is_positive_int() const { return _lo >= 0 && _hi <= (jlong)max_jint; } ++ + virtual bool is_finite() const; // Has a finite value + ++ + virtual const Type *xmeet( const Type *t ) const; + virtual const Type *xdual() const; // Compute dual right now. + virtual const Type *widen( const Type *t, const Type* limit_type ) const; + virtual const Type *narrow( const Type *t ) const; +- // Do not kill _widen bits. +- virtual const Type *filter( const Type *kills ) const; + // Convenience common pre-built types. + static const TypeLong *MINUS_1; + static const TypeLong *ZERO; +@@ -540,6 +591,11 @@ + static const TypeLong *LONG; + static const TypeLong *INT; // 32-bit subrange [min_jint..max_jint] + static const TypeLong *UINT; // 32-bit unsigned [0..max_juint] ++ static const TypeLong *TYPE_DOMAIN; // alias for TypeLong::LONG ++ ++ // static convenience methods. ++ static const TypeLong *as_self(const Type *t) { return t->is_long(); } ++ + #ifndef PRODUCT + virtual void dump2( Dict &d, uint, outputStream *st ) const;// Specialized per-Type dumping + #endif +@@ -622,6 +678,7 @@ + virtual const Type *xmeet( const Type *t ) const; + virtual const Type *xdual() const; // Compute dual right now. + bool ary_must_be_exact() const; // true if arrays of such are never generic ++ virtual const Type* remove_speculative() const; + #ifdef ASSERT + // One type is interface, the other is oop + virtual bool interface_vs_oop(const Type *t) const; +@@ -793,7 +850,7 @@ + // Some kind of oop (Java pointer), either klass or instance or array. + class TypeOopPtr : public TypePtr { + protected: +- TypeOopPtr(TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id, const TypeOopPtr* speculative); ++ TypeOopPtr(TYPES t, PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id, const TypeOopPtr* speculative, int inline_depth); + public: + virtual bool eq( const Type *t ) const; + virtual int hash() const; // Type specific hashing +@@ -804,6 +861,10 @@ + }; + protected: + ++ enum { ++ InlineDepthBottom = INT_MAX, ++ InlineDepthTop = -InlineDepthBottom ++ }; + // Oop is NULL, unless this is a constant oop. + ciObject* _const_oop; // Constant oop + // If _klass is NULL, then so is _sig. This is an unloaded klass. +@@ -824,6 +885,11 @@ + // use it, then we have to emit a guard: this part of the type is + // not something we know but something we speculate about the type. + const TypeOopPtr* _speculative; ++ // For speculative types, we record at what inlining depth the ++ // profiling point that provided the data is. We want to favor ++ // profile data coming from outer scopes which are likely better for ++ // the current compilation. ++ int _inline_depth; + + static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact); + +@@ -832,13 +898,22 @@ + + // utility methods to work on the speculative part of the type + const TypeOopPtr* dual_speculative() const; +- const TypeOopPtr* meet_speculative(const TypeOopPtr* other) const; ++ const TypeOopPtr* xmeet_speculative(const TypeOopPtr* other) const; + bool eq_speculative(const TypeOopPtr* other) const; + int hash_speculative() const; + const TypeOopPtr* add_offset_speculative(intptr_t offset) const; + #ifndef PRODUCT + void dump_speculative(outputStream *st) const; + #endif ++ // utility methods to work on the inline depth of the type ++ int dual_inline_depth() const; ++ int meet_inline_depth(int depth) const; ++#ifndef PRODUCT ++ void dump_inline_depth(outputStream *st) const; ++#endif ++ ++ // Do not allow interface-vs.-noninterface joins to collapse to top. ++ virtual const Type *filter_helper(const Type *kills, bool include_speculative) const; + + public: + // Creates a type given a klass. Correctly handles multi-dimensional arrays +@@ -866,7 +941,7 @@ + bool not_null_elements = false); + + // Make a generic (unclassed) pointer to an oop. +- static const TypeOopPtr* make(PTR ptr, int offset, int instance_id, const TypeOopPtr* speculative); ++ static const TypeOopPtr* make(PTR ptr, int offset, int instance_id, const TypeOopPtr* speculative = NULL, int inline_depth = InlineDepthBottom); + + ciObject* const_oop() const { return _const_oop; } + virtual ciKlass* klass() const { return _klass; } +@@ -880,7 +955,7 @@ + bool is_known_instance() const { return _instance_id > 0; } + int instance_id() const { return _instance_id; } + bool is_known_instance_field() const { return is_known_instance() && _offset >= 0; } +- const TypeOopPtr* speculative() const { return _speculative; } ++ virtual const TypeOopPtr* speculative() const { return _speculative; } + + virtual intptr_t get_con() const; + +@@ -895,16 +970,13 @@ + + virtual const TypePtr *add_offset( intptr_t offset ) const; + // Return same type without a speculative part +- virtual const TypeOopPtr* remove_speculative() const; ++ virtual const Type* remove_speculative() const; + + virtual const Type *xmeet(const Type *t) const; + virtual const Type *xdual() const; // Compute dual right now. + // the core of the computation of the meet for TypeOopPtr and for its subclasses + virtual const Type *xmeet_helper(const Type *t) const; + +- // Do not allow interface-vs.-noninterface joins to collapse to top. +- virtual const Type *filter( const Type *kills ) const; +- + // Convenience common pre-built type. + static const TypeOopPtr *BOTTOM; + #ifndef PRODUCT +@@ -916,18 +988,23 @@ + if (_speculative != NULL) { + const TypeOopPtr* speculative = _speculative->join(this)->is_oopptr(); + if (speculative->klass_is_exact()) { +- return speculative->klass(); ++ return speculative->klass(); + } + } + return NULL; + } ++ int inline_depth() const { ++ return _inline_depth; ++ } ++ virtual const TypeOopPtr* with_inline_depth(int depth) const; ++ virtual bool would_improve_type(ciKlass* exact_kls, int inline_depth) const; + }; + + //------------------------------TypeInstPtr------------------------------------ + // Class of Java object pointers, pointing either to non-array Java instances + // or to a Klass* (including array klasses). + class TypeInstPtr : public TypeOopPtr { +- TypeInstPtr(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id, const TypeOopPtr* speculative); ++ TypeInstPtr(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id, const TypeOopPtr* speculative, int inline_depth); + virtual bool eq( const Type *t ) const; + virtual int hash() const; // Type specific hashing + +@@ -963,7 +1040,7 @@ + } + + // Make a pointer to an oop. +- static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = InstanceBot, const TypeOopPtr* speculative = NULL); ++ static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = InstanceBot, const TypeOopPtr* speculative = NULL, int inline_depth = InlineDepthBottom); + + /** Create constant type for a constant boxed value */ + const Type* get_const_boxed_value() const; +@@ -981,7 +1058,8 @@ + + virtual const TypePtr *add_offset( intptr_t offset ) const; + // Return same type without a speculative part +- virtual const TypeOopPtr* remove_speculative() const; ++ virtual const Type* remove_speculative() const; ++ virtual const TypeOopPtr* with_inline_depth(int depth) const; + + // the core of the computation of the meet of 2 types + virtual const Type *xmeet_helper(const Type *t) const; +@@ -1003,8 +1081,8 @@ + // Class of Java array pointers + class TypeAryPtr : public TypeOopPtr { + TypeAryPtr( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, +- int offset, int instance_id, bool is_autobox_cache, const TypeOopPtr* speculative) +- : TypeOopPtr(AryPtr,ptr,k,xk,o,offset, instance_id, speculative), ++ int offset, int instance_id, bool is_autobox_cache, const TypeOopPtr* speculative, int inline_depth) ++ : TypeOopPtr(AryPtr,ptr,k,xk,o,offset, instance_id, speculative, inline_depth), + _ary(ary), + _is_autobox_cache(is_autobox_cache) + { +@@ -1042,9 +1120,9 @@ + + bool is_autobox_cache() const { return _is_autobox_cache; } + +- static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot, const TypeOopPtr* speculative = NULL); ++ static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot, const TypeOopPtr* speculative = NULL, int inline_depth = InlineDepthBottom); + // Constant pointer to array +- static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot, const TypeOopPtr* speculative = NULL, bool is_autobox_cache = false); ++ static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot, const TypeOopPtr* speculative = NULL, int inline_depth = InlineDepthBottom, bool is_autobox_cache= false); + + // Return a 'ptr' version of this type + virtual const Type *cast_to_ptr_type(PTR ptr) const; +@@ -1059,7 +1137,8 @@ + virtual bool empty(void) const; // TRUE if type is vacuous + virtual const TypePtr *add_offset( intptr_t offset ) const; + // Return same type without a speculative part +- virtual const TypeOopPtr* remove_speculative() const; ++ virtual const Type* remove_speculative() const; ++ virtual const TypeOopPtr* with_inline_depth(int depth) const; + + // the core of the computation of the meet of 2 types + virtual const Type *xmeet_helper(const Type *t) const; +@@ -1100,6 +1179,8 @@ + class TypeMetadataPtr : public TypePtr { + protected: + TypeMetadataPtr(PTR ptr, ciMetadata* metadata, int offset); ++ // Do not allow interface-vs.-noninterface joins to collapse to top. ++ virtual const Type *filter_helper(const Type *kills, bool include_speculative) const; + public: + virtual bool eq( const Type *t ) const; + virtual int hash() const; // Type specific hashing +@@ -1125,9 +1206,6 @@ + + virtual intptr_t get_con() const; + +- // Do not allow interface-vs.-noninterface joins to collapse to top. +- virtual const Type *filter( const Type *kills ) const; +- + // Convenience common pre-built types. + static const TypeMetadataPtr *BOTTOM; + +@@ -1141,6 +1219,8 @@ + class TypeKlassPtr : public TypePtr { + TypeKlassPtr( PTR ptr, ciKlass* klass, int offset ); + ++protected: ++ virtual const Type *filter_helper(const Type *kills, bool include_speculative) const; + public: + virtual bool eq( const Type *t ) const; + virtual int hash() const; // Type specific hashing +@@ -1202,9 +1282,6 @@ + + virtual intptr_t get_con() const; + +- // Do not allow interface-vs.-noninterface joins to collapse to top. +- virtual const Type *filter( const Type *kills ) const; +- + // Convenience common pre-built types. + static const TypeKlassPtr* OBJECT; // Not-null object klass or below + static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same +@@ -1228,6 +1305,8 @@ + virtual const TypeNarrowPtr *is_same_narrowptr(const Type *t) const = 0; + virtual const TypeNarrowPtr *make_same_narrowptr(const TypePtr *t) const = 0; + virtual const TypeNarrowPtr *make_hash_same_narrowptr(const TypePtr *t) const = 0; ++ // Do not allow interface-vs.-noninterface joins to collapse to top. ++ virtual const Type *filter_helper(const Type *kills, bool include_speculative) const; + public: + virtual bool eq( const Type *t ) const; + virtual int hash() const; // Type specific hashing +@@ -1238,9 +1317,6 @@ + + virtual intptr_t get_con() const; + +- // Do not allow interface-vs.-noninterface joins to collapse to top. +- virtual const Type *filter( const Type *kills ) const; +- + virtual bool empty(void) const; // TRUE if type is vacuous + + // returns the equivalent ptr type for this compressed pointer +@@ -1291,6 +1367,10 @@ + static const TypeNarrowOop *BOTTOM; + static const TypeNarrowOop *NULL_PTR; + ++ virtual const Type* remove_speculative() const { ++ return make(_ptrtype->remove_speculative()->is_ptr()); ++ } ++ + #ifndef PRODUCT + virtual void dump2( Dict &d, uint depth, outputStream *st ) const; + #endif +@@ -1636,6 +1716,7 @@ + #define ConvL2X(x) (x) + #define ConvX2I(x) ConvL2I(x) + #define ConvX2L(x) (x) ++#define ConvX2UL(x) (x) + + #else + +@@ -1680,6 +1761,7 @@ + #define ConvL2X(x) ConvL2I(x) + #define ConvX2I(x) (x) + #define ConvX2L(x) ConvI2L(x) ++#define ConvX2UL(x) ConvI2UL(x) + + #endif + +--- ./hotspot/src/share/vm/opto/vectornode.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/opto/vectornode.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -356,7 +356,7 @@ + class LoadVectorNode : public LoadNode { + public: + LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt) +- : LoadNode(c, mem, adr, at, vt) { ++ : LoadNode(c, mem, adr, at, vt, MemNode::unordered) { + init_class_id(Class_LoadVector); + } + +@@ -380,7 +380,7 @@ + class StoreVectorNode : public StoreNode { + public: + StoreVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val) +- : StoreNode(c, mem, adr, at, val) { ++ : StoreNode(c, mem, adr, at, val, MemNode::unordered) { + assert(val->is_Vector() || val->is_LoadVector(), "sanity"); + init_class_id(Class_StoreVector); + } +--- ./hotspot/src/share/vm/prims/forte.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/prims/forte.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -71,7 +71,7 @@ + // Native interfaces for use by Forte tools. + + +-#ifndef IA64 ++#if !defined(IA64) && !defined(PPC64) + + class vframeStreamForte : public vframeStreamCommon { + public: +@@ -629,16 +629,16 @@ + #endif // !_WINDOWS + + } // end extern "C" +-#endif // !IA64 ++#endif // !IA64 && !PPC64 + + void Forte::register_stub(const char* name, address start, address end) { +-#if !defined(_WINDOWS) && !defined(IA64) ++#if !defined(_WINDOWS) && !defined(IA64) && !defined(PPC64) + assert(pointer_delta(end, start, sizeof(jbyte)) < INT_MAX, + "Code size exceeds maximum range"); + + collector_func_load((char*)name, NULL, NULL, start, + pointer_delta(end, start, sizeof(jbyte)), 0, NULL); +-#endif // !_WINDOWS && !IA64 ++#endif // !_WINDOWS && !IA64 && !PPC64 + } + + #else // INCLUDE_JVMTI +--- ./hotspot/src/share/vm/prims/jni.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jni.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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. + * Copyright (c) 2012 Red Hat, Inc. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * +@@ -308,7 +308,7 @@ + + class JNITraceWrapper : public StackObj { + public: +- JNITraceWrapper(const char* format, ...) { ++ JNITraceWrapper(const char* format, ...) ATTRIBUTE_PRINTF(2, 3) { + if (TraceJNICalls) { + va_list ap; + va_start(ap, format); +@@ -1356,9 +1356,13 @@ + // interface call + KlassHandle h_holder(THREAD, holder); + +- int itbl_index = m->itable_index(); +- Klass* k = h_recv->klass(); +- selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK); ++ if (call_type == JNI_VIRTUAL) { ++ int itbl_index = m->itable_index(); ++ Klass* k = h_recv->klass(); ++ selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK); ++ } else { ++ selected_method = m; ++ } + } + } + +@@ -4446,8 +4450,23 @@ + + // Get needed field and method IDs + directByteBufferConstructor = env->GetMethodID(directByteBufferClass, "", "(JI)V"); ++ if (env->ExceptionCheck()) { ++ env->ExceptionClear(); ++ directBufferSupportInitializeFailed = 1; ++ return false; ++ } + directBufferAddressField = env->GetFieldID(bufferClass, "address", "J"); ++ if (env->ExceptionCheck()) { ++ env->ExceptionClear(); ++ directBufferSupportInitializeFailed = 1; ++ return false; ++ } + bufferCapacityField = env->GetFieldID(bufferClass, "capacity", "I"); ++ if (env->ExceptionCheck()) { ++ env->ExceptionClear(); ++ directBufferSupportInitializeFailed = 1; ++ return false; ++ } + + if ((directByteBufferConstructor == NULL) || + (directBufferAddressField == NULL) || +@@ -5061,8 +5080,11 @@ + void TestMetaspaceAux_test(); + void TestMetachunk_test(); + void TestVirtualSpaceNode_test(); ++void TestNewSize_test(); + #if INCLUDE_ALL_GCS ++void TestOldFreeSpaceCalculation_test(); + void TestG1BiasedArray_test(); ++void TestCodeCacheRemSet_test(); + #endif + + void execute_internal_vm_tests() { +@@ -5081,12 +5103,15 @@ + run_unit_test(QuickSort::test_quick_sort()); + run_unit_test(AltHashing::test_alt_hash()); + run_unit_test(test_loggc_filename()); ++ run_unit_test(TestNewSize_test()); + #if INCLUDE_VM_STRUCTS + run_unit_test(VMStructs::test()); + #endif + #if INCLUDE_ALL_GCS ++ run_unit_test(TestOldFreeSpaceCalculation_test()); + run_unit_test(TestG1BiasedArray_test()); + run_unit_test(HeapRegionRemSet::test_prt()); ++ run_unit_test(TestCodeCacheRemSet_test()); + #endif + tty->print_cr("All internal VM tests passed"); + } +@@ -5185,7 +5210,7 @@ + } + + #ifndef PRODUCT +- #ifndef TARGET_OS_FAMILY_windows ++ #ifndef CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED + #define CALL_TEST_FUNC_WITH_WRAPPER_IF_NEEDED(f) f() + #endif + +--- ./hotspot/src/share/vm/prims/jniCheck.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jniCheck.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -100,7 +100,7 @@ + result_type JNICALL header { \ + JavaThread* thr = (JavaThread*)ThreadLocalStorage::get_thread_slow();\ + if (thr == NULL || !thr->is_Java_thread()) { \ +- tty->print_cr(fatal_using_jnienv_in_nonjava); \ ++ tty->print_cr("%s", fatal_using_jnienv_in_nonjava); \ + os::abort(true); \ + } \ + JNIEnv* xenv = thr->jni_environment(); \ +@@ -184,7 +184,7 @@ + functionEnter(JavaThread* thr) + { + if (thr->in_critical()) { +- tty->print_cr(warn_other_function_in_critical); ++ tty->print_cr("%s", warn_other_function_in_critical); + } + if (thr->has_pending_exception()) { + NativeReportJNIWarning(thr, "JNI call made with exception pending"); +@@ -195,7 +195,7 @@ + functionEnterExceptionAllowed(JavaThread* thr) + { + if (thr->in_critical()) { +- tty->print_cr(warn_other_function_in_critical); ++ tty->print_cr("%s", warn_other_function_in_critical); + } + } + +--- ./hotspot/src/share/vm/prims/jvm.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvm.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -76,6 +76,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "jvm_windows.h" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "jvm_aix.h" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "jvm_bsd.h" + #endif +@@ -217,7 +220,7 @@ + #ifdef ASSERT + class JVMTraceWrapper : public StackObj { + public: +- JVMTraceWrapper(const char* format, ...) { ++ JVMTraceWrapper(const char* format, ...) ATTRIBUTE_PRINTF(2, 3) { + if (TraceJVMCalls) { + va_list ap; + va_start(ap, format); +@@ -389,6 +392,23 @@ + JVM_END + + ++/* ++ * Return the temporary directory that the VM uses for the attach ++ * and perf data files. ++ * ++ * It is important that this directory is well-known and the ++ * same for all VM instances. It cannot be affected by configuration ++ * variables such as java.io.tmpdir. ++ */ ++JVM_ENTRY(jstring, JVM_GetTemporaryDirectory(JNIEnv *env)) ++ JVMWrapper("JVM_GetTemporaryDirectory"); ++ HandleMark hm(THREAD); ++ const char* temp_dir = os::get_temp_directory(); ++ Handle h = java_lang_String::create_from_platform_dependent_str(temp_dir, CHECK_NULL); ++ return (jstring) JNIHandles::make_local(env, h()); ++JVM_END ++ ++ + // java.lang.Runtime ///////////////////////////////////////////////////////////////////////// + + extern volatile jint vm_created; +@@ -518,6 +538,12 @@ + JavaThreadInObjectWaitState jtiows(thread, ms != 0); + if (JvmtiExport::should_post_monitor_wait()) { + JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms); ++ ++ // The current thread already owns the monitor and it has not yet ++ // been added to the wait queue so the current thread cannot be ++ // made the successor. This means that the JVMTI_EVENT_MONITOR_WAIT ++ // event handler cannot accidentally consume an unpark() meant for ++ // the ParkEvent associated with this ObjectMonitor. + } + ObjectSynchronizer::wait(obj, ms, CHECK); + JVM_END +@@ -1208,7 +1234,8 @@ + // get run() method + Method* m_oop = object->klass()->uncached_lookup_method( + vmSymbols::run_method_name(), +- vmSymbols::void_object_signature()); ++ vmSymbols::void_object_signature(), ++ Klass::normal); + methodHandle m (THREAD, m_oop); + if (m.is_null() || !m->is_method() || !m()->is_public() || m()->is_static()) { + THROW_MSG_0(vmSymbols::java_lang_InternalError(), "No run method"); +@@ -2706,14 +2733,14 @@ + + + JVM_LEAF(jlong, JVM_Lseek(jint fd, jlong offset, jint whence)) +- JVMWrapper4("JVM_Lseek (0x%x, %Ld, %d)", fd, offset, whence); ++ JVMWrapper4("JVM_Lseek (0x%x, " INT64_FORMAT ", %d)", fd, (int64_t) offset, whence); + //%note jvm_r6 + return os::lseek(fd, offset, whence); + JVM_END + + + JVM_LEAF(jint, JVM_SetLength(jint fd, jlong length)) +- JVMWrapper3("JVM_SetLength (0x%x, %Ld)", fd, length); ++ JVMWrapper3("JVM_SetLength (0x%x, " INT64_FORMAT ")", fd, (int64_t) length); + return os::ftruncate(fd, length); + JVM_END + +@@ -2728,13 +2755,14 @@ + // Printing support ////////////////////////////////////////////////// + extern "C" { + ++ATTRIBUTE_PRINTF(3, 0) + int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) { + // see bug 4399518, 4417214 + if ((intptr_t)count <= 0) return -1; + return vsnprintf(str, count, fmt, args); + } + +- ++ATTRIBUTE_PRINTF(3, 0) + int jio_snprintf(char *str, size_t count, const char *fmt, ...) { + va_list args; + int len; +@@ -2744,7 +2772,7 @@ + return len; + } + +- ++ATTRIBUTE_PRINTF(2,3) + int jio_fprintf(FILE* f, const char *fmt, ...) { + int len; + va_list args; +@@ -2754,7 +2782,7 @@ + return len; + } + +- ++ATTRIBUTE_PRINTF(2, 0) + int jio_vfprintf(FILE* f, const char *fmt, va_list args) { + if (Arguments::vfprintf_hook() != NULL) { + return Arguments::vfprintf_hook()(f, fmt, args); +@@ -2763,7 +2791,7 @@ + } + } + +- ++ATTRIBUTE_PRINTF(1, 2) + JNIEXPORT int jio_printf(const char *fmt, ...) { + int len; + va_list args; +@@ -2900,7 +2928,7 @@ + JavaThread* receiver = java_lang_Thread::thread(java_thread); + Events::log_exception(JavaThread::current(), + "JVM_StopThread thread JavaThread " INTPTR_FORMAT " as oop " INTPTR_FORMAT " [exception " INTPTR_FORMAT "]", +- receiver, (address)java_thread, throwable); ++ p2i(receiver), p2i((address)java_thread), p2i(throwable)); + // First check if thread is alive + if (receiver != NULL) { + // Check if exception is getting thrown at self (use oop equality, since the +--- ./hotspot/src/share/vm/prims/jvm.h Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvm.h Wed Jul 30 03:51:43 2014 -0700 +@@ -35,6 +35,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "jvm_windows.h" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "jvm_aix.h" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "jvm_bsd.h" + #endif +@@ -1482,6 +1485,9 @@ + JNIEXPORT jobject JNICALL + JVM_InitAgentProperties(JNIEnv *env, jobject agent_props); + ++JNIEXPORT jstring JNICALL ++JVM_GetTemporaryDirectory(JNIEnv *env); ++ + /* Generics reflection support. + * + * Returns information about the given class's EnclosingMethod +--- ./hotspot/src/share/vm/prims/jvmtiCodeBlobEvents.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvmtiCodeBlobEvents.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -26,6 +26,7 @@ + #include "code/codeBlob.hpp" + #include "code/codeCache.hpp" + #include "code/scopeDesc.hpp" ++#include "code/vtableStubs.hpp" + #include "memory/resourceArea.hpp" + #include "oops/oop.inline.hpp" + #include "prims/jvmtiCodeBlobEvents.hpp" +@@ -63,6 +64,7 @@ + // used during a collection + static GrowableArray* _global_code_blobs; + static void do_blob(CodeBlob* cb); ++ static void do_vtable_stub(VtableStub* vs); + public: + CodeBlobCollector() { + _code_blobs = NULL; +@@ -119,6 +121,10 @@ + if (cb->is_nmethod()) { + return; + } ++ // exclude VtableStubs, which are processed separately ++ if (cb->is_buffer_blob() && strcmp(cb->name(), "vtable chunks") == 0) { ++ return; ++ } + + // check if this starting address has been seen already - the + // assumption is that stubs are inserted into the list before the +@@ -136,6 +142,13 @@ + _global_code_blobs->append(scb); + } + ++// called for each VtableStub in VtableStubs ++ ++void CodeBlobCollector::do_vtable_stub(VtableStub* vs) { ++ JvmtiCodeBlobDesc* scb = new JvmtiCodeBlobDesc(vs->is_vtable_stub() ? "vtable stub" : "itable stub", ++ vs->code_begin(), vs->code_end()); ++ _global_code_blobs->append(scb); ++} + + // collects a list of CodeBlobs in the CodeCache. + // +@@ -166,6 +179,10 @@ + _global_code_blobs->append(new JvmtiCodeBlobDesc(desc->name(), desc->begin(), desc->end())); + } + ++ // Vtable stubs are not described with StubCodeDesc, ++ // process them separately ++ VtableStubs::vtable_stub_do(do_vtable_stub); ++ + // next iterate over all the non-nmethod code blobs and add them to + // the list - as noted above this will filter out duplicates and + // enclosing blobs. +--- ./hotspot/src/share/vm/prims/jvmtiEnter.xsl Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvmtiEnter.xsl Wed Jul 30 03:51:43 2014 -0700 +@@ -1,6 +1,6 @@ + + " INTPTR_FORMAT, first->top_method()->code()); ++ if (TraceCompilationPolicy) tty->print_cr(" --> " INTPTR_FORMAT, p2i(first->top_method()->code())); + } else { + if (TimeCompilationPolicy) accumulated_time()->start(); + GrowableArray* stack = new GrowableArray(50); +@@ -639,7 +644,7 @@ + if (TraceCompilationPolicy && Verbose) { + tty->print("\n\t check caller: "); + next_m->print_short_name(tty); +- tty->print(" ( interpreted " INTPTR_FORMAT ", size=%d ) ", (address)next_m(), next_m->code_size()); ++ tty->print(" ( interpreted " INTPTR_FORMAT ", size=%d ) ", p2i((address)next_m()), next_m->code_size()); + } + + current = next; +--- ./hotspot/src/share/vm/runtime/deoptimization.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/deoptimization.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -81,10 +81,15 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/ad_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/ad_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/ad_ppc_32.hpp" + #endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/ad_ppc_64.hpp" + #endif ++#endif // COMPILER2 ++ ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + bool DeoptimizationMarker::_is_active = false; + +@@ -417,15 +422,9 @@ + // frame[number_of_frames - 1 ] = on_stack_size(youngest) + // frame[number_of_frames - 2 ] = on_stack_size(sender(youngest)) + // frame[number_of_frames - 3 ] = on_stack_size(sender(sender(youngest))) +- int caller_parms = callee_parameters; +- if ((index == array->frames() - 1) && caller_was_method_handle) { +- caller_parms = 0; +- } +- frame_sizes[number_of_frames - 1 - index] = BytesPerWord * array->element(index)->on_stack_size(caller_parms, +- callee_parameters, ++ frame_sizes[number_of_frames - 1 - index] = BytesPerWord * array->element(index)->on_stack_size(callee_parameters, + callee_locals, + index == 0, +- index == array->frames() - 1, + popframe_extra_args); + // This pc doesn't have to be perfect just good enough to identify the frame + // as interpreted so the skeleton frame will be walkable +@@ -1224,9 +1223,19 @@ + load_class_by_index(constant_pool, index, THREAD); + if (HAS_PENDING_EXCEPTION) { + // Exception happened during classloading. We ignore the exception here, since it +- // is going to be rethrown since the current activation is going to be deoptimzied and ++ // is going to be rethrown since the current activation is going to be deoptimized and + // the interpreter will re-execute the bytecode. + CLEAR_PENDING_EXCEPTION; ++ // Class loading called java code which may have caused a stack ++ // overflow. If the exception was thrown right before the return ++ // to the runtime the stack is no longer guarded. Reguard the ++ // stack otherwise if we return to the uncommon trap blob and the ++ // stack bang causes a stack overflow we crash. ++ assert(THREAD->is_Java_thread(), "only a java thread can be here"); ++ JavaThread* thread = (JavaThread*)THREAD; ++ bool guard_pages_enabled = thread->stack_yellow_zone_enabled(); ++ if (!guard_pages_enabled) guard_pages_enabled = thread->reguard_stack(); ++ assert(guard_pages_enabled, "stack banging in uncommon trap blob may cause crash"); + } + } + +@@ -1275,7 +1284,8 @@ + gather_statistics(reason, action, trap_bc); + + // Ensure that we can record deopt. history: +- bool create_if_missing = ProfileTraps; ++ // Need MDO to record RTM code generation state. ++ bool create_if_missing = ProfileTraps RTM_OPT_ONLY( || UseRTMLocking ); + + MethodData* trap_mdo = + get_method_data(thread, trap_method, create_if_missing); +@@ -1476,6 +1486,7 @@ + bool maybe_prior_trap = false; + bool maybe_prior_recompile = false; + pdata = query_update_method_data(trap_mdo, trap_bci, reason, ++ nm->method(), + //outputs: + this_trap_count, + maybe_prior_trap, +@@ -1521,7 +1532,7 @@ + } + + // Go back to the compiler if there are too many traps in this method. +- if (this_trap_count >= (uint)PerMethodTrapLimit) { ++ if (this_trap_count >= per_method_trap_limit(reason)) { + // If there are too many traps in this method, force a recompile. + // This will allow the compiler to see the limit overflow, and + // take corrective action, if possible. +@@ -1555,6 +1566,17 @@ + if (tstate1 != tstate0) + pdata->set_trap_state(tstate1); + } ++ ++#if INCLUDE_RTM_OPT ++ // Restart collecting RTM locking abort statistic if the method ++ // is recompiled for a reason other than RTM state change. ++ // Assume that in new recompiled code the statistic could be different, ++ // for example, due to different inlining. ++ if ((reason != Reason_rtm_state_change) && (trap_mdo != NULL) && ++ UseRTMDeopt && (nm->rtm_state() != ProfileRTM)) { ++ trap_mdo->atomic_set_rtm_state(ProfileRTM); ++ } ++#endif + } + + if (inc_recompile_count) { +@@ -1609,6 +1631,7 @@ + Deoptimization::query_update_method_data(MethodData* trap_mdo, + int trap_bci, + Deoptimization::DeoptReason reason, ++ Method* compiled_method, + //outputs: + uint& ret_this_trap_count, + bool& ret_maybe_prior_trap, +@@ -1632,9 +1655,16 @@ + // Find the profile data for this BCI. If there isn't one, + // try to allocate one from the MDO's set of spares. + // This will let us detect a repeated trap at this point. +- pdata = trap_mdo->allocate_bci_to_data(trap_bci); ++ pdata = trap_mdo->allocate_bci_to_data(trap_bci, reason_is_speculate(reason) ? compiled_method : NULL); + + if (pdata != NULL) { ++ if (reason_is_speculate(reason) && !pdata->is_SpeculativeTrapData()) { ++ if (LogCompilation && xtty != NULL) { ++ ttyLocker ttyl; ++ // no more room for speculative traps in this MDO ++ xtty->elem("speculative_traps_oom"); ++ } ++ } + // Query the trap state of this profile datum. + int tstate0 = pdata->trap_state(); + if (!trap_state_has_reason(tstate0, per_bc_reason)) +@@ -1672,8 +1702,10 @@ + uint ignore_this_trap_count; + bool ignore_maybe_prior_trap; + bool ignore_maybe_prior_recompile; ++ assert(!reason_is_speculate(reason), "reason speculate only used by compiler"); + query_update_method_data(trap_mdo, trap_bci, + (DeoptReason)reason, ++ NULL, + ignore_this_trap_count, + ignore_maybe_prior_trap, + ignore_maybe_prior_recompile); +@@ -1801,7 +1833,9 @@ + "div0_check", + "age", + "predicate", +- "loop_limit_check" ++ "loop_limit_check", ++ "speculate_class_check", ++ "rtm_state_change" + }; + const char* Deoptimization::_trap_action_name[Action_LIMIT] = { + // Note: Keep this in sync. with enum DeoptAction. +--- ./hotspot/src/share/vm/runtime/deoptimization.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/deoptimization.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -59,6 +59,8 @@ + Reason_age, // nmethod too old; tier threshold reached + Reason_predicate, // compiler generated predicate failed + Reason_loop_limit_check, // compiler generated loop limits check failed ++ Reason_speculate_class_check, // saw unexpected object class from type speculation ++ Reason_rtm_state_change, // rtm state change detected + Reason_LIMIT, + // Note: Keep this enum in sync. with _trap_reason_name. + Reason_RECORDED_LIMIT = Reason_bimorphic // some are not recorded per bc +@@ -311,10 +313,23 @@ + return reason; + else if (reason == Reason_div0_check) // null check due to divide-by-zero? + return Reason_null_check; // recorded per BCI as a null check ++ else if (reason == Reason_speculate_class_check) ++ return Reason_class_check; + else + return Reason_none; + } + ++ static bool reason_is_speculate(int reason) { ++ if (reason == Reason_speculate_class_check) { ++ return true; ++ } ++ return false; ++ } ++ ++ static uint per_method_trap_limit(int reason) { ++ return reason_is_speculate(reason) ? (uint)PerMethodSpecTrapLimit : (uint)PerMethodTrapLimit; ++ } ++ + static const char* trap_reason_name(int reason); + static const char* trap_action_name(int action); + // Format like reason='foo' action='bar' index='123'. +@@ -337,6 +352,7 @@ + static ProfileData* query_update_method_data(MethodData* trap_mdo, + int trap_bci, + DeoptReason reason, ++ Method* compiled_method, + //outputs: + uint& ret_this_trap_count, + bool& ret_maybe_prior_trap, +--- ./hotspot/src/share/vm/runtime/fprofiler.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/fprofiler.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -41,6 +41,8 @@ + #include "runtime/vframe.hpp" + #include "utilities/macros.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // Static fields of FlatProfiler + int FlatProfiler::received_gc_ticks = 0; + int FlatProfiler::vm_operation_ticks = 0; +@@ -308,7 +310,7 @@ + st->fill_to(col2); + t->print_native(st); + st->fill_to(col3); +- st->print(msg); ++ st->print("%s", msg); + st->cr(); + } + +--- ./hotspot/src/share/vm/runtime/frame.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/frame.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -62,6 +62,8 @@ + # include "nativeInst_ppc.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + RegisterMap::RegisterMap(JavaThread *thread, bool update_map) { + _thread = thread; + _update_map = update_map; +@@ -531,13 +533,16 @@ + // Number of elements on the interpreter expression stack + // Callers should span by stackElementWords + int element_size = Interpreter::stackElementWords; ++ size_t stack_size = 0; + if (frame::interpreter_frame_expression_stack_direction() < 0) { +- return (interpreter_frame_expression_stack() - +- interpreter_frame_tos_address() + 1)/element_size; ++ stack_size = (interpreter_frame_expression_stack() - ++ interpreter_frame_tos_address() + 1)/element_size; + } else { +- return (interpreter_frame_tos_address() - +- interpreter_frame_expression_stack() + 1)/element_size; ++ stack_size = (interpreter_frame_tos_address() - ++ interpreter_frame_expression_stack() + 1)/element_size; + } ++ assert( stack_size <= (size_t)max_jint, "stack size too big"); ++ return ((jint)stack_size); + } + + +@@ -933,20 +938,9 @@ + cld_f->do_cld(m->method_holder()->class_loader_data()); + } + +-#if !defined(PPC) || defined(ZERO) +- if (m->is_native()) { +-#ifdef CC_INTERP +- interpreterState istate = get_interpreterState(); +- f->do_oop((oop*)&istate->_oop_temp); +-#else +- f->do_oop((oop*)( fp() + interpreter_frame_oop_temp_offset )); +-#endif /* CC_INTERP */ ++ if (m->is_native() PPC32_ONLY(&& m->is_static())) { ++ f->do_oop(interpreter_frame_temp_oop_addr()); + } +-#else // PPC +- if (m->is_native() && m->is_static()) { +- f->do_oop(interpreter_frame_mirror_addr()); +- } +-#endif // PPC + + int max_locals = m->is_native() ? m->size_of_parameters() : m->max_locals(); + +--- ./hotspot/src/share/vm/runtime/frame.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/frame.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -46,10 +46,13 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/adGlobals_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/adGlobals_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/adGlobals_ppc_32.hpp" + #endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/adGlobals_ppc_64.hpp" + #endif ++#endif // COMPILER2 + #ifdef ZERO + #ifdef TARGET_ARCH_zero + # include "stack_zero.hpp" +@@ -311,6 +314,9 @@ + void interpreter_frame_set_monitor_end(BasicObjectLock* value); + #endif // CC_INTERP + ++ // Address of the temp oop in the frame. Needed as GC root. ++ oop* interpreter_frame_temp_oop_addr() const; ++ + // BasicObjectLocks: + // + // interpreter_frame_monitor_begin is higher in memory than interpreter_frame_monitor_end +@@ -347,9 +353,6 @@ + void interpreter_frame_set_method(Method* method); + Method** interpreter_frame_method_addr() const; + ConstantPoolCache** interpreter_frame_cache_addr() const; +-#ifdef PPC +- oop* interpreter_frame_mirror_addr() const; +-#endif + + public: + // Entry frames +--- ./hotspot/src/share/vm/runtime/frame.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/frame.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -87,6 +87,13 @@ + return is_entry_frame() && entry_frame_is_first(); + } + ++#ifdef CC_INTERP ++inline oop* frame::interpreter_frame_temp_oop_addr() const { ++ interpreterState istate = get_interpreterState(); ++ return (oop *)&istate->_oop_temp; ++} ++#endif // CC_INTERP ++ + // here are the platform-dependent bodies: + + #ifdef TARGET_ARCH_x86 +--- ./hotspot/src/share/vm/runtime/globals.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/globals.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -31,6 +31,7 @@ + #include "utilities/ostream.hpp" + #include "utilities/macros.hpp" + #include "utilities/top.hpp" ++#include "trace/tracing.hpp" + #if INCLUDE_ALL_GCS + #include "gc_implementation/g1/g1_globals.hpp" + #endif // INCLUDE_ALL_GCS +@@ -44,6 +45,8 @@ + #include "shark/shark_globals.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + RUNTIME_FLAGS(MATERIALIZE_DEVELOPER_FLAG, MATERIALIZE_PD_DEVELOPER_FLAG, \ + MATERIALIZE_PRODUCT_FLAG, MATERIALIZE_PD_PRODUCT_FLAG, \ + MATERIALIZE_DIAGNOSTIC_FLAG, MATERIALIZE_EXPERIMENTAL_FLAG, \ +@@ -62,6 +65,14 @@ + MATERIALIZE_FLAGS_EXT + + ++static bool is_product_build() { ++#ifdef PRODUCT ++ return true; ++#else ++ return false; ++#endif ++} ++ + void Flag::check_writable() { + if (is_constant_in_binary()) { + fatal(err_msg("flag is constant: %s", _name)); +@@ -235,6 +246,27 @@ + // Get custom message for this locked flag, or return NULL if + // none is available. + void Flag::get_locked_message(char* buf, int buflen) const { ++ buf[0] = '\0'; ++ if (is_diagnostic() && !is_unlocked()) { ++ jio_snprintf(buf, buflen, "Error: VM option '%s' is diagnostic and must be enabled via -XX:+UnlockDiagnosticVMOptions.\n", ++ _name); ++ return; ++ } ++ if (is_experimental() && !is_unlocked()) { ++ jio_snprintf(buf, buflen, "Error: VM option '%s' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions.\n", ++ _name); ++ return; ++ } ++ if (is_develop() && is_product_build()) { ++ jio_snprintf(buf, buflen, "Error: VM option '%s' is develop and is available only in debug version of VM.\n", ++ _name); ++ return; ++ } ++ if (is_notproduct() && is_product_build()) { ++ jio_snprintf(buf, buflen, "Error: VM option '%s' is notproduct and is available only in debug version of VM.\n", ++ _name); ++ return; ++ } + get_locked_message_ext(buf, buflen); + } + +@@ -253,6 +285,7 @@ + // Length of format string (e.g. "%.1234s") for printing ccstr below + #define FORMAT_BUFFER_LEN 16 + ++PRAGMA_FORMAT_NONLITERAL_IGNORED_EXTERNAL + void Flag::print_on(outputStream* st, bool withComments) { + // Don't print notproduct and develop flags in a product build. + if (is_constant_in_binary()) { +@@ -285,7 +318,10 @@ + size_t llen = pointer_delta(eol, cp, sizeof(char)); + jio_snprintf(format_buffer, FORMAT_BUFFER_LEN, + "%%." SIZE_FORMAT "s", llen); ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL + st->print(format_buffer, cp); ++PRAGMA_DIAG_POP + st->cr(); + cp = eol+1; + st->print("%5s %-35s += ", "", _name); +@@ -295,7 +331,7 @@ + else st->print("%-16s", ""); + } + +- st->print("%-20"); ++ st->print("%-20s", " "); + print_kind(st); + + if (withComments) { +@@ -342,7 +378,7 @@ + } else { + st->print(" "); + } +- st->print(d.name); ++ st->print("%s", d.name); + } + } + +@@ -464,13 +500,13 @@ + } + + // Search the flag table for a named flag +-Flag* Flag::find_flag(const char* name, size_t length, bool allow_locked) { ++Flag* Flag::find_flag(const char* name, size_t length, bool allow_locked, bool return_flag) { + for (Flag* current = &flagTable[0]; current->_name != NULL; current++) { + if (str_equal(current->_name, name, length)) { + // Found a matching entry. + // Don't report notproduct and develop flags in product builds. + if (current->is_constant_in_binary()) { +- return NULL; ++ return (return_flag == true ? current : NULL); + } + // Report locked flags only if allowed. + if (!(current->is_unlocked() || current->is_unlocker())) { +@@ -564,6 +600,17 @@ + return true; + } + ++template ++static void trace_flag_changed(const char* name, const T old_value, const T new_value, const Flag::Flags origin) ++{ ++ E e; ++ e.set_name(name); ++ e.set_old_value(old_value); ++ e.set_new_value(new_value); ++ e.set_origin(origin); ++ e.commit(); ++} ++ + bool CommandLineFlags::boolAt(char* name, size_t len, bool* value) { + Flag* result = Flag::find_flag(name, len); + if (result == NULL) return false; +@@ -577,6 +624,7 @@ + if (result == NULL) return false; + if (!result->is_bool()) return false; + bool old_value = result->get_bool(); ++ trace_flag_changed(name, old_value, *value, origin); + result->set_bool(*value); + *value = old_value; + result->set_origin(origin); +@@ -586,6 +634,7 @@ + void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, Flag::Flags origin) { + Flag* faddr = address_of_flag(flag); + guarantee(faddr != NULL && faddr->is_bool(), "wrong flag type"); ++ trace_flag_changed(faddr->_name, faddr->get_bool(), value, origin); + faddr->set_bool(value); + faddr->set_origin(origin); + } +@@ -603,6 +652,7 @@ + if (result == NULL) return false; + if (!result->is_intx()) return false; + intx old_value = result->get_intx(); ++ trace_flag_changed(name, old_value, *value, origin); + result->set_intx(*value); + *value = old_value; + result->set_origin(origin); +@@ -612,6 +662,7 @@ + void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, Flag::Flags origin) { + Flag* faddr = address_of_flag(flag); + guarantee(faddr != NULL && faddr->is_intx(), "wrong flag type"); ++ trace_flag_changed(faddr->_name, faddr->get_intx(), value, origin); + faddr->set_intx(value); + faddr->set_origin(origin); + } +@@ -629,6 +680,7 @@ + if (result == NULL) return false; + if (!result->is_uintx()) return false; + uintx old_value = result->get_uintx(); ++ trace_flag_changed(name, old_value, *value, origin); + result->set_uintx(*value); + *value = old_value; + result->set_origin(origin); +@@ -638,6 +690,7 @@ + void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, Flag::Flags origin) { + Flag* faddr = address_of_flag(flag); + guarantee(faddr != NULL && faddr->is_uintx(), "wrong flag type"); ++ trace_flag_changed(faddr->_name, faddr->get_uintx(), value, origin); + faddr->set_uintx(value); + faddr->set_origin(origin); + } +@@ -655,6 +708,7 @@ + if (result == NULL) return false; + if (!result->is_uint64_t()) return false; + uint64_t old_value = result->get_uint64_t(); ++ trace_flag_changed(name, old_value, *value, origin); + result->set_uint64_t(*value); + *value = old_value; + result->set_origin(origin); +@@ -664,6 +718,7 @@ + void CommandLineFlagsEx::uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, Flag::Flags origin) { + Flag* faddr = address_of_flag(flag); + guarantee(faddr != NULL && faddr->is_uint64_t(), "wrong flag type"); ++ trace_flag_changed(faddr->_name, faddr->get_uint64_t(), value, origin); + faddr->set_uint64_t(value); + faddr->set_origin(origin); + } +@@ -681,6 +736,7 @@ + if (result == NULL) return false; + if (!result->is_double()) return false; + double old_value = result->get_double(); ++ trace_flag_changed(name, old_value, *value, origin); + result->set_double(*value); + *value = old_value; + result->set_origin(origin); +@@ -690,6 +746,7 @@ + void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value, Flag::Flags origin) { + Flag* faddr = address_of_flag(flag); + guarantee(faddr != NULL && faddr->is_double(), "wrong flag type"); ++ trace_flag_changed(faddr->_name, faddr->get_double(), value, origin); + faddr->set_double(value); + faddr->set_origin(origin); + } +@@ -709,6 +766,7 @@ + if (result == NULL) return false; + if (!result->is_ccstr()) return false; + ccstr old_value = result->get_ccstr(); ++ trace_flag_changed(name, old_value, *value, origin); + char* new_value = NULL; + if (*value != NULL) { + new_value = NEW_C_HEAP_ARRAY(char, strlen(*value)+1, mtInternal); +@@ -731,6 +789,7 @@ + Flag* faddr = address_of_flag(flag); + guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type"); + ccstr old_value = faddr->get_ccstr(); ++ trace_flag_changed(faddr->_name, old_value, value, origin); + char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1, mtInternal); + strcpy(new_value, value); + faddr->set_ccstr(new_value); +--- ./hotspot/src/share/vm/runtime/globals.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/globals.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -61,6 +61,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "globals_windows.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "globals_aix.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "globals_bsd.hpp" + #endif +@@ -88,6 +91,9 @@ + #ifdef TARGET_OS_ARCH_linux_ppc + # include "globals_linux_ppc.hpp" + #endif ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "globals_aix_ppc.hpp" ++#endif + #ifdef TARGET_OS_ARCH_bsd_x86 + # include "globals_bsd_x86.hpp" + #endif +@@ -116,6 +122,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "c1_globals_windows.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "c1_globals_aix.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "c1_globals_bsd.hpp" + #endif +@@ -130,6 +139,9 @@ + #ifdef TARGET_ARCH_arm + # include "c2_globals_arm.hpp" + #endif ++#ifdef TARGET_ARCH_ppc ++# include "c2_globals_ppc.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_linux + # include "c2_globals_linux.hpp" + #endif +@@ -139,6 +151,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "c2_globals_windows.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "c2_globals_aix.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "c2_globals_bsd.hpp" + #endif +@@ -167,7 +182,6 @@ + define_pd_global(intx, OnStackReplacePercentage, 0); + define_pd_global(bool, ResizeTLAB, false); + define_pd_global(intx, FreqInlineSize, 0); +-define_pd_global(intx, InlineSmallCode, 0); + define_pd_global(intx, NewSizeThreadIncrease, 4*K); + define_pd_global(intx, InlineClassNatives, true); + define_pd_global(intx, InlineUnsafeOps, true); +@@ -241,7 +255,7 @@ + // number of flags + static size_t numFlags; + +- static Flag* find_flag(const char* name, size_t length, bool allow_locked = false); ++ static Flag* find_flag(const char* name, size_t length, bool allow_locked = false, bool return_flag = false); + static Flag* fuzzy_match(const char* name, size_t length, bool allow_locked = false); + + void check_writable(); +@@ -509,13 +523,6 @@ + product_pd(bool, UseMembar, \ + "(Unstable) Issues membars on thread state transitions") \ + \ +- /* Temp PPC Flag to allow disabling the use of lwsync on ppc platforms \ +- * that don't support it. This will be replaced by processor detection \ +- * logic. \ +- */ \ +- product(bool, UsePPCLWSYNC, true, \ +- "Use lwsync instruction if true, else use slower sync") \ +- \ + develop(bool, CleanChunkPoolAsync, falseInEmbedded, \ + "Clean the chunk pool asynchronously") \ + \ +@@ -1258,6 +1265,9 @@ + develop(bool, TraceJNICalls, false, \ + "Trace JNI calls") \ + \ ++ develop(bool, StressRewriter, false, \ ++ "Stress linktime bytecode rewriting") \ ++ \ + notproduct(bool, TraceJVMCalls, false, \ + "Trace JVM calls") \ + \ +@@ -2405,9 +2415,9 @@ + "Number of gclog files in rotation " \ + "(default: 0, no rotation)") \ + \ +- product(uintx, GCLogFileSize, 0, \ +- "GC log file size (default: 0 bytes, no rotation). " \ +- "It requires UseGCLogFileRotation") \ ++ product(uintx, GCLogFileSize, 8*K, \ ++ "GC log file size, requires UseGCLogFileRotation. " \ ++ "Set to 0 to only trigger rotation via jcmd") \ + \ + /* JVMTI heap profiling */ \ + \ +@@ -2486,6 +2496,12 @@ + develop_pd(bool, ImplicitNullChecks, \ + "Generate code for implicit null checks") \ + \ ++ product_pd(bool, TrapBasedNullChecks, \ ++ "Generate code for null checks that uses a cmp and trap " \ ++ "instruction raising SIGTRAP. This is only used if an access to" \ ++ "null (+offset) will not raise a SIGSEGV, i.e.," \ ++ "ImplicitNullChecks don't work (PPC64).") \ ++ \ + product(bool, PrintSafepointStatistics, false, \ + "Print statistics about safepoint synchronization") \ + \ +@@ -2531,6 +2547,9 @@ + develop(bool, PrintMethodFlushing, false, \ + "Print the nmethods being flushed") \ + \ ++ diagnostic(bool, PrintMethodFlushingStatistics, false, \ ++ "print statistics about method flushing") \ ++ \ + develop(bool, UseRelocIndex, false, \ + "Use an index to speed random access to relocations") \ + \ +@@ -2793,6 +2812,11 @@ + product_pd(bool, ProfileInterpreter, \ + "Profile at the bytecode level during interpretation") \ + \ ++ develop(bool, TraceProfileInterpreter, false, \ ++ "Trace profiling at the bytecode level during interpretation. " \ ++ "This outputs the profiling information collected to improve " \ ++ "jit compilation.") \ ++ \ + develop_pd(bool, ProfileTraps, \ + "Profile deoptimization traps at the bytecode level") \ + \ +@@ -2955,7 +2979,8 @@ + "maximum number of nested recursive calls that are inlined") \ + \ + develop(intx, MaxForceInlineLevel, 100, \ +- "maximum number of nested @ForceInline calls that are inlined") \ ++ "maximum number of nested calls that are forced for inlining " \ ++ "(using CompilerOracle or marked w/ @ForceInline)") \ + \ + product_pd(intx, InlineSmallCode, \ + "Only inline already compiled methods if their code size is " \ +@@ -3049,9 +3074,15 @@ + product(intx, PerMethodTrapLimit, 100, \ + "Limit on traps (of one kind) in a method (includes inlines)") \ + \ ++ experimental(intx, PerMethodSpecTrapLimit, 5000, \ ++ "Limit on speculative traps (of one kind) in a method (includes inlines)") \ ++ \ + product(intx, PerBytecodeTrapLimit, 4, \ + "Limit on traps (of one kind) at a particular BCI") \ + \ ++ experimental(intx, SpecTrapLimitExtraEntries, 3, \ ++ "Extra method data trap entries for speculation") \ ++ \ + develop(intx, InlineFrequencyRatio, 20, \ + "Ratio of call site execution to caller method invocation") \ + \ +@@ -3130,15 +3161,15 @@ + "Maximum size of class area in Metaspace when compressed " \ + "class pointers are used") \ + \ +- product(uintx, MinHeapFreeRatio, 40, \ ++ manageable(uintx, MinHeapFreeRatio, 40, \ + "The minimum percentage of heap free after GC to avoid expansion."\ +- " For most GCs this applies to the old generation. In G1 it" \ +- " applies to the whole heap. Not supported by ParallelGC.") \ +- \ +- product(uintx, MaxHeapFreeRatio, 70, \ ++ " For most GCs this applies to the old generation. In G1 and" \ ++ " ParallelGC it applies to the whole heap.") \ ++ \ ++ manageable(uintx, MaxHeapFreeRatio, 70, \ + "The maximum percentage of heap free after GC to avoid shrinking."\ +- " For most GCs this applies to the old generation. In G1 it" \ +- " applies to the whole heap. Not supported by ParallelGC.") \ ++ " For most GCs this applies to the old generation. In G1 and" \ ++ " ParallelGC it applies to the whole heap.") \ + \ + product(intx, SoftRefLRUPolicyMSPerMB, 1000, \ + "Number of milliseconds per MB of free space in the heap") \ +@@ -3257,7 +3288,8 @@ + "disable this feature") \ + \ + /* code cache parameters */ \ +- develop(uintx, CodeCacheSegmentSize, 64, \ ++ /* ppc64 has large code-entry alignment. */ \ ++ develop(uintx, CodeCacheSegmentSize, 64 PPC64_ONLY(+64), \ + "Code cache segment size (in bytes) - smallest unit of " \ + "allocation") \ + \ +@@ -3306,21 +3338,21 @@ + develop(intx, CIStart, 0, \ + "The id of the first compilation to permit") \ + \ +- develop(intx, CIStop, -1, \ ++ develop(intx, CIStop, max_jint, \ + "The id of the last compilation to permit") \ + \ +- develop(intx, CIStartOSR, 0, \ ++ develop(intx, CIStartOSR, 0, \ + "The id of the first osr compilation to permit " \ + "(CICountOSR must be on)") \ + \ +- develop(intx, CIStopOSR, -1, \ ++ develop(intx, CIStopOSR, max_jint, \ + "The id of the last osr compilation to permit " \ + "(CICountOSR must be on)") \ + \ +- develop(intx, CIBreakAtOSR, -1, \ ++ develop(intx, CIBreakAtOSR, -1, \ + "The id of osr compilation to break at") \ + \ +- develop(intx, CIBreakAt, -1, \ ++ develop(intx, CIBreakAt, -1, \ + "The id of compilation to break at") \ + \ + product(ccstrlist, CompileOnly, "", \ +@@ -3339,6 +3371,10 @@ + "File containing compilation replay information" \ + "[default: ./replay_pid%p.log] (%p replaced with pid)") \ + \ ++ product(ccstr, InlineDataFile, NULL, \ ++ "File containing inlining replay information" \ ++ "[default: ./inline_pid%p.log] (%p replaced with pid)") \ ++ \ + develop(intx, ReplaySuppressInitializers, 2, \ + "Control handling of class initialization during replay: " \ + "0 - don't do anything special; " \ +@@ -3755,8 +3791,8 @@ + experimental(bool, TrustFinalNonStaticFields, false, \ + "trust final non-static declarations for constant folding") \ + \ +- experimental(bool, FoldStableValues, false, \ +- "Private flag to control optimizations for stable variables") \ ++ diagnostic(bool, FoldStableValues, true, \ ++ "Optimize loads from stable fields (marked w/ @Stable)") \ + \ + develop(bool, TraceInvokeDynamic, false, \ + "trace internal invoke dynamic operations") \ +@@ -3796,6 +3832,22 @@ + experimental(uintx, SymbolTableSize, defaultSymbolTableSize, \ + "Number of buckets in the JVM internal Symbol table") \ + \ ++ product(bool, UseStringDeduplication, false, \ ++ "Use string deduplication") \ ++ \ ++ product(bool, PrintStringDeduplicationStatistics, false, \ ++ "Print string deduplication statistics") \ ++ \ ++ product(uintx, StringDeduplicationAgeThreshold, 3, \ ++ "A string must reach this age (or be promoted to an old region) " \ ++ "to be considered for deduplication") \ ++ \ ++ diagnostic(bool, StringDeduplicationResizeALot, false, \ ++ "Force table resize every time the table is scanned") \ ++ \ ++ diagnostic(bool, StringDeduplicationRehashALot, false, \ ++ "Force table rehash every time the table is scanned") \ ++ \ + develop(bool, TraceDefaultMethods, false, \ + "Trace the default method processing steps") \ + \ +--- ./hotspot/src/share/vm/runtime/handles.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/handles.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -41,6 +41,8 @@ + # include "os_bsd.inline.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #ifdef ASSERT + oop* HandleArea::allocate_handle(oop obj) { + assert(_handle_mark_nesting > 1, "memory leak: allocating handle outside HandleMark"); +--- ./hotspot/src/share/vm/runtime/interfaceSupport.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/interfaceSupport.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2011, 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 +@@ -34,6 +34,7 @@ + #include "runtime/vframe.hpp" + #include "utilities/preserveException.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + // Implementation of InterfaceSupport + +--- ./hotspot/src/share/vm/runtime/interfaceSupport.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/interfaceSupport.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -107,6 +107,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "interfaceSupport_windows.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "interfaceSupport_aix.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "interfaceSupport_bsd.hpp" + #endif +--- ./hotspot/src/share/vm/runtime/java.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/java.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -52,6 +52,7 @@ + #include "runtime/memprofiler.hpp" + #include "runtime/sharedRuntime.hpp" + #include "runtime/statSampler.hpp" ++#include "runtime/sweeper.hpp" + #include "runtime/task.hpp" + #include "runtime/thread.inline.hpp" + #include "runtime/timer.hpp" +@@ -112,6 +113,7 @@ + } + } + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + GrowableArray* collected_profiled_methods; + +@@ -217,9 +219,7 @@ + + + // General statistics printing (profiling ...) +- + void print_statistics() { +- + #ifdef ASSERT + + if (CountRuntimeCalls) { +@@ -269,7 +269,7 @@ + os::print_statistics(); + } + +- if (PrintLockStatistics || PrintPreciseBiasedLockingStatistics) { ++ if (PrintLockStatistics || PrintPreciseBiasedLockingStatistics || PrintPreciseRTMLockingStatistics) { + OptoRuntime::print_named_counters(); + } + +@@ -315,6 +315,10 @@ + CodeCache::print(); + } + ++ if (PrintMethodFlushingStatistics) { ++ NMethodSweeper::print(); ++ } ++ + if (PrintCodeCache2) { + MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); + CodeCache::print_internals(); +@@ -364,7 +368,7 @@ + BaselineTTYOutputer outputer(tty); + MemTracker::print_memory_usage(outputer, K, false); + } else { +- tty->print_cr(MemTracker::reason()); ++ tty->print_cr("%s", MemTracker::reason()); + } + } + } +@@ -382,8 +386,12 @@ + CodeCache::print(); + } + ++ if (PrintMethodFlushingStatistics) { ++ NMethodSweeper::print(); ++ } ++ + #ifdef COMPILER2 +- if (PrintPreciseBiasedLockingStatistics) { ++ if (PrintPreciseBiasedLockingStatistics || PrintPreciseRTMLockingStatistics) { + OptoRuntime::print_named_counters(); + } + #endif +@@ -397,7 +405,7 @@ + BaselineTTYOutputer outputer(tty); + MemTracker::print_memory_usage(outputer, K, false); + } else { +- tty->print_cr(MemTracker::reason()); ++ tty->print_cr("%s", MemTracker::reason()); + } + } + } +@@ -503,10 +511,8 @@ + StatSampler::disengage(); + StatSampler::destroy(); + +- // We do not need to explicitly stop concurrent GC threads because the +- // JVM will be taken down at a safepoint when such threads are inactive -- +- // except for some concurrent G1 threads, see (comment in) +- // Threads::destroy_vm(). ++ // Stop concurrent GC threads ++ Universe::heap()->stop(); + + // Print GC/heap related information. + if (PrintGCDetails) { +--- ./hotspot/src/share/vm/runtime/javaFrameAnchor.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/javaFrameAnchor.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -50,6 +50,9 @@ + #ifdef TARGET_OS_ARCH_linux_ppc + # include "orderAccess_linux_ppc.inline.hpp" + #endif ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "orderAccess_aix_ppc.inline.hpp" ++#endif + #ifdef TARGET_OS_ARCH_bsd_x86 + # include "orderAccess_bsd_x86.inline.hpp" + #endif +--- ./hotspot/src/share/vm/runtime/jniHandles.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/jniHandles.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -30,6 +30,7 @@ + #include "runtime/mutexLocker.hpp" + #include "runtime/thread.inline.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + JNIHandleBlock* JNIHandles::_global_handles = NULL; + JNIHandleBlock* JNIHandles::_weak_global_handles = NULL; +--- ./hotspot/src/share/vm/runtime/mutex.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/mutex.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,6 +1,6 @@ + + /* +- * 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 +@@ -41,6 +41,8 @@ + # include "mutex_bsd.inline.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o + // + // Native Monitor-Mutex locking - theory of operations +--- ./hotspot/src/share/vm/runtime/mutexLocker.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/mutexLocker.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -58,6 +58,8 @@ + Mutex* VtableStubs_lock = NULL; + Mutex* SymbolTable_lock = NULL; + Mutex* StringTable_lock = NULL; ++Monitor* StringDedupQueue_lock = NULL; ++Mutex* StringDedupTable_lock = NULL; + Mutex* CodeCache_lock = NULL; + Mutex* MethodData_lock = NULL; + Mutex* RetData_lock = NULL; +@@ -196,6 +198,9 @@ + def(MMUTracker_lock , Mutex , leaf , true ); + def(HotCardCache_lock , Mutex , special , true ); + def(EvacFailureStack_lock , Mutex , nonleaf , true ); ++ ++ def(StringDedupQueue_lock , Monitor, leaf, true ); ++ def(StringDedupTable_lock , Mutex , leaf, true ); + } + def(ParGCRareEvent_lock , Mutex , leaf , true ); + def(DerivedPointerTableGC_lock , Mutex, leaf, true ); +--- ./hotspot/src/share/vm/runtime/mutexLocker.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/mutexLocker.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -36,6 +36,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +@@ -63,6 +66,8 @@ + extern Mutex* VtableStubs_lock; // a lock on the VtableStubs + extern Mutex* SymbolTable_lock; // a lock on the symbol table + extern Mutex* StringTable_lock; // a lock on the interned string table ++extern Monitor* StringDedupQueue_lock; // a lock on the string deduplication queue ++extern Mutex* StringDedupTable_lock; // a lock on the string deduplication table + extern Mutex* CodeCache_lock; // a lock on the CodeCache, rank is special, use MutexLockerEx + extern Mutex* MethodData_lock; // a lock on installation of method data + extern Mutex* RetData_lock; // a lock on installation of RetData inside method data +--- ./hotspot/src/share/vm/runtime/objectMonitor.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/objectMonitor.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -54,7 +54,7 @@ + # include "os_bsd.inline.hpp" + #endif + +-#if defined(__GNUC__) && !defined(IA64) ++#if defined(__GNUC__) && !defined(IA64) && !defined(PPC64) + // Need to inhibit inlining for older versions of GCC to avoid build-time failures + #define ATTR __attribute__((noinline)) + #else +@@ -382,6 +382,12 @@ + DTRACE_MONITOR_PROBE(contended__enter, this, object(), jt); + if (JvmtiExport::should_post_monitor_contended_enter()) { + JvmtiExport::post_monitor_contended_enter(jt, this); ++ ++ // The current thread does not yet own the monitor and does not ++ // yet appear on any queues that would get it made the successor. ++ // This means that the JVMTI_EVENT_MONITOR_CONTENDED_ENTER event ++ // handler cannot accidentally consume an unpark() meant for the ++ // ParkEvent associated with this ObjectMonitor. + } + + OSThreadContendState osts(Self->osthread()); +@@ -412,6 +418,15 @@ + jt->java_suspend_self(); + } + Self->set_current_pending_monitor(NULL); ++ ++ // We cleared the pending monitor info since we've just gotten past ++ // the enter-check-for-suspend dance and we now own the monitor free ++ // and clear, i.e., it is no longer pending. The ThreadBlockInVM ++ // destructor can go to a safepoint at the end of this block. If we ++ // do a thread dump during that safepoint, then this thread will show ++ // as having "-locked" the monitor, but the OS and java.lang.Thread ++ // states will still report that the thread is blocked trying to ++ // acquire it. + } + + Atomic::dec_ptr(&_count); +@@ -439,6 +454,12 @@ + DTRACE_MONITOR_PROBE(contended__entered, this, object(), jt); + if (JvmtiExport::should_post_monitor_contended_entered()) { + JvmtiExport::post_monitor_contended_entered(jt, this); ++ ++ // The current thread already owns the monitor and is not going to ++ // call park() for the remainder of the monitor enter protocol. So ++ // it doesn't matter if the JVMTI_EVENT_MONITOR_CONTENDED_ENTERED ++ // event handler consumed an unpark() issued by the thread that ++ // just exited the monitor. + } + + if (event.should_commit()) { +@@ -1456,6 +1477,14 @@ + // Note: 'false' parameter is passed here because the + // wait was not timed out due to thread interrupt. + JvmtiExport::post_monitor_waited(jt, this, false); ++ ++ // In this short circuit of the monitor wait protocol, the ++ // current thread never drops ownership of the monitor and ++ // never gets added to the wait queue so the current thread ++ // cannot be made the successor. This means that the ++ // JVMTI_EVENT_MONITOR_WAITED event handler cannot accidentally ++ // consume an unpark() meant for the ParkEvent associated with ++ // this ObjectMonitor. + } + if (event.should_commit()) { + post_monitor_wait_event(&event, 0, millis, false); +@@ -1499,21 +1528,6 @@ + exit (true, Self) ; // exit the monitor + guarantee (_owner != Self, "invariant") ; + +- // As soon as the ObjectMonitor's ownership is dropped in the exit() +- // call above, another thread can enter() the ObjectMonitor, do the +- // notify(), and exit() the ObjectMonitor. If the other thread's +- // exit() call chooses this thread as the successor and the unpark() +- // call happens to occur while this thread is posting a +- // MONITOR_CONTENDED_EXIT event, then we run the risk of the event +- // handler using RawMonitors and consuming the unpark(). +- // +- // To avoid the problem, we re-post the event. This does no harm +- // even if the original unpark() was not consumed because we are the +- // chosen successor for this monitor. +- if (node._notified != 0 && _succ == Self) { +- node._event->unpark(); +- } +- + // The thread is on the WaitSet list - now park() it. + // On MP systems it's conceivable that a brief spin before we park + // could be profitable. +@@ -1595,6 +1609,25 @@ + // post monitor waited event. Note that this is past-tense, we are done waiting. + if (JvmtiExport::should_post_monitor_waited()) { + JvmtiExport::post_monitor_waited(jt, this, ret == OS_TIMEOUT); ++ ++ if (node._notified != 0 && _succ == Self) { ++ // In this part of the monitor wait-notify-reenter protocol it ++ // is possible (and normal) for another thread to do a fastpath ++ // monitor enter-exit while this thread is still trying to get ++ // to the reenter portion of the protocol. ++ // ++ // The ObjectMonitor was notified and the current thread is ++ // the successor which also means that an unpark() has already ++ // been done. The JVMTI_EVENT_MONITOR_WAITED event handler can ++ // consume the unpark() that was done when the successor was ++ // set because the same ParkEvent is shared between Java ++ // monitors and JVM/TI RawMonitors (for now). ++ // ++ // We redo the unpark() to ensure forward progress, i.e., we ++ // don't want all pending threads hanging (parked) with none ++ // entering the unlocked monitor. ++ node._event->unpark(); ++ } + } + + if (event.should_commit()) { +--- ./hotspot/src/share/vm/runtime/os.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/os.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -65,6 +65,8 @@ + + # include + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + OSThread* os::_starting_thread = NULL; + address os::_polling_page = NULL; + volatile int32_t* os::_mem_serialize_page = NULL; +@@ -909,9 +911,9 @@ + + for (int i = 0; env_list[i] != NULL; i++) { + if (getenv(env_list[i], buffer, len)) { +- st->print(env_list[i]); ++ st->print("%s", env_list[i]); + st->print("="); +- st->print_cr(buffer); ++ st->print_cr("%s", buffer); + } + } + } +@@ -929,6 +931,10 @@ + } + + void os::print_date_and_time(outputStream *st) { ++ const int secs_per_day = 86400; ++ const int secs_per_hour = 3600; ++ const int secs_per_min = 60; ++ + time_t tloc; + (void)time(&tloc); + st->print("time: %s", ctime(&tloc)); // ctime adds newline. +@@ -937,7 +943,17 @@ + // NOTE: It tends to crash after a SEGV if we want to printf("%f",...) in + // Linux. Must be a bug in glibc ? Workaround is to round "t" to int + // before printf. We lost some precision, but who cares? +- st->print_cr("elapsed time: %d seconds", (int)t); ++ int eltime = (int)t; // elapsed time in seconds ++ ++ // print elapsed time in a human-readable format: ++ int eldays = eltime / secs_per_day; ++ int day_secs = eldays * secs_per_day; ++ int elhours = (eltime - day_secs) / secs_per_hour; ++ int hour_secs = elhours * secs_per_hour; ++ int elmins = (eltime - day_secs - hour_secs) / secs_per_min; ++ int minute_secs = elmins * secs_per_min; ++ int elsecs = (eltime - day_secs - hour_secs - minute_secs); ++ st->print_cr("elapsed time: %d seconds (%dd %dh %dm %ds)", eltime, eldays, elhours, elmins, elsecs); + } + + // moved from debug.cpp (used to be find()) but still called from there +@@ -1081,15 +1097,17 @@ + + } + +-#ifndef PRODUCT +- // Check if in metaspace. +- if (ClassLoaderDataGraph::contains((address)addr)) { +- // Use addr->print() from the debugger instead (not here) +- st->print_cr(INTPTR_FORMAT +- " is pointing into metadata", addr); ++ // Check if in metaspace and print types that have vptrs (only method now) ++ if (Metaspace::contains(addr)) { ++ if (Method::has_method_vptr((const void*)addr)) { ++ ((Method*)addr)->print_value_on(st); ++ st->cr(); ++ } else { ++ // Use addr->print() from the debugger instead (not here) ++ st->print_cr(INTPTR_FORMAT " is pointing into metadata", addr); ++ } + return; + } +-#endif + + // Try an OS specific find + if (os::find(addr, st)) { +@@ -1103,7 +1121,7 @@ + // if C stack is walkable beyond current frame. The check for fp() is not + // necessary on Sparc, but it's harmless. + bool os::is_first_C_frame(frame* fr) { +-#if defined(IA64) && !defined(_WIN32) ++#if (defined(IA64) && !defined(AIX)) && !defined(_WIN32) + // On IA64 we have to check if the callers bsp is still valid + // (i.e. within the register stack bounds). + // Notice: this only works for threads created by the VM and only if +--- ./hotspot/src/share/vm/runtime/os.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/os.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -41,9 +41,16 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "jvm_windows.h" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "jvm_aix.h" ++# include ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "jvm_bsd.h" + # include ++# ifdef __APPLE__ ++# include ++# endif + #endif + + class AgentLibrary; +@@ -430,7 +437,10 @@ + static intx current_thread_id(); + static int current_process_id(); + static int sleep(Thread* thread, jlong ms, bool interruptable); +- static int naked_sleep(); ++ // Short standalone OS sleep suitable for slow path spin loop. ++ // Ignores Thread.interrupt() (so keep it short). ++ // ms = 0, will sleep for the least amount of time allowed by the OS. ++ static void naked_short_sleep(jlong ms); + static void infinite_sleep(); // never returns, use with CAUTION + static void yield(); // Yields to all threads with same priority + enum YieldResult { +@@ -766,6 +776,10 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.hpp" ++# include "os_posix.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_posix.hpp" + # include "os_bsd.hpp" +@@ -794,6 +808,9 @@ + #ifdef TARGET_OS_ARCH_linux_ppc + # include "os_linux_ppc.hpp" + #endif ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "os_aix_ppc.hpp" ++#endif + #ifdef TARGET_OS_ARCH_bsd_x86 + # include "os_bsd_x86.hpp" + #endif +--- ./hotspot/src/share/vm/runtime/osThread.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/osThread.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2010, 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 +@@ -26,6 +26,7 @@ + #include "oops/oop.inline.hpp" + #include "runtime/osThread.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + OSThread::OSThread(OSThreadStartFunc start_proc, void* start_parm) { + pd_initialize(); +--- ./hotspot/src/share/vm/runtime/osThread.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/osThread.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -105,6 +105,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "osThread_windows.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "osThread_aix.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "osThread_bsd.hpp" + #endif +--- ./hotspot/src/share/vm/runtime/park.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/park.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -59,58 +59,22 @@ + + // Start by trying to recycle an existing but unassociated + // ParkEvent from the global free list. +- for (;;) { +- ev = FreeList ; +- if (ev == NULL) break ; +- // 1: Detach - sequester or privatize the list +- // Tantamount to ev = Swap (&FreeList, NULL) +- if (Atomic::cmpxchg_ptr (NULL, &FreeList, ev) != ev) { +- continue ; ++ // Using a spin lock since we are part of the mutex impl. ++ // 8028280: using concurrent free list without memory management can leak ++ // pretty badly it turns out. ++ Thread::SpinAcquire(&ListLock, "ParkEventFreeListAllocate"); ++ { ++ ev = FreeList; ++ if (ev != NULL) { ++ FreeList = ev->FreeNext; + } +- +- // We've detached the list. The list in-hand is now +- // local to this thread. This thread can operate on the +- // list without risk of interference from other threads. +- // 2: Extract -- pop the 1st element from the list. +- ParkEvent * List = ev->FreeNext ; +- if (List == NULL) break ; +- for (;;) { +- // 3: Try to reattach the residual list +- guarantee (List != NULL, "invariant") ; +- ParkEvent * Arv = (ParkEvent *) Atomic::cmpxchg_ptr (List, &FreeList, NULL) ; +- if (Arv == NULL) break ; +- +- // New nodes arrived. Try to detach the recent arrivals. +- if (Atomic::cmpxchg_ptr (NULL, &FreeList, Arv) != Arv) { +- continue ; +- } +- guarantee (Arv != NULL, "invariant") ; +- // 4: Merge Arv into List +- ParkEvent * Tail = List ; +- while (Tail->FreeNext != NULL) Tail = Tail->FreeNext ; +- Tail->FreeNext = Arv ; +- } +- break ; + } ++ Thread::SpinRelease(&ListLock); + + if (ev != NULL) { + guarantee (ev->AssociatedWith == NULL, "invariant") ; + } else { + // Do this the hard way -- materialize a new ParkEvent. +- // In rare cases an allocating thread might detach a long list -- +- // installing null into FreeList -- and then stall or be obstructed. +- // A 2nd thread calling Allocate() would see FreeList == null. +- // The list held privately by the 1st thread is unavailable to the 2nd thread. +- // In that case the 2nd thread would have to materialize a new ParkEvent, +- // even though free ParkEvents existed in the system. In this case we end up +- // with more ParkEvents in circulation than we need, but the race is +- // rare and the outcome is benign. Ideally, the # of extant ParkEvents +- // is equal to the maximum # of threads that existed at any one time. +- // Because of the race mentioned above, segments of the freelist +- // can be transiently inaccessible. At worst we may end up with the +- // # of ParkEvents in circulation slightly above the ideal. +- // Note that if we didn't have the TSM/immortal constraint, then +- // when reattaching, above, we could trim the list. + ev = new ParkEvent () ; + guarantee ((intptr_t(ev) & 0xFF) == 0, "invariant") ; + } +@@ -124,13 +88,14 @@ + if (ev == NULL) return ; + guarantee (ev->FreeNext == NULL , "invariant") ; + ev->AssociatedWith = NULL ; +- for (;;) { +- // Push ev onto FreeList +- // The mechanism is "half" lock-free. +- ParkEvent * List = FreeList ; +- ev->FreeNext = List ; +- if (Atomic::cmpxchg_ptr (ev, &FreeList, List) == List) break ; ++ // Note that if we didn't have the TSM/immortal constraint, then ++ // when reattaching we could trim the list. ++ Thread::SpinAcquire(&ListLock, "ParkEventFreeListRelease"); ++ { ++ ev->FreeNext = FreeList; ++ FreeList = ev; + } ++ Thread::SpinRelease(&ListLock); + } + + // Override operator new and delete so we can ensure that the +@@ -164,56 +129,21 @@ + + // Start by trying to recycle an existing but unassociated + // Parker from the global free list. +- for (;;) { +- p = FreeList ; +- if (p == NULL) break ; +- // 1: Detach +- // Tantamount to p = Swap (&FreeList, NULL) +- if (Atomic::cmpxchg_ptr (NULL, &FreeList, p) != p) { +- continue ; ++ // 8028280: using concurrent free list without memory management can leak ++ // pretty badly it turns out. ++ Thread::SpinAcquire(&ListLock, "ParkerFreeListAllocate"); ++ { ++ p = FreeList; ++ if (p != NULL) { ++ FreeList = p->FreeNext; + } +- +- // We've detached the list. The list in-hand is now +- // local to this thread. This thread can operate on the +- // list without risk of interference from other threads. +- // 2: Extract -- pop the 1st element from the list. +- Parker * List = p->FreeNext ; +- if (List == NULL) break ; +- for (;;) { +- // 3: Try to reattach the residual list +- guarantee (List != NULL, "invariant") ; +- Parker * Arv = (Parker *) Atomic::cmpxchg_ptr (List, &FreeList, NULL) ; +- if (Arv == NULL) break ; +- +- // New nodes arrived. Try to detach the recent arrivals. +- if (Atomic::cmpxchg_ptr (NULL, &FreeList, Arv) != Arv) { +- continue ; +- } +- guarantee (Arv != NULL, "invariant") ; +- // 4: Merge Arv into List +- Parker * Tail = List ; +- while (Tail->FreeNext != NULL) Tail = Tail->FreeNext ; +- Tail->FreeNext = Arv ; +- } +- break ; + } ++ Thread::SpinRelease(&ListLock); + + if (p != NULL) { + guarantee (p->AssociatedWith == NULL, "invariant") ; + } else { + // Do this the hard way -- materialize a new Parker.. +- // In rare cases an allocating thread might detach +- // a long list -- installing null into FreeList --and +- // then stall. Another thread calling Allocate() would see +- // FreeList == null and then invoke the ctor. In this case we +- // end up with more Parkers in circulation than we need, but +- // the race is rare and the outcome is benign. +- // Ideally, the # of extant Parkers is equal to the +- // maximum # of threads that existed at any one time. +- // Because of the race mentioned above, segments of the +- // freelist can be transiently inaccessible. At worst +- // we may end up with the # of Parkers in circulation +- // slightly above the ideal. + p = new Parker() ; + } + p->AssociatedWith = t ; // Associate p with t +@@ -227,11 +157,12 @@ + guarantee (p->AssociatedWith != NULL, "invariant") ; + guarantee (p->FreeNext == NULL , "invariant") ; + p->AssociatedWith = NULL ; +- for (;;) { +- // Push p onto FreeList +- Parker * List = FreeList ; +- p->FreeNext = List ; +- if (Atomic::cmpxchg_ptr (p, &FreeList, List) == List) break ; ++ ++ Thread::SpinAcquire(&ListLock, "ParkerFreeListRelease"); ++ { ++ p->FreeNext = FreeList; ++ FreeList = p; + } ++ Thread::SpinRelease(&ListLock); + } + +--- ./hotspot/src/share/vm/runtime/perfData.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/perfData.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -34,6 +34,8 @@ + #include "utilities/exceptions.hpp" + #include "utilities/globalDefinitions.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + PerfDataList* PerfDataManager::_all = NULL; + PerfDataList* PerfDataManager::_sampled = NULL; + PerfDataList* PerfDataManager::_constants = NULL; +--- ./hotspot/src/share/vm/runtime/perfMemory.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/perfMemory.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -34,6 +34,8 @@ + #include "runtime/statSampler.hpp" + #include "utilities/globalDefinitions.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // Prefix of performance data file. + const char PERFDATA_NAME[] = "hsperfdata"; + +@@ -155,7 +157,7 @@ + + void PerfMemory::destroy() { + +- assert(_prologue != NULL, "prologue pointer must be initialized"); ++ if (_prologue == NULL) return; + + if (_start != NULL && _prologue->overflow != 0) { + +--- ./hotspot/src/share/vm/runtime/rtmLocking.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/runtime/rtmLocking.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ * ++ */ ++ ++#ifndef SHARE_VM_RUNTIME_RTMLOCKING_HPP ++#define SHARE_VM_RUNTIME_RTMLOCKING_HPP ++ ++// Generate RTM (Restricted Transactional Memory) locking code for all inflated ++// locks when "UseRTMLocking" option is on with normal locking mechanism as fall back ++// handler. ++// ++// On abort/lock busy the lock will be retried a fixed number of times under RTM ++// as specified by "RTMRetryCount" option. The locks which abort too often ++// can be auto tuned or manually tuned. ++// ++// Auto-tuning can be done on an option like UseRTMDeopt and it will need abort ++// ratio calculation for each lock. The abort ratio will be calculated after ++// "RTMAbortThreshold" number of aborts is reached. The formulas are: ++// ++// Aborted transactions = abort_count * 100 ++// All transactions = total_count * RTMTotalCountIncrRate ++// ++// Aborted transactions >= All transactions * RTMAbortRatio ++// ++// If "UseRTMDeopt" is on and the aborts ratio reaches "RTMAbortRatio" ++// the method containing the lock will be deoptimized and recompiled with ++// all locks as normal locks. If the abort ratio continues to remain low after ++// "RTMLockingThreshold" locks are attempted, then the method will be deoptimized ++// and recompiled with all locks as RTM locks without abort ratio calculation code. ++// The abort ratio calculation can be delayed by specifying flag ++// -XX:RTMLockingCalculationDelay in millisecond. ++// ++// For manual tuning the abort statistics for each lock needs to be provided ++// to the user on some JVM option like "PrintPreciseRTMLockingStatistics". ++// Based on the abort statistics users can create a .hotspot_compiler file ++// or use -XX:CompileCommand=option,class::method,NoRTMLockEliding ++// to specify for which methods to disable RTM locking. ++// ++// When UseRTMForStackLocks option is enabled along with UseRTMLocking option, ++// the RTM locking code is generated for stack locks too. ++// The retries, auto-tuning support and rtm locking statistics are all ++// supported for stack locks just like inflated locks. ++ ++// RTM locking counters ++class RTMLockingCounters VALUE_OBJ_CLASS_SPEC { ++ private: ++ uintx _total_count; // Total RTM locks count ++ uintx _abort_count; // Total aborts count ++ ++ public: ++ enum { ABORT_STATUS_LIMIT = 6 }; ++ // Counters per RTM Abort Status. Incremented with +PrintPreciseRTMLockingStatistics ++ // RTM uses the EAX register to communicate abort status to software. ++ // Following an RTM abort the EAX register has the following definition. ++ // ++ // EAX register bit position Meaning ++ // 0 Set if abort caused by XABORT instruction. ++ // 1 If set, the transaction may succeed on a retry. This bit is always clear if bit 0 is set. ++ // 2 Set if another logical processor conflicted with a memory address that was part of the transaction that aborted. ++ // 3 Set if an internal buffer overflowed. ++ // 4 Set if a debug breakpoint was hit. ++ // 5 Set if an abort occurred during execution of a nested transaction. ++ private: ++ uintx _abortX_count[ABORT_STATUS_LIMIT]; ++ ++ public: ++ static uintx _calculation_flag; ++ static uintx* rtm_calculation_flag_addr() { return &_calculation_flag; } ++ ++ static void init(); ++ ++ RTMLockingCounters() : _total_count(0), _abort_count(0) { ++ for (int i = 0; i < ABORT_STATUS_LIMIT; i++) { ++ _abortX_count[i] = 0; ++ } ++ } ++ ++ uintx* total_count_addr() { return &_total_count; } ++ uintx* abort_count_addr() { return &_abort_count; } ++ uintx* abortX_count_addr() { return &_abortX_count[0]; } ++ ++ static int total_count_offset() { return (int)offset_of(RTMLockingCounters, _total_count); } ++ static int abort_count_offset() { return (int)offset_of(RTMLockingCounters, _abort_count); } ++ static int abortX_count_offset() { return (int)offset_of(RTMLockingCounters, _abortX_count[0]); } ++ ++ ++ bool nonzero() { return (_abort_count + _total_count) > 0; } ++ ++ void print_on(outputStream* st); ++ void print() { print_on(tty); } ++}; ++ ++#endif // SHARE_VM_RUNTIME_RTMLOCKING_HPP +--- ./hotspot/src/share/vm/runtime/safepoint.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/safepoint.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -81,6 +81,8 @@ + #include "c1/c1_globals.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // -------------------------------------------------------------------------------------------------- + // Implementation of Safepoint begin/end + +@@ -535,7 +537,14 @@ + + // rotate log files? + if (UseGCLogFileRotation) { +- gclog_or_tty->rotate_log(); ++ gclog_or_tty->rotate_log(false); ++ } ++ ++ { ++ // CMS delays purging the CLDG until the beginning of the next safepoint and to ++ // make sure concurrent sweep is done ++ TraceTime t7("purging class loader data graph", TraceSafepointCleanupTime); ++ ClassLoaderDataGraph::purge_if_needed(); + } + + if (MemTracker::is_on()) { +@@ -786,7 +795,7 @@ + old_sp += incr*32; new_sp += incr*32; was_oops += incr*32; + for( int i2=0; i2<16; i2++ ) { + tty->print("call %c%d |"PTR_FORMAT" ","LI"[i2>>3],i2&7,new_sp); print_ptrs(*old_sp++,*new_sp++,*was_oops++); } +- tty->print_cr(""); ++ tty->cr(); + } + #endif // SPARC + #endif // PRODUCT +@@ -828,7 +837,7 @@ + timeout_error_printed = true; + // Print out the thread infor which didn't reach the safepoint for debugging + // purposes (useful when there are lots of threads in the debugger). +- tty->print_cr(""); ++ tty->cr(); + tty->print_cr("# SafepointSynchronize::begin: Timeout detected:"); + if (reason == _spinning_timeout) { + tty->print_cr("# SafepointSynchronize::begin: Timed out while spinning to reach a safepoint."); +@@ -848,7 +857,7 @@ + (reason == _blocking_timeout && !cur_state->has_called_back()))) { + tty->print("# "); + cur_thread->print(); +- tty->print_cr(""); ++ tty->cr(); + } + } + tty->print_cr("# SafepointSynchronize::begin: (End of list)"); +@@ -1321,7 +1330,7 @@ + spstat->_time_to_sync > PrintSafepointStatisticsTimeout * MICROUNITS) { + print_statistics(); + } +- tty->print_cr(""); ++ tty->cr(); + + // Print out polling page sampling status. + if (!need_to_track_page_armed_status) { +--- ./hotspot/src/share/vm/runtime/safepoint.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/safepoint.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -174,7 +174,7 @@ + + // debugging + static void print_state() PRODUCT_RETURN; +- static void safepoint_msg(const char* format, ...) PRODUCT_RETURN; ++ static void safepoint_msg(const char* format, ...) ATTRIBUTE_PRINTF(1, 2) PRODUCT_RETURN; + + static void deferred_initialize_stat(); + static void print_stat_on_exit(); +@@ -240,7 +240,7 @@ + static void create(JavaThread *thread); + static void destroy(JavaThread *thread); + +- void safepoint_msg(const char* format, ...) { ++ void safepoint_msg(const char* format, ...) ATTRIBUTE_PRINTF(2, 3) { + if (ShowSafepointMsgs) { + va_list ap; + va_start(ap, format); +--- ./hotspot/src/share/vm/runtime/sharedRuntime.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/sharedRuntime.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -82,6 +82,8 @@ + #include "c1/c1_Runtime1.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // Shared stub locations + RuntimeStub* SharedRuntime::_wrong_method_blob; + RuntimeStub* SharedRuntime::_wrong_method_abstract_blob; +@@ -408,7 +410,7 @@ + + #endif + +-#if defined(__SOFTFP__) || defined(PPC) ++#if defined(__SOFTFP__) || defined(PPC32) + double SharedRuntime::dsqrt(double f) { + return sqrt(f); + } +@@ -494,6 +496,13 @@ + assert(!nm->is_native_method(), "no exception handler"); + assert(nm->header_begin() != nm->exception_begin(), "no exception handler"); + if (nm->is_deopt_pc(return_address)) { ++ // If we come here because of a stack overflow, the stack may be ++ // unguarded. Reguard the stack otherwise if we return to the ++ // deopt blob and the stack bang causes a stack overflow we ++ // crash. ++ bool guard_pages_enabled = thread->stack_yellow_zone_enabled(); ++ if (!guard_pages_enabled) guard_pages_enabled = thread->reguard_stack(); ++ assert(guard_pages_enabled, "stack banging in deopt blob may cause crash"); + return SharedRuntime::deopt_blob()->unpack_with_exception(); + } else { + return nm->exception_begin(); +@@ -776,10 +785,13 @@ + // going to be unwound. Dispatch to a shared runtime stub + // which will cause the StackOverflowError to be fabricated + // and processed. +- // For stack overflow in deoptimization blob, cleanup thread. +- if (thread->deopt_mark() != NULL) { +- Deoptimization::cleanup_deopt_info(thread, NULL); +- } ++ // Stack overflow should never occur during deoptimization: ++ // the compiled method bangs the stack by as much as the ++ // interpreter would need in case of a deoptimization. The ++ // deoptimization blob and uncommon trap blob bang the stack ++ // in a debug VM to verify the correctness of the compiled ++ // method stack banging. ++ assert(thread->deopt_mark() == NULL, "no stack overflow from deopt blob/uncommon trap"); + Events::log_exception(thread, "StackOverflowError at " INTPTR_FORMAT, pc); + return StubRoutines::throw_StackOverflowError_entry(); + } +@@ -953,14 +965,13 @@ + * it gets turned into a tail-call on sparc, which runs into dtrace bug + * 6254741. Once that is fixed we can remove the dummy return value. + */ +-int SharedRuntime::dtrace_object_alloc(oopDesc* o) { +- return dtrace_object_alloc_base(Thread::current(), o); ++int SharedRuntime::dtrace_object_alloc(oopDesc* o, int size) { ++ return dtrace_object_alloc_base(Thread::current(), o, size); + } + +-int SharedRuntime::dtrace_object_alloc_base(Thread* thread, oopDesc* o) { ++int SharedRuntime::dtrace_object_alloc_base(Thread* thread, oopDesc* o, int size) { + assert(DTraceAllocProbes, "wrong call"); + Klass* klass = o->klass(); +- int size = o->size(); + Symbol* name = klass->name(); + #ifndef USDT2 + HS_DTRACE_PROBE4(hotspot, object__alloc, get_java_tid(thread), +@@ -2400,7 +2411,7 @@ + ResourceMark rm; + + NOT_PRODUCT(int insts_size); +- AdapterBlob* B = NULL; ++ AdapterBlob* new_adapter = NULL; + AdapterHandlerEntry* entry = NULL; + AdapterFingerPrint* fingerprint = NULL; + { +@@ -2432,7 +2443,8 @@ + + #ifdef ASSERT + AdapterHandlerEntry* shared_entry = NULL; +- if (VerifyAdapterSharing && entry != NULL) { ++ // Start adapter sharing verification only after the VM is booted. ++ if (VerifyAdapterSharing && (entry != NULL)) { + shared_entry = entry; + entry = NULL; + } +@@ -2448,41 +2460,44 @@ + // Make a C heap allocated version of the fingerprint to store in the adapter + fingerprint = new AdapterFingerPrint(total_args_passed, sig_bt); + ++ // StubRoutines::code2() is initialized after this function can be called. As a result, ++ // VerifyAdapterCalls and VerifyAdapterSharing can fail if we re-use code that generated ++ // prior to StubRoutines::code2() being set. Checks refer to checks generated in an I2C ++ // stub that ensure that an I2C stub is called from an interpreter frame. ++ bool contains_all_checks = StubRoutines::code2() != NULL; ++ + // Create I2C & C2I handlers +- + BufferBlob* buf = buffer_blob(); // the temporary code buffer in CodeCache + if (buf != NULL) { + CodeBuffer buffer(buf); + short buffer_locs[20]; + buffer.insts()->initialize_shared_locs((relocInfo*)buffer_locs, + sizeof(buffer_locs)/sizeof(relocInfo)); ++ + MacroAssembler _masm(&buffer); +- + entry = SharedRuntime::generate_i2c2i_adapters(&_masm, + total_args_passed, + comp_args_on_stack, + sig_bt, + regs, + fingerprint); +- + #ifdef ASSERT + if (VerifyAdapterSharing) { + if (shared_entry != NULL) { +- assert(shared_entry->compare_code(buf->code_begin(), buffer.insts_size(), total_args_passed, sig_bt), +- "code must match"); ++ assert(shared_entry->compare_code(buf->code_begin(), buffer.insts_size()), "code must match"); + // Release the one just created and return the original + _adapters->free_entry(entry); + return shared_entry; + } else { +- entry->save_code(buf->code_begin(), buffer.insts_size(), total_args_passed, sig_bt); ++ entry->save_code(buf->code_begin(), buffer.insts_size()); + } + } + #endif + +- B = AdapterBlob::create(&buffer); ++ new_adapter = AdapterBlob::create(&buffer); + NOT_PRODUCT(insts_size = buffer.insts_size()); + } +- if (B == NULL) { ++ if (new_adapter == NULL) { + // CodeCache is full, disable compilation + // Ought to log this but compile log is only per compile thread + // and we're some non descript Java thread. +@@ -2490,7 +2505,7 @@ + CompileBroker::handle_full_code_cache(); + return NULL; // Out of CodeCache space + } +- entry->relocate(B->content_begin()); ++ entry->relocate(new_adapter->content_begin()); + #ifndef PRODUCT + // debugging suppport + if (PrintAdapterHandlers || PrintStubCode) { +@@ -2509,22 +2524,25 @@ + } + } + #endif +- +- _adapters->add(entry); ++ // Add the entry only if the entry contains all required checks (see sharedRuntime_xxx.cpp) ++ // The checks are inserted only if -XX:+VerifyAdapterCalls is specified. ++ if (contains_all_checks || !VerifyAdapterCalls) { ++ _adapters->add(entry); ++ } + } + // Outside of the lock +- if (B != NULL) { ++ if (new_adapter != NULL) { + char blob_id[256]; + jio_snprintf(blob_id, + sizeof(blob_id), + "%s(%s)@" PTR_FORMAT, +- B->name(), ++ new_adapter->name(), + fingerprint->as_string(), +- B->content_begin()); +- Forte::register_stub(blob_id, B->content_begin(), B->content_end()); ++ new_adapter->content_begin()); ++ Forte::register_stub(blob_id, new_adapter->content_begin(),new_adapter->content_end()); + + if (JvmtiExport::should_post_dynamic_code_generated()) { +- JvmtiExport::post_dynamic_code_generated(blob_id, B->content_begin(), B->content_end()); ++ JvmtiExport::post_dynamic_code_generated(blob_id, new_adapter->content_begin(), new_adapter->content_end()); + } + } + return entry; +@@ -2556,7 +2574,6 @@ + delete _fingerprint; + #ifdef ASSERT + if (_saved_code) FREE_C_HEAP_ARRAY(unsigned char, _saved_code, mtCode); +- if (_saved_sig) FREE_C_HEAP_ARRAY(Basictype, _saved_sig, mtCode); + #endif + } + +@@ -2565,35 +2582,30 @@ + // Capture the code before relocation so that it can be compared + // against other versions. If the code is captured after relocation + // then relative instructions won't be equivalent. +-void AdapterHandlerEntry::save_code(unsigned char* buffer, int length, int total_args_passed, BasicType* sig_bt) { ++void AdapterHandlerEntry::save_code(unsigned char* buffer, int length) { + _saved_code = NEW_C_HEAP_ARRAY(unsigned char, length, mtCode); +- _code_length = length; ++ _saved_code_length = length; + memcpy(_saved_code, buffer, length); +- _total_args_passed = total_args_passed; +- _saved_sig = NEW_C_HEAP_ARRAY(BasicType, _total_args_passed, mtCode); +- memcpy(_saved_sig, sig_bt, _total_args_passed * sizeof(BasicType)); + } + + +-bool AdapterHandlerEntry::compare_code(unsigned char* buffer, int length, int total_args_passed, BasicType* sig_bt) { +- if (length != _code_length) { ++bool AdapterHandlerEntry::compare_code(unsigned char* buffer, int length) { ++ if (length != _saved_code_length) { + return false; + } +- for (int i = 0; i < length; i++) { +- if (buffer[i] != _saved_code[i]) { +- return false; +- } +- } +- return true; ++ ++ return (memcmp(buffer, _saved_code, length) == 0) ? true : false; + } + #endif + + +-// Create a native wrapper for this native method. The wrapper converts the +-// java compiled calling convention to the native convention, handlizes +-// arguments, and transitions to native. On return from the native we transition +-// back to java blocking if a safepoint is in progress. +-nmethod *AdapterHandlerLibrary::create_native_wrapper(methodHandle method, int compile_id) { ++/** ++ * Create a native wrapper for this native method. The wrapper converts the ++ * Java-compiled calling convention to the native convention, handles ++ * arguments, and transitions to native. On return from the native we transition ++ * back to java blocking if a safepoint is in progress. ++ */ ++void AdapterHandlerLibrary::create_native_wrapper(methodHandle method) { + ResourceMark rm; + nmethod* nm = NULL; + +@@ -2602,16 +2614,19 @@ + method->has_native_function(), "must have something valid to call!"); + + { +- // perform the work while holding the lock, but perform any printing outside the lock ++ // Perform the work while holding the lock, but perform any printing outside the lock + MutexLocker mu(AdapterHandlerLibrary_lock); + // See if somebody beat us to it + nm = method->code(); +- if (nm) { +- return nm; ++ if (nm != NULL) { ++ return; + } + ++ const int compile_id = CompileBroker::assign_compile_id(method, CompileBroker::standard_entry_bci); ++ assert(compile_id > 0, "Must generate native wrapper"); ++ ++ + ResourceMark rm; +- + BufferBlob* buf = buffer_blob(); // the temporary code buffer in CodeCache + if (buf != NULL) { + CodeBuffer buffer(buf); +@@ -2643,16 +2658,14 @@ + int comp_args_on_stack = SharedRuntime::java_calling_convention(sig_bt, regs, total_args_passed, is_outgoing); + + // Generate the compiled-to-native wrapper code +- nm = SharedRuntime::generate_native_wrapper(&_masm, +- method, +- compile_id, +- sig_bt, +- regs, +- ret_type); ++ nm = SharedRuntime::generate_native_wrapper(&_masm, method, compile_id, sig_bt, regs, ret_type); ++ ++ if (nm != NULL) { ++ method->set_code(method, nm); ++ } + } +- } +- +- // Must unlock before calling set_code ++ } // Unlock AdapterHandlerLibrary_lock ++ + + // Install the generated code. + if (nm != NULL) { +@@ -2660,13 +2673,11 @@ + ttyLocker ttyl; + CompileTask::print_compilation(tty, nm, method->is_static() ? "(static)" : ""); + } +- method->set_code(method, nm); + nm->post_compiled_method_load_event(); + } else { + // CodeCache is full, disable compilation + CompileBroker::handle_full_code_cache(); + } +- return nm; + } + + JRT_ENTRY_NO_ASYNC(void, SharedRuntime::block_for_jni_critical(JavaThread* thread)) +@@ -2684,19 +2695,20 @@ + JRT_END + + #ifdef HAVE_DTRACE_H +-// Create a dtrace nmethod for this method. The wrapper converts the +-// java compiled calling convention to the native convention, makes a dummy call +-// (actually nops for the size of the call instruction, which become a trap if +-// probe is enabled). The returns to the caller. Since this all looks like a +-// leaf no thread transition is needed. +- ++/** ++ * Create a dtrace nmethod for this method. The wrapper converts the ++ * Java-compiled calling convention to the native convention, makes a dummy call ++ * (actually nops for the size of the call instruction, which become a trap if ++ * probe is enabled), and finally returns to the caller. Since this all looks like a ++ * leaf, no thread transition is needed. ++ */ + nmethod *AdapterHandlerLibrary::create_dtrace_nmethod(methodHandle method) { + ResourceMark rm; + nmethod* nm = NULL; + + if (PrintCompilation) { + ttyLocker ttyl; +- tty->print("--- n%s "); ++ tty->print("--- n "); + method->print_short_name(tty); + if (method->is_static()) { + tty->print(" (static)"); +@@ -2744,6 +2756,71 @@ + } + #endif // ndef HAVE_DTRACE_H + ++int SharedRuntime::convert_ints_to_longints_argcnt(int in_args_count, BasicType* in_sig_bt) { ++ int argcnt = in_args_count; ++ if (CCallingConventionRequiresIntsAsLongs) { ++ for (int in = 0; in < in_args_count; in++) { ++ BasicType bt = in_sig_bt[in]; ++ switch (bt) { ++ case T_BOOLEAN: ++ case T_CHAR: ++ case T_BYTE: ++ case T_SHORT: ++ case T_INT: ++ argcnt++; ++ break; ++ default: ++ break; ++ } ++ } ++ } else { ++ assert(0, "This should not be needed on this platform"); ++ } ++ ++ return argcnt; ++} ++ ++void SharedRuntime::convert_ints_to_longints(int i2l_argcnt, int& in_args_count, ++ BasicType*& in_sig_bt, VMRegPair*& in_regs) { ++ if (CCallingConventionRequiresIntsAsLongs) { ++ VMRegPair *new_in_regs = NEW_RESOURCE_ARRAY(VMRegPair, i2l_argcnt); ++ BasicType *new_in_sig_bt = NEW_RESOURCE_ARRAY(BasicType, i2l_argcnt); ++ ++ int argcnt = 0; ++ for (int in = 0; in < in_args_count; in++, argcnt++) { ++ BasicType bt = in_sig_bt[in]; ++ VMRegPair reg = in_regs[in]; ++ switch (bt) { ++ case T_BOOLEAN: ++ case T_CHAR: ++ case T_BYTE: ++ case T_SHORT: ++ case T_INT: ++ // Convert (bt) to (T_LONG,bt). ++ new_in_sig_bt[argcnt ] = T_LONG; ++ new_in_sig_bt[argcnt+1] = bt; ++ assert(reg.first()->is_valid() && !reg.second()->is_valid(), ""); ++ new_in_regs[argcnt ].set2(reg.first()); ++ new_in_regs[argcnt+1].set_bad(); ++ argcnt++; ++ break; ++ default: ++ // No conversion needed. ++ new_in_sig_bt[argcnt] = bt; ++ new_in_regs[argcnt] = reg; ++ break; ++ } ++ } ++ assert(argcnt == i2l_argcnt, "must match"); ++ ++ in_regs = new_in_regs; ++ in_sig_bt = new_in_sig_bt; ++ in_args_count = i2l_argcnt; ++ } else { ++ assert(0, "This should not be needed on this platform"); ++ } ++} ++ + // ------------------------------------------------------------------------- + // Java-Java calling convention + // (what you use when Java calls Java) +--- ./hotspot/src/share/vm/runtime/sharedRuntime.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/sharedRuntime.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -141,7 +141,7 @@ + static double dabs(double f); + #endif + +-#if defined(__SOFTFP__) || defined(PPC) ++#if defined(__SOFTFP__) || defined(PPC32) + static double dsqrt(double f); + #endif + +@@ -261,8 +261,8 @@ + static void register_finalizer(JavaThread* thread, oopDesc* obj); + + // dtrace notifications +- static int dtrace_object_alloc(oopDesc* o); +- static int dtrace_object_alloc_base(Thread* thread, oopDesc* o); ++ static int dtrace_object_alloc(oopDesc* o, int size); ++ static int dtrace_object_alloc_base(Thread* thread, oopDesc* o, int size); + static int dtrace_method_entry(JavaThread* thread, Method* m); + static int dtrace_method_exit(JavaThread* thread, Method* m); + +@@ -362,7 +362,25 @@ + const VMRegPair* regs) NOT_DEBUG_RETURN; + + // Ditto except for calling C +- static int c_calling_convention(const BasicType *sig_bt, VMRegPair *regs, int total_args_passed); ++ // ++ // C argument in register AND stack slot. ++ // Some architectures require that an argument must be passed in a register ++ // AND in a stack slot. These architectures provide a second VMRegPair array ++ // to be filled by the c_calling_convention method. On other architectures, ++ // NULL is being passed as the second VMRegPair array, so arguments are either ++ // passed in a register OR in a stack slot. ++ static int c_calling_convention(const BasicType *sig_bt, VMRegPair *regs, VMRegPair *regs2, ++ int total_args_passed); ++ ++ // Compute the new number of arguments in the signature if 32 bit ints ++ // must be converted to longs. Needed if CCallingConventionRequiresIntsAsLongs ++ // is true. ++ static int convert_ints_to_longints_argcnt(int in_args_count, BasicType* in_sig_bt); ++ // Adapt a method's signature if it contains 32 bit integers that must ++ // be converted to longs. Needed if CCallingConventionRequiresIntsAsLongs ++ // is true. ++ static void convert_ints_to_longints(int i2l_argcnt, int& in_args_count, ++ BasicType*& in_sig_bt, VMRegPair*& in_regs); + + // Generate I2C and C2I adapters. These adapters are simple argument marshalling + // blobs. Unlike adapters in the tiger and earlier releases the code in these +@@ -376,7 +394,7 @@ + // location for the interpreter to record. This is used by the frame code + // to correct the sender code to match up with the stack pointer when the + // thread left the compiled code. In addition it allows the interpreter +- // to remove the space the c2i adapter allocated to do it argument conversion. ++ // to remove the space the c2i adapter allocated to do its argument conversion. + + // Although a c2i blob will always run interpreted even if compiled code is + // present if we see that compiled code is present the compiled call site +@@ -612,9 +630,7 @@ + // Captures code and signature used to generate this adapter when + // verifing adapter equivalence. + unsigned char* _saved_code; +- int _code_length; +- BasicType* _saved_sig; +- int _total_args_passed; ++ int _saved_code_length; + #endif + + void init(AdapterFingerPrint* fingerprint, address i2c_entry, address c2i_entry, address c2i_unverified_entry) { +@@ -624,9 +640,7 @@ + _c2i_unverified_entry = c2i_unverified_entry; + #ifdef ASSERT + _saved_code = NULL; +- _code_length = 0; +- _saved_sig = NULL; +- _total_args_passed = 0; ++ _saved_code_length = 0; + #endif + } + +@@ -639,7 +653,6 @@ + address get_i2c_entry() const { return _i2c_entry; } + address get_c2i_entry() const { return _c2i_entry; } + address get_c2i_unverified_entry() const { return _c2i_unverified_entry; } +- + address base_address(); + void relocate(address new_base); + +@@ -651,8 +664,8 @@ + + #ifdef ASSERT + // Used to verify that code generated for shared adapters is equivalent +- void save_code(unsigned char* code, int length, int total_args_passed, BasicType* sig_bt); +- bool compare_code(unsigned char* code, int length, int total_args_passed, BasicType* sig_bt); ++ void save_code (unsigned char* code, int length); ++ bool compare_code(unsigned char* code, int length); + #endif + + //virtual void print_on(outputStream* st) const; DO NOT USE +@@ -671,7 +684,7 @@ + + static AdapterHandlerEntry* new_entry(AdapterFingerPrint* fingerprint, + address i2c_entry, address c2i_entry, address c2i_unverified_entry); +- static nmethod* create_native_wrapper(methodHandle method, int compile_id); ++ static void create_native_wrapper(methodHandle method); + static AdapterHandlerEntry* get_adapter(methodHandle method); + + #ifdef HAVE_DTRACE_H +--- ./hotspot/src/share/vm/runtime/sharedRuntimeTrans.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/sharedRuntimeTrans.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -56,10 +56,12 @@ + # define __LO(x) *(1+(int*)&x) + #endif + ++#if !defined(AIX) + double copysign(double x, double y) { + __HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000); + return x; + } ++#endif + + /* + * ==================================================== +@@ -85,6 +87,7 @@ + hugeX = 1.0e+300, + tiny = 1.0e-300; + ++#if !defined(AIX) + double scalbn (double x, int n) { + int k,hx,lx; + hx = __HI(x); +@@ -111,6 +114,7 @@ + __HI(x) = (hx&0x800fffff)|(k<<20); + return x*twom54; + } ++#endif + + /* __ieee754_log(x) + * Return the logrithm of x +--- ./hotspot/src/share/vm/runtime/sharedRuntimeTrig.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/sharedRuntimeTrig.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -658,7 +658,7 @@ + + static double __kernel_cos(double x, double y) + { +- double a,hz,z,r,qx; ++ double a,h,z,r,qx; + int ix; + ix = __HI(x)&0x7fffffff; /* ix = |x|'s high word*/ + if(ix<0x3e400000) { /* if x < 2**27 */ +@@ -675,9 +675,9 @@ + __HI(qx) = ix-0x00200000; /* x/4 */ + __LO(qx) = 0; + } +- hz = 0.5*z-qx; +- a = one-qx; +- return a - (hz - (z*r-x*y)); ++ h = 0.5*z-qx; ++ a = one-qx; ++ return a - (h - (z*r-x*y)); + } + } + +--- ./hotspot/src/share/vm/runtime/signature.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/signature.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -32,6 +32,7 @@ + #include "oops/typeArrayKlass.hpp" + #include "runtime/signature.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + // Implementation of SignatureIterator + +--- ./hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -142,7 +142,8 @@ + count = MAX2(log2_intptr(os::active_processor_count()), 1) * 3 / 2; + } + set_c1_count(MAX2(count / 3, 1)); +- set_c2_count(MAX2(count - count / 3, 1)); ++ set_c2_count(MAX2(count - c1_count(), 1)); ++ FLAG_SET_ERGO(intx, CICompilerCount, c1_count() + c2_count()); + } + + void SimpleThresholdPolicy::set_carry_if_necessary(InvocationCounter *counter) { +@@ -191,6 +192,10 @@ + thread->is_interp_only_mode()) { + return NULL; + } ++ if (CompileTheWorld || ReplayCompiles) { ++ // Don't trigger other compiles in testing mode ++ return NULL; ++ } + nmethod *osr_nm = NULL; + + handle_counter_overflow(method()); +--- ./hotspot/src/share/vm/runtime/stackValue.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/stackValue.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -196,7 +196,7 @@ + + case T_OBJECT: + _o()->print_value_on(st); +- st->print(" <" INTPTR_FORMAT ">", (address)_o()); ++ st->print(" <" INTPTR_FORMAT ">", p2i((address)_o())); + break; + + case T_CONFLICT: +--- ./hotspot/src/share/vm/runtime/stackValueCollection.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/stackValueCollection.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -40,6 +40,8 @@ + # include "jniTypes_ppc.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + jint StackValueCollection::int_at(int slot) const { + intptr_t val = at(slot)->get_int(); + jint ival = *((jint*) (&val)); +--- ./hotspot/src/share/vm/runtime/stubCodeGenerator.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/stubCodeGenerator.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -60,10 +60,10 @@ + + + void StubCodeDesc::print_on(outputStream* st) const { +- st->print(group()); ++ st->print("%s", group()); + st->print("::"); +- st->print(name()); +- st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT "[ (%d bytes)", begin(), end(), size_in_bytes()); ++ st->print("%s", name()); ++ st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT "[ (%d bytes)", p2i(begin()), p2i(end()), size_in_bytes()); + } + + // Implementation of StubCodeGenerator +--- ./hotspot/src/share/vm/runtime/stubRoutines.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/stubRoutines.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -114,8 +114,11 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "stubRoutines_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "stubRoutines_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "stubRoutines_ppc_32.hpp" ++#endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "stubRoutines_ppc_64.hpp" + #endif + + +--- ./hotspot/src/share/vm/runtime/sweeper.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/sweeper.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -41,6 +41,8 @@ + #include "utilities/ticks.inline.hpp" + #include "utilities/xmlstream.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #ifdef ASSERT + + #define SWEEP(nm) record_sweep(nm, __LINE__) +@@ -129,6 +131,7 @@ + + nmethod* NMethodSweeper::_current = NULL; // Current nmethod + long NMethodSweeper::_traversals = 0; // Stack scan count, also sweep ID. ++long NMethodSweeper::_total_nof_code_cache_sweeps = 0; // Total number of full sweeps of the code cache + long NMethodSweeper::_time_counter = 0; // Virtual time used to periodically invoke sweeper + long NMethodSweeper::_last_sweep = 0; // Value of _time_counter when the last sweep happened + int NMethodSweeper::_seen = 0; // Nof. nmethod we have currently processed in current pass of CodeCache +@@ -143,13 +146,16 @@ + // 1) alive -> not_entrant + // 2) not_entrant -> zombie + // 3) zombie -> marked_for_reclamation ++int NMethodSweeper::_hotness_counter_reset_val = 0; + +-int NMethodSweeper::_total_nof_methods_reclaimed = 0; // Accumulated nof methods flushed +-Tickspan NMethodSweeper::_total_time_sweeping; // Accumulated time sweeping +-Tickspan NMethodSweeper::_total_time_this_sweep; // Total time this sweep +-Tickspan NMethodSweeper::_peak_sweep_time; // Peak time for a full sweep +-Tickspan NMethodSweeper::_peak_sweep_fraction_time; // Peak time sweeping one fraction +-int NMethodSweeper::_hotness_counter_reset_val = 0; ++long NMethodSweeper::_total_nof_methods_reclaimed = 0; // Accumulated nof methods flushed ++long NMethodSweeper::_total_nof_c2_methods_reclaimed = 0; // Accumulated nof methods flushed ++size_t NMethodSweeper::_total_flushed_size = 0; // Total number of bytes flushed from the code cache ++Tickspan NMethodSweeper::_total_time_sweeping; // Accumulated time sweeping ++Tickspan NMethodSweeper::_total_time_this_sweep; // Total time this sweep ++Tickspan NMethodSweeper::_peak_sweep_time; // Peak time for a full sweep ++Tickspan NMethodSweeper::_peak_sweep_fraction_time; // Peak time sweeping one fraction ++ + + + class MarkActivationClosure: public CodeBlobClosure { +@@ -257,9 +263,14 @@ + // Large ReservedCodeCacheSize: (e.g., 256M + code Cache is 90% full). The formula + // computes: (256 / 16) - 10 = 6. + if (!_should_sweep) { +- int time_since_last_sweep = _time_counter - _last_sweep; +- double wait_until_next_sweep = (ReservedCodeCacheSize / (16 * M)) - time_since_last_sweep - +- CodeCache::reverse_free_ratio(); ++ const int time_since_last_sweep = _time_counter - _last_sweep; ++ // ReservedCodeCacheSize has an 'unsigned' type. We need a 'signed' type for max_wait_time, ++ // since 'time_since_last_sweep' can be larger than 'max_wait_time'. If that happens using ++ // an unsigned type would cause an underflow (wait_until_next_sweep becomes a large positive ++ // value) that disables the intended periodic sweeps. ++ const int max_wait_time = ReservedCodeCacheSize / (16 * M); ++ double wait_until_next_sweep = max_wait_time - time_since_last_sweep - CodeCache::reverse_free_ratio(); ++ assert(wait_until_next_sweep <= (double)max_wait_time, "Calculation of code cache sweeper interval is incorrect"); + + if ((wait_until_next_sweep <= 0.0) || !CompileBroker::should_compile_new_jobs()) { + _should_sweep = true; +@@ -287,6 +298,7 @@ + + // We are done with sweeping the code cache once. + if (_sweep_fractions_left == 0) { ++ _total_nof_code_cache_sweeps++; + _last_sweep = _time_counter; + // Reset flag; temporarily disables sweeper + _should_sweep = false; +@@ -299,7 +311,8 @@ + _bytes_changed = 0; + } + } +- _sweep_started = 0; ++ // Release work, because another compiler thread could continue. ++ OrderAccess::release_store((int*)&_sweep_started, 0); + } + } + +@@ -373,6 +386,7 @@ + _total_time_sweeping += sweep_time; + _total_time_this_sweep += sweep_time; + _peak_sweep_fraction_time = MAX2(sweep_time, _peak_sweep_fraction_time); ++ _total_flushed_size += freed_memory; + _total_nof_methods_reclaimed += _flushed_count; + + EventSweepCodeCache event(UNTIMED); +@@ -504,6 +518,9 @@ + tty->print_cr("### Nmethod %3d/" PTR_FORMAT " (marked for reclamation) being flushed", nm->compile_id(), nm); + } + freed_memory = nm->total_size(); ++ if (nm->is_compiled_by_c2()) { ++ _total_nof_c2_methods_reclaimed++; ++ } + release_nmethod(nm); + _flushed_count++; + } else { +@@ -542,6 +559,9 @@ + SWEEP(nm); + // No inline caches will ever point to osr methods, so we can just remove it + freed_memory = nm->total_size(); ++ if (nm->is_compiled_by_c2()) { ++ _total_nof_c2_methods_reclaimed++; ++ } + release_nmethod(nm); + _flushed_count++; + } else { +@@ -607,7 +627,7 @@ + tty->vprint(format, ap); + va_end(ap); + } +- tty->print_cr(s.as_string()); ++ tty->print_cr("%s", s.as_string()); + } + + if (LogCompilation && (xtty != NULL)) { +@@ -624,8 +644,18 @@ + xtty->vprint(format, ap); + va_end(ap); + } +- xtty->print(s.as_string()); ++ xtty->print("%s", s.as_string()); + xtty->stamp(); + xtty->end_elem(); + } + } ++ ++void NMethodSweeper::print() { ++ ttyLocker ttyl; ++ tty->print_cr("Code cache sweeper statistics:"); ++ tty->print_cr(" Total sweep time: %1.0lfms", (double)_total_time_sweeping.value()/1000000); ++ tty->print_cr(" Total number of full sweeps: %ld", _total_nof_code_cache_sweeps); ++ tty->print_cr(" Total number of flushed methods: %ld(%ld C2 methods)", _total_nof_methods_reclaimed, ++ _total_nof_c2_methods_reclaimed); ++ tty->print_cr(" Total size of flushed methods: " SIZE_FORMAT "kB", _total_flushed_size/K); ++} +--- ./hotspot/src/share/vm/runtime/sweeper.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/sweeper.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -54,28 +54,33 @@ + // is full. + + class NMethodSweeper : public AllStatic { +- static long _traversals; // Stack scan count, also sweep ID. +- static long _time_counter; // Virtual time used to periodically invoke sweeper +- static long _last_sweep; // Value of _time_counter when the last sweep happened +- static nmethod* _current; // Current nmethod +- static int _seen; // Nof. nmethod we have currently processed in current pass of CodeCache +- static int _flushed_count; // Nof. nmethods flushed in current sweep +- static int _zombified_count; // Nof. nmethods made zombie in current sweep +- static int _marked_for_reclamation_count; // Nof. nmethods marked for reclaim in current sweep ++ static long _traversals; // Stack scan count, also sweep ID. ++ static long _total_nof_code_cache_sweeps; // Total number of full sweeps of the code cache ++ static long _time_counter; // Virtual time used to periodically invoke sweeper ++ static long _last_sweep; // Value of _time_counter when the last sweep happened ++ static nmethod* _current; // Current nmethod ++ static int _seen; // Nof. nmethod we have currently processed in current pass of CodeCache ++ static int _flushed_count; // Nof. nmethods flushed in current sweep ++ static int _zombified_count; // Nof. nmethods made zombie in current sweep ++ static int _marked_for_reclamation_count; // Nof. nmethods marked for reclaim in current sweep + +- static volatile int _sweep_fractions_left; // Nof. invocations left until we are completed with this pass +- static volatile int _sweep_started; // Flag to control conc sweeper +- static volatile bool _should_sweep; // Indicates if we should invoke the sweeper +- static volatile int _bytes_changed; // Counts the total nmethod size if the nmethod changed from: +- // 1) alive -> not_entrant +- // 2) not_entrant -> zombie +- // 3) zombie -> marked_for_reclamation ++ static volatile int _sweep_fractions_left; // Nof. invocations left until we are completed with this pass ++ static volatile int _sweep_started; // Flag to control conc sweeper ++ static volatile bool _should_sweep; // Indicates if we should invoke the sweeper ++ static volatile int _bytes_changed; // Counts the total nmethod size if the nmethod changed from: ++ // 1) alive -> not_entrant ++ // 2) not_entrant -> zombie ++ // 3) zombie -> marked_for_reclamation + // Stat counters +- static int _total_nof_methods_reclaimed; // Accumulated nof methods flushed +- static Tickspan _total_time_sweeping; // Accumulated time sweeping +- static Tickspan _total_time_this_sweep; // Total time this sweep +- static Tickspan _peak_sweep_time; // Peak time for a full sweep +- static Tickspan _peak_sweep_fraction_time; // Peak time sweeping one fraction ++ static long _total_nof_methods_reclaimed; // Accumulated nof methods flushed ++ static long _total_nof_c2_methods_reclaimed; // Accumulated nof C2-compiled methods flushed ++ static size_t _total_flushed_size; // Total size of flushed methods ++ static int _hotness_counter_reset_val; ++ ++ static Tickspan _total_time_sweeping; // Accumulated time sweeping ++ static Tickspan _total_time_this_sweep; // Total time this sweep ++ static Tickspan _peak_sweep_time; // Peak time for a full sweep ++ static Tickspan _peak_sweep_fraction_time; // Peak time sweeping one fraction + + static int process_nmethod(nmethod *nm); + static void release_nmethod(nmethod* nm); +@@ -83,15 +88,13 @@ + static bool sweep_in_progress(); + static void sweep_code_cache(); + +- static int _hotness_counter_reset_val; +- + public: + static long traversal_count() { return _traversals; } + static int total_nof_methods_reclaimed() { return _total_nof_methods_reclaimed; } + static const Tickspan total_time_sweeping() { return _total_time_sweeping; } + static const Tickspan peak_sweep_time() { return _peak_sweep_time; } + static const Tickspan peak_sweep_fraction_time() { return _peak_sweep_fraction_time; } +- static void log_sweep(const char* msg, const char* format = NULL, ...); ++ static void log_sweep(const char* msg, const char* format = NULL, ...) ATTRIBUTE_PRINTF(2, 3); + + + #ifdef ASSERT +@@ -105,10 +108,10 @@ + static void mark_active_nmethods(); // Invoked at the end of each safepoint + static void possibly_sweep(); // Compiler threads call this to sweep + +- static int sort_nmethods_by_hotness(nmethod** nm1, nmethod** nm2); + static int hotness_counter_reset_val(); + static void report_state_change(nmethod* nm); + static void possibly_enable_sweeper(); ++ static void print(); // Printing/debugging + }; + + #endif // SHARE_VM_RUNTIME_SWEEPER_HPP +--- ./hotspot/src/share/vm/runtime/synchronizer.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/synchronizer.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -53,13 +53,15 @@ + # include "os_bsd.inline.hpp" + #endif + +-#if defined(__GNUC__) ++#if defined(__GNUC__) && !defined(PPC64) + // Need to inhibit inlining for older versions of GCC to avoid build-time failures + #define ATTR __attribute__((noinline)) + #else + #define ATTR + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // The "core" versions of monitor enter and exit reside in this file. + // The interpreter and compilers contain specialized transliterated + // variants of the enter-exit fast-path operations. See i486.ad fast_lock(), +--- ./hotspot/src/share/vm/runtime/task.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/task.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -105,7 +105,6 @@ + _counter(0), _interval((int) interval_time) { + // Sanity check the interval time + assert(_interval >= PeriodicTask::min_interval && +- _interval <= PeriodicTask::max_interval && + _interval % PeriodicTask::interval_gran == 0, + "improper PeriodicTask interval time"); + } +--- ./hotspot/src/share/vm/runtime/thread.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/thread.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -107,6 +107,11 @@ + #include "opto/c2compiler.hpp" + #include "opto/idealGraphPrinter.hpp" + #endif ++#if INCLUDE_RTM_OPT ++#include "runtime/rtmLocking.hpp" ++#endif ++ ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + #ifdef DTRACE_ENABLED + +@@ -236,7 +241,6 @@ + debug_only(_allow_allocation_count = 0;) + NOT_PRODUCT(_allow_safepoint_count = 0;) + NOT_PRODUCT(_skip_gcalot = false;) +- CHECK_UNHANDLED_OOPS_ONLY(_gc_locked_out_count = 0;) + _jvmti_env_iteration_count = 0; + set_allocated_bytes(0); + _vm_operation_started_count = 0; +@@ -312,6 +316,9 @@ + void Thread::record_stack_base_and_size() { + set_stack_base(os::current_stack_base()); + set_stack_size(os::current_stack_size()); ++ if (is_Java_thread()) { ++ ((JavaThread*) this)->set_stack_overflow_limit(); ++ } + // CR 7190089: on Solaris, primordial thread's stack is adjusted + // in initialize_thread(). Without the adjustment, stack size is + // incorrect if stack is set to unlimited (ulimit -s unlimited). +@@ -1414,8 +1421,8 @@ + void JavaThread::initialize() { + // Initialize fields + +- // Set the claimed par_id to -1 (ie not claiming any par_ids) +- set_claimed_par_id(-1); ++ // Set the claimed par_id to UINT_MAX (ie not claiming any par_ids) ++ set_claimed_par_id(UINT_MAX); + + set_saved_exception_pc(NULL); + set_threadObj(NULL); +@@ -3567,6 +3574,8 @@ + // debug stuff, that does not work until all basic classes have been initialized. + set_init_completed(); + ++ Metaspace::post_initialize(); ++ + #ifndef USDT2 + HS_DTRACE_PROBE(hotspot, vm__init__end); + #else /* USDT2 */ +@@ -3670,6 +3679,10 @@ + + BiasedLocking::init(); + ++#if INCLUDE_RTM_OPT ++ RTMLockingCounters::init(); ++#endif ++ + if (JDK_Version::current().post_vm_init_hook_enabled()) { + call_postVMInitHook(THREAD); + // The Java side of PostVMInitHook.run must deal with all +@@ -4000,14 +4013,8 @@ + // GC vm_operations can get caught at the safepoint, and the + // heap is unparseable if they are caught. Grab the Heap_lock + // to prevent this. The GC vm_operations will not be able to +- // queue until after the vm thread is dead. +- // After this point, we'll never emerge out of the safepoint before +- // the VM exits, so concurrent GC threads do not need to be explicitly +- // stopped; they remain inactive until the process exits. +- // Note: some concurrent G1 threads may be running during a safepoint, +- // but these will not be accessing the heap, just some G1-specific side +- // data structures that are not accessed by any other threads but them +- // after this point in a terminal safepoint. ++ // queue until after the vm thread is dead. After this point, ++ // we'll never emerge out of the safepoint before the VM exits. + + MutexLocker ml(Heap_lock); + +@@ -4309,7 +4316,7 @@ + // Threads::print_on() is called at safepoint by VM_PrintThreads operation. + void Threads::print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks) { + char buf[32]; +- st->print_cr(os::local_time_string(buf, sizeof(buf))); ++ st->print_cr("%s", os::local_time_string(buf, sizeof(buf))); + + st->print_cr("Full thread dump %s (%s %s):", + Abstract_VM_Version::vm_name(), +@@ -4446,9 +4453,7 @@ + ++ctr ; + if ((ctr & 0xFFF) == 0 || !os::is_MP()) { + if (Yields > 5) { +- // Consider using a simple NakedSleep() instead. +- // Then SpinAcquire could be called by non-JVM threads +- Thread::current()->_ParkEvent->park(1) ; ++ os::naked_short_sleep(1); + } else { + os::NakedYield() ; + ++Yields ; +--- ./hotspot/src/share/vm/runtime/thread.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/thread.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -249,9 +249,6 @@ + // Used by SkipGCALot class. + NOT_PRODUCT(bool _skip_gcalot;) // Should we elide gc-a-lot? + +- // Record when GC is locked out via the GC_locker mechanism +- CHECK_UNHANDLED_OOPS_ONLY(int _gc_locked_out_count;) +- + friend class No_Alloc_Verifier; + friend class No_Safepoint_Verifier; + friend class Pause_No_Safepoint_Verifier; +@@ -397,7 +394,6 @@ + void clear_unhandled_oops() { + if (CheckUnhandledOops) unhandled_oops()->clear_unhandled_oops(); + } +- bool is_gc_locked_out() { return _gc_locked_out_count > 0; } + #endif // CHECK_UNHANDLED_OOPS + + #ifndef PRODUCT +@@ -699,7 +695,7 @@ + NamedThread(); + ~NamedThread(); + // May only be called once per thread. +- void set_name(const char* format, ...); ++ void set_name(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + virtual bool is_Named_thread() const { return true; } + virtual char* name() const { return _name == NULL ? (char*)"Unknown Thread" : _name; } + JavaThread *processed_thread() { return _processed_thread; } +@@ -913,7 +909,11 @@ + + private: + +- StackGuardState _stack_guard_state; ++ StackGuardState _stack_guard_state; ++ ++ // Precompute the limit of the stack as used in stack overflow checks. ++ // We load it from here to simplify the stack overflow check in assembly. ++ address _stack_overflow_limit; + + // Compiler exception handling (NOTE: The _exception_oop is *NOT* the same as _pending_exception. It is + // used to temp. parsing values into and out of the runtime system during exception handling for compiled +@@ -1029,20 +1029,31 @@ + + // Last frame anchor routines + +- JavaFrameAnchor* frame_anchor(void) { return &_anchor; } ++ JavaFrameAnchor* frame_anchor(void) { return &_anchor; } + + // last_Java_sp +- bool has_last_Java_frame() const { return _anchor.has_last_Java_frame(); } +- intptr_t* last_Java_sp() const { return _anchor.last_Java_sp(); } ++ bool has_last_Java_frame() const { return _anchor.has_last_Java_frame(); } ++ intptr_t* last_Java_sp() const { return _anchor.last_Java_sp(); } + + // last_Java_pc + +- address last_Java_pc(void) { return _anchor.last_Java_pc(); } ++ address last_Java_pc(void) { return _anchor.last_Java_pc(); } + + // Safepoint support ++#ifndef PPC64 + JavaThreadState thread_state() const { return _thread_state; } +- void set_thread_state(JavaThreadState s) { _thread_state=s; } +- ThreadSafepointState *safepoint_state() const { return _safepoint_state; } ++ void set_thread_state(JavaThreadState s) { _thread_state = s; } ++#else ++ // Use membars when accessing volatile _thread_state. See ++ // Threads::create_vm() for size checks. ++ JavaThreadState thread_state() const { ++ return (JavaThreadState) OrderAccess::load_acquire((volatile jint*)&_thread_state); ++ } ++ void set_thread_state(JavaThreadState s) { ++ OrderAccess::release_store((volatile jint*)&_thread_state, (jint)s); ++ } ++#endif ++ ThreadSafepointState *safepoint_state() const { return _safepoint_state; } + void set_safepoint_state(ThreadSafepointState *state) { _safepoint_state = state; } + bool is_at_poll_safepoint() { return _safepoint_state->is_at_poll_safepoint(); } + +@@ -1319,6 +1330,14 @@ + // and reguard if possible. + bool reguard_stack(void); + ++ address stack_overflow_limit() { return _stack_overflow_limit; } ++ void set_stack_overflow_limit() { ++ _stack_overflow_limit = _stack_base - _stack_size + ++ ((StackShadowPages + ++ StackYellowPages + ++ StackRedPages) * os::vm_page_size()); ++ } ++ + // Misc. accessors/mutators + void set_do_not_unlock(void) { _do_not_unlock_if_synchronized = true; } + void clr_do_not_unlock(void) { _do_not_unlock_if_synchronized = false; } +@@ -1353,6 +1372,7 @@ + static ByteSize exception_oop_offset() { return byte_offset_of(JavaThread, _exception_oop ); } + static ByteSize exception_pc_offset() { return byte_offset_of(JavaThread, _exception_pc ); } + static ByteSize exception_handler_pc_offset() { return byte_offset_of(JavaThread, _exception_handler_pc); } ++ static ByteSize stack_overflow_limit_offset() { return byte_offset_of(JavaThread, _stack_overflow_limit); } + static ByteSize is_method_handle_return_offset() { return byte_offset_of(JavaThread, _is_method_handle_return); } + static ByteSize stack_guard_state_offset() { return byte_offset_of(JavaThread, _stack_guard_state ); } + static ByteSize suspend_flags_offset() { return byte_offset_of(JavaThread, _suspend_flags ); } +@@ -1716,6 +1736,9 @@ + #ifdef TARGET_OS_ARCH_linux_ppc + # include "thread_linux_ppc.hpp" + #endif ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "thread_aix_ppc.hpp" ++#endif + #ifdef TARGET_OS_ARCH_bsd_x86 + # include "thread_bsd_x86.hpp" + #endif +@@ -1755,12 +1778,12 @@ + void set_done_attaching_via_jni() { _jni_attach_state = _attached_via_jni; OrderAccess::fence(); } + private: + // This field is used to determine if a thread has claimed +- // a par_id: it is -1 if the thread has not claimed a par_id; ++ // a par_id: it is UINT_MAX if the thread has not claimed a par_id; + // otherwise its value is the par_id that has been claimed. +- int _claimed_par_id; ++ uint _claimed_par_id; + public: +- int get_claimed_par_id() { return _claimed_par_id; } +- void set_claimed_par_id(int id) { _claimed_par_id = id;} ++ uint get_claimed_par_id() { return _claimed_par_id; } ++ void set_claimed_par_id(uint id) { _claimed_par_id = id;} + }; + + // Inline implementation of JavaThread::current +--- ./hotspot/src/share/vm/runtime/thread.inline.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/thread.inline.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -37,6 +37,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "thread_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "thread_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "thread_bsd.inline.hpp" + #endif +--- ./hotspot/src/share/vm/runtime/threadLocalStorage.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/threadLocalStorage.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -68,6 +68,9 @@ + #ifdef TARGET_OS_ARCH_linux_ppc + # include "threadLS_linux_ppc.hpp" + #endif ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "threadLS_aix_ppc.hpp" ++#endif + #ifdef TARGET_OS_ARCH_bsd_x86 + # include "threadLS_bsd_x86.hpp" + #endif +--- ./hotspot/src/share/vm/runtime/timer.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/timer.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -35,6 +35,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +@@ -201,7 +204,7 @@ + _logfile->print("[Error in TraceCPUTime]"); + } + if (_print_cr) { +- _logfile->print_cr(""); ++ _logfile->cr(); + } + _logfile->flush(); + } +--- ./hotspot/src/share/vm/runtime/unhandledOops.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/unhandledOops.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2012, 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 +@@ -31,6 +31,8 @@ + #include "runtime/unhandledOops.hpp" + #include "utilities/globalDefinitions.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #ifdef CHECK_UNHANDLED_OOPS + const int free_list_size = 256; + +@@ -113,9 +115,7 @@ + + void UnhandledOops::clear_unhandled_oops() { + assert (CheckUnhandledOops, "should only be called with checking option"); +- if (_thread->is_gc_locked_out()) { +- return; +- } ++ + for (int k = 0; k < _oop_list->length(); k++) { + UnhandledOopEntry entry = _oop_list->at(k); + // If an entry is on the unhandled oop list but isn't on the stack +--- ./hotspot/src/share/vm/runtime/vframe.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vframe.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -46,6 +46,8 @@ + #include "runtime/vframeArray.hpp" + #include "runtime/vframe_hp.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + vframe::vframe(const frame* fr, const RegisterMap* reg_map, JavaThread* thread) + : _reg_map(reg_map), _thread(thread) { + assert(fr != NULL, "must have frame"); +@@ -197,6 +199,7 @@ + continue; + } + if (monitor->owner() != NULL) { ++ // the monitor is associated with an object, i.e., it is locked + + // First, assume we have the monitor locked. If we haven't found an + // owned monitor before and this is the first frame, then we need to +@@ -207,7 +210,11 @@ + if (!found_first_monitor && frame_count == 0) { + markOop mark = monitor->owner()->mark(); + if (mark->has_monitor() && +- mark->monitor() == thread()->current_pending_monitor()) { ++ ( // we have marked ourself as pending on this monitor ++ mark->monitor() == thread()->current_pending_monitor() || ++ // we are not the owner of this monitor ++ !mark->monitor()->is_entered(thread()) ++ )) { + lock_state = "waiting to lock"; + } + } +--- ./hotspot/src/share/vm/runtime/vframe.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vframe.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -399,7 +399,7 @@ + if (WizardMode) { + tty->print_cr("Error in fill_from_frame: pc_desc for " + INTPTR_FORMAT " not found or invalid at %d", +- _frame.pc(), decode_offset); ++ p2i(_frame.pc()), decode_offset); + nm()->print(); + nm()->method()->print_codes(); + nm()->print_code(); +--- ./hotspot/src/share/vm/runtime/vframeArray.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vframeArray.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -43,6 +43,7 @@ + #include "opto/runtime.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + int vframeArrayElement:: bci(void) const { return (_bci == SynchronizationEntryBCI ? 0 : _bci); } + +@@ -418,24 +419,20 @@ + + } + +-int vframeArrayElement::on_stack_size(int caller_actual_parameters, +- int callee_parameters, ++int vframeArrayElement::on_stack_size(int callee_parameters, + int callee_locals, + bool is_top_frame, +- bool is_bottom_frame, + int popframe_extra_stack_expression_els) const { + assert(method()->max_locals() == locals()->size(), "just checking"); + int locks = monitors() == NULL ? 0 : monitors()->number_of_monitors(); + int temps = expressions()->size(); +- return Interpreter::size_activation(method(), ++ return Interpreter::size_activation(method()->max_stack(), + temps + callee_parameters, + popframe_extra_stack_expression_els, + locks, +- caller_actual_parameters, + callee_parameters, + callee_locals, +- is_top_frame, +- is_bottom_frame); ++ is_top_frame); + } + + +--- ./hotspot/src/share/vm/runtime/vframeArray.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vframeArray.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -85,10 +85,8 @@ + + // Returns the on stack word size for this frame + // callee_parameters is the number of callee locals residing inside this frame +- int on_stack_size(int caller_actual_parameters, +- int callee_parameters, ++ int on_stack_size(int callee_parameters, + int callee_locals, +- bool is_bottom_frame, + bool is_top_frame, + int popframe_extra_stack_expression_els) const; + +--- ./hotspot/src/share/vm/runtime/virtualspace.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/virtualspace.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -36,10 +36,14 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + // ReservedSpace + +--- ./hotspot/src/share/vm/runtime/vmStructs.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -142,6 +142,9 @@ + #ifdef TARGET_OS_ARCH_linux_ppc + # include "vmStructs_linux_ppc.hpp" + #endif ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "vmStructs_aix_ppc.hpp" ++#endif + #ifdef TARGET_OS_ARCH_bsd_x86 + # include "vmStructs_bsd_x86.hpp" + #endif +@@ -198,10 +201,13 @@ + #ifdef TARGET_ARCH_MODEL_arm + # include "adfiles/adGlobals_arm.hpp" + #endif +-#ifdef TARGET_ARCH_MODEL_ppc +-# include "adfiles/adGlobals_ppc.hpp" ++#ifdef TARGET_ARCH_MODEL_ppc_32 ++# include "adfiles/adGlobals_ppc_32.hpp" + #endif ++#ifdef TARGET_ARCH_MODEL_ppc_64 ++# include "adfiles/adGlobals_ppc_64.hpp" + #endif ++#endif // COMPILER2 + + // Note: the cross-product of (c1, c2, product, nonproduct, ...), + // (nonstatic, static), and (unchecked, checked) has not been taken. +@@ -242,7 +248,7 @@ + typedef Hashtable KlassHashtable; + typedef HashtableEntry KlassHashtableEntry; + typedef TwoOopHashtable SymbolTwoOopHashtable; +-typedef BinaryTreeDictionary MetablockTreeDictionary; ++typedef BinaryTreeDictionary > MetablockTreeDictionary; + + //-------------------------------------------------------------------------------- + // VM_STRUCTS +@@ -1814,6 +1820,8 @@ + declare_c2_type(MemBarNode, MultiNode) \ + declare_c2_type(MemBarAcquireNode, MemBarNode) \ + declare_c2_type(MemBarReleaseNode, MemBarNode) \ ++ declare_c2_type(LoadFenceNode, MemBarNode) \ ++ declare_c2_type(StoreFenceNode, MemBarNode) \ + declare_c2_type(MemBarVolatileNode, MemBarNode) \ + declare_c2_type(MemBarCPUOrderNode, MemBarNode) \ + declare_c2_type(InitializeNode, MemBarNode) \ +@@ -1938,15 +1946,6 @@ + declare_c2_type(CmpF3Node, CmpFNode) \ + declare_c2_type(CmpDNode, CmpNode) \ + declare_c2_type(CmpD3Node, CmpDNode) \ +- declare_c2_type(MathExactNode, MultiNode) \ +- declare_c2_type(MathExactINode, MathExactNode) \ +- declare_c2_type(AddExactINode, MathExactINode) \ +- declare_c2_type(AddExactLNode, MathExactLNode) \ +- declare_c2_type(SubExactINode, MathExactINode) \ +- declare_c2_type(SubExactLNode, MathExactLNode) \ +- declare_c2_type(NegExactINode, MathExactINode) \ +- declare_c2_type(MulExactINode, MathExactINode) \ +- declare_c2_type(FlagsProjNode, ProjNode) \ + declare_c2_type(BoolNode, Node) \ + declare_c2_type(AbsNode, Node) \ + declare_c2_type(AbsINode, AbsNode) \ +@@ -2027,6 +2026,15 @@ + declare_c2_type(ExtractLNode, ExtractNode) \ + declare_c2_type(ExtractFNode, ExtractNode) \ + declare_c2_type(ExtractDNode, ExtractNode) \ ++ declare_c2_type(OverflowNode, CmpNode) \ ++ declare_c2_type(OverflowINode, OverflowNode) \ ++ declare_c2_type(OverflowAddINode, OverflowINode) \ ++ declare_c2_type(OverflowSubINode, OverflowINode) \ ++ declare_c2_type(OverflowMulINode, OverflowINode) \ ++ declare_c2_type(OverflowLNode, OverflowNode) \ ++ declare_c2_type(OverflowAddLNode, OverflowLNode) \ ++ declare_c2_type(OverflowSubLNode, OverflowLNode) \ ++ declare_c2_type(OverflowMulLNode, OverflowLNode) \ + \ + /*********************/ \ + /* Adapter Blob Entries */ \ +--- ./hotspot/src/share/vm/runtime/vmThread.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vmThread.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -46,6 +46,8 @@ + HS_DTRACE_PROBE_DECL3(hotspot, vmops__end, char *, uintptr_t, int); + #endif /* !USDT2 */ + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // Dummy VM operation to act as first element in our circular double-linked list + class VM_Dummy: public VM_Operation { + VMOp_Type type() const { return VMOp_Dummy; } +@@ -316,6 +318,9 @@ + _terminate_lock->notify(); + } + ++ // Thread destructor usually does this. ++ ThreadLocalStorage::set_thread(NULL); ++ + // Deletion must be done synchronously by the JNI DestroyJavaVM thread + // so that the VMThread deletion completes before the main thread frees + // up the CodeHeap. +--- ./hotspot/src/share/vm/runtime/vm_operations.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vm_operations.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -39,6 +39,8 @@ + #include "services/threadService.hpp" + #include "trace/tracing.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #define VM_OP_NAME_INITIALIZE(name) #name, + + const char* VM_Operation::_names[VM_Operation::VMOp_Terminating] = \ +--- ./hotspot/src/share/vm/runtime/vm_operations.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vm_operations.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -94,6 +94,8 @@ + template(JFRCheckpoint) \ + template(Exit) \ + template(LinuxDllLoad) \ ++ template(RotateGCLog) \ ++ template(WhiteBoxOperation) \ + + class VM_Operation: public CHeapObj { + public: +@@ -397,4 +399,15 @@ + void doit(); + }; + ++ ++class VM_RotateGCLog: public VM_Operation { ++ private: ++ outputStream* _out; ++ ++ public: ++ VM_RotateGCLog(outputStream* st) : _out(st) {} ++ VMOp_Type type() const { return VMOp_RotateGCLog; } ++ void doit() { gclog_or_tty->rotate_log(true, _out); } ++}; ++ + #endif // SHARE_VM_RUNTIME_VM_OPERATIONS_HPP +--- ./hotspot/src/share/vm/runtime/vm_version.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/vm_version.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -177,6 +177,7 @@ + #define OS LINUX_ONLY("linux") \ + WINDOWS_ONLY("windows") \ + SOLARIS_ONLY("solaris") \ ++ AIX_ONLY("aix") \ + BSD_ONLY("bsd") + + #ifdef ZERO +@@ -186,7 +187,8 @@ + IA64_ONLY("ia64") \ + AMD64_ONLY("amd64") \ + ARM_ONLY("arm") \ +- PPC_ONLY("ppc") \ ++ PPC32_ONLY("ppc") \ ++ PPC64_ONLY("ppc64") \ + SPARC_ONLY("sparc") + #endif // ZERO + +@@ -238,6 +240,9 @@ + #endif + #elif defined(__GNUC__) + #define HOTSPOT_BUILD_COMPILER "gcc " __VERSION__ ++ #elif defined(__IBMCPP__) ++ #define HOTSPOT_BUILD_COMPILER "xlC " XSTR(__IBMCPP__) ++ + #else + #define HOTSPOT_BUILD_COMPILER "unknown compiler" + #endif +@@ -250,7 +255,7 @@ + #define FLOAT_ARCH_STR "-e500v2" + #elif defined(ARM) + #define FLOAT_ARCH_STR "-vfp" +- #elif defined(PPC) ++ #elif defined(PPC32) + #define FLOAT_ARCH_STR "-hflt" + #else + #define FLOAT_ARCH_STR "" +--- ./hotspot/src/share/vm/services/attachListener.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/attachListener.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -282,6 +282,20 @@ + return JNI_ERR; + } + } ++ ++ if (strncmp(name, "MaxHeapFreeRatio", 17) == 0) { ++ FormatBuffer<80> err_msg("%s", ""); ++ if (!Arguments::verify_MaxHeapFreeRatio(err_msg, value)) { ++ out->print_cr("%s", err_msg.buffer()); ++ return JNI_ERR; ++ } ++ } else if (strncmp(name, "MinHeapFreeRatio", 17) == 0) { ++ FormatBuffer<80> err_msg("%s", ""); ++ if (!Arguments::verify_MinHeapFreeRatio(err_msg, value)) { ++ out->print_cr("%s", err_msg.buffer()); ++ return JNI_ERR; ++ } ++ } + bool res = CommandLineFlags::uintxAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND); + if (! res) { + out->print_cr("setting flag %s failed", name); +@@ -367,7 +381,7 @@ + Flag* f = Flag::find_flag((char*)name, strlen(name)); + if (f) { + f->print_as_flag(out); +- out->print_cr(""); ++ out->cr(); + } else { + out->print_cr("no such flag '%s'", name); + } +--- ./hotspot/src/share/vm/services/classLoadingService.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/classLoadingService.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -157,7 +157,7 @@ + + if (TraceClassUnloading) { + ResourceMark rm; +- tty->print_cr("[Unloading class %s " INTPTR_FORMAT "]", k->external_name(), k); ++ tty->print_cr("[Unloading class %s " INTPTR_FORMAT "]", k->external_name(), p2i(k)); + } + } + +--- ./hotspot/src/share/vm/services/diagnosticCommand.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/diagnosticCommand.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -32,6 +32,8 @@ + #include "services/management.hpp" + #include "utilities/macros.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + void DCmdRegistrant::register_dcmds(){ + // Registration of the diagnostic commands + // First argument specifies which interfaces will export the command +@@ -53,6 +55,7 @@ + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); + #endif // INCLUDE_SERVICES + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); ++ DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); + + // Enhanced JMX Agent Support + // These commands won't be exported via the DiagnosticCommandMBean until an +@@ -98,7 +101,7 @@ + if (factory != NULL) { + output()->print_cr("%s%s", factory->name(), + factory->is_enabled() ? "" : " [disabled]"); +- output()->print_cr(factory->description()); ++ output()->print_cr("%s", factory->description()); + output()->print_cr("\nImpact: %s", factory->impact()); + JavaPermission p = factory->permission(); + if(p._class != NULL) { +@@ -650,3 +653,11 @@ + JavaCalls::call_static(&result, ik, vmSymbols::stopRemoteAgent_name(), vmSymbols::void_method_signature(), CHECK); + } + ++void RotateGCLogDCmd::execute(DCmdSource source, TRAPS) { ++ if (UseGCLogFileRotation) { ++ VM_RotateGCLog rotateop(output()); ++ VMThread::execute(&rotateop); ++ } else { ++ output()->print_cr("Target VM does not support GC log file rotation."); ++ } ++} +--- ./hotspot/src/share/vm/services/diagnosticCommand.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/diagnosticCommand.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -360,4 +360,21 @@ + virtual void execute(DCmdSource source, TRAPS); + }; + ++class RotateGCLogDCmd : public DCmd { ++public: ++ RotateGCLogDCmd(outputStream* output, bool heap) : DCmd(output, heap) {} ++ static const char* name() { return "GC.rotate_log"; } ++ static const char* description() { ++ return "Force the GC log file to be rotated."; ++ } ++ static const char* impact() { return "Low"; } ++ virtual void execute(DCmdSource source, TRAPS); ++ static int num_arguments() { return 0; } ++ static const JavaPermission permission() { ++ JavaPermission p = {"java.lang.management.ManagementPermission", ++ "control", NULL}; ++ return p; ++ } ++}; ++ + #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP +--- ./hotspot/src/share/vm/services/diagnosticFramework.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/diagnosticFramework.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -259,7 +259,7 @@ + } + arg = arg->next(); + } +- out->print_cr(""); ++ out->cr(); + if (_arguments_list != NULL) { + out->print_cr("\nArguments:"); + arg = _arguments_list; +@@ -268,7 +268,7 @@ + arg->is_mandatory() ? "" : "[optional]", + arg->description(), arg->type()); + if (arg->has_default()) { +- out->print(arg->default_string()); ++ out->print("%s", arg->default_string()); + } else { + out->print("no default value"); + } +@@ -284,7 +284,7 @@ + arg->is_mandatory() ? "" : "[optional]", + arg->description(), arg->type()); + if (arg->has_default()) { +- out->print(arg->default_string()); ++ out->print("%s", arg->default_string()); + } else { + out->print("no default value"); + } +--- ./hotspot/src/share/vm/services/heapDumper.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/heapDumper.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -1830,6 +1830,7 @@ + } + + // dump the heap to given path. ++PRAGMA_FORMAT_NONLITERAL_IGNORED_EXTERNAL + int HeapDumper::dump(const char* path) { + assert(path != NULL && strlen(path) > 0, "path missing"); + +@@ -1870,7 +1871,10 @@ + char msg[256]; + sprintf(msg, "Heap dump file created [%s bytes in %3.3f secs]", + JLONG_FORMAT, timer()->seconds()); ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL + tty->print_cr(msg, writer.bytes_written()); ++PRAGMA_DIAG_POP + } else { + tty->print_cr("Dump file is incomplete: %s", writer.error()); + } +--- ./hotspot/src/share/vm/services/lowMemoryDetector.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/lowMemoryDetector.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -353,7 +353,7 @@ + + #ifndef PRODUCT + void SensorInfo::print() { +- tty->print_cr("%s count = " SIZE_FORMAT " pending_triggers = %ld pending_clears = %ld", ++ tty->print_cr("%s count = " SIZE_FORMAT " pending_triggers = %d pending_clears = %d", + (_sensor_on ? "on" : "off"), + _sensor_count, _pending_trigger_count, _pending_clear_count); + } +--- ./hotspot/src/share/vm/services/management.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/management.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -55,6 +55,8 @@ + #include "services/threadService.hpp" + #include "utilities/macros.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + PerfVariable* Management::_begin_vm_creation_time = NULL; + PerfVariable* Management::_end_vm_creation_time = NULL; + PerfVariable* Management::_vm_init_done_time = NULL; +@@ -1830,6 +1832,18 @@ + succeed = CommandLineFlags::intxAtPut(name, &ivalue, Flag::MANAGEMENT); + } else if (flag->is_uintx()) { + uintx uvalue = (uintx)new_value.j; ++ ++ if (strncmp(name, "MaxHeapFreeRatio", 17) == 0) { ++ FormatBuffer<80> err_msg("%s", ""); ++ if (!Arguments::verify_MaxHeapFreeRatio(err_msg, uvalue)) { ++ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg.buffer()); ++ } ++ } else if (strncmp(name, "MinHeapFreeRatio", 17) == 0) { ++ FormatBuffer<80> err_msg("%s", ""); ++ if (!Arguments::verify_MinHeapFreeRatio(err_msg, uvalue)) { ++ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg.buffer()); ++ } ++ } + succeed = CommandLineFlags::uintxAtPut(name, &uvalue, Flag::MANAGEMENT); + } else if (flag->is_uint64_t()) { + uint64_t uvalue = (uint64_t)new_value.j; +--- ./hotspot/src/share/vm/services/memReporter.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/memReporter.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -28,6 +28,8 @@ + #include "services/memPtrArray.hpp" + #include "services/memTracker.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + const char* BaselineOutputer::memory_unit(size_t scale) { + switch(scale) { + case K: return "KB"; +--- ./hotspot/src/share/vm/services/memSnapshot.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/memSnapshot.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -31,6 +31,8 @@ + #include "services/memSnapshot.hpp" + #include "services/memTracker.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #ifdef ASSERT + + void decode_pointer_record(MemPointerRecord* rec) { +@@ -733,7 +735,7 @@ + if (os::dll_address_to_function_name(ex->pc(), buf, sizeof(buf), NULL)) { + tty->print_cr("\t%s", buf); + } else { +- tty->print_cr(""); ++ tty->cr(); + } + } + } +--- ./hotspot/src/share/vm/services/memTrackWorker.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/memTrackWorker.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -43,7 +43,7 @@ + // create thread uses cgc thread type for now. We should revisit + // the option, or create new thread type. + _has_error = !os::create_thread(this, os::cgc_thread); +- set_name("MemTrackWorker", 0); ++ set_name("MemTrackWorker"); + + // initial generation circuit buffer + if (!has_error()) { +--- ./hotspot/src/share/vm/services/memoryPool.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/memoryPool.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -268,7 +268,7 @@ + } + + size_t MetaspacePool::used_in_bytes() { +- return MetaspaceAux::allocated_used_bytes(); ++ return MetaspaceAux::used_bytes(); + } + + size_t MetaspacePool::calculate_max_size() const { +@@ -280,7 +280,7 @@ + MemoryPool("Compressed Class Space", NonHeap, 0, CompressedClassSpaceSize, true, false) { } + + size_t CompressedKlassSpacePool::used_in_bytes() { +- return MetaspaceAux::allocated_used_bytes(Metaspace::ClassType); ++ return MetaspaceAux::used_bytes(Metaspace::ClassType); + } + + MemoryUsage CompressedKlassSpacePool::get_memory_usage() { +--- ./hotspot/src/share/vm/services/nmtDCmd.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/nmtDCmd.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -128,7 +128,7 @@ + // native memory tracking has to be on + if (!MemTracker::is_on() || MemTracker::shutdown_in_progress()) { + // if it is not on, what's the reason? +- output()->print_cr(MemTracker::reason()); ++ output()->print_cr("%s", MemTracker::reason()); + return; + } + +--- ./hotspot/src/share/vm/services/threadService.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/services/threadService.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -37,6 +37,8 @@ + #include "runtime/vm_operations.hpp" + #include "services/threadService.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // TODO: we need to define a naming convention for perf counters + // to distinguish counters for: + // - standard JSR174 use +--- ./hotspot/src/share/vm/shark/llvmHeaders.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/shark/llvmHeaders.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -36,21 +36,43 @@ + #endif + + #include ++#include ++ ++// includes specific to each version ++#if SHARK_LLVM_VERSION <= 31 ++#include ++#include + #include + #include + #include +-#include + #include + #include + #include +-#if SHARK_LLVM_VERSION <= 31 +-#include +-#else ++#elif SHARK_LLVM_VERSION <= 32 + #include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#else // SHARK_LLVM_VERSION <= 34 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include + #endif ++ ++// common includes + #include + #include +-#include + #include + #include + #include +--- ./hotspot/src/share/vm/shark/sharkMemoryManager.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/shark/sharkMemoryManager.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -59,18 +59,6 @@ + entry->set_code_limit(FunctionEnd); + } + +-unsigned char* SharkMemoryManager::startExceptionTable(const Function* F, +- uintptr_t& ActualSize) { +- return mm()->startExceptionTable(F, ActualSize); +-} +- +-void SharkMemoryManager::endExceptionTable(const Function* F, +- unsigned char* TableStart, +- unsigned char* TableEnd, +- unsigned char* FrameRegister) { +- mm()->endExceptionTable(F, TableStart, TableEnd, FrameRegister); +-} +- + void SharkMemoryManager::setMemoryWritable() { + mm()->setMemoryWritable(); + } +@@ -79,10 +67,6 @@ + mm()->setMemoryExecutable(); + } + +-void SharkMemoryManager::deallocateExceptionTable(void *ptr) { +- mm()->deallocateExceptionTable(ptr); +-} +- + void SharkMemoryManager::deallocateFunctionBody(void *ptr) { + mm()->deallocateFunctionBody(ptr); + } +@@ -96,6 +80,17 @@ + return mm()->getPointerToNamedFunction(Name, AbortOnFailure); + } + ++void SharkMemoryManager::setPoisonMemory(bool poison) { ++ mm()->setPoisonMemory(poison); ++} ++ ++unsigned char *SharkMemoryManager::allocateSpace(intptr_t Size, ++ unsigned int Alignment) { ++ return mm()->allocateSpace(Size, Alignment); ++} ++ ++#if SHARK_LLVM_VERSION <= 32 ++ + uint8_t* SharkMemoryManager::allocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID) { + return mm()->allocateCodeSection(Size, Alignment, SectionID); + } +@@ -104,11 +99,34 @@ + return mm()->allocateDataSection(Size, Alignment, SectionID); + } + +-void SharkMemoryManager::setPoisonMemory(bool poison) { +- mm()->setPoisonMemory(poison); ++void SharkMemoryManager::deallocateExceptionTable(void *ptr) { ++ mm()->deallocateExceptionTable(ptr); + } + +-unsigned char *SharkMemoryManager::allocateSpace(intptr_t Size, +- unsigned int Alignment) { +- return mm()->allocateSpace(Size, Alignment); ++unsigned char* SharkMemoryManager::startExceptionTable(const Function* F, ++ uintptr_t& ActualSize) { ++ return mm()->startExceptionTable(F, ActualSize); + } ++ ++void SharkMemoryManager::endExceptionTable(const Function* F, ++ unsigned char* TableStart, ++ unsigned char* TableEnd, ++ unsigned char* FrameRegister) { ++ mm()->endExceptionTable(F, TableStart, TableEnd, FrameRegister); ++} ++ ++#else ++ ++uint8_t *SharkMemoryManager::allocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, StringRef SectionName) { ++ return mm()->allocateCodeSection(Size, Alignment, SectionID, SectionName); ++} ++ ++uint8_t* SharkMemoryManager::allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, StringRef SectionName, bool IsReadOnly) { ++ return mm()->allocateDataSection(Size, Alignment, SectionID, SectionName, IsReadOnly); ++} ++ ++bool SharkMemoryManager::finalizeMemory(std::string *ErrMsg) { ++ return mm()->finalizeMemory(ErrMsg); ++} ++ ++#endif +--- ./hotspot/src/share/vm/shark/sharkMemoryManager.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/shark/sharkMemoryManager.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -69,23 +69,32 @@ + void endFunctionBody(const llvm::Function* F, + unsigned char* FunctionStart, + unsigned char* FunctionEnd); +- unsigned char* startExceptionTable(const llvm::Function* F, +- uintptr_t& ActualSize); +- void endExceptionTable(const llvm::Function* F, +- unsigned char* TableStart, +- unsigned char* TableEnd, +- unsigned char* FrameRegister); ++ + void *getPointerToNamedFunction(const std::string &Name, bool AbortOnFailure = true); +- uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID); +- uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID); + void setPoisonMemory(bool); + uint8_t* allocateGlobal(uintptr_t, unsigned int); + void setMemoryWritable(); + void setMemoryExecutable(); +- void deallocateExceptionTable(void *ptr); + void deallocateFunctionBody(void *ptr); + unsigned char *allocateSpace(intptr_t Size, + unsigned int Alignment); ++ ++#if SHARK_LLVM_VERSION <= 32 ++uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID); ++uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID); ++unsigned char* startExceptionTable(const llvm::Function* F, ++ uintptr_t& ActualSize); ++void deallocateExceptionTable(void *ptr); ++void endExceptionTable(const llvm::Function* F, ++ unsigned char* TableStart, ++ unsigned char* TableEnd, ++ unsigned char* FrameRegister); ++#else ++uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, llvm::StringRef SectionName); ++uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, unsigned SectionID, llvm::StringRef SectionName, bool IsReadOnly); ++bool finalizeMemory(std::string *ErrMsg = 0); ++#endif ++ + }; + + #endif // SHARE_VM_SHARK_SHARKMEMORYMANAGER_HPP +--- ./hotspot/src/share/vm/trace/trace.xml Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/trace/trace.xml Wed Jul 30 03:51:43 2014 -0700 +@@ -122,6 +122,46 @@ + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +@@ -145,7 +185,7 @@ + + + +- ++ + + + +@@ -153,11 +193,48 @@ + + + ++ + + + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +--- ./hotspot/src/share/vm/trace/traceStream.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/trace/traceStream.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -66,7 +66,7 @@ + } + + void print_val(const char* label, s8 val) { +- _st.print("%s = "INT64_FORMAT, label, val); ++ _st.print("%s = "INT64_FORMAT, label, (int64_t) val); + } + + void print_val(const char* label, bool val) { +@@ -113,7 +113,7 @@ + } + + void print(const char* val) { +- _st.print(val); ++ _st.print("%s", val); + } + }; + +--- ./hotspot/src/share/vm/trace/tracetypes.xml Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/trace/tracetypes.xml Wed Jul 30 03:51:43 2014 -0700 +@@ -85,12 +85,6 @@ + + + +- +- +- +- +- + + +@@ -116,17 +110,6 @@ + + + +- +- +- +- +- +- +- +- +- +- + + +@@ -147,11 +130,26 @@ + + + ++ ++ ++ ++ + + + + ++ ++ ++ ++ ++ ++ ++ ++ + + +@@ -167,6 +165,11 @@ + + + ++ ++ ++ ++ + + + +@@ -336,10 +339,22 @@ + + ++ ++ ++ + + + ++ ++ ++ ++ ++ ++ + + +@@ -351,6 +366,10 @@ + + ++ ++ ++ + + + +--- ./hotspot/src/share/vm/utilities/accessFlags.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/accessFlags.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -34,6 +34,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +--- ./hotspot/src/share/vm/utilities/array.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/array.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -58,7 +58,7 @@ + + void initialize(size_t esize, int length) { + assert(length >= 0, "illegal length"); +- assert(_data == NULL, "must be new object"); ++ assert(StressRewriter || _data == NULL, "must be new object"); + _length = length; + _data = resource_allocate_bytes(esize * length); + DEBUG_ONLY(init_nesting();) +@@ -375,7 +375,7 @@ + + // FIXME: How to handle this? + void print_value_on(outputStream* st) const { +- st->print("Array(" INTPTR_FORMAT ")", this); ++ st->print("Array(" INTPTR_FORMAT ")", p2i(this)); + } + + #ifndef PRODUCT +--- ./hotspot/src/share/vm/utilities/bitMap.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/bitMap.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -35,6 +35,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +@@ -107,7 +110,7 @@ + while (true) { + intptr_t res = Atomic::cmpxchg_ptr(nw, pw, w); + if (res == w) break; +- w = *pw; ++ w = res; + nw = value ? (w | ~mr) : (w & mr); + } + } +@@ -520,13 +523,13 @@ + + void BitMap::print_on_error(outputStream* st, const char* prefix) const { + st->print_cr("%s[" PTR_FORMAT ", " PTR_FORMAT ")", +- prefix, map(), (char*)map() + (size() >> LogBitsPerByte)); ++ prefix, p2i(map()), p2i((char*)map() + (size() >> LogBitsPerByte))); + } + + #ifndef PRODUCT + + void BitMap::print_on(outputStream* st) const { +- tty->print("Bitmap(%d):", size()); ++ tty->print("Bitmap(" SIZE_FORMAT "):", size()); + for (idx_t index = 0; index < size(); index++) { + tty->print("%c", at(index) ? '1' : '0'); + } +--- ./hotspot/src/share/vm/utilities/constantTag.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/constantTag.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -28,7 +28,7 @@ + #ifndef PRODUCT + + void constantTag::print_on(outputStream* st) const { +- st->print(internal_name()); ++ st->print("%s", internal_name()); + } + + #endif // PRODUCT +--- ./hotspot/src/share/vm/utilities/debug.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/debug.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -88,6 +88,8 @@ + # endif + #endif // PRODUCT + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + FormatBufferResource::FormatBufferResource(const char * format, ...) + : FormatBufferBase((char*)resource_allocate_bytes(RES_BUFSZ)) { + va_list argp; +@@ -96,6 +98,7 @@ + va_end(argp); + } + ++ATTRIBUTE_PRINTF(1, 2) + void warning(const char* format, ...) { + if (PrintWarnings) { + FILE* const err = defaultStream::error_stream(); +--- ./hotspot/src/share/vm/utilities/debug.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/debug.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -25,8 +25,8 @@ + #ifndef SHARE_VM_UTILITIES_DEBUG_HPP + #define SHARE_VM_UTILITIES_DEBUG_HPP + ++#include "utilities/globalDefinitions.hpp" + #include "prims/jvm.h" +-#include "utilities/globalDefinitions.hpp" + + #include + +@@ -43,17 +43,17 @@ + #define RES_BUFSZ 256 + class FormatBufferResource : public FormatBufferBase { + public: +- FormatBufferResource(const char * format, ...); ++ FormatBufferResource(const char * format, ...) ATTRIBUTE_PRINTF(2, 3); + }; + + // Use stack for buffer + template + class FormatBuffer : public FormatBufferBase { + public: +- inline FormatBuffer(const char * format, ...); +- inline void append(const char* format, ...); +- inline void print(const char* format, ...); +- inline void printv(const char* format, va_list ap); ++ inline FormatBuffer(const char * format, ...) ATTRIBUTE_PRINTF(2, 3); ++ inline void append(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ inline void print(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ inline void printv(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0); + + char* buffer() { return _buf; } + int size() { return bufsz; } +@@ -223,7 +223,7 @@ + void report_unimplemented(const char* file, int line); + void report_untested(const char* file, int line, const char* message); + +-void warning(const char* format, ...); ++void warning(const char* format, ...) ATTRIBUTE_PRINTF(1, 2); + + #ifdef ASSERT + // Compile-time asserts. +--- ./hotspot/src/share/vm/utilities/decoder.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/decoder.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -32,6 +32,8 @@ + #include "decoder_windows.hpp" + #elif defined(__APPLE__) + #include "decoder_machO.hpp" ++#elif defined(AIX) ++ #include "decoder_aix.hpp" + #else + #include "decoder_elf.hpp" + #endif +@@ -66,6 +68,8 @@ + decoder = new (std::nothrow) WindowsDecoder(); + #elif defined (__APPLE__) + decoder = new (std::nothrow)MachODecoder(); ++#elif defined(AIX) ++ decoder = new (std::nothrow)AIXDecoder(); + #else + decoder = new (std::nothrow)ElfDecoder(); + #endif +--- ./hotspot/src/share/vm/utilities/decoder_elf.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/decoder_elf.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -73,4 +73,4 @@ + + return file; + } +-#endif ++#endif // !_WINDOWS && !__APPLE__ +--- ./hotspot/src/share/vm/utilities/decoder_elf.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/decoder_elf.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2011, 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 +@@ -55,5 +55,5 @@ + ElfFile* _opened_elf_files; + }; + +-#endif ++#endif // !_WINDOWS && !__APPLE__ + #endif // SHARE_VM_UTILITIES_DECODER_ELF_HPP +--- ./hotspot/src/share/vm/utilities/elfFile.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/elfFile.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -34,6 +34,7 @@ + #include "memory/allocation.inline.hpp" + #include "utilities/decoder.hpp" + #include "utilities/elfFile.hpp" ++#include "utilities/elfFuncDescTable.hpp" + #include "utilities/elfStringTable.hpp" + #include "utilities/elfSymbolTable.hpp" + +@@ -43,6 +44,7 @@ + memset(&m_elfHdr, 0, sizeof(m_elfHdr)); + m_string_tables = NULL; + m_symbol_tables = NULL; ++ m_funcDesc_table = NULL; + m_next = NULL; + m_status = NullDecoder::no_error; + +@@ -119,8 +121,8 @@ + m_status = NullDecoder::file_invalid; + return false; + } +- // string table + if (shdr.sh_type == SHT_STRTAB) { ++ // string tables + ElfStringTable* table = new (std::nothrow) ElfStringTable(m_file, shdr, index); + if (table == NULL) { + m_status = NullDecoder::out_of_memory; +@@ -128,6 +130,7 @@ + } + add_string_table(table); + } else if (shdr.sh_type == SHT_SYMTAB || shdr.sh_type == SHT_DYNSYM) { ++ // symbol tables + ElfSymbolTable* table = new (std::nothrow) ElfSymbolTable(m_file, shdr); + if (table == NULL) { + m_status = NullDecoder::out_of_memory; +@@ -136,6 +139,46 @@ + add_symbol_table(table); + } + } ++ ++#if defined(PPC64) && !defined(ABI_ELFv2) ++ // Now read the .opd section wich contains the PPC64 function descriptor table. ++ // The .opd section is only available on PPC64 (see for example: ++ // http://refspecs.linuxfoundation.org/LSB_3.1.1/LSB-Core-PPC64/LSB-Core-PPC64/specialsections.html) ++ // so this code should do no harm on other platforms but because of performance reasons we only ++ // execute it on PPC64 platforms. ++ // Notice that we can only find the .opd section after we have successfully read in the string ++ // tables in the previous loop, because we need to query the name of each section which is ++ // contained in one of the string tables (i.e. the one with the index m_elfHdr.e_shstrndx). ++ ++ // Reset the file pointer ++ if (fseek(m_file, m_elfHdr.e_shoff, SEEK_SET)) { ++ m_status = NullDecoder::file_invalid; ++ return false; ++ } ++ for (int index = 0; index < m_elfHdr.e_shnum; index ++) { ++ if (fread((void*)&shdr, sizeof(Elf_Shdr), 1, m_file) != 1) { ++ m_status = NullDecoder::file_invalid; ++ return false; ++ } ++ if (m_elfHdr.e_shstrndx != SHN_UNDEF && shdr.sh_type == SHT_PROGBITS) { ++ ElfStringTable* string_table = get_string_table(m_elfHdr.e_shstrndx); ++ if (string_table == NULL) { ++ m_status = NullDecoder::file_invalid; ++ return false; ++ } ++ char buf[8]; // '8' is enough because we only want to read ".opd" ++ if (string_table->string_at(shdr.sh_name, buf, sizeof(buf)) && !strncmp(".opd", buf, 4)) { ++ m_funcDesc_table = new (std::nothrow) ElfFuncDescTable(m_file, shdr, index); ++ if (m_funcDesc_table == NULL) { ++ m_status = NullDecoder::out_of_memory; ++ return false; ++ } ++ break; ++ } ++ } ++ } ++#endif ++ + } + return true; + } +@@ -151,8 +194,9 @@ + int off = INT_MAX; + bool found_symbol = false; + while (symbol_table != NULL) { +- if (symbol_table->lookup(addr, &string_table_index, &pos_in_string_table, &off)) { ++ if (symbol_table->lookup(addr, &string_table_index, &pos_in_string_table, &off, m_funcDesc_table)) { + found_symbol = true; ++ break; + } + symbol_table = symbol_table->m_next; + } +@@ -221,4 +265,4 @@ + } + #endif + +-#endif // _WINDOWS ++#endif // !_WINDOWS && !__APPLE__ +--- ./hotspot/src/share/vm/utilities/elfFile.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/elfFile.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -75,6 +75,7 @@ + + class ElfStringTable; + class ElfSymbolTable; ++class ElfFuncDescTable; + + + // On Solaris/Linux platforms, libjvm.so does contain all private symbols. +@@ -150,9 +151,12 @@ + // string tables + ElfStringTable* m_string_tables; + ++ // function descriptors table ++ ElfFuncDescTable* m_funcDesc_table; ++ + NullDecoder::decoder_status m_status; + }; + +-#endif // _WINDOWS ++#endif // !_WINDOWS && !__APPLE__ + + #endif // SHARE_VM_UTILITIES_ELF_FILE_HPP +--- ./hotspot/src/share/vm/utilities/elfFuncDescTable.cpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/utilities/elfFuncDescTable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,104 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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" ++ ++#if !defined(_WINDOWS) && !defined(__APPLE__) ++ ++#include "memory/allocation.inline.hpp" ++#include "utilities/elfFuncDescTable.hpp" ++ ++ElfFuncDescTable::ElfFuncDescTable(FILE* file, Elf_Shdr shdr, int index) { ++ assert(file, "null file handle"); ++ // The actual function address (i.e. function entry point) is always the ++ // first value in the function descriptor (on IA64 and PPC64 they look as follows): ++ // PPC64: [function entry point, TOC pointer, environment pointer] ++ // IA64 : [function entry point, GP (global pointer) value] ++ // Unfortunately 'shdr.sh_entsize' doesn't always seem to contain this size (it's zero on PPC64) so we can't assert ++ // assert(IA64_ONLY(2) PPC64_ONLY(3) * sizeof(address) == shdr.sh_entsize, "Size mismatch for '.opd' section entries"); ++ ++ m_funcDescs = NULL; ++ m_file = file; ++ m_index = index; ++ m_status = NullDecoder::no_error; ++ ++ // try to load the function descriptor table ++ long cur_offset = ftell(file); ++ if (cur_offset != -1) { ++ // call malloc so we can back up if memory allocation fails. ++ m_funcDescs = (address*)os::malloc(shdr.sh_size, mtInternal); ++ if (m_funcDescs) { ++ if (fseek(file, shdr.sh_offset, SEEK_SET) || ++ fread((void*)m_funcDescs, shdr.sh_size, 1, file) != 1 || ++ fseek(file, cur_offset, SEEK_SET)) { ++ m_status = NullDecoder::file_invalid; ++ os::free(m_funcDescs); ++ m_funcDescs = NULL; ++ } ++ } ++ if (!NullDecoder::is_error(m_status)) { ++ memcpy(&m_shdr, &shdr, sizeof(Elf_Shdr)); ++ } ++ } else { ++ m_status = NullDecoder::file_invalid; ++ } ++} ++ ++ElfFuncDescTable::~ElfFuncDescTable() { ++ if (m_funcDescs != NULL) { ++ os::free(m_funcDescs); ++ } ++} ++ ++address ElfFuncDescTable::lookup(Elf_Word index) { ++ if (NullDecoder::is_error(m_status)) { ++ return NULL; ++ } ++ ++ if (m_funcDescs != NULL) { ++ if (m_shdr.sh_size > 0 && m_shdr.sh_addr <= index && index <= m_shdr.sh_addr + m_shdr.sh_size) { ++ // Notice that 'index' is a byte-offset into the function descriptor table. ++ return m_funcDescs[(index - m_shdr.sh_addr) / sizeof(address)]; ++ } ++ return NULL; ++ } else { ++ long cur_pos; ++ address addr; ++ if (!(m_shdr.sh_size > 0 && m_shdr.sh_addr <= index && index <= m_shdr.sh_addr + m_shdr.sh_size)) { ++ // don't put the whole decoder in error mode if we just tried a wrong index ++ return NULL; ++ } ++ if ((cur_pos = ftell(m_file)) == -1 || ++ fseek(m_file, m_shdr.sh_offset + index - m_shdr.sh_addr, SEEK_SET) || ++ fread(&addr, sizeof(addr), 1, m_file) != 1 || ++ fseek(m_file, cur_pos, SEEK_SET)) { ++ m_status = NullDecoder::file_invalid; ++ return NULL; ++ } ++ return addr; ++ } ++} ++ ++#endif // !_WINDOWS && !__APPLE__ +--- ./hotspot/src/share/vm/utilities/elfFuncDescTable.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/utilities/elfFuncDescTable.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,149 @@ ++/* ++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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_UTILITIES_ELF_FUNC_DESC_TABLE_HPP ++#define SHARE_VM_UTILITIES_ELF_FUNC_DESC_TABLE_HPP ++ ++#if !defined(_WINDOWS) && !defined(__APPLE__) ++ ++ ++#include "memory/allocation.hpp" ++#include "utilities/decoder.hpp" ++#include "utilities/elfFile.hpp" ++ ++/* ++ ++On PowerPC-64 (and other architectures like for example IA64) a pointer to a ++function is not just a plain code address, but instead a pointer to a so called ++function descriptor (which is simply a structure containing 3 pointers). ++This fact is also reflected in the ELF ABI for PowerPC-64. ++ ++On architectures like x86 or SPARC, the ELF symbol table contains the start ++address and size of an object. So for example for a function object (i.e. type ++'STT_FUNC') the symbol table's 'st_value' and 'st_size' fields directly ++represent the starting address and size of that function. On PPC64 however, the ++symbol table's 'st_value' field only contains an index into another, PPC64 ++specific '.opd' (official procedure descriptors) section, while the 'st_size' ++field still holds the size of the corresponding function. In order to get the ++actual start address of a function, it is necessary to read the corresponding ++function descriptor entry in the '.opd' section at the corresponding index and ++extract the start address from there. ++ ++That's exactly what this 'ElfFuncDescTable' class is used for. If the HotSpot ++runs on a PPC64 machine, and the corresponding ELF files contains an '.opd' ++section (which is actually mandatory on PPC64) it will be read into an object ++of type 'ElfFuncDescTable' just like the string and symbol table sections. ++Later on, during symbol lookup in 'ElfSymbolTable::lookup()' this function ++descriptor table will be used if available to find the real function address. ++ ++All this is how things work today (2013) on contemporary Linux distributions ++(i.e. SLES 10) and new version of GCC (i.e. > 4.0). However there is a history, ++and it goes like this: ++ ++In SLES 9 times (sometimes before GCC 3.4) gcc/ld on PPC64 generated two ++entries in the symbol table for every function. The value of the symbol with ++the name of the function was the address of the function descriptor while the ++dot '.' prefixed name was reserved to hold the actual address of that function ++(http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#FUNC-DES). ++ ++For a C-function 'foo' this resulted in two symbol table entries like this ++(extracted from the output of 'readelf -a '): ++ ++Section Headers: ++ [ 9] .text PROGBITS 0000000000000a20 00000a20 ++ 00000000000005a0 0000000000000000 AX 0 0 16 ++ [21] .opd PROGBITS 00000000000113b8 000013b8 ++ 0000000000000138 0000000000000000 WA 0 0 8 ++ ++Symbol table '.symtab' contains 86 entries: ++ Num: Value Size Type Bind Vis Ndx Name ++ 76: 00000000000114c0 24 FUNC GLOBAL DEFAULT 21 foo ++ 78: 0000000000000bb0 76 FUNC GLOBAL DEFAULT 9 .foo ++ ++You can see now that the '.foo' entry actually points into the '.text' segment ++('Ndx'=9) and its value and size fields represent the functions actual address ++and size. On the other hand, the entry for plain 'foo' points into the '.opd' ++section ('Ndx'=21) and its value and size fields are the index into the '.opd' ++section and the size of the corresponding '.opd' section entry (3 pointers on ++PPC64). ++ ++These so called 'dot symbols' were dropped around gcc 3.4 from GCC and BINUTILS, ++see http://gcc.gnu.org/ml/gcc-patches/2004-08/msg00557.html. ++But nevertheless it may still be necessary to support both formats because we ++either run on an old system or because it is possible at any time that functions ++appear in the stack trace which come from old-style libraries. ++ ++Therefore we not only have to check for the presence of the function descriptor ++table during symbol lookup in 'ElfSymbolTable::lookup()'. We additionally have ++to check that the symbol table entry references the '.opd' section. Only in ++that case we can resolve the actual function address from there. Otherwise we ++use the plain 'st_value' field from the symbol table as function address. This ++way we can also lookup the symbols in old-style ELF libraries (although we get ++the 'dotted' versions in that case). However, if present, the 'dot' will be ++conditionally removed on PPC64 from the symbol in 'ElfDecoder::demangle()' in ++decoder_linux.cpp. ++ ++Notice that we can not reliably get the function address from old-style ++libraries because the 'st_value' field of the symbol table entries which point ++into the '.opd' section denote the size of the corresponding '.opd' entry and ++not that of the corresponding function. This has changed for the symbol table ++entries in new-style libraries as described at the beginning of this ++documentation. ++ ++*/ ++ ++class ElfFuncDescTable: public CHeapObj { ++ friend class ElfFile; ++ public: ++ ElfFuncDescTable(FILE* file, Elf_Shdr shdr, int index); ++ ~ElfFuncDescTable(); ++ ++ // return the function address for the function descriptor at 'index' or NULL on error ++ address lookup(Elf_Word index); ++ ++ int get_index() { return m_index; }; ++ ++ NullDecoder::decoder_status get_status() { return m_status; }; ++ ++ protected: ++ // holds the complete function descriptor section if ++ // we can allocate enough memory ++ address* m_funcDescs; ++ ++ // file contains string table ++ FILE* m_file; ++ ++ // section header ++ Elf_Shdr m_shdr; ++ ++ // The section index of this function descriptor (i.e. '.opd') section in the ELF file ++ int m_index; ++ ++ NullDecoder::decoder_status m_status; ++}; ++ ++#endif // !_WINDOWS && !__APPLE__ ++ ++#endif // SHARE_VM_UTILITIES_ELF_FUNC_DESC_TABLE_HPP +--- ./hotspot/src/share/vm/utilities/elfStringTable.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/elfStringTable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 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 +@@ -87,4 +87,4 @@ + } + } + +-#endif // _WINDOWS ++#endif // !_WINDOWS && !__APPLE__ +--- ./hotspot/src/share/vm/utilities/elfStringTable.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/elfStringTable.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -70,6 +70,6 @@ + NullDecoder::decoder_status m_status; + }; + +-#endif // _WINDOWS and _APPLE ++#endif // !_WINDOWS && !__APPLE__ + + #endif // SHARE_VM_UTILITIES_ELF_STRING_TABLE_HPP +--- ./hotspot/src/share/vm/utilities/elfSymbolTable.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/elfSymbolTable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 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 +@@ -27,6 +27,7 @@ + #if !defined(_WINDOWS) && !defined(__APPLE__) + + #include "memory/allocation.inline.hpp" ++#include "utilities/elfFuncDescTable.hpp" + #include "utilities/elfSymbolTable.hpp" + + ElfSymbolTable::ElfSymbolTable(FILE* file, Elf_Shdr shdr) { +@@ -68,7 +69,7 @@ + } + } + +-bool ElfSymbolTable::lookup(address addr, int* stringtableIndex, int* posIndex, int* offset) { ++bool ElfSymbolTable::lookup(address addr, int* stringtableIndex, int* posIndex, int* offset, ElfFuncDescTable* funcDescTable) { + assert(stringtableIndex, "null string table index pointer"); + assert(posIndex, "null string table offset pointer"); + assert(offset, "null offset pointer"); +@@ -77,19 +78,25 @@ + return false; + } + +- address pc = 0; + size_t sym_size = sizeof(Elf_Sym); + assert((m_shdr.sh_size % sym_size) == 0, "check size"); + int count = m_shdr.sh_size / sym_size; + if (m_symbols != NULL) { + for (int index = 0; index < count; index ++) { + if (STT_FUNC == ELF_ST_TYPE(m_symbols[index].st_info)) { +- address sym_addr = (address)m_symbols[index].st_value; +- if (sym_addr < addr && (addr - sym_addr) < *offset) { +- pc = (address)m_symbols[index].st_value; +- *offset = (int)(addr - pc); ++ Elf_Word st_size = m_symbols[index].st_size; ++ address sym_addr; ++ if (funcDescTable != NULL && funcDescTable->get_index() == m_symbols[index].st_shndx) { ++ // We need to go another step trough the function descriptor table (currently PPC64 only) ++ sym_addr = funcDescTable->lookup(m_symbols[index].st_value); ++ } else { ++ sym_addr = (address)m_symbols[index].st_value; ++ } ++ if (sym_addr <= addr && (Elf_Word)(addr - sym_addr) < st_size) { ++ *offset = (int)(addr - sym_addr); + *posIndex = m_symbols[index].st_name; + *stringtableIndex = m_shdr.sh_link; ++ return true; + } + } + } +@@ -105,12 +112,19 @@ + for (int index = 0; index < count; index ++) { + if (fread(&sym, sym_size, 1, m_file) == 1) { + if (STT_FUNC == ELF_ST_TYPE(sym.st_info)) { +- address sym_addr = (address)sym.st_value; +- if (sym_addr < addr && (addr - sym_addr) < *offset) { +- pc = (address)sym.st_value; +- *offset = (int)(addr - pc); ++ Elf_Word st_size = sym.st_size; ++ address sym_addr; ++ if (funcDescTable != NULL && funcDescTable->get_index() == sym.st_shndx) { ++ // We need to go another step trough the function descriptor table (currently PPC64 only) ++ sym_addr = funcDescTable->lookup(sym.st_value); ++ } else { ++ sym_addr = (address)sym.st_value; ++ } ++ if (sym_addr <= addr && (Elf_Word)(addr - sym_addr) < st_size) { ++ *offset = (int)(addr - sym_addr); + *posIndex = sym.st_name; + *stringtableIndex = m_shdr.sh_link; ++ return true; + } + } + } else { +@@ -123,4 +137,4 @@ + return true; + } + +-#endif // _WINDOWS ++#endif // !_WINDOWS && !__APPLE__ +--- ./hotspot/src/share/vm/utilities/elfSymbolTable.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/elfSymbolTable.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 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 +@@ -45,7 +45,7 @@ + ~ElfSymbolTable(); + + // search the symbol that is nearest to the specified address. +- bool lookup(address addr, int* stringtableIndex, int* posIndex, int* offset); ++ bool lookup(address addr, int* stringtableIndex, int* posIndex, int* offset, ElfFuncDescTable* funcDescTable); + + NullDecoder::decoder_status get_status() { return m_status; }; + +@@ -65,6 +65,6 @@ + NullDecoder::decoder_status m_status; + }; + +-#endif // _WINDOWS and _APPLE ++#endif // !_WINDOWS and !__APPLE__ + + #endif // SHARE_VM_UTILITIES_ELF_SYMBOL_TABLE_HPP +--- ./hotspot/src/share/vm/utilities/events.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/events.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -82,7 +82,7 @@ + va_start(ap, format); + // Save a copy of begin message and log it. + _buffer.printv(format, ap); +- Events::log(NULL, "%s", (const char*)_buffer); ++ Events::log(NULL, "%s", _buffer.buffer()); + va_end(ap); + } + } +@@ -91,6 +91,6 @@ + if (LogEvents) { + // Append " done" to the begin message and log it + _buffer.append(" done"); +- Events::log(NULL, "%s", (const char*)_buffer); ++ Events::log(NULL, "%s", _buffer.buffer()); + } + } +--- ./hotspot/src/share/vm/utilities/events.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/events.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -128,7 +128,7 @@ + void print(outputStream* out, EventRecord& e) { + out->print("Event: %.3f ", e.timestamp); + if (e.thread != NULL) { +- out->print("Thread " INTPTR_FORMAT " ", e.thread); ++ out->print("Thread " INTPTR_FORMAT " ", p2i(e.thread)); + } + print(out, e.data); + } +@@ -148,7 +148,7 @@ + public: + StringEventLog(const char* name, int count = LogEventsBufferEntries) : EventLogBase(name, count) {} + +- void logv(Thread* thread, const char* format, va_list ap) { ++ void logv(Thread* thread, const char* format, va_list ap) ATTRIBUTE_PRINTF(3, 0) { + if (!should_log()) return; + + double timestamp = fetch_timestamp(); +@@ -159,7 +159,7 @@ + _records[index].data.printv(format, ap); + } + +- void log(Thread* thread, const char* format, ...) { ++ void log(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(3, 4) { + va_list ap; + va_start(ap, format); + logv(thread, format, ap); +@@ -193,18 +193,17 @@ + static void print(); + + // Logs a generic message with timestamp and format as printf. +- static void log(Thread* thread, const char* format, ...); ++ static void log(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + + // Log exception related message +- static void log_exception(Thread* thread, const char* format, ...); ++ static void log_exception(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + +- static void log_deopt_message(Thread* thread, const char* format, ...); ++ static void log_deopt_message(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + + // Register default loggers + static void init(); + }; + +- + inline void Events::log(Thread* thread, const char* format, ...) { + if (LogEvents) { + va_list ap; +@@ -283,7 +282,7 @@ + + public: + // log a begin event, format as printf +- EventMark(const char* format, ...); ++ EventMark(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + // log an end event + ~EventMark(); + }; +--- ./hotspot/src/share/vm/utilities/exceptions.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/exceptions.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -35,6 +35,7 @@ + #include "utilities/events.hpp" + #include "utilities/exceptions.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC + + // Implementation of ThreadShadow + void check_ThreadShadow() { +@@ -237,6 +238,7 @@ + _throw_msg(thread, file, line, h_name, msg); + } + ++ + // Creates an exception oop, calls the method with the given signature. + // and returns a Handle + Handle Exceptions::new_exception(Thread *thread, Symbol* name, +--- ./hotspot/src/share/vm/utilities/exceptions.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/exceptions.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -132,7 +132,7 @@ + // There is no THROW... macro for this method. Caller should remember + // to do a return after calling it. + static void fthrow(Thread* thread, const char* file, int line, Symbol* name, +- const char* format, ...); ++ const char* format, ...) ATTRIBUTE_PRINTF(5, 6); + + // Create and initialize a new exception + static Handle new_exception(Thread* thread, Symbol* name, +--- ./hotspot/src/share/vm/utilities/globalDefinitions.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/globalDefinitions.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -38,6 +38,35 @@ + #ifdef TARGET_COMPILER_sparcWorks + # include "utilities/globalDefinitions_sparcWorks.hpp" + #endif ++#ifdef TARGET_COMPILER_xlc ++# include "utilities/globalDefinitions_xlc.hpp" ++#endif ++ ++#ifndef PRAGMA_DIAG_PUSH ++#define PRAGMA_DIAG_PUSH ++#endif ++#ifndef PRAGMA_DIAG_POP ++#define PRAGMA_DIAG_POP ++#endif ++#ifndef PRAGMA_FORMAT_NONLITERAL_IGNORED ++#define PRAGMA_FORMAT_NONLITERAL_IGNORED ++#endif ++#ifndef PRAGMA_FORMAT_IGNORED ++#define PRAGMA_FORMAT_IGNORED ++#endif ++#ifndef PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL ++#define PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL ++#endif ++#ifndef PRAGMA_FORMAT_NONLITERAL_IGNORED_EXTERNAL ++#define PRAGMA_FORMAT_NONLITERAL_IGNORED_EXTERNAL ++#endif ++#ifndef PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++#define PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++#endif ++#ifndef ATTRIBUTE_PRINTF ++#define ATTRIBUTE_PRINTF(fmt, vargs) ++#endif ++ + + #include "utilities/macros.hpp" + +@@ -370,6 +399,21 @@ + + // Machine dependent stuff + ++#if defined(X86) && defined(COMPILER2) && !defined(JAVASE_EMBEDDED) ++// Include Restricted Transactional Memory lock eliding optimization ++#define INCLUDE_RTM_OPT 1 ++#define RTM_OPT_ONLY(code) code ++#else ++#define INCLUDE_RTM_OPT 0 ++#define RTM_OPT_ONLY(code) ++#endif ++// States of Restricted Transactional Memory usage. ++enum RTMState { ++ NoRTM = 0x2, // Don't use RTM ++ UseRTM = 0x1, // Use RTM ++ ProfileRTM = 0x0 // Use RTM with abort ratio calculation ++}; ++ + #ifdef TARGET_ARCH_x86 + # include "globalDefinitions_x86.hpp" + #endif +@@ -395,6 +439,17 @@ + #define PLATFORM_NATIVE_STACK_WALKING_SUPPORTED 1 + #endif + ++// To assure the IRIW property on processors that are not multiple copy ++// atomic, sync instructions must be issued between volatile reads to ++// assure their ordering, instead of after volatile stores. ++// (See "A Tutorial Introduction to the ARM and POWER Relaxed Memory Models" ++// by Luc Maranget, Susmit Sarkar and Peter Sewell, INRIA/Cambridge) ++#ifdef CPU_NOT_MULTIPLE_COPY_ATOMIC ++const bool support_IRIW_for_not_multiple_copy_atomic_cpu = true; ++#else ++const bool support_IRIW_for_not_multiple_copy_atomic_cpu = false; ++#endif ++ + // The byte alignment to be used by Arena::Amalloc. See bugid 4169348. + // Note: this value must be a power of 2 + +@@ -1255,6 +1310,11 @@ + return ((int)((unsigned int)high << 16) | (unsigned int)low); + } + ++// Convert pointer to intptr_t, for use in printing pointers. ++inline intptr_t p2i(const void * p) { ++ return (intptr_t) p; ++} ++ + // Printf-style formatters for fixed- and variable-width types as pointers and + // integers. These are derived from the definitions in inttypes.h. If the platform + // doesn't provide appropriate definitions, they should be provided in +@@ -1273,6 +1333,7 @@ + // Format 64-bit quantities. + #define INT64_FORMAT "%" PRId64 + #define UINT64_FORMAT "%" PRIu64 ++#define UINT64_FORMAT_X "%" PRIx64 + #define INT64_FORMAT_W(width) "%" #width PRId64 + #define UINT64_FORMAT_W(width) "%" #width PRIu64 + +@@ -1295,10 +1356,14 @@ + #define PTR_FORMAT "0x%08" PRIxPTR + #endif // _LP64 + +-#define SSIZE_FORMAT "%" PRIdPTR +-#define SIZE_FORMAT "%" PRIuPTR +-#define SSIZE_FORMAT_W(width) "%" #width PRIdPTR +-#define SIZE_FORMAT_W(width) "%" #width PRIuPTR ++#define INTPTR_FORMAT_W(width) "%" #width PRIxPTR ++ ++#define SSIZE_FORMAT "%" PRIdPTR ++#define SIZE_FORMAT "%" PRIuPTR ++#define SIZE_FORMAT_HEX "0x%" PRIxPTR ++#define SSIZE_FORMAT_W(width) "%" #width PRIdPTR ++#define SIZE_FORMAT_W(width) "%" #width PRIuPTR ++#define SIZE_FORMAT_HEX_W(width) "0x%" #width PRIxPTR + + #define INTX_FORMAT "%" PRIdPTR + #define UINTX_FORMAT "%" PRIuPTR +@@ -1320,11 +1385,10 @@ + // All C++ compilers that we know of have the vtbl pointer in the first + // word. If there are exceptions, this function needs to be made compiler + // specific. +-static inline void* dereference_vptr(void* addr) { ++static inline void* dereference_vptr(const void* addr) { + return *(void**)addr; + } + +- + #ifndef PRODUCT + + // For unit testing only +--- ./hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -282,6 +282,47 @@ + #define PRAGMA_IMPLEMENTATION #pragma implementation + #define VALUE_OBJ_CLASS_SPEC + ++#ifndef ATTRIBUTE_PRINTF ++// Diagnostic pragmas like the ones defined below in PRAGMA_FORMAT_NONLITERAL_IGNORED ++// were only introduced in GCC 4.2. Because we have no other possibility to ignore ++// these warnings for older versions of GCC, we simply don't decorate our printf-style ++// functions with __attribute__(format) in that case. ++#if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2)) || (__GNUC__ > 4) ++#define ATTRIBUTE_PRINTF(fmt,vargs) __attribute__((format(printf, fmt, vargs))) ++#else ++#define ATTRIBUTE_PRINTF(fmt,vargs) ++#endif ++#endif ++ ++#define PRAGMA_FORMAT_NONLITERAL_IGNORED _Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"") \ ++ _Pragma("GCC diagnostic ignored \"-Wformat-security\"") ++#define PRAGMA_FORMAT_IGNORED _Pragma("GCC diagnostic ignored \"-Wformat\"") ++ ++#if defined(__clang_major__) && \ ++ (__clang_major__ >= 4 || \ ++ (__clang_major__ >= 3 && __clang_minor__ >= 1)) || \ ++ ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) ++// Tested to work with clang version 3.1 and better. ++#define PRAGMA_DIAG_PUSH _Pragma("GCC diagnostic push") ++#define PRAGMA_DIAG_POP _Pragma("GCC diagnostic pop") ++#define PRAGMA_FORMAT_NONLITERAL_IGNORED_EXTERNAL ++#define PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL PRAGMA_FORMAT_NONLITERAL_IGNORED ++ ++// Hack to deal with gcc yammering about non-security format stuff ++#else ++// Old versions of gcc don't do push/pop, also do not cope with this pragma within a function ++// One method does so much varied printing that it is decorated with both internal and external ++// versions of the macro-pragma to obtain better checking with newer compilers. ++#define PRAGMA_DIAG_PUSH ++#define PRAGMA_DIAG_POP ++#define PRAGMA_FORMAT_NONLITERAL_IGNORED_EXTERNAL PRAGMA_FORMAT_NONLITERAL_IGNORED ++#define PRAGMA_FORMAT_NONLITERAL_IGNORED_INTERNAL ++#endif ++ ++#ifndef __clang_major__ ++#define PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC _Pragma("GCC diagnostic ignored \"-Wformat\"") _Pragma("GCC diagnostic error \"-Wformat-nonliteral\"") _Pragma("GCC diagnostic error \"-Wformat-security\"") ++#endif ++ + #if (__GNUC__ == 2) && (__GNUC_MINOR__ < 95) + #define TEMPLATE_TABLE_BUG + #endif +--- ./hotspot/src/share/vm/utilities/globalDefinitions_xlc.hpp Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/share/vm/utilities/globalDefinitions_xlc.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,202 @@ ++/* ++ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012, 2013 SAP AG. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * 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_UTILITIES_GLOBALDEFINITIONS_XLC_HPP ++#define SHARE_VM_UTILITIES_GLOBALDEFINITIONS_XLC_HPP ++ ++#include "prims/jni.h" ++ ++// This file holds compiler-dependent includes, ++// globally used constants & types, class (forward) ++// declarations and a few frequently used utility functions. ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#ifndef FP_PZERO ++// Linux doesn't have positive/negative zero ++#define FP_PZERO FP_ZERO ++#endif ++#if (!defined fpclass) ++#define fpclass fpclassify ++#endif ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++// Use XLC compiler builtins instead of inline assembler ++#define USE_XLC_BUILTINS ++#ifdef USE_XLC_BUILTINS ++#include ++ #if __IBMCPP__ < 1000 ++ // the funtion prototype for __dcbtst(void *) is missing in XLC V8.0 ++ // I could compile a little test, where I provided the prototype. ++ // The generated code was correct there. This is the prototype: ++ // extern "builtin" void __dcbtst (void *); ++ // For now we don't make use of it when compiling with XLC V8.0 ++ #else ++ // __IBMCPP__ >= 1000 ++ // XLC V10 provides the prototype for __dcbtst (void *); ++ #define USE_XLC_PREFETCH_WRITE_BUILTIN ++ #endif ++#endif // USE_XLC_BUILTINS ++ ++// NULL vs NULL_WORD: ++// On Linux NULL is defined as a special type '__null'. Assigning __null to ++// integer variable will cause gcc warning. Use NULL_WORD in places where a ++// pointer is stored as integer value. On some platforms, sizeof(intptr_t) > ++// sizeof(void*), so here we want something which is integer type, but has the ++// same size as a pointer. ++#ifdef __GNUC__ ++ #error XLC and __GNUC__? ++#else ++ #define NULL_WORD NULL ++#endif ++ ++// AIX also needs a 64 bit NULL to work as a null address pointer. ++// Most system includes on AIX would define it as an int 0 if not already defined with one ++// exception: /usr/include/dirent.h will unconditionally redefine NULL to int 0 again. ++// In this case you need to copy the following defines to a position after #include ++// (see jmv_aix.h). ++#ifdef AIX ++ #ifdef _LP64 ++ #undef NULL ++ #define NULL 0L ++ #else ++ #ifndef NULL ++ #define NULL 0 ++ #endif ++ #endif ++#endif // AIX ++ ++// Compiler-specific primitive types ++// All defs of int (uint16_6 etc) are defined in AIX' /usr/include/stdint.h ++ ++// Additional Java basic types ++ ++typedef uint8_t jubyte; ++typedef uint16_t jushort; ++typedef uint32_t juint; ++typedef uint64_t julong; ++ ++//---------------------------------------------------------------------------------------------------- ++// Special (possibly not-portable) casts ++// Cast floats into same-size integers and vice-versa w/o changing bit-pattern ++// %%%%%% These seem like standard C++ to me--how about factoring them out? - Ungar ++ ++inline jint jint_cast (jfloat x) { return *(jint* )&x; } ++inline jlong jlong_cast (jdouble x) { return *(jlong* )&x; } ++ ++inline jfloat jfloat_cast (jint x) { return *(jfloat* )&x; } ++inline jdouble jdouble_cast(jlong x) { return *(jdouble*)&x; } ++ ++//---------------------------------------------------------------------------------------------------- ++// Constant for jlong (specifying an long long canstant is C++ compiler specific) ++ ++// Build a 64bit integer constant ++#define CONST64(x) (x ## LL) ++#define UCONST64(x) (x ## ULL) ++ ++const jlong min_jlong = CONST64(0x8000000000000000); ++const jlong max_jlong = CONST64(0x7fffffffffffffff); ++ ++//---------------------------------------------------------------------------------------------------- ++// Debugging ++ ++#define DEBUG_EXCEPTION ::abort(); ++ ++extern "C" void breakpoint(); ++#define BREAKPOINT ::breakpoint() ++ ++// checking for nanness ++#ifdef AIX ++inline int g_isnan(float f) { return isnan(f); } ++inline int g_isnan(double f) { return isnan(f); } ++#else ++#error "missing platform-specific definition here" ++#endif ++ ++// Checking for finiteness ++ ++inline int g_isfinite(jfloat f) { return finite(f); } ++inline int g_isfinite(jdouble f) { return finite(f); } ++ ++ ++// Wide characters ++ ++inline int wcslen(const jchar* x) { return wcslen((const wchar_t*)x); } ++ ++ ++// Portability macros ++#define PRAGMA_INTERFACE #pragma interface ++#define PRAGMA_IMPLEMENTATION #pragma implementation ++#define VALUE_OBJ_CLASS_SPEC ++ ++// Formatting. ++#ifdef _LP64 ++#define FORMAT64_MODIFIER "l" ++#else // !_LP64 ++#define FORMAT64_MODIFIER "ll" ++#endif // _LP64 ++ ++// Cannot use xlc's offsetof as implementation of hotspot's ++// offset_of(), because xlc warns about applying offsetof() to non-POD ++// object and xlc cannot compile the expression offsetof(DataLayout, ++// _cells[index]) in DataLayout::cell_offset() . Therefore we define ++// offset_of as it is defined for gcc. ++#define offset_of(klass,field) (size_t)((intx)&(((klass*)16)->field) - 16) ++ ++// Some constant sizes used throughout the AIX port ++#define SIZE_1K ((uint64_t) 0x400ULL) ++#define SIZE_4K ((uint64_t) 0x1000ULL) ++#define SIZE_64K ((uint64_t) 0x10000ULL) ++#define SIZE_1M ((uint64_t) 0x100000ULL) ++#define SIZE_4M ((uint64_t) 0x400000ULL) ++#define SIZE_8M ((uint64_t) 0x800000ULL) ++#define SIZE_16M ((uint64_t) 0x1000000ULL) ++#define SIZE_256M ((uint64_t) 0x10000000ULL) ++#define SIZE_1G ((uint64_t) 0x40000000ULL) ++#define SIZE_2G ((uint64_t) 0x80000000ULL) ++#define SIZE_4G ((uint64_t) 0x100000000ULL) ++#define SIZE_16G ((uint64_t) 0x400000000ULL) ++#define SIZE_32G ((uint64_t) 0x800000000ULL) ++#define SIZE_64G ((uint64_t) 0x1000000000ULL) ++#define SIZE_1T ((uint64_t) 0x10000000000ULL) ++ ++ ++#endif // SHARE_VM_UTILITIES_GLOBALDEFINITIONS_XLC_HPP +--- ./hotspot/src/share/vm/utilities/hashtable.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/hashtable.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -93,7 +93,7 @@ + return false; + } + +-template jint Hashtable::_seed = 0; ++template juint Hashtable::_seed = 0; + + // Create a new table and using alternate hash code, populate the new table + // with the existing elements. This can be used to change the hash code +--- ./hotspot/src/share/vm/utilities/hashtable.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/hashtable.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -280,7 +280,7 @@ + // Function to move these elements into the new table. + void move_to(Hashtable* new_table); + static bool use_alternate_hashcode() { return _seed != 0; } +- static jint seed() { return _seed; } ++ static juint seed() { return _seed; } + + static int literal_size(Symbol *symbol); + static int literal_size(oop oop); +@@ -296,7 +296,7 @@ + void dump_table(outputStream* st, const char *table_name); + + private: +- static jint _seed; ++ static juint _seed; + }; + + +--- ./hotspot/src/share/vm/utilities/histogram.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/histogram.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -37,6 +37,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +--- ./hotspot/src/share/vm/utilities/macros.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/macros.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -254,6 +254,14 @@ + #define NOT_LINUX(code) code + #endif + ++#ifdef AIX ++#define AIX_ONLY(code) code ++#define NOT_AIX(code) ++#else ++#define AIX_ONLY(code) ++#define NOT_AIX(code) code ++#endif ++ + #ifdef SOLARIS + #define SOLARIS_ONLY(code) code + #define NOT_SOLARIS(code) +@@ -320,7 +328,11 @@ + #define NOT_IA32(code) code + #endif + +-#ifdef IA64 ++// This is a REALLY BIG HACK, but on AIX unconditionally defines IA64. ++// At least on AIX 7.1 this is a real problem because 'systemcfg.h' is indirectly included ++// by 'pthread.h' and other common system headers. ++ ++#if defined(IA64) && !defined(AIX) + #define IA64_ONLY(code) code + #define NOT_IA64(code) + #else +@@ -344,14 +356,34 @@ + #define NOT_SPARC(code) code + #endif + +-#ifdef PPC ++#if defined(PPC32) || defined(PPC64) ++#ifndef PPC ++#define PPC ++#endif + #define PPC_ONLY(code) code + #define NOT_PPC(code) + #else ++#undef PPC + #define PPC_ONLY(code) + #define NOT_PPC(code) code + #endif + ++#ifdef PPC32 ++#define PPC32_ONLY(code) code ++#define NOT_PPC32(code) ++#else ++#define PPC32_ONLY(code) ++#define NOT_PPC32(code) code ++#endif ++ ++#ifdef PPC64 ++#define PPC64_ONLY(code) code ++#define NOT_PPC64(code) ++#else ++#define PPC64_ONLY(code) ++#define NOT_PPC64(code) code ++#endif ++ + #ifdef E500V2 + #define E500V2_ONLY(code) code + #define NOT_E500V2(code) +--- ./hotspot/src/share/vm/utilities/numberSeq.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/numberSeq.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -258,5 +258,5 @@ + } + s->print("\t[%d]=%7.3f", i, _sequence[i]); + } +- s->print_cr(""); ++ s->cr(); + } +--- ./hotspot/src/share/vm/utilities/ostream.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/ostream.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -39,6 +39,9 @@ + #ifdef TARGET_OS_FAMILY_windows + # include "os_windows.inline.hpp" + #endif ++#ifdef TARGET_OS_FAMILY_aix ++# include "os_aix.inline.hpp" ++#endif + #ifdef TARGET_OS_FAMILY_bsd + # include "os_bsd.inline.hpp" + #endif +@@ -265,7 +268,7 @@ + size_t limit = (len + 16) / 16 * 16; + for (size_t i = 0; i < limit; ++i) { + if (i % 16 == 0) { +- indent().print("%07x:", i); ++ indent().print(SIZE_FORMAT_HEX_W(07)":", i); + } + if (i % 2 == 0) { + print(" "); +@@ -286,7 +289,7 @@ + } + } + } +- print_cr(""); ++ cr(); + } + } + } +@@ -603,7 +606,7 @@ + // memory usage and command line flags into header + void gcLogFileStream::dump_loggc_header() { + if (is_open()) { +- print_cr(Abstract_VM_Version::internal_vm_info_string()); ++ print_cr("%s", Abstract_VM_Version::internal_vm_info_string()); + os::print_memory_info(this); + print("CommandLine flags: "); + CommandLineFlags::printSetFlags(this); +@@ -659,13 +662,13 @@ + // write to gc log file at safepoint. If in future, changes made for mutator threads or + // concurrent GC threads to run parallel with VMThread at safepoint, write and rotate_log + // must be synchronized. +-void gcLogFileStream::rotate_log() { ++void gcLogFileStream::rotate_log(bool force, outputStream* out) { + char time_msg[FILENAMEBUFLEN]; + char time_str[EXTRACHARLEN]; + char current_file_name[FILENAMEBUFLEN]; + char renamed_file_name[FILENAMEBUFLEN]; + +- if (_bytes_written < (jlong)GCLogFileSize) { ++ if (!should_rotate(force)) { + return; + } + +@@ -682,6 +685,11 @@ + jio_snprintf(time_msg, sizeof(time_msg), "File %s rotated at %s\n", + _file_name, os::local_time_string((char *)time_str, sizeof(time_str))); + write(time_msg, strlen(time_msg)); ++ ++ if (out != NULL) { ++ out->print("%s", time_msg); ++ } ++ + dump_loggc_header(); + return; + } +@@ -703,12 +711,18 @@ + _file_name, _cur_file_num); + jio_snprintf(current_file_name, filename_len + EXTRACHARLEN, "%s.%d" CURRENTAPPX, + _file_name, _cur_file_num); +- jio_snprintf(time_msg, sizeof(time_msg), "%s GC log file has reached the" +- " maximum size. Saved as %s\n", +- os::local_time_string((char *)time_str, sizeof(time_str)), +- renamed_file_name); ++ ++ const char* msg = force ? "GC log rotation request has been received." ++ : "GC log file has reached the maximum size."; ++ jio_snprintf(time_msg, sizeof(time_msg), "%s %s Saved as %s\n", ++ os::local_time_string((char *)time_str, sizeof(time_str)), ++ msg, renamed_file_name); + write(time_msg, strlen(time_msg)); + ++ if (out != NULL) { ++ out->print("%s", time_msg); ++ } ++ + fclose(_file); + _file = NULL; + +@@ -749,6 +763,11 @@ + os::local_time_string((char *)time_str, sizeof(time_str)), + current_file_name); + write(time_msg, strlen(time_msg)); ++ ++ if (out != NULL) { ++ out->print("%s", time_msg); ++ } ++ + dump_loggc_header(); + // remove the existing file + if (access(current_file_name, F_OK) == 0) { +@@ -826,7 +845,7 @@ + xs->head("hotspot_log version='%d %d'" + " process='%d' time_ms='"INT64_FORMAT"'", + LOG_MAJOR_VERSION, LOG_MINOR_VERSION, +- os::current_process_id(), time_ms); ++ os::current_process_id(), (int64_t)time_ms); + // Write VM version header immediately. + xs->head("vm_version"); + xs->head("name"); xs->text("%s", VM_Version::vm_name()); xs->cr(); +@@ -1238,7 +1257,7 @@ + + #ifndef PRODUCT + +-#if defined(SOLARIS) || defined(LINUX) || defined(_ALLBSD_SOURCE) ++#if defined(SOLARIS) || defined(LINUX) || defined(AIX) || defined(_ALLBSD_SOURCE) + #include + #include + #include +--- ./hotspot/src/share/vm/utilities/ostream.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/ostream.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -53,7 +53,7 @@ + static const char* do_vsnprintf(char* buffer, size_t buflen, + const char* format, va_list ap, + bool add_cr, +- size_t& result_len); ++ size_t& result_len) ATTRIBUTE_PRINTF(3, 0); + + public: + // creation +@@ -80,10 +80,10 @@ + void set_position(int pos) { _position = pos; } + + // printing +- void print(const char* format, ...); +- void print_cr(const char* format, ...); +- void vprint(const char *format, va_list argptr); +- void vprint_cr(const char* format, va_list argptr); ++ void print(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void print_cr(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void vprint(const char *format, va_list argptr) ATTRIBUTE_PRINTF(2, 0); ++ void vprint_cr(const char* format, va_list argptr) ATTRIBUTE_PRINTF(2, 0); + void print_raw(const char* str) { write(str, strlen(str)); } + void print_raw(const char* str, int len) { write(str, len); } + void print_raw_cr(const char* str) { write(str, strlen(str)); cr(); } +@@ -115,7 +115,7 @@ + // flushing + virtual void flush() {} + virtual void write(const char* str, size_t len) = 0; +- virtual void rotate_log() {} // GC log rotation ++ virtual void rotate_log(bool force, outputStream* out = NULL) {} // GC log rotation + virtual ~outputStream() {} // close properly on deletion + + void dec_cr() { dec(); cr(); } +@@ -240,8 +240,15 @@ + gcLogFileStream(const char* file_name); + ~gcLogFileStream(); + virtual void write(const char* c, size_t len); +- virtual void rotate_log(); ++ virtual void rotate_log(bool force, outputStream* out = NULL); + void dump_loggc_header(); ++ ++ /* If "force" sets true, force log file rotation from outside JVM */ ++ bool should_rotate(bool force) { ++ return force || ++ ((GCLogFileSize != 0) && ((uintx)_bytes_written >= GCLogFileSize)); ++ } ++ + }; + + #ifndef PRODUCT +@@ -268,10 +275,10 @@ + ~staticBufferStream() {}; + virtual void write(const char* c, size_t len); + void flush(); +- void print(const char* format, ...); +- void print_cr(const char* format, ...); +- void vprint(const char *format, va_list argptr); +- void vprint_cr(const char* format, va_list argptr); ++ void print(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void print_cr(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void vprint(const char *format, va_list argptr) ATTRIBUTE_PRINTF(2, 0); ++ void vprint_cr(const char* format, va_list argptr) ATTRIBUTE_PRINTF(2, 0); + }; + + // In the non-fixed buffer case an underlying buffer will be created and +--- ./hotspot/src/share/vm/utilities/quickSort.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/quickSort.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -77,7 +77,7 @@ + for (int i = 0; i < length; i++) { + tty->print(" %d", array[i]); + } +- tty->print_cr(""); ++ tty->cr(); + } + + bool QuickSort::compare_arrays(int* actual, int* expected, int length) { +--- ./hotspot/src/share/vm/utilities/resourceHash.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/resourceHash.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -44,8 +44,12 @@ + + template< + typename K, typename V, +- typename ResourceHashtableFns::hash_fn HASH = primitive_hash, +- typename ResourceHashtableFns::equals_fn EQUALS = primitive_equals, ++ // xlC does not compile this: ++ // http://stackoverflow.com/questions/8532961/template-argument-of-type-that-is-defined-by-inner-typedef-from-other-template-c ++ //typename ResourceHashtableFns::hash_fn HASH = primitive_hash, ++ //typename ResourceHashtableFns::equals_fn EQUALS = primitive_equals, ++ unsigned (*HASH) (K const&) = primitive_hash, ++ bool (*EQUALS)(K const&, K const&) = primitive_equals, + unsigned SIZE = 256 + > + class ResourceHashtable : public ResourceObj { +--- ./hotspot/src/share/vm/utilities/taskqueue.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/taskqueue.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -30,6 +30,8 @@ + #include "utilities/stack.inline.hpp" + #include "utilities/taskqueue.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + #ifdef TRACESPINNING + uint ParallelTaskTerminator::_total_yields = 0; + uint ParallelTaskTerminator::_total_spins = 0; +--- ./hotspot/src/share/vm/utilities/taskqueue.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/taskqueue.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -53,6 +53,9 @@ + #ifdef TARGET_OS_ARCH_linux_ppc + # include "orderAccess_linux_ppc.inline.hpp" + #endif ++#ifdef TARGET_OS_ARCH_aix_ppc ++# include "orderAccess_aix_ppc.inline.hpp" ++#endif + #ifdef TARGET_OS_ARCH_bsd_x86 + # include "orderAccess_bsd_x86.inline.hpp" + #endif +--- ./hotspot/src/share/vm/utilities/vmError.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/vmError.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -42,6 +42,8 @@ + #include "utilities/top.hpp" + #include "utilities/vmError.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // List of environment variables that should be reported in error log file. + const char *env_list[] = { + // All platforms +@@ -358,17 +360,17 @@ + st->print((_id == (int)OOM_MALLOC_ERROR) ? "(malloc) failed to allocate " : + "(mmap) failed to map "); + jio_snprintf(buf, sizeof(buf), SIZE_FORMAT, _size); +- st->print(buf); ++ st->print("%s", buf); + st->print(" bytes"); + if (_message != NULL) { + st->print(" for "); +- st->print(_message); ++ st->print("%s", _message); + } + st->cr(); + } else { + if (_message != NULL) + st->print("# "); +- st->print_cr(_message); ++ st->print_cr("%s", _message); + } + // In error file give some solutions + if (_verbose) { +@@ -485,7 +487,7 @@ + } else { + st->print("Failed to write core dump. %s", coredump_message); + } +- st->print_cr(""); ++ st->cr(); + st->print_cr("#"); + + STEP(65, "(printing bug submit message)") +@@ -592,13 +594,24 @@ + st->cr(); + // Compiled code may use EBP register on x86 so it looks like + // non-walkable C frame. Use frame.sender() for java frames. +- if (_thread && _thread->is_Java_thread() && fr.is_java_frame()) { +- RegisterMap map((JavaThread*)_thread, false); // No update +- fr = fr.sender(&map); +- continue; ++ if (_thread && _thread->is_Java_thread()) { ++ // Catch very first native frame by using stack address. ++ // For JavaThread stack_base and stack_size should be set. ++ if (!_thread->on_local_stack((address)(fr.sender_sp() + 1))) { ++ break; ++ } ++ if (fr.is_java_frame()) { ++ RegisterMap map((JavaThread*)_thread, false); // No update ++ fr = fr.sender(&map); ++ } else { ++ fr = os::get_sender_for_C_frame(&fr); ++ } ++ } else { ++ // is_first_C_frame() does only simple checks for frame pointer, ++ // it will pass if java compiled code has a pointer in EBP. ++ if (os::is_first_C_frame(&fr)) break; ++ fr = os::get_sender_for_C_frame(&fr); + } +- if (os::is_first_C_frame(&fr)) break; +- fr = os::get_sender_for_C_frame(&fr); + } + + if (count > StackPrintLimit) { +@@ -1039,7 +1052,7 @@ + OnError = NULL; + } + +- static bool skip_replay = false; ++ static bool skip_replay = ReplayCompiles; // Do not overwrite file during replay + if (DumpReplayDataOnError && _thread && _thread->is_Compiler_thread() && !skip_replay) { + skip_replay = true; + ciEnv* env = ciEnv::current(); +--- ./hotspot/src/share/vm/utilities/workgroup.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/workgroup.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -28,6 +28,8 @@ + #include "runtime/os.hpp" + #include "utilities/workgroup.hpp" + ++PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC ++ + // Definitions of WorkGang methods. + + AbstractWorkGang::AbstractWorkGang(const char* name, +@@ -376,21 +378,22 @@ + + WorkGangBarrierSync::WorkGangBarrierSync() + : _monitor(Mutex::safepoint, "work gang barrier sync", true), +- _n_workers(0), _n_completed(0), _should_reset(false) { ++ _n_workers(0), _n_completed(0), _should_reset(false), _aborted(false) { + } + + WorkGangBarrierSync::WorkGangBarrierSync(uint n_workers, const char* name) + : _monitor(Mutex::safepoint, name, true), +- _n_workers(n_workers), _n_completed(0), _should_reset(false) { ++ _n_workers(n_workers), _n_completed(0), _should_reset(false), _aborted(false) { + } + + void WorkGangBarrierSync::set_n_workers(uint n_workers) { +- _n_workers = n_workers; +- _n_completed = 0; ++ _n_workers = n_workers; ++ _n_completed = 0; + _should_reset = false; ++ _aborted = false; + } + +-void WorkGangBarrierSync::enter() { ++bool WorkGangBarrierSync::enter() { + MutexLockerEx x(monitor(), Mutex::_no_safepoint_check_flag); + if (should_reset()) { + // The should_reset() was set and we are the first worker to enter +@@ -413,10 +416,17 @@ + set_should_reset(true); + monitor()->notify_all(); + } else { +- while (n_completed() != n_workers()) { ++ while (n_completed() != n_workers() && !aborted()) { + monitor()->wait(/* no_safepoint_check */ true); + } + } ++ return !aborted(); ++} ++ ++void WorkGangBarrierSync::abort() { ++ MutexLockerEx x(monitor(), Mutex::_no_safepoint_check_flag); ++ set_aborted(); ++ monitor()->notify_all(); + } + + // SubTasksDone functions. +--- ./hotspot/src/share/vm/utilities/workgroup.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/workgroup.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -359,18 +359,20 @@ + class WorkGangBarrierSync : public StackObj { + protected: + Monitor _monitor; +- uint _n_workers; +- uint _n_completed; ++ uint _n_workers; ++ uint _n_completed; + bool _should_reset; ++ bool _aborted; + + Monitor* monitor() { return &_monitor; } + uint n_workers() { return _n_workers; } + uint n_completed() { return _n_completed; } + bool should_reset() { return _should_reset; } ++ bool aborted() { return _aborted; } + + void zero_completed() { _n_completed = 0; } + void inc_completed() { _n_completed++; } +- ++ void set_aborted() { _aborted = true; } + void set_should_reset(bool v) { _should_reset = v; } + + public: +@@ -383,8 +385,14 @@ + + // Enter the barrier. A worker that enters the barrier will + // not be allowed to leave until all other threads have +- // also entered the barrier. +- void enter(); ++ // also entered the barrier or the barrier is aborted. ++ // Returns false if the barrier was aborted. ++ bool enter(); ++ ++ // Aborts the barrier and wakes up any threads waiting for ++ // the barrier to complete. The barrier will remain in the ++ // aborted state until the next call to set_n_workers(). ++ void abort(); + }; + + // A class to manage claiming of subtasks within a group of tasks. The +--- ./hotspot/src/share/vm/utilities/xmlstream.cpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/xmlstream.cpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2012, 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 +@@ -336,6 +336,8 @@ + print_raw_cr(">"); + } + ++PRAGMA_DIAG_PUSH ++PRAGMA_FORMAT_NONLITERAL_IGNORED + // ------------------------------------------------------------------ + void xmlStream::va_done(const char* format, va_list ap) { + char buffer[200]; +@@ -354,6 +356,7 @@ + buffer[kind_len] = 0; + tail(buffer); + } ++PRAGMA_DIAG_POP + + // Output a timestamp attribute. + void xmlStream::stamp() { +--- ./hotspot/src/share/vm/utilities/xmlstream.hpp Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/xmlstream.hpp Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2012, 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 +@@ -80,7 +80,7 @@ + outputStream* out() { return _out; } + + // helpers for writing XML elements +- void va_tag(bool push, const char* format, va_list ap); ++ void va_tag(bool push, const char* format, va_list ap) ATTRIBUTE_PRINTF(3, 0); + virtual void see_tag(const char* tag, bool push) NOT_DEBUG({}); + virtual void pop_tag(const char* tag) NOT_DEBUG({}); + +@@ -109,29 +109,29 @@ + int unflushed_count() { return (int)(out()->count() - _last_flush); } + + // writing complete XML elements +- void elem(const char* format, ...); +- void begin_elem(const char* format, ...); +- void end_elem(const char* format, ...); ++ void elem(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void begin_elem(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void end_elem(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + void end_elem(); +- void head(const char* format, ...); +- void begin_head(const char* format, ...); +- void end_head(const char* format, ...); ++ void head(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void begin_head(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void end_head(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + void end_head(); +- void done(const char* format, ...); // xxx_done event, plus tail ++ void done(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); // xxx_done event, plus tail + void done_raw(const char * kind); + void tail(const char* kind); + + // va_list versions +- void va_elem(const char* format, va_list ap); +- void va_begin_elem(const char* format, va_list ap); +- void va_head(const char* format, va_list ap); +- void va_begin_head(const char* format, va_list ap); +- void va_done(const char* format, va_list ap); ++ void va_elem(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0); ++ void va_begin_elem(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0); ++ void va_head(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0); ++ void va_begin_head(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0); ++ void va_done(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0); + + // write text (with quoting of special XML characters <>&'" etc.) + outputStream* text() { return _text; } +- void text(const char* format, ...); +- void va_text(const char* format, va_list ap) { ++ void text(const char* format, ...) ATTRIBUTE_PRINTF(2, 3); ++ void va_text(const char* format, va_list ap) ATTRIBUTE_PRINTF(2, 0) { + text()->vprint(format, ap); + } + +--- ./hotspot/test/TEST.groups Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/TEST.groups Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2013, 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 +@@ -84,6 +84,7 @@ + runtime/NMT/ThreadedVirtualAllocTestType.java \ + runtime/NMT/VirtualAllocTestType.java \ + runtime/RedefineObject/TestRedefineObject.java \ ++ runtime/Thread/TestThreadDumpMonitorContention.java \ + runtime/XCheckJniJsig/XCheckJSig.java \ + serviceability/attach/AttachWithStalePidFile.java \ + serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java +@@ -130,8 +131,15 @@ + gc/g1/TestHumongousAllocInitialMark.java \ + gc/arguments/TestG1HeapRegionSize.java \ + gc/metaspace/TestMetaspaceMemoryPool.java \ ++ gc/arguments/TestDynMinHeapFreeRatio.java \ ++ gc/arguments/TestDynMaxHeapFreeRatio.java \ + runtime/InternalApi/ThreadCpuTimesDeadlock.java \ +- serviceability/threads/TestFalseDeadLock.java ++ serviceability/threads/TestFalseDeadLock.java \ ++ serviceability/jvmti/GetObjectSizeOverflow.java \ ++ serviceability/jvmti/TestRedefineWithUnresolvedClass.java \ ++ compiler/tiered/NonTieredLevelsTest.java \ ++ compiler/tiered/TieredLevelsTest.java \ ++ compiler/intrinsics/bmi/verifycode + + # Compact 2 adds full VM tests + compact2 = \ +--- ./hotspot/test/compiler/6826736/Test.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/6826736/Test.java Wed Jul 30 03:51:43 2014 -0700 +@@ -27,7 +27,7 @@ + * @bug 6826736 + * @summary CMS: core dump with -XX:+UseCompressedOops + * +- * @run main/othervm/timeout=600 -XX:+IgnoreUnrecognizedVMOptions -Xbatch -XX:+ScavengeALot -XX:+UseCompressedOops -XX:HeapBaseMinAddress=32g -XX:CompileThreshold=100 -XX:CompileOnly=Test.test -XX:-BlockLayoutRotateLoops -XX:LoopUnrollLimit=0 Test ++ * @run main/othervm/timeout=600 -XX:+IgnoreUnrecognizedVMOptions -Xbatch -XX:+ScavengeALot -XX:+UseCompressedOops -XX:HeapBaseMinAddress=32g -XX:CompileThreshold=100 -XX:CompileOnly=Test.test -XX:-BlockLayoutRotateLoops -XX:LoopUnrollLimit=0 -Xmx256m -XX:ParallelGCThreads=4 Test + */ + + public class Test { +--- ./hotspot/test/compiler/7184394/TestAESBase.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/7184394/TestAESBase.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, 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 +@@ -40,9 +40,20 @@ + int msgSize = Integer.getInteger("msgSize", 646); + boolean checkOutput = Boolean.getBoolean("checkOutput"); + boolean noReinit = Boolean.getBoolean("noReinit"); ++ boolean testingMisalignment; ++ private static final int ALIGN = 8; ++ int encInputOffset = Integer.getInteger("encInputOffset", 0) % ALIGN; ++ int encOutputOffset = Integer.getInteger("encOutputOffset", 0) % ALIGN; ++ int decOutputOffset = Integer.getInteger("decOutputOffset", 0) % ALIGN; ++ int lastChunkSize = Integer.getInteger("lastChunkSize", 32); + int keySize = Integer.getInteger("keySize", 128); ++ int inputLength; ++ int encodeLength; ++ int decodeLength; ++ int decodeMsgSize; + String algorithm = System.getProperty("algorithm", "AES"); + String mode = System.getProperty("mode", "CBC"); ++ String paddingStr = System.getProperty("paddingStr", "PKCS5Padding"); + byte[] input; + byte[] encode; + byte[] expectedEncode; +@@ -51,7 +62,6 @@ + Random random = new Random(0); + Cipher cipher; + Cipher dCipher; +- String paddingStr = "PKCS5Padding"; + AlgorithmParameters algParams; + SecretKey key; + +@@ -67,7 +77,10 @@ + + public void prepare() { + try { +- System.out.println("\nalgorithm=" + algorithm + ", mode=" + mode + ", msgSize=" + msgSize + ", keySize=" + keySize + ", noReinit=" + noReinit + ", checkOutput=" + checkOutput); ++ System.out.println("\nalgorithm=" + algorithm + ", mode=" + mode + ", paddingStr=" + paddingStr + ", msgSize=" + msgSize + ", keySize=" + keySize + ", noReinit=" + noReinit + ", checkOutput=" + checkOutput + ", encInputOffset=" + encInputOffset + ", encOutputOffset=" + encOutputOffset + ", decOutputOffset=" + decOutputOffset + ", lastChunkSize=" +lastChunkSize ); ++ ++ if (encInputOffset % ALIGN != 0 || encOutputOffset % ALIGN != 0 || decOutputOffset % ALIGN !=0 ) ++ testingMisalignment = true; + + int keyLenBytes = (keySize == 0 ? 16 : keySize/8); + byte keyBytes[] = new byte[keyLenBytes]; +@@ -81,10 +94,6 @@ + System.out.println("Algorithm: " + key.getAlgorithm() + "(" + + key.getEncoded().length * 8 + "bit)"); + } +- input = new byte[msgSize]; +- for (int i=0; i 0 ? Integer.valueOf(args[0]) : 1000000); ++ int warmupIters = (args.length > 1 ? Integer.valueOf(args[1]) : 20000); + System.out.println(iters + " iterations"); + TestAESEncode etest = new TestAESEncode(); + etest.prepare(); ++ // warm-up ++ System.out.println("Starting encryption warm-up"); ++ for (int i=0; i markerList = new ArrayList<>(); ++ ++ // Suppress compilation of this method, it must be processed ++ // by the bytecode escape analyzer. ++ ++ // Make a new marker and put it on the List ++ Marker getMarker() { ++ // result escapes through markerList ++ final Marker result = new Marker(); ++ markerList.add(result); ++ return result; ++ } ++ ++ void visit(int depth) { ++ // Make a new marker ++ getMarker(); ++ ++ // Call visitAndPop every once in a while ++ // Cap the depth of our recursive visits ++ if (depth % 10 == 2) { ++ visitAndPop(depth + 1); ++ } else if (depth < 15) { ++ visit(depth + 1); ++ } ++ } ++ ++ void visitAndPop(int depth) { ++ // Random dummy allocation to force EscapeAnalysis to process this method ++ dummy = new TestAllocatedEscapesPtrComparison(); ++ ++ // Make a new marker ++ Marker marker = getMarker(); ++ ++ visit(depth + 1); ++ ++ // Walk and pop the marker list up to the current marker ++ boolean found = false; ++ for (int i = markerList.size() - 1; i >= 0; i--) { ++ Marker removed = markerList.remove(i); ++ ++ // In the failure, EA mistakenly converts this comparison to false ++ if (removed == marker) { ++ found = true; ++ break; ++ } ++ } ++ ++ if (!found) { ++ throw new RuntimeException("test fails"); ++ } ++ } ++ ++ ++ public static void main(String args[]) { ++ TestAllocatedEscapesPtrComparison tc = new TestAllocatedEscapesPtrComparison(); ++ ++ // Warmup and run enough times ++ for (int i = 0; i < 20000; i++) { ++ tc.visit(0); ++ } ++ } ++} +--- ./hotspot/test/compiler/EscapeAnalysis/TestUnsafePutAddressNullObjMustNotEscape.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/EscapeAnalysis/TestUnsafePutAddressNullObjMustNotEscape.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,84 @@ ++/* ++ * Copyright 2014 SAP AG. 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 8038048 ++ * @summary assert(null_obj->escape_state() == PointsToNode::NoEscape,etc) ++ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+DoEscapeAnalysis -XX:-TieredCompilation -Xbatch TestUnsafePutAddressNullObjMustNotEscape ++ * @author Richard Reingruber richard DOT reingruber AT sap DOT com ++ */ ++ ++import java.lang.reflect.Field; ++import sun.misc.Unsafe; ++ ++public class TestUnsafePutAddressNullObjMustNotEscape { ++ ++ public static Unsafe usafe; ++ public static long mem; ++ public static long checksum; ++ ++ public static void main(String[] args) throws Exception { ++ System.out.println("EXECUTING test."); ++ ++ { ++ System.out.println("Acquiring sun.misc.Unsafe.theUnsafe using reflection."); ++ getUnsafe(); ++ System.out.println("Allocating raw memory."); ++ mem = (usafe.allocateMemory(1024) + 8L) & ~7L; ++ System.out.println("Triggering JIT compilation of the test method"); ++ triggerJitCompilationOfTestMethod(); ++ } ++ ++ System.out.println("SUCCESSFULLY passed test."); ++ } ++ ++ public static void triggerJitCompilationOfTestMethod() { ++ long sum = 0; ++ for (int ii = 50000; ii >= 0; ii--) { ++ sum = testMethod(); ++ } ++ checksum = sum; ++ } ++ ++ public static class IDGen { ++ private static long id; ++ public long nextId() { ++ return id++; ++ } ++ } ++ ++ public static long testMethod() { ++ // dummy alloc to trigger escape analysis ++ IDGen gen = new IDGen(); ++ // StoreP of null_obj to raw mem triggers assertion in escape analysis ++ usafe.putAddress(mem, 0L); ++ return gen.nextId(); ++ } ++ ++ private static void getUnsafe() throws Exception { ++ Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); ++ field.setAccessible(true); ++ usafe = (sun.misc.Unsafe) field.get(null); ++ } ++} +--- ./hotspot/test/compiler/arguments/BMICommandLineOptionTestBase.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/arguments/BMICommandLineOptionTestBase.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,68 @@ ++/* ++ * 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 com.oracle.java.testlibrary.cli.*; ++ ++/** ++ * Base class for all X86 bit manipulation related command line options. ++ */ ++public abstract class BMICommandLineOptionTestBase ++ extends CPUSpecificCommandLineOptionTest { ++ ++ public static final String LZCNT_WARNING = ++ "lzcnt instruction is not available on this CPU"; ++ public static final String TZCNT_WARNING = ++ "tzcnt instruction is not available on this CPU"; ++ public static final String BMI1_WARNING = ++ "BMI1 instructions are not available on this CPU"; ++ ++ protected final String optionName; ++ protected final String warningMessage; ++ protected final String errorMessage; ++ ++ /** ++ * Construct new test on {@code optionName} option. ++ * ++ * @param optionName Name of the option to be tested ++ * without -XX:[+-] prefix. ++ * @param warningMessage Message that can occur in VM output ++ * if CPU on test box does not support ++ * features required by the option. ++ * @param supportedCPUFeatures CPU features requires by the option, ++ * that should be supported on test box. ++ * @param unsupportedCPUFeatures CPU features requires by the option, ++ * that should not be supported on test box. ++ */ ++ public BMICommandLineOptionTestBase(String optionName, ++ String warningMessage, ++ String supportedCPUFeatures[], ++ String unsupportedCPUFeatures[]) { ++ super(".*", supportedCPUFeatures, unsupportedCPUFeatures); ++ this.optionName = optionName; ++ this.warningMessage = warningMessage; ++ this.errorMessage = CommandLineOptionTest. ++ UNRECOGNIZED_OPTION_ERROR_FORMAT.format(optionName); ++ } ++ ++} ++ +--- ./hotspot/test/compiler/arguments/BMISupportedCPUTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/arguments/BMISupportedCPUTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,72 @@ ++/* ++ * 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 com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.*; ++ ++/** ++ * Test on bit manipulation related command line options, ++ * that should be executed on CPU that supports all required ++ * features. ++ */ ++public class BMISupportedCPUTest extends BMICommandLineOptionTestBase { ++ ++ /** ++ * Construct new test on {@code optionName} option. ++ * ++ * @param optionName Name of the option to be tested ++ * without -XX:[+-] prefix. ++ * @param warningMessage Message that can occur in VM output ++ * if CPU on test box does not support ++ * features required by the option. ++ * @param cpuFeatures CPU features requires by the option. ++ */ ++ public BMISupportedCPUTest(String optionName, ++ String warningMessage, ++ String... cpuFeatures) { ++ super(optionName, warningMessage, cpuFeatures, null); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ // verify that VM will succesfully start up whithout warnings ++ CommandLineOptionTest. ++ verifyJVMStartup("-XX:+" + optionName, ++ null, new String[] { warningMessage }, ++ ExitCode.OK); ++ ++ // verify that VM will succesfully start up whithout warnings ++ CommandLineOptionTest. ++ verifyJVMStartup("-XX:-" + optionName, ++ null, new String[] { warningMessage }, ++ ExitCode.OK); ++ ++ // verify that on appropriate CPU option in on by default ++ CommandLineOptionTest.verifyOptionValue(optionName, "true"); ++ ++ // verify that option could be explicitly turned off ++ CommandLineOptionTest.verifyOptionValue(optionName, "false", ++ "-XX:-" + optionName); ++ } ++} ++ +--- ./hotspot/test/compiler/arguments/BMIUnsupportedCPUTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/arguments/BMIUnsupportedCPUTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,114 @@ ++/* ++ * 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 com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.*; ++ ++/** ++ * Test on bit manipulation related command line options, ++ * that should be executed on CPU that does not support ++ * required features. ++ */ ++public class BMIUnsupportedCPUTest extends BMICommandLineOptionTestBase { ++ ++ /** ++ * Construct new test on {@code optionName} option. ++ * ++ * @param optionName Name of the option to be tested ++ * without -XX:[+-] prefix. ++ * @param warningMessage Message that can occur in VM output ++ * if CPU on test box does not support ++ * features required by the option. ++ * @param cpuFeatures CPU features requires by the option. ++ */ ++ public BMIUnsupportedCPUTest(String optionName, ++ String warningMessage, ++ String... cpuFeatures) { ++ super(optionName, warningMessage, null, cpuFeatures); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ if (Platform.isX86() || Platform.isX64()) { ++ unsupportedX86CPUTestCases(); ++ } else { ++ unsupportedNonX86CPUTestCases(); ++ } ++ } ++ ++ /** ++ * Run test cases common for all bit manipulation related VM options ++ * targeted to X86 CPU that does not support required features. ++ * ++ * @throws Throwable if test failed. ++ */ ++ public void unsupportedX86CPUTestCases() throws Throwable { ++ ++ // verify that VM will succesfully start up, but output will ++ // contain a warning ++ CommandLineOptionTest. ++ verifyJVMStartup("-XX:+" + optionName, ++ new String[] { warningMessage }, ++ new String[] { errorMessage }, ++ ExitCode.OK); ++ ++ // verify that VM will succesfully startup without any warnings ++ CommandLineOptionTest. ++ verifyJVMStartup("-XX:-" + optionName, ++ null, ++ new String[] { warningMessage, errorMessage }, ++ ExitCode.OK); ++ ++ // verify that on unsupported CPUs option is off by default ++ CommandLineOptionTest.verifyOptionValue(optionName, "false"); ++ ++ // verify that on unsupported CPUs option will be off even if ++ // it was explicitly turned on by uset ++ CommandLineOptionTest.verifyOptionValue(optionName, "false", ++ "-XX:+" + optionName); ++ ++ } ++ ++ /** ++ * Run test cases common for all bit manipulation related VM options ++ * targeted to non-X86 CPU that does not support required features. ++ * ++ * @throws Throwable if test failed. ++ */ ++ public void unsupportedNonX86CPUTestCases() throws Throwable { ++ ++ // verify that VM known nothing about tested option ++ CommandLineOptionTest. ++ verifyJVMStartup("-XX:+" + optionName, ++ new String[] { errorMessage }, ++ null, ++ ExitCode.FAIL); ++ ++ CommandLineOptionTest. ++ verifyJVMStartup("-XX:-" + optionName, ++ new String[] { errorMessage }, ++ null, ++ ExitCode.FAIL); ++ } ++} ++ +--- ./hotspot/test/compiler/arguments/TestUseBMI1InstructionsOnSupportedCPU.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/arguments/TestUseBMI1InstructionsOnSupportedCPU.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031321 ++ * @summary Verify processing of UseBMI1Instructions option on CPU with ++ * BMI1 feature support. ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestUseBMI1InstructionsOnSupportedCPU ++ * BMISupportedCPUTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseBMI1InstructionsOnSupportedCPU ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++import com.oracle.java.testlibrary.*; ++ ++public class TestUseBMI1InstructionsOnSupportedCPU ++ extends BMISupportedCPUTest { ++ ++ public TestUseBMI1InstructionsOnSupportedCPU() { ++ super("UseBMI1Instructions", BMI1_WARNING, "bmi1"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseBMI1InstructionsOnSupportedCPU().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/arguments/TestUseBMI1InstructionsOnUnsupportedCPU.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/arguments/TestUseBMI1InstructionsOnUnsupportedCPU.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,52 @@ ++/* ++ * 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 8031321 ++ * @summary Verify processing of UseBMI1Instructions option on CPU without ++ * BMI1 feature support. ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestUseBMI1InstructionsOnUnsupportedCPU ++ * BMIUnsupportedCPUTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseBMI1InstructionsOnUnsupportedCPU ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.*; ++ ++public class TestUseBMI1InstructionsOnUnsupportedCPU ++ extends BMIUnsupportedCPUTest { ++ ++ public TestUseBMI1InstructionsOnUnsupportedCPU() { ++ super("UseBMI1Instructions", BMI1_WARNING, "bmi1"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseBMI1InstructionsOnUnsupportedCPU().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/arguments/TestUseCountLeadingZerosInstructionOnSupportedCPU.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/arguments/TestUseCountLeadingZerosInstructionOnSupportedCPU.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,52 @@ ++/* ++ * 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 8031321 ++ * @summary Verify processing of UseCountLeadingZerosInstruction option ++ * on CPU with LZCNT support. ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestUseCountLeadingZerosInstructionOnSupportedCPU ++ * BMISupportedCPUTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestUseCountLeadingZerosInstructionOnSupportedCPU ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++import com.oracle.java.testlibrary.*; ++ ++public class TestUseCountLeadingZerosInstructionOnSupportedCPU ++ extends BMISupportedCPUTest { ++ ++ public TestUseCountLeadingZerosInstructionOnSupportedCPU() { ++ super("UseCountLeadingZerosInstruction", LZCNT_WARNING, "lzcnt"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseCountLeadingZerosInstructionOnSupportedCPU().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/arguments/TestUseCountLeadingZerosInstructionOnUnsupportedCPU.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/arguments/TestUseCountLeadingZerosInstructionOnUnsupportedCPU.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,52 @@ ++/* ++ * 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 8031321 ++ * @summary Verify processing of UseCountLeadingZerosInstruction option ++ * on CPU without LZCNT support. ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestUseCountLeadingZerosInstructionOnUnsupportedCPU ++ * BMIUnsupportedCPUTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestUseCountLeadingZerosInstructionOnUnsupportedCPU ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++import com.oracle.java.testlibrary.*; ++ ++public class TestUseCountLeadingZerosInstructionOnUnsupportedCPU ++ extends BMIUnsupportedCPUTest { ++ ++ public TestUseCountLeadingZerosInstructionOnUnsupportedCPU() { ++ super("UseCountLeadingZerosInstruction", LZCNT_WARNING, "lzcnt"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseCountLeadingZerosInstructionOnUnsupportedCPU().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/arguments/TestUseCountTrailingZerosInstructionOnSupportedCPU.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/arguments/TestUseCountTrailingZerosInstructionOnSupportedCPU.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,72 @@ ++/* ++ * 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 8031321 ++ * @summary Verify processing of UseCountTrailingZerosInstruction option ++ * on CPU with TZCNT (BMI1 feature) support. ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestUseCountTrailingZerosInstructionOnSupportedCPU ++ * BMISupportedCPUTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestUseCountTrailingZerosInstructionOnSupportedCPU ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.*; ++ ++public class TestUseCountTrailingZerosInstructionOnSupportedCPU ++ extends BMISupportedCPUTest { ++ ++ public TestUseCountTrailingZerosInstructionOnSupportedCPU() { ++ super("UseCountTrailingZerosInstruction", TZCNT_WARNING, "bmi1"); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ ++ super.runTestCases(); ++ ++ // verify that option will be disabled if all BMI1 instuctions ++ // are explicitly disabled ++ CommandLineOptionTest. ++ verifyOptionValue("UseCountTrailingZerosInstruction", "false", ++ "-XX:-UseBMI1Instructions"); ++ ++ // verify that option could be turned on even if other BMI1 ++ // instructions were turned off ++ CommandLineOptionTest. ++ verifyOptionValue("UseCountTrailingZerosInstruction", "true", ++ "-XX:-UseBMI1Instructions", ++ "-XX:+UseCountTrailingZerosInstruction"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseCountTrailingZerosInstructionOnSupportedCPU().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/arguments/TestUseCountTrailingZerosInstructionOnUnsupportedCPU.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/arguments/TestUseCountTrailingZerosInstructionOnUnsupportedCPU.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,70 @@ ++/* ++ * 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 8031321 ++ * @summary Verify processing of UseCountTrailingZerosInstruction option ++ * on CPU without TZCNT instuction (BMI1 feature) support. ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestUseCountTrailingZerosInstructionOnUnsupportedCPU ++ * BMIUnsupportedCPUTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestUseCountTrailingZerosInstructionOnUnsupportedCPU ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.*; ++ ++public class TestUseCountTrailingZerosInstructionOnUnsupportedCPU ++ extends BMIUnsupportedCPUTest { ++ ++ public TestUseCountTrailingZerosInstructionOnUnsupportedCPU() { ++ super("UseCountTrailingZerosInstruction", TZCNT_WARNING, "bmi1"); ++ } ++ ++ @Override ++ public void unsupportedX86CPUTestCases() throws Throwable { ++ ++ super.unsupportedX86CPUTestCases(); ++ ++ // verify that option will not be turned on during ++ // UseBMI1Instuctions processing ++ CommandLineOptionTest. ++ verifyOptionValue("UseCountTrailingZerosInstruction", "false", ++ "-XX:+UseBMI1Instructions"); ++ ++ CommandLineOptionTest. ++ verifyOptionValue("UseCountTrailingZerosInstruction", "false", ++ "-XX:+UseCountTrailingZerosInstruction", ++ "-XX:+UseBMI1Instructions"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseCountTrailingZerosInstructionOnUnsupportedCPU().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/ciReplay/TestVM.sh Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/ciReplay/TestVM.sh Wed Jul 30 03:51:43 2014 -0700 +@@ -78,8 +78,8 @@ + positive_test `expr $stop_level + 50` "TIERED LEVEL $stop_level :: REPLAY" \ + "-XX:TieredStopAtLevel=$stop_level" + stop_level=`expr $stop_level + 1` ++ cleanup + done +- cleanup + fi + + echo TEST PASSED +--- ./hotspot/test/compiler/ciReplay/common.sh Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/ciReplay/common.sh Wed Jul 30 03:51:43 2014 -0700 +@@ -99,14 +99,13 @@ + # $2 - non-tiered comp_level + nontiered_tests() { + level=`grep "^compile " $replay_data | awk '{print $6}'` +- # is level available in non-tiere ++ # is level available in non-tiered + if [ "$level" -eq $2 ] + then + positive_test $1 "NON-TIERED :: AVAILABLE COMP_LEVEL" \ + -XX:-TieredCompilation + else + negative_test `expr $1 + 1` "NON-TIERED :: UNAVAILABLE COMP_LEVEL" \ +- negative_test `expr $1 + 1` "NON-TIERED :: UNAVAILABLE COMP_LEVEL" \ + -XX:-TieredCompilation + fi + } +--- ./hotspot/test/compiler/codegen/BMI1.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/codegen/BMI1.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,301 @@ ++/* ++ * 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 8031321 ++ * @summary Support BMI1 instructions on x86/x64 ++ * @run main/othervm -Xbatch -XX:-TieredCompilation -XX:CompileCommand=compileonly,BMITests.* BMI1 ++ * ++ */ ++ ++class MemI { ++ public int x; ++ public MemI(int x) { this.x = x; } ++} ++ ++class MemL { ++ public long x; ++ public MemL(long x) { this.x = x; } ++} ++ ++class BMITests { ++ static int andnl(int src1, int src2) { ++ return ~src1 & src2; ++ } ++ static long andnq(long src1, long src2) { ++ return ~src1 & src2; ++ } ++ static int andnl(int src1, MemI src2) { ++ return ~src1 & src2.x; ++ } ++ static long andnq(long src1, MemL src2) { ++ return ~src1 & src2.x; ++ } ++ static int blsil(int src1) { ++ return src1 & -src1; ++ } ++ static long blsiq(long src1) { ++ return src1 & -src1; ++ } ++ static int blsil(MemI src1) { ++ return src1.x & -src1.x; ++ } ++ static long blsiq(MemL src1) { ++ return src1.x & -src1.x; ++ } ++ static int blsmskl(int src1) { ++ return (src1 - 1) ^ src1; ++ } ++ static long blsmskq(long src1) { ++ return (src1 - 1) ^ src1; ++ } ++ static int blsmskl(MemI src1) { ++ return (src1.x - 1) ^ src1.x; ++ } ++ static long blsmskq(MemL src1) { ++ return (src1.x - 1) ^ src1.x; ++ } ++ static int blsrl(int src1) { ++ return (src1 - 1) & src1; ++ } ++ static long blsrq(long src1) { ++ return (src1 - 1) & src1; ++ } ++ static int blsrl(MemI src1) { ++ return (src1.x - 1) & src1.x; ++ } ++ static long blsrq(MemL src1) { ++ return (src1.x - 1) & src1.x; ++ } ++ static int lzcntl(int src1) { ++ return Integer.numberOfLeadingZeros(src1); ++ } ++ static int lzcntq(long src1) { ++ return Long.numberOfLeadingZeros(src1); ++ } ++ static int tzcntl(int src1) { ++ return Integer.numberOfTrailingZeros(src1); ++ } ++ static int tzcntq(long src1) { ++ return Long.numberOfTrailingZeros(src1); ++ } ++} ++ ++public class BMI1 { ++ private final static int ITERATIONS = 1000000; ++ ++ public static void main(String[] args) { ++ int ix = 0x01234567; ++ int iy = 0x89abcdef; ++ MemI imy = new MemI(iy); ++ long lx = 0x0123456701234567L; ++ long ly = 0x89abcdef89abcdefL; ++ MemL lmy = new MemL(ly); ++ ++ { // match(Set dst (AndI (XorI src1 minus_1) src2)) ++ int z = BMITests.andnl(ix, iy); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.andnl(ix, iy); ++ if (ii != z) { ++ throw new Error("andnl with register failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndL (XorL src1 minus_1) src2)) ++ long z = BMITests.andnq(lx, ly); ++ for (int i = 0; i < ITERATIONS; i++) { ++ long ll = BMITests.andnq(lx, ly); ++ if (ll != z) { ++ throw new Error("andnq with register failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndI (XorI src1 minus_1) (LoadI src2))) ++ int z = BMITests.andnl(ix, imy); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.andnl(ix, imy); ++ if (ii != z) { ++ throw new Error("andnl with memory failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndL (XorL src1 minus_1) (LoadL src2))) ++ long z = BMITests.andnq(lx, lmy); ++ for (int i = 0; i < ITERATIONS; i++) { ++ long ll = BMITests.andnq(lx, lmy); ++ if (ll != z) { ++ throw new Error("andnq with memory failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndI (SubI imm_zero src) src)) ++ int z = BMITests.blsil(ix); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.blsil(ix); ++ if (ii != z) { ++ throw new Error("blsil with register failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndL (SubL imm_zero src) src)) ++ long z = BMITests.blsiq(lx); ++ for (int i = 0; i < ITERATIONS; i++) { ++ long ll = BMITests.blsiq(lx); ++ if (ll != z) { ++ throw new Error("blsiq with register failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndI (SubI imm_zero (LoadI src) ) (LoadI src) )) ++ int z = BMITests.blsil(imy); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.blsil(imy); ++ if (ii != z) { ++ throw new Error("blsil with memory failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndL (SubL imm_zero (LoadL src) ) (LoadL src) )) ++ long z = BMITests.blsiq(lmy); ++ for (int i = 0; i < ITERATIONS; i++) { ++ long ll = BMITests.blsiq(lmy); ++ if (ll != z) { ++ throw new Error("blsiq with memory failed"); ++ } ++ } ++ } ++ ++ { // match(Set dst (XorI (AddI src minus_1) src)) ++ int z = BMITests.blsmskl(ix); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.blsmskl(ix); ++ if (ii != z) { ++ throw new Error("blsmskl with register failed"); ++ } ++ } ++ } ++ { // match(Set dst (XorL (AddL src minus_1) src)) ++ long z = BMITests.blsmskq(lx); ++ for (int i = 0; i < ITERATIONS; i++) { ++ long ll = BMITests.blsmskq(lx); ++ if (ll != z) { ++ throw new Error("blsmskq with register failed"); ++ } ++ } ++ } ++ { // match(Set dst (XorI (AddI (LoadI src) minus_1) (LoadI src) ) ) ++ int z = BMITests.blsmskl(imy); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.blsmskl(imy); ++ if (ii != z) { ++ throw new Error("blsmskl with memory failed"); ++ } ++ } ++ } ++ { // match(Set dst (XorL (AddL (LoadL src) minus_1) (LoadL src) ) ) ++ long z = BMITests.blsmskq(lmy); ++ for (int i = 0; i < ITERATIONS; i++) { ++ long ll = BMITests.blsmskq(lmy); ++ if (ll != z) { ++ throw new Error("blsmskq with memory failed"); ++ } ++ } ++ } ++ ++ { // match(Set dst (AndI (AddI src minus_1) src) ) ++ int z = BMITests.blsrl(ix); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.blsrl(ix); ++ if (ii != z) { ++ throw new Error("blsrl with register failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndL (AddL src minus_1) src) ) ++ long z = BMITests.blsrq(lx); ++ for (int i = 0; i < ITERATIONS; i++) { ++ long ll = BMITests.blsrq(lx); ++ if (ll != z) { ++ throw new Error("blsrq with register failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndI (AddI (LoadI src) minus_1) (LoadI src) ) ) ++ int z = BMITests.blsrl(imy); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.blsrl(imy); ++ if (ii != z) { ++ throw new Error("blsrl with memory failed"); ++ } ++ } ++ } ++ { // match(Set dst (AndL (AddL (LoadL src) minus_1) (LoadL src)) ) ++ long z = BMITests.blsrq(lmy); ++ for (int i = 0; i < ITERATIONS; i++) { ++ long ll = BMITests.blsrq(lmy); ++ if (ll != z) { ++ throw new Error("blsrq with memory failed"); ++ } ++ } ++ } ++ ++ { ++ int z = BMITests.lzcntl(ix); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.lzcntl(ix); ++ if (ii != z) { ++ throw new Error("lzcntl failed"); ++ } ++ } ++ } ++ { ++ int z = BMITests.lzcntq(lx); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.lzcntq(lx); ++ if (ii != z) { ++ throw new Error("lzcntq failed"); ++ } ++ } ++ } ++ ++ { ++ int z = BMITests.tzcntl(ix); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.tzcntl(ix); ++ if (ii != z) { ++ throw new Error("tzcntl failed"); ++ } ++ } ++ } ++ { ++ int z = BMITests.tzcntq(lx); ++ for (int i = 0; i < ITERATIONS; i++) { ++ int ii = BMITests.tzcntq(lx); ++ if (ii != z) { ++ throw new Error("tzcntq failed"); ++ } ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/codegen/C1NullCheckOfNullStore.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/codegen/C1NullCheckOfNullStore.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,57 @@ ++/* ++ * 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 8039043 ++ * @summary Null check is placed in a wrong place when storing a null to an object field on x64 with compressed oops off ++ * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:CompileCommand=compileonly,C1NullCheckOfNullStore::test -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:-UseCompressedOops C1NullCheckOfNullStore ++ * ++ */ ++ ++public class C1NullCheckOfNullStore { ++ private static class Foo { ++ Object bar; ++ } ++ static private void test(Foo x) { ++ x.bar = null; ++ } ++ static public void main(String args[]) { ++ Foo x = new Foo(); ++ for (int i = 0; i < 10000; i++) { ++ test(x); ++ } ++ boolean gotNPE = false; ++ try { ++ for (int i = 0; i < 10000; i++) { ++ test(null); ++ } ++ } ++ catch(NullPointerException e) { ++ gotNPE = true; ++ } ++ if (!gotNPE) { ++ throw new Error("Expecting a NullPointerException"); ++ } ++ } ++} +--- ./hotspot/test/compiler/debug/VerifyAdapterSharing.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/debug/VerifyAdapterSharing.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,43 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @bug 8030783 ++ * @summary Regression test for 8026478 ++ * @library /testlibrary ++ * ++ */ ++import com.oracle.java.testlibrary.*; ++ ++public class VerifyAdapterSharing { ++ public static void main(String[] args) throws Exception { ++ ProcessBuilder pb; ++ OutputAnalyzer out; ++ ++ pb = ProcessTools.createJavaProcessBuilder("-Xcomp", "-XX:+IgnoreUnrecognizedVMOptions", ++ "-XX:+VerifyAdapterSharing", "-version"); ++ out = new OutputAnalyzer(pb.start()); ++ out.shouldHaveExitValue(0); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/BMITestRunner.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/BMITestRunner.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,442 @@ ++/* ++ * 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.*; ++import java.io.IOException; ++import java.nio.file.Files; ++import java.nio.file.Paths; ++import java.nio.charset.StandardCharsets; ++ ++import com.oracle.java.testlibrary.*; ++ ++/** ++ * Test runner that invokes all methods implemented by particular Expr ++ * with random arguments in two different JVM processes and compares output. ++ * JVMs being started in different modes - one in int and other in comp ++ * with C2 and disabled tiered compilation. ++ */ ++public class BMITestRunner { ++ ++ enum VMMode { ++ COMP, INT; ++ }; ++ ++ public static int DEFAULT_ITERATIONS_COUNT = 4000; ++ ++ /** ++ * Execute all methods implemented by expr in int and comp modes ++ * and compare output. ++ * Test pass only of output obtained with different VM modes is equal. ++ * To control behaviour of test following options could be passed: ++ *
    ++ *
  • -iterations=<N> each operation implemented by ++ * expr will be executed N times. Default value ++ * is 4000.
  • ++ *
  • -seed=<SEED> arguments for expr's methods ++ * obtained via RNG initiated with seed SEED. By default ++ * some random seed will be used.
  • ++ *
++ * ++ * @param expr operation that should be tested ++ * @param testOpts options to control test behaviour ++ * @param additionalVMOpts additional options for VM ++ * ++ * @throws Throwable if test failed. ++ */ ++ public static void runTests(Class expr, ++ String testOpts[], ++ String... additionalVMOpts) ++ throws Throwable { ++ ++ int seed = new Random().nextInt(); ++ int iterations = DEFAULT_ITERATIONS_COUNT; ++ ++ for (String testOption : testOpts) { ++ if (testOption.startsWith("-iterations=")) { ++ iterations = Integer.valueOf(testOption. ++ replace("-iterations=", "")); ++ } else if (testOption.startsWith("-seed=")) { ++ seed = Integer.valueOf(testOption.replace("-seed=", "")); ++ } ++ } ++ ++ System.out.println("Running test with seed: " + seed); ++ ++ OutputAnalyzer intOutput = runTest(expr, VMMode.INT, ++ additionalVMOpts, ++ seed, iterations); ++ OutputAnalyzer compOutput = runTest(expr, VMMode.COMP, ++ additionalVMOpts, ++ seed, iterations); ++ ++ dumpOutput(intOutput, "int"); ++ dumpOutput(compOutput, "comp"); ++ ++ Asserts.assertStringsEqual(intOutput.getStdout(), ++ compOutput.getStdout(), ++ "Results obtained in -Xint and " + ++ "-Xcomp should be the same."); ++ } ++ ++ /** ++ * Execute tests on methods implemented by expr in new VM ++ * started in testVMMode mode. ++ * ++ * @param expr operation that should be tested ++ * @param testVMMode VM mode for test ++ * @param additionalVMOpts additional options for VM ++ * @param seed for RNG used it tests ++ * @param iterations that will be used to invoke expr's methods. ++ * ++ * @return OutputAnalyzer for executed test. ++ * @throws Throwable when something goes wrong. ++ */ ++ public static OutputAnalyzer runTest(Class expr, ++ VMMode testVMMode, ++ String additionalVMOpts[], ++ int seed, int iterations) ++ throws Throwable { ++ ++ List vmOpts = new LinkedList(); ++ ++ Collections.addAll(vmOpts, additionalVMOpts); ++ ++ //setup mode-specific options ++ switch (testVMMode) { ++ case INT: ++ Collections.addAll(vmOpts, new String[] { "-Xint" }); ++ break; ++ case COMP: ++ Collections.addAll(vmOpts, new String[] { ++ "-Xcomp", ++ "-XX:-TieredCompilation", ++ String.format("-XX:CompileCommand=compileonly,%s::*", ++ expr.getName()) ++ }); ++ break; ++ } ++ ++ Collections.addAll(vmOpts, new String[] { ++ "-XX:+DisplayVMOutputToStderr", ++ Executor.class.getName(), ++ expr.getName(), ++ new Integer(seed).toString(), ++ new Integer(iterations).toString() ++ }); ++ ++ OutputAnalyzer outputAnalyzer = ProcessTools. ++ executeTestJvm(vmOpts.toArray(new String[vmOpts.size()])); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ return outputAnalyzer; ++ } ++ ++ /** ++ * Dump stdout and stderr of test process to prefix.test.out ++ * and prefix.test.err respectively. ++ * ++ * @param outputAnalyzer OutputAnalyzer whom output should be dumped ++ * @param prefix Prefix that will be used in file names. ++ * @throws IOException if unable to dump output to file. ++ */ ++ protected static void dumpOutput(OutputAnalyzer outputAnalyzer, ++ String prefix) ++ throws IOException { ++ Files.write(Paths.get(prefix + ".test.out"), ++ outputAnalyzer.getStdout().getBytes()); ++ ++ Files.write(Paths.get(prefix + ".test.err"), ++ outputAnalyzer.getStderr().getBytes()); ++ } ++ ++ ++ /** ++ * Executor that invoke all methods implemented by particular ++ * Expr instance. ++ */ ++ public static class Executor { ++ ++ /** ++ * Usage: BMITestRunner$Executor ++ */ ++ public static void main(String args[]) throws Exception { ++ @SuppressWarnings("unchecked") ++ Class exprClass = ++ (Class)Class.forName(args[0]); ++ Expr expr = exprClass.getConstructor().newInstance(); ++ Random rng = new Random(Integer.valueOf(args[1])); ++ int iterations = Integer.valueOf(args[2]); ++ runTests(expr, iterations, rng); ++ } ++ ++ ++ public static int[] getIntBitShifts() { ++ //SIZE+1 shift is for zero. ++ int data[] = new int[Integer.SIZE+1]; ++ for (int s = 0; s < data.length; s++) { ++ data[s] = 1< 0X%x", ++ value, expr.intExpr(value)); ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ int value = rng.nextInt(); ++ log("UnaryIntReg(0X%x) -> 0X%x", ++ value, expr.intExpr(value)); ++ } ++ } ++ ++ public static void runUnaryIntMemTest(Expr expr, int iterations, ++ Random rng) { ++ if (!(expr.isUnaryArgumentSupported() ++ && expr.isIntExprSupported() ++ && expr.isMemExprSupported())) { ++ return; ++ } ++ ++ for (int value : getIntBitShifts()) { ++ log("UnaryIntMem(0X%x) -> 0X%x", ++ value, expr.intExpr(new Expr.MemI(value))); ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ int value = rng.nextInt(); ++ log("UnaryIntMem(0X%x) -> 0X%x", ++ value, expr.intExpr(new Expr.MemI(value))); ++ } ++ } ++ ++ public static void runUnaryLongRegTest(Expr expr, int iterations, ++ Random rng) { ++ if (!(expr.isUnaryArgumentSupported() ++ && expr.isLongExprSupported())) { ++ return; ++ } ++ ++ for (long value : getLongBitShifts()) { ++ log("UnaryLongReg(0X%x) -> 0X%x", ++ value, expr.longExpr(value)); ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ long value = rng.nextLong(); ++ log("UnaryLongReg(0X%x) -> 0X%x", ++ value, expr.longExpr(value)); ++ } ++ } ++ ++ public static void runUnaryLongMemTest(Expr expr, int iterations, ++ Random rng) { ++ if (!(expr.isUnaryArgumentSupported() ++ && expr.isLongExprSupported() ++ && expr.isMemExprSupported())) { ++ return; ++ } ++ ++ for (long value : getLongBitShifts()) { ++ log("UnaryLongMem(0X%x) -> 0X%x", ++ value, expr.longExpr(new Expr.MemL(value))); ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ long value = rng.nextLong(); ++ log("UnaryLongMem(0X%x) -> 0X%x", ++ value, expr.longExpr(new Expr.MemL(value))); ++ } ++ } ++ ++ public static void runBinaryRegRegIntTest(Expr expr, int iterations, ++ Random rng) { ++ if (!(expr.isIntExprSupported() ++ && expr.isBinaryArgumentSupported())) { ++ return; ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ int aValue = rng.nextInt(); ++ int bValue = rng.nextInt(); ++ log("BinaryIntRegReg(0X%x, 0X%x) -> 0X%x", ++ aValue, bValue, expr.intExpr(aValue, bValue)); ++ } ++ } ++ ++ public static void runBinaryRegMemIntTest(Expr expr, int iterations, ++ Random rng) { ++ if (!(expr.isIntExprSupported() ++ && expr.isBinaryArgumentSupported() ++ && expr.isMemExprSupported())) { ++ return; ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ int aValue = rng.nextInt(); ++ int bValue = rng.nextInt(); ++ log("BinaryIntRegMem(0X%x, 0X%x) -> 0X%x", aValue, bValue, ++ expr.intExpr(aValue, new Expr.MemI(bValue))); ++ } ++ } ++ ++ public static void runBinaryMemRegIntTest(Expr expr, int iterations, ++ Random rng) { ++ if (!(expr.isIntExprSupported() ++ && expr.isBinaryArgumentSupported() ++ && expr.isMemExprSupported())) { ++ return; ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ int aValue = rng.nextInt(); ++ int bValue = rng.nextInt(); ++ log("BinaryIntMemReg(0X%x, 0X%x) -> 0X%x", aValue, bValue, ++ expr.intExpr(new Expr.MemI(aValue), bValue)); ++ } ++ } ++ ++ public static void runBinaryMemMemIntTest(Expr expr, int iterations, ++ Random rng) { ++ if (!(expr.isIntExprSupported() ++ && expr.isBinaryArgumentSupported() ++ && expr.isMemExprSupported())) { ++ return; ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ int aValue = rng.nextInt(); ++ int bValue = rng.nextInt(); ++ log("BinaryIntMemMem(0X%x, 0X%x) -> 0X%x", aValue, bValue, ++ expr.intExpr(new Expr.MemI(aValue), ++ new Expr.MemI(bValue))); ++ } ++ } ++ ++ public static void runBinaryRegRegLongTest(Expr expr, ++ int iterations, ++ Random rng) { ++ if (!(expr.isLongExprSupported() ++ && expr.isBinaryArgumentSupported())) { ++ return; ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ long aValue = rng.nextLong(); ++ long bValue = rng.nextLong(); ++ log("BinaryLongRegReg(0X%x, 0X%x) -> 0X%x", aValue, bValue, ++ expr.longExpr(aValue, bValue)); ++ } ++ } ++ ++ public static void runBinaryRegMemLongTest(Expr expr, ++ int iterations, ++ Random rng) { ++ if (!(expr.isLongExprSupported() ++ && expr.isBinaryArgumentSupported() ++ && expr.isMemExprSupported())) { ++ return; ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ long aValue = rng.nextLong(); ++ long bValue = rng.nextLong(); ++ log("BinaryLongRegMem(0X%x, 0X%x) -> 0X%x", aValue, bValue, ++ expr.longExpr(aValue, new Expr.MemL(bValue))); ++ } ++ } ++ ++ public static void runBinaryMemRegLongTest(Expr expr, ++ int iterations, ++ Random rng) { ++ if (!(expr.isLongExprSupported() ++ && expr.isBinaryArgumentSupported() ++ && expr.isMemExprSupported())) { ++ return; ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ long aValue = rng.nextLong(); ++ long bValue = rng.nextLong(); ++ log("BinaryLongMemReg(0X%x, 0X%x) -> 0X%x", aValue, bValue, ++ expr.longExpr(new Expr.MemL(aValue), bValue)); ++ } ++ } ++ ++ public static void runBinaryMemMemLongTest(Expr expr, ++ int iterations, ++ Random rng) { ++ if (!(expr.isLongExprSupported() ++ && expr.isBinaryArgumentSupported() ++ && expr.isMemExprSupported())) { ++ return; ++ } ++ ++ for (int i = 0; i < iterations; i++) { ++ long aValue = rng.nextLong(); ++ long bValue = rng.nextLong(); ++ log("BinaryLongMemMem(0X%x, 0X%x) -> 0X%x", aValue, bValue, ++ expr.longExpr(new Expr.MemL(aValue), ++ new Expr.MemL(bValue))); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/Expr.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/Expr.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,178 @@ ++/* ++ * 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. ++ * ++ */ ++ ++/** ++ * Expression that should be replaced by particular instrinsic ++ * or intruction during compilation. ++ */ ++ ++public abstract class Expr { ++ ++ public static class MemI { ++ public MemI(int i) { ++ this.value = i; ++ } ++ ++ public int value; ++ } ++ ++ public static class MemL { ++ public MemL(long l) { ++ this.value = l; ++ } ++ ++ public long value; ++ } ++ ++ public boolean isUnaryArgumentSupported() { ++ return false; ++ } ++ ++ public boolean isIntExprSupported() { ++ return false; ++ } ++ ++ public boolean isBinaryArgumentSupported() { ++ return false; ++ } ++ ++ public boolean isLongExprSupported() { ++ return false; ++ } ++ ++ public boolean isMemExprSupported() { ++ return false; ++ } ++ ++ public int intExpr(int reg) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public int intExpr(MemI mem) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public int intExpr(int a, int b) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public int intExpr(int a, MemI b) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public int intExpr(MemI a, int b) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public int intExpr(MemI a, MemI b) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public long longExpr(long reg) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public long longExpr(MemL mem) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public long longExpr(long a, long b) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public long longExpr(long a, MemL b) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public long longExpr(MemL a, long b) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public long longExpr(MemL a, MemL b) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ public static class BMIExpr extends Expr { ++ ++ public boolean isMemExprSupported() { ++ return true; ++ } ++ } ++ ++ public static class BMIBinaryExpr extends BMIExpr { ++ ++ public boolean isBinaryArgumentSupported() { ++ return true; ++ } ++ ++ } ++ ++ public static class BMIUnaryExpr extends BMIExpr { ++ public boolean isUnaryArgumentSupported() { ++ return true; ++ } ++ } ++ ++ public static class BMIBinaryIntExpr extends BMIBinaryExpr { ++ public boolean isIntExprSupported() { ++ return true; ++ } ++ } ++ ++ public static class BMIBinaryLongExpr extends BMIBinaryExpr { ++ public boolean isLongExprSupported() { ++ return true; ++ } ++ } ++ ++ public static class BMIUnaryIntExpr extends BMIUnaryExpr { ++ public boolean isIntExprSupported() { ++ return true; ++ } ++ } ++ ++ public static class BMIUnaryLongExpr extends BMIUnaryExpr { ++ public boolean isLongExprSupported() { ++ return true; ++ } ++ } ++ ++ public static class BitCountingExpr extends Expr { ++ public boolean isUnaryArgumentSupported() { ++ return true; ++ } ++ } ++ ++ public static class BitCountingIntExpr extends BitCountingExpr { ++ public boolean isIntExprSupported() { ++ return true; ++ } ++ } ++ ++ public static class BitCountingLongExpr extends BitCountingExpr { ++ public boolean isLongExprSupported() { ++ return true; ++ } ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestAndnI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestAndnI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,91 @@ ++/* ++ * 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 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of ANDN instruction ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestAndnI BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestAndnI ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestAndnI { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. "+ ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(AndnIExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ BMITestRunner.runTests(AndnICommutativeExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ } ++ ++ public static class AndnIExpr extends Expr.BMIBinaryIntExpr { ++ ++ public int intExpr(int src1, int src2) { ++ return ~src1 & src2; ++ } ++ ++ public int intExpr(int src1, Expr.MemI src2) { ++ return ~src1 & src2.value; ++ } ++ ++ public int intExpr(Expr.MemI src1, int src2) { ++ return ~src1.value & src2; ++ } ++ ++ public int intExpr(Expr.MemI src1, Expr.MemI src2) { ++ return ~src1.value & src2.value; ++ } ++ } ++ ++ public static class AndnICommutativeExpr extends Expr.BMIBinaryIntExpr { ++ ++ public int intExpr(int src1, int src2) { ++ return src1 & ~src2; ++ } ++ ++ public int intExpr(int src1, Expr.MemI src2) { ++ return src1 & ~src2.value; ++ } ++ ++ public int intExpr(Expr.MemI src1, int src2) { ++ return src1.value & ~src2; ++ } ++ ++ public int intExpr(Expr.MemI src1, Expr.MemI src2) { ++ return src1.value & ~src2.value; ++ } ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestAndnL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestAndnL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,95 @@ ++/* ++ * 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 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of ANDN instruction ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestAndnL BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestAndnL ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestAndnL { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(AndnLExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ BMITestRunner.runTests(AndnLCommutativeExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ } ++ ++ public static class AndnLExpr extends Expr.BMIBinaryLongExpr { ++ ++ public long longExpr(long src1, long src2) { ++ return ~src1 & src2; ++ } ++ ++ public long longExpr(long src1, Expr.MemL src2) { ++ return ~src1 & src2.value; ++ } ++ ++ public long longExpr(Expr.MemL src1, long src2) { ++ return ~src1.value & src2; ++ } ++ ++ public long longExpr(Expr.MemL src1, Expr.MemL src2) { ++ return ~src1.value & src2.value; ++ } ++ ++ ++ } ++ ++ public static class AndnLCommutativeExpr extends Expr.BMIBinaryLongExpr { ++ ++ public long longExpr(long src1, long src2) { ++ return src1 & ~src2; ++ } ++ ++ public long longExpr(long src1, Expr.MemL src2) { ++ return src1 & ~src2.value; ++ } ++ ++ public long longExpr(Expr.MemL src1, long src2) { ++ return src1.value & ~src2; ++ } ++ ++ public long longExpr(Expr.MemL src1, Expr.MemL src2) { ++ return src1.value & ~src2.value; ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestBlsiI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestBlsiI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,78 @@ ++/* ++ * 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 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of BLSI instruction ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestBlsiI BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestBlsiI ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestBlsiI { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(BlsiIExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ BMITestRunner.runTests(BlsiICommutativeExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ } ++ ++ public static class BlsiIExpr extends Expr.BMIUnaryIntExpr { ++ ++ public int intExpr(int src) { ++ return -src & src; ++ } ++ ++ public int intExpr(Expr.MemI src) { ++ return -src.value & src.value; ++ } ++ ++ } ++ ++ public static class BlsiICommutativeExpr extends Expr.BMIUnaryIntExpr { ++ ++ public int intExpr(int src) { ++ return src & -src; ++ } ++ ++ public int intExpr(Expr.MemI src) { ++ return src.value & -src.value; ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestBlsiL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestBlsiL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,78 @@ ++/* ++ * 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 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of BLSI instruction ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestBlsiL BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestBlsiL ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestBlsiL { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(BlsiLExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ BMITestRunner.runTests(BlsiLCommutativeExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ } ++ ++ public static class BlsiLExpr extends Expr.BMIUnaryLongExpr { ++ ++ public long longExpr(long src) { ++ return -src & src; ++ } ++ ++ public long longExpr(Expr.MemL src) { ++ return -src.value & src.value; ++ } ++ ++ } ++ ++ public static class BlsiLCommutativeExpr extends Expr.BMIUnaryLongExpr { ++ ++ public long longExpr(long src) { ++ return src & -src; ++ } ++ ++ public long longExpr(Expr.MemL src) { ++ return src.value & -src.value; ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestBlsmskI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestBlsmskI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,78 @@ ++/* ++ * 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 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of BLSMSK instruction ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestBlsmskI BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestBlsmskI ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestBlsmskI { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(BlsmskIExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ BMITestRunner.runTests(BlsmskICommutativeExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ } ++ ++ public static class BlsmskIExpr extends Expr.BMIUnaryIntExpr { ++ ++ public int intExpr(int src) { ++ return (src - 1) ^ src; ++ } ++ ++ public int intExpr(Expr.MemI src) { ++ return (src.value - 1) ^ src.value; ++ } ++ ++ } ++ ++ public static class BlsmskICommutativeExpr extends Expr.BMIUnaryIntExpr { ++ ++ public int intExpr(int src) { ++ return src ^ (src - 1); ++ } ++ ++ public int intExpr(Expr.MemI src) { ++ return src.value ^ (src.value - 1); ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestBlsmskL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestBlsmskL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of BLSMSK instruction ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestBlsmskL BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestBlsmskL ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestBlsmskL { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(BlsmskLExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ BMITestRunner.runTests(BlsmskLCommutativeExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ } ++ ++ public static class BlsmskLExpr ++ extends Expr.BMIUnaryLongExpr { ++ ++ public long longExpr(long src) { ++ return (src - 1) ^ src; ++ } ++ ++ public long longExpr(Expr.MemL src) { ++ return (src.value - 1) ^ src.value; ++ } ++ ++ } ++ ++ public static class BlsmskLCommutativeExpr ++ extends Expr.BMIUnaryLongExpr { ++ ++ public long longExpr(long src) { ++ return src ^ (src - 1); ++ } ++ ++ public long longExpr(Expr.MemL src) { ++ return src.value ^ (src.value - 1); ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestBlsrI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestBlsrI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,78 @@ ++/* ++ * 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 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of BLSR instruction ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestBlsrI BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestBlsrI ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestBlsrI { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(BlsrIExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ BMITestRunner.runTests(BlsrICommutativeExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ } ++ ++ public static class BlsrIExpr extends Expr.BMIUnaryIntExpr { ++ ++ public int intExpr(int src) { ++ return (src - 1) & src; ++ } ++ ++ public int intExpr(Expr.MemI src) { ++ return (src.value - 1) & src.value; ++ } ++ ++ } ++ ++ public static class BlsrICommutativeExpr extends Expr.BMIUnaryIntExpr { ++ ++ public int intExpr(int src) { ++ return src & (src - 1); ++ } ++ ++ public int intExpr(Expr.MemI src) { ++ return src.value & (src.value - 1); ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestBlsrL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestBlsrL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,78 @@ ++/* ++ * 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 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of BLSR instruction ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestBlsrL BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestBlsrL ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestBlsrL { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(BlsrLExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ BMITestRunner.runTests(BlsrLCommutativeExpr.class, args, ++ "-XX:+UseBMI1Instructions"); ++ } ++ ++ public static class BlsrLExpr extends Expr.BMIUnaryLongExpr { ++ ++ public long longExpr(long src) { ++ return (src - 1) & src; ++ } ++ ++ public long longExpr(Expr.MemL src) { ++ return (src.value - 1) & src.value; ++ } ++ ++ } ++ ++ public static class BlsrLCommutativeExpr extends Expr.BMIUnaryLongExpr { ++ ++ public long longExpr(long src) { ++ return src & (src - 1); ++ } ++ ++ public long longExpr(Expr.MemL src) { ++ return src.value & (src.value - 1); ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestLzcntI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestLzcntI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/** ++ * @test ++ * @bug 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of intrinsic ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestLzcntI BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestLzcntI ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestLzcntI { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("lzcnt")) { ++ System.out.println("CPU does not support lzcnt feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(LzcntIExpr.class, args, ++ "-XX:+UseCountLeadingZerosInstruction"); ++ } ++ ++ public static class LzcntIExpr extends Expr.BitCountingIntExpr { ++ ++ public int intExpr(int src) { ++ return Integer.numberOfLeadingZeros(src); ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestLzcntL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestLzcntL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/** ++ * @test ++ * @bug 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of intrinsic ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestLzcntL BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestLzcntL ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestLzcntL { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("lzcnt")) { ++ System.out.println("CPU does not support lzcnt feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(LzcntLExpr.class, args, ++ "-XX:+UseCountLeadingZerosInstruction"); ++ } ++ ++ public static class LzcntLExpr extends Expr.BitCountingLongExpr { ++ ++ public long longExpr(long src) { ++ return Long.numberOfLeadingZeros(src); ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestTzcntI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestTzcntI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/** ++ * @test ++ * @bug 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of intrinsic ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestTzcntI BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestTzcntI ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestTzcntI { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(TzcntIExpr.class, args, ++ "-XX:+UseCountTrailingZerosInstruction"); ++ } ++ ++ public static class TzcntIExpr extends Expr.BitCountingIntExpr { ++ ++ public int intExpr(int src) { ++ return Integer.numberOfTrailingZeros(src); ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/TestTzcntL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/TestTzcntL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/** ++ * @test ++ * @bug 8031321 ++ * @summary Verify that results of computations are the same w/ ++ * and w/o usage of intrinsic ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestTzcntL BMITestRunner Expr ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestTzcntL ++ */ ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++public class TestTzcntL { ++ ++ public static void main(String args[]) throws Throwable { ++ if (!CPUInfo.hasFeature("bmi1")) { ++ System.out.println("CPU does not support bmi1 feature. " + ++ "Test skipped."); ++ return; ++ } ++ ++ BMITestRunner.runTests(TzcntLExpr.class, args, ++ "-XX:+UseCountTrailingZerosInstruction"); ++ } ++ ++ public static class TzcntLExpr extends Expr.BitCountingLongExpr { ++ ++ public long longExpr(long src) { ++ return Long.numberOfTrailingZeros(src); ++ } ++ ++ } ++ ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/AddnTestI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/AddnTestI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,57 @@ ++/* ++ * 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 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build AddnTestI ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions AddnTestI ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class AddnTestI extends BmiIntrinsicBase.BmiTestCase { ++ ++ protected AddnTestI(Method method) { ++ super(method); ++ // from intel manual VEX.NDS.LZ.0F38.W0 F2 /r, example c4e260f2c2 ++ instrMask = new byte[]{ ++ (byte) 0xFF, ++ (byte) 0x1F, ++ (byte) 0x00, ++ (byte) 0xFF}; ++ instrPattern = new byte[]{ ++ (byte) 0xC4, // prefix for 3-byte VEX instruction ++ (byte) 0x02, // 00010 implied 0F 38 leading opcode bytes ++ (byte) 0x00, ++ (byte) 0xF2}; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ BmiIntrinsicBase.verifyTestCase(AddnTestI::new, TestAndnI.AndnIExpr.class.getDeclaredMethods()); ++ BmiIntrinsicBase.verifyTestCase(AddnTestI::new, TestAndnI.AndnICommutativeExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/AddnTestL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/AddnTestL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build AddnTestL ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions AddnTestL ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class AddnTestL extends AddnTestI { ++ ++ protected AddnTestL(Method method) { ++ super(method); ++ isLongOperation = true; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ BmiIntrinsicBase.verifyTestCase(AddnTestL::new, TestAndnL.AndnLExpr.class.getDeclaredMethods()); ++ BmiIntrinsicBase.verifyTestCase(AddnTestL::new, TestAndnL.AndnLCommutativeExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsiTestI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsiTestI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,59 @@ ++/* ++ * 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 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build BlsiTestI ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions BlsiTestI ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class BlsiTestI extends BmiIntrinsicBase.BmiTestCase { ++ ++ protected BlsiTestI(Method method) { ++ super(method); ++ //from intel manual VEX.NDD.LZ.0F38.W0 F3 /3 ++ instrMask = new byte[]{ ++ (byte) 0xFF, ++ (byte) 0x1F, ++ (byte) 0x00, ++ (byte) 0xFF, ++ (byte) 0b0011_1000}; ++ instrPattern = new byte[]{ ++ (byte) 0xC4, // prefix for 3-byte VEX instruction ++ (byte) 0x02, // 00010 implied 0F 38 leading opcode bytes ++ (byte) 0x00, ++ (byte) 0xF3, ++ (byte) 0b0001_1000}; // bits 543 == 011 (3) ++ } ++ ++ public static void main(String[] args) throws Exception { ++ BmiIntrinsicBase.verifyTestCase(BlsiTestI::new, TestBlsiI.BlsiIExpr.class.getDeclaredMethods()); ++ BmiIntrinsicBase.verifyTestCase(BlsiTestI::new, TestBlsiI.BlsiICommutativeExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsiTestL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsiTestL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build BlsiTestL ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions BlsiTestL ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class BlsiTestL extends BlsiTestI { ++ ++ protected BlsiTestL(Method method) { ++ super(method); ++ isLongOperation = true; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ BmiIntrinsicBase.verifyTestCase(BlsiTestL::new, TestBlsiL.BlsiLExpr.class.getDeclaredMethods()); ++ BmiIntrinsicBase.verifyTestCase(BlsiTestL::new, TestBlsiL.BlsiLCommutativeExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsmskTestI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsmskTestI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,59 @@ ++/* ++ * 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 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build BlsmskTestI ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions BlsmskTestI ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class BlsmskTestI extends BmiIntrinsicBase.BmiTestCase { ++ ++ protected BlsmskTestI(Method method) { ++ super(method); ++ //from intel manual VEX.NDD.LZ.0F38.W0 F3 /2 ++ instrMask = new byte[]{ ++ (byte) 0xFF, ++ (byte) 0x1F, ++ (byte) 0x00, ++ (byte) 0xFF, ++ (byte) 0b0011_1000}; ++ instrPattern = new byte[]{ ++ (byte) 0xC4, // prefix for 3-byte VEX instruction ++ (byte) 0x02, // 00010 implied 0F 38 leading opcode bytes ++ (byte) 0x00, ++ (byte) 0xF3, ++ (byte) 0b0001_0000}; // bits 543 == 011 (3) ++ } ++ ++ public static void main(String[] args) throws Exception { ++ BmiIntrinsicBase.verifyTestCase(BlsmskTestI::new, TestBlsmskI.BlsmskIExpr.class.getDeclaredMethods()); ++ BmiIntrinsicBase.verifyTestCase(BlsmskTestI::new, TestBlsmskI.BlsmskICommutativeExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsmskTestL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsmskTestL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build BlsmskTestL ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions BlsmskTestL ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class BlsmskTestL extends BlsmskTestI { ++ ++ protected BlsmskTestL(Method method) { ++ super(method); ++ isLongOperation = true; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ BmiIntrinsicBase.verifyTestCase(BlsmskTestL::new, TestBlsmskL.BlsmskLExpr.class.getDeclaredMethods()); ++ BmiIntrinsicBase.verifyTestCase(BlsmskTestL::new, TestBlsmskL.BlsmskLCommutativeExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsrTestI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsrTestI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,59 @@ ++/* ++ * 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 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build BlsrTestI ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions BlsrTestI ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class BlsrTestI extends BmiIntrinsicBase.BmiTestCase { ++ ++ protected BlsrTestI(Method method) { ++ super(method); ++ //from intel manual VEX.NDD.LZ.0F38.W0 F3 /1 ++ instrMask = new byte[]{ ++ (byte) 0xFF, ++ (byte) 0x1F, ++ (byte) 0x00, ++ (byte) 0xFF, ++ (byte) 0b0011_1000}; ++ instrPattern = new byte[]{ ++ (byte) 0xC4, // prefix for 3-byte VEX instruction ++ (byte) 0x02, // 00010 implied 0F 38 leading opcode bytes ++ (byte) 0x00, ++ (byte) 0xF3, ++ (byte) 0b0000_1000}; // bits 543 == 011 (3) ++ } ++ ++ public static void main(String[] args) throws Exception { ++ BmiIntrinsicBase.verifyTestCase(BlsrTestI::new, TestBlsrI.BlsrIExpr.class.getDeclaredMethods()); ++ BmiIntrinsicBase.verifyTestCase(BlsrTestI::new, TestBlsrI.BlsrICommutativeExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsrTestL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/BlsrTestL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build BlsrTestL ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseBMI1Instructions BlsrTestL ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class BlsrTestL extends BlsrTestI { ++ ++ protected BlsrTestL(Method method) { ++ super(method); ++ isLongOperation = true; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ BmiIntrinsicBase.verifyTestCase(BlsrTestL::new, TestBlsrL.BlsrLExpr.class.getDeclaredMethods()); ++ BmiIntrinsicBase.verifyTestCase(BlsrTestL::new, TestBlsrL.BlsrLCommutativeExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/BmiIntrinsicBase.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/BmiIntrinsicBase.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,186 @@ ++/* ++ * 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 com.oracle.java.testlibrary.Asserts; ++import com.oracle.java.testlibrary.Platform; ++import com.oracle.java.testlibrary.Utils; ++import sun.hotspot.code.NMethod; ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++import java.lang.reflect.Executable; ++import java.lang.reflect.Method; ++import java.util.concurrent.Callable; ++import java.util.function.Function; ++ ++public class BmiIntrinsicBase extends CompilerWhiteBoxTest { ++ ++ protected BmiIntrinsicBase(BmiTestCase testCase) { ++ super(testCase); ++ } ++ ++ public static void verifyTestCase(Function constructor, Method... methods) throws Exception { ++ for (Method method : methods) { ++ new BmiIntrinsicBase(constructor.apply(method)).test(); ++ } ++ } ++ ++ @Override ++ protected void test() throws Exception { ++ BmiTestCase bmiTestCase = (BmiTestCase) testCase; ++ ++ if (!(Platform.isX86() || Platform.isX64())) { ++ System.out.println("Unsupported platform, test SKIPPED"); ++ return; ++ } ++ ++ if (!Platform.isServer()) { ++ System.out.println("Not server VM, test SKIPPED"); ++ return; ++ } ++ ++ if (!CPUInfo.hasFeature(bmiTestCase.getCpuFlag())) { ++ System.out.println("Unsupported hardware, no required CPU flag " + bmiTestCase.getCpuFlag() + " , test SKIPPED"); ++ return; ++ } ++ ++ if (!Boolean.valueOf(getVMOption(bmiTestCase.getVMFlag()))) { ++ System.out.println("VM flag " + bmiTestCase.getVMFlag() + " disabled, test SKIPPED"); ++ return; ++ } ++ ++ System.out.println(testCase.name()); ++ ++ switch (MODE) { ++ case "compiled mode": ++ case "mixed mode": ++ if (TIERED_COMPILATION && TIERED_STOP_AT_LEVEL != CompilerWhiteBoxTest.COMP_LEVEL_MAX) { ++ System.out.println("TieredStopAtLevel value (" + TIERED_STOP_AT_LEVEL + ") is too low, test SKIPPED"); ++ return; ++ } ++ deoptimize(); ++ compileAtLevelAndCheck(CompilerWhiteBoxTest.COMP_LEVEL_MAX); ++ break; ++ case "interpreted mode": // test is not applicable in this mode; ++ System.err.println("Warning: This test is not applicable in mode: " + MODE); ++ break; ++ default: ++ throw new AssertionError("Test bug, unknown VM mode: " + MODE); ++ } ++ } ++ ++ protected void compileAtLevelAndCheck(int level) { ++ WHITE_BOX.enqueueMethodForCompilation(method, level); ++ waitBackgroundCompilation(); ++ checkCompilation(method, level); ++ checkEmittedCode(method); ++ } ++ ++ protected void checkCompilation(Executable executable, int level) { ++ if (!WHITE_BOX.isMethodCompiled(executable)) { ++ throw new AssertionError("Test bug, expected compilation (level): " + level + ", but not compiled" + WHITE_BOX.isMethodCompilable(executable, level)); ++ } ++ final int compilationLevel = WHITE_BOX.getMethodCompilationLevel(executable); ++ if (compilationLevel != level) { ++ throw new AssertionError("Test bug, expected compilation (level): " + level + ", but level: " + compilationLevel); ++ } ++ } ++ ++ protected void checkEmittedCode(Executable executable) { ++ final byte[] nativeCode = NMethod.get(executable, false).insts; ++ if (!((BmiTestCase) testCase).verifyPositive(nativeCode)) { ++ throw new AssertionError(testCase.name() + "CPU instructions expected not found: " + Utils.toHexString(nativeCode)); ++ } else { ++ System.out.println("CPU instructions found, PASSED"); ++ } ++ } ++ ++ abstract static class BmiTestCase implements CompilerWhiteBoxTest.TestCase { ++ private final Method method; ++ protected byte[] instrMask; ++ protected byte[] instrPattern; ++ protected boolean isLongOperation; ++ ++ public BmiTestCase(Method method) { ++ this.method = method; ++ } ++ ++ @Override ++ public String name() { ++ return method.toGenericString(); ++ } ++ ++ @Override ++ public Executable getExecutable() { ++ return method; ++ } ++ ++ @Override ++ public Callable getCallable() { ++ return null; ++ } ++ ++ @Override ++ public boolean isOsr() { ++ return false; ++ } ++ ++ protected int countCpuInstructions(byte[] nativeCode) { ++ int count = 0; ++ int patternSize = Math.min(instrMask.length, instrPattern.length); ++ boolean found; ++ Asserts.assertGreaterThan(patternSize, 0); ++ for (int i = 0, n = nativeCode.length - patternSize; i < n; i++) { ++ found = true; ++ for (int j = 0; j < patternSize; j++) { ++ if ((nativeCode[i + j] & instrMask[j]) != instrPattern[j]) { ++ found = false; ++ break; ++ } ++ } ++ if (found) { ++ ++count; ++ i += patternSize - 1; ++ } ++ } ++ return count; ++ } ++ ++ public boolean verifyPositive(byte[] nativeCode) { ++ final int cnt = countCpuInstructions(nativeCode); ++ if (Platform.isX86()) { ++ return cnt >= (isLongOperation ? 2 : 1); ++ } else { ++ return Platform.isX64() && cnt >= 1; ++ } ++ } ++ ++ protected String getCpuFlag() { ++ return "bmi1"; ++ } ++ ++ protected String getVMFlag() { ++ return "UseBMI1Instructions"; ++ } ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/LZcntTestI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/LZcntTestI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,59 @@ ++/* ++ * 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 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build LZcntTestI ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCountLeadingZerosInstruction LZcntTestI ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class LZcntTestI extends BmiIntrinsicBase.BmiTestCase { ++ ++ protected LZcntTestI(Method method) { ++ super(method); ++ instrMask = new byte[]{(byte) 0xFF, (byte) 0xFF, (byte) 0xFF}; ++ instrPattern = new byte[]{(byte) 0xF3, (byte) 0x0F, (byte) 0xBD}; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ // j.l.Integer and Long should be loaded to allow a compilation of the methods that use their methods ++ System.out.println("class java.lang.Integer should be loaded. Proof: " + Integer.class); ++ BmiIntrinsicBase.verifyTestCase(LZcntTestI::new, TestLzcntI.LzcntIExpr.class.getDeclaredMethods()); ++ } ++ ++ @Override ++ protected String getVMFlag() { ++ return "UseCountLeadingZerosInstruction"; ++ } ++ ++ @Override ++ protected String getCpuFlag() { ++ return "lzcnt"; ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/LZcntTestL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/LZcntTestL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,54 @@ ++/* ++ * 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 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build LZcntTestL ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCountLeadingZerosInstruction LZcntTestL ++ */ ++ ++import com.oracle.java.testlibrary.Platform; ++ ++import java.lang.reflect.Method; ++ ++public class LZcntTestL extends LZcntTestI { ++ ++ protected LZcntTestL(Method method) { ++ super(method); ++ isLongOperation = true; ++ if (Platform.isX64()) { ++ instrMask = new byte[]{(byte) 0xFF, (byte) 0x00, (byte) 0xFF, (byte) 0xFF}; ++ instrPattern = new byte[]{(byte) 0xF3, (byte) 0x00, (byte) 0x0F, (byte) 0xBD}; ++ } ++ } ++ ++ public static void main(String[] args) throws Exception { ++ // j.l.Integer and Long should be loaded to allow a compilation of the methods that use their methods ++ System.out.println("classes java.lang.Long should be loaded. Proof: " + Long.class); ++ BmiIntrinsicBase.verifyTestCase(LZcntTestL::new, TestLzcntL.LzcntLExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/TZcntTestI.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/TZcntTestI.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,54 @@ ++/* ++ * 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 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build TZcntTestI ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCountTrailingZerosInstruction TZcntTestI ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class TZcntTestI extends BmiIntrinsicBase.BmiTestCase { ++ ++ protected TZcntTestI(Method method) { ++ super(method); ++ instrMask = new byte[]{(byte) 0xFF, (byte) 0xFF, (byte) 0xFF}; ++ instrPattern = new byte[]{(byte) 0xF3, (byte) 0x0F, (byte) 0xBC}; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ // j.l.Integer and Long should be loaded to allow a compilation of the methods that use their methods ++ System.out.println("class java.lang.Integer should be loaded. Proof: " + Integer.class); ++ BmiIntrinsicBase.verifyTestCase(TZcntTestI::new, TestTzcntI.TzcntIExpr.class.getDeclaredMethods()); ++ } ++ ++ @Override ++ protected String getVMFlag() { ++ return "UseCountTrailingZerosInstruction"; ++ } ++} +--- ./hotspot/test/compiler/intrinsics/bmi/verifycode/TZcntTestL.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/bmi/verifycode/TZcntTestL.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * 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 8031321 ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox .. ++ * @build TZcntTestL ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCountTrailingZerosInstruction TZcntTestL ++ */ ++ ++import com.oracle.java.testlibrary.Platform; ++ ++import java.lang.reflect.Method; ++ ++public class TZcntTestL extends TZcntTestI { ++ ++ protected TZcntTestL(Method method) { ++ super(method); ++ isLongOperation = true; ++ if (Platform.isX64()) { ++ instrMask = new byte[]{(byte) 0xFF, (byte) 0x00, (byte) 0xFF, (byte) 0xFF}; ++ instrPattern = new byte[]{(byte) 0xF3, (byte) 0x00, (byte) 0x0F, (byte) 0xBC}; ++ } ++ isLongOperation = true; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ // j.l.Integer and Long should be loaded to allow a compilation of the methods that use their methods ++ System.out.println("classes java.lang.Long should be loaded. Proof: " + Long.class); ++ BmiIntrinsicBase.verifyTestCase(TZcntTestL::new, TestTzcntL.TzcntLExpr.class.getDeclaredMethods()); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/clone/TestObjectClone.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/clone/TestObjectClone.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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"); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/hashcode/TestHashCode.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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"); ++ } ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/AddExactICondTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/AddExactICondTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8024924 + * @summary Test non constant addExact + * @compile AddExactICondTest.java +- * @run main AddExactICondTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main AddExactICondTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/AddExactIConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/AddExactIConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8024924 + * @summary Test constant addExact + * @compile AddExactIConstantTest.java Verify.java +- * @run main AddExactIConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main AddExactIConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/AddExactILoadTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/AddExactILoadTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8024924 + * @summary Test non constant addExact + * @compile AddExactILoadTest.java Verify.java +- * @run main AddExactILoadTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main AddExactILoadTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/AddExactILoopDependentTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/AddExactILoopDependentTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8024924 + * @summary Test non constant addExact + * @compile AddExactILoopDependentTest.java Verify.java +- * @run main AddExactILoopDependentTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main AddExactILoopDependentTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/AddExactINonConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/AddExactINonConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8024924 + * @summary Test non constant addExact + * @compile AddExactINonConstantTest.java Verify.java +- * @run main AddExactINonConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main AddExactINonConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/AddExactIRepeatTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/AddExactIRepeatTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8025657 + * @summary Test repeating addExact + * @compile AddExactIRepeatTest.java Verify.java +- * @run main AddExactIRepeatTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main AddExactIRepeatTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/AddExactLConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/AddExactLConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test constant addExact + * @compile AddExactLConstantTest.java Verify.java +- * @run main AddExactLConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main AddExactLConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/AddExactLNonConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/AddExactLNonConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test non constant addExact + * @compile AddExactLNonConstantTest.java Verify.java +- * @run main AddExactLNonConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main AddExactLNonConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/CompareTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/CompareTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026722 + * @summary Verify that the compare after addExact is a signed compare + * @compile CompareTest.java +- * @run main CompareTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main CompareTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/DecExactITest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/DecExactITest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test decrementExact + * @compile DecExactITest.java Verify.java +- * @run main DecExactITest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main DecExactITest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/DecExactLTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/DecExactLTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test decrementExact + * @compile DecExactLTest.java Verify.java +- * @run main DecExactLTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main DecExactLTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/GVNTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/GVNTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8028207 + * @summary Verify that GVN doesn't mess up the two addExacts + * @compile GVNTest.java +- * @run main GVNTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main GVNTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/IncExactITest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/IncExactITest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test incrementExact + * @compile IncExactITest.java Verify.java +- * @run main IncExactITest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main IncExactITest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/IncExactLTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/IncExactLTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test incrementExact + * @compile IncExactLTest.java Verify.java +- * @run main IncExactLTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main IncExactLTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/MulExactICondTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/MulExactICondTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test multiplyExact as condition + * @compile MulExactICondTest.java +- * @run main MulExactICondTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main MulExactICondTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/MulExactIConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/MulExactIConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test constant multiplyExact + * @compile MulExactIConstantTest.java Verify.java +- * @run main MulExactIConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main MulExactIConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/MulExactILoadTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/MulExactILoadTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test multiplyExact + * @compile MulExactILoadTest.java Verify.java +- * @run main MulExactILoadTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main MulExactILoadTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/MulExactILoopDependentTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/MulExactILoopDependentTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test loop dependent multiplyExact + * @compile MulExactILoopDependentTest.java Verify.java +- * @run main MulExactILoopDependentTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main MulExactILoopDependentTest + * + */ + public class MulExactILoopDependentTest { +--- ./hotspot/test/compiler/intrinsics/mathexact/MulExactINonConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/MulExactINonConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test non constant multiplyExact + * @compile MulExactINonConstantTest.java Verify.java +- * @run main MulExactINonConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main MulExactINonConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/MulExactIRepeatTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/MulExactIRepeatTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test repeating multiplyExact + * @compile MulExactIRepeatTest.java Verify.java +- * @run main MulExactIRepeatTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main MulExactIRepeatTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/MulExactLConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/MulExactLConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test constant mulExact + * @compile MulExactLConstantTest.java Verify.java +- * @run main MulExactLConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main MulExactLConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/MulExactLNonConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/MulExactLNonConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test non constant mulExact + * @compile MulExactLNonConstantTest.java Verify.java +- * @run main MulExactLNonConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main MulExactLNonConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/NegExactIConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/NegExactIConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test constant negExact + * @compile NegExactIConstantTest.java Verify.java +- * @run main NegExactIConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main NegExactIConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/NegExactILoadTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/NegExactILoadTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,14 +26,14 @@ + * @bug 8026844 + * @summary Test negExact + * @compile NegExactILoadTest.java Verify.java +- * @run main NegExactILoadTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main NegExactILoadTest + * + */ + + public class NegExactILoadTest { + public static void main(String[] args) { +- Verify.LoadTest.init(); +- Verify.LoadTest.verify(new Verify.UnaryToBinary(new Verify.NegExactI())); ++ Verify.LoadTest.init(); ++ Verify.LoadTest.verify(new Verify.UnaryToBinary(new Verify.NegExactI())); + } + + } +--- ./hotspot/test/compiler/intrinsics/mathexact/NegExactILoopDependentTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/NegExactILoopDependentTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test negExact loop dependent + * @compile NegExactILoopDependentTest.java Verify.java +- * @run main NegExactILoopDependentTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main NegExactILoopDependentTest + * + */ + public class NegExactILoopDependentTest { +--- ./hotspot/test/compiler/intrinsics/mathexact/NegExactINonConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/NegExactINonConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test non constant negExact + * @compile NegExactINonConstantTest.java Verify.java +- * @run main NegExactINonConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main NegExactINonConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/NegExactLConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/NegExactLConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test constant negExact + * @compile NegExactLConstantTest.java Verify.java +- * @run main NegExactLConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main NegExactLConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/NegExactLNonConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/NegExactLNonConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test constant negExact + * @compile NegExactLNonConstantTest.java Verify.java +- * @run main NegExactLNonConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main NegExactLNonConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/NestedMathExactTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/NestedMathExactTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8027444 + * @summary Test nested loops + * @compile NestedMathExactTest.java +- * @run main NestedMathExactTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main NestedMathExactTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/SplitThruPhiTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/SplitThruPhiTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8028198 + * @summary Verify that split through phi does the right thing + * @compile SplitThruPhiTest.java +- * @run main SplitThruPhiTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main SplitThruPhiTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/SubExactICondTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/SubExactICondTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test subtractExact as condition + * @compile SubExactICondTest.java Verify.java +- * @run main SubExactICondTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main SubExactICondTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/SubExactIConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/SubExactIConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test constant subtractExact + * @compile SubExactIConstantTest.java Verify.java +- * @run main SubExactIConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main SubExactIConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/SubExactILoadTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/SubExactILoadTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test non constant subtractExact + * @compile SubExactILoadTest.java Verify.java +- * @run main SubExactILoadTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main SubExactILoadTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/SubExactILoopDependentTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/SubExactILoopDependentTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test non constant subtractExact + * @compile SubExactILoopDependentTest.java Verify.java +- * @run main SubExactILoopDependentTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main SubExactILoopDependentTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/SubExactINonConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/SubExactINonConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test non constant subtractExact + * @compile SubExactINonConstantTest.java Verify.java +- * @run main SubExactINonConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main SubExactINonConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/SubExactIRepeatTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/SubExactIRepeatTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -26,7 +26,7 @@ + * @bug 8026844 + * @summary Test repeating subtractExact + * @compile SubExactIRepeatTest.java Verify.java +- * @run main SubExactIRepeatTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main SubExactIRepeatTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/SubExactLConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/SubExactLConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -27,7 +27,7 @@ + * @bug 8027353 + * @summary Test constant subtractExact + * @compile SubExactLConstantTest.java Verify.java +- * @run main SubExactLConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main SubExactLConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/SubExactLNonConstantTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/SubExactLNonConstantTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -27,7 +27,7 @@ + * @bug 8027353 + * @summary Test non constant subtractExact + * @compile SubExactLNonConstantTest.java Verify.java +- * @run main SubExactLNonConstantTest -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions -XX:+UseMathExactIntrinsics ++ * @run main SubExactLNonConstantTest + * + */ + +--- ./hotspot/test/compiler/intrinsics/mathexact/Verify.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/intrinsics/mathexact/Verify.java Wed Jul 30 03:51:43 2014 -0700 +@@ -160,6 +160,7 @@ + + public static class NonConstantTest { + public static java.util.Random rnd = new java.util.Random(); ++ public static int[] values = new int[] { Integer.MAX_VALUE, Integer.MIN_VALUE }; + + public static void verify(BinaryMethod method) { + for (int i = 0; i < 50000; ++i) { +@@ -169,6 +170,10 @@ + Verify.verifyBinary(rnd1 + 1, rnd2, method); + Verify.verifyBinary(rnd1 - 1, rnd2, method); + Verify.verifyBinary(rnd1, rnd2 - 1, method); ++ Verify.verifyBinary(0, values[0], method); ++ Verify.verifyBinary(values[0], 0, method); ++ Verify.verifyBinary(0, values[1], method); ++ Verify.verifyBinary(values[1], 0, method); + } + } + } +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/AddExactIntTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/AddExactIntTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build AddExactIntTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics AddExactIntTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics AddExactIntTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class AddExactIntTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.IntTest(MathIntrinsic.IntIntrinsic.Add).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/AddExactLongTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/AddExactLongTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build AddExactLongTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics AddExactLongTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics AddExactLongTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class AddExactLongTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.LongTest(MathIntrinsic.LongIntrinsic.Add).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/DecrementExactIntTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/DecrementExactIntTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build DecrementExactIntTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics DecrementExactIntTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics DecrementExactIntTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class DecrementExactIntTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.IntTest(MathIntrinsic.IntIntrinsic.Decrement).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/DecrementExactLongTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/DecrementExactLongTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build DecrementExactLongTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics DecrementExactLongTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics DecrementExactLongTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class DecrementExactLongTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.LongTest(MathIntrinsic.LongIntrinsic.Decrement).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/IncrementExactIntTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/IncrementExactIntTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build IncrementExactIntTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics IncrementExactIntTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics IncrementExactIntTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class IncrementExactIntTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.IntTest(MathIntrinsic.IntIntrinsic.Increment).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/IncrementExactLongTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/IncrementExactLongTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build IncrementExactLongTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics IncrementExactLongTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics IncrementExactLongTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class IncrementExactLongTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.LongTest(MathIntrinsic.LongIntrinsic.Increment).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/IntrinsicBase.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/IntrinsicBase.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,155 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++import com.oracle.java.testlibrary.Platform; ++ ++import java.io.FileOutputStream; ++import java.lang.reflect.Executable; ++import java.util.Properties; ++ ++public abstract class IntrinsicBase extends CompilerWhiteBoxTest { ++ protected String javaVmName; ++ protected String useMathExactIntrinsics; ++ ++ protected IntrinsicBase(TestCase testCase) { ++ super(testCase); ++ javaVmName = System.getProperty("java.vm.name"); ++ useMathExactIntrinsics = getVMOption("UseMathExactIntrinsics"); ++ } ++ ++ @Override ++ protected void test() throws Exception { ++ //java.lang.Math should be loaded to allow a compilation of the methods that use Math's method ++ System.out.println("class java.lang.Math should be loaded. Proof: " + Math.class); ++ printEnvironmentInfo(); ++ ++ int expectedIntrinsicCount = 0; ++ ++ switch (MODE) { ++ case "compiled mode": ++ case "mixed mode": ++ if (isServerVM()) { ++ if (TIERED_COMPILATION) { ++ int max_level = TIERED_STOP_AT_LEVEL; ++ expectedIntrinsicCount = (max_level == COMP_LEVEL_MAX) ? 1 : 0; ++ for (int i = CompilerWhiteBoxTest.COMP_LEVEL_SIMPLE; i <= max_level; ++i) { ++ deoptimize(); ++ compileAtLevel(i); ++ } ++ } else { ++ expectedIntrinsicCount = 1; ++ deoptimize(); ++ compileAtLevel(CompilerWhiteBoxTest.COMP_LEVEL_MAX); ++ } ++ } else { ++ deoptimize(); ++ compileAtLevel(CompilerWhiteBoxTest.COMP_LEVEL_SIMPLE); ++ } ++ ++ if (!isIntrinsicSupported()) { ++ expectedIntrinsicCount = 0; ++ } ++ break; ++ case "interpreted mode": //test is not applicable in this mode; ++ System.err.println("Warning: This test is not applicable in mode: " + MODE); ++ break; ++ default: ++ throw new RuntimeException("Test bug, unknown VM mode: " + MODE); ++ } ++ ++ System.out.println("Expected intrinsic count is " + expectedIntrinsicCount + " name " + getIntrinsicId()); ++ ++ final FileOutputStream out = new FileOutputStream(getVMOption("LogFile") + ".verify.properties"); ++ Properties expectedProps = new Properties(); ++ expectedProps.setProperty("intrinsic.name", getIntrinsicId()); ++ expectedProps.setProperty("intrinsic.expectedCount", String.valueOf(expectedIntrinsicCount)); ++ expectedProps.store(out, null); ++ ++ out.close(); ++ } ++ ++ protected void printEnvironmentInfo() { ++ System.out.println("java.vm.name=" + javaVmName); ++ System.out.println("os.arch=" + Platform.getOsArch()); ++ System.out.println("java.vm.info=" + MODE); ++ System.out.println("useMathExactIntrinsics=" + useMathExactIntrinsics); ++ } ++ ++ protected void compileAtLevel(int level) { ++ WHITE_BOX.enqueueMethodForCompilation(method, level); ++ waitBackgroundCompilation(); ++ checkCompilation(method, level); ++ } ++ ++ protected void checkCompilation(Executable executable, int level) { ++ if (!WHITE_BOX.isMethodCompiled(executable)) { ++ throw new RuntimeException("Test bug, expected compilation (level): " + level + ", but not compiled"); ++ } ++ final int compilationLevel = WHITE_BOX.getMethodCompilationLevel(executable); ++ if (compilationLevel != level) { ++ if (!(TIERED_COMPILATION && level == COMP_LEVEL_FULL_PROFILE && compilationLevel == COMP_LEVEL_LIMITED_PROFILE)) { //possible case ++ throw new RuntimeException("Test bug, expected compilation (level): " + level + ", but level: " + compilationLevel); ++ } ++ } ++ } ++ ++ protected abstract boolean isIntrinsicSupported(); ++ ++ protected abstract String getIntrinsicId(); ++ ++ protected boolean isServerVM() { ++ return javaVmName.toLowerCase().contains("server"); ++ } ++ ++ static class IntTest extends IntrinsicBase { ++ protected IntTest(MathIntrinsic.IntIntrinsic testCase) { ++ super(testCase); ++ } ++ ++ @Override ++ protected boolean isIntrinsicSupported() { ++ return isServerVM() && Boolean.valueOf(useMathExactIntrinsics) && (Platform.isX86() || Platform.isX64()); ++ } ++ ++ @Override ++ protected String getIntrinsicId() { ++ return "_" + testCase.name().toLowerCase() + "ExactI"; ++ } ++ } ++ ++ static class LongTest extends IntrinsicBase { ++ protected LongTest(MathIntrinsic.LongIntrinsic testCase) { ++ super(testCase); ++ } ++ ++ @Override ++ protected boolean isIntrinsicSupported() { ++ return isServerVM() && Boolean.valueOf(useMathExactIntrinsics) && Platform.isX64(); ++ } ++ ++ @Override ++ protected String getIntrinsicId() { ++ return "_" + testCase.name().toLowerCase() + "ExactL"; ++ } ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/MathIntrinsic.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/MathIntrinsic.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,155 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++import java.lang.reflect.Executable; ++import java.util.concurrent.Callable; ++ ++public class MathIntrinsic { ++ ++ enum IntIntrinsic implements CompilerWhiteBoxTest.TestCase { ++ Add { ++ @Override ++ Object execMathMethod() { ++ return intR = Math.addExact(int1, int2); ++ } ++ }, ++ Subtract { ++ @Override ++ Object execMathMethod() { ++ return intR = Math.subtractExact(int1, int2); ++ } ++ }, ++ Multiply { ++ @Override ++ Object execMathMethod() { ++ return intR = Math.multiplyExact(int1, int2); ++ } ++ }, ++ Increment { ++ @Override ++ Object execMathMethod() { ++ return intR = Math.incrementExact(int1); ++ } ++ }, ++ Decrement { ++ @Override ++ Object execMathMethod() { ++ return intR = Math.decrementExact(int1); ++ } ++ }, ++ Negate { ++ @Override ++ Object execMathMethod() { ++ return intR = Math.negateExact(int1); ++ } ++ }; ++ protected int int1; ++ protected int int2; ++ protected int intR; ++ ++ abstract Object execMathMethod(); ++ ++ @Override ++ public Executable getExecutable() { ++ try { ++ return getClass().getDeclaredMethod("execMathMethod"); ++ } catch (NoSuchMethodException e) { ++ throw new RuntimeException("Test bug, no such method: " + e); ++ } ++ } ++ ++ @Override ++ public Callable getCallable() { ++ return null; ++ } ++ ++ @Override ++ public boolean isOsr() { ++ return false; ++ } ++ ++ } ++ ++ enum LongIntrinsic implements CompilerWhiteBoxTest.TestCase { ++ Add { ++ @Override ++ Object execMathMethod() { ++ return longR = Math.addExact(long1, long2); ++ } ++ }, ++ Subtract { ++ @Override ++ Object execMathMethod() { ++ return longR = Math.subtractExact(long1, long2); ++ } ++ }, ++ Multiply { ++ @Override ++ Object execMathMethod() { ++ return longR = Math.multiplyExact(long1, long2); ++ } ++ }, ++ Increment { ++ @Override ++ Object execMathMethod() { ++ return longR = Math.incrementExact(long1); ++ } ++ }, ++ Decrement { ++ @Override ++ Object execMathMethod() { ++ return longR = Math.decrementExact(long1); ++ } ++ }, ++ Negate { ++ @Override ++ Object execMathMethod() { ++ return longR = Math.negateExact(long1); ++ } ++ }; ++ protected long long1; ++ protected long long2; ++ protected long longR; ++ ++ abstract Object execMathMethod(); ++ ++ @Override ++ public Executable getExecutable() { ++ try { ++ return getClass().getDeclaredMethod("execMathMethod"); ++ } catch (NoSuchMethodException e) { ++ throw new RuntimeException("Test bug, no such method: " + e); ++ } ++ } ++ ++ @Override ++ public Callable getCallable() { ++ return null; ++ } ++ ++ @Override ++ public boolean isOsr() { ++ return false; ++ } ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/MultiplyExactIntTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/MultiplyExactIntTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build MultiplyExactIntTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics MultiplyExactIntTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics MultiplyExactIntTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class MultiplyExactIntTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.IntTest(MathIntrinsic.IntIntrinsic.Multiply).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/MultiplyExactLongTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/MultiplyExactLongTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build MultiplyExactLongTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics MultiplyExactLongTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics MultiplyExactLongTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class MultiplyExactLongTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.LongTest(MathIntrinsic.LongIntrinsic.Multiply).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/NegateExactIntTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/NegateExactIntTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build NegateExactIntTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics NegateExactIntTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics NegateExactIntTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class NegateExactIntTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.IntTest(MathIntrinsic.IntIntrinsic.Negate).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/NegateExactLongTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/NegateExactLongTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build NegateExactLongTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics NegateExactLongTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics NegateExactLongTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class NegateExactLongTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.LongTest(MathIntrinsic.LongIntrinsic.Negate).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/SubtractExactIntTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/SubtractExactIntTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,46 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build SubtractExactIntTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics SubtractExactIntTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics SubtractExactIntTest ++ * @run main Verifier hs_neg.log hs.log ++ ++ */ ++ ++public class SubtractExactIntTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.IntTest(MathIntrinsic.IntIntrinsic.Subtract).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/SubtractExactLongTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/SubtractExactLongTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @library /testlibrary /testlibrary/whitebox /compiler/whitebox ++ * @build SubtractExactLongTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs_neg.log -XX:-UseMathExactIntrinsics SubtractExactLongTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+IgnoreUnrecognizedVMOptions -XX:+WhiteBoxAPI -XX:+LogCompilation ++ * -XX:CompileCommand=compileonly,MathIntrinsic*::execMathMethod ++ * -XX:LogFile=hs.log -XX:+UseMathExactIntrinsics SubtractExactLongTest ++ * @run main Verifier hs_neg.log hs.log ++ */ ++ ++public class SubtractExactLongTest { ++ ++ public static void main(String[] args) throws Exception { ++ new IntrinsicBase.LongTest(MathIntrinsic.LongIntrinsic.Subtract).test(); ++ } ++} +--- ./hotspot/test/compiler/intrinsics/mathexact/sanity/Verifier.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/intrinsics/mathexact/sanity/Verifier.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,71 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++import java.io.BufferedReader; ++import java.io.FileReader; ++import java.util.Properties; ++ ++public class Verifier { ++ ++ public static void main(String[] args) throws Exception { ++ if (args.length == 0) ++ throw new RuntimeException("Test bug, nothing to verify"); ++ for (String hsLogFile : args) { ++ verify(hsLogFile); ++ } ++ } ++ ++ private static void verify(String hsLogFile) throws Exception { ++ System.out.println("Verifying " + hsLogFile); ++ ++ final Properties expectedProperties = new Properties(); ++ final FileReader reader = new FileReader(hsLogFile + ".verify.properties"); ++ expectedProperties.load(reader); ++ reader.close(); ++ ++ int fullMatchCnt = 0; ++ int suspectCnt = 0; ++ final String intrinsicId = expectedProperties.getProperty("intrinsic.name"); ++ final String prefix = ", Double> cache = new HashMap, Double>(); ++ public static double computeSum(int x, int y) { ++ List 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 options = new LinkedList<>(); ++ Collections.addAll(options, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMLocking", ++ useRTMLocking)); ++ ++ options.add(prepareOptionValue(value)); ++ ++ CommandLineOptionTest.verifySameJVMStartup( ++ (isWarningExpected ? warnings : null), ++ (isWarningExpected ? null : warnings), ++ ExitCode.OK, options.toArray(new String[options.size()])); ++ } ++ ++ private void verifyOptionValues(String value, boolean useRTMLocking, ++ String expectedValue) throws Throwable { ++ List options = new LinkedList<>(); ++ Collections.addAll(options, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMLocking", ++ useRTMLocking)); ++ ++ options.add(prepareOptionValue(value)); ++ ++ CommandLineOptionTest.verifyOptionValueForSameVM(optionName, ++ expectedValue, options.toArray(new String[options.size()])); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsBase.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsBase.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,85 @@ ++/* ++ * 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 com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.*; ++ ++import java.util.function.BooleanSupplier; ++ ++public abstract class TestPrintPreciseRTMLockingStatisticsBase ++ extends RTMGenericCommandLineOptionTest { ++ protected static final String DEFAULT_VALUE = "false"; ++ ++ protected TestPrintPreciseRTMLockingStatisticsBase( ++ BooleanSupplier predicate) { ++ super(predicate, "PrintPreciseRTMLockingStatistics", true, false, ++ TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE); ++ } ++ ++ @Override ++ protected void runNonX86TestCases() throws Throwable { ++ verifyJVMStartup(); ++ verifyOptionValues(); ++ } ++ ++ @Override ++ protected void verifyJVMStartup() throws Throwable { ++ if (Platform.isServer()) { ++ if (!Platform.isDebugBuild()) { ++ String errorMessage = CommandLineOptionTest. ++ getDiagnosticOptionErrorMessage(optionName); ++ // verify that option is actually diagnostic ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { errorMessage }, null, ExitCode.FAIL, ++ prepareOptionValue("true")); ++ ++ CommandLineOptionTest.verifySameJVMStartup(null, ++ new String[] { errorMessage }, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, ++ prepareOptionValue("true")); ++ } else { ++ CommandLineOptionTest.verifySameJVMStartup( ++ null, null, ExitCode.OK, prepareOptionValue("true")); ++ } ++ } else { ++ String errorMessage = CommandLineOptionTest. ++ getUnrecognizedOptionErrorMessage(optionName); ++ ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[]{errorMessage}, null, ExitCode.FAIL, ++ CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, ++ prepareOptionValue("true")); ++ } ++ } ++ ++ @Override ++ protected void verifyOptionValues() throws Throwable { ++ if (Platform.isServer()) { ++ // Verify default value ++ CommandLineOptionTest.verifyOptionValueForSameVM(optionName, ++ TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS); ++ } ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,76 @@ ++/* ++ * 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 8031320 ++ * @summary Verify PrintPreciseRTMLockingStatistics on CPUs with ++ * rtm support and on VM with rtm locking support, ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig ++ */ ++ ++import com.oracle.java.testlibrary.cli.*; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig ++ extends TestPrintPreciseRTMLockingStatisticsBase { ++ private TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig() { ++ super(new AndPredicate(new SupportedVM(), new SupportedCPU())); ++ } ++ ++ @Override ++ protected void verifyOptionValues() throws Throwable { ++ super.verifyOptionValues(); ++ // verify default value ++ CommandLineOptionTest.verifyOptionValueForSameVM(optionName, ++ TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ ++ CommandLineOptionTest.verifyOptionValueForSameVM(optionName, ++ TestPrintPreciseRTMLockingStatisticsBase.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:-UseRTMLocking", prepareOptionValue("true")); ++ ++ // verify that option could be turned on ++ CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true", ++ CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking", prepareOptionValue("true")); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestPrintPreciseRTMLockingStatisticsOptionOnSupportedConfig() ++ .test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,54 @@ ++/* ++ * 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 8031320 ++ * @summary Verify PrintPreciseRTMLockingStatistics on CPUs without ++ * rtm support and/or unsupported VM. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig ++ */ ++ ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import com.oracle.java.testlibrary.cli.predicate.NotPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig ++ extends TestPrintPreciseRTMLockingStatisticsBase { ++ private TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig() { ++ super(new NotPredicate(new AndPredicate(new SupportedCPU(), ++ new SupportedVM()))); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestPrintPreciseRTMLockingStatisticsOptionOnUnsupportedConfig() ++ .test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestRTMAbortRatioOptionOnSupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestRTMAbortRatioOptionOnSupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,54 @@ ++/* ++ * 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 8031320 ++ * @summary Verify RTMAbortRatio option processing on CPU with rtm ++ * support and on VM with rtm locking support. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMAbortRatioOptionOnSupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMAbortRatioOptionOnSupportedConfig ++ */ ++ ++public class TestRTMAbortRatioOptionOnSupportedConfig ++ extends RTMLockingAwareTest { ++ private static final String DEFAULT_VALUE = "50"; ++ ++ private TestRTMAbortRatioOptionOnSupportedConfig() { ++ super("RTMAbortRatio", false, true, ++ TestRTMAbortRatioOptionOnSupportedConfig.DEFAULT_VALUE, ++ /* correct values */ ++ new String[] { "0", "20", "100" }, ++ /* incorrect values */ ++ new String[] { "-1", "101" }, ++ RTMGenericCommandLineOptionTest.RTM_ABORT_RATIO_WARNING); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMAbortRatioOptionOnSupportedConfig().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestRTMAbortRatioOptionOnUnsupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestRTMAbortRatioOptionOnUnsupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,57 @@ ++/* ++ * 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 8031320 ++ * @summary Verify RTMAbortRatio option processing on CPU without rtm ++ * support or on VM that does not support rtm locking. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMAbortRatioOptionOnUnsupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMAbortRatioOptionOnUnsupportedConfig ++ */ ++ ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import com.oracle.java.testlibrary.cli.predicate.NotPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestRTMAbortRatioOptionOnUnsupportedConfig ++ extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "50"; ++ ++ private TestRTMAbortRatioOptionOnUnsupportedConfig() { ++ super(new NotPredicate(new AndPredicate(new SupportedVM(), ++ new SupportedCPU())), ++ "RTMAbortRatio", false, true, ++ TestRTMAbortRatioOptionOnUnsupportedConfig.DEFAULT_VALUE, ++ "0", "10", "100", "200"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMAbortRatioOptionOnUnsupportedConfig().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestRTMAbortThresholdOption.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestRTMAbortThresholdOption.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031320 ++ * @summary Verify processing of RTMAbortThreshold option. ++ * @library /testlibrary ++ * @build TestRTMAbortThresholdOption ++ * @run main/othervm TestRTMAbortThresholdOption ++ */ ++ ++public class TestRTMAbortThresholdOption ++ extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "1000"; ++ ++ private TestRTMAbortThresholdOption() { ++ super(Boolean.TRUE::booleanValue, "RTMAbortThreshold", false, true, ++ TestRTMAbortThresholdOption.DEFAULT_VALUE, ++ "0", "42", "100", "10000"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMAbortThresholdOption().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestRTMLockingCalculationDelayOption.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestRTMLockingCalculationDelayOption.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031320 ++ * @summary Verify processing of RTMLockingCalculationDelay option. ++ * @library /testlibrary ++ * @build TestRTMLockingCalculationDelayOption ++ * @run main/othervm TestRTMLockingCalculationDelayOption ++ */ ++ ++public class TestRTMLockingCalculationDelayOption ++ extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "0"; ++ ++ private TestRTMLockingCalculationDelayOption() { ++ super(Boolean.TRUE::booleanValue, "RTMLockingCalculationDelay", false, ++ true, TestRTMLockingCalculationDelayOption.DEFAULT_VALUE); ++ } ++ ++ public static void main(String agrs[]) throws Throwable { ++ new TestRTMLockingCalculationDelayOption().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestRTMLockingThresholdOption.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestRTMLockingThresholdOption.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031320 ++ * @summary Verify processing of RTMLockingThreshold option. ++ * @library /testlibrary ++ * @build TestRTMLockingThresholdOption ++ * @run main/othervm TestRTMLockingThresholdOption ++ */ ++ ++public class TestRTMLockingThresholdOption ++ extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "10000"; ++ ++ private TestRTMLockingThresholdOption() { ++ super(Boolean.TRUE::booleanValue, "RTMLockingThreshold", false, true, ++ TestRTMLockingThresholdOption.DEFAULT_VALUE); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMLockingThresholdOption().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestRTMRetryCountOption.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestRTMRetryCountOption.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031320 ++ * @summary Verify processing of RTMRetryCount option. ++ * @library /testlibrary ++ * @build TestRTMRetryCountOption ++ * @run main/othervm TestRTMRetryCountOption ++ */ ++ ++public class TestRTMRetryCountOption extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "5"; ++ ++ private TestRTMRetryCountOption() { ++ super(Boolean.TRUE::booleanValue, "RTMRetryCount", false, true, ++ TestRTMRetryCountOption.DEFAULT_VALUE, ++ "0", "10", "100", "1000"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMRetryCountOption().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestRTMSpinLoopCountOption.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestRTMSpinLoopCountOption.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031320 ++ * @summary Verify processing of RTMSpinLoopCount option. ++ * @library /testlibrary ++ * @build TestRTMSpinLoopCountOption ++ * @run main/othervm TestRTMSpinLoopCountOption ++ */ ++ ++public class TestRTMSpinLoopCountOption ++ extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "100"; ++ ++ private TestRTMSpinLoopCountOption() { ++ super(Boolean.TRUE::booleanValue, "RTMSpinLoopCount", false, true, ++ TestRTMSpinLoopCountOption.DEFAULT_VALUE, ++ "0", "10", "42", "1000"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMSpinLoopCountOption().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnSupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnSupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * 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 8031320 ++ * @summary Verify RTMTotalCountIncrRate option processing on CPU with ++ * rtm support and on VM with rtm locking support. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMTotalCountIncrRateOptionOnSupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestRTMTotalCountIncrRateOptionOnSupportedConfig ++ */ ++ ++public class TestRTMTotalCountIncrRateOptionOnSupportedConfig ++ extends RTMLockingAwareTest { ++ private static final String DEFAULT_VALUE = "64"; ++ ++ private TestRTMTotalCountIncrRateOptionOnSupportedConfig() { ++ super("RTMTotalCountIncrRate", false, true, ++ TestRTMTotalCountIncrRateOptionOnSupportedConfig.DEFAULT_VALUE, ++ /* correct values */ ++ new String[] { "1", "2", "128", "1024" }, ++ /* incorrect values */ ++ new String[] { "-1", "0", "3", "42" }, ++ RTMGenericCommandLineOptionTest.RTM_COUNT_INCR_WARNING); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMTotalCountIncrRateOptionOnSupportedConfig().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnUnsupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestRTMTotalCountIncrRateOptionOnUnsupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,59 @@ ++/* ++ * 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 com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import com.oracle.java.testlibrary.cli.predicate.NotPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * @test ++ * @bug 8031320 ++ * @summary Verify RTMTotalCountIncrRate option processing on CPU without ++ * rtm support and/or on VM without rtm locking support. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMTotalCountIncrRateOptionOnUnsupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestRTMTotalCountIncrRateOptionOnUnsupportedConfig ++ */ ++ ++public class TestRTMTotalCountIncrRateOptionOnUnsupportedConfig ++ extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "64"; ++ ++ private TestRTMTotalCountIncrRateOptionOnUnsupportedConfig() { ++ super(new NotPredicate(new AndPredicate(new SupportedCPU(), ++ new SupportedVM())), ++ "RTMTotalCountIncrRate", false, true, ++ TestRTMTotalCountIncrRateOptionOnUnsupportedConfig ++ .DEFAULT_VALUE, ++ "-1", "0", "42", "128"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMTotalCountIncrRateOptionOnUnsupportedConfig().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,90 @@ ++/* ++ * 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 8031320 ++ * @summary Verify UseRTMDeopt option processing on CPUs with rtm support ++ * when rtm locking is supported by VM. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMDeoptOptionOnSupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMDeoptOptionOnSupportedConfig ++ */ ++ ++import com.oracle.java.testlibrary.ExitCode; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestUseRTMDeoptOptionOnSupportedConfig ++ extends CommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "false"; ++ ++ private TestUseRTMDeoptOptionOnSupportedConfig() { ++ super(new AndPredicate(new SupportedVM(), new SupportedCPU())); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ String experimentalOptionError ++ = CommandLineOptionTest.getExperimentalOptionErrorMessage( ++ "UseRTMDeopt"); ++ // verify that option is experimental ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { experimentalOptionError }, null, ExitCode.FAIL, ++ "-XX:+UseRTMDeopt"); ++ // verify that option could be turned on ++ CommandLineOptionTest.verifySameJVMStartup(null, null, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMDeopt"); ++ // verify that option could be turned off ++ CommandLineOptionTest.verifySameJVMStartup(null, null, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:-UseRTMDeopt"); ++ // verify default value ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt", ++ TestUseRTMDeoptOptionOnSupportedConfig.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); ++ // verify default value ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt", ++ TestUseRTMDeoptOptionOnSupportedConfig.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ // verify that option is off when UseRTMLocking is off ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt", "false", ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:-UseRTMLocking", "-XX:+UseRTMDeopt"); ++ // verify that option could be turned on ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMDeopt", "true", ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking", "-XX:+UseRTMDeopt"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMDeoptOptionOnSupportedConfig().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 8031320 ++ * @summary Verify UseRTMDeopt option processing on CPUs without rtm support ++ * or on VMs without rtm locking support. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMDeoptOptionOnUnsupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMDeoptOptionOnUnsupportedConfig ++ */ ++ ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++ ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import com.oracle.java.testlibrary.cli.predicate.NotPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestUseRTMDeoptOptionOnUnsupportedConfig ++ extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "false"; ++ ++ private TestUseRTMDeoptOptionOnUnsupportedConfig() { ++ super(new NotPredicate(new AndPredicate(new SupportedCPU(), ++ new SupportedVM())), ++ "UseRTMDeopt", true, true, ++ TestUseRTMDeoptOptionOnUnsupportedConfig.DEFAULT_VALUE, "true"); ++ } ++ ++ @Override ++ protected void runX86SupportedVMTestCases() throws Throwable { ++ super.verifyJVMStartup(); ++ // verify default value ++ CommandLineOptionTest.verifyOptionValueForSameVM(optionName, ++ defaultValue, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); ++ // verify that until RTMLocking is not used, value ++ // will be set to default false. ++ CommandLineOptionTest.verifyOptionValueForSameVM(optionName, ++ defaultValue, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMDeopt"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMDeoptOptionOnUnsupportedConfig().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnSupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnSupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,102 @@ ++/* ++ * 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 8031320 ++ * @summary Verify UseRTMForStackLocks option processing on CPU with ++ * rtm support when VM supports rtm locking. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMForStackLocksOptionOnSupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestUseRTMForStackLocksOptionOnSupportedConfig ++ */ ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.*; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestUseRTMForStackLocksOptionOnSupportedConfig ++ extends CommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "false"; ++ ++ private TestUseRTMForStackLocksOptionOnSupportedConfig() { ++ super(new AndPredicate(new SupportedVM(), new SupportedCPU())); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ String errorMessage ++ = CommandLineOptionTest.getExperimentalOptionErrorMessage( ++ "UseRTMForStackLocks"); ++ String warningMessage ++ = RTMGenericCommandLineOptionTest.RTM_FOR_STACK_LOCKS_WARNING; ++ ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { errorMessage }, null, ExitCode.FAIL, ++ "-XX:+UseRTMForStackLocks"); ++ // verify that we get a warning when trying to use rtm for stack ++ // lock, but not using rtm locking. ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { warningMessage }, null, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMForStackLocks", ++ "-XX:-UseRTMLocking"); ++ // verify that we don't get a warning when no using rtm for stack ++ // lock and not using rtm locking. ++ CommandLineOptionTest.verifySameJVMStartup(null, ++ new String[] { warningMessage }, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:-UseRTMForStackLocks", ++ "-XX:-UseRTMLocking"); ++ // verify that we don't get a warning when using rtm for stack ++ // lock and using rtm locking. ++ CommandLineOptionTest.verifySameJVMStartup(null, ++ new String[] { warningMessage }, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMForStackLocks", ++ "-XX:+UseRTMLocking"); ++ // verify that default value if false ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMForStackLocks", ++ TestUseRTMForStackLocksOptionOnSupportedConfig.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); ++ // verify that default value is false even with +UseRTMLocking ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMForStackLocks", ++ TestUseRTMForStackLocksOptionOnSupportedConfig.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ // verify that we can turn the option on ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMForStackLocks", ++ "true", CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking", "-XX:+UseRTMForStackLocks"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMForStackLocksOptionOnSupportedConfig().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnUnsupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestUseRTMForStackLocksOptionOnUnsupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,93 @@ ++/* ++ * 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 8031320 ++ * @summary Verify UseRTMForStackLocks option processing on CPUs without ++ * rtm support and/or on VMs without rtm locking support. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMForStackLocksOptionOnUnsupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI ++ * TestUseRTMForStackLocksOptionOnUnsupportedConfig ++ */ ++ ++import com.oracle.java.testlibrary.ExitCode; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import com.oracle.java.testlibrary.cli.predicate.NotPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestUseRTMForStackLocksOptionOnUnsupportedConfig ++ extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "false"; ++ ++ private TestUseRTMForStackLocksOptionOnUnsupportedConfig() { ++ super(new NotPredicate(new AndPredicate(new SupportedCPU(), ++ new SupportedVM())), ++ "UseRTMForStackLocks", true, true, ++ TestUseRTMForStackLocksOptionOnUnsupportedConfig.DEFAULT_VALUE, ++ "true"); ++ } ++ ++ @Override ++ protected void runX86SupportedVMTestCases() throws Throwable { ++ // verify that option is experimental ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[]{ experimentalOptionError }, ++ null, ExitCode.FAIL, prepareOptionValue("true")); ++ ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[]{ experimentalOptionError }, ++ null, ExitCode.FAIL, prepareOptionValue("false")); ++ ++ // verify that if we turn it on, then VM output will contain ++ // warning saying that this option could be turned on only ++ // when we use rtm locking ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[]{ ++ RTMGenericCommandLineOptionTest.RTM_FOR_STACK_LOCKS_WARNING ++ }, ++ null, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ prepareOptionValue("true") ++ ); ++ // verify that options is turned off by default ++ CommandLineOptionTest.verifyOptionValueForSameVM(optionName, ++ TestUseRTMForStackLocksOptionOnUnsupportedConfig.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); ++ // verify that it could not be turned on without rtm locking ++ CommandLineOptionTest.verifyOptionValueForSameVM(optionName, ++ TestUseRTMForStackLocksOptionOnUnsupportedConfig.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ prepareOptionValue("true")); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMForStackLocksOptionOnUnsupportedConfig().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestUseRTMLockingOptionOnSupportedConfig.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestUseRTMLockingOptionOnSupportedConfig.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,96 @@ ++/* ++ * 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 8031320 ++ * @summary Verify UseRTMLocking option processing on CPU with rtm support and ++ * on VM with rtm-locking support. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMLockingOptionOnSupportedConfig ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMLockingOptionOnSupportedConfig ++ */ ++ ++import com.oracle.java.testlibrary.ExitCode; ++import com.oracle.java.testlibrary.cli.*; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestUseRTMLockingOptionOnSupportedConfig ++ extends CommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "false"; ++ ++ private TestUseRTMLockingOptionOnSupportedConfig() { ++ super(new AndPredicate(new SupportedVM(), new SupportedCPU())); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ String unrecongnizedOption ++ = CommandLineOptionTest.getUnrecognizedOptionErrorMessage( ++ "UseRTMLocking"); ++ String experimentalOptionError ++ = CommandLineOptionTest.getExperimentalOptionErrorMessage( ++ "UseRTMLocking"); ++ // verify that options is experimental ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { experimentalOptionError }, null, ExitCode.FAIL, ++ "-XX:+UseRTMLocking"); ++ // verify that there are no warning or error in VM output ++ CommandLineOptionTest.verifySameJVMStartup(null, ++ new String[]{ ++ RTMGenericCommandLineOptionTest.RTM_INSTR_ERROR, ++ unrecongnizedOption ++ }, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ ++ CommandLineOptionTest.verifySameJVMStartup(null, ++ new String[]{ ++ RTMGenericCommandLineOptionTest.RTM_INSTR_ERROR, ++ unrecongnizedOption ++ }, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:-UseRTMLocking"); ++ // verify that UseRTMLocking is of by default ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", ++ TestUseRTMLockingOptionOnSupportedConfig.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); ++ // verify that we can change UseRTMLocking value ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", ++ TestUseRTMLockingOptionOnSupportedConfig.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:-UseRTMLocking"); ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", ++ "true", CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMLockingOptionOnSupportedConfig().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedCPU.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedCPU.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,103 @@ ++/* ++ * 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 8031320 ++ * @summary Verify UseRTMLocking option processing on CPU without ++ * rtm support. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMLockingOptionOnUnsupportedCPU ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMLockingOptionOnUnsupportedCPU ++ */ ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.*; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import com.oracle.java.testlibrary.cli.predicate.NotPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestUseRTMLockingOptionOnUnsupportedCPU ++ extends CommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "false"; ++ ++ private TestUseRTMLockingOptionOnUnsupportedCPU() { ++ super(new AndPredicate(new NotPredicate(new SupportedCPU()), ++ new SupportedVM())); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ String unrecongnizedOption ++ = CommandLineOptionTest.getUnrecognizedOptionErrorMessage( ++ "UseRTMLocking"); ++ String errorMessage = RTMGenericCommandLineOptionTest.RTM_INSTR_ERROR; ++ ++ if (Platform.isX86() || Platform.isX64()) { ++ // verify that we get an error when use +UseRTMLocking ++ // on unsupported CPU ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { errorMessage }, ++ new String[] { unrecongnizedOption }, ++ ExitCode.FAIL, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ // verify that we can pass -UseRTMLocking without ++ // getting any error messages ++ CommandLineOptionTest.verifySameJVMStartup( ++ null, ++ new String[]{ ++ errorMessage, ++ unrecongnizedOption ++ }, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:-UseRTMLocking"); ++ ++ // verify that UseRTMLocking is false by default ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", ++ TestUseRTMLockingOptionOnUnsupportedCPU.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); ++ } else { ++ // verify that on non-x86 CPUs RTMLocking could not be used ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { unrecongnizedOption }, ++ null, ExitCode.FAIL, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { unrecongnizedOption }, ++ null, ExitCode.FAIL, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:-UseRTMLocking"); ++ } ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMLockingOptionOnUnsupportedCPU().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedVM.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestUseRTMLockingOptionOnUnsupportedVM.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,82 @@ ++/* ++ * 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 8031320 ++ * @summary Verify UseRTMLocking option processing on CPU with rtm support ++ * in case when VM should not support this option. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMLockingOptionOnUnsupportedVM ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMLockingOptionOnUnsupportedVM ++ */ ++ ++import com.oracle.java.testlibrary.ExitCode; ++import com.oracle.java.testlibrary.cli.*; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import com.oracle.java.testlibrary.cli.predicate.NotPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestUseRTMLockingOptionOnUnsupportedVM ++ extends CommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "false"; ++ ++ private TestUseRTMLockingOptionOnUnsupportedVM() { ++ super(new AndPredicate(new SupportedCPU(), ++ new NotPredicate(new SupportedVM()))); ++ } ++ @Override ++ public void runTestCases() throws Throwable { ++ String errorMessage ++ = RTMGenericCommandLineOptionTest.RTM_UNSUPPORTED_VM_ERROR; ++ String experimentalOptionError ++ = CommandLineOptionTest.getExperimentalOptionErrorMessage( ++ "UseRTMLocking"); ++ // verify that options is experimental ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { experimentalOptionError }, null, ExitCode.FAIL, ++ "-XX:+UseRTMLocking"); ++ // verify that we can't use +UseRTMLocking ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { errorMessage }, null, ExitCode.FAIL, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ // verify that we can turn it off ++ CommandLineOptionTest.verifySameJVMStartup(null, ++ new String[] { errorMessage }, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:-UseRTMLocking"); ++ // verify that it is off by default ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseRTMLocking", ++ TestUseRTMLockingOptionOnUnsupportedVM.DEFAULT_VALUE, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMLockingOptionOnUnsupportedVM().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestUseRTMLockingOptionWithBiasedLocking.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestUseRTMLockingOptionWithBiasedLocking.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,77 @@ ++/* ++ * 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 8031320 ++ * @summary Verify processing of UseRTMLocking and UseBiasedLocking ++ * options combination on CPU and VM with rtm support. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMLockingOptionWithBiasedLocking ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMLockingOptionWithBiasedLocking ++ */ ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.*; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++public class TestUseRTMLockingOptionWithBiasedLocking ++ extends CommandLineOptionTest { ++ private TestUseRTMLockingOptionWithBiasedLocking() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ String warningMessage ++ = RTMGenericCommandLineOptionTest.RTM_BIASED_LOCKING_WARNING; ++ // verify that we will not get a warning ++ CommandLineOptionTest.verifySameJVMStartup(null, ++ new String[] { warningMessage }, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking", "-XX:-UseBiasedLocking"); ++ // verify that we will get a warning ++ CommandLineOptionTest.verifySameJVMStartup( ++ new String[] { warningMessage }, null, ExitCode.OK, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking", "-XX:+UseBiasedLocking"); ++ // verify that UseBiasedLocking is false when we use rtm locking ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseBiasedLocking", ++ "false", CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ // verify that we can't turn on biased locking when ++ // using rtm locking ++ CommandLineOptionTest.verifyOptionValueForSameVM("UseBiasedLocking", ++ "false", CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking", "-XX:+UseBiasedLocking"); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMLockingOptionWithBiasedLocking().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/cli/TestUseRTMXendForLockBusyOption.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/cli/TestUseRTMXendForLockBusyOption.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 ++ * @bug 8031320 ++ * @summary Verify processing of UseRTMXendForLockBusy option. ++ * @library /testlibrary ++ * @build TestUseRTMXendForLockBusyOption ++ * @run main/othervm TestUseRTMXendForLockBusyOption ++ */ ++ ++public class TestUseRTMXendForLockBusyOption ++ extends RTMGenericCommandLineOptionTest { ++ private static final String DEFAULT_VALUE = "true"; ++ ++ public TestUseRTMXendForLockBusyOption() { ++ super(Boolean.TRUE::booleanValue, "UseRTMXendForLockBusy", true, true, ++ TestUseRTMXendForLockBusyOption.DEFAULT_VALUE, "true"); ++ } ++ ++ public static void main(String agrs[]) throws Throwable { ++ new TestUseRTMXendForLockBusyOption().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestRTMAbortRatio.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMAbortRatio.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,163 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that RTMAbortRatio affects amount of aborts before ++ * deoptimization. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMAbortRatio ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMAbortRatio ++ */ ++ ++import java.util.List; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++import sun.misc.Unsafe; ++ ++/** ++ * Test verifies that method will be deoptimized on high abort ratio ++ * as soon as abort ratio reaches RTMAbortRatio's value. ++ */ ++public class TestRTMAbortRatio extends CommandLineOptionTest { ++ private TestRTMAbortRatio() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ verifyAbortRatio(0, false); ++ verifyAbortRatio(10, false); ++ verifyAbortRatio(50, false); ++ verifyAbortRatio(100, false); ++ ++ verifyAbortRatio(0, true); ++ verifyAbortRatio(10, true); ++ verifyAbortRatio(50, true); ++ verifyAbortRatio(100, true); ++ } ++ ++ private void verifyAbortRatio(int abortRatio, boolean useStackLock) ++ throws Throwable { ++ CompilableTest test = new Test(); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ test, ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ useStackLock), ++ "-XX:+UseRTMDeopt", ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:RTMAbortThreshold=0", ++ CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold", ++ 10 * Test.TOTAL_ITERATIONS), ++ CommandLineOptionTest.prepareNumericFlag("RTMAbortRatio", ++ abortRatio), ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ test.getClass().getName(), ++ Boolean.toString(!useStackLock)); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ test.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 1, "VM output should contain " ++ + "exactly one RTM locking statistics entry."); ++ ++ RTMLockingStatistics lock = statistics.get(0); ++ int actualRatio; ++ ++ if (lock.getTotalAborts() == 1L) { ++ actualRatio = 0; ++ } else { ++ actualRatio = (int) (lock.getTotalLocks() ++ / (lock.getTotalAborts() - 1L)); ++ } ++ ++ Asserts.assertLTE(actualRatio, abortRatio, String.format( ++ "Actual abort ratio (%d) should lower or equal to " ++ + "specified (%d).", actualRatio, abortRatio)); ++ } ++ ++ /** ++ * Force abort after {@code Test.WARMUP_ITERATIONS} is done. ++ */ ++ public static class Test implements CompilableTest { ++ private static final int TOTAL_ITERATIONS = 10000; ++ private static final int WARMUP_ITERATIONS = 1000; ++ private static final Unsafe UNSAFE = Utils.getUnsafe(); ++ private final Object monitor = new Object(); ++ // Following field have to be static in order to avoid escape analysis. ++ @SuppressWarnings("UnsuedDeclaration") ++ private static int field = 0; ++ ++ @Override ++ public String getMethodWithLockName() { ++ return this.getClass().getName() + "::lock"; ++ } ++ ++ @Override ++ public String[] getMethodsToCompileNames() { ++ return new String[] { ++ getMethodWithLockName(), ++ Unsafe.class.getName() + "::addressSize" ++ }; ++ } ++ ++ public void lock(boolean abort) { ++ synchronized(monitor) { ++ if (abort) { ++ Test.UNSAFE.addressSize(); ++ } ++ } ++ } ++ ++ /** ++ * Usage: ++ * Test <inflate monitor> ++ */ ++ public static void main(String args[]) throws Throwable { ++ Asserts.assertGTE(args.length, 1, "One argument required."); ++ Test t = new Test(); ++ if (Boolean.valueOf(args[0])) { ++ AbortProvoker.inflateMonitor(t.monitor); ++ } ++ for (int i = 0; i < Test.TOTAL_ITERATIONS; i++) { ++ t.lock(i >= Test.WARMUP_ITERATIONS); ++ } ++ } ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMAbortRatio().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/rtm/locking/TestRTMAbortThreshold.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMAbortThreshold.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,102 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that RTMAbortThreshold option affects ++ * amount of aborts after which abort ratio is calculated. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMAbortThreshold ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMAbortThreshold ++ */ ++ ++import java.util.List; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that on RTMAbortThreshold option actually affects how soon ++ * method will be deoptimized on high abort ratio. ++ */ ++public class TestRTMAbortThreshold extends CommandLineOptionTest { ++ private TestRTMAbortThreshold() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ verifyAbortThreshold(false, 1); ++ verifyAbortThreshold(false, 10); ++ verifyAbortThreshold(false, 1000); ++ ++ verifyAbortThreshold(true, 1); ++ verifyAbortThreshold(true, 10); ++ verifyAbortThreshold(true, 1000); ++ } ++ ++ private void verifyAbortThreshold(boolean useStackLock, ++ long abortThreshold) throws Throwable { ++ AbortProvoker provoker = AbortType.XABORT.provoker(); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ provoker, ++ "-XX:+UseRTMDeopt", ++ "-XX:RTMAbortRatio=0", ++ CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold", ++ abortThreshold), ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ useStackLock), ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ AbortProvoker.class.getName(), ++ AbortType.XABORT.toString(), ++ Boolean.toString(!useStackLock)); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 1, "VM output should contain " ++ + "exactly one RTM locking statistics entry for method " ++ + provoker.getMethodWithLockName()); ++ ++ Asserts.assertEQ(statistics.get(0).getTotalLocks(), abortThreshold, ++ String.format("Expected that method with rtm lock elision was" ++ + " deoptimized after %d lock attempts", ++ abortThreshold)); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMAbortThreshold().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMAfterNonRTMDeopt.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,210 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that if we use RTMDeopt, then deoptimization ++ * caused by reason other then rtm_state_change will reset ++ * method's RTM state. And if we don't use RTMDeopt, then ++ * RTM state remain the same after such deoptimization. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMAfterNonRTMDeopt ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMAfterNonRTMDeopt ++ */ ++ ++import java.util.List; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++import sun.misc.Unsafe; ++ ++/** ++ * To verify that with +UseRTMDeopt method's RTM state will be ++ * changed to ProfileRTM on deoptimization unrelated to ++ * rtm_state_change following sequence of events is used: ++ *
++ *
++ *     rtm state ^
++ *               |
++ *       UseRTM  |      ******|     ******
++ *               |            |
++ *   ProfileRTM  |******|     |*****|
++ *               |      |     |     |
++ *              0-------|-----|-----|---------------------> time
++ *                      |     |     \ force abort
++ *                      |     |
++ *                      |     \ force deoptimization
++ *                      |
++ *                      \ force xabort
++ * 
++ * When xabort is forced by native method call method should ++ * change it's state to UseRTM, because we use RTMAbortRatio=100 ++ * and low RTMLockingThreshold, so at this point actual abort ++ * ratio will be below 100% and there should be enough lock ++ * attempts to recompile method without RTM profiling. ++ */ ++public class TestRTMAfterNonRTMDeopt extends CommandLineOptionTest { ++ private static final int ABORT_THRESHOLD = 1000; ++ private static final String RANGE_CHECK = "range_check"; ++ ++ private TestRTMAfterNonRTMDeopt() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ verifyRTMAfterDeopt(false, false); ++ verifyRTMAfterDeopt(true, false); ++ ++ verifyRTMAfterDeopt(false, true); ++ verifyRTMAfterDeopt(true, true); ++ } ++ ++ private void verifyRTMAfterDeopt(boolean useStackLock, ++ boolean useRTMDeopt) throws Throwable { ++ CompilableTest test = new Test(); ++ String logFile = String.format("rtm_%s_stack_lock_%s_deopt.xml", ++ (useStackLock ? "use" : "no"), (useRTMDeopt ? "use" : "no")); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ logFile, ++ test, ++ "-XX:CompileThreshold=1", ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ useStackLock), ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMDeopt", ++ useRTMDeopt), ++ "-XX:RTMAbortRatio=100", ++ CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold", ++ TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD), ++ CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold", ++ TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD / 2L), ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ Test.class.getName(), ++ Boolean.toString(!useStackLock) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ int traps = RTMTestBase.firedRTMStateChangeTraps(logFile); ++ ++ if (useRTMDeopt) { ++ Asserts.assertEQ(traps, 2, "Two uncommon traps with " ++ + "reason rtm_state_change should be fired."); ++ } else { ++ Asserts.assertEQ(traps, 0, "No uncommon traps with " ++ + "reason rtm_state_change should be fired."); ++ } ++ ++ int rangeCheckTraps = RTMTestBase.firedUncommonTraps(logFile, ++ TestRTMAfterNonRTMDeopt.RANGE_CHECK); ++ ++ Asserts.assertEQ(rangeCheckTraps, 1, ++ "One range_check uncommon trap should be fired."); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ test.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ int expectedStatEntries = (useRTMDeopt ? 4 : 2); ++ ++ Asserts.assertEQ(statistics.size(), expectedStatEntries, ++ String.format("VM output should contain %d RTM locking " ++ + "statistics entries.", expectedStatEntries)); ++ } ++ ++ public static class Test implements CompilableTest { ++ // Following field have to be static in order to avoid escape analysis. ++ @SuppressWarnings("UnsuedDeclaration") ++ private static int field = 0; ++ private static final int ITERATIONS = 10000; ++ private static final int RANGE_CHECK_AT = ITERATIONS / 2; ++ private static final Unsafe UNSAFE = Utils.getUnsafe(); ++ private final Object monitor = new Object(); ++ ++ @Override ++ public String getMethodWithLockName() { ++ return this.getClass().getName() + "::forceAbort"; ++ } ++ ++ @Override ++ public String[] getMethodsToCompileNames() { ++ return new String[] { ++ getMethodWithLockName(), ++ sun.misc.Unsafe.class.getName() + "::forceAbort" ++ }; ++ } ++ ++ public void forceAbort(int a[], boolean abort) { ++ try { ++ synchronized(monitor) { ++ a[0]++; ++ if (abort) { ++ Test.field = Test.UNSAFE.addressSize(); ++ } ++ } ++ } catch (Throwable t) { ++ // suppress any throwables ++ } ++ } ++ ++ /** ++ * Usage: ++ * Test <inflate monitor> ++ */ ++ public static void main(String args[]) throws Throwable { ++ Test t = new Test(); ++ ++ if (Boolean.valueOf(args[0])) { ++ AbortProvoker.inflateMonitor(t.monitor); ++ } ++ ++ int tmp[] = new int[1]; ++ ++ for (int i = 0; i < Test.ITERATIONS; i++ ) { ++ if (i == Test.RANGE_CHECK_AT) { ++ t.forceAbort(new int[0], false); ++ } else { ++ boolean isThreshold ++ = (i == TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD); ++ boolean isThresholdPlusRange ++ = (i == TestRTMAfterNonRTMDeopt.ABORT_THRESHOLD ++ + Test.RANGE_CHECK_AT); ++ t.forceAbort(tmp, isThreshold || isThresholdPlusRange); ++ } ++ } ++ } ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMAfterNonRTMDeopt().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMDeoptOnHighAbortRatio.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,114 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that on high abort ratio method will be recompiled ++ * without rtm locking. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMDeoptOnHighAbortRatio ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMDeoptOnHighAbortRatio ++ */ ++ ++import java.util.List; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that on high abort ratio method wil be deoptimized with ++ * rtm_state_change reason and after that RTM-based lock elision will not ++ * be used for that method. ++ * This test make asserts on total locks count done by compiled method, ++ * so in order to avoid issue with retriable locks -XX:RTMRetryCount=0 is used. ++ * For more details on that issue see {@link TestUseRTMAfterLockInflation}. ++ */ ++public class TestRTMDeoptOnHighAbortRatio extends CommandLineOptionTest { ++ private static final long ABORT_THRESHOLD ++ = AbortProvoker.DEFAULT_ITERATIONS / 2L; ++ ++ private TestRTMDeoptOnHighAbortRatio() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ verifyDeopt(false); ++ verifyDeopt(true); ++ } ++ ++ private void verifyDeopt(boolean useStackLock) throws Throwable { ++ AbortProvoker provoker = AbortType.XABORT.provoker(); ++ String logFileName = String.format("rtm_deopt_%s_stack_lock.xml", ++ (useStackLock ? "use" : "no")); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ logFileName, ++ provoker, ++ "-XX:+UseRTMDeopt", ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ useStackLock), ++ "-XX:RTMRetryCount=0", ++ CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold", ++ TestRTMDeoptOnHighAbortRatio.ABORT_THRESHOLD), ++ "-XX:RTMAbortRatio=100", ++ "-XX:CompileThreshold=1", ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ AbortProvoker.class.getName(), ++ AbortType.XABORT.toString(), ++ Boolean.toString(!useStackLock) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName); ++ ++ Asserts.assertEQ(firedTraps, 1, "Expected to get only one " ++ + "deoptimization due to rtm state change"); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 1, "VM output should contain " ++ + "exactly one RTM locking statistics entry for method " ++ + provoker.getMethodWithLockName()); ++ ++ Asserts.assertEQ(statistics.get(0).getTotalLocks(), ++ TestRTMDeoptOnHighAbortRatio.ABORT_THRESHOLD, ++ "After AbortThreshold was reached, method should be" ++ + " recompiled without rtm lock eliding."); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMDeoptOnHighAbortRatio().test(); ++ } ++} ++ +--- ./hotspot/test/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMDeoptOnLowAbortRatio.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,167 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that on low abort ratio method will be recompiled. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMDeoptOnLowAbortRatio ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMDeoptOnLowAbortRatio ++ */ ++ ++import java.util.List; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++import sun.misc.Unsafe; ++ ++/** ++ * Test verifies that low abort ratio method will be deoptimized with ++ * rtm_state_change reason and will continue to use RTM-based lock ++ * elision after that. ++ * This test make asserts on total locks count done by compiled method, ++ * so in order to avoid issue with retriable locks -XX:RTMRetryCount=0 is used. ++ * For more details on that issue see {@link TestUseRTMAfterLockInflation}. ++ */ ++public class TestRTMDeoptOnLowAbortRatio extends CommandLineOptionTest { ++ private static final long LOCKING_THRESHOLD = 100L; ++ ++ private TestRTMDeoptOnLowAbortRatio() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ verifyRTMDeopt(false); ++ verifyRTMDeopt(true); ++ } ++ ++ private void verifyRTMDeopt(boolean useStackLock) throws Throwable { ++ CompilableTest test = new Test(); ++ String logFileName = String.format("rtm_deopt_%s_stack_lock.xml", ++ useStackLock ? "use" : "no"); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ logFileName, ++ test, ++ "-XX:+UseRTMDeopt", ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ useStackLock), ++ CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold", ++ TestRTMDeoptOnLowAbortRatio.LOCKING_THRESHOLD), ++ "-XX:RTMAbortThreshold=1", ++ "-XX:RTMAbortRatio=100", ++ "-XX:CompileThreshold=1", ++ "-XX:RTMRetryCount=0", ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ Test.class.getName(), ++ Boolean.toString(!useStackLock) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName); ++ ++ Asserts.assertEQ(firedTraps, 1, ++ "Expected to get only one deoptimization due to rtm" ++ + " state change"); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ test.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 2, ++ "VM output should contain two RTM locking " ++ + "statistics entries for method " ++ + test.getMethodWithLockName()); ++ ++ RTMLockingStatistics statisticsBeforeDeopt = null; ++ ++ for (RTMLockingStatistics s : statistics) { ++ if (s.getTotalLocks() ++ == TestRTMDeoptOnLowAbortRatio.LOCKING_THRESHOLD + 1L) { ++ Asserts.assertNull(statisticsBeforeDeopt, ++ "Only one abort was expected during test run"); ++ statisticsBeforeDeopt = s; ++ } ++ } ++ ++ Asserts.assertNotNull(statisticsBeforeDeopt, ++ "After LockThreshold was reached, method should be recompiled " ++ + "with rtm lock eliding."); ++ } ++ ++ public static class Test implements CompilableTest { ++ private static final Unsafe UNSAFE = Utils.getUnsafe(); ++ private final Object monitor = new Object(); ++ ++ @Override ++ public String getMethodWithLockName() { ++ return this.getClass().getName() + "::forceAbort"; ++ } ++ ++ @Override ++ public String[] getMethodsToCompileNames() { ++ return new String[] { ++ getMethodWithLockName(), ++ sun.misc.Unsafe.class.getName() + "::addressSize" ++ }; ++ } ++ ++ public void forceAbort(boolean abort) { ++ synchronized(monitor) { ++ if (abort) { ++ Test.UNSAFE.addressSize(); ++ } ++ } ++ } ++ ++ /** ++ * Usage: ++ * Test <inflate monitor> ++ */ ++ public static void main(String args[]) throws Throwable { ++ Asserts.assertGTE(args.length, 1, "One argument required."); ++ Test t = new Test(); ++ ++ if (Boolean.valueOf(args[0])) { ++ AbortProvoker.inflateMonitor(t.monitor); ++ } ++ for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) { ++ t.forceAbort( ++ i == TestRTMDeoptOnLowAbortRatio.LOCKING_THRESHOLD); ++ } ++ } ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMDeoptOnLowAbortRatio().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestRTMLockingCalculationDelay.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMLockingCalculationDelay.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,106 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that RTMLockingCalculationDelay affect when ++ * abort ratio calculation is started. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMLockingCalculationDelay ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMLockingCalculationDelay ++ */ ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that abort ratio calculation could be delayed using ++ * RTMLockingCalculationDelay option. ++ */ ++public class TestRTMLockingCalculationDelay extends CommandLineOptionTest { ++ private static final boolean INFLATE_MONITOR = true; ++ ++ private TestRTMLockingCalculationDelay() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ // verify that calculation will be started immediately ++ verifyLockingCalculationDelay(0, 0, true); ++ ++ // verify that calculation will not be started during ++ // first 10 minutes, while test will be started immediately ++ verifyLockingCalculationDelay(600000, 0, false); ++ ++ // verify that calculation will be started after a second ++ verifyLockingCalculationDelay(1000, 1000, true); ++ } ++ ++ private void verifyLockingCalculationDelay(long delay, long testDelay, ++ boolean deoptExpected) throws Throwable { ++ AbortProvoker provoker = AbortType.XABORT.provoker(); ++ String logFileName = String.format("rtm_delay_%d_%d.xml", delay, ++ testDelay); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ logFileName, ++ provoker, ++ "-XX:+UseRTMDeopt", ++ CommandLineOptionTest.prepareNumericFlag( ++ "RTMLockingCalculationDelay", delay), ++ "-XX:RTMAbortRatio=0", ++ "-XX:RTMAbortThreshold=0", ++ AbortProvoker.class.getName(), ++ AbortType.XABORT.toString(), ++ Boolean.toString( ++ TestRTMLockingCalculationDelay.INFLATE_MONITOR), ++ Long.toString(AbortProvoker.DEFAULT_ITERATIONS), ++ Long.toString(testDelay) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ int deopts = RTMTestBase.firedRTMStateChangeTraps(logFileName); ++ ++ if (deoptExpected) { ++ Asserts.assertGT(deopts, 0, "At least one deoptimization due to " ++ + "rtm_state_chage is expected"); ++ } else { ++ Asserts.assertEQ(deopts, 0, "No deoptimizations due to " ++ + "rtm_state_chage are expected"); ++ } ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMLockingCalculationDelay().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestRTMLockingThreshold.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMLockingThreshold.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,179 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that RTMLockingThreshold affects rtm state transition ++ * ProfileRTM => UseRTM. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMLockingThreshold ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMLockingThreshold ++ */ ++ ++import java.util.List; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++import sun.misc.Unsafe; ++ ++/** ++ * Test verifies that RTMLockingThreshold option actually affects how soon ++ * method will be deoptimized on low abort ratio. ++ */ ++public class TestRTMLockingThreshold extends CommandLineOptionTest { ++ private TestRTMLockingThreshold() { ++ super(new AndPredicate(new SupportedVM(), new SupportedCPU())); ++ } ++ ++ /** ++ * We use non-zero abort threshold to avoid abort related to ++ * interrupts, VMM calls, etc. during first lock attempt. ++ * ++ */ ++ private static final int ABORT_THRESHOLD = 10; ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ verifyLockingThreshold(0, false); ++ verifyLockingThreshold(100, false); ++ verifyLockingThreshold(1000, false); ++ ++ verifyLockingThreshold(0, true); ++ verifyLockingThreshold(100, true); ++ verifyLockingThreshold(1000, true); ++ } ++ ++ private void verifyLockingThreshold(int lockingThreshold, ++ boolean useStackLock) throws Throwable { ++ CompilableTest test = new Test(); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ test, ++ "-XX:CompileThreshold=1", ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ useStackLock), ++ "-XX:+UseRTMDeopt", ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:RTMRetryCount=0", ++ CommandLineOptionTest.prepareNumericFlag("RTMAbortThreshold", ++ TestRTMLockingThreshold.ABORT_THRESHOLD), ++ CommandLineOptionTest.prepareNumericFlag("RTMLockingThreshold", ++ lockingThreshold), ++ "-XX:RTMAbortRatio=100", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ Test.class.getName(), ++ Boolean.toString(!useStackLock), ++ Integer.toString(lockingThreshold) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ test.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 2, "VM output should contain two " ++ + "RTM locking statistics entries."); ++ ++ /** ++ * We force abort on each odd iteration, so if RTMLockingThreshold==0, ++ * then we have to make 1 call without abort to avoid rtm state ++ * transition to NoRTM (otherwise actual abort ratio will be 100%), ++ * and after that make 1 call with abort to force deoptimization. ++ * This leads us to two locks for threshold 0. ++ * For other threshold values we have to make RTMLockingThreshold + 1 ++ * locks if locking threshold is even, or + 0 if odd. ++ */ ++ long expectedValue = lockingThreshold + ++ (lockingThreshold == 0L ? 2L : lockingThreshold % 2L); ++ ++ RTMLockingStatistics statBeforeDeopt = null; ++ for (RTMLockingStatistics s : statistics) { ++ if (s.getTotalLocks() == expectedValue) { ++ Asserts.assertNull(statBeforeDeopt, ++ "Only one statistics entry should contain aborts"); ++ statBeforeDeopt = s; ++ } ++ } ++ ++ Asserts.assertNotNull(statBeforeDeopt, "There should be exactly one " ++ + "statistics entry corresponding to ProfileRTM state."); ++ } ++ ++ public static class Test implements CompilableTest { ++ // Following field have to be static in order to avoid escape analysis. ++ @SuppressWarnings("UnsuedDeclaration") ++ private static int field = 0; ++ private static final int TOTAL_ITERATIONS = 10000; ++ private static final Unsafe UNSAFE = Utils.getUnsafe(); ++ private final Object monitor = new Object(); ++ ++ ++ @Override ++ public String getMethodWithLockName() { ++ return this.getClass().getName() + "::lock"; ++ } ++ ++ @Override ++ public String[] getMethodsToCompileNames() { ++ return new String[] { ++ getMethodWithLockName(), ++ sun.misc.Unsafe.class.getName() + "::addressSize" ++ }; ++ } ++ ++ public void lock(boolean abort) { ++ synchronized(monitor) { ++ if (abort) { ++ Test.field += Test.UNSAFE.addressSize(); ++ } ++ } ++ } ++ ++ /** ++ * Usage: ++ * Test <inflate monitor> ++ */ ++ public static void main(String args[]) throws Throwable { ++ Asserts.assertGTE(args.length, 1, "One argument required."); ++ Test t = new Test(); ++ ++ if (Boolean.valueOf(args[0])) { ++ AbortProvoker.inflateMonitor(t.monitor); ++ } ++ for (int i = 0; i < Test.TOTAL_ITERATIONS; i++) { ++ t.lock(i % 2 == 1); ++ } ++ } ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMLockingThreshold().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestRTMRetryCount.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMRetryCount.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,102 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that RTMRetryCount affects actual amount of retries. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMRetryCount ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMRetryCount ++ */ ++ ++import java.util.List; ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that RTMRetryCount option actually affects amount of ++ * retries on lock busy. ++ */ ++public class TestRTMRetryCount extends CommandLineOptionTest { ++ /** ++ * Time in ms, during which busy lock will be locked. ++ */ ++ private static final int LOCKING_TIME = 5000; ++ private static final boolean INFLATE_MONITOR = true; ++ ++ private TestRTMRetryCount() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ verifyRTMRetryCount(0); ++ verifyRTMRetryCount(1); ++ verifyRTMRetryCount(5); ++ verifyRTMRetryCount(10); ++ } ++ ++ private void verifyRTMRetryCount(int retryCount) throws Throwable { ++ CompilableTest busyLock = new BusyLock(); ++ long expectedAborts = retryCount + 1L; ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ busyLock, ++ "-XX:-UseRTMXendForLockBusy", ++ "-XX:RTMTotalCountIncrRate=1", ++ CommandLineOptionTest.prepareNumericFlag("RTMRetryCount", ++ retryCount), ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ BusyLock.class.getName(), ++ Boolean.toString(TestRTMRetryCount.INFLATE_MONITOR), ++ Integer.toString(TestRTMRetryCount.LOCKING_TIME) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ busyLock.getMethodWithLockName(), outputAnalyzer.getStdout()); ++ ++ Asserts.assertEQ(statistics.size(), 1, "VM output should contain " ++ + "exactly one rtm locking statistics entry for method " ++ + busyLock.getMethodWithLockName()); ++ ++ Asserts.assertEQ(statistics.get(0).getTotalAborts(), expectedAborts, ++ String.format("It is expected to get %d aborts", ++ expectedAborts)); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMRetryCount().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestRTMSpinLoopCount.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMSpinLoopCount.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,115 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/** ++ * @test ++ * @bug 8031320 ++ * @summary Verify that RTMSpinLoopCount affects time spent ++ * between locking attempts. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMSpinLoopCount ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMSpinLoopCount ++ */ ++ ++import java.util.List; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that RTMSpinLoopCount increase time spent between retries ++ * by comparing amount of retries done with different RTMSpinLoopCount's values. ++ */ ++public class TestRTMSpinLoopCount extends CommandLineOptionTest { ++ private static final int LOCKING_TIME = 1000; ++ private static final int RTM_RETRY_COUNT = 1000; ++ private static final boolean INFLATE_MONITOR = true; ++ private static final long MAX_ABORTS = RTM_RETRY_COUNT + 1L; ++ private static final int[] SPIN_LOOP_COUNTS ++ = new int[] { 0, 100, 1_000, 1_000_000, 10_000_000 }; ++ ++ private TestRTMSpinLoopCount() { ++ super(new AndPredicate(new SupportedVM(), new SupportedCPU())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ long[] aborts = new long[TestRTMSpinLoopCount.SPIN_LOOP_COUNTS.length]; ++ for (int i = 0; i < TestRTMSpinLoopCount.SPIN_LOOP_COUNTS.length; i++) { ++ aborts[i] = getAbortsCountOnLockBusy( ++ TestRTMSpinLoopCount.SPIN_LOOP_COUNTS[i]); ++ } ++ ++ for (int i = 1; i < aborts.length; i++) { ++ Asserts.assertLTE(aborts[i], aborts[i - 1], "Increased spin loop " ++ + "count should not increase retries count."); ++ } ++ } ++ ++ private long getAbortsCountOnLockBusy(int spinLoopCount) throws Throwable { ++ CompilableTest test = new BusyLock(); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ test, ++ CommandLineOptionTest.prepareNumericFlag("RTMRetryCount", ++ TestRTMSpinLoopCount.RTM_RETRY_COUNT), ++ CommandLineOptionTest.prepareNumericFlag("RTMSpinLoopCount", ++ spinLoopCount), ++ "-XX:-UseRTMXendForLockBusy", ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ BusyLock.class.getName(), ++ Boolean.toString(TestRTMSpinLoopCount.INFLATE_MONITOR), ++ Integer.toString(TestRTMSpinLoopCount.LOCKING_TIME) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ test.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 1, ++ "VM output should contain exactly one entry for method " ++ + test.getMethodWithLockName()); ++ ++ RTMLockingStatistics lock = statistics.get(0); ++ ++ Asserts.assertLTE(lock.getTotalAborts(), ++ TestRTMSpinLoopCount.MAX_ABORTS, String.format("Total aborts " ++ + "count (%d) should be less or equal to %d", ++ lock.getTotalAborts(), ++ TestRTMSpinLoopCount.MAX_ABORTS)); ++ ++ return lock.getTotalAborts(); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMSpinLoopCount().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestRTMTotalCountIncrRate.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestRTMTotalCountIncrRate.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,150 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that RTMTotalCountIncrRate option affects ++ * RTM locking statistics. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestRTMTotalCountIncrRate ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestRTMTotalCountIncrRate ++ */ ++ ++import java.util.List; ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that with RTMTotalCountIncrRate=1 RTM locking statistics ++ * contains precise information abort attempted locks and that with other values ++ * statistics contains information abort non-zero locking attempts. ++ * Since assert done for RTMTotalCountIncrRate=1 is pretty strict, test uses ++ * -XX:RTMRetryCount=0 to avoid issue with retriable aborts. For more details on ++ * that issue see {@link TestUseRTMAfterLockInflation}. ++ */ ++public class TestRTMTotalCountIncrRate extends CommandLineOptionTest { ++ private TestRTMTotalCountIncrRate() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ verifyLocksCount(1, false); ++ verifyLocksCount(64, false); ++ verifyLocksCount(128, false); ++ verifyLocksCount(1, true); ++ verifyLocksCount(64, true); ++ verifyLocksCount(128, true); ++ } ++ ++ private void verifyLocksCount(int incrRate, boolean useStackLock) ++ throws Throwable{ ++ CompilableTest test = new Test(); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ test, ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ useStackLock), ++ CommandLineOptionTest.prepareNumericFlag( ++ "RTMTotalCountIncrRate", incrRate), ++ "-XX:RTMRetryCount=0", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ Test.class.getName(), ++ Boolean.toString(!useStackLock) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ test.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 1, "VM output should contain " ++ + "exactly one RTM locking statistics entry for method " ++ + test.getMethodWithLockName()); ++ ++ RTMLockingStatistics lock = statistics.get(0); ++ if (incrRate == 1) { ++ Asserts.assertEQ(lock.getTotalLocks(), Test.TOTAL_ITERATIONS, ++ "Total locks should be exactly the same as amount of " ++ + "iterations."); ++ } else { ++ Asserts.assertGT(lock.getTotalLocks(), 0L, "RTM statistics " ++ + "should contain information for at least on lock."); ++ } ++ } ++ ++ public static class Test implements CompilableTest { ++ private static final long TOTAL_ITERATIONS = 10000L; ++ private final Object monitor = new Object(); ++ // Following field have to be static in order to avoid escape analysis. ++ @SuppressWarnings("UnsuedDeclaration") ++ private static int field = 0; ++ ++ @Override ++ public String getMethodWithLockName() { ++ return this.getClass().getName() + "::lock"; ++ } ++ ++ @Override ++ public String[] getMethodsToCompileNames() { ++ return new String[] { ++ getMethodWithLockName() ++ }; ++ } ++ ++ public void lock() { ++ synchronized(monitor) { ++ Test.field++; ++ } ++ } ++ ++ /** ++ * Usage: ++ * Test <inflate monitor> ++ */ ++ public static void main(String args[]) throws Throwable { ++ Asserts.assertGTE(args.length, 1, "One argument required."); ++ Test test = new Test(); ++ ++ if (Boolean.valueOf(args[0])) { ++ AbortProvoker.inflateMonitor(test.monitor); ++ } ++ for (long i = 0L; i < Test.TOTAL_ITERATIONS; i++) { ++ test.lock(); ++ } ++ } ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestRTMTotalCountIncrRate().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestUseRTMAfterLockInflation.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestUseRTMAfterLockInflation.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,127 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that rtm locking is used for stack locks before ++ * inflation and after it used for inflated locks. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMAfterLockInflation ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMAfterLockInflation ++ */ ++ ++import java.util.List; ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that RTM is used after lock inflation by executing compiled ++ * method with RTM-based lock elision using stack lock first, then that lock ++ * is inflated and the same compiled method invoked again. ++ * ++ * Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times before ++ * lock inflation and the same amount of times after inflation. ++ * As a result total locks count should be equal to ++ * {@code 2*AbortProvoker.DEFAULT_ITERATIONS}. ++ * It is a pretty strict assertion which could fail if some retriable abort ++ * happened: it could be {@code AbortType.RETRIABLE} or ++ * {@code AbortType.MEM_CONFLICT}, but unfortunately abort can has both these ++ * reasons simultaneously. In order to avoid false negative failures related ++ * to incorrect aborts counting, -XX:RTMRetryCount=0 is used. ++ */ ++public class TestUseRTMAfterLockInflation extends CommandLineOptionTest { ++ private static final long EXPECTED_LOCKS ++ = 2L * AbortProvoker.DEFAULT_ITERATIONS; ++ ++ private TestUseRTMAfterLockInflation() { ++ super(new AndPredicate(new SupportedVM(), new SupportedCPU())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ AbortProvoker provoker = AbortType.XABORT.provoker(); ++ long totalLocksCount = 0; ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ provoker, ++ "-XX:+UseRTMForStackLocks", ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:RTMRetryCount=0", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ Test.class.getName(), ++ AbortType.XABORT.toString()); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 2, ++ "VM output should contain two rtm locking statistics entries " ++ + "for method " + provoker.getMethodWithLockName()); ++ ++ for (RTMLockingStatistics s : statistics) { ++ totalLocksCount += s.getTotalLocks(); ++ } ++ ++ Asserts.assertEQ(totalLocksCount, ++ TestUseRTMAfterLockInflation.EXPECTED_LOCKS, ++ "Total lock count should be greater or equal to " ++ + TestUseRTMAfterLockInflation.EXPECTED_LOCKS); ++ } ++ ++ public static class Test { ++ ++ /** ++ * Usage: ++ * Test <provoker type> ++ */ ++ public static void main(String args[]) throws Throwable { ++ Asserts.assertGT(args.length, 0, ++ "AbortType name is expected as first argument."); ++ ++ AbortProvoker provoker ++ = AbortType.lookup(Integer.valueOf(args[0])).provoker(); ++ for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) { ++ provoker.forceAbort(); ++ } ++ provoker.inflateMonitor(); ++ for (int i = 0; i < AbortProvoker.DEFAULT_ITERATIONS; i++) { ++ provoker.forceAbort(); ++ } ++ } ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMAfterLockInflation().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestUseRTMDeopt.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestUseRTMDeopt.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,88 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that UseRTMDeopt affects uncommon trap installation in ++ * copmpiled methods with synchronized block. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMDeopt ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMDeopt ++ */ ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that usage of UseRTMDeopt option affects uncommon traps usage ++ * for methods that use locking. ++ */ ++public class TestUseRTMDeopt extends CommandLineOptionTest { ++ private TestUseRTMDeopt() { ++ super(new AndPredicate(new SupportedVM(), new SupportedCPU())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ verifyUseRTMDeopt(false); ++ verifyUseRTMDeopt(true); ++ } ++ ++ private void verifyUseRTMDeopt(boolean useRTMDeopt) throws Throwable { ++ AbortProvoker provoker = AbortType.XABORT.provoker(); ++ String logFileName = String.format("rtm_%s_deopt.xml", ++ useRTMDeopt ? "use" : "no"); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ logFileName, ++ provoker, ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMDeopt", ++ useRTMDeopt), ++ AbortProvoker.class.getName(), ++ AbortType.XABORT.toString() ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ int expectedUncommonTraps = useRTMDeopt ? 1 : 0; ++ int installedUncommonTraps ++ = RTMTestBase.installedRTMStateChangeTraps(logFileName); ++ ++ Asserts.assertEQ(expectedUncommonTraps, installedUncommonTraps, ++ String.format("Expected to find %d uncommon traps " ++ + "installed with reason rtm_state_change.", ++ expectedUncommonTraps)); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMDeopt().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestUseRTMForInflatedLocks.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestUseRTMForInflatedLocks.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,92 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++/** ++ * @test ++ * @bug 8031320 ++ * @summary Verify that rtm locking is used for inflated locks. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMForInflatedLocks ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMForInflatedLocks ++ */ ++ ++import java.util.List; ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that RTM-based lock elision could be used for inflated locks ++ * by calling compiled method that use RTM-based lock elision and using ++ * manually inflated lock. ++ * Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times, ++ * so total locks count should be the same. ++ * This test could also be affected by retriable aborts, so -XX:RTMRetryCount=0 ++ * is used. For more information abort that issue see ++ * {@link TestUseRTMAfterLockInflation}. ++ */ ++public class TestUseRTMForInflatedLocks extends CommandLineOptionTest { ++ private TestUseRTMForInflatedLocks() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ AbortProvoker provoker = AbortType.XABORT.provoker(); ++ RTMLockingStatistics lock; ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ provoker, ++ "-XX:-UseRTMForStackLocks", ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:RTMRetryCount=0", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ AbortProvoker.class.getName(), ++ AbortType.XABORT.toString()); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 1, ++ "VM output should contain exactly one rtm locking statistics " ++ + "entry for method " + provoker.getMethodWithLockName()); ++ ++ lock = statistics.get(0); ++ Asserts.assertEQ(lock.getTotalLocks(), AbortProvoker.DEFAULT_ITERATIONS, ++ "Total lock count should be greater or equal to " ++ + AbortProvoker.DEFAULT_ITERATIONS); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMForInflatedLocks().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestUseRTMForStackLocks.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestUseRTMForStackLocks.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,95 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that rtm locking is used for stack locks. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMForStackLocks ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMForStackLocks ++ */ ++ ++import java.util.List; ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that RTM-based lock elision could be used for stack locks ++ * by calling compiled method that use RTM-based lock elision and using ++ * stack lock. ++ * Compiled method invoked {@code AbortProvoker.DEFAULT_ITERATIONS} times, ++ * so total locks count should be the same. ++ * This test could also be affected by retriable aborts, so -XX:RTMRetryCount=0 ++ * is used. For more information abort that issue see ++ * {@link TestUseRTMAfterLockInflation}. ++ */ ++public class TestUseRTMForStackLocks extends CommandLineOptionTest { ++ private static final boolean INFLATE_MONITOR = false; ++ ++ private TestUseRTMForStackLocks() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ AbortProvoker provoker = AbortType.XABORT.provoker(); ++ RTMLockingStatistics lock; ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ provoker, ++ "-XX:+UseRTMForStackLocks", ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:RTMRetryCount=0", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ AbortProvoker.class.getName(), ++ AbortType.XABORT.toString(), ++ Boolean.toString(TestUseRTMForStackLocks.INFLATE_MONITOR)); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 1, ++ "VM output should contain exactly one rtm locking statistics " ++ + "entry for method " + provoker.getMethodWithLockName()); ++ ++ lock = statistics.get(0); ++ Asserts.assertEQ(lock.getTotalLocks(), AbortProvoker.DEFAULT_ITERATIONS, ++ "Total locks count should be greater or equal to " ++ + AbortProvoker.DEFAULT_ITERATIONS); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMForStackLocks().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/locking/TestUseRTMXendForLockBusy.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/locking/TestUseRTMXendForLockBusy.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 8031320 ++ * @summary Verify that UseRTMXendForLockBusy option affects ++ * method behaviour if lock is busy. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMXendForLockBusy ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMXendForLockBusy ++ */ ++ ++import java.util.List; ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that with +UseRTMXendForLockBusy there will be no aborts ++ * forced by the test. ++ */ ++public class TestUseRTMXendForLockBusy extends CommandLineOptionTest { ++ private final static int LOCKING_TIME = 5000; ++ ++ private TestUseRTMXendForLockBusy() { ++ super(new AndPredicate(new SupportedVM(), new SupportedCPU())); ++ } ++ ++ @Override ++ protected void runTestCases() throws Throwable { ++ // inflated lock, xabort on lock busy ++ verifyXendForLockBusy(true, false); ++ // inflated lock, xend on lock busy ++ verifyXendForLockBusy(true, true); ++ // stack lock, xabort on lock busy ++ verifyXendForLockBusy(false, false); ++ // stack lock, xend on lock busy ++ verifyXendForLockBusy(false, true); ++ } ++ ++ private void verifyXendForLockBusy(boolean inflateMonitor, ++ boolean useXend) throws Throwable { ++ CompilableTest test = new BusyLock(); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ test, ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ inflateMonitor), ++ CommandLineOptionTest.prepareBooleanFlag( ++ "UseRTMXendForLockBusy", ++ useXend), ++ "-XX:RTMRetryCount=0", ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ BusyLock.class.getName(), ++ Boolean.toString(inflateMonitor), ++ Integer.toString(TestUseRTMXendForLockBusy.LOCKING_TIME) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ test.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 1, "VM output should contain " ++ + "exactly one rtm locking statistics entry for method " ++ + test.getMethodWithLockName()); ++ ++ long aborts = statistics.get(0).getAborts(AbortType.XABORT); ++ ++ if (useXend) { ++ Asserts.assertEQ(aborts, 0L, ++ "Expected to get no aborts on busy lock"); ++ } else { ++ Asserts.assertGT(aborts, 0L, ++ "Expected to get at least one abort on busy lock"); ++ } ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMXendForLockBusy().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/method_options/TestNoRTMLockElidingOption.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/method_options/TestNoRTMLockElidingOption.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,102 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that NoRTMLockEliding option could be applied to ++ * specified method and that such method will not use rtm. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestNoRTMLockElidingOption ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestNoRTMLockElidingOption ++ */ ++ ++import java.util.List; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that method tagged with option NoRTMLockElidingOption ++ * will not use RTM-based lock elision. ++ * Test invokes compiled method and checks that no deoptimization with ++ * rtm_state_change reason had happened and that that VM output ++ * does not contain RTM locking statistics for compiled method. ++ */ ++public class TestNoRTMLockElidingOption extends CommandLineOptionTest { ++ private TestNoRTMLockElidingOption() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ verifyOption(false); ++ verifyOption(true); ++ } ++ ++ public void verifyOption(boolean useStackLock) throws Throwable { ++ AbortProvoker provoker = AbortType.XABORT.provoker(); ++ String logFileName = String.format("rtm_deopt_%s_stack_lock.xml", ++ (useStackLock ? "use" : "no")); ++ String methodOption = String.format("-XX:CompileCommand=option," + ++ "%s,NoRTMLockEliding", provoker.getMethodWithLockName()); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ logFileName, ++ provoker, ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ useStackLock), ++ methodOption, ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:+UseRTMDeopt", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ AbortProvoker.class.getName(), ++ AbortType.XABORT.toString(), ++ Boolean.toString(!useStackLock) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName); ++ ++ Asserts.assertEQ(firedTraps, 0, ++ "No deoptimizations with rtm_state_change reason are expected"); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 0, ++ "VM output should not contain RTM locking statistics entries " ++ + "for method " + provoker.getMethodWithLockName()); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestNoRTMLockElidingOption().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/method_options/TestUseRTMLockElidingOption.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/method_options/TestUseRTMLockElidingOption.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,116 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that UseRTMLockEliding option could be applied to ++ * specified method and that such method will not be deoptimized ++ * on high abort ratio. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestUseRTMLockElidingOption ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestUseRTMLockElidingOption ++ */ ++ ++import java.util.List; ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that method tagged with option UseRTMLockElidingOption ++ * will use RTM-based lock elision, but will be never deoptimized with ++ * rtm_state_change reason. ++ * Test invokes compiled method and checks that no deoptimization with ++ * rtm_state_change reason had happened and that that VM output ++ * contains RTM locking statistics for compiled method and that total locks ++ * count equals to method's invocations. ++ * Since last assert is pretty strict, test uses -XX:RTMRetryCount=0 in order ++ * to avoid issue with retriable aborts described in ++ * {@link TestUseRTMAfterLockInflation}. ++ */ ++public class TestUseRTMLockElidingOption extends CommandLineOptionTest { ++ private TestUseRTMLockElidingOption() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ verifyOption(false); ++ verifyOption(true); ++ } ++ ++ public void verifyOption(boolean useStackLock) throws Throwable { ++ AbortProvoker provoker = AbortType.XABORT.provoker(); ++ String logFileName = String.format("rtm_deopt_%s_stack_lock.xml", ++ (useStackLock ? "use" : "no")); ++ String methodOption = String.format("-XX:CompileCommand=option," + ++ "%s,UseRTMLockEliding", provoker.getMethodWithLockName()); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ logFileName, ++ provoker, ++ CommandLineOptionTest.prepareBooleanFlag("UseRTMForStackLocks", ++ useStackLock), ++ methodOption, ++ "-XX:RTMTotalCountIncrRate=1", ++ "-XX:RTMRetryCount=0", ++ "-XX:+UseRTMDeopt", ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ provoker.getClass().getName(), ++ AbortType.XABORT.toString(), ++ Boolean.toString(!useStackLock) ++ ); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ int firedTraps = RTMTestBase.firedRTMStateChangeTraps(logFileName); ++ ++ Asserts.assertEQ(firedTraps, 0, ++ "Method deoptimization with rtm_state_change is unexpected"); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ provoker.getMethodWithLockName(), outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 1, ++ "VM output should contain exactly one RTM locking " ++ + "statistics entry for method " ++ + provoker.getMethodWithLockName()); ++ ++ RTMLockingStatistics lock = statistics.get(0); ++ ++ Asserts.assertEQ(lock.getTotalLocks(), AbortProvoker.DEFAULT_ITERATIONS, ++ "Expected to get total locks count equal to total amount of " ++ + "lock attempts."); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestUseRTMLockElidingOption().test(); ++ } ++} +--- ./hotspot/test/compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/rtm/print/TestPrintPreciseRTMLockingStatistics.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,142 @@ ++/* ++ * 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 8031320 ++ * @summary Verify that rtm locking statistics contain proper information ++ * on overall aborts and locks count and count of aborts of ++ * different types. Test also verify that VM output does not ++ * contain rtm locking statistics when it should not. ++ * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary ++ * @build TestPrintPreciseRTMLockingStatistics ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions ++ * -XX:+WhiteBoxAPI TestPrintPreciseRTMLockingStatistics ++ */ ++ ++import java.util.*; ++ ++import com.oracle.java.testlibrary.*; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++import com.oracle.java.testlibrary.cli.predicate.AndPredicate; ++import rtm.*; ++import rtm.predicate.SupportedCPU; ++import rtm.predicate.SupportedVM; ++ ++/** ++ * Test verifies that VM output does not contain RTM locking statistics when it ++ * should not (when PrintPreciseRTMLockingStatistics is off) and that with ++ * -XX:+PrintPreciseRTMLockingStatistics locking statistics contains sane ++ * total locks and aborts count as well as for specific abort types. ++ */ ++public class TestPrintPreciseRTMLockingStatistics ++ extends CommandLineOptionTest { ++ private TestPrintPreciseRTMLockingStatistics() { ++ super(new AndPredicate(new SupportedCPU(), new SupportedVM())); ++ } ++ ++ @Override ++ public void runTestCases() throws Throwable { ++ verifyNoStatistics(); ++ verifyStatistics(); ++ } ++ ++ // verify that VM output does not contain ++ // rtm locking statistics ++ private void verifyNoStatistics() throws Throwable { ++ verifyNoStatistics(AbortType.XABORT); ++ ++ verifyNoStatistics(AbortType.XABORT, ++ "-XX:-PrintPreciseRTMLockingStatistics"); ++ ++ verifyNoStatistics(AbortType.XABORT, "-XX:-UseRTMLocking", ++ "-XX:+PrintPreciseRTMLockingStatistics"); ++ } ++ ++ // verify that rtm locking statistics contain information ++ // about each type of aborts ++ private void verifyStatistics() throws Throwable { ++ verifyAbortsCount(AbortType.XABORT); ++ verifyAbortsCount(AbortType.MEM_CONFLICT); ++ verifyAbortsCount(AbortType.BUF_OVERFLOW); ++ verifyAbortsCount(AbortType.NESTED_ABORT); ++ } ++ ++ private void verifyNoStatistics(AbortType abortProvokerType, ++ String... vmOpts) throws Throwable { ++ AbortProvoker provoker = abortProvokerType.provoker(); ++ List finalVMOpts = new LinkedList<>(); ++ Collections.addAll(finalVMOpts, vmOpts); ++ Collections.addAll(finalVMOpts, AbortProvoker.class.getName(), ++ abortProvokerType.toString()); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest(provoker, ++ finalVMOpts.toArray(new String[finalVMOpts.size()])); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ outputAnalyzer.getOutput()); ++ ++ Asserts.assertEQ(statistics.size(), 0, "VM output should not contain " ++ + "any RTM locking statistics"); ++ } ++ ++ private void verifyAbortsCount(AbortType abortType) throws Throwable { ++ AbortProvoker provoker = abortType.provoker(); ++ ++ OutputAnalyzer outputAnalyzer = RTMTestBase.executeRTMTest( ++ provoker, ++ "-XX:+PrintPreciseRTMLockingStatistics", ++ AbortProvoker.class.getName(), ++ abortType.toString()); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ ++ List statistics = RTMLockingStatistics.fromString( ++ provoker.getMethodWithLockName(),outputAnalyzer.getOutput()); ++ ++ Asserts.assertGT(statistics.size(), 0, "VM output should contain one " ++ + "rtm locking statistics entry for method " ++ + provoker.getMethodWithLockName()); ++ ++ RTMLockingStatistics lock = statistics.get(0); ++ ++ Asserts.assertGT(lock.getTotalLocks(), 0L, "RTM locking statistics " ++ + "should contain non zero total locks count"); ++ ++ Asserts.assertGT(lock.getTotalAborts(), 0L, ++ "RTM locking statistics should contain non zero total aborts " ++ + "count"); ++ ++ Asserts.assertGT(lock.getAborts(abortType), 0L, String.format( ++ "RTM locking statistics should contain non zero aborts count " ++ + "for abort reason %s", abortType)); ++ } ++ ++ public static void main(String args[]) throws Throwable { ++ new TestPrintPreciseRTMLockingStatistics().test(); ++ } ++} +--- ./hotspot/test/compiler/stable/StableConfiguration.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/StableConfiguration.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,62 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.Method; ++import java.util.Properties; ++import sun.hotspot.WhiteBox; ++ ++public class StableConfiguration { ++ static final WhiteBox WB = WhiteBox.getWhiteBox(); ++ static final boolean isStableEnabled; ++ static final boolean isServerWithStable; ++ ++ static { ++ Boolean value = WB.getBooleanVMFlag("FoldStableValues"); ++ isStableEnabled = (value == null ? false : value); ++ isServerWithStable = isStableEnabled && get(); ++ System.out.println("@Stable: " + (isStableEnabled ? "enabled" : "disabled")); ++ System.out.println("Server Compiler: " + get()); ++ } ++ ++ // ::get() is among immediately compiled methods. ++ static boolean get() { ++ try { ++ Method m = StableConfiguration.class.getDeclaredMethod("get"); ++ int level = WB.getMethodCompilationLevel(m); ++ if (level > 0) { ++ return (level == 4); ++ } else { ++ String javaVM = System.getProperty("java.vm.name", ""); ++ if (javaVM.contains("Server")) return true; ++ if (javaVM.contains("Client")) return false; ++ throw new Error("Unknown VM type: "+javaVM); ++ } ++ } catch (NoSuchMethodException e) { ++ throw new Error(e); ++ } ++ } ++ ++} +--- ./hotspot/test/compiler/stable/TestStableBoolean.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/TestStableBoolean.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,645 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestStableBoolean ++ * @summary tests on stable fields and arrays ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestStableBoolean StableConfiguration sun.hotspot.WhiteBox ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission ++ * @run main ClassFileInstaller ++ * java/lang/invoke/StableConfiguration ++ * java/lang/invoke/TestStableBoolean ++ * java/lang/invoke/TestStableBoolean$BooleanStable ++ * java/lang/invoke/TestStableBoolean$StaticBooleanStable ++ * java/lang/invoke/TestStableBoolean$VolatileBooleanStable ++ * java/lang/invoke/TestStableBoolean$BooleanArrayDim1 ++ * java/lang/invoke/TestStableBoolean$BooleanArrayDim2 ++ * java/lang/invoke/TestStableBoolean$BooleanArrayDim3 ++ * java/lang/invoke/TestStableBoolean$BooleanArrayDim4 ++ * java/lang/invoke/TestStableBoolean$ObjectArrayLowerDim0 ++ * java/lang/invoke/TestStableBoolean$ObjectArrayLowerDim1 ++ * java/lang/invoke/TestStableBoolean$NestedStableField ++ * java/lang/invoke/TestStableBoolean$NestedStableField$A ++ * java/lang/invoke/TestStableBoolean$NestedStableField1 ++ * java/lang/invoke/TestStableBoolean$NestedStableField1$A ++ * java/lang/invoke/TestStableBoolean$NestedStableField2 ++ * java/lang/invoke/TestStableBoolean$NestedStableField2$A ++ * java/lang/invoke/TestStableBoolean$NestedStableField3 ++ * java/lang/invoke/TestStableBoolean$NestedStableField3$A ++ * java/lang/invoke/TestStableBoolean$DefaultValue ++ * java/lang/invoke/TestStableBoolean$DefaultStaticValue ++ * java/lang/invoke/TestStableBoolean$ObjectArrayLowerDim2 ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableBoolean ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableBoolean ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableBoolean ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableBoolean ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableBoolean ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableBoolean ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.InvocationTargetException; ++ ++public class TestStableBoolean { ++ static final boolean isStableEnabled = StableConfiguration.isStableEnabled; ++ static final boolean isServerWithStable = StableConfiguration.isServerWithStable; ++ ++ public static void main(String[] args) throws Exception { ++ run(DefaultValue.class); ++ run(BooleanStable.class); ++ run(DefaultStaticValue.class); ++ run(StaticBooleanStable.class); ++ run(VolatileBooleanStable.class); ++ ++ // @Stable arrays: Dim 1-4 ++ run(BooleanArrayDim1.class); ++ run(BooleanArrayDim2.class); ++ run(BooleanArrayDim3.class); ++ run(BooleanArrayDim4.class); ++ ++ // @Stable Object field: dynamic arrays ++ run(ObjectArrayLowerDim0.class); ++ run(ObjectArrayLowerDim1.class); ++ run(ObjectArrayLowerDim2.class); ++ ++ // Nested @Stable fields ++ run(NestedStableField.class); ++ run(NestedStableField1.class); ++ run(NestedStableField2.class); ++ run(NestedStableField3.class); ++ ++ if (failed) { ++ throw new Error("TEST FAILED"); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultValue { ++ public @Stable boolean v; ++ ++ public static final DefaultValue c = new DefaultValue(); ++ public static boolean get() { return c.v; } ++ public static void test() throws Exception { ++ boolean val1 = get(); ++ c.v = true; boolean val2 = get(); ++ assertEquals(val1, false); ++ assertEquals(val2, true); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class BooleanStable { ++ public @Stable boolean v; ++ ++ public static final BooleanStable c = new BooleanStable(); ++ public static boolean get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = true; boolean val1 = get(); ++ c.v = false; boolean val2 = get(); ++ assertEquals(val1, true); ++ assertEquals(val2, (isStableEnabled ? true : false)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultStaticValue { ++ public static @Stable boolean v; ++ ++ public static final DefaultStaticValue c = new DefaultStaticValue(); ++ public static boolean get() { return c.v; } ++ public static void test() throws Exception { ++ boolean val1 = get(); ++ c.v = true; boolean val2 = get(); ++ assertEquals(val1, false); ++ assertEquals(val2, true); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class StaticBooleanStable { ++ public static @Stable boolean v; ++ ++ public static final StaticBooleanStable c = new StaticBooleanStable(); ++ public static boolean get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = true; boolean val1 = get(); ++ c.v = false; boolean val2 = get(); ++ assertEquals(val1, true); ++ assertEquals(val2, (isStableEnabled ? true : false)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class VolatileBooleanStable { ++ public @Stable volatile boolean v; ++ ++ public static final VolatileBooleanStable c = new VolatileBooleanStable(); ++ public static boolean get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = true; boolean val1 = get(); ++ c.v = false; boolean val2 = get(); ++ assertEquals(val1, true); ++ assertEquals(val2, (isStableEnabled ? true : false)); ++ } ++ } ++ ++ /* ==================================================== */ ++ // @Stable array == field && all components are stable ++ ++ static class BooleanArrayDim1 { ++ public @Stable boolean[] v; ++ ++ public static final BooleanArrayDim1 c = new BooleanArrayDim1(); ++ public static boolean get() { return c.v[0]; } ++ public static boolean get1() { return c.v[10]; } ++ public static boolean[] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new boolean[1]; c.v[0] = true; boolean val1 = get(); ++ c.v[0] = false; boolean val2 = get(); ++ assertEquals(val1, true); ++ assertEquals(val2, (isServerWithStable ? true : false)); ++ } ++ ++ { ++ c.v = new boolean[20]; c.v[10] = true; boolean val1 = get1(); ++ c.v[10] = false; boolean val2 = get1(); ++ assertEquals(val1, true); ++ assertEquals(val2, (isServerWithStable ? true : false)); ++ } ++ ++ { ++ c.v = new boolean[1]; boolean[] val1 = get2(); ++ c.v = new boolean[1]; boolean[] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class BooleanArrayDim2 { ++ public @Stable boolean[][] v; ++ ++ public static final BooleanArrayDim2 c = new BooleanArrayDim2(); ++ public static boolean get() { return c.v[0][0]; } ++ public static boolean[] get1() { return c.v[0]; } ++ public static boolean[][] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new boolean[1][1]; c.v[0][0] = true; boolean val1 = get(); ++ c.v[0][0] = false; boolean val2 = get(); ++ assertEquals(val1, true); ++ assertEquals(val2, (isServerWithStable ? true : false)); ++ ++ c.v = new boolean[1][1]; c.v[0][0] = false; boolean val3 = get(); ++ assertEquals(val3, (isServerWithStable ? true : false)); ++ ++ c.v[0] = new boolean[1]; c.v[0][0] = false; boolean val4 = get(); ++ assertEquals(val4, (isServerWithStable ? true : false)); ++ } ++ ++ { ++ c.v = new boolean[1][1]; boolean[] val1 = get1(); ++ c.v[0] = new boolean[1]; boolean[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new boolean[1][1]; boolean[][] val1 = get2(); ++ c.v = new boolean[1][1]; boolean[][] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class BooleanArrayDim3 { ++ public @Stable boolean[][][] v; ++ ++ public static final BooleanArrayDim3 c = new BooleanArrayDim3(); ++ public static boolean get() { return c.v[0][0][0]; } ++ public static boolean[] get1() { return c.v[0][0]; } ++ public static boolean[][] get2() { return c.v[0]; } ++ public static boolean[][][] get3() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new boolean[1][1][1]; c.v[0][0][0] = true; boolean val1 = get(); ++ c.v[0][0][0] = false; boolean val2 = get(); ++ assertEquals(val1, true); ++ assertEquals(val2, (isServerWithStable ? true : false)); ++ ++ c.v = new boolean[1][1][1]; c.v[0][0][0] = false; boolean val3 = get(); ++ assertEquals(val3, (isServerWithStable ? true : false)); ++ ++ c.v[0] = new boolean[1][1]; c.v[0][0][0] = false; boolean val4 = get(); ++ assertEquals(val4, (isServerWithStable ? true : false)); ++ ++ c.v[0][0] = new boolean[1]; c.v[0][0][0] = false; boolean val5 = get(); ++ assertEquals(val5, (isServerWithStable ? true : false)); ++ } ++ ++ { ++ c.v = new boolean[1][1][1]; boolean[] val1 = get1(); ++ c.v[0][0] = new boolean[1]; boolean[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new boolean[1][1][1]; boolean[][] val1 = get2(); ++ c.v[0] = new boolean[1][1]; boolean[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new boolean[1][1][1]; boolean[][][] val1 = get3(); ++ c.v = new boolean[1][1][1]; boolean[][][] val2 = get3(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class BooleanArrayDim4 { ++ public @Stable boolean[][][][] v; ++ ++ public static final BooleanArrayDim4 c = new BooleanArrayDim4(); ++ public static boolean get() { return c.v[0][0][0][0]; } ++ public static boolean[] get1() { return c.v[0][0][0]; } ++ public static boolean[][] get2() { return c.v[0][0]; } ++ public static boolean[][][] get3() { return c.v[0]; } ++ public static boolean[][][][] get4() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new boolean[1][1][1][1]; c.v[0][0][0][0] = true; boolean val1 = get(); ++ c.v[0][0][0][0] = false; boolean val2 = get(); ++ assertEquals(val1, true); ++ assertEquals(val2, (isServerWithStable ? true : false)); ++ ++ c.v = new boolean[1][1][1][1]; c.v[0][0][0][0] = false; boolean val3 = get(); ++ assertEquals(val3, (isServerWithStable ? true : false)); ++ ++ c.v[0] = new boolean[1][1][1]; c.v[0][0][0][0] = false; boolean val4 = get(); ++ assertEquals(val4, (isServerWithStable ? true : false)); ++ ++ c.v[0][0] = new boolean[1][1]; c.v[0][0][0][0] = false; boolean val5 = get(); ++ assertEquals(val5, (isServerWithStable ? true : false)); ++ ++ c.v[0][0][0] = new boolean[1]; c.v[0][0][0][0] = false; boolean val6 = get(); ++ assertEquals(val6, (isServerWithStable ? true : false)); ++ } ++ ++ { ++ c.v = new boolean[1][1][1][1]; boolean[] val1 = get1(); ++ c.v[0][0][0] = new boolean[1]; boolean[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new boolean[1][1][1][1]; boolean[][] val1 = get2(); ++ c.v[0][0] = new boolean[1][1]; boolean[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new boolean[1][1][1][1]; boolean[][][] val1 = get3(); ++ c.v[0] = new boolean[1][1][1]; boolean[][][] val2 = get3(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new boolean[1][1][1][1]; boolean[][][][] val1 = get4(); ++ c.v = new boolean[1][1][1][1]; boolean[][][][] val2 = get4(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ } ++ } ++ ++ /* ==================================================== */ ++ // Dynamic Dim is higher than static ++ ++ static class ObjectArrayLowerDim0 { ++ public @Stable Object v; ++ ++ public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); ++ public static boolean get() { return ((boolean[])c.v)[0]; } ++ public static boolean[] get1() { return (boolean[])c.v; } ++ public static boolean[] get2() { return (boolean[])c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new boolean[1]; ((boolean[])c.v)[0] = true; boolean val1 = get(); ++ ((boolean[])c.v)[0] = false; boolean val2 = get(); ++ ++ assertEquals(val1, true); ++ assertEquals(val2, false); ++ } ++ ++ { ++ c.v = new boolean[1]; boolean[] val1 = get1(); ++ c.v = new boolean[1]; boolean[] val2 = get1(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); ++ public static boolean get() { return ((boolean[][])c.v)[0][0]; } ++ public static boolean[] get1() { return (boolean[])(c.v[0]); } ++ public static Object[] get2() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new boolean[1][1]; ((boolean[][])c.v)[0][0] = true; boolean val1 = get(); ++ ((boolean[][])c.v)[0][0] = false; boolean val2 = get(); ++ ++ assertEquals(val1, true); ++ assertEquals(val2, false); ++ } ++ ++ { ++ c.v = new boolean[1][1]; c.v[0] = new boolean[0]; boolean[] val1 = get1(); ++ c.v[0] = new boolean[0]; boolean[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new boolean[0][0]; Object[] val1 = get2(); ++ c.v = new boolean[0][0]; Object[] val2 = get2(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); ++ public static boolean get() { return ((boolean[][][])c.v)[0][0][0]; } ++ public static boolean[] get1() { return (boolean[])(c.v[0][0]); } ++ public static boolean[][] get2() { return (boolean[][])(c.v[0]); } ++ public static Object[][] get3() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new boolean[1][1][1]; ((boolean[][][])c.v)[0][0][0] = true; boolean val1 = get(); ++ ((boolean[][][])c.v)[0][0][0] = false; boolean val2 = get(); ++ ++ assertEquals(val1, true); ++ assertEquals(val2, false); ++ } ++ ++ { ++ c.v = new boolean[1][1][1]; c.v[0][0] = new boolean[0]; boolean[] val1 = get1(); ++ c.v[0][0] = new boolean[0]; boolean[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new boolean[1][1][1]; c.v[0] = new boolean[0][0]; boolean[][] val1 = get2(); ++ c.v[0] = new boolean[0][0]; boolean[][] val2 = get2(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new boolean[0][0][0]; Object[][] val1 = get3(); ++ c.v = new boolean[0][0][0]; Object[][] val2 = get3(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField { ++ static class A { ++ public @Stable boolean a; ++ ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField c = new NestedStableField(); ++ public static A get() { return c.v; } ++ public static boolean get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.a = true; A val1 = get(); ++ c.v.a = false; A val2 = get(); ++ ++ assertEquals(val1.a, false); ++ assertEquals(val2.a, false); ++ } ++ ++ { ++ c.v = new A(); c.v.a = true; boolean val1 = get1(); ++ c.v.a = false; boolean val2 = get1(); ++ c.v = new A(); c.v.a = false; boolean val3 = get1(); ++ ++ assertEquals(val1, true); ++ assertEquals(val2, (isStableEnabled ? true : false)); ++ assertEquals(val3, (isStableEnabled ? true : false)); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField1 { ++ static class A { ++ public @Stable boolean a; ++ public @Stable A next; ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField1 c = new NestedStableField1(); ++ public static A get() { return c.v.next.next.next.next.next.next.next; } ++ public static boolean get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; ++ c.v.a = true; c.v.next.a = true; A val1 = get(); ++ c.v.a = false; c.v.next.a = false; A val2 = get(); ++ ++ assertEquals(val1.a, false); ++ assertEquals(val2.a, false); ++ } ++ ++ { ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = true; boolean val1 = get1(); ++ c.v.a = false; boolean val2 = get1(); ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = false; boolean val3 = get1(); ++ ++ assertEquals(val1, true); ++ assertEquals(val2, (isStableEnabled ? true : false)); ++ assertEquals(val3, (isStableEnabled ? true : false)); ++ } ++ } ++ } ++ /* ==================================================== */ ++ ++ static class NestedStableField2 { ++ static class A { ++ public @Stable boolean a; ++ public @Stable A left; ++ public A right; ++ } ++ ++ public @Stable A v; ++ ++ public static final NestedStableField2 c = new NestedStableField2(); ++ public static boolean get() { return c.v.left.left.left.a; } ++ public static boolean get1() { return c.v.left.left.right.left.a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.left = c.v.right = c.v; ++ c.v.a = true; boolean val1 = get(); boolean val2 = get1(); ++ c.v.a = false; boolean val3 = get(); boolean val4 = get1(); ++ ++ assertEquals(val1, true); ++ assertEquals(val3, (isStableEnabled ? true : false)); ++ ++ assertEquals(val2, true); ++ assertEquals(val4, false); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField3 { ++ static class A { ++ public @Stable boolean a; ++ public @Stable A[] left; ++ public A[] right; ++ } ++ ++ public @Stable A[] v; ++ ++ public static final NestedStableField3 c = new NestedStableField3(); ++ public static boolean get() { return c.v[0].left[1].left[0].left[1].a; } ++ public static boolean get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } ++ ++ public static void test() throws Exception { ++ { ++ A elem = new A(); ++ c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; ++ elem.a = true; boolean val1 = get(); boolean val2 = get1(); ++ elem.a = false; boolean val3 = get(); boolean val4 = get1(); ++ ++ assertEquals(val1, true); ++ assertEquals(val3, (isServerWithStable ? true : false)); ++ ++ assertEquals(val2, true); ++ assertEquals(val4, false); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Auxiliary methods ++ static void assertEquals(boolean i, boolean j) { if (i != j) throw new AssertionError(i + " != " + j); } ++ static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } ++ ++ static boolean failed = false; ++ ++ public static void run(Class test) { ++ Throwable ex = null; ++ System.out.print(test.getName()+": "); ++ try { ++ test.getMethod("test").invoke(null); ++ } catch (InvocationTargetException e) { ++ ex = e.getCause(); ++ } catch (Throwable e) { ++ ex = e; ++ } finally { ++ if (ex == null) { ++ System.out.println("PASSED"); ++ } else { ++ failed = true; ++ System.out.println("FAILED"); ++ ex.printStackTrace(System.out); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/stable/TestStableByte.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/TestStableByte.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,661 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestStableByte ++ * @summary tests on stable fields and arrays ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestStableByte StableConfiguration sun.hotspot.WhiteBox ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission ++ * @run main ClassFileInstaller ++ * java/lang/invoke/StableConfiguration ++ * java/lang/invoke/TestStableByte ++ * java/lang/invoke/TestStableByte$ByteStable ++ * java/lang/invoke/TestStableByte$StaticByteStable ++ * java/lang/invoke/TestStableByte$VolatileByteStable ++ * java/lang/invoke/TestStableByte$ByteArrayDim1 ++ * java/lang/invoke/TestStableByte$ByteArrayDim2 ++ * java/lang/invoke/TestStableByte$ByteArrayDim3 ++ * java/lang/invoke/TestStableByte$ByteArrayDim4 ++ * java/lang/invoke/TestStableByte$ObjectArrayLowerDim0 ++ * java/lang/invoke/TestStableByte$ObjectArrayLowerDim1 ++ * java/lang/invoke/TestStableByte$NestedStableField ++ * java/lang/invoke/TestStableByte$NestedStableField$A ++ * java/lang/invoke/TestStableByte$NestedStableField1 ++ * java/lang/invoke/TestStableByte$NestedStableField1$A ++ * java/lang/invoke/TestStableByte$NestedStableField2 ++ * java/lang/invoke/TestStableByte$NestedStableField2$A ++ * java/lang/invoke/TestStableByte$NestedStableField3 ++ * java/lang/invoke/TestStableByte$NestedStableField3$A ++ * java/lang/invoke/TestStableByte$DefaultValue ++ * java/lang/invoke/TestStableByte$DefaultStaticValue ++ * java/lang/invoke/TestStableByte$ObjectArrayLowerDim2 ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableByte ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableByte ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableByte ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableByte ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableByte ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableByte ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.InvocationTargetException; ++ ++public class TestStableByte { ++ static final boolean isStableEnabled = StableConfiguration.isStableEnabled; ++ static final boolean isServerWithStable = StableConfiguration.isServerWithStable; ++ ++ public static void main(String[] args) throws Exception { ++ run(DefaultValue.class); ++ run(ByteStable.class); ++ run(DefaultStaticValue.class); ++ run(StaticByteStable.class); ++ run(VolatileByteStable.class); ++ ++ // @Stable arrays: Dim 1-4 ++ run(ByteArrayDim1.class); ++ run(ByteArrayDim2.class); ++ run(ByteArrayDim3.class); ++ run(ByteArrayDim4.class); ++ ++ // @Stable Object field: dynamic arrays ++ run(ObjectArrayLowerDim0.class); ++ run(ObjectArrayLowerDim1.class); ++ run(ObjectArrayLowerDim2.class); ++ ++ // Nested @Stable fields ++ run(NestedStableField.class); ++ run(NestedStableField1.class); ++ run(NestedStableField2.class); ++ run(NestedStableField3.class); ++ ++ if (failed) { ++ throw new Error("TEST FAILED"); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultValue { ++ public @Stable byte v; ++ ++ public static final DefaultValue c = new DefaultValue(); ++ public static byte get() { return c.v; } ++ public static void test() throws Exception { ++ byte val1 = get(); ++ c.v = 1; byte val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ByteStable { ++ public @Stable byte v; ++ ++ public static final ByteStable c = new ByteStable(); ++ public static byte get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 5; byte val1 = get(); ++ c.v = 127; byte val2 = get(); ++ assertEquals(val1, 5); ++ assertEquals(val2, (isStableEnabled ? 5 : 127)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultStaticValue { ++ public static @Stable byte v; ++ ++ public static final DefaultStaticValue c = new DefaultStaticValue(); ++ public static byte get() { return c.v; } ++ public static void test() throws Exception { ++ byte val1 = get(); ++ c.v = 1; byte val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class StaticByteStable { ++ public static @Stable byte v; ++ ++ public static final StaticByteStable c = new StaticByteStable(); ++ public static byte get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 5; byte val1 = get(); ++ c.v = 127; byte val2 = get(); ++ assertEquals(val1, 5); ++ assertEquals(val2, (isStableEnabled ? 5 : 127)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class VolatileByteStable { ++ public @Stable volatile byte v; ++ ++ public static final VolatileByteStable c = new VolatileByteStable(); ++ public static byte get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 5; byte val1 = get(); ++ c.v = 127; byte val2 = get(); ++ assertEquals(val1, 5); ++ assertEquals(val2, (isStableEnabled ? 5 : 127)); ++ } ++ } ++ ++ /* ==================================================== */ ++ // @Stable array == field && all components are stable ++ ++ static class ByteArrayDim1 { ++ public @Stable byte[] v; ++ ++ public static final ByteArrayDim1 c = new ByteArrayDim1(); ++ public static byte get() { return c.v[0]; } ++ public static byte get1() { return c.v[10]; } ++ public static byte[] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new byte[1]; c.v[0] = 1; byte val1 = get(); ++ c.v[0] = 2; byte val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new byte[1]; c.v[0] = 3; byte val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ } ++ ++ { ++ c.v = new byte[20]; c.v[10] = 1; byte val1 = get1(); ++ c.v[10] = 2; byte val2 = get1(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new byte[20]; c.v[10] = 3; byte val3 = get1(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ } ++ ++ { ++ c.v = new byte[1]; byte[] val1 = get2(); ++ c.v = new byte[1]; byte[] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ByteArrayDim2 { ++ public @Stable byte[][] v; ++ ++ public static final ByteArrayDim2 c = new ByteArrayDim2(); ++ public static byte get() { return c.v[0][0]; } ++ public static byte[] get1() { return c.v[0]; } ++ public static byte[][] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new byte[1][1]; c.v[0][0] = 1; byte val1 = get(); ++ c.v[0][0] = 2; byte val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new byte[1][1]; c.v[0][0] = 3; byte val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new byte[1]; c.v[0][0] = 4; byte val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ } ++ ++ { ++ c.v = new byte[1][1]; byte[] val1 = get1(); ++ c.v[0] = new byte[1]; byte[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new byte[1][1]; byte[][] val1 = get2(); ++ c.v = new byte[1][1]; byte[][] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ByteArrayDim3 { ++ public @Stable byte[][][] v; ++ ++ public static final ByteArrayDim3 c = new ByteArrayDim3(); ++ public static byte get() { return c.v[0][0][0]; } ++ public static byte[] get1() { return c.v[0][0]; } ++ public static byte[][] get2() { return c.v[0]; } ++ public static byte[][][] get3() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new byte[1][1][1]; c.v[0][0][0] = 1; byte val1 = get(); ++ c.v[0][0][0] = 2; byte val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new byte[1][1][1]; c.v[0][0][0] = 3; byte val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new byte[1][1]; c.v[0][0][0] = 4; byte val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ ++ c.v[0][0] = new byte[1]; c.v[0][0][0] = 5; byte val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 5)); ++ } ++ ++ { ++ c.v = new byte[1][1][1]; byte[] val1 = get1(); ++ c.v[0][0] = new byte[1]; byte[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new byte[1][1][1]; byte[][] val1 = get2(); ++ c.v[0] = new byte[1][1]; byte[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new byte[1][1][1]; byte[][][] val1 = get3(); ++ c.v = new byte[1][1][1]; byte[][][] val2 = get3(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ByteArrayDim4 { ++ public @Stable byte[][][][] v; ++ ++ public static final ByteArrayDim4 c = new ByteArrayDim4(); ++ public static byte get() { return c.v[0][0][0][0]; } ++ public static byte[] get1() { return c.v[0][0][0]; } ++ public static byte[][] get2() { return c.v[0][0]; } ++ public static byte[][][] get3() { return c.v[0]; } ++ public static byte[][][][] get4() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new byte[1][1][1][1]; c.v[0][0][0][0] = 1; byte val1 = get(); ++ c.v[0][0][0][0] = 2; byte val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new byte[1][1][1][1]; c.v[0][0][0][0] = 3; byte val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new byte[1][1][1]; c.v[0][0][0][0] = 4; byte val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ ++ c.v[0][0] = new byte[1][1]; c.v[0][0][0][0] = 5; byte val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 5)); ++ ++ c.v[0][0][0] = new byte[1]; c.v[0][0][0][0] = 6; byte val6 = get(); ++ assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 6)); ++ } ++ ++ { ++ c.v = new byte[1][1][1][1]; byte[] val1 = get1(); ++ c.v[0][0][0] = new byte[1]; byte[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new byte[1][1][1][1]; byte[][] val1 = get2(); ++ c.v[0][0] = new byte[1][1]; byte[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new byte[1][1][1][1]; byte[][][] val1 = get3(); ++ c.v[0] = new byte[1][1][1]; byte[][][] val2 = get3(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new byte[1][1][1][1]; byte[][][][] val1 = get4(); ++ c.v = new byte[1][1][1][1]; byte[][][][] val2 = get4(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ } ++ } ++ ++ /* ==================================================== */ ++ // Dynamic Dim is higher than static ++ ++ static class ObjectArrayLowerDim0 { ++ public @Stable Object v; ++ ++ public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); ++ public static byte get() { return ((byte[])c.v)[0]; } ++ public static byte[] get1() { return (byte[])c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new byte[1]; ((byte[])c.v)[0] = 1; byte val1 = get(); ++ ((byte[])c.v)[0] = 2; byte val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new byte[1]; byte[] val1 = get1(); ++ c.v = new byte[1]; byte[] val2 = get1(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); ++ public static byte get() { return ((byte[][])c.v)[0][0]; } ++ public static byte[] get1() { return (byte[])(c.v[0]); } ++ public static Object[] get2() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new byte[1][1]; ((byte[][])c.v)[0][0] = 1; byte val1 = get(); ++ ((byte[][])c.v)[0][0] = 2; byte val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new byte[1][1]; c.v[0] = new byte[0]; byte[] val1 = get1(); ++ c.v[0] = new byte[0]; byte[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new byte[0][0]; Object[] val1 = get2(); ++ c.v = new byte[0][0]; Object[] val2 = get2(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); ++ public static byte get() { return ((byte[][][])c.v)[0][0][0]; } ++ public static byte[] get1() { return (byte[])(c.v[0][0]); } ++ public static byte[][] get2() { return (byte[][])(c.v[0]); } ++ public static Object[][] get3() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new byte[1][1][1]; ((byte[][][])c.v)[0][0][0] = 1; byte val1 = get(); ++ ((byte[][][])c.v)[0][0][0] = 2; byte val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new byte[1][1][1]; c.v[0][0] = new byte[0]; byte[] val1 = get1(); ++ c.v[0][0] = new byte[0]; byte[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new byte[1][1][1]; c.v[0] = new byte[0][0]; byte[][] val1 = get2(); ++ c.v[0] = new byte[0][0]; byte[][] val2 = get2(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new byte[0][0][0]; Object[][] val1 = get3(); ++ c.v = new byte[0][0][0]; Object[][] val2 = get3(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField { ++ static class A { ++ public @Stable byte a; ++ ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField c = new NestedStableField(); ++ public static A get() { return c.v; } ++ public static byte get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.a = 1; A val1 = get(); ++ c.v.a = 2; A val2 = get(); ++ ++ assertEquals(val1.a, 2); ++ assertEquals(val2.a, 2); ++ } ++ ++ { ++ c.v = new A(); c.v.a = 1; byte val1 = get1(); ++ c.v.a = 2; byte val2 = get1(); ++ c.v = new A(); c.v.a = 3; byte val3 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ assertEquals(val3, (isStableEnabled ? 1 : 3)); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField1 { ++ static class A { ++ public @Stable byte a; ++ public @Stable A next; ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField1 c = new NestedStableField1(); ++ public static A get() { return c.v.next.next.next.next.next.next.next; } ++ public static byte get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; ++ c.v.a = 1; c.v.next.a = 1; A val1 = get(); ++ c.v.a = 2; c.v.next.a = 2; A val2 = get(); ++ ++ assertEquals(val1.a, 2); ++ assertEquals(val2.a, 2); ++ } ++ ++ { ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 1; byte val1 = get1(); ++ c.v.a = 2; byte val2 = get1(); ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 3; byte val3 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ assertEquals(val3, (isStableEnabled ? 1 : 3)); ++ } ++ } ++ } ++ /* ==================================================== */ ++ ++ static class NestedStableField2 { ++ static class A { ++ public @Stable byte a; ++ public @Stable A left; ++ public A right; ++ } ++ ++ public @Stable A v; ++ ++ public static final NestedStableField2 c = new NestedStableField2(); ++ public static byte get() { return c.v.left.left.left.a; } ++ public static byte get1() { return c.v.left.left.right.left.a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.left = c.v.right = c.v; ++ c.v.a = 1; byte val1 = get(); byte val2 = get1(); ++ c.v.a = 2; byte val3 = get(); byte val4 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val3, (isStableEnabled ? 1 : 2)); ++ ++ assertEquals(val2, 1); ++ assertEquals(val4, 2); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField3 { ++ static class A { ++ public @Stable byte a; ++ public @Stable A[] left; ++ public A[] right; ++ } ++ ++ public @Stable A[] v; ++ ++ public static final NestedStableField3 c = new NestedStableField3(); ++ public static byte get() { return c.v[0].left[1].left[0].left[1].a; } ++ public static byte get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } ++ ++ public static void test() throws Exception { ++ { ++ A elem = new A(); ++ c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; ++ elem.a = 1; byte val1 = get(); byte val2 = get1(); ++ elem.a = 2; byte val3 = get(); byte val4 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val3, (isServerWithStable ? 1 : 2)); ++ ++ assertEquals(val2, 1); ++ assertEquals(val4, 2); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Auxiliary methods ++ static void assertEquals(int i, int j) { if (i != j) throw new AssertionError(i + " != " + j); } ++ static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } ++ ++ static boolean failed = false; ++ ++ public static void run(Class test) { ++ Throwable ex = null; ++ System.out.print(test.getName()+": "); ++ try { ++ test.getMethod("test").invoke(null); ++ } catch (InvocationTargetException e) { ++ ex = e.getCause(); ++ } catch (Throwable e) { ++ ex = e; ++ } finally { ++ if (ex == null) { ++ System.out.println("PASSED"); ++ } else { ++ failed = true; ++ System.out.println("FAILED"); ++ ex.printStackTrace(System.out); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/stable/TestStableChar.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/TestStableChar.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,659 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestStableChar ++ * @summary tests on stable fields and arrays ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestStableChar StableConfiguration sun.hotspot.WhiteBox ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission ++ * @run main ClassFileInstaller ++ * java/lang/invoke/StableConfiguration ++ * java/lang/invoke/TestStableChar ++ * java/lang/invoke/TestStableChar$CharStable ++ * java/lang/invoke/TestStableChar$StaticCharStable ++ * java/lang/invoke/TestStableChar$VolatileCharStable ++ * java/lang/invoke/TestStableChar$CharArrayDim1 ++ * java/lang/invoke/TestStableChar$CharArrayDim2 ++ * java/lang/invoke/TestStableChar$CharArrayDim3 ++ * java/lang/invoke/TestStableChar$CharArrayDim4 ++ * java/lang/invoke/TestStableChar$ObjectArrayLowerDim0 ++ * java/lang/invoke/TestStableChar$ObjectArrayLowerDim1 ++ * java/lang/invoke/TestStableChar$NestedStableField ++ * java/lang/invoke/TestStableChar$NestedStableField$A ++ * java/lang/invoke/TestStableChar$NestedStableField1 ++ * java/lang/invoke/TestStableChar$NestedStableField1$A ++ * java/lang/invoke/TestStableChar$NestedStableField2 ++ * java/lang/invoke/TestStableChar$NestedStableField2$A ++ * java/lang/invoke/TestStableChar$NestedStableField3 ++ * java/lang/invoke/TestStableChar$NestedStableField3$A ++ * java/lang/invoke/TestStableChar$DefaultValue ++ * java/lang/invoke/TestStableChar$DefaultStaticValue ++ * java/lang/invoke/TestStableChar$ObjectArrayLowerDim2 ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableChar ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableChar ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableChar ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableChar ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableChar ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableChar ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.InvocationTargetException; ++ ++public class TestStableChar { ++ static final boolean isStableEnabled = StableConfiguration.isStableEnabled; ++ static final boolean isServerWithStable = StableConfiguration.isServerWithStable; ++ ++ public static void main(String[] args) throws Exception { ++ run(DefaultValue.class); ++ run(CharStable.class); ++ run(DefaultStaticValue.class); ++ run(StaticCharStable.class); ++ run(VolatileCharStable.class); ++ ++ // @Stable arrays: Dim 1-4 ++ run(CharArrayDim1.class); ++ run(CharArrayDim2.class); ++ run(CharArrayDim3.class); ++ run(CharArrayDim4.class); ++ ++ // @Stable Object field: dynamic arrays ++ run(ObjectArrayLowerDim0.class); ++ run(ObjectArrayLowerDim1.class); ++ run(ObjectArrayLowerDim2.class); ++ ++ // Nested @Stable fields ++ run(NestedStableField.class); ++ run(NestedStableField1.class); ++ run(NestedStableField2.class); ++ run(NestedStableField3.class); ++ ++ if (failed) { ++ throw new Error("TEST FAILED"); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultValue { ++ public @Stable char v; ++ ++ public static final DefaultValue c = new DefaultValue(); ++ public static char get() { return c.v; } ++ public static void test() throws Exception { ++ char val1 = get(); ++ c.v = 'a'; char val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 'a'); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class CharStable { ++ public @Stable char v; ++ ++ public static final CharStable c = new CharStable(); ++ public static char get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 'a'; char val1 = get(); ++ c.v = 'b'; char val2 = get(); ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isStableEnabled ? 'a' : 'b')); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultStaticValue { ++ public static @Stable char v; ++ ++ public static final DefaultStaticValue c = new DefaultStaticValue(); ++ public static char get() { return c.v; } ++ public static void test() throws Exception { ++ char val1 = get(); ++ c.v = 'a'; char val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 'a'); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class StaticCharStable { ++ public @Stable char v; ++ ++ public static final StaticCharStable c = new StaticCharStable(); ++ public static char get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 'a'; char val1 = get(); ++ c.v = 'b'; char val2 = get(); ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isStableEnabled ? 'a' : 'b')); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class VolatileCharStable { ++ public @Stable volatile char v; ++ ++ public static final VolatileCharStable c = new VolatileCharStable(); ++ public static char get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 'a'; char val1 = get(); ++ c.v = 'b'; char val2 = get(); ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isStableEnabled ? 'a' : 'b')); ++ } ++ } ++ ++ /* ==================================================== */ ++ // @Stable array == field && all components are stable ++ ++ static class CharArrayDim1 { ++ public @Stable char[] v; ++ ++ public static final CharArrayDim1 c = new CharArrayDim1(); ++ public static char get() { return c.v[0]; } ++ public static char get1() { return c.v[10]; } ++ public static char[] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new char[1]; c.v[0] = 'a'; char val1 = get(); ++ c.v[0] = 'b'; char val2 = get(); ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isServerWithStable ? 'a' : 'b')); ++ ++ c.v = new char[1]; c.v[0] = 'c'; char val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'c')); ++ } ++ ++ { ++ c.v = new char[20]; c.v[10] = 'a'; char val1 = get1(); ++ c.v[10] = 'b'; char val2 = get1(); ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isServerWithStable ? 'a' : 'b')); ++ ++ c.v = new char[20]; c.v[10] = 'c'; char val3 = get1(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'c')); ++ } ++ ++ { ++ c.v = new char[1]; char[] val1 = get2(); ++ c.v = new char[1]; char[] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class CharArrayDim2 { ++ public @Stable char[][] v; ++ ++ public static final CharArrayDim2 c = new CharArrayDim2(); ++ public static char get() { return c.v[0][0]; } ++ public static char[] get1() { return c.v[0]; } ++ public static char[][] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new char[1][1]; c.v[0][0] = 'a'; char val1 = get(); ++ c.v[0][0] = 'b'; char val2 = get(); ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isServerWithStable ? 'a' : 'b')); ++ ++ c.v = new char[1][1]; c.v[0][0] = 'c'; char val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'c')); ++ ++ c.v[0] = new char[1]; c.v[0][0] = 'd'; char val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'd')); ++ } ++ ++ { ++ c.v = new char[1][1]; char[] val1 = get1(); ++ c.v[0] = new char[1]; char[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new char[1][1]; char[][] val1 = get2(); ++ c.v = new char[1][1]; char[][] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class CharArrayDim3 { ++ public @Stable char[][][] v; ++ ++ public static final CharArrayDim3 c = new CharArrayDim3(); ++ public static char get() { return c.v[0][0][0]; } ++ public static char[] get1() { return c.v[0][0]; } ++ public static char[][] get2() { return c.v[0]; } ++ public static char[][][] get3() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new char[1][1][1]; c.v[0][0][0] = 'a'; char val1 = get(); ++ c.v[0][0][0] = 'b'; char val2 = get(); ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isServerWithStable ? 'a' : 'b')); ++ ++ c.v = new char[1][1][1]; c.v[0][0][0] = 'c'; char val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'c')); ++ ++ c.v[0] = new char[1][1]; c.v[0][0][0] = 'd'; char val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'd')); ++ ++ c.v[0][0] = new char[1]; c.v[0][0][0] = 'e'; char val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'e')); ++ } ++ ++ { ++ c.v = new char[1][1][1]; char[] val1 = get1(); ++ c.v[0][0] = new char[1]; char[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new char[1][1][1]; char[][] val1 = get2(); ++ c.v[0] = new char[1][1]; char[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new char[1][1][1]; char[][][] val1 = get3(); ++ c.v = new char[1][1][1]; char[][][] val2 = get3(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class CharArrayDim4 { ++ public @Stable char[][][][] v; ++ ++ public static final CharArrayDim4 c = new CharArrayDim4(); ++ public static char get() { return c.v[0][0][0][0]; } ++ public static char[] get1() { return c.v[0][0][0]; } ++ public static char[][] get2() { return c.v[0][0]; } ++ public static char[][][] get3() { return c.v[0]; } ++ public static char[][][][] get4() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new char[1][1][1][1]; c.v[0][0][0][0] = 'a'; char val1 = get(); ++ c.v[0][0][0][0] = 'b'; char val2 = get(); ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isServerWithStable ? 'a' : 'b')); ++ ++ c.v = new char[1][1][1][1]; c.v[0][0][0][0] = 'c'; char val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'c')); ++ ++ c.v[0] = new char[1][1][1]; c.v[0][0][0][0] = 'd'; char val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'd')); ++ ++ c.v[0][0] = new char[1][1]; c.v[0][0][0][0] = 'e'; char val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'e')); ++ ++ c.v[0][0][0] = new char[1]; c.v[0][0][0][0] = 'f'; char val6 = get(); ++ assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 'a' : 'b') ++ : 'f')); ++ } ++ ++ { ++ c.v = new char[1][1][1][1]; char[] val1 = get1(); ++ c.v[0][0][0] = new char[1]; char[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new char[1][1][1][1]; char[][] val1 = get2(); ++ c.v[0][0] = new char[1][1]; char[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new char[1][1][1][1]; char[][][] val1 = get3(); ++ c.v[0] = new char[1][1][1]; char[][][] val2 = get3(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new char[1][1][1][1]; char[][][][] val1 = get4(); ++ c.v = new char[1][1][1][1]; char[][][][] val2 = get4(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Dynamic Dim is higher than static ++ static class ObjectArrayLowerDim0 { ++ public @Stable Object v; ++ ++ public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); ++ public static char get() { return ((char[])c.v)[0]; } ++ public static char[] get1() { return (char[])c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new char[1]; ((char[])c.v)[0] = 'a'; char val1 = get(); ++ ((char[])c.v)[0] = 'b'; char val2 = get(); ++ ++ assertEquals(val1, 'a'); ++ assertEquals(val2, 'b'); ++ } ++ ++ { ++ c.v = new char[1]; char[] val1 = get1(); ++ c.v = new char[1]; char[] val2 = get1(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); ++ public static char get() { return ((char[][])c.v)[0][0]; } ++ public static char[] get1() { return (char[])(c.v[0]); } ++ public static Object[] get2() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new char[1][1]; ((char[][])c.v)[0][0] = 'a'; char val1 = get(); ++ ((char[][])c.v)[0][0] = 'b'; char val2 = get(); ++ ++ assertEquals(val1, 'a'); ++ assertEquals(val2, 'b'); ++ } ++ ++ { ++ c.v = new char[1][1]; c.v[0] = new char[0]; char[] val1 = get1(); ++ c.v[0] = new char[0]; char[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new char[0][0]; Object[] val1 = get2(); ++ c.v = new char[0][0]; Object[] val2 = get2(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); ++ public static char get() { return ((char[][][])c.v)[0][0][0]; } ++ public static char[] get1() { return (char[])(c.v[0][0]); } ++ public static char[][] get2() { return (char[][])(c.v[0]); } ++ public static Object[][] get3() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new char[1][1][1]; ((char[][][])c.v)[0][0][0] = 'a'; char val1 = get(); ++ ((char[][][])c.v)[0][0][0] = 'b'; char val2 = get(); ++ ++ assertEquals(val1, 'a'); ++ assertEquals(val2, 'b'); ++ } ++ ++ { ++ c.v = new char[1][1][1]; c.v[0][0] = new char[0]; char[] val1 = get1(); ++ c.v[0][0] = new char[0]; char[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new char[1][1][1]; c.v[0] = new char[0][0]; char[][] val1 = get2(); ++ c.v[0] = new char[0][0]; char[][] val2 = get2(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new char[0][0][0]; Object[][] val1 = get3(); ++ c.v = new char[0][0][0]; Object[][] val2 = get3(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField { ++ static class A { ++ public @Stable char a; ++ ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField c = new NestedStableField(); ++ public static A get() { return c.v; } ++ public static char get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.a = 'a'; A val1 = get(); ++ c.v.a = 'b'; A val2 = get(); ++ ++ assertEquals(val1.a, 'b'); ++ assertEquals(val2.a, 'b'); ++ } ++ ++ { ++ c.v = new A(); c.v.a = 'a'; char val1 = get1(); ++ c.v.a = 'b'; char val2 = get1(); ++ c.v = new A(); c.v.a = 'c'; char val3 = get1(); ++ ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isStableEnabled ? 'a' : 'b')); ++ assertEquals(val3, (isStableEnabled ? 'a' : 'c')); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField1 { ++ static class A { ++ public @Stable char a; ++ public @Stable A next; ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField1 c = new NestedStableField1(); ++ public static A get() { return c.v.next.next.next.next.next.next.next; } ++ public static char get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; ++ c.v.a = 'a'; c.v.next.a = 'a'; A val1 = get(); ++ c.v.a = 'b'; c.v.next.a = 'b'; A val2 = get(); ++ ++ assertEquals(val1.a, 'b'); ++ assertEquals(val2.a, 'b'); ++ } ++ ++ { ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 'a'; char val1 = get1(); ++ c.v.a = 'b'; char val2 = get1(); ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 'c'; char val3 = get1(); ++ ++ assertEquals(val1, 'a'); ++ assertEquals(val2, (isStableEnabled ? 'a' : 'b')); ++ assertEquals(val3, (isStableEnabled ? 'a' : 'c')); ++ } ++ } ++ } ++ /* ==================================================== */ ++ ++ static class NestedStableField2 { ++ static class A { ++ public @Stable char a; ++ public @Stable A left; ++ public A right; ++ } ++ ++ public @Stable A v; ++ ++ public static final NestedStableField2 c = new NestedStableField2(); ++ public static char get() { return c.v.left.left.left.a; } ++ public static char get1() { return c.v.left.left.right.left.a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.left = c.v.right = c.v; ++ c.v.a = 'a'; char val1 = get(); char val2 = get1(); ++ c.v.a = 'b'; char val3 = get(); char val4 = get1(); ++ ++ assertEquals(val1, 'a'); ++ assertEquals(val3, (isStableEnabled ? 'a' : 'b')); ++ ++ assertEquals(val2, 'a'); ++ assertEquals(val4, 'b'); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField3 { ++ static class A { ++ public @Stable char a; ++ public @Stable A[] left; ++ public A[] right; ++ } ++ ++ public @Stable A[] v; ++ ++ public static final NestedStableField3 c = new NestedStableField3(); ++ public static char get() { return c.v[0].left[1].left[0].left[1].a; } ++ public static char get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } ++ ++ public static void test() throws Exception { ++ { ++ A elem = new A(); ++ c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; ++ elem.a = 'a'; char val1 = get(); char val2 = get1(); ++ elem.a = 'b'; char val3 = get(); char val4 = get1(); ++ ++ assertEquals(val1, 'a'); ++ assertEquals(val3, (isServerWithStable ? 'a' : 'b')); ++ ++ assertEquals(val2, 'a'); ++ assertEquals(val4, 'b'); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Auxiliary methods ++ static void assertEquals(int i, int j) { if (i != j) throw new AssertionError(i + " != " + j); } ++ static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } ++ ++ static boolean failed = false; ++ ++ public static void run(Class test) { ++ Throwable ex = null; ++ System.out.print(test.getName()+": "); ++ try { ++ test.getMethod("test").invoke(null); ++ } catch (InvocationTargetException e) { ++ ex = e.getCause(); ++ } catch (Throwable e) { ++ ex = e; ++ } finally { ++ if (ex == null) { ++ System.out.println("PASSED"); ++ } else { ++ failed = true; ++ System.out.println("FAILED"); ++ ex.printStackTrace(System.out); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/stable/TestStableDouble.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/TestStableDouble.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,659 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestStableDouble ++ * @summary tests on stable fields and arrays ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestStableDouble StableConfiguration sun.hotspot.WhiteBox ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission ++ * @run main ClassFileInstaller ++ * java/lang/invoke/StableConfiguration ++ * java/lang/invoke/TestStableDouble ++ * java/lang/invoke/TestStableDouble$DoubleStable ++ * java/lang/invoke/TestStableDouble$StaticDoubleStable ++ * java/lang/invoke/TestStableDouble$VolatileDoubleStable ++ * java/lang/invoke/TestStableDouble$DoubleArrayDim1 ++ * java/lang/invoke/TestStableDouble$DoubleArrayDim2 ++ * java/lang/invoke/TestStableDouble$DoubleArrayDim3 ++ * java/lang/invoke/TestStableDouble$DoubleArrayDim4 ++ * java/lang/invoke/TestStableDouble$ObjectArrayLowerDim0 ++ * java/lang/invoke/TestStableDouble$ObjectArrayLowerDim1 ++ * java/lang/invoke/TestStableDouble$NestedStableField ++ * java/lang/invoke/TestStableDouble$NestedStableField$A ++ * java/lang/invoke/TestStableDouble$NestedStableField1 ++ * java/lang/invoke/TestStableDouble$NestedStableField1$A ++ * java/lang/invoke/TestStableDouble$NestedStableField2 ++ * java/lang/invoke/TestStableDouble$NestedStableField2$A ++ * java/lang/invoke/TestStableDouble$NestedStableField3 ++ * java/lang/invoke/TestStableDouble$NestedStableField3$A ++ * java/lang/invoke/TestStableDouble$DefaultValue ++ * java/lang/invoke/TestStableDouble$DefaultStaticValue ++ * java/lang/invoke/TestStableDouble$ObjectArrayLowerDim2 ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableDouble ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableDouble ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableDouble ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableDouble ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableDouble ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableDouble ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.InvocationTargetException; ++ ++public class TestStableDouble { ++ static final boolean isStableEnabled = StableConfiguration.isStableEnabled; ++ static final boolean isServerWithStable = StableConfiguration.isServerWithStable; ++ ++ public static void main(String[] args) throws Exception { ++ run(DefaultValue.class); ++ run(DoubleStable.class); ++ run(DefaultStaticValue.class); ++ run(StaticDoubleStable.class); ++ run(VolatileDoubleStable.class); ++ ++ // @Stable arrays: Dim 1-4 ++ run(DoubleArrayDim1.class); ++ run(DoubleArrayDim2.class); ++ run(DoubleArrayDim3.class); ++ run(DoubleArrayDim4.class); ++ ++ // @Stable Object field: dynamic arrays ++ run(ObjectArrayLowerDim0.class); ++ run(ObjectArrayLowerDim1.class); ++ run(ObjectArrayLowerDim2.class); ++ ++ // Nested @Stable fields ++ run(NestedStableField.class); ++ run(NestedStableField1.class); ++ run(NestedStableField2.class); ++ run(NestedStableField3.class); ++ ++ if (failed) { ++ throw new Error("TEST FAILED"); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultValue { ++ public @Stable double v; ++ ++ public static final DefaultValue c = new DefaultValue(); ++ public static double get() { return c.v; } ++ public static void test() throws Exception { ++ double val1 = get(); ++ c.v = 1.0; double val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1.0); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DoubleStable { ++ public @Stable double v; ++ ++ public static final DoubleStable c = new DoubleStable(); ++ public static double get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1.0; double val1 = get(); ++ c.v = Double.MAX_VALUE; double val2 = get(); ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isStableEnabled ? 1.0 : Double.MAX_VALUE)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultStaticValue { ++ public static @Stable double v; ++ ++ public static final DefaultStaticValue c = new DefaultStaticValue(); ++ public static double get() { return c.v; } ++ public static void test() throws Exception { ++ double val1 = get(); ++ c.v = 1.0; double val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1.0); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class StaticDoubleStable { ++ public static @Stable double v; ++ ++ public static final StaticDoubleStable c = new StaticDoubleStable(); ++ public static double get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1.0; double val1 = get(); ++ c.v = Double.MAX_VALUE; double val2 = get(); ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isStableEnabled ? 1.0 : Double.MAX_VALUE)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class VolatileDoubleStable { ++ public @Stable double v; ++ ++ public static final VolatileDoubleStable c = new VolatileDoubleStable(); ++ public static double get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1.0; double val1 = get(); ++ c.v = Double.MAX_VALUE; double val2 = get(); ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isStableEnabled ? 1.0 : Double.MAX_VALUE)); ++ } ++ } ++ ++ /* ==================================================== */ ++ // @Stable array == field && all components are stable ++ ++ static class DoubleArrayDim1 { ++ public @Stable double[] v; ++ ++ public static final DoubleArrayDim1 c = new DoubleArrayDim1(); ++ public static double get() { return c.v[0]; } ++ public static double get1() { return c.v[10]; } ++ public static double[] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new double[1]; c.v[0] = 1.0; double val1 = get(); ++ c.v[0] = 2.0; double val2 = get(); ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); ++ ++ c.v = new double[1]; c.v[0] = 3.0; double val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 3.0)); ++ } ++ ++ { ++ c.v = new double[20]; c.v[10] = 1.0; double val1 = get1(); ++ c.v[10] = 2.0; double val2 = get1(); ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); ++ ++ c.v = new double[20]; c.v[10] = 3.0; double val3 = get1(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 3.0)); ++ } ++ ++ { ++ c.v = new double[1]; double[] val1 = get2(); ++ c.v = new double[1]; double[] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DoubleArrayDim2 { ++ public @Stable double[][] v; ++ ++ public static final DoubleArrayDim2 c = new DoubleArrayDim2(); ++ public static double get() { return c.v[0][0]; } ++ public static double[] get1() { return c.v[0]; } ++ public static double[][] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new double[1][1]; c.v[0][0] = 1.0; double val1 = get(); ++ c.v[0][0] = 2.0; double val2 = get(); ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); ++ ++ c.v = new double[1][1]; c.v[0][0] = 3.0; double val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 3.0)); ++ ++ c.v[0] = new double[1]; c.v[0][0] = 4.0; double val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 4.0)); ++ } ++ ++ { ++ c.v = new double[1][1]; double[] val1 = get1(); ++ c.v[0] = new double[1]; double[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new double[1][1]; double[][] val1 = get2(); ++ c.v = new double[1][1]; double[][] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DoubleArrayDim3 { ++ public @Stable double[][][] v; ++ ++ public static final DoubleArrayDim3 c = new DoubleArrayDim3(); ++ public static double get() { return c.v[0][0][0]; } ++ public static double[] get1() { return c.v[0][0]; } ++ public static double[][] get2() { return c.v[0]; } ++ public static double[][][] get3() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new double[1][1][1]; c.v[0][0][0] = 1.0; double val1 = get(); ++ c.v[0][0][0] = 2.0; double val2 = get(); ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); ++ ++ c.v = new double[1][1][1]; c.v[0][0][0] = 3.0; double val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 3.0)); ++ ++ c.v[0] = new double[1][1]; c.v[0][0][0] = 4.0; double val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 4.0)); ++ ++ c.v[0][0] = new double[1]; c.v[0][0][0] = 5.0; double val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 5.0)); ++ } ++ ++ { ++ c.v = new double[1][1][1]; double[] val1 = get1(); ++ c.v[0][0] = new double[1]; double[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new double[1][1][1]; double[][] val1 = get2(); ++ c.v[0] = new double[1][1]; double[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new double[1][1][1]; double[][][] val1 = get3(); ++ c.v = new double[1][1][1]; double[][][] val2 = get3(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DoubleArrayDim4 { ++ public @Stable double[][][][] v; ++ ++ public static final DoubleArrayDim4 c = new DoubleArrayDim4(); ++ public static double get() { return c.v[0][0][0][0]; } ++ public static double[] get1() { return c.v[0][0][0]; } ++ public static double[][] get2() { return c.v[0][0]; } ++ public static double[][][] get3() { return c.v[0]; } ++ public static double[][][][] get4() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new double[1][1][1][1]; c.v[0][0][0][0] = 1.0; double val1 = get(); ++ c.v[0][0][0][0] = 2.0; double val2 = get(); ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isServerWithStable ? 1.0 : 2.0)); ++ ++ c.v = new double[1][1][1][1]; c.v[0][0][0][0] = 3.0; double val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 3.0)); ++ ++ c.v[0] = new double[1][1][1]; c.v[0][0][0][0] = 4.0; double val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 4.0)); ++ ++ c.v[0][0] = new double[1][1]; c.v[0][0][0][0] = 5.0; double val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 5.0)); ++ ++ c.v[0][0][0] = new double[1]; c.v[0][0][0][0] = 6.0; double val6 = get(); ++ assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1.0 : 2.0) ++ : 6.0)); ++ } ++ ++ { ++ c.v = new double[1][1][1][1]; double[] val1 = get1(); ++ c.v[0][0][0] = new double[1]; double[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new double[1][1][1][1]; double[][] val1 = get2(); ++ c.v[0][0] = new double[1][1]; double[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new double[1][1][1][1]; double[][][] val1 = get3(); ++ c.v[0] = new double[1][1][1]; double[][][] val2 = get3(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new double[1][1][1][1]; double[][][][] val1 = get4(); ++ c.v = new double[1][1][1][1]; double[][][][] val2 = get4(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Dynamic Dim is higher than static ++ static class ObjectArrayLowerDim0 { ++ public @Stable Object v; ++ ++ public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); ++ public static double get() { return ((double[])c.v)[0]; } ++ public static double[] get1() { return (double[])c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new double[1]; ((double[])c.v)[0] = 1.0; double val1 = get(); ++ ((double[])c.v)[0] = 2.0; double val2 = get(); ++ ++ assertEquals(val1, 1.0); ++ assertEquals(val2, 2.0); ++ } ++ ++ { ++ c.v = new double[1]; double[] val1 = get1(); ++ c.v = new double[1]; double[] val2 = get1(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); ++ public static double get() { return ((double[][])c.v)[0][0]; } ++ public static double[] get1() { return (double[])(c.v[0]); } ++ public static Object[] get2() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new double[1][1]; ((double[][])c.v)[0][0] = 1.0; double val1 = get(); ++ ((double[][])c.v)[0][0] = 2.0; double val2 = get(); ++ ++ assertEquals(val1, 1.0); ++ assertEquals(val2, 2.0); ++ } ++ ++ { ++ c.v = new double[1][1]; c.v[0] = new double[0]; double[] val1 = get1(); ++ c.v[0] = new double[0]; double[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new double[0][0]; Object[] val1 = get2(); ++ c.v = new double[0][0]; Object[] val2 = get2(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); ++ public static double get() { return ((double[][][])c.v)[0][0][0]; } ++ public static double[] get1() { return (double[])(c.v[0][0]); } ++ public static double[][] get2() { return (double[][])(c.v[0]); } ++ public static Object[][] get3() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new double[1][1][1]; ((double[][][])c.v)[0][0][0] = 1.0; double val1 = get(); ++ ((double[][][])c.v)[0][0][0] = 2.0; double val2 = get(); ++ ++ assertEquals(val1, 1.0); ++ assertEquals(val2, 2.0); ++ } ++ ++ { ++ c.v = new double[1][1][1]; c.v[0][0] = new double[0]; double[] val1 = get1(); ++ c.v[0][0] = new double[0]; double[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new double[1][1][1]; c.v[0] = new double[0][0]; double[][] val1 = get2(); ++ c.v[0] = new double[0][0]; double[][] val2 = get2(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new double[0][0][0]; Object[][] val1 = get3(); ++ c.v = new double[0][0][0]; Object[][] val2 = get3(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField { ++ static class A { ++ public @Stable double a; ++ ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField c = new NestedStableField(); ++ public static A get() { return c.v; } ++ public static double get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.a = 1.0; A val1 = get(); ++ c.v.a = 2.0; A val2 = get(); ++ ++ assertEquals(val1.a, 2.0); ++ assertEquals(val2.a, 2.0); ++ } ++ ++ { ++ c.v = new A(); c.v.a = 1.0; double val1 = get1(); ++ c.v.a = 2.0; double val2 = get1(); ++ c.v = new A(); c.v.a = 3.0; double val3 = get1(); ++ ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isStableEnabled ? 1.0 : 2.0)); ++ assertEquals(val3, (isStableEnabled ? 1.0 : 3.0)); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField1 { ++ static class A { ++ public @Stable double a; ++ public @Stable A next; ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField1 c = new NestedStableField1(); ++ public static A get() { return c.v.next.next.next.next.next.next.next; } ++ public static double get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; ++ c.v.a = 1.0; c.v.next.a = 1.0; A val1 = get(); ++ c.v.a = 2.0; c.v.next.a = 2.0; A val2 = get(); ++ ++ assertEquals(val1.a, 2.0); ++ assertEquals(val2.a, 2.0); ++ } ++ ++ { ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 1.0; double val1 = get1(); ++ c.v.a = 2.0; double val2 = get1(); ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 3.0; double val3 = get1(); ++ ++ assertEquals(val1, 1.0); ++ assertEquals(val2, (isStableEnabled ? 1.0 : 2.0)); ++ assertEquals(val3, (isStableEnabled ? 1.0 : 3.0)); ++ } ++ } ++ } ++ /* ==================================================== */ ++ ++ static class NestedStableField2 { ++ static class A { ++ public @Stable double a; ++ public @Stable A left; ++ public A right; ++ } ++ ++ public @Stable A v; ++ ++ public static final NestedStableField2 c = new NestedStableField2(); ++ public static double get() { return c.v.left.left.left.a; } ++ public static double get1() { return c.v.left.left.right.left.a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.left = c.v.right = c.v; ++ c.v.a = 1.0; double val1 = get(); double val2 = get1(); ++ c.v.a = 2.0; double val3 = get(); double val4 = get1(); ++ ++ assertEquals(val1, 1.0); ++ assertEquals(val3, (isStableEnabled ? 1.0 : 2.0)); ++ ++ assertEquals(val2, 1.0); ++ assertEquals(val4, 2.0); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField3 { ++ static class A { ++ public @Stable double a; ++ public @Stable A[] left; ++ public A[] right; ++ } ++ ++ public @Stable A[] v; ++ ++ public static final NestedStableField3 c = new NestedStableField3(); ++ public static double get() { return c.v[0].left[1].left[0].left[1].a; } ++ public static double get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } ++ ++ public static void test() throws Exception { ++ { ++ A elem = new A(); ++ c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; ++ elem.a = 1.0; double val1 = get(); double val2 = get1(); ++ elem.a = 2.0; double val3 = get(); double val4 = get1(); ++ ++ assertEquals(val1, 1.0); ++ assertEquals(val3, (isServerWithStable ? 1.0 : 2.0)); ++ ++ assertEquals(val2, 1.0); ++ assertEquals(val4, 2.0); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Auxiliary methods ++ static void assertEquals(double i, double j) { if (i != j) throw new AssertionError(i + " != " + j); } ++ static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } ++ ++ static boolean failed = false; ++ ++ public static void run(Class test) { ++ Throwable ex = null; ++ System.out.print(test.getName()+": "); ++ try { ++ test.getMethod("test").invoke(null); ++ } catch (InvocationTargetException e) { ++ ex = e.getCause(); ++ } catch (Throwable e) { ++ ex = e; ++ } finally { ++ if (ex == null) { ++ System.out.println("PASSED"); ++ } else { ++ failed = true; ++ System.out.println("FAILED"); ++ ex.printStackTrace(System.out); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/stable/TestStableFloat.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/TestStableFloat.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,659 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestStableFloat ++ * @summary tests on stable fields and arrays ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestStableFloat StableConfiguration sun.hotspot.WhiteBox ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission ++ * @run main ClassFileInstaller ++ * java/lang/invoke/StableConfiguration ++ * java/lang/invoke/TestStableFloat ++ * java/lang/invoke/TestStableFloat$FloatStable ++ * java/lang/invoke/TestStableFloat$StaticFloatStable ++ * java/lang/invoke/TestStableFloat$VolatileFloatStable ++ * java/lang/invoke/TestStableFloat$FloatArrayDim1 ++ * java/lang/invoke/TestStableFloat$FloatArrayDim2 ++ * java/lang/invoke/TestStableFloat$FloatArrayDim3 ++ * java/lang/invoke/TestStableFloat$FloatArrayDim4 ++ * java/lang/invoke/TestStableFloat$ObjectArrayLowerDim0 ++ * java/lang/invoke/TestStableFloat$ObjectArrayLowerDim1 ++ * java/lang/invoke/TestStableFloat$NestedStableField ++ * java/lang/invoke/TestStableFloat$NestedStableField$A ++ * java/lang/invoke/TestStableFloat$NestedStableField1 ++ * java/lang/invoke/TestStableFloat$NestedStableField1$A ++ * java/lang/invoke/TestStableFloat$NestedStableField2 ++ * java/lang/invoke/TestStableFloat$NestedStableField2$A ++ * java/lang/invoke/TestStableFloat$NestedStableField3 ++ * java/lang/invoke/TestStableFloat$NestedStableField3$A ++ * java/lang/invoke/TestStableFloat$DefaultValue ++ * java/lang/invoke/TestStableFloat$DefaultStaticValue ++ * java/lang/invoke/TestStableFloat$ObjectArrayLowerDim2 ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableFloat ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableFloat ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableFloat ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableFloat ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableFloat ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableFloat ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.InvocationTargetException; ++ ++public class TestStableFloat { ++ static final boolean isStableEnabled = StableConfiguration.isStableEnabled; ++ static final boolean isServerWithStable = StableConfiguration.isServerWithStable; ++ ++ public static void main(String[] args) throws Exception { ++ run(DefaultValue.class); ++ run(FloatStable.class); ++ run(DefaultStaticValue.class); ++ run(StaticFloatStable.class); ++ run(VolatileFloatStable.class); ++ ++ // @Stable arrays: Dim 1-4 ++ run(FloatArrayDim1.class); ++ run(FloatArrayDim2.class); ++ run(FloatArrayDim3.class); ++ run(FloatArrayDim4.class); ++ ++ // @Stable Object field: dynamic arrays ++ run(ObjectArrayLowerDim0.class); ++ run(ObjectArrayLowerDim1.class); ++ run(ObjectArrayLowerDim2.class); ++ ++ // Nested @Stable fields ++ run(NestedStableField.class); ++ run(NestedStableField1.class); ++ run(NestedStableField2.class); ++ run(NestedStableField3.class); ++ ++ if (failed) { ++ throw new Error("TEST FAILED"); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultValue { ++ public @Stable float v; ++ ++ public static final DefaultValue c = new DefaultValue(); ++ public static float get() { return c.v; } ++ public static void test() throws Exception { ++ float val1 = get(); ++ c.v = 1.0F; float val2 = get(); ++ assertEquals(val1, 0F); ++ assertEquals(val2, 1.0F); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class FloatStable { ++ public @Stable float v; ++ ++ public static final FloatStable c = new FloatStable(); ++ public static float get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1.0F; float val1 = get(); ++ c.v = 2.0F; float val2 = get(); ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultStaticValue { ++ public static @Stable float v; ++ ++ public static final DefaultStaticValue c = new DefaultStaticValue(); ++ public static float get() { return c.v; } ++ public static void test() throws Exception { ++ float val1 = get(); ++ c.v = 1.0F; float val2 = get(); ++ assertEquals(val1, 0F); ++ assertEquals(val2, 1.0F); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class StaticFloatStable { ++ public static @Stable float v; ++ ++ public static final StaticFloatStable c = new StaticFloatStable(); ++ public static float get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1.0F; float val1 = get(); ++ c.v = 2.0F; float val2 = get(); ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class VolatileFloatStable { ++ public @Stable volatile float v; ++ ++ public static final VolatileFloatStable c = new VolatileFloatStable(); ++ public static float get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1.0F; float val1 = get(); ++ c.v = 2.0F; float val2 = get(); ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); ++ } ++ } ++ ++ /* ==================================================== */ ++ // @Stable array == field && all components are stable ++ ++ static class FloatArrayDim1 { ++ public @Stable float[] v; ++ ++ public static final FloatArrayDim1 c = new FloatArrayDim1(); ++ public static float get() { return c.v[0]; } ++ public static float get1() { return c.v[10]; } ++ public static float[] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new float[1]; c.v[0] = 1.0F; float val1 = get(); ++ c.v[0] = 2.0F; float val2 = get(); ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); ++ ++ c.v = new float[1]; c.v[0] = 3.0F; float val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 3.0F)); ++ } ++ ++ { ++ c.v = new float[20]; c.v[10] = 1.0F; float val1 = get1(); ++ c.v[10] = 2.0F; float val2 = get1(); ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); ++ ++ c.v = new float[20]; c.v[10] = 3.0F; float val3 = get1(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 3.0F)); ++ } ++ ++ { ++ c.v = new float[1]; float[] val1 = get2(); ++ c.v = new float[1]; float[] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class FloatArrayDim2 { ++ public @Stable float[][] v; ++ ++ public static final FloatArrayDim2 c = new FloatArrayDim2(); ++ public static float get() { return c.v[0][0]; } ++ public static float[] get1() { return c.v[0]; } ++ public static float[][] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new float[1][1]; c.v[0][0] = 1.0F; float val1 = get(); ++ c.v[0][0] = 2.0F; float val2 = get(); ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); ++ ++ c.v = new float[1][1]; c.v[0][0] = 3.0F; float val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 3.0F)); ++ ++ c.v[0] = new float[1]; c.v[0][0] = 4.0F; float val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 4.0F)); ++ } ++ ++ { ++ c.v = new float[1][1]; float[] val1 = get1(); ++ c.v[0] = new float[1]; float[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new float[1][1]; float[][] val1 = get2(); ++ c.v = new float[1][1]; float[][] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class FloatArrayDim3 { ++ public @Stable float[][][] v; ++ ++ public static final FloatArrayDim3 c = new FloatArrayDim3(); ++ public static float get() { return c.v[0][0][0]; } ++ public static float[] get1() { return c.v[0][0]; } ++ public static float[][] get2() { return c.v[0]; } ++ public static float[][][] get3() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new float[1][1][1]; c.v[0][0][0] = 1.0F; float val1 = get(); ++ c.v[0][0][0] = 2.0F; float val2 = get(); ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); ++ ++ c.v = new float[1][1][1]; c.v[0][0][0] = 3.0F; float val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 3.0F)); ++ ++ c.v[0] = new float[1][1]; c.v[0][0][0] = 4.0F; float val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 4.0F)); ++ ++ c.v[0][0] = new float[1]; c.v[0][0][0] = 5.0F; float val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 5.0F)); ++ } ++ ++ { ++ c.v = new float[1][1][1]; float[] val1 = get1(); ++ c.v[0][0] = new float[1]; float[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new float[1][1][1]; float[][] val1 = get2(); ++ c.v[0] = new float[1][1]; float[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new float[1][1][1]; float[][][] val1 = get3(); ++ c.v = new float[1][1][1]; float[][][] val2 = get3(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class FloatArrayDim4 { ++ public @Stable float[][][][] v; ++ ++ public static final FloatArrayDim4 c = new FloatArrayDim4(); ++ public static float get() { return c.v[0][0][0][0]; } ++ public static float[] get1() { return c.v[0][0][0]; } ++ public static float[][] get2() { return c.v[0][0]; } ++ public static float[][][] get3() { return c.v[0]; } ++ public static float[][][][] get4() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new float[1][1][1][1]; c.v[0][0][0][0] = 1.0F; float val1 = get(); ++ c.v[0][0][0][0] = 2.0F; float val2 = get(); ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isServerWithStable ? 1.0F : 2.0F)); ++ ++ c.v = new float[1][1][1][1]; c.v[0][0][0][0] = 3.0F; float val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 3.0F)); ++ ++ c.v[0] = new float[1][1][1]; c.v[0][0][0][0] = 4.0F; float val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 4.0F)); ++ ++ c.v[0][0] = new float[1][1]; c.v[0][0][0][0] = 5.0F; float val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 5.0F)); ++ ++ c.v[0][0][0] = new float[1]; c.v[0][0][0][0] = 6.0F; float val6 = get(); ++ assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1.0F : 2.0F) ++ : 6.0F)); ++ } ++ ++ { ++ c.v = new float[1][1][1][1]; float[] val1 = get1(); ++ c.v[0][0][0] = new float[1]; float[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new float[1][1][1][1]; float[][] val1 = get2(); ++ c.v[0][0] = new float[1][1]; float[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new float[1][1][1][1]; float[][][] val1 = get3(); ++ c.v[0] = new float[1][1][1]; float[][][] val2 = get3(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new float[1][1][1][1]; float[][][][] val1 = get4(); ++ c.v = new float[1][1][1][1]; float[][][][] val2 = get4(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Dynamic Dim is higher than static ++ static class ObjectArrayLowerDim0 { ++ public @Stable Object v; ++ ++ public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); ++ public static float get() { return ((float[])c.v)[0]; } ++ public static float[] get1() { return (float[])c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new float[1]; ((float[])c.v)[0] = 1.0F; float val1 = get(); ++ ((float[])c.v)[0] = 2.0F; float val2 = get(); ++ ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, 2.0F); ++ } ++ ++ { ++ c.v = new float[1]; float[] val1 = get1(); ++ c.v = new float[1]; float[] val2 = get1(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); ++ public static float get() { return ((float[][])c.v)[0][0]; } ++ public static float[] get1() { return (float[])(c.v[0]); } ++ public static Object[] get2() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new float[1][1]; ((float[][])c.v)[0][0] = 1.0F; float val1 = get(); ++ ((float[][])c.v)[0][0] = 2.0F; float val2 = get(); ++ ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, 2.0F); ++ } ++ ++ { ++ c.v = new float[1][1]; c.v[0] = new float[0]; float[] val1 = get1(); ++ c.v[0] = new float[0]; float[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new float[0][0]; Object[] val1 = get2(); ++ c.v = new float[0][0]; Object[] val2 = get2(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); ++ public static float get() { return ((float[][][])c.v)[0][0][0]; } ++ public static float[] get1() { return (float[])(c.v[0][0]); } ++ public static float[][] get2() { return (float[][])(c.v[0]); } ++ public static Object[][] get3() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new float[1][1][1]; ((float[][][])c.v)[0][0][0] = 1.0F; float val1 = get(); ++ ((float[][][])c.v)[0][0][0] = 2.0F; float val2 = get(); ++ ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, 2.0F); ++ } ++ ++ { ++ c.v = new float[1][1][1]; c.v[0][0] = new float[0]; float[] val1 = get1(); ++ c.v[0][0] = new float[0]; float[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new float[1][1][1]; c.v[0] = new float[0][0]; float[][] val1 = get2(); ++ c.v[0] = new float[0][0]; float[][] val2 = get2(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new float[0][0][0]; Object[][] val1 = get3(); ++ c.v = new float[0][0][0]; Object[][] val2 = get3(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField { ++ static class A { ++ public @Stable float a; ++ ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField c = new NestedStableField(); ++ public static A get() { return c.v; } ++ public static float get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.a = 1.0F; A val1 = get(); ++ c.v.a = 2.0F; A val2 = get(); ++ ++ assertEquals(val1.a, 2.0F); ++ assertEquals(val2.a, 2.0F); ++ } ++ ++ { ++ c.v = new A(); c.v.a = 1.0F; float val1 = get1(); ++ c.v.a = 2.0F; float val2 = get1(); ++ c.v = new A(); c.v.a = 3.0F; float val3 = get1(); ++ ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); ++ assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F)); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField1 { ++ static class A { ++ public @Stable float a; ++ public @Stable A next; ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField1 c = new NestedStableField1(); ++ public static A get() { return c.v.next.next.next.next.next.next.next; } ++ public static float get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; ++ c.v.a = 1.0F; c.v.next.a = 1.0F; A val1 = get(); ++ c.v.a = 2.0F; c.v.next.a = 2.0F; A val2 = get(); ++ ++ assertEquals(val1.a, 2.0F); ++ assertEquals(val2.a, 2.0F); ++ } ++ ++ { ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 1.0F; float val1 = get1(); ++ c.v.a = 2.0F; float val2 = get1(); ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 3.0F; float val3 = get1(); ++ ++ assertEquals(val1, 1.0F); ++ assertEquals(val2, (isStableEnabled ? 1.0F : 2.0F)); ++ assertEquals(val3, (isStableEnabled ? 1.0F : 3.0F)); ++ } ++ } ++ } ++ /* ==================================================== */ ++ ++ static class NestedStableField2 { ++ static class A { ++ public @Stable float a; ++ public @Stable A left; ++ public A right; ++ } ++ ++ public @Stable A v; ++ ++ public static final NestedStableField2 c = new NestedStableField2(); ++ public static float get() { return c.v.left.left.left.a; } ++ public static float get1() { return c.v.left.left.right.left.a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.left = c.v.right = c.v; ++ c.v.a = 1.0F; float val1 = get(); float val2 = get1(); ++ c.v.a = 2.0F; float val3 = get(); float val4 = get1(); ++ ++ assertEquals(val1, 1.0F); ++ assertEquals(val3, (isStableEnabled ? 1.0F : 2.0F)); ++ ++ assertEquals(val2, 1.0F); ++ assertEquals(val4, 2.0F); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField3 { ++ static class A { ++ public @Stable float a; ++ public @Stable A[] left; ++ public A[] right; ++ } ++ ++ public @Stable A[] v; ++ ++ public static final NestedStableField3 c = new NestedStableField3(); ++ public static float get() { return c.v[0].left[1].left[0].left[1].a; } ++ public static float get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } ++ ++ public static void test() throws Exception { ++ { ++ A elem = new A(); ++ c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; ++ elem.a = 1.0F; float val1 = get(); float val2 = get1(); ++ elem.a = 2.0F; float val3 = get(); float val4 = get1(); ++ ++ assertEquals(val1, 1.0F); ++ assertEquals(val3, (isServerWithStable ? 1.0F : 2.0F)); ++ ++ assertEquals(val2, 1.0F); ++ assertEquals(val4, 2.0F); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Auxiliary methods ++ static void assertEquals(float i, float j) { if (i != j) throw new AssertionError(i + " != " + j); } ++ static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } ++ ++ static boolean failed = false; ++ ++ public static void run(Class test) { ++ Throwable ex = null; ++ System.out.print(test.getName()+": "); ++ try { ++ test.getMethod("test").invoke(null); ++ } catch (InvocationTargetException e) { ++ ex = e.getCause(); ++ } catch (Throwable e) { ++ ex = e; ++ } finally { ++ if (ex == null) { ++ System.out.println("PASSED"); ++ } else { ++ failed = true; ++ System.out.println("FAILED"); ++ ex.printStackTrace(System.out); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/stable/TestStableInt.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/TestStableInt.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,659 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestStableInt ++ * @summary tests on stable fields and arrays ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestStableInt StableConfiguration sun.hotspot.WhiteBox ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission ++ * @run main ClassFileInstaller ++ * java/lang/invoke/StableConfiguration ++ * java/lang/invoke/TestStableInt ++ * java/lang/invoke/TestStableInt$IntStable ++ * java/lang/invoke/TestStableInt$StaticIntStable ++ * java/lang/invoke/TestStableInt$VolatileIntStable ++ * java/lang/invoke/TestStableInt$IntArrayDim1 ++ * java/lang/invoke/TestStableInt$IntArrayDim2 ++ * java/lang/invoke/TestStableInt$IntArrayDim3 ++ * java/lang/invoke/TestStableInt$IntArrayDim4 ++ * java/lang/invoke/TestStableInt$ObjectArrayLowerDim0 ++ * java/lang/invoke/TestStableInt$ObjectArrayLowerDim1 ++ * java/lang/invoke/TestStableInt$NestedStableField ++ * java/lang/invoke/TestStableInt$NestedStableField$A ++ * java/lang/invoke/TestStableInt$NestedStableField1 ++ * java/lang/invoke/TestStableInt$NestedStableField1$A ++ * java/lang/invoke/TestStableInt$NestedStableField2 ++ * java/lang/invoke/TestStableInt$NestedStableField2$A ++ * java/lang/invoke/TestStableInt$NestedStableField3 ++ * java/lang/invoke/TestStableInt$NestedStableField3$A ++ * java/lang/invoke/TestStableInt$DefaultValue ++ * java/lang/invoke/TestStableInt$DefaultStaticValue ++ * java/lang/invoke/TestStableInt$ObjectArrayLowerDim2 ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableInt ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableInt ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableInt ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableInt ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableInt ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableInt ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.InvocationTargetException; ++ ++public class TestStableInt { ++ static final boolean isStableEnabled = StableConfiguration.isStableEnabled; ++ static final boolean isServerWithStable = StableConfiguration.isServerWithStable; ++ ++ public static void main(String[] args) throws Exception { ++ run(DefaultValue.class); ++ run(IntStable.class); ++ run(DefaultStaticValue.class); ++ run(StaticIntStable.class); ++ run(VolatileIntStable.class); ++ ++ // @Stable arrays: Dim 1-4 ++ run(IntArrayDim1.class); ++ run(IntArrayDim2.class); ++ run(IntArrayDim3.class); ++ run(IntArrayDim4.class); ++ ++ // @Stable Object field: dynamic arrays ++ run(ObjectArrayLowerDim0.class); ++ run(ObjectArrayLowerDim1.class); ++ run(ObjectArrayLowerDim2.class); ++ ++ // Nested @Stable fields ++ run(NestedStableField.class); ++ run(NestedStableField1.class); ++ run(NestedStableField2.class); ++ run(NestedStableField3.class); ++ ++ if (failed) { ++ throw new Error("TEST FAILED"); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultValue { ++ public @Stable int v; ++ ++ public static final DefaultValue c = new DefaultValue(); ++ public static int get() { return c.v; } ++ public static void test() throws Exception { ++ int val1 = get(); ++ c.v = 1; int val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class IntStable { ++ public @Stable int v; ++ ++ public static final IntStable c = new IntStable(); ++ public static int get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1; int val1 = get(); ++ c.v = 2; int val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultStaticValue { ++ public static @Stable int v; ++ ++ public static final DefaultStaticValue c = new DefaultStaticValue(); ++ public static int get() { return c.v; } ++ public static void test() throws Exception { ++ int val1 = get(); ++ c.v = 1; int val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class StaticIntStable { ++ public static @Stable int v; ++ ++ public static final StaticIntStable c = new StaticIntStable(); ++ public static int get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1; int val1 = get(); ++ c.v = 2; int val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class VolatileIntStable { ++ public @Stable volatile int v; ++ ++ public static final VolatileIntStable c = new VolatileIntStable(); ++ public static int get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1; int val1 = get(); ++ c.v = 2; int val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ } ++ } ++ ++ /* ==================================================== */ ++ // @Stable array == field && all components are stable ++ ++ static class IntArrayDim1 { ++ public @Stable int[] v; ++ ++ public static final IntArrayDim1 c = new IntArrayDim1(); ++ public static int get() { return c.v[0]; } ++ public static int get1() { return c.v[10]; } ++ public static int[] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new int[1]; c.v[0] = 1; int val1 = get(); ++ c.v[0] = 2; int val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new int[1]; c.v[0] = 3; int val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ } ++ ++ { ++ c.v = new int[20]; c.v[10] = 1; int val1 = get1(); ++ c.v[10] = 2; int val2 = get1(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new int[20]; c.v[10] = 3; int val3 = get1(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ } ++ ++ { ++ c.v = new int[1]; int[] val1 = get2(); ++ c.v = new int[1]; int[] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class IntArrayDim2 { ++ public @Stable int[][] v; ++ ++ public static final IntArrayDim2 c = new IntArrayDim2(); ++ public static int get() { return c.v[0][0]; } ++ public static int[] get1() { return c.v[0]; } ++ public static int[][] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new int[1][1]; c.v[0][0] = 1; int val1 = get(); ++ c.v[0][0] = 2; int val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new int[1][1]; c.v[0][0] = 3; int val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new int[1]; c.v[0][0] = 4; int val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ } ++ ++ { ++ c.v = new int[1][1]; int[] val1 = get1(); ++ c.v[0] = new int[1]; int[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new int[1][1]; int[][] val1 = get2(); ++ c.v = new int[1][1]; int[][] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class IntArrayDim3 { ++ public @Stable int[][][] v; ++ ++ public static final IntArrayDim3 c = new IntArrayDim3(); ++ public static int get() { return c.v[0][0][0]; } ++ public static int[] get1() { return c.v[0][0]; } ++ public static int[][] get2() { return c.v[0]; } ++ public static int[][][] get3() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new int[1][1][1]; c.v[0][0][0] = 1; int val1 = get(); ++ c.v[0][0][0] = 2; int val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new int[1][1][1]; c.v[0][0][0] = 3; int val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new int[1][1]; c.v[0][0][0] = 4; int val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ ++ c.v[0][0] = new int[1]; c.v[0][0][0] = 5; int val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 5)); ++ } ++ ++ { ++ c.v = new int[1][1][1]; int[] val1 = get1(); ++ c.v[0][0] = new int[1]; int[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new int[1][1][1]; int[][] val1 = get2(); ++ c.v[0] = new int[1][1]; int[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new int[1][1][1]; int[][][] val1 = get3(); ++ c.v = new int[1][1][1]; int[][][] val2 = get3(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class IntArrayDim4 { ++ public @Stable int[][][][] v; ++ ++ public static final IntArrayDim4 c = new IntArrayDim4(); ++ public static int get() { return c.v[0][0][0][0]; } ++ public static int[] get1() { return c.v[0][0][0]; } ++ public static int[][] get2() { return c.v[0][0]; } ++ public static int[][][] get3() { return c.v[0]; } ++ public static int[][][][] get4() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new int[1][1][1][1]; c.v[0][0][0][0] = 1; int val1 = get(); ++ c.v[0][0][0][0] = 2; int val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new int[1][1][1][1]; c.v[0][0][0][0] = 3; int val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new int[1][1][1]; c.v[0][0][0][0] = 4; int val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ ++ c.v[0][0] = new int[1][1]; c.v[0][0][0][0] = 5; int val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 5)); ++ ++ c.v[0][0][0] = new int[1]; c.v[0][0][0][0] = 6; int val6 = get(); ++ assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 6)); ++ } ++ ++ { ++ c.v = new int[1][1][1][1]; int[] val1 = get1(); ++ c.v[0][0][0] = new int[1]; int[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new int[1][1][1][1]; int[][] val1 = get2(); ++ c.v[0][0] = new int[1][1]; int[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new int[1][1][1][1]; int[][][] val1 = get3(); ++ c.v[0] = new int[1][1][1]; int[][][] val2 = get3(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new int[1][1][1][1]; int[][][][] val1 = get4(); ++ c.v = new int[1][1][1][1]; int[][][][] val2 = get4(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Dynamic Dim is higher than static ++ static class ObjectArrayLowerDim0 { ++ public @Stable Object v; ++ ++ public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); ++ public static int get() { return ((int[])c.v)[0]; } ++ public static int[] get1() { return (int[])c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new int[1]; ((int[])c.v)[0] = 1; int val1 = get(); ++ ((int[])c.v)[0] = 2; int val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new int[1]; int[] val1 = get1(); ++ c.v = new int[1]; int[] val2 = get1(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); ++ public static int get() { return ((int[][])c.v)[0][0]; } ++ public static int[] get1() { return (int[])(c.v[0]); } ++ public static Object[] get2() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new int[1][1]; ((int[][])c.v)[0][0] = 1; int val1 = get(); ++ ((int[][])c.v)[0][0] = 2; int val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new int[1][1]; c.v[0] = new int[0]; int[] val1 = get1(); ++ c.v[0] = new int[0]; int[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new int[0][0]; Object[] val1 = get2(); ++ c.v = new int[0][0]; Object[] val2 = get2(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); ++ public static int get() { return ((int[][][])c.v)[0][0][0]; } ++ public static int[] get1() { return (int[])(c.v[0][0]); } ++ public static int[][] get2() { return (int[][])(c.v[0]); } ++ public static Object[][] get3() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new int[1][1][1]; ((int[][][])c.v)[0][0][0] = 1; int val1 = get(); ++ ((int[][][])c.v)[0][0][0] = 2; int val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new int[1][1][1]; c.v[0][0] = new int[0]; int[] val1 = get1(); ++ c.v[0][0] = new int[0]; int[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new int[1][1][1]; c.v[0] = new int[0][0]; int[][] val1 = get2(); ++ c.v[0] = new int[0][0]; int[][] val2 = get2(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new int[0][0][0]; Object[][] val1 = get3(); ++ c.v = new int[0][0][0]; Object[][] val2 = get3(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField { ++ static class A { ++ public @Stable int a; ++ ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField c = new NestedStableField(); ++ public static A get() { return c.v; } ++ public static int get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.a = 1; A val1 = get(); ++ c.v.a = 2; A val2 = get(); ++ ++ assertEquals(val1.a, 2); ++ assertEquals(val2.a, 2); ++ } ++ ++ { ++ c.v = new A(); c.v.a = 1; int val1 = get1(); ++ c.v.a = 2; int val2 = get1(); ++ c.v = new A(); c.v.a = 3; int val3 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ assertEquals(val3, (isStableEnabled ? 1 : 3)); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField1 { ++ static class A { ++ public @Stable int a; ++ public @Stable A next; ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField1 c = new NestedStableField1(); ++ public static A get() { return c.v.next.next.next.next.next.next.next; } ++ public static int get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; ++ c.v.a = 1; c.v.next.a = 1; A val1 = get(); ++ c.v.a = 2; c.v.next.a = 2; A val2 = get(); ++ ++ assertEquals(val1.a, 2); ++ assertEquals(val2.a, 2); ++ } ++ ++ { ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 1; int val1 = get1(); ++ c.v.a = 2; int val2 = get1(); ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 3; int val3 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ assertEquals(val3, (isStableEnabled ? 1 : 3)); ++ } ++ } ++ } ++ /* ==================================================== */ ++ ++ static class NestedStableField2 { ++ static class A { ++ public @Stable int a; ++ public @Stable A left; ++ public A right; ++ } ++ ++ public @Stable A v; ++ ++ public static final NestedStableField2 c = new NestedStableField2(); ++ public static int get() { return c.v.left.left.left.a; } ++ public static int get1() { return c.v.left.left.right.left.a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.left = c.v.right = c.v; ++ c.v.a = 1; int val1 = get(); int val2 = get1(); ++ c.v.a = 2; int val3 = get(); int val4 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val3, (isStableEnabled ? 1 : 2)); ++ ++ assertEquals(val2, 1); ++ assertEquals(val4, 2); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField3 { ++ static class A { ++ public @Stable int a; ++ public @Stable A[] left; ++ public A[] right; ++ } ++ ++ public @Stable A[] v; ++ ++ public static final NestedStableField3 c = new NestedStableField3(); ++ public static int get() { return c.v[0].left[1].left[0].left[1].a; } ++ public static int get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } ++ ++ public static void test() throws Exception { ++ { ++ A elem = new A(); ++ c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; ++ elem.a = 1; int val1 = get(); int val2 = get1(); ++ elem.a = 2; int val3 = get(); int val4 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val3, (isServerWithStable ? 1 : 2)); ++ ++ assertEquals(val2, 1); ++ assertEquals(val4, 2); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Auxiliary methods ++ static void assertEquals(int i, int j) { if (i != j) throw new AssertionError(i + " != " + j); } ++ static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } ++ ++ static boolean failed = false; ++ ++ public static void run(Class test) { ++ Throwable ex = null; ++ System.out.print(test.getName()+": "); ++ try { ++ test.getMethod("test").invoke(null); ++ } catch (InvocationTargetException e) { ++ ex = e.getCause(); ++ } catch (Throwable e) { ++ ex = e; ++ } finally { ++ if (ex == null) { ++ System.out.println("PASSED"); ++ } else { ++ failed = true; ++ System.out.println("FAILED"); ++ ex.printStackTrace(System.out); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/stable/TestStableLong.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/TestStableLong.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,659 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestStableLong ++ * @summary tests on stable fields and arrays ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestStableLong StableConfiguration sun.hotspot.WhiteBox ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission ++ * @run main ClassFileInstaller ++ * java/lang/invoke/StableConfiguration ++ * java/lang/invoke/TestStableLong ++ * java/lang/invoke/TestStableLong$LongStable ++ * java/lang/invoke/TestStableLong$StaticLongStable ++ * java/lang/invoke/TestStableLong$VolatileLongStable ++ * java/lang/invoke/TestStableLong$LongArrayDim1 ++ * java/lang/invoke/TestStableLong$LongArrayDim2 ++ * java/lang/invoke/TestStableLong$LongArrayDim3 ++ * java/lang/invoke/TestStableLong$LongArrayDim4 ++ * java/lang/invoke/TestStableLong$ObjectArrayLowerDim0 ++ * java/lang/invoke/TestStableLong$ObjectArrayLowerDim1 ++ * java/lang/invoke/TestStableLong$NestedStableField ++ * java/lang/invoke/TestStableLong$NestedStableField$A ++ * java/lang/invoke/TestStableLong$NestedStableField1 ++ * java/lang/invoke/TestStableLong$NestedStableField1$A ++ * java/lang/invoke/TestStableLong$NestedStableField2 ++ * java/lang/invoke/TestStableLong$NestedStableField2$A ++ * java/lang/invoke/TestStableLong$NestedStableField3 ++ * java/lang/invoke/TestStableLong$NestedStableField3$A ++ * java/lang/invoke/TestStableLong$DefaultValue ++ * java/lang/invoke/TestStableLong$DefaultStaticValue ++ * java/lang/invoke/TestStableLong$ObjectArrayLowerDim2 ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableLong ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableLong ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableLong ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableLong ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableLong ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableLong ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.InvocationTargetException; ++ ++public class TestStableLong { ++ static final boolean isStableEnabled = StableConfiguration.isStableEnabled; ++ static final boolean isServerWithStable = StableConfiguration.isServerWithStable; ++ ++ public static void main(String[] args) throws Exception { ++ run(DefaultValue.class); ++ run(LongStable.class); ++ run(DefaultStaticValue.class); ++ run(StaticLongStable.class); ++ run(VolatileLongStable.class); ++ ++ // @Stable arrays: Dim 1-4 ++ run(LongArrayDim1.class); ++ run(LongArrayDim2.class); ++ run(LongArrayDim3.class); ++ run(LongArrayDim4.class); ++ ++ // @Stable Object field: dynamic arrays ++ run(ObjectArrayLowerDim0.class); ++ run(ObjectArrayLowerDim1.class); ++ run(ObjectArrayLowerDim2.class); ++ ++ // Nested @Stable fields ++ run(NestedStableField.class); ++ run(NestedStableField1.class); ++ run(NestedStableField2.class); ++ run(NestedStableField3.class); ++ ++ if (failed) { ++ throw new Error("TEST FAILED"); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultValue { ++ public @Stable long v; ++ ++ public static final DefaultValue c = new DefaultValue(); ++ public static long get() { return c.v; } ++ public static void test() throws Exception { ++ long val1 = get(); ++ c.v = 1L; long val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1L); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class LongStable { ++ public @Stable long v; ++ ++ public static final LongStable c = new LongStable(); ++ public static long get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 5; long val1 = get(); ++ c.v = Long.MAX_VALUE; long val2 = get(); ++ assertEquals(val1, 5); ++ assertEquals(val2, (isStableEnabled ? 5 : Long.MAX_VALUE)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultStaticValue { ++ public static @Stable long v; ++ ++ public static final DefaultStaticValue c = new DefaultStaticValue(); ++ public static long get() { return c.v; } ++ public static void test() throws Exception { ++ long val1 = get(); ++ c.v = 1L; long val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1L); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class StaticLongStable { ++ public static @Stable long v; ++ ++ public static final StaticLongStable c = new StaticLongStable(); ++ public static long get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 5; long val1 = get(); ++ c.v = Long.MAX_VALUE; long val2 = get(); ++ assertEquals(val1, 5); ++ assertEquals(val2, (isStableEnabled ? 5 : Long.MAX_VALUE)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class VolatileLongStable { ++ public @Stable volatile long v; ++ ++ public static final VolatileLongStable c = new VolatileLongStable(); ++ public static long get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 5; long val1 = get(); ++ c.v = Long.MAX_VALUE; long val2 = get(); ++ assertEquals(val1, 5); ++ assertEquals(val2, (isStableEnabled ? 5 : Long.MAX_VALUE)); ++ } ++ } ++ ++ /* ==================================================== */ ++ // @Stable array == field && all components are stable ++ ++ static class LongArrayDim1 { ++ public @Stable long[] v; ++ ++ public static final LongArrayDim1 c = new LongArrayDim1(); ++ public static long get() { return c.v[0]; } ++ public static long get1() { return c.v[10]; } ++ public static long[] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new long[1]; c.v[0] = 1; long val1 = get(); ++ c.v[0] = 2; long val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new long[1]; c.v[0] = 3; long val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ } ++ ++ { ++ c.v = new long[20]; c.v[10] = 1; long val1 = get1(); ++ c.v[10] = 2; long val2 = get1(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new long[20]; c.v[10] = 3; long val3 = get1(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ } ++ ++ { ++ c.v = new long[1]; long[] val1 = get2(); ++ c.v = new long[1]; long[] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class LongArrayDim2 { ++ public @Stable long[][] v; ++ ++ public static final LongArrayDim2 c = new LongArrayDim2(); ++ public static long get() { return c.v[0][0]; } ++ public static long[] get1() { return c.v[0]; } ++ public static long[][] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new long[1][1]; c.v[0][0] = 1; long val1 = get(); ++ c.v[0][0] = 2; long val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new long[1][1]; c.v[0][0] = 3; long val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new long[1]; c.v[0][0] = 4; long val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ } ++ ++ { ++ c.v = new long[1][1]; long[] val1 = get1(); ++ c.v[0] = new long[1]; long[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new long[1][1]; long[][] val1 = get2(); ++ c.v = new long[1][1]; long[][] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class LongArrayDim3 { ++ public @Stable long[][][] v; ++ ++ public static final LongArrayDim3 c = new LongArrayDim3(); ++ public static long get() { return c.v[0][0][0]; } ++ public static long[] get1() { return c.v[0][0]; } ++ public static long[][] get2() { return c.v[0]; } ++ public static long[][][] get3() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new long[1][1][1]; c.v[0][0][0] = 1; long val1 = get(); ++ c.v[0][0][0] = 2; long val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new long[1][1][1]; c.v[0][0][0] = 3; long val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new long[1][1]; c.v[0][0][0] = 4; long val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ ++ c.v[0][0] = new long[1]; c.v[0][0][0] = 5; long val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 5)); ++ } ++ ++ { ++ c.v = new long[1][1][1]; long[] val1 = get1(); ++ c.v[0][0] = new long[1]; long[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new long[1][1][1]; long[][] val1 = get2(); ++ c.v[0] = new long[1][1]; long[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new long[1][1][1]; long[][][] val1 = get3(); ++ c.v = new long[1][1][1]; long[][][] val2 = get3(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class LongArrayDim4 { ++ public @Stable long[][][][] v; ++ ++ public static final LongArrayDim4 c = new LongArrayDim4(); ++ public static long get() { return c.v[0][0][0][0]; } ++ public static long[] get1() { return c.v[0][0][0]; } ++ public static long[][] get2() { return c.v[0][0]; } ++ public static long[][][] get3() { return c.v[0]; } ++ public static long[][][][] get4() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new long[1][1][1][1]; c.v[0][0][0][0] = 1; long val1 = get(); ++ c.v[0][0][0][0] = 2; long val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new long[1][1][1][1]; c.v[0][0][0][0] = 3; long val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new long[1][1][1]; c.v[0][0][0][0] = 4; long val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ ++ c.v[0][0] = new long[1][1]; c.v[0][0][0][0] = 5; long val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 5)); ++ ++ c.v[0][0][0] = new long[1]; c.v[0][0][0][0] = 6; long val6 = get(); ++ assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 6)); ++ } ++ ++ { ++ c.v = new long[1][1][1][1]; long[] val1 = get1(); ++ c.v[0][0][0] = new long[1]; long[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new long[1][1][1][1]; long[][] val1 = get2(); ++ c.v[0][0] = new long[1][1]; long[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new long[1][1][1][1]; long[][][] val1 = get3(); ++ c.v[0] = new long[1][1][1]; long[][][] val2 = get3(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new long[1][1][1][1]; long[][][][] val1 = get4(); ++ c.v = new long[1][1][1][1]; long[][][][] val2 = get4(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Dynamic Dim is higher than static ++ static class ObjectArrayLowerDim0 { ++ public @Stable Object v; ++ ++ public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); ++ public static long get() { return ((long[])c.v)[0]; } ++ public static long[] get1() { return (long[])c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new long[1]; ((long[])c.v)[0] = 1; long val1 = get(); ++ ((long[])c.v)[0] = 2; long val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new long[1]; long[] val1 = get1(); ++ c.v = new long[1]; long[] val2 = get1(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); ++ public static long get() { return ((long[][])c.v)[0][0]; } ++ public static long[] get1() { return (long[])(c.v[0]); } ++ public static Object[] get2() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new long[1][1]; ((long[][])c.v)[0][0] = 1; long val1 = get(); ++ ((long[][])c.v)[0][0] = 2; long val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new long[1][1]; c.v[0] = new long[0]; long[] val1 = get1(); ++ c.v[0] = new long[0]; long[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new long[0][0]; Object[] val1 = get2(); ++ c.v = new long[0][0]; Object[] val2 = get2(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); ++ public static long get() { return ((long[][][])c.v)[0][0][0]; } ++ public static long[] get1() { return (long[])(c.v[0][0]); } ++ public static long[][] get2() { return (long[][])(c.v[0]); } ++ public static Object[][] get3() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new long[1][1][1]; ((long[][][])c.v)[0][0][0] = 1L; long val1 = get(); ++ ((long[][][])c.v)[0][0][0] = 2L; long val2 = get(); ++ ++ assertEquals(val1, 1L); ++ assertEquals(val2, 2L); ++ } ++ ++ { ++ c.v = new long[1][1][1]; c.v[0][0] = new long[0]; long[] val1 = get1(); ++ c.v[0][0] = new long[0]; long[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new long[1][1][1]; c.v[0] = new long[0][0]; long[][] val1 = get2(); ++ c.v[0] = new long[0][0]; long[][] val2 = get2(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new long[0][0][0]; Object[][] val1 = get3(); ++ c.v = new long[0][0][0]; Object[][] val2 = get3(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField { ++ static class A { ++ public @Stable long a; ++ ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField c = new NestedStableField(); ++ public static A get() { return c.v; } ++ public static long get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.a = 1; A val1 = get(); ++ c.v.a = 2; A val2 = get(); ++ ++ assertEquals(val1.a, 2); ++ assertEquals(val2.a, 2); ++ } ++ ++ { ++ c.v = new A(); c.v.a = 1; long val1 = get1(); ++ c.v.a = 2; long val2 = get1(); ++ c.v = new A(); c.v.a = 3; long val3 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ assertEquals(val3, (isStableEnabled ? 1 : 3)); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField1 { ++ static class A { ++ public @Stable long a; ++ public @Stable A next; ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField1 c = new NestedStableField1(); ++ public static A get() { return c.v.next.next.next.next.next.next.next; } ++ public static long get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; ++ c.v.a = 1; c.v.next.a = 1; A val1 = get(); ++ c.v.a = 2; c.v.next.a = 2; A val2 = get(); ++ ++ assertEquals(val1.a, 2); ++ assertEquals(val2.a, 2); ++ } ++ ++ { ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 1; long val1 = get1(); ++ c.v.a = 2; long val2 = get1(); ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 3; long val3 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ assertEquals(val3, (isStableEnabled ? 1 : 3)); ++ } ++ } ++ } ++ /* ==================================================== */ ++ ++ static class NestedStableField2 { ++ static class A { ++ public @Stable long a; ++ public @Stable A left; ++ public A right; ++ } ++ ++ public @Stable A v; ++ ++ public static final NestedStableField2 c = new NestedStableField2(); ++ public static long get() { return c.v.left.left.left.a; } ++ public static long get1() { return c.v.left.left.right.left.a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.left = c.v.right = c.v; ++ c.v.a = 1; long val1 = get(); long val2 = get1(); ++ c.v.a = 2; long val3 = get(); long val4 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val3, (isStableEnabled ? 1 : 2)); ++ ++ assertEquals(val2, 1); ++ assertEquals(val4, 2); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField3 { ++ static class A { ++ public @Stable long a; ++ public @Stable A[] left; ++ public A[] right; ++ } ++ ++ public @Stable A[] v; ++ ++ public static final NestedStableField3 c = new NestedStableField3(); ++ public static long get() { return c.v[0].left[1].left[0].left[1].a; } ++ public static long get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } ++ ++ public static void test() throws Exception { ++ { ++ A elem = new A(); ++ c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; ++ elem.a = 1; long val1 = get(); long val2 = get1(); ++ elem.a = 2; long val3 = get(); long val4 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val3, (isServerWithStable ? 1 : 2)); ++ ++ assertEquals(val2, 1); ++ assertEquals(val4, 2); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Auxiliary methods ++ static void assertEquals(long i, long j) { if (i != j) throw new AssertionError(i + " != " + j); } ++ static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } ++ ++ static boolean failed = false; ++ ++ public static void run(Class test) { ++ Throwable ex = null; ++ System.out.print(test.getName()+": "); ++ try { ++ test.getMethod("test").invoke(null); ++ } catch (InvocationTargetException e) { ++ ex = e.getCause(); ++ } catch (Throwable e) { ++ ex = e; ++ } finally { ++ if (ex == null) { ++ System.out.println("PASSED"); ++ } else { ++ failed = true; ++ System.out.println("FAILED"); ++ ex.printStackTrace(System.out); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/stable/TestStableObject.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/TestStableObject.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,662 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestStableObject ++ * @summary tests on stable fields and arrays ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestStableObject StableConfiguration sun.hotspot.WhiteBox ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission ++ * @run main ClassFileInstaller ++ * java/lang/invoke/StableConfiguration ++ * java/lang/invoke/TestStableObject ++ * java/lang/invoke/TestStableObject$ObjectStable ++ * java/lang/invoke/TestStableObject$StaticObjectStable ++ * java/lang/invoke/TestStableObject$VolatileObjectStable ++ * java/lang/invoke/TestStableObject$ObjectArrayDim1 ++ * java/lang/invoke/TestStableObject$ObjectArrayDim2 ++ * java/lang/invoke/TestStableObject$ObjectArrayDim3 ++ * java/lang/invoke/TestStableObject$ObjectArrayDim4 ++ * java/lang/invoke/TestStableObject$ObjectArrayLowerDim0 ++ * java/lang/invoke/TestStableObject$ObjectArrayLowerDim1 ++ * java/lang/invoke/TestStableObject$NestedStableField ++ * java/lang/invoke/TestStableObject$NestedStableField$A ++ * java/lang/invoke/TestStableObject$NestedStableField1 ++ * java/lang/invoke/TestStableObject$NestedStableField1$A ++ * java/lang/invoke/TestStableObject$NestedStableField2 ++ * java/lang/invoke/TestStableObject$NestedStableField2$A ++ * java/lang/invoke/TestStableObject$NestedStableField3 ++ * java/lang/invoke/TestStableObject$NestedStableField3$A ++ * java/lang/invoke/TestStableObject$Values ++ * java/lang/invoke/TestStableObject$DefaultValue ++ * java/lang/invoke/TestStableObject$DefaultStaticValue ++ * java/lang/invoke/TestStableObject$ObjectArrayLowerDim2 ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableObject ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableObject ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableObject ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableObject ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableObject ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableObject ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.InvocationTargetException; ++ ++public class TestStableObject { ++ static final boolean isStableEnabled = StableConfiguration.isStableEnabled; ++ static final boolean isServerWithStable = StableConfiguration.isServerWithStable; ++ ++ public static void main(String[] args) throws Exception { ++ run(DefaultValue.class); ++ run(ObjectStable.class); ++ run(DefaultStaticValue.class); ++ run(StaticObjectStable.class); ++ run(VolatileObjectStable.class); ++ ++ // @Stable arrays: Dim 1-4 ++ run(ObjectArrayDim1.class); ++ run(ObjectArrayDim2.class); ++ run(ObjectArrayDim3.class); ++ run(ObjectArrayDim4.class); ++ ++ // @Stable Object field: dynamic arrays ++ run(ObjectArrayLowerDim0.class); ++ run(ObjectArrayLowerDim1.class); ++ run(ObjectArrayLowerDim2.class); ++ ++ // Nested @Stable fields ++ run(NestedStableField.class); ++ run(NestedStableField1.class); ++ run(NestedStableField2.class); ++ run(NestedStableField3.class); ++ ++ if (failed) { ++ throw new Error("TEST FAILED"); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ enum Values {A, B, C, D, E, F} ++ ++ static class DefaultValue { ++ public @Stable Object v; ++ ++ public static final DefaultValue c = new DefaultValue(); ++ public static Object get() { return c.v; } ++ public static void test() throws Exception { ++ Object val1 = get(); ++ c.v = Values.A; Object val2 = get(); ++ assertEquals(val1, null); ++ assertEquals(val2, Values.A); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectStable { ++ public @Stable Values v; ++ ++ public static final ObjectStable c = new ObjectStable (); ++ public static Values get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = Values.A; Values val1 = get(); ++ c.v = Values.B; Values val2 = get(); ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultStaticValue { ++ public static @Stable Object v; ++ ++ public static final DefaultStaticValue c = new DefaultStaticValue(); ++ public static Object get() { return c.v; } ++ public static void test() throws Exception { ++ Object val1 = get(); ++ c.v = Values.A; Object val2 = get(); ++ assertEquals(val1, null); ++ assertEquals(val2, Values.A); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class StaticObjectStable { ++ public static @Stable Values v; ++ ++ public static final ObjectStable c = new ObjectStable (); ++ public static Values get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = Values.A; Values val1 = get(); ++ c.v = Values.B; Values val2 = get(); ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class VolatileObjectStable { ++ public @Stable volatile Values v; ++ ++ public static final VolatileObjectStable c = new VolatileObjectStable (); ++ public static Values get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = Values.A; Values val1 = get(); ++ c.v = Values.B; Values val2 = get(); ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); ++ } ++ } ++ ++ /* ==================================================== */ ++ // @Stable array == field && all components are stable ++ ++ static class ObjectArrayDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayDim1 c = new ObjectArrayDim1(); ++ public static Object get() { return c.v[0]; } ++ public static Object get1() { return c.v[10]; } ++ public static Object[] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new Object[1]; c.v[0] = Values.A; Object val1 = get(); ++ c.v[0] = Values.B; Object val2 = get(); ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); ++ ++ c.v = new Object[1]; c.v[0] = Values.C; Object val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.C)); ++ } ++ ++ { ++ c.v = new Object[20]; c.v[10] = Values.A; Object val1 = get1(); ++ c.v[10] = Values.B; Object val2 = get1(); ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); ++ ++ c.v = new Object[20]; c.v[10] = Values.C; Object val3 = get1(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.C)); ++ } ++ ++ { ++ c.v = new Object[1]; Object[] val1 = get2(); ++ c.v = new Object[1]; Object[] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayDim2 c = new ObjectArrayDim2(); ++ public static Object get() { return c.v[0][0]; } ++ public static Object[] get1() { return c.v[0]; } ++ public static Object[][] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new Object[1][1]; c.v[0][0] = Values.A; Object val1 = get(); ++ c.v[0][0] = Values.B; Object val2 = get(); ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); ++ ++ c.v = new Object[1][1]; c.v[0][0] = Values.C; Object val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.C)); ++ ++ c.v[0] = new Object[1]; c.v[0][0] = Values.D; Object val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.D)); ++ } ++ ++ { ++ c.v = new Object[1][1]; Object[] val1 = get1(); ++ c.v[0] = new Object[1]; Object[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new Object[1][1]; Object[][] val1 = get2(); ++ c.v = new Object[1][1]; Object[][] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayDim3 { ++ public @Stable Object[][][] v; ++ ++ public static final ObjectArrayDim3 c = new ObjectArrayDim3(); ++ public static Object get() { return c.v[0][0][0]; } ++ public static Object[] get1() { return c.v[0][0]; } ++ public static Object[][] get2() { return c.v[0]; } ++ public static Object[][][] get3() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new Object[1][1][1]; c.v[0][0][0] = Values.A; Object val1 = get(); ++ c.v[0][0][0] = Values.B; Object val2 = get(); ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); ++ ++ c.v = new Object[1][1][1]; c.v[0][0][0] = Values.C; Object val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.C)); ++ ++ c.v[0] = new Object[1][1]; c.v[0][0][0] = Values.D; Object val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.D)); ++ ++ c.v[0][0] = new Object[1]; c.v[0][0][0] = Values.E; Object val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.E)); ++ } ++ ++ { ++ c.v = new Object[1][1][1]; Object[] val1 = get1(); ++ c.v[0][0] = new Object[1]; Object[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new Object[1][1][1]; Object[][] val1 = get2(); ++ c.v[0] = new Object[1][1]; Object[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new Object[1][1][1]; Object[][][] val1 = get3(); ++ c.v = new Object[1][1][1]; Object[][][] val2 = get3(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayDim4 { ++ public @Stable Object[][][][] v; ++ ++ public static final ObjectArrayDim4 c = new ObjectArrayDim4(); ++ public static Object get() { return c.v[0][0][0][0]; } ++ public static Object[] get1() { return c.v[0][0][0]; } ++ public static Object[][] get2() { return c.v[0][0]; } ++ public static Object[][][] get3() { return c.v[0]; } ++ public static Object[][][][] get4() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.A; Object val1 = get(); ++ c.v[0][0][0][0] = Values.B; Object val2 = get(); ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isServerWithStable ? Values.A : Values.B)); ++ ++ c.v = new Object[1][1][1][1]; c.v[0][0][0][0] = Values.C; Object val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.C)); ++ ++ c.v[0] = new Object[1][1][1]; c.v[0][0][0][0] = Values.D; Object val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.D)); ++ ++ c.v[0][0] = new Object[1][1]; c.v[0][0][0][0] = Values.E; Object val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.E)); ++ ++ c.v[0][0][0] = new Object[1]; c.v[0][0][0][0] = Values.F; Object val6 = get(); ++ assertEquals(val6, (isStableEnabled ? (isServerWithStable ? Values.A : Values.B) ++ : Values.F)); ++ } ++ ++ { ++ c.v = new Object[1][1][1][1]; Object[] val1 = get1(); ++ c.v[0][0][0] = new Object[1]; Object[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new Object[1][1][1][1]; Object[][] val1 = get2(); ++ c.v[0][0] = new Object[1][1]; Object[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new Object[1][1][1][1]; Object[][][] val1 = get3(); ++ c.v[0] = new Object[1][1][1]; Object[][][] val2 = get3(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new Object[1][1][1][1]; Object[][][][] val1 = get4(); ++ c.v = new Object[1][1][1][1]; Object[][][][] val2 = get4(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Dynamic Dim is higher than static ++ static class ObjectArrayLowerDim0 { ++ public @Stable Object v; ++ ++ public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); ++ public static Object get() { return ((Object[])c.v)[0]; } ++ public static Object[] get1() { return (Object[])c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new Object[1]; ((Object[])c.v)[0] = Values.A; Object val1 = get(); ++ ((Object[])c.v)[0] = Values.B; Object val2 = get(); ++ ++ assertEquals(val1, Values.A); ++ assertEquals(val2, Values.B); ++ } ++ ++ { ++ c.v = new Object[1]; Object[] val1 = get1(); ++ c.v = new Object[1]; Object[] val2 = get1(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); ++ public static Object get() { return ((Object[][])c.v)[0][0]; } ++ public static Object[] get1() { return (Object[])(c.v[0]); } ++ public static Object[] get2() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new Object[1][1]; ((Object[][])c.v)[0][0] = Values.A; Object val1 = get(); ++ ((Object[][])c.v)[0][0] = Values.B; Object val2 = get(); ++ ++ assertEquals(val1, Values.A); ++ assertEquals(val2, Values.B); ++ } ++ ++ { ++ c.v = new Object[1][1]; c.v[0] = new Object[0]; Object[] val1 = get1(); ++ c.v[0] = new Object[0]; Object[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new Object[0][0]; Object[] val1 = get2(); ++ c.v = new Object[0][0]; Object[] val2 = get2(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); ++ public static Object get() { return ((Object[][][])c.v)[0][0][0]; } ++ public static Object[] get1() { return (Object[])(c.v[0][0]); } ++ public static Object[][] get2() { return (Object[][])(c.v[0]); } ++ public static Object[][] get3() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new Object[1][1][1]; ((Object[][][])c.v)[0][0][0] = Values.A; Object val1 = get(); ++ ((Object[][][])c.v)[0][0][0] = Values.B; Object val2 = get(); ++ ++ assertEquals(val1, Values.A); ++ assertEquals(val2, Values.B); ++ } ++ ++ { ++ c.v = new Object[1][1][1]; c.v[0][0] = new Object[0]; Object[] val1 = get1(); ++ c.v[0][0] = new Object[0]; Object[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new Object[1][1][1]; c.v[0] = new Object[0][0]; Object[][] val1 = get2(); ++ c.v[0] = new Object[0][0]; Object[][] val2 = get2(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new Object[0][0][0]; Object[][] val1 = get3(); ++ c.v = new Object[0][0][0]; Object[][] val2 = get3(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField { ++ static class A { ++ public @Stable Object a; ++ ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField c = new NestedStableField(); ++ public static A get() { return c.v; } ++ public static Object get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.a = Values.A; A val1 = get(); ++ c.v.a = Values.B; A val2 = get(); ++ ++ assertEquals(val1.a, Values.B); ++ assertEquals(val2.a, Values.B); ++ } ++ ++ { ++ c.v = new A(); c.v.a = Values.A; Object val1 = get1(); ++ c.v.a = Values.B; Object val2 = get1(); ++ c.v = new A(); c.v.a = Values.C; Object val3 = get1(); ++ ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); ++ assertEquals(val3, (isStableEnabled ? Values.A : Values.C)); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField1 { ++ static class A { ++ public @Stable Object a; ++ public @Stable A next; ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField1 c = new NestedStableField1(); ++ public static A get() { return c.v.next.next.next.next.next.next.next; } ++ public static Object get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; ++ c.v.a = Values.A; c.v.next.a = Values.A; A val1 = get(); ++ c.v.a = Values.B; c.v.next.a = Values.B; A val2 = get(); ++ ++ assertEquals(val1.a, Values.B); ++ assertEquals(val2.a, Values.B); ++ } ++ ++ { ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = Values.A; Object val1 = get1(); ++ c.v.a = Values.B; Object val2 = get1(); ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = Values.C; Object val3 = get1(); ++ ++ assertEquals(val1, Values.A); ++ assertEquals(val2, (isStableEnabled ? Values.A : Values.B)); ++ assertEquals(val3, (isStableEnabled ? Values.A : Values.C)); ++ } ++ } ++ } ++ /* ==================================================== */ ++ ++ static class NestedStableField2 { ++ static class A { ++ public @Stable Object a; ++ public @Stable A left; ++ public A right; ++ } ++ ++ public @Stable A v; ++ ++ public static final NestedStableField2 c = new NestedStableField2(); ++ public static Object get() { return c.v.left.left.left.a; } ++ public static Object get1() { return c.v.left.left.right.left.a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.left = c.v.right = c.v; ++ c.v.a = Values.A; Object val1 = get(); Object val2 = get1(); ++ c.v.a = Values.B; Object val3 = get(); Object val4 = get1(); ++ ++ assertEquals(val1, Values.A); ++ assertEquals(val3, (isStableEnabled ? Values.A : Values.B)); ++ ++ assertEquals(val2, Values.A); ++ assertEquals(val4, Values.B); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField3 { ++ static class A { ++ public @Stable Object a; ++ public @Stable A[] left; ++ public A[] right; ++ } ++ ++ public @Stable A[] v; ++ ++ public static final NestedStableField3 c = new NestedStableField3(); ++ public static Object get() { return c.v[0].left[1].left[0].left[1].a; } ++ public static Object get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } ++ ++ public static void test() throws Exception { ++ { ++ A elem = new A(); ++ c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; ++ elem.a = Values.A; Object val1 = get(); Object val2 = get1(); ++ elem.a = Values.B; Object val3 = get(); Object val4 = get1(); ++ ++ assertEquals(val1, Values.A); ++ assertEquals(val3, (isServerWithStable ? Values.A : Values.B)); ++ ++ assertEquals(val2, Values.A); ++ assertEquals(val4, Values.B); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Auxiliary methods ++ static void assertEquals(Object i, Object j) { if (i != j) throw new AssertionError(i + " != " + j); } ++ static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } ++ ++ static boolean failed = false; ++ ++ public static void run(Class test) { ++ Throwable ex = null; ++ System.out.print(test.getName()+": "); ++ try { ++ test.getMethod("test").invoke(null); ++ } catch (InvocationTargetException e) { ++ ex = e.getCause(); ++ } catch (Throwable e) { ++ ex = e; ++ } finally { ++ if (ex == null) { ++ System.out.println("PASSED"); ++ } else { ++ failed = true; ++ System.out.println("FAILED"); ++ ex.printStackTrace(System.out); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/stable/TestStableShort.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/stable/TestStableShort.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,659 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test TestStableShort ++ * @summary tests on stable fields and arrays ++ * @library /testlibrary /testlibrary/whitebox ++ * @build TestStableShort StableConfiguration sun.hotspot.WhiteBox ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission ++ * @run main ClassFileInstaller ++ * java/lang/invoke/StableConfiguration ++ * java/lang/invoke/TestStableShort ++ * java/lang/invoke/TestStableShort$ShortStable ++ * java/lang/invoke/TestStableShort$StaticShortStable ++ * java/lang/invoke/TestStableShort$VolatileShortStable ++ * java/lang/invoke/TestStableShort$ShortArrayDim1 ++ * java/lang/invoke/TestStableShort$ShortArrayDim2 ++ * java/lang/invoke/TestStableShort$ShortArrayDim3 ++ * java/lang/invoke/TestStableShort$ShortArrayDim4 ++ * java/lang/invoke/TestStableShort$ObjectArrayLowerDim0 ++ * java/lang/invoke/TestStableShort$ObjectArrayLowerDim1 ++ * java/lang/invoke/TestStableShort$NestedStableField ++ * java/lang/invoke/TestStableShort$NestedStableField$A ++ * java/lang/invoke/TestStableShort$NestedStableField1 ++ * java/lang/invoke/TestStableShort$NestedStableField1$A ++ * java/lang/invoke/TestStableShort$NestedStableField2 ++ * java/lang/invoke/TestStableShort$NestedStableField2$A ++ * java/lang/invoke/TestStableShort$NestedStableField3 ++ * java/lang/invoke/TestStableShort$NestedStableField3$A ++ * java/lang/invoke/TestStableShort$DefaultValue ++ * java/lang/invoke/TestStableShort$DefaultStaticValue ++ * java/lang/invoke/TestStableShort$ObjectArrayLowerDim2 ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableShort ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableShort ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableShort ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -server -XX:+TieredCompilation -XX:TieredStopAtLevel=1 ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableShort ++ * ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:+FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableShort ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xcomp ++ * -client -XX:-TieredCompilation ++ * -XX:-FoldStableValues ++ * -XX:CompileOnly=::get,::get1,::get2,::get3,::get4 ++ * java.lang.invoke.TestStableShort ++ */ ++package java.lang.invoke; ++ ++import java.lang.reflect.InvocationTargetException; ++ ++public class TestStableShort { ++ static final boolean isStableEnabled = StableConfiguration.isStableEnabled; ++ static final boolean isServerWithStable = StableConfiguration.isServerWithStable; ++ ++ public static void main(String[] args) throws Exception { ++ run(DefaultValue.class); ++ run(ShortStable.class); ++ run(DefaultStaticValue.class); ++ run(StaticShortStable.class); ++ run(VolatileShortStable.class); ++ ++ // @Stable arrays: Dim 1-4 ++ run(ShortArrayDim1.class); ++ run(ShortArrayDim2.class); ++ run(ShortArrayDim3.class); ++ run(ShortArrayDim4.class); ++ ++ // @Stable Object field: dynamic arrays ++ run(ObjectArrayLowerDim0.class); ++ run(ObjectArrayLowerDim1.class); ++ run(ObjectArrayLowerDim2.class); ++ ++ // Nested @Stable fields ++ run(NestedStableField.class); ++ run(NestedStableField1.class); ++ run(NestedStableField2.class); ++ run(NestedStableField3.class); ++ ++ if (failed) { ++ throw new Error("TEST FAILED"); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultValue { ++ public @Stable short v; ++ ++ public static final DefaultValue c = new DefaultValue(); ++ public static short get() { return c.v; } ++ public static void test() throws Exception { ++ short val1 = get(); ++ c.v = 1; short val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ShortStable { ++ public @Stable short v; ++ ++ public static final ShortStable c = new ShortStable(); ++ public static short get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1; short val1 = get(); ++ c.v = 32767; short val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 32767)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class DefaultStaticValue { ++ public static @Stable short v; ++ ++ public static final DefaultStaticValue c = new DefaultStaticValue(); ++ public static short get() { return c.v; } ++ public static void test() throws Exception { ++ short val1 = get(); ++ c.v = 1; short val2 = get(); ++ assertEquals(val1, 0); ++ assertEquals(val2, 1); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class StaticShortStable { ++ public static @Stable short v; ++ ++ public static final StaticShortStable c = new StaticShortStable(); ++ public static short get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1; short val1 = get(); ++ c.v = 32767; short val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 32767)); ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class VolatileShortStable { ++ public @Stable volatile short v; ++ ++ public static final VolatileShortStable c = new VolatileShortStable(); ++ public static short get() { return c.v; } ++ public static void test() throws Exception { ++ c.v = 1; short val1 = get(); ++ c.v = 32767; short val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 32767)); ++ } ++ } ++ ++ /* ==================================================== */ ++ // @Stable array == field && all components are stable ++ ++ static class ShortArrayDim1 { ++ public @Stable short[] v; ++ ++ public static final ShortArrayDim1 c = new ShortArrayDim1(); ++ public static short get() { return c.v[0]; } ++ public static short get1() { return c.v[10]; } ++ public static short[] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new short[1]; c.v[0] = 1; short val1 = get(); ++ c.v[0] = 2; short val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new short[1]; c.v[0] = 3; short val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ } ++ ++ { ++ c.v = new short[20]; c.v[10] = 1; short val1 = get1(); ++ c.v[10] = 2; short val2 = get1(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new short[20]; c.v[10] = 3; short val3 = get1(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ } ++ ++ { ++ c.v = new short[1]; short[] val1 = get2(); ++ c.v = new short[1]; short[] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ShortArrayDim2 { ++ public @Stable short[][] v; ++ ++ public static final ShortArrayDim2 c = new ShortArrayDim2(); ++ public static short get() { return c.v[0][0]; } ++ public static short[] get1() { return c.v[0]; } ++ public static short[][] get2() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new short[1][1]; c.v[0][0] = 1; short val1 = get(); ++ c.v[0][0] = 2; short val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new short[1][1]; c.v[0][0] = 3; short val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new short[1]; c.v[0][0] = 4; short val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ } ++ ++ { ++ c.v = new short[1][1]; short[] val1 = get1(); ++ c.v[0] = new short[1]; short[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new short[1][1]; short[][] val1 = get2(); ++ c.v = new short[1][1]; short[][] val2 = get2(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ShortArrayDim3 { ++ public @Stable short[][][] v; ++ ++ public static final ShortArrayDim3 c = new ShortArrayDim3(); ++ public static short get() { return c.v[0][0][0]; } ++ public static short[] get1() { return c.v[0][0]; } ++ public static short[][] get2() { return c.v[0]; } ++ public static short[][][] get3() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new short[1][1][1]; c.v[0][0][0] = 1; short val1 = get(); ++ c.v[0][0][0] = 2; short val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new short[1][1][1]; c.v[0][0][0] = 3; short val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new short[1][1]; c.v[0][0][0] = 4; short val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ ++ c.v[0][0] = new short[1]; c.v[0][0][0] = 5; short val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 5)); ++ } ++ ++ { ++ c.v = new short[1][1][1]; short[] val1 = get1(); ++ c.v[0][0] = new short[1]; short[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new short[1][1][1]; short[][] val1 = get2(); ++ c.v[0] = new short[1][1]; short[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new short[1][1][1]; short[][][] val1 = get3(); ++ c.v = new short[1][1][1]; short[][][] val2 = get3(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ShortArrayDim4 { ++ public @Stable short[][][][] v; ++ ++ public static final ShortArrayDim4 c = new ShortArrayDim4(); ++ public static short get() { return c.v[0][0][0][0]; } ++ public static short[] get1() { return c.v[0][0][0]; } ++ public static short[][] get2() { return c.v[0][0]; } ++ public static short[][][] get3() { return c.v[0]; } ++ public static short[][][][] get4() { return c.v; } ++ public static void test() throws Exception { ++ { ++ c.v = new short[1][1][1][1]; c.v[0][0][0][0] = 1; short val1 = get(); ++ c.v[0][0][0][0] = 2; short val2 = get(); ++ assertEquals(val1, 1); ++ assertEquals(val2, (isServerWithStable ? 1 : 2)); ++ ++ c.v = new short[1][1][1][1]; c.v[0][0][0][0] = 3; short val3 = get(); ++ assertEquals(val3, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 3)); ++ ++ c.v[0] = new short[1][1][1]; c.v[0][0][0][0] = 4; short val4 = get(); ++ assertEquals(val4, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 4)); ++ ++ c.v[0][0] = new short[1][1]; c.v[0][0][0][0] = 5; short val5 = get(); ++ assertEquals(val5, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 5)); ++ ++ c.v[0][0][0] = new short[1]; c.v[0][0][0][0] = 6; short val6 = get(); ++ assertEquals(val6, (isStableEnabled ? (isServerWithStable ? 1 : 2) ++ : 6)); ++ } ++ ++ { ++ c.v = new short[1][1][1][1]; short[] val1 = get1(); ++ c.v[0][0][0] = new short[1]; short[] val2 = get1(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new short[1][1][1][1]; short[][] val1 = get2(); ++ c.v[0][0] = new short[1][1]; short[][] val2 = get2(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new short[1][1][1][1]; short[][][] val1 = get3(); ++ c.v[0] = new short[1][1][1]; short[][][] val2 = get3(); ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new short[1][1][1][1]; short[][][][] val1 = get4(); ++ c.v = new short[1][1][1][1]; short[][][][] val2 = get4(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Dynamic Dim is higher than static ++ static class ObjectArrayLowerDim0 { ++ public @Stable Object v; ++ ++ public static final ObjectArrayLowerDim0 c = new ObjectArrayLowerDim0(); ++ public static short get() { return ((short[])c.v)[0]; } ++ public static short[] get1() { return (short[])c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new short[1]; ((short[])c.v)[0] = 1; short val1 = get(); ++ ((short[])c.v)[0] = 2; short val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new short[1]; short[] val1 = get1(); ++ c.v = new short[1]; short[] val2 = get1(); ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim1 { ++ public @Stable Object[] v; ++ ++ public static final ObjectArrayLowerDim1 c = new ObjectArrayLowerDim1(); ++ public static short get() { return ((short[][])c.v)[0][0]; } ++ public static short[] get1() { return (short[])(c.v[0]); } ++ public static Object[] get2() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new short[1][1]; ((short[][])c.v)[0][0] = 1; short val1 = get(); ++ ((short[][])c.v)[0][0] = 2; short val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new short[1][1]; c.v[0] = new short[0]; short[] val1 = get1(); ++ c.v[0] = new short[0]; short[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new short[0][0]; Object[] val1 = get2(); ++ c.v = new short[0][0]; Object[] val2 = get2(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class ObjectArrayLowerDim2 { ++ public @Stable Object[][] v; ++ ++ public static final ObjectArrayLowerDim2 c = new ObjectArrayLowerDim2(); ++ public static short get() { return ((short[][][])c.v)[0][0][0]; } ++ public static short[] get1() { return (short[])(c.v[0][0]); } ++ public static short[][] get2() { return (short[][])(c.v[0]); } ++ public static Object[][] get3() { return c.v; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new short[1][1][1]; ((short[][][])c.v)[0][0][0] = 1; short val1 = get(); ++ ((short[][][])c.v)[0][0][0] = 2; short val2 = get(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, 2); ++ } ++ ++ { ++ c.v = new short[1][1][1]; c.v[0][0] = new short[0]; short[] val1 = get1(); ++ c.v[0][0] = new short[0]; short[] val2 = get1(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new short[1][1][1]; c.v[0] = new short[0][0]; short[][] val1 = get2(); ++ c.v[0] = new short[0][0]; short[][] val2 = get2(); ++ ++ assertTrue((isServerWithStable ? (val1 == val2) : (val1 != val2))); ++ } ++ ++ { ++ c.v = new short[0][0][0]; Object[][] val1 = get3(); ++ c.v = new short[0][0][0]; Object[][] val2 = get3(); ++ ++ assertTrue((isStableEnabled ? (val1 == val2) : (val1 != val2))); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField { ++ static class A { ++ public @Stable short a; ++ ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField c = new NestedStableField(); ++ public static A get() { return c.v; } ++ public static short get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.a = 1; A val1 = get(); ++ c.v.a = 2; A val2 = get(); ++ ++ assertEquals(val1.a, 2); ++ assertEquals(val2.a, 2); ++ } ++ ++ { ++ c.v = new A(); c.v.a = 1; short val1 = get1(); ++ c.v.a = 2; short val2 = get1(); ++ c.v = new A(); c.v.a = 3; short val3 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ assertEquals(val3, (isStableEnabled ? 1 : 3)); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField1 { ++ static class A { ++ public @Stable short a; ++ public @Stable A next; ++ } ++ public @Stable A v; ++ ++ public static final NestedStableField1 c = new NestedStableField1(); ++ public static A get() { return c.v.next.next.next.next.next.next.next; } ++ public static short get1() { return get().a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.next = new A(); c.v.next.next = c.v; ++ c.v.a = 1; c.v.next.a = 1; A val1 = get(); ++ c.v.a = 2; c.v.next.a = 2; A val2 = get(); ++ ++ assertEquals(val1.a, 2); ++ assertEquals(val2.a, 2); ++ } ++ ++ { ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 1; short val1 = get1(); ++ c.v.a = 2; short val2 = get1(); ++ c.v = new A(); c.v.next = c.v; ++ c.v.a = 3; short val3 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val2, (isStableEnabled ? 1 : 2)); ++ assertEquals(val3, (isStableEnabled ? 1 : 3)); ++ } ++ } ++ } ++ /* ==================================================== */ ++ ++ static class NestedStableField2 { ++ static class A { ++ public @Stable short a; ++ public @Stable A left; ++ public A right; ++ } ++ ++ public @Stable A v; ++ ++ public static final NestedStableField2 c = new NestedStableField2(); ++ public static short get() { return c.v.left.left.left.a; } ++ public static short get1() { return c.v.left.left.right.left.a; } ++ ++ public static void test() throws Exception { ++ { ++ c.v = new A(); c.v.left = c.v.right = c.v; ++ c.v.a = 1; short val1 = get(); short val2 = get1(); ++ c.v.a = 2; short val3 = get(); short val4 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val3, (isStableEnabled ? 1 : 2)); ++ ++ assertEquals(val2, 1); ++ assertEquals(val4, 2); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ ++ static class NestedStableField3 { ++ static class A { ++ public @Stable short a; ++ public @Stable A[] left; ++ public A[] right; ++ } ++ ++ public @Stable A[] v; ++ ++ public static final NestedStableField3 c = new NestedStableField3(); ++ public static short get() { return c.v[0].left[1].left[0].left[1].a; } ++ public static short get1() { return c.v[1].left[0].left[1].right[0].left[1].a; } ++ ++ public static void test() throws Exception { ++ { ++ A elem = new A(); ++ c.v = new A[] { elem, elem }; c.v[0].left = c.v[0].right = c.v; ++ elem.a = 1; short val1 = get(); short val2 = get1(); ++ elem.a = 2; short val3 = get(); short val4 = get1(); ++ ++ assertEquals(val1, 1); ++ assertEquals(val3, (isServerWithStable ? 1 : 2)); ++ ++ assertEquals(val2, 1); ++ assertEquals(val4, 2); ++ } ++ } ++ } ++ ++ /* ==================================================== */ ++ // Auxiliary methods ++ static void assertEquals(int i, int j) { if (i != j) throw new AssertionError(i + " != " + j); } ++ static void assertTrue(boolean b) { if (!b) throw new AssertionError(); } ++ ++ static boolean failed = false; ++ ++ public static void run(Class test) { ++ Throwable ex = null; ++ System.out.print(test.getName()+": "); ++ try { ++ test.getMethod("test").invoke(null); ++ } catch (InvocationTargetException e) { ++ ex = e.getCause(); ++ } catch (Throwable e) { ++ ex = e; ++ } finally { ++ if (ex == null) { ++ System.out.println("PASSED"); ++ } else { ++ failed = true; ++ System.out.println("FAILED"); ++ ex.printStackTrace(System.out); ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/startup/SmallCodeCacheStartup.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/startup/SmallCodeCacheStartup.java Wed Jul 30 03:51:43 2014 -0700 +@@ -37,7 +37,6 @@ + + pb = ProcessTools.createJavaProcessBuilder("-XX:ReservedCodeCacheSize=3m", "-XX:CICompilerCount=64", "-version"); + out = new OutputAnalyzer(pb.start()); +- out.shouldContain("no space to run compiler"); + out.shouldHaveExitValue(0); + } + } +--- ./hotspot/test/compiler/testlibrary/rtm/AbortProvoker.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/AbortProvoker.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,172 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm; ++ ++import java.util.Objects; ++import java.util.concurrent.BrokenBarrierException; ++import java.util.concurrent.CyclicBarrier; ++ ++import com.oracle.java.testlibrary.Asserts; ++import com.oracle.java.testlibrary.Utils; ++import sun.misc.Unsafe; ++ ++/** ++ * Base class for different transactional execution abortion ++ * provokers aimed to force abort due to specified reason. ++ */ ++public abstract class AbortProvoker implements CompilableTest { ++ public static final long DEFAULT_ITERATIONS = 10000L; ++ /** ++ * Inflates monitor associated with object {@code monitor}. ++ * Inflation is forced by entering the same monitor from ++ * two different threads. ++ * ++ * @param monitor monitor to be inflated. ++ * @return inflated monitor. ++ * @throws Exception if something went wrong. ++ */ ++ public static Object inflateMonitor(Object monitor) throws Exception { ++ Unsafe unsafe = Utils.getUnsafe(); ++ CyclicBarrier barrier = new CyclicBarrier(2); ++ ++ Runnable inflatingRunnable = () -> { ++ unsafe.monitorEnter(monitor); ++ try { ++ barrier.await(); ++ barrier.await(); ++ } catch (InterruptedException | BrokenBarrierException e) { ++ throw new RuntimeException( ++ "Synchronization issue occurred.", e); ++ } finally { ++ unsafe.monitorExit(monitor); ++ } ++ }; ++ ++ Thread t = new Thread(inflatingRunnable); ++ t.start(); ++ // Wait until thread t enters the monitor. ++ barrier.await(); ++ // At this point monitor will be owned by thread t, ++ // so our attempt to enter the same monitor will force ++ // monitor inflation. ++ Asserts.assertFalse(unsafe.tryMonitorEnter(monitor), ++ "Not supposed to enter the monitor first"); ++ barrier.await(); ++ t.join(); ++ return monitor; ++ } ++ ++ ++ /** ++ * Get instance of specified AbortProvoker, inflate associated monitor ++ * if needed and then invoke forceAbort method in a loop. ++ * ++ * Usage: ++ * AbortProvoker <AbortType name> [<inflate monitor> ++ * [<iterations> [ <delay>]]] ++ * ++ * Default parameters are: ++ *
    ++ *
  • inflate monitor = true
  • ++ *
  • iterations = {@code AbortProvoker.DEFAULT_ITERATIONS}
  • ++ *
  • delay = 0
  • ++ *
++ */ ++ public static void main(String args[]) throws Throwable { ++ Asserts.assertGT(args.length, 0, "At least one argument is required."); ++ ++ AbortType abortType = AbortType.lookup(Integer.valueOf(args[0])); ++ boolean monitorShouldBeInflated = true; ++ long iterations = AbortProvoker.DEFAULT_ITERATIONS; ++ ++ if (args.length > 1) { ++ monitorShouldBeInflated = Boolean.valueOf(args[1]); ++ ++ if (args.length > 2) { ++ iterations = Long.valueOf(args[2]); ++ ++ if (args.length > 3) { ++ Thread.sleep(Integer.valueOf(args[3])); ++ } ++ } ++ } ++ ++ AbortProvoker provoker = abortType.provoker(); ++ ++ if (monitorShouldBeInflated) { ++ provoker.inflateMonitor(); ++ } ++ ++ for (long i = 0; i < iterations; i++) { ++ provoker.forceAbort(); ++ } ++ } ++ ++ protected final Object monitor; ++ ++ protected AbortProvoker() { ++ this(new Object()); ++ } ++ ++ protected AbortProvoker(Object monitor) { ++ this.monitor = Objects.requireNonNull(monitor); ++ } ++ ++ /** ++ * Inflates monitor used by this AbortProvoker instance. ++ * @throws Exception ++ */ ++ public void inflateMonitor() throws Exception { ++ AbortProvoker.inflateMonitor(monitor); ++ } ++ ++ /** ++ * Forces transactional execution abortion. ++ */ ++ public abstract void forceAbort(); ++ ++ /** ++ * Returns names of all methods that have to be compiled ++ * in order to successfully force transactional execution ++ * abortion. ++ * ++ * @return array with methods' names that have to be compiled. ++ */ ++ @Override ++ public String[] getMethodsToCompileNames() { ++ return new String[] { getMethodWithLockName() }; ++ } ++ ++ /** ++ * Returns name of the method that will contain monitor whose locking ++ * will be elided using transactional execution. ++ * ++ * @return name of the method that will contain elided lock. ++ */ ++ @Override ++ public String getMethodWithLockName() { ++ return this.getClass().getName() + "::forceAbort"; ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/AbortType.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/AbortType.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,103 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm; ++ ++import com.oracle.java.testlibrary.Asserts; ++ ++import java.util.HashMap; ++import java.util.Map; ++ ++/** ++ * Type of transactional execution abort. ++ * For more details on different abort types please see ++ * shared/vm/runtime/rtmLocking.hpp ++ */ ++public enum AbortType { ++ XABORT(0), ++ RETRIABLE(1), ++ MEM_CONFLICT(2), ++ BUF_OVERFLOW(3), ++ DEBUG_BREAKPOINT(4), ++ NESTED_ABORT(5); ++ ++ private final int type; ++ private static final Map LOOKUP_MAP = new HashMap<>(); ++ ++ static { ++ for (AbortType abortType : AbortType.values()) { ++ Asserts.assertFalse(LOOKUP_MAP.containsKey(abortType.type), ++ "Abort type values should be unique."); ++ LOOKUP_MAP.put(abortType.type, abortType); ++ } ++ } ++ ++ private AbortType(int type) { ++ this.type = type; ++ } ++ ++ /** ++ * Returns AbortProvoker for aborts represented by this abort type. ++ * ++ * @return an AbortProvoker instance ++ */ ++ public AbortProvoker provoker() { ++ return AbortType.createNewProvoker(this); ++ } ++ ++ public static AbortType lookup(int type) { ++ Asserts.assertLT(type, AbortType.values().length, ++ "Unknown abort type."); ++ return LOOKUP_MAP.get(type); ++ } ++ ++ /** ++ * Returns transaction execution abort provoker for specified abortion type. ++ * ++ * @param type a type of abort which will be forced by returned ++ * AbortProvoker instance. ++ * @return AbortProvoker instance that will force abort of specified type ++ * @throws RuntimeException if there is no provoker for specified type ++ */ ++ private static AbortProvoker createNewProvoker(AbortType type) { ++ switch (type) { ++ case XABORT: ++ return new XAbortProvoker(); ++ case MEM_CONFLICT: ++ return new MemoryConflictProvoker(); ++ case BUF_OVERFLOW: ++ return new BufferOverflowProvoker(); ++ case NESTED_ABORT: ++ return new NestedAbortProvoker(); ++ default: ++ throw new RuntimeException("No provoker exists for type " ++ + type.name()); ++ } ++ } ++ ++ @Override ++ public String toString() { ++ return Integer.toString(type); ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/BufferOverflowProvoker.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/BufferOverflowProvoker.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm; ++ ++/** ++ * In order to provoke transactional execution abort due to ++ * internal's buffer overflow BufferOverflowProvoker modifies ++ * 1MB of BYTES during single transaction. ++ */ ++class BufferOverflowProvoker extends AbortProvoker { ++ /** ++ * To force buffer overflow abort we modify memory region with ++ * size more then L1d cache size. ++ */ ++ private static final int MORE_THAN_L1D_SIZE = 1024 * 1024; ++ private static final byte[] DATA = new byte[MORE_THAN_L1D_SIZE]; ++ ++ @Override ++ public void forceAbort() { ++ synchronized(monitor) { ++ for (int i = 0; i < BufferOverflowProvoker.DATA.length; i++) { ++ BufferOverflowProvoker.DATA[i]++; ++ } ++ } ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/BusyLock.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/BusyLock.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,136 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm; ++ ++import com.oracle.java.testlibrary.Utils; ++import sun.misc.Unsafe; ++ ++import java.util.concurrent.BrokenBarrierException; ++import java.util.concurrent.CyclicBarrier; ++ ++/** ++ * Test case for busy lock scenario. ++ * One thread enters the monitor and sleep for a while. ++ * Another thread is blocked on the same monitor. ++ */ ++public class BusyLock implements CompilableTest, Runnable { ++ private static final int DEFAULT_TIMEOUT = 1000; ++ private final CyclicBarrier barrier; ++ ++ // Following field have to be static in order to avoid escape analysis. ++ @SuppressWarnings("UnsuedDeclaration") ++ private static int field = 0; ++ private static final Unsafe UNSAFE = Utils.getUnsafe(); ++ protected final Object monitor; ++ protected final int timeout; ++ ++ public BusyLock() { ++ this(BusyLock.DEFAULT_TIMEOUT); ++ } ++ ++ public BusyLock(int timeout) { ++ this.timeout = timeout; ++ this.monitor = new Object(); ++ this.barrier = new CyclicBarrier(2); ++ } ++ ++ @Override ++ public void run() { ++ try { ++ // wait until forceAbort leave monitor ++ barrier.await(); ++ if (UNSAFE.tryMonitorEnter(monitor)) { ++ try { ++ barrier.await(); ++ Thread.sleep(timeout); ++ } finally { ++ UNSAFE.monitorExit(monitor); ++ } ++ } else { ++ throw new RuntimeException("Monitor should be entered by " + ++ "::run() first."); ++ } ++ } catch (InterruptedException | BrokenBarrierException e) { ++ throw new RuntimeException("Synchronization error happened.", e); ++ } ++ } ++ ++ public void test() { ++ try { ++ barrier.await(); ++ // wait until monitor is locked by a ::run method ++ barrier.await(); ++ } catch (InterruptedException | BrokenBarrierException e) { ++ throw new RuntimeException("Synchronization error happened.", e); ++ } ++ synchronized(monitor) { ++ BusyLock.field++; ++ } ++ } ++ ++ @Override ++ public String getMethodWithLockName() { ++ return this.getClass().getName() + "::test"; ++ } ++ ++ @Override ++ public String[] getMethodsToCompileNames() { ++ return new String[] { getMethodWithLockName() }; ++ } ++ ++ /** ++ * Usage: ++ * BusyLock [ <inflate monitor> [ <timeout> ] ] ++ * ++ * Default values are: ++ *
    ++ *
  • inflate monitor = {@code true}
  • ++ *
  • timeout = {@code BusyLock.DEFAULT_TIMEOUT}
  • ++ *
++ */ ++ public static void main(String args[]) throws Exception { ++ int timeoutValue = BusyLock.DEFAULT_TIMEOUT; ++ boolean inflateMonitor = true; ++ ++ if (args.length > 0 ) { ++ inflateMonitor = Boolean.valueOf(args[0]); ++ ++ if (args.length > 1) { ++ timeoutValue = Integer.valueOf(args[1]); ++ } ++ } ++ ++ BusyLock busyLock = new BusyLock(timeoutValue); ++ ++ if (inflateMonitor) { ++ AbortProvoker.inflateMonitor(busyLock.monitor); ++ } ++ ++ Thread t = new Thread(busyLock); ++ t.start(); ++ busyLock.test(); ++ t.join(); ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/CompilableTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/CompilableTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm; ++ ++/** ++ * Interface for test scenarios that contain methods ++ * that should be compiled. ++ */ ++public interface CompilableTest { ++ /** ++ * @return array with methods' names that should be compiled. ++ */ ++ String[] getMethodsToCompileNames(); ++ ++ /** ++ * @return name of method with RTM-elided lock. ++ */ ++ String getMethodWithLockName(); ++} +--- ./hotspot/test/compiler/testlibrary/rtm/MemoryConflictProvoker.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/MemoryConflictProvoker.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,100 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm; ++ ++import java.util.concurrent.BrokenBarrierException; ++import java.util.concurrent.CyclicBarrier; ++ ++/** ++ * To force transactional execution abort due to memory conflict ++ * one thread should access memory region from transactional region ++ * while another thread should modify the same memory region. ++ * Since this scenario is based on the race condition between threads ++ * you should not expect some particular amount of aborts. ++ */ ++class MemoryConflictProvoker extends AbortProvoker { ++ // Following field have to be static in order to avoid escape analysis. ++ @SuppressWarnings("UnsuedDeclaration") ++ private static int field = 0; ++ private static final int INNER_ITERATIONS = 10000; ++ private final CyclicBarrier barrier; ++ /** ++ * This thread will access and modify memory region ++ * from outside of the transaction. ++ */ ++ private final Runnable conflictingThread; ++ ++ public MemoryConflictProvoker() { ++ this(new Object()); ++ } ++ ++ public MemoryConflictProvoker(Object monitor) { ++ super(monitor); ++ barrier = new CyclicBarrier(2); ++ conflictingThread = () -> { ++ try { ++ barrier.await(); ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) { ++ MemoryConflictProvoker.field++; ++ } ++ }; ++ } ++ ++ /** ++ * Accesses and modifies memory region from within the transaction. ++ */ ++ public void transactionalRegion() { ++ try { ++ barrier.await(); ++ } catch (InterruptedException | BrokenBarrierException e) { ++ throw new RuntimeException(e); ++ } ++ for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) { ++ synchronized(monitor) { ++ MemoryConflictProvoker.field--; ++ } ++ } ++ } ++ ++ @Override ++ public void forceAbort() { ++ try { ++ Thread t = new Thread(conflictingThread); ++ t.start(); ++ transactionalRegion(); ++ t.join(); ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++ ++ @Override ++ public String getMethodWithLockName() { ++ return this.getClass().getName() + "::transactionalRegion"; ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/NestedAbortProvoker.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/NestedAbortProvoker.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,61 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm; ++ ++import java.util.Arrays; ++ ++/** ++ * In order to force nested transaction abort NestedAbortProvoker ++ * invoke BufferOverflowProvoker from transactional region. ++ */ ++class NestedAbortProvoker extends AbortProvoker { ++ // Following field have to be static in order to avoid escape analysis. ++ @SuppressWarnings("UnsuedDeclaration") ++ private static int field = 0; ++ private final AbortProvoker nestedAbortProvoker; ++ ++ public NestedAbortProvoker() { ++ this.nestedAbortProvoker = new XAbortProvoker(monitor); ++ } ++ ++ @Override ++ public void forceAbort() { ++ synchronized(monitor) { ++ NestedAbortProvoker.field++; ++ nestedAbortProvoker.forceAbort(); ++ NestedAbortProvoker.field--; ++ } ++ } ++ ++ @Override ++ public String[] getMethodsToCompileNames() { ++ String nestedProvokerMethods[] ++ = nestedAbortProvoker.getMethodsToCompileNames(); ++ String methods[] = Arrays.copyOf(nestedProvokerMethods, ++ nestedProvokerMethods.length + 1); ++ methods[methods.length - 1] = getMethodWithLockName(); ++ return methods; ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/RTMLockingStatistics.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/RTMLockingStatistics.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,227 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm; ++ ++import java.util.EnumMap; ++import java.util.LinkedList; ++import java.util.List; ++import java.util.Map; ++import java.util.regex.Pattern; ++import java.util.regex.Matcher; ++ ++/** ++ * Wrapper for +UsePreciseRTMLockingStatistics output. ++ * ++ * Example of locking statistics: ++ * ++ * java/lang/ClassLoader.loadClass@7 ++ * # rtm locks total (estimated): 0 ++ * # rtm lock aborts : 13 ++ * # rtm lock aborts 0: 12 ++ * # rtm lock aborts 1: 0 ++ * # rtm lock aborts 2: 0 ++ * # rtm lock aborts 3: 0 ++ * # rtm lock aborts 4: 0 ++ * # rtm lock aborts 5: 0 ++ */ ++public class RTMLockingStatistics { ++ /** ++ * Pattern for aborts per abort type entries. ++ */ ++ private static final Pattern ABORT_PATTERN; ++ ++ /** ++ * Pattern for whole statistics. ++ */ ++ private static final Pattern RTM_LOCKING_STATISTICS_PATTERN; ++ ++ static { ++ String abortRe ++ = "# rtm lock aborts\\s+(?[0-9]+):\\s(?[0-9]+)"; ++ ++ ABORT_PATTERN = Pattern.compile(abortRe); ++ RTM_LOCKING_STATISTICS_PATTERN = Pattern.compile( ++ "(?[^.\n]+)\\." + ++ "(?[^@\n]+)@(?[0-9]+)\n" + ++ "# rtm locks total \\(estimated\\):\\s*" + ++ "(?[0-9]+)\n" + ++ "# rtm lock aborts\\s+:\\s*(?[0-9]+)\n" + ++ "(?(" + abortRe + "\n)+)"); ++ } ++ ++ private final long totalLocks; ++ private final long totalAborts; ++ private final String className; ++ private final String methodName; ++ private final int bci; ++ private final Map aborts = new EnumMap<>(AbortType.class); ++ ++ /** ++ * Constructs RTMLockingStatistics from matcher captured statistics entry. ++ * @param matcher Matcher captured statistics entry. ++ */ ++ private RTMLockingStatistics(Matcher matcher) { ++ className = matcher.group("className"); ++ methodName = matcher.group("methodName"); ++ bci = Integer.valueOf(matcher.group("bci")); ++ totalLocks = Long.valueOf(matcher.group("totalLocks")); ++ totalAborts = Long.valueOf(matcher.group("totalAborts")); ++ ++ Matcher abortMatcher = ABORT_PATTERN.matcher(matcher. ++ group("abortStats")); ++ ++ while (abortMatcher.find()) { ++ int type = Integer.valueOf(abortMatcher.group("type")); ++ long count = Long.valueOf(abortMatcher.group("count")); ++ setAborts(AbortType.lookup(type), count); ++ } ++ } ++ ++ ++ /** ++ * Parses string and return all founded RTM locking statistics entries. ++ * ++ * @param str the string to be parsed. ++ * @return list with all founded RTM locking statistics entries or ++ * empty list if nothing was found. ++ */ ++ public static List fromString(String str) { ++ List statistics = new LinkedList<>(); ++ Matcher matcher = RTM_LOCKING_STATISTICS_PATTERN.matcher(str); ++ ++ while (matcher.find()) { ++ RTMLockingStatistics lock = new RTMLockingStatistics(matcher); ++ statistics.add(lock); ++ } ++ ++ return statistics; ++ } ++ ++ /** ++ * Parses string and return all founded RTM locking statistics entries ++ * for locks in method {@code methodName}. ++ * ++ * @param methodName a name of the method for locks from which statistics ++ * should be gathered. ++ * @param str the string to be parsed. ++ * @return list with all founded RTM locking statistics entries or ++ * empty list if nothing was found. ++ */ ++ public static List fromString(String methodName, ++ String str) { ++ String formattedMethodName = formatMethodName(methodName); ++ ++ List statisticsForMethod = new LinkedList<>(); ++ for (RTMLockingStatistics statistics : fromString(str)) { ++ if (statistics.getLockName().startsWith(formattedMethodName)) { ++ statisticsForMethod.add(statistics); ++ } ++ } ++ return statisticsForMethod; ++ } ++ ++ /** ++ * Formats method's name so it will have the same format as ++ * in rtm locking statistics. ++ * ++ *
++     * Example:
++     * com/example/Klass::method => com/example/Klass.method
++     * com/example/Klass.method  => com/example/Klass.method
++     * com.example.Klass::method => com/example/Klass.method
++     * com.example.Klass.method  => com/example/Klass.method
++     * 
++ * ++ * @param methodName method's name that should be formatted. ++ * @return formatted method's name. ++ */ ++ private static String formatMethodName(String methodName) { ++ String m[]; ++ if (methodName.contains("::")) { ++ m = methodName.split("::"); ++ } else { ++ int splitAt = methodName.lastIndexOf('.'); ++ m = new String[2]; ++ m[0] = methodName.substring(0, splitAt); ++ m[1] = methodName.substring(splitAt + 1); ++ } ++ return String.format("%s.%s", m[0].replaceAll("\\.", "/"), m[1]); ++ } ++ ++ /** ++ * Returns name of lock for which this statistics was collected. ++ * Lock name has following format: ++ * <class name>.<method name>@<bci> ++ * ++ * @return name of lock. ++ */ ++ public String getLockName() { ++ return String.format("%s.%s@%d", className, methodName, bci); ++ } ++ ++ /** ++ * Returns aborts count for specified abort type. ++ * ++ * @param type an abort type. ++ * @return count of aborts. ++ */ ++ public long getAborts(AbortType type) { ++ return aborts.getOrDefault(type, 0L); ++ } ++ ++ /** ++ * Sets aborts count for specified abort type. ++ * ++ * @param type an abort type. ++ * @param count count of aborts. ++ */ ++ public void setAborts(AbortType type, long count) { ++ aborts.put(type, count); ++ } ++ ++ public long getTotalLocks() { ++ return totalLocks; ++ } ++ ++ public long getTotalAborts() { ++ return totalAborts; ++ } ++ ++ @Override ++ public String toString() { ++ StringBuilder builder = new StringBuilder(); ++ builder.append(getLockName()).append('\n'); ++ builder.append(String.format("# rtm locks total (estimated): %d\n", ++ getTotalLocks())); ++ builder.append(String.format("# rtm lock aborts: %d\n", ++ getTotalLocks())); ++ ++ for (AbortType type : AbortType.values()) { ++ builder.append(String.format("# rtm lock aborts %s %d\n", ++ type.toString(), getAborts(type))); ++ } ++ return builder.toString(); ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,280 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm; ++ ++import java.io.IOException; ++import java.nio.file.Files; ++import java.nio.file.Paths; ++import java.util.List; ++import java.util.LinkedList; ++import java.util.Arrays; ++import java.util.Collections; ++import java.util.regex.Matcher; ++import java.util.regex.Pattern; ++ ++import com.oracle.java.testlibrary.OutputAnalyzer; ++import com.oracle.java.testlibrary.ProcessTools; ++import com.oracle.java.testlibrary.Utils; ++import com.oracle.java.testlibrary.cli.CommandLineOptionTest; ++ ++/** ++ * Auxiliary methods used for RTM testing. ++ */ ++public class RTMTestBase { ++ private static final String RTM_STATE_CHANGE_REASON = "rtm_state_change"; ++ /** ++ * We don't parse compilation log as XML-document and use regular ++ * expressions instead, because in some cases it could be ++ * malformed. ++ */ ++ private static final String FIRED_UNCOMMON_TRAP_PATTERN_TEMPLATE ++ = "rtm_state_change ++ * installed during compilation. ++ * ++ * @param compilationLogFile a path to file with LogCompilation output. ++ * @return count of installed uncommon traps with reason ++ * rtm_state_change. ++ * @throws IOException ++ */ ++ public static int installedRTMStateChangeTraps(String compilationLogFile) ++ throws IOException { ++ return RTMTestBase.installedUncommonTraps(compilationLogFile, ++ RTMTestBase.RTM_STATE_CHANGE_REASON); ++ } ++ ++ /** ++ * Finds count of fired uncommon traps with reason {@code reason}. ++ * ++ * @param compilationLogFile a path to file with LogCompilation output. ++ * @param reason a reason of fired uncommon traps. ++ * @return count of fired uncommon traps with reason {@code reason}. ++ * @throws IOException ++ */ ++ public static int firedUncommonTraps(String compilationLogFile, ++ String reason) throws IOException { ++ String pattern = String.format( ++ RTMTestBase.FIRED_UNCOMMON_TRAP_PATTERN_TEMPLATE, ++ reason); ++ return RTMTestBase.findTraps(compilationLogFile, pattern); ++ } ++ ++ /** ++ * Finds count of fired uncommon traps with reason rtm_state_change. ++ * ++ * @param compilationLogFile a path to file with LogCompilation output. ++ * @return count of fired uncommon traps with reason ++ * rtm_state_change. ++ * @throws IOException ++ */ ++ public static int firedRTMStateChangeTraps(String compilationLogFile) ++ throws IOException { ++ return RTMTestBase.firedUncommonTraps(compilationLogFile, ++ RTMTestBase.RTM_STATE_CHANGE_REASON); ++ } ++ ++ /** ++ * Finds count of uncommon traps that matches regular ++ * expression in {@code re}. ++ * ++ * @param compilationLogFile a path to file with LogCompilation output. ++ * @param re regular expression to match uncommon traps. ++ * @throws IOException ++ */ ++ private static int findTraps(String compilationLogFile, String re) ++ throws IOException { ++ String compilationLog = RTMTestBase.fileAsString(compilationLogFile); ++ Pattern pattern = Pattern.compile(re); ++ Matcher matcher = pattern.matcher(compilationLog); ++ int traps = 0; ++ while (matcher.find()) { ++ traps++; ++ } ++ return traps; ++ } ++ ++ /** ++ * Returns file's content as a string. ++ * ++ * @param path a path to file to operate on. ++ * @return string with content of file. ++ * @throws IOException ++ */ ++ private static String fileAsString(String path) throws IOException { ++ byte[] fileAsBytes = Files.readAllBytes(Paths.get(path)); ++ return new String(fileAsBytes); ++ } ++ ++ /** ++ * Prepares VM options for test execution. ++ * This method get test java options, filter out all RTM-related options, ++ * adds CompileCommand=compileonly,method_name options for each method ++ * from {@code methodToCompile} and finally appends all {@code vmOpts}. ++ * ++ * @param test test case whose methods that should be compiled. ++ * If {@code null} then no additional compileonly ++ * commands will be added to VM options. ++ * @param vmOpts additional options to pass to VM. ++ * @return Array with VM options. ++ */ ++ private static String[] prepareTestOptions(CompilableTest test, ++ String... vmOpts) { ++ return RTMTestBase.prepareFilteredTestOptions(test, null, vmOpts); ++ } ++ ++ /** ++ * Prepares VM options for test execution. ++ * This method get test java options, filter out all RTM-related options ++ * and all options that matches regexps in {@code additionalFilters}, ++ * adds CompileCommand=compileonly,method_name options for each method ++ * from {@code methodToCompile} and finally appends all {@code vmOpts}. ++ * ++ * @param test test case whose methods that should be compiled. ++ * If {@code null} then no additional compileonly ++ * commands will be added to VM options. ++ * @param additionalFilters array with regular expression that will be ++ * used to filter out test java options. ++ * If {@code null} then no additional filters ++ * will be used. ++ * @param vmOpts additional options to pass to VM. ++ * @return array with VM options. ++ */ ++ private static String[] prepareFilteredTestOptions(CompilableTest test, ++ String[] additionalFilters, String... vmOpts) { ++ List finalVMOpts = new LinkedList<>(); ++ String[] filters; ++ ++ if (additionalFilters != null) { ++ filters = Arrays.copyOf(additionalFilters, ++ additionalFilters.length + 1); ++ } else { ++ filters = new String[1]; ++ } ++ ++ filters[filters.length - 1] = "RTM"; ++ String[] filteredVMOpts = Utils.getFilteredTestJavaOpts(filters); ++ Collections.addAll(finalVMOpts, filteredVMOpts); ++ Collections.addAll(finalVMOpts, "-Xcomp", "-server", ++ "-XX:-TieredCompilation", ++ CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS, ++ CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS, ++ "-XX:+UseRTMLocking"); ++ ++ if (test != null) { ++ for (String method : test.getMethodsToCompileNames()) { ++ finalVMOpts.add("-XX:CompileCommand=compileonly," + method); ++ } ++ } ++ Collections.addAll(finalVMOpts, vmOpts); ++ return finalVMOpts.toArray(new String[finalVMOpts.size()]); ++ } ++ ++ /** ++ * Adds additional options for VM required for successful execution of test. ++ * ++ * @param logFileName a name of compilation log file ++ * @param test a test case to execute ++ * @param options additional options to VM ++ * @return an array with VM options ++ */ ++ private static String[] prepareTestOptions(String logFileName, ++ CompilableTest test, String... options) { ++ String[] preparedOptions = RTMTestBase.prepareFilteredTestOptions( ++ test, ++ new String[] { ++ "LogCompilation", ++ "LogFile" ++ }); ++ List updatedOptions = new LinkedList<>(); ++ Collections.addAll(updatedOptions, preparedOptions); ++ Collections.addAll(updatedOptions, ++ "-XX:+LogCompilation", ++ "-XX:LogFile=" + logFileName); ++ Collections.addAll(updatedOptions, options); ++ ++ return updatedOptions.toArray(new String[updatedOptions.size()]); ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/XAbortProvoker.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/XAbortProvoker.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,62 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * 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 rtm; ++ ++import com.oracle.java.testlibrary.Utils; ++import sun.misc.Unsafe; ++ ++/** ++ * Current RTM locking implementation force transaction abort ++ * before native method call by explicit xabort(0) call. ++ */ ++class XAbortProvoker extends AbortProvoker { ++ // Following field have to be static in order to avoid escape analysis. ++ @SuppressWarnings("UnsuedDeclaration") ++ private static int field = 0; ++ private static final Unsafe UNSAFE = Utils.getUnsafe(); ++ ++ public XAbortProvoker() { ++ this(new Object()); ++ } ++ ++ public XAbortProvoker(Object monitor) { ++ super(monitor); ++ } ++ ++ @Override ++ public void forceAbort() { ++ synchronized(monitor) { ++ XAbortProvoker.field = UNSAFE.addressSize(); ++ } ++ } ++ ++ @Override ++ public String[] getMethodsToCompileNames() { ++ return new String[] { ++ getMethodWithLockName(), ++ Unsafe.class.getName() + "::addressSize" ++ }; ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/predicate/SupportedCPU.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/predicate/SupportedCPU.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm.predicate; ++ ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++import java.util.function.BooleanSupplier; ++ ++public class SupportedCPU implements BooleanSupplier { ++ @Override ++ public boolean getAsBoolean() { ++ return CPUInfo.hasFeature("rtm"); ++ } ++} +--- ./hotspot/test/compiler/testlibrary/rtm/predicate/SupportedVM.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/testlibrary/rtm/predicate/SupportedVM.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package rtm.predicate; ++ ++import com.oracle.java.testlibrary.Platform; ++ ++import java.util.function.BooleanSupplier; ++ ++public class SupportedVM implements BooleanSupplier { ++ @Override ++ public boolean getAsBoolean() { ++ return Platform.isServer() && !Platform.isEmbedded(); ++ } ++} +--- ./hotspot/test/compiler/tiered/NonTieredLevelsTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/tiered/NonTieredLevelsTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -30,7 +30,7 @@ + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:-TieredCompilation + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI +- * -XX:CompileCommand=compileonly,TestCase$Helper::* ++ * -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* + * NonTieredLevelsTest + * @summary Verify that only one level can be used + * @author igor.ignatyev@oracle.com +@@ -59,9 +59,7 @@ + + "TieredCompilation. Skip test."); + return; + } +- for (TestCase test : TestCase.values()) { +- new NonTieredLevelsTest(test).runTest(); +- } ++ CompilerWhiteBoxTest.main(NonTieredLevelsTest::new, args); + } + + private NonTieredLevelsTest(TestCase testCase) { +@@ -72,6 +70,9 @@ + + @Override + protected void test() throws Exception { ++ if (skipXcompOSR()) { ++ return; ++ } + checkNotCompiled(); + compile(); + checkCompiled(); +@@ -80,7 +81,7 @@ + checkLevel(AVAILABLE_COMP_LEVEL, compLevel); + int bci = WHITE_BOX.getMethodEntryBci(method); + deoptimize(); +- if (!testCase.isOsr) { ++ if (!testCase.isOsr()) { + for (int level = 1; level <= COMP_LEVEL_MAX; ++level) { + if (IS_AVAILABLE_COMPLEVEL.test(level)) { + testAvailableLevel(level, bci); +@@ -94,3 +95,4 @@ + } + } + } ++ +--- ./hotspot/test/compiler/tiered/TieredLevelsTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/tiered/TieredLevelsTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -28,7 +28,7 @@ + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+TieredCompilation + * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI +- * -XX:CompileCommand=compileonly,TestCase$Helper::* ++ * -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* + * TieredLevelsTest + * @summary Verify that all levels < 'TieredStopAtLevel' can be used + * @author igor.ignatyev@oracle.com +@@ -40,9 +40,7 @@ + + "TieredCompilation. Skip test."); + return; + } +- for (TestCase test : TestCase.values()) { +- new TieredLevelsTest(test).runTest(); +- } ++ CompilerWhiteBoxTest.main(TieredLevelsTest::new, args); + } + + private TieredLevelsTest(TestCase testCase) { +@@ -53,6 +51,9 @@ + + @Override + protected void test() throws Exception { ++ if (skipXcompOSR()) { ++ return; ++ } + checkNotCompiled(); + compile(); + checkCompiled(); +--- ./hotspot/test/compiler/types/TestMeetTopArrayExactConstantArray.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/TestMeetTopArrayExactConstantArray.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,107 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @bug 8027571 ++ * @summary meet of TopPTR exact array with constant array is not symmetric ++ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseOnStackReplacement -XX:TypeProfileLevel=222 -XX:+UseTypeSpeculation -XX:-BackgroundCompilation TestMeetTopArrayExactConstantArray ++ * ++ */ ++ ++public class TestMeetTopArrayExactConstantArray { ++ ++ static class A { ++ } ++ ++ static class B { ++ } ++ ++ static class C extends A { ++ } ++ ++ static class D extends C { ++ } ++ ++ final static B[] b = new B[10]; ++ ++ static void m0(Object[] o) { ++ if (o.getClass() == Object[].class) { ++ } ++ } ++ ++ static void m1(Object[] o, boolean cond) { ++ if (cond) { ++ o = b; ++ } ++ m0(o); ++ } ++ ++ static void m2(Object[] o, boolean cond1, boolean cond2) { ++ if (cond1) { ++ m1(o, cond2); ++ } ++ } ++ ++ static void m3(C[] o, boolean cond1, boolean cond2, boolean cond3) { ++ if (cond1) { ++ m2(o, cond2, cond3); ++ } ++ } ++ ++ static public void main(String[] args) { ++ A[] a = new A[10]; ++ D[] d = new D[10]; ++ Object[] o = new Object[10]; ++ for (int i = 0; i < 5000; i++) { ++ // record in profiling that the if in m0 succeeds ++ m0(o); ++ // record some profiling for m2 and m1 ++ m2(a, true, (i%2) == 0); ++ // record some profiling for m3 and conflicting profile for m2 ++ m3(d, true, false, (i%2) == 0); ++ } ++ ++ // get m3 compiled. The if in m0 will be optimized because of argument profiling in m3 ++ C[] c = new C[10]; ++ for (int i = 0; i < 20000; i++) { ++ m3(c, true, false, (i%2) == 0); ++ } ++ // make m3 not entrant and the if in m0 fail ++ m3(c, true, true, false); ++ m3(c, true, true, false); ++ m3(c, true, true, false); ++ m3(c, true, true, false); ++ ++ // make m3 recompile, this time with if the not optimized ++ // on entry to m3, argument o is of type C[], profiled C[] ++ // on entry to m1, argument o is of type C[], speculative C[] exact, profiled A[]. Speculative becomes AnyNull ++ // after the if in m1, speculative type of o becomes constant from final field b ++ // the true if branch in m0 does a join between the type of o of speculative type constant from final field b and exact klass Object[] ++ for (int i = 0; i < 20000; i++) { ++ m3(c, true, false, (i%2) == 0); ++ } ++ ++ System.out.println("TEST PASSED"); ++ } ++} +--- ./hotspot/test/compiler/types/TestSpeculationFailedHigherEqual.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/TestSpeculationFailedHigherEqual.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,63 @@ ++/* ++ * 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 8027422 ++ * @summary type methods shouldn't always operate on speculative part ++ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:TypeProfileLevel=222 -XX:+UseTypeSpeculation -XX:-BackgroundCompilation TestSpeculationFailedHigherEqual ++ * ++ */ ++ ++public class TestSpeculationFailedHigherEqual { ++ ++ static class A { ++ void m() {} ++ int i; ++ } ++ ++ static class C extends A { ++ } ++ ++ static C c; ++ ++ static A m1(A a, boolean cond) { ++ // speculative type for a is C not null ++ if (cond ) { ++ a = c; ++ } ++ // speculative type for a is C (may be null) ++ int i = a.i; ++ return a; ++ } ++ ++ static public void main(String[] args) { ++ C c = new C(); ++ TestSpeculationFailedHigherEqual.c = c; ++ for (int i = 0; i < 20000; i++) { ++ m1(c, i%2 == 0); ++ } ++ ++ System.out.println("TEST PASSED"); ++ } ++} +--- ./hotspot/test/compiler/types/TypeSpeculation.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/types/TypeSpeculation.java Wed Jul 30 03:51:43 2014 -0700 +@@ -25,7 +25,7 @@ + * @test + * @bug 8024070 + * @summary Test that type speculation doesn't cause incorrect execution +- * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:TypeProfileLevel=222 TypeSpeculation ++ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:TypeProfileLevel=222 -XX:+UseTypeSpeculation TypeSpeculation + * + */ + +@@ -398,6 +398,133 @@ + return true; + } + ++ // java/lang/Object:AnyNull:exact *,iid=top ++ // meets ++ // stable:bottom[int:max..0]:NotNull * ++ static void test10_4(Object o) { ++ } ++ ++ static void test10_3(Object o, boolean b) { ++ if (b) { ++ test10_4(o); ++ } ++ } ++ ++ static void test10_2(Object o, boolean b1, boolean b2) { ++ if (b1) { ++ test10_3(o, b2); ++ } ++ } ++ ++ static void test10_1(B[] b, boolean b1, boolean b2) { ++ test10_2(b, b1, b2); ++ } ++ ++ static boolean test10() { ++ Object o = new Object(); ++ A[] a = new A[10]; ++ B[] b = new B[10]; ++ B[] c = new C[10]; ++ for (int i = 0; i < 20000; i++) { ++ test10_1(b, false, false); ++ test10_1(c, false, false); ++ test10_2(a, true, false); ++ test10_3(o, true); ++ } ++ return true; ++ } ++ ++ // stable:TypeSpeculation$B:TopPTR *,iid=top[int:max..0]:TopPTR *,iid=top ++ // meets ++ // java/lang/Object:AnyNull:exact *,iid=top ++ static void test11_3(Object o) { ++ } ++ ++ static void test11_2(Object o, boolean b) { ++ if (b) { ++ test11_3(o); ++ } ++ } ++ ++ static void test11_1(B[] b, boolean bb) { ++ test11_2(b, bb); ++ } ++ ++ static boolean test11() { ++ Object o = new Object(); ++ B[] b = new B[10]; ++ B[] c = new C[10]; ++ for (int i = 0; i < 20000; i++) { ++ test11_1(b, false); ++ test11_1(c, false); ++ test11_2(o, true); ++ } ++ return true; ++ } ++ ++ // TypeSpeculation$I * ++ // meets ++ // java/lang/Object:AnyNull *,iid=top ++ static void test12_3(Object o) { ++ } ++ ++ static void test12_2(Object o, boolean b) { ++ if (b) { ++ test12_3(o); ++ } ++ } ++ ++ static void test12_1(I i, boolean b) { ++ test12_2(i, b); ++ } ++ ++ static boolean test12() { ++ Object o = new Object(); ++ B b = new B(); ++ C c = new C(); ++ for (int i = 0; i < 20000; i++) { ++ test12_1(b, false); ++ test12_1(c, false); ++ test12_2(o, true); ++ } ++ return true; ++ } ++ ++ // stable:bottom[int:max..0]:NotNull * ++ // meets ++ // stable:TypeSpeculation$A:TopPTR *,iid=top[int:max..0]:AnyNull:exact *,iid=top ++ static Object test13_3(Object o, boolean b) { ++ Object oo; ++ if (b) { ++ oo = o; ++ } else { ++ oo = new A[10]; ++ } ++ return oo; ++ } ++ ++ static void test13_2(Object o, boolean b1, boolean b2) { ++ if (b1) { ++ test13_3(o, b2); ++ } ++ } ++ ++ static void test13_1(B[] b, boolean b1, boolean b2) { ++ test13_2(b, b1, b2); ++ } ++ ++ static boolean test13() { ++ A[] a = new A[10]; ++ B[] b = new B[10]; ++ B[] c = new C[10]; ++ for (int i = 0; i < 20000; i++) { ++ test13_1(b, false, false); ++ test13_1(c, false, false); ++ test13_2(a, true, (i%2) == 0); ++ } ++ return true; ++ } ++ + static public void main(String[] args) { + boolean success = true; + +@@ -419,6 +546,14 @@ + + success = test9() && success; + ++ success = test10() && success; ++ ++ success = test11() && success; ++ ++ success = test12() && success; ++ ++ success = test13() && success; ++ + if (success) { + System.out.println("TEST PASSED"); + } else { +--- ./hotspot/test/compiler/types/correctness/CorrectnessTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/CorrectnessTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,159 @@ ++/* ++ * 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 CorrectnessTest ++ * @bug 8038418 ++ * @library /testlibrary /testlibrary/whitebox ++ * @compile execution/TypeConflict.java execution/TypeProfile.java ++ * execution/MethodHandleDelegate.java ++ * @build CorrectnessTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:TypeProfileLevel=222 -XX:+UseTypeSpeculation ++ * -XX:CompileCommand=exclude,execution/*::methodNotToCompile ++ * -XX:CompileCommand=dontinline,scenarios/Scenario::collectReturnType ++ * CorrectnessTest RETURN ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:TypeProfileLevel=222 -XX:+UseTypeSpeculation ++ * -XX:CompileCommand=exclude,execution/*::methodNotToCompile ++ * -XX:CompileCommand=dontinline,scenarios/Scenario::collectReturnType ++ * CorrectnessTest PARAMETERS ++ * @run main/othervm -Xbootclasspath/a:. -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockExperimentalVMOptions ++ * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ++ * -XX:TypeProfileLevel=222 -XX:+UseTypeSpeculation ++ * -XX:CompileCommand=exclude,execution/*::methodNotToCompile ++ * -XX:CompileCommand=dontinline,scenarios/Scenario::collectReturnType ++ * CorrectnessTest ARGUMENTS ++ * @summary Tests correctness of type usage with type profiling and speculations ++ */ ++ ++import com.oracle.java.testlibrary.Asserts; ++import com.oracle.java.testlibrary.Platform; ++import execution.Execution; ++import execution.MethodHandleDelegate; ++import execution.TypeConflict; ++import execution.TypeProfile; ++import hierarchies.*; ++import scenarios.*; ++import sun.hotspot.WhiteBox; ++ ++import java.lang.reflect.Constructor; ++import java.lang.reflect.Method; ++import java.util.ArrayList; ++import java.util.List; ++import java.util.function.BiFunction; ++ ++public class CorrectnessTest { ++ private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); ++ ++ public static void main(String[] args) { ++ if (!Platform.isServer()) { ++ System.out.println("ALL TESTS SKIPPED"); ++ } ++ Asserts.assertGTE(args.length, 1); ++ ProfilingType profilingType = ProfilingType.valueOf(args[0]); ++ if (runTests(profilingType)) { ++ System.out.println("ALL TESTS PASSED"); ++ } else { ++ throw new RuntimeException("SOME TESTS FAILED"); ++ } ++ } ++ ++ @SuppressWarnings("unchecked") ++ public static boolean runTests(ProfilingType profilingType) { ++ boolean result = true; ++ ++ List executionList = new ArrayList<>(); ++ executionList.add(new TypeConflict()); ++ executionList.add(new TypeProfile()); ++ for (int i = 0, n = executionList.size(); i < n; i++) { ++ executionList.add(new MethodHandleDelegate(executionList.get(i))); ++ } ++ ++ List hierarchyList = new ArrayList<>(); ++ hierarchyList.add(new DefaultMethodInterface.Hierarchy()); ++ hierarchyList.add(new DefaultMethodInterface2.Hierarchy()); ++ hierarchyList.add(new Linear.Hierarchy()); ++ hierarchyList.add(new Linear2.Hierarchy()); ++ hierarchyList.add(new OneRank.Hierarchy()); ++ for (int i = 0, n = hierarchyList.size(); i < n; i++) { ++ hierarchyList.add(new NullableType(hierarchyList.get(i))); ++ } ++ ++ List>> testCasesConstructors ++ = new ArrayList<>(); ++ testCasesConstructors.add(ArrayCopy::new); ++ testCasesConstructors.add(ArrayReferenceStore::new); ++ testCasesConstructors.add(ClassIdentity::new); ++ testCasesConstructors.add(ClassInstanceOf::new); ++ testCasesConstructors.add(ClassIsInstance::new); ++ testCasesConstructors.add(ReceiverAtInvokes::new); ++ testCasesConstructors.add(CheckCast::new); ++ ++ for (TypeHierarchy hierarchy : hierarchyList) { ++ for (BiFunction> constructor : testCasesConstructors) { ++ for (Execution execution : executionList) { ++ Scenario scenario = constructor.apply(profilingType, hierarchy); ++ if (scenario.isApplicable()) { ++ result &= executeTest(hierarchy, execution, scenario); ++ } ++ } ++ } ++ } ++ return result; ++ } ++ ++ /** ++ * Executes test case ++ * ++ * @param hierarchy type hierarchy for the test ++ * @param execution execution scenario ++ * @param scenario test scenario executed with given Execution ++ */ ++ private static boolean executeTest(TypeHierarchy hierarchy, Execution execution, Scenario scenario) { ++ boolean testCaseResult = false; ++ String testName = hierarchy.getClass().getName() + " :: " + scenario.getName() + " @ " + execution.getName(); ++ clearAllMethodsState(scenario.getClass()); ++ try { ++ execution.execute(scenario); ++ testCaseResult = true; ++ } catch (Exception e) { ++ System.err.println(testName + " failed with exception " + e); ++ e.printStackTrace(); ++ } ++ System.out.println((testCaseResult ? "PASSED: " : "FAILED: ") + testName); ++ return testCaseResult; ++ } ++ ++ private static void clearAllMethodsState(Class aClass) { ++ while (aClass != null) { ++ for (Method m : aClass.getDeclaredMethods()) { ++ WHITE_BOX.clearMethodState(m); ++ } ++ aClass = aClass.getSuperclass(); ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/OffTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/OffTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,108 @@ ++/* ++ * 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 CorrectnessTest ++ * @bug 8038418 ++ * @library /testlibrary /testlibrary/whitebox ++ * @compile execution/TypeConflict.java execution/TypeProfile.java ++ * execution/MethodHandleDelegate.java ++ * @build CorrectnessTest ++ * @build OffTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/timeout=1200 OffTest ++ */ ++ ++import com.oracle.java.testlibrary.OutputAnalyzer; ++import com.oracle.java.testlibrary.ProcessTools; ++import scenarios.ProfilingType; ++ ++import java.util.Random; ++ ++public class OffTest { ++ private static final String[] OPTIONS = { ++ "-Xbootclasspath/a:.", ++ "-XX:+IgnoreUnrecognizedVMOptions", ++ "-XX:+UnlockExperimentalVMOptions", ++ "-XX:+UnlockDiagnosticVMOptions", ++ "-XX:+WhiteBoxAPI", ++ "-XX:CompileCommand=exclude,execution/*::methodNotToCompile", ++ "-XX:CompileCommand=dontinline,scenarios/Scenario::collectReturnType", ++ "", // -XX:TypeProfileLevel=? ++ "", // -XX:?UseTypeSpeculation ++ CorrectnessTest.class.getName(), ++ "", // ProfilingType.name() ++ }; ++ ++ private static final String TYPE_PROFILE_LEVEL = "TypeProfileLevel"; ++ private static final String USE_TYPE_SPECULATION = "UseTypeSpeculation"; ++ private static final int TYPE_PROFILE_LEVEL_LENGTH = 3; ++ private static final int TYPE_PROFILE_LEVEL_BOUND = 3; ++ private static final int DEFAULT_COUNT = 10; ++ private static final int PROFILING_TYPE_INDEX = OPTIONS.length - 1; ++ private static final int TYPE_PROFILE_INDEX = OPTIONS.length - 4; ++ private static final int USE_TYPE_SPECULATION_INDEX = OPTIONS.length - 3; ++ private static final Random RNG; ++ ++ static { ++ String str = System.getProperty("seed"); ++ long seed = str != null ? Long.parseLong(str) : new Random().nextLong(); ++ RNG = new Random(seed); ++ System.out.printf("-Dseed=%d%n", seed); ++ } ++ ++ public static void main(String[] args) throws Exception { ++ int count = DEFAULT_COUNT; ++ if (args.length > 0) { ++ count = Integer.parseInt(args[0]) ; ++ } ++ for (int i = 0; i < count; ++i) { ++ runTest(); ++ } ++ } ++ ++ private static void runTest() throws Exception { ++ String useTypeSpeculation = "-XX:" + (RNG.nextBoolean() ? "+" : "-") + USE_TYPE_SPECULATION; ++ String typeProfileLevel = "-XX:" + TYPE_PROFILE_LEVEL + "=" + randomTypeProfileLevel(); ++ ProfilingType type = randomProfileType(); ++ OPTIONS[TYPE_PROFILE_INDEX] = typeProfileLevel; ++ OPTIONS[USE_TYPE_SPECULATION_INDEX] = useTypeSpeculation; ++ OPTIONS[PROFILING_TYPE_INDEX] = type.name(); ++ ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(/* addTestVmOptions= */ true, OPTIONS); ++ OutputAnalyzer outputAnalyzer = new OutputAnalyzer(processBuilder.start()); ++ outputAnalyzer.shouldHaveExitValue(0); ++ } ++ ++ private static ProfilingType randomProfileType() { ++ ProfilingType[] value = ProfilingType.values(); ++ return value[RNG.nextInt(value.length)]; ++ } ++ ++ private static String randomTypeProfileLevel() { ++ StringBuilder stringBuilder = new StringBuilder(); ++ for (int i = 0; i < TYPE_PROFILE_LEVEL_LENGTH; ++i) { ++ stringBuilder.append(RNG.nextInt(TYPE_PROFILE_LEVEL_BOUND)); ++ } ++ return stringBuilder.toString(); ++ } ++} +--- ./hotspot/test/compiler/types/correctness/execution/Execution.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/execution/Execution.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ */ ++package execution; ++ ++import hierarchies.TypeHierarchy; ++import scenarios.Scenario; ++ ++/** ++ * Execution scenario represents test methods execution type. ++ * @param parameter type ++ * @param result Type ++ */ ++public interface Execution { ++ /** ++ * Executes the test code of the given scenario ++ * See {@link scenarios.Scenario#run(T)} ++ * ++ * @param scenario test scenario ++ */ ++ void execute(Scenario scenario); ++ ++ default String getName() { ++ return this.getClass().getName(); ++ } ++} +--- ./hotspot/test/compiler/types/correctness/execution/MethodHandleDelegate.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/execution/MethodHandleDelegate.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,105 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package execution; ++ ++import hierarchies.TypeHierarchy; ++import scenarios.Scenario; ++ ++import java.lang.invoke.MethodHandle; ++import java.lang.invoke.MethodHandles; ++import java.lang.invoke.MethodType; ++ ++/** ++ * Executes test scenario using {@link MethodHandle#invoke(Object...)}. ++ * Delegates execution to the given {@link Execution} by creating ++ * new test scenario, see {@link Scenario} ++ */ ++public class MethodHandleDelegate implements Execution { ++ private final Execution delegate; ++ ++ public MethodHandleDelegate(Execution delegate) { ++ this.delegate = delegate; ++ } ++ ++ @Override ++ public void execute(Scenario scenario) { ++ delegate.execute(new MHScenario(scenario)); ++ } ++ ++ @Override ++ public String getName() { ++ return "MethodHandleDelegate # " + delegate.getName(); ++ } ++ ++ private static class MHScenario extends Scenario { ++ private final Scenario scenario; ++ private static final MethodHandle METHOD_HANDLE_RUN; ++ ++ static { ++ MethodHandles.Lookup lookup = MethodHandles.lookup(); ++ MethodType methodType = MethodType.methodType(Object.class, TypeHierarchy.I.class); ++ ++ try { ++ METHOD_HANDLE_RUN = lookup.findVirtual(Scenario.class, "run", methodType); ++ } catch (NoSuchMethodException | IllegalAccessException e) { ++ System.err.println("Failed to get target method run() with " + e); ++ e.printStackTrace(); ++ throw new RuntimeException(e); ++ } ++ } ++ ++ /** ++ * Constructor ++ * ++ * @param scenario test scenario to be executed ++ */ ++ private MHScenario(Scenario scenario) { ++ super("MethodHandle::" + scenario.getName(), scenario.profilingType, scenario.hierarchy); ++ this.scenario = scenario; ++ } ++ ++ /** ++ * Runs {@link Scenario#run(T)} with {@link MethodHandle#invoke(Object...)} ++ * ++ * @param t subject of the test ++ * @return result of the underlying {@link Scenario#run(T)} invocation ++ */ ++ @SuppressWarnings("unchecked") ++ @Override ++ public R run(T t) { ++ try { ++ return (R) METHOD_HANDLE_RUN.invoke(scenario, t); ++ } catch (Throwable thr) { ++ System.err.println(scenario.getName() ++ + " failed to invoke target method run() with " + thr); ++ throw new RuntimeException("Invocation failed", thr); ++ } ++ } ++ ++ @Override ++ public void check(R r, T t) { ++ scenario.check(r, t); ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/execution/TypeConflict.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/execution/TypeConflict.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,74 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package execution; ++ ++import hierarchies.TypeHierarchy; ++import scenarios.Scenario; ++ ++/** ++ * Type profiling conflict execution scenario. The main goal is ++ * to make compiler profile and compile methods with different types. ++ * Scenario tests guards by passing conflicting types (incompatible ++ * for the profiled data). ++ */ ++public class TypeConflict implements Execution { ++ /** Test methods execution number to make profile */ ++ private final static int POLLUTION_THRESHOLD = 5000; ++ /** Test methods execution number to make it profiled and compiled*/ ++ private final static int PROFILE_THRESHOLD = 20000; ++ ++ @Override ++ public void execute(Scenario scenario) { ++ T base = scenario.getProfiled(); ++ T incompatible = scenario.getConflict(); ++ ++ // pollute profile by passing different types ++ R baseResult = null; ++ R incResult = null; ++ for (int i = 0; i < POLLUTION_THRESHOLD; i++) { ++ baseResult = methodNotToCompile(scenario, base); ++ incResult = methodNotToCompile(scenario, incompatible); ++ } ++ scenario.check(baseResult, base); ++ scenario.check(incResult, incompatible); ++ ++ // profile and compile ++ R result = null; ++ for (int i = 0; i < PROFILE_THRESHOLD; i++) { ++ result = methodNotToCompile(scenario, base); ++ } ++ scenario.check(result, base); ++ ++ // pass another type to make guard work and recompile ++ for (int i = 0; i < PROFILE_THRESHOLD; i++) { ++ result = methodNotToCompile(scenario, incompatible); ++ } ++ scenario.check(result, incompatible); ++ } ++ ++ private R methodNotToCompile(Scenario scenario, T t) { ++ return scenario.run(t); ++ } ++} ++ +--- ./hotspot/test/compiler/types/correctness/execution/TypeProfile.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/execution/TypeProfile.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,59 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package execution; ++ ++import hierarchies.TypeHierarchy; ++import scenarios.Scenario; ++ ++/** ++ * Profile type execution scenario. Executes tester method ++ * in a loop without any manipulation with types or instances. ++ */ ++public class TypeProfile implements Execution { ++ /** Number of test method execution to make it profiled and compiled */ ++ private final static int PROFILE_THRESHOLD = 100000; ++ ++ /** ++ * Makes scenario code be profiled and compiled ++ * @param scenario Test scenario ++ */ ++ @Override ++ public void execute(Scenario scenario) { ++ R result = null; ++ T prof = scenario.getProfiled(); ++ T confl = scenario.getConflict(); ++ ++ for (int i = 0; i < PROFILE_THRESHOLD; i++) { ++ result = methodNotToCompile(scenario, prof); ++ } ++ scenario.check(result, prof); ++ ++ result = methodNotToCompile(scenario, confl); ++ scenario.check(result, confl); ++ } ++ ++ protected R methodNotToCompile(Scenario scenario, T t) { ++ return scenario.run(t); ++ } ++} +--- ./hotspot/test/compiler/types/correctness/hierarchies/DefaultMethodInterface.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/hierarchies/DefaultMethodInterface.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,54 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package hierarchies; ++ ++public class DefaultMethodInterface { ++ private DefaultMethodInterface() { ++ } ++ ++ public static class Hierarchy ++ extends TypeHierarchy { ++ public Hierarchy() { ++ super(new DefaultMethodInterface.A(), new DefaultMethodInterface.B(), ++ DefaultMethodInterface.A.class, DefaultMethodInterface.B.class); ++ } ++ } ++ ++ public static interface I2 extends TypeHierarchy.I { ++ default int m() { ++ return TypeHierarchy.ANSWER; ++ } ++ } ++ ++ public static class A implements I2 { ++ // use default method from I2 ++ } ++ ++ public static class B extends A { ++ @Override ++ public int m() { ++ return TypeHierarchy.YEAR; ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/hierarchies/DefaultMethodInterface2.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/hierarchies/DefaultMethodInterface2.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ */ ++ ++package hierarchies; ++ ++public class DefaultMethodInterface2 { ++ private DefaultMethodInterface2() { ++ } ++ ++ public static class Hierarchy ++ extends TypeHierarchy { ++ public Hierarchy() { ++ super(new TypeHierarchy.A(), new DefaultMethodInterface2.B(), ++ TypeHierarchy.A.class, DefaultMethodInterface2.B.class); ++ } ++ } ++ ++ public static interface I2 extends TypeHierarchy.I { ++ default int m() { ++ return TypeHierarchy.ANSWER; ++ } ++ } ++ ++ public static class B implements I2 { ++ // default method I2.m() ++ } ++} +--- ./hotspot/test/compiler/types/correctness/hierarchies/Linear.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/hierarchies/Linear.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,43 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package hierarchies; ++ ++public class Linear { ++ private Linear() { ++ } ++ ++ public static class Hierarchy extends TypeHierarchy { ++ public Hierarchy() { ++ super(new TypeHierarchy.A(), new Linear.B(), ++ TypeHierarchy.A.class, Linear.B.class); ++ } ++ } ++ ++ public static class B extends TypeHierarchy.A { ++ @Override ++ public int m() { ++ return TypeHierarchy.YEAR; ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/hierarchies/Linear2.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/hierarchies/Linear2.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ */ ++ ++package hierarchies; ++ ++public class Linear2 { ++ private Linear2() { ++ } ++ ++ public static class Hierarchy extends TypeHierarchy { ++ public Hierarchy() { ++ super(new A(), new Linear2.B(), ++ A.class, Linear2.B.class); ++ } ++ } ++ ++ public static interface I2 { ++ int m(); ++ } ++ ++ public static class B extends TypeHierarchy.A implements Linear2.I2 { ++ @Override ++ public int m() { ++ return TypeHierarchy.YEAR; ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/hierarchies/NullableType.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/hierarchies/NullableType.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,33 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package hierarchies; ++ ++public class NullableType ++ extends TypeHierarchy { ++ ++ public NullableType(TypeHierarchy delegate) { ++ super(delegate.getM(), null, ++ delegate.getClassM(), delegate.getClassN()); ++ } ++} +--- ./hotspot/test/compiler/types/correctness/hierarchies/OneRank.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/hierarchies/OneRank.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,44 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package hierarchies; ++ ++public class OneRank { ++ private OneRank() { ++ } ++ ++ public static class Hierarchy extends TypeHierarchy { ++ public Hierarchy() { ++ super(new TypeHierarchy.A(), new OneRank.B(), ++ TypeHierarchy.A.class, OneRank.B.class); ++ } ++ } ++ ++ public static class B implements TypeHierarchy.I { ++ @Override ++ public int m() { ++ return TypeHierarchy.YEAR; ++ } ++ } ++ ++} +--- ./hotspot/test/compiler/types/correctness/hierarchies/TypeHierarchy.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/hierarchies/TypeHierarchy.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ */ ++ ++package hierarchies; ++ ++/** ++ * Type hierarchy contains classes the type profiling and speculation are tested with ++ */ ++public abstract class TypeHierarchy { ++ // Magic numbers ++ public static final int ANSWER = 42; ++ public static final int TEMP = 451; ++ public static final int YEAR = 1984; ++ ++ private final M m; ++ private final N n; ++ private final Class classM; ++ private final Class classN; ++ ++ protected TypeHierarchy(M m, N n, Class classM, Class classN) { ++ this.m = m; ++ this.n = n; ++ this.classM = classM; ++ this.classN = classN; ++ } ++ ++ public final M getM() { ++ return m; ++ } ++ ++ public final N getN() { ++ return n; ++ } ++ ++ public final Class getClassM() { ++ return classM; ++ } ++ ++ public final Class getClassN() { ++ return classN; ++ } ++ ++ public interface I { ++ int m(); ++ } ++ ++ public static class A implements I { ++ @Override ++ public int m() { ++ return TypeHierarchy.ANSWER; ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/ArrayCopy.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/ArrayCopy.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package scenarios; ++ ++import hierarchies.TypeHierarchy; ++ ++import java.util.Arrays; ++ ++/** ++ * Tests System.arraycopy() ++ */ ++public class ArrayCopy extends ArrayScenario { ++ public ArrayCopy(ProfilingType profilingType, ++ TypeHierarchy hierarchy) { ++ super("ArrayCopy", profilingType, hierarchy); ++ } ++ ++ /** ++ * @param obj is used to fill arrays ++ * @return the same obj ++ */ ++ @Override ++ public TypeHierarchy.I run(TypeHierarchy.I obj) { ++ switch (profilingType) { ++ case RETURN: ++ TypeHierarchy.I t = collectReturnType(obj); ++ Arrays.fill(array, t); ++ System.arraycopy(array, 0, matrix[0], 0, array.length); ++ return array[0]; ++ case ARGUMENTS: ++ field = obj; ++ Arrays.fill(array, field); ++ System.arraycopy(array, 0, matrix[0], 0, array.length); ++ return array[0]; ++ case PARAMETERS: ++ Arrays.fill(array, obj); ++ System.arraycopy(array, 0, matrix[0], 0, array.length); ++ return array[0]; ++ } ++ throw new RuntimeException("Should not reach here"); ++ } ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/ArrayReferenceStore.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/ArrayReferenceStore.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package scenarios; ++ ++import hierarchies.TypeHierarchy; ++ ++import java.util.Arrays; ++ ++/** ++ * Tests aastore bytecode ++ */ ++public class ArrayReferenceStore extends ArrayScenario { ++ public ArrayReferenceStore(ProfilingType profilingType, ++ TypeHierarchy hierarchy) { ++ super("ArrayReferenceStore", profilingType, hierarchy); ++ } ++ ++ /** ++ * @param obj is used to fill arrays ++ * @return obj ++ */ ++ @Override ++ public TypeHierarchy.I run(TypeHierarchy.I obj) { ++ switch (profilingType) { ++ case RETURN: ++ TypeHierarchy.I t = collectReturnType(obj); ++ Arrays.fill(array, t); ++ matrix[0] = array; ++ return matrix[0][0]; ++ case ARGUMENTS: ++ field = obj; ++ Arrays.fill(array, field); ++ matrix[0] = array; ++ return matrix[0][0]; ++ case PARAMETERS: ++ Arrays.fill(array, obj); ++ matrix[0] = array; ++ return matrix[0][0]; ++ } ++ throw new RuntimeException("Should not reach here"); ++ } ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/ArrayScenario.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/ArrayScenario.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,68 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package scenarios; ++ ++import com.oracle.java.testlibrary.Asserts; ++import hierarchies.TypeHierarchy; ++ ++import java.lang.reflect.Array; ++import java.util.Arrays; ++ ++/** ++ * Base class for array scenarios ++ */ ++public abstract class ArrayScenario extends Scenario { ++ protected final TypeHierarchy.I[] array; ++ protected final TypeHierarchy.I[][] matrix; ++ ++ protected ArrayScenario(String name, ProfilingType profilingType, ++ TypeHierarchy hierarchy) { ++ super(name, profilingType, hierarchy); ++ final int x = 20; ++ final int y = 10; ++ ++ TypeHierarchy.I prof = hierarchy.getM(); ++ TypeHierarchy.I confl = hierarchy.getN(); ++ ++ this.array = (TypeHierarchy.I[]) Array.newInstance(hierarchy.getClassM(), y); ++ Arrays.fill(array, prof); ++ ++ this.matrix = (TypeHierarchy.I[][]) Array.newInstance(hierarchy.getClassM(), x, y); ++ for (int i = 0; i < x; i++) { ++ this.matrix[i] = this.array; ++ } ++ ++ Asserts.assertEquals(array.length, matrix[0].length, "Invariant"); ++ } ++ ++ @Override ++ public boolean isApplicable() { ++ return hierarchy.getClassM().isAssignableFrom(hierarchy.getClassN()); ++ } ++ ++ @Override ++ public void check(TypeHierarchy.I res, TypeHierarchy.I orig) { ++ Asserts.assertEquals(res, orig, "Check failed"); ++ } ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/CheckCast.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/CheckCast.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,77 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package scenarios; ++ ++import com.oracle.java.testlibrary.Asserts; ++import hierarchies.TypeHierarchy; ++ ++import java.util.Objects; ++ ++/** ++ * Checkcast scenario ++ * @param profiling parameter ++ */ ++public class CheckCast extends Scenario { ++ public CheckCast(ProfilingType profilingType, TypeHierarchy hierarchy) { ++ super("CheckCast", profilingType, hierarchy); ++ } ++ ++ /** ++ * Returns type profiling. ++ * @param obj is a profiled parameter for the test ++ * @return parameter casted to the type R ++ */ ++ @Override ++ public Integer run(T obj) { ++ switch (profilingType) { ++ case RETURN: ++ T t = collectReturnType(obj); ++ if (t != null) { ++ return t.m(); ++ } ++ return null; ++ case ARGUMENTS: ++ field = obj; ++ if (field != null) { ++ return field.m(); ++ } ++ return null; ++ case PARAMETERS: ++ if (obj != null) { ++ return obj.m(); ++ } ++ return null; ++ } ++ throw new RuntimeException("Should not reach here"); ++ } ++ ++ @Override ++ public void check(Integer result, T orig) { ++ if (result != null || orig != null) { ++ Objects.requireNonNull(result); ++ Objects.requireNonNull(orig); ++ Asserts.assertEquals(result, orig.m(), "Results mismatch"); ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/ClassIdentity.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/ClassIdentity.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ */ ++ ++package scenarios; ++ ++import com.oracle.java.testlibrary.Asserts; ++import hierarchies.TypeHierarchy; ++ ++/** ++ * Tests pattern: if (a.getClass() == D.class) ++ */ ++public class ClassIdentity extends Scenario { ++ public ClassIdentity(ProfilingType profilingType, ++ TypeHierarchy hierarchy) { ++ super("ClassIdentity", profilingType, hierarchy); ++ } ++ ++ @Override ++ public boolean isApplicable() { ++ return hierarchy.getM() != null && hierarchy.getN() != null; ++ } ++ ++ @Override ++ public Integer run(T obj) { ++ switch (profilingType) { ++ case RETURN: ++ T t = collectReturnType(obj); ++ if (t.getClass() == TypeHierarchy.A.class) { ++ return inlinee(t); ++ } ++ return TypeHierarchy.TEMP; ++ case ARGUMENTS: ++ field = obj; ++ if (field.getClass() == TypeHierarchy.A.class) { ++ return inlinee(field); ++ } ++ return TypeHierarchy.TEMP; ++ case PARAMETERS: ++ if (obj.getClass() == TypeHierarchy.A.class) { ++ return inlinee(obj); ++ } ++ return TypeHierarchy.TEMP; ++ } ++ throw new RuntimeException("Should not reach here"); ++ } ++ ++ public int inlinee(T obj) { ++ return obj.m(); ++ } ++ ++ @Override ++ public void check(Integer result, T orig) { ++ if (orig.getClass() == TypeHierarchy.A.class) { ++ Asserts.assertEquals(result, orig.m(), ++ "Results are not equal for TypeHierarchy.A.class"); ++ } else { ++ Asserts.assertEquals(result, TypeHierarchy.TEMP, "Result differs from expected"); ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/ClassInstanceOf.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/ClassInstanceOf.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,74 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package scenarios; ++ ++import com.oracle.java.testlibrary.Asserts; ++import hierarchies.TypeHierarchy; ++ ++/** ++ * Tests instanceof ++ */ ++public class ClassInstanceOf extends Scenario { ++ public ClassInstanceOf(ProfilingType profilingType, ++ TypeHierarchy hierarchy) { ++ super("ClassInstanceOf", profilingType, hierarchy); ++ } ++ ++ @Override ++ public Integer run(T obj) { ++ switch (profilingType) { ++ case RETURN: ++ T t = collectReturnType(obj); ++ if (t instanceof TypeHierarchy.A) { ++ return inlinee(t); ++ } ++ return TypeHierarchy.TEMP; ++ case ARGUMENTS: ++ field = obj; ++ if (field instanceof TypeHierarchy.A) { ++ return inlinee(field); ++ } ++ return TypeHierarchy.TEMP; ++ case PARAMETERS: ++ if (obj instanceof TypeHierarchy.A) { ++ return inlinee(obj); ++ } ++ return TypeHierarchy.TEMP; ++ } ++ throw new RuntimeException("Should not reach here"); ++ } ++ ++ public int inlinee(T obj) { ++ return obj.m(); ++ } ++ ++ @Override ++ public void check(Integer result, T orig) { ++ if (orig instanceof TypeHierarchy.A) { ++ Asserts.assertEquals(result, orig.m(), "Results are not equal for TypeHierarchy.A"); ++ } else { ++ Asserts.assertEquals(result, TypeHierarchy.TEMP, "Result differs from expected"); ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/ClassIsInstance.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/ClassIsInstance.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,77 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package scenarios; ++ ++import com.oracle.java.testlibrary.Asserts; ++import hierarchies.TypeHierarchy; ++ ++/** ++ * Tests {@link Class#isInstance(Object)} ++ */ ++public class ClassIsInstance extends Scenario { ++ private final Class baseClass; ++ ++ public ClassIsInstance(ProfilingType profilingType, ++ TypeHierarchy hierarchy) { ++ super("ClassIsInstance", profilingType, hierarchy); ++ this.baseClass = hierarchy.getClassM(); ++ } ++ ++ @Override ++ public Integer run(T obj) { ++ switch (profilingType) { ++ case RETURN: ++ T t = collectReturnType(obj); ++ if (baseClass.isInstance(t)) { ++ return inlinee(t); ++ } ++ return TypeHierarchy.TEMP; ++ case ARGUMENTS: ++ field = obj; ++ if (baseClass.isInstance(field)) { ++ return inlinee(field); ++ } ++ return TypeHierarchy.TEMP; ++ case PARAMETERS: ++ if (baseClass.isInstance(obj)) { ++ return inlinee(obj); ++ } ++ return TypeHierarchy.TEMP; ++ } ++ throw new RuntimeException("Should not reach here"); ++ } ++ ++ public int inlinee(T obj) { ++ return obj.m(); ++ } ++ ++ @Override ++ public void check(Integer result, T orig) { ++ if (baseClass.isInstance(orig)) { ++ Asserts.assertEquals(result, orig.m(), "Results are not equal for base class"); ++ } else { ++ Asserts.assertEquals(result, TypeHierarchy.TEMP, "Result differs from expected"); ++ } ++ } ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/ProfilingType.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/ProfilingType.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,33 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package scenarios; ++ ++public enum ProfilingType { ++ /** type profiling of return values of reference types from an invoke */ ++ RETURN, ++ /** type profiling for reference parameters on method entries */ ++ PARAMETERS, ++ /** type profiling for reference arguments at an invoke */ ++ ARGUMENTS, ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/ReceiverAtInvokes.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/ReceiverAtInvokes.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,74 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package scenarios; ++ ++import com.oracle.java.testlibrary.Asserts; ++import hierarchies.TypeHierarchy; ++ ++/** ++ * Receiver at invokes profiling and speculation ++ * ++ * @param parameter to be returned ++ */ ++public class ReceiverAtInvokes extends Scenario { ++ public ReceiverAtInvokes(ProfilingType profilingType, ++ TypeHierarchy hierarchy) { ++ super("ReceiverAtInvokes", profilingType, hierarchy); ++ } ++ ++ @Override ++ public boolean isApplicable() { ++ return hierarchy.getM() != null && hierarchy.getN() != null; ++ } ++ ++ /** ++ * Receiver profiling ++ * ++ * @param obj is a profiled parameter for the test ++ * @return parameter casted to the type R ++ */ ++ @Override ++ public Integer run(T obj) { ++ switch (profilingType) { ++ case RETURN: ++ T t = collectReturnType(obj); ++ return inlinee(t); ++ case ARGUMENTS: ++ field = obj; ++ return inlinee(field); ++ case PARAMETERS: ++ return inlinee(obj); ++ } ++ throw new RuntimeException("Should not reach here"); ++ } ++ ++ private Integer inlinee(T obj) { ++ return obj.m(); // should be inlined ++ } ++ ++ @Override ++ public void check(Integer result, T orig) { ++ Asserts.assertEquals(result, orig.m(), "Results mismatch"); ++ } ++} +--- ./hotspot/test/compiler/types/correctness/scenarios/Scenario.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/types/correctness/scenarios/Scenario.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,108 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package scenarios; ++ ++import hierarchies.TypeHierarchy; ++ ++/** ++ * Test scenario ++ * ++ * @param parameter type ++ * @param result type ++ */ ++public abstract class Scenario { ++ ++ private final String name; ++ public final ProfilingType profilingType; ++ public final TypeHierarchy hierarchy; ++ protected volatile T field; ++ ++ /** ++ * Constructor ++ * ++ * @param name scenario name ++ * @param profilingType tested profiling type ++ * @param hierarchy type hierarchy ++ */ ++ protected Scenario(String name, ProfilingType profilingType, ++ TypeHierarchy hierarchy) { ++ this.profilingType = profilingType; ++ this.name = name + " # " + profilingType.name(); ++ this.hierarchy = hierarchy; ++ } ++ ++ /** ++ * Returns the object which should be used as a parameter ++ * for the methods used for profile data ++ * ++ * @return profiled type object ++ */ ++ public T getProfiled() { ++ return hierarchy.getM(); ++ } ++ ++ /** ++ * Returns the object which makes a conflict for a profiled data ++ * when passed instead of {@linkplain Scenario#getProfiled} ++ * ++ * @return incompatible to profiled object ++ */ ++ public T getConflict() { ++ return hierarchy.getN(); ++ } ++ ++ /** ++ * @return scenario name ++ */ ++ public String getName() { ++ return name; ++ } ++ ++ /** Is this scenario applicable for a hierarchy it was constructed with */ ++ public boolean isApplicable() { ++ return true; ++ } ++ ++ /** ++ * Runs test scenario ++ * ++ * @param t subject of the test ++ * @return result of the test invocation ++ */ ++ public abstract R run(T t); ++ ++ /** Used for a return type profiling */ ++ protected final T collectReturnType(T t) { ++ return t; ++ } ++ ++ /** ++ * Checks the result for R and T ++ * ++ * @param r result ++ * @param t original ++ * @throws java.lang.RuntimeException on result mismatch ++ */ ++ public abstract void check(R r, T t); ++} +--- ./hotspot/test/compiler/uncommontrap/StackOverflowGuardPagesOff.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/uncommontrap/StackOverflowGuardPagesOff.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,355 @@ ++/* ++ * 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 8029383 ++ * @summary stack overflow if callee is marked for deoptimization causes crash ++ * @run main/othervm -XX:TieredStopAtLevel=1 -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,StackOverflowGuardPagesOff::m1 -XX:CompileCommand=exclude,StackOverflowGuardPagesOff::m2 -Xss256K -XX:-UseOnStackReplacement StackOverflowGuardPagesOff ++ * ++ */ ++ ++// This test calls m2 recursively until a stack overflow. Then calls ++// m3 that calls m1. m1 triggers B's class loading, as a result m1 and ++// m3 needs to be deoptimized. Deoptimization of m1 causes a stack ++// overflow exception to be thrown which is propagated to m3 in the ++// deopt blob. If the guard pages are no enabled, the stack bang in ++// the deopt blob triggers a crash. ++public class StackOverflowGuardPagesOff { ++ ++ static class A { ++ void m() {} ++ } ++ ++ static class B extends A { ++ void m() {} ++ } ++ ++ static void m1(boolean deopt, A a) { ++ long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, ++ l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, ++ l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, ++ l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, ++ l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, ++ l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, ++ l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84, ++ l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96, ++ l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107, ++ l108, l109, l110, l111, l112, l113, l114, l115, l116, l117, ++ l118, l119, l120, l121, l122, l123, l124, l125, l126, l127, ++ l128, l129, l130, l131, l132, l133, l134, l135, l136, l137, ++ l138, l139, l140, l141, l142, l143, l144, l145, l146, l147, ++ l148, l149, l150, l151, l152, l153, l154, l155, l156, l157, ++ l158, l159, l160, l161, l162, l163, l164, l165, l166, l167, ++ l168, l169, l170, l171, l172, l173, l174, l175, l176, l177, ++ l178, l179, l180, l181, l182, l183, l184, l185, l186, l187, ++ l188, l189, l190, l191, l192, l193, l194, l195, l196, l197, ++ l198, l199, l200, l201, l202, l203, l204, l205, l206, l207, ++ l208, l209, l210, l211, l212, l213, l214, l215, l216, l217, ++ l218, l219, l220, l221, l222, l223, l224, l225, l226, l227, ++ l228, l229, l230, l231, l232, l233, l234, l235, l236, l237, ++ l238, l239, l240, l241, l242, l243, l244, l245, l246, l247, ++ l248, l249, l250, l251, l252, l253, l254, l255, l256, l257, ++ l258, l259, l260, l261, l262, l263, l264, l265, l266, l267, ++ l268, l269, l270, l271, l272, l273, l274, l275, l276, l277, ++ l278, l279, l280, l281, l282, l283, l284, l285, l286, l287, ++ l288, l289, l290, l291, l292, l293, l294, l295, l296, l297, ++ l298, l299, l300, l301, l302, l303, l304, l305, l306, l307, ++ l308, l309, l310, l311, l312, l313, l314, l315, l316, l317, ++ l318, l319, l320, l321, l322, l323, l324, l325, l326, l327, ++ l328, l329, l330, l331, l332, l333, l334, l335, l336, l337, ++ l338, l339, l340, l341, l342, l343, l344, l345, l346, l347, ++ l348, l349, l350, l351, l352, l353, l354, l355, l356, l357, ++ l358, l359, l360, l361, l362, l363, l364, l365, l366, l367, ++ l368, l369, l370, l371, l372, l373, l374, l375, l376, l377, ++ l378, l379, l380, l381, l382, l383, l384, l385, l386, l387, ++ l388, l389, l390, l391, l392, l393, l394, l395, l396, l397, ++ l398, l399, l400, l401, l402, l403, l404, l405, l406, l407, ++ l408, l409, l410, l411, l412, l413, l414, l415, l416, l417, ++ l418, l419, l420, l421, l422, l423, l424, l425, l426, l427, ++ l428, l429, l430, l431, l432, l433, l434, l435, l436, l437, ++ l438, l439, l440, l441, l442, l443, l444, l445, l446, l447, ++ l448, l449, l450, l451, l452, l453, l454, l455, l456, l457, ++ l458, l459, l460, l461, l462, l463, l464, l465, l466, l467, ++ l468, l469, l470, l471, l472, l473, l474, l475, l476, l477, ++ l478, l479, l480, l481, l482, l483, l484, l485, l486, l487, ++ l488, l489, l490, l491, l492, l493, l494, l495, l496, l497, ++ l498, l499, l500, l501, l502, l503, l504, l505, l506, l507, ++ l508, l509, l510, l511; ++ ++ long ll0, ll1, ll2, ll3, ll4, ll5, ll6, ll7, ll8, ll9, ll10, ll11, ll12, ++ ll13, ll14, ll15, ll16, ll17, ll18, ll19, ll20, ll21, ll22, ll23, ll24, ++ ll25, ll26, ll27, ll28, ll29, ll30, ll31, ll32, ll33, ll34, ll35, ll36, ++ ll37, ll38, ll39, ll40, ll41, ll42, ll43, ll44, ll45, ll46, ll47, ll48, ++ ll49, ll50, ll51, ll52, ll53, ll54, ll55, ll56, ll57, ll58, ll59, ll60, ++ ll61, ll62, ll63, ll64, ll65, ll66, ll67, ll68, ll69, ll70, ll71, ll72, ++ ll73, ll74, ll75, ll76, ll77, ll78, ll79, ll80, ll81, ll82, ll83, ll84, ++ ll85, ll86, ll87, ll88, ll89, ll90, ll91, ll92, ll93, ll94, ll95, ll96, ++ ll97, ll98, ll99, ll100, ll101, ll102, ll103, ll104, ll105, ll106, ll107, ++ ll108, ll109, ll110, ll111, ll112, ll113, ll114, ll115, ll116, ll117, ++ ll118, ll119, ll120, ll121, ll122, ll123, ll124, ll125, ll126, ll127, ++ ll128, ll129, ll130, ll131, ll132, ll133, ll134, ll135, ll136, ll137, ++ ll138, ll139, ll140, ll141, ll142, ll143, ll144, ll145, ll146, ll147, ++ ll148, ll149, ll150, ll151, ll152, ll153, ll154, ll155, ll156, ll157, ++ ll158, ll159, ll160, ll161, ll162, ll163, ll164, ll165, ll166, ll167, ++ ll168, ll169, ll170, ll171, ll172, ll173, ll174, ll175, ll176, ll177, ++ ll178, ll179, ll180, ll181, ll182, ll183, ll184, ll185, ll186, ll187, ++ ll188, ll189, ll190, ll191, ll192, ll193, ll194, ll195, ll196, ll197, ++ ll198, ll199, ll200, ll201, ll202, ll203, ll204, ll205, ll206, ll207, ++ ll208, ll209, ll210, ll211, ll212, ll213, ll214, ll215, ll216, ll217, ++ ll218, ll219, ll220, ll221, ll222, ll223, ll224, ll225, ll226, ll227, ++ ll228, ll229, ll230, ll231, ll232, ll233, ll234, ll235, ll236, ll237, ++ ll238, ll239, ll240, ll241, ll242, ll243, ll244, ll245, ll246, ll247, ++ ll248, ll249, ll250, ll251, ll252, ll253, ll254, ll255, ll256, ll257, ++ ll258, ll259, ll260, ll261, ll262, ll263, ll264, ll265, ll266, ll267, ++ ll268, ll269, ll270, ll271, ll272, ll273, ll274, ll275, ll276, ll277, ++ ll278, ll279, ll280, ll281, ll282, ll283, ll284, ll285, ll286, ll287, ++ ll288, ll289, ll290, ll291, ll292, ll293, ll294, ll295, ll296, ll297, ++ ll298, ll299, ll300, ll301, ll302, ll303, ll304, ll305, ll306, ll307, ++ ll308, ll309, ll310, ll311, ll312, ll313, ll314, ll315, ll316, ll317, ++ ll318, ll319, ll320, ll321, ll322, ll323, ll324, ll325, ll326, ll327, ++ ll328, ll329, ll330, ll331, ll332, ll333, ll334, ll335, ll336, ll337, ++ ll338, ll339, ll340, ll341, ll342, ll343, ll344, ll345, ll346, ll347, ++ ll348, ll349, ll350, ll351, ll352, ll353, ll354, ll355, ll356, ll357, ++ ll358, ll359, ll360, ll361, ll362, ll363, ll364, ll365, ll366, ll367, ++ ll368, ll369, ll370, ll371, ll372, ll373, ll374, ll375, ll376, ll377, ++ ll378, ll379, ll380, ll381, ll382, ll383, ll384, ll385, ll386, ll387, ++ ll388, ll389, ll390, ll391, ll392, ll393, ll394, ll395, ll396, ll397, ++ ll398, ll399, ll400, ll401, ll402, ll403, ll404, ll405, ll406, ll407, ++ ll408, ll409, ll410, ll411, ll412, ll413, ll414, ll415, ll416, ll417, ++ ll418, ll419, ll420, ll421, ll422, ll423, ll424, ll425, ll426, ll427, ++ ll428, ll429, ll430, ll431, ll432, ll433, ll434, ll435, ll436, ll437, ++ ll438, ll439, ll440, ll441, ll442, ll443, ll444, ll445, ll446, ll447, ++ ll448, ll449, ll450, ll451, ll452, ll453, ll454, ll455, ll456, ll457, ++ ll458, ll459, ll460, ll461, ll462, ll463, ll464, ll465, ll466, ll467, ++ ll468, ll469, ll470, ll471, ll472, ll473, ll474, ll475, ll476, ll477, ++ ll478, ll479, ll480, ll481, ll482, ll483, ll484, ll485, ll486, ll487, ++ ll488, ll489, ll490, ll491, ll492, ll493, ll494, ll495, ll496, ll497, ++ ll498, ll499, ll500, ll501, ll502, ll503, ll504, ll505, ll506, ll507, ++ ll508, ll509, ll510, ll511; ++ ++ a.m(); ++ ++ if (deopt) { ++ do_load = true; ++ while (!load_done); ++ } ++ } ++ ++ static void m2(boolean deopt, A a) { ++ long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, ++ l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, ++ l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, ++ l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, ++ l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, ++ l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, ++ l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84, ++ l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96, ++ l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107, ++ l108, l109, l110, l111, l112, l113, l114, l115, l116, l117, ++ l118, l119, l120, l121, l122, l123, l124, l125, l126, l127, ++ l128, l129, l130, l131, l132, l133, l134, l135, l136, l137, ++ l138, l139, l140, l141, l142, l143, l144, l145, l146, l147, ++ l148, l149, l150, l151, l152, l153, l154, l155, l156, l157, ++ l158, l159, l160, l161, l162, l163, l164, l165, l166, l167, ++ l168, l169, l170, l171, l172, l173, l174, l175, l176, l177, ++ l178, l179, l180, l181, l182, l183, l184, l185, l186, l187, ++ l188, l189, l190, l191, l192, l193, l194, l195, l196, l197, ++ l198, l199, l200, l201, l202, l203, l204, l205, l206, l207, ++ l208, l209, l210, l211, l212, l213, l214, l215, l216, l217, ++ l218, l219, l220, l221, l222, l223, l224, l225, l226, l227, ++ l228, l229, l230, l231, l232, l233, l234, l235, l236, l237, ++ l238, l239, l240, l241, l242, l243, l244, l245, l246, l247, ++ l248, l249, l250, l251, l252, l253, l254, l255, l256, l257, ++ l258, l259, l260, l261, l262, l263, l264, l265, l266, l267, ++ l268, l269, l270, l271, l272, l273, l274, l275, l276, l277, ++ l278, l279, l280, l281, l282, l283, l284, l285, l286, l287, ++ l288, l289, l290, l291, l292, l293, l294, l295, l296, l297, ++ l298, l299, l300, l301, l302, l303, l304, l305, l306, l307, ++ l308, l309, l310, l311, l312, l313, l314, l315, l316, l317, ++ l318, l319, l320, l321, l322, l323, l324, l325, l326, l327, ++ l328, l329, l330, l331, l332, l333, l334, l335, l336, l337, ++ l338, l339, l340, l341, l342, l343, l344, l345, l346, l347, ++ l348, l349, l350, l351, l352, l353, l354, l355, l356, l357, ++ l358, l359, l360, l361, l362, l363, l364, l365, l366, l367, ++ l368, l369, l370, l371, l372, l373, l374, l375, l376, l377, ++ l378, l379, l380, l381, l382, l383, l384, l385, l386, l387, ++ l388, l389, l390, l391, l392, l393, l394, l395, l396, l397, ++ l398, l399, l400, l401, l402, l403, l404, l405, l406, l407, ++ l408, l409, l410, l411, l412, l413, l414, l415, l416, l417, ++ l418, l419, l420, l421, l422, l423, l424, l425, l426, l427, ++ l428, l429, l430, l431, l432, l433, l434, l435, l436, l437, ++ l438, l439, l440, l441, l442, l443, l444, l445, l446, l447, ++ l448, l449, l450, l451, l452, l453, l454, l455, l456, l457, ++ l458, l459, l460, l461, l462, l463, l464, l465, l466, l467, ++ l468, l469, l470, l471, l472, l473, l474, l475, l476, l477, ++ l478, l479, l480, l481, l482, l483, l484, l485, l486, l487, ++ l488, l489, l490, l491, l492, l493, l494, l495, l496, l497, ++ l498, l499, l500, l501, l502, l503, l504, l505, l506, l507, ++ l508, l509, l510, l511; ++ ++ try { ++ m2(deopt, a); ++ } catch (StackOverflowError e) { ++ m3(deopt, a); ++ } ++ } ++ ++ static void m3(boolean deopt, A a) { ++ long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, ++ l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, ++ l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, ++ l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, ++ l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, ++ l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, ++ l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84, ++ l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96, ++ l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107, ++ l108, l109, l110, l111, l112, l113, l114, l115, l116, l117, ++ l118, l119, l120, l121, l122, l123, l124, l125, l126, l127, ++ l128, l129, l130, l131, l132, l133, l134, l135, l136, l137, ++ l138, l139, l140, l141, l142, l143, l144, l145, l146, l147, ++ l148, l149, l150, l151, l152, l153, l154, l155, l156, l157, ++ l158, l159, l160, l161, l162, l163, l164, l165, l166, l167, ++ l168, l169, l170, l171, l172, l173, l174, l175, l176, l177, ++ l178, l179, l180, l181, l182, l183, l184, l185, l186, l187, ++ l188, l189, l190, l191, l192, l193, l194, l195, l196, l197, ++ l198, l199, l200, l201, l202, l203, l204, l205, l206, l207, ++ l208, l209, l210, l211, l212, l213, l214, l215, l216, l217, ++ l218, l219, l220, l221, l222, l223, l224, l225, l226, l227, ++ l228, l229, l230, l231, l232, l233, l234, l235, l236, l237, ++ l238, l239, l240, l241, l242, l243, l244, l245, l246, l247, ++ l248, l249, l250, l251, l252, l253, l254, l255, l256, l257, ++ l258, l259, l260, l261, l262, l263, l264, l265, l266, l267, ++ l268, l269, l270, l271, l272, l273, l274, l275, l276, l277, ++ l278, l279, l280, l281, l282, l283, l284, l285, l286, l287, ++ l288, l289, l290, l291, l292, l293, l294, l295, l296, l297, ++ l298, l299, l300, l301, l302, l303, l304, l305, l306, l307, ++ l308, l309, l310, l311, l312, l313, l314, l315, l316, l317, ++ l318, l319, l320, l321, l322, l323, l324, l325, l326, l327, ++ l328, l329, l330, l331, l332, l333, l334, l335, l336, l337, ++ l338, l339, l340, l341, l342, l343, l344, l345, l346, l347, ++ l348, l349, l350, l351, l352, l353, l354, l355, l356, l357, ++ l358, l359, l360, l361, l362, l363, l364, l365, l366, l367, ++ l368, l369, l370, l371, l372, l373, l374, l375, l376, l377, ++ l378, l379, l380, l381, l382, l383, l384, l385, l386, l387, ++ l388, l389, l390, l391, l392, l393, l394, l395, l396, l397, ++ l398, l399, l400, l401, l402, l403, l404, l405, l406, l407, ++ l408, l409, l410, l411, l412, l413, l414, l415, l416, l417, ++ l418, l419, l420, l421, l422, l423, l424, l425, l426, l427, ++ l428, l429, l430, l431, l432, l433, l434, l435, l436, l437, ++ l438, l439, l440, l441, l442, l443, l444, l445, l446, l447, ++ l448, l449, l450, l451, l452, l453, l454, l455, l456, l457, ++ l458, l459, l460, l461, l462, l463, l464, l465, l466, l467, ++ l468, l469, l470, l471, l472, l473, l474, l475, l476, l477, ++ l478, l479, l480, l481, l482, l483, l484, l485, l486, l487, ++ l488, l489, l490, l491, l492, l493, l494, l495, l496, l497, ++ l498, l499, l500, l501, l502, l503, l504, l505, l506, l507, ++ l508, l509, l510, l511; ++ ++ long ll0, ll1, ll2, ll3, ll4, ll5, ll6, ll7, ll8, ll9, ll10, ll11, ll12, ++ ll13, ll14, ll15, ll16, ll17, ll18, ll19, ll20, ll21, ll22, ll23, ll24, ++ ll25, ll26, ll27, ll28, ll29, ll30, ll31, ll32, ll33, ll34, ll35, ll36, ++ ll37, ll38, ll39, ll40, ll41, ll42, ll43, ll44, ll45, ll46, ll47, ll48, ++ ll49, ll50, ll51, ll52, ll53, ll54, ll55, ll56, ll57, ll58, ll59, ll60, ++ ll61, ll62, ll63, ll64, ll65, ll66, ll67, ll68, ll69, ll70, ll71, ll72, ++ ll73, ll74, ll75, ll76, ll77, ll78, ll79, ll80, ll81, ll82, ll83, ll84, ++ ll85, ll86, ll87, ll88, ll89, ll90, ll91, ll92, ll93, ll94, ll95, ll96, ++ ll97, ll98, ll99, ll100, ll101, ll102, ll103, ll104, ll105, ll106, ll107, ++ ll108, ll109, ll110, ll111, ll112, ll113, ll114, ll115, ll116, ll117, ++ ll118, ll119, ll120, ll121, ll122, ll123, ll124, ll125, ll126, ll127, ++ ll128, ll129, ll130, ll131, ll132, ll133, ll134, ll135, ll136, ll137, ++ ll138, ll139, ll140, ll141, ll142, ll143, ll144, ll145, ll146, ll147, ++ ll148, ll149, ll150, ll151, ll152, ll153, ll154, ll155, ll156, ll157, ++ ll158, ll159, ll160, ll161, ll162, ll163, ll164, ll165, ll166, ll167, ++ ll168, ll169, ll170, ll171, ll172, ll173, ll174, ll175, ll176, ll177, ++ ll178, ll179, ll180, ll181, ll182, ll183, ll184, ll185, ll186, ll187, ++ ll188, ll189, ll190, ll191, ll192, ll193, ll194, ll195, ll196, ll197, ++ ll198, ll199, ll200, ll201, ll202, ll203, ll204, ll205, ll206, ll207, ++ ll208, ll209, ll210, ll211, ll212, ll213, ll214, ll215, ll216, ll217, ++ ll218, ll219, ll220, ll221, ll222, ll223, ll224, ll225, ll226, ll227, ++ ll228, ll229, ll230, ll231, ll232, ll233, ll234, ll235, ll236, ll237, ++ ll238, ll239, ll240, ll241, ll242, ll243, ll244, ll245, ll246, ll247, ++ ll248, ll249, ll250, ll251, ll252, ll253, ll254, ll255, ll256, ll257, ++ ll258, ll259, ll260, ll261, ll262, ll263, ll264, ll265, ll266, ll267, ++ ll268, ll269, ll270, ll271, ll272, ll273, ll274, ll275, ll276, ll277, ++ ll278, ll279, ll280, ll281, ll282, ll283, ll284, ll285, ll286, ll287, ++ ll288, ll289, ll290, ll291, ll292, ll293, ll294, ll295, ll296, ll297, ++ ll298, ll299, ll300, ll301, ll302, ll303, ll304, ll305, ll306, ll307, ++ ll308, ll309, ll310, ll311, ll312, ll313, ll314, ll315, ll316, ll317, ++ ll318, ll319, ll320, ll321, ll322, ll323, ll324, ll325, ll326, ll327, ++ ll328, ll329, ll330, ll331, ll332, ll333, ll334, ll335, ll336, ll337, ++ ll338, ll339, ll340, ll341, ll342, ll343, ll344, ll345, ll346, ll347, ++ ll348, ll349, ll350, ll351, ll352, ll353, ll354, ll355, ll356, ll357, ++ ll358, ll359, ll360, ll361, ll362, ll363, ll364, ll365, ll366, ll367, ++ ll368, ll369, ll370, ll371, ll372, ll373, ll374, ll375, ll376, ll377, ++ ll378, ll379, ll380, ll381, ll382, ll383, ll384, ll385, ll386, ll387, ++ ll388, ll389, ll390, ll391, ll392, ll393, ll394, ll395, ll396, ll397, ++ ll398, ll399, ll400, ll401, ll402, ll403, ll404, ll405, ll406, ll407, ++ ll408, ll409, ll410, ll411, ll412, ll413, ll414, ll415, ll416, ll417, ++ ll418, ll419, ll420, ll421, ll422, ll423, ll424, ll425, ll426, ll427, ++ ll428, ll429, ll430, ll431, ll432, ll433, ll434, ll435, ll436, ll437, ++ ll438, ll439, ll440, ll441, ll442, ll443, ll444, ll445, ll446, ll447, ++ ll448, ll449, ll450, ll451, ll452, ll453, ll454, ll455, ll456, ll457, ++ ll458, ll459, ll460, ll461, ll462, ll463, ll464, ll465, ll466, ll467, ++ ll468, ll469, ll470, ll471, ll472, ll473, ll474, ll475, ll476, ll477, ++ ll478, ll479, ll480, ll481, ll482, ll483, ll484, ll485, ll486, ll487, ++ ll488, ll489, ll490, ll491, ll492, ll493, ll494, ll495, ll496, ll497, ++ ll498, ll499, ll500, ll501, ll502, ll503, ll504, ll505, ll506, ll507, ++ ll508, ll509, ll510, ll511; ++ ++ a.m(); ++ ++ m1(deopt, a); ++ } ++ ++ // Used for synchronization betwen main thread and thread ++ // responsible for class loading ++ static volatile boolean thread_started = false; ++ static volatile boolean do_load = false; ++ static volatile boolean load_done = false; ++ ++ static public void main(String[] args) { ++ // This thread does the loading of B. If m1 does it, the class ++ // loading can cause stack overflows. ++ Thread thread = new Thread() { ++ public void run() { ++ thread_started = true; ++ while(!do_load); ++ new B(); ++ load_done = true; ++ } ++ }; ++ thread.start(); ++ while(!thread_started); ++ // get m3 and m1 compiled ++ A a = new A(); ++ for (int i = 0; i < 5000; i++) { ++ m3(false, a); ++ m1(false, a); ++ } ++ m2(true, a); ++ ++ System.out.println("TEST PASSED"); ++ } ++} +--- ./hotspot/test/compiler/uncommontrap/TestLockEliminatedAtDeopt.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/uncommontrap/TestLockEliminatedAtDeopt.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,70 @@ ++/* ++ * 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 8032011 ++ * @summary biased locking's revoke_bias locks monitor in compiled frame with eliminated lock ++ * @run main/othervm -XX:-UseOnStackReplacement -XX:CompileCommand=dontinline,TestLockEliminatedAtDeopt$A.m2 -XX:-BackgroundCompilation -XX:BiasedLockingStartupDelay=0 TestLockEliminatedAtDeopt ++ * ++ */ ++ ++public class TestLockEliminatedAtDeopt { ++ ++ static class A { ++ void m() { ++ } ++ ++ // This lock is not eliminated but biased to main thread on ++ // first call ++ synchronized void m2(boolean trap) { ++ if (trap) { ++ new B(); ++ } ++ } ++ } ++ ++ static class B extends A { ++ void m() { ++ } ++ } ++ ++ static void m1(boolean trap) { ++ A a = new A(); ++ // This lock is eliminated by c2 ++ synchronized(a) { ++ a.m2(trap); ++ a.m(); ++ } ++ } ++ ++ public static void main(String[] args) { ++ for (int i = 0; i < 20000; i++) { ++ m1(false); ++ } ++ // Trigger uncommon trap in A.m2() (class unloaded) and ++ // deoptimization of m1() (CHA invalidated). Uncommon trap ++ // code locks monitor in m1's frame where's it's eliminated. ++ m1(true); ++ } ++} +--- ./hotspot/test/compiler/uncommontrap/TestSpecTrapClassUnloading.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/uncommontrap/TestSpecTrapClassUnloading.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,97 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8031752 ++ * @summary speculative traps need to be cleaned up at GC ++ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:+UseTypeSpeculation -XX:TypeProfileLevel=222 -XX:CompileCommand=exclude,java.lang.reflect.Method::invoke -XX:CompileCommand=exclude,sun.reflect.DelegatingMethodAccessorImpl::invoke -Xmx1M TestSpecTrapClassUnloading ++ * ++ */ ++ ++import java.lang.reflect.Method; ++ ++public class TestSpecTrapClassUnloading { ++ static class B { ++ final public boolean m(Object o) { ++ if (o.getClass() == B.class) { ++ return true; ++ } ++ return false; ++ } ++ } ++ ++ static class MemoryChunk { ++ MemoryChunk other; ++ long[] array; ++ MemoryChunk(MemoryChunk other) { ++ other = other; ++ array = new long[1024 * 1024 * 1024]; ++ } ++ } ++ ++ static void m1(B b, Object o) { ++ b.m(o); ++ } ++ ++ static void m2(B b, Object o) { ++ b.m(o); ++ } ++ ++ public static void main(String[] args) throws Exception { ++ Method m = B.class.getMethod("m", Object.class); ++ Object o = new Object(); ++ B b = new B(); ++ ++ // add speculative trap in B.m() for m1 ++ for (int i = 0; i < 20000; i++) { ++ m1(b, b); ++ } ++ m1(b, o); ++ ++ // add speculative trap in B.m() for code generated by reflection ++ for (int i = 0; i < 20000; i++) { ++ m.invoke(b, b); ++ } ++ m.invoke(b, o); ++ ++ m = null; ++ ++ // add speculative trap in B.m() for m2 ++ for (int i = 0; i < 20000; i++) { ++ m2(b, b); ++ } ++ m2(b, o); ++ ++ // Exhaust memory which causes the code generated by ++ // reflection to be unloaded but B.m() is not. ++ MemoryChunk root = null; ++ try { ++ while (true) { ++ root = new MemoryChunk(root); ++ } ++ } catch(OutOfMemoryError e) { ++ root = null; ++ } ++ } ++} +--- ./hotspot/test/compiler/uncommontrap/TestStackBangMonitorOwned.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/uncommontrap/TestStackBangMonitorOwned.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,268 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @bug 8032410 ++ * @summary Stack overflow at deoptimization doesn't release owned monitors ++ * @run main/othervm -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestStackBangMonitorOwned::m1 -XX:CompileCommand=exclude,TestStackBangMonitorOwned::m2 -Xss256K -XX:-UseOnStackReplacement TestStackBangMonitorOwned ++ * ++ */ ++public class TestStackBangMonitorOwned { ++ ++ static class UnloadedClass1 { ++ volatile int field; ++ } ++ ++ static Object m1(boolean deopt) { ++ long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, ++ l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, ++ l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, ++ l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, ++ l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, ++ l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, ++ l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84, ++ l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96, ++ l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107, ++ l108, l109, l110, l111, l112, l113, l114, l115, l116, l117, ++ l118, l119, l120, l121, l122, l123, l124, l125, l126, l127, ++ l128, l129, l130, l131, l132, l133, l134, l135, l136, l137, ++ l138, l139, l140, l141, l142, l143, l144, l145, l146, l147, ++ l148, l149, l150, l151, l152, l153, l154, l155, l156, l157, ++ l158, l159, l160, l161, l162, l163, l164, l165, l166, l167, ++ l168, l169, l170, l171, l172, l173, l174, l175, l176, l177, ++ l178, l179, l180, l181, l182, l183, l184, l185, l186, l187, ++ l188, l189, l190, l191, l192, l193, l194, l195, l196, l197, ++ l198, l199, l200, l201, l202, l203, l204, l205, l206, l207, ++ l208, l209, l210, l211, l212, l213, l214, l215, l216, l217, ++ l218, l219, l220, l221, l222, l223, l224, l225, l226, l227, ++ l228, l229, l230, l231, l232, l233, l234, l235, l236, l237, ++ l238, l239, l240, l241, l242, l243, l244, l245, l246, l247, ++ l248, l249, l250, l251, l252, l253, l254, l255, l256, l257, ++ l258, l259, l260, l261, l262, l263, l264, l265, l266, l267, ++ l268, l269, l270, l271, l272, l273, l274, l275, l276, l277, ++ l278, l279, l280, l281, l282, l283, l284, l285, l286, l287, ++ l288, l289, l290, l291, l292, l293, l294, l295, l296, l297, ++ l298, l299, l300, l301, l302, l303, l304, l305, l306, l307, ++ l308, l309, l310, l311, l312, l313, l314, l315, l316, l317, ++ l318, l319, l320, l321, l322, l323, l324, l325, l326, l327, ++ l328, l329, l330, l331, l332, l333, l334, l335, l336, l337, ++ l338, l339, l340, l341, l342, l343, l344, l345, l346, l347, ++ l348, l349, l350, l351, l352, l353, l354, l355, l356, l357, ++ l358, l359, l360, l361, l362, l363, l364, l365, l366, l367, ++ l368, l369, l370, l371, l372, l373, l374, l375, l376, l377, ++ l378, l379, l380, l381, l382, l383, l384, l385, l386, l387, ++ l388, l389, l390, l391, l392, l393, l394, l395, l396, l397, ++ l398, l399, l400, l401, l402, l403, l404, l405, l406, l407, ++ l408, l409, l410, l411, l412, l413, l414, l415, l416, l417, ++ l418, l419, l420, l421, l422, l423, l424, l425, l426, l427, ++ l428, l429, l430, l431, l432, l433, l434, l435, l436, l437, ++ l438, l439, l440, l441, l442, l443, l444, l445, l446, l447, ++ l448, l449, l450, l451, l452, l453, l454, l455, l456, l457, ++ l458, l459, l460, l461, l462, l463, l464, l465, l466, l467, ++ l468, l469, l470, l471, l472, l473, l474, l475, l476, l477, ++ l478, l479, l480, l481, l482, l483, l484, l485, l486, l487, ++ l488, l489, l490, l491, l492, l493, l494, l495, l496, l497, ++ l498, l499, l500, l501, l502, l503, l504, l505, l506, l507, ++ l508, l509, l510, l511; ++ ++ long ll0, ll1, ll2, ll3, ll4, ll5, ll6, ll7, ll8, ll9, ll10, ll11, ll12, ++ ll13, ll14, ll15, ll16, ll17, ll18, ll19, ll20, ll21, ll22, ll23, ll24, ++ ll25, ll26, ll27, ll28, ll29, ll30, ll31, ll32, ll33, ll34, ll35, ll36, ++ ll37, ll38, ll39, ll40, ll41, ll42, ll43, ll44, ll45, ll46, ll47, ll48, ++ ll49, ll50, ll51, ll52, ll53, ll54, ll55, ll56, ll57, ll58, ll59, ll60, ++ ll61, ll62, ll63, ll64, ll65, ll66, ll67, ll68, ll69, ll70, ll71, ll72, ++ ll73, ll74, ll75, ll76, ll77, ll78, ll79, ll80, ll81, ll82, ll83, ll84, ++ ll85, ll86, ll87, ll88, ll89, ll90, ll91, ll92, ll93, ll94, ll95, ll96, ++ ll97, ll98, ll99, ll100, ll101, ll102, ll103, ll104, ll105, ll106, ll107, ++ ll108, ll109, ll110, ll111, ll112, ll113, ll114, ll115, ll116, ll117, ++ ll118, ll119, ll120, ll121, ll122, ll123, ll124, ll125, ll126, ll127, ++ ll128, ll129, ll130, ll131, ll132, ll133, ll134, ll135, ll136, ll137, ++ ll138, ll139, ll140, ll141, ll142, ll143, ll144, ll145, ll146, ll147, ++ ll148, ll149, ll150, ll151, ll152, ll153, ll154, ll155, ll156, ll157, ++ ll158, ll159, ll160, ll161, ll162, ll163, ll164, ll165, ll166, ll167, ++ ll168, ll169, ll170, ll171, ll172, ll173, ll174, ll175, ll176, ll177, ++ ll178, ll179, ll180, ll181, ll182, ll183, ll184, ll185, ll186, ll187, ++ ll188, ll189, ll190, ll191, ll192, ll193, ll194, ll195, ll196, ll197, ++ ll198, ll199, ll200, ll201, ll202, ll203, ll204, ll205, ll206, ll207, ++ ll208, ll209, ll210, ll211, ll212, ll213, ll214, ll215, ll216, ll217, ++ ll218, ll219, ll220, ll221, ll222, ll223, ll224, ll225, ll226, ll227, ++ ll228, ll229, ll230, ll231, ll232, ll233, ll234, ll235, ll236, ll237, ++ ll238, ll239, ll240, ll241, ll242, ll243, ll244, ll245, ll246, ll247, ++ ll248, ll249, ll250, ll251, ll252, ll253, ll254, ll255, ll256, ll257, ++ ll258, ll259, ll260, ll261, ll262, ll263, ll264, ll265, ll266, ll267, ++ ll268, ll269, ll270, ll271, ll272, ll273, ll274, ll275, ll276, ll277, ++ ll278, ll279, ll280, ll281, ll282, ll283, ll284, ll285, ll286, ll287, ++ ll288, ll289, ll290, ll291, ll292, ll293, ll294, ll295, ll296, ll297, ++ ll298, ll299, ll300, ll301, ll302, ll303, ll304, ll305, ll306, ll307, ++ ll308, ll309, ll310, ll311, ll312, ll313, ll314, ll315, ll316, ll317, ++ ll318, ll319, ll320, ll321, ll322, ll323, ll324, ll325, ll326, ll327, ++ ll328, ll329, ll330, ll331, ll332, ll333, ll334, ll335, ll336, ll337, ++ ll338, ll339, ll340, ll341, ll342, ll343, ll344, ll345, ll346, ll347, ++ ll348, ll349, ll350, ll351, ll352, ll353, ll354, ll355, ll356, ll357, ++ ll358, ll359, ll360, ll361, ll362, ll363, ll364, ll365, ll366, ll367, ++ ll368, ll369, ll370, ll371, ll372, ll373, ll374, ll375, ll376, ll377, ++ ll378, ll379, ll380, ll381, ll382, ll383, ll384, ll385, ll386, ll387, ++ ll388, ll389, ll390, ll391, ll392, ll393, ll394, ll395, ll396, ll397, ++ ll398, ll399, ll400, ll401, ll402, ll403, ll404, ll405, ll406, ll407, ++ ll408, ll409, ll410, ll411, ll412, ll413, ll414, ll415, ll416, ll417, ++ ll418, ll419, ll420, ll421, ll422, ll423, ll424, ll425, ll426, ll427, ++ ll428, ll429, ll430, ll431, ll432, ll433, ll434, ll435, ll436, ll437, ++ ll438, ll439, ll440, ll441, ll442, ll443, ll444, ll445, ll446, ll447, ++ ll448, ll449, ll450, ll451, ll452, ll453, ll454, ll455, ll456, ll457, ++ ll458, ll459, ll460, ll461, ll462, ll463, ll464, ll465, ll466, ll467, ++ ll468, ll469, ll470, ll471, ll472, ll473, ll474, ll475, ll476, ll477, ++ ll478, ll479, ll480, ll481, ll482, ll483, ll484, ll485, ll486, ll487, ++ ll488, ll489, ll490, ll491, ll492, ll493, ll494, ll495, ll496, ll497, ++ ll498, ll499, ll500, ll501, ll502, ll503, ll504, ll505, ll506, ll507, ++ ll508, ll509, ll510, ll511; ++ ++ if (deopt) { ++ method_entered = true; ++ synchronized(monitor) { ++ do_monitor_acquire = true; ++ UnloadedClass1 res = new UnloadedClass1(); // forces deopt with c2 ++ res.field = 0; //forced deopt with c1 ++ return res; ++ } ++ } ++ return null; ++ } ++ ++ static boolean m2(boolean deopt) { ++ long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, ++ l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, ++ l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, ++ l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, ++ l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, ++ l61, l62, l63, l64, l65, l66, l67, l68, l69, l70, l71, l72, ++ l73, l74, l75, l76, l77, l78, l79, l80, l81, l82, l83, l84, ++ l85, l86, l87, l88, l89, l90, l91, l92, l93, l94, l95, l96, ++ l97, l98, l99, l100, l101, l102, l103, l104, l105, l106, l107, ++ l108, l109, l110, l111, l112, l113, l114, l115, l116, l117, ++ l118, l119, l120, l121, l122, l123, l124, l125, l126, l127, ++ l128, l129, l130, l131, l132, l133, l134, l135, l136, l137, ++ l138, l139, l140, l141, l142, l143, l144, l145, l146, l147, ++ l148, l149, l150, l151, l152, l153, l154, l155, l156, l157, ++ l158, l159, l160, l161, l162, l163, l164, l165, l166, l167, ++ l168, l169, l170, l171, l172, l173, l174, l175, l176, l177, ++ l178, l179, l180, l181, l182, l183, l184, l185, l186, l187, ++ l188, l189, l190, l191, l192, l193, l194, l195, l196, l197, ++ l198, l199, l200, l201, l202, l203, l204, l205, l206, l207, ++ l208, l209, l210, l211, l212, l213, l214, l215, l216, l217, ++ l218, l219, l220, l221, l222, l223, l224, l225, l226, l227, ++ l228, l229, l230, l231, l232, l233, l234, l235, l236, l237, ++ l238, l239, l240, l241, l242, l243, l244, l245, l246, l247, ++ l248, l249, l250, l251, l252, l253, l254, l255, l256, l257, ++ l258, l259, l260, l261, l262, l263, l264, l265, l266, l267, ++ l268, l269, l270, l271, l272, l273, l274, l275, l276, l277, ++ l278, l279, l280, l281, l282, l283, l284, l285, l286, l287, ++ l288, l289, l290, l291, l292, l293, l294, l295, l296, l297, ++ l298, l299, l300, l301, l302, l303, l304, l305, l306, l307, ++ l308, l309, l310, l311, l312, l313, l314, l315, l316, l317, ++ l318, l319, l320, l321, l322, l323, l324, l325, l326, l327, ++ l328, l329, l330, l331, l332, l333, l334, l335, l336, l337, ++ l338, l339, l340, l341, l342, l343, l344, l345, l346, l347, ++ l348, l349, l350, l351, l352, l353, l354, l355, l356, l357, ++ l358, l359, l360, l361, l362, l363, l364, l365, l366, l367, ++ l368, l369, l370, l371, l372, l373, l374, l375, l376, l377, ++ l378, l379, l380, l381, l382, l383, l384, l385, l386, l387, ++ l388, l389, l390, l391, l392, l393, l394, l395, l396, l397, ++ l398, l399, l400, l401, l402, l403, l404, l405, l406, l407, ++ l408, l409, l410, l411, l412, l413, l414, l415, l416, l417, ++ l418, l419, l420, l421, l422, l423, l424, l425, l426, l427, ++ l428, l429, l430, l431, l432, l433, l434, l435, l436, l437, ++ l438, l439, l440, l441, l442, l443, l444, l445, l446, l447, ++ l448, l449, l450, l451, l452, l453, l454, l455, l456, l457, ++ l458, l459, l460, l461, l462, l463, l464, l465, l466, l467, ++ l468, l469, l470, l471, l472, l473, l474, l475, l476, l477, ++ l478, l479, l480, l481, l482, l483, l484, l485, l486, l487, ++ l488, l489, l490, l491, l492, l493, l494, l495, l496, l497, ++ l498, l499, l500, l501, l502, l503, l504, l505, l506, l507, ++ l508, l509, l510, l511; ++ ++ boolean do_m3 = false; ++ try { ++ do_m3 = m2(deopt); ++ } catch (StackOverflowError e) { ++ return true; ++ } ++ if (do_m3) { ++ try { ++ m1(deopt); ++ } catch (StackOverflowError e) {} ++ } ++ return false; ++ } ++ ++ // Used for synchronization betwen threads ++ static volatile boolean thread_started = false; ++ static volatile boolean do_monitor_acquire = false; ++ static volatile boolean monitor_acquired = false; ++ static volatile boolean method_entered = false; ++ ++ static Object monitor = new Object(); ++ ++ static public void main(String[] args) { ++ // get m1 compiled ++ for (int i = 0; i < 20000; i++) { ++ m1(false); ++ } ++ ++ Thread thread = new Thread() { ++ public void run() { ++ thread_started = true; ++ while(!do_monitor_acquire); ++ System.out.println("Ok to try to acquire the lock"); ++ synchronized(monitor) { ++ monitor_acquired = true; ++ } ++ } ++ }; ++ ++ thread.setDaemon(true); ++ thread.start(); ++ ++ while(!thread_started); ++ ++ m2(true); ++ ++ if (!method_entered) { ++ System.out.println("TEST PASSED"); ++ return; ++ } ++ ++ for (int i = 0; i < 10; i++) { ++ System.out.println("Is lock acquired?"); ++ if (monitor_acquired) { ++ System.out.println("TEST PASSED"); ++ return; ++ } ++ try { ++ Thread.sleep(10000); ++ } catch(InterruptedException ie) { ++ } ++ } ++ System.out.println("TEST FAILED"); ++ } ++} +--- ./hotspot/test/compiler/whitebox/ClearMethodStateTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/whitebox/ClearMethodStateTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -21,25 +21,25 @@ + * questions. + */ + ++import java.util.function.Function; ++ + /* + * @test ClearMethodStateTest + * @bug 8006683 8007288 8022832 + * @library /testlibrary /testlibrary/whitebox + * @build ClearMethodStateTest + * @run main ClassFileInstaller sun.hotspot.WhiteBox +- * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,TestCase$Helper::* ClearMethodStateTest ++ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* ClearMethodStateTest + * @summary testing of WB::clearMethodState() + * @author igor.ignatyev@oracle.com + */ + public class ClearMethodStateTest extends CompilerWhiteBoxTest { + + public static void main(String[] args) throws Exception { +- for (TestCase test : TestCase.values()) { +- new ClearMethodStateTest(test).runTest(); +- } ++ CompilerWhiteBoxTest.main(ClearMethodStateTest::new, args); + } + +- public ClearMethodStateTest(TestCase testCase) { ++ private ClearMethodStateTest(TestCase testCase) { + super(testCase); + // to prevent inlining of #method + WHITE_BOX.testSetDontInlineMethod(method, true); +@@ -63,7 +63,7 @@ + deoptimize(); + checkNotCompiled(); + +- if (testCase.isOsr) { ++ if (testCase.isOsr()) { + // part test isn't applicable for OSR test case + return; + } +--- ./hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 @@ + import com.sun.management.HotSpotDiagnosticMXBean; + import com.sun.management.VMOption; + import sun.hotspot.WhiteBox; ++import sun.hotspot.code.NMethod; + import sun.management.ManagementFactoryHelper; + + import java.lang.reflect.Constructor; +@@ -31,6 +32,7 @@ + import java.lang.reflect.Method; + import java.util.Objects; + import java.util.concurrent.Callable; ++import java.util.function.Function; + + /** + * Abstract class for WhiteBox testing of JIT. +@@ -50,7 +52,7 @@ + protected static int COMP_LEVEL_FULL_PROFILE = 3; + /** {@code CompLevel::CompLevel_full_optimization} -- C2 or Shark */ + protected static int COMP_LEVEL_FULL_OPTIMIZATION = 4; +- /** Maximal value for CompLeveL */ ++ /** Maximal value for CompLevel */ + protected static int COMP_LEVEL_MAX = COMP_LEVEL_FULL_OPTIMIZATION; + + /** Instance of WhiteBox */ +@@ -75,8 +77,7 @@ + /** count of invocation to triger OSR compilation */ + protected static final long BACKEDGE_THRESHOLD; + /** Value of {@code java.vm.info} (interpreted|mixed|comp mode) */ +- protected static final String MODE +- = System.getProperty("java.vm.info"); ++ protected static final String MODE = System.getProperty("java.vm.info"); + + static { + if (TIERED_COMPILATION) { +@@ -133,6 +134,20 @@ + return compLevel == COMP_LEVEL_FULL_OPTIMIZATION; + } + ++ protected static void main( ++ Function constructor, ++ String[] args) { ++ if (args.length == 0) { ++ for (TestCase test : SimpleTestCase.values()) { ++ constructor.apply(test).runTest(); ++ } ++ } else { ++ for (String name : args) { ++ constructor.apply(SimpleTestCase.valueOf(name)).runTest(); ++ } ++ } ++ } ++ + /** tested method */ + protected final Executable method; + protected final TestCase testCase; +@@ -145,7 +160,7 @@ + protected CompilerWhiteBoxTest(TestCase testCase) { + Objects.requireNonNull(testCase); + System.out.println("TEST CASE:" + testCase.name()); +- method = testCase.executable; ++ method = testCase.getExecutable(); + this.testCase = testCase; + } + +@@ -182,6 +197,29 @@ + } + + /** ++ * Checks, that {@linkplain #method} is not compiled at the given compilation ++ * level or above. ++ * ++ * @param compLevel ++ * ++ * @throws RuntimeException if {@linkplain #method} is in compiler queue or ++ * is compiled, or if {@linkplain #method} has zero ++ * compilation level. ++ */ ++ ++ protected final void checkNotCompiled(int compLevel) { ++ if (WHITE_BOX.isMethodQueuedForCompilation(method)) { ++ throw new RuntimeException(method + " must not be in queue"); ++ } ++ if (WHITE_BOX.getMethodCompilationLevel(method, false) >= compLevel) { ++ throw new RuntimeException(method + " comp_level must be >= maxCompLevel"); ++ } ++ if (WHITE_BOX.getMethodCompilationLevel(method, true) >= compLevel) { ++ throw new RuntimeException(method + " osr_comp_level must be >= maxCompLevel"); ++ } ++ } ++ ++ /** + * Checks, that {@linkplain #method} is not compiled. + * + * @throws RuntimeException if {@linkplain #method} is in compiler queue or +@@ -204,7 +242,7 @@ + if (WHITE_BOX.getMethodCompilationLevel(method, true) != 0) { + throw new RuntimeException(method + " osr_comp_level must be == 0"); + } +- } ++ } + + /** + * Checks, that {@linkplain #method} is compiled. +@@ -221,44 +259,47 @@ + method, System.currentTimeMillis() - start); + return; + } +- if (!WHITE_BOX.isMethodCompiled(method, testCase.isOsr)) { ++ if (!WHITE_BOX.isMethodCompiled(method, testCase.isOsr())) { + throw new RuntimeException(method + " must be " +- + (testCase.isOsr ? "osr_" : "") + "compiled"); ++ + (testCase.isOsr() ? "osr_" : "") + "compiled"); + } +- if (WHITE_BOX.getMethodCompilationLevel(method, testCase.isOsr) == 0) { ++ if (WHITE_BOX.getMethodCompilationLevel(method, testCase.isOsr()) ++ == 0) { + throw new RuntimeException(method +- + (testCase.isOsr ? " osr_" : " ") ++ + (testCase.isOsr() ? " osr_" : " ") + + "comp_level must be != 0"); + } + } + + protected final void deoptimize() { +- WHITE_BOX.deoptimizeMethod(method, testCase.isOsr); +- if (testCase.isOsr) { ++ WHITE_BOX.deoptimizeMethod(method, testCase.isOsr()); ++ if (testCase.isOsr()) { + WHITE_BOX.deoptimizeMethod(method, false); + } + } + + protected final int getCompLevel() { +- return WHITE_BOX.getMethodCompilationLevel(method, testCase.isOsr); ++ NMethod nm = NMethod.get(method, testCase.isOsr()); ++ return nm == null ? COMP_LEVEL_NONE : nm.comp_level; + } + + protected final boolean isCompilable() { + return WHITE_BOX.isMethodCompilable(method, COMP_LEVEL_ANY, +- testCase.isOsr); ++ testCase.isOsr()); + } + + protected final boolean isCompilable(int compLevel) { +- return WHITE_BOX.isMethodCompilable(method, compLevel, testCase.isOsr); ++ return WHITE_BOX ++ .isMethodCompilable(method, compLevel, testCase.isOsr()); + } + + protected final void makeNotCompilable() { + WHITE_BOX.makeMethodNotCompilable(method, COMP_LEVEL_ANY, +- testCase.isOsr); ++ testCase.isOsr()); + } + + protected final void makeNotCompilable(int compLevel) { +- WHITE_BOX.makeMethodNotCompilable(method, compLevel, testCase.isOsr); ++ WHITE_BOX.makeMethodNotCompilable(method, compLevel, testCase.isOsr()); + } + + /** +@@ -298,7 +339,7 @@ + WHITE_BOX.isMethodCompiled(method, true)); + System.out.printf("\tosr_comp_level:\t%d%n", + WHITE_BOX.getMethodCompilationLevel(method, true)); +- System.out.printf("\tin_queue:\t%b%n", ++ System.out.printf("\tin_queue:\t%b%n", + WHITE_BOX.isMethodQueuedForCompilation(method)); + System.out.printf("compile_queues_size:\t%d%n%n", + WHITE_BOX.getCompileQueuesSize()); +@@ -311,13 +352,13 @@ + + /** + * Tries to trigger compilation of {@linkplain #method} by call +- * {@linkplain #testCase.callable} enough times. ++ * {@linkplain TestCase#getCallable()} enough times. + * + * @return accumulated result + * @see #compile(int) + */ + protected final int compile() { +- if (testCase.isOsr) { ++ if (testCase.isOsr()) { + return compile(1); + } else { + return compile(THRESHOLD); +@@ -326,7 +367,7 @@ + + /** + * Tries to trigger compilation of {@linkplain #method} by call +- * {@linkplain #testCase.callable} specified times. ++ * {@linkplain TestCase#getCallable()} specified times. + * + * @param count invocation count + * @return accumulated result +@@ -336,7 +377,7 @@ + Integer tmp; + for (int i = 0; i < count; ++i) { + try { +- tmp = testCase.callable.call(); ++ tmp = testCase.getCallable().call(); + } catch (Exception e) { + tmp = null; + } +@@ -347,19 +388,46 @@ + } + return result; + } ++ ++ /** ++ * Utility interface provides tested method and object to invoke it. ++ */ ++ public interface TestCase { ++ /** the name of test case */ ++ String name(); ++ ++ /** tested method */ ++ Executable getExecutable(); ++ ++ /** object to invoke {@linkplain #getExecutable()} */ ++ Callable getCallable(); ++ ++ /** flag for OSR test case */ ++ boolean isOsr(); ++ } ++ ++ /** ++ * @return {@code true} if the current test case is OSR and the mode is ++ * Xcomp, otherwise {@code false} ++ */ ++ protected boolean skipXcompOSR() { ++ boolean result = testCase.isOsr() ++ && CompilerWhiteBoxTest.MODE.startsWith("compiled "); ++ if (result && IS_VERBOSE) { ++ System.err.printf("Warning: %s is not applicable in %s%n", ++ testCase.name(), CompilerWhiteBoxTest.MODE); ++ } ++ return result; ++ } + } + +-/** +- * Utility structure containing tested method and object to invoke it. +- */ +-enum TestCase { ++enum SimpleTestCase implements CompilerWhiteBoxTest.TestCase { + /** constructor test case */ + CONSTRUCTOR_TEST(Helper.CONSTRUCTOR, Helper.CONSTRUCTOR_CALLABLE, false), + /** method test case */ + METOD_TEST(Helper.METHOD, Helper.METHOD_CALLABLE, false), + /** static method test case */ + STATIC_TEST(Helper.STATIC, Helper.STATIC_CALLABLE, false), +- + /** OSR constructor test case */ + OSR_CONSTRUCTOR_TEST(Helper.OSR_CONSTRUCTOR, + Helper.OSR_CONSTRUCTOR_CALLABLE, true), +@@ -368,20 +436,32 @@ + /** OSR static method test case */ + OSR_STATIC_TEST(Helper.OSR_STATIC, Helper.OSR_STATIC_CALLABLE, true); + +- /** tested method */ +- final Executable executable; +- /** object to invoke {@linkplain #executable} */ +- final Callable callable; +- /** flag for OSR test case */ +- final boolean isOsr; ++ private final Executable executable; ++ private final Callable callable; ++ private final boolean isOsr; + +- private TestCase(Executable executable, Callable callable, ++ private SimpleTestCase(Executable executable, Callable callable, + boolean isOsr) { + this.executable = executable; + this.callable = callable; + this.isOsr = isOsr; + } + ++ @Override ++ public Executable getExecutable() { ++ return executable; ++ } ++ ++ @Override ++ public Callable getCallable() { ++ return callable; ++ } ++ ++ @Override ++ public boolean isOsr() { ++ return isOsr; ++ } ++ + private static class Helper { + + private static final Callable CONSTRUCTOR_CALLABLE +@@ -436,7 +516,6 @@ + } + }; + +- + private static final Constructor CONSTRUCTOR; + private static final Constructor OSR_CONSTRUCTOR; + private static final Method METHOD; +--- ./hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,19 +27,17 @@ + * @library /testlibrary /testlibrary/whitebox + * @build DeoptimizeAllTest + * @run main ClassFileInstaller sun.hotspot.WhiteBox +- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,TestCase$Helper::* DeoptimizeAllTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* DeoptimizeAllTest + * @summary testing of WB::deoptimizeAll() + * @author igor.ignatyev@oracle.com + */ + public class DeoptimizeAllTest extends CompilerWhiteBoxTest { + + public static void main(String[] args) throws Exception { +- for (TestCase test : TestCase.values()) { +- new DeoptimizeAllTest(test).runTest(); +- } ++ CompilerWhiteBoxTest.main(DeoptimizeAllTest::new, args); + } + +- public DeoptimizeAllTest(TestCase testCase) { ++ private DeoptimizeAllTest(TestCase testCase) { + super(testCase); + // to prevent inlining of #method + WHITE_BOX.testSetDontInlineMethod(method, true); +@@ -53,11 +51,8 @@ + */ + @Override + protected void test() throws Exception { +- if (testCase.isOsr && CompilerWhiteBoxTest.MODE.startsWith( +- "compiled ")) { +- System.err.printf("Warning: %s is not applicable in %s%n", +- testCase.name(), CompilerWhiteBoxTest.MODE); +- return; ++ if (skipXcompOSR()) { ++ return; + } + compile(); + checkCompiled(); +--- ./hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,19 +27,17 @@ + * @library /testlibrary /testlibrary/whitebox + * @build DeoptimizeMethodTest + * @run main ClassFileInstaller sun.hotspot.WhiteBox +- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,TestCase$Helper::* DeoptimizeMethodTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* DeoptimizeMethodTest + * @summary testing of WB::deoptimizeMethod() + * @author igor.ignatyev@oracle.com + */ + public class DeoptimizeMethodTest extends CompilerWhiteBoxTest { + + public static void main(String[] args) throws Exception { +- for (TestCase test : TestCase.values()) { +- new DeoptimizeMethodTest(test).runTest(); +- } ++ CompilerWhiteBoxTest.main(DeoptimizeMethodTest::new, args); + } + +- public DeoptimizeMethodTest(TestCase testCase) { ++ private DeoptimizeMethodTest(TestCase testCase) { + super(testCase); + // to prevent inlining of #method + WHITE_BOX.testSetDontInlineMethod(method, true); +@@ -53,11 +51,8 @@ + */ + @Override + protected void test() throws Exception { +- if (testCase.isOsr && CompilerWhiteBoxTest.MODE.startsWith( +- "compiled ")) { +- System.err.printf("Warning: %s is not applicable in %s%n", +- testCase.name(), CompilerWhiteBoxTest.MODE); +- return; ++ if (skipXcompOSR()) { ++ return; + } + compile(); + checkCompiled(); +--- ./hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -27,19 +27,17 @@ + * @library /testlibrary /testlibrary/whitebox + * @build EnqueueMethodForCompilationTest + * @run main ClassFileInstaller sun.hotspot.WhiteBox +- * @run main/othervm/timeout=600 -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,TestCase$Helper::* EnqueueMethodForCompilationTest ++ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* EnqueueMethodForCompilationTest + * @summary testing of WB::enqueueMethodForCompilation() + * @author igor.ignatyev@oracle.com + */ + public class EnqueueMethodForCompilationTest extends CompilerWhiteBoxTest { + + public static void main(String[] args) throws Exception { +- for (TestCase test : TestCase.values()) { +- new EnqueueMethodForCompilationTest(test).runTest(); +- } ++ CompilerWhiteBoxTest.main(EnqueueMethodForCompilationTest::new, args); + } + +- public EnqueueMethodForCompilationTest(TestCase testCase) { ++ private EnqueueMethodForCompilationTest(TestCase testCase) { + super(testCase); + // to prevent inlining of #method + WHITE_BOX.testSetDontInlineMethod(method, true); +--- ./hotspot/test/compiler/whitebox/GetNMethodTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/compiler/whitebox/GetNMethodTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,71 @@ ++/* ++ * 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 sun.hotspot.code.NMethod; ++ ++/* ++ * @test GetNMethodTest ++ * @bug 8038240 ++ * @library /testlibrary /testlibrary/whitebox ++ * @build GetNMethodTest ++ * @run main ClassFileInstaller sun.hotspot.WhiteBox ++ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* GetNMethodTest ++ * @summary testing of WB::getNMethod() ++ * @author igor.ignatyev@oracle.com ++ */ ++public class GetNMethodTest extends CompilerWhiteBoxTest { ++ public static void main(String[] args) throws Exception { ++ CompilerWhiteBoxTest.main(GetNMethodTest::new, args); ++ } ++ ++ private GetNMethodTest(TestCase testCase) { ++ super(testCase); ++ // to prevent inlining of #method ++ WHITE_BOX.testSetDontInlineMethod(method, true); ++ } ++ ++ @Override ++ protected void test() throws Exception { ++ checkNotCompiled(); ++ ++ compile(); ++ checkCompiled(); ++ NMethod nmethod = NMethod.get(method, testCase.isOsr()); ++ if (IS_VERBOSE) { ++ System.out.println("nmethod = " + nmethod); ++ } ++ if (nmethod == null) { ++ throw new RuntimeException("nmethod of compiled method is null"); ++ } ++ if (nmethod.insts.length == 0) { ++ throw new RuntimeException("compiled method's instructions is empty"); ++ } ++ deoptimize(); ++ checkNotCompiled(); ++ nmethod = NMethod.get(method, testCase.isOsr()); ++ if (nmethod != null) { ++ throw new RuntimeException("nmethod of non-compiled method isn't null"); ++ } ++ } ++} +--- ./hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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,13 +24,17 @@ + /* + * @test IsMethodCompilableTest + * @bug 8007270 8006683 8007288 8022832 +- * @library /testlibrary /testlibrary/whitebox ++ * @library /testlibrary /testlibrary/whitebox /testlibrary/com/oracle/java/testlibrary + * @build IsMethodCompilableTest + * @run main ClassFileInstaller sun.hotspot.WhiteBox +- * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,TestCase$Helper::* IsMethodCompilableTest ++ * @run main ClassFileInstaller com.oracle.java.testlibrary.Platform ++ * @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 + */ ++ ++import com.oracle.java.testlibrary.Platform; ++ + public class IsMethodCompilableTest extends CompilerWhiteBoxTest { + /** + * Value of {@code -XX:PerMethodRecompilationCutoff} +@@ -43,17 +47,15 @@ + if (tmp == -1) { + PER_METHOD_RECOMPILATION_CUTOFF = -1 /* Inf */; + } else { +- PER_METHOD_RECOMPILATION_CUTOFF = 1 + (0xFFFFFFFFL & tmp); ++ PER_METHOD_RECOMPILATION_CUTOFF = (0xFFFFFFFFL & tmp); + } + } + + public static void main(String[] args) throws Exception { +- for (TestCase test : TestCase.values()) { +- new IsMethodCompilableTest(test).runTest(); +- } ++ CompilerWhiteBoxTest.main(IsMethodCompilableTest::new, args); + } + +- public IsMethodCompilableTest(TestCase testCase) { ++ private IsMethodCompilableTest(TestCase testCase) { + super(testCase); + // to prevent inlining of #method + WHITE_BOX.testSetDontInlineMethod(method, true); +@@ -62,19 +64,22 @@ + /** + * Tests {@code WB::isMethodCompilable()} by recompilation of tested method + * 'PerMethodRecompilationCutoff' times and checks compilation status. Also +- * checks that WB::clearMethodState() clears no-compilable flags. ++ * checks that WB::clearMethodState() clears no-compilable flags. Only ++ * applicable to c2 compiled methods. + * + * @throws Exception if one of the checks fails. + */ + @Override + protected void test() throws Exception { +- if (testCase.isOsr && CompilerWhiteBoxTest.MODE.startsWith( +- "compiled ")) { +- System.err.printf("Warning: %s is not applicable in %s%n", +- testCase.name(), CompilerWhiteBoxTest.MODE); ++ // Only c2 compilations can be disabled through PerMethodRecompilationCutoff ++ if (!Platform.isServer()) { ++ return; ++ } ++ ++ if (skipXcompOSR()) { + return; + } +- if (!isCompilable()) { ++ if (!isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) { + throw new RuntimeException(method + " must be compilable"); + } + System.out.println("PerMethodRecompilationCutoff = " +@@ -85,39 +90,37 @@ + return; + } + +- // deoptimize 'PerMethodRecompilationCutoff' times and clear state +- for (long i = 0L, n = PER_METHOD_RECOMPILATION_CUTOFF - 1; i < n; ++i) { +- compileAndDeoptimize(); ++ // deoptimize 'PerMethodRecompilationCutoff' times ++ for (long attempts = 0, successes = 0; ++ (successes < PER_METHOD_RECOMPILATION_CUTOFF) && ++ (attempts < PER_METHOD_RECOMPILATION_CUTOFF*2) && ++ isCompilable(COMP_LEVEL_FULL_OPTIMIZATION); attempts++) { ++ if (compileAndDeoptimize() == COMP_LEVEL_FULL_OPTIMIZATION) { ++ successes++; ++ } + } +- if (!testCase.isOsr && !isCompilable()) { ++ ++ if (!testCase.isOsr() && !isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) { + // in osr test case count of deopt maybe more than iterations + throw new RuntimeException(method + " is not compilable after " +- + (PER_METHOD_RECOMPILATION_CUTOFF - 1) + " iterations"); ++ + PER_METHOD_RECOMPILATION_CUTOFF + " iterations"); + } +- WHITE_BOX.clearMethodState(method); + +- // deoptimize 'PerMethodRecompilationCutoff' + 1 times +- long i; +- for (i = 0L; i < PER_METHOD_RECOMPILATION_CUTOFF +- && isCompilable(); ++i) { +- compileAndDeoptimize(); +- } +- if (!testCase.isOsr && i != PER_METHOD_RECOMPILATION_CUTOFF) { +- // in osr test case count of deopt maybe more than iterations +- throw new RuntimeException(method + " is not compilable after " +- + i + " iterations, but must only after " +- + PER_METHOD_RECOMPILATION_CUTOFF); +- } +- if (isCompilable()) { ++ // Now compile once more ++ compileAndDeoptimize(); ++ ++ if (isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) { + throw new RuntimeException(method + " is still compilable after " + + PER_METHOD_RECOMPILATION_CUTOFF + " iterations"); + } ++ checkNotCompiled(); + compile(); +- checkNotCompiled(); ++ waitBackgroundCompilation(); ++ checkNotCompiled(COMP_LEVEL_FULL_OPTIMIZATION); + + // WB.clearMethodState() must reset no-compilable flags + WHITE_BOX.clearMethodState(method); +- if (!isCompilable()) { ++ if (!isCompilable(COMP_LEVEL_FULL_OPTIMIZATION)) { + throw new RuntimeException(method + + " is not compilable after clearMethodState()"); + } +@@ -125,9 +128,11 @@ + checkCompiled(); + } + +- private void compileAndDeoptimize() throws Exception { ++ private int compileAndDeoptimize() throws Exception { + compile(); + waitBackgroundCompilation(); ++ int compLevel = getCompLevel(); + deoptimize(); ++ return compLevel; + } + } +--- ./hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,26 +27,17 @@ + * @library /testlibrary /testlibrary/whitebox + * @build MakeMethodNotCompilableTest + * @run main ClassFileInstaller sun.hotspot.WhiteBox +- * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,TestCase$Helper::* MakeMethodNotCompilableTest ++ * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* MakeMethodNotCompilableTest + * @summary testing of WB::makeMethodNotCompilable() + * @author igor.ignatyev@oracle.com + */ + public class MakeMethodNotCompilableTest extends CompilerWhiteBoxTest { + private int bci; + public static void main(String[] args) throws Exception { +- if (args.length == 0) { +- for (TestCase test : TestCase.values()) { +- new MakeMethodNotCompilableTest(test).runTest(); +- } +- } else { +- for (String name : args) { +- new MakeMethodNotCompilableTest( +- TestCase.valueOf(name)).runTest(); +- } +- } ++ CompilerWhiteBoxTest.main(MakeMethodNotCompilableTest::new, args); + } + +- public MakeMethodNotCompilableTest(TestCase testCase) { ++ private MakeMethodNotCompilableTest(TestCase testCase) { + super(testCase); + // to prevent inlining of #method + WHITE_BOX.testSetDontInlineMethod(method, true); +@@ -62,11 +53,8 @@ + */ + @Override + protected void test() throws Exception { +- if (testCase.isOsr && CompilerWhiteBoxTest.MODE.startsWith( +- "compiled ")) { +- System.err.printf("Warning: %s is not applicable in %s%n", +- testCase.name(), CompilerWhiteBoxTest.MODE); +- return; ++ if (skipXcompOSR()) { ++ return; + } + checkNotCompiled(); + if (!isCompilable()) { +--- ./hotspot/test/compiler/whitebox/SetDontInlineMethodTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/whitebox/SetDontInlineMethodTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -27,19 +27,17 @@ + * @library /testlibrary /testlibrary/whitebox + * @build SetDontInlineMethodTest + * @run main ClassFileInstaller sun.hotspot.WhiteBox +- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,TestCase$Helper::* SetDontInlineMethodTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* SetDontInlineMethodTest + * @summary testing of WB::testSetDontInlineMethod() + * @author igor.ignatyev@oracle.com + */ + public class SetDontInlineMethodTest extends CompilerWhiteBoxTest { + + public static void main(String[] args) throws Exception { +- for (TestCase test : TestCase.values()) { +- new SetDontInlineMethodTest(test).runTest(); +- } ++ CompilerWhiteBoxTest.main(SetDontInlineMethodTest::new, args); + } + +- public SetDontInlineMethodTest(TestCase testCase) { ++ private SetDontInlineMethodTest(TestCase testCase) { + super(testCase); + } + +--- ./hotspot/test/compiler/whitebox/SetForceInlineMethodTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/compiler/whitebox/SetForceInlineMethodTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -27,19 +27,17 @@ + * @library /testlibrary /testlibrary/whitebox + * @build SetForceInlineMethodTest + * @run main ClassFileInstaller sun.hotspot.WhiteBox +- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,TestCase$Helper::* SetForceInlineMethodTest ++ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* SetForceInlineMethodTest + * @summary testing of WB::testSetForceInlineMethod() + * @author igor.ignatyev@oracle.com + */ + public class SetForceInlineMethodTest extends CompilerWhiteBoxTest { + + public static void main(String[] args) throws Exception { +- for (TestCase test : TestCase.values()) { +- new SetForceInlineMethodTest(test).runTest(); +- } ++ CompilerWhiteBoxTest.main(SetForceInlineMethodTest::new, args); + } + +- public SetForceInlineMethodTest(TestCase testCase) { ++ private SetForceInlineMethodTest(TestCase testCase) { + super(testCase); + } + +--- ./hotspot/test/gc/TestGCLogRotationViaJcmd.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/TestGCLogRotationViaJcmd.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,77 @@ ++/* ++ * 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 TestGCLogRotationViaJcmd.java ++ * @bug 7090324 ++ * @summary test for gc log rotation via jcmd ++ * @library /testlibrary ++ * @run main/othervm -Xloggc:test.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 TestGCLogRotationViaJcmd ++ * ++ */ ++import com.oracle.java.testlibrary.*; ++import java.io.File; ++import java.io.FilenameFilter; ++ ++public class TestGCLogRotationViaJcmd { ++ ++ static final File currentDirectory = new File("."); ++ static final String LOG_FILE_NAME = "test.log"; ++ static final int NUM_LOGS = 3; ++ ++ static FilenameFilter logFilter = new FilenameFilter() { ++ @Override ++ public boolean accept(File dir, String name) { ++ return name.startsWith(LOG_FILE_NAME); ++ } ++ }; ++ ++ public static void main(String[] args) throws Exception { ++ // Grab the pid from the current java process ++ String pid = Integer.toString(ProcessTools.getProcessId()); ++ ++ // Create a JDKToolLauncher ++ JDKToolLauncher jcmd = JDKToolLauncher.create("jcmd") ++ .addToolArg(pid) ++ .addToolArg("GC.rotate_log"); ++ ++ for (int times = 1; times < NUM_LOGS; times++) { ++ // Run jcmd GC.rotate_log ++ ProcessBuilder pb = new ProcessBuilder(jcmd.getCommand()); ++ ++ // Make sure we didn't crash ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ output.shouldHaveExitValue(0); ++ } ++ ++ // GC log check ++ File[] logs = currentDirectory.listFiles(logFilter); ++ if (logs.length != NUM_LOGS) { ++ throw new Error("There are only " + logs.length ++ + " logs instead " + NUM_LOGS); ++ } ++ ++ } ++ ++} ++ +--- ./hotspot/test/gc/TestVerifySilently.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/TestVerifySilently.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,84 @@ ++/* ++ * 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 TestVerifySilently.java ++ * @key gc ++ * @bug 8032771 ++ * @summary Test silent verification. ++ * @library /testlibrary ++ */ ++ ++import com.oracle.java.testlibrary.OutputAnalyzer; ++import com.oracle.java.testlibrary.ProcessTools; ++import java.util.ArrayList; ++import java.util.Collections; ++ ++class RunSystemGC { ++ public static void main(String args[]) throws Exception { ++ System.gc(); ++ } ++} ++ ++ ++public class TestVerifySilently { ++ private static String[] getTestJavaOpts() { ++ String testVmOptsStr = System.getProperty("test.java.opts"); ++ if (!testVmOptsStr.isEmpty()) { ++ return testVmOptsStr.split(" "); ++ } else { ++ return new String[] {}; ++ } ++ } ++ ++ private static OutputAnalyzer runTest(boolean verifySilently) throws Exception { ++ ArrayList vmOpts = new ArrayList(); ++ ++ Collections.addAll(vmOpts, getTestJavaOpts()); ++ Collections.addAll(vmOpts, new String[] {"-XX:+UnlockDiagnosticVMOptions", ++ "-XX:+VerifyDuringStartup", ++ "-XX:+VerifyBeforeGC", ++ "-XX:+VerifyAfterGC", ++ "-XX:" + (verifySilently ? "+":"-") + "VerifySilently", ++ RunSystemGC.class.getName()}); ++ ProcessBuilder pb = ++ ProcessTools.createJavaProcessBuilder(vmOpts.toArray(new String[vmOpts.size()])); ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ ++ System.out.println("Output:\n" + output.getOutput()); ++ return output; ++ } ++ ++ ++ public static void main(String args[]) throws Exception { ++ ++ OutputAnalyzer output; ++ ++ output = runTest(false); ++ output.shouldContain("[Verifying"); ++ output.shouldHaveExitValue(0); ++ ++ output = runTest(true); ++ output.shouldNotContain("[Verifying"); ++ output.shouldHaveExitValue(0); ++ } ++} +--- ./hotspot/test/gc/arguments/TestDynMaxHeapFreeRatio.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/arguments/TestDynMaxHeapFreeRatio.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,64 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test TestDynMaxHeapFreeRatio ++ * @bug 8028391 ++ * @summary Verify that MaxHeapFreeRatio flag is manageable ++ * @library /testlibrary ++ * @run main TestDynMaxHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 TestDynMaxHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=50 -XX:-UseAdaptiveSizePolicy TestDynMaxHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=50 TestDynMaxHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=51 -XX:MaxHeapFreeRatio=52 TestDynMaxHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=75 -XX:MaxHeapFreeRatio=100 TestDynMaxHeapFreeRatio ++ */ ++import com.oracle.java.testlibrary.TestDynamicVMOption; ++import com.oracle.java.testlibrary.DynamicVMOptionChecker; ++ ++public class TestDynMaxHeapFreeRatio extends TestDynamicVMOption { ++ ++ public static final String MinFreeRatioFlagName = "MinHeapFreeRatio"; ++ public static final String MaxFreeRatioFlagName = "MaxHeapFreeRatio"; ++ ++ public TestDynMaxHeapFreeRatio() { ++ super(MaxFreeRatioFlagName); ++ } ++ ++ public void test() { ++ ++ int minHeapFreeValue = DynamicVMOptionChecker.getIntValue(MinFreeRatioFlagName); ++ System.out.println(MinFreeRatioFlagName + " = " + minHeapFreeValue); ++ ++ testPercentageValues(); ++ ++ checkInvalidValue(Integer.toString(minHeapFreeValue - 1)); ++ checkValidValue(Integer.toString(minHeapFreeValue)); ++ checkValidValue("100"); ++ } ++ ++ public static void main(String args[]) throws Exception { ++ new TestDynMaxHeapFreeRatio().test(); ++ } ++ ++} +--- ./hotspot/test/gc/arguments/TestDynMinHeapFreeRatio.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/arguments/TestDynMinHeapFreeRatio.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,62 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * 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 TestDynMinHeapFreeRatio ++ * @bug 8028391 ++ * @summary Verify that MinHeapFreeRatio flag is manageable ++ * @library /testlibrary ++ * @run main TestDynMinHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 TestDynMinHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=50 -XX:-UseAdaptiveSizePolicy TestDynMinHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=50 TestDynMinHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=51 -XX:MaxHeapFreeRatio=52 TestDynMinHeapFreeRatio ++ * @run main/othervm -XX:MinHeapFreeRatio=75 -XX:MaxHeapFreeRatio=100 TestDynMinHeapFreeRatio ++ */ ++import com.oracle.java.testlibrary.TestDynamicVMOption; ++import com.oracle.java.testlibrary.DynamicVMOptionChecker; ++ ++public class TestDynMinHeapFreeRatio extends TestDynamicVMOption { ++ ++ public static final String MinFreeRatioFlagName = "MinHeapFreeRatio"; ++ public static final String MaxFreeRatioFlagName = "MaxHeapFreeRatio"; ++ ++ public TestDynMinHeapFreeRatio() { ++ super(MinFreeRatioFlagName); ++ } ++ ++ public void test() { ++ int maxHeapFreeValue = DynamicVMOptionChecker.getIntValue(MaxFreeRatioFlagName); ++ System.out.println(MaxFreeRatioFlagName + " = " + maxHeapFreeValue); ++ ++ testPercentageValues(); ++ ++ checkInvalidValue(Integer.toString(maxHeapFreeValue + 1)); ++ checkValidValue(Integer.toString(maxHeapFreeValue)); ++ checkValidValue("0"); ++ } ++ ++ public static void main(String args[]) throws Exception { ++ new TestDynMinHeapFreeRatio().test(); ++ } ++} +--- ./hotspot/test/gc/g1/TestGCLogMessages.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestGCLogMessages.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,152 @@ ++/* ++ * 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 TestPrintGCDetails ++ * @bug 8035406 8027295 8035398 ++ * @summary Ensure that the PrintGCDetails output for a minor GC with G1 ++ * includes the expected necessary messages. ++ * @key gc ++ * @library /testlibrary ++ */ ++ ++import com.oracle.java.testlibrary.ProcessTools; ++import com.oracle.java.testlibrary.OutputAnalyzer; ++ ++public class TestGCLogMessages { ++ public static void main(String[] args) throws Exception { ++ testNormalLogs(); ++ testWithToSpaceExhaustionLogs(); ++ } ++ ++ private static void testNormalLogs() throws Exception { ++ ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UseG1GC", ++ "-Xmx10M", ++ GCTest.class.getName()); ++ ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ ++ output.shouldNotContain("[Redirty Cards"); ++ output.shouldNotContain("[Code Root Purge"); ++ output.shouldNotContain("[String Dedup Fixup"); ++ output.shouldNotContain("[Young Free CSet"); ++ output.shouldNotContain("[Non-Young Free CSet"); ++ output.shouldHaveExitValue(0); ++ ++ pb = ProcessTools.createJavaProcessBuilder("-XX:+UseG1GC", ++ "-XX:+UseStringDeduplication", ++ "-Xmx10M", ++ "-XX:+PrintGCDetails", ++ GCTest.class.getName()); ++ ++ output = new OutputAnalyzer(pb.start()); ++ ++ output.shouldContain("[Redirty Cards"); ++ output.shouldContain("[Code Root Purge"); ++ output.shouldContain("[String Dedup Fixup"); ++ output.shouldNotContain("[Young Free CSet"); ++ output.shouldNotContain("[Non-Young Free CSet"); ++ output.shouldHaveExitValue(0); ++ ++ pb = ProcessTools.createJavaProcessBuilder("-XX:+UseG1GC", ++ "-XX:+UseStringDeduplication", ++ "-Xmx10M", ++ "-XX:+PrintGCDetails", ++ "-XX:+UnlockExperimentalVMOptions", ++ "-XX:G1LogLevel=finest", ++ GCTest.class.getName()); ++ ++ output = new OutputAnalyzer(pb.start()); ++ ++ output.shouldContain("[Redirty Cards"); ++ output.shouldContain("[Code Root Purge"); ++ output.shouldContain("[String Dedup Fixup"); ++ output.shouldContain("[Young Free CSet"); ++ output.shouldContain("[Non-Young Free CSet"); ++ ++ // also check evacuation failure messages once ++ output.shouldNotContain("[Evacuation Failure"); ++ output.shouldNotContain("[Recalculate Used"); ++ output.shouldNotContain("[Remove Self Forwards"); ++ output.shouldNotContain("[Restore RemSet"); ++ output.shouldHaveExitValue(0); ++ } ++ ++ private static void testWithToSpaceExhaustionLogs() throws Exception { ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UseG1GC", ++ "-Xmx10M", ++ "-Xmn5M", ++ "-XX:+PrintGCDetails", ++ GCTestWithToSpaceExhaustion.class.getName()); ++ ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ output.shouldContain("[Evacuation Failure"); ++ output.shouldNotContain("[Recalculate Used"); ++ output.shouldNotContain("[Remove Self Forwards"); ++ output.shouldNotContain("[Restore RemSet"); ++ output.shouldHaveExitValue(0); ++ ++ pb = ProcessTools.createJavaProcessBuilder("-XX:+UseG1GC", ++ "-Xmx10M", ++ "-Xmn5M", ++ "-XX:+PrintGCDetails", ++ "-XX:+UnlockExperimentalVMOptions", ++ "-XX:G1LogLevel=finest", ++ GCTestWithToSpaceExhaustion.class.getName()); ++ ++ output = new OutputAnalyzer(pb.start()); ++ output.shouldContain("[Evacuation Failure"); ++ output.shouldContain("[Recalculate Used"); ++ output.shouldContain("[Remove Self Forwards"); ++ output.shouldContain("[Restore RemSet"); ++ output.shouldHaveExitValue(0); ++ } ++ ++ static class GCTest { ++ private static byte[] garbage; ++ public static void main(String [] args) { ++ System.out.println("Creating garbage"); ++ // create 128MB of garbage. This should result in at least one GC ++ for (int i = 0; i < 1024; i++) { ++ garbage = new byte[128 * 1024]; ++ } ++ System.out.println("Done"); ++ } ++ } ++ ++ static class GCTestWithToSpaceExhaustion { ++ private static byte[] garbage; ++ private static byte[] largeObject; ++ public static void main(String [] args) { ++ largeObject = new byte[5*1024*1024]; ++ System.out.println("Creating garbage"); ++ // create 128MB of garbage. This should result in at least one GC, ++ // some of them with to-space exhaustion. ++ for (int i = 0; i < 1024; i++) { ++ garbage = new byte[128 * 1024]; ++ } ++ System.out.println("Done"); ++ } ++ } ++} +--- ./hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 TestStringDeduplicationAgeThreshold ++ * @summary Test string deduplication age threshold ++ * @bug 8029075 ++ * @key gc ++ * @library /testlibrary ++ */ ++ ++public class TestStringDeduplicationAgeThreshold { ++ public static void main(String[] args) throws Exception { ++ TestStringDeduplicationTools.testAgeThreshold(); ++ } ++} +--- ./hotspot/test/gc/g1/TestStringDeduplicationFullGC.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestStringDeduplicationFullGC.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 TestStringDeduplicationFullGC ++ * @summary Test string deduplication during full GC ++ * @bug 8029075 ++ * @key gc ++ * @library /testlibrary ++ */ ++ ++public class TestStringDeduplicationFullGC { ++ public static void main(String[] args) throws Exception { ++ TestStringDeduplicationTools.testFullGC(); ++ } ++} +--- ./hotspot/test/gc/g1/TestStringDeduplicationInterned.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestStringDeduplicationInterned.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 TestStringDeduplicationInterned ++ * @summary Test string deduplication of interned strings ++ * @bug 8029075 ++ * @key gc ++ * @library /testlibrary ++ */ ++ ++public class TestStringDeduplicationInterned { ++ public static void main(String[] args) throws Exception { ++ TestStringDeduplicationTools.testInterned(); ++ } ++} +--- ./hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 TestStringDeduplicationPrintOptions ++ * @summary Test string deduplication print options ++ * @bug 8029075 ++ * @key gc ++ * @library /testlibrary ++ */ ++ ++public class TestStringDeduplicationPrintOptions { ++ public static void main(String[] args) throws Exception { ++ TestStringDeduplicationTools.testPrintOptions(); ++ } ++} +--- ./hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 TestStringDeduplicationTableRehash ++ * @summary Test string deduplication table rehash ++ * @bug 8029075 ++ * @key gc ++ * @library /testlibrary ++ */ ++ ++public class TestStringDeduplicationTableRehash { ++ public static void main(String[] args) throws Exception { ++ TestStringDeduplicationTools.testTableRehash(); ++ } ++} +--- ./hotspot/test/gc/g1/TestStringDeduplicationTableResize.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestStringDeduplicationTableResize.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 TestStringDeduplicationTableResize ++ * @summary Test string deduplication table resize ++ * @bug 8029075 ++ * @key gc ++ * @library /testlibrary ++ */ ++ ++public class TestStringDeduplicationTableResize { ++ public static void main(String[] args) throws Exception { ++ TestStringDeduplicationTools.testTableResize(); ++ } ++} +--- ./hotspot/test/gc/g1/TestStringDeduplicationTools.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestStringDeduplicationTools.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,434 @@ ++/* ++ * 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. ++ */ ++ ++/* ++ * Common code for string deduplication tests ++ */ ++ ++import java.lang.management.*; ++import java.lang.reflect.*; ++import java.security.*; ++import java.util.*; ++import com.oracle.java.testlibrary.*; ++import sun.misc.*; ++ ++class TestStringDeduplicationTools { ++ private static final String YoungGC = "YoungGC"; ++ private static final String FullGC = "FullGC"; ++ ++ private static final int Xmn = 50; // MB ++ private static final int Xms = 100; // MB ++ private static final int Xmx = 100; // MB ++ private static final int MB = 1024 * 1024; ++ private static final int StringLength = 50; ++ ++ private static Field valueField; ++ private static Unsafe unsafe; ++ private static byte[] dummy; ++ ++ static { ++ try { ++ Field field = Unsafe.class.getDeclaredField("theUnsafe"); ++ field.setAccessible(true); ++ unsafe = (Unsafe)field.get(null); ++ ++ valueField = String.class.getDeclaredField("value"); ++ valueField.setAccessible(true); ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++ ++ private static Object getValue(String string) { ++ try { ++ return valueField.get(string); ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++ ++ private static void doFullGc(int numberOfTimes) { ++ for (int i = 0; i < numberOfTimes; i++) { ++ System.out.println("Begin: Full GC " + (i + 1) + "/" + numberOfTimes); ++ System.gc(); ++ System.out.println("End: Full GC " + (i + 1) + "/" + numberOfTimes); ++ } ++ } ++ ++ private static void doYoungGc(int numberOfTimes) { ++ // Provoke at least numberOfTimes young GCs ++ final int objectSize = 128; ++ final int maxObjectInYoung = (Xmn * MB) / objectSize; ++ for (int i = 0; i < numberOfTimes; i++) { ++ System.out.println("Begin: Young GC " + (i + 1) + "/" + numberOfTimes); ++ for (int j = 0; j < maxObjectInYoung + 1; j++) { ++ dummy = new byte[objectSize]; ++ } ++ System.out.println("End: Young GC " + (i + 1) + "/" + numberOfTimes); ++ } ++ } ++ ++ private static void forceDeduplication(int ageThreshold, String gcType) { ++ // Force deduplication to happen by either causing a FullGC or a YoungGC. ++ // We do several collections to also provoke a situation where the the ++ // deduplication thread needs to yield while processing the queue. This ++ // also tests that the references in the deduplication queue are adjusted ++ // accordingly. ++ if (gcType.equals(FullGC)) { ++ doFullGc(3); ++ } else { ++ doYoungGc(ageThreshold + 3); ++ } ++ } ++ ++ private static String generateString(int id) { ++ StringBuilder builder = new StringBuilder(StringLength); ++ ++ builder.append("DeduplicationTestString:" + id + ":"); ++ ++ while (builder.length() < StringLength) { ++ builder.append('X'); ++ } ++ ++ return builder.toString(); ++ } ++ ++ private static ArrayList createStrings(int total, int unique) { ++ System.out.println("Creating strings: total=" + total + ", unique=" + unique); ++ if (total % unique != 0) { ++ throw new RuntimeException("Total must be divisible by unique"); ++ } ++ ++ ArrayList list = new ArrayList(total); ++ for (int j = 0; j < total / unique; j++) { ++ for (int i = 0; i < unique; i++) { ++ list.add(generateString(i)); ++ } ++ } ++ ++ return list; ++ } ++ ++ private static void verifyStrings(ArrayList list, int uniqueExpected) { ++ for (;;) { ++ // Check number of deduplicated strings ++ ArrayList unique = new ArrayList(uniqueExpected); ++ for (String string: list) { ++ Object value = getValue(string); ++ boolean uniqueValue = true; ++ for (Object obj: unique) { ++ if (obj == value) { ++ uniqueValue = false; ++ break; ++ } ++ } ++ ++ if (uniqueValue) { ++ unique.add(value); ++ } ++ } ++ ++ System.out.println("Verifying strings: total=" + list.size() + ++ ", uniqueFound=" + unique.size() + ++ ", uniqueExpected=" + uniqueExpected); ++ ++ if (unique.size() == uniqueExpected) { ++ System.out.println("Deduplication completed"); ++ break; ++ } else { ++ System.out.println("Deduplication not completed, waiting..."); ++ ++ // Give the deduplication thread time to complete ++ try { ++ Thread.sleep(1000); ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++ } ++ } ++ ++ private static OutputAnalyzer runTest(String... extraArgs) throws Exception { ++ String[] defaultArgs = new String[] { ++ "-Xmn" + Xmn + "m", ++ "-Xms" + Xms + "m", ++ "-Xmx" + Xmx + "m", ++ "-XX:+UseG1GC", ++ "-XX:+UnlockDiagnosticVMOptions", ++ "-XX:+VerifyAfterGC" // Always verify after GC ++ }; ++ ++ ArrayList args = new ArrayList(); ++ args.addAll(Arrays.asList(defaultArgs)); ++ args.addAll(Arrays.asList(extraArgs)); ++ ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args.toArray(new String[args.size()])); ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ System.err.println(output.getStderr()); ++ System.out.println(output.getStdout()); ++ return output; ++ } ++ ++ private static class DeduplicationTest { ++ public static void main(String[] args) { ++ System.out.println("Begin: DeduplicationTest"); ++ ++ final int numberOfStrings = Integer.parseUnsignedInt(args[0]); ++ final int numberOfUniqueStrings = Integer.parseUnsignedInt(args[1]); ++ final int ageThreshold = Integer.parseUnsignedInt(args[2]); ++ final String gcType = args[3]; ++ ++ ArrayList list = createStrings(numberOfStrings, numberOfUniqueStrings); ++ forceDeduplication(ageThreshold, gcType); ++ verifyStrings(list, numberOfUniqueStrings); ++ ++ System.out.println("End: DeduplicationTest"); ++ } ++ ++ public static OutputAnalyzer run(int numberOfStrings, int ageThreshold, String gcType, String... extraArgs) throws Exception { ++ String[] defaultArgs = new String[] { ++ "-XX:+UseStringDeduplication", ++ "-XX:StringDeduplicationAgeThreshold=" + ageThreshold, ++ DeduplicationTest.class.getName(), ++ "" + numberOfStrings, ++ "" + numberOfStrings / 2, ++ "" + ageThreshold, ++ gcType ++ }; ++ ++ ArrayList args = new ArrayList(); ++ args.addAll(Arrays.asList(extraArgs)); ++ args.addAll(Arrays.asList(defaultArgs)); ++ ++ return runTest(args.toArray(new String[args.size()])); ++ } ++ } ++ ++ private static class InternedTest { ++ public static void main(String[] args) { ++ // This test verifies that interned strings are always ++ // deduplicated when being interned, and never after ++ // being interned. ++ ++ System.out.println("Begin: InternedTest"); ++ ++ final int ageThreshold = Integer.parseUnsignedInt(args[0]); ++ final String baseString = "DeduplicationTestString:" + InternedTest.class.getName(); ++ ++ // Create duplicate of baseString ++ StringBuilder sb1 = new StringBuilder(baseString); ++ String dupString1 = sb1.toString(); ++ if (getValue(dupString1) == getValue(baseString)) { ++ throw new RuntimeException("Values should not match"); ++ } ++ ++ // Force baseString to be inspected for deduplication ++ // and be inserted into the deduplication hashtable. ++ forceDeduplication(ageThreshold, FullGC); ++ ++ // Wait for deduplication to occur ++ while (getValue(dupString1) != getValue(baseString)) { ++ System.out.println("Waiting..."); ++ try { ++ Thread.sleep(100); ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++ ++ // Create a new duplicate of baseString ++ StringBuilder sb2 = new StringBuilder(baseString); ++ String dupString2 = sb2.toString(); ++ if (getValue(dupString2) == getValue(baseString)) { ++ throw new RuntimeException("Values should not match"); ++ } ++ ++ // Intern the new duplicate ++ Object beforeInternedValue = getValue(dupString2); ++ String internedString = dupString2.intern(); ++ if (internedString != dupString2) { ++ throw new RuntimeException("String should match"); ++ } ++ if (getValue(internedString) != getValue(baseString)) { ++ throw new RuntimeException("Values should match"); ++ } ++ ++ // Check original value of interned string, to make sure ++ // deduplication happened on the interned string and not ++ // on the base string ++ if (beforeInternedValue == getValue(baseString)) { ++ throw new RuntimeException("Values should not match"); ++ } ++ ++ System.out.println("End: InternedTest"); ++ } ++ ++ public static OutputAnalyzer run() throws Exception { ++ return runTest("-XX:+PrintGC", ++ "-XX:+PrintGCDetails", ++ "-XX:+UseStringDeduplication", ++ "-XX:+PrintStringDeduplicationStatistics", ++ "-XX:StringDeduplicationAgeThreshold=" + DefaultAgeThreshold, ++ InternedTest.class.getName(), ++ "" + DefaultAgeThreshold); ++ } ++ } ++ ++ /* ++ * Tests ++ */ ++ ++ private static final int LargeNumberOfStrings = 10000; ++ private static final int SmallNumberOfStrings = 10; ++ ++ private static final int MaxAgeThreshold = 15; ++ private static final int DefaultAgeThreshold = 3; ++ private static final int MinAgeThreshold = 1; ++ ++ private static final int TooLowAgeThreshold = MinAgeThreshold - 1; ++ private static final int TooHighAgeThreshold = MaxAgeThreshold + 1; ++ ++ public static void testYoungGC() throws Exception { ++ // Do young GC to age strings to provoke deduplication ++ OutputAnalyzer output = DeduplicationTest.run(LargeNumberOfStrings, ++ DefaultAgeThreshold, ++ YoungGC, ++ "-XX:+PrintGC", ++ "-XX:+PrintStringDeduplicationStatistics"); ++ output.shouldNotContain("Full GC"); ++ output.shouldContain("GC pause (G1 Evacuation Pause) (young)"); ++ output.shouldContain("GC concurrent-string-deduplication"); ++ output.shouldContain("Deduplicated:"); ++ output.shouldHaveExitValue(0); ++ } ++ ++ public static void testFullGC() throws Exception { ++ // Do full GC to age strings to provoke deduplication ++ OutputAnalyzer output = DeduplicationTest.run(LargeNumberOfStrings, ++ DefaultAgeThreshold, ++ FullGC, ++ "-XX:+PrintGC", ++ "-XX:+PrintStringDeduplicationStatistics"); ++ output.shouldNotContain("GC pause (G1 Evacuation Pause) (young)"); ++ output.shouldContain("Full GC"); ++ output.shouldContain("GC concurrent-string-deduplication"); ++ output.shouldContain("Deduplicated:"); ++ output.shouldHaveExitValue(0); ++ } ++ ++ public static void testTableResize() throws Exception { ++ // Test with StringDeduplicationResizeALot ++ OutputAnalyzer output = DeduplicationTest.run(LargeNumberOfStrings, ++ DefaultAgeThreshold, ++ YoungGC, ++ "-XX:+PrintGC", ++ "-XX:+PrintStringDeduplicationStatistics", ++ "-XX:+StringDeduplicationResizeALot"); ++ output.shouldContain("GC concurrent-string-deduplication"); ++ output.shouldContain("Deduplicated:"); ++ output.shouldNotContain("Resize Count: 0"); ++ output.shouldHaveExitValue(0); ++ } ++ ++ public static void testTableRehash() throws Exception { ++ // Test with StringDeduplicationRehashALot ++ OutputAnalyzer output = DeduplicationTest.run(LargeNumberOfStrings, ++ DefaultAgeThreshold, ++ YoungGC, ++ "-XX:+PrintGC", ++ "-XX:+PrintStringDeduplicationStatistics", ++ "-XX:+StringDeduplicationRehashALot"); ++ output.shouldContain("GC concurrent-string-deduplication"); ++ output.shouldContain("Deduplicated:"); ++ output.shouldNotContain("Rehash Count: 0"); ++ output.shouldNotContain("Hash Seed: 0x0"); ++ output.shouldHaveExitValue(0); ++ } ++ ++ public static void testAgeThreshold() throws Exception { ++ OutputAnalyzer output; ++ ++ // Test with max age theshold ++ output = DeduplicationTest.run(SmallNumberOfStrings, ++ MaxAgeThreshold, ++ YoungGC, ++ "-XX:+PrintGC", ++ "-XX:+PrintStringDeduplicationStatistics"); ++ output.shouldContain("GC concurrent-string-deduplication"); ++ output.shouldContain("Deduplicated:"); ++ output.shouldHaveExitValue(0); ++ ++ // Test with min age theshold ++ output = DeduplicationTest.run(SmallNumberOfStrings, ++ MinAgeThreshold, ++ YoungGC, ++ "-XX:+PrintGC", ++ "-XX:+PrintStringDeduplicationStatistics"); ++ output.shouldContain("GC concurrent-string-deduplication"); ++ output.shouldContain("Deduplicated:"); ++ output.shouldHaveExitValue(0); ++ ++ // Test with too low age threshold ++ output = DeduplicationTest.run(SmallNumberOfStrings, ++ TooLowAgeThreshold, ++ YoungGC); ++ output.shouldContain("StringDeduplicationAgeThreshold of " + TooLowAgeThreshold + ++ " is invalid; must be between " + MinAgeThreshold + " and " + MaxAgeThreshold); ++ output.shouldHaveExitValue(1); ++ ++ // Test with too high age threshold ++ output = DeduplicationTest.run(SmallNumberOfStrings, ++ TooHighAgeThreshold, ++ YoungGC); ++ output.shouldContain("StringDeduplicationAgeThreshold of " + TooHighAgeThreshold + ++ " is invalid; must be between " + MinAgeThreshold + " and " + MaxAgeThreshold); ++ output.shouldHaveExitValue(1); ++ } ++ ++ public static void testPrintOptions() throws Exception { ++ OutputAnalyzer output; ++ ++ // Test without PrintGC and without PrintStringDeduplicationStatistics ++ output = DeduplicationTest.run(SmallNumberOfStrings, ++ DefaultAgeThreshold, ++ YoungGC); ++ output.shouldNotContain("GC concurrent-string-deduplication"); ++ output.shouldNotContain("Deduplicated:"); ++ output.shouldHaveExitValue(0); ++ ++ // Test with PrintGC but without PrintStringDeduplicationStatistics ++ output = DeduplicationTest.run(SmallNumberOfStrings, ++ DefaultAgeThreshold, ++ YoungGC, ++ "-XX:+PrintGC"); ++ output.shouldContain("GC concurrent-string-deduplication"); ++ output.shouldNotContain("Deduplicated:"); ++ output.shouldHaveExitValue(0); ++ } ++ ++ public static void testInterned() throws Exception { ++ // Test that interned strings are deduplicated before being interned ++ OutputAnalyzer output = InternedTest.run(); ++ output.shouldHaveExitValue(0); ++ } ++} +--- ./hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 TestStringDeduplicationYoungGC ++ * @summary Test string deduplication during young GC ++ * @bug 8029075 ++ * @key gc ++ * @library /testlibrary ++ */ ++ ++public class TestStringDeduplicationYoungGC { ++ public static void main(String[] args) throws Exception { ++ TestStringDeduplicationTools.testYoungGC(); ++ } ++} +--- ./hotspot/test/gc/g1/TestStringSymbolTableStats.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/g1/TestStringSymbolTableStats.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,57 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test TestStringSymbolTableStats.java ++ * @bug 8027476 8027455 ++ * @summary Ensure that the G1TraceStringSymbolTableScrubbing prints the expected message. ++ * @key gc ++ * @library /testlibrary ++ */ ++ ++import com.oracle.java.testlibrary.ProcessTools; ++import com.oracle.java.testlibrary.OutputAnalyzer; ++ ++public class TestStringSymbolTableStats { ++ public static void main(String[] args) throws Exception { ++ ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UseG1GC", ++ "-XX:+UnlockExperimentalVMOptions", ++ "-XX:+G1TraceStringSymbolTableScrubbing", ++ SystemGCTest.class.getName()); ++ ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ ++ System.out.println("Output:\n" + output.getOutput()); ++ ++ output.shouldContain("Cleaned string and symbol table"); ++ output.shouldHaveExitValue(0); ++ } ++ ++ static class SystemGCTest { ++ public static void main(String [] args) { ++ System.out.println("Calling System.gc()"); ++ System.gc(); ++ } ++ } ++} +--- ./hotspot/test/gc/metaspace/TestMetaspaceInitialization.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/gc/metaspace/TestMetaspaceInitialization.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++import java.util.ArrayList; ++ ++/* @test TestMetaspaceInitialization ++ * @bug 8042933 ++ * @summary Tests to initialize metaspace with a very low MetaspaceSize ++ * @library /testlibrary ++ * @run main/othervm -XX:MetaspaceSize=2m TestMetaspaceInitialization ++ */ ++public class TestMetaspaceInitialization { ++ private class Internal { ++ public int x; ++ public Internal(int x) { ++ this.x = x; ++ } ++ } ++ ++ private void test() { ++ ArrayList l = new ArrayList<>(); ++ l.add(new Internal(17)); ++ } ++ ++ public static void main(String[] args) { ++ new TestMetaspaceInitialization().test(); ++ } ++} +--- ./hotspot/test/runtime/7158988/FieldMonitor.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/runtime/7158988/FieldMonitor.java Wed Jul 30 03:51:43 2014 -0700 +@@ -34,10 +34,6 @@ + import java.io.IOException; + import java.io.InputStream; + import java.io.InputStreamReader; +-import java.io.OutputStream; +-import java.io.OutputStreamWriter; +-import java.io.Reader; +-import java.io.Writer; + import java.util.Iterator; + import java.util.List; + import java.util.Map; +@@ -56,6 +52,7 @@ + import com.sun.jdi.event.EventSet; + import com.sun.jdi.event.ModificationWatchpointEvent; + import com.sun.jdi.event.VMDeathEvent; ++import com.sun.jdi.event.VMStartEvent; + import com.sun.jdi.event.VMDisconnectEvent; + import com.sun.jdi.request.ClassPrepareRequest; + import com.sun.jdi.request.EventRequest; +@@ -71,24 +68,10 @@ + public static void main(String[] args) + throws IOException, InterruptedException { + +- StringBuffer sb = new StringBuffer(); +- +- for (int i=0; i < args.length; i++) { +- sb.append(' '); +- sb.append(args[i]); +- } + //VirtualMachine vm = launchTarget(sb.toString()); + VirtualMachine vm = launchTarget(CLASS_NAME); + + System.out.println("Vm launched"); +- // set watch field on already loaded classes +- List referenceTypes = vm +- .classesByName(CLASS_NAME); +- for (ReferenceType refType : referenceTypes) { +- addFieldWatch(vm, refType); +- } +- // watch for loaded classes +- addClassWatch(vm); + + // process events + EventQueue eventQueue = vm.eventQueue(); +@@ -104,13 +87,15 @@ + errThread.start(); + outThread.start(); + +- +- vm.resume(); + boolean connected = true; ++ int watched = 0; + while (connected) { + EventSet eventSet = eventQueue.remove(); + for (Event event : eventSet) { +- if (event instanceof VMDeathEvent ++ System.out.println("FieldMonitor-main receives: "+event); ++ if (event instanceof VMStartEvent) { ++ addClassWatch(vm); ++ } else if (event instanceof VMDeathEvent + || event instanceof VMDisconnectEvent) { + // exit + connected = false; +@@ -122,17 +107,17 @@ + .referenceType(); + addFieldWatch(vm, refType); + } else if (event instanceof ModificationWatchpointEvent) { ++ watched++; + System.out.println("sleep for 500 ms"); + Thread.sleep(500); +- System.out.println("resume..."); + + ModificationWatchpointEvent modEvent = (ModificationWatchpointEvent) event; + System.out.println("old=" + + modEvent.valueCurrent()); + System.out.println("new=" + modEvent.valueToBe()); +- System.out.println(); + } + } ++ System.out.println("resume..."); + eventSet.resume(); + } + // Shutdown begins when event thread terminates +@@ -142,6 +127,10 @@ + } catch (InterruptedException exc) { + // we don't interrupt + } ++ ++ if (watched != 11) { // init + 10 modifications in TestPostFieldModification class ++ throw new Error("Expected to receive 11 times ModificationWatchpointEvent, but got "+watched); ++ } + } + + /** +--- ./hotspot/test/runtime/ClassFile/UnsupportedClassFileVersion.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/ClassFile/UnsupportedClassFileVersion.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,69 @@ ++/* ++ * 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 ++ * @library /testlibrary ++ * @compile -XDignore.symbol.file UnsupportedClassFileVersion.java ++ * @run main UnsupportedClassFileVersion ++ */ ++ ++import java.io.File; ++import java.io.FileOutputStream; ++import jdk.internal.org.objectweb.asm.ClassWriter; ++import jdk.internal.org.objectweb.asm.MethodVisitor; ++import jdk.internal.org.objectweb.asm.Opcodes; ++import com.oracle.java.testlibrary.*; ++ ++public class UnsupportedClassFileVersion implements Opcodes { ++ public static void main(String... args) throws Exception { ++ writeClassFile(); ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, "-cp", ".", "ClassFile"); ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ output.shouldContain("ClassFile has been compiled by a more recent version of the " + ++ "Java Runtime (class file version 99.0), this version of " + ++ "the Java Runtime only recognizes class file versions up to " + ++ System.getProperty("java.class.version")); ++ ++ output.shouldHaveExitValue(1); ++ } ++ ++ public static void writeClassFile() throws Exception { ++ ClassWriter cw = new ClassWriter(0); ++ MethodVisitor mv; ++ ++ cw.visit(99, ACC_PUBLIC + ACC_SUPER, "ClassFile", null, "java/lang/Object", null); ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ cw.visitEnd(); ++ ++ try (FileOutputStream fos = new FileOutputStream(new File("ClassFile.class"))) { ++ fos.write(cw.toByteArray()); ++ } ++ } ++} +--- ./hotspot/test/runtime/CommandLine/CompilerConfigFileWarning.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/runtime/CommandLine/CompilerConfigFileWarning.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -33,8 +33,7 @@ + + public class CompilerConfigFileWarning { + public static void main(String[] args) throws Exception { +- String vmVersion = System.getProperty("java.vm.version"); +- if (vmVersion.toLowerCase().contains("debug") || vmVersion.toLowerCase().contains("jvmg")) { ++ if (Platform.isDebugBuild()) { + System.out.println("Skip on debug builds since we'll always read the file there"); + return; + } +--- ./hotspot/test/runtime/CommandLine/ConfigFileWarning.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/runtime/CommandLine/ConfigFileWarning.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -33,8 +33,7 @@ + + public class ConfigFileWarning { + public static void main(String[] args) throws Exception { +- String vmVersion = System.getProperty("java.vm.version"); +- if (vmVersion.toLowerCase().contains("debug") || vmVersion.toLowerCase().contains("jvmg")) { ++ if (Platform.isDebugBuild()) { + System.out.println("Skip on debug builds since we'll always read the file there"); + return; + } +--- ./hotspot/test/runtime/CommandLine/VMOptionWarning.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/CommandLine/VMOptionWarning.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,56 @@ ++/* ++ * 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 8027314 ++ * @summary Warn if diagnostic or experimental vm option is used and -XX:+UnlockDiagnosticVMOptions or -XX:+UnlockExperimentalVMOptions, respectively, isn't specified. Warn if develop or notproduct vm option is used with product version of VM. ++ * @library /testlibrary ++ */ ++ ++import com.oracle.java.testlibrary.*; ++ ++public class VMOptionWarning { ++ public static void main(String[] args) throws Exception { ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+PredictedLoadedClassCount", "-version"); ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ output.shouldContain("Error: VM option 'PredictedLoadedClassCount' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions."); ++ ++ if (Platform.isDebugBuild()) { ++ System.out.println("Skip the rest of the tests on debug builds since diagnostic, develop, and notproduct options are available on debug builds."); ++ return; ++ } ++ ++ pb = ProcessTools.createJavaProcessBuilder("-XX:+PrintInlining", "-version"); ++ output = new OutputAnalyzer(pb.start()); ++ output.shouldContain("Error: VM option 'PrintInlining' is diagnostic and must be enabled via -XX:+UnlockDiagnosticVMOptions."); ++ ++ pb = ProcessTools.createJavaProcessBuilder("-XX:+TraceJNICalls", "-version"); ++ output = new OutputAnalyzer(pb.start()); ++ output.shouldContain("Error: VM option 'TraceJNICalls' is develop and is available only in debug version of VM."); ++ ++ pb = ProcessTools.createJavaProcessBuilder("-XX:+TraceJVMCalls", "-version"); ++ output = new OutputAnalyzer(pb.start()); ++ output.shouldContain("Error: VM option 'TraceJVMCalls' is notproduct and is available only in debug version of VM."); ++ } ++} +--- ./hotspot/test/runtime/NMT/CommandLineDetail.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/runtime/NMT/CommandLineDetail.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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,7 +24,7 @@ + /* + * @test + * @key nmt +- * @summary Running with NMT detail should not result in an error or warning ++ * @summary Running with NMT detail should not result in an error + * @library /testlibrary + */ + +@@ -39,7 +39,6 @@ + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldNotContain("error"); +- output.shouldNotContain("warning"); + output.shouldHaveExitValue(0); + } + } +--- ./hotspot/test/runtime/NMT/CommandLineSummary.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/runtime/NMT/CommandLineSummary.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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,7 +24,7 @@ + /* + * @test + * @key nmt +- * @summary Running with NMT summary should not result in an error or warning ++ * @summary Running with NMT summary should not result in an error + * @library /testlibrary + */ + +@@ -39,7 +39,6 @@ + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldNotContain("error"); +- output.shouldNotContain("warning"); + output.shouldHaveExitValue(0); + } + } +--- ./hotspot/test/runtime/NMT/CommandLineTurnOffNMT.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/runtime/NMT/CommandLineTurnOffNMT.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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,7 +24,7 @@ + /* + * @test + * @key nmt +- * @summary Turning off NMT should not result in an error or warning ++ * @summary Turning off NMT should not result in an error + * @library /testlibrary + */ + +@@ -38,7 +38,6 @@ + "-version"); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldNotContain("error"); +- output.shouldNotContain("warning"); + output.shouldHaveExitValue(0); + } + } +--- ./hotspot/test/runtime/NMT/PrintNMTStatistics.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/runtime/NMT/PrintNMTStatistics.java Wed Jul 30 03:51:43 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -64,7 +64,6 @@ + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldContain("Java Heap (reserved="); + output.shouldNotContain("error"); +- output.shouldNotContain("warning"); + output.shouldHaveExitValue(0); + } + } +--- ./hotspot/test/runtime/PerfMemDestroy/PerfMemDestroy.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/PerfMemDestroy/PerfMemDestroy.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,40 @@ ++/* ++ * 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 8030955 ++ * @summary Allow multiple calls to PerfMemory::destroy() without asserting. ++ * @library /testlibrary ++ * @run main PerfMemDestroy ++ */ ++ ++import com.oracle.java.testlibrary.*; ++ ++public class PerfMemDestroy { ++ public static void main(String args[]) throws Throwable { ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+PerfAllowAtExitRegistration", "-version"); ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ output.shouldHaveExitValue(0); ++ } ++} +--- ./hotspot/test/runtime/Thread/TestThreadDumpMonitorContention.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/Thread/TestThreadDumpMonitorContention.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,534 @@ ++/* ++ * 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 8036823 ++ * @bug 8046287 ++ * @summary Creates two threads contending for the same lock and checks ++ * whether jstack reports "locked" by more than one thread. ++ * ++ * @library /testlibrary ++ * @run main/othervm TestThreadDumpMonitorContention ++ */ ++ ++import java.io.BufferedReader; ++import java.io.InputStreamReader; ++import java.lang.management.ManagementFactory; ++import java.lang.management.RuntimeMXBean; ++import java.util.ArrayList; ++import java.util.List; ++import java.util.regex.Matcher; ++import java.util.regex.Pattern; ++ ++import com.oracle.java.testlibrary.*; ++ ++public class TestThreadDumpMonitorContention { ++ // jstack tends to be closely bound to the VM that we are running ++ // so use getTestJDKTool() instead of getCompileJDKTool() or even ++ // getJDKTool() which can fall back to "compile.jdk". ++ final static String JSTACK = JDKToolFinder.getTestJDKTool("jstack"); ++ final static String PID = getPid(); ++ ++ // looking for header lines with these patterns: ++ // "ContendingThread-1" #19 prio=5 os_prio=64 tid=0x000000000079c000 nid=0x23 runnable [0xffff80ffb8b87000] ++ // "ContendingThread-2" #21 prio=5 os_prio=64 tid=0x0000000000780000 nid=0x2f waiting for monitor entry [0xfffffd7fc1111000] ++ // "ContendingThread-2" #24 prio=5 os_prio=64 tid=0x0000000000ec8800 nid=0x31 waiting on condition [0xfffffd7bbfffe000] ++ final static Pattern HEADER_PREFIX_PATTERN = Pattern.compile( ++ "^\"ContendingThread-.*"); ++ final static Pattern HEADER_WAITING_PATTERN1 = Pattern.compile( ++ "^\"ContendingThread-.* waiting for monitor entry .*"); ++ final static Pattern HEADER_WAITING_PATTERN2 = Pattern.compile( ++ "^\"ContendingThread-.* waiting on condition .*"); ++ final static Pattern HEADER_RUNNABLE_PATTERN = Pattern.compile( ++ "^\"ContendingThread-.* runnable .*"); ++ ++ // looking for thread state lines with these patterns: ++ // java.lang.Thread.State: RUNNABLE ++ // java.lang.Thread.State: BLOCKED (on object monitor) ++ final static Pattern THREAD_STATE_PREFIX_PATTERN = Pattern.compile( ++ " *java\\.lang\\.Thread\\.State: .*"); ++ final static Pattern THREAD_STATE_BLOCKED_PATTERN = Pattern.compile( ++ " *java\\.lang\\.Thread\\.State: BLOCKED \\(on object monitor\\)"); ++ final static Pattern THREAD_STATE_RUNNABLE_PATTERN = Pattern.compile( ++ " *java\\.lang\\.Thread\\.State: RUNNABLE"); ++ ++ // looking for duplicates of this pattern: ++ // - locked <0x000000076ac59e20> (a TestThreadDumpMonitorContention$1) ++ final static Pattern LOCK_PATTERN = Pattern.compile( ++ ".* locked \\<.*\\(a TestThreadDumpMonitorContention.*"); ++ ++ // sanity checking header and thread state lines associated ++ // with this pattern: ++ // - waiting to lock <0x000000076ac59e20> (a TestThreadDumpMonitorContention$1) ++ final static Pattern WAITING_PATTERN = Pattern.compile( ++ ".* waiting to lock \\<.*\\(a TestThreadDumpMonitorContention.*"); ++ ++ final static Object barrier = new Object(); ++ volatile static boolean done = false; ++ ++ static int barrier_cnt = 0; ++ static int blank_line_match_cnt = 0; ++ static int error_cnt = 0; ++ static boolean have_header_line = false; ++ static boolean have_thread_state_line = false; ++ static String header_line = null; ++ static int header_prefix_match_cnt = 0; ++ static int locked_line_match_cnt = 0; ++ static String[] locked_match_list = new String[2]; ++ static int n_samples = 15; ++ static int sum_both_running_cnt = 0; ++ static int sum_both_waiting_cnt = 0; ++ static int sum_contended_cnt = 0; ++ static int sum_locked_hdr_runnable_cnt = 0; ++ static int sum_locked_hdr_waiting1_cnt = 0; ++ static int sum_locked_hdr_waiting2_cnt = 0; ++ static int sum_locked_thr_state_blocked_cnt = 0; ++ static int sum_locked_thr_state_runnable_cnt = 0; ++ static int sum_one_waiting_cnt = 0; ++ static int sum_uncontended_cnt = 0; ++ static int sum_waiting_hdr_waiting1_cnt = 0; ++ static int sum_waiting_thr_state_blocked_cnt = 0; ++ static String thread_state_line = null; ++ static boolean verbose = false; ++ static int waiting_line_match_cnt = 0; ++ ++ public static void main(String[] args) throws Exception { ++ if (args.length != 0) { ++ int arg_i = 0; ++ if (args[arg_i].equals("-v")) { ++ verbose = true; ++ arg_i++; ++ } ++ ++ try { ++ n_samples = Integer.parseInt(args[arg_i]); ++ } catch (NumberFormatException nfe) { ++ System.err.println(nfe); ++ usage(); ++ } ++ } ++ ++ Runnable runnable = new Runnable() { ++ public void run() { ++ synchronized (barrier) { ++ // let the main thread know we're running ++ barrier_cnt++; ++ barrier.notify(); ++ } ++ while (!done) { ++ synchronized (this) { } ++ } ++ } ++ }; ++ Thread[] thread_list = new Thread[2]; ++ thread_list[0] = new Thread(runnable, "ContendingThread-1"); ++ thread_list[1] = new Thread(runnable, "ContendingThread-2"); ++ synchronized (barrier) { ++ thread_list[0].start(); ++ thread_list[1].start(); ++ ++ // Wait until the contending threads are running so that ++ // we don't sample any thread init states. ++ while (barrier_cnt < 2) { ++ barrier.wait(); ++ } ++ } ++ ++ doSamples(); ++ ++ done = true; ++ ++ thread_list[0].join(); ++ thread_list[1].join(); ++ ++ if (error_cnt == 0) { ++ System.out.println("Test PASSED."); ++ } else { ++ System.out.println("Test FAILED."); ++ throw new AssertionError("error_cnt=" + error_cnt); ++ } ++ } ++ ++ // Reached a blank line which is the end of the ++ // stack trace without matching either LOCK_PATTERN ++ // or WAITING_PATTERN. Rare, but it's not an error. ++ // ++ // Example: ++ // "ContendingThread-1" #21 prio=5 os_prio=64 tid=0x00000000007b9000 nid=0x2f runnable [0xfffffd7fc1111000] ++ // java.lang.Thread.State: RUNNABLE ++ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140) ++ // at java.lang.Thread.run(Thread.java:745) ++ // ++ static boolean checkBlankLine(String line) { ++ if (line.length() == 0) { ++ blank_line_match_cnt++; ++ have_header_line = false; ++ have_thread_state_line = false; ++ return true; ++ } ++ ++ return false; ++ } ++ ++ // Process the locked line here if we found one. ++ // ++ // Example 1: ++ // "ContendingThread-1" #21 prio=5 os_prio=64 tid=0x00000000007b9000 nid=0x2f runnable [0xfffffd7fc1111000] ++ // java.lang.Thread.State: RUNNABLE ++ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140) ++ // - locked <0xfffffd7e6a2912f8> (a TestThreadDumpMonitorContention$1) ++ // at java.lang.Thread.run(Thread.java:745) ++ // ++ // Example 2: ++ // "ContendingThread-1" #21 prio=5 os_prio=64 tid=0x00000000007b9000 nid=0x2f waiting for monitor entry [0xfffffd7fc1111000] ++ // java.lang.Thread.State: BLOCKED (on object monitor) ++ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140) ++ // - locked <0xfffffd7e6a2912f8> (a TestThreadDumpMonitorContention$1) ++ // at java.lang.Thread.run(Thread.java:745) ++ // ++ // Example 3: ++ // "ContendingThread-2" #24 prio=5 os_prio=64 tid=0x0000000000ec8800 nid=0x31 waiting on condition [0xfffffd7bbfffe000] ++ // java.lang.Thread.State: RUNNABLE ++ // JavaThread state: _thread_blocked ++ // Thread: 0x0000000000ec8800 [0x31] State: _at_safepoint _has_called_back 0 _at_poll_safepoint 0 ++ // JavaThread state: _thread_blocked ++ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140) ++ // - locked <0xfffffd7e6d03eb28> (a TestThreadDumpMonitorContention$1) ++ // at java.lang.Thread.run(Thread.java:745) ++ // ++ static boolean checkLockedLine(String line) { ++ Matcher matcher = LOCK_PATTERN.matcher(line); ++ if (matcher.matches()) { ++ if (verbose) { ++ System.out.println("locked_line='" + line + "'"); ++ } ++ locked_match_list[locked_line_match_cnt] = new String(line); ++ locked_line_match_cnt++; ++ ++ matcher = HEADER_RUNNABLE_PATTERN.matcher(header_line); ++ if (matcher.matches()) { ++ sum_locked_hdr_runnable_cnt++; ++ } else { ++ // It's strange, but a locked line can also ++ // match the HEADER_WAITING_PATTERN{1,2}. ++ matcher = HEADER_WAITING_PATTERN1.matcher(header_line); ++ if (matcher.matches()) { ++ sum_locked_hdr_waiting1_cnt++; ++ } else { ++ matcher = HEADER_WAITING_PATTERN2.matcher(header_line); ++ if (matcher.matches()) { ++ sum_locked_hdr_waiting2_cnt++; ++ } else { ++ System.err.println(); ++ System.err.println("ERROR: header line does " + ++ "not match runnable or waiting patterns."); ++ System.err.println("ERROR: header_line='" + ++ header_line + "'"); ++ System.err.println("ERROR: locked_line='" + line + ++ "'"); ++ error_cnt++; ++ } ++ } ++ } ++ ++ matcher = THREAD_STATE_RUNNABLE_PATTERN.matcher(thread_state_line); ++ if (matcher.matches()) { ++ sum_locked_thr_state_runnable_cnt++; ++ } else { ++ // It's strange, but a locked line can also ++ // match the THREAD_STATE_BLOCKED_PATTERN. ++ matcher = THREAD_STATE_BLOCKED_PATTERN.matcher( ++ thread_state_line); ++ if (matcher.matches()) { ++ sum_locked_thr_state_blocked_cnt++; ++ } else { ++ System.err.println(); ++ System.err.println("ERROR: thread state line does not " + ++ "match runnable or waiting patterns."); ++ System.err.println("ERROR: " + "thread_state_line='" + ++ thread_state_line + "'"); ++ System.err.println("ERROR: locked_line='" + line + "'"); ++ error_cnt++; ++ } ++ } ++ ++ // Have everything we need from this thread stack ++ // that matches the LOCK_PATTERN. ++ have_header_line = false; ++ have_thread_state_line = false; ++ return true; ++ } ++ ++ return false; ++ } ++ ++ // Process the waiting line here if we found one. ++ // ++ // Example: ++ // "ContendingThread-2" #22 prio=5 os_prio=64 tid=0x00000000007b9800 nid=0x30 waiting for monitor entry [0xfffffd7fc1010000] ++ // java.lang.Thread.State: BLOCKED (on object monitor) ++ // at TestThreadDumpMonitorContention$1.run(TestThreadDumpMonitorContention.java:140) ++ // - waiting to lock <0xfffffd7e6a2912f8> (a TestThreadDumpMonitorContention$1) ++ // at java.lang.Thread.run(Thread.java:745) ++ // ++ static boolean checkWaitingLine(String line) { ++ Matcher matcher = WAITING_PATTERN.matcher(line); ++ if (matcher.matches()) { ++ waiting_line_match_cnt++; ++ if (verbose) { ++ System.out.println("waiting_line='" + line + "'"); ++ } ++ ++ matcher = HEADER_WAITING_PATTERN1.matcher(header_line); ++ if (matcher.matches()) { ++ sum_waiting_hdr_waiting1_cnt++; ++ } else { ++ System.err.println(); ++ System.err.println("ERROR: header line does " + ++ "not match a waiting pattern."); ++ System.err.println("ERROR: header_line='" + header_line + "'"); ++ System.err.println("ERROR: waiting_line='" + line + "'"); ++ error_cnt++; ++ } ++ ++ matcher = THREAD_STATE_BLOCKED_PATTERN.matcher(thread_state_line); ++ if (matcher.matches()) { ++ sum_waiting_thr_state_blocked_cnt++; ++ } else { ++ System.err.println(); ++ System.err.println("ERROR: thread state line " + ++ "does not match a waiting pattern."); ++ System.err.println("ERROR: thread_state_line='" + ++ thread_state_line + "'"); ++ System.err.println("ERROR: waiting_line='" + line + "'"); ++ error_cnt++; ++ } ++ ++ // Have everything we need from this thread stack ++ // that matches the WAITING_PATTERN. ++ have_header_line = false; ++ have_thread_state_line = false; ++ return true; ++ } ++ ++ return false; ++ } ++ ++ static void doSamples() throws Exception { ++ for (int count = 0; count < n_samples; count++) { ++ blank_line_match_cnt = 0; ++ header_prefix_match_cnt = 0; ++ locked_line_match_cnt = 0; ++ waiting_line_match_cnt = 0; ++ // verbose mode or an error has a lot of output so add more space ++ if (verbose || error_cnt > 0) System.out.println(); ++ System.out.println("Sample #" + count); ++ ++ // We don't use the ProcessTools, OutputBuffer or ++ // OutputAnalyzer classes from the testlibrary because ++ // we have a complicated multi-line parse to perform ++ // on a narrow subset of the JSTACK output. ++ // ++ // - we only care about stack traces that match ++ // HEADER_PREFIX_PATTERN; only two should match ++ // - we care about at most three lines from each stack trace ++ // - if both stack traces match LOCKED_PATTERN, then that's ++ // a failure and we report it ++ // - for a stack trace that matches LOCKED_PATTERN, we verify: ++ // - the header line matches HEADER_RUNNABLE_PATTERN ++ // or HEADER_WAITING_PATTERN{1,2} ++ // - the thread state line matches THREAD_STATE_BLOCKED_PATTERN ++ // or THREAD_STATE_RUNNABLE_PATTERN ++ // - we report any mismatches as failures ++ // - for a stack trace that matches WAITING_PATTERN, we verify: ++ // - the header line matches HEADER_WAITING_PATTERN1 ++ // - the thread state line matches THREAD_STATE_BLOCKED_PATTERN ++ // - we report any mismatches as failures ++ // - the stack traces that match HEADER_PREFIX_PATTERN may ++ // not match either LOCKED_PATTERN or WAITING_PATTERN ++ // because we might observe the thread outside of ++ // monitor operations; this is not considered a failure ++ // ++ // When we do observe LOCKED_PATTERN or WAITING_PATTERN, ++ // then we are checking the header and thread state patterns ++ // that occurred earlier in the current stack trace that ++ // matched HEADER_PREFIX_PATTERN. We don't use data from ++ // stack traces that don't match HEADER_PREFIX_PATTERN and ++ // we don't mix data between the two stack traces that do ++ // match HEADER_PREFIX_PATTERN. ++ // ++ Process process = new ProcessBuilder(JSTACK, PID) ++ .redirectErrorStream(true).start(); ++ ++ BufferedReader reader = new BufferedReader(new InputStreamReader( ++ process.getInputStream())); ++ String line; ++ while ((line = reader.readLine()) != null) { ++ Matcher matcher = null; ++ ++ // process the header line here ++ if (!have_header_line) { ++ matcher = HEADER_PREFIX_PATTERN.matcher(line); ++ if (matcher.matches()) { ++ header_prefix_match_cnt++; ++ if (verbose) { ++ System.out.println(); ++ System.out.println("header='" + line + "'"); ++ } ++ header_line = new String(line); ++ have_header_line = true; ++ continue; ++ } ++ continue; // skip until have a header line ++ } ++ ++ // process the thread state line here ++ if (!have_thread_state_line) { ++ matcher = THREAD_STATE_PREFIX_PATTERN.matcher(line); ++ if (matcher.matches()) { ++ if (verbose) { ++ System.out.println("thread_state='" + line + "'"); ++ } ++ thread_state_line = new String(line); ++ have_thread_state_line = true; ++ continue; ++ } ++ continue; // skip until we have a thread state line ++ } ++ ++ // process the locked line here if we find one ++ if (checkLockedLine(line)) { ++ continue; ++ } ++ ++ // process the waiting line here if we find one ++ if (checkWaitingLine(line)) { ++ continue; ++ } ++ ++ // process the blank line here if we find one ++ if (checkBlankLine(line)) { ++ continue; ++ } ++ } ++ process.waitFor(); ++ ++ if (header_prefix_match_cnt != 2) { ++ System.err.println(); ++ System.err.println("ERROR: should match exactly two headers."); ++ System.err.println("ERROR: header_prefix_match_cnt=" + ++ header_prefix_match_cnt); ++ error_cnt++; ++ } ++ ++ if (locked_line_match_cnt == 2) { ++ if (locked_match_list[0].equals(locked_match_list[1])) { ++ System.err.println(); ++ System.err.println("ERROR: matching lock lines:"); ++ System.err.println("ERROR: line[0]'" + ++ locked_match_list[0] + "'"); ++ System.err.println("ERROR: line[1]'" + ++ locked_match_list[1] + "'"); ++ error_cnt++; ++ } ++ } ++ ++ if (locked_line_match_cnt == 1) { ++ // one thread has the lock ++ if (waiting_line_match_cnt == 1) { ++ // and the other contended for it ++ sum_contended_cnt++; ++ } else { ++ // and the other is just running ++ sum_uncontended_cnt++; ++ } ++ } else if (waiting_line_match_cnt == 1) { ++ // one thread is waiting ++ sum_one_waiting_cnt++; ++ } else if (waiting_line_match_cnt == 2) { ++ // both threads are waiting ++ sum_both_waiting_cnt++; ++ } else { ++ // both threads are running ++ sum_both_running_cnt++; ++ } ++ ++ // slight delay between jstack launches ++ Thread.sleep(500); ++ } ++ ++ if (error_cnt != 0) { ++ // skip summary info since there were errors ++ return; ++ } ++ ++ System.out.println("INFO: Summary for all samples:"); ++ System.out.println("INFO: both_running_cnt=" + sum_both_running_cnt); ++ System.out.println("INFO: both_waiting_cnt=" + sum_both_waiting_cnt); ++ System.out.println("INFO: contended_cnt=" + sum_contended_cnt); ++ System.out.println("INFO: one_waiting_cnt=" + sum_one_waiting_cnt); ++ System.out.println("INFO: uncontended_cnt=" + sum_uncontended_cnt); ++ System.out.println("INFO: locked_hdr_runnable_cnt=" + ++ sum_locked_hdr_runnable_cnt); ++ System.out.println("INFO: locked_hdr_waiting1_cnt=" + ++ sum_locked_hdr_waiting1_cnt); ++ System.out.println("INFO: locked_hdr_waiting2_cnt=" + ++ sum_locked_hdr_waiting2_cnt); ++ System.out.println("INFO: locked_thr_state_blocked_cnt=" + ++ sum_locked_thr_state_blocked_cnt); ++ System.out.println("INFO: locked_thr_state_runnable_cnt=" + ++ sum_locked_thr_state_runnable_cnt); ++ System.out.println("INFO: waiting_hdr_waiting1_cnt=" + ++ sum_waiting_hdr_waiting1_cnt); ++ System.out.println("INFO: waiting_thr_state_blocked_cnt=" + ++ sum_waiting_thr_state_blocked_cnt); ++ ++ if (sum_contended_cnt == 0) { ++ System.err.println("WARNING: the primary scenario for 8036823" + ++ " has not been exercised by this test run."); ++ } ++ } ++ ++ // This helper relies on RuntimeMXBean.getName() returning a string ++ // that looks like this: 5436@mt-haku ++ // ++ // The testlibrary has tryFindJvmPid(), but that uses a separate ++ // process which is much more expensive for finding out your own PID. ++ // ++ static String getPid() { ++ RuntimeMXBean runtimebean = ManagementFactory.getRuntimeMXBean(); ++ String vmname = runtimebean.getName(); ++ int i = vmname.indexOf('@'); ++ if (i != -1) { ++ vmname = vmname.substring(0, i); ++ } ++ return vmname; ++ } ++ ++ static void usage() { ++ System.err.println("Usage: " + ++ "java TestThreadDumpMonitorContention [-v] [n_samples]"); ++ System.exit(1); ++ } ++} +--- ./hotspot/test/runtime/classFileParserBug/TestEmptyBootstrapMethodsAttr.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/classFileParserBug/TestEmptyBootstrapMethodsAttr.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ */ ++ ++/* ++ * @test TestEmptyBootstrapMethodsAttr ++ * @bug 8041918 ++ * @library /testlibrary ++ * @summary Test empty bootstrap_methods table within BootstrapMethods attribute ++ * @compile TestEmptyBootstrapMethodsAttr.java ++ * @run main TestEmptyBootstrapMethodsAttr ++ */ ++ ++import java.io.File; ++import com.oracle.java.testlibrary.*; ++ ++public class TestEmptyBootstrapMethodsAttr { ++ ++ public static void main(String args[]) throws Throwable { ++ System.out.println("Regression test for bug 8041918"); ++ String jarFile = System.getProperty("test.src") + File.separator + "emptynumbootstrapmethods.jar"; ++ ++ // ====== extract the test case ++ ProcessBuilder pb = new ProcessBuilder(new String[] { JDKToolFinder.getJDKTool("jar"), "xvf", jarFile } ); ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ output.shouldHaveExitValue(0); ++ ++ // Test case #1: ++ // Try loading class with empty bootstrap_methods table where no ++ // other attributes are following BootstrapMethods in attribute table. ++ String className = "emptynumbootstrapmethods1"; ++ ++ // ======= execute test case #1 ++ // Expect a lack of main method, this implies that the class loaded correctly ++ // with an empty bootstrap_methods and did not generate a ClassFormatError. ++ pb = ProcessTools.createJavaProcessBuilder("-cp", ".", className); ++ output = new OutputAnalyzer(pb.start()); ++ output.shouldNotContain("java.lang.ClassFormatError"); ++ output.shouldContain("Main method not found in class " + className); ++ output.shouldHaveExitValue(1); ++ ++ // Test case #2: ++ // Try loading class with empty bootstrap_methods table where an ++ // AnnotationDefault attribute follows the BootstrapMethods in the attribute table. ++ className = "emptynumbootstrapmethods2"; ++ ++ // ======= execute test case #2 ++ // Expect a lack of main method, this implies that the class loaded correctly ++ // with an empty bootstrap_methods and did not generate ClassFormatError. ++ pb = ProcessTools.createJavaProcessBuilder("-cp", ".", className); ++ output = new OutputAnalyzer(pb.start()); ++ output.shouldNotContain("java.lang.ClassFormatError"); ++ output.shouldContain("Main method not found in class " + className); ++ output.shouldHaveExitValue(1); ++ } ++} +Binary file test/runtime/classFileParserBug/emptynumbootstrapmethods.jar has changed +--- ./hotspot/test/runtime/classFileParserBug/emptynumbootstrapmethods1.jcod Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/classFileParserBug/emptynumbootstrapmethods1.jcod Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,68 @@ ++/* ++ * 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 test contains a BootstrapMethods attribute with an empty ++ * bootstrap_methods table. This yields a BootstrapMethods ++ * attribute length of 2 and should not cause a ++ * java.lang.ClassFormatError to be thrown. ++ */ ++class emptynumbootstrapmethods1 { ++ 0xCAFEBABE; ++ 0; // minor version ++ 51; // version ++ [12] { // Constant Pool ++ ; // first element is empty ++ class #2; // #1 at 0x0A ++ Utf8 "emptynumbootstrapmethods1"; // #2 at 0x0D ++ class #4; // #3 at 0x1F ++ Utf8 "java/lang/Object"; // #4 at 0x22 ++ MethodHandle 5b #9; // #5 at 0x35 ++ NameAndType #7 #8; // #6 at 0x39 ++ Utf8 "equals"; // #7 at 0x3E ++ Utf8 "(Ljava/lang/Object;)Z"; // #8 at 0x47 ++ Method #3 #6; // #9 at 0x5F ++ Utf8 "equalsx"; // #10 at 0x3E ++ Utf8 "BootstrapMethods"; // #11 at 0x69 ++ } // Constant Pool ++ ++ 0x0001; // access ++ #1;// this_cpx ++ #3;// super_cpx ++ ++ [0] { // Interfaces ++ } // Interfaces ++ ++ [0] { // fields ++ } // fields ++ ++ [0] { // methods ++ } // methods ++ ++ [1] { // Attributes ++ Attr(#11, 2) { // BootstrapMethods at 0x8A ++ [0] { // bootstrap_methods ++ } ++ } // end BootstrapMethods ++ } // Attributes ++} // end class atrbsm00101m10p +--- ./hotspot/test/runtime/classFileParserBug/emptynumbootstrapmethods2.jcod Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/classFileParserBug/emptynumbootstrapmethods2.jcod Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,89 @@ ++/* ++ * 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 test contains a BootstrapMethods attribute with an empty ++ * bootstrap_methods table. This yields a BootstrapMethods ++ * attribute length of 2 and should not cause a ++ * java.lang.ClassFormatError to be thrown. To ensure that an empty ++ * bootstrap_methods table is parsed correctly, another attribute, ++ * AnnotationDefault, follows the BootstrapMethods attribute in ++ * the attribute table. ++ */ ++ ++class emptynumbootstrapmethods2 { ++ 0xCAFEBABE; ++ 0; // minor version ++ 51; // version ++ [14] { // Constant Pool ++ ; // first element is empty ++ class #2; // #1 at 0x0A ++ Utf8 "emptynumbootstrapmethods2"; // #2 at 0x0D ++ class #4; // #3 at 0x1F ++ Utf8 "java/lang/Object"; // #4 at 0x22 ++ MethodHandle 5b #9; // #5 at 0x35 ++ NameAndType #7 #8; // #6 at 0x39 ++ Utf8 "equals"; // #7 at 0x3E ++ Utf8 "(Ljava/lang/Object;)Z"; // #8 at 0x47 ++ Method #3 #6; // #9 at 0x5F ++ Utf8 "equalsx"; // #10 at 0x3E ++ Utf8 "BootstrapMethods"; // #11 at 0x69 ++ Utf8 "AnnotationDefault"; // #12 ++ Utf8 "LAnnotationDefaultI;"; // #13 ++ } // Constant Pool ++ ++ 0x0001; // access ++ #1;// this_cpx ++ #3;// super_cpx ++ ++ [0] { // Interfaces ++ } // Interfaces ++ ++ [0] { // fields ++ } // fields ++ ++ [0] { // methods ++ } // methods ++ ++ [2] { // Attributes ++ Attr(#11, 2) { // BootstrapMethods at 0x8A ++ [0] { // bootstrap_methods ++ } ++ } // end BootstrapMethods ++ ; ++ Attr(#12) { // AnnotationDefault ++ [] { // type annotations ++ { // type annotation ++ 0x00; // target_type ++ 0x00; // type_parameter_index ++ []b { // type_path ++ } ++ ++ #13; // type_index ++ [] { // element_value_pairs ++ } // element_value_pairs ++ } // type annotation ++ } // type annotations ++ } // end AnnotationDefault ++ } // Attributes ++} // end class atrbsm00101m10p +--- ./hotspot/test/runtime/finalStatic/FinalStatic.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/finalStatic/FinalStatic.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,142 @@ ++/* ++ * 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 8028553 ++ * @summary Test that VerifyError is not thrown when 'overriding' a static method. ++ * @run main FinalStatic ++ */ ++ ++import java.lang.reflect.*; ++import jdk.internal.org.objectweb.asm.ClassWriter; ++import jdk.internal.org.objectweb.asm.MethodVisitor; ++import jdk.internal.org.objectweb.asm.Opcodes; ++ ++/* ++ * class A { static final int m() {return FAIL; } } ++ * class B extends A { int m() { return PASS; } } ++ * class FinalStatic { ++ * public static void main () { ++ * Object b = new B(); ++ * b.m(); ++ * } ++ * } ++ */ ++public class FinalStatic { ++ ++ static final String CLASS_NAME_A = "A"; ++ static final String CLASS_NAME_B = "B"; ++ static final int FAILED = 0; ++ static final int EXPECTED = 1234; ++ ++ static class TestClassLoader extends ClassLoader implements Opcodes { ++ ++ @Override ++ public Class findClass(String name) throws ClassNotFoundException { ++ byte[] b; ++ try { ++ b = loadClassData(name); ++ } catch (Throwable th) { ++ // th.printStackTrace(); ++ throw new ClassNotFoundException("Loading error", th); ++ } ++ return defineClass(name, b, 0, b.length); ++ } ++ ++ private byte[] loadClassData(String name) throws Exception { ++ ClassWriter cw = new ClassWriter(0); ++ MethodVisitor mv; ++ switch (name) { ++ case CLASS_NAME_A: ++ cw.visit(52, ACC_SUPER | ACC_PUBLIC, CLASS_NAME_A, null, "java/lang/Object", null); ++ { ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V"); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ mv = cw.visitMethod(ACC_FINAL | ACC_STATIC, "m", "()I", null, null); ++ mv.visitCode(); ++ mv.visitLdcInsn(FAILED); ++ mv.visitInsn(IRETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ } ++ break; ++ case CLASS_NAME_B: ++ cw.visit(52, ACC_SUPER | ACC_PUBLIC, CLASS_NAME_B, null, CLASS_NAME_A, null); ++ { ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, CLASS_NAME_A, "", "()V"); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ mv = cw.visitMethod(ACC_PUBLIC, "m", "()I", null, null); ++ mv.visitCode(); ++ mv.visitLdcInsn(EXPECTED); ++ mv.visitInsn(IRETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ } ++ break; ++ default: ++ break; ++ } ++ cw.visitEnd(); ++ ++ return cw.toByteArray(); ++ } ++ } ++ ++ public static void main(String[] args) throws Exception { ++ TestClassLoader tcl = new TestClassLoader(); ++ Class a = tcl.loadClass(CLASS_NAME_A); ++ Class b = tcl.loadClass(CLASS_NAME_B); ++ Object inst = b.newInstance(); ++ Method[] meths = b.getDeclaredMethods(); ++ ++ Method m = meths[0]; ++ int mod = m.getModifiers(); ++ if ((mod & Modifier.FINAL) != 0) { ++ throw new Exception("FAILED: " + m + " is FINAL"); ++ } ++ if ((mod & Modifier.STATIC) != 0) { ++ throw new Exception("FAILED: " + m + " is STATIC"); ++ } ++ ++ m.setAccessible(true); ++ if (!m.invoke(inst).equals(EXPECTED)) { ++ throw new Exception("FAILED: " + EXPECTED + " from " + m); ++ } ++ ++ System.out.println("Passed."); ++ } ++} +--- ./hotspot/test/runtime/lambda-features/InvokespecialInterface.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/lambda-features/InvokespecialInterface.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,61 @@ ++/* ++ * 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 8032024 ++ * @bug 8025937 ++ * @bug 8033528 ++ * @summary [JDK 8] Test invokespecial and invokeinterface with the same JVM_CONSTANT_InterfaceMethodref ++ * @run main/othervm -XX:+StressRewriter InvokespecialInterface ++ */ ++import java.util.function.*; ++import java.util.*; ++ ++interface I { ++ default void imethod() { System.out.println("I::imethod"); } ++} ++ ++class C implements I { ++ public void foo() { I.super.imethod(); } // invokespecial InterfaceMethod ++ public void bar() { I i = this; i.imethod(); } // invokeinterface same ++ public void doSomeInvokedynamic() { ++ String str = "world"; ++ Supplier foo = ()->"hello, "+str; ++ String res = foo.get(); ++ System.out.println(res); ++ } ++} ++ ++public class InvokespecialInterface { ++ public static void main(java.lang.String[] unused) { ++ // need to create C and call I::foo() ++ C c = new C(); ++ c.foo(); ++ c.bar(); ++ c.doSomeInvokedynamic(); ++ } ++}; ++ ++ +--- ./hotspot/test/runtime/lambda-features/TestConcreteClassWithAbstractMethod.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/lambda-features/TestConcreteClassWithAbstractMethod.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,181 @@ ++/* ++ * 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 8032010 ++ * @summary method lookup on an abstract method in a concrete class should be successful ++ * @run main TestConcreteClassWithAbstractMethod ++ */ ++ ++import jdk.internal.org.objectweb.asm.ClassWriter; ++import jdk.internal.org.objectweb.asm.MethodVisitor; ++ ++import static jdk.internal.org.objectweb.asm.Opcodes.*; ++ ++/* ++ * class T1 { public int m() {} } ++ * class T2 { public abstract int m(); } ++ * class T3 { public int m() {} } ++ * ++ * Call site: T3.test() { invokevirtual T2.m() } ++ * T3.m() should be invoked ++ */ ++public class TestConcreteClassWithAbstractMethod { ++ static final String classT1 = "p1.T1"; ++ static final String classT2 = "p1.T2"; ++ static final String classT3 = "p1.T3"; ++ ++ static final String callerName = classT3; ++ ++ public static void main(String[] args) throws Exception { ++ ClassLoader cl = new ClassLoader() { ++ public Class loadClass(String name) throws ClassNotFoundException { ++ if (findLoadedClass(name) != null) { ++ return findLoadedClass(name); ++ } ++ ++ if (classT1.equals(name)) { ++ byte[] classFile = dumpT1(); ++ return defineClass(classT1, classFile, 0, classFile.length); ++ } ++ if (classT2.equals(name)) { ++ byte[] classFile = dumpT2(); ++ return defineClass(classT2, classFile, 0, classFile.length); ++ } ++ if (classT3.equals(name)) { ++ byte[] classFile = dumpT3(); ++ return defineClass(classT3, classFile, 0, classFile.length); ++ } ++ ++ return super.loadClass(name); ++ } ++ }; ++ ++ cl.loadClass(classT1); ++ cl.loadClass(classT2); ++ cl.loadClass(classT3); ++ ++ //cl.loadClass(callerName).getDeclaredMethod("m"); ++ cl.loadClass(callerName).newInstance(); ++ ++ int result = (Integer)cl.loadClass(callerName).getDeclaredMethod("test").invoke(null); ++ System.out.println(""+result); ++ } ++ ++ public static byte[] dumpT1() { ++ ClassWriter cw = new ClassWriter(0); ++ MethodVisitor mv; ++ ++ cw.visit(52, ACC_PUBLIC | ACC_SUPER, "p1/T1", null, "java/lang/Object", null); ++ { ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ } ++ { ++ mv = cw.visitMethod(ACC_PUBLIC, "m", "()I", null, null); ++ mv.visitCode(); ++ mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); ++ mv.visitLdcInsn("p1/T1.m()"); ++ mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print", "(Ljava/lang/String;)V", false); ++ mv.visitIntInsn(BIPUSH, 3); ++ mv.visitInsn(IRETURN); ++ mv.visitMaxs(2, 1); ++ mv.visitEnd(); ++ } ++ cw.visitEnd(); ++ ++ return cw.toByteArray(); ++ } ++ ++ public static byte[] dumpT2() { ++ ClassWriter cw = new ClassWriter(0); ++ MethodVisitor mv; ++ ++ cw.visit(52, ACC_PUBLIC | ACC_SUPER, "p1/T2", null, "p1/T1", null); ++ { ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "p1/T1", "", "()V", false); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ } ++ { ++ mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "m", "()I", null, null); ++ mv.visitEnd(); ++ } ++ cw.visitEnd(); ++ ++ return cw.toByteArray(); ++ } ++ ++ public static byte[] dumpT3() { ++ ClassWriter cw = new ClassWriter(0); ++ MethodVisitor mv; ++ ++ cw.visit(52, ACC_PUBLIC + ACC_SUPER, "p1/T3", null, "p1/T2", null); ++ ++ { ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "p1/T2", "", "()V", false); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ } ++ { ++ mv = cw.visitMethod(ACC_PUBLIC, "m", "()I", null, null); ++ mv.visitCode(); ++ mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); ++ mv.visitLdcInsn("p1/T3.m()"); ++ mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print", "(Ljava/lang/String;)V", false); ++ mv.visitIntInsn(BIPUSH, 2); ++ mv.visitInsn(IRETURN); ++ mv.visitMaxs(2, 1); ++ mv.visitEnd(); ++ } ++ { ++ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "test", "()I", null, null); ++ mv.visitCode(); ++ mv.visitTypeInsn(NEW, "p1/T3"); ++ mv.visitInsn(DUP); ++ mv.visitMethodInsn(INVOKESPECIAL, "p1/T3", "", "()V", false); ++ mv.visitMethodInsn(INVOKEVIRTUAL, "p1/T2", "m", "()I", false); ++ mv.visitInsn(IRETURN); ++ mv.visitMaxs(3, 2); ++ mv.visitEnd(); ++ } ++ cw.visitEnd(); ++ ++ return cw.toByteArray(); ++ } ++} +--- ./hotspot/test/runtime/verifier/TestMultiANewArray.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/runtime/verifier/TestMultiANewArray.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,82 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.io.File; ++import java.io.FileOutputStream; ++import jdk.internal.org.objectweb.asm.ClassWriter; ++import jdk.internal.org.objectweb.asm.MethodVisitor; ++import static jdk.internal.org.objectweb.asm.Opcodes.*; ++import com.oracle.java.testlibrary.*; ++ ++/* ++ * @test TestMultiANewArray ++ * @bug 8038076 ++ * @library /testlibrary ++ * @compile -XDignore.symbol.file TestMultiANewArray.java ++ * @run main/othervm TestMultiANewArray 49 ++ * @run main/othervm TestMultiANewArray 50 ++ * @run main/othervm TestMultiANewArray 51 ++ * @run main/othervm TestMultiANewArray 52 ++ */ ++ ++public class TestMultiANewArray { ++ public static void main(String... args) throws Exception { ++ int cfv = Integer.parseInt(args[0]); ++ writeClassFile(cfv); ++ System.err.println("Running with cfv: " + cfv); ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, "-cp", ".", "ClassFile"); ++ OutputAnalyzer output = new OutputAnalyzer(pb.start()); ++ output.shouldContain("VerifyError"); ++ output.shouldHaveExitValue(1); ++ } ++ ++ public static void writeClassFile(int cfv) throws Exception { ++ ClassWriter cw = new ClassWriter(0); ++ MethodVisitor mv; ++ ++ cw.visit(cfv, ACC_PUBLIC + ACC_SUPER, "ClassFile", null, "java/lang/Object", null); ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); ++ mv.visitCode(); ++ mv.visitInsn(ICONST_1); ++ mv.visitInsn(ICONST_2); ++ mv.visitMultiANewArrayInsn("[I", 2); ++ mv.visitVarInsn(ASTORE, 1); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(2, 2); ++ mv.visitEnd(); ++ ++ cw.visitEnd(); ++ ++ try (FileOutputStream fos = new FileOutputStream(new File("ClassFile.class"))) { ++ fos.write(cw.toByteArray()); ++ } ++ } ++} +--- ./hotspot/test/serviceability/ParserTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/serviceability/ParserTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -22,10 +22,10 @@ + */ + + /* +- * @test ParserTest ++ * @test + * @summary Test that the diagnostic command arguemnt parser works + * @library /testlibrary /testlibrary/whitebox +- * @build ParserTest ++ * @build ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.parser.* + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI ParserTest + */ +--- ./hotspot/test/serviceability/attach/AttachWithStalePidFile.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/serviceability/attach/AttachWithStalePidFile.java Wed Jul 30 03:51:43 2014 -0700 +@@ -27,7 +27,7 @@ + * @key regression + * @summary Regression test for attach issue where stale pid files in /tmp lead to connection issues + * @library /testlibrary +- * @compile AttachWithStalePidFileTarget.java ++ * @build com.oracle.java.testlibrary.* AttachWithStalePidFileTarget + * @run main AttachWithStalePidFile + */ + +--- ./hotspot/test/serviceability/jvmti/GetObjectSizeOverflow.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/serviceability/jvmti/GetObjectSizeOverflow.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,64 @@ ++/* ++ * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++import java.io.PrintWriter; ++import com.oracle.java.testlibrary.*; ++ ++/* ++ * Test to verify GetObjectSize does not overflow on a 600M element int[] ++ * ++ * @test ++ * @bug 8027230 ++ * @library /testlibrary ++ * @build ClassFileInstaller com.oracle.java.testlibrary.* GetObjectSizeOverflowAgent ++ * @run main ClassFileInstaller GetObjectSizeOverflowAgent ++ * @run main GetObjectSizeOverflow ++ */ ++public class GetObjectSizeOverflow { ++ public static void main(String[] args) throws Exception { ++ ++ if (!Platform.is64bit()) { ++ System.out.println("Test needs a 4GB heap and can only be run as a 64bit process, skipping."); ++ return; ++ } ++ ++ PrintWriter pw = new PrintWriter("MANIFEST.MF"); ++ pw.println("Premain-Class: GetObjectSizeOverflowAgent"); ++ pw.close(); ++ ++ ProcessBuilder pb = new ProcessBuilder(); ++ pb.command(new String[] { JDKToolFinder.getJDKTool("jar"), "cmf", "MANIFEST.MF", "agent.jar", "GetObjectSizeOverflowAgent.class"}); ++ pb.start().waitFor(); ++ ++ ProcessBuilder pt = ProcessTools.createJavaProcessBuilder(true, "-Xmx4000m", "-javaagent:agent.jar", "GetObjectSizeOverflowAgent"); ++ OutputAnalyzer output = new OutputAnalyzer(pt.start()); ++ ++ if (output.getStdout().contains("Could not reserve enough space") || output.getStderr().contains("java.lang.OutOfMemoryError")) { ++ System.out.println("stdout: " + output.getStdout()); ++ System.out.println("stderr: " + output.getStderr()); ++ System.out.println("Test could not reserve or allocate enough space, skipping"); ++ return; ++ } ++ ++ output.stdoutShouldContain("GetObjectSizeOverflow passed"); ++ } ++} +--- ./hotspot/test/serviceability/jvmti/GetObjectSizeOverflowAgent.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/serviceability/jvmti/GetObjectSizeOverflowAgent.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,43 @@ ++/* ++ * 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.lang.instrument.*; ++ ++public class GetObjectSizeOverflowAgent { ++ ++ static Instrumentation instrumentation; ++ ++ public static void premain(String agentArgs, Instrumentation instrumentation) { ++ GetObjectSizeOverflowAgent.instrumentation = instrumentation; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ int[] a = new int[600_000_000]; ++ long size = instrumentation.getObjectSize(a); ++ ++ if (size < 2_400_000_000L) { ++ throw new RuntimeException("Invalid size of array, expected >= 2400000000, got " + size); ++ } ++ ++ System.out.println("GetObjectSizeOverflow passed"); ++ } ++} +--- ./hotspot/test/serviceability/jvmti/TestRedefineWithUnresolvedClass.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/serviceability/jvmti/TestRedefineWithUnresolvedClass.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,82 @@ ++/* ++ * 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 ++ * @summary Redefine a class with an UnresolvedClass reference in the constant pool. ++ * @bug 8035150 ++ * @library /testlibrary ++ * @build com.oracle.java.testlibrary.* UnresolvedClassAgent ++ * @run main TestRedefineWithUnresolvedClass ++ */ ++ ++import java.io.File; ++import java.util.Arrays; ++ ++import com.oracle.java.testlibrary.OutputAnalyzer; ++import com.oracle.java.testlibrary.ProcessTools; ++ ++public class TestRedefineWithUnresolvedClass { ++ ++ final static String slash = File.separator; ++ final static String testClasses = System.getProperty("test.classes") + slash; ++ ++ public static void main(String... args) throws Throwable { ++ // delete this class to cause a NoClassDefFoundError ++ File unresolved = new File(testClasses, "MyUnresolvedClass.class"); ++ if (unresolved.exists() && !unresolved.delete()) { ++ throw new Exception("Could not delete: " + unresolved); ++ } ++ ++ // build the javaagent ++ buildJar("UnresolvedClassAgent"); ++ ++ // launch a VM with the javaagent ++ launchTest(); ++ } ++ ++ private static void buildJar(String jarName) throws Throwable { ++ String testSrc = System.getProperty("test.src", "?") + slash; ++ ++ String jarPath = String.format("%s%s.jar", testClasses, jarName); ++ String manifestPath = String.format("%s%s.mf", testSrc, jarName); ++ String className = String.format("%s.class", jarName); ++ ++ String[] args = new String[] {"-cfm", jarPath, manifestPath, "-C", testClasses, className}; ++ ++ System.out.println("Running jar " + Arrays.toString(args)); ++ sun.tools.jar.Main jarTool = new sun.tools.jar.Main(System.out, System.err, "jar"); ++ if (!jarTool.run(args)) { ++ throw new Exception("jar failed: args=" + Arrays.toString(args)); ++ } ++ } ++ ++ private static void launchTest() throws Throwable { ++ String[] args = { ++ "-javaagent:" + testClasses + "UnresolvedClassAgent.jar", ++ "-Dtest.classes=" + testClasses, ++ "UnresolvedClassAgent" }; ++ OutputAnalyzer output = ProcessTools.executeTestJvm(args); ++ output.shouldHaveExitValue(0); ++ } ++} +--- ./hotspot/test/serviceability/jvmti/UnresolvedClassAgent.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/serviceability/jvmti/UnresolvedClassAgent.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,69 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.io.DataInputStream; ++import java.io.File; ++import java.io.FileInputStream; ++import java.lang.instrument.ClassDefinition; ++import java.lang.instrument.Instrumentation; ++ ++/* ++ * This class is present during compilation, but will be deleted before execution. ++ */ ++class MyUnresolvedClass { ++ static void bar() { ++ } ++} ++ ++class MyRedefinedClass { ++ static void foo() { ++ MyUnresolvedClass.bar(); ++ } ++} ++ ++public class UnresolvedClassAgent { ++ public static void main(String... args) { ++ } ++ ++ public static void premain(String args, Instrumentation inst) throws Exception { ++ try { ++ MyRedefinedClass.foo(); ++ } catch(NoClassDefFoundError err) { ++ System.out.println("NoClassDefFoundError (expected)"); ++ } ++ ++ File f = new File(System.getProperty("test.classes"), "MyRedefinedClass.class"); ++ byte[] buf = new byte[(int)f.length()]; ++ try (DataInputStream dis = new DataInputStream(new FileInputStream(f))) { ++ dis.readFully(buf); ++ } ++ ClassDefinition cd = new ClassDefinition(MyRedefinedClass.class, buf); ++ inst.redefineClasses(new ClassDefinition[] {cd}); ++ ++ try { ++ MyRedefinedClass.foo(); ++ } catch(NoClassDefFoundError err) { ++ System.out.println("NoClassDefFoundError (expected again)"); ++ } ++ } ++} +--- ./hotspot/test/serviceability/jvmti/UnresolvedClassAgent.mf Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/serviceability/jvmti/UnresolvedClassAgent.mf Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,3 @@ ++Manifest-Version: 1.0 ++Premain-Class: UnresolvedClassAgent ++Can-Redefine-Classes: true +--- ./hotspot/test/serviceability/sa/jmap-hashcode/Test8028623.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/serviceability/sa/jmap-hashcode/Test8028623.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ */ ++ ++/* ++ * @test ++ * @bug 8028623 ++ * @summary Test hashing of extended characters in Serviceability Agent. ++ * @library /testlibrary ++ * @build com.oracle.java.testlibrary.* ++ * @compile -encoding utf8 Test8028623.java ++ * @run main Test8028623 ++ */ ++ ++import com.oracle.java.testlibrary.JDKToolLauncher; ++import com.oracle.java.testlibrary.OutputBuffer; ++import com.oracle.java.testlibrary.ProcessTools; ++ ++import java.io.File; ++ ++public class Test8028623 { ++ ++ public static int à = 1; ++ public static String dumpFile = "heap.out"; ++ ++ public static void main (String[] args) { ++ ++ System.out.println(Ã); ++ ++ try { ++ int pid = ProcessTools.getProcessId(); ++ JDKToolLauncher jmap = JDKToolLauncher.create("jmap") ++ .addToolArg("-F") ++ .addToolArg("-dump:live,format=b,file=" + dumpFile) ++ .addToolArg(Integer.toString(pid)); ++ ProcessBuilder pb = new ProcessBuilder(jmap.getCommand()); ++ OutputBuffer output = ProcessTools.getOutput(pb); ++ Process p = pb.start(); ++ int e = p.waitFor(); ++ System.out.println("stdout:"); ++ System.out.println(output.getStdout()); ++ System.out.println("stderr:"); ++ System.out.println(output.getStderr()); ++ ++ if (e != 0) { ++ throw new RuntimeException("jmap returns: " + e); ++ } ++ if (! new File(dumpFile).exists()) { ++ throw new RuntimeException("dump file NOT created: '" + dumpFile + "'"); ++ } ++ } catch (Throwable t) { ++ t.printStackTrace(); ++ throw new RuntimeException("Test failed with: " + t); ++ } ++ } ++} +--- ./hotspot/test/serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -44,7 +44,7 @@ + * @key regression + * @summary Regression test for hprof export issue due to large heaps (>2G) + * @library /testlibrary +- * @compile JMapHProfLargeHeapProc.java ++ * @build com.oracle.java.testlibrary.* JMapHProfLargeHeapProc + * @run main JMapHProfLargeHeapTest + */ + +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/Asserts.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/Asserts.java Wed Jul 30 03:51:43 2014 -0700 +@@ -378,6 +378,64 @@ + } + } + ++ /** ++ * Asserts that two strings are equal. ++ * ++ * If strings are not equals, then exception message ++ * will contain {@code msg} followed by list of mismatched lines. ++ * ++ * @param str1 First string to compare. ++ * @param str2 Second string to compare. ++ * @param msg A description of the assumption. ++ * @throws RuntimeException if strings are not equal. ++ */ ++ public static void assertStringsEqual(String str1, String str2, ++ String msg) { ++ String lineSeparator = System.getProperty("line.separator"); ++ String str1Lines[] = str1.split(lineSeparator); ++ String str2Lines[] = str2.split(lineSeparator); ++ ++ int minLength = Math.min(str1Lines.length, str2Lines.length); ++ String longestStringLines[] = ((str1Lines.length == minLength) ? ++ str2Lines : str1Lines); ++ ++ boolean stringsAreDifferent = false; ++ ++ StringBuilder messageBuilder = new StringBuilder(msg); ++ ++ messageBuilder.append("\n"); ++ ++ for (int line = 0; line < minLength; line++) { ++ if (!str1Lines[line].equals(str2Lines[line])) { ++ messageBuilder.append(String. ++ format("[line %d] '%s' differs " + ++ "from '%s'\n", ++ line, ++ str1Lines[line], ++ str2Lines[line])); ++ stringsAreDifferent = true; ++ } ++ } ++ ++ if (minLength < longestStringLines.length) { ++ String stringName = ((longestStringLines == str1Lines) ? ++ "first" : "second"); ++ messageBuilder.append(String.format("Only %s string contains " + ++ "following lines:\n", ++ stringName)); ++ stringsAreDifferent = true; ++ for(int line = minLength; line < longestStringLines.length; line++) { ++ messageBuilder.append(String. ++ format("[line %d] '%s'", line, ++ longestStringLines[line])); ++ } ++ } ++ ++ if (stringsAreDifferent) { ++ error(messageBuilder.toString()); ++ } ++ } ++ + private static > int compare(T lhs, T rhs, String msg) { + assertNotNull(lhs, msg); + assertNotNull(rhs, msg); +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/DynamicVMOptionChecker.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/DynamicVMOptionChecker.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,121 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package com.oracle.java.testlibrary; ++ ++import com.sun.management.HotSpotDiagnosticMXBean; ++import com.sun.management.VMOption; ++import java.lang.management.ManagementFactory; ++ ++/** ++ * Simple class to check writeability, invalid and valid values for VMOption ++ */ ++public class DynamicVMOptionChecker { ++ ++ /** ++ * Reads VM option from PlatformMXBean and parse it to integer value ++ * ++ * @param name of option ++ * @return parsed value ++ */ ++ public static int getIntValue(String name) { ++ ++ VMOption option = ManagementFactory. ++ getPlatformMXBean(HotSpotDiagnosticMXBean.class). ++ getVMOption(name); ++ ++ return Integer.parseInt(option.getValue()); ++ } ++ ++ /** ++ * Sets VM option value ++ * ++ * @param name of option ++ * @param value to set ++ */ ++ public static void setIntValue(String name, int value) { ++ ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class).setVMOption(name, Integer.toString(value)); ++ } ++ ++ /** ++ * Checks that VM option is dynamically writable ++ * ++ * @param name ++ * @throws RuntimeException if option if not writable ++ * @return always true ++ */ ++ public static boolean checkIsWritable(String name) { ++ VMOption option = ManagementFactory. ++ getPlatformMXBean(HotSpotDiagnosticMXBean.class). ++ getVMOption(name); ++ ++ if (!option.isWriteable()) { ++ throw new RuntimeException(name + " is not writable"); ++ } ++ ++ return true; ++ } ++ ++ /** ++ * Checks that value cannot be set ++ * ++ * @param name of flag ++ * @param value string representation of value to set ++ * @throws RuntimeException on error - when expected exception hasn't been thrown ++ */ ++ public static void checkInvalidValue(String name, String value) { ++ // should throw ++ try { ++ ManagementFactory. ++ getPlatformMXBean(HotSpotDiagnosticMXBean.class). ++ setVMOption(name, value); ++ ++ } catch (IllegalArgumentException e) { ++ return; ++ } ++ ++ throw new RuntimeException("Expected IllegalArgumentException was not thrown, " + name + "= " + value); ++ } ++ ++ /** ++ * Checks that value can be set ++ * ++ * @param name of flag to set ++ * @param value string representation of value to set ++ * @throws RuntimeException on error - when value in VM is not equal to origin ++ */ ++ public static void checkValidValue(String name, String value) { ++ ManagementFactory. ++ getPlatformMXBean(HotSpotDiagnosticMXBean.class). ++ setVMOption(name, value); ++ ++ VMOption option = ManagementFactory. ++ getPlatformMXBean(HotSpotDiagnosticMXBean.class). ++ getVMOption(name); ++ ++ if (!option.getValue().equals(value)) { ++ throw new RuntimeException("Actual value of " + name + " \"" + option.getValue() ++ + "\" not equal origin \"" + value + "\""); ++ } ++ } ++ ++} +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/ExitCode.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/ExitCode.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,40 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.oracle.java.testlibrary; ++ ++/** ++ * Exit code values that could be returned by the JVM. ++ */ ++public enum ExitCode { ++ OK(0), ++ FAIL(1), ++ CRASH(134); ++ ++ public final int value; ++ ++ ExitCode(int value) { ++ this.value = value; ++ } ++} ++ +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Wed Jul 30 03:51:43 2014 -0700 +@@ -28,6 +28,27 @@ + private static final String dataModel = System.getProperty("sun.arch.data.model"); + private static final String vmVersion = System.getProperty("java.vm.version"); + private static final String osArch = System.getProperty("os.arch"); ++ private static final String vmName = System.getProperty("java.vm.name"); ++ ++ public static boolean isClient() { ++ return vmName.endsWith(" Client VM"); ++ } ++ ++ public static boolean isServer() { ++ return vmName.endsWith(" Server VM"); ++ } ++ ++ public static boolean isGraal() { ++ return vmName.endsWith(" Graal VM"); ++ } ++ ++ public static boolean isMinimal() { ++ return vmName.endsWith(" Minimal VM"); ++ } ++ ++ public static boolean isEmbedded() { ++ return vmName.contains("Embedded"); ++ } + + public static boolean is32bit() { + return dataModel.equals("32"); +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java Wed Jul 30 03:51:43 2014 -0700 +@@ -142,20 +142,108 @@ + * with any platform specific arguments prepended + */ + public static ProcessBuilder createJavaProcessBuilder(String... command) throws Exception { ++ return createJavaProcessBuilder(false, command); ++ } ++ ++ public static ProcessBuilder createJavaProcessBuilder(boolean addTestVmOptions, String... command) throws Exception { + String javapath = JDKToolFinder.getJDKTool("java"); + + ArrayList args = new ArrayList<>(); + args.add(javapath); + Collections.addAll(args, getPlatformSpecificVMArgs()); ++ ++ if (addTestVmOptions) { ++ String vmopts = System.getProperty("test.vm.opts"); ++ if (vmopts != null && vmopts.length() > 0) { ++ Collections.addAll(args, vmopts.split("\\s")); ++ } ++ } ++ + Collections.addAll(args, command); + + // Reporting + StringBuilder cmdLine = new StringBuilder(); +- for (String cmd : args) +- cmdLine.append(cmd).append(' '); ++ for (String cmd : args) { ++ cmdLine.append(cmd).append(' '); ++ } + System.out.println("Command line: [" + cmdLine.toString() + "]"); + + return new ProcessBuilder(args.toArray(new String[args.size()])); + } + ++ /** ++ * Executes a test jvm process, waits for it to finish and returns the process output. ++ * The default jvm options from jtreg, test.vm.opts and test.java.opts, are added. ++ * The java from the test.jdk is used to execute the command. ++ * ++ * The command line will be like: ++ * {test.jdk}/bin/java {test.vm.opts} {test.java.opts} cmds ++ * ++ * @param cmds User specifed arguments. ++ * @return The output from the process. ++ */ ++ public static OutputAnalyzer executeTestJvm(String... cmds) throws Throwable { ++ ProcessBuilder pb = createJavaProcessBuilder(Utils.addTestJavaOpts(cmds)); ++ return executeProcess(pb); ++ } ++ ++ /** ++ * Executes a process, waits for it to finish and returns the process output. ++ * @param pb The ProcessBuilder to execute. ++ * @return The output from the process. ++ */ ++ public static OutputAnalyzer executeProcess(ProcessBuilder pb) throws Throwable { ++ OutputAnalyzer output = null; ++ try { ++ output = new OutputAnalyzer(pb.start()); ++ return output; ++ } catch (Throwable t) { ++ System.out.println("executeProcess() failed: " + t); ++ throw t; ++ } finally { ++ System.out.println(getProcessLog(pb, output)); ++ } ++ } ++ ++ /** ++ * Executes a process, waits for it to finish and returns the process output. ++ * @param cmds The command line to execute. ++ * @return The output from the process. ++ */ ++ public static OutputAnalyzer executeProcess(String... cmds) throws Throwable { ++ return executeProcess(new ProcessBuilder(cmds)); ++ } ++ ++ /** ++ * Used to log command line, stdout, stderr and exit code from an executed process. ++ * @param pb The executed process. ++ * @param output The output from the process. ++ */ ++ public static String getProcessLog(ProcessBuilder pb, OutputAnalyzer output) { ++ String stderr = output == null ? "null" : output.getStderr(); ++ String stdout = output == null ? "null" : output.getStdout(); ++ String exitValue = output == null ? "null": Integer.toString(output.getExitValue()); ++ StringBuilder logMsg = new StringBuilder(); ++ final String nl = System.getProperty("line.separator"); ++ logMsg.append("--- ProcessLog ---" + nl); ++ logMsg.append("cmd: " + getCommandLine(pb) + nl); ++ logMsg.append("exitvalue: " + exitValue + nl); ++ logMsg.append("stderr: " + stderr + nl); ++ logMsg.append("stdout: " + stdout + nl); ++ return logMsg.toString(); ++ } ++ ++ /** ++ * @return The full command line for the ProcessBuilder. ++ */ ++ public static String getCommandLine(ProcessBuilder pb) { ++ if (pb == null) { ++ return "null"; ++ } ++ StringBuilder cmd = new StringBuilder(); ++ for (String s : pb.command()) { ++ cmd.append(s).append(" "); ++ } ++ return cmd.toString().trim(); ++ } + } +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/TestDynamicVMOption.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/TestDynamicVMOption.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,104 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package com.oracle.java.testlibrary; ++ ++/** ++ * Simple class to check writeability, invalid and valid values for concrete VMOption ++ */ ++public class TestDynamicVMOption { ++ ++ private final String name; ++ private final int value; ++ ++ /** ++ * Constructor ++ * ++ * @param name of VM option to test ++ */ ++ public TestDynamicVMOption(String name) { ++ this.name = name; ++ this.value = DynamicVMOptionChecker.getIntValue(name); ++ System.out.println(this.name + " = " + this.value); ++ } ++ ++ /** ++ * Checks that this value can accept valid percentage values and cannot accept invalid percentage values ++ * ++ * @throws RuntimeException ++ */ ++ public void testPercentageValues() { ++ checkInvalidValue(Integer.toString(Integer.MIN_VALUE)); ++ checkInvalidValue(Integer.toString(Integer.MAX_VALUE)); ++ checkInvalidValue("-10"); ++ checkInvalidValue("190"); ++ } ++ ++ /** ++ * Reads VM option from PlatformMXBean and parse it to integer value ++ * ++ * @return value ++ */ ++ public int getIntValue() { ++ return DynamicVMOptionChecker.getIntValue(this.name); ++ } ++ ++ /** ++ * Sets VM option value ++ * ++ * @param value to set ++ */ ++ public void setIntValue(int value) { ++ DynamicVMOptionChecker.setIntValue(this.name, value); ++ } ++ ++ /** ++ * Checks that this VM option is dynamically writable ++ * ++ * @throws RuntimeException if option if not writable ++ * @return true ++ */ ++ public boolean checkIsWritable() throws RuntimeException { ++ return DynamicVMOptionChecker.checkIsWritable(this.name); ++ } ++ ++ /** ++ * Checks that value for this VM option cannot be set ++ * ++ * @param value to check ++ * @throws RuntimeException on error - when expected exception hasn't been thrown ++ */ ++ public void checkInvalidValue(String value) { ++ DynamicVMOptionChecker.checkInvalidValue(this.name, value); ++ } ++ ++ /** ++ * Checks that value for this VM option can be set ++ * ++ * @param value to check ++ * @throws RuntimeException on error - when value in VM is not equal to origin ++ */ ++ public void checkValidValue(String value) { ++ DynamicVMOptionChecker.checkValidValue(this.name, value); ++ } ++ ++} +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/Utils.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/Utils.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,335 @@ ++/* ++ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.oracle.java.testlibrary; ++ ++import static com.oracle.java.testlibrary.Asserts.assertTrue; ++ ++import java.io.BufferedReader; ++import java.io.File; ++import java.io.FileReader; ++import java.io.IOException; ++import java.net.InetAddress; ++import java.net.ServerSocket; ++import java.net.UnknownHostException; ++import java.util.ArrayList; ++import java.util.List; ++import java.util.Arrays; ++import java.util.Collections; ++import java.util.regex.Pattern; ++import java.util.regex.Matcher; ++import java.lang.reflect.Field; ++import sun.misc.Unsafe; ++ ++/** ++ * Common library for various test helper functions. ++ */ ++public final class Utils { ++ ++ /** ++ * Returns the sequence used by operating system to separate lines. ++ */ ++ public static final String NEW_LINE = System.getProperty("line.separator"); ++ ++ /** ++ * Returns the value of 'test.vm.opts'system property. ++ */ ++ public static final String VM_OPTIONS = System.getProperty("test.vm.opts", "").trim(); ++ ++ /** ++ * Returns the value of 'test.java.opts'system property. ++ */ ++ public static final String JAVA_OPTIONS = System.getProperty("test.java.opts", "").trim(); ++ ++ private static Unsafe unsafe = null; ++ ++ /** ++ * Returns the value of 'test.timeout.factor' system property ++ * converted to {@code double}. ++ */ ++ public static final double TIMEOUT_FACTOR; ++ static { ++ String toFactor = System.getProperty("test.timeout.factor", "1.0"); ++ TIMEOUT_FACTOR = Double.parseDouble(toFactor); ++ } ++ ++ private Utils() { ++ // Private constructor to prevent class instantiation ++ } ++ ++ /** ++ * Returns the list of VM options. ++ * ++ * @return List of VM options ++ */ ++ public static List getVmOptions() { ++ return Arrays.asList(safeSplitString(VM_OPTIONS)); ++ } ++ ++ /** ++ * Returns the list of VM options with -J prefix. ++ * ++ * @return The list of VM options with -J prefix ++ */ ++ public static List getForwardVmOptions() { ++ String[] opts = safeSplitString(VM_OPTIONS); ++ for (int i = 0; i < opts.length; i++) { ++ opts[i] = "-J" + opts[i]; ++ } ++ return Arrays.asList(opts); ++ } ++ ++ /** ++ * Returns the default JTReg arguments for a jvm running a test. ++ * This is the combination of JTReg arguments test.vm.opts and test.java.opts. ++ * @return An array of options, or an empty array if no opptions. ++ */ ++ public static String[] getTestJavaOpts() { ++ List opts = new ArrayList(); ++ Collections.addAll(opts, safeSplitString(VM_OPTIONS)); ++ Collections.addAll(opts, safeSplitString(JAVA_OPTIONS)); ++ return opts.toArray(new String[0]); ++ } ++ ++ /** ++ * Returns the default JTReg arguments for a jvm running a test without ++ * options that matches regular expressions in {@code filters}. ++ * This is the combination of JTReg arguments test.vm.opts and test.java.opts. ++ * @param filters Regular expressions used to filter out options. ++ * @return An array of options, or an empty array if no options. ++ */ ++ public static String[] getFilteredTestJavaOpts(String... filters) { ++ String options[] = getTestJavaOpts(); ++ ++ if (filters.length == 0) { ++ return options; ++ } ++ ++ List filteredOptions = new ArrayList(options.length); ++ Pattern patterns[] = new Pattern[filters.length]; ++ for (int i = 0; i < filters.length; i++) { ++ patterns[i] = Pattern.compile(filters[i]); ++ } ++ ++ for (String option : options) { ++ boolean matched = false; ++ for (int i = 0; i < patterns.length && !matched; i++) { ++ Matcher matcher = patterns[i].matcher(option); ++ matched = matcher.find(); ++ } ++ if (!matched) { ++ filteredOptions.add(option); ++ } ++ } ++ ++ return filteredOptions.toArray(new String[filteredOptions.size()]); ++ } ++ ++ /** ++ * Combines given arguments with default JTReg arguments for a jvm running a test. ++ * This is the combination of JTReg arguments test.vm.opts and test.java.opts ++ * @return The combination of JTReg test java options and user args. ++ */ ++ public static String[] addTestJavaOpts(String... userArgs) { ++ List opts = new ArrayList(); ++ Collections.addAll(opts, getTestJavaOpts()); ++ Collections.addAll(opts, userArgs); ++ return opts.toArray(new String[0]); ++ } ++ ++ /** ++ * Splits a string by white space. ++ * Works like String.split(), but returns an empty array ++ * if the string is null or empty. ++ */ ++ private static String[] safeSplitString(String s) { ++ if (s == null || s.trim().isEmpty()) { ++ return new String[] {}; ++ } ++ return s.trim().split("\\s+"); ++ } ++ ++ /** ++ * @return The full command line for the ProcessBuilder. ++ */ ++ public static String getCommandLine(ProcessBuilder pb) { ++ StringBuilder cmd = new StringBuilder(); ++ for (String s : pb.command()) { ++ cmd.append(s).append(" "); ++ } ++ return cmd.toString(); ++ } ++ ++ /** ++ * Returns the free port on the local host. ++ * The function will spin until a valid port number is found. ++ * ++ * @return The port number ++ * @throws InterruptedException if any thread has interrupted the current thread ++ * @throws IOException if an I/O error occurs when opening the socket ++ */ ++ public static int getFreePort() throws InterruptedException, IOException { ++ int port = -1; ++ ++ while (port <= 0) { ++ Thread.sleep(100); ++ ++ ServerSocket serverSocket = null; ++ try { ++ serverSocket = new ServerSocket(0); ++ port = serverSocket.getLocalPort(); ++ } finally { ++ serverSocket.close(); ++ } ++ } ++ ++ return port; ++ } ++ ++ /** ++ * Returns the name of the local host. ++ * ++ * @return The host name ++ * @throws UnknownHostException if IP address of a host could not be determined ++ */ ++ public static String getHostname() throws UnknownHostException { ++ InetAddress inetAddress = InetAddress.getLocalHost(); ++ String hostName = inetAddress.getHostName(); ++ ++ assertTrue((hostName != null && !hostName.isEmpty()), ++ "Cannot get hostname"); ++ ++ return hostName; ++ } ++ ++ /** ++ * Uses "jcmd -l" to search for a jvm pid. This function will wait ++ * forever (until jtreg timeout) for the pid to be found. ++ * @param key Regular expression to search for ++ * @return The found pid. ++ */ ++ public static int waitForJvmPid(String key) throws Throwable { ++ final long iterationSleepMillis = 250; ++ System.out.println("waitForJvmPid: Waiting for key '" + key + "'"); ++ System.out.flush(); ++ while (true) { ++ int pid = tryFindJvmPid(key); ++ if (pid >= 0) { ++ return pid; ++ } ++ Thread.sleep(iterationSleepMillis); ++ } ++ } ++ ++ /** ++ * Searches for a jvm pid in the output from "jcmd -l". ++ * ++ * Example output from jcmd is: ++ * 12498 sun.tools.jcmd.JCmd -l ++ * 12254 /tmp/jdk8/tl/jdk/JTwork/classes/com/sun/tools/attach/Application.jar ++ * ++ * @param key A regular expression to search for. ++ * @return The found pid, or -1 if Enot found. ++ * @throws Exception If multiple matching jvms are found. ++ */ ++ public static int tryFindJvmPid(String key) throws Throwable { ++ OutputAnalyzer output = null; ++ try { ++ JDKToolLauncher jcmdLauncher = JDKToolLauncher.create("jcmd"); ++ jcmdLauncher.addToolArg("-l"); ++ output = ProcessTools.executeProcess(jcmdLauncher.getCommand()); ++ output.shouldHaveExitValue(0); ++ ++ // Search for a line starting with numbers (pid), follwed by the key. ++ Pattern pattern = Pattern.compile("([0-9]+)\\s.*(" + key + ").*\\r?\\n"); ++ Matcher matcher = pattern.matcher(output.getStdout()); ++ ++ int pid = -1; ++ if (matcher.find()) { ++ pid = Integer.parseInt(matcher.group(1)); ++ System.out.println("findJvmPid.pid: " + pid); ++ if (matcher.find()) { ++ throw new Exception("Found multiple JVM pids for key: " + key); ++ } ++ } ++ return pid; ++ } catch (Throwable t) { ++ System.out.println(String.format("Utils.findJvmPid(%s) failed: %s", key, t)); ++ throw t; ++ } ++ } ++ ++ /** ++ * Returns file content as a list of strings ++ * ++ * @param file File to operate on ++ * @return List of strings ++ * @throws IOException ++ */ ++ public static List fileAsList(File file) throws IOException { ++ assertTrue(file.exists() && file.isFile(), ++ file.getAbsolutePath() + " does not exist or not a file"); ++ List output = new ArrayList<>(); ++ try (BufferedReader reader = new BufferedReader(new FileReader(file.getAbsolutePath()))) { ++ while (reader.ready()) { ++ output.add(reader.readLine().replace(NEW_LINE, "")); ++ } ++ } ++ return output; ++ } ++ ++ /** ++ * @return Unsafe instance. ++ */ ++ public static synchronized Unsafe getUnsafe() { ++ if (unsafe == null) { ++ try { ++ Field f = Unsafe.class.getDeclaredField("theUnsafe"); ++ f.setAccessible(true); ++ unsafe = (Unsafe) f.get(null); ++ } catch (NoSuchFieldException | IllegalAccessException e) { ++ throw new RuntimeException("Unable to get Unsafe instance.", e); ++ } ++ } ++ return unsafe; ++ } ++ private static final char[] hexArray = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; ++ ++ /** ++ * Returns hex view of byte array ++ * ++ * @param bytes byte array to process ++ * @return Space separated hexadecimal string representation of bytes ++ */ ++ ++ public static String toHexString(byte[] bytes) { ++ char[] hexView = new char[bytes.length * 3]; ++ int i = 0; ++ for (byte b : bytes) { ++ hexView[i++] = hexArray[(b >> 4) & 0x0F]; ++ hexView[i++] = hexArray[b & 0x0F]; ++ hexView[i++] = ' '; ++ } ++ return new String(hexView); ++ } ++} +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/CPUSpecificCommandLineOptionTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/CPUSpecificCommandLineOptionTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,65 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.oracle.java.testlibrary.cli; ++ ++import com.oracle.java.testlibrary.cli.predicate.CPUSpecificPredicate; ++ ++/** ++ * Base class for command line options tests that ++ * requires specific CPU arch or specific CPU features. ++ */ ++public abstract class CPUSpecificCommandLineOptionTest ++ extends CommandLineOptionTest { ++ /** ++ * Creates new CPU specific test instance that does not ++ * require any CPU features. ++ * ++ * @param cpuArchPattern Regular expression that should ++ * match os.arch. ++ */ ++ public CPUSpecificCommandLineOptionTest(String cpuArchPattern) { ++ this(cpuArchPattern, null, null); ++ } ++ ++ /** ++ * Creates new CPU specific test instance that does not ++ * require from CPU support of {@code supportedCPUFeatures} features ++ * and no support of {@code unsupportedCPUFeatures}. ++ * ++ * @param cpuArchPattern Regular expression that should ++ * match os.arch. ++ * @param supportedCPUFeatures Array with names of features that ++ * should be supported by CPU. If {@code null}, ++ * then no features have to be supported. ++ * @param unsupportedCPUFeatures Array with names of features that ++ * should not be supported by CPU. ++ * If {@code null}, then CPU may support any ++ * features. ++ */ ++ public CPUSpecificCommandLineOptionTest(String cpuArchPattern, ++ String supportedCPUFeatures[], String unsupportedCPUFeatures[]) { ++ super(new CPUSpecificPredicate(cpuArchPattern, supportedCPUFeatures, ++ unsupportedCPUFeatures)); ++ } ++} +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/CommandLineOptionTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/CommandLineOptionTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,330 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.oracle.java.testlibrary.cli; ++ ++import java.util.List; ++import java.util.ArrayList; ++import java.util.Collections; ++import java.util.function.BooleanSupplier; ++ ++import com.oracle.java.testlibrary.*; ++ ++/** ++ * Base class for command line option tests. ++ */ ++public abstract class CommandLineOptionTest { ++ public static final String UNLOCK_DIAGNOSTIC_VM_OPTIONS ++ = "-XX:+UnlockDiagnosticVMOptions"; ++ public static final String UNLOCK_EXPERIMENTAL_VM_OPTIONS ++ = "-XX:+UnlockExperimentalVMOptions"; ++ protected static final String UNRECOGNIZED_OPTION_ERROR_FORMAT ++ = "Unrecognized VM option '[+-]?%s(=.*)?'"; ++ protected static final String EXPERIMENTAL_OPTION_ERROR_FORMAT ++ = "VM option '%s' is experimental and must be enabled via " ++ + "-XX:\\+UnlockExperimentalVMOptions."; ++ protected static final String DIAGNOSTIC_OPTION_ERROR_FORMAT ++ = " VM option '%s' is diagnostic and must be enabled via " ++ + "-XX:\\+UnlockDiagnosticVMOptions."; ++ private static final String PRINT_FLAGS_FINAL_FORMAT = "%s\\s*:?=\\s*%s"; ++ ++ /** ++ * Verifies that JVM startup behaviour matches our expectations. ++ * ++ * @param option an option that should be passed to JVM ++ * @param expectedMessages an array of patterns that should occur ++ * in JVM output. If {@code null} then ++ * JVM output could be empty. ++ * @param unexpectedMessages an array of patterns that should not ++ * occur in JVM output. If {@code null} then ++ * JVM output could be empty. ++ * @param exitCode expected exit code. ++ * @throws Throwable if verification fails or some other issues occur. ++ */ ++ public static void verifyJVMStartup(String option, ++ String expectedMessages[], String unexpectedMessages[], ++ ExitCode exitCode) throws Throwable { ++ CommandLineOptionTest.verifyJVMStartup(expectedMessages, ++ unexpectedMessages, exitCode, false, option); ++ } ++ ++ /** ++ * Verifies that JVM startup behaviour matches our expectations. ++ * ++ * @param expectedMessages an array of patterns that should occur ++ * in JVM output. If {@code null} then ++ * JVM output could be empty. ++ * @param unexpectedMessages an array of patterns that should not ++ * occur in JVM output. If {@code null} then ++ * JVM output could be empty. ++ * @param exitCode expected exit code. ++ * @param addTestVMOptions if {@code true} then test VM options will be ++ * passed to VM. ++ * @param options options that should be passed to VM in addition to mode ++ * flag. ++ * @throws Throwable if verification fails or some other issues occur. ++ */ ++ public static void verifyJVMStartup(String expectedMessages[], ++ String unexpectedMessages[], ExitCode exitCode, ++ boolean addTestVMOptions, String... options) throws Throwable { ++ List finalOptions = new ArrayList<>(); ++ if (addTestVMOptions) { ++ Collections.addAll(finalOptions, Utils.getTestJavaOpts()); ++ } ++ Collections.addAll(finalOptions, options); ++ finalOptions.add("-version"); ++ ++ ProcessBuilder processBuilder ++ = ProcessTools.createJavaProcessBuilder(finalOptions.toArray( ++ new String[finalOptions.size()])); ++ OutputAnalyzer outputAnalyzer ++ = new OutputAnalyzer(processBuilder.start()); ++ outputAnalyzer.shouldHaveExitValue(exitCode.value); ++ ++ if (expectedMessages != null) { ++ for (String expectedMessage : expectedMessages) { ++ outputAnalyzer.shouldMatch(expectedMessage); ++ } ++ } ++ ++ if (unexpectedMessages != null) { ++ for (String unexpectedMessage : unexpectedMessages) { ++ outputAnalyzer.shouldNotMatch(unexpectedMessage); ++ } ++ } ++ } ++ ++ /** ++ * Verifies that JVM startup behaviour matches our expectations when type ++ * of newly started VM is the same as the type of current. ++ * ++ * @param expectedMessages an array of patterns that should occur ++ * in JVM output. If {@code null} then ++ * JVM output could be empty. ++ * @param unexpectedMessages an array of patterns that should not ++ * occur in JVM output. If {@code null} then ++ * JVM output could be empty. ++ * @param exitCode expected exit code. ++ * @param options options that should be passed to VM in addition to mode ++ * flag. ++ * @throws Throwable if verification fails or some other issues occur. ++ */ ++ public static void verifySameJVMStartup(String expectedMessages[], ++ String unexpectedMessages[], ExitCode exitCode, String... options) ++ throws Throwable { ++ List finalOptions = new ArrayList<>(); ++ finalOptions.add(CommandLineOptionTest.getVMTypeOption()); ++ Collections.addAll(finalOptions, options); ++ ++ CommandLineOptionTest.verifyJVMStartup(expectedMessages, ++ unexpectedMessages, exitCode, false, ++ finalOptions.toArray(new String[finalOptions.size()])); ++ } ++ ++ /** ++ * Verifies that value of specified JVM option is the same as ++ * expected value. ++ * This method filter out option with {@code optionName} ++ * name from test java options. ++ * ++ * @param optionName a name of tested option. ++ * @param expectedValue expected value of tested option. ++ * @param additionalVMOpts additional options that should be ++ * passed to JVM. ++ * @throws Throwable if verification fails or some other issues occur. ++ */ ++ public static void verifyOptionValue(String optionName, ++ String expectedValue, String... additionalVMOpts) throws Throwable { ++ verifyOptionValue(optionName, expectedValue, true, additionalVMOpts); ++ } ++ ++ /** ++ * Verifies that value of specified JVM option is the same as ++ * expected value. ++ * This method filter out option with {@code optionName} ++ * name from test java options. ++ * ++ * @param optionName a name of tested option. ++ * @param expectedValue expected value of tested option. ++ * @param addTestVmOptions if {@code true}, then test VM options ++ * will be used. ++ * @param additionalVMOpts additional options that should be ++ * passed to JVM. ++ * @throws Throwable if verification fails or some other issues ++ * occur. ++ */ ++ public static void verifyOptionValue(String optionName, ++ String expectedValue, boolean addTestVmOptions, ++ String... additionalVMOpts) throws Throwable { ++ List vmOpts = new ArrayList<>(); ++ ++ if (addTestVmOptions) { ++ Collections.addAll(vmOpts, ++ Utils.getFilteredTestJavaOpts(optionName)); ++ } ++ Collections.addAll(vmOpts, additionalVMOpts); ++ Collections.addAll(vmOpts, "-XX:+PrintFlagsFinal", "-version"); ++ ++ ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder( ++ vmOpts.toArray(new String[vmOpts.size()])); ++ ++ OutputAnalyzer outputAnalyzer ++ = new OutputAnalyzer(processBuilder.start()); ++ ++ outputAnalyzer.shouldHaveExitValue(0); ++ outputAnalyzer.shouldMatch(String.format( ++ CommandLineOptionTest.PRINT_FLAGS_FINAL_FORMAT, ++ optionName, expectedValue)); ++ } ++ ++ /** ++ * Verifies that value of specified JVM when type of newly started VM ++ * is the same as the type of current. ++ * This method filter out option with {@code optionName} ++ * name from test java options. ++ * Only mode flag will be passed to VM in addition to ++ * {@code additionalVMOpts} ++ * ++ * @param optionName name of tested option. ++ * @param expectedValue expected value of tested option. ++ * @param additionalVMOpts additional options that should be ++ * passed to JVM. ++ * @throws Throwable if verification fails or some other issues occur. ++ */ ++ public static void verifyOptionValueForSameVM(String optionName, ++ String expectedValue, String... additionalVMOpts) throws Throwable { ++ List finalOptions = new ArrayList<>(); ++ finalOptions.add(CommandLineOptionTest.getVMTypeOption()); ++ Collections.addAll(finalOptions, additionalVMOpts); ++ ++ CommandLineOptionTest.verifyOptionValue(optionName, expectedValue, ++ false, finalOptions.toArray(new String[finalOptions.size()])); ++ } ++ ++ /** ++ * Prepares boolean command line flag with name {@code name} according ++ * to it's {@code value}. ++ * ++ * @param name the name of option to be prepared ++ * @param value the value of option ++ * @return prepared command line flag ++ */ ++ public static String prepareBooleanFlag(String name, boolean value) { ++ return String.format("-XX:%c%s", (value ? '+' : '-'), name); ++ } ++ ++ /** ++ * Prepares numeric command line flag with name {@code name} by setting ++ * it's value to {@code value}. ++ * ++ * @param name the name of option to be prepared ++ * @param value the value of option ++ * @return prepared command line flag ++ */ ++ public static String prepareNumericFlag(String name, Number value) { ++ return String.format("-XX:%s=%s", name, value.toString()); ++ } ++ ++ /** ++ * Returns message that should occur in VM output if option ++ * {@code optionName} if unrecognized. ++ * ++ * @param optionName the name of option for which message should be returned ++ * @return message saying that option {@code optionName} is unrecognized ++ */ ++ public static String getUnrecognizedOptionErrorMessage(String optionName) { ++ return String.format( ++ CommandLineOptionTest.UNRECOGNIZED_OPTION_ERROR_FORMAT, ++ optionName); ++ } ++ ++ /** ++ * Returns message that should occur in VM output if option ++ * {@code optionName} is experimental and ++ * -XX:+UnlockExperimentalVMOptions was not passed to VM. ++ * ++ * @param optionName the name of option for which message should be returned ++ * @return message saying that option {@code optionName} is experimental ++ */ ++ public static String getExperimentalOptionErrorMessage(String optionName) { ++ return String.format( ++ CommandLineOptionTest.EXPERIMENTAL_OPTION_ERROR_FORMAT, ++ optionName); ++ } ++ ++ /** ++ * Returns message that should occur in VM output if option ++ * {@code optionName} is diagnostic and -XX:+UnlockDiagnosticVMOptions ++ * was not passed to VM. ++ * ++ * @param optionName the name of option for which message should be returned ++ * @return message saying that option {@code optionName} is diganostic ++ */ ++ public static String getDiagnosticOptionErrorMessage(String optionName) { ++ return String.format( ++ CommandLineOptionTest.DIAGNOSTIC_OPTION_ERROR_FORMAT, ++ optionName); ++ } ++ ++ /** ++ * @return option required to start a new VM with the same type as current. ++ * @throws RuntimeException when VM type is unknown. ++ */ ++ private static String getVMTypeOption() { ++ if (Platform.isServer()) { ++ return "-server"; ++ } else if (Platform.isClient()) { ++ return "-client"; ++ } else if (Platform.isMinimal()) { ++ return "-minimal"; ++ } else if (Platform.isGraal()) { ++ return "-graal"; ++ } ++ throw new RuntimeException("Unknown VM mode."); ++ } ++ ++ private final BooleanSupplier predicate; ++ ++ /** ++ * Constructs new CommandLineOptionTest that will be executed only if ++ * predicate {@code predicate} return {@code true}. ++ * @param predicate a predicate responsible for test's preconditions check. ++ */ ++ public CommandLineOptionTest(BooleanSupplier predicate) { ++ this.predicate = predicate; ++ } ++ ++ /** ++ * Runs command line option test. ++ */ ++ public final void test() throws Throwable { ++ if (predicate.getAsBoolean()) { ++ runTestCases(); ++ } ++ } ++ ++ /** ++ * @throws Throwable if some issue happened during test cases execution. ++ */ ++ protected abstract void runTestCases() throws Throwable; ++} +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/predicate/AndPredicate.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/predicate/AndPredicate.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.oracle.java.testlibrary.cli.predicate; ++ ++import java.util.function.BooleanSupplier; ++ ++public class AndPredicate implements BooleanSupplier { ++ private final BooleanSupplier a; ++ private final BooleanSupplier b; ++ ++ public AndPredicate(BooleanSupplier a, BooleanSupplier b) { ++ this.a = a; ++ this.b = b; ++ } ++ ++ @Override ++ public boolean getAsBoolean() { ++ return a.getAsBoolean() && b.getAsBoolean(); ++ } ++} +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/predicate/CPUSpecificPredicate.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/predicate/CPUSpecificPredicate.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,71 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.oracle.java.testlibrary.cli.predicate; ++ ++import com.oracle.java.testlibrary.Platform; ++import sun.hotspot.cpuinfo.CPUInfo; ++ ++import java.util.function.BooleanSupplier; ++ ++public class CPUSpecificPredicate implements BooleanSupplier { ++ private final String cpuArchPattern; ++ private final String supportedCPUFeatures[]; ++ private final String unsupportedCPUFeatures[]; ++ ++ public CPUSpecificPredicate(String cpuArchPattern, ++ String supportedCPUFeatures[], ++ String unsupportedCPUFeatures[]) { ++ this.cpuArchPattern = cpuArchPattern; ++ this.supportedCPUFeatures = supportedCPUFeatures; ++ this.unsupportedCPUFeatures = unsupportedCPUFeatures; ++ } ++ ++ @Override ++ public boolean getAsBoolean() { ++ if (!Platform.getOsArch().matches(cpuArchPattern)) { ++ System.out.println("CPU arch does not match " + cpuArchPattern); ++ return false; ++ } ++ ++ if (supportedCPUFeatures != null) { ++ for (String feature : supportedCPUFeatures) { ++ if (!CPUInfo.hasFeature(feature)) { ++ System.out.println("CPU does not support " + feature ++ + " feature"); ++ return false; ++ } ++ } ++ } ++ ++ if (unsupportedCPUFeatures != null) { ++ for (String feature : unsupportedCPUFeatures) { ++ if (CPUInfo.hasFeature(feature)) { ++ System.out.println("CPU support " + feature + " feature"); ++ return false; ++ } ++ } ++ } ++ return true; ++ } ++} +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/predicate/NotPredicate.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/predicate/NotPredicate.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,40 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package com.oracle.java.testlibrary.cli.predicate; ++ ++import java.util.function.BooleanSupplier; ++ ++public class NotPredicate implements BooleanSupplier { ++ private final BooleanSupplier s; ++ ++ public NotPredicate(BooleanSupplier s) { ++ this.s = s; ++ } ++ ++ @Override ++ public boolean getAsBoolean() { ++ return !s.getAsBoolean(); ++ } ++} +--- ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/predicate/OrPredicate.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/com/oracle/java/testlibrary/cli/predicate/OrPredicate.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,42 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package com.oracle.java.testlibrary.cli.predicate; ++ ++import java.util.function.BooleanSupplier; ++ ++public class OrPredicate implements BooleanSupplier { ++ private final BooleanSupplier a; ++ private final BooleanSupplier b; ++ ++ public OrPredicate(BooleanSupplier a, BooleanSupplier b) { ++ this.a = a; ++ this.b = b; ++ } ++ ++ @Override ++ public boolean getAsBoolean() { ++ return a.getAsBoolean() || b.getAsBoolean(); ++ } ++} +--- ./hotspot/test/testlibrary/ctw/test/ClassesDirTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/testlibrary/ctw/test/ClassesDirTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -22,10 +22,10 @@ + */ + + /* +- * @test ClassesDirTest ++ * @test + * @bug 8012447 + * @library /testlibrary /testlibrary/whitebox /testlibrary/ctw/src +- * @build sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox ClassesDirTest Foo Bar ++ * @build ClassFileInstaller sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar + * @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar + * @run main ClassesDirTest prepare + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld classes +--- ./hotspot/test/testlibrary/ctw/test/ClassesListTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/testlibrary/ctw/test/ClassesListTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -22,10 +22,10 @@ + */ + + /* +- * @test ClassesListTest ++ * @test + * @bug 8012447 + * @library /testlibrary /testlibrary/whitebox /testlibrary/ctw/src +- * @build sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox ClassesListTest Foo Bar ++ * @build ClassFileInstaller sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar + * @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar + * @run main ClassesListTest prepare + * @run main/othervm/timeout=600 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld classes.lst +--- ./hotspot/test/testlibrary/ctw/test/JarDirTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/testlibrary/ctw/test/JarDirTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -22,10 +22,10 @@ + */ + + /* +- * @test JarDirTest ++ * @test + * @bug 8012447 + * @library /testlibrary /testlibrary/whitebox /testlibrary/ctw/src +- * @build sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox JarDirTest Foo Bar ++ * @build ClassFileInstaller com.oracle.java.testlibrary.* sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar + * @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar + * @run main JarDirTest prepare + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld jars/* +--- ./hotspot/test/testlibrary/ctw/test/JarsTest.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/testlibrary/ctw/test/JarsTest.java Wed Jul 30 03:51:43 2014 -0700 +@@ -22,10 +22,10 @@ + */ + + /* +- * @test JarsTest ++ * @test + * @bug 8012447 + * @library /testlibrary /testlibrary/whitebox /testlibrary/ctw/src +- * @build sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox JarsTest Foo Bar ++ * @build ClassFileInstaller com.oracle.java.testlibrary.* sun.hotspot.tools.ctw.CompileTheWorld sun.hotspot.WhiteBox Foo Bar + * @run main ClassFileInstaller sun.hotspot.WhiteBox Foo Bar + * @run main JarsTest prepare + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Dsun.hotspot.tools.ctw.logfile=ctw.log sun.hotspot.tools.ctw.CompileTheWorld foo.jar bar.jar +--- ./hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Tue Jun 03 14:19:26 2014 -0700 ++++ ./hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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 +@@ -135,6 +135,7 @@ + public native boolean enqueueMethodForCompilation(Executable method, int compLevel, int entry_bci); + public native void clearMethodState(Executable method); + public native int getMethodEntryBci(Executable method); ++ public native Object[] getNMethod(Executable method, boolean isOsr); + + // Intered strings + public native boolean isInStringTable(String str); +@@ -150,4 +151,7 @@ + public native void runMemoryUnitTests(); + public native void readFromNoaccessArea(); + ++ // CPU features ++ public native String getCPUFeatures(); ++ + } +--- ./hotspot/test/testlibrary/whitebox/sun/hotspot/code/NMethod.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/whitebox/sun/hotspot/code/NMethod.java Wed Jul 30 03:51:43 2014 -0700 +@@ -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. ++ * ++ */ ++ ++package sun.hotspot.code; ++ ++import java.lang.reflect.Executable; ++import sun.hotspot.WhiteBox; ++ ++public class NMethod { ++ private static final WhiteBox wb = WhiteBox.getWhiteBox(); ++ public static NMethod get(Executable method, boolean isOsr) { ++ Object[] obj = wb.getNMethod(method, isOsr); ++ return obj == null ? null : new NMethod(obj); ++ } ++ private NMethod(Object[] obj) { ++ assert obj.length == 2; ++ comp_level = (Integer) obj[0]; ++ insts = (byte[]) obj[1]; ++ } ++ public byte[] insts; ++ public int comp_level; ++ ++ @Override ++ public String toString() { ++ return "NMethod{" + ++ "insts=" + insts + ++ ", comp_level=" + comp_level + ++ '}'; ++ } ++} +--- ./hotspot/test/testlibrary/whitebox/sun/hotspot/cpuinfo/CPUInfo.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/test/testlibrary/whitebox/sun/hotspot/cpuinfo/CPUInfo.java Wed Jul 30 03:51:43 2014 -0700 +@@ -0,0 +1,98 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ * ++ */ ++ ++package sun.hotspot.cpuinfo; ++ ++import java.util.List; ++import java.util.ArrayList; ++import java.util.Arrays; ++import java.util.Collections; ++import java.util.regex.Pattern; ++import java.util.regex.Matcher; ++ ++import sun.hotspot.WhiteBox; ++ ++/** ++ * Information about CPU on test box. ++ * ++ * CPUInfo uses WhiteBox to gather information, ++ * so WhiteBox class should be added to bootclasspath ++ * and option -XX:+WhiteBoxAPI should expclicetly ++ * specified on command line. ++ */ ++public class CPUInfo { ++ ++ private static final List features; ++ private static final String additionalCPUInfo; ++ ++ static { ++ WhiteBox wb = WhiteBox.getWhiteBox(); ++ ++ Pattern additionalCPUInfoRE = ++ Pattern.compile("([^(]*\\([^)]*\\)[^,]*),\\s*"); ++ ++ String cpuFeaturesString = wb.getCPUFeatures(); ++ Matcher matcher = additionalCPUInfoRE.matcher(cpuFeaturesString); ++ if (matcher.find()) { ++ additionalCPUInfo = matcher.group(1); ++ } else { ++ additionalCPUInfo = ""; ++ } ++ String splittedFeatures[] = matcher.replaceAll("").split("(, )| "); ++ ++ features = Collections.unmodifiableList(Arrays. ++ asList(splittedFeatures)); ++ } ++ ++ /** ++ * Get additional information about CPU. ++ * For example, on X86 in will be family/model/stepping ++ * and number of cores. ++ * ++ * @return additional CPU info ++ */ ++ public static String getAdditionalCPUInfo() { ++ return additionalCPUInfo; ++ } ++ ++ /** ++ * Get all known features supported by CPU. ++ * ++ * @return unmodifiable list with names of all known features ++ * supported by CPU. ++ */ ++ public static List getFeatures() { ++ return features; ++ } ++ ++ /** ++ * Check if some feature is supported by CPU. ++ * ++ * @param feature Name of feature to be tested. ++ * @return true if tested feature is supported by CPU. ++ */ ++ public static boolean hasFeature(String feature) { ++ return features.contains(feature.toLowerCase()); ++ } ++} +--- ./jaxp/.hgtags Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/.hgtags Wed Jul 30 03:53:11 2014 -0700 +@@ -245,7 +245,9 @@ + 4045edd35e8ba73bfdc23ce8961b9640d4145fe5 jdk8-b121 + 93bf25903af0a8eaec78d7b1ab85a5b812c9aef2 jdk8-b122 + 4e35b5b6d2e5e27772d59a70a54e5d04fc801a64 jdk8-b123 ++1a28f773c8943113187e393bfd80885dedac3ccd jdk8u20-b00 + 83bb924238f800db68fb6f60142cc5149d7a9bf6 jdk8-b124 ++d987792919e12eafc8b9042b11f9c353d7c428b8 jdk8u20-b01 + 83bb924238f800db68fb6f60142cc5149d7a9bf6 jdk8-b125 + 390cc275c04c4d7c8a14a895e9bcdc57621af966 jdk8-b126 + b68cdb63a70bca7aad284946107d5d8dd1dbc663 jdk8-b127 +@@ -270,6 +272,7 @@ + c17a827bec287f4c7565c72c195667e52154772b jdk8u5-b11 + 0e5317cbe451d57f9ffcbb835de07fe553a8aa34 jdk8u5-b12 + a303ebb338518a716c267b17986634e3574e7cfe jdk8u5-b13 ++acd066c854b11ffed62d8f132205f222963f4f1e jdk8u5-b31 + 3e1631f54539cc21770659dcf61440693ac5fa79 jdk8u11-b01 + 6eaf565691a13328e82473d70dfd0feb8fb2f5e8 jdk8u11-b02 + 36d713c3339ad945521d298eeb21c67ee856344e jdk8u11-b03 +@@ -281,3 +284,32 @@ + a01fd971ef667977a131f5fbaaee300e500424c3 jdk8u11-b09 + 1d894a9d308c4b3a64e876097c2e0e1e577cfd73 jdk8u11-b10 + 41edd71af41f1100b965e0fab88f97d3c130e3de jdk8u11-b11 ++838183af6d700c91b914843992ffa0212bcb7ddc jdk8u11-b12 ++40590bbe6fc244dbdec4b660963bcfc25bd2fec1 jdk8u11-b31 ++de9ec1246a0c5c0b32ce3818386019fd4a6fceaa jdk8u20-b02 ++47cdfe271b1e97e5906eb1b96cd7d15f0717a118 jdk8u20-b03 ++f6742d0cf71201f1ffd0584c1f2990df343bc5eb jdk8u20-b04 ++fc6ca92688ef0625d20881a9c90523d49b1773d4 jdk8u20-b05 ++0cb0cd01521845c2d6f5172a9ef1783d4c8bd668 jdk8-b130 ++79d8b7fac21d263db5e5ebd3b830a3cf98509541 jdk8-b131 ++5993346020d14a1c2c7003588c584366db7921f5 jdk8-b132 ++7b1a6da8ad82b8f576f21ae0692e825395f8b31b jdk8u20-b06 ++30b8baceb72bcec111c6aad37eef96d18c09e4ef jdk8u20-b07 ++68e2ea32f92731b8ad8157252116db89903b51a3 jdk8u20-b08 ++b706e9775bf7512845120740870f717341e2b497 jdk8u20-b09 ++c356de7051ea6d25de07ef86f60eb6647eaaf2d0 jdk8u20-b10 ++40b6440e569e5f7a00f5763eddc6dc8ae24421f1 jdk8u20-b11 ++8f49f969030574e46a52f3bcbd77790045a2ec07 jdk8u20-b12 ++7777dd4143599310853e1e9ea52f8b79b2948c15 jdk8u20-b13 ++641333dd7ce2b46d4b8366d7194798c3fb28bb55 jdk8u20-b14 ++d03960b97ec8adc537f92bae9754e9ca6303880c jdk8u20-b15 ++cbde689ca74add6f9e47ba7e753d4dc9a28dfd16 jdk8u20-b16 ++3218a2d7eddbb058af4468c5721b3a87f4eb23bf jdk8u20-b17 ++262363175ec8cd9f6f78b33d567f1161e2e7d494 jdk8u20-b18 ++beb64f6b1989bc49954a4aa26ada54a91eef69eb jdk8u20-b19 ++255d961955e4fdb83ce105ae990c26b87022363f jdk8u20-b20 ++3a1bba8076da4e54882123e98e219eab1c31ccef jdk8u20-b21 ++bf115689d89bb82dc1efbe0348657e993715e850 jdk8u20-b22 ++d6ded60cfdc53861ae7d1a010f95b5036d610e80 jdk8u20-b23 ++dd09d8b9edefb5684941941e5d9b35c84ee066f3 jdk8u20-b24 ++dd09d8b9edefb5684941941e5d9b35c84ee066f3 jdk8u20-b25 +--- ./jaxp/THIRD_PARTY_README Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/THIRD_PARTY_README Wed Jul 30 03:53:11 2014 -0700 +@@ -2,7 +2,7 @@ + ----------------------------- + + %% This notice is provided with respect to ASM Bytecode Manipulation +-Framework v5.0, which may be included with JRE 8, and JDK 8, and ++Framework v5.0.3, which may be included with JRE 8, and JDK 8, and + OpenJDK 8. + + --- begin of LICENSE --- +@@ -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 +@@ -3349,14 +3349,14 @@ + + ------------------------------------------------------------------------------- + +-%% This notice is provided with respect to zlib v1.2.5, which may be included ++%% This notice is provided with respect to zlib v1.2.8, which may be included + with JRE 8, JDK 8, and OpenJDK 8. + + --- begin of LICENSE --- + +- version 1.2.5, July 18th, 2005 +- +- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler ++ version 1.2.8, April 28th, 2013 ++ ++ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages +@@ -3382,11 +3382,11 @@ + ------------------------------------------------------------------------------- + + %% This notice is provided with respect to the following which may be +-included with JRE 8, JDK 8, and OpenJDK 8, except where noted: +- +- Apache Commons Math 2.2 +- Apache Derby 10.10.1.2 [included with JDK 8] +- Apache Jakarta BCEL 5.2 ++included with JRE 8, JDK 8, and OpenJDK 8. ++ ++ Apache Commons Math 3.2 ++ Apache Derby 10.10.1.3 ++ Apache Jakarta BCEL 5.1 + Apache Jakarta Regexp 1.4 + Apache Santuario XML Security for Java 1.5.4 + Apache Xalan-Java 2.7.1 +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources.java,v 1.2.4.1 2005/09/13 09:55:37 pvedula Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_de.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_de.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_de.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 04:56:10 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +@@ -1016,7 +1013,7 @@ + "Systemeigenschaft \"org.xml.sax.parser\" nicht angegeben"}, + + { ER_PARSER_ARG_CANNOT_BE_NULL, +- "Parser-Argument darf nicht null sein"}, ++ "Parserargument darf nicht null sein"}, + + { ER_FEATURE, + "Feature: {0}"}, +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_es.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_es.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_es.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 09:06:34 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_fr.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_fr.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_fr.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 07:05:15 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_it.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_it.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_it.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 07:02:00 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ja.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ja.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_ja.java /st_wptg_1.8.0.0.0jdk/2 2013/09/12 17:39:58 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +@@ -775,7 +772,7 @@ + "\u5165\u529BDOM\u30CE\u30FC\u30C9\u306BDTMLiaison\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093...\u304B\u308F\u308A\u306Bcom.sun.org.apache.xpath.internal.DOM2Helper\u3092\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + + { ER_CALL_TO_EXT_FAILED, +- "\u62E1\u5F35\u8981\u7D20\u306E\u547C\u51FA\u3057\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {0}"}, ++ "\u62E1\u5F35\u8981\u7D20\u306E\u547C\u51FA\u3057\u304C\u5931\u6557\u3057\u307E\u3057\u305F: {0}"}, + + { ER_PREFIX_MUST_RESOLVE, + "\u63A5\u982D\u8F9E\u306F\u30CD\u30FC\u30E0\u30B9\u30DA\u30FC\u30B9\u306B\u89E3\u6C7A\u3055\u308C\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059: {0}"}, +@@ -1337,8 +1334,8 @@ + // Note to translators: The following messages provide usage information + // for the Xalan Process command line. "Process" is the name of a Java class, + // and should not be translated. +- { "xslProc_option", "Xalan-J\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30D7\u30ED\u30BB\u30B9\u30FB\u30AF\u30E9\u30B9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3:"}, +- { "xslProc_option", "Xalan-J\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30D7\u30ED\u30BB\u30B9\u30FB\u30AF\u30E9\u30B9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3:"}, ++ { "xslProc_option", "Xalan-J\u30B3\u30DE\u30F3\u30C9\u884C\u30D7\u30ED\u30BB\u30B9\u30FB\u30AF\u30E9\u30B9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3:"}, ++ { "xslProc_option", "Xalan-J\u30B3\u30DE\u30F3\u30C9\u884C\u30D7\u30ED\u30BB\u30B9\u30FB\u30AF\u30E9\u30B9\u306E\u30AA\u30D7\u30B7\u30E7\u30F3:"}, + { "xslProc_invalid_xsltc_option", "\u30AA\u30D7\u30B7\u30E7\u30F3{0}\u306FXSLTC\u30E2\u30FC\u30C9\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002"}, + { "xslProc_invalid_xalan_option", "\u30AA\u30D7\u30B7\u30E7\u30F3{0}\u306F-XSLTC\u3068\u3068\u3082\u306B\u306E\u307F\u4F7F\u7528\u3067\u304D\u307E\u3059\u3002"}, + { "xslProc_no_input", "\u30A8\u30E9\u30FC: \u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u307E\u305F\u306F\u5165\u529Bxml\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u4F7F\u7528\u65B9\u6CD5\u306E\u6307\u793A\u306B\u3064\u3044\u3066\u306F\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4ED8\u3051\u305A\u306B\u3053\u306E\u30B3\u30DE\u30F3\u30C9\u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ko.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_ko.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_ko.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 02:31:33 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_pt_BR.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_pt_BR.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_pt_BR.java /st_wptg_1.8.0.0.0jdk/2 2013/09/11 12:46:53 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +@@ -672,7 +669,7 @@ + "result-ns n\u00E3o \u00E9 mais suportado! Em vez disso, use xsl:output."}, + + { ER_DEFAULTSPACE_NOT_SUPPORTED, +- "default-space n\u00E3o \u00E9 mais suportado! Em vez disso, use xsl:strip-space ou xsl:preserve-space."}, ++ "padr\u00E3o-space n\u00E3o \u00E9 mais suportado! Em vez disso, use xsl:strip-space ou xsl:preserve-space."}, + + { ER_INDENTRESULT_NOT_SUPPORTED, + "indent-result n\u00E3o \u00E9 mais suportado! Em vez disso, use xsl:output."}, +@@ -907,10 +904,10 @@ + "2 ou 3"}, + + { ER_COULD_NOT_LOAD_RESOURCE, +- "N\u00E3o foi poss\u00EDvel carregar {0} (verificar CLASSPATH); usando agora apenas os defaults"}, ++ "N\u00E3o foi poss\u00EDvel carregar {0} (verificar CLASSPATH); usando agora apenas os padr\u00F5es"}, + + { ER_CANNOT_INIT_DEFAULT_TEMPLATES, +- "N\u00E3o \u00E9 poss\u00EDvel inicializar os modelos default"}, ++ "N\u00E3o \u00E9 poss\u00EDvel inicializar os modelos padr\u00E3o"}, + + { ER_RESULT_NULL, + "O resultado n\u00E3o deve ser nulo"}, +@@ -1186,7 +1183,7 @@ + "O valor do par\u00E2metro {0} deve ser um Objeto Java v\u00E1lido"}, + + { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX_FOR_DEFAULT, +- "O atributo result-prefix de um elemento xsl:namespace-alias tem o valor '#default', mas n\u00E3o h\u00E1 declara\u00E7\u00E3o do namespace default no escopo do elemento"}, ++ "O atributo result-prefix de um elemento xsl:namespace-alias tem o valor '#padr\u00E3o', mas n\u00E3o h\u00E1 declara\u00E7\u00E3o do namespace padr\u00E3o no escopo do elemento"}, + + { ER_INVALID_NAMESPACE_URI_VALUE_FOR_RESULT_PREFIX, + "O atributo result-prefix de um elemento xsl:namespace-alias tem o valor ''{0}'', mas n\u00E3o h\u00E1 declara\u00E7\u00E3o de namespace para o prefixo ''{0}'' no escopo do elemento."}, +@@ -1271,7 +1268,7 @@ + "Namespace de XSLT n\u00E3o encontrado ou incorreto. "}, + + { WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED, +- "\u00C9 permitida somente uma declara\u00E7\u00E3o de xsl:decimal-format default."}, ++ "\u00C9 permitida somente uma declara\u00E7\u00E3o de xsl:decimal-format padr\u00E3o."}, + + { WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE, + "os nomes de xsl:decimal-format devem ser exclusivos. O nome \"{0}\" foi duplicado."}, +@@ -1363,16 +1360,16 @@ + { "optionV", " [-E (N\u00E3o expandir refer\u00EAncias da entidade)]"}, + { "optionQC", " [-QC (Advert\u00EAncias de Conflitos do Padr\u00E3o Silencioso)]"}, + { "optionQ", " [-Q (Modo Silencioso)]"}, +- { "optionLF", " [-LF (Usar alimenta\u00E7\u00F5es de linha somente na sa\u00EDda {o default \u00E9 CR/LF})]"}, +- { "optionCR", " [-CR (Use retornos de carro somente na sa\u00EDda {o default \u00E9 CR/LF})]"}, +- { "optionESCAPE", " [-ESCAPE (Quais caracteres devem ser identificados como escape {o default \u00E9 <>&\"'\\r\\n}]"}, +- { "optionINDENT", " [-INDENT (Controla quantos espa\u00E7os devem ser recuados {o default \u00E9 0})]"}, ++ { "optionLF", " [-LF (Usar alimenta\u00E7\u00F5es de linha somente na sa\u00EDda {o padr\u00E3o \u00E9 CR/LF})]"}, ++ { "optionCR", " [-CR (Use retornos de carro somente na sa\u00EDda {o padr\u00E3o \u00E9 CR/LF})]"}, ++ { "optionESCAPE", " [-ESCAPE (Quais caracteres devem ser identificados como escape {o padr\u00E3o \u00E9 <>&\"'\\r\\n}]"}, ++ { "optionINDENT", " [-INDENT (Controla quantos espa\u00E7os devem ser recuados {o padr\u00E3o \u00E9 0})]"}, + { "optionTT", " [-TT (Rastreia os modelos \u00E0 medida que s\u00E3o chamados.)]"}, + { "optionTG", " [-TG (Rastreia cada evento de gera\u00E7\u00E3o.)]"}, + { "optionTS", " [-TS (Rastreia cada evento de sele\u00E7\u00E3o.)]"}, + { "optionTTC", " [-TTC (Rastreia os filhos do modelo \u00E0 medida que s\u00E3o processados.)]"}, + { "optionTCLASS", " [-TCLASS (Classe TraceListener para extens\u00F5es de rastreamento.)]"}, +- { "optionVALIDATE", " [-VALIDATE (Define se ocorre valida\u00E7\u00E3o. Por default, a valida\u00E7\u00E3o fica desativada.)]"}, ++ { "optionVALIDATE", " [-VALIDATE (Define se ocorre valida\u00E7\u00E3o. Por padr\u00E3o, a valida\u00E7\u00E3o fica desativada.)]"}, + { "optionEDUMP", " [-EDUMP {nome do arquivo opcional} (Execute um dump de pilha em caso de erro.)]"}, + { "optionXML", " [-XML (Use o formatador XML e adicione o cabe\u00E7alho XML.)]"}, + { "optionTEXT", " [-TEXT (Use o formatador de Texto simples.)]"}, +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_sv.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_sv.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_sv.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 06:50:58 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_CN.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_CN.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_zh_CN.java /st_wptg_1.8.0.0.0jdk/3 2013/11/11 11:39:28 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +--- ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_TW.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/res/XSLTErrorResources_zh_TW.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: XSLTErrorResources_zh_TW.java /st_wptg_1.8.0.0.0jdk/2 2013/09/14 02:16:34 gmolloy Exp $ +- */ + package com.sun.org.apache.xalan.internal.res; + + import java.util.ListResourceBundle; +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/StringLengthCall.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/StringLengthCall.java Wed Jul 30 03:53:11 2014 -0700 +@@ -26,7 +26,7 @@ + import java.util.Vector; + + import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen; +-import com.sun.org.apache.bcel.internal.generic.INVOKEVIRTUAL; ++import com.sun.org.apache.bcel.internal.generic.INVOKESTATIC; + import com.sun.org.apache.bcel.internal.generic.InstructionList; + import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator; + import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator; +@@ -51,7 +51,8 @@ + il.append(methodGen.loadContextNode()); + Type.Node.translateTo(classGen, methodGen, Type.String); + } +- il.append(new INVOKEVIRTUAL(cpg.addMethodref(STRING_CLASS, +- "length", "()I"))); ++ il.append(new INVOKESTATIC(cpg.addMethodref(BASIS_LIBRARY_CLASS, ++ "getStringLength", ++ "(Ljava/lang/String;)I"))); + } + } +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages.java,v 1.2.4.1 2005/09/15 09:59:41 pvedula Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_de.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_de.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_de.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 04:56:10 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_es.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_es.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_es.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 09:06:34 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_fr.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_fr.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_fr.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 07:05:15 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_it.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_it.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_it.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 07:02:00 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ja.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ja.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_ja.java /st_wptg_1.8.0.0.0jdk/2 2013/09/12 17:39:58 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +@@ -761,14 +758,14 @@ + * line option that was not recognized. + */ + {ErrorMsg.ILLEGAL_CMDLINE_OPTION_ERR, +- "\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3''{0}''\u306F\u7121\u52B9\u3067\u3059\u3002"}, ++ "\u30B3\u30DE\u30F3\u30C9\u884C\u30AA\u30D7\u30B7\u30E7\u30F3''{0}''\u306F\u7121\u52B9\u3067\u3059\u3002"}, + + /* + * Note to translators: The substitution text is the name of a command- + * line option. + */ + {ErrorMsg.CMDLINE_OPT_MISSING_ARG_ERR, +- "\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3''{0}''\u306B\u5FC5\u9808\u306E\u5F15\u6570\u304C\u3042\u308A\u307E\u305B\u3093\u3002"}, ++ "\u30B3\u30DE\u30F3\u30C9\u884C\u30AA\u30D7\u30B7\u30E7\u30F3''{0}''\u306B\u5FC5\u9808\u306E\u5F15\u6570\u304C\u3042\u308A\u307E\u305B\u3093\u3002"}, + + /* + * Note to translators: This message is used to indicate the severity +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ko.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ko.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_ko.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 02:31:33 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_pt_BR.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_pt_BR.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_pt_BR.java /st_wptg_1.8.0.0.0jdk/2 2013/09/11 12:46:53 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +@@ -682,7 +679,7 @@ + * documentation. + */ + {ErrorMsg.COMPILE_USAGE_STR, +- "SINOPSE\n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Compile [-o ]\n [-d ] [-j ] [-p ]\n [-n] [-x] [-u] [-v] [-h] { | -i }\n\nOP\u00C7\u00D5ES\n -o atribui o nome ao translet\n gerado. Por default, o nome translet\n origina-se do nome . Esta op\u00E7\u00E3o\n \u00E9 ignorada caso sejam compiladas v\u00E1rias folhas de estilos.\n -d especifica um diret\u00F3rio de destino para translet\n -j empacota as classes translet em um arquivo jar do\n nome especificado como \n -p especifica um prefixo de nome do pacote para todas as classes\n translet geradas.\n -n permite a inclus\u00E3o do modelo na linha (comportamento default melhor\n em m\u00E9dia).\n -x ativa a sa\u00EDda de mensagens de depura\u00E7\u00E3o adicionais\n -u interpreta os argumentos como URLs\n -i obriga o compilador a ler a folha de estilos de stdin\n -v imprime a vers\u00E3o do compilador\n -h imprime esta instru\u00E7\u00E3o de uso\n"}, ++ "SINOPSE\n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Compile [-o ]\n [-d ] [-j ] [-p ]\n [-n] [-x] [-u] [-v] [-h] { | -i }\n\nOP\u00C7\u00D5ES\n -o atribui o nome ao translet\n gerado. Por padr\u00E3o, o nome translet\n origina-se do nome . Esta op\u00E7\u00E3o\n \u00E9 ignorada caso sejam compiladas v\u00E1rias folhas de estilos.\n -d especifica um diret\u00F3rio de destino para translet\n -j empacota as classes translet em um arquivo jar do\n nome especificado como \n -p especifica um prefixo de nome do pacote para todas as classes\n translet geradas.\n -n permite a inclus\u00E3o do modelo na linha (comportamento padr\u00E3o melhor\n em m\u00E9dia).\n -x ativa a sa\u00EDda de mensagens de depura\u00E7\u00E3o adicionais\n -u interpreta os argumentos como URLs\n -i obriga o compilador a ler a folha de estilos de stdin\n -v imprime a vers\u00E3o do compilador\n -h imprime esta instru\u00E7\u00E3o de uso\n"}, + + /* + * Note to translators: This message contains usage information for a +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_sv.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_sv.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_sv.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 06:50:58 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_zh_CN.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_zh_CN.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_zh_CN.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 04:44:25 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_zh_TW.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_zh_TW.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_zh_TW.java /st_wptg_1.8.0.0.0jdk/2 2013/09/14 02:16:34 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.compiler.util; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java Wed Jul 30 03:53:11 2014 -0700 +@@ -1660,5 +1660,14 @@ + + } + ++ /** ++ * Utility method to calculate string-length as a number of code points, ++ * to avoid possible errors with string that contains ++ * complementary characters ++ */ ++ public static int getStringLength(String str) { ++ return str.codePointCount(0,str.length()); ++ } ++ + //-- End utility functions + } +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages.java,v 1.2.4.1 2005/09/14 05:06:42 pvedula Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_de.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_de.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_de.java,v 1.2.4.1 2005/09/14 05:13:15 pvedula Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_es.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_es.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_es.java,v 1.2.4.1 2005/09/14 05:14:39 pvedula Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_fr.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_fr.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_fr.java,v 1.2.4.1 2005/09/14 05:15:37 pvedula Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_it.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_it.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_it.java,v 1.2.4.1 2005/09/14 05:22:16 pvedula Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_ja.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_ja.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_ja.java,v 1.2.4.1 2005/09/14 05:46:36 pvedula Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_ko.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_ko.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_ko.java,v 1.2.4.1 2005/09/14 05:48:33 pvedula Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_pt_BR.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_pt_BR.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_pt_BR.java /st_wptg_1.8.0.0.0jdk/2 2013/09/11 12:46:53 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_sv.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_sv.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_sv.java /st_wptg_1.8.0.0.0jdk/2 2013/09/16 06:50:58 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_zh_CN.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_zh_CN.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_zh_CN.java /st_wptg_1.8.0.0.0jdk/3 2013/11/11 11:39:28 gmolloy Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_zh_TW.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/runtime/ErrorMessages_zh_TW.java Wed Jul 30 03:53:11 2014 -0700 +@@ -17,9 +17,6 @@ + * See the License for the specific language governing permissions and + * limitations under the License. + */ +-/* +- * $Id: ErrorMessages_zh_TW.java,v 1.2.4.1 2005/09/14 06:56:12 pvedula Exp $ +- */ + + package com.sun.org.apache.xalan.internal.xsltc.runtime; + +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XML11EntityScanner.java Wed Jul 30 03:53:11 2014 -0700 +@@ -61,14 +61,13 @@ + + package com.sun.org.apache.xerces.internal.impl; + +-import java.io.IOException; +- + import com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter; ++import com.sun.org.apache.xerces.internal.util.XML11Char; + import com.sun.org.apache.xerces.internal.util.XMLChar; +-import com.sun.org.apache.xerces.internal.util.XML11Char; + import com.sun.org.apache.xerces.internal.util.XMLStringBuffer; + import com.sun.org.apache.xerces.internal.xni.QName; + import com.sun.org.apache.xerces.internal.xni.XMLString; ++import java.io.IOException; + + /** + * Implements the entity scanner methods in +@@ -78,6 +77,7 @@ + * + * @author Michael Glavassevich, IBM + * @author Neil Graham, IBM ++ * @version $Id: XML11EntityScanner.java,v 1.5 2010-11-01 04:39:40 joehw Exp $ + */ + + public class XML11EntityScanner +@@ -108,7 +108,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + + // peek at character +@@ -136,7 +136,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + + // scan character +@@ -148,7 +148,7 @@ + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { + fCurrentEntity.ch[0] = (char)c; +- load(1, false); ++ load(1, false, true); + } + if (c == '\r' && external) { + int cc = fCurrentEntity.ch[fCurrentEntity.position++]; +@@ -183,7 +183,7 @@ + public String scanNmtoken() throws IOException { + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + + // scan nmtoken +@@ -194,6 +194,7 @@ + if (XML11Char.isXML11Name(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -206,7 +207,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -214,6 +215,7 @@ + else if (XML11Char.isXML11NameHighSurrogate(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -226,7 +228,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + --fCurrentEntity.startPosition; + --fCurrentEntity.position; + break; +@@ -240,6 +242,7 @@ + } + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -252,7 +255,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -294,7 +297,7 @@ + public String scanName() throws IOException { + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + + // scan name +@@ -305,7 +308,7 @@ + if (++fCurrentEntity.position == fCurrentEntity.count) { + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false)) { ++ if (load(1, false, true)) { + fCurrentEntity.columnNumber++; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1); + return symbol; +@@ -316,7 +319,7 @@ + if (++fCurrentEntity.position == fCurrentEntity.count) { + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false)) { ++ if (load(1, false, true)) { + --fCurrentEntity.position; + --fCurrentEntity.startPosition; + return null; +@@ -332,7 +335,7 @@ + fCurrentEntity.ch[0] = ch; + fCurrentEntity.ch[1] = ch2; + offset = 0; +- if (load(2, false)) { ++ if (load(2, false, true)) { + fCurrentEntity.columnNumber += 2; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 2); + return symbol; +@@ -348,6 +351,7 @@ + if (XML11Char.isXML11Name(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -360,7 +364,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -368,6 +372,7 @@ + else if (XML11Char.isXML11NameHighSurrogate(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -380,7 +385,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + --fCurrentEntity.position; + --fCurrentEntity.startPosition; + break; +@@ -394,6 +399,7 @@ + } + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -406,7 +412,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -449,7 +455,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + + // scan name +@@ -460,7 +466,7 @@ + if (++fCurrentEntity.position == fCurrentEntity.count) { + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false)) { ++ if (load(1, false, true)) { + fCurrentEntity.columnNumber++; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1); + return symbol; +@@ -471,7 +477,7 @@ + if (++fCurrentEntity.position == fCurrentEntity.count) { + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false)) { ++ if (load(1, false, true)) { + --fCurrentEntity.position; + --fCurrentEntity.startPosition; + return null; +@@ -487,7 +493,7 @@ + fCurrentEntity.ch[0] = ch; + fCurrentEntity.ch[1] = ch2; + offset = 0; +- if (load(2, false)) { ++ if (load(2, false, true)) { + fCurrentEntity.columnNumber += 2; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 2); + return symbol; +@@ -503,6 +509,7 @@ + if (XML11Char.isXML11NCName(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -515,7 +522,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -523,6 +530,7 @@ + else if (XML11Char.isXML11NameHighSurrogate(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -535,7 +543,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + --fCurrentEntity.startPosition; + --fCurrentEntity.position; + break; +@@ -549,6 +557,7 @@ + } + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -561,7 +570,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -610,7 +619,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + + // scan qualified name +@@ -621,7 +630,7 @@ + if (++fCurrentEntity.position == fCurrentEntity.count) { + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false)) { ++ if (load(1, false, true)) { + fCurrentEntity.columnNumber++; + String name = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1); + qname.setValues(null, name, name, null); +@@ -633,7 +642,7 @@ + if (++fCurrentEntity.position == fCurrentEntity.count) { + fCurrentEntity.ch[0] = ch; + offset = 0; +- if (load(1, false)) { ++ if (load(1, false, true)) { + --fCurrentEntity.startPosition; + --fCurrentEntity.position; + return false; +@@ -649,7 +658,7 @@ + fCurrentEntity.ch[0] = ch; + fCurrentEntity.ch[1] = ch2; + offset = 0; +- if (load(2, false)) { ++ if (load(2, false, true)) { + fCurrentEntity.columnNumber += 2; + String name = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 2); + qname.setValues(null, name, name, null); +@@ -674,6 +683,7 @@ + } + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -689,7 +699,7 @@ + index = index - offset; + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -697,6 +707,7 @@ + else if (XML11Char.isXML11NameHighSurrogate(ch)) { + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -712,7 +723,7 @@ + index = index - offset; + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + sawIncompleteSurrogatePair = true; + --fCurrentEntity.startPosition; + --fCurrentEntity.position; +@@ -728,6 +739,7 @@ + } + if (++fCurrentEntity.position == fCurrentEntity.count) { + int length = fCurrentEntity.position - offset; ++ invokeListeners(length); + if (length == fCurrentEntity.ch.length) { + // bad luck we have to resize our buffer + char[] tmp = new char[fCurrentEntity.ch.length << 1]; +@@ -743,7 +755,7 @@ + index = index - offset; + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -820,11 +832,11 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + else if (fCurrentEntity.position == fCurrentEntity.count - 1) { + fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; +- load(1, false); ++ load(1, false, true); + fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; + } +@@ -846,7 +858,7 @@ + fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition); + fCurrentEntity.position = newlines; + fCurrentEntity.startPosition = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -869,7 +881,7 @@ + fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition); + fCurrentEntity.position = newlines; + fCurrentEntity.startPosition = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -961,11 +973,11 @@ + throws IOException { + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + else if (fCurrentEntity.position == fCurrentEntity.count - 1) { + fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; +- load(1, false); ++ load(1, false, true); + fCurrentEntity.startPosition = 0; + fCurrentEntity.position = 0; + } +@@ -987,7 +999,7 @@ + fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition); + fCurrentEntity.position = newlines; + fCurrentEntity.startPosition = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -1010,7 +1022,7 @@ + fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition); + fCurrentEntity.position = newlines; + fCurrentEntity.startPosition = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -1113,7 +1125,7 @@ + do { + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, false); + } + + boolean bNextEntity = false; +@@ -1127,7 +1139,7 @@ + 0, + fCurrentEntity.count - fCurrentEntity.position); + +- bNextEntity = load(fCurrentEntity.count - fCurrentEntity.position, false); ++ bNextEntity = load(fCurrentEntity.count - fCurrentEntity.position, false, false); + fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; + } +@@ -1140,7 +1152,7 @@ + fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition); + fCurrentEntity.position = fCurrentEntity.count; + fCurrentEntity.startPosition = fCurrentEntity.count; +- load(0,true); ++ load(0,true, false); + return false; + } + +@@ -1160,7 +1172,7 @@ + fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition); + fCurrentEntity.position = newlines; + fCurrentEntity.startPosition = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -1184,7 +1196,7 @@ + fCurrentEntity.position = newlines; + fCurrentEntity.startPosition = newlines; + fCurrentEntity.count = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -1309,7 +1321,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + + // skip character +@@ -1335,7 +1347,7 @@ + // handle newlines + if (fCurrentEntity.position == fCurrentEntity.count) { + fCurrentEntity.ch[0] = (char)cc; +- load(1, false); ++ load(1, false, true); + } + int ccc = fCurrentEntity.ch[++fCurrentEntity.position]; + if (ccc == '\n' || ccc == 0x85) { +@@ -1369,7 +1381,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + + +@@ -1397,7 +1409,7 @@ + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count - 1) { + fCurrentEntity.ch[0] = (char)c; +- entityChanged = load(1, true); ++ entityChanged = load(1, true, true); + if (!entityChanged) { + // the load change the position to be 1, + // need to restore it when entity not changed +@@ -1424,7 +1436,7 @@ + if (!entityChanged) + fCurrentEntity.position++; + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + + if(fCurrentEntity == null){ + return true ; +@@ -1445,7 +1457,7 @@ + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count - 1) { + fCurrentEntity.ch[0] = (char)c; +- entityChanged = load(1, true); ++ entityChanged = load(1, true, true); + if (!entityChanged) { + // the load change the position to be 1, + // need to restore it when entity not changed +@@ -1463,7 +1475,7 @@ + if (!entityChanged) + fCurrentEntity.position++; + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + + if(fCurrentEntity == null){ + return true ; +@@ -1496,7 +1508,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, true); + } + + // skip string +@@ -1508,10 +1520,11 @@ + return false; + } + if (i < length - 1 && fCurrentEntity.position == fCurrentEntity.count) { ++ invokeListeners(0); + System.arraycopy(fCurrentEntity.ch, fCurrentEntity.count - i - 1, fCurrentEntity.ch, 0, i + 1); + // REVISIT: Can a string to be skipped cross an + // entity boundary? -Ac +- if (load(i + 1, false)) { ++ if (load(i + 1, false, false)) { + fCurrentEntity.startPosition -= i + 1; + fCurrentEntity.position -= i + 1; + return false; +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityScanner.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityScanner.java Wed Jul 30 03:53:11 2014 -0700 +@@ -20,34 +20,28 @@ + + package com.sun.org.apache.xerces.internal.impl; + +-import java.io.EOFException; +-import java.io.IOException; +-import java.util.Locale; +-import java.util.Vector; +- +-import com.sun.xml.internal.stream.Entity; +-import com.sun.xml.internal.stream.XMLBufferListener; +-import java.io.InputStream; +-import java.io.InputStreamReader; +-import java.io.Reader; + + + import com.sun.org.apache.xerces.internal.impl.io.ASCIIReader; + import com.sun.org.apache.xerces.internal.impl.io.UCSReader; + import com.sun.org.apache.xerces.internal.impl.io.UTF8Reader; +- +- + import com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter; + import com.sun.org.apache.xerces.internal.util.EncodingMap; +- + import com.sun.org.apache.xerces.internal.util.SymbolTable; + import com.sun.org.apache.xerces.internal.util.XMLChar; + import com.sun.org.apache.xerces.internal.util.XMLStringBuffer; +-import com.sun.org.apache.xerces.internal.xni.QName; +-import com.sun.org.apache.xerces.internal.xni.XMLString; ++import com.sun.org.apache.xerces.internal.xni.*; + import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager; + import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException; +-import com.sun.org.apache.xerces.internal.xni.*; ++import com.sun.xml.internal.stream.Entity; ++import com.sun.xml.internal.stream.XMLBufferListener; ++import java.io.EOFException; ++import java.io.IOException; ++import java.io.InputStream; ++import java.io.InputStreamReader; ++import java.io.Reader; ++import java.util.Locale; ++import java.util.Vector; + + /** + * Implements the entity scanner methods. +@@ -493,8 +487,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + } + + // peek at character +@@ -535,8 +528,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + } + + // scan character +@@ -546,9 +538,8 @@ + fCurrentEntity.lineNumber++; + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(1); + fCurrentEntity.ch[0] = (char)c; +- load(1, false); ++ load(1, false, true); + } + if (c == '\r' && isExternal) { + if (fCurrentEntity.ch[fCurrentEntity.position++] != '\n') { +@@ -593,8 +584,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + } + + // scan nmtoken +@@ -626,7 +616,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -673,18 +663,16 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + } + + // scan name + int offset = fCurrentEntity.position; + if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) { + if (++fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(1); + fCurrentEntity.ch[0] = fCurrentEntity.ch[offset]; + offset = 0; +- if (load(1, false)) { ++ if (load(1, false, true)) { + fCurrentEntity.columnNumber++; + String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1); + +@@ -721,7 +709,7 @@ + fCurrentEntity.ch, 0, length); + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -776,8 +764,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + } + + // scan qualified name +@@ -789,11 +776,10 @@ + + if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) { + if (++fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(1); + fCurrentEntity.ch[0] = fCurrentEntity.ch[offset]; + offset = 0; + +- if (load(1, false)) { ++ if (load(1, false, true)) { + fCurrentEntity.columnNumber++; + //adding into symbol table. + //XXX We are trying to add single character in SymbolTable?????? +@@ -843,7 +829,7 @@ + index = index - offset; + } + offset = 0; +- if (load(length, false)) { ++ if (load(length, false, false)) { + break; + } + } +@@ -918,12 +904,10 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + } else if (fCurrentEntity.position == fCurrentEntity.count - 1) { +- invokeListeners(0); + fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; +- load(1, false); ++ load(1, false, true); + fCurrentEntity.position = 0; + } + +@@ -945,9 +929,8 @@ + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { + offset = 0; +- invokeListeners(newlines); + fCurrentEntity.position = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -965,9 +948,8 @@ + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { + offset = 0; +- invokeListeners(newlines); + fCurrentEntity.position = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -1070,13 +1052,10 @@ + } + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + } else if (fCurrentEntity.position == fCurrentEntity.count - 1) { +- invokeListeners(0); + fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; +- +- load(1, false); ++ load(1, false, true); + fCurrentEntity.position = 0; + } + +@@ -1099,10 +1078,9 @@ + fCurrentEntity.lineNumber++; + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(newlines); + offset = 0; + fCurrentEntity.position = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -1121,9 +1099,8 @@ + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { + offset = 0; +- invokeListeners(newlines); + fCurrentEntity.position = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -1174,7 +1151,6 @@ + storeWhiteSpace(fCurrentEntity.position); + } + } +- + int length = fCurrentEntity.position - offset; + fCurrentEntity.columnNumber += length - newlines; + content.setValues(fCurrentEntity.ch, offset, length); +@@ -1258,7 +1234,7 @@ + // load more characters, if needed + + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, false); + } + + boolean bNextEntity = false; +@@ -1272,7 +1248,7 @@ + 0, + fCurrentEntity.count - fCurrentEntity.position); + +- bNextEntity = load(fCurrentEntity.count - fCurrentEntity.position, false); ++ bNextEntity = load(fCurrentEntity.count - fCurrentEntity.position, false, false); + fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; + } +@@ -1285,7 +1261,7 @@ + fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition); + fCurrentEntity.position = fCurrentEntity.count; + fCurrentEntity.startPosition = fCurrentEntity.count; +- load(0, true); ++ load(0, true, false); + return false; + } + +@@ -1307,9 +1283,8 @@ + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { + offset = 0; +- invokeListeners(newlines); + fCurrentEntity.position = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -1327,10 +1302,9 @@ + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count) { + offset = 0; +- invokeListeners(newlines); + fCurrentEntity.position = newlines; + fCurrentEntity.count = newlines; +- if (load(newlines, false)) { ++ if (load(newlines, false, true)) { + break; + } + } +@@ -1431,8 +1405,7 @@ + + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + } + + // skip character +@@ -1454,9 +1427,8 @@ + } else if (c == '\n' && cc == '\r' && isExternal) { + // handle newlines + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(1); + fCurrentEntity.ch[0] = (char)cc; +- load(1, false); ++ load(1, false, true); + } + fCurrentEntity.position++; + if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') { +@@ -1507,8 +1479,7 @@ + //boolean entityChanged = false; + // load more characters, if needed + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + } + + //we are doing this check only in skipSpace() because it is called by +@@ -1531,9 +1502,8 @@ + fCurrentEntity.lineNumber++; + fCurrentEntity.columnNumber = 1; + if (fCurrentEntity.position == fCurrentEntity.count - 1) { +- invokeListeners(0); + fCurrentEntity.ch[0] = (char)c; +- entityChanged = load(1, true); ++ entityChanged = load(1, true, true); + if (!entityChanged){ + // the load change the position to be 1, + // need to restore it when entity not changed +@@ -1558,8 +1528,7 @@ + } + + if (fCurrentEntity.position == fCurrentEntity.count) { +- invokeListeners(0); +- load(0, true); ++ load(0, true, true); + + //we are doing this check only in skipSpace() because it is called by + //fMiscDispatcher and we want the parser to exit gracefully when document +@@ -1635,7 +1604,7 @@ + if((fCurrentEntity.count - fCurrentEntity.position) < length){ + int pos = fCurrentEntity.position; + invokeListeners(pos); +- entityChanged = load(fCurrentEntity.count, changeEntity); ++ entityChanged = load(fCurrentEntity.count, changeEntity, false); + fCurrentEntity.position = pos; + if(entityChanged)break; + } +@@ -1740,17 +1709,22 @@ + * the current entity in place and the entity + * boundary will be signaled by the return + * value. ++ * @param notify Determine whether to notify listeners of ++ * the event + * + * @returns Returns true if the entity changed as a result of this + * load operation. + */ +- final boolean load(int offset, boolean changeEntity) ++ final boolean load(int offset, boolean changeEntity, boolean notify) + throws IOException { + if (DEBUG_BUFFER) { + System.out.print("(load, "+offset+": "); + print(); + System.out.println(); + } ++ if (notify) { ++ invokeListeners(offset); ++ } + //maintaing the count till last load + fCurrentEntity.fTotalCountTillLastLoad = fCurrentEntity.fTotalCountTillLastLoad + fCurrentEntity.fLastCount ; + // read characters +@@ -1787,7 +1761,7 @@ + } + // handle the trailing edges + if (fCurrentEntity.position == fCurrentEntity.count) { +- load(0, true); ++ load(0, true, false); + } + } + +@@ -2084,7 +2058,7 @@ + * + * @param loadPos Starting position from which new data is being loaded into scanner buffer. + */ +- private void invokeListeners(int loadPos){ ++ public void invokeListeners(int loadPos){ + for(int i=0;i= \u00E0 la valeur minInclusive du type de base ''{1}''. + maxInclusive-valid-restriction.4 = maxInclusive-valid-restriction.4 : Erreur dans le type ''{2}''. La valeur maxInclusive ''{0}'' doit \u00EAtre > \u00E0 la valeur minExclusive du type de base ''{1}''. + maxLength-valid-restriction = maxLength-valid-restriction : Dans la d\u00E9finition de {2}, la valeur maxLength ''{0}'' doit \u00EAtre <= \u00E0 celle du type de base ''{1}''. +- mg-props-correct.2 = mg-props-correct.2 : D\u00E9finitions circulaires d\u00E9tect\u00E9es pour le groupe ''{0}''. Le suivi r\u00E9cursif des valeurs ''{''term''}'' des particules conduit \u00E0 une particule o\u00F9 ''{''term''}'' est le groupe proprement dit. ++ mg-props-correct.2 = mg-props-correct.2 : D\u00E9finitions circulaires d\u00E9tect\u00E9es pour le groupe ''{0}''. Le suivi r\u00E9cursif des valeurs '{'term'}' des particules conduit \u00E0 une particule o\u00F9 '{'term'}' est le groupe proprement dit. + minExclusive-less-than-equal-to-maxExclusive = minExclusive-less-than-equal-to-maxExclusive : Dans la d\u00E9finition de {2}, la valeur minExclusive ''{0}'' doit \u00EAtre <= \u00E0 la valeur maxExclusive ''{1}''. + minExclusive-less-than-maxInclusive = minExclusive-less-than-maxInclusive : Dans la d\u00E9finition de {2}, la valeur minExclusive ''{0}'' doit \u00EAtre < \u00E0 la valeur maxInclusive ''{1}''. + minExclusive-valid-restriction.1 = minExclusive-valid-restriction.1 : Erreur dans le type ''{2}''. La valeur minExclusive ''{0}'' doit \u00EAtre >= \u00E0 la valeur minExclusive du type de base ''{1}''. +@@ -249,20 +223,20 @@ + minLength-less-than-equal-to-maxLength = minLength-less-than-equal-to-maxLength: Dans la d\u00E9finition de {2}, la valeur de minLength ''{0}'' doit \u00EAtre < \u00E0 la valeur de maxLength ''{1}''. + minLength-valid-restriction = minLength-valid-restriction : Dans la d\u00E9finition de {2}, la valeur de minLength ''{0}'' doit \u00EAtre >= \u00E0 celle du type de base, ''{1}''. + no-xmlns = no-xmlns : La valeur {name} d'une d\u00E9claration d'attribut ne doit pas \u00EAtre identique \u00E0 'xmlns'. +- no-xsi = no-xsi : La valeur ''{''target namespace''}'' d''une d\u00E9claration d''attribut ne doit pas \u00EAtre identique \u00E0 ''{0}''. ++ no-xsi = no-xsi : La valeur '{'target namespace'}' d''une d\u00E9claration d''attribut ne doit pas \u00EAtre identique \u00E0 ''{0}''. + p-props-correct.2.1 = p-props-correct.2.1 : Dans la d\u00E9claration de ''{0}'', la valeur de ''minOccurs'' est ''{1}'', mais elle ne doit pas \u00EAtre sup\u00E9rieure \u00E0 la valeur de ''maxOccurs'', qui est ''{2}''. + rcase-MapAndSum.1 = rcase-MapAndSum.1 : Aucune mise en correspondance fonctionnelle compl\u00E8te entre les particules. + rcase-MapAndSum.2 = rcase-MapAndSum.2 : La plage d''occurrences du groupe, ({0},{1}), n''est pas une restriction valide de la plage d''occurrences du groupe de base, ({2},{3}). + rcase-NameAndTypeOK.1 = rcase-NameAndTypeOK.1 : Les \u00E9l\u00E9ments ont des noms (name) et des espaces de noms cible (target namespace) diff\u00E9rents : \u00E9l\u00E9ment "{0}" dans l''espace de noms "{1}" et \u00E9l\u00E9ment ''{2}'' dans l''espace de noms ''{3}''. +- rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2 : Erreur dans la particule o\u00F9 la valeur ''{''term''}'' est la d\u00E9claration d''\u00E9l\u00E9ment ''{0}''. La valeur ''{''nillable''}'' de la d\u00E9claration d''\u00E9l\u00E9ment est True, mais la particule correspondante dans le type de base comporte une d\u00E9claration d''\u00E9l\u00E9ment o\u00F9 la valeur ''{''nillable''}'' est False. +- rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3 : Erreur dans la particule o\u00F9 la valeur ''{''term''}'' est la d\u00E9claration d''\u00E9l\u00E9ment ''{0}''. Sa plage d''occurrences, ({1},{2}), n''est pas une restriction valide de la plage ({3},{4}) de la particule correspondante dans le type de base. ++ rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2 : Erreur dans la particule o\u00F9 la valeur '{'term'}' est la d\u00E9claration d''\u00E9l\u00E9ment ''{0}''. La valeur '{'nillable'}' de la d\u00E9claration d''\u00E9l\u00E9ment est True, mais la particule correspondante dans le type de base comporte une d\u00E9claration d''\u00E9l\u00E9ment o\u00F9 la valeur '{'nillable'}' est False. ++ rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3 : Erreur dans la particule o\u00F9 la valeur '{'term'}' est la d\u00E9claration d''\u00E9l\u00E9ment ''{0}''. Sa plage d''occurrences, ({1},{2}), n''est pas une restriction valide de la plage ({3},{4}) de la particule correspondante dans le type de base. + rcase-NameAndTypeOK.4.a = rcase-NameAndTypeOK.4.a : L''\u00E9l\u00E9ment ''{0}'' n''est pas fixe, mais l''\u00E9l\u00E9ment correspondant dans le type de base est fixe avec la valeur ''{1}''. + rcase-NameAndTypeOK.4.b = rcase-NameAndTypeOK.4.b : L''\u00E9l\u00E9ment ''{0}'' est fixe avec la valeur ''{1}'', mais l''\u00E9l\u00E9ment correspondant dans le type de base est fixe avec la valeur ''{2}''. + rcase-NameAndTypeOK.5 = rcase-NameAndTypeOK.5 : Les contraintes d''identit\u00E9 de l''\u00E9l\u00E9ment "{0}" ne sont pas un sous-ensemble de celles de la base. + rcase-NameAndTypeOK.6 = rcase-NameAndTypeOK.6 : Les substitutions non autoris\u00E9es pour l''\u00E9l\u00E9ment ''{0}'' ne sont pas un sur-ensemble de celles de la base. + rcase-NameAndTypeOK.7 = rcase-NameAndTypeOK.7 : Le type de l''\u00E9l\u00E9ment ''{0}'', ''{1}'', n''est pas d\u00E9riv\u00E9 du type de l''\u00E9l\u00E9ment de base, ''{2}''. + rcase-NSCompat.1 = rcase-NSCompat.1 : L''\u00E9l\u00E9ment ''{0}'' comporte un espace de noms ''{1}'' non autoris\u00E9 par le caract\u00E8re g\u00E9n\u00E9rique de la base. +- rcase-NSCompat.2 = rcase-NSCompat.2 : Erreur dans la particule o\u00F9 la valeur ''{''term''}'' est la d\u00E9claration d''\u00E9l\u00E9ment ''{0}''. Sa plage d''occurrences, ({1},{2}), n''est pas une restriction valide de la plage ({3},{4}) de la particule correspondante dans le type de base. ++ rcase-NSCompat.2 = rcase-NSCompat.2 : Erreur dans la particule o\u00F9 la valeur '{'term'}' est la d\u00E9claration d''\u00E9l\u00E9ment ''{0}''. Sa plage d''occurrences, ({1},{2}), n''est pas une restriction valide de la plage ({3},{4}) de la particule correspondante dans le type de base. + rcase-NSRecurseCheckCardinality.1 = rcase-NSRecurseCheckCardinality.1 : Aucune mise en correspondance fonctionnelle compl\u00E8te entre les particules. + rcase-NSRecurseCheckCardinality.2 = rcase-NSRecurseCheckCardinality.2 : La plage d''occurrences du groupe, ({0},{1}), n''est pas une restriction valide de la plage \u00E0 caract\u00E8re g\u00E9n\u00E9rique de la base, ({2},{3}). + rcase-NSSubset.1 = rcase-NSSubset.1 : Le caract\u00E8re g\u00E9n\u00E9rique n'est pas un sous-ensemble du caract\u00E8re g\u00E9n\u00E9rique correspondant dans la base. +@@ -278,7 +252,7 @@ + # src-redefine.1 = src-redefine.1: The component ''{0}'' is begin redefined, but its corresponding component isn't in the schema document being redefined (with namespace ''{2}''), but in a different document, with namespace ''{1}''. + sch-props-correct.2 = sch-props-correct.2 : Un sch\u00E9ma ne peut pas contenir deux composants globaux de m\u00EAme nom ; celui-ci contient deux occurrences de ''{0}''. + st-props-correct.2 = st-props-correct.2 : D\u00E9finitions circulaires d\u00E9tect\u00E9es pour le type simple ''{0}''. Cela signifie que ''{0}'' est contenu dans sa propre hi\u00E9rarchie des types, ce qui est une erreur. +- st-props-correct.3 = st-props-correct.3 : Erreur dans le type ''{0}''. La valeur ''{''final''}'' de ''{''base type definition''}'', ''{1}'', n''accepte pas la d\u00E9rivation par restriction. ++ st-props-correct.3 = st-props-correct.3 : Erreur dans le type ''{0}''. La valeur '{'final'}' de '{'base type definition'}', ''{1}'', n''accepte pas la d\u00E9rivation par restriction. + totalDigits-valid-restriction = totalDigits-valid-restriction : Dans la d\u00E9finition de {2}, la valeur ''{0}'' pour le facet ''totalDigits'' n''est pas valide car elle doit \u00EAtre <= \u00E0 la valeur de ''totalDigits'', qui a \u00E9t\u00E9 d\u00E9finie sur ''{1}'' dans l''un des types d''anc\u00EAtre. + whiteSpace-valid-restriction.1 = whiteSpace-valid-restriction.1 : Dans la d\u00E9finition de {0}, la valeur ''{1}'' du facet ''whitespace'' n''est pas valide car elle a \u00E9t\u00E9 d\u00E9finie sur ''collapse'' dans l''un des types d''anc\u00EAtre. + whiteSpace-valid-restriction.2 = whiteSpace-valid-restriction.2 : Dans la d\u00E9finition de {0}, la valeur ''preserve'' du facet ''whitespace'' n''est pas valide car la valeur de ''whitespace'' a \u00E9t\u00E9 d\u00E9finie sur ''replace'' dans l''un des types d''anc\u00EAtre. +@@ -306,7 +280,7 @@ + c-selector-xpath = c-selector-xpath : La valeur de s\u00E9lecteur ''{0}'' n''est pas valide ; les XPath de s\u00E9lecteur ne peuvent pas contenir d''attributs. + EmptyTargetNamespace = EmptyTargetNamespace : Dans le document de sch\u00E9ma ''{0}'', la valeur de l''attribut ''targetNamespace'' ne peut pas \u00EAtre une cha\u00EEne vide. + FacetValueFromBase = FacetValueFromBase : Dans la d\u00E9claration de type ''{0}'', la valeur ''{1}'' du facet ''{2}'' doit \u00EAtre issue de l''espace de valeurs du type de base, ''{3}''. +- FixedFacetValue = FixedFacetValue : Dans la d\u00E9finition de {3}, la valeur ''{1}'' du facet ''{0}'' n''est pas valide, car la valeur de ''{0}'' a \u00E9t\u00E9 d\u00E9finie sur ''{2}'' dans l''un des types d''anc\u00EAtre, et ''{''fixed''}'' = true. ++ FixedFacetValue = FixedFacetValue : Dans la d\u00E9finition de {3}, la valeur ''{1}'' du facet ''{0}'' n''est pas valide, car la valeur de ''{0}'' a \u00E9t\u00E9 d\u00E9finie sur ''{2}'' dans l''un des types d''anc\u00EAtre, et '{'fixed'}' = true. + InvalidRegex = InvalidRegex : La valeur de mod\u00E8le ''{0}'' n''est pas une expression r\u00E9guli\u00E8re valide. L''erreur signal\u00E9e est ''{1}'', au niveau de la colonne ''{2}''. + maxOccurLimit = La configuration en cours de l''analyseur ne permet pas de d\u00E9finir une valeur d''attribut maxOccurs sur une valeur sup\u00E9rieure \u00E0 {0}. + PublicSystemOnNotation = PublicSystemOnNotation : Au moins une des valeurs ''public'' et ''system'' doit figurer dans l'\u00E9l\u00E9ment ''notation''. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_it.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_it.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,32 +1,6 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file contains error and warning messages related to XML Schema + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XMLSchemaMessages_it.properties /st_wptg_1.8.0.0.0jdk/4 2013/11/06 08:14:00 gmolloy Exp $ + + BadMessageKey = Impossibile trovare il messaggio di errore corrispondente alla chiave di messaggio. + FormatFailed = Si \u00E8 verificato un errore interno durante la formattazione del seguente messaggio:\n +@@ -60,7 +34,7 @@ + #validation (3.X.4) + + cvc-attribute.3 = cvc-attribute.3: il valore ''{2}'' dell''attributo ''{1}'' sull''elemento ''{0}'' non \u00E8 valido rispetto al suo tipo ''{3}''. +- cvc-attribute.4 = cvc-attribute.4: il valore ''{2}'' dell''attributo ''{1}'' sull''elemento ''{0}'' non \u00E8 valido rispetto al suo ''{''value constraint''}'' fisso. L''attributo deve avere un valore pari a ''{3}''. ++ cvc-attribute.4 = cvc-attribute.4: il valore ''{2}'' dell''attributo ''{1}'' sull''elemento ''{0}'' non \u00E8 valido rispetto al suo '{'value constraint'}' fisso. L''attributo deve avere un valore pari a ''{3}''. + cvc-complex-type.2.1 = cvc-complex-type.2.1: l''elemento "{0}" non deve avere [children] di voci di informazioni di carattere o elemento perch\u00E9 il tipo di contenuto \u00E8 vuoto. + cvc-complex-type.2.2 = cvc-complex-type.2.2: l''elemento "{0}" non deve avere [children] di tipo elemento e il valore deve essere valido. + cvc-complex-type.2.3 = cvc-complex-type.2.3: l''elemento "{0}" non deve avere [children] di tipo carattere perch\u00E9 il tipo di contenuto \u00E8 di soli elementi. +@@ -74,22 +48,22 @@ + cvc-complex-type.3.2.2 = cvc-complex-type.3.2.2: l''attributo "{1}" non \u00E8 consentito nell''elemento "{0}". + cvc-complex-type.4 = cvc-complex-type.4: l''attributo ''{1}'' deve apparire sull''elemento "{0}". + cvc-complex-type.5.1 = cvc-complex-type.5.1: nell''elemento "{0}", l''attributo "{1}" \u00E8 un ID Wild ma esiste gi\u00E0 un ID Wild "{2}". Pu\u00F2 esisterne solo uno. +- cvc-complex-type.5.2 = cvc-complex-type.5.2: nell''elemento "{0}", l''attributo "{1}" \u00E8 un ID Wild ma esiste gi\u00E0 un attributo "{2}" derivato dall''ID tra ''{''attribute uses''}''. ++ cvc-complex-type.5.2 = cvc-complex-type.5.2: nell''elemento "{0}", l''attributo "{1}" \u00E8 un ID Wild ma esiste gi\u00E0 un attributo "{2}" derivato dall''ID tra '{'attribute uses'}'. + cvc-datatype-valid.1.2.1 = cvc-datatype-valid.1.2.1: "{0}" non \u00E8 un valore valido per "{1}". + cvc-datatype-valid.1.2.2 = cvc-datatype-valid.1.2.2: "{0}" non \u00E8 un valore valido per il tipo di lista "{1}". + cvc-datatype-valid.1.2.3 = cvc-datatype-valid.1.2.3: "{0}" non \u00E8 un valore valido per il tipo di unione "{1}". + cvc-elt.1 = cvc-elt.1: impossibile trovare la dichiarazione dell''elemento "{0}". +- cvc-elt.2 = cvc-elt.2: il valore di ''{''abstract''}'' nella dichiarazione di elemento per "{0}" deve essere false. +- cvc-elt.3.1 = cvc-elt.3.1: l''attributo "{1}" non deve apparire sull''elemento "{0}" perch\u00E9 la propriet\u00E0 ''{''nillable''}'' di "{0}" \u00E8 false. ++ cvc-elt.2 = cvc-elt.2: il valore di '{'abstract'}' nella dichiarazione di elemento per "{0}" deve essere false. ++ cvc-elt.3.1 = cvc-elt.3.1: l''attributo "{1}" non deve apparire sull''elemento "{0}" perch\u00E9 la propriet\u00E0 '{'nillable'}' di "{0}" \u00E8 false. + cvc-elt.3.2.1 = cvc-elt.3.2.1: l''elemento "{0}" non deve avere [children] di informazioni di tipo carattere o elemento perch\u00E9 \u00E8 specificato "{1}". +- cvc-elt.3.2.2 = cvc-elt.3.2.2: non deve esistere alcun ''{''value constraint''}'' fisso per l''elemento "{0}" perch\u00E9 \u00E8 specificato "{1}". ++ cvc-elt.3.2.2 = cvc-elt.3.2.2: non deve esistere alcun '{'value constraint'}' fisso per l''elemento "{0}" perch\u00E9 \u00E8 specificato "{1}". + cvc-elt.4.1 = cvc-elt.4.1: il valore "{2}" dell''attributo "{1}" per l''elemento "{0}" non \u00E8 un QName valido. + cvc-elt.4.2 = cvc-elt.4.2: impossibile risolvere "{1}" in una definizione tipo per l''elemento "{0}". + cvc-elt.4.3 = cvc-elt.4.3: tipo "{1}" non derivato in modo valido dalla definizione tipo ''{2}'' dell''elemento "{0}". +- cvc-elt.5.1.1 = cvc-elt.5.1.1: ''{''value constraint''}'' "{2}" dell''elemento "{0}" non \u00E8 un valore predefinito valido per il tipo "{1}". ++ cvc-elt.5.1.1 = cvc-elt.5.1.1: '{'value constraint'}' "{2}" dell''elemento "{0}" non \u00E8 un valore predefinito valido per il tipo "{1}". + cvc-elt.5.2.2.1 = cvc-elt.5.2.2.1: l''elemento "{0}" non deve avere [children] di voci di informazioni di elemento. +- cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: il valore "{1}" dell''elemento "{0}" non corrisponde al valore fisso di ''{''value constraint''}'' "{2}". +- cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: il valore "{1}" dell''elemento "{0}" non corrisponde al valore di ''{''value constraint''}'' "{2}". ++ cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: il valore "{1}" dell''elemento "{0}" non corrisponde al valore fisso di '{'value constraint'}' "{2}". ++ cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: il valore "{1}" dell''elemento "{0}" non corrisponde al valore di '{'value constraint'}' "{2}". + cvc-enumeration-valid = cvc-enumeration-valid: il valore "{0}" non \u00E8 valido come facet rispetto all''enumerazione "{1}". Deve essere un valore dell''enumerazione. + cvc-fractionDigits-valid = cvc-fractionDigits-valid: il valore ''{0}'' ha {1} cifre di frazione, ma il numero di cifre di frazione \u00E8 stato limitato a {2}. + cvc-id.1 = cvc-id.1: non esiste alcuna associazione ID/IDREF per l''IDREF "{0}". +@@ -168,10 +142,10 @@ + ag-props-correct.2 = ag-props-correct.2: errore per il gruppo di attributi "{0}". Sono specificati usi di attributi duplicati con lo stesso nome e spazio di nomi di destinazione. Il nome dell''uso dell''attributo duplicato \u00E8 "{1}". + ag-props-correct.3 = ag-props-correct.3: errore per il gruppo di attributi "{0}". Due dichiarazioni di attributo, "{1}" e "{2}" hanno tipi derivati dall''ID. + a-props-correct.2 = a-props-correct.2: valore di vincolo di valore "{1}" non valido nell''attributo "{0}". +- a-props-correct.3 = a-props-correct.3: l''attributo ''{0}'' non pu\u00F2 utilizzare il valore ''fixed'' o ''default'' poich\u00E9 la ''{''type definition''}'' dell''attributo \u00E8 un ID o \u00E8 derivata dall''ID. +- au-props-correct.2 = au-props-correct.2: nella dichiarazione di attributo di ''{0}'' \u00E8 stato specificato un valore fisso ''{1}''. Se, pertanto, l''uso dell''attributo che fa riferimento a ''{0}'' ha anche un valore ''{''value constraint''}'', deve essere fisso e il suo valore deve essere ''{1}''. ++ a-props-correct.3 = a-props-correct.3: l''attributo ''{0}'' non pu\u00F2 utilizzare il valore ''fixed'' o ''default'' poich\u00E9 la '{'type definition'}' dell''attributo \u00E8 un ID o \u00E8 derivata dall''ID. ++ au-props-correct.2 = au-props-correct.2: nella dichiarazione di attributo di ''{0}'' \u00E8 stato specificato un valore fisso ''{1}''. Se, pertanto, l''uso dell''attributo che fa riferimento a ''{0}'' ha anche un valore '{'value constraint'}', deve essere fisso e il suo valore deve essere ''{1}''. + cos-all-limited.1.2 = cos-all-limited.1.2: deve apparire un gruppo di modelli 'all' in una parte con '{'min occurs'}' = '{'max occurs'}' = 1 e la parte deve far parte di una coppia che costituisca il '{'content type'}' di una definizione di tipo complesso. +- cos-all-limited.2 = cos-all-limited.2: il valore ''{''max occurs''}'' di un elemento in un gruppo di modelli ''all'' deve essere 0 o 1. Il valore ''{0}'' per l''elemento ''{1}'' non \u00E8 valido. ++ cos-all-limited.2 = cos-all-limited.2: il valore '{'max occurs'}' di un elemento in un gruppo di modelli ''all'' deve essere 0 o 1. Il valore ''{0}'' per l''elemento ''{1}'' non \u00E8 valido. + cos-applicable-facets = cos-applicable-facets: facet ''{0}'' non consentito dal tipo {1}. + cos-ct-extends.1.1 = cos-ct-extends.1.1: il tipo ''{0}'' \u00E8 stato derivato mediante estensione dal tipo ''{1}'', ma l''attributo "final" di ''{1}'' impedisce la derivazione mediante estensione. + cos-ct-extends.1.4.3.2.2.1.a = cos-ct-extends.1.4.3.2.2.1.a: Il tipo di contenuto di un tipo derivato e quello della rispettiva base devono essere entrambi misti o di soli elementi. Il tipo ''{0}'' \u00E8 di soli elementi, mentre la rispettiva base non lo \u00E8. +@@ -182,17 +156,17 @@ + cos-particle-restrict.a = cos-particle-restrict.a: la parte derivata \u00E8 vuota, mente la base non \u00E8 svuotabile. + cos-particle-restrict.b = cos-particle-restrict.b: la parte della base \u00E8 vuota, mente la parte derivata non lo \u00E8. + cos-particle-restrict.2 = cos-particle-restrict.2: limitazione di parte vietata: ''{0}''. +- cos-st-restricts.1.1 = cos-st-restricts.1.1: il tipo ''{1}'' \u00E8 indivisibile, quindi la ''{''base type definition''}'' "{0}" deve essere una definizione di tipo semplice indivisibile o un tipo di dati predefinito incorporato. ++ cos-st-restricts.1.1 = cos-st-restricts.1.1: il tipo ''{1}'' \u00E8 indivisibile, quindi la '{'base type definition'}' "{0}" deve essere una definizione di tipo semplice indivisibile o un tipo di dati predefinito incorporato. + cos-st-restricts.2.1 = cos-st-restricts.2.1: nella definizione del tipo di lista ''{0}'', il tipo ''{1}'' non \u00E8 valido poich\u00E9 \u00E8 un tipo di lista o un tipo di unione che contiene una lista. +- cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: il componente ''{''final''}'' di ''{''item type definition''}'' ''{0}'' contiene ''list'', pertanto ''{0}'' non pu\u00F2 essere utilizzato come tipo di elemento per il tipo di lista ''{1}''. +- cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: il componente ''{''final''}'' di ''{''member type definitions''}'' ''{0}'' contiene ''union'', pertanto ''{0}'' non pu\u00F2 essere utilizzato come tipo di membro per il tipo di unione ''{1}''. ++ cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: il componente '{'final'}' di '{'item type definition'}' ''{0}'' contiene ''list'', pertanto ''{0}'' non pu\u00F2 essere utilizzato come tipo di elemento per il tipo di lista ''{1}''. ++ cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: il componente '{'final'}' di '{'member type definitions'}' ''{0}'' contiene ''union'', pertanto ''{0}'' non pu\u00F2 essere utilizzato come tipo di membro per il tipo di unione ''{1}''. + cos-valid-default.2.1 = cos-valid-default.2.1: l''elemento "{0}" ha un vincolo di valore e deve avere un modello di contenuto misto o semplice. +- cos-valid-default.2.2.2 = cos-valid-default.2.2.2: l''elemento ''{0}'' ha un ''{''value constraint''}'' e la rispettiva definizione del tipo contiene ''{''content type''}'' misto, quindi la parte di ''{''content type''}'' deve essere svuotabile. ++ cos-valid-default.2.2.2 = cos-valid-default.2.2.2: l''elemento ''{0}'' ha un '{'value constraint'}' e la rispettiva definizione del tipo contiene '{'content type'}' misto, quindi la parte di '{'content type'}' deve essere svuotabile. + c-props-correct.2 = c-props-correct.2: la cardinalit\u00E0 dei campi per il keyref "{0}" e per la chiave "{1}" deve corrispondere. + ct-props-correct.3 = ct-props-correct.3: sono state rilevate definizioni circolari per il tipo complesso ''{0}''. Ci\u00F2 significa che ''{0}'' si trova all''interno della sua stessa gerarchia di tipi, il che \u00E8 errato. + ct-props-correct.4 = ct-props-correct.4: errore per il tipo "{0}". Sono specificati usi di attributi duplicati con lo stesso nome e spazio di nomi di destinazione. Il nome dell''uso dell''attributo duplicato \u00E8 "{1}". + ct-props-correct.5 = ct-props-correct.5: errore per il tipo "{0}". Due dichiarazioni di attributo, "{1}" e "{2}" hanno tipi derivati dall''ID. +- derivation-ok-restriction.1 = derivation-ok-restriction.1: il tipo ''{0}'' \u00E8 stato derivato mediante limitazione dal tipo ''{1}'', ma ''{1}'' ha una propriet\u00E0 ''{''final''}'' che impedisce la derivazione mediante limitazione. ++ derivation-ok-restriction.1 = derivation-ok-restriction.1: il tipo ''{0}'' \u00E8 stato derivato mediante limitazione dal tipo ''{1}'', ma ''{1}'' ha una propriet\u00E0 '{'final'}' che impedisce la derivazione mediante limitazione. + derivation-ok-restriction.2.1.1 = derivation-ok-restriction.2.1.1: errore per il tipo "{0}". Un uso dell''attributo ''{1}'' in questo tipo ha un valore "use" ''{2}'' che \u00E8 incoerente con il valore di ''required'' in un uso corrispondente dell''attributo nel tipo di base. + derivation-ok-restriction.2.1.2 = derivation-ok-restriction.2.12: errore per il tipo "{0}". Un uso dell''attributo ''{1}'' in questo tipo ha un valore tipo ''{2}'' che \u00E8 stato derivato in modo valido da ''{3}'', ovvero dal tipo di uso corrispondente dell''attributo nel tipo di base. + derivation-ok-restriction.2.1.3.a = derivation-ok-restriction.2.1.3.a: errore per il tipo "{0}". L''uso dell''attributo ''{1}'' in questo tipo ha un vincolo di valore effettivo che \u00E8 fisso, mentre il vincolo di valore effettivo dell''uso dell''attributo corrispondente nel tipo di base \u00E8 fisso. +@@ -210,8 +184,8 @@ + enumeration-required-notation = enumeration-required-notation: il tipo NOTATION ''{0}'' utilizzato da {2} ''{1}'' deve avere un valore di facet di enumerazione che specifica gli elementi di notazione utilizzati da questo tipo. + enumeration-valid-restriction = enumeration-valid-restriction: il valore di enumerazione "{0}" non \u00E8 nello spazio dei valori del tipo di base {1}. + e-props-correct.2 = e-props-correct.2: valore di vincolo di valore "{1}" non valido nell''elemento "{0}". +- e-props-correct.4 = e-props-correct.4: ''{''type definition''}'' dell''elemento "{0}" non \u00E8 stata derivata in modo valido da ''{''type definition''}'' di substitutionHead "{1}" o la propriet\u00E0 ''{''substitution group exclusions''}'' di ''{1}'' non consente questa derivazione. +- e-props-correct.5 = e-props-correct.5: non deve esistere ''{''value constraint''}'' sull''elemento "{0}" perch\u00E9 ''{''type definition''}'' dell''elemento o ''{''content type''}'' di ''{''type definition''}'' \u00E8 un ID o \u00E8 derivato da un ID. ++ e-props-correct.4 = e-props-correct.4: '{'type definition'}' dell''elemento "{0}" non \u00E8 stata derivata in modo valido da '{'type definition'}' di substitutionHead "{1}" o la propriet\u00E0 '{'substitution group exclusions'}' di ''{1}'' non consente questa derivazione. ++ e-props-correct.5 = e-props-correct.5: non deve esistere '{'value constraint'}' sull''elemento "{0}" perch\u00E9 '{'type definition'}' dell''elemento o '{'content type'}' di '{'type definition'}' \u00E8 un ID o \u00E8 derivato da un ID. + e-props-correct.6 = e-props-correct.6: gruppo di sostituzione circolare rilevato per l''elemento "{0}". + fractionDigits-valid-restriction = fractionDigits-valid-restriction: nella definizione di {2}, il valore ''{0}'' per il facet ''fractionDigits'' non \u00E8 valido. Deve essere <= rispetto al valore per ''fractionDigits'', impostato su ''{1}'' in uno dei tipi di predecessore. + fractionDigits-totalDigits = fractionDigits-totalDigits: nella definizione di {2}, il valore ''{0}'' per il facet ''fractionDigits'' non \u00E8 valido. Il valore deve essere <= rispetto al valore per ''totalDigits'', impostato su ''{1}''. +@@ -232,7 +206,7 @@ + maxInclusive-valid-restriction.3 = maxInclusive-valid-restriction.3: errore per il tipo ''{2}''. Il valore maxInclusive ="{0}" deve essere >= minInclusive del tipo di base "{1}". + maxInclusive-valid-restriction.4 = maxInclusive-valid-restriction.4: errore per il tipo ''{2}''. Il valore maxInclusive ="{0}" deve essere > minExclusive del tipo di base "{1}". + maxLength-valid-restriction = maxLength-valid-restriction: nella definizione di {2}, il valore maxLength = "{0}" deve essere <= rispetto a quello del tipo di base "{1}". +- mg-props-correct.2 = mg-props-correct.2: definizioni circolari rilevate per il gruppo ''{0}''. Se si seguono in maniera ricorsiva i valori ''{''term''}'' delle parti, se ne avr\u00E0 una il cui ''{''term''}'' \u00E8 il gruppo stesso. ++ mg-props-correct.2 = mg-props-correct.2: definizioni circolari rilevate per il gruppo ''{0}''. Se si seguono in maniera ricorsiva i valori '{'term'}' delle parti, se ne avr\u00E0 una il cui '{'term'}' \u00E8 il gruppo stesso. + minExclusive-less-than-equal-to-maxExclusive = minExclusive-less-than-equal-to-maxExclusive: nella definizione di {2}, il valore minExclusive = ''{0}'' deve essere <= rispetto al valore maxExclusive = ''{1}''. + minExclusive-less-than-maxInclusive = minExclusive-less-than-maxInclusive: nella definizione di {2}, il valore minExclusive = ''{0}'' deve essere <= rispetto al valore maxInclusive = ''{1}''. + minExclusive-valid-restriction.1 = minExclusive-valid-restriction.1: errore per il tipo ''{2}''. Il valore minExclusive ="{0}" deve essere >= minExclusive del tipo di base "{1}". +@@ -249,20 +223,20 @@ + minLength-less-than-equal-to-maxLength = minLength-less-than-equal-to-maxLength: nella definizione di {2}, il valore minLength = ''{0}'' deve essere < rispetto al valore maxLength = ''{1}''. + minLength-valid-restriction = minLength-valid-restriction: nella definizione di {2}, minLength = ''{0}'' deve essere >= rispetto a quello del tipo di base ''{1}''. + no-xmlns = no-xmlns: il {'name'} di una dichiarazione di attributo non deve corrispondere a 'xmlns'. +- no-xsi = no-xsi: il ''{''target namespace''}'' di una dichiarazione di attributo non deve corrispondere a "{0}". ++ no-xsi = no-xsi: il '{'target namespace'}' di una dichiarazione di attributo non deve corrispondere a "{0}". + p-props-correct.2.1 = p-props-correct.2.1: nella dichiarazione di ''{0}'', il valore di ''minOccurs'' \u00E8 ''{1}'', ma non deve essere maggiore del valore di ''maxOccurs'', che \u00E8 ''{2}''. + rcase-MapAndSum.1 = rcase-MapAndSum.1: non esiste un mapping funzionale completo tra le parti. + rcase-MapAndSum.2 = rcase-MapAndSum.2: l''intervallo di ricorrenza ({0},{1}) del gruppo non \u00E8 una limitazione valida dell''intervallo di ricorrenza ({2},{3}) del gruppo di base. + rcase-NameAndTypeOK.1 = rcase-NameAndTypeOK.1: alcuni elementi hanno nomi e spazi di nomi di destinazione che non sono uguali: l''elemento "{0}" nello spazio di nomi "{1}" e l''elemento "{2}" nello spazio di nomi "{3}". +- rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: errore per la parte il cui ''{''term''}'' \u00E8 la dichiarazione di elemento ''{0}''. Il valore ''{''nillable''}'' della dichiarazione di elemento \u00E8 impostato su true, ma la parte corrispondente nel tipo di base contiene una dichiarazione di elemento per la quale ''{''nillable''}'' \u00E8 impostato su false. +- rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: errore per la parte il cui ''{''term''}'' \u00E8 la dichiarazione di elemento ''{0}''. L''intervallo di ricorrenza ({1},{2}) non \u00E8 una limitazione valida dell''intervallo ({3},{4}) della parte corrispondente nel tipo di base. ++ rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: errore per la parte il cui '{'term'}' \u00E8 la dichiarazione di elemento ''{0}''. Il valore '{'nillable'}' della dichiarazione di elemento \u00E8 impostato su true, ma la parte corrispondente nel tipo di base contiene una dichiarazione di elemento per la quale '{'nillable'}' \u00E8 impostato su false. ++ rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: errore per la parte il cui '{'term'}' \u00E8 la dichiarazione di elemento ''{0}''. L''intervallo di ricorrenza ({1},{2}) non \u00E8 una limitazione valida dell''intervallo ({3},{4}) della parte corrispondente nel tipo di base. + rcase-NameAndTypeOK.4.a = rcase-NameAndTypeOK.4.a: l''elemento "{0}" non \u00E8 fisso, ma l''elemento corrispondente nel tipo di base \u00E8 fisso con il valore ''{1}''. + rcase-NameAndTypeOK.4.b = rcase-NameAndTypeOK.4.b: l''elemento "{0}" \u00E8 fisso con il valore ''{1}'', ma l''elemento corrispondente nel tipo di base \u00E8 fisso con il valore ''{2}''. + rcase-NameAndTypeOK.5 = rcase-NameAndTypeOK.5: i vincoli di identit\u00E0 per l''elemento "{0}" non sono un subset di quelli nella base. + rcase-NameAndTypeOK.6 = rcase-NameAndTypeOK.6: le sostituzioni non consentite per l''elemento "{0}" non sono un superset di quelle nella base. + rcase-NameAndTypeOK.7 = rcase-NameAndTypeOK.7: il tipo "{1}" dell''elemento "{0}" non deriva dal tipo dell''elemento di base "{2}". + rcase-NSCompat.1 = rcase-NSCompat.1: l''elemento "{0}" ha uno spazio di nomi "{1}" che non \u00E8 consentito dal carattere jolly nella base. +- rcase-NSCompat.2 = rcase-NSCompat.2: errore per la parte il cui ''{''term''}'' \u00E8 la dichiarazione di elemento ''{0}''. L''intervallo di ricorrenza ({1},{2}) non \u00E8 una limitazione valida dell''intervallo ({3},{4}) della parte corrispondente nel tipo di base. ++ rcase-NSCompat.2 = rcase-NSCompat.2: errore per la parte il cui '{'term'}' \u00E8 la dichiarazione di elemento ''{0}''. L''intervallo di ricorrenza ({1},{2}) non \u00E8 una limitazione valida dell''intervallo ({3},{4}) della parte corrispondente nel tipo di base. + rcase-NSRecurseCheckCardinality.1 = rcase-NSRecurseCheckCardinality.1: non esiste un mapping funzionale completo tra le parti. + rcase-NSRecurseCheckCardinality.2 = rcase-NSRecurseCheckCardinality.2: l''intervallo di ricorrenza ({0},{1}) del gruppo non \u00E8 una limitazione valida dell''intervallo ({2},{3}) del carattere jolly di base. + rcase-NSSubset.1 = rcase-NSSubset.1: il carattere jolly non \u00E8 un subset del carattere jolly corrispondente nella base. +@@ -278,7 +252,7 @@ + # src-redefine.1 = src-redefine.1: The component ''{0}'' is begin redefined, but its corresponding component isn't in the schema document being redefined (with namespace ''{2}''), but in a different document, with namespace ''{1}''. + sch-props-correct.2 = sch-props-correct.2: uno schema non pu\u00F2 contenere due componenti globali con lo stesso nome; questo contiene due ricorrenze di "{0}". + st-props-correct.2 = st-props-correct.2: sono state rilevate definizioni circolari per il tipo semplice ''{0}''. Ci\u00F2 significa che ''{0}'' si trova all''interno della sua stessa gerarchia di tipi, il che \u00E8 errato. +- st-props-correct.3 = st-props-correct.3: errore per il tipo ''{0}''. Il valore di ''{''final''}'' per ''{''base type definition''}'', ''{1}'', impedisce la derivazione mediante limitazione. ++ st-props-correct.3 = st-props-correct.3: errore per il tipo ''{0}''. Il valore di '{'final'}' per '{'base type definition'}', ''{1}'', impedisce la derivazione mediante limitazione. + totalDigits-valid-restriction = totalDigits-valid-restriction: nella definizione di {2}, il valore ''{0}'' per il facet ''totalDigits'' non \u00E8 valido. Deve essere <= rispetto al valore per ''totalDigits'', impostato su ''{1}'' in uno dei tipi di predecessore. + whiteSpace-valid-restriction.1 = whiteSpace-valid-restriction.1: nella definizione di {0}, il valore ''{1}'' per il facet ''whitespace'' non \u00E8 valido. Il valore per ''whitespace'' \u00E8 stato impostato su ''collapse'' in uno dei tipi di predecessore. + whiteSpace-valid-restriction.2 = whiteSpace-valid-restriction.2: nella definizione di {0}, il valore ''preserve'' per il facet ''whitespace'' non \u00E8 valido. Il valore per ''whitespace'' \u00E8 stato impostato su ''replace'' in uno dei tipi di predecessore. +@@ -306,7 +280,7 @@ + c-selector-xpath = c-selector-xpath: il valore del selettore = "{0}" non \u00E8 valido; gli XPath del selettore non possono contenere attributi. + EmptyTargetNamespace = EmptyTargetNamespace: nel documento di schema ''{0}'' il valore dell''attributo ''targetNamespace'' non pu\u00F2 essere una stringa vuota. + FacetValueFromBase = FacetValueFromBase: nella dichiarazione del tipo ''{0}'' il valore ''{1}'' del facet ''{2}'' deve provenire dallo spazio di valori del tipo di base ''{3}''. +- FixedFacetValue = FixedFacetValue: nella definizione di {3}, il valore ''{1}'' per il facet ''{0}'' non \u00E8 valido. Il valore per ''{0}'' \u00E8 stato impostato su ''{2}'' in uno dei tipi di predecessore e ''{''fixed''}'' = true. ++ FixedFacetValue = FixedFacetValue: nella definizione di {3}, il valore ''{1}'' per il facet ''{0}'' non \u00E8 valido. Il valore per ''{0}'' \u00E8 stato impostato su ''{2}'' in uno dei tipi di predecessore e '{'fixed'}' = true. + InvalidRegex = InvalidRegex: il valore di pattern "{0}" non \u00E8 un''espressione regolare valida. Errore segnalato ''{1}'' nella colonna ''{2}''. + maxOccurLimit = La configurazione corrente del parser non consente che un valore di attributo maxOccurs sia impostato su un valore maggiore del valore {0}. + PublicSystemOnNotation = PublicSystemOnNotation: almeno uno tra ''public'' e ''system'' deve essere presente nell'elemento ''notation''. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_ja.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_ja.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,32 +1,6 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file contains error and warning messages related to XML Schema + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XMLSchemaMessages_ja.properties /st_wptg_1.8.0.0.0jdk/3 2013/09/12 17:39:58 gmolloy Exp $ + + BadMessageKey = \u30E1\u30C3\u30BB\u30FC\u30B8\u30FB\u30AD\u30FC\u306B\u5BFE\u5FDC\u3059\u308B\u30A8\u30E9\u30FC\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002 + FormatFailed = \u6B21\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u66F8\u5F0F\u8A2D\u5B9A\u4E2D\u306B\u5185\u90E8\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F:\n +@@ -60,7 +34,7 @@ + #validation (3.X.4) + + cvc-attribute.3 = cvc-attribute.3: \u8981\u7D20''{0}''\u306E\u5C5E\u6027''{1}''\u306E\u5024''{2}''\u306F\u3001\u305D\u306E\u30BF\u30A4\u30D7''{3}''\u306B\u5BFE\u3057\u3066\u7121\u52B9\u3067\u3059\u3002 +- cvc-attribute.4 = cvc-attribute.4: \u8981\u7D20''{0}''\u306E\u5C5E\u6027''{1}''\u306E\u5024''{2}''\u306F\u3001\u56FA\u5B9A\u306E''{''value constraint''}''\u306B\u5BFE\u3057\u3066\u7121\u52B9\u3067\u3059\u3002\u5C5E\u6027\u306E\u5024\u306F''{3}''\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 ++ cvc-attribute.4 = cvc-attribute.4: \u8981\u7D20''{0}''\u306E\u5C5E\u6027''{1}''\u306E\u5024''{2}''\u306F\u3001\u56FA\u5B9A\u306E'{'value constraint'}'\u306B\u5BFE\u3057\u3066\u7121\u52B9\u3067\u3059\u3002\u5C5E\u6027\u306E\u5024\u306F''{3}''\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + cvc-complex-type.2.1 = cvc-complex-type.2.1: \u30BF\u30A4\u30D7\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u30FB\u30BF\u30A4\u30D7\u304C\u7A7A\u767D\u3067\u3042\u308B\u305F\u3081\u3001\u8981\u7D20''{0}''\u306B\u306F\u6587\u5B57\u3084\u8981\u7D20\u60C5\u5831\u30A2\u30A4\u30C6\u30E0[children]\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 + cvc-complex-type.2.2 = cvc-complex-type.2.2: \u8981\u7D20''{0}''\u306F\u8981\u7D20[children]\u3092\u542B\u307E\u305A\u3001\u6709\u52B9\u306A\u5024\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + cvc-complex-type.2.3 = cvc-complex-type.2.3: \u30BF\u30A4\u30D7\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u30FB\u30BF\u30A4\u30D7\u304C\u8981\u7D20\u306E\u307F\u3067\u3042\u308B\u305F\u3081\u3001\u8981\u7D20''{0}''\u306B\u306F\u6587\u5B57[children]\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 +@@ -74,22 +48,22 @@ + cvc-complex-type.3.2.2 = cvc-complex-type.3.2.2: \u8981\u7D20''{0}''\u306B\u5C5E\u6027''{1}''\u3092\u542B\u3081\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 + cvc-complex-type.4 = cvc-complex-type.4: \u8981\u7D20''{0}''\u306B\u5C5E\u6027''{1}''\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + cvc-complex-type.5.1 = cvc-complex-type.5.1: \u8981\u7D20''{0}''\u3067\u306F\u5C5E\u6027''{1}''\u304CWild ID\u3067\u3059\u304C\u3001\u3059\u3067\u306BWild ID ''{2}''\u304C\u5B58\u5728\u3057\u3066\u3044\u307E\u3059\u3002\u8A31\u53EF\u3055\u308C\u308BWild ID\u306F1\u3064\u306E\u307F\u3067\u3059\u3002 +- cvc-complex-type.5.2 = cvc-complex-type.5.2: \u8981\u7D20''{0}''\u3067\u306F\u5C5E\u6027''{1}''\u304CWild ID\u3067\u3059\u304C\u3001ID\u304B\u3089\u5C0E\u51FA\u3055\u308C\u305F\u5C5E\u6027''{2}''\u304C''{''attribute uses''}''\u306B\u3059\u3067\u306B\u5B58\u5728\u3057\u3066\u3044\u307E\u3059\u3002 ++ cvc-complex-type.5.2 = cvc-complex-type.5.2: \u8981\u7D20''{0}''\u3067\u306F\u5C5E\u6027''{1}''\u304CWild ID\u3067\u3059\u304C\u3001ID\u304B\u3089\u5C0E\u51FA\u3055\u308C\u305F\u5C5E\u6027''{2}''\u304C'{'attribute uses'}'\u306B\u3059\u3067\u306B\u5B58\u5728\u3057\u3066\u3044\u307E\u3059\u3002 + cvc-datatype-valid.1.2.1 = cvc-datatype-valid.1.2.1: ''{0}''\u306F''{1}''\u306E\u6709\u52B9\u306A\u5024\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + cvc-datatype-valid.1.2.2 = cvc-datatype-valid.1.2.2: ''{0}''\u306F\u30EA\u30B9\u30C8\u30FB\u30BF\u30A4\u30D7''{1}''\u306E\u6709\u52B9\u306A\u5024\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + cvc-datatype-valid.1.2.3 = cvc-datatype-valid.1.2.3: ''{0}''\u306F\u5171\u7528\u4F53\u30BF\u30A4\u30D7''{1}''\u306E\u6709\u52B9\u306A\u5024\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + cvc-elt.1 = cvc-elt.1: \u8981\u7D20''{0}''\u306E\u5BA3\u8A00\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002 +- cvc-elt.2 = cvc-elt.2: ''{0}''\u306B\u5BFE\u3059\u308B\u8981\u7D20\u5BA3\u8A00\u306E\u5024''{''abstract''}''\u306F\u3001false\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 +- cvc-elt.3.1 = cvc-elt.3.1: \u5C5E\u6027''{1}''\u306F\u8981\u7D20''{0}''\u306B\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002\u3053\u308C\u306F\u3001''{''nillable''}''\u30D7\u30ED\u30D1\u30C6\u30A3(''{0}'')\u304Cfalse\u3067\u3042\u308B\u305F\u3081\u3067\u3059\u3002 ++ cvc-elt.2 = cvc-elt.2: ''{0}''\u306B\u5BFE\u3059\u308B\u8981\u7D20\u5BA3\u8A00\u306E\u5024'{'abstract'}'\u306F\u3001false\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 ++ cvc-elt.3.1 = cvc-elt.3.1: \u5C5E\u6027''{1}''\u306F\u8981\u7D20''{0}''\u306B\u8868\u793A\u3055\u308C\u307E\u305B\u3093\u3002\u3053\u308C\u306F\u3001'{'nillable'}'\u30D7\u30ED\u30D1\u30C6\u30A3(''{0}'')\u304Cfalse\u3067\u3042\u308B\u305F\u3081\u3067\u3059\u3002 + cvc-elt.3.2.1 = cvc-elt.3.2.1: ''{1}''\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u8981\u7D20''{0}''\u306B\u306F\u6587\u5B57\u3084\u8981\u7D20\u60C5\u5831[children]\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 +- cvc-elt.3.2.2 = cvc-elt.3.2.2: \u56FA\u5B9A\u306E''{''value constraint''}''\u3092\u8981\u7D20''{0}''\u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002''{1}''\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002 ++ cvc-elt.3.2.2 = cvc-elt.3.2.2: \u56FA\u5B9A\u306E'{'value constraint'}'\u3092\u8981\u7D20''{0}''\u306B\u5BFE\u3057\u3066\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002''{1}''\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002 + cvc-elt.4.1 = cvc-elt.4.1: \u8981\u7D20''{0}''\u306E\u5C5E\u6027''{1}''\u306E\u5024''{2}''\u306F\u6709\u52B9\u306AQName\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + cvc-elt.4.2 = cvc-elt.4.2: ''{1}''\u3092\u8981\u7D20''{0}''\u306E\u30BF\u30A4\u30D7\u5B9A\u7FA9\u306B\u89E3\u6C7A\u3067\u304D\u307E\u305B\u3093\u3002 + cvc-elt.4.3 = cvc-elt.4.3: \u30BF\u30A4\u30D7''{1}''\u306F\u3001\u8981\u7D20''{0}''\u306E\u30BF\u30A4\u30D7\u5B9A\u7FA9''{2}''\u304B\u3089\u6B63\u5E38\u306B\u5C0E\u51FA\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 +- cvc-elt.5.1.1 = cvc-elt.5.1.1: ''{''value constraint''}'' ''{2}''(\u8981\u7D20''{0}'')\u306F\u3001\u30BF\u30A4\u30D7''{1}''\u306E\u6709\u52B9\u306A\u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 ++ cvc-elt.5.1.1 = cvc-elt.5.1.1: '{'value constraint'}' ''{2}''(\u8981\u7D20''{0}'')\u306F\u3001\u30BF\u30A4\u30D7''{1}''\u306E\u6709\u52B9\u306A\u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + cvc-elt.5.2.2.1 = cvc-elt.5.2.2.1: \u8981\u7D20''{0}''\u306B\u306F\u8981\u7D20\u60C5\u5831\u30A2\u30A4\u30C6\u30E0[children]\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 +- cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: \u8981\u7D20''{0}''\u306E\u5024''{1}''\u304C\u3001\u56FA\u5B9A\u306E''{''value constraint''}''\u5024''{2}''\u306B\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002 +- cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: \u8981\u7D20''{0}''\u306E\u5024''{1}''\u304C\u3001''{''value constraint''}''\u5024''{2}''\u306B\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002 ++ cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: \u8981\u7D20''{0}''\u306E\u5024''{1}''\u304C\u3001\u56FA\u5B9A\u306E'{'value constraint'}'\u5024''{2}''\u306B\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002 ++ cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: \u8981\u7D20''{0}''\u306E\u5024''{1}''\u304C\u3001'{'value constraint'}'\u5024''{2}''\u306B\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002 + cvc-enumeration-valid = cvc-enumeration-valid: \u5024''{0}''\u306F\u3001\u5217\u6319''{1}''\u306B\u5BFE\u3057\u3066\u30D5\u30A1\u30BB\u30C3\u30C8\u304C\u6709\u52B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u5217\u6319\u304B\u3089\u306E\u5024\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + cvc-fractionDigits-valid = cvc-fractionDigits-valid: \u5024''{0}''\u306E\u5C0F\u6570\u306E\u6841\u6570\u306F{1}\u3067\u3059\u304C\u3001\u5C0F\u6570\u306E\u6841\u6570\u306F{2}\u306B\u5236\u9650\u3055\u308C\u3066\u3044\u307E\u3059\u3002 + cvc-id.1 = cvc-id.1: IDREF ''{0}''\u306EID/IDREF\u30D0\u30A4\u30F3\u30C7\u30A3\u30F3\u30B0\u306F\u3042\u308A\u307E\u305B\u3093\u3002 +@@ -168,10 +142,10 @@ + ag-props-correct.2 = ag-props-correct.2: \u5C5E\u6027\u30B0\u30EB\u30FC\u30D7''{0}''\u306E\u30A8\u30E9\u30FC\u3002\u540C\u3058\u540D\u524D\u304A\u3088\u3073\u30BF\u30FC\u30B2\u30C3\u30C8\u30FB\u30CD\u30FC\u30E0\u30B9\u30DA\u30FC\u30B9\u3092\u6301\u3064\u91CD\u8907\u3059\u308B\u5C5E\u6027\u4F7F\u7528\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u91CD\u8907\u3059\u308B\u5C5E\u6027\u4F7F\u7528\u306E\u540D\u524D\u306F''{1}''\u3067\u3059\u3002 + ag-props-correct.3 = ag-props-correct.3: \u5C5E\u6027\u30B0\u30EB\u30FC\u30D7''{0}''\u306E\u30A8\u30E9\u30FC\u30022\u3064\u306E\u5C5E\u6027\u5BA3\u8A00''{1}''\u3068''{2}''\u306BID\u304B\u3089\u5C0E\u51FA\u3057\u305F\u30BF\u30A4\u30D7\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 + a-props-correct.2 = a-props-correct.2: \u5C5E\u6027''{0}''\u306E\u5024\u5236\u7D04\u306E\u5024''{1}''\u304C\u7121\u52B9\u3067\u3059\u3002 +- a-props-correct.3 = a-props-correct.3: \u5C5E\u6027''{0}''\u3067\u306F''fixed''\u3082''default''\u3082\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u308C\u306F\u3001\u5C5E\u6027\u306E''{''type definition''}''\u304CID\u3067\u3042\u308B\u304B\u3001ID\u304B\u3089\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u3042\u308B\u305F\u3081\u3067\u3059\u3002 +- au-props-correct.2 = au-props-correct.2: ''{0}''\u306E\u5C5E\u6027\u5BA3\u8A00\u3067\u306F\u3001\u56FA\u5B9A\u5024''{1}''\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u305D\u306E\u305F\u3081\u3001''{0}''\u3092\u53C2\u7167\u3059\u308B\u5C5E\u6027\u4F7F\u7528\u306B''{''value constraint''}''\u3082\u542B\u307E\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u3001\u305D\u308C\u3092\u56FA\u5B9A\u3057\u3001\u305D\u306E\u5024\u3092''{1}''\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 ++ a-props-correct.3 = a-props-correct.3: \u5C5E\u6027''{0}''\u3067\u306F''fixed''\u3082''default''\u3082\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u308C\u306F\u3001\u5C5E\u6027\u306E'{'type definition'}'\u304CID\u3067\u3042\u308B\u304B\u3001ID\u304B\u3089\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u3042\u308B\u305F\u3081\u3067\u3059\u3002 ++ au-props-correct.2 = au-props-correct.2: ''{0}''\u306E\u5C5E\u6027\u5BA3\u8A00\u3067\u306F\u3001\u56FA\u5B9A\u5024''{1}''\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u305D\u306E\u305F\u3081\u3001''{0}''\u3092\u53C2\u7167\u3059\u308B\u5C5E\u6027\u4F7F\u7528\u306B'{'value constraint'}'\u3082\u542B\u307E\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u3001\u305D\u308C\u3092\u56FA\u5B9A\u3057\u3001\u305D\u306E\u5024\u3092''{1}''\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + cos-all-limited.1.2 = cos-all-limited.1.2: 'all'\u306E\u30E2\u30C7\u30EB\u30FB\u30B0\u30EB\u30FC\u30D7\u306F'{'min occurs'}' = '{'max occurs'}' = 1\u306E\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306B\u542B\u307E\u308C\u308B\u5FC5\u8981\u304C\u3042\u308A\u3001\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306F\u8907\u5408\u578B\u5B9A\u7FA9\u306E'{'content type'}'\u3092\u69CB\u6210\u3059\u308B1\u7D44\u306E\u4E00\u90E8\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 +- cos-all-limited.2 = cos-all-limited.2: ''all''\u306E\u30E2\u30C7\u30EB\u30FB\u30B0\u30EB\u30FC\u30D7\u306E\u8981\u7D20\u306E''{''max occurs''}''\u306F0\u304B1\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u8981\u7D20''{1}''\u306E\u5024''{0}''\u306F\u7121\u52B9\u3067\u3059\u3002 ++ cos-all-limited.2 = cos-all-limited.2: ''all''\u306E\u30E2\u30C7\u30EB\u30FB\u30B0\u30EB\u30FC\u30D7\u306E\u8981\u7D20\u306E'{'max occurs'}'\u306F0\u304B1\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u8981\u7D20''{1}''\u306E\u5024''{0}''\u306F\u7121\u52B9\u3067\u3059\u3002 + cos-applicable-facets = cos-applicable-facets: \u30BF\u30A4\u30D7{1}\u306B\u30D5\u30A1\u30BB\u30C3\u30C8''{0}''\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 + cos-ct-extends.1.1 = cos-ct-extends.1.1: \u30BF\u30A4\u30D7''{0}''\u306F\u30BF\u30A4\u30D7''{1}''\u306E\u62E1\u5F35\u306B\u3088\u3063\u3066\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u3059\u3002\u305F\u3060\u3057\u3001''{1}''\u306E''final''\u5C5E\u6027\u306B\u3088\u3063\u3066\u3001\u62E1\u5F35\u306B\u3088\u308B\u5C0E\u51FA\u304C\u7981\u6B62\u3055\u308C\u3066\u3044\u307E\u3059\u3002 + cos-ct-extends.1.4.3.2.2.1.a = cos-ct-extends.1.4.3.2.2.1.a: \u5C0E\u51FA\u3055\u308C\u305F\u30BF\u30A4\u30D7\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u30FB\u30BF\u30A4\u30D7\u3068\u305D\u306E\u30D9\u30FC\u30B9\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u30FB\u30BF\u30A4\u30D7\u306F\u4E21\u65B9\u3068\u3082\u6DF7\u5408\u578B\u306B\u3059\u308B\u304B\u3001\u8981\u7D20\u306E\u307F\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u30BF\u30A4\u30D7''{0}''\u306F\u8981\u7D20\u306E\u307F\u3067\u3059\u304C\u3001\u305D\u306E\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306F\u8981\u7D20\u306E\u307F\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 +@@ -182,17 +156,17 @@ + cos-particle-restrict.a = cos-particle-restrict.a: \u5C0E\u51FA\u3055\u308C\u305F\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u304C\u7A7A\u3067\u3042\u308A\u3001\u30D9\u30FC\u30B9\u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093\u3002 + cos-particle-restrict.b = cos-particle-restrict.b: \u30D9\u30FC\u30B9\u306E\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306F\u7A7A\u3067\u3059\u304C\u3001\u5C0E\u51FA\u3055\u308C\u305F\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306F\u7A7A\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + cos-particle-restrict.2 = cos-particle-restrict.2: \u7981\u6B62\u3055\u308C\u305F\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u5236\u9650: ''{0}''\u3002 +- cos-st-restricts.1.1 = cos-st-restricts.1.1: \u30BF\u30A4\u30D7''{1}''\u306F\u30A2\u30C8\u30DF\u30C3\u30AF\u3067\u3042\u308B\u305F\u3081\u3001\u305D\u306E''{''base type definition''}'' ''{0}''\u306F\u30A2\u30C8\u30DF\u30C3\u30AF\u306E\u5358\u7D14\u578B\u5B9A\u7FA9\u304B\u30D7\u30EA\u30DF\u30C6\u30A3\u30D6\u306E\u7D44\u8FBC\u307F\u30C7\u30FC\u30BF\u578B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 ++ cos-st-restricts.1.1 = cos-st-restricts.1.1: \u30BF\u30A4\u30D7''{1}''\u306F\u30A2\u30C8\u30DF\u30C3\u30AF\u3067\u3042\u308B\u305F\u3081\u3001\u305D\u306E'{'base type definition'}' ''{0}''\u306F\u30A2\u30C8\u30DF\u30C3\u30AF\u306E\u5358\u7D14\u578B\u5B9A\u7FA9\u304B\u30D7\u30EA\u30DF\u30C6\u30A3\u30D6\u306E\u7D44\u8FBC\u307F\u30C7\u30FC\u30BF\u578B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + cos-st-restricts.2.1 = cos-st-restricts.2.1: \u30BF\u30A4\u30D7''{1}''\u306F\u30EA\u30B9\u30C8\u30FB\u30BF\u30A4\u30D7\u304B\u3001\u30EA\u30B9\u30C8\u3092\u542B\u3080\u5171\u7528\u4F53\u30BF\u30A4\u30D7\u3067\u3042\u308B\u305F\u3081\u3001\u30EA\u30B9\u30C8\u30FB\u30BF\u30A4\u30D7''{0}''\u306E\u5B9A\u7FA9\u3067\u306F\u7121\u52B9\u306A\u30A2\u30A4\u30C6\u30E0\u30FB\u30BF\u30A4\u30D7\u3067\u3059\u3002 +- cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: ''{''item type definition''}'' ''{0}''\u306E''{''final''}''\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u306F\u3001''list''\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u3064\u307E\u308A\u3001''{0}''\u306F\u30EA\u30B9\u30C8\u30FB\u30BF\u30A4\u30D7''{1}''\u306E\u30A2\u30A4\u30C6\u30E0\u30FB\u30BF\u30A4\u30D7\u3068\u3057\u3066\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 +- cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: ''{''member type definitions''}'' ''{0}''\u306E''{''final''}''\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u306F\u3001''union''\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u3064\u307E\u308A\u3001''{0}''\u306F\u5171\u7528\u4F53\u30BF\u30A4\u30D7''{1}''\u306E\u30E1\u30F3\u30D0\u30FC\u30FB\u30BF\u30A4\u30D7\u3068\u3057\u3066\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 ++ cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: '{'item type definition'}' ''{0}''\u306E'{'final'}'\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u306F\u3001''list''\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u3064\u307E\u308A\u3001''{0}''\u306F\u30EA\u30B9\u30C8\u30FB\u30BF\u30A4\u30D7''{1}''\u306E\u30A2\u30A4\u30C6\u30E0\u30FB\u30BF\u30A4\u30D7\u3068\u3057\u3066\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 ++ cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: '{'member type definitions'}' ''{0}''\u306E'{'final'}'\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u306B\u306F\u3001''union''\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u3064\u307E\u308A\u3001''{0}''\u306F\u5171\u7528\u4F53\u30BF\u30A4\u30D7''{1}''\u306E\u30E1\u30F3\u30D0\u30FC\u30FB\u30BF\u30A4\u30D7\u3068\u3057\u3066\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 + cos-valid-default.2.1 = cos-valid-default.2.1: \u8981\u7D20''{0}''\u306B\u306F\u5024\u5236\u7D04\u304C\u542B\u307E\u308C\u3066\u304A\u308A\u3001\u6DF7\u5408\u307E\u305F\u306F\u5358\u7D14\u30B3\u30F3\u30C6\u30F3\u30C4\u30FB\u30E2\u30C7\u30EB\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 +- cos-valid-default.2.2.2 = cos-valid-default.2.2.2: \u8981\u7D20''{0}''\u306B\u306F''{''value constraint''}''\u304C\u542B\u307E\u308C\u3066\u304A\u308A\u3001\u305D\u306E\u30BF\u30A4\u30D7\u5B9A\u7FA9\u306B\u306F\u6DF7\u5408''{''content type''}''\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u305F\u3081\u3001''{''content type''}''\u306E\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306F\u7A7A\u306B\u3067\u304D\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 ++ cos-valid-default.2.2.2 = cos-valid-default.2.2.2: \u8981\u7D20''{0}''\u306B\u306F'{'value constraint'}'\u304C\u542B\u307E\u308C\u3066\u304A\u308A\u3001\u305D\u306E\u30BF\u30A4\u30D7\u5B9A\u7FA9\u306B\u306F\u6DF7\u5408'{'content type'}'\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u305F\u3081\u3001'{'content type'}'\u306E\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306F\u7A7A\u306B\u3067\u304D\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + c-props-correct.2 = c-props-correct.2: keyref ''{0}''\u3068key ''{1}''\u306B\u5BFE\u3059\u308B\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u30AB\u30FC\u30C7\u30A3\u30CA\u30EA\u30C6\u30A3\u304C\u76F8\u4E92\u306B\u4E00\u81F4\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + ct-props-correct.3 = ct-props-correct.3: \u8907\u5408\u578B''{0}''\u3067\u5FAA\u74B0\u5B9A\u7FA9\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002\u3064\u307E\u308A\u3001''{0}''\u304C\u305D\u308C\u81EA\u4F53\u306E\u30BF\u30A4\u30D7\u968E\u5C64\u306B\u542B\u307E\u308C\u3066\u3044\u308B\u305F\u3081\u30A8\u30E9\u30FC\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002 + ct-props-correct.4 = ct-props-correct.4: \u30BF\u30A4\u30D7''{0}''\u306E\u30A8\u30E9\u30FC\u3002\u540C\u3058\u540D\u524D\u304A\u3088\u3073\u30BF\u30FC\u30B2\u30C3\u30C8\u30FB\u30CD\u30FC\u30E0\u30B9\u30DA\u30FC\u30B9\u3092\u6301\u3064\u91CD\u8907\u3059\u308B\u5C5E\u6027\u4F7F\u7528\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u91CD\u8907\u3059\u308B\u5C5E\u6027\u4F7F\u7528\u306E\u540D\u524D\u306F''{1}''\u3067\u3059\u3002 + ct-props-correct.5 = ct-props-correct.5: \u30BF\u30A4\u30D7''{0}''\u306E\u30A8\u30E9\u30FC\u30022\u3064\u306E\u5C5E\u6027\u5BA3\u8A00''{1}''\u3068''{2}''\u306BID\u304B\u3089\u5C0E\u51FA\u3057\u305F\u30BF\u30A4\u30D7\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 +- derivation-ok-restriction.1 = derivation-ok-restriction.1: \u30BF\u30A4\u30D7''{0}''\u306F\u30BF\u30A4\u30D7''{1}''\u306E\u5236\u9650\u306B\u3088\u3063\u3066\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u3059\u3002\u305F\u3060\u3057\u3001''{1}''\u306E''{''final''}''\u30D7\u30ED\u30D1\u30C6\u30A3\u306B\u3088\u3063\u3066\u3001\u5236\u9650\u306B\u3088\u308B\u5C0E\u51FA\u304C\u7981\u6B62\u3055\u308C\u3066\u3044\u307E\u3059\u3002 ++ derivation-ok-restriction.1 = derivation-ok-restriction.1: \u30BF\u30A4\u30D7''{0}''\u306F\u30BF\u30A4\u30D7''{1}''\u306E\u5236\u9650\u306B\u3088\u3063\u3066\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u3059\u3002\u305F\u3060\u3057\u3001''{1}''\u306E'{'final'}'\u30D7\u30ED\u30D1\u30C6\u30A3\u306B\u3088\u3063\u3066\u3001\u5236\u9650\u306B\u3088\u308B\u5C0E\u51FA\u304C\u7981\u6B62\u3055\u308C\u3066\u3044\u307E\u3059\u3002 + derivation-ok-restriction.2.1.1 = derivation-ok-restriction.2.1.1: \u30BF\u30A4\u30D7''{0}''\u306E\u30A8\u30E9\u30FC\u3002\u3053\u306E\u30BF\u30A4\u30D7\u306E\u5C5E\u6027\u4F7F\u7528''{1}''\u306B\u306F\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u5C5E\u6027\u4F7F\u7528\u306E\u5024''required''\u3068\u4E00\u8CAB\u6027\u304C\u306A\u3044''{2}''\u306E''use''\u5024\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 + derivation-ok-restriction.2.1.2 = derivation-ok-restriction.2.1.2: \u30BF\u30A4\u30D7''{0}''\u306E\u30A8\u30E9\u30FC\u3002\u3053\u306E\u30BF\u30A4\u30D7\u306E\u5C5E\u6027\u4F7F\u7528''{1}''\u306B\u306F\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u5C5E\u6027\u4F7F\u7528\u306E\u30BF\u30A4\u30D7''{3}''\u304B\u3089\u6B63\u5E38\u306B\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u306F\u306A\u3044\u30BF\u30A4\u30D7''{2}''\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 + derivation-ok-restriction.2.1.3.a = derivation-ok-restriction.2.1.3.a: \u30BF\u30A4\u30D7''{0}''\u306E\u30A8\u30E9\u30FC\u3002\u3053\u306E\u30BF\u30A4\u30D7\u306E\u5C5E\u6027\u4F7F\u7528''{1}''\u306B\u306F\u3001\u56FA\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u6709\u52B9\u306A\u5024\u5236\u7D04\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u304C\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u5C5E\u6027\u4F7F\u7528\u306E\u6709\u52B9\u306A\u5024\u5236\u7D04\u306F\u56FA\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002 +@@ -210,8 +184,8 @@ + enumeration-required-notation = enumeration-required-notation: {2} ''{1}''\u3067\u4F7F\u7528\u3055\u308C\u308BNOTATION\u30BF\u30A4\u30D7''{0}''\u306B\u306F\u3001\u3053\u306E\u30BF\u30A4\u30D7\u3067\u4F7F\u7528\u3055\u308C\u308B\u8868\u8A18\u6CD5\u8981\u7D20\u3092\u6307\u5B9A\u3059\u308B\u5217\u6319\u30D5\u30A1\u30BB\u30C3\u30C8\u5024\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + enumeration-valid-restriction = enumeration-valid-restriction: \u5217\u6319\u5024''{0}''\u306F\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5024\u7A7A\u9593{1}\u306B\u5B58\u5728\u3057\u307E\u305B\u3093\u3002 + e-props-correct.2 = e-props-correct.2: \u8981\u7D20''{0}''\u306E\u5024\u5236\u7D04\u306E\u5024''{1}''\u304C\u7121\u52B9\u3067\u3059\u3002 +- e-props-correct.4 = e-props-correct.4: \u8981\u7D20''{0}''\u306E''{''type definition''}''\u304CsubstitutionHead ''{1}''\u306E''{''type definition''}''\u304B\u3089\u6B63\u5E38\u306B\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u306A\u3044\u304B\u3001''{1}''\u306E''{''substitution group exclusions''}''\u30D7\u30ED\u30D1\u30C6\u30A3\u3067\u3053\u306E\u5C0E\u51FA\u304C\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 +- e-props-correct.5 = e-props-correct.5: \u8981\u7D20\u306E''{''type definition''}''\u307E\u305F\u306F''{''type definition''}''\u306E''{''content type''}''\u306FID\u3067\u3042\u308B\u304B\u3001ID\u304B\u3089\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u3042\u308B\u305F\u3081\u3001\u8981\u7D20''{0}''\u306B''{''value constraint''}''\u3092\u542B\u3081\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 ++ e-props-correct.4 = e-props-correct.4: \u8981\u7D20''{0}''\u306E'{'type definition'}'\u304CsubstitutionHead ''{1}''\u306E'{'type definition'}'\u304B\u3089\u6B63\u5E38\u306B\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u306A\u3044\u304B\u3001''{1}''\u306E'{'substitution group exclusions'}'\u30D7\u30ED\u30D1\u30C6\u30A3\u3067\u3053\u306E\u5C0E\u51FA\u304C\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 ++ e-props-correct.5 = e-props-correct.5: \u8981\u7D20\u306E'{'type definition'}'\u307E\u305F\u306F'{'type definition'}'\u306E'{'content type'}'\u306FID\u3067\u3042\u308B\u304B\u3001ID\u304B\u3089\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u3042\u308B\u305F\u3081\u3001\u8981\u7D20''{0}''\u306B'{'value constraint'}'\u3092\u542B\u3081\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 + e-props-correct.6 = e-props-correct.6: \u8981\u7D20''{0}''\u3067\u5FAA\u74B0\u7F6E\u63DB\u30B0\u30EB\u30FC\u30D7\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002 + fractionDigits-valid-restriction = fractionDigits-valid-restriction: \u30D5\u30A1\u30BB\u30C3\u30C8''fractionDigits''\u306E\u5024''{0}''\u306F\u3001\u7956\u5148\u30BF\u30A4\u30D7\u306E\u3044\u305A\u308C\u304B\u3067''{1}''\u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B''fractionDigits''\u306E\u5024\u4EE5\u4E0B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308B\u305F\u3081\u3001{2}\u306E\u5B9A\u7FA9\u3067\u306F\u7121\u52B9\u3067\u3059\u3002 + fractionDigits-totalDigits = fractionDigits-totalDigits: \u30D5\u30A1\u30BB\u30C3\u30C8''fractionDigits''\u306E\u5024''{0}''\u306F\u3001''totalDigits''\u306E\u5024''{1}''\u4EE5\u4E0B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308B\u305F\u3081\u3001{2}\u306E\u5B9A\u7FA9\u3067\u306F\u7121\u52B9\u3067\u3059\u3002 +@@ -232,7 +206,7 @@ + maxInclusive-valid-restriction.3 = maxInclusive-valid-restriction.3: \u30BF\u30A4\u30D7''{2}''\u306E\u30A8\u30E9\u30FC\u3002maxInclusive\u306E\u5024''{0}''\u306F\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7''{1}''\u306EminInclusive\u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + maxInclusive-valid-restriction.4 = maxInclusive-valid-restriction.4: \u30BF\u30A4\u30D7''{2}''\u306E\u30A8\u30E9\u30FC\u3002maxInclusive\u306E\u5024''{0}''\u306F\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7''{1}''\u306EminExclusive\u3088\u308A\u5927\u304D\u304F\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + maxLength-valid-restriction = maxLength-valid-restriction: {2}\u306E\u5B9A\u7FA9\u3067\u306F\u3001maxLength\u306E\u5024''{0}''\u306F\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7''{1}''\u306E\u5024\u4EE5\u4E0B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 +- mg-props-correct.2 = mg-props-correct.2: \u30B0\u30EB\u30FC\u30D7''{0}''\u3067\u5FAA\u74B0\u5B9A\u7FA9\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E''{''term''}''\u5024\u3092\u518D\u5E30\u7684\u306B\u305F\u3069\u308B\u3068\u3001''{''term''}''\u304C\u30B0\u30EB\u30FC\u30D7\u81EA\u4F53\u3067\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306B\u9054\u3057\u307E\u3059\u3002 ++ mg-props-correct.2 = mg-props-correct.2: \u30B0\u30EB\u30FC\u30D7''{0}''\u3067\u5FAA\u74B0\u5B9A\u7FA9\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E'{'term'}'\u5024\u3092\u518D\u5E30\u7684\u306B\u305F\u3069\u308B\u3068\u3001'{'term'}'\u304C\u30B0\u30EB\u30FC\u30D7\u81EA\u4F53\u3067\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306B\u9054\u3057\u307E\u3059\u3002 + minExclusive-less-than-equal-to-maxExclusive = minExclusive-less-than-equal-to-maxExclusive: {2}\u306E\u5B9A\u7FA9\u3067\u306F\u3001minExclusive\u306E\u5024''{0}''\u306FmaxExclusive\u306E\u5024''{1}''\u4EE5\u4E0B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + minExclusive-less-than-maxInclusive = minExclusive-less-than-maxInclusive: {2}\u306E\u5B9A\u7FA9\u3067\u306F\u3001minExclusive\u306E\u5024''{0}''\u306FmaxInclusive\u306E\u5024''{1}''\u3088\u308A\u5C0F\u3055\u304F\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + minExclusive-valid-restriction.1 = minExclusive-valid-restriction.1: \u30BF\u30A4\u30D7''{2}''\u306E\u30A8\u30E9\u30FC\u3002minExclusive\u306E\u5024''{0}''\u306F\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7''{1}''\u306EminExclusive\u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 +@@ -249,20 +223,20 @@ + minLength-less-than-equal-to-maxLength = minLength-less-than-equal-to-maxLength: {2}\u306E\u5B9A\u7FA9\u3067\u306F\u3001minLength\u306E\u5024''{0}''\u306FmaxLength\u306E\u5024''{1}''\u3088\u308A\u5C0F\u3055\u304F\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + minLength-valid-restriction = minLength-valid-restriction: {2}\u306E\u5B9A\u7FA9\u3067\u306F\u3001minLength\u306E\u5024''{0}''\u306F\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7''{1}''\u306E\u5024\u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + no-xmlns = no-xmlns: \u5C5E\u6027\u5BA3\u8A00\u306E{name}\u3092'xmlns'\u3068\u540C\u4E00\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 +- no-xsi = no-xsi: \u5C5E\u6027\u5BA3\u8A00\u306E''{''target namespace''}''\u3092''{0}''\u3068\u540C\u4E00\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 ++ no-xsi = no-xsi: \u5C5E\u6027\u5BA3\u8A00\u306E'{'target namespace'}'\u3092''{0}''\u3068\u540C\u4E00\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 + p-props-correct.2.1 = p-props-correct.2.1: ''{0}''\u306E\u5BA3\u8A00\u3067\u306F\u3001''minOccurs''\u306E\u5024\u306F''{1}''\u3067\u3059\u304C\u3001''maxOccurs''\u306E\u5024''{2}''\u3088\u308A\u5927\u304D\u304F\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 + rcase-MapAndSum.1 = rcase-MapAndSum.1: \u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u9593\u306B\u5B8C\u5168\u306A\u6A5F\u80FD\u30DE\u30C3\u30D4\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093\u3002 + rcase-MapAndSum.2 = rcase-MapAndSum.2: \u30B0\u30EB\u30FC\u30D7\u306E\u51FA\u73FE\u7BC4\u56F2({0},{1})\u304C\u30D9\u30FC\u30B9\u30FB\u30B0\u30EB\u30FC\u30D7\u306E\u51FA\u73FE\u7BC4\u56F2({2},{3})\u306E\u6709\u52B9\u306A\u5236\u9650\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + rcase-NameAndTypeOK.1 = rcase-NameAndTypeOK.1: \u8981\u7D20\u306B\u7570\u306A\u308B\u540D\u524D\u3084\u30BF\u30FC\u30B2\u30C3\u30C8\u30FB\u30CD\u30FC\u30E0\u30B9\u30DA\u30FC\u30B9\u304C\u542B\u307E\u308C\u307E\u3059: \u30CD\u30FC\u30E0\u30B9\u30DA\u30FC\u30B9''{1}''\u306E\u8981\u7D20''{0}''\u304A\u3088\u3073\u30CD\u30FC\u30E0\u30B9\u30DA\u30FC\u30B9''{3}''\u306E\u8981\u7D20''{2}''\u3067\u3059\u3002 +- rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: ''{''term''}''\u304C\u8981\u7D20\u5BA3\u8A00''{0}''\u3067\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u30A8\u30E9\u30FC\u3002\u8981\u7D20\u5BA3\u8A00\u306E''{''nillable''}''\u306Ftrue\u3067\u3059\u304C\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306B\u306F''{''nillable''}''\u304Cfalse\u306E\u8981\u7D20\u5BA3\u8A00\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 +- rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: ''{''term''}''\u304C\u8981\u7D20\u5BA3\u8A00''{0}''\u3067\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u30A8\u30E9\u30FC\u3002\u51FA\u73FE\u7BC4\u56F2({1},{2})\u306F\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u7BC4\u56F2({3},{4}\u306E\u6709\u52B9\u306A\u5236\u9650\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 ++ rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: '{'term'}'\u304C\u8981\u7D20\u5BA3\u8A00''{0}''\u3067\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u30A8\u30E9\u30FC\u3002\u8981\u7D20\u5BA3\u8A00\u306E'{'nillable'}'\u306Ftrue\u3067\u3059\u304C\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306B\u306F'{'nillable'}'\u304Cfalse\u306E\u8981\u7D20\u5BA3\u8A00\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 ++ rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: '{'term'}'\u304C\u8981\u7D20\u5BA3\u8A00''{0}''\u3067\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u30A8\u30E9\u30FC\u3002\u51FA\u73FE\u7BC4\u56F2({1},{2})\u306F\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u7BC4\u56F2({3},{4}\u306E\u6709\u52B9\u306A\u5236\u9650\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + rcase-NameAndTypeOK.4.a = rcase-NameAndTypeOK.4.a: \u8981\u7D20''{0}''\u306F\u56FA\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u304C\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u8981\u7D20\u306F\u5024''{1}''\u3067\u56FA\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002 + rcase-NameAndTypeOK.4.b = rcase-NameAndTypeOK.4.b: \u8981\u7D20''{0}''\u306F\u5024''{1}''\u3067\u56FA\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u304C\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u8981\u7D20\u306F\u5024''{2}''\u3067\u56FA\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002 + rcase-NameAndTypeOK.5 = rcase-NameAndTypeOK.5: \u8981\u7D20''{0}''\u306E\u30A2\u30A4\u30C7\u30F3\u30C6\u30A3\u30C6\u30A3\u5236\u7D04\u304C\u30D9\u30FC\u30B9\u306E\u30A2\u30A4\u30C7\u30F3\u30C6\u30A3\u30C6\u30A3\u5236\u7D04\u306E\u30B5\u30D6\u30BB\u30C3\u30C8\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + rcase-NameAndTypeOK.6 = rcase-NameAndTypeOK.6: \u8981\u7D20''{0}''\u306Edisallowed substitutions\u306F\u30D9\u30FC\u30B9\u306Edisallowed substitutions\u306E\u30B9\u30FC\u30D1\u30FC\u30BB\u30C3\u30C8\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + rcase-NameAndTypeOK.7 = rcase-NameAndTypeOK.7: \u8981\u7D20''{0}''\u306E\u30BF\u30A4\u30D7''{1}''\u306F\u3001\u30D9\u30FC\u30B9\u8981\u7D20\u306E\u30BF\u30A4\u30D7''{2}''\u304B\u3089\u5C0E\u51FA\u3055\u308C\u305F\u3082\u306E\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + rcase-NSCompat.1 = rcase-NSCompat.1: \u8981\u7D20''{0}''\u306B\u3001\u30D9\u30FC\u30B9\u306E\u30EF\u30A4\u30EB\u30C9\u30AB\u30FC\u30C9\u3067\u8A31\u53EF\u3055\u308C\u3066\u3044\u306A\u3044\u30CD\u30FC\u30E0\u30B9\u30DA\u30FC\u30B9''{1}''\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 +- rcase-NSCompat.2 = rcase-NSCompat.2: ''{''term''}''\u304C\u8981\u7D20\u5BA3\u8A00''{0}''\u3067\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u30A8\u30E9\u30FC\u3002\u51FA\u73FE\u7BC4\u56F2({1},{2})\u306F\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u7BC4\u56F2({3},{4}\u306E\u6709\u52B9\u306A\u5236\u9650\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 ++ rcase-NSCompat.2 = rcase-NSCompat.2: '{'term'}'\u304C\u8981\u7D20\u5BA3\u8A00''{0}''\u3067\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u30A8\u30E9\u30FC\u3002\u51FA\u73FE\u7BC4\u56F2({1},{2})\u306F\u3001\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7\u306E\u5BFE\u5FDC\u3059\u308B\u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u306E\u7BC4\u56F2({3},{4}\u306E\u6709\u52B9\u306A\u5236\u9650\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + rcase-NSRecurseCheckCardinality.1 = rcase-NSRecurseCheckCardinality.1: \u30D1\u30FC\u30C6\u30A3\u30AF\u30EB\u9593\u306B\u5B8C\u5168\u306A\u6A5F\u80FD\u30DE\u30C3\u30D4\u30F3\u30B0\u304C\u3042\u308A\u307E\u305B\u3093\u3002 + rcase-NSRecurseCheckCardinality.2 = rcase-NSRecurseCheckCardinality.2: \u30B0\u30EB\u30FC\u30D7\u306E\u51FA\u73FE\u7BC4\u56F2({0},{1})\u304C\u30D9\u30FC\u30B9\u306E\u30EF\u30A4\u30EB\u30C9\u30AB\u30FC\u30C9\u306E\u7BC4\u56F2({2},{3})\u306E\u6709\u52B9\u306A\u5236\u9650\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 + rcase-NSSubset.1 = rcase-NSSubset.1: \u30EF\u30A4\u30EB\u30C9\u30AB\u30FC\u30C9\u304C\u3001\u30D9\u30FC\u30B9\u306E\u5BFE\u5FDC\u3059\u308B\u30EF\u30A4\u30EB\u30C9\u30AB\u30FC\u30C9\u306E\u30B5\u30D6\u30BB\u30C3\u30C8\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002 +@@ -278,7 +252,7 @@ + # src-redefine.1 = src-redefine.1: The component ''{0}'' is begin redefined, but its corresponding component isn't in the schema document being redefined (with namespace ''{2}''), but in a different document, with namespace ''{1}''. + sch-props-correct.2 = sch-props-correct.2: \u30B9\u30AD\u30FC\u30DE\u306B\u306F\u540C\u3058\u540D\u524D\u3092\u6301\u30642\u3064\u306E\u30B0\u30ED\u30FC\u30D0\u30EB\u30FB\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u3092\u542B\u3081\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002\u3053\u306E\u30B9\u30AD\u30FC\u30DE\u306B\u306F''{0}''\u304C2\u3064\u3042\u308A\u307E\u3059\u3002 + st-props-correct.2 = st-props-correct.2: \u5358\u7D14\u578B''{0}''\u3067\u5FAA\u74B0\u5B9A\u7FA9\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002\u3064\u307E\u308A\u3001''{0}''\u304C\u305D\u308C\u81EA\u4F53\u306E\u30BF\u30A4\u30D7\u968E\u5C64\u306B\u542B\u307E\u308C\u3066\u3044\u308B\u305F\u3081\u30A8\u30E9\u30FC\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002 +- st-props-correct.3 = st-props-correct.3: \u30BF\u30A4\u30D7''{0}''\u306E\u30A8\u30E9\u30FC\u3002''{''base type definition''}''\u306E''{''final''}''\u306E\u5024''{1}''\u306F\u3001\u5236\u9650\u306B\u3088\u3063\u3066\u5C0E\u51FA\u3092\u7981\u6B62\u3057\u3066\u3044\u307E\u3059\u3002 ++ st-props-correct.3 = st-props-correct.3: \u30BF\u30A4\u30D7''{0}''\u306E\u30A8\u30E9\u30FC\u3002'{'base type definition'}'\u306E'{'final'}'\u306E\u5024''{1}''\u306F\u3001\u5236\u9650\u306B\u3088\u3063\u3066\u5C0E\u51FA\u3092\u7981\u6B62\u3057\u3066\u3044\u307E\u3059\u3002 + totalDigits-valid-restriction = totalDigits-valid-restriction: \u30D5\u30A1\u30BB\u30C3\u30C8''totalDigits''\u306E\u5024''{0}''\u306F\u3001\u7956\u5148\u30BF\u30A4\u30D7\u306E\u3044\u305A\u308C\u304B\u3067''{1}''\u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B''totalDigits''\u306E\u5024\u4EE5\u4E0B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308B\u305F\u3081\u3001{2}\u306E\u5B9A\u7FA9\u3067\u306F\u7121\u52B9\u3067\u3059\u3002 + whiteSpace-valid-restriction.1 = whiteSpace-valid-restriction.1: \u7956\u5148\u30BF\u30A4\u30D7\u306E\u3044\u305A\u308C\u304B\u3067''whitespace''\u306E\u5024\u304C''collapse''\u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001{0}\u306E\u5B9A\u7FA9\u3067\u306F\u30D5\u30A1\u30BB\u30C3\u30C8''whitespace''\u306E\u5024''{1}''\u306F\u7121\u52B9\u3067\u3059\u3002 + whiteSpace-valid-restriction.2 = whiteSpace-valid-restriction.2: \u7956\u5148\u30BF\u30A4\u30D7\u306E\u3044\u305A\u308C\u304B\u3067''whitespace''\u306E\u5024\u304C''replace''\u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001{0}\u306E\u5B9A\u7FA9\u3067\u306F\u30D5\u30A1\u30BB\u30C3\u30C8''whitespace''\u306E\u5024''preserve''\u306F\u7121\u52B9\u3067\u3059\u3002 +@@ -306,7 +280,7 @@ + c-selector-xpath = c-selector-xpath: selector\u306E\u5024''{0}''\u306F\u7121\u52B9\u3067\u3059\u3002selector\u306EXPath\u306B\u306F\u5C5E\u6027\u3092\u542B\u3081\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 + EmptyTargetNamespace = EmptyTargetNamespace: \u30B9\u30AD\u30FC\u30DE\u30FB\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8''{0}''\u3067\u306F\u3001''targetNamespace''\u5C5E\u6027\u306E\u5024\u3092\u7A7A\u306E\u6587\u5B57\u5217\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 + FacetValueFromBase = FacetValueFromBase: \u30BF\u30A4\u30D7''{0}''\u306E\u5BA3\u8A00\u3067\u306F\u3001\u30D5\u30A1\u30BB\u30C3\u30C8''{2}''\u306E\u5024''{1}''\u306F\u30D9\u30FC\u30B9\u30FB\u30BF\u30A4\u30D7''{3}''\u306E\u5024\u7A7A\u9593\u304B\u3089\u306E\u3082\u306E\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 +- FixedFacetValue = FixedFacetValue: {3}\u306E\u5B9A\u7FA9\u3067\u306F\u30D5\u30A1\u30BB\u30C3\u30C8''{0}''\u306E\u5024''{1}''\u306F\u7121\u52B9\u3067\u3059\u3002\u3053\u308C\u306F\u3001''{0}''\u306E\u5024\u304C\u7956\u5148\u30BF\u30A4\u30D7\u306E\u3044\u305A\u308C\u304B\u3067''{2}''\u306B\u8A2D\u5B9A\u3055\u308C\u3066\u304A\u308A\u3001''{''fixed''}'' = true\u3067\u3042\u308B\u305F\u3081\u3067\u3059\u3002 ++ FixedFacetValue = FixedFacetValue: {3}\u306E\u5B9A\u7FA9\u3067\u306F\u30D5\u30A1\u30BB\u30C3\u30C8''{0}''\u306E\u5024''{1}''\u306F\u7121\u52B9\u3067\u3059\u3002\u3053\u308C\u306F\u3001''{0}''\u306E\u5024\u304C\u7956\u5148\u30BF\u30A4\u30D7\u306E\u3044\u305A\u308C\u304B\u3067''{2}''\u306B\u8A2D\u5B9A\u3055\u308C\u3066\u304A\u308A\u3001'{'fixed'}' = true\u3067\u3042\u308B\u305F\u3081\u3067\u3059\u3002 + InvalidRegex = InvalidRegex: pattern\u306E\u5024''{0}''\u306F\u7121\u52B9\u306A\u6B63\u898F\u8868\u73FE\u3067\u3059\u3002\u5217''{2}''\u3067''{1}''\u30A8\u30E9\u30FC\u304C\u5831\u544A\u3055\u308C\u307E\u3057\u305F\u3002 + maxOccurLimit = \u73FE\u5728\u306E\u30D1\u30FC\u30B5\u30FC\u306E\u69CB\u6210\u3067\u306F\u3001maxOccurs\u5C5E\u6027\u306B\u5024{0}\u3088\u308A\u5927\u304D\u3044\u5024\u3092\u8A2D\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002 + PublicSystemOnNotation = PublicSystemOnNotation: \u8981\u7D20''notation''\u306B\u306F''public''\u304A\u3088\u3073''system''\u306E\u5C11\u306A\u304F\u3068\u30821\u3064\u304C\u5FC5\u8981\u3067\u3059\u3002 +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_ko.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_ko.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,32 +1,6 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file contains error and warning messages related to XML Schema + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XMLSchemaMessages_ko.properties /st_wptg_1.8.0.0.0jdk/3 2013/09/16 02:31:34 gmolloy Exp $ + + BadMessageKey = \uBA54\uC2DC\uC9C0 \uD0A4\uC5D0 \uD574\uB2F9\uD558\uB294 \uC624\uB958 \uBA54\uC2DC\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + FormatFailed = \uB2E4\uC74C \uBA54\uC2DC\uC9C0\uC758 \uD615\uC2DD\uC744 \uC9C0\uC815\uD558\uB294 \uC911 \uB0B4\uBD80 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\n +@@ -60,7 +34,7 @@ + #validation (3.X.4) + + cvc-attribute.3 = cvc-attribute.3: ''{0}'' \uC694\uC18C\uC758 ''{1}'' \uC18D\uC131\uC5D0 \uB300\uD55C ''{2}'' \uAC12\uC774 ''{3}'' \uC720\uD615\uC5D0 \uB300\uD574 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. +- cvc-attribute.4 = cvc-attribute.4: ''{0}'' \uC694\uC18C\uC758 ''{1}'' \uC18D\uC131\uC5D0 \uB300\uD55C ''{2}'' \uAC12\uC774 \uACE0\uC815\uB41C ''{''value constraint''}''\uC5D0 \uB300\uD574 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. \uC18D\uC131\uC758 \uAC12\uC740 ''{3}''\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. ++ cvc-attribute.4 = cvc-attribute.4: ''{0}'' \uC694\uC18C\uC758 ''{1}'' \uC18D\uC131\uC5D0 \uB300\uD55C ''{2}'' \uAC12\uC774 \uACE0\uC815\uB41C '{'value constraint'}'\uC5D0 \uB300\uD574 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. \uC18D\uC131\uC758 \uAC12\uC740 ''{3}''\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. + cvc-complex-type.2.1 = cvc-complex-type.2.1: \uC720\uD615\uC758 \uCF58\uD150\uCE20 \uC720\uD615\uC774 \uBE44\uC5B4 \uC788\uC73C\uBBC0\uB85C ''{0}'' \uC694\uC18C\uC5D0\uB294 \uBB38\uC790 \uB610\uB294 \uC694\uC18C \uC815\uBCF4 \uD56D\uBAA9 [children]\uC774 \uC5C6\uC5B4\uC57C \uD569\uB2C8\uB2E4. + cvc-complex-type.2.2 = cvc-complex-type.2.2: ''{0}'' \uC694\uC18C\uC5D0\uB294 \uC694\uC18C [children]\uC774 \uC5C6\uC5B4\uC57C \uD558\uBA70 \uAC12\uC774 \uC801\uD569\uD574\uC57C \uD569\uB2C8\uB2E4. + cvc-complex-type.2.3 = cvc-complex-type.2.3: \uC720\uD615\uC758 \uCF58\uD150\uCE20 \uC720\uD615\uC774 \uC694\uC18C \uC804\uC6A9\uC774\uBBC0\uB85C ''{0}'' \uC694\uC18C\uC5D0\uB294 \uBB38\uC790 [children]\uC774 \uD3EC\uD568\uB420 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +@@ -74,22 +48,22 @@ + cvc-complex-type.3.2.2 = cvc-complex-type.3.2.2: ''{1}'' \uC18D\uC131\uC740 ''{0}'' \uC694\uC18C\uC5D0 \uB098\uD0C0\uB0A0 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + cvc-complex-type.4 = cvc-complex-type.4: ''{1}'' \uC18D\uC131\uC740 ''{0}'' \uC694\uC18C\uC5D0 \uB098\uD0C0\uB098\uC57C \uD569\uB2C8\uB2E4. + cvc-complex-type.5.1 = cvc-complex-type.5.1: ''{0}'' \uC694\uC18C\uC5D0\uC11C ''{1}'' \uC18D\uC131\uC774 \uB300\uCCB4 ID\uC774\uC9C0\uB9CC \uB300\uCCB4 ID ''{2}''\uC774(\uAC00) \uC774\uBBF8 \uC788\uC2B5\uB2C8\uB2E4. \uD558\uB098\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. +- cvc-complex-type.5.2 = cvc-complex-type.5.2: ''{0}'' \uC694\uC18C\uC5D0\uC11C ''{1}'' \uC18D\uC131\uC774 \uB300\uCCB4 ID\uC774\uC9C0\uB9CC ''{''attribute uses''}'' \uC911 ID\uC5D0\uC11C \uD30C\uC0DD\uB41C ''{2}'' \uC18D\uC131\uC774 \uC774\uBBF8 \uC788\uC2B5\uB2C8\uB2E4. ++ cvc-complex-type.5.2 = cvc-complex-type.5.2: ''{0}'' \uC694\uC18C\uC5D0\uC11C ''{1}'' \uC18D\uC131\uC774 \uB300\uCCB4 ID\uC774\uC9C0\uB9CC '{'attribute uses'}' \uC911 ID\uC5D0\uC11C \uD30C\uC0DD\uB41C ''{2}'' \uC18D\uC131\uC774 \uC774\uBBF8 \uC788\uC2B5\uB2C8\uB2E4. + cvc-datatype-valid.1.2.1 = cvc-datatype-valid.1.2.1: ''{0}''\uC740(\uB294) ''{1}''\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uAC12\uC774 \uC544\uB2D9\uB2C8\uB2E4. + cvc-datatype-valid.1.2.2 = cvc-datatype-valid.1.2.2: ''{0}''\uC740(\uB294) \uBAA9\uB85D \uC720\uD615 ''{1}''\uC758 \uC801\uD569\uD55C \uAC12\uC774 \uC544\uB2D9\uB2C8\uB2E4. + cvc-datatype-valid.1.2.3 = cvc-datatype-valid.1.2.3: ''{0}''\uC740(\uB294) \uD569\uC9D1\uD569 \uC720\uD615 ''{1}''\uC758 \uC801\uD569\uD55C \uAC12\uC774 \uC544\uB2D9\uB2C8\uB2E4. + cvc-elt.1 = cvc-elt.1: ''{0}'' \uC694\uC18C\uC758 \uC120\uC5B8\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +- cvc-elt.2 = cvc-elt.2: ''{0}''\uC5D0 \uB300\uD55C \uC694\uC18C \uC120\uC5B8\uC5D0\uC11C ''{''abstract''}''\uC758 \uAC12\uC740 false\uC5EC\uC57C \uD569\uB2C8\uB2E4. +- cvc-elt.3.1 = cvc-elt.3.1: ''{0}''\uC758 ''{''nillable''}'' \uC18D\uC131\uC774 false\uC774\uBBC0\uB85C ''{1}'' \uC18D\uC131\uC740 ''{0}'' \uC694\uC18C\uC5D0 \uB098\uD0C0\uB098\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4. ++ cvc-elt.2 = cvc-elt.2: ''{0}''\uC5D0 \uB300\uD55C \uC694\uC18C \uC120\uC5B8\uC5D0\uC11C '{'abstract'}'\uC758 \uAC12\uC740 false\uC5EC\uC57C \uD569\uB2C8\uB2E4. ++ cvc-elt.3.1 = cvc-elt.3.1: ''{0}''\uC758 '{'nillable'}' \uC18D\uC131\uC774 false\uC774\uBBC0\uB85C ''{1}'' \uC18D\uC131\uC740 ''{0}'' \uC694\uC18C\uC5D0 \uB098\uD0C0\uB098\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4. + cvc-elt.3.2.1 = cvc-elt.3.2.1: ''{1}''\uC774(\uAC00) \uC9C0\uC815\uB418\uC5C8\uC73C\uBBC0\uB85C ''{0}'' \uC694\uC18C\uC5D0\uB294 \uBB38\uC790 \uB610\uB294 \uC694\uC18C \uC815\uBCF4 [children]\uC774 \uD3EC\uD568\uB420 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +- cvc-elt.3.2.2 = cvc-elt.3.2.2: ''{1}''\uC774(\uAC00) \uC9C0\uC815\uB418\uC5C8\uC73C\uBBC0\uB85C ''{0}'' \uC694\uC18C\uC5D0 \uB300\uD574 \uACE0\uC815\uB41C ''{''value constraint''}''\uAC00 \uC5C6\uC5B4\uC57C \uD569\uB2C8\uB2E4. ++ cvc-elt.3.2.2 = cvc-elt.3.2.2: ''{1}''\uC774(\uAC00) \uC9C0\uC815\uB418\uC5C8\uC73C\uBBC0\uB85C ''{0}'' \uC694\uC18C\uC5D0 \uB300\uD574 \uACE0\uC815\uB41C '{'value constraint'}'\uAC00 \uC5C6\uC5B4\uC57C \uD569\uB2C8\uB2E4. + cvc-elt.4.1 = cvc-elt.4.1: ''{0}'' \uC694\uC18C\uC758 ''{1}'' \uC18D\uC131\uC5D0 \uB300\uD55C ''{2}'' \uAC12\uC740 \uC801\uD569\uD55C QName\uC774 \uC544\uB2D9\uB2C8\uB2E4. + cvc-elt.4.2 = cvc-elt.4.2: ''{1}''\uC744(\uB97C) ''{0}'' \uC694\uC18C\uC5D0 \uB300\uD55C \uC720\uD615 \uC815\uC758\uB85C \uBD84\uC11D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + cvc-elt.4.3 = cvc-elt.4.3: ''{1}'' \uC720\uD615\uC740 ''{0}'' \uC694\uC18C\uC758 \uC720\uD615 \uC815\uC758 ''{2}''\uC5D0\uC11C \uC801\uD569\uD558\uAC8C \uD30C\uC0DD\uB41C \uAC83\uC774 \uC544\uB2D9\uB2C8\uB2E4. +- cvc-elt.5.1.1 = cvc-elt.5.1.1: ''{0}'' \uC694\uC18C\uC758 ''{''value constraint''}'' ''{2}''\uC740(\uB294) ''{1}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uAE30\uBCF8\uAC12\uC774 \uC544\uB2D9\uB2C8\uB2E4. ++ cvc-elt.5.1.1 = cvc-elt.5.1.1: ''{0}'' \uC694\uC18C\uC758 '{'value constraint'}' ''{2}''\uC740(\uB294) ''{1}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uAE30\uBCF8\uAC12\uC774 \uC544\uB2D9\uB2C8\uB2E4. + cvc-elt.5.2.2.1 = cvc-elt.5.2.2.1: ''{0}'' \uC694\uC18C\uC5D0\uB294 \uC694\uC18C \uC815\uBCF4 \uD56D\uBAA9 [children]\uC774 \uC5C6\uC5B4\uC57C \uD569\uB2C8\uB2E4. +- cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: ''{0}'' \uC694\uC18C\uC758 ''{1}'' \uAC12\uC774 \uACE0\uC815\uB41C ''{''value constraint''}'' \uAC12 ''{2}''\uACFC(\uC640) \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. +- cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: ''{0}'' \uC694\uC18C\uC758 ''{1}'' \uAC12\uC774 ''{''value constraint''}'' \uAC12 ''{2}''\uACFC(\uC640) \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. ++ cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: ''{0}'' \uC694\uC18C\uC758 ''{1}'' \uAC12\uC774 \uACE0\uC815\uB41C '{'value constraint'}' \uAC12 ''{2}''\uACFC(\uC640) \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. ++ cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: ''{0}'' \uC694\uC18C\uC758 ''{1}'' \uAC12\uC774 '{'value constraint'}' \uAC12 ''{2}''\uACFC(\uC640) \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. + cvc-enumeration-valid = cvc-enumeration-valid: ''{0}'' \uAC12\uC740 ''{1}'' \uBAA9\uB85D\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uBA74\uC774 \uC544\uB2D9\uB2C8\uB2E4. \uBAA9\uB85D\uC758 \uAC12\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. + cvc-fractionDigits-valid = cvc-fractionDigits-valid: ''{0}'' \uAC12\uC758 \uC18C\uC218\uC810 \uC774\uD558 \uC790\uB9BF\uC218\uAC00 {1}\uC774\uC9C0\uB9CC \uC18C\uC218\uC810 \uC774\uD558 \uC790\uB9BF\uC218\uB294 {2}(\uC73C)\uB85C \uC81C\uD55C\uB418\uC5C8\uC2B5\uB2C8\uB2E4. + cvc-id.1 = cvc-id.1: IDREF ''{0}''\uC5D0 \uB300\uD55C ID/IDREF \uBC14\uC778\uB529\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. +@@ -168,10 +142,10 @@ + ag-props-correct.2 = ag-props-correct.2: \uC18D\uC131 \uADF8\uB8F9 ''{0}''\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC774\uB984 \uBC0F \uB300\uC0C1 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uB3D9\uC77C\uD55C \uC911\uBCF5 \uC18D\uC131 \uC0AC\uC6A9\uC774 \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC911\uBCF5 \uC18D\uC131 \uC0AC\uC6A9\uC758 \uC774\uB984\uC740 ''{1}''\uC785\uB2C8\uB2E4. + ag-props-correct.3 = ag-props-correct.3: \uC18D\uC131 \uADF8\uB8F9 ''{0}''\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uB450 \uAC1C\uC758 \uC18D\uC131 \uC120\uC5B8 ''{1}'' \uBC0F ''{2}''\uC5D0 ID\uC5D0\uC11C \uD30C\uC0DD\uB41C \uC720\uD615\uC774 \uC788\uC2B5\uB2C8\uB2E4. + a-props-correct.2 = a-props-correct.2: ''{0}'' \uC18D\uC131\uC758 \uAC12 \uC81C\uC57D \uC870\uAC74 \uAC12 ''{1}''\uC774(\uAC00) \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. +- a-props-correct.3 = a-props-correct.3: \uC18D\uC131\uC758 ''{''type definition''}''\uC774 ID\uC774\uAC70\uB098 ID\uC5D0\uC11C \uD30C\uC0DD\uB41C \uAC83\uC774\uBBC0\uB85C ''{0}'' \uC18D\uC131\uC740 ''fixed'' \uB610\uB294 ''default''\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +- au-props-correct.2 = au-props-correct.2: ''{0}''\uC758 \uC18D\uC131 \uC120\uC5B8\uC5D0\uC11C \uACE0\uC815\uB41C \uAC12 ''{1}''\uC774(\uAC00) \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uCC38\uC870\uD558\uB294 \uC18D\uC131 \uC0AC\uC6A9\uC5D0\uB3C4 ''{''value constraint''}''\uAC00 \uC788\uC744 \uACBD\uC6B0 \uACE0\uC815\uB418\uC5B4\uC57C \uD558\uBA70 \uAC12\uC740 ''{1}''\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. ++ a-props-correct.3 = a-props-correct.3: \uC18D\uC131\uC758 '{'type definition'}'\uC774 ID\uC774\uAC70\uB098 ID\uC5D0\uC11C \uD30C\uC0DD\uB41C \uAC83\uC774\uBBC0\uB85C ''{0}'' \uC18D\uC131\uC740 ''fixed'' \uB610\uB294 ''default''\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. ++ au-props-correct.2 = au-props-correct.2: ''{0}''\uC758 \uC18D\uC131 \uC120\uC5B8\uC5D0\uC11C \uACE0\uC815\uB41C \uAC12 ''{1}''\uC774(\uAC00) \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uCC38\uC870\uD558\uB294 \uC18D\uC131 \uC0AC\uC6A9\uC5D0\uB3C4 '{'value constraint'}'\uAC00 \uC788\uC744 \uACBD\uC6B0 \uACE0\uC815\uB418\uC5B4\uC57C \uD558\uBA70 \uAC12\uC740 ''{1}''\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. + cos-all-limited.1.2 = cos-all-limited.1.2: 'all' \uBAA8\uB378 \uADF8\uB8F9\uC774 '{'min occurs'}' = '{'max occurs'}' = 1\uC778 \uC870\uAC01\uC5D0 \uB098\uD0C0\uB098\uC57C \uD558\uBA70 \uD574\uB2F9 \uC870\uAC01\uC740 \uBCF5\uD569 \uC720\uD615 \uC815\uC758\uC758 '{'content type'}'\uC744 \uAD6C\uC131\uD558\uB294 \uC30D\uC758 \uC77C\uBD80\uC5EC\uC57C \uD569\uB2C8\uB2E4. +- cos-all-limited.2 = cos-all-limited.2: ''all'' \uBAA8\uB378 \uADF8\uB8F9\uC5D0 \uD3EC\uD568\uB41C \uC694\uC18C\uC758 ''{''max occurs''}''\uB294 0 \uB610\uB294 1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. ''{1}'' \uC694\uC18C\uC5D0 \uB300\uD55C ''{0}'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. ++ cos-all-limited.2 = cos-all-limited.2: ''all'' \uBAA8\uB378 \uADF8\uB8F9\uC5D0 \uD3EC\uD568\uB41C \uC694\uC18C\uC758 '{'max occurs'}'\uB294 0 \uB610\uB294 1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. ''{1}'' \uC694\uC18C\uC5D0 \uB300\uD55C ''{0}'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. + cos-applicable-facets = cos-applicable-facets: {1} \uC720\uD615\uC5D0\uC11C\uB294 ''{0}'' \uBA74\uC774 \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. + cos-ct-extends.1.1 = cos-ct-extends.1.1: ''{0}'' \uC720\uD615\uC740 ''{1}'' \uC720\uD615\uC5D0\uC11C \uD655\uC7A5\uC5D0 \uC758\uD574 \uD30C\uC0DD\uB418\uC5C8\uC9C0\uB9CC ''{1}''\uC758 ''final'' \uC18D\uC131\uC740 \uD655\uC7A5\uC5D0 \uC758\uD55C \uD30C\uC0DD\uC744 \uAE08\uC9C0\uD569\uB2C8\uB2E4. + cos-ct-extends.1.4.3.2.2.1.a = cos-ct-extends.1.4.3.2.2.1.a: \uD30C\uC0DD\uB41C \uC720\uD615\uACFC \uD574\uB2F9 \uAE30\uBCF8 \uC720\uD615\uC758 \uCF58\uD150\uCE20 \uC720\uD615\uC740 \uBAA8\uB450 \uD63C\uD569\uB418\uAC70\uB098 \uBAA8\uB450 \uC694\uC18C \uC804\uC6A9\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. ''{0}'' \uC720\uD615\uC740 \uC694\uC18C \uC804\uC6A9\uC774\uC9C0\uB9CC \uD574\uB2F9 \uAE30\uBCF8 \uC720\uD615\uC740 \uC694\uC18C \uC804\uC6A9\uC774 \uC544\uB2D9\uB2C8\uB2E4. +@@ -182,17 +156,17 @@ + cos-particle-restrict.a = cos-particle-restrict.a: \uD30C\uC0DD\uB41C \uC870\uAC01\uC774 \uBE44\uC5B4 \uC788\uC73C\uBBC0\uB85C \uAE30\uBCF8 \uC870\uAC01\uC744 \uBE44\uC6B8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + cos-particle-restrict.b = cos-particle-restrict.b: \uAE30\uBCF8 \uC870\uAC01\uC740 \uBE44\uC5B4 \uC788\uC9C0\uB9CC \uD30C\uC0DD\uB41C \uC870\uAC01\uC740 \uBE44\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. + cos-particle-restrict.2 = cos-particle-restrict.2: \uAE08\uC9C0\uB41C \uC870\uAC01 \uC81C\uD55C \uC0AC\uD56D: ''{0}''. +- cos-st-restricts.1.1 = cos-st-restricts.1.1: ''{1}'' \uC720\uD615\uC774 \uAE30\uBCF8 \uB2E8\uC704\uC774\uBBC0\uB85C \uD574\uB2F9 ''{''base type definition''}'' ''{0}''\uC740(\uB294) \uAE30\uBCF8 \uB2E8\uC21C \uC720\uD615 \uC815\uC758 \uB610\uB294 \uB0B4\uC7A5\uB41C \uAE30\uBCF8 \uB370\uC774\uD130 \uC720\uD615\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. ++ cos-st-restricts.1.1 = cos-st-restricts.1.1: ''{1}'' \uC720\uD615\uC774 \uAE30\uBCF8 \uB2E8\uC704\uC774\uBBC0\uB85C \uD574\uB2F9 '{'base type definition'}' ''{0}''\uC740(\uB294) \uAE30\uBCF8 \uB2E8\uC21C \uC720\uD615 \uC815\uC758 \uB610\uB294 \uB0B4\uC7A5\uB41C \uAE30\uBCF8 \uB370\uC774\uD130 \uC720\uD615\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4. + cos-st-restricts.2.1 = cos-st-restricts.2.1: \uBAA9\uB85D \uC720\uD615 ''{0}''\uC758 \uC815\uC758\uC5D0\uC11C ''{1}'' \uC720\uD615\uC740 \uBAA9\uB85D \uC720\uD615\uC774\uAC70\uB098 \uBAA9\uB85D\uC744 \uD3EC\uD568\uD558\uB294 \uD569\uC9D1\uD569 \uC720\uD615\uC774\uBBC0\uB85C \uBD80\uC801\uD569\uD55C \uD56D\uBAA9 \uC720\uD615\uC785\uB2C8\uB2E4. +- cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: ''{''item type definition''}'' ''{0}''\uC758 ''{''final''}'' \uAD6C\uC131 \uC694\uC18C\uC5D0 ''list''\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uBAA9\uB85D \uC720\uD615 ''{1}''\uC5D0 \uB300\uD55C \uD56D\uBAA9 \uC720\uD615\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +- cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: ''{''member type definitions''}'' ''{0}''\uC758 ''{''final''}'' \uAD6C\uC131 \uC694\uC18C\uC5D0 ''union''\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uD569\uC9D1\uD569 \uC720\uD615 ''{1}''\uC5D0 \uB300\uD55C \uBA64\uBC84 \uC720\uD615\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. ++ cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: '{'item type definition'}' ''{0}''\uC758 '{'final'}' \uAD6C\uC131 \uC694\uC18C\uC5D0 ''list''\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uBAA9\uB85D \uC720\uD615 ''{1}''\uC5D0 \uB300\uD55C \uD56D\uBAA9 \uC720\uD615\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. ++ cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: '{'member type definitions'}' ''{0}''\uC758 '{'final'}' \uAD6C\uC131 \uC694\uC18C\uC5D0 ''union''\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC744(\uB97C) \uD569\uC9D1\uD569 \uC720\uD615 ''{1}''\uC5D0 \uB300\uD55C \uBA64\uBC84 \uC720\uD615\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + cos-valid-default.2.1 = cos-valid-default.2.1: ''{0}'' \uC694\uC18C\uC5D0 \uAC12 \uC81C\uC57D \uC870\uAC74\uC774 \uC788\uC73C\uBBC0\uB85C \uD63C\uD569 \uB610\uB294 \uB2E8\uC21C \uCF58\uD150\uCE20 \uBAA8\uB378\uC774 \uD3EC\uD568\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4. +- cos-valid-default.2.2.2 = cos-valid-default.2.2.2: ''{0}'' \uC694\uC18C\uC5D0 ''{''value constraint''}''\uAC00 \uC788\uC73C\uBA70 \uD574\uB2F9 \uC720\uD615 \uC815\uC758\uC5D0 \uD63C\uD569 ''{''content type''}''\uC774 \uC788\uC73C\uBBC0\uB85C ''{''content type''}''\uC758 \uC870\uAC01\uC744 \uBE44\uC6B8 \uC218 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4. ++ cos-valid-default.2.2.2 = cos-valid-default.2.2.2: ''{0}'' \uC694\uC18C\uC5D0 '{'value constraint'}'\uAC00 \uC788\uC73C\uBA70 \uD574\uB2F9 \uC720\uD615 \uC815\uC758\uC5D0 \uD63C\uD569 '{'content type'}'\uC774 \uC788\uC73C\uBBC0\uB85C '{'content type'}'\uC758 \uC870\uAC01\uC744 \uBE44\uC6B8 \uC218 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4. + c-props-correct.2 = c-props-correct.2: keyref ''{0}''\uACFC(\uC640) \uD0A4 ''{1}''\uC5D0 \uB300\uD55C \uD544\uB4DC \uAE30\uC218\uB294 \uC11C\uB85C \uC77C\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4. + ct-props-correct.3 = ct-props-correct.3: \uBCF5\uD569 \uC720\uD615 ''{0}''\uC5D0 \uB300\uD55C \uC21C\uD658 \uC815\uC758\uAC00 \uAC10\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC740(\uB294) \uACE0\uC720\uD55C \uC720\uD615 \uACC4\uCE35\uC5D0 \uD3EC\uD568\uB41C \uAC83\uC774\uBA70 \uC774\uB294 \uC624\uB958\uC785\uB2C8\uB2E4. + ct-props-correct.4 = ct-props-correct.4: ''{0}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC774\uB984 \uBC0F \uB300\uC0C1 \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uB3D9\uC77C\uD55C \uC911\uBCF5 \uC18D\uC131 \uC0AC\uC6A9\uC774 \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC911\uBCF5 \uC18D\uC131 \uC0AC\uC6A9\uC758 \uC774\uB984\uC740 ''{1}''\uC785\uB2C8\uB2E4. + ct-props-correct.5 = ct-props-correct.5: ''{0}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uB450 \uAC1C\uC758 \uC18D\uC131 \uC120\uC5B8 ''{1}'' \uBC0F ''{2}''\uC5D0 ID\uC5D0\uC11C \uD30C\uC0DD\uB41C \uC720\uD615\uC774 \uC788\uC2B5\uB2C8\uB2E4. +- derivation-ok-restriction.1 = derivation-ok-restriction.1: ''{0}'' \uC720\uD615\uC740 ''{1}'' \uC720\uD615\uC5D0\uC11C \uC81C\uD55C \uC0AC\uD56D\uC5D0 \uC758\uD574 \uD30C\uC0DD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uD558\uC9C0\uB9CC ''{1}''\uC5D0\uB294 \uC81C\uD55C \uC0AC\uD56D\uC5D0 \uC758\uD55C \uD30C\uC0DD\uC744 \uAE08\uC9C0\uD558\uB294 ''{''final''}'' \uC18D\uC131\uC774 \uC788\uC2B5\uB2C8\uB2E4. ++ derivation-ok-restriction.1 = derivation-ok-restriction.1: ''{0}'' \uC720\uD615\uC740 ''{1}'' \uC720\uD615\uC5D0\uC11C \uC81C\uD55C \uC0AC\uD56D\uC5D0 \uC758\uD574 \uD30C\uC0DD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uD558\uC9C0\uB9CC ''{1}''\uC5D0\uB294 \uC81C\uD55C \uC0AC\uD56D\uC5D0 \uC758\uD55C \uD30C\uC0DD\uC744 \uAE08\uC9C0\uD558\uB294 '{'final'}' \uC18D\uC131\uC774 \uC788\uC2B5\uB2C8\uB2E4. + derivation-ok-restriction.2.1.1 = derivation-ok-restriction.2.1.1: ''{0}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC774 \uC720\uD615\uC758 \uC18D\uC131 \uC0AC\uC6A9 ''{1}''\uC5D0 \uB300\uD55C ''use'' \uAC12\uC774 ''{2}''\uC785\uB2C8\uB2E4. \uC774\uB294 \uAE30\uBCF8 \uC720\uD615\uC758 \uC77C\uCE58\uD558\uB294 \uC18D\uC131 \uC0AC\uC6A9\uC5D0 \uB300\uD55C \uAC12\uC778 ''required''\uC640 \uB2E4\uB985\uB2C8\uB2E4. + derivation-ok-restriction.2.1.2 = derivation-ok-restriction.2.1.2: ''{0}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC774 \uC720\uD615\uC758 \uC18D\uC131 \uC0AC\uC6A9 ''{1}''\uC5D0 \uB300\uD55C \uC720\uD615\uC774 ''{2}''\uC785\uB2C8\uB2E4. \uC774\uB294 \uAE30\uBCF8 \uC720\uD615\uC758 \uC77C\uCE58\uD558\uB294 \uC18D\uC131 \uC0AC\uC6A9\uC5D0 \uB300\uD55C \uC720\uD615\uC778 ''{3}''\uC5D0\uC11C \uC801\uD569\uD558\uAC8C \uD30C\uC0DD\uB41C \uAC83\uC774 \uC544\uB2D9\uB2C8\uB2E4. + derivation-ok-restriction.2.1.3.a = derivation-ok-restriction.2.1.3.a: ''{0}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC774 \uC720\uD615\uC758 \uC18D\uC131 \uC0AC\uC6A9 ''{1}''\uC5D0\uB294 \uACE0\uC815\uB418\uC9C0 \uC54A\uC740 \uC720\uD6A8\uD55C \uAC12 \uC81C\uC57D \uC870\uAC74\uC774 \uC788\uC73C\uBA70, \uAE30\uBCF8 \uC720\uD615\uC758 \uC77C\uCE58\uD558\uB294 \uC18D\uC131 \uC0AC\uC6A9\uC5D0 \uB300\uD55C \uC720\uD6A8\uD55C \uAC12 \uC81C\uC57D \uC870\uAC74\uC740 \uACE0\uC815\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. +@@ -210,8 +184,8 @@ + enumeration-required-notation = enumeration-required-notation: {2} ''{1}''\uC5D0 \uC0AC\uC6A9\uB418\uB294 NOTATION \uC720\uD615 ''{0}''\uC5D0\uB294 \uC774 \uC720\uD615\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uD45C\uAE30\uBC95 \uC694\uC18C\uB97C \uC9C0\uC815\uD558\uB294 \uBAA9\uB85D \uBA74 \uAC12\uC774 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4. + enumeration-valid-restriction = enumeration-valid-restriction: \uBAA9\uB85D \uAC12 ''{0}''\uC774(\uAC00) \uAE30\uBCF8 \uC720\uD615 {1}\uC758 \uAC12 \uACF5\uAC04\uC5D0 \uC5C6\uC2B5\uB2C8\uB2E4. + e-props-correct.2 = e-props-correct.2: ''{0}'' \uC694\uC18C\uC758 \uAC12 \uC81C\uC57D \uC870\uAC74 \uAC12 ''{1}''\uC774(\uAC00) \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. +- e-props-correct.4 = e-props-correct.4: ''{0}'' \uC694\uC18C\uC758 ''{''type definition''}''\uC774 substitutionHead ''{1}''\uC758 ''{''type definition''}''\uC5D0\uC11C \uC801\uD569\uD558\uAC8C \uD30C\uC0DD\uB41C \uAC83\uC774 \uC544\uB2C8\uAC70\uB098 ''{1}''\uC758 ''{''substitution group exclusions''}'' \uC18D\uC131\uC774 \uC774 \uD30C\uC0DD\uC744 \uD5C8\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. +- e-props-correct.5 = e-props-correct.5: \uC694\uC18C\uC758 ''{''type definition''}'' \uB610\uB294 ''{''type definition''}''\uC758 ''{''content type''}''\uC774 ID\uC774\uAC70\uB098 ID\uC5D0\uC11C \uD30C\uC0DD\uB41C \uAC83\uC774\uBBC0\uB85C ''{''value constraint''}''\uB294 ''{0}'' \uC694\uC18C\uC5D0 \uC5C6\uC5B4\uC57C \uD569\uB2C8\uB2E4. ++ e-props-correct.4 = e-props-correct.4: ''{0}'' \uC694\uC18C\uC758 '{'type definition'}'\uC774 substitutionHead ''{1}''\uC758 '{'type definition'}'\uC5D0\uC11C \uC801\uD569\uD558\uAC8C \uD30C\uC0DD\uB41C \uAC83\uC774 \uC544\uB2C8\uAC70\uB098 ''{1}''\uC758 '{'substitution group exclusions'}' \uC18D\uC131\uC774 \uC774 \uD30C\uC0DD\uC744 \uD5C8\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. ++ e-props-correct.5 = e-props-correct.5: \uC694\uC18C\uC758 '{'type definition'}' \uB610\uB294 '{'type definition'}'\uC758 '{'content type'}'\uC774 ID\uC774\uAC70\uB098 ID\uC5D0\uC11C \uD30C\uC0DD\uB41C \uAC83\uC774\uBBC0\uB85C '{'value constraint'}'\uB294 ''{0}'' \uC694\uC18C\uC5D0 \uC5C6\uC5B4\uC57C \uD569\uB2C8\uB2E4. + e-props-correct.6 = e-props-correct.6: ''{0}'' \uC694\uC18C\uC5D0 \uB300\uD55C \uC21C\uD658 \uB300\uCCB4 \uADF8\uB8F9\uC774 \uAC10\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4.. + fractionDigits-valid-restriction = fractionDigits-valid-restriction: {2}\uC758 \uC815\uC758\uC5D0\uC11C ''fractionDigits'' \uBA74\uC5D0 \uB300\uD55C ''{0}'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. \uC774 \uAC12\uC740 \uC870\uC0C1 \uC720\uD615 \uC911 \uD558\uB098\uC5D0\uC11C ''{1}''(\uC73C)\uB85C \uC124\uC815\uB41C ''fractionDigits''\uC5D0 \uB300\uD55C \uAC12\uBCF4\uB2E4 \uC791\uAC70\uB098 \uAC19\uC544\uC57C \uD569\uB2C8\uB2E4. + fractionDigits-totalDigits = fractionDigits-totalDigits: {2}\uC758 \uC815\uC758\uC5D0\uC11C ''fractionDigits'' \uBA74\uC5D0 \uB300\uD55C ''{0}'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. \uC774 \uAC12\uC740 ''totalDigits''\uC5D0 \uB300\uD55C \uAC12\uC778 ''{1}''\uBCF4\uB2E4 \uC791\uAC70\uB098 \uAC19\uC544\uC57C \uD569\uB2C8\uB2E4. +@@ -232,7 +206,7 @@ + maxInclusive-valid-restriction.3 = maxInclusive-valid-restriction.3: ''{2}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. maxInclusive \uAC12 = ''{0}''\uC740(\uB294) \uAE30\uBCF8 \uC720\uD615 ''{1}''\uC758 minInclusive\uBCF4\uB2E4 \uD06C\uAC70\uB098 \uAC19\uC544\uC57C \uD569\uB2C8\uB2E4. + maxInclusive-valid-restriction.4 = maxInclusive-valid-restriction.4: ''{2}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. maxInclusive \uAC12 = ''{0}''\uC740(\uB294) \uAE30\uBCF8 \uC720\uD615 ''{1}''\uC758 minExclusive\uBCF4\uB2E4 \uCEE4\uC57C \uD569\uB2C8\uB2E4. + maxLength-valid-restriction = maxLength-valid-restriction: {2}\uC758 \uC815\uC758\uC5D0\uC11C maxLength \uAC12 = ''{0}''\uC740(\uB294) \uAE30\uBCF8 \uC720\uD615 ''{1}''\uC758 \uAC12\uBCF4\uB2E4 \uC791\uAC70\uB098 \uAC19\uC544\uC57C \uD569\uB2C8\uB2E4. +- mg-props-correct.2 = mg-props-correct.2: ''{0}'' \uADF8\uB8F9\uC5D0 \uB300\uD55C \uC21C\uD658 \uC815\uC758\uAC00 \uAC10\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC21C\uD658\uC801\uC73C\uB85C \uB4A4\uC5D0 \uC624\uB294 ''{''term''}'' \uC870\uAC01 \uAC12\uC774 ''{''term''}''\uC774 \uADF8\uB8F9 \uC790\uC2E0\uC778 \uC870\uAC01\uC5D0 \uB3C4\uB2EC\uD569\uB2C8\uB2E4. ++ mg-props-correct.2 = mg-props-correct.2: ''{0}'' \uADF8\uB8F9\uC5D0 \uB300\uD55C \uC21C\uD658 \uC815\uC758\uAC00 \uAC10\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC21C\uD658\uC801\uC73C\uB85C \uB4A4\uC5D0 \uC624\uB294 '{'term'}' \uC870\uAC01 \uAC12\uC774 '{'term'}'\uC774 \uADF8\uB8F9 \uC790\uC2E0\uC778 \uC870\uAC01\uC5D0 \uB3C4\uB2EC\uD569\uB2C8\uB2E4. + minExclusive-less-than-equal-to-maxExclusive = minExclusive-less-than-equal-to-maxExclusive: {2}\uC758 \uC815\uC758\uC5D0\uC11C minExclusive \uAC12 = ''{0}''\uC740(\uB294) maxExclusive \uAC12 = ''{1}''\uBCF4\uB2E4 \uC791\uAC70\uB098 \uAC19\uC544\uC57C \uD569\uB2C8\uB2E4. + minExclusive-less-than-maxInclusive = minExclusive-less-than-maxInclusive: {2}\uC758 \uC815\uC758\uC5D0\uC11C minExclusive \uAC12 = ''{0}''\uC740(\uB294) maxInclusive \uAC12 = ''{1}''\uBCF4\uB2E4 \uC791\uC544\uC57C \uD569\uB2C8\uB2E4. + minExclusive-valid-restriction.1 = minExclusive-valid-restriction.1: ''{2}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. minExclusive \uAC12 = ''{0}''\uC740(\uB294) \uAE30\uBCF8 \uC720\uD615 ''{1}''\uC758 minExclusive\uBCF4\uB2E4 \uD06C\uAC70\uB098 \uAC19\uC544\uC57C \uD569\uB2C8\uB2E4. +@@ -249,20 +223,20 @@ + minLength-less-than-equal-to-maxLength = minLength-less-than-equal-to-maxLength: {2}\uC758 \uC815\uC758\uC5D0\uC11C minLength \uAC12 = ''{0}''\uC740(\uB294) maxLength \uAC12 = ''{1}''\uBCF4\uB2E4 \uC791\uC544\uC57C \uD569\uB2C8\uB2E4. + minLength-valid-restriction = minLength-valid-restriction: {2}\uC758 \uC815\uC758\uC5D0\uC11C minLength = ''{0}''\uC740(\uB294) \uAE30\uBCF8 \uC720\uD615 ''{1}''\uC758 \uAC12\uBCF4\uB2E4 \uD06C\uAC70\uB098 \uAC19\uC544\uC57C \uD569\uB2C8\uB2E4. + no-xmlns = no-xmlns: \uC18D\uC131 \uC120\uC5B8\uC758 {name}\uC740 'xmlns'\uC640 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4. +- no-xsi = no-xsi: \uC18D\uC131 \uC120\uC5B8\uC758 ''{''target namespace''}''\uB294 ''{0}''\uACFC(\uC640) \uC77C\uCE58\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4. ++ no-xsi = no-xsi: \uC18D\uC131 \uC120\uC5B8\uC758 '{'target namespace'}'\uB294 ''{0}''\uACFC(\uC640) \uC77C\uCE58\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4. + p-props-correct.2.1 = p-props-correct.2.1: ''{0}''\uC758 \uC120\uC5B8\uC5D0\uC11C ''minOccurs'' \uAC12\uC774 ''{1}''\uC774\uC9C0\uB9CC \uC774 \uAC12\uC740 ''maxOccurs'' \uAC12 ''{2}''\uBCF4\uB2E4 \uD06C\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4. + rcase-MapAndSum.1 = rcase-MapAndSum.1: \uC870\uAC01 \uAC04 \uC804\uCCB4 \uAE30\uB2A5 \uB9E4\uD551\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. + rcase-MapAndSum.2 = rcase-MapAndSum.2: \uADF8\uB8F9\uC758 \uBC1C\uC0DD \uBC94\uC704({0},{1})\uAC00 \uAE30\uBCF8 \uADF8\uB8F9\uC758 \uBC1C\uC0DD \uBC94\uC704({2},{3})\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uC81C\uD55C \uC0AC\uD56D\uC774 \uC544\uB2D9\uB2C8\uB2E4. + rcase-NameAndTypeOK.1 = rcase-NameAndTypeOK.1: \uC694\uC18C\uC5D0 \uB3D9\uC77C\uD558\uC9C0 \uC54A\uC740 \uC774\uB984 \uBC0F \uB300\uC0C1 \uB124\uC784\uC2A4\uD398\uC774\uC2A4(''{1}'' \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC758 ''{0}'' \uC694\uC18C \uBC0F ''{3}'' \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uC758 ''{2}'' \uC694\uC18C)\uAC00 \uC788\uC2B5\uB2C8\uB2E4. +- rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: ''{''term''}''\uC774 \uC694\uC18C \uC120\uC5B8 ''{0}''\uC778 \uC870\uAC01\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC694\uC18C \uC120\uC5B8\uC758 ''{''nillable''}''\uC774 true\uC774\uC9C0\uB9CC \uAE30\uBCF8 \uC720\uD615\uC758 \uD574\uB2F9 \uC870\uAC01\uC5D0 ''{''nillable''}''\uC774 false\uC778 \uC694\uC18C \uC120\uC5B8\uC774 \uC788\uC2B5\uB2C8\uB2E4. +- rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: ''{''term''}''\uC774 \uC694\uC18C \uC120\uC5B8 ''{0}''\uC778 \uC870\uAC01\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uBC18\uBCF5 \uBC94\uC704({1},{2})\uAC00 \uAE30\uBCF8 \uC720\uD615\uC5D0 \uC788\uB294 \uD574\uB2F9 \uC870\uAC01\uC758 \uBC94\uC704({3},{4})\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uC81C\uD55C \uC0AC\uD56D\uC774 \uC544\uB2D9\uB2C8\uB2E4. ++ rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: '{'term'}'\uC774 \uC694\uC18C \uC120\uC5B8 ''{0}''\uC778 \uC870\uAC01\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC694\uC18C \uC120\uC5B8\uC758 '{'nillable'}'\uC774 true\uC774\uC9C0\uB9CC \uAE30\uBCF8 \uC720\uD615\uC758 \uD574\uB2F9 \uC870\uAC01\uC5D0 '{'nillable'}'\uC774 false\uC778 \uC694\uC18C \uC120\uC5B8\uC774 \uC788\uC2B5\uB2C8\uB2E4. ++ rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: '{'term'}'\uC774 \uC694\uC18C \uC120\uC5B8 ''{0}''\uC778 \uC870\uAC01\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uBC18\uBCF5 \uBC94\uC704({1},{2})\uAC00 \uAE30\uBCF8 \uC720\uD615\uC5D0 \uC788\uB294 \uD574\uB2F9 \uC870\uAC01\uC758 \uBC94\uC704({3},{4})\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uC81C\uD55C \uC0AC\uD56D\uC774 \uC544\uB2D9\uB2C8\uB2E4. + rcase-NameAndTypeOK.4.a = rcase-NameAndTypeOK.4.a: ''{0}'' \uC694\uC18C\uB294 \uACE0\uC815\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC9C0\uB9CC \uAE30\uBCF8 \uC720\uD615\uC758 \uD574\uB2F9 \uC694\uC18C\uB294 ''{1}'' \uAC12\uC73C\uB85C \uACE0\uC815\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. + rcase-NameAndTypeOK.4.b = rcase-NameAndTypeOK.4.b: ''{0}'' \uC694\uC18C\uB294 ''{1}'' \uAC12\uC73C\uB85C \uACE0\uC815\uB418\uC5B4 \uC788\uC9C0\uB9CC \uAE30\uBCF8 \uC720\uD615\uC758 \uD574\uB2F9 \uC694\uC18C\uB294 ''{2}'' \uAC12\uC73C\uB85C \uACE0\uC815\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. + rcase-NameAndTypeOK.5 = rcase-NameAndTypeOK.5: ''{0}'' \uC694\uC18C\uC5D0 \uB300\uD55C ID \uC81C\uC57D \uC870\uAC74\uC740 \uAE30\uBCF8 \uC720\uD615\uC758 ID \uC81C\uC57D \uC870\uAC74\uC5D0 \uB300\uD55C \uBD80\uBD84 \uC9D1\uD569\uC774 \uC544\uB2D9\uB2C8\uB2E4. + rcase-NameAndTypeOK.6 = rcase-NameAndTypeOK.6: ''{0}'' \uC694\uC18C\uC5D0 \uB300\uD574 \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uB294 \uB300\uCCB4\uB294 \uAE30\uBCF8 \uC720\uD615\uC758 \uD574\uB2F9 \uB300\uCCB4\uC5D0 \uB300\uD55C \uB300\uC9D1\uD569\uC774 \uC544\uB2D9\uB2C8\uB2E4. + rcase-NameAndTypeOK.7 = rcase-NameAndTypeOK.7: ''{0}'' \uC694\uC18C\uC758 \uC720\uD615 ''{1}''\uC740(\uB294) \uAE30\uBCF8 \uC694\uC18C\uC758 \uC720\uD615 ''{2}''\uC5D0\uC11C \uD30C\uC0DD\uB41C \uAC83\uC774 \uC544\uB2D9\uB2C8\uB2E4. + rcase-NSCompat.1 = rcase-NSCompat.1: ''{0}'' \uC694\uC18C\uC5D0\uB294 \uAE30\uBCF8 \uC720\uD615\uC758 \uC640\uC77C\uB4DC \uCE74\uB4DC \uBB38\uC790\uC5D0\uC11C \uD5C8\uC6A9\uD558\uC9C0 \uC54A\uB294 ''{1}'' \uB124\uC784\uC2A4\uD398\uC774\uC2A4\uAC00 \uC788\uC2B5\uB2C8\uB2E4. +- rcase-NSCompat.2 = rcase-NSCompat.2: ''{''term''}''\uC774 \uC694\uC18C \uC120\uC5B8 ''{0}''\uC778 \uC870\uAC01\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uBC18\uBCF5 \uBC94\uC704({1},{2})\uAC00 \uAE30\uBCF8 \uC720\uD615\uC5D0 \uC788\uB294 \uD574\uB2F9 \uC870\uAC01\uC758 \uBC94\uC704({3},{4})\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uC81C\uD55C \uC0AC\uD56D\uC774 \uC544\uB2D9\uB2C8\uB2E4. ++ rcase-NSCompat.2 = rcase-NSCompat.2: '{'term'}'\uC774 \uC694\uC18C \uC120\uC5B8 ''{0}''\uC778 \uC870\uAC01\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uBC18\uBCF5 \uBC94\uC704({1},{2})\uAC00 \uAE30\uBCF8 \uC720\uD615\uC5D0 \uC788\uB294 \uD574\uB2F9 \uC870\uAC01\uC758 \uBC94\uC704({3},{4})\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uC81C\uD55C \uC0AC\uD56D\uC774 \uC544\uB2D9\uB2C8\uB2E4. + rcase-NSRecurseCheckCardinality.1 = rcase-NSRecurseCheckCardinality.1: \uC870\uAC01 \uAC04 \uC804\uCCB4 \uAE30\uB2A5 \uB9E4\uD551\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. + rcase-NSRecurseCheckCardinality.2 = rcase-NSRecurseCheckCardinality.2: \uADF8\uB8F9\uC758 \uBC1C\uC0DD \uBC94\uC704({0},{1})\uAC00 \uAE30\uBCF8 \uC640\uC77C\uB4DC \uCE74\uB4DC \uBB38\uC790\uC758 \uBC94\uC704({2},{3})\uC5D0 \uB300\uD574 \uC801\uD569\uD55C \uC81C\uD55C \uC0AC\uD56D\uC774 \uC544\uB2D9\uB2C8\uB2E4. + rcase-NSSubset.1 = rcase-NSSubset.1: \uC640\uC77C\uB4DC \uCE74\uB4DC \uBB38\uC790\uAC00 \uAE30\uBCF8 \uC720\uD615\uC758 \uD574\uB2F9 \uC640\uC77C\uB4DC \uCE74\uB4DC \uBB38\uC790\uC5D0 \uB300\uD55C \uBD80\uBD84 \uC9D1\uD569\uC774 \uC544\uB2D9\uB2C8\uB2E4. +@@ -278,7 +252,7 @@ + # src-redefine.1 = src-redefine.1: The component ''{0}'' is begin redefined, but its corresponding component isn't in the schema document being redefined (with namespace ''{2}''), but in a different document, with namespace ''{1}''. + sch-props-correct.2 = sch-props-correct.2: \uC2A4\uD0A4\uB9C8\uC5D0\uB294 \uB3D9\uC77C\uD55C \uC774\uB984\uC744 \uAC00\uC9C4 \uB450 \uAC1C\uC758 \uC804\uC5ED \uAD6C\uC131 \uC694\uC18C\uAC00 \uD3EC\uD568\uB420 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774 \uC2A4\uD0A4\uB9C8\uC5D0\uB294 \uB450 \uAC1C\uC758 ''{0}''\uC774(\uAC00) \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. + st-props-correct.2 = st-props-correct.2: \uB2E8\uC21C \uC720\uD615 ''{0}''\uC5D0 \uB300\uD55C \uC21C\uD658 \uC815\uC758\uAC00 \uAC10\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB530\uB77C\uC11C ''{0}''\uC740(\uB294) \uACE0\uC720\uD55C \uC720\uD615 \uACC4\uCE35\uC5D0 \uD3EC\uD568\uB41C \uAC83\uC774\uBA70 \uC774\uB294 \uC624\uB958\uC785\uB2C8\uB2E4. +- st-props-correct.3 = st-props-correct.3: ''{0}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. ''{''base type definition''}'' ''{1}''\uC758 ''{''final''}'' \uAC12\uC740 \uC81C\uD55C \uC0AC\uD56D\uC5D0 \uC758\uD55C \uD30C\uC0DD\uC744 \uAE08\uC9C0\uD569\uB2C8\uB2E4. ++ st-props-correct.3 = st-props-correct.3: ''{0}'' \uC720\uD615\uC5D0 \uB300\uD574 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. '{'base type definition'}' ''{1}''\uC758 '{'final'}' \uAC12\uC740 \uC81C\uD55C \uC0AC\uD56D\uC5D0 \uC758\uD55C \uD30C\uC0DD\uC744 \uAE08\uC9C0\uD569\uB2C8\uB2E4. + totalDigits-valid-restriction = totalDigits-valid-restriction: {2}\uC758 \uC815\uC758\uC5D0\uC11C ''totalDigits'' \uBA74\uC5D0 \uB300\uD55C ''{0}'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. \uC774 \uAC12\uC740 \uC870\uC0C1 \uC720\uD615 \uC911 \uD558\uB098\uC5D0\uC11C ''{1}''(\uC73C)\uB85C \uC124\uC815\uB41C ''totalDigits''\uC5D0 \uB300\uD55C \uAC12\uBCF4\uB2E4 \uC791\uAC70\uB098 \uAC19\uC544\uC57C \uD569\uB2C8\uB2E4. + whiteSpace-valid-restriction.1 = whiteSpace-valid-restriction.1: {0}\uC758 \uC815\uC758\uC5D0\uC11C ''whitespace'' \uBA74\uC5D0 \uB300\uD55C ''{1}'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. ''whitespace''\uC5D0 \uB300\uD55C \uAC12\uC774 \uC870\uC0C1 \uC720\uD615 \uC911 \uD558\uB098\uC5D0\uC11C ''collapse''\uB85C \uC124\uC815\uB418\uC5C8\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4. + whiteSpace-valid-restriction.2 = whiteSpace-valid-restriction.2: {0}\uC758 \uC815\uC758\uC5D0\uC11C ''whitespace'' \uBA74\uC5D0 \uB300\uD55C ''preserve'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. ''whitespace''\uC5D0 \uB300\uD55C \uAC12\uC774 \uC870\uC0C1 \uC720\uD615 \uC911 \uD558\uB098\uC5D0\uC11C ''replace''\uB85C \uC124\uC815\uB418\uC5C8\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4. +@@ -306,7 +280,7 @@ + c-selector-xpath = c-selector-xpath: \uC120\uD0DD\uAE30 \uAC12 = ''{0}''\uC774(\uAC00) \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. \uC120\uD0DD\uAE30 XPath\uC5D0\uB294 \uC18D\uC131\uC774 \uD3EC\uD568\uB420 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + EmptyTargetNamespace = EmptyTargetNamespace: \uC2A4\uD0A4\uB9C8 \uBB38\uC11C ''{0}''\uC758 ''targetNamespace'' \uC18D\uC131\uAC12\uC740 \uBE48 \uBB38\uC790\uC5F4\uC77C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + FacetValueFromBase = FacetValueFromBase: ''{0}'' \uC720\uD615\uC758 \uC120\uC5B8\uC5D0\uC11C ''{2}'' \uBA74\uC758 ''{1}'' \uAC12\uC740 \uAE30\uBCF8 \uC720\uD615 ''{3}''\uC758 \uAC12 \uACF5\uBC31\uC5D0\uC11C \uC640\uC57C \uD569\uB2C8\uB2E4. +- FixedFacetValue = FixedFacetValue: {3}\uC758 \uC815\uC758\uC5D0\uC11C ''{0}'' \uBA74\uC5D0 \uB300\uD55C ''{1}'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. ''{0}''\uC5D0 \uB300\uD55C \uAC12\uC774 \uC870\uC0C1 \uC720\uD615 \uC911 \uD558\uB098\uC5D0\uC11C ''{2}''(\uC73C)\uB85C \uC124\uC815\uB418\uC5C8\uC73C\uBA70 ''{''fixed''}'' = true\uC774\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4. ++ FixedFacetValue = FixedFacetValue: {3}\uC758 \uC815\uC758\uC5D0\uC11C ''{0}'' \uBA74\uC5D0 \uB300\uD55C ''{1}'' \uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4. ''{0}''\uC5D0 \uB300\uD55C \uAC12\uC774 \uC870\uC0C1 \uC720\uD615 \uC911 \uD558\uB098\uC5D0\uC11C ''{2}''(\uC73C)\uB85C \uC124\uC815\uB418\uC5C8\uC73C\uBA70 '{'fixed'}' = true\uC774\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4. + InvalidRegex = InvalidRegex: \uD328\uD134 \uAC12 ''{0}''\uC740(\uB294) \uC801\uD569\uD55C \uC815\uADDC \uD45C\uD604\uC2DD\uC774 \uC544\uB2D9\uB2C8\uB2E4. ''{2}'' \uC5F4\uC5D0\uC11C ''{1}'' \uC624\uB958\uAC00 \uBCF4\uACE0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. + maxOccurLimit = \uAD6C\uBB38 \uBD84\uC11D\uAE30\uC758 \uD604\uC7AC \uAD6C\uC131\uC5D0\uC11C maxOccurs \uC18D\uC131\uAC12\uC744 {0} \uAC12\uBCF4\uB2E4 \uD06C\uAC8C \uC124\uC815\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + PublicSystemOnNotation = PublicSystemOnNotation: \uD558\uB098 \uC774\uC0C1\uC758 ''public''\uACFC ''system''\uC774 ''notation'' \uC694\uC18C\uC5D0 \uB098\uD0C0\uB098\uC57C \uD569\uB2C8\uB2E4. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_pt_BR.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_pt_BR.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,32 +1,6 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file contains error and warning messages related to XML Schema + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XMLSchemaMessages_pt_BR.properties /st_wptg_1.8.0.0.0jdk/3 2013/09/11 12:46:54 gmolloy Exp $ + + BadMessageKey = N\u00E3o foi poss\u00EDvel encontrar a mensagem de erro correspondente \u00E0 chave da mensagem. + FormatFailed = Ocorreu um erro interno ao formatar a mensagem a seguir:\n +@@ -60,7 +34,7 @@ + #validation (3.X.4) + + cvc-attribute.3 = cvc-attribute.3: O valor ''{2}'' do atributo ''{1}'' no elemento ''{0}'' n\u00E3o \u00E9 v\u00E1lido em rela\u00E7\u00E3o ao seu tipo, ''{3}''. +- cvc-attribute.4 = cvc-attribute.4: O valor ''{2}'' do atributo ''{1}'' no elemento ''{0}'' n\u00E3o \u00E9 v\u00E1lido em rela\u00E7\u00E3o \u00E0 sua ''{''value constraint''}'' fixa. O atributo deve ter um valor ''{3}''. ++ cvc-attribute.4 = cvc-attribute.4: O valor ''{2}'' do atributo ''{1}'' no elemento ''{0}'' n\u00E3o \u00E9 v\u00E1lido em rela\u00E7\u00E3o \u00E0 sua '{'value constraint'}' fixa. O atributo deve ter um valor ''{3}''. + cvc-complex-type.2.1 = cvc-complex-type.2.1: O elemento ''{0}'' n\u00E3o deve ter um caractere ou um item com informa\u00E7\u00F5es do elemento [children] porque o tipo de conte\u00FAdo do tipo \u00E9 vazio. + cvc-complex-type.2.2 = cvc-complex-type.2.2: O elemento ''{0}'' n\u00E3o deve ter um elemento [children] e o valor deve ser v\u00E1lido. + cvc-complex-type.2.3 = cvc-complex-type.2.3: O elemento ''{0}'' n\u00E3o pode ter um caractere [children] porque o tipo de conte\u00FAdo do tipo \u00E9 somente elemento. +@@ -74,22 +48,22 @@ + cvc-complex-type.3.2.2 = cvc-complex-type.3.2.2: O atributo ''{1}'' n\u00E3o pode aparecer no elemento ''{0}''. + cvc-complex-type.4 = cvc-complex-type.4: O atributo ''{1}'' deve aparecer no elemento ''{0}''. + cvc-complex-type.5.1 = cvc-complex-type.5.1: No elemento ''{0}'', o atributo ''{1}'' \u00E9 um ID Curinga, mas j\u00E1 existe um ID Curinga ''{2}''. Pode haver somente um. +- cvc-complex-type.5.2 = cvc-complex-type.5.2: No elemento, ''{0}'', o atributo ''{1}'' \u00E9 um ID Curinga, mas j\u00E1 existe um atributo ''{2}'' obtido do ID entre os ''{''attribute uses''}''. ++ cvc-complex-type.5.2 = cvc-complex-type.5.2: No elemento, ''{0}'', o atributo ''{1}'' \u00E9 um ID Curinga, mas j\u00E1 existe um atributo ''{2}'' obtido do ID entre os '{'attribute uses'}'. + cvc-datatype-valid.1.2.1 = cvc-datatype-valid.1.2.1: ''{0}'' n\u00E3o \u00E9 um valor v\u00E1lido para ''{1}''. + cvc-datatype-valid.1.2.2 = cvc-datatype-valid.1.2.2: ''{0}'' n\u00E3o \u00E9 um valor v\u00E1lido do tipo de lista ''{1}''. + cvc-datatype-valid.1.2.3 = cvc-datatype-valid.1.2.3: ''{0}'' n\u00E3o \u00E9 um valor v\u00E1lido do tipo de uni\u00E3o ''{1}''. + cvc-elt.1 = cvc-elt.1: N\u00E3o pode localizar a declara\u00E7\u00E3o do elemento ''{0}''. + cvc-elt.2 = cvc-elt.2: O valor de "{"abstract"}" na declara\u00E7\u00E3o do elemento para ''{0}'' deve ser falso. +- cvc-elt.3.1 = cvc-elt.3.1: O atributo ''{1}'' n\u00E3o deve aparecer no elemento ''{0}'' porque a propriedade ''{''nillable''}'' de ''{0}'' \u00E9 falsa. ++ cvc-elt.3.1 = cvc-elt.3.1: O atributo ''{1}'' n\u00E3o deve aparecer no elemento ''{0}'' porque a propriedade '{'nillable'}' de ''{0}'' \u00E9 falsa. + cvc-elt.3.2.1 = cvc-elt.3.2.1: O elemento ''{0}'' n\u00E3o pode ter informa\u00E7\u00F5es de caractere ou de elemento [children] porque ''{1}'' foi especificado. + cvc-elt.3.2.2 = cvc-elt.3.2.2: N\u00E3o deve haver "{"value constraint"}" fixo para o elemento ''{0}'' porque ''{1}'' foi especificado. + cvc-elt.4.1 = cvc-elt.4.1: O valor ''{2}'' do atributo ''{1}'' do elemento ''{0}'' n\u00E3o \u00E9 um QName v\u00E1lido. + cvc-elt.4.2 = cvc-elt.4.2: N\u00E3o \u00E9 poss\u00EDvel resolver ''{1}'' para uma defini\u00E7\u00E3o de tipo de elemento ''{0}''. + cvc-elt.4.3 = cvc-elt.4.3: O tipo ''{1}'' n\u00E3o \u00E9 obtido de forma v\u00E1lida da defini\u00E7\u00E3o do tipo, ''{2}'', do elemento ''{0}''. +- cvc-elt.5.1.1 = cvc-elt.5.1.1: "{"value constraint"}" ''{2}'' do elemento ''{0}'' n\u00E3o \u00E9 um valor default v\u00E1lido para o tipo ''{1}''. ++ cvc-elt.5.1.1 = cvc-elt.5.1.1: "{"value constraint"}" ''{2}'' do elemento ''{0}'' n\u00E3o \u00E9 um valor padr\u00E3o v\u00E1lido para o tipo ''{1}''. + cvc-elt.5.2.2.1 = cvc-elt.5.2.2.1: O elemento ''{0}'' n\u00E3o deve ter item de informa\u00E7\u00F5es do elemento [children]. +- cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: O valor ''{1}'' do elemento ''{0}'' n\u00E3o corresponde ao valor fixo de ''{''value constraint''}'' ''{2}''. +- cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: O valor ''{1}'' do elemento ''{0}'' n\u00E3o corresponde ao valor de ''{''value constraint''}'' ''{2}'' . ++ cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: O valor ''{1}'' do elemento ''{0}'' n\u00E3o corresponde ao valor fixo de '{'value constraint'}' ''{2}''. ++ cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: O valor ''{1}'' do elemento ''{0}'' n\u00E3o corresponde ao valor de '{'value constraint'}' ''{2}'' . + cvc-enumeration-valid = cvc-enumeration-valid: O valor ''{0}'' n\u00E3o tem um aspecto v\u00E1lido em rela\u00E7\u00E3o \u00E0 enumera\u00E7\u00E3o ''{1}''. Deve ser um valor da enumera\u00E7\u00E3o. + cvc-fractionDigits-valid = cvc-fractionDigits-valid: O valor ''{0}'' tem {1} d\u00EDgitos fracion\u00E1rios, mas o n\u00FAmero de d\u00EDgitos fracion\u00E1rios foi limitado a {2}. + cvc-id.1 = cvc-id.1: N\u00E3o h\u00E1 associa\u00E7\u00E3o de ID/IDREF para IDREF ''{0}''. +@@ -114,8 +88,8 @@ + schema_reference.access = schema_reference: falha ao ler o documento de esquema ''{0}'' porque o acesso a ''{1}'' n\u00E3o \u00E9 permitido em decorr\u00EAncia de uma restri\u00E7\u00E3o definida pela propriedade accessExternalSchema. + schema_reference.4 = schema_reference.4: Falha ao ler o documento do esquema ''{0}'' porque 1) n\u00E3o foi poss\u00EDvel encontrar o documento; 2) n\u00E3o foi poss\u00EDvel ler o documento; 3) o elemento-raiz do documento n\u00E3o \u00E9 . + src-annotation = src-annotation: os elementos de podem conter somente os elementos e , mas foi encontrado ''{0}''. +- src-attribute.1 = src-attribute.1: As propriedades ''default'' e ''fixed'' n\u00E3o podem estar presentes na declara\u00E7\u00E3o do atributo ''{0}''. Use somente uma delas. +- src-attribute.2 = src-attribute.2: : A propriedade ''default'' est\u00E1 presente no atributo ''{0}''. Dessa forma, o valor de ''use'' deve ser ''optional''. ++ src-attribute.1 = src-attribute.1: As propriedades ''padr\u00E3o'' e ''fixed'' n\u00E3o podem estar presentes na declara\u00E7\u00E3o do atributo ''{0}''. Use somente uma delas. ++ src-attribute.2 = src-attribute.2: : A propriedade ''padr\u00E3o'' est\u00E1 presente no atributo ''{0}''. Dessa forma, o valor de ''use'' deve ser ''optional''. + src-attribute.3.1 = src-attribute.3.1: 'ref' ou 'name' deve estar presente na declara\u00E7\u00E3o do atributo de local. + src-attribute.3.2 = src-attribute.3.2: O conte\u00FAdo deve corresponder a (annotation?) da refer\u00EAncia do atributo ''{0}''. + src-attribute.4 = src-attribute.4: O atributo ''{0}'' tem um atributo ''type'' e um ''simpleType'' filho an\u00F4nimo. Somente um deles \u00E9 permitido para um atributo. +@@ -126,7 +100,7 @@ + src-ct.2.2 = src-ct.2.2: Erro de Representa\u00E7\u00E3o de Defini\u00E7\u00E3o do Tipo Complexo do tipo ''{0}''. Quando um complexType com simpleContent \u00E9 restrito a um complexType com conte\u00FAdo misto e part\u00EDcula esvazi\u00E1vel, ent\u00E3o deve haver um entre os filhos de . + src-ct.4 = src-ct.4: Erro de Representa\u00E7\u00E3o de Defini\u00E7\u00E3o de Tipo Complexo do tipo ''{0}''. A intersec\u00E7\u00E3o de curingas n\u00E3o \u00E9 express\u00EDvel. + src-ct.5 = src-ct.5: Erro de Representa\u00E7\u00E3o da Defini\u00E7\u00E3o do Tipo Complexo do tipo ''{0}''. A uni\u00E3o de curingas n\u00E3o \u00E9 express\u00EDvel. +- src-element.1 = src-element.1: As propriedades ''default'' e ''fixed'' n\u00E3o podem estar presentes na declara\u00E7\u00E3o do elemento ''{0}''. Use somente uma delas. ++ src-element.1 = src-element.1: As propriedades ''padr\u00E3o'' e ''fixed'' n\u00E3o podem estar presentes na declara\u00E7\u00E3o do elemento ''{0}''. Use somente uma delas. + src-element.2.1 = src-attribute.2.1: 'ref' ou 'name' deve estar presente na declara\u00E7\u00E3o de elemento do local. + src-element.2.2 = src-element.2.2: Como ''{0}'' cont\u00E9m o atributo ''ref'', seu conte\u00FAdo deve ser correspondente (annotation?). No entanto, ''{1}'' foi encontrado. + src-element.3 = src-element.3: O elemento ''{0}'' tem um atributo ''type'' e um filho ''anonymous type''. Somente um deles \u00E9 permitido para um elemento. +@@ -168,8 +142,8 @@ + ag-props-correct.2 = ag-props-correct.2: Erro do grupo de atributos ''{0}''. Os usos do atributo duplicado com o mesmo nome e namespace de destino foram especificados. O nome de uso do atributo duplicado \u00E9 ''{1}''. + ag-props-correct.3 = ag-props-correct.3: Erro do grupo de atributos ''{0}''. Duas declara\u00E7\u00F5es de atributo ''{1}'' e ''{2}'' t\u00EAm tipos que s\u00E3o obtidos do ID. + a-props-correct.2 = a-props-correct.2: Valor de restri\u00E7\u00E3o inv\u00E1lido ''{1}'' no atributo ''{0}''. +- a-props-correct.3 = a-props-correct.3: O atributo ''{0}'' n\u00E3o pode usar ''fixed'' ou ''default'' porque o ''{''type definition''}'' do atributo \u00E9 ID ou \u00E9 obtida do ID. +- au-props-correct.2 = au-props-correct.2: Na declara\u00E7\u00E3o do atributo de ''{0}'', foi especificado um valor fixo de ''{1}''. Dessa forma, se o uso do atributo que faz refer\u00EAncia a ''{0}'' tamb\u00E9m tiver uma ''{''value constraint''}'', ele deve ser corrigido e seu valor deve ser ''{1}''. ++ a-props-correct.3 = a-props-correct.3: O atributo ''{0}'' n\u00E3o pode usar ''fixed'' ou ''padr\u00E3o'' porque o '{'type definition'}' do atributo \u00E9 ID ou \u00E9 obtida do ID. ++ au-props-correct.2 = au-props-correct.2: Na declara\u00E7\u00E3o do atributo de ''{0}'', foi especificado um valor fixo de ''{1}''. Dessa forma, se o uso do atributo que faz refer\u00EAncia a ''{0}'' tamb\u00E9m tiver uma '{'value constraint'}', ele deve ser corrigido e seu valor deve ser ''{1}''. + cos-all-limited.1.2 = cos-all-limited.1.2: Um grupo de modelos 'all' deve ser exibido em uma part\u00EDcula com '{'min occurs'}' = '{'max occurs'}' = 1 e essa part\u00EDcula deve fazer parte de um par que constitui o '{'content type'}' de uma defini\u00E7\u00E3o de tipo complexa. + cos-all-limited.2 = cos-all-limited.2: O "{"max occurs"}" de um elemento em um grupo de modelos ''all'' deve ser 0 ou 1. O valor ''{0}'' do elemento ''{1}'' \u00E9 inv\u00E1lido. + cos-applicable-facets = cos-applicable-facets: O aspecto ''{0}'' n\u00E3o \u00E9 permitido pelo tipo {1}. +@@ -182,17 +156,17 @@ + cos-particle-restrict.a = cos-particle-restrict.a: A part\u00EDcula obtida est\u00E1 vazia e a base n\u00E3o pode ser esvaziada. + cos-particle-restrict.b = cos-particle-restrict.b: A part\u00EDcula base est\u00E1 vazia, mas a part\u00EDcula obtida n\u00E3o est\u00E1. + cos-particle-restrict.2 = cos-particle-restrict.2: Restri\u00E7\u00E3o de part\u00EDcula proibida: ''{0}''. +- cos-st-restricts.1.1 = cos-st-restricts.1.1: O tipo ''{1}'' \u00E9 at\u00F4mico. Dessa forma, sua ''{''base type definition''}'', ''{0}'', deve ser uma defini\u00E7\u00E3o de tipo simples at\u00F4mico ou um tipo de dados primitivo criado. ++ cos-st-restricts.1.1 = cos-st-restricts.1.1: O tipo ''{1}'' \u00E9 at\u00F4mico. Dessa forma, sua '{'base type definition'}', ''{0}'', deve ser uma defini\u00E7\u00E3o de tipo simples at\u00F4mico ou um tipo de dados primitivo criado. + cos-st-restricts.2.1 = cos-st-restricts.2.1: Na defini\u00E7\u00E3o do tipo de lista ''{0}'', o tipo ''{1}'' \u00E9 um tipo de item inv\u00E1lido porque \u00E9 um tipo de lista ou um tipo de uni\u00E3o que cont\u00E9m uma lista. + cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: O componente "{"final"}" da "{"item type definition"}" ''{0}'' cont\u00E9m ''list''. Isso significa que ''{0}'' n\u00E3o pode ser usado como um tipo de item do tipo de lista ''{1}''. + cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: O componente "{"final"}" de "{"member type definitions"}", ''{0}'', cont\u00E9m ''union''. Isso significa que ''{0}'' n\u00E3o pode ser usado como um tipo de membro do tipo de uni\u00E3o ''{1}''. +- cos-valid-default.2.1 = cos-valid-default.2.1: O elemento ''{0}'' tem uma restri\u00E7\u00E3o de valor e deve ter um modelo de conte\u00FAdo simples ou misto. +- cos-valid-default.2.2.2 = cos-valid-default.2.2.2: Como o elemento ''{0}'' tem uma ''{''value constraint''}'' e sua defini\u00E7\u00E3o de tipo tem {''content type''}'' misto, ent\u00E3o a part\u00EDcula do ''{''content type''}'' deve ser esvazi\u00E1vel. ++ cos-valid-default.2.1 = cos-valid-padr\u00E3o.2.1: O elemento ''{0}'' tem uma restri\u00E7\u00E3o de valor e deve ter um modelo de conte\u00FAdo simples ou misto. ++ cos-valid-default.2.2.2 = cos-valid-padr\u00E3o.2.2.2: Como o elemento ''{0}'' tem uma '{'value constraint'}' e sua defini\u00E7\u00E3o de tipo tem {''content type'}' misto, ent\u00E3o a part\u00EDcula do '{'content type'}' deve ser esvazi\u00E1vel. + c-props-correct.2 = c-props-correct.2: A cardinalidade dos Campos de keyref ''{0}'' e chave ''{1}'' deve ser correspondente. + ct-props-correct.3 = ct-props-correct.3: Defini\u00E7\u00F5es circulares detectadas para o tipo complexo ''{0}''. Isso significa que ''{0}'' est\u00E1 contido em sua pr\u00F3pria hierarquia de tipo, o que \u00E9 um erro. + ct-props-correct.4 = ct-props-correct.4: Erro do tipo ''{0}''. Os usos do atributo duplicado com o mesmo nome e namespace de destino foram especificados. O nome do uso do atributo duplicado \u00E9 ''{1}''. + ct-props-correct.5 = ct-props-correct.5: Erro do tipo ''{0}''. Duas declara\u00E7\u00F5es do atributo ''{1}'' e ''{2}'' t\u00EAm tipos que s\u00E3o obtidos do ID. +- derivation-ok-restriction.1 = derivation-ok-restriction.1: O tipo ''{0}'' foi obtido por meio da restri\u00E7\u00E3o do tipo ''{1}''. No entanto, ''{1}'' tem uma propriedade ''{''final''}'' que pro\u00EDbe a deriva\u00E7\u00E3o por restri\u00E7\u00E3o. ++ derivation-ok-restriction.1 = derivation-ok-restriction.1: O tipo ''{0}'' foi obtido por meio da restri\u00E7\u00E3o do tipo ''{1}''. No entanto, ''{1}'' tem uma propriedade '{'final'}' que pro\u00EDbe a deriva\u00E7\u00E3o por restri\u00E7\u00E3o. + derivation-ok-restriction.2.1.1 = derivation-ok-restriction.2.1.1: Erro do tipo ''{0}''. O uso do atributo ''{1}'' neste tipo tem um valor de ''uso'' de ''{2}'', que \u00E9 inconsistente com o valor ''obrigat\u00F3rio'' em um uso de atributo correspondente no tipo de base. + derivation-ok-restriction.2.1.2 = derivation-ok-restriction.2.1.2: Erro do tipo ''{0}''. O uso do atributo ''{1}'' neste tipo tem o tipo ''{2}'', que \u00E9 obtido de forma v\u00E1lida de "{3}", o tipo de uso do atributo correspondente no tipo de base. + derivation-ok-restriction.2.1.3.a = derivation-ok-restriction.2.1.3.a: Erro do tipo ''{0}''. O uso do atributo ''{1}'' neste tipo tem uma restri\u00E7\u00E3o de valor efetivo que n\u00E3o \u00E9 fixa e a restri\u00E7\u00E3o de valor efetivo do atributo correspondente no tipo de base \u00E9 fixa. +@@ -232,7 +206,7 @@ + maxInclusive-valid-restriction.3 = maxInclusive-valid-restriction.3: Erro do tipo ''{2}''. O valor maxInclusive =''{0}'' deve ser > = minInclusive do tipo de base ''{1}''. + maxInclusive-valid-restriction.4 = maxInclusive-valid-restriction.4: Erro do tipo ''{2}''. O valor maxInclusive =''{0}'' deve ser > minInclusive do tipo de base ''{1}''. + maxLength-valid-restriction = maxLength-valid-restriction: Na defini\u00E7\u00E3o de {2}, o valor maxLength = ''{0}'' deve ser <= que o do tipo de base ''{1}''. +- mg-props-correct.2 = mg-props-correct.2: Defini\u00E7\u00F5es circulares detectadas para o grupo ''{0}''. Seguir de forma recursiva dos valores de ''{''term''}'' das part\u00EDculas conduz a uma part\u00EDcula cujo ''{''term''}'' \u00E9 o pr\u00F3prio grupo. ++ mg-props-correct.2 = mg-props-correct.2: Defini\u00E7\u00F5es circulares detectadas para o grupo ''{0}''. Seguir de forma recursiva dos valores de '{'term'}' das part\u00EDculas conduz a uma part\u00EDcula cujo '{'term'}' \u00E9 o pr\u00F3prio grupo. + minExclusive-less-than-equal-to-maxExclusive = minExclusive-less-than-equal-to-maxExclusive: Na defini\u00E7\u00E3o de {2}, o valor minExclusive = ''{0}'' deve ser <= que o valor maxExclusive = ''{1}''. + minExclusive-less-than-maxInclusive = minExclusive-less-than-maxInclusive: Na defini\u00E7\u00E3o de {2}, o valor minExclusive = ''{0}'' deve ser <= que o valor maxInclusive = ''{1}''. + minExclusive-valid-restriction.1 = minExclusive-valid-restriction.1: Erro do tipo ''{2}''. O valor minExclusive =''{0}'' deve ser >= minExclusive do tipo de base ''{1}''. +@@ -278,7 +252,7 @@ + # src-redefine.1 = src-redefine.1: The component ''{0}'' is begin redefined, but its corresponding component isn't in the schema document being redefined (with namespace ''{2}''), but in a different document, with namespace ''{1}''. + sch-props-correct.2 = sch-props-correct.2: Um esquema n\u00E3o pode conter dois componentes globais com o mesmo nome; este esquema cont\u00E9m duas ocorr\u00EAncias de ''{0}''. + st-props-correct.2 = st-props-correct.2: Defini\u00E7\u00F5es circulares detectadas para o tipo simples {0}''. Isso significa que ''{0}'' est\u00E1 contido em sua pr\u00F3pria hierarquia de tipo, o que \u00E9 um erro. +- st-props-correct.3 = st-props-correct.3: Erro do tipo ''{0}''. O valor de ''{''final''}'' da ''{''base type definition''}'', ''{1}'', pro\u00EDbe a obten\u00E7\u00E3o por restri\u00E7\u00E3o. ++ st-props-correct.3 = st-props-correct.3: Erro do tipo ''{0}''. O valor de '{'final'}' da '{'base type definition'}', ''{1}'', pro\u00EDbe a obten\u00E7\u00E3o por restri\u00E7\u00E3o. + totalDigits-valid-restriction = totalDigits-valid-restriction: Na defini\u00E7\u00E3o de {2}, o valor ''{0}'' do "totalDigits"'' do aspecto \u00E9 inv\u00E1lido porque ele deve ser <= ao valor de ''totalDigits", que foi definido como ''{1}'' em um dos tipos de ancestrais. + whiteSpace-valid-restriction.1 = whiteSpace-valid-restriction.1: Na defini\u00E7\u00E3o de {0}, o valor ''{1}'' do aspecto ''whitespace'' \u00E9 inv\u00E1lido porque o valor para ''whitespace'' foi definido como ''colapse'' em um dos tipos de ancestrais. + whiteSpace-valid-restriction.2 = whiteSpace-valid-restriction.2: Na defini\u00E7\u00E3o de {0}, o valor do aspecto ''preserve'' \u00E9 inv\u00E1lido para o aspecto "whitespace" porque o valor para ''whitespace'' foi definido como ''replace'' em um dos tipos de ancestrais. +@@ -306,7 +280,7 @@ + c-selector-xpath = c-selector-xpath: O valor do seletor = ''{0}'' n\u00E3o \u00E9 v\u00E1lido; os xpaths do seletor n\u00E3o podem conter atributos. + EmptyTargetNamespace = EmptyTargetNamespace: No documento do esquema ''{0}'', o valor do atributo ''targetNamespace'' n\u00E3o pode ser uma string vazia. + FacetValueFromBase = FacetValueFromBase: Na declara\u00E7\u00E3o do tipo ''{0}'', o valor ''{1}'' do aspecto ''{2}'' deve ser proveniente do espa\u00E7o de valor do tipo de base, ''{3}''. +- FixedFacetValue = FixedFacetValue: Na defini\u00E7\u00E3o de {3}, o valor ''{1}'' do aspecto ''{0}'' \u00E9 inv\u00E1lido porque o valor de ''{0}'' foi enviado para ''{2}'' em um dos tipos de ancestrais e ''{''fixed''}'' = true. ++ FixedFacetValue = FixedFacetValue: Na defini\u00E7\u00E3o de {3}, o valor ''{1}'' do aspecto ''{0}'' \u00E9 inv\u00E1lido porque o valor de ''{0}'' foi enviado para ''{2}'' em um dos tipos de ancestrais e '{'fixed'}' = true. + InvalidRegex = InvalidRegex: O valor do padr\u00E3o ''{0}'' n\u00E3o \u00E9 uma express\u00E3o regular v\u00E1lida. O erro reportado foi: ''{1}'' na coluna ''{2}''. + maxOccurLimit = A configura\u00E7\u00E3o atual do parser n\u00E3o permite que o valor de um atributo maxOccurs seja definido como maior que o valor {0}. + PublicSystemOnNotation = PublicSystemOnNotation: Pelo menos ''public'' e ''system'' devem aparecer no elemento ''notation''. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_sv.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_sv.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,32 +1,6 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file contains error and warning messages related to XML Schema + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XMLSchemaMessages_sv.properties /st_wptg_1.8.0.0.0jdk/3 2013/09/16 06:50:58 gmolloy Exp $ + + BadMessageKey = Hittar inte felmeddelandet som motsvarar meddelandenyckeln. + FormatFailed = Ett internt fel intr\u00E4ffade vid formatering av f\u00F6ljande meddelande:\n +@@ -60,7 +34,7 @@ + #validation (3.X.4) + + cvc-attribute.3 = cvc-attribute.3: V\u00E4rdet ''{2}'' f\u00F6r attributet ''{1}'' i elementet ''{0}'' har ogiltig typ, ''{3}''. +- cvc-attribute.4 = cvc-attribute.4: V\u00E4rdet ''{2}'' f\u00F6r attributet ''{1}'' i elementet ''{0}'' har ogiltig fast ''{''v\u00E4rdebegr\u00E4nsning''}''. Attributet m\u00E5ste ha v\u00E4rdet ''{3}''. ++ cvc-attribute.4 = cvc-attribute.4: V\u00E4rdet ''{2}'' f\u00F6r attributet ''{1}'' i elementet ''{0}'' har ogiltig fast '{'v\u00E4rdebegr\u00E4nsning'}'. Attributet m\u00E5ste ha v\u00E4rdet ''{3}''. + cvc-complex-type.2.1 = cvc-complex-type.2.1: Elementet ''{0}'' f\u00E5r inte ha [underordnade] objekt med tecken- eller elementinformation, eftersom inneh\u00E5llstyp \u00E4r tomt. + cvc-complex-type.2.2 = cvc-complex-type.2.2: Elementet ''{0}'' f\u00E5r inte ha [underordnade] element och v\u00E4rdet m\u00E5ste vara giltigt. + cvc-complex-type.2.3 = cvc-complex-type.2.3: Elementet ''{0}'' f\u00E5r inte ha [underordnade] tecken, eftersom inneh\u00E5llstyp \u00E4r endast element. +@@ -74,22 +48,22 @@ + cvc-complex-type.3.2.2 = cvc-complex-type.3.2.2: Attributet ''{1}'' \u00E4r inte till\u00E5tet i elementet ''{0}''. + cvc-complex-type.4 = cvc-complex-type.4: Attributet ''{1}'' m\u00E5ste anger i elementet ''{0}''. + cvc-complex-type.5.1 = cvc-complex-type.5.1: I elementet ''{0}'' \u00E4r attributet ''{1}'' ett joker-id. Joker-id ''{2}'' finns redan och endast ett id kan anv\u00E4ndas. +- cvc-complex-type.5.2 = cvc-complex-type.5.2: I elementet ''{0}'' \u00E4r attributet ''{1}'' ett joker-id. Det finns redan ett attribut ''{2}'' som tas fr\u00E5n id bland ''{''attributanv\u00E4ndningar''}''. ++ cvc-complex-type.5.2 = cvc-complex-type.5.2: I elementet ''{0}'' \u00E4r attributet ''{1}'' ett joker-id. Det finns redan ett attribut ''{2}'' som tas fr\u00E5n id bland '{'attributanv\u00E4ndningar'}'. + cvc-datatype-valid.1.2.1 = cvc-datatype-valid.1.2.1: ''{0}'' \u00E4r inte n\u00E5got giltigt v\u00E4rde f\u00F6r ''{1}''. + cvc-datatype-valid.1.2.2 = cvc-datatype-valid.1.2.2: ''{0}'' \u00E4r inte n\u00E5got giltigt v\u00E4rde f\u00F6r listtyp ''{1}''. + cvc-datatype-valid.1.2.3 = cvc-datatype-valid.1.2.3: ''{0}'' \u00E4r inte n\u00E5got giltigt v\u00E4rde f\u00F6r uniontyp ''{1}''. + cvc-elt.1 = cvc-elt.1: Kan inte hitta deklarationen f\u00F6r elementet ''{0}''. +- cvc-elt.2 = cvc-elt.2: V\u00E4rdet f\u00F6r ''{''abstrakt''}'' i elementdeklarationen f\u00F6r ''{0}'' m\u00E5ste anges som false. +- cvc-elt.3.1 = cvc-elt.3.1: Attributet ''{1}'' f\u00E5r inte anges i elementet ''{0}'', eftersom ''{''nullbar''}'' egenskap f\u00F6r ''{0}'' har angetts som false. ++ cvc-elt.2 = cvc-elt.2: V\u00E4rdet f\u00F6r '{'abstrakt'}' i elementdeklarationen f\u00F6r ''{0}'' m\u00E5ste anges som false. ++ cvc-elt.3.1 = cvc-elt.3.1: Attributet ''{1}'' f\u00E5r inte anges i elementet ''{0}'', eftersom '{'nullbar'}' egenskap f\u00F6r ''{0}'' har angetts som false. + cvc-elt.3.2.1 = cvc-elt.3.2.1: Elementet ''{0}'' f\u00E5r inte inneh\u00E5lla [underordnade] med tecken- eller elementinformation eftersom ''{1}'' har angetts. +- cvc-elt.3.2.2 = cvc-elt.3.2.2: Det f\u00E5r inte finnas n\u00E5gon fast ''{''v\u00E4rdebegr\u00E4nsning''}'' f\u00F6r elementet ''{0}'' eftersom ''{1}'' har angetts. ++ cvc-elt.3.2.2 = cvc-elt.3.2.2: Det f\u00E5r inte finnas n\u00E5gon fast '{'v\u00E4rdebegr\u00E4nsning'}' f\u00F6r elementet ''{0}'' eftersom ''{1}'' har angetts. + cvc-elt.4.1 = cvc-elt.4.1: V\u00E4rdet ''{2}'' f\u00F6r attributet ''{1}'' i elementet ''{0}'' \u00E4r inte n\u00E5got giltigt QName. + cvc-elt.4.2 = cvc-elt.4.2: Kan inte matcha ''{1}'' med typdefinition f\u00F6r elementet ''{0}''. + cvc-elt.4.3 = cvc-elt.4.3: Typ ''{1}'' \u00E4r inte giltigt att tas fr\u00E5n typdefinitionen ''{2}'' i elementet ''{0}''. +- cvc-elt.5.1.1 = cvc-elt.5.1.1: ''{''v\u00E4rdebegr\u00E4nsning''}'' ''{2}'' i elementet ''{0}'' \u00E4r inte n\u00E5got giltigt standardv\u00E4rde f\u00F6r typ ''{1}''. ++ cvc-elt.5.1.1 = cvc-elt.5.1.1: '{'v\u00E4rdebegr\u00E4nsning'}' ''{2}'' i elementet ''{0}'' \u00E4r inte n\u00E5got giltigt standardv\u00E4rde f\u00F6r typ ''{1}''. + cvc-elt.5.2.2.1 = cvc-elt.5.2.2.1: Elementet ''{0}'' f\u00E5r inte ha [underordnade] objekt med elementinformation. +- cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: V\u00E4rdet ''{1}'' i elementet ''{0}'' matchar inte v\u00E4rdet med fast ''{''v\u00E4rdebegr\u00E4nsning''}'', ''{2}''. +- cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: V\u00E4rdet ''{1}'' i elementet ''{0}'' matchar inte v\u00E4rdet med ''{''v\u00E4rdebegr\u00E4nsning''}'', ''{2}''. ++ cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: V\u00E4rdet ''{1}'' i elementet ''{0}'' matchar inte v\u00E4rdet med fast '{'v\u00E4rdebegr\u00E4nsning'}', ''{2}''. ++ cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: V\u00E4rdet ''{1}'' i elementet ''{0}'' matchar inte v\u00E4rdet med '{'v\u00E4rdebegr\u00E4nsning'}', ''{2}''. + cvc-enumeration-valid = cvc-enumeration-valid: V\u00E4rdet ''{0}'' \u00E4r ogiltigt med aktuell uppr\u00E4kning ''{1}''. V\u00E4rdet m\u00E5ste ing\u00E5 i uppr\u00E4kningen. + cvc-fractionDigits-valid = cvc-fractionDigits-valid: V\u00E4rdet ''{0}'' har {1} br\u00E5ktalssiffror, men antalet br\u00E5ktalssiffror \u00E4r begr\u00E4nsat till {2}. + cvc-id.1 = cvc-id.1: Det finns ingen ID/IDREF-bindning f\u00F6r IDREF ''{0}''. +@@ -168,10 +142,10 @@ + ag-props-correct.2 = ag-props-correct.2: Ett fel intr\u00E4ffade f\u00F6r attributgruppen ''{0}''. Duplicerad attributanv\u00E4ndning med samma namn och namnrymd. Namnet p\u00E5 dubbletten \u00E4r ''{1}''. + ag-props-correct.3 = ag-props-correct.3: Ett fel intr\u00E4ffade f\u00F6r attributgruppen ''{0}''. Tv\u00E5 attributdeklarationer, ''{1}'' och ''{2}'' har angetts med typer som h\u00E4rleds fr\u00E5n ID. + a-props-correct.2 = a-props-correct.2: Ogiltigt v\u00E4rde f\u00F6r begr\u00E4nsning, ''{1}'', i attributet ''{0}''. +- a-props-correct.3 = a-props-correct.3: Attributet ''{0}'' f\u00E5r inte anv\u00E4nda ''fixed'' eller ''default'', eftersom attributets ''{''typdefinition''}'' \u00E4r ID eller h\u00E4rleds fr\u00E5n ID. +- au-props-correct.2 = au-props-correct.2: Det fasta v\u00E4rdet ''{1}'' har angetts i attributdeklarationen ''{0}''. Om attributet som refererar till ''{0}'' \u00E4ven inneh\u00E5ller en ''{''v\u00E4rdebegr\u00E4nsning''}'' m\u00E5ste du l\u00F6sa detta och ange v\u00E4rdet ''{1}''. ++ a-props-correct.3 = a-props-correct.3: Attributet ''{0}'' f\u00E5r inte anv\u00E4nda ''fixed'' eller ''default'', eftersom attributets '{'typdefinition'}' \u00E4r ID eller h\u00E4rleds fr\u00E5n ID. ++ au-props-correct.2 = au-props-correct.2: Det fasta v\u00E4rdet ''{1}'' har angetts i attributdeklarationen ''{0}''. Om attributet som refererar till ''{0}'' \u00E4ven inneh\u00E5ller en '{'v\u00E4rdebegr\u00E4nsning'}' m\u00E5ste du l\u00F6sa detta och ange v\u00E4rdet ''{1}''. + cos-all-limited.1.2 = cos-all-limited.1.2: En 'all'-modellgrupp m\u00E5ste anges i en partikel med '{'min f\u00F6rekomster'}' = '{'max f\u00F6rekomster'}' = 1 och partikeln m\u00E5ste vara en del i ett par som utg\u00F6r '{'inneh\u00E5llstyp'}' i en komplex typdefinition. +- cos-all-limited.2 = cos-all-limited.2: V\u00E4rdet f\u00F6r ''{''max f\u00F6rekomster''}'' i ett element i en ''all''-modellgrupp m\u00E5ste vara 0 eller 1. V\u00E4rdet ''{0}'' f\u00F6r elementet ''{1}'' \u00E4r ogiltigt. ++ cos-all-limited.2 = cos-all-limited.2: V\u00E4rdet f\u00F6r '{'max f\u00F6rekomster'}' i ett element i en ''all''-modellgrupp m\u00E5ste vara 0 eller 1. V\u00E4rdet ''{0}'' f\u00F6r elementet ''{1}'' \u00E4r ogiltigt. + cos-applicable-facets = cos-applicable-facets: Aspekten (facet) ''{0}'' \u00E4r inte till\u00E5ten med typ {1}. + cos-ct-extends.1.1 = cos-ct-extends.1.1: Typ ''{0}'' h\u00E4rleds fr\u00E5n ett till\u00E4gg fr\u00E5n typ ''{1}''. Attributet ''final'' i ''{1}'' till\u00E5ter dock inte h\u00E4rledning av till\u00E4gg. + cos-ct-extends.1.4.3.2.2.1.a = cos-ct-extends.1.4.3.2.2.1.a: Inneh\u00E5llstyp f\u00F6r h\u00E4rledd typ och f\u00F6r basen m\u00E5ste b\u00E5da vara blandade eller endast element. Typ ''{0}'' \u00E4r endast element, men d\u00E4remot inte basen. +@@ -182,17 +156,17 @@ + cos-particle-restrict.a = cos-particle-restrict.a: H\u00E4rledd partikel \u00E4r tom och basen \u00E4r inte t\u00F6mningsbar. + cos-particle-restrict.b = cos-particle-restrict.b: Baspartikeln \u00E4r tom, men den h\u00E4rledda partikeln \u00E4r inte det. + cos-particle-restrict.2 = cos-particle-restrict.2: F\u00F6rbjuden partikelbegr\u00E4nsning: ''{0}''. +- cos-st-restricts.1.1 = cos-st-restricts.1.1: Typ ''{1}'' \u00E4r atomisk och d\u00E4rf\u00F6r m\u00E5ste ''{''bastypdefinitionen''}'', ''{0}'', anges som atomisk enkel typ eller inbyggd primitiv datatyp. ++ cos-st-restricts.1.1 = cos-st-restricts.1.1: Typ ''{1}'' \u00E4r atomisk och d\u00E4rf\u00F6r m\u00E5ste '{'bastypdefinitionen'}', ''{0}'', anges som atomisk enkel typ eller inbyggd primitiv datatyp. + cos-st-restricts.2.1 = cos-st-restricts.2.1: I definitionen av listtyp ''{0}'' \u00E4r typ ''{1}'' en ogiltig objekttyp eftersom det \u00E4r antingen en listtyp eller en uniontyp som inneh\u00E5ller en lista. +- cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: Den ''{''sista''}'' komponenten i ''{''objekttypdefinitionen''}'', ''{0}'', inneh\u00E5ller ''list''. Detta betyder att ''{0}'' inte kan anv\u00E4ndas som objekttyp f\u00F6r listtyp ''{1}''. +- cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: Den ''{''sista''}'' komponenten i ''{''medlemtypdefinitionerna''}'', ''{0}'', inneh\u00E5ller ''union''. Detta betyder att ''{0}'' inte kan anv\u00E4ndas som medlemstyp f\u00F6r uniontyp ''{1}''. ++ cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: Den '{'sista'}' komponenten i '{'objekttypdefinitionen'}', ''{0}'', inneh\u00E5ller ''list''. Detta betyder att ''{0}'' inte kan anv\u00E4ndas som objekttyp f\u00F6r listtyp ''{1}''. ++ cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: Den '{'sista'}' komponenten i '{'medlemtypdefinitionerna'}', ''{0}'', inneh\u00E5ller ''union''. Detta betyder att ''{0}'' inte kan anv\u00E4ndas som medlemstyp f\u00F6r uniontyp ''{1}''. + cos-valid-default.2.1 = cos-valid-default.2.1: Elementet ''{0}'' har en v\u00E4rdebegr\u00E4nsning och m\u00E5ste ha en blandad eller enkel inneh\u00E5llsmodell. +- cos-valid-default.2.2.2 = cos-valid-default.2.2.2: Eftersom elementet ''{0}'' har en ''{''v\u00E4rdebegr\u00E4nsning''}'' och typdefinitionen har blandad ''{''inneh\u00E5llstyp''}'' s\u00E5 m\u00E5ste partikeln av ''{''inneh\u00E5llstyp''}'' vara t\u00F6mningsbar. ++ cos-valid-default.2.2.2 = cos-valid-default.2.2.2: Eftersom elementet ''{0}'' har en '{'v\u00E4rdebegr\u00E4nsning'}' och typdefinitionen har blandad '{'inneh\u00E5llstyp'}' s\u00E5 m\u00E5ste partikeln av '{'inneh\u00E5llstyp'}' vara t\u00F6mningsbar. + c-props-correct.2 = c-props-correct.2: Kardinalitet av f\u00E4lt med nyckelreferens ''{0}'' och nyckel ''{1}'' m\u00E5ste matcha varandra. + ct-props-correct.3 = ct-props-correct.3: Cirkul\u00E4ra definitioner har identifierats f\u00F6r komplex typ ''{0}''. Detta inneb\u00E4r att ''{0}'' ing\u00E5r i sin egen typhierarki, vilket \u00E4r fel. + ct-props-correct.4 = ct-props-correct.4: Ett fel intr\u00E4ffade f\u00F6r typ ''{0}''. Duplicerad attributanv\u00E4ndning med samma namn och namnrymd. Namnet p\u00E5 dubbletten \u00E4r ''{1}''. + ct-props-correct.5 = ct-props-correct.5: Ett fel intr\u00E4ffade f\u00F6r typ ''{0}''. Tv\u00E5 attributdeklarationer, ''{1}'' och ''{2}'', anv\u00E4nds med typer som h\u00E4rleds fr\u00E5n ID. +- derivation-ok-restriction.1 = derivation-ok-restriction.1: Typ ''{0}'' h\u00E4rleddes genom begr\u00E4nsning fr\u00E5n typ ''{1}''. ''{1}'' har d\u00E4remot en ''{''slutlig''}'' egenskap som f\u00F6rbjuder h\u00E4rledning via begr\u00E4nsning. ++ derivation-ok-restriction.1 = derivation-ok-restriction.1: Typ ''{0}'' h\u00E4rleddes genom begr\u00E4nsning fr\u00E5n typ ''{1}''. ''{1}'' har d\u00E4remot en '{'slutlig'}' egenskap som f\u00F6rbjuder h\u00E4rledning via begr\u00E4nsning. + derivation-ok-restriction.2.1.1 = derivation-ok-restriction.2.1.1: Ett fel intr\u00E4ffade f\u00F6r typ ''{0}''. Attributanv\u00E4ndning ''{1}'' i denna typ har ''use''-v\u00E4rdet ''{2}'' vilket inte \u00E4r konsekvent med v\u00E4rdet f\u00F6r ''required'' i matchande attributanv\u00E4ndning i bastypen. + derivation-ok-restriction.2.1.2 = derivation-ok-restriction.2.1.2: Ett fel intr\u00E4ffade f\u00F6r typ ''{0}''. Attributanv\u00E4ndning ''{1}'' i denna typ har typ ''{2}'', som inte f\u00E5r h\u00E4rledas fr\u00E5n ''{3}'', typ i matchande attributanv\u00E4ndning i bastypen. + derivation-ok-restriction.2.1.3.a = derivation-ok-restriction.2.1.3.a: Ett fel intr\u00E4ffade f\u00F6r typ ''{0}''. Attributanv\u00E4ndning ''{1}'' i denna typ har en effektiv v\u00E4rdebegr\u00E4nsning som inte \u00E4r fast, medan den effektiva v\u00E4rdebegr\u00E4nsningen i matchande attributanv\u00E4ndning i bastypen \u00E4r fast. +@@ -210,8 +184,8 @@ + enumeration-required-notation = enumeration-required-notation: NOTATION-typ, ''{0}'' anv\u00E4nds av {2} ''{1}'', m\u00E5ste anges med uppr\u00E4kningsaspektv\u00E4rde som specificerar de notationselement som anv\u00E4nds av denna typ. + enumeration-valid-restriction = enumeration-valid-restriction: Uppr\u00E4kningsv\u00E4rdet ''{0}'' finns inte i bastypens, {1}, v\u00E4rdeutrymme. + e-props-correct.2 = e-props-correct.2: Ogiltigt v\u00E4rde f\u00F6r begr\u00E4nsningsv\u00E4rde ''{1}'' i elementet ''{0}''. +- e-props-correct.4 = e-props-correct.4: ''{''Typdefinition''}'' f\u00F6r elementet ''{0}'' har en ogiltig h\u00E4rledning fr\u00E5n ''{''typdefinitionen''}'' f\u00F6r substitutionHead ''{1}'' eller s\u00E5 till\u00E5ts inte denna h\u00E4rledning av egenskapen ''{1}'' f\u00F6r ''{''ers\u00E4ttningsgruppexkluderingar''}''. +- e-props-correct.5 = e-props-correct.5: En ''{''v\u00E4rdebegr\u00E4nsning''}'' f\u00E5r inte finnas med i elementet ''{0}'' eftersom elementets ''{''typdefinition''}'' eller ''{''typdefinitionens''}'' ''{''inneh\u00E5llstyp''}'' \u00E4r ID, eller h\u00E4rleds fr\u00E5n ID. ++ e-props-correct.4 = e-props-correct.4: '{'Typdefinition'}' f\u00F6r elementet ''{0}'' har en ogiltig h\u00E4rledning fr\u00E5n '{'typdefinitionen'}' f\u00F6r substitutionHead ''{1}'' eller s\u00E5 till\u00E5ts inte denna h\u00E4rledning av egenskapen ''{1}'' f\u00F6r '{'ers\u00E4ttningsgruppexkluderingar'}'. ++ e-props-correct.5 = e-props-correct.5: En '{'v\u00E4rdebegr\u00E4nsning'}' f\u00E5r inte finnas med i elementet ''{0}'' eftersom elementets '{'typdefinition'}' eller '{'typdefinitionens'}' '{'inneh\u00E5llstyp'}' \u00E4r ID, eller h\u00E4rleds fr\u00E5n ID. + e-props-correct.6 = e-props-correct.6: Cirkul\u00E4r ers\u00E4ttningsgrupp identifierades f\u00F6r elementet ''{0}''. + fractionDigits-valid-restriction = fractionDigits-valid-restriction: I definitionen f\u00F6r {2} \u00E4r v\u00E4rdet ''{0}'' f\u00F6r ''fractionDigits'' ogiltigt eftersom det m\u00E5ste vara mindre \u00E4n eller lika med v\u00E4rdet f\u00F6r ''fractionDigits'' som har angetts som ''{1}'' i n\u00E5gon typ f\u00F6r \u00F6verordnad. + fractionDigits-totalDigits = fractionDigits-totalDigits: I definitionen av {2} \u00E4r v\u00E4rdet ''{0}'' f\u00F6r ''fractionDigits'' ogiltigt eftersom v\u00E4rdet m\u00E5ste vara mindre \u00E4n eller lika med v\u00E4rdet f\u00F6r ''totalDigits'' som \u00E4r ''{1}''. +@@ -232,7 +206,7 @@ + maxInclusive-valid-restriction.3 = maxInclusive-valid-restriction.3: Ett fel intr\u00E4ffade f\u00F6r typ ''{2}''. maxInclusive-v\u00E4rdet ''{0}'' m\u00E5ste vara st\u00F6rre \u00E4n eller lika med minInclusive i bastyp ''{1}''. + maxInclusive-valid-restriction.4 = maxInclusive-valid-restriction.4: Ett fel intr\u00E4ffade f\u00F6r typ ''{2}''. maxInclusive-v\u00E4rdet ''{0}'' m\u00E5ste vara st\u00F6rre \u00E4n minExclusive i bastyp ''{1}''. + maxLength-valid-restriction = maxLength-valid-restriction: I definitionen f\u00F6r {2} m\u00E5ste maxLength-v\u00E4rdet ''{0}'' vara mindre \u00E4n eller lika med v\u00E4rdet i bastyp ''{1}''. +- mg-props-correct.2 = mg-props-correct.2: Cirkul\u00E4ra definitioner identifierades f\u00F6r gruppen ''{0}''. Rekursivt efterf\u00F6ljande v\u00E4rdena f\u00F6r ''{''term''}'' i partiklarna leder till en partikel vars ''{''term''}'' \u00E4r den ursprungliga gruppen. ++ mg-props-correct.2 = mg-props-correct.2: Cirkul\u00E4ra definitioner identifierades f\u00F6r gruppen ''{0}''. Rekursivt efterf\u00F6ljande v\u00E4rdena f\u00F6r '{'term'}' i partiklarna leder till en partikel vars '{'term'}' \u00E4r den ursprungliga gruppen. + minExclusive-less-than-equal-to-maxExclusive = minExclusive-less-than-equal-to-maxExclusive: I definitionen f\u00F6r {2} m\u00E5ste minExclusive-v\u00E4rdet ''{0}'' vara mindre \u00E4n eller lika med maxExclusive-v\u00E4rdet ''{1}''. + minExclusive-less-than-maxInclusive = minExclusive-less-than-maxInclusive: I definitionen f\u00F6r {2} m\u00E5ste minExclusive-v\u00E4rdet ''{0}'' vara mindre \u00E4n maxInclusive-v\u00E4rdet ''{1}''. + minExclusive-valid-restriction.1 = minExclusive-valid-restriction.1: Ett fel intr\u00E4ffade f\u00F6r typ ''{2}''. minExclusive-v\u00E4rdet ''{0}'' m\u00E5ste vara st\u00F6rre \u00E4n eller lika med minExclusive i bastyp ''{1}''. +@@ -249,20 +223,20 @@ + minLength-less-than-equal-to-maxLength = minLength-less-than-equal-to-maxLength: I definitionen f\u00F6r {2} m\u00E5ste minLength-v\u00E4rdet ''{0}'' vara mindre \u00E4n maxLength-v\u00E4rdet ''{1}''. + minLength-valid-restriction = minLength-valid-restriction: I definitionen f\u00F6r {2} m\u00E5ste minLength-v\u00E4rdet ''{0}'' vara st\u00F6rre \u00E4n eller lika med v\u00E4rdet i bastyp ''{1}''. + no-xmlns = no-xmlns: Ett {namn} p\u00E5 en attributdeklaration f\u00E5r inte matcha 'xmlns'. +- no-xsi = no-xsi: En ''{''m\u00E5lnamnrymd''}'' i en attributdeklaration f\u00E5r inte matcha ''{0}''. ++ no-xsi = no-xsi: En '{'m\u00E5lnamnrymd'}' i en attributdeklaration f\u00E5r inte matcha ''{0}''. + p-props-correct.2.1 = p-props-correct.2.1: I deklarationen ''{0}'' \u00E4r v\u00E4rdet f\u00F6r ''minOccurs'' ''{1}'', men det f\u00E5r inte vara st\u00F6rre \u00E4n v\u00E4rdet f\u00F6r ''maxOccurs'' (som \u00E4r ''{2}''). + rcase-MapAndSum.1 = rcase-MapAndSum.1: Det finns ingen fullst\u00E4ndigt fungerande mappning mellan partiklarna. + rcase-MapAndSum.2 = rcase-MapAndSum.2: Gruppens f\u00F6rekomstintervall ({0},{1}) \u00E4r inte n\u00E5gon giltig begr\u00E4nsning f\u00F6r basgruppens f\u00F6rekomstintervall, ({2},{3}). + rcase-NameAndTypeOK.1 = rcase-NameAndTypeOK.1: Element har namn och m\u00E5lnamnrymder som inte \u00E4r desamma: Elementet ''{0}'' i namnrymd ''{1}'' och elementet ''{2}'' i namnrymd ''{3}''. +- rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: Ett fel intr\u00E4ffade f\u00F6r partikeln vars ''{''term''}'' \u00E4r elementdeklarationen ''{0}''. Elementdeklarationens v\u00E4rde som \u00E4r ''{''nullbart''}'' har angetts som true, men motsvarande partikel i bastypen har en elementdeklaration vars v\u00E4rde som \u00E4r ''{''nullbart''}'' har angetts som false. +- rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: Ett fel intr\u00E4ffade f\u00F6r partikeln vars ''{''term''}'' \u00E4r elementdeklarationen ''{0}''. F\u00F6rekomstintervallet, ({1},{2}), \u00E4r inte n\u00E5gon giltig begr\u00E4nsning f\u00F6r intervallet, ({3},{4}, i motsvarande partikel i bastypen. ++ rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: Ett fel intr\u00E4ffade f\u00F6r partikeln vars '{'term'}' \u00E4r elementdeklarationen ''{0}''. Elementdeklarationens v\u00E4rde som \u00E4r '{'nullbart'}' har angetts som true, men motsvarande partikel i bastypen har en elementdeklaration vars v\u00E4rde som \u00E4r '{'nullbart'}' har angetts som false. ++ rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: Ett fel intr\u00E4ffade f\u00F6r partikeln vars '{'term'}' \u00E4r elementdeklarationen ''{0}''. F\u00F6rekomstintervallet, ({1},{2}), \u00E4r inte n\u00E5gon giltig begr\u00E4nsning f\u00F6r intervallet, ({3},{4}, i motsvarande partikel i bastypen. + rcase-NameAndTypeOK.4.a = rcase-NameAndTypeOK.4.a: Elementet ''{0}'' har inte n\u00E5got fast v\u00E4rde, men motsvarande element i bastypen har angetts med det fasta v\u00E4rdet ''{1}''. + rcase-NameAndTypeOK.4.b = rcase-NameAndTypeOK.4.b: Elementet ''{0}'' har det fasta v\u00E4rdet ''{1}'', men motsvarande element i bastypen har angetts med det fasta v\u00E4rdet ''{2}''. + rcase-NameAndTypeOK.5 = rcase-NameAndTypeOK.5: Identitetsbegr\u00E4nsningarna f\u00F6r elementet ''{0}'' \u00E4r inte n\u00E5gon del av de som finns i basen. + rcase-NameAndTypeOK.6 = rcase-NameAndTypeOK.6: De avaktiverade ers\u00E4ttningarna f\u00F6r elementet ''{0}'' \u00E4r inte inneslutna i basen. + rcase-NameAndTypeOK.7 = rcase-NameAndTypeOK.7: Elementtyp ''{0}'', ''{1}'' h\u00E4rleds inte fr\u00E5n typ av baselement, ''{2}''. + rcase-NSCompat.1 = rcase-NSCompat.1: Elementet ''{0}'' har namnrymden ''{1}'' som inte \u00E4r till\u00E5tet av jokertecknet i basen. +- rcase-NSCompat.2 = rcase-NSCompat.2: Ett fel intr\u00E4ffade f\u00F6r partikeln vars ''{''term''}'' \u00E4r elementdeklarationen ''{0}''. F\u00F6rekomstintervallet, ({1},{2}), \u00E4r inte n\u00E5gon giltig begr\u00E4nsning f\u00F6r intervallet, ({3},{4}, i motsvarande partikel i bastypen. ++ rcase-NSCompat.2 = rcase-NSCompat.2: Ett fel intr\u00E4ffade f\u00F6r partikeln vars '{'term'}' \u00E4r elementdeklarationen ''{0}''. F\u00F6rekomstintervallet, ({1},{2}), \u00E4r inte n\u00E5gon giltig begr\u00E4nsning f\u00F6r intervallet, ({3},{4}, i motsvarande partikel i bastypen. + rcase-NSRecurseCheckCardinality.1 = rcase-NSRecurseCheckCardinality.1: Det finns ingen fullst\u00E4ndigt fungerande mappning mellan partiklarna. + rcase-NSRecurseCheckCardinality.2 = rcase-NSRecurseCheckCardinality.2: Gruppens f\u00F6rekomstintervall ({0},{1}) \u00E4r inte n\u00E5gon giltig begr\u00E4nsning f\u00F6r basjokertecknets intervall, ({2},{3}). + rcase-NSSubset.1 = rcase-NSSubset.1: Jokertecknet \u00E4r inte n\u00E5gon del av motsvarande jokertecken i basen. +@@ -278,7 +252,7 @@ + # src-redefine.1 = src-redefine.1: The component ''{0}'' is begin redefined, but its corresponding component isn't in the schema document being redefined (with namespace ''{2}''), but in a different document, with namespace ''{1}''. + sch-props-correct.2 = sch-props-correct.2: Ett schema kan inte inneh\u00E5lla tv\u00E5 globala komponenter med samma namn. Detta schema har tv\u00E5 f\u00F6rekomster av ''{0}''. + st-props-correct.2 = st-props-correct.2: Cirkul\u00E4ra definitioner har identifierats f\u00F6r enkel typ ''{0}''. Detta inneb\u00E4r att ''{0}'' ing\u00E5r i sin egen typhierarki, vilket \u00E4r fel. +- st-props-correct.3 = st-props-correct.3: Ett fel intr\u00E4ffade f\u00F6r typ ''{0}''. V\u00E4rdet f\u00F6r ''{''slutgiltigt''}'' i ''{''bastypdefinitionen''}'', ''{1}'', f\u00F6rbjuder h\u00E4rledning med begr\u00E4nsning. ++ st-props-correct.3 = st-props-correct.3: Ett fel intr\u00E4ffade f\u00F6r typ ''{0}''. V\u00E4rdet f\u00F6r '{'slutgiltigt'}' i '{'bastypdefinitionen'}', ''{1}'', f\u00F6rbjuder h\u00E4rledning med begr\u00E4nsning. + totalDigits-valid-restriction = totalDigits-valid-restriction: I definitionen f\u00F6r {2} \u00E4r v\u00E4rdet ''{0}'' f\u00F6r ''totalDigits'' ogiltigt eftersom det m\u00E5ste vara mindre \u00E4n eller lika med v\u00E4rdet f\u00F6r ''totalDigits'' som har angetts som ''{1}'' i n\u00E5gon typ f\u00F6r \u00F6verordnad. + whiteSpace-valid-restriction.1 = whiteSpace-valid-restriction.1: I definitionen f\u00F6r {0} \u00E4r v\u00E4rdet ''{1}'' f\u00F6r ''whitespace'' ogiltigt, eftersom v\u00E4rdet f\u00F6r ''whitespace'' har angetts som ''collapse'' i n\u00E5gon typ f\u00F6r \u00F6verordnad. + whiteSpace-valid-restriction.2 = whiteSpace-valid-restriction.2: I definitionen f\u00F6r {0} \u00E4r v\u00E4rdet ''preserve'' f\u00F6r ''whitespace'' ogiltigt, eftersom v\u00E4rdet f\u00F6r ''whitespace'' har angetts som ''replace'' i n\u00E5gon typ f\u00F6r \u00F6verordnad. +@@ -306,7 +280,7 @@ + c-selector-xpath = c-selector-xpath: V\u00E4ljarv\u00E4rdet ''{0}'' \u00E4r ogiltigt; xpath f\u00F6r v\u00E4ljare f\u00E5r inte inneh\u00E5lla attribut. + EmptyTargetNamespace = EmptyTargetNamespace: I schemadokumentet ''{0}'' f\u00E5r v\u00E4rdet f\u00F6r attributet ''targetNamespace'' inte vara en tom str\u00E4ng. + FacetValueFromBase = FacetValueFromBase: I deklarationen av typ ''{0}'' m\u00E5ste v\u00E4rdet ''{1}'' f\u00F6r aspekt ''{2}'' komma fr\u00E5n v\u00E4rdeutrymmet i bastypen ''{3}''. +- FixedFacetValue = FixedFacetValue: I definitionen f\u00F6r {3} \u00E4r v\u00E4rdet ''{1}'' f\u00F6r aspekten ''{0}'' ogiltigt eftersom v\u00E4rdet f\u00F6r ''{0}'' har angetts som ''{2}'' i n\u00E5gon av typerna f\u00F6r \u00F6verordnade samtidigt som ''{''fast''}'' = true. ++ FixedFacetValue = FixedFacetValue: I definitionen f\u00F6r {3} \u00E4r v\u00E4rdet ''{1}'' f\u00F6r aspekten ''{0}'' ogiltigt eftersom v\u00E4rdet f\u00F6r ''{0}'' har angetts som ''{2}'' i n\u00E5gon av typerna f\u00F6r \u00F6verordnade samtidigt som '{'fast'}' = true. + InvalidRegex = InvalidRegex: M\u00F6nsterv\u00E4rdet ''{0}'' \u00E4r inte n\u00E5got giltigt regulj\u00E4rt uttryck. Det rapporterade felet \u00E4r: ''{1}'' i kolumn ''{2}''. + maxOccurLimit = Den aktuella konfigurationen f\u00F6r parsern till\u00E5ter inte att attributv\u00E4rdet f\u00F6r Occurs anges som st\u00F6rre \u00E4n v\u00E4rdet {0}. + PublicSystemOnNotation = PublicSystemOnNotation: \u00C5tminstone ett av ''public'' och ''system'' m\u00E5ste anges i elementets ''notation''. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_zh_CN.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_zh_CN.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,32 +1,6 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file contains error and warning messages related to XML Schema + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XMLSchemaMessages_zh_CN.properties /st_wptg_1.8.0.0.0jdk/3 2013/09/16 04:44:25 gmolloy Exp $ + + BadMessageKey = \u627E\u4E0D\u5230\u4E0E\u6D88\u606F\u5173\u952E\u5B57\u5BF9\u5E94\u7684\u9519\u8BEF\u6D88\u606F\u3002 + FormatFailed = \u8BBE\u7F6E\u4EE5\u4E0B\u6D88\u606F\u7684\u683C\u5F0F\u65F6\u51FA\u73B0\u5185\u90E8\u9519\u8BEF:\n +@@ -60,7 +34,7 @@ + #validation (3.X.4) + + cvc-attribute.3 = cvc-attribute.3: \u5728\u5143\u7D20 ''{0}'' \u4E2D, \u5C5E\u6027 ''{1}'' \u7684\u503C ''{2}'' \u4E0E\u5176\u7C7B\u578B ''{3}'' \u4E0D\u5339\u914D\u3002 +- cvc-attribute.4 = cvc-attribute.4: \u5728\u5143\u7D20 ''{0}'' \u4E2D, \u5C5E\u6027 ''{1}'' \u7684\u503C ''{2}'' \u4E0E\u5176\u56FA\u5B9A\u7684 ''{''value constraint''}'' \u4E0D\u5339\u914D\u3002\u8BE5\u5C5E\u6027\u7684\u503C\u5FC5\u987B\u4E3A ''{3}''\u3002 ++ cvc-attribute.4 = cvc-attribute.4: \u5728\u5143\u7D20 ''{0}'' \u4E2D, \u5C5E\u6027 ''{1}'' \u7684\u503C ''{2}'' \u4E0E\u5176\u56FA\u5B9A\u7684 '{'value constraint'}' \u4E0D\u5339\u914D\u3002\u8BE5\u5C5E\u6027\u7684\u503C\u5FC5\u987B\u4E3A ''{3}''\u3002 + cvc-complex-type.2.1 = cvc-complex-type.2.1: \u5143\u7D20 ''{0}'' \u5FC5\u987B\u4E0D\u542B\u5B57\u7B26\u6216\u5143\u7D20\u4FE1\u606F\u9879 [\u5B50\u7EA7], \u56E0\u4E3A\u8BE5\u7C7B\u578B\u7684\u5185\u5BB9\u7C7B\u578B\u4E3A\u7A7A\u3002 + cvc-complex-type.2.2 = cvc-complex-type.2.2: \u5143\u7D20 ''{0}'' \u5FC5\u987B\u4E0D\u542B\u5143\u7D20 [\u5B50\u7EA7], \u5E76\u4E14\u5176\u503C\u5FC5\u987B\u6709\u6548\u3002 + cvc-complex-type.2.3 = cvc-complex-type.2.3: \u5143\u7D20 ''{0}'' \u5FC5\u987B\u4E0D\u542B\u5B57\u7B26 [\u5B50\u7EA7], \u56E0\u4E3A\u8BE5\u7C7B\u578B\u7684\u5185\u5BB9\u7C7B\u578B\u4E3A\u201C\u4EC5\u5143\u7D20\u201D\u3002 +@@ -74,22 +48,22 @@ + cvc-complex-type.3.2.2 = cvc-complex-type.3.2.2: \u5143\u7D20 ''{0}'' \u4E2D\u4E0D\u5141\u8BB8\u51FA\u73B0\u5C5E\u6027 ''{1}''\u3002 + cvc-complex-type.4 = cvc-complex-type.4: \u5143\u7D20 ''{0}'' \u4E2D\u5FC5\u987B\u5305\u542B\u5C5E\u6027 ''{1}''\u3002 + cvc-complex-type.5.1 = cvc-complex-type.5.1: \u5728\u5143\u7D20 ''{0}'' \u4E2D, \u5C5E\u6027 ''{1}'' \u662F\u4E00\u4E2A\u901A\u7528 ID\u3002\u4F46\u5DF2\u5B58\u5728\u901A\u7528 ID ''{2}''\u3002\u53EA\u80FD\u6709\u4E00\u4E2A\u901A\u7528 ID\u3002 +- cvc-complex-type.5.2 = cvc-complex-type.5.2: \u5728\u5143\u7D20 ''{0}'' \u4E2D, \u5C5E\u6027 ''{1}'' \u662F\u4E00\u4E2A\u901A\u7528 ID\u3002\u4F46\u5DF2\u6709\u4E00\u4E2A\u5C5E\u6027 ''{2}'' \u662F\u4ECE ''{''attribute uses''}'' \u4E2D\u7684 ID \u6D3E\u751F\u7684\u3002 ++ cvc-complex-type.5.2 = cvc-complex-type.5.2: \u5728\u5143\u7D20 ''{0}'' \u4E2D, \u5C5E\u6027 ''{1}'' \u662F\u4E00\u4E2A\u901A\u7528 ID\u3002\u4F46\u5DF2\u6709\u4E00\u4E2A\u5C5E\u6027 ''{2}'' \u662F\u4ECE '{'attribute uses'}' \u4E2D\u7684 ID \u6D3E\u751F\u7684\u3002 + cvc-datatype-valid.1.2.1 = cvc-datatype-valid.1.2.1: ''{0}'' \u4E0D\u662F ''{1}'' \u7684\u6709\u6548\u503C\u3002 + cvc-datatype-valid.1.2.2 = cvc-datatype-valid.1.2.2: ''{0}'' \u4E0D\u662F\u5217\u8868\u7C7B\u578B ''{1}'' \u7684\u6709\u6548\u503C\u3002 + cvc-datatype-valid.1.2.3 = cvc-datatype-valid.1.2.3: ''{0}'' \u4E0D\u662F\u8054\u5408\u7C7B\u578B ''{1}'' \u7684\u6709\u6548\u503C\u3002 + cvc-elt.1 = cvc-elt.1: \u627E\u4E0D\u5230\u5143\u7D20 ''{0}'' \u7684\u58F0\u660E\u3002 +- cvc-elt.2 = cvc-elt.2: ''{0}'' \u7684\u5143\u7D20\u58F0\u660E\u4E2D ''{''abstract''}'' \u7684\u503C\u5FC5\u987B\u4E3A\u201C\u5047\u201D\u3002 +- cvc-elt.3.1 = cvc-elt.3.1: \u5143\u7D20 ''{0}'' \u4E2D\u4E0D\u80FD\u5305\u542B\u5C5E\u6027 ''{1}'', \u56E0\u4E3A ''{0}'' \u7684 ''{''nillable''}'' \u5C5E\u6027\u4E3A\u201C\u5047\u201D\u3002 ++ cvc-elt.2 = cvc-elt.2: ''{0}'' \u7684\u5143\u7D20\u58F0\u660E\u4E2D '{'abstract'}' \u7684\u503C\u5FC5\u987B\u4E3A\u201C\u5047\u201D\u3002 ++ cvc-elt.3.1 = cvc-elt.3.1: \u5143\u7D20 ''{0}'' \u4E2D\u4E0D\u80FD\u5305\u542B\u5C5E\u6027 ''{1}'', \u56E0\u4E3A ''{0}'' \u7684 '{'nillable'}' \u5C5E\u6027\u4E3A\u201C\u5047\u201D\u3002 + cvc-elt.3.2.1 = cvc-elt.3.2.1: \u5143\u7D20 ''{0}'' \u5FC5\u987B\u4E0D\u542B\u5B57\u7B26\u6216\u5143\u7D20\u4FE1\u606F [\u5B50\u7EA7], \u56E0\u4E3A\u5DF2\u6307\u5B9A ''{1}''\u3002 +- cvc-elt.3.2.2 = cvc-elt.3.2.2: \u5143\u7D20 ''{0}'' \u4E0D\u80FD\u5305\u542B\u56FA\u5B9A\u7684 ''{''value constraint''}'', \u56E0\u4E3A\u5DF2\u6307\u5B9A ''{1}''\u3002 ++ cvc-elt.3.2.2 = cvc-elt.3.2.2: \u5143\u7D20 ''{0}'' \u4E0D\u80FD\u5305\u542B\u56FA\u5B9A\u7684 '{'value constraint'}', \u56E0\u4E3A\u5DF2\u6307\u5B9A ''{1}''\u3002 + cvc-elt.4.1 = cvc-elt.4.1: \u5143\u7D20 ''{0}'' \u7684\u5C5E\u6027 ''{1}'' \u7684\u503C ''{2}'' \u4E0D\u662F\u6709\u6548\u7684\u9650\u5B9A\u540D\u3002 + cvc-elt.4.2 = cvc-elt.4.2: \u65E0\u6CD5\u5C06 ''{1}'' \u89E3\u6790\u4E3A\u5143\u7D20 ''{0}'' \u7684\u7C7B\u578B\u5B9A\u4E49\u3002 + cvc-elt.4.3 = cvc-elt.4.3: \u7C7B\u578B ''{1}'' \u4E0D\u662F\u4ECE\u5143\u7D20 ''{0}'' \u7684\u7C7B\u578B\u5B9A\u4E49 ''{2}'' \u6709\u6548\u6D3E\u751F\u7684\u3002 +- cvc-elt.5.1.1 = cvc-elt.5.1.1: \u5143\u7D20 ''{0}'' \u7684 ''{''value constraint''}'' ''{2}'' \u4E0D\u662F\u7C7B\u578B ''{1}'' \u7684\u6709\u6548\u9ED8\u8BA4\u503C\u3002 ++ cvc-elt.5.1.1 = cvc-elt.5.1.1: \u5143\u7D20 ''{0}'' \u7684 '{'value constraint'}' ''{2}'' \u4E0D\u662F\u7C7B\u578B ''{1}'' \u7684\u6709\u6548\u9ED8\u8BA4\u503C\u3002 + cvc-elt.5.2.2.1 = cvc-elt.5.2.2.1: \u5143\u7D20 ''{0}'' \u5FC5\u987B\u4E0D\u542B\u5143\u7D20\u4FE1\u606F\u9879 [\u5B50\u7EA7]\u3002 +- cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: \u5143\u7D20 ''{0}'' \u7684\u503C ''{1}'' \u4E0E\u56FA\u5B9A\u7684 ''{''value constraint''}'' \u503C ''{2}'' \u4E0D\u5339\u914D\u3002 +- cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: \u5143\u7D20 ''{0}'' \u7684\u503C ''{1}'' \u4E0E ''{''value constraint''}'' \u503C ''{2}'' \u4E0D\u5339\u914D\u3002 ++ cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: \u5143\u7D20 ''{0}'' \u7684\u503C ''{1}'' \u4E0E\u56FA\u5B9A\u7684 '{'value constraint'}' \u503C ''{2}'' \u4E0D\u5339\u914D\u3002 ++ cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: \u5143\u7D20 ''{0}'' \u7684\u503C ''{1}'' \u4E0E '{'value constraint'}' \u503C ''{2}'' \u4E0D\u5339\u914D\u3002 + cvc-enumeration-valid = cvc-enumeration-valid: \u5BF9\u4E8E\u679A\u4E3E ''{1}'', \u503C ''{0}'' \u4E0D\u5177\u6709\u9762\u6709\u6548\u6027\u3002\u5B83\u5FC5\u987B\u662F\u6765\u81EA\u679A\u4E3E\u7684\u503C\u3002 + cvc-fractionDigits-valid = cvc-fractionDigits-valid: \u503C ''{0}'' \u5177\u6709 {1} \u4F4D\u5C0F\u6570, \u4F46\u5C0F\u6570\u4F4D\u6570\u5DF2\u9650\u5236\u4E3A {2}\u3002 + cvc-id.1 = cvc-id.1: IDREF ''{0}'' \u6CA1\u6709 ID/IDREF \u7ED1\u5B9A\u3002 +@@ -168,10 +142,10 @@ + ag-props-correct.2 = ag-props-correct.2: \u5C5E\u6027\u7EC4 ''{0}'' \u9519\u8BEF\u3002\u6307\u5B9A\u4E86\u5177\u6709\u76F8\u540C\u540D\u79F0\u548C\u76EE\u6807\u540D\u79F0\u7A7A\u95F4\u7684\u91CD\u590D\u5C5E\u6027\u7528\u6CD5\u3002\u91CD\u590D\u5C5E\u6027\u7528\u6CD5\u7684\u540D\u79F0\u4E3A ''{1}''\u3002 + ag-props-correct.3 = ag-props-correct.3: \u5C5E\u6027\u7EC4 ''{0}'' \u9519\u8BEF\u3002\u4E24\u4E2A\u5C5E\u6027\u58F0\u660E ''{1}'' \u548C ''{2}'' \u5177\u6709\u7684\u7C7B\u578B\u662F\u4ECE ID \u6D3E\u751F\u7684\u3002 + a-props-correct.2 = a-props-correct.2: \u5C5E\u6027 ''{0}'' \u4E2D\u7684\u503C\u7EA6\u675F\u6761\u4EF6\u7684\u503C ''{1}'' \u65E0\u6548\u3002 +- a-props-correct.3 = a-props-correct.3: \u5C5E\u6027 ''{0}'' \u4E0D\u80FD\u4F7F\u7528 ''fixed'' \u6216 ''default'', \u56E0\u4E3A\u5176 ''{''type definition''}'' \u4E3A ID, \u6216\u8005\u662F\u4ECE ID \u6D3E\u751F\u7684\u3002 +- au-props-correct.2 = au-props-correct.2: \u5728 ''{0}'' \u7684\u5C5E\u6027\u58F0\u660E\u4E2D, \u6307\u5B9A\u4E86\u56FA\u5B9A\u503C ''{1}''\u3002\u56E0\u6B64\u5982\u679C\u5F15\u7528 ''{0}'' \u7684\u5C5E\u6027\u7528\u6CD5\u540C\u65F6\u5177\u6709 ''{''value constraint''}'', \u5219\u5B83\u5FC5\u987B\u662F\u56FA\u5B9A\u7684, \u5E76\u4E14\u5176\u503C\u5FC5\u987B\u4E3A ''{1}''\u3002 ++ a-props-correct.3 = a-props-correct.3: \u5C5E\u6027 ''{0}'' \u4E0D\u80FD\u4F7F\u7528 ''fixed'' \u6216 ''default'', \u56E0\u4E3A\u5176 '{'type definition'}' \u4E3A ID, \u6216\u8005\u662F\u4ECE ID \u6D3E\u751F\u7684\u3002 ++ au-props-correct.2 = au-props-correct.2: \u5728 ''{0}'' \u7684\u5C5E\u6027\u58F0\u660E\u4E2D, \u6307\u5B9A\u4E86\u56FA\u5B9A\u503C ''{1}''\u3002\u56E0\u6B64\u5982\u679C\u5F15\u7528 ''{0}'' \u7684\u5C5E\u6027\u7528\u6CD5\u540C\u65F6\u5177\u6709 '{'value constraint'}', \u5219\u5B83\u5FC5\u987B\u662F\u56FA\u5B9A\u7684, \u5E76\u4E14\u5176\u503C\u5FC5\u987B\u4E3A ''{1}''\u3002 + cos-all-limited.1.2 = cos-all-limited.1.2: '{'min occurs'}' = '{'max occurs'}' = 1 \u7684\u7C92\u5B50\u4E2D\u5FC5\u987B\u5305\u542B 'all' \u6A21\u578B\u7EC4, \u8BE5\u7C92\u5B50\u5FC5\u987B\u662F\u7EC4\u6210\u590D\u6742\u7C7B\u578B\u5B9A\u4E49\u7684 '{'content type'}' \u5BF9\u7684\u4E00\u90E8\u5206\u3002 +- cos-all-limited.2 = cos-all-limited.2: \u5728 ''all'' \u6A21\u578B\u7EC4\u4E2D\u5143\u7D20\u7684 ''{''max occurs''}'' \u5FC5\u987B\u4E3A 0 \u6216 1\u3002\u5143\u7D20 ''{1}'' \u7684\u503C ''{0}'' \u65E0\u6548\u3002 ++ cos-all-limited.2 = cos-all-limited.2: \u5728 ''all'' \u6A21\u578B\u7EC4\u4E2D\u5143\u7D20\u7684 '{'max occurs'}' \u5FC5\u987B\u4E3A 0 \u6216 1\u3002\u5143\u7D20 ''{1}'' \u7684\u503C ''{0}'' \u65E0\u6548\u3002 + cos-applicable-facets = cos-applicable-facets: \u7C7B\u578B {1} \u4E0D\u5141\u8BB8\u9762 ''{0}''\u3002 + cos-ct-extends.1.1 = cos-ct-extends.1.1: \u7C7B\u578B ''{0}'' \u662F\u4ECE\u7C7B\u578B ''{1}'' \u7684\u6269\u5C55\u6D3E\u751F\u7684\u3002\u4F46\u662F, ''{1}'' \u7684 ''final'' \u5C5E\u6027\u7981\u6B62\u7531\u6269\u5C55\u6D3E\u751F\u3002 + cos-ct-extends.1.4.3.2.2.1.a = cos-ct-extends.1.4.3.2.2.1.a: \u6D3E\u751F\u7C7B\u578B\u53CA\u5176\u57FA\u7C7B\u578B\u7684\u5185\u5BB9\u7C7B\u578B\u90FD\u5FC5\u987B\u4E3A\u201C\u6DF7\u5408\u201D\u6216\u201C\u4EC5\u5143\u7D20\u201D\u3002\u7C7B\u578B ''{0}'' \u4E3A\u201C\u4EC5\u5143\u7D20\u201D, \u4F46\u5176\u57FA\u7C7B\u578B\u4E0D\u662F\u3002 +@@ -182,17 +156,17 @@ + cos-particle-restrict.a = cos-particle-restrict.a: \u6D3E\u751F\u7684\u7C92\u5B50\u4E3A\u7A7A, \u800C\u57FA\u7C92\u5B50\u4E0D\u53EF\u4E3A\u7A7A\u3002 + cos-particle-restrict.b = cos-particle-restrict.b: \u57FA\u7C92\u5B50\u4E3A\u7A7A, \u4F46\u6D3E\u751F\u7C92\u5B50\u4E0D\u4E3A\u7A7A\u3002 + cos-particle-restrict.2 = cos-particle-restrict.2: \u7981\u6B62\u7C92\u5B50\u9650\u5236: ''{0}''\u3002 +- cos-st-restricts.1.1 = cos-st-restricts.1.1: \u7C7B\u578B ''{1}'' \u4E3A\u539F\u5B50, \u56E0\u6B64\u5176 ''{''base type definition''}'' ''{0}'' \u5FC5\u987B\u4E3A\u539F\u5B50\u7B80\u5355\u7C7B\u578B\u5B9A\u4E49\u6216\u5185\u7F6E\u57FA\u5143\u6570\u636E\u7C7B\u578B\u3002 ++ cos-st-restricts.1.1 = cos-st-restricts.1.1: \u7C7B\u578B ''{1}'' \u4E3A\u539F\u5B50, \u56E0\u6B64\u5176 '{'base type definition'}' ''{0}'' \u5FC5\u987B\u4E3A\u539F\u5B50\u7B80\u5355\u7C7B\u578B\u5B9A\u4E49\u6216\u5185\u7F6E\u57FA\u5143\u6570\u636E\u7C7B\u578B\u3002 + cos-st-restricts.2.1 = cos-st-restricts.2.1: \u5728\u5217\u8868\u7C7B\u578B ''{0}'' \u7684\u5B9A\u4E49\u4E2D, \u7C7B\u578B ''{1}'' \u662F\u65E0\u6548\u7684\u9879\u7C7B\u578B, \u56E0\u4E3A\u5B83\u65E2\u4E0D\u662F\u5217\u8868\u7C7B\u578B, \u4E5F\u4E0D\u662F\u5305\u542B\u5217\u8868\u7684\u8054\u5408\u7C7B\u578B\u3002 +- cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: ''{''item type definition''}'' \u7684 ''{''final''}'' \u7EC4\u4EF6 ''{0}'' \u5305\u542B ''list''\u3002\u8FD9\u8868\u793A ''{0}'' \u4E0D\u80FD\u7528\u4F5C\u5217\u8868\u7C7B\u578B ''{1}'' \u7684\u9879\u7C7B\u578B\u3002 +- cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: ''{''member type definitions''}'' ''{0}'' \u7684 ''{''final''}'' \u7EC4\u4EF6\u5305\u542B ''union''\u3002\u8FD9\u8868\u793A ''{0}'' \u4E0D\u80FD\u7528\u4F5C\u8054\u5408\u7C7B\u578B ''{1}'' \u7684\u6210\u5458\u7C7B\u578B\u3002 ++ cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: '{'item type definition'}' \u7684 '{'final'}' \u7EC4\u4EF6 ''{0}'' \u5305\u542B ''list''\u3002\u8FD9\u8868\u793A ''{0}'' \u4E0D\u80FD\u7528\u4F5C\u5217\u8868\u7C7B\u578B ''{1}'' \u7684\u9879\u7C7B\u578B\u3002 ++ cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: '{'member type definitions'}' ''{0}'' \u7684 '{'final'}' \u7EC4\u4EF6\u5305\u542B ''union''\u3002\u8FD9\u8868\u793A ''{0}'' \u4E0D\u80FD\u7528\u4F5C\u8054\u5408\u7C7B\u578B ''{1}'' \u7684\u6210\u5458\u7C7B\u578B\u3002 + cos-valid-default.2.1 = cos-valid-default.2.1: \u5143\u7D20 ''{0}'' \u5177\u6709\u503C\u7EA6\u675F\u6761\u4EF6, \u5E76\u4E14\u5FC5\u987B\u5177\u6709\u201C\u6DF7\u5408\u201D\u6216\u201C\u7B80\u5355\u201D\u5185\u5BB9\u6A21\u578B\u3002 +- cos-valid-default.2.2.2 = cos-valid-default.2.2.2: \u7531\u4E8E\u5143\u7D20 ''{0}'' \u5177\u6709 ''{''value constraint''}'', \u5E76\u4E14\u5176\u7C7B\u578B\u5B9A\u4E49\u5177\u6709\u6DF7\u5408\u7684 ''{''content type''}'', \u5219 ''{''content type''}'' \u7684\u7C92\u5B50\u5FC5\u987B\u53EF\u4E3A\u7A7A\u3002 ++ cos-valid-default.2.2.2 = cos-valid-default.2.2.2: \u7531\u4E8E\u5143\u7D20 ''{0}'' \u5177\u6709 '{'value constraint'}', \u5E76\u4E14\u5176\u7C7B\u578B\u5B9A\u4E49\u5177\u6709\u6DF7\u5408\u7684 '{'content type'}', \u5219 '{'content type'}' \u7684\u7C92\u5B50\u5FC5\u987B\u53EF\u4E3A\u7A7A\u3002 + c-props-correct.2 = c-props-correct.2: \u952E\u5F15\u7528 ''{0}'' \u548C\u952E ''{1}'' \u4E2D\u5B57\u6BB5\u7684\u57FA\u6570\u5FC5\u987B\u76F8\u540C\u3002 + ct-props-correct.3 = ct-props-correct.3: \u5728\u590D\u6742\u7C7B\u578B ''{0}'' \u4E2D\u68C0\u6D4B\u5230\u5FAA\u73AF\u5B9A\u4E49\u3002\u8FD9\u8868\u793A ''{0}'' \u5305\u542B\u5728\u5176\u81EA\u8EAB\u7684\u7C7B\u578B\u5206\u5C42\u7ED3\u6784\u4E2D, \u8FD9\u662F\u9519\u8BEF\u7684\u3002 + ct-props-correct.4 = ct-props-correct.4: \u7C7B\u578B ''{0}'' \u9519\u8BEF\u3002\u6307\u5B9A\u4E86\u5177\u6709\u76F8\u540C\u540D\u79F0\u548C\u76EE\u6807\u540D\u79F0\u7A7A\u95F4\u7684\u91CD\u590D\u5C5E\u6027\u7528\u6CD5\u3002\u91CD\u590D\u5C5E\u6027\u7528\u6CD5\u7684\u540D\u79F0\u4E3A ''{1}''\u3002 + ct-props-correct.5 = ct-props-correct.5: \u7C7B\u578B ''{0}'' \u9519\u8BEF\u3002\u4E24\u4E2A\u5C5E\u6027\u58F0\u660E ''{1}'' \u548C ''{2}'' \u5177\u6709\u4ECE ID \u6D3E\u751F\u7684\u7C7B\u578B\u3002 +- derivation-ok-restriction.1 = derivation-ok-restriction.1: \u7C7B\u578B ''{0}'' \u7531\u9650\u5236\u4ECE\u7C7B\u578B ''{1}'' \u6D3E\u751F\u3002\u4F46\u662F, ''{1}'' \u5177\u6709\u7981\u6B62\u7531\u9650\u5236\u6D3E\u751F\u7684 ''{''final''}'' \u5C5E\u6027\u3002 ++ derivation-ok-restriction.1 = derivation-ok-restriction.1: \u7C7B\u578B ''{0}'' \u7531\u9650\u5236\u4ECE\u7C7B\u578B ''{1}'' \u6D3E\u751F\u3002\u4F46\u662F, ''{1}'' \u5177\u6709\u7981\u6B62\u7531\u9650\u5236\u6D3E\u751F\u7684 '{'final'}' \u5C5E\u6027\u3002 + derivation-ok-restriction.2.1.1 = derivation-ok-restriction.2.1.1: \u7C7B\u578B ''{0}'' \u9519\u8BEF\u3002\u6B64\u7C7B\u578B\u4E2D\u7684\u5C5E\u6027\u7528\u6CD5 ''{1}'' \u5177\u6709 ''{2}'' \u7684 ''use'' \u503C, \u8FD9\u4E0E\u57FA\u7C7B\u578B\u4E2D\u7684\u5339\u914D\u5C5E\u6027\u7528\u6CD5\u7684 ''required'' \u503C\u4E0D\u4E00\u81F4\u3002 + derivation-ok-restriction.2.1.2 = derivation-ok-restriction.2.1.2: \u7C7B\u578B ''{0}'' \u9519\u8BEF\u3002\u6B64\u7C7B\u578B\u4E2D\u7684\u5C5E\u6027\u7528\u6CD5 ''{1}'' \u5177\u6709\u7C7B\u578B ''{2}'', \u5B83\u4E0D\u662F\u4ECE\u57FA\u7C7B\u578B\u4E2D\u7684\u5339\u914D\u5C5E\u6027\u7528\u6CD5\u7684\u7C7B\u578B ''{3}'' \u6709\u6548\u6D3E\u751F\u7684\u3002 + derivation-ok-restriction.2.1.3.a = derivation-ok-restriction.2.1.3.a: \u7C7B\u578B ''{0}'' \u9519\u8BEF\u3002\u6B64\u7C7B\u578B\u4E2D\u7684\u5C5E\u6027\u7528\u6CD5 ''{1}'' \u5177\u6709\u4E0D\u56FA\u5B9A\u7684\u6709\u6548\u503C\u7EA6\u675F\u6761\u4EF6, \u800C\u57FA\u7C7B\u578B\u4E2D\u7684\u5339\u914D\u5C5E\u6027\u7528\u6CD5\u7684\u6709\u6548\u503C\u7EA6\u675F\u6761\u4EF6\u662F\u56FA\u5B9A\u7684\u3002 +@@ -210,8 +184,8 @@ + enumeration-required-notation = enumeration-required-notation: {2} ''{1}'' \u4F7F\u7528\u7684 NOTATION \u7C7B\u578B ''{0}'' \u5FC5\u987B\u5177\u6709\u679A\u4E3E\u9762\u503C, \u7528\u4E8E\u6307\u5B9A\u6B64\u7C7B\u578B\u4F7F\u7528\u7684\u6CE8\u91CA\u5143\u7D20\u3002 + enumeration-valid-restriction = enumeration-valid-restriction: \u679A\u4E3E\u503C ''{0}'' \u4E0D\u5728\u57FA\u7C7B\u578B {1} \u7684\u503C\u7A7A\u95F4\u4E2D\u3002 + e-props-correct.2 = e-props-correct.2: \u5143\u7D20 ''{0}'' \u4E2D\u7684\u503C\u7EA6\u675F\u6761\u4EF6\u7684\u503C ''{1}'' \u65E0\u6548\u3002 +- e-props-correct.4 = e-props-correct.4: \u5143\u7D20 ''{0}'' \u7684 ''{''type definition''}'' \u4E0D\u662F\u4ECE substitutionHead ''{1}'' \u7684 ''{''type definition''}'' \u6709\u6548\u6D3E\u751F\u7684, \u6216\u8005 ''{1}'' \u7684 ''{''substitution group exclusions''}'' \u5C5E\u6027\u4E0D\u5141\u8BB8\u8FDB\u884C\u6B64\u6D3E\u751F\u3002 +- e-props-correct.5 = e-props-correct.5: \u5143\u7D20 ''{0}'' \u4E2D\u4E0D\u80FD\u5305\u542B ''{''value constraint''}'', \u56E0\u4E3A\u5143\u7D20\u7684 ''{''type definition''}'' \u6216 ''{''type definition''}'' \u7684 ''{''content type''}'' \u4E3A ID, \u6216\u8005\u662F\u4ECE ID \u6D3E\u751F\u7684\u3002 ++ e-props-correct.4 = e-props-correct.4: \u5143\u7D20 ''{0}'' \u7684 '{'type definition'}' \u4E0D\u662F\u4ECE substitutionHead ''{1}'' \u7684 '{'type definition'}' \u6709\u6548\u6D3E\u751F\u7684, \u6216\u8005 ''{1}'' \u7684 '{'substitution group exclusions'}' \u5C5E\u6027\u4E0D\u5141\u8BB8\u8FDB\u884C\u6B64\u6D3E\u751F\u3002 ++ e-props-correct.5 = e-props-correct.5: \u5143\u7D20 ''{0}'' \u4E2D\u4E0D\u80FD\u5305\u542B '{'value constraint'}', \u56E0\u4E3A\u5143\u7D20\u7684 '{'type definition'}' \u6216 '{'type definition'}' \u7684 '{'content type'}' \u4E3A ID, \u6216\u8005\u662F\u4ECE ID \u6D3E\u751F\u7684\u3002 + e-props-correct.6 = e-props-correct.6: \u5728\u5143\u7D20 ''{0}'' \u4E2D\u68C0\u6D4B\u5230\u5FAA\u73AF\u66FF\u4EE3\u7EC4\u3002 + fractionDigits-valid-restriction = fractionDigits-valid-restriction: \u5728 {2} \u7684\u5B9A\u4E49\u4E2D, \u9762 ''fractionDigits'' \u7684\u503C ''{0}'' \u65E0\u6548, \u56E0\u4E3A\u8BE5\u503C\u5FC5\u987B\u5C0F\u4E8E\u7B49\u4E8E ''fractionDigits'' \u7684\u503C, \u4F46\u5728\u539F\u7EA7\u7C7B\u578B\u4E4B\u4E00\u4E2D\u5DF2\u5C06\u5176\u8BBE\u7F6E\u4E3A ''{1}''\u3002 + fractionDigits-totalDigits = fractionDigits-totalDigits: \u5728 {2} \u7684\u5B9A\u4E49\u4E2D, \u9762 ''fractionDigits'' \u7684\u503C ''{0}'' \u65E0\u6548, \u56E0\u4E3A\u8BE5\u503C\u5FC5\u987B\u5C0F\u4E8E\u7B49\u4E8E ''totalDigits'' \u7684\u503C ''{1}''\u3002 +@@ -232,7 +206,7 @@ + maxInclusive-valid-restriction.3 = maxInclusive-valid-restriction.3: \u7C7B\u578B ''{2}'' \u9519\u8BEF\u3002maxInclusive \u503C ''{0}'' \u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E\u57FA\u7C7B\u578B ''{1}'' \u7684 minInclusive\u3002 + maxInclusive-valid-restriction.4 = maxInclusive-valid-restriction.4: \u7C7B\u578B ''{2}'' \u9519\u8BEF\u3002maxInclusive \u503C ''{0}'' \u5FC5\u987B\u5927\u4E8E\u57FA\u7C7B\u578B ''{1}'' \u7684 minExclusive\u3002 + maxLength-valid-restriction = maxLength-valid-restriction: \u5728 {2} \u7684\u5B9A\u4E49\u4E2D, maxLength \u503C ''{0}'' \u5FC5\u987B\u5C0F\u4E8E\u7B49\u4E8E\u57FA\u7C7B\u578B ''{1}'' \u7684 maxLength\u3002 +- mg-props-correct.2 = mg-props-correct.2: \u5728\u7EC4 ''{0}'' \u4E2D\u68C0\u6D4B\u5230\u5FAA\u73AF\u5B9A\u4E49\u3002\u9012\u5F52\u8DDF\u968F\u7C92\u5B50\u7684 ''{''term''}'' \u4EE5\u4E0B\u503C\u4F1A\u5F15\u5BFC\u5230\u5176 ''{''term''}'' \u662F\u7EC4\u81EA\u8EAB\u7684\u7C92\u5B50\u3002 ++ mg-props-correct.2 = mg-props-correct.2: \u5728\u7EC4 ''{0}'' \u4E2D\u68C0\u6D4B\u5230\u5FAA\u73AF\u5B9A\u4E49\u3002\u9012\u5F52\u8DDF\u968F\u7C92\u5B50\u7684 '{'term'}' \u4EE5\u4E0B\u503C\u4F1A\u5F15\u5BFC\u5230\u5176 '{'term'}' \u662F\u7EC4\u81EA\u8EAB\u7684\u7C92\u5B50\u3002 + minExclusive-less-than-equal-to-maxExclusive = minExclusive-less-than-equal-to-maxExclusive: \u5728 {2} \u7684\u5B9A\u4E49\u4E2D, minExclusive \u503C ''{0}'' \u5FC5\u987B\u5C0F\u4E8E\u7B49\u4E8E maxExclusive \u503C ''{1}''\u3002 + minExclusive-less-than-maxInclusive = minExclusive-less-than-maxInclusive: \u5728 {2} \u7684\u5B9A\u4E49\u4E2D, minExclusive \u503C ''{0}'' \u5FC5\u987B\u5C0F\u4E8E maxInclusive \u503C ''{1}''\u3002 + minExclusive-valid-restriction.1 = minExclusive-valid-restriction.1: \u7C7B\u578B ''{2}'' \u9519\u8BEF\u3002minExclusive \u503C ''{0}'' \u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E\u57FA\u7C7B\u578B ''{1}'' \u7684 minExclusive\u3002 +@@ -249,20 +223,20 @@ + minLength-less-than-equal-to-maxLength = minLength-less-than-equal-to-maxLength: \u5728 {2} \u7684\u5B9A\u4E49\u4E2D, minLength \u7684\u503C ''{0}'' \u5FC5\u987B\u5C0F\u4E8E maxLength \u7684\u503C ''{1}''\u3002 + minLength-valid-restriction = minLength-valid-restriction: \u5728 {2} \u7684\u5B9A\u4E49\u4E2D, minLength ''{0}'' \u5FC5\u987B\u5927\u4E8E\u7B49\u4E8E\u57FA\u7C7B\u578B\u7684 minLength ''{1}''\u3002 + no-xmlns = no-xmlns: \u5C5E\u6027\u58F0\u660E\u7684 {name} \u4E0D\u80FD\u4E0E 'xmlns' \u5339\u914D\u3002 +- no-xsi = no-xsi: \u5C5E\u6027\u58F0\u660E\u7684 ''{''target namespace''}'' \u4E0D\u80FD\u4E0E ''{0}'' \u5339\u914D\u3002 ++ no-xsi = no-xsi: \u5C5E\u6027\u58F0\u660E\u7684 '{'target namespace'}' \u4E0D\u80FD\u4E0E ''{0}'' \u5339\u914D\u3002 + p-props-correct.2.1 = p-props-correct.2.1: \u5728 ''{0}'' \u7684\u58F0\u660E\u4E2D, ''minOccurs'' \u7684\u503C\u4E3A ''{1}'', \u4F46\u8BE5\u503C\u4E0D\u80FD\u5927\u4E8E ''maxOccurs'' \u7684\u503C ''{2}''\u3002 + rcase-MapAndSum.1 = rcase-MapAndSum.1: \u7C92\u5B50\u4E4B\u95F4\u6CA1\u6709\u5B8C\u6574\u7684\u529F\u80FD\u6620\u5C04\u3002 + rcase-MapAndSum.2 = rcase-MapAndSum.2: \u7EC4\u7684\u53D1\u751F\u8303\u56F4 ({0},{1}) \u4E0D\u5728\u57FA\u7EC4\u7684\u53D1\u751F\u8303\u56F4 ({2},{3}) \u7684\u6709\u6548\u9650\u5236\u4E4B\u5185\u3002 + rcase-NameAndTypeOK.1 = rcase-NameAndTypeOK.1: \u5143\u7D20\u7684\u540D\u79F0\u548C\u76EE\u6807\u540D\u79F0\u7A7A\u95F4\u4E0D\u76F8\u540C: \u540D\u79F0\u7A7A\u95F4 ''{1}'' \u4E2D\u7684\u5143\u7D20\u4E3A ''{0}'', \u540D\u79F0\u7A7A\u95F4 ''{3}'' \u4E2D\u7684\u5143\u7D20\u4E3A ''{2}''\u3002 +- rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: \u5176 ''{''term''}'' \u4E3A\u5143\u7D20\u58F0\u660E ''{0}'' \u7684\u7C92\u5B50\u9519\u8BEF\u3002\u5143\u7D20\u58F0\u660E\u7684 ''{''nillable''}'' \u4E3A\u201C\u771F\u201D, \u4F46\u57FA\u7C7B\u578B\u4E2D\u5BF9\u5E94\u7684\u7C92\u5B50\u5177\u6709 ''{''nillable''}'' \u4E3A\u201C\u5047\u201D\u7684\u5143\u7D20\u58F0\u660E\u3002 +- rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: \u5176 ''{''term''}'' \u4E3A\u5143\u7D20\u58F0\u660E ''{0}'' \u7684\u7C92\u5B50\u9519\u8BEF\u3002\u8BE5\u7C92\u5B50\u7684\u53D1\u751F\u8303\u56F4 ({1},{2}) \u4E0D\u5728\u57FA\u7C7B\u578B\u4E2D\u5BF9\u5E94\u7C92\u5B50\u7684\u8303\u56F4 ({3},{4}) \u7684\u6709\u6548\u9650\u5236\u4E4B\u5185\u3002 ++ rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: \u5176 '{'term'}' \u4E3A\u5143\u7D20\u58F0\u660E ''{0}'' \u7684\u7C92\u5B50\u9519\u8BEF\u3002\u5143\u7D20\u58F0\u660E\u7684 '{'nillable'}' \u4E3A\u201C\u771F\u201D, \u4F46\u57FA\u7C7B\u578B\u4E2D\u5BF9\u5E94\u7684\u7C92\u5B50\u5177\u6709 '{'nillable'}' \u4E3A\u201C\u5047\u201D\u7684\u5143\u7D20\u58F0\u660E\u3002 ++ rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: \u5176 '{'term'}' \u4E3A\u5143\u7D20\u58F0\u660E ''{0}'' \u7684\u7C92\u5B50\u9519\u8BEF\u3002\u8BE5\u7C92\u5B50\u7684\u53D1\u751F\u8303\u56F4 ({1},{2}) \u4E0D\u5728\u57FA\u7C7B\u578B\u4E2D\u5BF9\u5E94\u7C92\u5B50\u7684\u8303\u56F4 ({3},{4}) \u7684\u6709\u6548\u9650\u5236\u4E4B\u5185\u3002 + rcase-NameAndTypeOK.4.a = rcase-NameAndTypeOK.4.a: \u5143\u7D20 ''{0}'' \u4E0D\u662F\u56FA\u5B9A\u7684, \u4F46\u57FA\u7C7B\u578B\u4E2D\u7684\u5BF9\u5E94\u5143\u7D20\u662F\u56FA\u5B9A\u7684, \u4E14\u503C\u4E3A ''{1}''\u3002 + rcase-NameAndTypeOK.4.b = rcase-NameAndTypeOK.4.b: \u5143\u7D20 ''{0}'' \u662F\u56FA\u5B9A\u7684, \u4E14\u503C\u4E3A ''{1}'', \u4F46\u57FA\u7C7B\u578B\u4E2D\u7684\u5BF9\u5E94\u5143\u7D20\u662F\u56FA\u5B9A\u7684, \u4E14\u503C\u4E3A ''{2}''\u3002 + rcase-NameAndTypeOK.5 = rcase-NameAndTypeOK.5: \u5143\u7D20 ''{0}'' \u7684\u8EAB\u4EFD\u7EA6\u675F\u6761\u4EF6\u4E0D\u662F\u57FA\u7C7B\u578B\u4E2D\u90A3\u4E9B\u8EAB\u4EFD\u7EA6\u675F\u6761\u4EF6\u7684\u5B50\u96C6\u3002 + rcase-NameAndTypeOK.6 = rcase-NameAndTypeOK.6: \u5143\u7D20 ''{0}'' \u7684\u4E0D\u63A5\u53D7\u66FF\u4EE3\u4E0D\u662F\u57FA\u5143\u7D20\u4E2D\u4E0D\u63A5\u53D7\u66FF\u4EE3\u7684\u8D85\u96C6\u3002 + rcase-NameAndTypeOK.7 = rcase-NameAndTypeOK.7: \u5143\u7D20 ''{0}'' \u7684\u7C7B\u578B ''{1}'' \u4E0D\u662F\u4ECE\u57FA\u5143\u7D20\u7684\u7C7B\u578B ''{2}'' \u6D3E\u751F\u7684\u3002 + rcase-NSCompat.1 = rcase-NSCompat.1: \u5143\u7D20 ''{0}'' \u5177\u6709\u540D\u79F0\u7A7A\u95F4 ''{1}'', \u5728\u57FA\u5143\u7D20\u4E2D, \u901A\u914D\u7B26\u4E0D\u5141\u8BB8\u5177\u6709\u6B64\u540D\u79F0\u7A7A\u95F4\u3002 +- rcase-NSCompat.2 = rcase-NSCompat.2: \u5176 ''{''term''}'' \u4E3A\u5143\u7D20\u58F0\u660E ''{0}'' \u7684\u7C92\u5B50\u9519\u8BEF\u3002\u8BE5\u7C92\u5B50\u7684\u53D1\u751F\u8303\u56F4 ({1},{2}) \u4E0D\u5728\u57FA\u7C7B\u578B\u4E2D\u5BF9\u5E94\u7C92\u5B50\u7684\u8303\u56F4 ({3},{4}) \u7684\u6709\u6548\u9650\u5236\u4E4B\u5185\u3002 ++ rcase-NSCompat.2 = rcase-NSCompat.2: \u5176 '{'term'}' \u4E3A\u5143\u7D20\u58F0\u660E ''{0}'' \u7684\u7C92\u5B50\u9519\u8BEF\u3002\u8BE5\u7C92\u5B50\u7684\u53D1\u751F\u8303\u56F4 ({1},{2}) \u4E0D\u5728\u57FA\u7C7B\u578B\u4E2D\u5BF9\u5E94\u7C92\u5B50\u7684\u8303\u56F4 ({3},{4}) \u7684\u6709\u6548\u9650\u5236\u4E4B\u5185\u3002 + rcase-NSRecurseCheckCardinality.1 = rcase-NSRecurseCheckCardinality.1: \u7C92\u5B50\u4E4B\u95F4\u6CA1\u6709\u5B8C\u6574\u7684\u529F\u80FD\u6620\u5C04\u3002 + rcase-NSRecurseCheckCardinality.2 = rcase-NSRecurseCheckCardinality.2: \u7EC4\u7684\u53D1\u751F\u8303\u56F4 ({0},{1}) \u4E0D\u5728\u57FA\u672C\u901A\u914D\u7B26\u8303\u56F4 ({2},{3}) \u7684\u6709\u6548\u9650\u5236\u4E4B\u5185\u3002 + rcase-NSSubset.1 = rcase-NSSubset.1: \u901A\u914D\u7B26\u4E0D\u662F\u57FA\u672C\u901A\u914D\u7B26\u4E2D\u5BF9\u5E94\u901A\u914D\u7B26\u7684\u5B50\u96C6\u3002 +@@ -278,7 +252,7 @@ + # src-redefine.1 = src-redefine.1: The component ''{0}'' is begin redefined, but its corresponding component isn't in the schema document being redefined (with namespace ''{2}''), but in a different document, with namespace ''{1}''. + sch-props-correct.2 = sch-props-correct.2: \u65B9\u6848\u4E0D\u80FD\u5305\u542B\u5177\u6709\u76F8\u540C\u540D\u79F0\u7684\u4E24\u4E2A\u5168\u5C40\u7EC4\u4EF6; \u800C\u6B64\u65B9\u6848\u4E2D\u5305\u542B\u4E24\u4E2A ''{0}''\u3002 + st-props-correct.2 = st-props-correct.2: \u5728\u7B80\u5355\u7C7B\u578B ''{0}'' \u4E2D\u68C0\u6D4B\u5230\u5FAA\u73AF\u5B9A\u4E49\u3002\u8FD9\u8868\u793A ''{0}'' \u5305\u542B\u5728\u5176\u81EA\u8EAB\u7684\u7C7B\u578B\u5206\u5C42\u7ED3\u6784\u4E2D, \u8FD9\u662F\u9519\u8BEF\u7684\u3002 +- st-props-correct.3 = st-props-correct.3: \u7C7B\u578B ''{0}'' \u9519\u8BEF\u3002''{''base type definition''}'' \u7684 ''{''final''}'' \u7684\u503C ''{1}'' \u7981\u6B62\u7531\u9650\u5236\u6D3E\u751F\u3002 ++ st-props-correct.3 = st-props-correct.3: \u7C7B\u578B ''{0}'' \u9519\u8BEF\u3002'{'base type definition'}' \u7684 '{'final'}' \u7684\u503C ''{1}'' \u7981\u6B62\u7531\u9650\u5236\u6D3E\u751F\u3002 + totalDigits-valid-restriction = totalDigits-valid-restriction: \u5728 {2} \u7684\u5B9A\u4E49\u4E2D, \u9762 ''totalDigits'' \u7684\u503C ''{0}'' \u65E0\u6548, \u56E0\u4E3A\u8BE5\u503C\u5FC5\u987B\u5C0F\u4E8E\u7B49\u4E8E ''totalDigits'' \u7684\u503C, \u800C\u5728\u539F\u7EA7\u7C7B\u578B\u4E4B\u4E00\u4E2D\u5DF2\u5C06\u5176\u8BBE\u7F6E\u4E3A ''{1}''\u3002 + whiteSpace-valid-restriction.1 = whiteSpace-valid-restriction.1: \u5728 {0} \u7684\u5B9A\u4E49\u4E2D, \u9762 ''whitespace'' \u7684\u503C ''{1}'' \u65E0\u6548, \u56E0\u4E3A ''whitespace'' \u7684\u503C\u5DF2\u5728\u539F\u7EA7\u7C7B\u578B\u4E4B\u4E00\u4E2D\u8BBE\u7F6E\u4E3A ''collapse''\u3002 + whiteSpace-valid-restriction.2 = whiteSpace-valid-restriction.2: \u5728 {0} \u7684\u5B9A\u4E49\u4E2D, \u9762 ''whitespace'' \u7684\u503C ''preserve'' \u65E0\u6548, \u56E0\u4E3A ''whitespace'' \u7684\u503C\u5DF2\u5728\u539F\u7EA7\u7C7B\u578B\u4E4B\u4E00\u4E2D\u8BBE\u7F6E\u4E3A ''replace''\u3002 +@@ -306,7 +280,7 @@ + c-selector-xpath = c-selector-xpath: \u9009\u62E9\u5668\u503C ''{0}'' \u65E0\u6548; \u9009\u62E9\u5668 xpath \u4E0D\u80FD\u5305\u542B\u5C5E\u6027\u3002 + EmptyTargetNamespace = EmptyTargetNamespace: \u5728\u65B9\u6848\u6587\u6863 ''{0}'' \u4E2D, ''targetNamespace'' \u5C5E\u6027\u7684\u503C\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32\u3002 + FacetValueFromBase = FacetValueFromBase: \u5728\u7C7B\u578B ''{0}'' \u7684\u58F0\u660E\u4E2D, \u9762 ''{2}'' \u7684\u503C ''{1}'' \u5FC5\u987B\u6765\u81EA\u57FA\u7C7B\u578B\u7684\u503C\u7A7A\u95F4 ''{3}''\u3002 +- FixedFacetValue = FixedFacetValue: \u5728 {3} \u7684\u5B9A\u4E49\u4E2D, \u9762 ''{0}'' \u7684\u503C ''{1}'' \u65E0\u6548, \u56E0\u4E3A ''{0}'' \u7684\u503C\u5DF2\u5728\u539F\u7EA7\u7C7B\u578B\u4E4B\u4E00\u4E2D\u8BBE\u7F6E\u4E3A ''{2}'', \u5E76\u4E14 ''{''fixed''}'' = true\u3002 ++ FixedFacetValue = FixedFacetValue: \u5728 {3} \u7684\u5B9A\u4E49\u4E2D, \u9762 ''{0}'' \u7684\u503C ''{1}'' \u65E0\u6548, \u56E0\u4E3A ''{0}'' \u7684\u503C\u5DF2\u5728\u539F\u7EA7\u7C7B\u578B\u4E4B\u4E00\u4E2D\u8BBE\u7F6E\u4E3A ''{2}'', \u5E76\u4E14 '{'fixed'}' = true\u3002 + InvalidRegex = InvalidRegex: \u6A21\u5F0F\u503C ''{0}'' \u4E0D\u662F\u6709\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\u3002\u5217 ''{2}'' \u4E0A\u62A5\u544A\u7684\u9519\u8BEF\u4E3A: ''{1}''\u3002 + maxOccurLimit = \u89E3\u6790\u5668\u7684\u5F53\u524D\u914D\u7F6E\u4E0D\u5141\u8BB8\u5C06 maxOccurs \u5C5E\u6027\u503C\u8BBE\u7F6E\u4E3A\u5927\u4E8E\u503C {0}\u3002 + PublicSystemOnNotation = PublicSystemOnNotation: \u5143\u7D20 ''notation'' \u4E2D\u5FC5\u987B\u81F3\u5C11\u51FA\u73B0 ''public'' \u548C ''system'' \u4E2D\u7684\u4E00\u4E2A\u3002 +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_zh_TW.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSchemaMessages_zh_TW.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,32 +1,6 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file contains error and warning messages related to XML Schema + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XMLSchemaMessages_zh_TW.properties /st_wptg_1.8.0.0.0jdk/3 2013/09/14 02:16:34 gmolloy Exp $ + + BadMessageKey = \u627E\u4E0D\u5230\u5C0D\u61C9\u8A0A\u606F\u7D22\u5F15\u9375\u7684\u932F\u8AA4\u8A0A\u606F\u3002 + FormatFailed = \u683C\u5F0F\u5316\u4E0B\u5217\u8A0A\u606F\u6642\u767C\u751F\u5167\u90E8\u932F\u8AA4:\n +@@ -60,7 +34,7 @@ + #validation (3.X.4) + + cvc-attribute.3 = cvc-attribute.3: \u5143\u7D20 ''{0}'' \u4E0A\u5C6C\u6027 ''{1}'' \u7684\u503C ''{2}'' \u5C0D\u65BC\u5176\u985E\u578B ''{3}'' \u7121\u6548\u3002 +- cvc-attribute.4 = cvc-attribute.4: \u5143\u7D20 ''{0}'' \u4E0A\u5C6C\u6027 ''{1}'' \u7684\u503C ''{2}'' \u5C0D\u65BC\u5176\u56FA\u5B9A ''{''value constraint''}'' \u7121\u6548\u3002\u5C6C\u6027\u5FC5\u9808\u5177\u6709 ''{3}'' \u7684\u503C\u3002 ++ cvc-attribute.4 = cvc-attribute.4: \u5143\u7D20 ''{0}'' \u4E0A\u5C6C\u6027 ''{1}'' \u7684\u503C ''{2}'' \u5C0D\u65BC\u5176\u56FA\u5B9A '{'value constraint'}' \u7121\u6548\u3002\u5C6C\u6027\u5FC5\u9808\u5177\u6709 ''{3}'' \u7684\u503C\u3002 + cvc-complex-type.2.1 = cvc-complex-type.2.1: \u5143\u7D20 ''{0}'' \u4E0D\u80FD\u6709\u5B57\u5143\u6216\u5143\u7D20\u8CC7\u8A0A\u9805\u76EE [children]\uFF0C\u56E0\u70BA\u985E\u578B\u7684\u5167\u5BB9\u985E\u578B\u70BA\u7A7A\u767D\u3002 + cvc-complex-type.2.2 = cvc-complex-type.2.2: \u5143\u7D20 ''{0}'' \u4E0D\u80FD\u6709\u5143\u7D20 [children]\uFF0C\u4E14\u503C\u5FC5\u9808\u6709\u6548\u3002 + cvc-complex-type.2.3 = cvc-complex-type.2.3: \u5143\u7D20 ''{0}'' \u4E0D\u80FD\u6709\u5B57\u5143 [children]\uFF0C\u56E0\u70BA\u985E\u578B\u7684\u5167\u5BB9\u985E\u578B\u70BA element-only\u3002 +@@ -74,22 +48,22 @@ + cvc-complex-type.3.2.2 = cvc-complex-type.3.2.2: \u4E0D\u5141\u8A31\u5C6C\u6027 ''{1}'' \u51FA\u73FE\u5728\u5143\u7D20 ''{0}'' \u4E2D\u3002 + cvc-complex-type.4 = cvc-complex-type.4: \u5C6C\u6027 ''{1}'' \u5FC5\u9808\u51FA\u73FE\u5728\u5143\u7D20 ''{0}'' \u4E2D\u3002 + cvc-complex-type.5.1 = cvc-complex-type.5.1: \u5728\u5143\u7D20 ''{0}'' \u4E2D\uFF0C\u5C6C\u6027 ''{1}'' \u70BA Wild ID\u3002\u4F46\u662F\u5DF2\u7D93\u6709\u4E00\u500B Wild ID ''{2}''\u3002\u53EA\u80FD\u6709\u4E00\u500B Wild ID\u3002 +- cvc-complex-type.5.2 = cvc-complex-type.5.2: \u5728\u5143\u7D20 ''{0}'' \u4E2D\uFF0C\u5C6C\u6027 ''{1}'' \u70BA Wild ID\u3002\u4F46\u662F\u5DF2\u7D93\u6709\u4E00\u500B\u5F9E ''{''attribute uses''}'' \u4E2D\u7684 ID \u884D\u751F\u800C\u4F86\u7684\u5C6C\u6027 ''{2}''\u3002 ++ cvc-complex-type.5.2 = cvc-complex-type.5.2: \u5728\u5143\u7D20 ''{0}'' \u4E2D\uFF0C\u5C6C\u6027 ''{1}'' \u70BA Wild ID\u3002\u4F46\u662F\u5DF2\u7D93\u6709\u4E00\u500B\u5F9E '{'attribute uses'}' \u4E2D\u7684 ID \u884D\u751F\u800C\u4F86\u7684\u5C6C\u6027 ''{2}''\u3002 + cvc-datatype-valid.1.2.1 = cvc-datatype-valid.1.2.1: ''{0}'' \u4E0D\u662F ''{1}'' \u7684\u6709\u6548\u503C\u3002 + cvc-datatype-valid.1.2.2 = cvc-datatype-valid.1.2.2: ''{0}'' \u4E0D\u662F\u6E05\u55AE\u985E\u578B ''{1}'' \u7684\u6709\u6548\u503C\u3002 + cvc-datatype-valid.1.2.3 = cvc-datatype-valid.1.2.3: ''{0}'' \u4E0D\u662F\u806F\u96C6\u985E\u578B ''{1}'' \u7684\u6709\u6548\u503C\u3002 + cvc-elt.1 = cvc-elt.1: \u627E\u4E0D\u5230\u5143\u7D20 ''{0}'' \u7684\u5BA3\u544A\u3002 +- cvc-elt.2 = cvc-elt.2: ''{0}'' \u5143\u7D20\u5BA3\u544A\u4E2D ''{''abstract''}'' \u7684\u503C\u5FC5\u9808\u70BA\u507D\u3002 +- cvc-elt.3.1 = cvc-elt.3.1: \u5C6C\u6027 ''{1}'' \u4E0D\u53EF\u51FA\u73FE\u5728\u5143\u7D20 ''{0}'' \u4E2D\uFF0C\u56E0\u70BA ''{0}'' \u7684 ''{''nillable''}'' \u5C6C\u6027\u70BA\u507D\u3002 ++ cvc-elt.2 = cvc-elt.2: ''{0}'' \u5143\u7D20\u5BA3\u544A\u4E2D '{'abstract'}' \u7684\u503C\u5FC5\u9808\u70BA\u507D\u3002 ++ cvc-elt.3.1 = cvc-elt.3.1: \u5C6C\u6027 ''{1}'' \u4E0D\u53EF\u51FA\u73FE\u5728\u5143\u7D20 ''{0}'' \u4E2D\uFF0C\u56E0\u70BA ''{0}'' \u7684 '{'nillable'}' \u5C6C\u6027\u70BA\u507D\u3002 + cvc-elt.3.2.1 = cvc-elt.3.2.1: \u5143\u7D20 ''{0}'' \u4E0D\u53EF\u6709\u5B57\u5143\u6216\u5143\u7D20\u8CC7\u8A0A [children]\uFF0C\u56E0\u70BA\u6307\u5B9A\u4E86 ''{1}''\u3002 +- cvc-elt.3.2.2 = cvc-elt.3.2.2: \u5143\u7D20 ''{0}'' \u4E0D\u53EF\u6709\u56FA\u5B9A\u7684 ''{''value constraint''}''\uFF0C\u56E0\u70BA\u6307\u5B9A\u4E86 ''{1}''\u3002 ++ cvc-elt.3.2.2 = cvc-elt.3.2.2: \u5143\u7D20 ''{0}'' \u4E0D\u53EF\u6709\u56FA\u5B9A\u7684 '{'value constraint'}'\uFF0C\u56E0\u70BA\u6307\u5B9A\u4E86 ''{1}''\u3002 + cvc-elt.4.1 = cvc-elt.4.1: \u5143\u7D20 ''{0}'' \u5C6C\u6027 ''{1}'' \u7684\u503C ''{2}'' \u4E0D\u662F\u6709\u6548\u7684 QName\u3002 + cvc-elt.4.2 = cvc-elt.4.2: \u7121\u6CD5\u5C07 ''{1}'' \u89E3\u6790\u70BA\u5143\u7D20 ''{0}'' \u7684\u985E\u578B\u5B9A\u7FA9\u3002 + cvc-elt.4.3 = cvc-elt.4.3: \u985E\u578B ''{1}'' \u4E0D\u662F\u6709\u6548\u884D\u751F\u81EA\u5143\u7D20 ''{0}'' \u7684\u985E\u578B\u5B9A\u7FA9 ''{2}''\u3002 +- cvc-elt.5.1.1 = cvc-elt.5.1.1: \u5143\u7D20 ''{0}'' \u7684 ''{''value constraint''}'' ''{2}'' \u4E0D\u662F\u985E\u578B ''{1}'' \u7684\u6709\u6548\u9810\u8A2D\u503C\u3002 ++ cvc-elt.5.1.1 = cvc-elt.5.1.1: \u5143\u7D20 ''{0}'' \u7684 '{'value constraint'}' ''{2}'' \u4E0D\u662F\u985E\u578B ''{1}'' \u7684\u6709\u6548\u9810\u8A2D\u503C\u3002 + cvc-elt.5.2.2.1 = cvc-elt.5.2.2.1: \u5143\u7D20 ''{0}'' \u4E0D\u53EF\u6709\u5143\u7D20\u8CC7\u8A0A\u9805\u76EE [children]\u3002 +- cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: \u5143\u7D20 ''{0}'' \u7684\u503C ''{1}'' \u4E0D\u7B26\u5408\u56FA\u5B9A ''{''value constraint''}'' \u503C ''{2}''\u3002 +- cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: \u5143\u7D20 ''{0}'' \u7684\u503C ''{1}'' \u4E0D\u7B26\u5408 ''{''value constraint''}'' \u503C ''{2}''\u3002 ++ cvc-elt.5.2.2.2.1 = cvc-elt.5.2.2.2.1: \u5143\u7D20 ''{0}'' \u7684\u503C ''{1}'' \u4E0D\u7B26\u5408\u56FA\u5B9A '{'value constraint'}' \u503C ''{2}''\u3002 ++ cvc-elt.5.2.2.2.2 = cvc-elt.5.2.2.2.2: \u5143\u7D20 ''{0}'' \u7684\u503C ''{1}'' \u4E0D\u7B26\u5408 '{'value constraint'}' \u503C ''{2}''\u3002 + cvc-enumeration-valid = cvc-enumeration-valid: \u503C ''{0}'' \u5C0D\u65BC\u5217\u8209 ''{1}'' \u800C\u8A00\u4E26\u975E facet-valid\u3002\u5B83\u5FC5\u9808\u662F\u4F86\u81EA\u5217\u8209\u7684\u503C\u3002 + cvc-fractionDigits-valid = cvc-fractionDigits-valid: \u503C ''{0}'' \u5177\u6709 {1} \u5206\u6578\u4F4D\u6578\uFF0C\u4F46\u662F\u5206\u6578\u4F4D\u6578\u7684\u6578\u76EE\u9650\u5236\u70BA {2}\u3002 + cvc-id.1 = cvc-id.1: IDREF ''{0}'' \u6C92\u6709 ID/IDREF \u9023\u7D50\u3002 +@@ -168,10 +142,10 @@ + ag-props-correct.2 = ag-props-correct.2: \u5C6C\u6027\u7FA4\u7D44 ''{0}'' \u7684\u932F\u8AA4\u3002\u91CD\u8907\u5C6C\u6027\u4F7F\u7528\u76F8\u540C\u540D\u7A31\u4E14\u6307\u5B9A\u4E86\u76EE\u6A19\u547D\u540D\u7A7A\u9593\u3002\u91CD\u8907\u5C6C\u6027\u4F7F\u7528\u7684\u540D\u7A31\u70BA ''{1}''\u3002 + ag-props-correct.3 = ag-props-correct.3: \u5C6C\u6027\u7FA4\u7D44 ''{0}'' \u7684\u932F\u8AA4\u3002\u5169\u500B\u5C6C\u6027\u5BA3\u544A ''{1}'' \u8207 ''{2}'' \u5177\u6709\u884D\u751F\u81EA ID \u7684\u985E\u578B\u3002 + a-props-correct.2 = a-props-correct.2: \u5C6C\u6027 ''{0}'' \u4E2D\u7684\u503C\u9650\u5236\u689D\u4EF6\u503C ''{1}'' \u7121\u6548\u3002 +- a-props-correct.3 = a-props-correct.3: \u5C6C\u6027 ''{0}'' \u7121\u6CD5\u4F7F\u7528 ''fixed'' \u6216 ''default''\uFF0C\u56E0\u70BA\u5C6C\u6027\u7684 ''{''type definition''}'' \u70BA ID\uFF0C\u6216\u884D\u751F\u81EA ID\u3002 +- au-props-correct.2 = au-props-correct.2: \u5728 ''{0}'' \u7684\u5C6C\u6027\u5BA3\u544A\u4E2D\uFF0C\u6307\u5B9A\u4E86 ''{1}'' \u7684\u56FA\u5B9A\u503C\u3002\u56E0\u6B64\uFF0C\u82E5\u53C3\u7167 ''{0}'' \u7684\u5C6C\u6027\u4F7F\u7528\u4E5F\u5177\u6709 ''{''value constraint''}''\uFF0C\u5B83\u5FC5\u9808\u662F\u56FA\u5B9A\u503C\u4E14\u503C\u5FC5\u9808\u70BA ''{1}''\u3002 ++ a-props-correct.3 = a-props-correct.3: \u5C6C\u6027 ''{0}'' \u7121\u6CD5\u4F7F\u7528 ''fixed'' \u6216 ''default''\uFF0C\u56E0\u70BA\u5C6C\u6027\u7684 '{'type definition'}' \u70BA ID\uFF0C\u6216\u884D\u751F\u81EA ID\u3002 ++ au-props-correct.2 = au-props-correct.2: \u5728 ''{0}'' \u7684\u5C6C\u6027\u5BA3\u544A\u4E2D\uFF0C\u6307\u5B9A\u4E86 ''{1}'' \u7684\u56FA\u5B9A\u503C\u3002\u56E0\u6B64\uFF0C\u82E5\u53C3\u7167 ''{0}'' \u7684\u5C6C\u6027\u4F7F\u7528\u4E5F\u5177\u6709 '{'value constraint'}'\uFF0C\u5B83\u5FC5\u9808\u662F\u56FA\u5B9A\u503C\u4E14\u503C\u5FC5\u9808\u70BA ''{1}''\u3002 + cos-all-limited.1.2 = cos-all-limited.1.2: 'all' \u6A21\u578B\u7FA4\u7D44\u5FC5\u9808\u51FA\u73FE\u5728 '{'min occurs'}' = '{'max occurs'}' = 1 \u7684\u7269\u4EF6\u4E2D\uFF0C\u4E14\u8A72\u7269\u4EF6\u5FC5\u9808\u662F\u4E00\u5C0D\u7D44\u6210\u8907\u96DC\u985E\u578B\u5B9A\u7FA9\u4E4B '{'content type'}' \u7269\u4EF6\u4E2D\u7684\u4E00\u90E8\u5206\u3002 +- cos-all-limited.2 = cos-all-limited.2: ''all'' \u6A21\u578B\u7FA4\u7D44\u4E2D\u5143\u7D20\u7684 ''{''max occurs''}'' \u5FC5\u9808\u662F 0 \u6216 1\u3002\u5143\u7D20 ''{1}'' \u7684\u503C ''{0}'' \u7121\u6548\u3002 ++ cos-all-limited.2 = cos-all-limited.2: ''all'' \u6A21\u578B\u7FA4\u7D44\u4E2D\u5143\u7D20\u7684 '{'max occurs'}' \u5FC5\u9808\u662F 0 \u6216 1\u3002\u5143\u7D20 ''{1}'' \u7684\u503C ''{0}'' \u7121\u6548\u3002 + cos-applicable-facets = cos-applicable-facets: \u985E\u578B {1} \u4E0D\u5141\u8A31 Facet ''{0}''\u3002 + cos-ct-extends.1.1 = cos-ct-extends.1.1: \u985E\u578B ''{0}'' \u662F\u7531\u64F4\u5145\u5957\u4EF6\u5F9E\u985E\u578B ''{1}'' \u884D\u751F\u3002\u4E0D\u904E\uFF0C''{1}'' \u7684 ''final'' \u5C6C\u6027\u7981\u6B62\u7531\u64F4\u5145\u5957\u4EF6\u884D\u751F\u3002 + cos-ct-extends.1.4.3.2.2.1.a = cos-ct-extends.1.4.3.2.2.1.a: \u884D\u751F\u985E\u578B\u8207\u5176\u57FA\u790E\u7684\u5167\u5BB9\u985E\u578B\u7686\u5FC5\u9808\u662F\u6DF7\u5408\u985E\u578B\u6216\u5169\u8005\u7686\u662F element-only\u3002\u985E\u578B ''{0}'' \u662F element-only\uFF0C\u4F46\u5176\u57FA\u790E\u985E\u578B\u5247\u5426\u3002 +@@ -182,17 +156,17 @@ + cos-particle-restrict.a = cos-particle-restrict.a: \u884D\u751F\u7269\u4EF6\u70BA\u7A7A\u767D\uFF0C\u5247\u57FA\u790E\u7269\u4EF6\u4E0D\u53EF\u70BA\u7A7A\u767D\u3002 + cos-particle-restrict.b = cos-particle-restrict.b: \u57FA\u790E\u7269\u4EF6\u70BA\u7A7A\u767D\uFF0C\u4F46\u662F\u884D\u751F\u7269\u4EF6\u5247\u5426\u3002 + cos-particle-restrict.2 = cos-particle-restrict.2: \u7981\u6B62\u7684\u7269\u4EF6\u9650\u5236: ''{0}''\u3002 +- cos-st-restricts.1.1 = cos-st-restricts.1.1: \u985E\u578B ''{1}'' \u70BA\u55AE\u5143\u985E\u578B\uFF0C\u56E0\u6B64\u5176 ''{''base type definition''}'' (''{0}'') \u5FC5\u9808\u662F\u55AE\u5143\u7C21\u55AE\u985E\u578B\u5B9A\u7FA9\u6216\u5167\u5EFA\u7684\u539F\u59CB\u8CC7\u6599\u985E\u578B\u3002 ++ cos-st-restricts.1.1 = cos-st-restricts.1.1: \u985E\u578B ''{1}'' \u70BA\u55AE\u5143\u985E\u578B\uFF0C\u56E0\u6B64\u5176 '{'base type definition'}' (''{0}'') \u5FC5\u9808\u662F\u55AE\u5143\u7C21\u55AE\u985E\u578B\u5B9A\u7FA9\u6216\u5167\u5EFA\u7684\u539F\u59CB\u8CC7\u6599\u985E\u578B\u3002 + cos-st-restricts.2.1 = cos-st-restricts.2.1: \u6E05\u55AE\u985E\u578B ''{0}'' \u7684\u5B9A\u7FA9\u4E2D\uFF0C\u985E\u578B ''{1}'' \u662F\u7121\u6548\u7684\u9805\u76EE\u985E\u578B\uFF0C\u56E0\u70BA\u5B83\u662F\u6E05\u55AE\u985E\u578B\uFF0C\u6216\u5305\u542B\u6E05\u55AE\u7684\u806F\u96C6\u985E\u578B\u3002 +- cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: ''{''item type definition''}'' \u7684 ''{''final''}'' \u5143\u4EF6 ''{0}'' \u5305\u542B ''list''\u3002\u9019\u4EE3\u8868 ''{0}'' \u7121\u6CD5\u4F5C\u70BA\u6E05\u55AE\u985E\u578B ''{1}'' \u7684\u9805\u76EE\u985E\u578B\u3002 +- cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: ''{''member type definitions''}'' \u7684 ''{''final''}'' \u5143\u4EF6 ''{0}'' \u5305\u542B ''union''\u3002\u9019\u4EE3\u8868 ''{0}'' \u7121\u6CD5\u4F5C\u70BA\u806F\u96C6\u985E\u578B ''{1}'' \u7684\u6210\u54E1\u985E\u578B\u3002 ++ cos-st-restricts.2.3.1.1 = cos-st-restricts.2.3.1.1: '{'item type definition'}' \u7684 '{'final'}' \u5143\u4EF6 ''{0}'' \u5305\u542B ''list''\u3002\u9019\u4EE3\u8868 ''{0}'' \u7121\u6CD5\u4F5C\u70BA\u6E05\u55AE\u985E\u578B ''{1}'' \u7684\u9805\u76EE\u985E\u578B\u3002 ++ cos-st-restricts.3.3.1.1 = cos-st-restricts.3.3.1.1: '{'member type definitions'}' \u7684 '{'final'}' \u5143\u4EF6 ''{0}'' \u5305\u542B ''union''\u3002\u9019\u4EE3\u8868 ''{0}'' \u7121\u6CD5\u4F5C\u70BA\u806F\u96C6\u985E\u578B ''{1}'' \u7684\u6210\u54E1\u985E\u578B\u3002 + cos-valid-default.2.1 = cos-valid-default.2.1: \u5143\u7D20 ''{0}'' \u5177\u6709\u503C\u9650\u5236\u689D\u4EF6\uFF0C\u4E14\u5FC5\u9808\u5177\u6709\u6DF7\u5408\u6216\u7C21\u55AE\u5167\u5BB9\u6A21\u578B\u3002 +- cos-valid-default.2.2.2 = cos-valid-default.2.2.2: \u7531\u65BC\u5143\u7D20 ''{0}'' \u5177\u6709 ''{''value constraint''}'' \u4E14\u5176\u985E\u578B\u5B9A\u7FA9\u5177\u6709\u6DF7\u5408\u7684 ''{''content type''}''\uFF0C\u56E0\u6B64 ''{''content type''}'' \u7684\u7269\u4EF6\u5FC5\u9808\u662F\u53EF\u7A7A\u767D\u3002 ++ cos-valid-default.2.2.2 = cos-valid-default.2.2.2: \u7531\u65BC\u5143\u7D20 ''{0}'' \u5177\u6709 '{'value constraint'}' \u4E14\u5176\u985E\u578B\u5B9A\u7FA9\u5177\u6709\u6DF7\u5408\u7684 '{'content type'}'\uFF0C\u56E0\u6B64 '{'content type'}' \u7684\u7269\u4EF6\u5FC5\u9808\u662F\u53EF\u7A7A\u767D\u3002 + c-props-correct.2 = c-props-correct.2: keyref ''{0}'' \u8207 key ''{1}'' \u7684 Fields \u57FA\u6578\u5F7C\u6B64\u5FC5\u9808\u76F8\u7B26\u3002 + ct-props-correct.3 = ct-props-correct.3: \u5075\u6E2C\u5230\u8907\u96DC\u985E\u578B ''{0}'' \u7684\u5FAA\u74B0\u5B9A\u7FA9\u3002\u9019\u4EE3\u8868 ''{0}'' \u5305\u542B\u5728\u81EA\u8EAB\u985E\u578B\u968E\u5C64\u4E2D\uFF0C\u9019\u662F\u4E00\u9805\u932F\u8AA4\u3002 + ct-props-correct.4 = ct-props-correct.4: \u985E\u578B ''{0}'' \u7684\u932F\u8AA4\u3002\u91CD\u8907\u5C6C\u6027\u4F7F\u7528\u76F8\u540C\u540D\u7A31\u4E14\u6307\u5B9A\u4E86\u76EE\u6A19\u547D\u540D\u7A7A\u9593\u3002\u91CD\u8907\u5C6C\u6027\u4F7F\u7528\u7684\u540D\u7A31\u70BA ''{1}''\u3002 + ct-props-correct.5 = ct-props-correct.5: \u985E\u578B ''{0}'' \u7684\u932F\u8AA4\u3002\u5169\u500B\u5C6C\u6027\u5BA3\u544A ''{1}'' \u8207 ''{2}'' \u5177\u6709\u884D\u751F\u81EA ID \u7684\u985E\u578B\u3002 +- derivation-ok-restriction.1 = derivation-ok-restriction.1: \u985E\u578B ''{0}'' \u7531\u9650\u5236\u5F9E\u985E\u578B ''{1}'' \u884D\u751F\u3002\u4E0D\u904E\uFF0C''{1}'' \u5177\u6709 ''{''final''}'' \u5C6C\u6027\uFF0C\u7981\u6B62\u7531\u9650\u5236\u884D\u751F\u3002 ++ derivation-ok-restriction.1 = derivation-ok-restriction.1: \u985E\u578B ''{0}'' \u7531\u9650\u5236\u5F9E\u985E\u578B ''{1}'' \u884D\u751F\u3002\u4E0D\u904E\uFF0C''{1}'' \u5177\u6709 '{'final'}' \u5C6C\u6027\uFF0C\u7981\u6B62\u7531\u9650\u5236\u884D\u751F\u3002 + derivation-ok-restriction.2.1.1 = derivation-ok-restriction.2.1.1: \u985E\u578B ''{0}'' \u7684\u932F\u8AA4\u3002\u6B64\u985E\u578B\u4E2D\u4F7F\u7528 ''{1}'' \u7684\u5C6C\u6027\u5177\u6709 ''use'' \u503C\u7684 ''{2}''\uFF0C\u9019\u8207\u57FA\u790E\u985E\u578B\u4E2D\u4F7F\u7528\u7B26\u5408\u5C6C\u6027\u7684 ''required'' \u503C\u4E0D\u4E00\u81F4\u3002 + derivation-ok-restriction.2.1.2 = derivation-ok-restriction.2.1.2: \u985E\u578B ''{0}'' \u7684\u932F\u8AA4\u3002\u6B64\u985E\u578B\u4E2D\u4F7F\u7528 ''{1}'' \u7684\u5C6C\u6027\u5177\u6709\u985E\u578B ''{2}''\uFF0C\u9019\u4E0D\u662F\u6709\u6548\u884D\u751F\u81EA ''{3}''\uFF0C\u4EA6\u5373\u57FA\u790E\u985E\u578B\u4E2D\u4F7F\u7528\u7B26\u5408\u5C6C\u6027\u7684\u985E\u578B\u3002 + derivation-ok-restriction.2.1.3.a = derivation-ok-restriction.2.1.3.a: \u985E\u578B ''{0}'' \u7684\u932F\u8AA4\u3002\u6B64\u985E\u578B\u4E2D\u4F7F\u7528 ''{1}'' \u7684\u5C6C\u6027\u5177\u6709\u672A\u56FA\u5B9A\u7684\u6709\u6548\u503C\u9650\u5236\u689D\u4EF6\uFF0C\u800C\u57FA\u790E\u985E\u578B\u4E2D\u4F7F\u7528\u7684\u7B26\u5408\u5C6C\u6027\u6709\u6548\u503C\u9650\u5236\u689D\u4EF6\u70BA\u56FA\u5B9A\u5F0F\u3002 +@@ -210,8 +184,8 @@ + enumeration-required-notation = enumeration-required-notation: \u7531 {2} ''{1}'' \u4F7F\u7528\u7684 NOTATION \u985E\u578B ''{0}''\uFF0C\u5FC5\u9808\u5177\u6709\u5217\u8209 facet \u503C\uFF0C\u4EE5\u6307\u5B9A\u6B64\u985E\u578B\u4F7F\u7528\u7684\u8868\u793A\u6CD5\u5143\u7D20\u3002 + enumeration-valid-restriction = enumeration-valid-restriction: \u5217\u8209\u503C ''{0}'' \u4E0D\u5728\u57FA\u790E\u985E\u578B {1} \u7684\u503C\u7A7A\u9593\u4E2D\u3002 + e-props-correct.2 = e-props-correct.2: \u5143\u7D20 ''{0}'' \u4E2D\u7684\u503C\u9650\u5236\u689D\u4EF6\u503C ''{1}'' \u7121\u6548\u3002 +- e-props-correct.4 = e-props-correct.4: \u5143\u7D20 ''{0}'' \u7684 ''{''type definition''}'' \u4E0D\u662F\u6709\u6548\u884D\u751F\u81EA substitutionHead ''{1}'' \u7684 ''{''type definition''}''\uFF0C\u6216\u662F ''{1}'' \u7684 ''{''substitution group exclusions''}'' \u5C6C\u6027\u4E0D\u5141\u8A31\u6B64\u884D\u751F\u3002 +- e-props-correct.5 = e-props-correct.5: ''{''value constraint''}'' \u4E0D\u53EF\u51FA\u73FE\u5728\u5143\u7D20 ''{0}'' \u4E0A\uFF0C\u56E0\u70BA\u5143\u7D20\u7684 ''{''type definition''}'' \u6216 ''{''type definition''}'' \u7684 ''{''content type''}'' \u70BA ID\uFF0C\u6216\u884D\u751F\u81EA ID\u3002 ++ e-props-correct.4 = e-props-correct.4: \u5143\u7D20 ''{0}'' \u7684 '{'type definition'}' \u4E0D\u662F\u6709\u6548\u884D\u751F\u81EA substitutionHead ''{1}'' \u7684 '{'type definition'}'\uFF0C\u6216\u662F ''{1}'' \u7684 '{'substitution group exclusions'}' \u5C6C\u6027\u4E0D\u5141\u8A31\u6B64\u884D\u751F\u3002 ++ e-props-correct.5 = e-props-correct.5: '{'value constraint'}' \u4E0D\u53EF\u51FA\u73FE\u5728\u5143\u7D20 ''{0}'' \u4E0A\uFF0C\u56E0\u70BA\u5143\u7D20\u7684 '{'type definition'}' \u6216 '{'type definition'}' \u7684 '{'content type'}' \u70BA ID\uFF0C\u6216\u884D\u751F\u81EA ID\u3002 + e-props-correct.6 = e-props-correct.6: \u5075\u6E2C\u5230 ''{0}'' \u7684\u5FAA\u74B0\u66FF\u4EE3\u7FA4\u7D44\u3002 + fractionDigits-valid-restriction = fractionDigits-valid-restriction: \u5728 {2} \u7684\u5B9A\u7FA9\u4E2D\uFF0Cfacet ''fractionDigits'' \u7684\u503C ''{0}'' \u7121\u6548\uFF0C\u56E0\u70BA\u5B83\u5FC5\u9808\u5C0F\u65BC\u6216\u7B49\u65BC ''fractionDigits'' \u7684\u503C\uFF0C\u6B64\u503C\u4EE5\u5176\u4E2D\u4E00\u500B\u7956\u7CFB\u985E\u578B\u8A2D\u70BA ''{1}''\u3002 + fractionDigits-totalDigits = fractionDigits-totalDigits: \u5728 {2} \u7684\u5B9A\u7FA9\u4E2D\uFF0C facet ''fractionDigits'' \u7684\u503C ''{0}'' \u7121\u6548\uFF0C\u56E0\u70BA\u503C\u5FC5\u9808\u5C0F\u65BC\u6216\u7B49\u65BC ''totalDigits'' \u7684\u503C\uFF0C\u4EA6\u5373 ''{1}''\u3002 +@@ -232,7 +206,7 @@ + maxInclusive-valid-restriction.3 = maxInclusive-valid-restriction.3: \u985E\u578B ''{2}'' \u7684\u932F\u8AA4\u3002\u7B49\u65BC ''{0}'' \u7684 maxInclusive \u503C\u5FC5\u9808\u5927\u65BC\u6216\u7B49\u65BC\u57FA\u790E\u985E\u578B ''{1}'' \u7684 minInclusive\u3002 + maxInclusive-valid-restriction.4 = maxInclusive-valid-restriction.4: \u985E\u578B ''{2}'' \u7684\u932F\u8AA4\u3002\u7B49\u65BC ''{0}'' \u7684 maxInclusive \u503C\u5FC5\u9808\u5927\u65BC\u57FA\u790E\u985E\u578B ''{1}'' \u7684 minExclusive\u3002 + maxLength-valid-restriction = maxLength-valid-restriction: \u5728 {2} \u7684\u5B9A\u7FA9\u4E2D\uFF0C\u7B49\u65BC ''{0}'' \u7684 maxLength \u503C\u5FC5\u9808\u5C0F\u65BC\u6216\u7B49\u65BC\u57FA\u790E\u985E\u578B ''{1}'' \u7684 maxLength \u503C\u3002 +- mg-props-correct.2 = mg-props-correct.2: \u5075\u6E2C\u5230\u7FA4\u7D44 ''{0}'' \u7684\u5FAA\u74B0\u5B9A\u7FA9\u3002\u905E\u8FF4\u4F7F\u7528\u7269\u4EF6\u7684 ''{''term''}'' \u503C\u5C07\u5C0E\u81F3\u5176 ''{''term''}'' \u70BA\u7FA4\u7D44\u672C\u8EAB\u7684\u7269\u4EF6\u3002 ++ mg-props-correct.2 = mg-props-correct.2: \u5075\u6E2C\u5230\u7FA4\u7D44 ''{0}'' \u7684\u5FAA\u74B0\u5B9A\u7FA9\u3002\u905E\u8FF4\u4F7F\u7528\u7269\u4EF6\u7684 '{'term'}' \u503C\u5C07\u5C0E\u81F3\u5176 '{'term'}' \u70BA\u7FA4\u7D44\u672C\u8EAB\u7684\u7269\u4EF6\u3002 + minExclusive-less-than-equal-to-maxExclusive = minExclusive-less-than-equal-to-maxExclusive: \u5728 {2} \u7684\u5B9A\u7FA9\u4E2D\uFF0C\u7B49\u65BC ''{0}'' \u7684 minExclusive \u503C\u5FC5\u9808\u5C0F\u65BC\u6216\u7B49\u65BC maxExclusive \u503C (\u7B49\u65BC ''{1}'')\u3002 + minExclusive-less-than-maxInclusive = minExclusive-less-than-maxInclusive: \u5728 {2} \u7684\u5B9A\u7FA9\u4E2D\uFF0C\u7B49\u65BC ''{0}'' \u7684 minExclusive \u503C\u5FC5\u9808\u5C0F\u65BC maxInclusive \u503C (\u7B49\u65BC ''{1}'')\u3002 + minExclusive-valid-restriction.1 = minExclusive-valid-restriction.1: \u985E\u578B ''{2}'' \u7684\u932F\u8AA4\u3002\u7B49\u65BC ''{0}'' \u7684 minExclusive \u503C\u5FC5\u9808\u5927\u65BC\u6216\u7B49\u65BC\u57FA\u790E\u985E\u578B ''{1}'' \u7684 minExclusive\u3002 +@@ -249,20 +223,20 @@ + minLength-less-than-equal-to-maxLength = minLength-less-than-equal-to-maxLength: \u5728 {2} \u7684\u5B9A\u7FA9\u4E2D\uFF0C\u7B49\u65BC ''{0}'' \u7684 minLength \u503C\u5FC5\u9808\u5C0F\u65BC maxLength \u503C (\u7B49\u65BC ''{1}'')\u3002 + minLength-valid-restriction = minLength-valid-restriction: \u5728 {2} \u7684\u5B9A\u7FA9\u4E2D\uFF0C\u7B49\u65BC ''{0}'' \u7684 minLength \u5FC5\u9808\u5927\u65BC\u6216\u7B49\u65BC\u57FA\u790E\u985E\u578B ''{1}'' \u7684 minLength\u3002 + no-xmlns = no-xmlns: \u5C6C\u6027\u5BA3\u544A\u7684 {name} \u4E0D\u80FD\u8207 'xmlns' \u76F8\u540C\u3002 +- no-xsi = no-xsi: \u5C6C\u6027\u5BA3\u544A\u7684 ''{''target namespace''}'' \u4E0D\u80FD\u8207 ''{0}'' \u76F8\u540C\u3002 ++ no-xsi = no-xsi: \u5C6C\u6027\u5BA3\u544A\u7684 '{'target namespace'}' \u4E0D\u80FD\u8207 ''{0}'' \u76F8\u540C\u3002 + p-props-correct.2.1 = p-props-correct.2.1: \u5728 ''{0}'' \u7684\u5BA3\u544A\u4E2D\uFF0C''minOccurs'' \u7684\u503C\u70BA ''{1}''\uFF0C\u4F46\u662F\u5B83\u4E0D\u53EF\u5927\u65BC ''maxOccurs'' \u7684\u503C ''{2}''\u3002 + rcase-MapAndSum.1 = rcase-MapAndSum.1: \u7269\u4EF6\u4E4B\u9593\u6C92\u6709\u5B8C\u6574\u7684\u529F\u80FD\u5C0D\u61C9\u3002 + rcase-MapAndSum.2 = rcase-MapAndSum.2: \u7FA4\u7D44\u7684\u767C\u751F\u7BC4\u570D ({0}\uFF0C{1}) \u4E0D\u662F\u57FA\u790E\u7FA4\u7D44\u767C\u751F\u7BC4\u570D ({2}\uFF0C{3}) \u7684\u6709\u6548\u9650\u5236\u3002 + rcase-NameAndTypeOK.1 = rcase-NameAndTypeOK.1: \u5143\u7D20\u5177\u6709\u4E0D\u76F8\u540C\u7684\u540D\u7A31\u8207\u76EE\u6A19\u547D\u540D\u7A7A\u9593: \u547D\u540D\u7A7A\u9593 ''{1}'' \u4E2D\u7684\u5143\u7D20 ''{0}'' \u8207\u547D\u540D\u7A7A\u9593 ''{3}'' \u4E2D\u7684\u5143\u7D20 ''{2}''\u3002 +- rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: \u7269\u4EF6\u7684 ''{''term''}'' \u70BA\u5143\u7D20\u5BA3\u544A ''{0}'' \u7684\u932F\u8AA4\u3002\u5143\u7D20\u5BA3\u544A\u7684 ''{''nillable''}'' \u70BA\u771F\uFF0C\u4F46\u662F\u57FA\u790E\u985E\u578B\u4E2D\u7684\u5C0D\u61C9\u7269\u4EF6\u5177\u6709 ''{''nillable''}'' \u70BA\u507D\u7684\u5143\u7D20\u5BA3\u544A\u3002 +- rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: \u7269\u4EF6\u7684 ''{''term''}'' \u70BA\u5143\u7D20\u5BA3\u544A ''{0}'' \u7684\u932F\u8AA4\u3002\u5B83\u7684\u767C\u751F\u7BC4\u570D ({1}\uFF0C{2}) \u4E0D\u662F\u57FA\u790E\u985E\u578B\u4E2D\u5C0D\u61C9\u7269\u4EF6\u7BC4\u570D ({3}\uFF0C{4}) \u7684\u6709\u6548\u9650\u5236\u3002 ++ rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: \u7269\u4EF6\u7684 '{'term'}' \u70BA\u5143\u7D20\u5BA3\u544A ''{0}'' \u7684\u932F\u8AA4\u3002\u5143\u7D20\u5BA3\u544A\u7684 '{'nillable'}' \u70BA\u771F\uFF0C\u4F46\u662F\u57FA\u790E\u985E\u578B\u4E2D\u7684\u5C0D\u61C9\u7269\u4EF6\u5177\u6709 '{'nillable'}' \u70BA\u507D\u7684\u5143\u7D20\u5BA3\u544A\u3002 ++ rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: \u7269\u4EF6\u7684 '{'term'}' \u70BA\u5143\u7D20\u5BA3\u544A ''{0}'' \u7684\u932F\u8AA4\u3002\u5B83\u7684\u767C\u751F\u7BC4\u570D ({1}\uFF0C{2}) \u4E0D\u662F\u57FA\u790E\u985E\u578B\u4E2D\u5C0D\u61C9\u7269\u4EF6\u7BC4\u570D ({3}\uFF0C{4}) \u7684\u6709\u6548\u9650\u5236\u3002 + rcase-NameAndTypeOK.4.a = rcase-NameAndTypeOK.4.a: \u5143\u7D20 ''{0}'' \u975E\u56FA\u5B9A\u5F0F\uFF0C\u4F46\u662F\u57FA\u790E\u985E\u578B\u4E2D\u5C0D\u61C9\u7684\u5143\u7D20\u5177\u6709\u56FA\u5B9A\u503C ''{1}''\u3002 + rcase-NameAndTypeOK.4.b = rcase-NameAndTypeOK.4.b: \u5143\u7D20 ''{0}'' \u5177\u6709\u56FA\u5B9A\u503C ''{1}''\uFF0C\u4F46\u662F\u57FA\u790E\u985E\u578B\u4E2D\u5C0D\u61C9\u7684\u5143\u7D20\u5177\u6709\u56FA\u5B9A\u503C ''{2}''\u3002 + rcase-NameAndTypeOK.5 = rcase-NameAndTypeOK.5: \u5143\u7D20 ''{0}'' \u7684\u8B58\u5225\u9650\u5236\u689D\u4EF6\u4E0D\u662F\u57FA\u790E\u4E2D\u7684\u5B50\u96C6\u3002 + rcase-NameAndTypeOK.6 = rcase-NameAndTypeOK.6: \u5143\u7D20 ''{0}'' \u4E0D\u5141\u8A31\u7684\u66FF\u4EE3\u4E0D\u662F\u57FA\u790E\u4E2D\u7684\u8D85\u96C6\u3002 + rcase-NameAndTypeOK.7 = rcase-NameAndTypeOK.7: \u5143\u7D20 ''{0}'' \u7684\u985E\u578B ''{1}'' \u4E0D\u662F\u884D\u751F\u81EA\u57FA\u790E\u5143\u7D20 ''{2}'' \u7684\u985E\u578B\u3002 + rcase-NSCompat.1 = rcase-NSCompat.1: \u5143\u7D20 ''{0}'' \u5177\u6709\u57FA\u790E\u4E2D\u842C\u7528\u5B57\u5143\u4E0D\u5141\u8A31\u7684\u547D\u540D\u7A7A\u9593 ''{1}''\u3002 +- rcase-NSCompat.2 = rcase-NSCompat.2: \u7269\u4EF6\u7684 ''{''term''}'' \u70BA\u5143\u7D20\u5BA3\u544A ''{0}'' \u7684\u932F\u8AA4\u3002\u5B83\u7684\u767C\u751F\u7BC4\u570D ({1}\uFF0C{2}) \u4E0D\u662F\u57FA\u790E\u985E\u578B\u4E2D\u5C0D\u61C9\u7269\u4EF6\u7BC4\u570D ({3}\uFF0C{4}) \u7684\u6709\u6548\u9650\u5236\u3002 ++ rcase-NSCompat.2 = rcase-NSCompat.2: \u7269\u4EF6\u7684 '{'term'}' \u70BA\u5143\u7D20\u5BA3\u544A ''{0}'' \u7684\u932F\u8AA4\u3002\u5B83\u7684\u767C\u751F\u7BC4\u570D ({1}\uFF0C{2}) \u4E0D\u662F\u57FA\u790E\u985E\u578B\u4E2D\u5C0D\u61C9\u7269\u4EF6\u7BC4\u570D ({3}\uFF0C{4}) \u7684\u6709\u6548\u9650\u5236\u3002 + rcase-NSRecurseCheckCardinality.1 = rcase-NSRecurseCheckCardinality.1: \u7269\u4EF6\u4E4B\u9593\u6C92\u6709\u5B8C\u6574\u7684\u529F\u80FD\u5C0D\u61C9\u3002 + rcase-NSRecurseCheckCardinality.2 = rcase-NSRecurseCheckCardinality.2: \u7FA4\u7D44\u7684\u767C\u751F\u7BC4\u570D ({0}\uFF0C{1}) \u4E0D\u662F\u57FA\u790E\u842C\u7528\u5B57\u5143\u7BC4\u570D ({2}\uFF0C{3}) \u7684\u6709\u6548\u9650\u5236\u3002 + rcase-NSSubset.1 = rcase-NSSubset.1: \u842C\u7528\u5B57\u5143\u4E0D\u662F\u57FA\u790E\u4E2D\u5C0D\u61C9\u842C\u7528\u5B57\u5143\u7684\u5B50\u96C6\u3002 +@@ -278,7 +252,7 @@ + # src-redefine.1 = src-redefine.1: The component ''{0}'' is begin redefined, but its corresponding component isn't in the schema document being redefined (with namespace ''{2}''), but in a different document, with namespace ''{1}''. + sch-props-correct.2 = sch-props-correct.2: \u7DB1\u8981\u7121\u6CD5\u5305\u542B\u76F8\u540C\u540D\u7A31\u7684\u5169\u500B\u5168\u57DF\u5143\u4EF6; \u6B64\u7DB1\u8981\u5305\u542B\u5169\u500B ''{0}''\u3002 + st-props-correct.2 = st-props-correct.2: \u5075\u6E2C\u5230\u7C21\u55AE\u985E\u578B ''{0}'' \u7684\u5FAA\u74B0\u5B9A\u7FA9\u3002\u9019\u4EE3\u8868 ''{0}'' \u5305\u542B\u5728\u81EA\u8EAB\u985E\u578B\u968E\u5C64\u4E2D\uFF0C\u9019\u662F\u4E00\u9805\u932F\u8AA4\u3002 +- st-props-correct.3 = st-props-correct.3: \u985E\u578B ''{0}'' \u7684\u932F\u8AA4\u3002''{''base type definition''}'' \u7684 ''{''final''}'' \u503C ''{1}'' \u9650\u5236\u7981\u6B62\u884D\u751F\u3002 ++ st-props-correct.3 = st-props-correct.3: \u985E\u578B ''{0}'' \u7684\u932F\u8AA4\u3002'{'base type definition'}' \u7684 '{'final'}' \u503C ''{1}'' \u9650\u5236\u7981\u6B62\u884D\u751F\u3002 + totalDigits-valid-restriction = totalDigits-valid-restriction: \u5728 {2} \u7684\u5B9A\u7FA9\u4E2D\uFF0Cfacet ''totalDigits'' \u7684\u503C ''{0}'' \u7121\u6548\uFF0C\u56E0\u70BA\u5B83\u5FC5\u9808\u5C0F\u65BC\u6216\u7B49\u65BC ''totalDigits'' \u7684\u503C\uFF0C\u6B64\u503C\u4EE5\u5176\u4E2D\u4E00\u500B\u7956\u7CFB\u985E\u578B\u8A2D\u70BA ''{1}''\u3002 + whiteSpace-valid-restriction.1 = whiteSpace-valid-restriction.1: \u5728 {0} \u7684\u5B9A\u7FA9\u4E2D\uFF0Cfacet ''whitespace'' \u7684\u503C ''{1}'' \u7121\u6548\uFF0C\u56E0\u70BA ''whitespace'' \u7684\u503C\u4EE5\u5176\u4E2D\u4E00\u500B\u7956\u7CFB\u985E\u578B\u8A2D\u70BA ''collapse''\u3002 + whiteSpace-valid-restriction.2 = whiteSpace-valid-restriction.2: \u5728 {0} \u7684\u5B9A\u7FA9\u4E2D\uFF0Cfacet ''whitespace'' \u7684\u503C ''preserve'' \u7121\u6548\uFF0C\u56E0\u70BA ''whitespace'' \u7684\u503C\u5728\u5176\u4E2D\u4E00\u500B\u7956\u7CFB\u985E\u578B\u4E2D\u8A2D\u70BA ''replace''\u3002 +@@ -306,7 +280,7 @@ + c-selector-xpath = c-selector-xpath: \u7B49\u65BC ''{0}'' \u7684\u9078\u53D6\u5668\u503C\u7121\u6548; \u9078\u53D6\u5668 xpaths \u4E0D\u80FD\u5305\u542B\u5C6C\u6027\u3002 + EmptyTargetNamespace = EmptyTargetNamespace: \u5728\u7DB1\u8981\u6587\u4EF6 ''{0}'' \u4E2D\uFF0C''targetNamespace'' \u5C6C\u6027\u7684\u503C\u4E0D\u53EF\u70BA\u7A7A\u767D\u5B57\u4E32\u3002 + FacetValueFromBase = FacetValueFromBase: \u5728\u985E\u578B ''{0}'' \u7684\u5BA3\u544A\u4E2D\uFF0Cfacet ''{2}'' \u7684\u503C ''{1}'' \u5FC5\u9808\u4F86\u81EA\u57FA\u790E\u985E\u578B\u7684\u503C\u7A7A\u9593 ''{3}''\u3002 +- FixedFacetValue = FixedFacetValue: \u5728 {3} \u7684\u5B9A\u7FA9\u4E2D\uFF0Cfacet ''{0}'' \u7684\u503C ''{1}'' \u7121\u6548\uFF0C\u56E0\u70BA ''{0}'' \u7684\u503C\u4EE5\u5176\u4E2D\u4E00\u500B\u7956\u7CFB\u985E\u578B\u8A2D\u70BA ''{2}''\uFF0C\u4E14 ''{''fixed''}'' = true\u3002 ++ FixedFacetValue = FixedFacetValue: \u5728 {3} \u7684\u5B9A\u7FA9\u4E2D\uFF0Cfacet ''{0}'' \u7684\u503C ''{1}'' \u7121\u6548\uFF0C\u56E0\u70BA ''{0}'' \u7684\u503C\u4EE5\u5176\u4E2D\u4E00\u500B\u7956\u7CFB\u985E\u578B\u8A2D\u70BA ''{2}''\uFF0C\u4E14 '{'fixed'}' = true\u3002 + InvalidRegex = InvalidRegex: \u6A23\u5F0F\u503C ''{0}'' \u4E0D\u662F\u6709\u6548\u7684\u6B63\u898F\u8868\u793A\u5F0F\u3002\u5831\u544A\u7684\u932F\u8AA4: \u4F4D\u65BC\u8CC7\u6599\u6B04 ''{2}'' \u7684 ''{1}''\u3002 + maxOccurLimit = \u5256\u6790\u5668\u76EE\u524D\u7684\u7D44\u614B\u4E0D\u5141\u8A31 maxOccurs \u5C6C\u6027\u503C\u8A2D\u70BA\u5927\u65BC\u503C {0}\u3002 + PublicSystemOnNotation = PublicSystemOnNotation: ''public'' \u8207 ''system'' \u81F3\u5C11\u5176\u4E2D\u4E4B\u4E00\u5FC5\u9808\u51FA\u73FE\u5728\u5143\u7D20 ''notation'' \u4E2D\u3002 +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -5,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages.properties 3021 2011-03-01 00:12:28Z joehw $ + + BadMessageKey = The error message corresponding to the message key can not be found. + FormatFailed = An internal error occurred while formatting the following message:\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_de.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_de.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_de.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/29 01:16:51 gmolloy Exp $ + + BadMessageKey = Die zum Meldungsschl\u00FCssel geh\u00F6rige Fehlermeldung kann nicht gefunden werden. + FormatFailed = Beim Formatieren der folgenden Meldung ist ein interner Fehler aufgetreten:\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_es.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_es.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_es.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/28 05:10:53 gmolloy Exp $ + + BadMessageKey = No se ha encontrado el mensaje de error que corresponde a la clave de mensaje. + FormatFailed = Se ha producido un error interno al formatear el siguiente mensaje:\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_fr.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_fr.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_fr.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/28 02:16:52 gmolloy Exp $ + + BadMessageKey = Le message d'erreur correspondant \u00E0 la cl\u00E9 de message est introuvable. + FormatFailed = Une erreur interne est survenue lors de la mise en forme du message suivant :\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_it.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_it.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_it.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/27 08:14:02 gmolloy Exp $ + + BadMessageKey = Impossibile trovare il messaggio di errore corrispondente alla chiave di messaggio. + FormatFailed = Si \u00E8 verificato un errore interno durante la formattazione del seguente messaggio:\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_ja.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_ja.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_ja.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/28 01:05:12 gmolloy Exp $ + + BadMessageKey = \u30E1\u30C3\u30BB\u30FC\u30B8\u30FB\u30AD\u30FC\u306B\u5BFE\u5FDC\u3059\u308B\u30A8\u30E9\u30FC\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002 + FormatFailed = \u6B21\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u66F8\u5F0F\u8A2D\u5B9A\u4E2D\u306B\u5185\u90E8\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F:\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_ko.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_ko.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_ko.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/29 02:40:33 gmolloy Exp $ + + BadMessageKey = \uBA54\uC2DC\uC9C0 \uD0A4\uC5D0 \uD574\uB2F9\uD558\uB294 \uC624\uB958 \uBA54\uC2DC\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. + FormatFailed = \uB2E4\uC74C \uBA54\uC2DC\uC9C0\uC758 \uD615\uC2DD\uC744 \uC9C0\uC815\uD558\uB294 \uC911 \uB0B4\uBD80 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_pt_BR.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_pt_BR.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_pt_BR.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/28 07:33:06 gmolloy Exp $ + + BadMessageKey = N\u00E3o foi poss\u00EDvel encontrar a mensagem de erro correspondente \u00E0 chave da mensagem. + FormatFailed = Ocorreu um erro interno ao formatar a mensagem a seguir:\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_sv.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_sv.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_sv.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/29 00:46:23 gmolloy Exp $ + + BadMessageKey = Hittar inte felmeddelandet som motsvarar meddelandenyckeln. + FormatFailed = Ett internt fel intr\u00E4ffade vid formatering av f\u00F6ljande meddelande:\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_zh_CN.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_zh_CN.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_zh_CN.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/29 01:19:32 gmolloy Exp $ + + BadMessageKey = \u627E\u4E0D\u5230\u4E0E\u6D88\u606F\u5173\u952E\u5B57\u5BF9\u5E94\u7684\u9519\u8BEF\u6D88\u606F\u3002 + FormatFailed = \u8BBE\u7F6E\u4EE5\u4E0B\u6D88\u606F\u7684\u683C\u5F0F\u65F6\u51FA\u73B0\u5185\u90E8\u9519\u8BEF:\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_zh_TW.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLSerializerMessages_zh_TW.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores error messages for the Xerces XML + # serializer. Many DOM Load/Save error messages also + # live here, since the serializer largely implements that package. +@@ -30,7 +5,6 @@ + # As usual with properties files, the messages are arranged in + # key/value tuples. + # +-# @version $Id: XMLSerializerMessages_zh_TW.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/27 00:30:48 gmolloy Exp $ + + BadMessageKey = \u627E\u4E0D\u5230\u5C0D\u61C9\u8A0A\u606F\u7D22\u5F15\u9375\u7684\u932F\u8AA4\u8A0A\u606F\u3002 + FormatFailed = \u683C\u5F0F\u5316\u4E0B\u5217\u8A0A\u606F\u6642\u767C\u751F\u5167\u90E8\u932F\u8AA4:\n +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -2,7 +2,6 @@ + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages.properties 3021 2011-03-01 00:12:28Z joehw $ + + # Messages for message reporting + BadMessageKey = The error message corresponding to the message key can not be found. +@@ -24,4 +23,4 @@ + InvalidElementSchemeXPointer = InvalidElementSchemeXPointer: The Element Scheme XPointer expression ''{0}'' is invalid. + XPointerElementSchemeProcessingError = XPointerElementSchemeProcessingError: An error occurred while processing the XPointer element() Scheme expression. + InvalidNCNameInElementSchemeData = InvalidNCNameInElementSchemeData: The element() Scheme contains a ShortHand Pointer ''{0}'' with an invalid NCName. +-InvalidChildSequenceCharacter = InvalidChildSequenceCharacter: The element() Scheme contains an invalid child sequence character ''{0}''. +\ No newline at end of file ++InvalidChildSequenceCharacter = InvalidChildSequenceCharacter: The element() Scheme contains an invalid child sequence character ''{0}''. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_de.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_de.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/29 01:16:51 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = Die zum Meldungsschl\u00FCssel geh\u00F6rige Fehlermeldung kann nicht gefunden werden. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_es.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_es.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_es.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/28 05:10:53 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = No se ha encontrado el mensaje de error que corresponde a la clave de mensaje. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_fr.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_fr.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_fr.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/28 02:16:52 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = Le message d'erreur correspondant \u00E0 la cl\u00E9 de message est introuvable. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_it.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_it.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_it.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/27 08:14:02 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = Impossibile trovare il messaggio di errore corrispondente alla chiave di messaggio. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_ja.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_ja.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_ja.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/28 01:05:12 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = \u30E1\u30C3\u30BB\u30FC\u30B8\u30FB\u30AD\u30FC\u306B\u5BFE\u5FDC\u3059\u308B\u30A8\u30E9\u30FC\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002 +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_ko.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_ko.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_ko.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/29 02:40:33 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = \uBA54\uC2DC\uC9C0 \uD0A4\uC5D0 \uD574\uB2F9\uD558\uB294 \uC624\uB958 \uBA54\uC2DC\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_pt_BR.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_pt_BR.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_pt_BR.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/28 07:33:06 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = N\u00E3o foi poss\u00EDvel encontrar a mensagem de erro correspondente \u00E0 chave da mensagem. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_sv.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_sv.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_sv.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/29 00:46:23 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = Hittar inte felmeddelandet som motsvarar meddelandenyckeln. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_zh_CN.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_zh_CN.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_zh_CN.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/29 01:19:32 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = \u627E\u4E0D\u5230\u4E0E\u6D88\u606F\u5173\u952E\u5B57\u5BF9\u5E94\u7684\u9519\u8BEF\u6D88\u606F\u3002 +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_zh_TW.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XPointerMessages_zh_TW.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,33 +1,7 @@ +-# +-# Copyright (c) 2009, 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. +-# +- + # This file stores localized messages for the Xerces XPointer implementation. + # + # The messages are arranged in key and value tuples in a ListResourceBundle. + # +-# @version $Id: XPointerMessages_zh_TW.properties /st_wptg_1.8.0.0.0jdk/2 2013/05/27 00:30:48 gmolloy Exp $ + + # Messages for message reporting + BadMessageKey = \u627E\u4E0D\u5230\u5C0D\u61C9\u8A0A\u606F\u7D22\u5F15\u9375\u7684\u932F\u8AA4\u8A0A\u606F\u3002 +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_de.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_de.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 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. +-# +- + parser.parse.1=Falsches Zeichen. + parser.parse.2=Ung\u00FCltige Referenznummer. + parser.next.1=Nach \\ ist ein Zeichen erforderlich. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_es.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_es.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 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. +-# +- + parser.parse.1=Car\u00E1cter incorrecto. + parser.parse.2=N\u00FAmero de referencia no v\u00E1lido. + parser.next.1=Es necesario un car\u00E1cter despu\u00E9s de \\. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_fr.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_fr.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 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. +-# +- + parser.parse.1=Caract\u00E8re incorrect. + parser.parse.2=Num\u00E9ro de r\u00E9f\u00E9rence non valide. + parser.next.1=Un caract\u00E8re est obligatoire apr\u00E8s \\. +@@ -52,7 +27,7 @@ + parser.ope.2=')' ou '-[' ou '+[' ou '&[' est attendu. + parser.ope.3=Le point code de fin de la plage est inf\u00E9rieur au point code de d\u00E9but. + parser.descape.1=Notation hexad\u00E9cimale Unicode non valide. +-parser.descape.2=D\u00E9passement de capacit\u00E9 d'une notation hexad\u00E9cimale. ++parser.descape.2=D\u00E9bordement de capacit\u00E9 d'une notation hexad\u00E9cimale. + parser.descape.3='\\x{' doit \u00EAtre ferm\u00E9 par '}'. + parser.descape.4=Point code Unicode non valide. + parser.descape.5=Aucun point d'ancrage ne doit se trouver ici. +@@ -61,6 +36,6 @@ + parser.quantifier.2=Quantificateur non valide. Quantit\u00E9 non valide ou accolade ('}') manquante. + parser.quantifier.3=Quantificateur non valide. Un chiffre ou une accolade ('}') est attendu. + parser.quantifier.4=Quantificateur non valide. Une quantit\u00E9 minimale doit \u00EAtre <= une quantit\u00E9 maximale. +-parser.quantifier.5=Quantificateur non valide. D\u00E9passement de la valeur de quantit\u00E9. ++parser.quantifier.5=Quantificateur non valide. D\u00E9bordement de la valeur de quantit\u00E9. + null + null +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_it.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_it.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,28 +1,3 @@ +-# +-# Copyright (c) 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. +-# +- + parser.parse.1=Carattere errato. + parser.parse.2=Numero di riferimento non valido. + parser.next.1=\u00C8 necessario un carattere dopo \\. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_ja.properties Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/xpath/regex/message_ja.properties Wed Jul 30 03:53:11 2014 -0700 +@@ -1,34 +1,9 @@ +-# +-# Copyright (c) 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. +-# +- + parser.parse.1=\u6587\u5B57\u304C\u9055\u3063\u3066\u3044\u307E\u3059\u3002 + parser.parse.2=\u7121\u52B9\u306A\u53C2\u7167\u756A\u53F7\u3067\u3059\u3002 + parser.next.1=\\\u306E\u5F8C\u306B\u6587\u5B57\u304C\u5FC5\u8981\u3067\u3059\u3002 + parser.next.2='?'\u306F\u60F3\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002'(?:'\u3001'(?='\u3001'(?!'\u3001'(?<'\u3001'(?#'\u307E\u305F\u306F'(?>'\u3067\u3059\u304B\u3002 + parser.next.3='(?<='\u307E\u305F\u306F'(? + * If {@code factoryId} is "javax.xml.stream.XMLEventFactory", + * use the service-provider loading facilities, defined by the +- * {@link java.util.ServiceLoader} class, to attempt to locate and load an +- * implementation of the service using the specified {@code ClassLoader}. ++ * {@link java.util.ServiceLoader} class, to attempt to {@linkplain ++ * java.util.ServiceLoader#load(java.lang.Class, java.lang.ClassLoader) locate and load} ++ * an implementation of the service using the specified {@code ClassLoader}. + * If {@code classLoader} is null, the {@linkplain + * java.util.ServiceLoader#load(java.lang.Class) default loading mechanism} will apply: + * That is, the service-provider loading facility will use the {@linkplain +--- ./jaxp/src/javax/xml/stream/XMLInputFactory.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/javax/xml/stream/XMLInputFactory.java Wed Jul 30 03:53:11 2014 -0700 +@@ -247,8 +247,9 @@ + *
  • + * If {@code factoryId} is "javax.xml.stream.XMLInputFactory", + * use the service-provider loading facilities, defined by the +- * {@link java.util.ServiceLoader} class, to attempt to locate and load an +- * implementation of the service using the specified {@code ClassLoader}. ++ * {@link java.util.ServiceLoader} class, to attempt to {@linkplain ++ * java.util.ServiceLoader#load(java.lang.Class, java.lang.ClassLoader) locate and load} ++ * an implementation of the service using the specified {@code ClassLoader}. + * If {@code classLoader} is null, the {@linkplain + * java.util.ServiceLoader#load(java.lang.Class) default loading mechanism} will apply: + * That is, the service-provider loading facility will use the {@linkplain +--- ./jaxp/src/javax/xml/stream/XMLOutputFactory.java Tue Jun 03 14:19:32 2014 -0700 ++++ ./jaxp/src/javax/xml/stream/XMLOutputFactory.java Wed Jul 30 03:53:11 2014 -0700 +@@ -221,8 +221,9 @@ + *
  • + * If {@code factoryId} is "javax.xml.stream.XMLOutputFactory", + * use the service-provider loading facilities, defined by the +- * {@link java.util.ServiceLoader} class, to attempt to locate and load an +- * implementation of the service using the specified {@code ClassLoader}. ++ * {@link java.util.ServiceLoader} class, to attempt to {@linkplain ++ * java.util.ServiceLoader#load(java.lang.Class, java.lang.ClassLoader) locate and load} ++ * an implementation of the service using the specified {@code ClassLoader}. + * If {@code classLoader} is null, the {@linkplain + * java.util.ServiceLoader#load(java.lang.Class) default loading mechanism} will apply: + * That is, the service-provider loading facility will use the {@linkplain +--- ./jaxws/.hgtags Tue Jun 03 14:19:34 2014 -0700 ++++ ./jaxws/.hgtags Wed Jul 30 03:53:36 2014 -0700 +@@ -245,7 +245,9 @@ + 32050ab53c8a8e4cb09f04b88db78258a480fb61 jdk8-b121 + bc622ba563f9316f981c11c3a260f4c3fdc5ef07 jdk8-b122 + 91f5c542ccad330efc0d281362dd6f33f2039746 jdk8-b123 ++241e4effed6d4702815f54efdfb34ebd5c3990f6 jdk8u20-b00 + ef71ecbcd7bc014b1be39a6d1b3a1fb663772c14 jdk8-b124 ++ac679298539a4bc6c23e1ce00acabf10d1d93fe2 jdk8u20-b01 + ef71ecbcd7bc014b1be39a6d1b3a1fb663772c14 jdk8-b125 + 7193a007a159ef9401b672af5c36c5b95e6e2943 jdk8-b126 + 8e46fe36e17595c24ccdbde7b34e3cbfb6056b42 jdk8-b127 +@@ -268,6 +270,7 @@ + 75fd3933daaf5826e7c03bfb318026ac8a4c07ef jdk8u5-b11 + e2454d30b525bcb6ebcc711bd2928fbd29c11143 jdk8u5-b12 + d2200a87d5ad6a9d06d9df144376ea5511b3916b jdk8u5-b13 ++ad56fa1dc3d375a6e909d3e005939626ba44a4b5 jdk8u5-b31 + d2732c66f0f927d7f31dead4cce1a0612b9ff2a1 jdk8u11-b01 + 152cc523baf1fdfe48514e3fe0d8e5a9b3c01ba4 jdk8u11-b02 + c2c073f04f0566c868fec49b96e5885ad69f065c jdk8u11-b03 +@@ -279,3 +282,32 @@ + 6e994ba1e4610b367f292a41a0d2c77091f93ab6 jdk8u11-b09 + aa3f37b9fbdca195ac9430b8c301db7f33347241 jdk8u11-b10 + 5d161297f3031a82d04953bf60721f31e7c18da1 jdk8u11-b11 ++beaec77113928b64365d7ea9b564ee02d1625b89 jdk8u11-b12 ++5ceaffbb168fb84168cd49da83c469fdfaec4ee8 jdk8u11-b31 ++ba061957b8bdb5f04e58154b27405fbf6fe3c71f jdk8u20-b02 ++337a3a4086235e926e1d684bf4d0b2add70d6f55 jdk8u20-b03 ++579caba2483ee3c9e32d87b31ab46e86f1aa9cd3 jdk8u20-b04 ++918ceef47cb401f64451ff58725210128176c6a6 jdk8u20-b05 ++4195c0956930bf4e161ac6b0def0d6295bfba58f jdk8-b130 ++012b935707fa24a1a88b429255f77b386e082643 jdk8-b131 ++c2be0dd15dbf0c23ee693a1af32f8f6a012abd1e jdk8-b132 ++515ddaddbb6402452f5c6a63594db5d7d71b5aa1 jdk8u20-b06 ++a61ba2e3e6c85f7067fb7b0c3c02584abdfa96be jdk8u20-b07 ++bc6d2f3426f3d04adc8245ad120e2b52fe7dfbde jdk8u20-b08 ++2e76ce4ec993c32368ef51b67873aa5ff06e1437 jdk8u20-b09 ++84f913145e2acb8474f3779d7ef154eebec9537a jdk8u20-b10 ++ce4e5885a11012edaf76ce9a6115e23acabfd282 jdk8u20-b11 ++94fbd96ebb83a3ce966c347082b079f9e4fec76a jdk8u20-b12 ++9634e8ad55c9ab691325116aff765de00dfc8410 jdk8u20-b13 ++796c274fbf5e71f1af1e9c3111518c057dcc95bd jdk8u20-b14 ++8ef9f5f9b0c5f86f325c4aad3c6dc1ff9243ea43 jdk8u20-b15 ++86741f3a4a381de18fbbfecd588660ca7a94c5ed jdk8u20-b16 ++3ff7f413379f29e1937223902edf1fe2b90d7d60 jdk8u20-b17 ++a3b85d6097c52cbff3e514ad6dc4f705fbaaa8bb jdk8u20-b18 ++615fdd17d4e24af63fe63a0fe85cfda3645e6826 jdk8u20-b19 ++4681b10c0c3197f591b88eadc481a283ae90d003 jdk8u20-b20 ++31d43d250c836c13fcc87025837783788c5cd0de jdk8u20-b21 ++2d360fb1b2b89c90133231f9ed5f823997b70c19 jdk8u20-b22 ++f3bf1b270fea8b17aa2846f962f7514b6f772ab4 jdk8u20-b23 ++1277c0d492fd9253f1ea2730eb160953397bd939 jdk8u20-b24 ++1277c0d492fd9253f1ea2730eb160953397bd939 jdk8u20-b25 +--- ./jaxws/THIRD_PARTY_README Tue Jun 03 14:19:34 2014 -0700 ++++ ./jaxws/THIRD_PARTY_README Wed Jul 30 03:53:36 2014 -0700 +@@ -2,7 +2,7 @@ + ----------------------------- + + %% This notice is provided with respect to ASM Bytecode Manipulation +-Framework v5.0, which may be included with JRE 8, and JDK 8, and ++Framework v5.0.3, which may be included with JRE 8, and JDK 8, and + OpenJDK 8. + + --- begin of LICENSE --- +@@ -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 +@@ -3349,14 +3349,14 @@ + + ------------------------------------------------------------------------------- + +-%% This notice is provided with respect to zlib v1.2.5, which may be included ++%% This notice is provided with respect to zlib v1.2.8, which may be included + with JRE 8, JDK 8, and OpenJDK 8. + + --- begin of LICENSE --- + +- version 1.2.5, July 18th, 2005 +- +- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler ++ version 1.2.8, April 28th, 2013 ++ ++ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages +@@ -3382,11 +3382,11 @@ + ------------------------------------------------------------------------------- + + %% This notice is provided with respect to the following which may be +-included with JRE 8, JDK 8, and OpenJDK 8, except where noted: +- +- Apache Commons Math 2.2 +- Apache Derby 10.10.1.2 [included with JDK 8] +- Apache Jakarta BCEL 5.2 ++included with JRE 8, JDK 8, and OpenJDK 8. ++ ++ Apache Commons Math 3.2 ++ Apache Derby 10.10.1.3 ++ Apache Jakarta BCEL 5.1 + Apache Jakarta Regexp 1.4 + Apache Santuario XML Security for Java 1.5.4 + Apache Xalan-Java 2.7.1 +--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/model/Message.java Tue Jun 03 14:19:34 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/model/Message.java Wed Jul 30 03:53:36 2014 -0700 +@@ -177,7 +177,8 @@ + throw new AbortException(); + } + _parameters.add(p); +- _parametersByName.put(p.getName(), p); ++ String name = p.getCustomName() != null ? p.getCustomName() : p.getName(); ++ _parametersByName.put(name, p); + } + + public Parameter getParameterByName(String name) { +--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/modeler/wsdl/PseudoSchemaBuilder.java Tue Jun 03 14:19:34 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/modeler/wsdl/PseudoSchemaBuilder.java Wed Jul 30 03:53:36 2014 -0700 +@@ -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 +@@ -41,6 +41,7 @@ + import java.io.ByteArrayInputStream; + import java.io.StringReader; + import java.io.StringWriter; ++import java.nio.charset.StandardCharsets; + import java.text.MessageFormat; + import java.util.*; + +@@ -107,7 +108,7 @@ + } + //add w3c EPR binding + if(!(options.noAddressingBbinding) && options.target.isLaterThan(Options.Target.V2_1)){ +- InputSource is = new InputSource(new ByteArrayInputStream(w3ceprSchemaBinding.getBytes())); ++ InputSource is = new InputSource(new ByteArrayInputStream(w3ceprSchemaBinding.getBytes(StandardCharsets.UTF_8))); + is.setSystemId(sysId+(++i +1)); + b.schemas.add(is); + } +--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/modeler/wsdl/WSDLModeler.java Tue Jun 03 14:19:34 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/processor/modeler/wsdl/WSDLModeler.java Wed Jul 30 03:53:36 2014 -0700 +@@ -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 +@@ -1791,9 +1791,9 @@ + } + + if (part.isIN()) { +- setCustomizedParameterName(info.portTypeOperation, inMsg, part, param, false); ++ setCustomizedParameterName(info.bindingOperation, inMsg, part, param, false); + } else if (outMsg != null) { +- setCustomizedParameterName(info.portTypeOperation, outMsg, part, param, false); ++ setCustomizedParameterName(info.bindingOperation, outMsg, part, param, false); + } + + params.add(param); +--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Tue Jun 03 14:19:34 2014 -0700 ++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Wed Jul 30 03:53:36 2014 -0700 +@@ -576,7 +576,8 @@ + mailMap.addMailcap("text/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler"); + mailMap.addMailcap("application/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler"); + mailMap.addMailcap("application/fastinfoset;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler"); +- mailMap.addMailcap("multipart/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler"); ++ // this handler seems to be not used according VCS history ... ++ // mailMap.addMailcap("multipart/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler"); + mailMap.addMailcap("image/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler"); + mailMap.addMailcap("text/plain;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.StringDataContentHandler"); + } +--- ./jdk/.hgtags Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/.hgtags Wed Jul 30 18:42:59 2014 +0100 +@@ -245,7 +245,9 @@ + ce05e132b1370fe8a66ab9373014d12328c591c4 jdk8-b121 + e1499442453b6b70af6c2b496fa6d364f68c1d12 jdk8-b122 + 484e16c0a040efeccbe449d163e9c185e6c2b4db jdk8-b123 ++13b28cffa140d8637d37273e3791b484191965bb jdk8u20-b00 + ae303640bc1cca06f1c6ac887e6b523ceeb425a6 jdk8-b124 ++435a8a2f6d33ae28f3de5e40b6cfb552451ea348 jdk8u20-b01 + ae303640bc1cca06f1c6ac887e6b523ceeb425a6 jdk8-b125 + a9088d517f2fa9919886d3d95023c518b59172b8 jdk8-b126 + fbf251b8ef8a4a2aa1fd58efc8d0d5c8e2fd582b jdk8-b127 +@@ -268,6 +270,7 @@ + f4f3b7ccd2801a0a87dd4677332f5b93191d08f2 jdk8u5-b11 + 9ff7f7909e122bb54f7df80efd0fc7a03ce7efff jdk8u5-b12 + c6836440c427800a9f48168af29759b79857781d jdk8u5-b13 ++8ba5281f1dce1122edac9e7d12b6c42e6da6297b jdk8u5-b31 + 5eff6b1060758eae51125156a6f9c7725905e64e jdk8u11-b01 + cb1b9eca5890807476935051b8a5f13f4d3e5c63 jdk8u11-b02 + 5efce41be1c8637b399980ea227f19e0f98341bc jdk8u11-b03 +@@ -279,3 +282,32 @@ + 801e730c85eb822ac3b00466b32d42e089cb7233 jdk8u11-b09 + 105753f0465e534e3664d0935016f5a0d061829d jdk8u11-b10 + bd5f7651116e2634c09adf073609811c60a4d5e7 jdk8u11-b11 ++cbdfb9fdf1b3819f0299991a07e6ca72b3573625 jdk8u11-b12 ++35329d502d6fb65e4f089fd338d4ee0757811b36 jdk8u11-b31 ++9543b632ab87368c887d8b29b21157ebb44228d0 jdk8u20-b02 ++5a9f04957f826ce23639479c9791c7d8fd282b01 jdk8u20-b03 ++c347889445c1153f11aaa56092d44a911e497454 jdk8u20-b04 ++c9117a5defe912b1f7ae92bb0730d6e7a5a045df jdk8u20-b05 ++43386cc9a017a9f9e704760050086bb18b778ae0 jdk8-b130 ++e291ac47c9a90366c3c0787a6f7ce547a2bda308 jdk8-b131 ++43cb25339b5500871f41388a5197f1b01c4b57b8 jdk8-b132 ++1ecfc0fac3e7b931f09728b7594384ea5b5f9f0f jdk8u20-b06 ++db30cb9eb18dacea39c35daf15a3ee5fea41fd86 jdk8u20-b07 ++0e717bd55bc9e3f3fa3432e545944d81ed887ab0 jdk8u20-b08 ++bfcdcc29c8823595a5d70b5b633bedcd5ee3ba8e jdk8u20-b09 ++3dd165facde7ffa240d77b33ff88b2d938fff017 jdk8u20-b10 ++37392f2f5d598bdecb8a12c4ea129a70a0ff8bf9 jdk8u20-b11 ++e323c74edabd29378819150ec000c6a0a99266ed jdk8u20-b12 ++4edaec5f08c09d49cc12c4e885e1180f367360a5 jdk8u20-b13 ++bf4acb74e4a82d6126ad7a82bd8c52bdcce4bc8d jdk8u20-b14 ++82c35c2546a4c903f0da223ced4f0bebc266de82 jdk8u20-b15 ++d723d05cd17afd5c4dd4293bcba83fef44a3c0bb jdk8u20-b16 ++31433e5da5bcfd107381f281058dc80377f04d23 jdk8u20-b17 ++266302e9c31172984493404d5b223979315b59ac jdk8u20-b18 ++38548d32c91cfa57b1d31eec0a5e79c936e86f11 jdk8u20-b19 ++5c0406ee9e820140b5322db006baed199c165b4f jdk8u20-b20 ++693025bbc45d683676fa78bb76201b665e0d8f2d jdk8u20-b21 ++0c2393744b29175de5204140d4dfbf12ca3d364f jdk8u20-b22 ++be30cb2a3088f2b7b334b499f7eddbd5312312a7 jdk8u20-b23 ++dfb9f24d56b51e5a2ca26e77fc69a2464d51a4d3 jdk8u20-b24 ++dfb9f24d56b51e5a2ca26e77fc69a2464d51a4d3 jdk8u20-b25 +--- ./jdk/THIRD_PARTY_README Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/THIRD_PARTY_README Wed Jul 30 18:42:59 2014 +0100 +@@ -2,7 +2,7 @@ + ----------------------------- + + %% This notice is provided with respect to ASM Bytecode Manipulation +-Framework v5.0, which may be included with JRE 8, and JDK 8, and ++Framework v5.0.3, which may be included with JRE 8, and JDK 8, and + OpenJDK 8. + + --- begin of LICENSE --- +@@ -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 +@@ -3349,14 +3349,14 @@ + + ------------------------------------------------------------------------------- + +-%% This notice is provided with respect to zlib v1.2.5, which may be included ++%% This notice is provided with respect to zlib v1.2.8, which may be included + with JRE 8, JDK 8, and OpenJDK 8. + + --- begin of LICENSE --- + +- version 1.2.5, July 18th, 2005 +- +- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler ++ version 1.2.8, April 28th, 2013 ++ ++ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages +@@ -3382,11 +3382,11 @@ + ------------------------------------------------------------------------------- + + %% This notice is provided with respect to the following which may be +-included with JRE 8, JDK 8, and OpenJDK 8, except where noted: +- +- Apache Commons Math 2.2 +- Apache Derby 10.10.1.2 [included with JDK 8] +- Apache Jakarta BCEL 5.2 ++included with JRE 8, JDK 8, and OpenJDK 8. ++ ++ Apache Commons Math 3.2 ++ Apache Derby 10.10.1.3 ++ Apache Jakarta BCEL 5.1 + Apache Jakarta Regexp 1.4 + Apache Santuario XML Security for Java 1.5.4 + Apache Xalan-Java 2.7.1 +--- ./jdk/make/CompileDemos.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/CompileDemos.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -195,9 +195,6 @@ + $(JDK_OUTPUTDIR)/demo/nbproject/%: $(JDK_TOPDIR)/src/closed/share/demo/nbproject/% + $(call install-file) + $(CHMOD) -f ug+w $@ +- ifeq ($(OPENJDK_TARGET_OS), solaris) +- $(RM) -r $(JDK_OUTPUTDIR)/demo/nbproject/jfc/SwingApplet +- endif + endif + + ################################################################################################## +@@ -217,9 +214,12 @@ + # Param 5 = libs for posix + # Param 6 = libs for windows + # Param 7 = libs for solaris ++ # Param 8 = libs for linux ++ # Param 9 = extra directories with required sources + BUILD_DEMO_JVMTI_$1_EXTRA_SRC := \ + $$(wildcard $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/demo/jvmti/$1) \ +- $$(wildcard $$(addprefix $(JDK_TOPDIR)/src/share/demo/jvmti/, $2)) ++ $$(wildcard $$(addprefix $(JDK_TOPDIR)/src/share/demo/jvmti/, $2)) \ ++ $9 + BUILD_DEMO_JVMTI_$1_EXTRA_SRC_EXCLUDE := \ + $$(wildcard $$(addprefix $(JDK_TOPDIR)/src/share/demo/jvmti/, $2)/README.txt) \ + $$(wildcard $$(addprefix $(JDK_TOPDIR)/src/share/demo/jvmti/, $2)/sample.makefile.txt) +@@ -311,9 +311,19 @@ + $(eval $(call SetupJVMTIDemo,gctest, agent_util)) + $(eval $(call SetupJVMTIDemo,heapTracker, agent_util java_crw_demo)) + $(eval $(call SetupJVMTIDemo,heapViewer, agent_util)) ++ ++# On AIX, hprof requires 'dladdr' from src/aix/porting/porting_aix.cpp ++BUILD_LIBHPROF_AIX_EXTRA_SRC := ++BUILD_LIBHPROF_AIX_EXTRA_CFLAGS := ++ifeq ($(OPENJDK_TARGET_OS), aix) ++ BUILD_LIBHPROF_AIX_EXTRA_SRC += $(JDK_TOPDIR)/src/aix/porting ++ BUILD_LIBHPROF_AIX_EXTRA_CFLAGS += -I$(JDK_TOPDIR)/src/aix/porting ++endif ++ + $(eval $(call SetupJVMTIDemo,hprof, java_crw_demo, \ +- -I$(JDK_TOPDIR)/src/share/npt -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt, C, \ +- -ldl, ws2_32.lib winmm.lib, -lsocket -lnsl, -lpthread)) ++ -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))) + + $(eval $(call SetupJVMTIDemo,minst, agent_util java_crw_demo)) + $(eval $(call SetupJVMTIDemo,mtrace, agent_util java_crw_demo)) +@@ -365,9 +375,16 @@ + ################################################################################################## + + # The netbeans project files are copied into the demo directory. +-BUILD_DEMOS += $(patsubst $(JDK_TOPDIR)/src/share/demo/nbproject/%, \ ++ifeq ($(OPENJDK_TARGET_OS), solaris) ++ BUILD_DEMOS += $(patsubst $(JDK_TOPDIR)/src/share/demo/nbproject/%, \ ++ $(JDK_OUTPUTDIR)/demo/nbproject/%, \ ++ $(filter-out $(JDK_TOPDIR)/src/share/demo/nbproject/jfc/SwingApplet%, \ ++ $(call CacheFind, $(JDK_TOPDIR)/src/share/demo/nbproject))) ++else ++ BUILD_DEMOS += $(patsubst $(JDK_TOPDIR)/src/share/demo/nbproject/%, \ + $(JDK_OUTPUTDIR)/demo/nbproject/%, \ + $(call CacheFind, $(JDK_TOPDIR)/src/share/demo/nbproject)) ++endif + + $(JDK_OUTPUTDIR)/demo/nbproject/%: $(JDK_TOPDIR)/src/share/demo/nbproject/% + $(call install-file) +--- ./jdk/make/CompileJavaClasses.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/CompileJavaClasses.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -146,6 +146,17 @@ + sun/tools/attach/BsdVirtualMachine.java + endif + ++ifneq ($(OPENJDK_TARGET_OS),aix) ++ EXFILES+=sun/nio/ch/AixAsynchronousChannelProvider.java \ ++ sun/nio/ch/AixPollPort.java \ ++ sun/nio/fs/AixFileStore.java \ ++ sun/nio/fs/AixFileSystem.java \ ++ sun/nio/fs/AixFileSystemProvider.java \ ++ sun/nio/fs/AixNativeDispatcher.java \ ++ sun/tools/attach/AixAttachProvider.java \ ++ sun/tools/attach/AixVirtualMachine.java ++endif ++ + # Exclude BreakIterator classes that are just used in compile process to generate + # data files and shouldn't go in the product + EXFILES += sun/text/resources/BreakIteratorRules.java \ +@@ -217,9 +228,9 @@ + # Exclude another implicitly not included file. + EXFILES += sun/util/locale/AsciiUtil.java + +-ifeq (, $(filter $(OPENJDK_TARGET_OS), solaris macosx)) ++ifeq (, $(filter $(OPENJDK_TARGET_OS), solaris macosx aix)) + # +- # only solaris and macosx ++ # only solaris, macosx and aix + # + EXFILES += sun/nio/fs/PollingWatchService.java + endif +@@ -289,6 +300,16 @@ + sun/security/pkcs11 \ + # + ++AIX_SRC_DIRS := ++ifeq ($(OPENJDK_TARGET_OS),aix) ++ AIX_SRC_DIRS += $(JDK_TOPDIR)/src/aix/classes ++ ++ # these files are duplicated in AIX_SRC_DIRS ++ EXFILES += $(JDK_TOPDIR)/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java \ ++ $(JDK_TOPDIR)/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java \ ++ $(JDK_TOPDIR)/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java ++endif ++ + # The exception handling of swing beaninfo + # These resources violates the convention of having code and resources together under + # $(JDK_TOPDIR)/src/.../classes directories +@@ -313,6 +334,7 @@ + SRC:=$(JDK_TOPDIR)/src/share/classes \ + $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes \ + $(MACOSX_SRC_DIRS) \ ++ $(AIX_SRC_DIRS) \ + $(JDK_OUTPUTDIR)/gensrc \ + $(JDK_OUTPUTDIR)/gensrc_no_srczip \ + $(CLOSED_SRC_DIRS),\ +--- ./jdk/make/CompileLaunchers.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/CompileLaunchers.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -104,6 +104,10 @@ + $1_LDFLAGS_SUFFIX += -pthread + endif + ++ ifeq ($(OPENJDK_TARGET_OS), aix) ++ $1_LDFLAGS_SUFFIX += -L$(JDK_OUTPUTDIR)/objs -ljli_static ++ endif ++ + ifeq ($(USE_EXTERNAL_LIBZ), true) + $1_LDFLAGS_SUFFIX += -lz + endif +@@ -126,10 +130,21 @@ + $1_CFLAGS := $(filter-out -MD, $(CFLAGS_JDKEXE)) + endif + +- ifneq ($(wildcard $(JDK_TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU)), ) +- $1_MAPFILE := $(JDK_TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU) ++ # The linker on older SuSE distros (e.g. on SLES 10) complains with: ++ # "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable." ++ # if feeded with a version script which contains named tags. ++ ifeq ($(USING_BROKEN_SUSE_LD),yes) ++ ifneq ($(wildcard $(JDK_TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU).anonymous), ) ++ $1_MAPFILE := $(JDK_TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU).anonymous ++ else ++ $1_MAPFILE := ++ endif + else +- $1_MAPFILE := ++ ifneq ($(wildcard $(JDK_TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU)), ) ++ $1_MAPFILE := $(JDK_TOPDIR)/make/mapfiles/launchers/mapfile-$(OPENJDK_TARGET_CPU) ++ else ++ $1_MAPFILE := ++ endif + endif + + $(call SetupNativeCompilation,BUILD_LAUNCHER_$1, \ +@@ -180,7 +195,7 @@ + + BUILD_LAUNCHERS += $$(BUILD_LAUNCHER_$1) + +- ifeq ($(OPENJDK_TARGET_OS), macosx) ++ ifneq (,$(filter $(OPENJDK_TARGET_OS), macosx aix)) + $$(BUILD_LAUNCHER_$1): $(JDK_OUTPUTDIR)/objs/libjli_static.a + endif + +@@ -414,7 +429,7 @@ + UNPACKEXE_CFLAGS := -DSYSTEM_ZLIB + UNPACKEXE_ZIPOBJS := -lz + else +- UNPACKEXE_CFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 ++ UNPACKEXE_CFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.8 + UNPACKEXE_ZIPOBJS := $(JDK_OUTPUTDIR)/objs/libzip/zcrc32$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/deflate$(OBJ_SUFFIX) \ + $(JDK_OUTPUTDIR)/objs/libzip/trees$(OBJ_SUFFIX) \ +@@ -446,6 +461,16 @@ + EXE_OUT_OPTION_save := $(EXE_OUT_OPTION) + EXE_OUT_OPTION := -Fe + endif ++ ++# The linker on older SuSE distros (e.g. on SLES 10) complains with: ++# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable." ++# if feeded with a version script which contains named tags. ++ifeq ($(USING_BROKEN_SUSE_LD), yes) ++ UNPACK_MAPFILE = $(JDK_TOPDIR)/make/mapfiles/libunpack/mapfile-vers-unpack200.anonymous ++else ++ UNPACK_MAPFILE = $(JDK_TOPDIR)/make/mapfiles/libunpack/mapfile-vers-unpack200 ++endif ++ + $(eval $(call SetupNativeCompilation,BUILD_UNPACKEXE, \ + SRC := $(JDK_TOPDIR)/src/share/native/com/sun/java/util/jar/pack, \ + EXCLUDE_FILES := jni.cpp, \ +@@ -457,7 +482,7 @@ + CFLAGS_linux := -fPIC, \ + CFLAGS_solaris := -KPIC, \ + CFLAGS_macosx := -fPIC, \ +- MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libunpack/mapfile-vers-unpack200, \ ++ MAPFILE := $(UNPACK_MAPFILE),\ + LDFLAGS := $(UNPACKEXE_ZIPOBJS), \ + LDFLAGS_windows := $(CXXFLAGS_JDKEXE), \ + LDFLAGS_posix := $(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \ +@@ -601,7 +626,7 @@ + LINK_JSPAWNHELPER_OBJECTS := $(JDK_OUTPUTDIR)/objs/libjava/childproc.o + LINK_JSPAWNHELPER_FLAGS := + +-ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx solaris), ) ++ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx solaris aix), ) + BUILD_JSPAWNHELPER := 1 + endif + +@@ -610,7 +635,7 @@ + endif + + ifeq ($(OPENJDK_TARGET_CPU_BITS), 64) +- LINK_JSPAWNHELPER_FLAGS += -m64 ++ LINK_JSPAWNHELPER_FLAGS += $(COMPILER_TARGET_BITS_FLAG)64 + endif + + ifeq ($(BUILD_JSPAWNHELPER), 1) +@@ -651,7 +676,10 @@ + PROGRAM := jabswitch, \ + DEBUG_SYMBOLS := true, \ + VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/closed/windows/native/sun/bridge/AccessBridgeStatusWindow.rc, \ +- RC_FLAGS := $(RC_FLAGS), \ ++ RC_FLAGS := $(RC_FLAGS) \ ++ -D "JDK_FNAME=jabswitch.exe" \ ++ -D "JDK_INTERNAL_NAME=jabswitch" \ ++ -D "JDK_FTYPE=0x01L", \ + MANIFEST := $(JDK_TOPDIR)/src/closed/windows/native/sun/bridge/jabswitch.manifest)) + + BUILD_LAUNCHERS += $(BUILD_JABSWITCH) +--- ./jdk/make/CopyFiles.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/CopyFiles.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -183,9 +183,9 @@ + + ########################################################################################## + +-ifeq ($(OPENJDK_TARGET_OS), windows) ++ifneq ($(findstring $(OPENJDK_TARGET_OS), windows aix),) + +- TZMAPPINGS_SRC := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/lib ++ TZMAPPINGS_SRC := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS)/lib + + $(LIBDIR)/tzmappings: $(TZMAPPINGS_SRC)/tzmappings + $(call install-file) +--- ./jdk/make/Import.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/Import.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -252,7 +252,7 @@ + $(ECHO) Unzipping $( $@.tmp) ++ ($(CD) $(JDK_OUTPUTDIR) && $(UNZIP) -q -o $< > $@.tmp) + $(MV) $@.tmp $@ + endef + +--- ./jdk/make/data/classlist/classlist.aix Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/data/classlist/classlist.aix Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,2406 @@ ++java/lang/Object ++java/lang/String ++java/io/Serializable ++java/lang/Comparable ++java/lang/CharSequence ++java/lang/Class ++java/lang/reflect/GenericDeclaration ++java/lang/reflect/Type ++java/lang/reflect/AnnotatedElement ++java/lang/Cloneable ++java/lang/ClassLoader ++java/lang/System ++java/lang/Throwable ++java/lang/Error ++java/lang/ThreadDeath ++java/lang/Exception ++java/lang/RuntimeException ++java/security/ProtectionDomain ++java/security/AccessControlContext ++java/lang/ClassNotFoundException ++java/lang/NoClassDefFoundError ++java/lang/LinkageError ++java/lang/ClassCastException ++java/lang/ArrayStoreException ++java/lang/VirtualMachineError ++java/lang/OutOfMemoryError ++java/lang/StackOverflowError ++java/lang/IllegalMonitorStateException ++java/lang/ref/Reference ++java/lang/ref/SoftReference ++java/lang/ref/WeakReference ++java/lang/ref/FinalReference ++java/lang/ref/PhantomReference ++java/lang/ref/Finalizer ++java/lang/Thread ++java/lang/Runnable ++java/lang/ThreadGroup ++java/lang/Thread$UncaughtExceptionHandler ++java/util/Properties ++java/util/Hashtable ++java/util/Map ++java/util/Dictionary ++java/lang/reflect/AccessibleObject ++java/lang/reflect/Field ++java/lang/reflect/Member ++java/lang/reflect/Method ++java/lang/reflect/Constructor ++sun/reflect/MagicAccessorImpl ++sun/reflect/MethodAccessorImpl ++sun/reflect/MethodAccessor ++sun/reflect/ConstructorAccessorImpl ++sun/reflect/ConstructorAccessor ++sun/reflect/DelegatingClassLoader ++sun/reflect/ConstantPool ++sun/reflect/UnsafeStaticFieldAccessorImpl ++sun/reflect/UnsafeFieldAccessorImpl ++sun/reflect/FieldAccessorImpl ++sun/reflect/FieldAccessor ++java/util/Vector ++java/util/List ++java/util/Collection ++java/lang/Iterable ++java/util/RandomAccess ++java/util/AbstractList ++java/util/AbstractCollection ++java/lang/StringBuffer ++java/lang/AbstractStringBuilder ++java/lang/Appendable ++java/lang/StackTraceElement ++java/nio/Buffer ++java/lang/Boolean ++java/lang/Character ++java/lang/Float ++java/lang/Number ++java/lang/Double ++java/lang/Byte ++java/lang/Short ++java/lang/Integer ++java/lang/Long ++java/lang/NullPointerException ++java/lang/ArithmeticException ++java/io/ObjectStreamField ++java/lang/String$CaseInsensitiveComparator ++java/util/Comparator ++java/lang/RuntimePermission ++java/security/BasicPermission ++java/security/Permission ++java/security/Guard ++sun/misc/SoftCache ++java/util/AbstractMap ++java/lang/ref/ReferenceQueue ++java/lang/ref/ReferenceQueue$Null ++java/lang/ref/ReferenceQueue$Lock ++java/util/HashMap ++java/lang/annotation/Annotation ++java/util/HashMap$Entry ++java/util/Map$Entry ++java/security/AccessController ++java/lang/reflect/ReflectPermission ++sun/reflect/ReflectionFactory$GetReflectionFactoryAction ++java/security/PrivilegedAction ++java/util/Stack ++sun/reflect/ReflectionFactory ++java/lang/ref/Reference$Lock ++java/lang/ref/Reference$ReferenceHandler ++java/lang/ref/Finalizer$FinalizerThread ++java/util/Hashtable$EmptyEnumerator ++java/util/Enumeration ++java/util/Hashtable$EmptyIterator ++java/util/Iterator ++java/util/Hashtable$Entry ++java/nio/charset/Charset ++sun/nio/cs/StandardCharsets ++sun/nio/cs/FastCharsetProvider ++java/nio/charset/spi/CharsetProvider ++sun/nio/cs/StandardCharsets$Aliases ++sun/util/PreHashedMap ++sun/nio/cs/StandardCharsets$Classes ++sun/nio/cs/StandardCharsets$Cache ++java/lang/ThreadLocal ++java/util/concurrent/atomic/AtomicInteger ++sun/misc/Unsafe ++java/lang/NoSuchMethodError ++java/lang/IncompatibleClassChangeError ++sun/reflect/Reflection ++java/util/Collections ++java/util/Collections$EmptySet ++java/util/AbstractSet ++java/util/Set ++java/util/Collections$EmptyList ++java/util/Collections$EmptyMap ++java/util/Collections$ReverseComparator ++java/util/Collections$SynchronizedMap ++java/lang/Class$3 ++java/lang/reflect/Modifier ++java/lang/reflect/ReflectAccess ++sun/reflect/LangReflectAccess ++java/util/Arrays ++java/lang/Math ++sun/nio/cs/US_ASCII ++sun/nio/cs/HistoricallyNamedCharset ++sun/misc/VM ++java/lang/StringCoding ++java/lang/ThreadLocal$ThreadLocalMap ++java/lang/ThreadLocal$ThreadLocalMap$Entry ++java/lang/StringCoding$StringDecoder ++sun/nio/cs/US_ASCII$Decoder ++java/nio/charset/CharsetDecoder ++java/nio/charset/CodingErrorAction ++java/nio/ByteBuffer ++java/nio/HeapByteBuffer ++java/nio/Bits ++java/nio/ByteOrder ++java/nio/CharBuffer ++java/lang/Readable ++java/nio/HeapCharBuffer ++java/nio/charset/CoderResult ++java/nio/charset/CoderResult$1 ++java/nio/charset/CoderResult$Cache ++java/nio/charset/CoderResult$2 ++sun/misc/Version ++java/io/FileInputStream ++java/io/InputStream ++java/io/Closeable ++java/io/FileDescriptor ++java/io/FileOutputStream ++java/io/OutputStream ++java/io/Flushable ++java/io/BufferedInputStream ++java/io/FilterInputStream ++java/util/concurrent/atomic/AtomicReferenceFieldUpdater ++java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl ++sun/reflect/misc/ReflectUtil ++java/io/PrintStream ++java/io/FilterOutputStream ++java/io/BufferedOutputStream ++java/io/OutputStreamWriter ++java/io/Writer ++sun/nio/cs/StreamEncoder ++sun/security/action/GetPropertyAction ++sun/nio/cs/US_ASCII$Encoder ++java/nio/charset/CharsetEncoder ++sun/nio/cs/Surrogate$Parser ++sun/nio/cs/Surrogate ++java/io/BufferedWriter ++java/lang/Runtime ++java/io/File ++java/io/FileSystem ++java/io/UnixFileSystem ++java/io/ExpiringCache ++java/io/ExpiringCache$1 ++java/util/LinkedHashMap ++java/util/LinkedHashMap$Entry ++java/lang/StringBuilder ++java/io/File$1 ++sun/misc/JavaIODeleteOnExitAccess ++sun/misc/SharedSecrets ++java/lang/ClassLoader$3 ++java/lang/StringCoding$StringEncoder ++java/io/ExpiringCache$Entry ++java/lang/ClassLoader$NativeLibrary ++java/lang/Terminator ++java/lang/Terminator$1 ++sun/misc/SignalHandler ++sun/misc/Signal ++sun/misc/NativeSignalHandler ++java/io/Console ++java/io/Console$1 ++sun/misc/JavaIOAccess ++java/io/Console$1$1 ++java/lang/Shutdown ++java/util/ArrayList ++java/lang/Shutdown$Lock ++java/lang/ApplicationShutdownHooks ++java/util/IdentityHashMap ++sun/misc/OSEnvironment ++java/lang/System$2 ++sun/misc/JavaLangAccess ++java/lang/Compiler ++java/lang/Compiler$1 ++sun/misc/Launcher ++sun/misc/Launcher$Factory ++java/net/URLStreamHandlerFactory ++sun/misc/Launcher$ExtClassLoader ++java/net/URLClassLoader ++java/security/SecureClassLoader ++sun/security/util/Debug ++java/net/URLClassLoader$7 ++sun/misc/JavaNetAccess ++java/util/StringTokenizer ++sun/misc/Launcher$ExtClassLoader$1 ++java/security/PrivilegedExceptionAction ++sun/misc/MetaIndex ++java/io/BufferedReader ++java/io/Reader ++java/io/FileReader ++java/io/InputStreamReader ++sun/nio/cs/StreamDecoder ++java/lang/reflect/Array ++sun/net/www/ParseUtil ++java/util/BitSet ++java/io/ObjectStreamClass ++java/net/URL ++java/util/Locale ++java/util/concurrent/ConcurrentHashMap ++java/util/concurrent/ConcurrentMap ++java/util/concurrent/ConcurrentHashMap$Segment ++java/util/concurrent/locks/ReentrantLock ++java/util/concurrent/locks/Lock ++java/util/concurrent/locks/ReentrantLock$NonfairSync ++java/util/concurrent/locks/ReentrantLock$Sync ++java/util/concurrent/locks/AbstractQueuedSynchronizer ++java/util/concurrent/locks/AbstractOwnableSynchronizer ++java/util/concurrent/locks/AbstractQueuedSynchronizer$Node ++java/util/concurrent/ConcurrentHashMap$HashEntry ++java/lang/CharacterDataLatin1 ++java/net/Parts ++sun/net/www/protocol/file/Handler ++java/net/URLStreamHandler ++java/lang/Class$1 ++sun/reflect/ReflectionFactory$1 ++sun/reflect/NativeConstructorAccessorImpl ++sun/reflect/DelegatingConstructorAccessorImpl ++java/util/HashSet ++sun/misc/URLClassPath ++sun/net/www/protocol/jar/Handler ++sun/misc/Launcher$AppClassLoader ++sun/misc/Launcher$AppClassLoader$1 ++java/lang/SystemClassLoaderAction ++java/net/URLClassLoader$1 ++sun/misc/URLClassPath$3 ++sun/misc/URLClassPath$JarLoader ++sun/misc/URLClassPath$Loader ++java/security/PrivilegedActionException ++sun/misc/URLClassPath$FileLoader ++sun/misc/URLClassPath$FileLoader$1 ++sun/misc/Resource ++sun/nio/ByteBuffered ++java/security/CodeSource ++java/security/Permissions ++java/security/PermissionCollection ++sun/net/www/protocol/file/FileURLConnection ++sun/net/www/URLConnection ++java/net/URLConnection ++java/net/UnknownContentHandler ++java/net/ContentHandler ++sun/net/www/MessageHeader ++java/io/FilePermission ++java/io/FilePermission$1 ++sun/security/provider/PolicyFile ++java/security/Policy ++java/security/Policy$UnsupportedEmptyCollection ++java/io/FilePermissionCollection ++java/security/AllPermission ++java/security/UnresolvedPermission ++java/security/BasicPermissionCollection ++java/security/Principal ++java/security/cert/Certificate ++java/util/AbstractList$Itr ++java/util/IdentityHashMap$KeySet ++java/util/IdentityHashMap$KeyIterator ++java/util/IdentityHashMap$IdentityHashMapIterator ++java/io/DeleteOnExitHook ++java/util/LinkedHashSet ++java/util/HashMap$KeySet ++java/util/LinkedHashMap$KeyIterator ++java/util/LinkedHashMap$LinkedHashIterator ++java/awt/Frame ++java/awt/MenuContainer ++java/awt/Window ++javax/accessibility/Accessible ++java/awt/Container ++java/awt/Component ++java/awt/image/ImageObserver ++java/lang/InterruptedException ++java/awt/Label ++java/util/logging/Logger ++java/util/logging/Handler ++java/util/logging/Level ++java/util/logging/LogManager ++java/util/logging/LogManager$1 ++java/beans/PropertyChangeSupport ++java/util/logging/LogManager$LogNode ++java/util/logging/LoggingPermission ++java/util/logging/LogManager$Cleaner ++java/util/logging/LogManager$RootLogger ++java/util/logging/LogManager$2 ++java/util/Properties$LineReader ++java/util/Hashtable$Enumerator ++java/beans/PropertyChangeEvent ++java/util/EventObject ++java/awt/Component$AWTTreeLock ++sun/awt/DebugHelper ++sun/awt/NativeLibLoader ++sun/security/action/LoadLibraryAction ++java/awt/GraphicsEnvironment ++java/awt/GraphicsEnvironment$1 ++java/lang/ProcessEnvironment ++java/lang/ProcessEnvironment$Variable ++java/lang/ProcessEnvironment$ExternalData ++java/lang/ProcessEnvironment$Value ++java/lang/ProcessEnvironment$StringEnvironment ++java/util/Collections$UnmodifiableMap ++sun/awt/DebugHelperStub ++java/awt/Toolkit ++java/awt/Toolkit$3 ++sun/util/CoreResourceBundleControl ++java/util/ResourceBundle$Control ++java/util/Arrays$ArrayList ++java/util/Collections$UnmodifiableRandomAccessList ++java/util/Collections$UnmodifiableList ++java/util/Collections$UnmodifiableCollection ++java/util/ResourceBundle ++java/util/ResourceBundle$1 ++java/util/ResourceBundle$RBClassLoader ++java/util/ResourceBundle$RBClassLoader$1 ++java/util/ResourceBundle$CacheKey ++java/util/ResourceBundle$LoaderReference ++java/util/ResourceBundle$CacheKeyReference ++java/util/ResourceBundle$SingleFormatControl ++sun/awt/resources/awt ++java/util/ListResourceBundle ++java/awt/Toolkit$1 ++java/io/FileNotFoundException ++java/io/IOException ++java/awt/event/KeyEvent ++java/awt/event/InputEvent ++java/awt/event/ComponentEvent ++java/awt/AWTEvent ++java/awt/event/NativeLibLoader ++java/util/WeakHashMap ++java/util/WeakHashMap$Entry ++java/awt/Component$DummyRequestFocusController ++sun/awt/RequestFocusController ++java/awt/LayoutManager ++java/awt/LightweightDispatcher ++java/awt/event/AWTEventListener ++java/util/EventListener ++java/awt/Dimension ++java/awt/geom/Dimension2D ++java/util/concurrent/atomic/AtomicBoolean ++java/awt/ComponentOrientation ++java/awt/Component$2 ++java/lang/NoSuchMethodException ++sun/awt/AppContext ++sun/awt/AppContext$1 ++sun/awt/AppContext$2 ++sun/awt/MostRecentKeyValue ++java/awt/Cursor ++sun/awt/X11GraphicsEnvironment ++sun/java2d/SunGraphicsEnvironment ++sun/java2d/FontSupport ++sun/awt/DisplayChangedListener ++sun/java2d/SunGraphicsEnvironment$TTFilter ++java/io/FilenameFilter ++sun/java2d/SunGraphicsEnvironment$T1Filter ++sun/awt/X11GraphicsEnvironment$1 ++sun/awt/SunToolkit ++sun/awt/WindowClosingSupport ++sun/awt/WindowClosingListener ++sun/awt/ComponentFactory ++sun/awt/InputMethodSupport ++java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject ++java/util/concurrent/locks/Condition ++sun/awt/AWTAutoShutdown ++sun/awt/AWTAutoShutdown$PeerMap ++sun/awt/SunToolkit$6 ++java/awt/Dialog$ModalExclusionType ++java/lang/Enum ++java/awt/Dialog ++java/awt/Dialog$ModalityType ++java/awt/ModalEventFilter ++java/awt/EventFilter ++sun/reflect/UnsafeFieldAccessorFactory ++sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl ++sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl ++sun/awt/SunDisplayChanger ++sun/java2d/SunGraphicsEnvironment$1 ++java/io/StreamTokenizer ++sun/font/FontManager ++sun/font/FileFont ++sun/font/PhysicalFont ++sun/font/Font2D ++sun/font/CompositeFont ++java/util/HashMap$Values ++java/util/HashMap$ValueIterator ++java/util/HashMap$HashIterator ++sun/font/FontManager$1 ++java/awt/Font ++java/awt/geom/AffineTransform ++sun/font/AttributeValues ++sun/font/EAttribute ++java/text/AttributedCharacterIterator$Attribute ++java/lang/Class$4 ++sun/reflect/NativeMethodAccessorImpl ++sun/reflect/DelegatingMethodAccessorImpl ++java/awt/font/TextAttribute ++java/lang/Integer$IntegerCache ++sun/font/TrueTypeFont ++java/awt/font/FontRenderContext ++java/awt/RenderingHints ++sun/awt/SunHints ++sun/awt/SunHints$Key ++java/awt/RenderingHints$Key ++sun/awt/SunHints$Value ++sun/awt/SunHints$LCDContrastKey ++sun/font/Type1Font ++java/awt/geom/Point2D$Float ++java/awt/geom/Point2D ++sun/font/StrikeMetrics ++java/awt/geom/Rectangle2D$Float ++java/awt/geom/Rectangle2D ++java/awt/geom/RectangularShape ++java/awt/Shape ++java/awt/geom/GeneralPath ++java/awt/geom/Path2D$Float ++java/awt/geom/Path2D ++sun/font/CharToGlyphMapper ++sun/font/PhysicalStrike ++sun/font/FontStrike ++sun/font/GlyphList ++sun/font/StrikeCache ++sun/java2d/Disposer ++sun/java2d/Disposer$1 ++sun/font/StrikeCache$1 ++sun/font/FontManager$FontRegistrationInfo ++sun/awt/motif/MFontConfiguration ++sun/awt/FontConfiguration ++sun/awt/FontDescriptor ++java/util/Scanner ++java/util/regex/Pattern ++java/util/regex/Pattern$8 ++java/util/regex/Pattern$Node ++java/util/regex/Pattern$LastNode ++java/util/regex/Pattern$GroupHead ++java/util/regex/Pattern$CharPropertyNames ++java/util/regex/Pattern$CharPropertyNames$1 ++java/util/regex/Pattern$CharPropertyNames$CharPropertyFactory ++java/util/regex/Pattern$CharPropertyNames$2 ++java/util/regex/Pattern$CharPropertyNames$5 ++java/util/regex/Pattern$CharPropertyNames$3 ++java/util/regex/Pattern$CharPropertyNames$6 ++java/util/regex/Pattern$CharPropertyNames$CloneableProperty ++java/util/regex/Pattern$CharProperty ++java/util/regex/Pattern$CharPropertyNames$4 ++java/util/regex/Pattern$CharPropertyNames$7 ++java/util/regex/Pattern$CharPropertyNames$8 ++java/util/regex/Pattern$CharPropertyNames$9 ++java/util/regex/Pattern$CharPropertyNames$10 ++java/util/regex/Pattern$CharPropertyNames$11 ++java/util/regex/Pattern$CharPropertyNames$12 ++java/util/regex/Pattern$CharPropertyNames$13 ++java/util/regex/Pattern$CharPropertyNames$14 ++java/util/regex/Pattern$CharPropertyNames$15 ++java/util/regex/Pattern$CharPropertyNames$16 ++java/util/regex/Pattern$CharPropertyNames$17 ++java/util/regex/Pattern$CharPropertyNames$18 ++java/util/regex/Pattern$CharPropertyNames$19 ++java/util/regex/Pattern$CharPropertyNames$20 ++java/util/regex/Pattern$CharPropertyNames$21 ++java/util/regex/Pattern$Curly ++java/util/regex/Pattern$Slice ++java/util/regex/Pattern$Begin ++java/util/regex/Pattern$First ++java/util/regex/Pattern$Start ++java/util/regex/Pattern$TreeInfo ++java/util/regex/Pattern$All ++java/util/regex/Pattern$BitClass ++java/util/regex/Pattern$BmpCharProperty ++java/util/regex/Pattern$6 ++java/util/regex/Pattern$CharProperty$1 ++java/util/regex/Pattern$10 ++sun/nio/ch/FileChannelImpl ++java/nio/channels/FileChannel ++java/nio/channels/ByteChannel ++java/nio/channels/ReadableByteChannel ++java/nio/channels/Channel ++java/nio/channels/WritableByteChannel ++java/nio/channels/GatheringByteChannel ++java/nio/channels/ScatteringByteChannel ++java/nio/channels/spi/AbstractInterruptibleChannel ++java/nio/channels/InterruptibleChannel ++sun/nio/ch/Util ++sun/nio/ch/IOUtil ++sun/nio/ch/FileDispatcher ++sun/nio/ch/NativeDispatcher ++sun/nio/ch/Reflect ++java/nio/MappedByteBuffer ++sun/nio/ch/Reflect$1 ++sun/nio/ch/NativeThreadSet ++java/nio/channels/Channels ++java/util/Scanner$1 ++sun/misc/LRUCache ++java/util/regex/Matcher ++java/util/regex/MatchResult ++java/text/NumberFormat ++java/text/Format ++java/text/spi/NumberFormatProvider ++java/util/spi/LocaleServiceProvider ++sun/util/LocaleServiceProviderPool ++sun/util/LocaleServiceProviderPool$1 ++java/util/ServiceLoader ++java/util/ServiceLoader$LazyIterator ++java/util/ServiceLoader$1 ++java/util/HashMap$EntrySet ++java/util/LinkedHashMap$EntryIterator ++sun/misc/Launcher$1 ++sun/misc/URLClassPath$2 ++java/lang/ClassLoader$2 ++sun/misc/URLClassPath$1 ++java/net/URLClassLoader$3 ++sun/misc/CompoundEnumeration ++sun/misc/URLClassPath$JarLoader$1 ++sun/misc/FileURLMapper ++java/net/URLClassLoader$3$1 ++sun/util/resources/LocaleData ++sun/util/resources/LocaleData$1 ++sun/util/resources/LocaleData$LocaleDataResourceBundleControl ++sun/util/LocaleDataMetaInfo ++sun/text/resources/FormatData ++java/util/ResourceBundle$BundleReference ++sun/text/resources/FormatData_en ++sun/text/resources/FormatData_en_US ++java/text/DecimalFormatSymbols ++java/text/spi/DecimalFormatSymbolsProvider ++java/util/Currency ++java/util/Currency$1 ++java/util/CurrencyData ++java/util/spi/CurrencyNameProvider ++sun/util/resources/CurrencyNames ++sun/util/resources/LocaleNamesBundle ++sun/util/resources/OpenListResourceBundle ++sun/util/resources/CurrencyNames_en_US ++java/text/DecimalFormat ++java/text/FieldPosition ++java/text/DigitList ++java/math/RoundingMode ++java/util/regex/Pattern$GroupTail ++java/util/regex/Pattern$Ctype ++java/util/regex/Pattern$Ques ++java/util/regex/Pattern$GroupCurly ++java/util/regex/Pattern$5 ++java/util/regex/Pattern$Loop ++java/util/regex/Pattern$Prolog ++java/util/regex/Pattern$9 ++java/util/regex/Pattern$BranchConn ++java/util/regex/Pattern$Branch ++java/nio/channels/spi/AbstractInterruptibleChannel$1 ++sun/nio/ch/Interruptible ++sun/nio/ch/NativeThread ++sun/nio/ch/DirectBuffer ++java/nio/DirectByteBuffer ++java/nio/DirectByteBuffer$Deallocator ++sun/misc/Cleaner ++sun/nio/ch/IOStatus ++java/util/regex/ASCII ++java/io/DataInputStream ++java/io/DataInput ++java/lang/Short$ShortCache ++java/util/HashMap$KeyIterator ++sun/font/CompositeFontDescriptor ++sun/font/Font2DHandle ++sun/font/FontFamily ++java/awt/GraphicsDevice ++sun/awt/X11GraphicsDevice ++sun/awt/X11GraphicsConfig ++java/awt/GraphicsConfiguration ++java/awt/ImageCapabilities ++sun/java2d/x11/X11SurfaceData ++sun/java2d/SurfaceData ++java/awt/Transparency ++sun/java2d/DisposerTarget ++sun/java2d/InvalidPipeException ++java/lang/IllegalStateException ++sun/java2d/NullSurfaceData ++sun/java2d/loops/SurfaceType ++sun/awt/image/PixelConverter ++sun/awt/image/PixelConverter$Xrgb ++sun/awt/image/PixelConverter$Argb ++sun/awt/image/PixelConverter$ArgbPre ++sun/awt/image/PixelConverter$Xbgr ++sun/awt/image/PixelConverter$Rgba ++sun/awt/image/PixelConverter$RgbaPre ++sun/awt/image/PixelConverter$Ushort565Rgb ++sun/awt/image/PixelConverter$Ushort555Rgb ++sun/awt/image/PixelConverter$Ushort555Rgbx ++sun/awt/image/PixelConverter$Ushort4444Argb ++sun/awt/image/PixelConverter$ByteGray ++sun/awt/image/PixelConverter$UshortGray ++sun/awt/image/PixelConverter$Rgbx ++sun/awt/image/PixelConverter$Bgrx ++sun/awt/image/PixelConverter$ArgbBm ++java/awt/image/ColorModel ++java/awt/image/DirectColorModel ++java/awt/image/PackedColorModel ++java/awt/color/ColorSpace ++java/awt/color/ICC_Profile ++sun/awt/color/ProfileDeferralInfo ++sun/awt/color/ProfileDeferralMgr ++java/awt/color/ICC_ProfileRGB ++java/awt/color/ICC_Profile$1 ++sun/awt/color/ProfileActivator ++java/awt/color/ICC_ColorSpace ++sun/java2d/pipe/NullPipe ++sun/java2d/pipe/PixelDrawPipe ++sun/java2d/pipe/PixelFillPipe ++sun/java2d/pipe/ShapeDrawPipe ++sun/java2d/pipe/TextPipe ++sun/java2d/pipe/DrawImagePipe ++java/awt/image/IndexColorModel ++sun/java2d/pipe/LoopPipe ++sun/java2d/pipe/OutlineTextRenderer ++sun/java2d/pipe/SolidTextRenderer ++sun/java2d/pipe/GlyphListLoopPipe ++sun/java2d/pipe/GlyphListPipe ++sun/java2d/pipe/AATextRenderer ++sun/java2d/pipe/LCDTextRenderer ++sun/java2d/pipe/AlphaColorPipe ++sun/java2d/pipe/CompositePipe ++sun/java2d/pipe/PixelToShapeConverter ++sun/java2d/pipe/TextRenderer ++sun/java2d/pipe/SpanClipRenderer ++sun/java2d/pipe/Region ++sun/java2d/pipe/RegionIterator ++sun/java2d/pipe/DuctusShapeRenderer ++sun/java2d/pipe/DuctusRenderer ++sun/java2d/pipe/AlphaPaintPipe ++sun/java2d/pipe/SpanShapeRenderer$Composite ++sun/java2d/pipe/SpanShapeRenderer ++sun/java2d/pipe/GeneralCompositePipe ++sun/java2d/pipe/DrawImage ++sun/java2d/loops/RenderCache ++sun/java2d/loops/RenderCache$Entry ++sun/java2d/loops/XORComposite ++java/awt/Composite ++sun/font/X11TextRenderer ++sun/java2d/loops/GraphicsPrimitive ++sun/java2d/x11/X11PMBlitLoops ++sun/java2d/loops/Blit ++sun/java2d/loops/GraphicsPrimitiveMgr ++sun/java2d/loops/CompositeType ++sun/java2d/SunGraphics2D ++sun/awt/ConstrainableGraphics ++java/awt/Graphics2D ++java/awt/Graphics ++java/awt/Color ++java/awt/Paint ++java/awt/AlphaComposite ++sun/java2d/loops/BlitBg ++sun/java2d/loops/ScaledBlit ++sun/java2d/loops/FillRect ++sun/java2d/loops/FillSpans ++sun/java2d/loops/DrawLine ++sun/java2d/loops/DrawRect ++sun/java2d/loops/DrawPolygons ++sun/java2d/loops/DrawPath ++sun/java2d/loops/FillPath ++sun/java2d/loops/MaskBlit ++sun/java2d/loops/MaskFill ++sun/java2d/loops/DrawGlyphList ++sun/java2d/loops/DrawGlyphListAA ++sun/java2d/loops/DrawGlyphListLCD ++sun/java2d/loops/TransformHelper ++java/awt/BasicStroke ++java/awt/Stroke ++sun/misc/PerformanceLogger ++sun/misc/PerformanceLogger$TimeData ++sun/java2d/pipe/ValidatePipe ++sun/java2d/loops/CustomComponent ++sun/java2d/loops/GraphicsPrimitiveProxy ++sun/java2d/loops/GeneralRenderer ++sun/java2d/loops/GraphicsPrimitiveMgr$1 ++sun/java2d/loops/GraphicsPrimitiveMgr$2 ++sun/java2d/x11/X11PMBlitLoops$DelegateBlitLoop ++sun/java2d/x11/X11PMBlitBgLoops ++sun/java2d/x11/X11SurfaceData$LazyPipe ++sun/awt/X11GraphicsConfig$X11GCDisposerRecord ++sun/java2d/DisposerRecord ++java/awt/BorderLayout ++java/awt/LayoutManager2 ++java/awt/Rectangle ++java/awt/Toolkit$2 ++sun/awt/X11/XToolkit ++sun/awt/X11/XConstants ++sun/awt/UNIXToolkit ++java/util/TreeMap ++java/util/NavigableMap ++java/util/SortedMap ++sun/awt/X11/XlibWrapper ++sun/awt/X11/XUtilConstants ++sun/awt/X11/XProtocolConstants ++sun/awt/X11/XCursorFontConstants ++sun/awt/X11/XlibWrapper$1 ++sun/awt/X11/XToolkit$4 ++sun/awt/X11/XModifierKeymap ++sun/awt/X11/XWrapperBase ++sun/awt/X11/Native ++sun/awt/X11/Native$1 ++java/awt/EventQueue ++sun/awt/X11/XToolkit$7 ++java/util/EmptyStackException ++java/lang/reflect/InvocationTargetException ++java/awt/EventDispatchThread ++java/awt/event/PaintEvent ++java/awt/event/MouseEvent ++sun/awt/PeerEvent ++java/awt/event/InvocationEvent ++java/awt/ActiveEvent ++java/awt/EventQueueItem ++sun/awt/X11/XToolkit$1 ++sun/awt/X11/XToolkit$XErrorHandler ++sun/awt/X11/XToolkit$5 ++sun/awt/X11/XEventDispatcher ++sun/awt/SunToolkit$ModalityListenerList ++sun/awt/ModalityListener ++sun/awt/SunToolkit$1 ++java/util/MissingResourceException ++java/awt/Queue ++sun/awt/PostEventQueue ++java/util/LinkedList ++java/util/Deque ++java/util/Queue ++java/util/AbstractSequentialList ++java/util/LinkedList$Entry ++sun/awt/X11/AwtScreenData ++sun/awt/X11/XWM ++sun/awt/X11/MWMConstants ++sun/awt/X11/XAtom ++java/awt/Insets ++sun/awt/X11/XWM$1 ++sun/awt/X11/XWM$2 ++sun/awt/X11/XSetWindowAttributes ++sun/awt/X11/XErrorEvent ++sun/awt/X11/XNETProtocol ++sun/awt/X11/XStateProtocol ++sun/awt/X11/XLayerProtocol ++sun/awt/X11/XProtocol ++sun/awt/X11/XProtocol$1 ++sun/awt/X11/WindowPropertyGetter ++sun/awt/X11/UnsafeXDisposerRecord ++sun/awt/X11/XPropertyCache ++sun/awt/X11/XWINProtocol ++sun/awt/X11/XAtomList ++sun/awt/X11/XToolkit$3 ++sun/awt/X11/XAnyEvent ++sun/awt/X11/IXAnyEvent ++java/awt/Window$WindowDisposerRecord ++java/awt/KeyboardFocusManager ++java/awt/KeyEventDispatcher ++java/awt/KeyEventPostProcessor ++java/awt/AWTKeyStroke ++java/awt/AWTKeyStroke$1 ++java/awt/DefaultKeyboardFocusManager ++java/awt/DefaultFocusTraversalPolicy ++java/awt/ContainerOrderFocusTraversalPolicy ++java/awt/FocusTraversalPolicy ++java/awt/MutableBoolean ++java/util/Collections$UnmodifiableSet ++sun/awt/HeadlessToolkit ++sun/awt/X11/XKeyboardFocusManagerPeer ++java/awt/peer/KeyboardFocusManagerPeer ++sun/awt/X11/XKeyboardFocusManagerPeer$1 ++sun/awt/X11/XFramePeer ++java/awt/peer/FramePeer ++java/awt/peer/WindowPeer ++java/awt/peer/ContainerPeer ++java/awt/peer/ComponentPeer ++sun/awt/X11/XDecoratedPeer ++sun/awt/X11/XWindowPeer ++sun/awt/X11/XPanelPeer ++java/awt/peer/PanelPeer ++sun/awt/X11/XCanvasPeer ++java/awt/peer/CanvasPeer ++sun/awt/X11/XComponentPeer ++java/awt/dnd/peer/DropTargetPeer ++sun/awt/X11/XWindow ++sun/awt/X11ComponentPeer ++sun/awt/X11/XBaseWindow ++sun/awt/X11/XCreateWindowParams ++java/lang/Long$LongCache ++sun/awt/X11/XBaseWindow$InitialiseState ++sun/awt/X11/XBaseWindow$StateLock ++sun/awt/X11/AwtGraphicsConfigData ++sun/awt/X11/XVisualInfo ++java/awt/SystemColor ++sun/awt/X11/MotifColorUtilities ++java/lang/StrictMath ++sun/awt/X11/XRepaintArea ++sun/awt/RepaintArea ++sun/awt/X11/XWindowAttributesData ++java/util/concurrent/locks/LockSupport ++sun/awt/X11/WindowDimensions ++java/awt/Point ++java/util/TreeMap$Entry ++sun/nio/cs/UTF_8 ++sun/nio/cs/Unicode ++sun/nio/cs/UTF_8$Encoder ++sun/nio/cs/UTF_8$Decoder ++sun/nio/cs/Surrogate$Generator ++sun/awt/X11/XPropertyEvent ++sun/awt/X11/XDropTargetEventProcessor ++sun/awt/X11/XDragSourceContextPeer ++sun/awt/X11/XDragSourceProtocolListener ++sun/awt/dnd/SunDragSourceContextPeer ++java/awt/dnd/peer/DragSourceContextPeer ++sun/awt/X11/XAwtState ++sun/awt/X11/XBaseWindow$1 ++sun/awt/X11/XRootWindow ++sun/nio/cs/ISO_8859_1 ++sun/nio/cs/ISO_8859_1$Encoder ++sun/nio/cs/ISO_8859_1$Decoder ++sun/java2d/x11/X11SurfaceData$X11WindowSurfaceData ++sun/java2d/loops/RenderLoops ++sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec ++sun/java2d/DefaultDisposerRecord ++sun/java2d/x11/X11Renderer ++sun/awt/X11/XGlobalCursorManager ++sun/awt/GlobalCursorManager ++sun/awt/X11/XToolkit$6 ++java/awt/Cursor$CursorDisposer ++java/awt/AWTException ++java/awt/HeadlessException ++java/lang/UnsupportedOperationException ++sun/reflect/UnsafeLongFieldAccessorImpl ++sun/reflect/UnsafeIntegerFieldAccessorImpl ++sun/awt/X11/XClientMessageEvent ++sun/awt/X11/XIconInfo ++sun/awt/X11/XAWTIcon32_java_icon16_png ++sun/awt/X11/XAWTIcon32_java_icon24_png ++sun/awt/X11/XAWTIcon32_java_icon32_png ++sun/awt/X11/XAWTIcon32_java_icon48_png ++sun/awt/X11/XSizeHints ++sun/awt/X11/XContentWindow ++sun/awt/X11/XFocusProxyWindow ++sun/awt/X11/XWMHints ++java/util/LinkedList$ListItr ++java/util/ListIterator ++sun/awt/SunToolkit$2 ++java/awt/image/BufferStrategy ++java/awt/dnd/DropTarget ++java/awt/dnd/DropTargetListener ++java/awt/event/ComponentListener ++java/awt/event/FocusListener ++java/awt/event/HierarchyListener ++java/awt/event/HierarchyBoundsListener ++java/awt/event/KeyListener ++java/awt/event/MouseListener ++java/awt/event/MouseMotionListener ++java/awt/event/MouseWheelListener ++java/awt/event/InputMethodListener ++java/awt/Component$NativeInLightFixer ++java/awt/event/ContainerListener ++javax/accessibility/AccessibleContext ++sun/reflect/UnsafeObjectFieldAccessorImpl ++java/awt/peer/LightweightPeer ++sun/awt/X11/XLabelPeer ++java/awt/peer/LabelPeer ++sun/awt/X11/XMapEvent ++sun/awt/X11/XQueryTree ++sun/awt/X11/XConfigureEvent ++sun/awt/X11/PropMwmHints ++sun/awt/GlobalCursorManager$NativeUpdater ++javax/swing/JFrame ++javax/swing/WindowConstants ++javax/swing/RootPaneContainer ++javax/swing/TransferHandler$HasGetTransferHandler ++javax/swing/JLabel ++javax/swing/SwingConstants ++javax/swing/JComponent ++javax/swing/JComponent$1 ++javax/swing/SwingUtilities ++javax/swing/JRootPane ++sun/security/action/GetBooleanAction ++javax/swing/event/EventListenerList ++javax/swing/JPanel ++java/awt/FlowLayout ++javax/swing/UIManager ++javax/swing/UIManager$LookAndFeelInfo ++sun/swing/SwingUtilities2 ++sun/swing/SwingUtilities2$LSBCacheEntry ++javax/swing/UIManager$LAFState ++javax/swing/UIDefaults ++javax/swing/MultiUIDefaults ++javax/swing/UIManager$1 ++javax/swing/plaf/metal/MetalLookAndFeel ++javax/swing/plaf/basic/BasicLookAndFeel ++javax/swing/LookAndFeel ++sun/swing/DefaultLookup ++javax/swing/plaf/metal/OceanTheme ++javax/swing/plaf/metal/DefaultMetalTheme ++javax/swing/plaf/metal/MetalTheme ++javax/swing/plaf/ColorUIResource ++javax/swing/plaf/UIResource ++sun/swing/PrintColorUIResource ++javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate ++javax/swing/plaf/FontUIResource ++sun/swing/SwingLazyValue ++javax/swing/UIDefaults$LazyValue ++javax/swing/UIDefaults$ActiveValue ++javax/swing/plaf/InsetsUIResource ++sun/swing/SwingUtilities2$2 ++javax/swing/plaf/basic/BasicLookAndFeel$2 ++javax/swing/plaf/DimensionUIResource ++javax/swing/UIDefaults$LazyInputMap ++java/lang/Character$CharacterCache ++javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue ++javax/swing/plaf/metal/MetalLookAndFeel$FontActiveValue ++java/awt/print/PrinterJob ++sun/swing/SwingUtilities2$AATextInfo ++sun/awt/X11/XAWTXSettings ++sun/awt/X11/XMSelectionListener ++sun/awt/XSettings ++sun/awt/X11/XMSelection ++sun/awt/X11/XMSelection$1 ++javax/swing/plaf/metal/MetalLookAndFeel$AATextListener ++java/beans/PropertyChangeListener ++java/beans/PropertyChangeListenerProxy ++java/util/EventListenerProxy ++sun/awt/EventListenerAggregate ++javax/swing/UIDefaults$ProxyLazyValue ++javax/swing/plaf/metal/OceanTheme$1 ++javax/swing/plaf/metal/OceanTheme$2 ++javax/swing/plaf/metal/OceanTheme$3 ++javax/swing/plaf/metal/OceanTheme$4 ++javax/swing/plaf/metal/OceanTheme$5 ++javax/swing/plaf/metal/OceanTheme$6 ++javax/swing/RepaintManager ++javax/swing/RepaintManager$DisplayChangedHandler ++javax/swing/SwingPaintEventDispatcher ++sun/awt/PaintEventDispatcher ++javax/swing/UIManager$2 ++javax/swing/UIManager$3 ++java/awt/PopupMenu ++java/awt/Menu ++java/awt/MenuItem ++java/awt/MenuComponent ++java/io/ObjectOutputStream ++java/io/ObjectOutput ++java/io/DataOutput ++java/io/ObjectStreamConstants ++java/io/PrintWriter ++java/io/ObjectInputStream ++java/io/ObjectInput ++java/awt/Event ++java/awt/im/InputContext ++java/awt/event/MouseWheelEvent ++java/awt/BufferCapabilities ++sun/awt/CausedFocusEvent$Cause ++java/awt/PointerInfo ++java/awt/Component$BaselineResizeBehavior ++java/awt/FontMetrics ++java/awt/Image ++java/awt/image/ImageProducer ++java/awt/image/VolatileImage ++java/awt/im/InputMethodRequests ++java/awt/event/FocusEvent ++java/awt/event/InputMethodEvent ++java/awt/event/HierarchyEvent ++javax/accessibility/AccessibleStateSet ++com/sun/swing/internal/plaf/metal/resources/metal ++sun/util/ResourceBundleEnumeration ++com/sun/swing/internal/plaf/basic/resources/basic ++javax/swing/plaf/basic/BasicPanelUI ++javax/swing/plaf/PanelUI ++javax/swing/plaf/ComponentUI ++sun/reflect/misc/MethodUtil ++sun/reflect/misc/MethodUtil$1 ++java/util/jar/JarFile ++java/util/zip/ZipFile ++java/util/zip/ZipConstants ++java/util/jar/JavaUtilJarAccessImpl ++sun/misc/JavaUtilJarAccess ++sun/misc/JarIndex ++java/util/zip/ZipEntry ++java/util/jar/JarFile$JarFileEntry ++java/util/jar/JarEntry ++sun/misc/URLClassPath$JarLoader$2 ++sun/net/www/protocol/jar/JarURLConnection ++java/net/JarURLConnection ++sun/net/www/protocol/jar/JarFileFactory ++sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController ++java/net/HttpURLConnection ++sun/net/www/protocol/jar/URLJarFile ++sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry ++sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream ++java/util/zip/ZipFile$ZipFileInputStream ++java/security/AllPermissionCollection ++java/lang/IllegalAccessException ++javax/swing/JPasswordField ++javax/swing/JTextField ++javax/swing/text/JTextComponent ++javax/swing/Scrollable ++javax/swing/JLayeredPane ++javax/swing/JRootPane$1 ++javax/swing/ArrayTable ++javax/swing/JInternalFrame ++javax/swing/JRootPane$RootLayout ++javax/swing/BufferStrategyPaintManager ++javax/swing/RepaintManager$PaintManager ++javax/swing/plaf/metal/MetalRootPaneUI ++javax/swing/plaf/basic/BasicRootPaneUI ++javax/swing/plaf/RootPaneUI ++javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap ++javax/swing/plaf/ComponentInputMapUIResource ++javax/swing/ComponentInputMap ++javax/swing/InputMap ++javax/swing/plaf/InputMapUIResource ++javax/swing/KeyStroke ++java/awt/VKCollection ++sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl ++javax/swing/plaf/basic/LazyActionMap ++javax/swing/plaf/ActionMapUIResource ++javax/swing/ActionMap ++javax/swing/LayoutFocusTraversalPolicy ++javax/swing/SortingFocusTraversalPolicy ++javax/swing/InternalFrameFocusTraversalPolicy ++javax/swing/SwingContainerOrderFocusTraversalPolicy ++javax/swing/SwingDefaultFocusTraversalPolicy ++javax/swing/LayoutComparator ++javax/swing/plaf/metal/MetalLabelUI ++javax/swing/plaf/basic/BasicLabelUI ++javax/swing/plaf/LabelUI ++javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1 ++javax/swing/plaf/basic/BasicHTML ++javax/swing/SystemEventQueueUtilities ++javax/swing/SystemEventQueueUtilities$SystemEventQueue ++sun/awt/NullComponentPeer ++java/awt/event/WindowEvent ++java/awt/EventQueue$1 ++java/awt/EventDispatchThread$1 ++java/awt/Conditional ++java/awt/EventDispatchThread$HierarchyEventFilter ++java/awt/EventFilter$FilterAction ++sun/awt/dnd/SunDropTargetEvent ++java/awt/event/ActionEvent ++java/util/jar/Manifest ++java/io/ByteArrayInputStream ++java/util/jar/Attributes ++java/util/jar/Manifest$FastInputStream ++java/util/jar/Attributes$Name ++sun/misc/ASCIICaseInsensitiveComparator ++java/util/jar/JarVerifier ++java/io/ByteArrayOutputStream ++sun/misc/ExtensionDependency ++java/lang/Package ++sun/security/util/ManifestEntryVerifier ++sun/security/provider/Sun ++java/security/Provider ++java/security/Provider$ServiceKey ++java/security/Provider$EngineDescription ++sun/security/provider/Sun$1 ++java/security/Security ++java/security/Security$1 ++sun/misc/FloatingDecimal ++sun/misc/FloatingDecimal$1 ++sun/security/provider/NativePRNG ++java/security/SecureRandomSpi ++sun/security/provider/NativePRNG$1 ++sun/security/provider/NativePRNG$RandomIO ++sun/misc/BASE64Decoder ++sun/misc/CharacterDecoder ++sun/security/util/SignatureFileVerifier ++java/awt/event/KeyAdapter ++java/lang/NumberFormatException ++java/lang/IllegalArgumentException ++java/io/FileWriter ++java/net/Authenticator ++java/net/MalformedURLException ++javax/swing/text/Element ++javax/swing/text/Document ++javax/swing/text/PlainDocument ++javax/swing/text/AbstractDocument ++javax/swing/text/GapContent ++javax/swing/text/AbstractDocument$Content ++javax/swing/text/GapVector ++javax/swing/text/GapContent$MarkVector ++javax/swing/text/GapContent$MarkData ++javax/swing/text/StyleContext ++javax/swing/text/AbstractDocument$AttributeContext ++javax/swing/text/StyleConstants ++javax/swing/text/StyleConstants$CharacterConstants ++javax/swing/text/AttributeSet$CharacterAttribute ++javax/swing/text/StyleConstants$FontConstants ++javax/swing/text/AttributeSet$FontAttribute ++javax/swing/text/StyleConstants$ColorConstants ++javax/swing/text/AttributeSet$ColorAttribute ++javax/swing/text/StyleConstants$ParagraphConstants ++javax/swing/text/AttributeSet$ParagraphAttribute ++javax/swing/text/StyleContext$FontKey ++javax/swing/text/SimpleAttributeSet ++javax/swing/text/MutableAttributeSet ++javax/swing/text/AttributeSet ++javax/swing/text/SimpleAttributeSet$EmptyAttributeSet ++javax/swing/text/StyleContext$NamedStyle ++javax/swing/text/Style ++javax/swing/text/SimpleAttributeSet$1 ++javax/swing/text/StyleContext$SmallAttributeSet ++javax/swing/text/AbstractDocument$BidiRootElement ++javax/swing/text/AbstractDocument$BranchElement ++javax/swing/text/AbstractDocument$AbstractElement ++javax/swing/tree/TreeNode ++javax/swing/text/AbstractDocument$1 ++javax/swing/text/AbstractDocument$BidiElement ++javax/swing/text/AbstractDocument$LeafElement ++javax/swing/text/GapContent$StickyPosition ++javax/swing/text/Position ++javax/swing/text/StyleContext$KeyEnumeration ++javax/swing/text/GapContent$InsertUndo ++javax/swing/undo/AbstractUndoableEdit ++javax/swing/undo/UndoableEdit ++javax/swing/text/AbstractDocument$DefaultDocumentEvent ++javax/swing/event/DocumentEvent ++javax/swing/undo/CompoundEdit ++javax/swing/event/DocumentEvent$EventType ++javax/swing/text/Segment ++java/text/CharacterIterator ++javax/swing/text/Utilities ++javax/swing/text/SegmentCache ++javax/swing/text/SegmentCache$CachedSegment ++javax/swing/event/UndoableEditEvent ++javax/swing/text/AbstractDocument$ElementEdit ++javax/swing/event/DocumentEvent$ElementChange ++java/net/Socket ++java/net/InetAddress ++java/net/InetAddress$Cache ++java/net/InetAddress$Cache$Type ++java/net/InetAddressImplFactory ++java/net/Inet4AddressImpl ++java/net/InetAddressImpl ++java/net/InetAddress$1 ++sun/net/spi/nameservice/NameService ++sun/net/util/IPAddressUtil ++java/util/RandomAccessSubList ++java/util/SubList ++java/util/SubList$1 ++java/util/AbstractList$ListItr ++java/net/Inet4Address ++java/net/InetSocketAddress ++java/net/SocketAddress ++java/net/SocksSocketImpl ++java/net/SocksConsts ++java/net/PlainSocketImpl ++java/net/SocketImpl ++java/net/SocketOptions ++java/net/SocketException ++java/net/SocksSocketImpl$5 ++java/net/ProxySelector ++sun/net/spi/DefaultProxySelector ++sun/net/spi/DefaultProxySelector$1 ++sun/net/NetProperties ++sun/net/NetProperties$1 ++sun/net/spi/DefaultProxySelector$NonProxyInfo ++java/net/Inet6Address ++java/net/URI ++java/net/URI$Parser ++java/net/Proxy ++java/net/Proxy$Type ++java/net/ConnectException ++javax/swing/JMenu ++javax/swing/MenuElement ++javax/swing/JMenuItem ++javax/swing/AbstractButton ++java/awt/ItemSelectable ++javax/swing/event/MenuListener ++javax/swing/JCheckBoxMenuItem ++javax/swing/Icon ++javax/swing/JButton ++java/awt/event/WindowListener ++java/net/URLClassLoader$2 ++javax/swing/ImageIcon ++javax/swing/ImageIcon$1 ++java/awt/MediaTracker ++sun/misc/SoftCache$ValueCell ++sun/awt/image/URLImageSource ++sun/awt/image/InputStreamImageSource ++sun/awt/image/ImageFetchable ++sun/awt/image/ToolkitImage ++java/awt/Image$1 ++sun/awt/image/SurfaceManager$ImageAccessor ++sun/awt/image/SurfaceManager ++sun/awt/image/NativeLibLoader ++java/awt/ImageMediaEntry ++java/awt/MediaEntry ++sun/awt/image/ImageRepresentation ++java/awt/image/ImageConsumer ++sun/awt/image/ImageWatched ++sun/awt/image/ImageWatched$Link ++sun/awt/image/ImageWatched$WeakLink ++sun/awt/image/ImageConsumerQueue ++sun/awt/image/ImageFetcher ++sun/awt/image/FetcherInfo ++sun/awt/image/ImageFetcher$1 ++sun/awt/image/GifImageDecoder ++sun/awt/image/ImageDecoder ++sun/awt/image/GifFrame ++java/awt/image/Raster ++java/awt/image/DataBufferByte ++java/awt/image/DataBuffer ++java/awt/image/PixelInterleavedSampleModel ++java/awt/image/ComponentSampleModel ++java/awt/image/SampleModel ++sun/awt/image/ByteInterleavedRaster ++sun/awt/image/ByteComponentRaster ++sun/awt/image/SunWritableRaster ++java/awt/image/WritableRaster ++java/awt/image/BufferedImage ++java/awt/image/WritableRenderedImage ++java/awt/image/RenderedImage ++sun/awt/image/IntegerComponentRaster ++sun/awt/image/BytePackedRaster ++java/awt/Canvas ++sun/font/FontDesignMetrics ++sun/font/FontStrikeDesc ++sun/font/CompositeStrike ++sun/font/FontStrikeDisposer ++sun/font/StrikeCache$SoftDisposerRef ++sun/font/StrikeCache$DisposableStrike ++sun/font/TrueTypeFont$TTDisposerRecord ++sun/font/TrueTypeFont$1 ++java/io/RandomAccessFile ++java/nio/ByteBufferAsIntBufferB ++java/nio/IntBuffer ++sun/font/TrueTypeFont$DirectoryEntry ++java/nio/ByteBufferAsShortBufferB ++java/nio/ShortBuffer ++sun/nio/cs/UTF_16 ++sun/nio/cs/UTF_16$Decoder ++sun/nio/cs/UnicodeDecoder ++sun/font/FileFontStrike ++sun/font/FileFont$FileFontDisposer ++sun/font/TrueTypeGlyphMapper ++sun/font/CMap ++sun/font/CMap$NullCMapClass ++sun/font/CMap$CMapFormat4 ++java/nio/ByteBufferAsCharBufferB ++sun/font/FontDesignMetrics$KeyReference ++sun/awt/image/PNGImageDecoder ++sun/awt/image/PNGFilterInputStream ++java/util/zip/InflaterInputStream ++java/util/zip/Inflater ++sun/awt/EventQueueItem ++sun/awt/SunToolkit$3 ++sun/awt/X11/XExposeEvent ++sun/awt/X11/ComponentAccessor ++sun/awt/X11/ComponentAccessor$1 ++sun/reflect/UnsafeBooleanFieldAccessorImpl ++sun/awt/event/IgnorePaintEvent ++java/awt/image/DataBufferInt ++java/awt/image/SinglePixelPackedSampleModel ++sun/awt/image/IntegerInterleavedRaster ++sun/java2d/x11/X11RemoteOffScreenImage ++sun/awt/image/RemoteOffScreenImage ++sun/awt/image/OffScreenImage ++sun/java2d/x11/X11RemoteOffScreenImage$X11RemoteSurfaceManager ++sun/awt/image/OffScreenSurfaceManager ++sun/awt/image/CachingSurfaceManager ++sun/awt/image/RasterListener ++sun/awt/image/BufImgSurfaceData ++sun/java2d/opengl/GLXGraphicsConfig ++sun/java2d/opengl/OGLGraphicsConfig ++sun/java2d/x11/X11SurfaceData$X11PixmapSurfaceData ++sun/awt/image/WritableRasterNative ++sun/awt/image/DataBufferNative ++sun/java2d/SurfaceManagerFactory ++sun/java2d/x11/X11CachingSurfaceManager ++sun/java2d/opengl/GLXSurfaceData ++sun/java2d/opengl/OGLSurfaceData ++sun/font/CompositeGlyphMapper ++sun/java2d/loops/FontInfo ++java/util/Date ++sun/util/calendar/CalendarSystem ++sun/util/calendar/Gregorian ++sun/util/calendar/BaseCalendar ++sun/util/calendar/AbstractCalendar ++java/util/TimeZone ++java/lang/InheritableThreadLocal ++sun/util/calendar/ZoneInfo ++sun/util/calendar/ZoneInfoFile ++sun/util/calendar/ZoneInfoFile$1 ++java/util/TimeZone$1 ++sun/util/calendar/Gregorian$Date ++sun/util/calendar/BaseCalendar$Date ++sun/util/calendar/CalendarDate ++sun/util/calendar/CalendarUtils ++java/util/TimeZone$DisplayNames ++sun/util/TimeZoneNameUtility ++sun/util/resources/TimeZoneNames ++sun/util/resources/TimeZoneNamesBundle ++sun/util/resources/TimeZoneNames_en ++java/util/spi/TimeZoneNameProvider ++java/lang/ProcessBuilder ++java/lang/ProcessImpl ++java/lang/UNIXProcess ++java/lang/Process ++java/lang/UNIXProcess$Gate ++java/lang/UNIXProcess$1 ++java/lang/UNIXProcess$1$1 ++java/lang/UNIXProcess$1$1$1 ++java/net/ServerSocket ++java/util/Random ++java/util/concurrent/atomic/AtomicLong ++java/lang/InternalError ++java/io/StringReader ++java/lang/SecurityException ++java/io/FilterReader ++java/lang/reflect/Proxy ++java/lang/reflect/InvocationHandler ++java/lang/NoSuchFieldException ++java/lang/InstantiationException ++java/lang/ArrayIndexOutOfBoundsException ++java/lang/IndexOutOfBoundsException ++javax/swing/JDialog ++sun/awt/X11/XClipboard ++sun/awt/datatransfer/SunClipboard ++java/awt/datatransfer/Clipboard ++java/awt/datatransfer/SystemFlavorMap ++java/awt/datatransfer/FlavorMap ++java/awt/datatransfer/FlavorTable ++java/awt/datatransfer/SystemFlavorMap$1 ++sun/net/ProgressMonitor ++sun/net/DefaultProgressMeteringPolicy ++sun/net/ProgressMeteringPolicy ++java/awt/datatransfer/SystemFlavorMap$2 ++java/awt/datatransfer/MimeType ++java/io/Externalizable ++java/awt/datatransfer/MimeTypeParameterList ++sun/awt/datatransfer/DataTransferer ++java/util/Collections$SynchronizedSet ++java/util/Collections$SynchronizedCollection ++java/awt/datatransfer/DataFlavor ++java/awt/datatransfer/DataFlavor$1 ++sun/awt/datatransfer/DataTransferer$CharsetComparator ++sun/awt/datatransfer/DataTransferer$IndexedComparator ++sun/nio/cs/UTF_16LE ++sun/nio/cs/UTF_16BE ++sun/awt/datatransfer/DataTransferer$DataFlavorComparator ++java/rmi/Remote ++sun/awt/datatransfer/DataTransferer$1 ++sun/awt/X11/XDataTransferer ++sun/awt/datatransfer/ToolkitThreadBlockedHandler ++javax/imageio/ImageTypeSpecifier ++sun/awt/X11/XSelection ++sun/security/action/GetIntegerAction ++sun/awt/X11/XSelection$IncrementalTransferHandler ++sun/awt/X11/XSelection$SelectionEventHandler ++java/awt/datatransfer/Transferable ++java/io/EOFException ++java/util/Vector$1 ++java/util/zip/ZipFile$1 ++java/util/zip/ZipFile$2 ++java/util/jar/JarFile$1 ++java/util/PropertyResourceBundle ++java/util/ResourceBundle$Control$1 ++java/util/Hashtable$EntrySet ++java/lang/IllegalAccessError ++java/text/MessageFormat ++java/text/MessageFormat$Field ++java/text/Format$Field ++java/lang/CloneNotSupportedException ++sun/reflect/MethodAccessorGenerator ++sun/reflect/AccessorGenerator ++sun/reflect/ClassFileConstants ++java/lang/Void ++sun/reflect/ByteVectorFactory ++sun/reflect/ByteVectorImpl ++sun/reflect/ByteVector ++sun/reflect/ClassFileAssembler ++sun/reflect/UTF8 ++sun/reflect/Label ++sun/reflect/Label$PatchInfo ++sun/reflect/MethodAccessorGenerator$1 ++sun/reflect/ClassDefiner ++sun/reflect/ClassDefiner$1 ++sun/reflect/BootstrapConstructorAccessorImpl ++java/awt/event/ActionListener ++javax/swing/Timer ++javax/swing/Timer$DoPostEvent ++javax/swing/TimerQueue ++javax/swing/TimerQueue$1 ++javax/swing/ToolTipManager ++java/awt/event/MouseAdapter ++javax/swing/ToolTipManager$insideTimerAction ++javax/swing/ToolTipManager$outsideTimerAction ++javax/swing/ToolTipManager$stillInsideTimerAction ++javax/swing/ToolTipManager$Actions ++sun/swing/UIAction ++javax/swing/Action ++javax/swing/ToolTipManager$MoveBeforeEnterListener ++java/awt/event/MouseMotionAdapter ++java/util/Hashtable$ValueCollection ++javax/swing/event/CaretListener ++javax/swing/JToolBar ++javax/swing/JSplitPane ++javax/swing/border/Border ++javax/swing/JToggleButton ++javax/swing/border/EmptyBorder ++javax/swing/border/AbstractBorder ++javax/swing/DefaultButtonModel ++javax/swing/ButtonModel ++javax/swing/AbstractButton$Handler ++javax/swing/event/ChangeListener ++java/awt/event/ItemListener ++javax/swing/plaf/metal/MetalButtonUI ++javax/swing/plaf/basic/BasicButtonUI ++javax/swing/plaf/ButtonUI ++javax/swing/plaf/metal/MetalBorders ++javax/swing/plaf/BorderUIResource$CompoundBorderUIResource ++javax/swing/border/CompoundBorder ++javax/swing/plaf/metal/MetalBorders$ButtonBorder ++javax/swing/plaf/basic/BasicBorders$MarginBorder ++javax/swing/plaf/basic/BasicButtonListener ++java/awt/AWTEventMulticaster ++java/awt/event/WindowFocusListener ++java/awt/event/WindowStateListener ++java/awt/event/AdjustmentListener ++java/awt/event/TextListener ++javax/swing/event/AncestorListener ++java/beans/VetoableChangeListener ++javax/swing/ButtonGroup ++javax/swing/JToggleButton$ToggleButtonModel ++javax/swing/plaf/metal/MetalToggleButtonUI ++javax/swing/plaf/basic/BasicToggleButtonUI ++javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder ++java/awt/CardLayout ++javax/swing/Box ++javax/swing/plaf/metal/MetalBorders$TextFieldBorder ++javax/swing/plaf/metal/MetalBorders$Flush3DBorder ++javax/swing/BoxLayout ++javax/swing/JMenuBar ++javax/swing/DefaultSingleSelectionModel ++javax/swing/SingleSelectionModel ++javax/swing/plaf/basic/BasicMenuBarUI ++javax/swing/plaf/MenuBarUI ++javax/swing/plaf/basic/DefaultMenuLayout ++javax/swing/plaf/metal/MetalBorders$MenuBarBorder ++javax/swing/plaf/basic/BasicMenuBarUI$Handler ++javax/swing/KeyboardManager ++javax/swing/event/MenuEvent ++javax/swing/JMenu$MenuChangeListener ++javax/swing/JMenuItem$MenuItemFocusListener ++javax/swing/plaf/basic/BasicMenuUI ++javax/swing/plaf/basic/BasicMenuItemUI ++javax/swing/plaf/MenuItemUI ++javax/swing/plaf/metal/MetalBorders$MenuItemBorder ++javax/swing/plaf/metal/MetalIconFactory ++javax/swing/plaf/metal/MetalIconFactory$MenuArrowIcon ++javax/swing/plaf/basic/BasicMenuUI$Handler ++javax/swing/event/MenuKeyListener ++javax/swing/plaf/basic/BasicMenuItemUI$Handler ++javax/swing/event/MenuDragMouseListener ++javax/swing/event/MouseInputListener ++javax/swing/event/ChangeEvent ++java/awt/event/ContainerEvent ++javax/swing/plaf/metal/MetalIconFactory$MenuItemArrowIcon ++javax/swing/JPopupMenu ++javax/swing/plaf/basic/BasicPopupMenuUI ++javax/swing/plaf/PopupMenuUI ++javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper ++java/awt/event/AWTEventListenerProxy ++java/awt/Toolkit$SelectiveAWTEventListener ++java/awt/Toolkit$ToolkitEventMulticaster ++javax/swing/plaf/basic/BasicLookAndFeel$1 ++javax/swing/plaf/metal/MetalBorders$PopupMenuBorder ++javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener ++javax/swing/event/PopupMenuListener ++javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener ++javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber ++javax/swing/MenuSelectionManager ++javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper ++javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1 ++java/awt/event/FocusAdapter ++javax/swing/JMenu$WinListener ++java/awt/event/WindowAdapter ++javax/swing/JPopupMenu$Separator ++javax/swing/JSeparator ++javax/swing/plaf/metal/MetalPopupMenuSeparatorUI ++javax/swing/plaf/metal/MetalSeparatorUI ++javax/swing/plaf/basic/BasicSeparatorUI ++javax/swing/plaf/SeparatorUI ++javax/swing/JComboBox ++javax/swing/event/ListDataListener ++javax/swing/event/CaretEvent ++javax/swing/text/TabExpander ++javax/swing/JScrollBar ++java/awt/Adjustable ++javax/swing/event/MouseInputAdapter ++javax/swing/JScrollBar$ModelListener ++javax/swing/DefaultBoundedRangeModel ++javax/swing/BoundedRangeModel ++javax/swing/plaf/metal/MetalScrollBarUI ++javax/swing/plaf/basic/BasicScrollBarUI ++javax/swing/plaf/ScrollBarUI ++javax/swing/plaf/metal/MetalBumps ++javax/swing/plaf/metal/MetalScrollButton ++javax/swing/plaf/basic/BasicArrowButton ++javax/swing/plaf/basic/BasicScrollBarUI$TrackListener ++javax/swing/plaf/basic/BasicScrollBarUI$ArrowButtonListener ++javax/swing/plaf/basic/BasicScrollBarUI$ModelListener ++javax/swing/plaf/metal/MetalScrollBarUI$ScrollBarListener ++javax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler ++javax/swing/plaf/basic/BasicScrollBarUI$Handler ++javax/swing/plaf/basic/BasicScrollBarUI$ScrollListener ++javax/swing/CellRendererPane ++java/util/HashMap$EntryIterator ++javax/swing/border/MatteBorder ++sun/font/StandardGlyphVector ++java/awt/font/GlyphVector ++sun/font/StandardGlyphVector$GlyphStrike ++sun/font/CoreMetrics ++sun/font/FontLineMetrics ++java/awt/font/LineMetrics ++javax/swing/ComboBoxModel ++javax/swing/ListModel ++javax/swing/ListCellRenderer ++javax/swing/DefaultComboBoxModel ++javax/swing/MutableComboBoxModel ++javax/swing/AbstractListModel ++javax/swing/JComboBox$1 ++javax/swing/AncestorNotifier ++javax/swing/plaf/metal/MetalComboBoxUI ++javax/swing/plaf/basic/BasicComboBoxUI ++javax/swing/plaf/ComboBoxUI ++javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager ++javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager ++javax/swing/plaf/basic/BasicComboPopup ++javax/swing/plaf/basic/ComboPopup ++javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass ++javax/swing/border/LineBorder ++javax/swing/plaf/basic/BasicComboPopup$1 ++javax/swing/JList ++javax/swing/DropMode ++javax/swing/DefaultListSelectionModel ++javax/swing/ListSelectionModel ++javax/swing/plaf/basic/BasicListUI ++javax/swing/plaf/ListUI ++javax/swing/plaf/basic/BasicListUI$ListTransferHandler ++javax/swing/TransferHandler ++javax/swing/TransferHandler$TransferAction ++javax/swing/DefaultListCellRenderer$UIResource ++javax/swing/DefaultListCellRenderer ++javax/swing/TransferHandler$SwingDropTarget ++java/awt/dnd/DropTargetContext ++javax/swing/TransferHandler$DropHandler ++javax/swing/TransferHandler$TransferSupport ++javax/swing/plaf/basic/BasicListUI$Handler ++javax/swing/event/ListSelectionListener ++javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag ++javax/swing/plaf/basic/BasicComboPopup$Handler ++javax/swing/JScrollPane ++javax/swing/ScrollPaneConstants ++javax/swing/ScrollPaneLayout$UIResource ++javax/swing/ScrollPaneLayout ++javax/swing/JViewport ++javax/swing/ViewportLayout ++javax/swing/plaf/basic/BasicViewportUI ++javax/swing/plaf/ViewportUI ++javax/swing/JScrollPane$ScrollBar ++javax/swing/JViewport$ViewListener ++java/awt/event/ComponentAdapter ++javax/swing/plaf/metal/MetalScrollPaneUI ++javax/swing/plaf/basic/BasicScrollPaneUI ++javax/swing/plaf/ScrollPaneUI ++javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder ++javax/swing/plaf/basic/BasicScrollPaneUI$Handler ++javax/swing/plaf/metal/MetalScrollPaneUI$1 ++javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource ++javax/swing/plaf/basic/BasicComboBoxRenderer ++javax/swing/plaf/metal/MetalComboBoxEditor$UIResource ++javax/swing/plaf/metal/MetalComboBoxEditor ++javax/swing/plaf/basic/BasicComboBoxEditor ++javax/swing/ComboBoxEditor ++javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField ++javax/swing/JTextField$NotifyAction ++javax/swing/text/TextAction ++javax/swing/AbstractAction ++javax/swing/text/JTextComponent$MutableCaretEvent ++javax/swing/plaf/metal/MetalTextFieldUI ++javax/swing/plaf/basic/BasicTextFieldUI ++javax/swing/plaf/basic/BasicTextUI ++javax/swing/text/ViewFactory ++javax/swing/plaf/TextUI ++javax/swing/plaf/basic/BasicTextUI$BasicCursor ++javax/swing/text/DefaultEditorKit ++javax/swing/text/EditorKit ++javax/swing/text/DefaultEditorKit$InsertContentAction ++javax/swing/text/DefaultEditorKit$DeletePrevCharAction ++javax/swing/text/DefaultEditorKit$DeleteNextCharAction ++javax/swing/text/DefaultEditorKit$ReadOnlyAction ++javax/swing/text/DefaultEditorKit$DeleteWordAction ++javax/swing/text/DefaultEditorKit$WritableAction ++javax/swing/text/DefaultEditorKit$CutAction ++javax/swing/text/DefaultEditorKit$CopyAction ++javax/swing/text/DefaultEditorKit$PasteAction ++javax/swing/text/DefaultEditorKit$VerticalPageAction ++javax/swing/text/DefaultEditorKit$PageAction ++javax/swing/text/DefaultEditorKit$InsertBreakAction ++javax/swing/text/DefaultEditorKit$BeepAction ++javax/swing/text/DefaultEditorKit$NextVisualPositionAction ++javax/swing/text/DefaultEditorKit$BeginWordAction ++javax/swing/text/DefaultEditorKit$EndWordAction ++javax/swing/text/DefaultEditorKit$PreviousWordAction ++javax/swing/text/DefaultEditorKit$NextWordAction ++javax/swing/text/DefaultEditorKit$BeginLineAction ++javax/swing/text/DefaultEditorKit$EndLineAction ++javax/swing/text/DefaultEditorKit$BeginParagraphAction ++javax/swing/text/DefaultEditorKit$EndParagraphAction ++javax/swing/text/DefaultEditorKit$BeginAction ++javax/swing/text/DefaultEditorKit$EndAction ++javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction ++javax/swing/text/DefaultEditorKit$InsertTabAction ++javax/swing/text/DefaultEditorKit$SelectWordAction ++javax/swing/text/DefaultEditorKit$SelectLineAction ++javax/swing/text/DefaultEditorKit$SelectParagraphAction ++javax/swing/text/DefaultEditorKit$SelectAllAction ++javax/swing/text/DefaultEditorKit$UnselectAction ++javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction ++javax/swing/text/DefaultEditorKit$DumpModelAction ++javax/swing/plaf/basic/BasicTextUI$TextTransferHandler ++javax/swing/text/Position$Bias ++javax/swing/plaf/basic/BasicTextUI$RootView ++javax/swing/text/View ++javax/swing/plaf/basic/BasicTextUI$UpdateHandler ++javax/swing/event/DocumentListener ++javax/swing/plaf/basic/BasicTextUI$DragListener ++javax/swing/plaf/basic/BasicComboBoxEditor$UIResource ++javax/swing/plaf/basic/BasicTextUI$BasicCaret ++javax/swing/text/DefaultCaret ++javax/swing/text/Caret ++javax/swing/text/DefaultCaret$Handler ++java/awt/datatransfer/ClipboardOwner ++javax/swing/plaf/basic/BasicTextUI$BasicHighlighter ++javax/swing/text/DefaultHighlighter ++javax/swing/text/LayeredHighlighter ++javax/swing/text/Highlighter ++javax/swing/text/Highlighter$Highlight ++javax/swing/text/DefaultHighlighter$DefaultHighlightPainter ++javax/swing/text/LayeredHighlighter$LayerPainter ++javax/swing/text/Highlighter$HighlightPainter ++javax/swing/text/DefaultHighlighter$SafeDamager ++javax/swing/text/FieldView ++javax/swing/text/PlainView ++javax/swing/text/JTextComponent$DefaultKeymap ++javax/swing/text/Keymap ++javax/swing/text/JTextComponent$KeymapWrapper ++javax/swing/text/JTextComponent$KeymapActionMap ++javax/swing/plaf/basic/BasicTextUI$FocusAction ++javax/swing/plaf/basic/BasicTextUI$TextActionWrapper ++javax/swing/JTextArea ++javax/swing/JEditorPane ++javax/swing/JTextField$ScrollRepainter ++javax/swing/plaf/metal/MetalComboBoxEditor$1 ++javax/swing/plaf/metal/MetalComboBoxEditor$EditorBorder ++javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener ++javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler ++javax/swing/plaf/basic/BasicComboBoxUI$Handler ++javax/swing/plaf/metal/MetalComboBoxButton ++javax/swing/plaf/metal/MetalComboBoxIcon ++javax/swing/plaf/metal/MetalComboBoxButton$1 ++javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager ++javax/swing/JComboBox$KeySelectionManager ++javax/swing/JToolBar$DefaultToolBarLayout ++javax/swing/plaf/metal/MetalToolBarUI ++javax/swing/plaf/basic/BasicToolBarUI ++javax/swing/plaf/ToolBarUI ++javax/swing/plaf/metal/MetalBorders$ToolBarBorder ++javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue$1 ++javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder ++javax/swing/plaf/metal/MetalBorders$RolloverMarginBorder ++javax/swing/plaf/basic/BasicBorders$RadioButtonBorder ++javax/swing/plaf/basic/BasicBorders$ButtonBorder ++javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder ++javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener ++javax/swing/plaf/basic/BasicToolBarUI$DockingListener ++javax/swing/plaf/basic/BasicToolBarUI$Handler ++javax/swing/border/EtchedBorder ++javax/swing/JToolBar$Separator ++javax/swing/plaf/basic/BasicToolBarSeparatorUI ++sun/awt/color/CMM ++java/applet/Applet ++java/awt/Panel ++com/sun/awt/AWTUtilities ++javax/swing/KeyboardManager$ComponentKeyStrokePair ++sun/awt/EmbeddedFrame ++sun/awt/im/InputMethodContext ++java/awt/im/spi/InputMethodContext ++sun/awt/im/InputContext ++sun/awt/im/InputMethodManager ++sun/awt/im/ExecutableInputMethodManager ++sun/awt/X11/XInputMethodDescriptor ++sun/awt/X11InputMethodDescriptor ++java/awt/im/spi/InputMethodDescriptor ++sun/awt/im/InputMethodLocator ++sun/awt/im/ExecutableInputMethodManager$2 ++sun/misc/Service ++sun/misc/Service$LazyIterator ++java/util/TreeSet ++java/util/NavigableSet ++java/util/SortedSet ++javax/swing/SizeRequirements ++javax/swing/plaf/basic/BasicGraphicsUtils ++java/awt/event/AdjustmentEvent ++java/awt/MenuBar ++sun/awt/X11/XComponentPeer$2 ++java/awt/SequencedEvent ++java/beans/PropertyVetoException ++java/awt/DefaultKeyboardFocusManager$TypeAheadMarker ++java/awt/KeyboardFocusManager$HeavyweightFocusRequest ++java/awt/KeyboardFocusManager$LightweightFocusRequest ++sun/awt/KeyboardFocusManagerPeerImpl ++sun/awt/SunToolkit$7 ++java/awt/Window$1DisposeAction ++java/awt/LightweightDispatcher$2 ++sun/awt/X11/XReparentEvent ++sun/awt/X11/XWindowAttributes ++javax/swing/SystemEventQueueUtilities$ComponentWorkRequest ++sun/awt/X11/XFocusChangeEvent ++sun/awt/X11/XComponentPeer$1 ++sun/awt/X11/XUnmapEvent ++java/io/StringWriter ++javax/swing/JWindow ++java/io/UnsupportedEncodingException ++java/net/UnknownHostException ++java/nio/channels/SocketChannel ++java/nio/channels/spi/AbstractSelectableChannel ++java/nio/channels/SelectableChannel ++java/net/SocketImplFactory ++javax/swing/UnsupportedLookAndFeelException ++java/lang/UnsatisfiedLinkError ++javax/swing/Box$Filler ++javax/swing/JComponent$2 ++sun/net/www/MimeTable ++java/net/FileNameMap ++sun/net/www/MimeTable$1 ++sun/net/www/MimeTable$2 ++sun/net/www/MimeEntry ++java/net/URLConnection$1 ++java/text/SimpleDateFormat ++java/text/DateFormat ++java/text/DateFormat$Field ++java/util/Calendar ++java/util/GregorianCalendar ++sun/util/resources/CalendarData ++sun/util/resources/CalendarData_en ++java/text/DateFormatSymbols ++java/text/spi/DateFormatSymbolsProvider ++java/text/DontCareFieldPosition ++java/text/DontCareFieldPosition$1 ++java/text/Format$FieldDelegate ++javax/swing/plaf/BorderUIResource ++javax/swing/BorderFactory ++javax/swing/border/BevelBorder ++javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon ++javax/swing/plaf/metal/MetalIconFactory$FolderIcon16 ++java/util/zip/ZipInputStream ++java/io/PushbackInputStream ++java/util/zip/CRC32 ++java/util/zip/Checksum ++java/lang/Thread$State ++javax/swing/SwingUtilities$SharedOwnerFrame ++javax/swing/JTable ++javax/swing/event/TableModelListener ++javax/swing/event/TableColumnModelListener ++javax/swing/event/CellEditorListener ++javax/swing/event/RowSorterListener ++javax/swing/BufferStrategyPaintManager$BufferInfo ++java/awt/Component$BltSubRegionBufferStrategy ++sun/awt/SubRegionShowable ++java/awt/Component$BltBufferStrategy ++sun/awt/image/SunVolatileImage ++sun/awt/image/BufferedImageGraphicsConfig ++sun/print/PrinterGraphicsConfig ++sun/java2d/x11/X11VolatileSurfaceManager ++sun/awt/image/VolatileSurfaceManager ++java/awt/print/PrinterGraphics ++java/awt/PrintGraphics ++java/awt/GraphicsCallback$PaintCallback ++java/awt/GraphicsCallback ++sun/awt/SunGraphicsCallback ++javax/swing/JRadioButton ++java/lang/ClassFormatError ++javax/swing/JTabbedPane ++javax/swing/JTabbedPane$ModelListener ++javax/swing/plaf/metal/MetalTabbedPaneUI ++javax/swing/plaf/basic/BasicTabbedPaneUI ++javax/swing/plaf/TabbedPaneUI ++javax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout ++javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout ++javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneScrollLayout ++javax/swing/plaf/basic/BasicTabbedPaneUI$Handler ++sun/swing/ImageIconUIResource ++javax/swing/GrayFilter ++java/awt/image/RGBImageFilter ++java/awt/image/ImageFilter ++java/awt/image/FilteredImageSource ++org/w3c/dom/Node ++org/xml/sax/SAXException ++javax/xml/parsers/ParserConfigurationException ++org/xml/sax/EntityResolver ++java/security/NoSuchAlgorithmException ++java/security/GeneralSecurityException ++java/util/zip/GZIPInputStream ++java/util/zip/DeflaterOutputStream ++org/xml/sax/InputSource ++javax/xml/parsers/DocumentBuilderFactory ++javax/xml/parsers/FactoryFinder ++javax/xml/parsers/SecuritySupport ++javax/xml/parsers/SecuritySupport$2 ++javax/xml/parsers/SecuritySupport$5 ++javax/xml/parsers/SecuritySupport$1 ++javax/xml/parsers/SecuritySupport$4 ++javax/xml/parsers/DocumentBuilder ++org/w3c/dom/Document ++org/xml/sax/helpers/DefaultHandler ++org/xml/sax/DTDHandler ++org/xml/sax/ContentHandler ++org/xml/sax/ErrorHandler ++org/xml/sax/SAXNotSupportedException ++org/xml/sax/Locator ++org/xml/sax/SAXNotRecognizedException ++org/xml/sax/SAXParseException ++org/w3c/dom/NodeList ++org/w3c/dom/events/EventTarget ++org/w3c/dom/traversal/DocumentTraversal ++org/w3c/dom/events/DocumentEvent ++org/w3c/dom/ranges/DocumentRange ++org/w3c/dom/Entity ++org/w3c/dom/Element ++org/w3c/dom/CharacterData ++org/w3c/dom/CDATASection ++org/w3c/dom/Text ++org/xml/sax/AttributeList ++org/w3c/dom/DOMException ++org/w3c/dom/Notation ++org/w3c/dom/DocumentType ++org/w3c/dom/Attr ++org/w3c/dom/EntityReference ++org/w3c/dom/ProcessingInstruction ++org/w3c/dom/Comment ++org/w3c/dom/DocumentFragment ++org/w3c/dom/events/Event ++org/w3c/dom/events/MutationEvent ++org/w3c/dom/traversal/TreeWalker ++org/w3c/dom/ranges/Range ++org/w3c/dom/traversal/NodeIterator ++org/w3c/dom/events/EventException ++org/w3c/dom/NamedNodeMap ++java/lang/StringIndexOutOfBoundsException ++java/awt/GridLayout ++javax/swing/plaf/metal/MetalRadioButtonUI ++javax/swing/plaf/basic/BasicRadioButtonUI ++javax/swing/plaf/basic/BasicBorders ++javax/swing/plaf/metal/MetalIconFactory$RadioButtonIcon ++java/awt/event/ItemEvent ++java/awt/CardLayout$Card ++javax/swing/JCheckBox ++javax/swing/event/ListSelectionEvent ++javax/swing/plaf/metal/MetalCheckBoxUI ++javax/swing/plaf/metal/MetalIconFactory$CheckBoxIcon ++java/lang/ExceptionInInitializerError ++com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI ++javax/swing/JProgressBar ++javax/swing/JProgressBar$ModelListener ++javax/swing/plaf/metal/MetalProgressBarUI ++javax/swing/plaf/basic/BasicProgressBarUI ++javax/swing/plaf/ProgressBarUI ++javax/swing/plaf/BorderUIResource$LineBorderUIResource ++javax/swing/plaf/basic/BasicProgressBarUI$Handler ++javax/swing/tree/TreeModel ++javax/swing/table/TableCellRenderer ++javax/swing/table/JTableHeader ++javax/swing/event/TreeExpansionListener ++javax/swing/table/AbstractTableModel ++javax/swing/table/TableModel ++javax/swing/table/DefaultTableCellRenderer ++javax/swing/JTree ++javax/swing/tree/TreeSelectionModel ++javax/swing/tree/DefaultTreeCellRenderer ++javax/swing/tree/TreeCellRenderer ++javax/swing/table/TableCellEditor ++javax/swing/CellEditor ++javax/swing/JToolTip ++javax/swing/table/TableColumn ++javax/swing/table/DefaultTableColumnModel ++javax/swing/table/TableColumnModel ++javax/swing/table/DefaultTableModel ++javax/swing/event/TableModelEvent ++sun/swing/table/DefaultTableCellHeaderRenderer ++javax/swing/plaf/basic/BasicTableHeaderUI ++javax/swing/plaf/TableHeaderUI ++javax/swing/plaf/basic/BasicTableHeaderUI$1 ++javax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler ++javax/swing/DefaultCellEditor ++javax/swing/tree/TreeCellEditor ++javax/swing/AbstractCellEditor ++javax/swing/plaf/basic/BasicTableUI ++javax/swing/plaf/TableUI ++javax/swing/plaf/basic/BasicTableUI$TableTransferHandler ++javax/swing/plaf/basic/BasicTableUI$Handler ++javax/swing/tree/DefaultTreeSelectionModel ++javax/swing/tree/TreePath ++javax/swing/plaf/metal/MetalTreeUI ++javax/swing/plaf/basic/BasicTreeUI ++javax/swing/plaf/TreeUI ++javax/swing/plaf/basic/BasicTreeUI$Actions ++javax/swing/plaf/basic/BasicTreeUI$TreeTransferHandler ++javax/swing/plaf/metal/MetalTreeUI$LineListener ++javax/swing/plaf/basic/BasicTreeUI$Handler ++javax/swing/event/TreeModelListener ++javax/swing/event/TreeSelectionListener ++javax/swing/event/SwingPropertyChangeSupport ++javax/swing/tree/VariableHeightLayoutCache ++javax/swing/tree/AbstractLayoutCache ++javax/swing/tree/RowMapper ++javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler ++javax/swing/tree/AbstractLayoutCache$NodeDimensions ++javax/swing/JTree$TreeModelHandler ++javax/swing/tree/VariableHeightLayoutCache$TreeStateNode ++javax/swing/tree/DefaultMutableTreeNode ++javax/swing/tree/MutableTreeNode ++javax/swing/tree/DefaultMutableTreeNode$1 ++javax/swing/tree/DefaultMutableTreeNode$PreorderEnumeration ++javax/swing/event/TableColumnModelEvent ++java/text/ParseException ++java/text/NumberFormat$Field ++javax/swing/event/UndoableEditListener ++javax/swing/filechooser/FileFilter ++javax/swing/tree/DefaultTreeModel ++javax/swing/tree/DefaultTreeCellEditor ++javax/swing/tree/DefaultTreeCellEditor$1 ++javax/swing/tree/DefaultTreeCellEditor$DefaultTextField ++javax/swing/DefaultCellEditor$1 ++javax/swing/DefaultCellEditor$EditorDelegate ++javax/swing/tree/DefaultTreeCellEditor$EditorContainer ++javax/swing/JTree$TreeSelectionRedirector ++javax/swing/event/TreeModelEvent ++javax/swing/plaf/metal/MetalSplitPaneUI ++javax/swing/plaf/basic/BasicSplitPaneUI ++javax/swing/plaf/SplitPaneUI ++javax/swing/plaf/basic/BasicSplitPaneDivider ++javax/swing/plaf/basic/BasicBorders$SplitPaneBorder ++javax/swing/plaf/metal/MetalSplitPaneDivider ++javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout ++javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler ++javax/swing/plaf/basic/BasicBorders$SplitPaneDividerBorder ++javax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager ++javax/swing/plaf/basic/BasicSplitPaneUI$1 ++javax/swing/plaf/basic/BasicSplitPaneUI$Handler ++javax/swing/plaf/metal/MetalSplitPaneDivider$1 ++javax/swing/plaf/basic/BasicSplitPaneDivider$OneTouchActionHandler ++javax/swing/plaf/metal/MetalSplitPaneDivider$2 ++javax/swing/border/TitledBorder ++javax/swing/plaf/basic/BasicTextAreaUI ++java/util/Collections$UnmodifiableCollection$1 ++java/io/InterruptedIOException ++java/net/NoRouteToHostException ++java/net/BindException ++javax/swing/tree/PathPlaceHolder ++javax/swing/event/TreeSelectionEvent ++javax/swing/JList$3 ++javax/swing/JList$ListSelectionHandler ++javax/swing/JSlider ++javax/swing/JSlider$ModelListener ++javax/swing/plaf/metal/MetalSliderUI ++javax/swing/plaf/basic/BasicSliderUI ++javax/swing/plaf/SliderUI ++javax/swing/plaf/basic/BasicSliderUI$Actions ++javax/swing/plaf/metal/MetalIconFactory$HorizontalSliderThumbIcon ++javax/swing/plaf/metal/MetalIconFactory$VerticalSliderThumbIcon ++javax/swing/plaf/basic/BasicSliderUI$TrackListener ++javax/swing/plaf/basic/BasicSliderUI$Handler ++javax/swing/plaf/basic/BasicSliderUI$ScrollListener ++javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener ++javax/swing/plaf/basic/BasicSliderUI$PropertyChangeHandler ++sun/java2d/HeadlessGraphicsEnvironment ++java/util/Hashtable$KeySet ++java/awt/FontFormatException ++sun/java2d/SunGraphicsEnvironment$2 ++sun/font/Type1Font$1 ++java/nio/channels/FileChannel$MapMode ++sun/nio/ch/FileChannelImpl$Unmapper ++sun/nio/ch/Util$3 ++java/nio/DirectByteBufferR ++java/nio/charset/Charset$3 ++sun/nio/cs/ext/ExtendedCharsets ++sun/nio/cs/AbstractCharsetProvider ++sun/nio/cs/ext/SJIS ++sun/nio/cs/ext/SJIS$Decoder ++sun/nio/cs/ext/DelegatableDecoder ++sun/nio/cs/ext/JIS_X_0208_Decoder ++sun/nio/cs/ext/DoubleByteDecoder ++sun/nio/cs/ext/JIS_X_0201$Decoder ++sun/nio/cs/SingleByteDecoder ++java/lang/CharacterData00 ++javax/swing/DefaultListModel ++javax/swing/event/ListDataEvent ++javax/sound/sampled/DataLine ++javax/sound/sampled/Line ++javax/sound/sampled/Line$Info ++javax/sound/sampled/DataLine$Info ++javax/sound/sampled/Control$Type ++javax/sound/sampled/FloatControl$Type ++javax/sound/sampled/LineUnavailableException ++javax/sound/sampled/UnsupportedAudioFileException ++javax/swing/JRadioButtonMenuItem ++javax/swing/JMenuItem$AccessibleJMenuItem ++javax/swing/AbstractButton$AccessibleAbstractButton ++javax/accessibility/AccessibleAction ++javax/accessibility/AccessibleValue ++javax/accessibility/AccessibleText ++javax/accessibility/AccessibleExtendedComponent ++javax/accessibility/AccessibleComponent ++javax/swing/JComponent$AccessibleJComponent ++java/awt/Container$AccessibleAWTContainer ++java/awt/Component$AccessibleAWTComponent ++javax/accessibility/AccessibleRelationSet ++javax/accessibility/AccessibleState ++javax/accessibility/AccessibleBundle ++javax/swing/plaf/basic/BasicCheckBoxMenuItemUI ++javax/swing/plaf/metal/MetalIconFactory$CheckBoxMenuItemIcon ++javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem ++javax/swing/plaf/basic/BasicRadioButtonMenuItemUI ++javax/swing/plaf/metal/MetalIconFactory$RadioButtonMenuItemIcon ++sun/awt/image/ImageDecoder$1 ++javax/swing/JTabbedPane$Page ++java/net/DatagramSocket ++java/net/MulticastSocket ++java/net/DatagramPacket ++sun/net/InetAddressCachePolicy ++sun/net/InetAddressCachePolicy$1 ++sun/net/InetAddressCachePolicy$2 ++java/net/InetAddress$CacheEntry ++java/net/PlainDatagramSocketImpl ++java/net/DatagramSocketImpl ++java/net/NetworkInterface ++java/net/InterfaceAddress ++java/text/Collator ++java/text/spi/CollatorProvider ++sun/text/resources/CollationData ++sun/text/resources/CollationData_en ++sun/util/EmptyListResourceBundle ++java/text/RuleBasedCollator ++java/text/CollationRules ++java/text/RBCollationTables ++java/text/RBTableBuilder ++java/text/RBCollationTables$BuildAPI ++sun/text/IntHashtable ++sun/text/UCompactIntArray ++sun/text/normalizer/NormalizerImpl ++sun/text/normalizer/ICUData ++sun/text/normalizer/NormalizerDataReader ++sun/text/normalizer/ICUBinary$Authenticate ++sun/text/normalizer/ICUBinary ++sun/text/normalizer/NormalizerImpl$FCDTrieImpl ++sun/text/normalizer/Trie$DataManipulate ++sun/text/normalizer/NormalizerImpl$NormTrieImpl ++sun/text/normalizer/NormalizerImpl$AuxTrieImpl ++sun/text/normalizer/IntTrie ++sun/text/normalizer/Trie ++sun/text/normalizer/CharTrie ++sun/text/normalizer/CharTrie$FriendAgent ++sun/text/normalizer/UnicodeSet ++sun/text/normalizer/UnicodeMatcher ++sun/text/normalizer/NormalizerImpl$DecomposeArgs ++java/text/MergeCollation ++java/text/PatternEntry$Parser ++java/text/PatternEntry ++java/text/EntryPair ++sun/text/ComposedCharIter ++sun/text/normalizer/UTF16 ++sun/net/www/protocol/http/Handler ++java/io/ObjectInputStream$BlockDataInputStream ++java/io/ObjectInputStream$PeekInputStream ++java/io/ObjectInputStream$HandleTable ++java/io/ObjectInputStream$ValidationList ++java/io/Bits ++java/io/ObjectStreamClass$Caches ++java/io/ObjectStreamClass$WeakClassKey ++java/io/ObjectStreamClass$EntryFuture ++java/io/ObjectStreamClass$2 ++sun/reflect/SerializationConstructorAccessorImpl ++java/io/ObjectStreamClass$FieldReflectorKey ++java/io/ObjectStreamClass$FieldReflector ++java/io/ObjectStreamClass$1 ++java/io/DataOutputStream ++java/io/ObjectStreamClass$MemberSignature ++java/io/ObjectStreamClass$3 ++java/io/ObjectStreamClass$4 ++java/io/ObjectStreamClass$5 ++java/security/MessageDigest ++java/security/MessageDigestSpi ++sun/security/jca/GetInstance ++sun/security/jca/Providers ++sun/security/jca/ProviderList ++sun/security/jca/ProviderConfig ++sun/security/jca/ProviderList$3 ++sun/security/jca/ProviderList$1 ++sun/security/jca/ProviderList$2 ++sun/security/jca/ProviderConfig$1 ++sun/security/jca/ProviderConfig$3 ++java/security/Provider$Service ++java/security/Provider$UString ++sun/security/provider/SHA ++sun/security/provider/DigestBase ++sun/security/jca/GetInstance$Instance ++java/security/MessageDigest$Delegate ++sun/security/provider/ByteArrayAccess ++java/io/ObjectStreamClass$ClassDataSlot ++java/io/ObjectInputStream$CallbackContext ++sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl ++java/security/SignatureException ++java/security/InvalidKeyException ++java/security/KeyException ++java/security/Signature ++java/security/SignatureSpi ++java/io/ObjectOutputStream$BlockDataOutputStream ++sun/security/provider/DSAPublicKey ++java/security/interfaces/DSAPublicKey ++java/security/interfaces/DSAKey ++java/security/PublicKey ++java/security/Key ++sun/security/x509/X509Key ++java/io/ObjectOutputStream$HandleTable ++java/io/ObjectOutputStream$ReplaceTable ++sun/security/x509/AlgorithmId ++sun/security/util/DerEncoder ++sun/security/util/BitArray ++sun/security/util/DerOutputStream ++sun/security/util/DerValue ++java/math/BigInteger ++java/security/interfaces/DSAParams ++sun/security/util/DerInputStream ++sun/security/util/DerInputBuffer ++sun/security/util/ObjectIdentifier ++java/security/AlgorithmParameters ++java/security/AlgorithmParametersSpi ++sun/security/provider/DSAParameters ++sun/security/util/ByteArrayLexOrder ++sun/security/util/ByteArrayTagOrder ++sun/security/util/DerIndefLenConverter ++java/io/InvalidClassException ++java/io/ObjectStreamException ++java/io/ObjectInputStream$GetFieldImpl ++java/io/ObjectInputStream$GetField ++sun/security/jca/ServiceId ++sun/security/jca/ProviderList$ServiceList ++sun/security/jca/ProviderList$ServiceList$1 ++java/security/Signature$Delegate ++java/security/interfaces/DSAPrivateKey ++java/security/PrivateKey ++sun/security/provider/DSA$SHA1withDSA ++sun/security/provider/DSA ++java/security/spec/DSAParameterSpec ++java/security/spec/AlgorithmParameterSpec ++java/math/MutableBigInteger ++java/math/SignedMutableBigInteger ++java/awt/EventQueue$1AWTInvocationLock ++javax/swing/SystemEventQueueUtilities$RunnableCanvas ++javax/swing/SystemEventQueueUtilities$RunnableCanvasGraphics ++java/awt/Component$FlipBufferStrategy ++java/awt/SentEvent ++sun/awt/X11/XDestroyWindowEvent ++sun/awt/X11/XDropTargetRegistry ++sun/awt/X11/XEmbeddedFramePeer ++sun/awt/X11/XDragAndDropProtocols ++sun/awt/X11/XDropTargetContextPeer ++sun/awt/dnd/SunDropTargetContextPeer ++java/awt/dnd/peer/DropTargetContextPeer ++sun/awt/X11/XDropTargetContextPeer$XDropTargetProtocolListenerImpl ++sun/awt/X11/XDropTargetProtocolListener ++sun/awt/X11/XDnDDragSourceProtocol ++sun/awt/X11/XDragSourceProtocol ++sun/awt/X11/MotifDnDDragSourceProtocol ++sun/awt/X11/XDnDDropTargetProtocol ++sun/awt/X11/XDropTargetProtocol ++sun/awt/X11/MotifDnDDropTargetProtocol ++sun/awt/X11/XDnDConstants ++sun/awt/X11/MotifDnDConstants ++javax/swing/JTable$2 ++javax/swing/JTable$Resizable3 ++javax/swing/JTable$Resizable2 ++javax/swing/JTable$5 ++javax/swing/event/AncestorEvent ++sun/font/FontDesignMetrics$MetricsKey ++java/awt/geom/Line2D$Float ++java/awt/geom/Line2D ++com/sun/java/swing/plaf/gtk/GTKLookAndFeel ++javax/swing/plaf/synth/SynthLookAndFeel ++javax/swing/plaf/synth/DefaultSynthStyleFactory ++javax/swing/plaf/synth/SynthStyleFactory ++sun/swing/BakedArrayList ++javax/swing/plaf/synth/SynthLookAndFeel$Handler ++javax/swing/plaf/synth/SynthDefaultLookup ++com/sun/java/swing/plaf/gtk/GTKEngine ++com/sun/java/swing/plaf/gtk/GTKDefaultEngine ++com/sun/java/swing/plaf/gtk/GTKEngine$Settings ++com/sun/java/swing/plaf/gtk/GTKStyleFactory ++com/sun/java/swing/plaf/gtk/PangoFonts ++sun/font/FontManager$FontConfigInfo ++com/sun/java/swing/plaf/gtk/GTKLookAndFeel$WeakPCL ++javax/swing/plaf/synth/Region ++javax/swing/plaf/synth/SynthLookAndFeel$AATextListener ++com/sun/java/swing/plaf/gtk/GTKNativeEngine ++com/sun/java/swing/plaf/gtk/GTKNativeEngine$WidgetType ++com/sun/java/swing/plaf/gtk/GTKRegion ++com/sun/java/swing/plaf/gtk/GTKDefaultStyle ++com/sun/java/swing/plaf/gtk/GTKStyle ++com/sun/java/swing/plaf/gtk/GTKConstants ++javax/swing/plaf/synth/SynthStyle ++javax/swing/plaf/synth/SynthGraphicsUtils ++com/sun/java/swing/plaf/gtk/GTKGraphicsUtils ++com/sun/java/swing/plaf/gtk/GTKStyle$GTKStockIcon ++sun/swing/plaf/synth/SynthIcon ++com/sun/java/swing/plaf/gtk/GTKColorType ++javax/swing/plaf/synth/ColorType ++com/sun/java/swing/plaf/gtk/resources/gtk ++com/sun/swing/internal/plaf/synth/resources/synth ++com/sun/java/swing/plaf/gtk/GTKStyle$GTKLazyValue ++com/sun/java/swing/plaf/gtk/GTKLookAndFeel$1FontLazyValue ++com/sun/java/swing/plaf/gtk/GTKLookAndFeel$2 ++com/sun/java/swing/plaf/gtk/GTKLookAndFeel$3 ++javax/swing/plaf/synth/SynthPanelUI ++javax/swing/plaf/synth/SynthConstants ++javax/swing/plaf/synth/SynthContext ++javax/swing/plaf/synth/SynthBorder ++javax/swing/plaf/synth/SynthRootPaneUI ++javax/swing/plaf/synth/SynthLabelUI ++javax/swing/plaf/synth/SynthButtonUI ++javax/swing/plaf/synth/SynthToggleButtonUI ++javax/swing/plaf/basic/BasicBorders$FieldBorder ++javax/swing/plaf/synth/SynthMenuBarUI ++javax/swing/plaf/synth/DefaultMenuLayout ++javax/swing/plaf/synth/SynthMenuUI ++javax/swing/plaf/synth/SynthUI ++com/sun/java/swing/plaf/gtk/GTKIconFactory ++com/sun/java/swing/plaf/gtk/GTKIconFactory$MenuArrowIcon ++com/sun/java/swing/plaf/gtk/GTKIconFactory$DelegatingIcon ++com/sun/java/swing/plaf/gtk/GTKConstants$ArrowType ++javax/swing/plaf/basic/BasicIconFactory ++javax/swing/plaf/basic/BasicIconFactory$MenuItemCheckIcon ++javax/swing/plaf/synth/SynthMenuItemUI ++javax/swing/plaf/synth/SynthPopupMenuUI ++javax/swing/plaf/synth/SynthSeparatorUI ++javax/swing/plaf/synth/SynthScrollBarUI ++javax/swing/plaf/synth/SynthArrowButton ++javax/swing/plaf/synth/SynthArrowButton$SynthArrowButtonUI ++javax/swing/plaf/synth/SynthComboBoxUI ++javax/swing/plaf/synth/SynthComboPopup ++javax/swing/plaf/synth/SynthListUI ++javax/swing/plaf/synth/SynthListUI$SynthListCellRenderer ++javax/swing/plaf/synth/SynthViewportUI ++javax/swing/plaf/synth/SynthScrollPaneUI ++javax/swing/plaf/synth/SynthScrollPaneUI$ViewportBorder ++javax/swing/plaf/synth/SynthComboBoxUI$SynthComboBoxRenderer ++javax/swing/plaf/synth/SynthComboBoxUI$SynthComboBoxEditor ++javax/swing/plaf/synth/SynthTextFieldUI ++javax/swing/plaf/synth/SynthToolBarUI ++javax/swing/plaf/synth/SynthToolBarUI$SynthToolBarLayoutManager ++com/sun/java/swing/plaf/gtk/GTKIconFactory$ToolBarHandleIcon ++com/sun/java/swing/plaf/gtk/GTKConstants$Orientation ++sun/awt/X11/XTranslateCoordinates ++com/sun/java/swing/plaf/gtk/GTKPainter ++javax/swing/plaf/synth/SynthPainter ++javax/swing/plaf/synth/SynthPainter$1 ++com/sun/java/swing/plaf/gtk/GTKConstants$PositionType ++com/sun/java/swing/plaf/gtk/GTKConstants$ShadowType ++java/io/ObjectInputStream$HandleTable$HandleList ++sun/java2d/pipe/ShapeSpanIterator ++sun/java2d/pipe/SpanIterator ++sun/dc/path/PathConsumer ++sun/dc/pr/PathStroker ++sun/dc/pr/PathDasher ++java/awt/geom/LineIterator ++java/awt/geom/PathIterator ++sun/applet/Main ++sun/applet/AppletMessageHandler ++sun/applet/resources/MsgAppletViewer ++sun/applet/AppletSecurity ++sun/awt/AWTSecurityManager ++java/lang/SecurityManager ++java/security/DomainCombiner ++sun/applet/AppletSecurity$1 ++java/lang/SecurityManager$1 ++java/security/SecurityPermission ++java/util/PropertyPermission ++sun/applet/AppletViewer ++java/applet/AppletContext ++java/awt/print/Printable ++sun/security/util/SecurityConstants ++java/awt/AWTPermission ++java/net/NetPermission ++java/net/SocketPermission ++javax/security/auth/AuthPermission ++java/lang/Thread$1 ++java/util/logging/LogManager$5 ++java/util/logging/LogManager$6 ++sun/applet/StdAppletViewerFactory ++sun/applet/AppletViewerFactory ++sun/applet/AppletViewer$UserActionListener ++sun/applet/AppletViewerPanel ++sun/applet/AppletPanel ++java/applet/AppletStub ++sun/misc/MessageUtils ++sun/applet/AppletPanel$10 ++java/security/Policy$1 ++sun/security/provider/PolicyFile$1 ++sun/security/provider/PolicyInfo ++sun/security/provider/PolicyFile$3 ++sun/security/util/PropertyExpander ++sun/security/provider/PolicyParser ++sun/security/util/PolicyUtil ++sun/security/provider/PolicyParser$GrantEntry ++sun/security/provider/PolicyParser$PermissionEntry ++sun/security/provider/PolicyFile$PolicyEntry ++sun/security/provider/PolicyFile$6 ++sun/security/provider/PolicyFile$7 ++sun/security/provider/SelfPermission ++java/net/SocketPermissionCollection ++java/util/PropertyPermissionCollection ++sun/applet/AppletPanel$9 ++sun/applet/AppletClassLoader ++sun/applet/AppletClassLoader$4 ++sun/applet/AppletThreadGroup ++sun/applet/AppContextCreator ++sun/applet/AppletPanel$1 ++sun/awt/X11/XMenuBarPeer ++java/awt/peer/MenuBarPeer ++java/awt/peer/MenuComponentPeer ++sun/awt/X11/XBaseMenuWindow ++sun/awt/X11/XMenuPeer ++java/awt/peer/MenuPeer ++java/awt/peer/MenuItemPeer ++sun/awt/X11/XMenuItemPeer ++java/awt/MenuShortcut ++sun/awt/X11/XMenuWindow ++sun/awt/X11/XMenuBarPeer$1 ++sun/awt/X11/XMenuItemPeer$TextMetrics ++sun/awt/AppContext$3 ++sun/awt/MostRecentThreadAppContext ++sun/awt/X11/XMenuBarPeer$MappingData ++sun/awt/X11/XBaseMenuWindow$MappingData ++sun/applet/AppletViewer$1 ++sun/applet/AppletViewer$1AppletEventListener ++sun/applet/AppletListener ++sun/applet/AppletEventMulticaster ++sun/misc/Queue ++sun/misc/QueueElement ++sun/applet/AppletEvent ++sun/applet/AppletClassLoader$1 ++sun/awt/X11/XBaseMenuWindow$3 ++java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent ++sun/awt/CausedFocusEvent ++sun/awt/X11/XWindow$1 ++java/net/URLClassLoader$4 ++sun/applet/AppletClassLoader$2 ++javax/swing/JApplet ++java/lang/ClassLoader$1 ++sun/security/provider/PolicyFile$5 ++java/security/PermissionsEnumerator ++java/util/Collections$1 ++sun/applet/AppletPanel$11 ++sun/applet/AppletPanel$8 ++sun/applet/AppletPanel$2 ++sun/applet/AppletPanel$3 ++sun/applet/AppletPanel$6 ++javax/swing/BufferStrategyPaintManager$1 ++# f3ac8b467e7f8c49 +--- ./jdk/make/gendata/GendataFontConfig.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/gendata/GendataFontConfig.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -66,6 +66,13 @@ + GENDATA_FONT_CONFIG_SRC_PREFIX := macosx. + endif + ++ifeq ($(OPENJDK_TARGET_OS), aix) ++ GENDATA_FONT_CONFIG_SRC_DIR := \ ++ $(JDK_TOPDIR)/src/aix/classes/sun/awt/fontconfigs ++ GENDATA_FONT_CONFIG_SRC_FILES := fontconfig.properties ++ GENDATA_FONT_CONFIG_SRC_PREFIX := aix. ++endif ++ + ### + + $(GENDATA_FONT_CONFIG_DST)/%.src: \ +--- ./jdk/make/gensrc/GensrcX11Wrappers.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/gensrc/GensrcX11Wrappers.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -88,7 +88,7 @@ + + # use -m32/-m64 only if the compiler supports it + ifeq ($(COMPILER_SUPPORTS_TARGET_BITS_FLAG), true) +- MEMORY_MODEL_FLAG = "-m$*" ++ MEMORY_MODEL_FLAG="$(COMPILER_TARGET_BITS_FLAG)$*" + endif + + # Compile the C code into an executable. +--- ./jdk/make/lib/Awt2dLibraries.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/lib/Awt2dLibraries.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -231,6 +231,10 @@ + $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/java2d/x11 + endif + ++ifeq ($(OPENJDK_TARGET_OS), aix) ++ LIBAWT_DIRS += $(JDK_TOPDIR)/src/aix/porting ++endif ++ + LIBAWT_CFLAGS += -D__MEDIALIB_OLD_NAMES -D__USE_J2D_NAMES \ + $(X_CFLAGS) \ + $(foreach dir, $(LIBAWT_DIRS), -I$(dir)) +@@ -305,10 +309,14 @@ + debug_trace.c \ + debug_util.c + +-ifneq (, $(filter $(OPENJDK_TARGET_OS), solaris linux)) ++ifneq (, $(filter $(OPENJDK_TARGET_OS), solaris linux aix)) + LIBAWT_FILES += awt_LoadLibrary.c initIDs.c img_colors.c + endif + ++ifeq ($(OPENJDK_TARGET_OS), aix) ++ LIBAWT_FILES += porting_aix.c ++endif ++ + ifeq ($(OPENJDK_TARGET_OS), macosx) + LIBAWT_FILES += awt_LoadLibrary.c img_colors.c + LIBAWT_CFLAGS += -F/System/Library/Frameworks/JavaVM.framework/Frameworks +@@ -473,6 +481,7 @@ + LDFLAGS_solaris := -R/usr/dt/lib$(OPENJDK_TARGET_CPU_ISADIR) -R$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR), \ + LDFLAGS_SUFFIX_linux := -ljvm $(LIBM) $(LIBDL) -ljava, \ + LDFLAGS_SUFFIX_solaris := -ljvm $(LIBM) $(LIBDL) -ljava -lc, \ ++ LDFLAGS_SUFFIX_aix :=-ljvm $(LIBM) $(LIBDL) -ljava -lm,\ + LDFLAGS_SUFFIX_macosx := -lmlib_image -ljvm $(LIBM) \ + -framework Cocoa \ + -framework OpenGL \ +@@ -681,6 +690,7 @@ + LDFLAGS_SUFFIX_solaris := -lawt -ljava -ljvm -lc, \ + LDFLAGS_SUFFIX_macosx := $(LIBM) -lawt -ljava -ljvm, \ + LDFLAGS_SUFFIX_linux := -lm -lawt -ljava -ljvm, \ ++ LDFLAGS_SUFFIX_aix := -lm -lawt -ljava -ljvm,\ + VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ + RC_FLAGS := $(RC_FLAGS) \ + -D "JDK_FNAME=lcms.dll" \ +@@ -819,6 +829,7 @@ + LDFLAGS_SUFFIX := $(BUILD_LIBFONTMANAGER_FONTLIB), \ + LDFLAGS_SUFFIX_linux := -lawt $(LIBM) $(LIBCXX) -ljava -ljvm -lc, \ + LDFLAGS_SUFFIX_solaris := -lawt -lawt_xawt -lc $(LIBM) $(LIBCXX) -ljava -ljvm, \ ++ LDFLAGS_SUFFIX_aix := -lawt -lawt_xawt $(LIBM) $(LIBCXX) -ljava -ljvm,\ + LDFLAGS_SUFFIX_macosx := -lawt $(LIBM) $(LIBCXX) -undefined dynamic_lookup \ + -ljava -ljvm, \ + LDFLAGS_SUFFIX_windows := $(WIN_JAVA_LIB) advapi32.lib user32.lib gdi32.lib \ +@@ -833,7 +844,7 @@ + + $(BUILD_LIBFONTMANAGER): $(BUILD_LIBAWT) + +-ifeq ($(OPENJDK_TARGET_OS), solaris) ++ifneq (, $(findstring $(OPENJDK_TARGET_OS), solaris aix)) + $(BUILD_LIBFONTMANAGER): $(BUILD_LIBAWT_XAWT) + endif + +@@ -968,6 +979,7 @@ + $(call SET_SHARED_LIBRARY_ORIGIN), \ + LDFLAGS_solaris := -L$(OPENWIN_HOME)/sfw/lib$(OPENJDK_TARGET_CPU_ISADIR) -L$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR), \ + LDFLAGS_SUFFIX_linux := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX), \ ++ LDFLAGS_SUFFIX_aix := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX),\ + LDFLAGS_SUFFIX_solaris := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX) -lXrender, \ + LDFLAGS_SUFFIX_macosx := -Xlinker -rpath -Xlinker @loader_path $(JAWT_LIBS) \ + -framework Cocoa $(LDFLAGS_JDKLIB_SUFFIX), \ +@@ -1168,6 +1180,7 @@ + LDFLAGS_macosx := $(call SET_SHARED_LIBRARY_ORIGIN)., \ + REORDER := $(LIBAWT_HEADLESS_REORDER), \ + LDFLAGS_SUFFIX_linux := -ljvm -lawt -lm $(LIBDL) -ljava, \ ++ LDFLAGS_SUFFIX_aix := -ljvm -lawt -ljava,\ + LDFLAGS_SUFFIX_solaris := $(LIBDL) -ljvm -lawt -lm -ljava $(LIBCXX) -lc, \ + OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libawt_headless, \ + DEBUG_SYMBOLS := $(DEBUG_ALL_BINARIES))) +@@ -1229,7 +1242,7 @@ + LIBSPLASHSCREEN_LDFLAGS_SUFFIX := + + ifneq ($(USE_EXTERNAL_LIBZ), true) +- LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 ++ LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.8 + LIBSPLASHSCREEN_CFLAGS += $(ZLIB_CPPFLAGS) + endif + +@@ -1303,6 +1316,7 @@ + LDFLAGS := $(LDFLAGS_JDKLIB) \ + $(call SET_SHARED_LIBRARY_ORIGIN), \ + LDFLAGS_SUFFIX := $(LIBM) $(LDFLAGS_JDKLIB_SUFFIX), \ ++ LDFLAGS_SUFFIX_windows := $(WIN_JAVA_LIB), \ + LDFLAGS_SUFFIX_posix := -lm, \ + VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ + RC_FLAGS := $(RC_FLAGS) \ +--- ./jdk/make/lib/CoreLibraries.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/lib/CoreLibraries.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -43,6 +43,7 @@ + CFLAGS := $(CFLAGS_JDKLIB) \ + -I$(JDK_TOPDIR)/src/share/native/java/lang/fdlibm/include, \ + CFLAGS_windows_debug := -DLOGGING, \ ++ CFLAGS_aix := -qfloat=nomaf, \ + ARFLAGS := $(ARFLAGS), \ + OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libfdlibm, \ + DEBUG_SYMBOLS := $(DEBUG_ALL_BINARIES))) +@@ -198,6 +199,7 @@ + LDFLAGS_SUFFIX_posix := -ljvm -lverify, \ + LDFLAGS_SUFFIX_solaris := -lsocket -lnsl -lscf $(LIBDL) $(BUILD_LIBFDLIBM) -lc, \ + LDFLAGS_SUFFIX_linux := $(LIBDL) $(BUILD_LIBFDLIBM), \ ++ LDFLAGS_SUFFIX_aix := $(LIBDL) $(BUILD_LIBFDLIBM) -lm,\ + LDFLAGS_SUFFIX_macosx := -L$(JDK_OUTPUTDIR)/objs/ -lfdlibm \ + -framework CoreFoundation \ + -framework Foundation \ +@@ -228,9 +230,9 @@ + BUILD_LIBZIP_EXCLUDES := + ifeq ($(USE_EXTERNAL_LIBZ), true) + LIBZ := -lz +- LIBZIP_EXCLUDES += zlib-1.2.5 ++ LIBZIP_EXCLUDES += zlib-1.2.8 + else +- ZLIB_CPPFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 ++ ZLIB_CPPFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.8 + endif + + BUILD_LIBZIP_REORDER := +@@ -266,6 +268,7 @@ + $(WIN_JAVA_LIB), \ + LDFLAGS_SUFFIX_linux := -ljvm -ljava $(LIBZ), \ + LDFLAGS_SUFFIX_solaris := -ljvm -ljava $(LIBZ) -lc, \ ++ LDFLAGS_SUFFIX_aix := -ljvm -ljava $(LIBZ),\ + LDFLAGS_SUFFIX_macosx := $(LIBZ) -ljava -ljvm, \ + VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ + RC_FLAGS := $(RC_FLAGS) \ +@@ -381,7 +384,7 @@ + endif + + ifneq ($(USE_EXTERNAL_LIBZ), true) +- BUILD_LIBJLI_SRC_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 ++ BUILD_LIBJLI_SRC_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.8 + LIBJLI_CFLAGS += $(ZLIB_CPPFLAGS) + BUILD_LIBJLI_FILES += \ + inflate.c \ +@@ -414,6 +417,7 @@ + LDFLAGS_macosx := -framework Cocoa -framework Security -framework ApplicationServices, \ + LDFLAGS_SUFFIX_solaris := $(LIBZ) $(LIBDL) -lc, \ + LDFLAGS_SUFFIX_linux := $(LIBZ) $(LIBDL) -lc -lpthread, \ ++ LDFLAGS_SUFFIX_aix := $(LIBZ) $(LIBDL),\ + LDFLAGS_SUFFIX_macosx := $(LIBZ), \ + LDFLAGS_SUFFIX_windows := \ + -export:JLI_Launch \ +@@ -479,6 +483,22 @@ + $(call install-file) + + BUILD_LIBRARIES += $(JDK_OUTPUTDIR)/objs/libjli_static.a ++ ++else ifeq ($(OPENJDK_TARGET_OS), aix) ++ # AIX also requires a static libjli because the compiler doesn't support '-rpath' ++ $(eval $(call SetupNativeCompilation,BUILD_LIBJLI_STATIC,\ ++ STATIC_LIBRARY:=jli_static,\ ++ OUTPUT_DIR:=$(JDK_OUTPUTDIR)/objs,\ ++ SRC:=$(BUILD_LIBJLI_SRC_DIRS),\ ++ INCLUDE_FILES:=$(BUILD_LIBJLI_FILES),\ ++ LANG:=C,\ ++ OPTIMIZATION:=HIGH, \ ++ CFLAGS:=$(STATIC_LIBRARY_FLAGS) $(LIBJLI_CFLAGS),\ ++ ARFLAGS:=$(ARFLAGS),\ ++ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjli_static)) ++ ++ BUILD_LIBRARIES += $(JDK_OUTPUTDIR)/objs/libjli_static.a ++ + endif + + ########################################################################################## +--- ./jdk/make/lib/NetworkingLibraries.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/lib/NetworkingLibraries.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -46,6 +46,10 @@ + LIBNET_EXCLUDE_FILES += bsd_close.c + endif + ++ifeq ($(OPENJDK_TARGET_OS), aix) ++ LIBNET_SRC_DIRS += $(JDK_TOPDIR)/src/aix/native/java/net/ ++endif ++ + ifeq ($(OPENJDK_TARGET_OS), windows) + LIBNET_EXCLUDE_FILES += PlainSocketImpl.c PlainDatagramSocketImpl.c SdpSupport.c + else +@@ -69,6 +73,7 @@ + LDFLAGS_SUFFIX_macosx := -ljvm -ljava, \ + LDFLAGS_SUFFIX_solaris := -ljvm -ljava -lnsl -lsocket $(LIBDL) -lc, \ + LDFLAGS_SUFFIX_linux := $(LIBDL) -ljvm -lpthread -ljava, \ ++ LDFLAGS_SUFFIX_aix := $(LIBDL) -ljvm -ljava,\ + LDFLAGS_SUFFIX_windows := ws2_32.lib jvm.lib secur32.lib iphlpapi.lib \ + delayimp.lib $(WIN_JAVA_LIB) advapi32.lib \ + -DELAYLOAD:secur32.dll -DELAYLOAD:iphlpapi.dll, \ +--- ./jdk/make/lib/NioLibraries.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/lib/NioLibraries.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -112,6 +112,24 @@ + UnixNativeDispatcher.c + endif + ++ifeq ($(OPENJDK_TARGET_OS), aix) ++ BUILD_LIBNIO_MAPFILE:=$(JDK_TOPDIR)/make/mapfiles/libnio/mapfile-$(OPENJDK_TARGET_OS) ++ BUILD_LIBNIO_SRC += \ ++ $(JDK_TOPDIR)/src/aix/native/sun/nio/ch \ ++ $(JDK_TOPDIR)/src/aix/native/sun/nio/fs ++ BUILD_LIBNIO_FILES += \ ++ AixPollPort.c \ ++ InheritedChannel.c \ ++ AixNativeThread.c \ ++ PollArrayWrapper.c \ ++ UnixAsynchronousServerSocketChannelImpl.c \ ++ UnixAsynchronousSocketChannelImpl.c \ ++ GnomeFileTypeDetector.c \ ++ UnixCopyFile.c \ ++ AixNativeDispatcher.c \ ++ UnixNativeDispatcher.c ++endif ++ + $(eval $(call SetupNativeCompilation,BUILD_LIBNIO, \ + LIBRARY := nio, \ + OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ +@@ -125,6 +143,7 @@ + LDFLAGS := $(LDFLAGS_JDKLIB) $(BUILD_LIBNIO_LDFLAGS) \ + $(call SET_SHARED_LIBRARY_ORIGIN), \ + LDFLAGS_SUFFIX_linux := -ljava -lnet -lpthread $(LIBDL), \ ++ LDFLAGS_SUFFIX_aix := -ljava -lnet $(LIBDL),\ + LDFLAGS_SUFFIX_solaris := -ljvm -lsocket -lposix4 $(LIBDL) \ + -lsendfile -ljava -lnet -lc, \ + LDFLAGS_SUFFIX_windows := jvm.lib ws2_32.lib $(WIN_JAVA_LIB) \ +@@ -148,7 +167,7 @@ + + ifeq ($(OPENJDK_TARGET_OS_API), posix) + +- ifneq ($(OPENJDK_TARGET_OS), macosx) ++ ifeq (, $(filter $(OPENJDK_TARGET_OS), macosx aix)) + + # Suppress unused parameters required by exported JNI functions. + SCTP_WERROR := -Werror -Wno-error=unused-parameter +--- ./jdk/make/lib/PlatformLibraries.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/lib/PlatformLibraries.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -161,7 +161,10 @@ + -subsystem:windows -machine:$2 \ + -def:$(ACCESSBRIDGE_SRCDIR)/JAWTAccessBridge.DEF, \ + VERSIONINFO_RESOURCE := $(ACCESSBRIDGE_SRCDIR)/AccessBridgeStatusWindow.rc, \ +- RC_FLAGS := $(RC_FLAGS), \ ++ RC_FLAGS := $(RC_FLAGS) \ ++ -D "JDK_FNAME=JAWTAccessBridge$1.dll" \ ++ -D "JDK_INTERNAL_NAME=JAWTAccessBridge$1" \ ++ -D "JDK_FTYPE=0x02L", \ + OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libjawtaccessbridge$1, \ + DEBUG_SYMBOLS := true) + +@@ -184,7 +187,10 @@ + -subsystem:windows -machine:$2 \ + -def:$(ACCESSBRIDGE_SRCDIR)/JavaAccessBridge.DEF, \ + VERSIONINFO_RESOURCE := $(ACCESSBRIDGE_SRCDIR)/AccessBridgeStatusWindow.rc, \ +- RC_FLAGS := $(RC_FLAGS), \ ++ RC_FLAGS := $(RC_FLAGS) \ ++ -D "JDK_FNAME=JavaAccessBridge$1.dll" \ ++ -D "JDK_INTERNAL_NAME=JavaAccessBridge$1" \ ++ -D "JDK_FTYPE=0x02L", \ + OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libjavaaccessbridge$1, \ + DEBUG_SYMBOLS := true) + +@@ -206,7 +212,10 @@ + -subsystem:windows -machine:$2 \ + -def:$(ACCESSBRIDGE_SRCDIR)/WinAccessBridge.DEF, \ + VERSIONINFO_RESOURCE := $(ACCESSBRIDGE_SRCDIR)/AccessBridgeStatusWindow.rc, \ +- RC_FLAGS := $(RC_FLAGS), \ ++ RC_FLAGS := $(RC_FLAGS) \ ++ -D "JDK_FNAME=WindowsAccessBridge$1.dll" \ ++ -D "JDK_INTERNAL_NAME=WindowsAccessBridge$1" \ ++ -D "JDK_FTYPE=0x02L", \ + OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libwindowsaccessbridge$1, \ + DEBUG_SYMBOLS := true) + +--- ./jdk/make/lib/ServiceabilityLibraries.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/lib/ServiceabilityLibraries.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -33,11 +33,19 @@ + ifneq ($(OPENJDK_TARGET_OS), macosx) + LIBATTACH_EXCLUDE_FILES += BsdVirtualMachine.c + endif ++ifneq ($(OPENJDK_TARGET_OS),aix) ++ LIBATTACH_EXCLUDE_FILES += AixVirtualMachine.c ++endif ++ ++LIBATTACH_SRC_FILES := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/tools/attach ++ifeq ($(OPENJDK_TARGET_OS),aix) ++ LIBATTACH_SRC_FILES += $(JDK_TOPDIR)/src/aix/native/sun/tools/attach ++endif + + $(eval $(call SetupNativeCompilation,BUILD_LIBATTACH, \ + LIBRARY := attach, \ + OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ +- SRC := $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/tools/attach, \ ++ SRC := $(LIBATTACH_SRC_FILES), \ + EXCLUDE_FILES := $(LIBATTACH_EXCLUDE_FILES), \ + LANG := C, \ + OPTIMIZATION := LOW, \ +@@ -255,6 +263,7 @@ + LDFLAGS_SUFFIX_macosx := -liconv $(LIBZ), \ + LDFLAGS_SUFFIX_solaris := $(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL) -lc, \ + LDFLAGS_SUFFIX_linux := $(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL), \ ++ LDFLAGS_SUFFIX_aix := $(LIBZ) -L$(JDK_OUTPUTDIR)/objs -ljli_static $(LIBDL),\ + VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ + RC_FLAGS := $(RC_FLAGS) \ + -D "JDK_FNAME=instrument.dll" \ +@@ -263,7 +272,7 @@ + OBJECT_DIR := $(LIBINSTRUMENT_DIR), \ + DEBUG_SYMBOLS := true)) + +-ifneq (, $(findstring $(OPENJDK_TARGET_OS), macosx windows)) ++ifneq (, $(findstring $(OPENJDK_TARGET_OS), macosx windows aix)) + $(BUILD_LIBINSTRUMENT): $(JDK_OUTPUTDIR)/objs/$(LIBRARY_PREFIX)jli_static$(STATIC_LIBRARY_SUFFIX) + else + $(BUILD_LIBINSTRUMENT): $(INSTALL_LIBRARIES_HERE)/jli/$(LIBRARY_PREFIX)jli$(SHARED_LIBRARY_SUFFIX) +@@ -314,6 +323,7 @@ + LDFLAGS_solaris := -lkstat, \ + LDFLAGS_SUFFIX := $(LDFLAGS_JDKLIB_SUFFIX), \ + LDFLAGS_SUFFIX_windows := jvm.lib psapi.lib $(WIN_JAVA_LIB) advapi32.lib, \ ++ LDFLAGS_SUFFIX_aix := -lperfstat,\ + VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ + RC_FLAGS := $(RC_FLAGS) \ + -D "JDK_FNAME=management.dll" \ +@@ -334,6 +344,11 @@ + -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) ++ BUILD_LIBHPROF_SRC += $(JDK_TOPDIR)/src/aix/porting ++ BUILD_LIBHPROF_CFLAGS += -I$(JDK_TOPDIR)/src/aix/porting ++endif ++ + BUILD_LIBHPROF_LDFLAGS := + + LIBHPROF_OPTIMIZATION := HIGHEST +--- ./jdk/make/lib/SoundLibraries.gmk Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/lib/SoundLibraries.gmk Wed Jul 30 18:42:59 2014 +0100 +@@ -71,6 +71,10 @@ + LIBJSOUND_CFLAGS += -DX_PLATFORM=X_LINUX + endif # OPENJDK_TARGET_OS linux + ++ifeq ($(OPENJDK_TARGET_OS), aix) ++ LIBJSOUND_CFLAGS += -DX_PLATFORM=X_AIX ++endif # OPENJDK_TARGET_OS aix ++ + ifeq ($(OPENJDK_TARGET_OS), macosx) + LIBJSOUND_LANG := C++ + LIBJSOUND_CFLAGS += -DX_PLATFORM=X_MACOSX \ +@@ -131,6 +135,10 @@ + ifeq ($(OPENJDK_TARGET_CPU), ppc) + LIBJSOUND_CFLAGS += -DX_ARCH=X_PPC + endif ++ ++ ifeq ($(OPENJDK_TARGET_CPU), ppc64) ++ LIBJSOUND_CFLAGS += -DX_ARCH=X_PPC64 ++ endif + endif + + LIBJSOUND_CFLAGS += -DEXTRA_SOUND_JNI_LIBS='"$(EXTRA_SOUND_JNI_LIBS)"' +--- ./jdk/make/mapfiles/launchers/mapfile-ppc64 Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/mapfiles/launchers/mapfile-ppc64 Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,39 @@ ++# ++# 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. ++# ++# ++# Specify what global symbols we export. Note that we're not really ++# interested in declaring a version, simply scoping the file is sufficient. ++# ++ ++SUNWprivate_1.1 { ++ global: ++ main; # Provides basic adb symbol offsets ++ environ; # Public symbols and required by Java run time ++ _environ; ++ __environ_lock; ++ ++ local: ++ *; ++}; +--- ./jdk/make/mapfiles/launchers/mapfile-ppc64.anonymous Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/mapfiles/launchers/mapfile-ppc64.anonymous Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,40 @@ ++# ++# 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. ++# ++# ++# Define anonymous library interface (i.e. without a version tag) for broken SuSE ld because ++# the linker on older SuSE distros (e.g. on SLES 10) complains with: ++# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable." ++# if feeded with a version script which contains named tags. ++ ++{ ++ global: ++ main; # Provides basic adb symbol offsets ++ environ; # Public symbols and required by Java run time ++ _environ; ++ __environ_lock; ++ ++ local: ++ *; ++}; +--- ./jdk/make/mapfiles/launchers/mapfile-x86.anonymous Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/mapfiles/launchers/mapfile-x86.anonymous Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,49 @@ ++# ++# 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. ++# ++# ++# Define anonymous library interface (i.e. without a version tag) for broken SuSE ld because ++# the linker on older SuSE distros (e.g. on SLES 10) complains with: ++# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable." ++# if feeded with a version script which contains named tags. ++ ++{ ++ global: ++ main; # Provides basic adb symbol offsets ++ environ; # Public symbols and required by Java run time ++ _environ; ++ __environ_lock; ++ ___Argv; # The following are private, but as they are ++ _start; # exported from ctr1/crtn, the clever hacker ++ _init; # might know about them. However note, that ++ _fini; # their use is strictly not supported. ++ _lib_version; ++# _mcount; ++ __fsr; ++ __fsr_init_value; ++ __longdouble_used; ++ ++ local: ++ *; ++}; +--- ./jdk/make/mapfiles/launchers/mapfile-x86_64.anonymous Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/mapfiles/launchers/mapfile-x86_64.anonymous Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,40 @@ ++# ++# 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. ++# ++# ++# Define anonymous library interface (i.e. without a version tag) for broken SuSE ld because ++# the linker on older SuSE distros (e.g. on SLES 10) complains with: ++# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable." ++# if feeded with a version script which contains named tags. ++ ++{ ++ global: ++ main; # Provides basic adb symbol offsets ++ environ; # Public symbols and required by Java run time ++ _environ; ++ __environ_lock; ++ ++ local: ++ *; ++}; +--- ./jdk/make/mapfiles/libattach/mapfile-aix Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/mapfiles/libattach/mapfile-aix Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,39 @@ ++# ++# Copyright (c) 2005, 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. ++# ++ ++# Define public interface. ++ ++SUNWprivate_1.1 { ++ global: ++ Java_sun_tools_attach_AixVirtualMachine_socket ++ Java_sun_tools_attach_AixVirtualMachine_connect ++ Java_sun_tools_attach_AixVirtualMachine_sendQuitTo ++ Java_sun_tools_attach_AixVirtualMachine_checkPermissions ++ Java_sun_tools_attach_AixVirtualMachine_close ++ Java_sun_tools_attach_AixVirtualMachine_read ++ Java_sun_tools_attach_AixVirtualMachine_write ++ local: ++ *; ++}; +--- ./jdk/make/mapfiles/libawt/mapfile-vers Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/mapfiles/libawt/mapfile-vers Wed Jul 30 18:42:59 2014 +0100 +@@ -155,6 +155,7 @@ + g_CMpDataID; + colorValueID; + mul8table; ++ div8table; + jvm; + + # ProcessPath entry points and data +--- ./jdk/make/mapfiles/libjava/mapfile-vers Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/mapfiles/libjava/mapfile-vers Wed Jul 30 18:42:59 2014 +0100 +@@ -79,7 +79,7 @@ + Java_java_io_FileInputStream_close0; + Java_java_io_FileInputStream_initIDs; + Java_java_io_FileInputStream_open; +- Java_java_io_FileInputStream_read; ++ Java_java_io_FileInputStream_read0; + Java_java_io_FileInputStream_readBytes; + Java_java_io_FileInputStream_skip; + Java_java_io_FileOutputStream_close0; +@@ -98,11 +98,11 @@ + Java_java_io_RandomAccessFile_initIDs; + Java_java_io_RandomAccessFile_length; + Java_java_io_RandomAccessFile_open; +- Java_java_io_RandomAccessFile_read; ++ Java_java_io_RandomAccessFile_read0; + Java_java_io_RandomAccessFile_readBytes; + Java_java_io_RandomAccessFile_seek0; + Java_java_io_RandomAccessFile_setLength; +- Java_java_io_RandomAccessFile_write; ++ Java_java_io_RandomAccessFile_write0; + Java_java_io_RandomAccessFile_writeBytes; + Java_java_io_UnixFileSystem_canonicalize0; + Java_java_io_UnixFileSystem_checkAccess; +@@ -277,7 +277,8 @@ + Java_sun_misc_VM_latestUserDefinedLoader; + Java_sun_misc_VM_initialize; + Java_sun_misc_VMSupport_initAgentProperties; +- ++ Java_sun_misc_VMSupport_getVMTemporaryDirectory; ++ + # ZipFile.c needs this one + throwFileNotFoundException; + +--- ./jdk/make/mapfiles/libjfr/mapfile-vers Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/mapfiles/libjfr/mapfile-vers Wed Jul 30 18:42:59 2014 +0100 +@@ -34,6 +34,7 @@ + Java_oracle_jrockit_jfr_VMJFR_getPeriod; + Java_oracle_jrockit_jfr_VMJFR_descriptors; + Java_oracle_jrockit_jfr_VMJFR_redefineClass0; ++ Java_oracle_jrockit_jfr_VMJFR_retransformClasses0; + JNI_OnLoad; + local: + *; +--- ./jdk/make/mapfiles/libnet/mapfile-vers Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/mapfiles/libnet/mapfile-vers Wed Jul 30 18:42:59 2014 +0100 +@@ -94,6 +94,10 @@ + Java_sun_net_sdp_SdpSupport_create0; + Java_sun_net_spi_DefaultProxySelector_init; + Java_sun_net_spi_DefaultProxySelector_getSystemProxy; ++ Java_sun_net_ExtendedOptionsImpl_init; ++ Java_sun_net_ExtendedOptionsImpl_setFlowOption; ++ Java_sun_net_ExtendedOptionsImpl_getFlowOption; ++ Java_sun_net_ExtendedOptionsImpl_flowSupported; + NET_AllocSockaddr; + NET_SockaddrToInetAddress; + NET_SockaddrEqualsInetAddress; +--- ./jdk/make/mapfiles/libnio/mapfile-aix Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/mapfiles/libnio/mapfile-aix Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,33 @@ ++# ++# Copyright (c) 2001, 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. ++# ++ ++# TODO: implement for AIX ++ ++SUNWprivate_1.1 { ++ global: ++ ++ local: ++ *; ++}; +--- ./jdk/make/mapfiles/libnio/mapfile-linux Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/mapfiles/libnio/mapfile-linux Wed Jul 30 18:42:59 2014 +0100 +@@ -117,6 +117,12 @@ + Java_sun_nio_ch_Net_getInterface6; + Java_sun_nio_ch_Net_shutdown; + Java_sun_nio_ch_Net_poll; ++ Java_sun_nio_ch_Net_pollinValue; ++ Java_sun_nio_ch_Net_polloutValue; ++ Java_sun_nio_ch_Net_pollerrValue; ++ Java_sun_nio_ch_Net_pollhupValue; ++ Java_sun_nio_ch_Net_pollnvalValue; ++ Java_sun_nio_ch_Net_pollconnValue; + Java_sun_nio_ch_Net_isExclusiveBindAvailable; + Java_sun_nio_ch_PollArrayWrapper_interrupt; + Java_sun_nio_ch_PollArrayWrapper_poll0; +--- ./jdk/make/mapfiles/libnio/mapfile-macosx Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/mapfiles/libnio/mapfile-macosx Wed Jul 30 18:42:59 2014 +0100 +@@ -109,6 +109,12 @@ + Java_sun_nio_ch_Net_getInterface6; + Java_sun_nio_ch_Net_shutdown; + Java_sun_nio_ch_Net_poll; ++ Java_sun_nio_ch_Net_pollinValue; ++ Java_sun_nio_ch_Net_polloutValue; ++ Java_sun_nio_ch_Net_pollerrValue; ++ Java_sun_nio_ch_Net_pollhupValue; ++ Java_sun_nio_ch_Net_pollnvalValue; ++ Java_sun_nio_ch_Net_pollconnValue; + Java_sun_nio_ch_Net_isExclusiveBindAvailable; + Java_sun_nio_ch_PollArrayWrapper_interrupt; + Java_sun_nio_ch_PollArrayWrapper_poll0; +--- ./jdk/make/mapfiles/libnio/mapfile-solaris Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/make/mapfiles/libnio/mapfile-solaris Wed Jul 30 18:42:59 2014 +0100 +@@ -105,6 +105,12 @@ + Java_sun_nio_ch_Net_getInterface6; + Java_sun_nio_ch_Net_shutdown; + Java_sun_nio_ch_Net_poll; ++ Java_sun_nio_ch_Net_pollinValue; ++ Java_sun_nio_ch_Net_polloutValue; ++ Java_sun_nio_ch_Net_pollerrValue; ++ Java_sun_nio_ch_Net_pollhupValue; ++ Java_sun_nio_ch_Net_pollnvalValue; ++ Java_sun_nio_ch_Net_pollconnValue; + Java_sun_nio_ch_Net_isExclusiveBindAvailable; + Java_sun_nio_ch_PollArrayWrapper_interrupt; + Java_sun_nio_ch_PollArrayWrapper_poll0; +--- ./jdk/make/mapfiles/libunpack/mapfile-vers-unpack200.anonymous Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/mapfiles/libunpack/mapfile-vers-unpack200.anonymous Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,34 @@ ++# ++# Copyright (c) 2011, 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. ++# ++ ++# Define anonymous library interface (i.e. without a version tag) for broken SuSE ld because ++# the linker on older SuSE distros (e.g. on SLES 10) complains with: ++# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable." ++# if feeded with a version script which contains named tags. ++ ++{ ++ local: ++ *; ++}; +--- ./jdk/src/aix/classes/sun/awt/fontconfigs/aix.fontconfig.properties Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/awt/fontconfigs/aix.fontconfig.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,77 @@ ++# ++# ++# Copyright 2013 SAP AG. 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. ++# ++ ++# Minimal version for AIX using the standard Latin Type1 Fonts from the ++# package X11.fnt.iso_T1. These fonts are installed by default into ++# "/usr/lpp/X11/lib/X11/fonts/Type1" and sym-linked to "/usr/lib/X11/fonts/Type1" ++ ++# Version ++ ++version=1 ++ ++# Component Font Mappings ++ ++dialog.plain.latin-1=-*-helvetica-medium-r-normal--*-%d-100-100-p-*-iso10646-1 ++dialog.bold.latin-1=-*-helvetica-bold-r-normal--*-%d-100-100-p-*-iso10646-1 ++dialog.italic.latin-1=-*-helvetica-medium-o-normal--*-%d-100-100-p-*-iso10646-1 ++dialog.bolditalic.latin-1=-*-helvetica-bold-o-normal--*-%d-100-100-p-*-iso10646-1 ++ ++dialoginput.plain.latin-1=-*-courier-medium-r-normal--*-%d-100-100-m-*-iso10646-1 ++dialoginput.bold.latin-1=-*-courier-bold-r-normal--*-%d-100-100-m-*-iso10646-1 ++dialoginput.italic.latin-1=-*-courier-medium-o-normal--*-%d-100-100-m-*-iso10646-1 ++dialoginput.bolditalic.latin-1=-*-courier-bold-o-normal--*-%d-100-100-m-*-iso10646-1 ++ ++sansserif.plain.latin-1=-*-helvetica-medium-r-normal--*-%d-100-100-p-*-iso10646-1 ++sansserif.bold.latin-1=-*-helvetica-bold-r-normal--*-%d-100-100-p-*-iso10646-1 ++sansserif.italic.latin-1=-*-helvetica-medium-o-normal--*-%d-100-100-p-*-iso10646-1 ++sansserif.bolditalic.latin-1=-*-helvetica-bold-o-normal--*-%d-100-100-p-*-iso10646-1 ++ ++serif.plain.latin-1=-*-times new roman-medium-r-normal--*-%d-100-100-p-*-iso10646-1 ++serif.bold.latin-1=-*-times new roman-bold-r-normal--*-%d-100-100-p-*-iso10646-1 ++serif.italic.latin-1=-*-times new roman-medium-i-normal--*-%d-100-100-p-*-iso10646-1 ++serif.bolditalic.latin-1=-*-times new roman-bold-i-normal--*-%d-100-100-p-*-iso10646-1 ++ ++monospaced.plain.latin-1=-*-courier-medium-r-normal--*-%d-100-100-m-*-iso10646-1 ++monospaced.bold.latin-1=-*-courier-bold-r-normal--*-%d-100-100-m-*-iso10646-1 ++monospaced.italic.latin-1=-*-courier-medium-o-normal--*-%d-100-100-m-*-iso10646-1 ++monospaced.bolditalic.latin-1=-*-courier-bold-o-normal--*-%d-100-100-m-*-iso10646-1 ++ ++# Search Sequences ++ ++sequence.allfonts=latin-1 ++ ++filename.-*-courier-medium-r-normal--*-%d-100-100-m-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/cour.pfa ++filename.-*-courier-bold-r-normal--*-%d-100-100-m-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/courb.pfa ++filename.-*-courier-medium-o-normal--*-%d-100-100-m-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/couri.pfa ++filename.-*-courier-bold-o-normal--*-%d-100-100-m-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/courbi.pfa ++filename.-*-helvetica-medium-r-normal--*-%d-100-100-p-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/helv.pfa ++filename.-*-helvetica-bold-r-normal--*-%d-100-100-p-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/helvb.pfa ++filename.-*-helvetica-medium-o-normal--*-%d-100-100-p-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/helvi.pfa ++filename.-*-helvetica-bold-o-normal--*-%d-100-100-p-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/helvbi.pfa ++filename.-*-times_new_roman-medium-r-normal--*-%d-100-100-p-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/tnr.pfa ++filename.-*-times_new_roman-bold-r-normal--*-%d-100-100-p-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/tnrb.pfa ++filename.-*-times_new_roman-medium-i-normal--*-%d-100-100-p-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/tnri.pfa ++filename.-*-times_new_roman-bold-i-normal--*-%d-100-100-p-*-iso10646-1=/usr/lpp/X11/lib/X11/fonts/Type1/tnrbi.pfa +--- ./jdk/src/aix/classes/sun/nio/ch/AixAsynchronousChannelProvider.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/nio/ch/AixAsynchronousChannelProvider.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,91 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012 SAP AG. 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.nio.ch; ++ ++import java.nio.channels.*; ++import java.nio.channels.spi.AsynchronousChannelProvider; ++import java.util.concurrent.ExecutorService; ++import java.util.concurrent.ThreadFactory; ++import java.io.IOException; ++ ++public class AixAsynchronousChannelProvider ++ extends AsynchronousChannelProvider ++{ ++ private static volatile AixPollPort defaultPort; ++ ++ private AixPollPort defaultEventPort() throws IOException { ++ if (defaultPort == null) { ++ synchronized (AixAsynchronousChannelProvider.class) { ++ if (defaultPort == null) { ++ defaultPort = new AixPollPort(this, ThreadPool.getDefault()).start(); ++ } ++ } ++ } ++ return defaultPort; ++ } ++ ++ public AixAsynchronousChannelProvider() { ++ } ++ ++ @Override ++ public AsynchronousChannelGroup openAsynchronousChannelGroup(int nThreads, ThreadFactory factory) ++ throws IOException ++ { ++ return new AixPollPort(this, ThreadPool.create(nThreads, factory)).start(); ++ } ++ ++ @Override ++ public AsynchronousChannelGroup openAsynchronousChannelGroup(ExecutorService executor, int initialSize) ++ throws IOException ++ { ++ return new AixPollPort(this, ThreadPool.wrap(executor, initialSize)).start(); ++ } ++ ++ private Port toPort(AsynchronousChannelGroup group) throws IOException { ++ if (group == null) { ++ return defaultEventPort(); ++ } else { ++ if (!(group instanceof AixPollPort)) ++ throw new IllegalChannelGroupException(); ++ return (Port)group; ++ } ++ } ++ ++ @Override ++ public AsynchronousServerSocketChannel openAsynchronousServerSocketChannel(AsynchronousChannelGroup group) ++ throws IOException ++ { ++ return new UnixAsynchronousServerSocketChannelImpl(toPort(group)); ++ } ++ ++ @Override ++ public AsynchronousSocketChannel openAsynchronousSocketChannel(AsynchronousChannelGroup group) ++ throws IOException ++ { ++ return new UnixAsynchronousSocketChannelImpl(toPort(group)); ++ } ++} +--- ./jdk/src/aix/classes/sun/nio/ch/AixPollPort.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/nio/ch/AixPollPort.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,542 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012 SAP AG. 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.nio.ch; ++ ++import java.nio.channels.spi.AsynchronousChannelProvider; ++import java.io.IOException; ++import java.util.HashSet; ++import java.util.Iterator; ++import java.util.concurrent.ArrayBlockingQueue; ++import java.util.concurrent.RejectedExecutionException; ++import java.util.concurrent.atomic.AtomicInteger; ++import java.util.concurrent.locks.ReentrantLock; ++import sun.misc.Unsafe; ++ ++/** ++ * AsynchronousChannelGroup implementation based on the AIX pollset framework. ++ */ ++final class AixPollPort ++ extends Port ++{ ++ private static final Unsafe unsafe = Unsafe.getUnsafe(); ++ ++ static { ++ IOUtil.load(); ++ init(); ++ } ++ ++ /** ++ * struct pollfd { ++ * int fd; ++ * short events; ++ * short revents; ++ * } ++ */ ++ private static final int SIZEOF_POLLFD = eventSize(); ++ private static final int OFFSETOF_EVENTS = eventsOffset(); ++ private static final int OFFSETOF_REVENTS = reventsOffset(); ++ private static final int OFFSETOF_FD = fdOffset(); ++ ++ // opcodes ++ private static final int PS_ADD = 0x0; ++ private static final int PS_MOD = 0x1; ++ private static final int PS_DELETE = 0x2; ++ ++ // maximum number of events to poll at a time ++ private static final int MAX_POLL_EVENTS = 512; ++ ++ // pollset ID ++ private final int pollset; ++ ++ // true if port is closed ++ private boolean closed; ++ ++ // socket pair used for wakeup ++ private final int sp[]; ++ ++ // socket pair used to indicate pending pollsetCtl calls ++ // Background info: pollsetCtl blocks when another thread is in a pollsetPoll call. ++ private final int ctlSp[]; ++ ++ // number of wakeups pending ++ private final AtomicInteger wakeupCount = new AtomicInteger(); ++ ++ // address of the poll array passed to pollset_poll ++ private final long address; ++ ++ // encapsulates an event for a channel ++ static class Event { ++ final PollableChannel channel; ++ final int events; ++ ++ Event(PollableChannel channel, int events) { ++ this.channel = channel; ++ this.events = events; ++ } ++ ++ PollableChannel channel() { return channel; } ++ int events() { return events; } ++ } ++ ++ // queue of events for cases that a polling thread dequeues more than one ++ // event ++ private final ArrayBlockingQueue queue; ++ private final Event NEED_TO_POLL = new Event(null, 0); ++ private final Event EXECUTE_TASK_OR_SHUTDOWN = new Event(null, 0); ++ private final Event CONTINUE_AFTER_CTL_EVENT = new Event(null, 0); ++ ++ // encapsulates a pollset control event for a file descriptor ++ static class ControlEvent { ++ final int fd; ++ final int events; ++ final boolean removeOnly; ++ int error = 0; ++ ++ ControlEvent(int fd, int events, boolean removeOnly) { ++ this.fd = fd; ++ this.events = events; ++ this.removeOnly = removeOnly; ++ } ++ ++ int fd() { return fd; } ++ int events() { return events; } ++ boolean removeOnly() { return removeOnly; } ++ int error() { return error; } ++ void setError(int error) { this.error = error; } ++ } ++ ++ // queue of control events that need to be processed ++ // (this object is also used for synchronization) ++ private final HashSet controlQueue = new HashSet(); ++ ++ // lock used to check whether a poll operation is ongoing ++ private final ReentrantLock controlLock = new ReentrantLock(); ++ ++ AixPollPort(AsynchronousChannelProvider provider, ThreadPool pool) ++ throws IOException ++ { ++ super(provider, pool); ++ ++ // open pollset ++ this.pollset = pollsetCreate(); ++ ++ // create socket pair for wakeup mechanism ++ int[] sv = new int[2]; ++ try { ++ socketpair(sv); ++ // register one end with pollset ++ pollsetCtl(pollset, PS_ADD, sv[0], Net.POLLIN); ++ } catch (IOException x) { ++ pollsetDestroy(pollset); ++ throw x; ++ } ++ this.sp = sv; ++ ++ // create socket pair for pollset control mechanism ++ sv = new int[2]; ++ try { ++ socketpair(sv); ++ // register one end with pollset ++ pollsetCtl(pollset, PS_ADD, sv[0], Net.POLLIN); ++ } catch (IOException x) { ++ pollsetDestroy(pollset); ++ throw x; ++ } ++ this.ctlSp = sv; ++ ++ // allocate the poll array ++ this.address = allocatePollArray(MAX_POLL_EVENTS); ++ ++ // create the queue and offer the special event to ensure that the first ++ // threads polls ++ this.queue = new ArrayBlockingQueue(MAX_POLL_EVENTS); ++ this.queue.offer(NEED_TO_POLL); ++ } ++ ++ AixPollPort start() { ++ startThreads(new EventHandlerTask()); ++ return this; ++ } ++ ++ /** ++ * Release all resources ++ */ ++ private void implClose() { ++ synchronized (this) { ++ if (closed) ++ return; ++ closed = true; ++ } ++ freePollArray(address); ++ close0(sp[0]); ++ close0(sp[1]); ++ close0(ctlSp[0]); ++ close0(ctlSp[1]); ++ pollsetDestroy(pollset); ++ } ++ ++ private void wakeup() { ++ if (wakeupCount.incrementAndGet() == 1) { ++ // write byte to socketpair to force wakeup ++ try { ++ interrupt(sp[1]); ++ } catch (IOException x) { ++ throw new AssertionError(x); ++ } ++ } ++ } ++ ++ @Override ++ void executeOnHandlerTask(Runnable task) { ++ synchronized (this) { ++ if (closed) ++ throw new RejectedExecutionException(); ++ offerTask(task); ++ wakeup(); ++ } ++ } ++ ++ @Override ++ void shutdownHandlerTasks() { ++ /* ++ * If no tasks are running then just release resources; otherwise ++ * write to the one end of the socketpair to wakeup any polling threads. ++ */ ++ int nThreads = threadCount(); ++ if (nThreads == 0) { ++ implClose(); ++ } else { ++ // send interrupt to each thread ++ while (nThreads-- > 0) { ++ wakeup(); ++ } ++ } ++ } ++ ++ // invoke by clients to register a file descriptor ++ @Override ++ void startPoll(int fd, int events) { ++ queueControlEvent(new ControlEvent(fd, events, false)); ++ } ++ ++ // Callback method for implementations that need special handling when fd is removed ++ @Override ++ protected void preUnregister(int fd) { ++ queueControlEvent(new ControlEvent(fd, 0, true)); ++ } ++ ++ // Add control event into queue and wait for completion. ++ // In case the control lock is free, this method also tries to apply the control change directly. ++ private void queueControlEvent(ControlEvent ev) { ++ // pollsetCtl blocks when a poll call is ongoing. This is very probable. ++ // Therefore we let the polling thread do the pollsetCtl call. ++ synchronized (controlQueue) { ++ controlQueue.add(ev); ++ // write byte to socketpair to force wakeup ++ try { ++ interrupt(ctlSp[1]); ++ } catch (IOException x) { ++ throw new AssertionError(x); ++ } ++ do { ++ // Directly empty queue if no poll call is ongoing. ++ if (controlLock.tryLock()) { ++ try { ++ processControlQueue(); ++ } finally { ++ controlLock.unlock(); ++ } ++ } else { ++ try { ++ // Do not starve in case the polling thread returned before ++ // we could write to ctlSp[1] but the polling thread did not ++ // release the control lock until we checked. Therefore, use ++ // a timed wait for the time being. ++ controlQueue.wait(100); ++ } catch (InterruptedException e) { ++ // ignore exception and try again ++ } ++ } ++ } while (controlQueue.contains(ev)); ++ } ++ if (ev.error() != 0) { ++ throw new AssertionError(); ++ } ++ } ++ ++ // Process all events currently stored in the control queue. ++ private void processControlQueue() { ++ synchronized (controlQueue) { ++ // On Aix it is only possible to set the event ++ // bits on the first call of pollsetCtl. Later ++ // calls only add bits, but cannot remove them. ++ // Therefore, we always remove the file ++ // descriptor ignoring the error and then add it. ++ Iterator iter = controlQueue.iterator(); ++ while (iter.hasNext()) { ++ ControlEvent ev = iter.next(); ++ pollsetCtl(pollset, PS_DELETE, ev.fd(), 0); ++ if (!ev.removeOnly()) { ++ ev.setError(pollsetCtl(pollset, PS_MOD, ev.fd(), ev.events())); ++ } ++ iter.remove(); ++ } ++ controlQueue.notifyAll(); ++ } ++ } ++ ++ /* ++ * Task to process events from pollset and dispatch to the channel's ++ * onEvent handler. ++ * ++ * Events are retreived from pollset in batch and offered to a BlockingQueue ++ * where they are consumed by handler threads. A special "NEED_TO_POLL" ++ * event is used to signal one consumer to re-poll when all events have ++ * been consumed. ++ */ ++ private class EventHandlerTask implements Runnable { ++ private Event poll() throws IOException { ++ try { ++ for (;;) { ++ int n; ++ controlLock.lock(); ++ try { ++ n = pollsetPoll(pollset, address, MAX_POLL_EVENTS); ++ } finally { ++ controlLock.unlock(); ++ } ++ /* ++ * 'n' events have been read. Here we map them to their ++ * corresponding channel in batch and queue n-1 so that ++ * they can be handled by other handler threads. The last ++ * event is handled by this thread (and so is not queued). ++ */ ++ fdToChannelLock.readLock().lock(); ++ try { ++ while (n-- > 0) { ++ long eventAddress = getEvent(address, n); ++ int fd = getDescriptor(eventAddress); ++ ++ // To emulate one shot semantic we need to remove ++ // the file descriptor here. ++ if (fd != sp[0] && fd != ctlSp[0]) { ++ synchronized (controlQueue) { ++ pollsetCtl(pollset, PS_DELETE, fd, 0); ++ } ++ } ++ ++ // wakeup ++ if (fd == sp[0]) { ++ if (wakeupCount.decrementAndGet() == 0) { ++ // no more wakeups so drain pipe ++ drain1(sp[0]); ++ } ++ ++ // queue special event if there are more events ++ // to handle. ++ if (n > 0) { ++ queue.offer(EXECUTE_TASK_OR_SHUTDOWN); ++ continue; ++ } ++ return EXECUTE_TASK_OR_SHUTDOWN; ++ } ++ ++ // wakeup to process control event ++ if (fd == ctlSp[0]) { ++ synchronized (controlQueue) { ++ drain1(ctlSp[0]); ++ processControlQueue(); ++ } ++ if (n > 0) { ++ continue; ++ } ++ return CONTINUE_AFTER_CTL_EVENT; ++ } ++ ++ PollableChannel channel = fdToChannel.get(fd); ++ if (channel != null) { ++ int events = getRevents(eventAddress); ++ Event ev = new Event(channel, events); ++ ++ // n-1 events are queued; This thread handles ++ // the last one except for the wakeup ++ if (n > 0) { ++ queue.offer(ev); ++ } else { ++ return ev; ++ } ++ } ++ } ++ } finally { ++ fdToChannelLock.readLock().unlock(); ++ } ++ } ++ } finally { ++ // to ensure that some thread will poll when all events have ++ // been consumed ++ queue.offer(NEED_TO_POLL); ++ } ++ } ++ ++ public void run() { ++ Invoker.GroupAndInvokeCount myGroupAndInvokeCount = ++ Invoker.getGroupAndInvokeCount(); ++ final boolean isPooledThread = (myGroupAndInvokeCount != null); ++ boolean replaceMe = false; ++ Event ev; ++ try { ++ for (;;) { ++ // reset invoke count ++ if (isPooledThread) ++ myGroupAndInvokeCount.resetInvokeCount(); ++ ++ try { ++ replaceMe = false; ++ ev = queue.take(); ++ ++ // no events and this thread has been "selected" to ++ // poll for more. ++ if (ev == NEED_TO_POLL) { ++ try { ++ ev = poll(); ++ } catch (IOException x) { ++ x.printStackTrace(); ++ return; ++ } ++ } ++ } catch (InterruptedException x) { ++ continue; ++ } ++ ++ // contine after we processed a control event ++ if (ev == CONTINUE_AFTER_CTL_EVENT) { ++ continue; ++ } ++ ++ // handle wakeup to execute task or shutdown ++ if (ev == EXECUTE_TASK_OR_SHUTDOWN) { ++ Runnable task = pollTask(); ++ if (task == null) { ++ // shutdown request ++ return; ++ } ++ // run task (may throw error/exception) ++ replaceMe = true; ++ task.run(); ++ continue; ++ } ++ ++ // process event ++ try { ++ ev.channel().onEvent(ev.events(), isPooledThread); ++ } catch (Error x) { ++ replaceMe = true; throw x; ++ } catch (RuntimeException x) { ++ replaceMe = true; throw x; ++ } ++ } ++ } finally { ++ // last handler to exit when shutdown releases resources ++ int remaining = threadExit(this, replaceMe); ++ if (remaining == 0 && isShutdown()) { ++ implClose(); ++ } ++ } ++ } ++ } ++ ++ /** ++ * Allocates a poll array to handle up to {@code count} events. ++ */ ++ private static long allocatePollArray(int count) { ++ return unsafe.allocateMemory(count * SIZEOF_POLLFD); ++ } ++ ++ /** ++ * Free a poll array ++ */ ++ private static void freePollArray(long address) { ++ unsafe.freeMemory(address); ++ } ++ ++ /** ++ * Returns event[i]; ++ */ ++ private static long getEvent(long address, int i) { ++ return address + (SIZEOF_POLLFD*i); ++ } ++ ++ /** ++ * Returns event->fd ++ */ ++ private static int getDescriptor(long eventAddress) { ++ return unsafe.getInt(eventAddress + OFFSETOF_FD); ++ } ++ ++ /** ++ * Returns event->events ++ */ ++ private static int getEvents(long eventAddress) { ++ return unsafe.getChar(eventAddress + OFFSETOF_EVENTS); ++ } ++ ++ /** ++ * Returns event->revents ++ */ ++ private static int getRevents(long eventAddress) { ++ return unsafe.getChar(eventAddress + OFFSETOF_REVENTS); ++ } ++ ++ // -- Native methods -- ++ ++ private static native void init(); ++ ++ private static native int eventSize(); ++ ++ private static native int eventsOffset(); ++ ++ private static native int reventsOffset(); ++ ++ private static native int fdOffset(); ++ ++ private static native int pollsetCreate() throws IOException; ++ ++ private static native int pollsetCtl(int pollset, int opcode, int fd, int events); ++ ++ private static native int pollsetPoll(int pollset, long pollAddress, int numfds) ++ throws IOException; ++ ++ private static native void pollsetDestroy(int pollset); ++ ++ private static native void socketpair(int[] sv) throws IOException; ++ ++ private static native void interrupt(int fd) throws IOException; ++ ++ private static native void drain1(int fd) throws IOException; ++ ++ private static native void close0(int fd); ++} +--- ./jdk/src/aix/classes/sun/nio/ch/sctp/SctpChannelImpl.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/nio/ch/sctp/SctpChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,150 @@ ++/* ++ * Copyright (c) 2009, 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. ++ */ ++package sun.nio.ch.sctp; ++ ++import java.net.SocketAddress; ++import java.net.InetAddress; ++import java.io.IOException; ++import java.util.Set; ++import java.nio.ByteBuffer; ++import java.nio.channels.spi.SelectorProvider; ++import com.sun.nio.sctp.Association; ++import com.sun.nio.sctp.MessageInfo; ++import com.sun.nio.sctp.NotificationHandler; ++import com.sun.nio.sctp.SctpChannel; ++import com.sun.nio.sctp.SctpSocketOption; ++ ++/** ++ * Unimplemented. ++ */ ++public class SctpChannelImpl extends SctpChannel ++{ ++ private static final String message = "SCTP not supported on this platform"; ++ ++ public SctpChannelImpl(SelectorProvider provider) { ++ super(provider); ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Association association() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel bind(SocketAddress local) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel bindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel unbindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public boolean connect(SocketAddress remote) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public boolean connect(SocketAddress remote, int maxOutStreams, ++ int maxInStreams) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public boolean isConnectionPending() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public boolean finishConnect() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set getAllLocalAddresses() ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set getRemoteAddresses() ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel shutdown() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public T getOption(SctpSocketOption name) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel setOption(SctpSocketOption name, T value) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set> supportedOptions() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public MessageInfo receive(ByteBuffer dst, T attachment, ++ NotificationHandler handler) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public int send(ByteBuffer src, MessageInfo messageInfo) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ protected void implConfigureBlocking(boolean block) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public void implCloseSelectableChannel() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++} +--- ./jdk/src/aix/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,137 @@ ++/* ++ * Copyright (c) 2009, 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. ++ */ ++package sun.nio.ch.sctp; ++ ++import java.net.SocketAddress; ++import java.net.InetAddress; ++import java.io.IOException; ++import java.util.Set; ++import java.nio.ByteBuffer; ++import java.nio.channels.spi.SelectorProvider; ++import com.sun.nio.sctp.Association; ++import com.sun.nio.sctp.SctpChannel; ++import com.sun.nio.sctp.MessageInfo; ++import com.sun.nio.sctp.NotificationHandler; ++import com.sun.nio.sctp.SctpMultiChannel; ++import com.sun.nio.sctp.SctpSocketOption; ++ ++/** ++ * Unimplemented. ++ */ ++public class SctpMultiChannelImpl extends SctpMultiChannel ++{ ++ private static final String message = "SCTP not supported on this platform"; ++ ++ public SctpMultiChannelImpl(SelectorProvider provider) { ++ super(provider); ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set associations() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpMultiChannel bind(SocketAddress local, ++ int backlog) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpMultiChannel bindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpMultiChannel unbindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set getAllLocalAddresses() ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set getRemoteAddresses ++ (Association association) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpMultiChannel shutdown(Association association) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public T getOption(SctpSocketOption name, ++ Association association) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpMultiChannel setOption(SctpSocketOption name, ++ T value, Association association) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set> supportedOptions() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public MessageInfo receive(ByteBuffer buffer, T attachment, ++ NotificationHandler handler) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public int send(ByteBuffer buffer, MessageInfo messageInfo) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel branch(Association association) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ protected void implConfigureBlocking(boolean block) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public void implCloseSelectableChannel() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++} +--- ./jdk/src/aix/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,102 @@ ++/* ++ * Copyright (c) 2009, 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. ++ */ ++package sun.nio.ch.sctp; ++ ++import java.net.SocketAddress; ++import java.net.InetAddress; ++import java.io.IOException; ++import java.util.Set; ++import java.nio.channels.spi.SelectorProvider; ++import com.sun.nio.sctp.SctpChannel; ++import com.sun.nio.sctp.SctpServerChannel; ++import com.sun.nio.sctp.SctpSocketOption; ++ ++/** ++ * Unimplemented. ++ */ ++public class SctpServerChannelImpl extends SctpServerChannel ++{ ++ private static final String message = "SCTP not supported on this platform"; ++ ++ public SctpServerChannelImpl(SelectorProvider provider) { ++ super(provider); ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpChannel accept() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpServerChannel bind(SocketAddress local, ++ int backlog) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpServerChannel bindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpServerChannel unbindAddress(InetAddress address) ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set getAllLocalAddresses() ++ throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public T getOption(SctpSocketOption name) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public SctpServerChannel setOption(SctpSocketOption name, ++ T value) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public Set> supportedOptions() { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ protected void implConfigureBlocking(boolean block) throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++ ++ @Override ++ public void implCloseSelectableChannel() throws IOException { ++ throw new UnsupportedOperationException(message); ++ } ++} +--- ./jdk/src/aix/classes/sun/nio/fs/AixFileStore.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/nio/fs/AixFileStore.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,106 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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.nio.fs; ++ ++import java.nio.file.attribute.*; ++import java.util.*; ++import java.io.IOException; ++ ++/** ++ * AIX implementation of FileStore ++ */ ++ ++class AixFileStore ++ extends UnixFileStore ++{ ++ ++ AixFileStore(UnixPath file) throws IOException { ++ super(file); ++ } ++ ++ AixFileStore(UnixFileSystem fs, UnixMountEntry entry) throws IOException { ++ super(fs, entry); ++ } ++ ++ /** ++ * Finds, and returns, the mount entry for the file system where the file ++ * resides. ++ */ ++ @Override ++ UnixMountEntry findMountEntry() throws IOException { ++ AixFileSystem fs = (AixFileSystem)file().getFileSystem(); ++ ++ // step 1: get realpath ++ UnixPath path = null; ++ try { ++ byte[] rp = UnixNativeDispatcher.realpath(file()); ++ path = new UnixPath(fs, rp); ++ } catch (UnixException x) { ++ x.rethrowAsIOException(file()); ++ } ++ ++ // step 2: find mount point ++ UnixPath parent = path.getParent(); ++ while (parent != null) { ++ UnixFileAttributes attrs = null; ++ try { ++ attrs = UnixFileAttributes.get(parent, true); ++ } catch (UnixException x) { ++ x.rethrowAsIOException(parent); ++ } ++ if (attrs.dev() != dev()) ++ break; ++ path = parent; ++ parent = parent.getParent(); ++ } ++ ++ // step 3: lookup mounted file systems ++ byte[] dir = path.asByteArray(); ++ for (UnixMountEntry entry: fs.getMountEntries()) { ++ if (Arrays.equals(dir, entry.dir())) ++ return entry; ++ } ++ ++ throw new IOException("Mount point not found"); ++ } ++ ++ // returns true if extended attributes enabled on file system where given ++ // file resides, returns false if disabled or unable to determine. ++ private boolean isExtendedAttributesEnabled(UnixPath path) { ++ return false; ++ } ++ ++ @Override ++ public boolean supportsFileAttributeView(Class type) { ++ return super.supportsFileAttributeView(type); ++ } ++ ++ @Override ++ public boolean supportsFileAttributeView(String name) { ++ return super.supportsFileAttributeView(name); ++ } ++} +--- ./jdk/src/aix/classes/sun/nio/fs/AixFileSystem.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/nio/fs/AixFileSystem.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,94 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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.nio.fs; ++ ++import java.nio.file.*; ++import java.nio.file.attribute.*; ++import java.io.IOException; ++import java.util.*; ++import static sun.nio.fs.AixNativeDispatcher.*; ++ ++/** ++ * AIX implementation of FileSystem ++ */ ++ ++class AixFileSystem extends UnixFileSystem { ++ ++ AixFileSystem(UnixFileSystemProvider provider, String dir) { ++ super(provider, dir); ++ } ++ ++ @Override ++ public WatchService newWatchService() ++ throws IOException ++ { ++ return new PollingWatchService(); ++ } ++ ++ // lazy initialization of the list of supported attribute views ++ private static class SupportedFileFileAttributeViewsHolder { ++ static final Set supportedFileAttributeViews = ++ supportedFileAttributeViews(); ++ private static Set supportedFileAttributeViews() { ++ Set result = new HashSet(); ++ result.addAll(UnixFileSystem.standardFileAttributeViews()); ++ return Collections.unmodifiableSet(result); ++ } ++ } ++ ++ @Override ++ public Set supportedFileAttributeViews() { ++ return SupportedFileFileAttributeViewsHolder.supportedFileAttributeViews; ++ } ++ ++ @Override ++ void copyNonPosixAttributes(int ofd, int nfd) { ++ // TODO: Implement if needed. ++ } ++ ++ /** ++ * Returns object to iterate over the mount entries returned by mntctl ++ */ ++ @Override ++ Iterable getMountEntries() { ++ UnixMountEntry[] entries = null; ++ try { ++ entries = getmntctl(); ++ } catch (UnixException x) { ++ // nothing we can do ++ } ++ if (entries == null) { ++ return Collections.emptyList(); ++ } ++ return Arrays.asList(entries); ++ } ++ ++ @Override ++ FileStore getFileStore(UnixMountEntry entry) throws IOException { ++ return new AixFileStore(this, entry); ++ } ++} +--- ./jdk/src/aix/classes/sun/nio/fs/AixFileSystemProvider.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/nio/fs/AixFileSystemProvider.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,52 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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.nio.fs; ++ ++import java.io.IOException; ++ ++/** ++ * AIX implementation of FileSystemProvider ++ */ ++ ++public class AixFileSystemProvider extends UnixFileSystemProvider { ++ public AixFileSystemProvider() { ++ super(); ++ } ++ ++ @Override ++ AixFileSystem newFileSystem(String dir) { ++ return new AixFileSystem(this, dir); ++ } ++ ++ /** ++ * @see sun.nio.fs.UnixFileSystemProvider#getFileStore(sun.nio.fs.UnixPath) ++ */ ++ @Override ++ AixFileStore getFileStore(UnixPath path) throws IOException { ++ return new AixFileStore(path); ++ } ++} +--- ./jdk/src/aix/classes/sun/nio/fs/AixNativeDispatcher.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/nio/fs/AixNativeDispatcher.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,56 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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.nio.fs; ++ ++import java.security.AccessController; ++import java.security.PrivilegedAction; ++ ++/** ++ * AIX specific system calls. ++ */ ++ ++class AixNativeDispatcher extends UnixNativeDispatcher { ++ private AixNativeDispatcher() { } ++ ++ /** ++ * Special implementation of 'getextmntent' (see SolarisNativeDispatcher) ++ * that returns all entries at once. ++ */ ++ static native UnixMountEntry[] getmntctl() throws UnixException; ++ ++ // initialize ++ private static native int init(); ++ ++ static { ++ AccessController.doPrivileged(new PrivilegedAction() { ++ public Void run() { ++ System.loadLibrary("nio"); ++ return null; ++ }}); ++ init(); ++ } ++} +--- ./jdk/src/aix/classes/sun/tools/attach/AixAttachProvider.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/tools/attach/AixAttachProvider.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,88 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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.tools.attach; ++ ++import com.sun.tools.attach.VirtualMachine; ++import com.sun.tools.attach.VirtualMachineDescriptor; ++import com.sun.tools.attach.AttachNotSupportedException; ++import com.sun.tools.attach.spi.AttachProvider; ++ ++import java.io.IOException; ++ ++// Based on 'LinuxAttachProvider.java'. All occurrences of the string ++// "Linux" have been textually replaced by "Aix" to avoid confusion. ++ ++/* ++ * An AttachProvider implementation for Aix that uses a UNIX domain ++ * socket. ++ */ ++public class AixAttachProvider extends HotSpotAttachProvider { ++ ++ // perf counter for the JVM version ++ private static final String JVM_VERSION = "java.property.java.vm.version"; ++ ++ public AixAttachProvider() { ++ } ++ ++ public String name() { ++ return "sun"; ++ } ++ ++ public String type() { ++ return "socket"; ++ } ++ ++ public VirtualMachine attachVirtualMachine(String vmid) ++ throws AttachNotSupportedException, IOException ++ { ++ checkAttachPermission(); ++ ++ // AttachNotSupportedException will be thrown if the target VM can be determined ++ // to be not attachable. ++ testAttachable(vmid); ++ ++ return new AixVirtualMachine(this, vmid); ++ } ++ ++ public VirtualMachine attachVirtualMachine(VirtualMachineDescriptor vmd) ++ throws AttachNotSupportedException, IOException ++ { ++ if (vmd.provider() != this) { ++ throw new AttachNotSupportedException("provider mismatch"); ++ } ++ // To avoid re-checking if the VM if attachable, we check if the descriptor ++ // is for a hotspot VM - these descriptors are created by the listVirtualMachines ++ // implementation which only returns a list of attachable VMs. ++ if (vmd instanceof HotSpotVirtualMachineDescriptor) { ++ assert ((HotSpotVirtualMachineDescriptor)vmd).isAttachable(); ++ checkAttachPermission(); ++ return new AixVirtualMachine(this, vmd.id()); ++ } else { ++ return attachVirtualMachine(vmd.id()); ++ } ++ } ++ ++} +--- ./jdk/src/aix/classes/sun/tools/attach/AixVirtualMachine.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/classes/sun/tools/attach/AixVirtualMachine.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,317 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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.tools.attach; ++ ++import com.sun.tools.attach.VirtualMachine; ++import com.sun.tools.attach.AgentLoadException; ++import com.sun.tools.attach.AttachNotSupportedException; ++import com.sun.tools.attach.spi.AttachProvider; ++import java.io.InputStream; ++import java.io.IOException; ++import java.io.File; ++import java.util.Properties; ++ ++// Based on 'LinuxVirtualMachine.java'. All occurrences of the string ++// "Linux" have been textually replaced by "Aix" to avoid confusion. ++ ++/* ++ * Aix implementation of HotSpotVirtualMachine ++ */ ++public class AixVirtualMachine extends HotSpotVirtualMachine { ++ // "/tmp" is used as a global well-known location for the files ++ // .java_pid. and .attach_pid. It is important that this ++ // location is the same for all processes, otherwise the tools ++ // will not be able to find all Hotspot processes. ++ // Any changes to this needs to be synchronized with HotSpot. ++ private static final String tmpdir = "/tmp"; ++ ++ // The patch to the socket file created by the target VM ++ String path; ++ ++ /** ++ * Attaches to the target VM ++ */ ++ AixVirtualMachine(AttachProvider provider, String vmid) ++ throws AttachNotSupportedException, IOException ++ { ++ super(provider, vmid); ++ ++ // This provider only understands pids ++ int pid; ++ try { ++ pid = Integer.parseInt(vmid); ++ } catch (NumberFormatException x) { ++ throw new AttachNotSupportedException("Invalid process identifier"); ++ } ++ ++ // Find the socket file. If not found then we attempt to start the ++ // attach mechanism in the target VM by sending it a QUIT signal. ++ // Then we attempt to find the socket file again. ++ path = findSocketFile(pid); ++ if (path == null) { ++ File f = createAttachFile(pid); ++ try { ++ sendQuitTo(pid); ++ ++ // give the target VM time to start the attach mechanism ++ int i = 0; ++ long delay = 200; ++ int retries = (int)(attachTimeout() / delay); ++ do { ++ try { ++ Thread.sleep(delay); ++ } catch (InterruptedException x) { } ++ path = findSocketFile(pid); ++ i++; ++ } while (i <= retries && path == null); ++ if (path == null) { ++ throw new AttachNotSupportedException( ++ "Unable to open socket file: target process not responding " + ++ "or HotSpot VM not loaded"); ++ } ++ } finally { ++ f.delete(); ++ } ++ } ++ ++ // Check that the file owner/permission to avoid attaching to ++ // bogus process ++ checkPermissions(path); ++ ++ // Check that we can connect to the process ++ // - this ensures we throw the permission denied error now rather than ++ // later when we attempt to enqueue a command. ++ int s = socket(); ++ try { ++ connect(s, path); ++ } finally { ++ close(s); ++ } ++ } ++ ++ /** ++ * Detach from the target VM ++ */ ++ public void detach() throws IOException { ++ synchronized (this) { ++ if (this.path != null) { ++ this.path = null; ++ } ++ } ++ } ++ ++ // protocol version ++ private final static String PROTOCOL_VERSION = "1"; ++ ++ // known errors ++ private final static int ATTACH_ERROR_BADVERSION = 101; ++ ++ /** ++ * Execute the given command in the target VM. ++ */ ++ InputStream execute(String cmd, Object ... args) throws AgentLoadException, IOException { ++ assert args.length <= 3; // includes null ++ ++ // did we detach? ++ String p; ++ synchronized (this) { ++ if (this.path == null) { ++ throw new IOException("Detached from target VM"); ++ } ++ p = this.path; ++ } ++ ++ // create UNIX socket ++ int s = socket(); ++ ++ // connect to target VM ++ try { ++ connect(s, p); ++ } catch (IOException x) { ++ close(s); ++ throw x; ++ } ++ ++ IOException ioe = null; ++ ++ // connected - write request ++ // ++ try { ++ writeString(s, PROTOCOL_VERSION); ++ writeString(s, cmd); ++ ++ for (int i=0; i<3; i++) { ++ if (i < args.length && args[i] != null) { ++ writeString(s, (String)args[i]); ++ } else { ++ writeString(s, ""); ++ } ++ } ++ } catch (IOException x) { ++ ioe = x; ++ } ++ ++ ++ // Create an input stream to read reply ++ SocketInputStream sis = new SocketInputStream(s); ++ ++ // Read the command completion status ++ int completionStatus; ++ try { ++ completionStatus = readInt(sis); ++ } catch (IOException x) { ++ sis.close(); ++ if (ioe != null) { ++ throw ioe; ++ } else { ++ throw x; ++ } ++ } ++ ++ if (completionStatus != 0) { ++ sis.close(); ++ ++ // In the event of a protocol mismatch then the target VM ++ // returns a known error so that we can throw a reasonable ++ // error. ++ if (completionStatus == ATTACH_ERROR_BADVERSION) { ++ throw new IOException("Protocol mismatch with target VM"); ++ } ++ ++ // Special-case the "load" command so that the right exception is ++ // thrown. ++ if (cmd.equals("load")) { ++ throw new AgentLoadException("Failed to load agent library"); ++ } else { ++ throw new IOException("Command failed in target VM"); ++ } ++ } ++ ++ // Return the input stream so that the command output can be read ++ return sis; ++ } ++ ++ /* ++ * InputStream for the socket connection to get target VM ++ */ ++ private class SocketInputStream extends InputStream { ++ int s; ++ ++ public SocketInputStream(int s) { ++ this.s = s; ++ } ++ ++ public synchronized int read() throws IOException { ++ byte b[] = new byte[1]; ++ int n = this.read(b, 0, 1); ++ if (n == 1) { ++ return b[0] & 0xff; ++ } else { ++ return -1; ++ } ++ } ++ ++ public synchronized int read(byte[] bs, int off, int len) throws IOException { ++ if ((off < 0) || (off > bs.length) || (len < 0) || ++ ((off + len) > bs.length) || ((off + len) < 0)) { ++ throw new IndexOutOfBoundsException(); ++ } else if (len == 0) ++ return 0; ++ ++ return AixVirtualMachine.read(s, bs, off, len); ++ } ++ ++ public void close() throws IOException { ++ AixVirtualMachine.close(s); ++ } ++ } ++ ++ // Return the socket file for the given process. ++ private String findSocketFile(int pid) { ++ File f = new File(tmpdir, ".java_pid" + pid); ++ if (!f.exists()) { ++ return null; ++ } ++ return f.getPath(); ++ } ++ ++ // On Solaris/Linux/Aix a simple handshake is used to start the attach mechanism ++ // if not already started. The client creates a .attach_pid file in the ++ // target VM's working directory (or temp directory), and the SIGQUIT handler ++ // checks for the file. ++ private File createAttachFile(int pid) throws IOException { ++ String fn = ".attach_pid" + pid; ++ String path = "/proc/" + pid + "/cwd/" + fn; ++ File f = new File(path); ++ try { ++ f.createNewFile(); ++ } catch (IOException x) { ++ f = new File(tmpdir, fn); ++ f.createNewFile(); ++ } ++ return f; ++ } ++ ++ /* ++ * Write/sends the given to the target VM. String is transmitted in ++ * UTF-8 encoding. ++ */ ++ private void writeString(int fd, String s) throws IOException { ++ if (s.length() > 0) { ++ byte b[]; ++ try { ++ b = s.getBytes("UTF-8"); ++ } catch (java.io.UnsupportedEncodingException x) { ++ throw new InternalError(x); ++ } ++ AixVirtualMachine.write(fd, b, 0, b.length); ++ } ++ byte b[] = new byte[1]; ++ b[0] = 0; ++ write(fd, b, 0, 1); ++ } ++ ++ ++ //-- native methods ++ ++ static native void sendQuitTo(int pid) throws IOException; ++ ++ static native void checkPermissions(String path) throws IOException; ++ ++ static native int socket() throws IOException; ++ ++ static native void connect(int fd, String path) throws IOException; ++ ++ static native void close(int fd) throws IOException; ++ ++ static native int read(int fd, byte buf[], int off, int bufLen) throws IOException; ++ ++ static native void write(int fd, byte buf[], int off, int bufLen) throws IOException; ++ ++ static { ++ System.loadLibrary("attach"); ++ } ++} +--- ./jdk/src/aix/lib/tzmappings Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/lib/tzmappings Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,586 @@ ++# ++# ++# Copyright (c) 1994, 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. ++# ++ ++# ++# Portions Copyright (c) 2014 IBM Corporation ++# ++ ++# This table describes mappings between AIX time zone IDs and Java time zone ++# IDs. Fields are separated by a single TAB ('\t'). Lines must be in the ascending ++# order in ASCII. (non-ASCII characters can't be used.) ++# NOTE ++# This table format is not a public interface of any Java ++# platforms. No applications should depend on this file in any form. ++# This file has been generated using programs. Do not edit this file manually. ++# ++# Solaris Java ++ ++ACST-9:30ACDT Australia/Adelaide ++AST4 America/Curacao ++AST4ADT America/Halifax ++AST9 Pacific/Gambier ++AST9ADT America/Anchorage ++AZOREST1 Atlantic/Cape_Verde ++AZOREST1AZOREDT Atlantic/Azores ++Africa/Abidjan Africa/Abidjan ++Africa/Accra Africa/Accra ++Africa/Addis_Ababa Africa/Addis_Ababa ++Africa/Algiers Africa/Algiers ++Africa/Asmera Africa/Asmera ++Africa/Bamako GMT ++Africa/Bangui Africa/Bangui ++Africa/Banjul Africa/Banjul ++Africa/Bissau Africa/Bissau ++Africa/Blantyre Africa/Blantyre ++Africa/Brazzaville Africa/Luanda ++Africa/Bujumbura Africa/Bujumbura ++Africa/Cairo Africa/Cairo ++Africa/Casablanca Africa/Casablanca ++Africa/Ceuta Europe/Paris ++Africa/Conakry Africa/Conakry ++Africa/Dakar Africa/Dakar ++Africa/Dar_es_Salaam Africa/Dar_es_Salaam ++Africa/Djibouti Africa/Djibouti ++Africa/Douala Africa/Douala ++Africa/El_Aaiun Africa/Casablanca ++Africa/Freetown Africa/Freetown ++Africa/Gaborone Africa/Gaborone ++Africa/Harare Africa/Harare ++Africa/Johannesburg Africa/Johannesburg ++Africa/Kampala Africa/Kampala ++Africa/Khartoum Africa/Khartoum ++Africa/Kigali Africa/Kigali ++Africa/Kinshasa Africa/Kinshasa ++Africa/Lagos Africa/Lagos ++Africa/Libreville Africa/Libreville ++Africa/Lome Africa/Lome ++Africa/Luanda Africa/Luanda ++Africa/Lubumbashi Africa/Lubumbashi ++Africa/Lusaka Africa/Lusaka ++Africa/Malabo Africa/Malabo ++Africa/Maputo Africa/Maputo ++Africa/Maseru Africa/Maseru ++Africa/Mbabane Africa/Mbabane ++Africa/Mogadishu Africa/Mogadishu ++Africa/Monrovia Africa/Monrovia ++Africa/Nairobi Africa/Nairobi ++Africa/Ndjamena Africa/Ndjamena ++Africa/Niamey Africa/Niamey ++Africa/Nouakchott Africa/Nouakchott ++Africa/Ouagadougou Africa/Ouagadougou ++Africa/Porto-Novo Africa/Porto-Novo ++Africa/Sao_Tome Africa/Sao_Tome ++Africa/Timbuktu Africa/Timbuktu ++Africa/Tripoli Africa/Tripoli ++Africa/Tunis Africa/Tunis ++Africa/Windhoek Africa/Windhoek ++America/Adak America/Adak ++America/Anchorage America/Anchorage ++America/Anguilla America/Anguilla ++America/Antigua America/Antigua ++America/Araguaina America/Sao_Paulo ++America/Argentina/Buenos_Aires America/Argentina/Buenos_Aires ++America/Argentina/Catamarca America/Argentina/Catamarca ++America/Argentina/ComodRivadavia America/Argentina/Catamarca ++America/Argentina/Cordoba America/Argentina/Cordoba ++America/Argentina/Jujuy America/Argentina/Jujuy ++America/Argentina/La_Rioja America/Argentina/La_Rioja ++America/Argentina/Mendoza America/Argentina/Mendoza ++America/Argentina/Rio_Gallegos America/Argentina/Rio_Gallegos ++America/Argentina/Salta America/Argentina/Salta ++America/Argentina/San_Juan America/Argentina/San_Juan ++America/Argentina/San_Luis America/Argentina/San_Luis ++America/Argentina/Tucuman America/Argentina/Tucuman ++America/Argentina/Ushuaia America/Argentina/Ushuaia ++America/Aruba America/Aruba ++America/Asuncion America/Asuncion ++America/Atka America/Adak ++America/Barbados America/Barbados ++America/Belize America/Belize ++America/Bogota America/Bogota ++America/Boise America/Denver ++America/Buenos_Aires America/Argentina/Buenos_Aires ++America/Cancun America/Chicago ++America/Caracas America/Caracas ++America/Catamarca America/Argentina/Catamarca ++America/Cayenne America/Cayenne ++America/Cayman America/Cayman ++America/Chicago America/Chicago ++America/Chihuahua America/Denver ++America/Coral_Harbour America/Atikokan ++America/Cordoba America/Argentina/Cordoba ++America/Costa_Rica America/Costa_Rica ++America/Cuiaba America/Cuiaba ++America/Curacao America/Curacao ++America/Dawson America/Los_Angeles ++America/Dawson_Creek America/Dawson_Creek ++America/Denver America/Denver ++America/Detroit America/New_York ++America/Dominica America/Dominica ++America/Edmonton America/Edmonton ++America/El_Salvador America/El_Salvador ++America/Ensenada America/Los_Angeles ++America/Fort_Wayne America/Indiana/Indianapolis ++America/Fortaleza America/Fortaleza ++America/Glace_Bay America/Halifax ++America/Godthab America/Godthab ++America/Goose_Bay America/Thule ++America/Grand_Turk America/Grand_Turk ++America/Grenada America/Grenada ++America/Guadeloupe America/Guadeloupe ++America/Guatemala America/Guatemala ++America/Guayaquil America/Guayaquil ++America/Guyana America/Guyana ++America/Halifax America/Halifax ++America/Havana America/Havana ++America/Indiana/Indianapolis America/Indianapolis ++America/Indianapolis America/Indiana/Indianapolis ++America/Inuvik America/Denver ++America/Iqaluit America/New_York ++America/Jamaica America/Jamaica ++America/Jujuy America/Argentina/Jujuy ++America/Juneau America/Anchorage ++America/Knox_IN America/Indiana/Knox ++America/La_Paz America/La_Paz ++America/Lima America/Lima ++America/Los_Angeles America/Los_Angeles ++America/Louisville America/Kentucky/Louisville ++America/Managua America/Managua ++America/Manaus America/Manaus ++America/Marigot America/Guadeloupe ++America/Martinique America/Martinique ++America/Mazatlan America/Mazatlan ++America/Mendoza America/Argentina/Mendoza ++America/Menominee America/Winnipeg ++America/Mexico_City America/Mexico_City ++America/Miquelon America/Miquelon ++America/Moncton America/Moncton ++America/Montevideo America/Montevideo ++America/Montreal America/Montreal ++America/Montserrat America/Montserrat ++America/Nassau America/Nassau ++America/New_York America/New_York ++America/Nipigon America/New_York ++America/Nome America/Anchorage ++America/Noronha America/Noronha ++America/Panama America/Panama ++America/Pangnirtung America/Thule ++America/Paramaribo America/Paramaribo ++America/Phoenix America/Phoenix ++America/Port-au-Prince America/Port-au-Prince ++America/Port_of_Spain America/Port_of_Spain ++America/Porto_Acre America/Rio_Branco ++America/Puerto_Rico America/Puerto_Rico ++America/Rainy_River America/Chicago ++America/Rankin_Inlet America/Chicago ++America/Regina America/Regina ++America/Rio_Branco America/Rio_Branco ++America/Rosario America/Argentina/Cordoba ++America/Santiago America/Santiago ++America/Santo_Domingo America/Santo_Domingo ++America/Sao_Paulo America/Sao_Paulo ++America/Scoresbysund America/Scoresbysund ++America/Shiprock America/Denver ++America/St_Barthelemy America/Guadeloupe ++America/St_Johns America/St_Johns ++America/St_Kitts America/St_Kitts ++America/St_Lucia America/St_Lucia ++America/St_Thomas America/St_Thomas ++America/St_Vincent America/St_Vincent ++America/Tegucigalpa America/Tegucigalpa ++America/Thule America/Thule ++America/Thunder_Bay America/New_York ++America/Tijuana America/Tijuana ++America/Toronto America/Toronto ++America/Tortola America/Tortola ++America/Vancouver America/Vancouver ++America/Virgin America/St_Thomas ++America/Whitehorse America/Los_Angeles ++America/Winnipeg America/Winnipeg ++America/Yakutat America/Anchorage ++America/Yellowknife America/Denver ++Antarctica/Casey Antarctica/Casey ++Antarctica/DumontDUrville Antarctica/DumontDUrville ++Antarctica/Mawson Antarctica/Mawson ++Antarctica/McMurdo Antarctica/McMurdo ++Antarctica/Palmer Antarctica/Palmer ++Antarctica/South_Pole Antarctica/McMurdo ++Arctic/Longyearbyen Europe/Oslo ++Asia/Aden Asia/Aden ++Asia/Almaty Asia/Almaty ++Asia/Amman Asia/Amman ++Asia/Anadyr Asia/Anadyr ++Asia/Aqtau Asia/Aqtau ++Asia/Aqtobe Asia/Aqtobe ++Asia/Ashkhabad Asia/Ashkhabad ++Asia/Baghdad Asia/Baghdad ++Asia/Bahrain Asia/Bahrain ++Asia/Baku Asia/Baku ++Asia/Bangkok Asia/Bangkok ++Asia/Beirut Asia/Beirut ++Asia/Bishkek Asia/Bishkek ++Asia/Brunei Asia/Brunei ++Asia/Calcutta Asia/Calcutta ++Asia/Chungking Asia/Shanghai ++Asia/Colombo Asia/Colombo ++Asia/Dacca Asia/Dacca ++Asia/Damascus Asia/Damascus ++Asia/Dhaka Asia/Dhaka ++Asia/Dubai Asia/Dubai ++Asia/Dushanbe Asia/Dushanbe ++Asia/Gaza Asia/Amman ++Asia/Harbin Asia/Shanghai ++Asia/Hong_Kong Asia/Hong_Kong ++Asia/Irkutsk Asia/Irkutsk ++Asia/Istanbul Europe/Istanbul ++Asia/Jakarta Asia/Jakarta ++Asia/Jayapura Asia/Jayapura ++Asia/Jerusalem Asia/Jerusalem ++Asia/Kabul Asia/Kabul ++Asia/Kamchatka Asia/Kamchatka ++Asia/Karachi Asia/Karachi ++Asia/Kashgar Asia/Shanghai ++Asia/Katmandu Asia/Katmandu ++Asia/Kolkata Asia/Kolkata ++Asia/Krasnoyarsk Asia/Krasnoyarsk ++Asia/Kuala_Lumpur Asia/Kuala_Lumpur ++Asia/Kuwait Asia/Kuwait ++Asia/Macao Asia/Macao ++Asia/Magadan Asia/Magadan ++Asia/Manila Asia/Manila ++Asia/Muscat Asia/Muscat ++Asia/Nicosia Asia/Nicosia ++Asia/Novosibirsk Asia/Novosibirsk ++Asia/Omsk Asia/Novosibirsk ++Asia/Phnom_Penh Asia/Phnom_Penh ++Asia/Pyongyang Asia/Pyongyang ++Asia/Qatar Asia/Qatar ++Asia/Rangoon Asia/Rangoon ++Asia/Riyadh Asia/Riyadh ++Asia/Saigon Asia/Ho_Chi_Minh ++Asia/Seoul Asia/Seoul ++Asia/Shanghai Asia/Shanghai ++Asia/Singapore Asia/Singapore ++Asia/Taipei Asia/Taipei ++Asia/Tashkent Asia/Tashkent ++Asia/Tbilisi Asia/Tbilisi ++Asia/Tehran Asia/Tehran ++Asia/Tel_Aviv Asia/Jerusalem ++Asia/Thimbu Asia/Thimbu ++Asia/Tokyo Asia/Tokyo ++Asia/Ujung_Pandang Asia/Ujung_Pandang ++Asia/Ulan_Bator Asia/Ulaanbaatar ++Asia/Urumqi Asia/Shanghai ++Asia/Vientiane Asia/Vientiane ++Asia/Vladivostok Asia/Vladivostok ++Asia/Yakutsk Asia/Yakutsk ++Asia/Yekaterinburg Asia/Yekaterinburg ++Asia/Yerevan Asia/Yerevan ++Atlantic/Azores Atlantic/Azores ++Atlantic/Bermuda Atlantic/Bermuda ++Atlantic/Canary Atlantic/Canary ++Atlantic/Cape_Verde Atlantic/Cape_Verde ++Atlantic/Faeroe Atlantic/Faeroe ++Atlantic/Jan_Mayen Atlantic/Jan_Mayen ++Atlantic/Madeira Europe/London ++Atlantic/Reykjavik Atlantic/Reykjavik ++Atlantic/South_Georgia Atlantic/South_Georgia ++Atlantic/St_Helena Atlantic/St_Helena ++Atlantic/Stanley Atlantic/Stanley ++Australia/ACT Australia/Sydney ++Australia/Adelaide Australia/Adelaide ++Australia/Brisbane Australia/Brisbane ++Australia/Broken_Hill Australia/Broken_Hill ++Australia/Canberra Australia/Sydney ++Australia/Darwin Australia/Darwin ++Australia/Hobart Australia/Hobart ++Australia/LHI Australia/Lord_Howe ++Australia/Lord_Howe Australia/Lord_Howe ++Australia/Melbourne Australia/Sydney ++Australia/NSW Australia/Sydney ++Australia/North Australia/Darwin ++Australia/Perth Australia/Perth ++Australia/Queensland Australia/Brisbane ++Australia/South Australia/Adelaide ++Australia/Sydney Australia/Sydney ++Australia/Tasmania Australia/Hobart ++Australia/Victoria Australia/Melbourne ++Australia/West Australia/Perth ++Australia/Yancowinna Australia/Broken_Hill ++BRT3BRST America/Sao_Paulo ++BST11 Pacific/Apia ++BST11BDT Pacific/Apia ++Brazil/Acre America/Rio_Branco ++Brazil/DeNoronha America/Noronha ++Brazil/East America/Sao_Paulo ++Brazil/West America/Manaus ++CET Europe/Paris ++CET-1CEST Europe/Paris ++CET-1CEST-2 Europe/Berlin ++CET-1CET-2 Europe/Paris ++CST6 America/Costa_Rica ++CST6CDT America/Chicago ++CUT0 UTC ++CUT0GDT Europe/London ++Canada/Atlantic America/Halifax ++Canada/Central America/Winnipeg ++Canada/East-Saskatchewan America/Regina ++Canada/Eastern America/Montreal ++Canada/Mountain America/Edmonton ++Canada/Newfoundland America/St_Johns ++Canada/Pacific America/Vancouver ++Canada/Saskatchewan America/Regina ++Canada/Yukon America/Whitehorse ++Chile/Continental America/Santiago ++Chile/EasterIsland Pacific/Easter ++Cuba America/Havana ++EET Europe/Istanbul ++EET-10 Australia/Brisbane ++EET-10EETDT Australia/Sydney ++EST America/Indianapolis ++EST5 America/Indianapolis ++EST5EDT America/New_York ++Egypt Africa/Cairo ++Eire Europe/Dublin ++Etc/GMT GMT ++Etc/GMT0 GMT ++Etc/Greenwich GMT ++Etc/UCT UTC ++Etc/UTC UTC ++Etc/Universal UTC ++Etc/Zulu UTC ++Europe/Amsterdam Europe/Amsterdam ++Europe/Andorra Europe/Andorra ++Europe/Athens Europe/Athens ++Europe/Belfast Europe/London ++Europe/Belgrade Europe/Belgrade ++Europe/Berlin Europe/Berlin ++Europe/Bratislava Europe/Prague ++Europe/Brussels Europe/Brussels ++Europe/Bucharest Europe/Bucharest ++Europe/Budapest Europe/Budapest ++Europe/Chisinau Europe/Chisinau ++Europe/Copenhagen Europe/Copenhagen ++Europe/Dublin Europe/Dublin ++Europe/Gibraltar Europe/Gibraltar ++Europe/Guernsey Europe/London ++Europe/Helsinki Europe/Helsinki ++Europe/Isle_of_Man Europe/London ++Europe/Istanbul Europe/Istanbul ++Europe/Jersey Europe/London ++Europe/Kaliningrad Europe/Kaliningrad ++Europe/Kiev Europe/Kiev ++Europe/Lisbon Europe/Lisbon ++Europe/Ljubljana Europe/Belgrade ++Europe/London Europe/London ++Europe/Luxembourg Europe/Luxembourg ++Europe/Madrid Europe/Madrid ++Europe/Malta Europe/Malta ++Europe/Mariehamn Europe/Helsinki ++Europe/Minsk Europe/Minsk ++Europe/Monaco Europe/Monaco ++Europe/Moscow Europe/Moscow ++Europe/Nicosia Asia/Nicosia ++Europe/Oslo Europe/Oslo ++Europe/Paris Europe/Paris ++Europe/Podgorica Europe/Belgrade ++Europe/Prague Europe/Prague ++Europe/Riga Europe/Riga ++Europe/Rome Europe/Rome ++Europe/Samara Europe/Samara ++Europe/San_Marino Europe/Rome ++Europe/Sarajevo Europe/Belgrade ++Europe/Simferopol Europe/Simferopol ++Europe/Skopje Europe/Belgrade ++Europe/Sofia Europe/Sofia ++Europe/Stockholm Europe/Stockholm ++Europe/Tallinn Europe/Tallinn ++Europe/Tirane Europe/Tirane ++Europe/Vaduz Europe/Vaduz ++Europe/Vatican Europe/Rome ++Europe/Vienna Europe/Vienna ++Europe/Vilnius Europe/Vilnius ++Europe/Warsaw Europe/Warsaw ++Europe/Zagreb Europe/Belgrade ++Europe/Zurich Europe/Zurich ++FALKST2 Atlantic/South_Georgia ++FALKST2FALKDT Atlantic/South_Georgia ++Factory GMT ++GB Europe/London ++GB-Eire Europe/London ++GMT GMT ++GMT0 GMT ++GMT0BST Europe/London ++GMT0BST-1 Europe/London ++GMT0WET Europe/Lisbon ++GRNLNDST3 America/Buenos_Aires ++GRNLNDST3GRNLNDDT America/Godthab ++Greenwich GMT ++HST Pacific/Honolulu ++HST10 Pacific/Honolulu ++HST10HDT America/Adak ++Hongkong Asia/Hong_Kong ++Iceland Atlantic/Reykjavik ++Indian/Antananarivo Indian/Antananarivo ++Indian/Chagos Indian/Chagos ++Indian/Christmas Indian/Christmas ++Indian/Cocos Indian/Cocos ++Indian/Comoro Indian/Comoro ++Indian/Kerguelen Indian/Kerguelen ++Indian/Mahe Indian/Mahe ++Indian/Maldives Indian/Maldives ++Indian/Mauritius Indian/Mauritius ++Indian/Mayotte Indian/Mayotte ++Indian/Reunion Indian/Reunion ++Iran Asia/Tehran ++Israel Asia/Jerusalem ++JST-9 Asia/Tokyo ++JST-9JSTDT Asia/Tokyo ++Jamaica America/Jamaica ++Japan Asia/Tokyo ++KORST-9 Asia/Seoul ++KORST-9KORDT Asia/Seoul ++Kwajalein Pacific/Kwajalein ++Libya Africa/Tripoli ++MEST-2 Europe/Istanbul ++MEST-2MEDT Europe/Istanbul ++MEST-3 Asia/Riyadh ++MEST-3MEDT Europe/Moscow ++MET Europe/Paris ++MET-11 Pacific/Guadalcanal ++MET-11METDT Asia/Magadan ++MET-1MEST Europe/Paris ++MET-1MST-2 Europe/Berlin ++MEZ-1MESZ Europe/Berlin ++MEZ-1MESZ-2 Europe/Berlin ++MSK-3MSD Europe/Moscow ++MST America/Phoenix ++MST7 America/Phoenix ++MST7MDT America/Denver ++Mexico/BajaNorte America/Tijuana ++Mexico/BajaSur America/Mazatlan ++Mexico/General America/Mexico_City ++Mideast/Riyadh87 Asia/Riyadh87 ++Mideast/Riyadh88 Asia/Riyadh88 ++Mideast/Riyadh89 Asia/Riyadh89 ++NFT-1 Africa/Algiers ++NFT-1DFT Europe/Paris ++NFT-1DST Europe/Paris ++NZ Pacific/Auckland ++NZ-CHAT Pacific/Chatham ++NZST-12 Pacific/Fiji ++NZST-12NZDT Pacific/Auckland ++Navajo America/Denver ++PAKST-5 Asia/Karachi ++PAKST-5PAKDT Asia/Yekaterinburg ++PRC Asia/Shanghai ++PST8 Pacific/Pitcairn ++PST8PDT America/Los_Angeles ++PST8PDT7 America/Tijuana ++Pacific/Apia Pacific/Apia ++Pacific/Auckland Pacific/Auckland ++Pacific/Chatham Pacific/Chatham ++Pacific/Easter Pacific/Easter ++Pacific/Efate Pacific/Efate ++Pacific/Enderbury Pacific/Enderbury ++Pacific/Fakaofo Pacific/Fakaofo ++Pacific/Fiji Pacific/Fiji ++Pacific/Funafuti Pacific/Funafuti ++Pacific/Galapagos Pacific/Galapagos ++Pacific/Gambier Pacific/Gambier ++Pacific/Guadalcanal Pacific/Guadalcanal ++Pacific/Guam Pacific/Guam ++Pacific/Honolulu Pacific/Honolulu ++Pacific/Kiritimati Pacific/Kiritimati ++Pacific/Kosrae Pacific/Kosrae ++Pacific/Majuro Pacific/Majuro ++Pacific/Marquesas Pacific/Marquesas ++Pacific/Nauru Pacific/Nauru ++Pacific/Niue Pacific/Niue ++Pacific/Norfolk Pacific/Norfolk ++Pacific/Noumea Pacific/Noumea ++Pacific/Pago_Pago Pacific/Pago_Pago ++Pacific/Palau Pacific/Palau ++Pacific/Pitcairn Pacific/Pitcairn ++Pacific/Ponape Pacific/Ponape ++Pacific/Port_Moresby Pacific/Port_Moresby ++Pacific/Rarotonga Pacific/Rarotonga ++Pacific/Saipan Pacific/Saipan ++Pacific/Samoa Pacific/Pago_Pago ++Pacific/Tahiti Pacific/Tahiti ++Pacific/Tarawa Pacific/Tarawa ++Pacific/Tongatapu Pacific/Tongatapu ++Pacific/Truk Pacific/Truk ++Pacific/Wake Pacific/Wake ++Pacific/Wallis Pacific/Wallis ++Poland Europe/Warsaw ++Portugal Europe/Lisbon ++ROC Asia/Taipei ++ROK Asia/Seoul ++SAUST-3 Asia/Riyadh ++SAUST-3SAUDT Europe/Moscow ++Singapore Asia/Singapore ++SystemV/AST4ADT America/Thule ++SystemV/CST6CDT America/Chicago ++SystemV/EST5EDT America/New_York ++SystemV/MST7MDT America/Denver ++SystemV/PST8PDT America/Los_Angeles ++SystemV/YST9YDT America/Anchorage ++TAIST-8 Asia/Taipei ++TAIST-8TAIDT Asia/Irkutsk ++TASHST-6 Asia/Dacca ++TASHST-6TASHDT Asia/Novosibirsk ++THAIST-7 Asia/Bangkok ++THAIST-7THAIDT Asia/Krasnoyarsk ++Turkey Europe/Istanbul ++UCT UTC ++US/Alaska America/Anchorage ++US/Aleutian America/Adak ++US/Arizona America/Phoenix ++US/Central America/Chicago ++US/East-Indiana America/Indiana/Indianapolis ++US/Eastern America/New_York ++US/Hawaii Pacific/Honolulu ++US/Indiana-Starke America/Indiana/Knox ++US/Michigan America/New_York ++US/Mountain America/Denver ++US/Pacific America/Los_Angeles ++US/Pacific-New America/Los_Angeles ++US/Samoa Pacific/Pago_Pago ++USAST-2 Africa/Johannesburg ++USAST-2USADT Europe/Istanbul ++UTC UTC ++UYT3UYST America/Montevideo ++Universal UTC ++W-SU Europe/Moscow ++WAUST-8 Australia/Perth ++WAUST-8WAUDT Australia/Perth ++WET WET ++WET-2 Africa/Johannesburg ++WET-2WET Europe/Helsinki ++WST-4 Asia/Dubai ++WST-4WDT Europe/Samara ++Zulu UTC +--- ./jdk/src/aix/native/java/net/aix_close.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/native/java/net/aix_close.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,488 @@ ++/* ++ * Copyright (c) 2001, 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. ++ */ ++ ++/* ++ * This file contains implementations of NET_... functions. The NET_.. functions are ++ * wrappers for common file- and socket functions plus provisions for non-blocking IO. ++ * ++ * (basically, the layers remember all file descriptors waiting for a particular fd; ++ * all threads waiting on a certain fd can be woken up by sending them a signal; this ++ * is done e.g. when the fd is closed.) ++ * ++ * This was originally copied from the linux_close.c implementation. ++ * ++ * Side Note: This coding needs initialization. Under Linux this is done ++ * automatically via __attribute((constructor)), on AIX this is done manually ++ * (see aix_close_init). ++ * ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++/* ++ * Stack allocated by thread when doing blocking operation ++ */ ++typedef struct threadEntry { ++ pthread_t thr; /* this thread */ ++ struct threadEntry *next; /* next thread */ ++ int intr; /* interrupted */ ++} threadEntry_t; ++ ++/* ++ * Heap allocated during initialized - one entry per fd ++ */ ++typedef struct { ++ pthread_mutex_t lock; /* fd lock */ ++ threadEntry_t *threads; /* threads blocked on fd */ ++} fdEntry_t; ++ ++/* ++ * Signal to unblock thread ++ */ ++static int sigWakeup = (SIGRTMAX - 1); ++ ++/* ++ * The fd table and the number of file descriptors ++ */ ++static fdEntry_t *fdTable = NULL; ++static int fdCount = 0; ++ ++/* ++ * Null signal handler ++ */ ++static void sig_wakeup(int sig) { ++} ++ ++/* ++ * Initialization routine (executed when library is loaded) ++ * Allocate fd tables and sets up signal handler. ++ * ++ * On AIX we don't have __attribute((constructor)) so we need to initialize ++ * manually (from JNI_OnLoad() in 'src/share/native/java/net/net_util.c') ++ */ ++void aix_close_init() { ++ struct rlimit nbr_files; ++ sigset_t sigset; ++ struct sigaction sa; ++ ++ /* Check already initialized */ ++ if (fdCount > 0 && fdTable != NULL) { ++ return; ++ } ++ ++ /* ++ * Allocate table based on the maximum number of ++ * file descriptors. ++ */ ++ if (-1 == getrlimit(RLIMIT_NOFILE, &nbr_files)) { ++ fprintf(stderr, "library initialization failed - " ++ "unable to get max # of allocated fds\n"); ++ abort(); ++ } ++ fdCount = nbr_files.rlim_max; ++ /* ++ * We have a conceptual problem here, when the number of files is ++ * unlimited. As a kind of workaround, we ensure the table is big ++ * enough for handle even a large number of files. Since SAP itself ++ * recommends a limit of 32000 files, we just use 64000 as 'infinity'. ++ */ ++ if (nbr_files.rlim_max == RLIM_INFINITY) { ++ fdCount = 64000; ++ } ++ fdTable = (fdEntry_t *)calloc(fdCount, sizeof(fdEntry_t)); ++ if (fdTable == NULL) { ++ fprintf(stderr, "library initialization failed - " ++ "unable to allocate file descriptor table - out of memory"); ++ abort(); ++ } ++ ++ { ++ int i; ++ for (i=0; i < fdCount; i++) { ++ pthread_mutex_init(&fdTable[i].lock, NULL); ++ } ++ } ++ ++ /* ++ * Setup the signal handler ++ */ ++ sa.sa_handler = sig_wakeup; ++ sa.sa_flags = 0; ++ sigemptyset(&sa.sa_mask); ++ sigaction(sigWakeup, &sa, NULL); ++ ++ sigemptyset(&sigset); ++ sigaddset(&sigset, sigWakeup); ++ sigprocmask(SIG_UNBLOCK, &sigset, NULL); ++} ++ ++/* ++ * Return the fd table for this fd or NULL is fd out ++ * of range. ++ */ ++static inline fdEntry_t *getFdEntry(int fd) ++{ ++ if (fd < 0 || fd >= fdCount) { ++ return NULL; ++ } ++ return &fdTable[fd]; ++} ++ ++/* ++ * Start a blocking operation :- ++ * Insert thread onto thread list for the fd. ++ */ ++static inline void startOp(fdEntry_t *fdEntry, threadEntry_t *self) ++{ ++ self->thr = pthread_self(); ++ self->intr = 0; ++ ++ pthread_mutex_lock(&(fdEntry->lock)); ++ { ++ self->next = fdEntry->threads; ++ fdEntry->threads = self; ++ } ++ pthread_mutex_unlock(&(fdEntry->lock)); ++} ++ ++/* ++ * End a blocking operation :- ++ * Remove thread from thread list for the fd ++ * If fd has been interrupted then set errno to EBADF ++ */ ++static inline void endOp ++ (fdEntry_t *fdEntry, threadEntry_t *self) ++{ ++ int orig_errno = errno; ++ pthread_mutex_lock(&(fdEntry->lock)); ++ { ++ threadEntry_t *curr, *prev=NULL; ++ curr = fdEntry->threads; ++ while (curr != NULL) { ++ if (curr == self) { ++ if (curr->intr) { ++ orig_errno = EBADF; ++ } ++ if (prev == NULL) { ++ fdEntry->threads = curr->next; ++ } else { ++ prev->next = curr->next; ++ } ++ break; ++ } ++ prev = curr; ++ curr = curr->next; ++ } ++ } ++ pthread_mutex_unlock(&(fdEntry->lock)); ++ errno = orig_errno; ++} ++ ++/* ++ * Close or dup2 a file descriptor ensuring that all threads blocked on ++ * the file descriptor are notified via a wakeup signal. ++ * ++ * fd1 < 0 => close(fd2) ++ * fd1 >= 0 => dup2(fd1, fd2) ++ * ++ * Returns -1 with errno set if operation fails. ++ */ ++static int closefd(int fd1, int fd2) { ++ int rv, orig_errno; ++ fdEntry_t *fdEntry = getFdEntry(fd2); ++ if (fdEntry == NULL) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ /* ++ * Lock the fd to hold-off additional I/O on this fd. ++ */ ++ pthread_mutex_lock(&(fdEntry->lock)); ++ ++ { ++ /* On fast machines we see that we enter dup2 before the ++ * accepting thread had a chance to get and process the signal. ++ * So in case we woke a thread up, give it some time to cope. ++ * Also see https://bugs.openjdk.java.net/browse/JDK-8006395 */ ++ int num_woken = 0; ++ ++ /* ++ * Send a wakeup signal to all threads blocked on this ++ * file descriptor. ++ */ ++ threadEntry_t *curr = fdEntry->threads; ++ while (curr != NULL) { ++ curr->intr = 1; ++ pthread_kill( curr->thr, sigWakeup ); ++ num_woken ++; ++ curr = curr->next; ++ } ++ ++ if (num_woken > 0) { ++ usleep(num_woken * 50); ++ } ++ ++ /* ++ * And close/dup the file descriptor ++ * (restart if interrupted by signal) ++ */ ++ do { ++ if (fd1 < 0) { ++ rv = close(fd2); ++ } else { ++ rv = dup2(fd1, fd2); ++ } ++ } while (rv == -1 && errno == EINTR); ++ } ++ ++ /* ++ * Unlock without destroying errno ++ */ ++ orig_errno = errno; ++ pthread_mutex_unlock(&(fdEntry->lock)); ++ errno = orig_errno; ++ ++ return rv; ++} ++ ++/* ++ * Wrapper for dup2 - same semantics as dup2 system call except ++ * that any threads blocked in an I/O system call on fd2 will be ++ * preempted and return -1/EBADF; ++ */ ++int NET_Dup2(int fd, int fd2) { ++ if (fd < 0) { ++ errno = EBADF; ++ return -1; ++ } ++ return closefd(fd, fd2); ++} ++ ++/* ++ * Wrapper for close - same semantics as close system call ++ * except that any threads blocked in an I/O on fd will be ++ * preempted and the I/O system call will return -1/EBADF. ++ */ ++int NET_SocketClose(int fd) { ++ return closefd(-1, fd); ++} ++ ++/************** Basic I/O operations here ***************/ ++ ++/* ++ * Macro to perform a blocking IO operation. Restarts ++ * automatically if interrupted by signal (other than ++ * our wakeup signal) ++ */ ++#define BLOCKING_IO_RETURN_INT(FD, FUNC) { \ ++ int ret; \ ++ threadEntry_t self; \ ++ fdEntry_t *fdEntry = getFdEntry(FD); \ ++ if (fdEntry == NULL) { \ ++ errno = EBADF; \ ++ return -1; \ ++ } \ ++ do { \ ++ startOp(fdEntry, &self); \ ++ ret = FUNC; \ ++ endOp(fdEntry, &self); \ ++ } while (ret == -1 && errno == EINTR); \ ++ return ret; \ ++} ++ ++int NET_Read(int s, void* buf, size_t len) { ++ BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, 0) ); ++} ++ ++int NET_ReadV(int s, const struct iovec * vector, int count) { ++ BLOCKING_IO_RETURN_INT( s, readv(s, vector, count) ); ++} ++ ++int NET_RecvFrom(int s, void *buf, int len, unsigned int flags, ++ struct sockaddr *from, int *fromlen) { ++ socklen_t socklen = *fromlen; ++ BLOCKING_IO_RETURN_INT( s, recvfrom(s, buf, len, flags, from, &socklen) ); ++ *fromlen = socklen; ++} ++ ++int NET_Send(int s, void *msg, int len, unsigned int flags) { ++ BLOCKING_IO_RETURN_INT( s, send(s, msg, len, flags) ); ++} ++ ++int NET_WriteV(int s, const struct iovec * vector, int count) { ++ BLOCKING_IO_RETURN_INT( s, writev(s, vector, count) ); ++} ++ ++int NET_SendTo(int s, const void *msg, int len, unsigned int ++ flags, const struct sockaddr *to, int tolen) { ++ BLOCKING_IO_RETURN_INT( s, sendto(s, msg, len, flags, to, tolen) ); ++} ++ ++int NET_Accept(int s, struct sockaddr *addr, int *addrlen) { ++ socklen_t socklen = *addrlen; ++ BLOCKING_IO_RETURN_INT( s, accept(s, addr, &socklen) ); ++ *addrlen = socklen; ++} ++ ++int NET_Connect(int s, struct sockaddr *addr, int addrlen) { ++ int crc = -1, prc = -1; ++ threadEntry_t self; ++ fdEntry_t* fdEntry = getFdEntry(s); ++ ++ if (fdEntry == NULL) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ /* On AIX, when the system call connect() is interrupted, the connection ++ * is not aborted and it will be established asynchronously by the kernel. ++ * Hence, no need to restart connect() when EINTR is received ++ */ ++ startOp(fdEntry, &self); ++ crc = connect(s, addr, addrlen); ++ endOp(fdEntry, &self); ++ ++ if (crc == -1 && errno == EINTR) { ++ struct pollfd s_pollfd; ++ int sockopt_arg = 0; ++ socklen_t len; ++ ++ s_pollfd.fd = s; ++ s_pollfd.events = POLLOUT | POLLERR; ++ ++ /* poll the file descriptor */ ++ do { ++ startOp(fdEntry, &self); ++ prc = poll(&s_pollfd, 1, -1); ++ endOp(fdEntry, &self); ++ } while (prc == -1 && errno == EINTR); ++ ++ if (prc < 0) ++ return prc; ++ ++ len = sizeof(sockopt_arg); ++ ++ /* Check whether the connection has been established */ ++ if (getsockopt(s, SOL_SOCKET, SO_ERROR, &sockopt_arg, &len) == -1) ++ return -1; ++ ++ if (sockopt_arg != 0 ) { ++ errno = sockopt_arg; ++ return -1; ++ } ++ } else { ++ return crc; ++ } ++ ++ /* At this point, fd is connected. Set successful return code */ ++ return 0; ++} ++ ++#ifndef USE_SELECT ++int NET_Poll(struct pollfd *ufds, unsigned int nfds, int timeout) { ++ BLOCKING_IO_RETURN_INT( ufds[0].fd, poll(ufds, nfds, timeout) ); ++} ++#else ++int NET_Select(int s, fd_set *readfds, fd_set *writefds, ++ fd_set *exceptfds, struct timeval *timeout) { ++ BLOCKING_IO_RETURN_INT( s-1, ++ select(s, readfds, writefds, exceptfds, timeout) ); ++} ++#endif ++ ++/* ++ * Wrapper for poll(s, timeout). ++ * Auto restarts with adjusted timeout if interrupted by ++ * signal other than our wakeup signal. ++ */ ++int NET_Timeout(int s, long timeout) { ++ long prevtime = 0, newtime; ++ struct timeval t; ++ fdEntry_t *fdEntry = getFdEntry(s); ++ ++ /* ++ * Check that fd hasn't been closed. ++ */ ++ if (fdEntry == NULL) { ++ errno = EBADF; ++ return -1; ++ } ++ ++ /* ++ * Pick up current time as may need to adjust timeout ++ */ ++ if (timeout > 0) { ++ gettimeofday(&t, NULL); ++ prevtime = t.tv_sec * 1000 + t.tv_usec / 1000; ++ } ++ ++ for(;;) { ++ struct pollfd pfd; ++ int rv; ++ threadEntry_t self; ++ ++ /* ++ * Poll the fd. If interrupted by our wakeup signal ++ * errno will be set to EBADF. ++ */ ++ pfd.fd = s; ++ pfd.events = POLLIN | POLLERR; ++ ++ startOp(fdEntry, &self); ++ rv = poll(&pfd, 1, timeout); ++ endOp(fdEntry, &self); ++ ++ /* ++ * If interrupted then adjust timeout. If timeout ++ * has expired return 0 (indicating timeout expired). ++ */ ++ if (rv < 0 && errno == EINTR) { ++ if (timeout > 0) { ++ gettimeofday(&t, NULL); ++ newtime = t.tv_sec * 1000 + t.tv_usec / 1000; ++ timeout -= newtime - prevtime; ++ if (timeout <= 0) { ++ return 0; ++ } ++ prevtime = newtime; ++ } ++ } else { ++ return rv; ++ } ++ ++ } ++} +--- ./jdk/src/aix/native/sun/nio/ch/AixNativeThread.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/native/sun/nio/ch/AixNativeThread.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,76 @@ ++/* ++ * 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 ++ * 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 ++#include ++#include "jni.h" ++#include "jni_util.h" ++#include "jvm.h" ++#include "jlong.h" ++#include "sun_nio_ch_NativeThread.h" ++ ++#include ++#include ++ ++/* Also defined in src/aix/native/java/net/aix_close.c */ ++#define INTERRUPT_SIGNAL (SIGRTMAX - 1) ++ ++static void ++nullHandler(int sig) ++{ ++} ++ ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_NativeThread_init(JNIEnv *env, jclass cl) ++{ ++ /* Install the null handler for INTERRUPT_SIGNAL. This might overwrite the ++ * handler previously installed by java/net/aix_close.c, but that's okay ++ * since neither handler actually does anything. We install our own ++ * handler here simply out of paranoia; ultimately the two mechanisms ++ * should somehow be unified, perhaps within the VM. ++ */ ++ ++ sigset_t ss; ++ struct sigaction sa, osa; ++ sa.sa_handler = nullHandler; ++ sa.sa_flags = 0; ++ sigemptyset(&sa.sa_mask); ++ if (sigaction(INTERRUPT_SIGNAL, &sa, &osa) < 0) ++ JNU_ThrowIOExceptionWithLastError(env, "sigaction"); ++} ++ ++JNIEXPORT jlong JNICALL ++Java_sun_nio_ch_NativeThread_current(JNIEnv *env, jclass cl) ++{ ++ return (long)pthread_self(); ++} ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_NativeThread_signal(JNIEnv *env, jclass cl, jlong thread) ++{ ++ if (pthread_kill((pthread_t)thread, INTERRUPT_SIGNAL)) ++ JNU_ThrowIOExceptionWithLastError(env, "Thread signal failed"); ++} +--- ./jdk/src/aix/native/sun/nio/ch/AixPollPort.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/native/sun/nio/ch/AixPollPort.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,175 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2012 SAP AG. 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 "jni.h" ++#include "jni_util.h" ++#include "jvm.h" ++#include "jlong.h" ++ ++#include "sun_nio_ch_AixPollPort.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* Initially copied from src/solaris/native/sun/nio/ch/nio_util.h */ ++#define RESTARTABLE(_cmd, _result) do { \ ++ do { \ ++ _result = _cmd; \ ++ } while((_result == -1) && (errno == EINTR)); \ ++} while(0) ++ ++typedef pollset_t pollset_create_func(int maxfd); ++typedef int pollset_destroy_func(pollset_t ps); ++typedef int pollset_ctl_func(pollset_t ps, struct poll_ctl *pollctl_array, int array_length); ++typedef int pollset_poll_func(pollset_t ps, struct pollfd *polldata_array, int array_length, int timeout); ++static pollset_create_func* _pollset_create = NULL; ++static pollset_destroy_func* _pollset_destroy = NULL; ++static pollset_ctl_func* _pollset_ctl = NULL; ++static pollset_poll_func* _pollset_poll = NULL; ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_AixPollPort_init(JNIEnv* env, jclass this) { ++ _pollset_create = (pollset_create_func*) dlsym(RTLD_DEFAULT, "pollset_create"); ++ _pollset_destroy = (pollset_destroy_func*) dlsym(RTLD_DEFAULT, "pollset_destroy"); ++ _pollset_ctl = (pollset_ctl_func*) dlsym(RTLD_DEFAULT, "pollset_ctl"); ++ _pollset_poll = (pollset_poll_func*) dlsym(RTLD_DEFAULT, "pollset_poll"); ++ if (_pollset_create == NULL || _pollset_destroy == NULL || ++ _pollset_ctl == NULL || _pollset_poll == NULL) { ++ JNU_ThrowInternalError(env, "unable to get address of pollset functions"); ++ } ++} ++ ++JNIEXPORT jint JNICALL ++Java_sun_nio_ch_AixPollPort_eventSize(JNIEnv* env, jclass this) { ++ return sizeof(struct pollfd); ++} ++ ++JNIEXPORT jint JNICALL ++Java_sun_nio_ch_AixPollPort_eventsOffset(JNIEnv* env, jclass this) { ++ return offsetof(struct pollfd, events); ++} ++ ++JNIEXPORT jint JNICALL ++Java_sun_nio_ch_AixPollPort_reventsOffset(JNIEnv* env, jclass this) { ++ return offsetof(struct pollfd, revents); ++} ++ ++JNIEXPORT jint JNICALL ++Java_sun_nio_ch_AixPollPort_fdOffset(JNIEnv* env, jclass this) { ++ return offsetof(struct pollfd, fd); ++} ++ ++JNIEXPORT jint JNICALL ++Java_sun_nio_ch_AixPollPort_pollsetCreate(JNIEnv *env, jclass c) { ++ /* pollset_create can take the maximum number of fds, but we ++ * cannot predict this number so we leave it at OPEN_MAX. */ ++ pollset_t ps = _pollset_create(-1); ++ if (ps < 0) { ++ JNU_ThrowIOExceptionWithLastError(env, "pollset_create failed"); ++ } ++ return (int)ps; ++} ++ ++JNIEXPORT jint JNICALL ++Java_sun_nio_ch_AixPollPort_pollsetCtl(JNIEnv *env, jclass c, jint ps, ++ jint opcode, jint fd, jint events) { ++ struct poll_ctl event; ++ int res; ++ ++ event.cmd = opcode; ++ event.events = events; ++ event.fd = fd; ++ ++ RESTARTABLE(_pollset_ctl((pollset_t)ps, &event, 1 /* length */), res); ++ ++ return (res == 0) ? 0 : errno; ++} ++ ++JNIEXPORT jint JNICALL ++Java_sun_nio_ch_AixPollPort_pollsetPoll(JNIEnv *env, jclass c, ++ jint ps, jlong address, jint numfds) { ++ struct pollfd *events = jlong_to_ptr(address); ++ int res; ++ ++ RESTARTABLE(_pollset_poll(ps, events, numfds, -1), res); ++ if (res < 0) { ++ JNU_ThrowIOExceptionWithLastError(env, "pollset_poll failed"); ++ } ++ return res; ++} ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_AixPollPort_pollsetDestroy(JNIEnv *env, jclass c, jint ps) { ++ int res; ++ RESTARTABLE(_pollset_destroy((pollset_t)ps), res); ++} ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_AixPollPort_socketpair(JNIEnv* env, jclass clazz, jintArray sv) { ++ int sp[2]; ++ if (socketpair(PF_UNIX, SOCK_STREAM, 0, sp) == -1) { ++ JNU_ThrowIOExceptionWithLastError(env, "socketpair failed"); ++ } else { ++ jint res[2]; ++ res[0] = (jint)sp[0]; ++ res[1] = (jint)sp[1]; ++ (*env)->SetIntArrayRegion(env, sv, 0, 2, &res[0]); ++ } ++} ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_AixPollPort_interrupt(JNIEnv *env, jclass c, jint fd) { ++ int res; ++ int buf[1]; ++ buf[0] = 1; ++ RESTARTABLE(write(fd, buf, 1), res); ++ if (res < 0) { ++ JNU_ThrowIOExceptionWithLastError(env, "write failed"); ++ } ++} ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_AixPollPort_drain1(JNIEnv *env, jclass cl, jint fd) { ++ int res; ++ char buf[1]; ++ RESTARTABLE(read(fd, buf, 1), res); ++ if (res < 0) { ++ JNU_ThrowIOExceptionWithLastError(env, "drain1 failed"); ++ } ++} ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_AixPollPort_close0(JNIEnv *env, jclass c, jint fd) { ++ int res; ++ RESTARTABLE(close(fd), res); ++} +--- ./jdk/src/aix/native/sun/nio/fs/AixNativeDispatcher.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/native/sun/nio/fs/AixNativeDispatcher.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,227 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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 ++#include ++#include ++#include ++ ++#include "jni.h" ++#include "jni_util.h" ++ ++#include "sun_nio_fs_AixNativeDispatcher.h" ++ ++static jfieldID entry_name; ++static jfieldID entry_dir; ++static jfieldID entry_fstype; ++static jfieldID entry_options; ++ ++static jclass entry_cls; ++ ++/** ++ * Call this to throw an internal UnixException when a system/library ++ * call fails ++ */ ++static void throwUnixException(JNIEnv* env, int errnum) { ++ jobject x = JNU_NewObjectByName(env, "sun/nio/fs/UnixException", ++ "(I)V", errnum); ++ if (x != NULL) { ++ (*env)->Throw(env, x); ++ } ++} ++ ++/** ++ * Initialization ++ */ ++JNIEXPORT jint JNICALL ++Java_sun_nio_fs_AixNativeDispatcher_init(JNIEnv* env, jclass this) ++{ ++ jint flags = 0; ++ jclass clazz; ++ ++ clazz = (*env)->FindClass(env, "sun/nio/fs/UnixMountEntry"); ++ if (clazz == NULL) { ++ return 0; ++ } ++ entry_name = (*env)->GetFieldID(env, clazz, "name", "[B"); ++ entry_dir = (*env)->GetFieldID(env, clazz, "dir", "[B"); ++ entry_fstype = (*env)->GetFieldID(env, clazz, "fstype", "[B"); ++ entry_options = (*env)->GetFieldID(env, clazz, "opts", "[B"); ++ entry_cls = (*env)->NewGlobalRef(env, clazz); ++ ++ return 0; ++} ++ ++/** ++ * Special implementation of getextmntent (see SolarisNativeDispatcher.c) ++ * that returns all entries at once. ++ */ ++JNIEXPORT jobjectArray JNICALL ++Java_sun_nio_fs_AixNativeDispatcher_getmntctl(JNIEnv* env, jclass this) ++{ ++ int must_free_buf = 0; ++ char stack_buf[1024]; ++ char* buffer = stack_buf; ++ size_t buffer_size = 1024; ++ int num_entries; ++ int i; ++ jobjectArray ret; ++ struct vmount * vm; ++ ++ for (i = 0; i < 5; i++) { ++ num_entries = mntctl(MCTL_QUERY, buffer_size, buffer); ++ if (num_entries != 0) { ++ break; ++ } ++ if (must_free_buf) { ++ free(buffer); ++ } ++ buffer_size *= 8; ++ buffer = malloc(buffer_size); ++ must_free_buf = 1; ++ } ++ /* Treat zero entries like errors. */ ++ if (num_entries <= 0) { ++ if (must_free_buf) { ++ free(buffer); ++ } ++ throwUnixException(env, errno); ++ return NULL; ++ } ++ ret = (*env)->NewObjectArray(env, num_entries, entry_cls, NULL); ++ if (ret == NULL) { ++ if (must_free_buf) { ++ free(buffer); ++ } ++ return NULL; ++ } ++ vm = (struct vmount*)buffer; ++ for (i = 0; i < num_entries; i++) { ++ jsize len; ++ jbyteArray bytes; ++ const char* fstype; ++ /* We set all relevant attributes so there is no need to call constructor. */ ++ jobject entry = (*env)->AllocObject(env, entry_cls); ++ if (entry == NULL) { ++ if (must_free_buf) { ++ free(buffer); ++ } ++ return NULL; ++ } ++ (*env)->SetObjectArrayElement(env, ret, i, entry); ++ ++ /* vm->vmt_data[...].vmt_size is 32 bit aligned and also includes NULL byte. */ ++ /* Since we only need the characters, it is necessary to check string size manually. */ ++ len = strlen((char*)vm + vm->vmt_data[VMT_OBJECT].vmt_off); ++ bytes = (*env)->NewByteArray(env, len); ++ if (bytes == NULL) { ++ if (must_free_buf) { ++ free(buffer); ++ } ++ return NULL; ++ } ++ (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)((char *)vm + vm->vmt_data[VMT_OBJECT].vmt_off)); ++ (*env)->SetObjectField(env, entry, entry_name, bytes); ++ ++ len = strlen((char*)vm + vm->vmt_data[VMT_STUB].vmt_off); ++ bytes = (*env)->NewByteArray(env, len); ++ if (bytes == NULL) { ++ if (must_free_buf) { ++ free(buffer); ++ } ++ return NULL; ++ } ++ (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)((char *)vm + vm->vmt_data[VMT_STUB].vmt_off)); ++ (*env)->SetObjectField(env, entry, entry_dir, bytes); ++ ++ switch (vm->vmt_gfstype) { ++ case MNT_J2: ++ fstype = "jfs2"; ++ break; ++ case MNT_NAMEFS: ++ fstype = "namefs"; ++ break; ++ case MNT_NFS: ++ fstype = "nfs"; ++ break; ++ case MNT_JFS: ++ fstype = "jfs"; ++ break; ++ case MNT_CDROM: ++ fstype = "cdrom"; ++ break; ++ case MNT_PROCFS: ++ fstype = "procfs"; ++ break; ++ case MNT_NFS3: ++ fstype = "nfs3"; ++ break; ++ case MNT_AUTOFS: ++ fstype = "autofs"; ++ break; ++ case MNT_UDF: ++ fstype = "udfs"; ++ break; ++ case MNT_NFS4: ++ fstype = "nfs4"; ++ break; ++ case MNT_CIFS: ++ fstype = "smbfs"; ++ break; ++ default: ++ fstype = "unknown"; ++ } ++ len = strlen(fstype); ++ bytes = (*env)->NewByteArray(env, len); ++ if (bytes == NULL) { ++ if (must_free_buf) { ++ free(buffer); ++ } ++ return NULL; ++ } ++ (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)fstype); ++ (*env)->SetObjectField(env, entry, entry_fstype, bytes); ++ ++ len = strlen((char*)vm + vm->vmt_data[VMT_ARGS].vmt_off); ++ bytes = (*env)->NewByteArray(env, len); ++ if (bytes == NULL) { ++ if (must_free_buf) { ++ free(buffer); ++ } ++ return NULL; ++ } ++ (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)((char *)vm + vm->vmt_data[VMT_ARGS].vmt_off)); ++ (*env)->SetObjectField(env, entry, entry_options, bytes); ++ ++ /* goto the next vmount structure: */ ++ vm = (struct vmount *)((char *)vm + vm->vmt_length); ++ } ++ ++ if (must_free_buf) { ++ free(buffer); ++ } ++ return ret; ++} +--- ./jdk/src/aix/native/sun/tools/attach/AixVirtualMachine.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/native/sun/tools/attach/AixVirtualMachine.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,283 @@ ++/* ++ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright 2013 SAP AG. 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 "jni.h" ++#include "jni_util.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* ++ * Based on 'LinuxVirtualMachine.c'. Non-relevant code has been removed and all ++ * occurrences of the string "Linux" have been replaced by "Aix". ++ */ ++ ++#include "sun_tools_attach_AixVirtualMachine.h" ++ ++#define RESTARTABLE(_cmd, _result) do { \ ++ do { \ ++ _result = _cmd; \ ++ } while((_result == -1) && (errno == EINTR)); \ ++} while(0) ++ ++ ++/* ++ * Class: sun_tools_attach_AixVirtualMachine ++ * Method: socket ++ * Signature: ()I ++ */ ++JNIEXPORT jint JNICALL Java_sun_tools_attach_AixVirtualMachine_socket ++ (JNIEnv *env, jclass cls) ++{ ++ int fd = socket(PF_UNIX, SOCK_STREAM, 0); ++ if (fd == -1) { ++ JNU_ThrowIOExceptionWithLastError(env, "socket"); ++ } ++ /* added time out values */ ++ else { ++ struct timeval tv; ++ tv.tv_sec = 2 * 60; ++ tv.tv_usec = 0; ++ ++ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); ++ setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); ++ } ++ return (jint)fd; ++} ++ ++/* ++ * Class: sun_tools_attach_AixVirtualMachine ++ * Method: connect ++ * Signature: (ILjava/lang/String;)I ++ */ ++JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_connect ++ (JNIEnv *env, jclass cls, jint fd, jstring path) ++{ ++ jboolean isCopy; ++ const char* p = GetStringPlatformChars(env, path, &isCopy); ++ if (p != NULL) { ++ struct sockaddr_un addr; ++ int err = 0; ++ ++ /* added missing structure initialization */ ++ memset(&addr,0, sizeof(addr)); ++ addr.sun_family = AF_UNIX; ++ strcpy(addr.sun_path, p); ++ /* We must call bind with the actual socketaddr length. This is obligatory for AS400. */ ++ if (connect(fd, (struct sockaddr*)&addr, SUN_LEN(&addr)) == -1) { ++ err = errno; ++ } ++ ++ if (isCopy) { ++ JNU_ReleaseStringPlatformChars(env, path, p); ++ } ++ ++ /* ++ * If the connect failed then we throw the appropriate exception ++ * here (can't throw it before releasing the string as can't call ++ * JNI with pending exception) ++ */ ++ if (err != 0) { ++ if (err == ENOENT) { ++ JNU_ThrowByName(env, "java/io/FileNotFoundException", NULL); ++ } else { ++ char* msg = strdup(strerror(err)); ++ JNU_ThrowIOException(env, msg); ++ if (msg != NULL) { ++ free(msg); ++ } ++ } ++ } ++ } ++} ++ ++ ++/* ++ * Structure and callback function used to send a QUIT signal to all ++ * children of a given process ++ */ ++typedef struct { ++ pid_t ppid; ++} SendQuitContext; ++ ++static void SendQuitCallback(const pid_t pid, void* user_data) { ++ SendQuitContext* context = (SendQuitContext*)user_data; ++ pid_t parent = getParent(pid); ++ if (parent == context->ppid) { ++ kill(pid, SIGQUIT); ++ } ++} ++ ++/* ++ * Class: sun_tools_attach_AixVirtualMachine ++ * Method: sendQuitTo ++ * Signature: (I)V ++ */ ++JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_sendQuitTo ++ (JNIEnv *env, jclass cls, jint pid) ++{ ++ if (kill((pid_t)pid, SIGQUIT)) { ++ JNU_ThrowIOExceptionWithLastError(env, "kill"); ++ } ++} ++ ++/* ++ * Class: sun_tools_attach_AixVirtualMachine ++ * Method: checkPermissions ++ * Signature: (Ljava/lang/String;)V ++ */ ++JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_checkPermissions ++ (JNIEnv *env, jclass cls, jstring path) ++{ ++ jboolean isCopy; ++ const char* p = GetStringPlatformChars(env, path, &isCopy); ++ if (p != NULL) { ++ struct stat64 sb; ++ uid_t uid, gid; ++ int res; ++ /* added missing initialization of the stat64 buffer */ ++ memset(&sb, 0, sizeof(struct stat64)); ++ ++ /* ++ * Check that the path is owned by the effective uid/gid of this ++ * process. Also check that group/other access is not allowed. ++ */ ++ uid = geteuid(); ++ gid = getegid(); ++ ++ res = stat64(p, &sb); ++ if (res != 0) { ++ /* save errno */ ++ res = errno; ++ } ++ ++ /* release p here before we throw an I/O exception */ ++ if (isCopy) { ++ JNU_ReleaseStringPlatformChars(env, path, p); ++ } ++ ++ if (res == 0) { ++ if ( (sb.st_uid != uid) || (sb.st_gid != gid) || ++ ((sb.st_mode & (S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) != 0) ) { ++ JNU_ThrowIOException(env, "well-known file is not secure"); ++ } ++ } else { ++ char* msg = strdup(strerror(res)); ++ JNU_ThrowIOException(env, msg); ++ if (msg != NULL) { ++ free(msg); ++ } ++ } ++ } ++} ++ ++/* ++ * Class: sun_tools_attach_AixVirtualMachine ++ * Method: close ++ * Signature: (I)V ++ */ ++JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_close ++ (JNIEnv *env, jclass cls, jint fd) ++{ ++ int res; ++ /* Fixed deadlock when this call of close by the client is not seen by the attach server ++ * which has accepted the (very short) connection already and is waiting for the request. But read don't get a byte, ++ * because the close is lost without shutdown. ++ */ ++ shutdown(fd, 2); ++ RESTARTABLE(close(fd), res); ++} ++ ++/* ++ * Class: sun_tools_attach_AixVirtualMachine ++ * Method: read ++ * Signature: (I[BI)I ++ */ ++JNIEXPORT jint JNICALL Java_sun_tools_attach_AixVirtualMachine_read ++ (JNIEnv *env, jclass cls, jint fd, jbyteArray ba, jint off, jint baLen) ++{ ++ unsigned char buf[128]; ++ size_t len = sizeof(buf); ++ ssize_t n; ++ ++ size_t remaining = (size_t)(baLen - off); ++ if (len > remaining) { ++ len = remaining; ++ } ++ ++ RESTARTABLE(read(fd, buf+off, len), n); ++ if (n == -1) { ++ JNU_ThrowIOExceptionWithLastError(env, "read"); ++ } else { ++ if (n == 0) { ++ n = -1; // EOF ++ } else { ++ (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); ++ } ++ } ++ return n; ++} ++ ++/* ++ * Class: sun_tools_attach_AixVirtualMachine ++ * Method: write ++ * Signature: (I[B)V ++ */ ++JNIEXPORT void JNICALL Java_sun_tools_attach_AixVirtualMachine_write ++ (JNIEnv *env, jclass cls, jint fd, jbyteArray ba, jint off, jint bufLen) ++{ ++ size_t remaining = bufLen; ++ do { ++ unsigned char buf[128]; ++ size_t len = sizeof(buf); ++ int n; ++ ++ if (len > remaining) { ++ len = remaining; ++ } ++ (*env)->GetByteArrayRegion(env, ba, off, len, (jbyte *)buf); ++ ++ RESTARTABLE(write(fd, buf, len), n); ++ if (n > 0) { ++ off += n; ++ remaining -= n; ++ } else { ++ JNU_ThrowIOExceptionWithLastError(env, "write"); ++ return; ++ } ++ ++ } while (remaining > 0); ++} +--- ./jdk/src/aix/porting/porting_aix.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/porting/porting_aix.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,86 @@ ++/* ++ * Copyright 2012, 2013 SAP AG. 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 ++#include ++#include ++ ++#include "porting_aix.h" ++ ++static unsigned char dladdr_buffer[0x4000]; ++ ++static void fill_dll_info(void) { ++ int rc = loadquery(L_GETINFO,dladdr_buffer, sizeof(dladdr_buffer)); ++ if (rc == -1) { ++ fprintf(stderr, "loadquery failed (%d %s)", errno, strerror(errno)); ++ fflush(stderr); ++ } ++} ++ ++static int dladdr_dont_reload(void* addr, Dl_info* info) { ++ const struct ld_info* p = (struct ld_info*) dladdr_buffer; ++ info->dli_fbase = 0; info->dli_fname = 0; ++ info->dli_sname = 0; info->dli_saddr = 0; ++ for (;;) { ++ if (addr >= p->ldinfo_textorg && ++ addr < (((char*)p->ldinfo_textorg) + p->ldinfo_textsize)) { ++ info->dli_fname = p->ldinfo_filename; ++ info->dli_fbase = p->ldinfo_textorg; ++ return 1; /* [sic] */ ++ } ++ if (!p->ldinfo_next) { ++ break; ++ } ++ p = (struct ld_info*)(((char*)p) + p->ldinfo_next); ++ } ++ return 0; /* [sic] */ ++} ++ ++#ifdef __cplusplus ++extern "C" ++#endif ++int dladdr(void *addr, Dl_info *info) { ++ static int loaded = 0; ++ if (!loaded) { ++ fill_dll_info(); ++ loaded = 1; ++ } ++ if (!addr) { ++ return 0; /* [sic] */ ++ } ++ /* Address could be AIX function descriptor? */ ++ void* const addr0 = *( (void**) addr ); ++ int rc = dladdr_dont_reload(addr, info); ++ if (rc == 0) { ++ rc = dladdr_dont_reload(addr0, info); ++ if (rc == 0) { /* [sic] */ ++ fill_dll_info(); /* refill, maybe loadquery info is outdated */ ++ rc = dladdr_dont_reload(addr, info); ++ if (rc == 0) { ++ rc = dladdr_dont_reload(addr0, info); ++ } ++ } ++ } ++ return rc; ++} +--- ./jdk/src/aix/porting/porting_aix.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/aix/porting/porting_aix.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,59 @@ ++/* ++ * Copyright 2012, 2013 SAP AG. 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. ++ * ++ */ ++ ++/* ++ * Header file to contain porting-relevant code which does not have a ++ * home anywhere else. ++ * This is intially based on hotspot/src/os/aix/vm/{loadlib,porting}_aix.{hpp,cpp} ++ */ ++ ++/* ++ * Aix' own version of dladdr(). ++ * This function tries to mimick dladdr(3) on Linux ++ * (see http://linux.die.net/man/3/dladdr) ++ * dladdr(3) is not POSIX but a GNU extension, and is not available on AIX. ++ * ++ * Differences between AIX dladdr and Linux dladdr: ++ * ++ * 1) Dl_info.dli_fbase: can never work, is disabled. ++ * A loaded image on AIX is divided in multiple segments, at least two ++ * (text and data) but potentially also far more. This is because the loader may ++ * load each member into an own segment, as for instance happens with the libC.a ++ * 2) Dl_info.dli_sname: This only works for code symbols (functions); for data, a ++ * zero-length string is returned (""). ++ * 3) Dl_info.dli_saddr: For code, this will return the entry point of the function, ++ * not the function descriptor. ++ */ ++ ++typedef struct { ++ const char *dli_fname; /* file path of loaded library */ ++ void *dli_fbase; /* doesn't make sence on AIX */ ++ const char *dli_sname; /* symbol name; "" if not known */ ++ void *dli_saddr; /* address of *entry* of function; not function descriptor; */ ++} Dl_info; ++ ++#ifdef __cplusplus ++extern "C" ++#endif ++int dladdr(void *addr, Dl_info *info); +--- ./jdk/src/bsd/doc/man/java.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/bsd/doc/man/java.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,2001 +1,3461 @@ + '\" t +-.\" Copyright (c) 1994, 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. +-.\" +-.\" Arch: generic +-.\" Software: JDK 8 +-.\" Date: 21 November 2013 +-.\" SectDesc: Basic Tools +-.\" Title: java.1 ++.\" Copyright (c) 1994, 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. ++.\" ++.\" Title: java ++.\" Language: English ++.\" Date: 08 August 2014 ++.\" SectDesc: Basic Tools ++.\" Software: JDK 8 ++.\" Arch: generic ++.\" Part Number: E38207-03 + .\" + .if n .pl 99999 +-.TH java 1 "21 November 2013" "JDK 8" "Basic Tools" +-.\" ----------------------------------------------------------------- +-.\" * Define some portability stuff +-.\" ----------------------------------------------------------------- +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.\" http://bugs.debian.org/507673 +-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" ----------------------------------------------------------------- +-.\" * set default formatting +-.\" ----------------------------------------------------------------- +-.\" disable hyphenation +-.nh +-.\" disable justification (adjust text to left margin only) +-.ad l +-.\" ----------------------------------------------------------------- +-.\" * MAIN CONTENT STARTS HERE * +-.\" ----------------------------------------------------------------- +- +-.SH NAME ++.TH "java" "1" "08 August 2014" "JDK 8" "Basic Tools" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" + java \- Launches a Java application\&. +-.SH SYNOPSIS +-.sp +-.nf +- ++.SH "SYNOPSIS" ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjava\fR [\fIoptions\fR] \fIclassname\fR [\fIargs\fR] +-.fi +-.nf +- ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjava\fR [\fIoptions\fR] \fB\-jar\fR \fIfilename\fR [\fIargs\fR] +-.fi +-.sp +-.TP ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + \fIoptions\fR +-Command-line options separated by spaces\&. See Options\&. +-.TP ++.RS 4 ++Command\-line options separated by spaces\&. See Options\&. ++.RE ++.PP + \fIclassname\fR ++.RS 4 + The name of the class to be launched\&. +-.TP ++.RE ++.PP + \fIfilename\fR +-The name of the Java Archive (JAR) file to be called\&. Used only with the \f3-jar\fR option\&. +-.TP ++.RS 4 ++The name of the Java Archive (JAR) file to be called\&. Used only with the ++\fB\-jar\fR ++option\&. ++.RE ++.PP + \fIargs\fR +-The arguments passed to the \f3main()\fR method separated by spaces\&. +-.SH DESCRIPTION +-The \f3java\fR command starts a Java application\&. It does this by starting the Java Runtime Environment (JRE), loading the specified class, and calling that class\&'s \f3main()\fR method\&. The method must be declared \fIpublic\fR and \fIstatic\fR, it must not return any value, and it must accept a \f3String\fR array as a parameter\&. The method declaration has the following form: +-.sp +-.nf +-\f3public static void main(String[] args)\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The \f3java\fR command can be used to launch a JavaFX application by loading a class that either has a \f3main()\fR method or that extends \f3javafx\&.application\&.Application\fR\&. In the latter case, the launcher constructs an instance of the \f3Application\fR class, calls its \f3init()\fR method, and then calls the \f3start(javafx\&.stage\&.Stage)\fR method\&. ++.RS 4 ++The arguments passed to the ++\fBmain()\fR ++method separated by spaces\&. ++.RE ++.SH "DESCRIPTION" + .PP +-By default, the first argument that is not an option of the \f3java\fR command is the fully qualified name of the class to be called\&. If the \f3-jar\fR option is specified, its argument is the name of the JAR file containing class and resource files for the application\&. The startup class must be indicated by the \f3Main-Class\fR manifest header in its source code\&. ++The ++\fBjava\fR ++command starts a Java application\&. It does this by starting the Java Runtime Environment (JRE), loading the specified class, and calling that class\*(Aqs ++\fBmain()\fR ++method\&. The method must be declared ++\fIpublic\fR ++and ++\fIstatic\fR, it must not return any value, and it must accept a ++\fBString\fR ++array as a parameter\&. The method declaration has the following form: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic static void main(String[] args)\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The ++\fBjava\fR ++command can be used to launch a JavaFX application by loading a class that either has a ++\fBmain()\fR ++method or that extends ++\fBjavafx\&.application\&.Application\fR\&. In the latter case, the launcher constructs an instance of the ++\fBApplication\fR ++class, calls its ++\fBinit()\fR ++method, and then calls the ++\fBstart(javafx\&.stage\&.Stage)\fR ++method\&. ++.PP ++By default, the first argument that is not an option of the ++\fBjava\fR ++command is the fully qualified name of the class to be called\&. If the ++\fB\-jar\fR ++option is specified, its argument is the name of the JAR file containing class and resource files for the application\&. The startup class must be indicated by the ++\fBMain\-Class\fR ++manifest header in its source code\&. + .PP + The JRE searches for the startup class (and other classes used by the application) in three sets of locations: the bootstrap class path, the installed extensions, and the user\(cqs class path\&. + .PP +-Arguments after the class file name or the JAR file name are passed to the \f3main()\fR method\&. +-.SH OPTIONS +-The \f3java\fR command supports a wide range of options that can be divided into the following categories: +-.TP 0.2i +-\(bu ++Arguments after the class file name or the JAR file name are passed to the ++\fBmain()\fR ++method\&. ++.SH "OPTIONS" ++.PP ++The ++\fBjava\fR ++command supports a wide range of options that can be divided into the following categories: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Standard Options +-.TP 0.2i +-\(bu +-Non-Standard Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Non\-Standard Options ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced Runtime Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced JIT Compiler Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced Serviceability Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced Garbage Collection Options ++.RE + .PP + Standard options are guaranteed to be supported by all implementations of the Java Virtual Machine (JVM)\&. They are used for common actions, such as checking the version of the JRE, setting the class path, enabling verbose output, and so on\&. + .PP +-Non-standard options are general purpose options that are specific to the Java HotSpot Virtual Machine, so they are not guaranteed to be supported by all JVM implementations, and are subject to change\&. These options start with \f3-X\fR\&. ++Non\-standard options are general purpose options that are specific to the Java HotSpot Virtual Machine, so they are not guaranteed to be supported by all JVM implementations, and are subject to change\&. These options start with ++\fB\-X\fR\&. + .PP +-Advanced options are not recommended for casual use\&. These are developer options used for tuning specific areas of the Java HotSpot Virtual Machine operation that often have specific system requirements and may require privileged access to system configuration parameters\&. They are also not guaranteed to be supported by all JVM implementations, and are subject to change\&. Advanced options start with \f3-XX\fR\&. ++Advanced options are not recommended for casual use\&. These are developer options used for tuning specific areas of the Java HotSpot Virtual Machine operation that often have specific system requirements and may require privileged access to system configuration parameters\&. They are also not guaranteed to be supported by all JVM implementations, and are subject to change\&. Advanced options start with ++\fB\-XX\fR\&. + .PP + To keep track of the options that were deprecated or removed in the latest release, there is a section named Deprecated and Removed Options at the end of the document\&. + .PP +-Boolean options are used to either enable a feature that is disabled by default or disable a feature that is enabled by default\&. Such options do not require a parameter\&. Boolean \f3-XX\fR options are enabled using the plus sign (\f3-XX:+\fR\fIOptionName\fR) and disabled using the minus sign (\f3-XX:-\fR\fIOptionName\fR)\&. ++Boolean options are used to either enable a feature that is disabled by default or disable a feature that is enabled by default\&. Such options do not require a parameter\&. Boolean ++\fB\-XX\fR ++options are enabled using the plus sign (\fB\-XX:+\fR\fIOptionName\fR) and disabled using the minus sign (\fB\-XX:\-\fR\fIOptionName\fR)\&. + .PP +-For options that require an argument, the argument may be separated from the option name by a space, a colon (:), or an equal sign (=), or the argument may directly follow the option (the exact syntax differs for each option)\&. If you are expected to specify the size in bytes, you can use no suffix, or use the suffix \f3k\fR or \f3K\fR for kilobytes (KB), \f3m\fR or \f3M\fR for megabytes (MB), \f3g\fR or \f3G\fR for gigabytes (GB)\&. For example, to set the size to 8 GB, you can specify either \f38g\fR, \f38192m\fR, \f38388608k\fR, or \f38589934592\fR as the argument\&. If you are expected to specify the percentage, use a number from 0 to 1 (for example, specify \f30\&.25\fR for 25%)\&. +-.SS STANDARD\ OPTIONS ++For options that require an argument, the argument may be separated from the option name by a space, a colon (:), or an equal sign (=), or the argument may directly follow the option (the exact syntax differs for each option)\&. If you are expected to specify the size in bytes, you can use no suffix, or use the suffix ++\fBk\fR ++or ++\fBK\fR ++for kilobytes (KB), ++\fBm\fR ++or ++\fBM\fR ++for megabytes (MB), ++\fBg\fR ++or ++\fBG\fR ++for gigabytes (GB)\&. For example, to set the size to 8 GB, you can specify either ++\fB8g\fR, ++\fB8192m\fR, ++\fB8388608k\fR, or ++\fB8589934592\fR ++as the argument\&. If you are expected to specify the percentage, use a number from 0 to 1 (for example, specify ++\fB0\&.25\fR ++for 25%)\&. ++.SS "Standard Options" ++.PP + These are the most commonly used options that are supported by all implementations of the JVM\&. +-.TP +--agentlib:\fIlibname\fR[=\fIoptions\fR] ++.PP ++\-agentlib:\fIlibname\fR[=\fIoptions\fR] ++.RS 4 ++Loads the specified native agent library\&. After the library name, a comma\-separated list of options specific to the library can be used\&. ++.sp ++If the option ++\fB\-agentlib:foo\fR ++is specified, then the JVM attempts to load the library named ++\fBlibfoo\&.so\fR ++in the location specified by the ++\fBLD_LIBRARY_PATH\fR ++system variable (on OS X this variable is ++\fBDYLD_LIBRARY_PATH\fR)\&. ++.sp ++The following example shows how to load the heap profiling tool (HPROF) library and get sample CPU information every 20 ms, with a stack depth of 3: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-agentlib:hprof=cpu=samples,interval=20,depth=3\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example shows how to load the Java Debug Wire Protocol (JDWP) library and listen for the socket connection on port 8000, suspending the JVM before the main class loads: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-agentlib:jdwp=transport=dt_socket,server=y,address=8000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++For more information about the native agent libraries, refer to the following: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++The ++\fBjava\&.lang\&.instrument\fR ++package description at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Agent Command Line Options in the JVM Tools Interface guide at http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting ++.RE ++.RE ++.PP ++\-agentpath:\fIpathname\fR[=\fIoptions\fR] ++.RS 4 ++Loads the native agent library specified by the absolute path name\&. This option is equivalent to ++\fB\-agentlib\fR ++but uses the full path and file name of the library\&. ++.RE ++.PP ++\-client ++.RS 4 ++Selects the Java HotSpot Client VM\&. The 64\-bit version of the Java SE Development Kit (JDK) currently ignores this option and instead uses the Server JVM\&. ++.sp ++For default JVM selection, see Server\-Class Machine Detection at ++ ++http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server\-class\&.html ++.RE ++.PP ++\-D\fIproperty\fR=\fIvalue\fR ++.RS 4 ++Sets a system property value\&. The ++\fIproperty\fR ++variable is a string with no spaces that represents the name of the property\&. The ++\fIvalue\fR ++variable is a string that represents the value of the property\&. If ++\fIvalue\fR ++is a string with spaces, then enclose it in quotation marks (for example ++\fB\-Dfoo="foo bar"\fR)\&. ++.RE ++.PP ++\-d32 ++.RS 4 ++Runs the application in a 32\-bit environment\&. If a 32\-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32\-bit environment unless a 64\-bit system is used\&. ++.RE ++.PP ++\-d64 ++.RS 4 ++Runs the application in a 64\-bit environment\&. If a 64\-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32\-bit environment unless a 64\-bit system is used\&. ++.sp ++Currently only the Java HotSpot Server VM supports 64\-bit operation, and the ++\fB\-server\fR ++option is implicit with the use of ++\fB\-d64\fR\&. The ++\fB\-client\fR ++option is ignored with the use of ++\fB\-d64\fR\&. This is subject to change in a future release\&. ++.RE ++.PP ++\-disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] + .br +-Loads the specified native agent library\&. After the library name, a comma-separated list of options specific to the library can be used\&. ++\-da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.RS 4 ++Disables assertions\&. By default, assertions are disabled in all packages and classes\&. ++.sp ++With no arguments, ++\fB\-disableassertions\fR ++(\fB\-da\fR) disables assertions in all packages and classes\&. With the ++\fIpackagename\fR ++argument ending in ++\fB\&.\&.\&.\fR, the switch disables assertions in the specified package and any subpackages\&. If the argument is simply ++\fB\&.\&.\&.\fR, then the switch disables assertions in the unnamed package in the current working directory\&. With the ++\fIclassname\fR ++argument, the switch disables assertions in the specified class\&. ++.sp ++The ++\fB\-disableassertions\fR ++(\fB\-da\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to disable assertions in all classes except for system classes\&. The ++\fB\-disablesystemassertions\fR ++option enables you to disable assertions in all system classes\&. ++.sp ++To explicitly enable assertions in specific packages or classes, use the ++\fB\-enableassertions\fR ++(\fB\-ea\fR) option\&. Both options can be used at the same time\&. For example, to run the ++\fBMyClass\fR ++application with assertions enabled in package ++\fBcom\&.wombat\&.fruitbat\fR ++(and any subpackages) but disabled in class ++\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-disablesystemassertions ++.br ++\-dsa ++.RS 4 ++Disables assertions in all system classes\&. ++.RE ++.PP ++\-enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.br ++\-ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.RS 4 ++Enables assertions\&. By default, assertions are disabled in all packages and classes\&. ++.sp ++With no arguments, ++\fB\-enableassertions\fR ++(\fB\-ea\fR) enables assertions in all packages and classes\&. With the ++\fIpackagename\fR ++argument ending in ++\fB\&.\&.\&.\fR, the switch enables assertions in the specified package and any subpackages\&. If the argument is simply ++\fB\&.\&.\&.\fR, then the switch enables assertions in the unnamed package in the current working directory\&. With the ++\fIclassname\fR ++argument, the switch enables assertions in the specified class\&. ++.sp ++The ++\fB\-enableassertions\fR ++(\fB\-ea\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to enable assertions in all classes except for system classes\&. The ++\fB\-enablesystemassertions\fR ++option provides a separate switch to enable assertions in all system classes\&. ++.sp ++To explicitly disable assertions in specific packages or classes, use the ++\fB\-disableassertions\fR ++(\fB\-da\fR) option\&. If a single command contains multiple instances of these switches, then they are processed in order before loading any classes\&. For example, to run the ++\fBMyClass\fR ++application with assertions enabled only in package ++\fBcom\&.wombat\&.fruitbat\fR ++(and any subpackages) but disabled in class ++\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-enablesystemassertions ++.br ++\-esa ++.RS 4 ++Enables assertions in all system classes\&. ++.RE ++.PP ++\-help ++.br ++\-? ++.RS 4 ++Displays usage information for the ++\fBjava\fR ++command without actually running the JVM\&. ++.RE ++.PP ++\-jar \fIfilename\fR ++.RS 4 ++Executes a program encapsulated in a JAR file\&. The ++\fIfilename\fR ++argument is the name of a JAR file with a manifest that contains a line in the form ++\fBMain\-Class:\fR\fIclassname\fR ++that defines the class with the ++\fBpublic static void main(String[] args)\fR ++method that serves as your application\*(Aqs starting point\&. ++.sp ++When you use the ++\fB\-jar\fR ++option, the specified JAR file is the source of all user classes, and other class path settings are ignored\&. ++.sp ++For more information about JAR files, see the following resources: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++jar(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++The Java Archive (JAR) Files guide at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jar/index\&.html ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Lesson: Packaging Programs in JAR Files at + +-If the option \f3-agentlib:foo\fR is specified, then the JVM attempts to load the library named \f3libfoo\&.so\fR in the location specified by the \f3LD_LIBRARY_PATH\fR system variable (on OS X this variable is \f3DYLD_LIBRARY_PATH\fR)\&. ++http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html ++.RE ++.RE ++.PP ++\-javaagent:\fIjarpath\fR[=\fIoptions\fR] ++.RS 4 ++Loads the specified Java programming language agent\&. For more information about instrumenting Java applications, see the ++\fBjava\&.lang\&.instrument\fR ++package description in the Java API documentation at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html ++.RE ++.PP ++\-jre\-restrict\-search ++.RS 4 ++Includes user\-private JREs in the version search\&. ++.RE ++.PP ++\-no\-jre\-restrict\-search ++.RS 4 ++Excludes user\-private JREs from the version search\&. ++.RE ++.PP ++\-server ++.RS 4 ++Selects the Java HotSpot Server VM\&. The 64\-bit version of the JDK supports only the Server VM, so in that case the option is implicit\&. ++.sp ++For default JVM selection, see Server\-Class Machine Detection at + +-The following example shows how to load the heap profiling tool (HPROF) library and get sample CPU information every 20 ms, with a stack depth of 3: +-.sp +-.nf +-\f3\-agentlib:hprof=cpu=samples,interval=20,depth=3\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following example shows how to load the Java Debug Wire Protocol (JDWP) library and listen for the socket connection on port 8000, suspending the JVM before the main class loads: +-.sp +-.nf +-\f3\-agentlib:jdwp=transport=dt_socket,server=y,address=8000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-For more information about the native agent libraries, refer to the following: +-.RS +-.TP 0.2i +-\(bu +-The \f3java\&.lang\&.instrument\fR package description at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package-summary\&.html +-.TP 0.2i +-\(bu +-Agent Command Line Options in the JVM Tools Interface guide at http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting +-.RE +- +-.TP +--agentpath:\fIpathname\fR[=\fIoptions\fR] +-.br +-Loads the native agent library specified by the absolute path name\&. This option is equivalent to \f3-agentlib\fR but uses the full path and file name of the library\&. +-.TP +--client +-.br +-Selects the Java HotSpot Client VM\&. The 64-bit version of the Java SE Development Kit (JDK) currently ignores this option and instead uses the Server JVM\&. +- +-For default JVM selection, see Server-Class Machine Detection at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server-class\&.html +-.TP +--D\fIproperty\fR=\fIvalue\fR +-.br +-Sets a system property value\&. The \fIproperty\fR variable is a string with no spaces that represents the name of the property\&. The \fIvalue\fR variable is a string that represents the value of the property\&. If \fIvalue\fR is a string with spaces, then enclose it in quotation marks (for example \f3-Dfoo="foo bar"\fR)\&. +-.TP +--d32 +-.br +-Runs the application in a 32-bit environment\&. If a 32-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32-bit environment unless a 64-bit system is used\&. +-.TP +--d64 +-.br +-Runs the application in a 64-bit environment\&. If a 64-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32-bit environment unless a 64-bit system is used\&. +- +-Currently only the Java HotSpot Server VM supports 64-bit operation, and the \f3-server\fR option is implicit with the use of \f3-d64\fR\&. The \f3-client\fR option is ignored with the use of \f3-d64\fR\&. This is subject to change in a future release\&. +-.TP ++http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server\-class\&.html ++.RE ++.PP ++\-showversion ++.RS 4 ++Displays version information and continues execution of the application\&. This option is equivalent to the ++\fB\-version\fR ++option except that the latter instructs the JVM to exit after displaying version information\&. ++.RE ++.PP ++\-splash:\fIimgname\fR ++.RS 4 ++Shows the splash screen with the image specified by ++\fIimgname\fR\&. For example, to show the ++\fBsplash\&.gif\fR ++file from the ++\fBimages\fR ++directory when starting your application, use the following option: ++.sp ++.if n \{\ ++.RS 4 ++.\} + .nf +--disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], -da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] +-.br ++\fB\-splash:images/splash\&.gif\fR ++ + .fi +-Disables assertions\&. By default, assertions are disabled in all packages and classes\&. +- +-With no arguments, \f3-disableassertions\fR (\f3-da\fR) disables assertions in all packages and classes\&. With the \fIpackagename\fR argument ending in \f3\&.\&.\&.\fR, the switch disables assertions in the specified package and any subpackages\&. If the argument is simply \f3\&.\&.\&.\fR, then the switch disables assertions in the unnamed package in the current working directory\&. With the \fIclassname\fR argument\f3\fR, the switch disables assertions in the specified class\&. +- +-The \f3-disableassertions\fR (\f3-da\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to disable assertions in all classes except for system classes\&. The \f3-disablesystemassertions\fR option enables you to disable assertions in all system classes\&. +- +-To explicitly enable assertions in specific packages or classes, use the \f3-enableassertions\fR (\f3-ea\fR) option\&. Both options can be used at the same time\&. For example, to run the \f3MyClass\fR application with assertions enabled in package \f3com\&.wombat\&.fruitbat\fR (and any subpackages) but disabled in class \f3com\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: +-.sp +-.nf +-\f3java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--disablesystemassertions, -dsa +-.br +-Disables assertions in all system classes\&. +-.TP ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-verbose:class ++.RS 4 ++Displays information about each loaded class\&. ++.RE ++.PP ++\-verbose:gc ++.RS 4 ++Displays information about each garbage collection (GC) event\&. ++.RE ++.PP ++\-verbose:jni ++.RS 4 ++Displays information about the use of native methods and other Java Native Interface (JNI) activity\&. ++.RE ++.PP ++\-version ++.RS 4 ++Displays version information and then exits\&. This option is equivalent to the ++\fB\-showversion\fR ++option except that the latter does not instruct the JVM to exit after displaying version information\&. ++.RE ++.PP ++\-version:\fIrelease\fR ++.RS 4 ++Specifies the release version to be used for running the application\&. If the version of the ++\fBjava\fR ++command called does not meet this specification and an appropriate implementation is found on the system, then the appropriate implementation will be used\&. ++.sp ++The ++\fIrelease\fR ++argument specifies either the exact version string, or a list of version strings and ranges separated by spaces\&. A ++\fIversion string\fR ++is the developer designation of the version number in the following form: ++\fB1\&.\fR\fIx\fR\fB\&.0_\fR\fIu\fR ++(where ++\fIx\fR ++is the major version number, and ++\fIu\fR ++is the update version number)\&. A ++\fIversion range\fR ++is made up of a version string followed by a plus sign (\fB+\fR) to designate this version or later, or a part of a version string followed by an asterisk (\fB*\fR) to designate any version string with a matching prefix\&. Version strings and ranges can be combined using a space for a logical ++\fIOR\fR ++combination, or an ampersand (\fB&\fR) for a logical ++\fIAND\fR ++combination of two version strings/ranges\&. For example, if running the class or JAR file requires either JRE 6u13 (1\&.6\&.0_13), or any JRE 6 starting from 6u10 (1\&.6\&.0_10), specify the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} + .nf +--enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], -ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] +-.br ++\fB\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+"\fR ++ + .fi +-Enables assertions\&. By default, assertions are disabled in all packages and classes\&. +- +-With no arguments, \f3-enableassertions\fR (\f3-ea\fR) enables assertions in all packages and classes\&. With the \fIpackagename\fR argument ending in \f3\&.\&.\&.\fR, the switch enables assertions in the specified package and any subpackages\&. If the argument is simply \f3\&.\&.\&.\fR, then the switch enables assertions in the unnamed package in the current working directory\&. With the \fIclassname\fR argument\f3\fR, the switch enables assertions in the specified class\&. +- +-The \f3-enableassertions\fR (\f3-ea\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to enable assertions in all classes except for system classes\&. The \f3-enablesystemassertions\fR option provides a separate switch to enable assertions in all system classes\&. +- +-To explicitly disable assertions in specific packages or classes, use the \f3-disableassertions\fR (\f3-da\fR) option\&. If a single command contains multiple instances of these switches, then they are processed in order before loading any classes\&. For example, to run the \f3MyClass\fR application with assertions enabled only in package \f3com\&.wombat\&.fruitbat\fR (and any subpackages) but disabled in class \f3com\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: +-.sp +-.nf +-\f3java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--enablesystemassertions, -esa +-.br +-Enables assertions in all system classes\&. +-.TP +--help, -? +-.br +-Displays usage information for the \f3java\fR command without actually running the JVM\&. +-.TP +--jar \fIfilename\fR +-.br +-Executes a program encapsulated in a JAR file\&. The \fIfilename\fR argument is the name of a JAR file with a manifest that contains a line in the form \f3Main-Class:\fR\fIclassname\fR that defines the class with the \f3public static void main(String[] args)\fR method that serves as your application\&'s starting point\&. +- +-When you use the \f3-jar\fR option, the specified JAR file is the source of all user classes, and other class path settings are ignored\&. +- +-For more information about JAR files, see the following resources: +-.RS +-.TP 0.2i +-\(bu +-jar(1) +-.TP 0.2i +-\(bu +-The Java Archive (JAR) Files guide at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jar/index\&.html +-.TP 0.2i +-\(bu +-Lesson: Packaging Programs in JAR Files at http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html +-.RE +- +-.TP +--javaagent:\fIjarpath\fR[=\fIoptions\fR] +-.br +-Loads the specified Java programming language agent\&. For more information about instrumenting Java applications, see the \f3java\&.lang\&.instrument\fR package description in the Java API documentation at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package-summary\&.html +-.TP +--jre-restrict-search +-.br +-Includes user-private JREs in the version search\&. +-.TP +--no-jre-restrict-search +-.br +-Excludes user-private JREs from the version search\&. +-.TP +--server +-.br +-Selects the Java HotSpot Server VM\&. The 64-bit version of the JDK supports only the Server VM, so in that case the option is implicit\&. +- +-For default JVM selection, see Server-Class Machine Detection at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server-class\&.html +-.TP +--showversion +-.br +-Displays version information and continues execution of the application\&. This option is equivalent to the \f3-version\fR option except that the latter instructs the JVM to exit after displaying version information\&. +-.TP +--splash:\fIimgname\fR +-.br +-Shows the splash screen with the image specified by \fIimgname\fR\&. For example, to show the \f3splash\&.gif\fR file from the \f3images\fR directory when starting your application, use the following option: +-.sp +-.nf +-\f3\-splash:images/splash\&.gif\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--verbose:class +-.br +-Displays information about each loaded class\&. +-.TP +--verbose:gc +-.br +-Displays information about each garbage collection (GC) event\&. +-.TP +--verbose:jni +-.br +-Displays information about the use of native methods and other Java Native Interface (JNI) activity\&. +-.TP +--version +-.br +-Displays version information and then exits\&. This option is equivalent to the \f3-showversion\fR option except that the latter does not instruct the JVM to exit after displaying version information\&. +-.TP +--version:\fIrelease\fR +-.br +-Specifies the release version to be used for running the application\&. If the version of the \f3java\fR command called does not meet this specification and an appropriate implementation is found on the system, then the appropriate implementation will be used\&. +- +-The \fIrelease\fR argument specifies either the exact version string, or a list of version strings and ranges separated by spaces\&. A \fIversion string\fR is the developer designation of the version number in the following form: \f31\&.\fR\fIx\fR\f3\&.0_\fR\fIu\fR (where \fIx\fR is the major version number, and \fIu\fR is the update version number)\&. A \fIversion range\fR is made up of a version string followed by a plus sign (\f3+\fR) to designate this version or later, or a part of a version string followed by an asterisk (\f3*\fR) to designate any version string with a matching prefix\&. Version strings and ranges can be combined using a space for a logical \fIOR\fR combination, or an ampersand (\f3&\fR) for a logical \fIAND\fR combination of two version strings/ranges\&. For example, if running the class or JAR file requires either JRE 6u13 (1\&.6\&.0_13), or any JRE 6 starting from 6u10 (1\&.6\&.0_10), specify the following: +-.sp +-.nf +-\f3\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Quotation marks are necessary only if there are spaces in the \fIrelease\fR parameter\&. +- ++.if n \{\ ++.RE ++.\} ++Quotation marks are necessary only if there are spaces in the ++\fIrelease\fR ++parameter\&. ++.sp + For JAR files, the preference is to specify version requirements in the JAR file manifest rather than on the command line\&. +-.SS NON-STANDARD\ OPTIONS ++.RE ++.SS "Non\-Standard Options" ++.PP + These options are general purpose options that are specific to the Java HotSpot Virtual Machine\&. +-.TP +--X +-.br +-Displays help for all available \f3-X\fR options\&. +-.TP +--Xbatch +-.br +-Disables background compilation\&. By default, the JVM compiles the method as a background task, running the method in interpreter mode until the background compilation is finished\&. The \f3-Xbatch\fR flag disables background compilation so that compilation of all methods proceeds as a foreground task until completed\&. +- +-This option is equivalent to \f3-XX:-BackgroundCompilation\fR\&. +-.TP +--Xbootclasspath:\fIpath\fR +-.br ++.PP ++\-X ++.RS 4 ++Displays help for all available ++\fB\-X\fR ++options\&. ++.RE ++.PP ++\-Xbatch ++.RS 4 ++Disables background compilation\&. By default, the JVM compiles the method as a background task, running the method in interpreter mode until the background compilation is finished\&. The ++\fB\-Xbatch\fR ++flag disables background compilation so that compilation of all methods proceeds as a foreground task until completed\&. ++.sp ++This option is equivalent to ++\fB\-XX:\-BackgroundCompilation\fR\&. ++.RE ++.PP ++\-Xbootclasspath:\fIpath\fR ++.RS 4 + Specifies a list of directories, JAR files, and ZIP archives separated by colons (:) to search for boot class files\&. These are used in place of the boot class files included in the JDK\&. +- +-\fI\fRDo not deploy applications that use this option to override a class in \f3rt\&.jar\fR, because this violates the JRE binary code license\&. +-.TP +--Xbootclasspath/a:\fIpath\fR +-.br ++.sp ++Do not deploy applications that use this option to override a class in ++\fBrt\&.jar\fR, because this violates the JRE binary code license\&. ++.RE ++.PP ++\-Xbootclasspath/a:\fIpath\fR ++.RS 4 + Specifies a list of directories, JAR files, and ZIP archives separated by colons (:) to append to the end of the default bootstrap class path\&. +- +-Do not deploy applications that use this option to override a class in \f3rt\&.jar\fR, because this violates the JRE binary code license\&. +-.TP +--Xbootclasspath/p:\fIpath\fR +-.br ++.sp ++Do not deploy applications that use this option to override a class in ++\fBrt\&.jar\fR, because this violates the JRE binary code license\&. ++.RE ++.PP ++\-Xbootclasspath/p:\fIpath\fR ++.RS 4 + Specifies a list of directories, JAR files, and ZIP archives separated by colons (:) to prepend to the front of the default bootstrap class path\&. +- +-Do not deploy applications that use this option to override a class in \f3rt\&.jar\fR, because this violates the JRE binary code license\&. +-.TP +--Xboundthreads +-.br +-Binds user-level threads to kernel threads\&. +-.TP +--Xcheck:jni +-.br ++.sp ++Do not deploy applications that use this option to override a class in ++\fBrt\&.jar\fR, because this violates the JRE binary code license\&. ++.RE ++.PP ++\-Xcheck:jni ++.RS 4 + Performs additional checks for Java Native Interface (JNI) functions\&. Specifically, it validates the parameters passed to the JNI function and the runtime environment data before processing the JNI request\&. Any invalid data encountered indicates a problem in the native code, and the JVM will terminate with an irrecoverable error in such cases\&. Expect a performance degradation when this option is used\&. +-.TP +--Xcomp +-.br +-Forces compilation of methods on first invocation\&. By default, the Client VM (\f3-client\fR) performs 1,000 interpreted method invocations and the Server VM (\f3-server\fR) performs 10,000 interpreted method invocations to gather information for efficient compilation\&. Specifying the \f3-Xcomp\fR option disables interpreted method invocations to increase compilation performance at the expense of efficiency\&. +- +-You can also change the number of interpreted method invocations before compilation using the \f3-XX:CompileThreshold\fR option\&. +-.TP +--Xdebug +-.br ++.RE ++.PP ++\-Xcomp ++.RS 4 ++Forces compilation of methods on first invocation\&. By default, the Client VM (\fB\-client\fR) performs 1,000 interpreted method invocations and the Server VM (\fB\-server\fR) performs 10,000 interpreted method invocations to gather information for efficient compilation\&. Specifying the ++\fB\-Xcomp\fR ++option disables interpreted method invocations to increase compilation performance at the expense of efficiency\&. ++.sp ++You can also change the number of interpreted method invocations before compilation using the ++\fB\-XX:CompileThreshold\fR ++option\&. ++.RE ++.PP ++\-Xdebug ++.RS 4 + Does nothing\&. Provided for backward compatibility\&. +-.TP +--Xdiag +-.br ++.RE ++.PP ++\-Xdiag ++.RS 4 + Shows additional diagnostic messages\&. +-.TP +--Xfuture +-.br +-Enables strict class-file format checks that enforce close conformance to the class-file format specification\&. Developers are encouraged to use this flag when developing new code because the stricter checks will become the default in future releases\&. +-.TP +--Xint +-.br +-Runs the application in interpreted-only mode\&. Compilation to native code is disabled, and all bytecode is executed by the interpreter\&. The performance benefits offered by the just in time (JIT) compiler are not present in this mode\&. +-.TP +--Xinternalversion +-.br +-Displays more detailed JVM version information than the \f3-version\fR option, and then exits\&. +-.TP +--Xloggc:\fIfilename\fR +-.br +-Sets the file to which verbose GC events information should be redirected for logging\&. The information written to this file is similar to the output of \f3-verbose:gc\fR with the time elapsed since the first GC event preceding each logged event\&. The \f3-Xloggc\fR option overrides \f3-verbose:gc\fR if both are given with the same \f3java\fR command\&. +- ++.RE ++.PP ++\-Xfuture ++.RS 4 ++Enables strict class\-file format checks that enforce close conformance to the class\-file format specification\&. Developers are encouraged to use this flag when developing new code because the stricter checks will become the default in future releases\&. ++.RE ++.PP ++\-Xint ++.RS 4 ++Runs the application in interpreted\-only mode\&. Compilation to native code is disabled, and all bytecode is executed by the interpreter\&. The performance benefits offered by the just in time (JIT) compiler are not present in this mode\&. ++.RE ++.PP ++\-Xinternalversion ++.RS 4 ++Displays more detailed JVM version information than the ++\fB\-version\fR ++option, and then exits\&. ++.RE ++.PP ++\-Xloggc:\fIfilename\fR ++.RS 4 ++Sets the file to which verbose GC events information should be redirected for logging\&. The information written to this file is similar to the output of ++\fB\-verbose:gc\fR ++with the time elapsed since the first GC event preceding each logged event\&. The ++\fB\-Xloggc\fR ++option overrides ++\fB\-verbose:gc\fR ++if both are given with the same ++\fBjava\fR ++command\&. ++.sp + Example: +-.sp +-.nf +-\f3\-Xloggc:garbage\-collection\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--Xmaxjitcodesize=\fIsize\fR +-.br +-Specifies the maximum code cache size (in bytes) for JIT-compiled code\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the value is set to 48 MB: +-.sp +-.nf +-\f3\-Xmaxjitcodesize=48m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-This option is equivalent to \f3-XX:ReservedCodeCacheSize\fR\&. +-.TP +--Xmixed +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xloggc:garbage\-collection\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-Xmaxjitcodesize=\fIsize\fR ++.RS 4 ++Specifies the maximum code cache size (in bytes) for JIT\-compiled code\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the value is set to 48 MB: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xmaxjitcodesize=48m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This option is equivalent to ++\fB\-XX:ReservedCodeCacheSize\fR\&. ++.RE ++.PP ++\-Xmixed ++.RS 4 + Executes all bytecode by the interpreter except for hot methods, which are compiled to native code\&. +-.TP +--Xmn\fIsize\fR +-.br +-Sets the initial and maximum size (in bytes) of the heap for the young generation (nursery)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. +- ++.RE ++.PP ++\-Xmn\fIsize\fR ++.RS 4 ++Sets the initial and maximum size (in bytes) of the heap for the young generation (nursery)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. ++.sp + The young generation region of the heap is used for new objects\&. GC is performed in this region more often than in other regions\&. If the size for the young generation is too small, then a lot of minor garbage collections will be performed\&. If the size is too large, then only full garbage collections will be performed, which can take a long time to complete\&. Oracle recommends that you keep the size for the young generation between a half and a quarter of the overall heap size\&. +- ++.sp + The following examples show how to set the initial and maximum size of young generation to 256 MB using various units: +-.sp +-.nf +-\f3\-Xmn256m\fP +-.fi +-.nf +-\f3\-Xmn262144k\fP +-.fi +-.nf +-\f3\-Xmn268435456\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Instead of the \f3-Xmn\fR option to set both the initial and maximum size of the heap for the young generation, you can use \f3-XX:NewSize\fR to set the initial size and \f3-XX:MaxNewSize\fR to set the maximum size\&. +-.TP +--Xms\fIsize\fR +-.br +-Sets the initial size (in bytes) of the heap\&. This value must be a multiple of 1024 and greater than 1 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xmn256m\fR ++\fB\-Xmn262144k\fR ++\fB\-Xmn268435456\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Instead of the ++\fB\-Xmn\fR ++option to set both the initial and maximum size of the heap for the young generation, you can use ++\fB\-XX:NewSize\fR ++to set the initial size and ++\fB\-XX:MaxNewSize\fR ++to set the maximum size\&. ++.RE ++.PP ++\-Xms\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of the heap\&. This value must be a multiple of 1024 and greater than 1 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. ++.sp + The following examples show how to set the size of allocated memory to 6 MB using various units: +-.sp +-.nf +-\f3\-Xms6291456\fP +-.fi +-.nf +-\f3\-Xms6144k\fP +-.fi +-.nf +-\f3\-Xms6m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If you do not set this option, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The initial size of the heap for the young generation can be set using the \f3-Xmn\fR option or the \f3-XX:NewSize\fR option\&. +-.TP +--Xmx\fIsize\fR +-.br +-Specifies the maximum size (in bytes) of the memory allocation pool in bytes\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, \f3-Xms\fR and \f3-Xmx\fR are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc-ergonomics\&.html +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xms6291456\fR ++\fB\-Xms6144k\fR ++\fB\-Xms6m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you do not set this option, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The initial size of the heap for the young generation can be set using the ++\fB\-Xmn\fR ++option or the ++\fB\-XX:NewSize\fR ++option\&. ++.RE ++.PP ++\-Xmx\fIsize\fR ++.RS 4 ++Specifies the maximum size (in bytes) of the memory allocation pool in bytes\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, ++\fB\-Xms\fR ++and ++\fB\-Xmx\fR ++are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html ++.sp + The following examples show how to set the maximum allowed size of allocated memory to 80 MB using various units: +-.sp +-.nf +-\f3\-Xmx83886080\fP +-.fi +-.nf +-\f3\-Xmx81920k\fP +-.fi +-.nf +-\f3\-Xmx80m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The \f3-Xmx\fR option is equivalent to \f3-XX:MaxHeapSize\fR\&. +-.TP +--Xnoclassgc +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xmx83886080\fR ++\fB\-Xmx81920k\fR ++\fB\-Xmx80m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The ++\fB\-Xmx\fR ++option is equivalent to ++\fB\-XX:MaxHeapSize\fR\&. ++.RE ++.PP ++\-Xnoclassgc ++.RS 4 + Disables garbage collection (GC) of classes\&. This can save some GC time, which shortens interruptions during the application run\&. +- +-When you specify \f3-Xnoclassgc\fR at startup, the class objects in the application will be left untouched during GC and will always be considered live\&. This can result in more memory being permanently occupied which, if not used carefully, will throw an out of memory exception\&. +-.TP +--Xprof +-.br ++.sp ++When you specify ++\fB\-Xnoclassgc\fR ++at startup, the class objects in the application will be left untouched during GC and will always be considered live\&. This can result in more memory being permanently occupied which, if not used carefully, will throw an out of memory exception\&. ++.RE ++.PP ++\-Xprof ++.RS 4 + Profiles the running program and sends profiling data to standard output\&. This option is provided as a utility that is useful in program development and is not intended to be used in production systems\&. +-.TP +--Xrs +-.br ++.RE ++.PP ++\-Xrs ++.RS 4 + Reduces the use of operating system signals by the JVM\&. +- ++.sp + Shutdown hooks enable orderly shutdown of a Java application by running user cleanup code (such as closing database connections) at shutdown, even if the JVM terminates abruptly\&. +- +-The JVM catches signals to implement shutdown hooks for unexpected termination\&. The JVM uses \f3SIGHUP\fR, \f3SIGINT\fR, and \f3SIGTERM\fR to initiate the running of shutdown hooks\&. +- +-The JVM uses a similar mechanism to implement the feature of dumping thread stacks for debugging purposes\&. The JVM uses \f3SIGQUIT\fR to perform thread dumps\&. +- +-Applications embedding the JVM frequently need to trap signals such as \f3SIGINT\fR or \f3SIGTERM\fR, which can lead to interference with the JVM signal handlers\&. The \f3-Xrs\fR option is available to address this issue\&. When \f3-Xrs\fR is used, the signal masks for \f3SIGINT\fR, \f3SIGTERM\fR, \f3SIGHUP\fR, and \f3SIGQUIT\fR are not changed by the JVM, and signal handlers for these signals are not installed\&. +- +-There are two consequences of specifying \f3-Xrs\fR: +-.RS +-.TP 0.2i +-\(bu +-\f3SIGQUIT\fR thread dumps are not available\&. +-.TP 0.2i +-\(bu +-User code is responsible for causing shutdown hooks to run, for example, by calling \f3System\&.exit()\fR when the JVM is to be terminated\&. +-.RE +- +-.TP +--Xshare:\fImode\fR +-.br +-Sets the class data sharing mode\&. Possible \fImode\fR arguments for this option include the following: +-.RS +-.TP ++.sp ++The JVM catches signals to implement shutdown hooks for unexpected termination\&. The JVM uses ++\fBSIGHUP\fR, ++\fBSIGINT\fR, and ++\fBSIGTERM\fR ++to initiate the running of shutdown hooks\&. ++.sp ++The JVM uses a similar mechanism to implement the feature of dumping thread stacks for debugging purposes\&. The JVM uses ++\fBSIGQUIT\fR ++to perform thread dumps\&. ++.sp ++Applications embedding the JVM frequently need to trap signals such as ++\fBSIGINT\fR ++or ++\fBSIGTERM\fR, which can lead to interference with the JVM signal handlers\&. The ++\fB\-Xrs\fR ++option is available to address this issue\&. When ++\fB\-Xrs\fR ++is used, the signal masks for ++\fBSIGINT\fR, ++\fBSIGTERM\fR, ++\fBSIGHUP\fR, and ++\fBSIGQUIT\fR ++are not changed by the JVM, and signal handlers for these signals are not installed\&. ++.sp ++There are two consequences of specifying ++\fB\-Xrs\fR: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fBSIGQUIT\fR ++thread dumps are not available\&. ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++User code is responsible for causing shutdown hooks to run, for example, by calling ++\fBSystem\&.exit()\fR ++when the JVM is to be terminated\&. ++.RE ++.RE ++.PP ++\-Xshare:\fImode\fR ++.RS 4 ++Sets the class data sharing mode\&. Possible ++\fImode\fR ++arguments for this option include the following: ++.PP + auto +-Use shared class data if possible\&. This is the default value for Java HotSpot 32-Bit Client VM\&. +-.TP ++.RS 4 ++Use shared class data if possible\&. This is the default value for Java HotSpot 32\-Bit Client VM\&. ++.RE ++.PP + on ++.RS 4 + Require the use of class data sharing\&. Print an error message and exit if class data sharing cannot be used\&. +-.TP ++.RE ++.PP + off +-Do not use shared class data\&. This is the default value for Java HotSpot 32-Bit Server VM, Java HotSpot 64-Bit Client VM, and Java HotSpot 64-Bit Server VM\&. +-.TP ++.RS 4 ++Do not use shared class data\&. This is the default value for Java HotSpot 32\-Bit Server VM, Java HotSpot 64\-Bit Client VM, and Java HotSpot 64\-Bit Server VM\&. ++.RE ++.PP + dump ++.RS 4 + Manually generate the class data sharing archive\&. +-.RE +- +-.TP +--XshowSettings:\fIcategory\fR +-.br +-Shows settings and continues\&. Possible \fIcategory\fR arguments for this option include the following: +-.RS +-.TP ++.RE ++.RE ++.PP ++\-XshowSettings:\fIcategory\fR ++.RS 4 ++Shows settings and continues\&. Possible ++\fIcategory\fR ++arguments for this option include the following: ++.PP + all ++.RS 4 + Shows all categories of settings\&. This is the default value\&. +-.TP ++.RE ++.PP + locale ++.RS 4 + Shows settings related to locale\&. +-.TP ++.RE ++.PP + properties ++.RS 4 + Shows settings related to system properties\&. +-.TP ++.RE ++.PP + vm ++.RS 4 + Shows the settings of the JVM\&. +-.RE +- +-.TP +--Xss\fIsize\fR +-.br +-Sets the thread stack size (in bytes)\&. Append the letter \f3k\fR or \f3K\fR to indicate KB, \f3m\fR or \f3M\fR to indicate MB, \f3g\fR or \f3G\fR to indicate GB\&. The default value depends on the platform: +-.RS +-.TP 0.2i +-\(bu +-Linux/ARM (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-OS X (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu ++.RE ++.RE ++.PP ++\-Xss\fIsize\fR ++.RS 4 ++Sets the thread stack size (in bytes)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate KB, ++\fBm\fR ++or ++\fBM\fR ++to indicate MB, ++\fBg\fR ++or ++\fBG\fR ++to indicate GB\&. The default value depends on the platform: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/ARM (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++OS X (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Windows: depends on virtual memory + .RE +-.RS ++.sp + The following examples set the thread stack size to 1024 KB in different units: +-.sp +-.nf +-\f3\-Xss1m\fP +-.fi +-.nf +-\f3\-Xss1024k\fP +-.fi +-.nf +-\f3\-Xss1048576\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-This option is equivalent to \f3-XX:ThreadStackSize\fR\&. +- +-.RE +-.TP +--Xusealtsigs +-.br +-Use alternative signals instead of \f3SIGUSR1\fR and \f3SIGUSR2\fR for JVM internal signals\&. This option is equivalent to \f3-XX:+UseAltSigs\fR\&. +-.TP +--Xverify:\fImode\fR +-.br +-Sets the mode of the bytecode verifier\&. Bytecode verification helps to troubleshoot some problems, but it also adds overhead to the running application\&. Possible \fImode\fR arguments for this option include the following: +-.RS +-.TP ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xss1m\fR ++\fB\-Xss1024k\fR ++\fB\-Xss1048576\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This option is equivalent to ++\fB\-XX:ThreadStackSize\fR\&. ++.RE ++.PP ++\-Xusealtsigs ++.RS 4 ++Use alternative signals instead of ++\fBSIGUSR1\fR ++and ++\fBSIGUSR2\fR ++for JVM internal signals\&. This option is equivalent to ++\fB\-XX:+UseAltSigs\fR\&. ++.RE ++.PP ++\-Xverify:\fImode\fR ++.RS 4 ++Sets the mode of the bytecode verifier\&. Bytecode verification helps to troubleshoot some problems, but it also adds overhead to the running application\&. Possible ++\fImode\fR ++arguments for this option include the following: ++.PP + none ++.RS 4 + Do not verify the bytecode\&. This reduces startup time and also reduces the protection provided by Java\&. +-.TP ++.RE ++.PP + remote +-Verify only those classes that are loaded remotely over the network\&. This is the default behavior if you do not specify the \f3-Xverify\fR option\&. +-.TP ++.RS 4 ++Verify only those classes that are loaded remotely over the network\&. This is the default behavior if you do not specify the ++\fB\-Xverify\fR ++option\&. ++.RE ++.PP + all ++.RS 4 + Verify all classes\&. +-.RE +- +-.SS ADVANCED\ RUNTIME\ OPTIONS ++.RE ++.RE ++.SS "Advanced Runtime Options" ++.PP + These options control the runtime behavior of the Java HotSpot VM\&. +-.TP +--XX:+DisableAttachMechanism +-.br +-Enables the option that disables the mechanism that lets tools attach to the JVM\&. By default, this option is disabled, meaning that the attach mechanism is enabled and you can use tools such as \f3jcmd\fR, \f3jstack\fR, \f3jmap\fR, and \f3jinfo\fR\&. +-.TP +--XX:ErrorFile=\fIfilename\fR +-.br +-Specifies the path and file name to which error data is written when an irrecoverable error occurs\&. By default, this file is created in the current working directory and named \f3hs_err_pid\fR\fIpid\fR\f3\&.log\fR where \fIpid\fR is the identifier of the process that caused the error\&. The following example shows how to set the default log file (note that the identifier of the process is specified as \f3%p\fR): +-.sp +-.nf +-\f3\-XX:ErrorFile=\&./hs_err_pid%p\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following example shows how to set the error log to \f3/var/log/java/java_error\&.log\fR: +-.sp +-.nf +-\f3\-XX:ErrorFile=/var/log/java/java_error\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If the file cannot be created in the specified directory (due to insufficient space, permission problem, or another issue), then the file is created in the temporary directory for the operating system\&. The temporary directory is \f3/tmp\fR\&. +-.TP +--XX:LargePageSizeInBytes=\fIsize\fR +-.br +-Sets the maximum size (in bytes) for large pages used for Java heap\&. The \fIsize\fR argument must be a power of 2 (2, 4, 8, 16, \&.\&.\&.)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for large pages automatically\&. +- ++.PP ++\-XX:+DisableAttachMechanism ++.RS 4 ++Enables the option that disables the mechanism that lets tools attach to the JVM\&. By default, this option is disabled, meaning that the attach mechanism is enabled and you can use tools such as ++\fBjcmd\fR, ++\fBjstack\fR, ++\fBjmap\fR, and ++\fBjinfo\fR\&. ++.RE ++.PP ++\-XX:ErrorFile=\fIfilename\fR ++.RS 4 ++Specifies the path and file name to which error data is written when an irrecoverable error occurs\&. By default, this file is created in the current working directory and named ++\fBhs_err_pid\fR\fIpid\fR\fB\&.log\fR ++where ++\fIpid\fR ++is the identifier of the process that caused the error\&. The following example shows how to set the default log file (note that the identifier of the process is specified as ++\fB%p\fR): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ErrorFile=\&./hs_err_pid%p\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example shows how to set the error log to ++\fB/var/log/java/java_error\&.log\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ErrorFile=/var/log/java/java_error\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If the file cannot be created in the specified directory (due to insufficient space, permission problem, or another issue), then the file is created in the temporary directory for the operating system\&. The temporary directory is ++\fB/tmp\fR\&. ++.RE ++.PP ++\-XX:+FailOverToOldVerifier ++.RS 4 ++Enables automatic failover to the old verifier when the new type checker fails\&. By default, this option is disabled and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. ++.RE ++.PP ++\-XX:LargePageSizeInBytes=\fIsize\fR ++.RS 4 ++Sets the maximum size (in bytes) for large pages used for Java heap\&. The ++\fIsize\fR ++argument must be a power of 2 (2, 4, 8, 16, \&.\&.\&.)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for large pages automatically\&. ++.sp + The following example illustrates how to set the large page size to 4 megabytes (MB): +-.sp +-.nf +-\f3\-XX:LargePageSizeInBytes=4m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxDirectMemorySize=\fIsize\fR +-.br +-Sets the maximum total size (in bytes) of the New I/O (the \f3java\&.nio\fR package) direct-buffer allocations\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for NIO direct-buffer allocations automatically\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:LargePageSizeInBytes=4m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxDirectMemorySize=\fIsize\fR ++.RS 4 ++Sets the maximum total size (in bytes) of the New I/O (the ++\fBjava\&.nio\fR ++package) direct\-buffer allocations\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for NIO direct\-buffer allocations automatically\&. ++.sp + The following examples illustrate how to set the NIO size to 1024 KB in different units: +-.sp +-.nf +-\f3\-XX:MaxDirectMemorySize=1m\fP +-.fi +-.nf +-\f3\-XX:MaxDirectMemorySize=1024k\fP +-.fi +-.nf +-\f3\-XX:MaxDirectMemorySize=1048576\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:NativeMemoryTracking=\fImode\fR +-.br +-Specifies the mode for tracking JVM native memory usage\&. Possible \fImode\fR arguments for this option include the following: +-.RS +-.TP ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxDirectMemorySize=1m\fR ++\fB\-XX:MaxDirectMemorySize=1024k\fR ++\fB\-XX:MaxDirectMemorySize=1048576\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:NativeMemoryTracking=\fImode\fR ++.RS 4 ++Specifies the mode for tracking JVM native memory usage\&. Possible ++\fImode\fR ++arguments for this option include the following: ++.PP + off +-Do not track JVM native memory usage\&. This is the default behavior if you do not specify the \f3-XX:NativeMemoryTracking\fR option\&. +-.TP ++.RS 4 ++Do not track JVM native memory usage\&. This is the default behavior if you do not specify the ++\fB\-XX:NativeMemoryTracking\fR ++option\&. ++.RE ++.PP + summary ++.RS 4 + Only track memory usage by JVM subsystems, such as Java heap, class, code, and thread\&. +-.TP ++.RE ++.PP + detail +-In addition to tracking memory usage by JVM subsystems, track memory usage by individual \f3CallSite\fR, individual virtual memory region and its committed regions\&. +-.RE +- +-.TP +--XX:OnError=\fIstring\fR +-.br +-Sets a custom command or a series of semicolon-separated commands to run when an irrecoverable error occurs\&. If the string contains spaces, then it must be enclosed in quotation marks\&. +- +-\fI\fRThe following example shows how the \f3-XX:OnError\fR option can be used to run the \f3gcore\fR command to create the core image, and the debugger is started to attach to the process in case of an irrecoverable error (the \f3%p\fR designates the current process): +-.sp +-.nf +-\f3\-XX:OnError="gcore %p;dbx \- %p"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:OnOutOfMemoryError=\fIstring\fR +-.br +-Sets a custom command or a series of semicolon-separated commands to run when an \f3OutOfMemoryError\fR exception is first thrown\&. If the string contains spaces, then it must be enclosed in quotation marks\&. For an example of a command string, see the description of the \f3-XX:OnError\fR option\&. +-.TP +--XX:+PrintCommandLineFlags +-.br ++.RS 4 ++In addition to tracking memory usage by JVM subsystems, track memory usage by individual ++\fBCallSite\fR, individual virtual memory region and its committed regions\&. ++.RE ++.RE ++.PP ++\-XX:OnError=\fIstring\fR ++.RS 4 ++Sets a custom command or a series of semicolon\-separated commands to run when an irrecoverable error occurs\&. If the string contains spaces, then it must be enclosed in quotation marks\&. ++.sp ++The following example shows how the ++\fB\-XX:OnError\fR ++option can be used to run the ++\fBgcore\fR ++command to create the core image, and the debugger is started to attach to the process in case of an irrecoverable error (the ++\fB%p\fR ++designates the current process): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:OnError="gcore %p;dbx \- %p"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:OnOutOfMemoryError=\fIstring\fR ++.RS 4 ++Sets a custom command or a series of semicolon\-separated commands to run when an ++\fBOutOfMemoryError\fR ++exception is first thrown\&. If the string contains spaces, then it must be enclosed in quotation marks\&. For an example of a command string, see the description of the ++\fB\-XX:OnError\fR ++option\&. ++.RE ++.PP ++\-XX:+PrintCommandLineFlags ++.RS 4 + Enables printing of ergonomically selected JVM flags that appeared on the command line\&. It can be useful to know the ergonomic values set by the JVM, such as the heap space size and the selected garbage collector\&. By default, this option is disabled and flags are not printed\&. +-.TP +--XX:+PrintNMTStatistics +-.br +-Enables printing of collected native memory tracking data at JVM exit when native memory tracking is enabled (see \f3-XX:NativeMemoryTracking\fR)\&. By default, this option is disabled and native memory tracking data is not printed\&. +-.TP +--XX:+ShowMessageBoxOnError +-.br ++.RE ++.PP ++\-XX:+PrintNMTStatistics ++.RS 4 ++Enables printing of collected native memory tracking data at JVM exit when native memory tracking is enabled (see ++\fB\-XX:NativeMemoryTracking\fR)\&. By default, this option is disabled and native memory tracking data is not printed\&. ++.RE ++.PP ++\-XX:+RelaxAccessControlCheck ++.RS 4 ++Decreases the amount of access control checks in the verifier\&. By default, this option is disabled, and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. ++.RE ++.PP ++\-XX:+ShowMessageBoxOnError ++.RS 4 + Enables displaying of a dialog box when the JVM experiences an irrecoverable error\&. This prevents the JVM from exiting and keeps the process active so that you can attach a debugger to it to investigate the cause of the error\&. By default, this option is disabled\&. +-.TP +--XX:ThreadStackSize=\fIsize\fR +-.br +-Sets the thread stack size (in bytes)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value depends on the platform: +-.RS +-.TP 0.2i +-\(bu +-Linux/ARM (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-OS X (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu ++.RE ++.PP ++\-XX:ThreadStackSize=\fIsize\fR ++.RS 4 ++Sets the thread stack size (in bytes)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value depends on the platform: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/ARM (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++OS X (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Windows: depends on virtual memory + .RE +-.RS ++.sp + The following examples show how to set the thread stack size to 1024 KB in different units: +-.sp +-.nf +-\f3\-XX:ThreadStackSize=1m\fP +-.fi +-.nf +-\f3\-XX:ThreadStackSize=1024k\fP +-.fi +-.nf +-\f3\-XX:ThreadStackSize=1048576\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-This option is equivalent to \f3-Xss\fR\&. +- +-.RE +-.TP +--XX:+TraceClassLoading +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ThreadStackSize=1m\fR ++\fB\-XX:ThreadStackSize=1024k\fR ++\fB\-XX:ThreadStackSize=1048576\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This option is equivalent to ++\fB\-Xss\fR\&. ++.RE ++.PP ++\-XX:+TraceClassLoading ++.RS 4 + Enables tracing of classes as they are loaded\&. By default, this option is disabled and classes are not traced\&. +-.TP +--XX:+TraceClassLoadingPreorder +-.br ++.RE ++.PP ++\-XX:+TraceClassLoadingPreorder ++.RS 4 + Enables tracing of all loaded classes in the order in which they are referenced\&. By default, this option is disabled and classes are not traced\&. +-.TP +--XX:+TraceClassResolution +-.br ++.RE ++.PP ++\-XX:+TraceClassResolution ++.RS 4 + Enables tracing of constant pool resolutions\&. By default, this option is disabled and constant pool resolutions are not traced\&. +-.TP +--XX:+TraceClassUnloading +-.br ++.RE ++.PP ++\-XX:+TraceClassUnloading ++.RS 4 + Enables tracing of classes as they are unloaded\&. By default, this option is disabled and classes are not traced\&. +-.TP +--XX:+TraceLoaderConstraints +-.br +-Enables tracing of the loader constraints recording\&. By default, this option is disabled and loader constraints recoding is not traced\&. +-.TP +--XX:+UseAltSigs +-.br +-Enables the use of alternative signals instead of \f3SIGUSR1\fR and \f3SIGUSR2\fR for JVM internal signals\&. By default, this option is disabled and alternative signals are not used\&. This option is equivalent to \f3-Xusealtsigs\fR\&. +-.TP +--XX:+UseBiasedLocking +-.br +-Enables the use of biased locking\&. Some applications with significant amounts of uncontended synchronization may attain significant speedups with this flag enabled, whereas applications with certain patterns of locking may see slowdowns\&. For more information about the biased locking technique, see the example in Java Tuning White Paper at http://www\&.oracle\&.com/technetwork/java/tuning-139912\&.html#section4\&.2\&.5 +- +-By default, this option is disabled and biased locking is not used\&. +-.TP +--XX:+UseCompressedOops +-.br +-Enables the use of compressed pointers\&. When this option is enabled, object references are represented as 32-bit offsets instead of 64-bit pointers, which typically increases performance when running the application with Java heap sizes less than 32 GB\&. This option works only for 64-bit JVMs\&. +- +-By default, this option is disabled and compressed pointers are not used\&. +-.TP +--XX:+UseLargePages +-.br +-Enables the use of large page memory\&. This option is enabled by default\&. To disable the use of large page memory, specify \f3-XX:-UseLargePages\fR\&. +- +-For more information, see Java Support for Large Memory Pages at http://www\&.oracle\&.com/technetwork/java/javase/tech/largememory-jsp-137182\&.html +-.TP +--XX:+UseMembar +-.br +-Enables issuing of membars on thread state transitions\&. This option is disabled by default on all platforms except Power PC and ARM servers, where it is enabled\&. To disable issuing of membars on thread state transitions for Power PC and ARM, specify \f3-XX:-UseMembar\fR\&. +-.TP +--XX:+UsePerfData +-.br +-Enables the \f3perfdata\fR feature\&. This option is enabled by default to allow JVM monitoring and performance testing\&. Disabling it suppresses the creation of the \f3hsperfdata_userid\fR directories\&. To disable the \f3perfdata\fR feature, specify \f3-XX:-UsePerfData\fR\&. +-.TP +--XX:+AllowUserSignalHandlers +-.br ++.RE ++.PP ++\-XX:+TraceLoaderConstraints ++.RS 4 ++Enables tracing of the loader constraints recording\&. By default, this option is disabled and loader constraints recording is not traced\&. ++.RE ++.PP ++\-XX:+UseAltSigs ++.RS 4 ++Enables the use of alternative signals instead of ++\fBSIGUSR1\fR ++and ++\fBSIGUSR2\fR ++for JVM internal signals\&. By default, this option is disabled and alternative signals are not used\&. This option is equivalent to ++\fB\-Xusealtsigs\fR\&. ++.RE ++.PP ++\-XX:\-UseBiasedLocking ++.RS 4 ++Disables the use of biased locking\&. Some applications with significant amounts of uncontended synchronization may attain significant speedups with this flag enabled, whereas applications with certain patterns of locking may see slowdowns\&. For more information about the biased locking technique, see the example in Java Tuning White Paper at http://www\&.oracle\&.com/technetwork/java/tuning\-139912\&.html#section4\&.2\&.5 ++.sp ++By default, this option is enabled\&. ++.RE ++.PP ++\-XX:\-UseCompressedOops ++.RS 4 ++Disables the use of compressed pointers\&. By default, this option is enabled, and compressed pointers are used when Java heap sizes are less than 32 GB\&. When this option is enabled, object references are represented as 32\-bit offsets instead of 64\-bit pointers, which typically increases performance when running the application with Java heap sizes less than 32 GB\&. This option works only for 64\-bit JVMs\&. ++.RE ++.PP ++\-XX:\-UseLargePages ++.RS 4 ++Disables the use of large page memory\&. This option is enabled by default\&. ++.sp ++For more information, see Java Support for Large Memory Pages at http://www\&.oracle\&.com/technetwork/java/javase/tech/largememory\-jsp\-137182\&.html ++.RE ++.PP ++\-XX:+UseMembar ++.RS 4 ++Enables issuing of membars on thread state transitions\&. This option is disabled by default on all platforms except ARM servers, where it is enabled\&. (It is recommended that you do not disable this option on ARM servers\&.) ++.RE ++.PP ++\-XX:+UsePerfData ++.RS 4 ++Enables the ++\fBperfdata\fR ++feature\&. This option is enabled by default to allow JVM monitoring and performance testing\&. Disabling it suppresses the creation of the ++\fBhsperfdata_userid\fR ++directories\&. To disable the ++\fBperfdata\fR ++feature, specify ++\fB\-XX:\-UsePerfData\fR\&. ++.RE ++.PP ++\-XX:+AllowUserSignalHandlers ++.RS 4 + Enables installation of signal handlers by the application\&. By default, this option is disabled and the application is not allowed to install signal handlers\&. +-.SS ADVANCED\ JIT\ COMPILER\ OPTIONS +-These options control the dynamic just-in-time (JIT) compilation performed by the Java HotSpot VM\&. +-.TP +--XX:+AggressiveOpts +-.br ++.RE ++.SS "Advanced JIT Compiler Options" ++.PP ++These options control the dynamic just\-in\-time (JIT) compilation performed by the Java HotSpot VM\&. ++.PP ++\-XX:+AggressiveOpts ++.RS 4 + Enables the use of aggressive performance optimization features, which are expected to become default in upcoming releases\&. By default, this option is disabled and experimental performance features are not used\&. +-.TP +--XX:AllocateInstancePrefetchLines=\fIlines\fR +-.br ++.RE ++.PP ++\-XX:AllocateInstancePrefetchLines=\fIlines\fR ++.RS 4 + Sets the number of lines to prefetch ahead of the instance allocation pointer\&. By default, the number of lines to prefetch is set to 1: +-.sp +-.nf +-\f3\-XX:AllocateInstancePrefetchLines=1\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchInstr=\fIinstruction\fR +-.br +-Sets the prefetch instruction to prefetch ahead of the allocation pointer\&. Possible values are from 0 to 3\&. The actual instructions behind the values depend on the platform\&. By default, the prefetch instruction is set to 0: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchInstr=0\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchStepSize=\fIsize\fR +-.br +-Sets the step size (in bytes) for sequential prefetch instructions\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the step size is set to 16 bytes: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchStepSize=16\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+BackgroundCompilation +-.br +-Enables background compilation\&. This option is enabled by default\&. To disable background compilation, specify \f3-XX:-BackgroundCompilation\fR (this is equivalent to specifying \f3-Xbatch\fR)\&. +-.TP +--XX:CICompilerCount=\fIthreads\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocateInstancePrefetchLines=1\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchDistance=\fIsize\fR ++.RS 4 ++Sets the size (in bytes) of the prefetch distance for object allocation\&. Memory about to be written with the value of new objects is prefetched up to this distance starting from the address of the last allocated object\&. Each Java thread has its own allocation point\&. ++.sp ++Negative values denote that prefetch distance is chosen based on the platform\&. Positive values are bytes to prefetch\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is set to \-1\&. ++.sp ++The following example shows how to set the prefetch distance to 1024 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchDistance=1024\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchInstr=\fIinstruction\fR ++.RS 4 ++Sets the prefetch instruction to prefetch ahead of the allocation pointer\&. Only the Java HotSpot Server VM supports this option\&. Possible values are from 0 to 3\&. The actual instructions behind the values depend on the platform\&. By default, the prefetch instruction is set to 0: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchInstr=0\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchLines=\fIlines\fR ++.RS 4 ++Sets the number of cache lines to load after the last object allocation by using the prefetch instructions generated in compiled code\&. The default value is 1 if the last allocated object was an instance, and 3 if it was an array\&. ++.sp ++The following example shows how to set the number of loaded cache lines to 5: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchLines=5\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchStepSize=\fIsize\fR ++.RS 4 ++Sets the step size (in bytes) for sequential prefetch instructions\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the step size is set to 16 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchStepSize=16\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchStyle=\fIstyle\fR ++.RS 4 ++Sets the generated code style for prefetch instructions\&. The ++\fIstyle\fR ++argument is an integer from 0 to 3: ++.PP ++0 ++.RS 4 ++Do not generate prefetch instructions\&. ++.RE ++.PP ++1 ++.RS 4 ++Execute prefetch instructions after each allocation\&. This is the default parameter\&. ++.RE ++.PP ++2 ++.RS 4 ++Use the thread\-local allocation block (TLAB) watermark pointer to determine when prefetch instructions are executed\&. ++.RE ++.PP ++3 ++.RS 4 ++Use BIS instruction on SPARC for allocation prefetch\&. ++.RE ++.sp ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+BackgroundCompilation ++.RS 4 ++Enables background compilation\&. This option is enabled by default\&. To disable background compilation, specify ++\fB\-XX:\-BackgroundCompilation\fR ++(this is equivalent to specifying ++\fB\-Xbatch\fR)\&. ++.RE ++.PP ++\-XX:CICompilerCount=\fIthreads\fR ++.RS 4 + Sets the number of compiler threads to use for compilation\&. By default, the number of threads is set to 2 for the server JVM, to 1 for the client JVM, and it scales to the number of cores if tiered compilation is used\&. The following example shows how to set the number of threads to 2: +-.sp +-.nf +-\f3\-XX:CICompilerCount=2\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CodeCacheMinimumFreeSpace=\fIsize\fR +-.br +-Sets the minimum free space (in bytes) required for compilation\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. When less than the minimum free space remains, compiling stops\&. By default, this option is set to 500 KB\&. The following example shows how to set the minimum free space to 1024 MB: +-.sp +-.nf +-\f3\-XX:CodeCacheMinimumFreeSpace=1024m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] +-.br +-Specifies a command to perform on a method\&. For example, to exclude the \f3indexOf()\fR method of the \f3String\fR class from being compiled, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand=exclude,java/lang/String\&.indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Note that the full class name is specified, including all packages and subpackages separated by a slash (\f3/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the \f3-XX:+PrintCompilation\fR and \f3-XX:+LogCompilation\fR options: +-.sp +-.nf +-\f3\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If the method is specified without the signature, the command will be applied to all methods with the specified name\&. However, you can also specify the signature of the method in the class file format\&. In this case, you should enclose the arguments in quotation marks, because otherwise the shell treats the semicolon as command end\&. For example, if you want to exclude only the \f3indexOf(String)\fR method of the \f3String\fR class from being compiled, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand="exclude,java/lang/String\&.indexOf,(Ljava/lang/String;)I"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-You can also use the asterisk (*) as a wildcard for class and method names\&. For example, to exclude all \f3indexOf()\fR methods in all classes from being compiled, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand=exclude,*\&.indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The commas and periods are aliases for spaces, making it easier to pass compiler commands through a shell\&. You can pass arguments to \f3-XX:CompileCommand\fR using spaces as separators by enclosing the argument in quotation marks: +-.sp +-.nf +-\f3\-XX:CompileCommand="exclude java/lang/String indexOf"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Note that after parsing the commands passed on the command line using the \f3-XX:CompileCommand\fR options, the JIT compiler then reads commands from the \f3\&.hotspot_compiler\fR file\&. You can add commands to this file or specify a different file using the \f3-XX:CompileCommandFile\fR option\&. +- +-To add several commands, either specify the \f3-XX:CompileCommand\fR option multiple times, or separate each argument with the newline separator (\f3\en\fR)\&. The following commands are available: +-.RS +-.TP ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CICompilerCount=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CodeCacheMinimumFreeSpace=\fIsize\fR ++.RS 4 ++Sets the minimum free space (in bytes) required for compilation\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. When less than the minimum free space remains, compiling stops\&. By default, this option is set to 500 KB\&. The following example shows how to set the minimum free space to 1024 MB: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CodeCacheMinimumFreeSpace=1024m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] ++.RS 4 ++Specifies a command to perform on a method\&. For example, to exclude the ++\fBindexOf()\fR ++method of the ++\fBString\fR ++class from being compiled, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Note that the full class name is specified, including all packages and subpackages separated by a slash (\fB/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the ++\fB\-XX:+PrintCompilation\fR ++and ++\fB\-XX:+LogCompilation\fR ++options: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If the method is specified without the signature, the command will be applied to all methods with the specified name\&. However, you can also specify the signature of the method in the class file format\&. In this case, you should enclose the arguments in quotation marks, because otherwise the shell treats the semicolon as command end\&. For example, if you want to exclude only the ++\fBindexOf(String)\fR ++method of the ++\fBString\fR ++class from being compiled, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude,java/lang/String\&.indexOf,(Ljava/lang/String;)I"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++You can also use the asterisk (*) as a wildcard for class and method names\&. For example, to exclude all ++\fBindexOf()\fR ++methods in all classes from being compiled, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,*\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The commas and periods are aliases for spaces, making it easier to pass compiler commands through a shell\&. You can pass arguments to ++\fB\-XX:CompileCommand\fR ++using spaces as separators by enclosing the argument in quotation marks: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude java/lang/String indexOf"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Note that after parsing the commands passed on the command line using the ++\fB\-XX:CompileCommand\fR ++options, the JIT compiler then reads commands from the ++\fB\&.hotspot_compiler\fR ++file\&. You can add commands to this file or specify a different file using the ++\fB\-XX:CompileCommandFile\fR ++option\&. ++.sp ++To add several commands, either specify the ++\fB\-XX:CompileCommand\fR ++option multiple times, or separate each argument with the newline separator (\fB\en\fR)\&. The following commands are available: ++.PP + break ++.RS 4 + Set a breakpoint when debugging the JVM to stop at the beginning of compilation of the specified method\&. +-.TP ++.RE ++.PP + compileonly +-Exclude all methods from compilation except for the specified method\&. As an alternative, you can use the \f3-XX:CompileOnly\fR option, which allows to specify several methods\&. +-.TP ++.RS 4 ++Exclude all methods from compilation except for the specified method\&. As an alternative, you can use the ++\fB\-XX:CompileOnly\fR ++option, which allows to specify several methods\&. ++.RE ++.PP + dontinline ++.RS 4 + Prevent inlining of the specified method\&. +-.TP ++.RE ++.PP + exclude ++.RS 4 + Exclude the specified method from compilation\&. +-.TP ++.RE ++.PP + help +-Print a help message for the \f3-XX:CompileCommand\fR option\&. +-.TP ++.RS 4 ++Print a help message for the ++\fB\-XX:CompileCommand\fR ++option\&. ++.RE ++.PP + inline ++.RS 4 + Attempt to inline the specified method\&. +-.TP ++.RE ++.PP + log +-Exclude compilation logging (with the \f3-XX:+LogCompilation\fR option) for all methods except for the specified method\&. By default, logging is performed for all compiled methods\&. +-.TP ++.RS 4 ++Exclude compilation logging (with the ++\fB\-XX:+LogCompilation\fR ++option) for all methods except for the specified method\&. By default, logging is performed for all compiled methods\&. ++.RE ++.PP + option +-This command can be used to pass a JIT compilation option to the specified method in place of the last argument (\fIoption\fR)\&. The compilation option is set at the end, after the method name\&. For example, to enable the \f3BlockLayoutByFrequency\fR option for the \f3append()\fR method of the \f3StringBuffer\fR class, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.RS 4 ++This command can be used to pass a JIT compilation option to the specified method in place of the last argument (\fIoption\fR)\&. The compilation option is set at the end, after the method name\&. For example, to enable the ++\fBBlockLayoutByFrequency\fR ++option for the ++\fBappend()\fR ++method of the ++\fBStringBuffer\fR ++class, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + You can specify multiple compilation options, separated by commas or spaces\&. +-.TP ++.RE ++.PP + print ++.RS 4 + Print generated assembler code after compilation of the specified method\&. +-.TP ++.RE ++.PP + quiet +-Do not print the compile commands\&. By default, the commands that you specify with the -\f3XX:CompileCommand\fR option are printed; for example, if you exclude from compilation the \f3indexOf()\fR method of the \f3String\fR class, then the following will be printed to standard output: +-.sp +-.nf +-\f3CompilerOracle: exclude java/lang/String\&.indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-You can suppress this by specifying the \f3-XX:CompileCommand=quiet\fR option before other \f3-XX:CompileCommand\fR options\&. +-.RE +- +-.TP +--XX:CompileCommandFile=\fIfilename\fR +-.br +-Sets the file from which JIT compiler commands are read\&. By default, the \f3\&.hotspot_compiler\fR file is used to store commands performed by the JIT compiler\&. +- +-Each line in the command file represents a command, a class name, and a method name for which the command is used\&. For example, this line prints assembly code for the \f3toString()\fR method of the \f3String\fR class: +-.sp +-.nf +-\f3print java/lang/String toString\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-For more information about specifying the commands for the JIT compiler to perform on methods, see the \f3-XX:CompileCommand\fR option\&. +-.TP +--XX:CompileOnly=\fImethods\fR +-.br +-Sets the list of methods (separated by commas) to which compilation should be restricted\&. Only the specified methods will be compiled\&. Specify each method with the full class name (including the packages and subpackages)\&. For example, to compile only the \f3length()\fR method of the \f3String\fR class and the \f3size()\fR method of the \f3List\fR class, use the following: +-.sp +-.nf +-\f3\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Note that the full class name is specified, including all packages and subpackages separated by a slash (\f3/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the \f3-XX:+PrintCompilation\fR and \f3-XX:+LogCompilation\fR options: +-.sp +-.nf +-\f3\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.RS 4 ++Do not print the compile commands\&. By default, the commands that you specify with the \-\fBXX:CompileCommand\fR ++option are printed; for example, if you exclude from compilation the ++\fBindexOf()\fR ++method of the ++\fBString\fR ++class, then the following will be printed to standard output: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompilerOracle: exclude java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++You can suppress this by specifying the ++\fB\-XX:CompileCommand=quiet\fR ++option before other ++\fB\-XX:CompileCommand\fR ++options\&. ++.RE ++.RE ++.PP ++\-XX:CompileCommandFile=\fIfilename\fR ++.RS 4 ++Sets the file from which JIT compiler commands are read\&. By default, the ++\fB\&.hotspot_compiler\fR ++file is used to store commands performed by the JIT compiler\&. ++.sp ++Each line in the command file represents a command, a class name, and a method name for which the command is used\&. For example, this line prints assembly code for the ++\fBtoString()\fR ++method of the ++\fBString\fR ++class: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBprint java/lang/String toString\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++For more information about specifying the commands for the JIT compiler to perform on methods, see the ++\fB\-XX:CompileCommand\fR ++option\&. ++.RE ++.PP ++\-XX:CompileOnly=\fImethods\fR ++.RS 4 ++Sets the list of methods (separated by commas) to which compilation should be restricted\&. Only the specified methods will be compiled\&. Specify each method with the full class name (including the packages and subpackages)\&. For example, to compile only the ++\fBlength()\fR ++method of the ++\fBString\fR ++class and the ++\fBsize()\fR ++method of the ++\fBList\fR ++class, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Note that the full class name is specified, including all packages and subpackages separated by a slash (\fB/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the ++\fB\-XX:+PrintCompilation\fR ++and ++\fB\-XX:+LogCompilation\fR ++options: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + Although wildcards are not supported, you can specify only the class or package name to compile all methods in that class or package, as well as specify just the method to compile methods with this name in any class: +-.sp +-.nf +-\f3\-XX:CompileOnly=java/lang/String\fP +-.fi +-.nf +-\f3\-XX:CompileOnly=java/lang\fP +-.fi +-.nf +-\f3\-XX:CompileOnly=\&.length\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CompileThreshold=\fIinvocations\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\fR ++\fB\-XX:CompileOnly=java/lang\fR ++\fB\-XX:CompileOnly=\&.length\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileThreshold=\fIinvocations\fR ++.RS 4 + Sets the number of interpreted method invocations before compilation\&. By default, in the server JVM, the JIT compiler performs 10,000 interpreted method invocations to gather information for efficient compilation\&. For the client JVM, the default setting is 1,500 invocations\&. The following example shows how to set the number of interpreted method invocations to 5,000: +-.sp +-.nf +-\f3\-XX:CompileThreshold=5000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-You can completely disable interpretation of Java methods before compilation by specifying the \f3-Xcomp\fR option\&. +-.TP +--XX:+DoEscapeAnalysis +-.br +-Enables the use of escape analysis\&. This option is enabled by default\&. To disable the use of escape analysis, specify \f3-XX:-DoEscapeAnalysis\fR\&. +-.TP +--XX:+FailOverToOldVerifier +-.br +-Enables automatic failover to the old verifier when the new type checker fails\&. By default, this option is disabled and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. +-.TP +--XX:InitialCodeCacheSize=\fIsize\fR +-.br +-Sets the initial code cache size (in bytes)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is set to 500 KB\&. The following example shows how to set the initial code cache size to 32 KB: +-.sp +-.nf +-\f3\-XX:InitialCodeCacheSize=32k\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+Inline +-.br +-Enables method inlining\&. This option is enabled by default to increase performance\&. To disable method inlining, specify \f3-XX:-Inline\fR\&. +-.TP +--XX:InlineSmallCode=\fIsize\fR +-.br +-Sets the maximum code size (in bytes) for compiled methods that should be inlined\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. Only compiled methods with the size smaller than the specified size will be inlined\&. By default, the maximum code size is set to 1000 bytes: +-.sp +-.nf +-\f3\-XX:InlineSmallCode=1000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+LogCompilation +-.br +-Enables logging of compilation activity to a file named \f3hotspot\&.log\fR in the current working directory\&. You can specify a different log file path and name using the \f3-XX:LogFile\fR option\&. +- +-By default, this option is disabled and compilation activity is not logged\&. The \f3-XX:+LogCompilation\fR option has to be used together with the \f3-XX:UnlockDiagnosticVMOptions\fR option that unlocks diagnostic JVM options\&. +- +-You can enable verbose diagnostic output with a message printed to the console every time a method is compiled by using the \f3-XX:+PrintCompilation\fR option\&. +-.TP +--XX:MaxInlineSize=\fIsize\fR +-.br +-Sets the maximum bytecode size (in bytes) of a method to be inlined\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the maximum bytecode size is set to 35 bytes: +-.sp +-.nf +-\f3\-XX:MaxInlineSize=35\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxNodeLimit=\fInodes\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileThreshold=5000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++You can completely disable interpretation of Java methods before compilation by specifying the ++\fB\-Xcomp\fR ++option\&. ++.RE ++.PP ++\-XX:+DoEscapeAnalysis ++.RS 4 ++Enables the use of escape analysis\&. This option is enabled by default\&. To disable the use of escape analysis, specify ++\fB\-XX:\-DoEscapeAnalysis\fR\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:InitialCodeCacheSize=\fIsize\fR ++.RS 4 ++Sets the initial code cache size (in bytes)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is set to 500 KB\&. The following example shows how to set the initial code cache size to 32 KB: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialCodeCacheSize=32k\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+Inline ++.RS 4 ++Enables method inlining\&. This option is enabled by default to increase performance\&. To disable method inlining, specify ++\fB\-XX:\-Inline\fR\&. ++.RE ++.PP ++\-XX:InlineSmallCode=\fIsize\fR ++.RS 4 ++Sets the maximum code size (in bytes) for compiled methods that should be inlined\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. Only compiled methods with the size smaller than the specified size will be inlined\&. By default, the maximum code size is set to 1000 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InlineSmallCode=1000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+LogCompilation ++.RS 4 ++Enables logging of compilation activity to a file named ++\fBhotspot\&.log\fR ++in the current working directory\&. You can specify a different log file path and name using the ++\fB\-XX:LogFile\fR ++option\&. ++.sp ++By default, this option is disabled and compilation activity is not logged\&. The ++\fB\-XX:+LogCompilation\fR ++option has to be used together with the ++\fB\-XX:UnlockDiagnosticVMOptions\fR ++option that unlocks diagnostic JVM options\&. ++.sp ++You can enable verbose diagnostic output with a message printed to the console every time a method is compiled by using the ++\fB\-XX:+PrintCompilation\fR ++option\&. ++.RE ++.PP ++\-XX:MaxInlineSize=\fIsize\fR ++.RS 4 ++Sets the maximum bytecode size (in bytes) of a method to be inlined\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the maximum bytecode size is set to 35 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxInlineSize=35\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxNodeLimit=\fInodes\fR ++.RS 4 + Sets the maximum number of nodes to be used during single method compilation\&. By default, the maximum number of nodes is set to 65,000: +-.sp +-.nf +-\f3\-XX:MaxNodeLimit=65000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxTrivialSize=\fIsize\fR +-.br +-Sets the maximum bytecode size (in bytes) of a trivial method to be inlined\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the maximum bytecode size of a trivial method is set to 6 bytes: +-.sp +-.nf +-\f3\-XX:MaxTrivialSize=6\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+OptimizeStringConcat +-.br +-Enables the optimization of \f3String\fR concatenation operations\&. This option is enabled by default\&. To disable the optimization of \f3String\fR concatenation operations, specify \f3-XX:-OptimizeStringConcat\fR\&. +-.TP +--XX:+PrintAssembly +-.br +-Enables printing of assembly code for bytecoded and native methods by using the external \f3disassembler\&.so\fR library\&. This enables you to see the generated code, which may help you to diagnose performance issues\&. +- +-By default, this option is disabled and assembly code is not printed\&. The \f3-XX:+PrintAssembly\fR option has to be used together with the \f3-XX:UnlockDiagnosticVMOptions\fR option that unlocks diagnostic JVM options\&. +-.TP +--XX:+PrintCompilation +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxNodeLimit=65000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxTrivialSize=\fIsize\fR ++.RS 4 ++Sets the maximum bytecode size (in bytes) of a trivial method to be inlined\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the maximum bytecode size of a trivial method is set to 6 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxTrivialSize=6\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+OptimizeStringConcat ++.RS 4 ++Enables the optimization of ++\fBString\fR ++concatenation operations\&. This option is enabled by default\&. To disable the optimization of ++\fBString\fR ++concatenation operations, specify ++\fB\-XX:\-OptimizeStringConcat\fR\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+PrintAssembly ++.RS 4 ++Enables printing of assembly code for bytecoded and native methods by using the external ++\fBdisassembler\&.so\fR ++library\&. This enables you to see the generated code, which may help you to diagnose performance issues\&. ++.sp ++By default, this option is disabled and assembly code is not printed\&. The ++\fB\-XX:+PrintAssembly\fR ++option has to be used together with the ++\fB\-XX:UnlockDiagnosticVMOptions\fR ++option that unlocks diagnostic JVM options\&. ++.RE ++.PP ++\-XX:+PrintCompilation ++.RS 4 + Enables verbose diagnostic output from the JVM by printing a message to the console every time a method is compiled\&. This enables you to see which methods actually get compiled\&. By default, this option is disabled and diagnostic output is not printed\&. +- +-You can also log compilation activity to a file by using the \f3-XX:+LogCompilation\fR option\&. +-.TP +--XX:+PrintInlining +-.br ++.sp ++You can also log compilation activity to a file by using the ++\fB\-XX:+LogCompilation\fR ++option\&. ++.RE ++.PP ++\-XX:+PrintInlining ++.RS 4 + Enables printing of inlining decisions\&. This enables you to see which methods are getting inlined\&. +- +-By default, this option is disabled and inlining information is not printed\&. The \f3-XX:+PrintInlining\fR option has to be used together with the \f3-XX:+UnlockDiagnosticVMOptions\fR option that unlocks diagnostic JVM options\&. +-.TP +--XX:+RelaxAccessControlCheck +-.br +-Decreases the amount of access control checks in the verifier\&. By default, this option is disabled, and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. +-.TP +--XX:ReservedCodeCacheSize=\fIsize\fR +-.br +-Sets the maximum code cache size (in bytes) for JIT-compiled code\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. This option is equivalent to \f3-Xmaxjitcodesize\fR\&. +-.TP +--XX:+TieredCompilation +-.br +-Enables the use of tiered compilation\&. By default, this option is disabled and tiered compilation is not used\&. +-.TP +--XX:+UseCodeCacheFlushing +-.br +-Enables flushing of the code cache before shutting down the compiler\&. This option is enabled by default\&. To disable flushing of the code cache before shutting down the compiler, specify \f3-XX:-UseCodeCacheFlushing\fR\&. +-.TP +--XX:+UseCondCardMark +-.br +-Enables checking of whether the card is already marked before updating the card table\&. This option is disabled by default and should only be used on machines with multiple sockets, where it will increase performance of Java applications that rely heavily on concurrent operations\&. +-.TP +--XX:+UseSuperWord +-.br +-Enables the transformation of scalar operations into superword operations\&. This option is enabled by default\&. To disable the transformation of scalar operations into superword operations, specify \f3-XX:-UseSuperWord\fR\&. +-.SS ADVANCED\ SERVICEABILITY\ OPTIONS ++.sp ++By default, this option is disabled and inlining information is not printed\&. The ++\fB\-XX:+PrintInlining\fR ++option has to be used together with the ++\fB\-XX:+UnlockDiagnosticVMOptions\fR ++option that unlocks diagnostic JVM options\&. ++.RE ++.PP ++\-XX:ReservedCodeCacheSize=\fIsize\fR ++.RS 4 ++Sets the maximum code cache size (in bytes) for JIT\-compiled code\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. This option is equivalent to ++\fB\-Xmaxjitcodesize\fR\&. ++.RE ++.PP ++\-XX:+TieredCompilation ++.RS 4 ++Enables the use of tiered compilation\&. By default, this option is enabled\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+UseAES ++.RS 4 ++Enables hardware\-based AES intrinsics for Intel, AMD, and SPARC hardware\&. Intel Westmere (2010 and newer), AMD Bulldozer (2011 and newer), and SPARC (T4 and newer) are the supported hardware\&. UseAES is used in conjunction with UseAESIntrinsics\&. ++.RE ++.PP ++\-XX:+UseAESIntrinsics ++.RS 4 ++UseAES and UseAESIntrinsics flags are enabled by default and are supported only for Java HotSpot Server VM 32\-bit and 64\-bit\&. To disable hardware\-based AES intrinsics, specify ++\fB\-XX:\-UseAES \-XX:\-UseAESIntrinsics\fR\&. For example, to enable hardware AES, use the following flags: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:+UseAES \-XX:+UseAESIntrinsics\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++To support UseAES and UseAESIntrinsics flags for 32\-bit and 64\-bit use ++\fB\-server\fR ++option to choose Java HotSpot Server VM\&. These flags are not supported on Client VM\&. ++.RE ++.PP ++\-XX:+UseCodeCacheFlushing ++.RS 4 ++Enables flushing of the code cache before shutting down the compiler\&. This option is enabled by default\&. To disable flushing of the code cache before shutting down the compiler, specify ++\fB\-XX:\-UseCodeCacheFlushing\fR\&. ++.RE ++.PP ++\-XX:+UseCondCardMark ++.RS 4 ++Enables checking of whether the card is already marked before updating the card table\&. This option is disabled by default and should only be used on machines with multiple sockets, where it will increase performance of Java applications that rely heavily on concurrent operations\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+UseSuperWord ++.RS 4 ++Enables the transformation of scalar operations into superword operations\&. This option is enabled by default\&. To disable the transformation of scalar operations into superword operations, specify ++\fB\-XX:\-UseSuperWord\fR\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.SS "Experimental JIT Compiler Options" ++.PP ++The options related to the Restricted Transactional Memory (RTM) locking feature in this section are experimental and are not officially supported in Java SE 8u20; you must enable the ++\fB\-XX:+UnlockExperimentalVMOptions\fR ++option to use them\&. These options are only available for the Java HotSpot Server VM on x86 CPUs that support Transactional Synchronization Extensions (TSX)\&. ++.PP ++\-XX:RTMAbortRatio=\fIabort_ratio\fR ++.RS 4 ++The RTM abort ratio is specified as a percentage (%) of all executed RTM transactions\&. If a number of aborted transactions becomes greater than this ratio, then the compiled code will be deoptimized\&. This ratio is used when the ++\fB\-XX:+UseRTMDeopt\fR ++option is enabled\&. The default value of this option is 50\&. This means that the compiled code will be deoptimized if 50% of all transactions are aborted\&. ++.RE ++.PP ++\-XX:RTMRetryCount=\fInumber_of_retries\fR ++.RS 4 ++RTM locking code will be retried, when it is aborted or busy, the number of times specified by this option before falling back to the normal locking mechanism\&. The default value for this option is 5\&. The ++\fB\-XX:UseRTMLocking\fR ++option must be enabled\&. ++.RE ++.PP ++\-XX:+UseRTMDeopt ++.RS 4 ++Auto\-tunes RTM locking depending on the abort ratio\&. This ratio is specified by ++\fB\-XX:RTMAbortRatio\fR ++option\&. If the number of aborted transactions exceeds the abort ratio, then the method containing the lock will be deoptimized and recompiled with all locks as normal locks\&. This option is disabled by default\&. The ++\fB\-XX:UseRTMLocking\fR ++option must be enabled\&. ++.RE ++.PP ++\-XX:+UseRTMLocking ++.RS 4 ++Generate Restricted Transactional Memory (RTM) locking code for all inflated locks, with the normal locking mechanism as the fallback handler\&. This option is disabled by default\&. ++.sp ++RTM is part of Intel\*(Aqs Transactional Synchronization Extensions (TSX), which is an x86 instruction set extension and facilitates the creation of multithreaded applications\&. RTM introduces the new instructions ++\fBXBEGIN\fR, ++\fBXABORT\fR, ++\fBXEND\fR, and ++\fBXTEST\fR\&. The ++\fBXBEGIN\fR ++and ++\fBXEND\fR ++instructions enclose a set of instructions to run as a transaction\&. If no conflict is found when running the transaction, the memory and register modifications are committed together at the ++\fBXEND\fR ++instruction\&. The ++\fBXABORT\fR ++instruction can be used to explicitly abort a transaction and the ++\fBXEND\fR ++instruction to check if a set of instructions are being run in a transaction\&. ++.sp ++A lock on a transaction is inflated when another thread tries to access the same transaction, thereby blocking the thread that did not originally request access to the transaction\&. RTM requires that a fallback set of operations be specified in case a transaction aborts or fails\&. An RTM lock is a lock that has been delegated to the TSX\*(Aqs system\&. ++.sp ++RTM improves performance for highly contended locks with low conflict in a critical region (which is code that must not be accessed by more than one thread concurrently)\&. RTM also improves the performance of coarse\-grain locking, which typically does not perform well in multithreaded applications\&. (Coarse\-grain locking is the strategy of holding locks for long periods to minimize the overhead of taking and releasing locks, while fine\-grained locking is the strategy of trying to achieve maximum parallelism by locking only when necessary and unlocking as soon as possible\&.) Also, for lightly contended locks that are used by different threads, RTM can reduce false cache line sharing, also known as cache line ping\-pong\&. This occurs when multiple threads from different processors are accessing different resources, but the resources share the same cache line\&. As a result, the processors repeatedly invalidate the cache lines of other processors, which forces them to read from main memory instead of their cache\&. ++.RE ++.SS "Advanced Serviceability Options" ++.PP + These options provide the ability to gather system information and perform extensive debugging\&. +-.TP +--XX:+ExtendedDTraceProbes +-.br +-Enables additional \f3dtrace\fR tool probes that impact the performance\&. By default, this option is disabled and \f3dtrace\fR performs only standard probes\&. +-.TP +--XX:+HeapDumpOnOutOfMemory +-.br +-Enables the dumping of the Java heap to a file in the current directory by using the heap profiler (HPROF) when a \f3java\&.lang\&.OutOfMemoryError\fR exception is thrown\&. You can explicitly set the heap dump file path and name using the \f3-XX:HeapDumpPath\fR option\&. By default, this option is disabled and the heap is not dumped when an \f3OutOfMemoryError\fR exception is thrown\&. +-.TP +--XX:HeapDumpPath=\fIpath\fR +-.br +-Sets the path and file name for writing the heap dump provided by the heap profiler (HPROF) when the \f3-XX:+HeapDumpOnOutOfMemoryError\fR option is set\&. By default, the file is created in the current working directory, and it is named \f3java_pid\fR\fIpid\fR\f3\&.hprof\fR where \fIpid\fR is the identifier of the process that caused the error\&. The following example shows how to set the default file explicitly (\f3%p\fR represents the current process identificator): +-.sp +-.nf +-\f3\-XX:HeapDumpPath=\&./java_pid%p\&.hprof\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\fI\fRThe following example shows how to set the heap dump file to \f3/var/log/java/java_heapdump\&.hprof\fR: +-.sp +-.nf +-\f3\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:LogFile=\fIpath\fR +-.br +-Sets the path and file name where log data is written\&. By default, the file is created in the current working directory, and it is named \f3hotspot\&.log\fR\&. +- +-\fI\fRThe following example shows how to set the log file to \f3/var/log/java/hotspot\&.log\fR: +-.sp +-.nf +-\f3\-XX:LogFile=/var/log/java/hotspot\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+PrintClassHistogram +-.br +-\fI\fREnables printing of a class instance histogram after a \f3Control+C\fR event (\f3SIGTERM\fR)\&. By default, this option is disabled\&. +- +-Setting this option is equivalent to running the \f3jmap -histo\fR command, or the \f3jcmd\fR\fIpid\fR\f3GC\&.class_histogram\fR command, where \fIpid\fR is the current Java process identifier\&. +-.TP +--XX:+PrintConcurrentLocks +- +- +-Enables printing of j\f3ava\&.util\&.concurrent\fR locks after a \f3Control+C\fR event (\f3SIGTERM\fR)\&. By default, this option is disabled\&. +- +-Setting this option is equivalent to running the \f3jstack -l\fR command or the \f3jcmd\fR\fIpid\fR\f3Thread\&.print -l\fR command, where \fIpid\fR is the current Java process identifier\&. +-.TP +--XX:+UnlockDiagnosticVMOptions +-.br ++.PP ++\-XX:+ExtendedDTraceProbes ++.RS 4 ++Enables additional ++\fBdtrace\fR ++tool probes that impact the performance\&. By default, this option is disabled and ++\fBdtrace\fR ++performs only standard probes\&. ++.RE ++.PP ++\-XX:+HeapDumpOnOutOfMemory ++.RS 4 ++Enables the dumping of the Java heap to a file in the current directory by using the heap profiler (HPROF) when a ++\fBjava\&.lang\&.OutOfMemoryError\fR ++exception is thrown\&. You can explicitly set the heap dump file path and name using the ++\fB\-XX:HeapDumpPath\fR ++option\&. By default, this option is disabled and the heap is not dumped when an ++\fBOutOfMemoryError\fR ++exception is thrown\&. ++.RE ++.PP ++\-XX:HeapDumpPath=\fIpath\fR ++.RS 4 ++Sets the path and file name for writing the heap dump provided by the heap profiler (HPROF) when the ++\fB\-XX:+HeapDumpOnOutOfMemoryError\fR ++option is set\&. By default, the file is created in the current working directory, and it is named ++\fBjava_pid\fR\fIpid\fR\fB\&.hprof\fR ++where ++\fIpid\fR ++is the identifier of the process that caused the error\&. The following example shows how to set the default file explicitly (\fB%p\fR ++represents the current process identificator): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=\&./java_pid%p\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example shows how to set the heap dump file to ++\fB/var/log/java/java_heapdump\&.hprof\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:LogFile=\fIpath\fR ++.RS 4 ++Sets the path and file name where log data is written\&. By default, the file is created in the current working directory, and it is named ++\fBhotspot\&.log\fR\&. ++.sp ++The following example shows how to set the log file to ++\fB/var/log/java/hotspot\&.log\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:LogFile=/var/log/java/hotspot\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+PrintClassHistogram ++.RS 4 ++Enables printing of a class instance histogram after a ++\fBControl+C\fR ++event (\fBSIGTERM\fR)\&. By default, this option is disabled\&. ++.sp ++Setting this option is equivalent to running the ++\fBjmap \-histo\fR ++command, or the ++\fBjcmd \fR\fIpid\fR\fB GC\&.class_histogram\fR ++command, where ++\fIpid\fR ++is the current Java process identifier\&. ++.RE ++.PP ++\-XX:+PrintConcurrentLocks ++.RS 4 ++Enables printing of j locks after a event\&. By default, this option is disabled\&. ++.sp ++Enables printing of j\fBava\&.util\&.concurrent\fR ++locks after a ++\fBControl+C\fR ++event (\fBSIGTERM\fR)\&. By default, this option is disabled\&. ++.sp ++Setting this option is equivalent to running the ++\fBjstack \-l\fR ++command or the ++\fBjcmd \fR\fIpid\fR\fB Thread\&.print \-l\fR ++command, where ++\fIpid\fR ++is the current Java process identifier\&. ++.RE ++.PP ++\-XX:+UnlockDiagnosticVMOptions ++.RS 4 + Unlocks the options intended for diagnosing the JVM\&. By default, this option is disabled and diagnostic options are not available\&. +-.SS ADVANCED\ GARBAGE\ COLLECTION\ OPTIONS ++.RE ++.SS "Advanced Garbage Collection Options" ++.PP + These options control how garbage collection (GC) is performed by the Java HotSpot VM\&. +-.TP +--XX:+AggressiveHeap +-.br +-Enables Java heap optimization\&. This sets various parameters to be optimal for long-running jobs with intensive memory allocation, based on the configuration of the computer (RAM and CPU)\&. By default, the option is disabled and the heap is not optimized\&. +-.TP +--XX:AllocatePrefetchDistance=\fIsize\fR +-.br +-Sets the size (in bytes) of the prefetch distance for object allocation\&. Memory about to be written with the value of new objects is prefetched up to this distance starting from the address of the last allocated object\&. Each Java thread has its own allocation point\&. +- +-Negative values denote that prefetch distance is chosen based on the platform\&. Positive values are bytes to prefetch\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is set to -1\&. +- +-The following example shows how to set the prefetch distance to 1024 bytes: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchDistance=1024\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchLines=\fIlines\fR +-.br +-Sets the number of cache lines to load after the last object allocation by using the prefetch instructions generated in compiled code\&. The default value is 1 if the last allocated object was an instance, and 3 if it was an array\&. +- +-The following example shows how to set the number of loaded cache lines to 5: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchLines=5\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchStyle=\fIstyle\fR +-.br +-Sets the generated code style for prefetch instructions\&. The \fIstyle\fR argument is an integer from 0 to 3: +-.RS +-.TP +-0 +-Do not generate prefetch instructions\&. +-.TP +-1 +-Execute prefetch instructions after each allocation\&. This is the default parameter\&. +-.TP +-2 +-Use the thread-local allocation block (TLAB) watermark pointer to determine when prefetch instructions are executed\&. +-.TP +-3 +-Use BIS instruction on SPARC for allocation prefetch\&. +-.RE +- +-.TP +--XX:+AlwaysPreTouch +-.br +-Enables touching of every page on the Java heap during JVM initialization\&. This gets all pages into the memory before entering the \f3main()\fR method\&. The option can be used in testing to simulate a long-running system with all virtual memory mapped to physical memory\&. By default, this option is disabled and all pages are committed as JVM heap space fills\&. +-.TP +--XX:+CMSClassUnloadingEnabled +-.br +-Enables class unloading when using the concurrent mark-sweep (CMS) garbage collector\&. This option is enabled by default\&. To disable class unloading for the CMS garbage collector, specify \f3-XX:-CMSClassUnloadingEnabled\fR\&. +-.TP +--XX:CMSExpAvgFactor=\fIpercent\fR +-.br ++.PP ++\-XX:+AggressiveHeap ++.RS 4 ++Enables Java heap optimization\&. This sets various parameters to be optimal for long\-running jobs with intensive memory allocation, based on the configuration of the computer (RAM and CPU)\&. By default, the option is disabled and the heap is not optimized\&. ++.RE ++.PP ++\-XX:+AlwaysPreTouch ++.RS 4 ++Enables touching of every page on the Java heap during JVM initialization\&. This gets all pages into the memory before entering the ++\fBmain()\fR ++method\&. The option can be used in testing to simulate a long\-running system with all virtual memory mapped to physical memory\&. By default, this option is disabled and all pages are committed as JVM heap space fills\&. ++.RE ++.PP ++\-XX:+CMSClassUnloadingEnabled ++.RS 4 ++Enables class unloading when using the concurrent mark\-sweep (CMS) garbage collector\&. This option is enabled by default\&. To disable class unloading for the CMS garbage collector, specify ++\fB\-XX:\-CMSClassUnloadingEnabled\fR\&. ++.RE ++.PP ++\-XX:CMSExpAvgFactor=\fIpercent\fR ++.RS 4 + Sets the percentage of time (0 to 100) used to weight the current sample when computing exponential averages for the concurrent collection statistics\&. By default, the exponential averages factor is set to 25%\&. The following example shows how to set the factor to 15%: +-.sp +-.nf +-\f3\-XX:CMSExpAvgFactor=15\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CMSInitiatingOccupancyFraction=\fIpercent\fR +-.br +-Sets the percentage of the old generation occupancy (0 to 100) at which to start a CMS collection cycle\&. The default value is set to -1\&. Any negative value (including the default) implies that \f3-XX:CMSTriggerRatio\fR is used to define the value of the initiating occupancy fraction\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CMSExpAvgFactor=15\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CMSInitiatingOccupancyFraction=\fIpercent\fR ++.RS 4 ++Sets the percentage of the old generation occupancy (0 to 100) at which to start a CMS collection cycle\&. The default value is set to \-1\&. Any negative value (including the default) implies that ++\fB\-XX:CMSTriggerRatio\fR ++is used to define the value of the initiating occupancy fraction\&. ++.sp + The following example shows how to set the occupancy fraction to 20%: +-.sp +-.nf +-\f3\-XX:CMSInitiatingOccupancyFraction=20\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+CMSScavengeBeforeRemark +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CMSInitiatingOccupancyFraction=20\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+CMSScavengeBeforeRemark ++.RS 4 + Enables scavenging attempts before the CMS remark step\&. By default, this option is disabled\&. +-.TP +--XX:CMSTriggerRatio=\fIpercent\fR +-.br +-Sets the percentage (0 to 100) of the value specified by \f3-XX:MinHeapFreeRatio\fR that is allocated before a CMS collection cycle commences\&. The default value is set to 80%\&. +- ++.RE ++.PP ++\-XX:CMSTriggerRatio=\fIpercent\fR ++.RS 4 ++Sets the percentage (0 to 100) of the value specified by ++\fB\-XX:MinHeapFreeRatio\fR ++that is allocated before a CMS collection cycle commences\&. The default value is set to 80%\&. ++.sp + The following example shows how to set the occupancy fraction to 75%: +-.sp +-.nf +-\f3\-XX:CMSTriggerRatio=75\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:ConcGCThreads=\fIthreads\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CMSTriggerRatio=75\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:ConcGCThreads=\fIthreads\fR ++.RS 4 + Sets the number of threads used for concurrent GC\&. The default value depends on the number of CPUs available to the JVM\&. +- ++.sp + For example, to set the number of threads for concurrent GC to 2, specify the following option: +-.sp +-.nf +-\f3\-XX:ConcGCThreads=2\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+DisableExplicitGC +-.br +-Enables the option that disables processing of calls to \f3System\&.gc()\fR\&. This option is disabled by default, meaning that calls to \f3System\&.gc()\fR are processed\&. If processing of calls to \f3System\&.gc()\fR is disabled, the JVM still performs GC when necessary\&. +-.TP +--XX:+ExplicitGCInvokesConcurrent +-.br +-Enables invoking of concurrent GC by using the \f3System\&.gc()\fR request\&. This option is disabled by default and can be enabled only together with the \f3-XX:+UseConcMarkSweepGC\fR option\&. +-.TP +--XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses +-.br +-Enables invoking of concurrent GC by using the \f3System\&.gc()\fR request and unloading of classes during the concurrent GC cycle\&. This option is disabled by default and can be enabled only together with the \f3-XX:+UseConcMarkSweepGC\fR option\&. +-.TP +--XX:G1HeapRegionSize=\fIsize\fR +-.br +-Sets the size of the regions into which the Java heap is subdivided when using the garbage-first (G1) collector\&. The value can be between 1 MB and 32 MB\&. The default region size is determined ergonomically based on the heap size\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ConcGCThreads=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+DisableExplicitGC ++.RS 4 ++Enables the option that disables processing of calls to ++\fBSystem\&.gc()\fR\&. This option is disabled by default, meaning that calls to ++\fBSystem\&.gc()\fR ++are processed\&. If processing of calls to ++\fBSystem\&.gc()\fR ++is disabled, the JVM still performs GC when necessary\&. ++.RE ++.PP ++\-XX:+ExplicitGCInvokesConcurrent ++.RS 4 ++Enables invoking of concurrent GC by using the ++\fBSystem\&.gc()\fR ++request\&. This option is disabled by default and can be enabled only together with the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option\&. ++.RE ++.PP ++\-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses ++.RS 4 ++Enables invoking of concurrent GC by using the ++\fBSystem\&.gc()\fR ++request and unloading of classes during the concurrent GC cycle\&. This option is disabled by default and can be enabled only together with the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option\&. ++.RE ++.PP ++\-XX:G1HeapRegionSize=\fIsize\fR ++.RS 4 ++Sets the size of the regions into which the Java heap is subdivided when using the garbage\-first (G1) collector\&. The value can be between 1 MB and 32 MB\&. The default region size is determined ergonomically based on the heap size\&. ++.sp + The following example shows how to set the size of the subdivisions to 16 MB: +-.sp +-.nf +-\f3\-XX:G1HeapRegionSize=16m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+G1PrintHeapRegions +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:G1HeapRegionSize=16m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+G1PrintHeapRegions ++.RS 4 + Enables the printing of information about which regions are allocated and which are reclaimed by the G1 collector\&. By default, this option is disabled\&. +-.TP +--XX:G1ReservePercent=\fIpercent\fR +-.br ++.RE ++.PP ++\-XX:G1ReservePercent=\fIpercent\fR ++.RS 4 + Sets the percentage of the heap (0 to 50) that is reserved as a false ceiling to reduce the possibility of promotion failure for the G1 collector\&. By default, this option is set to 10%\&. +- ++.sp + The following example shows how to set the reserved heap to 20%: +-.sp +-.nf +-\f3\-XX:G1ReservePercent=20\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:InitialHeapSize=\fIsize\fR +-.br +-Sets the initial size (in bytes) of the memory allocation pool\&. This value must be either 0, or a multiple of 1024 and greater than 1 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc-ergonomics\&.html +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:G1ReservePercent=20\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:InitialHeapSize=\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of the memory allocation pool\&. This value must be either 0, or a multiple of 1024 and greater than 1 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html ++.sp + The following examples show how to set the size of allocated memory to 6 MB using various units: +-.sp +-.nf +-\f3\-XX:InitialHeapSize=6291456\fP +-.fi +-.nf +-\f3\-XX:InitialHeapSize=6144k\fP +-.fi +-.nf +-\f3\-XX:InitialHeapSize=6m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If you set this option to 0, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The size of the heap for the young generation can be set using the \f3-XX:NewSize\fR option\&. +-.TP +--XX:InitialSurvivorRatio=\fIratio\fR +-.br +-Sets the initial survivor space ratio used by the throughput garbage collector (which is enabled by the \f3-XX:+UseParallelGC\fR and/or -\f3XX:+UseParallelOldGC\fR options)\&. Adaptive sizing is enabled by default with the throughput garbage collector by using the \f3-XX:+UseParallelGC\fR and \f3-XX:+UseParallelOldGC\fR options, and survivor space is resized according to the application behavior, starting with the initial value\&. If adaptive sizing is disabled (using the \f3-XX:-UseAdaptiveSizePolicy\fR option), then the \f3-XX:SurvivorRatio\fR option should be used to set the size of the survivor space for the entire execution of the application\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialHeapSize=6291456\fR ++\fB\-XX:InitialHeapSize=6144k\fR ++\fB\-XX:InitialHeapSize=6m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you set this option to 0, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The size of the heap for the young generation can be set using the ++\fB\-XX:NewSize\fR ++option\&. ++.RE ++.PP ++\-XX:InitialSurvivorRatio=\fIratio\fR ++.RS 4 ++Sets the initial survivor space ratio used by the throughput garbage collector (which is enabled by the ++\fB\-XX:+UseParallelGC\fR ++and/or \-\fBXX:+UseParallelOldGC\fR ++options)\&. Adaptive sizing is enabled by default with the throughput garbage collector by using the ++\fB\-XX:+UseParallelGC\fR ++and ++\fB\-XX:+UseParallelOldGC\fR ++options, and survivor space is resized according to the application behavior, starting with the initial value\&. If adaptive sizing is disabled (using the ++\fB\-XX:\-UseAdaptiveSizePolicy\fR ++option), then the ++\fB\-XX:SurvivorRatio\fR ++option should be used to set the size of the survivor space for the entire execution of the application\&. ++.sp + The following formula can be used to calculate the initial size of survivor space (S) based on the size of the young generation (Y), and the initial survivor space ratio (R): +-.sp +-.nf +-\f3S=Y/(R+2)\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBS=Y/(R+2)\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + The 2 in the equation denotes two survivor spaces\&. The larger the value specified as the initial survivor space ratio, the smaller the initial survivor space size\&. +- ++.sp + By default, the initial survivor space ratio is set to 8\&. If the default value for the young generation space size is used (2 MB), the initial size of the survivor space will be 0\&.2 MB\&. +- ++.sp + The following example shows how to set the initial survivor space ratio to 4: +-.sp +-.nf +-\f3\-XX:InitialSurvivorRatio=4\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:InitiatingHeapOccupancyPercent=\fIpercent\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialSurvivorRatio=4\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:InitiatingHeapOccupancyPercent=\fIpercent\fR ++.RS 4 + Sets the percentage of the heap occupancy (0 to 100) at which to start a concurrent GC cycle\&. It is used by garbage collectors that trigger a concurrent GC cycle based on the occupancy of the entire heap, not just one of the generations (for example, the G1 garbage collector)\&. +- ++.sp + By default, the initiating value is set to 45%\&. A value of 0 implies nonstop GC cycles\&. The following example shows how to set the initiating heap occupancy to 75%: +-.sp +-.nf +-\f3\-XX:InitiatingHeapOccupancyPercent=75\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxGCPauseMillis=\fItime\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitiatingHeapOccupancyPercent=75\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxGCPauseMillis=\fItime\fR ++.RS 4 + Sets a target for the maximum GC pause time (in milliseconds)\&. This is a soft goal, and the JVM will make its best effort to achieve it\&. By default, there is no maximum pause time value\&. +- ++.sp + The following example shows how to set the maximum target pause time to 500 ms: +-.sp +-.nf +-\f3\-XX:MaxGCPauseMillis=500\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxHeapSize=\fIsize\fR +-.br +-Sets the maximum size (in byes) of the memory allocation pool\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, \f3-XX:InitialHeapSize\fR and \f3-XX:MaxHeapSize\fR are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc-ergonomics\&.html +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxGCPauseMillis=500\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxHeapSize=\fIsize\fR ++.RS 4 ++Sets the maximum size (in byes) of the memory allocation pool\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, ++\fB\-XX:InitialHeapSize\fR ++and ++\fB\-XX:MaxHeapSize\fR ++are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html ++.sp + The following examples show how to set the maximum allowed size of allocated memory to 80 MB using various units: +-.sp +-.nf +-\f3\-XX:MaxHeapSize=83886080\fP +-.fi +-.nf +-\f3\-XX:MaxHeapSize=81920k\fP +-.fi +-.nf +-\f3\-XX:MaxHeapSize=80m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxHeapSize=83886080\fR ++\fB\-XX:MaxHeapSize=81920k\fR ++\fB\-XX:MaxHeapSize=80m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + On Oracle Solaris 7 and Oracle Solaris 8 SPARC platforms, the upper limit for this value is approximately 4,000 MB minus overhead amounts\&. On Oracle Solaris 2\&.6 and x86 platforms, the upper limit is approximately 2,000 MB minus overhead amounts\&. On Linux platforms, the upper limit is approximately 2,000 MB minus overhead amounts\&. +- +-The \f3-XX:MaxHeapSize\fR option is equivalent to \f3-Xmx\fR\&. +-.TP +--XX:MaxHeapFreeRatio=\fIpercent\fR +-.br ++.sp ++The ++\fB\-XX:MaxHeapSize\fR ++option is equivalent to ++\fB\-Xmx\fR\&. ++.RE ++.PP ++\-XX:MaxHeapFreeRatio=\fIpercent\fR ++.RS 4 + Sets the maximum allowed percentage of free heap space (0 to 100) after a GC event\&. If free heap space expands above this value, then the heap will be shrunk\&. By default, this value is set to 70%\&. +- ++.sp + The following example shows how to set the maximum free heap ratio to 75%: +-.sp +-.nf +-\f3\-XX:MaxHeapFreeRatio=75\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxMetaspaceSize=\fIsize\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxHeapFreeRatio=75\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxMetaspaceSize=\fIsize\fR ++.RS 4 + Sets the maximum amount of native memory that can be allocated for class metadata\&. By default, the size is not limited\&. The amount of metadata for an application depends on the application itself, other running applications, and the amount of memory available on the system\&. +- ++.sp + The following example shows how to set the maximum class metadata size to 256 MB: +-.sp +-.nf +-\f3\-XX:MaxMetaspaceSize=256m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxNewSize=\fIsize\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxMetaspaceSize=256m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxNewSize=\fIsize\fR ++.RS 4 + Sets the maximum size (in bytes) of the heap for the young generation (nursery)\&. The default value is set ergonomically\&. +-.TP +--XX:MaxTenuringThreshold=\fIthreshold\fR +-.br ++.RE ++.PP ++\-XX:MaxTenuringThreshold=\fIthreshold\fR ++.RS 4 + Sets the maximum tenuring threshold for use in adaptive GC sizing\&. The largest value is 15\&. The default value is 15 for the parallel (throughput) collector, and 6 for the CMS collector\&. +- ++.sp + The following example shows how to set the maximum tenuring threshold to 10: +-.sp +-.nf +-\f3\-XX:MaxTenuringThreshold=10\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MetaspaceSize=\fIsize\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxTenuringThreshold=10\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MetaspaceSize=\fIsize\fR ++.RS 4 + Sets the size of the allocated class metadata space that will trigger a garbage collection the first time it is exceeded\&. This threshold for a garbage collection is increased or decreased depending on the amount of metadata used\&. The default size depends on the platform\&. +-.TP +--XX:MinHeapFreeRatio=\fIpercent\fR +-.br ++.RE ++.PP ++\-XX:MinHeapFreeRatio=\fIpercent\fR ++.RS 4 + Sets the minimum allowed percentage of free heap space (0 to 100) after a GC event\&. If free heap space falls below this value, then the heap will be expanded\&. By default, this value is set to 40%\&. +- ++.sp + The following example shows how to set the minimum free heap ratio to 25%: +-.sp +-.nf +-\f3\-XX:MinHeapFreeRatio=25\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:NewRatio=\fIratio\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MinHeapFreeRatio=25\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:NewRatio=\fIratio\fR ++.RS 4 + Sets the ratio between young and old generation sizes\&. By default, this option is set to 2\&. The following example shows how to set the young/old ratio to 1: +-.sp +-.nf +-\f3\-XX:NewRatio=1\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:NewSize=\fIsize\fR +-.br +-Sets the initial size (in bytes) of the heap for the young generation (nursery)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:NewRatio=1\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:NewSize=\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of the heap for the young generation (nursery)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. ++.sp + The young generation region of the heap is used for new objects\&. GC is performed in this region more often than in other regions\&. If the size for the young generation is too low, then a large number of minor GCs will be performed\&. If the size is too high, then only full GCs will be performed, which can take a long time to complete\&. Oracle recommends that you keep the size for the young generation between a half and a quarter of the overall heap size\&. +- ++.sp + The following examples show how to set the initial size of young generation to 256 MB using various units: +-.sp +-.nf +-\f3\-XX:NewSize=256m\fP +-.fi +-.nf +-\f3\-XX:NewSize=262144k\fP +-.fi +-.nf +-\f3\-XX:NewSize=268435456\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The \f3-XX:NewSize\fR option is equivalent to \f3-Xmn\fR\&. +-.TP +--XX:ParallelGCThreads=\fIthreads\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:NewSize=256m\fR ++\fB\-XX:NewSize=262144k\fR ++\fB\-XX:NewSize=268435456\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The ++\fB\-XX:NewSize\fR ++option is equivalent to ++\fB\-Xmn\fR\&. ++.RE ++.PP ++\-XX:ParallelGCThreads=\fIthreads\fR ++.RS 4 + Sets the number of threads used for parallel garbage collection in the young and old generations\&. The default value depends on the number of CPUs available to the JVM\&. +- ++.sp + For example, to set the number of threads for parallel GC to 2, specify the following option: +-.sp +-.nf +-\f3\-XX:ParallelGCThreads=2\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+ParallelRefProcEnabled +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ParallelGCThreads=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+ParallelRefProcEnabled ++.RS 4 + Enables parallel reference processing\&. By default, this option is disabled\&. +-.TP +--XX:+PrintAdaptiveSizePolicy +-.br ++.RE ++.PP ++\-XX:+PrintAdaptiveSizePolicy ++.RS 4 + Enables printing of information about adaptive generation sizing\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGC +-.br ++.RE ++.PP ++\-XX:+PrintGC ++.RS 4 + Enables printing of messages at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCApplicationConcurrentTime +-.br ++.RE ++.PP ++\-XX:+PrintGCApplicationConcurrentTime ++.RS 4 + Enables printing of how much time elapsed since the last pause (for example, a GC pause)\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCApplicationStoppedTime +-.br ++.RE ++.PP ++\-XX:+PrintGCApplicationStoppedTime ++.RS 4 + Enables printing of how much time the pause (for example, a GC pause) lasted\&. By default, this option is disabled\&. +-.TP +--XX+PrintGCDateStamp +-.br ++.RE ++.PP ++\-XX:+PrintGCDateStamps ++.RS 4 + Enables printing of a date stamp at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCDetails +-.br ++.RE ++.PP ++\-XX:+PrintGCDetails ++.RS 4 + Enables printing of detailed messages at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCTaskTimeStamps +-.br ++.RE ++.PP ++\-XX:+PrintGCTaskTimeStamps ++.RS 4 + Enables printing of time stamps for every individual GC worker thread task\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCTimeStamp +-.br ++.RE ++.PP ++\-XX:+PrintGCTimeStamps ++.RS 4 + Enables printing of time stamps at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintTenuringDistribution +-.br ++.RE ++.PP ++\-XX:+PrintStringDeduplicationStatistics ++.RS 4 ++Prints detailed deduplication statistics\&. By default, this option is disabled\&. See the ++\fB\-XX:+UseStringDeduplication\fR ++option\&. ++.RE ++.PP ++\-XX:+PrintTenuringDistribution ++.RS 4 + Enables printing of tenuring age information\&. The following is an example of the output: +-.sp +-.nf +-\f3Desired survivor size 48286924 bytes, new threshold 10 (max 10)\fP +-.fi +-.nf +-\f3\- age 1: 28992024 bytes, 28992024 total\fP +-.fi +-.nf +-\f3\- age 2: 1366864 bytes, 30358888 total\fP +-.fi +-.nf +-\f3\- age 3: 1425912 bytes, 31784800 total\fP +-.fi +-.nf +-\f3\&.\&.\&.\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBDesired survivor size 48286924 bytes, new threshold 10 (max 10)\fR ++\fB\- age 1: 28992024 bytes, 28992024 total\fR ++\fB\- age 2: 1366864 bytes, 30358888 total\fR ++\fB\- age 3: 1425912 bytes, 31784800 total\fR ++\fB\&.\&.\&.\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + Age 1 objects are the youngest survivors (they were created after the previous scavenge, survived the latest scavenge, and moved from eden to survivor space)\&. Age 2 objects have survived two scavenges (during the second scavenge they were copied from one survivor space to the next)\&. And so on\&. +- ++.sp + In the preceding example, 28 992 024 bytes survived one scavenge and were copied from eden to survivor space, 1 366 864 bytes are occupied by age 2 objects, etc\&. The third value in each row is the cumulative size of objects of age n or less\&. +- ++.sp + By default, this option is disabled\&. +-.TP +--XX:+ScavengeBeforeFullGC +-.br +-Enables GC of the young generation before each full GC\&. This option is enabled by default\&. Oracle recommends that you \fIdo not\fR disable it, because scavenging the young generation before a full GC can reduce the number of objects reachable from the old generation space into the young generation space\&. To disable GC of the young generation before each full GC, specify \f3-XX:-ScavengeBeforeFullGC\fR\&. +-.TP +--XX:SoftRefLRUPolicyMSPerMB=\fItime\fR +-.br +-Sets the amount of time (in milliseconds) a softly reachable object is kept active on the heap after the last time it was referenced\&. The default value is one second of lifetime per free megabyte in the heap\&. The \f3-XX:SoftRefLRUPolicyMSPerMB\fR option accepts integer values representing milliseconds per one megabyte of the current heap size (for Java HotSpot Client VM) or the maximum possible heap size (for Java HotSpot Server VM)\&. This difference means that the Client VM tends to flush soft references rather than grow the heap, whereas the Server VM tends to grow the heap rather than flush soft references\&. In the latter case, the value of the \f3-Xmx\fR option has a significant effect on how quickly soft references are garbage collected\&. +- ++.RE ++.PP ++\-XX:+ScavengeBeforeFullGC ++.RS 4 ++Enables GC of the young generation before each full GC\&. This option is enabled by default\&. Oracle recommends that you ++\fIdo not\fR ++disable it, because scavenging the young generation before a full GC can reduce the number of objects reachable from the old generation space into the young generation space\&. To disable GC of the young generation before each full GC, specify ++\fB\-XX:\-ScavengeBeforeFullGC\fR\&. ++.RE ++.PP ++\-XX:SoftRefLRUPolicyMSPerMB=\fItime\fR ++.RS 4 ++Sets the amount of time (in milliseconds) a softly reachable object is kept active on the heap after the last time it was referenced\&. The default value is one second of lifetime per free megabyte in the heap\&. The ++\fB\-XX:SoftRefLRUPolicyMSPerMB\fR ++option accepts integer values representing milliseconds per one megabyte of the current heap size (for Java HotSpot Client VM) or the maximum possible heap size (for Java HotSpot Server VM)\&. This difference means that the Client VM tends to flush soft references rather than grow the heap, whereas the Server VM tends to grow the heap rather than flush soft references\&. In the latter case, the value of the ++\fB\-Xmx\fR ++option has a significant effect on how quickly soft references are garbage collected\&. ++.sp + The following example shows how to set the value to 2\&.5 seconds: +-.sp +-.nf +-\f3\-XX:SoftRefLRUPolicyMSPerMB=2500\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:SurvivorRatio=\fIratio\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:SoftRefLRUPolicyMSPerMB=2500\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:StringDeduplicationAgeThreshold=\fIthreshold\fR ++.RS 4 ++\fBString\fR ++objects reaching the specified age are considered candidates for deduplication\&. An object\*(Aqs age is a measure of how many times it has survived garbage collection\&. This is sometimes referred to as tenuring; see the ++\fB\-XX:+PrintTenuringDistribution\fR ++option\&. Note that ++\fBString\fR ++objects that are promoted to an old heap region before this age has been reached are always considered candidates for deduplication\&. The default value for this option is ++\fB3\fR\&. See the ++\fB\-XX:+UseStringDeduplication\fR ++option\&. ++.RE ++.PP ++\-XX:SurvivorRatio=\fIratio\fR ++.RS 4 + Sets the ratio between eden space size and survivor space size\&. By default, this option is set to 8\&. The following example shows how to set the eden/survivor space ratio to 4: +-.sp +-.nf +-\f3\-XX:SurvivorRatio=4\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:TargetSurvivorRatio=\fIpercent\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:SurvivorRatio=4\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:TargetSurvivorRatio=\fIpercent\fR ++.RS 4 + Sets the desired percentage of survivor space (0 to 100) used after young garbage collection\&. By default, this option is set to 50%\&. +- ++.sp + The following example shows how to set the target survivor space ratio to 30%: +-.sp +-.nf +-\f3\-XX:TargetSurvivorRatio=30\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:TLABSize=\fIsize\fR +-.br +-Sets the initial size (in bytes) of a thread-local allocation buffer (TLAB)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. If this option is set to 0, then the JVM chooses the initial size automatically\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:TargetSurvivorRatio=30\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:TLABSize=\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of a thread\-local allocation buffer (TLAB)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. If this option is set to 0, then the JVM chooses the initial size automatically\&. ++.sp + The following example shows how to set the initial TLAB size to 512 KB: +-.sp +-.nf +-\f3\-XX:TLABSize=512k\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+UseAdaptiveSizePolicy +-.br +-Enables the use of adaptive generation sizing\&. This option is enabled by default\&. To disable adaptive generation sizing, specify \f3-XX:-UseAdaptiveSizePolicy\fR and set the size of the memory allocation pool explicitly (see the \f3-XX:SurvivorRatio\fR option)\&. +-.TP +--XX:+UseCMSInitiatingOccupancyOnly +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:TLABSize=512k\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+UseAdaptiveSizePolicy ++.RS 4 ++Enables the use of adaptive generation sizing\&. This option is enabled by default\&. To disable adaptive generation sizing, specify ++\fB\-XX:\-UseAdaptiveSizePolicy\fR ++and set the size of the memory allocation pool explicitly (see the ++\fB\-XX:SurvivorRatio\fR ++option)\&. ++.RE ++.PP ++\-XX:+UseCMSInitiatingOccupancyOnly ++.RS 4 + Enables the use of the occupancy value as the only criterion for initiating the CMS collector\&. By default, this option is disabled and other criteria may be used\&. +-.TP +--XX:+UseConcMarkSweepGC +-.br +-Enables the use of the CMS garbage collector for the old generation\&. Oracle recommends that you use the CMS garbage collector when application latency requirements cannot be met by the throughput (\f3-XX:+UseParallelGC\fR) garbage collector\&. The G1 garbage collector (\f3-XX:+UseG1GC\fR) is another alternative\&. +- +-By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. When this option is enabled, the \f3-XX:+UseParNewGC\fR option is automatically set and you should not disable it, because the following combination of options has been deprecated in JDK 8: \f3-XX:+UseConcMarkSweepGC -XX:-UseParNewGC\fR\&. +-.TP +--XX:+UseG1GC +-.br +-Enables the use of the G1 garbage collector\&. It is a server-style garbage collector, targeted for multiprocessor machines with a large amount of RAM\&. It meets GC pause time goals with high probability, while maintaining good throughput\&. The G1 collector is recommended for applications requiring large heaps (sizes of around 6 GB or larger) with limited GC latency requirements (stable and predictable pause time below 0\&.5 seconds)\&. +- ++.RE ++.PP ++\-XX:+UseConcMarkSweepGC ++.RS 4 ++Enables the use of the CMS garbage collector for the old generation\&. Oracle recommends that you use the CMS garbage collector when application latency requirements cannot be met by the throughput (\fB\-XX:+UseParallelGC\fR) garbage collector\&. The G1 garbage collector (\fB\-XX:+UseG1GC\fR) is another alternative\&. ++.sp ++By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. When this option is enabled, the ++\fB\-XX:+UseParNewGC\fR ++option is automatically set and you should not disable it, because the following combination of options has been deprecated in JDK 8: ++\fB\-XX:+UseConcMarkSweepGC \-XX:\-UseParNewGC\fR\&. ++.RE ++.PP ++\-XX:+UseG1GC ++.RS 4 ++Enables the use of the garbage\-first (G1) garbage collector\&. It is a server\-style garbage collector, targeted for multiprocessor machines with a large amount of RAM\&. It meets GC pause time goals with high probability, while maintaining good throughput\&. The G1 collector is recommended for applications requiring large heaps (sizes of around 6 GB or larger) with limited GC latency requirements (stable and predictable pause time below 0\&.5 seconds)\&. ++.sp + By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. +-.TP +--XX:+UseGCOverheadLimit +-.br +-Enables the use of a policy that limits the proportion of time spent by the JVM on GC before an \f3OutOfMemoryError\fR exception is thrown\&. This option is enabled, by default and the parallel GC will throw an \f3OutOfMemoryError\fR if more than 98% of the total time is spent on garbage collection and less than 2% of the heap is recovered\&. When the heap is small, this feature can be used to prevent applications from running for long periods of time with little or no progress\&. To disable this option, specify \f3-XX:-UseGCOverheadLimit\fR\&. +-.TP +--XX:+UseNUMA +-.br +-Enables performance optimization of an application on a machine with nonuniform memory architecture (NUMA) by increasing the application\&'s use of lower latency memory\&. By default, this option is disabled and no optimization for NUMA is made\&. The option is only available when the parallel garbage collector is used (\f3-XX:+UseParallelGC\fR)\&. +-.TP +--XX:+UseParallelGC +-.br ++.RE ++.PP ++\-XX:+UseGCOverheadLimit ++.RS 4 ++Enables the use of a policy that limits the proportion of time spent by the JVM on GC before an ++\fBOutOfMemoryError\fR ++exception is thrown\&. This option is enabled, by default and the parallel GC will throw an ++\fBOutOfMemoryError\fR ++if more than 98% of the total time is spent on garbage collection and less than 2% of the heap is recovered\&. When the heap is small, this feature can be used to prevent applications from running for long periods of time with little or no progress\&. To disable this option, specify ++\fB\-XX:\-UseGCOverheadLimit\fR\&. ++.RE ++.PP ++\-XX:+UseNUMA ++.RS 4 ++Enables performance optimization of an application on a machine with nonuniform memory architecture (NUMA) by increasing the application\*(Aqs use of lower latency memory\&. By default, this option is disabled and no optimization for NUMA is made\&. The option is only available when the parallel garbage collector is used (\fB\-XX:+UseParallelGC\fR)\&. ++.RE ++.PP ++\-XX:+UseParallelGC ++.RS 4 + Enables the use of the parallel scavenge garbage collector (also known as the throughput collector) to improve the performance of your application by leveraging multiple processors\&. +- +-By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. If it is enabled, then the \f3-XX:+UseParallelOldGC\fR option is automatically enabled, unless you explicitly disable it\&. +-.TP +--XX:+UseParallelOldGC +-.br +-Enables the use of the parallel garbage collector for full GCs\&. By default, this option is disabled\&. Enabling it automatically enables the \f3-XX:+UseParallelGC\fR option\&. +-.TP +--XX:+UseParNewGC +-.br +-Enables the use of parallel threads for collection in the young generation\&. By default, this option is disabled\&. It is automatically enabled when you set the \f3-XX:+UseConcMarkSweepGC\fR option\&. Using the \f3-XX:+UseParNewGC\fR option without the \f3-XX:+UseConcMarkSweepGC\fR option was deprecated in JDK 8\&. +-.TP +--XX:+UseSerialGC +-.br ++.sp ++By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. If it is enabled, then the ++\fB\-XX:+UseParallelOldGC\fR ++option is automatically enabled, unless you explicitly disable it\&. ++.RE ++.PP ++\-XX:+UseParallelOldGC ++.RS 4 ++Enables the use of the parallel garbage collector for full GCs\&. By default, this option is disabled\&. Enabling it automatically enables the ++\fB\-XX:+UseParallelGC\fR ++option\&. ++.RE ++.PP ++\-XX:+UseParNewGC ++.RS 4 ++Enables the use of parallel threads for collection in the young generation\&. By default, this option is disabled\&. It is automatically enabled when you set the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option\&. Using the ++\fB\-XX:+UseParNewGC\fR ++option without the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option was deprecated in JDK 8\&. ++.RE ++.PP ++\-XX:+UseSerialGC ++.RS 4 + Enables the use of the serial garbage collector\&. This is generally the best choice for small and simple applications that do not require any special functionality from garbage collection\&. By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. +-.TP +--XX:+UseTLAB +-.br +-Enables the use of thread-local allocation blocks (TLABs) in the young generation space\&. This option is enabled by default\&. To disable the use of TLABs, specify \f3-XX:-UseTLAB\fR\&. +-.SS DEPRECATED\ AND\ REMOVED\ OPTIONS ++.RE ++.PP ++\-XX:+UseStringDeduplication ++.RS 4 ++Enables string deduplication\&. By default, this option is disabled\&. To use this option, you must enable the garbage\-first (G1) garbage collector\&. See the ++\fB\-XX:+UseG1GC\fR ++option\&. ++.sp ++\fIString deduplication\fR ++reduces the memory footprint of ++\fBString\fR ++objects on the Java heap by taking advantage of the fact that many ++\fBString\fR ++objects are identical\&. Instead of each ++\fBString\fR ++object pointing to its own character array, identical ++\fBString\fR ++objects can point to and share the same character array\&. ++.RE ++.PP ++\-XX:+UseTLAB ++.RS 4 ++Enables the use of thread\-local allocation blocks (TLABs) in the young generation space\&. This option is enabled by default\&. To disable the use of TLABs, specify ++\fB\-XX:\-UseTLAB\fR\&. ++.RE ++.SS "Deprecated and Removed Options" ++.PP + These options were included in the previous release, but have since been considered unnecessary\&. +-.TP +--Xincgc +-.br ++.PP ++\-Xincgc ++.RS 4 + Enables incremental garbage collection\&. This option was deprecated in JDK 8 with no replacement\&. +-.TP +--Xrun\fIlibname\fR +-.br +-Loads the specified debugging/profiling library\&. This option was superseded by the \f3-agentlib\fR option\&. +-.TP +--XX:CMSIncrementalDutyCycle=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) between minor collections that the concurrent collector is allowed to run\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:CMSIncrementalDutyCycleMin=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) between minor collections that is the lower bound for the duty cycle when \f3-XX:+CMSIncrementalPacing\fR is enabled\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:+CMSIncrementalMode +-.br +-Enables the incremental mode for the CMS collector\&. This option was deprecated in JDK 8 with no replacement, along with other options that start with \f3CMSIncremental\fR\&. +-.TP +--XX:CMSIncrementalOffset=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) by which the incremental mode duty cycle is shifted to the right within the period between minor collections\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:+CMSIncrementalPacing +-.br +-Enables automatic adjustment of the incremental mode duty cycle based on statistics collected while the JVM is running\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:CMSIncrementalSafetyFactor=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) used to add conservatism when computing the duty cycle\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:CMSInitiatingPermOccupancyFraction=\fIpercent\fR +-.br ++.RE ++.PP ++\-Xrun\fIlibname\fR ++.RS 4 ++Loads the specified debugging/profiling library\&. This option was superseded by the ++\fB\-agentlib\fR ++option\&. ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycle=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) between minor collections that the concurrent collector is allowed to run\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycleMin=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) between minor collections that is the lower bound for the duty cycle when ++\fB\-XX:+CMSIncrementalPacing\fR ++is enabled\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:+CMSIncrementalMode ++.RS 4 ++Enables the incremental mode for the CMS collector\&. This option was deprecated in JDK 8 with no replacement, along with other options that start with ++\fBCMSIncremental\fR\&. ++.RE ++.PP ++\-XX:CMSIncrementalOffset=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) by which the incremental mode duty cycle is shifted to the right within the period between minor collections\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:+CMSIncrementalPacing ++.RS 4 ++Enables automatic adjustment of the incremental mode duty cycle based on statistics collected while the JVM is running\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:CMSIncrementalSafetyFactor=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) used to add conservatism when computing the duty cycle\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:CMSInitiatingPermOccupancyFraction=\fIpercent\fR ++.RS 4 + Sets the percentage of the permanent generation occupancy (0 to 100) at which to start a GC\&. This option was deprecated in JDK 8 with no replacement\&. +-.TP +--XX:MaxPermSize=\fIsize\fR +-.br +-Sets the maximum permanent generation space size (in bytes)\&. This option was deprecated in JDK 8, and superseded by the \f3-XX:MaxMetaspaceSize\fR option\&. +-.TP +--XX:PermSize=\fIsize\fR +-.br +-Sets the space (in bytes) allocated to the permanent generation that triggers a garbage collection if it is exceeded\&. This option was deprecated un JDK 8, and superseded by the \f3-XX:MetaspaceSize\fR option\&. +-.TP +--XX:+UseSplitVerifier +-.br ++.RE ++.PP ++\-XX:MaxPermSize=\fIsize\fR ++.RS 4 ++Sets the maximum permanent generation space size (in bytes)\&. This option was deprecated in JDK 8, and superseded by the ++\fB\-XX:MaxMetaspaceSize\fR ++option\&. ++.RE ++.PP ++\-XX:PermSize=\fIsize\fR ++.RS 4 ++Sets the space (in bytes) allocated to the permanent generation that triggers a garbage collection if it is exceeded\&. This option was deprecated un JDK 8, and superseded by the ++\fB\-XX:MetaspaceSize\fR ++option\&. ++.RE ++.PP ++\-XX:+UseSplitVerifier ++.RS 4 + Enables splitting of the verification process\&. By default, this option was enabled in the previous releases, and verification was split into two phases: type referencing (performed by the compiler) and type checking (performed by the JVM runtime)\&. This option was deprecated in JDK 8, and verification is now split by default without a way to disable it\&. +-.TP +--XX:+UseStringCache +-.br ++.RE ++.PP ++\-XX:+UseStringCache ++.RS 4 + Enables caching of commonly allocated strings\&. This option was removed from JDK 8 with no replacement\&. +-.SH PERFORMANCE\ TUNING\ EXAMPLES ++.RE ++.SH "PERFORMANCE TUNING EXAMPLES" ++.PP + The following examples show how to use experimental tuning flags to either optimize throughput or to provide lower response time\&. + .PP +-\f3Example 1 Tuning for Higher Throughput\fR +-.sp +-.nf +-\f3java \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 2 Tuning for Lower Response Time\fR +-.sp +-.nf +-\f3java \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-.SH EXIT\ STATUS +-The following exit values are typically returned by the launcher when the launcher is called with the wrong arguments, serious errors, or exceptions thrown by the JVM\&. However, a Java application may choose to return any value by using the API call \f3System\&.exit(exitValue)\fR\&. The values are: +-.TP 0.2i +-\(bu +-\f30\fR: Successful completion +-.TP 0.2i +-\(bu +-\f3>0\fR: An error occurred +-.SH SEE\ ALSO +-.TP 0.2i +-\(bu ++\fBExample 1\fR ++.br ++Tuning for Higher Throughput ++.RS 4 ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\fBExample 2\fR ++.br ++Tuning for Lower Response Time ++.RS 4 ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.SH "EXIT STATUS" ++.PP ++The following exit values are typically returned by the launcher when the launcher is called with the wrong arguments, serious errors, or exceptions thrown by the JVM\&. However, a Java application may choose to return any value by using the API call ++\fBSystem\&.exit(exitValue)\fR\&. The values are: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fB0\fR: Successful completion ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fB>0\fR: An error occurred ++.RE ++.SH "SEE ALSO" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javac(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jdb(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javah(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jar(1) +-.RE +-.br +-'pl 8.5i +-'bp ++.RE ++.br ++'pl 8.5i ++'bp +--- ./jdk/src/bsd/doc/man/javac.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/bsd/doc/man/javac.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,1364 +1,2116 @@ + '\" t +-.\" Copyright (c) 1994, 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. +-.\" +-.\" Arch: generic +-.\" Software: JDK 8 +-.\" Date: 21 November 2013 +-.\" SectDesc: Basic Tools +-.\" Title: javac.1 ++.\" Copyright (c) 1994, 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. ++.\" ++.\" Title: javac ++.\" Language: English ++.\" Date: 8 August 2014 ++.\" SectDesc: Basic Tools ++.\" Software: JDK 8 ++.\" Arch: generic ++.\" Part Number: E38207-03 + .\" + .if n .pl 99999 +-.TH javac 1 "21 November 2013" "JDK 8" "Basic Tools" +-.\" ----------------------------------------------------------------- +-.\" * Define some portability stuff +-.\" ----------------------------------------------------------------- +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.\" http://bugs.debian.org/507673 +-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" ----------------------------------------------------------------- +-.\" * set default formatting +-.\" ----------------------------------------------------------------- +-.\" disable hyphenation +-.nh +-.\" disable justification (adjust text to left margin only) +-.ad l +-.\" ----------------------------------------------------------------- +-.\" * MAIN CONTENT STARTS HERE * +-.\" ----------------------------------------------------------------- +- +-.SH NAME ++.TH "javac" "1" "8 August 2014" "JDK 8" "Basic Tools" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" + javac \- Reads Java class and interface definitions and compiles them into bytecode and class files\&. +-.SH SYNOPSIS +-.sp +-.nf +- ++.SH "SYNOPSIS" ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjavac\fR [ \fIoptions\fR ] [ \fIsourcefiles\fR ] [ \fIclasses\fR] [ \fI@argfiles\fR ] +-.fi +-.sp ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + Arguments can be in any order: +-.TP ++.PP + \fIoptions\fR +-Command-line options\&. See Options\&. +-.TP ++.RS 4 ++Command\-line options\&. See Options\&. ++.RE ++.PP + \fIsourcefiles\fR +-One or more source files to be compiled (such as \f3MyClass\&.java\fR)\&. +-.TP ++.RS 4 ++One or more source files to be compiled (such as ++\fBMyClass\&.java\fR)\&. ++.RE ++.PP + \fIclasses\fR +-One or more classes to be processed for annotations (such as \f3MyPackage\&.MyClass\fR)\&. +-.TP ++.RS 4 ++One or more classes to be processed for annotations (such as ++\fBMyPackage\&.MyClass\fR)\&. ++.RE ++.PP + \fI@argfiles\fR +-One or more files that list options and source files\&. The \f3-J\fR options are not allowed in these files\&. See Command-Line Argument Files\&. +-.SH DESCRIPTION +-The \f3javac\fR command reads class and interface definitions, written in the Java programming language, and compiles them into bytecode class files\&. The \f3javac\fR command can also process annotations in Java source files and classes\&. ++.RS 4 ++One or more files that list options and source files\&. The ++\fB\-J\fR ++options are not allowed in these files\&. See Command\-Line Argument Files\&. ++.RE ++.SH "DESCRIPTION" + .PP +-There are two ways to pass source code file names to \f3javac\fR\&. +-.TP 0.2i +-\(bu ++The ++\fBjavac\fR ++command reads class and interface definitions, written in the Java programming language, and compiles them into bytecode class files\&. The ++\fBjavac\fR ++command can also process annotations in Java source files and classes\&. ++.PP ++There are two ways to pass source code file names to ++\fBjavac\fR\&. ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + For a small number of source files, list the file names on the command line\&. +-.TP 0.2i +-\(bu +-For a large number of source files, list the file names in a file that is separated by blanks or line breaks\&. Use the list file name preceded by an at sign (@) with the \f3javac\fR command\&. ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++For a large number of source files, list the file names in a file that is separated by blanks or line breaks\&. Use the list file name preceded by an at sign (@) with the ++\fBjavac\fR ++command\&. ++.RE + .PP +-Source code file names must have \&.java suffixes, class file names must have \&.class suffixes, and both source and class files must have root names that identify the class\&. For example, a class called \f3MyClass\fR would be written in a source file called \f3MyClass\&.java\fR and compiled into a bytecode class file called \f3MyClass\&.class\fR\&. ++Source code file names must have \&.java suffixes, class file names must have \&.class suffixes, and both source and class files must have root names that identify the class\&. For example, a class called ++\fBMyClass\fR ++would be written in a source file called ++\fBMyClass\&.java\fR ++and compiled into a bytecode class file called ++\fBMyClass\&.class\fR\&. + .PP +-Inner class definitions produce additional class files\&. These class files have names that combine the inner and outer class names, such as \f3MyClass$MyInnerClass\&.class\fR\&. ++Inner class definitions produce additional class files\&. These class files have names that combine the inner and outer class names, such as ++\fBMyClass$MyInnerClass\&.class\fR\&. + .PP +-Arrange source files in a directory tree that reflects their package tree\&. For example, if all of your source files are in \f3/workspace\fR, then put the source code for \f3com\&.mysoft\&.mypack\&.MyClass\fR in \f3/workspace/com/mysoft/mypack/MyClass\&.java\fR\&. ++Arrange source files in a directory tree that reflects their package tree\&. For example, if all of your source files are in ++\fB/workspace\fR, then put the source code for ++\fBcom\&.mysoft\&.mypack\&.MyClass\fR ++in ++\fB/workspace/com/mysoft/mypack/MyClass\&.java\fR\&. + .PP +-By default, the compiler puts each class file in the same directory as its source file\&. You can specify a separate destination directory with the \f3-d\fR option\&. +-.SH OPTIONS +-The compiler has a set of standard options that are supported on the current development environment\&. An additional set of nonstandard options are specific to the current virtual machine and compiler implementations and are subject to change in the future\&. Nonstandard options begin with the \f3-X\fR option\&. +-.TP 0.2i +-\(bu +-See also Cross-Compilation Options +-.TP 0.2i +-\(bu ++By default, the compiler puts each class file in the same directory as its source file\&. You can specify a separate destination directory with the ++\fB\-d\fR ++option\&. ++.SH "OPTIONS" ++.PP ++The compiler has a set of standard options that are supported on the current development environment\&. An additional set of nonstandard options are specific to the current virtual machine and compiler implementations and are subject to change in the future\&. Nonstandard options begin with the ++\fB\-X\fR ++option\&. ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++See also Cross\-Compilation Options ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + See also Nonstandard Options +-.SS STANDARD\ OPTIONS +-.TP +--A\fIkey\fR[\fI=value\fR] ++.RE ++.SS "Standard Options" ++.PP ++\-A\fIkey\fR[\fI=value\fR] ++.RS 4 ++Specifies options to pass to annotation processors\&. These options are not interpreted by ++\fBjavac\fR ++directly, but are made available for use by individual processors\&. The ++\fBkey\fR ++value should be one or more identifiers separated by a dot (\&.)\&. ++.RE ++.PP ++\-cp \fIpath\fR or \-classpath \fIpath\fR ++.RS 4 ++Specifies where to find user class files, and (optionally) annotation processors and source files\&. This class path overrides the user class path in the ++\fBCLASSPATH\fR ++environment variable\&. If neither ++\fBCLASSPATH\fR, ++\fB\-cp\fR ++nor ++\fB\-classpath\fR ++is specified, then the user ++\fIclass path\fR ++is the current directory\&. See Setting the Class Path \&. ++.sp ++If the ++\fB\-sourcepath\fR ++option is not specified, then the user class path is also searched for source files\&. ++.sp ++If the ++\fB\-processorpath\fR ++option is not specified, then the class path is also searched for annotation processors\&. ++.RE ++.PP ++\-Djava\&.ext\&.dirs=\fIdirectories\fR ++.RS 4 ++Overrides the location of installed extensions\&. ++.RE ++.PP ++\-Djava\&.endorsed\&.dirs=\fIdirectories\fR ++.RS 4 ++Overrides the location of the endorsed standards path\&. ++.RE ++.PP ++\-d \fIdirectory\fR ++.RS 4 ++Sets the destination directory for class files\&. The directory must already exist because ++\fBjavac\fR ++does not create it\&. If a class is part of a package, then ++\fBjavac\fR ++puts the class file in a subdirectory that reflects the package name and creates directories as needed\&. ++.sp ++If you specify ++\fB\-d\fR ++\fB/home/myclasses\fR ++and the class is called ++\fBcom\&.mypackage\&.MyClass\fR, then the class file is ++\fB/home/myclasses/com/mypackage/MyClass\&.class\fR\&. ++.sp ++If the ++\fI\-d\fR ++option is not specified, then ++\fBjavac\fR ++puts each class file in the same directory as the source file from which it was generated\&. ++.sp ++\fBNote:\fR ++The directory specified by the ++\fI\-d\fR ++option is not automatically added to your user class path\&. ++.RE ++.PP ++\-deprecation ++.RS 4 ++Shows a description of each use or override of a deprecated member or class\&. Without the ++\fB\-deprecation\fR ++option, ++\fBjavac\fR ++shows a summary of the source files that use or override deprecated members or classes\&. The ++\fB\-deprecation\fR ++option is shorthand for ++\fB\-Xlint:deprecation\fR\&. ++.RE ++.PP ++\-encoding \fIencoding\fR ++.RS 4 ++Sets the source file encoding name, such as EUC\-JP and UTF\-8\&. If the ++\fB\-encoding\fR ++option is not specified, then the platform default converter is used\&. ++.RE ++.PP ++\-endorseddirs \fIdirectories\fR ++.RS 4 ++Overrides the location of the endorsed standards path\&. ++.RE ++.PP ++\-extdirs \fIdirectories\fR ++.RS 4 ++Overrides the location of the ++\fBext\fR ++directory\&. The directories variable is a colon\-separated list of directories\&. Each JAR file in the specified directories is searched for class files\&. All JAR files found become part of the class path\&. ++.sp ++If you are cross\-compiling (compiling classes against bootstrap and extension classes of a different Java platform implementation), then this option specifies the directories that contain the extension classes\&. See Cross\-Compilation Options for more information\&. ++.RE ++.PP ++\-g ++.RS 4 ++Generates all debugging information, including local variables\&. By default, only line number and source file information is generated\&. ++.RE ++.PP ++\-g:none ++.RS 4 ++Does not generate any debugging information\&. ++.RE ++.PP ++\-g:[\fIkeyword list\fR] ++.RS 4 ++Generates only some kinds of debugging information, specified by a comma separated list of keywords\&. Valid keywords are: ++.PP ++source ++.RS 4 ++Source file debugging information\&. ++.RE ++.PP ++lines ++.RS 4 ++Line number debugging information\&. ++.RE ++.PP ++vars ++.RS 4 ++Local variable debugging information\&. ++.RE ++.RE ++.PP ++\-help ++.RS 4 ++Prints a synopsis of standard options\&. ++.RE ++.PP ++\-implicit:[\fIclass, none\fR] ++.RS 4 ++Controls the generation of class files for implicitly loaded source files\&. To automatically generate class files, use ++\fB\-implicit:class\fR\&. To suppress class file generation, use ++\fB\-implicit:none\fR\&. If this option is not specified, then the default is to automatically generate class files\&. In this case, the compiler issues a warning if any such class files are generated when also doing annotation processing\&. The warning is not issued when the ++\fB\-implicit\fR ++option is set explicitly\&. See Searching for Types\&. ++.RE ++.PP ++\-J\fIoption\fR ++.RS 4 ++Passes ++\fBoption\fR ++to the Java Virtual Machine (JVM), where option is one of the options described on the reference page for the Java launcher\&. For example, ++\fB\-J\-Xms48m\fR ++sets the startup memory to 48 MB\&. See ++java(1)\&. ++.sp ++\fBNote:\fR ++The ++\fICLASSPATH\fR, ++\fB\-classpath\fR, ++\fB\-bootclasspath\fR, and ++\fB\-extdirs\fR ++options do not specify the classes used to run ++\fBjavac\fR\&. Trying to customize the compiler implementation with these options and variables is risky and often does not accomplish what you want\&. If you must customize the complier implementation, then use the ++\fB\-J\fR ++option to pass options through to the underlying Java launcher\&. ++.RE ++.PP ++\-nowarn ++.RS 4 ++Disables warning messages\&. This option operates the same as the ++\fB\-Xlint:none\fR ++option\&. ++.RE ++.PP ++\-parameters ++.RS 4 ++Stores formal parameter names of constructors and methods in the generated class file so that the method ++\fBjava\&.lang\&.reflect\&.Executable\&.getParameters\fR ++from the Reflection API can retrieve them\&. ++.RE ++.PP ++\-proc: [\fInone\fR, \fIonly\fR] ++.RS 4 ++Controls whether annotation processing and compilation are done\&. ++\fB\-proc:none\fR ++means that compilation takes place without annotation processing\&. ++\fB\-proc:only\fR ++means that only annotation processing is done, without any subsequent compilation\&. ++.RE ++.PP ++\-processor \fIclass1\fR [,\fIclass2\fR,\fIclass3\fR\&.\&.\&.] ++.RS 4 ++Names of the annotation processors to run\&. This bypasses the default discovery process\&. ++.RE ++.PP ++\-processorpath \fIpath\fR ++.RS 4 ++Specifies where to find annotation processors\&. If this option is not used, then the class path is searched for processors\&. ++.RE ++.PP ++\-s \fIdir\fR ++.RS 4 ++Specifies the directory where to place the generated source files\&. The directory must already exist because ++\fBjavac\fR ++does not create it\&. If a class is part of a package, then the compiler puts the source file in a subdirectory that reflects the package name and creates directories as needed\&. ++.sp ++If you specify ++\fB\-s /home/mysrc\fR ++and the class is called ++\fBcom\&.mypackage\&.MyClass\fR, then the source file is put in ++\fB/home/mysrc/com/mypackage/MyClass\&.java\fR\&. ++.RE ++.PP ++\-source \fIrelease\fR ++.RS 4 ++Specifies the version of source code accepted\&. The following values for ++\fBrelease\fR ++are allowed: ++.PP ++1\&.3 ++.RS 4 ++The compiler does not support assertions, generics, or other language features introduced after Java SE 1\&.3\&. ++.RE ++.PP ++1\&.4 ++.RS 4 ++The compiler accepts code containing assertions, which were introduced in Java SE 1\&.4\&. ++.RE ++.PP ++1\&.5 ++.RS 4 ++The compiler accepts code containing generics and other language features introduced in Java SE 5\&. ++.RE ++.PP ++5 ++.RS 4 ++Synonym for 1\&.5\&. ++.RE ++.PP ++1\&.6 ++.RS 4 ++No language changes were introduced in Java SE 6\&. However, encoding errors in source files are now reported as errors instead of warnings as in earlier releases of Java Platform, Standard Edition\&. ++.RE ++.PP ++6 ++.RS 4 ++Synonym for 1\&.6\&. ++.RE ++.PP ++1\&.7 ++.RS 4 ++The compiler accepts code with features introduced in Java SE 7\&. ++.RE ++.PP ++7 ++.RS 4 ++Synonym for 1\&.7\&. ++.RE ++.PP ++1\&.8 ++.RS 4 ++This is the default value\&. The compiler accepts code with features introduced in Java SE 8\&. ++.RE ++.PP ++8 ++.RS 4 ++Synonym for 1\&.8\&. ++.RE ++.RE ++.PP ++\-sourcepath \fIsourcepath\fR ++.RS 4 ++Specifies the source code path to search for class or interface definitions\&. As with the user class path, source path entries are separated by colons (:) on Oracle Solaris and semicolons on Windows and can be directories, JAR archives, or ZIP archives\&. If packages are used, then the local path name within the directory or archive must reflect the package name\&. ++.sp ++\fBNote:\fR ++Classes found through the class path might be recompiled when their source files are also found\&. See Searching for Types\&. ++.RE ++.PP ++\-verbose ++.RS 4 ++Uses verbose output, which includes information about each class loaded and each source file compiled\&. ++.RE ++.PP ++\-version ++.RS 4 ++Prints release information\&. ++.RE ++.PP ++\-werror ++.RS 4 ++Terminates compilation when warnings occur\&. ++.RE ++.PP ++\-X ++.RS 4 ++Displays information about nonstandard options and exits\&. ++.RE ++.SS "Cross\-Compilation Options" ++.PP ++By default, classes are compiled against the bootstrap and extension classes of the platform that ++\fBjavac\fR ++shipped with\&. But ++\fBjavac\fR ++also supports cross\-compiling, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation\&. It is important to use the ++\fB\-bootclasspath\fR ++and ++\fB\-extdirs\fR ++options when cross\-compiling\&. ++.PP ++\-target \fIversion\fR ++.RS 4 ++Generates class files that target a specified release of the virtual machine\&. Class files will run on the specified target and on later releases, but not on earlier releases of the JVM\&. Valid targets are 1\&.1, 1\&.2, 1\&.3, 1\&.4, 1\&.5 (also 5), 1\&.6 (also 6), 1\&.7 (also 7), and 1\&.8 (also 8)\&. ++.sp ++The default for the ++\fB\-target\fR ++option depends on the value of the ++\fB\-source\fR ++option: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is not specified, then the value of the ++\fB\-target\fR ++option is 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.2, then the value of the ++\fB\-target\fR ++option is 1\&.4 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.3, then the value of the ++\fB\-target\fR ++option is 1\&.4 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.5, then the value of the ++\fB\-target\fR ++option is 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.6, then the value of the ++\fB\-target\fR ++is option 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.7, then the value of the ++\fB\-target\fR ++is option 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++For all other values of the ++\fB\-source\fR ++option, the value of the ++\fB\-target\fR ++option is the value of the ++\fB\-source\fR ++option\&. ++.RE ++.RE ++.PP ++\-bootclasspath \fIbootclasspath\fR ++.RS 4 ++Cross\-compiles against the specified set of boot classes\&. As with the user class path, boot class path entries are separated by colons (:) and can be directories, JAR archives, or ZIP archives\&. ++.RE ++.SS "Compact Profile Option" ++.PP ++Beginning with JDK 8, the ++\fBjavac\fR ++compiler supports compact profiles\&. With compact profiles, applications that do not require the entire Java platform can be deployed and run with a smaller footprint\&. The compact profiles feature could be used to shorten the download time for applications from app stores\&. This feature makes for more compact deployment of Java applications that bundle the JRE\&. This feature is also useful in small devices\&. ++.PP ++The supported profile values are ++\fBcompact1\fR, ++\fBcompact2\fR, and ++\fBcompact3\fR\&. These are additive layers\&. Each higher\-numbered compact profile contains all of the APIs in profiles with smaller number names\&. ++.PP ++\-profile ++.RS 4 ++When using compact profiles, this option specifies the profile name when compiling\&. For example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-profile compact1 Hello\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++javac does not compile source code that uses any Java SE APIs that is not in the specified profile\&. Here is an example of the error message that results from attempting to compile such source code: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBcd jdk1\&.8\&.0/bin\fR ++\fB\&./javac \-profile compact1 Paint\&.java\fR ++\fBPaint\&.java:5: error: Applet is not available in profile \*(Aqcompact1\*(Aq\fR ++\fBimport java\&.applet\&.Applet;\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++In this example, you can correct the error by modifying the source to not use the ++\fBApplet\fR ++class\&. You could also correct the error by compiling without the \-profile option\&. Then the compilation would be run against the full set of Java SE APIs\&. (None of the compact profiles include the ++\fBApplet\fR ++class\&.) ++.sp ++An alternative way to compile with compact profiles is to use the ++\fB\-bootclasspath\fR ++option to specify a path to an ++\fBrt\&.jar\fR ++file that specifies a profile\*(Aqs image\&. Using the ++\fB\-profile\fR ++option instead does not require a profile image to be present on the system at compile time\&. This is useful when cross\-compiling\&. ++.RE ++.SS "Nonstandard Options" ++.PP ++\-Xbootclasspath/p:\fIpath\fR ++.RS 4 ++Adds a suffix to the bootstrap class path\&. ++.RE ++.PP ++\-Xbootclasspath/a:\fIpath\fR ++.RS 4 ++Adds a prefix to the bootstrap class path\&. ++.RE ++.PP ++\-Xbootclasspath/:\fIpath\fR ++.RS 4 ++Overrides the location of the bootstrap class files\&. ++.RE ++.PP ++\-Xdoclint:[\-]\fIgroup\fR [\fI/access\fR] ++.RS 4 ++Enables or disables specific groups of checks, where ++\fIgroup\fR ++is one of the following values: ++\fBaccessibility\fR, ++\fBsyntax\fR, ++\fBreference\fR, ++\fBhtml\fR ++or ++\fBmissing\fR\&. For more information about these groups of checks see the ++\fB\-Xdoclint\fR ++option of the ++\fBjavadoc\fR ++command\&. The ++\fB\-Xdoclint\fR ++option is disabled by default in the ++\fBjavac\fR ++command\&. ++.sp ++The variable ++\fIaccess\fR ++specifies the minimum visibility level of classes and members that the ++\fB\-Xdoclint\fR ++option checks\&. It can have one of the following values (in order of most to least visible) : ++\fBpublic\fR, ++\fBprotected\fR, ++\fBpackage\fR ++and ++\fBprivate\fR\&. For example, the following option checks classes and members (with all groups of checks) that have the access level protected and higher (which includes protected, package and public): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xdoclint:all/protected\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following option enables all groups of checks for all access levels, except it will not check for HTML errors for classes and members that have access level package and higher (which includes package and public): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xdoclint:all,\-html/package\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-Xdoclint:none ++.RS 4 ++Disables all groups of checks\&. ++.RE ++.PP ++\-Xdoclint:all[\fI/access\fR] ++.RS 4 ++Enables all groups of checks\&. ++.RE ++.PP ++\-Xlint ++.RS 4 ++Enables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. ++.RE ++.PP ++\-Xlint:all ++.RS 4 ++Enables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. ++.RE ++.PP ++\-Xlint:none ++.RS 4 ++Disables all warnings\&. ++.RE ++.PP ++\-Xlint:\fIname\fR ++.RS 4 ++Disables warning name\&. See Enable or Disable Warnings with the \-Xlint Option for a list of warnings you can disable with this option\&. ++.RE ++.PP ++\-Xlint:\fI\-name\fR ++.RS 4 ++Disables warning name\&. See Enable or Disable Warnings with the \-Xlint Option with the ++\fB\-Xlint\fR ++option to get a list of warnings that you can disable with this option\&. ++.RE ++.PP ++\-Xmaxerrs \fInumber\fR ++.RS 4 ++Sets the maximum number of errors to print\&. ++.RE ++.PP ++\-Xmaxwarns \fInumber\fR ++.RS 4 ++Sets the maximum number of warnings to print\&. ++.RE ++.PP ++\-Xstdout \fIfilename\fR ++.RS 4 ++Sends compiler messages to the named file\&. By default, compiler messages go to ++\fBSystem\&.err\fR\&. ++.RE ++.PP ++\-Xprefer:[\fInewer,source\fR] ++.RS 4 ++Specifies which file to read when both a source file and class file are found for a type\&. (See Searching for Types)\&. If the ++\fB\-Xprefer:newer\fR ++option is used, then it reads the newer of the source or class file for a type (default)\&. If the ++\fB\-Xprefer:source\fR ++option is used, then it reads the source file\&. Use \-\fBXprefer:source\fR ++when you want to be sure that any annotation processors can access annotations declared with a retention policy of ++\fBSOURCE\fR\&. ++.RE ++.PP ++\-Xpkginfo:[\fIalways\fR,\fIlegacy\fR,\fInonempty\fR] ++.RS 4 ++Control whether javac generates ++\fBpackage\-info\&.class\fR ++files from package\-info\&.java files\&. Possible mode arguments for this option include the following\&. ++.PP ++always ++.RS 4 ++Always generate a ++\fBpackage\-info\&.class\fR ++file for every ++\fBpackage\-info\&.java\fR ++file\&. This option may be useful if you use a build system such as Ant, which checks that each ++\fB\&.java\fR ++file has a corresponding ++\fB\&.class\fR ++file\&. ++.RE ++.PP ++legacy ++.RS 4 ++Generate a ++\fBpackage\-info\&.class\fR ++file only if package\-info\&.java contains annotations\&. Don\*(Aqt generate a ++\fBpackage\-info\&.class\fR ++file if package\-info\&.java only contains comments\&. ++.sp ++\fBNote:\fR ++A ++\fBpackage\-info\&.class\fR ++file might be generated but be empty if all the annotations in the package\-info\&.java file have ++\fBRetentionPolicy\&.SOURCE\fR\&. ++.RE ++.PP ++nonempty ++.RS 4 ++Generate a ++\fBpackage\-info\&.class\fR ++file only if package\-info\&.java contains annotations with ++\fBRetentionPolicy\&.CLASS\fR ++or ++\fBRetentionPolicy\&.RUNTIME\fR\&. ++.RE ++.RE ++.PP ++\-Xprint ++.RS 4 ++Prints a textual representation of specified types for debugging purposes\&. Perform neither annotation processing nor compilation\&. The format of the output could change\&. ++.RE ++.PP ++\-XprintProcessorInfo ++.RS 4 ++Prints information about which annotations a processor is asked to process\&. ++.RE ++.PP ++\-XprintRounds ++.RS 4 ++Prints information about initial and subsequent annotation processing rounds\&. ++.RE ++.SH "ENABLE OR DISABLE WARNINGS WITH THE -XLINT OPTION" ++.PP ++Enable warning ++\fIname\fR ++with the ++\fB\-Xlint:name\fR ++option, where ++\fBname\fR ++is one of the following warning names\&. Note that you can disable a warning with the ++\fB\-Xlint:\-name:\fR ++option\&. ++.PP ++cast ++.RS 4 ++Warns about unnecessary and redundant casts, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBString s = (String) "Hello!"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++classfile ++.RS 4 ++Warns about issues related to class file contents\&. ++.RE ++.PP ++deprecation ++.RS 4 ++Warns about the use of deprecated items, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava\&.util\&.Date myDate = new java\&.util\&.Date();\fR ++\fBint currentDay = myDate\&.getDay();\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The method ++\fBjava\&.util\&.Date\&.getDay\fR ++has been deprecated since JDK 1\&.1 ++.RE ++.PP ++dep\-ann ++.RS 4 ++Warns about items that are documented with an ++\fB@deprecated\fR ++Javadoc comment, but do not have a ++\fB@Deprecated\fR ++annotation, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * @deprecated As of Java SE 7, replaced by {@link #newMethod()}\fR ++\fB */\fR ++\fBpublic static void deprecatedMethood() { }\fR ++\fBpublic static void newMethod() { }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++divzero ++.RS 4 ++Warns about division by the constant integer 0, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBint divideByZero = 42 / 0;\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++empty ++.RS 4 ++Warns about empty statements after ++\fBif \fRstatements, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBclass E {\fR ++\fB void m() {\fR ++\fB if (true) ;\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++fallthrough ++.RS 4 ++Checks the switch blocks for fall\-through cases and provides a warning message for any that are found\&. Fall\-through cases are cases in a switch block, other than the last case in the block, whose code does not include a break statement, allowing code execution to fall through from that case to the next case\&. For example, the code following the case 1 label in this switch block does not end with a break statement: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBswitch (x) {\fR ++\fBcase 1:\fR ++\fB System\&.out\&.println("1");\fR ++\fB // No break statement here\&.\fR ++\fBcase 2:\fR ++\fB System\&.out\&.println("2");\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If the ++\fB\-Xlint:fallthrough\fR ++option was used when compiling this code, then the compiler emits a warning about possible fall\-through into case, with the line number of the case in question\&. ++.RE ++.PP ++finally ++.RS 4 ++Warns about ++\fBfinally\fR ++clauses that cannot complete normally, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic static int m() {\fR ++\fB try {\fR ++\fB throw new NullPointerException();\fR ++\fB } catch (NullPointerException(); {\fR ++\fB System\&.err\&.println("Caught NullPointerException\&.");\fR ++\fB return 1;\fR ++\fB } finally {\fR ++\fB return 0;\fR ++\fB }\fR ++\fB }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates a warning for the ++\fBfinally\fR ++block in this example\&. When the ++\fBint\fR ++method is called, it returns a value of 0\&. A ++\fBfinally\fR ++block executes when the ++\fBtry\fR ++block exits\&. In this example, when control is transferred to the ++\fBcatch\fR ++block, the ++\fBint\fR ++method exits\&. However, the ++\fBfinally\fR ++block must execute, so it is executed, even though control was transferred outside the method\&. ++.RE ++.PP ++options ++.RS 4 ++Warns about issues that related to the use of command\-line options\&. See Cross\-Compilation Options\&. ++.RE ++.PP ++overrides ++.RS 4 ++Warns about issues regarding method overrides\&. For example, consider the following two classes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic class ClassWithVarargsMethod {\fR ++\fB void varargsMethod(String\&.\&.\&. s) { }\fR ++\fB}\fR ++ ++\fBpublic class ClassWithOverridingMethod extends ClassWithVarargsMethod {\fR ++\fB @Override\fR ++\fB void varargsMethod(String[] s) { }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates a warning similar to the following:\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [override] varargsMethod(String[]) in ClassWithOverridingMethod \fR ++\fBoverrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding\fR ++\fBmethod is missing \*(Aq\&.\&.\&.\*(Aq\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++When the compiler encounters a ++\fBvarargs\fR ++method, it translates the ++\fBvarargs\fR ++formal parameter into an array\&. In the method ++\fBClassWithVarargsMethod\&.varargsMethod\fR, the compiler translates the ++\fBvarargs\fR ++formal parameter ++\fBString\&.\&.\&. s\fR ++to the formal parameter ++\fBString[] s\fR, an array, which matches the formal parameter of the method ++\fBClassWithOverridingMethod\&.varargsMethod\fR\&. Consequently, this example compiles\&. ++.RE ++.PP ++path ++.RS 4 ++Warns about invalid path elements and nonexistent path directories on the command line (with regard to the class path, the source path, and other paths)\&. Such warnings cannot be suppressed with the ++\fB@SuppressWarnings\fR ++annotation, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-Xlint:path \-classpath /nonexistentpath Example\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++processing ++.RS 4 ++Warn about issues regarding annotation processing\&. The compiler generates this warning when you have a class that has an annotation, and you use an annotation processor that cannot handle that type of exception\&. For example, the following is a simple annotation processor: ++.sp ++\fBSource file AnnocProc\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBimport java\&.util\&.*;\fR ++\fBimport javax\&.annotation\&.processing\&.*;\fR ++\fBimport javax\&.lang\&.model\&.*;\fR ++\fBimport\&.javaz\&.lang\&.model\&.element\&.*;\fR ++ ++\fB@SupportedAnnotationTypes("NotAnno")\fR ++\fBpublic class AnnoProc extends AbstractProcessor {\fR ++\fB public boolean process(Set elems, RoundEnvironment renv){\fR ++\fB return true;\fR ++\fB }\fR ++ ++\fB public SourceVersion getSupportedSourceVersion() {\fR ++\fB return SourceVersion\&.latest();\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fBSource file AnnosWithoutProcessors\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB@interface Anno { }\fR ++\fB \fR ++\fB@Anno\fR ++\fBclass AnnosWithoutProcessors { }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following commands compile the annotation processor ++\fBAnnoProc\fR, then run this annotation processor against the source file ++\fBAnnosWithoutProcessors\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac AnnoProc\&.java\fR ++\fBjavac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++When the compiler runs the annotation processor against the source file ++\fBAnnosWithoutProcessors\&.java\fR, it generates the following warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [processing] No processor claimed any of these annotations: Anno\fR ++\fB \fR ++.fi ++.if n \{\ ++.RE ++.\} ++To resolve this issue, you can rename the annotation defined and used in the class ++\fBAnnosWithoutProcessors\fR ++from ++\fBAnno\fR ++to ++\fBNotAnno\fR\&. ++.RE ++.PP ++rawtypes ++.RS 4 ++Warns about unchecked operations on raw types\&. The following statement generates a ++\fBrawtypes\fR ++warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBvoid countElements(List l) { \&.\&.\&. }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example does not generate a ++\fBrawtypes\fR ++warning ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBvoid countElements(List l) { \&.\&.\&. }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fBList\fR ++is a raw type\&. However, ++\fBList\fR ++is an unbounded wildcard parameterized type\&. Because ++\fBList\fR ++is a parameterized interface, always specify its type argument\&. In this example, the ++\fBList\fR ++formal argument is specified with an unbounded wildcard (\fB?\fR) as its formal type parameter, which means that the ++\fBcountElements\fR ++method can accept any instantiation of the ++\fBList\fR ++interface\&. ++.RE ++.PP ++Serial ++.RS 4 ++Warns about missing ++\fBserialVersionUID\fR ++definitions on serializable classes, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic class PersistentTime implements Serializable\fR ++\fB{\fR ++\fB private Date time;\fR ++\fB \fR ++\fB public PersistentTime() {\fR ++\fB time = Calendar\&.getInstance()\&.getTime();\fR ++\fB }\fR ++\fB \fR ++\fB public Date getTime() {\fR ++\fB return time;\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates the following warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [serial] serializable class PersistentTime has no definition of\fR ++\fBserialVersionUID\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If a serializable class does not explicitly declare a field named ++\fBserialVersionUID\fR, then the serialization runtime environment calculates a default ++\fBserialVersionUID\fR ++value for that class based on various aspects of the class, as described in the Java Object Serialization Specification\&. However, it is strongly recommended that all serializable classes explicitly declare ++\fBserialVersionUID\fR ++values because the default process of computing ++\fBserialVersionUID\fR ++vales is highly sensitive to class details that can vary depending on compiler implementations, and as a result, might cause an unexpected ++\fBInvalidClassExceptions\fR ++during deserialization\&. To guarantee a consistent ++\fBserialVersionUID\fR ++value across different Java compiler implementations, a serializable class must declare an explicit ++\fBserialVersionUID\fR ++value\&. ++.RE ++.PP ++static ++.RS 4 ++Warns about issues relating to the use of statics, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBclass XLintStatic {\fR ++\fB static void m1() { }\fR ++\fB void m2() { this\&.m1(); }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates the following warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [static] static method should be qualified by type name, \fR ++\fBXLintStatic, instead of by an expression\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++To resolve this issue, you can call the ++\fBstatic\fR ++method ++\fBm1\fR ++as follows: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBXLintStatic\&.m1();\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Alternately, you can remove the ++\fBstatic\fR ++keyword from the declaration of the method ++\fBm1\fR\&. ++.RE ++.PP ++try ++.RS 4 ++Warns about issues relating to use of ++\fBtry\fR ++blocks, including try\-with\-resources statements\&. For example, a warning is generated for the following statement because the resource ++\fBac\fR ++declared in the ++\fBtry\fR ++block is not used: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBtry ( AutoCloseable ac = getResource() ) { // do nothing}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++unchecked ++.RS 4 ++Gives more detail for unchecked conversion warnings that are mandated by the Java Language Specification, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBList l = new ArrayList();\fR ++\fBList ls = l; // unchecked warning\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++During type erasure, the types ++\fBArrayList\fR ++and ++\fBList\fR ++become ++\fBArrayList\fR ++and ++\fBList\fR, respectively\&. ++.sp ++The ++\fBls\fR ++command has the parameterized type ++\fBList\fR\&. When the ++\fBList\fR ++referenced by ++\fBl\fR ++is assigned to ++\fBls\fR, the compiler generates an unchecked warning\&. At compile time, the compiler and JVM cannot determine whether ++\fBl\fR ++refers to a ++\fBList\fR ++type\&. In this case, ++\fBl\fR ++does not refer to a ++\fBList\fR ++type\&. As a result, heap pollution occurs\&. ++.sp ++A heap pollution situation occurs when the ++\fBList\fR ++object ++\fBl\fR, whose static type is ++\fBList\fR, is assigned to another ++\fBList\fR ++object, ++\fBls\fR, that has a different static type, ++\fBList\fR\&. However, the compiler still allows this assignment\&. It must allow this assignment to preserve backward compatibility with releases of Java SE that do not support generics\&. Because of type erasure, ++\fBList\fR ++and ++\fBList\fR ++both become ++\fBList\fR\&. Consequently, the compiler allows the assignment of the object ++\fBl\fR\fB,\fR ++which has a raw type of ++\fBList\fR, to the object ++\fBls\fR\&. ++.RE ++.PP ++varargs ++.RS 4 ++Warns about unsafe usages of variable arguments (\fBvarargs\fR) methods, in particular, those that contain non\-reifiable arguments, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic class ArrayBuilder {\fR ++\fB public static void addToList (List listArg, T\&.\&.\&. elements) {\fR ++\fB for (T x : elements) {\fR ++\fB listArg\&.add(x);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fBNote:\fR ++A non\-reifiable type is a type whose type information is not fully available at runtime\&. ++.sp ++The compiler generates the following warning for the definition of the method ++\fBArrayBuilder\&.addToList\fR ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [varargs] Possible heap pollution from parameterized vararg type T\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++When the compiler encounters a varargs method, it translates the ++\fBvarargs\fR ++formal parameter into an array\&. However, the Java programming language does not permit the creation of arrays of parameterized types\&. In the method ++\fBArrayBuilder\&.addToList\fR, the compiler translates the ++\fBvarargs\fR ++formal parameter ++\fBT\&.\&.\&.\fR ++elements to the formal parameter ++\fBT[]\fR ++elements, an array\&. However, because of type erasure, the compiler converts the ++\fBvarargs\fR ++formal parameter to ++\fBObject[]\fR ++elements\&. Consequently, there is a possibility of heap pollution\&. ++.RE ++.SH "COMMAND-LINE ARGUMENT FILES" ++.PP ++To shorten or simplify the ++\fBjavac\fR ++command, you can specify one or more files that contain arguments to the ++\fBjavac\fR ++command (except ++\fB\-J\fR ++options)\&. This enables you to create ++\fBjavac\fR ++commands of any length on any operating system\&. ++.PP ++An argument file can include ++\fBjavac\fR ++options and source file names in any combination\&. The arguments within a file can be separated by spaces or new line characters\&. If a file name contains embedded spaces, then put the whole file name in double quotation marks\&. ++.PP ++File Names within an argument file are relative to the current directory, not the location of the argument file\&. Wild cards (*) are not allowed in these lists (such as for specifying ++\fB*\&.java\fR)\&. Use of the at sign (@) to recursively interpret files is not supported\&. The ++\fB\-J\fR ++options are not supported because they are passed to the launcher, which does not support argument files\&. ++.PP ++When executing the ++\fBjavac\fR ++command, pass in the path and name of each argument file with the at sign (@) leading character\&. When the ++\fBjavac\fR ++command encounters an argument beginning with the at sign (@), it expands the contents of that file into the argument list\&. ++.PP ++\fBExample 1\fR + .br +-Specifies options to pass to annotation processors\&. These options are not interpreted by \f3javac\fR directly, but are made available for use by individual processors\&. The \f3key\fR value should be one or more identifiers separated by a dot (\&.)\&. +-.TP +--cp \fIpath\fR or -classpath \fIpath\fR ++Single Argument File ++.RS 4 ++You could use a single argument file named ++\fBargfile\fR ++to hold all ++\fBjavac\fR ++arguments: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac @argfile\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This argument file could contain the contents of both files shown in Example 2 ++.RE ++.PP ++\fBExample 2\fR + .br +-Specifies where to find user class files, and (optionally) annotation processors and source files\&. This class path overrides the user class path in the \f3CLASSPATH\fR environment variable\&. If neither \f3CLASSPATH\fR, \f3-cp\fR nor \f3-classpath\fR is specified, then the user \fIclass path\fR is the current directory\&. See Setting the Class Path\&. +- +-If the \f3-sourcepath\fR option is not specified, then the user class path is also searched for source files\&. +- +-If the \f3-processorpath\fR option is not specified, then the class path is also searched for annotation processors\&. +-.TP +--Djava\&.ext\&.dirs=\fIdirectories\fR ++Two Argument Files ++.RS 4 ++You can create two argument files: one for the ++\fBjavac\fR ++options and the other for the source file names\&. Note that the following lists have no line\-continuation characters\&. ++.sp ++Create a file named options that contains the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-d classes\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-g\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-sourcepath /java/pubs/ws/1\&.3/src/share/classes\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Create a file named classes that contains the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBMyClass1\&.java\fR ++\fBMyClass2\&.java\fR ++\fBMyClass3\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Then, run the ++\fBjavac\fR ++command as follows: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac @options @classes\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\fBExample 3\fR + .br +-Overrides the location of installed extensions\&. +-.TP +--Djava\&.endorsed\&.dirs=\fIdirectories\fR +-.br +-Overrides the location of the endorsed standards path\&. +-.TP +--d \fIdirectory\fR +-.br +-Sets the destination directory for class files\&. The directory must already exist because \f3javac\fR does not create it\&. If a class is part of a package, then \f3javac\fR puts the class file in a subdirectory that reflects the package name and creates directories as needed\&. +- +-If you specify \f3-d\fR\f3/home/myclasses\fR and the class is called \f3com\&.mypackage\&.MyClass\fR, then the class file is \f3/home/myclasses/com/mypackage/MyClass\&.class\fR\&. +- +-If the \fI-d\fR option is not specified, then \f3javac\fR puts each class file in the same directory as the source file from which it was generated\&. +- +-\fINote:\fR The directory specified by the \fI-d\fR option is not automatically added to your user class path\&. +-.TP +--deprecation +-.br +-Shows a description of each use or override of a deprecated member or class\&. Without the \f3-deprecation\fR option, \f3javac\fR shows a summary of the source files that use or override deprecated members or classes\&. The \f3-deprecation\fR option is shorthand for \f3-Xlint:deprecation\fR\&. +-.TP +--encoding \fIencoding\fR +-.br +-Sets the source file encoding name, such as EUC-JP and UTF-8\&. If the \f3-encoding\fR option is not specified, then the platform default converter is used\&. +-.TP +--endorseddirs \fIdirectories\fR +-.br +-Overrides the location of the endorsed standards path\&. +-.TP +--extdirs \fIdirectories\fR +-.br +-Overrides the location of the \f3ext\fR directory\&. The directories variable is a colon-separated list of directories\&. Each JAR file in the specified directories is searched for class files\&. All JAR files found become part of the class path\&. +- +-If you are cross-compiling (compiling classes against bootstrap and extension classes of a different Java platform implementation), then this option specifies the directories that contain the extension classes\&. See Cross-Compilation Options for more information\&. +-.TP +--g +-.br +-Generates all debugging information, including local variables\&. By default, only line number and source file information is generated\&. +-.TP +--g:none +-.br +-Does not generate any debugging information\&. +-.TP +--g:[\fIkeyword list\fR] +-.br +-Generates only some kinds of debugging information, specified by a comma separated list of keywords\&. Valid keywords are: +-.RS +-.TP +-source +-Source file debugging information\&. +-.TP +-lines +-Line number debugging information\&. +-.TP +-vars +-Local variable debugging information\&. +-.RE +- +-.TP +--help +-.br +-Prints a synopsis of standard options\&. +-.TP +--implicit:[\fIclass, none\fR] +-.br +-Controls the generation of class files for implicitly loaded source files\&. To automatically generate class files, use \f3-implicit:class\fR\&. To suppress class file generation, use \f3-implicit:none\fR\&. If this option is not specified, then the default is to automatically generate class files\&. In this case, the compiler issues a warning if any such class files are generated when also doing annotation processing\&. The warning is not issued when the \f3-implicit\fR option is set explicitly\&. See Searching for Types\&. +-.TP +--J\fIoption\fR +-.br +-Passes \f3option\fR to the Java Virtual Machine (JVM), where option is one of the options described on the reference page for the Java launcher\&. For example, \f3-J-Xms48m\fR sets the startup memory to 48 MB\&. See java(1)\&. +- +-\fINote:\fR The \fICLASSPATH\fR, \f3-classpath\fR, \f3-bootclasspath\fR, and \f3-extdirs\fR options do not specify the classes used to run \f3javac\fR\&. Trying to customize the compiler implementation with these options and variables is risky and often does not accomplish what you want\&. If you must customize the complier implementation, then use the \f3-J\fR option to pass options through to the underlying \f3\fRJava launcher\&. +-.TP +--nowarn +-.br +-Disables warning messages\&. This option operates the same as the \f3-Xlint:none\fR option\&. +-.TP +--parameters +-.br +-Stores formal parameter names of constructors and methods in the generated class file so that the method \f3java\&.lang\&.reflect\&.Executable\&.getParameters\fR from the Reflection API can retrieve them\&. +-.TP +--proc: [\fInone\fR, \fIonly\fR] +-.br +-Controls whether annotation processing and compilation are done\&. \f3-proc:none\fR means that compilation takes place without annotation processing\&. \f3-proc:only\fR means that only annotation processing is done, without any subsequent compilation\&. +-.TP +--processor \fIclass1\fR [,\fIclass2\fR,\fIclass3\fR\&.\&.\&.] +-.br +-Names of the annotation processors to run\&. This bypasses the default discovery process\&. +-.TP +--processorpath \fIpath\fR +-.br +-Specifies where to find annotation processors\&. If this option is not used, then the class path is searched for processors\&. +-.TP +--s \fIdir\fR +-.br +-Specifies the directory where to place the generated source files\&. The directory must already exist because \f3javac\fR does not create it\&. If a class is part of a package, then the compiler puts the source file in a subdirectory that reflects the package name and creates directories as needed\&. +- +-If you specify \f3-s /home/mysrc\fR and the class is called \f3com\&.mypackage\&.MyClass\fR, then the source file is put in \f3/home/mysrc/com/mypackage/MyClass\&.java\fR\&. +-.TP +--source \fIrelease\fR +-.br +-Specifies the version of source code accepted\&. The following values for \f3release\fR are allowed: +-.RS +-.TP +-1\&.3 +-The compiler does not support assertions, generics, or other language features introduced after Java SE 1\&.3\&. +-.TP +-1\&.4 +-The compiler accepts code containing assertions, which were introduced in Java SE 1\&.4\&. +-.TP +-1\&.5 +-The compiler accepts code containing generics and other language features introduced in Java SE 5\&. +-.TP +-5 +-Synonym for 1\&.5\&. +-.TP +-1\&.6 +-No language changes were introduced in Java SE 6\&. However, encoding errors in source files are now reported as errors instead of warnings as in earlier releases of Java Platform, Standard Edition\&. +-.TP +-6 +-Synonym for 1\&.6\&. +-.TP +-1\&.7 +-This is the default value\&. The compiler accepts code with features introduced in Java SE 7\&. +-.TP +-7 +-Synonym for 1\&.7\&. +-.RE +- +-.TP +--sourcepath \fIsourcepath\fR +-.br +-Specifies the source code path to search for class or interface definitions\&. As with the user class path, source path entries are separated by colons (:) on Oracle Solaris and semicolons on Windows and can be directories, JAR archives, or ZIP archives\&. If packages are used, then the local path name within the directory or archive must reflect the package name\&. +- +-\fINote:\fR Classes found through the class path might be recompiled when their source files are also found\&. See Searching for Types\&. +-.TP +--verbose +-.br +-Uses verbose output, which includes information about each class loaded and each source file compiled\&. +-.TP +--version +-.br +-Prints release information\&. +-.TP +--werror +-.br +-Terminates compilation when warnings occur\&. +-.TP +--X +-.br +-Displays information about nonstandard options and exits\&. +-.SS CROSS-COMPILATION\ OPTIONS +-By default, classes are compiled against the bootstrap and extension classes of the platform that \f3javac\fR shipped with\&. But \f3javac\fR also supports cross-compiling, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation\&. It is important to use the \f3-bootclasspath\fR and \f3-extdirs\fR options when cross-compiling\&. +-.TP +--target \fIversion\fR +-.br +-Generates class files that target a specified release of the virtual machine\&. Class files will run on the specified target and on later releases, but not on earlier releases of the JVM\&. Valid targets are 1\&.1, 1\&.2, 1\&.3, 1\&.4, 1\&.5 (also 5), 1\&.6 (also 6), and 1\&.7 (also 7)\&. +- +-The default for the \f3-target\fR option depends on the value of the \f3-source\fR option: +-.RS +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is not specified, then the value of the \f3-target\fR option is 1\&.7 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.2, then the value of the \f3-target\fR option is 1\&.4 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.3, then the value of the \f3-target\fR option is 1\&.4 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.5, then the value of the \f3-target\fR option is 1\&.7 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.6, then the value of the \f3-target\fR is option 1\&.7 +-.TP 0.2i +-\(bu +-For all other values of the \f3-source\fR option, the value of the \f3-target\fR option is the value of the \f3-source\fR option\&. +-.RE +- +-.TP +--bootclasspath \fIbootclasspath\fR +-.br +-Cross-compiles against the specified set of boot classes\&. As with the user class path, boot class path entries are separated by colons (:) and can be directories, JAR archives, or ZIP archives\&. +-.SS COMPACT\ PROFILE\ OPTION +-Beginning with JDK 8, the \f3javac\fR compiler supports compact profiles\&. With compact profiles, applications that do not require the entire Java platform can be deployed and run with a smaller footprint\&. The compact profiles feature could be used to shorten the download time for applications from app stores\&. This feature makes for more compact deployment of Java applications that bundle the JRE\&. This feature is also useful in small devices\&. ++Argument Files with Paths ++.RS 4 ++The argument files can have paths, but any file names inside the files are relative to the current working directory (not ++\fBpath1\fR ++or ++\fBpath2\fR): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac @path1/options @path2/classes\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.SH "ANNOTATION PROCESSING" + .PP +-The supported profile values are \f3compact1\fR, \f3compact2\fR, and \f3compact3\fR\&. These are additive layers\&. Each higher-numbered compact profile contains all of the APIs in profiles with smaller number names\&. +-.TP +--profile +-.br +-When using compact profiles, this option specifies the profile name when compiling\&. For example: +-.sp +-.nf +-\f3javac \-profile compact1 Hello\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-javac does not compile source code that uses any Java SE APIs that is not in the specified profile\&. Here is an example of the error message that results from attempting to compile such source code: +-.sp +-.nf +-\f3cd jdk1\&.8\&.0/bin\fP +-.fi +-.nf +-\f3\&./javac \-profile compact1 Paint\&.java\fP +-.fi +-.nf +-\f3Paint\&.java:5: error: Applet is not available in profile \&'compact1\&'\fP +-.fi +-.nf +-\f3import java\&.applet\&.Applet;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-In this example, you can correct the error by modifying the source to not use the \f3Applet\fR class\&. You could also correct the error by compiling without the -profile option\&. Then the compilation would be run against the full set of Java SE APIs\&. (None of the compact profiles include the \f3Applet\fR class\&.) +- +-An alternative way to compile with compact profiles is to use the \f3-bootclasspath\fR option to specify a path to an \f3rt\&.jar\fR file that specifies a profile\&'s image\&. Using the \f3-profile\fR option instead does not require a profile image to be present on the system at compile time\&. This is useful when cross-compiling\&. +-.SS NONSTANDARD\ OPTIONS +-.TP +--Xbootclasspath/p:\fIpath\fR +-.br +-Adds a suffix to the bootstrap class path\&. +-.TP +--Xbootclasspath/a:\fIpath\fR +-.br +-Adds a prefix to the bootstrap class path\&. +-.TP +--Xbootclasspath/:\fIpath\fR +-.br +-Overrides the location of the bootstrap class files\&. +-.TP +--Xdoclint:[-]\fIgroup\fR [\fI/access\fR] +-.br +-Enables or disables specific groups of checks, where \fIgroup\fR is one of the following values: \f3accessibility\fR, \f3syntax\fR, \f3reference\fR, \f3html\fR or \f3missing\fR\&. For more information about these groups of checks see the \f3-Xdoclint\fR option of the \f3javadoc\fR command\&. The \f3-Xdoclint\fR option is disabled by default in the \f3javac\fR command\&. +- +-The variable \fIaccess\fR specifies the minimum visibility level of classes and members that the \f3-Xdoclint\fR option checks\&. It can have one of the following values (in order of most to least visible) : \f3public\fR, \f3protected\fR, \f3package\fR and \f3private\fR\&. For example, the following option checks classes and members (with all groups of checks) that have the access level protected and higher (which includes protected, package and public): +-.sp +-.nf +-\f3\-Xdoclint:all/protected\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following option enables all groups of checks for all access levels, except it will not check for HTML errors for classes and members that have access level package and higher (which includes package and public): +-.sp +-.nf +-\f3\-Xdoclint:all,\-html/package\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--Xdoclint:none +-.br +-Disables all groups of checks\&. +-.TP +--Xdoclint:all[\fI/access\fR] +-.br +-Enables all groups of checks\&. +-.TP +--Xlint +-.br +-\fI\fREnables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. +-.TP +--Xlint:all +-.br +-\fI\fREnables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. +-.TP +--Xlint:none +-.br +-Disables all warnings\&. +-.TP +--Xlint:\fIname\fR +-.br +-Disables warning name\&. See Enable or Disable Warnings with the -Xlint Option for a list of warnings you can disable with this option\&. +-.TP +--Xlint:\fI-name\fR +-.br +-Disables warning name\&. See Enable or Disable Warnings with the -Xlint Option with the \f3-Xlint\fR option to get a list of warnings that you can disable with this option\&. +-.TP +--Xmaxerrs \fInumber\fR +-.br +-Sets the maximum number of errors to print\&. +-.TP +--Xmaxwarns \fInumber\fR +-.br +-Sets the maximum number of warnings to print\&. +-.TP +--Xstdout \fIfilename\fR +-.br +-Sends compiler messages to the named file\&. By default, compiler messages go to \f3System\&.err\fR\&. +-.TP +--Xprefer:[\fInewer,source\fR] +-.br +-Specifies which file to read when both a source file and class file are found for a type\&. (See Searching for Types)\&. If the \f3-Xprefer:newer\fR option is used, then it reads the newer of the source or class file for a type (default)\&. If the \f3-Xprefer:source\fR option is used, then it reads the source file\&. Use -\f3Xprefer:source\fR when you want to be sure that any annotation processors can access annotations declared with a retention policy of \f3SOURCE\fR\&. +-.TP +--Xpkginfo:[\fIalways\fR,\fIlegacy\fR,\fInonempty\fR] +-.br +-Control whether javac generates \f3package-info\&.class\fR files from package-info\&.java files\&. Possible mode arguments for this option include the following\&. +-.RS +-.TP +-always +-Always generate a \f3package-info\&.class\fR file for every \f3package-info\&.java\fR file\&. This option may be useful if you use a build system such as Ant, which checks that each \f3\&.java\fR file has a corresponding \f3\&.class\fR file\&. +-.TP +-legacy +-Generate a \f3package-info\&.class\fR file only if package-info\&.java contains annotations\&. Don\&'t generate a \f3package-info\&.class\fR file if package-info\&.java only contains comments\&. +- +-\fINote:\fR A \f3package-info\&.class\fR file might be generated but be empty if all the annotations in the package-info\&.java file have \f3RetentionPolicy\&.SOURCE\fR\&. +-.TP +-nonempty +-Generate a \f3package-info\&.class\fR file only if package-info\&.java contains annotations with \f3RetentionPolicy\&.CLASS\fR or \f3RetentionPolicy\&.RUNTIME\fR\&. +-.RE +- +-.TP +--Xprint +-.br +-Prints a textual representation of specified types for debugging purposes\&. Perform neither annotation processing nor compilation\&. The format of the output could change\&. +-.TP +--XprintProcessorInfo +-.br +-Prints information about which annotations a processor is asked to process\&. +-.TP +--XprintRounds +-.br +-Prints information about initial and subsequent annotation processing rounds\&. +-.SH ENABLE\ OR\ DISABLE\ WARNINGS\ WITH\ THE\ -XLINT\ OPTION +-Enable warning \fIname\fR with the \f3-Xlint:name\fR option, where \f3name\fR is one of the following warning names\&. Note that you can disable a warning with the \f3-Xlint:-name:\fR option\&. +-.TP +-cast +-Warns about unnecessary and redundant casts, for example: +-.sp +-.nf +-\f3String s = (String) "Hello!"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-classfile +-Warns about issues related to class file contents\&. +-.TP +-deprecation +-Warns about the use of deprecated items, for example: +-.sp +-.nf +-\f3java\&.util\&.Date myDate = new java\&.util\&.Date();\fP +-.fi +-.nf +-\f3int currentDay = myDate\&.getDay();\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The method \f3java\&.util\&.Date\&.getDay\fR has been deprecated since JDK 1\&.1 +-.TP +-dep-ann +-Warns about items that are documented with an \f3@deprecated\fR Javadoc comment, but do not have a \f3@Deprecated\fR annotation, for example: +-.sp +-.nf +-\f3/**\fP +-.fi +-.nf +-\f3 * @deprecated As of Java SE 7, replaced by {@link #newMethod()}\fP +-.fi +-.nf +-\f3 */\fP +-.fi +-.nf +-\f3public static void deprecatedMethood() { }\fP +-.fi +-.nf +-\f3public static void newMethod() { }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-divzero +-Warns about division by the constant integer 0, for example: +-.sp +-.nf +-\f3int divideByZero = 42 / 0;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-empty +-Warns about empty statements after \f3if\fRstatements, for example: +-.sp +-.nf +-\f3class E {\fP +-.fi +-.nf +-\f3 void m() {\fP +-.fi +-.nf +-\f3 if (true) ;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-fallthrough +-Checks the switch blocks for fall-through cases and provides a warning message for any that are found\&. Fall-through cases are cases in a switch block, other than the last case in the block, whose code does not include a break statement, allowing code execution to fall through from that case to the next case\&. For example, the code following the case 1 label in this switch block does not end with a break statement: +-.sp +-.nf +-\f3switch (x) {\fP +-.fi +-.nf +-\f3case 1:\fP +-.fi +-.nf +-\f3 System\&.out\&.println("1");\fP +-.fi +-.nf +-\f3 // No break statement here\&.\fP +-.fi +-.nf +-\f3case 2:\fP +-.fi +-.nf +-\f3 System\&.out\&.println("2");\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If the \f3-Xlint:fallthrough\fR option was used when compiling this code, then the compiler emits a warning about possible fall-through into case, with the line number of the case in question\&. +-.TP +-finally +-Warns about \f3finally\fR clauses that cannot complete normally, for example: +-.sp +-.nf +-\f3public static int m() {\fP +-.fi +-.nf +-\f3 try {\fP +-.fi +-.nf +-\f3 throw new NullPointerException();\fP +-.fi +-.nf +-\f3 } catch (NullPointerException(); {\fP +-.fi +-.nf +-\f3 System\&.err\&.println("Caught NullPointerException\&.");\fP +-.fi +-.nf +-\f3 return 1;\fP +-.fi +-.nf +-\f3 } finally {\fP +-.fi +-.nf +-\f3 return 0;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates a warning for the \f3finally\fR block in this example\&. When the \f3int\fR method is called, it returns a value of 0\&. A \f3finally\fR block executes when the \f3try\fR block exits\&. In this example, when control is transferred to the \f3catch\fR block, the \f3int\fR method exits\&. However, the \f3finally\fR block must execute, so it is executed, even though control was transferred outside the method\&. +-.TP +-options +-Warns about issues that related to the use of command-line options\&. See Cross-Compilation Options\&. +-.TP +-overrides +-Warns about issues regarding method overrides\&. For example, consider the following two classes: +-.sp +-.nf +-\f3public class ClassWithVarargsMethod {\fP +-.fi +-.nf +-\f3 void varargsMethod(String\&.\&.\&. s) { }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3public class ClassWithOverridingMethod extends ClassWithVarargsMethod {\fP +-.fi +-.nf +-\f3 @Override\fP +-.fi +-.nf +-\f3 void varargsMethod(String[] s) { }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates a warning similar to the following:\&. +-.sp +-.nf +-\f3warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod \fP +-.fi +-.nf +-\f3overrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding\fP +-.fi +-.nf +-\f3method is missing \&'\&.\&.\&.\&'\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-When the compiler encounters a \f3varargs\fR method, it translates the \f3varargs\fR formal parameter into an array\&. In the method \f3ClassWithVarargsMethod\&.varargsMethod\fR, the compiler translates the \f3varargs\fR formal parameter \f3String\&.\&.\&. s\fR to the formal parameter \f3String[] s\fR, an array, which matches the formal parameter of the method \f3ClassWithOverridingMethod\&.varargsMethod\fR\&. Consequently, this example compiles\&. +-.TP +-path +-Warns about invalid path elements and nonexistent path directories on the command line (with regard to the class path, the source path, and other paths)\&. Such warnings cannot be suppressed with the \f3@SuppressWarnings\fR annotation, for example: +-.sp +-.nf +-\f3javac \-Xlint:path \-classpath /nonexistentpath Example\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-processing +-Warn about issues regarding annotation processing\&. The compiler generates this warning when you have a class that has an annotation, and you use an annotation processor that cannot handle that type of exception\&. For example, the following is a simple annotation processor: +- +-\fISource file AnnocProc\&.java\fR: +-.sp +-.nf +-\f3import java\&.util\&.*;\fP +-.fi +-.nf +-\f3import javax\&.annotation\&.processing\&.*;\fP +-.fi +-.nf +-\f3import javax\&.lang\&.model\&.*;\fP +-.fi +-.nf +-\f3import\&.javaz\&.lang\&.model\&.element\&.*;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3@SupportedAnnotationTypes("NotAnno")\fP +-.fi +-.nf +-\f3public class AnnoProc extends AbstractProcessor {\fP +-.fi +-.nf +-\f3 public boolean process(Set elems, RoundEnvironment renv){\fP +-.fi +-.nf +-\f3 return true;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public SourceVersion getSupportedSourceVersion() {\fP +-.fi +-.nf +-\f3 return SourceVersion\&.latest();\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\fISource file AnnosWithoutProcessors\&.java\fR: +-.sp +-.nf +-\f3@interface Anno { }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3@Anno\fP +-.fi +-.nf +-\f3class AnnosWithoutProcessors { }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following commands compile the annotation processor \f3AnnoProc\fR, then run this annotation processor against the source file \f3AnnosWithoutProcessors\&.java\fR: +-.sp +-.nf +-\f3javac AnnoProc\&.java\fP +-.fi +-.nf +-\f3javac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-When the compiler runs the annotation processor against the source file \f3AnnosWithoutProcessors\&.java\fR, it generates the following warning: +-.sp +-.nf +-\f3warning: [processing] No processor claimed any of these annotations: Anno\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-To resolve this issue, you can rename the annotation defined and used in the class \f3AnnosWithoutProcessors\fR from \f3Anno\fR to \f3NotAnno\fR\&. +-.TP +-rawtypes +-Warns about unchecked operations on raw types\&. The following statement generates a \f3rawtypes\fR warning: +-.sp +-.nf +-\f3void countElements(List l) { \&.\&.\&. }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following example does not generate a \f3rawtypes\fR warning +-.sp +-.nf +-\f3void countElements(List l) { \&.\&.\&. }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\f3List\fR is a raw type\&. However, \f3List\fR is an unbounded wildcard parameterized type\&. Because \f3List\fR is a parameterized interface, always specify its type argument\&. In this example, the \f3List\fR formal argument is specified with an unbounded wildcard (\f3?\fR) as its formal type parameter, which means that the \f3countElements\fR method can accept any instantiation of the \f3List\fR interface\&. +-.TP +-Serial +-Warns about missing \f3serialVersionUID\fR definitions on serializable classes, for example: +-.sp +-.nf +-\f3public class PersistentTime implements Serializable\fP +-.fi +-.nf +-\f3{\fP +-.fi +-.nf +-\f3 private Date time;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public PersistentTime() {\fP +-.fi +-.nf +-\f3 time = Calendar\&.getInstance()\&.getTime();\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public Date getTime() {\fP +-.fi +-.nf +-\f3 return time;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates the following warning: +-.sp +-.nf +-\f3warning: [serial] serializable class PersistentTime has no definition of\fP +-.fi +-.nf +-\f3serialVersionUID\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If a serializable class does not explicitly declare a field named \f3serialVersionUID\fR, then the serialization runtime environment calculates a default \f3serialVersionUID\fR value for that class based on various aspects of the class, as described in the Java Object Serialization Specification\&. However, it is strongly recommended that all serializable classes explicitly declare \f3serialVersionUID\fR values because the default process of computing \f3serialVersionUID\fR vales is highly sensitive to class details that can vary depending on compiler implementations, and as a result, might cause an unexpected \f3InvalidClassExceptions\fR during deserialization\&. To guarantee a consistent \f3serialVersionUID\fR value across different Java compiler implementations, a serializable class must declare an explicit \f3serialVersionUID\fR value\&. +-.TP +-static +-Warns about issues relating to the use of statics, for example: +-.sp +-.nf +-\f3class XLintStatic {\fP +-.fi +-.nf +-\f3 static void m1() { }\fP +-.fi +-.nf +-\f3 void m2() { this\&.m1(); }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates the following warning: +-.sp +-.nf +-\f3warning: [static] static method should be qualified by type name, \fP +-.fi +-.nf +-\f3XLintStatic, instead of by an expression\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-To resolve this issue, you can call the \f3static\fR method \f3m1\fR as follows: +-.sp +-.nf +-\f3XLintStatic\&.m1();\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Alternately, you can remove the \f3static\fR keyword from the declaration of the method \f3m1\fR\&. +-.TP +-try +-Warns about issues relating to use of \f3try\fR blocks, including try-with-resources statements\&. For example, a warning is generated for the following statement because the resource \f3ac\fR declared in the \f3try\fR block is not used: +-.sp +-.nf +-\f3try ( AutoCloseable ac = getResource() ) { // do nothing}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-unchecked +-Gives more detail for unchecked conversion warnings that are mandated by the Java Language Specification, for example: +-.sp +-.nf +-\f3List l = new ArrayList();\fP +-.fi +-.nf +-\f3List ls = l; // unchecked warning\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-During type erasure, the types \f3ArrayList\fR and \f3List\fR become \f3ArrayList\fR and \f3List\fR, respectively\&. +- +-The \f3ls\fR command has the parameterized type \f3List\fR\&. When the \f3List\fR referenced by \f3l\fR is assigned to \f3ls\fR, the compiler generates an unchecked warning\&. At compile time, the compiler and JVM cannot determine whether \f3l\fR refers to a \f3List\fR type\&. In this case, \f3l\fR does not refer to a \f3List\fR type\&. As a result, heap pollution occurs\&. +- +-A heap pollution situation occurs when the \f3List\fR object \f3l\fR, whose static type is \f3List\fR, is assigned to another \f3List\fR object, \f3ls\fR, that has a different static type, \f3List\fR\&. However, the compiler still allows this assignment\&. It must allow this assignment to preserve backward compatibility with releases of Java SE that do not support generics\&. Because of type erasure, \f3List\fR and \f3List\fR both become \f3List\fR\&. Consequently, the compiler allows the assignment of the object \f3l\fR\f3,\fR which has a raw type of \f3List\fR, to the object \f3ls\fR\&. +-.TP +-varargs +-Warns about unsafe usages of variable arguments (\f3varargs\fR) methods, in particular, those that contain non-reifiable arguments, for example: +-.sp +-.nf +-\f3public class ArrayBuilder {\fP +-.fi +-.nf +-\f3 public static void addToList (List listArg, T\&.\&.\&. elements) {\fP +-.fi +-.nf +-\f3 for (T x : elements) {\fP +-.fi +-.nf +-\f3 listArg\&.add(x);\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\fINote:\fR A non-reifiable type is a type whose type information is not fully available at runtime\&. +- +-The compiler generates the following warning for the definition of the method \f3ArrayBuilder\&.addToList\fR +-.sp +-.nf +-\f3warning: [varargs] Possible heap pollution from parameterized vararg type T\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-When the compiler encounters a varargs method, it translates the \f3varargs\fR formal parameter into an array\&. However, the Java programming language does not permit the creation of arrays of parameterized types\&. In the method \f3ArrayBuilder\&.addToList\fR, the compiler translates the \f3varargs\fR formal parameter \f3T\&.\&.\&.\fR elements to the formal parameter \f3T[]\fR elements, an array\&. However, because of type erasure, the compiler converts the \f3varargs\fR formal parameter to \f3Object[]\fR elements\&. Consequently, there is a possibility of heap pollution\&. +-.SH COMMAND-LINE\ ARGUMENT\ FILES +-To shorten or simplify the \f3javac\fR command, you can specify one or more files that contain arguments to the \f3javac\fR command (except \f3-J\fR options)\&. This enables you to create \f3javac\fR commands of any length on any operating system\&. ++The ++\fBjavac\fR ++command provides direct support for annotation processing, superseding the need for the separate annotation processing command, ++\fBapt\fR\&. + .PP +-An argument file can include \f3javac\fR options and source file names in any combination\&. The arguments within a file can be separated by spaces or new line characters\&. If a file name contains embedded spaces, then put the whole file name in double quotation marks\&. ++The API for annotation processors is defined in the ++\fBjavax\&.annotation\&.processing\fR ++and j\fBavax\&.lang\&.model\fR ++packages and subpackages\&. ++.SS "How Annotation Processing Works" + .PP +-File Names within an argument file are relative to the current directory, not the location of the argument file\&. Wild cards (*) are not allowed in these lists (such as for specifying \f3*\&.java\fR)\&. Use of the at sign (@) to recursively interpret files is not supported\&. The \f3-J\fR options are not supported because they are passed to the launcher, which does not support argument files\&. +-.PP +-When executing the \f3javac\fR command, pass in the path and name of each argument file with the at sign (@) leading character\&. When the \f3javac\fR command encounters an argument beginning with the at sign (@), it expands the contents of that file into the argument list\&. +-.PP +-\f3Example 1 Single Argument File\fR +-.PP +-You could use a single argument file named \f3argfile\fR to hold all \f3javac\fR arguments: +-.sp +-.nf +-\f3javac @argfile\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-This argument file could contain the contents of both files shown in Example 2 +-.PP +-\f3Example 2 Two Argument Files\fR +-.PP +-You can create two argument files: one for the \f3javac\fR options and the other for the source file names\&. Note that the following lists have no line-continuation characters\&. +-.PP +-Create a file named options that contains the following: +-.sp +-.nf +-\f3\-d classes\fP +-.fi +-.nf +-\f3\-g\fP +-.fi +-.nf +-\f3\-sourcepath /java/pubs/ws/1\&.3/src/share/classes\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Create a file named classes that contains the following: +-.sp +-.nf +-\f3MyClass1\&.java\fP +-.fi +-.nf +-\f3MyClass2\&.java\fP +-.fi +-.nf +-\f3MyClass3\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Then, run the \f3javac\fR command as follows: +-.sp +-.nf +-\f3javac @options @classes\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 3 Argument Files with Paths\fR +-.PP +-The argument files can have paths, but any file names inside the files are relative to the current working directory (not \f3path1\fR or \f3path2\fR): +-.sp +-.nf +-\f3javac @path1/options @path2/classes\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-.SH ANNOTATION\ PROCESSING +-The \f3javac\fR command provides direct support for annotation processing, superseding the need for the separate annotation processing command, \f3apt\fR\&. +-.PP +-The API for annotation processors is defined in the \f3javax\&.annotation\&.processing\fR and j\f3avax\&.lang\&.model\fR packages and subpackages\&. +-.SS HOW\ ANNOTATION\ PROCESSING\ WORKS +-Unless annotation processing is disabled with the \f3-proc:none\fR option, the compiler searches for any annotation processors that are available\&. The search path can be specified with the \f3-processorpath\fR option\&. If no path is specified, then the user class path is used\&. Processors are located by means of service provider-configuration files named \f3META-INF/services/javax\&.annotation\&.processing\fR\&.Processor on the search path\&. Such files should contain the names of any annotation processors to be used, listed one per line\&. Alternatively, processors can be specified explicitly, using the \f3-processor\fR option\&. ++Unless annotation processing is disabled with the ++\fB\-proc:none\fR ++option, the compiler searches for any annotation processors that are available\&. The search path can be specified with the ++\fB\-processorpath\fR ++option\&. If no path is specified, then the user class path is used\&. Processors are located by means of service provider\-configuration files named ++\fBMETA\-INF/services/javax\&.annotation\&.processing\fR\&.Processor on the search path\&. Such files should contain the names of any annotation processors to be used, listed one per line\&. Alternatively, processors can be specified explicitly, using the ++\fB\-processor\fR ++option\&. + .PP + After scanning the source files and classes on the command line to determine what annotations are present, the compiler queries the processors to determine what annotations they process\&. When a match is found, the processor is called\&. A processor can claim the annotations it processes, in which case no further attempt is made to find any processors for those annotations\&. After all of the annotations are claimed, the compiler does not search for additional processors\&. + .PP + If any processors generate new source files, then another round of annotation processing occurs: Any newly generated source files are scanned, and the annotations processed as before\&. Any processors called on previous rounds are also called on all subsequent rounds\&. This continues until no new source files are generated\&. + .PP +-After a round occurs where no new source files are generated, the annotation processors are called one last time, to give them a chance to complete any remaining work\&. Finally, unless the \f3-proc:only\fR option is used, the compiler compiles the original and all generated source files\&. +-.SS IMPLICITLY\ LOADED\ SOURCE\ FILES +-To compile a set of source files, the compiler might need to implicitly load additional source files\&. See Searching for Types\&. Such files are currently not subject to annotation processing\&. By default, the compiler gives a warning when annotation processing occurred and any implicitly loaded source files are compiled\&. The \f3-implicit\fR option provides a way to suppress the warning\&. +-.SH SEARCHING\ FOR\ TYPES ++After a round occurs where no new source files are generated, the annotation processors are called one last time, to give them a chance to complete any remaining work\&. Finally, unless the ++\fB\-proc:only\fR ++option is used, the compiler compiles the original and all generated source files\&. ++.SS "Implicitly Loaded Source Files" ++.PP ++To compile a set of source files, the compiler might need to implicitly load additional source files\&. See Searching for Types\&. Such files are currently not subject to annotation processing\&. By default, the compiler gives a warning when annotation processing occurred and any implicitly loaded source files are compiled\&. The ++\fB\-implicit\fR ++option provides a way to suppress the warning\&. ++.SH "SEARCHING FOR TYPES" ++.PP + To compile a source file, the compiler often needs information about a type, but the type definition is not in the source files specified on the command line\&. The compiler needs type information for every class or interface used, extended, or implemented in the source file\&. This includes classes and interfaces not explicitly mentioned in the source file, but that provide information through inheritance\&. + .PP +-For example, when you create a subclass \f3java\&.applet\&.Applet\fR, you are also using the ancestor classes of \f3Applet\fR: \f3java\&.awt\&.Panel\fR, \f3java\&.awt\&.Container\fR, \f3java\&.awt\&.Component\fR, and \f3java\&.lang\&.Object\fR\&. ++For example, when you create a subclass ++\fBjava\&.applet\&.Applet\fR, you are also using the ancestor classes of ++\fBApplet\fR: ++\fBjava\&.awt\&.Panel\fR, ++\fBjava\&.awt\&.Container\fR, ++\fBjava\&.awt\&.Component\fR, and ++\fBjava\&.lang\&.Object\fR\&. + .PP +-When the compiler needs type information, it searches for a source file or class file that defines the type\&. The compiler searches for class files first in the bootstrap and extension classes, then in the user class path (which by default is the current directory)\&. The user class path is defined by setting the \f3CLASSPATH\fR environment variable or by using the \f3-classpath\fR option\&. ++When the compiler needs type information, it searches for a source file or class file that defines the type\&. The compiler searches for class files first in the bootstrap and extension classes, then in the user class path (which by default is the current directory)\&. The user class path is defined by setting the ++\fBCLASSPATH\fR ++environment variable or by using the ++\fB\-classpath\fR ++option\&. + .PP +-If you set the \f3-sourcepath\fR option, then the compiler searches the indicated path for source files\&. Otherwise, the compiler searches the user class path for both class files and source files\&. ++If you set the ++\fB\-sourcepath\fR ++option, then the compiler searches the indicated path for source files\&. Otherwise, the compiler searches the user class path for both class files and source files\&. + .PP +-You can specify different bootstrap or extension classes with the \f3-bootclasspath\fR and the \f3-extdirs\fR options\&. See Cross-Compilation Options\&. ++You can specify different bootstrap or extension classes with the ++\fB\-bootclasspath\fR ++and the ++\fB\-extdirs\fR ++options\&. See Cross\-Compilation Options\&. + .PP +-A successful type search may produce a class file, a source file, or both\&. If both are found, then you can use the \f3-Xprefer\fR option to instruct the compiler which to use\&. If \f3newer\fR is specified, then the compiler uses the newer of the two files\&. If \f3source\fR is specified, the compiler uses the source file\&. The default is \f3newer\fR\&. ++A successful type search may produce a class file, a source file, or both\&. If both are found, then you can use the ++\fB\-Xprefer\fR ++option to instruct the compiler which to use\&. If ++\fBnewer\fR ++is specified, then the compiler uses the newer of the two files\&. If ++\fBsource\fR ++is specified, the compiler uses the source file\&. The default is ++\fBnewer\fR\&. + .PP +-If a type search finds a source file for a required type, either by itself, or as a result of the setting for the \f3-Xprefer\fR option, then the compiler reads the source file to get the information it needs\&. By default the compiler also compiles the source file\&. You can use the \f3-implicit\fR option to specify the behavior\&. If \f3none\fR is specified, then no class files are generated for the source file\&. If \f3class\fR is specified, then class files are generated for the source file\&. ++If a type search finds a source file for a required type, either by itself, or as a result of the setting for the ++\fB\-Xprefer\fR ++option, then the compiler reads the source file to get the information it needs\&. By default the compiler also compiles the source file\&. You can use the ++\fB\-implicit\fR ++option to specify the behavior\&. If ++\fBnone\fR ++is specified, then no class files are generated for the source file\&. If ++\fBclass\fR ++is specified, then class files are generated for the source file\&. + .PP +-The compiler might not discover the need for some type information until after annotation processing completes\&. When the type information is found in a source file and no \f3-implicit\fR option is specified, the compiler gives a warning that the file is being compiled without being subject to annotation processing\&. To disable the warning, either specify the file on the command line (so that it will be subject to annotation processing) or use the \f3-implicit\fR option to specify whether or not class files should be generated for such source files\&. +-.SH PROGRAMMATIC\ INTERFACE +-The \f3javac\fR command supports the new Java Compiler API defined by the classes and interfaces in the \f3javax\&.tools\fR package\&. +-.SS EXAMPLE +-To compile as though providing command-line arguments, use the following syntax: +-.sp +-.nf +-\f3JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fP +-.fi +-.nf +-\f3JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The example writes diagnostics to the standard output stream and returns the exit code that \f3javac\fR would give when called from the command line\&. ++The compiler might not discover the need for some type information until after annotation processing completes\&. When the type information is found in a source file and no ++\fB\-implicit\fR ++option is specified, the compiler gives a warning that the file is being compiled without being subject to annotation processing\&. To disable the warning, either specify the file on the command line (so that it will be subject to annotation processing) or use the ++\fB\-implicit\fR ++option to specify whether or not class files should be generated for such source files\&. ++.SH "PROGRAMMATIC INTERFACE" + .PP +-You can use other methods in the \f3javax\&.tools\&.JavaCompiler\fR interface to handle diagnostics, control where files are read from and written to, and more\&. +-.SS OLD\ INTERFACE +-\fINote:\fR This API is retained for backward compatibility only\&. All new code should use the newer Java Compiler API\&. ++The ++\fBjavac\fR ++command supports the new Java Compiler API defined by the classes and interfaces in the ++\fBjavax\&.tools\fR ++package\&. ++.SS "Example" + .PP +-The \f3com\&.sun\&.tools\&.javac\&.Main\fR class provides two static methods to call the compiler from a program: +-.sp +-.nf +-\f3public static int compile(String[] args);\fP +-.fi +-.nf +-\f3public static int compile(String[] args, PrintWriter out);\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The \f3args\fR parameter represents any of the command-line arguments that would typically be passed to the compiler\&. ++To compile as though providing command\-line arguments, use the following syntax: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBJavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + .PP +-The \f3out\fR parameter indicates where the compiler diagnostic output is directed\&. ++The example writes diagnostics to the standard output stream and returns the exit code that ++\fBjavac\fR ++would give when called from the command line\&. + .PP +-The \f3return\fR value is equivalent to the \f3exit\fR value from \f3javac\fR\&. ++You can use other methods in the ++\fBjavax\&.tools\&.JavaCompiler\fR ++interface to handle diagnostics, control where files are read from and written to, and more\&. ++.SS "Old Interface" + .PP +-\fINote:\fR All other classes and methods found in a package with names that start with \f3com\&.sun\&.tools\&.javac\fR (subpackages of \f3com\&.sun\&.tools\&.javac\fR) are strictly internal and subject to change at any time\&. +-.SH EXAMPLES +-\f3Example 1 Compile a Simple Program\fR ++\fBNote:\fR ++This API is retained for backward compatibility only\&. All new code should use the newer Java Compiler API\&. + .PP +-This example shows how to compile the \f3Hello\&.java\fR source file in the greetings directory\&. The class defined in \f3Hello\&.java\fR is called \f3greetings\&.Hello\fR\&. The greetings directory is the package directory both for the source file and the class file and is underneath the current directory\&. This makes it possible to use the default user class path\&. It also makes it unnecessary to specify a separate destination directory with the \f3-d\fR option\&. ++The ++\fBcom\&.sun\&.tools\&.javac\&.Main\fR ++class provides two static methods to call the compiler from a program: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic static int compile(String[] args);\fR ++\fBpublic static int compile(String[] args, PrintWriter out);\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + .PP +-The source code in \f3Hello\&.java\fR: +-.sp +-.nf +-\f3package greetings;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3public class Hello {\fP +-.fi +-.nf +-\f3 public static void main(String[] args) {\fP +-.fi +-.nf +-\f3 for (int i=0; i < args\&.length; i++) {\fP +-.fi +-.nf +-\f3 System\&.out\&.println("Hello " + args[i]);\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp ++The ++\fBargs\fR ++parameter represents any of the command\-line arguments that would typically be passed to the compiler\&. ++.PP ++The ++\fBout\fR ++parameter indicates where the compiler diagnostic output is directed\&. ++.PP ++The ++\fBreturn\fR ++value is equivalent to the ++\fBexit\fR ++value from ++\fBjavac\fR\&. ++.PP ++\fBNote:\fR ++All other classes and methods found in a package with names that start with ++\fBcom\&.sun\&.tools\&.javac\fR ++(subpackages of ++\fBcom\&.sun\&.tools\&.javac\fR) are strictly internal and subject to change at any time\&. ++.SH "EXAMPLES" ++.PP ++\fBExample 1\fR ++.br ++Compile a Simple Program ++.RS 4 ++This example shows how to compile the ++\fBHello\&.java\fR ++source file in the greetings directory\&. The class defined in ++\fBHello\&.java\fR ++is called ++\fBgreetings\&.Hello\fR\&. The greetings directory is the package directory both for the source file and the class file and is underneath the current directory\&. This makes it possible to use the default user class path\&. It also makes it unnecessary to specify a separate destination directory with the ++\fB\-d\fR ++option\&. ++.sp ++The source code in ++\fBHello\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpackage greetings;\fR ++\fB \fR ++\fBpublic class Hello {\fR ++\fB public static void main(String[] args) {\fR ++\fB for (int i=0; i < args\&.length; i++) {\fR ++\fB System\&.out\&.println("Hello " + args[i]);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + Compile greetings\&.Hello: +-.sp +-.nf +-\f3javac greetings/Hello\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Run \f3greetings\&.Hello\fR: +-.sp +-.nf +-\f3java greetings\&.Hello World Universe Everyone\fP +-.fi +-.nf +-\f3Hello World\fP +-.fi +-.nf +-\f3Hello Universe\fP +-.fi +-.nf +-\f3Hello Everyone\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 2 Compile Multiple Source Files\fR ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac greetings/Hello\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Run ++\fBgreetings\&.Hello\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava greetings\&.Hello World Universe Everyone\fR ++\fBHello World\fR ++\fBHello Universe\fR ++\fBHello Everyone\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE + .PP +-This example compiles the \f3Aloha\&.java\fR, \f3GutenTag\&.java\fR, \f3Hello\&.java\fR, and \f3Hi\&.java\fR source files in the \f3greetings\fR package\&. +-.sp +-.nf +-\f3% javac greetings/*\&.java\fP +-.fi +-.nf +-\f3% ls greetings\fP +-.fi +-.nf +-\f3Aloha\&.class GutenTag\&.class Hello\&.class Hi\&.class\fP +-.fi +-.nf +-\f3Aloha\&.java GutenTag\&.java Hello\&.java Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 3 Specify a User Class Path\fR ++\fBExample 2\fR ++.br ++Compile Multiple Source Files ++.RS 4 ++This example compiles the ++\fBAloha\&.java\fR, ++\fBGutenTag\&.java\fR, ++\fBHello\&.java\fR, and ++\fBHi\&.java\fR ++source files in the ++\fBgreetings\fR ++package\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB% javac greetings/*\&.java\fR ++\fB% ls greetings\fR ++\fBAloha\&.class GutenTag\&.class Hello\&.class Hi\&.class\fR ++\fBAloha\&.java GutenTag\&.java Hello\&.java Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE + .PP ++\fBExample 3\fR ++.br ++Specify a User Class Path ++.RS 4 + After changing one of the source files in the previous example, recompile it: +-.sp +-.nf +-\f3pwd\fP +-.fi +-.nf +-\f3/examples\fP +-.fi +-.nf +-\f3javac greetings/Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Because \f3greetings\&.Hi\fR refers to other classes in the \f3greetings\fR package, the compiler needs to find these other classes\&. The previous example works because the default user class path is the directory that contains the package directory\&. If you want to recompile this file without concern for which directory you are in, then add the examples directory to the user class path by setting \f3CLASSPATH\fR\&. This example uses the \f3-classpath\fR option\&. +-.sp +-.nf +-\f3javac \-classpath /examples /examples/greetings/Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-If you change \f3greetings\&.Hi\fR to use a banner utility, then that utility also needs to be accessible through the user class path\&. +-.sp +-.nf +-\f3javac \-classpath /examples:/lib/Banners\&.jar \e\fP +-.fi +-.nf +-\f3 /examples/greetings/Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-To execute a class in the \f3greetings\fR package, the program needs access to the \f3greetings\fR package, and to the classes that the \f3greetings\fR classes use\&. +-.sp +-.nf +-\f3java \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 4 Separate Source Files and Class Files\fR ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpwd\fR ++\fB/examples\fR ++\fBjavac greetings/Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Because ++\fBgreetings\&.Hi\fR ++refers to other classes in the ++\fBgreetings\fR ++package, the compiler needs to find these other classes\&. The previous example works because the default user class path is the directory that contains the package directory\&. If you want to recompile this file without concern for which directory you are in, then add the examples directory to the user class path by setting ++\fBCLASSPATH\fR\&. This example uses the ++\fB\-classpath\fR ++option\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-classpath /examples /examples/greetings/Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you change ++\fBgreetings\&.Hi\fR ++to use a banner utility, then that utility also needs to be accessible through the user class path\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-classpath /examples:/lib/Banners\&.jar \e\fR ++\fB /examples/greetings/Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++To execute a class in the ++\fBgreetings\fR ++package, the program needs access to the ++\fBgreetings\fR ++package, and to the classes that the ++\fBgreetings\fR ++classes use\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE + .PP +-The following example uses \f3javac\fR to compile code that runs on JVM 1\&.6\&. +-.sp +-.nf +-\f3javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e \fP +-.fi +-.nf +-\f3\-extdirs "" OldCode\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The \f3-source 1\&.6\fR option specifies that release 1\&.6 (or 6) of the Java programming language be used to compile \f3OldCode\&.java\fR\&. The option \f3-target 1\&.6\fR option ensures that the generated class files are compatible with JVM 1\&.6\&. Note that in most cases, the value of the \f3-target\fR option is the value of the \f3-source\fR option; in this example, you can omit the \f3-target\fR option\&. ++\fBExample 4\fR ++.br ++Separate Source Files and Class Files ++.RS 4 ++The following example uses ++\fBjavac\fR ++to compile code that runs on JVM 1\&.7\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e \fR ++\fB\-extdirs "" OldCode\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The ++\fB\-source 1\&.7\fR ++option specifies that release 1\&.7 (or 7) of the Java programming language be used to compile ++\fBOldCode\&.java\fR\&. The option ++\fB\-target 1\&.7\fR ++option ensures that the generated class files are compatible with JVM 1\&.7\&. Note that in most cases, the value of the ++\fB\-target\fR ++option is the value of the ++\fB\-source\fR ++option; in this example, you can omit the ++\fB\-target\fR ++option\&. ++.sp ++You must specify the ++\fB\-bootclasspath\fR ++option to specify the correct version of the bootstrap classes (the ++\fBrt\&.jar\fR ++library)\&. If not, then the compiler generates a warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \fR ++\fB\-source 1\&.7\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules (in this example, it uses version 1\&.7 of the Java programming language) combined with the new bootstrap classes, which can result in class files that do not work on the older platform (in this case, Java SE 7) because reference to nonexistent methods can get included\&. ++.RE + .PP +-You must specify the \f3-bootclasspath\fR option to specify the correct version of the bootstrap classes (the \f3rt\&.jar\fR library)\&. If not, then the compiler generates a warning: +-.sp +-.nf +-\f3javac \-source 1\&.6 OldCode\&.java\fP +-.fi +-.nf +-\f3warning: [options] bootstrap class path not set in conjunction with \fP +-.fi +-.nf +-\f3\-source 1\&.6\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules (in this example, it uses version 1\&.6 of the Java programming language) combined with the new bootstrap classes, which can result in class files that do not work on the older platform (in this case, Java SE 6) because reference to nonexistent methods can get included\&. +-.PP +-\f3Example 5 Cross Compile\fR +-.PP +-This example uses \f3javac\fR to compile code that runs on JVM 1\&.6\&. +-.sp +-.nf +-\f3javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e\fP +-.fi +-.nf +-\f3 \-extdirs "" OldCode\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The\f3-source 1\&.6\fR option specifies that release 1\&.6 (or 6) of the Java programming language to be used to compile OldCode\&.java\&. The \f3-target 1\&.6\fR option ensures that the generated class files are compatible with JVM 1\&.6\&. In most cases, the value of the \f3-target\fR is the value of \f3-source\fR\&. In this example, the \f3-target\fR option is omitted\&. +-.PP +-You must specify the \f3-bootclasspath\fR option to specify the correct version of the bootstrap classes (the \f3rt\&.jar\fR library)\&. If not, then the compiler generates a warning: +-.sp +-.nf +-\f3javac \-source 1\&.6 OldCode\&.java\fP +-.fi +-.nf +-\f3warning: [options] bootstrap class path not set in conjunction with \-source 1\&.6\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules combined with the new bootstrap classes\&. This combination can result in class files that do not work on the older platform (in this case, Java SE 6) because reference to nonexistent methods can get included\&. In this example, the compiler uses release 1\&.6 of the Java programming language\&. +-.SH SEE\ ALSO +-.TP 0.2i +-\(bu ++\fBExample 5\fR ++.br ++Cross Compile ++.RS 4 ++This example uses ++\fBjavac\fR ++to compile code that runs on JVM 1\&.7\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e\fR ++\fB \-extdirs "" OldCode\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The\fB \-source 1\&.7\fR ++option specifies that release 1\&.7 (or 7) of the Java programming language to be used to compile OldCode\&.java\&. The ++\fB\-target 1\&.7\fR ++option ensures that the generated class files are compatible with JVM 1\&.7\&. In most cases, the value of the ++\fB\-target\fR ++is the value of ++\fB\-source\fR\&. In this example, the ++\fB\-target\fR ++option is omitted\&. ++.sp ++You must specify the ++\fB\-bootclasspath\fR ++option to specify the correct version of the bootstrap classes (the ++\fBrt\&.jar\fR ++library)\&. If not, then the compiler generates a warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \-source 1\&.7\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules combined with the new bootstrap classes\&. This combination can result in class files that do not work on the older platform (in this case, Java SE 7) because reference to nonexistent methods can get included\&. In this example, the compiler uses release 1\&.7 of the Java programming language\&. ++.RE ++.SH "SEE ALSO" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + java(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jdb(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javah(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javadoc(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jar(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jdb(1) +-.RE +-.br +-'pl 8.5i +-'bp ++.RE ++.br ++'pl 8.5i ++'bp +--- ./jdk/src/bsd/doc/man/javap.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/bsd/doc/man/javap.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,443 +1,392 @@ + '\" t +-.\" Copyright (c) 1994, 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. +-.\" +-.\" Arch: generic +-.\" Software: JDK 8 +-.\" Date: 21 November 2013 +-.\" SectDesc: Basic Tools +-.\" Title: javap.1 ++.\" Copyright (c) 1994, 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. ++.\" ++.\" Title: javap ++.\" Language: English ++.\" Date: 8 August 2014 ++.\" SectDesc: Basic Tools ++.\" Software: JDK 8 ++.\" Arch: generic ++.\" Part Number: E38207-03 + .\" + .if n .pl 99999 +-.TH javap 1 "21 November 2013" "JDK 8" "Basic Tools" +-.\" ----------------------------------------------------------------- +-.\" * Define some portability stuff +-.\" ----------------------------------------------------------------- +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.\" http://bugs.debian.org/507673 +-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" ----------------------------------------------------------------- +-.\" * set default formatting +-.\" ----------------------------------------------------------------- +-.\" disable hyphenation +-.nh +-.\" disable justification (adjust text to left margin only) +-.ad l +-.\" ----------------------------------------------------------------- +-.\" * MAIN CONTENT STARTS HERE * +-.\" ----------------------------------------------------------------- +- +-.SH NAME ++.TH "javap" "1" "8 August 2014" "JDK 8" "Basic Tools" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" + javap \- Disassembles one or more class files\&. +-.SH SYNOPSIS +-.sp +-.nf +- ++.SH "SYNOPSIS" ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjavap\fR [\fIoptions\fR] \fIclassfile\fR\&.\&.\&. +-.fi +-.sp +-.TP ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + \fIoptions\fR +-The command-line options\&. See Options\&. +-.TP ++.RS 4 ++The command\-line options\&. See Options\&. ++.RE ++.PP + \fIclassfile\fR +-One or more classes separated by spaces to be processed for annotations such as DocFooter\&.class\&. You can specify a class that can be found in the class path, by its file name or with a URL such as \f3file:///home/user/myproject/src/DocFooter\&.class\fR\&. +-.SH DESCRIPTION +-The \f3javap\fR command disassembles one or more class files\&. The output depends on the options used\&. When no options are used, then the \f3javap\fR command prints the package, protected and public fields, and methods of the classes passed to it\&. The \f3javap\fR command prints its output to \f3stdout\fR\&. +-.SH OPTIONS +-.TP +--help, --help, -? ++.RS 4 ++One or more classes separated by spaces to be processed for annotations such as DocFooter\&.class\&. You can specify a class that can be found in the class path, by its file name or with a URL such as ++\fBfile:///home/user/myproject/src/DocFooter\&.class\fR\&. ++.RE ++.SH "DESCRIPTION" ++.PP ++The ++\fBjavap\fR ++command disassembles one or more class files\&. The output depends on the options used\&. When no options are used, then the ++\fBjavap\fR ++command prints the package, protected and public fields, and methods of the classes passed to it\&. The ++\fBjavap\fR ++command prints its output to ++\fBstdout\fR\&. ++.SH "OPTIONS" ++.PP ++\-help + .br +-Prints a help message for the \f3javap\fR command\&. +-.TP +--version ++\-\-help + .br ++\-? ++.RS 4 ++Prints a help message for the ++\fBjavap\fR ++command\&. ++.RE ++.PP ++\-version ++.RS 4 + Prints release information\&. +-.TP +--l ++.RE ++.PP ++\-l ++.RS 4 ++Prints line and local variable tables\&. ++.RE ++.PP ++\-public ++.RS 4 ++Shows only public classes and members\&. ++.RE ++.PP ++\-protected ++.RS 4 ++Shows only protected and public classes and members\&. ++.RE ++.PP ++\-private + .br +-Prints line and local variable tables\&. +-.TP +--public ++\-p ++.RS 4 ++Shows all classes and members\&. ++.RE ++.PP ++\-J\fIoption\fR ++.RS 4 ++Passes the specified option to the JVM\&. For example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavap \-J\-version\fR ++\fBjavap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++For more information about JVM options, see the command documentation\&. ++.RE ++.PP ++\-s ++.RS 4 ++Prints internal type signatures\&. ++.RE ++.PP ++\-sysinfo ++.RS 4 ++Shows system information (path, size, date, MD5 hash) of the class being processed\&. ++.RE ++.PP ++\-constants ++.RS 4 ++Shows ++\fBstatic final\fR ++constants\&. ++.RE ++.PP ++\-c ++.RS 4 ++Prints disassembled code, for example, the instructions that comprise the Java bytecodes, for each of the methods in the class\&. ++.RE ++.PP ++\-verbose ++.RS 4 ++Prints stack size, number of locals and arguments for methods\&. ++.RE ++.PP ++\-classpath \fIpath\fR ++.RS 4 ++Specifies the path the ++\fBjavap\fR ++command uses to look up classes\&. Overrides the default or the ++\fBCLASSPATH\fR ++environment variable when it is set\&. ++.RE ++.PP ++\-bootclasspath \fIpath\fR ++.RS 4 ++Specifies the path from which to load bootstrap classes\&. By default, the bootstrap classes are the classes that implement the core Java platform located in ++\fBjre/lib/rt\&.jar\fR ++and several other JAR files\&. ++.RE ++.PP ++\-extdir \fIdirs\fR ++.RS 4 ++Overrides the location at which installed extensions are searched for\&. The default location for extensions is the value of ++\fBjava\&.ext\&.dirs\fR\&. ++.RE ++.SH "EXAMPLE" ++.PP ++Compile the following ++\fBDocFooter\fR ++class: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBimport java\&.awt\&.*;\fR ++\fBimport java\&.applet\&.*;\fR ++\fB \fR ++\fBpublic class DocFooter extends Applet {\fR ++\fB String date;\fR ++\fB String email;\fR ++\fB \fR ++\fB public void init() {\fR ++\fB resize(500,100);\fR ++\fB date = getParameter("LAST_UPDATED");\fR ++\fB email = getParameter("EMAIL");\fR ++\fB }\fR ++\fB \fR ++\fB public void paint(Graphics g) {\fR ++\fB g\&.drawString(date + " by ",100, 15);\fR ++\fB g\&.drawString(email,290,15);\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The output from the ++\fBjavap DocFooter\&.class\fR ++command yields the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++\fB public DocFooter();\fR ++\fB public void init();\fR ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The output from ++\fBjavap \-c DocFooter\&.class\fR ++command yields the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++ ++\fB public DocFooter();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: invokespecial #1 // Method\fR ++\fBjava/applet/Applet\&."":()V\fR ++\fB 4: return \fR ++ ++\fB public void init();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: sipush 500\fR ++\fB 4: bipush 100\fR ++\fB 6: invokevirtual #2 // Method resize:(II)V\fR ++\fB 9: aload_0 \fR ++\fB 10: aload_0 \fR ++\fB 11: ldc #3 // String LAST_UPDATED\fR ++\fB 13: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 16: putfield #5 // Field date:Ljava/lang/String;\fR ++\fB 19: aload_0 \fR ++\fB 20: aload_0 \fR ++\fB 21: ldc #6 // String EMAIL\fR ++\fB 23: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 26: putfield #7 // Field email:Ljava/lang/String;\fR ++\fB 29: return \fR ++ ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB Code:\fR ++\fB 0: aload_1 \fR ++\fB 1: new #8 // class java/lang/StringBuilder\fR ++\fB 4: dup \fR ++\fB 5: invokespecial #9 // Method\fR ++\fB java/lang/StringBuilder\&."":()V\fR ++\fB 8: aload_0 \fR ++\fB 9: getfield #5 // Field date:Ljava/lang/String;\fR ++\fB 12: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 15: ldc #11 // String by \fR ++\fB 17: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 20: invokevirtual #12 // Method\fR ++\fB java/lang/StringBuilder\&.toString:()Ljava/lang/String;\fR ++\fB 23: bipush 100\fR ++\fB 25: bipush 15\fR ++\fB 27: invokevirtual #13 // Method\fR ++\fB java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 30: aload_1 \fR ++\fB 31: aload_0 \fR ++\fB 32: getfield #7 // Field email:Ljava/lang/String;\fR ++\fB 35: sipush 290\fR ++\fB 38: bipush 15\fR ++\fB 40: invokevirtual #13 // Method\fR ++\fBjava/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 43: return \fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.SH "SEE ALSO" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++java(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javac(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javadoc(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javah(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++jdb(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++jdeps(1) ++.RE + .br +-Shows only public classes and members\&. +-.TP +--protected +-.br +-Shows only protected and public classes and members\&. +-.TP +--private, -p +-.br +-Shows all classes and members\&. +-.TP +--J\fIoption\fR +-.br +-Passes the specified option to the JVM\&. For example: +-.sp +-.nf +-\f3javap \-J\-version\fP +-.fi +-.nf +-\f3javap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-For more information about JVM options, see the \f3java(1)\fR command documentation\&. +-.TP +--s +-.br +-Prints internal type signatures\&. +-.TP +--sysinfo +-.br +-Shows system information (path, size, date, MD5 hash) of the class being processed\&. +-.TP +--constants +-.br +-Shows \f3static final\fR constants\&. +-.TP +--c +-.br +-Prints disassembled code, for example, the instructions that comprise the Java bytecodes, for each of the methods in the class\&. +-.TP +--verbose +-.br +-Prints stack size, number of locals and arguments for methods\&. +-.TP +--classpath \fIpath\fR +-.br +-Specifies the path the \f3javap\fR command uses to look up classes\&. Overrides the default or the \f3CLASSPATH\fR environment variable when it is set\&. +-.TP +--bootclasspath \fIpath\fR +-.br +-Specifies the path from which to load bootstrap classes\&. By default, the bootstrap classes are the classes that implement the core Java platform located in \f3jre/lib/rt\&.jar\fR and several other JAR files\&. +-.TP +--extdir \fIdirs\fR +-.br +-Overrides the location at which installed extensions are searched for\&. The default location for extensions is the value of \f3java\&.ext\&.dirs\fR\&. +-.SH EXAMPLE +-Compile the following \f3DocFooter\fR class: +-.sp +-.nf +-\f3import java\&.awt\&.*;\fP +-.fi +-.nf +-\f3import java\&.applet\&.*;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3public class DocFooter extends Applet {\fP +-.fi +-.nf +-\f3 String date;\fP +-.fi +-.nf +-\f3 String email;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void init() {\fP +-.fi +-.nf +-\f3 resize(500,100);\fP +-.fi +-.nf +-\f3 date = getParameter("LAST_UPDATED");\fP +-.fi +-.nf +-\f3 email = getParameter("EMAIL");\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void paint(Graphics g) {\fP +-.fi +-.nf +-\f3 g\&.drawString(date + " by ",100, 15);\fP +-.fi +-.nf +-\f3 g\&.drawString(email,290,15);\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The output from the \f3javap DocFooter\&.class\fR command yields the following: +-.sp +-.nf +-\f3Compiled from "DocFooter\&.java"\fP +-.fi +-.nf +-\f3public class DocFooter extends java\&.applet\&.Applet {\fP +-.fi +-.nf +-\f3 java\&.lang\&.String date;\fP +-.fi +-.nf +-\f3 java\&.lang\&.String email;\fP +-.fi +-.nf +-\f3 public DocFooter();\fP +-.fi +-.nf +-\f3 public void init();\fP +-.fi +-.nf +-\f3 public void paint(java\&.awt\&.Graphics);\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The output from \f3javap -c DocFooter\&.class\fR command yields the following: +-.sp +-.nf +-\f3Compiled from "DocFooter\&.java"\fP +-.fi +-.nf +-\f3public class DocFooter extends java\&.applet\&.Applet {\fP +-.fi +-.nf +-\f3 java\&.lang\&.String date;\fP +-.fi +-.nf +-\f3 java\&.lang\&.String email;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public DocFooter();\fP +-.fi +-.nf +-\f3 Code:\fP +-.fi +-.nf +-\f3 0: aload_0 \fP +-.fi +-.nf +-\f3 1: invokespecial #1 // Method\fP +-.fi +-.nf +-\f3java/applet/Applet\&."":()V\fP +-.fi +-.nf +-\f3 4: return \fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void init();\fP +-.fi +-.nf +-\f3 Code:\fP +-.fi +-.nf +-\f3 0: aload_0 \fP +-.fi +-.nf +-\f3 1: sipush 500\fP +-.fi +-.nf +-\f3 4: bipush 100\fP +-.fi +-.nf +-\f3 6: invokevirtual #2 // Method resize:(II)V\fP +-.fi +-.nf +-\f3 9: aload_0 \fP +-.fi +-.nf +-\f3 10: aload_0 \fP +-.fi +-.nf +-\f3 11: ldc #3 // String LAST_UPDATED\fP +-.fi +-.nf +-\f3 13: invokevirtual #4 // Method\fP +-.fi +-.nf +-\f3 getParameter:(Ljava/lang/String;)Ljava/lang/String;\fP +-.fi +-.nf +-\f3 16: putfield #5 // Field date:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 19: aload_0 \fP +-.fi +-.nf +-\f3 20: aload_0 \fP +-.fi +-.nf +-\f3 21: ldc #6 // String EMAIL\fP +-.fi +-.nf +-\f3 23: invokevirtual #4 // Method\fP +-.fi +-.nf +-\f3 getParameter:(Ljava/lang/String;)Ljava/lang/String;\fP +-.fi +-.nf +-\f3 26: putfield #7 // Field email:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 29: return \fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void paint(java\&.awt\&.Graphics);\fP +-.fi +-.nf +-\f3 Code:\fP +-.fi +-.nf +-\f3 0: aload_1 \fP +-.fi +-.nf +-\f3 1: new #8 // class java/lang/StringBuilder\fP +-.fi +-.nf +-\f3 4: dup \fP +-.fi +-.nf +-\f3 5: invokespecial #9 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&."":()V\fP +-.fi +-.nf +-\f3 8: aload_0 \fP +-.fi +-.nf +-\f3 9: getfield #5 // Field date:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 12: invokevirtual #10 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fP +-.fi +-.nf +-\f3 15: ldc #11 // String by \fP +-.fi +-.nf +-\f3 17: invokevirtual #10 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fP +-.fi +-.nf +-\f3 20: invokevirtual #12 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&.toString:()Ljava/lang/String;\fP +-.fi +-.nf +-\f3 23: bipush 100\fP +-.fi +-.nf +-\f3 25: bipush 15\fP +-.fi +-.nf +-\f3 27: invokevirtual #13 // Method\fP +-.fi +-.nf +-\f3 java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fP +-.fi +-.nf +-\f3 30: aload_1 \fP +-.fi +-.nf +-\f3 31: aload_0 \fP +-.fi +-.nf +-\f3 32: getfield #7 // Field email:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 35: sipush 290\fP +-.fi +-.nf +-\f3 38: bipush 15\fP +-.fi +-.nf +-\f3 40: invokevirtual #13 // Method\fP +-.fi +-.nf +-\f3java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fP +-.fi +-.nf +-\f3 43: return \fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-.SH SEE\ ALSO +-.TP 0.2i +-\(bu +-javac(1) +-.TP 0.2i +-\(bu +-java(1) +-.TP 0.2i +-\(bu +-jdb(1) +-.TP 0.2i +-\(bu +-javah(1) +-.TP 0.2i +-\(bu +-javadoc(1) +-.RE +-.br +-'pl 8.5i +-'bp ++'pl 8.5i ++'bp +--- ./jdk/src/linux/doc/man/ja/appletviewer.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/appletviewer.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: appletviewer +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: appletviewer ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "appletviewer" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + appletviewer \- Web¥Ö¥é¥¦¥¶¤Î³°Â¦¤Ç¥¢¥×¥ì¥Ã¥È¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIappletviewer\fR [\fIoptions\fR] \fIurl\fR\&.\&.\&. ++\fBappletviewer\fR [\fIoptions\fR] \fIurl\fR\&.\&.\&. + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIurl\fR +@@ -73,20 +75,20 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ï\fIurls\fR¤Ë»ØÄꤵ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¢¤ë¤¤¤Ï¥ê¥½¡¼¥¹¤ÈÀܳ¤·¤Æ¡¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤¬»²¾È¤¹¤ë¤½¤ì¤¾¤ì¤Î¥¢¥×¥ì¥Ã¥È¤òÆȼ«¤Î¥¦¥£¥ó¥É¥¦¤Çɽ¼¨¤·¤Þ¤¹¡£urls¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¬¡¢\fIOBJECT\fR¡¢\fIEMBED\fR¤Þ¤¿¤Ï\fIAPPLET\fR¥¿¥°¤Ç¤É¤Î¥¢¥×¥ì¥Ã¥È¤â»²¾È¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ï²¿¤â¹Ô¤¤¤Þ¤»¤ó¡£\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëHTML¥¿¥°¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/appletviewertags\&.html¤Ë¤¢¤ë ++\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ï\fIurls\fR¤Ë»ØÄꤵ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¢¤ë¤¤¤Ï¥ê¥½¡¼¥¹¤ÈÀܳ¤·¤Æ¡¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤¬»²¾È¤¹¤ë¤½¤ì¤¾¤ì¤Î¥¢¥×¥ì¥Ã¥È¤òÆȼ«¤Î¥¦¥£¥ó¥É¥¦¤Çɽ¼¨¤·¤Þ¤¹¡£urls¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¬¡¢\fBOBJECT\fR¡¢\fBEMBED\fR¤Þ¤¿¤Ï\fBAPPLET\fR¥¿¥°¤Ç¤É¤Î¥¢¥×¥ì¥Ã¥È¤â»²¾È¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ï²¿¤â¹Ô¤¤¤Þ¤»¤ó¡£\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëHTML¥¿¥°¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/appletviewertags\&.html¤Ë¤¢¤ë + ¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¡¦¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ï¡¢RFC2396¤ÇÄêµÁ¤µ¤ì¤¿¥¨¥¹¥±¡¼¥×¡¦¥á¥«¥Ë¥º¥à¤Ë½¾¤Ã¤Æ¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿URL¤òɬÍפȤ·¤Þ¤¹¡£¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤Î¤Ï¡¢¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿URL¤Î¤ß¤Ç¤¹¡£¤¿¤À¤·¡¢¥Õ¥¡¥¤¥ë̾¤Ë¤Ä¤¤¤Æ¤Ï¡¢RFC2396¤Î»ÅÍͤ˽¾¤Ã¤Æ¥¨¥ó¥³¡¼¥É¤ò²ò½ü¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ï¡¢RFC2396¤ÇÄêµÁ¤µ¤ì¤¿¥¨¥¹¥±¡¼¥×¡¦¥á¥«¥Ë¥º¥à¤Ë½¾¤Ã¤Æ¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿URL¤òɬÍפȤ·¤Þ¤¹¡£¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤Î¤Ï¡¢¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿URL¤Î¤ß¤Ç¤¹¡£¤¿¤À¤·¡¢¥Õ¥¡¥¤¥ë̾¤Ë¤Ä¤¤¤Æ¤Ï¡¢RFC2396¤Î»ÅÍͤ˽¾¤Ã¤Æ¥¨¥ó¥³¡¼¥É¤ò²ò½ü¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR + The +-\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ï³«È¯ÀìÍѤǤ¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/samples/aboutCodeSamples\&.html¤Ë¤¢¤ë ++\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ï³«È¯ÀìÍѤǤ¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/samples/aboutCodeSamples\&.html¤Ë¤¢¤ë + ¥µ¥ó¥×¥ë/¥Æ¥¹¥È¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ª¤è¤Ó¥³¡¼¥É¤Ë¤Ä¤¤¤Æ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-debug + .RS 4 +-\fIjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJava¥Ç¥Ð¥Ã¥¬¤Ç¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¤ò³«»Ï¤·¤Æ¡¢¥É¥­¥å¥á¥ó¥ÈÃæ¤Î¥¢¥×¥ì¥Ã¥È¤ò¥Ç¥Ð¥Ã¥°¤·¤Þ¤¹¡£ ++\fBjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJava¥Ç¥Ð¥Ã¥¬¤Ç¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¤ò³«»Ï¤·¤Æ¡¢¥É¥­¥å¥á¥ó¥ÈÃæ¤Î¥¢¥×¥ì¥Ã¥È¤ò¥Ç¥Ð¥Ã¥°¤·¤Þ¤¹¡£ + .RE + .PP + \-encoding \fIencoding\-name\fR +@@ -96,7 +98,7 @@ + .PP + \-J\fIjavaoption\fR + .RS 4 +-ʸ»úÎó\fIjavaoption\fR¤Ï¡¢¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¤ò¼Â¹Ô¤¹¤ëJava¥¤¥ó¥¿¥×¥ê¥¿¤Ë1¤Ä¤Î°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤Þ¤¹¡£°ú¿ô¤Ë¥¹¥Ú¡¼¥¹¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£Ê£¿ô¤Î°ú¿ô¤Ï¡¢¤¹¤Ù¤Æ¤¬ÀÜƬ¼­\fI\-J\fR¤Ç»Ï¤Þ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤÎÄ´À°¤ËÍ­¸ú¤Ç¤¹¡£ ++ʸ»úÎó\fBjavaoption\fR¤Ï¡¢¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¤ò¼Â¹Ô¤¹¤ëJava¥¤¥ó¥¿¥×¥ê¥¿¤Ë1¤Ä¤Î°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤Þ¤¹¡£°ú¿ô¤Ë¥¹¥Ú¡¼¥¹¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£Ê£¿ô¤Î°ú¿ô¤Ï¡¢¤¹¤Ù¤Æ¤¬ÀÜƬ¼­\fB\-J\fR¤Ç»Ï¤Þ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤÎÄ´À°¤ËÍ­¸ú¤Ç¤¹¡£ + .RE + .PP + +--- ./jdk/src/linux/doc/man/ja/extcheck.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/extcheck.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: extcheck +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: extcheck ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "extcheck" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + extcheck \- ¥¿¡¼¥²¥Ã¥È¤ÎJava¥¢¡¼¥«¥¤¥Ö(JAR)¥Õ¥¡¥¤¥ë¤È¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë³ÈÄ¥µ¡Ç½¤ÎJAR¥Õ¥¡¥¤¥ë´Ö¤Î¥Ð¡¼¥¸¥ç¥ó¤Î¶¥¹ç¤ò¸¡½Ð¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIextcheck\fR [\fIoptions\fR] \fItargetfile\&.jar\fR ++\fBextcheck\fR [\fIoptions\fR] \fItargetfile\&.jar\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fItargetfile\&.jar\fR +@@ -73,13 +75,13 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Î¥¿¥¤¥È¥ë¤ª¤è¤Ó¥Ð¡¼¥¸¥ç¥ó¤¬Java SE SDK¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë³ÈÄ¥µ¡Ç½¤È¶¥¹ç¤·¤Æ¤¤¤Ê¤¤¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¤ò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ëÁ°¤Ë¡¢¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ·¤Æ¡¢Æ±¤¸¥Ð¡¼¥¸¥ç¥ó¤Þ¤¿¤Ï¤è¤ê¿·¤·¤¤¥Ð¡¼¥¸¥ç¥ó¤Î³ÈÄ¥µ¡Ç½¤¬¤¹¤Ç¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Î¥¿¥¤¥È¥ë¤ª¤è¤Ó¥Ð¡¼¥¸¥ç¥ó¤¬Java SE SDK¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë³ÈÄ¥µ¡Ç½¤È¶¥¹ç¤·¤Æ¤¤¤Ê¤¤¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¤ò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ëÁ°¤Ë¡¢¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ·¤Æ¡¢Æ±¤¸¥Ð¡¼¥¸¥ç¥ó¤Þ¤¿¤Ï¤è¤ê¿·¤·¤¤¥Ð¡¼¥¸¥ç¥ó¤Î³ÈÄ¥µ¡Ç½¤¬¤¹¤Ç¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢\fItargetfile\&.jar\fR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î¥Ø¥Ã¥À¡¼Specification\-title¤ª¤è¤ÓSpecification\-version¤ò¡¢³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥Ø¥Ã¥À¡¼¤ÈÈæ³Ó¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢Oracle Solaris¤Î¾ì¹ç¤Ï\fIjre/lib/ext\fR¡¢Windows¤Î¾ì¹ç¤Ï\fI\ejre\elib\eext\fR¤Ç¤¹¡£\fIextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjava\&.lang\&.Package\&.isCompatibleWith\fR¥á¥½¥Ã¥É¤ÈƱÍͤÎÊýË¡¤Ç¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òÈæ³Ó¤·¤Þ¤¹¡£ ++\fBextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBtargetfile\&.jar\fR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î¥Ø¥Ã¥À¡¼Specification\-title¤ª¤è¤ÓSpecification\-version¤ò¡¢³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥Ø¥Ã¥À¡¼¤ÈÈæ³Ó¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢Oracle Solaris¤Î¾ì¹ç¤Ï\fBjre/lib/ext\fR¡¢Windows¤Î¾ì¹ç¤Ï\fB\ejre\elib\eext\fR¤Ç¤¹¡£\fBextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBjava\&.lang\&.Package\&.isCompatibleWith\fR¥á¥½¥Ã¥É¤ÈƱÍͤÎÊýË¡¤Ç¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òÈæ³Ó¤·¤Þ¤¹¡£ + .PP + ¶¥¹ç¤¬¸¡½Ð¤µ¤ì¤Ê¤¤¾ì¹ç¡¢¥ê¥¿¡¼¥ó¡¦¥³¡¼¥É¤Ï0¤Ç¤¹¡£ + .PP +-³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¤¤º¤ì¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¡¢Æ±°ì¤Î\fISpecification\-title\fR¡¢¤ª¤è¤ÓƱ°ì¤Þ¤¿¤Ï¤è¤ê¿·¤·¤¤\fISpecification\-version\fRÈֹ椬¤¢¤ë¾ì¹ç¤Ï¡¢¥¼¥í¤Ç¤Ê¤¤¥¨¥é¡¼¡¦¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£\fItargetfile\&.jar\fR¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë\fISpecification\-title\fR¤Þ¤¿¤Ï\fISpecification\-version\fR°À­¤¬¤Ê¤¤¾ì¹ç¤â¡¢¥¼¥í¤Ç¤Ê¤¤¥¨¥é¡¼¡¦¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£ ++³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¤¤º¤ì¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¡¢Æ±°ì¤Î\fBSpecification\-title\fR¡¢¤ª¤è¤ÓƱ°ì¤Þ¤¿¤Ï¤è¤ê¿·¤·¤¤\fBSpecification\-version\fRÈֹ椬¤¢¤ë¾ì¹ç¤Ï¡¢¥¼¥í¤Ç¤Ê¤¤¥¨¥é¡¼¡¦¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£\fBtargetfile\&.jar\fR¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë\fBSpecification\-title\fR¤Þ¤¿¤Ï\fBSpecification\-version\fR°À­¤¬¤Ê¤¤¾ì¹ç¤â¡¢¥¼¥í¤Ç¤Ê¤¤¥¨¥é¡¼¡¦¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-verbose +@@ -89,7 +91,7 @@ + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine (JVM)¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/idlj.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/idlj.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: idlj +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: idlj ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "idlj" "1" "2013ǯ11·î21Æü" "JDK 8" "Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + idlj \- »ØÄꤵ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹ÄêµÁ¸À¸ì(IDL)¥Õ¥¡¥¤¥ë¤ËÂФ·¤ÆJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIidlj\fR [ \fIoptions\fR ] \fIidlfile\fR ++\fBidlj\fR [ \fIoptions\fR ] \fIidlfile\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£options¤Î½çÈÖ¤ÏǤ°Õ¤Ç¤¹¤¬¡¢\fIidlfile\fR¤è¤ê¤âÁ°¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£options¤Î½çÈÖ¤ÏǤ°Õ¤Ç¤¹¤¬¡¢\fBidlfile\fR¤è¤ê¤âÁ°¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \fIidlfile\fR +@@ -76,16 +78,17 @@ + IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Ï¡¢»ØÄꤵ¤ì¤¿IDL¥Õ¥¡¥¤¥ë¤ËÂФ·¤ÆJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/mapping/jidlMapping\&.html¤Ë¤¢¤ë + Java IDL: Java¸À¸ì¥Þ¥Ã¥Ô¥ó¥°¤Ø¤ÎIDL¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Î°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤ÎÃæ¤Ë¤Ï¡¢\fIidltojava\fR¤È¤¤¤¦Ì¾Á°¤À¤Ã¤¿¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£ ++IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Î°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤ÎÃæ¤Ë¤Ï¡¢\fBidltojava\fR¤È¤¤¤¦Ì¾Á°¤À¤Ã¤¿¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£ + .SS "¥¯¥é¥¤¥¢¥ó¥È¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ª¤è¤Ó¥µ¡¼¥Ð¡¼¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Îȯ¹Ô" + .PP +-¼¡¤Î\fIidlj\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò´Þ¤à\fIMy\&.idl\fR¤È¤¤¤¦Ì¾Á°¤ÎIDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ ++¼¡¤Î\fBidlj\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò´Þ¤à\fBMy\&.idl\fR¤È¤¤¤¦Ì¾Á°¤ÎIDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj My\&.idl ++\fBidlj My\&.idl\fR ++ + .fi + .if n \{\ + .RE +@@ -97,7 +100,8 @@ + .RS 4 + .\} + .nf +-idlj \-fclient My\&.idl ++\fBidlj \-fclient My\&.idl\fR ++ + .fi + .if n \{\ + .RE +@@ -109,7 +113,8 @@ + .RS 4 + .\} + .nf +-idlg \-fserver My\&.idl ++\fBidlg \-fserver My\&.idl\fR ++ + .fi + .if n \{\ + .RE +@@ -121,102 +126,78 @@ + .RS 4 + .\} + .nf +-idlj \-fclient \-fserver My\&.idl +-idlj \-fall My\&.idl ++\fBidlj \-fclient \-fserver My\&.idl\fR ++\fBidlj \-fall My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP + ¥µ¡¼¥Ð¡¼Â¦¤Ç²Äǽ¤Ê¥â¥Ç¥ë¤Ï2¤Ä¤¢¤ê¤Þ¤¹¡£°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë¤ÈTie¥â¥Ç¥ë¤Ç¤¹¡£Tie°Ñ¾ù¥â¥Ç¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.if n \{\ +-.sp +-.\} +-.RS 4 +-.it 1 an-trap +-.nr an-no-space-flag 1 +-.nr an-break-flag 1 +-.br +-.ps +1 +-\fB°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë\fR +-.ps -1 +-.br + .PP +-¥Ç¥Õ¥©¥ë¥È¤Î¥µ¡¼¥Ð¡¼Â¦¤Î¥â¥Ç¥ë¤Ï¡¢°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë¤Ç¤¹¡£\fIMy\&.idl\fRÆâ¤Ç\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fIMyPOA\&.java\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¡¢\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fIMyPOA\fR¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIMyPOA\&.java\fR¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/api/org/omg/PortableServer/Servant\&.html¤Ë¤¢¤ë +-\fIorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤ò³ÈÄ¥¤¹¤ë¥¹¥È¥ê¡¼¥à¥Ù¡¼¥¹¤Î¥¹¥±¥ë¥È¥ó¤Ç¤¹¡£ ++\fB°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë\fR. ¥Ç¥Õ¥©¥ë¥È¤Î¥µ¡¼¥Ð¡¼Â¦¤Î¥â¥Ç¥ë¤Ï¡¢°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë¤Ç¤¹¡£\fBMy\&.idl\fRÆâ¤Ç\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fBMyPOA\&.java\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¡¢\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fBMyPOA\fR¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBMyPOA\&.java\fR¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/api/org/omg/PortableServer/Servant\&.html¤Ë¤¢¤ë ++\fBorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤ò³ÈÄ¥¤¹¤ë¥¹¥È¥ê¡¼¥à¥Ù¡¼¥¹¤Î¥¹¥±¥ë¥È¥ó¤Ç¤¹¡£ + .PP +-\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢¥¹¥±¥ë¥È¥ó¤¬¼ÂÁõ¤¹¤ëIDL¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë\fIcallHandler\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÈÁàºî¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤Þ¤¹¡£ ++\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢¥¹¥±¥ë¥È¥ó¤¬¼ÂÁõ¤¹¤ëIDL¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë\fBcallHandler\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÈÁàºî¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤Þ¤¹¡£ + .PP +-¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤Î\fIPortableServer\fR¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¤Î\fIServant\fR·¿¤òÄêµÁ¤·¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/POA\&.html¤Ë¤¢¤ë ++¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤Î\fBPortableServer\fR¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¤Î\fBServant\fR·¿¤òÄêµÁ¤·¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/POA\&.html¤Ë¤¢¤ë + ¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢\fIServant\fR·¿¤ÏJava¤Î\fIorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤Ë¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤ÎPOA¥µ¡¼¥Ð¥ó¥È¼ÂÁõ¤Î¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤È¤·¤Æµ¡Ç½¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¸Æ¤Ó½Ð¤¹¤³¤È¤Î¤Ç¤­¤ë¤¤¤¯¤Ä¤«¤Î¥á¥½¥Ã¥É¡¢¤ª¤è¤ÓPOA¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¡¢¥µ¡¼¥Ð¥ó¥È¤ÎÆ°ºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë¥æ¡¼¥¶¡¼¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤ë¥á¥½¥Ã¥É¤òÄ󶡤·¤Þ¤¹¡£ ++Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢\fBServant\fR·¿¤ÏJava¤Î\fBorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤Ë¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤ÎPOA¥µ¡¼¥Ð¥ó¥È¼ÂÁõ¤Î¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤È¤·¤Æµ¡Ç½¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¸Æ¤Ó½Ð¤¹¤³¤È¤Î¤Ç¤­¤ë¤¤¤¯¤Ä¤«¤Î¥á¥½¥Ã¥É¡¢¤ª¤è¤ÓPOA¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¡¢¥µ¡¼¥Ð¥ó¥È¤ÎÆ°ºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë¥æ¡¼¥¶¡¼¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤ë¥á¥½¥Ã¥É¤òÄ󶡤·¤Þ¤¹¡£ + .PP +-·Ñ¾µ¥â¥Ç¥ë¤Î¤â¤¦1¤Ä¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-oldImplBase\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤Æ¡¢Java SE 1\&.4¤è¤êÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¸ß´¹À­¤Î¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤¹¤ë¤³¤È¤Ç¤¹¡£\-\fIoldImplBase\fR¥Õ¥é¥°¤ÏÈóɸ½à¤Ç¡¢¤³¤ì¤é¤ÎAPI¤ÏÈó¿ä¾©¤Ç¤¹¡£¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤Î¤Ï¡¢Java SE 1\&.3¤Çµ­½Ò¤µ¤ì¤¿´û¸¤Î¥µ¡¼¥Ð¡¼¤È¤Î¸ß´¹À­¤¬É¬Íפʾì¹ç¤Î¤ß¤Ç¤¹¡£¤½¤Î¾ì¹ç¡¢´û¸¤Îmake¥Õ¥¡¥¤¥ë¤òÊѹ¹¤·¤Æ¡¢\fI\-oldImplBase\fR¥Õ¥é¥°¤ò\fIidlj\fR¥³¥ó¥Ñ¥¤¥é¤ËÄɲ乤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢POA¥Ù¡¼¥¹¤Î¥µ¡¼¥Ð¡¼Â¦¥Þ¥Ã¥Ô¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£²¼°Ì¸ß´¹À­¤Î¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¼Â¹Ô¤·¤Þ¤¹¡£ +-.sp .5v +-.RE ++·Ñ¾µ¥â¥Ç¥ë¤Î¤â¤¦1¤Ä¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-oldImplBase\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤Æ¡¢Java SE 1\&.4¤è¤êÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¸ß´¹À­¤Î¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤¹¤ë¤³¤È¤Ç¤¹¡£\-\fBoldImplBase\fR¥Õ¥é¥°¤ÏÈóɸ½à¤Ç¡¢¤³¤ì¤é¤ÎAPI¤ÏÈó¿ä¾©¤Ç¤¹¡£¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤Î¤Ï¡¢Java SE 1\&.3¤Çµ­½Ò¤µ¤ì¤¿´û¸¤Î¥µ¡¼¥Ð¡¼¤È¤Î¸ß´¹À­¤¬É¬Íפʾì¹ç¤Î¤ß¤Ç¤¹¡£¤½¤Î¾ì¹ç¡¢´û¸¤Îmake¥Õ¥¡¥¤¥ë¤òÊѹ¹¤·¤Æ¡¢\fB\-oldImplBase\fR¥Õ¥é¥°¤ò\fBidlj\fR¥³¥ó¥Ñ¥¤¥é¤ËÄɲ乤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢POA¥Ù¡¼¥¹¤Î¥µ¡¼¥Ð¡¼Â¦¥Þ¥Ã¥Ô¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¸åÊý¸ß´¹À­¤Î¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-fclient \-fserver \-oldImplBase My\&.idl +-idlj \-fall \-oldImplBase My\&.idl ++\fBidlj \-fclient \-fserver \-oldImplBase My\&.idl\fR ++\fBidlj \-fall \-oldImplBase My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIMy\&.idl\fRÆâ¤Ç\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fI_MyImplBase\&.java\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¡¢\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fI_MyImplBase\fR¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.if n \{\ +-.sp +-.\} +-.RS 4 +-.it 1 an-trap +-.nr an-no-space-flag 1 +-.nr an-break-flag 1 +-.br +-.ps +1 +-\fBTie°Ñ¾ù¥â¥Ç¥ë\fR +-.ps -1 +-.br ++\fBMy\&.idl\fRÆâ¤Ç\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fB_MyImplBase\&.java\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¡¢\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fB_MyImplBase\fR¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¤â¤¦1¤Ä¤Î¥µ¡¼¥Ð¡¼Â¦¥â¥Ç¥ë¤Ï¡¢Tie¥â¥Ç¥ë¤È¸Æ¤Ð¤ì¤ë¤â¤Î¤Ç¤¹¡£¤³¤Î¥µ¡¼¥Ð¡¼Â¦¥â¥Ç¥ë¤Ï¡¢°Ñ¾ù¥â¥Ç¥ë¤Ç¤¹¡£Tie¤È¥¹¥±¥ë¥È¥ó¤òƱ»þ¤ËÀ¸À®¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤¿¤á¡¢¤½¤ì¤é¤ÏÊÌ¡¹¤ËÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢Tie¥â¥Ç¥ëÍѤΥХ¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ +-.sp .5v +-.RE ++\fBTie°Ñ¾ù¥â¥Ç¥ë\fR. ¤â¤¦1¤Ä¤Î¥µ¡¼¥Ð¡¼Â¦¥â¥Ç¥ë¤Ï¡¢Tie¥â¥Ç¥ë¤È¸Æ¤Ð¤ì¤ë¤â¤Î¤Ç¤¹¡£¤³¤Î¥µ¡¼¥Ð¡¼Â¦¥â¥Ç¥ë¤Ï¡¢°Ñ¾ù¥â¥Ç¥ë¤Ç¤¹¡£Tie¤È¥¹¥±¥ë¥È¥ó¤òƱ»þ¤ËÀ¸À®¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤¿¤á¡¢¤½¤ì¤é¤ÏÊÌ¡¹¤ËÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢Tie¥â¥Ç¥ëÍѤΥХ¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-fall My\&.idl +-idlj \-fallTIE My\&.idl ++\fBidlj \-fall My\&.idl\fR ++\fBidlj \-fallTIE My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢2ÈÖÌܤΥ³¥Þ¥ó¥É¤Ë¤è¤ê¡¢\fIMyPOATie\&.java\fR¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fIMyPOATie\fR¥¯¥é¥¹¤Ø¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢delegate¤ò¼è¤ê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎPOA¥â¥Ç¥ë¤ò»ÈÍѤ·¤Æ¤¤¤ë¤¿¤á¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Ë¤âPOA¤¬É¬ÍפǤ¹¡£delegate¤ËÂФ·¤Æ¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤³¤Î¼ÂÁõ¤Ï\fIMyOperations\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ë¤Î¤ß¤Ç¡¢¤½¤Î¾¤Î¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤òORB¤È°ì½ï¤Ë»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¼¡¤Î¤è¤¦¤Ë\fIMyPOATie\fR¥¯¥é¥¹Æâ¤Ç¼ÂÁõ¤ò¥é¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢2ÈÖÌܤΥ³¥Þ¥ó¥É¤Ë¤è¤ê¡¢\fBMyPOATie\&.java\fR¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fBMyPOATie\fR¥¯¥é¥¹¤Ø¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢delegate¤ò¼è¤ê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎPOA¥â¥Ç¥ë¤ò»ÈÍѤ·¤Æ¤¤¤ë¤¿¤á¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Ë¤âPOA¤¬É¬ÍפǤ¹¡£delegate¤ËÂФ·¤Æ¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤³¤Î¼ÂÁõ¤Ï\fBMyOperations\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ë¤Î¤ß¤Ç¡¢¤½¤Î¾¤Î¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤òORB¤È°ì½ï¤Ë»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¼¡¤Î¤è¤¦¤Ë\fBMyPOATie\fR¥¯¥é¥¹Æâ¤Ç¼ÂÁõ¤ò¥é¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-ORB orb = ORB\&.init(args, System\&.getProperties()); ++\fBORB orb = ORB\&.init(args, System\&.getProperties());\fR ++\fB \fR ++\fB// Get reference to rootpoa & activate the POAManager\fR ++\fBPOA rootpoa = (POA)orb\&.resolve_initial_references("RootPOA");\fR ++\fBrootpoa\&.the_POAManager()\&.activate();\fR ++\fB \fR ++\fB// create servant and register it with the ORB\fR ++\fBMyServant myDelegate = new MyServant();\fR ++\fBmyDelegate\&.setORB(orb); \fR ++\fB \fR ++\fB// create a tie, with servant being the delegate\&.\fR ++\fBMyPOATie tie = new MyPOATie(myDelegate, rootpoa);\fR ++\fB \fR ++\fB// obtain the objectRef for the tie\fR ++\fBMy ref = tie\&._this(orb);\fR + +-// Get reference to rootpoa & activate the POAManager +-POA rootpoa = (POA)orb\&.resolve_initial_references("RootPOA"); +-rootpoa\&.the_POAManager()\&.activate(); +- +-// create servant and register it with the ORB +-MyServant myDelegate = new MyServant(); +-myDelegate\&.setORB(orb); +- +-// create a tie, with servant being the delegate\&. +-MyPOATie tie = new MyPOATie(myDelegate, rootpoa); +- +-// obtain the objectRef for the tie +-My ref = tie\&._this(orb); + .fi + .if n \{\ + .RE +@@ -230,146 +211,154 @@ + .RS 4 + .\} + .nf +-idlj \-oldImplBase \-fall My\&.idl +-idlj \-oldImplBase \-fallTIE My\&.idl ++\fBidlj \-oldImplBase \-fall My\&.idl\fR ++\fBidlj \-oldImplBase \-fallTIE My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢¤³¤ì¤Ë¤è¤ê¡¢\fIMy_Tie\&.java\fR¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fIMy_Tie\fR¥¯¥é¥¹¤Ø¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢\fIimpl\fR¥ª¥Ö¥¸¥§¥¯¥È¤ò¼è¤ê¤Þ¤¹¡£\fIimpl\fR¤ËÂФ·¤Æ¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤Î¼ÂÁõ¤Ï\fIHelloOperations\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ë¤Î¤ß¤Ç¡¢¤½¤Î¾¤Î¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤·¤«¤·¡¢¤³¤ì¤òORB¤È°ì½ï¤Ë»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¼¡¤Î¤è¤¦¤Ë\fIMy_Tie\fRÆâ¤Ç¼ÂÁõ¤ò¥é¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢¤³¤ì¤Ë¤è¤ê¡¢\fBMy_Tie\&.java\fR¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fBMy_Tie\fR¥¯¥é¥¹¤Ø¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢\fBimpl\fR¥ª¥Ö¥¸¥§¥¯¥È¤ò¼è¤ê¤Þ¤¹¡£\fBimpl\fR¤ËÂФ·¤Æ¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤Î¼ÂÁõ¤Ï\fBHelloOperations\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ë¤Î¤ß¤Ç¡¢¤½¤Î¾¤Î¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤·¤«¤·¡¢¤³¤ì¤òORB¤È°ì½ï¤Ë»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¼¡¤Î¤è¤¦¤Ë\fBMy_Tie\fRÆâ¤Ç¼ÂÁõ¤ò¥é¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-ORB orb = ORB\&.init(args, System\&.getProperties()); +- +-// create servant and register it with the ORB +-MyServant myDelegate = new MyServant(); +-myDelegate\&.setORB(orb); ++\fBORB orb = ORB\&.init(args, System\&.getProperties());\fR + +-// create a tie, with servant being the delegate\&. +-MyPOATie tie = new MyPOATie(myDelegate); ++\fB// create servant and register it with the ORB\fR ++\fBMyServant myDelegate = new MyServant();\fR ++\fBmyDelegate\&.setORB(orb); \fR ++\fB \fR ++\fB// create a tie, with servant being the delegate\&.\fR ++\fBMyPOATie tie = new MyPOATie(myDelegate);\fR ++\fB \fR ++\fB// obtain the objectRef for the tie\fR ++\fBMy ref = tie\&._this(orb);\fR + +-// obtain the objectRef for the tie +-My ref = tie\&._this(orb); + .fi + .if n \{\ + .RE + .\} + .SS "ȯ¹Ô¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ÎÂåÂØ°ÌÃ֤λØÄê" + .PP +-ȯ¹Ô¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê°Ê³°¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤¯¤Ë¤Ï¡¢\fIi\fR\fIdlj \-td /altdir My\&.idl\fR¤Î¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ ++ȯ¹Ô¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê°Ê³°¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤¯¤Ë¤Ï¡¢\fBi\fR\fBdlj \-td /altdir My\&.idl\fR¤Î¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ + .PP + +-\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fI\&./My\&.java\fR¤Ç¤Ï¤Ê¤¯¡¢\fI/altdir/My\&.java\fR¤Ê¤É¤Ëȯ¹Ô¤µ¤ì¤Þ¤¹¡£ ++\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fB\&./My\&.java\fR¤Ç¤Ï¤Ê¤¯¡¢\fB/altdir/My\&.java\fR¤Ê¤É¤Ëȯ¹Ô¤µ¤ì¤Þ¤¹¡£ + .SS "¥¤¥ó¥¯¥ë¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤ÎÂåÂØ°ÌÃ֤λØÄê" + .PP +-\fIMy\&.idl\fR¥Õ¥¡¥¤¥ë¤¬Ê̤Î\fIidl\fR¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë\fIMyOther\&.idl\fR¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¡¢\fIMyOther\&.idl\fR¥Õ¥¡¥¤¥ë¤¬¥í¡¼¥«¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¸ºß¤¹¤ë¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤½¤ì¤¬\fI/includes\fR¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ ++\fBMy\&.idl\fR¥Õ¥¡¥¤¥ë¤¬Ê̤Î\fBidl\fR¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë\fBMyOther\&.idl\fR¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¡¢\fBMyOther\&.idl\fR¥Õ¥¡¥¤¥ë¤¬¥í¡¼¥«¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¸ºß¤¹¤ë¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤½¤ì¤¬\fB/includes\fR¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-i /includes My\&.idl ++\fBidlj \-i /includes My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤¿¤È¤¨¤Ð¡¢\fI/moreIncludes\fR¤Ë¤¢¤ë\fIAnother\&.idl\fR¤â\fIMy\&.idl\fR¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢¼¡¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fB/moreIncludes\fR¤Ë¤¢¤ë\fBAnother\&.idl\fR¤â\fBMy\&.idl\fR¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢¼¡¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-i /includes \-i /moreIncludes My\&.idl ++\fBidlj \-i /includes \-i /moreIncludes My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤Î¤è¤¦¤Ê·Á¼°¤Î\fIinclude\fR¤ÏŤ¯¤Ê¤ë¤¿¤á¡¢¥¤¥ó¥¯¥ë¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò¥³¥ó¥Ñ¥¤¥é¤Ë»Ø¼¨¤¹¤ë¤¿¤á¤ÎÊ̤ÎÊýË¡¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢´Ä¶­ÊÑ¿ô¤Î¹Í¤¨Êý¤È»÷¤Æ¤¤¤Þ¤¹¡£\fICLASSPATH\fRÊÑ¿ô¤Ë°ìÍ÷ɽ¼¨¤µ¤ì¤Æ¤¤¤ë¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ëidl\&.config¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£¤½¤Î\fIidl\&.config\fR¤ÎÃæ¤Ë¡¢¼¡¤Î¤è¤¦¤Ê·Á¼°¤Î¹Ô¤òÆþ¤ì¤Þ¤¹¡£ ++¤³¤Î¤è¤¦¤Ê·Á¼°¤Î\fBinclude\fR¤ÏŤ¯¤Ê¤ë¤¿¤á¡¢¥¤¥ó¥¯¥ë¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò¥³¥ó¥Ñ¥¤¥é¤Ë»Ø¼¨¤¹¤ë¤¿¤á¤ÎÊ̤ÎÊýË¡¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢´Ä¶­ÊÑ¿ô¤Î¹Í¤¨Êý¤È»÷¤Æ¤¤¤Þ¤¹¡£\fBCLASSPATH\fRÊÑ¿ô¤Ë°ìÍ÷ɽ¼¨¤µ¤ì¤Æ¤¤¤ë¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ëidl\&.config¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£¤½¤Î\fBidl\&.config\fR¤ÎÃæ¤Ë¡¢¼¡¤Î¤è¤¦¤Ê·Á¼°¤Î¹Ô¤òÆþ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-includes=/includes;/moreIncludes ++\fBincludes=/includes;/moreIncludes\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¡¢¥¤¥ó¥¯¥ë¡¼¥É¡¦¥ê¥¹¥È¤òÆɤ߹þ¤ß¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥£¥ì¥¯¥È¥ê¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤Ï¥»¥ß¥³¥í¥ó(;)¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¶èÀÚ¤êʸ»ú¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£Windows¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥»¥ß¥³¥í¥ó¤ò»ÈÍѤ·¡¢UNIX¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥³¥í¥ó¤ò»ÈÍѤ¹¤ë¤Ê¤É¤Ç¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¡¢¥¤¥ó¥¯¥ë¡¼¥É¡¦¥ê¥¹¥È¤òÆɤ߹þ¤ß¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥£¥ì¥¯¥È¥ê¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤Ï¥»¥ß¥³¥í¥ó(;)¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¶èÀÚ¤êʸ»ú¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£Windows¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥»¥ß¥³¥í¥ó¤ò»ÈÍѤ·¡¢Solaris¡¢Linux¤ª¤è¤ÓOS X¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥³¥í¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .SS "¥¤¥ó¥¯¥ë¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Îȯ¹Ô" + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤷ¤¿\fIidl\fR¥Õ¥¡¥¤¥ë¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ä¹½Â¤ÂΤʤɤˤĤ¤¤Æ¤Î¤ß¡¢Java¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë·¿¤Ë¤Ä¤¤¤Æ¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î2¤Ä¤Î\fIidl\fR¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¹Í¤¨¤Æ¤ß¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤷ¤¿\fBidl\fR¥Õ¥¡¥¤¥ë¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ä¹½Â¤ÂΤʤɤˤĤ¤¤Æ¤Î¤ß¡¢Java¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë·¿¤Ë¤Ä¤¤¤Æ¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î2¤Ä¤Î\fBidl\fR¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¹Í¤¨¤Æ¤ß¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-My\&.idl file: ++\fBMy\&.idl file:\fR ++\fB \fR ++\fB#include \fR ++\fBinterface My\fR ++\fB{\fR ++\fB};\fR ++\fB \fR ++\fBMyOther\&.idl file:\fR ++\fB \fR ++\fBinterface MyOther\fR ++\fB{\fR ++\fB};\fR + +-#include +-interface My +-{ +-}; +- +-MyOther\&.idl file: +- +-interface MyOther +-{ +-}; + .fi + .if n \{\ + .RE + .\} + .PP +-¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤Ë´Ø¤·¤Æ·Ù¹ð¤¬¤¢¤ê¤Þ¤¹¡£¥°¥í¡¼¥Ð¥ë¡¦¥¹¥³¡¼¥×¤Ëɽ¼¨¤µ¤ì¤ë\fI#include\fRʸ¤Ï¡¢Á°½Ò¤Î¤È¤ª¤ê¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î\fI#include\fRʸ¤Ï¡¢¥¤¥ó¥Ý¡¼¥Èʸ¤È¸«¤Ê¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°Ï¤Þ¤ì¤¿¥¹¥³¡¼¥×Æâ¤Ëɽ¼¨¤µ¤ì¤ë\fI#include\fRʸ¤Ï¡¢ËÜÅö¤Î°ÕÌ£¤Ç¤Î\fI#include\fRʸ¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¥³¡¼¥É¤¬¡¢¸µ¤Î¥Õ¥¡¥¤¥ë¤Ë¤½¤Î¤Þ¤Þɽ¼¨¤µ¤ì¤Æ¤¤¤ë¤«¤Î¤è¤¦¤Ë½èÍý¤µ¤ì¡¢¤½¤ì¤ËÂФ·¤ÆJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£¼¡¤Ï¤½¤ÎÎã¤Ç¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤Ë´Ø¤·¤Æ·Ù¹ð¤¬¤¢¤ê¤Þ¤¹¡£¥°¥í¡¼¥Ð¥ë¡¦¥¹¥³¡¼¥×¤Ëɽ¼¨¤µ¤ì¤ë\fB#include\fRʸ¤Ï¡¢Á°½Ò¤Î¤È¤ª¤ê¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î\fB#include\fRʸ¤Ï¡¢¥¤¥ó¥Ý¡¼¥Èʸ¤È¸«¤Ê¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°Ï¤Þ¤ì¤¿¥¹¥³¡¼¥×Æâ¤Ëɽ¼¨¤µ¤ì¤ë\fB#include\fRʸ¤Ï¡¢ËÜÅö¤Î°ÕÌ£¤Ç¤Î\fB#include\fRʸ¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¥³¡¼¥É¤¬¡¢¸µ¤Î¥Õ¥¡¥¤¥ë¤Ë¤½¤Î¤Þ¤Þɽ¼¨¤µ¤ì¤Æ¤¤¤ë¤«¤Î¤è¤¦¤Ë½èÍý¤µ¤ì¡¢¤½¤ì¤ËÂФ·¤ÆJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£¼¡¤Ï¤½¤ÎÎã¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-My\&.idl file: ++\fBMy\&.idl file:\fR ++\fB \fR ++\fB#include \fR ++\fBinterface My\fR ++\fB{\fR ++\fB #include \fR ++\fB};\fR ++\fB \fR ++\fBMyOther\&.idl file:\fR ++\fB \fR ++\fBinterface MyOther\fR ++\fB{\fR ++\fB};\fR ++\fB \fR ++\fBEmbedded\&.idl\fR ++\fB \fR ++\fBenum E {one, two, three};\fR + +-#include +-interface My +-{ +- #include +-}; +- +-MyOther\&.idl file: +- +-interface MyOther +-{ +-}; +- +-Embedded\&.idl +- +-enum E {one, two, three}; + .fi + .if n \{\ + .RE + .\} + .PP +-\fI idlj My\&.idl \fR¤ò¼Â¹Ô¤·¤Æ¡¢Java¥Õ¥¡¥¤¥ë¤Î¼¡¤Î¥ê¥¹¥È¤òÀ¸À®¤·¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥Èʸ¤È¤ß¤Ê¤µ¤ì¤ë\fI#include\fR¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤¿¤á¡¢\fIMyOther\&.java\fR¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£¤¿¤À¤·¡¢ËÜÅö¤Î°ÕÌ£¤Ç¤Î\fI#include\fR¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤¿¤á¡¢\fIE\&.java\fR¤ÏÀ¸À®¤µ¤ì¤Þ¤·¤¿¡£\fIEmbedded\&.idl\fR¥Õ¥¡¥¤¥ë¤¬\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥¹¥³¡¼¥×Æâ¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢\fIMy\fR¤Î¥¹¥³¡¼¥×Æâ(¤Ä¤Þ¤ê¡¢\fIMyPackage\fRÆâ)¤ËÀ¸À®¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fI\-emitAll\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¤¹¤Ù¤Æ¤Î·¿¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£ ++\fB idlj My\&.idl \fR¤ò¼Â¹Ô¤·¤Æ¡¢Java¥Õ¥¡¥¤¥ë¤Î¼¡¤Î¥ê¥¹¥È¤òÀ¸À®¤·¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥Èʸ¤È¤ß¤Ê¤µ¤ì¤ë\fB#include\fR¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤¿¤á¡¢\fBMyOther\&.java\fR¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£¤¿¤À¤·¡¢ËÜÅö¤Î°ÕÌ£¤Ç¤Î\fB#include\fR¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤¿¤á¡¢\fBE\&.java\fR¤ÏÀ¸À®¤µ¤ì¤Þ¤·¤¿¡£\fBEmbedded\&.idl\fR¥Õ¥¡¥¤¥ë¤¬\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥¹¥³¡¼¥×Æâ¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢\fBMy\fR¤Î¥¹¥³¡¼¥×Æâ(¤Ä¤Þ¤ê¡¢\fBMyPackage\fRÆâ)¤ËÀ¸À®¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fB\-emitAll\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¤¹¤Ù¤Æ¤Î·¿¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\&./MyHolder\&.java +-\&./MyHelper\&.java +-\&./_MyStub\&.java +-\&./MyPackage +-\&./MyPackage/EHolder\&.java +-\&./MyPackage/EHelper\&.java +-\&./MyPackage/E\&.java +-\&./My\&.java ++\fB\&./MyHolder\&.java\fR ++\fB\&./MyHelper\&.java\fR ++\fB\&./_MyStub\&.java\fR ++\fB\&./MyPackage\fR ++\fB\&./MyPackage/EHolder\&.java\fR ++\fB\&./MyPackage/EHelper\&.java\fR ++\fB\&./MyPackage/E\&.java\fR ++\fB\&./My\&.java\fR ++ + .fi + .if n \{\ + .RE +@@ -382,49 +371,51 @@ + .RS 4 + .\} + .nf +-Widgets\&.idl file: ++\fBWidgets\&.idl file:\fR ++\fB \fR ++\fBmodule Widgets\fR ++\fB{\fR ++\fB interface W1 {\&.\&.\&.};\fR ++\fB interface W2 {\&.\&.\&.};\fR ++\fB};\fR + +-module Widgets +-{ +- interface W1 {\&.\&.\&.}; +- interface W2 {\&.\&.\&.}; +-}; + .fi + .if n \{\ + .RE + .\} + .PP +-IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤ò²ð¤·¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢W1¤ª¤è¤ÓW2¤ËÂФ¹¤ëJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fIWidgets\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¶È³¦¤Î´·Îã¤Ë¤è¤ë¤È¡¢²ñ¼Ò¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢\fIcom\&.\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËÃÖ¤¯¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î´·Îã¤Ë½¾¤¦¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò\fIcom\&.abc\&.Widgets\fR¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Ñ¥Ã¥±¡¼¥¸ÀÜƬ¼­¤òWidgets¥â¥¸¥å¡¼¥ë¤ËÉղ乤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤ò²ð¤·¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢W1¤ª¤è¤ÓW2¤ËÂФ¹¤ëJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fBWidgets\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¶È³¦¤Î´·Îã¤Ë¤è¤ë¤È¡¢²ñ¼Ò¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢\fBcom\&.\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËÃÖ¤¯¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î´·Îã¤Ë½¾¤¦¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò\fBcom\&.abc\&.Widgets\fR¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Ñ¥Ã¥±¡¼¥¸ÀÜƬ¼­¤òWidgets¥â¥¸¥å¡¼¥ë¤ËÉղ乤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-pkgPrefix Widgets com\&.abc Widgets\&.idl ++\fBidlj \-pkgPrefix Widgets com\&.abc Widgets\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-Widgets\&.idl¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Æ¤¤¤ëIDL¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ï¡¢¤½¤Î¥³¥Þ¥ó¥É¤Ë¤â\fI\-pkgPrefix\fR¥Õ¥é¥°¤¬É¬ÍפǤ¹¡£¤³¤Î¥Õ¥é¥°¤ò»ØÄꤷ¤Ê¤¤¤È¡¢¤½¤ÎIDL¥Õ¥¡¥¤¥ë¤Ï¡¢\fIcom\&.abc\&.Widgets\fR¥Ñ¥Ã¥±¡¼¥¸¤Ç¤Ï¤Ê¤¯¡¢\fIWidgets\fR¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++Widgets\&.idl¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Æ¤¤¤ëIDL¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ï¡¢¤½¤Î¥³¥Þ¥ó¥É¤Ë¤â\fB\-pkgPrefix\fR¥Õ¥é¥°¤¬É¬ÍפǤ¹¡£¤³¤Î¥Õ¥é¥°¤ò»ØÄꤷ¤Ê¤¤¤È¡¢¤½¤ÎIDL¥Õ¥¡¥¤¥ë¤Ï¡¢\fBcom\&.abc\&.Widgets\fR¥Ñ¥Ã¥±¡¼¥¸¤Ç¤Ï¤Ê¤¯¡¢\fBWidgets\fR¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-ÀÜƬ¼­¤¬É¬Íפʥѥ屡¼¥¸¤¬¤¤¤¯¤Ä¤â¤¢¤ë¾ì¹ç¤Ï¡¢Á°½Ò¤Îidl\&.config¥Õ¥¡¥¤¥ë¤ÇÀÜƬ¼­¤ò»ØÄꤹ¤ë¤Î¤¬´Êñ¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸ÀÜƬ¼­¤Î³Æ¹Ô¤Ï¡¢\fIPkgPrefix\&.=\fR¤Î·Á¼°¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Á°½Ò¤ÎÎã¤Î¹Ô¤Ç¤Ï¡¢\fIPkgPrefix\&.Widgets=com\&.abc\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥ê¥Ý¥¸¥È¥êID¤Ë¤Ï±Æ¶Á¤·¤Þ¤»¤ó¡£ ++ÀÜƬ¼­¤¬É¬Íפʥѥ屡¼¥¸¤¬¤¤¤¯¤Ä¤â¤¢¤ë¾ì¹ç¤Ï¡¢Á°½Ò¤Îidl\&.config¥Õ¥¡¥¤¥ë¤ÇÀÜƬ¼­¤ò»ØÄꤹ¤ë¤Î¤¬´Êñ¤Ç¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸¤ÎÀÜƬ¼­¹Ô¤Ï¡¢\fBPkgPrefix\&.=\fR¤Î·Á¼°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Á°½Ò¤ÎÎã¤Î¹Ô¤Ç¤Ï¡¢\fBPkgPrefix\&.Widgets=com\&.abc\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥ê¥Ý¥¸¥È¥êID¤Ë¤Ï±Æ¶Á¤·¤Þ¤»¤ó¡£ + .SS "¥³¥ó¥Ñ¥¤¥ëÁ°¤Î¥·¥ó¥Ü¥ë¤ÎÄêµÁ" + .PP +-¥³¥ó¥Ñ¥¤¥ëÍѤΥ·¥ó¥Ü¥ë¤¬IDL¥Õ¥¡¥¤¥ëÆâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¤½¤Î¥·¥ó¥Ü¥ë¤òÄêµÁ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¿¤È¤¨¤Ð¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°Æâ¤Ë¥Ç¥Ð¥Ã¥°¡¦¥³¡¼¥É¤òÁȤßÆþ¤ì¤ë¤È¤­¤Ë»ÈÍѤ·¤Þ¤¹¡£¥³¥Þ¥ó¥É\fIidlj \-d MYDEF My\&.idl \fR¤Ï¡¢My\&.idlÆâ¤Ë¹Ô\fI#define MYDEF\fR¤òÇÛÃÖ¤·¤¿¾ì¹ç¤ÈƱÅù¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥ëÍѤΥ·¥ó¥Ü¥ë¤¬IDL¥Õ¥¡¥¤¥ëÆâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¤½¤Î¥·¥ó¥Ü¥ë¤òÄêµÁ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¿¤È¤¨¤Ð¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°Æâ¤Ë¥Ç¥Ð¥Ã¥°¡¦¥³¡¼¥É¤òÁȤßÆþ¤ì¤ë¤È¤­¤Ë»ÈÍѤ·¤Þ¤¹¡£¥³¥Þ¥ó¥É\fBidlj \-d MYDEF My\&.idl \fR¤Ï¡¢My\&.idlÆâ¤Ë¹Ô\fB#define MYDEF\fR¤òÇÛÃÖ¤·¤¿¾ì¹ç¤ÈƱÅù¤Ë¤Ê¤ê¤Þ¤¹¡£ + .SS "´û¸¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ÎÊÝ»ý" + .PP +-Java¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ï¡¢\fI\-keep\fR¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤ë¾å½ñ¤­¤ò²óÈò¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤¹¤Ç¤Ë¸ºß¤¹¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿¾ì¹ç(¤¿¤À¤·¡¢¤½¤ì¤é¤ÎÆâÍƤ¬Àµ³Î¤Ç¤¢¤ë¤È¤­°Ê³°¤Ï¥«¥¹¥¿¥Þ¥¤¥º¤ÏÈò¤±¤ë)¡¢\fI\-keep\fR¥ª¥×¥·¥ç¥ó¤ÏÍ­ÍѤǤ¹¡£¥³¥Þ¥ó¥É\fIidlj \-keep My\&.idl\fR¤Ï¡¢¤¹¤Ç¤Ë¸ºß¤·¤Ê¤¤¤¹¤Ù¤Æ¤Î¥¯¥é¥¤¥¢¥ó¥È¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òȯ¹Ô¤·¤Þ¤¹¡£ ++Java¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ï¡¢\fB\-keep\fR¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤ë¾å½ñ¤­¤ò²óÈò¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤¹¤Ç¤Ë¸ºß¤¹¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿¾ì¹ç(¤¿¤À¤·¡¢¤½¤ì¤é¤ÎÆâÍƤ¬Àµ³Î¤Ç¤¢¤ë¤È¤­°Ê³°¤Ï¥«¥¹¥¿¥Þ¥¤¥º¤ÏÈò¤±¤ë)¡¢\fB\-keep\fR¥ª¥×¥·¥ç¥ó¤ÏÍ­ÍѤǤ¹¡£¥³¥Þ¥ó¥É\fBidlj \-keep My\&.idl\fR¤Ï¡¢¤¹¤Ç¤Ë¸ºß¤·¤Ê¤¤¤¹¤Ù¤Æ¤Î¥¯¥é¥¤¥¢¥ó¥È¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òȯ¹Ô¤·¤Þ¤¹¡£ + .SS "¥³¥ó¥Ñ¥¤¥ë¤Î¿ÊĽ¾õ¶·¤Îɽ¼¨" + .PP +-IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¼Â¹Ô¤Î³ÆÃʳ¬¤Ç¾õÂÖ¥á¥Ã¥»¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£\fI\-v\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fIidlj \-v My\&.idl\fR¤Î¤è¤¦¤Ê¾éĹ¥â¡¼¥É¤ò¥¢¥¯¥Æ¥£¥Ö²½¤·¤Þ¤¹¡£ ++IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¼Â¹Ô¤Î³ÆÃʳ¬¤Ç¾õÂÖ¥á¥Ã¥»¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£\fB\-v\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fBidlj \-v My\&.idl\fR¤Î¤è¤¦¤Ê¾éĹ¥â¡¼¥É¤ò¥¢¥¯¥Æ¥£¥Ö²½¤·¤Þ¤¹¡£ + .PP + ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¾éĹ¥â¡¼¥É¤Ç¤Ï¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£ + .SS "¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨" + .PP +-IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Î¥Ó¥ë¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó\fIidlj \-version\fR¤Ç\fI\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£ ++IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Î¥Ó¥ë¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô\fBidlj \-version\fR¤Ç\fB\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£ + .PP +-¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿¥Ð¥¤¥ó¥Ç¥£¥ó¥°Æâ¤Ë¤â½ñ¤­¹þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤹ¤ë¤È¡¢¤½¤ì°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¤â¡¢¤¹¤Ù¤Æ̵»ë¤µ¤ì¤Þ¤¹¡£ ++¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿¥Ð¥¤¥ó¥Ç¥£¥ó¥°Æâ¤Ë¤â½ñ¤­¹þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤹ¤ë¤È¡¢¤½¤ì°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¤â¡¢¤¹¤Ù¤Æ̵»ë¤µ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-d \fIsymbol\fR +@@ -435,7 +426,8 @@ + .RS 4 + .\} + .nf +-#define \fIsymbol\fR ++\fB#define \fR\fB\fIsymbol\fR\fR ++ + .fi + .if n \{\ + .RE +@@ -444,12 +436,12 @@ + .PP + \-demitAll + .RS 4 +-\fI#include\fR¥Õ¥¡¥¤¥ëÆâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤â´Þ¤á¤Æ¡¢¤¹¤Ù¤Æ¤Î·¿¤òȯ¹Ô¤·¤Þ¤¹¡£ ++\fB#include\fR¥Õ¥¡¥¤¥ëÆâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤â´Þ¤á¤Æ¡¢¤¹¤Ù¤Æ¤Î·¿¤òȯ¹Ô¤·¤Þ¤¹¡£ + .RE + .PP + \-fside + .RS 4 +-ȯ¹Ô¤¹¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÄêµÁ¤·¤Þ¤¹¡£\fIside\fR¥Ñ¥é¥á¡¼¥¿¤Ë¤Ï¡¢\fIclient\fR¡¢\fIserver\fR¡¢\fIserverTIE\fR¡¢\fIall\fR¤Þ¤¿¤Ï\fIallTIE\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fI\-fserverTIE\fR¤Þ¤¿¤Ï\fI\-fallTIE\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢°Ñ¾ù¥â¥Ç¥ë¡¦¥¹¥±¥ë¥È¥ó¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£¥Õ¥é¥°¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fI\-fclient\fR¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ ++ȯ¹Ô¤¹¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÄêµÁ¤·¤Þ¤¹¡£\fBside\fR¥Ñ¥é¥á¡¼¥¿¤Ë¤Ï¡¢\fBclient\fR¡¢\fBserver\fR¡¢\fBserverTIE\fR¡¢\fBall\fR¤Þ¤¿¤Ï\fBallTIE\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fB\-fserverTIE\fR¤Þ¤¿¤Ï\fB\-fallTIE\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢°Ñ¾ù¥â¥Ç¥ë¡¦¥¹¥±¥ë¥È¥ó¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£¥Õ¥é¥°¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fB\-fclient\fR¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .PP + \-i \fIinclude\-path\fR +@@ -469,17 +461,17 @@ + .PP + \-oldImplBase + .RS 4 +-1\&.4¤è¤êÁ°¤ÎJDK ORB¤È¸ß´¹À­¤Î¤¢¤ë¥¹¥±¥ë¥È¥ó¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢POA·Ñ¾µ¥â¥Ç¥ë¤Î¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢\fIImplBase\fR·Ñ¾µ¥â¥Ç¥ë¤Î¥¯¥é¥¹¤Ç¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤ë¤Î¤Ç¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Î²¼°Ì¸ß´¹À­¤¬ÆÀ¤é¤ì¤Þ¤¹¡£ ++1\&.4¤è¤êÁ°¤ÎJDK ORB¤È¸ß´¹À­¤Î¤¢¤ë¥¹¥±¥ë¥È¥ó¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢POA·Ñ¾µ¥â¥Ç¥ë¤Î¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢\fBImplBase\fR·Ñ¾µ¥â¥Ç¥ë¤Î¥¯¥é¥¹¤Ç¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤ë¤Î¤Ç¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Î¸åÊý¸ß´¹À­¤¬ÆÀ¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-pkgPrefix \fItype\fR \fIprefix\fR + .RS 4 +-\fItype\fR¤¬¥Õ¥¡¥¤¥ë¡¦¥¹¥³¡¼¥×¤Ç¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï¡¢¤½¤Î·¿¤ËÂФ·¤ÆÀ¸À®¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¡¢À¸À®¤µ¤ì¤ëJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ë\fIprefix\fR¤È¤¤¤¦ÀÜƬ¼­¤¬Éղ䵤ì¤Þ¤¹¡£type¤Ï¡¢¥È¥Ã¥×¥ì¥Ù¥ë¡¦¥â¥¸¥å¡¼¥ë¤Îñ½ã̾¤«¡¢¤É¤Î¥â¥¸¥å¡¼¥ë¤è¤ê¤â³°Â¦¤ÇÄêµÁ¤µ¤ì¤¿IDL·¿¤Îñ½ã̾¤Î¤É¤Á¤é¤«¤Ç¤¹¡£ ++\fBtype\fR¤¬¥Õ¥¡¥¤¥ë¡¦¥¹¥³¡¼¥×¤Ç¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï¡¢¤½¤Î·¿¤ËÂФ·¤ÆÀ¸À®¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¡¢À¸À®¤µ¤ì¤ëJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ë\fBprefix\fR¤È¤¤¤¦ÀÜƬ¼­¤¬Éղ䵤ì¤Þ¤¹¡£type¤Ï¡¢¥È¥Ã¥×¥ì¥Ù¥ë¡¦¥â¥¸¥å¡¼¥ë¤Îñ½ã̾¤«¡¢¤É¤Î¥â¥¸¥å¡¼¥ë¤è¤ê¤â³°Â¦¤ÇÄêµÁ¤µ¤ì¤¿IDL·¿¤Îñ½ã̾¤Î¤É¤Á¤é¤«¤Ç¤¹¡£ + .RE + .PP + \-pkgTranslate \fItype\fR \fIpackage\fR + .RS 4 +-¼±Ê̻ҤÎÃæ¤Ë¥â¥¸¥å¡¼¥ë̾type¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢À¸À®¤µ¤ì¤ëJava¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¡¢¼±Ê̻ҤÎÃæ¤Î¤½¤Î̾Á°¤¬package¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£ºÇ½é¤Ë\fIpkgPrefix\fR¤ÎÊѹ¹¤¬¹Ô¤ï¤ì¤Þ¤¹¡£type¤ÎÃͤϡ¢¥È¥Ã¥×¥ì¥Ù¥ë¤Î¥â¥¸¥å¡¼¥ë¤Îñ½ã̾¡¢¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥â¥¸¥å¡¼¥ë¤Î³°Éô¤ÇÄêµÁ¤µ¤ì¤¿IDL·¿¤Îñ½ã̾¤Ç¡¢´°Á´¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÀµ³Î¤Ë°ìÃפ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¼±Ê̻ҤÎÃæ¤Ë¥â¥¸¥å¡¼¥ë̾type¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢À¸À®¤µ¤ì¤ëJava¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¡¢¼±Ê̻ҤÎÃæ¤Î¤½¤Î̾Á°¤¬package¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£ºÇ½é¤Ë\fBpkgPrefix\fR¤ÎÊѹ¹¤¬¹Ô¤ï¤ì¤Þ¤¹¡£type¤ÎÃͤϡ¢¥È¥Ã¥×¥ì¥Ù¥ë¤Î¥â¥¸¥å¡¼¥ë¤Îñ½ã̾¡¢¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥â¥¸¥å¡¼¥ë¤Î³°Éô¤ÇÄêµÁ¤µ¤ì¤¿IDL·¿¤Îñ½ã̾¤Ç¡¢´°Á´¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÀµ³Î¤Ë°ìÃפ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + Ê£¿ô¤ÎÊÑ´¹¤¬¼±Ê̻Ҥ˰ìÃפ¹¤ë¾ì¹ç¡¢¼¡¤ÎÎã¤Ë¼¨¤¹¤è¤¦¤Ë¡¢ºÇ¤âŤ¤°ìÃפ¬ÁªÂò¤µ¤ì¤Þ¤¹¡£ + .sp +@@ -489,7 +481,8 @@ + .RS 4 + .\} + .nf +-pkgTranslate type pkg \-pkgTranslate type2\&.baz pkg2\&.fizz ++\fBpkgTranslate type pkg \-pkgTranslate type2\&.baz pkg2\&.fizz\fR ++ + .fi + .if n \{\ + .RE +@@ -500,22 +493,23 @@ + .RS 4 + .\} + .nf +-type => pkg +-type\&.ext => pkg\&.ext +-type\&.baz => pkg2\&.fizz +-type2\&.baz\&.pkg => pkg2\&.fizz\&.pkg ++\fBtype => pkg\fR ++\fBtype\&.ext => pkg\&.ext\fR ++\fBtype\&.baz => pkg2\&.fizz\fR ++\fBtype2\&.baz\&.pkg => pkg2\&.fizz\&.pkg\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥Ñ¥Ã¥±¡¼¥¸Ì¾\fIorg\fR¡¢\fIorg\fR\&.o\fImg\fR¡¢¤Þ¤¿¤Ï\fIorg\&.omg\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢ÊÑ´¹¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÊÑ´¹¤·¤è¤¦¤È¤¹¤ë¤È¡¢¸ß´¹À­¤Î¤Ê¤¤¥³¡¼¥É¤¬À¸À®¤µ¤ì¡¢\fI\-pkgTranslate\fR¤Î¸å¤ÎºÇ½é¤Î°ú¿ô¤È¤·¤Æ¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò»ÈÍѤ¹¤ë¤È¡¢¥¨¥é¡¼¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£ ++¥Ñ¥Ã¥±¡¼¥¸Ì¾\fBorg\fR¡¢\fBorg\fR\&.o\fBmg\fR¡¢¤Þ¤¿¤Ï\fBorg\&.omg\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢ÊÑ´¹¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÊÑ´¹¤·¤è¤¦¤È¤¹¤ë¤È¡¢¸ß´¹À­¤Î¤Ê¤¤¥³¡¼¥É¤¬À¸À®¤µ¤ì¡¢\fB\-pkgTranslate\fR¤Î¸å¤ÎºÇ½é¤Î°ú¿ô¤È¤·¤Æ¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò»ÈÍѤ¹¤ë¤È¡¢¥¨¥é¡¼¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£ + .RE + .PP + \-skeletonName \fIxxx%yyy\fR + .RS 4 +-\fIxxx%yyy\fR¤¬¡¢¥¹¥±¥ë¥È¥ó¤Ë̾Á°¤òÉÕ¤±¤ë¥Ñ¥¿¡¼¥ó¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£\fIPOA\fR¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fI%POA\fR +-(\fI\-fserver\fR¤Þ¤¿¤Ï\fI\-fall\fR)¡¢\fIoldImplBase\fR¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fI_%ImplBase\fR +-(\-\fIoldImplBase\fR)¤ª¤è¤Ó(\fI\-fserver\fR¤Þ¤¿¤Ï\fI\-fall\fR))¡£ ++\fBxxx%yyy\fR¤¬¡¢¥¹¥±¥ë¥È¥ó¤Ë̾Á°¤òÉÕ¤±¤ë¥Ñ¥¿¡¼¥ó¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£\fBPOA\fR¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fB%POA\fR ++(\fB\-fserver\fR¤Þ¤¿¤Ï\fB\-fall\fR)¡¢\fBoldImplBase\fR¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fB_%ImplBase\fR ++(\-\fBoldImplBase\fR)¤ª¤è¤Ó(\fB\-fserver\fR¤Þ¤¿¤Ï\fB\-fall\fR))¡£ + .RE + .PP + \-td \fIdir\fR +@@ -525,10 +519,10 @@ + .PP + \-tieName \fIxxx%yyy\fR + .RS 4 +-¥Ñ¥¿¡¼¥ó¤Ë½¾¤Ã¤Æ¡¢\fIxxx%yyy\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£\fIPOA\fR¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fI%POA\fR +-(\fI\-fserverTie¤Þ¤¿¤Ï\-fallTie\fR)¡¢\fIoldImplBase\fR +-tie¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fI_%Tie\fR +-(\-\fIoldImplBase\fR)¤ª¤è¤Ó(\fI\-fserverTie\fR¤Þ¤¿¤Ï\fI\-fallTie\fR))¡£ ++¥Ñ¥¿¡¼¥ó¤Ë½¾¤Ã¤Æ¡¢\fBxxx%yyy\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£\fBPOA\fR¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fB%POA\fR ++(\fB\-fserverTie¤Þ¤¿¤Ï\-fallTie\fR)¡¢\fBoldImplBase\fR ++tie¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fB_%Tie\fR ++(\-\fBoldImplBase\fR)¤ª¤è¤Ó(\fB\-fserverTie\fR¤Þ¤¿¤Ï\fB\-fallTie\fR))¡£ + .RE + .PP + \-nowarn¡¢\-verbose +@@ -542,13 +536,13 @@ + .RE + .SH "À©¸Â»ö¹à" + .PP +-¥°¥í¡¼¥Ð¥ë¡¦¥¹¥³¡¼¥×Æâ¤Î¥¨¥¹¥±¡¼¥×¤µ¤ì¤¿¼±Ê̻Ҥϡ¢IDL¥×¥ê¥ß¥Æ¥£¥Ö·¿¤Î\fIObject\fR¤Þ¤¿¤Ï\fIValueBase\fR¤ÈƱ¤¸ÄÖ¤ê¤Ë¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤³¤ì¤Ï¡¢¥·¥ó¥Ü¥ëɽ¤¬¤³¤ì¤é¤Î¼±Ê̻Ҥǥץê¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤¿¤á¤Ç¤¹¡£¤³¤ì¤é¤ÎºÆÄêµÁ¤òµö²Ä¤¹¤ë¤È¡¢¸µ¤ÎÄêµÁ¤¬¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤ª¤½¤é¤¯¹±µ×Ū¤ÊÀ©Ìó¤Ç¤¹¡£ ++¥°¥í¡¼¥Ð¥ë¡¦¥¹¥³¡¼¥×Æâ¤Î¥¨¥¹¥±¡¼¥×¤µ¤ì¤¿¼±Ê̻Ҥϡ¢IDL¥×¥ê¥ß¥Æ¥£¥Ö·¿¤Î\fBObject\fR¤Þ¤¿¤Ï\fBValueBase\fR¤ÈƱ¤¸ÄÖ¤ê¤Ë¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤³¤ì¤Ï¡¢¥·¥ó¥Ü¥ëɽ¤¬¤³¤ì¤é¤Î¼±Ê̻Ҥǥץê¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤¿¤á¤Ç¤¹¡£¤³¤ì¤é¤ÎºÆÄêµÁ¤òµö²Ä¤¹¤ë¤È¡¢¸µ¤ÎÄêµÁ¤¬¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤ª¤½¤é¤¯¹±µ×Ū¤ÊÀ©Ìó¤Ç¤¹¡£ + .PP +-\fIfixed\fR¤È¤¤¤¦IDL·¿¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ++\fBfixed\fR¤È¤¤¤¦IDL·¿¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "´ûÃΤÎÌäÂê" + .PP +-¥°¥í¡¼¥Ð¥ë¼±Ê̻ҤˤĤ¤¤Æ¥¤¥ó¥Ý¡¼¥È¤¬À¸À®¤µ¤ì¤Þ¤»¤ó¡£Í½´ü¤µ¤ì¤Ê¤¤¥í¡¼¥«¥ë\fIimpl\fR¥ª¥Ö¥¸¥§¥¯¥È¤ò¸Æ¤Ó½Ð¤¹¤È¡¢Îã³°¤ò¼õ¤±¼è¤ê¤Þ¤¹¡£¤·¤«¤·¡¢¤½¤Î¸¶°ø¤Ï¡¢\fIServerDelegate\fR +-DSI¥³¡¼¥ÉÆâ¤Î\fINullPointerException\fR¤Ë¤¢¤ë¤è¤¦¤Ç¤¹¡£ ++¥°¥í¡¼¥Ð¥ë¼±Ê̻ҤˤĤ¤¤Æ¥¤¥ó¥Ý¡¼¥È¤¬À¸À®¤µ¤ì¤Þ¤»¤ó¡£Í½´ü¤µ¤ì¤Ê¤¤¥í¡¼¥«¥ë\fBimpl\fR¥ª¥Ö¥¸¥§¥¯¥È¤ò¸Æ¤Ó½Ð¤¹¤È¡¢Îã³°¤ò¼õ¤±¼è¤ê¤Þ¤¹¡£¤·¤«¤·¡¢¤½¤Î¸¶°ø¤Ï¡¢\fBServerDelegate\fR ++DSI¥³¡¼¥ÉÆâ¤Î\fBNullPointerException\fR¤Ë¤¢¤ë¤è¤¦¤Ç¤¹¡£ + .br + 'pl 8.5i + 'bp +--- ./jdk/src/linux/doc/man/ja/jar.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jar.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jar +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jar ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jar" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,72 +50,77 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jar \- Java Archive (JAR)¥Õ¥¡¥¤¥ë¤òÁàºî¤·¤Þ¤¹¡£ + .SH "³µÍ×" ++.PP + JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ® + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar c\fR[\fIefmMnv0\fR] [\fIentrypoint\fR] [\fIjarfile\fR] [\fImanifest\fR] [\fI\-C\fR \fIdir\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar c\fR[\fBefmMnv0\fR] [\fIentrypoint\fR] [\fIjarfile\fR] [\fImanifest\fR] [\fB\-C\fR \fIdir\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} ++.PP + JAR¥Õ¥¡¥¤¥ë¤Î¹¹¿· + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar u\fR[\fIefmMnv0\fR] [\fIentrypoint\fR] [\fIjarfile\fR] [\fImanifest\fR] [\fI\-C\fR \fIdir\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar u\fR[\fBefmMnv0\fR] [\fIentrypoint\fR] [\fIjarfile\fR] [\fImanifest\fR] [\fB\-C\fR \fIdir\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} ++.PP + JAR¥Õ¥¡¥¤¥ë¤ÎÃê½Ð + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar\fR \fIx\fR[\fIvf\fR] [\fIjarfile\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar\fR \fBx\fR[\fBvf\fR] [\fIjarfile\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} ++.PP + JAR¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar\fR \fIt\fR[\fIvf\fR] [\fIjarfile\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar\fR \fBt\fR[\fBvf\fR] [\fIjarfile\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} ++.PP + JAR¥Õ¥¡¥¤¥ë¤Ø¤Îº÷°ú¤ÎÄɲà + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar\fR \fIi\fR \fIjarfile\fR [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar\fR \fBi\fR \fIjarfile\fR [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} + .SH "ÀâÌÀ" + .PP +-\fIjar\fR¥³¥Þ¥ó¥É¤Ï¡¢ZIP¤ª¤è¤ÓZLIB°µ½Ì·Á¼°¤Ë´ð¤Å¤¯ÈÆÍѤΥ¢¡¼¥«¥¤¥Ö¤ª¤è¤Ó°µ½Ì¥Ä¡¼¥ë¤Ç¤¹¡£¤¿¤À¤·¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ï¡¢¼ç¤Ë¤¤¤¯¤Ä¤«¤ÎJava¥¢¥×¥ì¥Ã¥È¤ä¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òñ°ì¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¥Ñ¥Ã¥±¡¼¥¸²½¤¹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Þ¤·¤¿¡£¥¢¥×¥ì¥Ã¥È¤ä¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È(¥Õ¥¡¥¤¥ë¡¢¥¤¥á¡¼¥¸¡¢¤ª¤è¤Ó¥µ¥¦¥ó¥É)¤¬1¤Ä¤Î¥¢¡¼¥«¥¤¥Ö¤Ë·ë¹ç¤µ¤ì¤Æ¤¤¤ë¤È¡¢Java¥¨¡¼¥¸¥§¥ó¥È(¥Ö¥é¥¦¥¶¤Ê¤É)¤Ï¡¢¤½¤ì¤é¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò1²ó¤ÎHTTP¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Ç¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¥³¥ó¥Ý¡¼¥Í¥ó¥È¤´¤È¤Ë¿·¤·¤¤Àܳ¤¬ÉÔÍפˤʤê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤¬ÂçÉý¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ï¥Õ¥¡¥¤¥ë¤Î°µ½Ì¤â¹Ô¤¦¤¿¤á¡¢¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤¬¤µ¤é¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¸Ä¡¹¤Î¥¨¥ó¥È¥ê¤Ë¥¢¥×¥ì¥Ã¥ÈºîÀ®¼Ô¤Ë¤è¤ë½ð̾¤ò½ñ¤­¹þ¤á¤ë¤¿¤á¡¢ÇÛÉÛ¸µ¤Îǧ¾Ú¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Ï¡¢°µ½Ì¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥¨¥ó¥È¥ê¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤Ï¡¢ZIP¤ª¤è¤ÓZLIB°µ½Ì·Á¼°¤Ë´ð¤Å¤¯ÈÆÍѤΥ¢¡¼¥«¥¤¥Ö¤ª¤è¤Ó°µ½Ì¥Ä¡¼¥ë¤Ç¤¹¡£¤¿¤À¤·¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ï¡¢¼ç¤Ë¤¤¤¯¤Ä¤«¤ÎJava¥¢¥×¥ì¥Ã¥È¤ä¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òñ°ì¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¥Ñ¥Ã¥±¡¼¥¸²½¤¹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Þ¤·¤¿¡£¥¢¥×¥ì¥Ã¥È¤ä¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È(¥Õ¥¡¥¤¥ë¡¢¥¤¥á¡¼¥¸¡¢¤ª¤è¤Ó¥µ¥¦¥ó¥É)¤¬1¤Ä¤Î¥¢¡¼¥«¥¤¥Ö¤Ë·ë¹ç¤µ¤ì¤Æ¤¤¤ë¤È¡¢Java¥¨¡¼¥¸¥§¥ó¥È(¥Ö¥é¥¦¥¶¤Ê¤É)¤Ï¡¢¤½¤ì¤é¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò1²ó¤ÎHTTP¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Ç¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¥³¥ó¥Ý¡¼¥Í¥ó¥È¤´¤È¤Ë¿·¤·¤¤Àܳ¤¬ÉÔÍפˤʤê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤¬ÂçÉý¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ï¥Õ¥¡¥¤¥ë¤Î°µ½Ì¤â¹Ô¤¦¤¿¤á¡¢¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤¬¤µ¤é¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¸Ä¡¹¤Î¥¨¥ó¥È¥ê¤Ë¥¢¥×¥ì¥Ã¥ÈºîÀ®¼Ô¤Ë¤è¤ë½ð̾¤ò½ñ¤­¹þ¤á¤ë¤¿¤á¡¢ÇÛÉÛ¸µ¤Îǧ¾Ú¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Ï¡¢°µ½Ì¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥¨¥ó¥È¥ê¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£ + .PP +-\fIjar\fR¥³¥Þ¥ó¥É¤Î¹½Ê¸¤Ï¡¢\fItar\fR¥³¥Þ¥ó¥É¤Î¹½Ê¸¤Ë»÷¤Æ¤¤¤Þ¤¹¡£É¬¿Ü¤Î\fIÁàºî¤Î°ú¿ô\fR¤Î1¤Ä¤ÇÄêµÁ¤µ¤ì¤¿Ê£¿ô¤ÎÁàºî¥â¡¼¥É¤¬¤¢¤ê¤Þ¤¹¡£Â¾¤Î°ú¿ô¤Ï¡¢Áàºî¤ÎÆ°ºî¤òÊѹ¹¤¹¤ë\fI¥ª¥×¥·¥ç¥ó\fR¡¢¤Þ¤¿¤ÏÁàºî¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤ËɬÍפÊ\fI¥ª¥Ú¥é¥ó¥É\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤Î¹½Ê¸¤Ï¡¢\fBtar\fR¥³¥Þ¥ó¥É¤Î¹½Ê¸¤Ë»÷¤Æ¤¤¤Þ¤¹¡£É¬¿Ü¤Î\fIÁàºî¤Î°ú¿ô\fR¤Î1¤Ä¤ÇÄêµÁ¤µ¤ì¤¿Ê£¿ô¤ÎÁàºî¥â¡¼¥É¤¬¤¢¤ê¤Þ¤¹¡£Â¾¤Î°ú¿ô¤Ï¡¢Áàºî¤ÎÆ°ºî¤òÊѹ¹¤¹¤ë\fI¥ª¥×¥·¥ç¥ó\fR¡¢¤Þ¤¿¤ÏÁàºî¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤ËɬÍפÊ\fI¥ª¥Ú¥é¥ó¥É\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ + .SH "Áàºî¤Î°ú¿ô" + .PP +-\fIjar\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¼¡¤ÎÁàºî¤Î°ú¿ô¤Î¤¤¤º¤ì¤«¤ò»ØÄꤷ¤Æ¼Â¹Ô¤µ¤ì¤ëÁàºî¤òÁªÂò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¾¤Î1ʸ»ú¤Î¥ª¥×¥·¥ç¥ó¤Èº®ºß¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Ä̾Áàºî¤Î°ú¿ô¤Ï»ØÄꤵ¤ì¤ëºÇ½é¤Î°ú¿ô¤Ç¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¼¡¤ÎÁàºî¤Î°ú¿ô¤Î¤¤¤º¤ì¤«¤ò»ØÄꤷ¤Æ¼Â¹Ô¤µ¤ì¤ëÁàºî¤òÁªÂò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¾¤Î1ʸ»ú¤Î¥ª¥×¥·¥ç¥ó¤Èº®ºß¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Ä̾Áàºî¤Î°ú¿ô¤Ï»ØÄꤵ¤ì¤ëºÇ½é¤Î°ú¿ô¤Ç¤¹¡£ + .PP + c + .RS 4 +@@ -145,15 +152,16 @@ + .PP + e + .RS 4 +-\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤ë¥¯¥é¥¹¤ò¡¢¼Â¹Ô²ÄǽJAR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤ë¥¹¥¿¥ó¥É¥¢¥í¥óJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤ËÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î\fIMain\-Class\fR°À­Ãͤ¬ºîÀ®¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Þ¤¹¡£\fIe\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fIu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤ë¥¯¥é¥¹¤ò¡¢¼Â¹Ô²ÄǽJAR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤ë¥¹¥¿¥ó¥É¥¢¥í¥óJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤ËÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î\fBMain\-Class\fR°À­Ãͤ¬ºîÀ®¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Þ¤¹¡£\fBe\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fBu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIMain\&.jar\fR¥¢¡¼¥«¥¤¥Ö¤¬\fIMain\&.class\fR¥Õ¥¡¥¤¥ë¤È¤È¤â¤ËºîÀ®¤µ¤ì¤Þ¤¹¤¬¡¢¤½¤ÎºÝ¡¢¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î\fIMain\-Class\fR°À­ÃͤÏ\fIMain\fR¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBMain\&.jar\fR¥¢¡¼¥«¥¤¥Ö¤¬\fBMain\&.class\fR¥Õ¥¡¥¤¥ë¤È¤È¤â¤ËºîÀ®¤µ¤ì¤Þ¤¹¤¬¡¢¤½¤ÎºÝ¡¢¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î\fBMain\-Class\fR°À­ÃͤÏ\fBMain\fR¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar cfe Main\&.jar Main Main\&.class ++\fBjar cfe Main\&.jar Main Main\&.class\fR ++ + .fi + .if n \{\ + .RE +@@ -164,19 +172,21 @@ + .RS 4 + .\} + .nf +-java \-jar Main\&.jar ++\fBjava \-jar Main\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤¢¤ë¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤Î¥¯¥é¥¹Ì¾¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥É¥Ã¥È(\&.)¤Þ¤¿¤Ï¥¹¥é¥Ã¥·¥å(/)¤Î¤¤¤º¤ì¤«¤ò¶èÀÚ¤êʸ»ú¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIMain\&.class\fR¤¬\fImydir\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤Ï¼¡¤Î¤¤¤º¤ì¤«¤ÎÊýË¡¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¤¢¤ë¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤Î¥¯¥é¥¹Ì¾¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥É¥Ã¥È(\&.)¤Þ¤¿¤Ï¥¹¥é¥Ã¥·¥å(/)¤Î¤¤¤º¤ì¤«¤ò¶èÀÚ¤êʸ»ú¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBMain\&.class\fR¤¬\fBmydir\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤Ï¼¡¤Î¤¤¤º¤ì¤«¤ÎÊýË¡¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar \-cfe Main\&.jar mydir/Main mydir/Main\&.class +-jar \-cfe Main\&.jar mydir\&.Main mydir/Main\&.class ++\fBjar \-cfe Main\&.jar mydir/Main mydir/Main\&.class\fR ++\fBjar \-cfe Main\&.jar mydir\&.Main mydir/Main\&.class\fR ++ + .fi + .if n \{\ + .RE +@@ -190,7 +200,7 @@ + .nr an-break-flag 1 + .br + .ps +1 +-\fBNote\fR ++\fBÃíµ­\fR + .ps -1 + .br + .TS +@@ -198,7 +208,7 @@ + l. + T{ + Ãí°Õ +-ÆÃÄê¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¤â\fIMain\-Class\fR°À­¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë\fIm\fR¥ª¥×¥·¥ç¥ó¤È\fIe\fR¥ª¥×¥·¥ç¥ó¤ÎξÊý¤òƱ»þ¤Ë»ØÄꤹ¤ë¤È¡¢\fIMain\-Class\fR¤Î»ØÄ꤬¤¢¤¤¤Þ¤¤¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î¤¢¤¤¤Þ¤¤¤µ¤Ë¤è¤Ã¤Æ¥¨¥é¡¼¤¬È¯À¸¤·¡¢\fIjar\fR¥³¥Þ¥ó¥É¤ÎºîÀ®¤ä¹¹¿·¤ÎÁàºî¤¬½ªÎ»¤·¤Þ¤¹¡£ ++ÆÃÄê¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¤â\fBMain\-Class\fR°À­¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë\fBm\fR¥ª¥×¥·¥ç¥ó¤È\fBe\fR¥ª¥×¥·¥ç¥ó¤ÎξÊý¤òƱ»þ¤Ë»ØÄꤹ¤ë¤È¡¢\fBMain\-Class\fR¤Î»ØÄ꤬¤¢¤¤¤Þ¤¤¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î¤¢¤¤¤Þ¤¤¤µ¤Ë¤è¤Ã¤Æ¥¨¥é¡¼¤¬È¯À¸¤·¡¢\fBjar\fR¥³¥Þ¥ó¥É¤ÎºîÀ®¤ä¹¹¿·¤ÎÁàºî¤¬½ªÎ»¤·¤Þ¤¹¡£ + T} + .TE + .sp 1 +@@ -208,26 +218,26 @@ + .PP + f + .RS 4 +-\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢ºîÀ®(\fIc\fR)¡¢¹¹¿·(\fIu\fR)¡¢Ãê½Ð(\fIx\fR)¤Þ¤¿¤Ïɽ¼¨(\fIt\fR)¤µ¤ì¤ëJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤ËÀßÄꤷ¤Þ¤¹¡£\fIf\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò¾Êά¤¹¤ë¤È¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ë¡¢\fIstdin\fR¤«¤é¤ÎJAR¥Õ¥¡¥¤¥ë̾¤ò¼õ¤±Æþ¤ì¤ë¤«(\fIx\fR¤ª¤è¤Ó\fIt\fR¤Î¾ì¹ç)¡¢JAR¥Õ¥¡¥¤¥ë¤ò\fIstdout\fR¤ËÁ÷¿®¤¹¤ë¤³¤È(\fIc\fR¤ª¤è¤Ó\fIu\fR¤Î¾ì¹ç)¤¬»Ø¼¨¤µ¤ì¤Þ¤¹¡£ ++\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢ºîÀ®(\fBc\fR)¡¢¹¹¿·(\fBu\fR)¡¢Ãê½Ð(\fBx\fR)¤Þ¤¿¤Ïɽ¼¨(\fBt\fR)¤µ¤ì¤ëJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤ËÀßÄꤷ¤Þ¤¹¡£\fBf\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò¾Êά¤¹¤ë¤È¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ë¡¢\fBstdin\fR¤«¤é¤ÎJAR¥Õ¥¡¥¤¥ë̾¤ò¼õ¤±Æþ¤ì¤ë¤«(\fBx\fR¤ª¤è¤Ó\fBt\fR¤Î¾ì¹ç)¡¢JAR¥Õ¥¡¥¤¥ë¤ò\fBstdout\fR¤ËÁ÷¿®¤¹¤ë¤³¤È(\fBc\fR¤ª¤è¤Ó\fBu\fR¤Î¾ì¹ç)¤¬»Ø¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + m + .RS 4 +-(\fIMETA\-INF/MANIFEST\&.MF\fR¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¤¢¤ë) +-\fIjar\fR¥³¥Þ¥ó¥É¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤«¤é¡¢Â°À­¤Î̾Á°¤ÈÃͤΥڥ¢¤ò´Þ¤á¤Þ¤¹¡£\fIjar\fR¥³¥Þ¥ó¥É¤Ï¡¢Æ±¤¸Ì¾Á°¤Î¥¨¥ó¥È¥ê¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¤ò½ü¤­¡¢Â°À­¤Î̾Á°¤ÈÃͤòJAR¥Õ¥¡¥¤¥ë¤ËÄɲä·¤Þ¤¹¡£Æ±¤¸Ì¾Á°¤Î¥¨¥ó¥È¥ê¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ï°À­¤ÎÃͤò¹¹¿·¤·¤Þ¤¹¡£\fIm\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fIu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++(\fBMETA\-INF/MANIFEST\&.MF\fR¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¤¢¤ë) ++\fBjar\fR¥³¥Þ¥ó¥É¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î\fBmanifest\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤«¤é¡¢Â°À­¤Î̾Á°¤ÈÃͤΥڥ¢¤ò´Þ¤á¤Þ¤¹¡£\fBjar\fR¥³¥Þ¥ó¥É¤Ï¡¢Æ±¤¸Ì¾Á°¤Î¥¨¥ó¥È¥ê¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¤ò½ü¤­¡¢Â°À­¤Î̾Á°¤ÈÃͤòJAR¥Õ¥¡¥¤¥ë¤ËÄɲä·¤Þ¤¹¡£Æ±¤¸Ì¾Á°¤Î¥¨¥ó¥È¥ê¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ï°À­¤ÎÃͤò¹¹¿·¤·¤Þ¤¹¡£\fBm\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fBu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï´Þ¤Þ¤ì¤Ê¤¤¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¡¢ÆÃÊ̤ÊÌÜŪ¤Î̾Á°\-ÃͤΰÀ­¥Ú¥¢¤òÄɲäǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ù¥ó¥À¡¼¾ðÊó¡¢¥ê¥ê¡¼¥¹¾ðÊ󡢥ѥ屡¼¥¸¡¦¥·¡¼¥ê¥ó¥°¤ò»ØÄꤹ¤ë°À­¡¢¤Þ¤¿¤ÏJAR¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô²Äǽ¤Ë¤¹¤ë¤¿¤á¤Î°À­¤òÄɲäǤ­¤Þ¤¹¡£\fIm\fR¥ª¥×¥·¥ç¥ó¤Î»ÈÍÑÎã¤Ï¡¢http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html¤Ë¤¢¤ë ++¥Ç¥Õ¥©¥ë¥È¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï´Þ¤Þ¤ì¤Ê¤¤¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¡¢ÆÃÊ̤ÊÌÜŪ¤Î̾Á°\-ÃͤΰÀ­¥Ú¥¢¤òÄɲäǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ù¥ó¥À¡¼¾ðÊó¡¢¥ê¥ê¡¼¥¹¾ðÊ󡢥ѥ屡¼¥¸¡¦¥·¡¼¥ê¥ó¥°¤ò»ØÄꤹ¤ë°À­¡¢¤Þ¤¿¤ÏJAR¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô²Äǽ¤Ë¤¹¤ë¤¿¤á¤Î°À­¤òÄɲäǤ­¤Þ¤¹¡£\fBm\fR¥ª¥×¥·¥ç¥ó¤Î»ÈÍÑÎã¤Ï¡¢http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html¤Ë¤¢¤ë + ¥×¥í¥°¥é¥à¤Î¥Ñ¥Ã¥±¡¼¥¸²½¤Ë´Ø¤¹¤ë¹à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + M + .RS 4 +-¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥¨¥ó¥È¥ê¤òºîÀ®¤·¤Ê¤¤(\fIc\fR¤ª¤è¤Ó\fIu\fR¤Î¾ì¹ç)¤«¡¢¤Þ¤¿¤Ï¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥¨¥ó¥È¥ê¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ïºï½ü¤·¤Þ¤¹(\fIu\fR¤Î¾ì¹ç)¡£\fIM\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fIu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥¨¥ó¥È¥ê¤òºîÀ®¤·¤Ê¤¤(\fBc\fR¤ª¤è¤Ó\fBu\fR¤Î¾ì¹ç)¤«¡¢¤Þ¤¿¤Ï¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥¨¥ó¥È¥ê¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ïºï½ü¤·¤Þ¤¹(\fBu\fR¤Î¾ì¹ç)¡£\fBM\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fBu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + n + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)»þ¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¥ó¥Æ¥ó¥Ä¤¬pack200(1)¥³¥Þ¥ó¥É¤Î¥Ñ¥Ã¥¯¤ª¤è¤Ó¥¢¥ó¥Ñ¥Ã¥¯Áàºî¤Î±Æ¶Á¤ò¼õ¤±¤Ê¤¤¤è¤¦¤Ë¥¢¡¼¥«¥¤¥Ö¤òÀµµ¬²½¤·¤Þ¤¹¡£¤³¤ÎÀµµ¬²½¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¡¢½ð̾ÉÕ¤­JAR¤Î½ð̾¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)»þ¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¥ó¥Æ¥ó¥Ä¤¬pack200(1)¥³¥Þ¥ó¥É¤Î¥Ñ¥Ã¥¯¤ª¤è¤Ó¥¢¥ó¥Ñ¥Ã¥¯Áàºî¤Î±Æ¶Á¤ò¼õ¤±¤Ê¤¤¤è¤¦¤Ë¥¢¡¼¥«¥¤¥Ö¤òÀµµ¬²½¤·¤Þ¤¹¡£¤³¤ÎÀµµ¬²½¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¡¢½ð̾ÉÕ¤­JAR¤Î½ð̾¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + v +@@ -237,46 +247,48 @@ + .PP + 0 + .RS 4 +-(¥¼¥í) ZIP°µ½Ì¤ò»ÈÍѤ·¤Ê¤¤¤ÇJAR¥Õ¥¡¥¤¥ë¤òºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)¤·¤Þ¤¹¡£ ++(¥¼¥í) ZIP°µ½Ì¤ò»ÈÍѤ·¤Ê¤¤¤ÇJAR¥Õ¥¡¥¤¥ë¤òºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)¤·¤Þ¤¹¡£ + .RE + .PP + \-C \fIdir\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)»þ¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fIfile\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤Î½èÍýÃæ¤Ë¥Ç¥£¥ì¥¯¥È¥ê¤ò°ì»þŪ¤ËÊѹ¹¤·¤Þ¤¹¡£¤³¤ÎÁàºî¤Ï¡¢UNIX +-\fItar\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î\fI\-C\fR¥ª¥×¥·¥ç¥ó¤ÈƱÍͤˤʤ뤳¤È¤òÌÜŪ¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fIclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹¤µ¤ì¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é\fImy\&.jar\fR¤Ë\fIBar\&.class\fR¥Õ¥¡¥¤¥ë¤¬Äɲ䵤ì¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)»þ¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fIfile\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤Î½èÍýÃæ¤Ë¥Ç¥£¥ì¥¯¥È¥ê¤ò°ì»þŪ¤ËÊѹ¹¤·¤Þ¤¹¡£¤³¤ÎÁàºî¤Ï¡¢\fBtar\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î\fB\-C\fR¥ª¥×¥·¥ç¥ó¤ÈƱÍͤˤʤ뤳¤È¤òÌÜŪ¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fBclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹¤µ¤ì¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é\fBmy\&.jar\fR¤Ë\fBBar\&.class\fR¥Õ¥¡¥¤¥ë¤¬Äɲ䵤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar uf my\&.jar \-C classes Bar\&.class ++\fBjar uf my\&.jar \-C classes Bar\&.class\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¡¢classes¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò\fImy\&.jar\fR¤ËÄɲä·¤Þ¤¹(JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fIclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤»¤ó)¡£¼¡¤Ë¸µ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÌá¤Ã¤Æ¤«¤é¡¢\fIbin\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¡¢\fIXyz\&.class\fR¤ò\fImy\&.jar\fR¤ËÄɲä·¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¡¢classes¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò\fBmy\&.jar\fR¤ËÄɲä·¤Þ¤¹(JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fBclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤»¤ó)¡£¼¡¤Ë¸µ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÌá¤Ã¤Æ¤«¤é¡¢\fBbin\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¡¢\fBXyz\&.class\fR¤ò\fBmy\&.jar\fR¤ËÄɲä·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar uf my\&.jar \-C classes \&. \-C bin Xyz\&.class ++\fBjar uf my\&.jar \-C classes \&. \-C bin Xyz\&.class\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIclasses\fR¤Ë\fIbar1\fR¥Õ¥¡¥¤¥ë¤È\fIbar2\fR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢Á°½Ò¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¼¡¤Î¤â¤Î¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++\fBclasses\fR¤Ë\fBbar1\fR¥Õ¥¡¥¤¥ë¤È\fBbar2\fR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢Á°½Ò¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¼¡¤Î¤â¤Î¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% \fIjar tf my\&.jar\fR +-META\-INF/ +-META\-INF/MANIFEST\&.MF +-bar1 +-bar2 +-Xyz\&.class ++\fB% \fR\fB\fBjar tf my\&.jar\fR\fR ++\fBMETA\-INF/\fR ++\fBMETA\-INF/MANIFEST\&.MF\fR ++\fBbar1\fR ++\fBbar2\fR ++\fBXyz\&.class\fR ++ + .fi + .if n \{\ + .RE +@@ -285,69 +297,72 @@ + .PP + \-J\fIoption\fR + .RS 4 +-»ØÄꤷ¤¿JVM¥ª¥×¥·¥ç¥ó¤ò¡¢JRE¤¬JAR¥Õ¥¡¥¤¥ë¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë»ÈÍѤ¹¤ë¤è¤¦¤ËÀßÄꤷ¤Þ¤¹¡£JVM¥ª¥×¥·¥ç¥ó¤Ï¡¢java(1)¥³¥Þ¥ó¥É¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ++»ØÄꤷ¤¿JVM¥ª¥×¥·¥ç¥ó¤ò¡¢JRE¤¬JAR¥Õ¥¡¥¤¥ë¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë»ÈÍѤ¹¤ë¤è¤¦¤ËÀßÄꤷ¤Þ¤¹¡£JVM¥ª¥×¥·¥ç¥ó¤Ï¡¢java(1)¥³¥Þ¥ó¥É¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .SH "¥ª¥Ú¥é¥ó¥É" + .PP +-¼¡¤Î¥ª¥Ú¥é¥ó¥É¤Ï¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Çǧ¼±¤µ¤ì¤Þ¤¹¡£ ++¼¡¤Î¥ª¥Ú¥é¥ó¥É¤Ï¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Çǧ¼±¤µ¤ì¤Þ¤¹¡£ + .PP + \fIfile\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)»þ¤Ë¡¢\fIfile\fR¥ª¥Ú¥é¥ó¥É¤Ï¡¢¥¢¡¼¥«¥¤¥Ö¤ËÄɲ乤ëɬÍפΤ¢¤ë¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤Î¥Ñ¥¹¤È̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤ÎÃê½Ð(\fIx\fR)¤Þ¤¿¤Ï¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È(\fIt\fR)»þ¤Ë¡¢\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ÏÃê½Ð¤Þ¤¿¤Ï¥ê¥¹¥È¤¹¤ë¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£¾¯¤Ê¤¯¤È¤â1¤Ä¤ÎÍ­¸ú¤Ê¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Ê£¿ô¤Î\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ò¶õÇò¤Ç¶èÀÚ¤ê¤Þ¤¹¡£\fIentrypoint\fR¡¢\fIjarfile\fR¤Þ¤¿¤Ï\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¤Ï¡¢¤½¤Î¸å¤Ë\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)»þ¤Ë¡¢\fIfile\fR¥ª¥Ú¥é¥ó¥É¤Ï¡¢¥¢¡¼¥«¥¤¥Ö¤ËÄɲ乤ëɬÍפΤ¢¤ë¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤Î¥Ñ¥¹¤È̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤ÎÃê½Ð(\fBx\fR)¤Þ¤¿¤Ï¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È(\fBt\fR)»þ¤Ë¡¢\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ÏÃê½Ð¤Þ¤¿¤Ï¥ê¥¹¥È¤¹¤ë¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£¾¯¤Ê¤¯¤È¤â1¤Ä¤ÎÍ­¸ú¤Ê¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Ê£¿ô¤Î\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ò¶õÇò¤Ç¶èÀÚ¤ê¤Þ¤¹¡£\fIentrypoint\fR¡¢\fIjarfile\fR¤Þ¤¿¤Ï\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¤Ï¡¢¤½¤Î¸å¤Ë\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \fIentrypoint\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)»þ¤Ë¡¢\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤Ï¡¢¼Â¹Ô²ÄǽJAR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤Æ¤¤¤ë¥¹¥¿¥ó¥É¥¢¥í¥óJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤È¤Ê¤ë¥¯¥é¥¹¤Î̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£\fIe\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)»þ¤Ë¡¢\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤Ï¡¢¼Â¹Ô²ÄǽJAR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤Æ¤¤¤ë¥¹¥¿¥ó¥É¥¢¥í¥óJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤È¤Ê¤ë¥¯¥é¥¹¤Î̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£\fBe\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \fIjarfile\fR + .RS 4 +-ºîÀ®(\fIc\fR)¡¢¹¹¿·(\fIu\fR)¡¢Ãê½Ð(\fIx\fR)¤Þ¤¿¤Ïɽ¼¨(\fIt\fR)¤¹¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£\fIf\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIf\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò¾Êά¤¹¤ë¤È¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ë¡¢\fIstdin\fR¤«¤é¤ÎJAR¥Õ¥¡¥¤¥ë̾¤ò¼õ¤±Æþ¤ì¤ë¤«(\fIx\fR¤ª¤è¤Ó\fIt\fR¤Î¾ì¹ç)¡¢JAR¥Õ¥¡¥¤¥ë¤ò\fIstdout\fR¤ËÁ÷¿®¤¹¤ë¤³¤È(\fIc\fR¤ª¤è¤Ó\fIu\fR¤Î¾ì¹ç)¤¬»Ø¼¨¤µ¤ì¤Þ¤¹¡£ ++ºîÀ®(\fBc\fR)¡¢¹¹¿·(\fBu\fR)¡¢Ãê½Ð(\fBx\fR)¤Þ¤¿¤Ïɽ¼¨(\fBt\fR)¤¹¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£\fBf\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBf\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò¾Êά¤¹¤ë¤È¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ë¡¢\fBstdin\fR¤«¤é¤ÎJAR¥Õ¥¡¥¤¥ë̾¤ò¼õ¤±Æþ¤ì¤ë¤«(\fBx\fR¤ª¤è¤Ó\fBt\fR¤Î¾ì¹ç)¡¢JAR¥Õ¥¡¥¤¥ë¤ò\fBstdout\fR¤ËÁ÷¿®¤¹¤ë¤³¤È(\fBc\fR¤ª¤è¤Ó\fBu\fR¤Î¾ì¹ç)¤¬»Ø¼¨¤µ¤ì¤Þ¤¹¡£ + .sp +-JAR¥Õ¥¡¥¤¥ë¤òº÷°úÉÕ¤±(\fIi\fR)¤¹¤ë¾ì¹ç¤Ï¡¢\fIf\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤Ç\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤷ¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤òº÷°úÉÕ¤±(\fBi\fR)¤¹¤ë¾ì¹ç¤Ï¡¢\fBf\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤Ç\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \fImanifest\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)»þ¤Ë¡¢\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ÏJAR¥Õ¥¡¥¤¥ë¤Î\fIMANIFEST\&.MF\fR¤Ë´Þ¤á¤ë°À­¤Î̾Á°¤ÈÃͤò»ý¤Ä´û¸¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤òÄêµÁ¤·¤Þ¤¹¡£\fIf\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)»þ¤Ë¡¢\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ÏJAR¥Õ¥¡¥¤¥ë¤Î\fBMANIFEST\&.MF\fR¤Ë´Þ¤á¤ë°À­¤Î̾Á°¤ÈÃͤò»ý¤Ä´û¸¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤òÄêµÁ¤·¤Þ¤¹¡£\fBf\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \fI@arg\-file\fR + .RS 4 +-\fIjar\fR¥³¥Þ¥ó¥É¤òû½Ì¤Þ¤¿¤Ï´ÊÁDz½¤¹¤ë¤Ë¤Ï¡¢Ê̤Υƥ­¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤ò»ØÄꤷ¡¢ÀÜƬ¼­¤È¤·¤Æ¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤òÉÕ¤±¤Æ\fIjar\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIjar\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯Ê¸»ú¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤òû½Ì¤Þ¤¿¤Ï´ÊÁDz½¤¹¤ë¤Ë¤Ï¡¢Ê̤Υƥ­¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤ò»ØÄꤷ¡¢ÀÜƬ¼­¤È¤·¤Æ¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤òÉÕ¤±¤Æ\fBjar\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBjar\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯Ê¸»ú¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ + .sp +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤È°ú¿ô(°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Ê¤¤µ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤ë\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤Ï¡¢¶õÇò¤Þ¤¿¤Ï²þ¹Ôʸ»ú¤Ç¶èÀڤ뤳¤È¤¬¤Ç¤­¤Þ¤¹¡£°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢\fIjar\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÂФ·¤ÆÁêÂÐŪ¤Ç¤¢¤ê¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î¾ì½ê¤ËÂФ·¤Æ¤ÏÁêÂÐŪ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£Ä̾ï¤Ï¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥·¥§¥ë¤Ë¤è¤Ã¤ÆŸ³«¤µ¤ì¤ë¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ê¤É¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÏŸ³«¤µ¤ì¤Þ¤»¤ó¡£ ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤È°ú¿ô(°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Ê¤¤µ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤ë\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤Ï¡¢¶õÇò¤Þ¤¿¤Ï²þ¹Ôʸ»ú¤Ç¶èÀڤ뤳¤È¤¬¤Ç¤­¤Þ¤¹¡£°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢\fBjar\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÂФ·¤ÆÁêÂÐŪ¤Ç¤¢¤ê¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î¾ì½ê¤ËÂФ·¤Æ¤ÏÁêÂÐŪ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£Ä̾ï¤Ï¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥·¥§¥ë¤Ë¤è¤Ã¤ÆŸ³«¤µ¤ì¤ë¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ê¤É¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÏŸ³«¤µ¤ì¤Þ¤»¤ó¡£ + .sp +-¼¡¤ÎÎã¤Ï¡¢\fIfind\fR¥³¥Þ¥ó¥É¤Ë¤è¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê½ÐÎϤ«¤é¤Î¥Õ¥¡¥¤¥ë̾¤Ç\fIclasses\&.list\fR¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ï¡¢\fBfind\fR¥³¥Þ¥ó¥É¤Ë¤è¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê½ÐÎϤ«¤é¤Î¥Õ¥¡¥¤¥ë̾¤Ç\fBclasses\&.list\fR¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-find \&. \-name \*(Aq*\&.class\*(Aq \-print > classes\&.list ++\fBfind \&. \-name \*(Aq*\&.class\*(Aq \-print > classes\&.list\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIjar\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢\fI@arg\-file\fR¹½Ê¸¤ò»ÈÍѤ·¤Æ\fIclasses\&.list\fR¥Õ¥¡¥¤¥ë¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢\fI@arg\-file\fR¹½Ê¸¤ò»ÈÍѤ·¤Æ\fBclasses\&.list\fR¥Õ¥¡¥¤¥ë¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar cf my\&.jar @classes\&.list ++\fBjar cf my\&.jar @classes\&.list\fR ++ + .fi + .if n \{\ + .RE + .\} +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢ÁêÂХѥ¹¤¬µ­½Ò¤µ¤ì¤¿°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢ÅϤµ¤ì¤¿¥Ñ¥¹¤ËÂФ·¤ÆÁêÂÐŪ¤Ç¤Ï¤Ê¤¯¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Î¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢ÁêÂХѥ¹¤¬µ­½Ò¤µ¤ì¤¿°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢ÅϤµ¤ì¤¿¥Ñ¥¹¤ËÂФ·¤ÆÁêÂÐŪ¤Ç¤Ï¤Ê¤¯¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Î¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar @dir/classes\&.list ++\fBjar @dir/classes\&.list\fR ++ + .fi + .if n \{\ + .RE +@@ -355,86 +370,95 @@ + .RE + .SH "Ãí°Õ" + .PP +-\fIe\fR¡¢\fIf\fR¤ª¤è¤Ó\fIm\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIentrypoint\fR¡¢\fIjarfile\fR¤ª¤è¤Ó\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ÈƱ¤¸½ç½ø¤Ç¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë½Ð¸½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBe\fR¡¢\fBf\fR¤ª¤è¤Ó\fBm\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIentrypoint\fR¡¢\fIjarfile\fR¤ª¤è¤Ó\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ÈƱ¤¸½ç½ø¤Ç¥³¥Þ¥ó¥É¹Ô¤Ë½Ð¸½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar cmef myManifestFile MyMainClass myFile\&.jar *\&.class ++\fBjar cmef myManifestFile MyMainClass myFile\&.jar *\&.class\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "Îã" + .PP +-\fBExample 1\fR, ¾éĹ¤Ê½ÐÎϤˤè¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ÎÄɲà ++\fBÎã 1\fR ++.br ++¾éĹ¤Ê½ÐÎϤˤè¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ÎÄɲà + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% ls +-1\&.au Animator\&.class monkey\&.jpg +-2\&.au Wave\&.class spacemusic\&.au +-3\&.au at_work\&.gif +- +-% jar cvf bundle\&.jar * +-added manifest +-adding: 1\&.au(in = 2324) (out= 67)(deflated 97%) +-adding: 2\&.au(in = 6970) (out= 90)(deflated 98%) +-adding: 3\&.au(in = 11616) (out= 108)(deflated 99%) +-adding: Animator\&.class(in = 2266) (out= 66)(deflated 97%) +-adding: Wave\&.class(in = 3778) (out= 81)(deflated 97%) +-adding: at_work\&.gif(in = 6621) (out= 89)(deflated 98%) +-adding: monkey\&.jpg(in = 7667) (out= 91)(deflated 98%) +-adding: spacemusic\&.au(in = 3079) (out= 73)(deflated 97%) ++\fB% ls\fR ++\fB1\&.au Animator\&.class monkey\&.jpg\fR ++\fB2\&.au Wave\&.class spacemusic\&.au\fR ++\fB3\&.au at_work\&.gif\fR ++ ++\fB% jar cvf bundle\&.jar *\fR ++\fBadded manifest\fR ++\fBadding: 1\&.au(in = 2324) (out= 67)(deflated 97%)\fR ++\fBadding: 2\&.au(in = 6970) (out= 90)(deflated 98%)\fR ++\fBadding: 3\&.au(in = 11616) (out= 108)(deflated 99%)\fR ++\fBadding: Animator\&.class(in = 2266) (out= 66)(deflated 97%)\fR ++\fBadding: Wave\&.class(in = 3778) (out= 81)(deflated 97%)\fR ++\fBadding: at_work\&.gif(in = 6621) (out= 89)(deflated 98%)\fR ++\fBadding: monkey\&.jpg(in = 7667) (out= 91)(deflated 98%)\fR ++\fBadding: spacemusic\&.au(in = 3079) (out= 73)(deflated 97%)\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¥Õ¥¡¥¤¥ë¤ÎÄɲà ++\fBÎã 2\fR ++.br ++¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¥Õ¥¡¥¤¥ë¤ÎÄɲà + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% ls \-F +-audio/ classes/ images/ +-% jar cvf bundle\&.jar audio classes images +-added manifest +-adding: audio/(in = 0) (out= 0)(stored 0%) +-adding: audio/1\&.au(in = 2324) (out= 67)(deflated 97%) +-adding: audio/2\&.au(in = 6970) (out= 90)(deflated 98%) +-adding: audio/3\&.au(in = 11616) (out= 108)(deflated 99%) +-adding: audio/spacemusic\&.au(in = 3079) (out= 73)(deflated 97%) +-adding: classes/(in = 0) (out= 0)(stored 0%) +-adding: classes/Animator\&.class(in = 2266) (out= 66)(deflated 97%) +-adding: classes/Wave\&.class(in = 3778) (out= 81)(deflated 97%) +-adding: images/(in = 0) (out= 0)(stored 0%) +-adding: images/monkey\&.jpg(in = 7667) (out= 91)(deflated 98%) +-adding: images/at_work\&.gif(in = 6621) (out= 89)(deflated 98%) +- +-% ls \-F +-audio/ bundle\&.jar classes/ images/ ++\fB% ls \-F\fR ++\fBaudio/ classes/ images/\fR ++\fB% jar cvf bundle\&.jar audio classes images\fR ++\fBadded manifest\fR ++\fBadding: audio/(in = 0) (out= 0)(stored 0%)\fR ++\fBadding: audio/1\&.au(in = 2324) (out= 67)(deflated 97%)\fR ++\fBadding: audio/2\&.au(in = 6970) (out= 90)(deflated 98%)\fR ++\fBadding: audio/3\&.au(in = 11616) (out= 108)(deflated 99%)\fR ++\fBadding: audio/spacemusic\&.au(in = 3079) (out= 73)(deflated 97%)\fR ++\fBadding: classes/(in = 0) (out= 0)(stored 0%)\fR ++\fBadding: classes/Animator\&.class(in = 2266) (out= 66)(deflated 97%)\fR ++\fBadding: classes/Wave\&.class(in = 3778) (out= 81)(deflated 97%)\fR ++\fBadding: images/(in = 0) (out= 0)(stored 0%)\fR ++\fBadding: images/monkey\&.jpg(in = 7667) (out= 91)(deflated 98%)\fR ++\fBadding: images/at_work\&.gif(in = 6621) (out= 89)(deflated 98%)\fR ++ ++\fB% ls \-F\fR ++\fBaudio/ bundle\&.jar classes/ images/\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, JAR¤Î¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È ++\fBÎã 3\fR ++.br ++JAR¤Î¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% jar tf bundle\&.jar ++\fB% jar tf bundle\&.jar\fR + .fi + .if n \{\ + .RE +@@ -444,45 +468,50 @@ + .RS 4 + .\} + .nf +-META\-INF/ +-META\-INF/MANIFEST\&.MF +-audio/1\&.au +-audio/2\&.au +-audio/3\&.au +-audio/spacemusic\&.au +-classes/Animator\&.class +-classes/Wave\&.class +-images/monkey\&.jpg +-images/at_work\&.gif ++\fBMETA\-INF/\fR ++\fBMETA\-INF/MANIFEST\&.MF\fR ++\fBaudio/1\&.au\fR ++\fBaudio/2\&.au\fR ++\fBaudio/3\&.au\fR ++\fBaudio/spacemusic\&.au\fR ++\fBclasses/Animator\&.class\fR ++\fBclasses/Wave\&.class\fR ++\fBimages/monkey\&.jpg\fR ++\fBimages/at_work\&.gif\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 4\fR, º÷°ú¤ÎÄɲà ++\fBÎã 4\fR ++.br ++º÷°ú¤ÎÄɲà + .RS 4 +-³ô¼°¼è°ú¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÁê¸ß°Í¸¥¯¥é¥¹¤ò¡¢\fImain\&.jar\fR¡¢\fIbuy\&.jar\fR¤ª¤è¤Ó\fIsell\&.jar\fR¤Î3¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤¹¤ë¾ì¹ç¡¢\fIi\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fImain\&.jar\fR¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î\fIClass\-Path\fR°À­¤ò»ØÄꤹ¤ë¾ì¹ç¡¢\fIi\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥É¤Î®ÅÙ¤ò¸þ¾å¤Ç¤­¤Þ¤¹¡£ ++³ô¼°¼è°ú¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÁê¸ß°Í¸¥¯¥é¥¹¤ò¡¢\fBmain\&.jar\fR¡¢\fBbuy\&.jar\fR¤ª¤è¤Ó\fBsell\&.jar\fR¤Î3¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤¹¤ë¾ì¹ç¡¢\fBi\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fBmain\&.jar\fR¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î\fBClass\-Path\fR°À­¤ò»ØÄꤹ¤ë¾ì¹ç¡¢\fBi\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥É¤Î®ÅÙ¤ò¸þ¾å¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Class\-Path: buy\&.jar sell\&.jar +-jar i main\&.jar ++\fBClass\-Path: buy\&.jar sell\&.jar\fR ++\fBjar i main\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIINDEX\&.LIST\fR¥Õ¥¡¥¤¥ë¤¬\fIMETA\-INF\fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÁÞÆþ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ë¤è¤Ã¤Æ¥¯¥é¥¹¤Þ¤¿¤Ï¥ê¥½¡¼¥¹¤Î¸¡º÷¤¬¹Ô¤ï¤ì¤ë¤È¤­¤Ë¡¢»ØÄꤷ¤¿JAR¥Õ¥¡¥¤¥ë¤¬¥À¥¦¥ó¥í¡¼¥É¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBINDEX\&.LIST\fR¥Õ¥¡¥¤¥ë¤¬\fBMETA\-INF\fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÁÞÆþ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ë¤è¤Ã¤Æ¥¯¥é¥¹¤Þ¤¿¤Ï¥ê¥½¡¼¥¹¤Î¸¡º÷¤¬¹Ô¤ï¤ì¤ë¤È¤­¤Ë¡¢»ØÄꤷ¤¿JAR¥Õ¥¡¥¤¥ë¤¬¥À¥¦¥ó¥í¡¼¥É¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢¸úΨŪ¤Ë¥¯¥é¥¹¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ò¥³¥Ô¡¼¤¹¤ë¤Ë¤Ï¡¢ºÇ½é¤Ë\fIdir1\fRÆâ¤Î¥Õ¥¡¥¤¥ë¤ò\fIstdout\fR¤Ë°µ½Ì¤·¤Æ¤«¤é¡¢\fIstdin\fR¤«¤é\fIdir2\fR¤Ë¥Ñ¥¤¥×¥é¥¤¥ó¤òºîÀ®¤·¤ÆÃê½Ð¤·¤Þ¤¹(\fI\-f\fR¥ª¥×¥·¥ç¥ó¤ÏξÊý¤Î\fIjar\fR¥³¥Þ¥ó¥É¤Ç¾Êά¤·¤Þ¤¹)¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢¸úΨŪ¤Ë¥¯¥é¥¹¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ò¥³¥Ô¡¼¤¹¤ë¤Ë¤Ï¡¢ºÇ½é¤Ë\fBdir1\fRÆâ¤Î¥Õ¥¡¥¤¥ë¤ò\fBstdout\fR¤Ë°µ½Ì¤·¤Æ¤«¤é¡¢\fBstdin\fR¤«¤é\fBdir2\fR¤Ë¥Ñ¥¤¥×¥é¥¤¥ó¤òºîÀ®¤·¤ÆÃê½Ð¤·¤Þ¤¹(\fB\-f\fR¥ª¥×¥·¥ç¥ó¤ÏξÊý¤Î\fBjar\fR¥³¥Þ¥ó¥É¤Ç¾Êά¤·¤Þ¤¹)¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-(cd dir1; jar c \&.) | (cd dir2; jar x) ++\fB(cd dir1; jar c \&.) | (cd dir2; jar x)\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/linux/doc/man/ja/jarsigner.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jarsigner.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jarsigner +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jarsigner ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jarsigner" "1" "2013ǯ11·î21Æü" "JDK 8" "¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jarsigner \- Java¥¢¡¼¥«¥¤¥Ö(JAR)¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ½ð̾¤ª¤è¤Ó¸¡¾Ú¤ò¹Ô¤¤¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjarsigner\fR [ \fIoptions\fR ] \fIjar\-file\fR \fIalias\fR ++\fBjarsigner\fR [ \fIoptions\fR ] \fIjar\-file\fR \fIalias\fR + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjarsigner\fR \fI\-verify\fR [ \fIoptions\fR ] \fIjar\-file\fR [\fIalias \&.\&.\&.\fR] ++\fBjarsigner\fR \fB\-verify\fR [ \fIoptions\fR ] \fIjar\-file\fR [\fIalias \&.\&.\&.\fR] + .fi + .if n \{\ + .RE +@@ -74,30 +76,30 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-verify + .RS 4 +-\fI\-verify\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ë̾¤Î¸å¤Ë0¸Ä°Ê¾å¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fI\-verify\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ½ð̾ÉÕ¤­¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸¡¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬¡¢¤¤¤º¤ì¤«¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤Ë°ìÃפ¹¤ë¤³¤È¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ÊÌ̾¤Ï¡¢\fI\-keystore\fR¤Ç»ØÄꤵ¤ì¤¿¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢Æâ¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ ++\fB\-verify\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ë̾¤Î¸å¤Ë0¸Ä°Ê¾å¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fB\-verify\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ½ð̾ÉÕ¤­¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸¡¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬¡¢¤¤¤º¤ì¤«¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤Ë°ìÃפ¹¤ë¤³¤È¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ÊÌ̾¤Ï¡¢\fB\-keystore\fR¤Ç»ØÄꤵ¤ì¤¿¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢Æâ¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢¥á¥Ã¥»¡¼¥¸¡Öjar¤¬¸¡¾Ú¤µ¤ì¤Þ¤·¤¿¡£½ð̾¼Ô¥¨¥é¡¼¡×¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢¥á¥Ã¥»¡¼¥¸¡Öjar¤¬¸¡¾Ú¤µ¤ì¤Þ¤·¤¿¡£½ð̾¼Ô¥¨¥é¡¼¡×¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \fIjar\-file\fR + .RS 4 + ½ð̾¤µ¤ì¤ëJAR¥Õ¥¡¥¤¥ë¡£ + .sp +-\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢¥á¥Ã¥»¡¼¥¸¡Öjar¤Ï½ð̾¤µ¤ì¤Þ¤·¤¿ \- ½ð̾¼Ô¥¨¥é¡¼¤¬¤¢¤ê¤Þ¤¹¡£¡×¤È¤¤¤¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢¥á¥Ã¥»¡¼¥¸¡Öjar¤Ï½ð̾¤µ¤ì¤Þ¤·¤¿ \- ½ð̾¼Ô¥¨¥é¡¼¤¬¤¢¤ê¤Þ¤¹¡£¡×¤È¤¤¤¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \fIalias\fR + .RS 4 +-ÊÌ̾¤Ï¡¢\fI\-keystore\fR¤Ç»ØÄꤵ¤ì¤¿¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢Æâ¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ ++ÊÌ̾¤Ï¡¢\fB\-keystore\fR¤Ç»ØÄꤵ¤ì¤¿¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢Æâ¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjarsigner\fR¥Ä¡¼¥ë¤Ë¤Ï¡¢¼¡¤Î2¤Ä¤ÎÌÜŪ¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBjarsigner\fR¥Ä¡¼¥ë¤Ë¤Ï¡¢¼¡¤Î2¤Ä¤ÎÌÜŪ¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -121,7 +123,7 @@ + ½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ÈÀ°¹çÀ­¤ò¸¡¾Ú¤¹¤ëÌÜŪ¡£ + .RE + .PP +-JARµ¡Ç½¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥¤¥á¡¼¥¸¡¢¥µ¥¦¥ó¥É¤ª¤è¤Ó¤½¤Î¾¤Î¥Ç¥¸¥¿¥ë¡¦¥Ç¡¼¥¿¤òñ°ì¤Î¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸²½¤Ç¤­¤ë¤Î¤Ç¡¢¥Õ¥¡¥¤¥ë¤ò¿×®¤«¤ÄÍưפËÇÛÉۤǤ­¤Þ¤¹¡£\fIjar\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¡¢³«È¯¼Ô¤ÏJAR¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£(µ»½ÑŪ¤Ê´ÑÅÀ¤«¤é¸À¤¨¤Ð¡¢¤¹¤Ù¤Æ¤ÎZIP¥Õ¥¡¥¤¥ë¤âJAR¥Õ¥¡¥¤¥ë¤È¤ß¤Ê¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ½èÍý¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤â´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£) ++JARµ¡Ç½¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥¤¥á¡¼¥¸¡¢¥µ¥¦¥ó¥É¤ª¤è¤Ó¤½¤Î¾¤Î¥Ç¥¸¥¿¥ë¡¦¥Ç¡¼¥¿¤òñ°ì¤Î¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸²½¤Ç¤­¤ë¤Î¤Ç¡¢¥Õ¥¡¥¤¥ë¤ò¿×®¤«¤ÄÍưפËÇÛÉۤǤ­¤Þ¤¹¡£\fBjar\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¡¢³«È¯¼Ô¤ÏJAR¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£(µ»½ÑŪ¤Ê´ÑÅÀ¤«¤é¸À¤¨¤Ð¡¢¤¹¤Ù¤Æ¤ÎZIP¥Õ¥¡¥¤¥ë¤âJAR¥Õ¥¡¥¤¥ë¤È¤ß¤Ê¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ½èÍý¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤â´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£) + .PP + ¥Ç¥¸¥¿¥ë½ð̾¤Ï¡¢¤Ê¤ó¤é¤«¤Î¥Ç¡¼¥¿(½ð̾¤ÎÂоݤȤʤë¥Ç¡¼¥¿)¡¢¤ª¤è¤Ó¥¨¥ó¥Æ¥£¥Æ¥£(¿Í¡¢²ñ¼Ò¤Ê¤É)¤ÎÈëÌ©¸°¤«¤é·×»»¤µ¤ì¤ë¥Ó¥Ã¥È¤Îʸ»úÎó¤Ç¤¹¡£¼ê½ñ¤­¤Î½ð̾ƱÍÍ¡¢¥Ç¥¸¥¿¥ë½ð̾¤Ë¤Ï¿¤¯¤ÎÍøÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +@@ -171,97 +173,101 @@ + .PP + ¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¨¥ó¥Æ¥£¥Æ¥£¤Î½ð̾¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢¤Þ¤º¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢¤½¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ë´ØÏ¢¤¹¤ë¸ø³«¸°/ÈëÌ©¸°¤Î¥Ú¥¢¤È¡¢¸ø³«¸°¤òǧ¾Ú¤¹¤ë1¤Ä°Ê¾å¤Î¾ÚÌÀ½ñ¤ò»ý¤ÄɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÚÌÀ½ñ¤È¤Ï¡¢¤¢¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤«¤é¤Î¥Ç¥¸¥¿¥ë½ð̾ÉÕ¤­¤Îʸ½ñ¤Ç¡¢Ê̤Υ¨¥ó¥Æ¥£¥Æ¥£¤Î¸ø³«¸°¤¬ÆÃÄê¤ÎÃͤò»ý¤Ä¤³¤È¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤«¤é¤Î¸°¤È¾ÚÌÀ½ñ¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢JAR¥Õ¥¡¥¤¥ë¤Î¥Ç¥¸¥¿¥ë½ð̾¤òÀ¸À®¤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¡¢ÈëÌ©¸°¡¢¤ª¤è¤ÓÂбþ¤¹¤ë¸ø³«¸°¤òǧ¾Ú¤¹¤ë¡¢ÈëÌ©¸°¤Ë´ØÏ¢¤·¤¿X\&.509¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ç¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢¤òºîÀ®¤ª¤è¤Ó´ÉÍý¤·¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤«¤é¤Î¸°¤È¾ÚÌÀ½ñ¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢JAR¥Õ¥¡¥¤¥ë¤Î¥Ç¥¸¥¿¥ë½ð̾¤òÀ¸À®¤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¡¢ÈëÌ©¸°¡¢¤ª¤è¤ÓÂбþ¤¹¤ë¸ø³«¸°¤òǧ¾Ú¤¹¤ë¡¢ÈëÌ©¸°¤Ë´ØÏ¢¤·¤¿X\&.509¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ç¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢¤òºîÀ®¤ª¤è¤Ó´ÉÍý¤·¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤ÎÈëÌ©¸°¤ò»ÈÍѤ·¤Æ½ð̾¤òÀ¸À®¤·¤Þ¤¹¡£½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Æäˡ¢¥Õ¥¡¥¤¥ë¤Ø¤Î½ð̾¤Ë»ÈÍѤ¹¤ëÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤Î¥­¡¼¥¹¥È¥¢¤«¤é¤Î¾ÚÌÀ½ñ¤Î¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Þ¤¹¡£\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÆâÉô(½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ëÆâ)¤Î¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î¥Ç¥¸¥¿¥ë½ð̾¤ò¸¡¾Ú¤Ç¤­¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤ÎÈëÌ©¸°¤ò»ÈÍѤ·¤Æ½ð̾¤òÀ¸À®¤·¤Þ¤¹¡£½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Æäˡ¢¥Õ¥¡¥¤¥ë¤Ø¤Î½ð̾¤Ë»ÈÍѤ¹¤ëÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤Î¥­¡¼¥¹¥È¥¢¤«¤é¤Î¾ÚÌÀ½ñ¤Î¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Þ¤¹¡£\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÆâÉô(½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ëÆâ)¤Î¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î¥Ç¥¸¥¿¥ë½ð̾¤ò¸¡¾Ú¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢½ð̾¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü´ÖÃæ¤ËJAR¥Õ¥¡¥¤¥ë¤¬½ð̾¤µ¤ì¤¿¤µ¤ì¤¿¤«¤É¤¦¤«¤ò¥·¥¹¥Æ¥à¤ä¥Ç¥×¥í¥¤¥ä(Java Plug\-in¤ò´Þ¤à)¤¬¥Á¥§¥Ã¥¯¤Ç¤­¤ë¡¢¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤à½ð̾¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë¡¢API¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¥¿¥¤¥à¥¹¥¿¥ó¥×¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢½ð̾¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü´ÖÃæ¤ËJAR¥Õ¥¡¥¤¥ë¤¬½ð̾¤µ¤ì¤¿¤µ¤ì¤¿¤«¤É¤¦¤«¤ò¥·¥¹¥Æ¥à¤ä¥Ç¥×¥í¥¤¥ä(Java Plug\-in¤ò´Þ¤à)¤¬¥Á¥§¥Ã¥¯¤Ç¤­¤ë¡¢¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤à½ð̾¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë¡¢API¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¥¿¥¤¥à¥¹¥¿¥ó¥×¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£ + .PP +-¸½»þÅÀ¤Ç¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Þ¤¿¤ÏZIP¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Î¤ß¤Ë½ð̾¤Ç¤­¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤ÏZIP¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤Ç¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fIMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤â´Þ¤Þ¤ì¤Æ¤¤¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£\fIMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆZIP¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ëºÝ¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ ++¸½»þÅÀ¤Ç¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Þ¤¿¤ÏZIP¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Î¤ß¤Ë½ð̾¤Ç¤­¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤ÏZIP¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤Ç¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fBMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤â´Þ¤Þ¤ì¤Æ¤¤¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£\fBMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆZIP¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ëºÝ¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Î\fIjarsigner\fR¥³¥Þ¥ó¥É¤ÎÆ°ºî¤Ç¤Ï¡¢JAR¤Þ¤¿¤ÏZIP¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£\fI\-verify\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤·¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Î\fBjarsigner\fR¥³¥Þ¥ó¥É¤ÎÆ°ºî¤Ç¤Ï¡¢JAR¤Þ¤¿¤ÏZIP¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£\fB\-verify\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤·¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢½ð̾¤Þ¤¿¤Ï¸¡¾Ú¤Î¸å¤Ë½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤Î¸¡¾Ú¤â»î¹Ô¤·¤Þ¤¹¡£¸¡¾Ú¥¨¥é¡¼¤Þ¤¿¤Ï¤½¤Î¾¤ÎÌäÂ꤬ȯÀ¸¤¹¤ë¤È¡¢¥³¥Þ¥ó¥É¤Ë¤è¤ê·Ù¹ð¥á¥Ã¥»¡¼¥¸¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¥¨¥é¡¼¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£¥¨¥é¡¼¤È·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢½ð̾¤Þ¤¿¤Ï¸¡¾Ú¤Î¸å¤Ë½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤Î¸¡¾Ú¤â»î¹Ô¤·¤Þ¤¹¡£¸¡¾Ú¥¨¥é¡¼¤Þ¤¿¤Ï¤½¤Î¾¤ÎÌäÂ꤬ȯÀ¸¤¹¤ë¤È¡¢¥³¥Þ¥ó¥É¤Ë¤è¤ê·Ù¹ð¥á¥Ã¥»¡¼¥¸¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¥¨¥é¡¼¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£¥¨¥é¡¼¤È·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾" + .PP + ¥­¡¼¥¹¥È¥¢¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢°ì°Õ¤ÎÊÌ̾¤ò»ÈÍѤ·¤Æ¥¢¥¯¥»¥¹¤µ¤ì¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¤È¤­¤Ï¡¢½ð̾¤ÎÀ¸À®¤ËɬÍפÊÈëÌ©¸°¤ò´Þ¤à¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÊÌ̾¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIworking\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fImystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤Ë´Þ¤Þ¤ì¤ëÊÌ̾\fIduke\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤ò»ÈÍѤ·¤Æ¡¢\fIMyJARFile\&.jar\fR¤È¤¤¤¦Ì¾Á°¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ï»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢\fIMyJARFile\&.jar\fR¤Ï½ð̾ÉÕ¤­¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤Æ¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¤È¤­¤Ï¡¢½ð̾¤ÎÀ¸À®¤ËɬÍפÊÈëÌ©¸°¤ò´Þ¤à¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÊÌ̾¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBworking\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fBmystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤Ë´Þ¤Þ¤ì¤ëÊÌ̾\fBduke\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤ò»ÈÍѤ·¤Æ¡¢\fBMyJARFile\&.jar\fR¤È¤¤¤¦Ì¾Á°¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ï»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢\fBMyJARFile\&.jar\fR¤Ï½ð̾ÉÕ¤­¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤Æ¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore /working/mystore \-storepass +- \-keypass MyJARFile\&.jar duke ++\fBjarsigner \-keystore /working/mystore \-storepass \fR ++\fB \-keypass MyJARFile\&.jar duke\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥­¡¼¥¹¥È¥¢¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤¤¤È¡¢ÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£Æ±Íͤˡ¢ÈëÌ©¸°¤â¥­¡¼¥¹¥È¥¢Æâ¤Ç¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Æ¤¤¤ë¤¿¤á¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¤Þ¤¿¤Ï»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥È¤¬Êݸ¤µ¤ì¤Æ¤¤¤ë¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤¤¤È¡¢ÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£Æ±Íͤˡ¢ÈëÌ©¸°¤â¥­¡¼¥¹¥È¥¢Æâ¤Ç¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Æ¤¤¤ë¤¿¤á¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¤Þ¤¿¤Ï»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥È¤¬Êݸ¤µ¤ì¤Æ¤¤¤ë¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .SS "¥­¡¼¥¹¥È¥¢¤Î¾ì½ê" + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢»ÈÍѤ¹¤ë¥­¡¼¥¹¥È¥¢¤ÎURL¤ò»ØÄꤹ¤ë\fI\-keystore\fR¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¡¢\fIuser\&.home\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç·è¤Þ¤ë¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î\fI\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ëÆâ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢»ÈÍѤ¹¤ë¥­¡¼¥¹¥È¥¢¤ÎURL¤ò»ØÄꤹ¤ë\fB\-keystore\fR¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¡¢\fBuser\&.home\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç·è¤Þ¤ë¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î\fB\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ëÆâ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .PP +-Oracle Solaris¥·¥¹¥Æ¥à¤Î¾ì¹ç¡¢\fIuser\&.home\fR¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ ++Oracle Solaris¥·¥¹¥Æ¥à¤Î¾ì¹ç¡¢\fBuser\&.home\fR¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ + .PP +-\fI\-keystore\fR¥ª¥×¥·¥ç¥ó¤«¤é¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¡¢\fIKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£URL¤È¤·¤Æ\fINONE\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢null¤Î¥¹¥È¥ê¡¼¥à¤¬\fIKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£\fINONE\fR¤Ï¡¢\fIKeyStore\fR¥¯¥é¥¹¤¬¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¡¦¥Ç¥Ð¥¤¥¹¤ËÃÖ¤«¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fB\-keystore\fR¥ª¥×¥·¥ç¥ó¤«¤é¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¡¢\fBKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£URL¤È¤·¤Æ\fBNONE\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢null¤Î¥¹¥È¥ê¡¼¥à¤¬\fBKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£\fBNONE\fR¤Ï¡¢\fBKeyStore\fR¥¯¥é¥¹¤¬¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¡¦¥Ç¥Ð¥¤¥¹¤ËÃÖ¤«¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë»ØÄꤷ¤Þ¤¹¡£ + .SS "¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ" + .PP +-\fIjava\&.security package\fR¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë\fIKeyStore\fR¥¯¥é¥¹¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¾ðÊó¤Ø¤Î¥¢¥¯¥»¥¹¤ª¤è¤Ó¾ðÊó¤ÎÊѹ¹¤ò¹Ô¤¦¤¿¤á¤Î¡¢ÌÀ³Î¤ËÄêµÁ¤µ¤ì¤¿Â¿¤¯¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£Ê£¿ô¤Î°Û¤Ê¤ë¸ÇÄê¼ÂÁõ¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¡¢³Æ¼ÂÁõ¤ÏÆÃÄê¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤òÂоݤȤ·¤Þ¤¹¡£ ++\fBjava\&.security package\fR¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë\fBKeyStore\fR¥¯¥é¥¹¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¾ðÊó¤Ø¤Î¥¢¥¯¥»¥¹¤ª¤è¤Ó¾ðÊó¤ÎÊѹ¹¤ò¹Ô¤¦¤¿¤á¤Î¡¢ÌÀ³Î¤ËÄêµÁ¤µ¤ì¤¿Â¿¤¯¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£Ê£¿ô¤Î°Û¤Ê¤ë¸ÇÄê¼ÂÁõ¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¡¢³Æ¼ÂÁõ¤ÏÆÃÄê¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤òÂоݤȤ·¤Þ¤¹¡£ + .PP +-¸½ºß¡¢¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë2¤Ä¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ä¡¼¥ë(\fIkeytool\fR¤È\fIjarsigner\fR)¡¢¤ª¤è¤Ó¥Ý¥ê¥·¡¼¡¦¥Ä¡¼¥ë¤È¤¤¤¦Ì¾Á°¤Î1¤Ä¤ÎGUI¥Ù¡¼¥¹¤Î¥Ä¡¼¥ë¤¬¤¢¤ê¤Þ¤¹¡£\fIKeyStore\fR¥¯¥é¥¹¤Ï¸ø³«¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢JDK¥æ¡¼¥¶¡¼¤Ï¡¢¤½¤ì¤ò»ÈÍѤ¹¤ë¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò½ñ¤­¹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¸½ºß¡¢¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë2¤Ä¤Î¥³¥Þ¥ó¥É¹Ô¥Ä¡¼¥ë(\fBkeytool\fR¤È\fBjarsigner\fR)¡¢¤ª¤è¤Ó¥Ý¥ê¥·¡¼¡¦¥Ä¡¼¥ë¤È¤¤¤¦Ì¾Á°¤Î1¤Ä¤ÎGUI¥Ù¡¼¥¹¤Î¥Ä¡¼¥ë¤¬¤¢¤ê¤Þ¤¹¡£\fBKeyStore\fR¥¯¥é¥¹¤Ï¸ø³«¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢JDK¥æ¡¼¥¶¡¼¤Ï¡¢¤½¤ì¤ò»ÈÍѤ¹¤ë¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò½ñ¤­¹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .PP + Oracle¤¬Ä󶡤¹¤ëÁȹþ¤ß¤Î¥Ç¥Õ¥©¥ë¥È¤Î¼ÂÁõ¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢JKS¤È¤¤¤¦Ì¾Á°¤ÎÆȼ«¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×(·Á¼°)¤ò»ÈÍѤ¹¤ë¤â¤Î¤Ç¡¢¥­¡¼¥¹¥È¥¢¤ò¥Õ¥¡¥¤¥ë¤È¤·¤Æ¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£Áȹþ¤ß¤Î¼ÂÁõ¤Ç¤Ï¡¢³ÆÈëÌ©¸°¤Ï¸ÄÊ̤Υѥ¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¡¢¥­¡¼¥¹¥È¥¢Á´ÂΤÎÀ°¹çÀ­¤Ï(ÈëÌ©¸°¤È¤ÏÊ̤Î)¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£ + .PP +-¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ï¥×¥í¥Ð¥¤¥À¥Ù¡¼¥¹¤Ç¡¢¤Ä¤Þ¤ê¡¢\fIKeyStore\fR¥¯¥é¥¹¤Ë¤è¤êÄ󶡤µ¤ì¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹(SPI)¤Ë´Ø¤·¤Æ¼ÂÁõ¤µ¤ì¤Þ¤¹¡£Âбþ¤¹¤ë\fIKeystoreSpi\fRÃê¾Ý¥¯¥é¥¹¤¬¤¢¤ê¡¢¤³¤ì¤â\fIjava\&.security package\fR¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¤¬¡¢¥×¥í¥Ð¥¤¥À¤¬¼ÂÁõ¤¹¤ëɬÍפΤ¢¤ë¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢¥×¥í¥Ð¥¤¥À¤È¤Ï¡¢Java Security API¤Ë¤è¤Ã¤Æ¥¢¥¯¥»¥¹²Äǽ¤Ê¥µ¡¼¥Ó¥¹¤Î¥µ¥Ö¥»¥Ã¥È¤ËÂФ·¡¢¤½¤Î¸ÇÄê¼ÂÁõ¤òÄ󶡤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î½¸¹ç¤Î¤³¤È¤Ç¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¤Ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider\&.html¤Ë¤¢¤ë +-Java°Å¹æ²½¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥×¥í¥Ð¥¤¥À¤Î¼ÂÁõÊýË¡¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¥×¥í¥Ð¥¤¥À¤ò¼ÂÁõ¤·¡¢\fIKeystoreSpi\fR¥µ¥Ö¥¯¥é¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ï¥×¥í¥Ð¥¤¥À¥Ù¡¼¥¹¤Ç¡¢¤Ä¤Þ¤ê¡¢\fBKeyStore\fR¥¯¥é¥¹¤Ë¤è¤êÄ󶡤µ¤ì¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹(SPI)¤Ë´Ø¤·¤Æ¼ÂÁõ¤µ¤ì¤Þ¤¹¡£Âбþ¤¹¤ë\fBKeystoreSpi\fRÃê¾Ý¥¯¥é¥¹¤¬¤¢¤ê¡¢¤³¤ì¤â\fBjava\&.security package\fR¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¤¬¡¢¥×¥í¥Ð¥¤¥À¤¬¼ÂÁõ¤¹¤ëɬÍפΤ¢¤ë¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢¥×¥í¥Ð¥¤¥À¤È¤Ï¡¢Java Security API¤Ë¤è¤Ã¤Æ¥¢¥¯¥»¥¹²Äǽ¤Ê¥µ¡¼¥Ó¥¹¤Î¥µ¥Ö¥»¥Ã¥È¤ËÂФ·¡¢¤½¤Î¸ÇÄê¼ÂÁõ¤òÄ󶡤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î½¸¹ç¤Î¤³¤È¤Ç¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¤Ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider\&.html¤Ë¤¢¤ë ++Java°Å¹æ²½¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥×¥í¥Ð¥¤¥À¤Î¼ÂÁõÊýË¡¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¥×¥í¥Ð¥¤¥À¤ò¼ÂÁõ¤·¡¢\fBKeystoreSpi\fR¥µ¥Ö¥¯¥é¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢\fIKeyStore\fR¥¯¥é¥¹¤Î\fIgetInstance\fR¥Õ¥¡¥¯¥È¥ê¡¦¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ¡¢ÍÍ¡¹¤Ê¥×¥í¥Ð¥¤¥À¤«¤é°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÁªÂò¤Ç¤­¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Ï¡¢¥­¡¼¥¹¥È¥¢¾ðÊó¤Î³ÊǼ·Á¼°¤È¥Ç¡¼¥¿·Á¼°¤òÄêµÁ¤¹¤ë¤È¤È¤â¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÈëÌ©¸°¤È¥­¡¼¥¹¥È¥¢¼«ÂΤÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à¤òÄêµÁ¤·¤Þ¤¹¡£°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ë¤Ï¡¢¸ß´¹À­¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢\fBKeyStore\fR¥¯¥é¥¹¤Î\fBgetInstance\fR¥Õ¥¡¥¯¥È¥ê¡¦¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ¡¢ÍÍ¡¹¤Ê¥×¥í¥Ð¥¤¥À¤«¤é°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÁªÂò¤Ç¤­¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Ï¡¢¥­¡¼¥¹¥È¥¢¾ðÊó¤Î³ÊǼ·Á¼°¤È¥Ç¡¼¥¿·Á¼°¤òÄêµÁ¤¹¤ë¤È¤È¤â¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÈëÌ©¸°¤È¥­¡¼¥¹¥È¥¢¼«ÂΤÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à¤òÄêµÁ¤·¤Þ¤¹¡£°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ë¤Ï¡¢¸ß´¹À­¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .PP +-\fIjarsigner\fR¤ª¤è¤Ó\fIpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢URL¤ò»ÈÍѤ·¤Æ»ØÄê¤Ç¤­¤ëǤ°Õ¤Î¾ì½ê¤«¤é¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¤³¤ì¤é¤Î¥³¥Þ¥ó¥É¤Ï¡¢Windows¾å¤ÎMSCAPI¤ª¤è¤Ó¤¹¤Ù¤Æ¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤ÎPKCS11¤ÇÄ󶡤µ¤ì¤ë¤è¤¦¤ÊÈó¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBjarsigner\fR¤ª¤è¤Ó\fBpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢URL¤ò»ÈÍѤ·¤Æ»ØÄê¤Ç¤­¤ëǤ°Õ¤Î¾ì½ê¤«¤é¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¤³¤ì¤é¤Î¥³¥Þ¥ó¥É¤Ï¡¢Windows¾å¤ÎMSCAPI¤ª¤è¤Ó¤¹¤Ù¤Æ¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤ÎPKCS11¤ÇÄ󶡤µ¤ì¤ë¤è¤¦¤ÊÈó¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤ª¤è¤Ó\fIkeytool\fR¥³¥Þ¥ó¥É¤Î¾ì¹ç¡¢\fI\-storetype\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Ä¡¼¥ë¤Î¾ì¹ç¡¢\fB¡Ö¥­¡¼¥¹¥È¥¢¡×\fR¥á¥Ë¥å¡¼¤Î\fB¡ÖÊÔ½¸¡×\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤ª¤è¤Ó\fBkeytool\fR¥³¥Þ¥ó¥É¤Î¾ì¹ç¡¢\fB\-storetype\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥Þ¥ó¥É¹Ô¤Ç¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Ä¡¼¥ë¤Î¾ì¹ç¡¢\fB¡Ö¥­¡¼¥¹¥È¥¢¡×\fR¥á¥Ë¥å¡¼¤Î\fB¡ÖÊÔ½¸¡×\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .PP +-¥æ¡¼¥¶¡¼¤¬¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤵ¤ì¤¿\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ˴ð¤Å¤¤¤Æ¡¢¥Ä¡¼¥ë¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤¬ÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ï\fIjava\&.security\fR¤È¸Æ¤Ð¤ì¡¢JDK¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fIjava\&.home/lib/security\fRÆâ¤Ë¸ºß¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢\fIjava\&.home\fR¤Ï¼Â¹Ô»þ´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£\fIjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢JDK¤Þ¤¿¤ÏJava Runtime Environment (JRE)¤ÎºÇ¾å°Ì¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£ ++¥æ¡¼¥¶¡¼¤¬¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤵ¤ì¤¿\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ˴ð¤Å¤¤¤Æ¡¢¥Ä¡¼¥ë¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤¬ÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ï\fBjava\&.security\fR¤È¸Æ¤Ð¤ì¡¢JDK¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fBjava\&.home/lib/security\fRÆâ¤Ë¸ºß¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢\fBjava\&.home\fR¤Ï¼Â¹Ô»þ´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£\fBjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢JDK¤Þ¤¿¤ÏJava Runtime Environment (JRE)¤ÎºÇ¾å°Ì¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£ + .PP +-³Æ¥Ä¡¼¥ë¤Ï¡¢\fIkeystore\&.type\fR¤ÎÃͤò¼èÆÀ¤·¡¢¤½¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¡¢¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥Ð¥¤¥À¤òÄ´¤Ù¤Þ¤¹¡£ÌÜŪ¤Î¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤È¡¢¤½¤Î¥×¥í¥Ð¥¤¥À¤«¤é¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Þ¤¹¡£ ++³Æ¥Ä¡¼¥ë¤Ï¡¢\fBkeystore\&.type\fR¤ÎÃͤò¼èÆÀ¤·¡¢¤½¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¡¢¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥Ð¥¤¥À¤òÄ´¤Ù¤Þ¤¹¡£ÌÜŪ¤Î¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤È¡¢¤½¤Î¥×¥í¥Ð¥¤¥À¤«¤é¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Þ¤¹¡£ + .PP +-\fIKeyStore\fR¥¯¥é¥¹¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëstatic¥á¥½¥Ã¥É\fIgetDefaultType\fR¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¥¢¥×¥ì¥Ã¥È¤«¤é\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤Î¹Ô¤Ç¤Ï¡¢\fIkeystore\&.type property\fR¤Ç»ØÄꤵ¤ì¤¿¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ®¤·¤Þ¤¹¡£ ++\fBKeyStore\fR¥¯¥é¥¹¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëstatic¥á¥½¥Ã¥É\fBgetDefaultType\fR¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¥¢¥×¥ì¥Ã¥È¤«¤é\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤Î¹Ô¤Ç¤Ï¡¢\fBkeystore\&.type property\fR¤Ç»ØÄꤵ¤ì¤¿¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-KeyStore keyStore = KeyStore\&.getInstance(KeyStore\&.getDefaultType()); ++\fBKeyStore keyStore = KeyStore\&.getInstance(KeyStore\&.getDefaultType());\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï¡¢\fIjks\fR ++¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï¡¢\fBjks\fR + (Oracle¤¬Ä󶡤¹¤ëÆȼ«¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ)¤Ç¤¹¡£¤³¤ì¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¼¡¤Î¹Ô¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keystore\&.type=jks ++\fBkeystore\&.type=jks\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î»ØÄê¤Ç¤Ï¡¢Âçʸ»ú¤È¾®Ê¸»ú¤Ï¶èÊ̤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fIJKS\fR¤Ï\fIjks\fR¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î»ØÄê¤Ç¤Ï¡¢Âçʸ»ú¤È¾®Ê¸»ú¤Ï¶èÊ̤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fBJKS\fR¤Ï\fBjks\fR¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥Ä¡¼¥ë¤Ç¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤½¤Î¹Ô¤òÊѹ¹¤·¤ÆÊ̤Υ­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIpkcs12\fR¤È¸Æ¤Ð¤ì¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¡¦¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ë¾ì¹ç¡¢¹Ô¤ò¼¡¤Î¤è¤¦¤ËÊѹ¹¤·¤Þ¤¹¡£ ++¥Ä¡¼¥ë¤Ç¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤½¤Î¹Ô¤òÊѹ¹¤·¤ÆÊ̤Υ­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBpkcs12\fR¤È¸Æ¤Ð¤ì¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¡¦¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ë¾ì¹ç¡¢¹Ô¤ò¼¡¤Î¤è¤¦¤ËÊѹ¹¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keystore\&.type=pkcs12 ++\fBkeystore\&.type=pkcs12\fR ++ + .fi + .if n \{\ + .RE +@@ -272,7 +278,7 @@ + Java PKCS #11¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥¬¥¤¥É¤Î¡ÖKeyTool¡×¤ª¤è¤Ó¡ÖJarSigner¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "¥µ¥Ý¡¼¥È¤µ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à" + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¼¡¤Î¤¤¤º¤ì¤«¤Î¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¼¡¤Î¤¤¤º¤ì¤«¤Î¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -307,12 +313,12 @@ + SHA256¤ÈÂʱ߶ÊÀþ¥Ç¥¸¥¿¥ë½ð̾¥¢¥ë¥´¥ê¥º¥à(ECDSA)¤ò»ÈÍѤ·¤¿Âʱ߶ÊÀþ(EC)°Å¹æÊý¼°¥¢¥ë¥´¥ê¥º¥à + .RE + .PP +-½ð̾¼Ô¤Î¸ø³«¸°¤ÈÈëÌ©¸°¤¬DSA¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fIjarsigner\fR¤Ï\fISHA1withDSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£½ð̾¼Ô¤Î¸°¤¬RSA¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fIjarsigner\fR¤Ï\fISHA256withRSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤è¤¦¤È¤·¤Þ¤¹¡£½ð̾¼Ô¤Î¸°¤¬EC¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fIjarsigner\fR¤Ï\fISHA256withECDSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£ ++½ð̾¼Ô¤Î¸ø³«¸°¤ÈÈëÌ©¸°¤¬DSA¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fBjarsigner\fR¤Ï\fBSHA1withDSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£½ð̾¼Ô¤Î¸°¤¬RSA¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fBjarsigner\fR¤Ï\fBSHA256withRSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤è¤¦¤È¤·¤Þ¤¹¡£½ð̾¼Ô¤Î¸°¤¬EC¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fBjarsigner\fR¤Ï\fBSHA256withECDSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£ + .PP +-¤³¤ì¤é¤Î¥Ç¥Õ¥©¥ë¥È¤Î½ð̾¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£ ++¤³¤ì¤é¤Î¥Ç¥Õ¥©¥ë¥È¤Î½ð̾¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£ + .SS "½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë" + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¡¢½ÐÎϤµ¤ì¤ë½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ÏÆþÎÏJAR¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤Ç¤¹¤¬¡¢¼¡¤Î2¤Ä¤ÎÄɲåե¡¥¤¥ë¤¬META\-INF¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤«¤ì¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¡¢½ÐÎϤµ¤ì¤ë½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ÏÆþÎÏJAR¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤Ç¤¹¤¬¡¢¼¡¤Î2¤Ä¤ÎÄɲåե¡¥¤¥ë¤¬META\-INF¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤«¤ì¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -322,7 +328,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\&.SF\fR³ÈÄ¥»Ò¤ÎÉÕ¤¤¤¿½ð̾¥Õ¥¡¥¤¥ë ++\fB\&.SF\fR³ÈÄ¥»Ò¤ÎÉÕ¤¤¤¿½ð̾¥Õ¥¡¥¤¥ë + .RE + .sp + .RS 4 +@@ -333,14 +339,16 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\&.DSA\fR¡¢\fI\&.RSA\fR¤Þ¤¿¤Ï\fI\&.EC\fR³ÈÄ¥»Ò¤ÎÉÕ¤¤¤¿½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë ++\fB\&.DSA\fR¡¢\fB\&.RSA\fR¤Þ¤¿¤Ï\fB\&.EC\fR³ÈÄ¥»Ò¤ÎÉÕ¤¤¤¿½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë + .RE + .PP +-¤³¤ì¤é2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢\fI\-sigFile\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤ«¤éºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥ª¥×¥·¥ç¥ó¤¬\fI\-sigFile MKSIGN\fR¤Î¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ï\fIMKSIGN\&.SF\fR¤ª¤è¤Ó\fIMKSIGN\&.DSA\fR¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¤³¤ì¤é2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢\fB\-sigFile\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤ«¤éºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥ª¥×¥·¥ç¥ó¤¬\fB\-sigFile MKSIGN\fR¤Î¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ï\fBMKSIGN\&.SF\fR¤ª¤è¤Ó\fBMKSIGN\&.DSA\fR¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-sigfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ÎÀèƬ¤Î8ʸ»ú¤ò¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ÊÌ̾¤¬8ʸ»ṳ́Ëþ¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤¬¤½¤Î¤Þ¤Þ»ÈÍѤµ¤ì¤Þ¤¹¡£ÊÌ̾¤Ë¡¢½ð̾¥Õ¥¡¥¤¥ë̾¤Ç»ÈÍѤǤ­¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾¤ÎºîÀ®»þ¤Ë¡¢³ºÅö¤¹¤ëʸ»ú¤¬²¼Àþ(_)ʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£Í­¸ú¤Êʸ»ú¤Ï¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¡¢¿ô»ú¡¢²¼Àþ¤ª¤è¤Ó¥Ï¥¤¥Õ¥ó¤Ç¤¹¡£ +-½ð̾¥Õ¥¡¥¤¥ë.PP +-½ð̾¥Õ¥¡¥¤¥ë(\fI\&.SF\fR¥Õ¥¡¥¤¥ë)¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ëºÝ¤ËJAR¥Õ¥¡¥¤¥ë¤Ë¾ï¤Ë´Þ¤Þ¤ì¤ë¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤È»÷¤Æ¤¤¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¤è¤¦¤Ê¡¢¼¡¤Ë¼¨¤¹3¤Ä¤Î¹Ô¤¬¤¢¤ê¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-sigfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ÎÀèƬ¤Î8ʸ»ú¤ò¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ÊÌ̾¤¬8ʸ»ṳ́Ëþ¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤¬¤½¤Î¤Þ¤Þ»ÈÍѤµ¤ì¤Þ¤¹¡£ÊÌ̾¤Ë¡¢½ð̾¥Õ¥¡¥¤¥ë̾¤Ç»ÈÍѤǤ­¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾¤ÎºîÀ®»þ¤Ë¡¢³ºÅö¤¹¤ëʸ»ú¤¬²¼Àþ(_)ʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£Í­¸ú¤Êʸ»ú¤Ï¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¡¢¿ô»ú¡¢²¼Àþ¤ª¤è¤Ó¥Ï¥¤¥Õ¥ó¤Ç¤¹¡£ ++.PP ++½ð̾¥Õ¥¡¥¤¥ë ++.PP ++½ð̾¥Õ¥¡¥¤¥ë(\fB\&.SF\fR¥Õ¥¡¥¤¥ë)¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ëºÝ¤ËJAR¥Õ¥¡¥¤¥ë¤Ë¾ï¤Ë´Þ¤Þ¤ì¤ë¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤È»÷¤Æ¤¤¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¤è¤¦¤Ê¡¢¼¡¤Ë¼¨¤¹3¤Ä¤Î¹Ô¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -375,24 +383,27 @@ + SHA¥À¥¤¥¸¥§¥¹¥È¤ÎÃÍ + .RE + .PP +-¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎSHA¥À¥¤¥¸¥§¥¹¥È¤ÎÃͤϡ¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Ð¥¤¥Ê¥ê¡¦¥Ç¡¼¥¿¤Î¥À¥¤¥¸¥§¥¹¥È(¥Ï¥Ã¥·¥å)¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢»ØÄꤵ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ÎÃͤϡ¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¤½¤Î3¹Ô¤Î¥Ï¥Ã¥·¥å¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎSHA¥À¥¤¥¸¥§¥¹¥È¤ÎÃͤϡ¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Ð¥¤¥Ê¥ê¡¦¥Ç¡¼¥¿¤Î¥À¥¤¥¸¥§¥¹¥È(¥Ï¥Ã¥·¥å)¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢»ØÄꤵ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ÎÃͤϡ¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¤½¤Î3¹Ô¤Î¥Ï¥Ã¥·¥å¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP + ½ð̾¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥ工夬³ÊǼ¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Ë¤Ï¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Ø¥Ã¥À¡¼¤Î¥Ï¥Ã¥·¥å¤â´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¤È¡¢¸¡¾Ú¤ÎºÇŬ²½¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë.PP +-\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï½ð̾¤¬ÉÕ¤±¤é¤ì¡¢½ð̾¤Ï½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ËÃÖ¤«¤ì¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢½ð̾¤Ë»ÈÍѤµ¤ì¤¿ÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤òǧ¾Ú¤¹¤ë¥­¡¼¥¹¥È¥¢¤«¤é¤Î¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤â¡¢ÆâÉô¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤Î³ÈÄ¥»Ò¤Ï¡¢»ÈÍѤµ¤ì¤ë¥À¥¤¥¸¥§¥¹¥È¡¦¥¢¥ë¥´¥ê¥º¥à¤Ë±þ¤¸¤Æ¡¢\fI\&.DSA\fR¡¢\fI\&.RSA\fR¤Þ¤¿¤Ï\fI\&.EC\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.PP ++½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë ++.PP ++\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï½ð̾¤¬ÉÕ¤±¤é¤ì¡¢½ð̾¤Ï½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ËÃÖ¤«¤ì¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢½ð̾¤Ë»ÈÍѤµ¤ì¤¿ÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤òǧ¾Ú¤¹¤ë¥­¡¼¥¹¥È¥¢¤«¤é¤Î¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤â¡¢ÆâÉô¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤Î³ÈÄ¥»Ò¤Ï¡¢»ÈÍѤµ¤ì¤ë¥À¥¤¥¸¥§¥¹¥È¡¦¥¢¥ë¥´¥ê¥º¥à¤Ë±þ¤¸¤Æ¡¢\fB\&.DSA\fR¡¢\fB\&.RSA\fR¤Þ¤¿¤Ï\fB\&.EC\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .SS "½ð̾¥¿¥¤¥à¥¹¥¿¥ó¥×" + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë½ð̾¥¿¥¤¥à¥¹¥¿¥ó¥×¤òÀ¸À®¤ª¤è¤ÓÊݸ¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fIjarsigner\fR¤ÏÂåÂؽð̾µ¡¹½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¤³¤ÎÆ°ºî¤Ï¾Êά²Äǽ¤Ç¡¢½ð̾»þ¤Ë¼¡¤Î³Æ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ©¸æ¤µ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë½ð̾¥¿¥¤¥à¥¹¥¿¥ó¥×¤òÀ¸À®¤ª¤è¤ÓÊݸ¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fBjarsigner\fR¤ÏÂåÂؽð̾µ¡¹½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¤³¤ÎÆ°ºî¤Ï¾Êά²Äǽ¤Ç¡¢½ð̾»þ¤Ë¼¡¤Î³Æ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ©¸æ¤µ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-tsa \fIurl\fR +-\-tsacert \fIalias\fR +-\-altsigner \fIclass\fR +-\-altsignerpath \fIclasspathlist\fR +-\-tsapolicyid \fIpolicyid\fR ++\fB\-tsa \fR\fB\fIurl\fR\fR ++\fB\-tsacert \fR\fB\fIalias\fR\fR ++\fB\-altsigner \fR\fB\fIclass\fR\fR ++\fB\-altsignerpath \fR\fB\fIclasspathlist\fR\fR ++\fB\-tsapolicyid \fR\fB\fIpolicyid\fR\fR ++ + .fi + .if n \{\ + .RE +@@ -409,9 +420,9 @@ + .sp -1 + .IP " 1." 4.2 + .\} +-\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ò¸¡¾Ú¤·¤Þ¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ò¸¡¾Ú¤·¤Þ¤¹¡£ + .sp +-¸¡¾Ú¤Ç¤Ï¡¢³Æ½ð̾¥Ö¥í¥Ã¥¯(\fI\&.DSA\fR)¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤¿½ð̾¤¬¡¢¾ÚÌÀ½ñ(¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó)¤â\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë¼¨¤µ¤ì¤ë¸ø³«¸°¤ËÂбþ¤¹¤ëÈëÌ©¸°¤ò»ÈÍѤ·¤ÆÀ¸À®¤µ¤ì¤¿¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤Þ¤¿¡¢½ð̾¤¬Âбþ¤¹¤ë½ð̾(\fI\&.SF\fR)¥Õ¥¡¥¤¥ë¤ÎÍ­¸ú¤Ê½ð̾¤Ç¤¢¤ë¤³¤È¤¬³Îǧ¤µ¤ì¡¢¤½¤ì¤Ë¤è¤ê¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤¬²þ¤¶¤ó¤µ¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤â³Îǧ¤µ¤ì¤Þ¤¹¡£ ++¸¡¾Ú¤Ç¤Ï¡¢³Æ½ð̾¥Ö¥í¥Ã¥¯(\fB\&.DSA\fR)¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤¿½ð̾¤¬¡¢¾ÚÌÀ½ñ(¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó)¤â\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë¼¨¤µ¤ì¤ë¸ø³«¸°¤ËÂбþ¤¹¤ëÈëÌ©¸°¤ò»ÈÍѤ·¤ÆÀ¸À®¤µ¤ì¤¿¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤Þ¤¿¡¢½ð̾¤¬Âбþ¤¹¤ë½ð̾(\fB\&.SF\fR)¥Õ¥¡¥¤¥ë¤ÎÍ­¸ú¤Ê½ð̾¤Ç¤¢¤ë¤³¤È¤¬³Îǧ¤µ¤ì¡¢¤½¤ì¤Ë¤è¤ê¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤¬²þ¤¶¤ó¤µ¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤â³Îǧ¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -422,13 +433,13 @@ + .sp -1 + .IP " 2." 4.2 + .\} +-\fI\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥¨¥ó¥È¥ê¤Ë¼¨¤µ¤ì¤ë¥À¥¤¥¸¥§¥¹¥È¤ò¡¢¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤ÎÂбþ¤¹¤ë³Æ¥»¥¯¥·¥ç¥ó¤ÈÆͤ­¤¢¤ï¤»¤Æ¸¡¾Ú¤·¤Þ¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥¨¥ó¥È¥ê¤Ë¼¨¤µ¤ì¤ë¥À¥¤¥¸¥§¥¹¥È¤ò¡¢¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤ÎÂбþ¤¹¤ë³Æ¥»¥¯¥·¥ç¥ó¤ÈÆͤ­¤¢¤ï¤»¤Æ¸¡¾Ú¤·¤Þ¤¹¡£ + .sp +-\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥ工夬³ÊǼ¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤¬¥Ç¥Õ¥©¥ë¥È¤Ç´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ç¤Ï¡¢¥Ø¥Ã¥À¡¼Æâ¤Î¥Ï¥Ã¥·¥å¤¬¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£°ìÃפ¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ï¼¡¤Î¼ê½ç¤Ë¿Ê¤ß¤Þ¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥ工夬³ÊǼ¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤¬¥Ç¥Õ¥©¥ë¥È¤Ç´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ç¤Ï¡¢¥Ø¥Ã¥À¡¼Æâ¤Î¥Ï¥Ã¥·¥å¤¬¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£°ìÃפ¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ï¼¡¤Î¼ê½ç¤Ë¿Ê¤ß¤Þ¤¹¡£ + .sp +-°ìÃפ·¤Ê¤¤¾ì¹ç¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¾ðÊ󥻥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¡¢¤¢¤Þ¤êºÇŬ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¸¡¾Ú¤¬É¬Íפˤʤê¤Þ¤¹¡£½ð̾¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++°ìÃפ·¤Ê¤¤¾ì¹ç¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¾ðÊ󥻥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¡¢¤¢¤Þ¤êºÇŬ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¸¡¾Ú¤¬É¬Íפˤʤê¤Þ¤¹¡£½ð̾¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥Ø¥Ã¥À¡¼¤Ë³ÊǼ¤µ¤ì¤¿¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤¬¡¢¸½ºß¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤Ë°ìÃפ·¤Ê¤¤Íýͳ¤Î1¤Ä¤Ï¡¢½ð̾¤ª¤è¤Ó\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¸å¤Ë¡¢(\fIjar\fR¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ)1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ë¤ËÄɲ䵤줿¤³¤È¤Ç¤¹¡£\fIjar\fR¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¥Õ¥¡¥¤¥ë¤òÄɲä·¤¿¾ì¹ç¡¢¿·¤·¤¤¥Õ¥¡¥¤¥ëÍѤΥ»¥¯¥·¥ç¥ó¤¬Äɲ䵤ì¤ë¤³¤È¤Ë¤è¤ê¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ÏÊѹ¹¤µ¤ì¤Þ¤¹¤¬¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤ÏÊѹ¹¤µ¤ì¤Þ¤»¤ó¡£¸¡¾Ú¤¬¤Þ¤ÀÀ®¸ù¤·¤Æ¤¤¤ë¤È¤ß¤Ê¤µ¤ì¤ë¤Î¤Ï¡¢½ð̾¤ÎÀ¸À®°Ê¹ß¤ËJAR¥Õ¥¡¥¤¥ëÆâ¤Î¤É¤Î¥Õ¥¡¥¤¥ë¤âÊѹ¹¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ç¤¹¡£¤³¤ì¤¬È¯À¸¤¹¤ë¤Î¤Ï¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥Ø¥Ã¥À¡¼°Ê³°¤Î¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¾ì¹ç¤Ç¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥Ø¥Ã¥À¡¼¤Ë³ÊǼ¤µ¤ì¤¿¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤¬¡¢¸½ºß¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤Ë°ìÃפ·¤Ê¤¤Íýͳ¤Î1¤Ä¤Ï¡¢½ð̾¤ª¤è¤Ó\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¸å¤Ë¡¢(\fBjar\fR¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ)1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ë¤ËÄɲ䵤줿¤³¤È¤Ç¤¹¡£\fBjar\fR¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¥Õ¥¡¥¤¥ë¤òÄɲä·¤¿¾ì¹ç¡¢¿·¤·¤¤¥Õ¥¡¥¤¥ëÍѤΥ»¥¯¥·¥ç¥ó¤¬Äɲ䵤ì¤ë¤³¤È¤Ë¤è¤ê¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ÏÊѹ¹¤µ¤ì¤Þ¤¹¤¬¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤ÏÊѹ¹¤µ¤ì¤Þ¤»¤ó¡£¸¡¾Ú¤¬¤Þ¤ÀÀ®¸ù¤·¤Æ¤¤¤ë¤È¤ß¤Ê¤µ¤ì¤ë¤Î¤Ï¡¢½ð̾¤ÎÀ¸À®°Ê¹ß¤ËJAR¥Õ¥¡¥¤¥ëÆâ¤Î¤É¤Î¥Õ¥¡¥¤¥ë¤âÊѹ¹¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ç¤¹¡£¤³¤ì¤¬È¯À¸¤¹¤ë¤Î¤Ï¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥Ø¥Ã¥À¡¼°Ê³°¤Î¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¾ì¹ç¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -439,45 +450,46 @@ + .sp -1 + .IP " 3." 4.2 + .\} +-\fI\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Ë¥¨¥ó¥È¥ê¤ò»ý¤ÄJAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¤Þ¤¹¡£Æɼè¤êÃæ¤Ë¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ò·×»»¤·¡¢·ë²Ì¤ò¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥»¥¯¥·¥ç¥óÆâ¤Î¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ÈÈæ³Ó¤·¤Þ¤¹¡£¥À¥¤¥¸¥§¥¹¥È¤ÏƱ¤¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¡¢¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¸¡¾Ú¤¬¼ºÇÔ¤·¤Þ¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Ë¥¨¥ó¥È¥ê¤ò»ý¤ÄJAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¤Þ¤¹¡£Æɼè¤êÃæ¤Ë¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ò·×»»¤·¡¢·ë²Ì¤ò¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥»¥¯¥·¥ç¥óÆâ¤Î¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ÈÈæ³Ó¤·¤Þ¤¹¡£¥À¥¤¥¸¥§¥¹¥È¤ÏƱ¤¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¡¢¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¸¡¾Ú¤¬¼ºÇÔ¤·¤Þ¤¹¡£ + .sp +-¸¡¾Ú¥×¥í¥»¥¹Ãæ¤Ë¤Ê¤ó¤é¤«¤Î½ÅÂç¤Ê¸¡¾Ú¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¡¢¤½¤Î¥×¥í¥»¥¹¤ÏÄä»ß¤µ¤ì¡¢¥»¥­¥å¥ê¥Æ¥£Îã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Îã³°¤òÊ᪤ª¤è¤Óɽ¼¨¤·¤Þ¤¹¡£ ++¸¡¾Ú¥×¥í¥»¥¹Ãæ¤Ë¤Ê¤ó¤é¤«¤Î½ÅÂç¤Ê¸¡¾Ú¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¡¢¤½¤Î¥×¥í¥»¥¹¤ÏÄä»ß¤µ¤ì¡¢¥»¥­¥å¥ê¥Æ¥£Îã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Îã³°¤òÊ᪤ª¤è¤Óɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \fBÃí°Õ:\fR +-Äɲäηٹð(¤Þ¤¿¤Ï¡¢\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¥¨¥é¡¼)¤Ï¤¹¤Ù¤ÆÆɤàɬÍפ¬¤¢¤ê¤Þ¤¹¡£Æ±Íͤˡ¢¾ÚÌÀ¤¬¿®Íê¤Ç¤­¤ë¤«¤ò·èÄꤹ¤ë¤¿¤á¤Ë¡¢(\fI\-verbose\fR¤ª¤è¤Ó\fI\-certs\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ)¾ÚÌÀ½ñ¤ÎÆâÍƤâÆɤàɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++Äɲäηٹð(¤Þ¤¿¤Ï¡¢\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¥¨¥é¡¼)¤Ï¤¹¤Ù¤ÆÆɤàɬÍפ¬¤¢¤ê¤Þ¤¹¡£Æ±Íͤˡ¢¾ÚÌÀ¤¬¿®Íê¤Ç¤­¤ë¤«¤ò·èÄꤹ¤ë¤¿¤á¤Ë¡¢(\fB\-verbose\fR¤ª¤è¤Ó\fB\-certs\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ)¾ÚÌÀ½ñ¤ÎÆâÍƤâÆɤàɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .SS "1¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤òÂоݤȤ¹¤ëÊ£¿ô¤Î½ð̾" + .PP +-¼¡¤Î¤è¤¦¤Ë¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò¥Õ¥¡¥¤¥ë¤ÇÊ£¿ô²ó¼Â¹Ô¤·¡¢¼Â¹Ô¤Î¤¿¤Ó¤Ë°Û¤Ê¤ë¥æ¡¼¥¶¡¼¤ÎÊÌ̾¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢1¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤ËÊ£¿ô¤Î¥æ¡¼¥¶¡¼¤Î½ð̾¤òÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¼¡¤Î¤è¤¦¤Ë¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò¥Õ¥¡¥¤¥ë¤ÇÊ£¿ô²ó¼Â¹Ô¤·¡¢¼Â¹Ô¤Î¤¿¤Ó¤Ë°Û¤Ê¤ë¥æ¡¼¥¶¡¼¤ÎÊÌ̾¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢1¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤ËÊ£¿ô¤Î¥æ¡¼¥¶¡¼¤Î½ð̾¤òÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner myBundle\&.jar susan +-jarsigner myBundle\&.jar kevin ++\fBjarsigner myBundle\&.jar susan\fR ++\fBjarsigner myBundle\&.jar kevin\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-JAR¥Õ¥¡¥¤¥ë¤¬Ê£¿ô²ó½ð̾¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Ê£¿ô¤Î\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤ª¤ê¡¢1²ó¤Î½ð̾¤ËÂФ·¤Æ1¤Ä¤Î¥Ú¥¢¤È¤Ê¤ê¤Þ¤¹¡£Á°½Ò¤ÎÎã¤Ç¤Ï¡¢½ÐÎÏJAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î̾Á°¤Î¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤¬Ê£¿ô²ó½ð̾¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Ê£¿ô¤Î\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤ª¤ê¡¢1²ó¤Î½ð̾¤ËÂФ·¤Æ1¤Ä¤Î¥Ú¥¢¤È¤Ê¤ê¤Þ¤¹¡£Á°½Ò¤ÎÎã¤Ç¤Ï¡¢½ÐÎÏJAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î̾Á°¤Î¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-SUSAN\&.SF +-SUSAN\&.DSA +-KEVIN\&.SF +-KEVIN\&.DSA ++\fBSUSAN\&.SF\fR ++\fBSUSAN\&.DSA\fR ++\fBKEVIN\&.SF\fR ++\fBKEVIN\&.DSA\fR + .fi + .if n \{\ + .RE + .\} + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-¼¡¤Î³Æ¹à¤Ç¤Ï¡¢ÍÍ¡¹¤Ê\fIjarsigner\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£¼¡¤Îɸ½à¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¼¡¤Î³Æ¹à¤Ç¤Ï¡¢ÍÍ¡¹¤Ê\fBjarsigner\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£¼¡¤Îɸ½à¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .RS 4 + .ie n \{\ +@@ -520,38 +532,40 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-storepass\fR¡¢\fI\-keypass\fR¡¢\fI\-sigfile\fR¡¢\fI\-sigalg\fR¡¢\fI\-digestalg\fR¡¢\fI\-signedjar\fR¤ª¤è¤ÓTSA´ØÏ¢¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤¹¤ë¾ì¹ç¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fI\-keystore \fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ª¤è¤Ó¸¡¾Ú¤Ë´ØÏ¢¤·¤Þ¤¹¡£¤Þ¤¿¡¢ÊÌ̾¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ª¤è¤Ó¸¡¾Ú»þ¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fB\-storepass\fR¡¢\fB\-keypass\fR¡¢\fB\-sigfile\fR¡¢\fB\-sigalg\fR¡¢\fB\-digestalg\fR¡¢\fB\-signedjar\fR¤ª¤è¤ÓTSA´ØÏ¢¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤¹¤ë¾ì¹ç¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fB\-keystore \fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ª¤è¤Ó¸¡¾Ú¤Ë´ØÏ¢¤·¤Þ¤¹¡£¤Þ¤¿¡¢ÊÌ̾¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ª¤è¤Ó¸¡¾Ú»þ¤Ë»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-keystore \fIurl\fR + .RS 4 +-¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò¼¨¤¹URL¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fIuser\&.home\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç·èÄꤵ¤ì¤¿¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¥Õ¥¡¥¤¥ë\fI\&.keystore\fR¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò¼¨¤¹URL¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fBuser\&.home\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç·èÄꤵ¤ì¤¿¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¥Õ¥¡¥¤¥ë\fB\&.keystore\fR¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ + .sp + ¥­¡¼¥¹¥È¥¢¤Ï½ð̾»þ¤Ë¤ÏɬÍפǤ¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¡¢¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¥­¡¼¥¹¥È¥¢¤òÌÀ¼¨Åª¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¸¡¾Ú¤¹¤ë¤È¤­¤Ï¥­¡¼¥¹¥È¥¢¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥­¡¼¥¹¥È¥¢¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¤«¡¢¤¢¤ë¤¤¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¤¬Â¸ºß¤·¤Æ¤¤¤Æ¡¢¤µ¤é¤Ë\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬¤½¤Î¥­¡¼¥¹¥È¥¢¤Ë1¤Ä¤Ç¤â´Þ¤Þ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë´Ø¤¹¤ëÄɲþðÊ󤬽ÐÎϤµ¤ì¤Þ¤¹¡£ ++¸¡¾Ú¤¹¤ë¤È¤­¤Ï¥­¡¼¥¹¥È¥¢¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥­¡¼¥¹¥È¥¢¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¤«¡¢¤¢¤ë¤¤¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¤¬Â¸ºß¤·¤Æ¤¤¤Æ¡¢¤µ¤é¤Ë\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬¤½¤Î¥­¡¼¥¹¥È¥¢¤Ë1¤Ä¤Ç¤â´Þ¤Þ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë´Ø¤¹¤ëÄɲþðÊ󤬽ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp +-\fI\-keystore\fR°ú¿ô¤Ë¤Ï¡¢URL¤Ç¤Ï¤Ê¤¯¥Õ¥¡¥¤¥ë̾¤È¥Ñ¥¹¤ò»ØÄê¤Ç¤­¡¢¤³¤Î¾ì¹ç¡¢¥Õ¥¡¥¤¥ë: URL¤ÈƱ¤¸¤è¤¦¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Ë¤è¤¦¤Ë»ØÄꤹ¤ë¤ÈƱÅù¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB\-keystore\fR°ú¿ô¤Ë¤Ï¡¢URL¤Ç¤Ï¤Ê¤¯¥Õ¥¡¥¤¥ë̾¤È¥Ñ¥¹¤ò»ØÄê¤Ç¤­¡¢¤³¤Î¾ì¹ç¡¢¥Õ¥¡¥¤¥ë: URL¤ÈƱ¤¸¤è¤¦¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Ë¤è¤¦¤Ë»ØÄꤹ¤ë¤ÈƱÅù¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-keystore \fIfilePathAndName\fR +-\-keystore file:\fIfilePathAndName\fR ++\fB\-keystore \fR\fB\fIfilePathAndName\fR\fR ++\fB\-keystore file:\fR\fB\fIfilePathAndName\fR\fR ++ + .fi + .if n \{\ + .RE + .\} +-(JRE¤Î\fI$JAVA_HOME/lib/security directory\fR¤Ë¤¢¤ë) +-\fIjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤ÇSun PKCS #11¥×¥í¥Ð¥¤¥À¤¬¹½À®¤µ¤ì¤¿¾ì¹ç¡¢\fIkeytool\fR¤ª¤è¤Ó\fIjarsigner\fR¥Ä¡¼¥ë¤ÏPKCS#11¥È¡¼¥¯¥ó¤Ë´ð¤Å¤¤¤ÆÆ°ºî¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£ ++(JRE¤Î\fB$JAVA_HOME/lib/security directory\fR¤Ë¤¢¤ë) ++\fBjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤ÇSun PKCS #11¥×¥í¥Ð¥¤¥À¤¬¹½À®¤µ¤ì¤¿¾ì¹ç¡¢\fBkeytool\fR¤ª¤è¤Ó\fBjarsigner\fR¥Ä¡¼¥ë¤ÏPKCS#11¥È¡¼¥¯¥ó¤Ë´ð¤Å¤¤¤ÆÆ°ºî¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-keystore NONE +-\-storetype PKCS11 ++\fB\-keystore NONE\fR ++\fB\-storetype PKCS11\fR ++ + .fi + .if n \{\ + .RE +@@ -562,7 +576,8 @@ + .RS 4 + .\} + .nf +-keytool \-keystore NONE \-storetype PKCS11 \-list ++\fBkeytool \-keystore NONE \-storetype PKCS11 \-list\fR ++ + .fi + .if n \{\ + .RE +@@ -571,17 +586,17 @@ + .PP + \-storetype \fIstoretype\fR + .RS 4 +-¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤¹¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤǻØÄꤵ¤ì¤¿¥¿¥¤¥×¤Ç¤¹¡£¤³¤ÎÃͤϡ¢\fIjava\&.security\&.KeyStore\fR¤Îstatic +-\fIgetDefaultType\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£ ++¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤¹¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤǻØÄꤵ¤ì¤¿¥¿¥¤¥×¤Ç¤¹¡£¤³¤ÎÃͤϡ¢\fBjava\&.security\&.KeyStore\fR¤Îstatic ++\fBgetDefaultType\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢PCKS #11¥È¡¼¥¯¥ó¤ÎPIN¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£²¿¤â»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fIkeytool\fR¤ª¤è¤Ó\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢¥È¡¼¥¯¥óPIN¤Î»ØÄê¤òµá¤á¤é¤ì¤Þ¤¹¡£¥È¡¼¥¯¥ó¤ËÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹(ÀìÍѤÎPIN¥Ñ¥Ã¥É¤äÀ¸ÂÎÆɼè¤êµ¡¤Ê¤É)¤¬¤¢¤ë¾ì¹ç¡¢\fI\-protected\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¥Ñ¥¹¥ï¡¼¥É¡¦¥ª¥×¥·¥ç¥ó¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£ ++\fB\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢PCKS #11¥È¡¼¥¯¥ó¤ÎPIN¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£²¿¤â»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fBkeytool\fR¤ª¤è¤Ó\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢¥È¡¼¥¯¥óPIN¤Î»ØÄê¤òµá¤á¤é¤ì¤Þ¤¹¡£¥È¡¼¥¯¥ó¤ËÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹(ÀìÍѤÎPIN¥Ñ¥Ã¥É¤äÀ¸ÂÎÆɼè¤êµ¡¤Ê¤É)¤¬¤¢¤ë¾ì¹ç¡¢\fB\-protected\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¥Ñ¥¹¥ï¡¼¥É¡¦¥ª¥×¥·¥ç¥ó¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP + \-storepass[:env | :file] \fIargument\fR + .RS 4 +-¥­¡¼¥¹¥È¥¢¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Î¤ËɬÍפʥѥ¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤¬É¬ÍפʤΤϡ¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Î¤ß¤Ç¤¹(¸¡¾Ú¤¹¤ë¤È¤­¤Ë¤ÏÉÔÍפǤ¹)¡£¤½¤Î¾ì¹ç¡¢\fI\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤¤¤È¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Î¤ËɬÍפʥѥ¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤¬É¬ÍפʤΤϡ¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Î¤ß¤Ç¤¹(¸¡¾Ú¤¹¤ë¤È¤­¤Ë¤ÏÉÔÍפǤ¹)¡£¤½¤Î¾ì¹ç¡¢\fB\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤¤¤È¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp +-½¤¾þ»Ò\fIenv\fR¤Þ¤¿¤Ï\fIfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fIargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ ++½¤¾þ»Ò\fBenv\fR¤Þ¤¿¤Ï\fBfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fIargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -591,8 +606,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIenv\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBenv\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -603,19 +618,19 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIfile\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBfile\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + \fBÃí°Õ:\fR +-¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¤Þ¤¿¤Ï¥»¥­¥å¥ê¥Æ¥£Êݸ¤ì¤¿¥·¥¹¥Æ¥à¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¤Þ¤¿¤Ï¥»¥­¥å¥¢¤Ê¥·¥¹¥Æ¥à¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-keypass [:env | :file] \fIargument\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ËÂбþ¤¹¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤òÊݸ¤ë¤Î¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£\fIjarsigner\fR¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Æ¤ª¤é¤º¡¢É¬Íפʥѥ¹¥ï¡¼¥É¤¬¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ËÂбþ¤¹¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤òÊݸ¤ë¤Î¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£\fBjarsigner\fR¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Æ¤ª¤é¤º¡¢É¬Íפʥѥ¹¥ï¡¼¥É¤¬¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp +-½¤¾þ»Ò\fIenv\fR¤Þ¤¿¤Ï\fIfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fIargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ ++½¤¾þ»Ò\fBenv\fR¤Þ¤¿¤Ï\fBfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fBargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -625,8 +640,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIenv\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBenv\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -637,21 +652,21 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIfile\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBfile\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + \fBÃí°Õ:\fR +-¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¤Þ¤¿¤Ï¥»¥­¥å¥ê¥Æ¥£Êݸ¤ì¤¿¥·¥¹¥Æ¥à¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¤Þ¤¿¤Ï¥»¥­¥å¥¢¤Ê¥·¥¹¥Æ¥à¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-sigfile \fIfile\fR + .RS 4 +-À¸À®¤µ¤ì¤¿\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤ª¤è¤Ó\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë»ÈÍѤ¹¤ë¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Õ¥¡¥¤¥ë¤¬\fIDUKESIGN\fR¤Î¾ì¹ç¡¢À¸À®¤µ¤ì¤ë\fI\&.SF\fR¤ª¤è¤Ó\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ï¡¢\fIDUKESIGN\&.SF\fR¤ª¤è¤Ó\fIDUKESIGN\&.DSA\fR¤È¤¤¤¦Ì¾Á°¤Ç¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î\fIMETA\-INF\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ ++À¸À®¤µ¤ì¤¿\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤ª¤è¤Ó\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë»ÈÍѤ¹¤ë¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Õ¥¡¥¤¥ë¤¬\fBDUKESIGN\fR¤Î¾ì¹ç¡¢À¸À®¤µ¤ì¤ë\fB\&.SF\fR¤ª¤è¤Ó\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ï¡¢\fBDUKESIGN\&.SF\fR¤ª¤è¤Ó\fBDUKESIGN\&.DSA\fR¤È¤¤¤¦Ì¾Á°¤Ç¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î\fBMETA\-INF\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .sp +-¥Õ¥¡¥¤¥ëÆâ¤Îʸ»ú¤Ï¡¢¥»¥Ã¥È\fIa\-zA\-Z0\-9_\-\fR¤«¤é»ØÄꤵ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¡¢¿ô»ú¡¢²¼Àþ¤ª¤è¤Ó¥Ï¥¤¥Õ¥óʸ»ú¤Î¤ß¤ò»ÈÍѤǤ­¤Þ¤¹¡£\fI\&.SF\fR¤ª¤è¤Ó\fI\&.DSA\fR¤Î¥Õ¥¡¥¤¥ë̾¤Ç¤Ï¡¢¾®Ê¸»ú¤Ï¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ëÆâ¤Îʸ»ú¤Ï¡¢¥»¥Ã¥È\fBa\-zA\-Z0\-9_\-\fR¤«¤é»ØÄꤵ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¡¢¿ô»ú¡¢²¼Àþ¤ª¤è¤Ó¥Ï¥¤¥Õ¥óʸ»ú¤Î¤ß¤ò»ÈÍѤǤ­¤Þ¤¹¡£\fB\&.SF\fR¤ª¤è¤Ó\fB\&.DSA\fR¤Î¥Õ¥¡¥¤¥ë̾¤Ç¤Ï¡¢¾®Ê¸»ú¤Ï¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£ + .sp +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-sigfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ÎÀèƬ¤Î8ʸ»ú¤ò¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ÊÌ̾¤¬8ʸ»ṳ́Ëþ¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤¬¤½¤Î¤Þ¤Þ»ÈÍѤµ¤ì¤Þ¤¹¡£ÊÌ̾¤Ë¡¢½ð̾¥Õ¥¡¥¤¥ë̾¤Ç̵¸ú¤Êʸ»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾¤òºîÀ®¤¹¤ë¤¿¤á¤Ë¡¢³ºÅö¤¹¤ëʸ»ú¤¬²¼Àþ(_)ʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-sigfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ÎÀèƬ¤Î8ʸ»ú¤ò¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ÊÌ̾¤¬8ʸ»ṳ́Ëþ¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤¬¤½¤Î¤Þ¤Þ»ÈÍѤµ¤ì¤Þ¤¹¡£ÊÌ̾¤Ë¡¢½ð̾¥Õ¥¡¥¤¥ë̾¤Ç̵¸ú¤Êʸ»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾¤òºîÀ®¤¹¤ë¤¿¤á¤Ë¡¢³ºÅö¤¹¤ëʸ»ú¤¬²¼Àþ(_)ʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-sigalg \fIalgorithm\fR +@@ -661,7 +676,7 @@ + ɸ½àŪ¤Ê½ð̾¥¢¥ë¥´¥ê¥º¥à̾¤Î¥ê¥¹¥È¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec\&.html#AppA¤Ë¤¢¤ë + Java Cryptography Architecture (JCA)¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥¬¥¤¥É¤Î¡ÖÉÕÏ¿A: ɸ½à̾¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ë¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤Ë»ÈÍѤ¹¤ëÈëÌ©¸°¤È¤Î¸ß´¹À­¤¬É¬ÍפǤ¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢ÈëÌ©¸°¤Î¥¿¥¤¥×¤Ë±þ¤¸¤Æ¡¢\fISHA1withDSA\fR¡¢\fISHA256withRSA\fR¤Þ¤¿¤Ï\fISHA256withECDSA\fR¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥¢¥ë¥´¥ê¥º¥à¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¤¬ÀÅŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fI\-providerClass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤Î¤è¤¦¤Ê¥×¥í¥Ð¥¤¥À¤ò¥æ¡¼¥¶¡¼¤¬»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¼ºÇÔ¤·¤Þ¤¹¡£ ++¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ë¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤Ë»ÈÍѤ¹¤ëÈëÌ©¸°¤È¤Î¸ß´¹À­¤¬É¬ÍפǤ¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢ÈëÌ©¸°¤Î¥¿¥¤¥×¤Ë±þ¤¸¤Æ¡¢\fBSHA1withDSA\fR¡¢\fBSHA256withRSA\fR¤Þ¤¿¤Ï\fBSHA256withECDSA\fR¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥¢¥ë¥´¥ê¥º¥à¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¤¬ÀÅŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fB\-providerClass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤Î¤è¤¦¤Ê¥×¥í¥Ð¥¤¥À¤ò¥æ¡¼¥¶¡¼¤¬»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¼ºÇÔ¤·¤Þ¤¹¡£ + .RE + .PP + \-digestalg \fIalgorithm\fR +@@ -671,60 +686,61 @@ + ɸ½àŪ¤Ê¥á¥Ã¥»¡¼¥¸¡¦¥À¥¤¥¸¥§¥¹¥È¡¦¥¢¥ë¥´¥ê¥º¥à̾¤Î¥ê¥¹¥È¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec\&.html#AppA¤Ë¤¢¤ë + Java Cryptography Architecture (JCA)¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥¬¥¤¥É¤Î¡ÖÉÕÏ¿A: ɸ½à̾¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fISHA256\fR¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥¢¥ë¥´¥ê¥º¥à¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¤¬ÀÅŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fI\-providerClass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤Î¤è¤¦¤Ê¥×¥í¥Ð¥¤¥À¤ò¥æ¡¼¥¶¡¼¤¬»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¼ºÇÔ¤·¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fBSHA256\fR¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥¢¥ë¥´¥ê¥º¥à¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¤¬ÀÅŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fB\-providerClass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤Î¤è¤¦¤Ê¥×¥í¥Ð¥¤¥À¤ò¥æ¡¼¥¶¡¼¤¬»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¼ºÇÔ¤·¤Þ¤¹¡£ + .RE + .PP + \-certs + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¡¢\fI\-certs\fR¥ª¥×¥·¥ç¥ó¤ò\fI\-verify\fR¤ª¤è¤Ó\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊ󤬽ÐÎϤ˴ޤޤì¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ë¤Ï¡¢½ð̾¼Ô¤Î¸ø³«¸°¤ò¾ÚÌÀ¤¹¤ë¾ÚÌÀ½ñ(\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ)¤Î¥¿¥¤¥×¤Î̾Á°¤¬´Þ¤Þ¤ì¡¢¾ÚÌÀ½ñ¤¬X\&.509¾ÚÌÀ½ñ(\fIjava\&.security\&.cert\&.X509Certificate\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹)¤Î¾ì¹ç¡¢½ð̾¼Ô¤Î¼±ÊÌ̾¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç¡¢\fB\-certs\fR¥ª¥×¥·¥ç¥ó¤ò\fB\-verify\fR¤ª¤è¤Ó\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊ󤬽ÐÎϤ˴ޤޤì¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ë¤Ï¡¢½ð̾¼Ô¤Î¸ø³«¸°¤ò¾ÚÌÀ¤¹¤ë¾ÚÌÀ½ñ(\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ)¤Î¥¿¥¤¥×¤Î̾Á°¤¬´Þ¤Þ¤ì¡¢¾ÚÌÀ½ñ¤¬X\&.509¾ÚÌÀ½ñ(\fBjava\&.security\&.cert\&.X509Certificate\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹)¤Î¾ì¹ç¡¢½ð̾¼Ô¤Î¼±ÊÌ̾¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .sp +-¥­¡¼¥¹¥È¥¢¤Î³Îǧ¤â¹Ô¤ï¤ì¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥­¡¼¥¹¥È¥¢¤ÎÃͤ¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë(¤¢¤ë¾ì¹ç)¤¬¥Á¥§¥Ã¥¯¤µ¤ì¤Þ¤¹¡£½ð̾¼Ô¤Î¸ø³«¸°¤Î¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢Æâ¤Î¥¨¥ó¥È¥ê¤È°ìÃפ¹¤ë¾ì¹ç¡¢¤½¤Î½ð̾¼Ô¤Î¥­¡¼¥¹¥È¥¢¤Î¥¨¥ó¥È¥ê¤ÎÊÌ̾¤¬´Ý¥«¥Ã¥³Æâ¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î³Îǧ¤â¹Ô¤ï¤ì¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¥­¡¼¥¹¥È¥¢¤ÎÃͤ¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë(¤¢¤ë¾ì¹ç)¤¬¥Á¥§¥Ã¥¯¤µ¤ì¤Þ¤¹¡£½ð̾¼Ô¤Î¸ø³«¸°¤Î¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢Æâ¤Î¥¨¥ó¥È¥ê¤È°ìÃפ¹¤ë¾ì¹ç¡¢¤½¤Î½ð̾¼Ô¤Î¥­¡¼¥¹¥È¥¢¤Î¥¨¥ó¥È¥ê¤ÎÊÌ̾¤¬´Ý¥«¥Ã¥³Æâ¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-certchain \fIfile\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤¿ÊÌ̾¤Ë¤è¤Ã¤Æɽ¤µ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬´°Á´¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ë¡¢»ÈÍѤ¹¤ë¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥óÁ´ÂΤòÊÝ»ý¤¹¤ë¤Î¤Ë½½Ê¬¤ÊÎΰ褬¤Ê¤¤¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¾å¤Ë¥­¡¼¥¹¥È¥¢¤¬³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï°ìÏ¢¤ÎÏ¢·ë¤µ¤ì¤¿X\&.509¾ÚÌÀ½ñ¡¢PKCS#7·Á¼°¤Îñ°ì¥Ç¡¼¥¿¡¦¥Ö¥í¥Ã¥¯¤Î¤¤¤º¤ì¤«¤È¤Ê¤ê¡¢¤½¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°¤Ï¥Ð¥¤¥Ê¥ê¡¦¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°¡¢Internet RFC 1421ɸ½à¤Çµ¬Äꤵ¤ì¤ë°õºþ²Äǽ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°(Base64¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤È¤â¸Æ¤Ð¤ì¤ë)¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ê¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ª¤è¤Óhttp://tools\&.ietf\&.org/html/rfc1421¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤¿ÊÌ̾¤Ë¤è¤Ã¤Æɽ¤µ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬´°Á´¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ë¡¢»ÈÍѤ¹¤ë¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥óÁ´ÂΤòÊÝ»ý¤¹¤ë¤Î¤Ë½½Ê¬¤ÊÎΰ褬¤Ê¤¤¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¾å¤Ë¥­¡¼¥¹¥È¥¢¤¬³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï°ìÏ¢¤ÎÏ¢·ë¤µ¤ì¤¿X\&.509¾ÚÌÀ½ñ¡¢PKCS#7·Á¼°¤Îñ°ì¥Ç¡¼¥¿¡¦¥Ö¥í¥Ã¥¯¤Î¤¤¤º¤ì¤«¤È¤Ê¤ê¡¢¤½¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°¤Ï¥Ð¥¤¥Ê¥ê¡¦¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°¡¢Internet RFC 1421ɸ½à¤Çµ¬Äꤵ¤ì¤ë°õºþ²Äǽ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°(Base64¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤È¤â¸Æ¤Ð¤ì¤ë)¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ê¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ª¤è¤Óhttp://tools\&.ietf\&.org/html/rfc1421¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-verbose + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¾éĹ¥â¡¼¥É¤ÇÆ°ºî¤·¡¢¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢\fIjarsigner\fR¤Ï¡¢JAR¤Î½ð̾¤Þ¤¿¤Ï¸¡¾Ú¤Î¿Ê¹Ô¾õ¶·¤Ë´Ø¤¹¤ëÄɲþðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¾éĹ¥â¡¼¥É¤ÇÆ°ºî¤·¡¢¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢\fBjarsigner\fR¤Ï¡¢JAR¤Î½ð̾¤Þ¤¿¤Ï¸¡¾Ú¤Î¿Ê¹Ô¾õ¶·¤Ë´Ø¤¹¤ëÄɲþðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-internalsf + .RS 4 +-°ÊÁ°¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤ËÀ¸À®¤µ¤ì¤¿\fI\&.DSA\fR +-(½ð̾¥Ö¥í¥Ã¥¯)¥Õ¥¡¥¤¥ë¤Ë¡¢À¸À®¤µ¤ì¤¿\fI\&.SF\fR¥Õ¥¡¥¤¥ë(½ð̾¥Õ¥¡¥¤¥ë)¤Î¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿´°Á´¤Ê¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤·¤¿¡£ ¤³¤ÎÆ°ºî¤ÏÊѹ¹¤µ¤ì¤Þ¤·¤¿¡£½ÐÎÏJAR¥Õ¥¡¥¤¥ëÁ´ÂΤΥµ¥¤¥º¤ò¾®¤µ¤¯¤¹¤ë¤¿¤á¤Ë¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Ê¤¤¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-internalsf\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢°ÊÁ°¤ÈƱ¤¸¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Æ¥¹¥È¤ò¹Ô¤¦¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¼ÂºÝ¤Ë¤Ï¡¢\fI\-internalsf\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礭¤¯¤Ê¤ë¤¿¤á¡¢»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++°ÊÁ°¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤ËÀ¸À®¤µ¤ì¤¿\fB\&.DSA\fR ++(½ð̾¥Ö¥í¥Ã¥¯)¥Õ¥¡¥¤¥ë¤Ë¡¢À¸À®¤µ¤ì¤¿\fB\&.SF\fR¥Õ¥¡¥¤¥ë(½ð̾¥Õ¥¡¥¤¥ë)¤Î¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿´°Á´¤Ê¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤·¤¿¡£ ¤³¤ÎÆ°ºî¤ÏÊѹ¹¤µ¤ì¤Þ¤·¤¿¡£½ÐÎÏJAR¥Õ¥¡¥¤¥ëÁ´ÂΤΥµ¥¤¥º¤ò¾®¤µ¤¯¤¹¤ë¤¿¤á¤Ë¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Ê¤¤¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-internalsf\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢°ÊÁ°¤ÈƱ¤¸¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Æ¥¹¥È¤ò¹Ô¤¦¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¼ÂºÝ¤Ë¤Ï¡¢\fB\-internalsf\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礭¤¯¤Ê¤ë¤¿¤á¡¢»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-sectionsonly + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-sectionsonly\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤ËÀ¸À®¤µ¤ì¤ë\fI\&.SF\fR¥Õ¥¡¥¤¥ë(½ð̾¥Õ¥¡¥¤¥ë)¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥå·¥å¤ò´Þ¤à¥Ø¥Ã¥À¡¼¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë´Þ¤Þ¤ì¤ë¤Î¤Ï¡¢JAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë´ØÏ¢¤¹¤ë¾ðÊ󤪤è¤Ó¥Ï¥Ã¥·¥å¤Î¤ß¤Ç¤¹¡£½ð̾¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-sectionsonly\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤ËÀ¸À®¤µ¤ì¤ë\fB\&.SF\fR¥Õ¥¡¥¤¥ë(½ð̾¥Õ¥¡¥¤¥ë)¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥå·¥å¤ò´Þ¤à¥Ø¥Ã¥À¡¼¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë´Þ¤Þ¤ì¤ë¤Î¤Ï¡¢JAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë´ØÏ¢¤¹¤ë¾ðÊ󤪤è¤Ó¥Ï¥Ã¥·¥å¤Î¤ß¤Ç¤¹¡£½ð̾¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇŬ²½¤Î¤¿¤á¤Ë¡¢¤³¤Î¥Ø¥Ã¥À¡¼¤¬Äɲ䵤ì¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤¹¤ë¤¿¤Ó¤Ë¡¢¸¡¾Ú¤Ç¤Ï¡¢¤Þ¤º¥Ø¥Ã¥À¡¼Æâ¤Î¥Ï¥Ã¥·¥å¤¬¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥå·¥å¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£°ìÃפ¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ï¼¡¤Î¼ê½ç¤Ë¿Ê¤ß¤Þ¤¹¡£°ìÃפ·¤Ê¤¤¾ì¹ç¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¾ðÊ󥻥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤È¤¤¤¦¡¢¤¢¤Þ¤êºÇŬ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¸¡¾Ú¤ò¼Â¹Ô¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇŬ²½¤Î¤¿¤á¤Ë¡¢¤³¤Î¥Ø¥Ã¥À¡¼¤¬Äɲ䵤ì¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤¹¤ë¤¿¤Ó¤Ë¡¢¸¡¾Ú¤Ç¤Ï¡¢¤Þ¤º¥Ø¥Ã¥À¡¼Æâ¤Î¥Ï¥Ã¥·¥å¤¬¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥå·¥å¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£°ìÃפ¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ï¼¡¤Î¼ê½ç¤Ë¿Ê¤ß¤Þ¤¹¡£°ìÃפ·¤Ê¤¤¾ì¹ç¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¾ðÊ󥻥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤È¤¤¤¦¡¢¤¢¤Þ¤êºÇŬ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¸¡¾Ú¤ò¼Â¹Ô¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-sectionsonly\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¼ç¤Ë¥Æ¥¹¥ÈÍѤ˻ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ¹¤ë¤È¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礭¤¯¤Ê¤ë¤¿¤á¡¢¥Æ¥¹¥ÈÍѰʳ°¤Ç¤Ï»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++\fB\-sectionsonly\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¼ç¤Ë¥Æ¥¹¥ÈÍѤ˻ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ¹¤ë¤È¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礭¤¯¤Ê¤ë¤¿¤á¡¢¥Æ¥¹¥ÈÍѰʳ°¤Ç¤Ï»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-protected + .RS 4 +-\fItrue\fR¤Þ¤¿¤Ï\fIfalse\fR¤Î¤¤¤º¤ì¤«¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£ÀìÍÑPIN¥ê¡¼¥À¡¼¤Ê¤É¤ÎÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹¤Ë¤è¤Ã¤Æ¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢\fItrue\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBtrue\fR¤Þ¤¿¤Ï\fBfalse\fR¤Î¤¤¤º¤ì¤«¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£ÀìÍÑPIN¥ê¡¼¥À¡¼¤Ê¤É¤ÎÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹¤Ë¤è¤Ã¤Æ¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢\fBtrue\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-providerClass \fIprovider\-class\-name\fR + .RS 4 +-°Å¹æ²½¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¤¬\fIjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¤­¤Ï¡¢¤½¤Î¥Þ¥¹¥¿¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò»ØÄꤹ¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ ++°Å¹æ²½¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¤¬\fBjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¤­¤Ï¡¢¤½¤Î¥Þ¥¹¥¿¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò»ØÄꤹ¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp +-\fI\-providerArg ConfigFilePath\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¡¢\fIkeytool\fR¤ª¤è¤Ó\fIjarsigner\fR¥Ä¡¼¥ë¤Ï¡¢¥×¥í¥Ð¥¤¥À¤òưŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤·¡¢¥È¡¼¥¯¥ó¹½À®¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤Ë\fIConfigFilePath\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤ÎÎã¤Ï¡¢Oracle PKCS #11¥×¥í¥Ð¥¤¥À¤¬¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ë¹½À®¤µ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë\fIPKCS #11\fR¥­¡¼¥¹¥È¥¢¤ò°ìÍ÷ɽ¼¨¤¹¤ë¥³¥Þ¥ó¥É¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ ++\fB\-providerArg ConfigFilePath\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¡¢\fBkeytool\fR¤ª¤è¤Ó\fBjarsigner\fR¥Ä¡¼¥ë¤Ï¡¢¥×¥í¥Ð¥¤¥À¤òưŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤·¡¢¥È¡¼¥¯¥ó¹½À®¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤Ë\fIConfigFilePath\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤ÎÎã¤Ï¡¢Oracle PKCS #11¥×¥í¥Ð¥¤¥À¤¬¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ë¹½À®¤µ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë\fBPKCS #11\fR¥­¡¼¥¹¥È¥¢¤ò°ìÍ÷ɽ¼¨¤¹¤ë¥³¥Þ¥ó¥É¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore NONE \-storetype PKCS11 \e +- \-providerClass sun\&.security\&.pkcs11\&.SunPKCS11 \e +- \-providerArg /mydir1/mydir2/token\&.config \e +- \-list ++\fBjarsigner \-keystore NONE \-storetype PKCS11 \e\fR ++\fB \-providerClass sun\&.security\&.pkcs11\&.SunPKCS11 \e\fR ++\fB \-providerArg /mydir1/mydir2/token\&.config \e\fR ++\fB \-list\fR ++ + .fi + .if n \{\ + .RE +@@ -733,17 +749,18 @@ + .PP + \-providerName \fIproviderName\fR + .RS 4 +-\fIjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Ç2¤Ä°Ê¾å¤Î¥×¥í¥Ð¥¤¥À¤¬¹½À®¤µ¤ì¤¿¾ì¹ç¡¢\fI\-providerName\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢ÆÃÄê¤Î¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤òÂоݤˤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ï¡¢¥×¥í¥Ð¥¤¥À¤Î̾Á°¤Ç¤¹¡£ ++\fBjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Ç2¤Ä°Ê¾å¤Î¥×¥í¥Ð¥¤¥À¤¬¹½À®¤µ¤ì¤¿¾ì¹ç¡¢\fB\-providerName\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢ÆÃÄê¤Î¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤òÂоݤˤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ï¡¢¥×¥í¥Ð¥¤¥À¤Î̾Á°¤Ç¤¹¡£ + .sp +-Oracle PKCS #11¥×¥í¥Ð¥¤¥À¤Î¾ì¹ç¡¢\fIproviderName\fR¤Ï\fISunPKCS11\-\fR\fITokenName\fR¤È¤¤¤¦·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤³¤Ç¡¢¹½À®Â°À­¤Îɽ¤Ç¾ÜºÙ¤ËÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢\fITokenName\fR¤Ï¡¢¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤¬¹½À®¤µ¤ì¤¿Ì¾Á°¤ÎÀÜÈø¼­¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Ì¾Á°ÀÜÈø¼­\fISmartCard\fR¤Î\fIPKCS #11\fR¥­¡¼¥¹¥È¥¢¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÆâÍƤò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£ ++Oracle PKCS #11¥×¥í¥Ð¥¤¥À¤Î¾ì¹ç¡¢\fIproviderName\fR¤Ï\fBSunPKCS11\-\fR\fITokenName\fR¤È¤¤¤¦·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤³¤Ç¡¢¹½À®Â°À­¤Îɽ¤Ç¾ÜºÙ¤ËÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢\fITokenName\fR¤Ï¡¢¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤¬¹½À®¤µ¤ì¤¿Ì¾Á°¤ÎÀÜÈø¼­¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Ì¾Á°ÀÜÈø¼­\fBSmartCard\fR¤Î\fBPKCS #11\fR¥­¡¼¥¹¥È¥¢¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÆâÍƤò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore NONE \-storetype PKCS11 \e +- \-providerName SunPKCS11\-SmartCard \e +- \-list ++\fBjarsigner \-keystore NONE \-storetype PKCS11 \e\fR ++\fB \-providerName SunPKCS11\-SmartCard \e\fR ++\fB \-list\fR ++ + .fi + .if n \{\ + .RE +@@ -752,41 +769,41 @@ + .PP + \-J\fIjavaoption\fR + .RS 4 +-»ØÄꤵ¤ì¤¿\fIjavaoption\fRʸ»úÎó¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤ËľÀÜÅϤ·¤Þ¤¹¡£\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¤¥ó¥¿¥×¥ê¥¿¤ËÂФ¹¤ë¥é¥Ã¥Ñ¡¼¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤòÄ´À°¤¹¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£»ØÄê¤Ç¤­¤ë¥¤¥ó¥¿¥×¥ê¥¿¡¦¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjava \-h\fR¤Þ¤¿¤Ï\fIjava \-X\fR¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£ ++»ØÄꤵ¤ì¤¿\fIjavaoption\fRʸ»úÎó¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤ËľÀÜÅϤ·¤Þ¤¹¡£\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¤¥ó¥¿¥×¥ê¥¿¤ËÂФ¹¤ë¥é¥Ã¥Ñ¡¼¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤòÄ´À°¤¹¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£»ØÄê¤Ç¤­¤ë¥¤¥ó¥¿¥×¥ê¥¿¡¦¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç\fBjava \-h\fR¤Þ¤¿¤Ï\fBjava \-X\fR¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-tsa \fIurl\fR + .RS 4 +-\fI\-tsa http://example\&.tsa\&.url\fR¤¬JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¤¢¤ë¾ì¹ç¡¢½ð̾¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬À¸À®¤µ¤ì¤Þ¤¹¡£URL +-\fIhttp://example\&.tsa\&.url\fR¤Ï¡¢Time Stamping Authority (TSA)¤Î¾ì½ê¤òÆÃÄꤷ¡¢\fI\-tsacert\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¸¡½Ð¤µ¤ì¤¿URL¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fI\-tsa\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢TSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤ËÇÛÃÖ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ ++\fB\-tsa http://example\&.tsa\&.url\fR¤¬JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë¥³¥Þ¥ó¥É¹Ô¤Ë¤¢¤ë¾ì¹ç¡¢½ð̾¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬À¸À®¤µ¤ì¤Þ¤¹¡£URL ++\fBhttp://example\&.tsa\&.url\fR¤Ï¡¢Time Stamping Authority (TSA)¤Î¾ì½ê¤òÆÃÄꤷ¡¢\fB\-tsacert\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¸¡½Ð¤µ¤ì¤¿URL¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fB\-tsa\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢TSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤ËÇÛÃÖ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ + .sp +-¥¿¥¤¥à¥¹¥¿¥ó¥×¤òÀ¸À®¤¹¤ë¤¿¤á¤Ë¡¢\fIjarsigner\fR¤Ï¡¢RFC 3161¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥¿¥¤¥à¥¹¥¿¥ó¥×¡¦¥×¥í¥È¥³¥ë(TSP)¤ò»ÈÍѤ·¤ÆTSA¤ÈÄÌ¿®¤·¤Þ¤¹¡£À®¸ù¤¹¤ë¤È¡¢TSA¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤¿¥¿¥¤¥à¥¹¥¿¥ó¥×¡¦¥È¡¼¥¯¥ó¤Ï¡¢½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤Î½ð̾¤È¤È¤â¤ËÊݸ¤µ¤ì¤Þ¤¹¡£ ++¥¿¥¤¥à¥¹¥¿¥ó¥×¤òÀ¸À®¤¹¤ë¤¿¤á¤Ë¡¢\fBjarsigner\fR¤Ï¡¢RFC 3161¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥¿¥¤¥à¥¹¥¿¥ó¥×¡¦¥×¥í¥È¥³¥ë(TSP)¤ò»ÈÍѤ·¤ÆTSA¤ÈÄÌ¿®¤·¤Þ¤¹¡£À®¸ù¤¹¤ë¤È¡¢TSA¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤¿¥¿¥¤¥à¥¹¥¿¥ó¥×¡¦¥È¡¼¥¯¥ó¤Ï¡¢½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤Î½ð̾¤È¤È¤â¤ËÊݸ¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-tsacert \fIalias\fR + .RS 4 +-\fI\-tsacert alias\fR¤¬JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¤¢¤ë¾ì¹ç¡¢½ð̾¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ÊÌ̾¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÍ­¸ú¤ÊTSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤òÆÃÄꤷ¤Þ¤¹¡£¥¨¥ó¥È¥ê¤Î¾ÚÌÀ½ñ¤Ç¡¢TSA¤Î¾ì½ê¤òÆÃÄꤹ¤ëURL¤ò´Þ¤àSubject Information Access³ÈÄ¥µ¡Ç½¤¬³Îǧ¤µ¤ì¤Þ¤¹¡£ ++\fB\-tsacert alias\fR¤¬JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë¥³¥Þ¥ó¥É¹Ô¤Ë¤¢¤ë¾ì¹ç¡¢½ð̾¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ÊÌ̾¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÍ­¸ú¤ÊTSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤òÆÃÄꤷ¤Þ¤¹¡£¥¨¥ó¥È¥ê¤Î¾ÚÌÀ½ñ¤Ç¡¢TSA¤Î¾ì½ê¤òÆÃÄꤹ¤ëURL¤ò´Þ¤àSubject Information Access³ÈÄ¥µ¡Ç½¤¬³Îǧ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-tsacert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢TSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fB\-tsacert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢TSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-tsapolicyid \fIpolicyid\fR + .RS 4 + TSA¥µ¡¼¥Ð¡¼¤ËÁ÷¿®¤¹¤ë¥Ý¥ê¥·¡¼ID¤ò¼±Ê̤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¼±ÊÌ»Ò(OID)¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ý¥ê¥·¡¼ID¤ÏÁ÷¿®¤µ¤ì¤º¡¢TSA¥µ¡¼¥Ð¡¼¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥Ý¥ê¥·¡¼ID¤òÁªÂò¤·¤Þ¤¹¡£ + .sp +-¥ª¥Ö¥¸¥§¥¯¥È¼±Ê̻Ҥϡ¢ITU Telecommunication Standardization Sector (ITU\-T)ɸ½à¤Ç¤¢¤ëX\&.696¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¼±Ê̻Ҥϡ¢Ä̾\fI1\&.2\&.3\&.4\fR¤Ê¤É¤Î¡¢Éé¤Ç¤Ï¤Ê¤¤¿ô»ú¤Î¥Ô¥ê¥ª¥É¶èÀÚ¤ê¤Î¥»¥Ã¥È¤Ç¤¹¡£ ++¥ª¥Ö¥¸¥§¥¯¥È¼±Ê̻Ҥϡ¢ITU Telecommunication Standardization Sector (ITU\-T)ɸ½à¤Ç¤¢¤ëX\&.696¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¼±Ê̻Ҥϡ¢Ä̾\fB1\&.2\&.3\&.4\fR¤Ê¤É¤Î¡¢Éé¤Ç¤Ï¤Ê¤¤¿ô»ú¤Î¥Ô¥ê¥ª¥É¶èÀÚ¤ê¤Î¥»¥Ã¥È¤Ç¤¹¡£ + .RE + .PP + \-altsigner \fIclass\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ÂåÂؽð̾¥á¥«¥Ë¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤Ï¡¢\fIcom\&.sun\&.jarsigner\&.ContentSigner\fRÃê¾Ý¥¯¥é¥¹¤ò³ÈÄ¥¤¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¼±Ê̤·¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤Ï¡¢\fI\-altsignerpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£\fI\-altsigner\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥Õ¥©¥ë¥È¤Î½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ÂåÂؽð̾¥á¥«¥Ë¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤Ï¡¢\fBcom\&.sun\&.jarsigner\&.ContentSigner\fRÃê¾Ý¥¯¥é¥¹¤ò³ÈÄ¥¤¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¼±Ê̤·¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤Ï¡¢\fB\-altsignerpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£\fB\-altsigner\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥Õ¥©¥ë¥È¤Î½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢\fIcom\&.sun\&.sun\&.jarsigner\&.AuthSigner\fR¤È¤¤¤¦Ì¾Á°¤Î¥¯¥é¥¹¤¬Ä󶡤¹¤ë½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢jarsigner¤Î¥ª¥×¥·¥ç¥ó\fI\-altsigner com\&.sun\&.jarsigner\&.AuthSigner\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fBcom\&.sun\&.sun\&.jarsigner\&.AuthSigner\fR¤È¤¤¤¦Ì¾Á°¤Î¥¯¥é¥¹¤¬Ä󶡤¹¤ë½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢jarsigner¤Î¥ª¥×¥·¥ç¥ó\fB\-altsigner com\&.sun\&.jarsigner\&.AuthSigner\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-altsignerpath \fIclasspathlist\fR + .RS 4 +-¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¤½¤ì¤¬°Í¸¤¹¤ëJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-altsigner\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¤½¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¤½¤ì¤¬°Í¸¤¹¤ëJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-altsigner\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¤½¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + ÀäÂХѥ¹¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤ÎÁêÂХѥ¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIclasspathlist\fR¤ËÊ£¿ô¤Î¥Ñ¥¹¤äJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¡¢¤½¤ì¤é¤ò¡¢Oracle Solaris¤Î¾ì¹ç¤Ï¥³¥í¥ó(:)¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó(;)¤Ç¡¢¤½¤ì¤¾¤ì¶èÀÚ¤ê¤Þ¤¹¡£ÌÜŪ¤Î¥¯¥é¥¹¤¬¤¹¤Ç¤Ë¸¡º÷¥Ñ¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹¡£ + .sp +@@ -796,7 +813,8 @@ + .RS 4 + .\} + .nf +-\-altsignerpath /home/user/lib/authsigner\&.jar ++\fB\-altsignerpath /home/user/lib/authsigner\&.jar\fR ++ + .fi + .if n \{\ + .RE +@@ -807,7 +825,8 @@ + .RS 4 + .\} + .nf +-\-altsignerpath /home/user/classes/com/sun/tools/jarsigner/ ++\fB\-altsignerpath /home/user/classes/com/sun/tools/jarsigner/\fR ++ + .fi + .if n \{\ + .RE +@@ -821,23 +840,23 @@ + .PP + \-verbose \fIsuboptions\fR + .RS 4 +-¸¡¾Ú½èÍý¤Î¾ì¹ç¡¢\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢É½¼¨¤¹¤ë¾ðÊó¤ÎÎ̤ò·èÄꤹ¤ë¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-certs\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥â¡¼¥É(¤Þ¤¿¤Ï¥µ¥Ö¥ª¥×¥·¥ç¥ó\fIall\fR)¤Ç¤Ï¡¢¥¨¥ó¥È¥ê¤¬½èÍý¤µ¤ì¤ë¤¿¤Ó¤Ë³Æ¥¨¥ó¥È¥ê¤¬É½¼¨¤µ¤ì¡¢¤½¤Î¸å¤ËJAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊó¤âɽ¼¨¤µ¤ì¤Þ¤¹¡£\fI\-certs\fR¤ª¤è¤Ó\fI\-verbose:grouped\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Æ±¤¸½ð̾¼Ô¾ðÊó¤ò»ý¤Ä¥¨¥ó¥È¥ê¤¬¡¢¤½¤Î¾ÚÌÀ½ñ¾ðÊó¤È¤È¤â¤Ë¡¢¥°¥ë¡¼¥×²½¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£\fI\-certs\fR¤ª¤è¤Ó\fI\-verbose:summary\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Æ±¤¸½ð̾¼Ô¾ðÊó¤ò»ý¤Ä¥¨¥ó¥È¥ê¤¬¡¢¤½¤Î¾ÚÌÀ½ñ¾ðÊó¤È¤È¤â¤Ë¡¢¥°¥ë¡¼¥×²½¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£³Æ¥¨¥ó¥È¥ê¤Î¾ÜºÙ¤Ï¡¢\fI1¤Ä¤Î¥¨¥ó¥È¥ê(°Ê¾å)\fR¤Ë¤Þ¤È¤á¤é¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£Îã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¸¡¾Ú½èÍý¤Î¾ì¹ç¡¢\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢É½¼¨¤¹¤ë¾ðÊó¤ÎÎ̤ò·èÄꤹ¤ë¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-certs\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥â¡¼¥É(¤Þ¤¿¤Ï¥µ¥Ö¥ª¥×¥·¥ç¥ó\fBall\fR)¤Ç¤Ï¡¢¥¨¥ó¥È¥ê¤¬½èÍý¤µ¤ì¤ë¤¿¤Ó¤Ë³Æ¥¨¥ó¥È¥ê¤¬É½¼¨¤µ¤ì¡¢¤½¤Î¸å¤ËJAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊó¤âɽ¼¨¤µ¤ì¤Þ¤¹¡£\fB\-certs\fR¤ª¤è¤Ó\fB\-verbose:grouped\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Æ±¤¸½ð̾¼Ô¾ðÊó¤ò»ý¤Ä¥¨¥ó¥È¥ê¤¬¡¢¤½¤Î¾ÚÌÀ½ñ¾ðÊó¤È¤È¤â¤Ë¡¢¥°¥ë¡¼¥×²½¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£\fB\-certs\fR¤ª¤è¤Ó\fB\-verbose:summary\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Æ±¤¸½ð̾¼Ô¾ðÊó¤ò»ý¤Ä¥¨¥ó¥È¥ê¤¬¡¢¤½¤Î¾ÚÌÀ½ñ¾ðÊó¤È¤È¤â¤Ë¡¢¥°¥ë¡¼¥×²½¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£³Æ¥¨¥ó¥È¥ê¤Î¾ÜºÙ¤Ï¡¢\fI1¤Ä¤Î¥¨¥ó¥È¥ê(°Ê¾å)\fR¤Ë¤Þ¤È¤á¤é¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£Îã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥¨¥é¡¼¤È·Ù¹ð" + .PP +-½ð̾¤Þ¤¿¤Ï¸¡¾Ú¥×¥í¥»¥¹Ãæ¤Ë¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¡¢ÍÍ¡¹¤Ê¥¨¥é¡¼¤Þ¤¿¤Ï·Ù¹ð¤¬È¯¹Ô¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++½ð̾¤Þ¤¿¤Ï¸¡¾Ú¥×¥í¥»¥¹Ãæ¤Ë¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¡¢ÍÍ¡¹¤Ê¥¨¥é¡¼¤Þ¤¿¤Ï·Ù¹ð¤¬È¯¹Ô¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¾ã³²¤¬¤¢¤ë¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É1¤Ç½ªÎ»¤·¤Þ¤¹¡£¾ã³²¤Ï¤Ê¤¤¤¬¡¢1¤Ä°Ê¾å¤Î½ÅÂç¤Ê·Ù¹ð¤¬¤¢¤ë¾ì¹ç¡¢\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ\fB¤¤¤Ê¤¤\fR¾ì¹ç¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É0¤Ç½ªÎ»¤·¡¢\fI\-strict\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï·Ù¹ð¥³¡¼¥É¤ÎORÃͤǽªÎ»¤·¤Þ¤¹¡£¾ðÊó·Ù¹ð¤Î¤ß¤¬¤¢¤ë¡¢¤Þ¤¿¤Ï·Ù¹ð¤¬¤Þ¤Ã¤¿¤¯¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¾ï¤Ë¥³¡¼¥É0¤Ç½ªÎ»¤·¤Þ¤¹¡£ ++¾ã³²¤¬¤¢¤ë¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É1¤Ç½ªÎ»¤·¤Þ¤¹¡£¾ã³²¤Ï¤Ê¤¤¤¬¡¢1¤Ä°Ê¾å¤Î½ÅÂç¤Ê·Ù¹ð¤¬¤¢¤ë¾ì¹ç¡¢\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ\fB¤¤¤Ê¤¤\fR¾ì¹ç¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É0¤Ç½ªÎ»¤·¡¢\fB\-strict\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï·Ù¹ð¥³¡¼¥É¤ÎORÃͤǽªÎ»¤·¤Þ¤¹¡£¾ðÊó·Ù¹ð¤Î¤ß¤¬¤¢¤ë¡¢¤Þ¤¿¤Ï·Ù¹ð¤¬¤Þ¤Ã¤¿¤¯¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¾ï¤Ë¥³¡¼¥É0¤Ç½ªÎ»¤·¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¥¨¥ó¥È¥ê¤Î½ð̾¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬´ü¸ÂÀÚ¤ì¤Ç¡¢¥Õ¥¡¥¤¥ë¤Î½ð̾¤òµö²Ä¤·¤Ê¤¤KeyUsage³ÈÄ¥µ¡Ç½¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¡¢\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¤È¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É12 (=4+8)¤Ç½ªÎ»¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥¨¥ó¥È¥ê¤Î½ð̾¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬´ü¸ÂÀÚ¤ì¤Ç¡¢¥Õ¥¡¥¤¥ë¤Î½ð̾¤òµö²Ä¤·¤Ê¤¤KeyUsage³ÈÄ¥µ¡Ç½¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¡¢\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¤È¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É12 (=4+8)¤Ç½ªÎ»¤·¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-UNIX¥Ù¡¼¥¹¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¤Ï0¤«¤é255¤Þ¤Ç¤ÎÃͤΤߤ¬Í­¸ú¤Î¤¿¤á¡¢½ªÎ»¥³¡¼¥É¤ÏºÆÍøÍѤµ¤ì¤Þ¤¹¡£ ++Solaris¡¢Linux¤ª¤è¤ÓOS X¤Ç¤Ï0¤«¤é255¤Þ¤Ç¤ÎÃͤΤߤ¬Í­¸ú¤Î¤¿¤á¡¢½ªÎ»¥³¡¼¥É¤ÏºÆÍøÍѤµ¤ì¤Þ¤¹¡£ + .PP +-¼¡¤Î¥»¥¯¥·¥ç¥ó¤Ç¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤êȯ¹Ô¤Ç¤­¤ë¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¤Î̾Á°¡¢¥³¡¼¥É¡¢ÀâÌÀ¤òµ­½Ò¤·¤Þ¤¹¡£ ++¼¡¤Î¥»¥¯¥·¥ç¥ó¤Ç¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤êȯ¹Ô¤Ç¤­¤ë¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¤Î̾Á°¡¢¥³¡¼¥É¡¢ÀâÌÀ¤òµ­½Ò¤·¤Þ¤¹¡£ + .SS "¾ã³²" + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó²òÀÏ¥¨¥é¡¼¡¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¸°¥Ú¥¢¤ò¸¡º÷¤Ç¤­¤Ê¤¤¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¼ºÇԤʤÉ(¸ÂÄꤵ¤ì¤Þ¤»¤ó)¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Î¼ºÇÔÍýͳ¡£ ++¥³¥Þ¥ó¥É¹Ô²òÀÏ¥¨¥é¡¼¡¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¸°¥Ú¥¢¤ò¸¡º÷¤Ç¤­¤Ê¤¤¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¼ºÇԤʤÉ(¸ÂÄꤵ¤ì¤Þ¤»¤ó)¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Î¼ºÇÔÍýͳ¡£ + .PP + failure + .RS 4 +@@ -846,9 +865,9 @@ + .SS "½ÅÂç¤Ê·Ù¹ð" + .PP + \fBÃí°Õ:\fR +-\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢½ÅÂç¤Ê·Ù¹ð¤Ï¥¨¥é¡¼¤È¤·¤ÆÊó¹ð¤µ¤ì¤Þ¤¹¡£ ++\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢½ÅÂç¤Ê·Ù¹ð¤Ï¥¨¥é¡¼¤È¤·¤ÆÊó¹ð¤µ¤ì¤Þ¤¹¡£ + .PP +-JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤Ë»ÈÍѤ¹¤ë¾ÚÌÀ½ñ¤Ë¥¨¥é¡¼¤¬¤¢¤ë¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë¾¤ÎÌäÂ꤬¤¢¤ë¤Ê¤É¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤¬½ÅÂç¤Ê·Ù¹ð¤òȯ¹Ô¤¹¤ëÍýͳ¡£ ++JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤Ë»ÈÍѤ¹¤ë¾ÚÌÀ½ñ¤Ë¥¨¥é¡¼¤¬¤¢¤ë¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë¾¤ÎÌäÂ꤬¤¢¤ë¤Ê¤É¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤¬½ÅÂç¤Ê·Ù¹ð¤òȯ¹Ô¤¹¤ëÍýͳ¡£ + .PP + hasExpiredCert + .RS 4 +@@ -862,7 +881,7 @@ + .PP + chainNotValidated + .RS 4 +-¥³¡¼¥É4¡£¤³¤Îjar¤Ë¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬Àµ¤·¤¯¸¡¾Ú¤Ç¤­¤Ê¤¤¥¨¥ó¥È¥ê¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¥³¡¼¥É4¡£¤³¤Îjar¤Ë¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬¸¡¾Ú¤µ¤ì¤Æ¤¤¤Ê¤¤¥¨¥ó¥È¥ê¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + badKeyUsage +@@ -905,27 +924,28 @@ + .PP + noTimestamp + .RS 4 +-¤³¤Îjar¤Ë¤Ï¡¢¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤Þ¤Ê¤¤½ð̾¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ê¤·¤Ç¤Ï¡¢½ð̾¼Ô¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü¸Â(\fIYYYY\-MM\-DD\fR)¸å¤Þ¤¿¤Ï¾­Íè¤Î¼è¾ÃÆü¸å¡¢¥æ¡¼¥¶¡¼¤Ï¤³¤ÎJAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤Ç¤­¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ ++¤³¤Îjar¤Ë¤Ï¡¢¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤Þ¤Ê¤¤½ð̾¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ê¤·¤Ç¤Ï¡¢½ð̾¼Ô¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü¸Â(\fBYYYY\-MM\-DD\fR)¸å¤Þ¤¿¤Ï¾­Íè¤Î¼è¾ÃÆü¸å¡¢¥æ¡¼¥¶¡¼¤Ï¤³¤ÎJAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤Ç¤­¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .SH "Îã" + .SS "JAR¥Õ¥¡¥¤¥ë¤Î½ð̾" + .PP +-¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢ÊÌ̾¤¬\fIworking\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fImystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤Ë¤¢¤ë\fIjane\fR¤Ç¤¢¤ë¥æ¡¼¥¶¡¼¤ÎÈëÌ©¸°¤Çbundle\&.jar¤Ë½ð̾¤·¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë\fIsbundle\&.jar\fR¤È¤¤¤¦Ì¾Á°¤òÉÕ¤±¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢ÊÌ̾¤¬\fBworking\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fBmystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤Ë¤¢¤ë\fBjane\fR¤Ç¤¢¤ë¥æ¡¼¥¶¡¼¤ÎÈëÌ©¸°¤Çbundle\&.jar¤Ë½ð̾¤·¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë\fBsbundle\&.jar\fR¤È¤¤¤¦Ì¾Á°¤òÉÕ¤±¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore /working/mystore +- \-storepass +- \-keypass +- \-signedjar sbundle\&.jar bundle\&.jar jane ++\fBjarsigner \-keystore /working/mystore\fR ++\fB \-storepass \fR ++\fB \-keypass \fR ++\fB \-signedjar sbundle\&.jar bundle\&.jar jane\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-Á°½Ò¤Î¥³¥Þ¥ó¥É¤Ç¤Ï\fI\-sigfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤ëÀ¸À®¤µ¤ì¤¿\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤ª¤è¤Ó\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ï¡¢ÊÌ̾¤Ë´ð¤Å¤¤¤¿¥Ç¥Õ¥©¥ë¥È¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢Ì¾Á°ÉÕ¤­¤Î\fIJANE\&.SF\fR¤ª¤è¤Ó\fIJANE\&.DSA\fR¤Ç¤¹¡£ ++Á°½Ò¤Î¥³¥Þ¥ó¥É¤Ç¤Ï\fB\-sigfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤ëÀ¸À®¤µ¤ì¤¿\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤ª¤è¤Ó\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ï¡¢ÊÌ̾¤Ë´ð¤Å¤¤¤¿¥Ç¥Õ¥©¥ë¥È¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢Ì¾Á°ÉÕ¤­¤Î\fBJANE\&.SF\fR¤ª¤è¤Ó\fBJANE\&.DSA\fR¤Ç¤¹¡£ + .PP + ¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ª¤è¤ÓÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤òµá¤á¤é¤ì¤ë¾ì¹ç¡¢Á°½Ò¤Î¥³¥Þ¥ó¥É¤òû½Ì¤·¤Æ¡¢¼¡¤Î¤³¤È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ + .sp +@@ -933,8 +953,9 @@ + .RS 4 + .\} + .nf +-jarsigner \-keystore /working/mystore +- \-signedjar sbundle\&.jar bundle\&.jar jane ++\fBjarsigner \-keystore /working/mystore\fR ++\fB \-signedjar sbundle\&.jar bundle\&.jar jane\fR ++ + .fi + .if n \{\ + .RE +@@ -946,19 +967,21 @@ + .RS 4 + .\} + .nf +-jarsigner \-signedjar sbundle\&.jar bundle\&.jar jane ++\fBjarsigner \-signedjar sbundle\&.jar bundle\&.jar jane\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-ÆþÎÏJAR¥Õ¥¡¥¤¥ë(bundle\&.jar)¤ò½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ç¾å½ñ¤­¤¹¤ë¾ì¹ç¡¢¼¡¤Î¤è¤¦¤Ë\fI\-signedjar\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ ++ÆþÎÏJAR¥Õ¥¡¥¤¥ë(bundle\&.jar)¤ò½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ç¾å½ñ¤­¤¹¤ë¾ì¹ç¡¢¼¡¤Î¤è¤¦¤Ë\fB\-signedjar\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner bundle\&.jar jane ++\fBjarsigner bundle\&.jar jane\fR ++ + .fi + .if n \{\ + .RE +@@ -971,66 +994,69 @@ + .RS 4 + .\} + .nf +-jarsigner \-verify sbundle\&.jar ++\fBjarsigner \-verify sbundle\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¸¡¾Ú¤¬À®¸ù¤¹¤ë¤È¡¢\fIjar verified\fR¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¢¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÜºÙ¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£\fIjarsigner\fR¤ò\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¥µ¥ó¥×¥ë¤ò¡¢¼¡¤Ë¼¨¤·¤Þ¤¹¡£ ++¸¡¾Ú¤¬À®¸ù¤¹¤ë¤È¡¢\fBjar verified\fR¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¢¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÜºÙ¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£\fBjarsigner\fR¤ò\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¥µ¥ó¥×¥ë¤ò¡¢¼¡¤Ë¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-verify \-verbose sbundle\&.jar ++\fBjarsigner \-verify \-verbose sbundle\&.jar\fR ++\fB \fR ++\fB 198 Fri Sep 26 16:14:06 PDT 1997 META\-INF/MANIFEST\&.MF\fR ++\fB 199 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.SF\fR ++\fB 1013 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.DSA\fR ++\fB smk 2752 Fri Sep 26 16:12:30 PDT 1997 AclEx\&.class\fR ++\fB smk 849 Fri Sep 26 16:12:46 PDT 1997 test\&.class\fR ++\fB \fR ++\fB s = signature was verified\fR ++\fB m = entry is listed in manifest\fR ++\fB k = at least one certificate was found in keystore\fR ++\fB \fR ++\fB jar verified\&.\fR + +- 198 Fri Sep 26 16:14:06 PDT 1997 META\-INF/MANIFEST\&.MF +- 199 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.SF +- 1013 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.DSA +- smk 2752 Fri Sep 26 16:12:30 PDT 1997 AclEx\&.class +- smk 849 Fri Sep 26 16:12:46 PDT 1997 test\&.class +- +- s = signature was verified +- m = entry is listed in manifest +- k = at least one certificate was found in keystore +- +- jar verified\&. + .fi + .if n \{\ + .RE + .\} + .SS "¾ÚÌÀ½ñ¾ðÊó¤ò»ÈÍѤ·¤¿¸¡¾Ú" + .PP +-\fI\-certs\fR¥ª¥×¥·¥ç¥ó¤ò\fI\-verify\fR¤ª¤è¤Ó\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊ󤬽ÐÎϤ˴ޤޤì¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ë¤Ï¡¢¾ÚÌÀ½ñ¥¿¥¤¥×¡¢½ð̾¼Ô¤Î¼±ÊÌ̾¾ðÊó(X\&.509¾ÚÌÀ½ñ¤Î¾ì¹ç)¤¬´Þ¤Þ¤ì¡¢´Ý¥«¥Ã¥³Æâ¤Ë¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î¸ø³«¸°¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤Î¸ø³«¸°¾ÚÌÀ½ñ¤Ë°ìÃפ¹¤ë¾ì¹ç¤Î½ð̾¼Ô¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB\-certs\fR¥ª¥×¥·¥ç¥ó¤ò\fB\-verify\fR¤ª¤è¤Ó\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊ󤬽ÐÎϤ˴ޤޤì¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ë¤Ï¡¢¾ÚÌÀ½ñ¥¿¥¤¥×¡¢½ð̾¼Ô¤Î¼±ÊÌ̾¾ðÊó(X\&.509¾ÚÌÀ½ñ¤Î¾ì¹ç)¤¬´Þ¤Þ¤ì¡¢´Ý¥«¥Ã¥³Æâ¤Ë¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î¸ø³«¸°¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤Î¸ø³«¸°¾ÚÌÀ½ñ¤Ë°ìÃפ¹¤ë¾ì¹ç¤Î½ð̾¼Ô¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore /working/mystore \-verify \-verbose \-certs myTest\&.jar ++\fBjarsigner \-keystore /working/mystore \-verify \-verbose \-certs myTest\&.jar\fR ++\fB \fR ++\fB 198 Fri Sep 26 16:14:06 PDT 1997 META\-INF/MANIFEST\&.MF\fR ++\fB 199 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.SF\fR ++\fB 1013 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.DSA\fR ++\fB 208 Fri Sep 26 16:23:30 PDT 1997 META\-INF/JAVATEST\&.SF\fR ++\fB 1087 Fri Sep 26 16:23:30 PDT 1997 META\-INF/JAVATEST\&.DSA\fR ++\fB smk 2752 Fri Sep 26 16:12:30 PDT 1997 Tst\&.class\fR ++\fB \fR ++\fB X\&.509, CN=Test Group, OU=Java Software, O=Oracle, L=CUP, S=CA, C=US (javatest)\fR ++\fB X\&.509, CN=Jane Smith, OU=Java Software, O=Oracle, L=cup, S=ca, C=us (jane)\fR ++\fB \fR ++\fB s = signature was verified\fR ++\fB m = entry is listed in manifest\fR ++\fB k = at least one certificate was found in keystore\fR ++\fB \fR ++\fB jar verified\&.\fR + +- 198 Fri Sep 26 16:14:06 PDT 1997 META\-INF/MANIFEST\&.MF +- 199 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.SF +- 1013 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.DSA +- 208 Fri Sep 26 16:23:30 PDT 1997 META\-INF/JAVATEST\&.SF +- 1087 Fri Sep 26 16:23:30 PDT 1997 META\-INF/JAVATEST\&.DSA +- smk 2752 Fri Sep 26 16:12:30 PDT 1997 Tst\&.class +- +- X\&.509, CN=Test Group, OU=Java Software, O=Oracle, L=CUP, S=CA, C=US (javatest) +- X\&.509, CN=Jane Smith, OU=Java Software, O=Oracle, L=cup, S=ca, C=us (jane) +- +- s = signature was verified +- m = entry is listed in manifest +- k = at least one certificate was found in keystore +- +- jar verified\&. + .fi + .if n \{\ + .RE + .\} + .PP +-½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤¬X\&.509¾ÚÌÀ½ñ¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢¼±ÊÌ̾¾ðÊó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£¤½¤Î¾ì¹ç¤Ë¤Ï¡¢¾ÚÌÀ½ñ¤Î¥¿¥¤¥×¤ÈÊÌ̾¤Î¤ß¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬PGP¾ÚÌÀ½ñ¤Ç¡¢ÊÌ̾¤¬\fIbob\fR¤Ç¤¢¤ë¾ì¹ç¡¢\fIPGP, (bob)\fR¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤¬X\&.509¾ÚÌÀ½ñ¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢¼±ÊÌ̾¾ðÊó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£¤½¤Î¾ì¹ç¤Ë¤Ï¡¢¾ÚÌÀ½ñ¤Î¥¿¥¤¥×¤ÈÊÌ̾¤Î¤ß¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬PGP¾ÚÌÀ½ñ¤Ç¡¢ÊÌ̾¤¬\fBbob\fR¤Ç¤¢¤ë¾ì¹ç¡¢\fBPGP, (bob)\fR¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/linux/doc/man/ja/java.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/java.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: java +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,8 +21,16 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 +-.TH "java" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" ++.\" Title: java ++.\" Language: Japanese ++.\" Date: 2014ǯ8·î8Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 ++.TH "java" "1" "2014ǯ8·î8Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff + .\" ----------------------------------------------------------------- +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + java \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjava\fR [\fIoptions\fR] \fIclassname\fR [\fIargs\fR] ++\fBjava\fR [\fIoptions\fR] \fIclassname\fR [\fIargs\fR] + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjava\fR [\fIoptions\fR] \fI\-jar\fR \fIfilename\fR [\fIargs\fR] ++\fBjava\fR [\fIoptions\fR] \fB\-jar\fR \fIfilename\fR [\fIargs\fR] + .fi + .if n \{\ + .RE +@@ -74,7 +76,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclassname\fR +@@ -84,37 +86,38 @@ + .PP + \fIfilename\fR + .RS 4 +-¸Æ¤Ó½Ð¤µ¤ì¤ëJava¥¢¡¼¥«¥¤¥Ö(JAR)¥Õ¥¡¥¤¥ë¤Î̾Á°¡£\fI\-jar\fR¥ª¥×¥·¥ç¥ó¤È°ì½ï¤Ë¤Î¤ß»ÈÍѤ·¤Þ¤¹¡£ ++¸Æ¤Ó½Ð¤µ¤ì¤ëJava¥¢¡¼¥«¥¤¥Ö(JAR)¥Õ¥¡¥¤¥ë¤Î̾Á°¡£\fB\-jar\fR¥ª¥×¥·¥ç¥ó¤È°ì½ï¤Ë¤Î¤ß»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \fIargs\fR + .RS 4 +-¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿\fImain()\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¡£ ++¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿\fBmain()\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjava\fR¥³¥Þ¥ó¥É¤ÏJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò³«»Ï¤·¤Þ¤¹¡£Java Runtime Environment (JRE)¤òµ¯Æ°¤·¤¿¸å¡¢»ØÄꤷ¤¿¥¯¥é¥¹¤ò¥í¡¼¥É¤·¡¢¤½¤Î¥¯¥é¥¹¤Î\fImain()\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤ê¡¢¤³¤ì¤ò¹Ô¤¤¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ï¡¢\fIpublic\fR¤ª¤è¤Ó\fIstatic\fR¤È¤·¤ÆÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢ÃͤÏÊÖ¤»¤Þ¤»¤ó¡£¤µ¤é¤Ë¡¢\fIString\fRÇÛÎó¤ò¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ»ØÄê¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥á¥½¥Ã¥ÉÀë¸À¤Ï¼¡¤Î·Á¼°¤ò´Þ¤ß¤Þ¤¹¡£ ++\fBjava\fR¥³¥Þ¥ó¥É¤ÏJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò³«»Ï¤·¤Þ¤¹¡£Java Runtime Environment (JRE)¤òµ¯Æ°¤·¤¿¸å¡¢»ØÄꤷ¤¿¥¯¥é¥¹¤ò¥í¡¼¥É¤·¡¢¤½¤Î¥¯¥é¥¹¤Î\fBmain()\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤ê¡¢¤³¤ì¤ò¹Ô¤¤¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ï¡¢\fIpublic\fR¤ª¤è¤Ó\fIstatic\fR¤È¤·¤ÆÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢ÃͤÏÊÖ¤»¤Þ¤»¤ó¡£¤µ¤é¤Ë¡¢\fBString\fRÇÛÎó¤ò¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ»ØÄê¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥á¥½¥Ã¥ÉÀë¸À¤Ï¼¡¤Î·Á¼°¤ò´Þ¤ß¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public static void main(String[] args) ++\fBpublic static void main(String[] args)\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fImain()\fR¥á¥½¥Ã¥É¤¬¤¢¤ë¤«\fIjavafx\&.application\&.Application\fR¤ò³ÈÄ¥¤¹¤ë¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¤³¤È¤Ç¡¢JavaFX¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òµ¯Æ°¤Ç¤­¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¡¢µ¯Æ°¥Ä¡¼¥ë¤Ï\fIApplication\fR¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¹½À®¤·¡¢¤½¤Î\fIinit()\fR¥á¥½¥Ã¥É¤ò¥³¡¼¥ë¤·¡¢\fIstart(javafx\&.stage\&.Stage)\fR¥á¥½¥Ã¥É¤ò¥³¡¼¥ë¤·¤Þ¤¹¡£ ++\fBjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fBmain()\fR¥á¥½¥Ã¥É¤¬¤¢¤ë¤«\fBjavafx\&.application\&.Application\fR¤ò³ÈÄ¥¤¹¤ë¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¤³¤È¤Ç¡¢JavaFX¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òµ¯Æ°¤Ç¤­¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¡¢µ¯Æ°¥Ä¡¼¥ë¤Ï\fBApplication\fR¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¹½À®¤·¡¢¤½¤Î\fBinit()\fR¥á¥½¥Ã¥É¤ò¥³¡¼¥ë¤·¡¢\fBstart(javafx\&.stage\&.Stage)\fR¥á¥½¥Ã¥É¤ò¥³¡¼¥ë¤·¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjava\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¤Ê¤¤ºÇ½é¤Î°ú¿ô¤Ï¡¢¸Æ¤Ó½Ð¤µ¤ì¤ë¥¯¥é¥¹¤Î´°Á´½¤¾þ̾¤Ç¤¹¡£\fI\-jar\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î°ú¿ô¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤àJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£µ¯Æ°¥¯¥é¥¹¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î\fIMain\-Class\fR¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Ø¥Ã¥À¡¼¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjava\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¤Ê¤¤ºÇ½é¤Î°ú¿ô¤Ï¡¢¸Æ¤Ó½Ð¤µ¤ì¤ë¥¯¥é¥¹¤Î´°Á´½¤¾þ̾¤Ç¤¹¡£\fB\-jar\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î°ú¿ô¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤àJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£µ¯Æ°¥¯¥é¥¹¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î\fBMain\-Class\fR¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Ø¥Ã¥À¡¼¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP + JRE¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¡¢¥¤¥ó¥¹¥È¡¼¥ëºÑ³ÈÄ¥µ¡Ç½¤ª¤è¤Ó¥æ¡¼¥¶¡¼¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Î3²Õ½ê¤«¤é¡¢µ¯Æ°¥¯¥é¥¹(¤ª¤è¤Ó¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¾¤Î¥¯¥é¥¹)¤ò¸¡º÷¤·¤Þ¤¹¡£ + .PP +-¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤Î¸å¤Î°ú¿ô¤Ï¡¢\fImain()\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤Î¸å¤Î°ú¿ô¤Ï¡¢\fBmain()\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjava\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥«¥Æ¥´¥ê¤ËʬÎà¤Ç¤­¤ë¹­ÈϤʥª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++\fBjava\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥«¥Æ¥´¥ê¤ËʬÎà¤Ç¤­¤ë¹­ÈϤʥª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -184,15 +187,15 @@ + .PP + ɸ½à¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java Virtual Machine (JVM)¤Î¤¹¤Ù¤Æ¤Î¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤¹¤ë¤³¤È¤¬Êݾڤµ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢JRE¤Î¥Ð¡¼¥¸¥ç¥ó¤Î³Îǧ¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎÀßÄê¡¢¾éĹ¤Ê½ÐÎϤÎÍ­¸ú²½¤Ê¤É¤Î°ìÈÌŪ¤Ê¥¢¥¯¥·¥ç¥ó¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ + .PP +-ɸ½à°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java HotSpot²¾ÁÛ¥Þ¥·¥ó¤Ë¸ÇÍ­¤ÎÈÆÍÑ¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ë¤¿¤á¡¢¤¹¤Ù¤Æ¤ÎJVM¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ÏÊݾڤµ¤ì¤º¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-X\fR¤Ç³«»Ï¤·¤Þ¤¹¡£ ++ɸ½à°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java HotSpot²¾ÁÛ¥Þ¥·¥ó¤Ë¸ÇÍ­¤ÎÈÆÍÑ¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ë¤¿¤á¡¢¤¹¤Ù¤Æ¤ÎJVM¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ÏÊݾڤµ¤ì¤º¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-X\fR¤Ç³«»Ï¤·¤Þ¤¹¡£ + .PP +-³ÈÄ¥¥ª¥×¥·¥ç¥ó¤Ï¡¢ÉÔÍѰդ˻ÈÍѤ·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢ÆÃÄê¤Î¥·¥¹¥Æ¥àÍ×·ï¤ò»ý¤Ä¤³¤È¤¬Â¿¤¯¡¢¥·¥¹¥Æ¥à¹½À®¥Ñ¥é¥á¡¼¥¿¤Ø¤ÎÆø¢¥¢¥¯¥»¥¹¤¬É¬Íפʾì¹ç¤¬¤¢¤ëJava HotSpot²¾ÁÛ¥Þ¥·¥óÁàºî¤ÎÆÃÄê¤ÎÎΰè¤òÄ´À°¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë³«È¯¼Ô¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£¤³¤ì¤é¤Ï¡¢¤¹¤Ù¤Æ¤ÎJVM¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ÏÊݾڤµ¤ì¤º¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£³ÈÄ¥¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX\fR¤Ç»Ï¤Þ¤ê¤Þ¤¹¡£ ++³ÈÄ¥¥ª¥×¥·¥ç¥ó¤Ï¡¢ÉÔÍѰդ˻ÈÍѤ·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢ÆÃÄê¤Î¥·¥¹¥Æ¥àÍ×·ï¤ò»ý¤Ä¤³¤È¤¬Â¿¤¯¡¢¥·¥¹¥Æ¥à¹½À®¥Ñ¥é¥á¡¼¥¿¤Ø¤ÎÆø¢¥¢¥¯¥»¥¹¤¬É¬Íפʾì¹ç¤¬¤¢¤ëJava HotSpot²¾ÁÛ¥Þ¥·¥óÁàºî¤ÎÆÃÄê¤ÎÎΰè¤òÄ´À°¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë³«È¯¼Ô¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£¤³¤ì¤é¤Ï¡¢¤¹¤Ù¤Æ¤ÎJVM¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ÏÊݾڤµ¤ì¤º¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£³ÈÄ¥¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX\fR¤Ç»Ï¤Þ¤ê¤Þ¤¹¡£ + .PP + ºÇ¿·¥ê¥ê¡¼¥¹¤ÇÈó¿ä¾©¤Þ¤¿¤Ïºï½ü¤µ¤ì¤ë¥ª¥×¥·¥ç¥ó¤òÄÉÀפ¹¤ë¤¿¤á¤Ë¡¢¥É¥­¥å¥á¥ó¥È¤ÎºÇ¸å¤ËÈó¿ä¾©¤Çºï½ü¤µ¤ì¤¿¥ª¥×¥·¥ç¥ó¤È¤¤¤¦Ì¾Á°¤Î¥»¥¯¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¥Ö¡¼¥ë¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëµ¡Ç½¤òÍ­¸ú¤Ë¤·¤¿¤ê¡¢¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëµ¡Ç½¤ò̵¸ú¤Ë¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤òɬÍפȤ·¤Þ¤»¤ó¡£¥Ö¡¼¥ëÃÍ\fI\-XX\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥×¥é¥¹µ­¹æ(\fI\-XX:+\fR\fIOptionName\fR)¤ò»ÈÍѤ·¤ÆÍ­¸ú¤Ë¤·¡¢¥Þ¥¤¥Ê¥¹µ­¹æ(\fI\-XX:\-\fR\fIOptionName\fR)¤ò»ÈÍѤ·¤Æ̵¸ú¤Ë¤·¤Þ¤¹¡£ ++¥Ö¡¼¥ë¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëµ¡Ç½¤òÍ­¸ú¤Ë¤·¤¿¤ê¡¢¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëµ¡Ç½¤ò̵¸ú¤Ë¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤òɬÍפȤ·¤Þ¤»¤ó¡£¥Ö¡¼¥ëÃÍ\fB\-XX\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥×¥é¥¹µ­¹æ(\fB\-XX:+\fR\fIOptionName\fR)¤ò»ÈÍѤ·¤ÆÍ­¸ú¤Ë¤·¡¢¥Þ¥¤¥Ê¥¹µ­¹æ(\fB\-XX:\-\fR\fIOptionName\fR)¤ò»ÈÍѤ·¤Æ̵¸ú¤Ë¤·¤Þ¤¹¡£ + .PP +-°ú¿ô¤¬É¬Íפʥª¥×¥·¥ç¥ó¤Î¾ì¹ç¡¢°ú¿ô¤Ï¡¢¥ª¥×¥·¥ç¥ó̾¤ò¶õÇò¡¢¥³¥í¥ó(:)¤Þ¤¿¤ÏÅù¹æ(=)¤Ç¶èÀڤ俤â¤Î¤Ë¤Ê¤ë¤«¡¢¤¢¤ë¤¤¤Ï°ú¿ô¤¬¥ª¥×¥·¥ç¥ó¤Î¸å¤ËľÀܳ¤¯¾ì¹ç¤â¤¢¤ê¤Þ¤¹(Àµ³Î¤Ê¹½Ê¸¤Ï³Æ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹)¡£¥µ¥¤¥º¤ò¥Ð¥¤¥Èñ°Ì¤Ç»ØÄꤹ¤ë¤è¤¦µá¤á¤é¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ÀÜÈø¼­¤ò»ÈÍѤ·¤Ê¤¤¤«¡¢¤¢¤ë¤¤¤Ï¥­¥í¥Ð¥¤¥È(KB)¤Ë¤ÏÀÜÈø¼­\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È(MB)¤Ë¤ÏÀÜÈø¼­\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È(GB)¤Ë¤ÏÀÜÈø¼­\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥µ¥¤¥º¤ò8GB¤ËÀßÄꤹ¤ë¤Ë¤Ï¡¢\fI8g\fR¡¢\fI8192m\fR¡¢\fI8388608k\fR¤Þ¤¿¤Ï\fI8589934592\fR¤Î¤¤¤º¤ì¤«¤ò°ú¿ô¤È¤·¤Æ»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ñ¡¼¥»¥ó¥È¤Î»ØÄ꤬ɬÍפʾì¹ç¤Ï¡¢0¤«¤é1¤Î¿ôÃͤò»ÈÍѤ·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢25%¤Î¾ì¹ç¤Ï\fI0\&.25\fR¤ò»ØÄꤷ¤Þ¤¹)¡£ ++°ú¿ô¤¬É¬Íפʥª¥×¥·¥ç¥ó¤Î¾ì¹ç¡¢°ú¿ô¤Ï¡¢¥ª¥×¥·¥ç¥ó̾¤ò¶õÇò¡¢¥³¥í¥ó(:)¤Þ¤¿¤ÏÅù¹æ(=)¤Ç¶èÀڤ俤â¤Î¤Ë¤Ê¤ë¤«¡¢¤¢¤ë¤¤¤Ï°ú¿ô¤¬¥ª¥×¥·¥ç¥ó¤Î¸å¤ËľÀܳ¤¯¾ì¹ç¤â¤¢¤ê¤Þ¤¹(Àµ³Î¤Ê¹½Ê¸¤Ï³Æ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹)¡£¥µ¥¤¥º¤ò¥Ð¥¤¥Èñ°Ì¤Ç»ØÄꤹ¤ë¤è¤¦µá¤á¤é¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ÀÜÈø¼­¤ò»ÈÍѤ·¤Ê¤¤¤«¡¢¤¢¤ë¤¤¤Ï¥­¥í¥Ð¥¤¥È(KB)¤Ë¤ÏÀÜÈø¼­\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È(MB)¤Ë¤ÏÀÜÈø¼­\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È(GB)¤Ë¤ÏÀÜÈø¼­\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥µ¥¤¥º¤ò8GB¤ËÀßÄꤹ¤ë¤Ë¤Ï¡¢\fB8g\fR¡¢\fB8192m\fR¡¢\fB8388608k\fR¤Þ¤¿¤Ï\fB8589934592\fR¤Î¤¤¤º¤ì¤«¤ò°ú¿ô¤È¤·¤Æ»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ñ¡¼¥»¥ó¥È¤Î»ØÄ꤬ɬÍפʾì¹ç¤Ï¡¢0¤«¤é1¤Î¿ôÃͤò»ÈÍѤ·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢25%¤Î¾ì¹ç¤Ï\fB0\&.25\fR¤ò»ØÄꤷ¤Þ¤¹)¡£ + .SS "ɸ½à¥ª¥×¥·¥ç¥ó" + .PP + ¤³¤ì¤é¤Ï¡¢JVM¤Î¤¹¤Ù¤Æ¤Î¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëºÇ¤â°ìÈÌŪ¤Ë»ÈÍѤµ¤ì¤ë¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£ +@@ -201,7 +204,7 @@ + .RS 4 + »ØÄꤷ¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥¨¡¼¥¸¥§¥ó¥È¡¦¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¥é¥¤¥Ö¥é¥ê̾¤Î¸å¤Ë¡¢¥é¥¤¥Ö¥é¥ê¤Ë¸ÇÍ­¤Î¥ª¥×¥·¥ç¥ó¤Î¥«¥ó¥Þ¶èÀÚ¤ê¥ê¥¹¥È¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .sp +-¥ª¥×¥·¥ç¥ó\fI\-agentlib:foo\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢JVM¤Ï¡¢\fILD_LIBRARY_PATH\fR¥·¥¹¥Æ¥àÊÑ¿ô(OS X¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ï\fIDYLD_LIBRARY_PATH\fR¤Ë¤Ê¤ê¤Þ¤¹)¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Ë\fIlibfoo\&.so\fR¤È¤¤¤¦Ì¾Á°¤Î¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤è¤¦¤È¤·¤Þ¤¹¡£ ++¥ª¥×¥·¥ç¥ó\fB\-agentlib:foo\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢JVM¤Ï¡¢\fBLD_LIBRARY_PATH\fR¥·¥¹¥Æ¥àÊÑ¿ô(OS X¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ï\fBDYLD_LIBRARY_PATH\fR¤Ë¤Ê¤ê¤Þ¤¹)¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Ë\fBlibfoo\&.so\fR¤È¤¤¤¦Ì¾Á°¤Î¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤è¤¦¤È¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢¥¹¥¿¥Ã¥¯¤Î¿¼¤µ3¤Ç¡¢20¥ß¥êÉ䴤Ȥ˥ҡ¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥Ä¡¼¥ë(HPROF)¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Æ¡¢¥µ¥ó¥×¥ë¤ÎCPU¾ðÊó¤ò¼èÆÀ¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -209,7 +212,8 @@ + .RS 4 + .\} + .nf +-\-agentlib:hprof=cpu=samples,interval=20,depth=3 ++\fB\-agentlib:hprof=cpu=samples,interval=20,depth=3\fR ++ + .fi + .if n \{\ + .RE +@@ -220,7 +224,8 @@ + .RS 4 + .\} + .nf +-\-agentlib:jdwp=transport=dt_socket,server=y,address=8000 ++\fB\-agentlib:jdwp=transport=dt_socket,server=y,address=8000\fR ++ + .fi + .if n \{\ + .RE +@@ -235,7 +240,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html¤Ë¤¢¤ë\fIjava\&.lang\&.instrument\fR¥Ñ¥Ã¥±¡¼¥¸¤ÎÀâÌÀ ++http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html¤Ë¤¢¤ë\fBjava\&.lang\&.instrument\fR¥Ñ¥Ã¥±¡¼¥¸¤ÎÀâÌÀ + .RE + .sp + .RS 4 +@@ -246,13 +251,13 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting¤Ë¤¢¤ëJVM¥Ä¡¼¥ë¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥¬¥¤¥É¤Î¥¨¡¼¥¸¥§¥ó¥È¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Ë´Ø¤¹¤ë¹à ++http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting¤Ë¤¢¤ëJVM¥Ä¡¼¥ë¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥¬¥¤¥É¤Î¥¨¡¼¥¸¥§¥ó¥È¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Ë´Ø¤¹¤ë¹à + .RE + .RE + .PP + \-agentpath:\fIpathname\fR[=\fIoptions\fR] + .RS 4 +-ÀäÂХѥ¹Ì¾¤Ç»ØÄꤵ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥¨¡¼¥¸¥§¥ó¥È¡¦¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-agentlib\fR¤ÈƱÅù¤Ç¤¹¤¬¡¢¥é¥¤¥Ö¥é¥ê¤Î¥Õ¥ë¡¦¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤ò»ÈÍѤ·¤Þ¤¹¡£ ++ÀäÂХѥ¹Ì¾¤Ç»ØÄꤵ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥¨¡¼¥¸¥§¥ó¥È¡¦¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-agentlib\fR¤ÈƱÅù¤Ç¤¹¤¬¡¢¥é¥¤¥Ö¥é¥ê¤Î¥Õ¥ë¡¦¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-client +@@ -266,7 +271,7 @@ + \-D\fIproperty\fR=\fIvalue\fR + .RS 4 + ¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÀßÄꤷ¤Þ¤¹¡£\fIproperty\fRÊÑ¿ô¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¤Î̾Á°¤òɽ¤¹¡¢¶õÇò¤Î¤Ê¤¤Ê¸»úÎó¤Ç¤¹¡£\fIvalue\fRÊÑ¿ô¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòɽ¤¹Ê¸»úÎó¤Ç¤¹¡£\fIvalue\fR¤¬¶õÇò¤ò´Þ¤àʸ»úÎó¤Î¾ì¹ç¡¢¤½¤ì¤ò°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹(Îã: +-\fI\-Dfoo="foo bar"\fR)¡£ ++\fB\-Dfoo="foo bar"\fR)¡£ + .RE + .PP + \-d32 +@@ -278,79 +283,91 @@ + .RS 4 + ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò64¥Ó¥Ã¥È´Ä¶­¤Ç¼Â¹Ô¤·¤Þ¤¹¡£64¥Ó¥Ã¥È´Ä¶­¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥¨¥é¡¼¤¬Êó¹ð¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢64¥Ó¥Ã¥È¡¦¥·¥¹¥Æ¥à¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¤ò½ü¤­¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï32¥Ó¥Ã¥È´Ä¶­¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ + .sp +-¸½ºß¤Î¤È¤³¤í¡¢Java HotSpot Server VM¤Î¤ß¤¬64¥Ó¥Ã¥È¤ÎÁàºî¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤¿¤á¡¢\fI\-d64\fR»ÈÍÑ»þ¤Ë¤Ï\fI\-server\fR¥ª¥×¥·¥ç¥ó¤¬°ÅÌÛŪ¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£\fI\-d64\fR»ÈÍÑ»þ¤Ë¤Ï¡¢\fI\-client\fR¥ª¥×¥·¥ç¥ó¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤³¤Î»ÅÍͤϡ¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÊѹ¹¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++¸½ºß¤Î¤È¤³¤í¡¢Java HotSpot Server VM¤Î¤ß¤¬64¥Ó¥Ã¥È¤ÎÁàºî¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤¿¤á¡¢\fB\-d64\fR»ÈÍÑ»þ¤Ë¤Ï\fB\-server\fR¥ª¥×¥·¥ç¥ó¤¬°ÅÌÛŪ¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£\fB\-d64\fR»ÈÍÑ»þ¤Ë¤Ï¡¢\fB\-client\fR¥ª¥×¥·¥ç¥ó¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤³¤Î»ÅÍͤϡ¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÊѹ¹¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\-disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], \-da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++\-disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.br ++\-da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] + .RS 4 + ¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¢¥µ¡¼¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ + .sp +-°ú¿ô¤Ê¤·¤Î\fI\-disableassertions\fR +-(\fI\-da\fR)¤ò»ØÄꤹ¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\&.\&.\&.\fR¤Ç½ª¤ï¤ë\fIpackagename\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£°ú¿ô¤È¤·¤Æ\fI\&.\&.\&.\fR¤Î¤ß¤ò»ØÄꤹ¤ë¤È¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë̾Á°¤Î¤Ê¤¤¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIclassname\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢ÀÚÂؤ¨¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++°ú¿ô¤Ê¤·¤Î\fB\-disableassertions\fR ++(\fB\-da\fR)¤ò»ØÄꤹ¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\&.\&.\&.\fR¤Ç½ª¤ï¤ë\fIpackagename\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£°ú¿ô¤È¤·¤Æ\fB\&.\&.\&.\fR¤Î¤ß¤ò»ØÄꤹ¤ë¤È¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë̾Á°¤Î¤Ê¤¤¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIclassname\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢ÀÚÂؤ¨¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-\fI\-disableassertions\fR +-(\fI\-da\fR)¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤¹(¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ë¤Ï¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î¥ë¡¼¥ë¤Ë¤Ï1¤ÄÎã³°¤¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò´Êñ¤Ë̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fI\-disablesystemassertions\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fB\-disableassertions\fR ++(\fB\-da\fR)¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤¹(¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ë¤Ï¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î¥ë¡¼¥ë¤Ë¤Ï1¤ÄÎã³°¤¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò´Êñ¤Ë̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fB\-disablesystemassertions\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-ÆÃÄê¤Î¥Ñ¥Ã¥±¡¼¥¸¤ä¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÌÀ¼¨Åª¤ËÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-enableassertions\fR +-(\fI\-ea\fR)¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Î¾Êý¤Î¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ñ¥Ã¥±¡¼¥¸\fIcom\&.wombat\&.fruitbat\fR +-(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥¯¥é¥¹\fIcom\&.wombat\&.fruitbat\&.Brickbat\fR¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Æ¡¢\fIMyClass\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++ÆÃÄê¤Î¥Ñ¥Ã¥±¡¼¥¸¤ä¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÌÀ¼¨Åª¤ËÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-enableassertions\fR ++(\fB\-ea\fR)¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Î¾Êý¤Î¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ñ¥Ã¥±¡¼¥¸\fBcom\&.wombat\&.fruitbat\fR ++(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥¯¥é¥¹\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Æ¡¢\fBMyClass\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-disablesystemassertions, \-dsa ++\-disablesystemassertions ++.br ++\-dsa + .RS 4 + ¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .PP +-\-enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], \-ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++\-enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.br ++\-ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] + .RS 4 + ¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¢¥µ¡¼¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ + .sp +-°ú¿ô¤Ê¤·¤Î\fI\-enableassertions\fR +-(\fI\-ea\fR)¤ò»ØÄꤹ¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\&.\&.\&.\fR¤Ç½ª¤ï¤ë\fIpackagename\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£°ú¿ô¤È¤·¤Æ\fI\&.\&.\&.\fR¤Î¤ß¤ò»ØÄꤹ¤ë¤È¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë̾Á°¤Î¤Ê¤¤¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIclassname\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢ÀÚÂؤ¨¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++°ú¿ô¤Ê¤·¤Î\fB\-enableassertions\fR ++(\fB\-ea\fR)¤ò»ØÄꤹ¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\&.\&.\&.\fR¤Ç½ª¤ï¤ë\fIpackagename\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£°ú¿ô¤È¤·¤Æ\fB\&.\&.\&.\fR¤Î¤ß¤ò»ØÄꤹ¤ë¤È¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë̾Á°¤Î¤Ê¤¤¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIclassname\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢ÀÚÂؤ¨¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-\fI\-enableassertions\fR +-(\fI\-ea\fR)¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤¹(¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ë¤Ï¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î¥ë¡¼¥ë¤Ë¤Ï1¤ÄÎã³°¤¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò´Êñ¤ËÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fI\-enablesystemassertions\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ëÊ̤Υ¹¥¤¥Ã¥Á¤òÄ󶡤·¤Þ¤¹¡£ ++\fB\-enableassertions\fR ++(\fB\-ea\fR)¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤¹(¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ë¤Ï¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î¥ë¡¼¥ë¤Ë¤Ï1¤ÄÎã³°¤¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò´Êñ¤ËÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fB\-enablesystemassertions\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ëÊ̤Υ¹¥¤¥Ã¥Á¤òÄ󶡤·¤Þ¤¹¡£ + .sp +-ÆÃÄê¤Î¥Ñ¥Ã¥±¡¼¥¸¤ä¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÌÀ¼¨Åª¤Ë̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-disableassertions\fR +-(\fI\-da\fR)¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Ã±°ì¥³¥Þ¥ó¥É¤Ë¤³¤ì¤é¤Î¥¹¥¤¥Ã¥Á¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÊ£¿ô»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢»ØÄꤷ¤¿¥¹¥¤¥Ã¥Á¤¬½çÈ֤˽èÍý¤µ¤ì¤Æ¤«¤é¥¯¥é¥¹¤¬¥í¡¼¥É¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ñ¥Ã¥±¡¼¥¸\fIcom\&.wombat\&.fruitbat\fR +-(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¤Î¤ß¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥¯¥é¥¹\fIcom\&.wombat\&.fruitbat\&.Brickbat\fR¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Æ¡¢\fIMyClass\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++ÆÃÄê¤Î¥Ñ¥Ã¥±¡¼¥¸¤ä¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÌÀ¼¨Åª¤Ë̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-disableassertions\fR ++(\fB\-da\fR)¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Ã±°ì¥³¥Þ¥ó¥É¤Ë¤³¤ì¤é¤Î¥¹¥¤¥Ã¥Á¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÊ£¿ô»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢»ØÄꤷ¤¿¥¹¥¤¥Ã¥Á¤¬½çÈ֤˽èÍý¤µ¤ì¤Æ¤«¤é¥¯¥é¥¹¤¬¥í¡¼¥É¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ñ¥Ã¥±¡¼¥¸\fBcom\&.wombat\&.fruitbat\fR ++(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¤Î¤ß¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥¯¥é¥¹\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Æ¡¢\fBMyClass\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-enablesystemassertions, \-esa ++\-enablesystemassertions ++.br ++\-esa + .RS 4 + ¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .PP +-\-help, \-? ++\-help ++.br ++\-? + .RS 4 +-¼ÂºÝ¤ËJVM¤ò¼Â¹Ô¤»¤º¤Ë¡¢\fIjava\fR¥³¥Þ¥ó¥É¤Î»ÈÍѾõ¶·¾ðÊó¤òɽ¼¨¤·¤Þ¤¹¡£ ++¼ÂºÝ¤ËJVM¤ò¼Â¹Ô¤»¤º¤Ë¡¢\fBjava\fR¥³¥Þ¥ó¥É¤Î»ÈÍѾõ¶·¾ðÊó¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-jar \fIfilename\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤Ë¥«¥×¥»¥ë²½¤µ¤ì¤¿¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fIfilename\fR°ú¿ô¤Ï¡¢»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î³«»ÏÅÀ¤È¤·¤Æµ¡Ç½¤¹¤ë\fIpublic static void main(String[] args)\fR¥á¥½¥Ã¥É¤òÄêµÁ¤¹¤ë¡¢\fIMain\-Class:\fR\fIclassname\fR¤È¤¤¤¦·Á¼°¤Î1¹Ô¤ò´Þ¤à¥Þ¥Ë¥Õ¥§¥¹¥È¤ò»ý¤ÄJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ç¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤Ë¥«¥×¥»¥ë²½¤µ¤ì¤¿¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fIfilename\fR°ú¿ô¤Ï¡¢»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î³«»ÏÅÀ¤È¤·¤Æµ¡Ç½¤¹¤ë\fBpublic static void main(String[] args)\fR¥á¥½¥Ã¥É¤òÄêµÁ¤¹¤ë¡¢\fBMain\-Class:\fR\fIclassname\fR¤È¤¤¤¦·Á¼°¤Î1¹Ô¤ò´Þ¤à¥Þ¥Ë¥Õ¥§¥¹¥È¤ò»ý¤ÄJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ç¤¹¡£ + .sp +-\fI\-jar\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢»ØÄꤷ¤¿JAR¥Õ¥¡¥¤¥ë¤¬¤¹¤Ù¤Æ¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤Î¥½¡¼¥¹¤Ë¤Ê¤ê¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¾¤ÎÀßÄê¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£ ++\fB\-jar\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢»ØÄꤷ¤¿JAR¥Õ¥¡¥¤¥ë¤¬¤¹¤Ù¤Æ¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤Î¥½¡¼¥¹¤Ë¤Ê¤ê¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¾¤ÎÀßÄê¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£ + .sp + JAR¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢¼¡¤Î¥ê¥½¡¼¥¹¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +@@ -391,7 +408,7 @@ + .PP + \-javaagent:\fIjarpath\fR[=\fIoptions\fR] + .RS 4 +-»ØÄꤷ¤¿Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¥¨¡¼¥¸¥§¥ó¥È¤ò¥í¡¼¥É¤·¤Þ¤¹¡£Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥È¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html¤Ë¤¢¤ëJava API¥É¥­¥å¥á¥ó¥È¤Î\fIjava\&.lang\&.instrument\fR¥Ñ¥Ã¥±¡¼¥¸¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++»ØÄꤷ¤¿Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¥¨¡¼¥¸¥§¥ó¥È¤ò¥í¡¼¥É¤·¤Þ¤¹¡£Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥È¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html¤Ë¤¢¤ëJava API¥É¥­¥å¥á¥ó¥È¤Î\fBjava\&.lang\&.instrument\fR¥Ñ¥Ã¥±¡¼¥¸¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-jre\-restrict\-search +@@ -414,18 +431,19 @@ + .PP + \-showversion + .RS 4 +-¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤ò³¹Ô¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-version\fR¥ª¥×¥·¥ç¥ó¤ÈƱÅù¤Ç¤¹¤¬¡¢\-version¤Ï¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨¸å¤ËJVM¤Ë½ªÎ»¤ò»Ø¼¨¤¹¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ ++¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤ò³¹Ô¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-version\fR¥ª¥×¥·¥ç¥ó¤ÈƱÅù¤Ç¤¹¤¬¡¢\-version¤Ï¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨¸å¤ËJVM¤Ë½ªÎ»¤ò»Ø¼¨¤¹¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-splash:\fIimgname\fR + .RS 4 +-\fIimgname\fR¤Ç»ØÄꤵ¤ì¤¿¥¤¥á¡¼¥¸¤ò´Þ¤à¥¹¥×¥é¥Ã¥·¥å²èÌ̤òɽ¼¨¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Îµ¯Æ°»þ¤Ë\fIimages\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fIsplash\&.gif\fR¥Õ¥¡¥¤¥ë¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fIimgname\fR¤Ç»ØÄꤵ¤ì¤¿¥¤¥á¡¼¥¸¤ò´Þ¤à¥¹¥×¥é¥Ã¥·¥å²èÌ̤òɽ¼¨¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Îµ¯Æ°»þ¤Ë\fBimages\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fBsplash\&.gif\fR¥Õ¥¡¥¤¥ë¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-splash:images/splash\&.gif ++\fB\-splash:images/splash\&.gif\fR ++ + .fi + .if n \{\ + .RE +@@ -449,29 +467,30 @@ + .PP + \-version + .RS 4 +-¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ¤«¤é½ªÎ»¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-showversion\fR¥ª¥×¥·¥ç¥ó¤ÈƱÅù¤Ç¤¹¤¬¡¢\-showversion¤Ï¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨¸å¤ËJVM¤Ë½ªÎ»¤ò»Ø¼¨¤·¤Ê¤¤ÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ ++¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ¤«¤é½ªÎ»¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-showversion\fR¥ª¥×¥·¥ç¥ó¤ÈƱÅù¤Ç¤¹¤¬¡¢\-showversion¤Ï¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨¸å¤ËJVM¤Ë½ªÎ»¤ò»Ø¼¨¤·¤Ê¤¤ÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-version:\fIrelease\fR + .RS 4 +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤Ë»ÈÍѤ¹¤ë¥ê¥ê¡¼¥¹¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¥³¡¼¥ë¤µ¤ì¤¿\fIjava\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤¬¤³¤Î»ØÄêÆâÍƤòËþ¤¿¤µ¤º¡¢¤«¤ÄŬÀڤʼÂÁõ¤¬¥·¥¹¥Æ¥à¾å¤Ç¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎŬÀڤʼÂÁõ¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤Ë»ÈÍѤ¹¤ë¥ê¥ê¡¼¥¹¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¥³¡¼¥ë¤µ¤ì¤¿\fBjava\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤¬¤³¤Î»ØÄêÆâÍƤòËþ¤¿¤µ¤º¡¢¤«¤ÄŬÀڤʼÂÁõ¤¬¥·¥¹¥Æ¥à¾å¤Ç¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎŬÀڤʼÂÁõ¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp + \fIrelease\fR°ú¿ô¤Ï¡¢Àµ³Î¤Ê¥Ð¡¼¥¸¥ç¥óʸ»úÎ󡢤ޤ¿¤Ï¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤È¥Ð¡¼¥¸¥ç¥óÈϰϤΥꥹ¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fI¥Ð¡¼¥¸¥ç¥óʸ»úÎó\fR¤Ï¡¢¼¡¤Î·Á¼°¤Ç¡¢³«È¯¼Ô¤Î¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤ò»ØÄꤷ¤Þ¤¹: +-\fI1\&.\fR\fIx\fR\fI\&.0_\fR\fIu\fR +-(\fIx\fR¤Ï¥á¥¸¥ã¡¼¡¦¥Ð¡¼¥¸¥ç¥óÈֹ桢\fIu\fR¤Ï¹¹¿·¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤Ç¤¹)¡£\fI¥Ð¡¼¥¸¥ç¥óÈÏ°Ï\fR¤Ï¡¢¤³¤Î¥Ð¡¼¥¸¥ç¥ó°Ê¹ß¤ò»ØÄꤹ¤ë¤Ë¤Ï¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤Î¸å¤Ë¥×¥é¥¹µ­¹æ(\fI+\fR)¤ò³¤±¤¿¤â¤Î¡¢¤Þ¤¿¤Ï°ìÃפ¹¤ëÀÜƬ¼­¤ò´Þ¤àǤ°Õ¤Î¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤ò»ØÄꤹ¤ë¤Ë¤Ï°ìÉô¤Î¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤Î¸å¤Ë¥¢¥¹¥¿¥ê¥¹¥¯(\fI*\fR)¤ò³¤±¤¿¤â¤Î¤Ç¹½À®¤µ¤ì¤Þ¤¹¡£ÏÀÍý\fIOR\fR¤ÎÁȹ礻¤Ë¤Ï¶õÇò¡¢2¤Ä¤Î¥Ð¡¼¥¸¥ç¥ó¤Îʸ»úÎó/ÈϰϤÎÏÀÍý\fIAND\fR¤ÎÁȹ礻¤Ë¤Ï¥¢¥ó¥Ñ¥µ¥ó¥É(\fI&\fR)¤ò»ÈÍѤ·¤Æ¡¢¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤È¥Ð¡¼¥¸¥ç¥óÈϰϤòÁȤ߹礻¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô¤ËJRE 6u13 (1\&.6\&.0_13)¤Þ¤¿¤Ï6u10 (1\&.6\&.0_10)°Ê¹ß¤ÎǤ°Õ¤ÎJRE 6¤Î¤¤¤º¤ì¤«¤òɬÍפȤ¹¤ë¾ì¹ç¡¢¼¡¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fB1\&.\fR\fIx\fR\fB\&.0_\fR\fIu\fR ++(\fIx\fR¤Ï¥á¥¸¥ã¡¼¡¦¥Ð¡¼¥¸¥ç¥óÈֹ桢\fIu\fR¤Ï¹¹¿·¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤Ç¤¹)¡£\fI¥Ð¡¼¥¸¥ç¥óÈÏ°Ï\fR¤Ï¡¢¤³¤Î¥Ð¡¼¥¸¥ç¥ó°Ê¹ß¤ò»ØÄꤹ¤ë¤Ë¤Ï¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤Î¸å¤Ë¥×¥é¥¹µ­¹æ(\fB+\fR)¤ò³¤±¤¿¤â¤Î¡¢¤Þ¤¿¤Ï°ìÃפ¹¤ëÀÜƬ¼­¤ò´Þ¤àǤ°Õ¤Î¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤ò»ØÄꤹ¤ë¤Ë¤Ï°ìÉô¤Î¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤Î¸å¤Ë¥¢¥¹¥¿¥ê¥¹¥¯(\fB*\fR)¤ò³¤±¤¿¤â¤Î¤Ç¹½À®¤µ¤ì¤Þ¤¹¡£ÏÀÍý\fIOR\fR¤ÎÁȹ礻¤Ë¤Ï¶õÇò¡¢2¤Ä¤Î¥Ð¡¼¥¸¥ç¥ó¤Îʸ»úÎó/ÈϰϤÎÏÀÍý\fIAND\fR¤ÎÁȹ礻¤Ë¤Ï¥¢¥ó¥Ñ¥µ¥ó¥É(\fB&\fR)¤ò»ÈÍѤ·¤Æ¡¢¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤È¥Ð¡¼¥¸¥ç¥óÈϰϤòÁȤ߹礻¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô¤ËJRE 6u13 (1\&.6\&.0_13)¤Þ¤¿¤Ï6u10 (1\&.6\&.0_10)°Ê¹ß¤ÎǤ°Õ¤ÎJRE 6¤Î¤¤¤º¤ì¤«¤òɬÍפȤ¹¤ë¾ì¹ç¡¢¼¡¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+" ++\fB\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+"\fR ++ + .fi + .if n \{\ + .RE + .\} + °úÍÑÉ䤬ɬÍפʤΤϡ¢\fIrelease\fR¥Ñ¥é¥á¡¼¥¿¤Ë¶õÇò¤¬¤¢¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£ + .sp +-JAR¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¤Ï¡¢¥Ð¡¼¥¸¥ç¥óÍ×·ï¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤹ¤ë¤è¤ê¤â¡¢JAR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Ë»ØÄꤹ¤ë¤³¤È¤¬¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¤Ï¡¢¥Ð¡¼¥¸¥ç¥óÍ×·ï¤ò¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤹ¤ë¤è¤ê¤â¡¢JAR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Ë»ØÄꤹ¤ë¤³¤È¤¬¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .RE + .SS "Èóɸ½à¥ª¥×¥·¥ç¥ó" + .PP +@@ -479,40 +498,35 @@ + .PP + \-X + .RS 4 +-»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤Î\fI\-X\fR¥ª¥×¥·¥ç¥ó¤Î¥Ø¥ë¥×¤òɽ¼¨¤·¤Þ¤¹¡£ ++»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤Î\fB\-X\fR¥ª¥×¥·¥ç¥ó¤Î¥Ø¥ë¥×¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-Xbatch + .RS 4 +-¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JVM¤Ç¤Ï¡¢¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢¥á¥½¥Ã¥É¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥¿¥¹¥¯¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤·¡¢¥¤¥ó¥¿¥×¥ê¥¿¡¦¥â¡¼¥É¤Ç¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fI\-Xbatch\fR¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤¬´°Î»¤¹¤ë¤Þ¤Ç¥Õ¥©¥¢¥°¥é¥¦¥ó¥É¡¦¥¿¥¹¥¯¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£ ++¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JVM¤Ç¤Ï¡¢¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢¥á¥½¥Ã¥É¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥¿¥¹¥¯¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤·¡¢¥¤¥ó¥¿¥×¥ê¥¿¡¦¥â¡¼¥É¤Ç¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fB\-Xbatch\fR¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤¬´°Î»¤¹¤ë¤Þ¤Ç¥Õ¥©¥¢¥°¥é¥¦¥ó¥É¡¦¥¿¥¹¥¯¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£ + .sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:\-BackgroundCompilation\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:\-BackgroundCompilation\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xbootclasspath:\fIpath\fR + .RS 4 + ¥Ö¡¼¥È¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¤ª¤è¤ÓZIP¥¢¡¼¥«¥¤¥Ö¤Î¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤é¤ì¤¿¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢JDK¤Ë´Þ¤Þ¤ì¤ë¥Ö¡¼¥È¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤«¤ï¤ê¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp +-JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fIrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fBrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xbootclasspath/a:\fIpath\fR + .RS 4 + ¥Ç¥Õ¥©¥ë¥È¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎºÇ¸å¤ËÄɲ乤ë¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¤ª¤è¤ÓZIP¥¢¡¼¥«¥¤¥Ö¤Î¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤é¤ì¤¿¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fIrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fBrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xbootclasspath/p:\fIpath\fR + .RS 4 + ¥Ç¥Õ¥©¥ë¥È¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎÀèƬ¤ËÄɲ乤ë¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¤ª¤è¤ÓZIP¥¢¡¼¥«¥¤¥Ö¤Î¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤é¤ì¤¿¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fIrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ +-.RE +-.PP +-\-Xboundthreads +-.RS 4 +-¥æ¡¼¥¶¡¼¡¦¥ì¥Ù¥ë¤Î¥¹¥ì¥Ã¥É¤ò¥«¡¼¥Í¥ë¡¦¥¹¥ì¥Ã¥É¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£ ++JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fBrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xcheck:jni +@@ -522,14 +536,14 @@ + .PP + \-Xcomp + .RS 4 +-ºÇ½é¤Î¸Æ½Ð¤·¤ÇJava¥³¡¼¥É¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥ë¡¦¥á¥½¥Ã¥É¤Î²ò¼á¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï¡¢10,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¤Æ¡¢¸úΨŪ¤Ê¥³¥ó¥Ñ¥¤¥ë¤Î¤¿¤á¤Î¾ðÊó¤ò¼ý½¸¤·¤Þ¤¹¡£¸úΨ¤òµ¾À·¤Ë¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¤Ë¤Ï¡¢\fI\-Xcomp\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤Æ¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£ ++ºÇ½é¤Î¸Æ½Ð¤·¤Ç¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤ò¶¯À©Åª¤Ë¼Â¹Ô¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥ÈVM(\fB\-client\fR)¤Ï1,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¡¢¥µ¡¼¥Ð¡¼VM(\fB\-server\fR)¤Ï10,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¤Æ¡¢¸úΨŪ¤Ê¥³¥ó¥Ñ¥¤¥ë¤Î¤¿¤á¤Î¾ðÊó¤ò¼ý½¸¤·¤Þ¤¹¡£\fB\-Xcomp\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¸úΨ¤òµ¾À·¤Ë¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤·¤Þ¤¹¡£ + .sp +-\fI\-XX:CompileThreshold\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¤ÎÁ°¤Ë¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤òÊѹ¹¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++\fB\-XX:CompileThreshold\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¤ÎÁ°¤Ë¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤òÊѹ¹¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-Xdebug + .RS 4 +-²¿¤â¹Ô¤¤¤Þ¤»¤ó¡£²¼°Ì¸ß´¹À­¤Î¤¿¤á¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++²¿¤â¹Ô¤¤¤Þ¤»¤ó¡£¸åÊý¸ß´¹À­¤Î¤¿¤á¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-Xdiag +@@ -542,11 +556,6 @@ + ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë·Á¼°¤Î»ÅÍͤؤνàµò¤ò¶¯²½¤¹¤ë¡¢¸·Ì©¤Ê¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë·Á¼°¤Î¥Á¥§¥Ã¥¯¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢¤è¤ê¸·Ì©¤Ê¥Á¥§¥Ã¥¯¤¬¥Ç¥Õ¥©¥ë¥È¤Ë¤Ê¤ë¤¿¤á¡¢¿·¤·¤¤¥³¡¼¥É¤ò³«È¯¤¹¤ë¤È¤­¤Ë¤Ï¡¢³«È¯¼Ô¤Ï¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .RE + .PP +-\-Xincgc +-.RS 4 +-ÁýʬGC¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ +-.RE +-.PP + \-Xint + .RS 4 + ¥¤¥ó¥¿¥×¥ê¥¿ÀìÍѥ⡼¥É¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£¥Í¥¤¥Æ¥£¥Ö¡¦¥³¡¼¥É¤Ø¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï̵¸ú¤Ë¤Ê¤ê¡¢¤¹¤Ù¤Æ¤Î¥Ð¥¤¥È¥³¡¼¥É¤¬¥¤¥ó¥¿¥×¥ê¥¿¤Ë¤è¤Ã¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥¸¥ã¥¹¥È¡¦¥¤¥ó¡¦¥¿¥¤¥à(JIT)¥³¥ó¥Ñ¥¤¥é¤¬Ä󶡤¹¤ë¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¾å¤ÎÍøÅÀ¤Ï¡¢¤³¤Î¥â¡¼¥É¤Ç¤Ï¼Â¸½¤µ¤ì¤Þ¤»¤ó¡£ +@@ -554,12 +563,12 @@ + .PP + \-Xinternalversion + .RS 4 +-\fI\-version\fR¥ª¥×¥·¥ç¥ó¤è¤ê¾ÜºÙ¤ÊJVM¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ¤«¤é½ªÎ»¤·¤Þ¤¹¡£ ++\fB\-version\fR¥ª¥×¥·¥ç¥ó¤è¤ê¾ÜºÙ¤ÊJVM¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ¤«¤é½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP + \-Xloggc:\fIfilename\fR + .RS 4 +-¾ÜºÙ¤ÊGC¥¤¥Ù¥ó¥È¾ðÊó¤ò¥í¥®¥ó¥°ÍѤ˥ê¥À¥¤¥ì¥¯¥È¤¹¤ë¥Õ¥¡¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤Þ¤ì¤ë¾ðÊó¤Ï¡¢µ­Ï¿¤µ¤ì¤¿³Æ¥¤¥Ù¥ó¥È¤ÎÁ°¤Ë¹Ô¤ï¤ì¤ëºÇ½é¤ÎGC¥¤¥Ù¥ó¥È°Ê¹ß¤Ë·Ð²á¤·¤¿»þ´Ö¤ò»ØÄꤷ¤¿\fI\-verbose:gc\fR¤Î½ÐÎϤÈÎà»÷¤·¤Æ¤¤¤Þ¤¹¡£\fI\-Xloggc\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-verbose:gc\fR¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹(¤³¤ì¤é¤ÎξÊý¤¬Æ±¤¸\fIjava\fR¥³¥Þ¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¾ì¹ç)¡£ ++¾ÜºÙ¤ÊGC¥¤¥Ù¥ó¥È¾ðÊó¤ò¥í¥®¥ó¥°ÍѤ˥ê¥À¥¤¥ì¥¯¥È¤¹¤ë¥Õ¥¡¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤Þ¤ì¤ë¾ðÊó¤Ï¡¢µ­Ï¿¤µ¤ì¤¿³Æ¥¤¥Ù¥ó¥È¤ÎÁ°¤Ë¹Ô¤ï¤ì¤ëºÇ½é¤ÎGC¥¤¥Ù¥ó¥È°Ê¹ß¤Ë·Ð²á¤·¤¿»þ´Ö¤ò»ØÄꤷ¤¿\fB\-verbose:gc\fR¤Î½ÐÎϤÈÎà»÷¤·¤Æ¤¤¤Þ¤¹¡£\fB\-Xloggc\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-verbose:gc\fR¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹(¤³¤ì¤é¤ÎξÊý¤¬Æ±¤¸\fBjava\fR¥³¥Þ¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¾ì¹ç)¡£ + .sp + Îã: + .sp +@@ -567,7 +576,8 @@ + .RS 4 + .\} + .nf +-\-Xloggc:garbage\-collection\&.log ++\fB\-Xloggc:garbage\-collection\&.log\fR ++ + .fi + .if n \{\ + .RE +@@ -576,18 +586,19 @@ + .PP + \-Xmaxjitcodesize=\fIsize\fR + .RS 4 +-JIT¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤ÎºÇÂ祳¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤ò»ØÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤ÎÃͤÏ48MB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++JIT¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤ÎºÇÂ祳¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤ò»ØÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤ÎÃͤÏ48MB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-Xmaxjitcodesize=48m ++\fB\-Xmaxjitcodesize=48m\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:ReservedCodeCacheSize\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:ReservedCodeCacheSize\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xmixed +@@ -597,7 +608,7 @@ + .PP + \-Xmn\fIsize\fR + .RS 4 +-¼ã¤¤À¤Âå(¥Ê¡¼¥µ¥ê)¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤ª¤è¤ÓºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£ ++¼ã¤¤À¤Âå(¥Ê¡¼¥µ¥ê)¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤ª¤è¤ÓºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£ + .sp + ¥Ò¡¼¥×¤Î¼ã¤¤À¤Âå¥ê¡¼¥¸¥ç¥ó¤Ï¿·¤·¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£GC¤Ï¡¢Â¾¤Î¥ê¡¼¥¸¥ç¥ó¤è¤ê¤³¤Î¥ê¡¼¥¸¥ç¥ó¤Ç¡¢¤è¤êÉÑÈˤ˼¹Ԥµ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥µ¥¤¥º¤¬¾®¤µ¤¹¤®¤ë¾ì¹ç¡¢Â¿¿ô¤Î¥Þ¥¤¥Ê¡¼¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥µ¥¤¥º¤¬Â礭¤¹¤®¤ë¾ì¹ç¡¢¥Õ¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¤ß¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¤¬¡¢´°Î»¤Þ¤Ç¤Ë»þ´Ö¤¬¤«¤«¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥µ¥¤¥º¤Ï¡¢Á´ÂΤΥҡ¼¥×¡¦¥µ¥¤¥º¤ÎȾʬ¤«¤é4ʬ¤Î1¤Î´Ö¤Ë¤·¤Æ¤ª¤¯¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .sp +@@ -607,19 +618,20 @@ + .RS 4 + .\} + .nf +-\-Xmn256m +-\-Xmn262144k +-\-Xmn268435456 ++\fB\-Xmn256m\fR ++\fB\-Xmn262144k\fR ++\fB\-Xmn268435456\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤ÈºÇÂ祵¥¤¥º¤ÎξÊý¤òÀßÄꤹ¤ë\fI\-Xmn\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë¡¢½é´ü¥µ¥¤¥º¤ÎÀßÄê¤Ë¤Ï\fI\-XX:NewSize\fR¤ò¡¢ºÇÂ祵¥¤¥º¤ÎÀßÄê¤Ë¤Ï\fI\-XX:MaxNewSize\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤ÈºÇÂ祵¥¤¥º¤ÎξÊý¤òÀßÄꤹ¤ë\fB\-Xmn\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë¡¢½é´ü¥µ¥¤¥º¤ÎÀßÄê¤Ë¤Ï\fB\-XX:NewSize\fR¤ò¡¢ºÇÂ祵¥¤¥º¤ÎÀßÄê¤Ë¤Ï\fB\-XX:MaxNewSize\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-Xms\fIsize\fR + .RS 4 +-¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢1MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£ ++¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢1MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢³ä¤êÅö¤Æ¤é¤ì¤¿¥á¥â¥ê¡¼¤Î¥µ¥¤¥º¤òÍÍ¡¹¤Êñ°Ì¤ò»ÈÍѤ·¤Æ6MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -627,19 +639,20 @@ + .RS 4 + .\} + .nf +-\-Xms6291456 +-\-Xms6144k +-\-Xms6m ++\fB\-Xms6291456\fR ++\fB\-Xms6144k\fR ++\fB\-Xms6m\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤷ¤Ê¤¤¾ì¹ç¡¢½é´ü¥µ¥¤¥º¤Ï¡¢¸Å¤¤À¤Âå¤È¼ã¤¤À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥µ¥¤¥º¤Î¹ç·×¤È¤·¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤Ï¡¢\fI\-Xmn\fR¥ª¥×¥·¥ç¥ó¤Þ¤¿¤Ï\fI\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÀßÄê¤Ç¤­¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤷ¤Ê¤¤¾ì¹ç¡¢½é´ü¥µ¥¤¥º¤Ï¡¢¸Å¤¤À¤Âå¤È¼ã¤¤À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥µ¥¤¥º¤Î¹ç·×¤È¤·¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤Ï¡¢\fB\-Xmn\fR¥ª¥×¥·¥ç¥ó¤Þ¤¿¤Ï\fB\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÀßÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-Xmx\fIsize\fR + .RS 4 +-¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢2MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Ç¥×¥í¥¤¥á¥ó¥È¤Ç¤Ï¡¢\fI\-Xms\fR¤ª¤è¤Ó\fI\-Xmx\fR¤ÏÄ̾ïƱ¤¸ÃͤËÀßÄꤵ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢2MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Ç¥×¥í¥¤¥á¥ó¥È¤Ç¤Ï¡¢\fB\-Xms\fR¤ª¤è¤Ó\fB\-Xmx\fR¤ÏÄ̾ïƱ¤¸ÃͤËÀßÄꤵ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢³ä¤êÅö¤Æ¤é¤ì¤¿¥á¥â¥ê¡¼¤Îµö²Ä¤µ¤ì¤ëºÇÂ祵¥¤¥º¤òÍÍ¡¹¤Êñ°Ì¤ò»ÈÍѤ·¤Æ80MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -647,26 +660,27 @@ + .RS 4 + .\} + .nf +-\-Xmx83886080 +-\-Xmx81920k +-\-Xmx80m ++\fB\-Xmx83886080\fR ++\fB\-Xmx81920k\fR ++\fB\-Xmx80m\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fI\-Xmx\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:MaxHeapSize\fR¤ÈƱÅù¤Ç¤¹¡£ ++\fB\-Xmx\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:MaxHeapSize\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xnoclassgc + .RS 4 + ¥¯¥é¥¹¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(GC)¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢GC»þ´Ö¤òÀáÌó¤Ç¤­¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¼Â¹ÔÃæ¤ÎÃæÃǤ¬Ã»½Ì¤µ¤ì¤Þ¤¹¡£ + .sp +-µ¯Æ°»þ¤Ë\fI\-Xnoclassgc\fR¤ò»ØÄꤹ¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥óÆâ¤Î¥¯¥é¥¹¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢GC¤Î´Ö¤Ï¤½¤Î¤Þ¤Þ»Ä¤ê¡¢¾ï¤Ë¥é¥¤¥Ö¤Ç¤¢¤ë¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¤è¤ê¿¤¯¤Î¥á¥â¥ê¡¼¤¬±Êµ×¤ËÀêÍ­¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¡¢Ãí°Õ¤·¤Æ»ÈÍѤ·¤Ê¤¤¤È¡¢¥á¥â¥ê¡¼ÉÔ­¤ÎÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ ++µ¯Æ°»þ¤Ë\fB\-Xnoclassgc\fR¤ò»ØÄꤹ¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥óÆâ¤Î¥¯¥é¥¹¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢GC¤Î´Ö¤Ï¤½¤Î¤Þ¤Þ»Ä¤ê¡¢¾ï¤Ë¥é¥¤¥Ö¤Ç¤¢¤ë¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¤è¤ê¿¤¯¤Î¥á¥â¥ê¡¼¤¬±Êµ×¤ËÀêÍ­¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¡¢Ãí°Õ¤·¤Æ»ÈÍѤ·¤Ê¤¤¤È¡¢¥á¥â¥ê¡¼ÉÔ­¤ÎÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-Xprof + .RS 4 +-¼Â¹ÔÃæ¤Î¥×¥í¥°¥é¥à¤Î¥×¥í¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¡¢¥×¥í¥Õ¥¡¥¤¥ë¡¦¥Ç¡¼¥¿¤òɸ½à½ÐÎϤËÁ÷¿®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥×¥í¥°¥é¥à³«È¯ÍѤΥ桼¥Æ¥£¥ê¥Æ¥£¤È¤·¤ÆÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£ËÜÈÖ²ÔƯ¥·¥¹¥Æ¥à¤Ç¤Î»ÈÍѤòÌÜŪ¤È¤·¤¿¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++¼Â¹ÔÃæ¤Î¥×¥í¥°¥é¥à¤ò¥×¥í¥Õ¥¡¥¤¥ë¤·¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥Ç¡¼¥¿¤òɸ½à½ÐÎϤËÁ÷¿®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥×¥í¥°¥é¥à³«È¯ÍѤΥ桼¥Æ¥£¥ê¥Æ¥£¤È¤·¤ÆÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£ËÜÈÖ²ÔƯ¥·¥¹¥Æ¥à¤Ç¤Î»ÈÍѤòÌÜŪ¤È¤·¤¿¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .RE + .PP + \-Xrs +@@ -675,13 +689,13 @@ + .sp + ¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤Ï¡¢JVM¤¬ÆÍÁ³½ªÎ»¤·¤¿¾ì¹ç¤Ç¤â¡¢¥·¥ã¥Ã¥È¥À¥¦¥ó»þ¤Ë¥æ¡¼¥¶¡¼¡¦¥¯¥ê¡¼¥ó¥¢¥Ã¥×¡¦¥³¡¼¥É(¥Ç¡¼¥¿¥Ù¡¼¥¹Àܳ¤Î¥¯¥í¡¼¥º¤Ê¤É)¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥·¥ã¥Ã¥È¥À¥¦¥ó¤ò½çÈÖ¤ËÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .sp +-JVM¤Ï¡¢Í½´ü¤·¤Ê¤¤½ªÎ»¤Î¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤Ë¥·¥°¥Ê¥ë¤ò¥­¥ã¥Ã¥Á¤·¤Þ¤¹¡£JVM¤Ï¡¢\fISIGHUP\fR¡¢\fISIGINT\fR¤ª¤è¤Ó\fISIGTERM\fR¤ò»ÈÍѤ·¤Æ¡¢¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤Î¼Â¹Ô¤ò³«»Ï¤·¤Þ¤¹¡£ ++JVM¤Ï¡¢Í½´ü¤·¤Ê¤¤½ªÎ»¤Î¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤Ë¥·¥°¥Ê¥ë¤ò¥­¥ã¥Ã¥Á¤·¤Þ¤¹¡£JVM¤Ï¡¢\fBSIGHUP\fR¡¢\fBSIGINT\fR¤ª¤è¤Ó\fBSIGTERM\fR¤ò»ÈÍѤ·¤Æ¡¢¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤Î¼Â¹Ô¤ò³«»Ï¤·¤Þ¤¹¡£ + .sp +-JVM¤Ï¡¢¥Ç¥Ð¥Ã¥°¤ÎÌÜŪ¤Ç¥¹¥ì¥Ã¥É¡¦¥¹¥¿¥Ã¥¯¤ò¥À¥ó¥×¤¹¤ë¤È¤¤¤¦µ¡Ç½¤ò¼Â¸½¤¹¤ë¤¿¤á¤Ë¡¢Æ±ÍͤΥᥫ¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£JVM¤Ï¡¢¥¹¥ì¥Ã¥É¡¦¥À¥ó¥×¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤Ë\fISIGQUIT\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++JVM¤Ï¡¢¥Ç¥Ð¥Ã¥°¤ÎÌÜŪ¤Ç¥¹¥ì¥Ã¥É¡¦¥¹¥¿¥Ã¥¯¤ò¥À¥ó¥×¤¹¤ë¤È¤¤¤¦µ¡Ç½¤ò¼Â¸½¤¹¤ë¤¿¤á¤Ë¡¢Æ±ÍͤΥᥫ¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£JVM¤Ï¡¢¥¹¥ì¥Ã¥É¡¦¥À¥ó¥×¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤Ë\fBSIGQUIT\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp +-JVM¤òËä¤á¹þ¤ó¤Ç¤¤¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢\fISIGINT\fR¤ä\fISIGTERM\fR¤Ê¤É¤Î¥·¥°¥Ê¥ë¤òÉÑÈˤ˥ȥé¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¡¢¤½¤Î·ë²Ì¡¢JVM¤Î¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤È¾×Æͤ¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fI\-Xrs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¤³¤ÎÌäÂê¤ËÂн褹¤ë¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£\fI\-Xrs\fR¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fISIGINT\fR¡¢\fISIGTERM\fR¡¢\fISIGHUP\fR¤ª¤è¤Ó\fISIGQUIT\fR¤Î¥·¥°¥Ê¥ë¡¦¥Þ¥¹¥¯¤ÏJVM¤Ë¤è¤Ã¤ÆÊѹ¹¤µ¤ì¤º¡¢¤³¤ì¤é¤Î¥·¥°¥Ê¥ë¤Î¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤Ï¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Þ¤»¤ó¡£ ++JVM¤òËä¤á¹þ¤ó¤Ç¤¤¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢\fBSIGINT\fR¤ä\fBSIGTERM\fR¤Ê¤É¤Î¥·¥°¥Ê¥ë¤òÉÑÈˤ˥ȥé¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¡¢¤½¤Î·ë²Ì¡¢JVM¤Î¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤È¾×Æͤ¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fB\-Xrs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¤³¤ÎÌäÂê¤ËÂн褹¤ë¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£\fB\-Xrs\fR¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBSIGINT\fR¡¢\fBSIGTERM\fR¡¢\fBSIGHUP\fR¤ª¤è¤Ó\fBSIGQUIT\fR¤Î¥·¥°¥Ê¥ë¡¦¥Þ¥¹¥¯¤ÏJVM¤Ë¤è¤Ã¤ÆÊѹ¹¤µ¤ì¤º¡¢¤³¤ì¤é¤Î¥·¥°¥Ê¥ë¤Î¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤Ï¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Þ¤»¤ó¡£ + .sp +-\fI\-Xrs\fR¤ò»ØÄꤹ¤ë¤È¡¢¼¡¤Î2¤Ä¤Î·ë²Ì¤¬À¸¤¸¤Þ¤¹: ++\fB\-Xrs\fR¤ò»ØÄꤹ¤ë¤È¡¢¼¡¤Î2¤Ä¤Î·ë²Ì¤¬À¸¤¸¤Þ¤¹: + .sp + .RS 4 + .ie n \{\ +@@ -691,7 +705,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fISIGQUIT\fR¤Ë¤è¤ë¥¹¥ì¥Ã¥É¡¦¥À¥ó¥×¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++\fBSIGQUIT\fR¤Ë¤è¤ë¥¹¥ì¥Ã¥É¡¦¥À¥ó¥×¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -702,7 +716,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯½èÍý¤Î¼Â¹Ô¤Ï¡¢JVM¤¬½ªÎ»¤·¤è¤¦¤È¤·¤Æ¤¤¤ë»þÅÀ¤Ç\fISystem\&.exit()\fR¤ò¸Æ¤Ó½Ð¤¹¤Ê¤É¤·¤Æ¡¢¥æ¡¼¥¶¡¼¡¦¥³¡¼¥É¦¤Ç¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ++¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯½èÍý¤Î¼Â¹Ô¤Ï¡¢JVM¤¬½ªÎ»¤·¤è¤¦¤È¤·¤Æ¤¤¤ë»þÅÀ¤Ç\fBSystem\&.exit()\fR¤ò¸Æ¤Ó½Ð¤¹¤Ê¤É¤·¤Æ¡¢¥æ¡¼¥¶¡¼¡¦¥³¡¼¥É¦¤Ç¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .RE + .PP +@@ -758,7 +772,7 @@ + .PP + \-Xss\fIsize\fR + .RS 4 +-¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£KB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢MB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢GB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϥץé¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ ++¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£KB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢MB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢GB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϥץé¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -843,19 +857,20 @@ + .RS 4 + .\} + .nf +-\-Xss1m +-\-Xss1024k +-\-Xss1048576 ++\fB\-Xss1m\fR ++\fB\-Xss1024k\fR ++\fB\-Xss1048576\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:ThreadStackSize\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:ThreadStackSize\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xusealtsigs + .RS 4 +-JVMÆâÉô¥·¥°¥Ê¥ë¤Î\fISIGUSR1\fR¤ª¤è¤Ó\fISIGUSR2\fR¤Î¤«¤ï¤ê¤Ë¡¢ÂåÂØ¥·¥°¥Ê¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:+UseAltSigs\fR¤ÈƱÅù¤Ç¤¹¡£ ++JVMÆâÉô¥·¥°¥Ê¥ë¤Î\fBSIGUSR1\fR¤ª¤è¤Ó\fBSIGUSR2\fR¤Î¤«¤ï¤ê¤Ë¡¢ÂåÂØ¥·¥°¥Ê¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:+UseAltSigs\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xverify:\fImode\fR +@@ -869,7 +884,7 @@ + .PP + remote + .RS 4 +-¥Í¥Ã¥È¥ï¡¼¥¯¤ò²ð¤·¤Æ¥ê¥â¡¼¥È¤Ç¥í¡¼¥É¤µ¤ì¤ë¥¯¥é¥¹¤Î¤ß¤ò¸¡¾Ú¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fI\-Xverify\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ ++¥Í¥Ã¥È¥ï¡¼¥¯¤ò²ð¤·¤Æ¥ê¥â¡¼¥È¤Ç¥í¡¼¥É¤µ¤ì¤ë¥¯¥é¥¹¤Î¤ß¤ò¸¡¾Ú¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fB\-Xverify\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ + .RE + .PP + all +@@ -883,40 +898,47 @@ + .PP + \-XX:+DisableAttachMechanism + .RS 4 +-JVM¤Ë¥Ä¡¼¥ë¤ò¥¢¥¿¥Ã¥Á¤¹¤ë¥á¥«¥Ë¥º¥à¤ò̵¸ú¤Ë¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤Ï¡¢¥¢¥¿¥Ã¥Á¡¦¥á¥«¥Ë¥º¥à¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fIjcmd\fR¡¢\fIjstack\fR¡¢\fIjmap\fR¡¢\fIjinfo\fR¤Ê¤É¤Î¥Ä¡¼¥ë¤ò»ÈÍѤǤ­¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++JVM¤Ë¥Ä¡¼¥ë¤ò¥¢¥¿¥Ã¥Á¤¹¤ë¥á¥«¥Ë¥º¥à¤ò̵¸ú¤Ë¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤Ï¡¢¥¢¥¿¥Ã¥Á¡¦¥á¥«¥Ë¥º¥à¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fBjcmd\fR¡¢\fBjstack\fR¡¢\fBjmap\fR¡¢\fBjinfo\fR¤Ê¤É¤Î¥Ä¡¼¥ë¤ò»ÈÍѤǤ­¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .RE + .PP + \-XX:ErrorFile=\fIfilename\fR + .RS 4 +-¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ë¥¨¥é¡¼¡¦¥Ç¡¼¥¿¤¬½ñ¤­¹þ¤Þ¤ì¤ë¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fIhs_err_pid\fR\fIpid\fR\fI\&.log\fR +-(\fIpid\fR¤Ï¥¨¥é¡¼¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥í¥°¡¦¥Õ¥¡¥¤¥ë¤òÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(¥×¥í¥»¥¹¤Î¼±Ê̻ҤÏ\fI%p\fR¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹)¡£ ++¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ë¥¨¥é¡¼¡¦¥Ç¡¼¥¿¤¬½ñ¤­¹þ¤Þ¤ì¤ë¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fBhs_err_pid\fR\fIpid\fR\fB\&.log\fR ++(\fIpid\fR¤Ï¥¨¥é¡¼¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥í¥°¡¦¥Õ¥¡¥¤¥ë¤òÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(¥×¥í¥»¥¹¤Î¼±Ê̻ҤÏ\fB%p\fR¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹)¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-XX:ErrorFile=\&./hs_err_pid%p\&.log ++\fB\-XX:ErrorFile=\&./hs_err_pid%p\&.log\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤ÎÎã¤Ç¤Ï¡¢¥¨¥é¡¼¡¦¥í¥°¤ò\fI/var/log/java/java_error\&.log\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢¥¨¥é¡¼¡¦¥í¥°¤ò\fB/var/log/java/java_error\&.log\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-XX:ErrorFile=/var/log/java/java_error\&.log ++\fB\-XX:ErrorFile=/var/log/java/java_error\&.log\fR ++ + .fi + .if n \{\ + .RE + .\} +-(ÎΰèÉÔ­¡¢¸¢¸Â¤ÎÌäÂê¤Þ¤¿¤ÏÊ̤ÎÌäÂê¤Ë¤è¤ê)»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ï¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î°ì»þ¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£°ì»þ¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fI/tmp\fR¤Ç¤¹¡£ ++(ÎΰèÉÔ­¡¢¸¢¸Â¤ÎÌäÂê¤Þ¤¿¤ÏÊ̤ÎÌäÂê¤Ë¤è¤ê)»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ï¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î°ì»þ¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£°ì»þ¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fB/tmp\fR¤Ç¤¹¡£ ++.RE ++.PP ++\-XX:+FailOverToOldVerifier ++.RS 4 ++¿·¤·¤¤¥¿¥¤¥×¡¦¥Á¥§¥Ã¥«¤¬¼ºÇÔ¤·¤¿¾ì¹ç¤Î¡¢¸Å¤¤¥Ù¥ê¥Õ¥¡¥¤¥¢¤Ø¤Î¼«Æ°¥Õ¥§¥¤¥ë¥ª¡¼¥Ð¡¼¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢ºÇ¶á¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤Ï̵»ë¤µ¤ì¤Þ¤¹(¤Ä¤Þ¤ê¡¢Ìµ¸ú¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹)¡£¸Å¤¤¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥¤¥È¥³¡¼¥É¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤òÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:LargePageSizeInBytes=\fIsize\fR + .RS 4 +-Java¥Ò¡¼¥×¤Ë»ÈÍѤµ¤ì¤ëÂ礭¤¤¥Ú¡¼¥¸¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£\fIsize\fR°ú¿ô¤Ï¡¢2¤ÎÎß¾è(2¡¢4¡¢8¡¢16¡¢\&.\&.\&.)¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¥¤¥º¤Ï0¤ËÀßÄꤵ¤ì¡¢¤³¤ì¤Ï¡¢JVM¤Ç¤ÏÂ礭¤¤¥Ú¡¼¥¸¤Î¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++Java¥Ò¡¼¥×¤Ë»ÈÍѤµ¤ì¤ëÂ礭¤¤¥Ú¡¼¥¸¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£\fIsize\fR°ú¿ô¤Ï¡¢2¤ÎÎß¾è(2¡¢4¡¢8¡¢16¡¢\&.\&.\&.)¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¥¤¥º¤Ï0¤ËÀßÄꤵ¤ì¡¢¤³¤ì¤Ï¡¢JVM¤Ç¤ÏÂ礭¤¤¥Ú¡¼¥¸¤Î¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢Â礭¤¤¥Ú¡¼¥¸¤Î¥µ¥¤¥º¤ò4¥á¥¬¥Ð¥¤¥È(MB)¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -924,7 +946,8 @@ + .RS 4 + .\} + .nf +-\-XX:LargePageSizeInBytes=4m ++\fB\-XX:LargePageSizeInBytes=4m\fR ++ + .fi + .if n \{\ + .RE +@@ -933,7 +956,7 @@ + .PP + \-XX:MaxDirectMemorySize=\fIsize\fR + .RS 4 +-¿·µ¬I/O (\fIjava\&.nio\fR¥Ñ¥Ã¥±¡¼¥¸)¤ÎľÀܥХåե¡³äÅö¤Æ¤ÎºÇÂç¹ç·×¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¥¤¥º¤Ï0¤ËÀßÄꤵ¤ì¡¢¤³¤ì¤Ï¡¢JVM¤Ç¤ÏNIO¤ÎľÀܥХåե¡³äÅö¤Æ¤Î¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++¿·µ¬I/O (\fBjava\&.nio\fR¥Ñ¥Ã¥±¡¼¥¸)¤ÎľÀܥХåե¡³äÅö¤Æ¤ÎºÇÂç¹ç·×¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¥¤¥º¤Ï0¤ËÀßÄꤵ¤ì¡¢¤³¤ì¤Ï¡¢JVM¤Ç¤ÏNIO¤ÎľÀܥХåե¡³äÅö¤Æ¤Î¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢NIO¥µ¥¤¥º¤ò°Û¤Ê¤ëñ°Ì¤Ç1024KB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -941,9 +964,10 @@ + .RS 4 + .\} + .nf +-\-XX:MaxDirectMemorySize=1m +-\-XX:MaxDirectMemorySize=1024k +-\-XX:MaxDirectMemorySize=1048576 ++\fB\-XX:MaxDirectMemorySize=1m\fR ++\fB\-XX:MaxDirectMemorySize=1024k\fR ++\fB\-XX:MaxDirectMemorySize=1048576\fR ++ + .fi + .if n \{\ + .RE +@@ -956,7 +980,7 @@ + .PP + off + .RS 4 +-JVM¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼»ÈÍѾõ¶·¤òÄÉÀפ·¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢\fI\-XX:NativeMemoryTracking\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ ++JVM¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼»ÈÍѾõ¶·¤òÄÉÀפ·¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢\fB\-XX:NativeMemoryTracking\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ + .RE + .PP + summary +@@ -966,7 +990,7 @@ + .PP + detail + .RS 4 +-JVM¥µ¥Ö¥·¥¹¥Æ¥à¤Ë¤è¤ë¥á¥â¥ê¡¼»ÈÍѾõ¶·¤Î¥È¥é¥Ã¥­¥ó¥°¤Ë²Ã¤¨¤Æ¡¢¸Ä¡¹¤Î\fICallSite\fR ++JVM¥µ¥Ö¥·¥¹¥Æ¥à¤Ë¤è¤ë¥á¥â¥ê¡¼»ÈÍѾõ¶·¤Î¥È¥é¥Ã¥­¥ó¥°¤Ë²Ã¤¨¤Æ¡¢¸Ä¡¹¤Î\fBCallSite\fR + (¸Ä¡¹¤Î²¾ÁÛ¥á¥â¥ê¡¼¡¦¥ê¡¼¥¸¥ç¥ó¤ª¤è¤Ó¤½¤Î¥³¥ß¥Ã¥ÈºÑ¥ê¡¼¥¸¥ç¥ó)¤Ë¤è¤ë¥á¥â¥ê¡¼»ÈÍѾõ¶·¤òÄÉÀפ·¤Þ¤¹¡£ + .RE + .RE +@@ -975,13 +999,14 @@ + .RS 4 + ¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤È¤­¤Ë¼Â¹Ô¤¹¤ë¡¢¥«¥¹¥¿¥à¡¦¥³¥Þ¥ó¥É¤Þ¤¿¤Ï°ìÏ¢¤Î¥»¥ß¥³¥í¥ó¶èÀÚ¤ê¤Î¥³¥Þ¥ó¥É¤òÀßÄꤷ¤Þ¤¹¡£Ê¸»úÎó¤Ë¶õÇò¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fI\-XX:OnError\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥¢¡¦¥¤¥á¡¼¥¸¤òºîÀ®¤¹¤ë¤¿¤á¤Ë\fIgcore\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëÊýË¡¡¢¤ª¤è¤Ó¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤Î¾ì¹ç¤Ë¥Ç¥Ð¥Ã¥¬¤òµ¯Æ°¤·¤Æ¥×¥í¥»¥¹¤ËÀܳ¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(\fI%p\fR¤Ï¸½ºß¤Î¥×¥í¥»¥¹¤ò»ØÄꤷ¤Þ¤¹)¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fB\-XX:OnError\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥¢¡¦¥¤¥á¡¼¥¸¤òºîÀ®¤¹¤ë¤¿¤á¤Ë\fBgcore\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëÊýË¡¡¢¤ª¤è¤Ó¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤Î¾ì¹ç¤Ë¥Ç¥Ð¥Ã¥¬¤òµ¯Æ°¤·¤Æ¥×¥í¥»¥¹¤ËÀܳ¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(\fB%p\fR¤Ï¸½ºß¤Î¥×¥í¥»¥¹¤ò»ØÄꤷ¤Þ¤¹)¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-XX:OnError="gcore %p;dbx \- %p" ++\fB\-XX:OnError="gcore %p;dbx \- %p"\fR ++ + .fi + .if n \{\ + .RE +@@ -990,17 +1015,22 @@ + .PP + \-XX:OnOutOfMemoryError=\fIstring\fR + .RS 4 +-\fIOutOfMemoryError\fRÎã³°¤¬ºÇ½é¤Ë¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤Ë¼Â¹Ô¤¹¤ë¡¢¥«¥¹¥¿¥à¡¦¥³¥Þ¥ó¥É¤Þ¤¿¤Ï°ìÏ¢¤Î¥»¥ß¥³¥í¥ó¶èÀÚ¤ê¤Î¥³¥Þ¥ó¥É¤òÀßÄꤷ¤Þ¤¹¡£Ê¸»úÎó¤Ë¶õÇò¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥Éʸ»úÎó¤ÎÎã¤Ï¡¢\fI\-XX:OnError\fR¥ª¥×¥·¥ç¥ó¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBOutOfMemoryError\fRÎã³°¤¬ºÇ½é¤Ë¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤Ë¼Â¹Ô¤¹¤ë¡¢¥«¥¹¥¿¥à¡¦¥³¥Þ¥ó¥É¤Þ¤¿¤Ï°ìÏ¢¤Î¥»¥ß¥³¥í¥ó¶èÀÚ¤ê¤Î¥³¥Þ¥ó¥É¤òÀßÄꤷ¤Þ¤¹¡£Ê¸»úÎó¤Ë¶õÇò¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥Éʸ»úÎó¤ÎÎã¤Ï¡¢\fB\-XX:OnError\fR¥ª¥×¥·¥ç¥ó¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-XX:+PrintCommandLineFlags + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ëɽ¼¨¤µ¤ì¤¿¡¢¿Í´Ö¹©³ØŪ¤ËÁªÂò¤·¤¿JVM¥Õ¥é¥°¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥Ò¡¼¥×Îΰ襵¥¤¥º¤äÁªÂò¤µ¤ì¤¿¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ê¤É¡¢JVM¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤¿¥¨¥ë¥´¥Î¥ß¥Ã¥¯Ãͤò³Îǧ¤¹¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Õ¥é¥°¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ëɽ¼¨¤µ¤ì¤¿¡¢¿Í´Ö¹©³ØŪ¤ËÁªÂò¤·¤¿JVM¥Õ¥é¥°¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥Ò¡¼¥×Îΰ襵¥¤¥º¤äÁªÂò¤µ¤ì¤¿¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ê¤É¡¢JVM¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤¿¥¨¥ë¥´¥Î¥ß¥Ã¥¯Ãͤò³Îǧ¤¹¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Õ¥é¥°¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .PP + \-XX:+PrintNMTStatistics + .RS 4 +-¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¤¬Í­¸ú¤Ê¾ì¹ç¤Ë¡¢JVM¤Î½ªÎ»»þ¤Ë¼ý½¸¤µ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¡¦¥Ç¡¼¥¿¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹(\fI\-XX:NativeMemoryTracking\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¡¦¥Ç¡¼¥¿¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£ ++¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¤¬Í­¸ú¤Ê¾ì¹ç¤Ë¡¢JVM¤Î½ªÎ»»þ¤Ë¼ý½¸¤µ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¡¦¥Ç¡¼¥¿¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹(\fB\-XX:NativeMemoryTracking\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¡¦¥Ç¡¼¥¿¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:+RelaxAccessControlCheck ++.RS 4 ++¥Ù¥ê¥Õ¥¡¥¤¥¢Æâ¤Î¥¢¥¯¥»¥¹À©¸æ¥Á¥§¥Ã¥¯¤ÎÎ̤ò¸º¤é¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢ºÇ¶á¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤Ï̵»ë¤µ¤ì¤Þ¤¹(¤Ä¤Þ¤ê¡¢Ìµ¸ú¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹)¡£¸Å¤¤¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥¤¥È¥³¡¼¥É¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤òÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:+ShowMessageBoxOnError +@@ -1010,7 +1040,7 @@ + .PP + \-XX:ThreadStackSize=\fIsize\fR + .RS 4 +-¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϥץé¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ ++¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϥץé¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1095,14 +1125,15 @@ + .RS 4 + .\} + .nf +-\-XX:ThreadStackSize=1m +-\-XX:ThreadStackSize=1024k +-\-XX:ThreadStackSize=1048576 ++\fB\-XX:ThreadStackSize=1m\fR ++\fB\-XX:ThreadStackSize=1024k\fR ++\fB\-XX:ThreadStackSize=1048576\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xss\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xss\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-XX:+TraceClassLoading +@@ -1132,14 +1163,14 @@ + .PP + \-XX:+UseAltSigs + .RS 4 +-JVMÆâÉô¥·¥°¥Ê¥ë¤Î\fISIGUSR1\fR¤ª¤è¤Ó\fISIGUSR2\fR¤Î¤«¤ï¤ê¤Ë¡¢ÂåÂØ¥·¥°¥Ê¥ë¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢ÂåÂØ¥·¥°¥Ê¥ë¤Ï»ÈÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xusealtsigs\fR¤ÈƱÅù¤Ç¤¹¡£ ++JVMÆâÉô¥·¥°¥Ê¥ë¤Î\fBSIGUSR1\fR¤ª¤è¤Ó\fBSIGUSR2\fR¤Î¤«¤ï¤ê¤Ë¡¢ÂåÂØ¥·¥°¥Ê¥ë¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢ÂåÂØ¥·¥°¥Ê¥ë¤Ï»ÈÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xusealtsigs\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-XX:+UseBiasedLocking + .RS 4 + ¥Ð¥¤¥¢¥¹¡¦¥í¥Ã¥¯¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤«¤Ê¤ê¤ÎÎ̤ÎÈ󶥹ç¤ÎƱ´ü²½¤¬¤¢¤ë°ìÉô¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤Î¥Õ¥é¥°¤òÍ­¸ú¤Ë¤¹¤ë¤ÈÂçÉý¤Ê¹â®²½¤¬¼Â¸½¤·¤Þ¤¹¤¬¡¢ÆÃÄê¤Î¥Ñ¥¿¡¼¥ó¤Î¥í¥Ã¥¯¤¬¤¢¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢Â®ÅÙ¤¬Äã²¼¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¥Ð¥¤¥¢¥¹¡¦¥í¥Ã¥¯¤ÎÊýË¡¤Î¾ÜºÙ¤Ï¡¢http://www\&.oracle\&.com/technetwork/java/tuning\-139912\&.html#section4\&.2\&.5¤Ë¤¢¤ëJava¥Á¥å¡¼¥Ë¥ó¥°¤Î¥Û¥ï¥¤¥È¡¦¥Ú¡¼¥Ñ¡¼¤ÎÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Ð¥¤¥¢¥¹¡¦¥í¥Ã¥¯¤Ï»ÈÍѤµ¤ì¤Þ¤»¤ó¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseCompressedOops +@@ -1151,19 +1182,19 @@ + .PP + \-XX:+UseLargePages + .RS 4 +-Â礭¤¤¥Ú¡¼¥¸¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Â礭¤¤¥Ú¡¼¥¸¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseLargePages\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++Â礭¤¤¥Ú¡¼¥¸¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Â礭¤¤¥Ú¡¼¥¸¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseLargePages\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + ¾ÜºÙ¤Ï¡¢http://www\&.oracle\&.com/technetwork/java/javase/tech/largememory\-jsp\-137182\&.html¤Ë¤¢¤ëÂ礭¤¤¥á¥â¥ê¡¼¡¦¥Ú¡¼¥¸ÍѤÎJava¥µ¥Ý¡¼¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-XX:+UseMembar + .RS 4 +-¥¹¥ì¥Ã¥É¤Î¾õÂÖ¤ÎÁ«°Ü¤Ç¥á¥ó¥Ð¡¼¤Îȯ¹Ô¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëPower PC¤ª¤è¤ÓARM¥µ¡¼¥Ð¡¼¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Power PC¤ÈARM¤Î¥¹¥ì¥Ã¥É¾õÂÖÁ«°Ü¤ËÂФ¹¤ë¥á¥ó¥Ð¡¼¤Îȯ¹Ô¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseMembar\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥¹¥ì¥Ã¥É¤Î¾õÂÖ¤ÎÁ«°Ü¤Ç¥á¥ó¥Ð¡¼¤Îȯ¹Ô¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëARM¥µ¡¼¥Ð¡¼¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£(ARM¥µ¡¼¥Ð¡¼¤Ç¤³¤Î¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£) + .RE + .PP + \-XX:+UsePerfData + .RS 4 +-\fIperfdata\fRµ¡Ç½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢JVM¤Î¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¡¦¥Æ¥¹¥È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤ò̵¸ú¤Ë¤¹¤ë¤È¡¢\fIhsperfdata_userid\fR¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤òÍÞÀ©¤·¤Þ¤¹¡£\fIperfdata\fRµ¡Ç½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UsePerfData\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBperfdata\fRµ¡Ç½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢JVM¤Î¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¡¦¥Æ¥¹¥È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤ò̵¸ú¤Ë¤¹¤ë¤È¡¢\fBhsperfdata_userid\fR¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤òÍÞÀ©¤·¤Þ¤¹¡£\fBperfdata\fRµ¡Ç½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UsePerfData\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-XX:+AllowUserSignalHandlers +@@ -1187,530 +1218,20 @@ + .RS 4 + .\} + .nf +-\-XX:AllocateInstancePrefetchLines=1 ++\fB\-XX:AllocateInstancePrefetchLines=1\fR ++ + .fi + .if n \{\ + .RE + .\} +-.RE +-.PP +-\-XX:AllocatePrefetchInstr=\fIinstruction\fR +-.RS 4 +-³äÅö¤Æ¥Ý¥¤¥ó¥¿¤ÎÁ°¤Ë¥×¥ê¥Õ¥§¥Ã¥Á¤¹¤ë¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤òÀßÄꤷ¤Þ¤¹¡£»ÈÍѲÄǽ¤ÊÃͤÏ0¤«¤é3¤Þ¤Ç¤Ç¤¹¡£ÃͤÎÇظå¤Ë¤¢¤ë¼ÂºÝ¤ÎÌ¿Îá¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤Ï0¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:AllocatePrefetchInstr=0 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:AllocatePrefetchStepSize=\fIsize\fR +-.RS 4 +-½ç¼¡¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤Î¥¹¥Æ¥Ã¥×¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¥Æ¥Ã¥×¡¦¥µ¥¤¥º¤Ï16¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:AllocatePrefetchStepSize=16 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+BackgroundCompilation +-.RS 4 +-¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-BackgroundCompilation\fR¤ò»ØÄꤷ¤Þ¤¹(¤³¤ì¤Ï\fI\-Xbatch\fR¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤Ç¤¹)¡£ +-.RE +-.PP +-\-XX:CICompilerCount=\fIthreads\fR +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤Ë»ÈÍѤ¹¤ë¥³¥ó¥Ñ¥¤¥é¡¦¥¹¥ì¥Ã¥É¤Î¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¿ô¤Ï¡¢¥µ¡¼¥Ð¡¼JVM¤Î¾ì¹ç¤Ï2¡¢¥¯¥é¥¤¥¢¥ó¥ÈJVM¤Î¾ì¹ç¤Ï1¤ËÀßÄꤵ¤ì¤Æ¤ª¤ê¡¢ÁØ¥³¥ó¥Ñ¥¤¥ë¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥³¥¢¿ô¤Ë¹ç¤»¤ÆÁý¸º¤·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¤Î¿ô¤ò2¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CICompilerCount=2 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CodeCacheMinimumFreeSpace=\fIsize\fR +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤ËɬÍפʺǾ®¶õ¤­Îΰè(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£ºÇ¾®¶õ¤­Îΰè¤è¤ê¾¯¤Ê¤¤Îΰ褷¤«»Ä¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥ë¤ÏÄä»ß¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï500KB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢ºÇ¾®¶õ¤­Îΰè¤ò1024MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CodeCacheMinimumFreeSpace=1024m +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] +-.RS 4 +-¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é\fIString\fR¥¯¥é¥¹¤Î\fIindexOf()\fR¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=exclude,java/lang/String\&.indexOf +-.fi +-.if n \{\ +-.RE +-.\} +-¥¹¥é¥Ã¥·¥å(\fI/\fR)¤Ç¶èÀÚ¤é¤ì¤¿¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¡¢´°Á´¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ÀÚ¼è¤ê¤ÈŽÉÕ¤±¤ÎÁàºî¤òÍưפˤ¹¤ë¤¿¤á¤Ë¡¢\fI\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥á¥½¥Ã¥É̾¤Î·Á¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf +-.fi +-.if n \{\ +-.RE +-.\} +-½ð̾¤Ê¤·¤Ç¥á¥½¥Ã¥É¤ò»ØÄꤹ¤ë¤È¡¢¥³¥Þ¥ó¥É¤Ï»ØÄꤷ¤¿Ì¾Á°¤ò»ý¤Ä¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ËŬÍѤµ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë·Á¼°¤Ç¥á¥½¥Ã¥É¤Î½ð̾¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é\fIString\fR¥¯¥é¥¹¤Î\fIindexOf(String)\fR¥á¥½¥Ã¥É¤Î¤ß½ü³°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=exclude,java/lang/String\&.indexOf(Ljava/lang/String;)I +-.fi +-.if n \{\ +-.RE +-.\} +-¤Þ¤¿¡¢¥¯¥é¥¹Ì¾¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤Ë¥ï¥¤¥ë¥É¥«¡¼¥É¤È¤·¤Æ¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ò»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î¤¹¤Ù¤Æ¤Î\fIindexOf()\fR¥á¥½¥Ã¥É¤ò½ü³°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=exclude,*\&.indexOf +-.fi +-.if n \{\ +-.RE +-.\} +-¥«¥ó¥Þ¤È¥Ô¥ê¥ª¥É¤Ï¶õÇò¤ÎÊÌ̾¤Ç¡¢¤³¤ì¤Ë¤è¤ê¡¢¥·¥§¥ë¤ò²ð¤·¤Æ¥³¥ó¥Ñ¥¤¥é¡¦¥³¥Þ¥ó¥É¤òÅϤ¹¤³¤È¤¬Íưפˤʤê¤Þ¤¹¡£°ú¿ô¤ò°úÍÑÉä¤Ç°Ï¤à¤³¤È¤Ç¡¢¶õÇò¤ò¥»¥Ñ¥ì¡¼¥¿¤È¤·¤Æ»ÈÍѤ·¤Æ\fI\-XX:CompileCommand\fR¤Ë°ú¿ô¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand="exclude java/lang/String indexOf" +-.fi +-.if n \{\ +-.RE +-.\} +-\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¤ÇÅϤµ¤ì¤¿¥³¥Þ¥ó¥É¤ò²òÀϤ·¤¿¸å¤Ë¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï\fI\&.hotspot_compiler\fR¥Õ¥¡¥¤¥ë¤«¤é¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¥³¥Þ¥ó¥É¤òÄɲ乤뤫¡¢¤Þ¤¿¤Ï\fI\-XX:CompileCommandFile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ̤Υե¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ +-.sp +-Ê£¿ô¤Î¥³¥Þ¥ó¥É¤òÄɲ乤ë¤Ë¤Ï¡¢\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄꤹ¤ë¤«¡¢¤Þ¤¿¤Ï²þ¹Ô¥»¥Ñ¥ì¡¼¥¿(\fI\en\fR)¤ò»ÈÍѤ·¤Æ³Æ°ú¿ô¤ò¶èÀÚ¤ê¤Þ¤¹¡£¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤǤ­¤Þ¤¹¡£ +-.PP +-break +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤ÎºÇ½é¤ËÄä»ß¤¹¤ë¤¿¤á¤Ë¡¢JVM¤Î¥Ç¥Ð¥Ã¥°»þ¤Î¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-compileonly +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò½ü¤¤¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ò¡¢¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤·¤Þ¤¹¡£Ê̤ÎÊýË¡¤È¤·¤Æ¡¢\fI\-XX:CompileOnly\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ£¿ô¤Î¥á¥½¥Ã¥É¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-dontinline +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥¤¥ó¥é¥¤¥ó²½¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£ +-.RE +-.PP +-exclude +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤·¤Þ¤¹¡£ +-.RE +-.PP +-help +-.RS 4 +-\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò°õºþ¤·¤Þ¤¹¡£ +-.RE +-.PP +-inline +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥¤¥ó¥é¥¤¥ó²½¤·¤è¤¦¤È¤·¤Þ¤¹¡£ +-.RE +-.PP +-log +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ËÂФ·¤Æ¡¢(\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ)¥³¥ó¥Ñ¥¤¥ë¡¦¥í¥®¥ó¥°¤ò½ü³°¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤Ë¥í¥®¥ó¥°¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ +-.RE +-.PP +-option +-.RS 4 +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢ºÇ¸å¤Î°ú¿ô(\fIoption\fR)¤Î¤«¤ï¤ê¤Ë¡¢»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ËJIT¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤òÅϤ¹¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢¥á¥½¥Ã¥É̾¤Î¸å¤ÎËöÈø¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIStringBuffer\fR¥¯¥é¥¹¤Î\fIappend()\fR¥á¥½¥Ã¥É¤ËÂФ·¤Æ\fIBlockLayoutByFrequency\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency +-.fi +-.if n \{\ +-.RE +-.\} +-¥«¥ó¥Þ¤Þ¤¿¤Ï¶õÇò¤Ç¶èÀڤäơ¢Ê£¿ô¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-print +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¸å¤ËÀ¸À®¤µ¤ì¤¿¥¢¥»¥ó¥Ö¥é¡¦¥³¡¼¥É¤ò½ÐÎϤ·¤Þ¤¹¡£ +-.RE +-.PP +-quiet +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ë¡¦¥³¥Þ¥ó¥É¤ò½ÐÎϤ·¤Þ¤»¤ó¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄꤷ¤¿¥³¥Þ¥ó¥É¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIString\fR¥¯¥é¥¹¤Î\fIindexOf()\fR¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤¹¤ë¾ì¹ç¡¢¼¡¤¬É¸½à½ÐÎϤ˽ÐÎϤµ¤ì¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-CompilerOracle: exclude java/lang/String\&.indexOf +-.fi +-.if n \{\ +-.RE +-.\} +-¾¤Î\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ÎÁ°¤Ë\fI\-XX:CompileCommand=quiet\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¤³¤ì¤òÍÞÀ©¤Ç¤­¤Þ¤¹¡£ +-.RE +-.RE +-.PP +-\-XX:CompileCommandFile=\fIfilename\fR +-.RS 4 +-JIT¥³¥ó¥Ñ¥¤¥é¡¦¥³¥Þ¥ó¥É¤ÎÆɼè¤ê¸µ¤Î¥Õ¥¡¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼Â¹Ô¤µ¤ì¤ë¥³¥Þ¥ó¥É¤ò³ÊǼ¤¹¤ë¤¿¤á¤Ë¡¢\fI\&.hotspot_compiler\fR¥Õ¥¡¥¤¥ë¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ +-.sp +-¥³¥Þ¥ó¥É¡¦¥Õ¥¡¥¤¥ë¤Î³Æ¹Ô¤Ï¡¢¥³¥Þ¥ó¥É¤¬»ÈÍѤµ¤ì¤ë¥³¥Þ¥ó¥É¡¢¥¯¥é¥¹Ì¾¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤òɽ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¹Ô¤Ï¡¢\fIString\fR¥¯¥é¥¹¤Î\fItoString()\fR¥á¥½¥Ã¥É¤ËÂФ·¤Æ¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤ò½ÐÎϤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-print java/lang/String toString +-.fi +-.if n \{\ +-.RE +-.\} +-¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤¹¤ëJIT¥³¥ó¥Ñ¥¤¥é¤Î¥³¥Þ¥ó¥É¤Î»ØÄê¤Î¾ÜºÙ¤Ï¡¢\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.RE +-.PP +-\-XX:CompileOnly=\fImethods\fR +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤òÀ©¸Â¤¹¤ë(¥«¥ó¥Þ¤Ç¶èÀÚ¤é¤ì¤¿)¥á¥½¥Ã¥É¤Î¥ê¥¹¥È¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¤ß¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£´°Á´¥¯¥é¥¹Ì¾(¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à)¤Ç³Æ¥á¥½¥Ã¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIString\fR¥¯¥é¥¹¤Î\fIlength()\fR¥á¥½¥Ã¥É¤ª¤è¤Ó\fIList\fR¥¯¥é¥¹¤Î\fIsize()\fR¥á¥½¥Ã¥É¤Î¤ß¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size +-.fi +-.if n \{\ +-.RE +-.\} +-¥¹¥é¥Ã¥·¥å(\fI/\fR)¤Ç¶èÀÚ¤é¤ì¤¿¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¡¢´°Á´¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ÀÚ¼è¤ê¤ÈŽÉÕ¤±¤ÎÁàºî¤òÍưפˤ¹¤ë¤¿¤á¤Ë¡¢\fI\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥á¥½¥Ã¥É̾¤Î·Á¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size +-.fi +-.if n \{\ +-.RE +-.\} +-¥ï¥¤¥ë¥É¥«¡¼¥É¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¤¬¡¢¥¯¥é¥¹Ì¾¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸Ì¾¤À¤±¤ò»ØÄꤷ¤Æ¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¡¢¥á¥½¥Ã¥É¤À¤±¤ò»ØÄꤷ¤ÆǤ°Õ¤Î¥¯¥é¥¹¤Î¤³¤Î̾Á°¤ò»ý¤Ä¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileOnly=java/lang/String +-\-XX:CompileOnly=java/lang +-\-XX:CompileOnly=\&.length +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CompileThreshold=\fIinvocations\fR +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ëÁ°¤Ë²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¡¼¥Ð¡¼JVM¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï¡¢10,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¤Æ¡¢¸úΨŪ¤Ê¥³¥ó¥Ñ¥¤¥ë¤Î¤¿¤á¤Î¾ðÊó¤ò¼ý½¸¤·¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥ÈJVM¤Î¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÀßÄê¤Ï1,500¸Æ½Ð¤·¤Ç¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤ò5,000¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileThreshold=5000 +-.fi +-.if n \{\ +-.RE +-.\} +-\fI\-Xcomp\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¤ÎÁ°¤Ë¡¢Java¥á¥½¥Ã¥É¤Î²ò¼á¤ò´°Á´¤Ë̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+DoEscapeAnalysis +-.RS 4 +-¥¨¥¹¥±¡¼¥×ʬÀϤλÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥¨¥¹¥±¡¼¥×ʬÀϤλÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-DoEscapeAnalysis\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+FailOverToOldVerifier +-.RS 4 +-¿·¤·¤¤¥¿¥¤¥×¡¦¥Á¥§¥Ã¥«¤¬¼ºÇÔ¤·¤¿¾ì¹ç¤Î¡¢¸Å¤¤¥Ù¥ê¥Õ¥¡¥¤¥¢¤Ø¤Î¼«Æ°¥Õ¥§¥¤¥ë¥ª¡¼¥Ð¡¼¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢ºÇ¶á¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤Ï̵»ë¤µ¤ì¤Þ¤¹(¤Ä¤Þ¤ê¡¢Ìµ¸ú¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹)¡£¸Å¤¤¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥¤¥È¥³¡¼¥É¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤òÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:InitialCodeCacheSize=\fIsize\fR +-.RS 4 +-½é´ü¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ500KB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢½é´ü¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤ò32KB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:InitialCodeCacheSize=32k +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+Inline +-.RS 4 +-¥á¥½¥Ã¥É¤Î¥¤¥ó¥é¥¤¥ó²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¤¿¤á¤Ë¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥á¥½¥Ã¥É¤Î¥¤¥ó¥é¥¤¥ó²½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-Inline\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:InlineSmallCode=\fIsize\fR +-.RS 4 +-¥¤¥ó¥é¥¤¥ó²½¤¬É¬Íפʥ³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤ÎºÇÂ祳¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£»ØÄꤷ¤¿¥µ¥¤¥º¤è¤ê¾®¤µ¤¤¥µ¥¤¥º¤Î¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¤ß¤¬¡¢¥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇÂ祳¡¼¥É¡¦¥µ¥¤¥º¤Ï1000¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:InlineSmallCode=1000 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+LogCompilation +-.RS 4 +-¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë\fIhotspot\&.log\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤Î¥í¥®¥ó¥°¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fI\-XX:LogFile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢°Û¤Ê¤ë¥í¥°¡¦¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¤È̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤Ïµ­Ï¿¤µ¤ì¤Þ¤»¤ó¡£\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fI\-XX:UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.sp +-\fI\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤Ó¤Ë¡¢¥³¥ó¥½¡¼¥ë¤Ë½ÐÎϤµ¤ì¤¿¥á¥Ã¥»¡¼¥¸¤ò´Þ¤à¾ÜºÙ¤Ê¿ÇÃǽÐÎϤòÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:MaxInlineSize=\fIsize\fR +-.RS 4 +-¥¤¥ó¥é¥¤¥ó²½¤¹¤ë¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º¤Ï35¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:MaxInlineSize=35 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:MaxNodeLimit=\fInodes\fR +-.RS 4 +-ñ°ì¤Î¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë»þ¤Ë»ÈÍѤµ¤ì¤ë¥Î¡¼¥É¤ÎºÇÂç¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Î¡¼¥É¤ÎºÇÂç¿ô¤Ï65,000¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:MaxNodeLimit=65000 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:MaxTrivialSize=\fIsize\fR +-.RS 4 +-¥¤¥ó¥é¥¤¥ó²½¤¹¤ëñ½ã¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ã±½ã¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º¤Ï6¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:MaxTrivialSize=6 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+OptimizeStringConcat +-.RS 4 +-\fIString\fRÏ¢·ëÁàºî¤ÎºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fIString\fRÏ¢·ëÁàºî¤ÎºÇŬ²½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-OptimizeStringConcat\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+PrintAssembly +-.RS 4 +-³°Éô¤Î\fIdisassembler\&.so\fR¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ·¤Æ¡¢¥Ð¥¤¥È¥³¡¼¥É²½¤µ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¤Î¥á¥½¥Ã¥É¤Î¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢À¸À®¤µ¤ì¤¿¥³¡¼¥É¤òɽ¼¨¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ÎÌäÂê¤Î¿ÇÃǤËÌòΩ¤Á¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£\fI\-XX:+PrintAssembly\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fI\-XX:UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+PrintCompilation +-.RS 4 +-¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤Ó¤Ë¡¢¥³¥ó¥½¡¼¥ë¤Ë¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢JVM¤«¤é¤Î¾ÜºÙ¤Ê¿ÇÃǽÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¼ÂºÝ¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¥á¥½¥Ã¥É¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¿ÇÃǽÐÎϤϰõºþ¤µ¤ì¤Þ¤»¤ó¡£ +-.sp +-\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤ò¥Õ¥¡¥¤¥ë¤Ëµ­Ï¿¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+PrintInlining +-.RS 4 +-¥¤¥ó¥é¥¤¥ó²½¤Î·èÄêÆâÍƤνÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤ë¥á¥½¥Ã¥É¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥¤¥ó¥é¥¤¥ó²½¾ðÊó¤Ï½ÐÎϤµ¤ì¤Þ¤»¤ó¡£\fI\-XX:+PrintInlining\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fI\-XX:+UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+RelaxAccessControlCheck +-.RS 4 +-¥Ù¥ê¥Õ¥¡¥¤¥¢Æâ¤Î¥¢¥¯¥»¥¹À©¸æ¥Á¥§¥Ã¥¯¤ÎÎ̤ò¸º¤é¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢ºÇ¶á¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤Ï̵»ë¤µ¤ì¤Þ¤¹(¤Ä¤Þ¤ê¡¢Ìµ¸ú¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹)¡£¸Å¤¤¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥¤¥È¥³¡¼¥É¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤òÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:ReservedCodeCacheSize=\fIsize\fR +-.RS 4 +-JIT¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤ÎºÇÂ祳¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xmaxjitcodesize\fR¤ÈƱÅù¤Ç¤¹¡£ +-.RE +-.PP +-\-XX:+TieredCompilation +-.RS 4 +-ÁØ¥³¥ó¥Ñ¥¤¥ë¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢ÁØ¥³¥ó¥Ñ¥¤¥ë¤Ï»ÈÍѤµ¤ì¤Þ¤»¤ó¡£ +-.RE +-.PP +-\-XX:+UseCodeCacheFlushing +-.RS 4 +-¥³¥ó¥Ñ¥¤¥é¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ëÁ°¤Ë¡¢¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¤Î¥Õ¥é¥Ã¥·¥å¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥é¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ëÁ°¤Ë¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¤Î¥Õ¥é¥Ã¥·¥å¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï\fI\-XX:\-UseCodeCacheFlushing\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+UseCondCardMark +-.RS 4 +-¥«¡¼¥Éɽ¤Î¹¹¿·Á°¤Ë¡¢¥«¡¼¥É¤¬¤¹¤Ç¤Ë¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Î¥Á¥§¥Ã¥¯¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢Ê£¿ô¤Î¥½¥±¥Ã¥È¤ò»ý¤Ä¥Þ¥·¥ó¾å¤Ç¤Î¤ß»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢Æ±»þÁàºî¤Ë¤«¤Ê¤ê°Í¸¤·¤Æ¤¤¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤·¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+UseSuperWord +-.RS 4 +-¥¹¥«¥é¡¼±é»»¤Î¥¹¡¼¥Ñ¡¼¥ï¡¼¥É±é»»¤Ø¤ÎÊÑ´¹¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥¹¥«¥é¡¼±é»»¤Î¥¹¡¼¥Ñ¡¼¥ï¡¼¥É±é»»¤Ø¤ÎÊÑ´¹¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseSuperWord\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.SS "¹âÅ٤ʥµ¡¼¥Ó¥¹¥¢¥Ó¥ê¥Æ¥£¡¦¥ª¥×¥·¥ç¥ó" +-.PP +-¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥·¥¹¥Æ¥à¾ðÊó¤ò¼ý½¸¤·¡¢¾ÜºÙ¤Ê¥Ç¥Ð¥Ã¥°¤ò¼Â¹Ô¤¹¤ëµ¡Ç½¤òÄ󶡤·¤Þ¤¹¡£ +-.PP +-\-XX:+ExtendedDTraceProbes +-.RS 4 +-¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ë±Æ¶Á¤òÍ¿¤¨¤ëÄɲäÎ\fIdtrace\fR¥Ä¡¼¥ë¡¦¥×¥í¡¼¥Ö¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fIdtrace\fR¤Ïɸ½à¥×¥í¡¼¥Ö¤Î¤ß¤ò¼Â¹Ô¤·¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+HeapDumpOnOutOfMemory +-.RS 4 +-\fIjava\&.lang\&.OutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ë¡¢¥Ò¡¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥é(HPROF)¤ò»ÈÍѤ·¤Æ¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¥Õ¥¡¥¤¥ë¤Ø¤ÎJava¥Ò¡¼¥×¤Î¥À¥ó¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fI\-XX:HeapDumpPath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤ª¤è¤Ó̾Á°¤òÌÀ¼¨Åª¤ËÀßÄê¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢\fIOutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ë¥Ò¡¼¥×¤Ï¥À¥ó¥×¤µ¤ì¤Þ¤»¤ó¡£ +-.RE +-.PP +-\-XX:HeapDumpPath=\fIpath\fR +-.RS 4 +-\fI\-XX:+HeapDumpOnOutOfMemoryError\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Ò¡¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥é(HPROF)¤¬Ä󶡤¹¤ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò½ñ¤­¹þ¤à¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fIjava_pid\fR\fIpid\fR\fI\&.hprof\fR +-(\fIpid\fR¤Ï¥¨¥é¡¼¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥¡¥¤¥ë¤òÌÀ¼¨Åª¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(\fI%p\fR¤Ï¸½ºß¤Î¥×¥í¥»¥¹¤Î¼±Ê̻Ҥòɽ¤·¤Þ¤¹)¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:HeapDumpPath=\&./java_pid%p\&.hprof +-.fi +-.if n \{\ +-.RE +-.\} +-¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤ò\fI/var/log/java/java_heapdump\&.hprof\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:LogFile=\fIpath\fR +-.RS 4 +-¥í¥°¡¦¥Ç¡¼¥¿¤¬½ñ¤­¹þ¤Þ¤ì¤ë¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fIhotspot\&.log\fR¤Ç¤¹¡£ +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò\fI/var/log/java/hotspot\&.log\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:LogFile=/var/log/java/hotspot\&.log +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+PrintClassHistogram +-.RS 4 +-\fI[Control]+[C]\fR¥¤¥Ù¥ó¥È(\fISIGTERM\fR)¸å¤Ë¥¯¥é¥¹¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤Î¥Ò¥¹¥È¥°¥é¥à¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ +-.sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢\fIjmap \-histo\fR¥³¥Þ¥ó¥É¡¢¤Þ¤¿¤Ï\fIjcmd \fR\fIpid\fR\fI GC\&.class_histogram\fR¥³¥Þ¥ó¥É(\fIpid\fR¤Ï¸½ºß¤ÎJava¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+PrintConcurrentLocks +-.RS 4 +-.sp +-\fI[Control]+[C]\fR¥¤¥Ù¥ó¥È(\fISIGTERM\fR)¸å¤Ë\fIjava\&.util\&.concurrent\fR¥í¥Ã¥¯¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ +-.sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢\fIjstack \-l\fR¥³¥Þ¥ó¥É¡¢¤Þ¤¿¤Ï\fIjcmd \fR\fIpid\fR\fI Thread\&.print \-l\fR¥³¥Þ¥ó¥É(\fIpid\fR¤Ï¸½ºß¤ÎJava¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+UnlockDiagnosticVMOptions +-.RS 4 +-JVM¤Î¿ÇÃǤòÌÜŪ¤È¤·¤¿¥ª¥×¥·¥ç¥ó¤ò¥¢¥ó¥í¥Ã¥¯¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¿ÇÃÇ¥ª¥×¥·¥ç¥ó¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ +-.RE +-.SS "¹âÅ٤ʥ¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥ª¥×¥·¥ç¥ó" +-.PP +-¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(GC)¤¬Java HotSpot VM¤Ë¤è¤Ã¤Æ¤É¤Î¤è¤¦¤Ë¼Â¹Ô¤µ¤ì¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹¡£ +-.PP +-\-XX:+AggressiveHeap +-.RS 4 +-Java¥Ò¡¼¥×¤ÎºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥³¥ó¥Ô¥å¡¼¥¿¤Î¹½À®(RAM¤ª¤è¤ÓCPU)¤Ë´ð¤Å¤¤¤Æ¡¢ÍÍ¡¹¤Ê¥Ñ¥é¥á¡¼¥¿¤¬¡¢¥á¥â¥ê¡¼³äÅö¤Æ¤¬½¸Ã椷¤¿Ä¹»þ´Ö¼Â¹Ô¥¸¥ç¥Ö¤ËºÇŬ¤Ë¤Ê¤ë¤è¤¦¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Ò¡¼¥×¤ÏºÇŬ²½¤µ¤ì¤Þ¤»¤ó¡£ ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-XX:AllocatePrefetchDistance=\fIsize\fR + .RS 4 + ¥ª¥Ö¥¸¥§¥¯¥È³äÅö¤Æ¤Î¥×¥ê¥Õ¥§¥Ã¥Áµ÷Î¥¤Î¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¿·µ¬¥ª¥Ö¥¸¥§¥¯¥È¤ÎÃͤǽñ¤­¹þ¤â¤¦¤È¤¹¤ë¥á¥â¥ê¡¼¤Ï¡¢ºÇ¸å¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¢¥É¥ì¥¹¤«¤é¡¢¤³¤Îµ÷Î¥¤Þ¤Ç¥×¥ê¥Õ¥§¥Ã¥Á¤µ¤ì¤Þ¤¹¡£³ÆJava¥¹¥ì¥Ã¥É¤Ë¤ÏÆȼ«¤Î³äÅö¤Æ¥Ý¥¤¥ó¥È¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +-Éé¤ÎÃͤϡ¢¥×¥ê¥Õ¥§¥Ã¥Áµ÷Î¥¤Ï¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤ë¤³¤È¤ò¼¨¤·¤Þ¤¹¡£Àµ¤ÎÃͤϡ¢¥×¥ê¥Õ¥§¥Ã¥Á¤¹¤ë¥Ð¥¤¥È¿ô¤Ç¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\-1¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++Éé¤ÎÃͤϡ¢¥×¥ê¥Õ¥§¥Ã¥Áµ÷Î¥¤Ï¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤ë¤³¤È¤ò¼¨¤·¤Þ¤¹¡£Àµ¤ÎÃͤϡ¢¥×¥ê¥Õ¥§¥Ã¥Á¤¹¤ë¥Ð¥¤¥È¿ô¤Ç¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\-1¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢¥×¥ê¥Õ¥§¥Ã¥Áµ÷Î¥¤ò1024¥Ð¥¤¥È¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -1718,11 +1239,30 @@ + .RS 4 + .\} + .nf +-\-XX:AllocatePrefetchDistance=1024 ++\fB\-XX:AllocatePrefetchDistance=1024\fR ++ + .fi + .if n \{\ + .RE + .\} ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:AllocatePrefetchInstr=\fIinstruction\fR ++.RS 4 ++³äÅö¤Æ¥Ý¥¤¥ó¥¿¤ÎÁ°¤Ë¥×¥ê¥Õ¥§¥Ã¥Á¤¹¤ë¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤òÀßÄꤷ¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£»ÈÍѲÄǽ¤ÊÃͤÏ0¤«¤é3¤Þ¤Ç¤Ç¤¹¡£ÃͤÎÇظå¤Ë¤¢¤ë¼ÂºÝ¤ÎÌ¿Îá¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤Ï0¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchInstr=0\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-XX:AllocatePrefetchLines=\fIlines\fR +@@ -1735,11 +1275,30 @@ + .RS 4 + .\} + .nf +-\-XX:AllocatePrefetchLines=5 ++\fB\-XX:AllocatePrefetchLines=5\fR ++ + .fi + .if n \{\ + .RE + .\} ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:AllocatePrefetchStepSize=\fIsize\fR ++.RS 4 ++½ç¼¡¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤Î¥¹¥Æ¥Ã¥×¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¥Æ¥Ã¥×¡¦¥µ¥¤¥º¤Ï16¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchStepSize=16\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-XX:AllocatePrefetchStyle=\fIstyle\fR +@@ -1765,16 +1324,565 @@ + .RS 4 + ³äÅö¤Æ¥×¥ê¥Õ¥§¥Ã¥ÁÍѤÎSPARC¤ÇBISÌ¿Îá¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE ++.sp ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+BackgroundCompilation ++.RS 4 ++¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-BackgroundCompilation\fR¤ò»ØÄꤷ¤Þ¤¹(¤³¤ì¤Ï\fB\-Xbatch\fR¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤Ç¤¹)¡£ ++.RE ++.PP ++\-XX:CICompilerCount=\fIthreads\fR ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ë¤Ë»ÈÍѤ¹¤ë¥³¥ó¥Ñ¥¤¥é¡¦¥¹¥ì¥Ã¥É¤Î¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¿ô¤Ï¡¢¥µ¡¼¥Ð¡¼JVM¤Î¾ì¹ç¤Ï2¡¢¥¯¥é¥¤¥¢¥ó¥ÈJVM¤Î¾ì¹ç¤Ï1¤ËÀßÄꤵ¤ì¤Æ¤ª¤ê¡¢ÁØ¥³¥ó¥Ñ¥¤¥ë¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥³¥¢¿ô¤Ë¹ç¤»¤ÆÁý¸º¤·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¤Î¿ô¤ò2¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CICompilerCount=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CodeCacheMinimumFreeSpace=\fIsize\fR ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ë¤ËɬÍפʺǾ®¶õ¤­Îΰè(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£ºÇ¾®¶õ¤­Îΰè¤è¤ê¾¯¤Ê¤¤Îΰ褷¤«»Ä¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥ë¤ÏÄä»ß¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï500KB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢ºÇ¾®¶õ¤­Îΰè¤ò1024MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CodeCacheMinimumFreeSpace=1024m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] ++.RS 4 ++¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é\fBString\fR¥¯¥é¥¹¤Î\fBindexOf()\fR¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥¹¥é¥Ã¥·¥å(\fB/\fR)¤Ç¶èÀÚ¤é¤ì¤¿¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¡¢´°Á´¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ÀÚ¼è¤ê¤ÈŽÉÕ¤±¤ÎÁàºî¤òÍưפˤ¹¤ë¤¿¤á¤Ë¡¢\fB\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥á¥½¥Ã¥É̾¤Î·Á¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++½ð̾¤Ê¤·¤Ç¥á¥½¥Ã¥É¤ò»ØÄꤹ¤ë¤È¡¢¥³¥Þ¥ó¥É¤Ï»ØÄꤷ¤¿Ì¾Á°¤ò»ý¤Ä¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ËŬÍѤµ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë·Á¼°¤Ç¥á¥½¥Ã¥É¤Î½ð̾¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢°ú¿ô¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¡¢°Ï¤Þ¤Ê¤¤¤È¡¢¥·¥§¥ë¤Ë¤è¤ê¥»¥ß¥³¥í¥ó¤¬¥³¥Þ¥ó¥É¤Î½ªÎ»¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é\fBString\fR¥¯¥é¥¹¤Î\fBindexOf(String)\fR¥á¥½¥Ã¥É¤Î¤ß½ü³°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude,java/lang/String\&.indexOf,(Ljava/lang/String;)I"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¤Þ¤¿¡¢¥¯¥é¥¹Ì¾¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤Ë¥ï¥¤¥ë¥É¥«¡¼¥É¤È¤·¤Æ¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ò»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î¤¹¤Ù¤Æ¤Î\fBindexOf()\fR¥á¥½¥Ã¥É¤ò½ü³°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,*\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥«¥ó¥Þ¤È¥Ô¥ê¥ª¥É¤Ï¶õÇò¤ÎÊÌ̾¤Ç¡¢¤³¤ì¤Ë¤è¤ê¡¢¥·¥§¥ë¤ò²ð¤·¤Æ¥³¥ó¥Ñ¥¤¥é¡¦¥³¥Þ¥ó¥É¤òÅϤ¹¤³¤È¤¬Íưפˤʤê¤Þ¤¹¡£°ú¿ô¤ò°úÍÑÉä¤Ç°Ï¤à¤³¤È¤Ç¡¢¶õÇò¤ò¥»¥Ñ¥ì¡¼¥¿¤È¤·¤Æ»ÈÍѤ·¤Æ\fB\-XX:CompileCommand\fR¤Ë°ú¿ô¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude java/lang/String indexOf"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥Þ¥ó¥É¹Ô¤ÇÅϤµ¤ì¤¿¥³¥Þ¥ó¥É¤ò²òÀϤ·¤¿¸å¤Ë¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï\fB\&.hotspot_compiler\fR¥Õ¥¡¥¤¥ë¤«¤é¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¥³¥Þ¥ó¥É¤òÄɲ乤뤫¡¢¤Þ¤¿¤Ï\fB\-XX:CompileCommandFile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ̤Υե¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.sp ++Ê£¿ô¤Î¥³¥Þ¥ó¥É¤òÄɲ乤ë¤Ë¤Ï¡¢\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄꤹ¤ë¤«¡¢¤Þ¤¿¤Ï²þ¹Ô¥»¥Ñ¥ì¡¼¥¿(\fB\en\fR)¤ò»ÈÍѤ·¤Æ³Æ°ú¿ô¤ò¶èÀÚ¤ê¤Þ¤¹¡£¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++.PP ++break ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤ÎºÇ½é¤ËÄä»ß¤¹¤ë¤¿¤á¤Ë¡¢JVM¤Î¥Ç¥Ð¥Ã¥°»þ¤Î¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ ++.RE ++.PP ++compileonly ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò½ü¤¤¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ò¡¢¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤·¤Þ¤¹¡£Ê̤ÎÊýË¡¤È¤·¤Æ¡¢\fB\-XX:CompileOnly\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ£¿ô¤Î¥á¥½¥Ã¥É¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++dontinline ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥¤¥ó¥é¥¤¥ó²½¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£ ++.RE ++.PP ++exclude ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤·¤Þ¤¹¡£ ++.RE ++.PP ++help ++.RS 4 ++\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò°õºþ¤·¤Þ¤¹¡£ ++.RE ++.PP ++inline ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥¤¥ó¥é¥¤¥ó²½¤·¤è¤¦¤È¤·¤Þ¤¹¡£ ++.RE ++.PP ++log ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ËÂФ·¤Æ¡¢(\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ)¥³¥ó¥Ñ¥¤¥ë¡¦¥í¥®¥ó¥°¤ò½ü³°¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤Ë¥í¥®¥ó¥°¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ ++.RE ++.PP ++option ++.RS 4 ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢ºÇ¸å¤Î°ú¿ô(\fIoption\fR)¤Î¤«¤ï¤ê¤Ë¡¢»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ËJIT¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤òÅϤ¹¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢¥á¥½¥Ã¥É̾¤Î¸å¤ÎËöÈø¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBStringBuffer\fR¥¯¥é¥¹¤Î\fBappend()\fR¥á¥½¥Ã¥É¤ËÂФ·¤Æ\fBBlockLayoutByFrequency\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥«¥ó¥Þ¤Þ¤¿¤Ï¶õÇò¤Ç¶èÀڤäơ¢Ê£¿ô¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++print ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¸å¤ËÀ¸À®¤µ¤ì¤¿¥¢¥»¥ó¥Ö¥é¡¦¥³¡¼¥É¤ò½ÐÎϤ·¤Þ¤¹¡£ ++.RE ++.PP ++quiet ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ë¡¦¥³¥Þ¥ó¥É¤ò½ÐÎϤ·¤Þ¤»¤ó¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄꤷ¤¿¥³¥Þ¥ó¥É¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBString\fR¥¯¥é¥¹¤Î\fBindexOf()\fR¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤¹¤ë¾ì¹ç¡¢¼¡¤¬É¸½à½ÐÎϤ˽ÐÎϤµ¤ì¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompilerOracle: exclude java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¾¤Î\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ÎÁ°¤Ë\fB\-XX:CompileCommand=quiet\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¤³¤ì¤òÍÞÀ©¤Ç¤­¤Þ¤¹¡£ ++.RE ++.RE ++.PP ++\-XX:CompileCommandFile=\fIfilename\fR ++.RS 4 ++JIT¥³¥ó¥Ñ¥¤¥é¡¦¥³¥Þ¥ó¥É¤ÎÆɼè¤ê¸µ¤Î¥Õ¥¡¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼Â¹Ô¤µ¤ì¤ë¥³¥Þ¥ó¥É¤ò³ÊǼ¤¹¤ë¤¿¤á¤Ë¡¢\fB\&.hotspot_compiler\fR¥Õ¥¡¥¤¥ë¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++.sp ++¥³¥Þ¥ó¥É¡¦¥Õ¥¡¥¤¥ë¤Î³Æ¹Ô¤Ï¡¢¥³¥Þ¥ó¥É¤¬»ÈÍѤµ¤ì¤ë¥³¥Þ¥ó¥É¡¢¥¯¥é¥¹Ì¾¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤òɽ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¹Ô¤Ï¡¢\fBString\fR¥¯¥é¥¹¤Î\fBtoString()\fR¥á¥½¥Ã¥É¤ËÂФ·¤Æ¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤ò½ÐÎϤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBprint java/lang/String toString\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤¹¤ëJIT¥³¥ó¥Ñ¥¤¥é¤Î¥³¥Þ¥ó¥É¤Î»ØÄê¤Î¾ÜºÙ¤Ï¡¢\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.RE ++.PP ++\-XX:CompileOnly=\fImethods\fR ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ë¤òÀ©¸Â¤¹¤ë(¥«¥ó¥Þ¤Ç¶èÀÚ¤é¤ì¤¿)¥á¥½¥Ã¥É¤Î¥ê¥¹¥È¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¤ß¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£´°Á´¥¯¥é¥¹Ì¾(¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à)¤Ç³Æ¥á¥½¥Ã¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBString\fR¥¯¥é¥¹¤Î\fBlength()\fR¥á¥½¥Ã¥É¤ª¤è¤Ó\fBList\fR¥¯¥é¥¹¤Î\fBsize()\fR¥á¥½¥Ã¥É¤Î¤ß¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥¹¥é¥Ã¥·¥å(\fB/\fR)¤Ç¶èÀÚ¤é¤ì¤¿¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¡¢´°Á´¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ÀÚ¼è¤ê¤ÈŽÉÕ¤±¤ÎÁàºî¤òÍưפˤ¹¤ë¤¿¤á¤Ë¡¢\fB\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥á¥½¥Ã¥É̾¤Î·Á¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥ï¥¤¥ë¥É¥«¡¼¥É¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¤¬¡¢¥¯¥é¥¹Ì¾¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸Ì¾¤À¤±¤ò»ØÄꤷ¤Æ¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¡¢¥á¥½¥Ã¥É¤À¤±¤ò»ØÄꤷ¤ÆǤ°Õ¤Î¥¯¥é¥¹¤Î¤³¤Î̾Á°¤ò»ý¤Ä¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\fR ++\fB\-XX:CompileOnly=java/lang\fR ++\fB\-XX:CompileOnly=\&.length\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileThreshold=\fIinvocations\fR ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ëÁ°¤Ë²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¡¼¥Ð¡¼JVM¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï¡¢10,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¤Æ¡¢¸úΨŪ¤Ê¥³¥ó¥Ñ¥¤¥ë¤Î¤¿¤á¤Î¾ðÊó¤ò¼ý½¸¤·¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥ÈJVM¤Î¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÀßÄê¤Ï1,500¸Æ½Ð¤·¤Ç¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤ò5,000¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileThreshold=5000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fB\-Xcomp\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¤ÎÁ°¤Ë¡¢Java¥á¥½¥Ã¥É¤Î²ò¼á¤ò´°Á´¤Ë̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+DoEscapeAnalysis ++.RS 4 ++¥¨¥¹¥±¡¼¥×ʬÀϤλÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥¨¥¹¥±¡¼¥×ʬÀϤλÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-DoEscapeAnalysis\fR¤ò»ØÄꤷ¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:InitialCodeCacheSize=\fIsize\fR ++.RS 4 ++½é´ü¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ500KB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢½é´ü¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤ò32KB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialCodeCacheSize=32k\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+Inline ++.RS 4 ++¥á¥½¥Ã¥É¤Î¥¤¥ó¥é¥¤¥ó²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¤¿¤á¤Ë¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥á¥½¥Ã¥É¤Î¥¤¥ó¥é¥¤¥ó²½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-Inline\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:InlineSmallCode=\fIsize\fR ++.RS 4 ++¥¤¥ó¥é¥¤¥ó²½¤¬É¬Íפʥ³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤ÎºÇÂ祳¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£»ØÄꤷ¤¿¥µ¥¤¥º¤è¤ê¾®¤µ¤¤¥µ¥¤¥º¤Î¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¤ß¤¬¡¢¥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇÂ祳¡¼¥É¡¦¥µ¥¤¥º¤Ï1000¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InlineSmallCode=1000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+LogCompilation ++.RS 4 ++¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë\fBhotspot\&.log\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤Î¥í¥®¥ó¥°¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fB\-XX:LogFile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢°Û¤Ê¤ë¥í¥°¡¦¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¤È̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤Ïµ­Ï¿¤µ¤ì¤Þ¤»¤ó¡£\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fB\-XX:UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.sp ++\fB\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤Ó¤Ë¡¢¥³¥ó¥½¡¼¥ë¤Ë½ÐÎϤµ¤ì¤¿¥á¥Ã¥»¡¼¥¸¤ò´Þ¤à¾ÜºÙ¤Ê¿ÇÃǽÐÎϤòÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:MaxInlineSize=\fIsize\fR ++.RS 4 ++¥¤¥ó¥é¥¤¥ó²½¤¹¤ë¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º¤Ï35¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxInlineSize=35\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxNodeLimit=\fInodes\fR ++.RS 4 ++ñ°ì¤Î¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë»þ¤Ë»ÈÍѤµ¤ì¤ë¥Î¡¼¥É¤ÎºÇÂç¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Î¡¼¥É¤ÎºÇÂç¿ô¤Ï65,000¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxNodeLimit=65000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxTrivialSize=\fIsize\fR ++.RS 4 ++¥¤¥ó¥é¥¤¥ó²½¤¹¤ëñ½ã¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ã±½ã¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º¤Ï6¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxTrivialSize=6\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+OptimizeStringConcat ++.RS 4 ++\fBString\fRÏ¢·ëÁàºî¤ÎºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fBString\fRÏ¢·ëÁàºî¤ÎºÇŬ²½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-OptimizeStringConcat\fR¤ò»ØÄꤷ¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+PrintAssembly ++.RS 4 ++³°Éô¤Î\fBdisassembler\&.so\fR¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ·¤Æ¡¢¥Ð¥¤¥È¥³¡¼¥É²½¤µ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¤Î¥á¥½¥Ã¥É¤Î¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢À¸À®¤µ¤ì¤¿¥³¡¼¥É¤òɽ¼¨¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ÎÌäÂê¤Î¿ÇÃǤËÌòΩ¤Á¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£\fB\-XX:+PrintAssembly\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fB\-XX:UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+PrintCompilation ++.RS 4 ++¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤Ó¤Ë¡¢¥³¥ó¥½¡¼¥ë¤Ë¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢JVM¤«¤é¤Î¾ÜºÙ¤Ê¿ÇÃǽÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¼ÂºÝ¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¥á¥½¥Ã¥É¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¿ÇÃǽÐÎϤϰõºþ¤µ¤ì¤Þ¤»¤ó¡£ ++.sp ++\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤ò¥Õ¥¡¥¤¥ë¤Ëµ­Ï¿¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+PrintInlining ++.RS 4 ++¥¤¥ó¥é¥¤¥ó²½¤Î·èÄêÆâÍƤνÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤ë¥á¥½¥Ã¥É¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥¤¥ó¥é¥¤¥ó²½¾ðÊó¤Ï½ÐÎϤµ¤ì¤Þ¤»¤ó¡£\fB\-XX:+PrintInlining\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fB\-XX:+UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:ReservedCodeCacheSize=\fIsize\fR ++.RS 4 ++JIT¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤ÎºÇÂ祳¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xmaxjitcodesize\fR¤ÈƱÅù¤Ç¤¹¡£ ++.RE ++.PP ++\-XX:+TieredCompilation ++.RS 4 ++ÁØ¥³¥ó¥Ñ¥¤¥ë¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseAES ++.RS 4 ++Intel¡¢AMD¤ª¤è¤ÓSPARC¥Ï¡¼¥É¥¦¥§¥¢¤ËÂФ·¤Æ¡¢¥Ï¡¼¥É¥¦¥§¥¢¥Ù¡¼¥¹¤ÎAESÁȹþ¤ß¤òÍ­¸ú²½¤·¤Þ¤¹¡£Intel Westmere (2010°Ê¹ß)¡¢AMD Bulldozer (2011°Ê¹ß)¤ª¤è¤ÓSPARC (T4°Ê¹ß)¤¬¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ï¡¼¥É¥¦¥§¥¢¤Ç¤¹¡£UseAES¤Ï¡¢UseAESIntrinsics¤È¤È¤â¤Ë»ÈÍѤ·¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseAESIntrinsics ++.RS 4 ++UseAES¤ÈUseAESIntrinsics¥Õ¥é¥°¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú²½¤µ¤ì¤Æ¤ª¤ê¡¢Java HotSpot Server VM 32¥Ó¥Ã¥È¤ª¤è¤Ó64¥Ó¥Ã¥È¤ËÂФ·¤Æ¤Î¤ß¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ï¡¼¥É¥¦¥§¥¢¥Ù¡¼¥¹¤ÎAESÁȹþ¤ß¤ò̵¸ú²½¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseAES \-XX:\-UseAESIntrinsics\fR¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢AES¤òÍ­¸ú²½¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥Õ¥é¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:+UseAES \-XX:+UseAESIntrinsics\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++32¥Ó¥Ã¥È¤ª¤è¤Ó64¥Ó¥Ã¥È¤ËÂФ·¤ÆUseAES¤ª¤è¤ÓUseAESIntrinsics¥Õ¥é¥°¤ò¥µ¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢\fB\-server\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆJava HotSpot Server VM¤òÁªÂò¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥é¥°¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥ÈVM¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:+UseCodeCacheFlushing ++.RS 4 ++¥³¥ó¥Ñ¥¤¥é¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ëÁ°¤Ë¡¢¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¤Î¥Õ¥é¥Ã¥·¥å¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥é¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ëÁ°¤Ë¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¤Î¥Õ¥é¥Ã¥·¥å¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï\fB\-XX:\-UseCodeCacheFlushing\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseCondCardMark ++.RS 4 ++¥«¡¼¥Éɽ¤Î¹¹¿·Á°¤Ë¡¢¥«¡¼¥É¤¬¤¹¤Ç¤Ë¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Î¥Á¥§¥Ã¥¯¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢Ê£¿ô¤Î¥½¥±¥Ã¥È¤ò»ý¤Ä¥Þ¥·¥ó¾å¤Ç¤Î¤ß»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢Æ±»þÁàºî¤Ë¤«¤Ê¤ê°Í¸¤·¤Æ¤¤¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤·¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseSuperWord ++.RS 4 ++¥¹¥«¥é¡¼±é»»¤Î¥¹¡¼¥Ñ¡¼¥ï¡¼¥É±é»»¤Ø¤ÎÊÑ´¹¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥¹¥«¥é¡¼±é»»¤Î¥¹¡¼¥Ñ¡¼¥ï¡¼¥É±é»»¤Ø¤ÎÊÑ´¹¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseSuperWord\fR¤ò»ØÄꤷ¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.SS "»î¸³Åª¤ÊJIT¥³¥ó¥Ñ¥¤¥é¡¦¥ª¥×¥·¥ç¥ó" ++.PP ++¤³¤Î¹à¤ÎRestricted Transactional Memory (RTM)¤Î¥í¥Ã¥¯µ¡Ç½¤Ë´ØÏ¢¤¹¤ë¥ª¥×¥·¥ç¥ó¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢Java SE 8u20¤ÇÀµ¼°¤Ë¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤ì¤é¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fB\-XX:+UnlockExperimentalVMOptions\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Transactional Synchronization Extensions (TSX)¤ò¥µ¥Ý¡¼¥È¤¹¤ëx86 CPU¾å¤ÎJava HotSpot Server VM¤ËÂФ·¤Æ¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ ++.PP ++\-XX:RTMAbortRatio=\fIabort_ratio\fR ++.RS 4 ++RTMÃæ»ßΨ¤Ï¡¢¤¹¤Ù¤Æ¤Î¼Â¹ÔºÑRTM¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸(%)¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹¡£Ãæ»ß¤µ¤ì¤¿¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¿ô¤¬¤³¤ÎΨ¤òĶ¤¨¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤¬ÈóºÇŬ²½¤µ¤ì¤Þ¤¹¡£¤³¤ÎΨ¤Ï¡¢\fB\-XX:+UseRTMDeopt\fR¥ª¥×¥·¥ç¥ó¤¬Í­¸ú¤Ê¾ì¹ç¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏ50¤Ç¤¹¡£¤Ä¤Þ¤ê¡¢¤¹¤Ù¤Æ¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Î50%¤¬Ãæ»ß¤µ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤¬ÈóºÇŬ²½¤µ¤ì¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:RTMRetryCount=\fInumber_of_retries\fR ++.RS 4 ++Ãæ»ß¤Þ¤¿¤Ï¥Ó¥¸¡¼¤Î¾ì¹ç¡¢RTM¥í¥Ã¥¯¡¦¥³¡¼¥É¤Ï¡¢É¸½à¤Î¥í¥Ã¥¯¡¦¥á¥«¥Ë¥º¥à¤Ë¥Õ¥©¡¼¥ë¥Ð¥Ã¥¯¤¹¤ëÁ°¤Ë¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿²ó¿ôºÆ»î¹Ô¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏ5¤Ç¤¹¡£\fB\-XX:UseRTMLocking\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseRTMDeopt ++.RS 4 ++Ãæ»ßΨ¤Ë±þ¤¸¤Æ¡¢RTM¥í¥Ã¥¯¤ò¼«Æ°Ä´À°¤·¤Þ¤¹¡£¤³¤ÎΨ¤Ï¡¢\fB\-XX:RTMAbortRatio\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤Þ¤¹¡£Ãæ»ß¤µ¤ì¤¿¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¿ô¤¬Ãæ»ßΨ¤òĶ¤¨¤¿¾ì¹ç¡¢¥í¥Ã¥¯¤ò´Þ¤à¥á¥½¥Ã¥É¤¬¤¹¤Ù¤Æ¤Î¥í¥Ã¥¯¤Çɸ½à¤Î¥í¥Ã¥¯¤È¤·¤ÆÈóºÇŬ²½¤ª¤è¤ÓºÆ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fB\-XX:UseRTMLocking\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseRTMLocking ++.RS 4 ++¥Õ¥©¡¼¥ë¥Ð¥Ã¥¯¡¦¥Ï¥ó¥É¥é¤È¤·¤Æɸ½à¤Î¥í¥Ã¥¯¡¦¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Æ¡¢Å¸³«¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥í¥Ã¥¯¤ËÂФ·¤ÆRestricted Transactional Memory (RTM)¥í¥Ã¥¯¡¦¥³¡¼¥É¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ++.sp ++RTM¤Ï¡¢x86Ì¿Î᥻¥Ã¥È³ÈÄ¥¤Ç¥Þ¥ë¥Á¥¹¥ì¥Ã¥É¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎºîÀ®¤òÍưפˤ¹¤ëIntel¤ÎTransactional Synchronization Extensions (TSX)¤Î°ìÉô¤Ç¤¹¡£RTM¤Ç¤Ï¡¢¿·¤·¤¤Ì¿Îá ++\fBXBEGIN\fR¡¢\fBXABORT\fR¡¢\fBXEND\fR¤ª¤è¤Ó\fBXTEST\fR¤¬Æ³Æþ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fBXBEGIN\fR¤ª¤è¤Ó\fBXEND\fRÌ¿Îá¤Ï¡¢¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤È¤·¤Æ¼Â¹Ô¤¹¤ë¤¿¤á¤ÎÌ¿Î᥻¥Ã¥È¤ò°Ï¤ß¤Þ¤¹¡£¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Î¼Â¹Ô»þ¤Ë¶¥¹ç¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥á¥â¥ê¡¼¤È¥ì¥¸¥¹¥¿¤ÎÊѹ¹¤¬¡¢\fBXEND\fRÌ¿Îá¤ÇƱ»þ¤Ë¥³¥ß¥Ã¥È¤µ¤ì¤Þ¤¹¡£\fBXABORT\fRÌ¿Îá¤Ç¤Ï¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤òÌÀ¼¨Åª¤ËÃæ»ß¤Ç¤­¡¢\fBXEND\fRÌ¿Îá¤Ç¤ÏÌ¿Î᥻¥Ã¥È¤¬¥È¥é¥ó¥¶¥¯¥·¥ç¥óÆâ¤Ç¼Â¹ÔÃ椫¤É¤¦¤«¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£ ++.sp ++¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Î¥í¥Ã¥¯¤Ï¡¢Ê̤Υ¹¥ì¥Ã¥É¤¬Æ±¤¸¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Ë¥¢¥¯¥»¥¹¤·¤è¤¦¤È¤·¤¿¤È¤­¤ËŸ³«¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¤½¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Ø¤Î¥¢¥¯¥»¥¹¤òºÇ½é¤Ë¥ê¥¯¥¨¥¹¥È¤·¤Ê¤«¤Ã¤¿¥¹¥ì¥Ã¥É¤Ï¥Ö¥í¥Ã¥¯¤µ¤ì¤Þ¤¹¡£RTM¤Ç¤Ï¡¢¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤¬Ãæ»ß¤Þ¤¿¤Ï¼ºÇÔ¤·¤¿¾ì¹ç¤Î¤¿¤á¤Ë¡¢¥Õ¥©¡¼¥ë¥Ð¥Ã¥¯¤ÎÁàºî¥»¥Ã¥È¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£RTM¥í¥Ã¥¯¤È¤Ï¡¢TSX¤Î¥·¥¹¥Æ¥à¤Ë°Ñ¾ù¤µ¤ì¤Æ¤¤¤ë¥í¥Ã¥¯¤Ç¤¹¡£ ++.sp ++RTM¤Ë¤è¤ê¡¢½ÅÍפʥ꡼¥¸¥ç¥ó¤Ë¤ª¤¤¤Æ¾×Æͤ¬¾¯¤Ê¤¯¶¥¹çÅ٤ι⤤¥í¥Ã¥¯¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤µ¤ì¤Þ¤¹(¤³¤ì¤Ï¡¢Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤Ë¤è¤Ã¤ÆƱ»þ¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¥³¡¼¥É¤Ç¤¹)¡£¤Þ¤¿¡¢RTM¤Ë¤è¤ê¡¢ÁÆγÅÙ¥í¥Ã¥¯¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤â¸þ¾å¤µ¤ì¤Þ¤¹¤¬¡¢°ìÈÌŪ¤Ë¥Þ¥ë¥Á¥¹¥ì¥Ã¥É¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ï¤è¤¯¤¢¤ê¤Þ¤»¤ó¡£(ÁÆγÅÙ¥í¥Ã¥¯¤È¤Ï¡¢¥í¥Ã¥¯¤Î¼èÆÀ¤ª¤è¤Ó²òÊü¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤òºÇ¾®²½¤¹¤ë¤¿¤á¤ËŤ¤´ü´Ö¥í¥Ã¥¯¤òÊÝ»ý¤¹¤ëÀïά¤Ç¤¢¤ê¡¢°ìÊý¡¢ºÙγÅÙ¥í¥Ã¥¯¤È¤ÏɬÍפʾì¹ç¤Î¤ß¥í¥Ã¥¯¤·²Äǽ¤Ê¤«¤®¤êÁá´ü¤Ë¥í¥Ã¥¯²ò½ü¤¹¤ë¤³¤È¤ÇºÇÂç¸Â¤ÎʹԽèÍý¤ÎãÀ®¤ò»î¤ß¤ëÀïά¤Ç¤¹¡£)¤µ¤é¤Ë¡¢°Û¤Ê¤ë¥¹¥ì¥Ã¥É¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤Æ¤¤¤ë·ÚÅ٤ʶ¥¹ç¥í¥Ã¥¯¤Î¾ì¹ç¡¢RTM¤Ë¤è¤ê¡¢¸í¤Ã¤¿¥­¥ã¥Ã¥·¥å¡¦¥é¥¤¥ó¶¦Í­(¥­¥ã¥Ã¥·¥å¡¦¥é¥¤¥ó¡¦¥Ô¥ó¥Ý¥ó¤È¤â¸Æ¤Ð¤ì¤ë)¤òºï¸º¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢°Û¤Ê¤ë¥×¥í¥»¥Ã¥µ¤«¤é¤ÎÊ£¿ô¤Î¥¹¥ì¥Ã¥É¤¬°Û¤Ê¤ë¥ê¥½¡¼¥¹¤Ë¥¢¥¯¥»¥¹¤·¤Æ¤¤¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¤¬¡¢¥ê¥½¡¼¥¹¤ÏƱ¤¸¥­¥ã¥Ã¥·¥å¡¦¥é¥¤¥ó¤ò¶¦Í­¤·¤Þ¤¹¡£·ë²Ì¤È¤·¤Æ¡¢¥×¥í¥»¥Ã¥µ¤Ï¾¤Î¥×¥í¥»¥Ã¥µ¤Î¥­¥ã¥Ã¥·¥å¡¦¥é¥¤¥ó¤ò·«¤êÊÖ¤·Ìµ¸ú¤Ë¤·¡¢¤³¤ì¤Ë¤è¤ê¡¢¥­¥ã¥Ã¥·¥å¤Ç¤Ï¤Ê¤¯¥á¥¤¥ó¡¦¥á¥â¥ê¡¼¤«¤é¤ÎÆɼè¤ê¤¬¶¯À©¤µ¤ì¤Þ¤¹¡£ ++.RE ++.SS "¹âÅ٤ʥµ¡¼¥Ó¥¹¥¢¥Ó¥ê¥Æ¥£¡¦¥ª¥×¥·¥ç¥ó" ++.PP ++¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥·¥¹¥Æ¥à¾ðÊó¤ò¼ý½¸¤·¡¢¾ÜºÙ¤Ê¥Ç¥Ð¥Ã¥°¤ò¼Â¹Ô¤¹¤ëµ¡Ç½¤òÄ󶡤·¤Þ¤¹¡£ ++.PP ++\-XX:+ExtendedDTraceProbes ++.RS 4 ++¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ë±Æ¶Á¤òÍ¿¤¨¤ëÄɲäÎ\fBdtrace\fR¥Ä¡¼¥ë¡¦¥×¥í¡¼¥Ö¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fBdtrace\fR¤Ïɸ½à¥×¥í¡¼¥Ö¤Î¤ß¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+HeapDumpOnOutOfMemory ++.RS 4 ++\fBjava\&.lang\&.OutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ë¡¢¥Ò¡¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥é(HPROF)¤ò»ÈÍѤ·¤Æ¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¥Õ¥¡¥¤¥ë¤Ø¤ÎJava¥Ò¡¼¥×¤Î¥À¥ó¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fB\-XX:HeapDumpPath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤ª¤è¤Ó̾Á°¤òÌÀ¼¨Åª¤ËÀßÄê¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢\fBOutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ë¥Ò¡¼¥×¤Ï¥À¥ó¥×¤µ¤ì¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:HeapDumpPath=\fIpath\fR ++.RS 4 ++\fB\-XX:+HeapDumpOnOutOfMemoryError\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Ò¡¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥é(HPROF)¤¬Ä󶡤¹¤ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò½ñ¤­¹þ¤à¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fBjava_pid\fR\fIpid\fR\fB\&.hprof\fR ++(\fIpid\fR¤Ï¥¨¥é¡¼¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥¡¥¤¥ë¤òÌÀ¼¨Åª¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(\fB%p\fR¤Ï¸½ºß¤Î¥×¥í¥»¥¹¤Î¼±Ê̻Ҥòɽ¤·¤Þ¤¹)¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=\&./java_pid%p\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤ò\fB/var/log/java/java_heapdump\&.hprof\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:LogFile=\fIpath\fR ++.RS 4 ++¥í¥°¡¦¥Ç¡¼¥¿¤¬½ñ¤­¹þ¤Þ¤ì¤ë¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fBhotspot\&.log\fR¤Ç¤¹¡£ ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò\fB/var/log/java/hotspot\&.log\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:LogFile=/var/log/java/hotspot\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+PrintClassHistogram ++.RS 4 ++\fB[Control]+[C]\fR¥¤¥Ù¥ó¥È(\fBSIGTERM\fR)¸å¤Ë¥¯¥é¥¹¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤Î¥Ò¥¹¥È¥°¥é¥à¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ ++.sp ++¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢\fBjmap \-histo\fR¥³¥Þ¥ó¥É¡¢¤Þ¤¿¤Ï\fBjcmd \fR\fIpid\fR\fB GC\&.class_histogram\fR¥³¥Þ¥ó¥É(\fIpid\fR¤Ï¸½ºß¤ÎJava¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+PrintConcurrentLocks ++.RS 4 ++¼¡¤Î°õºþ¤òÍ­¸ú²½¤·¤Þ¤¹: j ¥í¥Ã¥¯(¼¡¤Î¸å) \- ¥¤¥Ù¥ó¥È¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ ++.sp ++\fB[Control]+[C]\fR¥¤¥Ù¥ó¥È(\fBSIGTERM\fR)¸å¤Ë\fBjava\&.util\&.concurrent\fR¥í¥Ã¥¯¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ ++.sp ++¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢\fBjstack \-l\fR¥³¥Þ¥ó¥É¡¢¤Þ¤¿¤Ï\fBjcmd \fR\fIpid\fR\fB Thread\&.print \-l\fR¥³¥Þ¥ó¥É(\fIpid\fR¤Ï¸½ºß¤ÎJava¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UnlockDiagnosticVMOptions ++.RS 4 ++JVM¤Î¿ÇÃǤòÌÜŪ¤È¤·¤¿¥ª¥×¥·¥ç¥ó¤ò¥¢¥ó¥í¥Ã¥¯¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¿ÇÃÇ¥ª¥×¥·¥ç¥ó¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++.RE ++.SS "¹âÅ٤ʥ¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥ª¥×¥·¥ç¥ó" ++.PP ++¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(GC)¤¬Java HotSpot VM¤Ë¤è¤Ã¤Æ¤É¤Î¤è¤¦¤Ë¼Â¹Ô¤µ¤ì¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹¡£ ++.PP ++\-XX:+AggressiveHeap ++.RS 4 ++Java¥Ò¡¼¥×¤ÎºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥³¥ó¥Ô¥å¡¼¥¿¤Î¹½À®(RAM¤ª¤è¤ÓCPU)¤Ë´ð¤Å¤¤¤Æ¡¢ÍÍ¡¹¤Ê¥Ñ¥é¥á¡¼¥¿¤¬¡¢¥á¥â¥ê¡¼³äÅö¤Æ¤¬½¸Ã椷¤¿Ä¹»þ´Ö¼Â¹Ô¥¸¥ç¥Ö¤ËºÇŬ¤Ë¤Ê¤ë¤è¤¦¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Ò¡¼¥×¤ÏºÇŬ²½¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .PP + \-XX:+AlwaysPreTouch + .RS 4 +-JVM¤Î½é´ü²½Ãæ¤ËJava¥Ò¡¼¥×¾å¤Î¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤Î¥¿¥Ã¥Á¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fImain()\fR¥á¥½¥Ã¥É¤ÎÆþÎÏÁ°¤Ë¡¢¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤¬¥á¥â¥ê¡¼¤Ë¼èÆÀ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ÊªÍý¥á¥â¥ê¡¼¤Ë¥Þ¥Ã¥×¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î²¾ÁÛ¥á¥â¥ê¡¼¤ò´Þ¤àĹ»þ´Ö¼Â¹Ô¤Î¥·¥¹¥Æ¥à¤ò¥·¥ß¥å¥ì¡¼¥È¤¹¤ë¥Æ¥¹¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢JVM¥Ò¡¼¥×Îΰ褬¤¤¤Ã¤Ñ¤¤¤Ë¤Ê¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤¬¥³¥ß¥Ã¥È¤µ¤ì¤Þ¤¹¡£ ++JVM¤Î½é´ü²½Ãæ¤ËJava¥Ò¡¼¥×¾å¤Î¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤Î¥¿¥Ã¥Á¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fBmain()\fR¥á¥½¥Ã¥É¤ÎÆþÎÏÁ°¤Ë¡¢¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤¬¥á¥â¥ê¡¼¤Ë¼èÆÀ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ÊªÍý¥á¥â¥ê¡¼¤Ë¥Þ¥Ã¥×¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î²¾ÁÛ¥á¥â¥ê¡¼¤ò´Þ¤àĹ»þ´Ö¼Â¹Ô¤Î¥·¥¹¥Æ¥à¤ò¥·¥ß¥å¥ì¡¼¥È¤¹¤ë¥Æ¥¹¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢JVM¥Ò¡¼¥×Îΰ褬¤¤¤Ã¤Ñ¤¤¤Ë¤Ê¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤¬¥³¥ß¥Ã¥È¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-XX:+CMSClassUnloadingEnabled + .RS 4 +-ʹԥޡ¼¥¯¥¹¥¤¡¼¥×(CMS)¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ë¡¢¥¢¥ó¥í¡¼¥É¤¹¤ë¥¯¥é¥¹¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£CMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î¥¯¥é¥¹¡¦¥¢¥ó¥í¡¼¥É¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-CMSClassUnloadingEnabled\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++ʹԥޡ¼¥¯¥¹¥¤¡¼¥×(CMS)¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ë¡¢¥¢¥ó¥í¡¼¥É¤¹¤ë¥¯¥é¥¹¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£CMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î¥¯¥é¥¹¡¦¥¢¥ó¥í¡¼¥É¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-CMSClassUnloadingEnabled\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-XX:CMSExpAvgFactor=\fIpercent\fR +@@ -1785,79 +1893,8 @@ + .RS 4 + .\} + .nf +-\-XX:CMSExpAvgFactor=15 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CMSIncrementalDutyCycle=\fIpercent\fR +-.RS 4 +-ʹԥ³¥ì¥¯¥¿¤Î¼Â¹Ô¤¬µö²Ä¤µ¤ì¤Æ¤¤¤ë¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Î»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fI\-XX:+CMSIncrementalPacing\fR¤¬Í­¸ú¤Ê¾ì¹ç¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤¬¼«Æ°Åª¤ËÀßÄꤵ¤ì¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï½é´üÃͤΤߤòÀßÄꤷ¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Ï10%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò20%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CMSIncrementalDutyCycle=20 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CMSIncrementalDutyCycleMin=\fIpercent\fR +-.RS 4 +-\fI\-XX:+CMSIncrementalPacing\fR¤¬Í­¸ú¤Ê¾ì¹ç¤Ë¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î²¼¸Â¤Ç¤¢¤ë¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Î»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î²¼¸Â¤Ï0%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢²¼¸Â¤ò10%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CMSIncrementalDutyCycleMin=10 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+CMSIncrementalMode +-.RS 4 +-CMS¥³¥ì¥¯¥¿¤ÎÁýʬ¥â¡¼¥É¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢2¤Ä°Ê²¼¤ÎGC¥¹¥ì¥Ã¥É¤ò»ý¤Ä¹½À®¤Ë¤Î¤ßÍ­¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fICMSIncremental\fR¤Ç»Ï¤Þ¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤¬Í­¸ú¤Ê¾ì¹ç¤Î¤ß¡¢Å¬ÍѤµ¤ì¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:CMSIncrementalOffset=\fIpercent\fR +-.RS 4 +-Áýʬ¥â¡¼¥É¤Î¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Ç´ü´ÖÆâ¤Ë±¦¤Ë°ÜÆ°¤¹¤ë»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥ª¥Õ¥»¥Ã¥È¤Ï0%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î¥ª¥Õ¥»¥Ã¥È¤ò25%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CMSIncrementalOffset=25 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+CMSIncrementalPacing +-.RS 4 +-JVM¤Î¼Â¹ÔÃæ¤Ë¼ý½¸¤µ¤ì¤¿Åý·×¤Ë´ð¤Å¤¤¤Æ¡¢Áýʬ¥â¡¼¥É¤Î¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î¼«Æ°Ä´À°¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Áýʬ¥â¡¼¥É¡¦¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î¼«Æ°Ä´À°¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-CMSIncrementalPacing\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:CMSIncrementalSafetyFactor=\fIpercent\fR +-.RS 4 +-¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò·×»»¤¹¤ëºÝ¤Ë¡¢Êݼé¤òÄɲ乤뤿¤á¤Ë»ÈÍѤµ¤ì¤ë»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢°ÂÁ´·¸¿ô¤Ï10%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢°ÂÁ´·¸¿ô¤ò5%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CMSIncrementalSafetyFactor=5 ++\fB\-XX:CMSExpAvgFactor=15\fR ++ + .fi + .if n \{\ + .RE +@@ -1866,7 +1903,7 @@ + .PP + \-XX:CMSInitiatingOccupancyFraction=\fIpercent\fR + .RS 4 +-CMS¼ý½¸¥µ¥¤¥¯¥ë¤ò³«»Ï¤¹¤ë¸Å¤¤À¤Âå¤ÎÀêͭΨ(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\-1¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£Éé¤ÎÃÍ(¥Ç¥Õ¥©¥ë¥È¤ò´Þ¤à)¤Ï¡¢\fI\-XX:CMSTriggerRatio\fR¤¬³«»ÏÀêͭΨ¤ÎÃͤòÄêµÁ¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++CMS¼ý½¸¥µ¥¤¥¯¥ë¤ò³«»Ï¤¹¤ë¸Å¤¤À¤Âå¤ÎÀêͭΨ(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\-1¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£Éé¤ÎÃÍ(¥Ç¥Õ¥©¥ë¥È¤ò´Þ¤à)¤Ï¡¢\fB\-XX:CMSTriggerRatio\fR¤¬³«»ÏÀêͭΨ¤ÎÃͤòÄêµÁ¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢ÀêͭΨ¤ò20%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -1874,7 +1911,8 @@ + .RS 4 + .\} + .nf +-\-XX:CMSInitiatingOccupancyFraction=20 ++\fB\-XX:CMSInitiatingOccupancyFraction=20\fR ++ + .fi + .if n \{\ + .RE +@@ -1888,7 +1926,7 @@ + .PP + \-XX:CMSTriggerRatio=\fIpercent\fR + .RS 4 +-CMS¼ý½¸¥µ¥¤¥¯¥ë¤¬³«»Ï¤¹¤ëÁ°¤Ë³ä¤êÅö¤Æ¤é¤ì¤ë\fI\-XX:MinHeapFreeRatio\fR¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëÃͤγä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ80%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++CMS¼ý½¸¥µ¥¤¥¯¥ë¤¬³«»Ï¤¹¤ëÁ°¤Ë³ä¤êÅö¤Æ¤é¤ì¤ë\fB\-XX:MinHeapFreeRatio\fR¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëÃͤγä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ80%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢ÀêͭΨ¤ò75%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -1896,7 +1934,8 @@ + .RS 4 + .\} + .nf +-\-XX:CMSTriggerRatio=75 ++\fB\-XX:CMSTriggerRatio=75\fR ++ + .fi + .if n \{\ + .RE +@@ -1913,7 +1952,8 @@ + .RS 4 + .\} + .nf +-\-XX:ConcGCThreads=2 ++\fB\-XX:ConcGCThreads=2\fR ++ + .fi + .if n \{\ + .RE +@@ -1922,17 +1962,17 @@ + .PP + \-XX:+DisableExplicitGC + .RS 4 +-\fISystem\&.gc()\fR¤Î¸Æ½Ð¤·¤Î½èÍý¤ò̵¸ú¤Ë¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤Ï\fISystem\&.gc()\fR¤Ø¤Î¸Æ½Ð¤·¤¬½èÍý¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fISystem\&.gc()\fR¤Î¸Æ½Ð¤·¤Î½èÍý¤¬Ìµ¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢JVM¤ÏɬÍפ˱þ¤¸¤ÆGC¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBSystem\&.gc()\fR¤Î¸Æ½Ð¤·¤Î½èÍý¤ò̵¸ú¤Ë¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤Ï\fBSystem\&.gc()\fR¤Ø¤Î¸Æ½Ð¤·¤¬½èÍý¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fBSystem\&.gc()\fR¤Î¸Æ½Ð¤·¤Î½èÍý¤¬Ìµ¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢JVM¤ÏɬÍפ˱þ¤¸¤ÆGC¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .RE + .PP + \-XX:+ExplicitGCInvokesConcurrent + .RS 4 +-\fISystem\&.gc()\fR¥ê¥¯¥¨¥¹¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Ê¹ÔGC¤Î¸Æ½Ð¤·¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fI\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¾ì¹ç¤Î¤ß¡¢Í­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBSystem\&.gc()\fR¥ê¥¯¥¨¥¹¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Ê¹ÔGC¤Î¸Æ½Ð¤·¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fB\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¾ì¹ç¤Î¤ß¡¢Í­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses + .RS 4 +-\fISystem\&.gc()\fR¥ê¥¯¥¨¥¹¥È¤ò»ÈÍѤ·¡¢Ê¹ÔGC¥µ¥¤¥¯¥ëÃæ¤Ë¥¯¥é¥¹¤ò¥¢¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Ê¹ÔGC¤Î¸Æ½Ð¤·¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fI\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¾ì¹ç¤Î¤ß¡¢Í­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBSystem\&.gc()\fR¥ê¥¯¥¨¥¹¥È¤ò»ÈÍѤ·¡¢Ê¹ÔGC¥µ¥¤¥¯¥ëÃæ¤Ë¥¯¥é¥¹¤ò¥¢¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Ê¹ÔGC¤Î¸Æ½Ð¤·¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fB\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¾ì¹ç¤Î¤ß¡¢Í­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:G1HeapRegionSize=\fIsize\fR +@@ -1945,7 +1985,8 @@ + .RS 4 + .\} + .nf +-\-XX:G1HeapRegionSize=16m ++\fB\-XX:G1HeapRegionSize=16m\fR ++ + .fi + .if n \{\ + .RE +@@ -1967,7 +2008,8 @@ + .RS 4 + .\} + .nf +-\-XX:G1ReservePercent=20 ++\fB\-XX:G1ReservePercent=20\fR ++ + .fi + .if n \{\ + .RE +@@ -1976,7 +2018,7 @@ + .PP + \-XX:InitialHeapSize=\fIsize\fR + .RS 4 +-¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢0¡¢¤Þ¤¿¤Ï1MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Î¤¤¤º¤ì¤«¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢0¡¢¤Þ¤¿¤Ï1MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Î¤¤¤º¤ì¤«¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢³ä¤êÅö¤Æ¤é¤ì¤¿¥á¥â¥ê¡¼¤Î¥µ¥¤¥º¤òÍÍ¡¹¤Êñ°Ì¤ò»ÈÍѤ·¤Æ6MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -1984,19 +2026,20 @@ + .RS 4 + .\} + .nf +-\-XX:InitialHeapSize=6291456 +-\-XX:InitialHeapSize=6144k +-\-XX:InitialHeapSize=6m ++\fB\-XX:InitialHeapSize=6291456\fR ++\fB\-XX:InitialHeapSize=6144k\fR ++\fB\-XX:InitialHeapSize=6m\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò0¤ËÀßÄꤷ¤¿¾ì¹ç¡¢½é´ü¥µ¥¤¥º¤Ï¡¢¸Å¤¤À¤Âå¤È¼ã¤¤À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥µ¥¤¥º¤Î¹ç·×¤È¤·¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î¥µ¥¤¥º¤Ï¡¢\fI\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÀßÄê¤Ç¤­¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò0¤ËÀßÄꤷ¤¿¾ì¹ç¡¢½é´ü¥µ¥¤¥º¤Ï¡¢¸Å¤¤À¤Âå¤È¼ã¤¤À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥µ¥¤¥º¤Î¹ç·×¤È¤·¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î¥µ¥¤¥º¤Ï¡¢\fB\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÀßÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:InitialSurvivorRatio=\fIratio\fR + .RS 4 +-¥¹¥ë¡¼¥×¥Ã¥È¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤¬»ÈÍѤ¹¤ë¥µ¥Ð¥¤¥ÐÎΰè¤Î½é´üÈæ¤òÀßÄꤷ¤Þ¤¹(\fI\-XX:+UseParallelGC\fR¤ª¤è¤Ó/¤Þ¤¿¤Ï\fI\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹)¡£\fI\-XX:+UseParallelGC\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¹¥ë¡¼¥×¥Ã¥È¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ÇŬ±þ¥µ¥¤¥º»ØÄê¤ò¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤·¤Þ¤¹¡£½é´üÃͤ«¤é»Ï¤á¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÆ°ºî¤Ë½¾¤Ã¤Æ¡¢¥µ¥Ð¥¤¥ÐÎΰ褬¥µ¥¤¥ºÊѹ¹¤µ¤ì¤Þ¤¹¡£(\fI\-XX:\-UseAdaptiveSizePolicy\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ)Ŭ±þ¥µ¥¤¥º»ØÄê¤ò̵¸ú¤Ë¤·¤¿¾ì¹ç¡¢\fI\-XX:SurvivorRatio\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹ÔÁ´ÂΤΥµ¥Ð¥¤¥ÐÎΰè¤Î¥µ¥¤¥º¤òÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥¹¥ë¡¼¥×¥Ã¥È¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤¬»ÈÍѤ¹¤ë¥µ¥Ð¥¤¥ÐÎΰè¤Î½é´üÈæ¤òÀßÄꤷ¤Þ¤¹(\fB\-XX:+UseParallelGC\fR¤ª¤è¤Ó/¤Þ¤¿¤Ï\fB\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹)¡£\fB\-XX:+UseParallelGC\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¹¥ë¡¼¥×¥Ã¥È¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ÇŬ±þ¥µ¥¤¥º»ØÄê¤ò¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤·¤Þ¤¹¡£½é´üÃͤ«¤é»Ï¤á¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÆ°ºî¤Ë½¾¤Ã¤Æ¡¢¥µ¥Ð¥¤¥ÐÎΰ褬¥µ¥¤¥ºÊѹ¹¤µ¤ì¤Þ¤¹¡£(\fB\-XX:\-UseAdaptiveSizePolicy\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ)Ŭ±þ¥µ¥¤¥º»ØÄê¤ò̵¸ú¤Ë¤·¤¿¾ì¹ç¡¢\fB\-XX:SurvivorRatio\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹ÔÁ´ÂΤΥµ¥Ð¥¤¥ÐÎΰè¤Î¥µ¥¤¥º¤òÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + ¼¡¤Î¼°¤ò»ÈÍѤ·¤Æ¡¢¼ã¤¤À¤Âå¤Î¥µ¥¤¥º(Y)¤ª¤è¤Ó¥µ¥Ð¥¤¥ÐÎΰè¤Î½é´üÈæ(R)¤Ë´ð¤Å¤¤¤Æ¡¢¥µ¥Ð¥¤¥ÐÎΰè¤Î½é´ü¥µ¥¤¥º(S)¤ò·×»»¤Ç¤­¤Þ¤¹¡£ + .sp +@@ -2004,7 +2047,8 @@ + .RS 4 + .\} + .nf +-S=Y/(R+2) ++\fBS=Y/(R+2)\fR ++ + .fi + .if n \{\ + .RE +@@ -2019,7 +2063,8 @@ + .RS 4 + .\} + .nf +-\-XX:InitialSurvivorRatio=4 ++\fB\-XX:InitialSurvivorRatio=4\fR ++ + .fi + .if n \{\ + .RE +@@ -2036,7 +2081,8 @@ + .RS 4 + .\} + .nf +-\-XX:InitiatingHeapOccupancyPercent=75 ++\fB\-XX:InitiatingHeapOccupancyPercent=75\fR ++ + .fi + .if n \{\ + .RE +@@ -2053,7 +2099,8 @@ + .RS 4 + .\} + .nf +-\-XX:MaxGCPauseMillis=500 ++\fB\-XX:MaxGCPauseMillis=500\fR ++ + .fi + .if n \{\ + .RE +@@ -2062,7 +2109,7 @@ + .PP + \-XX:MaxHeapSize=\fIsize\fR + .RS 4 +-¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢2MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Ç¥×¥í¥¤¥á¥ó¥È¤Ç¤Ï¡¢\fI\-XX:InitialHeapSize\fR¤ª¤è¤Ó\fI\-XX:MaxHeapSize\fR¤ÏÄ̾ïƱ¤¸ÃͤËÀßÄꤵ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢2MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Ç¥×¥í¥¤¥á¥ó¥È¤Ç¤Ï¡¢\fB\-XX:InitialHeapSize\fR¤ª¤è¤Ó\fB\-XX:MaxHeapSize\fR¤ÏÄ̾ïƱ¤¸ÃͤËÀßÄꤵ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢³ä¤êÅö¤Æ¤é¤ì¤¿¥á¥â¥ê¡¼¤Îµö²Ä¤µ¤ì¤ëºÇÂ祵¥¤¥º¤òÍÍ¡¹¤Êñ°Ì¤ò»ÈÍѤ·¤Æ80MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -2070,16 +2117,17 @@ + .RS 4 + .\} + .nf +-\-XX:MaxHeapSize=83886080 +-\-XX:MaxHeapSize=81920k +-\-XX:MaxHeapSize=80m ++\fB\-XX:MaxHeapSize=83886080\fR ++\fB\-XX:MaxHeapSize=81920k\fR ++\fB\-XX:MaxHeapSize=80m\fR ++ + .fi + .if n \{\ + .RE + .\} + Oracle Solaris 7¤ª¤è¤ÓOracle Solaris 8 SPARC¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¾ì¹ç¤Î¤³¤ÎÃͤξå¸Â¤Ï¡¢¤ª¤è¤½4,000MB¤«¤é¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤ÎÎ̤ò°ú¤¤¤¿¤â¤Î¤Ç¤¹¡£Oracle Solaris 2\&.6¤ª¤è¤Óx86¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¾ì¹ç¤Î¾å¸Â¤Ï¡¢¤ª¤è¤½2,000MB¤«¤é¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤ÎÎ̤ò°ú¤¤¤¿¤â¤Î¤Ç¤¹¡£Linux¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¾ì¹ç¤Î¾å¸Â¤Ï¡¢¤ª¤è¤½2,000MB¤«¤é¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤ÎÎ̤ò°ú¤¤¤¿¤â¤Î¤Ç¤¹¡£ + .sp +-\fI\-XX:MaxHeapSize\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xmx\fR¤ÈƱÅù¤Ç¤¹¡£ ++\fB\-XX:MaxHeapSize\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xmx\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-XX:MaxHeapFreeRatio=\fIpercent\fR +@@ -2092,7 +2140,8 @@ + .RS 4 + .\} + .nf +-\-XX:MaxHeapFreeRatio=75 ++\fB\-XX:MaxHeapFreeRatio=75\fR ++ + .fi + .if n \{\ + .RE +@@ -2109,7 +2158,8 @@ + .RS 4 + .\} + .nf +-\-XX:MaxMetaspaceSize=256m ++\fB\-XX:MaxMetaspaceSize=256m\fR ++ + .fi + .if n \{\ + .RE +@@ -2131,7 +2181,8 @@ + .RS 4 + .\} + .nf +-\-XX:MaxTenuringThreshold=10 ++\fB\-XX:MaxTenuringThreshold=10\fR ++ + .fi + .if n \{\ + .RE +@@ -2153,7 +2204,8 @@ + .RS 4 + .\} + .nf +-\-XX:MinHeapFreeRatio=25 ++\fB\-XX:MinHeapFreeRatio=25\fR ++ + .fi + .if n \{\ + .RE +@@ -2168,7 +2220,8 @@ + .RS 4 + .\} + .nf +-\-XX:NewRatio=1 ++\fB\-XX:NewRatio=1\fR ++ + .fi + .if n \{\ + .RE +@@ -2177,7 +2230,7 @@ + .PP + \-XX:NewSize=\fIsize\fR + .RS 4 +-¼ã¤¤À¤Âå(¥Ê¡¼¥µ¥ê)¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£ ++¼ã¤¤À¤Âå(¥Ê¡¼¥µ¥ê)¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£ + .sp + ¥Ò¡¼¥×¤Î¼ã¤¤À¤Âå¥ê¡¼¥¸¥ç¥ó¤Ï¿·¤·¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£GC¤Ï¡¢Â¾¤Î¥ê¡¼¥¸¥ç¥ó¤è¤ê¤³¤Î¥ê¡¼¥¸¥ç¥ó¤Ç¡¢¤è¤êÉÑÈˤ˼¹Ԥµ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥µ¥¤¥º¤¬¾®¤µ¤¹¤®¤ë¾ì¹ç¡¢Â¿¿ô¤Î¥Þ¥¤¥Ê¡¼GC¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥µ¥¤¥º¤¬Â礭¤¹¤®¤ë¾ì¹ç¡¢¥Õ¥ëGC¤Î¤ß¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¤¬¡¢´°Î»¤Þ¤Ç¤Ë»þ´Ö¤¬¤«¤«¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥µ¥¤¥º¤Ï¡¢Á´ÂΤΥҡ¼¥×¡¦¥µ¥¤¥º¤ÎȾʬ¤«¤é4ʬ¤Î1¤Î´Ö¤Ë¤·¤Æ¤ª¤¯¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .sp +@@ -2187,14 +2240,15 @@ + .RS 4 + .\} + .nf +-\-XX:NewSize=256m +-\-XX:NewSize=262144k +-\-XX:NewSize=268435456 ++\fB\-XX:NewSize=256m\fR ++\fB\-XX:NewSize=262144k\fR ++\fB\-XX:NewSize=268435456\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fI\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xmn\fR¤ÈƱÅù¤Ç¤¹¡£ ++\fB\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xmn\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-XX:ParallelGCThreads=\fIthreads\fR +@@ -2207,7 +2261,8 @@ + .RS 4 + .\} + .nf +-\-XX:ParallelGCThreads=2 ++\fB\-XX:ParallelGCThreads=2\fR ++ + .fi + .if n \{\ + .RE +@@ -2239,7 +2294,7 @@ + µÙ»ß(¤¿¤È¤¨¤ÐGCµÙ»ß¤Ê¤É)¤¬·Ñ³¤·¤¿»þ´Ö¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ + .RE + .PP +-\-XX+PrintGCDateStamp ++\-XX:+PrintGCDateStamps + .RS 4 + GC¤´¤È¤ÎÆüÉÕ¥¹¥¿¥ó¥×¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ + .RE +@@ -2254,11 +2309,16 @@ + ¸Ä¡¹¤ÎGC¥ï¡¼¥«¡¼¡¦¥¹¥ì¥Ã¥É¡¦¥¿¥¹¥¯¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ + .RE + .PP +-\-XX:+PrintGCTimeStamp ++\-XX:+PrintGCTimeStamps + .RS 4 + GC¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ + .RE + .PP ++\-XX:+PrintStringDeduplicationStatistics ++.RS 4 ++¾ÜºÙ¤Ê½ÅÊ£½ü³°Åý·×¤ò°õºþ¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£\fB\-XX:+UseStringDeduplication\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.RE ++.PP + \-XX:+PrintTenuringDistribution + .RS 4 + ÅÂƲÆþ¤ê´ü´Ö¾ðÊó¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¼¡¤Ë¡¢½ÐÎϤÎÎã¤ò¼¨¤·¤Þ¤¹¡£ +@@ -2267,11 +2327,12 @@ + .RS 4 + .\} + .nf +-Desired survivor size 48286924 bytes, new threshold 10 (max 10) +-\- age 1: 28992024 bytes, 28992024 total +-\- age 2: 1366864 bytes, 30358888 total +-\- age 3: 1425912 bytes, 31784800 total +-\&.\&.\&. ++\fBDesired survivor size 48286924 bytes, new threshold 10 (max 10)\fR ++\fB\- age 1: 28992024 bytes, 28992024 total\fR ++\fB\- age 2: 1366864 bytes, 30358888 total\fR ++\fB\- age 3: 1425912 bytes, 31784800 total\fR ++\fB\&.\&.\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -2285,12 +2346,12 @@ + .PP + \-XX:+ScavengeBeforeFullGC + .RS 4 +-¤½¤ì¤¾¤ì¤Î¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤ÎGC¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤Î¥¹¥«¥Ù¥ó¥¸¤ò¹Ô¤¦¤È¡¢¸Å¤¤À¤ÂåÎΰ褫¤é¼ã¤¤À¤ÂåÎΰè¤Ø¤Î¥¢¥¯¥»¥¹¤¬²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¤ò¸º¤é¤¹¤³¤È¤¬¤Ç¤­¤ë¤¿¤á¡¢¤³¤ì¤ò̵¸ú¤Ë\fI¤·¤Ê¤¤\fR¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£³Æ¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤ÎGC¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-ScavengeBeforeFullGC\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¤½¤ì¤¾¤ì¤Î¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤ÎGC¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤Î¥¹¥«¥Ù¥ó¥¸¤ò¹Ô¤¦¤È¡¢¸Å¤¤À¤ÂåÎΰ褫¤é¼ã¤¤À¤ÂåÎΰè¤Ø¤Î¥¢¥¯¥»¥¹¤¬²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¤ò¸º¤é¤¹¤³¤È¤¬¤Ç¤­¤ë¤¿¤á¡¢¤³¤ì¤ò̵¸ú¤Ë\fI¤·¤Ê¤¤\fR¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£³Æ¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤ÎGC¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-ScavengeBeforeFullGC\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-XX:SoftRefLRUPolicyMSPerMB=\fItime\fR + .RS 4 +-¥½¥Õ¥È¡¦¥¢¥¯¥»¥¹¤¬²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤¬ºÇ¸å¤Ë»²¾È¤µ¤ì¤Æ¤«¤é¥Ò¡¼¥×¾å¤Ç¥¢¥¯¥Æ¥£¥Ö¤Ê¤Þ¤Þ¤Ë¤Ê¤Ã¤Æ¤¤¤ë»þ´Ö(¥ß¥êÉÃñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¥Ò¡¼¥×Æâ¤Î¶õ¤­¥á¥¬¥Ð¥¤¥ÈÅö¤¿¤ê¤Ç1Éäθ³´ü´Ö¤Ç¤¹¡£\fI\-XX:SoftRefLRUPolicyMSPerMB\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¸½ºß¤Î¥Ò¡¼¥×¡¦¥µ¥¤¥º(Java HotSpot Client VMÍÑ)¤Þ¤¿¤ÏºÇÂç²Äǽ¥Ò¡¼¥×¡¦¥µ¥¤¥º(Java HotSpot Server VMÍÑ)¤Î1¥á¥¬¥Ð¥¤¥ÈÅö¤¿¤ê¤Î¥ß¥êÉäòɽ¤¹À°¿ôÃͤò¼õ¤±Æþ¤ì¤Þ¤¹¡£¤³¤Î°ã¤¤¤Ï¡¢Client VM¤Ï¡¢¥Ò¡¼¥×¤òÂ礭¤¯¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥½¥Õ¥È»²¾È¤ò¥Õ¥é¥Ã¥·¥å¤¹¤ë·¹¸þ¤¬¤¢¤ë¤Î¤ËÂФ·¡¢Server VM¤Ï¡¢¥½¥Õ¥È»²¾È¤ò¥Õ¥é¥Ã¥·¥å¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥Ò¡¼¥×¤òÂ礭¤¯¤¹¤ë·¹¸þ¤¬¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¡¢\fI\-Xmx\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢¥½¥Õ¥È»²¾È¤¬¤É¤Î¤¯¤é¤¤¿×®¤Ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤µ¤ì¤ë¤«¤Ë½ÅÍפʱƶÁ¤òµÚ¤Ü¤·¤Þ¤¹¡£ ++¥½¥Õ¥È¡¦¥¢¥¯¥»¥¹¤¬²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤¬ºÇ¸å¤Ë»²¾È¤µ¤ì¤Æ¤«¤é¥Ò¡¼¥×¾å¤Ç¥¢¥¯¥Æ¥£¥Ö¤Ê¤Þ¤Þ¤Ë¤Ê¤Ã¤Æ¤¤¤ë»þ´Ö(¥ß¥êÉÃñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¥Ò¡¼¥×Æâ¤Î¶õ¤­¥á¥¬¥Ð¥¤¥ÈÅö¤¿¤ê¤Ç1Éäθ³´ü´Ö¤Ç¤¹¡£\fB\-XX:SoftRefLRUPolicyMSPerMB\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¸½ºß¤Î¥Ò¡¼¥×¡¦¥µ¥¤¥º(Java HotSpot Client VMÍÑ)¤Þ¤¿¤ÏºÇÂç²Äǽ¥Ò¡¼¥×¡¦¥µ¥¤¥º(Java HotSpot Server VMÍÑ)¤Î1¥á¥¬¥Ð¥¤¥ÈÅö¤¿¤ê¤Î¥ß¥êÉäòɽ¤¹À°¿ôÃͤò¼õ¤±Æþ¤ì¤Þ¤¹¡£¤³¤Î°ã¤¤¤Ï¡¢Client VM¤Ï¡¢¥Ò¡¼¥×¤òÂ礭¤¯¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥½¥Õ¥È»²¾È¤ò¥Õ¥é¥Ã¥·¥å¤¹¤ë·¹¸þ¤¬¤¢¤ë¤Î¤ËÂФ·¡¢Server VM¤Ï¡¢¥½¥Õ¥È»²¾È¤ò¥Õ¥é¥Ã¥·¥å¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥Ò¡¼¥×¤òÂ礭¤¯¤¹¤ë·¹¸þ¤¬¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¡¢\fB\-Xmx\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢¥½¥Õ¥È»²¾È¤¬¤É¤Î¤¯¤é¤¤¿×®¤Ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤µ¤ì¤ë¤«¤Ë½ÅÍפʱƶÁ¤òµÚ¤Ü¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢Ãͤò2\&.5ÉäËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -2298,13 +2359,19 @@ + .RS 4 + .\} + .nf +-\-XX:SoftRefLRUPolicyMSPerMB=2500 ++\fB\-XX:SoftRefLRUPolicyMSPerMB=2500\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP ++\-XX:StringDeduplicationAgeThreshold=\fIthreshold\fR ++.RS 4 ++»ØÄꤷ¤¿´ü´Ö¤ËÅþ㤷¤Ä¤Ä¤¢¤ë\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢½ÅÊ£½ü³°¤Î¸õÊä¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î´ü´Ö¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¤¬¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Ç¸³¤·¤¿²ó¿ô¤Î¬ÄêÃͤǤ¹¡£¤³¤ì¤Ï¡¢ÅÂƲÆþ¤ê¤È¸Æ¤Ð¤ì¤ë¾ì¹ç¤â¤¢¤ê¤Þ¤¹¡£\fB\-XX:+PrintTenuringDistribution\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î´ü´Ö¤ËÅþ㤹¤ëÁ°¤Ë¸Å¤¤¥Ò¡¼¥×¡¦¥ê¡¼¥¸¥ç¥ó¤Ë¾º³Ê¤µ¤ì¤¿\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢¾ï¤Ë½ÅÊ£½ü³°¤Î¸õÊä¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\fB3\fR¤Ç¤¹¡£\fB\-XX:+UseStringDeduplication\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.RE ++.PP + \-XX:SurvivorRatio=\fIratio\fR + .RS 4 + EdenÎΰè¤Î¥µ¥¤¥º¤È¥µ¥Ð¥¤¥ÐÎΰè¤Î¥µ¥¤¥º¤È¤ÎÈæΨ¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï8¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢Eden/¥µ¥Ð¥¤¥ÐÎΰè¤ÎÈæΨ¤ò4¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +@@ -2313,7 +2380,8 @@ + .RS 4 + .\} + .nf +-\-XX:SurvivorRatio=4 ++\fB\-XX:SurvivorRatio=4\fR ++ + .fi + .if n \{\ + .RE +@@ -2330,7 +2398,8 @@ + .RS 4 + .\} + .nf +-\-XX:TargetSurvivorRatio=30 ++\fB\-XX:TargetSurvivorRatio=30\fR ++ + .fi + .if n \{\ + .RE +@@ -2339,7 +2408,7 @@ + .PP + \-XX:TLABSize=\fIsize\fR + .RS 4 +-¥¹¥ì¥Ã¥É¡¦¥í¡¼¥«¥ë¤Ê³äÅö¤Æ¥Ð¥Ã¥Õ¥¡(TLAB)¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬0¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢JVM¤Ç¤Ï½é´ü¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£ ++¥¹¥ì¥Ã¥É¡¦¥í¡¼¥«¥ë¤Ê³äÅö¤Æ¥Ð¥Ã¥Õ¥¡(TLAB)¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬0¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢JVM¤Ç¤Ï½é´ü¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢TLAB¤Î½é´ü¥µ¥¤¥º¤ò512KB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -2347,7 +2416,8 @@ + .RS 4 + .\} + .nf +-\-XX:TLABSize=512k ++\fB\-XX:TLABSize=512k\fR ++ + .fi + .if n \{\ + .RE +@@ -2356,7 +2426,7 @@ + .PP + \-XX:+UseAdaptiveSizePolicy + .RS 4 +-Ŭ±þÀ¤Â奵¥¤¥º»ØÄê¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Å¬±þÀ¤Â奵¥¤¥º»ØÄê¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseAdaptiveSizePolicy\fR¤ò»ØÄꤷ¡¢¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤Î¥µ¥¤¥º¤òÌÀ¼¨Åª¤ËÀßÄꤷ¤Þ¤¹(\fI\-XX:SurvivorRatio\fR¥ª¥×¥·¥ç¥ó¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤)¡£ ++Ŭ±þÀ¤Â奵¥¤¥º»ØÄê¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Å¬±þÀ¤Â奵¥¤¥º»ØÄê¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseAdaptiveSizePolicy\fR¤ò»ØÄꤷ¡¢¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤Î¥µ¥¤¥º¤òÌÀ¼¨Åª¤ËÀßÄꤷ¤Þ¤¹(\fB\-XX:SurvivorRatio\fR¥ª¥×¥·¥ç¥ó¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤)¡£ + .RE + .PP + \-XX:+UseCMSInitiatingOccupancyOnly +@@ -2366,43 +2436,43 @@ + .PP + \-XX:+UseConcMarkSweepGC + .RS 4 +-¸Å¤¤À¤Âå¤Ø¤ÎCMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÂÔµ¡»þ´Ö¤ÎÍ×·ï¤ò¡¢¥¹¥ë¡¼¥×¥Ã¥È(\fI\-XX:+UseParallelGC\fR)¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ë¤è¤Ã¤ÆËþ¤¿¤¹¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢CMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£G1¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(\fI\-XX:+UseG1GC\fR)¤ÏÊ̤ÎÂåÂؤȤʤê¤Þ¤¹¡£ ++¸Å¤¤À¤Âå¤Ø¤ÎCMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÂÔµ¡»þ´Ö¤ÎÍ×·ï¤ò¡¢¥¹¥ë¡¼¥×¥Ã¥È(\fB\-XX:+UseParallelGC\fR)¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ë¤è¤Ã¤ÆËþ¤¿¤¹¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢CMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£G1¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(\fB\-XX:+UseG1GC\fR)¤ÏÊ̤ÎÂåÂؤȤʤê¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fI\-XX:+UseParNewGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬Í­¸ú¤Ê¾ì¹ç¡¢\fB\-XX:+UseParNewGC\fR¥ª¥×¥·¥ç¥ó¤Ï¼«Æ°Åª¤ËÀßÄꤵ¤ì¡¢Ìµ¸ú²½¤·¤Ê¤¤É¬Íפ¬¤¢¤ê¤Þ¤¹¤¬¡¢Íýͳ¤ÏJDK 8¤Ç¤Ï\fB\-XX:+UseConcMarkSweepGC \-XX:\-UseParNewGC\fR¥ª¥×¥·¥ç¥ó¤ÎÁȹ礻¤¬Èó¿ä¾©¤Ç¤¢¤ë¤¿¤á¤Ç¤¹¡£ + .RE + .PP + \-XX:+UseG1GC + .RS 4 +-G1¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï¥µ¡¼¥Ð¡¼·Á¼°¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ç¡¢ÂçÎ̤ÎRAM¤ò»ý¤Ä¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¡¦¥Þ¥·¥ó¤òÂоݤȤ·¤Æ¤¤¤Þ¤¹¡£¹â¤¤³ÎΨ¤ÇGCµÙ»ß»þ´Ö¤ÎÌÜɸ¤òãÀ®¤·¡¢Æ±»þ¤ËŬÀڤʥ¹¥ë¡¼¥×¥Ã¥È¤â°Ý»ý¤·¤Þ¤¹¡£G1¥³¥ì¥¯¥¿¤Ï¡¢GCÂÔµ¡»þ´Ö¤Î¸ÂÄꤵ¤ì¤¿Í×·ï(°ÂÄꤷ¤¿Í½Â¬²Äǽ¤Ê0\&.5ÉÃ̤Ëþ¤ÎµÙ»ß»þ´Ö)¤ò»ý¤Ä¡¢Â礭¤¤¥Ò¡¼¥×(Ìó6GB°Ê¾å¤Î¥µ¥¤¥º)¤¬É¬Íפʥ¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¿ä¾©¤µ¤ì¤Þ¤¹¡£ ++¥¬¥Ù¡¼¥¸¥Õ¥¡¡¼¥¹¥È(G1)¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï¥µ¡¼¥Ð¡¼·Á¼°¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ç¡¢ÂçÎ̤ÎRAM¤ò»ý¤Ä¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¡¦¥Þ¥·¥ó¤òÂоݤȤ·¤Æ¤¤¤Þ¤¹¡£¹â¤¤³ÎΨ¤ÇGCµÙ»ß»þ´Ö¤ÎÌÜɸ¤òãÀ®¤·¡¢Æ±»þ¤ËŬÀڤʥ¹¥ë¡¼¥×¥Ã¥È¤â°Ý»ý¤·¤Þ¤¹¡£G1¥³¥ì¥¯¥¿¤Ï¡¢GCÂÔµ¡»þ´Ö¤Î¸ÂÄꤵ¤ì¤¿Í×·ï(°ÂÄꤷ¤¿Í½Â¬²Äǽ¤Ê0\&.5ÉÃ̤Ëþ¤ÎµÙ»ß»þ´Ö)¤ò»ý¤Ä¡¢Â礭¤¤¥Ò¡¼¥×(Ìó6GB°Ê¾å¤Î¥µ¥¤¥º)¤¬É¬Íפʥ¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¿ä¾©¤µ¤ì¤Þ¤¹¡£ + .sp + ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseGCOverheadLimit + .RS 4 +-\fIOutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤ë¤Þ¤Ç¤Ë¡¢GC¤ÇJVM¤Ë¤è¤Ã¤ÆÍפ·¤¿»þ´Ö¤Î³ä¹ç¤òÀ©¸Â¤¹¤ë¥Ý¥ê¥·¡¼¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Ë¹ç·×»þ´Ö¤Î98%¤è¤ê¿¤¯Èñ¤ä¤µ¤ì¡¢¥Ò¡¼¥×¤Î¥ê¥«¥Ð¥ê¤¬2%̤Ëþ¤Ç¤¢¤ë¾ì¹ç¡¢¥Ñ¥é¥ì¥ëGC¤Ë¤è¤Ã¤Æ\fIOutOfMemoryError\fR¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£¥Ò¡¼¥×¤¬¾®¤µ¤¤¾ì¹ç¡¢¤³¤Îµ¡Ç½¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬Ä¹´ü´Ö¤Û¤È¤ó¤É¤Þ¤¿¤Ï¤Þ¤Ã¤¿¤¯¿ÊĽ¤Ê¤¯¼Â¹Ô¤·¤Æ¤¤¤ë¾õÂÖ¤ò²óÈò¤¹¤ë¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseGCOverheadLimit\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBOutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤ë¤Þ¤Ç¤Ë¡¢GC¤ÇJVM¤Ë¤è¤Ã¤ÆÍפ·¤¿»þ´Ö¤Î³ä¹ç¤òÀ©¸Â¤¹¤ë¥Ý¥ê¥·¡¼¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Ë¹ç·×»þ´Ö¤Î98%¤è¤ê¿¤¯Èñ¤ä¤µ¤ì¡¢¥Ò¡¼¥×¤Î¥ê¥«¥Ð¥ê¤¬2%̤Ëþ¤Ç¤¢¤ë¾ì¹ç¡¢¥Ñ¥é¥ì¥ëGC¤Ë¤è¤Ã¤Æ\fBOutOfMemoryError\fR¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£¥Ò¡¼¥×¤¬¾®¤µ¤¤¾ì¹ç¡¢¤³¤Îµ¡Ç½¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬Ä¹´ü´Ö¤Û¤È¤ó¤É¤Þ¤¿¤Ï¤Þ¤Ã¤¿¤¯¿ÊĽ¤Ê¤¯¼Â¹Ô¤·¤Æ¤¤¤ë¾õÂÖ¤ò²óÈò¤¹¤ë¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseGCOverheadLimit\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseNUMA + .RS 4 +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Çû¤¤ÂÔµ¡»þ´Ö¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤòÁý²Ã¤µ¤»¤ë¤³¤È¤Ç¡¢ÉԶѰì¤Ê¥á¥â¥ê¡¼¡¦¥¢¡¼¥­¥Æ¥¯¥Á¥ã(NUMA)¤ò»ÈÍѤ·¤¿¥Þ¥·¥ó¾å¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹ºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢NUMA¤ËÂФ¹¤ëºÇŬ²½¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥é¥ì¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(\fI\-XX:+UseParallelGC\fR)¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Çû¤¤ÂÔµ¡»þ´Ö¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤòÁý²Ã¤µ¤»¤ë¤³¤È¤Ç¡¢ÉԶѰì¤Ê¥á¥â¥ê¡¼¡¦¥¢¡¼¥­¥Æ¥¯¥Á¥ã(NUMA)¤ò»ÈÍѤ·¤¿¥Þ¥·¥ó¾å¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹ºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢NUMA¤ËÂФ¹¤ëºÇŬ²½¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥é¥ì¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(\fB\-XX:+UseParallelGC\fR)¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ + .RE + .PP + \-XX:+UseParallelGC + .RS 4 + Ê£¿ô¤Î¥×¥í¥»¥Ã¥µ¤òÍøÍѤ·¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¡¢¥Ñ¥é¥ì¥ë¡¦¥¹¥«¥Ù¥ó¥¸¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(¥¹¥ë¡¼¥×¥Ã¥È¡¦¥³¥ì¥¯¥¿¤È¤â¸Æ¤Ð¤ì¤ë)¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤ì¤òÍ­¸ú¤Ë¤·¤¿¾ì¹ç¡¢ÌÀ¼¨Åª¤Ë̵¸ú¤Ë¤·¤Ê¤¤¤«¤®¤ê¡¢\fI\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤ì¤òÍ­¸ú¤Ë¤·¤¿¾ì¹ç¡¢ÌÀ¼¨Åª¤Ë̵¸ú¤Ë¤·¤Ê¤¤¤«¤®¤ê¡¢\fB\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseParallelOldGC + .RS 4 +-¥Õ¥ëGC¤Ø¤Î¥Ñ¥é¥ì¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£¤³¤ì¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fI\-XX:+UseParallelGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥Õ¥ëGC¤Ø¤Î¥Ñ¥é¥ì¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£¤³¤ì¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fB\-XX:+UseParallelGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseParNewGC + .RS 4 +-¼ã¤¤À¤Âå¤Ç¤Î¥³¥ì¥¯¥·¥ç¥ó¤Ø¤Î¥Ñ¥é¥ì¥ë¡¦¥¹¥ì¥Ã¥É¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£\fI\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢¤³¤ì¤Ï¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¼ã¤¤À¤Âå¤Ç¤Î¥³¥ì¥¯¥·¥ç¥ó¤Ø¤Î¥Ñ¥é¥ì¥ë¡¦¥¹¥ì¥Ã¥É¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£\fB\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢¤³¤ì¤Ï¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£JDK 8¤Ç¤Ï¡¢\fB\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fB\-XX:+UseParNewGC\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤ÏÈó¿ä¾©¤Ç¤¹¡£ + .RE + .PP + \-XX:+UseSerialGC +@@ -2410,17 +2480,59 @@ + ¥·¥ê¥¢¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤«¤éÆÃÊ̤ʵ¡Ç½¤òɬÍפȤ·¤Ê¤¤¡¢¾®µ¬ÌϤÇñ½ã¤Ê¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¾ì¹ç¤Ë¤Ï¡¢¤³¤ì¤Ï°ìÈ̤˺ÇŬ¤ÊÁªÂò¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£ + .RE + .PP ++\-XX:+UseStringDeduplication ++.RS 4 ++ʸ»úÎó¤Î½ÅÊ£½ü³°¤òÍ­¸ú²½¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¥¬¥Ù¡¼¥¸¥Õ¥¡¡¼¥¹¥È(G1)¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤òÍ­¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-XX:+UseG1GC\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¿¤¯¤Î\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤¬Æ±¤¸¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤«¤é¡¢\fIString deduplication\fR¤Ë¤è¤ê¡¢Java¥Ò¡¼¥×¾å¤Î\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤Î¥á¥â¥ê¡¼¡¦¥Õ¥Ã¥È¥×¥ê¥ó¥È¤¬ºï¸º¤µ¤ì¤Þ¤¹¡£³Æ\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤¬Æȼ«¤Îʸ»úÇÛÎó¤ò¥Ý¥¤¥ó¥È¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢Æ±°ì¤Î\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤ÏƱ¤¸Ê¸»úÇÛÎó¤ò¥Ý¥¤¥ó¥È¤·¶¦Í­¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP + \-XX:+UseTLAB + .RS 4 +-¼ã¤¤À¤Âå¤ÎÎΰè¤Ç¤Î¥¹¥ì¥Ã¥É¡¦¥í¡¼¥«¥ë¤Ê³äÅö¤Æ¥Ö¥í¥Ã¥¯(TLAB)¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£TLAB¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseTLAB\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¼ã¤¤À¤Âå¤ÎÎΰè¤Ç¤Î¥¹¥ì¥Ã¥É¡¦¥í¡¼¥«¥ë¤Ê³äÅö¤Æ¥Ö¥í¥Ã¥¯(TLAB)¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£TLAB¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseTLAB\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .SS "Èó¿ä¾©¤Çºï½ü¤µ¤ì¤¿¥ª¥×¥·¥ç¥ó" + .PP + ¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ë¤Ï´Þ¤Þ¤ì¤Æ¤¤¤Þ¤·¤¿¤¬¡¢°Ê¹ß¤ÏÉÔÍפȤߤʤµ¤ì¤Æ¤¤¤Þ¤¹¡£ + .PP ++\-Xincgc ++.RS 4 ++¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤Ç¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP + \-Xrun\fIlibname\fR + .RS 4 +-»ØÄꤷ¤¿¥Ç¥Ð¥Ã¥°/¥×¥í¥Õ¥¡¥¤¥ë¤Î¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-agentlib\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ ++»ØÄꤷ¤¿¥Ç¥Ð¥Ã¥°/¥×¥í¥Õ¥¡¥¤¥ë¤Î¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-agentlib\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycle=\fIpercent\fR ++.RS 4 ++ʹԥ³¥ì¥¯¥¿¤Î¼Â¹Ô¤¬µö²Ä¤µ¤ì¤Æ¤¤¤ë¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Î»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycleMin=\fIpercent\fR ++.RS 4 ++\fB\-XX:+CMSIncrementalPacing\fR¤¬Í­¸ú¤Ê¾ì¹ç¤Ë¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î²¼¸Â¤Ç¤¢¤ë¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Î»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:+CMSIncrementalMode ++.RS 4 ++CMS¥³¥ì¥¯¥¿¤ÎÁýʬ¥â¡¼¥É¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fBCMSIncremental\fR¤Ç»Ï¤Þ¤ë¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó ++.RE ++.PP ++\-XX:CMSIncrementalOffset=\fIpercent\fR ++.RS 4 ++Áýʬ¥â¡¼¥É¤Î¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Ç´ü´ÖÆâ¤Ë±¦¤Ë°ÜÆ°¤¹¤ë»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:+CMSIncrementalPacing ++.RS 4 ++JVM¤Î¼Â¹ÔÃæ¤Ë¼ý½¸¤µ¤ì¤¿Åý·×¤Ë´ð¤Å¤¤¤Æ¡¢Áýʬ¥â¡¼¥É¤Î¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î¼«Æ°Ä´À°¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:CMSIncrementalSafetyFactor=\fIpercent\fR ++.RS 4 ++¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò·×»»¤¹¤ëºÝ¤Ë¡¢Êݼé¤òÄɲ乤뤿¤á¤Ë»ÈÍѤµ¤ì¤ë»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .RE + .PP + \-XX:CMSInitiatingPermOccupancyFraction=\fIpercent\fR +@@ -2430,12 +2542,12 @@ + .PP + \-XX:MaxPermSize=\fIsize\fR + .RS 4 +-±Êµ×À¤ÂåÎΰè¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢JDK 8¤ÇÈó¿ä¾©¤Ë¤Ê¤ê¡¢\fI\-XX:MaxMetaspaceSize\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ ++±Êµ×À¤ÂåÎΰè¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢JDK 8¤ÇÈó¿ä¾©¤Ë¤Ê¤ê¡¢\fB\-XX:MaxMetaspaceSize\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ + .RE + .PP + \-XX:PermSize=\fIsize\fR + .RS 4 +-Ķ¤¨¤¿¾ì¹ç¤Ë¤Ï¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤ò¥È¥ê¥¬¡¼¤¹¤ë¡¢±Êµ×À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿Îΰè(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢JDK 8¤ÇÈó¿ä¾©¤Ë¤Ê¤ê¡¢\fI\-XX:MetaspaceSize\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ ++Ķ¤¨¤¿¾ì¹ç¤Ë¤Ï¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤ò¥È¥ê¥¬¡¼¤¹¤ë¡¢±Êµ×À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿Îΰè(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢JDK 8¤ÇÈó¿ä¾©¤Ë¤Ê¤ê¡¢\fB\-XX:MetaspaceSize\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ + .RE + .PP + \-XX:+UseSplitVerifier +@@ -2451,28 +2563,34 @@ + .PP + ¼¡¤ÎÎã¤Ç¤Ï¡¢¥¹¥ë¡¼¥×¥Ã¥È¤ÎºÇŬ²½¤Þ¤¿¤Ï¥ì¥¹¥Ý¥ó¥¹»þ´Ö¤Îû½Ì²½¤Î¤¤¤º¤ì¤«¤ò¹Ô¤¦¤¿¤á¤Î¡¢»î¸³Åª¤Ê¥Á¥å¡¼¥Ë¥ó¥°¡¦¥Õ¥é¥°¤Î»ÈÍÑÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .PP +-\fBExample 1\fR, ¥¹¥ë¡¼¥×¥Ã¥È¤ò¸þ¾å¤¹¤ë¤¿¤á¤Î¥Á¥å¡¼¥Ë¥ó¥° ++\fBÎã 1\fR ++.br ++¥¹¥ë¡¼¥×¥Ã¥È¤ò¸þ¾å¤¹¤ë¤¿¤á¤Î¥Á¥å¡¼¥Ë¥ó¥° + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g ++\fBjava \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ¥ì¥¹¥Ý¥ó¥¹»þ´Ö¤ò®¤¯¤¹¤ë¤¿¤á¤Î¥Á¥å¡¼¥Ë¥ó¥° ++\fBÎã 2\fR ++.br ++¥ì¥¹¥Ý¥ó¥¹»þ´Ö¤ò®¤¯¤¹¤ë¤¿¤á¤Î¥Á¥å¡¼¥Ë¥ó¥° + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp ++\fBjava \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp\fR ++ + .fi + .if n \{\ + .RE +@@ -2480,7 +2598,7 @@ + .RE + .SH "½ªÎ»¥¹¥Æ¡¼¥¿¥¹" + .PP +-Ä̾¼¡¤Î½ªÎ»Ãͤ¬µ¯Æ°¥Ä¡¼¥ë¤«¤éÊÖ¤µ¤ì¤ë¤Î¤Ï¡¢µ¯Æ°¸µ¤¬ÉÔÀµ¤Ê°ú¿ô¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¤«¡¢¿¼¹ï¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤«¡¢¤¢¤ë¤¤¤ÏJVM¤Ë¤è¤êÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ç¤¹¡£¤¿¤À¤·¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢API¸Æ½Ð¤·\fISystem\&.exit(exitValue)\fR¤ò»ÈÍѤ·¤ÆǤ°Õ¤ÎÃͤòÊÖ¤¹¤³¤È¤òÁªÂò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Ãͤϼ¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ ++Ä̾¼¡¤Î½ªÎ»Ãͤ¬µ¯Æ°¥Ä¡¼¥ë¤«¤éÊÖ¤µ¤ì¤ë¤Î¤Ï¡¢µ¯Æ°¸µ¤¬ÉÔÀµ¤Ê°ú¿ô¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¤«¡¢¿¼¹ï¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤«¡¢¤¢¤ë¤¤¤ÏJVM¤Ë¤è¤êÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ç¤¹¡£¤¿¤À¤·¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢API¸Æ½Ð¤·\fBSystem\&.exit(exitValue)\fR¤ò»ÈÍѤ·¤ÆǤ°Õ¤ÎÃͤòÊÖ¤¹¤³¤È¤òÁªÂò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Ãͤϼ¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2490,7 +2608,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI0\fR: Àµ¾ï½ªÎ» ++\fB0\fR: Àµ¾ï½ªÎ» + .RE + .sp + .RS 4 +@@ -2501,7 +2619,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI>0\fR: ¥¨¥é¡¼È¯À¸ ++\fB>0\fR: ¥¨¥é¡¼È¯À¸ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/javac.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/javac.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: javac +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,8 +21,16 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 +-.TH "javac" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" ++.\" Title: javac ++.\" Language: Japanese ++.\" Date: 2014ǯ8·î8Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 ++.TH "javac" "1" "2014ǯ8·î8Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff + .\" ----------------------------------------------------------------- +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + javac \- Java¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÄêµÁ¤òÆɤ߼è¤ê¡¢¥Ð¥¤¥È¥³¡¼¥É¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjavac\fR [ \fIoptions\fR ] [ \fIsourcefiles\fR ] [ \fIclasses\fR] [ \fI@argfiles\fR ] ++\fBjavac\fR [ \fIoptions\fR ] [ \fIsourcefiles\fR ] [ \fIclasses\fR] [ \fI@argfiles\fR ] + .fi + .if n \{\ + .RE +@@ -66,28 +68,28 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIsourcefiles\fR + .RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(\fIMyClass\&.java\fR¤Ê¤É)¡£ ++¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(\fBMyClass\&.java\fR¤Ê¤É)¡£ + .RE + .PP + \fIclasses\fR + .RS 4 +-Ãí¼á¤Î½èÍýÂоݤȤʤë1¤Ä°Ê¾å¤Î¥¯¥é¥¹(\fIMyPackage\&.MyClass\fR¤Ê¤É)¡£ ++Ãí¼á¤Î½èÍýÂоݤȤʤë1¤Ä°Ê¾å¤Î¥¯¥é¥¹(\fBMyPackage\&.MyClass\fR¤Ê¤É)¡£ + .RE + .PP + \fI@argfiles\fR + .RS 4 +-¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò°ìÍ÷ɽ¼¨¤¹¤ë1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¡£¤³¤Î¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¤Ï\fI\-J\fR¥ª¥×¥·¥ç¥ó¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò°ìÍ÷ɽ¼¨¤¹¤ë1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¡£¤³¤Î¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¤Ï\fB\-J\fR¥ª¥×¥·¥ç¥ó¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£¥³¥Þ¥ó¥É¹Ô°ú¿ô¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÄêµÁ¤òÆɤ߼è¤ê¡¢¥Ð¥¤¥È¥³¡¼¥É¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹Æâ¤ÎÃí¼á¤Î½èÍý¤â¤Ç¤­¤Þ¤¹¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÄêµÁ¤òÆɤ߼è¤ê¡¢¥Ð¥¤¥È¥³¡¼¥É¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹Æâ¤ÎÃí¼á¤Î½èÍý¤â¤Ç¤­¤Þ¤¹¡£ + .PP +-¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë̾¤ò\fIjavac\fR¤ËÅϤ¹¤Ë¤Ï¡¢2¤Ä¤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë̾¤ò\fBjavac\fR¤ËÅϤ¹¤Ë¤Ï¡¢2¤Ä¤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -97,7 +99,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¿ô¤¬¾¯¤Ê¤¤¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ë̾¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¿ô¤¬¾¯¤Ê¤¤¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ë̾¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -108,19 +110,19 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¿ô¤¬Â¿¤¤¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤ò¶õÇò¤Þ¤¿¤Ï²þ¹Ô¤Ç¶èÀڤäƻØÄꤷ¤Þ¤¹¡£\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¡¢¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤Ë¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¿ô¤¬Â¿¤¤¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤ò¶õÇò¤Þ¤¿¤Ï²þ¹Ô¤Ç¶èÀڤäƻØÄꤷ¤Þ¤¹¡£\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¡¢¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤Ë¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP +-¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë̾¤Ï\&.java³ÈÄ¥»Ò¤ò¡¢¥¯¥é¥¹¤Î¥Õ¥¡¥¤¥ë̾¤Ï\&.class³ÈÄ¥»Ò¤ò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤É¤Á¤é¤â¡¢³ºÅö¤¹¤ë¥¯¥é¥¹¤ËÂбþ¤¹¤ë¥ë¡¼¥È̾¤ò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIMyClass\fR¤È¤¤¤¦Ì¾Á°¤Î¥¯¥é¥¹¤Ï¡¢\fIMyClass\&.java\fR¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ëµ­½Ò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢\fIMyClass\&.class\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë̾¤Ï\&.java³ÈÄ¥»Ò¤ò¡¢¥¯¥é¥¹¤Î¥Õ¥¡¥¤¥ë̾¤Ï\&.class³ÈÄ¥»Ò¤ò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤É¤Á¤é¤â¡¢³ºÅö¤¹¤ë¥¯¥é¥¹¤ËÂбþ¤¹¤ë¥ë¡¼¥È̾¤ò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBMyClass\fR¤È¤¤¤¦Ì¾Á°¤Î¥¯¥é¥¹¤Ï¡¢\fBMyClass\&.java\fR¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ëµ­½Ò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢\fBMyClass\&.class\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£ + .PP +-ÆâÉô¥¯¥é¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤È¡¢ÄɲäΥ¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ï¡¢\fIMyClass$MyInnerClass\&.class\fR¤Î¤è¤¦¤Ë¡¢ÆâÉô¥¯¥é¥¹Ì¾¤È³°Éô¥¯¥é¥¹Ì¾¤òÁȤ߹礻¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ÆâÉô¥¯¥é¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤È¡¢ÄɲäΥ¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ï¡¢\fBMyClass$MyInnerClass\&.class\fR¤Î¤è¤¦¤Ë¡¢ÆâÉô¥¯¥é¥¹Ì¾¤È³°Éô¥¯¥é¥¹Ì¾¤òÁȤ߹礻¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤òÈ¿±Ç¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¡¦¥Ä¥ê¡¼¤ËÇÛÃÖ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fI/workspace\fR¤Ë¤¢¤ë¾ì¹ç¡¢\fIcom\&.mysoft\&.mypack\&.MyClass\fR¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤ò¡¢\fI/workspace/com/mysoft/mypack/MyClass\&.java\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤òÈ¿±Ç¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¡¦¥Ä¥ê¡¼¤ËÇÛÃÖ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fB/workspace\fR¤Ë¤¢¤ë¾ì¹ç¡¢\fBcom\&.mysoft\&.mypack\&.MyClass\fR¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤ò¡¢\fB/workspace/com/mysoft/mypack/MyClass\&.java\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢³Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÂбþ¤¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤·¤Þ¤¹¡£\fI\-d\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê̤νÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢³Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÂбþ¤¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤·¤Þ¤¹¡£\fB\-d\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê̤νÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ë¤Ï¡¢¸½ºß¤Î³«È¯´Ä¶­¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëɸ½à¥ª¥×¥·¥ç¥ó¤Î¥»¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì°Ê³°¤ÎÈóɸ½à¥ª¥×¥·¥ç¥ó¤Ï¡¢¸½ºß¤Î²¾ÁÛ¥Þ¥·¥ó¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤Ë¸ÇÍ­¤Î¥ª¥×¥·¥ç¥ó¤Ç¡¢¾­Íè¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£Èóɸ½à¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-X\fR¥ª¥×¥·¥ç¥ó¤Ç»Ï¤Þ¤ê¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ë¤Ï¡¢¸½ºß¤Î³«È¯´Ä¶­¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëɸ½à¥ª¥×¥·¥ç¥ó¤Î¥»¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì°Ê³°¤ÎÈóɸ½à¥ª¥×¥·¥ç¥ó¤Ï¡¢¸½ºß¤Î²¾ÁÛ¥Þ¥·¥ó¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤Ë¸ÇÍ­¤Î¥ª¥×¥·¥ç¥ó¤Ç¡¢¾­Íè¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£Èóɸ½à¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-X\fR¥ª¥×¥·¥ç¥ó¤Ç»Ï¤Þ¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -130,7 +132,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .sp + .RS 4 +@@ -141,22 +143,22 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-Èóɸ½à¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Èóɸ½à¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .SS "ɸ½à¥ª¥×¥·¥ç¥ó" + .PP + \-A\fIkey\fR[\fI=value\fR] + .RS 4 +-Ãí¼á¥×¥í¥»¥Ã¥µ¤ËÅϤ¹¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavac\fR¤¬Ä¾Àܲò¼á¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¤½¤ì¤¾¤ì¤Î¥×¥í¥»¥Ã¥µ¤Ç»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£\fIkey\fR¤ÎÃͤϡ¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¼±Ê̻Ҥò¥É¥Ã¥È(\&.)¤Ç¶èÀÚ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++Ãí¼á¥×¥í¥»¥Ã¥µ¤ËÅϤ¹¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavac\fR¤¬Ä¾Àܲò¼á¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¤½¤ì¤¾¤ì¤Î¥×¥í¥»¥Ã¥µ¤Ç»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£\fBkey\fR¤ÎÃͤϡ¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¼±Ê̻Ҥò¥É¥Ã¥È(\&.)¤Ç¶èÀÚ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-cp \fIpath\fR or \-classpath \fIpath\fR + .RS 4 +-¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó(¥ª¥×¥·¥ç¥ó¤Ç)Ãí¼á¥×¥í¥»¥Ã¥µ¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fICLASSPATH\fR¡¢\fI\-cp\fR¡¢\fI\-classpath\fR¤Î¤¤¤º¤ì¤â»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Î\fI¥¯¥é¥¹¡¦¥Ñ¥¹\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ê¤ê¤Þ¤¹¡£Setting the Class Path ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó(¥ª¥×¥·¥ç¥ó¤Ç)Ãí¼á¥×¥í¥»¥Ã¥µ¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fBCLASSPATH\fR¡¢\fB\-cp\fR¡¢\fB\-classpath\fR¤Î¤¤¤º¤ì¤â»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Î\fI¥¯¥é¥¹¡¦¥Ñ¥¹\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ê¤ê¤Þ¤¹¡£Setting the Class Path ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤â¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¸¡º÷¤µ¤ì¤Þ¤¹¡£ ++\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤â¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¸¡º÷¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-processorpath\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢Ãí¼á¥×¥í¥»¥Ã¥µ¤â¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¸¡º÷¤µ¤ì¤Þ¤¹¡£ ++\fB\-processorpath\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢Ãí¼á¥×¥í¥»¥Ã¥µ¤â¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¸¡º÷¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-Djava\&.ext\&.dirs=\fIdirectories\fR +@@ -171,12 +173,12 @@ + .PP + \-d \fIdirectory\fR + .RS 4 +-¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½ÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fIjavac\fR¤Ç¤ÏºîÀ®¤µ¤ì¤Ê¤¤¤¿¤á¡¢¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤Î°ìÉô¤Ç¤¢¤ë¾ì¹ç¡¢\fIjavac\fR¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÈ¿±Ç¤·¤¿¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤·¡¢É¬Íפ˱þ¤¸¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½ÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fBjavac\fR¤Ç¤ÏºîÀ®¤µ¤ì¤Ê¤¤¤¿¤á¡¢¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤Î°ìÉô¤Ç¤¢¤ë¾ì¹ç¡¢\fBjavac\fR¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÈ¿±Ç¤·¤¿¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤·¡¢É¬Íפ˱þ¤¸¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤¹¡£ + .sp +-\fI\-d\fR +-\fI/home/myclasses\fR¤È»ØÄꤷ¡¢¥¯¥é¥¹¤Î̾Á°¤¬\fIcom\&.mypackage\&.MyClass\fR¤Ç¤¢¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï\fI/home/myclasses/com/mypackage/MyClass\&.class\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB\-d\fR ++\fB/home/myclasses\fR¤È»ØÄꤷ¡¢¥¯¥é¥¹¤Î̾Á°¤¬\fBcom\&.mypackage\&.MyClass\fR¤Ç¤¢¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï\fB/home/myclasses/com/mypackage/MyClass\&.class\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-\fI\-d\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fIjavac\fR¤Ï¡¢³Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¤½¤ÎÀ¸À®¸µ¤È¤Ê¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë³ÊǼ¤·¤Þ¤¹¡£ ++\fI\-d\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fBjavac\fR¤Ï¡¢³Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¤½¤ÎÀ¸À®¸µ¤È¤Ê¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë³ÊǼ¤·¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR + \fI\-d\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ë¼«Æ°Åª¤ËÄɲ䵤ì¤Þ¤»¤ó¡£ +@@ -184,12 +186,12 @@ + .PP + \-deprecation + .RS 4 +-Èó¿ä¾©¤Î¥á¥ó¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¹¤¬»ÈÍѤޤ¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤ë¤¿¤Ó¤Ë¡¢ÀâÌÀ¤òɽ¼¨¤·¤Þ¤¹¡£\fI\-deprecation\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavac\fR¤Ï¡¢Èó¿ä¾©¤Î¥á¥ó¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¹¤ò»ÈÍѤޤ¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥µ¥Þ¥ê¡¼¤òɽ¼¨¤·¤Þ¤¹¡£\fI\-deprecation\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-Xlint:deprecation\fR¤Î¾Êάɽµ­¤Ç¤¹¡£ ++Èó¿ä¾©¤Î¥á¥ó¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¹¤¬»ÈÍѤޤ¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤ë¤¿¤Ó¤Ë¡¢ÀâÌÀ¤òɽ¼¨¤·¤Þ¤¹¡£\fB\-deprecation\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavac\fR¤Ï¡¢Èó¿ä¾©¤Î¥á¥ó¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¹¤ò»ÈÍѤޤ¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥µ¥Þ¥ê¡¼¤òɽ¼¨¤·¤Þ¤¹¡£\fB\-deprecation\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-Xlint:deprecation\fR¤Î¾Êάɽµ­¤Ç¤¹¡£ + .RE + .PP + \-encoding \fIencoding\fR + .RS 4 +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°Ì¾(EUC\-JP¤äUTF\-8¤Ê¤É)¤òÀßÄꤷ¤Þ¤¹¡£\fI\-encoding\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥Ð¡¼¥¿¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°Ì¾(EUC\-JP¤äUTF\-8¤Ê¤É)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-encoding\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥Ð¡¼¥¿¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \-endorseddirs \fIdirectories\fR +@@ -199,7 +201,7 @@ + .PP + \-extdirs \fIdirectories\fR + .RS 4 +-\fIext\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î°ÌÃÖ¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£directoriesÊÑ¿ô¤Ë¤Ï¡¢¥³¥í¥ó¤Ç¶èÀڤ俥ǥ£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î³ÆJAR¥Õ¥¡¥¤¥ë¤«¤é¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£¸¡½Ð¤µ¤ì¤¿¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î°ìÉô¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBext\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î°ÌÃÖ¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£directoriesÊÑ¿ô¤Ë¤Ï¡¢¥³¥í¥ó¤Ç¶èÀڤ俥ǥ£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î³ÆJAR¥Õ¥¡¥¤¥ë¤«¤é¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£¸¡½Ð¤µ¤ì¤¿¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î°ìÉô¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + ¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë(°Û¤Ê¤ëJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¼ÂÁõ¤µ¤ì¤¿¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ä³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¾ÜºÙ¤Ï¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE +@@ -241,30 +243,30 @@ + .PP + \-implicit:[\fIclass, none\fR] + .RS 4 +-°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤òÀ©¸æ¤·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¼«Æ°À¸À®¤¹¤ë¤Ë¤Ï¡¢\fI\-implicit:class\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤òÍÞÀ©¤¹¤ë¤Ë¤Ï¡¢\fI\-implicit:none\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤Ï¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¼«Æ°À¸À®¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤Î¾ì¹ç¡¢¤½¤Î¤è¤¦¤Ê¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿»þ¤ËÃí¼á½èÍý¤â¼Â¹Ô¤µ¤ì¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤«¤é·Ù¹ð¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤¬ÌÀ¼¨Åª¤ËÀßÄꤵ¤ì¤¿¾ì¹ç¡¢·Ù¹ð¤Ïȯ¹Ô¤µ¤ì¤Þ¤»¤ó¡£·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤òÀ©¸æ¤·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¼«Æ°À¸À®¤¹¤ë¤Ë¤Ï¡¢\fB\-implicit:class\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤òÍÞÀ©¤¹¤ë¤Ë¤Ï¡¢\fB\-implicit:none\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤Ï¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¼«Æ°À¸À®¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤Î¾ì¹ç¡¢¤½¤Î¤è¤¦¤Ê¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿»þ¤ËÃí¼á½èÍý¤â¼Â¹Ô¤µ¤ì¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤«¤é·Ù¹ð¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤¬ÌÀ¼¨Åª¤ËÀßÄꤵ¤ì¤¿¾ì¹ç¡¢·Ù¹ð¤Ïȯ¹Ô¤µ¤ì¤Þ¤»¤ó¡£·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine (JVM)¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fBÃí°Õ:\fR +-\fICLASSPATH\fR¡¢\fI\-classpath\fR¡¢\fI\-bootclasspath\fR¤ª¤è¤Ó\fI\-extdirs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavac\fR¤Î¼Â¹Ô¤Ë»ÈÍѤµ¤ì¤ë¥¯¥é¥¹¤ò»ØÄꤷ¤Þ¤»¤ó¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÊÑ¿ô¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤ò¥«¥¹¥¿¥Þ¥¤¥º¤·¤è¤¦¤È¤¹¤ë¤È¡¢¥ê¥¹¥¯¤¬¹â¤¯¡¢Â¿¤¯¤Î¾ì¹ç¡¢É¬ÍפʽèÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤ò¥«¥¹¥¿¥Þ¥¤¥º¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢´ðÁäȤʤëJavaµ¯Æ°¥Ä¡¼¥ë¤Ë¥ª¥×¥·¥ç¥ó¤òÅϤ·¤Þ¤¹¡£ ++\fICLASSPATH\fR¡¢\fB\-classpath\fR¡¢\fB\-bootclasspath\fR¤ª¤è¤Ó\fB\-extdirs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavac\fR¤Î¼Â¹Ô¤Ë»ÈÍѤµ¤ì¤ë¥¯¥é¥¹¤ò»ØÄꤷ¤Þ¤»¤ó¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÊÑ¿ô¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤ò¥«¥¹¥¿¥Þ¥¤¥º¤·¤è¤¦¤È¤¹¤ë¤È¡¢¥ê¥¹¥¯¤¬¹â¤¯¡¢Â¿¤¯¤Î¾ì¹ç¡¢É¬ÍפʽèÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤ò¥«¥¹¥¿¥Þ¥¤¥º¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢´ðÁäȤʤëJavaµ¯Æ°¥Ä¡¼¥ë¤Ë¥ª¥×¥·¥ç¥ó¤òÅϤ·¤Þ¤¹¡£ + .RE + .PP + \-nowarn + .RS 4 +-·Ù¹ð¥á¥Ã¥»¡¼¥¸¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-Xlint:none\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹¡£ ++·Ù¹ð¥á¥Ã¥»¡¼¥¸¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-Xlint:none\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹¡£ + .RE + .PP + \-parameters + .RS 4 +-¥ê¥Õ¥ì¥¯¥·¥ç¥óAPI¤Î¥á¥½¥Ã¥É\fIjava\&.lang\&.reflect\&.Executable\&.getParameters\fR¤¬¼èÆÀ¤Ç¤­¤ë¤è¤¦¤Ë¡¢À¸À®¤µ¤ì¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤È¥á¥½¥Ã¥É¤Î²¾¥Ñ¥é¥á¡¼¥¿Ì¾¤ò³ÊǼ¤·¤Þ¤¹¡£ ++¥ê¥Õ¥ì¥¯¥·¥ç¥óAPI¤Î¥á¥½¥Ã¥É\fBjava\&.lang\&.reflect\&.Executable\&.getParameters\fR¤¬¼èÆÀ¤Ç¤­¤ë¤è¤¦¤Ë¡¢À¸À®¤µ¤ì¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤È¥á¥½¥Ã¥É¤Î²¾¥Ñ¥é¥á¡¼¥¿Ì¾¤ò³ÊǼ¤·¤Þ¤¹¡£ + .RE + .PP + \-proc: [\fInone\fR, \fIonly\fR] + .RS 4 +-Ãí¼á½èÍý¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥ë¤ò¼Â¹Ô¤¹¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹¡£\fI\-proc:none\fR¤Ï¡¢Ãí¼á½èÍý¤Ê¤·¤Ç¥³¥ó¥Ñ¥¤¥ë¤¬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fI\-proc:only\fR¤Ï¡¢Ãí¼á½èÍý¤Î¤ß¤¬¼Â¹Ô¤µ¤ì¡¢¸å³¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï¤Þ¤Ã¤¿¤¯¼Â¹Ô¤µ¤ì¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++Ãí¼á½èÍý¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥ë¤ò¼Â¹Ô¤¹¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹¡£\fB\-proc:none\fR¤Ï¡¢Ãí¼á½èÍý¤Ê¤·¤Ç¥³¥ó¥Ñ¥¤¥ë¤¬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fB\-proc:only\fR¤Ï¡¢Ãí¼á½èÍý¤Î¤ß¤¬¼Â¹Ô¤µ¤ì¡¢¸å³¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï¤Þ¤Ã¤¿¤¯¼Â¹Ô¤µ¤ì¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .RE + .PP + \-processor \fIclass1\fR [,\fIclass2\fR,\fIclass3\fR\&.\&.\&.] +@@ -279,14 +281,14 @@ + .PP + \-s \fIdir\fR + .RS 4 +-À¸À®¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î³ÊǼÀè¤È¤Ê¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fIjavac\fR¤Ç¤ÏºîÀ®¤µ¤ì¤Ê¤¤¤¿¤á¡¢¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤Î°ìÉô¤Ç¤¢¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÈ¿±Ç¤·¤¿¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤·¡¢É¬Íפ˱þ¤¸¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤¹¡£ ++À¸À®¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î³ÊǼÀè¤È¤Ê¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fBjavac\fR¤Ç¤ÏºîÀ®¤µ¤ì¤Ê¤¤¤¿¤á¡¢¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤Î°ìÉô¤Ç¤¢¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÈ¿±Ç¤·¤¿¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤·¡¢É¬Íפ˱þ¤¸¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤¹¡£ + .sp +-\fI\-s /home/mysrc\fR¤È»ØÄꤷ¡¢¥¯¥é¥¹¤Î̾Á°¤¬\fIcom\&.mypackage\&.MyClass\fR¤Ç¤¢¤ë¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï\fI/home/mysrc/com/mypackage/MyClass\&.java\fR¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ ++\fB\-s /home/mysrc\fR¤È»ØÄꤷ¡¢¥¯¥é¥¹¤Î̾Á°¤¬\fBcom\&.mypackage\&.MyClass\fR¤Ç¤¢¤ë¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï\fB/home/mysrc/com/mypackage/MyClass\&.java\fR¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-source \fIrelease\fR + .RS 4 +-¼õ¤±ÉÕ¤±¤ë¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fIrelease\fR¤Ë¤Ï¼¡¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¼õ¤±ÉÕ¤±¤ë¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fBrelease\fR¤Ë¤Ï¼¡¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .PP + 1\&.3 + .RS 4 +@@ -320,13 +322,23 @@ + .PP + 1\&.7 + .RS 4 +-¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥ÈÃͤǤ¹¡£Java SE 7¤ÇƳÆþ¤µ¤ì¤¿µ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ ++Java SE 7¤ÇƳÆþ¤µ¤ì¤¿µ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ + .RE + .PP + 7 + .RS 4 + 1\&.7¤ÈƱµÁ¤Ç¤¹¡£ + .RE ++.PP ++1\&.8 ++.RS 4 ++¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥ÈÃͤǤ¹¡£Java SE 8¤ÇƳÆþ¤µ¤ì¤¿µ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ ++.RE ++.PP ++8 ++.RS 4 ++1\&.8¤ÈƱµÁ¤Ç¤¹¡£ ++.RE + .RE + .PP + \-sourcepath \fIsourcepath\fR +@@ -358,13 +370,13 @@ + .RE + .SS "¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó" + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¹¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï¡¢\fIjavac\fR¤¬ÅºÉÕ¤µ¤ì¤Æ¤¤¤ë¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ª¤è¤Ó³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢\fIjavac\fR¤Ï¡¢°Û¤Ê¤ëJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¼ÂÁõ¤µ¤ì¤¿¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ª¤è¤Ó³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¤â¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦¾ì¹ç¤Ï¡¢\fI\-bootclasspath\fR¤ª¤è¤Ó\fI\-extdirs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¹¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï¡¢\fBjavac\fR¤¬ÅºÉÕ¤µ¤ì¤Æ¤¤¤ë¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ª¤è¤Ó³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢\fBjavac\fR¤Ï¡¢°Û¤Ê¤ëJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¼ÂÁõ¤µ¤ì¤¿¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ª¤è¤Ó³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¤â¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦¾ì¹ç¤Ï¡¢\fB\-bootclasspath\fR¤ª¤è¤Ó\fB\-extdirs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£ + .PP + \-target \fIversion\fR + .RS 4 +-²¾ÁÛ¥Þ¥·¥ó¤Î»ØÄꤵ¤ì¤¿¥ê¥ê¡¼¥¹¤òÂоݤȤ¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢»ØÄꤵ¤ì¤¿¥¿¡¼¥²¥Ã¥È°Ê¹ß¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÆ°ºî¤·¤Þ¤¹¤¬¡¢¤½¤ì¤è¤êÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJVM¤Ç¤ÏÆ°ºî¤·¤Þ¤»¤ó¡£Í­¸ú¤Ê¥¿¡¼¥²¥Ã¥È¤Ï¡¢1\&.1¡¢1\&.2¡¢1\&.3¡¢1\&.4¡¢1\&.5 (5¤â²Ä)¡¢1\&.6 (6¤â²Ä)¤ª¤è¤Ó1\&.7 (7¤â²Ä)¤Ç¤¹¡£ ++²¾ÁÛ¥Þ¥·¥ó¤Î»ØÄꤵ¤ì¤¿¥ê¥ê¡¼¥¹¤òÂоݤȤ¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢»ØÄꤵ¤ì¤¿¥¿¡¼¥²¥Ã¥È°Ê¹ß¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÆ°ºî¤·¤Þ¤¹¤¬¡¢¤½¤ì¤è¤êÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJVM¤Ç¤ÏÆ°ºî¤·¤Þ¤»¤ó¡£Í­¸ú¤Ê¥¿¡¼¥²¥Ã¥È¤Ï¡¢1\&.1¡¢1\&.2¡¢1\&.3¡¢1\&.4¡¢1\&.5 (5¤â²Ä)¡¢1\&.6 (6¤â²Ä)¡¢1\&.7 (7¤â²Ä)¤ª¤è¤Ó1\&.8 (8¤â²Ä)¤Ç¤¹¡£ + .sp +-\fI\-target\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¡¢\fI\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤè¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ ++\fB\-target\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¡¢\fB\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤè¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -374,7 +386,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.7¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.8¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -385,7 +397,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.2¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.4¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.2¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.4¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -396,7 +408,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.3¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.4¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.3¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.4¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -407,7 +419,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.5¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.7¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.5¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.8¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -418,7 +430,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.6¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.7¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.6¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.8¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -429,7 +441,18 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤Î¾¤Î¤¹¤Ù¤Æ¤ÎÃͤξì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢\fI\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤʤê¤Þ¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.7¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.8¤Ç¤¹¡£ ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤Î¾¤Î¤¹¤Ù¤Æ¤ÎÃͤξì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢\fB\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤʤê¤Þ¤¹¡£ + .RE + .RE + .PP +@@ -439,9 +462,9 @@ + .RE + .SS "¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó" + .PP +-JDK 8°Ê¹ß¤«¤é¡¢\fIjavac\fR¥³¥ó¥Ñ¥¤¥é¤Ï¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤È¡¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥àÁ´ÂΤòɬÍפȤ·¤Ê¤¤¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¥Ç¥×¥í¥¤²Äǽ¤Ç¡¢¾®¤µ¤¤¥Õ¥Ã¥È¥×¥ê¥ó¥È¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ëµ¡Ç½¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¹¥È¥¢¤«¤é¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤òû½Ì¤¹¤ë¤Î¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Îµ¡Ç½¤Ï¡¢JRE¤ò¥Ð¥ó¥É¥ë¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¡¢¤è¤ê¥³¥ó¥Ñ¥¯¥È¤Ê¥Ç¥×¥í¥¤¥á¥ó¥È¤ËÌòΩ¤Á¤Þ¤¹¡£¤³¤Îµ¡Ç½¤Ï¡¢¾®¤µ¤¤¥Ç¥Ð¥¤¥¹¤Ç¤âÌòΩ¤Á¤Þ¤¹¡£ ++JDK 8°Ê¹ß¤«¤é¡¢\fBjavac\fR¥³¥ó¥Ñ¥¤¥é¤Ï¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤È¡¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥àÁ´ÂΤòɬÍפȤ·¤Ê¤¤¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¥Ç¥×¥í¥¤²Äǽ¤Ç¡¢¾®¤µ¤¤¥Õ¥Ã¥È¥×¥ê¥ó¥È¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ëµ¡Ç½¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¹¥È¥¢¤«¤é¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤òû½Ì¤¹¤ë¤Î¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Îµ¡Ç½¤Ï¡¢JRE¤ò¥Ð¥ó¥É¥ë¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¡¢¤è¤ê¥³¥ó¥Ñ¥¯¥È¤Ê¥Ç¥×¥í¥¤¥á¥ó¥È¤ËÌòΩ¤Á¤Þ¤¹¡£¤³¤Îµ¡Ç½¤Ï¡¢¾®¤µ¤¤¥Ç¥Ð¥¤¥¹¤Ç¤âÌòΩ¤Á¤Þ¤¹¡£ + .PP +-¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥×¥í¥Õ¥¡¥¤¥ëÃͤϡ¢\fIcompact1\fR¡¢\fIcompact2\fR¤ª¤è¤Ó\fIcompact3\fR¤Ç¤¹¡£¤³¤ì¤é¤Ï¡¢ÄɲäΥ쥤¥ä¡¼¤Ç¤¹¡£Â礭¤¤ÈÖ¹æ¤Î³Æ¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¾®¤µ¤¤ÈÖ¹æ¤Î̾Á°¤Î¥×¥í¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎAPI¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥×¥í¥Õ¥¡¥¤¥ëÃͤϡ¢\fBcompact1\fR¡¢\fBcompact2\fR¤ª¤è¤Ó\fBcompact3\fR¤Ç¤¹¡£¤³¤ì¤é¤Ï¡¢ÄɲäΥ쥤¥ä¡¼¤Ç¤¹¡£Â礭¤¤ÈÖ¹æ¤Î³Æ¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¾®¤µ¤¤ÈÖ¹æ¤Î̾Á°¤Î¥×¥í¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎAPI¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .PP + \-profile + .RS 4 +@@ -451,7 +474,8 @@ + .RS 4 + .\} + .nf +-javac \-profile compact1 Hello\&.java ++\fBjavac \-profile compact1 Hello\&.java\fR ++ + .fi + .if n \{\ + .RE +@@ -462,17 +486,18 @@ + .RS 4 + .\} + .nf +-cd jdk1\&.8\&.0/bin +-\&./javac \-profile compact1 Paint\&.java +-Paint\&.java:5: error: Applet is not available in profile \*(Aqcompact1\*(Aq +-import java\&.applet\&.Applet; ++\fBcd jdk1\&.8\&.0/bin\fR ++\fB\&./javac \-profile compact1 Paint\&.java\fR ++\fBPaint\&.java:5: error: Applet is not available in profile \*(Aqcompact1\*(Aq\fR ++\fBimport java\&.applet\&.Applet;\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIApplet\fR¥¯¥é¥¹¤ò»ÈÍѤ·¤Ê¤¤¤è¤¦¤Ë¥½¡¼¥¹¤òÊѹ¹¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¨¥é¡¼¤ò½¤Àµ¤Ç¤­¤Þ¤¹¡£\-profile¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¨¥é¡¼¤ò½¤Àµ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë¤Ï¡¢Java SE API¤Î´°Á´¤Ê¥»¥Ã¥È¤ËÂФ·¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£(¤É¤Î¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤Ë¤â¡¢\fIApplet\fR¥¯¥é¥¹¤Ï´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£) ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBApplet\fR¥¯¥é¥¹¤ò»ÈÍѤ·¤Ê¤¤¤è¤¦¤Ë¥½¡¼¥¹¤òÊѹ¹¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¨¥é¡¼¤ò½¤Àµ¤Ç¤­¤Þ¤¹¡£\-profile¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¨¥é¡¼¤ò½¤Àµ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë¤Ï¡¢Java SE API¤Î´°Á´¤Ê¥»¥Ã¥È¤ËÂФ·¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£(¤É¤Î¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤Ë¤â¡¢\fBApplet\fR¥¯¥é¥¹¤Ï´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£) + .sp +-¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤á¤ÎÊ̤ÎÊýË¡¤È¤·¤Æ¡¢\fI\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥×¥í¥Õ¥¡¥¤¥ë¤Î¥¤¥á¡¼¥¸¤ò»ØÄꤹ¤ë\fIrt\&.jar\fR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤«¤ï¤ê¤Ë\fI\-profile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥×¥í¥Õ¥¡¥¤¥ë¡¦¥¤¥á¡¼¥¸¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥·¥¹¥Æ¥à¾å¤Ë¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë»þ¤ËÌòΩ¤Á¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤á¤ÎÊ̤ÎÊýË¡¤È¤·¤Æ¡¢\fB\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥×¥í¥Õ¥¡¥¤¥ë¤Î¥¤¥á¡¼¥¸¤ò»ØÄꤹ¤ë\fBrt\&.jar\fR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤«¤ï¤ê¤Ë\fB\-profile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥×¥í¥Õ¥¡¥¤¥ë¡¦¥¤¥á¡¼¥¸¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥·¥¹¥Æ¥à¾å¤Ë¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë»þ¤ËÌòΩ¤Á¤Þ¤¹¡£ + .RE + .SS "Èóɸ½à¥ª¥×¥·¥ç¥ó" + .PP +@@ -493,15 +518,16 @@ + .PP + \-Xdoclint:[\-]\fIgroup\fR [\fI/access\fR] + .RS 4 +-\fIgroup\fR¤ÎÃͤ¬\fIaccessibility\fR¡¢\fIsyntax\fR¡¢\fIreference\fR¡¢\fIhtml\fR¤Þ¤¿¤Ï\fImissing\fR¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ëÆÃÄê¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤òÍ­¸ú¤Þ¤¿¤Ï̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤Î¾ÜºÙ¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fIgroup\fR¤ÎÃͤ¬\fBaccessibility\fR¡¢\fBsyntax\fR¡¢\fBreference\fR¡¢\fBhtml\fR¤Þ¤¿¤Ï\fBmissing\fR¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ëÆÃÄê¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤òÍ­¸ú¤Þ¤¿¤Ï̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤Î¾ÜºÙ¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-ÊÑ¿ô\fIaccess\fR¤Ï¡¢\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤¬¥Á¥§¥Ã¥¯¤¹¤ë¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤ÎºÇ¾®¤Î²Ä»ëÀ­¥ì¥Ù¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fIpublic\fR¡¢\fIprotected\fR¡¢\fIpackage\fR¤ª¤è¤Ó\fIprivate\fR¤ÎÃÍ(²Ä»ëÀ­¤Î¹â¤¤½ç)¤Î1¤Ä¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢(protected¡¢package¡¢public¤ò´Þ¤à) protected°Ê¾å¤Î¥¢¥¯¥»¥¹¡¦¥ì¥Ù¥ë¤ò»ý¤Ä¥¯¥é¥¹¤ª¤è¤Ó¥á¥ó¥Ð¡¼¤ò(¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤Ç)¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ ++ÊÑ¿ô\fIaccess\fR¤Ï¡¢\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤¬¥Á¥§¥Ã¥¯¤¹¤ë¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤ÎºÇ¾®¤Î²Ä»ëÀ­¥ì¥Ù¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fBpublic\fR¡¢\fBprotected\fR¡¢\fBpackage\fR¤ª¤è¤Ó\fBprivate\fR¤ÎÃÍ(²Ä»ëÀ­¤Î¹â¤¤½ç)¤Î1¤Ä¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢(protected¡¢package¡¢public¤ò´Þ¤à) protected°Ê¾å¤Î¥¢¥¯¥»¥¹¡¦¥ì¥Ù¥ë¤ò»ý¤Ä¥¯¥é¥¹¤ª¤è¤Ó¥á¥ó¥Ð¡¼¤ò(¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤Ç)¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-Xdoclint:all/protected ++\fB\-Xdoclint:all/protected\fR ++ + .fi + .if n \{\ + .RE +@@ -512,7 +538,8 @@ + .RS 4 + .\} + .nf +-\-Xdoclint:all,\-html/package ++\fB\-Xdoclint:all,\-html/package\fR ++ + .fi + .if n \{\ + .RE +@@ -551,7 +578,7 @@ + .PP + \-Xlint:\fI\-name\fR + .RS 4 +-·Ù¹ð̾¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç̵¸ú¤Ë¤Ç¤­¤ë·Ù¹ð¤Î¥ê¥¹¥È¤ò¼èÆÀ¤¹¤ë¤Ë¤Ï¡¢\-Xlint¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿·Ù¹ð¤ÎÍ­¸ú²½¤Þ¤¿¤Ï̵¸ú²½\-Xlint\fI¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++·Ù¹ð̾¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç̵¸ú¤Ë¤Ç¤­¤ë·Ù¹ð¤Î¥ê¥¹¥È¤ò¼èÆÀ¤¹¤ë¤Ë¤Ï¡¢\-Xlint¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿·Ù¹ð¤ÎÍ­¸ú²½¤Þ¤¿¤Ï̵¸ú²½\-Xlint\fB¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xmaxerrs \fInumber\fR +@@ -566,34 +593,34 @@ + .PP + \-Xstdout \fIfilename\fR + .RS 4 +-¥³¥ó¥Ñ¥¤¥é¤Î¥á¥Ã¥»¡¼¥¸¤ò¡¢»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÁ÷¿®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¥á¥Ã¥»¡¼¥¸¤Ï\fISystem\&.err\fR¤ËÁ÷¤é¤ì¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Î¥á¥Ã¥»¡¼¥¸¤ò¡¢»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÁ÷¿®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¥á¥Ã¥»¡¼¥¸¤Ï\fBSystem\&.err\fR¤ËÁ÷¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-Xprefer:[\fInewer,source\fR] + .RS 4 +-¤¢¤ë·¿¤ËÂФ·¤Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¤É¤Á¤é¤Î¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ë¤«¤ò»ØÄꤷ¤Þ¤¹¡£(·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£\fI\-Xprefer:newer\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¤¢¤ë·¿¤ËÂФ¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¦¤Á¿·¤·¤¤Êý¤¬Æɤ߼è¤é¤ì¤Þ¤¹(¥Ç¥Õ¥©¥ë¥È)¡£\fI\-Xprefer:source\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Æɤ߼è¤é¤ì¤Þ¤¹¡£\fISOURCE\fR¤ÎÊݸ¥Ý¥ê¥·¡¼¤ò»ÈÍѤ·¤ÆÀë¸À¤µ¤ì¤¿Ãí¼á¤ËǤ°Õ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤¬¥¢¥¯¥»¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¾ì¹ç¤Ï¡¢\fI\-Xprefer:source\fR¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ ++¤¢¤ë·¿¤ËÂФ·¤Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¤É¤Á¤é¤Î¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ë¤«¤ò»ØÄꤷ¤Þ¤¹¡£(·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£\fB\-Xprefer:newer\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¤¢¤ë·¿¤ËÂФ¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¦¤Á¿·¤·¤¤Êý¤¬Æɤ߼è¤é¤ì¤Þ¤¹(¥Ç¥Õ¥©¥ë¥È)¡£\fB\-Xprefer:source\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Æɤ߼è¤é¤ì¤Þ¤¹¡£\fBSOURCE\fR¤ÎÊݸ¥Ý¥ê¥·¡¼¤ò»ÈÍѤ·¤ÆÀë¸À¤µ¤ì¤¿Ãí¼á¤ËǤ°Õ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤¬¥¢¥¯¥»¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¾ì¹ç¤Ï¡¢\fB\-Xprefer:source\fR¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xpkginfo:[\fIalways\fR,\fIlegacy\fR,\fInonempty\fR] + .RS 4 +-javac¤¬package\-info\&.java¥Õ¥¡¥¤¥ë¤«¤é\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¤«¤É¤¦¤«¤òÀ©¸æ¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç»ÈÍѲÄǽ¤Êmode°ú¿ô¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ ++javac¤¬package\-info\&.java¥Õ¥¡¥¤¥ë¤«¤é\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¤«¤É¤¦¤«¤òÀ©¸æ¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç»ÈÍѲÄǽ¤Êmode°ú¿ô¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP + always + .RS 4 +-¤¹¤Ù¤Æ¤Î\fIpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Î\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤ò¾ï¤ËÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢³Æ\fI\&.java\fR¥Õ¥¡¥¤¥ë¤ËÂбþ¤¹¤ë\fI\&.class\fR¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ëAnt¤Ê¤É¤Î¥Ó¥ë¥É¡¦¥·¥¹¥Æ¥à¤ò»ÈÍѤ¹¤ë¾ì¹ç¤ËÌòΩ¤Ä¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ++¤¹¤Ù¤Æ¤Î\fBpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Î\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤ò¾ï¤ËÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢³Æ\fB\&.java\fR¥Õ¥¡¥¤¥ë¤ËÂбþ¤¹¤ë\fB\&.class\fR¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ëAnt¤Ê¤É¤Î¥Ó¥ë¥É¡¦¥·¥¹¥Æ¥à¤ò»ÈÍѤ¹¤ë¾ì¹ç¤ËÌòΩ¤Ä¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + legacy + .RS 4 +-package\-info\&.java¤ËÃí¼á¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Î¤ß\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£package\-info\&.java¤Ë¥³¥á¥ó¥È¤Î¤ß´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤»¤ó¡£ ++package\-info\&.java¤ËÃí¼á¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Î¤ß\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£package\-info\&.java¤Ë¥³¥á¥ó¥È¤Î¤ß´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤»¤ó¡£ + .sp + \fBÃí°Õ:\fR +-\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤ÏÀ¸À®¤Ç¤­¤Þ¤¹¤¬¡¢package\-info\&.java¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎÃí¼á¤Ë\fIRetentionPolicy\&.SOURCE\fR¤¬¤¢¤ë¾ì¹ç¤Ï¶õ¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤ÏÀ¸À®¤Ç¤­¤Þ¤¹¤¬¡¢package\-info\&.java¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎÃí¼á¤Ë\fBRetentionPolicy\&.SOURCE\fR¤¬¤¢¤ë¾ì¹ç¤Ï¶õ¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + nonempty + .RS 4 +-package\-info\&.java¤Ë\fIRetentionPolicy\&.CLASS\fR¤Þ¤¿¤Ï\fIRetentionPolicy\&.RUNTIME\fR¤È¤È¤â¤ËÃí¼á¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Î¤ß\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ ++package\-info\&.java¤Ë\fBRetentionPolicy\&.CLASS\fR¤Þ¤¿¤Ï\fBRetentionPolicy\&.RUNTIME\fR¤È¤È¤â¤ËÃí¼á¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Î¤ß\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .RE + .PP +@@ -613,7 +640,7 @@ + .RE + .SH "-XLINT¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿·Ù¹ð¤ÎÍ­¸ú²½¤Þ¤¿¤Ï̵¸ú²½" + .PP +-\fI\-Xlint:name\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ·Ù¹ð\fIname\fR¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤³¤Ç¡¢\fIname\fR¤Ï¼¡¤Î·Ù¹ð̾¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\-Xlint:\-name:\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢·Ù¹ð¤ò̵¸ú²½¤Ç¤­¤Þ¤¹¡£ ++\fB\-Xlint:name\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ·Ù¹ð\fIname\fR¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤³¤Ç¡¢\fBname\fR¤Ï¼¡¤Î·Ù¹ð̾¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\-Xlint:\-name:\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢·Ù¹ð¤ò̵¸ú²½¤Ç¤­¤Þ¤¹¡£ + .PP + cast + .RS 4 +@@ -623,7 +650,8 @@ + .RS 4 + .\} + .nf +-String s = (String) "Hello!" ++\fBString s = (String) "Hello!"\fR ++ + .fi + .if n \{\ + .RE +@@ -643,29 +671,31 @@ + .RS 4 + .\} + .nf +-java\&.util\&.Date myDate = new java\&.util\&.Date(); +-int currentDay = myDate\&.getDay(); ++\fBjava\&.util\&.Date myDate = new java\&.util\&.Date();\fR ++\fBint currentDay = myDate\&.getDay();\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥á¥½¥Ã¥É\fIjava\&.util\&.Date\&.getDay\fR¤ÏJDK 1\&.1°Ê¹ß¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ ++¥á¥½¥Ã¥É\fBjava\&.util\&.Date\&.getDay\fR¤ÏJDK 1\&.1°Ê¹ß¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ + .RE + .PP + dep\-ann + .RS 4 +-\fI@deprecated\fR +-Javadoc¥³¥á¥ó¥È¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Æ¤¤¤ë¤¬¡¢\fI@Deprecated\fRÃí¼á¤¬ÉÕ¤¤¤Æ¤¤¤Ê¤¤¹àÌܤˤĤ¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB@deprecated\fR ++Javadoc¥³¥á¥ó¥È¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Æ¤¤¤ë¤¬¡¢\fB@Deprecated\fRÃí¼á¤¬ÉÕ¤¤¤Æ¤¤¤Ê¤¤¹àÌܤˤĤ¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * @deprecated As of Java SE 7, replaced by {@link #newMethod()} +- */ +-public static void deprecatedMethood() { } +-public static void newMethod() { } ++\fB/**\fR ++\fB * @deprecated As of Java SE 7, replaced by {@link #newMethod()}\fR ++\fB */\fR ++\fBpublic static void deprecatedMethood() { }\fR ++\fBpublic static void newMethod() { }\fR ++ + .fi + .if n \{\ + .RE +@@ -680,7 +710,8 @@ + .RS 4 + .\} + .nf +-int divideByZero = 42 / 0; ++\fBint divideByZero = 42 / 0;\fR ++ + .fi + .if n \{\ + .RE +@@ -689,17 +720,18 @@ + .PP + empty + .RS 4 +-\fIif \fRʸ°Ê¹ß¤¬¶õ¤Îʸ¤Ç¤¢¤ë¤³¤È¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBif \fRʸ°Ê¹ß¤¬¶õ¤Îʸ¤Ç¤¢¤ë¤³¤È¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-class E { +- void m() { +- if (true) ; +- } +-} ++\fBclass E {\fR ++\fB void m() {\fR ++\fB if (true) ;\fR ++\fB }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -714,48 +746,50 @@ + .RS 4 + .\} + .nf +-switch (x) { +-case 1: +- System\&.out\&.println("1"); +- // No break statement here\&. +-case 2: +- System\&.out\&.println("2"); +-} ++\fBswitch (x) {\fR ++\fBcase 1:\fR ++\fB System\&.out\&.println("1");\fR ++\fB // No break statement here\&.\fR ++\fBcase 2:\fR ++\fB System\&.out\&.println("2");\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥³¡¼¥É¤Î¥³¥ó¥Ñ¥¤¥ë»þ¤Ë\fI\-Xlint:fallthrough\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢ÌäÂê¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥±¡¼¥¹¤Î¹ÔÈÖ¹æ¤È¤È¤â¤Ë¡¢case¤Ëfall\-through¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤³¤È¤ò¼¨¤¹·Ù¹ð¤òȯ¹Ô¤·¤Þ¤¹¡£ ++¤³¤Î¥³¡¼¥É¤Î¥³¥ó¥Ñ¥¤¥ë»þ¤Ë\fB\-Xlint:fallthrough\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢ÌäÂê¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥±¡¼¥¹¤Î¹ÔÈÖ¹æ¤È¤È¤â¤Ë¡¢case¤Ëfall\-through¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤³¤È¤ò¼¨¤¹·Ù¹ð¤òȯ¹Ô¤·¤Þ¤¹¡£ + .RE + .PP + finally + .RS 4 +-Àµ¾ï¤Ë´°Î»¤Ç¤­¤Ê¤¤\fIfinally\fR¶ç¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++Àµ¾ï¤Ë´°Î»¤Ç¤­¤Ê¤¤\fBfinally\fR¶ç¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public static int m() { +- try { +- throw new NullPointerException(); +- } catch (NullPointerException(); { +- System\&.err\&.println("Caught NullPointerException\&."); +- return 1; +- } finally { +- return 0; +- } +- } ++\fBpublic static int m() {\fR ++\fB try {\fR ++\fB throw new NullPointerException();\fR ++\fB } catch (NullPointerException(); {\fR ++\fB System\&.err\&.println("Caught NullPointerException\&.");\fR ++\fB return 1;\fR ++\fB } finally {\fR ++\fB return 0;\fR ++\fB }\fR ++\fB }\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÎã¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fIfinally\fR¥Ö¥í¥Ã¥¯¤Ë´Ø¤¹¤ë·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£\fIint\fR¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢ÃÍ0¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£\fIfinally\fR¥Ö¥í¥Ã¥¯¤Ï¡¢\fItry\fR¥Ö¥í¥Ã¥¯¤¬½ªÎ»¤¹¤ë¤È¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢À©¸æ¤¬\fIcatch\fR¥Ö¥í¥Ã¥¯¤Ë°Ü¤µ¤ì¤¿¾ì¹ç¡¢\fIint\fR¥á¥½¥Ã¥É¤Ï½ªÎ»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fIfinally\fR¥Ö¥í¥Ã¥¯¤Ï¼Â¹Ô¤µ¤ì¤ëɬÍפ¬¤¢¤ë¤¿¤á¡¢À©¸æ¤¬¥á¥½¥Ã¥É¤Î³°Éô¤Ë°Ü¤µ¤ì¤Æ¤¤¤Æ¤â¡¢¤³¤Î¥Ö¥í¥Ã¥¯¤Ï¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fBfinally\fR¥Ö¥í¥Ã¥¯¤Ë´Ø¤¹¤ë·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£\fBint\fR¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢ÃÍ0¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£\fBfinally\fR¥Ö¥í¥Ã¥¯¤Ï¡¢\fBtry\fR¥Ö¥í¥Ã¥¯¤¬½ªÎ»¤¹¤ë¤È¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢À©¸æ¤¬\fBcatch\fR¥Ö¥í¥Ã¥¯¤Ë°Ü¤µ¤ì¤¿¾ì¹ç¡¢\fBint\fR¥á¥½¥Ã¥É¤Ï½ªÎ»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fBfinally\fR¥Ö¥í¥Ã¥¯¤Ï¼Â¹Ô¤µ¤ì¤ëɬÍפ¬¤¢¤ë¤¿¤á¡¢À©¸æ¤¬¥á¥½¥Ã¥É¤Î³°Éô¤Ë°Ü¤µ¤ì¤Æ¤¤¤Æ¤â¡¢¤³¤Î¥Ö¥í¥Ã¥¯¤Ï¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + options + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Î»ÈÍѤ˴ؤ¹¤ëÌäÂê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Î»ÈÍѤ˴ؤ¹¤ëÌäÂê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + overrides +@@ -766,14 +800,15 @@ + .RS 4 + .\} + .nf +-public class ClassWithVarargsMethod { +- void varargsMethod(String\&.\&.\&. s) { } +-} +- +-public class ClassWithOverridingMethod extends ClassWithVarargsMethod { +- @Override +- void varargsMethod(String[] s) { } +-} ++\fBpublic class ClassWithVarargsMethod {\fR ++\fB void varargsMethod(String\&.\&.\&. s) { }\fR ++\fB}\fR ++ ++\fBpublic class ClassWithOverridingMethod extends ClassWithVarargsMethod {\fR ++\fB @Override\fR ++\fB void varargsMethod(String[] s) { }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -784,25 +819,27 @@ + .RS 4 + .\} + .nf +-warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod +-overrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding +-method is missing \*(Aq\&.\&.\&.\*(Aq ++\fBwarning: [override] varargsMethod(String[]) in ClassWithOverridingMethod \fR ++\fBoverrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding\fR ++\fBmethod is missing \*(Aq\&.\&.\&.\*(Aq\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢\fIvarargs\fR¥á¥½¥Ã¥É¤ò¸¡½Ð¤¹¤ë¤È¡¢\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤òÇÛÎó¤ËÊÑ´¹¤·¤Þ¤¹¡£¥á¥½¥Ã¥É\fIClassWithVarargsMethod\&.varargsMethod\fR¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿\fIString\&.\&.\&. s\fR¤ò²¾¥Ñ¥é¥á¡¼¥¿\fIString[] s\fR¤ËÊÑ´¹¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥á¥½¥Ã¥É\fIClassWithOverridingMethod\&.varargsMethod\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤ËÂбþ¤¹¤ëÇÛÎó¤Ç¤¹¡£¤½¤Î·ë²Ì¡¢¤³¤ÎÎã¤Ç¤Ï¥³¥ó¥Ñ¥¤¥ë¤¬¹Ô¤ï¤ì¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢\fBvarargs\fR¥á¥½¥Ã¥É¤ò¸¡½Ð¤¹¤ë¤È¡¢\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤òÇÛÎó¤ËÊÑ´¹¤·¤Þ¤¹¡£¥á¥½¥Ã¥É\fBClassWithVarargsMethod\&.varargsMethod\fR¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿\fBString\&.\&.\&. s\fR¤ò²¾¥Ñ¥é¥á¡¼¥¿\fBString[] s\fR¤ËÊÑ´¹¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥á¥½¥Ã¥É\fBClassWithOverridingMethod\&.varargsMethod\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤ËÂбþ¤¹¤ëÇÛÎó¤Ç¤¹¡£¤½¤Î·ë²Ì¡¢¤³¤ÎÎã¤Ç¤Ï¥³¥ó¥Ñ¥¤¥ë¤¬¹Ô¤ï¤ì¤Þ¤¹¡£ + .RE + .PP + path + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¤Î̵¸ú¤Ê¥Ñ¥¹Í×ÁǤȸºß¤·¤Ê¤¤¥Ñ¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹(¥¯¥é¥¹¡¦¥Ñ¥¹¡¢¥½¡¼¥¹¡¦¥Ñ¥¹¤Ê¤É¤Î¥Ñ¥¹´ØÏ¢)¡£¤³¤Î¤è¤¦¤Ê·Ù¹ð¤ò\fI@SuppressWarnings\fRÃí¼á¤ÇÍÞÀ©¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç¤Î̵¸ú¤Ê¥Ñ¥¹Í×ÁǤȸºß¤·¤Ê¤¤¥Ñ¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹(¥¯¥é¥¹¡¦¥Ñ¥¹¡¢¥½¡¼¥¹¡¦¥Ñ¥¹¤Ê¤É¤Î¥Ñ¥¹´ØÏ¢)¡£¤³¤Î¤è¤¦¤Ê·Ù¹ð¤ò\fB@SuppressWarnings\fRÃí¼á¤ÇÍÞÀ©¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-Xlint:path \-classpath /nonexistentpath Example\&.java ++\fBjavac \-Xlint:path \-classpath /nonexistentpath Example\&.java\fR ++ + .fi + .if n \{\ + .RE +@@ -819,21 +856,22 @@ + .RS 4 + .\} + .nf +-import java\&.util\&.*; +-import javax\&.annotation\&.processing\&.*; +-import javax\&.lang\&.model\&.*; +-import\&.javaz\&.lang\&.model\&.element\&.*; +- +-@SupportedAnnotationTypes("NotAnno") +-public class AnnoProc extends AbstractProcessor { +- public boolean process(Set elems, RoundEnvironment renv){ +- return true; +- } +- +- public SourceVersion getSupportedSourceVersion() { +- return SourceVersion\&.latest(); +- } +-} ++\fBimport java\&.util\&.*;\fR ++\fBimport javax\&.annotation\&.processing\&.*;\fR ++\fBimport javax\&.lang\&.model\&.*;\fR ++\fBimport\&.javaz\&.lang\&.model\&.element\&.*;\fR ++ ++\fB@SupportedAnnotationTypes("NotAnno")\fR ++\fBpublic class AnnoProc extends AbstractProcessor {\fR ++\fB public boolean process(Set elems, RoundEnvironment renv){\fR ++\fB return true;\fR ++\fB }\fR ++ ++\fB public SourceVersion getSupportedSourceVersion() {\fR ++\fB return SourceVersion\&.latest();\fR ++\fB }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -844,88 +882,93 @@ + .RS 4 + .\} + .nf +-@interface Anno { } ++\fB@interface Anno { }\fR ++\fB \fR ++\fB@Anno\fR ++\fBclass AnnosWithoutProcessors { }\fR + +-@Anno +-class AnnosWithoutProcessors { } + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Ãí¼á¥×¥í¥»¥Ã¥µ\fIAnnoProc\fR¤ò¥³¥ó¥Ñ¥¤¥ë¤·¡¢¤³¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fIAnnosWithoutProcessors\&.java\fR¤ËÂФ·¤Æ¼Â¹Ô¤·¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Ãí¼á¥×¥í¥»¥Ã¥µ\fBAnnoProc\fR¤ò¥³¥ó¥Ñ¥¤¥ë¤·¡¢¤³¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fBAnnosWithoutProcessors\&.java\fR¤ËÂФ·¤Æ¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac AnnoProc\&.java +-javac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java ++\fBjavac AnnoProc\&.java\fR ++\fBjavac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥³¥ó¥Ñ¥¤¥é¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fIAnnosWithoutProcessors\&.java\fR¤ËÂФ·¤ÆÃí¼á¥×¥í¥»¥Ã¥µ¤ò¼Â¹Ô¤¹¤ë¤È¡¢¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fBAnnosWithoutProcessors\&.java\fR¤ËÂФ·¤ÆÃí¼á¥×¥í¥»¥Ã¥µ¤ò¼Â¹Ô¤¹¤ë¤È¡¢¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-warning: [processing] No processor claimed any of these annotations: Anno ++\fBwarning: [processing] No processor claimed any of these annotations: Anno\fR ++\fB \fR ++.fi ++.if n \{\ ++.RE ++.\} ++¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¡¢¥¯¥é¥¹\fBAnnosWithoutProcessors\fR¤ÇÄêµÁ¤ª¤è¤Ó»ÈÍѤµ¤ì¤ëÃí¼á¤Î̾Á°¤ò¡¢\fBAnno\fR¤«¤é\fBNotAnno\fR¤ËÊѹ¹¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++rawtypes ++.RS 4 ++raw·¿¤ËÂФ¹¤ë̤¸¡ººÁàºî¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¼¡¤Îʸ¤Ç¤Ï¡¢\fBrawtypes\fR·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBvoid countElements(List l) { \&.\&.\&. }\fR + + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¡¢¥¯¥é¥¹\fIAnnosWithoutProcessors\fR¤ÇÄêµÁ¤ª¤è¤Ó»ÈÍѤµ¤ì¤ëÃí¼á¤Î̾Á°¤ò¡¢\fIAnno\fR¤«¤é\fINotAnno\fR¤ËÊѹ¹¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-rawtypes +-.RS 4 +-raw·¿¤ËÂФ¹¤ë̤¸¡ººÁàºî¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¼¡¤Îʸ¤Ç¤Ï¡¢\fIrawtypes\fR·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBrawtypes\fR·Ù¹ð¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-void countElements(List l) { \&.\&.\&. } ++\fBvoid countElements(List l) { \&.\&.\&. }\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIrawtypes\fR·Ù¹ð¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£ ++\fBList\fR¤Ïraw·¿¤Ç¤¹¡£¤¿¤À¤·¡¢\fBList\fR¤Ï¡¢¥¢¥ó¥Ð¥¦¥ó¥É·Á¼°¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤Î¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿¤Ç¤¹¡£\fBList\fR¤Ï¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¢¤ë¤¿¤á¡¢¾ï¤Ë¤½¤Î·¿°ú¿ô¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fBList\fR¤Î²¾°ú¿ô¤Ï¥¢¥ó¥Ð¥¦¥ó¥É·Á¼°¤Î¥ï¥¤¥ë¥É¥«¡¼¥É(\fB?\fR)¤ò»ÈÍѤ·¤Æ¤½¤Î²¾·¿¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢\fBcountElements\fR¥á¥½¥Ã¥É¤Ï\fBList\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¤É¤Î¥¤¥ó¥¹¥¿¥ó¥¹²½¤â¼õ¤±ÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++Serial ++.RS 4 ++ľÎó²½²Äǽ¥¯¥é¥¹¤Ë\fBserialVersionUID\fRÄêµÁ¤¬¤Ê¤¤¤³¤È¤ò·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-void countElements(List l) { \&.\&.\&. } +-.fi +-.if n \{\ +-.RE +-.\} +-\fIList\fR¤Ïraw·¿¤Ç¤¹¡£¤¿¤À¤·¡¢\fIList\fR¤Ï¡¢¥¢¥ó¥Ð¥¦¥ó¥É·Á¼°¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤Î¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿¤Ç¤¹¡£\fIList\fR¤Ï¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¢¤ë¤¿¤á¡¢¾ï¤Ë¤½¤Î·¿°ú¿ô¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fIList\fR¤Î²¾°ú¿ô¤Ï¥¢¥ó¥Ð¥¦¥ó¥É·Á¼°¤Î¥ï¥¤¥ë¥É¥«¡¼¥É(\fI?\fR)¤ò»ÈÍѤ·¤Æ¤½¤Î²¾·¿¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢\fIcountElements\fR¥á¥½¥Ã¥É¤Ï\fIList\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¤É¤Î¥¤¥ó¥¹¥¿¥ó¥¹²½¤â¼õ¤±ÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-Serial +-.RS 4 +-ľÎó²½²Äǽ¥¯¥é¥¹¤Ë\fIserialVersionUID\fRÄêµÁ¤¬¤Ê¤¤¤³¤È¤ò·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-public class PersistentTime implements Serializable +-{ +- private Date time; ++\fBpublic class PersistentTime implements Serializable\fR ++\fB{\fR ++\fB private Date time;\fR ++\fB \fR ++\fB public PersistentTime() {\fR ++\fB time = Calendar\&.getInstance()\&.getTime();\fR ++\fB }\fR ++\fB \fR ++\fB public Date getTime() {\fR ++\fB return time;\fR ++\fB }\fR ++\fB}\fR + +- public PersistentTime() { +- time = Calendar\&.getInstance()\&.getTime(); +- } +- +- public Date getTime() { +- return time; +- } +-} + .fi + .if n \{\ + .RE +@@ -936,13 +979,14 @@ + .RS 4 + .\} + .nf +-warning: [serial] serializable class PersistentTime has no definition of +-serialVersionUID ++\fBwarning: [serial] serializable class PersistentTime has no definition of\fR ++\fBserialVersionUID\fR ++ + .fi + .if n \{\ + .RE + .\} +-ľÎó²½²Äǽ¥¯¥é¥¹¤¬\fIserialVersionUID\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥£¡¼¥ë¥É¤òÌÀ¼¨Åª¤ËÀë¸À¤·¤Ê¤¤¾ì¹ç¡¢Ä¾Îó²½¥é¥ó¥¿¥¤¥à´Ä¶­¤Ç¤Ï¡¢¡ÖJava¥ª¥Ö¥¸¥§¥¯¥ÈľÎó²½»ÅÍ͡פÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¹¤ÎÍÍ¡¹¤Ê¦Ì̤˴ð¤Å¤¤¤Æ¡¢¥¯¥é¥¹¤Î\fIserialVersionUID\fR¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò·×»»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢¤¹¤Ù¤Æ¤ÎľÎó²½²Äǽ¥¯¥é¥¹¤¬\fIserialVersionUID\fRÃͤòÌÀ¼¨Åª¤ËÀë¸À¤¹¤ë¤³¤È¤ò¶¯¤¯¤ªÁ¦¤á¤·¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢\fIserialVersionUID\fRÃͤò·×»»¤¹¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥»¥¹¤¬¡¢¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ë²ÄǽÀ­¤Î¤¢¤ë¥¯¥é¥¹¤Î¾ÜºÙ¤Ë¤­¤ï¤á¤Æ±Æ¶Á¤ò¼õ¤±¤ä¤¹¤¯¡¢¤½¤Î·ë²Ì¡¢Ä¾Îó²½Éü¸µÃæ¤Ëͽ´ü¤·¤Ê¤¤\fIInvalidClassExceptions\fR¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¤Ç¤¹¡£Java¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤¬°Û¤Ê¤Ã¤Æ¤â\fIserialVersionUID\fRÃͤΰì´ÓÀ­¤ò³ÎÊݤˤ¹¤ë¤Ë¤Ï¡¢Ä¾Îó²½²Äǽ¥¯¥é¥¹¤¬\fIserialVersionUID\fRÃͤòÌÀ¼¨Åª¤ËÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++ľÎó²½²Äǽ¥¯¥é¥¹¤¬\fBserialVersionUID\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥£¡¼¥ë¥É¤òÌÀ¼¨Åª¤ËÀë¸À¤·¤Ê¤¤¾ì¹ç¡¢Ä¾Îó²½¥é¥ó¥¿¥¤¥à´Ä¶­¤Ç¤Ï¡¢¡ÖJava¥ª¥Ö¥¸¥§¥¯¥ÈľÎó²½»ÅÍ͡פÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¹¤ÎÍÍ¡¹¤Ê¦Ì̤˴ð¤Å¤¤¤Æ¡¢¥¯¥é¥¹¤Î\fBserialVersionUID\fR¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò·×»»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢¤¹¤Ù¤Æ¤ÎľÎó²½²Äǽ¥¯¥é¥¹¤¬\fBserialVersionUID\fRÃͤòÌÀ¼¨Åª¤ËÀë¸À¤¹¤ë¤³¤È¤ò¶¯¤¯¤ªÁ¦¤á¤·¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢\fBserialVersionUID\fRÃͤò·×»»¤¹¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥»¥¹¤¬¡¢¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ë²ÄǽÀ­¤Î¤¢¤ë¥¯¥é¥¹¤Î¾ÜºÙ¤Ë¤­¤ï¤á¤Æ±Æ¶Á¤ò¼õ¤±¤ä¤¹¤¯¡¢¤½¤Î·ë²Ì¡¢Ä¾Îó²½Éü¸µÃæ¤Ëͽ´ü¤·¤Ê¤¤\fBInvalidClassExceptions\fR¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¤Ç¤¹¡£Java¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤¬°Û¤Ê¤Ã¤Æ¤â\fBserialVersionUID\fRÃͤΰì´ÓÀ­¤ò³ÎÊݤˤ¹¤ë¤Ë¤Ï¡¢Ä¾Îó²½²Äǽ¥¯¥é¥¹¤¬\fBserialVersionUID\fRÃͤòÌÀ¼¨Åª¤ËÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + static +@@ -953,10 +997,11 @@ + .RS 4 + .\} + .nf +-class XLintStatic { +- static void m1() { } +- void m2() { this\&.m1(); } +-} ++\fBclass XLintStatic {\fR ++\fB static void m1() { }\fR ++\fB void m2() { this\&.m1(); }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -967,35 +1012,38 @@ + .RS 4 + .\} + .nf +-warning: [static] static method should be qualified by type name, +-XLintStatic, instead of by an expression ++\fBwarning: [static] static method should be qualified by type name, \fR ++\fBXLintStatic, instead of by an expression\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¡¢¼¡¤Î¤è¤¦¤Ë\fIstatic\fR¥á¥½¥Ã¥É\fIm1\fR¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¡¢¼¡¤Î¤è¤¦¤Ë\fBstatic\fR¥á¥½¥Ã¥É\fBm1\fR¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-XLintStatic\&.m1(); ++\fBXLintStatic\&.m1();\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤¢¤ë¤¤¤Ï¡¢\fIstatic\fR¥­¡¼¥ï¡¼¥É¤ò¥á¥½¥Ã¥É\fIm1\fR¤ÎÀë¸À¤«¤éºï½ü¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++¤¢¤ë¤¤¤Ï¡¢\fBstatic\fR¥­¡¼¥ï¡¼¥É¤ò¥á¥½¥Ã¥É\fBm1\fR¤ÎÀë¸À¤«¤éºï½ü¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + try + .RS 4 +-try\-with\-resourcesʸ¤ò´Þ¤à¡¢\fItry\fR¥Ö¥í¥Ã¥¯¤Î»ÈÍѤ˴ؤ¹¤ëÌäÂê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fItry\fR¥Ö¥í¥Ã¥¯¤ÇÀë¸À¤µ¤ì¤¿¥ê¥½¡¼¥¹\fIac\fR¤¬»ÈÍѤµ¤ì¤Ê¤¤¤¿¤á¤Ë¡¢¼¡¤Îʸ¤ËÂФ·¤Æ·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++try\-with\-resourcesʸ¤ò´Þ¤à¡¢\fBtry\fR¥Ö¥í¥Ã¥¯¤Î»ÈÍѤ˴ؤ¹¤ëÌäÂê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBtry\fR¥Ö¥í¥Ã¥¯¤ÇÀë¸À¤µ¤ì¤¿¥ê¥½¡¼¥¹\fBac\fR¤¬»ÈÍѤµ¤ì¤Ê¤¤¤¿¤á¤Ë¡¢¼¡¤Îʸ¤ËÂФ·¤Æ·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-try ( AutoCloseable ac = getResource() ) { // do nothing} ++\fBtry ( AutoCloseable ac = getResource() ) { // do nothing}\fR ++ + .fi + .if n \{\ + .RE +@@ -1010,37 +1058,39 @@ + .RS 4 + .\} + .nf +-List l = new ArrayList(); +-List ls = l; // unchecked warning ++\fBList l = new ArrayList();\fR ++\fBList ls = l; // unchecked warning\fR ++ + .fi + .if n \{\ + .RE + .\} +-·¿¤Î¾ÃµîÃæ¤Ë¡¢·¿\fIArrayList\fR¤ª¤è¤Ó\fIList\fR¤Ï¡¢¤½¤ì¤¾¤ì\fIArrayList\fR¤ª¤è¤Ó\fIList\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++·¿¤Îºï½üÃæ¡¢·¿\fBArrayList\fR¤ª¤è¤Ó\fBList\fR¤Ï¡¢¤½¤ì¤¾¤ì\fBArrayList\fR¤ª¤è¤Ó\fBList\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-\fIls\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿\fIList\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£\fIl\fR¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë\fIList\fR¤¬\fIls\fR¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï̤¸¡ºº·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤ª¤è¤ÓJVM¤Ï¡¢\fIl\fR¤¬\fIList\fR·¿¤ò»²¾È¤¹¤ë¤«¤É¤¦¤«¤òȽÊ̤Ǥ­¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fIl\fR¤Ï¡¢\fIList\fR·¿¤ò»²¾È¤·¤Þ¤»¤ó¡£¤½¤Î·ë²Ì¡¢¥Ò¡¼¥×±øÀ÷¤¬È¯À¸¤·¤Þ¤¹¡£ ++\fBls\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿\fBList\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£\fBl\fR¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë\fBList\fR¤¬\fBls\fR¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï̤¸¡ºº·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤ª¤è¤ÓJVM¤Ï¡¢\fBl\fR¤¬\fBList\fR·¿¤ò»²¾È¤¹¤ë¤«¤É¤¦¤«¤òȽÊ̤Ǥ­¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fBl\fR¤Ï¡¢\fBList\fR·¿¤ò»²¾È¤·¤Þ¤»¤ó¡£¤½¤Î·ë²Ì¡¢¥Ò¡¼¥×±øÀ÷¤¬È¯À¸¤·¤Þ¤¹¡£ + .sp +-¥Ò¡¼¥×±øÀ÷¾õÂÖ¤¬È¯À¸¤¹¤ë¤Î¤Ï¡¢\fIList\fR¥ª¥Ö¥¸¥§¥¯¥È\fIl\fR +-(¤½¤Îstatic·¿¤Ï\fIList\fR)¤¬Ê̤Î\fIList\fR¥ª¥Ö¥¸¥§¥¯¥È\fIls\fR +-(°Û¤Ê¤ëstatic·¿\fIList\fR¤ò»ý¤Ä)¤ËÂåÆþ¤µ¤ì¤ë¾ì¹ç¤Ç¤¹¡£¤·¤«¤·¡¢¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¤³¤ÎÂåÆþ¤ò¤¤¤Þ¤À¤Ëµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£Áí¾Î¤ò¥µ¥Ý¡¼¥È¤·¤Ê¤¤Java SE¤Î¥ê¥ê¡¼¥¹¤È¤Î²¼°Ì¸ß´¹À­¤ò³ÎÊݤ¹¤ë¤¿¤á¤Ë¡¢¤³¤ÎÂåÆþ¤òµö²Ä¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£·¿¾Ãµî¤Ë¤è¤ê¡¢\fIList\fR¤ª¤è¤Ó\fIList\fR¤Ï¡¢Î¾Êý¤È¤â\fIList\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥ª¥Ö¥¸¥§¥¯¥È\fIl\fR +-(\fIList\fR¤È¤¤¤¦raw·¿¤ò»ý¤Ä)¤ò¥ª¥Ö¥¸¥§¥¯¥È\fIls\fR¤ËÂåÆþ¤¹¤ë¤³¤È¤òµö²Ä¤·¤Þ¤¹¡£ ++¥Ò¡¼¥×±øÀ÷¾õÂÖ¤¬È¯À¸¤¹¤ë¤Î¤Ï¡¢\fBList\fR¥ª¥Ö¥¸¥§¥¯¥È\fBl\fR ++(¤½¤Îstatic·¿¤Ï\fBList\fR)¤¬Ê̤Î\fBList\fR¥ª¥Ö¥¸¥§¥¯¥È\fBls\fR ++(°Û¤Ê¤ëstatic·¿\fBList\fR¤ò»ý¤Ä)¤ËÂåÆþ¤µ¤ì¤ë¾ì¹ç¤Ç¤¹¡£¤·¤«¤·¡¢¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¤³¤ÎÂåÆþ¤ò¤¤¤Þ¤À¤Ëµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£Áí¾Î¤ò¥µ¥Ý¡¼¥È¤·¤Ê¤¤Java SE¤Î¥ê¥ê¡¼¥¹¤È¤Î¸åÊý¸ß´¹À­¤ò³ÎÊݤ¹¤ë¤¿¤á¤Ë¡¢¤³¤ÎÂåÆþ¤òµö²Ä¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£·¿¤Îºï½ü¤Î¤¿¤á¡¢\fBList\fR¤ª¤è¤Ó\fBList\fR¤Ï¡¢Î¾Êý\fBList\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥ª¥Ö¥¸¥§¥¯¥È\fBl\fR ++(\fBList\fR¤È¤¤¤¦raw·¿¤ò»ý¤Ä)¤ò¥ª¥Ö¥¸¥§¥¯¥È\fBls\fR¤ËÂåÆþ¤¹¤ë¤³¤È¤òµö²Ä¤·¤Þ¤¹¡£ + .RE + .PP + varargs + .RS 4 +-²ÄÊÑ°ú¿ô(\fIvarargs\fR)¥á¥½¥Ã¥É¡¢ÆäËÈó¶ñ¾Ý²½²Äǽ°ú¿ô¤ò´Þ¤à¤â¤Î¤Î»ÈÍѤ¬°ÂÁ´¤Ç¤Ê¤¤¤³¤È¤ò·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++²ÄÊÑ°ú¿ô(\fBvarargs\fR)¥á¥½¥Ã¥É¡¢ÆäËÈó¶ñ¾Ý²½²Äǽ°ú¿ô¤ò´Þ¤à¤â¤Î¤Î»ÈÍѤ¬°ÂÁ´¤Ç¤Ê¤¤¤³¤È¤ò·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public class ArrayBuilder { +- public static void addToList (List listArg, T\&.\&.\&. elements) { +- for (T x : elements) { +- listArg\&.add(x); +- } +- } +-} ++\fBpublic class ArrayBuilder {\fR ++\fB public static void addToList (List listArg, T\&.\&.\&. elements) {\fR ++\fB for (T x : elements) {\fR ++\fB listArg\&.add(x);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -1048,38 +1098,42 @@ + \fBÃí°Õ:\fR + Èó¶ñ¾Ý²½²Äǽ·¿¤Ï¡¢·¿¾ðÊ󤬼¹Իþ¤Ë´°Á´¤Ë»ÈÍÑÉÔ²Äǽ¤Ê·¿¤Ç¤¹¡£ + .sp +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥á¥½¥Ã¥É\fIArrayBuilder\&.addToList\fR¤ÎÄêµÁ¤Ë´Ø¤¹¤ë¼¡¤Î·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥á¥½¥Ã¥É\fBArrayBuilder\&.addToList\fR¤ÎÄêµÁ¤Ë´Ø¤¹¤ë¼¡¤Î·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-warning: [varargs] Possible heap pollution from parameterized vararg type T ++\fBwarning: [varargs] Possible heap pollution from parameterized vararg type T\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢varargs¥á¥½¥Ã¥É¤ò¸¡½Ð¤¹¤ë¤È¡¢\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤òÇÛÎó¤ËÊÑ´¹¤·¤Þ¤¹¡£¤·¤«¤·¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿¤ÎÇÛÎó¤ÎºîÀ®¤òµö²Ä¤·¤Æ¤¤¤Þ¤»¤ó¡£¥á¥½¥Ã¥É\fIArrayBuilder\&.addToList\fR¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿\fIT\&.\&.\&.\fRÍ×ÁǤò²¾¥Ñ¥é¥á¡¼¥¿\fIT[]\fRÍ×ÁÇ(ÇÛÎó)¤ËÊÑ´¹¤·¤Þ¤¹¡£¤·¤«¤·¡¢·¿¾Ãµî¤Ë¤è¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤ò\fIObject[]\fRÍ×ÁǤËÊÑ´¹¤·¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢¥Ò¡¼¥×±øÀ÷¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢varargs¥á¥½¥Ã¥É¤ò¸¡½Ð¤¹¤ë¤È¡¢\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤òÇÛÎó¤ËÊÑ´¹¤·¤Þ¤¹¡£¤·¤«¤·¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿¤ÎÇÛÎó¤ÎºîÀ®¤òµö²Ä¤·¤Æ¤¤¤Þ¤»¤ó¡£¥á¥½¥Ã¥É\fBArrayBuilder\&.addToList\fR¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿\fBT\&.\&.\&.\fRÍ×ÁǤò²¾¥Ñ¥é¥á¡¼¥¿\fBT[]\fRÍ×ÁÇ(ÇÛÎó)¤ËÊÑ´¹¤·¤Þ¤¹¡£¤·¤«¤·¡¢·¿¾Ãµî¤Ë¤è¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤ò\fBObject[]\fRÍ×ÁǤËÊÑ´¹¤·¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢¥Ò¡¼¥×±øÀ÷¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .RE +-.SH "¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¥Õ¥¡¥¤¥ë" ++.SH "¥³¥Þ¥ó¥É¹Ô°ú¿ô¥Õ¥¡¥¤¥ë" + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤òû¤¯¤·¤¿¤ê´Ê·é¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ë¡¢\fIjavac\fR¥³¥Þ¥ó¥É¤ËÂФ¹¤ë°ú¿ô(\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤ò´Þ¤à1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¾å¤Ç¤â¡¢Ç¤°Õ¤ÎŤµ¤Î\fIjavac\fR¥³¥Þ¥ó¥É¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤òû¤¯¤·¤¿¤ê´Ê·é¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ë¡¢\fBjavac\fR¥³¥Þ¥ó¥É¤ËÂФ¹¤ë°ú¿ô(\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤ò´Þ¤à1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¾å¤Ç¤â¡¢Ç¤°Õ¤ÎŤµ¤Î\fBjavac\fR¥³¥Þ¥ó¥É¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ + .PP +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIjavac\fR¤Î¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò¼«Í³¤ËÁȤ߹礻¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤Ï¡¢¶õÇò¤Þ¤¿¤Ï²þ¹Ôʸ»ú¤Ç¶èÀڤ뤳¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤ËËä¤á¹þ¤Þ¤ì¤¿¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾Á´ÂΤòÆó½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£ ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBjavac\fR¤Î¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò¼«Í³¤ËÁȤ߹礻¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤Ï¡¢¶õÇò¤Þ¤¿¤Ï²þ¹Ôʸ»ú¤Ç¶èÀڤ뤳¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤ËËä¤á¹þ¤Þ¤ì¤¿¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾Á´ÂΤòÆó½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£ + .PP +-°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ǤϤʤ¯¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ê¥¹¥È¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É(*)¤Ï»ÈÍѤǤ­¤Þ¤»¤ó(¤¿¤È¤¨¤Ð¡¢\fI*\&.java\fR¤È¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó)¡£¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤¿¥Õ¥¡¥¤¥ë¤ÎºÆµ¢Åª¤Ê²ò¼á¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fI\-J\fR¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïµ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤Þ¤¹¤¬¡¢µ¯Æ°¥Ä¡¼¥ë¤Ç¤Ï°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ ++°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ǤϤʤ¯¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ê¥¹¥È¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É(*)¤Ï»ÈÍѤǤ­¤Þ¤»¤ó(¤¿¤È¤¨¤Ð¡¢\fB*\&.java\fR¤È¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó)¡£¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤¿¥Õ¥¡¥¤¥ë¤ÎºÆµ¢Åª¤Ê²ò¼á¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fB\-J\fR¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïµ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤Þ¤¹¤¬¡¢µ¯Æ°¥Ä¡¼¥ë¤Ç¤Ï°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢³Æ°ú¿ô¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È̾Á°¤ÎÀèƬ¤Ë¥¢¥Ã¥È¥Þ¡¼¥¯(@)ʸ»ú¤òÉÕ¤±¤ÆÅϤ·¤Þ¤¹¡£\fIjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢³Æ°ú¿ô¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È̾Á°¤ÎÀèƬ¤Ë¥¢¥Ã¥È¥Þ¡¼¥¯(@)ʸ»ú¤òÉÕ¤±¤ÆÅϤ·¤Þ¤¹¡£\fBjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ + .PP +-\fBExample 1\fR, ñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë ++\fBÎã 1\fR ++.br ++ñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë + .RS 4 +-\fIargfile\fR¤È¤¤¤¦Ì¾Á°¤Îñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¤¹¤Ù¤Æ¤Î\fIjavac\fR°ú¿ô¤ò³ÊǼ¤¹¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fBargfile\fR¤È¤¤¤¦Ì¾Á°¤Îñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¤¹¤Ù¤Æ¤Î\fBjavac\fR°ú¿ô¤ò³ÊǼ¤¹¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac @argfile ++\fBjavac @argfile\fR ++ + .fi + .if n \{\ + .RE +@@ -1087,9 +1141,11 @@ + ¤³¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Îã2¤Ç¼¨¤µ¤ì¤Æ¤¤¤ëξÊý¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòÆþ¤ì¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP +-\fBExample 2\fR, 2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë ++\fBÎã 2\fR ++.br ++2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë + .RS 4 +-\fIjavac\fR¥ª¥×¥·¥ç¥óÍѤȥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾ÍѤˡ¢2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥ê¥¹¥È¤Ë¤Ï¡¢¹Ô¤Î·Ñ³ʸ»ú¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++\fBjavac\fR¥ª¥×¥·¥ç¥óÍѤȥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾ÍѤˡ¢2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥ê¥¹¥È¤Ë¤Ï¡¢¹Ô¤Î·Ñ³ʸ»ú¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .sp + ¼¡¤ò´Þ¤àoptions¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£ + .sp +@@ -1097,9 +1153,7 @@ + .RS 4 + .\} + .nf +-\-d classes +-\-g +-\-sourcepath /java/pubs/ws/1\&.3/src/share/classes ++\fB\-d classes\fR + .fi + .if n \{\ + .RE +@@ -1109,6 +1163,27 @@ + .RS 4 + .\} + .nf ++\fB\-g\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-sourcepath /java/pubs/ws/1\&.3/src/share/classes\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++ + .fi + .if n \{\ + .RE +@@ -1119,35 +1194,40 @@ + .RS 4 + .\} + .nf +-MyClass1\&.java +-MyClass2\&.java +-MyClass3\&.java ++\fBMyClass1\&.java\fR ++\fBMyClass2\&.java\fR ++\fBMyClass3\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤½¤ì¤«¤é¡¢¼¡¤Î¤è¤¦¤Ë\fIjavac\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤½¤ì¤«¤é¡¢¼¡¤Î¤è¤¦¤Ë\fBjavac\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac @options @classes ++\fBjavac @options @classes\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, ¥Ñ¥¹¤ò»ÈÍѤ·¤¿°ú¿ô¥Õ¥¡¥¤¥ë ++\fBÎã 3\fR ++.br ++¥Ñ¥¹¤ò»ÈÍѤ·¤¿°ú¿ô¥Õ¥¡¥¤¥ë + .RS 4 +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢(\fIpath1\fR¤ä\fIpath2\fR¤Ç¤Ï¤Ê¤¯)¼¡¤Î¤è¤¦¤Ë¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£ ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢(\fBpath1\fR¤ä\fBpath2\fR¤Ç¤Ï¤Ê¤¯)¼¡¤Î¤è¤¦¤Ë¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac @path1/options @path2/classes ++\fBjavac @path1/options @path2/classes\fR ++ + .fi + .if n \{\ + .RE +@@ -1155,106 +1235,110 @@ + .RE + .SH "Ãí¼á½èÍý" + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤¬Ãí¼á½èÍý¤òľÀÜ¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤¿¤á¡¢ÆÈΩ¤·¤¿Ãí¼á½èÍý¥³¥Þ¥ó¥É¤Ç¤¢¤ë\fIapt\fR¤ò»ÈÍѤ¹¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤¬Ãí¼á½èÍý¤òľÀÜ¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤¿¤á¡¢ÆÈΩ¤·¤¿Ãí¼á½èÍý¥³¥Þ¥ó¥É¤Ç¤¢¤ë\fBapt\fR¤ò»ÈÍѤ¹¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿¡£ + .PP +-Ãí¼á¥×¥í¥»¥Ã¥µ¤ÎAPI¤Ï¡¢\fIjavax\&.annotation\&.processing\fR¤ª¤è¤Ó\fIjavax\&.lang\&.model\fR¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++Ãí¼á¥×¥í¥»¥Ã¥µ¤ÎAPI¤Ï¡¢\fBjavax\&.annotation\&.processing\fR¤ª¤è¤Ó\fBjavax\&.lang\&.model\fR¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .SS "Ãí¼á½èÍý¤ò¹Ô¤¦ÊýË¡" + .PP +-\fI\-proc:none\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÃí¼á½èÍý¤¬Ìµ¸ú²½¤µ¤ì¤Ê¤¤¸Â¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤ò¸¡º÷¤·¤Þ¤¹¡£¸¡º÷¥Ñ¥¹¤Ï¡¢\fI\-processorpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ñ¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥×¥í¥»¥Ã¥µ¤Î¸¡º÷¤Ï¡¢¸¡º÷¥Ñ¥¹¾å¤Î\fIMETA\-INF/services/javax\&.annotation\&.processing\fR\&.Processor¤È¤¤¤¦Ì¾Á°¤Î¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¹½À®¥Õ¥¡¥¤¥ë¤Ë´ð¤Å¤¤¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢»ÈÍѤ¹¤ë¤¹¤Ù¤Æ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤Î̾Á°¤ò¡¢1¹Ô¤Ë1¤Ä¤º¤Ä´Þ¤á¤Æ¤¯¤À¤µ¤¤¡£¤Þ¤¿¡¢Ê̤ÎÊýË¡¤È¤·¤Æ¡¢\fI\-processor\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥×¥í¥»¥Ã¥µ¤òÌÀ¼¨Åª¤Ë»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++\fB\-proc:none\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÃí¼á½èÍý¤¬Ìµ¸ú²½¤µ¤ì¤Ê¤¤¸Â¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤ò¸¡º÷¤·¤Þ¤¹¡£¸¡º÷¥Ñ¥¹¤Ï¡¢\fB\-processorpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ñ¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥×¥í¥»¥Ã¥µ¤Î¸¡º÷¤Ï¡¢¸¡º÷¥Ñ¥¹¾å¤Î\fBMETA\-INF/services/javax\&.annotation\&.processing\fR\&.Processor¤È¤¤¤¦Ì¾Á°¤Î¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¹½À®¥Õ¥¡¥¤¥ë¤Ë´ð¤Å¤¤¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢»ÈÍѤ¹¤ë¤¹¤Ù¤Æ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤Î̾Á°¤ò¡¢1¹Ô¤Ë1¤Ä¤º¤Ä´Þ¤á¤Æ¤¯¤À¤µ¤¤¡£¤Þ¤¿¡¢Ê̤ÎÊýË¡¤È¤·¤Æ¡¢\fB\-processor\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥×¥í¥»¥Ã¥µ¤òÌÀ¼¨Åª¤Ë»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ä¥¯¥é¥¹¤òÁöºº¤¹¤ë¤³¤È¤Ç¡¢¤É¤Î¤è¤¦¤ÊÃí¼á¤¬Â¸ºß¤·¤Æ¤¤¤ë¤«¤ò³Îǧ¤·½ª¤ï¤ë¤È¡¢¥×¥í¥»¥Ã¥µ¤ËÂФ·¤ÆÌä¹ç¤»¤ò¹Ô¤¤¡¢¤½¤ì¤é¤Î¥×¥í¥»¥Ã¥µ¤¬¤É¤ÎÃí¼á¤ò½èÍý¤Ç¤­¤ë¤Î¤«¤ò³Îǧ¤·¤Þ¤¹¡£°ìÃפ¹¤ë¤â¤Î¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¥×¥í¥»¥Ã¥µ¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£³Æ¥×¥í¥»¥Ã¥µ¤Ï¡¢¼«¿È¤¬½èÍý¤¹¤ëÃí¼á¤òÍ×µá¤Ç¤­¤Þ¤¹¡£¤½¤Î¾ì¹ç¡¢¤½¤ì¤é¤ÎÃí¼á¤ËÂФ¹¤ëÊÌ¤Î¥×¥í¥»¥Ã¥µ¤ò¸«¤Ä¤±¤ë»î¤ß¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£¤¹¤Ù¤Æ¤ÎÃí¼á¤¬Í׵ᤵ¤ì¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤½¤ì°Ê¾å¥×¥í¥»¥Ã¥µ¤Î¸¡º÷¤ò¹Ô¤¤¤Þ¤»¤ó¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ä¥¯¥é¥¹¤òÁöºº¤¹¤ë¤³¤È¤Ç¡¢¤É¤Î¤è¤¦¤ÊÃí¼á¤¬Â¸ºß¤·¤Æ¤¤¤ë¤«¤ò³Îǧ¤·½ª¤ï¤ë¤È¡¢¥×¥í¥»¥Ã¥µ¤ËÂФ·¤ÆÌä¹ç¤»¤ò¹Ô¤¤¡¢¤½¤ì¤é¤Î¥×¥í¥»¥Ã¥µ¤¬¤É¤ÎÃí¼á¤ò½èÍý¤Ç¤­¤ë¤Î¤«¤ò³Îǧ¤·¤Þ¤¹¡£°ìÃפ¹¤ë¤â¤Î¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¥×¥í¥»¥Ã¥µ¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£³Æ¥×¥í¥»¥Ã¥µ¤Ï¡¢¼«¿È¤¬½èÍý¤¹¤ëÃí¼á¤òÍ×µá¤Ç¤­¤Þ¤¹¡£¤½¤Î¾ì¹ç¡¢¤½¤ì¤é¤ÎÃí¼á¤ËÂФ¹¤ëÊÌ¤Î¥×¥í¥»¥Ã¥µ¤ò¸«¤Ä¤±¤ë»î¤ß¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£¤¹¤Ù¤Æ¤ÎÃí¼á¤¬Í׵ᤵ¤ì¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤½¤ì°Ê¾å¥×¥í¥»¥Ã¥µ¤Î¸¡º÷¤ò¹Ô¤¤¤Þ¤»¤ó¡£ + .PP + ¤¤¤º¤ì¤«¤Î¥×¥í¥»¥Ã¥µ¤Ë¤è¤Ã¤Æ¿·¤·¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤ë¤È¡¢Ãí¼á½èÍý¤Î2²óÌܤΥ饦¥ó¥É¤¬³«»Ï¤µ¤ì¤Þ¤¹¡£¿·¤·¤¯À¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥¹¥­¥ã¥ó¤µ¤ì¡¢Á°²ó¤ÈƱÍͤËÃí¼á¤¬½èÍý¤µ¤ì¤Þ¤¹¡£°ÊÁ°¤Î¥é¥¦¥ó¥É¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¥×¥í¥»¥Ã¥µ¤Ï¤¹¤Ù¤Æ¡¢¸å³¤Î¤É¤Î¥é¥¦¥ó¥É¤Ç¤â¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£¤³¤ì¤¬¡¢¿·¤·¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤¯¤Ê¤ë¤Þ¤Ç³¤­¤Þ¤¹¡£ + .PP +-¤¢¤ë¥é¥¦¥ó¥É¤Ç¿·¤·¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢Ãí¼á¥×¥í¥»¥Ã¥µ¤¬¤¢¤È1²ó¤Î¤ß¸Æ¤Ó½Ð¤µ¤ì¡¢»Ä¤ê¤Î½èÍý¤ò¼Â¹Ô¤¹¤ëµ¡²ñ¤¬Í¿¤¨¤é¤ì¤Þ¤¹¡£ºÇ¸å¤Ë¡¢\fI\-proc:only\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Ê¤¤¤«¤®¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¸µ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈÀ¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¤¢¤ë¥é¥¦¥ó¥É¤Ç¿·¤·¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢Ãí¼á¥×¥í¥»¥Ã¥µ¤¬¤¢¤È1²ó¤Î¤ß¸Æ¤Ó½Ð¤µ¤ì¡¢»Ä¤ê¤Î½èÍý¤ò¼Â¹Ô¤¹¤ëµ¡²ñ¤¬Í¿¤¨¤é¤ì¤Þ¤¹¡£ºÇ¸å¤Ë¡¢\fB\-proc:only\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Ê¤¤¤«¤®¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¸µ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈÀ¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .SS "°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë" + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢°ìÏ¢¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ëºÝ¤Ë¡¢Ê̤Υ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò°ÅÌÛŪ¤Ë¥í¡¼¥É¤¹¤ë¤³¤È¤¬É¬Íפʾì¹ç¤¬¤¢¤ê¤Þ¤¹¡£·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤½¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ï¡¢¸½»þÅÀ¤Ç¤ÏÃí¼á½èÍý¤ÎÂоݤˤʤê¤Þ¤»¤ó¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ãí¼á½èÍý¤¬¼Â¹Ô¤µ¤ì¡¢¤«¤Ä°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿Ç¤°Õ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï·Ù¹ð¤òȯ¹Ô¤·¤Þ¤¹¡£\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢·Ù¹ð¤òÍÞÀ©¤¹¤ëÊýË¡¤¬Ä󶡤µ¤ì¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢°ìÏ¢¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ëºÝ¤Ë¡¢Ê̤Υ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò°ÅÌÛŪ¤Ë¥í¡¼¥É¤¹¤ë¤³¤È¤¬É¬Íפʾì¹ç¤¬¤¢¤ê¤Þ¤¹¡£·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤½¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ï¡¢¸½»þÅÀ¤Ç¤ÏÃí¼á½èÍý¤ÎÂоݤˤʤê¤Þ¤»¤ó¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ãí¼á½èÍý¤¬¼Â¹Ô¤µ¤ì¡¢¤«¤Ä°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿Ç¤°Õ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï·Ù¹ð¤òȯ¹Ô¤·¤Þ¤¹¡£\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢·Ù¹ð¤òÍÞÀ©¤¹¤ëÊýË¡¤¬Ä󶡤µ¤ì¤Þ¤¹¡£ + .SH "·¿¤Î¸¡º÷" + .PP +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤á¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤ÏÄ̾·¿¤Ë´Ø¤¹¤ë¾ðÊó¤òɬÍפȤ·¤Þ¤¹¤¬¡¢¤½¤Î·¿¤ÎÄêµÁ¤Ï¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ê¤Þ¤»¤ó¡£¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢³ÈÄ¥¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤¢¤ë¤¤¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¹¤Ù¤Æ¤Ë¤Ä¤¤¤Æ¡¢·¿¤Î¾ðÊó¤òɬÍפȤ·¤Þ¤¹¡£¤³¤ì¤Ë¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÇÌÀ¼¨Åª¤Ë¤Ï¸ÀµÚ¤µ¤ì¤Æ¤¤¤Ê¤¯¤Æ¤â¡¢·Ñ¾µ¤òÄ̤¸¤Æ¾ðÊó¤òÄ󶡤¹¤ë¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤â´Þ¤Þ¤ì¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤á¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤ÏÄ̾·¿¤Ë´Ø¤¹¤ë¾ðÊó¤òɬÍפȤ·¤Þ¤¹¤¬¡¢¤½¤Î·¿¤ÎÄêµÁ¤Ï¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ê¤Þ¤»¤ó¡£¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢³ÈÄ¥¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤¢¤ë¤¤¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¹¤Ù¤Æ¤Ë¤Ä¤¤¤Æ¡¢·¿¤Î¾ðÊó¤òɬÍפȤ·¤Þ¤¹¡£¤³¤ì¤Ë¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÇÌÀ¼¨Åª¤Ë¤Ï¸ÀµÚ¤µ¤ì¤Æ¤¤¤Ê¤¯¤Æ¤â¡¢·Ñ¾µ¤òÄ̤¸¤Æ¾ðÊó¤òÄ󶡤¹¤ë¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤â´Þ¤Þ¤ì¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¥µ¥Ö¥¯¥é¥¹\fIjava\&.applet\&.Applet\fR¤òºîÀ®¤¹¤ë¤È¡¢\fI¥¢¥×¥ì¥Ã¥È\fR¤ÎÁÄÀè¤Î¥¯¥é¥¹(\fIjava\&.awt\&.Panel\fR¡¢\fIjava\&.awt\&.Container\fR¡¢\fIjava\&.awt\&.Component\fR¤ª¤è¤Ó\fIjava\&.lang\&.Object\fR)¤ò»ÈÍѤ·¤Æ¤¤¤ë¤³¤È¤Ë¤â¤Ê¤ê¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥µ¥Ö¥¯¥é¥¹\fBjava\&.applet\&.Applet\fR¤òºîÀ®¤¹¤ë¤È¡¢\fB¥¢¥×¥ì¥Ã¥È\fR¤ÎÁÄÀè¤Î¥¯¥é¥¹(\fBjava\&.awt\&.Panel\fR¡¢\fBjava\&.awt\&.Container\fR¡¢\fBjava\&.awt\&.Component\fR¤ª¤è¤Ó\fBjava\&.lang\&.Object\fR)¤ò»ÈÍѤ·¤Æ¤¤¤ë¤³¤È¤Ë¤â¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢·¿¤Î¾ðÊó¤¬É¬Íפˤʤë¤È¡¢¤½¤Î·¿¤òÄêµÁ¤·¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£¤Þ¤º¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤È³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò¸¡º÷¤·¡¢Â³¤¤¤Æ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹(¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê)¤ò¸¡º÷¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï¡¢\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤òÀßÄꤷ¤ÆÄêµÁ¤¹¤ë¤«¡¢¤Þ¤¿¤Ï\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÄêµÁ¤·¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢·¿¤Î¾ðÊó¤¬É¬Íפˤʤë¤È¡¢¤½¤Î·¿¤òÄêµÁ¤·¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£¤Þ¤º¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤È³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò¸¡º÷¤·¡¢Â³¤¤¤Æ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹(¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê)¤ò¸¡º÷¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï¡¢\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤òÀßÄꤷ¤ÆÄêµÁ¤¹¤ë¤«¡¢¤Þ¤¿¤Ï\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÄêµÁ¤·¤Þ¤¹¡£ + .PP +-\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤ò¸¡º÷¤·¤Þ¤¹¡£ ++\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤ò¸¡º÷¤·¤Þ¤¹¡£ + .PP +-\fI\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-extdirs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê̤Υ֡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ä³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-extdirs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê̤Υ֡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ä³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-·¿¤Î¸¡º÷¤ËÀ®¸ù¤·¤¿¤È¤­¤ËÆÀ¤é¤ì¤ë·ë²Ì¤Ï¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤½¤ÎξÊý¤Ç¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£Î¾Êý¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¤É¤Á¤é¤ò»ÈÍѤ¹¤ë¤«¤ò\fI\-Xprefer\fR¥ª¥×¥·¥ç¥ó¤Ç¥³¥ó¥Ñ¥¤¥é¤Ë»Ø¼¨¤Ç¤­¤Þ¤¹¡£\fInewer\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Î¤¦¤Á¿·¤·¤¤Êý¤ò»ÈÍѤ·¤Þ¤¹¡£\fIsource\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fInewer\fR¤Ç¤¹¡£ ++·¿¤Î¸¡º÷¤ËÀ®¸ù¤·¤¿¤È¤­¤ËÆÀ¤é¤ì¤ë·ë²Ì¤Ï¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤½¤ÎξÊý¤Ç¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£Î¾Êý¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¤É¤Á¤é¤ò»ÈÍѤ¹¤ë¤«¤ò\fB\-Xprefer\fR¥ª¥×¥·¥ç¥ó¤Ç¥³¥ó¥Ñ¥¤¥é¤Ë»Ø¼¨¤Ç¤­¤Þ¤¹¡£\fBnewer\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Î¤¦¤Á¿·¤·¤¤Êý¤ò»ÈÍѤ·¤Þ¤¹¡£\fBsource\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fBnewer\fR¤Ç¤¹¡£ + .PP +-·¿¤Î¸¡º÷¼«ÂΤˤè¤Ã¤Æ¡¢¤Þ¤¿¤Ï\fI\-Xprefer\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤¿·ë²Ì¤È¤·¤ÆɬÍפʷ¿¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¡¢É¬ÍפʾðÊó¤ò¼èÆÀ¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë¤â¹Ô¤¤¤Þ¤¹¡£\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤ÎÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fInone\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£\fIclass\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++·¿¤Î¸¡º÷¼«ÂΤˤè¤Ã¤Æ¡¢¤Þ¤¿¤Ï\fB\-Xprefer\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤¿·ë²Ì¤È¤·¤ÆɬÍפʷ¿¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¡¢É¬ÍפʾðÊó¤ò¼èÆÀ¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë¤â¹Ô¤¤¤Þ¤¹¡£\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤ÎÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBnone\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£\fBclass\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢Ãí¼á½èÍý¤¬´°Î»¤¹¤ë¤Þ¤Ç¡¢¤¢¤ë·¿¾ðÊó¤ÎɬÍ×À­¤òǧ¼±¤·¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£·¿¾ðÊ󤬥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¸«¤Ä¤«¤ê¡¢¤«¤Ä\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬Ãí¼á½èÍý¤ÎÂоݤȤʤ餺¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤³¤È¤¬·Ù¹ð¤µ¤ì¤Þ¤¹¡£¤³¤Î·Ù¹ð¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢(¤½¤Î¥Õ¥¡¥¤¥ë¤¬Ãí¼á½èÍý¤ÎÂоݤȤʤë¤è¤¦¤Ë)¤½¤Î¥Õ¥¡¥¤¥ë¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤹ¤ë¤«¡¢¤¢¤ë¤¤¤Ï¤½¤Î¤è¤¦¤Ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¤«¤É¤¦¤«¤ò\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄꤷ¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢Ãí¼á½èÍý¤¬´°Î»¤¹¤ë¤Þ¤Ç¡¢¤¢¤ë·¿¾ðÊó¤ÎɬÍ×À­¤òǧ¼±¤·¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£·¿¾ðÊ󤬥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¸«¤Ä¤«¤ê¡¢¤«¤Ä\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬Ãí¼á½èÍý¤ÎÂоݤȤʤ餺¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤³¤È¤¬·Ù¹ð¤µ¤ì¤Þ¤¹¡£¤³¤Î·Ù¹ð¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢(¤½¤Î¥Õ¥¡¥¤¥ë¤¬Ãí¼á½èÍý¤ÎÂоݤȤʤë¤è¤¦¤Ë)¤½¤Î¥Õ¥¡¥¤¥ë¤ò¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤹ¤ë¤«¡¢¤¢¤ë¤¤¤Ï¤½¤Î¤è¤¦¤Ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¤«¤É¤¦¤«¤ò\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄꤷ¤Þ¤¹¡£ + .SH "¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹" + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjavax\&.tools\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤ë¿·¤·¤¤Java Compiler API¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBjavax\&.tools\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤ë¿·¤·¤¤Java Compiler API¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .SS "Îã" + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤ò»ØÄꤹ¤ë¤è¤¦¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¹½Ê¸¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô°ú¿ô¤ò»ØÄꤹ¤ë¤è¤¦¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¹½Ê¸¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler(); +-JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler(); ++\fBJavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-Îã¤Ç¤Ï¡¢¿ÇÃǤòɸ½à½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë½ñ¤­¹þ¤ß¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é¤Î¸Æ½Ð¤·»þ¤Ë\fIjavac\fR¤¬»ØÄꤹ¤ë½ªÎ»¥³¡¼¥É¤òÊÖ¤·¤Þ¤¹¡£ ++Îã¤Ç¤Ï¡¢¿ÇÃǤòɸ½à½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë½ñ¤­¹þ¤ß¡¢¥³¥Þ¥ó¥É¹Ô¤«¤é¤Î¸Æ½Ð¤·»þ¤Ë\fBjavac\fR¤¬»ØÄꤹ¤ë½ªÎ»¥³¡¼¥É¤òÊÖ¤·¤Þ¤¹¡£ + .PP +-\fIjavax\&.tools\&.JavaCompiler\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾¤Î¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¿ÇÃǤνèÍý¤ä¥Õ¥¡¥¤¥ë¤ÎÆɼè¤ê¸µ/½ñ¹þ¤ßÀè¤ÎÀ©¸æ¤Ê¤É¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBjavax\&.tools\&.JavaCompiler\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾¤Î¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¿ÇÃǤνèÍý¤ä¥Õ¥¡¥¤¥ë¤ÎÆɼè¤ê¸µ/½ñ¹þ¤ßÀè¤ÎÀ©¸æ¤Ê¤É¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .SS "µì¼°¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹" + .PP + \fBÃí°Õ:\fR +-¤³¤ÎAPI¤Ï¡¢²¼°Ì¸ß´¹À­¤Î¤¿¤á¤Ë¤Î¤ßÊÝ»ý¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¿·¤·¤¤¥³¡¼¥É¤Ï¡¢¿·¤·¤¤Java Compiler API¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¤³¤ÎAPI¤Ï¡¢¸åÊý¸ß´¹À­¤Î¤¿¤á¤Ë¤Î¤ßÊÝ»ý¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¿·¤·¤¤¥³¡¼¥É¤Ï¡¢¿·¤·¤¤Java Compiler API¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¼¡¤Î¤è¤¦¤Ë¡¢\fIcom\&.sun\&.tools\&.javac\&.Main\fR¥¯¥é¥¹¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤«¤é¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤¹¤¿¤á¤Îstatic¥á¥½¥Ã¥É¤¬2¤ÄÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¼¡¤Î¤è¤¦¤Ë¡¢\fBcom\&.sun\&.tools\&.javac\&.Main\fR¥¯¥é¥¹¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤«¤é¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤¹¤¿¤á¤Îstatic¥á¥½¥Ã¥É¤¬2¤ÄÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public static int compile(String[] args); +-public static int compile(String[] args, PrintWriter out); ++\fBpublic static int compile(String[] args);\fR ++\fBpublic static int compile(String[] args, PrintWriter out);\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIargs\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢Ä̾拾¥ó¥Ñ¥¤¥é¤ËÅϤµ¤ì¤ëǤ°Õ¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£ ++\fBargs\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢Ä̾拾¥ó¥Ñ¥¤¥é¤ËÅϤµ¤ì¤ëǤ°Õ¤Î¥³¥Þ¥ó¥É¹Ô°ú¿ô¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£ + .PP +-\fIout\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¿ÇÃǽÐÎϤΰ¸Àè¤ò¼¨¤·¤Þ¤¹¡£ ++\fBout\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¿ÇÃǽÐÎϤΰ¸Àè¤ò¼¨¤·¤Þ¤¹¡£ + .PP +-\fIreturn\fRÃͤϡ¢\fIjavac\fR¤Î\fIexit\fRÃͤÈƱ¤¸¤Ç¤¹¡£ ++\fBreturn\fRÃͤϡ¢\fBjavac\fR¤Î\fBexit\fRÃͤÈƱ¤¸¤Ç¤¹¡£ + .PP + \fBÃí°Õ:\fR +-̾Á°¤¬\fIcom\&.sun\&.tools\&.javac\fR¤Ç»Ï¤Þ¤ë¥Ñ¥Ã¥±¡¼¥¸(\fIcom\&.sun\&.tools\&.javac\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¸¡½Ð¤µ¤ì¤ë¾¤Î¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤ª¤è¤Ó¥á¥½¥Ã¥É¤Ï¡¢´°Á´¤ËÆâÉôÍѤǤ¢¤ê¡¢¤¤¤Ä¤Ç¤âÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++̾Á°¤¬\fBcom\&.sun\&.tools\&.javac\fR¤Ç»Ï¤Þ¤ë¥Ñ¥Ã¥±¡¼¥¸(\fBcom\&.sun\&.tools\&.javac\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¸¡½Ð¤µ¤ì¤ë¾¤Î¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤ª¤è¤Ó¥á¥½¥Ã¥É¤Ï¡¢´°Á´¤ËÆâÉôÍѤǤ¢¤ê¡¢¤¤¤Ä¤Ç¤âÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .SH "Îã" + .PP +-\fBExample 1\fR, ´Êñ¤Ê¥×¥í¥°¥é¥à¤Î¥³¥ó¥Ñ¥¤¥ë ++\fBÎã 1\fR ++.br ++´Êñ¤Ê¥×¥í¥°¥é¥à¤Î¥³¥ó¥Ñ¥¤¥ë + .RS 4 +-¤³¤ÎÎã¤Ç¤Ï¡¢greetings¥Ç¥£¥ì¥¯¥È¥ê¤Ç\fIHello\&.java\fR¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ëÊýË¡¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£\fIHello\&.java\fR¤ÇÄêµÁ¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢\fIgreetings\&.Hello\fR¤È¸Æ¤Ð¤ì¤Þ¤¹¡£greetings¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤¬¤¢¤ë¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Î¤¹¤°²¼¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ò»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¤Þ¤¿¡¢\fI\-d\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ̤νÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ëɬÍפ⤢¤ê¤Þ¤»¤ó¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢greetings¥Ç¥£¥ì¥¯¥È¥ê¤Ç\fBHello\&.java\fR¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ëÊýË¡¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£\fBHello\&.java\fR¤ÇÄêµÁ¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢\fBgreetings\&.Hello\fR¤È¸Æ¤Ð¤ì¤Þ¤¹¡£greetings¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤¬¤¢¤ë¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Î¤¹¤°²¼¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ò»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¤Þ¤¿¡¢\fB\-d\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ̤νÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ëɬÍפ⤢¤ê¤Þ¤»¤ó¡£ + .sp +-\fIHello\&.java\fRÆâ¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ ++\fBHello\&.java\fRÆâ¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-package greetings; ++\fBpackage greetings;\fR ++\fB \fR ++\fBpublic class Hello {\fR ++\fB public static void main(String[] args) {\fR ++\fB for (int i=0; i < args\&.length; i++) {\fR ++\fB System\&.out\&.println("Hello " + args[i]);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR + +-public class Hello { +- public static void main(String[] args) { +- for (int i=0; i < args\&.length; i++) { +- System\&.out\&.println("Hello " + args[i]); +- } +- } +-} + .fi + .if n \{\ + .RE +@@ -1265,46 +1349,53 @@ + .RS 4 + .\} + .nf +-javac greetings/Hello\&.java ++\fBjavac greetings/Hello\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIgreetings\&.Hello\fR¤Î¼Â¹Ô: ++\fBgreetings\&.Hello\fR¤Î¼Â¹Ô: + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java greetings\&.Hello World Universe Everyone +-Hello World +-Hello Universe +-Hello Everyone ++\fBjava greetings\&.Hello World Universe Everyone\fR ++\fBHello World\fR ++\fBHello Universe\fR ++\fBHello Everyone\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, Ê£¿ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë ++\fBÎã 2\fR ++.br ++Ê£¿ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë + .RS 4 +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fIAloha\&.java\fR¡¢\fIGutenTag\&.java\fR¡¢\fIHello\&.java\fR¤ª¤è¤Ó\fIHi\&.java\fR¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fBAloha\&.java\fR¡¢\fBGutenTag\&.java\fR¡¢\fBHello\&.java\fR¤ª¤è¤Ó\fBHi\&.java\fR¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% javac greetings/*\&.java +-% ls greetings +-Aloha\&.class GutenTag\&.class Hello\&.class Hi\&.class +-Aloha\&.java GutenTag\&.java Hello\&.java Hi\&.java ++\fB% javac greetings/*\&.java\fR ++\fB% ls greetings\fR ++\fBAloha\&.class GutenTag\&.class Hello\&.class Hi\&.class\fR ++\fBAloha\&.java GutenTag\&.java Hello\&.java Hi\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Î»ØÄê ++\fBÎã 3\fR ++.br ++¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Î»ØÄê + .RS 4 + Á°½Ò¤ÎÎã¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¦¤Á1¤Ä¤òÊѹ¹¤·¤¿¸å¤Ë¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp +@@ -1312,110 +1403,122 @@ + .RS 4 + .\} + .nf +-pwd +-/examples +-javac greetings/Hi\&.java ++\fBpwd\fR ++\fB/examples\fR ++\fBjavac greetings/Hi\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIgreetings\&.Hi\fR¤Ï\fIgreetings\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¾¤Î¥¯¥é¥¹¤ò»²¾È¤·¤Æ¤¤¤ë¤¿¤á¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤³¤ì¤é¤Î¾¤Î¥¯¥é¥¹¤òõ¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¢¤ë¤¿¤á¡¢Á°½Ò¤ÎÎã¤ÏÆ°ºî¤·¤Þ¤¹¡£¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òµ¤¤Ë¤»¤º¤Ë¤³¤Î¥Õ¥¡¥¤¥ë¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¡¢\fICLASSPATH\fR¤òÀßÄꤷ¤Æ¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ËÎã¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òÄɲä·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ ++\fBgreetings\&.Hi\fR¤Ï\fBgreetings\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¾¤Î¥¯¥é¥¹¤ò»²¾È¤·¤Æ¤¤¤ë¤¿¤á¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤³¤ì¤é¤Î¾¤Î¥¯¥é¥¹¤òõ¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¢¤ë¤¿¤á¡¢Á°½Ò¤ÎÎã¤ÏÆ°ºî¤·¤Þ¤¹¡£¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òµ¤¤Ë¤»¤º¤Ë¤³¤Î¥Õ¥¡¥¤¥ë¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¡¢\fBCLASSPATH\fR¤òÀßÄꤷ¤Æ¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ËÎã¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òÄɲä·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-classpath /examples /examples/greetings/Hi\&.java ++\fBjavac \-classpath /examples /examples/greetings/Hi\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIgreetings\&.Hi\fR¤òÊѹ¹¤·¤Æ¥Ð¥Ê¡¼¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë¤·¤¿¾ì¹ç¡¢ ¤½¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤â¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤òÄ̤¸¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBgreetings\&.Hi\fR¤òÊѹ¹¤·¤Æ¥Ð¥Ê¡¼¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë¤·¤¿¾ì¹ç¡¢ ¤½¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤â¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤òÄ̤¸¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-classpath /examples:/lib/Banners\&.jar \e +- /examples/greetings/Hi\&.java ++\fBjavac \-classpath /examples:/lib/Banners\&.jar \e\fR ++\fB /examples/greetings/Hi\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¤Ç¥¯¥é¥¹¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤Ï\fIgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó\fIgreetings\fR¥¯¥é¥¹¤¬»ÈÍѤ¹¤ë¥¯¥é¥¹¤Ë¥¢¥¯¥»¥¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¤Ç¥¯¥é¥¹¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤Ï\fBgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó\fBgreetings\fR¥¯¥é¥¹¤¬»ÈÍѤ¹¤ë¥¯¥é¥¹¤Ë¥¢¥¯¥»¥¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi ++\fBjava \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 4\fR, ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎʬΥ ++\fBÎã 4\fR ++.br ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎʬΥ + .RS 4 +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIjavac\fR¤ò»ÈÍѤ·¤Æ¡¢JVM 1\&.6¾å¤Ç¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBjavac\fR¤ò»ÈÍѤ·¤Æ¡¢JVM 1\&.7¾å¤Ç¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e +-\-extdirs "" OldCode\&.java ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e \fR ++\fB\-extdirs "" OldCode\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fI\-source 1\&.6\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fIOldCode\&.java\fR¤Î¥³¥ó¥Ñ¥¤¥ë¤Ë¤Ï¥ê¥ê¡¼¥¹1\&.6(¤Þ¤¿¤Ï6)¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fI\-target 1\&.6\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢JVM 1\&.6¤È¸ß´¹À­¤Î¤¢¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ\fI\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤Ç¤­¤Þ¤¹¡£ ++\fB\-source 1\&.7\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fBOldCode\&.java\fR¤Î¥³¥ó¥Ñ¥¤¥ë¤Ë¤Ï¥ê¥ê¡¼¥¹1\&.7(¤Þ¤¿¤Ï7)¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fB\-target 1\&.7\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢JVM 1\&.7¤È¸ß´¹À­¤Î¤¢¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ\fB\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤Ç¤­¤Þ¤¹¡£ + .sp +-\fI\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Å¬ÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹(\fIrt\&.jar\fR¥é¥¤¥Ö¥é¥ê)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++\fB\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Å¬ÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹(\fBrt\&.jar\fR¥é¥¤¥Ö¥é¥ê)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-source 1\&.6 OldCode\&.java +-warning: [options] bootstrap class path not set in conjunction with +-\-source 1\&.6 ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \fR ++\fB\-source 1\&.7\fR ++ + .fi + .if n \{\ + .RE + .\} +-ŬÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¸Å¤¤¸À¸ì»ÅÍÍ(¤³¤ÎÎã¤Ç¤Ï¡¢¥Ð¡¼¥¸¥ç¥ó1\&.6¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì)¤ò¿·¤·¤¤¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ÈÁȤ߹礻¤Æ»ÈÍѤ·¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢Â¸ºß¤·¤Ê¤¤¥á¥½¥Ã¥É¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¤¿¤á¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸Å¤¤¥×¥é¥Ã¥È¥Õ¥©¡¼¥à(¤³¤Î¾ì¹ç¤ÏJava SE 6)¤ÇÆ°ºî¤·¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++ŬÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¸Å¤¤¸À¸ì»ÅÍÍ(¤³¤ÎÎã¤Ç¤Ï¡¢¥Ð¡¼¥¸¥ç¥ó1\&.7¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì)¤ò¿·¤·¤¤¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ÈÁȤ߹礻¤Æ»ÈÍѤ·¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢Â¸ºß¤·¤Ê¤¤¥á¥½¥Ã¥É¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¤¿¤á¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸Å¤¤¥×¥é¥Ã¥È¥Õ¥©¡¼¥à(¤³¤Î¾ì¹ç¤ÏJava SE 7)¤ÇÆ°ºî¤·¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\fBExample 5\fR, ¥¯¥í¥¹¡¦¥³¥ó¥Ñ¥¤¥ë ++\fBÎã 5\fR ++.br ++¥¯¥í¥¹¡¦¥³¥ó¥Ñ¥¤¥ë + .RS 4 +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIjavac\fR¤ò»ÈÍѤ·¤Æ¡¢JVM 1\&.6¾å¤Ç¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBjavac\fR¤ò»ÈÍѤ·¤Æ¡¢JVM 1\&.7¾å¤Ç¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e +- \-extdirs "" OldCode\&.java ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e\fR ++\fB \-extdirs "" OldCode\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-The\fI \-source 1\&.6\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢OldCode\&.java¤Î¥³¥ó¥Ñ¥¤¥ë¤Ë¤Ï¥ê¥ê¡¼¥¹1\&.6(¤Þ¤¿¤Ï6)¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fI\-target 1\&.6\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢JVM 1\&.6¤È¸ß´¹À­¤Î¤¢¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢\fI\-target\fR¤ÎÃͤÏ\fI\-source\fR¤ÎÃͤˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤Ï¾Êά¤µ¤ì¤Þ¤¹¡£ ++\fB \-source 1\&.7\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢OldCode\&.java¤Î¥³¥ó¥Ñ¥¤¥ë¤Ë¤Ï¥ê¥ê¡¼¥¹1\&.7(¤Þ¤¿¤Ï7)¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fB\-target 1\&.7\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢JVM 1\&.7¤È¸ß´¹À­¤Î¤¢¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢\fB\-target\fR¤ÎÃͤÏ\fB\-source\fR¤ÎÃͤˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤Ï¾Êά¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Å¬ÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹(\fIrt\&.jar\fR¥é¥¤¥Ö¥é¥ê)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++\fB\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Å¬ÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹(\fBrt\&.jar\fR¥é¥¤¥Ö¥é¥ê)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-source 1\&.6 OldCode\&.java +-warning: [options] bootstrap class path not set in conjunction with \-source 1\&.6 ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \-source 1\&.7\fR ++ + .fi + .if n \{\ + .RE + .\} +-ŬÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¸Å¤¤¸À¸ì»ÅÍͤò¿·¤·¤¤¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ÈÁȤ߹礻¤Æ»ÈÍѤ·¤Þ¤¹¡£¤³¤ÎÁȹ礻¤Ï¡¢Â¸ºß¤·¤Ê¤¤¥á¥½¥Ã¥É¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¤¿¤á¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸Å¤¤¥×¥é¥Ã¥È¥Õ¥©¡¼¥à(¤³¤Î¾ì¹ç¤ÏJava SE 6)¤ÇÆ°ºî¤·¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤ÏJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥ê¥ê¡¼¥¹1\&.6¤ò»ÈÍѤ·¤Þ¤¹¡£ ++ŬÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¸Å¤¤¸À¸ì»ÅÍͤò¿·¤·¤¤¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ÈÁȤ߹礻¤Æ»ÈÍѤ·¤Þ¤¹¡£¤³¤ÎÁȹ礻¤Ï¡¢Â¸ºß¤·¤Ê¤¤¥á¥½¥Ã¥É¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¤¿¤á¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸Å¤¤¥×¥é¥Ã¥È¥Õ¥©¡¼¥à(¤³¤Î¾ì¹ç¤ÏJava SE 7)¤ÇÆ°ºî¤·¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤ÏJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥ê¥ê¡¼¥¹1\&.7¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/javadoc.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/javadoc.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: javadoc +-.\" Language: English +-.\" Date: 2011ǯ5·î10Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: javadoc ++.\" Language: Japanese ++.\" Date: 2011ǯ5·î10Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "javadoc" "1" "2011ǯ5·î10Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + javadoc \- Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é¡¢API¥É¥­¥å¥á¥ó¥È¤ÎHTML¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjavadoc\fR {\fIpackages\fR|\fIsource\-files\fR} [\fIoptions\fR] [\fI@argfiles\fR] ++\fBjavadoc\fR {\fIpackages\fR|\fIsource\-files\fR} [\fIoptions\fR] [\fI@argfiles\fR] + .fi + .if n \{\ + .RE +@@ -64,33 +66,33 @@ + .PP + \fIpackages\fR + .RS 4 +-\fIjava\&.lang java\&.lang\&.reflect java\&.awt\fR¤Ê¤É¡¢¶õÇò¤Ç¶èÀڤäƥɥ­¥å¥á¥ó¥È²½¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¡£¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤â¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ï¡¢\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥Ñ¥Ã¥±¡¼¥¸¤ò»ØÄꤷ¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjavadoc\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ª¤è¤Ó¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ç»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤òõ¤·¤Þ¤¹¡£\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸¤òõ¤¹¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBjava\&.lang java\&.lang\&.reflect java\&.awt\fR¤Ê¤É¡¢¶õÇò¤Ç¶èÀڤäƥɥ­¥å¥á¥ó¥È²½¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¡£¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤â¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ï¡¢\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥Ñ¥Ã¥±¡¼¥¸¤ò»ØÄꤷ¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjavadoc\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ª¤è¤Ó¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ç»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤òõ¤·¤Þ¤¹¡£\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸¤òõ¤¹¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \fIsource\-files\fR + .RS 4 +-\fIClass\&.java Object\&.java Button\&.java\fR¤Î¤è¤¦¤Ë¶õÇò¤Ç¶èÀڤä¿¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ëJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjavadoc\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤òõ¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fI/home/src/java/awt/Graphics*\&.java\fR¤Î¤è¤¦¤Ë¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Õ¥ë¥Ñ¥¹¤ò»ØÄꤷ¡¢¥ï¥¤¥ë¥É¥«¡¼¥Éʸ»ú¤ò»ÈÍѤǤ­¤Þ¤¹¡£¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBClass\&.java Object\&.java Button\&.java\fR¤Î¤è¤¦¤Ë¶õÇò¤Ç¶èÀڤä¿¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ëJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjavadoc\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤òõ¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fB/home/src/java/awt/Graphics*\&.java\fR¤Î¤è¤¦¤Ë¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Õ¥ë¥Ñ¥¹¤ò»ØÄꤷ¡¢¥ï¥¤¥ë¥É¥«¡¼¥Éʸ»ú¤ò»ÈÍѤǤ­¤Þ¤¹¡£¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \fIoptions\fR + .RS 4 +-¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fI@argfiles\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¡¦¥ª¥×¥·¥ç¥ó¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ª¤è¤Ó¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤òǤ°Õ¤Î½ç½ø¤Ç´Þ¤à¥Õ¥¡¥¤¥ë¤Î̾Á°¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¡¦¥ª¥×¥·¥ç¥ó¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ª¤è¤Ó¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤òǤ°Õ¤Î½ç½ø¤Ç´Þ¤à¥Õ¥¡¥¤¥ë¤Î̾Á°¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢°ìÏ¢¤ÎJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ëÀë¸À¤ª¤è¤Ó¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò²òÀϤ·¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢public¥¯¥é¥¹¡¢protected¥¯¥é¥¹¡¢¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹(ƿ̾¤ÎÆâÉô¥¯¥é¥¹¤Ï½ü¤¯)¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤Ë¤Ä¤¤¤Æµ­½Ò¤·¤¿°ìÏ¢¤ÎHTML¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢API¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤ä¡¢°ìÏ¢¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¼ÂÁõ¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Á´ÂΡ¢¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤½¤ÎξÊý¤ËÂФ·¤Æ¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤΥɥ­¥å¥á¥ó¥È²½¤ò¹Ô¤¦¤Ë¤Ï¡¢\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤òºÆµ¢Åª¤Ë¤¿¤É¤ë¤«¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ÎÌÀ¼¨Åª¤Ê¥ê¥¹¥È¤òÅϤ·¤Þ¤¹¡£¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤òÅϤ·¤Þ¤¹¡£´Êñ¤ÊÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢°ìÏ¢¤ÎJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ëÀë¸À¤ª¤è¤Ó¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò²òÀϤ·¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢public¥¯¥é¥¹¡¢protected¥¯¥é¥¹¡¢¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹(ƿ̾¤ÎÆâÉô¥¯¥é¥¹¤Ï½ü¤¯)¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤Ë¤Ä¤¤¤Æµ­½Ò¤·¤¿°ìÏ¢¤ÎHTML¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢API¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤ä¡¢°ìÏ¢¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¼ÂÁõ¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Á´ÂΡ¢¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤½¤ÎξÊý¤ËÂФ·¤Æ¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤΥɥ­¥å¥á¥ó¥È²½¤ò¹Ô¤¦¤Ë¤Ï¡¢\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤òºÆµ¢Åª¤Ë¤¿¤É¤ë¤«¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ÎÌÀ¼¨Åª¤Ê¥ê¥¹¥È¤òÅϤ·¤Þ¤¹¡£¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤òÅϤ·¤Þ¤¹¡£´Êñ¤ÊÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¤Ç½ª¤ï¤ë¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤½¤Î¾¤Î¥Õ¥¡¥¤¥ë¤ò½èÍý¤·¤Þ¤¹¡£¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÅϤ·¤Æ\fIjavadoc\fR¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¤É¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò½èÍý¤¹¤ë¤«¤òÀµ³Î¤Ë»ØÄê¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢Â¿¤¯¤Î³«È¯¼Ô¤Ï¤³¤ÎÊýË¡¤Ç¤Ïºî¶È¤·¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ¹¤Û¤¦¤¬´Êñ¤À¤«¤é¤Ç¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤¯¤Æ¤â¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï3¤Ä¤ÎÊýË¡¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¡¢\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤«¡¢¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ë¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò¹Ô¤¦¤Î¤Ï¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬¼¡¤Î¤¹¤Ù¤Æ¤ÎÍ×·ï¤òËþ¤¿¤¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¤Ç½ª¤ï¤ë¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤½¤Î¾¤Î¥Õ¥¡¥¤¥ë¤ò½èÍý¤·¤Þ¤¹¡£¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÅϤ·¤Æ\fBjavadoc\fR¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¤É¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò½èÍý¤¹¤ë¤«¤òÀµ³Î¤Ë»ØÄê¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢Â¿¤¯¤Î³«È¯¼Ô¤Ï¤³¤ÎÊýË¡¤Ç¤Ïºî¶È¤·¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ¹¤Û¤¦¤¬´Êñ¤À¤«¤é¤Ç¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤¯¤Æ¤â¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï3¤Ä¤ÎÊýË¡¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¡¢\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤«¡¢¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ë¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò¹Ô¤¦¤Î¤Ï¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬¼¡¤Î¤¹¤Ù¤Æ¤ÎÍ×·ï¤òËþ¤¿¤¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -100,7 +102,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Õ¥¡¥¤¥ë̾¤ÎÀÜƬ¼­(\fI\&.java\fR¤òºï½ü)¤¬Í­¸ú¤Ê¥¯¥é¥¹Ì¾¤Ç¤¢¤ë¡£ ++¥Õ¥¡¥¤¥ë̾¤ÎÀÜƬ¼­(\fB\&.java\fR¤òºï½ü)¤¬Í­¸ú¤Ê¥¯¥é¥¹Ì¾¤Ç¤¢¤ë¡£ + .RE + .sp + .RS 4 +@@ -124,8 +126,10 @@ + .\} + ¥Ñ¥Ã¥±¡¼¥¸Ê¸¤ËÍ­¸ú¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¡£ + .RE +-¥ê¥ó¥¯¤Î½èÍý.PP +-½èÍý¤Î¼Â¹ÔÃæ¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¼Â¹Ô¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥á¥ó¥Ð¡¼¤Î̾Á°¤ËÂФ·¤Æ¡¢Áê¸ß»²¾È¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤Ï¡¢¼¡¤Î¾ì½ê¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£@¥¿¥°¤ÎÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢javadoc¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++¥ê¥ó¥¯¤Î½èÍý ++.PP ++½èÍý¤Î¼Â¹ÔÃæ¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¼Â¹Ô¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥á¥ó¥Ð¡¼¤Î̾Á°¤ËÂФ·¤Æ¡¢Áê¸ß»²¾È¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤Ï¡¢¼¡¤Î¾ì½ê¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£@¥¿¥°¤ÎÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢javadoc¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .RS 4 + .ie n \{\ +@@ -146,7 +150,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI@see\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿¡Ö\fI´ØÏ¢¹àÌÜ\fR¡×¥»¥¯¥·¥ç¥ó¡£ ++\fB@see\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿\fI¡Ö´ØÏ¢¹àÌÜ¡×\fR¥»¥¯¥·¥ç¥ó¡£ + .RE + .sp + .RS 4 +@@ -157,7 +161,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI{@link}\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿¥¤¥ó¥é¥¤¥ó¡¦¥Æ¥­¥¹¥È¡£ ++\fB{@link}\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿¥¤¥ó¥é¥¤¥ó¡¦¥Æ¥­¥¹¥È¡£ + .RE + .sp + .RS 4 +@@ -168,7 +172,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI@throws\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿Îã³°¤Î̾Á°¡£ ++\fB@throws\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿Îã³°¤Î̾Á°¡£ + .RE + .sp + .RS 4 +@@ -179,7 +183,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë¡Ö\fIÄêµÁ\fR¡×¥ê¥ó¥¯¤È¡¢¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë¡Ö\fI¥ª¡¼¥Ð¡¼¥é¥¤¥É\fR¡×¥ê¥ó¥¯¡£¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë\fI¡ÖÄêµÁ¡×\fR¥ê¥ó¥¯¤È¡¢¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë\fI¡Ö¥ª¡¼¥Ð¡¼¥é¥¤¥É¡×\fR¥ê¥ó¥¯¡£¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -215,37 +219,39 @@ + º÷°ú¡£ + .RE + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¤Î´û¸¤Î¥Æ¥­¥¹¥È(Ê̤ËÀ¸À®¤·¤¿¥Æ¥­¥¹¥È)¤ËÂФ·¤Æ¥ê¥ó¥¯¤òÄɲ乤ë¤Ë¤Ï¡¢\fI\-link\fR¤ª¤è¤Ó\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤òÍøÍѤǤ­¤Þ¤¹¡£ +-½èÍý¤Î¾ÜºÙ.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼Â¹Ô¤¹¤ë¤¿¤Ó¤Ë1¤Ä¤Î´°Á´¤Ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£Á°¤Î¼Â¹Ô¤Î·ë²Ì¤òÊѹ¹¤Þ¤¿¤ÏľÀܼè¤ê¹þ¤à¡¢Áýʬ¥Ó¥ë¥É¤ò¹Ô¤¤¤Þ¤»¤ó¡£¤¿¤À¤·¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Â¾¤Î¼Â¹Ô¤Î·ë²Ì¤Ë¥ê¥ó¥¯¤Ç¤­¤Þ¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼ÂÁõ¤Ë¤ÏJava¥³¥ó¥Ñ¥¤¥é¤¬É¬Íפǡ¢Java¥³¥ó¥Ñ¥¤¥é¤Ë°Í¸¤·¤Æ¤¤¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï\fIjavac\fR¥³¥Þ¥ó¥É¤Î°ìÉô¤ò¸Æ¤Ó½Ð¤·¡¢Àë¸À¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¡¢¥á¥ó¥Ð¡¼¤Î¼ÂÁõ¤ò̵»ë¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¹³¬Áؤò´Þ¤à¥¯¥é¥¹¤ÎË­ÉÙ¤ÊÆâÉôɽ¸½¤È¥¯¥é¥¹¤Î¡Ö»ÈÍѡ״ط¸¤ò¹½ÃÛ¤·¡¢HTML¤òÀ¸À®¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢J\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤«¤é¡¢¥æ¡¼¥¶¡¼¤ÎÄ󶡤·¤¿¥É¥­¥å¥á¥ó¥È¤â¼èÆÀ¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥á¥½¥Ã¥ÉËÜÂΤò»ý¤¿¤Ê¤¤½ã¿è¤Ê¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢API¤Î¼ÂÁõÁ°¤ÎÀ߷פÎÁᤤÃʳ¬¤Ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤·¤Æ\fIjavadoc\fR¥³¥á¥ó¥È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ +-.PP +-¥³¥ó¥Ñ¥¤¥é¤Ë°Í¸¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢HTML½ÐÎϤϡ¢¼ÂºÝ¤Î¼ÂÁõ¤ËÀµ³Î¤ËÂбþ¤·¤Þ¤¹¡£¼ÂºÝ¤Î¼ÂÁõ¤Ï¡¢ÌÀ¼¨Åª¤Ê¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤Ç¤Ï¤Ê¤¯¡¢°ÅÌۤΥ½¡¼¥¹¡¦¥³¡¼¥É¤Ë°Í¸¤¹¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥ó¥Ñ¥¤¥ëºÑ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï¸ºß¤¹¤ë¤¬¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤Ï¸ºß¤·¤Ê¤¤¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥¹¥È¥é¥¯¥¿¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£ +-.PP +-¿¤¯¤Î¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¡¼¥É¤¬ÉÔ´°Á´¤Þ¤¿¤Ï¥¨¥é¡¼¤ò´Þ¤ó¤Ç¤¤¤ë¾ì¹ç¤Ç¤â¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ç¥Ð¥Ã¥°¤ä¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ò´°Î»¤¹¤ëÁ°¤Ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î´ðËÜŪ¤Ê¥Á¥§¥Ã¥¯¤ò¹Ô¤¤¤Þ¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥É¥­¥å¥á¥ó¥È¤ÎÆâÉô¹½Â¤¤ò¹½ÃÛ¤¹¤ëºÝ¡¢»²¾È¥¯¥é¥¹¤ò¤¹¤Ù¤Æ¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢ +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¢³ÈÄ¥µ¡Ç½¡¢¤Þ¤¿¤Ï¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤Ë¤«¤«¤ï¤é¤º¡¢¤¹¤Ù¤Æ¤Î»²¾È¥¯¥é¥¹¤ò¸¡º÷¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤Î¸¡½ÐÊýË¡ ++¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¤Î´û¸¤Î¥Æ¥­¥¹¥È(Ê̤ËÀ¸À®¤·¤¿¥Æ¥­¥¹¥È)¤ËÂФ·¤Æ¥ê¥ó¥¯¤òÄɲ乤ë¤Ë¤Ï¡¢\fB\-link\fR¤ª¤è¤Ó\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤òÍøÍѤǤ­¤Þ¤¹¡£ ++.PP ++½èÍý¤Î¾ÜºÙ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼Â¹Ô¤¹¤ë¤¿¤Ó¤Ë1¤Ä¤Î´°Á´¤Ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£Á°¤Î¼Â¹Ô¤Î·ë²Ì¤òÊѹ¹¤Þ¤¿¤ÏľÀܼè¤ê¹þ¤à¡¢Áýʬ¥Ó¥ë¥É¤ò¹Ô¤¤¤Þ¤»¤ó¡£¤¿¤À¤·¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Â¾¤Î¼Â¹Ô¤Î·ë²Ì¤Ë¥ê¥ó¥¯¤Ç¤­¤Þ¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼ÂÁõ¤Ë¤ÏJava¥³¥ó¥Ñ¥¤¥é¤¬É¬Íפǡ¢Java¥³¥ó¥Ñ¥¤¥é¤Ë°Í¸¤·¤Æ¤¤¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï\fBjavac\fR¥³¥Þ¥ó¥É¤Î°ìÉô¤ò¸Æ¤Ó½Ð¤·¡¢Àë¸À¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¡¢¥á¥ó¥Ð¡¼¤Î¼ÂÁõ¤ò̵»ë¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¹³¬Áؤò´Þ¤à¥¯¥é¥¹¤ÎË­ÉÙ¤ÊÆâÉôɽ¸½¤È¥¯¥é¥¹¤Î¡Ö»ÈÍѡ״ط¸¤ò¹½ÃÛ¤·¡¢HTML¤òÀ¸À®¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢J\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤«¤é¡¢¥æ¡¼¥¶¡¼¤ÎÄ󶡤·¤¿¥É¥­¥å¥á¥ó¥È¤â¼èÆÀ¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥á¥½¥Ã¥ÉËÜÂΤò»ý¤¿¤Ê¤¤½ã¿è¤Ê¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢API¤Î¼ÂÁõÁ°¤ÎÀ߷פÎÁᤤÃʳ¬¤Ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤·¤Æ\fBjavadoc\fR¥³¥á¥ó¥È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ ++.PP ++¥³¥ó¥Ñ¥¤¥é¤Ë°Í¸¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢HTML½ÐÎϤϡ¢¼ÂºÝ¤Î¼ÂÁõ¤ËÀµ³Î¤ËÂбþ¤·¤Þ¤¹¡£¼ÂºÝ¤Î¼ÂÁõ¤Ï¡¢ÌÀ¼¨Åª¤Ê¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤Ç¤Ï¤Ê¤¯¡¢°ÅÌۤΥ½¡¼¥¹¡¦¥³¡¼¥É¤Ë°Í¸¤¹¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥ó¥Ñ¥¤¥ëºÑ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï¸ºß¤¹¤ë¤¬¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤Ï¸ºß¤·¤Ê¤¤¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥¹¥È¥é¥¯¥¿¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£ ++.PP ++¿¤¯¤Î¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¡¼¥É¤¬ÉÔ´°Á´¤Þ¤¿¤Ï¥¨¥é¡¼¤ò´Þ¤ó¤Ç¤¤¤ë¾ì¹ç¤Ç¤â¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ç¥Ð¥Ã¥°¤ä¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ò´°Î»¤¹¤ëÁ°¤Ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î´ðËÜŪ¤Ê¥Á¥§¥Ã¥¯¤ò¹Ô¤¤¤Þ¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥É¥­¥å¥á¥ó¥È¤ÎÆâÉô¹½Â¤¤ò¹½ÃÛ¤¹¤ëºÝ¡¢»²¾È¥¯¥é¥¹¤ò¤¹¤Ù¤Æ¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¢³ÈÄ¥µ¡Ç½¡¢¤Þ¤¿¤Ï¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤Ë¤«¤«¤ï¤é¤º¡¢¤¹¤Ù¤Æ¤Î»²¾È¥¯¥é¥¹¤ò¸¡º÷¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤Î¸¡½ÐÊýË¡ + (http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/findingclasses\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-Ä̾ºîÀ®¤¹¤ë¥¯¥é¥¹¤Ï¡¢³ÈÄ¥¥¯¥é¥¹¤È¤·¤Æ¡¢¤Þ¤¿¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Ç¥í¡¼¥É¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++Ä̾ºîÀ®¤¹¤ë¥¯¥é¥¹¤Ï¡¢³ÈÄ¥¥¯¥é¥¹¤È¤·¤Æ¡¢¤Þ¤¿¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Ç¥í¡¼¥É¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .SS "Javadoc¤Î¥É¥Ã¥¯¥ì¥Ã¥È" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤÎÆâÍƤȷÁ¼°¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤È¸Æ¤Ð¤ì¤ë¥Ç¥Õ¥©¥ë¥È¤ÎÁȹþ¤ß¥É¥Ã¥¯¥ì¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢HTML·Á¼°¤ÎAPI¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò½¤Àµ¤Þ¤¿¤Ï¥µ¥Ö¥¯¥é¥¹¤òºîÀ®¤¹¤ë¤³¤È¤ä¡¢HTML¡¢XML¡¢MIF¡¢RTF¤Ê¤É¤Î¹¥¤ß¤Î½ÐÎÏ·Á¼°¤òÀ¸À®¤¹¤ëÆȼ«¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤òµ­½Ò¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£ +-.PP +-\fI\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢»ÈÍѤµ¤ì¤Æ¤¤¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤Ë´Ø·¸¤Ê¤¯»ÈÍѤǤ­¤ë¤¤¤¯¤Ä¤«¤Î¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¤³¤ì¤é¤Î¾¤Ë¡¢¤¤¤¯¤Ä¤«¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬Äɲ䵤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤÎÆâÍƤȷÁ¼°¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤È¸Æ¤Ð¤ì¤ë¥Ç¥Õ¥©¥ë¥È¤ÎÁȹþ¤ß¥É¥Ã¥¯¥ì¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢HTML·Á¼°¤ÎAPI¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò½¤Àµ¤Þ¤¿¤Ï¥µ¥Ö¥¯¥é¥¹¤òºîÀ®¤¹¤ë¤³¤È¤ä¡¢HTML¡¢XML¡¢MIF¡¢RTF¤Ê¤É¤Î¹¥¤ß¤Î½ÐÎÏ·Á¼°¤òÀ¸À®¤¹¤ëÆȼ«¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤òµ­½Ò¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£ ++.PP ++\fB\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢»ÈÍѤµ¤ì¤Æ¤¤¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤Ë´Ø·¸¤Ê¤¯»ÈÍѤǤ­¤ë¤¤¤¯¤Ä¤«¤Î¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¤³¤ì¤é¤Î¾¤Ë¡¢¤¤¤¯¤Ä¤«¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬Äɲ䵤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥¿¥¤¥×¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£¤½¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¥¯¥é¥¹¤ÎJava¸À¸ì¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(\fI\&.java\fR)¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¤½¤Î¾¤Î̤½èÍý¤Î¥Õ¥¡¥¤¥ë¤Ç¤¹¡£¤³¤³¤Ç¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤·¤Ê¤¤¤¬¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Ë¸ºß¤¹¤ë¾ì¹ç¤¬¤¢¤ë¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ä¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¤âÀâÌÀ¤·¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥¿¥¤¥×¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£¤½¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¥¯¥é¥¹¤ÎJava¸À¸ì¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(\fB\&.java\fR)¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¤½¤Î¾¤Î̤½èÍý¤Î¥Õ¥¡¥¤¥ë¤Ç¤¹¡£¤³¤³¤Ç¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤·¤Ê¤¤¤¬¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Ë¸ºß¤¹¤ë¾ì¹ç¤¬¤¢¤ë¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ä¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¤âÀâÌÀ¤·¤Þ¤¹¡£ + .SS "¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë" + .PP + ¤½¤ì¤¾¤ì¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤ª¤è¤Ó¤½¤Î¥á¥ó¥Ð¡¼¤Ï¡¢Æȼ«¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤ËÊÝ»ý¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë" + .PP +-¤½¤ì¤¾¤ì¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢Æȼ«¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤òÀìÍѤΥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÊÝ»ý¤·¤Þ¤¹¡£¤½¤ÎÆâÍƤϡ¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¡¦¥Ú¡¼¥¸¤ËÁȤ߹þ¤Þ¤ì¤Þ¤¹¡£¤³¤Î¥³¥á¥ó¥È¤Ë¤Ï¡¢Ä̾¤½¤Î¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤËÅö¤Æ¤Ï¤Þ¤ë¥É¥­¥å¥á¥ó¥È¤òµ­½Ò¤·¤Þ¤¹¡£ ++¤½¤ì¤¾¤ì¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢Æȼ«¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤òÀìÍѤΥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÊÝ»ý¤·¤Þ¤¹¡£¤½¤ÎÆâÍƤϡ¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¡¦¥Ú¡¼¥¸¤ËÁȤ߹þ¤Þ¤ì¤Þ¤¹¡£¤³¤Î¥³¥á¥ó¥È¤Ë¤Ï¡¢Ä̾¤½¤Î¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤËÅö¤Æ¤Ï¤Þ¤ë¥É¥­¥å¥á¥ó¥È¤òµ­½Ò¤·¤Þ¤¹¡£ + .PP + ¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤¤¤º¤ì¤«¤Î¥Õ¥¡¥¤¥ë¤Ë¥³¥á¥ó¥È¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£ + .sp +@@ -257,7 +263,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¡¢¥Ñ¥Ã¥±¡¼¥¸Ãí¼á¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¢¤ª¤è¤ÓJavadoc¥¿¥°¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤¬Í¥À褵¤ì¤Þ¤¹¡£ ++\fBpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¡¢¥Ñ¥Ã¥±¡¼¥¸Ãí¼á¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¢¤ª¤è¤ÓJavadoc¥¿¥°¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤¬Í¥À褵¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -268,73 +274,81 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÈJavadoc¥¿¥°¤Î¤ß¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ãí¼á¤Ï³ÊǼ¤Ç¤­¤Þ¤»¤ó¡£ +-.RE +-.PP +-³Æ¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢\fIpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï\fIpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Î¤¤¤º¤ì¤«¤ò1¤Ä»ý¤Ä¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤ÎξÊý¤ò»ý¤Ä¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¤É¤Á¤é¤«¤Î¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¤È¤â¤Ë¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Î¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤ËÇÛÃÖ¤·¤Æ¤¯¤À¤µ¤¤¡£ +-package\-info\&.java¥Õ¥¡¥¤¥ë.PP +-\fIpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î¹½Â¤¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥á¥ó¥È¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¤ÎÁ°¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ ++\fBpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÈJavadoc¥¿¥°¤Î¤ß¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ãí¼á¤Ï³ÊǼ¤Ç¤­¤Þ¤»¤ó¡£ ++.RE ++.PP ++³Æ¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢\fBpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï\fBpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Î¤¤¤º¤ì¤«¤ò1¤Ä»ý¤Ä¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤ÎξÊý¤ò»ý¤Ä¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¤É¤Á¤é¤«¤Î¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¤È¤â¤Ë¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Î¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤ËÇÛÃÖ¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++package\-info\&.java¥Õ¥¡¥¤¥ë ++.PP ++\fBpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î¹½Â¤¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥á¥ó¥È¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¤ÎÁ°¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤Ç¤¢¤ë\fI/**\fR¤ª¤è¤Ó\fI*/\fR¤¬Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢Ãæ´Ö¤Î¹Ô¤ÎÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤Ï¾Êά²Äǽ¤Ç¤¹¡£ ++¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤Ç¤¢¤ë\fB/**\fR¤ª¤è¤Ó\fB*/\fR¤¬Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢Ãæ´Ö¤Î¹Ô¤ÎÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤Ï¾Êά²Äǽ¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * Provides the classes necessary to create an +- * applet and the classes an applet uses +- * to communicate with its applet context\&. +- *

    +- * The applet framework involves two entities: +- * the applet and the applet context\&. +- * An applet is an embeddable window (see the +- * {@link java\&.awt\&.Panel} class) with a few extra +- * methods that the applet context can use to +- * initialize, start, and stop the applet\&. +- * +- * @since 1\&.0 +- * @see java\&.awt +- */ +-package java\&.lang\&.applet; ++\fB/**\fR ++\fB * Provides the classes necessary to create an \fR ++\fB * applet and the classes an applet uses \fR ++\fB * to communicate with its applet context\&.\fR ++\fB *

    \fR ++\fB * The applet framework involves two entities:\fR ++\fB * the applet and the applet context\&.\fR ++\fB * An applet is an embeddable window (see the\fR ++\fB * {@link java\&.awt\&.Panel} class) with a few extra\fR ++\fB * methods that the applet context can use to \fR ++\fB * initialize, start, and stop the applet\&.\fR ++\fB *\fR ++\fB * @since 1\&.0\fR ++\fB * @see java\&.awt\fR ++\fB */\fR ++\fBpackage java\&.lang\&.applet;\fR ++ + .fi + .if n \{\ + .RE + .\} +-package\&.html¥Õ¥¡¥¤¥ë.PP +-\fIpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î¹½Â¤¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥á¥ó¥È¤Ï¡¢\fI\fRÍ×ÁǤËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ ++.PP ++package\&.html¥Õ¥¡¥¤¥ë ++.PP ++\fBpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î¹½Â¤¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥á¥ó¥È¤Ï¡¢\fB\fRÍ×ÁǤËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ + .PP + ¥Õ¥¡¥¤¥ë: +-\fIjava/applet/package\&.html\fR ++\fBjava/applet/package\&.html\fR + .sp + .if n \{\ + .RS 4 + .\} + .nf +- +- +-Provides the classes necessary to create an applet and the +-classes an applet uses to communicate with its applet context\&. +-

    +-The applet framework involves two entities: the applet +-and the applet context\&. An applet is an embeddable +-window (see the {@link java\&.awt\&.Panel} class) with a +-few extra methods that the applet context can use to +-initialize, start, and stop the applet\&. +- +-@since 1\&.0 +-@see java\&.awt +- +- ++\fB\fR ++\fB\fR ++\fBProvides the classes necessary to create an applet and the \fR ++\fBclasses an applet uses to communicate with its applet context\&.\fR ++\fB

    \fR ++\fBThe applet framework involves two entities: the applet\fR ++\fBand the applet context\&. An applet is an embeddable\fR ++\fBwindow (see the {@link java\&.awt\&.Panel} class) with a\fR ++\fBfew extra methods that the applet context can use to\fR ++\fBinitialize, start, and stop the applet\&. \fR ++ ++\fB@since 1\&.0 \fR ++\fB@see java\&.awt\fR ++\fB\fR ++\fB\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIpackage\&.html\fR¥Õ¥¡¥¤¥ë¤ÏÄ̾ï¤ÎHTML¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¤ò´Þ¤ó¤Ç¤¤¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÏHTML¤Çµ­½Ò¤·¤Þ¤¹¤¬¡¢Îã³°¤¬1¤Ä¤¢¤ê¤Þ¤¹¡£¤³¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤Ç¤¢¤ë\fI/**\fR¤È\fI*/\fR¡¢¤Þ¤¿¤Ï¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤ò´Þ¤á¤Ê¤¤¡¢¤È¤¤¤¦ÅÀ¤Ç¤¹¡£¥³¥á¥ó¥È¤ò½ñ¤¯¾ì¹ç¤Ï¡¢ºÇ½é¤Îʸ¤ò¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¤È¤·¡¢\fI\fR¥¿¥°¤ÈºÇ½é¤Îʸ¤Î´Ö¤Ë¥¿¥¤¥È¥ë¤ä¤½¤Î¾¤Î¥Æ¥­¥¹¥È¤ò´Þ¤á¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤ËÇÛÃÖ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI@see\fR¥¿¥°¤ò¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢´°Á´½¤¾þ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý.PP +-\fIjavadoc\fR¥³¥á¥ó¥È¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¼ê½ç¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBpackage\&.html\fR¥Õ¥¡¥¤¥ë¤ÏÄ̾ï¤ÎHTML¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¤ò´Þ¤ó¤Ç¤¤¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÏHTML¤Çµ­½Ò¤·¤Þ¤¹¤¬¡¢Îã³°¤¬1¤Ä¤¢¤ê¤Þ¤¹¡£¤³¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤Ç¤¢¤ë\fB/**\fR¤È\fB*/\fR¡¢¤Þ¤¿¤Ï¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤ò´Þ¤á¤Ê¤¤¡¢¤È¤¤¤¦ÅÀ¤Ç¤¹¡£¥³¥á¥ó¥È¤ò½ñ¤¯¾ì¹ç¤Ï¡¢ºÇ½é¤Îʸ¤ò¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¤È¤·¡¢\fB\fR¥¿¥°¤ÈºÇ½é¤Îʸ¤Î´Ö¤Ë¥¿¥¤¥È¥ë¤ä¤½¤Î¾¤Î¥Æ¥­¥¹¥È¤ò´Þ¤á¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤ËÇÛÃÖ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB@see\fR¥¿¥°¤ò¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢´°Á´½¤¾þ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý ++.PP ++\fBjavadoc\fR¥³¥á¥ó¥È¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¼ê½ç¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -344,8 +358,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-½èÍý¤Ç¤­¤ë¤è¤¦¤Ë¥³¥á¥ó¥È¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£package\&.html¤Î¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI\fR¤È\fI\fR +-HTML¥¿¥°´Ö¤Î¤¹¤Ù¤Æ¤ÎÆâÍƤò¥³¥Ô¡¼¤·¤Þ¤¹¡£\fI\fR¥»¥¯¥·¥ç¥ó¤ò´Þ¤á¡¢¤½¤³¤Ë\fI\fR¥¿¥°¤ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÃøºî¸¢µ­½Ò¤Ê¤É¤Î¾ðÊó¤òÇÛÃÖ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¤¬¡¢À¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¤½¤ì¤é¤Ï°ìÀÚɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ ++½èÍý¤Ç¤­¤ë¤è¤¦¤Ë¥³¥á¥ó¥È¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£package\&.html¤Î¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB<body>\fR¤È\fB</body>\fR ++HTML¥¿¥°´Ö¤Ç¤¹¤Ù¤Æ¤Î¥³¥ó¥Æ¥ó¥Ä¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£\fB<head>\fR¥»¥¯¥·¥ç¥ó¤ò´Þ¤á¤Æ¡¢\fB<title>\fR¥¿¥°¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¥é¥¤¥Èʸ¡¢¤½¤Î¾¤Î¾ðÊó¤òÇÛÃÖ¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤¹¤¬¡¢¤³¤ì¤é¤ÏÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤Ë¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -379,24 +393,24 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¡¦¥Ú¡¼¥¸¤ÎÀèƬ¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢³µÍ×¥Ú¡¼¥¸¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤È¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤òÄɲä·¤Þ¤¹¡£Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¢Standard Edition API»ÅÍͤγµÍ× ++¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¡¦¥Ú¡¼¥¸¤ÎÀèƬ¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢³µÍ×¥Ú¡¼¥¸¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤È¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤òÄɲä·¤Þ¤¹¡£Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¢Standard Edition API»ÅÍͤγµÍ× + (http://docs\&.oracle\&.com/javase/8/docs/api/overview\-summary\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp + ʸ¤Î½ª¤ï¤ê¤Ï¡¢¥¯¥é¥¹¤ä¥á¥ó¥Ð¡¼¤Î¼çÀâÌÀ¤ÎºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤ÈƱ¤¸¥ë¡¼¥ë¤Ë¤è¤Ã¤ÆȽÃǤµ¤ì¤Þ¤¹¡£ + .RE + .SS "³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë" + .PP +-¥É¥­¥å¥á¥ó¥È²½¤¹¤ë³Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤Ï¡¢Æȼ«¤Î³µÍץɥ­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤ÏÀìÍѤΥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÊÝ»ý¤µ¤ì¤Þ¤¹¡£¤½¤ÎÆâÍƤϡ¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë³µÍ×¥Ú¡¼¥¸¤ËÁȤ߹þ¤Þ¤ì¤Þ¤¹¡£¤³¤Î¥³¥á¥ó¥È¤Ë¤Ï¡¢Ä̾¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥ÈÁ´ÂΤËÅö¤Æ¤Ï¤Þ¤ë¥É¥­¥å¥á¥ó¥È¤òµ­½Ò¤·¤Þ¤¹¡£ ++¥É¥­¥å¥á¥ó¥È²½¤¹¤ë³Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤Ï¡¢Æȼ«¤Î³µÍץɥ­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤ÏÀìÍѤΥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÊÝ»ý¤µ¤ì¤Þ¤¹¡£¤½¤ÎÆâÍƤϡ¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë³µÍ×¥Ú¡¼¥¸¤ËÁȤ߹þ¤Þ¤ì¤Þ¤¹¡£¤³¤Î¥³¥á¥ó¥È¤Ë¤Ï¡¢Ä̾¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥ÈÁ´ÂΤËÅö¤Æ¤Ï¤Þ¤ë¥É¥­¥å¥á¥ó¥È¤òµ­½Ò¤·¤Þ¤¹¡£ + .PP + ¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ïoverview\&.html¤Ê¤É¤Î̾Á°¤òÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¡¢¤É¤³¤ËÇÛÃÖ¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£°ìÈÌŪ¤Ê¾ì½ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤ÎºÇ¾åÉô¤Ç¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢\fIjava\&.applet\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬/home/user/src/java/applet¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Ï/home/user/src/overview\&.html¤ËºîÀ®¤Ç¤­¤Þ¤¹¡£ +-.PP +-°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥È¤ËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤òÊ£¿ô²ó¼Â¹Ô¤¹¤ë¾ì¹ç¤Ï¡¢Æ±¤¸1¤Ä¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥»¥Ã¥È¤ËÂФ·¤ÆÊ£¿ô¤Î³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢ÆâÉô¥É¥­¥å¥á¥ó¥ÈÍѤË\fI\-private\fR¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò1²ó¼Â¹Ô¤·¤¿¸å¡¢¸ø³«¥É¥­¥å¥á¥ó¥ÈÍѤˤ½¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤ÇºÆÅټ¹Ԥ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢³Æ³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Î1ʸÌܤǡ¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤ò¸ø³«ÍѤޤ¿¤ÏÆâÉôÍѤȤ·¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£ +-.PP +-³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤϡ¢HTML¤Çµ­½Ò¤µ¤ì¤¿1¤Ä¤ÎÂ礭¤Ê¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤¹¡£ºÇ½é¤Îʸ¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥È¤Î¥µ¥Þ¥ê¡¼¤È¤·¤Þ¤¹¡£\fI<body>\fR¥¿¥°¤ÈºÇ½é¤Îʸ¤Î´Ö¤Ë¥¿¥¤¥È¥ë¤ä¤½¤Î¾¤Î¥Æ¥­¥¹¥È¤ò´Þ¤á¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£{\fI@link}\fR¤Ê¤É¤Î¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤ËÇÛÃÖ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI@see\fR¥¿¥°¤òÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢´°Á´½¤¾þ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¡¢\fI\-overview\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤è¤¦¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¼ê½ç¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fBjava\&.applet\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬/home/user/src/java/applet¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Ï/home/user/src/overview\&.html¤ËºîÀ®¤Ç¤­¤Þ¤¹¡£ ++.PP ++°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥È¤ËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤òÊ£¿ô²ó¼Â¹Ô¤¹¤ë¾ì¹ç¤Ï¡¢Æ±¤¸1¤Ä¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥»¥Ã¥È¤ËÂФ·¤ÆÊ£¿ô¤Î³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢ÆâÉô¥É¥­¥å¥á¥ó¥ÈÍѤË\fB\-private\fR¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò1²ó¼Â¹Ô¤·¤¿¸å¡¢¸ø³«¥É¥­¥å¥á¥ó¥ÈÍѤˤ½¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤ÇºÆÅټ¹Ԥ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢³Æ³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Î1ʸÌܤǡ¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤ò¸ø³«ÍѤޤ¿¤ÏÆâÉôÍѤȤ·¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£ ++.PP ++³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤϡ¢HTML¤Çµ­½Ò¤µ¤ì¤¿1¤Ä¤ÎÂ礭¤Ê¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤¹¡£ºÇ½é¤Îʸ¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥È¤Î¥µ¥Þ¥ê¡¼¤È¤·¤Þ¤¹¡£\fB<body>\fR¥¿¥°¤ÈºÇ½é¤Îʸ¤Î´Ö¤Ë¥¿¥¤¥È¥ë¤ä¤½¤Î¾¤Î¥Æ¥­¥¹¥È¤ò´Þ¤á¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£{\fB@link}\fR¤Ê¤É¤Î¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤ËÇÛÃÖ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB@see\fR¥¿¥°¤òÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢´°Á´½¤¾þ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¡¢\fB\-overview\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤è¤¦¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¼ê½ç¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -406,7 +420,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI<body>\fR¤È\fI</body>\fR¥¿¥°¤Î´Ö¤Ë¤¢¤ëÆâÍƤò¤¹¤Ù¤Æ½èÍýÂоݤȤ·¤Æ¥³¥Ô¡¼¤·¤Þ¤¹¡£ ++\fB<body>\fR¤È\fB</body>\fR¥¿¥°´Ö¤Ç¡¢½èÍý¤¹¤ë¤¹¤Ù¤Æ¤Î¥³¥ó¥Æ¥ó¥Ä¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -444,50 +458,56 @@ + .RE + .SS "̤½èÍý¤Î¥Õ¥¡¥¤¥ë" + .PP +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ°¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Ä̾¥°¥é¥Õ¥£¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¡¢¥µ¥ó¥×¥ë¤ÎJava¥½¡¼¥¹¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢°ìÈÌŪ¤ÊJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î±Æ¶Á¤ò¼õ¤±¤Ê¤¤Â¿¤¯¤ÎÆâÍƤò´Þ¤àÆÈΩ¤·¤¿HTML¥Õ¥¡¥¤¥ë¤Ê¤É¤¬¤¢¤ê¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ°¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Ä̾¥°¥é¥Õ¥£¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¡¢¥µ¥ó¥×¥ë¤ÎJava¥½¡¼¥¹¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢°ìÈÌŪ¤ÊJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î±Æ¶Á¤ò¼õ¤±¤Ê¤¤Â¿¤¯¤ÎÆâÍƤò´Þ¤àÆÈΩ¤·¤¿HTML¥Õ¥¡¥¤¥ë¤Ê¤É¤¬¤¢¤ê¤Þ¤¹¡£ + .PP + ̤½èÍý¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤Ë¤Ï¡¢doc\-files¤È¤¤¤¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤·¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤àǤ°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ê¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£doc\-files¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤ÄÍѰդǤ­¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¥Ü¥¿¥ó¤Î¥¤¥á¡¼¥¸¤ò\fIjava\&.awt\&.Button\fR¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ë´Þ¤á¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤Î¥¤¥á¡¼¥¸¡¦¥Õ¥¡¥¤¥ë¤ò/home/user/src/java/awt/doc\-files/¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤­¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤ò/home/user/src/java/doc\-files¤ËÃÖ¤«¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£java¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ç¤Ï¤Ê¤¤¤«¤é¤Ç¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤³¤È¤â¤Ç¤­¤Þ¤»¤ó¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Ê¤¤¤Î¤Ç¡¢Ì¤½èÍý¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î¤¹¤Ù¤Æ¤Î¥ê¥ó¥¯¤Ï¡¢¥³¡¼¥É¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤È¤½¤Î¤¹¤Ù¤Æ¤ÎÆâÍƤò°¸Àè¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢Button\&.java¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥ê¥ó¥¯¤¬¤É¤Î¤è¤¦¤Ë¸«¤¨¤ë¤«¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥Ü¥¿¥ó¤Î¥¤¥á¡¼¥¸¤ò\fBjava\&.awt\&.Button\fR¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ë´Þ¤á¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤Î¥¤¥á¡¼¥¸¡¦¥Õ¥¡¥¤¥ë¤ò/home/user/src/java/awt/doc\-files/¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤­¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤ò/home/user/src/java/doc\-files¤ËÃÖ¤«¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£java¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ç¤Ï¤Ê¤¤¤«¤é¤Ç¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤³¤È¤â¤Ç¤­¤Þ¤»¤ó¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Ê¤¤¤Î¤Ç¡¢Ì¤½èÍý¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î¤¹¤Ù¤Æ¤Î¥ê¥ó¥¯¤Ï¡¢¥³¡¼¥É¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤È¤½¤Î¤¹¤Ù¤Æ¤ÎÆâÍƤò°¸Àè¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢Button\&.java¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥ê¥ó¥¯¤¬¤É¤Î¤è¤¦¤Ë¸«¤¨¤ë¤«¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * This button looks like this: +- * <img src="doc\-files/Button\&.gif"> +- */ ++\fB/**\fR ++\fB * This button looks like this: \fR ++\fB * <img src="doc\-files/Button\&.gif">\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë" + .PP +-¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤Ï¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤Ç¤­¤Þ¤¹¡£¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤¬½èÍý¤µ¤ì¤ë¤Î¤òËɤ°¤Ë¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢ÌÀ¼¨Åª¤Ë¸ÄÊ̤Υ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÅϤ·¤Þ¤¹¡£ +-.PP +-¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Í­¸ú¤Ê¡¢¥³¥ó¥Ñ¥¤¥ë²Äǽ¤Ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Í­¸ú¤Ê¡¢¸ß´¹À­¤Î¤¢¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢Â¿¤¯¤Î¾ì¹ç¡¢\fI\&.java\fRÀÜÈø¼­¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£ +-¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë.PP +-¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¡¢Ì¾Á°¤Ê¤·¥Ñ¥Ã¥±¡¼¥¸¤ä¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤È¤ÏÊ̤Υѥ屡¼¥¸¤Ë°¤¹¤ë¤è¤¦¤Ë¤¹¤ë¾ì¹ç¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î²¼¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë̵¸ú¤Ê̾Á°¤òÉÕ¤±¤Þ¤¹¡£¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¼¨¤¹¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï·Ù¹ð¤Þ¤¿¤Ï¥¨¥é¡¼¤ò°ú¤­µ¯¤³¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬Ìµ¸ú¤Ê̾Á°¤ò»ý¤Ä¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¸ºß¤¹¤ë¾ì¹ç¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥¹¥­¥Ã¥×¤µ¤ì¡¢¥¨¥é¡¼¤Þ¤¿¤Ï·Ù¹ð¤Ïȯ¹Ô¤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤òcom\&.package1¤ËÄɲ乤ë¤Ë¤Ï¡¢Ìµ¸ú¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¤Þ¤¹¡£¼¡¤Î¥Ç¥£¥ì¥¯¥È¥ê̾¤Ë¤Ï¥Ï¥¤¥Õ¥ó¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤¿¤á̵¸ú¤Ç¤¹¡£ ++¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤Ï¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤Ç¤­¤Þ¤¹¡£¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤¬½èÍý¤µ¤ì¤ë¤Î¤òËɤ°¤Ë¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢ÌÀ¼¨Åª¤Ë¸ÄÊ̤Υ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÅϤ·¤Þ¤¹¡£ ++.PP ++¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Í­¸ú¤Ê¡¢¥³¥ó¥Ñ¥¤¥ë²Äǽ¤Ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Í­¸ú¤Ê¡¢¸ß´¹À­¤Î¤¢¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢Â¿¤¯¤Î¾ì¹ç¡¢\fB\&.java\fRÀÜÈø¼­¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£ ++.PP ++¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë ++.PP ++¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¡¢Ì¾Á°¤Ê¤·¥Ñ¥Ã¥±¡¼¥¸¤ä¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤È¤ÏÊ̤Υѥ屡¼¥¸¤Ë°¤¹¤ë¤è¤¦¤Ë¤¹¤ë¾ì¹ç¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î²¼¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë̵¸ú¤Ê̾Á°¤òÉÕ¤±¤Þ¤¹¡£¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¼¨¤¹¥³¥Þ¥ó¥É¹Ô°ú¿ô¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï·Ù¹ð¤Þ¤¿¤Ï¥¨¥é¡¼¤ò°ú¤­µ¯¤³¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬Ìµ¸ú¤Ê̾Á°¤ò»ý¤Ä¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¸ºß¤¹¤ë¾ì¹ç¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥¹¥­¥Ã¥×¤µ¤ì¡¢¥¨¥é¡¼¤Þ¤¿¤Ï·Ù¹ð¤Ïȯ¹Ô¤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤òcom\&.package1¤ËÄɲ乤ë¤Ë¤Ï¡¢Ìµ¸ú¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¤Þ¤¹¡£¼¡¤Î¥Ç¥£¥ì¥¯¥È¥ê̾¤Ë¤Ï¥Ï¥¤¥Õ¥ó¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤¿¤á̵¸ú¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-com/package1/test\-files/ ++\fBcom/package1/test\-files/\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¸ÄÊ̤μ¹Ԥǡ¢¥ï¥¤¥ë¥É¥«¡¼¥É¤ò´Þ¤ó¤À¥Æ¥¹¥È¡¦¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾(\fIcom/package1/test\-files/*\&.java\fR¤Ê¤É)¤òÅϤ·¤Æ¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤è¤¦¤ËÀßÄê¤Ç¤­¤Þ¤¹¡£ +-¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë.PP +-¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤¹¤ë¤¬¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¥¨¥é¡¼¤òÀ¸À®¤·¤Ê¤¤¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ë\fIBuffer\-Template\&.java\fR¤Ê¤É¤Î̵¸ú¤Ê̾Á°¤òÉÕ¤±¤Æ¡¢½èÍý¤µ¤»¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ÀÜÈø¼­¤Î\fI\&.java\fR¤¬ºï½ü¤µ¤ì¤ë¤ÈÍ­¸ú¤Ê¥¯¥é¥¹Ì¾¤Ë¤Ê¤ë̾Á°¤ò»ý¤Ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤ß¤ò½èÍý¤·¤Þ¤¹¡£ ++¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¸ÄÊ̤μ¹Ԥǡ¢¥ï¥¤¥ë¥É¥«¡¼¥É¤ò´Þ¤ó¤À¥Æ¥¹¥È¡¦¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾(\fBcom/package1/test\-files/*\&.java\fR¤Ê¤É)¤òÅϤ·¤Æ¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤è¤¦¤ËÀßÄê¤Ç¤­¤Þ¤¹¡£ ++.PP ++¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë ++.PP ++¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤¹¤ë¤¬¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¥¨¥é¡¼¤òÀ¸À®¤·¤Ê¤¤¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ë\fBBuffer\-Template\&.java\fR¤Ê¤É¤Î̵¸ú¤Ê̾Á°¤òÉÕ¤±¤Æ¡¢½èÍý¤µ¤»¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ÀÜÈø¼­¤Î\fB\&.java\fR¤¬ºï½ü¤µ¤ì¤ë¤ÈÍ­¸ú¤Ê¥¯¥é¥¹Ì¾¤Ë¤Ê¤ë̾Á°¤ò»ý¤Ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤ß¤ò½èÍý¤·¤Þ¤¹¡£ + .SH "À¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë" + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ëɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¤³¤³¤ÇÀâÌÀ¤¹¤ë¡¢´ðËÜÆâÍÆ¥Ú¡¼¥¸¡¢Áê¸ß»²¾È¥Ú¡¼¥¸¡¢¥µ¥Ý¡¼¥È¡¦¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£³ÆHTML¥Ú¡¼¥¸¤Ï¸ÄÊ̤Υե¡¥¤¥ë¤ËÂбþ¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢2¤Ä¤Î¥¿¥¤¥×¤Î¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ºÇ½é¤Î¥¿¥¤¥×¤Ë¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë±þ¤¸¤¿Ì¾Á°¤¬ÉÕ¤±¤é¤ì¤Þ¤¹¡£2ÈÖÌܤΥ¿¥¤¥×¤Ë¤Ï¡¢ºÇ½é¤Î¥¿¥¤¥×¤Î¥Õ¥¡¥¤¥ë¤È¤Î¶¥¹ç¤òËɤ°¤¿¤á¤Ë¡¢¥Ï¥¤¥Õ¥ó¤¬´Þ¤Þ¤ì¤Þ¤¹(package\-summary\&.html¤Ê¤É)¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ëɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¤³¤³¤ÇÀâÌÀ¤¹¤ë¡¢´ðËÜÆâÍÆ¥Ú¡¼¥¸¡¢Áê¸ß»²¾È¥Ú¡¼¥¸¡¢¥µ¥Ý¡¼¥È¡¦¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£³ÆHTML¥Ú¡¼¥¸¤Ï¸ÄÊ̤Υե¡¥¤¥ë¤ËÂбþ¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢2¤Ä¤Î¥¿¥¤¥×¤Î¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ºÇ½é¤Î¥¿¥¤¥×¤Ë¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë±þ¤¸¤¿Ì¾Á°¤¬ÉÕ¤±¤é¤ì¤Þ¤¹¡£2ÈÖÌܤΥ¿¥¤¥×¤Ë¤Ï¡¢ºÇ½é¤Î¥¿¥¤¥×¤Î¥Õ¥¡¥¤¥ë¤È¤Î¶¥¹ç¤òËɤ°¤¿¤á¤Ë¡¢¥Ï¥¤¥Õ¥ó¤¬´Þ¤Þ¤ì¤Þ¤¹(package\-summary\&.html¤Ê¤É)¡£ + .SS "´ðËÜÆâÍÆ¥Ú¡¼¥¸" + .sp + .RS 4 +@@ -509,7 +529,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-µ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ú¡¼¥¸(package\-summary\&.html)¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¤¢¤ëpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.java¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¥Æ¥­¥¹¥È¤ò¤¹¤Ù¤ÆÁȤßÆþ¤ì¤Þ¤¹¡£ ++µ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ú¡¼¥¸(package\-summary\&.html)¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¤¢¤ëpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.java¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¥Æ¥­¥¹¥È¤ò¤¹¤Ù¤ÆÁȤßÆþ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -520,7 +540,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥ÈÁ´ÂΤËÂФ·¤Æ1¤Ä¤Î³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¡£³µÍ×¥Ú¡¼¥¸¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤ÎÀèƬ¥Ú¡¼¥¸¤Ë¤Ê¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI\-overview\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¥Æ¥­¥¹¥È¤ò¤¹¤Ù¤ÆÁȤßÆþ¤ì¤Þ¤¹¡£³µÍ×¥Ú¡¼¥¸¤¬ºîÀ®¤µ¤ì¤ë¤Î¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£HTML¥Õ¥ì¡¼¥à¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥ÈÁ´ÂΤËÂФ·¤Æ1¤Ä¤Î³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¡£³µÍ×¥Ú¡¼¥¸¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤ÎÀèƬ¥Ú¡¼¥¸¤Ë¤Ê¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB\-overview\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¥Æ¥­¥¹¥È¤ò¤¹¤Ù¤ÆÁȤßÆþ¤ì¤Þ¤¹¡£³µÍ×¥Ú¡¼¥¸¤¬ºîÀ®¤µ¤ì¤ë¤Î¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£HTML¥Õ¥ì¡¼¥à¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SS "Áê¸ß»²¾È¥Ú¡¼¥¸" + .sp +@@ -587,9 +607,9 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-ľÎ󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸(serialized\-form\&.html)¡£¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥á¥½¥Ã¥É¤ÎÀâÌÀ¤ò´Þ¤à¡¢Ä¾Îó²½²Äǽ¤«¤Ä³°Éô²½²Äǽ¤Ê¥¯¥é¥¹¤Ë´Ø¤¹¤ë¾ðÊóÍѤΥڡ¼¥¸¤Ç¤¹¡£¤³¤Î¥Ú¡¼¥¸Æâ¤Î¾ðÊó¤Ï¡¢API¤ò»ÈÍѤ¹¤ë³«È¯¼Ô¤Ç¤Ï¤Ê¤¯¡¢ºÆ¼ÂÁõ¼Ô¤ËɬÍפʾðÊó¤Ç¤¹¡£Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤Ø¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢Ä¾Î󲽤µ¤ì¤¿¥¯¥é¥¹¤Ë°ÜÆ°¤·¤Æ¡¢¤½¤Î¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤Ë¤¢¤ë¡Ö´ØÏ¢¹àÌܡץ»¥¯¥·¥ç¥ó¤Ç¡ÖľÎ󲽤µ¤ì¤¿·Á¼°¡×¤ò¥¯¥ê¥Ã¥¯¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ÏľÎ󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥Ú¡¼¥¸¤Ë¤Ï¡¢Serializable¤ò¼ÂÁõ¤¹¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹(public¤Þ¤¿¤ÏÈópublic)¤¬¡¢¤½¤Î\fIreadObject\fR¤ä\fIwriteObject\fR¥á¥½¥Ã¥É¡¢Ä¾Î󲽤µ¤ì¤¿¥Õ¥£¡¼¥ë¥É¡¢¤ª¤è¤Ó\fI@serial\fR¡¢\fI@serialField\fR¡¢\fI@serialData\fR¥¿¥°¤«¤é¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤È¤È¤â¤Ë¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£Ä¾Îó²½²Äǽ¤Êpublic¥¯¥é¥¹¤ò½ü³°¤¹¤ë¤Ë¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸)¤ò\fI@serial\fR +-exclude¤Ç¥Þ¡¼¥¯¤·¤Þ¤¹¡£Ä¾Îó²½²Äǽ¤Êpackage\-private¥¯¥é¥¹¤ò´Þ¤á¤ë¤Ë¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸)¤ò\fI@serial\fR +-include¤Ç¥Þ¡¼¥¯¤·¤Þ¤¹¡£¥ê¥ê¡¼¥¹1\&.4¤Ç¤Ï¡¢\fI\-private\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢public¥¯¥é¥¹¤ª¤è¤Óprivate¥¯¥é¥¹¤Î´°Á´¤ËľÎ󲽤µ¤ì¤¿·Á¼°¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ľÎ󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸(serialized\-form\&.html)¡£¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥á¥½¥Ã¥É¤ÎÀâÌÀ¤ò´Þ¤à¡¢Ä¾Îó²½²Äǽ¤«¤Ä³°Éô²½²Äǽ¤Ê¥¯¥é¥¹¤Ë´Ø¤¹¤ë¾ðÊóÍѤΥڡ¼¥¸¤Ç¤¹¡£¤³¤Î¥Ú¡¼¥¸Æâ¤Î¾ðÊó¤Ï¡¢API¤ò»ÈÍѤ¹¤ë³«È¯¼Ô¤Ç¤Ï¤Ê¤¯¡¢ºÆ¼ÂÁõ¼Ô¤ËɬÍפʾðÊó¤Ç¤¹¡£Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤Ø¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢Ä¾Î󲽤µ¤ì¤¿¥¯¥é¥¹¤Ë°ÜÆ°¤·¤Æ¡¢¤½¤Î¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤Ë¤¢¤ë¡Ö´ØÏ¢¹àÌܡץ»¥¯¥·¥ç¥ó¤Ç¡ÖľÎ󲽤µ¤ì¤¿·Á¼°¡×¤ò¥¯¥ê¥Ã¥¯¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ÏľÎ󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥Ú¡¼¥¸¤Ë¤Ï¡¢Serializable¤ò¼ÂÁõ¤¹¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹(public¤Þ¤¿¤ÏÈópublic)¤¬¡¢¤½¤Î\fBreadObject\fR¤ä\fBwriteObject\fR¥á¥½¥Ã¥É¡¢Ä¾Î󲽤µ¤ì¤¿¥Õ¥£¡¼¥ë¥É¡¢¤ª¤è¤Ó\fB@serial\fR¡¢\fB@serialField\fR¡¢\fB@serialData\fR¥¿¥°¤«¤é¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤È¤È¤â¤Ë¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£Ä¾Îó²½²Äǽ¤Êpublic¥¯¥é¥¹¤ò½ü³°¤¹¤ë¤Ë¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸)¤ò\fB@serial\fR ++exclude¤Ç¥Þ¡¼¥¯¤·¤Þ¤¹¡£Ä¾Îó²½²Äǽ¤Êpackage\-private¥¯¥é¥¹¤ò´Þ¤á¤ë¤Ë¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸)¤ò\fB@serial\fR ++include¤Ç¥Þ¡¼¥¯¤·¤Þ¤¹¡£¥ê¥ê¡¼¥¹1\&.4¤Ç¤Ï¡¢\fB\-private\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢public¥¯¥é¥¹¤ª¤è¤Óprivate¥¯¥é¥¹¤Î´°Á´¤ËľÎ󲽤µ¤ì¤¿·Á¼°¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -600,7 +620,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-º÷°ú¥Ú¡¼¥¸(\fIindex\-*\&.html\fR)¡£¤¹¤Ù¤Æ¤Î¥¯¥é¥¹Ì¾¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹Ì¾¡¢¥³¥ó¥¹¥È¥é¥¯¥¿Ì¾¡¢¥Õ¥£¡¼¥ë¥É̾¡¢¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤¬¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ëʤó¤Ç¤¤¤Þ¤¹¡£º÷°ú¥Ú¡¼¥¸¤Ï¡¢Unicode¤ò°·¤¨¤ë¤è¤¦¤Ë¹ñºÝ²½¤µ¤ì¤Æ¤¤¤Þ¤¹¡£1¤Ä¤Î¥Õ¥¡¥¤¥ë¤È¤·¤ÆÀ¸À®¤¹¤ë¤³¤È¤â¡¢ÀèƬʸ»ú(±Ñ¸ì¤Î¾ì¹çA\(enZ)¤´¤È¤ËÊÌ¡¹¤Î¥Õ¥¡¥¤¥ë¤È¤·¤ÆÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++º÷°ú¥Ú¡¼¥¸(\fBindex\-*\&.html\fR)¡£¤¹¤Ù¤Æ¤Î¥¯¥é¥¹Ì¾¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹Ì¾¡¢¥³¥ó¥¹¥È¥é¥¯¥¿Ì¾¡¢¥Õ¥£¡¼¥ë¥É̾¡¢¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤¬¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ëʤó¤Ç¤¤¤Þ¤¹¡£º÷°ú¥Ú¡¼¥¸¤Ï¡¢Unicode¤ò°·¤¨¤ë¤è¤¦¤Ë¹ñºÝ²½¤µ¤ì¤Æ¤¤¤Þ¤¹¡£1¤Ä¤Î¥Õ¥¡¥¤¥ë¤È¤·¤ÆÀ¸À®¤¹¤ë¤³¤È¤â¡¢ÀèƬʸ»ú(±Ñ¸ì¤Î¾ì¹çA\(enZ)¤´¤È¤ËÊÌ¡¹¤Î¥Õ¥¡¥¤¥ë¤È¤·¤ÆÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .RE + .SS "¥µ¥Ý¡¼¥È¡¦¥Ú¡¼¥¸" + .sp +@@ -612,7 +632,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ø¥ë¥×¡¦¥Ú¡¼¥¸(help\-doc\&.html)¡£¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤äÁ°½Ò¤Î³Æ¥Ú¡¼¥¸¤Ë´Ø¤¹¤ëÀâÌÀ¤¬µ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤òÆȼ«¤Î¥«¥¹¥¿¥à¡¦¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤Ç¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ë¤Ë¤Ï¡¢\fI\-helpfile\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥Ø¥ë¥×¡¦¥Ú¡¼¥¸(help\-doc\&.html)¡£¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤äÁ°½Ò¤Î³Æ¥Ú¡¼¥¸¤Ë´Ø¤¹¤ëÀâÌÀ¤¬µ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤òÆȼ«¤Î¥«¥¹¥¿¥à¡¦¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤Ç¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ë¤Ë¤Ï¡¢\fB\-helpfile\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -634,7 +654,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-Ê£¿ô¤Î¥Õ¥ì¡¼¥à¡¦¥Õ¥¡¥¤¥ë(\fI*\-frame\&.html\fR)¡£¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥ê¥¹¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Õ¥ì¡¼¥à¡¦¥Õ¥¡¥¤¥ë¤ÏHTML¥Õ¥ì¡¼¥à¤òɽ¼¨¤·¤Þ¤¹¡£ ++Ê£¿ô¤Î¥Õ¥ì¡¼¥à¡¦¥Õ¥¡¥¤¥ë(\fB*\-frame\&.html\fR)¡£¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥ê¥¹¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Õ¥ì¡¼¥à¡¦¥Õ¥¡¥¤¥ë¤ÏHTML¥Õ¥ì¡¼¥à¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -645,7 +665,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë(package\-list)¡£\fI\-link\fR¤ª¤è¤Ó\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¤É¤Î¥ê¥ó¥¯¤«¤é¤â¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£ ++¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë(package\-list)¡£\fB\-link\fR¤ª¤è¤Ó\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¤É¤Î¥ê¥ó¥¯¤«¤é¤â¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -667,22 +687,22 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-doc\-files¥Ç¥£¥ì¥¯¥È¥ê¡£°¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥³¥Ô¡¼¤¹¤ë¥¤¥á¡¼¥¸¡¢¥µ¥ó¥×¥ë¡¦¥³¡¼¥É¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ê¤É¤Î¥Õ¥¡¥¤¥ë¤¬³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ½èÍý¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤ÎÃæ¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ë¤Î¤ß½èÍý¤µ¤ì¤Þ¤¹¡£ ++doc\-files¥Ç¥£¥ì¥¯¥È¥ê¡£°¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥³¥Ô¡¼¤¹¤ë¥¤¥á¡¼¥¸¡¢¥µ¥ó¥×¥ë¡¦¥³¡¼¥É¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ê¤É¤Î¥Õ¥¡¥¤¥ë¤¬³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ½èÍý¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤ÎÃæ¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ë¤Î¤ß½èÍý¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "HTML¥Õ¥ì¡¼¥à" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤¿Ãͤ˴ð¤Å¤­¡¢ºÇ¾®¸ÂɬÍפʿô(2¤Þ¤¿¤Ï3)¤Î¥Õ¥ì¡¼¥à¤òÀ¸À®¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë°ú¿ô¤È¤·¤Æ1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ¹¾ì¹ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥ê¥¹¥È¤¬¾Êά¤µ¤ì¤Þ¤¹¡£¤½¤Î¤«¤ï¤ê¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ïº¸Â¦¤ÎÎó¤Ë1¤Ä¤Î¥Õ¥ì¡¼¥à¤òºîÀ®¤·¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¤òɽ¼¨¤·¤Þ¤¹¡£Ê£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¥ê¥¹¥È¤¹¤ëÂè3¤Î¥Õ¥ì¡¼¥à¤È³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¤òºîÀ®¤·¤Þ¤¹¡£¥Õ¥ì¡¼¥à¤ò¾Êά¤¹¤ë¤Ë¤Ï¡¢¡Ö¥Õ¥ì¡¼¥à¤Ê¤·¡×¥ê¥ó¥¯¤ò¥¯¥ê¥Ã¥¯¤¹¤ë¤«¡¢overview\-summary\&.html¥Ú¡¼¥¸¤«¤é¥Ú¡¼¥¸¡¦¥»¥Ã¥È¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤¿Ãͤ˴ð¤Å¤­¡¢ºÇ¾®¸ÂɬÍפʿô(2¤Þ¤¿¤Ï3)¤Î¥Õ¥ì¡¼¥à¤òÀ¸À®¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë°ú¿ô¤È¤·¤Æ1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ¹¾ì¹ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥ê¥¹¥È¤¬¾Êά¤µ¤ì¤Þ¤¹¡£¤½¤Î¤«¤ï¤ê¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ïº¸Â¦¤ÎÎó¤Ë1¤Ä¤Î¥Õ¥ì¡¼¥à¤òºîÀ®¤·¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¤òɽ¼¨¤·¤Þ¤¹¡£Ê£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¥ê¥¹¥È¤¹¤ëÂè3¤Î¥Õ¥ì¡¼¥à¤È³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¤òºîÀ®¤·¤Þ¤¹¡£¥Õ¥ì¡¼¥à¤ò¾Êά¤¹¤ë¤Ë¤Ï¡¢¡Ö¥Õ¥ì¡¼¥à¤Ê¤·¡×¥ê¥ó¥¯¤ò¥¯¥ê¥Ã¥¯¤¹¤ë¤«¡¢overview\-summary\&.html¥Ú¡¼¥¸¤«¤é¥Ú¡¼¥¸¡¦¥»¥Ã¥È¤òɽ¼¨¤·¤Þ¤¹¡£ + .SS "À¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤Î¹½Â¤" + .PP + À¸À®¤µ¤ì¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê³¬ÁؤËÊÔÀ®¤µ¤ì¤Þ¤¹¡£1¤Ä¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ë¤Ä¤­1¤Ä¤Î¥Ç¥£¥ì¥¯¥È¥ê¡¢¤È¤¤¤¦¹½Â¤¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢\fIjava\&.applet\&.Applet\fR¥¯¥é¥¹ÍѤËÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤Ï¡¢java/applet/Applet\&.html¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ +-.PP +-À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤¬\fIapidocs\fR¤À¤È¤¹¤ë¤È¡¢\fIjava\&.applet\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥Õ¥¡¥¤¥ë¤Î¹½Â¤¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£Á°½Ò¤Î¤è¤¦¤Ë¡¢\fIframe\fR¤È¤¤¤¦¸ì¤ò̾Á°¤Ë´Þ¤à¥Õ¥¡¥¤¥ë¤Ï¡¢¤¹¤Ù¤Æº¸¾å¤Þ¤¿¤Ïº¸²¼¤Î¥Õ¥ì¡¼¥à¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤ÎHTML¥Õ¥¡¥¤¥ë¤Ï¡¢¤¹¤Ù¤Æ±¦Â¦¤Î¥Õ¥ì¡¼¥à¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ +-.PP +-¥Ç¥£¥ì¥¯¥È¥ê¤ÏÂÀ»ú¤Ç¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ø¤Î°ú¿ô¤¬¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ç¤¢¤ë¾ì¹ç¤Ë¾Êά¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£°ú¿ô¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¾ì¹ç¡¢¶õ¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ë¤Î¤ß¡¢À¸À®Àè¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£À¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¤¿¤È¤¨¤Ð¡¢\fBjava\&.applet\&.Applet\fR¥¯¥é¥¹ÍѤËÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤Ï¡¢java/applet/Applet\&.html¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ ++.PP ++À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤¬\fBapidocs\fR¤À¤È¤¹¤ë¤È¡¢\fBjava\&.applet\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥Õ¥¡¥¤¥ë¤Î¹½Â¤¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£Á°½Ò¤Î¤è¤¦¤Ë¡¢\fIframe\fR¤È¤¤¤¦¸ì¤ò̾Á°¤Ë´Þ¤à¥Õ¥¡¥¤¥ë¤Ï¡¢¤¹¤Ù¤Æº¸¾å¤Þ¤¿¤Ïº¸²¼¤Î¥Õ¥ì¡¼¥à¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤ÎHTML¥Õ¥¡¥¤¥ë¤Ï¡¢¤¹¤Ù¤Æ±¦Â¦¤Î¥Õ¥ì¡¼¥à¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++.PP ++¥Ç¥£¥ì¥¯¥È¥ê¤ÏÂÀ»ú¤Ç¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ø¤Î°ú¿ô¤¬¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ç¤¢¤ë¾ì¹ç¤Ë¾Êά¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£°ú¿ô¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¾ì¹ç¡¢¶õ¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ë¤Î¤ß¡¢À¸À®Àè¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£À¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .RS 4 + .ie n \{\ +@@ -802,7 +822,7 @@ + .IP \(bu 2.3 + .\} + index\-all\&.html: +-\fI\-splitindex\fR¥ª¥×¥·¥ç¥ó¤Ê¤·¤ÇºîÀ®¤µ¤ì¤¿¥Ç¥Õ¥©¥ë¥È¤Îº÷°ú ++\fB\-splitindex\fR¥ª¥×¥·¥ç¥ó¤Ê¤·¤ÇºîÀ®¤µ¤ì¤¿¥Ç¥Õ¥©¥ë¥È¤Îº÷°ú + .RE + .sp + .RS 4 +@@ -814,7 +834,7 @@ + .IP \(bu 2.3 + .\} + \fBindex\-files\fR: +-\fI\-splitindex\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆºîÀ®¤µ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê ++\fB\-splitindex\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆºîÀ®¤µ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê + .sp + .RS 4 + .ie n \{\ +@@ -825,7 +845,7 @@ + .IP \(bu 2.3 + .\} + index\-<number>\&.html: +-\fI\-splitindex\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆºîÀ®¤µ¤ì¤¿º÷°ú¥Õ¥¡¥¤¥ë ++\fB\-splitindex\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆºîÀ®¤µ¤ì¤¿º÷°ú¥Õ¥¡¥¤¥ë + .RE + .RE + .sp +@@ -881,7 +901,7 @@ + .IP \(bu 2.3 + .\} + Applet\&.html: +-\fIApplet\fR¥¯¥é¥¹¡¦¥Ú¡¼¥¸ ++\fBApplet\fR¥¯¥é¥¹¡¦¥Ú¡¼¥¸ + .RE + .sp + .RS 4 +@@ -893,7 +913,7 @@ + .IP \(bu 2.3 + .\} + AppletContext\&.html: +-\fIAppletContext\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ ++\fBAppletContext\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ + .RE + .sp + .RS 4 +@@ -905,7 +925,7 @@ + .IP \(bu 2.3 + .\} + AppletStub\&.html: +-\fIAppletStub\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ ++\fBAppletStub\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ + .RE + .sp + .RS 4 +@@ -917,7 +937,7 @@ + .IP \(bu 2.3 + .\} + AudioClip\&.html: +-\fIAudioClip\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ ++\fBAudioClip\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ + .RE + .sp + .RS 4 +@@ -988,13 +1008,13 @@ + \- Applet\&.html: Applet¥¯¥é¥¹¤Î»ÈÍÑ + .sp + \- AppletContext\&.html: +-\fIAppletContext\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ ++\fBAppletContext\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ + .sp + \- AppletStub\&.html: +-\fIAppletStub\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ ++\fBAppletStub\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ + .sp + \- AudioClip\&.html: +-\fIAudioClip\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ ++\fBAudioClip\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ + .RE + .RE + .RE +@@ -1032,208 +1052,238 @@ + \- Applet\&.html: Applet¥½¡¼¥¹¡¦¥³¡¼¥É + .sp + \- AppletContext\&.html: +-\fIAppletContext\fR¥½¡¼¥¹¡¦¥³¡¼¥É ++\fBAppletContext\fR¥½¡¼¥¹¡¦¥³¡¼¥É + .sp + \- AppletStub\&.html: +-\fIAppletStub\fR¥½¡¼¥¹¡¦¥³¡¼¥É ++\fBAppletStub\fR¥½¡¼¥¹¡¦¥³¡¼¥É + .sp + \- AudioClip\&.html: +-\fIAudioClip\fR¥½¡¼¥¹¡¦¥³¡¼¥É ++\fBAudioClip\fR¥½¡¼¥¹¡¦¥³¡¼¥É + .RE + .RE + .RE + .SS "À¸À®¤µ¤ì¤ëAPIÀë¸À" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤ì¤¾¤ì¤Î¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥Õ¥£¡¼¥ë¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤ª¤è¤Ó¥á¥½¥Ã¥É¤Îµ­½Ò¤ÎºÇ½é¤Ë¡¢¤½¤ÎAPIÍѤÎÀë¸À¤òÀ¸À®¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIBoolean\fR¥¯¥é¥¹¤ÎÀë¸À¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤ì¤¾¤ì¤Î¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥Õ¥£¡¼¥ë¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤ª¤è¤Ó¥á¥½¥Ã¥É¤Îµ­½Ò¤ÎºÇ½é¤Ë¡¢¤½¤ÎAPIÍѤÎÀë¸À¤òÀ¸À®¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBBoolean\fR¥¯¥é¥¹¤ÎÀë¸À¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public final class Boolean +-extends Object +-implements Serializable +-.fi +-.if n \{\ +-.RE +-.\} +-.PP +-\fIBoolean\&.valueOf\fR¥á¥½¥Ã¥É¤ÎÀë¸À¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-public static Boolean valueOf(String s) +-.fi +-.if n \{\ +-.RE +-.\} +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢½¤¾þ»Ò\fIpublic\fR¡¢\fIprotected\fR¡¢\fIprivate\fR¡¢\fIabstract\fR¡¢\fIfinal\fR¡¢\fIstatic\fR¡¢\fItransient\fR¡¢¤ª¤è¤Ó\fIvolatile\fR¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢\fIsynchronized\fR¤ª¤è¤Ó\fInative\fR¤Ï¤Ç¤­¤Þ¤»¤ó¡£\fIsynchronized\fR¤ª¤è¤Ó\fInative\fR½¤¾þ»Ò¤Ï¡¢¼ÂÁõ¤Î¾ÜºÙ¤È¤ß¤Ê¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢API»ÅÍͤˤϴޤޤì¤Þ¤»¤ó¡£ +-.PP +-API¤Ç¤Ï¡¢Ê¹ÔÀ­¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤Ë¤Ä¤¤¤Æ¡¢¥­¡¼¥ï¡¼¥É\fIsynchronized\fR¤Ë°Í¸¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥³¥á¥ó¥È¤Î¼çÀâÌÀ¤È¤·¤Æ¥É¥­¥å¥á¥ó¥È²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¡Ö1¤Ä¤Îenumeration¤òÊ£¿ô¤Î¥¹¥ì¥Ã¥É¤«¤éʹԤ·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡×¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤³¤ì¤é¤Î¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤ò¼Â¸½¤¹¤ëÊýË¡¤òµ­½Ò¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fIHashtable\fR¥ª¥×¥·¥ç¥ó¤Ï¥¹¥ì¥Ã¥É¥»¡¼¥Õ¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¡Ö¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤òƱ´ü²½¤·¤Æ¤½¤ì¤ò¼Â¸½¤¹¤ë¡×¤Î¤è¤¦¤Ë»ØÄꤹ¤ëº¬µò¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤è¤ê¹âÅÙ¤ÊʹÔÀ­¤Î¤¿¤á¤Ë¡¢¥Ð¥±¥Ã¥È¡¦¥ì¥Ù¥ë¤ÇÆâÉôŪ¤ËƱ´ü²½¤¹¤ë¸¢¸Â¤òÊÝÍ­¤·¤Æ¤ª¤¯¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ +-.SH "¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È" +-.PP +-¤³¤Î¥»¥¯¥·¥ç¥ó¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥³¥á¥ó¥È¤È¥³¥á¥ó¥È¤Î·Ñ¾µ¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£ +-.SS "¥½¡¼¥¹¡¦¥³¡¼¥É¡¦¥³¥á¥ó¥È" +-.PP +-¥½¡¼¥¹¡¦¥³¡¼¥É¤ÎǤ°Õ¤Î¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÎÀë¸À¤ÎÁ°¤Ë¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸¤Ë¤â¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¹½Ê¸¤Ï¼ã´³°Û¤Ê¤ê¤Þ¤¹¤¬¡¢³µÍפˤâ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢\fI/**\fR¤È¡¢½ª¤ï¤ê¤òɽ¤¹\fI*/\fR¤Î´Ö¤Ë¤¢¤ëʸ»ú¤«¤é¹½À®¤µ¤ì¤Þ¤¹¡£ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤Ï³Æ¹Ô¤Ç»ÈÍѤǤ­¡¢¼¡¤Î¹à¤Ç¾Ü¤·¤¯ÀâÌÀ¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * This is the typical format of a simple documentation comment +- * that spans two lines\&. +- */ +-.fi +-.if n \{\ +-.RE +-.\} +-.PP +-¥¹¥Ú¡¼¥¹¤òÀáÌ󤹤ë¤Ë¤Ï¡¢¥³¥á¥ó¥È¤ò1¹Ô¤ËÆþ¤ì¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** This comment takes up only one line\&. */ +-.fi +-.if n \{\ +-.RE +-.\} +-¥³¥á¥ó¥È¤ÎÇÛÃÖ.PP +-¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥ÉÀë¸À¤ÎľÁ°¤ËÇÛÃÖ¤µ¤ì¤ë¾ì¹ç¤Ë¤Î¤ßǧ¼±¤µ¤ì¤Þ¤¹¡£¥á¥½¥Ã¥É¤ÎËÜÂΤËÃÖ¤«¤ì¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Àë¸Àʸ¤´¤È¤Ë1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤·¤«Ç§¼±¤·¤Þ¤»¤ó¡£¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.PP +-¤è¤¯¤¢¤ë´Ö°ã¤¤¤Ï¡¢¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤È¥¯¥é¥¹Àë¸À¤Î´Ö¤Ë\fIimport\fRʸ¤òÃÖ¤¤¤Æ¤·¤Þ¤¦¤³¤È¤Ç¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤ò̵»ë¤¹¤ë¤Î¤Ç¡¢\fIimport\fRʸ¤ò¤³¤Î¾ì½ê¤ËÇÛÃÖ¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * This is the class comment for the class Whatever\&. +- */ +- +-import com\&.example; // MISTAKE \- Important not to put import statement here +- +-public class Whatever{ } +-.fi +-.if n \{\ +-.RE +-.\} +-¥³¥á¥ó¥È¤Î¥Ñ¡¼¥Ä.PP +-¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢¼çÀâÌÀ¤È¤½¤Î¸å¤Ë³¤¯¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¼çÀâÌÀ¤Ï¡¢³«»Ï¶èÀÚ¤êʸ»ú\fI/**\fR¤Ç»Ï¤Þ¤ê¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Þ¤Ç³¤­¤Þ¤¹¡£¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Ï¡¢ÀèƬʸ»ú¤¬\fI@\fR¤Î¹Ô¤ÇÄêµÁ¤µ¤ì¤ëºÇ½é¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤«¤é»Ï¤Þ¤ê¤Þ¤¹(ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¡¢¶õÇòʸ»ú¡¢ÀèƬ¤Î¶èÀÚ¤êʸ»ú\fI/**\fR¤Ï½ü¤¯)¡£¼çÀâÌÀ¤òµ­½Ò¤»¤º¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Î¤ß¤Î¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¼çÀâÌÀ¤Ï¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó°Ê¹ß¤Ë³¤±¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¥¿¥°¤Î°ú¿ô¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥¿¥°¤Î¿ô¤ËÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£²¿²ó¤âµ­½Ò¤Ç¤­¤ë¥¿¥°¤È¡¢1²ó¤·¤«µ­½Ò¤Ç¤­¤Ê¤¤¥¿¥°¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î\fI@see\fR¥¿¥°¤«¤é¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Ï»Ï¤Þ¤ê¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * This sentence holds the main description for this documentation comment\&. +- * @see java\&.lang\&.Object +- */ +-.fi +-.if n \{\ +-.RE +-.\} +-¥Ö¥í¥Ã¥¯¤ª¤è¤Ó¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°.PP +-¥¿¥°¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬½èÍý¤¹¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ÎÆüì¤Ê¥­¡¼¥ï¡¼¥É¤Ç¤¹¡£¥¿¥°¤Ë¤Ï2¤Ä¤Î¥¿¥¤¥×¤¬¤¢¤ê¤Þ¤¹¡£1¤Ä¤Ï\fI@tag\fR¥¿¥°¤Î¤è¤¦¤Ëɽµ­¤µ¤ì¤ë¥Ö¥í¥Ã¥¯¡¦¥¿¥°(¥¹¥¿¥ó¥É¥¢¥í¥ó¡¦¥¿¥°¤È¤â¸Æ¤Ð¤ì¤ë)¡¢¤â¤¦1¤Ä¤Ï\fI{@tag}\fR¥¿¥°¤Î¤è¤¦¤ËÃ楫¥Ã¥³¤Ç°Ï¤ó¤Çɽµ­¤µ¤ì¤ë¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤Ç¤¹¡£¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤¬²ò¼á¤µ¤ì¤ë¤Ë¤Ï¡¢¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¡¢¶õÇòʸ»ú¡¢¶èÀÚ¤êʸ»ú(\fI/**\fR)¤ò½ü¤¤¤Æ¡¢¹Ô¤ÎÀèƬ¤ËÃÖ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fI@\fRʸ»ú¤ò¥Æ¥­¥¹¥ÈÆâ¤ÎÊ̤ξì½ê¤Ç»ÈÍѤ·¤Æ¤â¡¢¥¿¥°¤Î³«»Ï¤È¤·¤Æ²ò¼á¤µ¤ì¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£\fI@\fRʸ»ú¤ò»ÈÍѤ·¤Æ¹Ô¤ò³«»Ï¤·¤Æ¤â¡¢¤½¤ì¤¬²ò¼á¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¢HTML¥¨¥ó¥Æ¥£¥Æ¥£\fI@\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤½¤ì¤¾¤ì¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤Ë¤Ï¡¢´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Æ¥­¥¹¥È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ï¡¢¥¿¥°¤Î¸å¤«¤é¡¢¼¡¤Î¥¿¥°¤ÎÁ°¡¢¤Þ¤¿¤Ï¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ÎºÇ¸å¤Þ¤Ç¤Î´Ö¤Ëµ­½Ò¤µ¤ì¤¿¥Æ¥­¥¹¥È¤Ç¤¹(¥¿¥°¤Þ¤¿¤Ï¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤ò½ü¤¯)¡£¤³¤Î´ØÏ¢¥Æ¥­¥¹¥È¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤Ï¡¢¥Æ¥­¥¹¥È¤òµ­½Ò¤Ç¤­¤ë¾ì½ê¤Ç¤¢¤ì¤Ð¤É¤³¤Ë¤Ç¤âÃÖ¤¯¤³¤È¤¬¤Ç¤­¡¢²ò¼á¤µ¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤Ë¤Ï¥Ö¥í¥Ã¥¯¡¦¥¿¥°\fI@deprecated\fR¤È¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°\fI{@link}\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£javadoc¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * @deprecated As of JDK 1\&.1, replaced by {@link #setBounds(int,int,int,int)} +- */ +-.fi +-.if n \{\ +-.RE +-.\} +-HTML¤Ç¤Î¥³¥á¥ó¥È¤Îµ­½Ò.PP +-¥Æ¥­¥¹¥È¤ÏHTML¥¨¥ó¥Æ¥£¥Æ¥£¤ÈHTML¥¿¥°¤ò»ÈÍѤ·¤ÆHTML¤Çµ­½Ò¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ÈÍѤ¹¤ë¥Ö¥é¥¦¥¶¤¬¥µ¥Ý¡¼¥È¤¹¤ëǤ°Õ¤ÎHTML¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¥«¥¹¥±¡¼¥Ç¥£¥ó¥°¡¦¥¹¥¿¥¤¥ë¡¦¥·¡¼¥È¤ª¤è¤Ó¥Õ¥ì¡¼¥à¤ò´Þ¤á¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È°Ê³°¤ÎÉôʬ¤ÇHTML 3\&.2¤Ë½àµò¤·¤¿¥³¡¼¥É¤òÀ¸À®¤·¤Þ¤¹¡£¥Õ¥ì¡¼¥à¡¦¥»¥Ã¥È¤Î¤¿¤á¡¢À¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë¤ÏHTML 4\&.0¤¬¿ä¾©¤µ¤ì¤Þ¤¹¡£ +-.PP +-¤¿¤È¤¨¤Ð¡¢¤è¤ê¾®¤µ¤¤µ­¹æ(<)¤ª¤è¤Ó¤è¤êÂ礭¤¤µ­¹æ(>)¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢\fI<\fR¤ª¤è¤Ó\fI>\fR¤Èµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Æ±Íͤˡ¢¥¢¥ó¥Ñ¥µ¥ó¥É(&)¤Ï\fI&\fR¤Èµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢ÂÀ»ú¤ÎHTML¥¿¥°\fI<b>\fR¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * This is a <b>doc</b> comment\&. +- * @see java\&.lang\&.Object +- */ +-.fi +-.if n \{\ +-.RE +-.\} +-ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î²òÀÏ»þ¤Ë¡¢³Æ¹Ô¤ÎÀèƬ¤Ë¤¢¤ë¥¢¥¹¥¿¥ê¥¹¥¯(*)ʸ»ú¤ÏÇË´þ¤µ¤ì¤Þ¤¹¡£ºÇ½é¤Î¥¢¥¹¥¿¥ê¥¹¥¯(*)ʸ»ú¤è¤êÁ°¤Ë¤¢¤ë¶õÇò¤ä¥¿¥Ö¤âÇË´þ¤µ¤ì¤Þ¤¹¡£¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥¤¥ó¥Ç¥ó¥È¤òÊÝ»ý¤·¤¿¤Þ¤Þ¤Ç¥µ¥ó¥×¥ë¡¦¥³¡¼¥É¤ò\fI<PRE>\fR¥¿¥°Æâ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËľÀÜŽ¤êÉÕ¤±¤é¤ì¤ë¤è¤¦¤Ë¡¢ÀèƬ¤Î¶õÇòʸ»ú¤Ïºï½ü¤µ¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¥Ö¥é¥¦¥¶¤Ï¡¢¶õÇòʸ»ú¤ò¥¿¥Ö¤è¤ê¤â°ìΧ¤Ë²ò¼á¤·¤Þ¤¹¡£¥¤¥ó¥Ç¥ó¥È¤Îµ¯ÅÀ¤Ï(¶èÀÚ¤êʸ»ú\fI/**\fR¤Þ¤¿¤Ï\fI<PRE>\fR¥¿¥°¤Ç¤Ï¤Ê¤¯)º¸¥Þ¡¼¥¸¥ó¤Ë¤Ê¤ê¤Þ¤¹¡£ +-ºÇ½é¤Îʸ.PP +-³Æ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤Ï¡¢Àë¸À¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Ë´Ø¤¹¤ë´Ê·é¤«¤Ä´°Á´¤Ê¥µ¥Þ¥ê¡¼Ê¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Îʸ¤Ï¡¢¶õÇò¡¢¥¿¥Ö¡¢¤Þ¤¿¤Ï¹Ô½ªÎ»Ê¸»ú¤¬Â³¤¯ºÇ½é¤Î¥Ô¥ê¥ª¥É¡¢¤Þ¤¿¤ÏºÇ½é¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤¬¤¢¤ë°ÌÃ֤ǽª¤ï¤ê¤Þ¤¹¡£ºÇ½é¤Îʸ¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆHTML¥Ú¡¼¥¸¤ÎÀèƬ¤Ë¤¢¤ë¥á¥ó¥Ð¡¼¤Î¥µ¥Þ¥ê¡¼¤ÎÉôʬ¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ +-Ê£¿ô¥Õ¥£¡¼¥ë¥É¤ÎÀë¸À.PP +-Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¡¢1¤Ä¤Îʸ¤ÇÊ£¿ô¤Î¥Õ¥£¡¼¥ë¥É¤òÀë¸À¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Îʸ¤Ë¤Ï¡¢1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤·¤«µ­½Ò¤Ç¤­¤Þ¤»¤ó¡£¤½¤Î¥³¥á¥ó¥È¤¬¡¢¤¹¤Ù¤Æ¤Î¥Õ¥£¡¼¥ë¥É¤ËÂФ·¤Æ¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¥Õ¥£¡¼¥ë¥É¤´¤È¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢³Æ¥Õ¥£¡¼¥ë¥É¤òÊÌ¡¹¤Îʸ¤ÇÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢1¤Ä¤ÎÀë¸À¤È¤·¤Æµ­½Ò¤¹¤ë¤ÈÉÔŬÀڤǤ¹¡£¤³¤Î¾ì¹ç¤Ï¡¢Àë¸À¤ò2¤Ä¤Ëʬ¤±¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * The horizontal and vertical distances of point (x,y) +- */ +-public int x, y; // Avoid this ++\fBpublic final class Boolean\fR ++\fBextends Object\fR ++\fBimplements Serializable\fR + + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¾å¤Î¥³¡¼¥É¤«¤é¼¡¤Î¤è¤¦¤Ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBBoolean\&.valueOf\fR¥á¥½¥Ã¥É¤ÎÀë¸À¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public int x ++\fBpublic static Boolean valueOf(String s)\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-The horizontal and vertical distances of point (x, y)\&. ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢½¤¾þ»Ò\fBpublic\fR¡¢\fBprotected\fR¡¢\fBprivate\fR¡¢\fBabstract\fR¡¢\fBfinal\fR¡¢\fBstatic\fR¡¢\fBtransient\fR¡¢¤ª¤è¤Ó\fBvolatile\fR¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢\fBsynchronized\fR¤ª¤è¤Ó\fBnative\fR¤Ï¤Ç¤­¤Þ¤»¤ó¡£\fBsynchronized\fR¤ª¤è¤Ó\fBnative\fR½¤¾þ»Ò¤Ï¡¢¼ÂÁõ¤Î¾ÜºÙ¤È¤ß¤Ê¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢API»ÅÍͤˤϴޤޤì¤Þ¤»¤ó¡£ ++.PP ++API¤Ç¤Ï¡¢Ê¹ÔÀ­¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤Ë¤Ä¤¤¤Æ¡¢¥­¡¼¥ï¡¼¥É\fBsynchronized\fR¤Ë°Í¸¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥³¥á¥ó¥È¤Î¼çÀâÌÀ¤È¤·¤Æ¥É¥­¥å¥á¥ó¥È²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¡Ö1¤Ä¤Îenumeration¤òÊ£¿ô¤Î¥¹¥ì¥Ã¥É¤«¤éʹԤ·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡×¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤³¤ì¤é¤Î¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤ò¼Â¸½¤¹¤ëÊýË¡¤òµ­½Ò¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fBHashtable\fR¥ª¥×¥·¥ç¥ó¤Ï¥¹¥ì¥Ã¥É¥»¡¼¥Õ¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¡Ö¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤òƱ´ü²½¤·¤Æ¤½¤ì¤ò¼Â¸½¤¹¤ë¡×¤Î¤è¤¦¤Ë»ØÄꤹ¤ëº¬µò¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤è¤ê¹âÅÙ¤ÊʹÔÀ­¤Î¤¿¤á¤Ë¡¢¥Ð¥±¥Ã¥È¡¦¥ì¥Ù¥ë¤ÇÆâÉôŪ¤ËƱ´ü²½¤¹¤ë¸¢¸Â¤òÊÝÍ­¤·¤Æ¤ª¤¯¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++.SH "¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È" ++.PP ++¤³¤Î¥»¥¯¥·¥ç¥ó¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥³¥á¥ó¥È¤È¥³¥á¥ó¥È¤Î·Ñ¾µ¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£ ++.SS "¥½¡¼¥¹¡¦¥³¡¼¥É¡¦¥³¥á¥ó¥È" ++.PP ++¥½¡¼¥¹¡¦¥³¡¼¥É¤ÎǤ°Õ¤Î¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÎÀë¸À¤ÎÁ°¤Ë¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸¤Ë¤â¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¹½Ê¸¤Ï¼ã´³°Û¤Ê¤ê¤Þ¤¹¤¬¡¢³µÍפˤâ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢\fB/**\fR¤È¡¢½ª¤ï¤ê¤òɽ¤¹\fB*/\fR¤Î´Ö¤Ë¤¢¤ëʸ»ú¤«¤é¹½À®¤µ¤ì¤Þ¤¹¡£ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤Ï³Æ¹Ô¤Ç»ÈÍѤǤ­¡¢¼¡¤Î¹à¤Ç¾Ü¤·¤¯ÀâÌÀ¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public int y ++\fB/**\fR ++\fB * This is the typical format of a simple documentation comment\fR ++\fB * that spans two lines\&.\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP ++¥¹¥Ú¡¼¥¹¤òÀáÌ󤹤ë¤Ë¤Ï¡¢¥³¥á¥ó¥È¤ò1¹Ô¤ËÆþ¤ì¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/** This comment takes up only one line\&. */\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++¥³¥á¥ó¥È¤ÎÇÛÃÖ ++.PP ++¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥ÉÀë¸À¤ÎľÁ°¤ËÇÛÃÖ¤µ¤ì¤ë¾ì¹ç¤Ë¤Î¤ßǧ¼±¤µ¤ì¤Þ¤¹¡£¥á¥½¥Ã¥É¤ÎËÜÂΤËÃÖ¤«¤ì¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Àë¸Àʸ¤´¤È¤Ë1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤·¤«Ç§¼±¤·¤Þ¤»¤ó¡£¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++¤è¤¯¤¢¤ë´Ö°ã¤¤¤Ï¡¢¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤È¥¯¥é¥¹Àë¸À¤Î´Ö¤Ë\fBimport\fRʸ¤òÃÖ¤¤¤Æ¤·¤Þ¤¦¤³¤È¤Ç¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤ò̵»ë¤¹¤ë¤Î¤Ç¡¢\fBimport\fRʸ¤ò¤³¤Î¾ì½ê¤ËÇÛÃÖ¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * This is the class comment for the class Whatever\&.\fR ++\fB */\fR ++\fB \fR ++\fBimport com\&.example; // MISTAKE \- Important not to put import statement here\fR ++\fB \fR ++\fBpublic class Whatever{ }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++¥³¥á¥ó¥È¤Î¥Ñ¡¼¥Ä ++.PP ++¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢¼çÀâÌÀ¤È¤½¤Î¸å¤Ë³¤¯¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¼çÀâÌÀ¤Ï¡¢³«»Ï¶èÀÚ¤êʸ»ú\fB/**\fR¤Ç»Ï¤Þ¤ê¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Þ¤Ç³¤­¤Þ¤¹¡£¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Ï¡¢ÀèƬʸ»ú¤¬\fB@\fR¤Î¹Ô¤ÇÄêµÁ¤µ¤ì¤ëºÇ½é¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤«¤é»Ï¤Þ¤ê¤Þ¤¹(ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¡¢¶õÇòʸ»ú¡¢ÀèƬ¤Î¶èÀÚ¤êʸ»ú\fB/**\fR¤Ï½ü¤¯)¡£¼çÀâÌÀ¤òµ­½Ò¤»¤º¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Î¤ß¤Î¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¼çÀâÌÀ¤Ï¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó°Ê¹ß¤Ë³¤±¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¥¿¥°¤Î°ú¿ô¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥¿¥°¤Î¿ô¤ËÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£²¿²ó¤âµ­½Ò¤Ç¤­¤ë¥¿¥°¤È¡¢1²ó¤·¤«µ­½Ò¤Ç¤­¤Ê¤¤¥¿¥°¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î\fB@see\fR¥¿¥°¤«¤é¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Ï»Ï¤Þ¤ê¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * This sentence holds the main description for this documentation comment\&.\fR ++\fB * @see java\&.lang\&.Object\fR ++\fB */\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++¥Ö¥í¥Ã¥¯¤ª¤è¤Ó¥¤¥ó¥é¥¤¥ó¡¦¥¿¥° ++.PP ++¥¿¥°¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬½èÍý¤¹¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ÎÆüì¤Ê¥­¡¼¥ï¡¼¥É¤Ç¤¹¡£¥¿¥°¤Ë¤Ï2¤Ä¤Î¥¿¥¤¥×¤¬¤¢¤ê¤Þ¤¹¡£1¤Ä¤Ï\fB@tag\fR¥¿¥°¤Î¤è¤¦¤Ëɽµ­¤µ¤ì¤ë¥Ö¥í¥Ã¥¯¡¦¥¿¥°(¥¹¥¿¥ó¥É¥¢¥í¥ó¡¦¥¿¥°¤È¤â¸Æ¤Ð¤ì¤ë)¡¢¤â¤¦1¤Ä¤Ï\fB{@tag}\fR¥¿¥°¤Î¤è¤¦¤ËÃ楫¥Ã¥³¤Ç°Ï¤ó¤Çɽµ­¤µ¤ì¤ë¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤Ç¤¹¡£¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤¬²ò¼á¤µ¤ì¤ë¤Ë¤Ï¡¢¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¡¢¶õÇòʸ»ú¡¢¶èÀÚ¤êʸ»ú(\fB/**\fR)¤ò½ü¤¤¤Æ¡¢¹Ô¤ÎÀèƬ¤ËÃÖ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fB@\fRʸ»ú¤ò¥Æ¥­¥¹¥ÈÆâ¤ÎÊ̤ξì½ê¤Ç»ÈÍѤ·¤Æ¤â¡¢¥¿¥°¤Î³«»Ï¤È¤·¤Æ²ò¼á¤µ¤ì¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£\fB@\fRʸ»ú¤ò»ÈÍѤ·¤Æ¹Ô¤ò³«»Ï¤·¤Æ¤â¡¢¤½¤ì¤¬²ò¼á¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¢HTML¥¨¥ó¥Æ¥£¥Æ¥£\fB@\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤½¤ì¤¾¤ì¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤Ë¤Ï¡¢´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Æ¥­¥¹¥È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ï¡¢¥¿¥°¤Î¸å¤«¤é¡¢¼¡¤Î¥¿¥°¤ÎÁ°¡¢¤Þ¤¿¤Ï¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ÎºÇ¸å¤Þ¤Ç¤Î´Ö¤Ëµ­½Ò¤µ¤ì¤¿¥Æ¥­¥¹¥È¤Ç¤¹(¥¿¥°¤Þ¤¿¤Ï¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤ò½ü¤¯)¡£¤³¤Î´ØÏ¢¥Æ¥­¥¹¥È¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤Ï¡¢¥Æ¥­¥¹¥È¤òµ­½Ò¤Ç¤­¤ë¾ì½ê¤Ç¤¢¤ì¤Ð¤É¤³¤Ë¤Ç¤âÃÖ¤¯¤³¤È¤¬¤Ç¤­¡¢²ò¼á¤µ¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤Ë¤Ï¥Ö¥í¥Ã¥¯¡¦¥¿¥°\fB@deprecated\fR¤È¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°\fB{@link}\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£javadoc¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * @deprecated As of JDK 1\&.1, replaced by {@link #setBounds(int,int,int,int)}\fR ++\fB */\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++HTML¤Ç¤Î¥³¥á¥ó¥È¤Îµ­½Ò ++.PP ++¥Æ¥­¥¹¥È¤ÏHTML¥¨¥ó¥Æ¥£¥Æ¥£¤ÈHTML¥¿¥°¤ò»ÈÍѤ·¤ÆHTML¤Çµ­½Ò¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ÈÍѤ¹¤ë¥Ö¥é¥¦¥¶¤¬¥µ¥Ý¡¼¥È¤¹¤ëǤ°Õ¤ÎHTML¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¥«¥¹¥±¡¼¥Ç¥£¥ó¥°¡¦¥¹¥¿¥¤¥ë¡¦¥·¡¼¥È¤ª¤è¤Ó¥Õ¥ì¡¼¥à¤ò´Þ¤á¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È°Ê³°¤ÎÉôʬ¤ÇHTML 3\&.2¤Ë½àµò¤·¤¿¥³¡¼¥É¤òÀ¸À®¤·¤Þ¤¹¡£¥Õ¥ì¡¼¥à¡¦¥»¥Ã¥È¤Î¤¿¤á¡¢À¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë¤ÏHTML 4\&.0¤¬¿ä¾©¤µ¤ì¤Þ¤¹¡£ ++.PP ++¤¿¤È¤¨¤Ð¡¢¤è¤ê¾®¤µ¤¤µ­¹æ(<)¤ª¤è¤Ó¤è¤êÂ礭¤¤µ­¹æ(>)¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢\fB<\fR¤ª¤è¤Ó\fB>\fR¤Èµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Æ±Íͤˡ¢¥¢¥ó¥Ñ¥µ¥ó¥É(&)¤Ï\fB&\fR¤Èµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢ÂÀ»ú¤ÎHTML¥¿¥°\fB<b>\fR¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * This is a <b>doc</b> comment\&.\fR ++\fB * @see java\&.lang\&.Object\fR ++\fB */\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î²òÀÏ»þ¤Ë¡¢³Æ¹Ô¤ÎÀèƬ¤Ë¤¢¤ë¥¢¥¹¥¿¥ê¥¹¥¯(*)ʸ»ú¤ÏÇË´þ¤µ¤ì¤Þ¤¹¡£ºÇ½é¤Î¥¢¥¹¥¿¥ê¥¹¥¯(*)ʸ»ú¤è¤êÁ°¤Ë¤¢¤ë¶õÇò¤ä¥¿¥Ö¤âÇË´þ¤µ¤ì¤Þ¤¹¡£¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥¤¥ó¥Ç¥ó¥È¤òÊÝ»ý¤·¤¿¤Þ¤Þ¤Ç¥µ¥ó¥×¥ë¡¦¥³¡¼¥É¤ò\fB<PRE>\fR¥¿¥°Æâ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËľÀÜŽ¤êÉÕ¤±¤é¤ì¤ë¤è¤¦¤Ë¡¢ÀèƬ¤Î¶õÇòʸ»ú¤Ïºï½ü¤µ¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¥Ö¥é¥¦¥¶¤Ï¡¢¶õÇòʸ»ú¤ò¥¿¥Ö¤è¤ê¤â°ìΧ¤Ë²ò¼á¤·¤Þ¤¹¡£¥¤¥ó¥Ç¥ó¥È¤Îµ¯ÅÀ¤Ï(¶èÀÚ¤êʸ»ú\fB/**\fR¤Þ¤¿¤Ï\fB<PRE>\fR¥¿¥°¤Ç¤Ï¤Ê¤¯)º¸¥Þ¡¼¥¸¥ó¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.PP ++ºÇ½é¤Îʸ ++.PP ++³Æ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤Ï¡¢Àë¸À¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Ë´Ø¤¹¤ë´Ê·é¤«¤Ä´°Á´¤Ê¥µ¥Þ¥ê¡¼Ê¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Îʸ¤Ï¡¢¶õÇò¡¢¥¿¥Ö¡¢¤Þ¤¿¤Ï¹Ô½ªÎ»Ê¸»ú¤¬Â³¤¯ºÇ½é¤Î¥Ô¥ê¥ª¥É¡¢¤Þ¤¿¤ÏºÇ½é¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤¬¤¢¤ë°ÌÃ֤ǽª¤ï¤ê¤Þ¤¹¡£ºÇ½é¤Îʸ¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆHTML¥Ú¡¼¥¸¤ÎÀèƬ¤Ë¤¢¤ë¥á¥ó¥Ð¡¼¤Î¥µ¥Þ¥ê¡¼¤ÎÉôʬ¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++.PP ++Ê£¿ô¥Õ¥£¡¼¥ë¥É¤ÎÀë¸À ++.PP ++Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¡¢1¤Ä¤Îʸ¤ÇÊ£¿ô¤Î¥Õ¥£¡¼¥ë¥É¤òÀë¸À¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Îʸ¤Ë¤Ï¡¢1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤·¤«µ­½Ò¤Ç¤­¤Þ¤»¤ó¡£¤½¤Î¥³¥á¥ó¥È¤¬¡¢¤¹¤Ù¤Æ¤Î¥Õ¥£¡¼¥ë¥É¤ËÂФ·¤Æ¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¥Õ¥£¡¼¥ë¥É¤´¤È¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢³Æ¥Õ¥£¡¼¥ë¥É¤òÊÌ¡¹¤Îʸ¤ÇÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢1¤Ä¤ÎÀë¸À¤È¤·¤Æµ­½Ò¤¹¤ë¤ÈÉÔŬÀڤǤ¹¡£¤³¤Î¾ì¹ç¤Ï¡¢Àë¸À¤ò2¤Ä¤Ëʬ¤±¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/** \fR ++\fB * The horizontal and vertical distances of point (x,y)\fR ++\fB */\fR ++\fBpublic int x, y; // Avoid this \fR ++\fB \fR ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¾å¤Î¥³¡¼¥É¤«¤é¼¡¤Î¤è¤¦¤Ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic int x\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + The horizontal and vertical distances of point (x, y)\&. +-¥Ø¥Ã¥À¡¼¡¦¥¿¥°¤Î»ÈÍÑ.PP +-¥á¥ó¥Ð¡¼¤ËÂФ·¤Æ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤È¤­¤Ë¤Ï¡¢\fI<H1>\fR¤ä\fI<H2>\fR¤Ê¤É¤ÎHTML¸«½Ð¤·¥¿¥°¤ò»ÈÍѤ·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´°Á´¤Ê¹½Â¤²½¥É¥­¥å¥á¥ó¥È¤òºîÀ®¤¹¤ë¤Î¤Ç¡¢¤³¤Î¤è¤¦¤Ê¹½Â¤²½¥¿¥°¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤È¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Î·Á¼°¤¬°­±Æ¶Á¤ò¼õ¤±¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¥¯¥é¥¹¤ä¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥á¥ó¥È¤Ç¤Ï¡¢¤³¤ì¤é¤Î¸«½Ð¤·¤ò»ÈÍѤ·¤ÆÆȼ«¤Î¹½Â¤¤ò»ØÄꤷ¤Æ¤«¤Þ¤¤¤Þ¤»¤ó¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic int y\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The horizontal and vertical distances of point (x, y)\&. ++.PP ++¥Ø¥Ã¥À¡¼¡¦¥¿¥°¤Î»ÈÍÑ ++.PP ++¥á¥ó¥Ð¡¼¤ËÂФ·¤Æ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤È¤­¤Ë¤Ï¡¢\fB<H1>\fR¤ª¤è¤Ó\fB<H2>\fR¤Ê¤É¤ÎHTML¸«½Ð¤·¥¿¥°¤ò»ÈÍѤ·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´°Á´¤Ê¹½Â¤²½¥É¥­¥å¥á¥ó¥È¤òºîÀ®¤¹¤ë¤Î¤Ç¡¢¤³¤Î¤è¤¦¤Ê¹½Â¤²½¥¿¥°¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤È¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Î·Á¼°¤¬°­±Æ¶Á¤ò¼õ¤±¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¥¯¥é¥¹¤ä¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥á¥ó¥È¤Ç¤Ï¡¢¤³¤ì¤é¤Î¸«½Ð¤·¤ò»ÈÍѤ·¤ÆÆȼ«¤Î¹½Â¤¤ò»ØÄꤷ¤Æ¤«¤Þ¤¤¤Þ¤»¤ó¡£ + .SS "¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤·¤Æ¡¢·çÍ¤¿¥Æ¥­¥¹¥È¤òÆþÎϤ·¤¿¤ê¡¢ÌÀ¼¨Åª¤Ë¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥Õ¥£¡¼¥ë¥É¡¢¤ª¤è¤Ó¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤·¤Þ¤»¤ó¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤·¤Æ¡¢·çÍ¤¿¥Æ¥­¥¹¥È¤òÆþÎϤ·¤¿¤ê¡¢ÌÀ¼¨Åª¤Ë¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥Õ¥£¡¼¥ë¥É¡¢¤ª¤è¤Ó¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤·¤Þ¤»¤ó¡£ + .PP + \fBÃí°Õ:\fR +-¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò¥³¥Ô¡¼¤ËÍøÍѤ¹¤ë¤Ë¤Ï¡¢·Ñ¾µ¤·¤¿¥á¥½¥Ã¥É¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿¥Ñ¥¹¤Î¤ß¤ËÃÖ¤«¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¡¢¥¯¥é¥¹¤â¥Ñ¥Ã¥±¡¼¥¸¤âÅϤ¹É¬ÍפϤ¢¤ê¤Þ¤»¤ó¡£¤³¤ÎÅÀ¤Ï¥ê¥ê¡¼¥¹1\&.3\&.\fIn\fR°ÊÁ°¤È¤ÏÂоÈŪ¤Ç¤¹¡£¤³¤ì¤Þ¤Ç¤Ï¡¢¥¯¥é¥¹¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Ç¤¢¤ë¤³¤È¤¬É¬ÍפǤ·¤¿¡£ +-·çÍî¥Æ¥­¥¹¥È¤ÎÆþÎÏ.PP +-¼çÀâÌÀ¡¢¤Þ¤¿¤Ï\fI@return\fR¡¢\fI@param\fR¡¢\fI@throws\fR¥¿¥°¤¬¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤«¤é·çÍ¤Æ¤¤¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Âбþ¤¹¤ë¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¡¦¥³¥á¥ó¥È¤ò¡¢¤½¤ì¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Þ¤¿¤Ï¼ÂÁõ¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É(¤¢¤ë¾ì¹ç)¤«¤é¥³¥Ô¡¼¤·¤Þ¤¹¡£¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.PP +-ÆÃÄê¤Î¥Ñ¥é¥á¡¼¥¿¤Î\fI@param\fR¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¤½¤Î¥Ñ¥é¥á¡¼¥¿¤Î¥³¥á¥ó¥È¤¬¡¢¾å°Ì¤Î·Ñ¾µ³¬ÁؤΥ᥽¥Ã¥É¤«¤é¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ÆÃÄê¤ÎÎã³°¤Î\fI@throws\fR¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¤½¤ÎÎã³°¤¬Àë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤«¤®¤ê¡¢\fI@throws\fR¥¿¥°¤¬¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò¥³¥Ô¡¼¤ËÍøÍѤ¹¤ë¤Ë¤Ï¡¢·Ñ¾µ¤·¤¿¥á¥½¥Ã¥É¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿¥Ñ¥¹¤Î¤ß¤ËÃÖ¤«¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¡¢¥¯¥é¥¹¤â¥Ñ¥Ã¥±¡¼¥¸¤âÅϤ¹É¬ÍפϤ¢¤ê¤Þ¤»¤ó¡£¤³¤ÎÅÀ¤Ï¥ê¥ê¡¼¥¹1\&.3\&.\fIn\fR°ÊÁ°¤È¤ÏÂоÈŪ¤Ç¤¹¡£¤³¤ì¤Þ¤Ç¤Ï¡¢¥¯¥é¥¹¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Ç¤¢¤ë¤³¤È¤¬É¬ÍפǤ·¤¿¡£ ++.PP ++·çÍî¥Æ¥­¥¹¥È¤ÎÆþÎÏ ++.PP ++¼çÀâÌÀ¡¢¤Þ¤¿¤Ï\fB@return\fR¡¢\fB@param\fR¡¢\fB@throws\fR¥¿¥°¤¬¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤«¤é·çÍ¤Æ¤¤¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Âбþ¤¹¤ë¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¡¦¥³¥á¥ó¥È¤ò¡¢¤½¤ì¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Þ¤¿¤Ï¼ÂÁõ¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É(¤¢¤ë¾ì¹ç)¤«¤é¥³¥Ô¡¼¤·¤Þ¤¹¡£¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++ÆÃÄê¤Î¥Ñ¥é¥á¡¼¥¿¤Î\fB@param\fR¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¤½¤Î¥Ñ¥é¥á¡¼¥¿¤Î¥³¥á¥ó¥È¤¬¡¢¾å°Ì¤Î·Ñ¾µ³¬ÁؤΥ᥽¥Ã¥É¤«¤é¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ÆÃÄê¤ÎÎã³°¤Î\fB@throws\fR¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¤½¤ÎÎã³°¤¬Àë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤«¤®¤ê¡¢\fB@throws\fR¥¿¥°¤¬¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .PP + ¤³¤ÎÆ°ºî¤Ï¥ê¥ê¡¼¥¹1\&.3°ÊÁ°¤ÎÆ°ºî¤È¤ÏÂоÈŪ¤Ç¤¹¡£¤³¤ì¤Þ¤Ç¤Î¥Ð¡¼¥¸¥ç¥ó¤Ç¤Ï¡¢¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¤¬Â¸ºß¤¹¤ì¤Ð¡¢¥³¥á¥ó¥È¤Ï°ìÀڷѾµ¤µ¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£ + .PP + javadoc¥¿¥°¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-ÌÀ¼¨Åª¤Ê·Ñ¾µ.PP +-\fI{@inheritDoc}\fR¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò¥á¥½¥Ã¥É¤Î¼çÀâÌÀ¤Þ¤¿¤Ï\fI@return\fR¡¢\fI@param\fR¡¢\fI@throws\fR¥¿¥°¡¦¥³¥á¥ó¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£Âбþ¤¹¤ë·Ñ¾µ¤µ¤ì¤¿¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¡¦¥³¥á¥ó¥È¤Ï¡¢¤½¤Î¾ì½ê¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++.PP ++ÌÀ¼¨Åª¤Ê·Ñ¾µ ++.PP ++\fB{@inheritDoc}\fR¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò¥á¥½¥Ã¥É¤Î¼çÀâÌÀ¤Þ¤¿¤Ï\fB@return\fR¡¢\fB@param\fR¡¢\fB@throws\fR¥¿¥°¡¦¥³¥á¥ó¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£Âбþ¤¹¤ë·Ñ¾µ¤µ¤ì¤¿¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¡¦¥³¥á¥ó¥È¤Ï¡¢¤½¤Î¾ì½ê¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .SS "¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î·Ñ¾µ" + .PP + ¥³¥á¥ó¥È¤Î·Ñ¾µ¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é¤Î·Ñ¾µ¤Î¡¢¹Í¤¨¤é¤ì¤ë¤¹¤Ù¤Æ¤Î¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£ +@@ -1271,12 +1321,12 @@ + ¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¾ì¹ç + .RE + .PP +-ºÇ½é¤Î2¤Ä¤Î¥±¡¼¥¹¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥ÈÆâ¤Ë\fI¡Ö¥ª¡¼¥Ð¡¼¥é¥¤¥É¡×\fR¤È¤¤¤¦¾®¸«½Ð¤·¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤¬·Ñ¾µ¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ +-.PP +-3¤ÄÌܤΥ±¡¼¥¹(ÆÃÄê¤Î¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¾ì¹ç)¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥ÈÆâ¤Ë\fI¡ÖÄêµÁ¡×\fR¤È¤¤¤¦¾®¸«½Ð¤·¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤¬·Ñ¾µ¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++ºÇ½é¤Î2¤Ä¤Î¥±¡¼¥¹¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥ÈÆâ¤Ë\fI¡Ö¥ª¡¼¥Ð¡¼¥é¥¤¥É¡×\fR¤È¤¤¤¦¾®¸«½Ð¤·¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤¬·Ñ¾µ¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++.PP ++3¤ÄÌܤΥ±¡¼¥¹(ÆÃÄê¤Î¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¾ì¹ç)¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥ÈÆâ¤Ë\fI¡ÖÄêµÁ¡×\fR¤È¤¤¤¦¾®¸«½Ð¤·¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤¬·Ñ¾µ¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .SS "¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î¥¢¥ë¥´¥ê¥º¥à" + .PP +-¥á¥½¥Ã¥É¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬¤Ê¤¤¡¢¤Þ¤¿¤Ï\fI{@inheritDoc}\fR¥¿¥°¤¬¤¢¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆŬÍѤǤ­¤ë¥³¥á¥ó¥È¤ò¸¡º÷¤·¤Þ¤¹¡£¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢ºÇ¤âÆÃÄꤵ¤ì¤ëŬÍѲÄǽ¤Ê¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òõ¤·¡¢¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤è¤ê¤â¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÍ¥À褹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¥á¥½¥Ã¥É¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬¤Ê¤¤¡¢¤Þ¤¿¤Ï\fB{@inheritDoc}\fR¥¿¥°¤¬¤¢¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆŬÍѤǤ­¤ë¥³¥á¥ó¥È¤ò¸¡º÷¤·¤Þ¤¹¡£¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢ºÇ¤âÆÃÄꤵ¤ì¤ëŬÍѲÄǽ¤Ê¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òõ¤·¡¢¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤è¤ê¤â¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÍ¥À褹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1286,7 +1336,7 @@ + .sp -1 + .IP " 1." 4.2 + .\} +-ľÀܤ˼ÂÁõ¤µ¤ì¤Æ¤¤¤ë(¤Þ¤¿¤Ï¡¢³ÈÄ¥¤µ¤ì¤Æ¤¤¤ë)¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¡¢¥á¥½¥Ã¥É¤ÎÀë¸À¤Ç\fIimplements\fR(¤Þ¤¿¤Ï\fIextends\fR)¤È¤¤¤¦¸ì¤Î¸å¤Ë½Ð¸½¤¹¤ë½ç½ø¤Ç¡¢1¤Ä¤º¤ÄÄ´¤Ù¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ë¤Ä¤¤¤ÆºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºÎÍѤ·¤Þ¤¹¡£ ++ľÀܤ˼ÂÁõ¤µ¤ì¤Æ¤¤¤ë(¤Þ¤¿¤Ï¡¢³ÈÄ¥¤µ¤ì¤Æ¤¤¤ë)¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¡¢¥á¥½¥Ã¥É¤ÎÀë¸À¤Ç\fBimplements\fR(¤Þ¤¿¤Ï\fBextends\fR)¤È¤¤¤¦¸ì¤Î¸å¤Ë½Ð¸½¤¹¤ë½ç½ø¤Ç¡¢1¤Ä¤º¤ÄÄ´¤Ù¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ë¤Ä¤¤¤ÆºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºÎÍѤ·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -1308,7 +1358,7 @@ + .sp -1 + .IP " 3." 4.2 + .\} +-¼ê½ç2¤Ç¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ç¡¢¤³¤Î¥¯¥é¥¹¤¬\fIObject\fR°Ê³°¤Î¥¯¥é¥¹¤Ç¤¢¤ë¤¬¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë½èÍý¤·¤Þ¤¹¡£ ++¼ê½ç2¤Ç¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ç¡¢¤³¤Î¥¯¥é¥¹¤¬\fBObject\fR°Ê³°¤Î¥¯¥é¥¹¤Ç¤¢¤ë¤¬¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë½èÍý¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1334,7 +1384,7 @@ + .RE + .SH "JAVADOC¥¿¥°" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ËËä¤á¹þ¤Þ¤ì¤¿ÆÃÊ̤ʥ¿¥°¤ò²òÀϤ·¤Þ¤¹¡£\fIjavadoc\fR¥¿¥°¤ò»ÈÍѤ¹¤ë¤È¡¢´°Á´¤ÊÀ°·Á¼°¤ÎAPI¤ò¥½¡¼¥¹¡¦¥³¡¼¥É¤«¤é¼«Æ°Åª¤ËÀ¸À®¤Ç¤­¤Þ¤¹¡£¥¿¥°¤Ï¥¢¥Ã¥È¥Þ¡¼¥¯µ­¹æ(\fI@\fR)¤Ç»Ï¤Þ¤ê¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢É½¼¨¤µ¤ì¤Æ¤¤¤ë¤È¤ª¤ê¤ËÂçʸ»ú¤È¾®Ê¸»ú¤ò»ÈÍѤ·¤ÆÆþÎϤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¿¥°¤Ï¡¢¹Ô¤ÎÀèƬ(ÀèƬ¤Î¶õÇòʸ»ú¤È¾Êά²Äǽ¤Ê¥¢¥¹¥¿¥ê¥¹¥¯¤Î¸å)¤ËÃÖ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤·¤Ê¤¤¤È¡¢¥Æ¥­¥¹¥È¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£´·Îã¤È¤·¤Æ¡¢Æ±¤¸Ì¾Á°¤Î¥¿¥°¤Ï1²Õ½ê¤Ë¤Þ¤È¤á¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@see\fR¥¿¥°¤¬Ê£¿ô¤¢¤ë¾ì¹ç¤Ï¡¢¤¹¤Ù¤ÆƱ¤¸¾ì½ê¤Ë¤Þ¤È¤á¤ÆÇÛÃÖ¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ËËä¤á¹þ¤Þ¤ì¤¿ÆÃÊ̤ʥ¿¥°¤ò²òÀϤ·¤Þ¤¹¡£\fBjavadoc\fR¥¿¥°¤ò»ÈÍѤ¹¤ë¤È¡¢´°Á´¤ÊÀ°·Á¼°¤ÎAPI¤ò¥½¡¼¥¹¡¦¥³¡¼¥É¤«¤é¼«Æ°Åª¤ËÀ¸À®¤Ç¤­¤Þ¤¹¡£¥¿¥°¤Ï¥¢¥Ã¥È¥Þ¡¼¥¯µ­¹æ(\fB@\fR)¤Ç»Ï¤Þ¤ê¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢É½¼¨¤µ¤ì¤Æ¤¤¤ë¤È¤ª¤ê¤ËÂçʸ»ú¤È¾®Ê¸»ú¤ò»ÈÍѤ·¤ÆÆþÎϤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¿¥°¤Ï¡¢¹Ô¤ÎÀèƬ(ÀèƬ¤Î¶õÇòʸ»ú¤È¾Êά²Äǽ¤Ê¥¢¥¹¥¿¥ê¥¹¥¯¤Î¸å)¤ËÃÖ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤·¤Ê¤¤¤È¡¢¥Æ¥­¥¹¥È¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£´·Îã¤È¤·¤Æ¡¢Æ±¤¸Ì¾Á°¤Î¥¿¥°¤Ï1²Õ½ê¤Ë¤Þ¤È¤á¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@see\fR¥¿¥°¤¬Ê£¿ô¤¢¤ë¾ì¹ç¤Ï¡¢¤¹¤Ù¤ÆƱ¤¸¾ì½ê¤Ë¤Þ¤È¤á¤ÆÇÛÃÖ¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP + ¥¿¥°¤Ë¤Ï¡¢¼¡¤Î¥¿¥¤¥×¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +@@ -1367,7 +1417,7 @@ + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-\fI\-author\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢»ØÄꤷ¤¿Ì¾Á°¤Î¥Æ¥­¥¹¥È¤ÎºîÀ®¼Ô¥¨¥ó¥È¥ê¤òÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤ËÄɲä·¤Þ¤¹¡£1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËÊ£¿ô¤Î\fI@author\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£1¤Ä¤Î\fI@author\fR¥¿¥°¤Ë1¤Ä¤Î̾Á°¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ê£¿ô¤Î̾Á°¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Á°¼Ô¤Î¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ̾Á°¤È̾Á°¤Î´Ö¤Ë¥«¥ó¥Þ(,)¤È¶õÇòʸ»ú¤¬ÁÞÆþ¤µ¤ì¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¤Ï¡¢¥Æ¥­¥¹¥ÈÁ´ÂΤ¬²òÀϤµ¤ì¤ë¤³¤È¤Ê¤¯¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥«¥ó¥Þ¤Ç¤Ï¤Ê¤¯¡¢³Æ¸À¸ì¤ËÂбþ¤·¤¿Ì¾Á°¶èÀÚ¤êʸ»ú¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¤È¤­¤Ë¡¢1¹Ô¤ËÊ£¿ô¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@author¤Ë´Ø¤¹¤ë¹à ++\fB\-author\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢»ØÄꤷ¤¿Ì¾Á°¤Î¥Æ¥­¥¹¥È¤ÎºîÀ®¼Ô¥¨¥ó¥È¥ê¤òÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤ËÄɲä·¤Þ¤¹¡£1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËÊ£¿ô¤Î\fB@author\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£1¤Ä¤Î\fB@author\fR¥¿¥°¤Ë1¤Ä¤Î̾Á°¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ê£¿ô¤Î̾Á°¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Á°¼Ô¤Î¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ̾Á°¤È̾Á°¤Î´Ö¤Ë¥«¥ó¥Þ(,)¤È¶õÇòʸ»ú¤¬ÁÞÆþ¤µ¤ì¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¤Ï¡¢¥Æ¥­¥¹¥ÈÁ´ÂΤ¬²òÀϤµ¤ì¤ë¤³¤È¤Ê¤¯¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥«¥ó¥Þ¤Ç¤Ï¤Ê¤¯¡¢³Æ¸À¸ì¤ËÂбþ¤·¤¿Ì¾Á°¶èÀÚ¤êʸ»ú¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¤È¤­¤Ë¡¢1¹Ô¤ËÊ£¿ô¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@author¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@author)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +@@ -1375,18 +1425,18 @@ + .RS 4 + JDK 1\&.5¤ÇƳÆþ + .sp +-\fI<code>{@literal}</code>\fR¤ÈƱÅù¤Ç¤¹¡£ +-.sp +-¥Æ¥­¥¹¥È¤òHTML¥Þ¡¼¥¯¥¢¥Ã¥×¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿Javadoc¥¿¥°¤È¤·¤Æ²ò¼á¤»¤º¤Ë¡¢text¤ò¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Çɽ¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤Î·¿(\fI<Object>\fR)¡¢ÉÔÅù¹æ(\fI3 < 4\fR)¡¢Ìð°õ(\fI<\-\fR)¤Ê¤É¤Ç¡¢Ä̾ï¤Î»³¥«¥Ã¥³(<¤ª¤è¤Ó>)¤òHTML¥¨¥ó¥Æ¥£¥Æ¥£(\fI<\fR¤ª¤è¤Ó\fI>\fR)¤Î¤«¤ï¤ê¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È\fI{@code A<B>C}\fR¤Ï\fIA<B>C\fR¤È¤·¤ÆÊѹ¹¤µ¤ì¤º¤ËÀ¸À®¤µ¤ì¤¿HTML¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢\fI<B>\fR¤¬ÂÀ»ú¤È¤·¤Æ²ò¼á¤µ¤ì¤º¡¢¤½¤Î¥Õ¥©¥ó¥È¤Ï¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ë¤Ê¤ê¤Þ¤¹¡£¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ê¤·¤ÇƱ¤¸µ¡Ç½¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¢\fI{@literal}\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fB<code>{@literal}</code>\fR¤ÈƱÅù¤Ç¤¹¡£ ++.sp ++¥Æ¥­¥¹¥È¤òHTML¥Þ¡¼¥¯¥¢¥Ã¥×¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿Javadoc¥¿¥°¤È¤·¤Æ²ò¼á¤»¤º¤Ë¡¢text¤ò¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Çɽ¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤Î·¿(\fB<Object>\fR)¡¢ÉÔÅù¹æ(\fB3 < 4\fR)¡¢Ìð°õ(\fB<\-\fR)¤Ê¤É¤Ç¡¢Ä̾ï¤Î»³¥«¥Ã¥³(<¤ª¤è¤Ó>)¤òHTML¥¨¥ó¥Æ¥£¥Æ¥£(\fB<\fR¤ª¤è¤Ó\fB>\fR)¤Î¤«¤ï¤ê¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢À¸À®¤µ¤ì¤¿HTML¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¦¥Æ¥­¥¹¥È\fB{@code A<B>C}\fR¤Ï¡¢Êѹ¹¤µ¤ì¤º\fBA<B>C\fR¤È¤Ê¤ê¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢\fB<B>\fR¤¬ÂÀ»ú¤È¤·¤Æ²ò¼á¤µ¤ì¤º¡¢¤½¤Î¥Õ¥©¥ó¥È¤Ï¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ë¤Ê¤ê¤Þ¤¹¡£¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ê¤·¤ÇƱ¤¸µ¡Ç½¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¢\fB{@literal}\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + @deprecated \fIdeprecated\-text\fR + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-¤³¤ÎAPI¤ÏÆ°ºî¤·Â³¤±¤Þ¤¹¤¬¡¢¤³¤ÎAPI¤ò»ÈÍѤ·¤Ê¤¤¤³¤È¤òÁ¦¤á¤ë¥³¥á¥ó¥È¤òÄɲä·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIdeprecated\-text\fR¤ò¼çÀâÌÀ¤ÎÁ°¤Ë°ÜÆ°¤·¤Æ¥¤¥¿¥ê¥Ã¥¯¤Ë¤·¡¢¤½¤ÎÁ°¤ËÂÀ»ú¤Î·Ù¹ð¡Ö¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¡×¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£ +-.sp +-Èó¿ä¾©¥Æ¥­¥¹¥È¤ÎºÇ½é¤Îʸ¤Ç¤Ï¡¢¤½¤ÎAPI¤¬¿ä¾©¤µ¤ì¤Ê¤¯¤Ê¤Ã¤¿»þ´ü¤È¡¢ÂåÂؤȤ·¤Æ»ÈÍѤ¹¤ëAPI¤ò¥æ¡¼¥¶¡¼¤ËÄ󼨤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤³¤ÎºÇ½é¤Îʸ¤ò¡¢¥µ¥Þ¥ê¡¼¡¦¥»¥¯¥·¥ç¥ó¤Èº÷°ú¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¤½¤Î¸å¤Îʸ¤ÇÈó¿ä¾©¤Ë¤Ê¤Ã¤¿Íýͳ¤òÀâÌÀ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ÂåÂØAPI¤ò»Ø¤·¼¨¤¹\fI{@link}\fR¥¿¥°(Javadoc 1\&.2°Ê¹ß¤Î¾ì¹ç)¤ò´Þ¤á¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¤³¤ÎAPI¤ÏÆ°ºî¤·Â³¤±¤Þ¤¹¤¬¡¢¤³¤ÎAPI¤ò»ÈÍѤ·¤Ê¤¤¤³¤È¤òÁ¦¤á¤ë¥³¥á¥ó¥È¤òÄɲä·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBdeprecated\-text\fR¤ò¼çÀâÌÀ¤ÎÁ°¤Ë°ÜÆ°¤·¤Æ¥¤¥¿¥ê¥Ã¥¯¤Ë¤·¡¢¤½¤ÎÁ°¤ËÂÀ»ú¤Î·Ù¹ð¡Ö¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¡×¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£ ++.sp ++Èó¿ä¾©¥Æ¥­¥¹¥È¤ÎºÇ½é¤Îʸ¤Ç¤Ï¡¢¤½¤ÎAPI¤¬¿ä¾©¤µ¤ì¤Ê¤¯¤Ê¤Ã¤¿»þ´ü¤È¡¢ÂåÂؤȤ·¤Æ»ÈÍѤ¹¤ëAPI¤ò¥æ¡¼¥¶¡¼¤ËÄ󼨤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤³¤ÎºÇ½é¤Îʸ¤ò¡¢¥µ¥Þ¥ê¡¼¡¦¥»¥¯¥·¥ç¥ó¤Èº÷°ú¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¤½¤Î¸å¤Îʸ¤ÇÈó¿ä¾©¤Ë¤Ê¤Ã¤¿Íýͳ¤òÀâÌÀ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ÂåÂØAPI¤ò»Ø¤·¼¨¤¹\fB{@link}\fR¥¿¥°(Javadoc 1\&.2°Ê¹ß¤Î¾ì¹ç)¤ò´Þ¤á¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + \fI@deprecated annotation\fR¥¿¥°¤ò»ÈÍѤ·¤Æ¥×¥í¥°¥é¥àÍ×ÁǤòÈó¿ä¾©¤Ë¤·¤Þ¤¹¡£API¤òÈó¿ä¾©¤Ë¤¹¤ëÊýË¡¤È»þ´ü + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/deprecation/deprecation\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +@@ -1402,7 +1452,7 @@ + .sp + À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤«¤é¤Î¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Î(À¸À®Àè)¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤ÎÁêÂХѥ¹¤òɽ¤·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢Ãøºî¸¢¤Î¥Ú¡¼¥¸¤ä²ñ¼Ò¤Î¥í¥´¤Ê¤É¡¢À¸À®¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤«¤é»²¾È¤¹¤ë¥Õ¥¡¥¤¥ë¤òÁȤ߹þ¤à¤È¤­¤ËÊØÍø¤Ç¤¹¡£Ä̾ï¤Ï¡¢³Æ¥Ú¡¼¥¸¤ÎºÇ²¼Éô¤«¤éÃøºî¸¢¤Î¥Ú¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£ + .sp +-¤³¤Î\fI{@docRoot}\fR¥¿¥°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¤â¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤â»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢Ç¤°Õ¤Î¥¿¥°(\fI@return\fR¡¢\fI@param\fR¤ª¤è¤Ó\fI@deprecated\fR¥¿¥°¤Ê¤É)¤Î¥Æ¥­¥¹¥ÈÉôʬ¤ò´Þ¤à¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£ ++¤³¤Î\fB{@docRoot}\fR¥¿¥°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç¤â¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤â»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢Ç¤°Õ¤Î¥¿¥°(\fB@return\fR¡¢\fB@param\fR¤ª¤è¤Ó\fB@deprecated\fR¥¿¥°¤Ê¤É)¤Î¥Æ¥­¥¹¥ÈÉôʬ¤ò´Þ¤à¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1412,9 +1462,9 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¡¢¥Ø¥Ã¥À¡¼¡¢¥Õ¥Ã¥¿¡¼¤Þ¤¿¤ÏºÇ²¼Éô¤¬¼¡¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£\fIjavadoc \-bottom \*(Aq<a href="{@docRoot}/copyright\&.html">Copyright</a>\*(Aq\fR +-.sp +-\fI{@docRoot}\fR¥¿¥°¤òmakefileÆâ¤Ç¤³¤Î¤è¤¦¤ËÍøÍѤ¹¤ë¾ì¹ç¡¢°ìÉô¤Î\fImakefile\fR¥×¥í¥°¥é¥à¤Ç¤Ï¡¢Ã楫¥Ã¥³\fI{}\fRʸ»ú¤òÆÃÊ̤˥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢Inprise MAKE¥Ð¡¼¥¸¥ç¥ó5\&.2¤òWindows¾å¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç¤Ï¡¢\fI{{@docRoot}}\fR¤Î¤è¤¦¤Ë¡¢Ã楫¥Ã¥³¤òÆó½Å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤Ê¤É¤Î¥ª¥×¥·¥ç¥ó¤Ø¤Î°ú¿ô¤ò°Ï¤à¤Î¤Ë¡¢Æó½Å(°ì½Å¤Ç¤Ï¤Ê¤¯)°úÍÑÉä¤âɬÍפǤ¹(\fIhref\fR°ú¿ô¤ò°Ï¤à°úÍÑÉä¤Ï¾Êά)¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç¡¢header¡¢footer¤Þ¤¿¤Ïbottom¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBjavadoc \-bottom \*(Aq<a href="{@docRoot}/copyright\&.html">Copyright</a>\*(Aq\fR¤È¤Ê¤ê¤Þ¤¹¡£ ++.sp ++\fB{@docRoot}\fR¥¿¥°¤òmakefileÆâ¤Ç¤³¤Î¤è¤¦¤ËÍøÍѤ¹¤ë¾ì¹ç¡¢°ìÉô¤Î\fBmakefile\fR¥×¥í¥°¥é¥à¤Ç¤Ï¡¢Ã楫¥Ã¥³\fB{}\fRʸ»ú¤òÆÃÊ̤˥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢Inprise MAKE¥Ð¡¼¥¸¥ç¥ó5\&.2¤òWindows¾å¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç¤Ï¡¢\fB{{@docRoot}}\fR¤Î¤è¤¦¤Ë¡¢Ã楫¥Ã¥³¤òÆó½Å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤Ê¤É¤Î¥ª¥×¥·¥ç¥ó¤Ø¤Î°ú¿ô¤ò°Ï¤à¤Î¤Ë¡¢Æó½Å(°ì½Å¤Ç¤Ï¤Ê¤¯)°úÍÑÉä¤âɬÍפǤ¹(\fBhref\fR°ú¿ô¤ò°Ï¤à°úÍÑÉä¤Ï¾Êά)¡£ + .RE + .sp + .RS 4 +@@ -1431,14 +1481,16 @@ + .RS 4 + .\} + .nf +-/** +- * See the <a href="{@docRoot}/copyright\&.html">Copyright</a>\&. +- */ ++\fB/**\fR ++\fB * See the <a href="{@docRoot}/copyright\&.html">Copyright</a>\&.\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥¿¥°¤¬É¬ÍפÊÍýͳ¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤¬¡¢¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä³¬Áع½Â¤¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£¼°\fI<a href="{@docRoot}/copyright\&.html">\fR¤Ï¡¢\fIjava/lang/Object\&.java\fR¤ËÂФ·¤Æ¤Ï\fI<a href="\&.\&./\&.\&./copyright\&.html">\fR¤Ë²ò·è¤µ¤ì¡¢\fIjava/lang/ref/Reference\&.java\fR¤ËÂФ·¤Æ¤Ï\fI<a href="\&.\&./\&.\&./\&.\&./copyright\&.html">\fR¤Ë²ò·è¤µ¤ì¤Þ¤¹¡£ ++¤³¤Î¥¿¥°¤¬É¬ÍפÊÍýͳ¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤¬¡¢¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä³¬Áع½Â¤¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£¼°: ++\fB<a href="{@docRoot}/copyright\&.html">\fR¤Ï¡¢\fBjava/lang/Object\&.java\fR¤Î¾ì¹ç\fB<a href="\&.\&./\&.\&./copyright\&.html">\fR¤Ë¡¢\fBjava/lang/ref/Reference\&.java\fR¤Î¾ì¹ç\fB<a href="\&.\&./\&.\&./\&.\&./copyright\&.html">\fR¤Ë²ò·è¤µ¤ì¤Þ¤¹¡£ + .RE + .RE + .PP +@@ -1446,7 +1498,7 @@ + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-\fI@throws\fR¥¿¥°¤ÈƱ¤¸¤Ç¤¹¡£@throws class\-name description¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB@throws\fR¥¿¥°¤ÈƱ¤¸¤Ç¤¹¡£@throws class\-name description¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + {@inheritDoc} +@@ -1476,7 +1528,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥á¥½¥Ã¥É¤Î\fI@return\fR¡¢\fI@param\fR¡¢\fI@throws\fR¥¿¥°¤Î¥Æ¥­¥¹¥È°ú¿ôÆâ¡£¤³¤Î¾ì¹ç¡¢¥¿¥°¡¦¥Æ¥­¥¹¥È¤Ï¡¢¾å°Ì³¬ÁؤÎÂбþ¤¹¤ë¥¿¥°¤«¤é¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++¥á¥½¥Ã¥É¤Î\fB@return\fR¡¢\fB@param\fR¡¢\fB@throws\fR¥¿¥°¤Î¥Æ¥­¥¹¥È°ú¿ôÆâ¡£¤³¤Î¾ì¹ç¡¢¥¿¥°¡¦¥Æ¥­¥¹¥È¤Ï¡¢¾å°Ì³¬ÁؤÎÂбþ¤¹¤ë¥¿¥°¤«¤é¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + ·Ñ¾µ³¬Áؤǥ³¥á¥ó¥È¤ò¸«¤Ä¤±¤ëÊýË¡¤Ë´Ø¤¹¤ëÀâÌÀ¤Ï¡¢¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¥³¥á¥ó¥È¤Ï¡¢¤³¤Î¹à¤ÇÀâÌÀ¤¹¤ë¥ë¡¼¥ë¤Ë±þ¤¸¤Æ¡¢¼«Æ°Åª¤Ë·Ñ¾µ¤µ¤ì¤ë¤«¤É¤¦¤«¤¬·è¤Þ¤ê¤Þ¤¹¡£ +@@ -1486,20 +1538,21 @@ + .RS 4 + JDK 1\&.2¤ÇƳÆþ + .sp +-ɽ¼¨¥Æ¥­¥¹¥Èlabel¤È¤È¤â¤Ë¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤òÁÞÆþ¤·¤Þ¤¹¡£label¤Ï¡¢»²¾È¥¯¥é¥¹¤Î»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î̾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»Ø¤·¼¨¤·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢\fI@return\fR¡¢\fI@param\fR¤ª¤è¤Ó\fI@deprecated\fR¥¿¥°¤Ê¤É¤ÎǤ°Õ¤Î¥¿¥°¤Î¥Æ¥­¥¹¥ÈÉôʬ¤ò´Þ¤à¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@link¤Ë´Ø¤¹¤ë¹à ++ɽ¼¨¥Æ¥­¥¹¥Èlabel¤È¤È¤â¤Ë¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤òÁÞÆþ¤·¤Þ¤¹¡£label¤Ï¡¢»²¾È¥¯¥é¥¹¤Î»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î̾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»Ø¤·¼¨¤·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢\fB@return\fR¡¢\fB@param\fR¤ª¤è¤Ó\fB@deprecated\fR¥¿¥°¤Ê¤É¤ÎǤ°Õ¤Î¥¿¥°¤Î¥Æ¥­¥¹¥ÈÉôʬ¤ò´Þ¤à¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@link¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#{@link)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¤³¤Î¥¿¥°¤Ï\fI@see\fR¥¿¥°¤Ë»÷¤Æ¤¤¤Þ¤¹¡£¤É¤Á¤é¤Î¥¿¥°¤â¡¢\fIpackage\&.class#member\fR¤È\fIlabel\fR¤Î»²¾ÈÊýË¡¤È¡¢Í­¸ú¤Ê¹½Ê¸¤¬Æ±¤¸¤Ç¤¹¡£¼ç¤Ê°ã¤¤¤Ï¡¢\fI{@link}\fR¥¿¥°¤Ç¤Ï¡¢¡Ö´ØÏ¢¹àÌܡץ»¥¯¥·¥ç¥ó¤Ë¥ê¥ó¥¯¤¬ÇÛÃÖ¤µ¤ì¤ë¤«¤ï¤ê¤Ë¡¢¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤¬À¸À®¤µ¤ì¤ë¤È¤¤¤¦ÅÀ¤Ç¤¹¡£¥¤¥ó¥é¥¤¥ó¡¦¥Æ¥­¥¹¥È¤Î¾¤ÎÉôʬ¤È¶èÊ̤¹¤ë¤¿¤á¤Ë¡¢\fI{@link}\fR¥¿¥°¤ÎºÇ½é¤ÈºÇ¸å¤ËÃ楫¥Ã¥³¤òµ­½Ò¤·¤Þ¤¹¡£¥é¥Ù¥ëÆâ¤Ç±¦Ã楫¥Ã¥³(\fI}\fR)¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢HTML¥¨¥ó¥Æ¥£¥Æ¥£µ­Ë¡\fI}\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-1¤Äʸ¤ÎÃæ¤Ç»ÈÍѤǤ­¤ë\fI{@link}\fR¥¿¥°¤Î¿ô¤ËÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¥¿¥°¤Ï¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¼çÀâÌÀÉôʬ¡¢¤Þ¤¿¤Ï\fI@deprecated\fR¡¢\fI@return\fR¡¢\fI@param\fR¥¿¥°¤Ê¤É¤ÎǤ°Õ¤Î¥¿¥°¤Î¥Æ¥­¥¹¥ÈÉôʬ¤Ç»ÈÍѤǤ­¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥á¥ó¥È¤Ç¤Ï\fIgetComponentAt(int,int)\fR¥á¥½¥Ã¥É¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹¡£ ++¤³¤Î¥¿¥°¤Ï\fB@see\fR¥¿¥°¤Ë»÷¤Æ¤¤¤Þ¤¹¡£¤É¤Á¤é¤Î¥¿¥°¤â¡¢\fBpackage\&.class#member\fR¤È\fBlabel\fR¤Î»²¾ÈÊýË¡¤È¡¢Í­¸ú¤Ê¹½Ê¸¤¬Æ±¤¸¤Ç¤¹¡£¼ç¤Ê°ã¤¤¤Ï¡¢\fB{@link}\fR¥¿¥°¤Ç¤Ï¡¢¡Ö´ØÏ¢¹àÌܡץ»¥¯¥·¥ç¥ó¤Ë¥ê¥ó¥¯¤¬ÇÛÃÖ¤µ¤ì¤ë¤«¤ï¤ê¤Ë¡¢¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤¬À¸À®¤µ¤ì¤ë¤È¤¤¤¦ÅÀ¤Ç¤¹¡£¥¤¥ó¥é¥¤¥ó¡¦¥Æ¥­¥¹¥È¤Î¾¤ÎÉôʬ¤È¶èÊ̤¹¤ë¤¿¤á¤Ë¡¢\fB{@link}\fR¥¿¥°¤ÎºÇ½é¤ÈºÇ¸å¤ËÃ楫¥Ã¥³¤òµ­½Ò¤·¤Þ¤¹¡£¥é¥Ù¥ëÆâ¤Ç±¦Ã楫¥Ã¥³(\fB}\fR)¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢HTML¥¨¥ó¥Æ¥£¥Æ¥£µ­Ë¡\fB}\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++1¤Äʸ¤ÎÃæ¤Ç»ÈÍѤǤ­¤ë\fB{@link}\fR¥¿¥°¤Î¿ô¤ËÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¥¿¥°¤Ï¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¼çÀâÌÀÉôʬ¡¢¤Þ¤¿¤Ï\fB@deprecated\fR¡¢\fB@return\fR¡¢\fB@param\fR¥¿¥°¤Ê¤É¤ÎǤ°Õ¤Î¥¿¥°¤Î¥Æ¥­¥¹¥ÈÉôʬ¤Ç»ÈÍѤǤ­¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥á¥ó¥È¤Ç¤Ï\fBgetComponentAt(int,int)\fR¥á¥½¥Ã¥É¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Use the {@link #getComponentAt(int, int) getComponentAt} method\&. ++\fBUse the {@link #getComponentAt(int, int) getComponentAt} method\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -1510,7 +1563,8 @@ + .RS 4 + .\} + .nf +-Use the <a href="Component\&.html#getComponentAt(int, int)">getComponentAt</a> method\&. ++\fBUse the <a href="Component\&.html#getComponentAt(int, int)">getComponentAt</a> method\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -1521,7 +1575,8 @@ + .RS 4 + .\} + .nf +-Use the getComponentAt method\&. ++\fBUse the getComponentAt method\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -1532,24 +1587,24 @@ + .RS 4 + JDK 1\&.4¤ÇƳÆþ + .sp +-\fI{@link}\fR¥¿¥°¤ÈƱ¤¸Æ°ºî¤ò¤·¤Þ¤¹¤¬¡¢¥ê¥ó¥¯¡¦¥é¥Ù¥ë¤¬¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ç¤Ï¤Ê¤¯¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Çɽ¼¨¤µ¤ì¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£¥é¥Ù¥ë¤¬¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¤ÈÊØÍø¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¡Ö\fIRefer to {@linkplain add() the overridden method}\fR\&.¡×¤Ï¡ÖRefer to the overridden method¡×¤Èɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++\fB{@link}\fR¥¿¥°¤ÈƱ¤¸Æ°ºî¤ò¤·¤Þ¤¹¤¬¡¢¥ê¥ó¥¯¡¦¥é¥Ù¥ë¤¬¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ç¤Ï¤Ê¤¯¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Çɽ¼¨¤µ¤ì¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£¥é¥Ù¥ë¤¬¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¤ÈÊØÍø¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¡Ö\fBRefer to {@linkplain add() the overridden method}\fR\&.¡×¤Ï¡ÖRefer to the overridden method¡×¤Èɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + {@literal \fItext\fR} + .RS 4 + JDK 1\&.5¤ÇƳÆþ + .sp +-¥Æ¥­¥¹¥È¤òHTML¥Þ¡¼¥¯¥¢¥Ã¥×¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿Javadoc¥¿¥°¤È¤·¤Æ²ò¼á¤»¤º¤Ë¡¢text¤òɽ¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤Î·¿(\fI<Object>\fR)¡¢ÉÔÅù¹æ(\fI3 < 4\fR)¡¢Ìð°õ(<\-)¤Ê¤É¤Ç¡¢»³¥«¥Ã¥³(\fI<¤ª¤è¤Ó>\fR)¤òHTML¥¨¥ó¥Æ¥£¥Æ¥£(\fI<\fR¤ª¤è¤Ó\fI>\fR)¤Î¤«¤ï¤ê¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È\fI{@literal A<B>C}\fR¤Ï\fIA<B>C\fR¤È¤·¤Æ¡¢¥Ö¥é¥¦¥¶¤ÎÀ¸À®¤µ¤ì¤¿HTML¥Ú¡¼¥¸¤ËÊѹ¹¤µ¤ì¤º¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£\fI<B>\fR¤ÏÂÀ»ú¤È¤·¤Æ²ò¼á¤µ¤ì¤Þ¤»¤ó(¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ë¤Ê¤ê¤Þ¤»¤ó)¡£¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤ÇƱ¤¸µ¡Ç½¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¢\fI{@code}\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥Æ¥­¥¹¥È¤òHTML¥Þ¡¼¥¯¥¢¥Ã¥×¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿Javadoc¥¿¥°¤È¤·¤Æ²ò¼á¤»¤º¤Ë¡¢text¤òɽ¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤Î·¿(\fB<Object>\fR)¡¢ÉÔÅù¹æ(\fB3 < 4\fR)¡¢Ìð°õ(<\-)¤Ê¤É¤Ç¡¢»³¥«¥Ã¥³(\fB<¤ª¤è¤Ó>\fR)¤òHTML¥¨¥ó¥Æ¥£¥Æ¥£(\fB<\fR¤ª¤è¤Ó\fB>\fR)¤Î¤«¤ï¤ê¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¦¥Æ¥­¥¹¥È\fB{@literal A<B>C}\fR¤Ï¡¢Êѹ¹¤µ¤ì¤º¤Ë¥Ö¥é¥¦¥¶¤ËÀ¸À®¤µ¤ì¤¿HTML¥Ú¡¼¥¸¤Ë\fBA<B>C\fR¤Èɽ¼¨¤µ¤ì¤Þ¤¹¡£\fB<B>\fR¤ÏÂÀ»ú¤È¤·¤Æ²ò¼á¤µ¤ì¤Þ¤»¤ó(¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ë¤Ê¤ê¤Þ¤»¤ó)¡£¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤ÇƱ¤¸µ¡Ç½¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¢\fB{@code}\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + @param \fIparameter\-name description\fR + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-¡Ö¥Ñ¥é¥á¡¼¥¿¡×¥»¥¯¥·¥ç¥ó¤Ë¡¢»ØÄꤵ¤ì¤¿\fIparameter\-name\fR¤Î¸å¤Ë»ØÄꤵ¤ì¤¿description¤ò³¤±¤Æ¥Ñ¥é¥á¡¼¥¿¤òÄɲä·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤È¤­¤Ë¤Ï¡¢description¤òÊ£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤Þ¤¿¤Ï¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤Î¤ßÍ­¸ú¤Ç¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@param¤Ë´Ø¤¹¤ë¹à ++¡Ö¥Ñ¥é¥á¡¼¥¿¡×¥»¥¯¥·¥ç¥ó¤Ë¡¢»ØÄꤵ¤ì¤¿\fBparameter\-name\fR¤Î¸å¤Ë»ØÄꤵ¤ì¤¿description¤ò³¤±¤Æ¥Ñ¥é¥á¡¼¥¿¤òÄɲä·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤È¤­¤Ë¤Ï¡¢description¤òÊ£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤Þ¤¿¤Ï¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤Î¤ßÍ­¸ú¤Ç¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@param¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@param)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fIparameter\-name\fR¤Ï¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¤Î¥Ñ¥é¥á¡¼¥¿¤Î̾Á°¤«¡¢¥¯¥é¥¹¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Î·¿¥Ñ¥é¥á¡¼¥¿¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£»³¥«¥Ã¥³¤Ç¤³¤Î¥Ñ¥é¥á¡¼¥¿Ì¾¤ò°Ï¤ß¡¢·¿¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ¹¤ë¤³¤È¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBparameter\-name\fR¤Ï¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¤Î¥Ñ¥é¥á¡¼¥¿¤Î̾Á°¤«¡¢¥¯¥é¥¹¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Î·¿¥Ñ¥é¥á¡¼¥¿¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£»³¥«¥Ã¥³¤Ç¤³¤Î¥Ñ¥é¥á¡¼¥¿Ì¾¤ò°Ï¤ß¡¢·¿¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ¹¤ë¤³¤È¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + ¥¯¥é¥¹¤Î·¿¥Ñ¥é¥á¡¼¥¿¤ÎÎã: + .sp +@@ -1557,11 +1612,12 @@ + .RS 4 + .\} + .nf +-/** +- * @param <E> Type of element stored in a list +- */ +-public interface List<E> extends Collection<E> { +-} ++\fB/**\fR ++\fB * @param <E> Type of element stored in a list\fR ++\fB */\fR ++\fBpublic interface List<E> extends Collection<E> {\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -1572,14 +1628,15 @@ + .RS 4 + .\} + .nf +-/** +- * @param string the string to be converted +- * @param type the type to convert the string to +- * @param <T> the type of the element +- * @param <V> the value of the element +- */ +-<T, V extends T> V convert(String string, Class<T> type) { +-} ++\fB/**\fR ++\fB * @param string the string to be converted\fR ++\fB * @param type the type to convert the string to\fR ++\fB * @param <T> the type of the element\fR ++\fB * @param <V> the value of the element\fR ++\fB */\fR ++\fB<T, V extends T> V convert(String string, Class<T> type) {\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -1598,25 +1655,25 @@ + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-\fI¡Ö´ØÏ¢¹àÌÜ¡×\fR¸«½Ð¤·¤òÄɲ䷤ơ¢reference¤ò»Ø¤¹¥ê¥ó¥¯¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥È¡¦¥¨¥ó¥È¥ê¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤ÏǤ°Õ¤Î¿ô¤Î\fI@see\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤ì¤é¤Ï¤¹¤Ù¤ÆƱ¤¸¸«½Ð¤·¤Î²¼¤Ë¥°¥ë¡¼¥×²½¤µ¤ì¤Þ¤¹¡£\fI@see\fR¥¿¥°¤Ë¤Ï¡¢3¤Ä¤Î¥¿¥¤¥×¤Î·Á¼°¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î·Á¼°¤¬ºÇ¤â°ìÈÌŪ¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤òʸÃæ¤ËÁÞÆþ¤¹¤ëÊýË¡¤Ï¡¢\fI{@link}\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fI¡Ö´ØÏ¢¹àÌÜ¡×\fR¸«½Ð¤·¤òÄɲ䷤ơ¢reference¤ò»Ø¤¹¥ê¥ó¥¯¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥È¡¦¥¨¥ó¥È¥ê¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤ÏǤ°Õ¤Î¿ô¤Î\fB@see\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤ì¤é¤Ï¤¹¤Ù¤ÆƱ¤¸¸«½Ð¤·¤Î²¼¤Ë¥°¥ë¡¼¥×²½¤µ¤ì¤Þ¤¹¡£\fB@see\fR¥¿¥°¤Ë¤Ï¡¢3¤Ä¤Î¥¿¥¤¥×¤Î·Á¼°¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î·Á¼°¤¬ºÇ¤â°ìÈÌŪ¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤òʸÃæ¤ËÁÞÆþ¤¹¤ëÊýË¡¤Ï¡¢\fB{@link}\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fB·Á¼°1\fR¡£@see +-\fIstring\fR¥¿¥°·Á¼°¤Ï¡¢\fIstring\fR¤Î¥Æ¥­¥¹¥È¡¦¥¨¥ó¥È¥ê¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£string¤Ï¡¢½ñÀÒ¤Þ¤¿¤ÏURL¤Ç¤Ï¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¾ðÊó¤Î»²¾ÈÀè¤Ç¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ºÇ½é¤Îʸ»ú¤È¤·¤ÆÆó½Å°úÍÑÉä(")¤ò¸¡º÷¤·¤Æ¡¢¤³¤Î·Á¼°¤òÁ°½Ò¤Î·Á¼°¤È¶èÊ̤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@see "The Java Programming Language"\fR¤Ï¼¡¤Î¥Æ¥­¥¹¥È¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBstring\fR¥¿¥°·Á¼°¤Ï¡¢\fIstring\fR¤Î¥Æ¥­¥¹¥È¡¦¥¨¥ó¥È¥ê¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£string¤Ï¡¢½ñÀÒ¤Þ¤¿¤ÏURL¤Ç¤Ï¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¾ðÊó¤Î»²¾ÈÀè¤Ç¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ºÇ½é¤Îʸ»ú¤È¤·¤ÆÆó½Å°úÍÑÉä(")¤ò¸¡º÷¤·¤Æ¡¢¤³¤Î·Á¼°¤òÁ°½Ò¤Î·Á¼°¤È¶èÊ̤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@see "The Java Programming Language"\fR¤Ï¼¡¤Î¥Æ¥­¥¹¥È¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + \fB´ØÏ¢¹àÌÜ\fR: + .sp + "The Java Programming Language" + .sp +-\fB·Á¼°2\fR¡£\fI@see <a href="URL#value">label</a>\fR·Á¼°¤Ï¡¢\fIURL#value\fR¤Ë¤è¤êÄêµÁ¤µ¤ì¤¿¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£\fIURL#value\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢ÁêÂÐURL¤Þ¤¿¤ÏÀäÂÐURL¤Ç¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ºÇ½é¤Îʸ»ú¤È¤·¤Æ¡Ö¤è¤ê¾®¤µ¤¤¡×µ­¹æ(\fI<\fR)¤ò¸¡º÷¤·¤Æ¡¢¤³¤Î·Á¼°¤ò¾¤Î·Á¼°¤È¶èÊ̤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@see <a href="spec\&.html#section">Java Spec</a>\fR¤Ï¼¡¤Î¥ê¥ó¥¯¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fB·Á¼°2\fR¡£\fB@see <a href="URL#value">label</a>\fR·Á¼°¤Ï¡¢\fBURL#value\fR¤ÇÄêµÁ¤µ¤ì¤¿¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£\fBURL#value\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢ÁêÂÐURL¤Þ¤¿¤ÏÀäÂÐURL¤Ç¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ºÇ½é¤Îʸ»ú¤È¤·¤Æ¡Ö¤è¤ê¾®¤µ¤¤¡×µ­¹æ(\fB<\fR)¤ò¸¡º÷¤·¤Æ¡¢¤³¤Î·Á¼°¤ò¾¤Î·Á¼°¤È¶èÊ̤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@see <a href="spec\&.html#section">Java Spec</a>\fR¤Ï¼¡¤Î¥ê¥ó¥¯¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + \fB´ØÏ¢¹àÌÜ\fR: + .sp + Java Spec + .sp +-\fB·Á¼°3\fR¡£\fI@see package\&.class#member label\fR·Á¼°¤Ï¡¢É½¼¨¥Æ¥­¥¹¥È¡¦¥é¥Ù¥ë¤È¤È¤â¤Ë¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥é¥Ù¥ë¤Ï»²¾È¤µ¤ì¤Æ¤¤¤ëJava¸À¸ì¤Î»ØÄꤵ¤ì¤¿Ì¾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»Ø¤·¼¨¤·¤Þ¤¹¡£¥é¥Ù¥ë¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£¥é¥Ù¥ë¤ò¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É½¼¨¥Æ¥­¥¹¥È¤Î¤«¤ï¤ê¤Ë¡¢Ì¾Á°¤¬Å¬ÀÚ¤Ëû½Ì¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£\fI\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤³¤Îɽ¼¨¥Æ¥­¥¹¥È¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬Á´ÂÎŪ¤Ëºï½ü¤µ¤ì¤Þ¤¹¡£¥é¥Ù¥ë¤Ï¡¢¼«Æ°À¸À®¤µ¤ì¤ëɽ¼¨¥Æ¥­¥¹¥È¤È¤Ï°Û¤Ê¤ëɽ¼¨¥Æ¥­¥¹¥È¤Ë¤¹¤ë¾ì¹ç¤Ë»ÈÍѤ·¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-Java SE 1\&.2¤À¤±¤Ï¡¢¥é¥Ù¥ë¤Ç¤Ï¤Ê¤¯Ì¾Á°¤¬\fI<code>\fR +-HTML¥¿¥°Æâ¤Ë¼«Æ°Åª¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£Java SE 1\&.2\&.2¤«¤é¤Ï¡¢¥é¥Ù¥ë¤ò»ÈÍѤ¹¤ë¤«¤·¤Ê¤¤¤«¤Ë¤«¤«¤ï¤é¤º¡¢\fI<code>\fR¥¿¥°¤Ï¾ï¤Ëɽ¼¨¥Æ¥­¥¹¥È¤ò°Ï¤à¤«¤¿¤Á¤Ç´Þ¤Þ¤ì¤Þ¤¹¡£ ++\fB·Á¼°3\fR¡£\fB@see package\&.class#member label\fR·Á¼°¤Ï¡¢É½¼¨¥Æ¥­¥¹¥È¡¦¥é¥Ù¥ë¤È¤È¤â¤Ë¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥é¥Ù¥ë¤Ï»²¾È¤µ¤ì¤Æ¤¤¤ëJava¸À¸ì¤Î»ØÄꤵ¤ì¤¿Ì¾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»Ø¤·¼¨¤·¤Þ¤¹¡£¥é¥Ù¥ë¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£¥é¥Ù¥ë¤ò¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É½¼¨¥Æ¥­¥¹¥È¤Î¤«¤ï¤ê¤Ë¡¢Ì¾Á°¤¬Å¬ÀÚ¤Ëû½Ì¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£\fB\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤³¤Îɽ¼¨¥Æ¥­¥¹¥È¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬Á´ÂÎŪ¤Ëºï½ü¤µ¤ì¤Þ¤¹¡£¥é¥Ù¥ë¤Ï¡¢¼«Æ°À¸À®¤µ¤ì¤ëɽ¼¨¥Æ¥­¥¹¥È¤È¤Ï°Û¤Ê¤ëɽ¼¨¥Æ¥­¥¹¥È¤Ë¤¹¤ë¾ì¹ç¤Ë»ÈÍѤ·¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++Java SE 1\&.2¤À¤±¤Ï¡¢¥é¥Ù¥ë¤Ç¤Ï¤Ê¤¯Ì¾Á°¤¬\fB<code>\fR ++HTML¥¿¥°Æâ¤Ë¼«Æ°Åª¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£Java SE 1\&.2\&.2¤«¤é¤Ï¡¢¥é¥Ù¥ë¤ò»ÈÍѤ¹¤ë¤«¤·¤Ê¤¤¤«¤Ë¤«¤«¤ï¤é¤º¡¢\fB<code>\fR¥¿¥°¤Ï¾ï¤Ëɽ¼¨¥Æ¥­¥¹¥È¤ò°Ï¤à¤«¤¿¤Á¤Ç´Þ¤Þ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1626,10 +1683,10 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackage\&.class#member\fR¤Ë¤Ï¡¢»²¾È¤µ¤ì¤Æ¤¤¤ëǤ°Õ¤ÎÍ­¸ú¤Ê¥×¥í¥°¥é¥àÍ×ÁǤÎ̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤Î̾Á°¤Ç¤¹¡£¤¿¤À¤·¡¢¥á¥ó¥Ð¡¼Ì¾¤ÎÁ°¤Îʸ»ú¤Ï¡¢¥·¥ã¡¼¥×µ­¹æ(\fI#\fR)¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£class¤Ï¡¢Ç¤°Õ¤Î¥È¥Ã¥×¥ì¥Ù¥ë¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤«¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òɽ¤·¤Þ¤¹¡£member¤Ï¡¢Ç¤°Õ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤òɽ¤·¤Þ¤¹(¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î̾Á°¤¬¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î̾Á°¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£³°Éô»²¾È¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£»²¾È¥¯¥é¥¹¤Ë°¤·¤Æ¤¤¤Ê¤¤Ì¾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢Â¾¤Î2¤Ä¤Î\fI@see\fR¥¿¥°·Á¼°¤Î¤É¤Á¤é¤«¤ò»ÈÍѤ·¤Þ¤¹¡£¡Ö̾Á°¤Î»ØÄê¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBpackage\&.class#member\fR¤Ë¤Ï¡¢»²¾È¤µ¤ì¤Æ¤¤¤ëǤ°Õ¤ÎÍ­¸ú¤Ê¥×¥í¥°¥é¥àÍ×ÁǤÎ̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤Î̾Á°¤Ç¤¹¡£¤¿¤À¤·¡¢¥á¥ó¥Ð¡¼Ì¾¤ÎÁ°¤Îʸ»ú¤Ï¡¢¥·¥ã¡¼¥×µ­¹æ(\fB#\fR)¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£class¤Ï¡¢Ç¤°Õ¤Î¥È¥Ã¥×¥ì¥Ù¥ë¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤«¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òɽ¤·¤Þ¤¹¡£member¤Ï¡¢Ç¤°Õ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤òɽ¤·¤Þ¤¹(¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î̾Á°¤¬¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î̾Á°¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£³°Éô»²¾È¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£»²¾È¥¯¥é¥¹¤Ë°¤·¤Æ¤¤¤Ê¤¤Ì¾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢Â¾¤Î2¤Ä¤Î\fB@see\fR¥¿¥°·Á¼°¤Î¤É¤Á¤é¤«¤ò»ÈÍѤ·¤Þ¤¹¡£¡Ö̾Á°¤Î»ØÄê¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fBÃí°Õ:\fR +-³°Éô»²¾È¥¯¥é¥¹¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤Ê¤¤¥¯¥é¥¹¤Ç¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥ÈÆâ¤Ç³°Éô»²¾È¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤·¤Æ¤¤¤ë²Õ½ê¤Ï¡¢³°Éô»²¾È¤Þ¤¿¤Ï³°Éô¥ê¥ó¥¯¤È¸Æ¤Ð¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjava\&.awt package\fR¤ËÂФ·¤Æ¤Î¤ß\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢\fIObject\fR¤Ê¤É¤Î\fIjava\&.lang\fRÆâ¤Î¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤¬³°Éô»²¾È¥¯¥é¥¹¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\-link\fR¤ª¤è¤Ó\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢³°Éô»²¾È¥¯¥é¥¹¤Ø¥ê¥ó¥¯¤·¤Þ¤¹¡£³°Éô»²¾È¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥³¥á¥ó¥È¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ë¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++³°Éô»²¾È¥¯¥é¥¹¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤Ê¤¤¥¯¥é¥¹¤Ç¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥ÈÆâ¤Ç³°Éô»²¾È¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤·¤Æ¤¤¤ë²Õ½ê¤Ï¡¢³°Éô»²¾È¤Þ¤¿¤Ï³°Éô¥ê¥ó¥¯¤È¸Æ¤Ð¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjava\&.awt package\fR¤ËÂФ·¤Æ¤Î¤ß\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢\fBObject\fR¤Ê¤É¤Î\fBjava\&.lang\fRÆâ¤Î¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤¬³°Éô»²¾È¥¯¥é¥¹¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\-link\fR¤ª¤è¤Ó\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢³°Éô»²¾È¥¯¥é¥¹¤Ø¥ê¥ó¥¯¤·¤Þ¤¹¡£³°Éô»²¾È¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥³¥á¥ó¥È¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ë¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -1640,7 +1697,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIlabel\fR¤Ï¡¢¾Êά²Äǽ¤Ê¥Æ¥­¥¹¥È¤Ç¡¢¥ê¥ó¥¯¤Î¥é¥Ù¥ë¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£¥é¥Ù¥ë¤Ë¤Ï¶õÇò¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIlabel\fR¤ò¾Êά¤¹¤ë¤È¡¢\fIpackage\&.class\&.member\fR¤¬¡¢¸½ºß¤Î¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤Ë±þ¤¸¤ÆŬÀÚ¤Ëû½Ì¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBlabel\fR¤Ï¡¢¾Êά²Äǽ¤Ê¥Æ¥­¥¹¥È¤Ç¡¢¥ê¥ó¥¯¤Î¥é¥Ù¥ë¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£¥é¥Ù¥ë¤Ë¤Ï¶õÇò¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBlabel\fR¤ò¾Êά¤¹¤ë¤È¡¢\fBpackage\&.class\&.member\fR¤¬¡¢¸½ºß¤Î¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤Ë±þ¤¸¤ÆŬÀÚ¤Ëû½Ì¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -1651,18 +1708,19 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¶õÇòʸ»ú¤¬¡¢\fIpackage\&.class#member\fR¤È\fIlabel\fR¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤Ë¤Ê¤ê¤Þ¤¹¡£¥«¥Ã¥³¤ÎÆ⦤ζõÇòʸ»ú¤Ï¥é¥Ù¥ë¤ÎÀèƬ¤È¤Ï²ò¼á¤µ¤ì¤Ê¤¤¤¿¤á¡¢¥á¥½¥Ã¥É¤Î¥Ñ¥é¥á¡¼¥¿´Ö¤Ë¶õÇòʸ»ú¤òÆþ¤ì¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ +-.RE +-.sp +-¤³¤ÎÎã¤Ç¤Ï¡¢\fI@see\fR¥¿¥°(\fICharacter\fR¥¯¥é¥¹Æâ)¤¬¡¢\fIString\fR¥¯¥é¥¹¤Îequals¥á¥½¥Ã¥É¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹¡£¥¿¥°¤Ë¤Ï¡¢Ì¾Á°\fIString#equals(Object)\fR¤È¥é¥Ù¥ë\fIequals\fR¤ÎξÊý¤Î°ú¿ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¶õÇòʸ»ú¤¬¡¢\fBpackage\&.class#member\fR¤È\fBlabel\fR¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤Ë¤Ê¤ê¤Þ¤¹¡£¥«¥Ã¥³¤ÎÆ⦤ζõÇòʸ»ú¤Ï¥é¥Ù¥ë¤ÎÀèƬ¤È¤Ï²ò¼á¤µ¤ì¤Ê¤¤¤¿¤á¡¢¥á¥½¥Ã¥É¤Î¥Ñ¥é¥á¡¼¥¿´Ö¤Ë¶õÇòʸ»ú¤òÆþ¤ì¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ ++.RE ++.sp ++¤³¤ÎÎã¤Ç¤Ï¡¢\fB@see\fR¥¿¥°(\fBCharacter\fR¥¯¥é¥¹Æâ)¤¬¡¢\fBString\fR¥¯¥é¥¹¤Îequals¥á¥½¥Ã¥É¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹¡£¥¿¥°¤Ë¤Ï¡¢Ì¾Á°\fBString#equals(Object)\fR¤È¥é¥Ù¥ë\fBequals\fR¤ÎξÊý¤Î°ú¿ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * @see String#equals(Object) equals +- */ ++\fB/**\fR ++\fB * @see String#equals(Object) equals\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE +@@ -1673,10 +1731,11 @@ + .RS 4 + .\} + .nf +-<dl> +-<dt><b>See Also:</b> +-<dd><a href="\&.\&./\&.\&./java/lang/String#equals(java\&.lang\&.Object)"><code>equals<code></a> +-</dl> ++\fB<dl>\fR ++\fB<dt><b>See Also:</b>\fR ++\fB<dd><a href="\&.\&./\&.\&./java/lang/String#equals(java\&.lang\&.Object)"><code>equals<code></a>\fR ++\fB</dl>\fR ++ + .fi + .if n \{\ + .RE +@@ -1687,39 +1746,42 @@ + .sp + equals + .RE +-̾Á°¤Î»ØÄê.PP +-¤³¤Î\fIpackage\&.class#member\fR¤È¤¤¤¦Ì¾Á°¤Ï¡¢\fIjava\&.lang\&.String#toUpperCase()\fR¤Î¤è¤¦¤Ê´°Á´½¤¾þ̾¤Ë¤¹¤ë¤³¤È¤â¡¢\fIString#toUpperCase()\fR¤ä\fI#toUpperCase()\fR¤Î¤è¤¦¤ÊÈó´°Á´½¤¾þ̾¤Ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Ì¾Á°¤¬´°Á´½¤¾þ¤è¤êû¤¤¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¸½à¤ÎJava¥³¥ó¥Ñ¥¤¥é¤Î¸¡º÷½ç½ø¤ò»ÈÍѤ·¤Æõ¤·¤Þ¤¹¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£Ì¾Á°¤Ï¡¢¥á¥½¥Ã¥É°ú¿ô¤Î´Ö¤Ê¤É¡¢¥«¥Ã¥³Æâ¤Î¥¹¥Ú¡¼¥¹¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ÉôʬŪ¤Ë½¤¾þ¤·¤¿Ã»¤¤Ì¾Á°¤ò»ØÄꤹ¤ë¤³¤È¤ÎÍøÅÀ¤Ï¡¢ÆþÎϤ¹¤ëʸ»ú¿ô¤¬¸º¤ë¤³¤È¤ä¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤¬Æɤߤ䤹¤¯¤Ê¤ë¤³¤È¤Ç¤¹¡£¼¡¤Î¥ê¥¹¥È¤ËÍÍ¡¹¤Ê·Á¼°¤Î̾Á°¤ò¼¨¤·¤Þ¤¹¡£¤³¤³¤Ç¡¢\fIClass\fR¤Ë¤Ï¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¡¢Type¤Ë¤Ï¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢ÇÛÎ󡢤ޤ¿¤Ï¥×¥ê¥ß¥Æ¥£¥Ö¤ò¡¢method¤Ë¤Ï¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ò¡¢¤½¤ì¤¾¤ì»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.PP ++̾Á°¤Î»ØÄê ++.PP ++¤³¤Î\fBpackage\&.class#member\fR¤È¤¤¤¦Ì¾Á°¤Ï¡¢\fBjava\&.lang\&.String#toUpperCase()\fR¤Î¤è¤¦¤Ê´°Á´½¤¾þ̾¤Ë¤¹¤ë¤³¤È¤â¡¢\fBString#toUpperCase()\fR¤ä\fB#toUpperCase()\fR¤Î¤è¤¦¤ÊÈó´°Á´½¤¾þ̾¤Ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Ì¾Á°¤¬´°Á´½¤¾þ¤è¤êû¤¤¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¸½à¤ÎJava¥³¥ó¥Ñ¥¤¥é¤Î¸¡º÷½ç½ø¤ò»ÈÍѤ·¤Æõ¤·¤Þ¤¹¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£Ì¾Á°¤Ï¡¢¥á¥½¥Ã¥É°ú¿ô¤Î´Ö¤Ê¤É¡¢¥«¥Ã¥³Æâ¤Î¥¹¥Ú¡¼¥¹¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ÉôʬŪ¤Ë½¤¾þ¤·¤¿Ã»¤¤Ì¾Á°¤ò»ØÄꤹ¤ë¤³¤È¤ÎÍøÅÀ¤Ï¡¢ÆþÎϤ¹¤ëʸ»ú¿ô¤¬¸º¤ë¤³¤È¤ä¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤¬Æɤߤ䤹¤¯¤Ê¤ë¤³¤È¤Ç¤¹¡£¼¡¤Î¥ê¥¹¥È¤ËÍÍ¡¹¤Ê·Á¼°¤Î̾Á°¤ò¼¨¤·¤Þ¤¹¡£¤³¤³¤Ç¡¢\fBClass\fR¤Ë¤Ï¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¡¢Type¤Ë¤Ï¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢ÇÛÎ󡢤ޤ¿¤Ï¥×¥ê¥ß¥Æ¥£¥Ö¤ò¡¢method¤Ë¤Ï¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ò¡¢¤½¤ì¤¾¤ì»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fBTypical forms for\fR\fB @see package\&.class#member\fR +-\fBReferencing a member of the current class\fR +-@see #field +-@see #method(Type, Type,\&.\&.\&.) +-@see #method(Type argname, Type argname,\&.\&.\&.) +-@see #constructor(Type, Type,\&.\&.\&.) +-@see #constructor(Type argname, Type argname,\&.\&.\&.) +- +-\fBReferencing another class in the current or imported packages\fR +-@see Class#field +-@see Class#method(Type, Type,\&.\&.\&.) +-@see Class#method(Type argname, Type argname,\&.\&.\&.) +-@see Class#constructor(Type, Type,\&.\&.\&.) +-@see Class#constructor(Type argname, Type argname,\&.\&.\&.) +-@see Class\&.NestedClass +-@see Class +- +-\fBReferencing an element in another package (fully qualified)\fR +-@see package\&.Class#field +-@see package\&.Class#method(Type, Type,\&.\&.\&.) +-@see package\&.Class#method(Type argname, Type argname,\&.\&.\&.) +-@see package\&.Class#constructor(Type, Type,\&.\&.\&.) +-@see package\&.Class#constructor(Type argname, Type argname,\&.\&.\&.) +-@see package\&.Class\&.NestedClass +-@see package\&.Class +-@see package ++\fB\fBTypical forms for\fR\fR\fB\fB @see package\&.class#member\fR\fR\fB \fR ++\fB\fBReferencing a member of the current class\fR\fR ++\fB@see #field\fR ++\fB@see #method(Type, Type,\&.\&.\&.)\fR ++\fB@see #method(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see #constructor(Type, Type,\&.\&.\&.)\fR ++\fB@see #constructor(Type argname, Type argname,\&.\&.\&.) \fR ++ ++\fB\fBReferencing another class in the current or imported packages\fR\fR ++\fB@see Class#field\fR ++\fB@see Class#method(Type, Type,\&.\&.\&.)\fR ++\fB@see Class#method(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see Class#constructor(Type, Type,\&.\&.\&.)\fR ++\fB@see Class#constructor(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see Class\&.NestedClass\fR ++\fB@see Class \fR ++ ++\fB\fBReferencing an element in another package (fully qualified)\fR\fR ++\fB@see package\&.Class#field\fR ++\fB@see package\&.Class#method(Type, Type,\&.\&.\&.)\fR ++\fB@see package\&.Class#method(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see package\&.Class#constructor(Type, Type,\&.\&.\&.)\fR ++\fB@see package\&.Class#constructor(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see package\&.Class\&.NestedClass\fR ++\fB@see package\&.Class\fR ++\fB@see package\fR ++ + .fi + .if n \{\ + .RE +@@ -1735,7 +1797,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-ºÇ½é¤Î¥¿¥¤¥×¤Î·Á¼°(¥Ñ¥Ã¥±¡¼¥¸¤È¥¯¥é¥¹¤ò¾Êά)¤Î¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¯¥é¥¹¤Î³¬ÁؤΤߤò¸¡º÷¤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¸½ºß¤Î¥¯¥é¥¹¤«¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤½¤Î¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤«¥¹¡¼¥Ñ¡¼¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤Þ¤¿¤Ï¤½¤Î³°Â¦¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤«¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é¥á¥ó¥Ð¡¼¤ò¸¡º÷¤·¤Þ¤¹(¸¡º÷¹àÌÜ1\(en3)¡£¸½ºß¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¾¤ÎÉôʬ¤ä¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¸¡º÷¤·¤Þ¤»¤ó(¸¡º÷¹àÌÜ4\(en5)¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ºÇ½é¤Î¥¿¥¤¥×¤Î·Á¼°(¥Ñ¥Ã¥±¡¼¥¸¤È¥¯¥é¥¹¤ò¾Êά)¤Î¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¯¥é¥¹¤Î³¬ÁؤΤߤò¸¡º÷¤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¸½ºß¤Î¥¯¥é¥¹¤«¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤½¤Î¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤«¥¹¡¼¥Ñ¡¼¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤Þ¤¿¤Ï¤½¤Î³°Â¦¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤«¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é¥á¥ó¥Ð¡¼¤ò¸¡º÷¤·¤Þ¤¹(¸¡º÷¹àÌÜ1\(en3)¡£¸½ºß¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¾¤ÎÉôʬ¤ä¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¸¡º÷¤·¤Þ¤»¤ó(¸¡º÷¹àÌÜ4\(en5)¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -1746,7 +1808,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÆþÎÏ»þ¤Ë¡¢\fIgetValue\fR¤Î¤è¤¦¤Ë¥«¥Ã¥³¤Ê¤·¤Î̾Á°¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢Æ±¤¸Ì¾Á°¤Î¥Õ¥£¡¼¥ë¥É¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤¬¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡º÷¤ÇºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¥á¥½¥Ã¥É¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£·ë²Ì¤ÏÁ°¤â¤Ã¤ÆÆÃÄê¤Ç¤­¤Þ¤»¤ó¡£ ++¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÆþÎÏ»þ¤Ë¡¢\fBgetValue\fR¤Î¤è¤¦¤Ë¥«¥Ã¥³¤Ê¤·¤Î̾Á°¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢Æ±¤¸Ì¾Á°¤Î¥Õ¥£¡¼¥ë¥É¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤¬¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡º÷¤ÇºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¥á¥½¥Ã¥É¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£·ë²Ì¤ÏÁ°¤â¤Ã¤ÆÆÃÄê¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -1757,7 +1819,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢¤¹¤Ù¤Æ¤Î·Á¼°¤Ë¤Ä¤¤¤Æ¡¢\fIouter\&.inner\fR¤È¤·¤Æ»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Ã±½ã¤Ë\fIinner\fR¤È¤Ï¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢¤¹¤Ù¤Æ¤Î·Á¼°¤Ë¤Ä¤¤¤Æ¡¢\fBouter\&.inner\fR¤È¤·¤Æ»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Ã±½ã¤Ë\fBinner\fR¤È¤Ï¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -1768,12 +1830,14 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¤¹¤Ç¤Ë½Ò¤Ù¤¿¤è¤¦¤Ë¡¢¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤È¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ¤Ï¡¢¥É¥Ã¥È(\fI\&.\fR)¤Ç¤Ï¤Ê¤¯¥·¥ã¡¼¥×µ­¹æ(\fI#\fR)¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ë»ØÄꤹ¤ë¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¢¤¤¤Þ¤¤¤µ¤ò²ò·è¤Ç¤­¤Þ¤¹¡£¥É¥Ã¥È¤Ï¡¢¥¯¥é¥¹¡¢¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¶èÀڤ뤿¤á¤Ë¤â»ÈÍѤµ¤ì¤ë¤«¤é¤Ç¤¹¡£¤¿¤À¤·¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤¢¤¤¤Þ¤¤¤µ¤¬¤Ê¤±¤ì¤Ð¥É¥Ã¥È¤ÏÀµ¤·¤¯²òÀϤµ¤ì¤Þ¤¹¤¬¡¢·Ù¹ð¤Ïɽ¼¨¤µ¤ì¤Þ¤¹¡£ +-.RE +-@see¥¿¥°¤Î¸¡º÷½ç½ø.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Õ¥¡¥¤¥ë¡¢³µÍ×¥Õ¥¡¥¤¥ë¤Ëɽ¼¨¤µ¤ì¤ë\fI@see\fR¥¿¥°¤ò½èÍý¤·¤Þ¤¹¡£¸å¼Ô¤Î2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢´°Á´½¤¾þ¤Î̾Á°¤ò\fI@see\fR¥¿¥°¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢´°Á´½¤¾þ¤Î̾Á°¡¢¤Þ¤¿¤ÏÉôʬ½¤¾þ¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.PP +-¼¡¤Ë¡¢\fI@see\fR¥¿¥°¤Î¸¡º÷½ç½ø¤ò¼¨¤·¤Þ¤¹¡£ ++¤¹¤Ç¤Ë½Ò¤Ù¤¿¤è¤¦¤Ë¡¢¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤È¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ¤Ï¡¢¥É¥Ã¥È(\fB\&.\fR)¤Ç¤Ï¤Ê¤¯¥·¥ã¡¼¥×µ­¹æ(\fB#\fR)¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ë»ØÄꤹ¤ë¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¢¤¤¤Þ¤¤¤µ¤ò²ò·è¤Ç¤­¤Þ¤¹¡£¥É¥Ã¥È¤Ï¡¢¥¯¥é¥¹¡¢¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¶èÀڤ뤿¤á¤Ë¤â»ÈÍѤµ¤ì¤ë¤«¤é¤Ç¤¹¡£¤¿¤À¤·¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤¢¤¤¤Þ¤¤¤µ¤¬¤Ê¤±¤ì¤Ð¥É¥Ã¥È¤ÏÀµ¤·¤¯²òÀϤµ¤ì¤Þ¤¹¤¬¡¢·Ù¹ð¤Ïɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++.RE ++.PP ++@see¥¿¥°¤Î¸¡º÷½ç½ø ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Õ¥¡¥¤¥ë¡¢³µÍ×¥Õ¥¡¥¤¥ë¤Ëɽ¼¨¤µ¤ì¤ë\fB@see\fR¥¿¥°¤ò½èÍý¤·¤Þ¤¹¡£¸å¼Ô¤Î2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢´°Á´½¤¾þ¤Î̾Á°¤ò\fB@see\fR¥¿¥°¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢´°Á´½¤¾þ¤Î̾Á°¡¢¤Þ¤¿¤ÏÉôʬ½¤¾þ¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.PP ++¼¡¤Ë¡¢\fB@see\fR¥¿¥°¤Î¸¡º÷½ç½ø¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1827,12 +1891,12 @@ + .sp -1 + .IP " 5." 4.2 + .\} +-¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹(\fIimport\fRʸ¤Î½ç½ø¤Ë½¾¤Ã¤Æ¸¡º÷)¡£ +-.RE +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢³Æ¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¹àÌÜ1\-3¤òºÆµ¢Åª¤ËŬÍѤ·¤Ê¤¬¤é¡¢°ìÃפ¹¤ë̾Á°¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¸¡º÷¤ò³¤±¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¤Þ¤º¸½ºß¤Î¥¯¥é¥¹¤ò¸¡º÷¤·¡¢¼¡¤Ë¤½¤Î³°Â¦¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹E¤ò¸¡º÷¤·¤¿¸å¡¢E¤Î¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤ò¸¡º÷¤·¤Æ¤«¤é¡¢E¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤ò¸¡º÷¤·¤Þ¤¹¡£¹àÌÜ4¤È5¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¸¡º÷¤¹¤ë½ç½ø¤Ï·è¤Þ¤Ã¤Æ¤¤¤Þ¤»¤ó(¤½¤Î½ç½ø¤Ï¡¢¸Ä¡¹¤Î¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹)¡£¹àÌÜ5¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjava\&.lang\fR¤ò¸¡º÷¤·¤Þ¤¹¡£¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥°¥é¥à¤Ë¼«Æ°Åª¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´°Á´½¤¾þ¤Ç¤Ê¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç\fI@see\fR¥¿¥°¤ò¸«¤Ä¤±¤ë¤È¡¢Java¥³¥ó¥Ñ¥¤¥é¤ÈƱ¤¸½ç½ø¤Ç»ØÄꤵ¤ì¤¿Ì¾Á°¤ò¸¡º÷¤·¤Þ¤¹(¤¿¤À¤·¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ÆÃÄê¤Î̾Á°¶õ´Ö¤Î¤¢¤¤¤Þ¤¤¤µ¤ò¸¡½Ð¤·¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤³¤ì¤é¤Î¥¨¥é¡¼¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤ë¤¿¤á¤Ç¤¹)¡£¤³¤Î¸¡º÷½ç½ø¤Ï¡¢Java¸À¸ì»ÅÍͤÇÀµ¼°¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´ØÏ¢¤¹¤ë¥¯¥é¥¹¤È¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤¿¥¯¥é¥¹¤È¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤«¤é¤½¤Î̾Á°¤ò¸¡º÷¤·¤Þ¤¹¡£¶ñÂÎŪ¤Ë¤Ï¡¢¼¡¤Î½ç½ø¤Ç¸¡º÷¤·¤Þ¤¹¡£ ++¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹(\fBimport\fRʸ¤Î½ç½ø¤Ë½¾¤Ã¤Æ¸¡º÷)¡£ ++.RE ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢³Æ¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¹àÌÜ1\-3¤òºÆµ¢Åª¤ËŬÍѤ·¤Ê¤¬¤é¡¢°ìÃפ¹¤ë̾Á°¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¸¡º÷¤ò³¤±¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¤Þ¤º¸½ºß¤Î¥¯¥é¥¹¤ò¸¡º÷¤·¡¢¼¡¤Ë¤½¤Î³°Â¦¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹E¤ò¸¡º÷¤·¤¿¸å¡¢E¤Î¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤ò¸¡º÷¤·¤Æ¤«¤é¡¢E¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤ò¸¡º÷¤·¤Þ¤¹¡£¹àÌÜ4¤È5¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¸¡º÷¤¹¤ë½ç½ø¤Ï·è¤Þ¤Ã¤Æ¤¤¤Þ¤»¤ó(¤½¤Î½ç½ø¤Ï¡¢¸Ä¡¹¤Î¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹)¡£¹àÌÜ5¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjava\&.lang\fR¤ò¸¡º÷¤·¤Þ¤¹¡£¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥°¥é¥à¤Ë¼«Æ°Åª¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´°Á´½¤¾þ¤Ç¤Ê¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç\fB@see\fR¥¿¥°¤ò¸«¤Ä¤±¤ë¤È¡¢Java¥³¥ó¥Ñ¥¤¥é¤ÈƱ¤¸½ç½ø¤Ç»ØÄꤵ¤ì¤¿Ì¾Á°¤ò¸¡º÷¤·¤Þ¤¹(¤¿¤À¤·¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ÆÃÄê¤Î̾Á°¶õ´Ö¤Î¤¢¤¤¤Þ¤¤¤µ¤ò¸¡½Ð¤·¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤³¤ì¤é¤Î¥¨¥é¡¼¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤ë¤¿¤á¤Ç¤¹)¡£¤³¤Î¸¡º÷½ç½ø¤Ï¡¢Java¸À¸ì»ÅÍͤÇÀµ¼°¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´ØÏ¢¤¹¤ë¥¯¥é¥¹¤È¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤¿¥¯¥é¥¹¤È¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤«¤é¤½¤Î̾Á°¤ò¸¡º÷¤·¤Þ¤¹¡£¶ñÂÎŪ¤Ë¤Ï¡¢¼¡¤Î½ç½ø¤Ç¸¡º÷¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1886,70 +1950,75 @@ + .sp -1 + .IP " 5." 4.2 + .\} +-¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹(\fIimport\fRʸ¤Î½ç½ø¤Ë½¾¤Ã¤Æ¸¡º÷)¡£ +-.RE +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¬¤º¤·¤â¥µ¥Ö¥¯¥é¥¹¤ò¸¡º÷¤¹¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£¤Þ¤¿¡¢¼Â¹ÔÃæ¤Ë¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¤ë¾ì¹ç¤Ç¤â¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤·¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fI@see\fR¥¿¥°¤¬\fIjava\&.awt\&.event\&.KeyEvent\fR¥¯¥é¥¹Æâ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Æ¡¢\fIjava\&.awt package\fRÆâ¤Î¤¢¤ë̾Á°¤ò»²¾È¤·¤Æ¤¤¤Æ¤â¡¢¤½¤Î¥¯¥é¥¹¤¬¥¤¥ó¥Ý¡¼¥È¤·¤Ê¤¤¤«¤®¤ê\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤·¤Þ¤»¤ó¡£ +-̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡.PP +-\fIlabel\fR¤ò¾Êά¤¹¤ë¤È¡¢\fIpackage\&.class\&.member\fR¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£°ìÈ̤ˡ¢¤³¤ì¤Ï¸½ºß¤Î¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤Ë±þ¤¸¤ÆŬÀÚ¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£Ã»½Ì¤µ¤ì¤ë¤È¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤êɬÍ׺Ǿ®¸Â¤Î̾Á°¤Î¤ß¤¬É½¼¨¤µ¤ì¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIString\&.toUpperCase()\fR¥á¥½¥Ã¥É¤Ë¡¢Æ±¤¸¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤Ø¤Î»²¾È¤È¾¤Î¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹Ì¾¤¬É½¼¨¤µ¤ì¤ë¤Î¤Ï¸å¼Ô¤Î¥±¡¼¥¹¤Î¤ß¤Ç¤¹(¼¡¤Î¥ê¥¹¥È¤ò»²¾È)¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÁ´ÂÎŪ¤Ëºï½ü¤¹¤ë¤Ë¤Ï¡¢\fI\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.RS 4 +-\fB»²¾È¤Î¥¿¥¤¥×\fR: \fI@see\fR¥¿¥°¤ÏƱ¤¸¥¯¥é¥¹¡¢Æ±¤¸¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ +-.RE +-.RS 4 +-\fBÎã\fR: \fI@see String#toLowerCase()\fR +-.RE +-.RS 4 +-\fBɽ¼¨\fR: \fItoLowerCase()\fR \- ¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹Ì¾¤ò¾Êά¤·¤Þ¤¹ +-.RE +-.RS 4 +-.RE +-.RS 4 +-\fB»²¾È¤Î¥¿¥¤¥×\fR: \fI@see\fR¥¿¥°¤ÏÊ̤Υ¯¥é¥¹¡¢Æ±¤¸¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ +-.RE +-.RS 4 +-\fBÎã\fR: \fI@see Character#toLowerCase(char)\fR +-.RE +-.RS 4 +-\fBɽ¼¨\fR: \fICharacter\&.toLowerCase(char)\fR \- ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¾Êά¤·¡¢¥¯¥é¥¹Ì¾¤ò´Þ¤ß¤Þ¤¹ +-.RE +-.RS 4 +-.RE +-.RS 4 +-\fB»²¾È¤Î¥¿¥¤¥×\fR: \fI@see\fR¥¿¥°¤Ï°Û¤Ê¤ë¥¯¥é¥¹¡¢°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ +-.RE +-.RS 4 +-\fBÎã\fR: \fI@see java\&.io\&.File#exists()\fR +-.RE +-.RS 4 +-\fBɽ¼¨\fR: \fIjava\&.io\&.File\&.exists()\fR \- ¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹Ì¾¤ò´Þ¤ß¤Þ¤¹ +-.RE +-.RS 4 +-.RE +-@see¥¿¥°¤ÎÎã.PP +-±¦Â¦¤Î¥³¥á¥ó¥È¤Ï¡¢\fI@see\fR¥¿¥°¤¬\fIjava\&.applet\&.Applet\fR¤Ê¤É¤ÎÊ̤Υѥ屡¼¥¸¤Î¥¯¥é¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ë¡¢Ì¾Á°¤¬¤É¤Î¤è¤¦¤Ëɽ¼¨¤µ¤ì¤ë¤«¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@see¤Ë´Ø¤¹¤ë¹à ++¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹(\fBimport\fRʸ¤Î½ç½ø¤Ë½¾¤Ã¤Æ¸¡º÷)¡£ ++.RE ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¬¤º¤·¤â¥µ¥Ö¥¯¥é¥¹¤ò¸¡º÷¤¹¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£¤Þ¤¿¡¢¼Â¹ÔÃæ¤Ë¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¤ë¾ì¹ç¤Ç¤â¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤·¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fB@see\fR¥¿¥°¤¬\fBjava\&.awt\&.event\&.KeyEvent\fR¥¯¥é¥¹Æâ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Æ¡¢\fBjava\&.awt package\fRÆâ¤Î¤¢¤ë̾Á°¤ò»²¾È¤·¤Æ¤¤¤Æ¤â¡¢¤½¤Î¥¯¥é¥¹¤¬¥¤¥ó¥Ý¡¼¥È¤·¤Ê¤¤¤«¤®¤ê\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤·¤Þ¤»¤ó¡£ ++.PP ++̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡ ++.PP ++\fBlabel\fR¤ò¾Êά¤¹¤ë¤È¡¢\fBpackage\&.class\&.member\fR¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£°ìÈ̤ˡ¢¤³¤ì¤Ï¸½ºß¤Î¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤Ë±þ¤¸¤ÆŬÀÚ¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£Ã»½Ì¤µ¤ì¤ë¤È¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤êɬÍ׺Ǿ®¸Â¤Î̾Á°¤Î¤ß¤¬É½¼¨¤µ¤ì¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBString\&.toUpperCase()\fR¥á¥½¥Ã¥É¤Ë¡¢Æ±¤¸¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤Ø¤Î»²¾È¤È¾¤Î¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹Ì¾¤¬É½¼¨¤µ¤ì¤ë¤Î¤Ï¸å¼Ô¤Î¥±¡¼¥¹¤Î¤ß¤Ç¤¹(¼¡¤Î¥ê¥¹¥È¤ò»²¾È)¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÁ´ÂÎŪ¤Ëºï½ü¤¹¤ë¤Ë¤Ï¡¢\fB\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.RS 4 ++\fB»²¾È¤Î¥¿¥¤¥×\fR: \fB@see\fR¥¿¥°¤ÏƱ¤¸¥¯¥é¥¹¡¢Æ±¤¸¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ ++.RE ++.RS 4 ++\fBÎã\fR: \fB@see String#toLowerCase()\fR ++.RE ++.RS 4 ++\fBɽ¼¨\fR: \fBtoLowerCase()\fR \- ¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹Ì¾¤ò¾Êά¤·¤Þ¤¹ ++.RE ++.RS 4 ++.RE ++.RS 4 ++\fB»²¾È¤Î¥¿¥¤¥×\fR: \fB@see\fR¥¿¥°¤ÏÊ̤Υ¯¥é¥¹¡¢Æ±¤¸¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ ++.RE ++.RS 4 ++\fBÎã\fR: \fB@see Character#toLowerCase(char)\fR ++.RE ++.RS 4 ++\fBɽ¼¨\fR: \fBCharacter\&.toLowerCase(char)\fR \- ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¾Êά¤·¡¢¥¯¥é¥¹Ì¾¤ò´Þ¤ß¤Þ¤¹ ++.RE ++.RS 4 ++.RE ++.RS 4 ++\fB»²¾È¤Î¥¿¥¤¥×\fR: \fB@see\fR¥¿¥°¤Ï°Û¤Ê¤ë¥¯¥é¥¹¡¢°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ ++.RE ++.RS 4 ++\fBÎã\fR: \fB@see java\&.io\&.File#exists()\fR ++.RE ++.RS 4 ++\fBɽ¼¨\fR: \fBjava\&.io\&.File\&.exists()\fR \- ¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹Ì¾¤ò´Þ¤ß¤Þ¤¹ ++.RE ++.RS 4 ++.RE ++.PP ++@see¥¿¥°¤ÎÎã ++.PP ++±¦Â¦¤Î¥³¥á¥ó¥È¤Ï¡¢\fB@see\fR¥¿¥°¤¬\fBjava\&.applet\&.Applet\fR¤Ê¤É¤ÎÊ̤Υѥ屡¼¥¸¤Î¥¯¥é¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ë¡¢Ì¾Á°¤¬¤É¤Î¤è¤¦¤Ëɽ¼¨¤µ¤ì¤ë¤«¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@see¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@see)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- See also: +-@see java\&.lang\&.String // String +-@see java\&.lang\&.String The String class // The String class +-@see String // String +-@see String#equals(Object) // String\&.equals(Object) +-@see String#equals // String\&.equals(java\&.lang\&.Object) +-@see java\&.lang\&.Object#wait(long) // java\&.lang\&.Object\&.wait(long) +-@see Character#MAX_RADIX // Character\&.MAX_RADIX +-@see <a href="spec\&.html">Java Spec</a> // Java Spec +-@see "The Java Programming Language" // "The Java Programming Language" ++\fB See also:\fR ++\fB@see java\&.lang\&.String // String \fR ++\fB@see java\&.lang\&.String The String class // The String class \fR ++\fB@see String // String \fR ++\fB@see String#equals(Object) // String\&.equals(Object) \fR ++\fB@see String#equals // String\&.equals(java\&.lang\&.Object) \fR ++\fB@see java\&.lang\&.Object#wait(long) // java\&.lang\&.Object\&.wait(long) \fR ++\fB@see Character#MAX_RADIX // Character\&.MAX_RADIX \fR ++\fB@see <a href="spec\&.html">Java Spec</a> // Java Spec \fR ++\fB@see "The Java Programming Language" // "The Java Programming Language" \fR ++ + .fi + .if n \{\ + .RE + .\} + .PP + \fBÃí°Õ:\fR +-\fI@se\fR\fIe\fR¥¿¥°¤ò³ÈÄ¥¤·¤Æ¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤¹¤ë¤Ë¤Ï¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fB@se\fR\fBe\fR¥¿¥°¤ò³ÈÄ¥¤·¤Æ¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤¹¤ë¤Ë¤Ï¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .PP + @serial \fIfield\-description\fR | include | exclude + .RS 4 +@@ -1961,11 +2030,11 @@ + Oracle¤ÎľÎ󲽤µ¤ì¤¿·Á¼°¤Î»ÅÍͤ˥¯¥é¥¹¤ò´Þ¤á¤ë´ð½à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/serialized\-criteria\-137781\&.html)¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fIfield\-description\fR(¾Êά²Äǽ)¤Ç¤Ï¡¢¥Õ¥£¡¼¥ë¥É¤Î°ÕÌ£¤òÀâÌÀ¤·¡¢¼è¤êÆÀ¤ëÃͤΥꥹ¥È¤ò¼¨¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£É¬Íפʾì¹ç¤Ï¡¢Ê£¿ô¤Î¹Ô¤ËÅϤäÆÀâÌÀ¤òµ­½Ò¤Ç¤­¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¤³¤Î¾ðÊó¤ò¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤ËÄɲä·¤Þ¤¹¡£Áê¸ß»²¾È¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBfield\-description\fR(¾Êά²Äǽ)¤Ç¤Ï¡¢¥Õ¥£¡¼¥ë¥É¤Î°ÕÌ£¤òÀâÌÀ¤·¡¢¼è¤êÆÀ¤ëÃͤΥꥹ¥È¤ò¼¨¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£É¬Íפʾì¹ç¤Ï¡¢Ê£¿ô¤Î¹Ô¤ËÅϤäÆÀâÌÀ¤òµ­½Ò¤Ç¤­¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¤³¤Î¾ðÊó¤ò¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤ËÄɲä·¤Þ¤¹¡£Áê¸ß»²¾È¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¥¯¥é¥¹¤òľÎ󲽤·¤¿¸å¤ËľÎó²½²Äǽ¥Õ¥£¡¼¥ë¥É¤ò¥¯¥é¥¹¤ËÄɲä·¤¿¾ì¹ç¡¢¼çÀâÌÀ¤Ë¡¢Äɲä·¤¿¥Ð¡¼¥¸¥ç¥ó¤ò¼±Ê̤¹¤ëʸ¤òÄɲ乤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fIinclude\fR¤ª¤è¤Ó\fIexclude\fR°ú¿ô¤Ï¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤Ë¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤á¤ë¤«½ü³°¤¹¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£¼¡¤Î¤è¤¦¤Ëµ¡Ç½¤·¤Þ¤¹¡£ ++\fBinclude\fR¤ª¤è¤Ó\fBexclude\fR°ú¿ô¤Ï¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤Ë¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤á¤ë¤«½ü³°¤¹¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£¼¡¤Î¤è¤¦¤Ëµ¡Ç½¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1975,7 +2044,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fISerializable\fR¤ò¼ÂÁõ¤·¤Æ¤¤¤ëpublic¤Þ¤¿¤Ïprotected¥¯¥é¥¹¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥¯¥é¥¹¤¬Â°¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸)¤¬\fI@serial exclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤®¤ê¡¢´Þ¤á¤é¤ì¤Þ¤¹¡£ ++\fBSerializable\fR¤ò¼ÂÁõ¤·¤Æ¤¤¤ëpublic¤Þ¤¿¤Ïprotected¥¯¥é¥¹¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥¯¥é¥¹¤¬Â°¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸)¤¬\fB@serial exclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤®¤ê¡¢´Þ¤á¤é¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -1986,87 +2055,89 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fISerializable\fR¤ò¼ÂÁõ¤·¤Æ¤¤¤ëprivate¤Þ¤¿¤Ïpackage\-private¥¯¥é¥¹¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥¯¥é¥¹¤¬Â°¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸)¤¬\fI@serial include\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤®¤ê¡¢½ü³°¤µ¤ì¤Þ¤¹¡£ +-.RE +-.sp +-¤¿¤È¤¨¤Ð¡¢\fIjavax\&.swing\fR¥Ñ¥Ã¥±¡¼¥¸¤Ïpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.javaÆâ¤Ç\fI@serial\fR +-\fIexclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£public¥¯¥é¥¹\fIjava\&.security\&.BasicPermission\fR¤Ï\fI@serial exclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£package\-private¥¯¥é¥¹\fIjava\&.util\&.PropertyPermissionCollection\fR¤Ï\fI@serial include\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-¥¯¥é¥¹¡¦¥ì¥Ù¥ë¤Î\fI@serial\fR¥¿¥°¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥ì¥Ù¥ë¤Î\fI@serial\fR¥¿¥°¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ ++\fBSerializable\fR¤ò¼ÂÁõ¤·¤Æ¤¤¤ëprivate¤Þ¤¿¤Ïpackage\-private¥¯¥é¥¹¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥¯¥é¥¹¤¬Â°¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸)¤¬\fB@serial include\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤®¤ê¡¢½ü³°¤µ¤ì¤Þ¤¹¡£ ++.RE ++.sp ++¤¿¤È¤¨¤Ð¡¢\fBjavax\&.swing\fR¥Ñ¥Ã¥±¡¼¥¸¤Ïpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.javaÆâ¤Ç\fB@serial\fR ++\fBexclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£public¥¯¥é¥¹\fBjava\&.security\&.BasicPermission\fR¤Ï\fB@serial exclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£package\-private¥¯¥é¥¹\fBjava\&.util\&.PropertyPermissionCollection\fR¤Ï\fB@serial include\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++¥¯¥é¥¹¡¦¥ì¥Ù¥ë¤Î\fB@serial\fR¥¿¥°¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥ì¥Ù¥ë¤Î\fB@serial\fR¥¿¥°¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ + .RE + .PP + @serialData \fIdata\-description\fR + .RS 4 + JDK 1\&.2¤ÇƳÆþ + .sp +-¥Ç¡¼¥¿¤ÎÀâÌÀÃͤò»ÈÍѤ·¤Æ¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¤Ç¤Î¥Ç¡¼¥¿¤Î·¿¤È½ç½ø¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£¤³¤Î¥Ç¡¼¥¿¤Ë¤Ï¡¢\fIwriteObject\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤Æ½ñ¤­¹þ¤Þ¤ì¤ë¾Êά²Äǽ¤Ê¥Ç¡¼¥¿¡¢¤ª¤è¤Ó\fIExternalizable\&.writeExternal\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤Æ½ñ¤­¹þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Ç¡¼¥¿(¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤ò´Þ¤à)¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ +-.sp +-\fI@serialData\fR¥¿¥°¤Ï¡¢\fIwriteObject\fR¡¢\fIreadObject\fR¡¢\fIwriteExternal\fR¡¢\fIreadExternal\fR¡¢\fIwriteReplace\fR¤ª¤è¤Ó\fIreadResolve\fR¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£ ++¥Ç¡¼¥¿¤ÎÀâÌÀÃͤò»ÈÍѤ·¤Æ¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¤Ç¤Î¥Ç¡¼¥¿¤Î·¿¤È½ç½ø¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£¤³¤Î¥Ç¡¼¥¿¤Ë¤Ï¡¢\fBwriteObject\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤Æ½ñ¤­¹þ¤Þ¤ì¤ë¾Êά²Äǽ¤Ê¥Ç¡¼¥¿¡¢¤ª¤è¤Ó\fBExternalizable\&.writeExternal\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤Æ½ñ¤­¹þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Ç¡¼¥¿(¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤ò´Þ¤à)¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++.sp ++\fB@serialData\fR¥¿¥°¤Ï¡¢\fBwriteObject\fR¡¢\fBreadObject\fR¡¢\fBwriteExternal\fR¡¢\fBreadExternal\fR¡¢\fBwriteReplace\fR¤ª¤è¤Ó\fBreadResolve\fR¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + @serialField \fIfield\-name\fR \fIfield\-type\fR \fIfield\-description\fR + .RS 4 + JDK 1\&.2¤ÇƳÆþ + .sp +-\fISerializable\fR¥¯¥é¥¹¤Î\fIserialPersistentFields\fR¥á¥ó¥Ð¡¼¤Î\fIObjectStreamField\fR¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£\fIObjectStreamField\fR¥³¥ó¥Ý¡¼¥Í¥ó¥È¤´¤È¤Ë1¤Ä¤Î\fI@serialField\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fBSerializable\fR¥¯¥é¥¹¤Î\fBserialPersistentFields\fR¥á¥ó¥Ð¡¼¤Î\fBObjectStreamField\fR¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£\fBObjectStreamField\fR¥³¥ó¥Ý¡¼¥Í¥ó¥È¤´¤È¤Ë1¤Ä¤Î\fB@serialField\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + @since \fIsince\-text\fR + .RS 4 + JDK 1\&.1¤ÇƳÆþ + .sp +-À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢»ØÄꤵ¤ì¤¿\fIsince\-text\fR¤ÎÃͤÎ\fI¡ÖƳÆþ¤µ¤ì¤¿¥Ð¡¼¥¸¥ç¥ó¡×\fR¸«½Ð¤·¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ë¤Ï¡¢ÆÃÊ̤ÊÆâÉô¹½Â¤¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢ÆÃÄê¤ÎÊѹ¹¤Þ¤¿¤Ïµ¡Ç½¤¬¡¢\fIsince\-text\fR¤ÎÃͤˤè¤Ã¤Æ»ØÄꤵ¤ì¤¿¥½¥Õ¥È¥¦¥§¥¢¡¦¥ê¥ê¡¼¥¹°Ê¹ß¡¢Â¸ºß¤·¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@since 1\&.5\fR¤Ç¤¹¡£ +-.sp +-Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¾ì¹ç¡¢\fI@since\fR¥¿¥°¤Ï¡¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥àAPI»ÅÍͤΥС¼¥¸¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤¬¥ê¥Õ¥¡¥ì¥ó¥¹¼ÂÁõ¤ËÄɲ䵤줿»þ´ü¤ò¼¨¤¹¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£Ê£¿ô¤Î\fI@since\fR¥¿¥°¤ò»ÈÍѤǤ­¡¢Ê£¿ô¤Î\fI@author\fR¥¿¥°¤Î¤è¤¦¤Ë°·¤ï¤ì¤Þ¤¹¡£¥×¥í¥°¥é¥àÍ×ÁǤ¬Ê£¿ô¤ÎAPI¤Ç»ÈÍѤµ¤ì¤ë¾ì¹ç¡¢Ê£¿ô¤Î¥¿¥°¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢»ØÄꤵ¤ì¤¿\fBsince\-text\fR¤ÎÃͤÎ\fI¡ÖƳÆþ¤µ¤ì¤¿¥Ð¡¼¥¸¥ç¥ó¡×\fR¸«½Ð¤·¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ë¤Ï¡¢ÆÃÊ̤ÊÆâÉô¹½Â¤¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢ÆÃÄê¤ÎÊѹ¹¤Þ¤¿¤Ïµ¡Ç½¤¬¡¢\fBsince\-text\fR¤ÎÃͤˤè¤Ã¤Æ»ØÄꤵ¤ì¤¿¥½¥Õ¥È¥¦¥§¥¢¡¦¥ê¥ê¡¼¥¹°Ê¹ß¡¢Â¸ºß¤·¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@since 1\&.5\fR¤Ç¤¹¡£ ++.sp ++Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¾ì¹ç¡¢\fB@since\fR¥¿¥°¤Ï¡¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥àAPI»ÅÍͤΥС¼¥¸¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤¬¥ê¥Õ¥¡¥ì¥ó¥¹¼ÂÁõ¤ËÄɲ䵤줿»þ´ü¤ò¼¨¤¹¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£Ê£¿ô¤Î\fB@since\fR¥¿¥°¤ò»ÈÍѤǤ­¡¢Ê£¿ô¤Î\fB@author\fR¥¿¥°¤Î¤è¤¦¤Ë°·¤ï¤ì¤Þ¤¹¡£¥×¥í¥°¥é¥àÍ×ÁǤ¬Ê£¿ô¤ÎAPI¤Ç»ÈÍѤµ¤ì¤ë¾ì¹ç¡¢Ê£¿ô¤Î¥¿¥°¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + @throws \fIclass\-name\fR \fIdescription\fR + .RS 4 + JDK 1\&.2¤ÇƳÆþ + .sp +-\fI@exception\fR¥¿¥°¤ÈƱ¤¸Æ°ºî¤ò¤·¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@throws¤Ë´Ø¤¹¤ë¹à ++\fB@exception\fR¥¿¥°¤ÈƱ¤¸Æ°ºî¤ò¤·¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@throws¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@exception)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fI@throws\fR¥¿¥°¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë\fIThrows\fR¾®¸«½Ð¤·¤òÄɲ䷤ơ¢\fIclass\-name\fR¤ª¤è¤Ó\fIdescription\fR¥Æ¥­¥¹¥È¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£\fIclass\-name\fR¤Ï¡¢¤½¤Î¥á¥½¥Ã¥É¤«¤é¥¹¥í¡¼¤µ¤ì¤ë²ÄǽÀ­¤Î¤¢¤ëÎã³°¤Î̾Á°¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤Î¤ßÍ­¸ú¤Ç¤¹¡£¤³¤Î¥¯¥é¥¹¤¬´°Á´»ØÄê¤Î̾Á°¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡º÷½ç½ø¤Ë½¾¤Ã¤Æ¥¯¥é¥¹¤òõ¤·¤Þ¤¹¡£Ê£¿ô¤Î\fI@throws\fR¥¿¥°¤ò¡¢Æ±¤¸Îã³°¤Þ¤¿¤Ï°ã¤¦Îã³°¤Î»ØÄꤷ¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯ºÑÎã³°¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë¡¢\fI@throws\fR¥¿¥°¤¬throwsÀáÆâ¤ÎÎã³°ÍѤ˸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fI@throws\fR¥¿¥°¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¤«¤Î¤è¤¦¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÎã³°¤¬HTML½ÐÎϤËÀâÌÀ¤Ê¤·¤ÇÄɲ䵤ì¤Þ¤¹¡£ +-.sp +-¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤ë¥á¥½¥Ã¥ÉÆâ¤ÇÎã³°¤¬ÌÀ¼¨Åª¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Î¤ß¡¢\fI@throws\fR¤Î¥É¥­¥å¥á¥ó¥È¤¬¤½¤Î¥á¥½¥Ã¥É¤«¤é¥µ¥Ö¥¯¥é¥¹¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥á¥½¥Ã¥É¤«¤é¼ÂÁõ¥á¥½¥Ã¥É¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¾ì¹ç¤âƱÍͤǤ¹¡£\fI{@inheritDoc}\fR¥¿¥°¤ò»ÈÍѤ·¤Æ¡¢\fI@throws\fR¥¿¥°¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤ò·Ñ¾µ¤¹¤ë¤è¤¦¤Ë¶¯À©¤Ç¤­¤Þ¤¹¡£ ++\fB@throws\fR¥¿¥°¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë\fIThrows\fR¾®¸«½Ð¤·¤òÄɲ䷤ơ¢\fBclass\-name\fR¤ª¤è¤Ó\fBdescription\fR¥Æ¥­¥¹¥È¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£\fIclass\-name\fR¤Ï¡¢¤½¤Î¥á¥½¥Ã¥É¤«¤é¥¹¥í¡¼¤µ¤ì¤ë²ÄǽÀ­¤Î¤¢¤ëÎã³°¤Î̾Á°¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤Î¤ßÍ­¸ú¤Ç¤¹¡£¤³¤Î¥¯¥é¥¹¤¬´°Á´»ØÄê¤Î̾Á°¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡º÷½ç½ø¤Ë½¾¤Ã¤Æ¥¯¥é¥¹¤òõ¤·¤Þ¤¹¡£Ê£¿ô¤Î\fB@throws\fR¥¿¥°¤ò¡¢Æ±¤¸Îã³°¤Þ¤¿¤Ï°ã¤¦Îã³°¤Î»ØÄꤷ¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯ºÑÎã³°¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë¡¢\fB@throws\fR¥¿¥°¤¬throwsÀáÆâ¤ÎÎã³°ÍѤ˸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fB@throws\fR¥¿¥°¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¤«¤Î¤è¤¦¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÎã³°¤¬HTML½ÐÎϤËÀâÌÀ¤Ê¤·¤ÇÄɲ䵤ì¤Þ¤¹¡£ ++.sp ++¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤ë¥á¥½¥Ã¥ÉÆâ¤ÇÎã³°¤¬ÌÀ¼¨Åª¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Î¤ß¡¢\fB@throws\fR¤Î¥É¥­¥å¥á¥ó¥È¤¬¤½¤Î¥á¥½¥Ã¥É¤«¤é¥µ¥Ö¥¯¥é¥¹¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥á¥½¥Ã¥É¤«¤é¼ÂÁõ¥á¥½¥Ã¥É¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¾ì¹ç¤âƱÍͤǤ¹¡£\fB{@inheritDoc}\fR¥¿¥°¤ò»ÈÍѤ·¤Æ¡¢\fB@throws\fR¥¿¥°¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤ò·Ñ¾µ¤¹¤ë¤è¤¦¤Ë¶¯À©¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + {@value \fIpackage\&.class#field\fR} + .RS 4 + JDK 1\&.4¤ÇƳÆþ + .sp +-Äê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£\fI{@value}\fR¥¿¥°¤¬ÀÅŪ¥Õ¥£¡¼¥ë¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç°ú¿ô¤Ê¤·¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎÄê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£ ++Äê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£\fB{@value}\fR¥¿¥°¤¬ÀÅŪ¥Õ¥£¡¼¥ë¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç°ú¿ô¤Ê¤·¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎÄê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * The value of this constant is {@value}\&. +- */ +-public static final String SCRIPT_START = "<script>" ++\fB/**\fR ++\fB * The value of this constant is {@value}\&.\fR ++\fB */\fR ++\fBpublic static final String SCRIPT_START = "<script>"\fR ++ + .fi + .if n \{\ + .RE + .\} +-Ǥ°Õ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç°ú¿ô\fIpackage\&.class#field\fR¤¢¤ê¤Ç»ÈÍѤµ¤ì¤¿¾ì¹ç¡¢\fI{@value}\fR¥¿¥°¤Ï»ØÄꤵ¤ì¤¿Äê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£ ++Ǥ°Õ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç°ú¿ô\fBpackage\&.class#field\fR¤¢¤ê¤Ç»ÈÍѤµ¤ì¤¿¾ì¹ç¡¢\fB{@value}\fR¥¿¥°¤Ï»ØÄꤵ¤ì¤¿Äê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * Evaluates the script starting with {@value #SCRIPT_START}\&. +- */ +-public String evalScript(String script) {} ++\fB/**\fR ++\fB * Evaluates the script starting with {@value #SCRIPT_START}\&.\fR ++\fB */\fR ++\fBpublic String evalScript(String script) {}\fR ++ + .fi + .if n \{\ + .RE + .\} +-°ú¿ô\fIpackage\&.class#field\fR¤Ï¡¢\fI@see\fR¥¿¥°°ú¿ô¤ÈƱ°ì¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¥á¥ó¥Ð¡¼¤ÏÀÅŪ¥Õ¥£¡¼¥ë¥É¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++°ú¿ô\fBpackage\&.class#field\fR¤Ï¡¢\fB@see\fR¥¿¥°°ú¿ô¤ÈƱ°ì¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¥á¥ó¥Ð¡¼¤ÏÀÅŪ¥Õ¥£¡¼¥ë¥É¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + ¤³¤ì¤é¤ÎÄê¿ô¤ÎÃͤϡÖÄê¿ô¥Õ¥£¡¼¥ë¥ÉÃÍ¡× + (http://docs\&.oracle\&.com/javase/8/docs/api/constant\-values\&.html)¤Ë¤âɽ¼¨¤µ¤ì¤Þ¤¹ +@@ -2076,34 +2147,34 @@ + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-\fI\-version\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë\fI¡Ö¥Ð¡¼¥¸¥ç¥ó¡×\fR¾®¸«½Ð¤·¤òÄɲ䷤ơ¢»ØÄꤵ¤ì¤¿\fIversion\-text\fR¤ÎÃͤò½ñ¤­¹þ¤ß¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¤³¤Î¥³¡¼¥É¤¬´Þ¤Þ¤ì¤ë¥½¥Õ¥È¥¦¥§¥¢¤Î¸½ºß¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤òÊÝ»ý¤¹¤ë¤¿¤á¤Î¤â¤Î¤Ç¤¢¤ë¤Î¤ËÂФ·¡¢\fI@since\fR¥¿¥°¤Ï¡¢¤³¤Î¥³¡¼¥É¤¬Æ³Æþ¤µ¤ì¤¿¥ê¥ê¡¼¥¹ÈÖ¹æ¤òÊÝ»ý¤·¤Þ¤¹¡£\fIversion\-text\fR¤ÎÃͤˤϡ¢ÆÃÊ̤ÊÆâÉô¹½Â¤¤Ï¤¢¤ê¤Þ¤»¤ó¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@version¤Ë´Ø¤¹¤ë¹à ++\fB\-version\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë\fI¡Ö¥Ð¡¼¥¸¥ç¥ó¡×\fR¾®¸«½Ð¤·¤òÄɲ䷤ơ¢»ØÄꤵ¤ì¤¿\fBversion\-text\fR¤ÎÃͤò½ñ¤­¹þ¤ß¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¤³¤Î¥³¡¼¥É¤¬´Þ¤Þ¤ì¤ë¥½¥Õ¥È¥¦¥§¥¢¤Î¸½ºß¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤òÊÝ»ý¤¹¤ë¤¿¤á¤Î¤â¤Î¤Ç¤¢¤ë¤Î¤ËÂФ·¡¢\fB@since\fR¥¿¥°¤Ï¡¢¤³¤Î¥³¡¼¥É¤¬Æ³Æþ¤µ¤ì¤¿¥ê¥ê¡¼¥¹ÈÖ¹æ¤òÊÝ»ý¤·¤Þ¤¹¡£\fBversion\-text\fR¤ÎÃͤˤϡ¢ÆÃÊ̤ÊÆâÉô¹½Â¤¤Ï¤¢¤ê¤Þ¤»¤ó¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@version¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@version)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËÊ£¿ô¤Î\fI@version\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£É¬Íפ˱þ¤¸¤Æ¡¢1¤Ä¤Î\fI@version\fR¥¿¥°¤Ë1¤Ä¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ê£¿ô¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Á°¼Ô¤Î¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ̾Á°¤È̾Á°¤Î´Ö¤Ë¥«¥ó¥Þ(,)¤È¶õÇòʸ»ú¤¬ÁÞÆþ¤µ¤ì¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¤Ï¡¢¥Æ¥­¥¹¥ÈÁ´ÂΤ¬²òÀϤµ¤ì¤ë¤³¤È¤Ê¤¯¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥«¥ó¥Þ¤Ç¤Ï¤Ê¤¯¡¢³Æ¸À¸ì¤ËÂбþ¤·¤¿Ì¾Á°¶èÀÚ¤êʸ»ú¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¤È¤­¤Ë¡¢1¹Ô¤ËÊ£¿ô¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËÊ£¿ô¤Î\fB@version\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£É¬Íפ˱þ¤¸¤Æ¡¢1¤Ä¤Î\fB@version\fR¥¿¥°¤Ë1¤Ä¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ê£¿ô¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Á°¼Ô¤Î¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ̾Á°¤È̾Á°¤Î´Ö¤Ë¥«¥ó¥Þ(,)¤È¶õÇòʸ»ú¤¬ÁÞÆþ¤µ¤ì¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¤Ï¡¢¥Æ¥­¥¹¥ÈÁ´ÂΤ¬²òÀϤµ¤ì¤ë¤³¤È¤Ê¤¯¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥«¥ó¥Þ¤Ç¤Ï¤Ê¤¯¡¢³Æ¸À¸ì¤ËÂбþ¤·¤¿Ì¾Á°¶èÀÚ¤êʸ»ú¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¤È¤­¤Ë¡¢1¹Ô¤ËÊ£¿ô¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .SH "¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê" + .PP +-¤³¤³¤Ç¤Ï¡¢¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£¼¡¤Î¥¿¥°¤¬¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£\fI@see\fR¡¢\fI@since\fR¡¢\fI@deprecated\fR¡¢\fI{@link}\fR¡¢\fI{@linkplain}\fR¤ª¤è¤Ó\fI{@docroot}\fR¡£ ++¤³¤³¤Ç¤Ï¡¢¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£¼¡¤Î¥¿¥°¤¬¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£\fB@see\fR¡¢\fB@since\fR¡¢\fB@deprecated\fR¡¢\fB{@link}\fR¡¢\fB{@linkplain}\fR¤ª¤è¤Ó\fB{@docroot}\fR¡£ + .SS "³µÍ×¥¿¥°" + .PP + ³µÍ×¥¿¥°¤Ï¡¢³µÍ×¥Ú¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤Ç¤¹(¤³¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢Ä̾ïoverview\&.html¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ê¤Þ¤¹)¡£Â¾¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¾ì¹ç¤ÈƱÍͤˡ¢¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤Ç»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-Java SE 1\&.2¤Ç¤Ï¡¢³µÍץɥ­¥å¥á¥ó¥ÈÆâ¤Î\fI{@link}\fR¥¿¥°¤ËÉÔ¶ñ¹ç¤¬¤¢¤ê¤Þ¤¹¡£¥Æ¥­¥¹¥È¤ÏÀµ¤·¤¯É½¼¨¤µ¤ì¤Þ¤¹¤¬¡¢¥ê¥ó¥¯¤¬ÀßÄꤵ¤ì¤Þ¤»¤ó¡£¸½ºß¤Î¤È¤³¤í¡¢\fI{@docRoot}\fR¥¿¥°¤Ï¡¢³µÍץɥ­¥å¥á¥ó¥ÈÆâ¤Ç¤Ïµ¡Ç½¤·¤Þ¤»¤ó¡£ ++Java SE 1\&.2¤Ç¤Ï¡¢³µÍץɥ­¥å¥á¥ó¥ÈÆâ¤Î\fB{@link}\fR¥¿¥°¤Ëbug¤¬¤¢¤ê¤Þ¤¹¡£¥Æ¥­¥¹¥È¤ÏÀµ¤·¤¯É½¼¨¤µ¤ì¤Þ¤¹¤¬¡¢¥ê¥ó¥¯¤¬ÀßÄꤵ¤ì¤Þ¤»¤ó¡£¸½ºß¤Î¤È¤³¤í¡¢\fB{@docRoot}\fR¥¿¥°¤Ï¡¢³µÍץɥ­¥å¥á¥ó¥ÈÆâ¤Ç¤Ïµ¡Ç½¤·¤Þ¤»¤ó¡£ + .PP + ³µÍ×¥¿¥°¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP + @see reference || @since since\-text || @serialField field\-name field\-type field\-description || @author name\-text || @version version\-text || {@link package\&.class#member label} || {@linkplain package\&.class#member label} || {@docRoot} || + .SS "¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°" + .PP +-¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤Ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ïpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.java¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤³¤Ç»ÈÍѤǤ­¤ë\fI@serial\fR¥¿¥°¤Ï¡¢\fIinclude\fR¤Þ¤¿¤Ï\fIexclude\fR°ú¿ô¤ò»ØÄꤷ¤¿¤â¤Î¤Î¤ß¤Ç¤¹¡£ ++¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤Ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ïpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.java¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤³¤Ç»ÈÍѤǤ­¤ë\fB@serial\fR¥¿¥°¤Ï¡¢\fBinclude\fR¤Þ¤¿¤Ï\fBexclude\fR°ú¿ô¤ò»ØÄꤷ¤¿¤â¤Î¤Î¤ß¤Ç¤¹¡£ + .PP + ¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP + @see reference || @since since\-text || @serial field\-description | include | exclude || @author name\-text || @version version\-text || {@linkplain package\&.class#member label} || {@linkplain package\&.class#member label} || {@docRoot} || + .SS "¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥¿¥°" + .PP +-¼¡¤Ë¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤ò¼¨¤·¤Þ¤¹¡£\fI@serial\fR¥¿¥°¤Ï¡¢\fIinclude\fR¤Þ¤¿¤Ï\fIexclude\fR°ú¿ô¤ò»ØÄꤷ¤Æ¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤Ç¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++¼¡¤Ë¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤ò¼¨¤·¤Þ¤¹¡£\fB@serial\fR¥¿¥°¤Ï¡¢\fBinclude\fR¤Þ¤¿¤Ï\fBexclude\fR°ú¿ô¤ò»ØÄꤷ¤Æ¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤Ç¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .PP + @see reference || @since since\-text || @deprecated deprecated\-text || @serial field\-description | include | exclude || @author name\-text || @version version\-text || {@link package\&.class#member label} || {@linkplain package\&.class#member label} || {@docRoot} || + .PP +@@ -2113,22 +2184,23 @@ + .RS 4 + .\} + .nf +-/** +- * A class representing a window on the screen\&. +- * For example: +- * <pre> +- * Window win = new Window(parent); +- * win\&.show(); +- * </pre> +- * +- * @author Sami Shaio +- * @version 1\&.13, 06/08/06 +- * @see java\&.awt\&.BaseWindow +- * @see java\&.awt\&.Button +- */ +-class Window extends BaseWindow { +- \&.\&.\&. +-} ++\fB/**\fR ++\fB * A class representing a window on the screen\&.\fR ++\fB * For example:\fR ++\fB * <pre>\fR ++\fB * Window win = new Window(parent);\fR ++\fB * win\&.show();\fR ++\fB * </pre>\fR ++\fB *\fR ++\fB * @author Sami Shaio\fR ++\fB * @version 1\&.13, 06/08/06\fR ++\fB * @see java\&.awt\&.BaseWindow\fR ++\fB * @see java\&.awt\&.Button\fR ++\fB */\fR ++\fBclass Window extends BaseWindow {\fR ++\fB \&.\&.\&.\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -2145,25 +2217,26 @@ + .RS 4 + .\} + .nf +- /** +- * The X\-coordinate of the component\&. +- * +- * @see #getLocation() +- */ +- int x = 1263732; ++\fB /**\fR ++\fB * The X\-coordinate of the component\&.\fR ++\fB *\fR ++\fB * @see #getLocation()\fR ++\fB */\fR ++\fB int x = 1263732;\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥³¥ó¥¹¥È¥é¥¯¥¿¤È¥á¥½¥Ã¥É¡¦¥¿¥°" + .PP +-¼¡¤Ë¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Þ¤¿¤Ï¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤ò¼¨¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fI@return\fR¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¤Ï»ÈÍѤǤ­¤º¡¢ +-\fI{@inheritDoc}\fR¤Ë¤ÏÀ©¸Â¤¬¤¢¤ê¤Þ¤¹¡£ ++¼¡¤Ë¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Þ¤¿¤Ï¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤ò¼¨¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fB@return\fR¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¤Ï»ÈÍѤǤ­¤º¡¢ ++\fB{@inheritDoc}\fR¤Ë¤ÏÀ©¸Â¤¬¤¢¤ê¤Þ¤¹¡£ + .PP + @see reference || @since since\-text || @deprecated deprecated\-text || @param parameter\-name description || @return description || @throws class\-name description || @exception class\-name description || @serialData data\-description || {@link package\&.class#member label} || {@linkplain package\&.class#member label} || {@inheritDoc} || {@docRoot} + .PP + \fBÃí°Õ:\fR +-\fI@serialData\fR¥¿¥°¤Ï¡¢\fIwriteObject\fR¡¢\fIreadObject\fR¡¢\fIwriteExternal\fR¡¢\fIreadExternal\fR¡¢\fIwriteReplace\fR¤ª¤è¤Ó\fIreadResolve\fR¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++\fB@serialData\fR¥¿¥°¤Ï¡¢\fBwriteObject\fR¡¢\fBreadObject\fR¡¢\fBwriteExternal\fR¡¢\fBreadExternal\fR¡¢\fBwriteReplace\fR¤ª¤è¤Ó\fBreadResolve\fR¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .PP + ¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ÎÎã: + .sp +@@ -2171,27 +2244,28 @@ + .RS 4 + .\} + .nf +-/** +- * Returns the character at the specified index\&. An index +- * ranges from <code>0</code> to <code>length() \- 1</code> +- * +- * @param index the index of the desired character\&. +- * @return the desired character\&. +- * @exception StringIndexOutOfRangeException +- * if the index is not in the range <code>0</code> +- * to <code>length()\-1</code> +- * @see java\&.lang\&.Character#charValue() +- */ +- public char charAt(int index) { +- \&.\&.\&. +- } ++\fB/**\fR ++\fB * Returns the character at the specified index\&. An index \fR ++\fB * ranges from <code>0</code> to <code>length() \- 1</code>\fR ++\fB *\fR ++\fB * @param index the index of the desired character\&.\fR ++\fB * @return the desired character\&.\fR ++\fB * @exception StringIndexOutOfRangeException \fR ++\fB * if the index is not in the range <code>0</code> \fR ++\fB * to <code>length()\-1</code>\fR ++\fB * @see java\&.lang\&.Character#charValue()\fR ++\fB */\fR ++\fB public char charAt(int index) {\fR ++\fB \&.\&.\&.\fR ++\fB }\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ½ÐÎϤò·èÄꤷ¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢Ç¤°Õ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤È¤È¤â¤Ë»ÈÍѤǤ­¤ë¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc¥ª¥×¥·¥ç¥ó¤ÇÀâÌÀ¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¤³¤Î¾¤Ë¡¢¤¤¤¯¤Ä¤«¤ÎÄɲäΥ³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬Ä󶡤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ª¥×¥·¥ç¥ó¤ÇÀâÌÀ¤·¤Þ¤¹¡£¤É¤Î¥ª¥×¥·¥ç¥ó̾¤â¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ç¤Ï¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ½ÐÎϤò·èÄꤷ¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢Ç¤°Õ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤È¤È¤â¤Ë»ÈÍѤǤ­¤ë¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc¥ª¥×¥·¥ç¥ó¤ÇÀâÌÀ¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¤³¤Î¾¤Ë¡¢¤¤¤¯¤Ä¤«¤ÎÄɲäΥ³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬Ä󶡤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ª¥×¥·¥ç¥ó¤ÇÀâÌÀ¤·¤Þ¤¹¡£¤É¤Î¥ª¥×¥·¥ç¥ó̾¤â¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ç¤Ï¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2218,39 +2292,44 @@ + ¥ª¥×¥·¥ç¥ó¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP + \-1\&.1 || \-author || \-bootclasspath classpathlist || \-bottom text || \-breakiterator || \-charset name || \-classpath classpathlist || \-d directory || \-docencoding name || \-docfilesubdirs || \-doclet class || \-docletpath classpathlist || \-doctitle title || \-encoding || \-exclude packagename1:packagename2:\&.\&.\&. || \-excludedocfilessubdir name1:name2 || \-extdirs dirist || \-footer footer || \-group groupheading packagepattern:packagepattern || \-header header || \-help || \-helpfile path\efilename || \-Jflag || \-keywords || \-link extdocURL || \-linkoffline extdocURL packagelistLoc || \-linksource || \-locale language_country_variant || \-nocomment || \-nodeprecated || \-nodeprecatedlist || \-nohelp || \-noindex || \-nonavbar || \-noqualifier all | packagename1:packagename2\&.\&.\&. || \-nosince || \-notimestamp || \-notree || +-\fI\-overview path/filename || \fR\-package || \-private || \-protected || \-public || \-quiet || \-serialwarn || \-source release || \-sourcepath sourcepathlist || \-sourcetab tablength || \-splitindex || +-\fI\-stylesheet path/filename || \fR\-subpackages package1:package2:\&.\&.\&. || \-tag tagname:Xaoptcmf:"taghead" || \-taglet class || \-tagletpath tagletpathlist || \-title title || \-top || \-use || \-verbose || \-version || \-windowtitle title +-.PP +-¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤Ë»ÈÍѲÄǽ¤Ê¥³¥¢¤ÎJavadoc¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤Î¾¤ÎÉôʬ¤òÄ󶡤·¤Þ¤¹¡£\fI\-bootclasspath\fR¡¢\fI\-breakiterator\fR¡¢\fI\-classpath\fR¡¢\fI\-doclet\fR¡¢\fI\-docletpath\fR¡¢\fI\-encoding\fR¡¢\-\fIexclude\fR¡¢\fI\-extdirs\fR¡¢\fI\-help\fR¡¢\fI\-locale\fR¡¢\fI\-\fR\fIoverview\fR¡¢\fI\-package\fR¡¢\fI\-private\fR¡¢\fI\-protected\fR¡¢\fI\-public\fR¡¢\fI\-quiet\fR¡¢\fI\-source\fR¡¢\fI\-sourcepath\fR¡¢\fI\-subpackages\fR¤ª¤è¤Ó\fI\-verbose\fR¡£ ++ ++\-overview path/filename || ++\-package || \-private || \-protected || \-public || \-quiet || \-serialwarn || \-source release || \-sourcepath sourcepathlist || \-sourcetab tablength || \-splitindex || ++ ++\-stylesheet path/filename || ++ ++||\-subpackages package1:package2:\&.\&.\&. || \-tag tagname:Xaoptcmf:"taghead" || \-taglet class || \-tagletpath tagletpathlist || \-title title || \-top || \-use || \-verbose || \-version || \-windowtitle title ++.PP ++¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤Ë»ÈÍѲÄǽ¤Ê¥³¥¢¤ÎJavadoc¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤Î¾¤ÎÉôʬ¤òÄ󶡤·¤Þ¤¹¡£\fB\-bootclasspath\fR¡¢\fB\-breakiterator\fR¡¢\fB\-classpath\fR¡¢\fB\-doclet\fR¡¢\fB\-docletpath\fR¡¢\fB\-encoding\fR¡¢\-\fBexclude\fR¡¢\fB\-extdirs\fR¡¢\fB\-help\fR¡¢\fB\-locale\fR¡¢\fB\-\fR\fBoverview\fR¡¢\fB\-package\fR¡¢\fB\-private\fR¡¢\fB\-protected\fR¡¢\fB\-public\fR¡¢\fB\-quiet\fR¡¢\fB\-source\fR¡¢\fB\-sourcepath\fR¡¢\fB\-subpackages\fR¤ª¤è¤Ó\fB\-verbose\fR¡£ + .SS "Javadoc¥ª¥×¥·¥ç¥ó" + .PP + \-overview \fIpath/filename \fR + .RS 4 + +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢\fIpath/filename \fR¤Ç»ØÄꤵ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é³µÍץɥ­¥å¥á¥ó¥ÈÍѤΥƥ­¥¹¥È¤ò¼èÆÀ¤·¡¢¤½¤Î¥Æ¥­¥¹¥È¤ò³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¤ËÇÛÃÖ¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£\fIpath/filename\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤Ç¤¹¡£ +-.sp +-\fIfilename\fR¤ÎÃͤÇǤ°Õ¤Î̾Á°¤ò»ÈÍѤ·¡¢path¤ÇǤ°Õ¤ÎÇÛÃÖÀè¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢Ä̾ï¤Ïoverview\&.html¤È¤¤¤¦Ì¾Á°¤òÉÕ¤±¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤ÎºÇ¾å°Ì¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¤Þ¤¹¡£¤³¤Î¾ì½ê¤ËÇÛÃÖ¤¹¤ë¤È¡¢¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤È¤­¤Ëpath¤ò»ØÄꤹ¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤¬»Ø¤·¼¨¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢\fIjava\&.lang\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤¬/src/classes/java/lang/¤Î¾ì¹ç¡¢³µÍ×¥Õ¥¡¥¤¥ë¤ò/src/classes/overview\&.html¤ËÇÛÃ֤Ǥ­¤Þ¤¹ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢\fIpath/filename \fR¤Ç»ØÄꤵ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é³µÍץɥ­¥å¥á¥ó¥ÈÍѤΥƥ­¥¹¥È¤ò¼èÆÀ¤·¡¢¤½¤Î¥Æ¥­¥¹¥È¤ò³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¤ËÇÛÃÖ¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£\fIpath/filename\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤Ç¤¹¡£ ++.sp ++\fBfilename\fR¤ÎÃͤÇǤ°Õ¤Î̾Á°¤ò»ÈÍѤ·¡¢path¤ÇǤ°Õ¤ÎÇÛÃÖÀè¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢Ä̾ï¤Ïoverview\&.html¤È¤¤¤¦Ì¾Á°¤òÉÕ¤±¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤ÎºÇ¾å°Ì¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¤Þ¤¹¡£¤³¤Î¾ì½ê¤ËÇÛÃÖ¤¹¤ë¤È¡¢¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤È¤­¤Ëpath¤ò»ØÄꤹ¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤¬»Ø¤·¼¨¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢\fBjava\&.lang\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤¬/src/classes/java/lang/¤Î¾ì¹ç¡¢³µÍ×¥Õ¥¡¥¤¥ë¤ò/src/classes/overview\&.html¤ËÇÛÃ֤Ǥ­¤Þ¤¹ + .sp + ¼ÂºÝ¤ÎÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fIpath/filename\fR¤Ç»ØÄꤹ¤ë¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¤Ï¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-³µÍ×¥Ú¡¼¥¸¤¬ºîÀ®¤µ¤ì¤ë¤Î¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢HTML¥Õ¥ì¡¼¥à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£³µÍ×¥Ú¡¼¥¸¤Î¥¿¥¤¥È¥ë¤Ï¡¢\fI\-doctitle\fR¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£ ++³µÍ×¥Ú¡¼¥¸¤¬ºîÀ®¤µ¤ì¤ë¤Î¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢HTML¥Õ¥ì¡¼¥à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£³µÍ×¥Ú¡¼¥¸¤Î¥¿¥¤¥È¥ë¤Ï¡¢\fB\-doctitle\fR¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .PP + \-Xdoclint:(all|none|[\-]\fI<group>\fR) + .RS 4 + ÉÔÀµ¤Ê»²¾È¡¢¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¤Î·çÍ¤è¤ÓJavadoc¥³¥á¥ó¥È¤ÎÉÔ­¤Î·Ù¹ð¤ò¥ì¥Ý¡¼¥È¤·¡¢Ìµ¸ú¤ÊJavadoc¹½Ê¸¤ª¤è¤ÓÉÔ­¤·¤Æ¤¤¤ëHTML¥¿¥°¤Î¥¨¥é¡¼¤ò¥ì¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ÏÀ¸À®¤µ¤ì¤¿½ÐÎϤ˴ޤޤì¤ë¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È¡¦¥³¥á¥ó¥È¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£Ä̾ï¤É¤ª¤ê¡¢É¸½à¥ª¥×¥·¥ç¥ó\fI\-public\fR¡¢\fI\-protected\fR¡¢\fI\-package\fR¤ª¤è¤Ó\fI\-private\fR¤ÇÀ¸À®¤µ¤ì¤¿½ÐÎϤ˴ޤà¹àÌܤòÁªÂò¤Ç¤­¤Þ¤¹¡£ +-.sp +-\fI\-Xdoclint\fR¤¬Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fIjavac\fR¥³¥Þ¥ó¥É¤ÈƱÍͤ˥á¥Ã¥»¡¼¥¸¤ÇÌäÂ꤬¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥á¥Ã¥»¡¼¥¸¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤ª¤è¤Ó¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿Àµ³Î¤Ê°ÌÃÖ¤ò»Ø¤¹¥­¥ã¥ì¥Ã¥È¤ò½ÐÎϤ·¤Þ¤¹¡£¥á¥Ã¥»¡¼¥¸¤Ï¡¢½ÅÂçÅÙ¡¢¤ª¤è¤ÓÀ¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¬¥Ð¥ê¥Ç¡¼¥¿¤ò»ÈÍѤ·¤Æ¼Â¹Ô¤µ¤ì¤¿¾ì¹ç¤Ë¥¨¥é¡¼¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤Ë±þ¤¸¤Æ¡¢·Ù¹ð¤Þ¤¿¤Ï¥¨¥é¡¼¤Ë¤Ê¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢ÉÔÀµ¤Ê»²¾È¤Þ¤¿¤ÏJavadoc¥³¥á¥ó¥È¤Î·çÍî¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬Ìµ¸ú¤ÊHTML¤òÀ¸À®¤¹¤ë¸¶°ø¤Ë¤Ê¤é¤Ê¤¤¤¿¤á¡¢¤³¤ì¤é¤ÎÌäÂê¤Ï·Ù¹ð¤È¤·¤Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£¹½Ê¸¥¨¥é¡¼¤Þ¤¿¤ÏHTML½ªÎ»¥¿¥°¤Î·çÍî¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬Ìµ¸ú¤ÊHTML¤òÀ¸À®¤¹¤ë¸¶°ø¤Ë¤Ê¤ë¤¿¤á¡¢¤³¤ì¤é¤ÎÌäÂê¤Ï¥¨¥é¡¼¤È¤·¤Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó\fI\-Xdoclint:none\fR¤Ç̵¸ú¤Ë¤·¤Þ¤¹¡£ +-.sp +-\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤Ç¥ì¥Ý¡¼¥È¤µ¤ì¤ëÆâÍƤϼ¡¤Î¥ª¥×¥·¥ç¥ó¤ÇÊѹ¹¤·¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ÏÀ¸À®¤µ¤ì¤¿½ÐÎϤ˴ޤޤì¤ë¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È¡¦¥³¥á¥ó¥È¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£Ä̾ï¤É¤ª¤ê¡¢É¸½à¥ª¥×¥·¥ç¥ó\fB\-public\fR¡¢\fB\-protected\fR¡¢\fB\-package\fR¤ª¤è¤Ó\fB\-private\fR¤ÇÀ¸À®¤µ¤ì¤¿½ÐÎϤ˴ޤà¹àÌܤòÁªÂò¤Ç¤­¤Þ¤¹¡£ ++.sp ++\fB\-Xdoclint\fR¤¬Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fBjavac\fR¥³¥Þ¥ó¥É¤ÈƱÍͤ˥á¥Ã¥»¡¼¥¸¤ÇÌäÂ꤬¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥á¥Ã¥»¡¼¥¸¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤ª¤è¤Ó¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿Àµ³Î¤Ê°ÌÃÖ¤ò»Ø¤¹¥­¥ã¥ì¥Ã¥È¤ò½ÐÎϤ·¤Þ¤¹¡£¥á¥Ã¥»¡¼¥¸¤Ï¡¢½ÅÂçÅÙ¡¢¤ª¤è¤ÓÀ¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¬¥Ð¥ê¥Ç¡¼¥¿¤ò»ÈÍѤ·¤Æ¼Â¹Ô¤µ¤ì¤¿¾ì¹ç¤Ë¥¨¥é¡¼¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤Ë±þ¤¸¤Æ¡¢·Ù¹ð¤Þ¤¿¤Ï¥¨¥é¡¼¤Ë¤Ê¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢ÉÔÀµ¤Ê»²¾È¤Þ¤¿¤ÏJavadoc¥³¥á¥ó¥È¤Î·çÍî¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬Ìµ¸ú¤ÊHTML¤òÀ¸À®¤¹¤ë¸¶°ø¤Ë¤Ê¤é¤Ê¤¤¤¿¤á¡¢¤³¤ì¤é¤ÎÌäÂê¤Ï·Ù¹ð¤È¤·¤Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£¹½Ê¸¥¨¥é¡¼¤Þ¤¿¤ÏHTML½ªÎ»¥¿¥°¤Î·çÍî¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬Ìµ¸ú¤ÊHTML¤òÀ¸À®¤¹¤ë¸¶°ø¤Ë¤Ê¤ë¤¿¤á¡¢¤³¤ì¤é¤ÎÌäÂê¤Ï¥¨¥é¡¼¤È¤·¤Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó\fB\-Xdoclint:none\fR¤Ç̵¸ú¤Ë¤·¤Þ¤¹¡£ ++.sp ++\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤Ç¥ì¥Ý¡¼¥È¤µ¤ì¤ëÆâÍƤϼ¡¤Î¥ª¥×¥·¥ç¥ó¤ÇÊѹ¹¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2260,8 +2339,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-Xdoclint\fR\fI\fR\fI none\fR: +-\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£ ++\fB\-Xdoclint none\fR: ++\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2272,7 +2351,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-Xdoclint\fR\fI\fR\fI \fR\fIgroup\fR: ++\fB\-Xdoclint \fR\fIgroup\fR: + \fIgroup\fR¥Á¥§¥Ã¥¯¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .sp +@@ -2284,7 +2363,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-Xdoclint\fR\fI\fR\fI all\fR: ¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ ++\fB\-Xdoclint all\fR: ¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2295,7 +2374,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-Xdoclint\fR\fI\fR\fI all,\fR\fI\-group\fR: ++\fB\-Xdoclint all,\fR\fI\-group\fR: + \fIgroup\fR¥Á¥§¥Ã¥¯°Ê³°¤Î¤¹¤Ù¤Æ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .sp +@@ -2309,7 +2388,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIaccessibility\fR: ¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¡¦¥Á¥§¥Ã¥«¤Ç¸¡½Ð¤¹¤ëÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢\fI<table>\fR¥¿¥°¤Ç»ØÄꤵ¤ì¤ëno caption¤Þ¤¿¤Ïsummary°À­)¡£ ++\fBaccessibility\fR: ¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¡¦¥Á¥§¥Ã¥«¤Ç¸¡½Ð¤¹¤ëÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢\fB<table>\fR¥¿¥°¤Ç»ØÄꤵ¤ì¤ëno caption¤Þ¤¿¤Ïsummary°À­)¡£ + .RE + .sp + .RS 4 +@@ -2320,7 +2399,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIhtml\fR: ¥¤¥ó¥é¥¤¥óÍ×ÁǤؤΥ֥í¥Ã¥¯Í×ÁǤÎÁÞÆþ¤ä½ªÎ»¥¿¥°¤òɬÍפȤ¹¤ëÍ×ÁǤò½ªÎ»¤·¤Ê¤¤¤Ê¤É¡¢¾å°Ì¥ì¥Ù¥ëHTML¤ÎÌäÂê¤ò¸¡½Ð¤·¤Þ¤¹¡£¥ë¡¼¥ë¤Ï¡¢HTML 4\&.01»ÅÍͤ«¤éƳ½Ð¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¿¥¤¥×¤Î¥Á¥§¥Ã¥¯¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥Ö¥é¥¦¥¶¤¬¼õ¤±Æþ¤ì¤ë²ÄǽÀ­¤Î¤¢¤ëHTML¤ÎÌäÂê¤ò¸¡½Ð¤·¤Þ¤¹¡£ ++\fBhtml\fR: ¥¤¥ó¥é¥¤¥óÍ×ÁǤؤΥ֥í¥Ã¥¯Í×ÁǤÎÁÞÆþ¤ä½ªÎ»¥¿¥°¤òɬÍפȤ¹¤ëÍ×ÁǤò½ªÎ»¤·¤Ê¤¤¤Ê¤É¡¢¾å°Ì¥ì¥Ù¥ëHTML¤ÎÌäÂê¤ò¸¡½Ð¤·¤Þ¤¹¡£¥ë¡¼¥ë¤Ï¡¢HTML 4\&.01»ÅÍͤ«¤éƳ½Ð¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¿¥¤¥×¤Î¥Á¥§¥Ã¥¯¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥Ö¥é¥¦¥¶¤¬¼õ¤±Æþ¤ì¤ë²ÄǽÀ­¤Î¤¢¤ëHTML¤ÎÌäÂê¤ò¸¡½Ð¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2331,7 +2410,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fImissing\fR: ·çÍ¤Æ¤¤¤ëJavadoc¥³¥á¥ó¥È¤Þ¤¿¤Ï¥¿¥°¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢·çÍ¤Æ¤¤¤ë¥³¥á¥ó¥È¤ä¥¯¥é¥¹¡¢¤Þ¤¿¤Ï·çÍ¤Æ¤¤¤ë\fI@return\fR¥¿¥°¤ä¥á¥½¥Ã¥É¾å¤ÎƱÍͤΥ¿¥°)¡£ ++\fBmissing\fR: ·çÍ¤Æ¤¤¤ëJavadoc¥³¥á¥ó¥È¤Þ¤¿¤Ï¥¿¥°¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢·çÍ¤Æ¤¤¤ë¥³¥á¥ó¥È¤ä¥¯¥é¥¹¡¢¤Þ¤¿¤Ï·çÍ¤Æ¤¤¤ë\fB@return\fR¥¿¥°¤ä¥á¥½¥Ã¥É¾å¤ÎƱÍͤΥ¿¥°)¡£ + .RE + .sp + .RS 4 +@@ -2342,7 +2421,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIreference\fR: Javadoc¥¿¥°¤ÎJava APIÍ×ÁǤλ²¾È¤Ë´ØÏ¢¤¹¤ëÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢\fI@see\fR¤Ç¸«¤Ä¤«¤é¤Ê¤¤¹àÌÜ¡¢¤Þ¤¿¤Ï\fI@param\fR¤Î¸å¤ÎÉÔÀµ¤Ê̾Á°)¡£ ++\fBreference\fR: Javadoc¥¿¥°¤ÎJava APIÍ×ÁǤλ²¾È¤Ë´ØÏ¢¤¹¤ëÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢\fB@see\fR¤Ç¸«¤Ä¤«¤é¤Ê¤¤¹àÌÜ¡¢¤Þ¤¿¤Ï\fB@param\fR¤Î¸å¤ÎÉÔÀµ¤Ê̾Á°)¡£ + .RE + .sp + .RS 4 +@@ -2353,25 +2432,26 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIsyntax\fR: ¥¨¥¹¥±¡¼¥×¤µ¤ì¤Æ¤¤¤Ê¤¤»³¥«¥Ã¥³(\fI<\fR¤ª¤è¤Ó\fI>\fR)¤ä¥¢¥ó¥Ñ¥µ¥ó¥É(\fI&\fR)¡¢Ìµ¸ú¤ÊJavadoc¥¿¥°¤Ê¤É¤Î²¼°Ì¥ì¥Ù¥ë¤ÎÌäÂê¤ò³Îǧ¤·¤Þ¤¹¡£ +-.RE +-.sp +-\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄꤷ¤Æ¡¢Ê£¿ô¤Î¥«¥Æ¥´¥ê¤Î¥¨¥é¡¼¤È·Ù¹ð¤ò¥Á¥§¥Ã¥¯¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢Á°¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¥«¥Æ¥´¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Î¤¤¤º¤ì¤«¤ò»ÈÍѤ·¤Æ¡¢\fIfilename\fR¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¡¢¹½Ê¸¤ª¤è¤Ó¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¤ÎÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ ++\fBsyntax\fR: ¥¨¥¹¥±¡¼¥×¤µ¤ì¤Æ¤¤¤Ê¤¤»³¥«¥Ã¥³(\fB<\fR¤ª¤è¤Ó\fB>\fR)¤ä¥¢¥ó¥Ñ¥µ¥ó¥É(\fB&\fR)¡¢Ìµ¸ú¤ÊJavadoc¥¿¥°¤Ê¤É¤Î²¼°Ì¥ì¥Ù¥ë¤ÎÌäÂê¤ò³Îǧ¤·¤Þ¤¹¡£ ++.RE ++.sp ++\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄꤷ¤Æ¡¢Ê£¿ô¤Î¥«¥Æ¥´¥ê¤Î¥¨¥é¡¼¤È·Ù¹ð¤ò¥Á¥§¥Ã¥¯¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢Á°¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¥«¥Æ¥´¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Î¤¤¤º¤ì¤«¤ò»ÈÍѤ·¤Æ¡¢\fIfilename\fR¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¡¢¹½Ê¸¤ª¤è¤Ó¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¤ÎÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-Xdoclint:html \-Xdoclint:syntax \-Xdoclint:accessibility \fIfilename\fR +-javadoc \-Xdoclint:html,syntax,accessibility \fIfilename\fR ++\fBjavadoc \-Xdoclint:html \-Xdoclint:syntax \-Xdoclint:accessibility \fR\fB\fIfilename\fR\fR ++\fBjavadoc \-Xdoclint:html,syntax,accessibility \fR\fB\fIfilename\fR\fR ++ + .fi + .if n \{\ + .RE + .\} + \fBÃí°Õ:\fR +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤ì¤é¤Î¥Á¥§¥Ã¥¯¤Î´°Á´À­¤ÏÊݾڤµ¤ì¤Þ¤»¤ó¡£¶ñÂÎŪ¤Ë¤Ï¡¢´°Á´¤ÊHTML¥³¥ó¥×¥é¥¤¥¢¥ó¥¹¡¦¥Á¥§¥Ã¥«¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\-\fIXdoclint\fR¥ª¥×¥·¥ç¥ó¤ÎÌÜŪ¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤òÍ­¸ú¤Ë¤·¤Æ°ìÈÌŪ¤Ê¥¨¥é¡¼¤ÎÂçȾ¤ò¥ì¥Ý¡¼¥È¤¹¤ë¤³¤È¤Ç¤¹¡£ +-.sp +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Ìµ¸ú¤ÊÆþÎϤν¤Àµ¤ò»î¹Ô¤»¤º¡¢¥ì¥Ý¡¼¥È¤Î¤ß¹Ô¤¤¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤ì¤é¤Î¥Á¥§¥Ã¥¯¤Î´°Á´À­¤ÏÊݾڤµ¤ì¤Þ¤»¤ó¡£¶ñÂÎŪ¤Ë¤Ï¡¢´°Á´¤ÊHTML¥³¥ó¥×¥é¥¤¥¢¥ó¥¹¡¦¥Á¥§¥Ã¥«¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\-\fBXdoclint\fR¥ª¥×¥·¥ç¥ó¤ÎÌÜŪ¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤òÍ­¸ú¤Ë¤·¤Æ°ìÈÌŪ¤Ê¥¨¥é¡¼¤ÎÂçȾ¤ò¥ì¥Ý¡¼¥È¤¹¤ë¤³¤È¤Ç¤¹¡£ ++.sp ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Ìµ¸ú¤ÊÆþÎϤν¤Àµ¤ò»î¹Ô¤»¤º¡¢¥ì¥Ý¡¼¥È¤Î¤ß¹Ô¤¤¤Þ¤¹¡£ + .RE + .PP + \-public +@@ -2396,18 +2476,18 @@ + .PP + \-help + .RS 4 +-¥ª¥ó¥é¥¤¥ó¡¦¥Ø¥ë¥×¤òɽ¼¨¤·¤Þ¤¹¡£\fIjavadoc\fR¤È\fI¥É¥Ã¥¯¥ì¥Ã¥È\fR¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£ ++¥ª¥ó¥é¥¤¥ó¡¦¥Ø¥ë¥×¤òɽ¼¨¤·¤Þ¤¹¡£\fBjavadoc\fR¤È\fB¥É¥Ã¥¯¥ì¥Ã¥È\fR¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-doclet \fIclass\fR + .RS 4 +-¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤òµ¯Æ°¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£´°Á´½¤¾þ̾¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤Ë¤è¤ê¡¢½ÐÎϤÎÆâÍƤȷÁ¼°¤¬ÄêµÁ¤µ¤ì¤Þ¤¹¡£\fI\-doclet\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¥Ç¥Õ¥©¥ë¥È¤ÎHTML·Á¼°¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¤Ë¤Ï\fIstart(Root)\fR¥á¥½¥Ã¥É¤¬´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Îµ¯Æ°¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤Ï\fI\-docletpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× ++¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤òµ¯Æ°¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£´°Á´½¤¾þ̾¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤Ë¤è¤ê¡¢½ÐÎϤÎÆâÍƤȷÁ¼°¤¬ÄêµÁ¤µ¤ì¤Þ¤¹¡£\fB\-doclet\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¥Ç¥Õ¥©¥ë¥È¤ÎHTML·Á¼°¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¤Ë¤Ï\fBstart(Root)\fR¥á¥½¥Ã¥É¤¬´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Îµ¯Æ°¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤Ï\fB\-docletpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/doclet/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + \-docletpath \fIclasspathlist\fR + .RS 4 +-\fI\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥É¥Ã¥¯¥ì¥Ã¥È³«»Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¤½¤Î¥¯¥é¥¹¤¬°Í¸¤¹¤ë¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£³«»Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÇJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ÀäÂХѥ¹¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIclasspathlist\fR¤ËÊ£¿ô¤Î¥Ñ¥¹¤äJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ì¤é¤òSolaris¤Î¾ì¹ç¤Ï¥³¥í¥ó(:)¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó(;)¤Ç¤½¤ì¤¾¤ì¶èÀÚ¤ê¤Þ¤¹¡£ÌÜŪ¤Î¥É¥Ã¥¯¥ì¥Ã¥È³«»Ï¥¯¥é¥¹¤¬¤¹¤Ç¤Ë¸¡º÷¥Ñ¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹¡£¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× ++\fB\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥É¥Ã¥¯¥ì¥Ã¥È³«»Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¤½¤Î¥¯¥é¥¹¤¬°Í¸¤¹¤ë¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£³«»Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÇJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ÀäÂХѥ¹¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBclasspathlist\fR¤ËÊ£¿ô¤Î¥Ñ¥¹¤äJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ì¤é¤òSolaris¤Î¾ì¹ç¤Ï¥³¥í¥ó(:)¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó(;)¤Ç¤½¤ì¤¾¤ì¶èÀÚ¤ê¤Þ¤¹¡£ÌÜŪ¤Î¥É¥Ã¥¯¥ì¥Ã¥È³«»Ï¥¯¥é¥¹¤¬¤¹¤Ç¤Ë¸¡º÷¥Ñ¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹¡£¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/doclet/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP +@@ -2418,7 +2498,7 @@ + .PP + \-source \fIrelease\fR + .RS 4 +-¼õ¤±ÉÕ¤±¤ë¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥ê¥ê¡¼¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fIrelease\fR¥Ñ¥é¥á¡¼¥¿¤Ë¤Ï¼¡¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¤­¤Ë»ÈÍѤ¹¤ëÃͤËÂбþ¤¹¤ë\fI¥ê¥ê¡¼¥¹\fR¤ÎÃͤò»ÈÍѤ·¤Þ¤¹¡£ ++¼õ¤±ÉÕ¤±¤ë¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥ê¥ê¡¼¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fBrelease\fR¥Ñ¥é¥á¡¼¥¿¤Ë¤Ï¼¡¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¤­¤Ë»ÈÍѤ¹¤ëÃͤËÂбþ¤¹¤ë\fB¥ê¥ê¡¼¥¹\fR¤ÎÃͤò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2428,7 +2508,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.5\fR¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.5¤ÇƳÆþ¤µ¤ì¤¿Áí¾Î¤ª¤è¤Ó¾¤Î¸À¸ìµ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Î¥³¥ó¥Ñ¥¤¥é¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤Ï¡¢1\&.5¤Î¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.5\fR¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.5¤ÇƳÆþ¤µ¤ì¤¿Áí¾Î¤ª¤è¤Ó¾¤Î¸À¸ìµ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Î¥³¥ó¥Ñ¥¤¥é¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤Ï¡¢1\&.5¤Î¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2439,7 +2519,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.4\fR¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.4¤ÇƳÆþ¤µ¤ì¤¿¥¢¥µ¡¼¥·¥ç¥ó¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ ++\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.4\fR¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.4¤ÇƳÆþ¤µ¤ì¤¿¥¢¥µ¡¼¥·¥ç¥ó¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2450,26 +2530,29 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.3\fR¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.3°Ê¹ß¤ËƳÆþ¤µ¤ì¤¿¥¢¥µ¡¼¥·¥ç¥ó¡¢Áí¾Î¡¢¤Þ¤¿¤Ï¾¤Î¸À¸ìµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¡£ ++\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.3\fR¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.3°Ê¹ß¤ËƳÆþ¤µ¤ì¤¿¥¢¥µ¡¼¥·¥ç¥ó¡¢Áí¾Î¡¢¤Þ¤¿¤Ï¾¤Î¸À¸ìµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¡£ + .RE + .RE + .PP + \-sourcepath \fIsourcepathlist\fR + .RS 4 +-¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤È¤­¤Ë¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸«¤Ä¤±¤ë¤¿¤á¤Î¸¡º÷¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ +-\fIÊ£¿ô¤Î¥Ñ¥¹¤Ï¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£\fR\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ΤߤǤʤ¯¡¢¤½¤ì¼«ÂΤϥɥ­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é·Ñ¾µ¤µ¤ì¤¿¥³¥á¥ó¥È¤ò»ý¤Ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î°ÌÃÖ¤â³Îǧ¤Ç¤­¤Þ¤¹¡£ +-.sp +-\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¸¡º÷¤µ¤ì¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÆÃÄꤹ¤ë¤Ë¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤¹¤ë¤«¡¢¡Ö1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½¡×¤Ë¼¨¤¹¤è¤¦¤Ë³Æ¥Õ¥¡¥¤¥ë¤ÎÁ°¤Ë¥Ñ¥¹¤ò´Þ¤á¤Þ¤¹¡£\fI\-sourcepath\fR¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ò»ÈÍѤ·¤Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹(\fI\-classpath\fR¤ò»²¾È)¡£¥Ç¥Õ¥©¥ë¥È¤Î\fI\-sourcepath\fR¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎÃͤǤ¹¡£\fI\-classpath\fR¤ò¾Êά¤·¤Æ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê)¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£ +-.sp +-\fIsourcepathlist\fR¤Ë¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢\fIcom\&.mypackage\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ë¡¢¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬/home/user/src/com/mypackage/*\&.java¤Ë¤¢¤ë¤È¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Ñ¥¹¤òcom\emypackage¤¬´Þ¤Þ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê/home/user/src¤Ë»ØÄꤷ¤Æ¤«¤é¡¢¼¡¤Î¤è¤¦¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤È¤­¤Ë¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸«¤Ä¤±¤ë¤¿¤á¤Î¸¡º÷¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ ++ ++Ê£¿ô¤Î¥Ñ¥¹¤Ï¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ΤߤǤʤ¯¡¢¤½¤ì¼«ÂΤϥɥ­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é·Ñ¾µ¤µ¤ì¤¿¥³¥á¥ó¥È¤ò»ý¤Ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î°ÌÃÖ¤â³Îǧ¤Ç¤­¤Þ¤¹¡£ ++.sp ++\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¸¡º÷¤µ¤ì¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÆÃÄꤹ¤ë¤Ë¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤¹¤ë¤«¡¢¡Ö1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½¡×¤Ë¼¨¤¹¤è¤¦¤Ë³Æ¥Õ¥¡¥¤¥ë¤ÎÁ°¤Ë¥Ñ¥¹¤ò´Þ¤á¤Þ¤¹¡£\fB\-sourcepath\fR¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ò»ÈÍѤ·¤Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹(\fB\-classpath\fR¤ò»²¾È)¡£¥Ç¥Õ¥©¥ë¥È¤Î\fB\-sourcepath\fR¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎÃͤǤ¹¡£\fB\-classpath\fR¤ò¾Êά¤·¤Æ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê)¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£ ++.sp ++\fBsourcepathlist\fR¤Ë¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢\fBcom\&.mypackage\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ë¡¢¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬/home/user/src/com/mypackage/*\&.java¤Ë¤¢¤ë¤È¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Ñ¥¹¤òcom\emypackage¤¬´Þ¤Þ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê/home/user/src¤Ë»ØÄꤷ¤Æ¤«¤é¡¢¼¡¤Î¤è¤¦¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /home/user/src/ com\&.mypackage ++\fBjavadoc \-sourcepath /home/user/src/ com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE +@@ -2484,7 +2567,8 @@ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /home/user1/src:/home/user2/src com\&.mypackage ++\fBjavadoc \-sourcepath /home/user1/src:/home/user2/src com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE +@@ -2493,43 +2577,47 @@ + .PP + \-classpath \fIclasspathlist\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬»²¾È¥¯¥é¥¹¤Î¸¡º÷¤ò¹Ô¤¦¤È¤­¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£»²¾È¥¯¥é¥¹¤È¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤È¡¢¤½¤ì¤é¤Î¥¯¥é¥¹¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î¤³¤È¤Ç¤¹¡£ +-\fIÊ£¿ô¤Î¥Ñ¥¹¤Ï¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£\fR\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£\fIclasspathlist\fR¤ÎÃͤò»ØÄꤹ¤ë¤È¤­¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ë¤¢¤ë»Ø¼¨¤Ë½¾¤Ã¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-\fI\-sourcepath\fR¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï\fI\-classpath\fR¤ò»ÈÍѤ·¤Æ¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹(²¼°Ì¸ß´¹À­¤Î¤¿¤á)¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÊÌ¡¹¤Î¥Ñ¥¹¤«¤é¸¡º÷¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-sourcepath\fR¤È\fI\-classpath\fR¤ÎξÊý¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢\fIcom\&.mypackage\fR¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ë¡¢¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥Ç¥£¥ì¥¯¥È¥ê/home/user/src/com/mypackage¤Ë¤¢¤ê¡¢¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬/home/user/libthenÆâ¤Î¥é¥¤¥Ö¥é¥ê¤Ë°Í¸¤·¤Æ¤¤¤ë¤È¤­¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬»²¾È¥¯¥é¥¹¤Î¸¡º÷¤ò¹Ô¤¦¤È¤­¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£»²¾È¥¯¥é¥¹¤È¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤È¡¢¤½¤ì¤é¤Î¥¯¥é¥¹¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î¤³¤È¤Ç¤¹¡£ ++ ++Ê£¿ô¤Î¥Ñ¥¹¤Ï¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£\fBclasspathlist\fR¤ÎÃͤò»ØÄꤹ¤ë¤È¤­¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ë¤¢¤ë»Ø¼¨¤Ë½¾¤Ã¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++\fB\-sourcepath\fR¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï\fB\-classpath\fR¤ò»ÈÍѤ·¤Æ¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹(¸åÊý¸ß´¹À­¤Î¤¿¤á)¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÊÌ¡¹¤Î¥Ñ¥¹¤«¤é¸¡º÷¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-sourcepath\fR¤È\fB\-classpath\fR¤ÎξÊý¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢\fBcom\&.mypackage\fR¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ë¡¢¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥Ç¥£¥ì¥¯¥È¥ê/home/user/src/com/mypackage¤Ë¤¢¤ê¡¢¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬/home/user/libÆâ¤Î¥é¥¤¥Ö¥é¥ê¤Ë°Í¸¤·¤Æ¤¤¤ë¤È¤­¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /home/user/lib \-classpath /home/user/src com\&.mypackage ++\fBjavadoc \-sourcepath /home/user/lib \-classpath /home/user/src com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE + .\} +-¾¤Î¥Ä¡¼¥ë¤ÈƱÍͤˡ¢\fI\-classpath\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ì¤Ð¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î´Ä¶­ÊÑ¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Á¤é¤âÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¥¯¥é¥¹¤ò¸¡º÷¤·¤Þ¤¹¡£ +-.sp +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬\fI\-classpath\fR¤ò»ÈÍѤ·¤Æ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤ò¸¡º÷¤¹¤ëÊýË¡¤Ë¤Ä¤¤¤Æ¤Î¡¢³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ä¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ë´ØÏ¢¤·¤¿¾ÜºÙ¤Ï¡¢¥¯¥é¥¹¤Î¸¡º÷ÊýË¡ ++¾¤Î¥Ä¡¼¥ë¤ÈƱÍͤˡ¢\fB\-classpath\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ì¤Ð¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î´Ä¶­ÊÑ¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Á¤é¤âÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¥¯¥é¥¹¤ò¸¡º÷¤·¤Þ¤¹¡£ ++.sp ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬\fB\-classpath\fR¤ò»ÈÍѤ·¤Æ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤ò¸¡º÷¤¹¤ëÊýË¡¤Ë¤Ä¤¤¤Æ¤Î¡¢³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ä¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ë´ØÏ¢¤·¤¿¾ÜºÙ¤Ï¡¢¥¯¥é¥¹¤Î¸¡º÷ÊýË¡ + (http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/findingclasses\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-*¤Î¥Ù¡¼¥¹Ì¾¤ò´Þ¤à¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁǤϡ¢\fI\&.jar\fR¤Þ¤¿¤Ï\fI\&.JAR\fR¤ò³ÈÄ¥»Ò¤Ë»ý¤Ä¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¥Ç¥£¥ì¥¯¥È¥ê\fImydir\fR¤Ë\fIa\&.jar\fR¤È\fIb\&.JA\fRR¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁÇ\fIfoo/*\fR¤Ï\fIA\&.jar:b\&.JAR\fR¤ËŸ³«¤µ¤ì¤Þ¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Î½çÈÖ¤Ï̤»ØÄê¤È¤Ê¤ê¤Þ¤¹¡£Èóɽ¼¨¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤à¡¢»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤¬¥ê¥¹¥È¤Ë´Þ¤Þ¤ì¤Þ¤¹¡£*¤«¤é¤Ê¤ë¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥¨¥ó¥È¥ê¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ËŸ³«¤µ¤ì¤Þ¤¹¡£\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤âƱÍͤËŸ³«¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÎŸ³«¤Ï¡¢Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î³«»ÏÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹¡£Java¥×¥í¥°¥é¥à¤Ï¡¢System\&.getenv(\fI"CLASSPATH"\fR)¤Î¸Æ¤Ó½Ð¤·¤Ë¤è¤Ã¤Æ¤Ê¤É¡¢´Ä¶­¤òÌ䤤¹ç¤»¤ë¾ì¹ç¤ò½ü¤­¡¢Å¸³«¤µ¤ì¤Æ¤¤¤Ê¤¤¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»²¾È¤·¤Þ¤»¤ó¡£ ++*¤Î¥Ù¡¼¥¹Ì¾¤ò´Þ¤à¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁǤϡ¢\fB\&.jar\fR¤Þ¤¿¤Ï\fB\&.JAR\fR¤ò³ÈÄ¥»Ò¤Ë»ý¤Ä¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¥Ç¥£¥ì¥¯¥È¥ê\fBmydir\fR¤Ë\fBa\&.jar\fR¤È\fBb\&.JA\fRR¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁÇ\fBfoo/*\fR¤Ï\fBA\&.jar:b\&.JAR\fR¤ËŸ³«¤µ¤ì¤Þ¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Î½çÈÖ¤Ï̤»ØÄê¤È¤Ê¤ê¤Þ¤¹¡£Èóɽ¼¨¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤à¡¢»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤¬¥ê¥¹¥È¤Ë´Þ¤Þ¤ì¤Þ¤¹¡£*¤«¤é¤Ê¤ë¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥¨¥ó¥È¥ê¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ËŸ³«¤µ¤ì¤Þ¤¹¡£\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤âƱÍͤËŸ³«¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÎŸ³«¤Ï¡¢Java Virtual Machine (JVM)¤Î³«»ÏÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹¡£Java¥×¥í¥°¥é¥à¤Ï¡¢System\&.getenv(\fB"CLASSPATH"\fR)¤Î¸Æ¤Ó½Ð¤·¤Ë¤è¤Ã¤Æ¤Ê¤É¡¢´Ä¶­¤òÌ䤤¹ç¤»¤ë¾ì¹ç¤ò½ü¤­¡¢Å¸³«¤µ¤ì¤Æ¤¤¤Ê¤¤¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»²¾È¤·¤Þ¤»¤ó¡£ + .RE + .PP + \-subpackages \fIpackage1:package2:\&.\&.\&.\fR + .RS 4 +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËºÆµ¢Åª¤Ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¿·¤·¤¤¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤òÄɲ乤ëºÝ¤ËÊØÍø¤Ç¤¹¡£¿·¤·¤¤¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤¬¼«Æ°Åª¤ËÁȤ߹þ¤Þ¤ì¤ë¤«¤é¤Ç¤¹¡£³Æpackage°ú¿ô¤Ï¡¢Ç¤°Õ¤ÎºÇ¾å°Ì¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸(\fIjava\fR¤Ê¤É)¤Þ¤¿¤Ï´°Á´½¤¾þ¥Ñ¥Ã¥±¡¼¥¸(\fIjavax\&.swing\fR¤Ê¤É)¤Ë¤Ê¤ê¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£°ú¿ô¤Ï¡¢¤¹¤Ù¤Æ¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¡¢¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¸¡º÷¾ì½ê¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fI\-sourcepath\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Ë¸ºß¤¹¤ë¤¬¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Ê¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò½èÍý¤·¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fIjava\fR¤ª¤è¤Ó\fIjavax\&.swing\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤È¤³¤ì¤é¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Á´Éô¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËºÆµ¢Åª¤Ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¿·¤·¤¤¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤òÄɲ乤ëºÝ¤ËÊØÍø¤Ç¤¹¡£¿·¤·¤¤¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤¬¼«Æ°Åª¤ËÁȤ߹þ¤Þ¤ì¤ë¤«¤é¤Ç¤¹¡£³Æpackage°ú¿ô¤Ï¡¢Ç¤°Õ¤ÎºÇ¾å°Ì¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸(\fBjava\fR¤Ê¤É)¤Þ¤¿¤Ï´°Á´½¤¾þ¥Ñ¥Ã¥±¡¼¥¸(\fBjavax\&.swing\fR¤Ê¤É)¤Ë¤Ê¤ê¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£°ú¿ô¤Ï¡¢¤¹¤Ù¤Æ¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¡¢¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¸¡º÷¾ì½ê¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fB\-sourcepath\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Ë¸ºß¤¹¤ë¤¬¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Ê¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò½èÍý¤·¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fBjava\fR¤ª¤è¤Ó\fBjavax\&.swing\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤È¤³¤ì¤é¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Á´Éô¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d docs \-sourcepath /home/user/src \-subpackages java:javax\&.swing ++\fBjavadoc \-d docs \-sourcepath /home/user/src \-subpackages java:javax\&.swing \fR ++ + .fi + .if n \{\ + .RE +@@ -2538,16 +2626,17 @@ + .PP + \-exclude \fIpackagename1:packagename2:\&.\&.\&.\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò\fI\-subpackages\fR¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿¥ê¥¹¥È¤«¤é̵¾ò·ï¤Ë½ü³°¤·¤Þ¤¹¡£²áµî¤Þ¤¿¤Ï¾­Íè¤Î\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤Î»ØÄê¤Ë¤è¤Ã¤ÆÁȤ߹þ¤Þ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¤â½ü³°¤ÎÂоݤȤʤê¤Þ¤¹¡£ +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIjava\&.io\fR¡¢\fIjava\&.util\fR¡¢\fIjava\&.math\fR¤Ê¤É¤ÏÁȤ߹þ¤Þ¤ì¤Þ¤¹¤¬¡¢\fIjava\&.net\fR¤È\fIjava\&.lang\fR¤ò¥ë¡¼¥È¤Ë»ý¤Ä¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤Þ¤¹¡£\fIjava\&.lang\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ç¤¢¤ë\fIjava\&.lang\&.ref\fR¤¬½ü³°¤µ¤ì¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ++»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò\fB\-subpackages\fR¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿¥ê¥¹¥È¤«¤é̵¾ò·ï¤Ë½ü³°¤·¤Þ¤¹¡£²áµî¤Þ¤¿¤Ï¾­Íè¤Î\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤Î»ØÄê¤Ë¤è¤Ã¤ÆÁȤ߹þ¤Þ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¤â½ü³°¤ÎÂоݤȤʤê¤Þ¤¹¡£ ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBjava\&.io\fR¡¢\fBjava\&.util\fR¡¢\fBjava\&.math\fR¤Ê¤É¤ÏÁȤ߹þ¤Þ¤ì¤Þ¤¹¤¬¡¢\fBjava\&.net\fR¤È\fBjava\&.lang\fR¤ò¥ë¡¼¥È¤Ë»ý¤Ä¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤Þ¤¹¡£\fBjava\&.lang\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ç¤¢¤ë\fBjava\&.lang\&.ref\fR¤¬½ü³°¤µ¤ì¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /home/user/src \-subpackages java \-exclude +- java\&.net:java\&.lang ++\fBjavadoc \-sourcepath /home/user/src \-subpackages java \-exclude \fR ++\fB java\&.net:java\&.lang\fR ++ + .fi + .if n \{\ + .RE +@@ -2556,30 +2645,30 @@ + .PP + \-bootclasspath \fIclasspathlist\fR + .RS 4 +-¥Ö¡¼¥È¡¦¥¯¥é¥¹¤¬Â¸ºß¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¡¦¥¯¥é¥¹¤È¤Ï¡¢Ä̾Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥¯¥é¥¹¤Î¤³¤È¤Ç¤¹¡£\fIbootclasspath\fR¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òõ¤¹¤È¤­¤Ë»ÈÍѤ¹¤ë¸¡º÷¥Ñ¥¹¤Î°ìÉô¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢¥¯¥é¥¹¤Î¸¡½ÐÊýË¡ ++¥Ö¡¼¥È¡¦¥¯¥é¥¹¤¬Â¸ºß¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¡¦¥¯¥é¥¹¤È¤Ï¡¢Ä̾Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥¯¥é¥¹¤Î¤³¤È¤Ç¤¹¡£\fBbootclasspath\fR¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òõ¤¹¤È¤­¤Ë»ÈÍѤ¹¤ë¸¡º÷¥Ñ¥¹¤Î°ìÉô¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢¥¯¥é¥¹¤Î¸¡½ÐÊýË¡ + (http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/findingclasses\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fIclasspathlist\fR¥Ñ¥é¥á¡¼¥¿Æâ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥»¥ß¥³¥í¥ó(;)¤Ç¶èÀÚ¤ë(Windows¤Î¾ì¹ç)¤«¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹(Oracle Solaris¤Î¾ì¹ç)¡£ ++\fBclasspathlist\fR¥Ñ¥é¥á¡¼¥¿Æâ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥»¥ß¥³¥í¥ó(;)¤Ç¶èÀÚ¤ë(Windows¤Î¾ì¹ç)¤«¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹(Oracle Solaris¤Î¾ì¹ç)¡£ + .RE + .PP + \-extdirs \fIdirist\fR + .RS 4 +-³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤¬Â¸ºß¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤È¤Ï¡¢Java³ÈÄ¥µ¡Ç½µ¡¹½¤ò»ÈÍѤ¹¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¤¹¡£\fIextdirs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òõ¤¹¤È¤­¤Ë»ÈÍѤ¹¤ë¸¡º÷¥Ñ¥¹¤Î°ìÉô¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fIdirlist\fRÆâ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥»¥ß¥³¥í¥ó(;)¤Ç¶èÀÚ¤ë(Windows¤Î¾ì¹ç)¤«¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹(Oracle Solaris¤Î¾ì¹ç)¡£ ++³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤¬Â¸ºß¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤È¤Ï¡¢Java³ÈÄ¥µ¡Ç½µ¡¹½¤ò»ÈÍѤ¹¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¤¹¡£\fBextdirs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òõ¤¹¤È¤­¤Ë»ÈÍѤ¹¤ë¸¡º÷¥Ñ¥¹¤Î°ìÉô¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fBdirlist\fRÆâ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥»¥ß¥³¥í¥ó(;)¤Ç¶èÀÚ¤ë(Windows¤Î¾ì¹ç)¤«¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹(Oracle Solaris¤Î¾ì¹ç)¡£ + .RE + .PP + \-verbose + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹ÔÃæ¤Ë¾ÜºÙ¤Ê¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£\fIverbose\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É»þ¡¢¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®»þ(¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë1¤Ä¤Î¥á¥Ã¥»¡¼¥¸)¡¢¤ª¤è¤Ó¥½¡¼¥È»þ¤Ë¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£verbose¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢³ÆJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î²òÀϤËÍפ·¤¿»þ´Ö(¥ß¥êÉÃñ°Ì)¤ò¼¨¤¹ÄɲäΥá¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹ÔÃæ¤Ë¾ÜºÙ¤Ê¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£\fBverbose\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É»þ¡¢¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®»þ(¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë1¤Ä¤Î¥á¥Ã¥»¡¼¥¸)¡¢¤ª¤è¤Ó¥½¡¼¥È»þ¤Ë¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£verbose¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢³ÆJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î²òÀϤËÍפ·¤¿»þ´Ö(¥ß¥êÉÃñ°Ì)¤ò¼¨¤¹ÄɲäΥá¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-quiet + .RS 4 +-¥á¥Ã¥»¡¼¥¸¤òÍÞÀ©¤·¡¢·Ù¹ð¤È¥¨¥é¡¼¤Î¤ß¤¬É½¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¡¢¤³¤ì¤é¤ò³Îǧ¤·¤ä¤¹¤¯¤·¤Þ¤¹¡£\fIversion\fRʸ»úÎó¤âÍ޻ߤ·¤Þ¤¹¡£ ++¥á¥Ã¥»¡¼¥¸¤òÍÞÀ©¤·¡¢·Ù¹ð¤È¥¨¥é¡¼¤Î¤ß¤¬É½¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¡¢¤³¤ì¤é¤ò³Îǧ¤·¤ä¤¹¤¯¤·¤Þ¤¹¡£\fBversion\fRʸ»úÎó¤âÍ޻ߤ·¤Þ¤¹¡£ + .RE + .PP + \-breakiterator + .RS 4 +-±Ñ¸ì¤Î¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î¼çÀâÌÀ¤ÎºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ëºÝ¤Ë¡¢\fIjava\&.text\&.BreakIterator\fR¤Î¹ñºÝ²½¤µ¤ì¤¿Ê¸¶­³¦¤ò»ÈÍѤ·¤Þ¤¹¡£Â¾¤Î¤¹¤Ù¤Æ¤Î¥í¥±¡¼¥ë¤Ï¡¢±Ñ¸ì¸À¸ì¤È¤¤¤¦¥í¥±¡¼¥ë¸ÇÍ­¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤Ï¤Ê¤¯¡¢¤¹¤Ç¤Ë\fIBreakIterator\fR¥¯¥é¥¹¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ºÇ½é¤Îʸ¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î¥µ¥Þ¥ê¡¼¤Ë¥³¥Ô¡¼¤µ¤ì¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Îº÷°ú¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£JDK 1\&.2°Ê¹ß¡¢\fIBreakIterator\fR¥¯¥é¥¹¤Ï¡¢±Ñ¸ì¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¸À¸ì¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ë¤¿¤á¤Ë¡¢¤¹¤Ç¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fI\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢1\&.2°Ê¹ß¤Ç¤Ï±Ñʸ°Ê³°¤Ë¤Ï¸ú²Ì¤¬¤¢¤ê¤Þ¤»¤ó¡£±Ñʸ¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÆȼ«¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥¢¥ë¥´¥ê¥º¥à¤¬¤¢¤ê¤Þ¤¹¡£ ++±Ñ¸ì¤Î¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î¼çÀâÌÀ¤ÎºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ëºÝ¤Ë¡¢\fBjava\&.text\&.BreakIterator\fR¤Î¹ñºÝ²½¤µ¤ì¤¿Ê¸¶­³¦¤ò»ÈÍѤ·¤Þ¤¹¡£Â¾¤Î¤¹¤Ù¤Æ¤Î¥í¥±¡¼¥ë¤Ï¡¢±Ñ¸ì¸À¸ì¤È¤¤¤¦¥í¥±¡¼¥ë¸ÇÍ­¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤Ï¤Ê¤¯¡¢¤¹¤Ç¤Ë\fBBreakIterator\fR¥¯¥é¥¹¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ºÇ½é¤Îʸ¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î¥µ¥Þ¥ê¡¼¤Ë¥³¥Ô¡¼¤µ¤ì¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Îº÷°ú¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£JDK 1\&.2°Ê¹ß¡¢\fBBreakIterator\fR¥¯¥é¥¹¤Ï¡¢±Ñ¸ì¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¸À¸ì¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ë¤¿¤á¤Ë¡¢¤¹¤Ç¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fB\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢1\&.2°Ê¹ß¤Ç¤Ï±Ñʸ°Ê³°¤Ë¤Ï¸ú²Ì¤¬¤¢¤ê¤Þ¤»¤ó¡£±Ñʸ¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÆȼ«¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥¢¥ë¥´¥ê¥º¥à¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2589,7 +2678,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-±Ñʸ¤Î¥Ç¥Õ¥©¥ë¥È¤Îʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¡£¶õÇòʸ»ú¤Þ¤¿¤ÏHTML¥Ö¥í¥Ã¥¯¡¦¥¿¥°(\fI<P>\fR¤Ê¤É)¤¬Â³¤¯¥Ô¥ê¥ª¥É¤ÇÄä»ß¤·¤Þ¤¹¡£ ++±Ñʸ¤Î¥Ç¥Õ¥©¥ë¥È¤Îʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¡£¶õÇòʸ»ú¤Þ¤¿¤ÏHTML¥Ö¥í¥Ã¥¯¡¦¥¿¥°(\fB<P>\fR¤Ê¤É)¤¬Â³¤¯¥Ô¥ê¥ª¥É¤ÇÄä»ß¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2600,45 +2689,46 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-breakiteratorʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¡£¼¡¤Î¸ì¤¬Âçʸ»ú¤Ç»Ï¤Þ¤ë¾ì¹ç¡¢¶õÇòʸ»ú¤¬Â³¤¯¥Ô¥ê¥ª¥É¡¢µ¿ÌäÉä¡¢¤Þ¤¿¤Ï´¶Ã²Éä¤ÇÄä»ß¤·¤Þ¤¹¡£¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤Ï¡ÖThe serial no\&. is valid¡×¤Ê¤É¡¢¤Û¤È¤ó¤É¤Î¾Êάɽµ­¤¬½èÍý¤µ¤ì¤Þ¤¹¤¬¡¢¡ÖMr\&. Smith¡×¤Ï½èÍý¤µ¤ì¤Þ¤»¤ó¡£\fI\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢HTML¥¿¥°¤ä¡¢¿ô»ú¤Þ¤¿¤Ïµ­¹æ¤Ç»Ï¤Þ¤ëʸ¤Ç¤ÏÄä»ß¤·¤Þ¤»¤ó¡£HTML¥¿¥°¤ËËä¤á¹þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ç¤â¡¢¡Ö\&.\&./filename¡×¤ÎºÇ¸å¤Î¥Ô¥ê¥ª¥É¤ÇÄä»ß¤·¤Þ¤¹¡£ +-.RE +-.sp +-Java SE 1\&.5¤Ç¤Ï\fI\-breakiterator\fR·Ù¹ð¥á¥Ã¥»¡¼¥¸¤¬ºï½ü¤µ¤ì¡¢¥Ç¥Õ¥©¥ë¥È¤Îʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¤ÏÊѹ¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤òÊѹ¹¤»¤º¡¢SE 1\&.4\&.x¤Ç¤Î\fI\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Î·Ù¹ð¤ò½üµî¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ç¤â¡¢²¿¤â¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£Java SE 1\&.5\&.0¤«¤é¤Ï·Ù¹ð¤Ï¾ÃÌǤ·¤Æ¤¤¤Þ¤¹¡£ ++breakiteratorʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¡£¼¡¤Î¸ì¤¬Âçʸ»ú¤Ç»Ï¤Þ¤ë¾ì¹ç¡¢¶õÇòʸ»ú¤¬Â³¤¯¥Ô¥ê¥ª¥É¡¢µ¿ÌäÉä¡¢¤Þ¤¿¤Ï´¶Ã²Éä¤ÇÄä»ß¤·¤Þ¤¹¡£¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤Ï¡ÖThe serial no\&. is valid¡×¤Ê¤É¡¢¤Û¤È¤ó¤É¤Î¾Êάɽµ­¤¬½èÍý¤µ¤ì¤Þ¤¹¤¬¡¢¡ÖMr\&. Smith¡×¤Ï½èÍý¤µ¤ì¤Þ¤»¤ó¡£\fB\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢HTML¥¿¥°¤ä¡¢¿ô»ú¤Þ¤¿¤Ïµ­¹æ¤Ç»Ï¤Þ¤ëʸ¤Ç¤ÏÄä»ß¤·¤Þ¤»¤ó¡£HTML¥¿¥°¤ËËä¤á¹þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ç¤â¡¢¡Ö\&.\&./filename¡×¤ÎºÇ¸å¤Î¥Ô¥ê¥ª¥É¤ÇÄä»ß¤·¤Þ¤¹¡£ ++.RE ++.sp ++Java SE 1\&.5¤Ç¤Ï\fB\-breakiterator\fR·Ù¹ð¥á¥Ã¥»¡¼¥¸¤¬ºï½ü¤µ¤ì¡¢¥Ç¥Õ¥©¥ë¥È¤Îʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¤ÏÊѹ¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤òÊѹ¹¤»¤º¡¢SE 1\&.4\&.x¤Ç¤Î\fB\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Î·Ù¹ð¤ò½üµî¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ç¤â¡¢²¿¤â¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£Java SE 1\&.5\&.0¤«¤é¤Ï·Ù¹ð¤Ï¾ÃÌǤ·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-locale \fIlanguage_country_variant\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥í¥±¡¼¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î°ú¿ô¤Ï¡¢\fIj\fR\fIava\&.util\&.Locale\fR¥É¥­¥å¥á¥ó¥È¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢\fIen_US\fR +-(±Ñ¸ì¡¢Êƹñ)¤Þ¤¿¤Ï\fIen_US_WIN\fR ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥í¥±¡¼¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î°ú¿ô¤Ï¡¢\fBj\fR\fBava\&.util\&.Locale\fR¥É¥­¥å¥á¥ó¥È¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢\fBen_US\fR ++(±Ñ¸ì¡¢Êƹñ)¤Þ¤¿¤Ï\fBen_US_WIN\fR + (Windows¥Ð¥ê¥¢¥ó¥È)¤Ê¤É¤Î¥í¥±¡¼¥ë¤Î̾Á°¤Ç¤¹¡£ + .sp + \fBÃí°Õ:\fR +-\fI\-locale\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¡¢¤Þ¤¿¤Ï¤½¤Î¾¤ÎǤ°Õ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤è¤êÁ°(º¸Â¦)¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤·¤Ê¤¤¤È¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤¬±Ñ¸ì¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Î¤ß¡¢»ØÄꤹ¤ë½ç½ø¤Ë°Í¸¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-¥í¥±¡¼¥ë¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥í¥±¡¼¥ë¤Î¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÁªÂò¤µ¤ì¤Æ¡¢¥á¥Ã¥»¡¼¥¸(¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¡¢¥ê¥¹¥È¤Èɽ¤Î¸«½Ð¤·¡¢¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤ÎÌܼ¡¡¢stylesheet\&.css¤Î¥³¥á¥ó¥È¤Ê¤É¤Îʸ»úÎó)¤Î¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ë¥½¡¼¥È¤µ¤ì¤ë¥ê¥¹¥È¤Î¥½¡¼¥È½ç¡¢¤ª¤è¤ÓºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ë¤¿¤á¤Îʸ¤Î¶èÀÚ¤êʸ»ú¤â¡¢»ØÄꤷ¤¿¥í¥±¡¼¥ë¤Ë¤è¤Ã¤Æ·è¤Þ¤ê¤Þ¤¹¡£\fI\-locale\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ç»ØÄꤵ¤ì¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È¤Î¥í¥±¡¼¥ë¤ò·èÄꤹ¤ë¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++\fB\-locale\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¡¢¤Þ¤¿¤Ï¤½¤Î¾¤ÎǤ°Õ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤è¤êÁ°(º¸Â¦)¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤·¤Ê¤¤¤È¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤¬±Ñ¸ì¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Î¤ß¡¢»ØÄꤹ¤ë½ç½ø¤Ë°Í¸¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¥í¥±¡¼¥ë¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥í¥±¡¼¥ë¤Î¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÁªÂò¤µ¤ì¤Æ¡¢¥á¥Ã¥»¡¼¥¸(¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¡¢¥ê¥¹¥È¤Èɽ¤Î¸«½Ð¤·¡¢¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤ÎÌܼ¡¡¢stylesheet\&.css¤Î¥³¥á¥ó¥È¤Ê¤É¤Îʸ»úÎó)¤Î¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ë¥½¡¼¥È¤µ¤ì¤ë¥ê¥¹¥È¤Î¥½¡¼¥È½ç¡¢¤ª¤è¤ÓºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ë¤¿¤á¤Îʸ¤Î¶èÀÚ¤êʸ»ú¤â¡¢»ØÄꤷ¤¿¥í¥±¡¼¥ë¤Ë¤è¤Ã¤Æ·è¤Þ¤ê¤Þ¤¹¡£\fB\-locale\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ç»ØÄꤵ¤ì¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È¤Î¥í¥±¡¼¥ë¤ò·èÄꤹ¤ë¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .RE + .PP + \-encoding + .RS 4 +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°(\fIEUCJIS/SJIS\fR¤Ê¤É)¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥Ð¡¼¥¿¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°(\fBEUCJIS/SJIS\fR¤Ê¤É)¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥Ð¡¼¥¿¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-J\fIflag\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëJava Runtime Environment (JRE)¤Ë¡¢\fIflag\fR¤òľÀÜÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤ò½èÍý¤¹¤ë¤¿¤á¤Ë¥·¥¹¥Æ¥à¤Ç32MB¤Î¥á¥â¥ê¡¼¤ò³ÎÊݤ·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-Xmx\fR¥ª¥×¥·¥ç¥ó¤ò¼¡¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤·¤Þ¤¹¡£\fIjavadoc \-J\-Xmx32m \-J\-Xms32m com\&.mypackage\fR¡£\fI\-Xms\fR¤Ï¾Êά²Äǽ¤Ç¡¢¤³¤ì¤Ï½é´ü¥á¥â¥ê¡¼¤Î¥µ¥¤¥º¤òÀßÄꤹ¤ë¤Î¤ß¤Î¥ª¥×¥·¥ç¥ó¤Ç¡¢É¬Íפʥá¥â¥ê¡¼¤ÎºÇ¾®Î̤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ +-.sp +-\fIJ\fR¤È\fIflag\fR¤Î´Ö¤Ë¶õÇòʸ»ú¤Ï¤¢¤ê¤Þ¤»¤ó¡£ +-.sp +-»ÈÍѤ·¤Æ¤¤¤ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò³Îǧ¤¹¤ë¤Ë¤Ï\fI\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë¤Ïɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥Ð¡¼¥¸¥ç¥óÈֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£Javadoc¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëJava Runtime Environment (JRE)¤Ë¡¢\fBflag\fR¤òľÀÜÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤ò½èÍý¤¹¤ë¤¿¤á¤Ë¥·¥¹¥Æ¥à¤Ç32MB¤Î¥á¥â¥ê¡¼¤ò³ÎÊݤ·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-Xmx\fR¥ª¥×¥·¥ç¥ó¤ò¼¡¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤·¤Þ¤¹¡£\fBjavadoc \-J\-Xmx32m \-J\-Xms32m com\&.mypackage\fR¡£\fB\-Xms\fR¤Ï¾Êά²Äǽ¤Ç¡¢¤³¤ì¤Ï½é´ü¥á¥â¥ê¡¼¤Î¥µ¥¤¥º¤òÀßÄꤹ¤ë¤Î¤ß¤Î¥ª¥×¥·¥ç¥ó¤Ç¡¢É¬Íפʥá¥â¥ê¡¼¤ÎºÇ¾®Î̤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ ++.sp ++\fBJ\fR¤È\fBflag\fR¤Î´Ö¤Ë¶õÇòʸ»ú¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.sp ++»ÈÍѤ·¤Æ¤¤¤ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò³Îǧ¤¹¤ë¤Ë¤Ï\fB\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë¤Ïɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥Ð¡¼¥¸¥ç¥óÈֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£Javadoc¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-J\-version +-java version "1\&.7\&.0_09" +-Java(TM) SE Runtime Environment (build 1\&.7\&.0_09\-b05) +-Java HotSpot(TM) 64\-Bit Server VM (build 23\&.5\-b02, mixed mode) ++\fBjavadoc \-J\-version\fR ++\fBjava version "1\&.7\&.0_09"\fR ++\fBJava(TM) SE Runtime Environment (build 1\&.7\&.0_09\-b05)\fR ++\fBJava HotSpot(TM) 64\-Bit Server VM (build 23\&.5\-b02, mixed mode)\fR ++ + .fi + .if n \{\ + .RE +@@ -2648,24 +2738,24 @@ + .PP + \-d \fIdirectory\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬À¸À®¤µ¤ì¤¿HTML¥Õ¥¡¥¤¥ë¤òÊݸ¤¹¤ëÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-d\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤µ¤ì¤Þ¤¹¡£\fIdirectory\fR¤ÎÃͤˤϡ¢ÀäÂХǥ£¥ì¥¯¥È¥ê¡¢¤Þ¤¿¤Ï¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХǥ£¥ì¥¯¥È¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Java SE 1\&.4¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤ÈÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤¬¼«Æ°Åª¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤ÎÎã¤Ç¤Ï¡¢\fIcom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢¤½¤Î·ë²Ì¤¬\fI/user/doc/ \fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤µ¤ì¤Þ¤¹¡£\fIjavadoc \-d \fR\fI/user/doc/ \fR\fIcom\&.mypackage\fR ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬À¸À®¤µ¤ì¤¿HTML¥Õ¥¡¥¤¥ë¤òÊݸ¤¹¤ëÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-d\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤µ¤ì¤Þ¤¹¡£\fBdirectory\fR¤ÎÃͤˤϡ¢ÀäÂХǥ£¥ì¥¯¥È¥ê¡¢¤Þ¤¿¤Ï¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХǥ£¥ì¥¯¥È¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Java SE 1\&.4¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤ÈÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤¬¼«Æ°Åª¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¼¡¤ÎÎã¤Ç¤Ï¡¢\fBcom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢¤½¤Î·ë²Ì¤¬/user/doc/ ¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤µ¤ì¤Þ¤¹¡£\fBjavadoc \-d \fR\fB/user/doc/ \fR\fBcom\&.mypackage\fR + .RE + .PP + \-use + .RS 4 +-¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤Ä¤Î»ÈÍÑ¥Ú¡¼¥¸¤òÁȤ߹þ¤ß¤Þ¤¹¡£¤³¤Î¥Ú¡¼¥¸¤Ë¤Ï¡¢¤½¤ÎÆÃÄê¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤ÎAPI¤ò»ÈÍѤ·¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤¬µ­½Ò¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹C¤òÎã¤Ë¤È¤ë¤È¡¢¥¯¥é¥¹C¤ò»ÈÍѤ·¤Æ¤¤¤ë¤â¤Î¤È¤·¤Æ¤Ï¡¢C¤Î¥µ¥Ö¥¯¥é¥¹¡¢C¤È¤·¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤ë¥Õ¥£¡¼¥ë¥É¡¢C¤òÊÖ¤¹¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó·¿C¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¥á¥½¥Ã¥É¤È¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIString\fR·¿ÍѤλÈÍÑ¥Ú¡¼¥¸¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£\fIjava\&.awt\&.Font\fR¥¯¥é¥¹¤Î\fIgetName\fR¥á¥½¥Ã¥É¤Ï\fIString\fR·¿¤òÌ᤹¤Î¤Ç¡¢\fIgetName\fR¥á¥½¥Ã¥É¤Ï\fIString\fR¤ò»ÈÍѤ·¡¢\fIgetName\fR¥á¥½¥Ã¥É¤¬\fIString\fRÍѤλÈÍÑ¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¼ÂÁõ¤Ç¤Ï¤Ê¤¯API¤Î»ÈÍѤΤߤò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£¥á¥½¥Ã¥É¤¬¤½¤Î¼ÂÁõ¤Ç\fIString\fR¤ò»ÈÍѤ¹¤ë¤¬¡¢°ú¿ô¤È¤·¤Æʸ»úÎó¤ò¼è¤é¤Ê¤¤¡¢¤Þ¤¿¤Ïʸ»úÎó¤òÊÖ¤µ¤Ê¤¤¾ì¹ç¡¢¤½¤ì¤Ï\fIString\fR¤Î»ÈÍѤȤϤߤʤµ¤ì¤Þ¤»¤ó¡£À¸À®¤µ¤ì¤¿»ÈÍÑ¥Ú¡¼¥¸¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ë°ÜÆ°¤·¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î\fB¥ê¥ó¥¯¤Î»ÈÍÑ\fR¤ò¥¯¥ê¥Ã¥¯¤·¤Þ¤¹¡£ ++¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤Ä¤Î»ÈÍÑ¥Ú¡¼¥¸¤òÁȤ߹þ¤ß¤Þ¤¹¡£¤³¤Î¥Ú¡¼¥¸¤Ë¤Ï¡¢¤½¤ÎÆÃÄê¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤ÎAPI¤ò»ÈÍѤ·¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤¬µ­½Ò¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹C¤òÎã¤Ë¤È¤ë¤È¡¢¥¯¥é¥¹C¤ò»ÈÍѤ·¤Æ¤¤¤ë¤â¤Î¤È¤·¤Æ¤Ï¡¢C¤Î¥µ¥Ö¥¯¥é¥¹¡¢C¤È¤·¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤ë¥Õ¥£¡¼¥ë¥É¡¢C¤òÊÖ¤¹¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó·¿C¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¥á¥½¥Ã¥É¤È¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBString\fR·¿ÍѤλÈÍÑ¥Ú¡¼¥¸¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£\fBjava\&.awt\&.Font\fR¥¯¥é¥¹¤Î\fBgetName\fR¥á¥½¥Ã¥É¤Ï\fBString\fR·¿¤òÌ᤹¤Î¤Ç¡¢\fBgetName\fR¥á¥½¥Ã¥É¤Ï\fBString\fR¤ò»ÈÍѤ·¡¢\fBgetName\fR¥á¥½¥Ã¥É¤¬\fBString\fRÍѤλÈÍÑ¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¼ÂÁõ¤Ç¤Ï¤Ê¤¯API¤Î»ÈÍѤΤߤò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£¥á¥½¥Ã¥É¤¬¤½¤Î¼ÂÁõ¤Ç\fBString\fR¤ò»ÈÍѤ¹¤ë¤¬¡¢°ú¿ô¤È¤·¤Æʸ»úÎó¤ò¼è¤é¤Ê¤¤¡¢¤Þ¤¿¤Ïʸ»úÎó¤òÊÖ¤µ¤Ê¤¤¾ì¹ç¡¢¤½¤ì¤Ï\fBString\fR¤Î»ÈÍѤȤϤߤʤµ¤ì¤Þ¤»¤ó¡£À¸À®¤µ¤ì¤¿»ÈÍÑ¥Ú¡¼¥¸¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ë°ÜÆ°¤·¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î\fB¥ê¥ó¥¯¤Î»ÈÍÑ\fR¤ò¥¯¥ê¥Ã¥¯¤·¤Þ¤¹¡£ + .RE + .PP + \-version + .RS 4 +-À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢@version¤Î¥Æ¥­¥¹¥È¤òÁȤ߹þ¤ß¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¾Êά¤µ¤ì¤Þ¤¹¡£»ÈÍѤ·¤Æ¤¤¤ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò³Îǧ¤¹¤ë¤Ë¤Ï\fI\-J\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢@version¤Î¥Æ¥­¥¹¥È¤òÁȤ߹þ¤ß¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¾Êά¤µ¤ì¤Þ¤¹¡£»ÈÍѤ·¤Æ¤¤¤ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò³Îǧ¤¹¤ë¤Ë¤Ï\fB\-J\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-author + .RS 4 +-À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢\fI@author\fR¤Î¥Æ¥­¥¹¥È¤òÁȤ߹þ¤ß¤Þ¤¹¡£ ++À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢\fB@author\fR¤Î¥Æ¥­¥¹¥È¤òÁȤ߹þ¤ß¤Þ¤¹¡£ + .RE + .PP + \-splitindex +@@ -2675,27 +2765,27 @@ + .PP + \-windowtitle \fItitle\fR + .RS 4 +-HTML¤Î\fI<title>\fR¥¿¥°¤ËÇÛÃÖ¤¹¤ë¥¿¥¤¥È¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fItitle\fR¥¿¥°¤Ë»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤Ï¡¢¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë¤ä¡¢¤³¤Î¥Ú¡¼¥¸¤ËÂФ·¤ÆºîÀ®¤µ¤ì¤¿¥Ö¥é¥¦¥¶¤Î¥Ö¥Ã¥¯¥Þ¡¼¥¯(¤ªµ¤¤ËÆþ¤ê)¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¿¥¤¥È¥ë¤Ë¤ÏHTML¥¿¥°¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¥¿¥¤¥È¥ë¤ËHTML¥¿¥°¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤È¡¢¥Ö¥é¥¦¥¶¤¬¥¿¥°¤òÀµ¤·¤¯²ò¼á¤Ç¤­¤Þ¤»¤ó¡£\fItitle\fR¥¿¥°Æâ¤ÎÆâÉô¤ÎÆó½Å°úÍÑÉä¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Æ¥Þ¡¼¥¯¤·¤Þ¤¹¡£\fI\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë¡¢\fI\-doctitle\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjavadoc \-windowtitle "Java SE Platform" com\&.mypackage\fR¤Ç¤¹¡£ ++HTML¤Î\fB<title>\fR¥¿¥°¤ËÇÛÃÖ¤¹¤ë¥¿¥¤¥È¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fBtitle\fR¥¿¥°¤Ë»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤Ï¡¢¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë¤ä¡¢¤³¤Î¥Ú¡¼¥¸¤ËÂФ·¤ÆºîÀ®¤µ¤ì¤¿¥Ö¥é¥¦¥¶¤Î¥Ö¥Ã¥¯¥Þ¡¼¥¯(¤ªµ¤¤ËÆþ¤ê)¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¿¥¤¥È¥ë¤Ë¤ÏHTML¥¿¥°¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¥¿¥¤¥È¥ë¤ËHTML¥¿¥°¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤È¡¢¥Ö¥é¥¦¥¶¤¬¥¿¥°¤òÀµ¤·¤¯²ò¼á¤Ç¤­¤Þ¤»¤ó¡£\fBtitle\fR¥¿¥°Æâ¤ÎÆâÉô¤ÎÆó½Å°úÍÑÉä¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Æ¥Þ¡¼¥¯¤·¤Þ¤¹¡£\fB\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë¡¢\fB\-doctitle\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjavadoc \-windowtitle "Java SE Platform" com\&.mypackage\fR¤Ç¤¹¡£ + .RE + .PP + \-doctitle \fItitle\fR + .RS 4 +-³µÍ×¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎºÇ¾åÉô¤Î¶á¤¯¤ËÇÛÃÖ¤¹¤ë¥¿¥¤¥È¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fItitle\fR¥¿¥°¤Ë»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤ÏÃæ±û·¤¨¤Ë¤Ê¤ê¡¢¥ì¥Ù¥ë1¤Î¸«½Ð¤·¤È¤·¤Æ¡¢¾åÉô¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¤¹¤°²¼¤ËÃÖ¤«¤ì¤Þ¤¹¡£\fItitle\fR¥¿¥°¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢¥¿¥¤¥È¥ë¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fItitle\fR¥¿¥°¤ÎÆâÉô¤Ç°úÍÑÉä¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjavadoc \-header "<b>Java Platform </b><br>v1\&.4" com\&.mypackage\fR¤Ç¤¹¡£ ++³µÍ×¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎºÇ¾åÉô¤Î¶á¤¯¤ËÇÛÃÖ¤¹¤ë¥¿¥¤¥È¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fBtitle\fR¥¿¥°¤Ë»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤ÏÃæ±û·¤¨¤Ë¤Ê¤ê¡¢¥ì¥Ù¥ë1¤Î¸«½Ð¤·¤È¤·¤Æ¡¢¾åÉô¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¤¹¤°²¼¤ËÃÖ¤«¤ì¤Þ¤¹¡£\fBtitle\fR¥¿¥°¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢¥¿¥¤¥È¥ë¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBtitle\fR¥¿¥°¤ÎÆâÉô¤Ç°úÍÑÉä¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjavadoc \-header "<b>Java Platform </b><br>v1\&.4" com\&.mypackage\&.\fR¤È¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-title \fItitle\fR + .RS 4 +-¤¹¤Ç¤Ë¸ºß¤·¤Þ¤»¤ó¡£Javadoc 1\&.2¤Î¥Ù¡¼¥¿ÈǤˤ·¤«Â¸ºß¤·¤Æ¤¤¤Þ¤»¤ó¤Ç¤·¤¿¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-doctitle\fR¤È¤¤¤¦Ì¾Á°¤ËÊѹ¹¤µ¤ì¤Þ¤·¤¿¡£Ì¾Á°¤òÊѹ¹¤·¤¿Íýͳ¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤¬¡¢¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë¤Ç¤Ï¤Ê¤¯¥É¥­¥å¥á¥ó¥È¤Î¥¿¥¤¥È¥ë¤òÄêµÁ¤¹¤ë¤³¤È¤òÌÀ³Î¤Ë¤¹¤ë¤¿¤á¤Ç¤¹¡£ ++¤¹¤Ç¤Ë¸ºß¤·¤Þ¤»¤ó¡£Javadoc 1\&.2¤Î¥Ù¡¼¥¿ÈǤˤ·¤«Â¸ºß¤·¤Æ¤¤¤Þ¤»¤ó¤Ç¤·¤¿¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-doctitle\fR¤È¤¤¤¦Ì¾Á°¤ËÊѹ¹¤µ¤ì¤Þ¤·¤¿¡£Ì¾Á°¤òÊѹ¹¤·¤¿Íýͳ¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤¬¡¢¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë¤Ç¤Ï¤Ê¤¯¥É¥­¥å¥á¥ó¥È¤Î¥¿¥¤¥È¥ë¤òÄêµÁ¤¹¤ë¤³¤È¤òÌÀ³Î¤Ë¤¹¤ë¤¿¤á¤Ç¤¹¡£ + .RE + .PP + \-header \fIheader\fR + .RS 4 +-³Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ¾åÉô¤ËÇÛÃÖ¤¹¤ë¥Ø¥Ã¥À¡¼¡¦¥Æ¥­¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Ï¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î±¦¾å¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£\fIheader\fR¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢\fIheader\fR¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ø¥Ã¥À¡¼ÆâÉô¤Î°úÍÑÉä¤Ë¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjavadoc \-header "<b>Java Platform </b><br>v1\&.4" com\&.mypackage\fR¤Ç¤¹¡£ ++³Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ¾åÉô¤ËÇÛÃÖ¤¹¤ë¥Ø¥Ã¥À¡¼¡¦¥Æ¥­¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Ï¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î±¦¾å¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£\fBheader\fR¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢\fBheader\fR¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ø¥Ã¥À¡¼ÆâÉô¤Î°úÍÑÉä¤Ë¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjavadoc \-header "<b>Java Platform </b><br>v1\&.4" com\&.mypackage\&.\fR¤È¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-footer \fIfooter\fR + .RS 4 +-³Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ²¼Éô¤ËÇÛÃÖ¤¹¤ë¥Õ¥Ã¥¿¡¼¡¦¥Æ¥­¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fIfooter\fR¤ÎÃͤϡ¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î±¦²¼¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£\fIfooter\fR¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢\fIfooter\fR¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Õ¥Ã¥¿¡¼ÆâÉô¤Î°úÍÑÉä¤Ë¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Þ¤¹¡£ ++³Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ²¼Éô¤ËÇÛÃÖ¤¹¤ë¥Õ¥Ã¥¿¡¼¡¦¥Æ¥­¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fIfooter\fR¤ÎÃͤϡ¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î±¦²¼¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£\fBfooter\fR¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢\fBfooter\fR¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Õ¥Ã¥¿¡¼ÆâÉô¤Î°úÍÑÉä¤Ë¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-top +@@ -2710,25 +2800,28 @@ + .PP + \-link \fIextdocURL\fR + .RS 4 +-´û¸¤ÎJavadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô»²¾È¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£\fIextdocURL\fR°ú¿ô¤Ï¡¢¥ê¥ó¥¯Àè¤È¤·¤Æ»ØÄꤹ¤ë¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô¥É¥­¥å¥á¥ó¥È¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÀäÂÐURL¤Þ¤¿¤ÏÁêÂÐURL¤Ç¤¹¡£»ØÄꤷ¤¿\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ç¡¢Ê£¿ô¤Î\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆÊ£¿ô¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ +-.sp +-¤³¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ëpackage\-list¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹)¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢package\-list¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÆɤ߼è¤Ã¤¿¸å¡¢¤½¤ÎURL¤Ç¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¡¢\fIextdocURL\fR¤ÎÃͤ¬¡¢ºîÀ®¤µ¤ì¤¿\fI<A HREF>\fR¥ê¥ó¥¯Æâ¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fIextdocURL\fR¤Ï¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤ÎURL¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIextdocURL\fR¤ËÀäÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Î¥É¥­¥å¥á¥ó¥È¤òǤ°Õ¤ÎWeb¥µ¥¤¥È¾å¤Î¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤Ç¤­¤Þ¤¹¡£ÁêÂаÌÃ֤إê¥ó¥¯¤¹¤ë¤Î¤ß¤Î¾ì¹ç¤ÏÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤǤ­¤Þ¤¹¡£ÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢ÅϤ¹Ãͤϰ¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¡¢¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(\fI\-d\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄê)¡£ÀäÂÐ¥ê¥ó¥¯¤ò»ØÄꤹ¤ë¾ì¹ç¡¢Ä̾HTTP¥ê¥ó¥¯¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤À¤·¡¢Web¥µ¡¼¥Ð¡¼¤ò»ý¤¿¤Ê¤¤¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤Ë¥ê¥ó¥¯¤¹¤ë¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥ê¥ó¥¯¤ò»ÈÍѤǤ­¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ë¥¢¥¯¥»¥¹¤¹¤ëÁ´°÷¤¬Æ±¤¸¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤ò¶¦Í­¤¹¤ë¾ì¹ç¤Ë¤Î¤ß¥Õ¥¡¥¤¥ë¡¦¥ê¥ó¥¯¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Î¾ì¹ç¤â¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¤â¡¢URL¤¬ÀäÂФޤ¿¤ÏÁêÂФΤ¤¤º¤ì¤Ç¤â¡¢¤Þ¤¿\fIh\fR\fIttp:\fR¤Þ¤¿¤Ï\fIf\fR\fIile:\fR¤Î¤¤¤º¤ì¤Ç¤â¡¢URL¥á¥â: Uniform Resource Locators ++´û¸¤ÎJavadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô»²¾È¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£\fIextdocURL\fR°ú¿ô¤Ï¡¢¥ê¥ó¥¯Àè¤È¤·¤Æ»ØÄꤹ¤ë¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô¥É¥­¥å¥á¥ó¥È¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÀäÂÐURL¤Þ¤¿¤ÏÁêÂÐURL¤Ç¤¹¡£»ØÄꤷ¤¿\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ç¡¢Ê£¿ô¤Î\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆÊ£¿ô¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++.sp ++¤³¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ëpackage\-list¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹)¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢package\-list¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÆɤ߼è¤Ã¤¿¸å¡¢¤½¤ÎURL¤Ç¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¡¢\fBextdocURL\fR¤ÎÃͤ¬¡¢ºîÀ®¤µ¤ì¤¿\fB<A HREF>\fR¥ê¥ó¥¯Æâ¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fBextdocURL\fR¤Ï¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤ÎURL¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIextdocURL\fR¤ËÀäÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Î¥É¥­¥å¥á¥ó¥È¤òǤ°Õ¤ÎWeb¥µ¥¤¥È¾å¤Î¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤Ç¤­¤Þ¤¹¡£ÁêÂаÌÃ֤إê¥ó¥¯¤¹¤ë¤Î¤ß¤Î¾ì¹ç¤ÏÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤǤ­¤Þ¤¹¡£ÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢ÅϤ¹Ãͤϰ¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¡¢¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(\fB\-d\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄê)¡£ÀäÂÐ¥ê¥ó¥¯¤ò»ØÄꤹ¤ë¾ì¹ç¡¢Ä̾HTTP¥ê¥ó¥¯¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤À¤·¡¢Web¥µ¡¼¥Ð¡¼¤ò»ý¤¿¤Ê¤¤¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤Ë¥ê¥ó¥¯¤¹¤ë¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥ê¥ó¥¯¤ò»ÈÍѤǤ­¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ë¥¢¥¯¥»¥¹¤¹¤ëÁ´°÷¤¬Æ±¤¸¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤ò¶¦Í­¤¹¤ë¾ì¹ç¤Ë¤Î¤ß¥Õ¥¡¥¤¥ë¡¦¥ê¥ó¥¯¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Î¾ì¹ç¤â¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¤â¡¢URL¤¬ÀäÂФޤ¿¤ÏÁêÂФΤ¤¤º¤ì¤Ç¤â¡¢¤Þ¤¿\fBh\fR\fBttp:\fR¤Þ¤¿¤Ï\fBf\fR\fBile:\fR¤Î¤¤¤º¤ì¤Ç¤â¡¢URL¥á¥â: Uniform Resource Locators + (http://www\&.ietf\&.org/rfc/rfc1738\&.txt)¤Ë»ØÄꤵ¤ì¤Æ¤¤¤ë¤È¤ª¤ê¡¢¶èÀÚ¤êʸ»ú¤È¤·¤Æ¥¹¥é¥Ã¥·¥å¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-link http://<host>/<directory>/<directory>/\&.\&.\&./<name> +-\-link file://<host>/<directory>/<directory>/\&.\&.\&./<name> +-\-link <directory>/<directory>/\&.\&.\&./<name> ++\fB\-link http://<host>/<directory>/<directory>/\&.\&.\&./<name>\fR ++\fB\-link file://<host>/<directory>/<directory>/\&.\&.\&./<name>\fR ++\fB\-link <directory>/<directory>/\&.\&.\&./<name>\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE +-\-linkoffline¤ª¤è¤Ó\-link¥ª¥×¥·¥ç¥ó¤Î°ã¤¤.PP +-¼¡¤Î¾ì¹ç¤Ë¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.PP ++\-linkoffline¤ª¤è¤Ó\-link¥ª¥×¥·¥ç¥ó¤Î°ã¤¤ ++.PP ++¼¡¤Î¾ì¹ç¤Ë¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2752,47 +2845,59 @@ + ³°ÉôAPI¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐURL¤ò»ÈÍѤ¹¤ë¾ì¹ç(¤½¤ÎURL¤ËÀܳ¤·¡¢Æɼè¤ê¤ò¹Ô¤¦¤³¤È¤¬¥·¥§¥ë¤Ë¤è¤Ã¤Æµö²Ä¤µ¤ì¤Æ¤¤¤ë¾ì¹ç)¡£ + .RE + .PP +-³°ÉôAPI¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐURL¤ò»ÈÍѤ¹¤ë¾ì¹ç(¤½¤ÎURL¤ËÀܳ¤·¡¢Æɼè¤ê¤ò¹Ô¤¦¤³¤È¤¬¥·¥§¥ë¤Ë¤è¤Ã¤Æµö²Ä¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç)¤Ï\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¾õ¶·¤Ï¡¢¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤ÎÆ⦤«¤é¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤Î³°Â¦¤Ë¤¢¤ë¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤·¤è¤¦¤È¤¹¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£ +-.PP +-\fBExample 1\fR, ³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐ¥ê¥ó¥¯ +-.RS 4 +-http://docs\&.oracle\&.com/javase/8/docs/api/index\&.html¤Ë¼¨¤¹¤è¤¦¤Ê¡¢\fIjava\&.lang\fR¡¢\fIjava\&.io\fR¤ª¤è¤Ó¤½¤Î¾¤ÎJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤¹¤ë¾ì¹ç¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹ ++³°ÉôAPI¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐURL¤ò»ÈÍѤ¹¤ë¾ì¹ç(¤½¤ÎURL¤ËÀܳ¤·¡¢Æɼè¤ê¤ò¹Ô¤¦¤³¤È¤¬¥·¥§¥ë¤Ë¤è¤Ã¤Æµö²Ä¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç)¤Ï\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¾õ¶·¤Ï¡¢¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤ÎÆ⦤«¤é¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤Î³°Â¦¤Ë¤¢¤ë¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤·¤è¤¦¤È¤¹¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£ ++.PP ++\fBÎã 1\fR ++.br ++³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐ¥ê¥ó¥¯ ++.RS 4 ++http://docs\&.oracle\&.com/javase/8/docs/api/index\&.html¤Ë¼¨¤¹¤è¤¦¤Ê¡¢\fBjava\&.lang\fR¡¢\fBjava\&.io\fR¤ª¤è¤Ó¤½¤Î¾¤ÎJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤¹¤ë¾ì¹ç¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-link http://docs\&.oracle\&.com/javase/8/docs/api/ com\&.mypackage ++\fBjavadoc \-link http://docs\&.oracle\&.com/javase/8/docs/api/ com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢Java SE¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥ê¥ó¥¯»ý¤Ä\fIcom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¥¯¥é¥¹\fItrees\fRÆâ¤Î\fIObject\fR¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fI\-sourcepath\fR¤ä\fI\-d\fR¤Ê¤É¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ +-.RE +-.PP +-\fBExample 2\fR, ³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÁêÂÐ¥ê¥ó¥¯ +-.RS 4 +-¤³¤ÎÎã¤Ç¤Ï¡¢2¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ê¡¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤òÊ£¿ô²ó¼Â¹Ô¤·¤¿·ë²ÌÀ¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£¤µ¤é¤Ë¡¢¤³¤ì¤é¤Î¥É¥­¥å¥á¥ó¥È¤ÏÁêÂХѥ¹¤Çʬ³ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢API¤Ç¤¢¤ë\fIcom\&.apipackage\fR¤È¡¢SPI(¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹)¤Ç¤¢¤ëc\fIom\&.spipackage\fR¤Ç¤¹¡£¥É¥­¥å¥á¥ó¥È¤Î³ÊǼÀè¤Ï¡¢docs/api/com/apipackage¤Èdocs/spi/com/spipackage¤Ç¤¹¡£API¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤Ï¤¹¤Ç¤ËÀ¸À®¤µ¤ì¤Æ¤¤¤Æ¡¢docs¤¬¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¢¤ë¾ì¹ç¡¢API¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤ò»ý¤ÄSPI¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fIjavadoc \-d \&./spi \-link \&.\&./api com\&.spipackage\fR +-.sp +-\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢°¸Àè¥Ç¥£¥ì¥¯¥È¥ê(docs/spi)¤«¤é¤ÎÁêÂХѥ¹¤Ç¤¹¡£ +-.RE +-Ãí°Õ.PP +-\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥³¡¼¥É¤«¤é¤Ï»²¾È¤µ¤ì¤Æ¤¤¤Æ¤â¡¢º£²ó¤Î\fIjavadoc\fR¤Î¼Â¹Ô¤Ç¤Ï¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¥ê¥ó¥¯¤«¤éÍ­¸ú¤Ê¥Ú¡¼¥¸¤Ë°ÜÆ°¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¢¤½¤ì¤é¤ÎHTML¥Ú¡¼¥¸¤¬¤¢¤ë¾ì½ê¤òÄ´¤Ù¡¢¤½¤Î¾ì½ê¤ò\fIextdocURL\fR¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥µ¡¼¥É¥Ñ¡¼¥Æ¥£¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤¬java\&.*¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó(http://docs\&.oracle\&.com)¤Ø¥ê¥ó¥¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¡¢¸½ºß¤Î¼Â¹Ô¤ÇÀ¸À®¤·¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤ÎAPI¤Ø¤Î¥ê¥ó¥¯¤Î¤ß¤òºîÀ®¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤·¤Þ¤¹¡£\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï³°Éô»²¾È¤Î¤¿¤á¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤»¤ó¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¤Î¤«¤É¤¦¤«¡¢¤Þ¤¿¤Ï¤É¤³¤Ë¸ºß¤¹¤ë¤Î¤«¤¬¤ï¤«¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤ÎÊ£¿ô¤Î¾ì½ê¤Ë¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤â¤¦1¤Ä¤ÎÍÑÅӤϡ¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤Î´Ö¤Ë¥¯¥í¥¹¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤³¤È¤Ç¤¹¡£°ìÊý¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤ËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢Â¾Êý¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤ËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤òºÆÅټ¹Ԥ¹¤ë¤È¡¢Î¾¥»¥Ã¥È´Ö¤ËÁÐÊý¸þ¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ +-¥¯¥é¥¹¤Î»²¾ÈÊýË¡.PP +-ɽ¼¨¤µ¤ì¤ë³°Éô»²¾È¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤Î¾ì¹ç(¤ª¤è¤Ó¤½¤Î¥Æ¥­¥¹¥È¡¦¥é¥Ù¥ë¤À¤±¤Ç¤Ï¤Ê¤¯)¡¢¥¯¥é¥¹¤Ï¼¡¤ÎÊýË¡¤Ç»²¾È¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥á¥½¥Ã¥É¤ÎËÜÂΤǥ¯¥é¥¹¤ò»²¾È¤¹¤ë¤Î¤ß¤Ç¤Ï½½Ê¬¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fIimport\fRʸ¡¢Àë¸À¤Î¤¤¤º¤ì¤«¤Ç»²¾È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤Ë¡¢¥¯¥é¥¹\fIjava\&.io\&.File\fR¤ò»²¾È¤¹¤ëÊýË¡¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£ +-.PP +-¤¹¤Ù¤Æ¤Î¥¿¥¤¥×¤Îimportʸ¤Î¾ì¹ç¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ë¤è¤ë¥¤¥ó¥Ý¡¼¥È¡¢Ì¾Á°¤Ë¤è¤ëÌÀ¼¨Åª¤Ê¥¤¥ó¥Ý¡¼¥È¡¢¤Þ¤¿¤Ï\fIjava\&.lang\&.*\fR¤ËÂФ¹¤ë¼«Æ°¥¤¥ó¥Ý¡¼¥È¡£ +-.PP +-Java SE 1\&.3\&.\fIn\fR¤ª¤è¤Ó1\&.2\&.\fIn\fR¤Ç¤Ï¡¢Ì¾Á°¤Ë¤è¤ëÌÀ¼¨Åª¤Ê¥¤¥ó¥Ý¡¼¥È¤Î¤ßµ¡Ç½¤·¤Þ¤¹¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ë¤è¤ë\fIimport\fRʸ¤â¡¢\fIimport java\&.lang\&.*\fR¤Î¼«Æ°¥¤¥ó¥Ý¡¼¥È¤âµ¡Ç½¤·¤Þ¤»¤ó¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢Java SE¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥ê¥ó¥¯»ý¤Ä\fBcom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¥¯¥é¥¹\fBtrees\fRÆâ¤Î\fBObject\fR¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fB\-sourcepath\fR¤ä\fB\-d\fR¤Ê¤É¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ ++.RE ++.PP ++\fBÎã 2\fR ++.br ++³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÁêÂÐ¥ê¥ó¥¯ ++.RS 4 ++¤³¤ÎÎã¤Ç¤Ï¡¢2¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ê¡¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤òÊ£¿ô²ó¼Â¹Ô¤·¤¿·ë²ÌÀ¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£¤µ¤é¤Ë¡¢¤³¤ì¤é¤Î¥É¥­¥å¥á¥ó¥È¤ÏÁêÂХѥ¹¤Çʬ³ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢API¤Ç¤¢¤ë\fBcom\&.apipackage\fR¤È¡¢SPI(¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹)¤Ç¤¢¤ëc\fBom\&.spipackage\fR¤Ç¤¹¡£¥É¥­¥å¥á¥ó¥È¤Î³ÊǼÀè¤Ï¡¢docs/api/com/apipackage¤Èdocs/spi/com/spipackage¤Ç¤¹¡£API¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤Ï¤¹¤Ç¤ËÀ¸À®¤µ¤ì¤Æ¤¤¤Æ¡¢docs¤¬¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¢¤ë¾ì¹ç¡¢API¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤ò»ý¤ÄSPI¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fBjavadoc \-d \&./spi \-link \&.\&./api com\&.spipackage\fR ++.sp ++\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢°¸Àè¥Ç¥£¥ì¥¯¥È¥ê(docs/spi)¤«¤é¤ÎÁêÂХѥ¹¤Ç¤¹¡£ ++.RE ++.PP ++Ãí°Õ ++.PP ++\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥³¡¼¥É¤«¤é¤Ï»²¾È¤µ¤ì¤Æ¤¤¤Æ¤â¡¢º£²ó¤Î\fBjavadoc\fR¤Î¼Â¹Ô¤Ç¤Ï¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¥ê¥ó¥¯¤«¤éÍ­¸ú¤Ê¥Ú¡¼¥¸¤Ë°ÜÆ°¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¢¤½¤ì¤é¤ÎHTML¥Ú¡¼¥¸¤¬¤¢¤ë¾ì½ê¤òÄ´¤Ù¡¢¤½¤Î¾ì½ê¤ò\fBextdocURL\fR¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥µ¡¼¥É¥Ñ¡¼¥Æ¥£¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤¬java\&.*¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó( ++http://docs\&.oracle\&.com)¤Ø¥ê¥ó¥¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¡¢¸½ºß¤Î¼Â¹Ô¤ÇÀ¸À®¤·¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤ÎAPI¤Ø¤Î¥ê¥ó¥¯¤Î¤ß¤òºîÀ®¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤·¤Þ¤¹¡£\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï³°Éô»²¾È¤Î¤¿¤á¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤»¤ó¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¤Î¤«¤É¤¦¤«¡¢¤Þ¤¿¤Ï¤É¤³¤Ë¸ºß¤¹¤ë¤Î¤«¤¬¤ï¤«¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤ÎÊ£¿ô¤Î¾ì½ê¤Ë¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤â¤¦1¤Ä¤ÎÍÑÅӤϡ¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤Î´Ö¤Ë¥¯¥í¥¹¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤³¤È¤Ç¤¹¡£°ìÊý¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤ËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢Â¾Êý¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤ËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤òºÆÅټ¹Ԥ¹¤ë¤È¡¢Î¾¥»¥Ã¥È´Ö¤ËÁÐÊý¸þ¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++.PP ++¥¯¥é¥¹¤Î»²¾ÈÊýË¡ ++.PP ++ɽ¼¨¤µ¤ì¤ë³°Éô»²¾È¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤Î¾ì¹ç(¤ª¤è¤Ó¤½¤Î¥Æ¥­¥¹¥È¡¦¥é¥Ù¥ë¤À¤±¤Ç¤Ï¤Ê¤¯)¡¢¥¯¥é¥¹¤Ï¼¡¤ÎÊýË¡¤Ç»²¾È¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥á¥½¥Ã¥É¤ÎËÜÂΤǥ¯¥é¥¹¤ò»²¾È¤¹¤ë¤Î¤ß¤Ç¤Ï½½Ê¬¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fBimport\fRʸ¡¢Àë¸À¤Î¤¤¤º¤ì¤«¤Ç»²¾È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤Ë¡¢¥¯¥é¥¹\fBjava\&.io\&.File\fR¤ò»²¾È¤¹¤ëÊýË¡¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£ ++.PP ++¤¹¤Ù¤Æ¤Î¥¿¥¤¥×¤Îimportʸ¤Î¾ì¹ç¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ë¤è¤ë¥¤¥ó¥Ý¡¼¥È¡¢Ì¾Á°¤Ë¤è¤ëÌÀ¼¨Åª¤Ê¥¤¥ó¥Ý¡¼¥È¡¢¤Þ¤¿¤Ï\fBjava\&.lang\&.*\fR¤ËÂФ¹¤ë¼«Æ°¥¤¥ó¥Ý¡¼¥È¡£ ++.PP ++Java SE 1\&.3\&.\fIn\fR¤ª¤è¤Ó1\&.2\&.\fIn\fR¤Ç¤Ï¡¢Ì¾Á°¤Ë¤è¤ëÌÀ¼¨Åª¤Ê¥¤¥ó¥Ý¡¼¥È¤Î¤ßµ¡Ç½¤·¤Þ¤¹¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ë¤è¤ë\fBimport\fRʸ¤â¡¢\fBimport java\&.lang\&.*\fR¤Î¼«Æ°¥¤¥ó¥Ý¡¼¥È¤âµ¡Ç½¤·¤Þ¤»¤ó¡£ + .PP + Àë¸À¤Î¾ì¹ç: +-\fIvoid mymethod(File f) {}\fR ++\fBvoid mymethod(File f) {}\fR + .PP + »²¾È¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥Õ¥£¡¼¥ë¥É¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÌá¤ê·¿¤Þ¤¿¤Ï¥Ñ¥é¥á¡¼¥¿¡¦¥¿¥¤¥×¡¢¤¢¤ë¤¤¤Ï¼ÂÁõ¡¢³ÈÄ¥¤Þ¤¿¤Ï¥¹¥í¡¼Ê¸¤Ë¤¢¤ê¤Þ¤¹¡£ + .PP +-½ÅÍפʷë²Ì¤È¤·¤Æ¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤â¡¢¤³¤ÎÀ©¸Â¤Î¤¿¤á¤Ë¸í¤Ã¤Æɽ¼¨¤µ¤ì¤Ê¤¤¥ê¥ó¥¯¤¬Â¿¿ôȯÀ¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¥Æ¥­¥¹¥È¤Ï¥Ï¥¤¥Ñ¡¼¥Æ¥­¥¹¥È¡¦¥ê¥ó¥¯¤¬ÉÕ¤±¤é¤ì¤º¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¥ê¥ó¥¯¤¬É½¼¨¤¹¤ë·Ù¹ð¤«¤é¡¢¤³¤ì¤é¤Î¥ê¥ó¥¯¤òǧ¼±¤Ç¤­¤Þ¤¹¡£¥¯¥é¥¹¤òÀµ¤·¤¯»²¾È¤·¡¢¤½¤ì¤Ë¤è¤Ã¤Æ¥ê¥ó¥¯¤òÄɲ乤뤿¤á¤ÎºÇ¤â´Êñ¤ÊÊýË¡¤Ï¤½¤Î¥¯¥é¥¹¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤Ç¤¹¡£ +-¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È.PP +-\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ëpackage\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤¬¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Ë»ØÄꤷ¤¿URL¤Ë¸ºß¤·¤Æ¤¤¤ë¤³¤È¤¬É¬ÍפǤ¹¡£package\-list¥Õ¥¡¥¤¥ë¤Ï¡¢¤½¤Î¾ì½ê¤Ë¤¢¤ë¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤Î¥ê¥¹¥È¤¬Æþ¤Ã¤¿Ã±½ã¤Ê¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£Á°½Ò¤ÎÎã¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤷ¤¿URL¤Çpackage\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÆɤ߼è¤Ã¤Æ¡¢¤½¤ÎURL¤Ç¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£ ++½ÅÍפʷë²Ì¤È¤·¤Æ¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤â¡¢¤³¤ÎÀ©¸Â¤Î¤¿¤á¤Ë¸í¤Ã¤Æɽ¼¨¤µ¤ì¤Ê¤¤¥ê¥ó¥¯¤¬Â¿¿ôȯÀ¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¥Æ¥­¥¹¥È¤Ï¥Ï¥¤¥Ñ¡¼¥Æ¥­¥¹¥È¡¦¥ê¥ó¥¯¤¬ÉÕ¤±¤é¤ì¤º¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¥ê¥ó¥¯¤¬É½¼¨¤¹¤ë·Ù¹ð¤«¤é¡¢¤³¤ì¤é¤Î¥ê¥ó¥¯¤òǧ¼±¤Ç¤­¤Þ¤¹¡£¥¯¥é¥¹¤òÀµ¤·¤¯»²¾È¤·¡¢¤½¤ì¤Ë¤è¤Ã¤Æ¥ê¥ó¥¯¤òÄɲ乤뤿¤á¤ÎºÇ¤â´Êñ¤ÊÊýË¡¤Ï¤½¤Î¥¯¥é¥¹¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤Ç¤¹¡£ ++.PP ++¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È ++.PP ++\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ëpackage\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤¬¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Ë»ØÄꤷ¤¿URL¤Ë¸ºß¤·¤Æ¤¤¤ë¤³¤È¤¬É¬ÍפǤ¹¡£package\-list¥Õ¥¡¥¤¥ë¤Ï¡¢¤½¤Î¾ì½ê¤Ë¤¢¤ë¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤Î¥ê¥¹¥È¤¬Æþ¤Ã¤¿Ã±½ã¤Ê¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£Á°½Ò¤ÎÎã¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤷ¤¿URL¤Çpackage\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÆɤ߼è¤Ã¤Æ¡¢¤½¤ÎURL¤Ç¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£ + .PP + ¤¿¤È¤¨¤Ð¡¢Java SE API¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤Ï + http://docs\&.oracle\&.com/javase/8/docs/api/package\-list¤Ë¤¢¤ê¤Þ¤¹¡£ +@@ -2803,33 +2908,38 @@ + .RS 4 + .\} + .nf +-java\&.applet +-java\&.awt +-java\&.awt\&.color +-java\&.awt\&.datatransfer +-java\&.awt\&.dnd +-java\&.awt\&.event +-java\&.awt\&.font +-and so on \&.\&.\&.\&. ++\fBjava\&.applet\fR ++\fBjava\&.awt\fR ++\fBjava\&.awt\&.color\fR ++\fBjava\&.awt\&.datatransfer\fR ++\fBjava\&.awt\&.dnd\fR ++\fBjava\&.awt\&.event\fR ++\fBjava\&.awt\&.font\fR ++\fBand so on \&.\&.\&.\&.\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fIjavadoc\fR¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢³°Éô»²¾È¥¯¥é¥¹¤Ë°¤¹¤ë̾Á°¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î̾Á°¤ò¥ê¥ó¥¯¤Ê¤·¤Ç½ÐÎϤ·¤Þ¤¹¡£°ìÊý¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿\fIextdocURL\fR¤Î¾ì½ê¤Ë¤¢¤ëpackage\-list¥Õ¥¡¥¤¥ë¤Ç¤½¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¸¡º÷¤·¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬¸«¤Ä¤«¤ë¤È¡¢\fIextdocURL\fR¤¬Ì¾Á°¤ÎÁ°¤ËÉղ䵤ì¤Þ¤¹¡£ +-.PP +-¤¹¤Ù¤Æ¤Î¥ê¥ó¥¯¤¬Àµ¤·¤¯µ¡Ç½¤¹¤ë¤¿¤á¤Ë¤Ï¡¢³°Éô»²¾È¤Î¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È¤¬¡¢»ØÄꤷ¤¿URL¤Ë¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿package\-list¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Î¤ß¤ò¥Á¥§¥Ã¥¯¤·¡¢¤³¤ì¤é¤Î¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Ï¥Á¥§¥Ã¥¯¤·¤Þ¤»¤ó¡£ +-Ê£¿ô¤Î¥ê¥ó¥¯.PP +-Ê£¿ô¤Î\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢Ç¤°Õ¤Î¿ô¤Î³°ÉôÀ¸À®¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£Javadoc 1\&.2¤Ë¤Ï¡¢Ê£¿ô¤Î\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Ê¤¤¤È¤¤¤¦´ûÃΤÎÉÔ¶ñ¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤ÏJavadoc 1\&.2\&.2¤Ç½¤Àµ¤µ¤ì¤Þ¤·¤¿¡£¥ê¥ó¥¯¤¹¤ë³°Éô¥É¥­¥å¥á¥ó¥È¤´¤È¤Ë¡¢¼¡¤Î¤è¤¦¤ËÊÌ¡¹¤Î¥ê¥ó¥¯¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fIjavadoc \-link extdocURL1 \-link extdocURL2 \&.\&.\&. \-link extdocURLn com\&.mypackage\fR +-\fIextdocURL1\fR¡¢\fIextdocURL2\fR¡¢\&.\fI\&.\&. extdocURLn\fR¤Ï¡¢¤½¤ì¤¾¤ì³°Éô¥É¥­¥å¥á¥ó¥È¤Î¥ë¡¼¥È¤ò»Ø¤·¡¢³Æ¥ë¡¼¥È¤Ë¤Ï¡¢package\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤¬Æþ¤Ã¤Æ¤¤¤Þ¤¹¡£ +-¥¯¥í¥¹¥ê¥ó¥¯.PP +-°ÊÁ°¤ËºîÀ®¤µ¤ì¤¿Ê£¿ô¤Î¥É¥­¥å¥á¥ó¥È¤ò¥¯¥í¥¹¥ê¥ó¥¯¤¹¤ë¾ì¹ç¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¤¬É¬Íפˤʤ뤳¤È¤¬¤¢¤ê¤Þ¤¹¡£¤É¤Î¥É¥­¥å¥á¥ó¥È¤Ë¤Ä¤¤¤Æ¤âpackage\-list¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥È¤ËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë»þÅÀ¤Ç¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤Îpackage\-list¤Ï¤Þ¤À¸ºß¤·¤Æ¤¤¤Þ¤»¤ó¡£¤·¤¿¤¬¤Ã¤Æ¡¢³°Éô¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤òÀ¸À®¤·¤¿¸å¤Ç¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Ê¤ª¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ +-.PP +-¤³¤Î¾ì¹ç¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥ÈÀ¸À®¤ÎÌÜŪ¤Ï¡¢package\-list¤òºîÀ®¤¹¤ë¤³¤È¤Ç¤¹(¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÇÄ°®¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¼êÆ°¤ÇºîÀ®¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó)¡£¼¡¤Ë¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤È¤½¤Î³°Éô¥ê¥ó¥¯¤òÀ¸À®¤·¤Þ¤¹¡£É¬Íפʳ°Éô¤Îpackage\-list¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤«¤é·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fBjavadoc\fR¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢³°Éô»²¾È¥¯¥é¥¹¤Ë°¤¹¤ë̾Á°¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î̾Á°¤ò¥ê¥ó¥¯¤Ê¤·¤Ç½ÐÎϤ·¤Þ¤¹¡£°ìÊý¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿\fIextdocURL\fR¤Î¾ì½ê¤Ë¤¢¤ëpackage\-list¥Õ¥¡¥¤¥ë¤Ç¤½¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¸¡º÷¤·¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬¸«¤Ä¤«¤ë¤È¡¢\fIextdocURL\fR¤¬Ì¾Á°¤ÎÁ°¤ËÉղ䵤ì¤Þ¤¹¡£ ++.PP ++¤¹¤Ù¤Æ¤Î¥ê¥ó¥¯¤¬Àµ¤·¤¯µ¡Ç½¤¹¤ë¤¿¤á¤Ë¤Ï¡¢³°Éô»²¾È¤Î¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È¤¬¡¢»ØÄꤷ¤¿URL¤Ë¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿package\-list¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Î¤ß¤ò¥Á¥§¥Ã¥¯¤·¡¢¤³¤ì¤é¤Î¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Ï¥Á¥§¥Ã¥¯¤·¤Þ¤»¤ó¡£ ++.PP ++Ê£¿ô¤Î¥ê¥ó¥¯ ++.PP ++Ê£¿ô¤Î\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢Ç¤°Õ¤Î¿ô¤Î³°ÉôÀ¸À®¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£Javadoc 1\&.2¤Ë¤Ï¡¢Ê£¿ô¤Î\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Ê¤¤¤È¤¤¤¦´ûÃΤÎbug¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤ÏJavadoc 1\&.2\&.2¤Ç½¤Àµ¤µ¤ì¤Þ¤·¤¿¡£¥ê¥ó¥¯¤¹¤ë³°Éô¥É¥­¥å¥á¥ó¥È¤´¤È¤Ë¡¢¼¡¤Î¤è¤¦¤ËÊÌ¡¹¤Î¥ê¥ó¥¯¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fBjavadoc \-link extdocURL1 \-link extdocURL2 \&.\&.\&. \-link extdocURLn com\&.mypackage\fR ++\fIextdocURL1\fR¡¢\fIextdocURL2\fR¡¢\&.\fB\&.\&. extdocURLn\fR¤Ï¡¢¤½¤ì¤¾¤ì³°Éô¥É¥­¥å¥á¥ó¥È¤Î¥ë¡¼¥È¤ò»Ø¤·¡¢³Æ¥ë¡¼¥È¤Ë¤Ï¡¢package\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤¬Æþ¤Ã¤Æ¤¤¤Þ¤¹¡£ ++.PP ++¥¯¥í¥¹¥ê¥ó¥¯ ++.PP ++°ÊÁ°¤ËºîÀ®¤µ¤ì¤¿Ê£¿ô¤Î¥É¥­¥å¥á¥ó¥È¤ò¥¯¥í¥¹¥ê¥ó¥¯¤¹¤ë¾ì¹ç¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¤¬É¬Íפˤʤ뤳¤È¤¬¤¢¤ê¤Þ¤¹¡£¤É¤Î¥É¥­¥å¥á¥ó¥È¤Ë¤Ä¤¤¤Æ¤âpackage\-list¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥È¤ËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë»þÅÀ¤Ç¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤Îpackage\-list¤Ï¤Þ¤À¸ºß¤·¤Æ¤¤¤Þ¤»¤ó¡£¤·¤¿¤¬¤Ã¤Æ¡¢³°Éô¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤òÀ¸À®¤·¤¿¸å¤Ç¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Ê¤ª¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++¤³¤Î¾ì¹ç¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥ÈÀ¸À®¤ÎÌÜŪ¤Ï¡¢package\-list¤òºîÀ®¤¹¤ë¤³¤È¤Ç¤¹(¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÇÄ°®¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¼êÆ°¤ÇºîÀ®¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó)¡£¼¡¤Ë¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤È¤½¤Î³°Éô¥ê¥ó¥¯¤òÀ¸À®¤·¤Þ¤¹¡£É¬Íפʳ°Éô¤Îpackage\-list¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤«¤é·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .PP + \-linkoffline \fIextdocURL packagelistLoc\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Î¥Ð¥ê¥¨¡¼¥·¥ç¥ó¤Ç¤¹¡£Î¾Êý¤È¤â¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô»²¾È¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬WebÀܳ¤ò»ÈÍѤ·¤Æ¥É¥­¥å¥á¥ó¥È¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤È¤­¡¢Web¾å¤Î¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤¹¤ë¤Ë¤Ï¡¢\fI\-link\fRo\fIffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£³°Éô¥É¥­¥å¥á¥ó¥È¤Îpackage\-list¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤È¤­¡¢¤Þ¤¿¤Ï¤³¤Î¥Õ¥¡¥¤¥ë¤¬\fIextdocURL\fR¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Ë¤Ï¸ºß¤»¤º¡¢\fIpackageListLoc\fR¤Ç»ØÄê¤Ç¤­¤ëÊ̤ξì½ê(Ä̾ï¥í¡¼¥«¥ë)¤Ë¸ºß¤¹¤ë¤È¤­¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fIextdocURL\fR¤ËWorld Wide Web¾å¤Ç¤·¤«¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®»þ¤Ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬Web¤ËÀܳ¤¹¤ëɬÍפ¬¤¢¤ë¤È¤¤¤¦À©Ì󤬤ʤ¯¤Ê¤ê¤Þ¤¹¡£¤â¤¦1¤Ä¤ÎÍÑÅӤϡ¢¥É¥­¥å¥á¥ó¥È¤ò¹¹¿·¤¹¤ë¤¿¤á¤Î²óÈòºö¤È¤·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥ÈÁ´ÂΤËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢Êѹ¹¤·¤¿°ìÉô¤Î¥Ñ¥Ã¥±¡¼¥¸¤ËÂФ·¤Æ¤Î¤ß\fIjavadoc\fR¥³¥Þ¥ó¥É¤òºÆÅټ¹Ԥ·¤Æ¡¢¹¹¿·¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢¥ª¥ê¥¸¥Ê¥ë¤Î¥»¥Ã¥È¤ËÁÞÆþ¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Ï°ú¿ô¤ò2¤Ä¼è¤ê¤Þ¤¹¡£Âè1°ú¿ô¤Ï\fI<a href>\fR¥ê¥ó¥¯¤ËÁȤ߹þ¤Þ¤ì¤ëʸ»úÎó¤ò»ØÄꤷ¡¢Âè2°ú¿ô¤Ïpackage\-list¤Î¸¡º÷¾ì½ê¤ò\fI\-linkoffline\fR¤ËÅÁ¤¨¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Î¥Ð¥ê¥¨¡¼¥·¥ç¥ó¤Ç¤¹¡£Î¾Êý¤È¤â¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô»²¾È¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬WebÀܳ¤ò»ÈÍѤ·¤Æ¥É¥­¥å¥á¥ó¥È¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤È¤­¡¢Web¾å¤Î¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤¹¤ë¤Ë¤Ï¡¢\fB\-link\fRo\fBffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£³°Éô¥É¥­¥å¥á¥ó¥È¤Îpackage\-list¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤È¤­¡¢¤Þ¤¿¤Ï¤³¤Î¥Õ¥¡¥¤¥ë¤¬\fBextdocURL\fR¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Ë¤Ï¸ºß¤»¤º¡¢\fBpackageListLoc\fR¤Ç»ØÄê¤Ç¤­¤ëÊ̤ξì½ê(Ä̾ï¥í¡¼¥«¥ë)¤Ë¸ºß¤¹¤ë¤È¤­¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fBextdocURL\fR¤ËWorld Wide Web¾å¤Ç¤·¤«¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®»þ¤Ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬Web¤ËÀܳ¤¹¤ëɬÍפ¬¤¢¤ë¤È¤¤¤¦À©Ì󤬤ʤ¯¤Ê¤ê¤Þ¤¹¡£¤â¤¦1¤Ä¤ÎÍÑÅӤϡ¢¥É¥­¥å¥á¥ó¥È¤ò¹¹¿·¤¹¤ë¤¿¤á¤Î²óÈòºö¤È¤·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥ÈÁ´ÂΤËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢Êѹ¹¤·¤¿°ìÉô¤Î¥Ñ¥Ã¥±¡¼¥¸¤ËÂФ·¤Æ¤Î¤ß\fBjavadoc\fR¥³¥Þ¥ó¥É¤òºÆÅټ¹Ԥ·¤Æ¡¢¹¹¿·¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢¥ª¥ê¥¸¥Ê¥ë¤Î¥»¥Ã¥È¤ËÁÞÆþ¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Ï°ú¿ô¤ò2¤Ä¼è¤ê¤Þ¤¹¡£Âè1°ú¿ô¤Ï\fB<a href>\fR¥ê¥ó¥¯¤ËÁȤ߹þ¤Þ¤ì¤ëʸ»úÎó¤ò»ØÄꤷ¡¢Âè2°ú¿ô¤Ïpackage\-list¤Î¸¡º÷¾ì½ê¤ò\fB\-linkoffline\fR¤ËÅÁ¤¨¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2839,7 +2949,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIextdocURL\fR¤ÎÃͤϡ¢¥ê¥ó¥¯Àè¤È¤·¤Æ»ØÄꤹ¤ë¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô¥É¥­¥å¥á¥ó¥È¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÀäÂÐURL¤Þ¤¿¤ÏÁêÂÐURL¤Ç¤¹¡£ÁêÂÐURL¤Î¾ì¹ç¡¢Ãͤϡ¢À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê(\fI\-d\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄê)¤«¤é¥ê¥ó¥¯Àè¤È¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¤Ø¤ÎÁêÂХѥ¹¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Î\fIextdocURL\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBextdocURL\fR¤ÎÃͤϡ¢¥ê¥ó¥¯Àè¤È¤·¤Æ»ØÄꤹ¤ë¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô¥É¥­¥å¥á¥ó¥È¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÀäÂÐURL¤Þ¤¿¤ÏÁêÂÐURL¤Ç¤¹¡£ÁêÂÐURL¤Î¾ì¹ç¡¢Ãͤϡ¢À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê(\fB\-d\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄê)¤«¤é¥ê¥ó¥¯Àè¤È¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¤Ø¤ÎÁêÂХѥ¹¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Î\fIextdocURL\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -2850,14 +2960,16 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackagelistLoc\fR¤ÎÃͤϡ¢³°Éô¥É¥­¥å¥á¥ó¥È¤Îpackage\-list¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Î¥Ñ¥¹¤Þ¤¿¤ÏURL¤Ç¤¹¡£¤³¤ì¤Ï¡¢URL (http:¤Þ¤¿¤Ïfile:)¤Ç¤â¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£¤Þ¤¿¡¢ÀäÂХѥ¹¤ÈÁêÂХѥ¹¤Î¤É¤Á¤é¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ÁêÂХѥ¹¤Î¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤µ¤ì¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤È¤·¤Æ»ØÄꤷ¤Þ¤¹¡£package\-list¥Õ¥¡¥¤¥ë̾¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ +-.sp +-»ØÄꤷ¤¿\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ç¡¢Ê£¿ô¤Î\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Javadoc 1\&.2\&.2¤è¤êÁ°¤Ç¤Ï¡¢\fI\-linkfile\fR¥ª¥×¥·¥ç¥ó¤Ï1²ó¤·¤«»ØÄê¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£ +-.RE +-.RE +-³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐ¥ê¥ó¥¯.PP +-http://docs\&.oracle\&.com/javase/8/docs/api/index\&.html¤Ë¼¨¤¹¤è¤¦¤Ê¡¢\fIjava\&.lang\fR¡¢ +-\fIjava\&.io\fR¤ª¤è¤Ó¤½¤Î¾¤ÎJava SE¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBpackagelistLoc\fR¤ÎÃͤϡ¢³°Éô¥É¥­¥å¥á¥ó¥È¤Îpackage\-list¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Î¥Ñ¥¹¤Þ¤¿¤ÏURL¤Ç¤¹¡£¤³¤ì¤Ï¡¢URL (http:¤Þ¤¿¤Ïfile:)¤Ç¤â¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£¤Þ¤¿¡¢ÀäÂХѥ¹¤ÈÁêÂХѥ¹¤Î¤É¤Á¤é¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ÁêÂХѥ¹¤Î¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤µ¤ì¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤È¤·¤Æ»ØÄꤷ¤Þ¤¹¡£package\-list¥Õ¥¡¥¤¥ë̾¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++.sp ++»ØÄꤷ¤¿\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ç¡¢Ê£¿ô¤Î\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Javadoc 1\&.2\&.2¤è¤êÁ°¤Ç¤Ï¡¢\fB\-linkfile\fR¥ª¥×¥·¥ç¥ó¤Ï1²ó¤·¤«»ØÄê¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£ ++.RE ++.RE ++.PP ++³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐ¥ê¥ó¥¯ ++.PP ++http://docs\&.oracle\&.com/javase/8/docs/api/index\&.html¤Ë¼¨¤¹¤è¤¦¤Ê¡¢\fBjava\&.lang\fR¡¢ ++\fBjava\&.io\fR¤ª¤è¤Ó¤½¤Î¾¤ÎJava SE¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ + .PP + ¤¿¤À¤·¡¢¥·¥§¥ë¤Ë¤ÏWeb¥¢¥¯¥»¥¹¸¢¤¬¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ + .sp +@@ -2880,78 +2992,91 @@ + .sp -1 + .IP " 2." 4.2 + .\} +-¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥«¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤·¡¢¤³¤Î¥í¡¼¥«¥ë¡¦¥³¥Ô¡¼¤òÂè2°ú¿ô\fIpackagelistLoc\fR¤Ç»ØÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¥«¥ì¥ó¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê(\&.)¤ËÊݸ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.RE +-.PP +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Java SE¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¤ò»ý¤Äc\fIom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¥¯¥é¥¹\fItrees\fRÆâ¤Î\fIObject\fR¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fI\-sourcepath\fR¤Ê¤É¡¢Â¾¤ÎɬÍפʥª¥×¥·¥ç¥ó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ ++¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥«¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤·¡¢¤³¤Î¥í¡¼¥«¥ë¡¦¥³¥Ô¡¼¤òÂè2°ú¿ô\fBpackagelistLoc\fR¤Ç»ØÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¥«¥ì¥ó¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê(\&.)¤ËÊݸ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Java SE¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¤ò»ý¤Äc\fBom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¥¯¥é¥¹\fBtrees\fRÆâ¤Î\fBObject\fR¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fB\-sourcepath\fR¤Ê¤É¡¢Â¾¤ÎɬÍפʥª¥×¥·¥ç¥ó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-linkoffline http://docs\&.oracle\&.com/javase/8/docs/api/ \&. com\&.mypackage ++\fBjavadoc \-linkoffline http://docs\&.oracle\&.com/javase/8/docs/api/ \&. com\&.mypackage \fR ++ + .fi + .if n \{\ + .RE + .\} +-³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÁêÂÐ¥ê¥ó¥¯.PP +-\fI\-linkoffline\fR¤òÁêÂХѥ¹¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¤³¤È¤Ï¤¢¤Þ¤ê¤¢¤ê¤Þ¤»¤ó¡£Íýͳ¤Ïñ½ã¤Ç¡¢Ä̾ï¤Ï\fI\-link\fR¤Ç´Ö¤Ë¹ç¤¦¤«¤é¤Ç¤¹¡£\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢Ä̾package\-list¥Õ¥¡¥¤¥ë¤Ï¥í¡¼¥«¥ë¤Ç¡¢ÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¥ê¥ó¥¯Àè¤Î¥Õ¥¡¥¤¥ë¤â¥í¡¼¥«¥ë¤Ê¤Î¤Ç¡¢Ä̾ï¤Ï\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Î2¤Ä¤Î°ú¿ô¤Ë¡¢°Û¤Ê¤ë¥Ñ¥¹¤ò»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£2¤Ä¤Î°ú¿ô¤¬Æ±°ì¤Î¾ì¹ç¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£ +-package\-list¥Õ¥¡¥¤¥ë¤Î¼êÆ°¤Ç¤ÎºîÀ®.PP +-package\-list¥Õ¥¡¥¤¥ë¤¬¤Þ¤À¸ºß¤·¤Ê¤¯¤Æ¤â¡¢¥É¥­¥å¥á¥ó¥È¤Î¥ê¥ó¥¯Àè¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤ò¼êÆ°¤ÇºîÀ®¤·¡¢\fIpackagelistLoc\fR¤Ç¤½¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIcom\&.apipackage\fR¤¬ºÇ½é¤ËÀ¸À®¤µ¤ì¤¿»þÅÀ¤Ç\fIcom\&.spipackage\fR¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤¬Â¸ºß¤·¤Ê¤¤¤È¤¤¤¦Á°½Ð¤Î¥±¡¼¥¹¤¬°ìÎã¤È¤·¤Æµó¤²¤é¤ì¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¤ï¤«¤Ã¤Æ¤¤¤ë¤â¤Î¤Î¡¢¤Þ¤À¸ø³«¤µ¤ì¤Æ¤¤¤Ê¤¤¡¢¿·¤·¤¤³°Éô¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤¹¤ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¤Þ¤¿¡¢package\-list¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤¤Javadoc 1\&.0¤Þ¤¿¤Ï1\&.1¤ÇÀ¸À®¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸ÍѤËpackage\-list¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¾ì¹ç¤Ë¤â¡¢¤³¤ÎÊýË¡¤¬»ÈÍѤǤ­¤Þ¤¹¡£Æ±Íͤˡ¢2¤Ä¤Î´ë¶È¤¬Ì¤¸ø³«¤Îpackage\-list¥Õ¥¡¥¤¥ë¤ò¶¦Í­¤Ç¤­¤ë¤¿¤á¡¢¥¯¥í¥¹¥ê¥ó¥¯¤òÀßÄꤷ¤¿¥É¥­¥å¥á¥ó¥È¤òƱ»þ¤Ë¥ê¥ê¡¼¥¹¤¹¤ë¤³¤È¤â²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ +-Ê£¿ô¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯.PP +-»²¾ÈÀè¤ÎÀ¸À®¥É¥­¥å¥á¥ó¥È¤´¤È¤Ë1²ó¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.PP ++³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÁêÂÐ¥ê¥ó¥¯ ++.PP ++\fB\-linkoffline\fR¤òÁêÂХѥ¹¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¤³¤È¤Ï¤¢¤Þ¤ê¤¢¤ê¤Þ¤»¤ó¡£Íýͳ¤Ïñ½ã¤Ç¡¢Ä̾ï¤Ï\fB\-link\fR¤Ç´Ö¤Ë¹ç¤¦¤«¤é¤Ç¤¹¡£\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢Ä̾package\-list¥Õ¥¡¥¤¥ë¤Ï¥í¡¼¥«¥ë¤Ç¡¢ÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¥ê¥ó¥¯Àè¤Î¥Õ¥¡¥¤¥ë¤â¥í¡¼¥«¥ë¤Ê¤Î¤Ç¡¢Ä̾ï¤Ï\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Î2¤Ä¤Î°ú¿ô¤Ë¡¢°Û¤Ê¤ë¥Ñ¥¹¤ò»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£2¤Ä¤Î°ú¿ô¤¬Æ±°ì¤Î¾ì¹ç¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++.PP ++package\-list¥Õ¥¡¥¤¥ë¤Î¼êÆ°¤Ç¤ÎºîÀ® ++.PP ++package\-list¥Õ¥¡¥¤¥ë¤¬¤Þ¤À¸ºß¤·¤Ê¤¯¤Æ¤â¡¢¥É¥­¥å¥á¥ó¥È¤Î¥ê¥ó¥¯Àè¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤ò¼êÆ°¤ÇºîÀ®¤·¡¢\fBpackagelistLoc\fR¤Ç¤½¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBcom\&.apipackage\fR¤¬ºÇ½é¤ËÀ¸À®¤µ¤ì¤¿»þÅÀ¤Ç\fBcom\&.spipackage\fR¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤¬Â¸ºß¤·¤Ê¤¤¤È¤¤¤¦Á°½Ð¤Î¥±¡¼¥¹¤¬°ìÎã¤È¤·¤Æµó¤²¤é¤ì¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¤ï¤«¤Ã¤Æ¤¤¤ë¤â¤Î¤Î¡¢¤Þ¤À¸ø³«¤µ¤ì¤Æ¤¤¤Ê¤¤¡¢¿·¤·¤¤³°Éô¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤¹¤ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¤Þ¤¿¡¢package\-list¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤¤Javadoc 1\&.0¤Þ¤¿¤Ï1\&.1¤ÇÀ¸À®¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸ÍѤËpackage\-list¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¾ì¹ç¤Ë¤â¡¢¤³¤ÎÊýË¡¤¬»ÈÍѤǤ­¤Þ¤¹¡£Æ±Íͤˡ¢2¤Ä¤Î´ë¶È¤¬Ì¤¸ø³«¤Îpackage\-list¥Õ¥¡¥¤¥ë¤ò¶¦Í­¤Ç¤­¤ë¤¿¤á¡¢¥¯¥í¥¹¥ê¥ó¥¯¤òÀßÄꤷ¤¿¥É¥­¥å¥á¥ó¥È¤òƱ»þ¤Ë¥ê¥ê¡¼¥¹¤¹¤ë¤³¤È¤â²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.PP ++Ê£¿ô¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯ ++.PP ++»²¾ÈÀè¤ÎÀ¸À®¥É¥­¥å¥á¥ó¥È¤´¤È¤Ë1²ó¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-linkoffline extdocURL1 packagelistLoc1 \-linkoffline extdocURL2 +-packagelistLoc2 \&.\&.\&. ++\fBjavadoc \-linkoffline extdocURL1 packagelistLoc1 \-linkoffline extdocURL2\fR ++\fBpackagelistLoc2 \&.\&.\&.\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥É¥­¥å¥á¥ó¥È¤Î¹¹¿·.PP +-¥×¥í¥¸¥§¥¯¥È¤Ë²¿½½¤Þ¤¿¤Ï²¿É´¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤â¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Ä¥ê¡¼Á´ÂΤǤ¹¤Ç¤Ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¤³¤È¤¬¤¢¤ë¾ì¹ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤ï¤º¤«¤ÊÊѹ¹¤ò¿×®¤Ë²Ã¤¨¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î°ìÉô¤Ç\fIjavadoc\fR¥³¥Þ¥ó¥É¤òºÆ¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£2²óÌܤμ¹Ԥϡ¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òÊѹ¹¤·¡¢Àë¸À¤ÏÊѹ¹¤·¤Ê¤¤¾ì¹ç¤Ë¤Î¤ßÀµ¤·¤¯½èÍý¤µ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤ËÂФ·¤ÆÀë¸À¤òÄɲᢺï½ü¡¢¤Þ¤¿¤ÏÊѹ¹¤·¤¿¾ì¹ç¤Ï¡¢º÷°ú¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¡¢·Ñ¾µ¤µ¤ì¤ë¥á¥ó¥Ð¡¼¤Î¥ê¥¹¥È¡¢»ÈÍÑ¥Ú¡¼¥¸¤Ê¤É¤Î¾ì½ê¤Ç¡¢¥ê¥ó¥¯¤¬²õ¤ì¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ +-.PP +-¤Þ¤º¡¢¤³¤Î¿·¤·¤¤¾®µ¬ÌϤʼ¹ԤǻÈÍѤ¹¤ë¡¢¿·¤·¤¤À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê(update¤Ê¤É)¤òºîÀ®¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¸µ¤ÎÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤Ïhtml¤Ç¤¹¡£ºÇ¤âñ½ã¤ÊÎã¤Ç¤Ï¡¢html¥Ç¥£¥ì¥¯¥È¥ê¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¤Þ¤¹¡£\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ÎÂè1°ú¿ô¤Ë¥«¥ì¥ó¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê(\&.)¤òÀßÄꤷ¡¢Âè2°ú¿ô¤Ëpackage\-list¤¬¸¡º÷¤µ¤ì¤ëhtml¤Ø¤ÎÁêÂХѥ¹¤òÀßÄꤷ¡¢¹¹¿·¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¤ß¤òÅϤ·¤Þ¤¹¡£ ++.PP ++¥É¥­¥å¥á¥ó¥È¤Î¹¹¿· ++.PP ++¥×¥í¥¸¥§¥¯¥È¤Ë²¿½½¤Þ¤¿¤Ï²¿É´¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤â¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Ä¥ê¡¼Á´ÂΤǤ¹¤Ç¤Ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¤³¤È¤¬¤¢¤ë¾ì¹ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤ï¤º¤«¤ÊÊѹ¹¤ò¿×®¤Ë²Ã¤¨¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î°ìÉô¤Ç\fBjavadoc\fR¥³¥Þ¥ó¥É¤òºÆ¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£2²óÌܤμ¹Ԥϡ¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òÊѹ¹¤·¡¢Àë¸À¤ÏÊѹ¹¤·¤Ê¤¤¾ì¹ç¤Ë¤Î¤ßÀµ¤·¤¯½èÍý¤µ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤ËÂФ·¤ÆÀë¸À¤òÄɲᢺï½ü¡¢¤Þ¤¿¤ÏÊѹ¹¤·¤¿¾ì¹ç¤Ï¡¢º÷°ú¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¡¢·Ñ¾µ¤µ¤ì¤ë¥á¥ó¥Ð¡¼¤Î¥ê¥¹¥È¡¢»ÈÍÑ¥Ú¡¼¥¸¤Ê¤É¤Î¾ì½ê¤Ç¡¢¥ê¥ó¥¯¤¬²õ¤ì¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++¤Þ¤º¡¢¤³¤Î¿·¤·¤¤¾®µ¬ÌϤʼ¹ԤǻÈÍѤ¹¤ë¡¢¿·¤·¤¤À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê(update¤Ê¤É)¤òºîÀ®¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¸µ¤ÎÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤Ïhtml¤Ç¤¹¡£ºÇ¤âñ½ã¤ÊÎã¤Ç¤Ï¡¢html¥Ç¥£¥ì¥¯¥È¥ê¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¤Þ¤¹¡£\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ÎÂè1°ú¿ô¤Ë¥«¥ì¥ó¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê(\&.)¤òÀßÄꤷ¡¢Âè2°ú¿ô¤Ëpackage\-list¤¬¸¡º÷¤µ¤ì¤ëhtml¤Ø¤ÎÁêÂХѥ¹¤òÀßÄꤷ¡¢¹¹¿·¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¤ß¤òÅϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d update \-linkoffline \&. html com\&.mypackage ++\fBjavadoc \-d update \-linkoffline \&. html com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î½ªÎ»¸å¡¢update/com/packageÆâ¤ÎÀ¸À®¤µ¤ì¤¿¥¯¥é¥¹¤Î¥Ú¡¼¥¸¤ò¥³¥Ô¡¼¤·(³µÍפäº÷°ú¤Ï½ü¤¯)¡¢html/com/packageÆâ¤Î¸µ¤Î¥Õ¥¡¥¤¥ë¤Ë¾å½ñ¤­¤·¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î½ªÎ»¸å¡¢update/com/packageÆâ¤ÎÀ¸À®¤µ¤ì¤¿¥¯¥é¥¹¤Î¥Ú¡¼¥¸¤ò¥³¥Ô¡¼¤·(³µÍפäº÷°ú¤Ï½ü¤¯)¡¢html/com/packageÆâ¤Î¸µ¤Î¥Õ¥¡¥¤¥ë¤Ë¾å½ñ¤­¤·¤Þ¤¹¡£ + .PP + \-linksource + .RS 4 + ³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(¹ÔÈÖ¹æÉÕ¤­)¤ÎHTML¥Ð¡¼¥¸¥ç¥ó¤òºîÀ®¤·¡¢É¸½àHTML¥É¥­¥å¥á¥ó¥È¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¥Õ¥£¡¼¥ë¥É¤ËÂФ·¤ÆºîÀ®¤µ¤ì¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¤¿¤È¤¨¤Ð¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥¹¥È¥é¥¯¥¿¤äÀ¸À®¤µ¤ì¤¿¥¯¥é¥¹¤ËÂФ·¤Æ¤Ï¡¢¥ê¥ó¥¯¤ÏºîÀ®¤µ¤ì¤Þ¤»¤ó¡£ + .sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-public\fR¡¢\fI\-package\fR¡¢\fI\-protected\fR¤ª¤è¤Ó\fI\-private\fR¤Î³Æ¥ª¥×¥·¥ç¥ó¤È¤Ï´Ø·¸¤Ê¤¯¡¢Èó¸ø³«¤Î¥¯¥é¥¹¡¢¥Õ¥£¡¼¥ë¥É¡¢Èó¸ø³«¤Î¥á¥½¥Ã¥É¤ÎËÜÂΤò¤Ï¤¸¤á¤È¤¹¤ëÁȤ߹þ¤Þ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎÈó¸ø³«¼ÂÁõ¤Î¾ÜºÙ¤ò¸ø³«¤·¤Þ¤¹¡£\fI\-private\fR¥ª¥×¥·¥ç¥ó¤â¤¢¤ï¤»¤Æ»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢Èó¸ø³«¤Î¥¯¥é¥¹¤ä¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î°ìÉô¤Ë¤Ï¡¢¥ê¥ó¥¯¤ò²ð¤·¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ +-.sp +-³Æ¥ê¥ó¥¯¤Ï¡¢¤½¤ÎÀë¸ÀÆâ¤Î¼±ÊÌ»Ò̾¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIButton\fR¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ø¤Î¥ê¥ó¥¯¤Ï¡¢\fIButton\fR¤È¤¤¤¦¸ì¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-public\fR¡¢\fB\-package\fR¡¢\fB\-protected\fR¤ª¤è¤Ó\fB\-private\fR¤Î³Æ¥ª¥×¥·¥ç¥ó¤È¤Ï´Ø·¸¤Ê¤¯¡¢Èó¸ø³«¤Î¥¯¥é¥¹¡¢¥Õ¥£¡¼¥ë¥É¡¢Èó¸ø³«¤Î¥á¥½¥Ã¥É¤ÎËÜÂΤò¤Ï¤¸¤á¤È¤¹¤ëÁȤ߹þ¤Þ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎÈó¸ø³«¼ÂÁõ¤Î¾ÜºÙ¤ò¸ø³«¤·¤Þ¤¹¡£\fB\-private\fR¥ª¥×¥·¥ç¥ó¤â¤¢¤ï¤»¤Æ»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢Èó¸ø³«¤Î¥¯¥é¥¹¤ä¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î°ìÉô¤Ë¤Ï¡¢¥ê¥ó¥¯¤ò²ð¤·¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ++.sp ++³Æ¥ê¥ó¥¯¤Ï¡¢¤½¤ÎÀë¸ÀÆâ¤Î¼±ÊÌ»Ò̾¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBButton\fR¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ø¤Î¥ê¥ó¥¯¤Ï¡¢\fBButton\fR¤È¤¤¤¦¸ì¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public class Button extends Component implements Accessible ++\fBpublic class Button extends Component implements Accessible\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIButton\fR¥¯¥é¥¹¤Î\fIgetLabel\fR¥á¥½¥Ã¥É¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ø¤Î¥ê¥ó¥¯¤Ï¡¢\fIgetLabel\fR¤È¤¤¤¦¸ì¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBButton\fR¥¯¥é¥¹¤Î\fBgetLabel\fR¥á¥½¥Ã¥É¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ø¤Î¥ê¥ó¥¯¤Ï¡¢\fBgetLabel\fR¤È¤¤¤¦¸ì¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public String getLabel() ++\fBpublic String getLabel()\fR ++ + .fi + .if n \{\ + .RE +@@ -2960,7 +3085,7 @@ + .PP + \-group groupheading \fIpackagepattern:packagepattern\fR + .RS 4 +-³µÍ×¥Ú¡¼¥¸¤ÎÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¡¢»ØÄꤷ¤¿¥°¥ë¡¼¥×¤Ëʬ¤±¤Æ¡¢¥°¥ë¡¼¥×¤´¤È¤Ëɽ¤òºîÀ®¤·¤Þ¤¹¡£³Æ¥°¥ë¡¼¥×¤Ï¡¢¤½¤ì¤¾¤ìÊ̤Î\fI\-group\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤Þ¤¹¡£¥°¥ë¡¼¥×¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿½ç½ø¤Ç¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢¥°¥ë¡¼¥×Æâ¤Ç¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£»ØÄꤷ¤¿\fI\-group\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢\fIpackagepattern\fR¼°¤Î¥ê¥¹¥È¤Ë°ìÃפ¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤¬¡¢¸«½Ð¤·¤È¤·¤Æ\fIgroupheading\fR¤ò»ý¤Ä1¤Ä¤Îɽ¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++³µÍ×¥Ú¡¼¥¸¤ÎÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¡¢»ØÄꤷ¤¿¥°¥ë¡¼¥×¤Ëʬ¤±¤Æ¡¢¥°¥ë¡¼¥×¤´¤È¤Ëɽ¤òºîÀ®¤·¤Þ¤¹¡£³Æ¥°¥ë¡¼¥×¤Ï¡¢¤½¤ì¤¾¤ìÊ̤Î\fB\-group\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤Þ¤¹¡£¥°¥ë¡¼¥×¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿½ç½ø¤Ç¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢¥°¥ë¡¼¥×Æâ¤Ç¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£»ØÄꤷ¤¿\fB\-group\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢\fBpackagepattern\fR¼°¤Î¥ê¥¹¥È¤Ë°ìÃפ¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤¬¡¢¸«½Ð¤·¤È¤·¤Æ\fIgroupheading\fR¤ò»ý¤Ä1¤Ä¤Îɽ¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2970,7 +3095,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIgroupheading\fR¤Ë¤Ï¡¢Ç¤°Õ¤Î¥Æ¥­¥¹¥È¤ò»ØÄê¤Ç¤­¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤Ï¡¢¥°¥ë¡¼¥×¤Îɽ¸«½Ð¤·¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBgroupheading\fR¤Ë¤Ï¡¢Ç¤°Õ¤Î¥Æ¥­¥¹¥È¤ò»ØÄê¤Ç¤­¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤Ï¡¢¥°¥ë¡¼¥×¤Îɽ¸«½Ð¤·¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2981,54 +3106,55 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackagepattern\fR¤ÎÃͤˤϡ¢Ç¤°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ÎÀèƬÉôʬ¤È¤½¤ì¤Ë³¤¯1¤Ä¤Î¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ÇǤ°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯¤Ï»ÈÍѤǤ­¤ëÍ£°ì¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤Ç¡¢Ç¤°Õ¤Îʸ»ú¤Ë°ìÃפ¹¤ë¡¢¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£1¤Ä¤Î¥°¥ë¡¼¥×¤Ë¤Ï¡¢¥³¥í¥ó(:)¤Ç¶èÀڤäÆÊ£¿ô¤Î¥Ñ¥¿¡¼¥ó¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Ñ¥¿¡¼¥ó¤Þ¤¿¤Ï¥Ñ¥¿¡¼¥ó¡¦¥ê¥¹¥È¤Ç¥¢¥¹¥¿¥ê¥¹¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥Ñ¥¿¡¼¥ó¡¦¥ê¥¹¥È¤Ï\fI"java\&.lang*:java\&.util"\fR¤Î¤è¤¦¤Ë°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.RE +-.sp +-\fI\-group\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¸«½Ð¤·\fIPackages\fR¤ª¤è¤ÓŬÀڤʾ®¸«½Ð¤·¤ò»ý¤Ä1¤Ä¤Î¥°¥ë¡¼¥×¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£¾®¸«½Ð¤·¤Ë¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸(¤¹¤Ù¤Æ¤Î¥°¥ë¡¼¥×)¤¬´Þ¤Þ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢»Ä¤ê¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡Ö¤½¤Î¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡×¤È¤¤¤¦¥µ¥Ö¸«½Ð¤·¤ò»ý¤ÄÆÈΩ¤·¤¿¥°¥ë¡¼¥×¤ËÆþ¤ì¤é¤ì¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤Î\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢3¤Ä¤Î¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤¬\fI¡Ö¥³¥¢¡×\fR¡¢\fI¡Ö³ÈÄ¥¡×\fR¤ª¤è¤Ó\fI¡Ö¤½¤Î¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡×\fR¤Ëʬ¤±¤é¤ì¤Þ¤¹¡£\fIjava\&.lang*\fR¤Ç¤Ï¡¢ºÇ¸å¤Î¥É¥Ã¥È(\&.)¤ò»ØÄꤷ¤Æ¤¤¤Þ¤»¤ó¡£\fIjava\&.lang\&.*\fR¤Î¤è¤¦¤Ë¥É¥Ã¥È¤òÆþ¤ì¤ë¤È¡¢\fI java\&.lang\fR¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBpackagepattern\fR¤ÎÃͤˤϡ¢Ç¤°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ÎÀèƬÉôʬ¤È¤½¤ì¤Ë³¤¯1¤Ä¤Î¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ÇǤ°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯¤Ï»ÈÍѤǤ­¤ëÍ£°ì¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤Ç¡¢Ç¤°Õ¤Îʸ»ú¤Ë°ìÃפ¹¤ë¡¢¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£1¤Ä¤Î¥°¥ë¡¼¥×¤Ë¤Ï¡¢¥³¥í¥ó(:)¤Ç¶èÀڤäÆÊ£¿ô¤Î¥Ñ¥¿¡¼¥ó¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Ñ¥¿¡¼¥ó¤Þ¤¿¤Ï¥Ñ¥¿¡¼¥ó¡¦¥ê¥¹¥È¤Ç¥¢¥¹¥¿¥ê¥¹¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥Ñ¥¿¡¼¥ó¡¦¥ê¥¹¥È¤Ï\fB"java\&.lang*:java\&.util"\fR¤Î¤è¤¦¤Ë°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.sp ++\fB\-group\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¸«½Ð¤·\fIPackages\fR¤ª¤è¤ÓŬÀڤʾ®¸«½Ð¤·¤ò»ý¤Ä1¤Ä¤Î¥°¥ë¡¼¥×¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£¾®¸«½Ð¤·¤Ë¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸(¤¹¤Ù¤Æ¤Î¥°¥ë¡¼¥×)¤¬´Þ¤Þ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢»Ä¤ê¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡Ö¤½¤Î¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡×¤È¤¤¤¦¥µ¥Ö¸«½Ð¤·¤ò»ý¤ÄÆÈΩ¤·¤¿¥°¥ë¡¼¥×¤ËÆþ¤ì¤é¤ì¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¼¡¤Î\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢3¤Ä¤Î¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤¬\fI¡Ö¥³¥¢¡×\fR¡¢\fI¡Ö³ÈÄ¥¡×\fR¤ª¤è¤Ó\fI¡Ö¤½¤Î¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡×\fR¤Ëʬ¤±¤é¤ì¤Þ¤¹¡£\fBjava\&.lang*\fR¤Ç¤Ï¡¢ºÇ¸å¤Î¥É¥Ã¥È(\&.)¤ò»ØÄꤷ¤Æ¤¤¤Þ¤»¤ó¡£\fBjava\&.lang\&.*\fR¤Î¤è¤¦¤Ë¥É¥Ã¥È¤òÆþ¤ì¤ë¤È¡¢\fB java\&.lang\fR¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-group "Core Packages" "java\&.lang*:java\&.util" +- \-group "Extension Packages" "javax\&.*" +- java\&.lang java\&.lang\&.reflect java\&.util javax\&.servlet java\&.new ++\fBjavadoc \-group "Core Packages" "java\&.lang*:java\&.util"\fR ++\fB \-group "Extension Packages" "javax\&.*"\fR ++\fB java\&.lang java\&.lang\&.reflect java\&.util javax\&.servlet java\&.new\fR ++ + .fi + .if n \{\ + .RE + .\} + \fB¥³¥¢¡¦¥Ñ¥Ã¥±¡¼¥¸\fR + .sp +-\fIjava\&.lang\fR +-.sp +-\fIjava\&.lang\&.reflect\fR +-.sp +-\fIjava\&.util\fR ++\fBjava\&.lang\fR ++.sp ++\fBjava\&.lang\&.reflect\fR ++.sp ++\fBjava\&.util\fR + .sp + \fB³ÈÄ¥µ¡Ç½¥Ñ¥Ã¥±¡¼¥¸\fR + .sp +-\fIjavax\&.servlet\fR ++\fBjavax\&.servlet\fR + .sp + \fBOther Packages\fR + .sp +-\fIjava\&.new\fR ++\fBjava\&.new\fR + .RE + .PP + \-nodeprecated + .RS 4 +-Èó¿ä¾©¤ÎAPI¤ò¥É¥­¥å¥á¥ó¥È¤ËÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢\fI\-nodeprecatedlist\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸¸ú²Ì¤¬¤¢¤ê¡¢¥É¥­¥å¥á¥ó¥È¤Î¾¤ÎÉôʬÁ´ÂΤǤ⡢Èó¿ä¾©¤ÎAPI¤¬À¸À®¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¡¼¥É¤òµ­½Ò¤·¤Æ¤¤¤ë¤È¤­¡¢Èó¿ä¾©¤Î¥³¡¼¥É¤Ë¤è¤Ã¤Æµ¤¤ò»¶¤é¤µ¤ì¤¿¤¯¤Ê¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ ++Èó¿ä¾©¤ÎAPI¤ò¥É¥­¥å¥á¥ó¥È¤ËÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢\fB\-nodeprecatedlist\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸¸ú²Ì¤¬¤¢¤ê¡¢¥É¥­¥å¥á¥ó¥È¤Î¾¤ÎÉôʬÁ´ÂΤǤ⡢Èó¿ä¾©¤ÎAPI¤¬À¸À®¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¡¼¥É¤òµ­½Ò¤·¤Æ¤¤¤ë¤È¤­¡¢Èó¿ä¾©¤Î¥³¡¼¥É¤Ë¤è¤Ã¤Æµ¤¤ò»¶¤é¤µ¤ì¤¿¤¯¤Ê¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ + .RE + .PP + \-nodeprecatedlist + .RS 4 +-Èó¿ä¾©¤ÎAPI¤Î¥ê¥¹¥È¤ò´Þ¤à¥Õ¥¡¥¤¥ë(deprecated\-list\&.html)¡¢¤ª¤è¤Ó¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¤½¤Î¥Ú¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¤¬À¸À®¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢°ú¤­Â³¤­¡¢¥É¥­¥å¥á¥ó¥È¤Î¾¤ÎÉôʬ¤Ç¤Ï¡¢Èó¿ä¾©¤ÎAPI¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Èó¿ä¾©¤ÎAPI¤¬¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë´Þ¤Þ¤ì¤Æ¤ª¤é¤º¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤ò¤¹¤Ã¤­¤ê¤È¸«¤»¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ ++Èó¿ä¾©¤ÎAPI¤Î¥ê¥¹¥È¤ò´Þ¤à¥Õ¥¡¥¤¥ë(deprecated\-list\&.html)¡¢¤ª¤è¤Ó¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¤½¤Î¥Ú¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¤¬À¸À®¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢°ú¤­Â³¤­¡¢¥É¥­¥å¥á¥ó¥È¤Î¾¤ÎÉôʬ¤Ç¤Ï¡¢Èó¿ä¾©¤ÎAPI¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Èó¿ä¾©¤ÎAPI¤¬¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë´Þ¤Þ¤ì¤Æ¤ª¤é¤º¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤ò¤¹¤Ã¤­¤ê¤È¸«¤»¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ + .RE + .PP + \-nosince + .RS 4 +-À¸À®¥É¥­¥å¥á¥ó¥È¤«¤é¡¢\fI@since\fR¥¿¥°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿\fI¡ÖƳÆþ¤µ¤ì¤¿¥Ð¡¼¥¸¥ç¥ó¡×\fR¥»¥¯¥·¥ç¥ó¤ò¾Êά¤·¤Þ¤¹¡£ ++À¸À®¥É¥­¥å¥á¥ó¥È¤«¤é¡¢\fB@since\fR¥¿¥°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿\fB¡ÖƳÆþ¤µ¤ì¤¿¥Ð¡¼¥¸¥ç¥ó¡×\fR¥»¥¯¥·¥ç¥ó¤ò¾Êά¤·¤Þ¤¹¡£ + .RE + .PP + \-notree +@@ -3048,18 +3174,19 @@ + .PP + \-nonavbar + .RS 4 +-Ä̾À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤ÎºÇ¾åÉô¤ÈºÇ²¼Éô¤Ëɽ¼¨¤µ¤ì¤ë¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¡¢¥Ø¥Ã¥À¡¼¡¢¤ª¤è¤Ó¥Õ¥Ã¥¿¡¼¤òÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fI\-nonavbar\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤Ë±Æ¶Á¤òÍ¿¤¨¤Þ¤»¤ó¡£\fI\-nonavbar\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢°õºþ¤¹¤ë¤¿¤á¤Ë¤Î¤ß¥Õ¥¡¥¤¥ë¤òPostScript¤äPDF¤ËÊÑ´¹¤¹¤ë¾ì¹ç¤Ê¤É¡¢ÆâÍƤΤߤ¬½ÅÍפǡ¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¤ÎɬÍפ¬¤Ê¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ ++Ä̾À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤ÎºÇ¾åÉô¤ÈºÇ²¼Éô¤Ëɽ¼¨¤µ¤ì¤ë¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¡¢¥Ø¥Ã¥À¡¼¡¢¤ª¤è¤Ó¥Õ¥Ã¥¿¡¼¤òÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fB\-nonavbar\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤Ë±Æ¶Á¤òÍ¿¤¨¤Þ¤»¤ó¡£\fB\-nonavbar\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢°õºþ¤¹¤ë¤¿¤á¤Ë¤Î¤ß¥Õ¥¡¥¤¥ë¤òPostScript¤äPDF¤ËÊÑ´¹¤¹¤ë¾ì¹ç¤Ê¤É¡¢ÆâÍƤΤߤ¬½ÅÍפǡ¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¤ÎɬÍפ¬¤Ê¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ + .RE + .PP + \-helpfile \fIpath\efilename\fR + .RS 4 +-ºÇ¾åÉô¤ª¤è¤ÓºÇ²¼Éô¤Î¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¡Ö¥Ø¥ë¥×¡×¥ê¥ó¥¯¤Î¥ê¥ó¥¯Àè¤È¤Ê¤ëÂåÂإإë¥×¡¦¥Õ¥¡¥¤¥ëpath\efilename¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥ÉÆâ¤Ç¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ëhelp\-doc\&.html¤ò¼«Æ°ºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤Ë¤Ï¤É¤ó¤Ê̾Á°¤Ç¤â»ØÄê¤Ç¤­¡¢help\-doc\&.html¤Ë¸ÂÄꤵ¤ì¤Þ¤»¤ó¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼Æâ¤Î¥ê¥ó¥¯¤òɬÍפ˱þ¤¸¤ÆÄ´À°¤·¤Þ¤¹¡£ ++ºÇ¾åÉô¤ª¤è¤ÓºÇ²¼Éô¤Î¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¡Ö¥Ø¥ë¥×¡×¥ê¥ó¥¯¤Î¥ê¥ó¥¯Àè¤È¤Ê¤ëÂåÂإإë¥×¡¦¥Õ¥¡¥¤¥ëpath\efilename¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥ÉÆâ¤Ç¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ëhelp\-doc\&.html¤ò¼«Æ°ºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤Ë¤Ï¤É¤ó¤Ê̾Á°¤Ç¤â»ØÄê¤Ç¤­¡¢help\-doc\&.html¤Ë¸ÂÄꤵ¤ì¤Þ¤»¤ó¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼Æâ¤Î¥ê¥ó¥¯¤òɬÍפ˱þ¤¸¤ÆÄ´À°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-helpfile /home/user/myhelp\&.html java\&.awt\&. ++\fBjavadoc \-helpfile /home/user/myhelp\&.html java\&.awt\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -3068,13 +3195,14 @@ + .PP + \-stylesheet \fIpath/filename \fR + .RS 4 +-ÂåÂØHTML¥¹¥¿¥¤¥ë¥·¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥ÉÆâ¤Ç¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥¹¥¿¥¤¥ë¥·¡¼¥È¡¦¥Õ¥¡¥¤¥ëstylesheet\&.css¤ò¼«Æ°ºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤Ë¤Ï¤É¤ó¤Ê̾Á°¤Ç¤â»ØÄê¤Ç¤­¡¢stylesheet\&.css¤Ë¸ÂÄꤵ¤ì¤Þ¤»¤ó¡£ ++ÂåÂØHTML¥¹¥¿¥¤¥ë¥·¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥ÉÆâ¤Ç¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥¹¥¿¥¤¥ë¥·¡¼¥È¡¦¥Õ¥¡¥¤¥ëstylesheet\&.css¤ò¼«Æ°ºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤Ë¤Ï¤É¤ó¤Ê̾Á°¤Ç¤â»ØÄê¤Ç¤­¡¢stylesheet\&.css¤Ë¸ÂÄꤵ¤ì¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-stylesheet file /home/user/mystylesheet\&.css com\&.mypackage ++\fBjavadoc \-stylesheet file /home/user/mystylesheet\&.css com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE +@@ -3083,7 +3211,7 @@ + .PP + \-serialwarn + .RS 4 +-\fI@serial\fR¥¿¥°¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Javadoc 1\&.2\&.2°Ê¹ß¤Ç¤Ï¡¢Ä¾Î󲽤ηٹð¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤È¤ÏµÕ¤ÎÆ°ºî¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢Ä¾Î󲽤ηٹð¤¬É½¼¨¤µ¤ì¤ë¤Î¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎľÎó²½²Äǽ¥Õ¥£¡¼¥ë¥É¤È\fIwriteExternal\fR¥á¥½¥Ã¥É¤òŬÀڤ˥ɥ­¥å¥á¥ó¥È²½¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£ ++\fB@serial\fR¥¿¥°¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Javadoc 1\&.2\&.2°Ê¹ß¤Ç¤Ï¡¢Ä¾Î󲽤ηٹð¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤È¤ÏµÕ¤ÎÆ°ºî¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢Ä¾Î󲽤ηٹð¤¬É½¼¨¤µ¤ì¤ë¤Î¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎľÎó²½²Äǽ¥Õ¥£¡¼¥ë¥É¤È\fBwriteExternal\fR¥á¥½¥Ã¥É¤òŬÀڤ˥ɥ­¥å¥á¥ó¥È²½¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£ + .RE + .PP + \-charset \fIname\fR +@@ -3091,18 +3219,19 @@ + ¤³¤Î¥É¥­¥å¥á¥ó¥ÈÍѤÎHTMLʸ»ú¥»¥Ã¥È¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î̾Á°¤Ï¡¢IANA Registry¤ÎCharacter Sets + (http://www\&.iana\&.org/assignments/character\-sets)¤Ë¼¨¤µ¤ì¤¿¡¢Í¥ÀèMIME̾¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢\fIjavadoc \-charset "iso\-8859\-1" mypackage\fR¤Ï¼¡¤Î¹Ô¤òÀ¸À®¤µ¤ì¤¿³Æ¥Ú¡¼¥¸¤Î¥Ø¥Ã¥À¡¼¤ËÁÞÆþ¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fBjavadoc \-charset "iso\-8859\-1" mypackage\fR¤Ï¼¡¤Î¹Ô¤òÀ¸À®¤µ¤ì¤¿³Æ¥Ú¡¼¥¸¤Î¥Ø¥Ã¥À¡¼¤ËÁÞÆþ¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-<META http\-equiv="Content\-Type" content="text/html; charset=ISO\-8859\-1"> ++\fB<META http\-equiv="Content\-Type" content="text/html; charset=ISO\-8859\-1">\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î\fIMETA\fR¥¿¥°¤Ï¡¢HTMLɸ½à(4197265¤ª¤è¤Ó4137321)¤ÎHTML Document Representation ++¤³¤Î\fBMETA\fR¥¿¥°¤Ï¡¢HTMLɸ½à(4197265¤ª¤è¤Ó4137321)¤ÎHTML Document Representation + (http://www\&.w3\&.org/TR/REC\-html40/charset\&.html#h\-5\&.2\&.2)¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + ¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +@@ -3113,22 +3242,23 @@ + À¸À®¤µ¤ì¤ëHTML¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î̾Á°¤Ï¡¢IANA Registry¤ÎCharacter Sets + (http://www\&.iana\&.org/assignments/character\-sets)¤Ë¼¨¤µ¤ì¤¿¡¢Í¥ÀèMIME̾¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fI\-docencoding\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤·¡¢\fI\-encoding\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢À¸À®¤µ¤ì¤¿HTML¥Õ¥¡¥¤¥ë¤Î°Å¹æ²½¤Ï\fI\-encoding\fR¥ª¥×¥·¥ç¥ó¤ÇÆÃÄꤵ¤ì¤Þ¤¹¡£Îã: +-\fIjavadoc \-docencoding"iso\-8859\-1" mypackage\fR¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-docencoding\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤·¡¢\fB\-encoding\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢À¸À®¤µ¤ì¤¿HTML¥Õ¥¡¥¤¥ë¤Î°Å¹æ²½¤Ï\fB\-encoding\fR¥ª¥×¥·¥ç¥ó¤ÇÆÃÄꤵ¤ì¤Þ¤¹¡£Îã: ++\fBjavadoc \-docencoding "iso\-8859\-1" mypackage\fR¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-keywords + .RS 4 +-HTML¥­¡¼¥ï¡¼¥É<META>¥¿¥°¤ò¡¢¥¯¥é¥¹¤´¤È¤ËÀ¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ËÄɲä·¤Þ¤¹¡£¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢<META>¥¿¥°¤ò¸¡º÷¤¹¤ë¥µ¡¼¥Á¡¦¥¨¥ó¥¸¥ó¤¬¥Ú¡¼¥¸¤ò¸«¤Ä¤±¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÁ´ÂΤò¸¡º÷¤¹¤ë¸¡º÷¥¨¥ó¥¸¥ó¤Î¤Û¤È¤ó¤É¤Ï<META>¥¿¥°¤ò»²¾È¤·¤Þ¤»¤ó¡£¥Ú¡¼¥¸¤¬¸íÍѤ·¤Æ¤¤¤ë²ÄǽÀ­¤¬¤¢¤ë¤«¤é¤Ç¤¹¡£¼«¿È¤ÎWeb¥µ¥¤¥È¤Ø¤Î¸¡º÷¤òÀ©¸Â¤¹¤ë¡¢´ë¶È¤Ë¤è¤êÄ󶡤µ¤ì¤ë¸¡º÷¥¨¥ó¥¸¥ó¤Ï¡¢<META>¥¿¥°¤ò»²¾È¤¹¤ë¤³¤È¤Ç²¸·Ã¤ò¼õ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£<META>¥¿¥°¤Ë¤Ï¡¢¥¯¥é¥¹¤Î´°Á´½¤¾þ̾¤È¡¢¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥á¥½¥Ã¥É¤Î½¤¾þ¤µ¤ì¤Æ¤¤¤Ê¤¤Ì¾Á°¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢¥¯¥é¥¹Ì¾¤ÈƱ¤¸¤Ç¤¢¤ë¤¿¤á´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹\fIString\fR¤Ï¼¡¤Î¥­¡¼¥ï¡¼¥É¤Ç³«»Ï¤·¤Þ¤¹¡£ ++HTML¥­¡¼¥ï¡¼¥É<META>¥¿¥°¤ò¡¢¥¯¥é¥¹¤´¤È¤ËÀ¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ËÄɲä·¤Þ¤¹¡£¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢<META>¥¿¥°¤ò¸¡º÷¤¹¤ë¥µ¡¼¥Á¡¦¥¨¥ó¥¸¥ó¤¬¥Ú¡¼¥¸¤ò¸«¤Ä¤±¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÁ´ÂΤò¸¡º÷¤¹¤ë¸¡º÷¥¨¥ó¥¸¥ó¤Î¤Û¤È¤ó¤É¤Ï<META>¥¿¥°¤ò»²¾È¤·¤Þ¤»¤ó¡£¥Ú¡¼¥¸¤¬¸íÍѤ·¤Æ¤¤¤ë²ÄǽÀ­¤¬¤¢¤ë¤«¤é¤Ç¤¹¡£¼«¿È¤ÎWeb¥µ¥¤¥È¤Ø¤Î¸¡º÷¤òÀ©¸Â¤¹¤ë¡¢´ë¶È¤Ë¤è¤êÄ󶡤µ¤ì¤ë¸¡º÷¥¨¥ó¥¸¥ó¤Ï¡¢<META>¥¿¥°¤ò»²¾È¤¹¤ë¤³¤È¤Ç²¸·Ã¤ò¼õ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£<META>¥¿¥°¤Ë¤Ï¡¢¥¯¥é¥¹¤Î´°Á´½¤¾þ̾¤È¡¢¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥á¥½¥Ã¥É¤Î½¤¾þ¤µ¤ì¤Æ¤¤¤Ê¤¤Ì¾Á°¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢¥¯¥é¥¹Ì¾¤ÈƱ¤¸¤Ç¤¢¤ë¤¿¤á´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹\fBString\fR¤Ï¼¡¤Î¥­¡¼¥ï¡¼¥É¤Ç³«»Ï¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-<META NAME="keywords" CONTENT="java\&.lang\&.String class"> +-<META NAME="keywords" CONTENT="CASE_INSENSITIVE_ORDER"> +-<META NAME="keywords" CONTENT="length()"> +-<META NAME="keywords" CONTENT="charAt()"> ++\fB<META NAME="keywords" CONTENT="java\&.lang\&.String class">\fR ++\fB<META NAME="keywords" CONTENT="CASE_INSENSITIVE_ORDER">\fR ++\fB<META NAME="keywords" CONTENT="length()">\fR ++\fB<META NAME="keywords" CONTENT="charAt()">\fR ++ + .fi + .if n \{\ + .RE +@@ -3137,105 +3267,108 @@ + .PP + \-tag \fItagname\fR:Xaoptcmf:"\fItaghead\fR" + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Î°ú¿ô¤ò1¤Ä¼è¤ëñ½ã¤Ê¥«¥¹¥¿¥à¡¦¥Ö¥í¥Ã¥¯¡¦¥¿¥°\fI@tagname\fR¤ò²ò¼á¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥¿¥°Ì¾¤Î¥¹¥Ú¥ë¥Á¥§¥Ã¥¯¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ç¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ë¸ºß¤¹¤ë¤¹¤Ù¤Æ¤Î¥«¥¹¥¿¥à¡¦¥¿¥°¤Ë¤Ä¤¤¤Æ¡¢\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤òÁȤ߹þ¤à¤³¤È¤¬½ÅÍפǤ¹¡£º£²ó¤Î¼Â¹Ô¤Ç¤Ï½ÐÎϤµ¤ì¤Ê¤¤¥¿¥°¤Ï¡¢\fIX\fR¤òÉÕ¤±¤Æ̵¸ú¤Ë¤·¤Þ¤¹¡£\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥¿¥°¤Î¸«½Ð¤·\fItaghead\fR¤òÂÀ»ú¤Ç½ÐÎϤ·¤Þ¤¹¡£¤½¤Î¼¡¤Î¹Ô¤Ë¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Î1¤Ä¤Î°ú¿ô¤Ç»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤¬Â³¤­¤Þ¤¹¡£¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤ÈƱÍÍ¡¢¤³¤Î°ú¿ô¤Î¥Æ¥­¥¹¥È¤Ë¤Ï¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤â²ò¼á¤µ¤ì¤Þ¤¹¡£½ÐÎϤϡ¢°ú¿ô¤ò1¤Ä¼è¤ëɸ½à¤Î¥¿¥°(\fI@return\fR¤ä\fI@author\fR¤Ê¤É)¤Î½ÐÎϤȤ褯»÷¤Æ¤¤¤Þ¤¹¡£\fItaghead\fR¤ÎÃͤò¾Êά¤¹¤ë¤È¡¢\fItagname\fR¤¬¸«½Ð¤·¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Î°ú¿ô¤ò1¤Ä¼è¤ëñ½ã¤Ê¥«¥¹¥¿¥à¡¦¥Ö¥í¥Ã¥¯¡¦¥¿¥°\fB@tagname\fR¤ò²ò¼á¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥¿¥°Ì¾¤Î¥¹¥Ú¥ë¥Á¥§¥Ã¥¯¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ç¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ë¸ºß¤¹¤ë¤¹¤Ù¤Æ¤Î¥«¥¹¥¿¥à¡¦¥¿¥°¤Ë¤Ä¤¤¤Æ¡¢\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤òÁȤ߹þ¤à¤³¤È¤¬½ÅÍפǤ¹¡£º£²ó¤Î¼Â¹Ô¤Ç¤Ï½ÐÎϤµ¤ì¤Ê¤¤¥¿¥°¤Ï¡¢\fBX\fR¤òÉÕ¤±¤Æ̵¸ú¤Ë¤·¤Þ¤¹¡£\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥¿¥°¤Î¸«½Ð¤·\fItaghead\fR¤òÂÀ»ú¤Ç½ÐÎϤ·¤Þ¤¹¡£¤½¤Î¼¡¤Î¹Ô¤Ë¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Î1¤Ä¤Î°ú¿ô¤Ç»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤¬Â³¤­¤Þ¤¹¡£¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤ÈƱÍÍ¡¢¤³¤Î°ú¿ô¤Î¥Æ¥­¥¹¥È¤Ë¤Ï¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤â²ò¼á¤µ¤ì¤Þ¤¹¡£½ÐÎϤϡ¢°ú¿ô¤ò1¤Ä¼è¤ëɸ½à¤Î¥¿¥°(\fB@return\fR¤ä\fB@author\fR¤Ê¤É)¤Î½ÐÎϤȤ褯»÷¤Æ¤¤¤Þ¤¹¡£\fItaghead\fR¤ÎÃͤò¾Êά¤¹¤ë¤È¡¢\fBtagname\fR¤¬¸«½Ð¤·¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .sp + \fB¥¿¥°¤ÎÇÛÃÖ\fR: +-\fIXaoptcmf\fR°ú¿ô¤Ë¤è¤ê¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ç¥¿¥°¤òÇÛÃ֤Ǥ­¤ë¾ì½ê¤¬·è¤Þ¤ê¡¢¥¿¥°¤ò̵¸ú¤Ë¤Ç¤­¤ë¤«¤É¤¦¤«(\fIX\fR¤ò»ÈÍѤ·¤Æ)¤¬·è¤Þ¤ê¤Þ¤¹¡£¥¿¥°¤ÎÇÛÃÖ°ÌÃÖ¤òÀ©¸Â¤·¤Ê¤¤¾ì¹ç¤Ï\fIa\fR¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤ì°Ê³°¤Îʸ»ú¤ÎÁȹ礻¤â²Äǽ¤Ç¤¹¡£ +-.sp +-\fIX\fR ++\fBXaoptcmf\fR°ú¿ô¤Ë¤è¤ê¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ç¥¿¥°¤òÇÛÃ֤Ǥ­¤ë¾ì½ê¤¬·è¤Þ¤ê¡¢¥¿¥°¤ò̵¸ú¤Ë¤Ç¤­¤ë¤«¤É¤¦¤«(\fBX\fR¤ò»ÈÍѤ·¤Æ)¤¬·è¤Þ¤ê¤Þ¤¹¡£¥¿¥°¤ÎÇÛÃÖ°ÌÃÖ¤òÀ©¸Â¤·¤Ê¤¤¾ì¹ç¤Ï\fBa\fR¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤ì°Ê³°¤Îʸ»ú¤ÎÁȹ礻¤â²Äǽ¤Ç¤¹¡£ ++.sp ++\fBX\fR + (¥¿¥°¤Î̵¸ú²½) + .sp +-\fIa\fR ++\fBa\fR + (¤¹¤Ù¤Æ) + .sp +-\fIo\fR ++\fBo\fR + (³µÍ×) + .sp +-\fIp\fR ++\fBp\fR + (¥Ñ¥Ã¥±¡¼¥¸) + .sp +-\fIt\fR ++\fBt\fR + (¥¿¥¤¥×¡¢¤Ä¤Þ¤ê¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹) + .sp +-\fIc\fR ++\fBc\fR + (¥³¥ó¥¹¥È¥é¥¯¥¿) + .sp +-\fIm\fR ++\fBm\fR + (¥á¥½¥Ã¥É) + .sp +-\fIf\fR ++\fBf\fR + (¥Õ¥£¡¼¥ë¥É) + .sp +-\fB¥·¥ó¥°¥ë¡¦¥¿¥°¤ÎÎã\fR: ¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤ÎǤ°Õ¤Î°ÌÃ֤ǻÈÍѤǤ­¤ë¥¿¥°¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fI\-tag todo:a:"To Do:"\fR +-.sp +-\fI@todo\fR¥¿¥°¤ò¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤È¤Î¤ß»ÈÍѤ¹¤ë¾ì¹ç¡¢\fI\-tag todo:cmf:"To Do:"\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-ºÇ¸å¤Î¥³¥í¥ó(:)¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¶èÀÚ¤êʸ»ú¤Ç¤Ï¤Ê¤¯¡¢¸«½Ð¤·¥Æ¥­¥¹¥È¤Î°ìÉô¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fI@todo\fR¥¿¥°¤ò´Þ¤à¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÍѤΤ¤¤º¤ì¤«¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@todo The documentation for this method needs work\fR¤Ç¤¹¡£ +-.sp +-\fB¥¿¥°Ì¾Æâ¤Î¥³¥í¥ó\fR: ¥¿¥°Ì¾Æâ¤Ç¥³¥í¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å¤ò»ÈÍѤ·¤Æ¥¨¥¹¥±¡¼¥×¤·¤Þ¤¹¡£¼¡¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢\fI\-tag ejb\e\e:bean:a:"EJB Bean:"\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fB¥·¥ó¥°¥ë¡¦¥¿¥°¤ÎÎã\fR: ¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤ÎǤ°Õ¤Î°ÌÃ֤ǻÈÍѤǤ­¤ë¥¿¥°¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fB\-tag todo:a:"To Do:"\fR ++.sp ++\fB@todo\fR¥¿¥°¤ò¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤È¤Î¤ß»ÈÍѤ¹¤ë¾ì¹ç¡¢\fB\-tag todo:cmf:"To Do:"\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++ºÇ¸å¤Î¥³¥í¥ó(:)¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¶èÀÚ¤êʸ»ú¤Ç¤Ï¤Ê¤¯¡¢¸«½Ð¤·¥Æ¥­¥¹¥È¤Î°ìÉô¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fB@todo\fR¥¿¥°¤ò´Þ¤à¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÍѤΤ¤¤º¤ì¤«¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@todo The documentation for this method needs work\fR¤Ç¤¹¡£ ++.sp ++\fB¥¿¥°Ì¾Æâ¤Î¥³¥í¥ó\fR: ¥¿¥°Ì¾Æâ¤Ç¥³¥í¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å¤ò»ÈÍѤ·¤Æ¥¨¥¹¥±¡¼¥×¤·¤Þ¤¹¡£¼¡¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢\fB\-tag ejb\e\e:bean:a:"EJB Bean:"\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * @ejb:bean +- */ ++\fB/**\fR ++\fB * @ejb:bean\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fB¥¿¥°Ì¾¤Î¥¹¥Ú¥ë¥Á¥§¥Ã¥¯\fR: °ìÉô¤Î³«È¯¼Ô¤¬É¬¤º¤·¤â½ÐÎϤ·¤Ê¤¤¥«¥¹¥¿¥à¡¦¥¿¥°¤ò¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤ËÇÛÃÖ¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Î¤¹¤Ù¤Æ¤Î¥¿¥°¤ò¥ê¥¹¥È¤·¡¢½ÐÎϤ¹¤ë¥¿¥°¤òÍ­¸ú¤Ë¤·¡¢½ÐÎϤ·¤Ê¤¤¥¿¥°¤ò̵¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIX\fR¤ò»ØÄꤹ¤ë¤È¥¿¥°¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¤È¡¢¥¿¥°¤ÏÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡½Ð¤·¤¿¥¿¥°¤¬ÆþÎϥߥ¹¤Ê¤É¤Ë¤è¤ëÉÔÌÀ¥¿¥°¤Ç¤¢¤ë¤«¤É¤¦¤«¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤«¤é·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¹¤Ç¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ëÃͤË\fIX\fR¤òÄɲäǤ­¤Þ¤¹¡£¤³¤¦¤·¤Æ¤ª¤±¤Ð¡¢\fIX\fR¤òºï½ü¤¹¤ë¤Î¤ß¤Ç¥¿¥°¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@todo\fR¥¿¥°¤ò½ÐÎϤÇÍÞÀ©¤¹¤ë¾ì¹ç¡¢\fI\-tag todo:Xcmf:"To Do:"\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤µ¤é¤Ë´Êñ¤Ë¤¹¤ë¾ì¹ç¡¢\fI\-tag todo:X\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¹½Ê¸\fI\-tag todo:X\fR¤Ï¡¢\fI@todo\fR¥¿¥°¤¬¥¿¥°¥ì¥Ã¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Æ¤âµ¡Ç½¤·¤Þ¤¹¡£ ++\fB¥¿¥°Ì¾¤Î¥¹¥Ú¥ë¥Á¥§¥Ã¥¯\fR: °ìÉô¤Î³«È¯¼Ô¤¬É¬¤º¤·¤â½ÐÎϤ·¤Ê¤¤¥«¥¹¥¿¥à¡¦¥¿¥°¤ò¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤ËÇÛÃÖ¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Î¤¹¤Ù¤Æ¤Î¥¿¥°¤ò¥ê¥¹¥È¤·¡¢½ÐÎϤ¹¤ë¥¿¥°¤òÍ­¸ú¤Ë¤·¡¢½ÐÎϤ·¤Ê¤¤¥¿¥°¤ò̵¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBX\fR¤ò»ØÄꤹ¤ë¤È¥¿¥°¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¤È¡¢¥¿¥°¤ÏÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡½Ð¤·¤¿¥¿¥°¤¬ÆþÎϥߥ¹¤Ê¤É¤Ë¤è¤ëÉÔÌÀ¥¿¥°¤Ç¤¢¤ë¤«¤É¤¦¤«¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤«¤é·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¹¤Ç¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ëÃͤË\fBX\fR¤òÄɲäǤ­¤Þ¤¹¡£¤³¤¦¤·¤Æ¤ª¤±¤Ð¡¢\fBX\fR¤òºï½ü¤¹¤ë¤Î¤ß¤Ç¥¿¥°¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@todo\fR¥¿¥°¤ò½ÐÎϤÇÍÞÀ©¤¹¤ë¾ì¹ç¡¢\fB\-tag todo:Xcmf:"To Do:"\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤µ¤é¤Ë´Êñ¤Ë¤¹¤ë¾ì¹ç¡¢\fB\-tag todo:X\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¹½Ê¸\fB\-tag todo:X\fR¤Ï¡¢\fB@todo\fR¥¿¥°¤¬¥¿¥°¥ì¥Ã¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Æ¤âµ¡Ç½¤·¤Þ¤¹¡£ + .sp + \fB¥¿¥°¤Î½ç½ø\fR: +-\fI\-ta\fR\fIg\fR¤ª¤è¤Ó\fI\-taglet\fR¥ª¥×¥·¥ç¥ó¤Î½ç½ø¤Ë¤è¤Ã¤Æ¡¢¥¿¥°¤Î½ÐÎϽ礬·è¤Þ¤ê¤Þ¤¹¡£¥«¥¹¥¿¥à¡¦¥¿¥°¤Èɸ½à¥¿¥°¤òÁȤ߹礻¤Æ»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£É¸½à¥¿¥°¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢½ç½ø¤ò·èÄꤹ¤ë¤¿¤á¤À¤±¤Î¥×¥ì¡¼¥¹¥Û¥ë¥À¤Ç¤¹¡£É¸½à¥¿¥°¤Î̾Á°¤Î¤ß¤ò¼è¤ê¤Þ¤¹¡£É¸½à¥¿¥°¤Î¾®¸«½Ð¤·¤ÏÊѹ¹¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤ò¼¡¤ÎÎã¤Ë¼¨¤·¤Þ¤¹¡£\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢\fI\-tagle\fR\fIt\fR¥ª¥×¥·¥ç¥ó¤Î°ÌÃ֤ˤè¤ê¡¢½ç½ø¤¬·è¤Þ¤ê¤Þ¤¹¡£¥¿¥°¤¬Î¾Êý¤È¤â¸ºß¤¹¤ë¾ì¹ç¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ÎºÇ¸å¤Ë¤¢¤ëÊý¤¬¤½¤Î½ç½ø¤ò·èÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥¿¥°¤ä¥¿¥°¥ì¥Ã¥È¤¬¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤵ¤ì¤¿½çÈ֤˽èÍý¤µ¤ì¤ë¤¿¤á¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-taglet\fR¤ª¤è¤Ó\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤¬Ì¾Á°\fItodo\fRÃͤò»ý¤Ä¾ì¹ç¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ËºÇ¸å¤Ë»ØÄꤵ¤ì¤¿¤â¤Î¤¬½ç½ø¤ò·èÄꤷ¤Þ¤¹¡£ +-.sp +-\fB¥¿¥°¤Î´°Á´¥»¥Ã¥È¤ÎÎã\fR: ¤³¤ÎÎã¤Ç¤Ï¡¢½ÐÎϤÎParameters¤ÈThrows¤Î´Ö¤ËTo Do¤òÁÞÆþ¤·¤Þ¤¹¡£\fIX\fR¤ò»ÈÍѤ·¤Æ¡¢\fI@example\fR¥¿¥°¤¬¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Îº£²ó¤Î¼Â¹Ô¤Ç¤Ï½ÐÎϤµ¤ì¤Ê¤¤¥¿¥°¤Ç¤¢¤ë¤³¤È¤â»ØÄꤷ¤Þ¤¹¡£\fI@argfile\fR¥¿¥°¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¡¢°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤ÎÊÌ¡¹¤Î¹Ô¤Ë¥¿¥°¤òÇÛÃ֤Ǥ­¤Þ¤¹(¹Ô¤Î·Ñ³¤ò¼¨¤¹Ê¸»ú¤ÏÉÔÍ×)¡£ ++\fB\-ta\fR\fBg\fR¤ª¤è¤Ó\fB\-taglet\fR¥ª¥×¥·¥ç¥ó¤Î½ç½ø¤Ë¤è¤Ã¤Æ¡¢¥¿¥°¤Î½ÐÎϽ礬·è¤Þ¤ê¤Þ¤¹¡£¥«¥¹¥¿¥à¡¦¥¿¥°¤Èɸ½à¥¿¥°¤òÁȤ߹礻¤Æ»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£É¸½à¥¿¥°¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢½ç½ø¤ò·èÄꤹ¤ë¤¿¤á¤À¤±¤Î¥×¥ì¡¼¥¹¥Û¥ë¥À¤Ç¤¹¡£É¸½à¥¿¥°¤Î̾Á°¤Î¤ß¤ò¼è¤ê¤Þ¤¹¡£É¸½à¥¿¥°¤Î¾®¸«½Ð¤·¤ÏÊѹ¹¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤ò¼¡¤ÎÎã¤Ë¼¨¤·¤Þ¤¹¡£\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢\fB\-tagle\fR\fBt\fR¥ª¥×¥·¥ç¥ó¤Î°ÌÃ֤ˤè¤ê¡¢½ç½ø¤¬·è¤Þ¤ê¤Þ¤¹¡£¥¿¥°¤¬Î¾Êý¤È¤â¸ºß¤¹¤ë¾ì¹ç¡¢¥³¥Þ¥ó¥É¹Ô¤ÎºÇ¸å¤Ë¤¢¤ëÊý¤¬¤½¤Î½ç½ø¤ò·èÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥¿¥°¤ä¥¿¥°¥ì¥Ã¥È¤¬¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤵ¤ì¤¿½çÈ֤˽èÍý¤µ¤ì¤ë¤¿¤á¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-taglet\fR¤ª¤è¤Ó\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤¬Ì¾Á°\fBtodo\fRÃͤò»ý¤Ä¾ì¹ç¡¢¥³¥Þ¥ó¥É¹Ô¤ËºÇ¸å¤Ë»ØÄꤵ¤ì¤¿¤â¤Î¤¬½ç½ø¤ò·èÄꤷ¤Þ¤¹¡£ ++.sp ++\fB¥¿¥°¤Î´°Á´¥»¥Ã¥È¤ÎÎã\fR: ¤³¤ÎÎã¤Ç¤Ï¡¢½ÐÎϤÎParameters¤ÈThrows¤Î´Ö¤ËTo Do¤òÁÞÆþ¤·¤Þ¤¹¡£\fBX\fR¤ò»ÈÍѤ·¤Æ¡¢\fB@example\fR¥¿¥°¤¬¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Îº£²ó¤Î¼Â¹Ô¤Ç¤Ï½ÐÎϤµ¤ì¤Ê¤¤¥¿¥°¤Ç¤¢¤ë¤³¤È¤â»ØÄꤷ¤Þ¤¹¡£\fB@argfile\fR¥¿¥°¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¡¢°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤ÎÊÌ¡¹¤Î¹Ô¤Ë¥¿¥°¤òÇÛÃ֤Ǥ­¤Þ¤¹(¹Ô¤Î·Ñ³¤ò¼¨¤¹Ê¸»ú¤ÏÉÔÍ×)¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-tag param +-\-tag return +-\-tag todo:a:"To Do:" +-\-tag throws +-\-tag see +-\-tag example:X ++\fB\-tag param\fR ++\fB\-tag return\fR ++\fB\-tag todo:a:"To Do:"\fR ++\fB\-tag throws\fR ++\fB\-tag see\fR ++\fB\-tag example:X\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò²òÀϤ¹¤ëºÝ¤Ë¸¡º÷¤µ¤ì¤¿¥¿¥°¤Î¤¦¤Á¡¢É¸½à¥¿¥°¤Ç¤â¡¢\fI\-tag\fR¤ä\fI\-taglet\fR¥ª¥×¥·¥ç¥ó¤ÇÅϤµ¤ì¤¿¥¿¥°¤Ç¤â¤Ê¤¤¤â¤Î¤Ï¤¹¤Ù¤ÆÉÔÌÀ¥¿¥°¤È¤ß¤Ê¤µ¤ì¡¢·Ù¹ð¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ +-.sp +-ɸ½à¥¿¥°¤Ï¡¢ºÇ½é¡¢¥Ç¥Õ¥©¥ë¥È¤Î½ç½ø¤Ç¥ê¥¹¥ÈÆâ¤ËÆâÉôŪ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤½¤ì¤é¤Î¥¿¥°¤Ï¤³¤Î¥ê¥¹¥È¤ËÄɲ䵤ì¤Þ¤¹¡£É¸½à¥¿¥°¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î°ÌÃÖ¤«¤é°ÜÆ°¤µ¤ì¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢É¸½à¥¿¥°¤Î\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢¤½¤ì¤Ï¥Ç¥Õ¥©¥ë¥È¤Î°ÌÃÖ¤ËÇÛÃÖ¤µ¤ì¤¿¤Þ¤Þ¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.sp +-\fB¶¥¹ç¤Î²óÈò\fR: ¸ÇÍ­¤Î̾Á°¶õ´Ö¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤ë\fIcom\&.mycompany\&.todo\fR¤È¤¤¤¦Ì¾Á°¤Î¤è¤¦¤Ë¡¢¥É¥Ã¥È¤Ç¶èÀÚ¤é¤ì¤¿Ì¾Á°¤ò»ÈÍѤ·¤Þ¤¹¡£Oracle¤Ï¡¢º£¸å¤â̾Á°¤Ë¥É¥Ã¥È¤ò´Þ¤Þ¤Ê¤¤É¸½à¥¿¥°¤òºîÀ®¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤¬ºîÀ®¤·¤¿¥¿¥°¤Ï¡¢Oracle¤¬ÄêµÁ¤¹¤ëƱ¤¸Ì¾Á°¤Î¥¿¥°¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fI@todo\fR¤È¤¤¤¦Ì¾Á°¤Î¥¿¥°¤Þ¤¿¤Ï¥¿¥°¥ì¥Ã¥È¤ò¥æ¡¼¥¶¡¼¤¬ºîÀ®¤·¤¿¾ì¹ç¡¢¤½¤Î¸å¤ËOracle¤¬Æ±¤¸Ì¾Á°¤Îɸ½à¥¿¥°¤òºîÀ®¤·¤Æ¤â¡¢¤½¤Î¥¿¥°¤Þ¤¿¤Ï¥¿¥°¥ì¥Ã¥È¤Ï¾ï¤Ë¥æ¡¼¥¶¡¼¤¬ÄêµÁ¤·¤¿¤Î¤ÈƱ¤¸Æ°ºî¤òÊÝ»ý¤·¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò²òÀϤ¹¤ëºÝ¤Ë¸¡º÷¤µ¤ì¤¿¥¿¥°¤Î¤¦¤Á¡¢É¸½à¥¿¥°¤Ç¤â¡¢\fB\-tag\fR¤ä\fB\-taglet\fR¥ª¥×¥·¥ç¥ó¤ÇÅϤµ¤ì¤¿¥¿¥°¤Ç¤â¤Ê¤¤¤â¤Î¤Ï¤¹¤Ù¤ÆÉÔÌÀ¥¿¥°¤È¤ß¤Ê¤µ¤ì¡¢·Ù¹ð¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ ++.sp ++ɸ½à¥¿¥°¤Ï¡¢ºÇ½é¡¢¥Ç¥Õ¥©¥ë¥È¤Î½ç½ø¤Ç¥ê¥¹¥ÈÆâ¤ËÆâÉôŪ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤½¤ì¤é¤Î¥¿¥°¤Ï¤³¤Î¥ê¥¹¥È¤ËÄɲ䵤ì¤Þ¤¹¡£É¸½à¥¿¥°¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î°ÌÃÖ¤«¤é°ÜÆ°¤µ¤ì¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢É¸½à¥¿¥°¤Î\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢¤½¤ì¤Ï¥Ç¥Õ¥©¥ë¥È¤Î°ÌÃÖ¤ËÇÛÃÖ¤µ¤ì¤¿¤Þ¤Þ¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.sp ++\fB¶¥¹ç¤Î²óÈò\fR: ¸ÇÍ­¤Î̾Á°¶õ´Ö¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤ë\fBcom\&.mycompany\&.todo\fR¤È¤¤¤¦Ì¾Á°¤Î¤è¤¦¤Ë¡¢¥É¥Ã¥È¤Ç¶èÀÚ¤é¤ì¤¿Ì¾Á°¤ò»ÈÍѤ·¤Þ¤¹¡£Oracle¤Ï¡¢º£¸å¤â̾Á°¤Ë¥É¥Ã¥È¤ò´Þ¤Þ¤Ê¤¤É¸½à¥¿¥°¤òºîÀ®¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤¬ºîÀ®¤·¤¿¥¿¥°¤Ï¡¢Oracle¤¬ÄêµÁ¤¹¤ëƱ¤¸Ì¾Á°¤Î¥¿¥°¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fB@todo\fR¤È¤¤¤¦Ì¾Á°¤Î¥¿¥°¤Þ¤¿¤Ï¥¿¥°¥ì¥Ã¥È¤ò¥æ¡¼¥¶¡¼¤¬ºîÀ®¤·¤¿¾ì¹ç¡¢¤½¤Î¸å¤ËOracle¤¬Æ±¤¸Ì¾Á°¤Îɸ½à¥¿¥°¤òºîÀ®¤·¤Æ¤â¡¢¤½¤Î¥¿¥°¤Þ¤¿¤Ï¥¿¥°¥ì¥Ã¥È¤Ï¾ï¤Ë¥æ¡¼¥¶¡¼¤¬ÄêµÁ¤·¤¿¤Î¤ÈƱ¤¸Æ°ºî¤òÊÝ»ý¤·¤Þ¤¹¡£ + .sp + \fBÃí¼ávs\&. Javadoc¥¿¥°\fR: °ìÈ̤ˡ¢Äɲ乤ëɬÍפΤ¢¤ë¥Þ¡¼¥¯¥¢¥Ã¥×¤¬¡¢¥É¥­¥å¥á¥ó¥È¤Ë±Æ¶Á¤òÍ¿¤¨¤¿¤ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤¿¤ê¤¹¤ë¤¿¤á¤Î¤â¤Î¤Ç¤¢¤ë¾ì¹ç¡¢¤½¤Î¥Þ¡¼¥¯¥¢¥Ã¥×¤ÏJavadoc¥¿¥°¤Ë¤·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤ÏÃí¼á¤Ë¤·¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î¥«¥¹¥¿¥à¡¦¥¿¥°¤ÈÃí¼á¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#annotations)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-taglet\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¤è¤êÊ£»¨¤Ê¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤ä¥«¥¹¥¿¥à¡¦¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤âºîÀ®¤Ç¤­¤Þ¤¹¡£ ++\fB\-taglet\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¤è¤êÊ£»¨¤Ê¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤ä¥«¥¹¥¿¥à¡¦¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤âºîÀ®¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-taglet \fIclass\fR + .RS 4 +-¤½¤Î¥¿¥°¤Î¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤òµ¯Æ°¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fIclass\fRÃͤδ°Á´½¤¾þ̾¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥¿¥°¥ì¥Ã¥È¤Ï¡¢¥«¥¹¥¿¥à¡¦¥¿¥°¤Î¥Æ¥­¥¹¥È°ú¿ô¤Î¿ô¤âÄêµÁ¤·¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ï¡¢¤³¤ì¤é¤Î°ú¿ô¤ò¼õ¤±ÉÕ¤±¡¢½èÍý¤·¡¢½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤ÎÎã¤ò»ÈÍѤ·¤¿Ë­É٤ʥɥ­¥å¥á¥ó¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥¿¥°¥ì¥Ã¥È¤Î³µÍ× ++¤½¤Î¥¿¥°¤Î¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤òµ¯Æ°¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fBclass\fRÃͤδ°Á´½¤¾þ̾¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥¿¥°¥ì¥Ã¥È¤Ï¡¢¥«¥¹¥¿¥à¡¦¥¿¥°¤Î¥Æ¥­¥¹¥È°ú¿ô¤Î¿ô¤âÄêµÁ¤·¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ï¡¢¤³¤ì¤é¤Î°ú¿ô¤ò¼õ¤±ÉÕ¤±¡¢½èÍý¤·¡¢½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤ÎÎã¤ò»ÈÍѤ·¤¿Ë­É٤ʥɥ­¥å¥á¥ó¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥¿¥°¥ì¥Ã¥È¤Î³µÍ× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/taglet/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¥¿¥°¥ì¥Ã¥È¤Ï¡¢¥Ö¥í¥Ã¥¯¥¿¥°¤Þ¤¿¤Ï¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ÇÊØÍø¤Ç¤¹¡£¥¿¥°¥ì¥Ã¥È¤ÏǤ°Õ¤Î¿ô¤Î°ú¿ô¤ò¤È¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¥Æ¥­¥¹¥È¤òÂÀ»ú¤Ë¤¹¤ë¡¢²Õ¾ò½ñ¤­¤òºîÀ®¤¹¤ë¡¢¥Æ¥­¥¹¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹¡¢¤½¤Î¾¤Î¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ê¤É¤Î¥«¥¹¥¿¥àÆ°ºî¤ò¼ÂÁõ¤Ç¤­¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ç»ØÄê¤Ç¤­¤ë¤Î¤Ï¡¢¥¿¥°¤ÎÇÛÃÖ¾ì½ê¤ÈÇÛÃÖ·Á¼°¤Î¤ß¤Ç¤¹¡£¤½¤Î¾¤Î¤¹¤Ù¤Æ¤Î·èÄê¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤Ë¤è¤Ã¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¤â¡¢Êñ´Þ¥¯¥é¥¹¤Î¥ê¥¹¥È¤«¤é¥¯¥é¥¹Ì¾¤òºï½ü¤¹¤ë¤Ê¤É¤Î½èÍý¤Ï¼Â¹Ô¤Ç¤­¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥¿¥°¤Î¥Æ¥­¥¹¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ·¤¿¤ê¡¢ÊÌ¤Î¥×¥í¥»¥¹¤ò¥È¥ê¥¬¡¼¤¹¤ë¤Ê¤É¤ÎÉûºîÍѤÏÆÀ¤é¤ì¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fI\-tagletpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤Ë¡¢À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤ÎParameters¤ÈThrows¤Î´Ö¤ËTo Do¥¿¥°¥ì¥Ã¥È¤òÁÞÆþ¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢\fI\-taglet\fR¥ª¥×¥·¥ç¥ó¤ò¤½¤Î\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Æɤ߼è¤ê¤¬º¤Æñ¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++¥¿¥°¥ì¥Ã¥È¤Ï¡¢¥Ö¥í¥Ã¥¯¥¿¥°¤Þ¤¿¤Ï¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ÇÊØÍø¤Ç¤¹¡£¥¿¥°¥ì¥Ã¥È¤ÏǤ°Õ¤Î¿ô¤Î°ú¿ô¤ò¤È¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¥Æ¥­¥¹¥È¤òÂÀ»ú¤Ë¤¹¤ë¡¢²Õ¾ò½ñ¤­¤òºîÀ®¤¹¤ë¡¢¥Æ¥­¥¹¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹¡¢¤½¤Î¾¤Î¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ê¤É¤Î¥«¥¹¥¿¥àÆ°ºî¤ò¼ÂÁõ¤Ç¤­¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ç»ØÄê¤Ç¤­¤ë¤Î¤Ï¡¢¥¿¥°¤ÎÇÛÃÖ¾ì½ê¤ÈÇÛÃÖ·Á¼°¤Î¤ß¤Ç¤¹¡£¤½¤Î¾¤Î¤¹¤Ù¤Æ¤Î·èÄê¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤Ë¤è¤Ã¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¤â¡¢Êñ´Þ¥¯¥é¥¹¤Î¥ê¥¹¥È¤«¤é¥¯¥é¥¹Ì¾¤òºï½ü¤¹¤ë¤Ê¤É¤Î½èÍý¤Ï¼Â¹Ô¤Ç¤­¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥¿¥°¤Î¥Æ¥­¥¹¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ·¤¿¤ê¡¢ÊÌ¤Î¥×¥í¥»¥¹¤ò¥È¥ê¥¬¡¼¤¹¤ë¤Ê¤É¤ÎÉûºîÍѤÏÆÀ¤é¤ì¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fB\-tagletpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤Ë¡¢À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤ÎParameters¤ÈThrows¤Î´Ö¤ËTo Do¥¿¥°¥ì¥Ã¥È¤òÁÞÆþ¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢\fB\-taglet\fR¥ª¥×¥·¥ç¥ó¤ò¤½¤Î\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Æɤ߼è¤ê¤¬º¤Æñ¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-taglet com\&.sun\&.tools\&.doclets\&.ToDoTaglet +-\-tagletpath /home/taglets +-\-tag return +-\-tag param +-\-tag todo +-\-tag throws +-\-tag see ++\fB\-taglet com\&.sun\&.tools\&.doclets\&.ToDoTaglet\fR ++\fB\-tagletpath /home/taglets \fR ++\fB\-tag return\fR ++\fB\-tag param\fR ++\fB\-tag todo\fR ++\fB\-tag throws\fR ++\fB\-tag see\fR ++ + .fi + .if n \{\ + .RE +@@ -3244,7 +3377,7 @@ + .PP + \-tagletpath \fItagletpathlist\fR + .RS 4 +-taglet¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¤¿¤á¤Î¸¡º÷¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fItagletpathlist\fR¤Ë¤Ï¡¢¥³¥í¥ó(:)¤Ç¶èÀڤäÆÊ£¿ô¤Î¥Ñ¥¹¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£ ++taglet¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¤¿¤á¤Î¸¡º÷¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fBtagletpathlist\fR¤Ë¤Ï¡¢¥³¥í¥ó(:)¤Ç¶èÀڤäÆÊ£¿ô¤Î¥Ñ¥¹¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£ + .RE + .PP + \-docfilesubdirs +@@ -3259,21 +3392,21 @@ + .PP + \-noqualifier all | \fIpackagename1\fR:\fIpackagename2\&.\&.\&.\fR + .RS 4 +-½ÐÎϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤«¤é½¤¾þ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¾Êά¤·¤Þ¤¹¡£\fI\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ï¡¢\fIall\fR(¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά)¡¢¤Þ¤¿¤Ï½¤¾þ»Ò¤È¤·¤Æºï½ü¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥í¥ó¶èÀÚ¤ê¥ê¥¹¥È(¥ï¥¤¥ë¥É¥«¡¼¥É¤â²Ä)¡¢¤Î¤¤¤º¤ì¤«¤È¤Ê¤ê¤Þ¤¹¡£¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹Ì¾¤¬É½¼¨¤µ¤ì¤ë°ÌÃÖ¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬ºï½ü¤µ¤ì¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά¤·¤Þ¤¹¡£\fI\-noqualifier all\fR +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIjava\&.lang\fR¤ª¤è¤Ó\fIjava\&.io\fR¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά¤·¤Þ¤¹: +-\fI\-noqualifier java\&.lang:java\&.io\fR¡£ +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIjava\fR¤Ç»Ï¤Þ¤ë¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ª¤è¤Ó\fIcom\&.sun\fR¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¾Êά¤·¤Þ¤¹¤¬¡¢\fIjavax\fR¤Ï¾Êά¤·¤Þ¤»¤ó¡£\fI\-noqualifier java\&.*:com\&.sun\&.*\fR +-.sp +-¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤¬Á°½Ò¤ÎÆ°ºî¤Ë½¾¤Ã¤Æɽ¼¨¤µ¤ì¤ë¾ì¹ç¡¢Ì¾Á°¤ÏŬÀÚ¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î¥ë¡¼¥ë¤Ï¡¢\fI\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤ºÍ­¸ú¤Ç¤¹¡£ ++½ÐÎϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤«¤é½¤¾þ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¾Êά¤·¤Þ¤¹¡£\fB\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ï¡¢\fBall\fR(¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά)¡¢¤Þ¤¿¤Ï½¤¾þ»Ò¤È¤·¤Æºï½ü¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥í¥ó¶èÀÚ¤ê¥ê¥¹¥È(¥ï¥¤¥ë¥É¥«¡¼¥É¤â²Ä)¡¢¤Î¤¤¤º¤ì¤«¤È¤Ê¤ê¤Þ¤¹¡£¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹Ì¾¤¬É½¼¨¤µ¤ì¤ë°ÌÃÖ¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬ºï½ü¤µ¤ì¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά¤·¤Þ¤¹¡£\fB\-noqualifier all\fR ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBjava\&.lang\fR¤ª¤è¤Ó\fBjava\&.io\fR¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά¤·¤Þ¤¹: ++\fB\-noqualifier java\&.lang:java\&.io\fR¡£ ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBjava\fR¤Ç»Ï¤Þ¤ë¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ª¤è¤Ó\fBcom\&.sun\fR¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¾Êά¤·¤Þ¤¹¤¬¡¢\fBjavax\fR¤Ï¾Êά¤·¤Þ¤»¤ó¡£\fB\-noqualifier java\&.*:com\&.sun\&.*\fR ++.sp ++¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤¬Á°½Ò¤ÎÆ°ºî¤Ë½¾¤Ã¤Æɽ¼¨¤µ¤ì¤ë¾ì¹ç¡¢Ì¾Á°¤ÏŬÀÚ¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î¥ë¡¼¥ë¤Ï¡¢\fB\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤ºÍ­¸ú¤Ç¤¹¡£ + .RE + .PP + \-notimestamp + .RS 4 +-¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬ÍÞÀ©¤µ¤ì¤Þ¤¹¡£³Æ¥Ú¡¼¥¸¤ÎÀèƬ¶á¤¯¤Ë¤¢¤ë¡¢À¸À®¤µ¤ì¤¿HTMLÆâ¤ÎHTML¥³¥á¥ó¥È¤Ç¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬±£¤µ¤ì¤Þ¤¹¡£\fI\-notimestamp\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò2¤Ä¤Î¥½¡¼¥¹¡¦¥Ù¡¼¥¹¤Ç¼Â¹Ô¤·¡¢¤½¤ì¤é¤Î´Ö¤Îº¹Ê¬\fIdiff\fR¤ò¼èÆÀ¤¹¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ë¤è¤ë\fIdiff\fR¤ÎȯÀ¸¤òËɤ°¤«¤é¤Ç¤¹(¤½¤¦¤Ç¤Ê¤¤¤È¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤Ç\fIdiff\fR¤Ë¤Ê¤ê¤Þ¤¹)¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ë¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹Èֹ椬´Þ¤Þ¤ì¡¢¸½ºß¤Ç¤Ï¡¢\fI<!\-\- Generated by javadoc (build 1\&.5\&.0_01) on Thu Apr 02 14:04:52 IST 2009 \-\->\fR¤Î¤è¤¦¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬ÍÞÀ©¤µ¤ì¤Þ¤¹¡£³Æ¥Ú¡¼¥¸¤ÎÀèƬ¶á¤¯¤Ë¤¢¤ë¡¢À¸À®¤µ¤ì¤¿HTMLÆâ¤ÎHTML¥³¥á¥ó¥È¤Ç¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬±£¤µ¤ì¤Þ¤¹¡£\fB\-notimestamp\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò2¤Ä¤Î¥½¡¼¥¹¡¦¥Ù¡¼¥¹¤Ç¼Â¹Ô¤·¡¢¤½¤ì¤é¤Î´Ö¤Îº¹Ê¬\fBdiff\fR¤ò¼èÆÀ¤¹¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ë¤è¤ë\fBdiff\fR¤ÎȯÀ¸¤òËɤ°¤«¤é¤Ç¤¹(¤½¤¦¤Ç¤Ê¤¤¤È¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤Ç\fBdiff\fR¤Ë¤Ê¤ê¤Þ¤¹)¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ë¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹Èֹ椬´Þ¤Þ¤ì¡¢¸½ºß¤Ç¤Ï¡¢\fB<!\-\- Generated by javadoc (build 1\&.5\&.0_01) on Thu Apr 02 14:04:52 IST 2009 \-\->\fR¤Î¤è¤¦¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-nocomment +@@ -3285,24 +3418,28 @@ + .RS 4 + ¥½¡¼¥¹Æâ¤Ç³Æ¥¿¥Ö¤¬»ÈÍѤ¹¤ë¶õÇòʸ»ú¤Î¿ô¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE +-.SH "¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¥Õ¥¡¥¤¥ë" +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤òû¤¯¤·¤¿¤ê´Ê·é¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÂФ¹¤ë°ú¿ô(\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤¬Æþ¤Ã¤¿1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤³¤È¤òÍøÍѤ¹¤ì¤Ð¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¾å¤Ç¤â¡¢Ç¤°Õ¤ÎŤµ¤Î\fIjavadoc\fR¥³¥Þ¥ó¥É¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ +-.PP +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIjavac\fR¤Î¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò¼«Í³¤ËÁȤ߹礻¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ°ú¿ô¤Ï¡¢¥¹¥Ú¡¼¥¹¤Þ¤¿¤Ï²þ¹Ô¤Ç¶èÀÚ¤ê¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤ËËä¤á¹þ¤Þ¤ì¤¿¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾Á´ÂΤòÆó½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£ +-.PP +-°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ǤϤʤ¯¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ê¥¹¥È¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É(\fI*\fR)¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢*\&.java¤È¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤Æ¡¢¥Õ¥¡¥¤¥ë¤òºÆµ¢Åª¤Ë²ò¼á¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fI\-J\fR¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïµ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤Þ¤¹¤¬¡¢µ¯Æ°¥Ä¡¼¥ë¤Ç¤Ï°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ +-.PP +-\fIjavadoc\fR¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢³Æ°ú¿ô¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤Ë@ʸ»ú¤òÉÕ¤±¤ÆÅϤ·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯(@)ʸ»ú¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ +-.PP +-\fBExample 1\fR, ñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë +-.RS 4 +-\fIargfile\fR¤È¤¤¤¦Ì¾Á°¤Î1¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¤¹¤Ù¤Æ¤Î\fIjavadoc\fR¥³¥Þ¥ó¥É°ú¿ô¤òÊÝ»ý¤Ç¤­¤Þ¤¹¡£\fIjavadoc @argfile\fR¼¡¤ÎÎã¤Ë¼¨¤¹¤è¤¦¤Ë¡¢¤³¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤ÏξÊý¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤ¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.RE +-.PP +-\fBExample 2\fR, 2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë +-.RS 4 +-¼¡¤Î¤è¤¦¤Ë¡¢2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥óÍѤË1¤Ä¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾ÍѤË1¤Ä¤Ç¤¹¡£¼¡¤Î¥ê¥¹¥È¤Ç¤Ï¹Ô·Ñ³ʸ»ú¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤»¤ó¡£ ++.SH "¥³¥Þ¥ó¥É¹Ô°ú¿ô¥Õ¥¡¥¤¥ë" ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤òû¤¯¤·¤¿¤ê´Ê·é¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÂФ¹¤ë°ú¿ô(\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤¬Æþ¤Ã¤¿1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤³¤È¤òÍøÍѤ¹¤ì¤Ð¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¾å¤Ç¤â¡¢Ç¤°Õ¤ÎŤµ¤Î\fBjavadoc\fR¥³¥Þ¥ó¥É¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++.PP ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBjavac\fR¤Î¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò¼«Í³¤ËÁȤ߹礻¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ°ú¿ô¤Ï¡¢¥¹¥Ú¡¼¥¹¤Þ¤¿¤Ï²þ¹Ô¤Ç¶èÀÚ¤ê¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤ËËä¤á¹þ¤Þ¤ì¤¿¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾Á´ÂΤòÆó½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£ ++.PP ++°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ǤϤʤ¯¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ê¥¹¥È¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É(\fB*\fR)¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢*\&.java¤È¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤Æ¡¢¥Õ¥¡¥¤¥ë¤òºÆµ¢Åª¤Ë²ò¼á¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fB\-J\fR¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïµ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤Þ¤¹¤¬¡¢µ¯Æ°¥Ä¡¼¥ë¤Ç¤Ï°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ ++.PP ++\fBjavadoc\fR¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢³Æ°ú¿ô¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤Ë@ʸ»ú¤òÉÕ¤±¤ÆÅϤ·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯(@)ʸ»ú¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ ++.PP ++\fBÎã 1\fR ++.br ++ñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë ++.RS 4 ++\fBargfile\fR¤È¤¤¤¦Ì¾Á°¤Î1¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¤¹¤Ù¤Æ¤Î\fBjavadoc\fR¥³¥Þ¥ó¥É°ú¿ô¤òÊÝ»ý¤Ç¤­¤Þ¤¹¡£\fBjavadoc @argfile\fR¼¡¤ÎÎã¤Ë¼¨¤¹¤è¤¦¤Ë¡¢¤³¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤ÏξÊý¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤ¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\fBÎã 2\fR ++.br ++2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë ++.RS 4 ++¼¡¤Î¤è¤¦¤Ë¡¢2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥óÍѤË1¤Ä¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾ÍѤË1¤Ä¤Ç¤¹¡£¼¡¤Î¥ê¥¹¥È¤Ç¤Ï¹Ô·Ñ³ʸ»ú¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤»¤ó¡£ + .sp + ¼¡¤ÎÆâÍƤò´Þ¤à¡¢options¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£ + .sp +@@ -3310,16 +3447,17 @@ + .RS 4 + .\} + .nf +-\-d docs\-filelist +-\-use +-\-splitindex +-\-windowtitle \*(AqJava SE 7 API Specification\*(Aq +-\-doctitle \*(AqJava SE 7 API Specification\*(Aq +-\-header \*(Aq<b>Java(TM) SE 7</b>\*(Aq +-\-bottom \*(AqCopyright © 1993\-2011 Oracle and/or its affiliates\&. All rights reserved\&.\*(Aq +-\-group "Core Packages" "java\&.*" +-\-overview /java/pubs/ws/1\&.7\&.0/src/share/classes/overview\-core\&.html +-\-sourcepath /java/pubs/ws/1\&.7\&.0/src/share/classes ++\fB\-d docs\-filelist \fR ++\fB\-use \fR ++\fB\-splitindex\fR ++\fB\-windowtitle \*(AqJava SE 7 API Specification\*(Aq\fR ++\fB\-doctitle \*(AqJava SE 7 API Specification\*(Aq\fR ++\fB\-header \*(Aq<b>Java(TM) SE 7</b>\*(Aq\fR ++\fB\-bottom \*(AqCopyright © 1993\-2011 Oracle and/or its affiliates\&. All rights reserved\&.\*(Aq\fR ++\fB\-group "Core Packages" "java\&.*"\fR ++\fB\-overview /java/pubs/ws/1\&.7\&.0/src/share/classes/overview\-core\&.html\fR ++\fB\-sourcepath /java/pubs/ws/1\&.7\&.0/src/share/classes\fR ++ + .fi + .if n \{\ + .RE +@@ -3330,170 +3468,199 @@ + .RS 4 + .\} + .nf +-com\&.mypackage1 +-com\&.mypackage2 +-com\&.mypackage3 ++\fBcom\&.mypackage1\fR ++\fBcom\&.mypackage2\fR ++\fBcom\&.mypackage3\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î¤è¤¦¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¼¡¤Î¤è¤¦¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc @options @packages ++\fBjavadoc @options @packages\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, ¥Ñ¥¹¤ò»ÈÍѤ·¤¿°ú¿ô¥Õ¥¡¥¤¥ë +-.RS 4 +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢(\fIpath1\fR¤ä\fIpath2\fR¤Ç¤Ï¤Ê¤¯)¼¡¤Î¤è¤¦¤Ë¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£ ++\fBÎã 3\fR ++.br ++¥Ñ¥¹¤ò»ÈÍѤ·¤¿°ú¿ô¥Õ¥¡¥¤¥ë ++.RS 4 ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢(\fBpath1\fR¤ä\fBpath2\fR¤Ç¤Ï¤Ê¤¯)¼¡¤Î¤è¤¦¤Ë¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc @path1/options @path2/packages ++\fBjavadoc @path1/options @path2/packages\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 4\fR, ¥ª¥×¥·¥ç¥ó°ú¿ô +-.RS 4 +-¼¡¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ë°ú¿ô¤ò°ú¿ô¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£Ä¹¤¤°ú¿ô¤ò»ØÄê¤Ç¤­¤ë¤Î¤Ç¡¢\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤Î¤è¤¦¤Ê¥Æ¥­¥¹¥È°ú¿ô¤ò´Þ¤à¡¢bottom¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++\fBÎã 4\fR ++.br ++¥ª¥×¥·¥ç¥ó°ú¿ô ++.RS 4 ++¼¡¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ë°ú¿ô¤ò°ú¿ô¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£Ä¹¤¤°ú¿ô¤ò»ØÄê¤Ç¤­¤ë¤Î¤Ç¡¢\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤Î¤è¤¦¤Ê¥Æ¥­¥¹¥È°ú¿ô¤ò´Þ¤à¡¢bottom¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-<font size="\-1"> +- <a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/> +- Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&. <br/> +- Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&. +- Other names may be trademarks of their respective owners\&.</font> ++\fB<font size="\-1">\fR ++\fB <a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/>\fR ++\fB Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&. <br/>\fR ++\fB Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&.\fR ++\fB Other names may be trademarks of their respective owners\&.</font>\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼¡¤Î¤è¤¦¤Ë¼Â¹Ô¤·¤Þ¤¹¡£\fI javadoc \-bottom @bottom @packages\fR +-.sp +-\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤ò°ú¿ô¥Õ¥¡¥¤¥ë¤ÎºÇ½é¤Ë´Þ¤á¤Æ¡¢¼¡¤Î¤è¤¦¤Ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£\fIjavadoc @bottom @packages\fR ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼¡¤Î¤è¤¦¤Ë¼Â¹Ô¤·¤Þ¤¹¡£\fB javadoc \-bottom @bottom @packages\fR ++.sp ++\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤ò°ú¿ô¥Õ¥¡¥¤¥ë¤ÎºÇ½é¤Ë´Þ¤á¤Æ¡¢¼¡¤Î¤è¤¦¤Ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£\fBjavadoc @bottom @packages\fR + .RE + .SH "JAVADOC¥³¥Þ¥ó¥É¤Î¼Â¹Ô" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤Ï\fIjavadoc \-J\-version\fR¥ª¥×¥·¥ç¥ó¤ÇÆÃÄê¤Ç¤­¤Þ¤¹¡£½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë¤Ïɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ê¥ê¡¼¥¹Èֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£\fI\-quiet\fR¥ª¥×¥·¥ç¥ó¤Ç̵¸ú¤Ë¤Ç¤­¤Þ¤¹¡£ +-.PP +-Java¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥×¥í¥°¥é¥à¤«¤é\fIjavadoc\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¸ø³«¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fIcom\&.sun\&.tools\&.javadoc\&.Main\fR¤Ë¤¢¤ê¤Þ¤¹(¤Þ¤¿\fIjavadoc\fR¥³¥Þ¥ó¥É¤ÏºÆÆþ²Äǽ¤Ç¤¹)¡£¾ÜºÙ¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤Ï\fBjavadoc \-J\-version\fR¥ª¥×¥·¥ç¥ó¤ÇÆÃÄê¤Ç¤­¤Þ¤¹¡£½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë¤Ïɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ê¥ê¡¼¥¹Èֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£\fB\-quiet\fR¥ª¥×¥·¥ç¥ó¤Ç̵¸ú¤Ë¤Ç¤­¤Þ¤¹¡£ ++.PP ++Java¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥×¥í¥°¥é¥à¤«¤é\fBjavadoc\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¸ø³«¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fBcom\&.sun\&.tools\&.javadoc\&.Main\fR¤Ë¤¢¤ê¤Þ¤¹(¤Þ¤¿\fBjavadoc\fR¥³¥Þ¥ó¥É¤ÏºÆÆþ²Äǽ¤Ç¤¹)¡£¾ÜºÙ¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/standard\-doclet\&.html#runningprogrammatically)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-¼¡¤Î¼ê½ç¤Ç¤Ï¡¢É¸½àHTML¥É¥Ã¥¯¥ì¥Ã¥È¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤ò¸Æ¤Ó½Ð¤¹¤Ë¤Ï¡¢\fI\-doclet\fR¤ª¤è¤Ó\fI\-docletpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× ++¼¡¤Î¼ê½ç¤Ç¤Ï¡¢É¸½àHTML¥É¥Ã¥¯¥ì¥Ã¥È¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤ò¸Æ¤Ó½Ð¤¹¤Ë¤Ï¡¢\fB\-doclet\fR¤ª¤è¤Ó\fB\-docletpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/doclet/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SS "´Êñ¤ÊÎã" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤËÂФ·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤â¡¢¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¡¢¤½¤ì¤¾¤ì¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÂбþ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê̾¤ò»ý¤Á¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤËÂФ·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤â¡¢¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¡¢¤½¤ì¤¾¤ì¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÂбþ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê̾¤ò»ý¤Á¤Þ¤¹¡£ + .PP + ¼¡¤ÎÎã¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï/home/src/java/awt/*\&.java¤Ë¤¢¤ê¤Þ¤¹¡£À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ï/home/html¤Ç¤¹¡£ +-1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È²½.PP ++.PP ++1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È²½ ++.PP + ¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¤ÈƱ¤¸Ì¾Á°¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë³ÊǼ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬(\fIjava\&.awt\&.color\fR¤Î¤è¤¦¤Ë¥É¥Ã¥È¤Ç¶èÀÚ¤é¤ì¤¿)Ê£¿ô¤Î¼±Ê̻Ҥ«¤é¹½À®¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¸å³¤Î³Æ¼±Ê̻Ҥ¬²¼°Ì¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(ava/awt/color¤Ê¤É)¤ËÂбþ¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.PP +-1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¤¿¤á¤ÎÊ£¿ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢°Û¤Ê¤ë¾ì½ê¤Ë¤¢¤ë¤½¤Î¤è¤¦¤Ê2¤Ä¤Î¥Ç¥£¥ì¥¯¥È¥ê¡¦¥Ä¥ê¡¼¤Ëʬ¤±¤Æ³ÊǼ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤½¤Î¾ì¹ç¤Ï\fI\-sourcepath\fR¤Ë¤è¤Ã¤Æ¤½¤ÎξÊý¤Î¾ì½ê¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢src1/java/awt/color¤Èsrc2/java/awt/color¡£ +-.PP +-¥Ç¥£¥ì¥¯¥È¥ê¤ÎÊѹ¹(\fIcd\fR¥³¥Þ¥ó¥É¤ò»ÈÍÑ)¤Þ¤¿¤Ï\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¼¡¤ÎÎã¤ÇξÊý¤ÎÁªÂò»è¤ò¼¨¤·¤Þ¤¹¡£ +-.PP +-\fBExample 1\fR, 1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤«¤éºÆµ¢Åª¤Ë¼Â¹Ô +-.RS 4 +-¤³¤ÎÎã¤Ç¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬Ç¤°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô¤Ç¤­¤ë¤è¤¦¤Ë¡¢\fI\-sourcepath\fR¤ò»ÈÍѤ·¡¢ºÆµ¢Åª½èÍý¤Î¤¿¤á¤Ë\fI\-subpackages\fR +-(1\&.4¤Î¿·¥ª¥×¥·¥ç¥ó)¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤ì¤Ï¡¢java¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¤¿¤É¤ê¤Þ¤¹¤¬¡¢\fIjava\&.net\fR¤È\fIjava\&.lang\fR¤ò¥ë¡¼¥È¤Ë»ý¤Ä¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤Þ¤¹¡£\fIjava\&.lang\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ç¤¢¤ë\fIjava\&.lang\&.ref\fR¤¬½ü³°¤µ¤ì¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤Þ¤¿¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤ò²¼Êý¤Ë¤¿¤É¤ë¤Ë¤Ï¡¢\fIjava:javax:org\&.xml\&.sax\fR¤Î¤è¤¦¤Ë¡¢¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò\fI\-subpackages\fR¤Î°ú¿ô¤ËÄɲä·¤Þ¤¹¡£ ++¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬(\fBjava\&.awt\&.color\fR¤Î¤è¤¦¤Ë¥É¥Ã¥È¤Ç¶èÀÚ¤é¤ì¤¿)Ê£¿ô¤Î¼±Ê̻Ҥ«¤é¹½À®¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¸å³¤Î³Æ¼±Ê̻Ҥ¬²¼°Ì¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(ava/awt/color¤Ê¤É)¤ËÂбþ¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¤¿¤á¤ÎÊ£¿ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢°Û¤Ê¤ë¾ì½ê¤Ë¤¢¤ë¤½¤Î¤è¤¦¤Ê2¤Ä¤Î¥Ç¥£¥ì¥¯¥È¥ê¡¦¥Ä¥ê¡¼¤Ëʬ¤±¤Æ³ÊǼ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤½¤Î¾ì¹ç¤Ï\fB\-sourcepath\fR¤Ë¤è¤Ã¤Æ¤½¤ÎξÊý¤Î¾ì½ê¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢src1/java/awt/color¤Èsrc2/java/awt/color¡£ ++.PP ++¥Ç¥£¥ì¥¯¥È¥ê¤ÎÊѹ¹(\fBcd\fR¥³¥Þ¥ó¥É¤ò»ÈÍÑ)¤Þ¤¿¤Ï\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¼¡¤ÎÎã¤ÇξÊý¤ÎÁªÂò»è¤ò¼¨¤·¤Þ¤¹¡£ ++.PP ++\fBÎã 1\fR ++.br ++1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤«¤éºÆµ¢Åª¤Ë¼Â¹Ô ++.RS 4 ++¤³¤ÎÎã¤Ç¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬Ç¤°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô¤Ç¤­¤ë¤è¤¦¤Ë¡¢\fB\-sourcepath\fR¤ò»ÈÍѤ·¡¢ºÆµ¢Åª½èÍý¤Î¤¿¤á¤Ë\fB\-subpackages\fR ++(1\&.4¤Î¿·¥ª¥×¥·¥ç¥ó)¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤ì¤Ï¡¢java¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¤¿¤É¤ê¤Þ¤¹¤¬¡¢\fBjava\&.net\fR¤È\fBjava\&.lang\fR¤ò¥ë¡¼¥È¤Ë»ý¤Ä¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤Þ¤¹¡£\fBjava\&.lang\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ç¤¢¤ë\fBjava\&.lang\&.ref\fR¤¬½ü³°¤µ¤ì¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤Þ¤¿¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤ò²¼Êý¤Ë¤¿¤É¤ë¤Ë¤Ï¡¢\fBjava:javax:org\&.xml\&.sax\fR¤Î¤è¤¦¤Ë¡¢¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò\fB\-subpackages\fR¤Î°ú¿ô¤ËÄɲä·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html \-sourcepath /home/src \-subpackages java \-exclude ++\fBjavadoc \-d /home/html \-sourcepath /home/src \-subpackages java \-exclude\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ¥ë¡¼¥È¤Ø¤Î°ÜÆ°¤ª¤è¤ÓÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤Î¼Â¹Ô +-.RS 4 +-´°Á´½¤¾þ¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¤Þ¤¹¡£¼¡¤Ë¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBÎã 2\fR ++.br ++¥ë¡¼¥È¤Ø¤Î°ÜÆ°¤ª¤è¤ÓÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤Î¼Â¹Ô ++.RS 4 ++´°Á´½¤¾þ¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¤Þ¤¹¡£¼¡¤Ë¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-cd /home/src/ +-javadoc \-d /home/html java\&.awt java\&.awt\&.event ++\fBcd /home/src/\fR ++\fBjavadoc \-d /home/html java\&.awt java\&.awt\&.event\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤Þ¤¿¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤ò²¼Êý¤Ë¤¿¤É¤ë¤Ë¤Ï¡¢j\fIava:javax:org\&.xml\&.sax\fR¤Î¤è¤¦¤Ë¡¢¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò\fI\-subpackages\fR¤Î°ú¿ô¤ËÄɲä·¤Þ¤¹¡£ +-.RE +-.PP +-\fBExample 3\fR, 1¤Ä¤Î¥Ä¥ê¡¼¤ÎÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤ÎǤ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô +-.RS 4 +-¤³¤Î¾ì¹ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤¬¤É¤³¤«¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢ºÇ¾å°Ì¥Ñ¥Ã¥±¡¼¥¸¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Æ\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£ ++¤Þ¤¿¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤ò²¼Êý¤Ë¤¿¤É¤ë¤Ë¤Ï¡¢j\fBava:javax:org\&.xml\&.sax\fR¤Î¤è¤¦¤Ë¡¢¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò\fB\-subpackages\fR¤Î°ú¿ô¤ËÄɲä·¤Þ¤¹¡£ ++.RE ++.PP ++\fBÎã 3\fR ++.br ++1¤Ä¤Î¥Ä¥ê¡¼¤ÎÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤ÎǤ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô ++.RS 4 ++¤³¤Î¾ì¹ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤¬¤É¤³¤«¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢ºÇ¾å°Ì¥Ñ¥Ã¥±¡¼¥¸¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Æ\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html \-sourcepath /home/src java\&.awt java\&.awt\&.event ++\fBjavadoc \-d /home/html \-sourcepath /home/src java\&.awt java\&.awt\&.event\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 4\fR, Ê£¿ô¤Î¥Ä¥ê¡¼¤ÎÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤ÎǤ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô +-.RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢³Æ¥Ä¥ê¡¼¤Î¥ë¡¼¥È¤Ø¤Î¥Ñ¥¹¤Î¥³¥í¥ó¶èÀÚ¤ê¥ê¥¹¥È¤ò»ØÄꤷ¤Æ\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¡¢1¤Ä¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î²¼¤Ë¸ºß¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¤¬¡¢¥½¡¼¥¹¡¦¥Ñ¥¹¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Î¤É¤³¤«¤Ç¸«¤Ä¤«¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBÎã 4\fR ++.br ++Ê£¿ô¤Î¥Ä¥ê¡¼¤ÎÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤ÎǤ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô ++.RS 4 ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢³Æ¥Ä¥ê¡¼¤Î¥ë¡¼¥È¤Ø¤Î¥Ñ¥¹¤Î¥³¥í¥ó¶èÀÚ¤ê¥ê¥¹¥È¤ò»ØÄꤷ¤Æ\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¡¢1¤Ä¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î²¼¤Ë¸ºß¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¤¬¡¢¥½¡¼¥¹¡¦¥Ñ¥¹¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Î¤É¤³¤«¤Ç¸«¤Ä¤«¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html \-sourcepath /home/src1:/home/src2 java\&.awt java\&.awt\&.event ++\fBjavadoc \-d /home/html \-sourcepath /home/src1:/home/src2 java\&.awt java\&.awt\&.event\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤¹¤Ù¤Æ¤Î¥±¡¼¥¹¤Çj\fIava\&.awt\fR¤ª¤è¤Ó\fIjava\&.awt\&.even\fRt¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î\fIpublic\fR¤ª¤è¤Ó\fIprotected\fR¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ä¤¤¤Æ¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢»ØÄꤵ¤ì¤¿À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤ËHTML¥Õ¥¡¥¤¥ë¤¬Êݸ¤µ¤ì¤Þ¤¹¡£2¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬À¸À®¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥É¥­¥å¥á¥ó¥È¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥ê¥¹¥È¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¡¢¤ª¤è¤Ó¥á¥¤¥ó¤Î¥¯¥é¥¹¡¦¥Ú¡¼¥¸¤È¤¤¤¦3¤Ä¤ÎHTML¥Õ¥ì¡¼¥à¤ò»ý¤Ä¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.RE +-1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½.PP +-¤Þ¤¿¡¢1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ·¤Æ¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¤Ï¡¢¼¡¤Î2¤Ä¤ÎÊýË¡¤Î¤¤¤º¤ì¤«¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£1¤Ä¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤òÊѹ¹¤¹¤ëÊýË¡(\fIcd\fR¤ò»ÈÍÑ)¡¢¤â¤¦1¤Ä¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò´°Á´¤Ë»ØÄꤹ¤ëÊýË¡¤Ç¤¹¡£ÁêÂХѥ¹¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òµ¯ÅÀ¤È¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ¹¤È¤­¤Ï¡¢\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¹¤Î¥°¥ë¡¼¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.PP +-\fBExample 1\fR, ¥½¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹ +-.RS 4 +-¥½¡¼¥¹¤òÊÝ»ý¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹¤·¤Þ¤¹¡£¼¡¤Ë¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ +-.sp +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIButton\fR¥¯¥é¥¹¤È\fICanvas\fR¥¯¥é¥¹¡¢¤ª¤è¤Ó̾Á°¤¬\fIGraphics\fR¤Ç»Ï¤Þ¤ë¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥É¥­¥å¥á¥ó¥È¤Ï¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¤È¥á¥¤¥ó¡¦¥Ú¡¼¥¸¤È¤¤¤¦2¤Ä¤Î¥Õ¥ì¡¼¥à¤ò»ý¤Ä¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¤¹¤Ù¤Æ¤Î¥±¡¼¥¹¤Çj\fBava\&.awt\fR¤ª¤è¤Ó\fBjava\&.awt\&.even\fRt¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î\fBpublic\fR¤ª¤è¤Ó\fBprotected\fR¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ä¤¤¤Æ¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢»ØÄꤵ¤ì¤¿À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤ËHTML¥Õ¥¡¥¤¥ë¤¬Êݸ¤µ¤ì¤Þ¤¹¡£2¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬À¸À®¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥É¥­¥å¥á¥ó¥È¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥ê¥¹¥È¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¡¢¤ª¤è¤Ó¥á¥¤¥ó¤Î¥¯¥é¥¹¡¦¥Ú¡¼¥¸¤È¤¤¤¦3¤Ä¤ÎHTML¥Õ¥ì¡¼¥à¤ò»ý¤Ä¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.RE ++.PP ++1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½ ++.PP ++¤Þ¤¿¡¢1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ·¤Æ¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¤Ï¡¢¼¡¤Î2¤Ä¤ÎÊýË¡¤Î¤¤¤º¤ì¤«¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£1¤Ä¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤òÊѹ¹¤¹¤ëÊýË¡(\fBcd\fR¤ò»ÈÍÑ)¡¢¤â¤¦1¤Ä¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò´°Á´¤Ë»ØÄꤹ¤ëÊýË¡¤Ç¤¹¡£ÁêÂХѥ¹¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òµ¯ÅÀ¤È¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ¹¤È¤­¤Ï¡¢\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¹Ô¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¹¤Î¥°¥ë¡¼¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.PP ++\fBÎã 1\fR ++.br ++¥½¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹ ++.RS 4 ++¥½¡¼¥¹¤òÊÝ»ý¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹¤·¤Þ¤¹¡£¼¡¤Ë¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++.sp ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBButton\fR¥¯¥é¥¹¤È\fBCanvas\fR¥¯¥é¥¹¡¢¤ª¤è¤Ó̾Á°¤¬\fBGraphics\fR¤Ç»Ï¤Þ¤ë¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥É¥­¥å¥á¥ó¥È¤Ï¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¤È¥á¥¤¥ó¡¦¥Ú¡¼¥¸¤È¤¤¤¦2¤Ä¤Î¥Õ¥ì¡¼¥à¤ò»ý¤Ä¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-cd /home/src/java/awt +-javadoc \-d /home/html Button\&.java Canvas\&.java Graphics*\&.java ++\fBcd /home/src/java/awt\fR ++\fBjavadoc \-d /home/html Button\&.java Canvas\&.java Graphics*\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹ ++\fBÎã 2\fR ++.br ++¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹ + .RS 4 + ¤³¤ì¤Ï¡¢Æ±¤¸¥ë¡¼¥È¤«¤é¤ÎÊ̤Υµ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Î¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë°Ü¤ê¡¢³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¥ë¡¼¥È¤«¤é¤Î¥Ñ¥¹¤È¤È¤â¤Ë»ØÄꤷ¤Þ¤¹¡£ + .sp +@@ -3501,143 +3668,157 @@ + .RS 4 + .\} + .nf +-cd /home/src/ +-javadoc \-d /home/html java/awt/Button\&.java java/applet/Applet\&.java ++\fBcd /home/src/\fR ++\fBjavadoc \-d /home/html java/awt/Button\&.java java/applet/Applet\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, Ǥ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥È²½ +-.RS 4 +-¤³¤Î¾ì¹ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤¬¤É¤³¤«¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤ÎÀäÂХѥ¹(¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹)¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBÎã 3\fR ++.br ++Ǥ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥È²½ ++.RS 4 ++¤³¤Î¾ì¹ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤¬¤É¤³¤«¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤ÎÀäÂХѥ¹(¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹)¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html /home/src/java/awt/Button\&.java +-/home/src/java/awt/Graphics*\&.java ++\fBjavadoc \-d /home/html /home/src/java/awt/Button\&.java\fR ++\fB/home/src/java/awt/Graphics*\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE +-¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½.PP +-¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤȸġ¹¤Î¥¯¥é¥¹¤òƱ»þ¤Ë»ØÄꤷ¤Æ¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¼¡¤Ë¡¢Á°½Ò¤Î2¤Ä¤ÎÎã¤òÁȤ߹礻¤¿Îã¤ò¼¨¤·¤Þ¤¹¡£\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥Ñ¥¹¤ËÂФ·¤Æ¤Ï»ÈÍѤǤ­¤Þ¤¹¤¬¡¢¸Ä¡¹¤Î¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ËÂФ·¤Æ¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++.PP ++¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½ ++.PP ++¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤȸġ¹¤Î¥¯¥é¥¹¤òƱ»þ¤Ë»ØÄꤷ¤Æ¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¼¡¤Ë¡¢Á°½Ò¤Î2¤Ä¤ÎÎã¤òÁȤ߹礻¤¿Îã¤ò¼¨¤·¤Þ¤¹¡£\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥Ñ¥¹¤ËÂФ·¤Æ¤Ï»ÈÍѤǤ­¤Þ¤¹¤¬¡¢¸Ä¡¹¤Î¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ËÂФ·¤Æ¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html \-sourcepath /home/src java\&.awt +-/home/src/java/applet/Applet\&.java ++\fBjavadoc \-d /home/html \-sourcepath /home/src java\&.awt\fR ++\fB/home/src/java/applet/Applet\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¼ÂºÝ¤ÎÎã" + .PP +-¼¡¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤ª¤è¤Ó\fImakefile\fR¥Ð¡¼¥¸¥ç¥ó¤Î\fIjavadoc\fR¥³¥Þ¥ó¥É¤òJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥àAPI¤Ç¼Â¹Ô¤·¤Þ¤¹¡£Java SE 1\&.2¤ÇÌó1500¸Ä¤Îpublic¤ª¤è¤Óprotected¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢180MB¤Î¥á¥â¥ê¡¼¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Á¤é¤ÎÎã¤â¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤ÇÀäÂХѥ¹¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤¿¤á¡¢Ç¤°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤éƱ¤¸\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤ÎÎã.PP +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ìÉô¤Î¥·¥§¥ë¤ËÂФ·¤ÆŤ¹¤®¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÀ©¸Â¤ò²óÈò¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤òµ­½Ò¤·¤Þ¤¹¡£ +-.PP +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIpackages\fR¤Ï½èÍý¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à̾Á°¤Ç¡¢\fIjava\&.applet\fR +-\fIjava\&.lang\fR¤Ê¤É¤Ç¤¹¡£³Æ¥ª¥×¥·¥ç¥ó¤Î¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤Þ¤ì¤¿°ú¿ô¤ÎÆ⦤ˤϡ¢²þ¹Ôʸ»ú¤òÁÞÆþ¤Ç¤­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¤³¤ÎÎã¤ò¥³¥Ô¡¼¡¦¥¢¥ó¥É¡¦¥Ú¡¼¥¹¥È¤¹¤ë¾ì¹ç¤Ï¡¢\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤«¤é²þ¹Ôʸ»ú¤òºï½ü¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¹Ô¤ª¤è¤Ó\fBmakefile\fR¥Ð¡¼¥¸¥ç¥ó¤Î\fBjavadoc\fR¥³¥Þ¥ó¥É¤òJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥àAPI¤Ç¼Â¹Ô¤·¤Þ¤¹¡£Java SE 1\&.2¤ÇÌó1500¸Ä¤Îpublic¤ª¤è¤Óprotected¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢180MB¤Î¥á¥â¥ê¡¼¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Á¤é¤ÎÎã¤â¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤ÇÀäÂХѥ¹¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤¿¤á¡¢Ç¤°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤éƱ¤¸\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ ++.PP ++¥³¥Þ¥ó¥É¹Ô¤ÎÎã ++.PP ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ìÉô¤Î¥·¥§¥ë¤ËÂФ·¤ÆŤ¹¤®¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÀ©¸Â¤ò²óÈò¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤òµ­½Ò¤·¤Þ¤¹¡£ ++.PP ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBpackages\fR¤Ï½èÍý¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à̾Á°¤Ç¡¢\fBjava\&.applet\fR ++\fBjava\&.lang\fR¤Ê¤É¤Ç¤¹¡£³Æ¥ª¥×¥·¥ç¥ó¤Î¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤Þ¤ì¤¿°ú¿ô¤ÎÆ⦤ˤϡ¢²þ¹Ôʸ»ú¤òÁÞÆþ¤Ç¤­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¤³¤ÎÎã¤ò¥³¥Ô¡¼¡¦¥¢¥ó¥É¡¦¥Ú¡¼¥¹¥È¤¹¤ë¾ì¹ç¤Ï¡¢\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤«¤é²þ¹Ôʸ»ú¤òºï½ü¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /java/jdk/src/share/classes \e +-\-overview /java/jdk/src/share/classes/overview\&.html \e +-\-d /java/jdk/build/api \e +-\-use \e +-\-splitIndex \e +-\-windowtitle \*(AqJava Platform, Standard Edition 7 API Specification\*(Aq \e +-\-doctitle \*(AqJava Platform, Standard Edition 7 API Specification\*(Aq \e +-\-header \*(Aq<b>Java(TM) SE 7</b>\*(Aq \e +-\-bottom \*(Aq<font size="\-1"> +-<a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/> +-Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&.<br/> +-Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&. +-Other names may be trademarks of their respective owners\&.</font>\*(Aq \e +-\-group "Core Packages" "java\&.*:com\&.sun\&.java\&.*:org\&.omg\&.*" \e +-\-group "Extension Packages" "javax\&.*" \e +-\-J\-Xmx180m \e +-@packages ++\fBjavadoc \-sourcepath /java/jdk/src/share/classes \e\fR ++\fB\-overview /java/jdk/src/share/classes/overview\&.html \e\fR ++\fB\-d /java/jdk/build/api \e\fR ++\fB\-use \e\fR ++\fB\-splitIndex \e\fR ++\fB\-windowtitle \*(AqJava Platform, Standard Edition 7 API Specification\*(Aq \e\fR ++\fB\-doctitle \*(AqJava Platform, Standard Edition 7 API Specification\*(Aq \e\fR ++\fB\-header \*(Aq<b>Java(TM) SE 7</b>\*(Aq \e\fR ++\fB\-bottom \*(Aq<font size="\-1">\fR ++\fB<a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/>\fR ++\fBCopyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&.<br/>\fR ++\fBOracle is a registered trademark of Oracle Corporation and/or its affiliates\&.\fR ++\fBOther names may be trademarks of their respective owners\&.</font>\*(Aq \e\fR ++\fB\-group "Core Packages" "java\&.*:com\&.sun\&.java\&.*:org\&.omg\&.*" \e\fR ++\fB\-group "Extension Packages" "javax\&.*" \e\fR ++\fB\-J\-Xmx180m \e \fR ++\fB@packages\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹.PP ++.PP ++¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹ ++.PP + Javadoc Access API¤Ç¤Ï¡¢¿·¤·¤¤¥×¥í¥»¥¹¤ò¼Â¹Ô¤·¤Ê¤¯¤Æ¤â¡¢Javadoc¥Ä¡¼¥ë¤òJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤«¤éľÀܵ¯Æ°¤Ç¤­¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¼¡¤Îʸ¤Ï¥³¥Þ¥ó¥É\fIjavadoc \-d /home/html \-sourcepath /home/src \-subpackages java \-exclude java\&.net:java\&.lang com\&.example\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¼¡¤Îʸ¤Ï¥³¥Þ¥ó¥É\fBjavadoc \-d /home/html \-sourcepath /home/src \-subpackages java \-exclude java\&.net:java\&.lang com\&.example\fR¤ÈƱÅù¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-import javax\&.tools\&.DocumentationTool; +-import javax\&.tools\&.ToolProvider; +- +-public class JavaAccessSample{ +- public static void main(String[] args){ +- DocumentationTool javadoc = ToolProvider\&.getSystemDocumentationTool(); +- int rc = javadoc\&.run( null, null, null, +- "\-d", "/home/html", +- "\-sourcepath", "home/src", +- "\-subpackages", "java", +- "\-exclude", "java\&.net:java\&.lang", +- "com\&.example"); +- } +- } ++\fBimport javax\&.tools\&.DocumentationTool;\fR ++\fBimport javax\&.tools\&.ToolProvider;\fR ++ ++\fBpublic class JavaAccessSample{\fR ++\fB public static void main(String[] args){\fR ++\fB DocumentationTool javadoc = ToolProvider\&.getSystemDocumentationTool();\fR ++\fB int rc = javadoc\&.run( null, null, null,\fR ++\fB "\-d", "/home/html",\fR ++\fB "\-sourcepath", "home/src",\fR ++\fB "\-subpackages", "java",\fR ++\fB "\-exclude", "java\&.net:java\&.lang",\fR ++\fB "com\&.example");\fR ++\fB }\fR ++\fB }\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIrun\fR¥á¥½¥Ã¥É¤ÎºÇ½é¤Î3¤Ä¤Î°ú¿ô¤Ï¡¢ÆþÎÏ¡¢É¸½à½ÐÎÏ¡¢¤ª¤è¤Óɸ½à¥¨¥é¡¼¡¦¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤Þ¤¹¡£\fINull\fR¤Ï\fISystem\&.in\fR¡¢\fISystem\&.out\fR¤ª¤è¤Ó\fISystem\&.err\fR¤½¤ì¤¾¤ì¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤǤ¹¡£ ++\fBrun\fR¥á¥½¥Ã¥É¤ÎºÇ½é¤Î3¤Ä¤Î°ú¿ô¤Ï¡¢ÆþÎÏ¡¢É¸½à½ÐÎÏ¡¢¤ª¤è¤Óɸ½à¥¨¥é¡¼¡¦¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤Þ¤¹¡£\fBNull\fR¤Ï\fBSystem\&.in\fR¡¢\fBSystem\&.out\fR¤ª¤è¤Ó\fBSystem\&.err\fR¤½¤ì¤¾¤ì¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤǤ¹¡£ + .SS "makefile¤ÎÎã" + .PP + ¤³¤³¤Ç¤Ï¡¢GNU +-\fImakefile\fR¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fImakefile\fR¤Î°ú¿ô¤Ï¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£Windows +-\fImakefile\fR¤ÎÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc FAQ¤Î\fImakefiles\fR¤Ë´Ø¤¹¤ë¹à ++\fBmakefile\fR¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fBmakefile\fR¤Î°ú¿ô¤Ï¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£Windows ++\fBmakefile\fR¤ÎÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc FAQ¤Î\fBmakefiles\fR¤Î¥»¥¯¥·¥ç¥ó + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137483\&.html#makefiles)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath $(SRCDIR) \e /* Sets path for source files */ +- \-overview $(SRCDIR)/overview\&.html \e /* Sets file for overview text */ +- \-d /java/jdk/build/api \e /* Sets destination directory */ +- \-use \e /* Adds "Use" files */ +- \-splitIndex \e /* Splits index A\-Z */ +- \-windowtitle $(WINDOWTITLE) \e /* Adds a window title */ +- \-doctitle $(DOCTITLE) \e /* Adds a doc title */ +- \-header $(HEADER) \e /* Adds running header text */ +- \-bottom $(BOTTOM) \e /* Adds text at bottom */ +- \-group $(GROUPCORE) \e /* 1st subhead on overview page */ +- \-group $(GROUPEXT) \e /* 2nd subhead on overview page */ +- \-J\-Xmx180m \e /* Sets memory to 180MB */ +- java\&.lang java\&.lang\&.reflect \e /* Sets packages to document */ +- java\&.util java\&.io java\&.net \e +- java\&.applet +- +-WINDOWTITLE = \*(AqJava(TM) SE 7 API Specification\*(Aq +-DOCTITLE = \*(AqJava(TM) Platform Standard Edition 7 API Specification\*(Aq +-HEADER = \*(Aq<b>Java(TM) SE 7</font>\*(Aq +-BOTTOM = \*(Aq<font size="\-1"> +- <a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/> +- Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&.<br/> +- Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&. +- Other names may be trademarks of their respective owners\&.</font>\*(Aq +-GROUPCORE = \*(Aq"Core Packages" "java\&.*:com\&.sun\&.java\&.*:org\&.omg\&.*"\*(Aq +-GROUPEXT = \*(Aq"Extension Packages" "javax\&.*"\*(Aq +-SRCDIR = \*(Aq/java/jdk/1\&.7\&.0/src/share/classes\*(Aq ++\fBjavadoc \-sourcepath $(SRCDIR) \e /* Sets path for source files */\fR ++\fB \-overview $(SRCDIR)/overview\&.html \e /* Sets file for overview text */\fR ++\fB \-d /java/jdk/build/api \e /* Sets destination directory */\fR ++\fB \-use \e /* Adds "Use" files */\fR ++\fB \-splitIndex \e /* Splits index A\-Z */\fR ++\fB \-windowtitle $(WINDOWTITLE) \e /* Adds a window title */\fR ++\fB \-doctitle $(DOCTITLE) \e /* Adds a doc title */\fR ++\fB \-header $(HEADER) \e /* Adds running header text */\fR ++\fB \-bottom $(BOTTOM) \e /* Adds text at bottom */\fR ++\fB \-group $(GROUPCORE) \e /* 1st subhead on overview page */\fR ++\fB \-group $(GROUPEXT) \e /* 2nd subhead on overview page */\fR ++\fB \-J\-Xmx180m \e /* Sets memory to 180MB */\fR ++\fB java\&.lang java\&.lang\&.reflect \e /* Sets packages to document */\fR ++\fB java\&.util java\&.io java\&.net \e\fR ++\fB java\&.applet\fR ++\fB \fR ++\fBWINDOWTITLE = \*(AqJava(TM) SE 7 API Specification\*(Aq\fR ++\fBDOCTITLE = \*(AqJava(TM) Platform Standard Edition 7 API Specification\*(Aq\fR ++\fBHEADER = \*(Aq<b>Java(TM) SE 7</font>\*(Aq\fR ++\fBBOTTOM = \*(Aq<font size="\-1">\fR ++\fB <a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/>\fR ++\fB Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&.<br/>\fR ++\fB Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&.\fR ++\fB Other names may be trademarks of their respective owners\&.</font>\*(Aq\fR ++\fBGROUPCORE = \*(Aq"Core Packages" "java\&.*:com\&.sun\&.java\&.*:org\&.omg\&.*"\*(Aq\fR ++\fBGROUPEXT = \*(Aq"Extension Packages" "javax\&.*"\*(Aq\fR ++\fBSRCDIR = \*(Aq/java/jdk/1\&.7\&.0/src/share/classes\*(Aq\fR ++ + .fi + .if n \{\ + .RE +@@ -3652,7 +3833,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¥É¥­¥å¥á¥ó¥È¡¦¥¿¥¤¥È¥ë¤¬¥¦¥£¥ó¥É¥¦¡¦¥¿¥¤¥È¥ë¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£\fI\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤Î¥Æ¥­¥¹¥È¤Ï¡¢\fI\-doctitle\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¤¬¡¢HTML¥¿¥°¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢HTML¥¿¥°¤¬¡¢¥¦¥£¥ó¥É¥¦¡¦¥¿¥¤¥È¥ëÆâ¤Ë¤½¤Î¤Þ¤Þ¤Î¥Æ¥­¥¹¥È¤È¤·¤Æɽ¼¨¤µ¤ì¤ë¤Î¤òËɤ°¤¿¤á¤Ç¤¹¡£ ++\fB\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¥É¥­¥å¥á¥ó¥È¡¦¥¿¥¤¥È¥ë¤¬¥¦¥£¥ó¥É¥¦¡¦¥¿¥¤¥È¥ë¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£\fB\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤Î¥Æ¥­¥¹¥È¤Ï¡¢\fB\-doctitle\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¤¬¡¢HTML¥¿¥°¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢HTML¥¿¥°¤¬¡¢¥¦¥£¥ó¥É¥¦¡¦¥¿¥¤¥È¥ëÆâ¤Ë¤½¤Î¤Þ¤Þ¤Î¥Æ¥­¥¹¥È¤È¤·¤Æɽ¼¨¤µ¤ì¤ë¤Î¤òËɤ°¤¿¤á¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -3663,7 +3844,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-footer\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¥Ø¥Ã¥À¡¼¡¦¥Æ¥­¥¹¥È¤¬¥Õ¥Ã¥¿¡¼¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++\fB\-footer\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¥Ø¥Ã¥À¡¼¡¦¥Æ¥­¥¹¥È¤¬¥Õ¥Ã¥¿¡¼¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -3674,7 +3855,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¤³¤ÎÎã¤Ç¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¤¬¡¢\fI\-classpath\fR¤È\fI\-link\fR¤â½ÅÍפʥª¥×¥·¥ç¥ó¤Ç¤¹¡£ ++¤³¤ÎÎã¤Ç¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¤¬¡¢\fB\-classpath\fR¤È\fB\-link\fR¤â½ÅÍפʥª¥×¥·¥ç¥ó¤Ç¤¹¡£ + .RE + .SH "°ìÈÌŪ¤Ê¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°" + .sp +@@ -3686,7 +3867,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ÏÍ­¸ú¤Ê¥¯¥é¥¹Ì¾¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤Î¤ß¤òÆɤ߼è¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòÀµ¤·¤¯Æɤ߼è¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥¯¥é¥¹Ì¾¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ÏÍ­¸ú¤Ê¥¯¥é¥¹Ì¾¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤Î¤ß¤òÆɤ߼è¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòÀµ¤·¤¯Æɤ߼è¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥¯¥é¥¹Ì¾¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -3697,25 +3878,25 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¶¦Ä̤ÎÉÔ¶ñ¹ç¤ª¤è¤Ó¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤Î¥Ò¥ó¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc FAQ ++°ìÈÌŪ¤Êbug¤ª¤è¤Ó¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤Î¥Ò¥ó¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc FAQ + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137483\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥¨¥é¡¼¤È·Ù¹ð" + .PP + ¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¥á¥Ã¥»¡¼¥¸¤Ë¤Ï¡¢¥Õ¥¡¥¤¥ë̾¤ÈÀë¸À¹Ô(¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ÎÆÃÄê¤Î¹Ô¤Ç¤Ï¤Ê¤¤)¤Î¹ÔÈֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¥á¥Ã¥»¡¼¥¸\fI¡Ö¥¨¥é¡¼: Class1\&.java¤òÆɤ߹þ¤á¤Þ¤»¤ó¡×\fR¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬\fIClass1\&.jav\fR\fIa\fR¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥í¡¼¥É¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¥¯¥é¥¹Ì¾¤Ï¤½¤Î¥Ñ¥¹(ÀäÂФޤ¿¤ÏÁêÂÐ)¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥á¥Ã¥»¡¼¥¸\fB¡Ö¥¨¥é¡¼: Class1\&.java¤òÆɤ߹þ¤á¤Þ¤»¤ó¡×\fR¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬\fBClass1\&.jav\fR\fBa\fR¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥í¡¼¥É¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¥¯¥é¥¹Ì¾¤Ï¤½¤Î¥Ñ¥¹(ÀäÂФޤ¿¤ÏÁêÂÐ)¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .SH "´Ä¶­" + .PP + CLASSPATH + .RS 4 +-\fICLASSPATH\fR¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¸¡½Ð¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¤òÄ󶡤¹¤ë´Ä¶­ÊÑ¿ô¤Ç¤¹¡£¤³¤Î´Ä¶­ÊÑ¿ô¤Ï¡¢\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥»¥ß¥³¥í¥ó(Windows¤Î¾ì¹ç)¤Þ¤¿¤Ï¥³¥í¥ó(Oracle Solaris¤Î¾ì¹ç)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ ++\fBCLASSPATH\fR¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¸¡½Ð¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¤òÄ󶡤¹¤ë´Ä¶­ÊÑ¿ô¤Ç¤¹¡£¤³¤Î´Ä¶­ÊÑ¿ô¤Ï¡¢\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥»¥ß¥³¥í¥ó(Windows¤Î¾ì¹ç)¤Þ¤¿¤Ï¥³¥í¥ó(Oracle Solaris¤Î¾ì¹ç)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ + .sp + \fBWindows¤ÎÎã\fR: +-\fI\&.;C:\eclasses;C:\ehome\ejava\eclasses\fR ++\fB\&.;C:\eclasses;C:\ehome\ejava\eclasses\fR + .sp + \fBOracle Solaris¤ÎÎã\fR: +-\fI\&.:/home/classes:/usr/local/java/classes\fR ++\fB\&.:/home/classes:/usr/local/java/classes\fR + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/javah.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/javah.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: javah +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: javah ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "javah" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + javah \- Java¥¯¥é¥¹¤«¤éC¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjavah\fR [ \fIoptions\fR ] f\fIully\-qualified\-class\-name \&.\&.\&.\fR ++\fBjavah\fR [ \fIoptions\fR ] f\fIully\-qualified\-class\-name \&.\&.\&.\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIfully\-qualified\-class\-name\fR +@@ -73,76 +75,76 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjavah\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤ËɬÍפÊC¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ºîÀ®¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥½¡¼¥¹¡¦¥³¡¼¥É¤«¤é¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤ò»²¾È¤¹¤ë¤¿¤á¤ËC¥×¥í¥°¥é¥à¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£\fI\&.h\fR¥Õ¥¡¥¤¥ë¤Ï¡¢Âбþ¤¹¤ë¥¯¥é¥¹¤È°ìÃפ¹¤ëÇÛÃÖ¤ò»ý¤Ä\fIstruct\fRÄêµÁ¤ò´Þ¤ß¤Þ¤¹¡£\fIstruct\fR¤Î¥Õ¥£¡¼¥ë¥É¤Ï¡¢¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤ËÂбþ¤·¤Þ¤¹¡£ ++\fBjavah\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤ËɬÍפÊC¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ºîÀ®¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥½¡¼¥¹¡¦¥³¡¼¥É¤«¤é¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤ò»²¾È¤¹¤ë¤¿¤á¤ËC¥×¥í¥°¥é¥à¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£\fB\&.h\fR¥Õ¥¡¥¤¥ë¤Ï¡¢Âбþ¤¹¤ë¥¯¥é¥¹¤È°ìÃפ¹¤ëÇÛÃÖ¤ò»ý¤Ä\fBstruct\fRÄêµÁ¤ò´Þ¤ß¤Þ¤¹¡£\fBstruct\fR¤Î¥Õ¥£¡¼¥ë¥É¤Ï¡¢¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤ËÂбþ¤·¤Þ¤¹¡£ + .PP +-¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤È¤½¤ÎÃæ¤ÇÀë¸À¤µ¤ì¤ë¹½Â¤ÂΤÎ̾Á°¤Ï¥¯¥é¥¹¤Î̾Á°¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£\fIjavah\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤ÎÃæ¤Ë¤¢¤ë¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë̾¤È¹½Â¤ÂÎ̾¤ÎξÊý¤ÎÀèƬ¤ËÉղ䵤ì¤Þ¤¹¡£²¼Àþ(_)¤¬Ì¾Á°¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤È¤½¤ÎÃæ¤ÇÀë¸À¤µ¤ì¤ë¹½Â¤ÂΤÎ̾Á°¤Ï¥¯¥é¥¹¤Î̾Á°¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£\fBjavah\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤ÎÃæ¤Ë¤¢¤ë¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë̾¤È¹½Â¤ÂÎ̾¤ÎξÊý¤ÎÀèƬ¤ËÉղ䵤ì¤Þ¤¹¡£²¼Àþ(_)¤¬Ì¾Á°¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fIjavah\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¥ê¥¹¥È¤µ¤ì¤ë³Æ¥¯¥é¥¹¤Î¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òÃÖ¤­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢\fI\-stubs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£1¤Ä¤Î¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë¡¢¥ê¥¹¥È¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î·ë²Ì¤òÏ¢·ë¤¹¤ë¤Ë¤Ï¡¢\fI\-o\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fBjavah\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ë¥ê¥¹¥È¤µ¤ì¤ë³Æ¥¯¥é¥¹¤Î¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òÃÖ¤­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢\fB\-stubs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£1¤Ä¤Î¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë¡¢¥ê¥¹¥È¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î·ë²Ì¤òÏ¢·ë¤¹¤ë¤Ë¤Ï¡¢\fB\-o\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-Java Native Interface (JNI)¤Ï¥Ø¥Ã¥À¡¼¾ðÊó¤Þ¤¿¤Ï¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤òɬÍפȤ·¤Þ¤»¤ó¡£\fIjavah\fR¥³¥Þ¥ó¥É¤Ï°ú¤­Â³¤­JNI·Á¼°¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É¤ËɬÍפʥͥ¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É´Ø¿ô¥×¥í¥È¥¿¥¤¥×¤ÎÀ¸À®¤Ë»ÈÍѤǤ­¤Þ¤¹¡£\fIjavah\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇJNI·Á¼°¤Î½ÐÎϤòÀ¸À®¤·¡¢¤½¤Î·ë²Ì¤ò\fI\&.h\fR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Þ¤¹¡£ ++Java Native Interface (JNI)¤Ï¥Ø¥Ã¥À¡¼¾ðÊó¤Þ¤¿¤Ï¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤òɬÍפȤ·¤Þ¤»¤ó¡£\fBjavah\fR¥³¥Þ¥ó¥É¤Ï°ú¤­Â³¤­JNI·Á¼°¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É¤ËɬÍפʥͥ¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É´Ø¿ô¥×¥í¥È¥¿¥¤¥×¤ÎÀ¸À®¤Ë»ÈÍѤǤ­¤Þ¤¹¡£\fBjavah\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇJNI·Á¼°¤Î½ÐÎϤòÀ¸À®¤·¡¢¤½¤Î·ë²Ì¤ò\fB\&.h\fR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-o \fIoutputfile\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¥ê¥¹¥È¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤ËÂФ·¤Æ¡¢·ë²Ì¤Î¥Ø¥Ã¥À¡¼¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÏ¢·ë¤·¤Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Þ¤¹¡£\fI\-o\fR¤Þ¤¿¤Ï\fI\-d\fR¤Î¤É¤Á¤é¤«¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ë¥ê¥¹¥È¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤ËÂФ·¤Æ¡¢·ë²Ì¤Î¥Ø¥Ã¥À¡¼¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÏ¢·ë¤·¤Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Þ¤¹¡£\fB\-o\fR¤Þ¤¿¤Ï\fB\-d\fR¤Î¤É¤Á¤é¤«¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-d \fIdirectory\fR + .RS 4 +-\fIjavah\fR¤¬¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤òÊݸ¤¹¤ë¡¢¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£\fI\-d\fR¤Þ¤¿¤Ï\fI\-o\fR¤Î¤É¤Á¤é¤«¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++\fBjavah\fR¤¬¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤òÊݸ¤¹¤ë¡¢¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£\fB\-d\fR¤Þ¤¿¤Ï\fB\-o\fR¤Î¤É¤Á¤é¤«¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-stubs + .RS 4 +-\fIjavah\fR¥³¥Þ¥ó¥É¤¬¡¢Java¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Õ¥¡¥¤¥ë¤«¤éCÀë¸À¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBjavah\fR¥³¥Þ¥ó¥É¤¬¡¢Java¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Õ¥¡¥¤¥ë¤«¤éCÀë¸À¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP + \-verbose + .RS 4 +-¾ÜºÙ½ÐÎϤò»ØÄꤷ¡¢ºîÀ®¥Õ¥¡¥¤¥ë¤Î¾õÂ֤˴ؤ¹¤ë¥á¥Ã¥»¡¼¥¸¤ò¡¢\fIjavah\fR¥³¥Þ¥ó¥É¤¬\fIɸ½à½ÐÎÏ\fR¤Ë½ÐÎϤ·¤Þ¤¹¡£ ++¾ÜºÙ½ÐÎϤò»ØÄꤷ¡¢ºîÀ®¥Õ¥¡¥¤¥ë¤Î¾õÂ֤˴ؤ¹¤ë¥á¥Ã¥»¡¼¥¸¤ò¡¢\fBjavah\fR¥³¥Þ¥ó¥É¤¬\fBɸ½à½ÐÎÏ\fR¤Ë½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-help + .RS 4 +-\fIjavah\fR¤Î»ÈÍÑÊýË¡¤Ë¤Ä¤¤¤Æ¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjavah\fR¤Î»ÈÍÑÊýË¡¤Ë¤Ä¤¤¤Æ¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-version + .RS 4 +-\fIjavah\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjavah\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-jni + .RS 4 +-JNI·Á¼°¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥Éµ¡Ç½¥×¥í¥È¥¿¥¤¥×¤ò´Þ¤à½ÐÎÏ¥Õ¥¡¥¤¥ë¤ò¡¢\fIjavah\fR¥³¥Þ¥ó¥É¤¬ºîÀ®¤·¤Þ¤¹¡£¤³¤ì¤Ïɸ½à½ÐÎϤǤ¢¤ë¤¿¤á¡¢\fI\-jni\fR¤Î»ÈÍѤϥª¥×¥·¥ç¥ó¤Ç¤¹¡£ ++JNI·Á¼°¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥Éµ¡Ç½¥×¥í¥È¥¿¥¤¥×¤ò´Þ¤à½ÐÎÏ¥Õ¥¡¥¤¥ë¤ò¡¢\fBjavah\fR¥³¥Þ¥ó¥É¤¬ºîÀ®¤·¤Þ¤¹¡£¤³¤ì¤Ïɸ½à½ÐÎϤǤ¢¤ë¤¿¤á¡¢\fB\-jni\fR¤Î»ÈÍѤϥª¥×¥·¥ç¥ó¤Ç¤¹¡£ + .RE + .PP + \-classpath \fIpath\fR + .RS 4 +-¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Ë\fIjavah\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Þ¤¿¤Ï\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤ÎÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ÏOracle Solaris¤Î¾ì¹ç¤Ï¥³¥í¥ó¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£¥Ñ¥¹¤Î°ìÈÌŪ¤Ê·Á¼°¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Ë\fBjavah\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Þ¤¿¤Ï\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤ÎÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ÏOracle Solaris¤Î¾ì¹ç¤Ï¥³¥í¥ó¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£¥Ñ¥¹¤Î°ìÈÌŪ¤Ê·Á¼°¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + \fBOracle Solaris\fR¤Î¾ì¹ç: + .sp + \&.:\fIyour\-path\fR + .sp + Îã: +-\fI\&.:/home/avh/classes:/usr/local/java/classes\fR ++\fB\&.:/home/avh/classes:/usr/local/java/classes\fR + .sp + \fBWindows\fR¤Î¾ì¹ç: + .sp + \&.;\fIyour\-path\fR + .sp + Îã: +-\fI\&.;C:\eusers\edac\eclasses;C:\etools\ejava\eclasses\fR ++\fB\&.;C:\eusers\edac\eclasses;C:\etools\ejava\eclasses\fR + .sp +-Êص¹¾å¡¢*¤Î¥Ù¡¼¥¹Ì¾¤ò´Þ¤à¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁǤϡ¢\fI\&.jar\fR¤Þ¤¿¤Ï\fI\&.JAR\fR¤ò³ÈÄ¥»Ò¤Ë»ý¤Ä¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ ++Êص¹¾å¡¢*¤Î¥Ù¡¼¥¹Ì¾¤ò´Þ¤à¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁǤϡ¢\fB\&.jar\fR¤Þ¤¿¤Ï\fB\&.JAR\fR¤ò³ÈÄ¥»Ò¤Ë»ý¤Ä¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢¥Ç¥£¥ì¥¯¥È¥ê\fImydir\fR¤Ë\fIa\&.jar\fR¤È\fIb\&.JAR\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁÇ\fImydir/*\fR¤Ï\fIA\fR\fI\&.jar:b\&.JAR\fR¤ËŸ³«¤µ¤ì¤Þ¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Î½çÈÖ¤Ï̤»ØÄê¤È¤Ê¤ê¤Þ¤¹¡£¤³¤Î¥ê¥¹¥È¤Ë¤Ï¡¢±£¤·¥Õ¥¡¥¤¥ë¤â´Þ¤á¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Þ¤¹¡£*¤«¤é¤Ê¤ë¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥¨¥ó¥È¥ê¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ËŸ³«¤µ¤ì¤Þ¤¹¡£\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤â¡¢ÄêµÁ»þ¤Ë¤ÏƱÍͤËŸ³«¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÎŸ³«¤Ï¡¢Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î³«»ÏÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹¡£Java¥×¥í¥°¥é¥à¤Ï¡¢´Ä¶­¤òÌ䤤¹ç¤»¤ë¾ì¹ç¤ò½ü¤­¡¢Å¸³«¤µ¤ì¤Æ¤¤¤Ê¤¤¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»²¾È¤·¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fISystem\&.getenv("CLASSPATH")\fR¤ò¥³¡¼¥ë¤·¤ÆÌ䤤¹ç¤»¤ë¾ì¹ç¤Ç¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥Ç¥£¥ì¥¯¥È¥ê\fBmydir\fR¤Ë\fBa\&.jar\fR¤È\fBb\&.JAR\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁÇ\fBmydir/*\fR¤Ï\fBA\fR\fB\&.jar:b\&.JAR\fR¤ËŸ³«¤µ¤ì¤Þ¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Î½çÈÖ¤Ï̤»ØÄê¤È¤Ê¤ê¤Þ¤¹¡£¤³¤Î¥ê¥¹¥È¤Ë¤Ï¡¢±£¤·¥Õ¥¡¥¤¥ë¤â´Þ¤á¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Þ¤¹¡£*¤«¤é¤Ê¤ë¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥¨¥ó¥È¥ê¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ËŸ³«¤µ¤ì¤Þ¤¹¡£\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤â¡¢ÄêµÁ»þ¤Ë¤ÏƱÍͤËŸ³«¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÎŸ³«¤Ï¡¢Java Virtual Machine (JVM)¤Î³«»ÏÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹¡£Java¥×¥í¥°¥é¥à¤Ï¡¢´Ä¶­¤òÌ䤤¹ç¤»¤ë¾ì¹ç¤ò½ü¤­¡¢Å¸³«¤µ¤ì¤Æ¤¤¤Ê¤¤¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»²¾È¤·¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fBSystem\&.getenv("CLASSPATH")\fR¤ò¥³¡¼¥ë¤·¤ÆÌ䤤¹ç¤»¤ë¾ì¹ç¤Ç¤¹¡£ + .RE + .PP + \-bootclasspath \fIpath\fR + .RS 4 +-¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fIjre\elib\ert\&.jar\fR¤ª¤è¤Ó¾¤Î¤¤¤¯¤Ä¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¡¢¥³¥¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£ ++¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fBjre\elib\ert\&.jar\fR¤ª¤è¤Ó¾¤Î¤¤¤¯¤Ä¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¡¢¥³¥¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£ + .RE + .PP + \-old +@@ -157,7 +159,7 @@ + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/javap.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/javap.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: javap +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,8 +21,16 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 +-.TH "javap" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" ++.\" Title: javap ++.\" Language: Japanese ++.\" Date: 2014ǯ8·î8Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 ++.TH "javap" "1" "2014ǯ8·î8Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff + .\" ----------------------------------------------------------------- +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + javap \- 1¤Ä°Ê¾å¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òµÕ¥¢¥»¥ó¥Ö¥ë¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjavap\fR [\fIoptions\fR] \fIclassfile\fR\&.\&.\&. ++\fBjavap\fR [\fIoptions\fR] \fIclassfile\fR\&.\&.\&. + .fi + .if n \{\ + .RE +@@ -64,21 +66,25 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclassfile\fR + .RS 4 +-Ãí¼á¤Î½èÍýÂоݤȤʤ롢¶õÇò¤Ç¶èÀڤä¿1¤Ä°Ê¾å¤Î¥¯¥é¥¹(DocFooter\&.class¤Ê¤É)¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Ç¸¡½Ð¤Ç¤­¤ë¥¯¥é¥¹¤ò¡¢¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤ÏURL(\fIfile:///home/user/myproject/src/DocFooter\&.class\fR¤Ê¤É)¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ ++Ãí¼á¤Î½èÍýÂоݤȤʤ롢¶õÇò¤Ç¶èÀڤä¿1¤Ä°Ê¾å¤Î¥¯¥é¥¹(DocFooter\&.class¤Ê¤É)¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Ç¸¡½Ð¤Ç¤­¤ë¥¯¥é¥¹¤ò¡¢¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤ÏURL(\fBfile:///home/user/myproject/src/DocFooter\&.class\fR¤Ê¤É)¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjavap\fR¥³¥Þ¥ó¥É¤Ï¡¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òµÕ¥¢¥»¥ó¥Ö¥ë¤·¤Þ¤¹¡£¤½¤Î½ÐÎϤϻØÄꤹ¤ë¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê°Û¤Ê¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fIjavap\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¡¢ÅϤµ¤ì¤¿¥¯¥é¥¹¤Îprotected¤ª¤è¤Ópublic¤Î¥Õ¥£¡¼¥ë¥É¤È¥á¥½¥Ã¥É¤ò½ÐÎϤ·¤Þ¤¹¡£\fIjavap\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î½ÐÎϤò\fIɸ½à½ÐÎÏ\fR¤Ëɽ¼¨¤·¤Þ¤¹¡£ ++\fBjavap\fR¥³¥Þ¥ó¥É¤Ï¡¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òµÕ¥¢¥»¥ó¥Ö¥ë¤·¤Þ¤¹¡£¤½¤Î½ÐÎϤϻØÄꤹ¤ë¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê°Û¤Ê¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fBjavap\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¡¢ÅϤµ¤ì¤¿¥¯¥é¥¹¤Îprotected¤ª¤è¤Ópublic¤Î¥Õ¥£¡¼¥ë¥É¤È¥á¥½¥Ã¥É¤ò½ÐÎϤ·¤Þ¤¹¡£\fBjavap\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î½ÐÎϤò\fBɸ½à½ÐÎÏ\fR¤Ëɽ¼¨¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\-help, \-\-help, \-? ++\-help ++.br ++\-\-help ++.br ++\-? + .RS 4 +-\fIjavap\fR¥³¥Þ¥ó¥É¤Ë¤Ä¤¤¤Æ¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjavap\fR¥³¥Þ¥ó¥É¤Ë¤Ä¤¤¤Æ¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-version +@@ -101,7 +107,9 @@ + protected¤ª¤è¤Ópublic¤Î¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤Î¤ß¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP +-\-private, \-p ++\-private ++.br ++\-p + .RS 4 + ¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE +@@ -114,8 +122,9 @@ + .RS 4 + .\} + .nf +-javap \-J\-version +-javap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName ++\fBjavap \-J\-version\fR ++\fBjavap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName\fR ++ + .fi + .if n \{\ + .RE +@@ -135,7 +144,7 @@ + .PP + \-constants + .RS 4 +-\fIstatic final\fRÄê¿ô¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBstatic final\fRÄê¿ô¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-c +@@ -150,135 +159,138 @@ + .PP + \-classpath \fIpath\fR + .RS 4 +-¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Ë\fIjavap\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Þ¤¿¤Ï\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤ÎÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ ++¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Ë\fBjavap\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Þ¤¿¤Ï\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤ÎÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ + .RE + .PP + \-bootclasspath \fIpath\fR + .RS 4 +-¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fIjre/lib/rt\&.jar\fR¤ª¤è¤Ó¾¤Î¤¤¤¯¤Ä¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¡¢¥³¥¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£ ++¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fBjre/lib/rt\&.jar\fR¤ª¤è¤Ó¾¤Î¤¤¤¯¤Ä¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¡¢¥³¥¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£ + .RE + .PP + \-extdir \fIdirs\fR + .RS 4 +-¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤¿³ÈÄ¥µ¡Ç½¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¤Î¥Ç¥Õ¥©¥ë¥È°ÌÃÖ¤Ï\fIjava\&.ext\&.dirs\fR¤Ç¤¹¡£ ++¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤¿³ÈÄ¥µ¡Ç½¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¤Î¥Ç¥Õ¥©¥ë¥È°ÌÃÖ¤Ï\fBjava\&.ext\&.dirs\fR¤Ç¤¹¡£ + .RE + .SH "Îã" + .PP +-¼¡¤Î\fIDocFooter\fR¥¯¥é¥¹¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¼¡¤Î\fBDocFooter\fR¥¯¥é¥¹¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-import java\&.awt\&.*; +-import java\&.applet\&.*; ++\fBimport java\&.awt\&.*;\fR ++\fBimport java\&.applet\&.*;\fR ++\fB \fR ++\fBpublic class DocFooter extends Applet {\fR ++\fB String date;\fR ++\fB String email;\fR ++\fB \fR ++\fB public void init() {\fR ++\fB resize(500,100);\fR ++\fB date = getParameter("LAST_UPDATED");\fR ++\fB email = getParameter("EMAIL");\fR ++\fB }\fR ++\fB \fR ++\fB public void paint(Graphics g) {\fR ++\fB g\&.drawString(date + " by ",100, 15);\fR ++\fB g\&.drawString(email,290,15);\fR ++\fB }\fR ++\fB}\fR + +-public class DocFooter extends Applet { +- String date; +- String email; +- +- public void init() { +- resize(500,100); +- date = getParameter("LAST_UPDATED"); +- email = getParameter("EMAIL"); +- } +- +- public void paint(Graphics g) { +- g\&.drawString(date + " by ",100, 15); +- g\&.drawString(email,290,15); +- } +-} + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjavap DocFooter\&.class\fR¥³¥Þ¥ó¥É¤«¤é¤Î½ÐÎϤϼ¡¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBjavap DocFooter\&.class\fR¥³¥Þ¥ó¥É¤«¤é¤Î½ÐÎϤϼ¡¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Compiled from "DocFooter\&.java" +-public class DocFooter extends java\&.applet\&.Applet { +- java\&.lang\&.String date; +- java\&.lang\&.String email; +- public DocFooter(); +- public void init(); +- public void paint(java\&.awt\&.Graphics); +-} ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++\fB public DocFooter();\fR ++\fB public void init();\fR ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjavap \-c DocFooter\&.class\fR¥³¥Þ¥ó¥É¤«¤é¤Î½ÐÎϤϼ¡¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBjavap \-c DocFooter\&.class\fR¥³¥Þ¥ó¥É¤«¤é¤Î½ÐÎϤϼ¡¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Compiled from "DocFooter\&.java" +-public class DocFooter extends java\&.applet\&.Applet { +- java\&.lang\&.String date; +- java\&.lang\&.String email; +- +- public DocFooter(); +- Code: +- 0: aload_0 +- 1: invokespecial #1 // Method +-java/applet/Applet\&."<init>":()V +- 4: return +- +- public void init(); +- Code: +- 0: aload_0 +- 1: sipush 500 +- 4: bipush 100 +- 6: invokevirtual #2 // Method resize:(II)V +- 9: aload_0 +- 10: aload_0 +- 11: ldc #3 // String LAST_UPDATED +- 13: invokevirtual #4 // Method +- getParameter:(Ljava/lang/String;)Ljava/lang/String; +- 16: putfield #5 // Field date:Ljava/lang/String; +- 19: aload_0 +- 20: aload_0 +- 21: ldc #6 // String EMAIL +- 23: invokevirtual #4 // Method +- getParameter:(Ljava/lang/String;)Ljava/lang/String; +- 26: putfield #7 // Field email:Ljava/lang/String; +- 29: return +- +- public void paint(java\&.awt\&.Graphics); +- Code: +- 0: aload_1 +- 1: new #8 // class java/lang/StringBuilder +- 4: dup +- 5: invokespecial #9 // Method +- java/lang/StringBuilder\&."<init>":()V +- 8: aload_0 +- 9: getfield #5 // Field date:Ljava/lang/String; +- 12: invokevirtual #10 // Method +- java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; +- 15: ldc #11 // String by +- 17: invokevirtual #10 // Method +- java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; +- 20: invokevirtual #12 // Method +- java/lang/StringBuilder\&.toString:()Ljava/lang/String; +- 23: bipush 100 +- 25: bipush 15 +- 27: invokevirtual #13 // Method +- java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V +- 30: aload_1 +- 31: aload_0 +- 32: getfield #7 // Field email:Ljava/lang/String; +- 35: sipush 290 +- 38: bipush 15 +- 40: invokevirtual #13 // Method +-java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V +- 43: return +-} ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++ ++\fB public DocFooter();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: invokespecial #1 // Method\fR ++\fBjava/applet/Applet\&."<init>":()V\fR ++\fB 4: return \fR ++ ++\fB public void init();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: sipush 500\fR ++\fB 4: bipush 100\fR ++\fB 6: invokevirtual #2 // Method resize:(II)V\fR ++\fB 9: aload_0 \fR ++\fB 10: aload_0 \fR ++\fB 11: ldc #3 // String LAST_UPDATED\fR ++\fB 13: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 16: putfield #5 // Field date:Ljava/lang/String;\fR ++\fB 19: aload_0 \fR ++\fB 20: aload_0 \fR ++\fB 21: ldc #6 // String EMAIL\fR ++\fB 23: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 26: putfield #7 // Field email:Ljava/lang/String;\fR ++\fB 29: return \fR ++ ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB Code:\fR ++\fB 0: aload_1 \fR ++\fB 1: new #8 // class java/lang/StringBuilder\fR ++\fB 4: dup \fR ++\fB 5: invokespecial #9 // Method\fR ++\fB java/lang/StringBuilder\&."<init>":()V\fR ++\fB 8: aload_0 \fR ++\fB 9: getfield #5 // Field date:Ljava/lang/String;\fR ++\fB 12: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 15: ldc #11 // String by \fR ++\fB 17: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 20: invokevirtual #12 // Method\fR ++\fB java/lang/StringBuilder\&.toString:()Ljava/lang/String;\fR ++\fB 23: bipush 100\fR ++\fB 25: bipush 15\fR ++\fB 27: invokevirtual #13 // Method\fR ++\fB java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 30: aload_1 \fR ++\fB 31: aload_0 \fR ++\fB 32: getfield #7 // Field email:Ljava/lang/String;\fR ++\fB 35: sipush 290\fR ++\fB 38: bipush 15\fR ++\fB 40: invokevirtual #13 // Method\fR ++\fBjava/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 43: return \fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -293,6 +305,17 @@ + .sp -1 + .IP \(bu 2.3 + .\} ++java(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javac(1) + .RE + .sp +@@ -304,7 +327,18 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-java(1) ++javadoc(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javah(1) + .RE + .sp + .RS 4 +@@ -326,18 +360,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-javah(1) +-.RE +-.sp +-.RS 4 +-.ie n \{\ +-\h'-04'\(bu\h'+03'\c +-.\} +-.el \{\ +-.sp -1 +-.IP \(bu 2.3 +-.\} +-javadoc(1) ++jdeps(1) + .RE + .br + 'pl 8.5i +--- ./jdk/src/linux/doc/man/ja/javaws.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/javaws.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: javaws +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java Web Start¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: javaws ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java Web Start¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "javaws" "1" "2013ǯ11·î21Æü" "JDK 8" "Java Web Start¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + javaws \- Java Web Start¤òµ¯Æ°¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjavaws\fR [ \fIrun\-options\fR ] \fIjnlp\fR ++\fBjavaws\fR [ \fIrun\-options\fR ] \fIjnlp\fR + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjavaws\fR [ \fIcontrol\-options\fR ] ++\fBjavaws\fR [ \fIcontrol\-options\fR ] + .fi + .if n \{\ + .RE +@@ -74,7 +76,7 @@ + .PP + \fIrun\-options\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó\fI¼Â¹Ô¥ª¥×¥·¥ç¥ó\fR¡£\fI¼Â¹Ô¥ª¥×¥·¥ç¥ó\fR¤ÏǤ°Õ¤Î½ç½ø¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£¼Â¹Ô¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô\fB¼Â¹Ô¥ª¥×¥·¥ç¥ó\fR¡£\fB¼Â¹Ô¥ª¥×¥·¥ç¥ó\fR¤ÏǤ°Õ¤Î½ç½ø¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£¼Â¹Ô¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIjnlp\fR +@@ -84,18 +86,18 @@ + .PP + \fIÀ©¸æ¥ª¥×¥·¥ç¥ó\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó\fIÀ©¸æ¥ª¥×¥·¥ç¥ó\fR¡£\fIÀ©¸æ¥ª¥×¥·¥ç¥ó\fR¤ÏǤ°Õ¤Î½ç½ø¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£À©¸æ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô\fBÀ©¸æ¥ª¥×¥·¥ç¥ó\fR¡£\fBÀ©¸æ¥ª¥×¥·¥ç¥ó\fR¤ÏǤ°Õ¤Î½ç½ø¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£À©¸æ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP + \fBÃí°Õ:\fR +-\fIjavaws\fR¥³¥Þ¥ó¥É¤Ï¡¢Oracle Solaris¤Ç¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++\fBjavaws\fR¥³¥Þ¥ó¥É¤Ï¡¢Oracle Solaris¤Ç¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ + .PP +-\fIjavaws\fR¥³¥Þ¥ó¥É¤Ï¡¢JNLP¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¼ÂÁõ¤Ç¤¢¤ëJava Web Start¤òµ¯Æ°¤·¤Þ¤¹¡£Java Web Start¤Ï¡¢¥Í¥Ã¥È¥ï¡¼¥¯¾å¤ÇÆ°ºî¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ª¤è¤Ó¥¢¥×¥ì¥Ã¥È¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBjavaws\fR¥³¥Þ¥ó¥É¤Ï¡¢JNLP¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¼ÂÁõ¤Ç¤¢¤ëJava Web Start¤òµ¯Æ°¤·¤Þ¤¹¡£Java Web Start¤Ï¡¢¥Í¥Ã¥È¥ï¡¼¥¯¾å¤ÇÆ°ºî¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ª¤è¤Ó¥¢¥×¥ì¥Ã¥È¤òµ¯Æ°¤·¤Þ¤¹¡£ + .PP +-JNLP¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤ë¤È¡¢\fIjavaws\fR¥³¥Þ¥ó¥É¤ÏJNLP¥Õ¥¡¥¤¥ë¤Ç»ØÄꤷ¤¿Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥¢¥×¥ì¥Ã¥È¤òµ¯Æ°¤·¤Þ¤¹¡£ ++JNLP¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤ë¤È¡¢\fBjavaws\fR¥³¥Þ¥ó¥É¤ÏJNLP¥Õ¥¡¥¤¥ë¤Ç»ØÄꤷ¤¿Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥¢¥×¥ì¥Ã¥È¤òµ¯Æ°¤·¤Þ¤¹¡£ + .PP +-\fIjavaws\fRµ¯Æ°¥Ä¡¼¥ë¤Ë¤Ï¡¢¸½ºß¤Î¥ê¥ê¡¼¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë1ÁȤΥª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤Ïºï½ü¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBjavaws\fRµ¯Æ°¥Ä¡¼¥ë¤Ë¤Ï¡¢¸½ºß¤Î¥ê¥ê¡¼¥¹¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë1ÁȤΥª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤Ïºï½ü¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .SH "¼Â¹Ô¥ª¥×¥·¥ç¥ó" + .PP + \-offline +@@ -110,14 +112,14 @@ + .PP + \-open \fIarguments\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢JNLP¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤¬\fI\-open\fR +-\fIarguments\fR¤ËÃÖ¤­´¹¤ï¤ê¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢JNLP¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤¬\fB\-open\fR ++\fBarguments\fR¤ËÃÖ¤­´¹¤ï¤ê¤Þ¤¹¡£ + .RE + .PP + \-print \fIarguments\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢JNLP¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤¬\fI\-print\fR +-\fIarguments\fR¤ËÃÖ¤­´¹¤ï¤ê¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢JNLP¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤¬\fB\-print\fR ++\fBarguments\fR¤ËÃÖ¤­´¹¤ï¤ê¤Þ¤¹¡£ + .RE + .PP + \-online +@@ -127,7 +129,7 @@ + .PP + \-wait + .RS 4 +-\fIjavaws\fR¥×¥í¥»¥¹¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬½ªÎ»¤¹¤ë¤Þ¤Ç½ªÎ»¤·¤Þ¤»¤ó¡£Windows¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÀâÌÀ¤·¤¿¤È¤ª¤ê¤Ëµ¡Ç½¤·¤Þ¤»¤ó¡£ ++\fBjavaws\fR¥×¥í¥»¥¹¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬½ªÎ»¤¹¤ë¤Þ¤Ç½ªÎ»¤·¤Þ¤»¤ó¡£Windows¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÀâÌÀ¤·¤¿¤È¤ª¤ê¤Ëµ¡Ç½¤·¤Þ¤»¤ó¡£ + .RE + .PP + \-verbose +@@ -137,7 +139,7 @@ + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ëoption¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ëoption¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-system +@@ -200,20 +202,20 @@ + \-shortcut + .RS 4 + ¥æ¡¼¥¶¡¼¤¬¥×¥í¥ó¥×¥È¤ò¼õ¤±Æþ¤ì¤ì¤Ð¥·¥ç¡¼¥È¥«¥Ã¥È¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ +-\fI\-silent\fR¥ª¥×¥·¥ç¥ó¤â»ÈÍѤ·¤Ê¤¤¤È¸ú²Ì¤¬¤¢¤ê¤Þ¤»¤ó¡£ ++\fB\-silent\fR¥ª¥×¥·¥ç¥ó¤â»ÈÍѤ·¤Ê¤¤¤È¸ú²Ì¤¬¤¢¤ê¤Þ¤»¤ó¡£ + .RE + .PP + \-association + .RS 4 + ¥æ¡¼¥¶¡¼¤¬¥×¥í¥ó¥×¥È¤ò¼õ¤±Æþ¤ì¤ì¤Ð¥¢¥½¥·¥¨¡¼¥·¥ç¥ó¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ +-\fI\-silent\fR¥ª¥×¥·¥ç¥ó¤â»ÈÍѤ·¤Ê¤¤¤È¸ú²Ì¤¬¤¢¤ê¤Þ¤»¤ó¡£ ++\fB\-silent\fR¥ª¥×¥·¥ç¥ó¤â»ÈÍѤ·¤Ê¤¤¤È¸ú²Ì¤¬¤¢¤ê¤Þ¤»¤ó¡£ + .RE + .PP +-\fBÃí°Õ:\fR\fIjavaws \-shortcut \-uninstall\fR ++\fBÃí°Õ:\fR\fBjavaws \-shortcut \-uninstall\fR + .SH "¥Õ¥¡¥¤¥ë" + .PP +-¥æ¡¼¥¶¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥­¥ã¥Ã¥·¥å¤Ê¤é¤Ó¤Ëdeployment\&.properties¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢¹½À®¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥×¥í¥Ñ¥Æ¥£¤Î¥Ç¥×¥í¥¤¥á¥ó¥È +-(http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/deployment/deployment\-guide/properties\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ ++¥æ¡¼¥¶¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥­¥ã¥Ã¥·¥å¤Ê¤é¤Ó¤Ëdeployment\&.properties¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢¥Ç¥×¥í¥¤¥á¥ó¥È¹½À®¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥×¥í¥Ñ¥Æ¥£ ++(http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jweb/jcp/properties\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/linux/doc/man/ja/jcmd.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jcmd.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jcmd +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jcmd ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jcmd" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jcmd \- ¼Â¹ÔÃæ¤ÎJava²¾ÁÛ¥Þ¥·¥ó(JVM)¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++jcmd \- ¼Â¹ÔÃæ¤ÎJava Virtual Machine (JVM)¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjcmd\fR [\fI\-l\fR|\fI\-h\fR|\fI\-help\fR] ++\fBjcmd\fR [\fB\-l\fR|\fB\-h\fR|\fB\-help\fR] + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjcmd\fR \fIpid\fR|\fImain\-class\fR \fIPerfCounter\&.print\fR ++\fBjcmd\fR \fIpid\fR|\fImain\-class\fR \fBPerfCounter\&.print\fR + .fi + .if n \{\ + .RE +@@ -76,7 +78,7 @@ + .RS 4 + .\} + .nf +-\fIjcmd\fR \fIpid\fR|\fImain\-class\fR \fI\-f\fR \fIfilename\fR ++\fBjcmd\fR \fIpid\fR|\fImain\-class\fR \fB\-f\fR \fIfilename\fR + .fi + .if n \{\ + .RE +@@ -86,21 +88,21 @@ + .RS 4 + .\} + .nf +-\fIjcmd\fR \fIpid\fR|\fImain\-class\fR \fIcommand\fR[ \fIarguments\fR] ++\fBjcmd\fR \fIpid\fR|\fImain\-class\fR \fIcommand\fR[ \fIarguments\fR] + .fi + .if n \{\ + .RE + .\} + .SH "ÀâÌÀ" + .PP +-\fIjcmd\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¢JVM¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤ì¤ÏJVM¤¬²ÔƯ¤·¤Æ¤¤¤ë¤Î¤ÈƱ¤¸¥Þ¥·¥ó¤Ç»ÈÍѤ·¡¢JVM¤Îµ¯Æ°¤Ë»ÈÍѤ·¤¿¤â¤Î¤ÈƱ¤¸Í­¸ú¥æ¡¼¥¶¡¼¤ª¤è¤Ó¥°¥ë¡¼¥×¼±Ê̻Ҥò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBjcmd\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¢JVM¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤ì¤ÏJVM¤¬²ÔƯ¤·¤Æ¤¤¤ë¤Î¤ÈƱ¤¸¥Þ¥·¥ó¤Ç»ÈÍѤ·¡¢JVM¤Îµ¯Æ°¤Ë»ÈÍѤ·¤¿¤â¤Î¤ÈƱ¤¸Í­¸ú¥æ¡¼¥¶¡¼¤ª¤è¤Ó¥°¥ë¡¼¥×¼±Ê̻Ҥò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¥ê¥â¡¼¥È¡¦¥Þ¥·¥ó¤«¤é¡¢¤Þ¤¿¤ÏÊ̤μ±Ê̻ҤǿÇÃÇ¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢\fIcom\&.sun\&.management\&.DiagnosticCommandMBean\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ÈÍѤǤ­¤Þ¤¹¡£\fIDiagnosticCommandMBean\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ÜºÙ¤Ï¡¢http://download\&.java\&.net/jdk8/docs/jre/api/management/extension/com/sun/management/DiagnosticCommandMBean\&.html¤Ë¤¢¤ëAPI¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ê¥â¡¼¥È¡¦¥Þ¥·¥ó¤«¤é¡¢¤Þ¤¿¤ÏÊ̤μ±Ê̻ҤǿÇÃÇ¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢\fBcom\&.sun\&.management\&.DiagnosticCommandMBean\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ÈÍѤǤ­¤Þ¤¹¡£\fBDiagnosticCommandMBean\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/jre/api/management/extension/com/sun/management/DiagnosticCommandMBean\&.html¤Ë¤¢¤ëAPI¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIjcmd\fR¤ò°ú¿ô¤Ê¤·¤Þ¤¿¤Ï\fI\- l\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¼Â¹Ô¤·¤¿¾ì¹ç¤Ï¡¢¼Â¹ÔÃæ¤ÎJava¥×¥í¥»¥¹¼±Ê̻ҤΥꥹ¥È¤¬¡¢¥á¥¤¥ó¡¦¥¯¥é¥¹¤ª¤è¤Ó¥×¥í¥»¥¹¤Îµ¯Æ°¤Ë»ÈÍѤµ¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤È¤È¤â¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-h\fR¤Þ¤¿¤Ï\fI\-help\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ\fIjcmd\fR¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ä¡¼¥ë¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fBjcmd\fR¤ò°ú¿ô¤Ê¤·¤Þ¤¿¤Ï\fB\- l\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¼Â¹Ô¤·¤¿¾ì¹ç¤Ï¡¢¼Â¹ÔÃæ¤ÎJava¥×¥í¥»¥¹¼±Ê̻ҤΥꥹ¥È¤¬¡¢¥á¥¤¥ó¡¦¥¯¥é¥¹¤ª¤è¤Ó¥×¥í¥»¥¹¤Îµ¯Æ°¤Ë»ÈÍѤµ¤ì¤¿¥³¥Þ¥ó¥É¹Ô°ú¿ô¤È¤È¤â¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-h\fR¤Þ¤¿¤Ï\fB\-help\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ\fBjcmd\fR¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ä¡¼¥ë¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .PP +-¥×¥í¥»¥¹¼±ÊÌ»Ò(\fIpid\fR)¤Þ¤¿¤Ï¥á¥¤¥ó¡¦¥¯¥é¥¹(\fImain\-class\fR)¤òºÇ½é¤Î°ú¿ô¤È¤·¤Æ»ØÄꤷ¤¿¾ì¹ç¡¢\fIjcmd\fR¤Ï¡¢¼±Ê̻Ҥò»ØÄꤷ¤¿¾ì¹ç¤ÏJava¥×¥í¥»¥¹¤Ë¡¢¥á¥¤¥ó¡¦¥¯¥é¥¹¤Î̾Á°¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¤¹¤Ù¤Æ¤ÎJava¥×¥í¥»¥¹¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤¹¡£¥×¥í¥»¥¹¼±Ê̻ҤȤ·¤Æ\fI0\fR¤ò»ØÄꤷ¤Æ¡¢¤¹¤Ù¤Æ¤Î»ÈÍѲÄǽ¤ÊJava¥×¥í¥»¥¹¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤È¤·¤Æ¡¢¼¡¤Î¤¤¤º¤ì¤«¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥×¥í¥»¥¹¼±ÊÌ»Ò(\fIpid\fR)¤Þ¤¿¤Ï¥á¥¤¥ó¡¦¥¯¥é¥¹(\fImain\-class\fR)¤òºÇ½é¤Î°ú¿ô¤È¤·¤Æ»ØÄꤷ¤¿¾ì¹ç¡¢\fBjcmd\fR¤Ï¡¢¼±Ê̻Ҥò»ØÄꤷ¤¿¾ì¹ç¤ÏJava¥×¥í¥»¥¹¤Ë¡¢¥á¥¤¥ó¡¦¥¯¥é¥¹¤Î̾Á°¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¤¹¤Ù¤Æ¤ÎJava¥×¥í¥»¥¹¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤¹¡£¥×¥í¥»¥¹¼±Ê̻ҤȤ·¤Æ\fB0\fR¤ò»ØÄꤷ¤Æ¡¢¤¹¤Ù¤Æ¤Î»ÈÍѲÄǽ¤ÊJava¥×¥í¥»¥¹¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤È¤·¤Æ¡¢¼¡¤Î¤¤¤º¤ì¤«¤ò»ÈÍѤ·¤Þ¤¹¡£ + .PP + Perfcounter\&.print + .RS 4 +@@ -109,15 +111,15 @@ + .PP + \-f \fIfilename\fR + .RS 4 +-¿ÇÃÇ¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¡¢»ØÄꤷ¤¿Java¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¡£\fI\-f\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î¤ß»ÈÍѤ·¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥³¥Þ¥ó¥É¤Ï¡¢1¹Ô¤Çµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Èֹ浭¹æ(\fI#\fR)¤Ç»Ï¤Þ¤ë¹Ô¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤«¡¢\fIstop\fR¥­¡¼¥ï¡¼¥É¤ò´Þ¤à¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Î½èÍý¤¬½ªÎ»¤·¤Þ¤¹¡£ ++¿ÇÃÇ¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¡¢»ØÄꤷ¤¿Java¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¡£\fB\-f\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î¤ß»ÈÍѤ·¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥³¥Þ¥ó¥É¤Ï¡¢1¹Ô¤Çµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Èֹ浭¹æ(\fB#\fR)¤Ç»Ï¤Þ¤ë¹Ô¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤«¡¢\fBstop\fR¥­¡¼¥ï¡¼¥É¤ò´Þ¤à¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Î½èÍý¤¬½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP + \fIcommand\fR [\fIarguments\fR] + .RS 4 +-»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¥³¥Þ¥ó¥É¡£»ØÄꤷ¤¿¥×¥í¥»¥¹¤Ç»ÈÍѤǤ­¤ë¿ÇÃÇ¥³¥Þ¥ó¥É¤Î¥ê¥¹¥È¤Ï¡¢¤³¤Î¥×¥í¥»¥¹¤ËÂФ·¤Æ\fIhelp\fR¥³¥Þ¥ó¥É¤òÁ÷¿®¤¹¤ì¤Ðɽ¼¨¤µ¤ì¤Þ¤¹¡£³Æ¿ÇÃÇ¥³¥Þ¥ó¥É¤ËÆȼ«¤Î°ú¿ô¥»¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¤ÎÀâÌÀ¡¢¹½Ê¸¤ª¤è¤Ó»ÈÍѲÄǽ¤Ê°ú¿ô¤Î¥ê¥¹¥È¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢\fIhelp\fR¥³¥Þ¥ó¥É¤Î°ú¿ô¤È¤·¤Æ¥³¥Þ¥ó¥É̾¤ò»ÈÍѤ·¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¥³¥Þ¥ó¥É¡£»ØÄꤷ¤¿¥×¥í¥»¥¹¤Ç»ÈÍѤǤ­¤ë¿ÇÃÇ¥³¥Þ¥ó¥É¤Î¥ê¥¹¥È¤Ï¡¢¤³¤Î¥×¥í¥»¥¹¤ËÂФ·¤Æ\fBhelp\fR¥³¥Þ¥ó¥É¤òÁ÷¿®¤¹¤ì¤Ðɽ¼¨¤µ¤ì¤Þ¤¹¡£³Æ¿ÇÃÇ¥³¥Þ¥ó¥É¤ËÆȼ«¤Î°ú¿ô¥»¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¤ÎÀâÌÀ¡¢¹½Ê¸¤ª¤è¤Ó»ÈÍѲÄǽ¤Ê°ú¿ô¤Î¥ê¥¹¥È¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢\fBhelp\fR¥³¥Þ¥ó¥É¤Î°ú¿ô¤È¤·¤Æ¥³¥Þ¥ó¥É̾¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR +-°ú¿ô¤Ë¥¹¥Ú¡¼¥¹¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°ì½Å°úÍÑÉä¤Þ¤¿¤ÏÆó½Å°úÍÑÉä(\fI\*(Aq\fR¤Þ¤¿¤Ï\fI"\fR)¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£²Ã¤¨¤Æ¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥·¥§¥ë¤¬°úÍÑÉä¤ò½èÍý¤·¤Ê¤¤¤è¤¦¤Ë¡¢¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\fI\e\fR)¤Ç°ì½Å°úÍÑÉä¤Þ¤¿¤ÏÆó½Å°úÍÑÉä¤ò¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¤³¤ì¤é¤Î°ú¿ô¤ò°ì½Å°úÍÑÉä¤Ç°Ï¤ó¤Ç¤«¤é¡¢Æó½Å°úÍÑÉä¤Ç°Ï¤à¤³¤È¤â¤Ç¤­¤Þ¤¹(¤Þ¤¿¤ÏÆó½Å°úÍÑÉä¤Ç°Ï¤ó¤Ç¤«¤é¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤à)¡£ ++°ú¿ô¤Ë¥¹¥Ú¡¼¥¹¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°ì½Å°úÍÑÉä¤Þ¤¿¤ÏÆó½Å°úÍÑÉä(\fB\*(Aq\fR¤Þ¤¿¤Ï\fB"\fR)¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£²Ã¤¨¤Æ¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥·¥§¥ë¤¬°úÍÑÉä¤ò½èÍý¤·¤Ê¤¤¤è¤¦¤Ë¡¢¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\fB\e\fR)¤Ç°ì½Å°úÍÑÉä¤Þ¤¿¤ÏÆó½Å°úÍÑÉä¤ò¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¤³¤ì¤é¤Î°ú¿ô¤ò°ì½Å°úÍÑÉä¤Ç°Ï¤ó¤Ç¤«¤é¡¢Æó½Å°úÍÑÉä¤Ç°Ï¤à¤³¤È¤â¤Ç¤­¤Þ¤¹(¤Þ¤¿¤ÏÆó½Å°úÍÑÉä¤Ç°Ï¤ó¤Ç¤«¤é¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤à)¡£ + .RE + .SH "¥ª¥×¥·¥ç¥ó" + .PP +@@ -125,17 +127,19 @@ + .PP + \-f \fIfilename\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤«¤é¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ºÇ½é¤Î°ú¿ô¤È¤·¤Æ¥×¥í¥»¥¹¼±Ê̻Ҥޤ¿¤Ï¥á¥¤¥ó¡¦¥¯¥é¥¹¤ò»ØÄꤹ¤ë¾ì¹ç¤Ë¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥³¥Þ¥ó¥É¤Ï¡¢1¹Ô¤Çµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Èֹ浭¹æ(\fI#\fR)¤Ç»Ï¤Þ¤ë¹Ô¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤«¡¢\fIstop\fR¥­¡¼¥ï¡¼¥É¤ò´Þ¤à¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Î½èÍý¤¬½ªÎ»¤·¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤«¤é¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ºÇ½é¤Î°ú¿ô¤È¤·¤Æ¥×¥í¥»¥¹¼±Ê̻Ҥޤ¿¤Ï¥á¥¤¥ó¡¦¥¯¥é¥¹¤ò»ØÄꤹ¤ë¾ì¹ç¤Ë¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥³¥Þ¥ó¥É¤Ï¡¢1¹Ô¤Çµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Èֹ浭¹æ(\fB#\fR)¤Ç»Ï¤Þ¤ë¹Ô¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤«¡¢\fBstop\fR¥­¡¼¥ï¡¼¥É¤ò´Þ¤à¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Î½èÍý¤¬½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP +-\-h, \-help ++\-h ++.br ++\-help + .RS 4 + ¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \-l + .RS 4 +-¼Â¹ÔÃæ¤ÎJava¥×¥í¥»¥¹¼±Ê̻ҤΥꥹ¥È¤ò¥á¥¤¥ó¡¦¥¯¥é¥¹¤ª¤è¤Ó¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£ ++¼Â¹ÔÃæ¤ÎJava¥×¥í¥»¥¹¼±Ê̻ҤΥꥹ¥È¤ò¥á¥¤¥ó¡¦¥¯¥é¥¹¤ª¤è¤Ó¥³¥Þ¥ó¥É¹Ô°ú¿ô¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/jconsole.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jconsole.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jconsole +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jconsole ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jconsole" "1" "2013ǯ11·î21Æü" "JDK 8" "Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jconsole \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò´Æ»ë¤ª¤è¤Ó´ÉÍý¤¹¤ë¤¿¤á¤Î¥°¥é¥Õ¥£¥«¥ë¡¦¥³¥ó¥½¡¼¥ë¤ò³«»Ï¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++jconsole \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥â¥Ë¥¿¡¼¤ª¤è¤Ó´ÉÍý¤¹¤ë¤¿¤á¤Î¥°¥é¥Õ¥£¥«¥ë¡¦¥³¥ó¥½¡¼¥ë¤ò³«»Ï¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjconsole\fR [ \fIoptions\fR ] [ connection \&.\&.\&. ] ++\fBjconsole\fR [ \fIoptions\fR ] [ connection \&.\&.\&. ] + .fi + .if n \{\ + .RE +@@ -64,24 +66,24 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + connection = \fIpid\fR | \fIhost\fR:\fIport\fR | \fIjmxURL\fR + .RS 4 +-\fIpid\fRÃÍ¤Ï¥í¡¼¥«¥ë¤ÎJava²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î¥×¥í¥»¥¹ID¤Ç¤¹¡£JVM¤Ï\fIjconsole\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¥æ¡¼¥¶¡¼ID¤ÈƱ¤¸¥æ¡¼¥¶¡¼ID¤Ç¼Â¹Ô¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIhost:port\fRÃͤÏJVM¤¬Æ°ºî¤·¤Æ¤¤¤ë¥Û¥¹¥È¡¦¥·¥¹¥Æ¥à¤Î̾Á°¤È¡¢JVM¤¬³«»Ï¤·¤¿¤È¤­¤Ë¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£\fIcom\&.sun\&.management\&.jmxremote\&.port\fR¤Ç»ØÄꤷ¤¿¥Ý¡¼¥ÈÈÖ¹æ¤Ç¤¹¡£\fIjmxUrl\fRÃͤϡ¢JMXServiceURL¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¡¢Àܳ¤µ¤ì¤ëJMX¥¨¡¼¥¸¥§¥ó¥È¤Î¥¢¥É¥ì¥¹¤Ç¤¹¡£ ++\fBpid\fRÃÍ¤Ï¥í¡¼¥«¥ë¤ÎJava Virtual Machine (JVM)¤Î¥×¥í¥»¥¹ID¤Ç¤¹¡£JVM¤Ï\fBjconsole\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¥æ¡¼¥¶¡¼ID¤ÈƱ¤¸¥æ¡¼¥¶¡¼ID¤Ç¼Â¹Ô¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBhost:port\fRÃͤÏJVM¤¬Æ°ºî¤·¤Æ¤¤¤ë¥Û¥¹¥È¡¦¥·¥¹¥Æ¥à¤Î̾Á°¤È¡¢JVM¤¬³«»Ï¤·¤¿¤È¤­¤Ë¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£\fBcom\&.sun\&.management\&.jmxremote\&.port\fR¤Ç»ØÄꤷ¤¿¥Ý¡¼¥ÈÈÖ¹æ¤Ç¤¹¡£\fBjmxUrl\fRÃͤϡ¢JMXServiceURL¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¡¢Àܳ¤µ¤ì¤ëJMX¥¨¡¼¥¸¥§¥ó¥È¤Î¥¢¥É¥ì¥¹¤Ç¤¹¡£ + .sp +-\fIconnection\fR¥Ñ¥é¥á¡¼¥¿¤Î¾ÜºÙ¤Ï¡¢JMX¥Æ¥¯¥Î¥í¥¸¤ò»ÈÍѤ·¤¿¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý ++\fBconnection\fR¥Ñ¥é¥á¡¼¥¿¤Î¾ÜºÙ¤Ï¡¢JMX¥Æ¥¯¥Î¥í¥¸¤ò»ÈÍѤ·¤¿¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/management/agent\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fIJMXServiceURL\fR¥¯¥é¥¹¤ÎÀâÌÀ( ++\fBJMXServiceURL\fR¥¯¥é¥¹¤ÎÀâÌÀ( + http://docs\&.oracle\&.com/javase/8/docs/api/javax/management/remote/JMXServiceURL\&.html)¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjconsole\fR¥³¥Þ¥ó¥É¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Þ¥·¥ó¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Þ¥·¥ó¾å¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤È²¾ÁÛ¥Þ¥·¥ó¤Î´Æ»ë¤È´ÉÍý¤ò¹Ô¤¦¥°¥é¥Õ¥£¥«¥ë¡¦¥³¥ó¥½¡¼¥ë¡¦¥Ä¡¼¥ë¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBjconsole\fR¥³¥Þ¥ó¥É¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Þ¥·¥ó¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Þ¥·¥ó¾å¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤È²¾ÁÛ¥Þ¥·¥ó¤ò¥â¥Ë¥¿¡¼¤ª¤è¤Ó´ÉÍý¤¹¤ë¥°¥é¥Õ¥£¥«¥ë¡¦¥³¥ó¥½¡¼¥ë¡¦¥Ä¡¼¥ë¤òµ¯Æ°¤·¤Þ¤¹¡£ + .PP +-Windows¾å¤Ç¤Ï¡¢\fIjconsole\fR¥³¥Þ¥ó¥É¤Ï¥³¥ó¥½¡¼¥ë¡¦¥¦¥£¥ó¥É¥¦¤È´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤¿¤À¤·¡¢\fIjconsole\fR¥³¥Þ¥ó¥É¤¬¼ºÇÔ¤¹¤ë¤È¡¢¥¨¥é¡¼¾ðÊó¤ò¼¨¤¹¥À¥¤¥¢¥í¥°¡¦¥Ü¥Ã¥¯¥¹¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++Windows¾å¤Ç¤Ï¡¢\fBjconsole\fR¥³¥Þ¥ó¥É¤Ï¥³¥ó¥½¡¼¥ë¡¦¥¦¥£¥ó¥É¥¦¤È´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤¿¤À¤·¡¢\fBjconsole\fR¥³¥Þ¥ó¥É¤¬¼ºÇÔ¤¹¤ë¤È¡¢¥¨¥é¡¼¾ðÊó¤ò¼¨¤¹¥À¥¤¥¢¥í¥°¡¦¥Ü¥Ã¥¯¥¹¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-interval\fI=n\fR +@@ -91,12 +93,12 @@ + .PP + \-notile + .RS 4 +-ºÇ½é¤Ë¥¦¥£¥ó¥É¥¦¤ò¥¿¥¤¥ê¥ó¥°¤·¤Þ¤»¤ó(Ê£¿ôÀܳ¤Î¾ì¹ç)¡£ ++ºÇ½é¤Ï¥¦¥£¥ó¥É¥¦¤ò¥¿¥¤¥ëɽ¼¨¤·¤Þ¤»¤ó(Ê£¿ôÀܳ¤Î¾ì¹ç)¡£ + .RE + .PP + \-pluginpath \fIplugins\fR + .RS 4 +-\fIJConsole\fR¥×¥é¥°¥¤¥ó¤ò¸¡º÷¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fIplugins\fR¥Ñ¥¹¤Ë¤Ï\fIMETA\-INF/services/com\&.sun\&.tools\&.jconsole\&.JConsolePlugin\fR¤È¤¤¤¦Ì¾Á°¤Î¥×¥í¥Ð¥¤¥À¹½À®¥Õ¥¡¥¤¥ë¤ò´Þ¤ó¤Ç¤¤¤ëɬÍפ¬¤¢¤ê¡¢¤³¤ì¤Ë¤Ï¥×¥é¥°¥¤¥ó¤´¤È¤Ë1¹Ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤Î¹Ô¤Ï\fIcom\&.sun\&.tools\&.jconsole\&.JConsolePlugin\fR¥¯¥é¥¹¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Î´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBJConsole\fR¥×¥é¥°¥¤¥ó¤ò¸¡º÷¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fIplugins\fR¥Ñ¥¹¤Ë¤Ï\fBMETA\-INF/services/com\&.sun\&.tools\&.jconsole\&.JConsolePlugin\fR¤È¤¤¤¦Ì¾Á°¤Î¥×¥í¥Ð¥¤¥À¹½À®¥Õ¥¡¥¤¥ë¤ò´Þ¤ó¤Ç¤¤¤ëɬÍפ¬¤¢¤ê¡¢¤³¤ì¤Ë¤Ï¥×¥é¥°¥¤¥ó¤´¤È¤Ë1¹Ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤Î¹Ô¤Ï\fBcom\&.sun\&.tools\&.jconsole\&.JConsolePlugin\fR¥¯¥é¥¹¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Î´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-version +@@ -111,7 +113,7 @@ + .PP + \-J\fIflag\fR + .RS 4 +-\fIjconsole\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿JVM¤Ë\fIflag\fR¤òÅϤ·¤Þ¤¹¡£ ++\fBjconsole\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿JVM¤Ë\fBflag\fR¤òÅϤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +@@ -148,7 +150,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIJMXServiceURL\fR¥¯¥é¥¹¤ÎÀâÌÀ( ++\fBJMXServiceURL\fR¥¯¥é¥¹¤ÎÀâÌÀ( + http://docs\&.oracle\&.com/javase/8/docs/api/javax/management/remote/JMXServiceURL\&.html) + .RE + .br +--- ./jdk/src/linux/doc/man/ja/jdb.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jdb.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jdb +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jdb ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jdb" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jdb \- Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥×¥í¥°¥é¥à¤ÎÉÔ¶ñ¹ç¤ò¸¡½Ð¤ª¤è¤Ó½¤Àµ¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++jdb \- Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥×¥í¥°¥é¥à¤Îbug¤ò¸¡½Ð¤ª¤è¤Ó½¤Àµ¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjdb\fR [\fIoptions\fR] [\fIclassname\fR] [\fIarguments\fR] ++\fBjdb\fR [\fIoptions\fR] [\fIclassname\fR] [\fIarguments\fR] + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclass\fRname +@@ -74,67 +76,70 @@ + .PP + \fIarguments\fR + .RS 4 +-class¤Î\fImain()\fR¥á¥½¥Ã¥É¤ËÅϤ¹°ú¿ô¡£ ++class¤Î\fBmain()\fR¥á¥½¥Ã¥É¤ËÅϤ¹°ú¿ô¡£ + .RE + .SH "ÀâÌÀ" + .PP +-Java¥Ç¥Ð¥Ã¥¬(JDB)¤Ï¡¢Java¥¯¥é¥¹ÍѤδÊñ¤Ê¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ç¥Ð¥Ã¥¬¤Ç¤¹¡£\fIjdb\fR¥³¥Þ¥ó¥É¤È¤½¤Î¥ª¥×¥·¥ç¥ó¤ÏJDB¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢JDBA (Java Platform Debugger Architecture)¤ò»ë³ÐŪ¤Ë¼Â¹Ô¤·¡¢¥í¡¼¥«¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¤ÎJava²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î¸¡ºº¤È¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£Java Platform Debugger Architecture (JDBA) ++Java¥Ç¥Ð¥Ã¥¬(JDB)¤Ï¡¢Java¥¯¥é¥¹ÍѤδÊñ¤Ê¥³¥Þ¥ó¥É¹Ô¥Ç¥Ð¥Ã¥¬¤Ç¤¹¡£\fBjdb\fR¥³¥Þ¥ó¥É¤È¤½¤Î¥ª¥×¥·¥ç¥ó¤ÏJDB¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢JDBA (Java Platform Debugger Architecture)¤ò»ë³ÐŪ¤Ë¼Â¹Ô¤·¡¢¥í¡¼¥«¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¤ÎJava Virtual Machine (JVM)¤Î¸¡ºº¤È¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£Java Platform Debugger Architecture (JDBA) + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jpda/index\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "JDB¥»¥Ã¥·¥ç¥ó¤Î³«»Ï" + .PP +-JDB¥»¥Ã¥·¥ç¥ó¤ò³«»Ï¤¹¤ë¤Ë¤ÏÍÍ¡¹¤ÊÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ºÇ¤âÉÑÈˤ˻ÈÍѤµ¤ì¤ë¤Î¤Ï¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥¤¥ó¡¦¥¯¥é¥¹¤ò»ÈÍѤ·¤Æ¡¢JDB¤«¤é¿·¤·¤¤JVM¤òµ¯Æ°¤¹¤ëÊýË¡¤Ç¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¡¢\fIjava\fR¥³¥Þ¥ó¥É¤Î¤«¤ï¤ê¤Ë\fIjdb\fR¥³¥Þ¥ó¥É¤òÆþÎϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥¤¥ó¡¦¥¯¥é¥¹¤¬\fIMyClass\fR¤Î¾ì¹ç¤Ï¡¢JDB´Ä¶­¤Ç¥Ç¥Ð¥Ã¥°¤¹¤ë¤È¤­¤Ë¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++JDB¥»¥Ã¥·¥ç¥ó¤ò³«»Ï¤¹¤ë¤Ë¤ÏÍÍ¡¹¤ÊÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ºÇ¤âÉÑÈˤ˻ÈÍѤµ¤ì¤ë¤Î¤Ï¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥¤¥ó¡¦¥¯¥é¥¹¤ò»ÈÍѤ·¤Æ¡¢JDB¤«¤é¿·¤·¤¤JVM¤òµ¯Æ°¤¹¤ëÊýË¡¤Ç¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¡¢\fBjava\fR¥³¥Þ¥ó¥É¤Î¤«¤ï¤ê¤Ë\fBjdb\fR¥³¥Þ¥ó¥É¤òÆþÎϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥¤¥ó¡¦¥¯¥é¥¹¤¬\fBMyClass\fR¤Î¾ì¹ç¤Ï¡¢JDB´Ä¶­¤Ç¥Ç¥Ð¥Ã¥°¤¹¤ë¤È¤­¤Ë¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jdb MyClass ++\fBjdb MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÊýË¡¤Çµ¯Æ°¤¹¤ë¤È¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ2¤ÄÌܤÎJVM¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¼¡¤Ë¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤ò¥í¡¼¥É¤·¤Æ¡¢¥¯¥é¥¹¤ÎºÇ½é¤ÎÌ¿Îá¤ò¼Â¹Ô¤¹¤ëÁ°¤ËJVM¤òÄä»ß¤µ¤»¤Þ¤¹¡£ ++¤³¤ÎÊýË¡¤Çµ¯Æ°¤¹¤ë¤È¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ2¤ÄÌܤÎJVM¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¼¡¤Ë¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤ò¥í¡¼¥É¤·¤Æ¡¢¥¯¥é¥¹¤ÎºÇ½é¤ÎÌ¿Îá¤ò¼Â¹Ô¤¹¤ëÁ°¤ËJVM¤òÄä»ß¤µ¤»¤Þ¤¹¡£ + .PP +-\fIjdb\fR¥³¥Þ¥ó¥É¤Î¤â¤¦1¤Ä¤Î»ÈÍÑÊýË¡¤Ï¡¢¤¹¤Ç¤Ë¼Â¹ÔÃæ¤ÎJVM¤Ëjdb¤òÀܳ¤¹¤ë¤³¤È¤Ç¤¹¡£\fIjdb\fR¥³¥Þ¥ó¥É¤¬Àܳ¤¹¤ëVM¤ò¡¢¤½¤Î¼Â¹ÔÃæ¤Ëµ¯Æ°¤¹¤ë¤¿¤á¤Î¹½Ê¸¤ò¼¡¤Ë¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥¤¥ó¥×¥í¥»¥¹¡¦¥Ç¥Ð¥Ã¥°Íѥ饤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¡¢Àܳ¤Î¼ïÎà¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBjdb\fR¥³¥Þ¥ó¥É¤Î¤â¤¦1¤Ä¤Î»ÈÍÑÊýË¡¤Ï¡¢¤¹¤Ç¤Ë¼Â¹ÔÃæ¤ÎJVM¤Ëjdb¤òÀܳ¤¹¤ë¤³¤È¤Ç¤¹¡£\fBjdb\fR¥³¥Þ¥ó¥É¤¬Àܳ¤¹¤ëVM¤ò¡¢¤½¤Î¼Â¹ÔÃæ¤Ëµ¯Æ°¤¹¤ë¤¿¤á¤Î¹½Ê¸¤ò¼¡¤Ë¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥¤¥ó¥×¥í¥»¥¹¡¦¥Ç¥Ð¥Ã¥°Íѥ饤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¡¢Àܳ¤Î¼ïÎà¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-agentlib:jdwp=transport=dt_socket,server=y,suspend=n MyClass ++\fBjava \-agentlib:jdwp=transport=dt_socket,server=y,suspend=n MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤òJVM¤ËÀܳ¤Ç¤­¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤òJVM¤ËÀܳ¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jdb \-attach 8000 ++\fBjdb \-attach 8000\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤Î¾ì¹ç¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¿·¤·¤¤JVM¤òµ¯Æ°¤¹¤ë¤«¤ï¤ê¤Ë´û¸¤ÎJVM¤ËÀܳ¤µ¤ì¤ë¤¿¤á¡¢\fIjdb\fR¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë\fIMyClass\fR°ú¿ô¤Ï»ØÄꤷ¤Þ¤»¤ó¡£ ++¤³¤Î¾ì¹ç¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¿·¤·¤¤JVM¤òµ¯Æ°¤¹¤ë¤«¤ï¤ê¤Ë´û¸¤ÎJVM¤ËÀܳ¤µ¤ì¤ë¤¿¤á¡¢\fBjdb\fR¥³¥Þ¥ó¥É¹Ô¤Ë\fBMyClass\fR°ú¿ô¤Ï»ØÄꤷ¤Þ¤»¤ó¡£ + .PP +-¥Ç¥Ð¥Ã¥¬¤òJVM¤ËÀܳ¤¹¤ë¤Ë¤Ï¾¤Ë¤âÍÍ¡¹¤ÊÊýË¡¤¬¤¢¤ê¡¢¤¹¤Ù¤Æ\fIjdb\fR¥³¥Þ¥ó¥É¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Àܳ¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢Java Platform Debugger Architecture¤Î¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ç¥Ð¥Ã¥¬¤òJVM¤ËÀܳ¤¹¤ë¤Ë¤Ï¾¤Ë¤âÍÍ¡¹¤ÊÊýË¡¤¬¤¢¤ê¡¢¤¹¤Ù¤Æ\fBjdb\fR¥³¥Þ¥ó¥É¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Àܳ¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢Java Platform Debugger Architecture¤Î¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "´ðËÜjdb¥³¥Þ¥ó¥É" + .PP +-´ðËÜŪ¤Ê\fIjdb\fR¥³¥Þ¥ó¥É¤Î°ìÍ÷¤ò¼¨¤·¤Þ¤¹¡£JDB¤¬¥µ¥Ý¡¼¥È¤¹¤ë¥³¥Þ¥ó¥É¤Ï¤³¤ì°Ê³°¤Ë¤â¤¢¤ê¡¢¤½¤ì¤é¤Ï\fI\-help\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æɽ¼¨¤Ç¤­¤Þ¤¹¡£ ++´ðËÜŪ¤Ê\fBjdb\fR¥³¥Þ¥ó¥É¤Î°ìÍ÷¤ò¼¨¤·¤Þ¤¹¡£JDB¤¬¥µ¥Ý¡¼¥È¤¹¤ë¥³¥Þ¥ó¥É¤Ï¤³¤ì°Ê³°¤Ë¤â¤¢¤ê¡¢¤½¤ì¤é¤Ï\fB\-help\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æɽ¼¨¤Ç¤­¤Þ¤¹¡£ + .PP + help¤Þ¤¿¤Ï? + .RS 4 +-\fIhelp\fR¤Þ¤¿¤Ï\fI?\fR¥³¥Þ¥ó¥É¤Ï¡¢Ç§¼±¤µ¤ì¤¿¥³¥Þ¥ó¥É¤Î¥ê¥¹¥È¤Ë´Ê·é¤ÊÀâÌÀ¤òÉÕ¤±¤Æɽ¼¨¤·¤Þ¤¹¡£ ++\fBhelp\fR¤Þ¤¿¤Ï\fB?\fR¥³¥Þ¥ó¥É¤Ï¡¢Ç§¼±¤µ¤ì¤¿¥³¥Þ¥ó¥É¤Î¥ê¥¹¥È¤Ë´Ê·é¤ÊÀâÌÀ¤òÉÕ¤±¤Æɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + run + .RS 4 +-JDB¤òµ¯Æ°¤·¤Æ¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤¿¤¢¤È¤Ë¡¢\fIrun\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤ò³«»Ï¤Ç¤­¤Þ¤¹¡£\fIrun\fR¥³¥Þ¥ó¥É¤Ï¡¢´û¸¤ÎVM¤ËÀܳ¤·¤Æ¤¤¤ë¾ì¹ç¤È¤Ï°Û¤Ê¤ê¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬\fIjdb\fR¤«¤éµ¯Æ°¤·¤¿¤È¤­¤Ë¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++JDB¤òµ¯Æ°¤·¤Æ¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤¿¤¢¤È¤Ë¡¢\fBrun\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤ò³«»Ï¤Ç¤­¤Þ¤¹¡£\fBrun\fR¥³¥Þ¥ó¥É¤Ï¡¢´û¸¤ÎVM¤ËÀܳ¤·¤Æ¤¤¤ë¾ì¹ç¤È¤Ï°Û¤Ê¤ê¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬\fBjdb\fR¤«¤éµ¯Æ°¤·¤¿¤È¤­¤Ë¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + cont +@@ -147,19 +152,20 @@ + Java¥ª¥Ö¥¸¥§¥¯¥È¤ª¤è¤Ó¥×¥ê¥ß¥Æ¥£¥ÖÃͤòɽ¼¨¤·¤Þ¤¹¡£¥×¥ê¥ß¥Æ¥£¥Ö·¿¤ÎÊÑ¿ô¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤Î¾ì¹ç¤Ë¤Ï¡¢¼ÂºÝ¤ÎÃͤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ì¹ç¤Ë¤Ï¡¢Ã»¤¤ÀâÌÀ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ÜºÙ¤ò¼èÆÀ¤¹¤ëÊýË¡¤òõ¤¹¤Ë¤Ï¡¢dump¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fBÃí°Õ:\fR +-¥í¡¼¥«¥ëÊÑ¿ô¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢´Þ¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤¬\fIjavac \-g\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥í¡¼¥«¥ëÊÑ¿ô¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢´Þ¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤¬\fBjavac \-g\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fIprint\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Ë¼¨¤¹¤è¤¦¤Ê¡¢¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò»ÈÍѤ·¤¿¤â¤Î¤Ê¤É¡¢Â¿¤¯¤Î´Êñ¤ÊJava¼°¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ ++\fBprint\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Ë¼¨¤¹¤è¤¦¤Ê¡¢¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò»ÈÍѤ·¤¿¤â¤Î¤Ê¤É¡¢Â¿¤¯¤Î´Êñ¤ÊJava¼°¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-print MyClass\&.myStaticField +-print myObj\&.myInstanceField +-print i + j + k (i, j, k are primities and either fields or local variables) +-print myObj\&.myMethod() (if myMethod returns a non\-null) +-print new java\&.lang\&.String("Hello")\&.length() ++\fBprint MyClass\&.myStaticField\fR ++\fBprint myObj\&.myInstanceField\fR ++\fBprint i + j + k (i, j, k are primities and either fields or local variables)\fR ++\fBprint myObj\&.myMethod() (if myMethod returns a non\-null)\fR ++\fBprint new java\&.lang\&.String("Hello")\&.length()\fR ++ + .fi + .if n \{\ + .RE +@@ -168,18 +174,19 @@ + .PP + dump + .RS 4 +-¥×¥ê¥ß¥Æ¥£¥ÖÃͤξì¹ç¡¢\fIdump\fR¥³¥Þ¥ó¥É¤Ï\fIprint\fR¥³¥Þ¥ó¥É¤ÈƱ°ì¤Ç¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ì¹ç¡¢\fIdump\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë³Æ¥Õ¥£¡¼¥ë¥É¤Î¸½ºß¤ÎÃͤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£static¥Õ¥£¡¼¥ë¥É¤Èinstance¥Õ¥£¡¼¥ë¥É¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fIdump\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIprint\fR¥³¥Þ¥ó¥É¤ÈƱ¤¸¼°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£ ++¥×¥ê¥ß¥Æ¥£¥ÖÃͤξì¹ç¡¢\fBdump\fR¥³¥Þ¥ó¥É¤Ï\fBprint\fR¥³¥Þ¥ó¥É¤ÈƱ°ì¤Ç¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ì¹ç¡¢\fBdump\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë³Æ¥Õ¥£¡¼¥ë¥É¤Î¸½ºß¤ÎÃͤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£static¥Õ¥£¡¼¥ë¥É¤Èinstance¥Õ¥£¡¼¥ë¥É¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fBdump\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBprint\fR¥³¥Þ¥ó¥É¤ÈƱ¤¸¼°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + threads + .RS 4 +-¸½ºß¼Â¹ÔÃæ¤Î¥¹¥ì¥Ã¥É¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¥¹¥ì¥Ã¥É¤´¤È¤Ë¡¢Ì¾Á°¤È¸½ºß¤Î¾õÂÖ¡¢¤ª¤è¤Ó¾¤Î¥³¥Þ¥ó¥É¤Ë»ÈÍѤǤ­¤ë¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ï4¤Ç¤¢¤ê¡¢¥¹¥ì¥Ã¥É¤Ï\fIjava\&.lang\&.Thread\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¡¢¥¹¥ì¥Ã¥É¤Î̾Á°¤Ï\fImain\fR¤Ç¤¢¤ê¡¢¸½ºß¼Â¹ÔÃæ¤Ç¤¹¡£ ++¸½ºß¼Â¹ÔÃæ¤Î¥¹¥ì¥Ã¥É¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¥¹¥ì¥Ã¥É¤´¤È¤Ë¡¢Ì¾Á°¤È¸½ºß¤Î¾õÂÖ¡¢¤ª¤è¤Ó¾¤Î¥³¥Þ¥ó¥É¤Ë»ÈÍѤǤ­¤ë¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ï4¤Ç¤¢¤ê¡¢¥¹¥ì¥Ã¥É¤Ï\fBjava\&.lang\&.Thread\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¡¢¥¹¥ì¥Ã¥É¤Î̾Á°¤Ï\fBmain\fR¤Ç¤¢¤ê¡¢¸½ºß¼Â¹ÔÃæ¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-4\&. (java\&.lang\&.Thread)0x1 main running ++\fB4\&. (java\&.lang\&.Thread)0x1 main running\fR ++ + .fi + .if n \{\ + .RE +@@ -188,16 +195,16 @@ + .PP + thread + .RS 4 +-¸½ºß¤Î¥¹¥ì¥Ã¥É¤Ë¤¹¤ë¥¹¥ì¥Ã¥É¤òÁªÂò¤·¤Þ¤¹¡£Â¿¤¯¤Î\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¤ÎÀßÄê¤Ë´ð¤Å¤¤¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥¹¥ì¥Ã¥É¤Ï¡¢threads¥³¥Þ¥ó¥É¤ÇÀâÌÀ¤·¤¿¥¹¥ì¥Ã¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹¤È¤È¤â¤Ë»ØÄꤷ¤Þ¤¹¡£ ++¸½ºß¤Î¥¹¥ì¥Ã¥É¤Ë¤¹¤ë¥¹¥ì¥Ã¥É¤òÁªÂò¤·¤Þ¤¹¡£Â¿¤¯¤Î\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¤ÎÀßÄê¤Ë´ð¤Å¤¤¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥¹¥ì¥Ã¥É¤Ï¡¢threads¥³¥Þ¥ó¥É¤ÇÀâÌÀ¤·¤¿¥¹¥ì¥Ã¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹¤È¤È¤â¤Ë»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + where + .RS 4 +-°ú¿ô¤ò»ØÄꤷ¤Ê¤¤¤Ç\fIwhere\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤¬¥À¥ó¥×¤µ¤ì¤Þ¤¹¡£\fIwhere\fR +-\fIall\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë¤¢¤ë¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤ò¤¹¤Ù¤Æ¥À¥ó¥×¤·¤Þ¤¹¡£\fIwhere\fR +-\fIthreadindex\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤ò¥À¥ó¥×¤·¤Þ¤¹¡£ ++°ú¿ô¤ò»ØÄꤷ¤Ê¤¤¤Ç\fBwhere\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤¬¥À¥ó¥×¤µ¤ì¤Þ¤¹¡£\fBwhere\fR ++\fBall\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë¤¢¤ë¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤ò¤¹¤Ù¤Æ¥À¥ó¥×¤·¤Þ¤¹¡£\fBwhere\fR ++\fBthreadindex\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤ò¥À¥ó¥×¤·¤Þ¤¹¡£ + .sp +-¸½ºß¤Î¥¹¥ì¥Ã¥É¤¬(¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤«\fIsuspend\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ)ÃæÃǤ·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥í¡¼¥«¥ëÊÑ¿ô¤È¥Õ¥£¡¼¥ë¥É¤Ï\fIprint\fR¥³¥Þ¥ó¥É¤È\fIdump\fR¥³¥Þ¥ó¥É¤Çɽ¼¨¤Ç¤­¤Þ¤¹¡£\fIup\fR¥³¥Þ¥ó¥É¤È\fIdown\fR¥³¥Þ¥ó¥É¤Ç¡¢¤É¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤ò¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Ë¤¹¤ë¤«¤òÁª¤Ö¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¸½ºß¤Î¥¹¥ì¥Ã¥É¤¬(¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤«\fBsuspend\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ)ÃæÃǤ·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥í¡¼¥«¥ëÊÑ¿ô¤È¥Õ¥£¡¼¥ë¥É¤Ï\fBprint\fR¥³¥Þ¥ó¥É¤È\fBdump\fR¥³¥Þ¥ó¥É¤Çɽ¼¨¤Ç¤­¤Þ¤¹¡£\fBup\fR¥³¥Þ¥ó¥É¤È\fBdown\fR¥³¥Þ¥ó¥É¤Ç¡¢¤É¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤ò¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Ë¤¹¤ë¤«¤òÁª¤Ö¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .SS "¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È" + .PP +@@ -211,7 +218,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥³¥Þ¥ó¥É\fIstop at MyClass:22\fR¤Ï¡¢\fIMyClass\fR¤¬´Þ¤Þ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î22¹ÔÌܤκǽé¤ÎÌ¿Îá¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É\fBstop at MyClass:22\fR¤Ï¡¢\fBMyClass\fR¤¬´Þ¤Þ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î22¹ÔÌܤκǽé¤ÎÌ¿Îá¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -222,7 +229,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥³¥Þ¥ó¥É\fIstop in java\&.lang\&.String\&.length\fR¤Ï¡¢¥á¥½¥Ã¥É\fIjava\&.lang\&.String\&.length\fR¤ÎÀèƬ¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É\fBstop in java\&.lang\&.String\&.length\fR¤Ï¡¢¥á¥½¥Ã¥É\fBjava\&.lang\&.String\&.length\fR¤ÎÀèƬ¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -233,26 +240,26 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥³¥Þ¥ó¥É\fIstop in MyClass\&.<clinit>\fR¤Ï¡¢\fI<clinit>\fR¤ò»ÈÍѤ·¤Æ\fIMyClass\fR¤ÎÀÅŪ½é´ü²½¥³¡¼¥É¤òÆÃÄꤷ¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É\fBstop in MyClass\&.<clinit>\fR¤Ï¡¢\fB<clinit>\fR¤ò»ÈÍѤ·¤Æ¡¢\fBMyClass\fR¤ÎÀÅŪ½é´ü²½¥³¡¼¥É¤òÆÃÄꤷ¤Þ¤¹¡£ + .RE + .PP +-¥á¥½¥Ã¥É¤¬¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢¥á¥½¥Ã¥É¤Î°ú¿ô¤Î·¿¤â»ØÄꤷ¤Æ¡¢¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤ËÂФ·¤ÆŬÀڤʥ᥽¥Ã¥É¤¬ÁªÂò¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIMyClass\&.myMethod(int,java\&.lang\&.String)\fR¤Þ¤¿¤Ï\fIMyClass\&.myMethod()\fR¤È»ØÄꤷ¤Þ¤¹¡£ ++¥á¥½¥Ã¥É¤¬¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢¥á¥½¥Ã¥É¤Î°ú¿ô¤Î·¿¤â»ØÄꤷ¤Æ¡¢¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤ËÂФ·¤ÆŬÀڤʥ᥽¥Ã¥É¤¬ÁªÂò¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBMyClass\&.myMethod(int,java\&.lang\&.String)\fR¤Þ¤¿¤Ï\fBMyClass\&.myMethod()\fR¤È»ØÄꤷ¤Þ¤¹¡£ + .PP +-\fIclear\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIclear MyClass:45\fR¤Î¤è¤¦¤Ê¹½Ê¸¤ò»ÈÍѤ·¤Æ¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òºï½ü¤·¤Þ¤¹¡£\fIclear\fR¤ò»ÈÍѤ¹¤ë¤«¡¢°ú¿ô¤ò»ØÄꤷ¤Ê¤¤¤Ç\fIstop\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¸½ºßÀßÄꤵ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fIcont\fR¥³¥Þ¥ó¥É¤Ï¼Â¹Ô¤ò·Ñ³¤·¤Þ¤¹¡£ ++\fBclear\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBclear MyClass:45\fR¤Î¤è¤¦¤Ê¹½Ê¸¤ò»ÈÍѤ·¤Æ¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òºï½ü¤·¤Þ¤¹¡£\fBclear\fR¤ò»ÈÍѤ¹¤ë¤«¡¢°ú¿ô¤ò»ØÄꤷ¤Ê¤¤¤Ç\fBstop\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¸½ºßÀßÄꤵ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fBcont\fR¥³¥Þ¥ó¥É¤Ï¼Â¹Ô¤ò·Ñ³¤·¤Þ¤¹¡£ + .SS "¥¹¥Æ¥Ã¥×¼Â¹Ô" + .PP +-\fIstep\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Þ¤¿¤Ï¸Æ¤Ó½Ð¤µ¤ì¤¿¥á¥½¥Ã¥ÉÆâ¤Ç¡¢¼¡¤Î¹Ô¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fInext\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Î¼¡¤Î¹Ô¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBstep\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Þ¤¿¤Ï¸Æ¤Ó½Ð¤µ¤ì¤¿¥á¥½¥Ã¥ÉÆâ¤Ç¡¢¼¡¤Î¹Ô¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fBnext\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Î¼¡¤Î¹Ô¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .SS "Îã³°" + .PP +-¥¹¥í¡¼¤·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¤Î¸Æ½Ð¤·¥¹¥¿¥Ã¥¯¾å¤Î¤É¤³¤Ë¤â\fIcatch\fRʸ¤¬¤Ê¤¤¾ì¹ç¤ËÎã³°¤¬È¯À¸¤¹¤ë¤È¡¢JVM¤ÏÄ̾Îã³°¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Æ½ªÎ»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢JDB´Ä¶­¤Ç¼Â¹Ô¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°ãÈ¿¤Î¥¹¥í¡¼»þ¤ËJDB¤ËÀ©¸æ¤¬Ìá¤ê¤Þ¤¹¡£¼¡¤Ë¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÎã³°¤Î¸¶°ø¤ò¿ÇÃǤ·¤Þ¤¹¡£ ++¥¹¥í¡¼¤·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¤Î¸Æ½Ð¤·¥¹¥¿¥Ã¥¯¾å¤Î¤É¤³¤Ë¤â\fBcatch\fRʸ¤¬¤Ê¤¤¾ì¹ç¤ËÎã³°¤¬È¯À¸¤¹¤ë¤È¡¢JVM¤ÏÄ̾Îã³°¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Æ½ªÎ»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢JDB´Ä¶­¤Ç¼Â¹Ô¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°ãÈ¿¤Î¥¹¥í¡¼»þ¤ËJDB¤ËÀ©¸æ¤¬Ìá¤ê¤Þ¤¹¡£¼¡¤Ë¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÎã³°¤Î¸¶°ø¤ò¿ÇÃǤ·¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢\fIcatch java\&.io\&.FileNotFoundException\fR¤Þ¤¿¤Ï\fIcatch\fR +-\fImypackage\&.BigTroubleException\fR¤Î¤è¤¦¤Ë\fIcatch\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Ð¥Ã¥°¤µ¤ì¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢Â¾¤ÎÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤ËÄä»ß¤·¤Þ¤¹¡£Îã³°¤¬ÆÃÄê¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥µ¥Ö¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Î¾ì¹ç¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÏÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì½ê¤ÇÄä»ß¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fBcatch java\&.io\&.FileNotFoundException\fR¤Þ¤¿¤Ï\fBcatch\fR ++\fBmypackage\&.BigTroubleException\fR¤Î¤è¤¦¤Ë\fBcatch\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Ð¥Ã¥°¤µ¤ì¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢Â¾¤ÎÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤ËÄä»ß¤·¤Þ¤¹¡£Îã³°¤¬ÆÃÄê¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥µ¥Ö¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Î¾ì¹ç¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÏÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì½ê¤ÇÄä»ß¤·¤Þ¤¹¡£ + .PP +-\fIignore\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢°ÊÁ°¤Î\fIcatch\fR¥³¥Þ¥ó¥É¤Î¸ú²Ì¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIignore\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Ð¥Ã¥°¤µ¤ì¤ëJVM¤ÏÆÃÄê¤ÎÎã³°¤ò̵»ë¤»¤º¡¢¥Ç¥Ð¥Ã¥¬¤Î¤ß¤ò̵»ë¤·¤Þ¤¹¡£ ++\fBignore\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢°ÊÁ°¤Î\fBcatch\fR¥³¥Þ¥ó¥É¤Î¸ú²Ì¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fBignore\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Ð¥Ã¥°¤µ¤ì¤ëJVM¤ÏÆÃÄê¤ÎÎã³°¤ò̵»ë¤»¤º¡¢¥Ç¥Ð¥Ã¥¬¤Î¤ß¤ò̵»ë¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjava\fR¥³¥Þ¥ó¥É¤Î¤«¤ï¤ê¤Ë\fIjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI\-D\fR¡¢\fI\-classpath\fR¡¢\fI\-X\fR¤Ê¤É¡¢\fIjava\fR¥³¥Þ¥ó¥É¤ÈƱ¤¸¿ô¤Î¥ª¥×¥·¥ç¥ó¤ò¼õ¤±Æþ¤ì¤Þ¤¹¡£\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¾¤Ë¼¡¤Î¥ê¥¹¥È¤Ë¤¢¤ë¥ª¥×¥·¥ç¥ó¤ò¼õ¤±Æþ¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fBjava\fR¥³¥Þ¥ó¥É¤Î¤«¤ï¤ê¤Ë\fBjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB\-D\fR¡¢\fB\-classpath\fR¡¢\fB\-X\fR¤Ê¤É¡¢\fBjava\fR¥³¥Þ¥ó¥É¤ÈƱ¤¸¿ô¤Î¥ª¥×¥·¥ç¥ó¤ò¼õ¤±Æþ¤ì¤Þ¤¹¡£\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¾¤Ë¼¡¤Î¥ê¥¹¥È¤Ë¤¢¤ë¥ª¥×¥·¥ç¥ó¤ò¼õ¤±Æþ¤ì¤Þ¤¹¡£ + .PP + ¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦JVM¤Ë¥Ç¥Ð¥Ã¥¬¤òÀܳ¤¹¤ë¤¿¤á¤ÎÂåÂص¡¹½¤òÄ󶡤¹¤ë¤¿¤á¤Ë¡¢¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤é¤ÎÀܳ¤ÎÂåÂؤ˴ؤ¹¤ë¾ÜºÙ¤Ê¥É¥­¥å¥á¥ó¥È¤Ï¡¢Java Platform Debugger Architecture (JPDA) + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jpda/index\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ +@@ -279,7 +286,7 @@ + .PP + \-launch + .RS 4 +-¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òJDB¤Îµ¯Æ°¸å¤¿¤À¤Á¤Ëµ¯Æ°¤·¤Þ¤¹¡£\fI\-launch\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fIrun\fR¥³¥Þ¥ó¥É¤¬É¬Íפʤ¯¤Ê¤ê¤Þ¤¹¡£¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢µ¯Æ°¸å¡¢½é´ü¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¯¥é¥¹¤¬¥í¡¼¥É¤µ¤ì¤ëľÁ°¤ËÄä»ß¤·¤Þ¤¹¡£¤½¤Î»þÅÀ¤Ç¡¢É¬Íפʥ֥졼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¡¢\fIcont\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¼Â¹Ô¤ò·Ñ³¤Ç¤­¤Þ¤¹¡£ ++¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òJDB¤Îµ¯Æ°¸å¤¿¤À¤Á¤Ëµ¯Æ°¤·¤Þ¤¹¡£\fB\-launch\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fBrun\fR¥³¥Þ¥ó¥É¤¬É¬Íפʤ¯¤Ê¤ê¤Þ¤¹¡£¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢µ¯Æ°¸å¡¢½é´ü¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¯¥é¥¹¤¬¥í¡¼¥É¤µ¤ì¤ëľÁ°¤ËÄä»ß¤·¤Þ¤¹¡£¤½¤Î»þÅÀ¤Ç¡¢É¬Íפʥ֥졼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¡¢\fBcont\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¼Â¹Ô¤ò·Ñ³¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-listconnectors +@@ -294,7 +301,7 @@ + .PP + \-dbgtrace [\fIflags\fR] + .RS 4 +-\fIjdb\fR¥³¥Þ¥ó¥É¤Î¥Ç¥Ð¥Ã¥°¤Î¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjdb\fR¥³¥Þ¥ó¥É¤Î¥Ç¥Ð¥Ã¥°¤Î¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-tclient +@@ -309,7 +316,7 @@ + .PP + \-J\fIoption\fR + .RS 4 +-JVM¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++JVM¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥Ç¥Ð¥Ã¥°ÂÐ¾Ý¤Î¥×¥í¥»¥¹¤ËžÁ÷¤µ¤ì¤ë¥ª¥×¥·¥ç¥ó" + .PP +--- ./jdk/src/linux/doc/man/ja/jdeps.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jdeps.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jdeps +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jdeps ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jdeps" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jdeps \- Java¥¯¥é¥¹°Í¸À­¥¢¥Ê¥é¥¤¥¶¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjdeps\fR [\fIoptions\fR] \fIclasses\fR \&.\&.\&. ++\fBjdeps\fR [\fIoptions\fR] \fIclasses\fR \&.\&.\&. + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclasses\fR +@@ -73,20 +75,24 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjdeps\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥Ã¥±¡¼¥¸¥ì¥Ù¥ë¤Þ¤¿¤Ï¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸À­¤ò¼¨¤·¤Þ¤¹¡£ÆþÎÏ¥¯¥é¥¹¤Ë¤Ï¡¢\fI\&.class\fR¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹Ì¾¡¢¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òʬÀϤ¹¤ë¤¿¤á¤Î´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê½ÐÎϤ¬·èÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjdeps\fR¤Ï¥·¥¹¥Æ¥à½ÐÎϤ˰͸´Ø·¸¤ò½ÐÎϤ·¤Þ¤¹¡£DOT¸À¸ì¤Ç°Í¸´Ø·¸¤òÀ¸À®¤Ç¤­¤Þ¤¹(\fI\-dotoutput\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È)¡£ ++\fBjdeps\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥Ã¥±¡¼¥¸¥ì¥Ù¥ë¤Þ¤¿¤Ï¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸À­¤ò¼¨¤·¤Þ¤¹¡£ÆþÎÏ¥¯¥é¥¹¤Ë¤Ï¡¢\fB\&.class\fR¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹Ì¾¡¢¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òʬÀϤ¹¤ë¤¿¤á¤Î´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê½ÐÎϤ¬·èÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjdeps\fR¤Ï¥·¥¹¥Æ¥à½ÐÎϤ˰͸´Ø·¸¤ò½ÐÎϤ·¤Þ¤¹¡£DOT¸À¸ì¤Ç°Í¸´Ø·¸¤òÀ¸À®¤Ç¤­¤Þ¤¹(\fB\-dotoutput\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È)¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-dotoutput <\fIdir\fR> + .RS 4 +-DOT¥Õ¥¡¥¤¥ë½ÐÎϤΰ¸Àè¥Ç¥£¥ì¥¯¥È¥ê¡£»ØÄꤷ¤¿¾ì¹ç¤Ï\fIjdeps\fR¤Ï<\fIarchive\-file\-name\fR>\&.dot¤È¤¤¤¦Ì¾Á°¤ÎʬÀϺѤߥ¢¡¼¥«¥¤¥Ö¤´¤È¤Ë°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ë1¤Ä¤Îdot¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¡¢¥¢¡¼¥«¥¤¥Ö´Ö¤Î°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ësummary\&.dot¤È¤¤¤¦Ì¾Á°¤Î¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤âÀ¸À®¤·¤Þ¤¹¡£ ++DOT¥Õ¥¡¥¤¥ë½ÐÎϤΰ¸Àè¥Ç¥£¥ì¥¯¥È¥ê¡£»ØÄꤷ¤¿¾ì¹ç¡¢\fBjdeps\fR¤Ï<\fIarchive\-file\-name\fR>\&.dot¤È¤¤¤¦Ì¾Á°¤ÎʬÀϺѥ¢¡¼¥«¥¤¥Ö¤´¤È¤Ë°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ë1¤Ä¤Îdot¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¡¢¥¢¡¼¥«¥¤¥Ö´Ö¤Î°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ësummary\&.dot¤È¤¤¤¦Ì¾Á°¤Î¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤âÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP +-\-s, \-summary ++\-s ++.br ++\-summary + .RS 4 + °Í¸´Ø·¸¤Î¥µ¥Þ¥ê¡¼¤Î¤ß¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-v, \-verbose ++\-v ++.br ++\-verbose + .RS 4 + ¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸´Ø·¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE +@@ -101,46 +107,56 @@ + Ʊ¤¸¥¢¡¼¥«¥¤¥ÖÆâ¤Î°Í¸´Ø·¸¤ò½ü¤­¡¢¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸´Ø·¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-cp <\fIpath\fR>, \-classpath <\fIpath\fR> ++\-cp <\fIpath\fR> ++.br ++\-classpath <\fIpath\fR> + .RS 4 + ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¸¡º÷¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + Setting the Class Path ¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\-p <\fIpkg name\fR>, \-package <\fIpkg name\fR> ++\-p <\fIpkg name\fR> ++.br ++\-package <\fIpkg name\fR> + .RS 4 +-»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤ËÂФ·¤Æ¤³¤Î¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄê¤Ç¤­¤Þ¤¹¡£\fI\-p\fR¥ª¥×¥·¥ç¥ó¤È\fI\-e\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ++»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤ËÂФ·¤Æ¤³¤Î¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄê¤Ç¤­¤Þ¤¹¡£\fB\-p\fR¥ª¥×¥·¥ç¥ó¤È\fB\-e\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP +-\-e <\fIregex\fR>, \-regex <\fIregex\fR> ++\-e <\fIregex\fR> ++.br ++\-regex <\fIregex\fR> + .RS 4 +-»ØÄꤷ¤¿Àµµ¬É½¸½¥Ñ¥¿¡¼¥ó¤È°ìÃפ¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£\fI\-p\fR¥ª¥×¥·¥ç¥ó¤È\fI\-e\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ++»ØÄꤷ¤¿Àµµ¬É½¸½¥Ñ¥¿¡¼¥ó¤È°ìÃפ¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£\fB\-p\fR¥ª¥×¥·¥ç¥ó¤È\fB\-e\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP + \-include <\fIregex\fR> + .RS 4 +-ʬÀϤò¥Ñ¥¿¡¼¥ó¤Ë°ìÃפ¹¤ë¥¯¥é¥¹¤ËÀ©¸Â¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Ê¬ÀϤ¹¤ë¥¯¥é¥¹¤Î¥ê¥¹¥È¤ò¥Õ¥£¥ë¥¿¤·¤Þ¤¹¡£°Í¸´Ø·¸¤Ë¥Ñ¥¿¡¼¥ó¤òŬÍѤ¹¤ë\fI\-p\fR¤ª¤è¤Ó\fI\-e\fR¤È¤È¤â¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++ʬÀϤò¥Ñ¥¿¡¼¥ó¤Ë°ìÃפ¹¤ë¥¯¥é¥¹¤ËÀ©¸Â¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Ê¬ÀϤ¹¤ë¥¯¥é¥¹¤Î¥ê¥¹¥È¤ò¥Õ¥£¥ë¥¿¤·¤Þ¤¹¡£°Í¸´Ø·¸¤Ë¥Ñ¥¿¡¼¥ó¤òŬÍѤ¹¤ë\fB\-p\fR¤ª¤è¤Ó\fB\-e\fR¤È¤È¤â¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-jdkinternals + .RS 4 +-JDK¤ÎÆâÉôAPI¤Î¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fI\-include\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤òʬÀϤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-p\fR¥ª¥×¥·¥ç¥ó¡¢\fI\-e\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-s\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++JDK¤ÎÆâÉôAPI¤Î¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fB\-include\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤òʬÀϤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-p\fR¥ª¥×¥·¥ç¥ó¡¢\fB\-e\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-s\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤǤ­¤Þ¤»¤ó¡£ + .sp + \fB·Ù¹ð\fR: JDK¤ÎÆâÉôAPI¤Ï¡¢º£¸å¤Î¥ê¥ê¡¼¥¹¤Ç¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\-P, \-profile ++\-P ++.br ++\-profile + .RS 4 + ¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¥×¥í¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Õ¥¡¥¤¥ë¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-apionly + .RS 4 +-¥Õ¥£¡¼¥ë¥É¡¦¥¿¥¤¥×¡¢¥á¥½¥Ã¥É¡¦¥Ñ¥é¥á¡¼¥¿¡¦¥¿¥¤¥×¡¢Ìá¤ê¥¿¥¤¥×¡¢¥Á¥§¥Ã¥¯¤µ¤ì¤¿Îã³°¥¿¥¤¥×¤ò´Þ¤à¥Ñ¥Ö¥ê¥Ã¥¯¡¦¥¯¥é¥¹¤Î\fIpublic\fR¤ª¤è¤Ó\fIprotected\fR¥á¥ó¥Ð¡¼¤Î½ð̾¤«¤é¤Î°Í¸´Ø·¸¤Ê¤É¡¢Ê¬ÀϤòAPI¤ËÀ©¸Â¤·¤Þ¤¹¡£ ++¥Õ¥£¡¼¥ë¥É¡¦¥¿¥¤¥×¡¢¥á¥½¥Ã¥É¡¦¥Ñ¥é¥á¡¼¥¿¡¦¥¿¥¤¥×¡¢Ìá¤ê¥¿¥¤¥×¡¢¥Á¥§¥Ã¥¯¤µ¤ì¤¿Îã³°¥¿¥¤¥×¤ò´Þ¤à¥Ñ¥Ö¥ê¥Ã¥¯¡¦¥¯¥é¥¹¤Î\fBpublic\fR¤ª¤è¤Ó\fBprotected\fR¥á¥ó¥Ð¡¼¤Î½ð̾¤«¤é¤Î°Í¸´Ø·¸¤Ê¤É¡¢Ê¬ÀϤòAPI¤ËÀ©¸Â¤·¤Þ¤¹¡£ + .RE + .PP +-\-R, \-recursive ++\-R ++.br ++\-recursive + .RS 4 + ¤¹¤Ù¤Æ¤Î°Í¸´Ø·¸¤òºÆµ¢Åª¤ËÁöºº¤·¤Þ¤¹¡£ + .RE +@@ -150,9 +166,13 @@ + ¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-h, \-?, \-help ++\-h ++.br ++\-? ++.br ++\-help + .RS 4 +-\fIjdeps\fR¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjdeps\fR¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .SH "Îã" + .PP +@@ -162,24 +182,25 @@ + .RS 4 + .\} + .nf +-$ jdeps demo/jfc/Notepad/Notepad\&.jar ++\fB$ jdeps demo/jfc/Notepad/Notepad\&.jar\fR ++\fB \fR ++\fBdemo/jfc/Notepad/Notepad\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB <unnamed> (Notepad\&.jar)\fR ++\fB \-> java\&.awt \fR ++\fB \-> java\&.awt\&.event \fR ++\fB \-> java\&.beans \fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.net \fR ++\fB \-> java\&.util \fR ++\fB \-> java\&.util\&.logging \fR ++\fB \-> javax\&.swing \fR ++\fB \-> javax\&.swing\&.border \fR ++\fB \-> javax\&.swing\&.event \fR ++\fB \-> javax\&.swing\&.text \fR ++\fB \-> javax\&.swing\&.tree \fR ++\fB \-> javax\&.swing\&.undo \fR + +-demo/jfc/Notepad/Notepad\&.jar \-> /usr/java/jre/lib/rt\&.jar +- <unnamed> (Notepad\&.jar) +- \-> java\&.awt +- \-> java\&.awt\&.event +- \-> java\&.beans +- \-> java\&.io +- \-> java\&.lang +- \-> java\&.net +- \-> java\&.util +- \-> java\&.util\&.logging +- \-> javax\&.swing +- \-> javax\&.swing\&.border +- \-> javax\&.swing\&.event +- \-> javax\&.swing\&.text +- \-> javax\&.swing\&.tree +- \-> javax\&.swing\&.undo + .fi + .if n \{\ + .RE +@@ -191,115 +212,119 @@ + .RS 4 + .\} + .nf +-$ jdeps \-profile demo/jfc/Notepad/Notepad\&.jar +-demo/jfc/Notepad/Notepad\&.jar \-> /usr/java/jre/lib/rt\&.jar (Full JRE) +- <unnamed> (Notepad\&.jar) +- \-> java\&.awt Full JRE +- \-> java\&.awt\&.event Full JRE +- \-> java\&.beans Full JRE +- \-> java\&.io compact1 +- \-> java\&.lang compact1 +- \-> java\&.net compact1 +- \-> java\&.util compact1 +- \-> java\&.util\&.logging compact1 +- \-> javax\&.swing Full JRE +- \-> javax\&.swing\&.border Full JRE +- \-> javax\&.swing\&.event Full JRE +- \-> javax\&.swing\&.text Full JRE +- \-> javax\&.swing\&.tree Full JRE +- \-> javax\&.swing\&.undo Full JRE ++\fB$ jdeps \-profile demo/jfc/Notepad/Notepad\&.jar \fR ++\fBdemo/jfc/Notepad/Notepad\&.jar \-> /usr/java/jre/lib/rt\&.jar (Full JRE)\fR ++\fB <unnamed> (Notepad\&.jar)\fR ++\fB \-> java\&.awt Full JRE\fR ++\fB \-> java\&.awt\&.event Full JRE\fR ++\fB \-> java\&.beans Full JRE\fR ++\fB \-> java\&.io compact1\fR ++\fB \-> java\&.lang compact1\fR ++\fB \-> java\&.net compact1\fR ++\fB \-> java\&.util compact1\fR ++\fB \-> java\&.util\&.logging compact1\fR ++\fB \-> javax\&.swing Full JRE\fR ++\fB \-> javax\&.swing\&.border Full JRE\fR ++\fB \-> javax\&.swing\&.event Full JRE\fR ++\fB \-> javax\&.swing\&.text Full JRE\fR ++\fB \-> javax\&.swing\&.tree Full JRE\fR ++\fB \-> javax\&.swing\&.undo Full JRE\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-tools\&.jar¥Õ¥¡¥¤¥ëÆâ¤Î\fIcom\&.sun\&.tools\&.jdeps\&.Main\fR¥¯¥é¥¹¤Ê¤É¡¢ÆÃÄê¤Î¥¯¥é¥¹¥Ñ¥¹Æâ¤ÎÆÃÄê¤Î¥¯¥é¥¹¤ÎľÀܰ͸´Ø·¸¤ÎʬÀÏ¡£ ++tools\&.jar¥Õ¥¡¥¤¥ëÆâ¤Î\fBcom\&.sun\&.tools\&.jdeps\&.Main\fR¥¯¥é¥¹¤Ê¤É¡¢ÆÃÄê¤Î¥¯¥é¥¹¥Ñ¥¹Æâ¤ÎÆÃÄê¤Î¥¯¥é¥¹¤ÎľÀܰ͸´Ø·¸¤ÎʬÀÏ¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-$ jdeps \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main +-lib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar +- com\&.sun\&.tools\&.jdeps (tools\&.jar) +- \-> java\&.io +- \-> java\&.lang ++\fB$ jdeps \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main\fR ++\fBlib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB com\&.sun\&.tools\&.jdeps (tools\&.jar)\fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fI\-verbose:class\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¹¥ì¥Ù¥ë°Í¸´Ø·¸¤ò¸¡º÷¤¹¤ë¤«\fI\-v\fR¤Þ¤¿¤Ï\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆƱ¤¸JAR¥Õ¥¡¥¤¥ë¤«¤é¤Î°Í¸´Ø·¸¤ò´Þ¤á¤Þ¤¹¡£ ++\fB\-verbose:class\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¹¥ì¥Ù¥ë°Í¸´Ø·¸¤ò¸¡º÷¤¹¤ë¤«\fB\-v\fR¤Þ¤¿¤Ï\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆƱ¤¸JAR¥Õ¥¡¥¤¥ë¤«¤é¤Î°Í¸´Ø·¸¤ò´Þ¤á¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-$ jdeps \-verbose:class \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main ++\fB$ jdeps \-verbose:class \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main\fR ++\fB \fR ++\fBlib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB com\&.sun\&.tools\&.jdeps\&.Main (tools\&.jar)\fR ++\fB \-> java\&.io\&.PrintWriter \fR ++\fB \-> java\&.lang\&.Exception \fR ++\fB \-> java\&.lang\&.Object \fR ++\fB \-> java\&.lang\&.String \fR ++\fB \-> java\&.lang\&.System \fR + +-lib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar +- com\&.sun\&.tools\&.jdeps\&.Main (tools\&.jar) +- \-> java\&.io\&.PrintWriter +- \-> java\&.lang\&.Exception +- \-> java\&.lang\&.Object +- \-> java\&.lang\&.String +- \-> java\&.lang\&.System + .fi + .if n \{\ + .RE + .\} + .PP +-\fI\-R\fR¤Þ¤¿¤Ï\fI\-recursive\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fIcom\&.sun\&.tools\&.jdeps\&.Main\fR¥¯¥é¥¹¤Î¿ä°ÜŪ¤Ê°Í¸´Ø·¸¤òʬÀϤ·¤Þ¤¹¡£ ++\fB\-R\fR¤Þ¤¿¤Ï\fB\-recursive\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fBcom\&.sun\&.tools\&.jdeps\&.Main\fR¥¯¥é¥¹¤Î¿ä°ÜŪ¤Ê°Í¸´Ø·¸¤òʬÀϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-$ jdeps \-R \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main +-lib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar +- com\&.sun\&.tools\&.classfile (tools\&.jar) +- \-> java\&.io +- \-> java\&.lang +- \-> java\&.lang\&.reflect +- \-> java\&.nio\&.charset +- \-> java\&.nio\&.file +- \-> java\&.util +- \-> java\&.util\&.regex +- com\&.sun\&.tools\&.jdeps (tools\&.jar) +- \-> java\&.io +- \-> java\&.lang +- \-> java\&.nio\&.file +- \-> java\&.nio\&.file\&.attribute +- \-> java\&.text +- \-> java\&.util +- \-> java\&.util\&.jar +- \-> java\&.util\&.regex +- \-> java\&.util\&.zip +-/usr/java/jre/lib/jce\&.jar \-> /usr/java/jre/lib/rt\&.jar +- javax\&.crypto (jce\&.jar) +- \-> java\&.io +- \-> java\&.lang +- \-> java\&.lang\&.reflect +- \-> java\&.net +- \-> java\&.nio +- \-> java\&.security +- \-> java\&.security\&.cert +- \-> java\&.security\&.spec +- \-> java\&.util +- \-> java\&.util\&.concurrent +- \-> java\&.util\&.jar +- \-> java\&.util\&.regex +- \-> java\&.util\&.zip +- \-> javax\&.security\&.auth +- \-> sun\&.security\&.jca JDK internal API (rt\&.jar) +- \-> sun\&.security\&.util JDK internal API (rt\&.jar) +- javax\&.crypto\&.spec (jce\&.jar) +- \-> java\&.lang +- \-> java\&.security\&.spec +- \-> java\&.util +-/usr/java/jre/lib/rt\&.jar \-> /usr/java/jre/lib/jce\&.jar +- java\&.security (rt\&.jar) +- \-> javax\&.crypto ++\fB$ jdeps \-R \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main\fR ++\fBlib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB com\&.sun\&.tools\&.classfile (tools\&.jar)\fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.lang\&.reflect \fR ++\fB \-> java\&.nio\&.charset \fR ++\fB \-> java\&.nio\&.file \fR ++\fB \-> java\&.util \fR ++\fB \-> java\&.util\&.regex \fR ++\fB com\&.sun\&.tools\&.jdeps (tools\&.jar)\fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.nio\&.file \fR ++\fB \-> java\&.nio\&.file\&.attribute \fR ++\fB \-> java\&.text \fR ++\fB \-> java\&.util \fR ++\fB \-> java\&.util\&.jar \fR ++\fB \-> java\&.util\&.regex \fR ++\fB \-> java\&.util\&.zip \fR ++\fB/usr/java/jre/lib/jce\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB javax\&.crypto (jce\&.jar)\fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.lang\&.reflect \fR ++\fB \-> java\&.net \fR ++\fB \-> java\&.nio \fR ++\fB \-> java\&.security \fR ++\fB \-> java\&.security\&.cert \fR ++\fB \-> java\&.security\&.spec \fR ++\fB \-> java\&.util \fR ++\fB \-> java\&.util\&.concurrent \fR ++\fB \-> java\&.util\&.jar \fR ++\fB \-> java\&.util\&.regex \fR ++\fB \-> java\&.util\&.zip \fR ++\fB \-> javax\&.security\&.auth \fR ++\fB \-> sun\&.security\&.jca JDK internal API (rt\&.jar)\fR ++\fB \-> sun\&.security\&.util JDK internal API (rt\&.jar)\fR ++\fB javax\&.crypto\&.spec (jce\&.jar)\fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.security\&.spec \fR ++\fB \-> java\&.util \fR ++\fB/usr/java/jre/lib/rt\&.jar \-> /usr/java/jre/lib/jce\&.jar\fR ++\fB java\&.security (rt\&.jar)\fR ++\fB \-> javax\&.crypto\fR ++ + .fi + .if n \{\ + .RE +@@ -311,41 +336,43 @@ + .RS 4 + .\} + .nf +-$ jdeps \-dotoutput dot demo/jfc/Notepad/Notepad\&.jar ++\fB$ jdeps \-dotoutput dot demo/jfc/Notepad/Notepad\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjdeps\fR¤Ï¡¢\fI\-dotoutput\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿dot¥Ç¥£¥ì¥¯¥È¥ê¤Ë<\fIfilename\fR>\&.dot¤È¤¤¤¦Ì¾Á°¤Îdot¥Õ¥¡¥¤¥ë¤òÆÃÄê¤ÎJAR¥Õ¥¡¥¤¥ë¤´¤È¤ËºîÀ®¤·¡¢JAR¥Õ¥¡¥¤¥ë´Ö¤Î°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ësummary\&.dot¤È¤¤¤¦Ì¾Á°¤Î¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤âºîÀ®¤·¤Þ¤¹ ++\fBjdeps\fR¤Ï¡¢\fB\-dotoutput\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿dot¥Ç¥£¥ì¥¯¥È¥ê¤Ë<\fIfilename\fR>\&.dot¤È¤¤¤¦Ì¾Á°¤Îdot¥Õ¥¡¥¤¥ë¤òÆÃÄê¤ÎJAR¥Õ¥¡¥¤¥ë¤´¤È¤ËºîÀ®¤·¡¢JAR¥Õ¥¡¥¤¥ë´Ö¤Î°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ësummary\&.dot¤È¤¤¤¦Ì¾Á°¤Î¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤âºîÀ®¤·¤Þ¤¹ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-$ cat dot/Notepad\&.jar\&.dot +-digraph "Notepad\&.jar" { +- // Path: demo/jfc/Notepad/Notepad\&.jar +- "<unnamed>" \-> "java\&.awt"; +- "<unnamed>" \-> "java\&.awt\&.event"; +- "<unnamed>" \-> "java\&.beans"; +- "<unnamed>" \-> "java\&.io"; +- "<unnamed>" \-> "java\&.lang"; +- "<unnamed>" \-> "java\&.net"; +- "<unnamed>" \-> "java\&.util"; +- "<unnamed>" \-> "java\&.util\&.logging"; +- "<unnamed>" \-> "javax\&.swing"; +- "<unnamed>" \-> "javax\&.swing\&.border"; +- "<unnamed>" \-> "javax\&.swing\&.event"; +- "<unnamed>" \-> "javax\&.swing\&.text"; +- "<unnamed>" \-> "javax\&.swing\&.tree"; +- "<unnamed>" \-> "javax\&.swing\&.undo"; +-} ++\fB$ cat dot/Notepad\&.jar\&.dot \fR ++\fBdigraph "Notepad\&.jar" {\fR ++\fB // Path: demo/jfc/Notepad/Notepad\&.jar\fR ++\fB "<unnamed>" \-> "java\&.awt";\fR ++\fB "<unnamed>" \-> "java\&.awt\&.event";\fR ++\fB "<unnamed>" \-> "java\&.beans";\fR ++\fB "<unnamed>" \-> "java\&.io";\fR ++\fB "<unnamed>" \-> "java\&.lang";\fR ++\fB "<unnamed>" \-> "java\&.net";\fR ++\fB "<unnamed>" \-> "java\&.util";\fR ++\fB "<unnamed>" \-> "java\&.util\&.logging";\fR ++\fB "<unnamed>" \-> "javax\&.swing";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.border";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.event";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.text";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.tree";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.undo";\fR ++\fB}\fR ++\fB \fR ++\fB$ cat dot/summary\&.dot\fR ++\fBdigraph "summary" {\fR ++\fB "Notepad\&.jar" \-> "rt\&.jar";\fR ++\fB}\fR + +-$ cat dot/summary\&.dot +-digraph "summary" { +- "Notepad\&.jar" \-> "rt\&.jar"; +-} + .fi + .if n \{\ + .RE +--- ./jdk/src/linux/doc/man/ja/jhat.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jhat.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jhat +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jhat ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jhat" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jhat \- Java¥Ò¡¼¥×¤òʬÀϤ·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjhat\fR [ \fIoptions\fR ] \fIheap\-dump\-file\fR ++\fBjhat\fR [ \fIoptions\fR ] \fIheap\-dump\-file\fR + .fi + .if n \{\ + .RE +@@ -64,16 +66,16 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIheap\-dump\-file\fR + .RS 4 +-¥Ö¥é¥¦¥ºÂоݤȤʤëJava¥Ð¥¤¥Ê¥ê¡¦¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¡£Ê£¿ô¤Î¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò´Þ¤à¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¡¢\fImyfile\&.hprof#3\fR¤Î¤è¤¦¤Ë¥Õ¥¡¥¤¥ë̾¤Î¸å¤Ë\fI#<number>\fR¤òÉղ乤뤳¤È¤Ç¡¢¥Õ¥¡¥¤¥ëÆâ¤ÎÆÃÄê¤Î¥À¥ó¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¥Ö¥é¥¦¥ºÂоݤȤʤëJava¥Ð¥¤¥Ê¥ê¡¦¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¡£Ê£¿ô¤Î¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò´Þ¤à¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¡¢\fBmyfile\&.hprof#3\fR¤Î¤è¤¦¤Ë¥Õ¥¡¥¤¥ë̾¤Î¸å¤Ë\fB#<number>\fR¤òÉղ乤뤳¤È¤Ç¡¢¥Õ¥¡¥¤¥ëÆâ¤ÎÆÃÄê¤Î¥À¥ó¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjhat\fR¥³¥Þ¥ó¥É¤ÏJava¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤ò²òÀϤ·¡¢Web¥µ¡¼¥Ð¡¼¤ò³«»Ï¤·¤Þ¤¹¡£\fIjhat\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¤ªµ¤¤ËÆþ¤ê¤Î¥Ö¥é¥¦¥¶¤Ç¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò»²¾È¤Ç¤­¤Þ¤¹¡£\fIjhat\fR¥³¥Þ¥ó¥É¤Ï¡¢´ûÃΤΥ¯¥é¥¹\fIMyClass\fR¤Î¤¹¤Ù¤Æ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òɽ¼¨¤¹¤ë¤Ê¤É¤Î»öÁ°À߷׺ѤÎÌä¹ç¤»¤äObject Query Language (OQL)¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×¤ÎÌä¹ç¤»¤ò½ü¤­¡¢OQL¤ÏSQL¤Ë»÷¤Æ¤¤¤Þ¤¹¡£OQL¤Î¥Ø¥ë¥×¤Ë¤Ï¡¢\fIjhat\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æɽ¼¨¤µ¤ì¤ëOQL¥Ø¥ë¥×¡¦¥Ú¡¼¥¸¤«¤é¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢OQL¤Î¥Ø¥ë¥×¤Ïhttp://localhost:7000/oqlhelp/¤ÇÍøÍѲÄǽ¤Ç¤¹¡£ ++\fBjhat\fR¥³¥Þ¥ó¥É¤ÏJava¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤ò²òÀϤ·¡¢Web¥µ¡¼¥Ð¡¼¤ò³«»Ï¤·¤Þ¤¹¡£\fBjhat\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¤ªµ¤¤ËÆþ¤ê¤Î¥Ö¥é¥¦¥¶¤Ç¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò»²¾È¤Ç¤­¤Þ¤¹¡£\fBjhat\fR¥³¥Þ¥ó¥É¤Ï¡¢´ûÃΤΥ¯¥é¥¹\fBMyClass\fR¤Î¤¹¤Ù¤Æ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òɽ¼¨¤¹¤ë¤Ê¤É¤Î»öÁ°À߷׺ѤÎÌä¹ç¤»¤äObject Query Language (OQL)¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×¤ÎÌä¹ç¤»¤ò½ü¤­¡¢OQL¤ÏSQL¤Ë»÷¤Æ¤¤¤Þ¤¹¡£OQL¤Î¥Ø¥ë¥×¤Ë¤Ï¡¢\fBjhat\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æɽ¼¨¤µ¤ì¤ëOQL¥Ø¥ë¥×¡¦¥Ú¡¼¥¸¤«¤é¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢OQL¤Î¥Ø¥ë¥×¤Ïhttp://localhost:7000/oqlhelp/¤ÇÍøÍѲÄǽ¤Ç¤¹¡£ + .PP + Java¤Î¥Ò¡¼¥×¡¦¥À¥ó¥×¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤¤¤¯¤Ä¤«¤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +@@ -85,7 +87,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIjmap \-dump\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¼Â¹Ô»þ¤Ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£jmap(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjmap \-dump\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¼Â¹Ô»þ¤Ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£jmap(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -96,7 +98,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIjconsole\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ\fIHotSpotDiagnosticMXBean\fR·Ðͳ¤Ç¼Â¹Ô»þ¤Ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£jconsole(1)¤ª¤è¤Ó\fIHotSpotDiagnosticMXBean\fR¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÀâÌÀ( ++\fBjconsole\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ\fBHotSpotDiagnosticMXBean\fR·Ðͳ¤Ç¼Â¹Ô»þ¤Ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£jconsole(1)¤ª¤è¤Ó\fBHotSpotDiagnosticMXBean\fR¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÀâÌÀ( + http://docs\&.oracle\&.com/javase/8/docs/jre/api/management/extension/com/sun/management/HotSpotDiagnosticMXBean\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp +@@ -108,8 +110,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ò¡¼¥×¡¦¥À¥ó¥×¤Ï¡¢\fI\-XX:+HeapDumpOnOutOfMemoryError\fR +-Java²¾ÁÛ¥Þ¥·¥ó(JVM)¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢\fIOutOfMemoryError\fR¤¬¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤ËÀ¸À®¤µ¤ì¤Þ¤¹¡£ ++¥Ò¡¼¥×¡¦¥À¥ó¥×¤Ï¡¢\fB\-XX:+HeapDumpOnOutOfMemoryError\fR ++Java Virtual Machine (JVM)¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢\fBOutOfMemoryError\fR¤¬¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤ËÀ¸À®¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -120,29 +122,29 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIhprof\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£HPROF: Heap/CPU¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥Ä¡¼¥ë ++\fBhprof\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£HPROF: Heap/CPU¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥Ä¡¼¥ë + (http://docs\&.oracle\&.com/javase/8/docs/technotes/samples/hprof\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-stack false|true + .RS 4 +-¥ª¥Ö¥¸¥§¥¯¥È³äÅö¸Æ½Ð¤·¥¹¥¿¥Ã¥¯¤ÎÄÉÀפò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×Æâ¤Ç³äÅö¥µ¥¤¥È¾ðÊ󤬻ÈÍѤǤ­¤Ê¤¤¾ì¹ç¡¢¤³¤Î¥Õ¥é¥°¤ò\fIfalse\fR¤ËÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fItrue\fR¤Ç¤¹¡£ ++¥ª¥Ö¥¸¥§¥¯¥È³äÅö¸Æ½Ð¤·¥¹¥¿¥Ã¥¯¤ÎÄÉÀפò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×Æâ¤Ç³äÅö¥µ¥¤¥È¾ðÊ󤬻ÈÍѤǤ­¤Ê¤¤¾ì¹ç¡¢¤³¤Î¥Õ¥é¥°¤ò\fBfalse\fR¤ËÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fBtrue\fR¤Ç¤¹¡£ + .RE + .PP + \-refs false|true + .RS 4 +-¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤ÎÄÉÀפò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fItrue\fR¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Ò¡¼¥×Æâ¤Î¤¹¤Ù¤Æ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤Ä¤¤¤Æ¡¢¥Ð¥Ã¥¯¥Ý¥¤¥ó¥¿(»ØÄꤵ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Ý¥¤¥ó¥È¤·¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¡£»²¾È¼Ô¤Þ¤¿¤Ï¼õ¿®»²¾È¤È¤â¸Æ¤Ð¤ì¤ë)¤¬·×»»¤µ¤ì¤Þ¤¹¡£ ++¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤ÎÄÉÀפò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fBtrue\fR¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Ò¡¼¥×Æâ¤Î¤¹¤Ù¤Æ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤Ä¤¤¤Æ¡¢¥Ð¥Ã¥¯¥Ý¥¤¥ó¥¿(»ØÄꤵ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Ý¥¤¥ó¥È¤·¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¡£»²¾È¼Ô¤Þ¤¿¤Ï¼õ¿®»²¾È¤È¤â¸Æ¤Ð¤ì¤ë)¤¬·×»»¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-port \fIport\-number\fR + .RS 4 +-\fIjhat\fR¤ÎHTTP¥µ¡¼¥Ð¡¼¤Î¥Ý¡¼¥È¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï7000¤Ç¤¹¡£ ++\fBjhat\fR¤ÎHTTP¥µ¡¼¥Ð¡¼¤Î¥Ý¡¼¥È¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï7000¤Ç¤¹¡£ + .RE + .PP + \-exclude \fIexclude\-file\fR + .RS 4 +-Åþã²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤ÎÌä¹ç¤»¤«¤é½ü³°¤¹¤ëɬÍפ¬¤¢¤ë¥Ç¡¼¥¿¡¦¥á¥ó¥Ð¡¼¤Î°ìÍ÷¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ë\fIjava\&.lang\&.String\&.value\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢ÆÃÄê¤Î¥ª¥Ö¥¸¥§¥¯¥È\fIo\fR¤«¤éÅþã²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¥ê¥¹¥È¤ò·×»»¤¹¤ëºÝ¤Ë¡¢\fIjava\&.lang\&.String\&.value\fR¥Õ¥£¡¼¥ë¥É¤Ë´ØÏ¢¤¹¤ë»²¾È¥Ñ¥¹¤¬¹Í褵¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£ ++Åþã²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤ÎÌä¹ç¤»¤«¤é½ü³°¤¹¤ëɬÍפ¬¤¢¤ë¥Ç¡¼¥¿¡¦¥á¥ó¥Ð¡¼¤Î°ìÍ÷¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ë\fBjava\&.lang\&.String\&.value\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢ÆÃÄê¤Î¥ª¥Ö¥¸¥§¥¯¥È\fBo\fR¤«¤éÅþã²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¥ê¥¹¥È¤ò·×»»¤¹¤ëºÝ¤Ë¡¢\fBjava\&.lang\&.String\&.value\fR¥Õ¥£¡¼¥ë¥É¤Ë´ØÏ¢¤¹¤ë»²¾È¥Ñ¥¹¤¬¹Í褵¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-baseline \fIexclude\-file\fR +@@ -172,7 +174,7 @@ + .PP + \-J\fIflag\fR + .RS 4 +-\fIjhat\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava²¾ÁÛ¥Þ¥·¥ó¤Ë\fIflag\fR¤òÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢512M¥Ð¥¤¥È¤ÎºÇÂç¥Ò¡¼¥×¡¦¥µ¥¤¥º¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fI\-J\-Xmx512m\fR¤È¤·¤Þ¤¹¡£ ++\fBjhat\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava Virtual Machine¤Ë\fBflag\fR¤òÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢512M¥Ð¥¤¥È¤ÎºÇÂç¥Ò¡¼¥×¡¦¥µ¥¤¥º¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fB\-J\-Xmx512m\fR¤È¤·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/jinfo.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jinfo.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jinfo +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jinfo ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jinfo" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jinfo \- ¹½À®¾ðÊó¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjinfo\fR [ \fIoption\fR ] \fIpid\fR ++\fBjinfo\fR [ \fIoption\fR ] \fIpid\fR + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjinfo\fR [ \fIoption \fR] \fIexecutable core\fR ++\fBjinfo\fR [ \fIoption \fR] \fIexecutable core\fR + .fi + .if n \{\ + .RE +@@ -76,7 +78,7 @@ + .RS 4 + .\} + .nf +-\fIjinfo\fR [ \fIoption \fR] \fI[ servier\-id ] remote\-hostname\-or\-IP\fR ++\fBjinfo\fR [ \fIoption \fR] \fI[ servier\-id ] remote\-hostname\-or\-IP\fR + .fi + .if n \{\ + .RE +@@ -84,7 +86,7 @@ + .PP + \fI¥ª¥×¥·¥ç¥ó\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIpid\fR +@@ -104,7 +106,7 @@ + .PP + \fIremote\-hostname\-or\-IP\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fI¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fIIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fB¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fBIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIserver\-id\fR +@@ -113,35 +115,35 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjinfo\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ÎJava¹½À®¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£¹½À®¾ðÊó¤Ë¤Ï¡¢Java¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤ÈJava²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJVM¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fI\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fIjinfo\fR +-\fI\-J\-d64 \-sysprops pid\fR¡£ ++\fBjinfo\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ÎJava¹½À®¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£¹½À®¾ðÊó¤Ë¤Ï¡¢Java¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤ÈJava Virtual Machine (JVM)¤Î¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJVM¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fB\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fBjinfo\fR ++\fB\-J\-d64 \-sysprops pid\fR¡£ + .PP +-¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fIdbgeng\&.dll\fR¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fIPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fIset PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR¤Ç¤¹¡£ ++¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fBdbgeng\&.dll\fR¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fBPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fBset PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR¤Ç¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + no\-option + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤ò¡¢¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£Ì¾¤ÈÃͤΥڥ¢¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤ò¡¢¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£Ì¾¤ÈÃͤΥڥ¢¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-flag \fIname\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤Î̾Á°¤ÈÃͤò½ÐÎϤ·¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤Î̾Á°¤ÈÃͤò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-flag \fI[+|\-]name\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥Ö¡¼¥ë·¿¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤òÍ­¸ú¤Þ¤¿¤Ï̵¸ú¤Ë¤·¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥Ö¡¼¥ë·¿¤Î¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤òÍ­¸ú¤Þ¤¿¤Ï̵¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .PP + \-flag \fIname=value\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤ò»ØÄꤵ¤ì¤¿ÃͤËÀßÄꤷ¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤ò»ØÄꤵ¤ì¤¿ÃͤËÀßÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-flags + .RS 4 +-JVM¤ËÅϤµ¤ì¤ë¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤ò½ÐÎϤ·¤Þ¤¹¡£ ++JVM¤ËÅϤµ¤ì¤ë¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-sysprops +--- ./jdk/src/linux/doc/man/ja/jjs.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jjs.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jjs +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jjs ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jjs" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jjs \- Nashorn¥¨¥ó¥¸¥ó¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjjs\fR [\fIoptions\fR] [\fIscript\-files\fR] [\-\- \fIarguments\fR] ++\fB\fBjjs\fR\fR\fB [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIscript\-files\fR\fR\fB] [\-\- \fR\fB\fIarguments\fR\fR\fB]\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¶õÇòʸ»ú¤Ç¶èÀÚ¤é¤ì¤¿¡¢\fIjjs\fR¥³¥Þ¥ó¥É¤Î1¤Ä°Ê¾å¤Î¥ª¥×¥·¥ç¥ó¡£¾ÜºÙ¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¶õÇòʸ»ú¤Ç¶èÀÚ¤é¤ì¤¿¡¢\fBjjs\fR¥³¥Þ¥ó¥É¤Î1¤Ä°Ê¾å¤Î¥ª¥×¥·¥ç¥ó¡£¾ÜºÙ¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIscript\-files\fR +@@ -74,53 +76,61 @@ + .PP + \fIarguments\fR + .RS 4 +-Æó½Å¥Ï¥¤¥Õ¥ó¡¦¥Þ¡¼¥«¡¼(\fI\-\-\fR)¤Î¸å¤Î¤¹¤Ù¤Æ¤ÎÃͤ¬¡¢°ú¿ô¤È¤·¤Æ¥¹¥¯¥ê¥×¥È¤Þ¤¿¤ÏÂÐÏ÷¿¥·¥§¥ë¤ËÅϤµ¤ì¤Þ¤¹¡£¤³¤ì¤é¤ÎÃͤˤÏ\fIarguments\fR¥×¥í¥Ñ¥Æ¥£¤ò»ÈÍѤ·¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹(Example 3¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£ ++Æó½Å¥Ï¥¤¥Õ¥ó¡¦¥Þ¡¼¥«¡¼(\fB\-\-\fR)¤Î¸å¤Î¤¹¤Ù¤Æ¤ÎÃͤ¬¡¢°ú¿ô¤È¤·¤Æ¥¹¥¯¥ê¥×¥È¤Þ¤¿¤ÏÂÐÏ÷¿¥·¥§¥ë¤ËÅϤµ¤ì¤Þ¤¹¡£¤³¤ì¤é¤ÎÃͤˤÏ\fBarguments\fR¥×¥í¥Ñ¥Æ¥£¤ò»ÈÍѤ·¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹(Example 3¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjjs\fR¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ä¡¼¥ë¤ò»ÈÍѤ·¤ÆNashorn¥¨¥ó¥¸¥ó¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ·¤Æ¡¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤ò²ò¼á¤·¤¿¤ê¡¢ÂÐÏ÷¿¥·¥§¥ë¤ò¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBjjs\fR¥³¥Þ¥ó¥É¹Ô¥Ä¡¼¥ë¤ò»ÈÍѤ·¤ÆNashorn¥¨¥ó¥¸¥ó¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ·¤Æ¡¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤ò²ò¼á¤·¤¿¤ê¡¢ÂÐÏ÷¿¥·¥§¥ë¤ò¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjjs\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤Ï¥¹¥¯¥ê¥×¥È¤¬Nashorn¤Ë¤è¤Ã¤Æ²ò¼á¤µ¤ì¤ë¾ò·ï¤òÀ©¸æ¤·¤Þ¤¹¡£ ++\fBjjs\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤Ï¥¹¥¯¥ê¥×¥È¤¬Nashorn¤Ë¤è¤Ã¤Æ²ò¼á¤µ¤ì¤ë¾ò·ï¤òÀ©¸æ¤·¤Þ¤¹¡£ + .PP +-\-ccs=\fIsize\fR, \-\-class\-cache\-size=\fIsize\fR ++\-ccs=\fIsize\fR ++.br ++\-\-class\-cache\-size=\fIsize\fR + .RS 4 +-¥¯¥é¥¹¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤ò¥Ð¥¤¥Èñ°Ì¤ÇÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È(KB)¤ò¼¨¤¹¤¿¤á¤Ë\fIk\fR¤Þ¤¿¤Ï\fIK\fR¤Îʸ»ú¤òÄɲä·¡¢¥á¥¬¥Ð¥¤¥È(MB)¤ò¼¨¤¹¤¿¤á¤Ë\fIm\fR¤Þ¤¿¤Ï\fIM\fR¤Îʸ»ú¤òÄɲä·¡¢¥®¥¬¥Ð¥¤¥È(GB)¤ò¼¨¤¹¤¿¤á¤Ë\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¹¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤Ï50¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤Ï¡¢1024¥Ð¥¤¥È(1 KB)¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤ò¥Ð¥¤¥Èñ°Ì¤ÇÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È(KB)¤ò¼¨¤¹¤¿¤á¤Ë\fBk\fR¤Þ¤¿¤Ï\fBK\fR¤Îʸ»ú¤òÄɲä·¡¢¥á¥¬¥Ð¥¤¥È(MB)¤ò¼¨¤¹¤¿¤á¤Ë\fBm\fR¤Þ¤¿¤Ï\fBM\fR¤Îʸ»ú¤òÄɲä·¡¢¥®¥¬¥Ð¥¤¥È(GB)¤ò¼¨¤¹¤¿¤á¤Ë\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¹¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤Ï50¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤Ï¡¢1024¥Ð¥¤¥È(1 KB)¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-css=100 +-\-css=1k ++\fB\-css=100\fR ++\fB\-css=1k\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-co, \-\-compile\-only ++\-co ++.br ++\-\-compile\-only + .RS 4 + ¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô¤»¤º¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .RE + .PP +-\-cp \fIpath\fR, \-\-classpath \fIpath\fR ++\-cp \fIpath\fR ++.br ++\-\-classpath \fIpath\fR + .RS 4 + ¥µ¥Ý¡¼¥È¤¹¤ë¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£Ê£¿ô¤Î¥Ñ¥¹¤òÀßÄꤹ¤ë¤Ë¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«¤êÊÖ¤¹¤«¡¢¤Þ¤¿¤Ï³Æ¥Ñ¥¹¤ò¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ + .RE + .PP + \-D\fIname\fR=\fIvalue\fR + .RS 4 +-¥×¥í¥Ñ¥Æ¥£Ì¾¤ËÃͤò³ä¤êÅö¤Æ¤ë¤³¤È¤Ç¡¢¥¹¥¯¥ê¥×¥È¤ËÅϤ¹¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤷ¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¡¢ÂÐÏ÷¿¥â¡¼¥É¤ÇNashorn¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢\fImyValue\fR¤ò\fImyKey\fR¤È¤¤¤¦Ì¾Á°¤Î¥×¥í¥Ñ¥Æ¥£¤Ë³ä¤êÅö¤Æ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++¥×¥í¥Ñ¥Æ¥£Ì¾¤ËÃͤò³ä¤êÅö¤Æ¤ë¤³¤È¤Ç¡¢¥¹¥¯¥ê¥×¥È¤ËÅϤ¹¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤷ¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¡¢ÂÐÏ÷¿¥â¡¼¥É¤ÇNashorn¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢\fBmyValue\fR¤ò\fBmyKey\fR¤È¤¤¤¦Ì¾Á°¤Î¥×¥í¥Ñ¥Æ¥£¤Ë³ä¤êÅö¤Æ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +->> \fBjjs \-DmyKey=myValue\fR +-jjs> \fBjava\&.lang\&.System\&.getProperty("myKey")\fR +-myValue +-jjs> ++\fB>> \fR\fB\fBjjs \-DmyKey=myValue\fR\fR ++\fBjjs> \fR\fB\fBjava\&.lang\&.System\&.getProperty("myKey")\fR\fR ++\fBmyValue\fR ++\fBjjs>\fR ++ + .fi + .if n \{\ + .RE +@@ -128,14 +138,16 @@ + ¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«¤êÊÖ¤·»ÈÍѤ¹¤ë¤È¡¢Ê£¿ô¤Î¥×¥í¥Ñ¥Æ¥£¤òÀßÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP +-\-d=\fIpath\fR, \-\-dump\-debug\-dir=\fIpath\fR ++\-d=\fIpath\fR ++.br ++\-\-dump\-debug\-dir=\fIpath\fR + .RS 4 + ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥À¥ó¥×¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-\-debug\-lines + .RS 4 +-¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¹ÔÈÖ¹æɽ¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fI\-\-debug\-lines=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¹ÔÈÖ¹æɽ¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fB\-\-debug\-lines=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-\-debug\-locals +@@ -143,14 +155,16 @@ + ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¥í¡¼¥«¥ëÊÑ¿ô¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP +-\-doe, \-\-dump\-on\-error ++\-doe ++.br ++\-\-dump\-on\-error + .RS 4 + ¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤È¤­¤Ë¡¢¥Õ¥ë¡¦¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢´Êñ¤Ê¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤Î¤ß¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \-\-early\-lvalue\-error + .RS 4 +-̵¸ú¤Êº¸ÊÕÃͼ°¤¬Áá´ü¥¨¥é¡¼¤È¤·¤Æ(¤Ä¤Þ¤ê¡¢¥³¡¼¥É¤¬²òÀϤµ¤ì¤ë¤È¤­¤Ë)Êó¹ð¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fI\-\-early\-lvalue\-error=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£Ìµ¸ú¤Ê¾ì¹ç¡¢Ìµ¸ú¤Êº¸ÊÕÃͼ°¤Ï¥³¡¼¥É¤¬¼Â¹Ô¤µ¤ì¤ë¤Þ¤ÇÊó¹ð¤µ¤ì¤Þ¤»¤ó¡£ ++̵¸ú¤Êº¸ÊÕÃͼ°¤¬Áá´ü¥¨¥é¡¼¤È¤·¤Æ(¤Ä¤Þ¤ê¡¢¥³¡¼¥É¤¬²òÀϤµ¤ì¤ë¤È¤­¤Ë)Êó¹ð¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fB\-\-early\-lvalue\-error=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£Ìµ¸ú¤Ê¾ì¹ç¡¢Ìµ¸ú¤Êº¸ÊÕÃͼ°¤Ï¥³¡¼¥É¤¬¼Â¹Ô¤µ¤ì¤ë¤Þ¤ÇÊó¹ð¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .PP + \-\-empty\-statements +@@ -158,7 +172,9 @@ + ¶õ¤Îʸ¤òJava¤ÎÃê¾Ý¹½Ê¸¥Ä¥ê¡¼¤ËÊݸ¤·¤Þ¤¹¡£ + .RE + .PP +-\-fv, \-\-fullversion ++\-fv ++.br ++\-\-fullversion + .RS 4 + ´°Á´¤ÊNashorn¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE +@@ -178,28 +194,31 @@ + ¥¹¥¯¥ê¥×¥È¤òJavaFX¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤È¤·¤Æµ¯Æ°¤·¤Þ¤¹¡£ + .RE + .PP +-\-h, \-help ++\-h ++.br ++\-help + .RS 4 + ¥ª¥×¥·¥ç¥ó¤Î¥ê¥¹¥È¤È¤½¤ÎÀâÌÀ¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-»ØÄꤷ¤¿\fIjava\fRµ¯Æ°¥ª¥×¥·¥ç¥ó¤òJVM¤ËÅϤ·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¡¢ÂÐÏ÷¿¥â¡¼¥É¤ÇNashorn¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢JVM¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëºÇÂç¥á¥â¥ê¡¼¤ò4 GB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++»ØÄꤷ¤¿\fBjava\fRµ¯Æ°¥ª¥×¥·¥ç¥ó¤òJVM¤ËÅϤ·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¡¢ÂÐÏ÷¿¥â¡¼¥É¤ÇNashorn¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢JVM¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëºÇÂç¥á¥â¥ê¡¼¤ò4 GB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +->> \fBjjs \-J\-Xmx4g\fR +-jjs> \fBjava\&.lang\&.Runtime\&.getRuntime()\&.maxMemory()\fR +-3817799680 +-jjs> ++\fB>> \fR\fB\fBjjs \-J\-Xmx4g\fR\fR ++\fBjjs> \fR\fB\fBjava\&.lang\&.Runtime\&.getRuntime()\&.maxMemory()\fR\fR ++\fB3817799680\fR ++\fBjjs>\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«¤êÊÖ¤·»ÈÍѤ¹¤ë¤È¡¢Ê£¿ô¤Î\fIjava\fR¥³¥Þ¥ó¥É¡¦¥ª¥×¥·¥ç¥ó¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«¤êÊÖ¤·»ÈÍѤ¹¤ë¤È¡¢Ê£¿ô¤Î\fBjava\fR¥³¥Þ¥ó¥É¡¦¥ª¥×¥·¥ç¥ó¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-\-lazy\-compilation +@@ -209,7 +228,7 @@ + .PP + \-\-loader\-per\-compile + .RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤´¤È¤Ë¿·¤·¤¤¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤òºîÀ®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fI\-\-loader\-per\-compile=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥ë¤´¤È¤Ë¿·¤·¤¤¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤òºîÀ®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fB\-\-loader\-per\-compile=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-\-log=\fIsubsystem\fR:\fIlevel\fR +@@ -220,7 +239,8 @@ + .RS 4 + .\} + .nf +-\-\-log=fields:finest,codegen:info ++\fB\-\-log=fields:finest,codegen:info\fR ++ + .fi + .if n \{\ + .RE +@@ -259,7 +279,7 @@ + .PP + \-\-print\-no\-newline + .RS 4 +-¤½¤Î¾¤Î\fI\-\-print*\fR¥ª¥×¥·¥ç¥ó¤Ç¶¯À©Åª¤Ë1¹Ô¤Ç½ÐÎϤ·¤Þ¤¹¡£ ++¤½¤Î¾¤Î\fB\-\-print*\fR¥ª¥×¥·¥ç¥ó¤Ç¶¯À©Åª¤Ë1¹Ô¤Ç½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-\-print\-parse +@@ -272,7 +292,9 @@ + µ­¹æɽ¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-pcs, \-\-profile\-callsites ++\-pcs ++.br ++\-\-profile\-callsites + .RS 4 + ¸Æ¤Ó½Ð¤·¥µ¥¤¥È¤Î¥×¥í¥Õ¥¡¥¤¥ë¡¦¥Ç¡¼¥¿¤ò¥À¥ó¥×¤·¤Þ¤¹¡£ + .RE +@@ -284,12 +306,12 @@ + .PP + \-\-stderr=\fIfilename\fR|\fIstream\fR|\fItty\fR + .RS 4 +-ɸ½à¥¨¥é¡¼¡¦¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¥¹¥È¥ê¡¼¥à(¤¿¤È¤¨¤Ð\fIstdout\fR)¤Ë¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥ÈüËö¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£ ++ɸ½à¥¨¥é¡¼¡¦¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¥¹¥È¥ê¡¼¥à(¤¿¤È¤¨¤Ð\fBstdout\fR)¤Ë¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥ÈüËö¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£ + .RE + .PP + \-\-stdout=\fIfilename\fR|\fIstream\fR|\fItty\fR + .RS 4 +-ɸ½à½ÐÎÏ¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¥¹¥È¥ê¡¼¥à(¤¿¤È¤¨¤Ð\fIstderr\fR)¤Ë¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥ÈüËö¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£ ++ɸ½à½ÐÎÏ¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¥¹¥È¥ê¡¼¥à(¤¿¤È¤¨¤Ð\fBstderr\fR)¤Ë¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥ÈüËö¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£ + .RE + .PP + \-strict +@@ -297,12 +319,16 @@ + ɸ½à(ECMAScript Edition 5\&.1)¤Ø¤Î½àµò¤ò¶¯²½¤¹¤ëstrict¥â¡¼¥É¤òÍ­¸ú¤Ë¤·¡¢¤³¤ì¤Ë¤è¤ê¶¦Ä̤Υ³¡¼¥Ç¥£¥ó¥°¡¦¥¨¥é¡¼¤ò´Êñ¤Ë¸¡½Ð¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP +-\-t=\fIzone\fR, \-timezone=\fIzone\fR ++\-t=\fIzone\fR ++.br ++\-timezone=\fIzone\fR + .RS 4 +-¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô¤ËÂФ·»ØÄꤷ¤¿¥¿¥¤¥à¥¾¡¼¥ó¤òÀßÄꤷ¤Þ¤¹¡£OS¤ÇÀßÄꤵ¤ì¤¿¥¿¥¤¥à¥¾¡¼¥ó¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¡¢\fIDate\fR¥ª¥Ö¥¸¥§¥¯¥È¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô¤ËÂФ·»ØÄꤷ¤¿¥¿¥¤¥à¡¦¥¾¡¼¥ó¤òÀßÄꤷ¤Þ¤¹¡£OS¤ÇÀßÄꤵ¤ì¤¿¥¿¥¤¥à¡¦¥¾¡¼¥ó¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¡¢\fBDate\fR¥ª¥Ö¥¸¥§¥¯¥È¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-tcs=\fIparameter\fR, \-\-trace\-callsites=\fIparameter\fR ++\-tcs=\fIparameter\fR ++.br ++\-\-trace\-callsites=\fIparameter\fR + .RS 4 + ¸Æ½Ð¤·¥µ¥¤¥È¤Î¥È¥ì¡¼¥¹¤Î¥â¡¼¥É¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£»ÈÍѲÄǽ¤Ê¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP +@@ -327,60 +353,71 @@ + ¥Ð¥¤¥È¥³¡¼¥É¤ò¼Â¹Ô¤¹¤ëÁ°¤Ë¸¡¾Ú¤·¤Þ¤¹¡£ + .RE + .PP +-\-v, \-version ++\-v ++.br ++\-version + .RS 4 + Nashorn¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-xhelp + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Î³ÈÄ¥¥Ø¥ë¥×¤ò½ÐÎϤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Î³ÈÄ¥¥Ø¥ë¥×¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .SH "Îã" + .PP +-\fBExample 1\fR, Nashorn¤ò»ÈÍѤ·¤¿¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô ++\fBÎã 1\fR ++.br ++Nashorn¤ò»ÈÍѤ·¤¿¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jjs script\&.js ++\fBjjs script\&.js\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ÂÐÏ÷¿¥â¡¼¥É¤Ç¤ÎNashorn¤Î¼Â¹Ô ++\fBÎã 2\fR ++.br ++ÂÐÏ÷¿¥â¡¼¥É¤Ç¤ÎNashorn¤Î¼Â¹Ô + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +->> \fBjjs\fR +-jjs> \fBprintln("Hello, World!")\fR +-Hello, World! +-jjs> \fBquit()\fR +->> ++\fB>> \fR\fB\fBjjs\fR\fR ++\fBjjs> \fR\fB\fBprintln("Hello, World!")\fR\fR ++\fBHello, World!\fR ++\fBjjs> \fR\fB\fBquit()\fR\fR ++\fB>>\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, Nashorn¤Ø¤Î°ú¿ô¤ÎÅϤ· ++\fBÎã 3\fR ++.br ++Nashorn¤Ø¤Î°ú¿ô¤ÎÅϤ· + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +->> \fBjjs \-\- a b c\fR +-jjs> \fBarguments\&.join(", ")\fR +-a, b, c +-jjs> ++\fB>> \fR\fB\fBjjs \-\- a b c\fR\fR ++\fBjjs> \fR\fB\fBarguments\&.join(", ")\fR\fR ++\fBa, b, c\fR ++\fBjjs>\fR ++ + .fi + .if n \{\ + .RE +@@ -388,7 +425,7 @@ + .RE + .SH "´ØÏ¢¹àÌÜ" + .PP +-\fIjrunscript\fR ++\fBjrunscript\fR + .br + 'pl 8.5i + 'bp +--- ./jdk/src/linux/doc/man/ja/jmap.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jmap.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jmap +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jmap ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jmap" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jmap \- ¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î¡¢¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥á¥â¥ê¡¼¡¦¥Þ¥Ã¥×¤Þ¤¿¤Ï¥Ò¡¼¥×¡¦¥á¥â¥ê¡¼¤Î¾ÜºÙ¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjmap\fR [ \fIoptions\fR ] \fIpid\fR ++\fBjmap\fR [ \fIoptions\fR ] \fIpid\fR + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjmap\fR [ \fIoptions\fR ] \fIexecutable\fR \fIcore\fR ++\fBjmap\fR [ \fIoptions\fR ] \fIexecutable\fR \fIcore\fR + .fi + .if n \{\ + .RE +@@ -76,7 +78,7 @@ + .RS 4 + .\} + .nf +-\fIjmap\fR [ \fIoptions\fR ] [ \fIpid\fR ] \fIserver\-id\fR@ ] \fIremote\-hostname\-or\-IP\fR ++\fBjmap\fR [ \fIoptions\fR ] [ \fIpid\fR ] \fIserver\-id\fR@ ] \fIremote\-hostname\-or\-IP\fR + .fi + .if n \{\ + .RE +@@ -84,7 +86,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIpid\fR +@@ -104,7 +106,7 @@ + .PP + \fIremote\-hostname\-or\-IP\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fI¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fIIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fB¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fBIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIserver\-id\fR +@@ -113,22 +115,22 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjmap\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î¡¢¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥á¥â¥ê¡¼¡¦¥Þ¥Ã¥×¤Þ¤¿¤Ï¥Ò¡¼¥×¡¦¥á¥â¥ê¡¼¤Î¾ÜºÙ¤ò½ÐÎϤ·¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJava²¾ÁÛ¥Þ¥·¥ó(JVM)¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fI\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fIjmap\fR +-\fI\-J\-d64 \-heap pid\fR¡£ ++\fBjmap\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î¡¢¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥á¥â¥ê¡¼¡¦¥Þ¥Ã¥×¤Þ¤¿¤Ï¥Ò¡¼¥×¡¦¥á¥â¥ê¡¼¤Î¾ÜºÙ¤ò½ÐÎϤ·¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJava Virtual Machine (JVM)¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fB\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fBjmap\fR ++\fB\-J\-d64 \-heap pid\fR¡£ + .PP + \fBÃí°Õ:\fR +-¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fIdbgeng\&.dll\fR¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fIPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ë\fIjvm\&.dll\fR¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fIset PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR¡£ ++¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fBdbgeng\&.dll\fR¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fBPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ë\fBjvm\&.dll\fR¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fBset PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-<¥ª¥×¥·¥ç¥ó¤Ê¤·> ++<no option> + .RS 4 +-¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¡¢\fIjmap\fR¥³¥Þ¥ó¥É¤Ï¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Þ¥Ã¥Ô¥ó¥°¤ò½ÐÎϤ·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈJVM¤Ë¥í¡¼¥É¤µ¤ì¤¿¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¤´¤È¤Ë¡¢³«»Ï¥¢¥É¥ì¥¹¡¢¥Þ¥Ã¥Ô¥ó¥°¤Î¥µ¥¤¥º¤ª¤è¤Ó¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Õ¥ë¥Ñ¥¹¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤³¤ÎÆ°ºî¤Ï¡¢Oracle Solaris +-\fIpmap\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÈÎà»÷¤·¤Æ¤¤¤Þ¤¹¡£ ++¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¡¢\fBjmap\fR¥³¥Þ¥ó¥É¤Ï¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Þ¥Ã¥Ô¥ó¥°¤ò½ÐÎϤ·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈJVM¤Ë¥í¡¼¥É¤µ¤ì¤¿¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¤´¤È¤Ë¡¢³«»Ï¥¢¥É¥ì¥¹¡¢¥Þ¥Ã¥Ô¥ó¥°¤Î¥µ¥¤¥º¤ª¤è¤Ó¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Õ¥ë¥Ñ¥¹¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤³¤ÎÆ°ºî¤Ï¡¢Oracle Solaris ++\fBpmap\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÈÎà»÷¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-dump:[live,] format=b, file=\fIfilename\fR + .RS 4 +-Java¥Ò¡¼¥×¤ò\fIhprof\fR¥Ð¥¤¥Ê¥ê·Á¼°¤Ç\fIfilename\fR¤Ë¥À¥ó¥×¤·¤Þ¤¹¡£\fIlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¤¬¡¢»ØÄꤷ¤¿¾ì¹ç¡¢¥Ò¡¼¥×Æâ¤Î¥¢¥¯¥Æ¥£¥Ö¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¤ß¤¬¥À¥ó¥×¤µ¤ì¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢jhat(1)¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÀ¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¤Þ¤¹¡£ ++Java¥Ò¡¼¥×¤ò\fBhprof\fR¥Ð¥¤¥Ê¥ê·Á¼°¤Ç\fBfilename\fR¤Ë¥À¥ó¥×¤·¤Þ¤¹¡£\fBlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¤¬¡¢»ØÄꤷ¤¿¾ì¹ç¡¢¥Ò¡¼¥×Æâ¤Î¥¢¥¯¥Æ¥£¥Ö¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¤ß¤¬¥À¥ó¥×¤µ¤ì¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢jhat(1)¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÀ¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¤Þ¤¹¡£ + .RE + .PP + \-finalizerinfo +@@ -143,7 +145,7 @@ + .PP + \-histo[:live] + .RS 4 +-¥Ò¡¼¥×¤Î¥Ò¥¹¥È¥°¥é¥à¤ò½ÐÎϤ·¤Þ¤¹¡£Java¥¯¥é¥¹¤´¤È¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¡¢¥Ð¥¤¥Èñ°Ì¤Ç¤Î¥á¥â¥ê¡¼¡¦¥µ¥¤¥º¡¢¤ª¤è¤Ó´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£JVM¤ÎÆâÉô¥¯¥é¥¹Ì¾¤Ï¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ÎÀÜƬ¼­¤òÉÕ¤±¤Æ½ÐÎϤµ¤ì¤Þ¤¹¡£\fIlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¤ß¤¬¥«¥¦¥ó¥È¤µ¤ì¤Þ¤¹¡£ ++¥Ò¡¼¥×¤Î¥Ò¥¹¥È¥°¥é¥à¤ò½ÐÎϤ·¤Þ¤¹¡£Java¥¯¥é¥¹¤´¤È¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¡¢¥Ð¥¤¥Èñ°Ì¤Ç¤Î¥á¥â¥ê¡¼¡¦¥µ¥¤¥º¡¢¤ª¤è¤Ó´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£JVM¤ÎÆâÉô¥¯¥é¥¹Ì¾¤Ï¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ÎÀÜƬ¼­¤òÉÕ¤±¤Æ½ÐÎϤµ¤ì¤Þ¤¹¡£\fBlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¤ß¤¬¥«¥¦¥ó¥È¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-clstats +@@ -153,7 +155,7 @@ + .PP + \-F + .RS 4 +-¶¯À©¤·¤Þ¤¹¡£PID¤¬±þÅú¤·¤Ê¤¤¤È¤­¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fIjmap \-dump\fR¤Þ¤¿¤Ï\fIjmap \-histo\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢\fIlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£ ++¶¯À©¤·¤Þ¤¹¡£PID¤¬±þÅú¤·¤Ê¤¤¤È¤­¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fBjmap \-dump\fR¤Þ¤¿¤Ï\fBjmap \-histo\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢\fBlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .PP + \-h +@@ -168,7 +170,7 @@ + .PP + \-J\fIflag\fR + .RS 4 +-\fIjmap\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava²¾ÁÛ¥Þ¥·¥ó¤Ë\fIflag\fR¤òÅϤ·¤Þ¤¹¡£ ++\fBjmap\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava Virtual Machine¤Ë\fBflag\fR¤òÅϤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/jps.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jps.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jps +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jps ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jps" "1" "2013ǯ11·î21Æü" "JDK 8" "¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jps \- ¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¾å¤Ç·×¬¤µ¤ì¤¿Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjps\fR [ \fIoptions\fR ] [ \fIhostid\fR ] ++\fBjps\fR [ \fIoptions\fR ] [ \fIhostid\fR ] + .fi + .if n \{\ + .RE +@@ -64,41 +66,41 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIhostid\fR + .RS 4 +-¥×¥í¥»¥¹¡¦¥ì¥Ý¡¼¥È¤òÀ¸À®¤¹¤ë¥Û¥¹¥È¤Î¼±Ê̻ҡ£\fIhostid\fR¤Ë¤Ï¡¢ÄÌ¿®¥×¥í¥È¥³¥ë¡¢¥Ý¡¼¥ÈÈֹ桢¼ÂÁõ¤Ë¸ÇÍ­¤Ê¾¤Î¥Ç¡¼¥¿¤ò»ØÄꤷ¤¿¥ª¥×¥·¥ç¥ó¡¦¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Û¥¹¥È¼±Ê̻Ҥò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥×¥í¥»¥¹¡¦¥ì¥Ý¡¼¥È¤òÀ¸À®¤¹¤ë¥Û¥¹¥È¤Î¼±Ê̻ҡ£\fBhostid\fR¤Ë¤Ï¡¢ÄÌ¿®¥×¥í¥È¥³¥ë¡¢¥Ý¡¼¥ÈÈֹ桢¼ÂÁõ¤Ë¸ÇÍ­¤Ê¾¤Î¥Ç¡¼¥¿¤ò»ØÄꤷ¤¿¥ª¥×¥·¥ç¥ó¡¦¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Û¥¹¥È¼±Ê̻Ҥò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¾å¤Ç·×¬¤µ¤ì¤¿Java HotSpot VM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤Ç¤­¤ë¥ì¥Ý¡¼¥È¾ðÊó¤Ï¡¢¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤¿JVM¤Ë´Ø¤¹¤ë¤â¤Î¤Ë¸ÂÄꤵ¤ì¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¾å¤Ç·×¬¤µ¤ì¤¿Java HotSpot VM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤Ç¤­¤ë¥ì¥Ý¡¼¥È¾ðÊó¤Ï¡¢¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤¿JVM¤Ë´Ø¤¹¤ë¤â¤Î¤Ë¸ÂÄꤵ¤ì¤Þ¤¹¡£ + .PP +-\fIhostid\fR¤ò»ØÄꤻ¤º¤Ë\fIjps\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ç·×¬¤µ¤ì¤¿JVM¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£\fIhostid\fR¤ò»ØÄꤷ¤Æµ¯Æ°¤·¤¿¾ì¹ç¡¢»ØÄꤵ¤ì¤¿¥×¥í¥È¥³¥ë¤È¥Ý¡¼¥È¤ò»ÈÍѤ·¤Æ¡¢»ØÄꤵ¤ì¤¿¥Û¥¹¥È¾å¤ÎJVM¤ò¸¡º÷¤·¤Þ¤¹¡£\fIjstatd\fR¥×¥í¥»¥¹¤¬¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤵ¤ì¤Þ¤¹¡£ ++\fBhostid\fR¤ò»ØÄꤻ¤º¤Ë\fBjps\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ç·×¬¤µ¤ì¤¿JVM¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£\fBhostid\fR¤ò»ØÄꤷ¤Æµ¯Æ°¤·¤¿¾ì¹ç¡¢»ØÄꤵ¤ì¤¿¥×¥í¥È¥³¥ë¤È¥Ý¡¼¥È¤ò»ÈÍѤ·¤Æ¡¢»ØÄꤵ¤ì¤¿¥Û¥¹¥È¾å¤ÎJVM¤ò¸¡º÷¤·¤Þ¤¹¡£\fBjstatd\fR¥×¥í¥»¥¹¤¬¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤵ¤ì¤Þ¤¹¡£ + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤Ç·×¬¤µ¤ì¤¿³ÆJVM¤Ë¤Ä¤¤¤Æ¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҡ¢¤Ä¤Þ¤ê\fIlvmid\fR¤ò¥ì¥Ý¡¼¥È¤·¤Þ¤¹¡£\fIlvmid\fR¤Ï¡¢°ìÈÌŪ¤Ë¤ÏJVM¥×¥í¥»¥¹¤ËÂФ¹¤ë¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥×¥í¥»¥¹¼±Ê̻ҤǤ¹¤¬¡¢É¬¤º¤·¤â¤½¤¦¤Ç¤¢¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fIjps\fR¤Ë¤è¤Ã¤Æ¡¢³ÆJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fIlvmid\fR¤¬°ìÍ÷ɽ¼¨¤µ¤ì¡¢¤½¤ì¤¾¤ì¤Ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤¬´Êñ¤Ê·Á¼°¤Ç¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î´Êñ¤Ê·Á¼°¤Î¥¯¥é¥¹Ì¾¤ÈJAR¥Õ¥¡¥¤¥ë̾¤Ç¤Ï¡¢¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸¾ðÊó¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¾ðÊ󤬾Êά¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤Ç·×¬¤µ¤ì¤¿³ÆJVM¤Ë¤Ä¤¤¤Æ¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҡ¢¤Ä¤Þ¤ê\fBlvmid\fR¤ò¥ì¥Ý¡¼¥È¤·¤Þ¤¹¡£\fBlvmid\fR¤Ï¡¢°ìÈÌŪ¤Ë¤ÏJVM¥×¥í¥»¥¹¤ËÂФ¹¤ë¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥×¥í¥»¥¹¼±Ê̻ҤǤ¹¤¬¡¢É¬¤º¤·¤â¤½¤¦¤Ç¤¢¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fBjps\fR¤Ë¤è¤Ã¤Æ¡¢³ÆJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fBlvmid\fR¤¬°ìÍ÷ɽ¼¨¤µ¤ì¡¢¤½¤ì¤¾¤ì¤Ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤¬´Êñ¤Ê·Á¼°¤Ç¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î´Êñ¤Ê·Á¼°¤Î¥¯¥é¥¹Ì¾¤ÈJAR¥Õ¥¡¥¤¥ë̾¤Ç¤Ï¡¢¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸¾ðÊó¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¾ðÊ󤬾Êά¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æmain¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤È°ú¿ô¤ò¸¡º÷¤·¤Þ¤¹¡£Æȼ«¤Îµ¯Æ°¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¥¿¡¼¥²¥Ã¥ÈJVM¤òµ¯Æ°¤·¤¿¾ì¹ç¤Ï¡¢\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤È°ú¿ô¤ÏÍøÍѤǤ­¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fIjps\fR¥³¥Þ¥ó¥É¤Ï¡¢\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤È°ú¿ô¤ËÂФ·¤Æ¡¢Ê¸»úÎó\fIUnknown\fR¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æmain¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤È°ú¿ô¤ò¸¡º÷¤·¤Þ¤¹¡£Æȼ«¤Îµ¯Æ°¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¥¿¡¼¥²¥Ã¥ÈJVM¤òµ¯Æ°¤·¤¿¾ì¹ç¤Ï¡¢\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤È°ú¿ô¤ÏÍøÍѤǤ­¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fBjps\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤È°ú¿ô¤ËÂФ·¤Æ¡¢Ê¸»úÎó\fBUnknown\fR¤ò½ÐÎϤ·¤Þ¤¹¡£ + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¤ëJVM¤Î¥ê¥¹¥È¤Ï¡¢¤³¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¥×¥ê¥ó¥·¥Ñ¥ë¤ËÍ¿¤¨¤é¤ì¤¿¥¢¥¯¥»¥¹¸¢¤Ë´ð¤Å¤­¡¢À©¸Â¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥àÆȼ«¤Î¥¢¥¯¥»¥¹À©¸æµ¡¹½¤Ë¤è¤ë·èÄê¤Ë´ð¤Å¤¤¤Æ¡¢¥×¥ê¥ó¥·¥Ñ¥ë¤Ë¥¢¥¯¥»¥¹¸¢¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤ëJVM¤Î¤ß¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¤ëJVM¤Î¥ê¥¹¥È¤Ï¡¢¤³¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¥×¥ê¥ó¥·¥Ñ¥ë¤ËÍ¿¤¨¤é¤ì¤¿¥¢¥¯¥»¥¹¸¢¤Ë´ð¤Å¤­¡¢À©¸Â¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥àÆȼ«¤Î¥¢¥¯¥»¥¹À©¸æµ¡¹½¤Ë¤è¤ë·èÄê¤Ë´ð¤Å¤¤¤Æ¡¢¥×¥ê¥ó¥·¥Ñ¥ë¤Ë¥¢¥¯¥»¥¹¸¢¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤ëJVM¤Î¤ß¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥³¥Þ¥ó¥É¤Î½ÐÎϤòÊѹ¹¤¹¤ë¥ª¥×¥·¥ç¥ó¤¬Â¿¿ô¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¾­Íè¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Êѹ¹¤Þ¤¿¤ÏÇѻߤµ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥³¥Þ¥ó¥É¤Î½ÐÎϤòÊѹ¹¤¹¤ë¥ª¥×¥·¥ç¥ó¤¬Â¿¿ô¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¾­Íè¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Êѹ¹¤Þ¤¿¤ÏÇѻߤµ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .PP + \-q + .RS 4 +-¥¯¥é¥¹Ì¾¡¢JAR¥Õ¥¡¥¤¥ë̾¡¢¤ª¤è¤Ó\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤¿°ú¿ô¤Î½ÐÎϤòÍÞÀ©¤·¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҤΰìÍ÷¤Î¤ß¤òÀ¸À®¤·¤Þ¤¹¡£ ++¥¯¥é¥¹Ì¾¡¢JAR¥Õ¥¡¥¤¥ë̾¡¢¤ª¤è¤Ó\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤¿°ú¿ô¤Î½ÐÎϤòÍÞÀ©¤·¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҤΰìÍ÷¤Î¤ß¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP + \-m + .RS 4 +-\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î½ÐÎϤϡ¢ÁȤ߹þ¤Þ¤ì¤Æ¤¤¤ëJVM¤ËÂФ·¤Æ\fInull\fR¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¡£ ++\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î½ÐÎϤϡ¢ÁȤ߹þ¤Þ¤ì¤Æ¤¤¤ëJVM¤ËÂФ·¤Æ\fBnull\fR¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-l + .RS 4 +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fImain\fR¥¯¥é¥¹¤Î¥Õ¥ë¡¦¥Ñ¥Ã¥±¡¼¥¸Ì¾¡¢¤Þ¤¿¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Õ¥ë¥Ñ¥¹Ì¾¤ò½ÐÎϤ·¤Þ¤¹¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fBmain\fR¥¯¥é¥¹¤Î¥Õ¥ë¡¦¥Ñ¥Ã¥±¡¼¥¸Ì¾¡¢¤Þ¤¿¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Õ¥ë¥Ñ¥¹Ì¾¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-v +@@ -111,19 +113,20 @@ + ¥¯¥é¥¹Ì¾¡¢JAR¥Õ¥¡¥¤¥ë̾¡¢¤ª¤è¤Ómai¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤¿°ú¿ô¤Î½ÐÎϤòÍÞÀ©¤·¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҤΰìÍ÷¤Î¤ß¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP +-\-J\fIoption\fR ++\-J\fBoption\fR + .RS 4 +-JVM¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë\fI¥ª¥×¥·¥ç¥ó\fR¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++JVM¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë\fB¥ª¥×¥·¥ç¥ó\fR¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥Û¥¹¥È¼±ÊÌ»Ò" + .PP +-¥Û¥¹¥È¼±Ê̻ҡ¢¤Ä¤Þ¤ê\fIhostid\fR¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¹¡£\fIhostid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ ++¥Û¥¹¥È¼±Ê̻ҡ¢¤Ä¤Þ¤ê\fBhostid\fR¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¹¡£\fBhostid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-[protocol:][[//]hostname][:port][/servername] ++\fB[protocol:][[//]hostname][:port][/servername]\fR ++ + .fi + .if n \{\ + .RE +@@ -131,45 +134,46 @@ + .PP + \fIprotocol\fR + .RS 4 +-ÄÌ¿®¥×¥í¥È¥³¥ë¤Ç¤¹¡£\fIprotocol\fR¤¬¾Êά¤µ¤ì¡¢\fIhostname\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥È¥³¥ë¤¬¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£¥×¥í¥È¥³¥ë¤¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥È¥³¥ë¤Ï\fIrmi\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ÄÌ¿®¥×¥í¥È¥³¥ë¤Ç¤¹¡£\fBprotocol\fR¤¬¾Êά¤µ¤ì¡¢\fBhostname\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥È¥³¥ë¤¬¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£¥×¥í¥È¥³¥ë¤¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥È¥³¥ë¤Ï\fBrmi\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + hostname + .RS 4 +-¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¤ò¼¨¤¹¥Û¥¹¥È̾¤Þ¤¿¤ÏIP¥¢¥É¥ì¥¹¤Ç¤¹¡£\fIhostname\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¤Ï¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¤ò¼¨¤¹¥Û¥¹¥È̾¤Þ¤¿¤ÏIP¥¢¥É¥ì¥¹¤Ç¤¹¡£\fBhostname\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¤Ï¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + port + .RS 4 +-¥ê¥â¡¼¥È¡¦¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ë¤¿¤á¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¤¹¡£\fIhostname\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fIprotocol\fR¥Ñ¥é¥á¡¼¥¿¤¬¡¢ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤ò»ØÄꤷ¤Æ¤¤¤ë¾ì¹ç¡¢\fIport\fR¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fIport\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î +-\fIrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢\fIport\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Îrmiregistry¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¼¨¤·¤Þ¤¹¡£\fIport\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fIprotocol\fR¥Ñ¥é¥á¡¼¥¿¤¬\fIrmi\fR¤ò¼¨¤·¤Æ¤¤¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(1099)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥ê¥â¡¼¥È¡¦¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ë¤¿¤á¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¤¹¡£\fBhostname\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fBprotocol\fR¥Ñ¥é¥á¡¼¥¿¤¬¡¢ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤ò»ØÄꤷ¤Æ¤¤¤ë¾ì¹ç¡¢\fBport\fR¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fBport\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î ++\fBrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢\fBport\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Îrmiregistry¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¼¨¤·¤Þ¤¹¡£\fBport\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fBprotocol\fR¥Ñ¥é¥á¡¼¥¿¤¬\fBrmi\fR¤ò¼¨¤·¤Æ¤¤¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(1099)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .RE + .PP + servername + .RS 4 +-¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fIrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤ÎRMI¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤ò¼¨¤¹Ê¸»úÎó¤Ë¤Ê¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fIjstatd\fR¥³¥Þ¥ó¥É¤Î\fI\-n\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fBrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤ÎRMI¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤ò¼¨¤¹Ê¸»úÎó¤Ë¤Ê¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fBjstatd\fR¥³¥Þ¥ó¥É¤Î\fB\-n\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "½ÐÎÏ¥Õ¥©¡¼¥Þ¥Ã¥È" + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤϡ¢¼¡¤Î¥Ñ¥¿¡¼¥ó¤Ë½¾¤¤¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤϡ¢¼¡¤Î¥Ñ¥¿¡¼¥ó¤Ë½¾¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ] ++\fBlvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤¹¤Ù¤Æ¤Î½ÐÎϥȡ¼¥¯¥ó¤Ï¶õÇòʸ»ú¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£\fIarg\fRÃͤÎÃæ¤Ç¶õÇò¤ò»ÈÍѤ¹¤ë¤È¡¢¼ÂºÝ¤ÎÄê°ÌÃ֥ѥé¥á¡¼¥¿¤Ë°ú¿ô¤ò¥Þ¥Ã¥Ô¥ó¥°¤·¤è¤¦¤È¤¹¤ë¤È¤­¤Ë¡¢¤¢¤¤¤Þ¤¤¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¤¹¤Ù¤Æ¤Î½ÐÎϥȡ¼¥¯¥ó¤Ï¶õÇòʸ»ú¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£\fBarg\fRÃͤÎÃæ¤Ç¶õÇò¤ò»ÈÍѤ¹¤ë¤È¡¢¼ÂºÝ¤ÎÄê°ÌÃ֥ѥé¥á¡¼¥¿¤Ë°ú¿ô¤ò¥Þ¥Ã¥Ô¥ó¥°¤·¤è¤¦¤È¤¹¤ë¤È¤­¤Ë¡¢¤¢¤¤¤Þ¤¤¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤³¤Î·Á¼°¤ÏÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¡¢\fIjps\fR¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤ÏºîÀ®¤·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£\fIjps\fR½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤òºîÀ®¤¹¤ë¤È¡¢¤³¤Î¥Ä¡¼¥ë¤Î¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¡¢ºîÀ®¤·¤¿¥¹¥¯¥ê¥×¥È¤ÎÊѹ¹¤¬É¬Íפˤʤë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤³¤Î·Á¼°¤ÏÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¡¢\fBjps\fR¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤ÏºîÀ®¤·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£\fBjps\fR½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤òºîÀ®¤¹¤ë¤È¡¢¤³¤Î¥Ä¡¼¥ë¤Î¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¡¢ºîÀ®¤·¤¿¥¹¥¯¥ê¥×¥È¤ÎÊѹ¹¤¬É¬Íפˤʤë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .SH "Îã" + .PP +-¤³¤Î¹à¤Ç¤Ï¡¢\fIjps\fR¥³¥Þ¥ó¥É¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£ ++¤³¤Î¹à¤Ç¤Ï¡¢\fBjps\fR¥³¥Þ¥ó¥É¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£ + .PP + ¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤¹¤ë¾ì¹ç: + .sp +@@ -177,38 +181,41 @@ + .RS 4 + .\} + .nf +-jps +-18027 Java2Demo\&.JAR +-18032 jps +-18005 jstat ++\fBjps\fR ++\fB18027 Java2Demo\&.JAR\fR ++\fB18032 jps\fR ++\fB18005 jstat\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fIjstat\fR¥µ¡¼¥Ð¡¼¤È¡¢¤½¤ÎÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤Þ¤¿¤ÏÊ̤γ°Éôrmiregistry¥×¥í¥»¥¹¤Î¤¤¤º¤ì¤«¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Ø¤ÎÍ­¸ú¤Ê¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤âÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÎã¤Ë¤Ï¡¢\fI\-l\fR¥ª¥×¥·¥ç¥ó¤â´Þ¤Þ¤ì¡¢¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤ò¾ÜºÙ¤Ê·Á¼°¤Ç½ÐÎϤ·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fBjstat\fR¥µ¡¼¥Ð¡¼¤È¡¢¤½¤ÎÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤Þ¤¿¤ÏÊ̤γ°Éôrmiregistry¥×¥í¥»¥¹¤Î¤¤¤º¤ì¤«¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Ø¤ÎÍ­¸ú¤Ê¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤âÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÎã¤Ë¤Ï¡¢\fB\-l\fR¥ª¥×¥·¥ç¥ó¤â´Þ¤Þ¤ì¡¢¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤ò¾ÜºÙ¤Ê·Á¼°¤Ç½ÐÎϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jps \-l remote\&.domain +-3002 /opt/jdk1\&.7\&.0/demo/jfc/Java2D/Java2Demo\&.JAR +-2857 sun\&.tools\&.jstatd\&.jstatd ++\fBjps \-l remote\&.domain\fR ++\fB3002 /opt/jdk1\&.7\&.0/demo/jfc/Java2D/Java2Demo\&.JAR\fR ++\fB2857 sun\&.tools\&.jstatd\&.jstatd\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢RMI¥ì¥¸¥¹¥È¥ê¤Ë¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤Ê¤¤¥Ý¡¼¥È¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤¬¥Ý¡¼¥È2002¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fIjstatd\fR¥µ¡¼¥Ð¡¼¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢\fI\-m\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢°ìÍ÷ɽ¼¨¤µ¤ì¤¿¤½¤ì¤¾¤ì¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¤òÁȤ߹þ¤ó¤Ç¤¤¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢RMI¥ì¥¸¥¹¥È¥ê¤Ë¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤Ê¤¤¥Ý¡¼¥È¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤¬¥Ý¡¼¥È2002¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fBjstatd\fR¥µ¡¼¥Ð¡¼¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢\fB\-m\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢°ìÍ÷ɽ¼¨¤µ¤ì¤¿¤½¤ì¤¾¤ì¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¤òÁȤ߹þ¤ó¤Ç¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jps \-m remote\&.domain:2002 +-3002 /opt/jdk1\&.7\&.0/demo/jfc/Java2D/Java2Demo\&.JAR +-3102 sun\&.tools\&.jstatd\&.jstatd \-p 2002 ++\fBjps \-m remote\&.domain:2002\fR ++\fB3002 /opt/jdk1\&.7\&.0/demo/jfc/Java2D/Java2Demo\&.JAR\fR ++\fB3102 sun\&.tools\&.jstatd\&.jstatd \-p 2002\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/linux/doc/man/ja/jrunscript.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jrunscript.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jrunscript +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥¹¥¯¥ê¥×¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jrunscript ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥¹¥¯¥ê¥×¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jrunscript" "1" "2013ǯ11·î21Æü" "JDK 8" "¥¹¥¯¥ê¥×¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jrunscript \- ÂÐÏ÷¿¥â¡¼¥É¤È¥Ð¥Ã¥Á¡¦¥â¡¼¥É¤ò¥µ¥Ý¡¼¥È¤¹¤ë¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¹¥¯¥ê¥×¥È¡¦¥·¥§¥ë¤ò¼Â¹Ô¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ++.SH "̾Á°" ++jrunscript \- ÂÐÏ÷¿¥â¡¼¥É¤È¥Ð¥Ã¥Á¡¦¥â¡¼¥É¤ò¥µ¥Ý¡¼¥È¤¹¤ë¥³¥Þ¥ó¥É¹Ô¥¹¥¯¥ê¥×¥È¡¦¥·¥§¥ë¤ò¼Â¹Ô¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjrunscript\fR [\fIoptions\fR] [\fIarguments\fR] ++\fBjrunscript\fR [\fIoptions\fR] [\fIarguments\fR] + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIarguments\fR +@@ -73,7 +75,7 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjrunscript\fR¥³¥Þ¥ó¥É¤Ï¡¢¸À¸ì¤Ë°Í¸¤·¤Ê¤¤¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¹¥¯¥ê¥×¥È¡¦¥·¥§¥ë¤Ç¤¹¡£\fIjrunscript\fR¤Ï¡¢ÂÐÏ÷¿(read\-eval\-print)¥â¡¼¥É¤È¥Ð¥Ã¥Á(\fI\-f\fR¥ª¥×¥·¥ç¥ó)¡¦¥â¡¼¥É¤ÎξÊý¤Î¥¹¥¯¥ê¥×¥È¼Â¹Ô¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î»ÈÍѸÀ¸ì¤ÏJavaScript¤Ç¤¹¤¬¡¢\fI\-l\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ì¤Ð¾¤Î¸À¸ì¤â»ØÄê¤Ç¤­¤Þ¤¹¡£\fIjrunscript\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¤È¥¹¥¯¥ê¥×¥È¸À¸ì¤È¤ÎÄÌ¿®¤ò»ÈÍѤ·¤ÆõµáŪ¤Ê¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ ++\fBjrunscript\fR¥³¥Þ¥ó¥É¤Ï¡¢¸À¸ì¤Ë°Í¸¤·¤Ê¤¤¥³¥Þ¥ó¥É¹Ô¥¹¥¯¥ê¥×¥È¡¦¥·¥§¥ë¤Ç¤¹¡£\fBjrunscript\fR¤Ï¡¢ÂÐÏ÷¿(read\-eval\-print)¥â¡¼¥É¤È¥Ð¥Ã¥Á(\fB\-f\fR¥ª¥×¥·¥ç¥ó)¡¦¥â¡¼¥É¤ÎξÊý¤Î¥¹¥¯¥ê¥×¥È¼Â¹Ô¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î»ÈÍѸÀ¸ì¤ÏJavaScript¤Ç¤¹¤¬¡¢\fB\-l\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ì¤Ð¾¤Î¸À¸ì¤â»ØÄê¤Ç¤­¤Þ¤¹¡£\fBjrunscript\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¤È¥¹¥¯¥ê¥×¥È¸À¸ì¤È¤ÎÄÌ¿®¤ò»ÈÍѤ·¤ÆõµáŪ¤Ê¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-classpath \fIpath\fR +@@ -83,8 +85,8 @@ + .PP + \-cp \fIpath\fR + .RS 4 +-\fI\-classpath\fR +-\fIpath\fR¤ÈƱ¤¸¤Ç¤¹¡£ ++\fB\-classpath\fR ++\fBpath\fR¤ÈƱ¤¸¤Ç¤¹¡£ + .RE + .PP + \-D\fIname\fR=\fIvalue\fR +@@ -94,17 +96,17 @@ + .PP + \-J\fIflag\fR + .RS 4 +-\fIflag\fR¤ò¡¢\fIjrunscript\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëJava²¾ÁÛ¥Þ¥·¥ó¤ËľÀÜÅϤ·¤Þ¤¹¡£ ++\fBflag\fR¤ò¡¢\fBjrunscript\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëJava Virtual Machine¤ËľÀÜÅϤ·¤Þ¤¹¡£ + .RE + .PP + \-I \fIlanguage\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥¹¥¯¥ê¥×¥È¸À¸ì¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏJavaScript¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£Â¾¤Î¥¹¥¯¥ê¥×¥È¸À¸ì¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fI\-cp\fR¤Þ¤¿¤Ï\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Âбþ¤¹¤ë¥¹¥¯¥ê¥×¥È¡¦¥¨¥ó¥¸¥ó¤ÎJAR¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥¹¥¯¥ê¥×¥È¸À¸ì¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏJavaScript¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£Â¾¤Î¥¹¥¯¥ê¥×¥È¸À¸ì¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fB\-cp\fR¤Þ¤¿¤Ï\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Âбþ¤¹¤ë¥¹¥¯¥ê¥×¥È¡¦¥¨¥ó¥¸¥ó¤ÎJAR¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-e \fIscript\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥¹¥¯¥ê¥×¥È¤òɾ²Á¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¤¹¤Ù¤Æ¤¬»ØÄꤵ¤ì¤¿1¹Ô¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥¹¥¯¥ê¥×¥È¤òɾ²Á¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥Þ¥ó¥É¹Ô¤Ë¤¹¤Ù¤Æ¤¬»ØÄꤵ¤ì¤¿1¹Ô¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-encoding \fIencoding\fR +@@ -138,7 +140,7 @@ + .RE + .SH "°ú¿ô" + .PP +-arguments¤¬Â¸ºß¤·¤Æ¤¤¤Æ¡¢¤«¤Ä\fI\-e\fR¡¢\fI\-f\fR¤Î¤¤¤º¤ì¤Î¥ª¥×¥·¥ç¥ó¤â»ÈÍѤµ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢ºÇ½é¤Î°ú¿ô¤¬¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤È¤Ê¤ê¡¢Â¾¤Î°ú¿ô¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£arguments¤È¡¢\fI\-e\fR¤Þ¤¿¤Ï\fI\-f\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤¹¤Ù¤Æ¤Îarguments¤¬¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£arguments¡¢\fI\-e\fR¡¢\fI\-f\fR¤¬¤É¤ì¤â¸ºß¤·¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢ÂÐÏ÷¿¥â¡¼¥É¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥¹¥¯¥ê¥×¥È¤«¤é¥¹¥¯¥ê¥×¥È°ú¿ô¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fIarguments\fR¤È¤¤¤¦Ì¾Á°¤Î\fIString\fRÇÛÎ󷿤Υ¨¥ó¥¸¥óÊÑ¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£ ++arguments¤¬Â¸ºß¤·¤Æ¤¤¤Æ¡¢¤«¤Ä\fB\-e\fR¡¢\fB\-f\fR¤Î¤¤¤º¤ì¤Î¥ª¥×¥·¥ç¥ó¤â»ÈÍѤµ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢ºÇ½é¤Î°ú¿ô¤¬¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤È¤Ê¤ê¡¢Â¾¤Î°ú¿ô¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£arguments¤È¡¢\fB\-e\fR¤Þ¤¿¤Ï\fB\-f\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤¹¤Ù¤Æ¤Îarguments¤¬¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£arguments¡¢\fB\-e\fR¡¢\fB\-f\fR¤¬¤É¤ì¤â¸ºß¤·¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢ÂÐÏ÷¿¥â¡¼¥É¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥¹¥¯¥ê¥×¥È¤«¤é¥¹¥¯¥ê¥×¥È°ú¿ô¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fBarguments\fR¤È¤¤¤¦Ì¾Á°¤Î\fBString\fRÇÛÎ󷿤Υ¨¥ó¥¸¥óÊÑ¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£ + .SH "Îã" + .SS "¥¤¥ó¥é¥¤¥ó¡¦¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô" + .sp +@@ -146,8 +148,9 @@ + .RS 4 + .\} + .nf +-jrunscript \-e "print(\*(Aqhello world\*(Aq)" +-jrunscript \-e "cat(\*(Aqhttp://www\&.example\&.com\*(Aq)" ++\fBjrunscript \-e "print(\*(Aqhello world\*(Aq)"\fR ++\fBjrunscript \-e "cat(\*(Aqhttp://www\&.example\&.com\*(Aq)"\fR ++ + .fi + .if n \{\ + .RE +@@ -158,7 +161,8 @@ + .RS 4 + .\} + .nf +-jrunscript \-l js \-f test\&.js ++\fBjrunscript \-l js \-f test\&.js\fR ++ + .fi + .if n \{\ + .RE +@@ -169,38 +173,41 @@ + .RS 4 + .\} + .nf +-jrunscript +-js> print(\*(AqHello World\en\*(Aq); +-Hello World +-js> 34 + 55 +-89\&.0 +-js> t = new java\&.lang\&.Thread(function() { print(\*(AqHello World\en\*(Aq); }) +-Thread[Thread\-0,5,main] +-js> t\&.start() +-js> Hello World ++\fBjrunscript\fR ++\fBjs> print(\*(AqHello World\en\*(Aq);\fR ++\fBHello World\fR ++\fBjs> 34 + 55\fR ++\fB89\&.0\fR ++\fBjs> t = new java\&.lang\&.Thread(function() { print(\*(AqHello World\en\*(Aq); })\fR ++\fBThread[Thread\-0,5,main]\fR ++\fBjs> t\&.start()\fR ++\fBjs> Hello World\fR ++\fB \fR ++\fBjs>\fR + +-js> + .fi + .if n \{\ + .RE + .\} + .SS "¥¹¥¯¥ê¥×¥È°ú¿ô¤ò»ØÄꤷ¤¿¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô" + .PP +-test\&.js¥Õ¥¡¥¤¥ë¤Ï¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£\fIarg1\fR¡¢\fIarg2\fR¤ª¤è¤Ó\fIarg3\fR¤Î³Æ°ú¿ô¤¬¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£¥¹¥¯¥ê¥×¥È¤ÏargumentsÇÛÎó¤ò»ÈÍѤ·¤Æ¤³¤ì¤é¤Î°ú¿ô¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£ ++test\&.js¥Õ¥¡¥¤¥ë¤Ï¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£\fBarg1\fR¡¢\fBarg2\fR¤ª¤è¤Ó\fBarg3\fR¤Î³Æ°ú¿ô¤¬¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£¥¹¥¯¥ê¥×¥È¤ÏargumentsÇÛÎó¤ò»ÈÍѤ·¤Æ¤³¤ì¤é¤Î°ú¿ô¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jrunscript test\&.js arg1 arg2 arg3 ++\fBjrunscript test\&.js arg1 arg2 arg3\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "´ØÏ¢¹àÌÜ" + .PP +-JavaScript¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼ÄêµÁ¥¹¥¯¥ê¥×¥È¤òɾ²Á¤¹¤ëÁ°¤Ë¡¢\fIjrunscript\fR¥³¥Þ¥ó¥É¤Ï¤¤¤¯¤Ä¤«¤ÎÁȹþ¤ß´Ø¿ô¤äÁȹþ¤ß¥ª¥Ö¥¸¥§¥¯¥È¤ò½é´ü²½¤·¤Þ¤¹¡£¤³¤ì¤é¤ÎJavaScript¤ÎÁȹþ¤ß¤Ë¤Ä¤¤¤Æ¤Ï¡¢http://code\&.google\&.com/p/jsdoc\-toolkit/¤Ë¤¢¤ë +-JsDoc\-Toolkit¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++JavaScript¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼ÄêµÁ¥¹¥¯¥ê¥×¥È¤òɾ²Á¤¹¤ëÁ°¤Ë¡¢\fBjrunscript\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÆÃÄê¤ÎÁȹþ¤ß´Ø¿ô¤ª¤è¤Ó¥ª¥Ö¥¸¥§¥¯¥È¤¬½é´ü²½¤µ¤ì¤Þ¤¹(¤³¤ì¤é¤Ë¤Ä¤¤¤Æ¤Ï¡¢¼¡¤Îjrunscript JavaScriptÁȹþ¤ß¤ÎAPI»ÅÍͤ˵­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹)¡£ ++.PP ++http://docs\&.oracle\&.com/javase/7/docs/technotes/tools/share/jsdocs/overview\-summary\&.html + .br + 'pl 8.5i + 'bp +--- ./jdk/src/linux/doc/man/ja/jsadebugd.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jsadebugd.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jsadebugd +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jsadebugd ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jsadebugd" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jsadebugd \- Java¥×¥í¥»¥¹¤Þ¤¿¤Ï¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤ËÀܳ¤·¡¢¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤È¤·¤Æµ¡Ç½¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjsadebugd\fR \fIpid\fR [ \fIserver\-id\fR ] ++\fBjsadebugd\fR \fIpid\fR [ \fIserver\-id\fR ] + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjsadebugd\fR \fIexecutable\fR \fIcore\fR [ \fIserver\-id\fR ] ++\fBjsadebugd\fR \fIexecutable\fR \fIcore\fR [ \fIserver\-id\fR ] + .fi + .if n \{\ + .RE +@@ -93,23 +95,24 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjsadebugd\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥×¥í¥»¥¹¤Þ¤¿¤Ï¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤ËÀܳ¤·¡¢¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤È¤·¤Æµ¡Ç½¤·¤Þ¤¹¡£\fIjstack\fR¡¢\fIjmap\fR¤ª¤è¤Ó\fIjinfo\fR¤Ê¤É¤Î¥ê¥â¡¼¥È¡¦¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢Java Remote Method Invocation (RMI)¤ò»ÈÍѤ·¤Æ¤¤¤ë¥µ¡¼¥Ð¡¼¤ËÀܳ¤Ç¤­¤Þ¤¹¡£\fIjsadebugd\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ëÁ°¤Ë¡¢\fIrmiregistry\fR¥³¥Þ¥ó¥É¤ÇRMI¥ì¥¸¥¹¥È¥ê¤ò¼¡¤Î¤è¤¦¤Ëµ¯Æ°¤·¤Þ¤¹¡£\fI$JAVA_HOME\fR¤ÏJDK¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£ ++\fBjsadebugd\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥×¥í¥»¥¹¤Þ¤¿¤Ï¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤ËÀܳ¤·¡¢¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤È¤·¤Æµ¡Ç½¤·¤Þ¤¹¡£\fBjstack\fR¡¢\fBjmap\fR¤ª¤è¤Ó\fBjinfo\fR¤Ê¤É¤Î¥ê¥â¡¼¥È¡¦¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢Java Remote Method Invocation(RMI)¤ò»ÈÍѤ·¤Æ¤¤¤ë¥µ¡¼¥Ð¡¼¤ËÀܳ¤Ç¤­¤Þ¤¹¡£\fBjsadebugd\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ëÁ°¤Ë¡¢\fBrmiregistry\fR¥³¥Þ¥ó¥É¤ÇRMI¥ì¥¸¥¹¥È¥ê¤ò¼¡¤Î¤è¤¦¤Ëµ¯Æ°¤·¤Þ¤¹¡£\fI$JAVA_HOME\fR¤ÏJDK¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmiregistry \-J\-Xbootclasspath/p:$JAVA_HOME/lib/sajdi\&.jar ++\fBrmiregistry \-J\-Xbootclasspath/p:$JAVA_HOME/lib/sajdi\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-RMI¥ì¥¸¥¹¥È¥ê¤¬µ¯Æ°¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjsadebugd\fR¥³¥Þ¥ó¥É¤ÏRMI¥ì¥¸¥¹¥È¥ê¤òɸ½à(1099)¥Ý¡¼¥È¤ÇÆâÉô¤Çµ¯Æ°¤·¤Þ¤¹¡£¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Ï¡¢\fISIGINT\fR¤òÁ÷¿®¤¹¤ë¤³¤È¤Ë¤è¤êÄä»ß¤Ç¤­¤Þ¤¹¡£SIGINT¤òÁ÷¿®¤¹¤ë¤Ë¤Ï¡¢\fB[Ctrl] + [C]\fR¤ò²¡¤·¤Þ¤¹¡£ ++RMI¥ì¥¸¥¹¥È¥ê¤¬µ¯Æ°¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjsadebugd\fR¥³¥Þ¥ó¥É¤ÏRMI¥ì¥¸¥¹¥È¥ê¤òɸ½à(1099)¥Ý¡¼¥È¤ÇÆâÉô¤Çµ¯Æ°¤·¤Þ¤¹¡£¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Ï¡¢\fBSIGINT\fR¤òÁ÷¿®¤¹¤ë¤³¤È¤Ë¤è¤êÄä»ß¤Ç¤­¤Þ¤¹¡£SIGINT¤òÁ÷¿®¤¹¤ë¤Ë¤Ï¡¢\fB[Ctrl] + [C]\fR¤ò²¡¤·¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fIdbgeng\&.dll\fR¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fIPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£Îã: +-\fIs\fR\fIet PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR ++¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fBdbgeng\&.dll\fR¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fBPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£Îã: ++\fBs\fR\fBet PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/linux/doc/man/ja/jstack.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jstack.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jstack +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jstack ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jstack" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jstack \- Java¥×¥í¥»¥¹¡¢¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ËÂФ¹¤ëJava¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjstack\fR [ \fIoptions\fR ] \fIpid\fR ++\fBjstack\fR [ \fIoptions\fR ] \fIpid\fR + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjstack\fR [ \fIoptions\fR ] \fIexecutable\fR \fIcore\fR ++\fBjstack\fR [ \fIoptions\fR ] \fIexecutable\fR \fIcore\fR + .fi + .if n \{\ + .RE +@@ -76,7 +78,7 @@ + .RS 4 + .\} + .nf +-\fIjstack\fR [ \fIoptions\fR ] [ \fIserver\-id\fR@ ] \fIremote\-hostname\-or\-IP\fR ++\fBjstack\fR [ \fIoptions\fR ] [ \fIserver\-id\fR@ ] \fIremote\-hostname\-or\-IP\fR + .fi + .if n \{\ + .RE +@@ -84,7 +86,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIpid\fR +@@ -104,7 +106,7 @@ + .PP + \fIremote\-hostname\-or\-IP\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fI¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fIIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fB¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fBIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIserver\-id\fR +@@ -113,17 +115,18 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjstack\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¡¢¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ËÂФ¹¤ëJava¥¹¥ì¥Ã¥É¤ÎJava¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Þ¤¹¡£Java¥Õ¥ì¡¼¥à¤´¤È¤Ë¡¢¥Õ¥ë¥¯¥é¥¹Ì¾¡¢¥á¥½¥Ã¥É̾¡¢¥Ð¥¤¥È¥³¡¼¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹(bci)¡¢¤ª¤è¤Ó¹ÔÈÖ¹æ(ÍøÍѲÄǽ¤Ê¾ì¹ç)¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-m\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢\fIjstack\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¹¥ì¥Ã¥É¤ÎJava¥Õ¥ì¡¼¥à¤È¥Í¥¤¥Æ¥£¥Ö¡¦¥Õ¥ì¡¼¥à¤ÎξÊý¤ò¡¢¥×¥í¥°¥é¥à¡¦¥«¥¦¥ó¥¿(PC)¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£¥Í¥¤¥Æ¥£¥Ö¡¦¥Õ¥ì¡¼¥à¤´¤È¤Ë¡¢PC¤ËºÇ¤â¶á¤¤¥Í¥¤¥Æ¥£¥Ö¡¦¥·¥ó¥Ü¥ë(ÍøÍѲÄǽ¤Ê¾ì¹ç)¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£C++ʬ²ò̾¤Ïʬ²ò²ò½ü¤µ¤ì¤Þ¤»¤ó¡£C++̾¤òʬ²ò²ò½ü¤¹¤ë¤Ë¤Ï¡¢¤³¤Î¥³¥Þ¥ó¥É¤Î½ÐÎϤò\fIc++filt\fR¤Ë¥Ñ¥¤¥×¤·¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJava²¾ÁÛ¥Þ¥·¥ó¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fI\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(Îã: +-\fIjstack \-J\-d64 \-m pid\fR)¡£ ++\fBjstack\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¡¢¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ËÂФ¹¤ëJava¥¹¥ì¥Ã¥É¤ÎJava¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Þ¤¹¡£Java¥Õ¥ì¡¼¥à¤´¤È¤Ë¡¢¥Õ¥ë¥¯¥é¥¹Ì¾¡¢¥á¥½¥Ã¥É̾¡¢¥Ð¥¤¥È¥³¡¼¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹(bci)¡¢¤ª¤è¤Ó¹ÔÈÖ¹æ(ÍøÍѲÄǽ¤Ê¾ì¹ç)¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-m\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢\fBjstack\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¹¥ì¥Ã¥É¤ÎJava¥Õ¥ì¡¼¥à¤È¥Í¥¤¥Æ¥£¥Ö¡¦¥Õ¥ì¡¼¥à¤ÎξÊý¤ò¡¢¥×¥í¥°¥é¥à¡¦¥«¥¦¥ó¥¿(PC)¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£¥Í¥¤¥Æ¥£¥Ö¡¦¥Õ¥ì¡¼¥à¤´¤È¤Ë¡¢PC¤ËºÇ¤â¶á¤¤¥Í¥¤¥Æ¥£¥Ö¡¦¥·¥ó¥Ü¥ë(ÍøÍѲÄǽ¤Ê¾ì¹ç)¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£C++ʬ²ò̾¤Ïʬ²ò²ò½ü¤µ¤ì¤Þ¤»¤ó¡£C++̾¤òʬ²ò²ò½ü¤¹¤ë¤Ë¤Ï¡¢¤³¤Î¥³¥Þ¥ó¥É¤Î½ÐÎϤò\fBc++filt\fR¤Ë¥Ñ¥¤¥×¤·¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJava Virtual Machine¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fB\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(Îã: ++\fBjstack \-J\-d64 \-m pid\fR)¡£ + .PP + \fBÃí°Õ\fR +-¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£dbgeng\&.dll¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fIPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ ++¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£dbgeng\&.dll¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fBPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-set PATH=<jdk>\ejre\ebin\eclient;%PATH% ++\fBset PATH=<jdk>\ejre\ebin\eclient;%PATH%\fR ++ + .fi + .if n \{\ + .RE +@@ -132,15 +135,15 @@ + .PP + \-F + .RS 4 +-\fIjstack\fR +-[\fI\-l\fR] +-\fIpid\fR¤¬±þÅú¤·¤Ê¤¤¾ì¹ç¤Ë¥¹¥¿¥Ã¥¯¡¦¥À¥ó¥×¤ò¶¯À©¤·¤Þ¤¹¡£ ++\fBjstack\fR ++[\fB\-l\fR] ++\fBpid\fR¤¬±þÅú¤·¤Ê¤¤¾ì¹ç¤Ë¥¹¥¿¥Ã¥¯¡¦¥À¥ó¥×¤ò¶¯À©¤·¤Þ¤¹¡£ + .RE + .PP + \-l + .RS 4 +-Ĺ·Á¼°¤Î¥ê¥¹¥È¡£½êÍ­\fIjava\&.util\&.concurrent\fR¤Î½êÍ­¤Ç¤­¤ë¥·¥ó¥¯¥í¥Ê¥¤¥¶¤Î°ìÍ÷¤Ê¤É¡¢¥í¥Ã¥¯¤Ë¤Ä¤¤¤Æ¤ÎÄɲþðÊó¤ò°õºþ¤·¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/api/java/util/concurrent/locks/AbstractOwnableSynchronizer\&.html¤Ë¤¢¤ë +-\fIAbstractOwnableSynchronizer\fR¥¯¥é¥¹µ­½Ò¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ ++Ĺ·Á¼°¤Î¥ê¥¹¥È¡£½êÍ­\fBjava\&.util\&.concurrent\fR¤Î½êÍ­¤Ç¤­¤ë¥·¥ó¥¯¥í¥Ê¥¤¥¶¤Î°ìÍ÷¤Ê¤É¡¢¥í¥Ã¥¯¤Ë¤Ä¤¤¤Æ¤ÎÄɲþðÊó¤ò°õºþ¤·¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/api/java/util/concurrent/locks/AbstractOwnableSynchronizer\&.html¤Ë¤¢¤ë ++\fBAbstractOwnableSynchronizer\fR¥¯¥é¥¹µ­½Ò¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + \-m +@@ -157,9 +160,9 @@ + .RS 4 + ¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .RE +-.SH "´ûÃΤÎÉÔ¶ñ¹ç" ++.SH "´ûÃΤÎBUG" + .PP +-º®¹ç¥â¡¼¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤Ç¤Ï¡¢\fI\-m\fR¥ª¥×¥·¥ç¥ó¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Ç¤Ïµ¡Ç½¤·¤Þ¤»¤ó¡£ ++º®¹ç¥â¡¼¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤Ç¤Ï¡¢\fB\-m\fR¥ª¥×¥·¥ç¥ó¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Ç¤Ïµ¡Ç½¤·¤Þ¤»¤ó¡£ + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/linux/doc/man/ja/jstat.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jstat.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jstat +-.\" Language: English +-.\" Date: 2011ǯ5·î10Æü +-.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jstat ++.\" Language: Japanese ++.\" Date: 2011ǯ5·î10Æü ++.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jstat" "1" "2011ǯ5·î10Æü" "JDK 8" "¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jstat \- Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤ÎÅý·×¤ò´Æ»ë¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ++.SH "̾Á°" ++jstat \- Java Virtual Machine (JVM)¤ÎÅý·×¤ò¥â¥Ë¥¿¡¼¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjstat\fR [ \fIgeneralOption\fR | \fIoutputOptions vmid\fR [ \fIinterval\fR[s|ms] [ \fIcount \fR] ] ++\fBjstat\fR [ \fIgeneralOption\fR | \fIoutputOptions vmid\fR [ \fIinterval\fR[s|ms] [ \fIcount \fR] ] + .fi + .if n \{\ + .RE +@@ -64,12 +66,12 @@ + .PP + \fIgeneralOption\fR + .RS 4 +-ñÆȤǻÈÍѤ¹¤ë°ìÈÌŪ¤Ê¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Ç¤¹(\fI\-help\fR¤Þ¤¿¤Ï\fI\-options\fR)¡£°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ñÆȤǻÈÍѤ¹¤ë°ìÈÌŪ¤Ê¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Ç¤¹(\fB\-help\fR¤Þ¤¿¤Ï\fB\-options\fR)¡£°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIoutputOptions\fR + .RS 4 +-ñ°ì¤Î\fIstatOption\fR¤È\fI\-t\fR¡¢\fI\-h\fR¤ª¤è¤Ó\fI\-J\fR¤Î¤¤¤º¤ì¤«¤Î¥ª¥×¥·¥ç¥ó¤Ç¹½À®¤µ¤ì¤ë1¤Ä°Ê¾å¤Î½ÐÎÏ¥ª¥×¥·¥ç¥ó¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ñ°ì¤Î\fBstatOption\fR¤È\fB\-t\fR¡¢\fB\-h\fR¤ª¤è¤Ó\fB\-J\fR¤Î¤¤¤º¤ì¤«¤Î¥ª¥×¥·¥ç¥ó¤Ç¹½À®¤µ¤ì¤ë1¤Ä°Ê¾å¤Î½ÐÎÏ¥ª¥×¥·¥ç¥ó¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIvmid\fR +@@ -80,35 +82,37 @@ + .RS 4 + .\} + .nf +-[protocol:][//]lvmid[@hostname[:port]/servername] ++\fB[protocol:][//]lvmid[@hostname[:port]/servername]\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIvmid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£\fIvmid\fRʸ»úÎó¤Ï¡¢¥í¡¼¥«¥ëJVM¤òɽ¤¹Ã±½ã¤ÊÀ°¿ô¤«¤é¡¢ÄÌ¿®¥×¥í¥È¥³¥ë¡¢¥Ý¡¼¥ÈÈֹ桢¤ª¤è¤Ó¾¤Î¼ÂÁõ¸ÇÍ­¤ÎÃͤò¼¨¤¹Ê£»¨¤Ê¹½Â¤¤Þ¤Ç¡¢ÍÍ¡¹¤Ë°Û¤Ê¤ê¤Þ¤¹¡£²¾ÁÛ¥Þ¥·¥ó¼±Ê̻Ҥò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBvmid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£\fBvmid\fRʸ»úÎó¤Ï¡¢¥í¡¼¥«¥ëJVM¤òɽ¤¹Ã±½ã¤ÊÀ°¿ô¤«¤é¡¢ÄÌ¿®¥×¥í¥È¥³¥ë¡¢¥Ý¡¼¥ÈÈֹ桢¤ª¤è¤Ó¾¤Î¼ÂÁõ¸ÇÍ­¤ÎÃͤò¼¨¤¹Ê£»¨¤Ê¹½Â¤¤Þ¤Ç¡¢ÍÍ¡¹¤Ë°Û¤Ê¤ê¤Þ¤¹¡£²¾ÁÛ¥Þ¥·¥ó¼±Ê̻Ҥò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIinterval\fR [s|ms] + .RS 4 +-ÉÃ(s)¤Þ¤¿¤Ï¥ß¥êÉÃ(ms)¤Î¤¦¤Á»ØÄꤷ¤¿Ã±°Ì¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Îñ°Ì¤Ï¥ß¥êÉäǤ¹¡£Àµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤¿¾ì¹ç¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤Ï³Æ´Ö³Ö¤Ç½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£ ++ÉÃ(s)¤Þ¤¿¤Ï¥ß¥êÉÃ(ms)¤Î¤¦¤Á»ØÄꤷ¤¿Ã±°Ì¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Îñ°Ì¤Ï¥ß¥êÉäǤ¹¡£Àµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤¿¾ì¹ç¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤Ï³Æ´Ö³Ö¤Ç½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP + \fIcount\fR + .RS 4 +-ɽ¼¨¤¹¤ë¥µ¥ó¥×¥ë¿ô¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ̵¸Â¤Ç¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢¤Þ¤¿¤Ï\fIjstat\fR¥³¥Þ¥ó¥É¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤ÏÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÃͤϡ¢Àµ¤ÎÀ°¿ô¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++ɽ¼¨¤¹¤ë¥µ¥ó¥×¥ë¿ô¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ̵¸Â¤Ç¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢¤Þ¤¿¤Ï\fBjstat\fR¥³¥Þ¥ó¥É¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤ÏÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÃͤϡ¢Àµ¤ÎÀ°¿ô¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjstat\fR¥³¥Þ¥ó¥É¤Ï¡¢ÀßÃÖ¤µ¤ì¤Æ¤¤¤ëJava HotSpot VM¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹Åý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈJVM¤Ï¡¢²¾ÁÛ¥Þ¥·¥ó¼±Ê̻Ҥޤ¿¤Ï\fIvmid\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¼±Ê̤µ¤ì¤Þ¤¹¡£ ++\fBjstat\fR¥³¥Þ¥ó¥É¤Ï¡¢ÀßÃÖ¤µ¤ì¤Æ¤¤¤ëJava HotSpot VM¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹Åý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈJVM¤Ï¡¢²¾ÁÛ¥Þ¥·¥ó¼±Ê̻Ҥޤ¿¤Ï\fBvmid\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¼±Ê̤µ¤ì¤Þ¤¹¡£ + .SH "²¾ÁÛ¥Þ¥·¥ó¼±ÊÌ»Ò" + .PP +-\fIvmid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ ++\fBvmid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-[protocol:][//]lvmid[@hostname[:port]/servername] ++\fB[protocol:][//]lvmid[@hostname[:port]/servername]\fR ++ + .fi + .if n \{\ + .RE +@@ -116,12 +120,12 @@ + .PP + \fIprotocol\fR + .RS 4 +-ÄÌ¿®¥×¥í¥È¥³¥ë¤Ç¤¹¡£\fIprotocol\fRÃͤ¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥È¥³¥ë¤¬¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£\fIprotocol\fRÃͤ¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥È¥³¥ë¤Ï\fIrmi\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ÄÌ¿®¥×¥í¥È¥³¥ë¤Ç¤¹¡£\fIprotocol\fRÃͤ¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥È¥³¥ë¤¬¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£\fIprotocol\fRÃͤ¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥È¥³¥ë¤Ï\fBrmi\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \fIlvmid\fR + .RS 4 +-¥¿¡¼¥²¥Ã¥ÈJVM¤Î¥í¡¼¥«¥ë²¾ÁÛ¥Þ¥·¥ó¼±Ê̻ҤǤ¹¡£\fIlvmid\fR¤Ï¡¢¥·¥¹¥Æ¥à¾å¤ÎJVM¤ò°ì°Õ¤Ë¼±Ê̤¹¤ë¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎÃͤǤ¹¡£\fIlvmid\fR¤Ï¡¢²¾ÁÛ¥Þ¥·¥ó¼±Ê̻ҤÎÍ£°ì¤Îɬ¿ÜÍ×ÁǤǤ¹¡£\fIlvmid\fR¤Ï¡¢°ìÈÌŪ¤Ë¤Ï¥¿¡¼¥²¥Ã¥ÈJVM¥×¥í¥»¥¹¤ËÂФ¹¤ë¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥×¥í¥»¥¹¼±Ê̻ҤǤ¹¤¬¡¢É¬¤º¤·¤â¤½¤¦¤Ç¤¢¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£\fIjps\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fIlvmid\fR¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢UNIX¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï\fIps\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢Windows¤Ç¤ÏWindows¥¿¥¹¥¯¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»ÈÍѤ·¤Æ¡¢\fIlvmid\fR¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£ ++¥¿¡¼¥²¥Ã¥ÈJVM¤Î¥í¡¼¥«¥ë²¾ÁÛ¥Þ¥·¥ó¼±Ê̻ҤǤ¹¡£\fBlvmid\fR¤Ï¡¢¥·¥¹¥Æ¥à¾å¤ÎJVM¤ò°ì°Õ¤Ë¼±Ê̤¹¤ë¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎÃͤǤ¹¡£\fBlvmid\fR¤Ï¡¢²¾ÁÛ¥Þ¥·¥ó¼±Ê̻ҤÎÍ£°ì¤Îɬ¿ÜÍ×ÁǤǤ¹¡£\fBlvmid\fR¤Ï¡¢°ìÈÌŪ¤Ë¤Ï¥¿¡¼¥²¥Ã¥ÈJVM¥×¥í¥»¥¹¤ËÂФ¹¤ë¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥×¥í¥»¥¹¼±Ê̻ҤǤ¹¤¬¡¢É¬¤º¤·¤â¤½¤¦¤Ç¤¢¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£\fBjps\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fBlvmid\fR¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢Solaris¡¢Linux¤ª¤è¤ÓOS X¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï\fBps\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢Windows¤Ç¤ÏWindows¥¿¥¹¥¯¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»ÈÍѤ·¤Æ¡¢\fBlvmid\fR¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \fIhostname\fR +@@ -131,16 +135,16 @@ + .PP + \fIport\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ë¤¿¤á¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¤¹¡£\fIhostname\fRÃͤ¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤¬\fIprotocol\fRÃͤ˻ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIport\fRÃͤÏ̵»ë¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fIport\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î\fIrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¥Ý¡¼¥ÈÃͤϡ¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Îrmiregistry¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¼¨¤·¤Þ¤¹¡£\fIport\fRÃͤ¬¾Êά¤µ¤ì¡¢\fIprotocol\fRÃͤÇ\fIrmi\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(1099)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥ê¥â¡¼¥È¡¦¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ë¤¿¤á¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¤¹¡£\fIhostname\fRÃͤ¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤¬\fIprotocol\fRÃͤ˻ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIport\fRÃͤÏ̵»ë¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fBport\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î\fBrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¥Ý¡¼¥ÈÃͤϡ¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Îrmiregistry¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¼¨¤·¤Þ¤¹¡£\fIport\fRÃͤ¬¾Êά¤µ¤ì¡¢\fIprotocol\fRÃͤÇ\fBrmi\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(1099)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \fIservername\fR + .RS 4 +-\fIservername\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fIrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤ì¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤ÎRMI¥ê¥½¡¼¥¹¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤òɽ¤·¤Þ¤¹¡£ ++\fBservername\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fBrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤ì¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤ÎRMI¥ê¥½¡¼¥¹¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤òɽ¤·¤Þ¤¹¡£ + .RE + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjstat\fR¥³¥Þ¥ó¥É¤Ï¡¢°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤È½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Î2¤Ä¤Î¥¿¥¤¥×¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤Ï´Êñ¤Ê»ÈÍÑΨ¤ª¤è¤Ó¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Þ¤¹¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¡¢Åý·×¥Ç¡¼¥¿½ÐÎϤÎÆâÍƤȷÁ¼°¤¬·è¤Þ¤ê¤Þ¤¹¡£ ++\fBjstat\fR¥³¥Þ¥ó¥É¤Ï¡¢°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤È½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Î2¤Ä¤Î¥¿¥¤¥×¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤Ï´Êñ¤Ê»ÈÍÑΨ¤ª¤è¤Ó¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Þ¤¹¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¡¢Åý·×¥Ç¡¼¥¿½ÐÎϤÎÆâÍƤȷÁ¼°¤¬·è¤Þ¤ê¤Þ¤¹¡£ + .PP + ¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤È¤½¤Îµ¡Ç½¤Ï¡¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤ÇÊѹ¹¤Þ¤¿¤ÏÇѻߤµ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .SS "°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó" +@@ -158,44 +162,44 @@ + .RE + .SS "½ÐÎÏ¥ª¥×¥·¥ç¥ó" + .PP +-°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ë¡¢½ÐÎÏ¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤÎÆâÍƤȷÁ¼°¤ò·èÄꤷ¡¢Ã±°ì¤Î\fIstatOption\fR¤È¤¤¤º¤ì¤«¤Î½ÐÎÏ¥ª¥×¥·¥ç¥ó(\fI\-h\fR¡¢\fI\-t\fR¤ª¤è¤Ó\fI\-J\fR)¤Ç¹½À®¤µ¤ì¤Þ¤¹¡£\fIstatOption\fR¤ÏºÇ½é¤Ëµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ë¡¢½ÐÎÏ¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤÎÆâÍƤȷÁ¼°¤ò·èÄꤷ¡¢Ã±°ì¤Î\fBstatOption\fR¤È¤¤¤º¤ì¤«¤Î½ÐÎÏ¥ª¥×¥·¥ç¥ó(\fB\-h\fR¡¢\fB\-t\fR¤ª¤è¤Ó\fB\-J\fR)¤Ç¹½À®¤µ¤ì¤Þ¤¹¡£\fBstatOption\fR¤ÏºÇ½é¤Ëµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-½ÐÎϤϡ¢³ÆÎ󤬶õÇò¤Ç¶èÀÚ¤é¤ì¤¿É½¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¥¿¥¤¥È¥ë¤ò´Þ¤à¥Ø¥Ã¥À¡¼¹Ô¤Ë¤è¤Ã¤Æ¡¢³ÆÎó¤Î°ÕÌ£¤¬¤ï¤«¤ê¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Îɽ¼¨ÉÑÅÙ¤òÀßÄꤹ¤ë¤Ë¤Ï¡¢\fI\-h\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Îó¤Î¥Ø¥Ã¥À¡¼Ì¾¤Ï¡¢ÍÍ¡¹¤Ê¥ª¥×¥·¥ç¥ó´Ö¤Ç°ì´ÓÀ­¤¬Êݤ¿¤ì¤Æ¤¤¤Þ¤¹¡£°ìÈ̤ˡ¢2¤Ä¤Î¥ª¥×¥·¥ç¥ó¤ÇƱ¤¸Ì¾Á°¤ÎÎ󤬻ÈÍѤµ¤ì¤Æ¤¤¤ì¤Ð¡¢2¤Ä¤ÎÎó¤Î¥Ç¡¼¥¿¡¦¥½¡¼¥¹¤ÏƱ¤¸¤Ç¤¹¡£ ++½ÐÎϤϡ¢³ÆÎ󤬶õÇò¤Ç¶èÀÚ¤é¤ì¤¿É½¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¥¿¥¤¥È¥ë¤ò´Þ¤à¥Ø¥Ã¥À¡¼¹Ô¤Ë¤è¤Ã¤Æ¡¢³ÆÎó¤Î°ÕÌ£¤¬¤ï¤«¤ê¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Îɽ¼¨ÉÑÅÙ¤òÀßÄꤹ¤ë¤Ë¤Ï¡¢\fB\-h\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Îó¤Î¥Ø¥Ã¥À¡¼Ì¾¤Ï¡¢ÍÍ¡¹¤Ê¥ª¥×¥·¥ç¥ó´Ö¤Ç°ì´ÓÀ­¤¬Êݤ¿¤ì¤Æ¤¤¤Þ¤¹¡£°ìÈ̤ˡ¢2¤Ä¤Î¥ª¥×¥·¥ç¥ó¤ÇƱ¤¸Ì¾Á°¤ÎÎ󤬻ÈÍѤµ¤ì¤Æ¤¤¤ì¤Ð¡¢2¤Ä¤ÎÎó¤Î¥Ç¡¼¥¿¡¦¥½¡¼¥¹¤ÏƱ¤¸¤Ç¤¹¡£ + .PP +-\fI\-t\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢Timestamp¤È¤¤¤¦¥é¥Ù¥ë¤ÎÉÕ¤¤¤¿¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÎ󤬡¢½ÐÎϤκǽé¤ÎÎó¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£TimestampÎó¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤Îµ¯Æ°¤«¤é¤Î·Ð²á»þ´Ö¤¬¡¢ÉÃñ°Ì¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÀºÅ٤ϡ¢ÍÍ¡¹¤ÊÍ×°ø¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¡¢ÂçÎ̤ÎÉé²Ù¤Î¤«¤«¤Ã¤¿¥·¥¹¥Æ¥à¤Ç¤Î¥¹¥ì¥Ã¥É¡¦¥¹¥±¥¸¥å¡¼¥ë¤ÎÃÙ±ä¤Ë¤è¤êÊÑÆ°¤·¤Þ¤¹¡£ ++\fB\-t\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢Timestamp¤È¤¤¤¦¥é¥Ù¥ë¤ÎÉÕ¤¤¤¿¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÎ󤬡¢½ÐÎϤκǽé¤ÎÎó¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£TimestampÎó¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤Îµ¯Æ°¤«¤é¤Î·Ð²á»þ´Ö¤¬¡¢ÉÃñ°Ì¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÀºÅ٤ϡ¢ÍÍ¡¹¤ÊÍ×°ø¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¡¢ÂçÎ̤ÎÉé²Ù¤Î¤«¤«¤Ã¤¿¥·¥¹¥Æ¥à¤Ç¤Î¥¹¥ì¥Ã¥É¡¦¥¹¥±¥¸¥å¡¼¥ë¤ÎÃÙ±ä¤Ë¤è¤êÊÑÆ°¤·¤Þ¤¹¡£ + .PP +-interval¤ª¤è¤Ócount¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤¬¤½¤Î½ÐÎϤòɽ¼¨¤¹¤ëÉÑÅ٤Ȳó¿ô¤ò¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£ ++interval¤ª¤è¤Ócount¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤¬¤½¤Î½ÐÎϤòɽ¼¨¤¹¤ëÉÑÅ٤Ȳó¿ô¤ò¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤³¤Î·Á¼°¤ÏÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤ÏºîÀ®¤·¤Ê¤Ç¤¯¤À¤µ¤¤¡£\fIjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤òºîÀ®¤¹¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥Ä¡¼¥ë¤Î¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¡¢¤½¤Î¥¹¥¯¥ê¥×¥È¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ë¤³¤È¤Ëα°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤³¤Î·Á¼°¤ÏÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤ÏºîÀ®¤·¤Ê¤Ç¤¯¤À¤µ¤¤¡£\fBjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤òºîÀ®¤¹¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥Ä¡¼¥ë¤Î¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¡¢¤½¤Î¥¹¥¯¥ê¥×¥È¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ë¤³¤È¤Ëα°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP + \-\fIstatOption\fR + .RS 4 +-\fIjstat\fR¥³¥Þ¥ó¥É¤¬É½¼¨¤¹¤ëÅý·×¥Ç¡¼¥¿¾ðÊó¤ò»ØÄꤷ¤Þ¤¹¡£¼¡¤Ë¡¢ÍøÍѲÄǽ¤Ê¥ª¥×¥·¥ç¥ó¤Î°ìÍ÷¤ò¼¨¤·¤Þ¤¹¡£ÆÃÄê¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥¤¥ó¥¹¥È¡¼¥ë¤Î¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤Î\fI\-options\fR¤ò»ÈÍѤ·¤Þ¤¹¡£Stat¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó½ÐÎϤò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjstat\fR¥³¥Þ¥ó¥É¤¬É½¼¨¤¹¤ëÅý·×¥Ç¡¼¥¿¾ðÊó¤ò»ØÄꤷ¤Þ¤¹¡£¼¡¤Ë¡¢ÍøÍѲÄǽ¤Ê¥ª¥×¥·¥ç¥ó¤Î°ìÍ÷¤ò¼¨¤·¤Þ¤¹¡£ÆÃÄê¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥¤¥ó¥¹¥È¡¼¥ë¤Î¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤Î\fB\-options\fR¤ò»ÈÍѤ·¤Þ¤¹¡£Stat¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó½ÐÎϤò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fIclass\fR: ¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBclass\fR: ¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIcompiler\fR: Java HotSpot VM Just\-in\-Time¥³¥ó¥Ñ¥¤¥é¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBcompiler\fR: Java HotSpot VM Just\-in\-Time¥³¥ó¥Ñ¥¤¥é¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgc\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥È¤µ¤ì¤¿¥Ò¡¼¥×¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgc\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥È¤µ¤ì¤¿¥Ò¡¼¥×¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgccapacity\fR: À¤Â头¤È¤ÎÍÆÎ̤ÈÂбþ¤¹¤ëÎΰè¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgccapacity\fR: À¤Â头¤È¤ÎÍÆÎ̤ÈÂбþ¤¹¤ëÎΰè¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgccause\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼(\fI\-gcutil\fR¤ÈƱ¤¸)¤È¡¢Ä¾Á°¤ª¤è¤Ó¸½ºß(ŬÍѲÄǽ¤Ê¾ì¹ç)¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¸¶°ø¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgccause\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼(\fB\-gcutil\fR¤ÈƱ¤¸)¤È¡¢Ä¾Á°¤ª¤è¤Ó¸½ºß(ŬÍѲÄǽ¤Ê¾ì¹ç)¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¸¶°ø¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcnew\fR: NewÀ¤Âå¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcnew\fR: NewÀ¤Âå¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcnewcapacity\fR: NewÀ¤Âå¤Î¥µ¥¤¥º¤ÈÂбþ¤¹¤ëÎΰè¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcnewcapacity\fR: NewÀ¤Âå¤Î¥µ¥¤¥º¤ÈÂбþ¤¹¤ëÎΰè¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcold\fR: OldÀ¤Âå¤ÎÆ°ºî¤È¥á¥¿¥¹¥Ú¡¼¥¹¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcold\fR: OldÀ¤Âå¤ÎÆ°ºî¤È¥á¥¿¥¹¥Ú¡¼¥¹¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcoldcapacity\fR: OldÀ¤Âå¤Î¥µ¥¤¥º¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcoldcapacity\fR: OldÀ¤Âå¤Î¥µ¥¤¥º¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcmetacapacity\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î¥µ¥¤¥º¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcmetacapacity\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î¥µ¥¤¥º¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcutil\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¥µ¥Þ¥ê¡¼¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcutil\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¥µ¥Þ¥ê¡¼¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIprintcompilation\fR: Java HotSpot VM¥³¥ó¥Ñ¥¤¥ë¡¦¥á¥½¥Ã¥É¤ÎÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBprintcompilation\fR: Java HotSpot VM¥³¥ó¥Ñ¥¤¥ë¡¦¥á¥½¥Ã¥É¤ÎÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-h \fIn\fR +@@ -210,150 +214,150 @@ + .PP + \-J\fIjavaOption\fR + .RS 4 +-\fIjavaOption\fR¤òJava¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤ËÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î´°Á´¤Ê¥ê¥¹¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavaOption\fR¤òJava¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤ËÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î´°Á´¤Ê¥ê¥¹¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SS "Stat¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó½ÐÎÏ" + .PP +-¼¡¤Î¾ðÊó¤Ï¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤¬³Æ\fIstatOption\fR¤Ë¤Ä¤¤¤Æ½ÐÎϤ¹¤ëÎó¤ò¤Þ¤È¤á¤¿¤â¤Î¤Ç¤¹¡£ ++¼¡¤Î¾ðÊó¤Ï¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤¬³Æ\fIstatOption\fR¤Ë¤Ä¤¤¤Æ½ÐÎϤ¹¤ëÎó¤ò¤Þ¤È¤á¤¿¤â¤Î¤Ç¤¹¡£ + .PP + \-class \fIoption\fR + .RS 4 + ¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fILoaded\fR: ¥í¡¼¥É¤µ¤ì¤¿¥¯¥é¥¹¤Î¿ô¡£ ++\fBLoaded\fR: ¥í¡¼¥É¤µ¤ì¤¿¥¯¥é¥¹¤Î¿ô¡£ + .sp +-\fIBytes\fR: ¥í¡¼¥É¤µ¤ì¤¿KB¤Î¿ô¡£ ++\fBBytes\fR: ¥í¡¼¥É¤µ¤ì¤¿KB¤Î¿ô¡£ + .sp +-\fIUnloaded\fR: ¥¢¥ó¥í¡¼¥É¤µ¤ì¤¿¥¯¥é¥¹¤Î¿ô¡£ ++\fBUnloaded\fR: ¥¢¥ó¥í¡¼¥É¤µ¤ì¤¿¥¯¥é¥¹¤Î¿ô¡£ + .sp +-\fIBytes\fR: ¥¢¥ó¥í¡¼¥É¤µ¤ì¤¿KB¤Î¿ô¡£ ++\fBBytes\fR: ¥¢¥ó¥í¡¼¥É¤µ¤ì¤¿KB¤Î¿ô¡£ + .sp +-\fITime\fR: ¥¯¥é¥¹¤Î¥í¡¼¥É¤ä¥¢¥ó¥í¡¼¥É½èÍý¤ËÍפ·¤¿»þ´Ö¡£ ++\fBTime\fR: ¥¯¥é¥¹¤Î¥í¡¼¥É¤ä¥¢¥ó¥í¡¼¥É½èÍý¤ËÍפ·¤¿»þ´Ö¡£ + .RE + .PP + \-compiler \fIoption\fR + .RS 4 + Java HotSpot VM Just\-in\-Time¥³¥ó¥Ñ¥¤¥é¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fICompiled\fR: ¼Â¹Ô¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ ++\fBCompiled\fR: ¼Â¹Ô¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ + .sp +-\fIFailed\fR: ¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ ++\fBFailed\fR: ¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ + .sp +-\fIInvalid\fR: ̵¸ú¤Ë¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ ++\fBInvalid\fR: ̵¸ú¤Ë¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ + .sp +-\fITime\fR: ¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¼Â¹Ô¤ËÍפ·¤¿»þ´Ö¡£ ++\fBTime\fR: ¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¼Â¹Ô¤ËÍפ·¤¿»þ´Ö¡£ + .sp +-\fIFailedType\fR: ºÇ¸å¤Ë¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¤¥×¡£ ++\fBFailedType\fR: ºÇ¸å¤Ë¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¤¥×¡£ + .sp +-\fIFailedMethod\fR: ºÇ¸å¤Ë¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¤Î¥¯¥é¥¹Ì¾¤È¥á¥½¥Ã¥É¡£ ++\fBFailedMethod\fR: ºÇ¸å¤Ë¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¤Î¥¯¥é¥¹Ì¾¤È¥á¥½¥Ã¥É¡£ + .RE + .PP + \-gc \fIoption\fR + .RS 4 + ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥È¤µ¤ì¤¿¥Ò¡¼¥×¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS0U\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(KB)¡£ ++\fBS0U\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIS1U\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(KB)¡£ ++\fBS1U\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIEU\fR: EdenÎΰè¤Î»ÈÍÑΨ(KB)¡£ ++\fBEU\fR: EdenÎΰè¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOU\fR: OldÎΰè¤Î»ÈÍÑΨ(KB)¡£ ++\fBOU\fR: OldÎΰè¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ ++\fBMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIMU\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(KB)¡£ ++\fBMU\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¿ô¡£ + .sp +-\fIYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-gccapacity \fIoption\fR + .RS 4 + ¥á¥â¥ê¡¼¡¦¥×¡¼¥ëÀ¤Â太¤è¤ÓÎΰèÍÆÎÌ¡£ + .sp +-\fINGCMN\fR: NewÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBNGCMN\fR: NewÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fINGCMX\fR: NewÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBNGCMX\fR: NewÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fINGC\fR: NewÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBNGC\fR: NewÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOGCMN\fR: OldÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBOGCMN\fR: OldÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fIOGCMX\fR: OldÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBOGCMX\fR: OldÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIOGC\fR: OldÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOGC\fR: OldÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIMCMN\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBMCMN\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fIMCMX\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBMCMX\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ ++\fBMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .RE + .PP + \-gccause \fIoption\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-gcutil\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼¤òɽ¼¨¤·¤Þ¤¹¤¬¡¢ºÇ¸å¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤È(ŬÍѲÄǽ¤Ê¾ì¹ç¤Ï)¸½ºß¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¸¶°ø¤¬´Þ¤Þ¤ì¤Þ¤¹¡£\fI\-gcutil\fR¤Ç°ìÍ÷ɽ¼¨¤µ¤ì¤ëÎó¤Î¤Û¤«¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¼¡¤ÎÎó¤¬Äɲ䵤ì¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-gcutil\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼¤òɽ¼¨¤·¤Þ¤¹¤¬¡¢ºÇ¸å¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤È(ŬÍѲÄǽ¤Ê¾ì¹ç¤Ï)¸½ºß¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¸¶°ø¤¬´Þ¤Þ¤ì¤Þ¤¹¡£\fB\-gcutil\fR¤Ç°ìÍ÷ɽ¼¨¤µ¤ì¤ëÎó¤Î¤Û¤«¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¼¡¤ÎÎó¤¬Äɲ䵤ì¤Þ¤¹¡£ + .sp + ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤ò´Þ¤à¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fILGCC\fR: ºÇ¸å¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¸¶°ø¡£ ++\fBLGCC\fR: ºÇ¸å¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¸¶°ø¡£ + .sp +-\fIGCC\fR: ¸½ºß¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¸¶°ø¡£ ++\fBGCC\fR: ¸½ºß¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¸¶°ø¡£ + .RE + .PP + \-gcnew \fIoption\fR + .RS 4 + NewÀ¤Âå¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS0U\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(KB)¡£ ++\fBS0U\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIS1U\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(KB)¡£ ++\fBS1U\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fITT\fR: ÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ¡£ ++\fBTT\fR: ÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ¡£ + .sp +-\fIMTT\fR: ºÇÂçÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ¡£ ++\fBMTT\fR: ºÇÂçÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ¡£ + .sp +-\fIDSS\fR: ŬÀÚ¤ÊSurvivor¥µ¥¤¥º(KB)¡£ ++\fBDSS\fR: ŬÀÚ¤ÊSurvivor¥µ¥¤¥º(KB)¡£ + .sp +-\fIEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIEU\fR: EdenÎΰè¤Î»ÈÍÑΨ(KB)¡£ ++\fBEU\fR: EdenÎΰè¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .RE + .PP + \-gcnewcapacity \fIoption\fR +@@ -362,132 +366,132 @@ + .sp + NGCMN: NewÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fINGCMX\fR: NewÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBNGCMX\fR: NewÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fINGC\fR: NewÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBNGC\fR: NewÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS0CMX\fR: SurvivorÎΰè0¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBS0CMX\fR: SurvivorÎΰè0¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS1CMX\fR: SurvivorÎΰè1¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBS1CMX\fR: SurvivorÎΰè1¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIECMX\fR: EdenÎΰè¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBECMX\fR: EdenÎΰè¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .RE + .PP + \-gcold \fIoption\fR + .RS 4 + Old¤ª¤è¤ÓPermanentÀ¤Âå¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ ++\fBMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIMU\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(KB)¡£ ++\fBMU\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOU\fR: OldÎΰè¤Î»ÈÍÑΨ(KB)¡£ ++\fBOU\fR: OldÎΰè¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-gcoldcapacity \fIoption\fR + .RS 4 + OldÀ¤Âå¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIOGCMN\fR: OldÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBOGCMN\fR: OldÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fIOGCMX\fR: OldÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBOGCMX\fR: OldÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIOGC\fR: OldÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOGC\fR: OldÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-gcmetacapacity \fIoption\fR + .RS 4 + PermanentÀ¤Âå¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIMCMN\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBMCMN\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fIMCMX\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBMCMX\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ ++\fBMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-gcutil \fIoption\fR + .RS 4 + ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼ + .sp +-\fIS0\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBS0\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIS1\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBS1\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIE\fR: EdenÎΰè¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBE\fR: EdenÎΰè¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIO\fR: OldÎΰè¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBO\fR: OldÎΰè¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIM\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(Îΰè¤Î¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBM\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(Îΰè¤Î¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-printcompilation \fIoption\fR + .RS 4 + Java HotSpot VM¥³¥ó¥Ñ¥¤¥ë¡¦¥á¥½¥Ã¥É¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fICompiled\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ ++\fBCompiled\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ + .sp +-\fISize\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¥Ð¥¤¥È¡¦¥³¡¼¥É¤Î¥Ð¥¤¥È¿ô¡£ ++\fBSize\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¥Ð¥¤¥È¡¦¥³¡¼¥É¤Î¥Ð¥¤¥È¿ô¡£ + .sp +-\fIType\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¤¥×¡£ ++\fBType\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¤¥×¡£ + .sp +-\fIMethod\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤òÆÃÄꤹ¤ë¥¯¥é¥¹Ì¾¤È¥á¥½¥Ã¥É̾¡£¥¯¥é¥¹Ì¾¤Ç¤Ï¡¢Ì¾Á°¶õ´Ö¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ¡¢¥É¥Ã¥È(\&.)¤Î¤«¤ï¤ê¤Ë¥¹¥é¥Ã¥·¥å(/)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥á¥½¥Ã¥É̾¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹Æâ¤Î¥á¥½¥Ã¥É¤Ç¤¹¡£¤³¤ì¤é¤Î2¤Ä¤Î¥Õ¥£¡¼¥ë¥É¤Î·Á¼°¤Ï¡¢HotSpot +-\fI\-XX:+PrintComplation\fR¥ª¥×¥·¥ç¥ó¤ÈÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ ++\fBMethod\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤òÆÃÄꤹ¤ë¥¯¥é¥¹Ì¾¤È¥á¥½¥Ã¥É̾¡£¥¯¥é¥¹Ì¾¤Ç¤Ï¡¢Ì¾Á°¶õ´Ö¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ¡¢¥É¥Ã¥È(\&.)¤Î¤«¤ï¤ê¤Ë¥¹¥é¥Ã¥·¥å(/)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥á¥½¥Ã¥É̾¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹Æâ¤Î¥á¥½¥Ã¥É¤Ç¤¹¡£¤³¤ì¤é¤Î2¤Ä¤Î¥Õ¥£¡¼¥ë¥É¤Î·Á¼°¤Ï¡¢HotSpot ++\fB\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ÈÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .SH "Îã" + .PP + ¤³¤Î¹à¤Ç¤Ï¡¢21891¤Î\fIlvmid\fR¤ò»ý¤Ä¥í¡¼¥«¥ëJVM¤ò¥â¥Ë¥¿¥ê¥ó¥°¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£ + .SS "gcutil¥ª¥×¥·¥ç¥ó" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢lvmid 21891¤ËÀܳ¤·¤Æ¡¢250¥ß¥êÉôֳ֤Ç7¤Ä¤Î¥µ¥ó¥×¥ë¤ò¼èÆÀ¤·¡¢\-\fIgcutil\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î»ØÄê¤Ë½¾¤Ã¤Æ½ÐÎϤòɽ¼¨¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢lvmid 21891¤ËÀܳ¤·¤Æ¡¢250¥ß¥êÉôֳ֤Ç7¤Ä¤Î¥µ¥ó¥×¥ë¤ò¼èÆÀ¤·¡¢\-\fBgcutil\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î»ØÄê¤Ë½¾¤Ã¤Æ½ÐÎϤòɽ¼¨¤·¤Þ¤¹¡£ + .PP + ¤³¤ÎÎã¤Î½ÐÎϤϡ¢¼ã¤¤À¤Âå¤Î¥³¥ì¥¯¥·¥ç¥ó¤¬3ÈÖÌܤÈ4ÈÖÌܤΥµ¥ó¥×¥ë´Ö¤Ç¹Ô¤ï¤ì¤¿¤³¤È¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£¥³¥ì¥¯¥·¥ç¥ó¤Ë¤Ï0\&.001É䫤«¤Ã¤Æ¤ª¤ê¡¢¥ª¥Ö¥¸¥§¥¯¥È¤¬EdenÎΰè(E)¤«¤éOldÎΰè(O)¤Ë¾º³Ê¤·¤¿¤¿¤á¡¢OldÎΰè¤Î»ÈÍÑΨ¤Ï9\&.49%¤«¤é9\&.51%¤ËÁý²Ã¤·¤Æ¤¤¤Þ¤¹¡£SurvivorÎΰè¤Ï¡¢¥³¥ì¥¯¥·¥ç¥óÁ°¤Ï12\&.44%¤¬»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤·¤¿¤¬¡¢¥³¥ì¥¯¥·¥ç¥ó¸å¤Î»ÈÍѤÏ7\&.74%¤Î¤ß¤Ç¤¹¡£ + .sp +@@ -495,22 +499,23 @@ + .RS 4 + .\} + .nf +-jstat \-gcutil 21891 250 7 +- S0 S1 E O M YGC YGCT FGC FGCT GCT +-0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 ++\fBjstat \-gcutil 21891 250 7\fR ++\fB S0 S1 E O M YGC YGCT FGC FGCT GCT\fR ++\fB0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "Îó¥Ø¥Ã¥À¡¼Ê¸»úÎó¤Î·«ÊÖ¤·" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢lvmid 21891¤ËÀܳ¤·¤Æ¡¢250¥ß¥êÉôֳ֤ǥµ¥ó¥×¥ë¤ò¼èÆÀ¤·¡¢\fI\-gcutil\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î»ØÄê¤Ë½¾¤Ã¤Æ½ÐÎϤòɽ¼¨¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fI\-h3\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ç¡¼¥¿¤¬3¹Ôɽ¼¨¤µ¤ì¤ë¤´¤È¤ËÎó¥Ø¥Ã¥À¡¼¤ò½ÐÎϤ·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢lvmid 21891¤ËÀܳ¤·¤Æ¡¢250¥ß¥êÉôֳ֤ǥµ¥ó¥×¥ë¤ò¼èÆÀ¤·¡¢\fB\-gcutil\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î»ØÄê¤Ë½¾¤Ã¤Æ½ÐÎϤòɽ¼¨¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fB\-h3\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ç¡¼¥¿¤¬3¹Ôɽ¼¨¤µ¤ì¤ë¤´¤È¤ËÎó¥Ø¥Ã¥À¡¼¤ò½ÐÎϤ·¤Þ¤¹¡£ + .PP + ¤³¤ÎÎã¤Ç¤Ï¡¢¥Ø¥Ã¥À¡¼Ê¸»úÎó¤Î·«ÊÖ¤·¤¬É½¼¨¤µ¤ì¤Æ¤¤¤ë¤Û¤«¡¢2ÈÖÌܤÈ3ÈÖÌܤΥµ¥ó¥×¥ë´Ö¤ÇYoung GC¤¬¹Ô¤ï¤ì¤¿¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£¤³¤Î·Ñ³»þ´Ö¤Ï0\&.001ÉäǤ·¤¿¡£¤³¤Î¥³¥ì¥¯¥·¥ç¥ó¤Ç¤Ï¡¢SurvivorÎΰè0¤Î»ÈÍÑΨ(S0U)¤¬Å¬ÀÚ¤ÊSurvivor¥µ¥¤¥º(DSS)¤òĶ²á¤¹¤ë¤³¤È¤Ë¤Ê¤ë¥¢¥¯¥Æ¥£¥Ö¡¦¥Ç¡¼¥¿¤¬¸¡½Ð¤µ¤ì¤Þ¤·¤¿¡£¤³¤Î·ë²Ì¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢OldÀ¤Âå(¤³¤Î½ÐÎϤˤÏÈóɽ¼¨)¤Ø¾º³Ê¤µ¤ì¡¢ÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ(TT)¤¬¡¢31¤«¤é2¤Ø¹ß³Ê¤µ¤ì¤Þ¤·¤¿¡£ + .PP +@@ -520,51 +525,54 @@ + .RS 4 + .\} + .nf +-jstat \-gcnew \-h3 21891 250 +- S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT +- 64\&.0 64\&.0 0\&.0 31\&.7 31 31 32\&.0 512\&.0 178\&.6 249 0\&.203 +- 64\&.0 64\&.0 0\&.0 31\&.7 31 31 32\&.0 512\&.0 355\&.5 249 0\&.203 +- 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 21\&.9 250 0\&.204 +- S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT +- 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 245\&.9 250 0\&.204 +- 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 421\&.1 250 0\&.204 +- 64\&.0 64\&.0 0\&.0 19\&.0 31 31 32\&.0 512\&.0 84\&.4 251 0\&.204 +- S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT +- 64\&.0 64\&.0 0\&.0 19\&.0 31 31 32\&.0 512\&.0 306\&.7 251 0\&.204 ++\fBjstat \-gcnew \-h3 21891 250\fR ++\fB S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT\fR ++\fB 64\&.0 64\&.0 0\&.0 31\&.7 31 31 32\&.0 512\&.0 178\&.6 249 0\&.203\fR ++\fB 64\&.0 64\&.0 0\&.0 31\&.7 31 31 32\&.0 512\&.0 355\&.5 249 0\&.203\fR ++\fB 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 21\&.9 250 0\&.204\fR ++\fB S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT\fR ++\fB 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 245\&.9 250 0\&.204\fR ++\fB 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 421\&.1 250 0\&.204\fR ++\fB 64\&.0 64\&.0 0\&.0 19\&.0 31 31 32\&.0 512\&.0 84\&.4 251 0\&.204\fR ++\fB S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT\fR ++\fB 64\&.0 64\&.0 0\&.0 19\&.0 31 31 32\&.0 512\&.0 306\&.7 251 0\&.204\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥µ¥ó¥×¥ë¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÁÞÆþ" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢lvmid21891¤ØÀܳ¤·¡¢250¥ß¥êÉôֳ֤Ç3¤Ä¤Î¥µ¥ó¥×¥ë¤ò¼èÆÀ¤·¤Æ¤¤¤Þ¤¹¡£\fI\-t\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢ºÇ½é¤ÎÎó¤Ë¥µ¥ó¥×¥ë¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤òɽ¼¨¤·¤Æ¤¤¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢lvmid21891¤ØÀܳ¤·¡¢250¥ß¥êÉôֳ֤Ç3¤Ä¤Î¥µ¥ó¥×¥ë¤ò¼èÆÀ¤·¤Æ¤¤¤Þ¤¹¡£\fB\-t\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢ºÇ½é¤ÎÎó¤Ë¥µ¥ó¥×¥ë¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤òɽ¼¨¤·¤Æ¤¤¤Þ¤¹¡£ + .PP +-TimestampÎó¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤Îµ¯Æ°»þ¤«¤é¤Î·Ð²á»þ´Ö¤¬¡¢ÉÃñ°Ì¤Ç¥ì¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fI\-gcoldcapacity\fR½ÐÎϤǤϡ¢³äÅö¥ê¥¯¥¨¥¹¥È¤Þ¤¿¤Ï¾º³Ê¥ê¥¯¥¨¥¹¥È¤¢¤ë¤¤¤Ï¤½¤ÎξÊý¤òËþ¤¿¤¹¤¿¤á¤Ë¥Ò¡¼¥×¤¬³ÈÄ¥¤¹¤ë¤¿¤Ó¤Ë¡¢OldÀ¤Âå¤ÎÍÆÎÌ(OGC)¤ÈOldÎΰè¤ÎÍÆÎÌ(OC)¤È¤¬Áý²Ã¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£81ÈÖÌܤΥե롦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(FGC)¤Î¸å¡¢OldÀ¤Âå¤ÎÍÆÎÌ(OGC)¤Ï11,696 KB¤«¤é13820 KB¤ËÁý²Ã¤·¤Þ¤·¤¿¡£¤³¤ÎÀ¤Âå(¤ª¤è¤ÓÎΰè)¤ÎºÇÂçÍÆÎ̤ϡ¢60,544 KB (OGCMX)¤Ê¤Î¤Ç¡¢¤Þ¤À³ÈÄ¥¤Ç¤­¤ë;͵¤¬»Ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++TimestampÎó¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤Îµ¯Æ°»þ¤«¤é¤Î·Ð²á»þ´Ö¤¬¡¢ÉÃñ°Ì¤Ç¥ì¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fB\-gcoldcapacity\fR½ÐÎϤǤϡ¢³äÅö¥ê¥¯¥¨¥¹¥È¤Þ¤¿¤Ï¾º³Ê¥ê¥¯¥¨¥¹¥È¤¢¤ë¤¤¤Ï¤½¤ÎξÊý¤òËþ¤¿¤¹¤¿¤á¤Ë¥Ò¡¼¥×¤¬³ÈÄ¥¤¹¤ë¤¿¤Ó¤Ë¡¢OldÀ¤Âå¤ÎÍÆÎÌ(OGC)¤ÈOldÎΰè¤ÎÍÆÎÌ(OC)¤È¤¬Áý²Ã¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£81ÈÖÌܤΥե롦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(FGC)¤Î¸å¡¢OldÀ¤Âå¤ÎÍÆÎÌ(OGC)¤Ï11,696 KB¤«¤é13820 KB¤ËÁý²Ã¤·¤Þ¤·¤¿¡£¤³¤ÎÀ¤Âå(¤ª¤è¤ÓÎΰè)¤ÎºÇÂçÍÆÎ̤ϡ¢60,544 KB (OGCMX)¤Ê¤Î¤Ç¡¢¤Þ¤À³ÈÄ¥¤Ç¤­¤ë;͵¤¬»Ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Timestamp OGCMN OGCMX OGC OC YGC FGC FGCT GCT +- 150\&.1 1408\&.0 60544\&.0 11696\&.0 11696\&.0 194 80 2\&.874 3\&.799 +- 150\&.4 1408\&.0 60544\&.0 13820\&.0 13820\&.0 194 81 2\&.938 3\&.863 +- 150\&.7 1408\&.0 60544\&.0 13820\&.0 13820\&.0 194 81 2\&.938 3\&.863 ++\fBTimestamp OGCMN OGCMX OGC OC YGC FGC FGCT GCT\fR ++\fB 150\&.1 1408\&.0 60544\&.0 11696\&.0 11696\&.0 194 80 2\&.874 3\&.799\fR ++\fB 150\&.4 1408\&.0 60544\&.0 13820\&.0 13820\&.0 194 81 2\&.938 3\&.863\fR ++\fB 150\&.7 1408\&.0 60544\&.0 13820\&.0 13820\&.0 194 81 2\&.938 3\&.863\fR ++ + .fi + .if n \{\ + .RE + .\} +-.SS "¥ê¥â¡¼¥ÈJVM¤Î¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Î´Æ»ë" ++.SS "¥ê¥â¡¼¥ÈJVM¤Î¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Î¥â¥Ë¥¿¡¼" + .PP +-¤³¤ÎÎã¤Ï¡¢\fI\-gcutil\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢remote\&.domain¤È¤¤¤¦¥·¥¹¥Æ¥à¾å¤Îlvmid 40496¤ËÀܳ¤·¡¢¥µ¥ó¥×¥ë¤òÉÃñ°Ì¤Ç̵´ü¸Â¤Ë¼èÆÀ¤·¤Æ¤¤¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ï¡¢\fB\-gcutil\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢remote\&.domain¤È¤¤¤¦¥·¥¹¥Æ¥à¾å¤Îlvmid 40496¤ËÀܳ¤·¡¢¥µ¥ó¥×¥ë¤òÉÃñ°Ì¤Ç̵´ü¸Â¤Ë¼èÆÀ¤·¤Æ¤¤¤Þ¤¹¡£ + .PP +-lvmid¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Î̾Á°¤È·ë¹ç¤µ¤ì¤Æ¡¢\fI40496@remote\&.domain\fR¤Î\fIvmid\fR¤ò¹½À®¤·¤Æ¤¤¤Þ¤¹¡£·ë²Ì¤È¤·¤Æ¡¢¤³¤Îvmid¤Ï¡¢\fIrmi\fR¥×¥í¥È¥³¥ë¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Î¥Ç¥Õ¥©¥ë¥È¤Î\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤·¤Þ¤¹¡£\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢rmiregistry¤ò»ÈÍѤ·¤Æ¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fIremote\&.domain\fR¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ ++lvmid¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Î̾Á°¤È·ë¹ç¤µ¤ì¤Æ¡¢\fB40496@remote\&.domain\fR¤Î\fIvmid\fR¤ò¹½À®¤·¤Æ¤¤¤Þ¤¹¡£·ë²Ì¤È¤·¤Æ¡¢¤³¤Îvmid¤Ï¡¢\fBrmi\fR¥×¥í¥È¥³¥ë¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Î¥Ç¥Õ¥©¥ë¥È¤Î\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤·¤Þ¤¹¡£\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢rmiregistry¤ò»ÈÍѤ·¤Æ¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fBremote\&.domain\fR¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstat \-gcutil 40496@remote\&.domain 1000 +-\fI\&.\&.\&. output omitted\fR ++\fBjstat \-gcutil 40496@remote\&.domain 1000\fR ++\fB\fI\&.\&.\&. output omitted\fR\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/linux/doc/man/ja/jstatd.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jstatd.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jstatd +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jstatd ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jstatd" "1" "2013ǯ11·î21Æü" "JDK 8" "¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jstatd \- Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤ò¥â¥Ë¥¿¡¼¤·¡¢¥ê¥â¡¼¥È¡¦¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë¤¬JVM¤ËÀܳ¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjstatd\fR [ \fIoptions\fR ] ++\fBjstatd\fR [ \fIoptions\fR ] + .fi + .if n \{\ + .RE +@@ -64,156 +66,164 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjstatd\fR¥³¥Þ¥ó¥É¤Ï¡¢·×¬¤µ¤ì¤¿Java HotSpot VM¤ÎºîÀ®¤È½ªÎ»¤ò¥â¥Ë¥¿¡¼¤·¡¢¥í¡¼¥«¥ë¡¦¥·¥¹¥Æ¥à¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëJVM¤Ë¡¢¥ê¥â¡¼¥È¡¦¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë¤¬Àܳ¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤¹¤ëRMI¥µ¡¼¥Ð¡¼¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤¹¡£ ++\fBjstatd\fR¥³¥Þ¥ó¥É¤Ï¡¢·×¬¤µ¤ì¤¿Java HotSpot VM¤ÎºîÀ®¤È½ªÎ»¤ò¥â¥Ë¥¿¡¼¤·¡¢¥í¡¼¥«¥ë¡¦¥·¥¹¥Æ¥à¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëJVM¤Ë¡¢¥ê¥â¡¼¥È¡¦¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë¤¬Àܳ¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤¹¤ëRMI¥µ¡¼¥Ð¡¼¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤¹¡£ + .PP +-\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ç¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤ËRMI¥ì¥¸¥¹¥È¥ê¤¬É¬Íפˤʤê¤Þ¤¹¡£\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¡¢¤Þ¤¿¤Ï\fI\-p\fR +-\fIport\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿¥Ý¡¼¥È¤Ç¡¢RMI¥ì¥¸¥¹¥È¥ê¤ËÀܳ¤·¤è¤¦¤È¤·¤Þ¤¹¡£RMI¥ì¥¸¥¹¥È¥ê¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢\fI\-p\fR +-\fIport\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Ý¡¼¥È¡¢¤Þ¤¿¤Ï\fI\-p\fR +-\fIport\fR¥ª¥×¥·¥ç¥ó¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥ÈRMI¥ì¥¸¥¹¥È¥ê¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fIjstatd\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥óÆâ¤Ë¡¢1¤Ä¤ÎRMI¥ì¥¸¥¹¥È¥ê¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤ÎºîÀ®¤Ï¡¢\fI\-nr\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤ÆÃæ»ß¤Ç¤­¤Þ¤¹¡£ ++\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ç¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤ËRMI¥ì¥¸¥¹¥È¥ê¤¬É¬Íפˤʤê¤Þ¤¹¡£\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¡¢¤Þ¤¿¤Ï\fB\-p\fR ++\fBport\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿¥Ý¡¼¥È¤Ç¡¢RMI¥ì¥¸¥¹¥È¥ê¤ËÀܳ¤·¤è¤¦¤È¤·¤Þ¤¹¡£RMI¥ì¥¸¥¹¥È¥ê¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢\fB\-p\fR ++\fBport\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Ý¡¼¥È¡¢¤Þ¤¿¤Ï\fB\-p\fR ++\fBport\fR¥ª¥×¥·¥ç¥ó¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥ÈRMI¥ì¥¸¥¹¥È¥ê¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fBjstatd\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥óÆâ¤Ë¡¢1¤Ä¤ÎRMI¥ì¥¸¥¹¥È¥ê¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤ÎºîÀ®¤Ï¡¢\fB\-nr\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤ÆÃæ»ß¤Ç¤­¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-nr + .RS 4 +-´û¸¤ÎRMI¥ì¥¸¥¹¥È¥ê¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢\fIjstatd\fR¥×¥í¥»¥¹Æâ¤ËÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤òºîÀ®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£ ++´û¸¤ÎRMI¥ì¥¸¥¹¥È¥ê¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢\fBjstatd\fR¥×¥í¥»¥¹Æâ¤ËÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤òºîÀ®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .RE + .PP + \-p \fIport\fR + .RS 4 +-RMI¥ì¥¸¥¹¥È¥ê¤¬¤¢¤ë¤ÈͽÁÛ¤µ¤ì¤ë¥Ý¡¼¥ÈÈÖ¹æ¤Ç¤¹¡£¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¤Ï¡¢\fI\-nr\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤±¤ì¤ÐºîÀ®¤µ¤ì¤Þ¤¹¡£ ++RMI¥ì¥¸¥¹¥È¥ê¤¬¤¢¤ë¤ÈͽÁÛ¤µ¤ì¤ë¥Ý¡¼¥ÈÈÖ¹æ¤Ç¤¹¡£¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¤Ï¡¢\fB\-nr\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤±¤ì¤ÐºîÀ®¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-n \fIrminame\fR + .RS 4 +-RMI¥ì¥¸¥¹¥È¥ê¤Ë¤ª¤¤¤Æ¡¢¥ê¥â¡¼¥ÈRMI¥ª¥Ö¥¸¥§¥¯¥È¤¬¥Ð¥¤¥ó¥É¤µ¤ì¤ë̾Á°¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È̾¤Ï\fIJStatRemoteHost\fR¤Ç¤¹¡£Ê£¿ô¤Î\fIjstatd\fR¥µ¡¼¥Ð¡¼¤¬Æ±¤¸¥Û¥¹¥È¾å¤Çµ¯Æ°¤·¤Æ¤¤¤ë¾ì¹ç¡¢³Æ¥µ¡¼¥Ð¡¼¤Î¥¨¥¯¥¹¥Ý¡¼¥È¤·¤¿RMI¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢°ì°Õ¤Î̾Á°¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥â¥Ë¥¿¥ê¥ó¥°¡¦¥¯¥é¥¤¥¢¥ó¥È¤Î\fIhostid\fR¤ª¤è¤Ó\fIvmid\fRʸ»úÎó¤Ë¡¢¤½¤Î°ì°Õ¤Î¥µ¡¼¥Ð¡¼Ì¾¤ò´Þ¤á¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++RMI¥ì¥¸¥¹¥È¥ê¤Ë¤ª¤¤¤Æ¡¢¥ê¥â¡¼¥ÈRMI¥ª¥Ö¥¸¥§¥¯¥È¤¬¥Ð¥¤¥ó¥É¤µ¤ì¤ë̾Á°¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È̾¤Ï\fBJStatRemoteHost\fR¤Ç¤¹¡£Ê£¿ô¤Î\fBjstatd\fR¥µ¡¼¥Ð¡¼¤¬Æ±¤¸¥Û¥¹¥È¾å¤Çµ¯Æ°¤·¤Æ¤¤¤ë¾ì¹ç¡¢³Æ¥µ¡¼¥Ð¡¼¤Î¥¨¥¯¥¹¥Ý¡¼¥È¤·¤¿RMI¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢°ì°Õ¤Î̾Á°¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥â¥Ë¥¿¥ê¥ó¥°¡¦¥¯¥é¥¤¥¢¥ó¥È¤Î\fBhostid\fR¤ª¤è¤Ó\fBvmid\fRʸ»úÎó¤Ë¡¢¤½¤Î°ì°Õ¤Î¥µ¡¼¥Ð¡¼Ì¾¤ò´Þ¤á¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-JVM¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë\fI¥ª¥×¥·¥ç¥ó\fR¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++JVM¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë\fB¥ª¥×¥·¥ç¥ó\fR¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥»¥­¥å¥ê¥Æ¥£" + .PP +-\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢Å¬Àڤʥͥ¤¥Æ¥£¥Ö¡¦¥¢¥¯¥»¥¹¸¢¤ò»ý¤ÄJVM¤Î¤ß¤ò´Æ»ë¤Ç¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fIjstatd\fR¥×¥í¥»¥¹¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤ÈƱ¤¸¥æ¡¼¥¶¡¼»ñ³Ê¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£UNIX¥Ù¡¼¥¹¤Î¥·¥¹¥Æ¥à¤Ë¤ª¤±¤ëroot¥æ¡¼¥¶¡¼¤Ê¤É¤Î°ìÉô¤Î¥æ¡¼¥¶¡¼»ñ³Ê¤Ï¡¢¥·¥¹¥Æ¥à¾å¤ÎǤ°Õ¤ÎJVM¤Ë¤è¤Ã¤Æ¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤¿¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ø¤Î¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê»ñ³Ê¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë\fIjstatd\fR¥×¥í¥»¥¹¤Ï¡¢¥·¥¹¥Æ¥à¾å¤Î¤¹¤Ù¤Æ¤ÎJVM¤ò´Æ»ë¤Ç¤­¤Þ¤¹¤¬¡¢¥»¥­¥å¥ê¥Æ¥£¾å¤ÎÊ̤ÎÌäÂ꤬µ¯¤³¤ê¤Þ¤¹¡£ ++\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢Å¬Àڤʥͥ¤¥Æ¥£¥Ö¡¦¥¢¥¯¥»¥¹¸¢¤ò»ý¤ÄJVM¤Î¤ß¤ò¥â¥Ë¥¿¡¼¤Ç¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fBjstatd\fR¥×¥í¥»¥¹¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤ÈƱ¤¸¥æ¡¼¥¶¡¼»ñ³Ê¾ÚÌÀ¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Solaris¡¢Linux¤ª¤è¤ÓOS X¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ë¤ª¤±¤ëroot¥æ¡¼¥¶¡¼¤Ê¤É¤Î°ìÉô¤Î¥æ¡¼¥¶¡¼»ñ³Ê¾ÚÌÀ¤Ï¡¢¥·¥¹¥Æ¥à¾å¤ÎǤ°Õ¤ÎJVM¤Ë¤è¤Ã¤Æ¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤¿¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ø¤Î¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê»ñ³Ê¾ÚÌÀ¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë\fBjstatd\fR¥×¥í¥»¥¹¤Ï¡¢¥·¥¹¥Æ¥à¾å¤Î¤¹¤Ù¤Æ¤ÎJVM¤ò¥â¥Ë¥¿¡¼¤Ç¤­¤Þ¤¹¤¬¡¢¥»¥­¥å¥ê¥Æ¥£¾å¤ÎÊ̤ÎÌäÂ꤬µ¯¤³¤ê¤Þ¤¹¡£ + .PP +-\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ë¤Ï¡¢¥ê¥â¡¼¥È¡¦¥¯¥é¥¤¥¢¥ó¥È¤Îǧ¾Úµ¡Ç½¤¬¤¢¤ê¤Þ¤»¤ó¡£¤½¤Î¤¿¤á¡¢\fIjstatd\fR¥µ¡¼¥Ð¡¼¡¦¥×¥í¥»¥¹¤ò¼Â¹Ô¤¹¤ë¤È¡¢\fIjstatd\fR¥×¥í¥»¥¹¤¬¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ä¤¹¤Ù¤Æ¤ÎJVM¤Ë¤è¤ë¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Î¥¨¥¯¥¹¥Ý¡¼¥È¤ò¡¢¥Í¥Ã¥È¥ï¡¼¥¯¾å¤Î¤¹¤Ù¤Æ¤Î¥æ¡¼¥¶¡¼¤Ë¸ø³«¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î̵ËÉÈ÷¤Ê¾õÂ֤ϡ¢´Ä¶­¤Ë¤è¤Ã¤Æ¤Ï˾¤Þ¤·¤¯¤Ê¤¤¾ì¹ç¤¬¤¢¤ë¤Î¤Ç¡¢Æä˼²ÔƯ´Ä¶­¤Þ¤¿¤Ï°ÂÁ´¤Ç¤Ê¤¤¥Í¥Ã¥È¥ï¡¼¥¯¤Ç¤Ï¡¢\fIjstatd\fR¥×¥í¥»¥¹¤òµ¯Æ°¤¹¤ëÁ°¤Ë¡¢¥í¡¼¥«¥ë¡¦¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¤ò¸¡Æ¤¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ë¤Ï¡¢¥ê¥â¡¼¥È¡¦¥¯¥é¥¤¥¢¥ó¥È¤Îǧ¾Úµ¡Ç½¤¬¤¢¤ê¤Þ¤»¤ó¡£¤½¤Î¤¿¤á¡¢\fBjstatd\fR¥µ¡¼¥Ð¡¼¡¦¥×¥í¥»¥¹¤ò¼Â¹Ô¤¹¤ë¤È¡¢\fBjstatd\fR¥×¥í¥»¥¹¤¬¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ä¤¹¤Ù¤Æ¤ÎJVM¤Ë¤è¤ë¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Î¥¨¥¯¥¹¥Ý¡¼¥È¤ò¡¢¥Í¥Ã¥È¥ï¡¼¥¯¾å¤Î¤¹¤Ù¤Æ¤Î¥æ¡¼¥¶¡¼¤Ë¸ø³«¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î̵ËÉÈ÷¤Ê¾õÂ֤ϡ¢´Ä¶­¤Ë¤è¤Ã¤Æ¤Ï˾¤Þ¤·¤¯¤Ê¤¤¾ì¹ç¤¬¤¢¤ë¤Î¤Ç¡¢ÆäËËÜÈִĶ­¤Þ¤¿¤Ï¥»¥­¥å¥¢¤Ç¤Ê¤¤¥Í¥Ã¥È¥ï¡¼¥¯¤Ç¤Ï¡¢\fBjstatd\fR¥×¥í¥»¥¹¤òµ¯Æ°¤¹¤ëÁ°¤Ë¡¢¥í¡¼¥«¥ë¡¦¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¤ò¸¡Æ¤¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢Â¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢\fIRMISecurityPolicy\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/PolicyFiles\&.html¤Ë¤¢¤ë ++\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢Â¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢\fBRMISecurityPolicy\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/PolicyFiles\&.html¤Ë¤¢¤ë + ¡Ö¥Ç¥Õ¥©¥ë¥È¤ÎPolicy¤Î¼ÂÁõ¤È¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Î¹½Ê¸¡×¤Ë½àµò¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹ + .PP +-¼¡¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£Îã³°¤òȯÀ¸¤»¤º¤Ë\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Ý¥ê¥·¡¼¤Ï¡¢¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥Ù¡¼¥¹¤Ø¤Î¤¢¤é¤æ¤ë¥¢¥¯¥»¥¹¸¢¤òǧ¤á¤ë¥Ý¥ê¥·¡¼¤è¤ê¤â¼«Í³ÅÙ¤¬Ä㤤¤Ç¤¹¤¬¡¢\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤ËºÇÄã¸ÂɬÍפʥ¢¥¯¥»¥¹¸¢¤Î¤ß¤òǧ¤á¤ë¥Ý¥ê¥·¡¼¤è¤ê¤â¼«Í³ÅÙ¤¬¹â¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ++¼¡¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£Îã³°¤òȯÀ¸¤»¤º¤Ë\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Ý¥ê¥·¡¼¤Ï¡¢¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥Ù¡¼¥¹¤Ø¤Î¤¢¤é¤æ¤ë¥¢¥¯¥»¥¹¸¢¤òǧ¤á¤ë¥Ý¥ê¥·¡¼¤è¤ê¤â¼«Í³ÅÙ¤¬Ä㤤¤Ç¤¹¤¬¡¢\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤ËºÇÄã¸ÂɬÍפʥ¢¥¯¥»¥¹¸¢¤Î¤ß¤òǧ¤á¤ë¥Ý¥ê¥·¡¼¤è¤ê¤â¼«Í³ÅÙ¤¬¹â¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-grant codebase "file:${java\&.home}/\&.\&./lib/tools\&.jar" { +- permission java\&.security\&.AllPermission; +-}; ++\fBgrant codebase "file:${java\&.home}/\&.\&./lib/tools\&.jar" { \fR ++\fB permission java\&.security\&.AllPermission;\fR ++\fB};\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤Î¥Ý¥ê¥·¡¼ÀßÄê¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤³¤Î¥Æ¥­¥¹¥È¤ò\fIjstatd\&.all\&.policy\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤Ë¥³¥Ô¡¼¤·¡¢¼¡¤Î¤è¤¦¤Ë\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤³¤Î¥Ý¥ê¥·¡¼ÀßÄê¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤³¤Î¥Æ¥­¥¹¥È¤ò\fBjstatd\&.all\&.policy\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤Ë¥³¥Ô¡¼¤·¡¢¼¡¤Î¤è¤¦¤Ë\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstatd \-J\-Djava\&.security\&.policy=jstatd\&.all\&.policy ++\fBjstatd \-J\-Djava\&.security\&.policy=jstatd\&.all\&.policy\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤è¤ê¸·¤·¤¤¥»¥­¥å¥ê¥Æ¥£¤ò¼Â»Ü¤¹¤ë¥µ¥¤¥È¤Î¾ì¹ç¡¢¥«¥¹¥¿¥à¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢ÆÃÄê¤Î¿®Íê¤Ç¤­¤ë¥Û¥¹¥È¤Þ¤¿¤Ï¥Í¥Ã¥È¥ï¡¼¥¯¤Ë¥¢¥¯¥»¥¹¤òÀ©¸Â¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î¤è¤¦¤ÊÊýË¡¤Ï¡¢IP¥¢¥É¥ì¥¹¤ÎÅðÄ°¹¶·â¤ò¼õ¤±¤ä¤¹¤¯¤Ê¤ê¤Þ¤¹¡£¥»¥­¥å¥ê¥Æ¥£¤ÎÌäÂê¤Ë¤Ä¤¤¤Æ¡¢¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç¤âÂнè¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¡¢\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤»¤º¤Ë¡¢\fIjstat\fR¤È\fIjps\fR¥Ä¡¼¥ë¤ò¥í¡¼¥«¥ë¤Ç»ÈÍѤ¹¤ë¤³¤È¤¬ºÇ¤â°ÂÁ´¤ÊÊýË¡¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¤è¤ê¸·¤·¤¤¥»¥­¥å¥ê¥Æ¥£¤ò¼Â»Ü¤¹¤ë¥µ¥¤¥È¤Î¾ì¹ç¡¢¥«¥¹¥¿¥à¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢ÆÃÄê¤Î¿®Íê¤Ç¤­¤ë¥Û¥¹¥È¤Þ¤¿¤Ï¥Í¥Ã¥È¥ï¡¼¥¯¤Ë¥¢¥¯¥»¥¹¤òÀ©¸Â¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î¤è¤¦¤ÊÊýË¡¤Ï¡¢IP¥¢¥É¥ì¥¹¤ÎÅðÄ°¹¶·â¤ò¼õ¤±¤ä¤¹¤¯¤Ê¤ê¤Þ¤¹¡£¥»¥­¥å¥ê¥Æ¥£¤ÎÌäÂê¤Ë¤Ä¤¤¤Æ¡¢¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç¤âÂнè¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¡¢\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤»¤º¤Ë¡¢\fBjstat\fR¤È\fBjps\fR¥Ä¡¼¥ë¤ò¥í¡¼¥«¥ë¤Ç»ÈÍѤ¹¤ë¤³¤È¤¬ºÇ¤â°ÂÁ´¤ÊÊýË¡¤Ë¤Ê¤ê¤Þ¤¹¡£ + .SH "¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹" + .PP +-\fIjstatd\fR¥×¥í¥»¥¹¤¬¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢Æȼ«¤Ë³«È¯¤·¤¿¤â¤Î¤Ç¤¢¤êÊѹ¹¤µ¤ì¤ëͽÄê¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤ª¤è¤Ó³«È¯¼Ô¤Ï¡¢¤³¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ø¤Î½ñ¹þ¤ß¤ò¹Ô¤ï¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++\fBjstatd\fR¥×¥í¥»¥¹¤¬¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢Æȼ«¤Ë³«È¯¤·¤¿¤â¤Î¤Ç¤¢¤êÊѹ¹¤µ¤ì¤ëͽÄê¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤ª¤è¤Ó³«È¯¼Ô¤Ï¡¢¤³¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ø¤Î½ñ¹þ¤ß¤ò¹Ô¤ï¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .SH "Îã" + .PP +-¼¡¤Ë¡¢\fIjstatd\fR¥³¥Þ¥ó¥É¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fIjstatd\fR¥¹¥¯¥ê¥×¥È¤Ë¤è¤Ã¤Æ¡¢¥µ¡¼¥Ð¡¼¤Ï¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼«Æ°Åª¤Ëµ¯Æ°¤·¤Þ¤¹¡£ ++¼¡¤Ë¡¢\fBjstatd\fR¥³¥Þ¥ó¥É¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fBjstatd\fR¥¹¥¯¥ê¥×¥È¤Ë¤è¤Ã¤Æ¡¢¥µ¡¼¥Ð¡¼¤Ï¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼«Æ°Åª¤Ëµ¯Æ°¤·¤Þ¤¹¡£ + .SS "ÆâÉôRMI¥ì¥¸¥¹¥È¥ê" + .PP +-¤³¤ÎÎã¤Ï¡¢ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤¿¥Û¥¹¥È¤Ë¤è¤ë\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤Îµ¯Æ°¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎRMI¥ì¥¸¥¹¥È¥ê¡¦¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ë¤Ï¡¢Â¾¤Î¥µ¡¼¥Ð¡¼¤Ï¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤Ê¤¤¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ï¡¢ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤¿\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤Îµ¯Æ°ÊýË¡¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎRMI¥ì¥¸¥¹¥È¥ê¡¦¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ë¤Ï¡¢Â¾¤Î¥µ¡¼¥Ð¡¼¤Ï¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤Ê¤¤¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "³°ÉôRMI¥ì¥¸¥¹¥È¥ê" + .PP +-¤³¤ÎÎã¤Ï¡¢³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤¿\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤Îµ¯Æ°¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ï¡¢³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤¿\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤Îµ¯Æ°¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmiregistry& +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy ++\fBrmiregistry&\fR ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢¥Ý¡¼¥È2020¤Î³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤Æ\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥Ý¡¼¥È2020¤Î³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤Æ\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jrmiregistry 2020& +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy \-p 2020 ++\fBjrmiregistry 2020&\fR ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy \-p 2020\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢¥Ý¡¼¥È2020¤Î³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤Æ¡¢\fIAlternateJstatdServerName\fR¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ë\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥Ý¡¼¥È2020¤Î³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤Æ¡¢\fBAlternateJstatdServerName\fR¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ë\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmiregistry 2020& +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy \-p 2020 +- \-n AlternateJstatdServerName ++\fBrmiregistry 2020&\fR ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy \-p 2020\fR ++\fB \-n AlternateJstatdServerName\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥¤¥ó¥×¥í¥»¥¹RMI¥ì¥¸¥¹¥È¥ê¤ÎºîÀ®¤ÎÄä»ß" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤¬¤Ê¤¤¾ì¹ç¤ËºîÀ®¤·¤Ê¤¤\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢RMI¥ì¥¸¥¹¥È¥ê¤¬¤¹¤Ç¤Ë¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£RMI¥ì¥¸¥¹¥È¥ê¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤¬¤Ê¤¤¾ì¹ç¤ËºîÀ®¤·¤Ê¤¤\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢RMI¥ì¥¸¥¹¥È¥ê¤¬¤¹¤Ç¤Ë¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£RMI¥ì¥¸¥¹¥È¥ê¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy \-nr ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy \-nr\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "RMI¥í¥®¥ó¥°¤ÎÍ­¸ú²½" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢RMI¥í¥®¥ó¥°µ¡Ç½¤òÍ­¸ú²½¤·¤Æ\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤Þ¤¿¤Ï¥µ¡¼¥Ð¡¼³èÆ°¤Î¥â¥Ë¥¿¥ê¥ó¥°¤ËÌòΩ¤Á¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢RMI¥í¥®¥ó¥°µ¡Ç½¤òÍ­¸ú²½¤·¤Æ\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤Þ¤¿¤Ï¥µ¡¼¥Ð¡¼³èÆ°¤Î¥â¥Ë¥¿¥ê¥ó¥°¤ËÌòΩ¤Á¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy +- \-J\-Djava\&.rmi\&.server\&.logCalls=true ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy\fR ++\fB \-J\-Djava\&.rmi\&.server\&.logCalls=true\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/linux/doc/man/ja/jvisualvm.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/jvisualvm.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jvisualvm +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jvisualvm ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jvisualvm" "1" "2013ǯ11·î21Æü" "JDK 8" "Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jvisualvm \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò»ë³ÐŪ¤Ë´Æ»ë¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥È¤ª¤è¤Ó¥×¥í¥Õ¥¡¥¤¥ë¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++jvisualvm \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò»ë³ÐŪ¤Ë¥â¥Ë¥¿¡¼¤·¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤È¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤ò¹Ô¤¤¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjvisualvm\fR [ \fIoptions\fR ] ++\fBjvisualvm\fR [ \fIoptions\fR ] + .fi + .if n \{\ + .RE +@@ -64,15 +66,15 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-Java VisualVM¤Ï¡¢»ØÄꤵ¤ì¤¿Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤ÇJava¥Æ¥¯¥Î¥í¥¸¡¦¥Ù¡¼¥¹¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó(Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó)¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤­¤Ë¡¢¤½¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë´Ø¤¹¤ë¾ÜºÙ¤Ê¾ðÊó¤òÄ󶡤¹¤ëľ´¶Åª¤Ê¥°¥é¥Õ¥£¥«¥ë¡¦¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£Java VisualVM¤È¤¤¤¦Ì¾Á°¤Ï¡¢Java VisualVM¤¬JVM¥½¥Õ¥È¥¦¥§¥¢¤Ë´Ø¤¹¤ë¾ðÊó¤ò»ë³ÐŪ¤ËÄ󶡤¹¤ë¤È¤¤¤¦»ö¼Â¤ËͳÍ褷¤Æ¤¤¤Þ¤¹¡£ ++Java VisualVM¤Ï¡¢»ØÄꤵ¤ì¤¿Java Virtual Machine (JVM)¤ÇJava¥Æ¥¯¥Î¥í¥¸¡¦¥Ù¡¼¥¹¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó(Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó)¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤­¤Ë¡¢¤½¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë´Ø¤¹¤ë¾ÜºÙ¤Ê¾ðÊó¤òÄ󶡤¹¤ëľ´¶Åª¤Ê¥°¥é¥Õ¥£¥«¥ë¡¦¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£Java VisualVM¤È¤¤¤¦Ì¾Á°¤Ï¡¢Java VisualVM¤¬JVM¥½¥Õ¥È¥¦¥§¥¢¤Ë´Ø¤¹¤ë¾ðÊó¤ò»ë³ÐŪ¤ËÄ󶡤¹¤ë¤È¤¤¤¦»ö¼Â¤ËͳÍ褷¤Æ¤¤¤Þ¤¹¡£ + .PP +-Java VisualVM¤Ï¡¢¤¤¤¯¤Ä¤«¤Î¥â¥Ë¥¿¥ê¥ó¥°¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ª¤è¤Ó¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò1¤Ä¤Î¥Ä¡¼¥ë¤ËÅý¹ç¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¹¥¿¥ó¥É¥¢¥í¥ó¡¦¥Ä¡¼¥ë\fIjmap\fR¡¢\fIjinfo\fR¡¢\fIjstat\fR¤ª¤è¤Ó\fIjstack\fR¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ëµ¡Ç½¤Î¤Û¤È¤ó¤É¤¬¡¢Java VisualVM¤ËÁȤ߹þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fIjconsole\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë°ìÉô¤Îµ¡Ç½¤Ê¤É¡¢Â¾¤Îµ¡Ç½¤Ï¥ª¥×¥·¥ç¥ó¤Î¥×¥é¥°¥¤¥ó¤È¤·¤ÆÄɲäǤ­¤Þ¤¹¡£ ++Java VisualVM¤Ï¡¢¤¤¤¯¤Ä¤«¤Î¥â¥Ë¥¿¥ê¥ó¥°¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ª¤è¤Ó¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò1¤Ä¤Î¥Ä¡¼¥ë¤ËÅý¹ç¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¹¥¿¥ó¥É¥¢¥í¥ó¡¦¥Ä¡¼¥ë\fBjmap\fR¡¢\fBjinfo\fR¡¢\fBjstat\fR¤ª¤è¤Ó\fBjstack\fR¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ëµ¡Ç½¤Î¤Û¤È¤ó¤É¤¬¡¢Java VisualVM¤ËÁȤ߹þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fBjconsole\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë°ìÉô¤Îµ¡Ç½¤Ê¤É¡¢Â¾¤Îµ¡Ç½¤Ï¥ª¥×¥·¥ç¥ó¤Î¥×¥é¥°¥¤¥ó¤È¤·¤ÆÄɲäǤ­¤Þ¤¹¡£ + .PP +-Java VisualVM¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î³«È¯¼Ô¤¬¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ò¹Ô¤Ã¤¿¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò´Æ»ë¤ª¤è¤Ó²þÁ±¤·¤¿¤ê¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£Java VisualVM¤ò»ÈÍѤ¹¤ë¤È¡¢³«È¯¼Ô¤Ï¥Ò¡¼¥×¡¦¥À¥ó¥×¤ÎÀ¸À®¤ª¤è¤Ó²òÀÏ¡¢¥á¥â¥ê¡¼¡¦¥ê¡¼¥¯¤ÎÆÃÄê¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¼Â¹Ô¤ª¤è¤Ó´Æ»ë¡¢¤ª¤è¤Ó¥á¥â¥ê¡¼¤ÈCPU¤Î´Ê°×¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤Î¼Â¹Ô¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£¥×¥é¥°¥¤¥ó¤ÇJava VisualVM¤Îµ¡Ç½¤ò³ÈÄ¥¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjconsole\fR¥³¥Þ¥ó¥É¤Î¤Û¤È¤ó¤É¤Îµ¡Ç½¤Ï¡¢¡ÖMBean¡×¥¿¥Ö¤ª¤è¤ÓJConsole Plug\-in Wrapper¥×¥é¥°¥¤¥ó¤ò²ð¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£É¸½à¤ÎJava VisualVM¥×¥é¥°¥¤¥ó¤Î¥«¥¿¥í¥°¤«¤éÁªÂò¤¹¤ë¤Ë¤Ï¡¢Java VisualVM¥á¥Ë¥å¡¼¤Î\fB¡Ö¥Ä¡¼¥ë¡×\fR¡¢\fB¡Ö¥×¥é¥°¥¤¥ó¡×\fR¤òÁªÂò¤·¤Þ¤¹¡£ ++Java VisualVM¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î³«È¯¼Ô¤¬¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ò¹Ô¤Ã¤¿¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¥â¥Ë¥¿¡¼¤ª¤è¤Ó²þÁ±¤·¤¿¤ê¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£Java VisualVM¤ò»ÈÍѤ¹¤ë¤È¡¢³«È¯¼Ô¤Ï¥Ò¡¼¥×¡¦¥À¥ó¥×¤ÎÀ¸À®¤ª¤è¤Ó²òÀÏ¡¢¥á¥â¥ê¡¼¡¦¥ê¡¼¥¯¤ÎÆÃÄê¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¼Â¹Ô¤ª¤è¤Ó¥â¥Ë¥¿¡¼¡¢¤ª¤è¤Ó¥á¥â¥ê¡¼¤ÈCPU¤Î´Ê°×¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤Î¼Â¹Ô¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£¥×¥é¥°¥¤¥ó¤ÇJava VisualVM¤Îµ¡Ç½¤ò³ÈÄ¥¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjconsole\fR¥³¥Þ¥ó¥É¤Î¤Û¤È¤ó¤É¤Îµ¡Ç½¤Ï¡¢¡ÖMBean¡×¥¿¥Ö¤ª¤è¤ÓJConsole Plug\-in Wrapper¥×¥é¥°¥¤¥ó¤ò²ð¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£É¸½à¤ÎJava VisualVM¥×¥é¥°¥¤¥ó¤Î¥«¥¿¥í¥°¤«¤éÁªÂò¤¹¤ë¤Ë¤Ï¡¢Java VisualVM¥á¥Ë¥å¡¼¤Î\fB¡Ö¥Ä¡¼¥ë¡×\fR¡¢\fB¡Ö¥×¥é¥°¥¤¥ó¡×\fR¤òÁªÂò¤·¤Þ¤¹¡£ + .PP + Java VisualVM¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp +@@ -80,7 +82,8 @@ + .RS 4 + .\} + .nf +-% jvisualvm <options> ++\fB% jvisualvm <options>\fR ++ + .fi + .if n \{\ + .RE +@@ -91,7 +94,7 @@ + .PP + \-J\fIjvm_option\fR + .RS 4 +-¤³¤Î\fIjvm_option\fR¤òJVM¥½¥Õ¥È¥¦¥§¥¢¤ËÅϤ·¤Þ¤¹¡£ ++¤³¤Î\fBjvm_option\fR¤òJVM¥½¥Õ¥È¥¦¥§¥¢¤ËÅϤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/keytool.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/keytool.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: keytool +-.\" Language: English +-.\" Date: 2013ǯ8·î6Æü +-.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: keytool ++.\" Language: Japanese ++.\" Date: 2013ǯ8·î6Æü ++.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "keytool" "1" "2013ǯ8·î6Æü" "JDK 8" "¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + keytool \- °Å¹æ²½¸°¡¢X\&.509¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ª¤è¤Ó¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò´Þ¤à¥­¡¼¥¹¥È¥¢(¥Ç¡¼¥¿¥Ù¡¼¥¹)¤ò´ÉÍý¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIkeytool\fR [\fIcommands\fR] ++\fBkeytool\fR [\fIcommands\fR] + .fi + .if n \{\ + .RE +@@ -332,13 +334,13 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¸°¤È¾ÚÌÀ½ñ¤ò´ÉÍý¤¹¤ë¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ç¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥æ¡¼¥¶¡¼¤Ï¼«Ê¬¤Î¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤ª¤è¤Ó´ØÏ¢¤¹¤ë¾ÚÌÀ½ñ¤ò´ÉÍý¤·¡¢¥Ç¥¸¥¿¥ë½ð̾¤ò»ÈÍѤ·¤¿¼«¸Êǧ¾Ú(¾¤Î¥æ¡¼¥¶¡¼¤Þ¤¿¤Ï¥µ¡¼¥Ó¥¹¤ËÂФ·¤Æ¼«Ê¬¼«¿È¤òǧ¾Ú¤¹¤ë¤³¤È)¤ä¡¢¥Ç¡¼¥¿¤ÎÀ°¹çÀ­¤È¾ÚÌÀ½ñ¤Ë´Ø¤¹¤ë¥µ¡¼¥Ó¥¹¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÄÌ¿®¤·¤Æ¤¤¤ë¥Ô¥¢¤Î¸ø³«¸°¤ò¥­¥ã¥Ã¥·¥å¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹(¾ÚÌÀ½ñ¤Î¥Õ¥©¡¼¥à¤Ç)¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¸°¤È¾ÚÌÀ½ñ¤ò´ÉÍý¤¹¤ë¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ç¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥æ¡¼¥¶¡¼¤Ï¼«Ê¬¤Î¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤ª¤è¤Ó´ØÏ¢¤¹¤ë¾ÚÌÀ½ñ¤ò´ÉÍý¤·¡¢¥Ç¥¸¥¿¥ë½ð̾¤ò»ÈÍѤ·¤¿¼«¸Êǧ¾Ú(¾¤Î¥æ¡¼¥¶¡¼¤Þ¤¿¤Ï¥µ¡¼¥Ó¥¹¤ËÂФ·¤Æ¼«Ê¬¼«¿È¤òǧ¾Ú¤¹¤ë¤³¤È)¤ä¡¢¥Ç¡¼¥¿¤ÎÀ°¹çÀ­¤È¾ÚÌÀ½ñ¤Ë´Ø¤¹¤ë¥µ¡¼¥Ó¥¹¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÄÌ¿®¤·¤Æ¤¤¤ë¥Ô¥¢¤Î¸ø³«¸°¤ò¥­¥ã¥Ã¥·¥å¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹(¾ÚÌÀ½ñ¤Î¥Õ¥©¡¼¥à¤Ç)¡£ + .PP + ¾ÚÌÀ½ñ¤È¤Ï¡¢¤¢¤ë¥¨¥ó¥Æ¥£¥Æ¥£(¿Íʪ¡¢²ñ¼Ò¤Ê¤É)¤«¤é¤Î¥Ç¥¸¥¿¥ë½ð̾ÉÕ¤­¤Îʸ½ñ¤Î¤³¤È¤Ç¤¹¡£¾ÚÌÀ½ñ¤Ë¤Ï¡¢Â¾¤Î¤¢¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸ø³«¸°(¤ª¤è¤Ó¤½¤Î¾¤Î¾ðÊó)¤¬ÆÃÊ̤ÊÃͤò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬½ñ¤«¤ì¤Æ¤¤¤Þ¤¹¡£(¾ÚÌÀ½ñ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£)¥Ç¡¼¥¿¤Ë¥Ç¥¸¥¿¥ë½ð̾¤¬ÉÕ¤¤¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥¸¥¿¥ë½ð̾¤ò¸¡¾Ú¤¹¤ë¤³¤È¤Ç¡¢¥Ç¡¼¥¿¤ÎÀ°¹çÀ­¤ª¤è¤Ó¥Ç¡¼¥¿¤¬ËÜʪ¤Ç¤¢¤ë¤³¤È¤ò¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£¥Ç¡¼¥¿¤ÎÀ°¹çÀ­¤È¤Ï¡¢¥Ç¡¼¥¿¤¬Êѹ¹¤µ¤ì¤¿¤ê¡¢²þÊѤµ¤ì¤¿¤ê¤·¤Æ¤¤¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤Þ¤¿¡¢¥Ç¡¼¥¿¤¬ËÜʪ¤Ç¤¢¤ë¤È¤Ï¡¢¤½¤Î¥Ç¡¼¥¿¤¬¡¢¥Ç¡¼¥¿¤òºîÀ®¤·¤Æ½ð̾¤·¤¿¤È¾Î¤¹¤ë¿Íʪ¤«¤éÅϤµ¤ì¤¿¥Ç¡¼¥¿¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .PP +-¤Þ¤¿¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢ÂоΰŹ沽/Éü¹æ²½(DES)¤Ç»ÈÍѤµ¤ì¤ëÈëÌ©¸°¤ª¤è¤Ó¥Ñ¥¹¥Õ¥ì¡¼¥º¤ò´ÉÍý¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++¤Þ¤¿¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢ÂоΰŹ沽/Éü¹æ²½(DES)¤Ç»ÈÍѤµ¤ì¤ëÈëÌ©¸°¤ª¤è¤Ó¥Ñ¥¹¥Õ¥ì¡¼¥º¤ò´ÉÍý¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¸°¤È¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¸°¤È¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥³¥Þ¥ó¥É¤È¥ª¥×¥·¥ç¥ó¤Ë´Ø¤¹¤ëÃí°Õ" + .PP + ÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤È¤½¤ÎÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +@@ -384,7 +386,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥ª¥×¥·¥ç¥ó¤ò°Ï¤àÃ楫¥Ã¥³¤Ï¡¢¤½¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤ¬»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£Ã楫¥Ã¥³¤Ï¡¢\fI\-v\fR¡¢\fI\-rfc\fR¤ª¤è¤Ó\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò°Ï¤à¤¿¤á¤Ë¤â»ÈÍѤµ¤ì¤Þ¤¹¤¬¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤵ¤ì¤¿¾ì¹ç¤Ë¤Î¤ß°ÕÌ£¤ò»ý¤Á¤Þ¤¹¡£»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç°Ê³°¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤϤ¢¤ê¤Þ¤»¤ó¡£ ++¥ª¥×¥·¥ç¥ó¤ò°Ï¤àÃ楫¥Ã¥³¤Ï¡¢¤½¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤ¬»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£Ã楫¥Ã¥³¤Ï¡¢\fB\-v\fR¡¢\fB\-rfc\fR¤ª¤è¤Ó\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò°Ï¤à¤¿¤á¤Ë¤â»ÈÍѤµ¤ì¤Þ¤¹¤¬¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿¾ì¹ç¤Ë¤Î¤ß°ÕÌ£¤ò»ý¤Á¤Þ¤¹¡£»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç°Ê³°¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤϤ¢¤ê¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -395,7 +397,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥ª¥×¥·¥ç¥ó¤ò°Ï¤à³Ñ¥«¥Ã¥³¤Ï¡¢¤½¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢ÃͤÎÆþÎϤòµá¤á¤é¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fI\-keypass\fR¥ª¥×¥·¥ç¥ó¤Î¾ì¹ç¡¢¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤¬¤Þ¤º¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ÈÍѤ·¤ÆÈó¸ø³«/ÈëÌ©¸°¤ÎÉü¸µ¤ò»î¤ß¤Þ¤¹¡£¤³¤Î»î¤ß¤¬¼ºÇÔ¤·¤¿¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê¡¢Èó¸ø³«/ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥ª¥×¥·¥ç¥ó¤ò°Ï¤à³Ñ¥«¥Ã¥³¤Ï¡¢¤½¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢ÃͤÎÆþÎϤòµá¤á¤é¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fB\-keypass\fR¥ª¥×¥·¥ç¥ó¤Î¾ì¹ç¡¢¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤¬¤Þ¤º¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ÈÍѤ·¤ÆÈó¸ø³«/ÈëÌ©¸°¤ÎÉü¸µ¤ò»î¤ß¤Þ¤¹¡£¤³¤Î»î¤ß¤¬¼ºÇÔ¤·¤¿¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê¡¢Èó¸ø³«/ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -406,12 +408,12 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥¤¥¿¥ê¥Ã¥¯ÂΤιàÌܤμºݤÎÃÍ(¥ª¥×¥·¥ç¥ó¤ÎÃÍ)¤Ï¡¢»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-printcert\fR¥³¥Þ¥ó¥É¤Î·Á¼°¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ ++¥¤¥¿¥ê¥Ã¥¯ÂΤιàÌܤμºݤÎÃÍ(¥ª¥×¥·¥ç¥ó¤ÎÃÍ)¤Ï¡¢»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-printcert\fR¥³¥Þ¥ó¥É¤Î·Á¼°¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp +-\fIkeytool \-printcert {\-file cert_file} {\-v}\fR ++\fBkeytool \-printcert {\-file cert_file} {\-v}\fR + .sp +-\fI\-printcert\fR¥³¥Þ¥ó¥É¤ò»ØÄꤹ¤ë¾ì¹ç¤Ï¡¢\fIcert_file\fR¤ò¼ÂºÝ¤Î¥Õ¥¡¥¤¥ë̾¤ÇÃÖ¤­´¹¤¨¤Þ¤¹¡£Îã: +-\fIkeytool \-printcert \-file VScert\&.cer\fR ++\fB\-printcert\fR¥³¥Þ¥ó¥É¤ò»ØÄꤹ¤ë¾ì¹ç¤Ï¡¢\fBcert_file\fR¤ò¼ÂºÝ¤Î¥Õ¥¡¥¤¥ë̾¤ÇÃÖ¤­´¹¤¨¤Þ¤¹¡£Îã: ++\fBkeytool \-printcert \-file VScert\&.cer\fR + .RE + .sp + .RS 4 +@@ -433,7 +435,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-help\fR¥ª¥×¥·¥ç¥ó¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIkeytool \-help\fR¤ÈƱ¤¸¤Ç¤¹¡£ ++\fB\-help\fR¥ª¥×¥·¥ç¥ó¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBkeytool \-help\fR¤ÈƱ¤¸¤Ç¤¹¡£ + .RE + .SH "¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃÍ" + .PP +@@ -443,38 +445,39 @@ + .RS 4 + .\} + .nf +-\-alias "mykey" ++\fB\-alias "mykey"\fR ++\fB \fR ++\fB\-keyalg\fR ++\fB "DSA" (when using \-genkeypair)\fR ++\fB "DES" (when using \-genseckey)\fR ++\fB \fR ++\fB\-keysize\fR ++\fB 2048 (when using \-genkeypair and \-keyalg is "RSA")\fR ++\fB 1024 (when using \-genkeypair and \-keyalg is "DSA")\fR ++\fB 256 (when using \-genkeypair and \-keyalg is "EC")\fR ++\fB 56 (when using \-genseckey and \-keyalg is "DES")\fR ++\fB 168 (when using \-genseckey and \-keyalg is "DESede")\fR ++\fB \fR ++\fB\-validity 90\fR ++\fB \fR ++\fB\-keystore <the file named \&.keystore in the user\*(Aqs home directory>\fR ++\fB \fR ++\fB\-storetype <the value of the "keystore\&.type" property in the\fR ++\fB security properties file, which is returned by the static\fR ++\fB getDefaultType method in java\&.security\&.KeyStore>\fR ++\fB \fR ++\fB\-file\fR ++\fB stdin (if reading)\fR ++\fB stdout (if writing)\fR ++\fB \fR ++\fB\-protected false\fR + +-\-keyalg +- "DSA" (when using \-genkeypair) +- "DES" (when using \-genseckey) +- +-\-keysize +- 2048 (when using \-genkeypair and \-keyalg is "RSA") +- 1024 (when using \-genkeypair and \-keyalg is "DSA") +- 256 (when using \-genkeypair and \-keyalg is "EC") +- 56 (when using \-genseckey and \-keyalg is "DES") +- 168 (when using \-genseckey and \-keyalg is "DESede") +- +-\-validity 90 +- +-\-keystore <the file named \&.keystore in the user\*(Aqs home directory> +- +-\-storetype <the value of the "keystore\&.type" property in the +- security properties file, which is returned by the static +- getDefaultType method in java\&.security\&.KeyStore> +- +-\-file +- stdin (if reading) +- stdout (if writing) +- +-\-protected false + .fi + .if n \{\ + .RE + .\} + .PP +-¸ø³«/ÈëÌ©¸°¥Ú¥¢¤ÎÀ¸À®¤Ë¤ª¤¤¤Æ¡¢½ð̾¥¢¥ë¥´¥ê¥º¥à(\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó)¤Ï¡¢´ð¤Ë¤Ê¤ëÈëÌ©¸°¤Î¥¢¥ë¥´¥ê¥º¥à¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£ ++¸ø³«/ÈëÌ©¸°¥Ú¥¢¤ÎÀ¸À®¤Ë¤ª¤¤¤Æ¡¢½ð̾¥¢¥ë¥´¥ê¥º¥à(\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó)¤Ï¡¢´ð¤Ë¤Ê¤ëÈëÌ©¸°¤Î¥¢¥ë¥´¥ê¥º¥à¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -484,7 +487,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬DSA¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA1withDSA¤Ë¤Ê¤ê¤Þ¤¹¡£ ++´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬DSA¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA1withDSA¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -495,7 +498,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬RSA¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA256withRSA¤Ë¤Ê¤ê¤Þ¤¹¡£ ++´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬RSA¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA256withRSA¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -506,16 +509,16 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬EC¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA256withECDSA¤Ë¤Ê¤ê¤Þ¤¹¡£ ++´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬EC¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA256withECDSA¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP +-\fI\-keyalg\fR¤ª¤è¤Ó\fI\-sigalg\fR°ú¿ô¤Î´°Á´¤Ê¥ê¥¹¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢ ++\fB\-keyalg\fR¤ª¤è¤Ó\fB\-sigalg\fR°ú¿ô¤Î´°Á´¤Ê¥ê¥¹¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢ + http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec\&.html#AppA¤Î¡ÖJava Cryptography Architecture (JCA) Reference Guide¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "°ìÈÌ¥ª¥×¥·¥ç¥ó" + .PP +-\fI\-v\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-help\fR¥³¥Þ¥ó¥É¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ÈÍѤǤ­¤Þ¤¹¡£\fI\-v\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¾éĹ¥â¡¼¥É¤Ç¼Â¹Ô¤µ¤ì¡¢¾ÜºÙ¤Ê¾ðÊ󤬽ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-v\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-help\fR¥³¥Þ¥ó¥É¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ÈÍѤǤ­¤Þ¤¹¡£\fB\-v\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¾éĹ¥â¡¼¥É¤Ç¼Â¹Ô¤µ¤ì¡¢¾ÜºÙ¤Ê¾ðÊ󤬽ÐÎϤµ¤ì¤Þ¤¹¡£ + .PP +-Ǥ°Õ¤Î¥³¥Þ¥ó¥É¤Ç»ØÄê¤Ç¤­¤ë\fI\-Jjavaoption\fR°ú¿ô¤â¤¢¤ê¤Þ¤¹¡£\fI\-Jjavaoption\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢»ØÄꤵ¤ì¤¿\fIjavaoption\fRʸ»úÎó¤¬Java¥¤¥ó¥¿¥×¥ê¥¿¤ËľÀÜÅϤµ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤòÄ´À°¤¹¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£»ØÄê¤Ç¤­¤ë¥¤¥ó¥¿¥×¥ê¥¿¡¦¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjava \-h\fR¤Þ¤¿¤Ï\fIjava \-X\fR¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£ ++Ǥ°Õ¤Î¥³¥Þ¥ó¥É¤Ç»ØÄê¤Ç¤­¤ë\fB\-Jjavaoption\fR°ú¿ô¤â¤¢¤ê¤Þ¤¹¡£\fB\-Jjavaoption\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢»ØÄꤵ¤ì¤¿\fBjavaoption\fRʸ»úÎó¤¬Java¥¤¥ó¥¿¥×¥ê¥¿¤ËľÀÜÅϤµ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤòÄ´À°¤¹¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£»ØÄê¤Ç¤­¤ë¥¤¥ó¥¿¥×¥ê¥¿¡¦¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç\fBjava \-h\fR¤Þ¤¿¤Ï\fBjava \-X\fR¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£ + .PP + ¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥­¡¼¥¹¥È¥¢¤ËÂФ¹¤ëÁàºî¤ò¹Ô¤¦¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ + .PP +@@ -528,18 +531,18 @@ + .RS 4 + ¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-ÆÃÄê¤Î\fIkeytool\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë¡¢JKS +-\fIstoretype\fR¤¬»ÈÍѤµ¤ì¡¢¤«¤Ä¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¿·¤·¤¤¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIkeytool \-genkeypair\fR¤Î¸Æ½Ð¤·»þ¤Ë\fI\-keystore\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fI\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢¤½¤³¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£Æ±Íͤˡ¢\fI\-keystore ks_file\fR¤È¤¤¤¦¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤â¤½¤Îks_file¤¬Â¸ºß¤·¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£JKS +-\fIstoretype\fR¤Î¾ÜºÙ¤Ï¡¢\fI¤Î\fRKeyStore¤Î¼ÂÁõ¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾¤Ë´Ø¤¹¤ë¹à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ÆÃÄê¤Î\fBkeytool\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë¡¢JKS ++\fBstoretype\fR¤¬»ÈÍѤµ¤ì¡¢¤«¤Ä¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¿·¤·¤¤¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBkeytool \-genkeypair\fR¤Î¸Æ½Ð¤·»þ¤Ë\fB\-keystore\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fB\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢¤½¤³¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£Æ±Íͤˡ¢\fB\-keystore ks_file\fR¤È¤¤¤¦¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤â¤½¤Îks_file¤¬Â¸ºß¤·¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£JKS ++\fBstoretype\fR¤Î¾ÜºÙ¤Ï¡¢\fI¤Î\fRKeyStore¤Î¼ÂÁõ¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾¤Ë´Ø¤¹¤ë¹à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-keystore\fR¥ª¥×¥·¥ç¥ó¤«¤é¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¡¢\fIKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£URL¤È¤·¤Æ\fINONE\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢null¤Î¥¹¥È¥ê¡¼¥à¤¬\fIKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£\fINONE\fR¤Ï¡¢KeyStore¤¬¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ë»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¡¦¥Ç¥Ð¥¤¥¹¾å¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ê¤É¤Ç¤¹¡£ ++\fB\-keystore\fR¥ª¥×¥·¥ç¥ó¤«¤é¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¡¢\fBKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£URL¤È¤·¤Æ\fBNONE\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢null¤Î¥¹¥È¥ê¡¼¥à¤¬\fBKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£\fBNONE\fR¤Ï¡¢KeyStore¤¬¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ë»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¡¦¥Ç¥Ð¥¤¥¹¾å¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ê¤É¤Ç¤¹¡£ + .RE + .PP + \-storepass[:\fIenv\fR| :\fIfile\fR] argument + .RS 4 + ¥­¡¼¥¹¥È¥¢¤ÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-½¤¾þ»Ò\fIenv\fR¤Þ¤¿¤Ï\fIfile\fR¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fIargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ÎÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ ++½¤¾þ»Ò\fBenv\fR¤Þ¤¿¤Ï\fBfile\fR¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fBargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ÎÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -549,8 +552,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIenv\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBenv\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -561,13 +564,13 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIfile\fR: argument¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBfile\fR: argument¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + \fBÃí°Õ:\fR +-\fI\-keypass\fR¡¢\fI\-srckeypass\fR¡¢\-\fIdestkeypass\fR¡¢\fI\-srcstorepass\fR¡¢\fI\-deststorepass\fR¤Ê¤É¤Î¥Ñ¥¹¥ï¡¼¥É¤òɬÍפȤ¹¤ë¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¡¢\fIenv\fR¤ª¤è¤Ó\fIfile\fR½¤¾þ»Ò¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¡¦¥ª¥×¥·¥ç¥ó¤È½¤¾þ»Ò¤Ï¡¢É¬¤º¥³¥í¥ó(:)¤Ç¶èÀڤäƤ¯¤À¤µ¤¤¡£ ++\fB\-keypass\fR¡¢\fB\-srckeypass\fR¡¢\-\fBdestkeypass\fR¡¢\fB\-srcstorepass\fR¡¢\fB\-deststorepass\fR¤Ê¤É¤Î¥Ñ¥¹¥ï¡¼¥É¤òɬÍפȤ¹¤ë¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¡¢\fIenv\fR¤ª¤è¤Ó\fIfile\fR½¤¾þ»Ò¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¡¦¥ª¥×¥·¥ç¥ó¤È½¤¾þ»Ò¤Ï¡¢É¬¤º¥³¥í¥ó(:)¤Ç¶èÀڤäƤ¯¤À¤µ¤¤¡£ + .sp +-¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤ÎÆâÍƤ˥¢¥¯¥»¥¹¤¹¤ë¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¼ï¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤ÎÆâÍƤ˥¢¥¯¥»¥¹¤¹¤ë¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¼ï¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp + ¥­¡¼¥¹¥È¥¢¤«¤é¾ðÊó¤ò¼èÆÀ¤¹¤ë¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¾Êά²Äǽ¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¼èÆÀ¤·¤¿¾ðÊó¤ÎÀ°¹çÀ­¤ò¸¡¾Ú¤Ç¤­¤º¡¢·Ù¹ð¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .RE +@@ -584,75 +587,74 @@ + .PP + \-providerArg \fIprovider_arg\fR + .RS 4 +-\fI\-providerClass\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤµ¤ì¡¢\fIprovider_class_name\fR¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¥ª¥×¥·¥ç¥ó¤Îʸ»úÎóÆþÎÏ°ú¿ô¤òɽ¤·¤Þ¤¹¡£ ++\fB\-providerClass\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤµ¤ì¡¢\fBprovider_class_name\fR¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¥ª¥×¥·¥ç¥ó¤Îʸ»úÎóÆþÎÏ°ú¿ô¤òɽ¤·¤Þ¤¹¡£ + .RE + .PP + \-protected + .RS 4 +-\fItrue\fR¤Þ¤¿¤Ï\fIfalse\fR¤Î¤¤¤º¤ì¤«¡£¥Ñ¥¹¥ï¡¼¥É¤òÀìÍÑPIN¥ê¡¼¥À¡¼¤Ê¤É¤ÎÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹·Ðͳ¤Ç»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤ÎÃͤò\fItrue\fR¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI\-importkeystore\fR¥³¥Þ¥ó¥É¤Ë¤Ï2¤Ä¤Î¥­¡¼¥¹¥È¥¢¤¬´ØÏ¢¤·¤Æ¤¤¤ë¤¿¤á¡¢¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢¤È°¸À襭¡¼¥¹¥È¥¢¤Ë¤½¤ì¤¾¤ì¼¡¤Î2¤Ä¤Î¥ª¥×¥·¥ç¥ó¡¢\fI\-srcprotected\fR¤È\-\fIdestprotected\fR¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fBtrue\fR¤Þ¤¿¤Ï\fBfalse\fR¤Î¤¤¤º¤ì¤«¡£¥Ñ¥¹¥ï¡¼¥É¤òÀìÍÑPIN¥ê¡¼¥À¡¼¤Ê¤É¤ÎÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹·Ðͳ¤Ç»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤ÎÃͤò\fBtrue\fR¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-importkeystore\fR¥³¥Þ¥ó¥É¤Ë¤Ï2¤Ä¤Î¥­¡¼¥¹¥È¥¢¤¬´ØÏ¢¤·¤Æ¤¤¤ë¤¿¤á¡¢¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢¤È°¸À襭¡¼¥¹¥È¥¢¤Ë¤½¤ì¤¾¤ì¼¡¤Î2¤Ä¤Î¥ª¥×¥·¥ç¥ó¡¢\fB\-srcprotected\fR¤È\-\fBdestprotected\fR¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-ext \fI{name{:critical} {=value}}\fR + .RS 4 +-X\&.509¾ÚÌÀ½ñ¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fI\-genkeypair\fR¤ª¤è¤Ó\fI\-gencert\fR¤Ç»ÈÍѤ·¤Æ¡¢À¸À®¤µ¤ì¤ë¾ÚÌÀ½ñ¤Þ¤¿¤Ï\fI\-certreq\fR¤Ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤òËä¤á¹þ¤ß¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤Ç¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÊ£¿ô²ó»ØÄê¤Ç¤­¤Þ¤¹¡£\fIname\fR°ú¿ô¤Ë¤Ï¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó̾(̾Á°ÉÕ¤­¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò»²¾È)¤Þ¤¿¤ÏǤ°Õ¤ÎOIDÈÖ¹æ¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIvalue\fR°ú¿ô¤Ï¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î°ú¿ô¤ò»Ø¤·¤Þ¤¹¡£\fIvalue\fR¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤޤ¿¤Ï¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬°ú¿ô¤òɬÍפȤ·¤Ê¤¤¤³¤È¤ò¼¨¤·¤Þ¤¹¡£\fI:critical\fR½¤¾þ»Ò¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î\fIisCritical\fR°À­¤Ï\fItrue\fR¤Ç¡¢»ØÄꤵ¤ì¤Ê¤¤¾ì¹ç¤Ï\fIfalse\fR¤Ç¤¹¡£\fI:critical\fR¤Î¤«¤ï¤ê¤Ë\fI:c\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++X\&.509¾ÚÌÀ½ñ¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fB\-genkeypair\fR¤ª¤è¤Ó\fB\-gencert\fR¤Ç»ÈÍѤ·¤Æ¡¢À¸À®¤µ¤ì¤ë¾ÚÌÀ½ñ¤Þ¤¿¤Ï\fB\-certreq\fR¤Ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤òËä¤á¹þ¤ß¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤Ç¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÊ£¿ô²ó»ØÄê¤Ç¤­¤Þ¤¹¡£\fBname\fR°ú¿ô¤Ë¤Ï¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó̾(̾Á°ÉÕ¤­¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò»²¾È)¤Þ¤¿¤ÏǤ°Õ¤ÎOIDÈÖ¹æ¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBvalue\fR°ú¿ô¤Ï¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î°ú¿ô¤ò»Ø¤·¤Þ¤¹¡£\fIvalue\fR¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤޤ¿¤Ï¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬°ú¿ô¤òɬÍפȤ·¤Ê¤¤¤³¤È¤ò¼¨¤·¤Þ¤¹¡£\fB:critical\fR½¤¾þ»Ò¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î\fBisCritical\fR°À­¤Ï\fBtrue\fR¤Ç¡¢»ØÄꤵ¤ì¤Ê¤¤¾ì¹ç¤Ï\fBfalse\fR¤Ç¤¹¡£\fB:critical\fR¤Î¤«¤ï¤ê¤Ë\fB:c\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .SH "̾Á°ÉÕ¤­¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó" + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î̾Á°¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£Ì¾Á°¤ÎÂç/¾®Ê¸»ú¤Ï¶èÊ̤µ¤ì¤Þ¤»¤ó¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î̾Á°¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£Ì¾Á°¤ÎÂç/¾®Ê¸»ú¤Ï¶èÊ̤µ¤ì¤Þ¤»¤ó¡£ + .PP + BC¤Þ¤¿¤ÏBasicContraints + .RS 4 +-\fBÃÍ\fR: ´°Á´¤Ê·Á¼°¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹: +-\fIca:{true|false}[,pathlen:<len>]\fR¤Þ¤¿¤Ï\fI<len>\fR(¤³¤ì¤Ï¡¢\fIca:true,pathlen:<len>\fR¤Îû½Ì·Á¤Ç¤¹)¡£<\fIlen\fR>¤ò¾Êά¤¹¤ë¤È¡¢\fIca:true\fR¤Î°ÕÌ£¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBÃÍ\fR: ´°Á´¤Ê·Á¼°¤Ï¡¢\fBca:{true|false}[,pathlen:<len>]\fR¤Þ¤¿¤Ï\fB<len>\fR(\fBca:true,pathlen:<len>\fR¤Îû½Ì·Á)¤Ç¤¹¡£<\fBlen\fR>¤ò¾Êά¤¹¤ë¤È¡¢\fBca:true\fR¤Î°ÕÌ£¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + KU¤Þ¤¿¤ÏKeyUsage + .RS 4 + \fBÃÍ\fR: +-\fIusage\fR(\fIusage\fR)*¡¢\fIusage\fR¤Ë¤Ï\fIdigitalSignature\fR¡¢\fInonRepudiation\fR +-(contentCommitment)¡¢\fIkeyEncipherment\fR¡¢\fIdataEncipherment\fR¡¢\fIkeyAgreement\fR¡¢\fIkeyCertSign\fR¡¢\fIcRLSign\fR¡¢\fIencipherOnly\fR¡¢\fIdecipherOnly\fR¤Î¤¤¤º¤ì¤«¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIusage\fR°ú¿ô¤Ï¡¢ÉÔÌÀ³Î¤Ë¤Ê¤é¤Ê¤¤¤«¤®¤ê¡¢ºÇ½é¤Î¿ôʸ»ú(\fIdigitalSignature\fR¤Î¾ì¹ç¤Ï\fIdig\fR)¤Þ¤¿¤Ï¥­¥ã¥á¥ë¥±¡¼¥¹¡¦¥¹¥¿¥¤¥ë(\fIdigitalSignature\fR¤Î¾ì¹ç¤Ï\fIdS\fR¡¢\fIcRLSign\fR¤Î¾ì¹ç¤Ï\fIcRLS\fR)¤Ç¾Êάɽµ­¤Ç¤­¤Þ¤¹¡£\fIusage\fRÃͤϡ¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ ++\fBusage\fR(\fBusage\fR)*¡¢\fIusage\fR¤Ë¤Ï\fBdigitalSignature\fR¡¢\fBnonRepudiation\fR ++(contentCommitment)¡¢\fBkeyEncipherment\fR¡¢\fBdataEncipherment\fR¡¢\fBkeyAgreement\fR¡¢\fBkeyCertSign\fR¡¢\fBcRLSign\fR¡¢\fBencipherOnly\fR¡¢\fBdecipherOnly\fR¤Î¤¤¤º¤ì¤«¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIusage\fR°ú¿ô¤Ï¡¢ÉÔÌÀ³Î¤Ë¤Ê¤é¤Ê¤¤¤«¤®¤ê¡¢ºÇ½é¤Î¿ôʸ»ú(\fBdigitalSignature\fR¤Î¾ì¹ç¤Ï\fBdig\fR)¤Þ¤¿¤Ï¥­¥ã¥á¥ë¥±¡¼¥¹¡¦¥¹¥¿¥¤¥ë(\fBdigitalSignature\fR¤Î¾ì¹ç¤Ï\fBdS\fR¡¢\fBcRLSign\fR¤Î¾ì¹ç¤Ï\fBcRLS\fR)¤Ç¾Êάɽµ­¤Ç¤­¤Þ¤¹¡£\fBusage\fRÃͤϡ¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ + .RE + .PP + EKU¤Þ¤¿¤ÏExtendedKeyUsage + .RS 4 + \fBÃÍ\fR: +-\fIusage\fR(\fIusage\fR)*¡¢\fIusage\fR¤Ë¤Ï\fIanyExtendedKeyUsage\fR¡¢\fIserverAuth\fR¡¢\fIclientAuth\fR¡¢\fIcodeSigning\fR¡¢\fIemailProtection\fR¡¢\fItimeStamping\fR¡¢\fIOCSPSigning\fR¤Þ¤¿¤ÏǤ°Õ¤Î\fIOIDʸ»úÎó\fR¤Î¤¤¤º¤ì¤«¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIusage\fR°ú¿ô¤Ï¡¢ÉÔÌÀ³Î¤Ë¤Ê¤é¤Ê¤¤¤«¤®¤ê¡¢ºÇ½é¤Î¿ôʸ»ú¤Þ¤¿¤Ï¥­¥ã¥á¥ë¥±¡¼¥¹¡¦¥¹¥¿¥¤¥ë¤Ç¾Êάɽµ­¤Ç¤­¤Þ¤¹¡£\fIusage\fRÃͤϡ¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ ++\fBusage\fR(\fBusage\fR)*¡¢\fIusage\fR¤Ë¤Ï\fBanyExtendedKeyUsage\fR¡¢\fBserverAuth\fR¡¢\fBclientAuth\fR¡¢\fBcodeSigning\fR¡¢\fBemailProtection\fR¡¢\fBtimeStamping\fR¡¢\fBOCSPSigning\fR¤Þ¤¿¤ÏǤ°Õ¤Î\fIOIDʸ»úÎó\fR¤Î¤¤¤º¤ì¤«¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIusage\fR°ú¿ô¤Ï¡¢ÉÔÌÀ³Î¤Ë¤Ê¤é¤Ê¤¤¤«¤®¤ê¡¢ºÇ½é¤Î¿ôʸ»ú¤Þ¤¿¤Ï¥­¥ã¥á¥ë¥±¡¼¥¹¡¦¥¹¥¿¥¤¥ë¤Ç¾Êάɽµ­¤Ç¤­¤Þ¤¹¡£\fBusage\fRÃͤϡ¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ + .RE + .PP + SAN¤Þ¤¿¤ÏSubjectAlternativeName + .RS 4 + \fBÃÍ\fR: +-\fItype\fR:\fIvalue\fR +-(t\fIype:value\fR)*¡¢\fItype\fR¤Ë¤Ï\fIEMAIL\fR¡¢\fIURI\fR¡¢\fIDNS\fR¡¢\fIIP\fR¤Þ¤¿¤Ï\fIOID\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIvalue\fR°ú¿ô¤Ï¡¢\fItype\fR¤Îʸ»úÎó·Á¼°¤ÎÃͤǤ¹¡£ ++\fBtype\fR:\fBvalue\fR ++(t\fBype:value\fR)*¡¢\fBtype\fR¤Ë¤Ï\fBEMAIL\fR¡¢\fBURI\fR¡¢\fBDNS\fR¡¢\fBIP\fR¤Þ¤¿¤Ï\fBOID\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBvalue\fR°ú¿ô¤Ï¡¢\fBtype\fR¤Îʸ»úÎó·Á¼°¤ÎÃͤǤ¹¡£ + .RE + .PP + IAN¤Þ¤¿¤ÏIssuerAlternativeName + .RS 4 + \fBÃÍ\fR: +-\fISubjectAlternativeName\fR¤ÈƱ¤¸¤Ç¤¹¡£ ++\fBSubjectAlternativeName\fR¤ÈƱ¤¸¤Ç¤¹¡£ + .RE + .PP + SIA¤Þ¤¿¤ÏSubjectInfoAccess + .RS 4 + \fBÃÍ\fR: +-\fImethod\fR:\fIlocation\-type\fR:\fIlocation\-value\fR +-(\fImethod:location\-type\fR:\fIlocation\-value\fR)*¡¢\fImethod\fR¤Ë¤Ï\fItimeStamping\fR¡¢\fIcaRepository\fR¤Þ¤¿¤ÏǤ°Õ¤ÎOID¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIlocation\-type\fR¤ª¤è¤Ó\fIlocation\-value\fR°ú¿ô¤Ë¤Ï¡¢\fISubjectAlternativeName\fR¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëǤ°Õ¤Î\fItype\fR:\fIvalue\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBmethod\fR:\fBlocation\-type\fR:\fBlocation\-value\fR ++(\fBmethod:location\-type\fR:\fBlocation\-value\fR)*¡¢\fBmethod\fR¤Ë¤Ï\fBtimeStamping\fR¡¢\fBcaRepository\fR¤Þ¤¿¤ÏǤ°Õ¤ÎOID¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBlocation\-type\fR¤ª¤è¤Ó\fBlocation\-value\fR°ú¿ô¤Ë¤Ï¡¢\fBSubjectAlternativeName\fR¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëǤ°Õ¤Î\fBtype\fR:\fBvalue\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + AIA¤Þ¤¿¤ÏAuthorityInfoAccess + .RS 4 + \fBÃÍ\fR: +-\fISubjectInfoAccess\fR¤ÈƱ¤¸¤Ç¤¹¡£\fImethod\fR°ú¿ô¤Ë¤Ï¡¢\fIocsp\fR¡¢\fIcaIssuers\fR¤Þ¤¿¤ÏǤ°Õ¤ÎOID¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBSubjectInfoAccess\fR¤ÈƱ¤¸¤Ç¤¹¡£\fBmethod\fR°ú¿ô¤Ë¤Ï¡¢\fBocsp\fR¡¢\fBcaIssuers\fR¤Þ¤¿¤ÏǤ°Õ¤ÎOID¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP +-\fIname\fR¤¬OID¤Î¾ì¹ç¡¢OCTET STRING¥¿¥¤¥×¤ÈŤµ¤Î¥Ð¥¤¥È¤ò½ü³°¤·¤¿¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢ÃͤÏ\fIextnValue\fR¤Î16¿Ê¥À¥ó¥×¤ÎDER¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç¤¹¡£HEXʸ»úÎó¤Ç¤Ï¡¢É¸½à¤Î16¿Ê¿ô(0\-9¡¢a\-f¡¢A\-F)°Ê³°¤Îʸ»ú¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢01:02:03:04¤È01020304¤ÎξÊý¤È¤âƱ°ì¤ÎÃͤȤ·¤Æ¼õ¤±ÉÕ¤±¤é¤ì¤Þ¤¹¡£Ãͤ¬¤Ê¤¤¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ÎÃÍ¥Õ¥£¡¼¥ë¥É¤Ï¶õ¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBname\fR¤¬OID¤Î¾ì¹ç¡¢OCTET STRING¥¿¥¤¥×¤ÈŤµ¤Î¥Ð¥¤¥È¤ò½ü³°¤·¤¿¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢ÃͤÏ\fBextnValue\fR¤Î16¿Ê¥À¥ó¥×¤ÎDER¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç¤¹¡£HEXʸ»úÎó¤Ç¤Ï¡¢É¸½à¤Î16¿Ê¿ô(0\-9¡¢a\-f¡¢A\-F)°Ê³°¤Îʸ»ú¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢01:02:03:04¤È01020304¤ÎξÊý¤È¤âƱ°ì¤ÎÃͤȤ·¤Æ¼õ¤±ÉÕ¤±¤é¤ì¤Þ¤¹¡£Ãͤ¬¤Ê¤¤¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ÎÃÍ¥Õ¥£¡¼¥ë¥É¤Ï¶õ¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-\fI\-gencert\fR¤Ç¤Î¤ß»ÈÍѤ¹¤ë\fIhonored\fR¤È¤¤¤¦ÆÃÊ̤Ê̾Á°¤Ï¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤Ë´Þ¤Þ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤òÍ¥À褹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î̾Á°¤ÎÃͤϡ¢\fIall\fR(¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬Í¥À褵¤ì¤ë)¡¢\fIname{:[critical|non\-critical]}\fR(̾Á°ÉÕ¤­¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬Í¥À褵¤ì¤ë¤¬¡¢Ê̤Î\fIisCritical\fR°À­¤ò»ÈÍѤ¹¤ë)¡¢¤ª¤è¤Ó\fI\-name\fR(\fIall\fR¤È¤È¤â¤Ë»ÈÍѤ·¡¢Îã³°¤ò¼¨¤¹)¤Î¥«¥ó¥Þ¶èÀÚ¤ê¥ê¥¹¥È¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ÏÍ¥À褵¤ì¤Þ¤»¤ó¡£ ++\fB\-gencert\fR¤Ç¤Î¤ß»ÈÍѤ¹¤ë\fBhonored\fR¤È¤¤¤¦ÆÃÊ̤Ê̾Á°¤Ï¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤Ë´Þ¤Þ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤òÍ¥À褹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î̾Á°¤ÎÃͤϡ¢\fBall\fR(¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬Í¥À褵¤ì¤ë)¡¢\fBname{:[critical|non\-critical]}\fR(̾Á°ÉÕ¤­¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬Í¥À褵¤ì¤ë¤¬¡¢Ê̤Î\fBisCritical\fR°À­¤ò»ÈÍѤ¹¤ë)¡¢¤ª¤è¤Ó\fB\-name\fR(\fBall\fR¤È¤È¤â¤Ë»ÈÍѤ·¡¢Îã³°¤ò¼¨¤¹)¤Î¥«¥ó¥Þ¶èÀÚ¤ê¥ê¥¹¥È¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ÏÍ¥À褵¤ì¤Þ¤»¤ó¡£ + .PP +-\fI\-ext honored\fR¥ª¥×¥·¥ç¥ó¤Ë²Ã¤¨¡¢Ê̤Î̾Á°¤Î¡¢¤Þ¤¿¤ÏOID +-\fI\-ext\fR¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢¤³¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬¡¢¤¹¤Ç¤ËÍ¥À褵¤ì¤Æ¤¤¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ËÄɲ䵤ì¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î̾Á°(¤Þ¤¿¤ÏOID)¤òÍ¥À褵¤ì¤ëÃͤǤâ»ÈÍѤ·¤¿¾ì¹ç¤Ï¡¢¤½¤ÎÃͤȽÅÍ×À­¤¬¥ê¥¯¥¨¥¹¥È¤Ë´Þ¤Þ¤ì¤ë¤â¤Î¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ ++\fB\-ext honored\fR¥ª¥×¥·¥ç¥ó¤Ë²Ã¤¨¡¢Ê̤Î̾Á°¤Î¡¢¤Þ¤¿¤ÏOID ++\fB\-ext\fR¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢¤³¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬¡¢¤¹¤Ç¤ËÍ¥À褵¤ì¤Æ¤¤¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ËÄɲ䵤ì¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î̾Á°(¤Þ¤¿¤ÏOID)¤òÍ¥À褵¤ì¤ëÃͤǤâ»ÈÍѤ·¤¿¾ì¹ç¤Ï¡¢¤½¤ÎÃͤȽÅÍ×À­¤¬¥ê¥¯¥¨¥¹¥È¤Ë´Þ¤Þ¤ì¤ë¤â¤Î¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ + .PP +-\fIsubjectKeyIdentifier\fR¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ï¾ï¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¼«¸Ê½ð̾¤Ç¤Ê¤¤¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢\fIauthorityKeyIdentifier\fR¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBsubjectKeyIdentifier\fR¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ï¾ï¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¼«¸Ê½ð̾¤Ç¤Ê¤¤¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢\fBauthorityKeyIdentifier\fR¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR + ¥æ¡¼¥¶¡¼¤Ï¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó(¤ª¤è¤Ó¾ÚÌÀ½ñ¤Î¾¤Î¥Õ¥£¡¼¥ë¥É)¤ÎÁȹ礻¤Ë¤è¤Ã¤Æ¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥È¤Îɸ½à¤Ë½àµò¤·¤Ê¤¤¾ì¹ç¤¬¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¾ÚÌÀ½ñ¤Î½àµò¤Ë´Ø¤¹¤ë·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +@@ -660,57 +662,60 @@ + .PP + \-gencert + .RS 4 +-\fI{\-rfc} {\-infile infile} {\-outfile outfile} {\-alias alias} {\-sigalg sigalg} {\-dname dname} {\-startdate startdate {\-ext ext}* {\-validity valDays} [\-keypass keypass] {\-keystore keystore} [\-storepass storepass] {\-storetype storetype} {\-providername provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-rfc} {\-infile infile} {\-outfile outfile} {\-alias alias} {\-sigalg sigalg} {\-dname dname} {\-startdate startdate {\-ext ext}* {\-validity valDays} [\-keypass keypass] {\-keystore keystore} [\-storepass storepass] {\-storetype storetype} {\-providername provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¡¦¥Õ¥¡¥¤¥ë(\fIkeytool\fR +-\fI\-certreq\fR¥³¥Þ¥ó¥É¤ÇºîÀ®²Äǽ)¤ËÂФ¹¤ë¥ì¥¹¥Ý¥ó¥¹¤È¤·¤Æ¾ÚÌÀ½ñ¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fIinfile\fR¤«¤é(¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É¸½àÆþÎϤ«¤é)¥ê¥¯¥¨¥¹¥È¤òÆɤ߹þ¤ß¡¢ÊÌ̾¤ÎÈëÌ©¸°¤ò»ÈÍѤ·¤Æ¤½¤Î¥ê¥¯¥¨¥¹¥È¤Ë½ð̾¤·¤Æ¡¢X\&.509¾ÚÌÀ½ñ¤ò\fIoutfile\fR¤Ë(¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É¸½à½ÐÎϤË)½ÐÎϤ·¤Þ¤¹¡£\fI\-rfc\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢½ÐÎÏ·Á¼°¤ÏBASE64Éä¹æ²½¤ÎPEM¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¥Ð¥¤¥Ê¥êDER¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ ++¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¡¦¥Õ¥¡¥¤¥ë(\fBkeytool\fR ++\fB\-certreq\fR¥³¥Þ¥ó¥É¤ÇºîÀ®²Äǽ)¤ËÂФ¹¤ë¥ì¥¹¥Ý¥ó¥¹¤È¤·¤Æ¾ÚÌÀ½ñ¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fIinfile\fR¤«¤é(¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É¸½àÆþÎϤ«¤é)¥ê¥¯¥¨¥¹¥È¤òÆɤ߹þ¤ß¡¢ÊÌ̾¤ÎÈëÌ©¸°¤ò»ÈÍѤ·¤Æ¤½¤Î¥ê¥¯¥¨¥¹¥È¤Ë½ð̾¤·¤Æ¡¢X\&.509¾ÚÌÀ½ñ¤ò\fIoutfile\fR¤Ë(¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É¸½à½ÐÎϤË)½ÐÎϤ·¤Þ¤¹¡£\fB\-rfc\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢½ÐÎÏ·Á¼°¤ÏBASE64Éä¹æ²½¤ÎPEM¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¥Ð¥¤¥Ê¥êDER¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp +-\fIsigalg\fRÃͤˤϡ¢¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£\fIstartdate\fR°ú¿ô¤Ï¡¢¾ÚÌÀ½ñ¤ÎÍ­¸ú³«»ÏÆü»þ¤Ç¤¹¡£\fIvalDays\fR°ú¿ô¤Ï¡¢¾ÚÌÀ½ñ¤ÎÍ­¸úÆü¿ô¤ò¼¨¤·¤Þ¤¹¡£ ++\fBsigalg\fRÃͤˤϡ¢¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£\fBstartdate\fR°ú¿ô¤Ï¡¢¾ÚÌÀ½ñ¤ÎÍ­¸ú³«»ÏÆü»þ¤Ç¤¹¡£\fBvalDays\fR°ú¿ô¤Ï¡¢¾ÚÌÀ½ñ¤ÎÍ­¸úÆü¿ô¤ò¼¨¤·¤Þ¤¹¡£ + .sp +-\fIdname\fR¤ò»ØÄꤹ¤ë¤È¡¢À¸À®¤µ¤ì¤ë¾ÚÌÀ½ñ¤Î¼çÂΤȤ·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤«¤é¤Î̾Á°¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++\fBdname\fR¤ò»ØÄꤹ¤ë¤È¡¢À¸À®¤µ¤ì¤ë¾ÚÌÀ½ñ¤Î¼çÂΤȤ·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤«¤é¤Î̾Á°¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp +-\fIext\fRÃͤϡ¢¾ÚÌÀ½ñ¤ËËä¤á¹þ¤Þ¤ì¤ëX\&.509¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£\fI\-ext\fR¤Î¹½Ê¸¤Ë¤Ä¤¤¤Æ¤Ï¡¢°ìÈÌ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBext\fRÃͤϡ¢¾ÚÌÀ½ñ¤ËËä¤á¹þ¤Þ¤ì¤ëX\&.509¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£\fB\-ext\fR¤Î¹½Ê¸¤Ë¤Ä¤¤¤Æ¤Ï¡¢°ìÈÌ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-gencert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢\fIe1\fR¤È¤¤¤¦¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤Ï¡¢3¤Ä¤Î¾ÚÌÀ½ñ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fB\-gencert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢\fBe1\fR¤È¤¤¤¦¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤Ï¡¢3¤Ä¤Î¾ÚÌÀ½ñ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fIca\fR¡¢\fIca1\fR¡¢\fIca2\fR¤ª¤è¤Ó\fIe1\fR¤Î4¤Ä¤Î¸°¥Ú¥¢¤òºîÀ®¤·¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fBca\fR¡¢\fBca1\fR¡¢\fBca2\fR¤ª¤è¤Ó\fBe1\fR¤Î4¤Ä¤Î¸°¥Ú¥¢¤òºîÀ®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-alias ca \-dname CN=CA \-genkeypair +-keytool \-alias ca1 \-dname CN=CA \-genkeypair +-keytool \-alias ca2 \-dname CN=CA \-genkeypair +-keytool \-alias e1 \-dname CN=E1 \-genkeypair ++\fBkeytool \-alias ca \-dname CN=CA \-genkeypair\fR ++\fBkeytool \-alias ca1 \-dname CN=CA \-genkeypair\fR ++\fBkeytool \-alias ca2 \-dname CN=CA \-genkeypair\fR ++\fBkeytool \-alias e1 \-dname CN=E1 \-genkeypair\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î2¤Ä¤Î¥³¥Þ¥ó¥É¤Ï¡¢½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òºîÀ®¤·¤Þ¤¹¡£\fIca\fR¤Ï\fIca1\fR¤Ë½ð̾¤·¡¢\fIca1\fR¤Ï\fIca2\fR¤Ë½ð̾¤·¤Þ¤¹¡£¤¹¤Ù¤Æ¼«¸Êȯ¹Ô¤Ç¤¹¡£ ++¼¡¤Î2¤Ä¤Î¥³¥Þ¥ó¥É¤Ï¡¢½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òºîÀ®¤·¤Þ¤¹¡£\fBca\fR¤Ï\fBca1\fR¤Ë½ð̾¤·¡¢\fBca1\fR¤Ï\fBca2\fR¤Ë½ð̾¤·¤Þ¤¹¡£¤¹¤Ù¤Æ¼«¸Êȯ¹Ô¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-alias ca1 \-certreq | +- keytool \-alias ca \-gencert \-ext san=dns:ca1 | +- keytool \-alias ca1 \-importcert +- +-keytool \-alias ca2 \-certreq | +- $KT \-alias ca1 \-gencert \-ext san=dns:ca2 | +- $KT \-alias ca2 \-importcert ++\fBkeytool \-alias ca1 \-certreq |\fR ++\fB keytool \-alias ca \-gencert \-ext san=dns:ca1 |\fR ++\fB keytool \-alias ca1 \-importcert\fR ++ ++\fBkeytool \-alias ca2 \-certreq |\fR ++\fB $KT \-alias ca1 \-gencert \-ext san=dns:ca2 |\fR ++\fB $KT \-alias ca2 \-importcert\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢¾ÚÌÀ½ñ\fIe1\fR¤òºîÀ®¤·¤Æ¥Õ¥¡¥¤¥ë\fIe1\&.cert\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Ï\fIca2\fR¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢\fIe1\fR¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤Ï\fIca\fR¡¢\fIca1\fR¤ª¤è¤Ó\fIca2\fR¤¬´Þ¤Þ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢¾ÚÌÀ½ñ\fBe1\fR¤òºîÀ®¤·¤Æ¥Õ¥¡¥¤¥ë\fBe1\&.cert\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Ï\fBca2\fR¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢\fBe1\fR¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤Ï\fBca\fR¡¢\fBca1\fR¤ª¤è¤Ó\fBca2\fR¤¬´Þ¤Þ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-alias e1 \-certreq | keytool \-alias ca2 \-gencert > e1\&.cert ++\fBkeytool \-alias e1 \-certreq | keytool \-alias ca2 \-gencert > e1\&.cert\fR ++ + .fi + .if n \{\ + .RE +@@ -719,154 +724,155 @@ + .PP + \-genkeypair + .RS 4 +-\fI{\-alias alias} {\-keyalg keyalg} {\-keysize keysize} {\-sigalg sigalg} [\-dname dname] [\-keypass keypass] {\-startdate value} {\-ext ext}* {\-validity valDays} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} {\-keyalg keyalg} {\-keysize keysize} {\-sigalg sigalg} [\-dname dname] [\-keypass keypass] {\-startdate value} {\-ext ext}* {\-validity valDays} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp + ¸°¤Î¥Ú¥¢(¸ø³«¸°¤ª¤è¤Ó´ØÏ¢¤¹¤ëÈëÌ©¸°)¤òÀ¸À®¤·¤Þ¤¹¡£¸ø³«¸°¤ÏX\&.509 v3¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤µ¤ì¤Þ¤¹¡£¾ÚÌÀ½ñ¤Ï¡¢Ã±°ì¤ÎÍ×ÁǤò»ý¤Ä¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤È¤·¤Æ³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÈÈëÌ©¸°¤Ï¡¢alias¤ÇÆÃÄꤵ¤ì¤ë¿·¤·¤¤¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fIkeyalg\fRÃͤϸ°¥Ú¥¢¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò¡¢\fIkeysize\fRÃͤÏÀ¸À®¤¹¤ë³Æ¸°¤Î¥µ¥¤¥º¤ò¡¢¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£\fIsigalg\fRÃͤϡ¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ï\fIkeyalg\fRÃͤȸߴ¹À­¤¬¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBkeyalg\fRÃͤϸ°¥Ú¥¢¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò¡¢\fBkeysize\fRÃͤÏÀ¸À®¤¹¤ë³Æ¸°¤Î¥µ¥¤¥º¤ò¡¢¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£\fBsigalg\fRÃͤϡ¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ï\fBkeyalg\fRÃͤȸߴ¹À­¤¬¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fIdname\fRÃͤˤϡ¢\fIalias\fRÃͤ˴ØÏ¢ÉÕ¤±¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Îissuer¥Õ¥£¡¼¥ë¥É¤Èsubject¥Õ¥£¡¼¥ë¥É¤È¤·¤Æ»ÈÍѤ¹¤ëX\&.500¼±ÊÌ̾¤ò»ØÄꤷ¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¼±ÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¼±ÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++\fBdname\fRÃͤˤϡ¢\fBalias\fRÃͤ˴ØÏ¢ÉÕ¤±¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Îissuer¥Õ¥£¡¼¥ë¥É¤Èsubject¥Õ¥£¡¼¥ë¥É¤È¤·¤Æ»ÈÍѤ¹¤ëX\&.500¼±ÊÌ̾¤ò»ØÄꤷ¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¼±ÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¼±ÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp +-\fIkeypass\fRÃͤˤϡ¢À¸À®¤µ¤ì¤ë¸°¤Î¥Ú¥¢¤Î¤¦¤Á¡¢ÈëÌ©¸°¤òÊݸ¤ë¤Î¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢\fI[Return]¥­¡¼\fR¤ò²¡¤¹¤È¡¢¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fIkeypass\fRÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBkeypass\fRÃͤˤϡ¢À¸À®¤µ¤ì¤ë¸°¤Î¥Ú¥¢¤Î¤¦¤Á¡¢ÈëÌ©¸°¤òÊݸ¤ë¤Î¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fBkeypass\fRÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fIstartdate\fRÃͤˤϡ¢¾ÚÌÀ½ñ¤Îȯ¹Ô»þ¹ï¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢X\&.509¾ÚÌÀ½ñ¤Î¡ÖValidity¡×¥Õ¥£¡¼¥ë¥É¤Î¡ÖNot Before¡×ÃͤȤâ¸Æ¤Ð¤ì¤Þ¤¹¡£ ++\fBstartdate\fRÃͤˤϡ¢¾ÚÌÀ½ñ¤Îȯ¹Ô»þ¹ï¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢X\&.509¾ÚÌÀ½ñ¤Î¡ÖValidity¡×¥Õ¥£¡¼¥ë¥É¤Î¡ÖNot Before¡×ÃͤȤâ¸Æ¤Ð¤ì¤Þ¤¹¡£ + .sp + ¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢¼¡¤Î2¤Ä¤Î·Á¼°¤Î¤¤¤º¤ì¤«¤ÇÀßÄê¤Ç¤­¤Þ¤¹¡£ + .sp +-\fI([+\-]nnn[ymdHMS])+\fR ++\fB([+\-]nnn[ymdHMS])+\fR + .sp +-\fI[yyyy/mm/dd] [HH:MM:SS]\fR ++\fB[yyyy/mm/dd] [HH:MM:SS]\fR + .sp +-ºÇ½é¤Î·Á¼°¤Ç¤Ï¡¢È¯¹Ô»þ¹ï¤Ï¡¢»ØÄꤵ¤ì¤ëÃͤÎʬ¡¢¸½ºß¤Î»þ¹ï¤«¤é°Ü¤ê¤Þ¤¹¡£»ØÄꤵ¤ì¤ëÃͤϡ¢°ìÏ¢¤Î²¼°Ì¤ÎÃͤòÏ¢·ë¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£²¼°Ì¤Î³ÆÃͤǡ¢¥×¥é¥¹µ­¹æ(¡Ö+¡×)¤Ï»þ´Ö¤¬¿Ê¤à¤³¤È¤ò¡¢¥Þ¥¤¥Ê¥¹µ­¹æ(¡Ö\-¡×)¤Ï»þ´Ö¤¬Ìá¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£°Ü¤ë»þ´Ö¤Ï\fInnn\fR¤Ç¡¢Ã±°Ì¤Ïǯ¡¢·î¡¢Æü¡¢»þ´Ö¡¢Ê¬¤Þ¤¿¤ÏÉäǤ¹(¤½¤ì¤¾¤ì¡¢1ʸ»ú¤Î\fIy\fR¡¢\fIm\fR¡¢\fId\fR¡¢\fIH\fR¡¢\fIM\fR¤Þ¤¿¤Ï\fIS\fR¡×¤Ç¼¨¤µ¤ì¤Æ¤¤¤Þ¤¹)¡£²¼°Ì¤Î³ÆÃͤÇ\fIjava\&.util\&.GregorianCalendar\&.add(int field, int amount)\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢È¯¹Ô»þ¹ï¤ÎÄɲäÎÃͤ¬º¸¤«¤é±¦¤Ø·×»»¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢»ØÄꤹ¤ë¤È¡¢È¯¹Ô»þ¹ï¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ºÇ½é¤Î·Á¼°¤Ç¤Ï¡¢È¯¹Ô»þ¹ï¤Ï¡¢»ØÄꤵ¤ì¤ëÃͤÎʬ¡¢¸½ºß¤Î»þ¹ï¤«¤é°Ü¤ê¤Þ¤¹¡£»ØÄꤵ¤ì¤ëÃͤϡ¢°ìÏ¢¤Î²¼°Ì¤ÎÃͤòÏ¢·ë¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£²¼°Ì¤Î³ÆÃͤǡ¢¥×¥é¥¹µ­¹æ(¡Ö+¡×)¤Ï»þ´Ö¤¬¿Ê¤à¤³¤È¤ò¡¢¥Þ¥¤¥Ê¥¹µ­¹æ(¡Ö\-¡×)¤Ï»þ´Ö¤¬Ìá¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£°Ü¤ë»þ´Ö¤Ï\fBnnn\fR¤Ç¡¢Ã±°Ì¤Ïǯ¡¢·î¡¢Æü¡¢»þ´Ö¡¢Ê¬¤Þ¤¿¤ÏÉäǤ¹(¤½¤ì¤¾¤ì¡¢1ʸ»ú¤Î\fBy\fR¡¢\fBm\fR¡¢\fBd\fR¡¢\fBH\fR¡¢\fBM\fR¤Þ¤¿¤Ï\fBS\fR¡×¤Ç¼¨¤µ¤ì¤Æ¤¤¤Þ¤¹)¡£²¼°Ì¤Î³ÆÃͤÇ\fBjava\&.util\&.GregorianCalendar\&.add(int field, int amount)\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢È¯¹Ô»þ¹ï¤ÎÄɲäÎÃͤ¬º¸¤«¤é±¦¤Ø·×»»¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢»ØÄꤹ¤ë¤È¡¢È¯¹Ô»þ¹ï¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Calendar c = new GregorianCalendar(); +-c\&.add(Calendar\&.YEAR, \-1); +-c\&.add(Calendar\&.MONTH, 1); +-c\&.add(Calendar\&.DATE, \-1); +-return c\&.getTime() ++\fBCalendar c = new GregorianCalendar();\fR ++\fBc\&.add(Calendar\&.YEAR, \-1);\fR ++\fBc\&.add(Calendar\&.MONTH, 1);\fR ++\fBc\&.add(Calendar\&.DATE, \-1);\fR ++\fBreturn c\&.getTime()\fR ++ + .fi + .if n \{\ + .RE + .\} +-2ÈÖÌܤηÁ¼°¤Ç¤Ï¡¢¥æ¡¼¥¶¡¼¤Ï¡¢Ç¯/·î/Æü¤È»þ´Ö:ʬ:ÉäÎ2¤Ä¤ÎÉôʬ¤Ç¸·Ì©¤Ê³«»Ï»þ¹ï¤òÀßÄꤷ¤Þ¤¹(Ãϸµ¤Î»þ´ÖÂÓ¤ò»ÈÍÑ)¡£¥æ¡¼¥¶¡¼¤Ï¡¢1¤Ä¤ÎÉôʬ¤Î¤ß¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤â¤¦1¤Ä¤ÎÉôʬ¤Ï¸½ºß¤ÎÆüÉÕ(¤Þ¤¿¤Ï»þ¹ï)¤ÈƱ¤¸¤Ë¤Ê¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢·Á¼°¤ÎÄêµÁ¤Ë¼¨¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢·å¿ô¤ò¸·Ì©¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(û¤¤¾ì¹ç¤Ï0¤ÇËä¤á¤Þ¤¹)¡£ÆüÉդȻþ¹ï¤ÎξÊý¤¬»ØÄꤵ¤ì¤¿¾õÂ֤ǡ¢2¤Ä¤ÎÉôʬ¤Î´Ö¤Ë¶õÇòʸ»ú¤¬1¤Ä(1¤Ä¤Î¤ß)¤¢¤ê¤Þ¤¹¡£»þ´Ö¤Ï¾ï¤Ë24»þ´Ö·Á¼°¤Ç»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£ ++2ÈÖÌܤηÁ¼°¤Ç¤Ï¡¢¥æ¡¼¥¶¡¼¤Ï¡¢Ç¯/·î/Æü¤È»þ´Ö:ʬ:ÉäÎ2¤Ä¤ÎÉôʬ¤«¤é¤Ê¤ëÀµ³Î¤Êȯ¹Ô»þ¹ï¤òÀßÄꤷ¤Þ¤¹(¥í¡¼¥«¥ë¤Î¥¿¥¤¥à¡¦¥¾¡¼¥ó¤ò»ÈÍÑ)¡£¥æ¡¼¥¶¡¼¤Ï¡¢1¤Ä¤ÎÉôʬ¤Î¤ß¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤â¤¦1¤Ä¤ÎÉôʬ¤Ï¸½ºß¤ÎÆüÉÕ(¤Þ¤¿¤Ï»þ¹ï)¤ÈƱ¤¸¤Ë¤Ê¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢·Á¼°¤ÎÄêµÁ¤Ë¼¨¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢·å¿ô¤ò¸·Ì©¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(û¤¤¾ì¹ç¤Ï0¤ÇËä¤á¤Þ¤¹)¡£ÆüÉդȻþ¹ï¤ÎξÊý¤¬»ØÄꤵ¤ì¤¿¾õÂ֤ǡ¢2¤Ä¤ÎÉôʬ¤Î´Ö¤Ë¶õÇòʸ»ú¤¬1¤Ä(1¤Ä¤Î¤ß)¤¢¤ê¤Þ¤¹¡£»þ´Ö¤Ï¾ï¤Ë24»þ´Ö·Á¼°¤Ç»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢³«»ÏÆüÉդϸ½ºß¤Î»þ¹ï¤Ë¤Ê¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Ï¡¢ºÇÂç¤Ç1²ó»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp +-\fIvalDays\fR¤ÎÃͤˤϡ¢¾ÚÌÀ½ñ¤ÎÍ­¸úÆü¿ô¤ò»ØÄꤷ¤Þ¤¹(\fI\-startdate\fR¤Ç»ØÄꤵ¤ì¤¿ÆüÉÕ¡¢¤Þ¤¿¤Ï\fI\-startdate\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¸½ºß¤ÎÆüÉÕ¤«¤é»Ï¤Þ¤ê¤Þ¤¹)¡£ ++\fBvalDays\fR¤ÎÃͤˤϡ¢¾ÚÌÀ½ñ¤ÎÍ­¸úÆü¿ô¤ò»ØÄꤷ¤Þ¤¹(\fB\-startdate\fR¤Ç»ØÄꤵ¤ì¤¿ÆüÉÕ¡¢¤Þ¤¿¤Ï\fB\-startdate\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¸½ºß¤ÎÆüÉÕ¤«¤é»Ï¤Þ¤ê¤Þ¤¹)¡£ + .sp +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fI\-genkey\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fI\-genkeypair\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fB\-genkey\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fB\-genkeypair\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ + .RE + .PP + \-genseckey + .RS 4 +-\fI\-genseckey {\-alias alias} {\-keyalg keyalg} {\-keysize keysize} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB\-genseckey {\-alias alias} {\-keyalg keyalg} {\-keysize keysize} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-ÈëÌ©¸°¤òÀ¸À®¤·¡¢¤½¤ì¤ò¿·¤·¤¤\fIKeyStore\&.SecretKeyEntry\fR(\fIalias\fR¤ÇÆÃÄꤵ¤ì¤ë)Æâ¤Ë³ÊǼ¤·¤Þ¤¹¡£ ++ÈëÌ©¸°¤òÀ¸À®¤·¡¢¤½¤ì¤ò¿·¤·¤¤\fBKeyStore\&.SecretKeyEntry\fR(\fBalias\fR¤ÇÆÃÄꤵ¤ì¤ë)Æâ¤Ë³ÊǼ¤·¤Þ¤¹¡£ + .sp +-\fIkeyalg\fRÃͤϸ°¥Ú¥¢¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò¡¢\fIkeysize\fRÃͤÏÀ¸À®¤¹¤ë³Æ¸°¤Î¥µ¥¤¥º¤ò¡¢¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£\fIkeypass\fRÃͤϡ¢ÈëÌ©¸°¤òÊݸ¤ë¥Ñ¥¹¥ï¡¼¥É¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢\fIkeystore\fR¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fIkeypass\fRÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBkeyalg\fRÃͤϸ°¥Ú¥¢¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò¡¢\fBkeysize\fRÃͤÏÀ¸À®¤¹¤ë³Æ¸°¤Î¥µ¥¤¥º¤ò¡¢¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£\fBkeypass\fRÃͤϡ¢ÈëÌ©¸°¤òÊݸ¤ë¥Ñ¥¹¥ï¡¼¥É¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢\fBkeystore\fR¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fBkeypass\fRÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-importcert + .RS 4 +-\fI\-importcert {\-alias alias} {\-file cert_file} [\-keypass keypass] {\-noprompt} {\-trustcacerts} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB\-importcert {\-alias alias} {\-file cert_file} [\-keypass keypass] {\-noprompt} {\-trustcacerts} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-¥Õ¥¡¥¤¥ë\fIcert_file\fR¤«¤é¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó(¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¾ì¹ç¤Ï¡¢PKCS#7·Á¼°¤Î±þÅú¤Þ¤¿¤Ï°ìÏ¢¤ÎX\&.509¾ÚÌÀ½ñ¤ÇÄ󶡤µ¤ì¤ë¤â¤Î)¤òÆɤ߹þ¤ß¡¢\fIalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë\fIkeystore\fR¥¨¥ó¥È¥ê¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIstdin\fR¤«¤é¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÆɤ߹þ¤ß¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ë\fBcert_file\fR¤«¤é¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó(¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¾ì¹ç¤Ï¡¢PKCS#7·Á¼°¤Î±þÅú¤Þ¤¿¤Ï°ìÏ¢¤ÎX\&.509¾ÚÌÀ½ñ¤ÇÄ󶡤µ¤ì¤ë¤â¤Î)¤òÆɤ߹þ¤ß¡¢\fBalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë\fBkeystore\fR¥¨¥ó¥È¥ê¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBstdin\fR¤«¤é¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÆɤ߹þ¤ß¤Þ¤¹¡£ + .sp +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢X\&.509 v1¡¢v2¡¢v3¤Î¾ÚÌÀ½ñ¡¢¤ª¤è¤ÓPKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¤«¤é¹½À®¤µ¤ì¤Æ¤¤¤ëPKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Ï¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½Êý¼°¡¢¤Þ¤¿¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°(Base64Éä¹æ²½¤È¤â¸Æ¤Ð¤ì¤ë)¤Î¤É¤Á¤é¤«¤ÇÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÉä¹æ²½Êý¼°¤Î¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï\fI\-\fR\fI\-\-\-\-BEGIN\fR¤Ç»Ï¤Þ¤ëʸ»úÎó¤Ç³«»Ï¤µ¤ì¡¢\fI\-\-\-\-\-END\fR¤Ç»Ï¤Þ¤ëʸ»úÎó¤Ç½ªÎ»¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢X\&.509 v1¡¢v2¡¢v3¤Î¾ÚÌÀ½ñ¡¢¤ª¤è¤ÓPKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¤«¤é¹½À®¤µ¤ì¤Æ¤¤¤ëPKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Ï¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½Êý¼°¡¢¤Þ¤¿¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°(Base64Éä¹æ²½¤È¤â¸Æ¤Ð¤ì¤ë)¤Î¤É¤Á¤é¤«¤ÇÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÉä¹æ²½Êý¼°¤Î¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï\fB\-\fR\fB\-\-\-\-BEGIN\fR¤Ç»Ï¤Þ¤ëʸ»úÎó¤Ç³«»Ï¤µ¤ì¡¢\fB\-\-\-\-\-END\fR¤Ç»Ï¤Þ¤ëʸ»úÎó¤Ç½ªÎ»¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¾ÚÌÀ½ñ¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤ËÄɲ乤뤿¤á¡¢¤ª¤è¤Óǧ¾Ú¶É(CA)¤Ë¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤¿·ë²Ì¤È¤·¤ÆCA¤«¤é¼õ¿®¤·¤¿¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤¿¤á(¥³¥Þ¥ó¥É¤Î\fI\-certreq\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È)¤È¤¤¤¦2¤Ä¤ÎÍýͳ¤Ç¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£ ++¾ÚÌÀ½ñ¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤ËÄɲ乤뤿¤á¡¢¤ª¤è¤Óǧ¾Ú¶É(CA)¤Ë¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤¿·ë²Ì¤È¤·¤ÆCA¤«¤é¼õ¿®¤·¤¿¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤¿¤á(\fB¤Î\fR\-certreq¥³¥Þ¥ó¥É¥ª¥×¥·¥ç¥ó¤ò»²¾È)¤È¤¤¤¦2¤Ä¤ÎÍýͳ¤Ç¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .sp +-¤É¤Á¤é¤Î¥¿¥¤¥×¤Î¥¤¥ó¥Ý¡¼¥È¤ò¹Ô¤¦¤«¤Ï¡¢\fI\-alias\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤè¤Ã¤Æ»ØÄꤷ¤Þ¤¹¡£ÊÌ̾¤¬¥­¡¼¡¦¥¨¥ó¥È¥ê¤ò¥Ý¥¤¥ó¥È¤·¤Ê¤¤¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤¬¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¥¨¥ó¥È¥ê¤òÄɲ䷤褦¤È¤·¤Æ¤¤¤ë¤â¤Î¤È¤ß¤Ê¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢ÊÌ̾¤¬¥­¡¼¥¹¥È¥¢Æâ¤Ë¸ºß¤·¤Æ¤¤¤Ê¤¤¤³¤È¤¬É¬ÍפǤ¹¡£ÊÌ̾¤¬¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎÊÌ̾¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Î¤Ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¥¨¥é¡¼¤ò½ÐÎϤ·¡¢¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È¤ò¹Ô¤¤¤Þ¤»¤ó¡£ÊÌ̾¤¬¥­¡¼¡¦¥¨¥ó¥È¥ê¤ò¥Ý¥¤¥ó¥È¤¹¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤¬¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤â¤Î¤È¤ß¤Ê¤·¤Þ¤¹¡£ ++¤É¤Á¤é¤Î¥¿¥¤¥×¤Î¥¤¥ó¥Ý¡¼¥È¤ò¹Ô¤¦¤«¤Ï¡¢\fB\-alias\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤè¤Ã¤Æ»ØÄꤷ¤Þ¤¹¡£ÊÌ̾¤¬¥­¡¼¡¦¥¨¥ó¥È¥ê¤ò¥Ý¥¤¥ó¥È¤·¤Ê¤¤¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤¬¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¥¨¥ó¥È¥ê¤òÄɲ䷤褦¤È¤·¤Æ¤¤¤ë¤â¤Î¤È¤ß¤Ê¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢ÊÌ̾¤¬¥­¡¼¥¹¥È¥¢Æâ¤Ë¸ºß¤·¤Æ¤¤¤Ê¤¤¤³¤È¤¬É¬ÍפǤ¹¡£ÊÌ̾¤¬¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎÊÌ̾¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Î¤Ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¥¨¥é¡¼¤ò½ÐÎϤ·¡¢¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È¤ò¹Ô¤¤¤Þ¤»¤ó¡£ÊÌ̾¤¬¥­¡¼¡¦¥¨¥ó¥È¥ê¤ò¥Ý¥¤¥ó¥È¤¹¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤¬¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤â¤Î¤È¤ß¤Ê¤·¤Þ¤¹¡£ + .RE + .PP + \-importpassword + .RS 4 +-\fI{\-alias alias} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-¥Ñ¥¹¥Õ¥ì¡¼¥º¤ò¥¤¥ó¥Ý¡¼¥È¤·¡¢\fIalias\fR¤Ç¼±Ê̤µ¤ì¤ë¿·µ¬\fIKeyStore\&.SecretKeyEntry\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Ñ¥¹¥Õ¥ì¡¼¥º¤Ï¡¢É¸½àÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò²ð¤·¤ÆÄ󶡤Ǥ­¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥æ¡¼¥¶¡¼¤Ë¤½¤Î¥×¥í¥ó¥×¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fIkeypass\fR¤Ï¡¢¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¥Ñ¥¹¥Õ¥ì¡¼¥º¤ÎÊݸî¤Ë»ÈÍѤµ¤ì¤ë¥Ñ¥¹¥ï¡¼¥É¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢\fIkeystore\fR¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fIkeypass\fR¤Ï¡¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥Ñ¥¹¥Õ¥ì¡¼¥º¤ò¥¤¥ó¥Ý¡¼¥È¤·¡¢\fBalias\fR¤Ç¼±Ê̤µ¤ì¤ë¿·µ¬\fBKeyStore\&.SecretKeyEntry\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Ñ¥¹¥Õ¥ì¡¼¥º¤Ï¡¢É¸½àÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò²ð¤·¤ÆÄ󶡤Ǥ­¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥æ¡¼¥¶¡¼¤Ë¤½¤Î¥×¥í¥ó¥×¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fBkeypass\fR¤Ï¡¢¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¥Ñ¥¹¥Õ¥ì¡¼¥º¤ÎÊݸî¤Ë»ÈÍѤµ¤ì¤ë¥Ñ¥¹¥ï¡¼¥É¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢\fBkeystore\fR¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fBkeypass\fR¤Ï¡¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-importkeystore + .RS 4 +-\fI{\-srcstoretype srcstoretype} {\-deststoretype deststoretype} [\-srcstorepass srcstorepass] [\-deststorepass deststorepass] {\-srcprotected} {\-destprotected} {\-srcalias srcalias {\-destalias destalias} [\-srckeypass srckeypass] } [\-destkeypass destkeypass] {\-noprompt} {\-srcProviderName src_provider_name} {\-destProviderName dest_provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-srcstoretype srcstoretype} {\-deststoretype deststoretype} [\-srcstorepass srcstorepass] [\-deststorepass deststorepass] {\-srcprotected} {\-destprotected} {\-srcalias srcalias {\-destalias destalias} [\-srckeypass srckeypass] } [\-destkeypass destkeypass] {\-noprompt} {\-srcProviderName src_provider_name} {\-destProviderName dest_provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp + ¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢¤«¤é¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ø¡¢Ã±°ì¤Î¥¨¥ó¥È¥ê¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤ò¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .sp +-\fI\-srcalias\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¤½¤ÎÊÌ̾¤ÇÆÃÄꤵ¤ì¤ëñ°ì¤Î¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£\fIdestalias\fR·Ðͳ¤Ç¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fIsrcalias\fR¤¬¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¥½¡¼¥¹¤Î¥¨¥ó¥È¥ê¤¬¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fIsrckeypass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤¬²óÉü¤µ¤ì¤Þ¤¹¡£\fIsrckeypass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï\fIsrcstorepass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤ò²óÉü¤·¤è¤¦¤È¤·¤Þ¤¹¡£\fIsrcstorepass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¤«Àµ¤·¤¯¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥È¤Î¥¨¥ó¥È¥ê¤Ï\fIdestkeypass\fR¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£\fIdestkeypass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤Ï¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤Î¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤Û¤È¤ó¤É¤Î¥µ¡¼¥É¡¦¥Ñ¡¼¥Æ¥£¡¦¥Ä¡¼¥ë¤Ç¤Ï¡¢PKCS #12¥­¡¼¥¹¥È¥¢¤Ç\fIstorepass\fR¤È\fIkeypass\fR¤¬Æ±¤¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥Ä¡¼¥ë¤ÎPKCS #12¥­¡¼¥¹¥È¥¢¤òºîÀ®¤¹¤ë¾ì¹ç¤Ï¡¢¾ï¤Ë\fI\-destkeypass\fR¤È\fI\-deststorepass\fR¤¬Æ±¤¸¤Ë¤Ê¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fB\-srcalias\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¤½¤ÎÊÌ̾¤ÇÆÃÄꤵ¤ì¤ëñ°ì¤Î¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£\fBdestalias\fR·Ðͳ¤Ç¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fBsrcalias\fR¤¬¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¥½¡¼¥¹¤Î¥¨¥ó¥È¥ê¤¬¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fBsrckeypass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤¬²óÉü¤µ¤ì¤Þ¤¹¡£\fIsrckeypass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï\fBsrcstorepass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤ò²óÉü¤·¤è¤¦¤È¤·¤Þ¤¹¡£\fBsrcstorepass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¤«Àµ¤·¤¯¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥È¤Î¥¨¥ó¥È¥ê¤Ï\fBdestkeypass\fR¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£\fBdestkeypass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤Ï¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤Î¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤Û¤È¤ó¤É¤Î¥µ¡¼¥É¡¦¥Ñ¡¼¥Æ¥£¡¦¥Ä¡¼¥ë¤Ç¤Ï¡¢PKCS #12¥­¡¼¥¹¥È¥¢¤Ç\fBstorepass\fR¤È\fBkeypass\fR¤¬Æ±¤¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥Ä¡¼¥ë¤ÎPKCS #12¥­¡¼¥¹¥È¥¢¤òºîÀ®¤¹¤ë¾ì¹ç¤Ï¡¢¾ï¤Ë\fB\-destkeypass\fR¤È\fB\-deststorepass\fR¤¬Æ±¤¸¤Ë¤Ê¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ + .sp +-\fI\-srcalias\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£³Æ¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤ÏÂбþ¤¹¤ë¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤ÎÊÌ̾¤Î²¼¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¥½¡¼¥¹¤Î¥¨¥ó¥È¥ê¤¬¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fIsrcstorepass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤¬²óÉü¤µ¤ì¤Þ¤¹¡£\fIsrcstorepass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¤«Àµ¤·¤¯¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¤¢¤ë¥¨¥ó¥È¥ê¡¦¥¿¥¤¥×¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤ä¡¢¤¢¤ë¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤¹¤ëºÝ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¤½¤Î¥¨¥ó¥È¥ê¤ò¥¹¥­¥Ã¥×¤·¤Æ½èÍý¤ò³¹Ô¤¹¤ë¤«¡¢¤¢¤ë¤¤¤Ï½èÍý¤òÃæÃǤ¹¤ë¤«¤ÎÁªÂò¤òµá¤á¤é¤ì¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤Ï¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤Î¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£ ++\fB\-srcalias\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£³Æ¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤ÏÂбþ¤¹¤ë¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤ÎÊÌ̾¤Î²¼¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¥½¡¼¥¹¤Î¥¨¥ó¥È¥ê¤¬¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fBsrcstorepass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤¬²óÉü¤µ¤ì¤Þ¤¹¡£\fBsrcstorepass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¤«Àµ¤·¤¯¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¤¢¤ë¥¨¥ó¥È¥ê¡¦¥¿¥¤¥×¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤ä¡¢¤¢¤ë¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤¹¤ëºÝ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¤½¤Î¥¨¥ó¥È¥ê¤ò¥¹¥­¥Ã¥×¤·¤Æ½èÍý¤ò³¹Ô¤¹¤ë¤«¡¢¤Þ¤¿¤ÏÃæ»ß¤¹¤ë¤«¤ÎÁªÂò¤òµá¤á¤é¤ì¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤Ï¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤Î¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£ + .sp + ¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Ë¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¡¢¤½¤Î¥¨¥ó¥È¥ê¤ò¾å½ñ¤­¤¹¤ë¤«¡¢¤¢¤ë¤¤¤Ï°Û¤Ê¤ëÊÌ̾¤Î²¼¤Ç¿·¤·¤¤¥¨¥ó¥È¥ê¤òºîÀ®¤¹¤ë¤«¤ÎÁªÂò¤òµá¤á¤é¤ì¤Þ¤¹¡£ + .sp + +-\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¿·¤·¤¤¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤»¤ó¡£´û¸¤Î¥¨¥ó¥È¥ê¤¬¤½¤Î¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤Ç¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Ê¤¤¥¨¥ó¥È¥ê¤Ï¥¹¥­¥Ã¥×¤µ¤ì¡¢·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¿·¤·¤¤¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤»¤ó¡£´û¸¤Î¥¨¥ó¥È¥ê¤¬¤½¤Î¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤Ç¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Ê¤¤¥¨¥ó¥È¥ê¤Ï¥¹¥­¥Ã¥×¤µ¤ì¡¢·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \-printcertreq + .RS 4 +-\fI{\-file file}\fR ++\fB{\-file file}\fR + .sp +-PKCS#10·Á¼°¤Î¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤ÎÆâÍƤò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥ê¥¯¥¨¥¹¥È¤Ï¡¢\fIkeytool\fR +-\fI\-certreq\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Õ¥¡¥¤¥ë¤«¤é¥ê¥¯¥¨¥¹¥È¤òÆɤ߼è¤ê¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¡¢¥ê¥¯¥¨¥¹¥È¤Ïɸ½àÆþÎϤ«¤éÆɤ߼è¤é¤ì¤Þ¤¹¡£ ++PKCS#10·Á¼°¤Î¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤ÎÆâÍƤò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥ê¥¯¥¨¥¹¥È¤Ï¡¢\fBkeytool\fR ++\fB\-certreq\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Õ¥¡¥¤¥ë¤«¤é¥ê¥¯¥¨¥¹¥È¤òÆɤ߼è¤ê¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¡¢¥ê¥¯¥¨¥¹¥È¤Ïɸ½àÆþÎϤ«¤éÆɤ߼è¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-certreq + .RS 4 +-\fI{\-alias alias} {\-dname dname} {\-sigalg sigalg} {\-file certreq_file} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} {\-dname dname} {\-sigalg sigalg} {\-file certreq_file} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp + PKCS#10·Á¼°¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È(CSR)¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + CSR¤Ï¡¢¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤ËÁ÷¿®¤¹¤ë¤³¤È¤òÌÜŪ¤È¤·¤¿¤â¤Î¤Ç¤¹¡£CA¤Ï¡¢¾ÚÌÀ½ñÍ×µá¼Ô¤ò(Ä̾ï¤Ï¥ª¥Õ¥é¥¤¥ó¤Ç)ǧ¾Ú¤·¡¢¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÁ÷¤êÊÖ¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î´û¸¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó(ºÇ½é¤Ï1¤Ä¤Î¼«¸Ê½ð̾¾ÚÌÀ½ñ¤«¤é¹½À®¤µ¤ì¤ë)¤ËÃÖ¤­´¹¤¨¤Æ»ÈÍѤ·¤Þ¤¹¡£ + .sp +-alias¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤Ï¡¢PKCS#10¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤òºîÀ®¤¹¤ë¤Î¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ÈëÌ©¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢Àµ¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIkeypass\fR¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£\fIdname\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤½¤ì¤¬CSR¤Ç¼çÂΤȤ·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿X\&.500¼±ÊÌ̾¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++alias¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤Ï¡¢PKCS#10¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤òºîÀ®¤¹¤ë¤Î¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ÈëÌ©¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢Àµ¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç\fBkeypass\fR¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£\fBdname\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤½¤ì¤¬CSR¤Ç¼çÂΤȤ·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿X\&.500¼±ÊÌ̾¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp +-\fIsigalg\fRÃͤˤϡ¢CSR¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBsigalg\fRÃͤˤϡ¢CSR¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-CSR¤Ï¡¢¥Õ¥¡¥¤¥ëcertreq_file¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIstdout\fR¤ËCSR¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++CSR¤Ï¡¢¥Õ¥¡¥¤¥ëcertreq_file¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBstdout\fR¤ËCSR¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp +-CA¤«¤é¤Î¥ì¥¹¥Ý¥ó¥¹¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢\fIimportcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++CA¤«¤é¤Î¥ì¥¹¥Ý¥ó¥¹¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢\fBimportcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-exportcert + .RS 4 +-\fI{\-alias alias} {\-file cert_file} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-rfc} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} {\-file cert_file} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-rfc} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-\fIalias\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤«¤éÆɤ߹þ¤ß¡¢¥Õ¥¡¥¤¥ëcert_file¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIstdout\fR¤Ë¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fIalias\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤«¤éÆɤ߹þ¤ß¡¢¥Õ¥¡¥¤¥ëcert_file¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBstdout\fR¤Ë¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¾ÚÌÀ½ñ¤Ï¥Ð¥¤¥Ê¥êÉä¹æ²½¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Î½ÐÎϤϥ¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¾ÚÌÀ½ñ¤Ï¥Ð¥¤¥Ê¥êÉä¹æ²½¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Î½ÐÎϤϥ¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fIalias\fR¤¬¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ë¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fIalias\fR¤Ï¡¢´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»ý¤Ä¸°¥¨¥ó¥È¥ê¤ò»²¾È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Ï¡¢\fIalias\fR¤Ë¤è¤Ã¤Æɽ¤µ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ç¤¹¡£ ++\fBalias\fR¤¬¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ë¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fBalias\fR¤Ï¡¢´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»ý¤Ä¸°¥¨¥ó¥È¥ê¤ò»²¾È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Ï¡¢\fBalias\fR¤Ë¤è¤Ã¤Æɽ¤µ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ç¤¹¡£ + .sp +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fI\-export\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fI\-exportcert\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fB\-export\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fB\-exportcert\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ + .RE + .PP + \-list + .RS 4 +-\fI{\-alias alias} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v | \-rfc} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v | \-rfc} {\-protected} {\-Jjavaoption}\fR + .sp +-\fIalias\fR¤ÇÆÃÄꤵ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÆâÍƤò\fIstdout\fR¤Ë½ÐÎϤ·¤Þ¤¹¡£\fIalias\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥­¡¼¥¹¥È¥¢Á´ÂΤÎÆâÍƤ¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++\fBalias\fR¤ÇÆÃÄꤵ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÆâÍƤò\fBstdout\fR¤Ë½ÐÎϤ·¤Þ¤¹¡£\fBalias\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥­¡¼¥¹¥È¥¢Á´ÂΤÎÆâÍƤ¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .sp + ¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¾ÚÌÀ½ñ¤ÎSHA1¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤·¤Þ¤¹¡£ +-\fI\-v\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢½êÍ­¼Ô¡¢È¯¹Ô¼Ô¡¢¥·¥ê¥¢¥ëÈֹ桢³ÈÄ¥µ¡Ç½¤Ê¤É¤ÎÉÕ²ÃŪ¤Ê¾ðÊó¤È¤È¤â¤Ë¡¢¿Í´Ö¤¬Æɤळ¤È¤Î¤Ç¤­¤ë·Á¼°¤Ç¾ÚÌÀ½ñ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ç¾ÚÌÀ½ñ¤ÎÆâÍƤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fB\-v\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢½êÍ­¼Ô¡¢È¯¹Ô¼Ô¡¢¥·¥ê¥¢¥ëÈֹ桢³ÈÄ¥µ¡Ç½¤Ê¤É¤ÎÉÕ²ÃŪ¤Ê¾ðÊó¤È¤È¤â¤Ë¡¢¿Í´Ö¤¬Æɤळ¤È¤Î¤Ç¤­¤ë·Á¼°¤Ç¾ÚÌÀ½ñ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ç¾ÚÌÀ½ñ¤ÎÆâÍƤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp +-\fI\-v\fR¥ª¥×¥·¥ç¥ó¤È\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ++\fB\-v\fR¥ª¥×¥·¥ç¥ó¤È\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP + \-printcert + .RS 4 +-\fI{\-file cert_file | \-sslserver host[:port]} {\-jarfile JAR_file {\-rfc} {\-v} {\-Jjavaoption}\fR ++\fB{\-file cert_file | \-sslserver host[:port]} {\-jarfile JAR_file {\-rfc} {\-v} {\-Jjavaoption}\fR + .sp +-¥Õ¥¡¥¤¥ëcert_file¡¢host:port¤Ë¤¢¤ëSSL¥µ¡¼¥Ð¡¼¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë\fIJAR_file\fR(\fI\-jarfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê)¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤ß¡¢¿Í´Ö¤¬Æɤळ¤È¤Î¤Ç¤­¤ë·Á¼°¤Ç¾ÚÌÀ½ñ¤ÎÆâÍƤòɽ¼¨¤·¤Þ¤¹¡£¥Ý¡¼¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢É¸½à¤ÎHTTPS¥Ý¡¼¥È443¤¬ÁÛÄꤵ¤ì¤Þ¤¹¡£\fI\-sslserver\fR¤ª¤è¤Ó\-file¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤ËÈ¿¤¹¤ë¾ì¹ç¡¢¥¨¥é¡¼¤¬Êó¹ð¤µ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIstdin\fR¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤ß¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ëcert_file¡¢host:port¤Ë¤¢¤ëSSL¥µ¡¼¥Ð¡¼¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë\fBJAR_file\fR(\fB\-jarfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê)¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤ß¡¢¿Í´Ö¤¬Æɤळ¤È¤Î¤Ç¤­¤ë·Á¼°¤Ç¾ÚÌÀ½ñ¤ÎÆâÍƤòɽ¼¨¤·¤Þ¤¹¡£¥Ý¡¼¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢É¸½à¤ÎHTTPS¥Ý¡¼¥È443¤¬ÁÛÄꤵ¤ì¤Þ¤¹¡£\fB\-sslserver\fR¤ª¤è¤Ó\-file¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥¨¥é¡¼¤¬Êó¹ð¤µ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBstdin\fR¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤ß¤Þ¤¹¡£ + .sp +-\fI\-rfc\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½É¸½à¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢PEM¥â¡¼¥É¤Ç¾ÚÌÀ½ñ¤ò½ÐÎϤ·¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-rfc\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½É¸½à¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢PEM¥â¡¼¥É¤Ç¾ÚÌÀ½ñ¤ò½ÐÎϤ·¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï\fIstdin\fR¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤à¾ì¹ç¡¢¤½¤Î¾ÚÌÀ½ñ¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½É¸½à¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½Êý¼°¤Þ¤¿¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Çɽ¼¨¤Ç¤­¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï\fBstdin\fR¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤à¾ì¹ç¡¢¤½¤Î¾ÚÌÀ½ñ¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½É¸½à¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½Êý¼°¤Þ¤¿¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Çɽ¼¨¤Ç¤­¤Þ¤¹¡£ + .sp +-SSL¥µ¡¼¥Ð¡¼¤¬¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤ÎÇظå¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-J\-Dhttps\&.proxyHost=proxyhost\fR¤ª¤è¤Ó\fI\-J\-Dhttps\&.proxyPort=proxyport\fR¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Æ¡¢¥×¥í¥­¥·¡¦¥È¥ó¥Í¥ê¥ó¥°¤ò»ÈÍѤǤ­¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide\&.html¤Î ++SSL¥µ¡¼¥Ð¡¼¤¬¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤ÎÇظå¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-J\-Dhttps\&.proxyHost=proxyhost\fR¤ª¤è¤Ó\fB\-J\-Dhttps\&.proxyPort=proxyport\fR¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Æ¡¢¥×¥í¥­¥·¡¦¥È¥ó¥Í¥ê¥ó¥°¤ò»ÈÍѤǤ­¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide\&.html¤Î + ¡ÖJava Secure Socket Extension (JSSE) Reference Guide¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp + \fBÃí°Õ:\fR +@@ -875,9 +881,9 @@ + .PP + \-printcrl + .RS 4 +-\fI\-file crl_ {\-v}\fR ++\fB\-file crl_ {\-v}\fR + .sp +-¥Õ¥¡¥¤¥ë\fIcrl_\fR¤«¤é¾ÚÌÀ½ñ¼º¸ú¥ê¥¹¥È(CRL)¤òÆɤ߹þ¤ß¤Þ¤¹¡£CRL¤Ï¡¢È¯¹Ô¤·¤¿CA¤Ë¤è¤Ã¤Æ¼º¸ú¤µ¤ì¤¿¥Ç¥¸¥¿¥ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ç¤¹¡£CA¤Ï¡¢\fIcrl_\fR¤òÀ¸À®¤·¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ë\fBcrl_\fR¤«¤é¾ÚÌÀ½ñ¼º¸ú¥ê¥¹¥È(CRL)¤òÆɤ߹þ¤ß¤Þ¤¹¡£CRL¤Ï¡¢È¯¹Ô¤·¤¿CA¤Ë¤è¤Ã¤Æ¼º¸ú¤µ¤ì¤¿¥Ç¥¸¥¿¥ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ç¤¹¡£CA¤Ï¡¢\fBcrl_\fR¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR + ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥­¡¼¥¹¥È¥¢¤È¤Ï´Ø·¸¤Ê¤¯»ÈÍѤǤ­¤Þ¤¹¡£ +@@ -885,34 +891,34 @@ + .PP + \-storepasswd + .RS 4 +-\fI[\-new new_storepass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-Jjavaoption}\fR ++\fB[\-new new_storepass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-Jjavaoption}\fR + .sp +-¥­¡¼¥¹¥È¥¢¤ÎÆâÍƤÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤òÊѹ¹¤·¤Þ¤¹¡£\fInew_storepass\fR¤Ë¤Ï¡¢¿·¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£new_storepass¤Ï¡¢6ʸ»ú°Ê¾å¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤ÎÆâÍƤÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤òÊѹ¹¤·¤Þ¤¹¡£\fBnew_storepass\fR¤Ë¤Ï¡¢¿·¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£new_storepass¤Ï¡¢6ʸ»ú°Ê¾å¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-keypasswd + .RS 4 +-\fI{\-alias alias} [\-keypass old_keypass] [\-new new_keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-Jjavaoption}\fR ++\fB{\-alias alias} [\-keypass old_keypass] [\-new new_keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-Jjavaoption}\fR + .sp +-\fIalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ëÈó¸ø³«/ÈëÌ©¸°¤òÊݸ¤ë¤¿¤á¤Î¥Ñ¥¹¥ï¡¼¥É¤ò¡¢\fIold_keypass\fR¤«¤é\fInew_keypass\fR¤ËÊѹ¹¤·¤Þ¤¹¡£new_keypass¤Ï¡¢6ʸ»ú°Ê¾å¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ëÈó¸ø³«/ÈëÌ©¸°¤òÊݸ¤ë¤¿¤á¤Î¥Ñ¥¹¥ï¡¼¥É¤ò¡¢\fBold_keypass\fR¤«¤é\fBnew_keypass\fR¤ËÊѹ¹¤·¤Þ¤¹¡£new_keypass¤Ï¡¢6ʸ»ú°Ê¾å¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-keypass\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-keypass\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-new\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¿·¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-new\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¿·¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-delete + .RS 4 +-\fI[\-alias alias] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB[\-alias alias] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-\fIalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¨¥ó¥È¥ê¤ò¥­¡¼¥¹¥È¥¢¤«¤éºï½ü¤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤ÇÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢ÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++\fBalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¨¥ó¥È¥ê¤ò¥­¡¼¥¹¥È¥¢¤«¤éºï½ü¤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤ÇÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢ÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-changealias + .RS 4 +-\fI{\-alias alias} [\-destalias destalias] [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} [\-destalias destalias] [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-»ØÄꤵ¤ì¤¿\fIalias\fR¤«¤é¿·¤·¤¤ÊÌ̾\fIdestalias\fR¤Ø¡¢´û¸¤Î¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ò°ÜÆ°¤·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¸µ¤Î¥¨¥ó¥È¥ê¤¬¥¨¥ó¥È¥ê¡¦¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fI\-keypass\fR¥ª¥×¥·¥ç¥ó¤Ç¤½¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¸°¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fIstorepass\fR(»ØÄꤵ¤ì¤¿¾ì¹ç)¤¬¤Þ¤º»î¤ß¤é¤ì¤Þ¤¹¡£¤½¤Î»î¤ß¤¬¼ºÇÔ¤¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿\fBalias\fR¤«¤é¿·¤·¤¤ÊÌ̾\fBdestalias\fR¤Ø¡¢´û¸¤Î¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ò°ÜÆ°¤·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¸µ¤Î¥¨¥ó¥È¥ê¤¬¥¨¥ó¥È¥ê¡¦¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fB\-keypass\fR¥ª¥×¥·¥ç¥ó¤Ç¤½¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¸°¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fBstorepass\fR(»ØÄꤵ¤ì¤¿¾ì¹ç)¤¬¤Þ¤º»î¤ß¤é¤ì¤Þ¤¹¡£¤½¤Î»î¤ß¤¬¼ºÇÔ¤¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-help +@@ -920,7 +926,7 @@ + ´ðËÜŪ¤Ê¥³¥Þ¥ó¥É¤È¤½¤Î¥ª¥×¥·¥ç¥ó¤Î°ìÍ÷¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp + ÆÃÄê¤Î¥³¥Þ¥ó¥É¤Î¾ÜºÙ¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Æ¤¯¤À¤µ¤¤: +-\fIkeytool \-command_name \-help\fR¡£\fIcommand_name\fR¤Ï¥³¥Þ¥ó¥É¤Î̾Á°¤Ç¤¹¡£ ++\fBkeytool \-command_name \-help\fR¡£\fBcommand_name\fR¤Ï¥³¥Þ¥ó¥É¤Î̾Á°¤Ç¤¹¡£ + .RE + .SH "Îã" + .PP +@@ -933,18 +939,19 @@ + .RS 4 + .\} + .nf +-keytool \-genkeypair \-dname "cn=Mark Jones, ou=Java, o=Oracle, c=US" +- \-alias business \-keypass <new password for private key> +- \-keystore /working/mykeystore +- \-storepass <new password for keystore> \-validity 180 ++\fBkeytool \-genkeypair \-dname "cn=Mark Jones, ou=Java, o=Oracle, c=US"\fR ++\fB \-alias business \-keypass <new password for private key>\fR ++\fB \-keystore /working/mykeystore\fR ++\fB \-storepass <new password for keystore> \-validity 180\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥³¥Þ¥ó¥É¤Ï¡¢working¥Ç¥£¥ì¥¯¥È¥ê¤Ë\fImykeystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤òºîÀ®¤·(¥­¡¼¥¹¥È¥¢¤Ï¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤¤¤È²¾Äê)¡¢ºîÀ®¤·¤¿¥­¡¼¥¹¥È¥¢¤Ë¡¢\fI<new password for keystore>\fR¤Ç»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥É¤ò³ä¤êÅö¤Æ¤Þ¤¹¡£À¸À®¤¹¤ë¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤ËÂбþ¤¹¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¡Ö¼±ÊÌ̾¡×¤Ï¡¢Ä̾Τ¬Mark Jones¡¢ÁÈ¿¥Ã±°Ì¤¬Java¡¢ÁÈ¿¥¤¬Oracle¡¢2ʸ»ú¤Î¹ñÈֹ椬US¤Ç¤¹¡£¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥µ¥¤¥º¤Ï¤É¤Á¤é¤â1024¥Ó¥Ã¥È¤Ç¡¢¸°¤ÎºîÀ®¤Ë¤Ï¥Ç¥Õ¥©¥ë¥È¤ÎDSA¸°À¸À®¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¤Ï¡¢working¥Ç¥£¥ì¥¯¥È¥ê¤Ë\fBmykeystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤òºîÀ®¤·(¥­¡¼¥¹¥È¥¢¤Ï¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤¤¤È²¾Äê)¡¢ºîÀ®¤·¤¿¥­¡¼¥¹¥È¥¢¤Ë¡¢\fB<new password for keystore>\fR¤Ç»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥É¤ò³ä¤êÅö¤Æ¤Þ¤¹¡£À¸À®¤¹¤ë¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤ËÂбþ¤¹¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¡Ö¼±ÊÌ̾¡×¤Ï¡¢Ä̾Τ¬Mark Jones¡¢ÁÈ¿¥Ã±°Ì¤¬Java¡¢ÁÈ¿¥¤¬Oracle¡¢2ʸ»ú¤Î¹ñÈֹ椬US¤Ç¤¹¡£¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥µ¥¤¥º¤Ï¤É¤Á¤é¤â1024¥Ó¥Ã¥È¤Ç¡¢¸°¤ÎºîÀ®¤Ë¤Ï¥Ç¥Õ¥©¥ë¥È¤ÎDSA¸°À¸À®¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£ + .PP +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎSHA1withDSA½ð̾¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤Æ¡¢¸ø³«¸°¤È¼±ÊÌ̾¾ðÊó¤ò´Þ¤à¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü´Ö¤Ï180Æü¤Ç¤¹¡£¾ÚÌÀ½ñ¤Ï¡¢ÊÌ̾\fIbusiness\fR¤ÇÆÃÄꤵ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥êÆâ¤ÎÈëÌ©¸°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Þ¤¹¡£ÈëÌ©¸°¤Ë¤Ï¡¢\fI<new password for private key>\fR¤Ç»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥É¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎSHA1withDSA½ð̾¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤Æ¡¢¸ø³«¸°¤È¼±ÊÌ̾¾ðÊó¤ò´Þ¤à¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü´Ö¤Ï180Æü¤Ç¤¹¡£¾ÚÌÀ½ñ¤Ï¡¢ÊÌ̾\fBbusiness\fR¤ÇÆÃÄꤵ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥êÆâ¤ÎÈëÌ©¸°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Þ¤¹¡£ÈëÌ©¸°¤Ë¤Ï¡¢\fB<new password for private key>\fR¤Ç»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥É¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ + .PP + ¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥³¥Þ¥ó¥É¤ÏÂçÉý¤Ëû¤¯¤Ê¤ê¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤò»ý¤Ä¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð¥Ç¥Õ¥©¥ë¥ÈÃͤ¬»ÈÍѤµ¤ì¤Þ¤¹¡£É¬¿ÜÃͤÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£»ÈÍѲÄǽ¤ÊÃͤϼ¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp +@@ -952,15 +959,16 @@ + .RS 4 + .\} + .nf +-keytool \-genkeypair ++\fBkeytool \-genkeypair\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤Î¾ì¹ç¤Ï¡¢\fImykey\fR¤È¤¤¤¦ÊÌ̾¤Ç¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤¬ºîÀ®¤µ¤ì¡¢¿·¤·¤¯À¸À®¤µ¤ì¤¿¸°¤Î¥Ú¥¢¡¢¤ª¤è¤Ó90Æü´ÖÍ­¸ú¤Ê¾ÚÌÀ½ñ¤¬¤³¤Î¥¨¥ó¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¨¥ó¥È¥ê¤Ï¡¢¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î\fI\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤ËÃÖ¤«¤ì¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¡¢¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¼±ÊÌ̾¾ðÊó¡¢¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ª¤è¤ÓÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¤³¤Î¾ì¹ç¤Ï¡¢\fBmykey\fR¤È¤¤¤¦ÊÌ̾¤Ç¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤¬ºîÀ®¤µ¤ì¡¢¿·¤·¤¯À¸À®¤µ¤ì¤¿¸°¤Î¥Ú¥¢¡¢¤ª¤è¤Ó90Æü´ÖÍ­¸ú¤Ê¾ÚÌÀ½ñ¤¬¤³¤Î¥¨¥ó¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¨¥ó¥È¥ê¤Ï¡¢¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î\fB\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤ËÃÖ¤«¤ì¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¡¢¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¼±ÊÌ̾¾ðÊó¡¢¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ª¤è¤ÓÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .PP +-°Ê¹ß¤Ç¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤Ç\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¤â¤Î¤È¤·¤ÆÎã¤ò¼¨¤·¤Þ¤¹¡£¾ðÊó¤ÎÆþÎϤòµá¤á¤é¤ì¤¿¾ì¹ç¤Ï¡¢ºÇ½é¤Ë¼¨¤·¤¿\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤ÎÃͤòÆþÎϤ·¤¿¤â¤Î¤È¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¼±ÊÌ̾¤Ë¤Ï\fIcn=Mark Jones\fR¡¢\fIou=Java\fR¡¢\fIo=Oracle\fR¡¢\fIc=US\fR¤È»ØÄꤷ¤Þ¤¹¡£ ++°Ê¹ß¤Ç¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤Ç\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¤â¤Î¤È¤·¤ÆÎã¤ò¼¨¤·¤Þ¤¹¡£¾ðÊó¤ÎÆþÎϤòµá¤á¤é¤ì¤¿¾ì¹ç¤Ï¡¢ºÇ½é¤Ë¼¨¤·¤¿\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤ÎÃͤòÆþÎϤ·¤¿¤â¤Î¤È¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¼±ÊÌ̾¤Ë¤Ï\fBcn=Mark Jones\fR¡¢\fBou=Java\fR¡¢\fBo=Oracle\fR¡¢\fBc=US\fR¤È»ØÄꤷ¤Þ¤¹¡£ + .SS "CA¤«¤é¤Î½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤Î¥ê¥¯¥¨¥¹¥È" + .PP + ¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òºîÀ®¤¹¤ë¸°¤Î¥Ú¥¢¤ÎÀ¸À®¡£¾ÚÌÀ½ñ¤Ë¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤Î½ð̾¤¬ÉÕ¤¤¤Æ¤¤¤ì¤Ð¡¢Â¾¤Î¥æ¡¼¥¶¡¼¤«¤é¾ÚÌÀ½ñ¤¬¿®Íꤵ¤ì¤ë²ÄǽÀ­¤â¹â¤¯¤Ê¤ê¤Þ¤¹¡£CA¤Î½ð̾¤ò¼èÆÀ¤¹¤ë¤Ë¤Ï¡¢¤Þ¤º¡¢¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È(CSR)¤òÀ¸À®¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ +@@ -969,18 +977,19 @@ + .RS 4 + .\} + .nf +-keytool \-certreq \-file MarkJ\&.csr ++\fBkeytool \-certreq \-file MarkJ\&.csr\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-CSR(¥Ç¥Õ¥©¥ë¥ÈÊÌ̾\fImykey\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤ÎCSR)¤¬ºîÀ®¤µ¤ì¡¢MarkJ\&.csr¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ËÃÖ¤«¤ì¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤òCA (VeriSign¤Ê¤É)¤ËÄó½Ð¤·¤Þ¤¹¡£CA¤ÏÍ×µá¼Ô¤ò(Ä̾ï¤Ï¥ª¥Õ¥é¥¤¥ó¤Ç)ǧ¾Ú¤·¡¢Í×µá¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿½ð̾ÉÕ¤­¤Î¾ÚÌÀ½ñ¤òÁ÷¤êÊÖ¤·¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢CA¤¬¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òÊÖ¤¹¤³¤È¤â¤¢¤ê¤Þ¤¹¡£¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤Ç¤Ï¡¢³Æ¾ÚÌÀ½ñ¤¬¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î½ð̾¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹¡£ ++CSR(¥Ç¥Õ¥©¥ë¥ÈÊÌ̾\fBmykey\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤ÎCSR)¤¬ºîÀ®¤µ¤ì¡¢MarkJ\&.csr¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ËÃÖ¤«¤ì¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤òCA (VeriSign¤Ê¤É)¤ËÄó½Ð¤·¤Þ¤¹¡£CA¤ÏÍ×µá¼Ô¤ò(Ä̾ï¤Ï¥ª¥Õ¥é¥¤¥ó¤Ç)ǧ¾Ú¤·¡¢Í×µá¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿½ð̾ÉÕ¤­¤Î¾ÚÌÀ½ñ¤òÁ÷¤êÊÖ¤·¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢CA¤¬¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òÊÖ¤¹¤³¤È¤â¤¢¤ê¤Þ¤¹¡£¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤Ç¤Ï¡¢³Æ¾ÚÌÀ½ñ¤¬¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î½ð̾¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹¡£ + .SS "CA¤«¤é¤Î¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È" + .PP + ºîÀ®¤·¤¿¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤Ï¡¢³Æ¾ÚÌÀ½ñ¤¬¡¢¡Ö¥ë¡¼¥È¡×CA¤òµ¯ÅÀ¤È¤¹¤ë¥Á¥§¡¼¥óÆâ¤Î¼¡¤Î¾ÚÌÀ½ñ¤Î½ð̾¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹¡£ + .PP +-CA¤«¤é¤Î¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢¥­¡¼¥¹¥È¥¢¤«¡¢\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë1¤Ä°Ê¾å¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤¬¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI¤Î\fR\-importcert¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++CA¤«¤é¤Î¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢¥­¡¼¥¹¥È¥¢¤«¡¢\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë1¤Ä°Ê¾å¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤¬¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¤Î\fB\-importcert\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1004,9 +1013,9 @@ + ¾ÚÌÀ½ñ±þÅú¤¬Ã±°ì¤Î¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢È¯¹ÔCA(½ð̾¤·¤¿)¤Î¾ÚÌÀ½ñ¤¬É¬ÍפǤ¹¡£¤½¤Î¾ÚÌÀ½ñ¤¬¼«¸Ê½ð̾¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¢¤½¤Î½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤¬É¬ÍפǤ¢¤ê¡¢¤³¤Î¤è¤¦¤Ë¤·¤Æ¼«¸Ê½ð̾¥ë¡¼¥È¾ÚÌÀ½ñ¤¬É¬Íפˤʤê¤Þ¤¹¡£ + .RE + .PP +-\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¤¤¤¯¤Ä¤«¤ÎVeriSign¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò´Þ¤ó¤À¾õÂ֤ǽв٤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢VeriSign¤Î¾ÚÌÀ½ñ¤ò¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ëɬÍפ¬¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢Â¾¤ÎCA¤ËÂФ·¤Æ½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤ò¥ê¥¯¥¨¥¹¥È¤·¤Æ¤¤¤Æ¡¢¤³¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤¬¡¢\fIcacerts\fR¤Ë¤Þ¤ÀÄɲ䵤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ëCA¤«¤é¤Î¾ÚÌÀ½ñ¤ò¡¢¡Ö¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¡×¤È¤·¤Æ¥¤¥ó¥Ý¡¼¥È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¤¤¤¯¤Ä¤«¤ÎVeriSign¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò´Þ¤ó¤À¾õÂ֤ǽв٤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢VeriSign¤Î¾ÚÌÀ½ñ¤ò¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ëɬÍפ¬¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢Â¾¤ÎCA¤ËÂФ·¤Æ½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤ò¥ê¥¯¥¨¥¹¥È¤·¤Æ¤¤¤Æ¡¢¤³¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤¬¡¢\fBcacerts\fR¤Ë¤Þ¤ÀÄɲ䵤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ëCA¤«¤é¤Î¾ÚÌÀ½ñ¤ò¡¢¡Ö¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¡×¤È¤·¤Æ¥¤¥ó¥Ý¡¼¥È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-Ä̾CA¤«¤é¤Î¾ÚÌÀ½ñ¤Ï¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¡¢¤Þ¤¿¤Ï¾¤ÎCA¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¾ÚÌÀ½ñ¤Ç¤¹(¸å¼Ô¤Î¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ë¾¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤¬É¬Í×)¡£ABC, Inc\&.,¤¬CA¤Ç¡¢ABC¤«¤é¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¤¢¤ëA\fIBCCA\&.cer\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ò¼èÆÀ¤·¤¿¤È¤·¤Þ¤¹(¤³¤Î¾ÚÌÀ½ñ¤ÏCA¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹)¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤º¡¢\fIkeytool \-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤Ê¤·¤Î\fIkeytool \-importcert\fR¥³¥Þ¥ó¥É¤Ç¤½¤ì¤òɽ¼¨¤·¡¢É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬´üÂÔ¤µ¤ì¤ë¤â¤Î¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¤òÁ÷¿®¤·¤¿¿Íʪ¤ËÏ¢Íí¤·¡¢¤³¤Î¿Íʪ¤¬Ä󼨤·¤¿(¤Þ¤¿¤Ï°ÂÁ´¤Ê¸ø³«¸°¤Î¥ê¥Ý¥¸¥È¥ê¤Ë¤è¤Ã¤ÆÄ󼨤µ¤ì¤ë)¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¾å¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬°ìÃפ¹¤ì¤Ð¡¢Á÷¿®ÅÓÃæ¤Ç¾¤Î²¿¼Ô¤«(¹¶·â¼Ô¤Ê¤É)¤Ë¤è¤ë¾ÚÌÀ½ñ¤Î¤¹¤êÂؤ¨¤¬¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£Á÷¿®ÅÓÃæ¤Ç¤³¤Î¼ï¤Î¹¶·â¤¬¹Ô¤ï¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥Á¥§¥Ã¥¯¤ò¹Ô¤ï¤º¤Ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¡¢¹¶·â¼Ô¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¤â¤Î¤ò¿®Íꤹ¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++Ä̾CA¤«¤é¤Î¾ÚÌÀ½ñ¤Ï¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¡¢¤Þ¤¿¤Ï¾¤ÎCA¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¾ÚÌÀ½ñ¤Ç¤¹(¸å¼Ô¤Î¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ë¾¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤¬É¬Í×)¡£ABC, Inc\&.,¤¬CA¤Ç¡¢ABC¤«¤é¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¤¢¤ëA\fBBCCA\&.cer\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ò¼èÆÀ¤·¤¿¤È¤·¤Þ¤¹(¤³¤Î¾ÚÌÀ½ñ¤ÏCA¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹)¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤º¡¢\fBkeytool \-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤Ê¤·¤Î\fBkeytool \-importcert\fR¥³¥Þ¥ó¥É¤Ç¤½¤ì¤òɽ¼¨¤·¡¢É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬´üÂÔ¤µ¤ì¤ë¤â¤Î¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¤òÁ÷¿®¤·¤¿¿Íʪ¤ËÏ¢Íí¤·¡¢¤³¤Î¿Íʪ¤¬Ä󼨤·¤¿(¤Þ¤¿¤Ï¥»¥­¥å¥¢¤Ê¸ø³«¸°¤Î¥ê¥Ý¥¸¥È¥ê¤Ë¤è¤Ã¤ÆÄ󼨤µ¤ì¤ë)¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¾å¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬°ìÃפ¹¤ì¤Ð¡¢Á÷¿®ÅÓÃæ¤Ç¾¤Î²¿¼Ô¤«(¹¶·â¼Ô¤Ê¤É)¤Ë¤è¤ë¾ÚÌÀ½ñ¤Î¤¹¤êÂؤ¨¤¬¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£Á÷¿®ÅÓÃæ¤Ç¤³¤Î¼ï¤Î¹¶·â¤¬¹Ô¤ï¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥Á¥§¥Ã¥¯¤ò¹Ô¤ï¤º¤Ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¡¢¹¶·â¼Ô¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¤â¤Î¤ò¿®Íꤹ¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP + ¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤È¿®Íꤹ¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¥­¡¼¥¹¥È¥¢¤ËÄɲäǤ­¤Þ¤¹¡£ + .sp +@@ -1014,16 +1023,17 @@ + .RS 4 + .\} + .nf +-keytool \-importcert \-alias abc \-file ABCCA\&.cer ++\fBkeytool \-importcert \-alias abc \-file ABCCA\&.cer\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-ABCCA\&.cer¥Õ¥¡¥¤¥ë¤Î¥Ç¡¼¥¿¤ò´Þ¤à¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¨¥ó¥È¥ê¤¬¥­¡¼¥¹¥È¥¢Æâ¤ËºîÀ®¤µ¤ì¡¢³ºÅö¤¹¤ë¥¨¥ó¥È¥ê¤Ë\fIabc\fR¤È¤¤¤¦ÊÌ̾¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ ++ABCCA\&.cer¥Õ¥¡¥¤¥ë¤Î¥Ç¡¼¥¿¤ò´Þ¤à¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¨¥ó¥È¥ê¤¬¥­¡¼¥¹¥È¥¢Æâ¤ËºîÀ®¤µ¤ì¡¢³ºÅö¤¹¤ë¥¨¥ó¥È¥ê¤Ë\fBabc\fR¤È¤¤¤¦ÊÌ̾¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ + .SS "CA¤«¤é¤Î¾ÚÌÀ½ñ±þÅú¤Î¥¤¥ó¥Ý¡¼¥È" + .PP +-¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤ÎÄó½ÐÀè¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤·¤¿¸å¤Ï(¤Þ¤¿¤ÏƱ¼ï¤Î¾ÚÌÀ½ñ¤¬¤¹¤Ç¤Ëcacerts¥Õ¥¡¥¤¥ëÆâ¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ï)¡¢¾ÚÌÀ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤·¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤ò¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Á¥§¡¼¥ó¤Ï¡¢CA¤Î±þÅú¤¬¥Á¥§¡¼¥ó¤Î¾ì¹ç¤Ë¡¢¥ê¥¯¥¨¥¹¥È¤ËÂФ¹¤ë¥ì¥¹¥Ý¥ó¥¹¤È¤·¤ÆCA¤«¤éÁ÷¤êÊÖ¤µ¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤¹¡£¤Þ¤¿¡¢CA¤Î±þÅú¤¬Ã±°ì¤Î¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢¤³¤Î¾ÚÌÀ±þÅú¤È¡¢¥¤¥ó¥Ý¡¼¥ÈÀè¤Î¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fIcacerts\fR¥­¡¼¥¹¥È¥¢¥Õ¥¡¥¤¥ëÆâ¤Ë¤¹¤Ç¤Ë¸ºß¤¹¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤ò»ÈÍѤ·¤Æ¹½ÃÛ¤·¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤¹¡£ ++¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤ÎÄó½ÐÀè¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤·¤¿¸å¤Ï(¤Þ¤¿¤ÏƱ¼ï¤Î¾ÚÌÀ½ñ¤¬¤¹¤Ç¤Ëcacerts¥Õ¥¡¥¤¥ëÆâ¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ï)¡¢¾ÚÌÀ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤·¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤ò¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Á¥§¡¼¥ó¤Ï¡¢CA¤Î±þÅú¤¬¥Á¥§¡¼¥ó¤Î¾ì¹ç¤Ë¡¢¥ê¥¯¥¨¥¹¥È¤ËÂФ¹¤ë¥ì¥¹¥Ý¥ó¥¹¤È¤·¤ÆCA¤«¤éÁ÷¤êÊÖ¤µ¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤¹¡£¤Þ¤¿¡¢CA¤Î±þÅú¤¬Ã±°ì¤Î¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢¤³¤Î¾ÚÌÀ±þÅú¤È¡¢¥¤¥ó¥Ý¡¼¥ÈÀè¤Î¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fBcacerts\fR¥­¡¼¥¹¥È¥¢¥Õ¥¡¥¤¥ëÆâ¤Ë¤¹¤Ç¤Ë¸ºß¤¹¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤ò»ÈÍѤ·¤Æ¹½ÃÛ¤·¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤¹¡£ + .PP + ¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤òVeriSign¤ËÁ÷¿®¤¹¤ë¾ì¹ç¡¢Á÷¤êÊÖ¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î̾Á°¤¬VSMarkJ\&.cer¤À¤È¤¹¤ë¤È¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Æ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£ + .sp +@@ -1031,31 +1041,33 @@ + .RS 4 + .\} + .nf +-keytool \-importcert \-trustcacerts \-file VSMarkJ\&.cer ++\fBkeytool \-importcert \-trustcacerts \-file VSMarkJ\&.cer\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Î¥¨¥¯¥¹¥Ý¡¼¥È" + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJava Archive (JAR)¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¥¯¥é¥¤¥¢¥ó¥È¤Ï½ð̾¤òǧ¾Ú¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¤¬½ð̾¤òǧ¾Ú¤¹¤ëÊýË¡¤Î1¤Ä¤Ë¡¢¤Þ¤º¼«Ê¬¤Î¸ø³«¸°¤Î¾ÚÌÀ½ñ¤ò¿®Íê¤Ç¤­¤ë¥¨¥ó¥È¥ê¤È¤·¤Æ¥¯¥é¥¤¥¢¥ó¥È¤Î¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ëÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJava Archive (JAR)¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¥¯¥é¥¤¥¢¥ó¥È¤Ï½ð̾¤òǧ¾Ú¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¤¬½ð̾¤òǧ¾Ú¤¹¤ëÊýË¡¤Î1¤Ä¤Ë¡¢¤Þ¤º¼«Ê¬¤Î¸ø³«¸°¤Î¾ÚÌÀ½ñ¤ò¿®Íê¤Ç¤­¤ë¥¨¥ó¥È¥ê¤È¤·¤Æ¥¯¥é¥¤¥¢¥ó¥È¤Î¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ëÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¤½¤Î¤¿¤á¤Ë¤Ï¡¢¾ÚÌÀ½ñ¤ò¥¨¥¯¥¹¥Ý¡¼¥È¤·¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤ËÄ󶡤·¤Þ¤¹¡£Îã¤È¤·¤Æ¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢MJ\&.cer¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ë¾ÚÌÀ½ñ¤ò¥³¥Ô¡¼¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¨¥ó¥È¥ê¤ËÊÌ̾\fImykey\fR¤¬¤¢¤ë¤È²¾Äꤷ¤Æ¤¤¤Þ¤¹¡£ ++¤½¤Î¤¿¤á¤Ë¤Ï¡¢¾ÚÌÀ½ñ¤ò¥¨¥¯¥¹¥Ý¡¼¥È¤·¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤ËÄ󶡤·¤Þ¤¹¡£Îã¤È¤·¤Æ¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢MJ\&.cer¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ë¾ÚÌÀ½ñ¤ò¥³¥Ô¡¼¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¨¥ó¥È¥ê¤ËÊÌ̾\fBmykey\fR¤¬¤¢¤ë¤È²¾Äꤷ¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-exportcert \-alias mykey \-file MJ\&.cer ++\fBkeytool \-exportcert \-alias mykey \-file MJ\&.cer\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¾ÚÌÀ½ñ¤È½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤òÆþ¼ê¤·¤¿¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ½ð̾¤òǧ¾Ú¤Ç¤­¤Þ¤¹¡£ ++¾ÚÌÀ½ñ¤È½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤òÆþ¼ê¤·¤¿¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ½ð̾¤òǧ¾Ú¤Ç¤­¤Þ¤¹¡£ + .SS "¥­¡¼¥¹¥È¥¢¤Î¥¤¥ó¥Ý¡¼¥È" + .PP +-¥³¥Þ¥ó¥É\fIimportkeystore\fR¤ò»ÈÍѤ¹¤ì¤Ð¡¢¤¢¤ë¥­¡¼¥¹¥È¥¢¤ÎÁ´ÂΤòÊ̤Υ­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢¸°¤ä¾ÚÌÀ½ñ¤È¤¤¤Ã¤¿¥½¡¼¥¹¥­¡¼¥¹¥È¥¢Æâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤¬¡¢Ã±°ì¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¥¿¡¼¥²¥Ã¥È¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢Æâ¤Ë´Þ¤Þ¤ì¤ë¥¨¥ó¥È¥ê¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È»þ¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¿·¤·¤¤¥¨¥ó¥È¥ê¤Ï¤¹¤Ù¤Æ¡¢¸µ¤ÈƱ¤¸ÊÌ̾¤ª¤è¤Ó(ÈëÌ©¸°¤äÈëÌ©¸°¤Î¾ì¹ç¤Ï)ÊݸîÍѥѥ¹¥ï¡¼¥É¤ò»ý¤Á¤Þ¤¹¡£¥½¡¼¥¹¥­¡¼¥¹¥È¥¢Æâ¤ÎÈó¸ø³«/ÈëÌ©¸°¤ò¥ê¥«¥Ð¥ê¤Ç¤­¤Ê¤¤¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤Ë¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢ÊÌ̾¤Î½ÅÊ£¤ò¸¡½Ð¤¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Ë¿·¤·¤¤ÊÌ̾¤ÎÆþÎϤòµá¤á¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢¿·¤·¤¤ÊÌ̾¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ã±½ã¤Ë´û¸¤ÎÊÌ̾¤Î¾å½ñ¤­¤ò\fIkeytool\fR¥³¥Þ¥ó¥É¤Ëµö²Ä¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É\fBimportkeystore\fR¤ò»ÈÍѤ¹¤ì¤Ð¡¢¤¢¤ë¥­¡¼¥¹¥È¥¢¤ÎÁ´ÂΤòÊ̤Υ­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢¸°¤ä¾ÚÌÀ½ñ¤È¤¤¤Ã¤¿¥½¡¼¥¹¥­¡¼¥¹¥È¥¢Æâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤¬¡¢Ã±°ì¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¥¿¡¼¥²¥Ã¥È¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢Æâ¤Ë´Þ¤Þ¤ì¤ë¥¨¥ó¥È¥ê¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È»þ¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¿·¤·¤¤¥¨¥ó¥È¥ê¤Ï¤¹¤Ù¤Æ¡¢¸µ¤ÈƱ¤¸ÊÌ̾¤ª¤è¤Ó(ÈëÌ©¸°¤äÈëÌ©¸°¤Î¾ì¹ç¤Ï)ÊݸîÍѥѥ¹¥ï¡¼¥É¤ò»ý¤Á¤Þ¤¹¡£¥½¡¼¥¹¥­¡¼¥¹¥È¥¢Æâ¤ÎÈó¸ø³«/ÈëÌ©¸°¤ò¥ê¥«¥Ð¥ê¤Ç¤­¤Ê¤¤¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤Ë¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢ÊÌ̾¤Î½ÅÊ£¤ò¸¡½Ð¤¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Ë¿·¤·¤¤ÊÌ̾¤ÎÆþÎϤòµá¤á¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢¿·¤·¤¤ÊÌ̾¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ã±½ã¤Ë´û¸¤ÎÊÌ̾¤Î¾å½ñ¤­¤ò\fBkeytool\fR¥³¥Þ¥ó¥É¤Ëµö²Ä¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .PP + ¤¿¤È¤¨¤Ð¡¢Ä̾ï¤ÎJKS¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢key\&.jksÆâ¤Î¥¨¥ó¥È¥ê¤òPKCS#11¥¿¥¤¥×¤Î¥Ï¡¼¥É¥¦¥§¥¢¡¦¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp +@@ -1063,59 +1075,62 @@ + .RS 4 + .\} + .nf +-keytool \-importkeystore +- \-srckeystore key\&.jks \-destkeystore NONE +- \-srcstoretype JKS \-deststoretype PKCS11 +- \-srcstorepass <src keystore password> +- \-deststorepass <destination keystore pwd> ++\fBkeytool \-importkeystore\fR ++\fB \-srckeystore key\&.jks \-destkeystore NONE\fR ++\fB \-srcstoretype JKS \-deststoretype PKCS11\fR ++\fB \-srcstorepass <src keystore password>\fR ++\fB \-deststorepass <destination keystore pwd>\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤Þ¤¿¡¢\fIimportkeystore\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢¤¢¤ë¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Îñ°ì¤Î¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢Á°Îã¤Î¥ª¥×¥·¥ç¥ó¤Ë²Ã¤¨¤Æ¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ëÊÌ̾¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI\-srcalias\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¾ì¹ç¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤â¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é»ØÄê¤Ç¤­¤ë¤Û¤«¡¢ÈëÌ©/ÈëÌ©¸°¤ÎÊݸîÍѥѥ¹¥ï¡¼¥É¤ä¥¿¡¼¥²¥Ã¥ÈÊݸîÍѥѥ¹¥ï¡¼¥É¤â»ØÄê¤Ç¤­¤Þ¤¹¡£¤½¤ÎÊýË¡¤ò¼¨¤¹¥³¥Þ¥ó¥É¤ò¼¡¤Ë¼¨¤·¤Þ¤¹¡£ ++¤Þ¤¿¡¢\fBimportkeystore\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢¤¢¤ë¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Îñ°ì¤Î¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢Á°Îã¤Î¥ª¥×¥·¥ç¥ó¤Ë²Ã¤¨¤Æ¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ëÊÌ̾¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-srcalias\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¾ì¹ç¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤â¥³¥Þ¥ó¥É¹Ô¤«¤é»ØÄê¤Ç¤­¤ë¤Û¤«¡¢ÈëÌ©/ÈëÌ©¸°¤ÎÊݸîÍѥѥ¹¥ï¡¼¥É¤ä¥¿¡¼¥²¥Ã¥ÈÊݸîÍѥѥ¹¥ï¡¼¥É¤â»ØÄê¤Ç¤­¤Þ¤¹¡£¤½¤ÎÊýË¡¤ò¼¨¤¹¥³¥Þ¥ó¥É¤ò¼¡¤Ë¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-importkeystore +- \-srckeystore key\&.jks \-destkeystore NONE +- \-srcstoretype JKS \-deststoretype PKCS11 +- \-srcstorepass <src keystore password> +- \-deststorepass <destination keystore pwd> +- \-srcalias myprivatekey \-destalias myoldprivatekey +- \-srckeypass <source entry password> +- \-destkeypass <destination entry password> +- \-noprompt ++\fBkeytool \-importkeystore\fR ++\fB \-srckeystore key\&.jks \-destkeystore NONE\fR ++\fB \-srcstoretype JKS \-deststoretype PKCS11\fR ++\fB \-srcstorepass <src keystore password>\fR ++\fB \-deststorepass <destination keystore pwd>\fR ++\fB \-srcalias myprivatekey \-destalias myoldprivatekey\fR ++\fB \-srckeypass <source entry password>\fR ++\fB \-destkeypass <destination entry password>\fR ++\fB \-noprompt\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "SSL¥µ¡¼¥Ð¡¼¤Î¾ÚÌÀ½ñ¤ÎÀ¸À®" + .PP +-¼¡¤Ë¡¢3¤Ä¤Î¥¨¥ó¥Æ¥£¥Æ¥£¡¢¤Ä¤Þ¤ê¥ë¡¼¥ÈCA(\fIroot\fR)¡¢Ãæ´ÖCA(\fIca\fR)¤ª¤è¤ÓSSL¥µ¡¼¥Ð¡¼(\fIserver\fR)ÍѤθ°¥Ú¥¢¤È¾ÚÌÀ½ñ¤òÀ¸À®¤¹¤ë\fIkeytool\fR¥³¥Þ¥ó¥É¤ò¼¨¤·¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¾ÚÌÀ½ñ¤òƱ¤¸¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÎÎã¤Ç¤Ï¡¢RSA¤¬¿ä¾©¤µ¤ì¤ë¸°¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹¡£ ++¼¡¤Ë¡¢3¤Ä¤Î¥¨¥ó¥Æ¥£¥Æ¥£¡¢¤Ä¤Þ¤ê¥ë¡¼¥ÈCA(\fBroot\fR)¡¢Ãæ´ÖCA(\fBca\fR)¤ª¤è¤ÓSSL¥µ¡¼¥Ð¡¼(\fBserver\fR)ÍѤθ°¥Ú¥¢¤È¾ÚÌÀ½ñ¤òÀ¸À®¤¹¤ë\fBkeytool\fR¥³¥Þ¥ó¥É¤ò¼¨¤·¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¾ÚÌÀ½ñ¤òƱ¤¸¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÎÎã¤Ç¤Ï¡¢RSA¤¬¿ä¾©¤µ¤ì¤ë¸°¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-genkeypair \-keystore root\&.jks \-alias root \-ext bc:c +-keytool \-genkeypair \-keystore ca\&.jks \-alias ca \-ext bc:c +-keytool \-genkeypair \-keystore server\&.jks \-alias server ++\fBkeytool \-genkeypair \-keystore root\&.jks \-alias root \-ext bc:c\fR ++\fBkeytool \-genkeypair \-keystore ca\&.jks \-alias ca \-ext bc:c\fR ++\fBkeytool \-genkeypair \-keystore server\&.jks \-alias server\fR ++\fB \fR ++\fBkeytool \-keystore root\&.jks \-alias root \-exportcert \-rfc > root\&.pem\fR ++\fB \fR ++\fBkeytool \-storepass <storepass> \-keystore ca\&.jks \-certreq \-alias ca |\fR ++\fB keytool \-storepass <storepass> \-keystore root\&.jks\fR ++\fB \-gencert \-alias root \-ext BC=0 \-rfc > ca\&.pem\fR ++\fBkeytool \-keystore ca\&.jks \-importcert \-alias ca \-file ca\&.pem\fR ++\fB \fR ++\fBkeytool \-storepass <storepass> \-keystore server\&.jks \-certreq \-alias server |\fR ++\fB keytool \-storepass <storepass> \-keystore ca\&.jks \-gencert \-alias ca\fR ++\fB \-ext ku:c=dig,kE \-rfc > server\&.pem\fR ++\fBcat root\&.pem ca\&.pem server\&.pem |\fR ++\fB keytool \-keystore server\&.jks \-importcert \-alias server\fR + +-keytool \-keystore root\&.jks \-alias root \-exportcert \-rfc > root\&.pem +- +-keytool \-storepass <storepass> \-keystore ca\&.jks \-certreq \-alias ca | +- keytool \-storepass <storepass> \-keystore root\&.jks +- \-gencert \-alias root \-ext BC=0 \-rfc > ca\&.pem +-keytool \-keystore ca\&.jks \-importcert \-alias ca \-file ca\&.pem +- +-keytool \-storepass <storepass> \-keystore server\&.jks \-certreq \-alias server | +- keytool \-storepass <storepass> \-keystore ca\&.jks \-gencert \-alias ca +- \-ext ku:c=dig,kE \-rfc > server\&.pem +-cat root\&.pem ca\&.pem server\&.pem | +- keytool \-keystore server\&.jks \-importcert \-alias server + .fi + .if n \{\ + .RE +@@ -1129,10 +1144,10 @@ + .PP + ¥­¡¼¥¹¥È¥¢¤Î¥¨¥ó¥È¥ê + .RS 4 +-¥­¡¼¥¹¥È¥¢¤Ë¤Ï°Û¤Ê¤ë¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤ÇºÇ¤âŬÍÑÈϰϤι­¤¤¥¨¥ó¥È¥ê¡¦¥¿¥¤¥×¤Ï¡¢¼¡¤Î2¤Ä¤Ç¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Ë¤Ï°Û¤Ê¤ë¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤ÇºÇ¤âŬÍÑÈϰϤι­¤¤¥¨¥ó¥È¥ê¡¦¥¿¥¤¥×¤Ï¡¢¼¡¤Î2¤Ä¤Ç¤¹¡£ + .sp + \fB¸°¤Î¥¨¥ó¥È¥ê\fR +-\- ³Æ¥¨¥ó¥È¥ê¤Ï¡¢Èó¾ï¤Ë½ÅÍפʰŹ沽¤Î¸°¤Î¾ðÊó¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ï¡¢µö²Ä¤·¤Æ¤¤¤Ê¤¤¥¢¥¯¥»¥¹¤òËɤ°¤¿¤á¤Ë¡¢Êݸ¤ì¤¿·Á¤Ç³ÊǼ¤µ¤ì¤Þ¤¹¡£°ìÈ̤ˡ¢¤³¤Î¼ï¤Î¥¨¥ó¥È¥ê¤È¤·¤Æ³ÊǼ¤µ¤ì¤ë¸°¤Ï¡¢ÈëÌ©¸°¤«¡¢Âбþ¤¹¤ë¸ø³«¸°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òȼ¤¦ÈëÌ©¸°¤Ç¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤¬¤³¤ÎξÊý¤Î¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¤ò½èÍý¤Ç¤­¤ë¤Î¤ËÂФ·¡¢\fIjarsigner\fR¥Ä¡¼¥ë¤Ï¸å¼Ô¤Î¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¡¢¤Ä¤Þ¤êÈëÌ©¸°¤È¤½¤ì¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¤ß¤ò½èÍý¤·¤Þ¤¹¡£ ++\- ³Æ¥¨¥ó¥È¥ê¤Ï¡¢Èó¾ï¤Ë½ÅÍפʰŹ沽¤Î¸°¤Î¾ðÊó¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ï¡¢µö²Ä¤·¤Æ¤¤¤Ê¤¤¥¢¥¯¥»¥¹¤òËɤ°¤¿¤á¤Ë¡¢Êݸ¤ì¤¿·Á¤Ç³ÊǼ¤µ¤ì¤Þ¤¹¡£°ìÈ̤ˡ¢¤³¤Î¼ï¤Î¥¨¥ó¥È¥ê¤È¤·¤Æ³ÊǼ¤µ¤ì¤ë¸°¤Ï¡¢ÈëÌ©¸°¤«¡¢Âбþ¤¹¤ë¸ø³«¸°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òȼ¤¦ÈëÌ©¸°¤Ç¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤¬¤³¤ÎξÊý¤Î¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¤ò½èÍý¤Ç¤­¤ë¤Î¤ËÂФ·¡¢\fBjarsigner\fR¥Ä¡¼¥ë¤Ï¸å¼Ô¤Î¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¡¢¤Ä¤Þ¤êÈëÌ©¸°¤È¤½¤ì¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¤ß¤ò½èÍý¤·¤Þ¤¹¡£ + .sp + \fB¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¨¥ó¥È¥ê\fR: ³Æ¥¨¥ó¥È¥ê¤Ï¡¢Âè»°¼Ô¤«¤é¤Î¸ø³«¸°¾ÚÌÀ½ñ¤ò1¤Ä´Þ¤ó¤Ç¤¤¤Þ¤¹¡£¤³¤Î¥¨¥ó¥È¥ê¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¸Æ¤Ð¤ì¤Þ¤¹¡£¤½¤ì¤Ï¡¢¾ÚÌÀ½ñÆâ¤Î¸ø³«¸°¤¬¡¢¾ÚÌÀ½ñ¤ÎSubject(½êÍ­¼Ô)¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¢¥¤¥Ç¥ó¥Æ¥£¥Æ¥£¤ËͳÍ褹¤ë¤â¤Î¤Ç¤¢¤ë¤³¤È¤ò¡¢¥­¡¼¥¹¥È¥¢¤Î½êÍ­¼Ô¤¬¿®Íꤹ¤ë¤«¤é¤Ç¤¹¡£¾ÚÌÀ½ñ¤Îȯ¹Ô¼Ô¤Ï¡¢¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¤½¤ÎÆâÍƤòÊݾڤ·¤Þ¤¹¡£ + .RE +@@ -1141,81 +1156,86 @@ + .RS 4 + ¥­¡¼¥¹¥È¥¢¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê(¸°¤ª¤è¤Ó¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¥¨¥ó¥È¥ê)¤Ï¡¢°ì°Õ¤ÎÊÌ̾¤ò²ð¤·¤Æ¥¢¥¯¥»¥¹¤µ¤ì¤Þ¤¹¡£ + .sp +-ÊÌ̾¤ò»ØÄꤹ¤ë¤Î¤Ï¡¢\fI\-genseckey\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÈëÌ©¸°¤òÀ¸À®¤·¤¿¤ê¡¢\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¸°¥Ú¥¢(¸ø³«¸°¤ÈÈëÌ©¸°)¤òÀ¸À®¤·¤¿¤ê¡¢\fI\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤ËÄɲ乤ë¤Ê¤É¡¢ÆÃÄê¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤ò¥­¡¼¥¹¥È¥¢¤ËÄɲ乤ë¾ì¹ç¤Ç¤¹¡£¤³¤ì°Ê¸å¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¥¨¥ó¥Æ¥£¥Æ¥£¤ò»²¾È¤¹¤ë¾ì¹ç¤Ï¡¢¤³¤Î¤È¤­¤Ë»ØÄꤷ¤¿ÊÌ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++ÊÌ̾¤ò»ØÄꤹ¤ë¤Î¤Ï¡¢\fB\-genseckey\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÈëÌ©¸°¤òÀ¸À®¤·¤¿¤ê¡¢\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¸°¥Ú¥¢(¸ø³«¸°¤ÈÈëÌ©¸°)¤òÀ¸À®¤·¤¿¤ê¡¢\fB\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤ËÄɲ乤ë¤Ê¤É¡¢ÆÃÄê¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤ò¥­¡¼¥¹¥È¥¢¤ËÄɲ乤ë¾ì¹ç¤Ç¤¹¡£¤³¤ì°Ê¸å¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¥¨¥ó¥Æ¥£¥Æ¥£¤ò»²¾È¤¹¤ë¾ì¹ç¤Ï¡¢¤³¤Î¤È¤­¤Ë»ØÄꤷ¤¿ÊÌ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢\fIduke\fR¤È¤¤¤¦ÊÌ̾¤ò»ÈÍѤ·¤Æ¿·¤·¤¤¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤òÀ¸À®¤·¡¢¸ø³«¸°¤ò¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤¹¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¤¿¤È¤¨¤Ð¡¢\fBduke\fR¤È¤¤¤¦ÊÌ̾¤ò»ÈÍѤ·¤Æ¿·¤·¤¤¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤òÀ¸À®¤·¡¢¸ø³«¸°¤ò¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤¹¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-genkeypair \-alias duke \-keypass dukekeypasswd ++\fBkeytool \-genkeypair \-alias duke \-keypass dukekeypasswd\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÎã¤Ç¤Ï¡¢½é´ü¥Ñ¥¹¥ï¡¼¥É¤È¤·¤Æ\fIdukekeypasswd\fR¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹¡£°Ê¸å¡¢ÊÌ̾\fIduke\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ë¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ï¡¢¤³¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬Íפˤʤê¤Þ¤¹¡£Duke¤ÎÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ò¤¢¤È¤«¤éÊѹ¹¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢½é´ü¥Ñ¥¹¥ï¡¼¥É¤È¤·¤Æ\fBdukekeypasswd\fR¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹¡£°Ê¸å¡¢ÊÌ̾\fBduke\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ë¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ï¡¢¤³¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬Íפˤʤê¤Þ¤¹¡£Duke¤ÎÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ò¤¢¤È¤«¤éÊѹ¹¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-keypasswd \-alias duke \-keypass dukekeypasswd \-new newpass ++\fBkeytool \-keypasswd \-alias duke \-keypass dukekeypasswd \-new newpass\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥Ñ¥¹¥ï¡¼¥É¤¬¡¢\fIdukekeypasswd\fR¤«¤é\fInewpass\fR¤ËÊѹ¹¤µ¤ì¤Þ¤¹¡£¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¡¢¤Þ¤¿¤Ï°ÂÁ´¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¥·¥¹¥Æ¥à¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£É¬Íפʥѥ¹¥ï¡¼¥É¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥Ñ¥¹¥ï¡¼¥É¤¬¡¢\fBdukekeypasswd\fR¤«¤é\fBnewpass\fR¤ËÊѹ¹¤µ¤ì¤Þ¤¹¡£¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¡¢¤Þ¤¿¤Ï°ÂÁ´¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¥·¥¹¥Æ¥à¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£É¬Íפʥѥ¹¥ï¡¼¥É¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ + .RS 4 +-\fIjava\&.security\fR¥Ñ¥Ã¥±¡¼¥¸¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë\fIKeyStore\fR¥¯¥é¥¹¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¾ðÊó¤Ø¤Î¥¢¥¯¥»¥¹¤ª¤è¤Ó¾ðÊó¤ÎÊѹ¹¤ò¹Ô¤¦¤¿¤á¤Î¡¢ÌÀ³Î¤ËÄêµÁ¤µ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¸ÇÄê¼ÂÁõ¤È¤·¤Æ¤Ï¡¢¤½¤ì¤¾¤ì¤¬ÆÃÄê¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤òÂоݤȤ¹¤ëÊ£¿ô¤Î°Û¤Ê¤ë¼ÂÁõ¤¬Â¸ºß²Äǽ¤Ç¤¹¡£ ++\fBjava\&.security\fR¥Ñ¥Ã¥±¡¼¥¸¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë\fBKeyStore\fR¥¯¥é¥¹¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¾ðÊó¤Ø¤Î¥¢¥¯¥»¥¹¤ª¤è¤Ó¾ðÊó¤ÎÊѹ¹¤ò¹Ô¤¦¤¿¤á¤Î¡¢ÌÀ³Î¤ËÄêµÁ¤µ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¸ÇÄê¼ÂÁõ¤È¤·¤Æ¤Ï¡¢¤½¤ì¤¾¤ì¤¬ÆÃÄê¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤òÂоݤȤ¹¤ëÊ£¿ô¤Î°Û¤Ê¤ë¼ÂÁõ¤¬Â¸ºß²Äǽ¤Ç¤¹¡£ + .sp +-¸½ºß¡¢\fIkeytool\fR¤È\fIjarsigner\fR¤Î2¤Ä¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ä¡¼¥ë¤È¡¢Policy Tool¤È¤¤¤¦Ì¾Á°¤ÎGUI¥Ù¡¼¥¹¤Î¥Ä¡¼¥ë¤¬¡¢¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£\fIKeyStore\fR¥¯¥é¥¹¤Ï\fIpublic\fR¤Ç¤¢¤ë¤¿¤á¡¢¥æ¡¼¥¶¡¼¤ÏKeyStore¤ò»ÈÍѤ·¤¿Â¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤âºîÀ®¤Ç¤­¤Þ¤¹¡£ ++¸½ºß¡¢\fBkeytool\fR¤È\fBjarsigner\fR¤Î2¤Ä¤Î¥³¥Þ¥ó¥É¹Ô¥Ä¡¼¥ë¤È¡¢Policy Tool¤È¤¤¤¦Ì¾Á°¤ÎGUI¥Ù¡¼¥¹¤Î¥Ä¡¼¥ë¤¬¡¢¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£\fBKeyStore\fR¥¯¥é¥¹¤Ï\fBpublic\fR¤Ç¤¢¤ë¤¿¤á¡¢¥æ¡¼¥¶¡¼¤ÏKeyStore¤ò»ÈÍѤ·¤¿Â¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤âºîÀ®¤Ç¤­¤Þ¤¹¡£ + .sp + ¥­¡¼¥¹¥È¥¢¤Ë¤Ï¡¢Oracle¤¬Ä󶡤¹¤ëÁȹþ¤ß¤Î¥Ç¥Õ¥©¥ë¥È¤Î¼ÂÁõ¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢JKS¤È¤¤¤¦Ì¾Á°¤ÎÆȼ«¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×(·Á¼°)¤òÍøÍѤ¹¤ë¤â¤Î¤Ç¡¢¥­¡¼¥¹¥È¥¢¤ò¥Õ¥¡¥¤¥ë¤È¤·¤Æ¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤Î¼ÂÁõ¤Ç¤Ï¡¢¸Ä¡¹¤ÎÈëÌ©¸°¤Ï¸ÄÊ̤Υѥ¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¡¢¥­¡¼¥¹¥È¥¢Á´ÂΤÎÀ°¹çÀ­¤â(ÈëÌ©¸°¤È¤ÏÊ̤Î)¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£ + .sp +-¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ï¡¢¥×¥í¥Ð¥¤¥À¥Ù¡¼¥¹¤Ç¤¹¡£¶ñÂÎŪ¤Ë¤Ï¡¢\fIKeyStore\fR¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹(SPI)¤Ë´ð¤Å¤¤¤Æ¼ÂÁõ¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢Âбþ¤¹¤ë\fIKeystoreSpi\fRÃê¾Ý¥¯¥é¥¹(¤³¤ì¤â\fIjava\&.security\fR¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹)¤¬¤¢¤ê¡¢¤³¤Î¥¯¥é¥¹¤¬¡¢¥×¥í¥Ð¥¤¥À¤¬¼ÂÁõ¤¹¤ëɬÍפΤ¢¤ëService Provider Interface¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢\fI¥×¥í¥Ð¥¤¥À\fR¤È¤Ï¡¢Java Security API¤Ë¤è¤Ã¤Æ¥¢¥¯¥»¥¹²Äǽ¤Ê¥µ¡¼¥Ó¥¹¤Î¥µ¥Ö¥»¥Ã¥È¤ËÂФ·¡¢¤½¤Î¸ÇÄê¼ÂÁõ¤òÄ󶡤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î½¸¹ç¤Î¤³¤È¤Ç¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¤Ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider\&.html¤Ë¤¢¤ë +-Java°Å¹æ²½¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥×¥í¥Ð¥¤¥À¤Î¼ÂÁõÊýË¡¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¥×¥í¥Ð¥¤¥À¤ò¼ÂÁõ¤·¡¢\fIKeystoreSpi\fR¥µ¥Ö¥¯¥é¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ï¡¢¥×¥í¥Ð¥¤¥À¥Ù¡¼¥¹¤Ç¤¹¡£¶ñÂÎŪ¤Ë¤Ï¡¢\fBKeyStore\fR¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹(SPI)¤Ë´ð¤Å¤¤¤Æ¼ÂÁõ¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢Âбþ¤¹¤ë\fBKeystoreSpi\fRÃê¾Ý¥¯¥é¥¹(¤³¤ì¤â\fBjava\&.security\fR¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹)¤¬¤¢¤ê¡¢¤³¤Î¥¯¥é¥¹¤¬¡¢¥×¥í¥Ð¥¤¥À¤¬¼ÂÁõ¤¹¤ëɬÍפΤ¢¤ëService Provider Interface¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢\fI¥×¥í¥Ð¥¤¥À\fR¤È¤Ï¡¢Java Security API¤Ë¤è¤Ã¤Æ¥¢¥¯¥»¥¹²Äǽ¤Ê¥µ¡¼¥Ó¥¹¤Î¥µ¥Ö¥»¥Ã¥È¤ËÂФ·¡¢¤½¤Î¸ÇÄê¼ÂÁõ¤òÄ󶡤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î½¸¹ç¤Î¤³¤È¤Ç¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¤Ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider\&.html¤Ë¤¢¤ë ++Java°Å¹æ²½¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥×¥í¥Ð¥¤¥À¤Î¼ÂÁõÊýË¡¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¥×¥í¥Ð¥¤¥À¤ò¼ÂÁõ¤·¡¢\fBKeystoreSpi\fR¥µ¥Ö¥¯¥é¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢\fIKeyStore\fR¥¯¥é¥¹¤¬Ä󶡤¹¤ë\fIgetInstance\fR¥Õ¥¡¥¯¥È¥ê¡¦¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢ÍÍ¡¹¤Ê¥×¥í¥Ð¥¤¥À¤«¤é°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÁªÂò¤Ç¤­¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Ï¡¢¥­¡¼¥¹¥È¥¢¾ðÊó¤Î³ÊǼ·Á¼°¤È¥Ç¡¼¥¿·Á¼°¤òÄêµÁ¤¹¤ë¤È¤È¤â¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÈó¸ø³«/ÈëÌ©¸°¤È¥­¡¼¥¹¥È¥¢¤ÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à¤òÄêµÁ¤·¤Þ¤¹¡£°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ë¤Ï¡¢¸ß´¹À­¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢\fBKeyStore\fR¥¯¥é¥¹¤¬Ä󶡤¹¤ë\fBgetInstance\fR¥Õ¥¡¥¯¥È¥ê¡¦¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢ÍÍ¡¹¤Ê¥×¥í¥Ð¥¤¥À¤«¤é°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÁªÂò¤Ç¤­¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Ï¡¢¥­¡¼¥¹¥È¥¢¾ðÊó¤Î³ÊǼ·Á¼°¤È¥Ç¡¼¥¿·Á¼°¤òÄêµÁ¤¹¤ë¤È¤È¤â¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÈó¸ø³«/ÈëÌ©¸°¤È¥­¡¼¥¹¥È¥¢¤ÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à¤òÄêµÁ¤·¤Þ¤¹¡£°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ë¤Ï¡¢¸ß´¹À­¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .sp +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¼ÂÁõ¤ÇÆ°ºî¤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¡¦¥é¥¤¥ó¤ÇÅϤµ¤ì¤¿¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò¥Õ¥¡¥¤¥ë̾¤È¤·¤Æ°·¤Ã¤Æ¡¢\fIFileInputStream\fR¤ËÊÑ´¹¤·¡¢¤³¤³¤«¤é¥­¡¼¥¹¥È¥¢¾ðÊó¤ò¥í¡¼¥É¤·¤Þ¤¹¡£\fIjarsigner\fR¤ª¤è¤Ó\fIpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢URL¤Ç»ØÄê¤Ç¤­¤ëǤ°Õ¤Î¾ì½ê¤«¤é¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¼ÂÁõ¤ÇÆ°ºî¤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤ÇÅϤµ¤ì¤¿¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò¥Õ¥¡¥¤¥ë̾¤È¤·¤Æ°·¤Ã¤Æ¡¢\fBFileInputStream\fR¤ËÊÑ´¹¤·¡¢¤³¤³¤«¤é¥­¡¼¥¹¥È¥¢¾ðÊó¤ò¥í¡¼¥É¤·¤Þ¤¹¡£\fBjarsigner\fR¤ª¤è¤Ó\fBpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢URL¤Ç»ØÄê¤Ç¤­¤ëǤ°Õ¤Î¾ì½ê¤«¤é¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-\fIkeytool\fR¤È\fIjarsigner\fR¤Î¾ì¹ç¡¢\fI\-storetype\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Policy Tool¤Î¾ì¹ç¤Ï¡¢¡Ö¥­¡¼¥¹¥È¥¢¡×¥á¥Ë¥å¡¼¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBkeytool\fR¤È\fBjarsigner\fR¤Î¾ì¹ç¡¢\fB\-storetype\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥Þ¥ó¥É¹Ô¤Ç¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Policy Tool¤Î¾ì¹ç¤Ï¡¢¡Ö¥­¡¼¥¹¥È¥¢¡×¥á¥Ë¥å¡¼¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp +-¥æ¡¼¥¶¡¼¤¬¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤵ¤ì¤¿\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ˴ð¤Å¤¤¤Æ¡¢¥Ä¡¼¥ë¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤¬ÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ï\fIjava\&.security\fR¤È¸Æ¤Ð¤ì¡¢Windows¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fIjava\&.home\elib\esecurity\fR¡¢Oracle Solaris¤Ç¤Ï\fIjava\&.home/lib/security\fR¤Ë¤¢¤ê¤Þ¤¹¡£\fIjava\&.home\fR¤Ï¡¢¼Â¹Ô»þ´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£\fIjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢SDK¤Þ¤¿¤ÏJava Runtime Environment (JRE)¤ÎºÇ¾å°Ì¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£ ++¥æ¡¼¥¶¡¼¤¬¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤵ¤ì¤¿\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ˴ð¤Å¤¤¤Æ¡¢¥Ä¡¼¥ë¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤¬ÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ï\fBjava\&.security\fR¤È¸Æ¤Ð¤ì¡¢Windows¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fBjava\&.home\elib\esecurity\fR¡¢Oracle Solaris¤Ç¤Ï\fBjava\&.home/lib/security\fR¤Ë¤¢¤ê¤Þ¤¹¡£\fBjava\&.home\fR¤Ï¡¢¼Â¹Ô»þ´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£\fBjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢SDK¤Þ¤¿¤ÏJava Runtime Environment (JRE)¤ÎºÇ¾å°Ì¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£ + .sp +-³Æ¥Ä¡¼¥ë¤Ï¡¢\fIkeystore\&.type\fR¤ÎÃͤò¼èÆÀ¤·¡¢¤³¤ÎÃͤǻØÄꤵ¤ì¤¿¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¡¢¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥Ð¥¤¥À¤òÄ´¤Ù¤Þ¤¹¡£¤½¤Î¥×¥í¥Ð¥¤¥À¤«¤é¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Þ¤¹¡£\fIKeyStore\fR¥¯¥é¥¹¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëstatic¥á¥½¥Ã¥É\fIgetDefaultType\fR¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¥¢¥×¥ì¥Ã¥È¤«¤é\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×(\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤Ç»ØÄꤵ¤ì¤¿¥¿¥¤¥×)¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ ++³Æ¥Ä¡¼¥ë¤Ï¡¢\fBkeystore\&.type\fR¤ÎÃͤò¼èÆÀ¤·¡¢¤³¤ÎÃͤǻØÄꤵ¤ì¤¿¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¡¢¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥Ð¥¤¥À¤òÄ´¤Ù¤Þ¤¹¡£¤½¤Î¥×¥í¥Ð¥¤¥À¤«¤é¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Þ¤¹¡£\fBKeyStore\fR¥¯¥é¥¹¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëstatic¥á¥½¥Ã¥É\fBgetDefaultType\fR¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¥¢¥×¥ì¥Ã¥È¤«¤é\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×(\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤Ç»ØÄꤵ¤ì¤¿¥¿¥¤¥×)¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-KeyStore keyStore = KeyStore\&.getInstance(KeyStore\&.getDefaultType()); ++\fBKeyStore keyStore = KeyStore\&.getInstance(KeyStore\&.getDefaultType());\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï\fIjks\fR¤Ç¡¢¤³¤ì¤ÏOracle¤¬Ä󶡤¹¤ëÆȼ«¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ç¤¹¡£¤³¤ì¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¼¡¤Î¹Ô¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï\fBjks\fR¤Ç¡¢¤³¤ì¤ÏOracle¤¬Ä󶡤¹¤ëÆȼ«¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ç¤¹¡£¤³¤ì¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¼¡¤Î¹Ô¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keystore\&.type=jks ++\fBkeystore\&.type=jks\fR ++ + .fi + .if n \{\ + .RE + .\} +-³Æ¥Ä¡¼¥ë¤Ç¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¾å¤Î¹Ô¤òÊѹ¹¤·¤ÆÊ̤Υ­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIpkcs12\fR¤È¸Æ¤Ð¤ì¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¡¦¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ë¾ì¹ç¡¢¹Ô¤ò¼¡¤Î¤è¤¦¤ËÊѹ¹¤·¤Þ¤¹¡£ ++³Æ¥Ä¡¼¥ë¤Ç¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¾å¤Î¹Ô¤òÊѹ¹¤·¤ÆÊ̤Υ­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBpkcs12\fR¤È¸Æ¤Ð¤ì¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¡¦¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ë¾ì¹ç¡¢¹Ô¤ò¼¡¤Î¤è¤¦¤ËÊѹ¹¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keystore\&.type=pkcs12 ++\fBkeystore\&.type=pkcs12\fR ++ + .fi + .if n \{\ + .RE +@@ -1242,9 +1262,9 @@ + .sp + ¸ø³«¸°°Å¹æ²½¤Ç¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¸ø³«¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Â絬ÌϤʥͥåȥ¥¯´Ä¶­¤Ç¤Ï¡¢¸ß¤¤¤ËÄÌ¿®¤·¤Æ¤¤¤ë¥¨¥ó¥Æ¥£¥Æ¥£´Ö¤Ç°ÊÁ°¤Î´Ø·¸¤¬°ú³¤­³ÎΩ¤µ¤ì¤Æ¤¤¤ë¤È²¾Äꤷ¤¿¤ê¡¢»ÈÍѤµ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¸ø³«¸°¤ò¼ý¤á¤¿¿®Íê¤Ç¤­¤ë¥ê¥Ý¥¸¥È¥ê¤¬Â¸ºß¤¹¤ë¤È²¾Äꤷ¤¿¤ê¤¹¤ë¤³¤È¤ÏÉÔ²Äǽ¤Ç¤¹¡£¤³¤Î¤è¤¦¤Ê¸ø³«¸°¤ÎÇÛÉۤ˴ؤ¹¤ëÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¾ÚÌÀ½ñ¤¬¹Í°Æ¤µ¤ì¤Þ¤·¤¿¡£¸½ºß¤Ç¤Ï¡¢¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤¬¿®Íê¤Ç¤­¤ëÂè»°¼Ô¤È¤·¤Æµ¡Ç½¤·¤Þ¤¹¡£CA¤Ï¡¢Â¾¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Î¾ÚÌÀ½ñ¤Ë½ð̾¤¹¤ë(ȯ¹Ô¤¹¤ë)¹Ô°Ù¤ò¡¢¿®Íꤷ¤ÆǤ¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥Æ¥£¥Æ¥£(´ë¶È¤Ê¤É)¤Ç¤¹¡£CA¤ÏˡΧ¾å¤Î·ÀÌó¤Ë¹´Â«¤µ¤ì¤ë¤Î¤Ç¡¢Í­¸ú¤«¤Ä¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¤ß¤òºîÀ®¤¹¤ë¤â¤Î¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£VeriSign¡¢Thawte¡¢Entrust¤ò¤Ï¤¸¤á¡¢Â¿¤¯¤Î¸øŪ¤Ê¾ÚÌÀ½ñȯ¹Ô¶É¤¬Â¸ºß¤·¤Þ¤¹¡£ + .sp +-Microsoft¤Îǧ¾Ú¥µ¡¼¥Ð¡¼¡¢Entrust¤ÎCAÀ½Éʤʤɤò½ê°ÁÈ¿¥Æâ¤ÇÍøÍѤ¹¤ì¤Ð¡¢Æȼ«¤Î¾ÚÌÀ½ñȯ¹Ô¶É¤ò±¿±Ä¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÚÌÀ½ñ¤Îɽ¼¨¡¢¥¤¥ó¥Ý¡¼¥È¤ª¤è¤Ó¥¨¥¯¥¹¥Ý¡¼¥È¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++Microsoft¤Îǧ¾Ú¥µ¡¼¥Ð¡¼¡¢Entrust¤ÎCAÀ½Éʤʤɤò½ê°ÁÈ¿¥Æâ¤ÇÍøÍѤ¹¤ì¤Ð¡¢Æȼ«¤Î¾ÚÌÀ½ñȯ¹Ô¶É¤ò±¿±Ä¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÚÌÀ½ñ¤Îɽ¼¨¡¢¥¤¥ó¥Ý¡¼¥È¤ª¤è¤Ó¥¨¥¯¥¹¥Ý¡¼¥È¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .sp +-¸½ºß¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤ÏX\&.509¾ÚÌÀ½ñ¤òÂоݤˤ·¤Æ¤¤¤Þ¤¹¡£ ++¸½ºß¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤ÏX\&.509¾ÚÌÀ½ñ¤òÂоݤˤ·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + X\&.509¾ÚÌÀ½ñ +@@ -1253,13 +1273,13 @@ + .sp + ¤¹¤Ù¤Æ¤ÎX\&.509¾ÚÌÀ½ñ¤Ï¡¢½ð̾¤Î¾¤Ë¼¡¤Î¥Ç¡¼¥¿¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£ + .sp +-\fB¥Ð¡¼¥¸¥ç¥ó\fR: ¾ÚÌÀ½ñ¤ËŬÍѤµ¤ì¤ëX\&.509µ¬³Ê¤Î¥Ð¡¼¥¸¥ç¥ó¤òÆÃÄꤷ¤Þ¤¹¡£¾ÚÌÀ½ñ¤Ë»ØÄê¤Ç¤­¤ë¾ðÊó¤Ï¡¢¥Ð¡¼¥¸¥ç¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£º£¤Î¤È¤³¤í¡¢3¤Ä¤Î¥Ð¡¼¥¸¥ç¥ó¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢v1¡¢v2¡¢v3¤Î¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤ª¤è¤Ó¥¨¥¯¥¹¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£v3¤Î¾ÚÌÀ½ñ¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fB¥Ð¡¼¥¸¥ç¥ó\fR: ¾ÚÌÀ½ñ¤ËŬÍѤµ¤ì¤ëX\&.509µ¬³Ê¤Î¥Ð¡¼¥¸¥ç¥ó¤òÆÃÄꤷ¤Þ¤¹¡£¾ÚÌÀ½ñ¤Ë»ØÄê¤Ç¤­¤ë¾ðÊó¤Ï¡¢¥Ð¡¼¥¸¥ç¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£º£¤Î¤È¤³¤í¡¢3¤Ä¤Î¥Ð¡¼¥¸¥ç¥ó¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢v1¡¢v2¡¢v3¤Î¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤ª¤è¤Ó¥¨¥¯¥¹¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£v3¤Î¾ÚÌÀ½ñ¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + X\&.509 Version 1¤Ï¡¢1988ǯ¤«¤éÍøÍѤµ¤ì¤Æ¹­¤¯ÉáµÚ¤·¤Æ¤ª¤ê¡¢ºÇ¤â°ìÈÌŪ¤Ç¤¹¡£ + .sp + X\&.509 Version 2¤Ç¤Ï¡¢Subject¤äȯ¹Ô¼Ô¤Î̾Á°¤ò¤¢¤È¤ÇºÆÍøÍѤǤ­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë¡¢Subject¤Èȯ¹Ô¼Ô¤Î°ì°Õ¼±Ê̻ҤγµÇ°¤¬Æ³Æþ¤µ¤ì¤Þ¤·¤¿¡£¤Û¤È¤ó¤É¤Î¾ÚÌÀ½ñ¥×¥í¥Õ¥¡¥¤¥ëʸ½ñ¤Ç¤Ï¡¢Ì¾Á°¤òºÆ»ÈÍѤ·¤Ê¤¤¤³¤È¤È¡¢¾ÚÌÀ½ñ¤Ç°ì°Õ¤Î¼±Ê̻Ҥò»ÈÍѤ·¤Ê¤¤¤³¤È¤¬¡¢¶¯¤¯¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Version 2¤Î¾ÚÌÀ½ñ¤Ï¡¢¹­¤¯¤Ï»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .sp +-X\&.509 Version 3¤ÏºÇ¤â¿·¤·¤¤(1996ǯ)µ¬³Ê¤Ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î³µÇ°¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ïï¤Ç¤âÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¾ÚÌÀ½ñ¤Ë´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°ìÈÌŪ¤Ê¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤È¤·¤Æ¤Ï¡¢KeyUsage(\fI½ð̾ÀìÍÑ\fR¤Ê¤É¡¢¸°¤Î»ÈÍѤòÆÃÄê¤ÎÌÜŪ¤ËÀ©¸Â¤¹¤ë)¡¢AlternativeNames(DNS̾¡¢ÅŻҥ᡼¥ë¡¦¥¢¥É¥ì¥¹¡¢IP¥¢¥É¥ì¥¹¤Ê¤É¡¢Â¾¤Î¥¢¥¤¥Ç¥ó¥Æ¥£¥Æ¥£¤ò¸ø³«¸°¤Ë´ØÏ¢ÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤ë)¤Ê¤É¤¬¤¢¤ê¤Þ¤¹¡£¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤Ï¡¢critical¤È¤¤¤¦¥Þ¡¼¥¯¤òÉÕ¤±¤Æ¡¢¤½¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î¥Á¥§¥Ã¥¯¤È»ÈÍѤòµÁ̳¤Å¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢critical¤È¥Þ¡¼¥¯¤µ¤ì¡¢\fIkeyCertSign\fR¤¬ÀßÄꤵ¤ì¤¿KeyUsage¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬¾ÚÌÀ½ñ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤³¤Î¾ÚÌÀ½ñ¤òSSLÄÌ¿®Ãæ¤ËÄ󼨤¹¤ë¤È¡¢¾ÚÌÀ½ñ¤¬µñÈݤµ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¾ÚÌÀ½ñ¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¡¢´ØÏ¢¤¹¤ëÈëÌ©¸°¤¬¾ÚÌÀ½ñ¤Î½ð̾ÀìÍѤȤ·¤Æ»ØÄꤵ¤ì¤Æ¤ª¤ê¡¢SSL¤Ç¤Ï»ÈÍѤǤ­¤Ê¤¤¤¿¤á¤Ç¤¹¡£ ++X\&.509 Version 3¤ÏºÇ¤â¿·¤·¤¤(1996ǯ)µ¬³Ê¤Ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î³µÇ°¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ïï¤Ç¤âÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¾ÚÌÀ½ñ¤Ë´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°ìÈÌŪ¤Ê¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤È¤·¤Æ¤Ï¡¢KeyUsage(\fB½ð̾ÀìÍÑ\fR¤Ê¤É¡¢¸°¤Î»ÈÍѤòÆÃÄê¤ÎÌÜŪ¤ËÀ©¸Â¤¹¤ë)¡¢AlternativeNames(DNS̾¡¢ÅŻҥ᡼¥ë¡¦¥¢¥É¥ì¥¹¡¢IP¥¢¥É¥ì¥¹¤Ê¤É¡¢Â¾¤Î¥¢¥¤¥Ç¥ó¥Æ¥£¥Æ¥£¤ò¸ø³«¸°¤Ë´ØÏ¢ÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤ë)¤Ê¤É¤¬¤¢¤ê¤Þ¤¹¡£¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤Ï¡¢critical¤È¤¤¤¦¥Þ¡¼¥¯¤òÉÕ¤±¤Æ¡¢¤½¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î¥Á¥§¥Ã¥¯¤È»ÈÍѤòµÁ̳¤Å¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢critical¤È¥Þ¡¼¥¯¤µ¤ì¡¢\fBkeyCertSign\fR¤¬ÀßÄꤵ¤ì¤¿KeyUsage¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬¾ÚÌÀ½ñ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤³¤Î¾ÚÌÀ½ñ¤òSSLÄÌ¿®Ãæ¤ËÄ󼨤¹¤ë¤È¡¢¾ÚÌÀ½ñ¤¬µñÈݤµ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¾ÚÌÀ½ñ¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¡¢´ØÏ¢¤¹¤ëÈëÌ©¸°¤¬¾ÚÌÀ½ñ¤Î½ð̾ÀìÍѤȤ·¤Æ»ØÄꤵ¤ì¤Æ¤ª¤ê¡¢SSL¤Ç¤Ï»ÈÍѤǤ­¤Ê¤¤¤¿¤á¤Ç¤¹¡£ + .sp + \fB¥·¥ê¥¢¥ëÈÖ¹æ\fR: ¾ÚÌÀ½ñ¤òºîÀ®¤·¤¿¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢¤½¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤¬È¯¹Ô¤¹¤ë¾¤Î¾ÚÌÀ½ñ¤È¶èÊ̤¹¤ë¤¿¤á¤Ë¡¢¾ÚÌÀ½ñ¤Ë¥·¥ê¥¢¥ëÈÖ¹æ¤ò³ä¤êÅö¤Æ¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ï¡¢ÍÍ¡¹¤ÊÊýË¡¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬¼è¤ê¾Ã¤µ¤ì¤ë¤È¡¢¥·¥ê¥¢¥ëÈֹ椬¾ÚÌÀ½ñ¼º¸ú¥ê¥¹¥È(CRL)¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .sp +@@ -1275,7 +1295,8 @@ + .RS 4 + .\} + .nf +-CN=Java Duke, OU=Java Software Division, O=Oracle Corporation, C=US ++\fBCN=Java Duke, OU=Java Software Division, O=Oracle Corporation, C=US\fR ++ + .fi + .if n \{\ + .RE +@@ -1287,51 +1308,52 @@ + .PP + ¾ÚÌÀ½ñ¥Á¥§¡¼¥ó + .RS 4 +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÈëÌ©¸°¤ª¤è¤Ó´ØÏ¢¤¹¤ë¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò´Þ¤à¥­¡¼¥¹¥È¥¢¤Î¸°¥¨¥ó¥È¥ê¤òºîÀ®¤·¡¢´ÉÍý¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥¨¥ó¥È¥ê¤Ç¤Ï¡¢ÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤Ï¡¢¥Á¥§¡¼¥ó¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÈëÌ©¸°¤ª¤è¤Ó´ØÏ¢¤¹¤ë¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò´Þ¤à¥­¡¼¥¹¥È¥¢¤Î¸°¥¨¥ó¥È¥ê¤òºîÀ®¤·¡¢´ÉÍý¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥¨¥ó¥È¥ê¤Ç¤Ï¡¢ÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤Ï¡¢¥Á¥§¡¼¥ó¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp +-¸°¤ò½é¤á¤ÆºîÀ®¤¹¤ë¤È¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤È¤¤¤¦1¤Ä¤ÎÍ×ÁǤΤߤò´Þ¤à¥Á¥§¡¼¥ó¤¬³«»Ï¤µ¤ì¤Þ¤¹¡£\fI¤Î\fR\-genkeypair¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ïȯ¹Ô¼Ô(½ð̾¼Ô)¤¬¼çÂΤÈƱ¤¸¤Ç¤¹¡£¼çÂΤϡ¢¤½¤Î¸ø³«¸°¤¬¾ÚÌÀ½ñ¤Ë¤è¤Ã¤Æǧ¾Ú¤µ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Ç¤¹¡£\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤·¤Æ¿·¤·¤¤¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤òºîÀ®¤¹¤ë¤È¡¢¸ø³«¸°¤Ï¾ï¤Ë¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤µ¤ì¤Þ¤¹¡£ ++¸°¤ò½é¤á¤ÆºîÀ®¤¹¤ë¤È¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤È¤¤¤¦1¤Ä¤ÎÍ×ÁǤΤߤò´Þ¤à¥Á¥§¡¼¥ó¤¬³«»Ï¤µ¤ì¤Þ¤¹¡£¥³¥Þ¥ó¥É¤Î\fB\-genkeypair\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ïȯ¹Ô¼Ô(½ð̾¼Ô)¤¬¼çÂΤÈƱ¤¸¤Ç¤¹¡£¼çÂΤϡ¢¤½¤Î¸ø³«¸°¤¬¾ÚÌÀ½ñ¤Ë¤è¤Ã¤Æǧ¾Ú¤µ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Ç¤¹¡£\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤·¤Æ¿·¤·¤¤¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤òºîÀ®¤¹¤ë¤È¡¢¸ø³«¸°¤Ï¾ï¤Ë¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤µ¤ì¤Þ¤¹¡£ + .sp +-¤³¤Î¸å¡¢¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È(CSR)¤¬\fI\-certreq\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¤Æ¡¢CSR¤¬¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤ËÁ÷¿®¤µ¤ì¤ë¤È¡¢CA¤«¤é¤Î¥ì¥¹¥Ý¥ó¥¹¤¬\fI\-importcert\fR¤Ç¥¤¥ó¥Ý¡¼¥È¤µ¤ì¡¢¸µ¤Î¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤è¤Ã¤ÆÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£¥³¥Þ¥ó¥É¤Î\fI\-certreq\fR¤ª¤è¤Ó\fI\-importcert\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¥Á¥§¡¼¥ó¤ÎºÇ¸å¤Ë¤¢¤ë¤Î¤Ï¡¢Subject¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿CA¤¬È¯¹Ô¤·¤¿¾ÚÌÀ½ñ(±þÅú)¤Ç¤¹¡£¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î¾ÚÌÀ½ñ¤Ï¡¢CA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ç¤¹¡£ ++¤³¤Î¸å¡¢¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È(CSR)¤¬\fB\-certreq\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¤Æ¡¢CSR¤¬¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤ËÁ÷¿®¤µ¤ì¤ë¤È¡¢CA¤«¤é¤Î¥ì¥¹¥Ý¥ó¥¹¤¬\fB\-importcert\fR¤Ç¥¤¥ó¥Ý¡¼¥È¤µ¤ì¡¢¸µ¤Î¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤è¤Ã¤ÆÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£\fB¤Î\fR\-certreq\fB¤ª¤è¤Ó\fR\-importcert¥³¥Þ¥ó¥É¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¥Á¥§¡¼¥ó¤ÎºÇ¸å¤Ë¤¢¤ë¤Î¤Ï¡¢Subject¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿CA¤¬È¯¹Ô¤·¤¿¾ÚÌÀ½ñ(±þÅú)¤Ç¤¹¡£¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î¾ÚÌÀ½ñ¤Ï¡¢CA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ç¤¹¡£ + .sp + CA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ï¡¢Â¿¤¯¤Î¾ì¹ç¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ(¤Ä¤Þ¤êCA¤¬¼«¿È¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿¾ÚÌÀ½ñ)¤Ç¤¢¤ê¡¢¤³¤ì¤Ï¥Á¥§¡¼¥ó¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤Ë¤Ê¤ê¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢CA¤¬¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òÊÖ¤¹¤³¤È¤â¤¢¤ê¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ¸å¤Î¾ÚÌÀ½ñ(CA¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¡¢¸°¥¨¥ó¥È¥ê¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ)¤ËÊѤï¤ê¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î¾ÚÌÀ½ñ¤Ï¡¢CSR¤ÎÁ÷¿®Àè¤ÎCA¤È¤ÏÊ̤ÎCA¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¡¢CSR¤ÎÁ÷¿®Àè¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ë¤Ê¤ê¤Þ¤¹¡£¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î¾ÚÌÀ½ñ¤Ï¡¢¼¡¤ÎCA¤Î¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ë¤Ê¤ê¤Þ¤¹¡£°Ê²¼Æ±Íͤˡ¢¼«¸Ê½ð̾¤µ¤ì¤¿¡Ö¥ë¡¼¥È¡×¾ÚÌÀ½ñ¤Ë㤹¤ë¤Þ¤Ç¥Á¥§¡¼¥ó¤¬Â³¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥Á¥§¡¼¥óÆâ¤Î(ºÇ½é¤Î¾ÚÌÀ½ñ°Ê¸å¤Î)³Æ¾ÚÌÀ½ñ¤Ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤Î¼¡¤Î¾ÚÌÀ½ñ¤Î½ð̾¼Ô¤Î¸ø³«¸°¤¬Ç§¾Ú¤µ¤ì¤Æ¤¤¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + ¿¤¯¤ÎCA¤Ï¡¢¥Á¥§¡¼¥ó¤ò¥µ¥Ý¡¼¥È¤»¤º¤Ëȯ¹ÔºÑ¤Î¾ÚÌÀ½ñ¤Î¤ß¤òÊÖ¤·¤Þ¤¹¡£Æäˡ¢Ãæ´Ö¤ÎCA¤¬Â¸ºß¤·¤Ê¤¤¥Õ¥é¥Ã¥È¤Ê³¬Áع½Â¤¤Î¾ì¹ç¤Ï¡¢¤½¤Î·¹¸þ¤¬¸²Ãø¤Ç¤¹¡£¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ï¡¢¥­¡¼¥¹¥È¥¢¤Ë¤¹¤Ç¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¾ðÊ󤫤顢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò³ÎΩ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-Ê̤αþÅú·Á¼°(PKCS#7¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë·Á¼°)¤Ç¤Ï¡¢È¯¹ÔºÑ¾ÚÌÀ½ñ¤Ë²Ã¤¨¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¥µ¥Ý¡¼¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤É¤Á¤é¤Î±þÅú·Á¼°¤â°·¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++Ê̤αþÅú·Á¼°(PKCS#7¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë·Á¼°)¤Ç¤Ï¡¢È¯¹ÔºÑ¾ÚÌÀ½ñ¤Ë²Ã¤¨¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¥µ¥Ý¡¼¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤É¤Á¤é¤Î±þÅú·Á¼°¤â°·¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-¥È¥Ã¥×¥ì¥Ù¥ë(¥ë¡¼¥È)CA¤Î¾ÚÌÀ½ñ¤Ï¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¤¹¡£¤¿¤À¤·¡¢¥ë¡¼¥È¤Î¸ø³«¸°¤Ø¤Î¿®Íê¤Ï¡¢¥ë¡¼¥È¾ÚÌÀ½ñ¼«ÂΤ«¤é¤Ç¤Ï¤Ê¤¯¡¢¿·Ê¹¤Ê¤É¾¤Î¥½¡¼¥¹¤«¤é¼èÆÀ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢VeriSign¥ë¡¼¥ÈCA¤Ê¤É¤Î¼±ÊÌ̾¤ò»ÈÍѤ·¤Æ¡¢Ã¯¤Ç¤â¼«¸Ê½ð̾·¿¾ÚÌÀ½ñ¤òÀ¸À®¤Ç¤­¤ë¤¿¤á¤Ç¤¹¡£¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤Ï¹­¤¯ÃΤé¤ì¤Æ¤¤¤Þ¤¹¡£¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤ò¾ÚÌÀ½ñ¤Ë³ÊǼ¤¹¤ëÍýͳ¤Ï¡¢¾ÚÌÀ½ñ¤È¤¤¤¦·Á¼°¤Ë¤¹¤ë¤³¤È¤Ç¿¤¯¤Î¥Ä¡¼¥ë¤«¤éÍøÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ë¤«¤é¤Ë¤¹¤®¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢¾ÚÌÀ½ñ¤Ï¡¢¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤ò±¿¤Ö¡ÖÇÞÂΡפȤ·¤ÆÍøÍѤµ¤ì¤ë¤Î¤ß¤Ç¤¹¡£¥ë¡¼¥ÈCA¤Î¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤ËÄɲ乤ë¤È¤­¤Ï¡¢\fI\-printcert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¤½¤ÎÁ°¤Ë¾ÚÌÀ½ñ¤ÎÆâÍƤòɽ¼¨¤·¡¢É½¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¿·Ê¹¤ä¥ë¡¼¥ÈCA¤ÎWeb¥Ú¡¼¥¸¤Ê¤É¤«¤éÆþ¼ê¤·¤¿´ûÃΤΥե£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥È¥Ã¥×¥ì¥Ù¥ë(¥ë¡¼¥È)CA¤Î¾ÚÌÀ½ñ¤Ï¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¤¹¡£¤¿¤À¤·¡¢¥ë¡¼¥È¤Î¸ø³«¸°¤Ø¤Î¿®Íê¤Ï¡¢¥ë¡¼¥È¾ÚÌÀ½ñ¼«ÂΤ«¤é¤Ç¤Ï¤Ê¤¯¡¢¿·Ê¹¤Ê¤É¾¤Î¥½¡¼¥¹¤«¤é¼èÆÀ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢VeriSign¥ë¡¼¥ÈCA¤Ê¤É¤Î¼±ÊÌ̾¤ò»ÈÍѤ·¤Æ¡¢Ã¯¤Ç¤â¼«¸Ê½ð̾·¿¾ÚÌÀ½ñ¤òÀ¸À®¤Ç¤­¤ë¤¿¤á¤Ç¤¹¡£¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤Ï¹­¤¯ÃΤé¤ì¤Æ¤¤¤Þ¤¹¡£¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤ò¾ÚÌÀ½ñ¤Ë³ÊǼ¤¹¤ëÍýͳ¤Ï¡¢¾ÚÌÀ½ñ¤È¤¤¤¦·Á¼°¤Ë¤¹¤ë¤³¤È¤Ç¿¤¯¤Î¥Ä¡¼¥ë¤«¤éÍøÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ë¤«¤é¤Ë¤¹¤®¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢¾ÚÌÀ½ñ¤Ï¡¢¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤ò±¿¤Ö¡ÖÇÞÂΡפȤ·¤ÆÍøÍѤµ¤ì¤ë¤Î¤ß¤Ç¤¹¡£¥ë¡¼¥ÈCA¤Î¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤ËÄɲ乤ë¤È¤­¤Ï¡¢\fB\-printcert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¤½¤ÎÁ°¤Ë¾ÚÌÀ½ñ¤ÎÆâÍƤòɽ¼¨¤·¡¢É½¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¿·Ê¹¤ä¥ë¡¼¥ÈCA¤ÎWeb¥Ú¡¼¥¸¤Ê¤É¤«¤éÆþ¼ê¤·¤¿´ûÃΤΥե£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + cacerts¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë + .RS 4 +-\fIcacerts\fR¤È¤¤¤¦Ì¾Á°¤Î¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë¤Ï¡¢Windows¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fIjava\&.home\elib\esecurity\fR¡¢Oracle Solaris¤Ç¤Ï\fIjava\&.home/lib/security\fR¤ËÃÖ¤«¤ì¤Æ¤¤¤Þ¤¹¡£\fIjava\&.home\fR¤Ï¡¢¼Â¹Ô´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê(SDK¤Î\fIjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤ÏJRE¤ÎºÇ¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê)¤Ç¤¹¡£ ++\fBcacerts\fR¤È¤¤¤¦Ì¾Á°¤Î¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë¤Ï¡¢Windows¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fBjava\&.home\elib\esecurity\fR¡¢Oracle Solaris¤Ç¤Ï\fBjava\&.home/lib/security\fR¤ËÃÖ¤«¤ì¤Æ¤¤¤Þ¤¹¡£\fBjava\&.home\fR¤Ï¡¢¼Â¹Ô´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê(SDK¤Î\fBjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤ÏJRE¤ÎºÇ¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê)¤Ç¤¹¡£ + .sp +-\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Ï¡¢CA¤Î¾ÚÌÀ½ñ¤ò´Þ¤à¡¢¥·¥¹¥Æ¥àÁ´ÂΤΥ­¡¼¥¹¥È¥¢¤Ç¤¹¡£¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¡¢¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ë\fIjks\fR¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤Î¹½À®¤È´ÉÍý¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥»¥Ã¥È¤ò´Þ¤ó¤À¾õÂ֤ǽв٤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¾ÚÌÀ½ñ¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Ï¡¢CA¤Î¾ÚÌÀ½ñ¤ò´Þ¤à¡¢¥·¥¹¥Æ¥àÁ´ÂΤΥ­¡¼¥¹¥È¥¢¤Ç¤¹¡£¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¡¢¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ë\fBjks\fR¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤Î¹½À®¤È´ÉÍý¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥»¥Ã¥È¤ò´Þ¤ó¤À¾õÂ֤ǽв٤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¾ÚÌÀ½ñ¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-list \-keystore java\&.home/lib/security/cacerts ++\fBkeytool \-list \-keystore java\&.home/lib/security/cacerts\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Î½é´ü¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢\fIchangeit\fR¤Ç¤¹¡£¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¡¢SDK¤Î¥¤¥ó¥¹¥È¡¼¥ë¸å¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¥ï¡¼¥É¤È¥Ç¥Õ¥©¥ë¥È¡¦¥¢¥¯¥»¥¹¸¢¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Î½é´ü¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢\fBchangeit\fR¤Ç¤¹¡£¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¡¢SDK¤Î¥¤¥ó¥¹¥È¡¼¥ë¸å¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¥ï¡¼¥É¤È¥Ç¥Õ¥©¥ë¥È¡¦¥¢¥¯¥»¥¹¸¢¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR +-\fIcacerts\fR¥Õ¥¡¥¤¥ë¤ò³Îǧ¤¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£\fIcacerts\fR¥Õ¥¡¥¤¥ëÆâ¤ÎCA¤Ï¡¢½ð̾¤ª¤è¤Ó¾¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ø¤Î¾ÚÌÀ½ñȯ¹Ô¤Î¤¿¤á¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤È¤·¤Æ¿®Íꤵ¤ì¤ë¤¿¤á¡¢\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Î´ÉÍý¤Ï¿µ½Å¤Ë¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¿®Íꤹ¤ëCA¤Î¾ÚÌÀ½ñ¤Î¤ß¤¬´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢¼«¿È¤ÎÀÕǤ¤Ë¤ª¤¤¤Æ¡¢\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤Æ¤¤¤ë¿®Íê¤Ç¤­¤ë¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò¸¡¾Ú¤·¡¢¿®ÍêÀ­¤Ë´Ø¤¹¤ëÆȼ«¤Î·èÄê¤ò¹Ô¤¤¤Þ¤¹¡£ ++\fBcacerts\fR¥Õ¥¡¥¤¥ë¤ò³Îǧ¤¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£\fBcacerts\fR¥Õ¥¡¥¤¥ëÆâ¤ÎCA¤Ï¡¢½ð̾¤ª¤è¤Ó¾¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ø¤Î¾ÚÌÀ½ñȯ¹Ô¤Î¤¿¤á¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤È¤·¤Æ¿®Íꤵ¤ì¤ë¤¿¤á¡¢\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Î´ÉÍý¤Ï¿µ½Å¤Ë¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¿®Íꤹ¤ëCA¤Î¾ÚÌÀ½ñ¤Î¤ß¤¬´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢¼«¿È¤ÎÀÕǤ¤Ë¤ª¤¤¤Æ¡¢\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤Æ¤¤¤ë¿®Íê¤Ç¤­¤ë¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò¸¡¾Ú¤·¡¢¿®ÍêÀ­¤Ë´Ø¤¹¤ëÆȼ«¤Î·èÄê¤ò¹Ô¤¤¤Þ¤¹¡£ + .sp +-¿®Íê¤Ç¤­¤Ê¤¤CA¾ÚÌÀ½ñ¤ò\fIcacerts\fR¥Õ¥¡¥¤¥ë¤«¤éºï½ü¤¹¤ë¤Ë¤Ï¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Î\fIdelete\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fIcacerts\fR¥Õ¥¡¥¤¥ë¤ÏJRE¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤òÊÔ½¸¤¹¤ë¥¢¥¯¥»¥¹¸¢¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à´ÉÍý¼Ô¤ËÏ¢Íí¤·¤Æ¤¯¤À¤µ¤¤ ++¿®Íê¤Ç¤­¤Ê¤¤CA¾ÚÌÀ½ñ¤ò\fBcacerts\fR¥Õ¥¡¥¤¥ë¤«¤éºï½ü¤¹¤ë¤Ë¤Ï¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Î\fBdelete\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fBcacerts\fR¥Õ¥¡¥¤¥ë¤ÏJRE¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤òÊÔ½¸¤¹¤ë¥¢¥¯¥»¥¹¸¢¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à´ÉÍý¼Ô¤ËÏ¢Íí¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + ¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê + .RS 4 + ¿¤¯¤Î¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½¤Ç¤Ï¤Ê¤¯¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë½ÐÎϲÄǽÉä¹æ²½Êý¼°¤ò»ÈÍѤ·¤Æ³ÊǼ¤µ¤ì¤Þ¤¹¡£Base 64Éä¹æ²½¤È¤â¸Æ¤Ð¤ì¤ë¤³¤Î¾ÚÌÀ½ñ·Á¼°¤Ç¤Ï¡¢ÅŻҥ᡼¥ë¤ä¤½¤Î¾¤Îµ¡¹½¤òÄ̤¸¤Æ¡¢Â¾¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¾ÚÌÀ½ñ¤òÍưפ˥¨¥¯¥¹¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£ + .sp +-\fI\-importcert\fR¤È\fI\-printcert\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤Î·Á¼°¤Î¾ÚÌÀ½ñ¤È¥Ð¥¤¥Ê¥êÉä¹æ²½¤Î¾ÚÌÀ½ñ¤òÆɤ߹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fI\-exportcert\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¥Ð¥¤¥Ê¥êÉä¹æ²½¤Î¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Î¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-importcert\fR¤È\fB\-printcert\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤Î·Á¼°¤Î¾ÚÌÀ½ñ¤È¥Ð¥¤¥Ê¥êÉä¹æ²½¤Î¾ÚÌÀ½ñ¤òÆɤ߹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fB\-exportcert\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¥Ð¥¤¥Ê¥êÉä¹æ²½¤Î¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Î¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp +-\fI\-list\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¾ÚÌÀ½ñ¤ÎSHA1¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-v\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï¿Í¤¬Íý²ò¤Ç¤­¤ë·Á¼°¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-list\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¾ÚÌÀ½ñ¤ÎSHA1¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-v\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï¿Í¤¬Íý²ò¤Ç¤­¤ë·Á¼°¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp + ½ÐÎϲÄǽÉä¹æ²½Êý¼°¤ÇÉä¹æ²½¤µ¤ì¤¿¾ÚÌÀ½ñ¤Ï¡¢¼¡¤Î¥Æ¥­¥¹¥È¤Ç»Ï¤Þ¤ê¡¢¼¡¤Î¥Æ¥­¥¹¥È¤Ç½ªÎ»¤·¤Þ¤¹¡£ + .sp +@@ -1339,11 +1361,12 @@ + .RS 4 + .\} + .nf +-\-\-\-\-\-BEGIN CERTIFICATE\-\-\-\-\- +- +-encoded certificate goes here\&. +- +-\-\-\-\-\-END CERTIFICATE\-\-\-\-\- ++\fB\-\-\-\-\-BEGIN CERTIFICATE\-\-\-\-\-\fR ++ ++\fBencoded certificate goes here\&. \fR ++ ++\fB\-\-\-\-\-END CERTIFICATE\-\-\-\-\-\fR ++ + .fi + .if n \{\ + .RE +@@ -1352,7 +1375,7 @@ + .PP + X\&.500¼±ÊÌ̾ + .RS 4 +-X\&.500¼±ÊÌ̾¤Ï¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤òÆÃÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢X\&.509¾ÚÌÀ½ñ¤Î\fIsubject\fR¥Õ¥£¡¼¥ë¥É¤È\fIissuer\fR(½ð̾¼Ô)¥Õ¥£¡¼¥ë¥É¤Ç»ØÄꤵ¤ì¤ë̾Á°¤Ï¡¢X\&.500¼±ÊÌ̾¤Ç¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥µ¥Ö¥Ñ¡¼¥È¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++X\&.500¼±ÊÌ̾¤Ï¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤òÆÃÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢X\&.509¾ÚÌÀ½ñ¤Î\fBsubject\fR¥Õ¥£¡¼¥ë¥É¤È\fBissuer\fR(½ð̾¼Ô)¥Õ¥£¡¼¥ë¥É¤Ç»ØÄꤵ¤ì¤ë̾Á°¤Ï¡¢X\&.500¼±ÊÌ̾¤Ç¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥µ¥Ö¥Ñ¡¼¥È¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + \fBcommonName\fR: Susan Jones¤Ê¤É¡¢¿Í¤ÎÄ̾Ρ£ + .sp +@@ -1364,13 +1387,14 @@ + .sp + \fBcountry\fR: 2ʸ»ú¤Î¹ñ¥³¡¼¥É¡£CH¤Ê¤É¡£ + .sp +-¼±ÊÌ̾ʸ»úÎó¤ò\fI\-dname\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤȤ·¤Æ»ØÄꤹ¤ë¾ì¹ç(¤¿¤È¤¨¤Ð\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤Ë)¡¢Ê¸»úÎó¤Ï¼¡¤Î·Á¼°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¼±ÊÌ̾ʸ»úÎó¤ò\fB\-dname\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤȤ·¤Æ»ØÄꤹ¤ë¾ì¹ç(¤¿¤È¤¨¤Ð\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤Ë)¡¢Ê¸»úÎó¤Ï¼¡¤Î·Á¼°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-CN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode ++\fBCN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode\fR ++ + .fi + .if n \{\ + .RE +@@ -1381,12 +1405,13 @@ + .RS 4 + .\} + .nf +-CN=commonName +-OU=organizationUnit +-O=organizationName +-L=localityName +-S=stateName +-C=country ++\fBCN=commonName\fR ++\fBOU=organizationUnit\fR ++\fBO=organizationName\fR ++\fBL=localityName\fR ++\fBS=stateName\fR ++\fBC=country\fR ++ + .fi + .if n \{\ + .RE +@@ -1397,7 +1422,8 @@ + .RS 4 + .\} + .nf +-CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino, S=California, C=US ++\fBCN=Mark Smith, OU=Java, O=Oracle, L=Cupertino, S=California, C=US\fR ++ + .fi + .if n \{\ + .RE +@@ -1408,8 +1434,9 @@ + .RS 4 + .\} + .nf +-keytool \-genkeypair \-dname "CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino, +-S=California, C=US" \-alias mark ++\fBkeytool \-genkeypair \-dname "CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino,\fR ++\fBS=California, C=US" \-alias mark\fR ++ + .fi + .if n \{\ + .RE +@@ -1422,66 +1449,73 @@ + .RS 4 + .\} + .nf +-CN=Steve Meier, OU=Java, O=Oracle, C=US ++\fBCN=Steve Meier, OU=Java, O=Oracle, C=US\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼±ÊÌ̾ʸ»úÎó¤ÎÃͤ˥«¥ó¥Þ¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Çʸ»úÎó¤ò»ØÄꤹ¤ë¤È¤­¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¥«¥ó¥Þ¤ò¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥åʸ»ú(\e)¤Ç¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¼±ÊÌ̾ʸ»úÎó¤ÎÃͤ˥«¥ó¥Þ¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¡¢¥³¥Þ¥ó¥É¹Ô¤Çʸ»úÎó¤ò»ØÄꤹ¤ë¤È¤­¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¥«¥ó¥Þ¤ò¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥åʸ»ú(\e)¤Ç¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-cn=Peter Schuster, ou=Java\e, Product Development, o=Oracle, c=US ++\fBcn=Peter Schuster, ou=Java\e, Product Development, o=Oracle, c=US\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼±ÊÌ̾ʸ»úÎó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¼±ÊÌ̾¤òɬÍפȤ¹¤ë¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¼±ÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢³Æ¥µ¥Ö¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¥«¥ó¥Þ¤ò¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\e)¤Ç¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ ++¼±ÊÌ̾ʸ»úÎó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¼±ÊÌ̾¤òɬÍפȤ¹¤ë¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥³¥Þ¥ó¥É¹Ô¤Ç¼±ÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢³Æ¥µ¥Ö¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¥«¥ó¥Þ¤ò¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\e)¤Ç¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ + .RE + .SH "·Ù¹ð" + .SS "¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È·Ù¹ð" + .PP + \fB½ÅÍ×\fR: ¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ëÁ°¤Ë¡¢¾ÚÌÀ½ñ¤ÎÆâÍƤò¿µ½Å¤ËÄ´¤Ù¤Æ¤¯¤À¤µ¤¤¡£ +-Windows¤ÎÎã:.PP +-¤Þ¤º¡¢\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fI\-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fI\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¾ÚÌÀ½ñ¤òɽ¼¨¤·¤Þ¤¹¡£É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬¡¢´üÂÔ¤µ¤ì¤ë¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬Á÷¤é¤ì¤Æ¤­¤Æ¡¢¤³¤Î¾ÚÌÀ½ñ¤ò\fI\etmp\ecert\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¤³¤Î¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fI\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ ++.PP ++Windows¤ÎÎã: ++.PP ++¤Þ¤º¡¢\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fB\-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fB\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¾ÚÌÀ½ñ¤òɽ¼¨¤·¤Þ¤¹¡£É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬¡¢´üÂÔ¤µ¤ì¤ë¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬Á÷¤é¤ì¤Æ¤­¤Æ¡¢¤³¤Î¾ÚÌÀ½ñ¤ò\fB\etmp\ecert\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¤³¤Î¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fB\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- keytool \-printcert \-file \etmp\ecert +- Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll +- Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll +- Serial Number: 59092b34 +- Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997 +- Certificate Fingerprints: +- MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F +- SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE +- SHA256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90: +- 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4 ++\fB keytool \-printcert \-file \etmp\ecert\fR ++\fB Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll\fR ++\fB Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll\fR ++\fB Serial Number: 59092b34\fR ++\fB Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997\fR ++\fB Certificate Fingerprints:\fR ++\fB MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F\fR ++\fB SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE\fR ++\fB SHA256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90:\fR ++\fB 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4\fR + .fi + .if n \{\ + .RE + .\} +-Oracle Solaris¤ÎÎã:.PP +-¤Þ¤º¡¢\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fI\-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fI\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¾ÚÌÀ½ñ¤òɽ¼¨¤·¤Þ¤¹¡£É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬¡¢´üÂÔ¤µ¤ì¤ë¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤¢¤ë¥æ¡¼¥¶¡¼¤«¤é¾ÚÌÀ½ñ¤¬Á÷¤é¤ì¤Æ¤­¤Æ¡¢¤³¤Î¾ÚÌÀ½ñ¤ò\fI/tmp/cert\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¤³¤Î¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fI\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ ++.PP ++Oracle Solaris¤ÎÎã: ++.PP ++¤Þ¤º¡¢\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fB\-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fB\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¾ÚÌÀ½ñ¤òɽ¼¨¤·¤Þ¤¹¡£É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬¡¢´üÂÔ¤µ¤ì¤ë¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤¢¤ë¥æ¡¼¥¶¡¼¤«¤é¾ÚÌÀ½ñ¤¬Á÷¤é¤ì¤Æ¤­¤Æ¡¢¤³¤Î¾ÚÌÀ½ñ¤ò\fB/tmp/cert\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¤³¤Î¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fB\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- keytool \-printcert \-file /tmp/cert +- Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll +- Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll +- Serial Number: 59092b34 +- Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997 +- Certificate Fingerprints: +- MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F +- SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE +- SHA256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90: +- 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4 ++\fB keytool \-printcert \-file /tmp/cert\fR ++\fB Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll\fR ++\fB Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll\fR ++\fB Serial Number: 59092b34\fR ++\fB Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997\fR ++\fB Certificate Fingerprints:\fR ++\fB MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F\fR ++\fB SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE\fR ++\fB SHA256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90:\fR ++\fB 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4\fR ++ + .fi + .if n \{\ + .RE +@@ -1490,27 +1524,27 @@ + ¼¡¤Ë¡¢¾ÚÌÀ½ñ¤òÁ÷¿®¤·¤¿¿Íʪ¤ËÏ¢Íí¤·¡¢¤³¤Î¿Íʪ¤¬Ä󼨤·¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¾å¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬°ìÃפ¹¤ì¤Ð¡¢Á÷¿®ÅÓÃæ¤Ç¾¤Î²¿¼Ô¤«(¹¶·â¼Ô¤Ê¤É)¤Ë¤è¤ë¾ÚÌÀ½ñ¤Î¤¹¤êÂؤ¨¤¬¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£Á÷¿®ÅÓÃæ¤Ç¤³¤Î¼ï¤Î¹¶·â¤¬¹Ô¤ï¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥Á¥§¥Ã¥¯¤ò¹Ô¤ï¤º¤Ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¡¢¹¶·â¼Ô¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¤â¤Î(¹¶·âŪ°Õ¿Þ¤ò»ý¤Ä¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤ó¤ÀJAR¥Õ¥¡¥¤¥ë¤Ê¤É)¤ò¿®Íꤹ¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ëÁ°¤Ë\fI\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¥­¡¼¥¹¥È¥¢Æâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fI\-importcert\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¾ÚÌÀ½ñ¤Î¾ðÊó¤¬É½¼¨¤µ¤ì¡¢³Îǧ¤òµá¤á¤ë¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤ë¤¿¤á¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤Ï¥¤¥ó¥Ý¡¼¥ÈÁàºî¤òÄä»ß¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤ì¤ò¼Â¹Ô¤Ç¤­¤ë¤Î¤Ï¡¢\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fI\-importcert\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤È¤ÎÂÐÏäϹԤï¤ì¤Þ¤»¤ó¡£ ++¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ëÁ°¤Ë\fB\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¥­¡¼¥¹¥È¥¢Æâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fB\-importcert\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¾ÚÌÀ½ñ¤Î¾ðÊó¤¬É½¼¨¤µ¤ì¡¢³Îǧ¤òµá¤á¤ë¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤ë¤¿¤á¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤Ï¥¤¥ó¥Ý¡¼¥ÈÁàºî¤òÄä»ß¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤ì¤ò¼Â¹Ô¤Ç¤­¤ë¤Î¤Ï¡¢\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fB\-importcert\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤È¤ÎÂÐÏäϹԤï¤ì¤Þ¤»¤ó¡£ + .SS "¥Ñ¥¹¥ï¡¼¥É·Ù¹ð" + .PP +-¥­¡¼¥¹¥È¥¢¤ËÂФ¹¤ëÁàºî¤ò¹Ô¤¦¤Û¤È¤ó¤É¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹¡£¤Þ¤¿¡¢°ìÉô¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Èó¸ø³«/ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬Íפˤʤ뤳¤È¤¬¤¢¤ê¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤Ï¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄê¤Ç¤­¤Þ¤¹(\fI\-storepass\fR¥ª¥×¥·¥ç¥ó¤È\fI\-keypass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍÑ)¡£¤¿¤À¤·¡¢¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¡¢¤Þ¤¿¤Ï°ÂÁ´¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¥·¥¹¥Æ¥à¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£É¬Íפʥѥ¹¥ï¡¼¥É¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤ËÂФ¹¤ëÁàºî¤ò¹Ô¤¦¤Û¤È¤ó¤É¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹¡£¤Þ¤¿¡¢°ìÉô¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Èó¸ø³«/ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬Íפˤʤ뤳¤È¤¬¤¢¤ê¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤Ï¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄê¤Ç¤­¤Þ¤¹(\fB\-storepass\fR¥ª¥×¥·¥ç¥ó¤È\fB\-keypass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍÑ)¡£¤¿¤À¤·¡¢¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¡¢¤Þ¤¿¤Ï°ÂÁ´¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¥·¥¹¥Æ¥à¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£É¬Íפʥѥ¹¥ï¡¼¥É¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .SS "¾ÚÌÀ½ñ¤Î½àµò¤Ë´Ø¤¹¤ë·Ù¹ð" + .PP + ¥¤¥ó¥¿¡¼¥Í¥Ã¥Èɸ½àRFC 5280¤Ç¤Ï¡¢X\&.509¾ÚÌÀ½ñ¤Î½àµò¤Ë´Ø¤¹¤ë¥×¥í¥Õ¥¡¥¤¥ë¤¬ÄêµÁ¤µ¤ì¤Æ¤ª¤ê¡¢¾ÚÌÀ½ñ¤Î¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ËÍ­¸ú¤ÊÃͤª¤è¤ÓÃͤÎÁȹ礻¤¬µ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£É¸½à¤Ë¤Ä¤¤¤Æ¤Ï¡¢ + http://tools\&.ietf\&.org/rfc/rfc5280\&.txt¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤ì¤é¤Î¥ë¡¼¥ë¤¹¤Ù¤Æ¤¬Å¬ÍѤµ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢É¸½à¤Ë½àµò¤·¤Ê¤¤¾ÚÌÀ½ñ¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£É¸½à¤Ë½àµò¤·¤Ê¤¤¾ÚÌÀ½ñ¤Ï¡¢JRE¤ä¾¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÇµñÈݤµ¤ì¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢\fI\-dname\fR¤ä\fI\-ext\fR¤Ê¤É¤ÇŬÀµ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤ì¤é¤Î¥ë¡¼¥ë¤¹¤Ù¤Æ¤¬Å¬ÍѤµ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢É¸½à¤Ë½àµò¤·¤Ê¤¤¾ÚÌÀ½ñ¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£É¸½à¤Ë½àµò¤·¤Ê¤¤¾ÚÌÀ½ñ¤Ï¡¢JRE¤ä¾¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÇµñÈݤµ¤ì¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢\fB\-dname\fR¤ä\fB\-ext\fR¤Ê¤É¤ÇŬÀµ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "Ãí°Õ" + .SS "¿·¤·¤¤¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È" + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤Ë¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤Ë¤¹¤Ç¤Ë¸ºß¤¹¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤«¤é(¥ë¡¼¥ÈCA¤Î)¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¤Î¥Á¥§¡¼¥ó¤Î¹½ÃÛ¤ò»î¤ß¤Þ¤¹¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤Ë¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤Ë¤¹¤Ç¤Ë¸ºß¤¹¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤«¤é(¥ë¡¼¥ÈCA¤Î)¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¤Î¥Á¥§¡¼¥ó¤Î¹½ÃÛ¤ò»î¤ß¤Þ¤¹¡£ + .PP +-\fI\-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢ÄɲäξÚÌÀ½ñ¤Ï¿®Íê¤Ç¤­¤ë¤¹¤Ê¤ï¤Á\fIcacerts\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤ë¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ ++\fB\-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢ÄɲäξÚÌÀ½ñ¤Ï¿®Íê¤Ç¤­¤ë¤¹¤Ê¤ï¤Á\fBcacerts\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤ë¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤¬¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤«¤é¼«¸Ê½ð̾¾ÚÌÀ½ñ(¥­¡¼¥¹¥È¥¢¤Þ¤¿¤Ï\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¼«¸Ê½ð̾¾ÚÌÀ½ñ)¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¤Î¥Ñ¥¹¤Î¹½Ãۤ˼ºÇÔ¤·¤¿¾ì¹ç¤Ï¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤Î¾ðÊó¤òɽ¼¨¤·¡¢¥æ¡¼¥¶¡¼¤Ë³Îǧ¤òµá¤á¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢Â¾¤Î¤Ê¤ó¤é¤«¤Î(¿®Íê¤Ç¤­¤ë)¾ðÊó¸»(¾ÚÌÀ½ñ¤Î½êÍ­¼Ô¤Ê¤É)¤«¤éÆþ¼ê¤·¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò¿µ½Å¤Ë³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¥¤¥ó¥Ý¡¼¥ÈÁàºî¤Ï¡¢¾ÚÌÀ½ñ¤ò³Îǧ¤¹¤ë»þÅÀ¤ÇÃæ»ß¤Ç¤­¤Þ¤¹¡£\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤È¤ÎÂÐÏäϹԤï¤ì¤Þ¤»¤ó¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤¬¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤«¤é¼«¸Ê½ð̾¾ÚÌÀ½ñ(¥­¡¼¥¹¥È¥¢¤Þ¤¿¤Ï\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¼«¸Ê½ð̾¾ÚÌÀ½ñ)¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¤Î¥Ñ¥¹¤Î¹½Ãۤ˼ºÇÔ¤·¤¿¾ì¹ç¤Ï¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤Î¾ðÊó¤òɽ¼¨¤·¡¢¥æ¡¼¥¶¡¼¤Ë³Îǧ¤òµá¤á¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢Â¾¤Î¤Ê¤ó¤é¤«¤Î(¿®Íê¤Ç¤­¤ë)¾ðÊó¸»(¾ÚÌÀ½ñ¤Î½êÍ­¼Ô¤Ê¤É)¤«¤éÆþ¼ê¤·¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò¿µ½Å¤Ë³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¥¤¥ó¥Ý¡¼¥ÈÁàºî¤Ï¡¢¾ÚÌÀ½ñ¤ò³Îǧ¤¹¤ë»þÅÀ¤ÇÃæ»ß¤Ç¤­¤Þ¤¹¡£\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤È¤ÎÂÐÏäϹԤï¤ì¤Þ¤»¤ó¡£ + .SS "¾ÚÌÀ½ñ±þÅú¤Î¥¤¥ó¥Ý¡¼¥È" + .PP +-¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¡¢¤ª¤è¤Ó(\fI\-trustcacert\fR\fIs\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï)\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ç¹½À®¤µ¤ì¤¿¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ±þÅú¤¬¸¡ºº¤µ¤ì¤Þ¤¹¡£cacerts¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¡¢¤ª¤è¤Ó(\fB\-trustcacert\fR\fBs\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï)\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ç¹½À®¤µ¤ì¤¿¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ±þÅú¤¬¸¡ºº¤µ¤ì¤Þ¤¹¡£cacerts¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP + ¾ÚÌÀ½ñ±þÅú¤¬¿®Íê¤Ç¤­¤ë¤«¤É¤¦¤«¤ò·èÄꤹ¤ëÊýË¡¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp +@@ -1522,7 +1556,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¾ÚÌÀ½ñ±þÅú¤¬Ã±°ì¤ÎX\&.509¾ÚÌÀ½ñ¤Ç¤¢¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¾ÚÌÀ½ñ±þÅú¤«¤é(¥ë¡¼¥ÈCA¤Î)¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¥Á¥§¡¼¥ó¤Î³ÎΩ¤ò»î¤ß¤Þ¤¹¡£¾ÚÌÀ½ñ±þÅú¤È¡¢¾ÚÌÀ½ñ±þÅú¤Îǧ¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤Î³¬Áع½Â¤¤Ï¡¢alias¤Î¿·¤·¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò·ÁÀ®¤·¤Þ¤¹¡£¿®Íê¥Á¥§¡¼¥ó¤¬³ÎΩ¤µ¤ì¤Ê¤¤¾ì¹ç¡¢¾ÚÌÀ½ñ±þÅú¤Ï¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¾ÚÌÀ½ñ¤ò½ÐÎϤ»¤º¡¢¥æ¡¼¥¶¡¼¤Ë¸¡¾Ú¤òµá¤á¤ë¥×¥í¥ó¥×¥È¤òɽ¼¨¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤¬¾ÚÌÀ½ñ±þÅú¤Î¿®ÍêÀ­¤òȽÃǤ¹¤ë¤Î¤ÏÈó¾ï¤ËÆñ¤·¤¤¤¿¤á¤Ç¤¹¡£ ++¾ÚÌÀ½ñ±þÅú¤¬Ã±°ì¤ÎX\&.509¾ÚÌÀ½ñ¤Ç¤¢¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¾ÚÌÀ½ñ±þÅú¤«¤é(¥ë¡¼¥ÈCA¤Î)¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¥Á¥§¡¼¥ó¤Î³ÎΩ¤ò»î¤ß¤Þ¤¹¡£¾ÚÌÀ½ñ±þÅú¤È¡¢¾ÚÌÀ½ñ±þÅú¤Îǧ¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤Î³¬Áع½Â¤¤Ï¡¢alias¤Î¿·¤·¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò·ÁÀ®¤·¤Þ¤¹¡£¿®Íê¥Á¥§¡¼¥ó¤¬³ÎΩ¤µ¤ì¤Ê¤¤¾ì¹ç¡¢¾ÚÌÀ½ñ±þÅú¤Ï¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¾ÚÌÀ½ñ¤ò½ÐÎϤ»¤º¡¢¥æ¡¼¥¶¡¼¤Ë¸¡¾Ú¤òµá¤á¤ë¥×¥í¥ó¥×¥È¤òɽ¼¨¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤¬¾ÚÌÀ½ñ±þÅú¤Î¿®ÍêÀ­¤òȽÃǤ¹¤ë¤Î¤ÏÈó¾ï¤ËÆñ¤·¤¤¤¿¤á¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -1533,12 +1567,12 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¾ÚÌÀ½ñ±þÅú¤¬PKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Þ¤¿¤Ï°ìÏ¢¤ÎX\&.509¾ÚÌÀ½ñ¤Ç¤¢¤ë¾ì¹ç¡¢¥Á¥§¡¼¥ó¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¾ÚÌÀ½ñ¤¬ºÇ½é¤Ë¡¢0°Ê¾å¤ÎCA¾ÚÌÀ½ñ¤¬¤½¤Î¼¡¤Ë¤¯¤ë¤è¤¦¤Ëʤ٤é¤ì¤Þ¤¹¡£¥Á¥§¡¼¥ó¤¬¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Ç½ª¤ï¤ê¡¢\fI \-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¾ÚÌÀ½ñ¤È¡¢¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¿®Íê¤Ç¤­¤ë¤¹¤Ù¤Æ¤Î¾ÚÌÀ½ñ¤ò¾È¹ç¤·¤è¤¦¤È¤·¤Þ¤¹¡£¥Á¥§¡¼¥ó¤¬¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Ç½ª¤ï¤Ã¤Æ¤ª¤é¤º¡¢\fI\-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤«¤é¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò¸«¤Ä¤±¤Æ¤½¤ì¤ò¥Á¥§¡¼¥ó¤ÎËöÈø¤ËÄɲ䷤褦¤È¤·¤Þ¤¹¡£¤½¤Î¾ÚÌÀ½ñ¤¬¸«¤Ä¤«¤é¤º¡¢\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ¸å¤Î¾ÚÌÀ½ñ¤Î¾ðÊ󤬽ÐÎϤµ¤ì¡¢¥æ¡¼¥¶¡¼¤Ï³Îǧ¤òµá¤á¤é¤ì¤Þ¤¹¡£ ++¾ÚÌÀ½ñ±þÅú¤¬PKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Þ¤¿¤Ï°ìÏ¢¤ÎX\&.509¾ÚÌÀ½ñ¤Ç¤¢¤ë¾ì¹ç¡¢¥Á¥§¡¼¥ó¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¾ÚÌÀ½ñ¤¬ºÇ½é¤Ë¡¢0°Ê¾å¤ÎCA¾ÚÌÀ½ñ¤¬¤½¤Î¼¡¤Ë¤¯¤ë¤è¤¦¤Ëʤ٤é¤ì¤Þ¤¹¡£¥Á¥§¡¼¥ó¤¬¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Ç½ª¤ï¤ê¡¢\fB \-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¾ÚÌÀ½ñ¤È¡¢¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¿®Íê¤Ç¤­¤ë¤¹¤Ù¤Æ¤Î¾ÚÌÀ½ñ¤ò¾È¹ç¤·¤è¤¦¤È¤·¤Þ¤¹¡£¥Á¥§¡¼¥ó¤¬¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Ç½ª¤ï¤Ã¤Æ¤ª¤é¤º¡¢\fB\-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤«¤é¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò¸«¤Ä¤±¤Æ¤½¤ì¤ò¥Á¥§¡¼¥ó¤ÎËöÈø¤ËÄɲ䷤褦¤È¤·¤Þ¤¹¡£¤½¤Î¾ÚÌÀ½ñ¤¬¸«¤Ä¤«¤é¤º¡¢\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ¸å¤Î¾ÚÌÀ½ñ¤Î¾ðÊ󤬽ÐÎϤµ¤ì¡¢¥æ¡¼¥¶¡¼¤Ï³Îǧ¤òµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP +-¾ÚÌÀ½ñ±þÅúÆâ¤Î¸ø³«¸°¤¬\fIalias\fR¤Ç¤¹¤Ç¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¥æ¡¼¥¶¡¼¤Î¸ø³«¸°¤Ë°ìÃפ·¤¿¾ì¹ç¡¢¸Å¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬±þÅúÆâ¤Î¿·¤·¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£°ÊÁ°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÍ­¸ú¤Ê\fIkeypass\fR¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ï¡¢¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤òÊݸ¤ë¤¿¤á¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¾ÚÌÀ½ñ±þÅúÆâ¤Î¸ø³«¸°¤¬\fBalias\fR¤Ç¤¹¤Ç¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¥æ¡¼¥¶¡¼¤Î¸ø³«¸°¤Ë°ìÃפ·¤¿¾ì¹ç¡¢¸Å¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬±þÅúÆâ¤Î¿·¤·¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£°ÊÁ°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÍ­¸ú¤Ê\fBkeypass\fR¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ï¡¢¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤òÊݸ¤ë¤¿¤á¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .PP +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fI\-import\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fI\-importcert\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fB\-import\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fB\-importcert\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/linux/doc/man/ja/native2ascii.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/native2ascii.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: native2ascii +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¹ñºÝ²½¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: native2ascii ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¹ñºÝ²½¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "native2ascii" "1" "2013ǯ11·î21Æü" "JDK 8" "¹ñºÝ²½¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + native2ascii \- ¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ëǤ°Õ¤Îʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Îʸ»ú¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤ò¡¢ASCII¤ª¤è¤ÓUnicode¤Ç¥¨¥¹¥±¡¼¥×¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Æ(¤Þ¤¿¤Ï¤½¤ÎµÕ)¡¢¥í¡¼¥«¥é¥¤¥º²Äǽ¤Ê¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òºîÀ®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fInative2ascii\fR [ \fIinputfile\fR ] [ \fIoutputfile\fR ] ++\fBnative2ascii\fR [ \fIinputfile\fR ] [ \fIoutputfile\fR ] + .fi + .if n \{\ + .RE +@@ -73,9 +75,9 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fInative2ascii\fR¥³¥Þ¥ó¥É¤Ï¡¢ASCII¥­¥ã¥é¥¯¥¿¡¦¥»¥Ã¥È¤Ë´Þ¤Þ¤ì¤Ê¤¤¤¹¤Ù¤Æ¤Îʸ»ú¤ËUnicode¥¨¥¹¥±¡¼¥×(\fI\eu\fR\fIxxxx\fR)ɽµ­Ë¡¤ò»ÈÍѤ·¤Æ¡¢Java Runtime Environment (JRE)¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢ASCII¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Þ¤¹¡£¤³¤Î¥×¥í¥»¥¹¤Ï¡¢ISO\-8859\-1ʸ»ú¥»¥Ã¥È¤Ë´Þ¤Þ¤ì¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤ÇɬÍפǤ¹¡£¤³¤Î¥Ä¡¼¥ë¤Ï¡¢¤½¤ÎµÕ¤ÎÊÑ´¹¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++\fBnative2ascii\fR¥³¥Þ¥ó¥É¤Ï¡¢ASCIIʸ»ú¥»¥Ã¥È¤Ë´Þ¤Þ¤ì¤Ê¤¤¤¹¤Ù¤Æ¤Îʸ»ú¤ËUnicode¥¨¥¹¥±¡¼¥×(\fB\eu\fR\fIxxxx\fR)ɽµ­Ë¡¤ò»ÈÍѤ·¤Æ¡¢Java Runtime Environment (JRE)¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢ASCII¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Þ¤¹¡£¤³¤Î¥×¥í¥»¥¹¤Ï¡¢ISO\-8859\-1ʸ»ú¥»¥Ã¥È¤Ë´Þ¤Þ¤ì¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤ÇɬÍפǤ¹¡£¤³¤Î¥Ä¡¼¥ë¤Ï¡¢¤½¤ÎµÕ¤ÎÊÑ´¹¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIoutputfile\fRÃͤò¾Êά¤·¤¿¾ì¹ç¡¢É¸½à½ÐÎϤ˽ÐÎϤµ¤ì¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fIinputfile\fRÃͤò¾Êά¤·¤¿¾ì¹ç¡¢É¸½àÆþÎϤ«¤éÆþÎϤµ¤ì¤Þ¤¹¡£ ++\fBoutputfile\fRÃͤò¾Êά¤·¤¿¾ì¹ç¡¢É¸½à½ÐÎϤ˽ÐÎϤµ¤ì¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fBinputfile\fRÃͤò¾Êά¤·¤¿¾ì¹ç¡¢É¸½àÆþÎϤ«¤éÆþÎϤµ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-reverse +@@ -85,13 +87,13 @@ + .PP + \-encoding \fIencoding_name\fR + .RS 4 +-ÊÑ´¹½èÍý¤Ç»ÈÍѤ¹¤ëʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°(\fIjava\&.nio\&.charset\&.Charset\&.defaultCharset\fR¥á¥½¥Ã¥É¤ÇÄêµÁ¤µ¤ì¤¿)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fIencoding_name\fRʸ»úÎó¤Ï¡¢JRE¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ëʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/intl/encoding\&.doc\&.html¤Ë¤¢¤ë ++ÊÑ´¹½èÍý¤Ç»ÈÍѤ¹¤ëʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°(\fBjava\&.nio\&.charset\&.Charset\&.defaultCharset\fR¥á¥½¥Ã¥É¤ÇÄêµÁ¤µ¤ì¤¿)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fBencoding_name\fRʸ»úÎó¤Ï¡¢JRE¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ëʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/intl/encoding\&.doc\&.html¤Ë¤¢¤ë + ¡Ö¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine (JVM)¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .br + 'pl 8.5i +--- ./jdk/src/linux/doc/man/ja/orbd.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/orbd.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: orbd +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: orbd ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "orbd" "1" "2013ǯ11·î21Æü" "JDK 8" "Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + orbd \- CORBA´Ä¶­¤Î¥µ¡¼¥Ð¡¼¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¯¥é¥¤¥¢¥ó¥È¤«¤é¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤»¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIorbd\fR [ \fIoptions\fR ] ++\fBorbd\fR [ \fIoptions\fR ] + .fi + .if n \{\ + .RE +@@ -64,11 +66,11 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIorbd\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢CORBA´Ä¶­¤Î¥µ¡¼¥Ð¡¼¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¯¥é¥¤¥¢¥ó¥È¤«¤éÆ©²áŪ¤Ë¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£orbd¥Ä¡¼¥ë¤Ë´Þ¤Þ¤ì¤ë¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¤¥¢¥ó¥È¤ÏCORBA´Ä¶­¤Ç¥µ¡¼¥Ð¡¼¾å¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤òÆ©²áŪ¤Ë¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£±Ê³¥µ¡¼¥Ð¡¼¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤òȯ¹Ô¤¹¤ëºÝ¡¢¥µ¡¼¥Ð¡¼¤Î¥Ý¡¼¥ÈÈÖ¹æ¤Î¤«¤ï¤ê¤ËORBD¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ë´Þ¤á¤Þ¤¹¡£±Ê³¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ËORBD¥Ý¡¼¥ÈÈÖ¹æ¤ò´Þ¤á¤ë¤³¤È¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÍøÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBorbd\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢CORBA´Ä¶­¤Î¥µ¡¼¥Ð¡¼¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¯¥é¥¤¥¢¥ó¥È¤«¤éÆ©²áŪ¤Ë¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£orbd¥Ä¡¼¥ë¤Ë´Þ¤Þ¤ì¤ë¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¤¥¢¥ó¥È¤ÏCORBA´Ä¶­¤Ç¥µ¡¼¥Ð¡¼¾å¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤òÆ©²áŪ¤Ë¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£±Ê³¥µ¡¼¥Ð¡¼¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤òȯ¹Ô¤¹¤ëºÝ¡¢¥µ¡¼¥Ð¡¼¤Î¥Ý¡¼¥ÈÈÖ¹æ¤Î¤«¤ï¤ê¤ËORBD¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ë´Þ¤á¤Þ¤¹¡£±Ê³¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ËORBD¥Ý¡¼¥ÈÈÖ¹æ¤ò´Þ¤á¤ë¤³¤È¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÍøÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -92,14 +94,14 @@ + ¥¯¥é¥¤¥¢¥ó¥È¤Ï°ìÅ٤Τߥ͡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò¥ë¥Ã¥¯¥¢¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤Î¸å¤Ï¥µ¡¼¥Ð¡¼¤Î¥é¥¤¥Õ¡¦¥µ¥¤¥¯¥ë¤Ë¤è¤ëÊѹ¹¤È¤Ï̵´Ø·¸¤Ë¤³¤Î»²¾È¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP +-ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢\fIservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£servertool¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¡¢±Ê³¥µ¡¼¥Ð¡¼¤ÎÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¤ª¤è¤ÓÄä»ß¤ò¹Ô¤¦¤¿¤á¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Î¾ÜºÙ¤Ï¡¢¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢\fBservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£servertool¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¡¢±Ê³¥µ¡¼¥Ð¡¼¤ÎÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¤ª¤è¤ÓÄä»ß¤ò¹Ô¤¦¤¿¤á¤Î¥³¥Þ¥ó¥É¹Ô¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Î¾ÜºÙ¤Ï¡¢¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIorbd\fR¤òµ¯Æ°¤¹¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤âµ¯Æ°¤µ¤ì¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ÜºÙ¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤ÈÄä»ß¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBorbd\fR¤òµ¯Æ°¤¹¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤âµ¯Æ°¤µ¤ì¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ÜºÙ¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤ÈÄä»ß¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-ORBInitialPort \fInameserverport\fR + .RS 4 +-ɬ¿Ü¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤ò»ØÄꤷ¤Þ¤¹¡£\fIorbd\fR¤Ï¡¢µ¯Æ°¤µ¤ì¤ë¤È¡¢¤³¤Î¥Ý¡¼¥È¾å¤ÇÃå¿®¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤·¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤Ç¤Ï¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¾ì¹ç¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++ɬ¿Ü¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤ò»ØÄꤷ¤Þ¤¹¡£\fBorbd\fR¤Ï¡¢µ¯Æ°¤µ¤ì¤ë¤È¡¢¤³¤Î¥Ý¡¼¥È¾å¤ÇÃå¿®¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤·¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤Ç¤Ï¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¾ì¹ç¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .RE + .SS "ɬ¿Ü¤Ç¤Ê¤¤¥ª¥×¥·¥ç¥ó" + .PP +@@ -110,22 +112,22 @@ + .PP + \-defaultdb \fIdirectory\fR + .RS 4 +-ORBD±Ê³³ÊǼ¥Ç¥£¥ì¥¯¥È¥ê\fIorb\&.db\fR¤¬ºîÀ®¤µ¤ì¤ë¥Ù¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\fI\&./orb\&.db\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ORBD±Ê³³ÊǼ¥Ç¥£¥ì¥¯¥È¥ê\fBorb\&.db\fR¤¬ºîÀ®¤µ¤ì¤ë¥Ù¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\fB\&./orb\&.db\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-serverPollingTime \fImilliseconds\fR + .RS 4 +-\fIservertool\fR¤ò»ÈÍѤ·¤ÆÅÐÏ¿¤µ¤ì¤¿±Ê³¥µ¡¼¥Ð¡¼¤Î¥Ø¥ë¥¹¾õÂÖ¤òORBD¤¬¥Á¥§¥Ã¥¯¤¹¤ë´Ö³Ö¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ1000¥ß¥êÉäǤ¹¡£\fImilliseconds\fR¤Ë»ØÄꤹ¤ëÃͤϡ¢Í­¸ú¤ÊÀµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBservertool\fR¤ò»ÈÍѤ·¤ÆÅÐÏ¿¤µ¤ì¤¿±Ê³¥µ¡¼¥Ð¡¼¤Î¥Ø¥ë¥¹¾õÂÖ¤òORBD¤¬¥Á¥§¥Ã¥¯¤¹¤ë´Ö³Ö¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ1000¥ß¥êÉäǤ¹¡£\fBmilliseconds\fR¤Ë»ØÄꤹ¤ëÃͤϡ¢Í­¸ú¤ÊÀµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-serverStartupDelay milliseconds + .RS 4 +-\fIservertool\fR¤ò»ÈÍѤ·¤ÆÅÐÏ¿¤µ¤ì¤¿±Ê³¥µ¡¼¥Ð¡¼¤òºÆµ¯Æ°¤·¤Æ¤«¤é¡¢°ÌÃÖžÁ÷¤ÎÎã³°¤òÁ÷¿®¤¹¤ë¤Þ¤Ç¤ÎORBD¤ÎÂÔµ¡»þ´Ö¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ1000¥ß¥êÉäǤ¹¡£\fImilliseconds\fR¤Ë»ØÄꤹ¤ëÃͤϡ¢Í­¸ú¤ÊÀµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBservertool\fR¤ò»ÈÍѤ·¤ÆÅÐÏ¿¤µ¤ì¤¿±Ê³¥µ¡¼¥Ð¡¼¤òºÆµ¯Æ°¤·¤Æ¤«¤é¡¢°ÌÃÖžÁ÷¤ÎÎã³°¤òÁ÷¿®¤¹¤ë¤Þ¤Ç¤ÎORBD¤ÎÂÔµ¡»þ´Ö¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ1000¥ß¥êÉäǤ¹¡£\fBmilliseconds\fR¤Ë»ØÄꤹ¤ëÃͤϡ¢Í­¸ú¤ÊÀµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SS "¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤ÈÄä»ß" + .PP +@@ -135,17 +137,18 @@ + .PP + ±Ê³¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ËÂФ·¤Æ±Ê³À­¤òÄ󶡤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¤³¤Î¾ðÊó¤Ï¡¢¥µ¡¼¥Ó¥¹¤ÎÄä»ß¤äµ¯Æ°¸å¤Ë¤â°Ý»ý¤µ¤ì¡¢¥µ¡¼¥Ó¥¹¤Ë¾ã³²¤¬È¯À¸¤·¤¿¾ì¹ç¤Ç¤â²óÉü¤Ç¤­¤Þ¤¹¡£ORBD¤òºÆµ¯Æ°¤¹¤ë¤È¡¢±Ê³¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î¥°¥é¥Õ¤òÉü¸µ¤·¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤Î̾Á°¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬¤½¤Î¤Þ¤Þ(±Ê³Ū¤Ë)ÊÝ»ý¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .PP +-²¼°Ì¸ß´¹À­¤Î¤¿¤á¡¢µì¥ê¥ê¡¼¥¹¤ÎJDK¤ËƱº­¤µ¤ì¤Æ¤¤¤¿°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹\fItnameserv\fR¤¬¡¢º£²ó¤Î¥ê¥ê¡¼¥¹¤ÎJava SE¤Ë¤âƱº­¤µ¤ì¤Æ¤¤¤Þ¤¹¡£°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ç¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Î¼Â¹ÔÃæ¤Ë¤Î¤ß¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤¬ÊÝ»ý¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ó¥¹¤¬ÃæÃǤµ¤ì¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¡¦¥°¥é¥Õ¤Ï¼º¤ï¤ì¤Þ¤¹¡£ ++¸åÊý¸ß´¹À­¤Î¤¿¤á¡¢µì¥ê¥ê¡¼¥¹¤ÎJDK¤ËƱº­¤µ¤ì¤Æ¤¤¤¿°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹\fBtnameserv\fR¤¬¡¢º£²ó¤Î¥ê¥ê¡¼¥¹¤ÎJava SE¤Ë¤âƱº­¤µ¤ì¤Æ¤¤¤Þ¤¹¡£°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ç¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Î¼Â¹ÔÃæ¤Ë¤Î¤ß¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤¬ÊÝ»ý¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ó¥¹¤¬ÃæÃǤµ¤ì¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¡¦¥°¥é¥Õ¤Ï¼º¤ï¤ì¤Þ¤¹¡£ + .PP +-\fI\-ORBInitialPort\fR°ú¿ô¤Ï¡¢\fIorbd\fR¤Îɬ¿Ü¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤Ç¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤òÀßÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¼¡¤Î¼ê½ç¤Ç¤Ï¡¢Java IDL Object Request Broker DaemonÍѤ˥ݡ¼¥È1050¤ò»ÈÍѤǤ­¤ë¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£É¬ÍפǤ¢¤ì¤ÐÊ̤Υݡ¼¥È¤ËÊѹ¹¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-ORBInitialPort\fR°ú¿ô¤Ï¡¢\fBorbd\fR¤Îɬ¿Ü¤Î¥³¥Þ¥ó¥É¹Ô°ú¿ô¤Ç¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤òÀßÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¼¡¤Î¼ê½ç¤Ç¤Ï¡¢Java IDL Object Request Broker DaemonÍѤ˥ݡ¼¥È1050¤ò»ÈÍѤǤ­¤ë¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£É¬ÍפǤ¢¤ì¤ÐÊ̤Υݡ¼¥È¤ËÊѹ¹¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-UNIX¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç\fIorbd\fR¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹¡£ ++Solaris¡¢Linux¤Þ¤¿¤ÏOS X¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤«¤é\fBorbd\fR¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-orbd \-ORBInitialPort 1050& ++\fBorbd \-ORBInitialPort 1050&\fR ++ + .fi + .if n \{\ + .RE +@@ -157,7 +160,8 @@ + .RS 4 + .\} + .nf +-start orbd \-ORBInitialPort 1050 ++\fBstart orbd \-ORBInitialPort 1050\fR ++ + .fi + .if n \{\ + .RE +@@ -169,85 +173,89 @@ + .RS 4 + .\} + .nf +-Properties props = new Properties(); +-props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050"); +-props\&.put("org\&.omg\&.CORBA\&.ORBInitialHost", "MyHost"); +-ORB orb = ORB\&.init(args, props); ++\fBProperties props = new Properties();\fR ++\fBprops\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050");\fR ++\fBprops\&.put("org\&.omg\&.CORBA\&.ORBInitialHost", "MyHost");\fR ++\fBORB orb = ORB\&.init(args, props);\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Û¥¹¥È\fIMyHost\fR¤Î¥Ý¡¼¥È1050¾å¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£Ê̤ÎÊýË¡¤È¤·¤Æ¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é¥µ¡¼¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¤¥¢¥ó¥È¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥Ý¡¼¥ÈÈÖ¹æ¤Þ¤¿¤Ï¥Þ¥·¥ó̾¤¢¤ë¤¤¤Ï¤½¤ÎξÊý¤ò»ØÄꤹ¤ëÊýË¡¤â¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fIHelloApplication\fR¤òµ¯Æ°¤Ç¤­¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Û¥¹¥È\fBMyHost\fR¤Î¥Ý¡¼¥È1050¾å¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£Ê̤ÎÊýË¡¤È¤·¤Æ¡¢¥³¥Þ¥ó¥É¹Ô¤«¤é¥µ¡¼¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¤¥¢¥ó¥È¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥Ý¡¼¥ÈÈÖ¹æ¤Þ¤¿¤Ï¥Þ¥·¥ó̾¤¢¤ë¤¤¤Ï¤½¤ÎξÊý¤ò»ØÄꤹ¤ëÊýË¡¤â¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fBHelloApplication\fR¤òµ¯Æ°¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java HelloApplication \-ORBInitialPort 1050 \-ORBInitialHost MyHost ++\fBjava HelloApplication \-ORBInitialPort 1050 \-ORBInitialHost MyHost\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÄä»ß¤¹¤ë¤Ë¤Ï¡¢Å¬Àڤʥª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢Oracle Solaris¾å¤Ç\fIpkill\fR +-\fIorbd\fR¤ò¼Â¹Ô¤·¤¿¤ê¡¢\fIorbd\fR¤¬Æ°ºîÃæ¤ÎDOS¥¦¥£¥ó¥É¥¦¤Ç\fB[Ctrl]+[C]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ì¹ç¤Ï¡¢¥µ¡¼¥Ó¥¹¤¬½ªÎ»¤µ¤ì¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ËÅÐÏ¿¤µ¤ì¤¿Ì¾Á°¤¬¾Ãµî¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢ÌÀ¼¨Åª¤ËÄä»ß¤µ¤ì¤ë¤Þ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ ++¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÄä»ß¤¹¤ë¤Ë¤Ï¡¢Å¬Àڤʥª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢Oracle Solaris¾å¤Ç\fBpkill\fR ++\fBorbd\fR¤ò¼Â¹Ô¤·¤¿¤ê¡¢\fBorbd\fR¤¬Æ°ºîÃæ¤ÎDOS¥¦¥£¥ó¥É¥¦¤Ç\fB[Ctrl]+[C]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ì¹ç¤Ï¡¢¥µ¡¼¥Ó¥¹¤¬½ªÎ»¤µ¤ì¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ËÅÐÏ¿¤µ¤ì¤¿Ì¾Á°¤¬¾Ãµî¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢ÌÀ¼¨Åª¤ËÄä»ß¤µ¤ì¤ë¤Þ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ + .PP + ORBD¤ËÉÕ°¤¹¤ë¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ÜºÙ¤Ï¡¢ + http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/jidlNaming\&.html¤Î¡ÖNaming Service¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SH "¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã" + .PP +-ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Ë¥¢¥¯¥»¥¹¤·¤Æ¡¢±Ê³¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢\fIservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£servertool¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¡¢±Ê³¥µ¡¼¥Ð¡¼¤ÎÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¤ª¤è¤ÓÄä»ß¤ò¹Ô¤¦¤¿¤á¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£\fIservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ë¾ì¹ç¤Ï¡¢\fIorbd\fR¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì½ê¤ÈƱ¤¸¥Ý¡¼¥È¤È¥Û¥¹¥È¤Çµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤ò°Û¤Ê¤ë¥Ý¡¼¥È¤Ç¼Â¹Ô¤¹¤ë¤È¡¢¥í¡¼¥«¥ë¡¦¥³¥ó¥Æ¥­¥¹¥ÈÍѤ˥ǡ¼¥¿¥Ù¡¼¥¹¤ËÊݸ¤µ¤ì¤Æ¤¤¤ë¾ðÊó¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¥µ¡¼¥Ó¥¹¤¬Àµ¤·¤¯Æ°ºî¤·¤Þ¤»¤ó¡£ ++ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Ë¥¢¥¯¥»¥¹¤·¤Æ¡¢±Ê³¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢\fBservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£servertool¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¡¢±Ê³¥µ¡¼¥Ð¡¼¤ÎÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¤ª¤è¤ÓÄä»ß¤ò¹Ô¤¦¤¿¤á¤Î¥³¥Þ¥ó¥É¹Ô¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£\fBservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ë¾ì¹ç¤Ï¡¢\fBorbd\fR¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì½ê¤ÈƱ¤¸¥Ý¡¼¥È¤È¥Û¥¹¥È¤Çµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤ò°Û¤Ê¤ë¥Ý¡¼¥È¤Ç¼Â¹Ô¤¹¤ë¤È¡¢¥í¡¼¥«¥ë¡¦¥³¥ó¥Æ¥­¥¹¥ÈÍѤ˥ǡ¼¥¿¥Ù¡¼¥¹¤ËÊݸ¤µ¤ì¤Æ¤¤¤ë¾ðÊó¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¥µ¡¼¥Ó¥¹¤¬Àµ¤·¤¯Æ°ºî¤·¤Þ¤»¤ó¡£ + .PP + http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/jidlExample\&.html¤Î + ¡ÖJava IDL: The "Hello World" Example¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢¥Á¥å¡¼¥È¥ê¥¢¥ë¤Î¼ê½ç¤Ë½¾¤Ã¤Æ\fIidlj\fR¥³¥ó¥Ñ¥¤¥é¤È\fIjavac\fR¥³¥ó¥Ñ¥¤¥é¤ò¼Â¹Ô¤·¤Þ¤¹¡£ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¼ê½ç¤Ë½¾¤Ã¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥Á¥å¡¼¥È¥ê¥¢¥ë¤Î¼ê½ç¤Ë½¾¤Ã¤Æ\fBidlj\fR¥³¥ó¥Ñ¥¤¥é¤È\fBjavac\fR¥³¥ó¥Ñ¥¤¥é¤ò¼Â¹Ô¤·¤Þ¤¹¡£ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¼ê½ç¤Ë½¾¤Ã¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .PP +-\fIorbd\fR¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBorbd\fR¤òµ¯Æ°¤·¤Þ¤¹¡£ + .PP +-UNIX¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹: +-\fIorbd \-ORBInitialPort 1050\fR¡£ ++Solaris¡¢Linux¤Þ¤¿¤ÏOS X¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç¡¢¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹: ++\fBorbd \-ORBInitialPort 1050\fR + .PP + MS\-DOS¥·¥¹¥Æ¥à¡¦¥×¥í¥ó¥×¥È(Windows)¤Ç¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹: +-\fIs\fR\fItart orbd \-ORBInitialPort 105\fR\fI0\fR ++\fBs\fR\fBtart orbd \-ORBInitialPort 105\fR\fB0\fR + .PP +-¥Ý¡¼¥È1050¤Ï¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¥Ý¡¼¥È¤Ç¤¹¡£\fI\-ORBInitialPort\fR¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤Ç¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++¥Ý¡¼¥È1050¤Ï¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¥Ý¡¼¥È¤Ç¤¹¡£\fB\-ORBInitialPort\fR¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¥³¥Þ¥ó¥É¹Ô°ú¿ô¤Ç¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .PP +-\fIservertool\fR¤òµ¯Æ°¤·¤Þ¤¹: +-\fIservertool \-ORBInitialPort 1050\fR¡£ ++\fBservertool\fR¤òµ¯Æ°¤·¤Þ¤¹: ++\fBservertool \-ORBInitialPort 1050\fR¡£ + .PP +-Á°²ó¤Î¼ê½ç¤È¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fIorbd\fR)¤Î¥Ý¡¼¥È¤¬Æ±¤¸¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð\fI\-ORBInitialPort 1050\&.\fR¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£\fIservertool\fR¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤ÈƱ¤¸¥Ý¡¼¥È¾å¤Çµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++Á°²ó¤Î¼ê½ç¤È¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fBorbd\fR)¤Î¥Ý¡¼¥È¤¬Æ±¤¸¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð\fB\-ORBInitialPort 1050\&.\fR¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£\fBservertool\fR¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤ÈƱ¤¸¥Ý¡¼¥È¾å¤Çµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-\fIservertool\fR¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¡¢\fIservertool\fR¥×¥í¥ó¥×¥È¤«¤é\fIHello\fR¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¹Ô¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¡¢\fBservertool\fR¥×¥í¥ó¥×¥È¤«¤é\fBHello\fR¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-servertool > register \-server HelloServer \-classpath \&. \-applicationName +- HelloServerApName ++\fBservertool > register \-server HelloServer \-classpath \&. \-applicationName\fR ++\fB HelloServerApName\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIservertool\fR¤Ë¤è¤Ã¤Æ¥µ¡¼¥Ð¡¼¤¬ÅÐÏ¿¤µ¤ì¤Æ¡¢\fIHelloServerApName\fR¤È¤¤¤¦Ì¾Á°¤¬¥µ¡¼¥Ð¡¼¤Ë³ä¤êÅö¤Æ¤é¤ì¡¢ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥µ¡¼¥Ð¡¼°ìÍ÷¤È¤È¤â¤Ë¥µ¡¼¥Ð¡¼ID¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£Â¾¤ÎüËö¥¦¥£¥ó¥É¥¦¤Þ¤¿¤Ï¥×¥í¥ó¥×¥È¤«¤é¥¯¥é¥¤¥¢¥ó¥È¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBservertool\fR¤Ë¤è¤Ã¤Æ¥µ¡¼¥Ð¡¼¤¬ÅÐÏ¿¤µ¤ì¤Æ¡¢\fBHelloServerApName\fR¤È¤¤¤¦Ì¾Á°¤¬¥µ¡¼¥Ð¡¼¤Ë³ä¤êÅö¤Æ¤é¤ì¡¢ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥µ¡¼¥Ð¡¼°ìÍ÷¤È¤È¤â¤Ë¥µ¡¼¥Ð¡¼ID¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£Â¾¤ÎüËö¥¦¥£¥ó¥É¥¦¤Þ¤¿¤Ï¥×¥í¥ó¥×¥È¤«¤é¥¯¥é¥¤¥¢¥ó¥È¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java HelloClient \-ORBInitialPort 1050 \-ORBInitialHost localhost ++\fBjava HelloClient \-ORBInitialPort 1050 \-ORBInitialHost localhost\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Î\fI\-ORBInitialHost localhost\fR¤Ï¾Êά¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬\fIHello\fR¥¯¥é¥¤¥¢¥ó¥È¤È¤·¤ÆƱ°ì¥Û¥¹¥È¾å¤ÇÆ°ºî¤·¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬Ê̤Υۥ¹¥È¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\-\fIORBInitialHost nameserverhost\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆIDL¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Û¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£Á°¤Î¼ê½ç¤Ç¹Ô¤ï¤ì¤¿¤È¤ª¤ê¤Ë¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fIorbd\fR)¥Ý¡¼¥È¤ò»ØÄꤷ¤Þ¤¹(Îã: +-\fI\-ORBInitialPort 1050\fR)¡£ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ÎÁàºî¤¬½ªÎ»¤·¤¿¤é¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fIorbd\fR)¤È\fIservertool\fR¤òÄä»ß¤¹¤ë¤«½ªÎ»¤·¤Æ¤¯¤À¤µ¤¤¡£MS\-DOS¥×¥í¥ó¥×¥È¤Ç\fIorbd\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¥¦¥£¥ó¥É¥¦¤òÁªÂò¤·¤Æ\fB[Ctrl]+[C]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Î\fB\-ORBInitialHost localhost\fR¤Ï¾Êά¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬\fBHello\fR¥¯¥é¥¤¥¢¥ó¥È¤È¤·¤ÆƱ°ì¥Û¥¹¥È¾å¤ÇÆ°ºî¤·¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬Ê̤Υۥ¹¥È¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\-\fBORBInitialHost nameserverhost\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆIDL¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Û¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£Á°¤Î¼ê½ç¤Ç¹Ô¤ï¤ì¤¿¤È¤ª¤ê¤Ë¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fBorbd\fR)¥Ý¡¼¥È¤ò»ØÄꤷ¤Þ¤¹(Îã: ++\fB\-ORBInitialPort 1050\fR)¡£ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ÎÁàºî¤¬½ªÎ»¤·¤¿¤é¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fBorbd\fR)¤È\fBservertool\fR¤òÄä»ß¤¹¤ë¤«½ªÎ»¤·¤Æ¤¯¤À¤µ¤¤¡£MS\-DOS¥×¥í¥ó¥×¥È¤Ç\fBorbd\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¥¦¥£¥ó¥É¥¦¤òÁªÂò¤·¤Æ\fB[Ctrl]+[C]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£ + .PP +-Oracle Solaris¤«¤é\fIorbd\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢¥×¥í¥»¥¹¤ò¸¡º÷¤·¤Æ¡¢\fIkill\fR¥³¥Þ¥ó¥É¤Ç½ªÎ»¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤òÌÀ¼¨Åª¤ËÄä»ß¤¹¤ë¤Þ¤Ç¤Ï¡¢¸Æ½Ð¤·ÂÔµ¡¾õÂÖ¤¬Â³¤­¤Þ¤¹¡£\fIservertool\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢\fBquit\fR¤ÈÆþÎϤ·¤Æ¥­¡¼¥Ü¡¼¥É¤Î\fB[Enter]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£ ++Oracle Solaris¤«¤é\fBorbd\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢¥×¥í¥»¥¹¤ò¸¡º÷¤·¤Æ¡¢\fBkill\fR¥³¥Þ¥ó¥É¤Ç½ªÎ»¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤òÌÀ¼¨Åª¤ËÄä»ß¤¹¤ë¤Þ¤Ç¤Ï¡¢¸Æ½Ð¤·ÂÔµ¡¾õÂÖ¤¬Â³¤­¤Þ¤¹¡£\fBservertool\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢\fBquit\fR¤ÈÆþÎϤ·¤Æ¥­¡¼¥Ü¡¼¥É¤Î\fB[Enter]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£ + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/linux/doc/man/ja/pack200.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/pack200.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: pack200 +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: pack200 ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "pack200" "1" "2013ǯ11·î21Æü" "JDK 8" "Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + pack200 \- Web¥Ç¥×¥í¥¤¥á¥ó¥È¤Î¤¿¤á¤ËJAR¥Õ¥¡¥¤¥ë¤òpack200°µ½Ì¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,17 +58,17 @@ + .RS 4 + .\} + .nf +-\fIpack200\fR [\fIoptions\fR] \fIoutput\-file\fR \fIJAR\-file\fR ++\fBpack200\fR [\fIoptions\fR] \fIoutput\-file\fR \fIJAR\-file\fR + .fi + .if n \{\ + .RE + .\} + .PP +-¥ª¥×¥·¥ç¥ó¤ÏǤ°Õ¤Î½ç½ø¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Þ¤¿¤Ïproperties¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤¿ºÇ¸å¤Î¥ª¥×¥·¥ç¥ó¤¬¡¢¤½¤ì°ÊÁ°¤Ë»ØÄꤵ¤ì¤¿¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤è¤êÍ¥À褵¤ì¤Þ¤¹¡£ ++¥ª¥×¥·¥ç¥ó¤ÏǤ°Õ¤Î½ç½ø¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Þ¤¿¤Ïproperties¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤¿ºÇ¸å¤Î¥ª¥×¥·¥ç¥ó¤¬¡¢¤½¤ì°ÊÁ°¤Ë»ØÄꤵ¤ì¤¿¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤è¤êÍ¥À褵¤ì¤Þ¤¹¡£ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIoutput\-file\fR +@@ -80,31 +82,35 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢Java gzip¥³¥ó¥×¥ì¥Ã¥µ¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤òpack200°µ½Ì¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤¹¡£pack200¥Õ¥¡¥¤¥ë¤Ï¹â°µ½Ì¤Î¥Õ¥¡¥¤¥ë¤Ç¡¢Ä¾ÀÜ¥Ç¥×¥í¥¤¤Ç¤­¡¢ÂÓ°èÉý¤ÎÀáÌó¤ä¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤Îû½Ì¤¬²Äǽ¤Ç¤¹¡£ ++\fBpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢Java gzip¥³¥ó¥×¥ì¥Ã¥µ¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤òpack200°µ½Ì¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤¹¡£pack200¥Õ¥¡¥¤¥ë¤Ï¹â°µ½Ì¤Î¥Õ¥¡¥¤¥ë¤Ç¡¢Ä¾ÀÜ¥Ç¥×¥í¥¤¤Ç¤­¡¢ÂÓ°èÉý¤ÎÀáÌó¤ä¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤Îû½Ì¤¬²Äǽ¤Ç¤¹¡£ + .PP +-\fIpack200\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢°µ½Ì¥¨¥ó¥¸¥ó¤ÎÀßÄê¤äÈùÄ´À°¤ò¹Ô¤¦¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£°ìÈÌŪ¤Ê»ÈÍÑÊýË¡¤ò¼¡¤ÎÎã¤Ë¼¨¤·¤Þ¤¹¡£\fImyarchive\&.pack\&.gz\fR¤¬¥Ç¥Õ¥©¥ë¥È¤Î\fIpack200\fR¥³¥Þ¥ó¥ÉÀßÄê¤ÇºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBpack200\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢°µ½Ì¥¨¥ó¥¸¥ó¤ÎÀßÄê¤äÈùÄ´À°¤ò¹Ô¤¦¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£°ìÈÌŪ¤Ê»ÈÍÑÊýË¡¤ò¼¡¤ÎÎã¤Ë¼¨¤·¤Þ¤¹¡£\fBmyarchive\&.pack\&.gz\fR¤¬¥Ç¥Õ¥©¥ë¥È¤Î\fBpack200\fR¥³¥Þ¥ó¥ÉÀßÄê¤ÇºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-pack200 myarchive\&.pack\&.gz myarchive\&.jar ++\fBpack200 myarchive\&.pack\&.gz myarchive\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\-r, \-\-repack ++\-r ++.br ++\-\-repack + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ò¥Ñ¥Ã¥¯¤·¤¿¸å¥¢¥ó¥Ñ¥Ã¥¯¤·¤Æ¡¢JAR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ï\fIjarsigner\fR(1)¥Ä¡¼¥ë¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢myarchive\&.jar¥Õ¥¡¥¤¥ë¤ò¥Ñ¥Ã¥¯¤·¤¿¸å¡¢¥¢¥ó¥Ñ¥Ã¥¯¤·¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ò¥Ñ¥Ã¥¯¤·¤¿¸å¥¢¥ó¥Ñ¥Ã¥¯¤·¤Æ¡¢JAR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ï\fBjarsigner\fR(1)¥Ä¡¼¥ë¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢myarchive\&.jar¥Õ¥¡¥¤¥ë¤ò¥Ñ¥Ã¥¯¤·¤¿¸å¡¢¥¢¥ó¥Ñ¥Ã¥¯¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-pack200 \-\-repack myarchive\-packer\&.jar myarchive\&.jar +-pack200 \-\-repack myarchive\&.jar ++\fBpack200 \-\-repack myarchive\-packer\&.jar myarchive\&.jar\fR ++\fBpack200 \-\-repack myarchive\&.jar\fR ++ + .fi + .if n \{\ + .RE +@@ -112,24 +118,29 @@ + ¼¡¤ÎÎã¤Ç¤Ï¡¢ÆþÎÏ¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë¤Î½ç½ø¤òÊÝ»ý¤·¤Þ¤¹¡£ + .RE + .PP +-\-g, \-\-no\-gzip ++\-g ++.br ++\-\-no\-gzip + .RS 4 +-\fIpack200\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¤­¤Ï¡¢Å¬Àڤʰµ½Ì¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Âбþ¤¹¤ë°µ½Ì²ò½ü¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBpack200\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¤­¤Ï¡¢Å¬Àڤʰµ½Ì¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Âбþ¤¹¤ë°µ½Ì²ò½ü¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-pack200 \-\-no\-gzip myarchive\&.pack myarchive\&.jar ++\fBpack200 \-\-no\-gzip myarchive\&.pack myarchive\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-G, \-\-strip\-debug ++\-G ++.br ++\-\-strip\-debug + .RS 4 +-½ÐÎϤ«¤é¥Ç¥Ð¥Ã¥°Â°À­¤òºï½ü¤·¤Þ¤¹¡£¤³¤ì¤Ë¤Ï¡¢\fISourceFile\fR¡¢\fILineNumberTable\fR¡¢\fILocalVariableTable\fR¡¢\fILocalVariableTypeTable\fR¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î°À­¤òºï½ü¤¹¤ì¤Ð¡¢¥À¥¦¥ó¥í¡¼¥É¤È¥¤¥ó¥¹¥È¡¼¥ë¤Î¥µ¥¤¥º¤Ï¾®¤µ¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¥Ç¥Ð¥Ã¥¬¤Îµ¡Ç½¤ÏÀ©¸Â¤µ¤ì¤Þ¤¹¡£ ++½ÐÎϤ«¤é¥Ç¥Ð¥Ã¥°Â°À­¤òºï½ü¤·¤Þ¤¹¡£¤³¤ì¤Ë¤Ï¡¢\fBSourceFile\fR¡¢\fBLineNumberTable\fR¡¢\fBLocalVariableTable\fR¡¢\fBLocalVariableTypeTable\fR¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î°À­¤òºï½ü¤¹¤ì¤Ð¡¢¥À¥¦¥ó¥í¡¼¥É¤È¥¤¥ó¥¹¥È¡¼¥ë¤Î¥µ¥¤¥º¤Ï¾®¤µ¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¥Ç¥Ð¥Ã¥¬¤Îµ¡Ç½¤ÏÀ©¸Â¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-\-keep\-file\-order +@@ -137,15 +148,19 @@ + ÆþÎÏ¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë¤Î½ç½ø¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ + .RE + .PP +-\-O, \-\-no\-keep\-file\-order ++\-O ++.br ++\-\-no\-keep\-file\-order + .RS 4 + ¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢¤¹¤Ù¤Æ¤ÎÍ×ÁǤòʤÙÂؤ¨¤ÆÁ÷¿®¤·¤Þ¤¹¡£¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢JAR¥Ç¥£¥ì¥¯¥È¥ê̾¤òºï½ü¤·¤Æ¥À¥¦¥ó¥í¡¼¥É¡¦¥µ¥¤¥º¤òºï¸º¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ê¤É¡¢ÆÃÄê¤ÎJAR¥Õ¥¡¥¤¥ë¤ÎºÇŬ²½µ¡Ç½¤¬Àµ¾ï¤ËÆ°ºî¤·¤Ê¤¯¤Ê¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\-S\fIvalue\fR, \-\-segment\-limit=\fIvalue\fR ++\-S\fIvalue\fR ++.br ++\-\-segment\-limit=\fIvalue\fR + .RS 4 + ¤³¤ÎÃͤϡ¢³Æ¥¢¡¼¥«¥¤¥Ö¡¦¥»¥°¥á¥ó¥È¤ÎͽÁÛ¥¿¡¼¥²¥Ã¥È¡¦¥µ¥¤¥º\fIN\fR +-(¥Ð¥¤¥Èñ°Ì)¤Ç¤¹¡£Ã±°ì¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎɬÍ×¥µ¥¤¥º¤¬\fIN\fR¥Ð¥¤¥È¤òĶ¤¨¤ë¤È¡¢ÆÈΩ¤·¤¿¥»¥°¥á¥ó¥È¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£Æüì¤Ê¥±¡¼¥¹¤È¤·¤Æ¡¢Ãͤ¬\fI\-1\fR¤Î¾ì¹ç¤Ï¡¢¤¹¤Ù¤Æ¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ò´Þ¤àÂ礭¤Êñ°ì¤Î¥»¥°¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢Ãͤ¬0¤Î¾ì¹ç¤Ï¡¢¥¯¥é¥¹¤´¤È¤Ë¥»¥°¥á¥ó¥È¤¬1¤Ä¤º¤ÄÀ¸À®¤µ¤ì¤Þ¤¹¡£¥¢¡¼¥«¥¤¥Ö¡¦¥»¥°¥á¥ó¥È¤¬Â礭¤¯¤Ê¤ë¤È¡¢ÃÇÊÒ²½¤¬¾¯¤Ê¤¯¤Ê¤ê°µ½ÌΨ¤¬¹â¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¤½¤Î½èÍý¤Ë¤Ï¿¤¯¤Î¥á¥â¥ê¡¼¤¬É¬ÍפǤ¹¡£ ++(¥Ð¥¤¥Èñ°Ì)¤Ç¤¹¡£Ã±°ì¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎɬÍ×¥µ¥¤¥º¤¬\fIN\fR¥Ð¥¤¥È¤òĶ¤¨¤ë¤È¡¢ÆÈΩ¤·¤¿¥»¥°¥á¥ó¥È¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£Æüì¤Ê¥±¡¼¥¹¤È¤·¤Æ¡¢Ãͤ¬\fB\-1\fR¤Î¾ì¹ç¤Ï¡¢¤¹¤Ù¤Æ¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ò´Þ¤àÂ礭¤Êñ°ì¤Î¥»¥°¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢Ãͤ¬0¤Î¾ì¹ç¤Ï¡¢¥¯¥é¥¹¤´¤È¤Ë¥»¥°¥á¥ó¥È¤¬1¤Ä¤º¤ÄÀ¸À®¤µ¤ì¤Þ¤¹¡£¥¢¡¼¥«¥¤¥Ö¡¦¥»¥°¥á¥ó¥È¤¬Â礭¤¯¤Ê¤ë¤È¡¢ÃÇÊÒ²½¤¬¾¯¤Ê¤¯¤Ê¤ê°µ½ÌΨ¤¬¹â¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¤½¤Î½èÍý¤Ë¤Ï¿¤¯¤Î¥á¥â¥ê¡¼¤¬É¬ÍפǤ¹¡£ + .sp + ³Æ¥»¥°¥á¥ó¥È¤Î¥µ¥¤¥º¤Ï¡¢¥»¥°¥á¥ó¥È¤ËÊÑ´¹¤µ¤ì¤ë¤½¤ì¤¾¤ì¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥µ¥¤¥º¤Î¤Û¤«¡¢¤½¤Î̾Á°¤È¾¤ÎÁ÷¿®¤µ¤ì¤ë¥×¥í¥Ñ¥Æ¥£¤Î¥µ¥¤¥º¤ò·×»»¤·¤Æ¿ä¬¤µ¤ì¤Þ¤¹¡£ + .sp +@@ -154,136 +169,169 @@ + ¤³¤ÎÀ©¸Â¤¬²Ý¤µ¤ì¤Æ¤¤¤Ê¤¤10 MB¤ÎJAR¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ÏÄ̾Ìó10%¾®¤µ¤¯¥Ñ¥Ã¥¯¤µ¤ì¤Þ¤¹¡£¤·¤«¤·¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ç¤è¤êÂ礭¤ÊJava¥Ò¡¼¥×(¥»¥°¥á¥ó¥È¤ÎÀ©¸Â¤ÎÌó10ÇÜ)¤òɬÍפȤ¹¤ë¾ì¹ç¤â¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\-E\fIvalue\fR, \-\-effort=\fIvalue\fR ++\-E\fIvalue\fR ++.br ++\-\-effort=\fIvalue\fR + .RS 4 +-ñ°ì¤Î10¿Ê¿ôÃͤò»ØÄꤷ¤¿¾ì¹ç¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢»ØÄꤵ¤ì¤¿°µ½ÌΨ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò°µ½Ì¤·¤Þ¤¹¡£¥ì¥Ù¥ë1¤Î¾ì¹ç¤Ï¡¢Èæ³ÓŪû¤¤°µ½Ì»þ´Ö¤Ç¿¾¯Â礭¤á¤Î¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¤¬¡¢¥ì¥Ù¥ë9¤Î¾ì¹ç¤Ï¡¢Èó¾ï¤ËŤ¤»þ´Ö¤¬¤«¤«¤ë¤â¤Î¤Î¡¢¤è¤ê°µ½ÌΨ¤Î¹â¤¤¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£Æüì¤ÊÃÍ0¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢\fIpack200\fR¥³¥Þ¥ó¥É¤Ï¸µ¤ÎJAR¥Õ¥¡¥¤¥ë¤ò°µ½Ì¤Ê¤·¤ÇľÀÜ¥³¥Ô¡¼¤·¤Þ¤¹¡£JSR 200ɸ½à¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î²òÅà¥×¥í¥°¥é¥à¤¬¡¢¤³¤ÎÆÃÊ̤ʾì¹ç¤ò¥¢¡¼¥«¥¤¥ÖÁ´ÂΤΥѥ¹¥¹¥ë¡¼¤È²ò¼á¤¹¤ë¤è¤¦¤Ëµ¬Äꤷ¤Æ¤¤¤Þ¤¹¡£ ++ñ°ì¤Î10¿Ê¿ôÃͤò»ØÄꤷ¤¿¾ì¹ç¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢»ØÄꤵ¤ì¤¿°µ½ÌΨ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò°µ½Ì¤·¤Þ¤¹¡£¥ì¥Ù¥ë1¤Î¾ì¹ç¤Ï¡¢Èæ³ÓŪû¤¤°µ½Ì»þ´Ö¤Ç¿¾¯Â礭¤á¤Î¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¤¬¡¢¥ì¥Ù¥ë9¤Î¾ì¹ç¤Ï¡¢Èó¾ï¤ËŤ¤»þ´Ö¤¬¤«¤«¤ë¤â¤Î¤Î¡¢¤è¤ê°µ½ÌΨ¤Î¹â¤¤¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£Æüì¤ÊÃÍ0¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢\fBpack200\fR¥³¥Þ¥ó¥É¤Ï¸µ¤ÎJAR¥Õ¥¡¥¤¥ë¤ò°µ½Ì¤Ê¤·¤ÇľÀÜ¥³¥Ô¡¼¤·¤Þ¤¹¡£JSR 200ɸ½à¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î²òÅà¥×¥í¥°¥é¥à¤¬¡¢¤³¤ÎÆÃÊ̤ʾì¹ç¤ò¥¢¡¼¥«¥¤¥ÖÁ´ÂΤΥѥ¹¥¹¥ë¡¼¤È²ò¼á¤¹¤ë¤è¤¦¤Ëµ¬Äꤷ¤Æ¤¤¤Þ¤¹¡£ + .sp + ¥Ç¥Õ¥©¥ë¥È¤Ï5¤Ç¤¹¡£¤³¤Î¾ì¹ç¡¢É¸½àŪ¤Ê»þ´Ö¤ÇŬÀڤʰµ½Ì¤¬¹Ô¤ï¤ì¤Þ¤¹¡£ + .RE + .PP +-\-H\fIvalue\fR, \-\-deflate\-hint=\fIvalue\fR ++\-H\fIvalue\fR ++.br ++\-\-deflate\-hint=\fIvalue\fR + .RS 4 +-ÆþÎϾðÊó¤òÊݸ¤¹¤ë¤È¤¤¤¦¥Ç¥Õ¥©¥ë¥ÈÃͤò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£Å¾Á÷¤µ¤ì¤ë¥¢¡¼¥«¥¤¥Ö¤Î¥µ¥¤¥º¤ÏÂ礭¤¯¤Ê¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£»ØÄê²Äǽ¤ÊÃͤϡ¢\fItrue\fR¡¢\fIfalse\fR¤Þ¤¿¤Ï\fIkeep\fR¤Ç¤¹¡£ ++ÆþÎϾðÊó¤òÊݸ¤¹¤ë¤È¤¤¤¦¥Ç¥Õ¥©¥ë¥ÈÃͤò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£Å¾Á÷¤µ¤ì¤ë¥¢¡¼¥«¥¤¥Ö¤Î¥µ¥¤¥º¤ÏÂ礭¤¯¤Ê¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£»ØÄê²Äǽ¤ÊÃͤϡ¢\fBtrue\fR¡¢\fBfalse\fR¤Þ¤¿¤Ï\fBkeep\fR¤Ç¤¹¡£ + .sp +-\fIvalue\fR¤¬\fItrue\fR¤Þ¤¿¤Ïfalse¤Î¾ì¹ç¡¢\fIpacker200\fR¥³¥Þ¥ó¥É¤Ï»ØÄê¤Ë½¾¤Ã¤Æ¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤ò½ÐÎÏ¥¢¡¼¥«¥¤¥Ö¤ËÀßÄꤷ¤Þ¤¹¡£¥¢¡¼¥«¥¤¥ÖÍ×ÁǤθġ¹¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤ÏžÁ÷¤µ¤ì¤Þ¤»¤ó¡£ ++\fBvalue\fR¤¬\fBtrue\fR¤Þ¤¿¤Ïfalse¤Î¾ì¹ç¡¢\fBpacker200\fR¥³¥Þ¥ó¥É¤Ï»ØÄê¤Ë½¾¤Ã¤Æ¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤ò½ÐÎÏ¥¢¡¼¥«¥¤¥Ö¤ËÀßÄꤷ¤Þ¤¹¡£¥¢¡¼¥«¥¤¥ÖÍ×ÁǤθġ¹¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤ÏžÁ÷¤µ¤ì¤Þ¤»¤ó¡£ + .sp +-\fIkeep\fRÃͤϡ¢ÆþÎÏJAR¤Ç³Îǧ¤µ¤ì¤¿¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£ ++\fBkeep\fRÃͤϡ¢ÆþÎÏJAR¤Ç³Îǧ¤µ¤ì¤¿¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£ + .RE + .PP +-\-m\fIvalue\fR, \-\-modification\-time=\fIvalue\fR ++\-m\fIvalue\fR ++.br ++\-\-modification\-time=\fIvalue\fR + .RS 4 +-»ØÄê²Äǽ¤ÊÃͤÏ\fIlatest\fR¤È\fIkeep\fR¤Ç¤¹¡£ ++»ØÄê²Äǽ¤ÊÃͤÏ\fBlatest\fR¤È\fBkeep\fR¤Ç¤¹¡£ + .sp + Ãͤ¬ºÇ¿·¤Î¾ì¹ç¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢¸µ¤Î¥¢¡¼¥«¥¤¥Ö¤Î»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Î¤¦¤Á¤ÎºÇ½ª¹¹¿·»þ¹ï¤«¡¢¤½¤Î¥»¥°¥á¥ó¥È¤Î»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤ÎºÇ½ª¹¹¿·»þ¹ï¤òÆÃÄꤷ¤è¤¦¤È¤·¤Þ¤¹¡£¤³¤Îñ°ì¤ÎÃͤϥ»¥°¥á¥ó¥È¤Î°ìÉô¤È¤·¤ÆžÁ÷¤µ¤ì¡¢³Æ¥»¥°¥á¥ó¥È¤ÎÁ´¥¨¥ó¥È¥ê¤ËŬÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¤¹¤Ù¤Æ¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Õ¥¡¥¤¥ë¤Ëñ°ì¤ÎÆüÉÕ¤¬ÀßÄꤵ¤ì¤ë¤È¤¤¤¦ÌäÂê¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢¥¢¡¼¥«¥¤¥Ö¤ÎžÁ÷¥µ¥¤¥º¤ò¾¯¤·¾®¤µ¤¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-Ãͤ¬\fIkeep\fR¤Î¾ì¹ç¡¢ÆþÎÏJAR¤Ç³Îǧ¤µ¤ì¤¿Êѹ¹»þ´Ö¤¬ÊÝ»ý¤µ¤ì¤Þ¤¹¡£¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£ ++Ãͤ¬\fBkeep\fR¤Î¾ì¹ç¡¢ÆþÎÏJAR¤Ç³Îǧ¤µ¤ì¤¿Êѹ¹»þ´Ö¤¬ÊÝ»ý¤µ¤ì¤Þ¤¹¡£¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£ + .RE + .PP +-\-P\fIfile\fR, \-\-pass\-file=\fIfile\fR ++\-P\fIfile\fR ++.br ++\-\-pass\-file=\fIfile\fR + .RS 4 +-¥Õ¥¡¥¤¥ë¤ò°µ½Ì¤»¤º¡¢¥Ð¥¤¥Èñ°Ì¤ÇžÁ÷¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«ÊÖ¤·»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥·¥¹¥Æ¥à¡¦¥Õ¥¡¥¤¥ë¡¦¥»¥Ñ¥ì¡¼¥¿¤¬JAR¥Õ¥¡¥¤¥ë¡¦¥»¥Ñ¥ì¡¼¥¿¤Î¥¹¥é¥Ã¥·¥å(/)¤ËÃÖ¤­´¹¤¨¤é¤ì¤ëÅÀ¤ò½ü¤­¡¢¥Ñ¥¹Ì¾¤ÎÊÑ´¹¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£·ë²Ì¤È¤·¤ÆÆÀ¤é¤ì¤ë¥Õ¥¡¥¤¥ë̾¤Ï¡¢Ê¸»úÎó¤È¤·¤ÆÀµ³Î¤ËJAR¥Õ¥¡¥¤¥ë¤Ç¤Î½Ð¸½¤È°ìÃפ·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIfile\fR¤Ë¥Ç¥£¥ì¥¯¥È¥ê̾¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤¬Å¾Á÷¤µ¤ì¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ë¤ò°µ½Ì¤»¤º¡¢¥Ð¥¤¥Èñ°Ì¤ÇžÁ÷¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«ÊÖ¤·»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥·¥¹¥Æ¥à¡¦¥Õ¥¡¥¤¥ë¡¦¥»¥Ñ¥ì¡¼¥¿¤¬JAR¥Õ¥¡¥¤¥ë¡¦¥»¥Ñ¥ì¡¼¥¿¤Î¥¹¥é¥Ã¥·¥å(/)¤ËÃÖ¤­´¹¤¨¤é¤ì¤ëÅÀ¤ò½ü¤­¡¢¥Ñ¥¹Ì¾¤ÎÊÑ´¹¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£·ë²Ì¤È¤·¤ÆÆÀ¤é¤ì¤ë¥Õ¥¡¥¤¥ë̾¤Ï¡¢Ê¸»úÎó¤È¤·¤ÆÀµ³Î¤ËJAR¥Õ¥¡¥¤¥ë¤Ç¤Î½Ð¸½¤È°ìÃפ·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBfile\fR¤Ë¥Ç¥£¥ì¥¯¥È¥ê̾¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤¬Å¾Á÷¤µ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-U\fIaction\fR, \-\-unknown\-attribute=\fIaction\fR ++\-U\fIaction\fR ++.br ++\-\-unknown\-attribute=\fIaction\fR + .RS 4 +-¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢ÉÔÌÀ¤Ê°À­¤ò´Þ¤à¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¡¢»ØÄꤷ¤¿\fIaction\fR¤Ë¤è¤Ã¤ÆÅϤµ¤ì¤Þ¤¹¡£¥¢¥¯¥·¥ç¥ó¤È¤·¤Æ»ØÄê²Äǽ¤ÊÃͤϡ¢\fIerror\fR¡¢\fIstrip\fR¤Þ¤¿¤Ï\fIpass\fR¤Ç¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢ÉÔÌÀ¤Ê°À­¤ò´Þ¤à¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¡¢»ØÄꤷ¤¿\fBaction\fR¤Ë¤è¤Ã¤ÆÅϤµ¤ì¤Þ¤¹¡£¥¢¥¯¥·¥ç¥ó¤È¤·¤Æ»ØÄê²Äǽ¤ÊÃͤϡ¢\fBerror\fR¡¢\fBstrip\fR¤Þ¤¿¤Ï\fBpass\fR¤Ç¤¹¡£ + .sp +-Ãͤ¬\fIerror\fR¤Î¾ì¹ç¡¢\fIpack200\fR¥³¥Þ¥ó¥ÉÁàºîÁ´ÂΤ¬¼ºÇÔ¤·¤ÆŬÀÚ¤ÊÀâÌÀ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++Ãͤ¬\fBerror\fR¤Î¾ì¹ç¡¢\fBpack200\fR¥³¥Þ¥ó¥ÉÁàºîÁ´ÂΤ¬¼ºÇÔ¤·¤ÆŬÀÚ¤ÊÀâÌÀ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .sp +-Ãͤ¬\fIstrip\fR¤Î¾ì¹ç¡¢Â°À­¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£Java²¾ÁÛ¥Þ¥·¥ó(JVM)ɬ¿Ü°À­¤òºï½ü¤¹¤ë¤È¡¢¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Î¾ã³²¤¬È¯À¸¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ++Ãͤ¬\fBstrip\fR¤Î¾ì¹ç¡¢Â°À­¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£Java Virtual Machine (JVM)ɬ¿Ü°À­¤òºï½ü¤¹¤ë¤È¡¢¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Î¾ã³²¤¬È¯À¸¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +-Ãͤ¬\fIpass\fR¤Î¾ì¹ç¡¢¥¯¥é¥¹Á´ÂΤ¬1¤Ä¤Î¥ê¥½¡¼¥¹¤È¤·¤ÆžÁ÷¤µ¤ì¤Þ¤¹¡£ ++Ãͤ¬\fBpass\fR¤Î¾ì¹ç¡¢¥¯¥é¥¹Á´ÂΤ¬1¤Ä¤Î¥ê¥½¡¼¥¹¤È¤·¤ÆžÁ÷¤µ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-C\fIattribute\-name\fR=\fIlayout\fR, \-\-class\-attribute=\fIattribute\-name\fR=\fIaction\fR ++\-C\fIattribute\-name\fR=\fIlayout\fR ++.br ++\-\-class\-attribute=\fIattribute\-name\fR=\fIaction\fR + .RS 4 + ¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\-F\fIattribute\-name\fR=\fIlayout\fR, \-\-field\-attribute=\fIattribute\-name\fR=\fIaction\fR ++\-F\fIattribute\-name\fR=\fIlayout\fR ++.br ++\-\-field\-attribute=\fIattribute\-name\fR=\fIaction\fR + .RS 4 + ¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\-M\fIattribute\-name\fR=\fIlayout\fR, \-\-method\-attribute=\fIattribute\-name\fR=\fIaction\fR ++\-M\fIattribute\-name\fR=\fIlayout\fR ++.br ++\-\-method\-attribute=\fIattribute\-name\fR=\fIaction\fR + .RS 4 + ¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\-D\fIattribute\-name\fR=\fIlayout\fR, \-\-code\-attribute=\fIattribute\-name\fR=\fIaction\fR ++\-D\fIattribute\-name\fR=\fIlayout\fR ++.br ++\-\-code\-attribute=\fIattribute\-name\fR=\fIaction\fR + .RS 4 +-Á°½Ò¤Î4¤Ä¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥¯¥é¥¹¡¦¥¨¥ó¥Æ¥£¥Æ¥£¤Ë\fIclass\-attribute\fR¡¢\fIfield\-attribute\fR¡¢\fImethod\-attribute\fR¤ª¤è¤Ó\fIcode\-attribute\fR¤Ê¤É¤Î°À­¤Î¥ì¥¤¥¢¥¦¥È¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIattribute\-name\fR¤Ë¤Ï¡¢¤³¤ì¤«¤é¥ì¥¤¥¢¥¦¥È¤Þ¤¿¤Ï¥¢¥¯¥·¥ç¥ó¤òÄêµÁ¤¹¤ë°À­¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£\fIaction\fR¤È¤·¤Æ»ØÄê²Äǽ¤ÊÃͤϡ¢\fIsome\-layout\-string\fR¡¢\fIerror\fR¡¢\fIstrip\fR¡¢\fIpass\fR¤Ç¤¹¡£ ++Á°½Ò¤Î4¤Ä¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥¯¥é¥¹¡¦¥¨¥ó¥Æ¥£¥Æ¥£¤Ë\fBclass\-attribute\fR¡¢\fBfield\-attribute\fR¡¢\fBmethod\-attribute\fR¤ª¤è¤Ó\fBcode\-attribute\fR¤Ê¤É¤Î°À­¤Î¥ì¥¤¥¢¥¦¥È¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIattribute\-name\fR¤Ë¤Ï¡¢¤³¤ì¤«¤é¥ì¥¤¥¢¥¦¥È¤Þ¤¿¤Ï¥¢¥¯¥·¥ç¥ó¤òÄêµÁ¤¹¤ë°À­¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£\fIaction\fR¤È¤·¤Æ»ØÄê²Äǽ¤ÊÃͤϡ¢\fBsome\-layout\-string\fR¡¢\fBerror\fR¡¢\fBstrip\fR¡¢\fBpass\fR¤Ç¤¹¡£ + .sp +-\fIsome\-layout\-string\fR: ¥ì¥¤¥¢¥¦¥È¸À¸ì¤ÏJSR 200»ÅÍͤÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Îã: +-\fI\-\-class\-attribute=SourceFile=RUH\fR¡£ ++\fBsome\-layout\-string\fR: ¥ì¥¤¥¢¥¦¥È¸À¸ì¤ÏJSR 200»ÅÍͤÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Îã: ++\fB\-\-class\-attribute=SourceFile=RUH\fR¡£ + .sp +-Ãͤ¬\fIerror\fR¤Î¾ì¹ç¡¢\fIpack200\fRÁàºî¤¬¼ºÇÔ¤·¤ÆÀâÌÀ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++Ãͤ¬\fBerror\fR¤Î¾ì¹ç¡¢\fBpack200\fRÁàºî¤¬¼ºÇÔ¤·¤ÆÀâÌÀ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .sp +-Ãͤ¬\fIstrip\fR¤Î¾ì¹ç¡¢Â°À­¤¬½ÐÎϤ«¤éºï½ü¤µ¤ì¤Þ¤¹¡£VMɬ¿Ü°À­¤òºï½ü¤¹¤ë¤È¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Î¾ã³²¤¬È¯À¸¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-\-class\-attribute=CompilationID=pass\fR¤È¤¤¤¦¤³¤Î°À­¤ò´Þ¤à¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òžÁ÷¤·¤Þ¤¹¡£¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢¤½¤Î¾¤Î¥¢¥¯¥·¥ç¥ó¤ò¹Ô¤¤¤Þ¤»¤ó¡£ ++Ãͤ¬\fBstrip\fR¤Î¾ì¹ç¡¢Â°À­¤¬½ÐÎϤ«¤éºï½ü¤µ¤ì¤Þ¤¹¡£VMɬ¿Ü°À­¤òºï½ü¤¹¤ë¤È¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Î¾ã³²¤¬È¯À¸¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-\-class\-attribute=CompilationID=pass\fR¤È¤¤¤¦¤³¤Î°À­¤ò´Þ¤à¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òžÁ÷¤·¤Þ¤¹¡£¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢¤½¤Î¾¤Î¥¢¥¯¥·¥ç¥ó¤ò¹Ô¤¤¤Þ¤»¤ó¡£ + .sp +-Ãͤ¬\fIpass\fR¤Î¾ì¹ç¡¢¥¯¥é¥¹Á´ÂΤ¬1¤Ä¤Î¥ê¥½¡¼¥¹¤È¤·¤ÆžÁ÷¤µ¤ì¤Þ¤¹¡£ ++Ãͤ¬\fBpass\fR¤Î¾ì¹ç¡¢¥¯¥é¥¹Á´ÂΤ¬1¤Ä¤Î¥ê¥½¡¼¥¹¤È¤·¤ÆžÁ÷¤µ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-f \fIpack\&.properties\fR, \-\-config\-file=\fIpack\&.properties\fR ++\-f \fIpack\&.properties\fR ++.br ++\-\-config\-file=\fIpack\&.properties\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤ò½é´ü²½¤¹¤ë¤¿¤á¤ÎJava¥×¥í¥Ñ¥Æ¥£¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¹½À®¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ë¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤ò½é´ü²½¤¹¤ë¤¿¤á¤ÎJava¥×¥í¥Ñ¥Æ¥£¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¹½À®¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-pack200 \-f pack\&.properties myarchive\&.pack\&.gz myarchive\&.jar +-more pack\&.properties +-# Generic properties for the packer\&. +-modification\&.time=latest +-deflate\&.hint=false +-keep\&.file\&.order=false +-# This option will cause the files bearing new attributes to +-# be reported as an error rather than passed uncompressed\&. +-unknown\&.attribute=error +-# Change the segment limit to be unlimited\&. +-segment\&.limit=\-1 ++\fBpack200 \-f pack\&.properties myarchive\&.pack\&.gz myarchive\&.jar\fR ++\fBmore pack\&.properties\fR ++\fB# Generic properties for the packer\&.\fR ++\fBmodification\&.time=latest\fR ++\fBdeflate\&.hint=false\fR ++\fBkeep\&.file\&.order=false\fR ++\fB# This option will cause the files bearing new attributes to\fR ++\fB# be reported as an error rather than passed uncompressed\&.\fR ++\fBunknown\&.attribute=error\fR ++\fB# Change the segment limit to be unlimited\&.\fR ++\fBsegment\&.limit=\-1\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-v, \-\-verbose ++\-v ++.br ++\-\-verbose + .RS 4 + ºÇ¾®¸Â¤Î¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤òÊ£¿ô»ØÄꤹ¤ë¤È¡¢¤è¤êŤ¤¥á¥Ã¥»¡¼¥¸¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-q, \-\-quiet ++\-q ++.br ++\-\-quiet + .RS 4 + ¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤»¤º¤ËÆ°ºî¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP +-\-l\fIfilename\fR, \-\-log\-file=\fIfilename\fR ++\-l\fIfilename\fR ++.br ++\-\-log\-file=\fIfilename\fR + .RS 4 + ½ÐÎÏ¥á¥Ã¥»¡¼¥¸¤Î¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP +-\-?, \-h, \-\-help ++\-? ++.br ++\-h ++.br ++\-\-help + .RS 4 + ¤³¤Î¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-V, \-\-version ++\-V ++.br ++\-\-version + .RS 4 + ¤³¤Î¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥ª¥×¥·¥ç¥ó¤òJava²¾ÁÛ¥Þ¥·¥ó¤ËÅϤ·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢java(1)¥³¥Þ¥ó¥É¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥ª¥×¥·¥ç¥ó¤òJava Virtual Machine¤ËÅϤ·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢java(1)¥³¥Þ¥ó¥É¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .SH "½ªÎ»¥¹¥Æ¡¼¥¿¥¹" + .PP + ¼¡¤Î½ªÎ»Ãͤ¬ÊÖ¤µ¤ì¤Þ¤¹: Àµ¾ï½ªÎ»¤Î¾ì¹ç¤Ï0¡¢¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ï0¤è¤êÂ礭¤¤ÃÍ¡£ + .SH "Ãí°Õ" + .PP +-¤³¤Î¥³¥Þ¥ó¥É¤È\fIpack\fR(1)¤òº®Æ±¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\fIpack\fR¤ª¤è¤Ó\fIpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢ÊÌ¡¹¤ÎÀ½ÉʤǤ¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤È\fBpack\fR(1)¤òº®Æ±¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\fBpack\fR¤ª¤è¤Ó\fBpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢ÊÌ¡¹¤ÎÀ½ÉʤǤ¹¡£ + .PP + JDK¤ËÉÕ°¤¹¤ëJava SE API»ÅÍͤȤÎÁê°ã¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢»ÅÍͤòÍ¥À褷¤Æ¤¯¤À¤µ¤¤¡£ + .SH "´ØÏ¢¹àÌÜ" +--- ./jdk/src/linux/doc/man/ja/policytool.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/policytool.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: policytool +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: policytool ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "policytool" "1" "2013ǯ11·î21Æü" "JDK 8" "¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + policytool \- ¥æ¡¼¥Æ¥£¥ê¥Æ¥£GUI·Ðͳ¤Ç¼èÆÀ¤·¤¿¥æ¡¼¥¶¡¼ÆþÎϤ˴ð¤Å¤¤¤Æ¡¢¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߽ñ¤­¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIpolicytool\fR [ \fI\-file\fR ] [ \fIfilename\fR ] ++\fBpolicytool\fR [ \fB\-file\fR ] [ \fIfilename\fR ] + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \-file + .RS 4 +-¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¤è¤¦¤Ë\fIpolicytool\fR¤Ë»Ø¼¨¤·¤Þ¤¹¡£ ++¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¤è¤¦¤Ë\fBpolicytool\fR¤Ë»Ø¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \fIfilename\fR +@@ -80,32 +82,34 @@ + .RS 4 + .\} + .nf +-policytool ++\fBpolicytool\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIpolicytool\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹: ++\fBpolicytool\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹: + .sp + .if n \{\ + .RS 4 + .\} + .nf +-policytool\-file mypolicyfile ++\fBpolicytool\-file mypolicyfile\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "ÀâÌÀ" + .PP +-\fIpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢´ÉÍý¼Ô¤ÎGUI¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¥í¡¼¥«¥ë¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò´ÉÍý¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ï\fI\&.policy\fR³ÈÄ¥»Ò¤ò»ý¤Ä¥×¥ì¡¼¥ó¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¡¢¥É¥á¥¤¥óÊ̤˥ê¥â¡¼¥È¡¦¥ê¥¯¥¨¥¹¥¿¤ò¸¢¸Â¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥Þ¥Ã¥×¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/PolicyFiles\&.html¤Ë¤¢¤ë ++\fBpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢´ÉÍý¼Ô¤ÎGUI¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¥í¡¼¥«¥ë¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò´ÉÍý¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ï\fB\&.policy\fR³ÈÄ¥»Ò¤ò»ý¤Ä¥×¥ì¡¼¥ó¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¡¢¥É¥á¥¤¥óÊ̤˥ê¥â¡¼¥È¡¦¥ê¥¯¥¨¥¹¥¿¤ò¸¢¸Â¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥Þ¥Ã¥×¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/PolicyFiles\&.html¤Ë¤¢¤ë + ¡ÖDefault Policy Implementation and Policy File Syntax¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-file + .RS 4 +-¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¤è¤¦¤Ë\fIpolicytool\fR¤Ë»Ø¼¨¤·¤Þ¤¹¡£ ++¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¤è¤¦¤Ë\fBpolicytool\fR¤Ë»Ø¼¨¤·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/rmic.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/rmic.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: rmic +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: rmic ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "rmic" "1" "2013ǯ11·î21Æü" "JDK 8" "Remote Method Invocation (RMI)" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + rmic \- Java Remote Method Protocol (JRMP)¤Þ¤¿¤ÏInternet Inter\-Orb protocol (IIOP)¤ò»ÈÍѤ¹¤ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¹¥¿¥Ö¡¢¥¹¥±¥ë¥È¥ó¤ª¤è¤ÓTie¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£Object Management Group (OMG)¥¤¥ó¥¿¥Õ¥§¡¼¥¹ÄêµÁ¸À¸ì(IDL)¤âÀ¸À®¤·¤Þ¤¹ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIrmic\fR [ \fIoptions\fR ] \fIpackage\-qualified\-class\-names\fR ++\fBrmic\fR [ \fIoptions\fR ] \fIpackage\-qualified\-class\-names\fR + .fi + .if n \{\ + .RE +@@ -64,26 +66,27 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦\fI¥ª¥×¥·¥ç¥ó\fR¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô\fB¥ª¥×¥·¥ç¥ó\fR¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIpackage\-qualified\-class\-names\fR + .RS 4 + ¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¥¯¥é¥¹Ì¾¡£Îã: +-\fIjava\&.awt\&.Color\fR¡£ ++\fBjava\&.awt\&.Color\fR¡£ + .RE + .SH "ÀâÌÀ" + .PP + \fBÈó¿ä¾©¤Ë´Ø¤¹¤ëÃí°Õ:\fR +-Java Remote Method Protocol (JRMP)¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¤ÎÀÅŪ¤ÊÀ¸À®¤Î¥µ¥Ý¡¼¥È¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£Æ°Åª¤ËÀ¸À®¤µ¤ì¤ëJRMP¥¹¥¿¥Ö¤ò¤«¤ï¤ê¤Ë»ÈÍѤ·¤Æ¡¢JRMP¥Ù¡¼¥¹¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤³¤Î¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍ×À­¤ò¤Ê¤¯¤¹¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fIjava\&.rmi\&.server\&.UnicastRemoteObject\fR»ÅÍÍ(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/server/UnicastRemoteObject\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Remote Method Protocol (JRMP)¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¤ÎÀÅŪ¤ÊÀ¸À®¤Î¥µ¥Ý¡¼¥È¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£Æ°Åª¤ËÀ¸À®¤µ¤ì¤ëJRMP¥¹¥¿¥Ö¤ò¤«¤ï¤ê¤Ë»ÈÍѤ·¤Æ¡¢JRMP¥Ù¡¼¥¹¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤³¤Î¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍ×À­¤ò¤Ê¤¯¤¹¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fBjava\&.rmi\&.server\&.UnicastRemoteObject\fR»ÅÍÍ(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/server/UnicastRemoteObject\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIrmic\fR¥³¥ó¥Ñ¥¤¥é¤Ï¡¢Java Remote Method Protocol (JRMP)¤È¥¹¥¿¥Ö¤ª¤è¤ÓTie¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë(IIOP¥×¥í¥È¥³¥ë)¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¼ÂÁõ¥¯¥é¥¹¤Ç¤¢¤ë¤³¤ì¤é¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥¯¥é¥¹¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤¿¤È¤­¤ËÀ¸À®¤µ¤ì¤Þ¤¹¡£¥ê¥â¡¼¥È¼ÂÁõ¥¯¥é¥¹¤Ï¡¢\fIjava\&.rmi\&.Remote\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£\fIrmic\fR¥³¥Þ¥ó¥É¤Ç¤Î¥¯¥é¥¹Ì¾¤Ï¡¢¤½¤Î¥¯¥é¥¹¤¬\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥ë¤¬À®¸ù¤·¤Æ¤¤¤Æ¡¢¤«¤Ä´°Á´½¤¾þ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Ë¼¨¤¹¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾\fIHelloImpl\fR¤Ç\fIrmic\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢hello¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ÎÉÕ¤¤¤¿)¤Ë\fIHelloImpl_Stub\&.class \fR¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBrmic\fR¥³¥ó¥Ñ¥¤¥é¤Ï¡¢Java Remote Method Protocol (JRMP)¤È¥¹¥¿¥Ö¤ª¤è¤ÓTie¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë(IIOP¥×¥í¥È¥³¥ë)¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¼ÂÁõ¥¯¥é¥¹¤Ç¤¢¤ë¤³¤ì¤é¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥¯¥é¥¹¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤¿¤È¤­¤ËÀ¸À®¤µ¤ì¤Þ¤¹¡£¥ê¥â¡¼¥È¼ÂÁõ¥¯¥é¥¹¤Ï¡¢\fBjava\&.rmi\&.Remote\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£\fBrmic\fR¥³¥Þ¥ó¥É¤Ç¤Î¥¯¥é¥¹Ì¾¤Ï¡¢¤½¤Î¥¯¥é¥¹¤¬\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥ë¤¬À®¸ù¤·¤Æ¤¤¤Æ¡¢¤«¤Ä´°Á´½¤¾þ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Ë¼¨¤¹¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾\fBHelloImpl\fR¤Ç\fBrmic\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢hello¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ÎÉÕ¤¤¤¿)¤Ë\fBHelloImpl_Stub\&.class \fR¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmic hello\&.HelloImpl ++\fBrmic hello\&.HelloImpl\fR ++ + .fi + .if n \{\ + .RE +@@ -95,9 +98,9 @@ + .PP + ¥¹¥¿¥Ö¤È¤Ï¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¯¥é¥¤¥¢¥ó¥È¦¤Ç¤ÎÂåÍý¤Ç¤¹¡£¥¹¥¿¥Ö¤Ï¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¡¢¼Âʪ¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¾ïÃ󤹤륵¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ëÌò³ä¤ò»ý¤Á¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤Ï¡¢¼ÂºÝ¤Ï¥í¡¼¥«¥ë¡¦¥¹¥¿¥Ö¤Ø¤Î»²¾È¤È¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç\fIrmic\fR¥³¥Þ¥ó¥É¤Ï¡¢1\&.2 JRMP¥¹¥¿¥Ö¡¦¥×¥í¥È¥³¥ë¡¦¥Ð¡¼¥¸¥ç¥ó¤Î¤ß¤ò»ÈÍѤ¹¤ë¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fI\-v1\&.2\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸Æ°ºî¤Ç¤¹¡£¥ê¥ê¡¼¥¹5\&.0°ÊÁ°¤Ç¤Ï\fI\-vcompat\fR¥ª¥×¥·¥ç¥ó¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤·¤¿¡£IIOP¥×¥í¥È¥³¥ëÍѤΥ¹¥¿¥Ö¤ª¤è¤ÓTie¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¤Ë¤Ï\fI\-iiop\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç\fBrmic\fR¥³¥Þ¥ó¥É¤Ï¡¢1\&.2 JRMP¥¹¥¿¥Ö¡¦¥×¥í¥È¥³¥ë¡¦¥Ð¡¼¥¸¥ç¥ó¤Î¤ß¤ò»ÈÍѤ¹¤ë¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fB\-v1\&.2\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸Æ°ºî¤Ç¤¹¡£¥ê¥ê¡¼¥¹5\&.0°ÊÁ°¤Ç¤Ï\fB\-vcompat\fR¥ª¥×¥·¥ç¥ó¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤·¤¿¡£IIOP¥×¥í¥È¥³¥ëÍѤΥ¹¥¿¥Ö¤ª¤è¤ÓTie¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¤Ë¤Ï\fB\-iiop\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-¥¹¥¿¥Ö¤Ï¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¤ß¤ò¼ÂÁõ¤·¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¼ÂÁõ¤¹¤ë¥í¡¼¥«¥ë¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¼ÂÁõ¤·¤Æ¤¤¤Þ¤»¤ó¡£JRMP¥¹¥¿¥Ö¤Ï¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¼ÂÁõ¤¹¤ë¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÈƱ¤¸¤â¤Î¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢¥­¥ã¥¹¥È¤ä·¿¥Á¥§¥Ã¥¯¤ËJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÁȤ߹þ¤Þ¤ì¤¿±é»»»Ò¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£IIOP¤Î¾ì¹ç¤Ï¡¢\fIPortableRemoteObject\&.narrow\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥¹¥¿¥Ö¤Ï¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¤ß¤ò¼ÂÁõ¤·¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¼ÂÁõ¤¹¤ë¥í¡¼¥«¥ë¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¼ÂÁõ¤·¤Æ¤¤¤Þ¤»¤ó¡£JRMP¥¹¥¿¥Ö¤Ï¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¼ÂÁõ¤¹¤ë¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÈƱ¤¸¤â¤Î¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢¥­¥ã¥¹¥È¤ä·¿¥Á¥§¥Ã¥¯¤ËJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÁȤ߹þ¤Þ¤ì¤¿±é»»»Ò¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£IIOP¤Î¾ì¹ç¤Ï¡¢\fBPortableRemoteObject\&.narrow\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-bootclasspath \fIpath\fR +@@ -107,8 +110,8 @@ + .PP + \-classpath path + .RS 4 +-\fIrmic\fR¥³¥Þ¥ó¥É¤¬¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ä\fICLASSPATH\fR´Ä¶­ÊÑ¿ôÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥³¥í¥ó¤Çʬ³ä¤·¤Þ¤¹¡£¥Ñ¥¹¤Î°ìÈÌŪ¤Ê·Á¼°¤Ï\fI\&.;<your_path>\fR¤Ç¤¹¡£Îã: +-\fI\&.;/usr/local/java/classes\fR ++\fBrmic\fR¥³¥Þ¥ó¥É¤¬¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ä\fBCLASSPATH\fR´Ä¶­ÊÑ¿ôÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥³¥í¥ó¤Çʬ³ä¤·¤Þ¤¹¡£¥Ñ¥¹¤Î°ìÈÌŪ¤Ê·Á¼°¤Ï\fB\&.;<your_path>\fR¤Ç¤¹¡£Îã: ++\fB\&.;/usr/local/java/classes\fR + .RE + .PP + \-d \fIdirectory\fR +@@ -119,12 +122,13 @@ + .RS 4 + .\} + .nf +-rmic \-d /java/classes exampleclass\&.MyClass ++\fBrmic \-d /java/classes exampleclass\&.MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fI\-d\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ï\fI\-d\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¤ÈƱ¤¸¤Ç¤¹¡£¥¿¡¼¥²¥Ã¥È¡¦¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸³¬Áؤ¬¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢stub/tie/skeleton¥Õ¥¡¥¤¥ë¤¬³ÊǼ¤µ¤ì¤Þ¤¹¡£°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Î\fIrmic\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fI\-d\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸³¬ÁؤϺîÀ®¤µ¤ì¤º¡¢½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ï¤¹¤Ù¤Æ¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËľÀܳÊǼ¤µ¤ì¤Æ¤¤¤Þ¤·¤¿¡£ ++\fB\-d\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ï\fB\-d\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¤ÈƱ¤¸¤Ç¤¹¡£¥¿¡¼¥²¥Ã¥È¡¦¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸³¬Áؤ¬¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢stub/tie/skeleton¥Õ¥¡¥¤¥ë¤¬³ÊǼ¤µ¤ì¤Þ¤¹¡£°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Î\fBrmic\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fB\-d\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸³¬ÁؤϺîÀ®¤µ¤ì¤º¡¢½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ï¤¹¤Ù¤Æ¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËľÀܳÊǼ¤µ¤ì¤Æ¤¤¤Þ¤·¤¿¡£ + .RE + .PP + \-extdirs \fIpath\fR +@@ -139,10 +143,10 @@ + .PP + \-idl + .RS 4 +-\fIrmic\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹¤ª¤è¤Ó»²¾È¤µ¤ì¤¿¥¯¥é¥¹¤ÎOMG IDL¤¬À¸À®¤µ¤ì¤Þ¤¹¡£IDL¤Ç¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë°Í¸¤»¤º¤Ë¡¢Àë¸À¤¹¤ë¤À¤±¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤ÎAPI¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£IDL¤Ï¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Ç¡¼¥¿¤Î»ÅÍͤȤ·¤Æ»ÈÍѤ·¤Þ¤¹¡£CORBA¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÄ󶡤¹¤ëǤ°Õ¤Î¸À¸ì¤Ç¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Ç¡¼¥¿¤ÎºîÀ®¤ª¤è¤Ó¸Æ½Ð¤·¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¸À¸ì¤Ë¤Ï¡¢Java¤ª¤è¤ÓC++¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/mapping/jidlMapping\&.html¤Î ++\fBrmic\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹¤ª¤è¤Ó»²¾È¤µ¤ì¤¿¥¯¥é¥¹¤ÎOMG IDL¤¬À¸À®¤µ¤ì¤Þ¤¹¡£IDL¤Ç¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë°Í¸¤»¤º¤Ë¡¢Àë¸À¤¹¤ë¤À¤±¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤ÎAPI¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£IDL¤Ï¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Ç¡¼¥¿¤Î»ÅÍͤȤ·¤Æ»ÈÍѤ·¤Þ¤¹¡£CORBA¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÄ󶡤¹¤ëǤ°Õ¤Î¸À¸ì¤Ç¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Ç¡¼¥¿¤ÎºîÀ®¤ª¤è¤Ó¸Æ½Ð¤·¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¸À¸ì¤Ë¤Ï¡¢Java¤ª¤è¤ÓC++¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/mapping/jidlMapping\&.html¤Î + ¡ÖJava IDL: IDL to Java Language Mapping¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fI\-idl\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï¡¢Â¾¤Î¥ª¥×¥·¥ç¥ó¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fB\-idl\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï¡¢Â¾¤Î¥ª¥×¥·¥ç¥ó¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -152,7 +156,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´û¸¤Î¥¹¥¿¥Ö/Tie/IDL¤¬ÆþÎÏ¥¯¥é¥¹¤è¤ê¤â¿·¤·¤¤¾ì¹ç¤Ç¤â¡¢\fI\-always\fR¤Þ¤¿¤Ï\fI\-alwaysgenerate\fR¥ª¥×¥·¥ç¥ó¤ÏºÆÀ¸À®¤ò¶¯À©¤·¤Þ¤¹¡£ ++´û¸¤Î¥¹¥¿¥Ö/Tie/IDL¤¬ÆþÎÏ¥¯¥é¥¹¤è¤ê¤â¿·¤·¤¤¾ì¹ç¤Ç¤â¡¢\fB\-always\fR¤Þ¤¿¤Ï\fB\-alwaysgenerate\fR¥ª¥×¥·¥ç¥ó¤ÏºÆÀ¸À®¤ò¶¯À©¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -163,7 +167,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-factory\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢À¸À®¤µ¤ì¤¿IDL¤Ç\fIfactory\fR¥­¡¼¥ï¡¼¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fB\-factory\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢À¸À®¤µ¤ì¤¿IDL¤Ç\fBfactory\fR¥­¡¼¥ï¡¼¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -174,15 +178,10 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-The +-\fI\-idlModule\fR +-from J\fIavaPackage[\&.class]\fR +-\fItoIDLModule\fR +-specifies +-\fIIDLEntity\fR +-package mapping, for example: +-\fI\-idlModule\fR +-\fImy\&.module my::real::idlmod\fR\&. ++J\fBavaPackage[\&.class]\fR ++\fBtoIDLModule\fR¤Î\fB\-idlModule\fR¤Ï\fBIDLEntity\fR¥Ñ¥Ã¥±¡¼¥¸¡¦¥Þ¥Ã¥Ô¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£Îã: ++\fB\-idlModule\fR ++\fBmy\&.module my::real::idlmod\fR + .RE + .sp + .RS 4 +@@ -193,27 +192,25 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-idlFile\fR +-\fIfromJavaPackage[\&.class] toIDLFile\fR +-specifies +-\fIIDLEntity\fR +-file mapping, for example: +-\fI\-idlFile test\&.pkg\&.X TEST16\&.idl\fR\&. ++\fB\-idlFile\fR ++\fBfromJavaPackage[\&.class] toIDLFile\fR¤Ï\fBIDLEntity\fR¥Õ¥¡¥¤¥ë¡¦¥Þ¥Ã¥Ô¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£Îã: ++\fB\-idlFile test\&.pkg\&.X TEST16\&.idl\fR + .RE + .RE + .PP + \-iiop + .RS 4 +-\fIrmic\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢JRMP¤Î¥¹¥¿¥Ö¤È¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¤Î¤«¤ï¤ê¤Ë¡¢IIOP¤Î¥¹¥¿¥Ö¤ÈTie¥¯¥é¥¹¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤Ï¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¡¼¥«¥ë¡¦¥×¥í¥­¥·¤Ç¡¢¥¯¥é¥¤¥¢¥ó¥È¤«¤é¥µ¡¼¥Ð¡¼¤Ë¸Æ½Ð¤·¤òÁ÷¿®¤¹¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£³Æ¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ï¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤¬É¬ÍפǤ¹¡£¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤Ë¤è¤Ã¤Æ¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬¼ÂÁõ¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¤Ç¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ò»²¾È¤¹¤ë¤È¤­¤Ï¡¢¥¹¥¿¥Ö¤ò»²¾È¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¥¿¥¤¡¦¥¯¥é¥¹¤Ï¡¢¥µ¡¼¥Ð¡¼Â¦¤ÇÃå¸Æ¤ò½èÍý¤·¡¢¤½¤Î¸Æ½Ð¤·¤òŬÀڤʼÂÁõ¥¯¥é¥¹¤Ë¥Ç¥£¥¹¥Ñ¥Ã¥Á¤¹¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£³Æ¼ÂÁõ¥¯¥é¥¹¤Ë¤Ï¡¢¥¿¥¤¡¦¥¯¥é¥¹¤¬É¬ÍפǤ¹¡£ ++\fBrmic\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢JRMP¤Î¥¹¥¿¥Ö¤È¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¤Î¤«¤ï¤ê¤Ë¡¢IIOP¤Î¥¹¥¿¥Ö¤ÈTie¥¯¥é¥¹¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤Ï¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¡¼¥«¥ë¡¦¥×¥í¥­¥·¤Ç¡¢¥¯¥é¥¤¥¢¥ó¥È¤«¤é¥µ¡¼¥Ð¡¼¤Ë¸Æ½Ð¤·¤òÁ÷¿®¤¹¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£³Æ¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ï¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤¬É¬ÍפǤ¹¡£¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤Ë¤è¤Ã¤Æ¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬¼ÂÁõ¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¤Ç¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ò»²¾È¤¹¤ë¤È¤­¤Ï¡¢¥¹¥¿¥Ö¤ò»²¾È¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¥¿¥¤¡¦¥¯¥é¥¹¤Ï¡¢¥µ¡¼¥Ð¡¼Â¦¤ÇÃå¸Æ¤ò½èÍý¤·¡¢¤½¤Î¸Æ½Ð¤·¤òŬÀڤʼÂÁõ¥¯¥é¥¹¤Ë¥Ç¥£¥¹¥Ñ¥Ã¥Á¤¹¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£³Æ¼ÂÁõ¥¯¥é¥¹¤Ë¤Ï¡¢¥¿¥¤¡¦¥¯¥é¥¹¤¬É¬ÍפǤ¹¡£ + .sp +-\fI\-iiop\fR¤ò»ÈÍѤ·¤Æ\fIrmic\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¼¡¤Î̿̾µ¬Â§¤Ë½àµò¤·¤¿¥¹¥¿¥Ö¤ÈTie¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++\fB\-iiop\fR¤ò»ÈÍѤ·¤Æ\fBrmic\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¼¡¤Î̿̾µ¬Â§¤Ë½àµò¤·¤¿¥¹¥¿¥Ö¤ÈTie¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-_<implementationName>_stub\&.class +-_<interfaceName>_tie\&.class ++\fB_<implementationName>_stub\&.class\fR ++\fB_<interfaceName>_tie\&.class\fR ++ + .fi + .if n \{\ + .RE +@@ -227,7 +224,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-iiop\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï¡¢Â¾¤Î¥ª¥×¥·¥ç¥ó¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fB\-iiop\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï¡¢Â¾¤Î¥ª¥×¥·¥ç¥ó¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -238,7 +235,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´û¸¤Î¥¹¥¿¥Ö/Tie/IDL¤¬ÆþÎÏ¥¯¥é¥¹¤è¤ê¤â¿·¤·¤¤¾ì¹ç¤Ç¤â¡¢\fI\-always\fR¤Þ¤¿¤Ï\fI\-alwaysgenerate\fR¥ª¥×¥·¥ç¥ó¤ÏºÆÀ¸À®¤ò¶¯À©¤·¤Þ¤¹¡£ ++´û¸¤Î¥¹¥¿¥Ö/Tie/IDL¤¬ÆþÎÏ¥¯¥é¥¹¤è¤ê¤â¿·¤·¤¤¾ì¹ç¤Ç¤â¡¢\fB\-always\fR¤Þ¤¿¤Ï\fB\-alwaysgenerate\fR¥ª¥×¥·¥ç¥ó¤ÏºÆÀ¸À®¤ò¶¯À©¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -249,7 +246,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-nolocalstubs\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢Æ±¤¸¥×¥í¥»¥¹¤Î¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ËºÇŬ²½¤µ¤ì¤¿¥¹¥¿¥Ö¤ÏºîÀ®¤µ¤ì¤Þ¤»¤ó¡£ ++\fB\-nolocalstubs\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢Æ±¤¸¥×¥í¥»¥¹¤Î¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ËºÇŬ²½¤µ¤ì¤¿¥¹¥¿¥Ö¤ÏºîÀ®¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -260,7 +257,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-idl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢Á÷¿®¤µ¤ì¤ëIDL¤Ë\fIvaluetype\fR¥á¥½¥Ã¥É¤ª¤è¤Ó½é´ü²½»Ò¤òÄɲäǤ­¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤ª¤è¤Ó½é´ü²½»Ò¤Ï¡¢valuetype¤Î¾ì¹ç¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£\fI\-idl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë\fI\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤êÀ¸À®¤µ¤ì¤Þ¤¹¡£ ++\fB\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-idl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢Á÷¿®¤µ¤ì¤ëIDL¤Ë\fBvaluetype\fR¥á¥½¥Ã¥É¤ª¤è¤Ó½é´ü²½»Ò¤òÄɲäǤ­¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤ª¤è¤Ó½é´ü²½»Ò¤Ï¡¢valuetype¤Î¾ì¹ç¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£\fB\-idl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë\fB\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤êÀ¸À®¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -271,23 +268,23 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-poa\fR¥ª¥×¥·¥ç¥ó¤Ï·Ñ¾µ¤ò\fIorg\&.omg\&.CORBA_2_3\&.portable\&.ObjectImpl\fR¤«¤é\fIorg\&.omg\&.PortableServer\&.Servant\fR¤ËÊѹ¹¤·¤Þ¤¹¡£¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤Î\fIPortableServer\fR¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¤Î\fIServant\fR·¿¤òÄêµÁ¤·¤Þ¤¹¡£Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢\fIServant\fR·¿¤ÏJava¤Î\fIorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤Ë¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤ÎPOA¥µ¡¼¥Ð¥ó¥È¼ÂÁõ¤Î¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤È¤·¤Æµ¡Ç½¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¸Æ¤Ó½Ð¤¹¤³¤È¤Î¤Ç¤­¤ë¤¤¤¯¤Ä¤«¤Î¥á¥½¥Ã¥É¡¢¤ª¤è¤ÓPOA¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¡¢¥µ¡¼¥Ð¥ó¥È¤ÎÆ°ºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë¥æ¡¼¥¶¡¼¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤ë¥á¥½¥Ã¥É¤òÄ󶡤·¤Þ¤¹¡£OMG IDL to Java Language Mapping Specification¡¢CORBA V 2\&.3\&.1 ptc/00\-01\-08\&.pdf¤Ë½àµò¤·¤Æ¤¤¤Þ¤¹¡£ ++\fB\-poa\fR¥ª¥×¥·¥ç¥ó¤Ï·Ñ¾µ¤ò\fBorg\&.omg\&.CORBA_2_3\&.portable\&.ObjectImpl\fR¤«¤é\fBorg\&.omg\&.PortableServer\&.Servant\fR¤ËÊѹ¹¤·¤Þ¤¹¡£¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤Î\fBPortableServer\fR¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¤Î\fBServant\fR·¿¤òÄêµÁ¤·¤Þ¤¹¡£Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢\fBServant\fR·¿¤ÏJava¤Î\fBorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤Ë¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤ÎPOA¥µ¡¼¥Ð¥ó¥È¼ÂÁõ¤Î¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤È¤·¤Æµ¡Ç½¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¸Æ¤Ó½Ð¤¹¤³¤È¤Î¤Ç¤­¤ë¤¤¤¯¤Ä¤«¤Î¥á¥½¥Ã¥É¡¢¤ª¤è¤ÓPOA¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¡¢¥µ¡¼¥Ð¥ó¥È¤ÎÆ°ºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë¥æ¡¼¥¶¡¼¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤ë¥á¥½¥Ã¥É¤òÄ󶡤·¤Þ¤¹¡£OMG IDL to Java Language Mapping Specification¡¢CORBA V 2\&.3\&.1 ptc/00\-01\-08\&.pdf¤Ë½àµò¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .RE + .PP + \-J + .RS 4 +-Java¥³¥Þ¥ó¥É¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢\fI\-J\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-J\fR¤Î¸å¤í¤Ë³¤¯°ú¿ô¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤ËÅϤ·¤Þ¤¹(\fI\-J\fR¤È°ú¿ô¤Î´Ö¤Ë¥¹¥Ú¡¼¥¹¤ÏÆþ¤ì¤Þ¤»¤ó)¡£ ++Java¥³¥Þ¥ó¥É¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢\fB\-J\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-J\fR¤Î¸å¤í¤Ë³¤¯°ú¿ô¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤ËÅϤ·¤Þ¤¹(\fB\-J\fR¤È°ú¿ô¤Î´Ö¤Ë¥¹¥Ú¡¼¥¹¤ÏÆþ¤ì¤Þ¤»¤ó)¡£ + .RE + .PP + \-keep or \-keepgenerated + .RS 4 +-¥¹¥¿¥Ö¡¢¥¹¥±¥ë¥È¥ó¡¢¤Þ¤¿¤ÏTie¥¯¥é¥¹¤Î¤¿¤á¤ËÀ¸À®¤µ¤ì¤¿\fI\&.java\fR¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÊÝ»ý¤·¡¢\fI\&.class\fR¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë½ñ¤­¹þ¤ß¤Þ¤¹¡£ ++¥¹¥¿¥Ö¡¢¥¹¥±¥ë¥È¥ó¡¢¤Þ¤¿¤ÏTie¥¯¥é¥¹¤Î¤¿¤á¤ËÀ¸À®¤µ¤ì¤¿\fB\&.java\fR¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÊÝ»ý¤·¡¢\fB\&.class\fR¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë½ñ¤­¹þ¤ß¤Þ¤¹¡£ + .RE + .PP + \-nowarn + .RS 4 +-·Ù¹ð¤ò¥ª¥Õ¤Ë¤·¤Þ¤¹¡£\fI\-nowarn\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¡£¥³¥ó¥Ñ¥¤¥é¤Ï·Ù¹ð¤òɽ¼¨¤·¤Þ¤»¤ó¡£ ++·Ù¹ð¤ò¥ª¥Õ¤Ë¤·¤Þ¤¹¡£\fB\-nowarn\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¡£¥³¥ó¥Ñ¥¤¥é¤Ï·Ù¹ð¤òɽ¼¨¤·¤Þ¤»¤ó¡£ + .RE + .PP + \-nowrite +@@ -307,7 +304,7 @@ + .PP + \-v1\&.1 (Èó¿ä¾©) + .RS 4 +-1\&.1 JRMP¥¹¥¿¥Ö¡¦¥×¥í¥È¥³¥ë¡¦¥Ð¡¼¥¸¥ç¥ó¤Î¤ß¤Î¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£\fI\-v1\&.1\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢JDK 1\&.1¤«¤é\fIrmic\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¡¢¥¢¥Ã¥×¥°¥ì¡¼¥É¤Ç¤­¤Ê¤¤(¤µ¤é¤Ë¥À¥¤¥Ê¥ß¥Ã¥¯¡¦¥¯¥é¥¹¡¦¥í¡¼¥Ç¥£¥ó¥°¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤)¡¢´û¸¤ÎÀÅŪ¥Ç¥×¥í¥¤¤µ¤ì¤¿¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤ËÂФ·¡¢Ä¾Î󲽸ߴ¹À­¤Î¤¢¤ë¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£Ãí°Õ:¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++1\&.1 JRMP¥¹¥¿¥Ö¡¦¥×¥í¥È¥³¥ë¡¦¥Ð¡¼¥¸¥ç¥ó¤Î¤ß¤Î¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£\fB\-v1\&.1\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢JDK 1\&.1¤«¤é\fBrmic\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¡¢¥¢¥Ã¥×¥°¥ì¡¼¥É¤Ç¤­¤Ê¤¤(¤µ¤é¤Ë¥À¥¤¥Ê¥ß¥Ã¥¯¡¦¥¯¥é¥¹¡¦¥í¡¼¥Ç¥£¥ó¥°¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤)¡¢´û¸¤ÎÀÅŪ¥Ç¥×¥í¥¤¤µ¤ì¤¿¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤ËÂФ·¡¢Ä¾Î󲽸ߴ¹À­¤Î¤¢¤ë¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£Ãí°Õ:¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-v1\&.2 (Èó¿ä¾©) +@@ -319,7 +316,7 @@ + CLASSPATH + .RS 4 + ¥æ¡¼¥¶¡¼ÄêµÁ¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ò¥·¥¹¥Æ¥à¤Ë»ØÄꤷ¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£Îã: +-\fI\&.:/usr/local/java/classes\fR ++\fB\&.:/usr/local/java/classes\fR + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/rmid.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/rmid.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: rmid +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: rmid ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "rmid" "1" "2013ǯ11·î21Æü" "JDK 8" "Remote Method Invocation (RMI)" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-rmid \- µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤¹¤ë¤È¡¢¥ª¥Ö¥¸¥§¥¯¥È¤òJava²¾ÁÛ¥Þ¥·¥ó(VM)¤ËÅÐÏ¿¤·¤Æ¥¢¥¯¥Æ¥£¥Ö²½¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.SH "̾Á°" ++rmid \- µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤¹¤ë¤È¡¢¥ª¥Ö¥¸¥§¥¯¥È¤òJava Virtual Machine(VM)¤ËÅÐÏ¿¤·¤Æ¥¢¥¯¥Æ¥£¥Ö²½¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIrmid\fR [\fIoptions\fR] ++\fBrmid\fR [\fIoptions\fR] + .fi + .if n \{\ + .RE +@@ -64,48 +66,50 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤·¤Þ¤¹¡£µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤·¤Æ¤«¤é¤Ç¤Ê¤¤¤È¡¢¥¢¥¯¥Æ¥£¥Ö²½²Äǽ¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥¯¥Æ¥£¥Ö²½¥·¥¹¥Æ¥à¤ËÅÐÏ¿¤·¤¿¤ê¡¢JVMÆâ¤Ç¥¢¥¯¥Æ¥£¥Ö²½¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£¥¢¥¯¥Æ¥£¥Ö²½²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ¹¤ë¥×¥í¥°¥é¥à¤ÎºîÀ®ÊýË¡¤Î¾ÜºÙ¤Ï¡¢\fI¥¢¥¯¥Æ¥£¥Ö²½¤Î»ÈÍÑ\fR¤Ë´Ø¤¹¤ë¥Á¥å¡¼¥È¥ê¥¢¥ë(http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/rmi/activation/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ ++\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤·¤Þ¤¹¡£µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤·¤Æ¤«¤é¤Ç¤Ê¤¤¤È¡¢¥¢¥¯¥Æ¥£¥Ö²½²Äǽ¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥¯¥Æ¥£¥Ö²½¥·¥¹¥Æ¥à¤ËÅÐÏ¿¤·¤¿¤ê¡¢JVMÆâ¤Ç¥¢¥¯¥Æ¥£¥Ö²½¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£¥¢¥¯¥Æ¥£¥Ö²½²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ¹¤ë¥×¥í¥°¥é¥à¤ÎºîÀ®ÊýË¡¤Î¾ÜºÙ¤Ï¡¢\fI¥¢¥¯¥Æ¥£¥Ö²½¤Î»ÈÍÑ\fR¤Ë´Ø¤¹¤ë¥Á¥å¡¼¥È¥ê¥¢¥ë(http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/rmi/activation/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-\fIrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢¼¡¤Î¤è¤¦¤Ë¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Æ¡¢¥Ç¡¼¥â¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢¼¡¤Î¤è¤¦¤Ë¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Æ¡¢¥Ç¡¼¥â¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-J\-Djava\&.security\&.policy=rmid\&.policy ++\fBrmid \-J\-Djava\&.security\&.policy=rmid\&.policy\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIrmid\fR¥³¥Þ¥ó¥É¤ÎOracle¤Î¼ÂÁõ¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬µ¯Æ°¥°¥ë¡¼¥×ÍѤËJVM¤òµ¯Æ°¤¹¤ë¤¿¤á¤Ë³Æ\fIActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤǤ­¤ë¤«¤É¤¦¤«¤ò¸¡¾Ú¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ç¤¹Æäˡ¢\fIActivationGroupDesc\fR¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÅϤµ¤ì¤ë\fICommandEnvironment\fR¤äǤ°Õ¤Î¥×¥í¥Ñ¥Æ¥£¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÃæ¤ÇÌÀ¼¨Åª¤Ëµö²Ä¤¹¤ë¤³¤È¤¬É¬Íפˤʤê¤Þ¤·¤¿¡£\fIsun\&.rmi\&.activation\&.execPolicy\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢µ¯Æ°¥°¥ë¡¼¥×ÍѤËJVM¤òµ¯Æ°¤¹¤ë¤¿¤á¤Ë\fIActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤǤ­¤ë¤«¤É¤¦¤«¤òȽÃǤ¹¤ë¤È¤­¤Ë\fIrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ý¥ê¥·¡¼¤ò·èÄꤷ¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\-J\-Dsun\&.rmi\&.activation\&.execPolicy=policy¥ª¥×¥·¥ç¥ó¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤ÎOracle¤Î¼ÂÁõ¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬µ¯Æ°¥°¥ë¡¼¥×ÍѤËJVM¤òµ¯Æ°¤¹¤ë¤¿¤á¤Ë³Æ\fBActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤǤ­¤ë¤«¤É¤¦¤«¤ò¸¡¾Ú¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ç¤¹Æäˡ¢\fBActivationGroupDesc\fR¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÅϤµ¤ì¤ë\fBCommandEnvironment\fR¤äǤ°Õ¤Î¥×¥í¥Ñ¥Æ¥£¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÃæ¤ÇÌÀ¼¨Åª¤Ëµö²Ä¤¹¤ë¤³¤È¤¬É¬Íפˤʤê¤Þ¤·¤¿¡£\fBsun\&.rmi\&.activation\&.execPolicy\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢µ¯Æ°¥°¥ë¡¼¥×ÍѤËJVM¤òµ¯Æ°¤¹¤ë¤¿¤á¤Ë\fBActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤǤ­¤ë¤«¤É¤¦¤«¤òȽÃǤ¹¤ë¤È¤­¤Ë\fBrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ý¥ê¥·¡¼¤ò·èÄꤷ¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\-J\-Dsun\&.rmi\&.activation\&.execPolicy=policy¥ª¥×¥·¥ç¥ó¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È1098¤Ç¥¢¥¯¥Æ¥£¥Ù¡¼¥¿¤ÈÆâÉô¥ì¥¸¥¹¥È¥ê¤¬µ¯Æ°¤µ¤ì¡¢\fIActivationSystem\fR¤¬¤³¤ÎÆâÉô¥ì¥¸¥¹¥È¥êÆâ¤Î̾Á°\fIjava\&.rmi\&.activation\&.ActivationSystem\fR¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È1098¤Ç¥¢¥¯¥Æ¥£¥Ù¡¼¥¿¤ÈÆâÉô¥ì¥¸¥¹¥È¥ê¤¬µ¯Æ°¤µ¤ì¡¢\fBActivationSystem\fR¤¬¤³¤ÎÆâÉô¥ì¥¸¥¹¥È¥êÆâ¤Î̾Á°\fBjava\&.rmi\&.activation\&.ActivationSystem\fR¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Þ¤¹¡£ + .PP +-¥ì¥¸¥¹¥È¥ê¤Ë¾¤Î¥Ý¡¼¥È¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë\fI\-port\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥ì¥¸¥¹¥È¥ê¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È1099¤Ç¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤È¥ì¥¸¥¹¥È¥ê¤òµ¯Æ°¤·¤Þ¤¹¡£ ++¥ì¥¸¥¹¥È¥ê¤Ë¾¤Î¥Ý¡¼¥È¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë\fB\-port\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥ì¥¸¥¹¥È¥ê¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È1099¤Ç¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤È¥ì¥¸¥¹¥È¥ê¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-J\-Djava\&.security\&.policy=rmid\&.policy \-port 1099 ++\fBrmid \-J\-Djava\&.security\&.policy=rmid\&.policy \-port 1099\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "ɬÍפ˱þ¤¸¤ÆRMID¤ò³«»Ï" + .PP +-\fIrmid\fR¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é³«»Ï¤¹¤ë¤Ë¤Ï¡¢\fIinetd\fR +-(Oracle Solaris¤Î¾ì¹ç)¡¢¤Þ¤¿¤Ï\fIxinetd\fR +-(Linux¤Î¾ì¹ç)¤ò¹½À®¤·¤Æ\fIrmid\fR¤òɬÍפ˱þ¤¸¤Æ³«»Ï¤¹¤ëÊýË¡¤â¤¢¤ê¤Þ¤¹¡£ ++\fBrmid\fR¤ò¥³¥Þ¥ó¥É¹Ô¤«¤é³«»Ï¤¹¤ë¤Ë¤Ï¡¢\fBinetd\fR ++(Oracle Solaris¤Î¾ì¹ç)¡¢¤Þ¤¿¤Ï\fBxinetd\fR ++(Linux¤Î¾ì¹ç)¤ò¹½À®¤·¤Æ\fBrmid\fR¤òɬÍפ˱þ¤¸¤Æ³«»Ï¤¹¤ëÊýË¡¤â¤¢¤ê¤Þ¤¹¡£ + .PP +-RMID¤ò³«»Ï¤¹¤ë¤È¡¢\fISystem\&.inheritedChannel\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë(\fIinetd\fR/\fIxinetd\fR¤«¤é·Ñ¾µ)¤ò¼èÆÀ¤·¤è¤¦¤È¤·¤Þ¤¹¡£·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë¤¬null¤Ç¤¢¤ë¤«¡¢\fIjava\&.nio\&.channels\&.ServerSocketChannel\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¤Ê¤«¤Ã¤¿¾ì¹ç¡¢RMID¤Ï¤½¤Î¥Á¥ã¥ó¥Í¥ë¤Ï\fIinetd\fR/\fIxinetd\fR¤Ë¤è¤Ã¤Æµ¯Æ°¤µ¤ì¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¤ÈȽÃǤ·¡¢Á°½Ò¤Î¤è¤¦¤Ëµ¯Æ°¤·¤Þ¤¹¡£ ++RMID¤ò³«»Ï¤¹¤ë¤È¡¢\fBSystem\&.inheritedChannel\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë(\fBinetd\fR/\fBxinetd\fR¤«¤é·Ñ¾µ)¤ò¼èÆÀ¤·¤è¤¦¤È¤·¤Þ¤¹¡£·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë¤¬null¤Ç¤¢¤ë¤«¡¢\fBjava\&.nio\&.channels\&.ServerSocketChannel\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¤Ê¤«¤Ã¤¿¾ì¹ç¡¢RMID¤Ï¤½¤Î¥Á¥ã¥ó¥Í¥ë¤Ï\fBinetd\fR/\fBxinetd\fR¤Ë¤è¤Ã¤Æµ¯Æ°¤µ¤ì¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¤ÈȽÃǤ·¡¢Á°½Ò¤Î¤è¤¦¤Ëµ¯Æ°¤·¤Þ¤¹¡£ + .PP +-·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë¤¬\fIServerSocketChannel\fR¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢RMID¤Ï¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¢¤Ä¤Þ¤ê\fIjava\&.rmi\&.activation\&.ActivationSystem\fR¤¬¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ë¥ì¥¸¥¹¥È¥ê¤È\fIjava\&.rmi\&.activation\&.Activator\fR¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë¥ê¥¯¥¨¥¹¥È¤ò¼õ¿®¤¹¤ë¥µ¡¼¥Ð¡¼¡¦¥½¥±¥Ã¥È¤È¤·¤Æ¡¢\fIServerSocketChannel\fR¤«¤é¼èÆÀ¤·¤¿\fIjava\&.net\&.ServerSocket\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢RMID¤ÎÆ°ºî¤Ï¡¢¼¡¤Î¤³¤È¤ò½ü¤¤¤Æ¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤éµ¯Æ°¤·¤¿¾ì¹ç¤ÈƱ¤¸¤Ç¤¹¡£ ++·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë¤¬\fBServerSocketChannel\fR¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢RMID¤Ï¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¢¤Ä¤Þ¤ê\fBjava\&.rmi\&.activation\&.ActivationSystem\fR¤¬¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ë¥ì¥¸¥¹¥È¥ê¤È\fBjava\&.rmi\&.activation\&.Activator\fR¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë¥ê¥¯¥¨¥¹¥È¤ò¼õ¿®¤¹¤ë¥µ¡¼¥Ð¡¼¡¦¥½¥±¥Ã¥È¤È¤·¤Æ¡¢\fBServerSocketChannel\fR¤«¤é¼èÆÀ¤·¤¿\fBjava\&.net\&.ServerSocket\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢RMID¤ÎÆ°ºî¤Ï¡¢¼¡¤Î¤³¤È¤ò½ü¤¤¤Æ¡¢¥³¥Þ¥ó¥É¹Ô¤«¤éµ¯Æ°¤·¤¿¾ì¹ç¤ÈƱ¤¸¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -115,7 +119,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fISystem\&.err\fR¤ËÂФ¹¤ë½ÐÎϤϡ¢¥Õ¥¡¥¤¥ë¤Ë¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤ë¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï\fIjava\&.io\&.tmpdir\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç»ØÄꤵ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê(Ä̾ï¤Ï\fI/var/tmp\fR¤Þ¤¿¤Ï\fI/tmp\fR)¤Ë¤¢¤ë¡£¥Õ¥¡¥¤¥ë̾¤ÎÀÜƬ¼­¤Ï\fIrmid\-err\fR¤Ç¡¢ÀÜÈø¼­¤Ï\fItmp\fR¤Ç¤¢¤ë¡£ ++\fBSystem\&.err\fR¤ËÂФ¹¤ë½ÐÎϤϡ¢¥Õ¥¡¥¤¥ë¤Ë¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤ë¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï\fBjava\&.io\&.tmpdir\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç»ØÄꤵ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê(Ä̾ï¤Ï\fB/var/tmp\fR¤Þ¤¿¤Ï\fB/tmp\fR)¤Ë¤¢¤ë¡£¥Õ¥¡¥¤¥ë̾¤ÎÀÜƬ¼­¤Ï\fBrmid\-err\fR¤Ç¡¢ÀÜÈø¼­¤Ï\fBtmp\fR¤Ç¤¢¤ë¡£ + .RE + .sp + .RS 4 +@@ -126,7 +130,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-port\fR¥ª¥×¥·¥ç¥ó¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢RMID¤Ï¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Æ½ªÎ»¤·¤Þ¤¹¡£ ++\fB\-port\fR¥ª¥×¥·¥ç¥ó¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢RMID¤Ï¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Æ½ªÎ»¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -137,34 +141,36 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-log\fR¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢RMID¤Ï¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Æ½ªÎ»¤·¤Þ¤¹¡£ ++\fB\-log\fR¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢RMID¤Ï¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Æ½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP +-ɬÍפ˱þ¤¸¤Æ¥µ¡¼¥Ó¥¹¤ò³«»Ï¤¹¤ë¤è¤¦¤Ë¹½À®¤¹¤ëÊýË¡¤Î¾ÜºÙ¤Ï¡¢\fIinetd\fR +-(Oracle Solaris¤Î¾ì¹ç)¡¢¤Þ¤¿¤Ï\fIxinetd\fR ++ɬÍפ˱þ¤¸¤Æ¥µ¡¼¥Ó¥¹¤ò³«»Ï¤¹¤ë¤è¤¦¤Ë¹½À®¤¹¤ëÊýË¡¤Î¾ÜºÙ¤Ï¡¢\fBinetd\fR ++(Oracle Solaris¤Î¾ì¹ç)¡¢¤Þ¤¿¤Ï\fBxinetd\fR + (Linux)¤Î¥Þ¥Ë¥å¥¢¥ë¡¦¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-C\fI¥ª¥×¥·¥ç¥ó\fR + .RS 4 +-\fIrmid\fR¥³¥Þ¥ó¥É¤Î»Ò¥×¥í¥»¥¹(µ¯Æ°¥°¥ë¡¼¥×)¤¬ºîÀ®¤µ¤ì¤¿¤È¤­¤Ë¡¢¤½¤ì¤¾¤ì¤Î»Ò¥×¥í¥»¥¹¤Ë¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤ë¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤹ¤ë¤È¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë³Æ²¾ÁÛ¥Þ¥·¥ó¤Ë¥×¥í¥Ñ¥Æ¥£¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤Î»Ò¥×¥í¥»¥¹(µ¯Æ°¥°¥ë¡¼¥×)¤¬ºîÀ®¤µ¤ì¤¿¤È¤­¤Ë¡¢¤½¤ì¤¾¤ì¤Î»Ò¥×¥í¥»¥¹¤Ë¥³¥Þ¥ó¥É¹Ô°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤ë¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤹ¤ë¤È¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë³Æ²¾ÁÛ¥Þ¥·¥ó¤Ë¥×¥í¥Ñ¥Æ¥£¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-C\-Dsome\&.property=value ++\fBrmid \-C\-Dsome\&.property=value\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤ò»Ò¥×¥í¥»¥¹¤ËÅϤ¹µ¡Ç½¤Ï¡¢¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î»ÒJVM¤Çserver\-call¥í¥®¥ó¥°¤¬²Äǽ¤Ç¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô°ú¿ô¤ò»Ò¥×¥í¥»¥¹¤ËÅϤ¹µ¡Ç½¤Ï¡¢¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î»ÒJVM¤Çserver\-call¥í¥®¥ó¥°¤¬²Äǽ¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-C\-Djava\&.rmi\&.server\&.logCalls=true ++\fBrmid \-C\-Djava\&.rmi\&.server\&.logCalls=true\fR ++ + .fi + .if n \{\ + .RE +@@ -173,13 +179,14 @@ + .PP + \-J\fIoption\fR + .RS 4 +-RMID¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava¥¤¥ó¥¿¥×¥ê¥¿¤ËÅϤ¹¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬\fIrmid\&.policy\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë»ØÄꤹ¤ë¤Ë¤Ï¡¢\fIrmid\fR¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fIjava\&.security\&.policy\fR¥×¥í¥Ñ¥Æ¥£¤òÄêµÁ¤·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ ++RMID¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava¥¤¥ó¥¿¥×¥ê¥¿¤ËÅϤ¹¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬\fBrmid\&.policy\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë»ØÄꤹ¤ë¤Ë¤Ï¡¢\fBrmid\fR¤Î¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fBjava\&.security\&.policy\fR¥×¥í¥Ñ¥Æ¥£¤òÄêµÁ¤·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-J\-Djava\&.security\&.policy\-rmid\&.policy ++\fBrmid \-J\-Djava\&.security\&.policy\-rmid\&.policy\fR ++ + .fi + .if n \{\ + .RE +@@ -188,7 +195,7 @@ + .PP + \-J\-Dsun\&.rmi\&.activation\&.execPolicy=\fIpolicy\fR + .RS 4 +-µ¯Æ°¥°¥ë¡¼¥×¤¬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ëJVM¤Îµ¯Æ°¤Ë»ÈÍѤ¹¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤¿¤á¤Ë¡¢RMID¤¬ºÎÍѤ¹¤ë¥Ý¥ê¥·¡¼¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java RMIµ¯Æ°¥Ç¡¼¥â¥ó¤ÎOracle¤Î¼ÂÁõ¤Î¤ß¤Ë¸ºß¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¤³¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢·ë²Ì¤Ï\fI\-J\-Dsun\&.rmi\&.activation\&.execPolicy=default\fR¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£\fIpolicy\fR¤Ë»ØÄê²Äǽ¤ÊÃͤϡ¢\fIdefault\fR¡¢\fIpolicyClassName\fR¤Þ¤¿¤Ï\fInone\fR¤Ç¤¹¡£ ++µ¯Æ°¥°¥ë¡¼¥×¤¬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ëJVM¤Îµ¯Æ°¤Ë»ÈÍѤ¹¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤¿¤á¤Ë¡¢RMID¤¬ºÎÍѤ¹¤ë¥Ý¥ê¥·¡¼¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java RMIµ¯Æ°¥Ç¡¼¥â¥ó¤ÎOracle¤Î¼ÂÁõ¤Î¤ß¤Ë¸ºß¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¥³¥Þ¥ó¥É¹Ô¤Ë¤³¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢·ë²Ì¤Ï\fB\-J\-Dsun\&.rmi\&.activation\&.execPolicy=default\fR¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£\fBpolicy\fR¤Ë»ØÄê²Äǽ¤ÊÃͤϡ¢\fBdefault\fR¡¢\fBpolicyClassName\fR¤Þ¤¿¤Ï\fBnone\fR¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -200,65 +207,66 @@ + .\} + ¥Ç¥Õ¥©¥ë¥È + .sp +-\fIdefault\fR¤Þ¤¿¤Ï̤»ØÄêÃͤÎ\fIexecPolicy\fR¤Î¾ì¹ç¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤Ç¤­¤ë¤Î¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¡¢¼Â¹Ô¤¹¤ë¸¢¸Â¤¬\fIrmid\fR¤ËÍ¿¤¨¤é¤ì¤Æ¤¤¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Î¤ß¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¼Â¹Ô¥Ý¥ê¥·¡¼¤Ç»ÈÍѤǤ­¤ë¤Î¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îµ¯Æ°¥°¥ë¡¼¥×¼ÂÁõ¤Î¤ß¤Ç¤¹¡£ ++\fBdefault\fR¤Þ¤¿¤Ï̤»ØÄêÃͤÎ\fBexecPolicy\fR¤Î¾ì¹ç¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤Ç¤­¤ë¤Î¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¡¢¼Â¹Ô¤¹¤ë¸¢¸Â¤¬\fBrmid\fR¤ËÍ¿¤¨¤é¤ì¤Æ¤¤¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Î¤ß¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¼Â¹Ô¥Ý¥ê¥·¡¼¤Ç»ÈÍѤǤ­¤ë¤Î¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îµ¯Æ°¥°¥ë¡¼¥×¼ÂÁõ¤Î¤ß¤Ç¤¹¡£ + .sp +-\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×ÍѤÎJVM¤òµ¯Æ°¤¹¤ë¤È¤­¤Ë¡¢¤½¤Î¥°¥ë¡¼¥×¤Ë¤Ä¤¤¤ÆÅÐÏ¿¤µ¤ì¤¿µ¯Æ°¥°¥ë¡¼¥×µ­½Ò»Ò¤Ç¤¢¤ë\fIActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤ·¤Þ¤¹¡£¥°¥ë¡¼¥×µ­½Ò»Ò¤Ï¡¢\fIActivationGroupDesc\&.CommandEnvironment\fR¤ò»ØÄꤷ¤Þ¤¹(¾Êά²Äǽ)¡£¤³¤ì¤Ë¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¥³¥Þ¥ó¥É¤È¡¢¤½¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤ËÄɲäǤ­¤ë¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ï\fIjava\&.home\fR¤Ë¤¢¤ë\fIjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£¥°¥ë¡¼¥×µ­½Ò»Ò¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¥ª¥×¥·¥ç¥ó¤È¤·¤ÆÄɲ䵤ì¤ë¥×¥í¥Ñ¥Æ¥£¡¦¥ª¡¼¥Ð¡¼¥é¥¤¥É¤â´Þ¤Þ¤ì¤Þ¤¹(\fI\-D<property>=<value>\fR¤È¤·¤ÆÄêµÁ¤µ¤ì¤Þ¤¹)¡£\fIcom\&.sun\&.rmi\&.rmid\&.ExecPermission\fR¸¢¸Â¤Ï\fIrmid\fR¥³¥Þ¥ó¥É¤Ë¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Ë¥°¥ë¡¼¥×µ­½Ò»Ò¤Î\fICommandEnvironment\fR¤Ç»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òÉÕÍ¿¤·¤Þ¤¹¡£\fIcom\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR¸¢¸Â¤Ïµ¯Æ°¥°¥ë¡¼¥×¤Î³«»Ï»þ¤Ë¡¢¥°¥ë¡¼¥×µ­½Ò»Ò¤Ç¥×¥í¥Ñ¥Æ¥£¡¦¥ª¡¼¥Ð¡¼¥é¥¤¥É¤È¤·¤Æ¡¢¤Þ¤¿¤Ï\fICommandEnvironment\fR¤Ç¥ª¥×¥·¥ç¥ó¤È¤·¤Æ»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Þ¤¹¡£\fIrmid\fR¥³¥Þ¥ó¥É¤ËÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òÉÕÍ¿¤¹¤ë¾ì¹ç¡¢¸¢¸Â\fIExecPermission\fR¤ª¤è¤Ó\fIExecOptionPermission\fR¤ò¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥½¡¼¥¹¤ËÉÕÍ¿¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×ÍѤÎJVM¤òµ¯Æ°¤¹¤ë¤È¤­¤Ë¡¢¤½¤Î¥°¥ë¡¼¥×¤Ë¤Ä¤¤¤ÆÅÐÏ¿¤µ¤ì¤¿µ¯Æ°¥°¥ë¡¼¥×µ­½Ò»Ò¤Ç¤¢¤ë\fBActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤ·¤Þ¤¹¡£¥°¥ë¡¼¥×µ­½Ò»Ò¤Ï¡¢\fBActivationGroupDesc\&.CommandEnvironment\fR¤ò»ØÄꤷ¤Þ¤¹(¾Êά²Äǽ)¡£¤³¤ì¤Ë¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¥³¥Þ¥ó¥É¤È¡¢¤½¤Î¥³¥Þ¥ó¥É¹Ô¤ËÄɲäǤ­¤ë¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ï\fBjava\&.home\fR¤Ë¤¢¤ë\fBjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£¥°¥ë¡¼¥×µ­½Ò»Ò¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ë¥ª¥×¥·¥ç¥ó¤È¤·¤ÆÄɲ䵤ì¤ë¥×¥í¥Ñ¥Æ¥£¡¦¥ª¡¼¥Ð¡¼¥é¥¤¥É¤â´Þ¤Þ¤ì¤Þ¤¹(\fB\-D<property>=<value>\fR¤È¤·¤ÆÄêµÁ¤µ¤ì¤Þ¤¹)¡£\fBcom\&.sun\&.rmi\&.rmid\&.ExecPermission\fR¸¢¸Â¤Ï\fBrmid\fR¥³¥Þ¥ó¥É¤Ë¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Ë¥°¥ë¡¼¥×µ­½Ò»Ò¤Î\fBCommandEnvironment\fR¤Ç»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òÉÕÍ¿¤·¤Þ¤¹¡£\fBcom\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR¸¢¸Â¤Ïµ¯Æ°¥°¥ë¡¼¥×¤Î³«»Ï»þ¤Ë¡¢¥°¥ë¡¼¥×µ­½Ò»Ò¤Ç¥×¥í¥Ñ¥Æ¥£¡¦¥ª¡¼¥Ð¡¼¥é¥¤¥É¤È¤·¤Æ¡¢¤Þ¤¿¤Ï\fBCommandEnvironment\fR¤Ç¥ª¥×¥·¥ç¥ó¤È¤·¤Æ»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Þ¤¹¡£\fBrmid\fR¥³¥Þ¥ó¥É¤ËÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òÉÕÍ¿¤¹¤ë¾ì¹ç¡¢¸¢¸Â\fBExecPermission\fR¤ª¤è¤Ó\fBExecOptionPermission\fR¤ò¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥½¡¼¥¹¤ËÉÕÍ¿¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + \fBExecPermission\fR + .sp +-\fIExecPermission\fR¥¯¥é¥¹¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Ë\fIrmid\fR¥³¥Þ¥ó¥É¤¬ÆÃÄê¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òɽ¤·¤Þ¤¹¡£ ++\fBExecPermission\fR¥¯¥é¥¹¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Ë\fBrmid\fR¥³¥Þ¥ó¥É¤¬ÆÃÄê¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òɽ¤·¤Þ¤¹¡£ + .sp + \fB¹½Ê¸\fR: +-\fIExecPermission\fR¤Î̾Á°¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ë¼Â¹Ô¤òµö²Ä¤¹¤ë¥³¥Þ¥ó¥É¤Î¥Ñ¥¹Ì¾¤Ç¤¹¡£¥¹¥é¥Ã¥·¥å(/)¤ª¤è¤Ó¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ç½ª¤ï¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£¥¹¥é¥Ã¥·¥å¤Ï¥Õ¥¡¥¤¥ë¶èÀÚ¤êʸ»ú\fIFile\&.separatorChar\fR¤Ç¤¹¡£¥¹¥é¥Ã¥·¥å(/)¤ª¤è¤Ó¥Þ¥¤¥Ê¥¹Éä¹æ(\-)¤Ç½ª¤ï¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤È¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(ºÆµ¢Åª¤Ë)¤ò¼¨¤·¤Þ¤¹¡£¥Ñ¥¹Ì¾¤ËÆÃÊ̤ʥȡ¼¥¯¥ó\fI<<ALL FILES>>\fR¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£ ++\fBExecPermission\fR¤Î̾Á°¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ë¼Â¹Ô¤òµö²Ä¤¹¤ë¥³¥Þ¥ó¥É¤Î¥Ñ¥¹Ì¾¤Ç¤¹¡£¥¹¥é¥Ã¥·¥å(/)¤ª¤è¤Ó¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ç½ª¤ï¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£¥¹¥é¥Ã¥·¥å¤Ï¥Õ¥¡¥¤¥ë¶èÀÚ¤êʸ»ú\fBFile\&.separatorChar\fR¤Ç¤¹¡£¥¹¥é¥Ã¥·¥å(/)¤ª¤è¤Ó¥Þ¥¤¥Ê¥¹Éä¹æ(\-)¤Ç½ª¤ï¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤È¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(ºÆµ¢Åª¤Ë)¤ò¼¨¤·¤Þ¤¹¡£Æüì¤Ê¥È¡¼¥¯¥ó\fB<<ALL FILES>>\fR¤Ç¹½À®¤µ¤ì¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤É¤Î¥Õ¥¡¥¤¥ë¤È¤â°ìÃפ·¤Þ¤¹¡£ + .sp + ¥Ñ¥¹Ì¾¤Ë¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£¥Ñ¥¹Ì¾¤Ë¥Þ¥¤¥Ê¥¹Éä¹æ(\-)¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ª¤è¤Ó(ºÆµ¢Åª¤Ë)¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤È¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤·¤Þ¤¹¡£ + .sp + \fBExecOptionPermission\fR + .sp +-\fIExecOptionPermission\fR¥¯¥é¥¹¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤È¤­¤Ë\fIrmid\fR¥³¥Þ¥ó¥É¤ÇÆÃÄê¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¸¢¸Â¤òɽ¤·¤Þ¤¹¡£\fIExecOptionPermission\fR¤Î̾Á°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ÎÃͤǤ¹¡£ ++\fBExecOptionPermission\fR¥¯¥é¥¹¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤È¤­¤Ë\fBrmid\fR¥³¥Þ¥ó¥É¤ÇÆÃÄê¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¸¢¸Â¤òɽ¤·¤Þ¤¹¡£\fBExecOptionPermission\fR¤Î̾Á°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ÎÃͤǤ¹¡£ + .sp + \fB¹½Ê¸\fR: ¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É¤¬¸ÂÄêŪ¤Ë¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É¡¦¥Þ¥Ã¥Á¤òɽ¤·¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ï¡¢¥ª¥×¥·¥ç¥ó̾¤½¤Î¤â¤Î¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢Ç¤°Õ¤Î¥ª¥×¥·¥ç¥ó¤òɽ¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¥ª¥×¥·¥ç¥ó̾¤ÎËöÈø¤Ë»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¥É¥Ã¥È(\&.)¤«Åù¹æ(=)¤Îľ¸å¤Ë¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + Îã: +-\fI*\fR¤ä\fI\-Dmydir\&.*\fR¤ä\fI\-Da\&.b\&.c=*\fR¤ÏÍ­¸ú¤Ç¤¹¤¬¡¢\fI*mydir\fR¤ä\fI\-Da*b\fR¤ä\fIab*\fR¤Ï̵¸ú¤Ç¤¹¡£ ++\fB*\fR¤ä\fB\-Dmydir\&.*\fR¤ä\fB\-Da\&.b\&.c=*\fR¤ÏÍ­¸ú¤Ç¤¹¤¬¡¢\fB*mydir\fR¤ä\fB\-Da*b\fR¤ä\fBab*\fR¤Ï̵¸ú¤Ç¤¹¡£ + .sp + \fBrmid¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë\fR + .sp +-\fIrmid\fR¥³¥Þ¥ó¥É¤ËÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òµö²Ä¤¹¤ë¾ì¹ç¤Ï¡¢¸¢¸Â\fIExecPermission\fR¤ª¤è¤Ó\fIExecOptionPermission\fR¤ò¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥½¡¼¥¹¤ËÉÕÍ¿¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(ÈÆÍÑŪ¤Ë)¡£¤³¤ì¤é¤Î¸¢¸Â¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤Î¤Ï\fIrmid\fR¥³¥Þ¥ó¥É¤Î¤ß¤Ê¤Î¤Ç¡¢¤³¤ì¤é¤Î¸¢¸Â¤òÈÆÍÑŪ¤ËÉÕÍ¿¤·¤Æ¤â°ÂÁ´¤Ç¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤ËÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òµö²Ä¤¹¤ë¾ì¹ç¤Ï¡¢¸¢¸Â\fBExecPermission\fR¤ª¤è¤Ó\fBExecOptionPermission\fR¤ò¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥½¡¼¥¹¤ËÉÕÍ¿¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(ÈÆÍÑŪ¤Ë)¡£¤³¤ì¤é¤Î¸¢¸Â¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤Î¤Ï\fBrmid\fR¥³¥Þ¥ó¥É¤Î¤ß¤Ê¤Î¤Ç¡¢¤³¤ì¤é¤Î¸¢¸Â¤òÈÆÍÑŪ¤ËÉÕÍ¿¤·¤Æ¤â°ÂÁ´¤Ç¤¹¡£ + .sp +-\fIrmid\fR¥³¥Þ¥ó¥É¤Ë³Æ¼ï¤Î¼Â¹Ô¸¢¸Â¤òÉÕÍ¿¤¹¤ë¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÎã¤ò¡¢¼¡¤Ë¼¨¤·¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤Ë³Æ¼ï¤Î¼Â¹Ô¸¢¸Â¤òÉÕÍ¿¤¹¤ë¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÎã¤ò¡¢¼¡¤Ë¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-grant { +- permission com\&.sun\&.rmi\&.rmid\&.ExecPermission +- "/files/apps/java/jdk1\&.7\&.0/solaris/bin/java"; ++\fBgrant {\fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecPermission\fR ++\fB "/files/apps/java/jdk1\&.7\&.0/solaris/bin/java";\fR ++\fB \fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecPermission\fR ++\fB "/files/apps/rmidcmds/*";\fR ++\fB \fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR ++\fB "\-Djava\&.security\&.policy=/files/policies/group\&.policy";\fR ++\fB \fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR ++\fB "\-Djava\&.security\&.debug=*";\fR ++\fB \fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR ++\fB "\-Dsun\&.rmi\&.*";\fR ++\fB};\fR + +- permission com\&.sun\&.rmi\&.rmid\&.ExecPermission +- "/files/apps/rmidcmds/*"; +- +- permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission +- "\-Djava\&.security\&.policy=/files/policies/group\&.policy"; +- +- permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission +- "\-Djava\&.security\&.debug=*"; +- +- permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission +- "\-Dsun\&.rmi\&.*"; +-}; + .fi + .if n \{\ + .RE + .\} +-ºÇ½é¤ËÉÕÍ¿¤µ¤ì¤Æ¤¤¤ë¸¢¸Â¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¡¢¥Ñ¥¹Ì¾¤Ë¤è¤êÌÀ¼¨Åª¤Ë»ØÄꤵ¤ì¤ë\fIjava\fR¥³¥Þ¥ó¥É¤Î1\&.7\&.0¥ê¥ê¡¼¥¹¤Î¼Â¹Ô¤òµö²Ä¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjava\&.home\fR¤Ë¤¢¤ë¥Ð¡¼¥¸¥ç¥ó¤Î\fIjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£\fIrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¤Î¤ÈƱ¤¸¥Ð¡¼¥¸¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¤¿¤á¡¢¤½¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£2ÈÖÌܤθ¢¸Â¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢¥Ç¥£¥ì¥¯¥È¥ê\fI/files/apps/rmidcmds\fRÆâ¤ÎǤ°Õ¤Î¥³¥Þ¥ó¥É¤Î¼Â¹Ô¸¢¸Â¤òµö²Ä¤·¤Þ¤¹¡£ ++ºÇ½é¤ËÉÕÍ¿¤µ¤ì¤Æ¤¤¤ë¸¢¸Â¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¡¢¥Ñ¥¹Ì¾¤Ë¤è¤êÌÀ¼¨Åª¤Ë»ØÄꤵ¤ì¤ë\fBjava\fR¥³¥Þ¥ó¥É¤Î1\&.7\&.0¥ê¥ê¡¼¥¹¤Î¼Â¹Ô¤òµö²Ä¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjava\&.home\fR¤Ë¤¢¤ë¥Ð¡¼¥¸¥ç¥ó¤Î\fBjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£\fBrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¤Î¤ÈƱ¤¸¥Ð¡¼¥¸¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¤¿¤á¡¢¤½¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£2ÈÖÌܤθ¢¸Â¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢¥Ç¥£¥ì¥¯¥È¥ê\fB/files/apps/rmidcmds\fRÆâ¤ÎǤ°Õ¤Î¥³¥Þ¥ó¥É¤Î¼Â¹Ô¸¢¸Â¤òµö²Ä¤·¤Þ¤¹¡£ + .sp +-3ÈÖÌܤËÉÕÍ¿¤µ¤ì¤Æ¤¤¤ë¸¢¸Â\fIExecOptionPermission\fR¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò\fI/files/policies/group\&.policy\fR¤È¤·¤ÆÄêµÁ¤·¤Æ¤¤¤ëµ¯Æ°¥°¥ë¡¼¥×¤Î³«»Ï¤òµö²Ä¤·¤Þ¤¹¡£¼¡¤Î¸¢¸Â¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤¬\fIjava\&.security\&.debug property\fR¤ò»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£ºÇ¸å¤Î¸¢¸Â¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤¬\fIsun\&.rmi property\fR̾¤Î³¬ÁØÆâ¤ÎǤ°Õ¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£ ++3ÈÖÌܤËÉÕÍ¿¤µ¤ì¤Æ¤¤¤ë¸¢¸Â\fBExecOptionPermission\fR¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò\fB/files/policies/group\&.policy\fR¤È¤·¤ÆÄêµÁ¤·¤Æ¤¤¤ëµ¯Æ°¥°¥ë¡¼¥×¤Î³«»Ï¤òµö²Ä¤·¤Þ¤¹¡£¼¡¤Î¸¢¸Â¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤¬\fBjava\&.security\&.debug property\fR¤ò»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£ºÇ¸å¤Î¸¢¸Â¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤¬\fBsun\&.rmi property\fR̾¤Î³¬ÁØÆâ¤ÎǤ°Õ¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£ + .sp +-¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Æ\fIrmid\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢\fIrmid\fR¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjava\&.security\&.policy\fR¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ ++¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Æ\fBrmid\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢\fBrmid\fR¤Î¥³¥Þ¥ó¥É¹Ô¤Ç\fBjava\&.security\&.policy\fR¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ + .sp +-\fIrmid \-J\-Djava\&.security\&.policy=rmid\&.policy\fR\&. ++\fBrmid \-J\-Djava\&.security\&.policy=rmid\&.policy\fR\&. + .RE + .sp + .RS 4 +@@ -271,21 +279,22 @@ + .\} + <policyClassName> + .sp +-¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤Ï½½Ê¬¤Ê½ÀÆðÀ­¤¬ÆÀ¤é¤ì¤Ê¤¤¾ì¹ç¡¢´ÉÍý¼Ô¤Ï¡¢\fIrmid\fR¤Îµ¯Æ°»þ¤Ë¡¢\fIcheckExecCommand\fR¥á¥½¥Ã¥É¤¬½ê°¤¹¤ë¥¯¥é¥¹¤Î̾Á°¤ò»ØÄꤷ¤Æ¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤Ï½½Ê¬¤Ê½ÀÆðÀ­¤¬ÆÀ¤é¤ì¤Ê¤¤¾ì¹ç¡¢´ÉÍý¼Ô¤Ï¡¢\fBrmid\fR¤Îµ¯Æ°»þ¤Ë¡¢\fBcheckExecCommand\fR¥á¥½¥Ã¥É¤¬½ê°¤¹¤ë¥¯¥é¥¹¤Î̾Á°¤ò»ØÄꤷ¤Æ¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-\fIpolicyClassName\fR¤Ë¤Ï¡¢°ú¿ô¤Ê¤·¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤ò»ý¤Á¡¢¼¡¤Î¤è¤¦¤Ê\fIcheckExecCommand\fR¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ëpublic¥¯¥é¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBpolicyClassName\fR¤Ë¤Ï¡¢°ú¿ô¤Ê¤·¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤ò»ý¤Á¡¢¼¡¤Î¤è¤¦¤Ê\fBcheckExecCommand\fR¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ëpublic¥¯¥é¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- public void checkExecCommand(ActivationGroupDesc desc, String[] command) +- throws SecurityException; ++\fB public void checkExecCommand(ActivationGroupDesc desc, String[] command)\fR ++\fB throws SecurityException;\fR ++ + .fi + .if n \{\ + .RE + .\} +-µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ëÁ°¤Ë¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ý¥ê¥·¡¼¤Î\fIcheckExecCommand\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤Î¤È¤­¡¢µ¯Æ°¥°¥ë¡¼¥×¤Îµ­½Ò»Ò¤È¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Î´°Á´¤Ê¥³¥Þ¥ó¥É¤ò´Þ¤àÇÛÎó¤ò¤½¤Î¥á¥½¥Ã¥É¤ËÅϤ·¤Þ¤¹¡£\fIcheckExecCommand\fR¤¬\fISecurityException\fR¤ò¥¹¥í¡¼¤¹¤ë¤È¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¤½¤Îµ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤»¤º¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Îµ¯Æ°¤ò»î¹Ô¤·¤Æ¤¤¤ë¸Æ½Ð¤·Â¦¤Ë¤Ï\fIActivationException\fR¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ ++µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ëÁ°¤Ë¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ý¥ê¥·¡¼¤Î\fBcheckExecCommand\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤Î¤È¤­¡¢µ¯Æ°¥°¥ë¡¼¥×¤Îµ­½Ò»Ò¤È¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Î´°Á´¤Ê¥³¥Þ¥ó¥É¤ò´Þ¤àÇÛÎó¤ò¤½¤Î¥á¥½¥Ã¥É¤ËÅϤ·¤Þ¤¹¡£\fBcheckExecCommand\fR¤¬\fBSecurityException\fR¤ò¥¹¥í¡¼¤¹¤ë¤È¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¤½¤Îµ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤»¤º¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Îµ¯Æ°¤ò»î¹Ô¤·¤Æ¤¤¤ë¸Æ½Ð¤·Â¦¤Ë¤Ï\fBActivationException\fR¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -298,28 +307,29 @@ + .\} + none + .sp +-\fIsun\&.rmi\&.activation\&.execPolicy\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬\fInone\fR¤Î¾ì¹ç¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¥³¥Þ¥ó¥É¤ò¤Þ¤Ã¤¿¤¯¸¡¾Ú¤·¤Þ¤»¤ó¡£ ++\fBsun\&.rmi\&.activation\&.execPolicy\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬\fBnone\fR¤Î¾ì¹ç¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¥³¥Þ¥ó¥É¤ò¤Þ¤Ã¤¿¤¯¸¡¾Ú¤·¤Þ¤»¤ó¡£ + .RE + .RE + .PP + \-log \fIdir\fR + .RS 4 +-µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤¬¥Ç¡¼¥¿¥Ù¡¼¥¹¤ª¤è¤Ó´ØÏ¢¾ðÊó¤ò½ñ¤­¹þ¤à¤Î¤Ë»ÈÍѤ¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ë¡¢log¤È¤¤¤¦¥í¥°¡¦¥Ç¥£¥ì¥¯¥È¥ê¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ ++µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤¬¥Ç¡¼¥¿¥Ù¡¼¥¹¤ª¤è¤Ó´ØÏ¢¾ðÊó¤ò½ñ¤­¹þ¤à¤Î¤Ë»ÈÍѤ¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ë¡¢log¤È¤¤¤¦¥í¥°¡¦¥Ç¥£¥ì¥¯¥È¥ê¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-port \fIport\fR + .RS 4 +-¥ì¥¸¥¹¥È¥ê¤¬»ÈÍѤ¹¤ë¥Ý¡¼¥È¤ò»ØÄꤷ¤Þ¤¹¡£µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤Ï¡¢¤³¤Î¥ì¥¸¥¹¥È¥ê¤ÎÃæ¤Ç¡¢\fIjava\&.rmi\&.activation\&.ActivationSystem\fR¤È¤¤¤¦Ì¾Á°¤Ç\fIActivationSystem\fR¤ò¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£¥í¡¼¥«¥ë¡¦¥Þ¥·¥ó¾å¤Î\fIActivationSystem\fR¤Ï¡¢¼¡¤Î¤è¤¦¤Ë\fINaming\&.lookup\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤Ã¤Æ¼èÆÀ¤Ç¤­¤Þ¤¹¡£ ++¥ì¥¸¥¹¥È¥ê¤¬»ÈÍѤ¹¤ë¥Ý¡¼¥È¤ò»ØÄꤷ¤Þ¤¹¡£µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤Ï¡¢¤³¤Î¥ì¥¸¥¹¥È¥ê¤ÎÃæ¤Ç¡¢\fBjava\&.rmi\&.activation\&.ActivationSystem\fR¤È¤¤¤¦Ì¾Á°¤Ç\fBActivationSystem\fR¤ò¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£¥í¡¼¥«¥ë¡¦¥Þ¥·¥ó¾å¤Î\fBActivationSystem\fR¤Ï¡¢¼¡¤Î¤è¤¦¤Ë\fBNaming\&.lookup\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤Ã¤Æ¼èÆÀ¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-import java\&.rmi\&.*; +- import java\&.rmi\&.activation\&.*; ++\fBimport java\&.rmi\&.*; \fR ++\fB import java\&.rmi\&.activation\&.*;\fR ++\fB \fR ++\fB ActivationSystem system; system = (ActivationSystem)\fR ++\fB Naming\&.lookup("//:port/java\&.rmi\&.activation\&.ActivationSystem");\fR + +- ActivationSystem system; system = (ActivationSystem) +- Naming\&.lookup("//:port/java\&.rmi\&.activation\&.ActivationSystem"); + .fi + .if n \{\ + .RE +@@ -328,14 +338,14 @@ + .PP + \-stop + .RS 4 +-\fI\-port\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿¥Ý¡¼¥È¤Î¡¢¸½ºß¤Î\fIrmid\fR¥³¥Þ¥ó¥É¤Î¸Æ½Ð¤·¤òÄä»ß¤·¤Þ¤¹¡£¥Ý¡¼¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ý¡¼¥È1098¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë\fIrmid\fR¤Î¸Æ½Ð¤·¤òÄä»ß¤·¤Þ¤¹¡£ ++\fB\-port\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿¥Ý¡¼¥È¤Î¡¢¸½ºß¤Î\fBrmid\fR¥³¥Þ¥ó¥É¤Î¸Æ½Ð¤·¤òÄä»ß¤·¤Þ¤¹¡£¥Ý¡¼¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ý¡¼¥È1098¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë\fBrmid\fR¤Î¸Æ½Ð¤·¤òÄä»ß¤·¤Þ¤¹¡£ + .RE + .SH "´Ä¶­ÊÑ¿ô" + .PP + CLASSPATH + .RS 4 + ¥æ¡¼¥¶¡¼ÄêµÁ¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ò¥·¥¹¥Æ¥à¤Ë»ØÄꤷ¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£Îã: +-\fI\&.:/usr/local/java/classes\fR ++\fB\&.:/usr/local/java/classes\fR + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/rmiregistry.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/rmiregistry.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: rmiregistry +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: rmiregistry ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "rmiregistry" "1" "2013ǯ11·î21Æü" "JDK 8" "Remote Method Invocation (RMI)" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + rmiregistry \- ¸½ºß¤Î¥Û¥¹¥È¤Î»ØÄꤷ¤¿¥Ý¡¼¥È¾å¤Ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤ò³«»Ï¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIrmiregistry\fR [ \fIport\fR ] ++\fBrmiregistry\fR [ \fIport\fR ] + .fi + .if n \{\ + .RE +@@ -64,17 +66,18 @@ + .PP + \fIport\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤ò³«»Ï¤¹¤ë¸½ºß¤Î¥Û¥¹¥È¾å¤Î\fIport\fR¤Î¿ô¡£ ++¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤ò³«»Ï¤¹¤ë¸½ºß¤Î¥Û¥¹¥È¾å¤Î\fBport\fR¤Î¿ô¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIrmiregistry\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥Û¥¹¥È¤Î»ØÄꤷ¤¿¥Ý¡¼¥È¾å¤Ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤òºîÀ®¤·¡¢³«»Ï¤·¤Þ¤¹¡£port¤Î»ØÄê¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥ì¥¸¥¹¥È¥ê¤Ï¥Ý¡¼¥È1099¤Ç³«»Ï¤·¤Þ¤¹¡£\fIrmiregistry\fR¥³¥Þ¥ó¥É¤Ë¡¢½ÐÎϵ¡Ç½¤Ï¤¢¤ê¤Þ¤»¤ó¡£Ä̾¤³¤ì¤Ï¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ ++\fBrmiregistry\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥Û¥¹¥È¤Î»ØÄꤷ¤¿¥Ý¡¼¥È¾å¤Ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤òºîÀ®¤·¡¢³«»Ï¤·¤Þ¤¹¡£port¤Î»ØÄê¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥ì¥¸¥¹¥È¥ê¤Ï¥Ý¡¼¥È1099¤Ç³«»Ï¤·¤Þ¤¹¡£\fBrmiregistry\fR¥³¥Þ¥ó¥É¤Ë¡¢½ÐÎϵ¡Ç½¤Ï¤¢¤ê¤Þ¤»¤ó¡£Ä̾¤³¤ì¤Ï¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmiregistry & ++\fBrmiregistry &\fR ++ + .fi + .if n \{\ + .RE +@@ -84,14 +87,14 @@ + .PP + ¥ì¥¸¥¹¥È¥ê¤Ï¡¢°ìÈÌŪ¤Ë¡¢ºÇ½é¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î°ÌÃÖ¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤³¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤½¤Î¸å¡¢¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó»ØÄê¤Î¥µ¥Ý¡¼¥È¤òÄ󶡤·¡¢Â¾¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òõ¤·¤Þ¤¹¡£ + .PP +-\fIjava\&.rmi\&.registry\&.LocateRegistry\fR¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¡¢¤Þ¤¿¤Ï¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤È¥Ý¡¼¥È¤ÇÆ°ºî¤¹¤ë¥ì¥¸¥¹¥È¥ê¤ò¼èÆÀ¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ ++\fBjava\&.rmi\&.registry\&.LocateRegistry\fR¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¡¢¤Þ¤¿¤Ï¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤È¥Ý¡¼¥È¤ÇÆ°ºî¤¹¤ë¥ì¥¸¥¹¥È¥ê¤ò¼èÆÀ¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ + .PP +-\fIjava\&.rmi\&.Naming\fR¥¯¥é¥¹¤ÎURL¥Ù¡¼¥¹¡¦¥á¥½¥Ã¥É¤Ï¥ì¥¸¥¹¥È¥ê¤ËÂФ·¤ÆÁàºî¤ò¼Â¹Ô¤·¡¢Ç¤°Õ¤Î¥Û¥¹¥È¤ª¤è¤Ó¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ç¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¸¡º÷¤Ë»ÈÍѤǤ­¤Þ¤¹¡£Ã±½ã̾(ʸ»úÎó)¤ò¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥Ð¥¤¥ó¥É¤·¡¢¿·¤·¤¤Ì¾Á°¤ò¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ËºÆ¥Ð¥¤¥ó¥É¤·(¸Å¤¤¥Ð¥¤¥ó¥É¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É)¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥ó¥Ð¥¤¥ó¥É¤·¡¢¥ì¥¸¥¹¥È¥ê¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ëURL¤ò¥ê¥¹¥Èɽ¼¨¤·¤Þ¤¹¡£ ++\fBjava\&.rmi\&.Naming\fR¥¯¥é¥¹¤ÎURL¥Ù¡¼¥¹¡¦¥á¥½¥Ã¥É¤Ï¥ì¥¸¥¹¥È¥ê¤ËÂФ·¤ÆÁàºî¤ò¼Â¹Ô¤·¡¢Ç¤°Õ¤Î¥Û¥¹¥È¤ª¤è¤Ó¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ç¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¸¡º÷¤Ë»ÈÍѤǤ­¤Þ¤¹¡£Ã±½ã̾(ʸ»úÎó)¤ò¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥Ð¥¤¥ó¥É¤·¡¢¿·¤·¤¤Ì¾Á°¤ò¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ËºÆ¥Ð¥¤¥ó¥É¤·(¸Å¤¤¥Ð¥¤¥ó¥É¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É)¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥ó¥Ð¥¤¥ó¥É¤·¡¢¥ì¥¸¥¹¥È¥ê¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ëURL¤ò¥ê¥¹¥Èɽ¼¨¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-J + .RS 4 +-Java¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢\fI\-J\fR¤Î¸å¤í¤Ë³¤¯¥ª¥×¥·¥ç¥ó¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤Ë°ú¤­ÅϤ·¤Þ¤¹(\fI\-J\fR¤È¥ª¥×¥·¥ç¥ó¤Î´Ö¤Ë¥¹¥Ú¡¼¥¹¤ÏÆþ¤ì¤Þ¤»¤ó)¡£ ++Java¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢\fB\-J\fR¤Î¸å¤í¤Ë³¤¯¥ª¥×¥·¥ç¥ó¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤Ë°ú¤­ÅϤ·¤Þ¤¹(\fB\-J\fR¤È¥ª¥×¥·¥ç¥ó¤Î´Ö¤Ë¥¹¥Ú¡¼¥¹¤ÏÆþ¤ì¤Þ¤»¤ó)¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +@@ -114,7 +117,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI¡Öjava\&.rmi\&.registry\&.LocateRegistry¡×\fR(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/registry/LocateRegistry\&.html) ++\fB¡Öjava\&.rmi\&.registry\&.LocateRegistry¡×\fR(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/registry/LocateRegistry\&.html) + .RE + .sp + .RS 4 +@@ -125,7 +128,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI¡Öjava\&.rmi\&.Naming class description¡×\fR(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/Naming\&.html) ++\fB¡Öjava\&.rmi\&.Naming class description¡×\fR(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/Naming\&.html) + .RE + .br + 'pl 8.5i +--- ./jdk/src/linux/doc/man/ja/schemagen.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/schemagen.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: schemagen +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: schemagen ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "schemagen" "1" "2013ǯ11·î21Æü" "JDK 8" "Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + schemagen \- Java¥¯¥é¥¹Æâ¤Ç»²¾È¤µ¤ì¤Æ¤¤¤ë¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤´¤È¤Ë¥¹¥­¡¼¥Þ¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIschemagen\fR [ \fIoptions\fR ] \fIjava\-files\fR ++\fBschemagen\fR [ \fIoptions\fR ] \fIjava\-files\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIjava\-files\fR +@@ -76,40 +78,41 @@ + ¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤Ï¡¢Java¥¯¥é¥¹Æâ¤Ç»²¾È¤µ¤ì¤Æ¤¤¤ë¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤´¤È¤Ë1¤Ä¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£¸½ºß¡¢À¸À®¤µ¤ì¤ë¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ÏÀ©¸æ¤Ç¤­¤Þ¤»¤ó¡£¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë̾¤òÀ©¸æ¤¹¤ë¾ì¹ç¤Ï¡¢http://jaxb\&.java\&.net/nonav/2\&.2\&.3u1/docs/schemagenTask\&.html¤Ë¤¢¤ë + ¡ÖUsing SchemaGen with Ant¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Îbin¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ëŬÀÚ¤Ê\fIschemagen\fR¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤Æ¡¢¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤òµ¯Æ°¤·¤Þ¤¹¡£¸½ºß¤Î¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¤¤º¤ì¤â½èÍý¤Ç¤­¤Þ¤¹¡£ ++¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Îbin¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ëŬÀÚ¤Ê\fBschemagen\fR¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤Æ¡¢¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤òµ¯Æ°¤·¤Þ¤¹¡£¸½ºß¤Î¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¤¤º¤ì¤â½èÍý¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-schemagen\&.sh Foo\&.java Bar\&.java \&.\&.\&. +-Note: Writing schema1\&.xsd ++\fBschemagen\&.sh Foo\&.java Bar\&.java \&.\&.\&.\fR ++\fBNote: Writing schema1\&.xsd\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-java¥Õ¥¡¥¤¥ë¤¬Â¾¤Î¥¯¥é¥¹¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ì¤é¤Î¥¯¥é¥¹¤Ë¥·¥¹¥Æ¥à\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤Ç¥¢¥¯¥»¥¹¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ\fIschemagen\fR¥³¥Þ¥ó¥É¡¦¥é¥¤¥ó¤Ç»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£»²¾È¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¡¢¤Þ¤¿¤Ï»²¾È¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¹¥­¡¼¥Þ¤ÎÀ¸À®»þ¤Ë¥¨¥é¡¼¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++java¥Õ¥¡¥¤¥ë¤¬Â¾¤Î¥¯¥é¥¹¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ì¤é¤Î¥¯¥é¥¹¤Ë¥·¥¹¥Æ¥à\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤Ç¥¢¥¯¥»¥¹¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ\fBschemagen\fR¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£»²¾È¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¡¢¤Þ¤¿¤Ï»²¾È¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¹¥­¡¼¥Þ¤ÎÀ¸À®»þ¤Ë¥¨¥é¡¼¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-d \fIpath\fR + .RS 4 +-\fIschemagen\fR¥³¥Þ¥ó¥É¤¬¥×¥í¥»¥Ã¥µÀ¸À®¤ª¤è¤Ó\fIjavac\fRÀ¸À®¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ ++\fBschemagen\fR¥³¥Þ¥ó¥É¤¬¥×¥í¥»¥Ã¥µÀ¸À®¤ª¤è¤Ó\fBjavac\fRÀ¸À®¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ + .RE + .PP + \-cp \fIpath\fR + .RS 4 +-\fIschemagen\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼»ØÄê¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ ++\fBschemagen\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼»ØÄê¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ + .RE + .PP + \-classpath \fIpath\fR + .RS 4 +-\fIschemagen\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼»ØÄê¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ ++\fBschemagen\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼»ØÄê¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ + .RE + .PP + \-encoding \fIencoding\fR + .RS 4 +-\fIapt\fR¤Þ¤¿¤Ï\fIjavac\fR¥³¥Þ¥ó¥É¤Î¸Æ½Ð¤·¤Ë»ÈÍѤ¹¤ë¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBapt\fR¤Þ¤¿¤Ï\fBjavac\fR¥³¥Þ¥ó¥É¤Î¸Æ½Ð¤·¤Ë»ÈÍѤ¹¤ë¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-episode \fIfile\fR +--- ./jdk/src/linux/doc/man/ja/serialver.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/serialver.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: serialver +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: serialver ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "serialver" "1" "2013ǯ11·î21Æü" "JDK 8" "Remote Method Invocation (RMI)" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + serialver \- »ØÄꤷ¤¿¥¯¥é¥¹¤Î¥·¥ê¥¢¥ë¡¦¥Ð¡¼¥¸¥ç¥óUID¤òÌᤷ¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIserialver\fR [ \fIoptions\fR ] [ \fIclassnames\fR ] ++\fBserialver\fR [ \fIoptions\fR ] [ \fIclassnames\fR ] + .fi + .if n \{\ + .RE +@@ -64,16 +66,16 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclassnames\fR + .RS 4 +-\fIserialVersionUID\fR¤òÌ᤹¥¯¥é¥¹¤Ç¤¹¡£ ++\fBserialVersionUID\fR¤òÌ᤹¥¯¥é¥¹¤Ç¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIserialver\fR¥³¥Þ¥ó¥É¤Ï¡¢1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î\fIserialVersionUID\fR¤ò¡¢Å¸³«¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Ø¥³¥Ô¡¼¤¹¤ë¤Î¤ËŬ¤·¤¿·Á¼°¤ÇÊÖ¤·¤Þ¤¹¡£°ú¿ô¤Ê¤·¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¾ì¹ç¡¢\fIserialver\fR¥³¥Þ¥ó¥É¤Ï»ÈÍÑΨ¹Ô¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBserialver\fR¥³¥Þ¥ó¥É¤Ï¡¢1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î\fBserialVersionUID\fR¤ò¡¢Å¸³«¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Ø¥³¥Ô¡¼¤¹¤ë¤Î¤ËŬ¤·¤¿·Á¼°¤ÇÊÖ¤·¤Þ¤¹¡£°ú¿ô¤Ê¤·¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¾ì¹ç¡¢\fBserialver\fR¥³¥Þ¥ó¥É¤Ï»ÈÍÑΨ¹Ô¤ò½ÐÎϤ·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-classpath \fIpath\-files\fR +@@ -83,22 +85,23 @@ + .PP + \-show + .RS 4 +-´Êñ¤Ê¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òɽ¼¨¤·¤Þ¤¹¡£´°Á´»ØÄê¤Î¥¯¥é¥¹Ì¾¤òÆþÎϤ·¤Æ¡¢Enter¥­¡¼¤«¡Öɽ¼¨¡×¥Ü¥¿¥ó¤ò²¡¤·¡¢\fIserialVersionUID\fR¤òɽ¼¨¤·¤Þ¤¹¡£ ++´Êñ¤Ê¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òɽ¼¨¤·¤Þ¤¹¡£´°Á´»ØÄê¤Î¥¯¥é¥¹Ì¾¤òÆþÎϤ·¤Æ¡¢Enter¥­¡¼¤«¡Öɽ¼¨¡×¥Ü¥¿¥ó¤ò²¡¤·¡¢\fBserialVersionUID\fR¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "Ãí°Õ" + .PP +-\fIserialver\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤ò¤½¤Î²¾ÁÛ¥Þ¥·¥óÆâ¤ËÆɤ߹þ¤ó¤Ç½é´ü²½¤·¤Þ¤¹¤¬¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤ÎÀßÄê¤Ï¹Ô¤¤¤Þ¤»¤ó¡£¿®Íê¤Ç¤­¤Ê¤¤¥¯¥é¥¹¤È¤È¤â¤Ë\fIserialver\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤òÀßÄê¤Ç¤­¤Þ¤¹¡£ ++\fBserialver\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤ò¤½¤Î²¾ÁÛ¥Þ¥·¥óÆâ¤ËÆɤ߹þ¤ó¤Ç½é´ü²½¤·¤Þ¤¹¤¬¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤ÎÀßÄê¤Ï¹Ô¤¤¤Þ¤»¤ó¡£¿®Íê¤Ç¤­¤Ê¤¤¥¯¥é¥¹¤È¤È¤â¤Ë\fBserialver\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤òÀßÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-J\-Djava\&.security\&.manager ++\fB\-J\-Djava\&.security\&.manager\fR ++ + .fi + .if n \{\ + .RE +@@ -110,7 +113,8 @@ + .RS 4 + .\} + .nf +-\-J\-Djava\&.security\&.policy=<policy file> ++\fB\-J\-Djava\&.security\&.policy=<policy file>\fR ++ + .fi + .if n \{\ + .RE +@@ -137,7 +141,7 @@ + .IP \(bu 2.3 + .\} + http://docs\&.oracle\&.com/javase/8/docs/api/java/io/ObjectStreamClass\&.html¤Ë¤¢¤ë +-\fIjava\&.io\&.ObjectStream\fR¥¯¥é¥¹µ­½Ò ++\fBjava\&.io\&.ObjectStream\fR¥¯¥é¥¹µ­½Ò + .RE + .br + 'pl 8.5i +--- ./jdk/src/linux/doc/man/ja/servertool.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/servertool.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: servertool +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: servertool ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "servertool" "1" "2013ǯ11·î21Æü" "JDK 8" "Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + servertool \- ³«È¯¼Ô¤¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¡¢Ää»ß¤¹¤ë¤¿¤á¤Î»È¤¤¤ä¤¹¤¤¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIservertool\fR \-ORBInitialPort \fInameserverport\fR [ \fIoptions\fR ] [ \fIcommands \fR] ++\fBservertool\fR \-ORBInitialPort \fInameserverport\fR [ \fIoptions\fR ] [ \fIcommands \fR] + .fi + .if n \{\ + .RE +@@ -64,35 +66,35 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + commands + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥³¥Þ¥ó¥É¡£¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥³¥Þ¥ó¥É¡£¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\fIservertool\fR\fIservertool >\fR\fIservertool >\fR ++\fBservertool\fR\fBservertool >\fR\fBservertool >\fR + .SH "ÀâÌÀ" + .PP +-\fIservertool\fR¥³¥Þ¥ó¥É¤Ï¡¢³«È¯¼Ô¤¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¡¢Ää»ß¤¹¤ë¤¿¤á¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥µ¡¼¥Ð¡¼¤Ë´Ø¤¹¤ëÍÍ¡¹¤ÊÅý·×¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¤Ï¡¢³«È¯¼Ô¤¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¡¢Ää»ß¤¹¤ë¤¿¤á¤Î¥³¥Þ¥ó¥É¹Ô¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥µ¡¼¥Ð¡¼¤Ë´Ø¤¹¤ëÍÍ¡¹¤ÊÅý·×¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-ORBInitialHost \fInameserverhost\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¤Ç¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¡¢Ãå¿®¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤¹¤ë¥Û¥¹¥È¡¦¥Þ¥·¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fInameserverhost\fRÃͤϡ¢\fIorb\fR¤¬¼Â¹Ô¤µ¤ì¡¢¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤·¤Æ¤¤¤ë¥Ý¡¼¥È¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢Ãͤϥǥե©¥ë¥È¤Ç\fIlocalhost\fR¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fIorbd\fR¤È\fIservertool\fR¤¬°Û¤Ê¤ë¥Þ¥·¥ó¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fIorbd\fR¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Û¥¹¥È¤Î̾Á°¤Þ¤¿¤ÏIP¥¢¥É¥ì¥¹¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¤Ç¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¡¢Ãå¿®¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤¹¤ë¥Û¥¹¥È¡¦¥Þ¥·¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fBnameserverhost\fRÃͤϡ¢\fBorb\fR¤¬¼Â¹Ô¤µ¤ì¡¢¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤·¤Æ¤¤¤ë¥Ý¡¼¥È¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢Ãͤϥǥե©¥ë¥È¤Ç\fBlocalhost\fR¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fBorbd\fR¤È\fBservertool\fR¤¬°Û¤Ê¤ë¥Þ¥·¥ó¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fBorbd\fR¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Û¥¹¥È¤Î̾Á°¤Þ¤¿¤ÏIP¥¢¥É¥ì¥¹¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR +-Oracle Solaris¤Ç¤Ï¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¾å¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fInameserverport\fRÃͤˤϡ¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++Oracle Solaris¤Ç¤Ï¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¾å¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBnameserverport\fRÃͤˤϡ¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥³¥Þ¥ó¥É" + .PP +-\fIservertool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¤Þ¤¿¤Ï»ÈÍѤ»¤º¤Ëµ¯Æ°¤Ç¤­¤Þ¤¹¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¤Þ¤¿¤Ï»ÈÍѤ»¤º¤Ëµ¯Æ°¤Ç¤­¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -102,8 +104,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIservertool\fR¤Îµ¯Æ°»þ¤Ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ä¡¼¥ë¤Ë¥³¥Þ¥ó¥ÉÆþÎϤòµá¤á¤ë\fIservertool\fR¥×¥í¥ó¥×¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹: +-\fIservertool >\fR¡£ ++\fBservertool\fR¤Îµ¯Æ°»þ¤Ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¹Ô¥Ä¡¼¥ë¤Ë¥³¥Þ¥ó¥ÉÆþÎϤòµá¤á¤ë\fBservertool\fR¥×¥í¥ó¥×¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹: ++\fBservertool >\fR¡£ + .RE + .sp + .RS 4 +@@ -114,23 +116,23 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIservertool\fR¤Îµ¯Æ°»þ¤Ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Java IDL Server Tool¤¬µ¯Æ°¤·¤Æ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢½ªÎ»¤·¤Þ¤¹¡£ ++\fBservertool\fR¤Îµ¯Æ°»þ¤Ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Java IDL Server Tool¤¬µ¯Æ°¤·¤Æ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP + register \-server \fIserver\-class\-name\fR \-classpath \fIclasspath\-to\-server\fR [ \-applicationName \fIapplication\-name\fR \-args \fIargs\-to\-server\fR \-vmargs \fIflags\-for\-JVM\fR ] + .RS 4 +-Object Request Broker Daemon (ORBD)¤Ë¿·µ¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬Ì¤ÅÐÏ¿¤Î¾ì¹ç¡¢ÅÐÏ¿¤·¤Æ¥¢¥¯¥Æ¥£¥Ö²½¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fI\-server\fR¥ª¥×¥·¥ç¥ó¤Ç¼±Ê̤µ¤ì¤ë¥µ¡¼¥Ð¡¼¤Î\fI¥á¥¤¥ó\fR¡¦¥¯¥é¥¹Æâ¤Ç¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤Ï¡¢\fIpublic static void install(org\&.omg\&.CORBA\&.ORB)\fR¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ê¡¢³«È¯¼Ô¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¡¦¥¹¥­¡¼¥Þ¤ÎºîÀ®¤Ê¤ÉÆȼ«¤Î¥µ¡¼¥Ð¡¼¡¦¥¤¥ó¥¹¥È¡¼¥ëÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++Object Request Broker Daemon (ORBD)¤Ë¿·µ¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬Ì¤ÅÐÏ¿¤Î¾ì¹ç¡¢ÅÐÏ¿¤·¤Æ¥¢¥¯¥Æ¥£¥Ö²½¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fB\-server\fR¥ª¥×¥·¥ç¥ó¤Ç¼±Ê̤µ¤ì¤ë¥µ¡¼¥Ð¡¼¤Î\fB¥á¥¤¥ó\fR¡¦¥¯¥é¥¹Æâ¤Ç¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤Ï¡¢\fBpublic static void install(org\&.omg\&.CORBA\&.ORB)\fR¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ê¡¢³«È¯¼Ô¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¡¦¥¹¥­¡¼¥Þ¤ÎºîÀ®¤Ê¤ÉÆȼ«¤Î¥µ¡¼¥Ð¡¼¡¦¥¤¥ó¥¹¥È¡¼¥ëÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + unregister \-serverid \fIserver\-id\fR | \-applicationName \fIapplication\-name\fR + .RS 4 +-¥µ¡¼¥Ð¡¼ID¤Þ¤¿¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó̾¤Ç¡¢¥µ¡¼¥Ð¡¼¤òORBD¤«¤éÅÐÏ¿²ò½ü¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fI\-server\fR¥ª¥×¥·¥ç¥ó¤Ç¼±Ê̤µ¤ì¤ë¥µ¡¼¥Ð¡¼¤Î\fI¥á¥¤¥ó\fR¡¦¥¯¥é¥¹Æâ¤Ç¥¢¥ó¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£ +-\fIuninstall\fR¥á¥½¥Ã¥É¤Ï¡¢\fIpublic static void uninstall(org\&.omg\&.CORBA\&.ORB)\fR¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIuninstall\fR¥á¥½¥Ã¥É¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ê¡¢³«È¯¼Ô¤Ï\fIinstall\fR¥á¥½¥Ã¥É¤ÎÆ°ºî¤Î¼è¾Ã¤Ê¤É¡¢Æȼ«¤Î¥µ¡¼¥Ð¡¼¡¦¥¢¥ó¥¤¥ó¥¹¥È¡¼¥ëÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¥µ¡¼¥Ð¡¼ID¤Þ¤¿¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó̾¤Ç¡¢¥µ¡¼¥Ð¡¼¤òORBD¤«¤éÅÐÏ¿²ò½ü¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fB\-server\fR¥ª¥×¥·¥ç¥ó¤Ç¼±Ê̤µ¤ì¤ë¥µ¡¼¥Ð¡¼¤Î\fB¥á¥¤¥ó\fR¡¦¥¯¥é¥¹Æâ¤Ç¥¢¥ó¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£ ++\fBuninstall\fR¥á¥½¥Ã¥É¤Ï¡¢\fBpublic static void uninstall(org\&.omg\&.CORBA\&.ORB)\fR¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBuninstall\fR¥á¥½¥Ã¥É¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ê¡¢³«È¯¼Ô¤Ï\fBinstall\fR¥á¥½¥Ã¥É¤ÎÆ°ºî¤Î¼è¾Ã¤Ê¤É¡¢Æȼ«¤Î¥µ¡¼¥Ð¡¼¡¦¥¢¥ó¥¤¥ó¥¹¥È¡¼¥ëÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + getserverid \-applicationName \fIapplication\-name\fR + .RS 4 +-\fIapplication\-name\fRÃͤËÂбþ¤¹¤ë¥µ¡¼¥Ð¡¼ID¤òÊÖ¤·¤Þ¤¹¡£ ++\fBapplication\-name\fRÃͤËÂбþ¤¹¤ë¥µ¡¼¥Ð¡¼ID¤òÊÖ¤·¤Þ¤¹¡£ + .RE + .PP + list +@@ -150,22 +152,22 @@ + .PP + locate \-serverid \fIserver\-id\fR | \-applicationName \fIapplication\-name\fR [ \-endpointType \fIendpointType\fR ] + .RS 4 +-ÅÐÏ¿¤µ¤ì¤¿¥µ¡¼¥Ð¡¼¤ÇºîÀ®¤·¤¿¤¹¤Ù¤Æ¤ÎORB¤ÎÆÃÄê¤Î¥¿¥¤¥×¤Ë¤Ä¤¤¤Æ¥¨¥ó¥É¥Ý¥¤¥ó¥È(¥Ý¡¼¥È)¤ò¸¡½Ð¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£\fIendpointType\fRÃͤ¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥µ¡¼¥Ð¡¼¤ÎORB¤´¤È¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ëplain¥¿¥¤¥×¤Þ¤¿¤Ïnon\-protected¥¿¥¤¥×¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£ ++ÅÐÏ¿¤µ¤ì¤¿¥µ¡¼¥Ð¡¼¤ÇºîÀ®¤·¤¿¤¹¤Ù¤Æ¤ÎORB¤ÎÆÃÄê¤Î¥¿¥¤¥×¤Ë¤Ä¤¤¤Æ¥¨¥ó¥É¥Ý¥¤¥ó¥È(¥Ý¡¼¥È)¤ò¸¡½Ð¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£\fBendpointType\fRÃͤ¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥µ¡¼¥Ð¡¼¤ÎORB¤´¤È¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ëplain¥¿¥¤¥×¤Þ¤¿¤Ïnon\-protected¥¿¥¤¥×¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + locateperorb \-serverid \fIserver\-id\fR | \-applicationName \fIapplication\-name\fR [ \-orbid \fIORB\-name\fR ] + .RS 4 +-ÅÐÏ¿¤µ¤ì¤¿¥µ¡¼¥Ð¡¼¤ÎÆÃÄê¤ÎObject Request Broker (ORB)¤ÇÅÐÏ¿¤µ¤ì¤¿¥¨¥ó¥É¥Ý¥¤¥ó¥È(¥Ý¡¼¥È)¤ò¸¡½Ð¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£\fIorbid\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤÎ\fI""\fR¤¬\fIorbid\fR¤Ë³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ORB¤¬¶õʸ»úÎó¤Î\fIorbid\fR¤ÇºîÀ®¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ÅÐÏ¿¤·¤¿¥Ý¡¼¥È¤¬¤¹¤Ù¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£ ++ÅÐÏ¿¤µ¤ì¤¿¥µ¡¼¥Ð¡¼¤ÎÆÃÄê¤ÎObject Request Broker (ORB)¤ÇÅÐÏ¿¤µ¤ì¤¿¥¨¥ó¥É¥Ý¥¤¥ó¥È(¥Ý¡¼¥È)¤ò¸¡½Ð¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£\fBorbid\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤÎ\fB""\fR¤¬\fBorbid\fR¤Ë³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ORB¤¬¶õʸ»úÎó¤Î\fBorbid\fR¤ÇºîÀ®¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ÅÐÏ¿¤·¤¿¥Ý¡¼¥È¤¬¤¹¤Ù¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + orblist \-serverid \fIserver\-id\fR | \-applicationName \fIapplication\-name\fR + .RS 4 +-¥µ¡¼¥Ð¡¼¾å¤ËÄêµÁ¤µ¤ì¤¿ORB¤Î\fIORBId\fR¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£\fIORBId\fR¤Ï¥µ¡¼¥Ð¡¼¤ÇºîÀ®¤µ¤ì¤¿ORB¤Îʸ»úÎó̾¤Ç¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£ ++¥µ¡¼¥Ð¡¼¾å¤ËÄêµÁ¤µ¤ì¤¿ORB¤Î\fBORBId\fR¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£\fBORBId\fR¤Ï¥µ¡¼¥Ð¡¼¤ÇºîÀ®¤µ¤ì¤¿ORB¤Îʸ»úÎó̾¤Ç¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + shutdown \-serverid \fIserver\-id\fR | \-applicationName application\-name + .RS 4 +-ORBD¤ËÅÐÏ¿¤µ¤ì¤¿¥¢¥¯¥Æ¥£¥Ö¤Ê¥µ¡¼¥Ð¡¼¤òÄä»ß¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Î¼Â¹ÔÃæ¤Ë¡¢\fI\-serverid\fR¥Ñ¥é¥á¡¼¥¿¤Þ¤¿¤Ï\fI\-applicationName\fR¥Ñ¥é¥á¡¼¥¿¤Ç»ØÄꤵ¤ì¤¿¥¯¥é¥¹Æâ¤ËÄêµÁ¤µ¤ì¤¿\fIshutdown\fR¥á¥½¥Ã¥É¤â¸Æ¤Ó½Ð¤µ¤ì¤Æ¥µ¡¼¥Ð¡¼¡¦¥×¥í¥»¥¹¤òÄä»ß¤·¤Þ¤¹¡£ ++ORBD¤ËÅÐÏ¿¤µ¤ì¤¿¥¢¥¯¥Æ¥£¥Ö¤Ê¥µ¡¼¥Ð¡¼¤òÄä»ß¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Î¼Â¹ÔÃæ¤Ë¡¢\fB\-serverid\fR¥Ñ¥é¥á¡¼¥¿¤Þ¤¿¤Ï\fB\-applicationName\fR¥Ñ¥é¥á¡¼¥¿¤Ç»ØÄꤵ¤ì¤¿¥¯¥é¥¹Æâ¤ËÄêµÁ¤µ¤ì¤¿\fBshutdown\fR¥á¥½¥Ã¥É¤â¸Æ¤Ó½Ð¤µ¤ì¤Æ¥µ¡¼¥Ð¡¼¡¦¥×¥í¥»¥¹¤òÄä»ß¤·¤Þ¤¹¡£ + .RE + .PP + startup \-serverid \fIserver\-id\fR | \-applicationName application\-name +@@ -175,12 +177,12 @@ + .PP + help + .RS 4 +-\fIservertool\fR¥³¥Þ¥ó¥É¤ò²ð¤·¤Æ¥µ¡¼¥Ð¡¼¤¬ÍøÍѤǤ­¤ë¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤ò¥ê¥¹¥È¤·¤Þ¤¹¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¤ò²ð¤·¤Æ¥µ¡¼¥Ð¡¼¤¬ÍøÍѤǤ­¤ë¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤ò¥ê¥¹¥È¤·¤Þ¤¹¡£ + .RE + .PP + quit + .RS 4 +-\fIservertool\fR¥³¥Þ¥ó¥É¤ò½ªÎ»¤·¤Þ¤¹¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¤ò½ªÎ»¤·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/linux/doc/man/ja/tnameserv.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/tnameserv.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: tnameserv +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: tnameserv ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "tnameserv" "1" "2013ǯ11·î21Æü" "JDK 8" "Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + tnameserv \- ¥¤¥ó¥¿¥Õ¥§¡¼¥¹ÄêµÁ¸À¸ì(IDL)¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fItnameserve\fR \fI\-ORBInitialPort\fR [ \fInameserverport\fR ] ++\fBtnameserve\fR \fB\-ORBInitialPort\fR [ \fInameserverport\fR ] + .fi + .if n \{\ + .RE +@@ -64,16 +66,16 @@ + .PP + \-ORBInitialPort \fInameserverport\fR + .RS 4 +-¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤¬ORB¤Î\fIresolve_initial_references\fR¥á¥½¥Ã¥É¤È\fIlist_initial_references\fR¥á¥½¥Ã¥É¤Î¼ÂÁõ¤Ë»ÈÍѤ¹¤ë¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥×¥í¥È¥³¥ë¤ò¥ê¥¹¥Ë¥ó¥°¤¹¤ë½é´ü¥Ý¡¼¥È¤Ç¤¹¡£ ++¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤¬ORB¤Î\fBresolve_initial_references\fR¥á¥½¥Ã¥É¤È\fBlist_initial_references\fR¥á¥½¥Ã¥É¤Î¼ÂÁõ¤Ë»ÈÍѤ¹¤ë¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥×¥í¥È¥³¥ë¤ò¥ê¥¹¥Ë¥ó¥°¤¹¤ë½é´ü¥Ý¡¼¥È¤Ç¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-Java IDL¤Ë¤Ï¡¢Object Request Broker Daemon (ORBD)¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ORBD¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥µ¡¼¥Ó¥¹¡¢°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¡¢±Ê³¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ª¤è¤Ó¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò´Þ¤à¥Ç¡¼¥â¥ó¡¦¥×¥í¥»¥¹¤Ç¤¹¡£Java IDL¤Î¤¹¤Ù¤Æ¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ç¤ÏORBD¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¤¬¡¢°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ò»ÈÍѤ¹¤ëÎã¤Ç¤Ï¡¢\fIorbd\fR¤Î¤«¤ï¤ê¤Ë\fItnameserv\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++Java IDL¤Ë¤Ï¡¢Object Request Broker Daemon (ORBD)¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ORBD¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥µ¡¼¥Ó¥¹¡¢°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¡¢±Ê³¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ª¤è¤Ó¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò´Þ¤à¥Ç¡¼¥â¥ó¡¦¥×¥í¥»¥¹¤Ç¤¹¡£Java IDL¤Î¤¹¤Ù¤Æ¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ç¤ÏORBD¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¤¬¡¢°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ò»ÈÍѤ¹¤ëÎã¤Ç¤Ï¡¢\fBorbd\fR¤Î¤«¤ï¤ê¤Ë\fBtnameserv\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .PP +-http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/jidlNaming\&.html¤Ë¤¢¤ë +-orbd(1)¤Þ¤¿¤Ï¡ÖNaming Service¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++orbd(1)http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/jidlNaming\&.html ++¤Ë¤¢¤ë¤Þ¤¿¤Ï¡ÖNaming Service¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-CORBA¤ÎCOS (Common Object Services)¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤¬¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥Ç¥£¥ì¥¯¥È¥ê¹½Â¤¤òÄ󶡤·¤Æ¤¤¤ë¤Î¤ÈƱ¤¸¤è¤¦¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ËÂФ·¤Æ¥Ä¥ê¡¼¹½Â¤¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òÄ󶡤·¤Þ¤¹¡£Java IDL¤Î°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ç¤¢¤ë\fItnameserv\fR¤Ï¡¢COS¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Î»ÅÍͤòñ½ã¤Ê·Á¤Ç¼ÂÁõ¤·¤¿¤â¤Î¤Ç¤¹¡£ ++CORBA¤ÎCOS (Common Object Services)¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤¬¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥Ç¥£¥ì¥¯¥È¥ê¹½Â¤¤òÄ󶡤·¤Æ¤¤¤ë¤Î¤ÈƱ¤¸¤è¤¦¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ËÂФ·¤Æ¥Ä¥ê¡¼¹½Â¤¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òÄ󶡤·¤Þ¤¹¡£Java IDL¤Î°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ç¤¢¤ë\fBtnameserv\fR¤Ï¡¢COS¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Î»ÅÍͤòñ½ã¤Ê·Á¤Ç¼ÂÁõ¤·¤¿¤â¤Î¤Ç¤¹¡£ + .PP + ¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ï¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Ë̾Á°¤Ç³ÊǼ¤µ¤ì¡¢¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤È̾Á°¤Î¥Ú¥¢¤Ï¡¢¤½¤ì¤¾¤ì¥Í¡¼¥à¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤È¸Æ¤Ð¤ì¤Þ¤¹¡£¥Í¡¼¥à¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ËÁȤ߹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Ï¥Í¡¼¥à¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ç¤¢¤ê¡¢¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ÈƱ¤¸ÊÔÀ®µ¡Ç½¤ò»ý¤Á¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î²¼¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Ï¡¢¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤ÎÍ£°ì¤Î±Ê³¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ç¤¹¡£Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¡¦¥×¥í¥»¥¹¤òÄä»ß¤·¤ÆºÆµ¯Æ°¤¹¤ë¤È¡¢»Ä¤ê¤Î¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Ï¼º¤ï¤ì¤Þ¤¹¡£ + .PP +@@ -81,28 +83,30 @@ + .SS "¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°" + .PP + Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥¢¥×¥ì¥Ã¥È¤è¤êÁ°¤Ëµ¯Æ°¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£Java IDLÀ½Éʤò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ë¤È¡¢Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òµ¯Æ°¤¹¤ë¥¹¥¯¥ê¥×¥È(Oracle Solaris: +-\fItnameserv\fR)¤Þ¤¿¤Ï¼Â¹Ô²Äǽ¥Õ¥¡¥¤¥ë(Windows: +-\fItnameserv\&.exe\fR)¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤ÇÆ°ºî¤¹¤ë¤è¤¦¤Ë¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤òµ¯Æ°¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBtnameserv\fR)¤Þ¤¿¤Ï¼Â¹Ô²Äǽ¥Õ¥¡¥¤¥ë(Windows: ++\fBtnameserv\&.exe\fR)¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤ÇÆ°ºî¤¹¤ë¤è¤¦¤Ë¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤òµ¯Æ°¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-Æä˻ØÄꤷ¤Ê¤¤¾ì¹ç¡¢Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢ORB¤Î\fIresolve_initial_references\fR¥á¥½¥Ã¥É¤È\fIlist_initial_references methods\fR¥á¥½¥Ã¥É¤Î¼ÂÁõ¤Ë»ÈÍѤ¹¤ë¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥×¥í¥È¥³¥ë¤ËÂФ·¤Æ¥Ý¡¼¥È900¤Ç¥ê¥¹¥Ë¥ó¥°¤·¤Þ¤¹¡£ ++Æä˻ØÄꤷ¤Ê¤¤¾ì¹ç¡¢Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢ORB¤Î\fBresolve_initial_references\fR¥á¥½¥Ã¥É¤È\fBlist_initial_references methods\fR¥á¥½¥Ã¥É¤Î¼ÂÁõ¤Ë»ÈÍѤ¹¤ë¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥×¥í¥È¥³¥ë¤ËÂФ·¤Æ¥Ý¡¼¥È900¤Ç¥ê¥¹¥Ë¥ó¥°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-tnameserv \-ORBInitialPort nameserverport& ++\fBtnameserv \-ORBInitialPort nameserverport&\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¡¦¥Ý¡¼¥È¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¥Ý¡¼¥È900¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤Î¼Â¹Ô»þ¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¾ì¹ç¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£1050¤Î¤è¤¦¤ËÊ̤Υݡ¼¥È¤ò»ØÄꤷ¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢UNIX¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹¡£ ++¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¡¦¥Ý¡¼¥È¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¥Ý¡¼¥È900¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤Î¼Â¹Ô»þ¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¾ì¹ç¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£1050¤Î¤è¤¦¤ËÊ̤Υݡ¼¥È¤ò»ØÄꤷ¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢Solaris¡¢Linux¤Þ¤¿¤ÏOS X¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-tnameserv \-ORBInitialPort 1050& ++\fBtnameserv \-ORBInitialPort 1050&\fR ++ + .fi + .if n \{\ + .RE +@@ -114,69 +118,73 @@ + .RS 4 + .\} + .nf +-start tnameserv \-ORBInitialPort 1050 ++\fBstart tnameserv \-ORBInitialPort 1050\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤Î¥¯¥é¥¤¥¢¥ó¥È¤Ë¤Ï¡¢¿·¤·¤¤¥Ý¡¼¥ÈÈÖ¹æ¤òÃΤ餻¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤ò¹Ô¤¦¤Ë¤Ï¡¢ORB¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®»þ¤Ë\fIorg\&.omg\&.CORBA\&.ORBInitialPort\fR¥×¥í¥Ñ¥Æ¥£¤Ë¿·¤·¤¤¥Ý¡¼¥ÈÈÖ¹æ¤òÀßÄꤷ¤Þ¤¹¡£ ++¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤Î¥¯¥é¥¤¥¢¥ó¥È¤Ë¤Ï¡¢¿·¤·¤¤¥Ý¡¼¥ÈÈÖ¹æ¤òÃΤ餻¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤ò¹Ô¤¦¤Ë¤Ï¡¢ORB¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®»þ¤Ë\fBorg\&.omg\&.CORBA\&.ORBInitialPort\fR¥×¥í¥Ñ¥Æ¥£¤Ë¿·¤·¤¤¥Ý¡¼¥ÈÈÖ¹æ¤òÀßÄꤷ¤Þ¤¹¡£ + .SS "°Û¤Ê¤ë¥Û¥¹¥È¾å¤Ç¤Î¥µ¡¼¥Ð¡¼¤È¥¯¥é¥¤¥¢¥ó¥È¤Î¼Â¹Ô" + .PP + Java IDL¤ÈRMI\-IIOP¤Î¤Û¤È¤ó¤É¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ç¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¡¢¥µ¡¼¥Ð¡¼¤ª¤è¤Ó¥¯¥é¥¤¥¢¥ó¥È¤Ï¤¹¤Ù¤Æ³«È¯ÍѤΥޥ·¥ó¾å¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¼ÂºÝ¤Ë¥Ç¥×¥í¥¤¥á¥ó¥È¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ò¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤È¤Ï°Û¤Ê¤ë¥Û¥¹¥È¡¦¥Þ¥·¥ó¾å¤Ç¼Â¹Ô¤¹¤ë¤³¤È¤¬Â¿¤¯¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤¬¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò¸«¤Ä¤±¤ë¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤¬¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤È¥Û¥¹¥È¤òǧ¼±¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤Î¤¿¤á¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤Î¥Õ¥¡¥¤¥ëÆâ¤Î\fIorg\&.omg\&.CORBA\&.ORBInitialPort\fR¥×¥í¥Ñ¥Æ¥£¤È\fIorg\&.omg\&.CORBA\&.ORBInitialHost\fR¥×¥í¥Ñ¥Æ¥£¤ò¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤È¥Þ¥·¥ó¤Î̾Á°¤ËÀßÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ï¡¢¡ÖGetting Started Using RMI\-IIOP¡× ++¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤¬¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò¸«¤Ä¤±¤ë¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤¬¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤È¥Û¥¹¥È¤òǧ¼±¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤Î¤¿¤á¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤Î¥Õ¥¡¥¤¥ëÆâ¤Î\fBorg\&.omg\&.CORBA\&.ORBInitialPort\fR¥×¥í¥Ñ¥Æ¥£¤È\fBorg\&.omg\&.CORBA\&.ORBInitialHost\fR¥×¥í¥Ñ¥Æ¥£¤ò¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤È¥Þ¥·¥ó¤Î̾Á°¤ËÀßÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ï¡¢¡ÖGetting Started Using RMI\-IIOP¡× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/rmi\-iiop/rmiiiopexample\&.html)¤Ë¼¨¤µ¤ì¤Æ¤¤¤Þ¤¹ + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó\fI\-ORBInitialPort nameserverport#\fR¤È\fI\-ORBInitialHost nameserverhostname\fR¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ËÂФ·¤Æ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òõ¤¹¾ì½ê¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤³¤ì¤ò¹Ô¤¦ÊýË¡¤Î1¤Ä¤ÎÎã¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/tutorial/jidl2machines\&.html¤Î¡ÖJava IDL: The Hello World Example on Two Machines¡× ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó\fB\-ORBInitialPort nameserverport#\fR¤È\fB\-ORBInitialHost nameserverhostname\fR¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ËÂФ·¤Æ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òõ¤¹¾ì½ê¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤³¤ì¤ò¹Ô¤¦ÊýË¡¤Î1¤Ä¤ÎÎã¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/tutorial/jidl2machines\&.html¤Î¡ÖJava IDL: The Hello World Example on Two Machines¡× + ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-¤¿¤È¤¨¤Ð¡¢°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹\fItnameserv\fR¤¬¡¢¥Û¥¹¥È\fInameserverhost\fR¤Î¥Ý¡¼¥È1050¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤¬¥Û¥¹¥È\fIclienthost\fR¾å¤Ç¼Â¹Ô¤µ¤ì¡¢¥µ¡¼¥Ð¡¼¤Ï¥Û¥¹¥È\fIserverhost\fR¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹\fBtnameserv\fR¤¬¡¢¥Û¥¹¥È\fBnameserverhost\fR¤Î¥Ý¡¼¥È1050¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤¬¥Û¥¹¥È\fBclienthost\fR¾å¤Ç¼Â¹Ô¤µ¤ì¡¢¥µ¡¼¥Ð¡¼¤Ï¥Û¥¹¥È\fBserverhost\fR¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£ + .PP +-¥Û¥¹¥È\fInameserverhost\fR¾å¤Ç\fItnameserv\fR¤òµ¯Æ°¤·¤Þ¤¹¡£ ++¥Û¥¹¥È\fBnameserverhost\fR¾å¤Ç\fBtnameserv\fR¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-tnameserv \-ORBInitialPort 1050 ++\fBtnameserv \-ORBInitialPort 1050\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIserverhost\fR¾å¤Ç¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBserverhost\fR¾å¤Ç¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java Server \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost ++\fBjava Server \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP + +-\fIclienthost\fR¾å¤Ç¥¯¥é¥¤¥¢¥ó¥È¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBclienthost\fR¾å¤Ç¥¯¥é¥¤¥¢¥ó¥È¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java Client \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost ++\fBjava Client \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ÎÄä»ß" + .PP +-Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÄä»ß¤¹¤ë¤Ë¤Ï¡¢Unix¤Î¾ì¹ç¤Ï¡¢\fIkill\fR¤Ê¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¡¢Windows¤Î¾ì¹ç¤Ï¡¢\fI[Ctrl]+[C]\fR¥­¡¼¤ò»ÈÍѤ·¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÌÀ¼¨Åª¤ËÄä»ß¤¹¤ë¤Þ¤Ç¤Ï¡¢¸Æ½Ð¤·ÂÔµ¡¾õÂÖ¤¬Â³¤­¤Þ¤¹¡£¥µ¡¼¥Ó¥¹¤ò½ªÎ»¤µ¤»¤ë¤È¡¢Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë̾Á°¤Ï¼º¤ï¤ì¤Þ¤¹¡£ ++Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÄä»ß¤¹¤ë¤Ë¤Ï¡¢Solaris¡¢Linux¤Þ¤¿¤ÏOS X¤Î¾ì¹ç¤Ï¡¢\fBkill\fR¤Ê¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¡¢Windows¤Î¾ì¹ç¤Ï¡¢\fB[Ctrl]+[C]\fR¥­¡¼¤ò»ÈÍѤ·¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÌÀ¼¨Åª¤ËÄä»ß¤¹¤ë¤Þ¤Ç¤Ï¡¢¸Æ½Ð¤·ÂÔµ¡¾õÂÖ¤¬Â³¤­¤Þ¤¹¡£¥µ¡¼¥Ó¥¹¤ò½ªÎ»¤µ¤»¤ë¤È¡¢Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë̾Á°¤Ï¼º¤ï¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "Îã" + .SS "¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Ø¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ÎÄɲÃ" +@@ -187,115 +195,122 @@ + .RS 4 + .\} + .nf +-Initial Naming Context +- plans +- Personal +- calendar +- schedule ++\fBInitial Naming Context\fR ++\fB plans\fR ++\fB Personal\fR ++\fB calendar\fR ++\fB schedule\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Ç¡¢\fIplans\fR¤Ï¥ª¥Ö¥¸¥§¥¯¥È»²¾È¡¢\fIPersonal\fR¤Ï\fIcalendar\fR¤È\fIschedule\fR¤Î2¤Ä¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò´Þ¤à¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Ç¤¹¡£ ++¤³¤ÎÎã¤Ç¡¢\fBplans\fR¤Ï¥ª¥Ö¥¸¥§¥¯¥È»²¾È¡¢\fBPersonal\fR¤Ï\fBcalendar\fR¤È\fBschedule\fR¤Î2¤Ä¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò´Þ¤à¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-import java\&.util\&.Properties; +-import org\&.omg\&.CORBA\&.*; +-import org\&.omg\&.CosNaming\&.*; ++\fBimport java\&.util\&.Properties;\fR ++\fBimport org\&.omg\&.CORBA\&.*;\fR ++\fBimport org\&.omg\&.CosNaming\&.*;\fR ++\fB \fR ++\fBpublic class NameClient {\fR + +-public class NameClient { +- +- public static void main(String args[]) { +- +- try { ++\fB public static void main(String args[]) {\fR ++ ++\fB try {\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤Ç¡¢\fInameserver\fR¤Ï¥Ý¡¼¥È1050¤Çµ¯Æ°¤µ¤ì¤Þ¤·¤¿¡£¼¡¤Î¥³¡¼¥É¤Ç¡¢¤³¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥¯¥é¥¤¥¢¥ó¥È¡¦¥·¥¹¥Æ¥à¤ËÃΤ餻¤Þ¤¹¡£ ++¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤Ç¡¢\fBnameserver\fR¤Ï¥Ý¡¼¥È1050¤Çµ¯Æ°¤µ¤ì¤Þ¤·¤¿¡£¼¡¤Î¥³¡¼¥É¤Ç¡¢¤³¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥¯¥é¥¤¥¢¥ó¥È¡¦¥·¥¹¥Æ¥à¤ËÃΤ餻¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- Properties props = new Properties(); +- props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050"); +- ORB orb = ORB\&.init(args, props); ++\fB Properties props = new Properties();\fR ++\fB props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050");\fR ++\fB ORB orb = ORB\&.init(args, props);\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ò¼èÆÀ¤·¡¢¤½¤ì¤ò\fIctx\fR¤ËÂåÆþ¤·¤Þ¤¹¡£2¹ÔÌܤǤϡ¢\fIctx\fR¤ò¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È\fIobjref\fR¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¤³¤Îobjref¤Ë¤Ï¡¢¤¢¤È¤ÇÍÍ¡¹¤Ê̾Á°¤ò³ä¤êÅö¤Æ¤Æ¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤ËÄɲä·¤Þ¤¹¡£ ++¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ò¼èÆÀ¤·¡¢¤½¤ì¤ò\fBctx\fR¤ËÂåÆþ¤·¤Þ¤¹¡£2¹ÔÌܤǤϡ¢\fBctx\fR¤ò¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È\fBobjref\fR¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¤³¤Îobjref¤Ë¤Ï¡¢¤¢¤È¤ÇÍÍ¡¹¤Ê̾Á°¤ò³ä¤êÅö¤Æ¤Æ¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤ËÄɲä·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- NamingContext ctx = +- NamingContextHelper\&.narrow( +- orb\&.resolve_initial_references("NameService")); +- NamingContext objref = ctx; ++\fB NamingContext ctx =\fR ++\fB NamingContextHelper\&.narrow(\fR ++\fB orb\&.resolve_initial_references("NameService"));\fR ++\fB NamingContext objref = ctx;\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢\fItext\fR¥¿¥¤¥×¤Î̾Á°\fIplans\fR¤òºîÀ®¤·¡¢¤½¤ì¤ò¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£¤½¤Î¸å¡¢\fIrebind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î²¼¤Ë\fIplans\fR¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£\fIrebind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢\fIbind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤¿¾ì¹ç¤ËȯÀ¸¤¹¤ëÎã³°¤òȯÀ¸¤µ¤»¤º¤Ë¡¢¤³¤Î¥×¥í¥°¥é¥à¤ò²¿Å٤ⷫÊÖ¤·¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ ++¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢\fBtext\fR¥¿¥¤¥×¤Î̾Á°\fBplans\fR¤òºîÀ®¤·¡¢¤½¤ì¤ò¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£¤½¤Î¸å¡¢\fBrebind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î²¼¤Ë\fBplans\fR¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£\fBrebind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢\fBbind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤¿¾ì¹ç¤ËȯÀ¸¤¹¤ëÎã³°¤òȯÀ¸¤µ¤»¤º¤Ë¡¢¤³¤Î¥×¥í¥°¥é¥à¤ò²¿Å٤ⷫÊÖ¤·¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- NameComponent nc1 = new NameComponent("plans", "text"); +- NameComponent[] name1 = {nc1}; +- ctx\&.rebind(name1, objref); +- System\&.out\&.println("plans rebind successful!"); ++\fB NameComponent nc1 = new NameComponent("plans", "text");\fR ++\fB NameComponent[] name1 = {nc1};\fR ++\fB ctx\&.rebind(name1, objref);\fR ++\fB System\&.out\&.println("plans rebind successful!");\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢\fIdirectory\fR¥¿¥¤¥×¤Î\fIPersonal\fR¤È¤¤¤¦¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤òºîÀ®¤·¤Þ¤¹¡£¤½¤Î·ë²ÌÆÀ¤é¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È»²¾È\fIctx2\fR¤ò\fIname\fR¤Ë¥Ð¥¤¥ó¥É¤·¡¢½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ËÄɲä·¤Þ¤¹¡£ ++¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢\fBdirectory\fR¥¿¥¤¥×¤Î\fBPersonal\fR¤È¤¤¤¦¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤òºîÀ®¤·¤Þ¤¹¡£¤½¤Î·ë²ÌÆÀ¤é¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È»²¾È\fBctx2\fR¤ò\fBname\fR¤Ë¥Ð¥¤¥ó¥É¤·¡¢½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ËÄɲä·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- NameComponent nc2 = new NameComponent("Personal", "directory"); +- NameComponent[] name2 = {nc2}; +- NamingContext ctx2 = ctx\&.bind_new_context(name2); +- System\&.out\&.println("new naming context added\&.\&."); ++\fB NameComponent nc2 = new NameComponent("Personal", "directory");\fR ++\fB NameComponent[] name2 = {nc2};\fR ++\fB NamingContext ctx2 = ctx\&.bind_new_context(name2);\fR ++\fB System\&.out\&.println("new naming context added\&.\&.");\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-»Ä¤ê¤Î¥³¡¼¥É¤Ç¤Ï¡¢¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò\fIschedule\fR¤È\fIcalendar\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È\fIPersonal\fR(\fIctx2\fR)¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£ ++»Ä¤ê¤Î¥³¡¼¥É¤Ç¤Ï¡¢¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò\fBschedule\fR¤È\fBcalendar\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È\fBPersonal\fR(\fBctx2\fR)¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- NameComponent nc3 = new NameComponent("schedule", "text"); +- NameComponent[] name3 = {nc3}; +- ctx2\&.rebind(name3, objref); +- System\&.out\&.println("schedule rebind successful!"); ++\fB NameComponent nc3 = new NameComponent("schedule", "text");\fR ++\fB NameComponent[] name3 = {nc3};\fR ++\fB ctx2\&.rebind(name3, objref);\fR ++\fB System\&.out\&.println("schedule rebind successful!");\fR ++\fB \fR ++\fB NameComponent nc4 = new NameComponent("calender", "text");\fR ++\fB NameComponent[] name4 = {nc4};\fR ++\fB ctx2\&.rebind(name4, objref);\fR ++\fB System\&.out\&.println("calender rebind successful!");\fR ++\fB } catch (Exception e) {\fR ++\fB e\&.printStackTrace(System\&.err);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR + +- NameComponent nc4 = new NameComponent("calender", "text"); +- NameComponent[] name4 = {nc4}; +- ctx2\&.rebind(name4, objref); +- System\&.out\&.println("calender rebind successful!"); +- } catch (Exception e) { +- e\&.printStackTrace(System\&.err); +- } +- } +-} + .fi + .if n \{\ + .RE +@@ -308,29 +323,31 @@ + .RS 4 + .\} + .nf +-import java\&.util\&.Properties; +-import org\&.omg\&.CORBA\&.*; +-import org\&.omg\&.CosNaming\&.*; ++\fBimport java\&.util\&.Properties;\fR ++\fBimport org\&.omg\&.CORBA\&.*;\fR ++\fBimport org\&.omg\&.CosNaming\&.*;\fR ++\fB \fR ++\fBpublic class NameClientList {\fR + +-public class NameClientList { +- +- public static void main(String args[]) { +- +- try { ++\fB public static void main(String args[]) {\fR ++ ++\fB try {\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤Ç¡¢\fInameserver\fR¤Ï¥Ý¡¼¥È1050¤Çµ¯Æ°¤µ¤ì¤Þ¤·¤¿¡£¼¡¤Î¥³¡¼¥É¤Ç¡¢¤³¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥¯¥é¥¤¥¢¥ó¥È¡¦¥·¥¹¥Æ¥à¤ËÃΤ餻¤Þ¤¹¡£ ++¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤Ç¡¢\fBnameserver\fR¤Ï¥Ý¡¼¥È1050¤Çµ¯Æ°¤µ¤ì¤Þ¤·¤¿¡£¼¡¤Î¥³¡¼¥É¤Ç¡¢¤³¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥¯¥é¥¤¥¢¥ó¥È¡¦¥·¥¹¥Æ¥à¤ËÃΤ餻¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- Properties props = new Properties(); +- props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050"); +- ORB orb = ORB\&.init(args, props); ++\fB Properties props = new Properties();\fR ++\fB props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050");\fR ++\fB ORB orb = ORB\&.init(args, props);\fR ++ + .fi + .if n \{\ + .RE +@@ -342,36 +359,39 @@ + .RS 4 + .\} + .nf +- NamingContext nc = +- NamingContextHelper\&.narrow( +- orb\&.resolve_initial_references("NameService")); ++\fB NamingContext nc =\fR ++\fB NamingContextHelper\&.narrow(\fR ++\fB orb\&.resolve_initial_references("NameService"));\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIlist\fR¥á¥½¥Ã¥É¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò¥ê¥¹¥È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢ºÇÂç1000¸Ä¤Þ¤Ç¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤«¤é\fIBindingListHolder\fR¤ËÊÖ¤µ¤ì¤Þ¤¹¡£»Ä¤ê¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fIBindingIteratorHolder\fR¤ËÊÖ¤µ¤ì¤Þ¤¹¡£ ++\fBlist\fR¥á¥½¥Ã¥É¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò¥ê¥¹¥È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢ºÇÂç1000¸Ä¤Þ¤Ç¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤«¤é\fBBindingListHolder\fR¤ËÊÖ¤µ¤ì¤Þ¤¹¡£»Ä¤ê¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fBBindingIteratorHolder\fR¤ËÊÖ¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- BindingListHolder bl = new BindingListHolder(); +- BindingIteratorHolder blIt= new BindingIteratorHolder(); +- nc\&.list(1000, bl, blIt); ++\fB BindingListHolder bl = new BindingListHolder();\fR ++\fB BindingIteratorHolder blIt= new BindingIteratorHolder();\fR ++\fB nc\&.list(1000, bl, blIt);\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢ÊÖ¤µ¤ì¤¿\fIBindingListHolder\fR¤«¤é¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ÎÇÛÎó¤ò¼èÆÀ¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥í¥°¥é¥à¤¬½ªÎ»¤·¤Þ¤¹¡£ ++¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢ÊÖ¤µ¤ì¤¿\fBBindingListHolder\fR¤«¤é¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ÎÇÛÎó¤ò¼èÆÀ¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥í¥°¥é¥à¤¬½ªÎ»¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- Binding bindings[] = bl\&.value; +- if (bindings\&.length == 0) return; ++\fB Binding bindings[] = bl\&.value;\fR ++\fB if (bindings\&.length == 0) return;\fR ++ + .fi + .if n \{\ + .RE +@@ -383,27 +403,28 @@ + .RS 4 + .\} + .nf +- for (int i=0; i < bindings\&.length; i++) { ++\fB for (int i=0; i < bindings\&.length; i++) {\fR ++\fB \fR ++\fB // get the object reference for each binding\fR ++\fB org\&.omg\&.CORBA\&.Object obj = nc\&.resolve(bindings[i]\&.binding_name);\fR ++\fB String objStr = orb\&.object_to_string(obj);\fR ++\fB int lastIx = bindings[i]\&.binding_name\&.length\-1;\fR ++\fB \fR ++\fB // check to see if this is a naming context\fR ++\fB if (bindings[i]\&.binding_type == BindingType\&.ncontext) {\fR ++\fB System\&.out\&.println("Context: " +\fR ++\fB bindings[i]\&.binding_name[lastIx]\&.id);\fR ++\fB } else {\fR ++\fB System\&.out\&.println("Object: " +\fR ++\fB bindings[i]\&.binding_name[lastIx]\&.id);\fR ++\fB }\fR ++\fB }\fR ++\fB } catch (Exception e) {\fR ++\fB e\&.printStackTrace(System\&.err)\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR + +- // get the object reference for each binding +- org\&.omg\&.CORBA\&.Object obj = nc\&.resolve(bindings[i]\&.binding_name); +- String objStr = orb\&.object_to_string(obj); +- int lastIx = bindings[i]\&.binding_name\&.length\-1; +- +- // check to see if this is a naming context +- if (bindings[i]\&.binding_type == BindingType\&.ncontext) { +- System\&.out\&.println("Context: " + +- bindings[i]\&.binding_name[lastIx]\&.id); +- } else { +- System\&.out\&.println("Object: " + +- bindings[i]\&.binding_name[lastIx]\&.id); +- } +- } +- } catch (Exception e) { +- e\&.printStackTrace(System\&.err) +- } +- } +-} + .fi + .if n \{\ + .RE +--- ./jdk/src/linux/doc/man/ja/unpack200.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/unpack200.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: unpack200 +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: unpack200 ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "unpack200" "1" "2013ǯ11·î21Æü" "JDK 8" "Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-unpack200 \- pack200(1)¤ÇºîÀ®¤µ¤ì¤¿¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ò¡¢Web¥Ç¥×¥í¥¤¥á¥ó¥È¤Î¤¿¤á¤ËJAR¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++unpack200 \- \fBpack200\fR(1)¤ÇºîÀ®¤µ¤ì¤¿¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ò¡¢Web¥Ç¥×¥í¥¤¥á¥ó¥È¤Î¤¿¤á¤ËJAR¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIunpack200\fR [ \fIoptions\fR ] input\-file \fIJAR\-file\fR ++\fBunpack200\fR [ \fIoptions\fR ] input\-file \fIJAR\-file\fR + .fi + .if n \{\ + .RE +@@ -64,12 +66,12 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIinput\-file\fR + .RS 4 +-ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î̾Á°¡£pack200 gzip¥Õ¥¡¥¤¥ë¤«pack200¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIpack200\fR(1)¤ÇºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹(¼ê´Ö¤Ï\fI0\fR¤Ç¤¹)¡£¤³¤Î¾ì¹ç¡¢ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÏPack2000¥Þ¡¼¥«¡¼¤Ç½ÐÎÏJAR¥Õ¥¡¥¤¥ë¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î̾Á°¡£pack200 gzip¥Õ¥¡¥¤¥ë¤«pack200¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBpack200\fR(1)¤ÇºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹(¼ê´Ö¤Ï\fB0\fR¤Ç¤¹)¡£¤³¤Î¾ì¹ç¡¢ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÏPack2000¥Þ¡¼¥«¡¼¤Ç½ÐÎÏJAR¥Õ¥¡¥¤¥ë¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \fIJAR\-file\fR +@@ -78,13 +80,14 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIunpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIpack200\fR\fI(1)\fR¤ÇºîÀ®¤µ¤ì¤¿¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤òJAR¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤¹¤ë¥Í¥¤¥Æ¥£¥Ö¼ÂÁõ¤Ç¤¹¡£°ìÈÌŪ¤Ê»ÈÍÑÊýË¡¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î\fIunpack200\fR¥³¥Þ¥ó¥ÉÀßÄê¤Ç¡¢\fImyarchive\&.jar\fR¥Õ¥¡¥¤¥ë¤¬\fImyarchive\&.pack\&.gz\fR¤«¤éºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBunpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBpack200\fR\fB(1)\fR¤ÇºîÀ®¤µ¤ì¤¿¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤òJAR¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤¹¤ë¥Í¥¤¥Æ¥£¥Ö¼ÂÁõ¤Ç¤¹¡£°ìÈÌŪ¤Ê»ÈÍÑÊýË¡¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î\fBunpack200\fR¥³¥Þ¥ó¥ÉÀßÄê¤Ç¡¢\fBmyarchive\&.jar\fR¥Õ¥¡¥¤¥ë¤¬\fBmyarchive\&.pack\&.gz\fR¤«¤éºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-unpack200 myarchive\&.pack\&.gz myarchive\&.jar ++\fBunpack200 myarchive\&.pack\&.gz myarchive\&.jar\fR ++ + .fi + .if n \{\ + .RE +@@ -93,7 +96,7 @@ + .PP + \-Hvalue \-\-deflate\-hint=\fIvalue\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Ë\fItrue\fR¡¢\fIfalse\fR¤Þ¤¿¤Ï\fIkeep\fR¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¡¦¥â¡¼¥É¤Ï\fIkeep\fR¤Ç¤¹¡£Ãͤ¬\fItrue\fR¤Þ¤¿¤Ï\fIfalse\fR¾ì¹ç¡¢\fI\-\-deflate=hint\fR¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¡¢½ÐÎÏJAR¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥â¡¼¥É¤¬ÀßÄꤵ¤ì¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Ë\fBtrue\fR¡¢\fBfalse\fR¤Þ¤¿¤Ï\fBkeep\fR¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¡¦¥â¡¼¥É¤Ï\fBkeep\fR¤Ç¤¹¡£Ãͤ¬\fBtrue\fR¤Þ¤¿¤Ï\fBfalse\fR¾ì¹ç¡¢\fB\-\-deflate=hint\fR¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¡¢½ÐÎÏJAR¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥â¡¼¥É¤¬ÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .PP + \-r \-\-remove\-pack\-file +@@ -118,21 +121,21 @@ + .PP + \-? \-h \-\-help + .RS 4 +-\fIunpack200\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBunpack200\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-V \-\-version + .RS 4 +-\fIunpack200\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBunpack200\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ëoption¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ëoption¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "Ãí°Õ" + .PP +-¤³¤Î¥³¥Þ¥ó¥É¤È\fIunpack\fR¥³¥Þ¥ó¥É¤òº®Æ±¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÏÊÌÀ½ÉʤǤ¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤È\fBunpack\fR¥³¥Þ¥ó¥É¤òº®Æ±¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÏÊÌÀ½ÉʤǤ¹¡£ + .PP + JDK¤ËÉÕ°¤¹¤ëJava SE API»ÅÍͤȤÎÁê°ã¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢»ÅÍͤòÍ¥À褷¤Æ¤¯¤À¤µ¤¤¡£ + .SH "½ªÎ»¥¹¥Æ¡¼¥¿¥¹" +@@ -181,8 +184,9 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¡ÖPack200 and Compression¡× +-(http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/deployment/deployment\-guide/pack200\&.html) ++¡ÖCompression Formats for Network Deployment¡× ++ ++http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jweb/networking/compression_formats\&.html + .RE + .sp + .RS 4 +--- ./jdk/src/linux/doc/man/ja/wsgen.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/wsgen.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: wsgen +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: wsgen ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "wsgen" "1" "2013ǯ11·î21Æü" "JDK 8" "Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + wsgen \- Web¥µ¡¼¥Ó¥¹¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¼ÂÁõ(SEI)¥¯¥é¥¹¤òÆɼè¤ê¡¢Web¥µ¡¼¥Ó¥¹¤Î¥Ç¥×¥í¥¤¥á¥ó¥È¤È¸Æ½Ð¤·¤ËɬÍפʤ¹¤Ù¤Æ¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIwsgen\fR [ \fIoptions\fR ] \fISEI\fR ++\fBwsgen\fR [ \fIoptions\fR ] \fISEI\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fISEI\fR +@@ -73,18 +75,19 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIwsgen\fR¥³¥Þ¥ó¥É¤Ï¡¢JAX\-WS Web¥µ¡¼¥Ó¥¹¤Ç»ÈÍѤµ¤ì¤ëJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥Ä¡¼¥ë¤Ï¡¢Web¥µ¡¼¥Ó¥¹¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¡¦¥¯¥é¥¹¤òÆɼè¤ê¡¢Web¥µ¡¼¥Ó¥¹¤Î¥Ç¥×¥í¥¤¥á¥ó¥È¤È¸Æ½Ð¤·¤ËɬÍפʤ¹¤Ù¤Æ¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£JAXWS 2\&.1\&.1 RI¤Ç¤Ï\fIwsgen\fR ++\fBwsgen\fR¥³¥Þ¥ó¥É¤Ï¡¢JAX\-WS Web¥µ¡¼¥Ó¥¹¤Ç»ÈÍѤµ¤ì¤ëJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥Ä¡¼¥ë¤Ï¡¢Web¥µ¡¼¥Ó¥¹¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¡¦¥¯¥é¥¹¤òÆɼè¤ê¡¢Web¥µ¡¼¥Ó¥¹¤Î¥Ç¥×¥í¥¤¥á¥ó¥È¤È¸Æ½Ð¤·¤ËɬÍפʤ¹¤Ù¤Æ¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£JAXWS 2\&.1\&.1 RI¤Ç¤Ï\fBwsgen\fR + Ant¥¿¥¹¥¯¤âÄ󶡤µ¤ì¤Þ¤¹¡£ + http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/wsgenant\&.html¤ÎJAX\-WS (wsgen)¥Ú¡¼¥¸¤ÎTools¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIwsgen\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ ++\fBwsgen\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-export JAXWS_HOME=/pathto/jaxws\-ri +-$JAXWS_HOME/bin/wsgen\&.sh \-help ++\fBexport JAXWS_HOME=/pathto/jaxws\-ri\fR ++\fB$JAXWS_HOME/bin/wsgen\&.sh \-help\fR ++ + .fi + .if n \{\ + .RE +@@ -113,7 +116,7 @@ + .PP + \-help + .RS 4 +-\fIwsgen\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBwsgen\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-keep +@@ -123,7 +126,7 @@ + .PP + \-r \fIdirectory\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fI\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢WSDL¤Ê¤ÉÀ¸À®¤µ¤ì¤¿¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fB\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢WSDL¤Ê¤ÉÀ¸À®¤µ¤ì¤¿¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-s \fIdirectory\fR +@@ -145,41 +148,43 @@ + .RS 4 + ¥¨¥ó¥É¥Ý¥¤¥ó¥È¤ò¥Ç¥×¥í¥¤¤¹¤ëÁ°¤Ë³Îǧ¤¹¤ëWSDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¥ª¥×¥·¥ç¥ó¡¦¥³¥Þ¥ó¥É¡£WSDL¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥µ¡¼¥Ó¥¹¤ò¸Æ¤Ó½Ð¤¹ÊýË¡¡¢¥Ñ¥é¥á¡¼¥¿¤ËɬÍפÊÃÍ¡¢ÊÖ¤µ¤ì¤ë¥Ç¡¼¥¿¹½Â¤¤Ë¤Ä¤¤¤Æ¤Î¥³¥ó¥Ô¥å¡¼¥¿¤ÇÆɼè¤ê²Äǽ¤Êµ­½Ò¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fIwsgen\fR¥³¥Þ¥ó¥É¤ÏWSDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤»¤ó¡£\fIprotocol\fRÃͤϾÊά²Äǽ¤Ç¤¢¤ê¡¢WSDL¥Ð¥¤¥ó¥Ç¥£¥ó¥°(\fIwsdl:binding\fR)¤Ç»ÈÍѤ¹¤ë¥×¥í¥È¥³¥ë¤ò»ØÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£Í­¸ú¤Ê¥×¥í¥È¥³¥ë¤Ï¡¢\fIsoap1\&.1\fR¤È\fIXsoap1\&.2\fR¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fIsoap1\&.1\fR¤Ç¤¹¡£\fIXsoap1\&.2\fR¥×¥í¥È¥³¥ë¤Ïɸ½à¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢\fI\-extension\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fBwsgen\fR¥³¥Þ¥ó¥É¤ÏWSDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤»¤ó¡£\fBprotocol\fRÃͤϾÊά²Äǽ¤Ç¤¢¤ê¡¢WSDL¥Ð¥¤¥ó¥Ç¥£¥ó¥°(\fBwsdl:binding\fR)¤Ç»ÈÍѤ¹¤ë¥×¥í¥È¥³¥ë¤ò»ØÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£Í­¸ú¤Ê¥×¥í¥È¥³¥ë¤Ï¡¢\fBsoap1\&.1\fR¤È\fBXsoap1\&.2\fR¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fBsoap1\&.1\fR¤Ç¤¹¡£\fBXsoap1\&.2\fR¥×¥í¥È¥³¥ë¤Ïɸ½à¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢\fB\-extension\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ + .RE + .PP + \-servicename \fIname\fR + .RS 4 +-\fI\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѤ·¤Æ¡¢WSDL¤ÇÀ¸À®¤µ¤ì¤ëÆÃÄê¤ÎWSDL¥µ¡¼¥Ó¥¹(\fIwsdl:service\fR)̾¤ò»ØÄꤷ¤Þ¤¹¡£Îã: +-\fI\-servicename "{http://mynamespace/}MyService"\fR¡£ ++\fB\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѤ·¤Æ¡¢WSDL¤ÇÀ¸À®¤µ¤ì¤ëÆÃÄê¤ÎWSDL¥µ¡¼¥Ó¥¹(\fBwsdl:service\fR)̾¤ò»ØÄꤷ¤Þ¤¹¡£Îã: ++\fB\-servicename "{http://mynamespace/}MyService"\fR¡£ + .RE + .PP + \-portname \fIname\fR + .RS 4 +-\fI\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѤ·¤Æ¡¢WSDL¤ÇÀ¸À®¤µ¤ì¤ëÆÃÄê¤ÎWSDL¥Ý¡¼¥È(\fIwsdl:port\fR)̾¤ò»ØÄꤷ¤Þ¤¹¡£Îã: +-\fI\-portname "{http://mynamespace/}MyPort"\fR¡£ ++\fB\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѤ·¤Æ¡¢WSDL¤ÇÀ¸À®¤µ¤ì¤ëÆÃÄê¤ÎWSDL¥Ý¡¼¥È(\fBwsdl:port\fR)̾¤ò»ØÄꤷ¤Þ¤¹¡£Îã: ++\fB\-portname "{http://mynamespace/}MyPort"\fR¡£ + .RE + .SH "Îã" + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢Stock¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë\fI@WebService\fRÃí¼á¤ò»ý¤Ä\fIStockService\fR¤Î¥é¥Ã¥Ñ¡¼¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢Stock¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë\fB@WebService\fRÃí¼á¤ò»ý¤Ä\fBStockService\fR¤Î¥é¥Ã¥Ñ¡¼¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-wsgen \-d stock \-cp myclasspath stock\&.StockService ++\fBwsgen \-d stock \-cp myclasspath stock\&.StockService\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢SOAP 1\&.1 WSDL¤ª¤è¤Ó\fI@WebService\fRÃí¼á¤ò»ý¤Ä\fIstock\&.StockService\fR¥¯¥é¥¹¤Î¥¹¥­¡¼¥Þ¤òÀ¸À®¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢SOAP 1\&.1 WSDL¤ª¤è¤Ó\fB@WebService\fRÃí¼á¤ò»ý¤Ä\fBstock\&.StockService\fR¥¯¥é¥¹¤Î¥¹¥­¡¼¥Þ¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-wsgen \-wsdl \-d stock \-cp myclasspath stock\&.StockService ++\fBwsgen \-wsdl \-d stock \-cp myclasspath stock\&.StockService\fR ++ + .fi + .if n \{\ + .RE +@@ -191,7 +196,8 @@ + .RS 4 + .\} + .nf +-wsgen \-wsdl:Xsoap1\&.2 \-d stock \-cp myclasspath stock\&.StockService ++\fBwsgen \-wsdl:Xsoap1\&.2 \-d stock \-cp myclasspath stock\&.StockService \fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/linux/doc/man/ja/wsimport.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/wsimport.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: wsimport +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: wsimport ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "wsimport" "1" "2013ǯ11·î21Æü" "JDK 8" "Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + wsimport \- Web¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¢¡¼¥«¥¤¥Ö(WAR)¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸¤Ç¤­¤ëJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Æ¡¢Ant¥¿¥¹¥¯¤ò»ØÄꤷ¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIwsimport\fR [ \fIoptions\fR ] \fIwsdl\fR ++\fBwsimport\fR [ \fIoptions\fR ] \fIwsdl\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIwsdl\fR +@@ -73,7 +75,7 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIwsimport\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤ÎJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï¡¢¥Ç¥×¥í¥¤¤¹¤ëWSDL¤ª¤è¤Ó¥¹¥­¡¼¥Þ¡¦¥É¥­¥å¥á¥ó¥È¤ª¤è¤Ó¥¨¥ó¥É¥Ý¥¤¥ó¥È¼ÂÁõ¤È¤È¤â¤Ë¡¢WAR¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸¤Ç¤­¤Þ¤¹¡£\fIwsimport\fR¥³¥Þ¥ó¥É¤Ç¤Ï\fIwsimport\fR ++\fBwsimport\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤ÎJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï¡¢¥Ç¥×¥í¥¤¤¹¤ëWSDL¤ª¤è¤Ó¥¹¥­¡¼¥Þ¡¦¥É¥­¥å¥á¥ó¥È¤ª¤è¤Ó¥¨¥ó¥É¥Ý¥¤¥ó¥È¼ÂÁõ¤È¤È¤â¤Ë¡¢WAR¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸¤Ç¤­¤Þ¤¹¡£\fBwsimport\fR¥³¥Þ¥ó¥É¤Ç¤Ï\fBwsimport\fR + Ant¥¿¥¹¥¯¤âÄ󶡤µ¤ì¤Þ¤¹¡£ + http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/wsimportant\&.html¤ÎWsimport Ant Task¥Ú¡¼¥¸¤ÎTools¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +@@ -107,7 +109,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-Îã³°¥¯¥é¥¹¤Ï\fIwsdl:fault\fR¤«¤é¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹(¸ºß¤¹¤ë¾ì¹ç) ++Îã³°¥¯¥é¥¹¤Ï\fBwsdl:fault\fR¤«¤é¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹(¸ºß¤¹¤ë¾ì¹ç) + .RE + .sp + .RS 4 +@@ -118,7 +120,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-ÈóƱ´ü¥ì¥¹¥Ý¥ó¥¹Bean¤Ï¥ì¥¹¥Ý¥ó¥¹\fIwsdl:message\fR¤«¤éÇÉÀ¸¤·¤Þ¤¹(¸ºß¤¹¤ë¾ì¹ç) ++ÈóƱ´ü¥ì¥¹¥Ý¥ó¥¹Bean¤Ï¥ì¥¹¥Ý¥ó¥¹\fBwsdl:message\fR¤«¤éÇÉÀ¸¤·¤Þ¤¹(¸ºß¤¹¤ë¾ì¹ç) + .RE + .sp + .RS 4 +@@ -132,7 +134,7 @@ + JAXB¤¬À¸À®¤¹¤ëÃÍ¥¿¥¤¥×(¥¹¥­¡¼¥Þ¤Î¥¿¥¤¥×¤«¤é¥Þ¥Ã¥×¤µ¤ì¤¿Java¥¯¥é¥¹) + .RE + .PP +-\fIwsgen\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ ++\fBwsgen\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ + .PP + \fBOracle Solaris/Linux\fR: + .sp +@@ -140,7 +142,8 @@ + .RS 4 + .\} + .nf +-/bin/wsimport\&.sh \-help ++\fB/bin/wsimport\&.sh \-help\fR ++ + .fi + .if n \{\ + .RE +@@ -152,7 +155,8 @@ + .RS 4 + .\} + .nf +-\ebin\ewsimport\&.bat \-help ++\fB\ebin\ewsimport\&.bat \-help\fR ++ + .fi + .if n \{\ + .RE +@@ -166,18 +170,18 @@ + .PP + \-b \fIpath\fR + .RS 4 +-³°ÉôJAX\-WS¤Þ¤¿¤ÏJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-b\fR¥ª¥×¥·¥ç¥ó¤ÇÊ£¿ô¤ÎJAX\-WS¤ª¤è¤ÓJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¡¢Bean̾¤Ê¤É¤ò¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£JAX\-WS¤ª¤è¤ÓJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢ ++³°ÉôJAX\-WS¤Þ¤¿¤ÏJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-b\fR¥ª¥×¥·¥ç¥ó¤ÇÊ£¿ô¤ÎJAX\-WS¤ª¤è¤ÓJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¡¢Bean̾¤Ê¤É¤ò¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£JAX\-WS¤ª¤è¤ÓJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢ + http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/wsimportant\&.html¤ÎWSDL Customization¤ÎUsers Guide¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + \-B \fIjaxbOption\fR + .RS 4 +-JAXB¥¹¥­¡¼¥Þ¡¦¥³¥ó¥Ñ¥¤¥é¤Ë\fIjaxbOption\fR¥ª¥×¥·¥ç¥ó¤òÅϤ·¤Þ¤¹¡£ ++JAXB¥¹¥­¡¼¥Þ¡¦¥³¥ó¥Ñ¥¤¥é¤Ë\fBjaxbOption\fR¥ª¥×¥·¥ç¥ó¤òÅϤ·¤Þ¤¹¡£ + .RE + .PP + \-catalog + .RS 4 +-³°Éô¥¨¥ó¥Æ¥£¥Æ¥£»²¾È¤ò²ò·è¤¹¤ë¥«¥¿¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-catalog\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢TR9401¡¢XCatalog¡¢OASIS XML Catalog¤Î³Æ·Á¼°¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/catalog\-support\&.html¤Î ++³°Éô¥¨¥ó¥Æ¥£¥Æ¥£»²¾È¤ò²ò·è¤¹¤ë¥«¥¿¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-catalog\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢TR9401¡¢XCatalog¡¢OASIS XML Catalog¤Î³Æ·Á¼°¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/catalog\-support\&.html¤Î + Catalog Support¥Ú¡¼¥¸¤ÎUsers Guide¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +@@ -188,7 +192,7 @@ + .PP + \-help + .RS 4 +-\fIwsimport\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBwsimport\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-httpproxy: \fIhost\fR:\fIport\fR +@@ -223,7 +227,7 @@ + .PP + \-wsdllocation \fIlocation\fR + .RS 4 +-\fI@WebServiceClient\&.wsdlLocation\fR¤ÎÃͤò»ØÄꤷ¤Þ¤¹¡£ ++\fB@WebServiceClient\&.wsdlLocation\fR¤ÎÃͤò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-target +@@ -233,11 +237,11 @@ + .PP + \-quiet + .RS 4 +-\fIwsimport\fR¥³¥Þ¥ó¥É½ÐÎϤòÍÞÀ©¤·¤Þ¤¹¡£ ++\fBwsimport\fR¥³¥Þ¥ó¥É½ÐÎϤòÍÞÀ©¤·¤Þ¤¹¡£ + .RE + .PP +-\fI\-b\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î\fIJAX\-WS\fR¤ª¤è¤Ó\fIJAXB\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤äBean̾¤Ê¤É¡¢ÍÍ¡¹¤Ê¤â¤Î¤ò¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£\fIJAX\-WS\fR¤ª¤è¤Ó\fIJAXB\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢ +-https://jax\-ws\&.dev\&.java\&.net/nonav/2\&.1\&.1/docs/customizations\&.html¤ÎJAXB¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ ++\fB\-b\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î\fBJAX\-WS\fR¤ª¤è¤Ó\fBJAXB\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤äBean̾¤Ê¤É¡¢ÍÍ¡¹¤Ê¤â¤Î¤ò¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£\fBJAX\-WS\fR¤ª¤è¤Ó\fBJAXB\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢ ++https://jax\-ws\&.java\&.net/nonav/2\&.1\&.2/docs/customizations\&.html¤Î¥«¥¹¥¿¥Þ¥¤¥º¡¦¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SH "Èóɸ½à¥ª¥×¥·¥ç¥ó" + .PP + \-XadditionalHeaders +@@ -249,7 +253,7 @@ + .RS 4 + ǧ¾Ú¾ðÊó¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëWSDL URI¤Ç¤¹¡£¤³¤ÎURI¤Î·Á¼°¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp +-http://\fIuser\-name\fR:\fIpassword\fR@\fIhost\-name\fR/\fIweb\-service\-name\fR>?wsdl ++http://\fIuser\-name\fR:\fBpassword\fR@\fIhost\-name\fR/\fIweb\-service\-name\fR>?wsdl\&. + .RE + .PP + \-Xdebug +@@ -268,13 +272,14 @@ + .RE + .SH "Îã" + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢Java¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¡¢\fIhttp://stockquote\&.example\&.com/quote?wsdl\fR¤ò¥¤¥ó¥Ý¡¼¥È¤·¤Æ¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢Java¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¡¢\fBhttp://stockquote\&.example\&.com/quote?wsdl\fR¤ò¥¤¥ó¥Ý¡¼¥È¤·¤Æ¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-wsimport \-p stockquote http://stockquote\&.example\&.com/quote?wsdl ++\fBwsimport \-p stockquote http://stockquote\&.example\&.com/quote?wsdl\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/linux/doc/man/ja/xjc.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/ja/xjc.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: xjc +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: xjc ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "xjc" "1" "2013ǯ11·î21Æü" "JDK 8" "Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + xjc \- XML¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò´°Á´Ãí¼áÉÕ¤­¤ÎJava¥¯¥é¥¹¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIxjc\fR [ \fIoptions\fR ] \fIschema\fR \fIfile/URL/dir/jar\fR \&.\&.\&. [\fI\-b\fR \fIbindinfo\fR ] \&.\&.\&. ++\fBxjc\fR [ \fIoptions\fR ] \fBschema\fR \fIfile/URL/dir/jar\fR \&.\&.\&. [\fB\-b\fR \fIbindinfo\fR ] \&.\&.\&. + .fi + .if n \{\ + .RE +@@ -64,12 +66,12 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + schema \fIfile/URL/dir/jar \&.\&.\&.\fR + .RS 4 +-XML¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤Î¾ì½ê¡£\fIdir\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£\fIjar\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fI/META\-INF/sun\-jaxb\&.episode\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£ ++XML¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤Î¾ì½ê¡£\fBdir\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£\fBjar\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fB/META\-INF/sun\-jaxb\&.episode\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-b \fIbindinfo\fR +@@ -78,7 +80,7 @@ + .RE + .SH "ÀâÌÀ" + .PP +-¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Îbin¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ëŬÀÚ¤Ê\fIxjc\fR¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤Æ¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤òµ¯Æ°¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤ò¼Â¹Ô¤¹¤ëAnt¥¿¥¹¥¯¤â¤¢¤ê¤Þ¤¹¡£http://jaxb\&.java\&.net/nonav/2\&.1\&.3/docs/xjcTask\&.html¤Î ++¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Îbin¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ëŬÀÚ¤Ê\fBxjc\fR¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤Æ¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤òµ¯Æ°¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤ò¼Â¹Ô¤¹¤ëAnt¥¿¥¹¥¯¤â¤¢¤ê¤Þ¤¹¡£http://jaxb\&.java\&.net/nonav/2\&.1\&.3/docs/xjcTask\&.html¤Î + Using the XJC with Ant¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SH "¥ª¥×¥·¥ç¥ó" + .sp +@@ -111,13 +113,13 @@ + .PP + \-extension + .RS 4 +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢XJC¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤Ï¡¢JAXB»ÅÍͤÎCompatibility¤Î¾Ï¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¥ë¡¼¥ë¤ò¸·Ì©¤Ë¶¯À©¤·¤Þ¤¹¡£ÉÕÏ¿E\&.2¤Ë¤Ï¡¢JAXB v1\&.0¤Ç´°Á´¤Ë¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤°ìÏ¢¤ÎW3C XML¥¹¥­¡¼¥Þµ¡Ç½¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢¤³¤Î¥¹¥¤¥Ã¥Á¤ÇÍ­¸ú¤Ë¤Ê¤ë\fI\-extension\fR¥â¡¼¥É¤Ç¤½¤ì¤é¤Îµ¡Ç½¤¬»ÈÍѤǤ­¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥Ç¥Õ¥©¥ë¥È¤Î¸·Ì©¤Ê¥â¡¼¥É¤Ç¤Ï¡¢»ÅÍͤËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥«¥¹¥¿¥Þ¥¤¥º¤Î¤ß¤¬»ÈÍѤǤ­¤Þ¤¹¡£\fI\-extension\fR¥¹¥¤¥Ã¥Á¤ò»ØÄꤹ¤ì¤Ð¡¢JAXB Vendor Extension¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢XJC¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤Ï¡¢JAXB»ÅÍͤÎCompatibility¤Î¾Ï¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¥ë¡¼¥ë¤ò¸·Ì©¤Ë¶¯À©¤·¤Þ¤¹¡£ÉÕÏ¿E\&.2¤Ë¤Ï¡¢JAXB v1\&.0¤Ç´°Á´¤Ë¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤°ìÏ¢¤ÎW3C XML¥¹¥­¡¼¥Þµ¡Ç½¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢¤³¤Î¥¹¥¤¥Ã¥Á¤ÇÍ­¸ú¤Ë¤Ê¤ë\fB\-extension\fR¥â¡¼¥É¤Ç¤½¤ì¤é¤Îµ¡Ç½¤¬»ÈÍѤǤ­¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥Ç¥Õ¥©¥ë¥È¤Î¸·Ì©¤Ê¥â¡¼¥É¤Ç¤Ï¡¢»ÅÍͤËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥«¥¹¥¿¥Þ¥¤¥º¤Î¤ß¤¬»ÈÍѤǤ­¤Þ¤¹¡£\fB\-extension\fR¥¹¥¤¥Ã¥Á¤ò»ØÄꤹ¤ì¤Ð¡¢JAXB Vendor Extension¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-b \fIfile\fR + .RS 4 +-½èÍý¤¹¤ë³°Éô¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò1¤Ä¤Þ¤¿¤ÏÊ£¿ô»ØÄꤷ¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë\fI\-b\fR¥¹¥¤¥Ã¥Á¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£³°Éô¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¹½Ê¸¤Ï½ÀÆð¤Ç¤¹¡£Ê£¿ô¤Î¥¹¥­¡¼¥Þ¤Î¥«¥¹¥¿¥Þ¥¤¥º¤¬´Þ¤Þ¤ì¤ë1¤Ä¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤¿¤ê¡¢¤½¤ì¤é¤Î¥«¥¹¥¿¥Þ¥¤¥º¤òÊ£¿ô¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤·¤¿¤ê¤Ç¤­¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fIxjc schema1\&.xsd schema2\&.xsd schema3\&.xsd \-b bindings123\&.xjb\fR +-\fIxjc schema1\&.xsd schema2\&.xsd schema3\&.xsd \-b bindings1\&.xjb \-b bindings2\&.xjb \-b bindings3\&.xjb\fR¤Þ¤¿¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤È¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë½çÈÖ¤ÏǤ°Õ¤Ç¤¹¡£ ++½èÍý¤¹¤ë³°Éô¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò1¤Ä¤Þ¤¿¤ÏÊ£¿ô»ØÄꤷ¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë\fB\-b\fR¥¹¥¤¥Ã¥Á¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£³°Éô¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¹½Ê¸¤Ï½ÀÆð¤Ç¤¹¡£Ê£¿ô¤Î¥¹¥­¡¼¥Þ¤Î¥«¥¹¥¿¥Þ¥¤¥º¤¬´Þ¤Þ¤ì¤ë1¤Ä¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤¿¤ê¡¢¤½¤ì¤é¤Î¥«¥¹¥¿¥Þ¥¤¥º¤òÊ£¿ô¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤·¤¿¤ê¤Ç¤­¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fBxjc schema1\&.xsd schema2\&.xsd schema3\&.xsd \-b bindings123\&.xjb\fR ++\fBxjc schema1\&.xsd schema2\&.xsd schema3\&.xsd \-b bindings1\&.xjb \-b bindings2\&.xjb \-b bindings3\&.xjb\fR¤Þ¤¿¡¢¥³¥Þ¥ó¥É¹Ô¤Ë¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤È¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë½çÈÖ¤ÏǤ°Õ¤Ç¤¹¡£ + .RE + .PP + \-d \fIdir\fR +@@ -127,17 +129,17 @@ + .PP + \-p \fIpkg\fR + .RS 4 +-¤³¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Ç¥¿¡¼¥²¥Ã¥È¡¦¥Ñ¥Ã¥±¡¼¥¸¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î»ØÄêÆâÍƤϡ¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÂФ¹¤ë¤¹¤Ù¤Æ¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥«¥¹¥¿¥Þ¥¤¥º¤ä¡¢»ÅÍͤǵ¬Äꤵ¤ì¤Æ¤¤¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¥¢¥ë¥´¥ê¥º¥à¤è¤ê¤âÍ¥À褵¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Ç¥¿¡¼¥²¥Ã¥È¡¦¥Ñ¥Ã¥±¡¼¥¸¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÂФ¹¤ë¤¹¤Ù¤Æ¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥«¥¹¥¿¥Þ¥¤¥º¤ä¡¢»ÅÍͤǵ¬Äꤵ¤ì¤Æ¤¤¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¥¢¥ë¥´¥ê¥º¥à¤è¤ê¤âÍ¥À褵¤ì¤Þ¤¹¡£ + .RE + .PP + \-httpproxy \fIproxy\fR + .RS 4 +-\fI[user[:password]@]proxyHost[:proxyPort]\fR·Á¼°¤ÇHTTP¤Þ¤¿¤ÏHTTPS¥×¥í¥­¥·¤ò»ØÄꤷ¤Þ¤¹¡£¸Å¤¤\fI\-host\fR¤ª¤è¤Ó\fI\-port\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢²¼°Ì¸ß´¹À­¤Î¤¿¤á¤Ë°ú¤­Â³¤­RI¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¤¬¡¢Èó¿ä¾©¤È¤Ê¤ê¤Þ¤·¤¿¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢top¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾¤Î¥æ¡¼¥¶¡¼¤¬É½¼¨¤Ç¤­¤ë°ú¿ô¤Ç¤¹¡£¥»¥­¥å¥ê¥Æ¥£¤ò¹â¤á¤ë¤Ë¤Ï¡¢\fI\-httpproxyfile\fR¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ ++\fI[user[:password]@]proxyHost[:proxyPort]\fR·Á¼°¤ÇHTTP¤Þ¤¿¤ÏHTTPS¥×¥í¥­¥·¤ò»ØÄꤷ¤Þ¤¹¡£¸Å¤¤\fB\-host\fR¤ª¤è¤Ó\fB\-port\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¸åÊý¸ß´¹À­¤Î¤¿¤á¤Ë°ú¤­Â³¤­RI¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¤¬¡¢Èó¿ä¾©¤È¤Ê¤ê¤Þ¤·¤¿¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢top¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾¤Î¥æ¡¼¥¶¡¼¤¬É½¼¨¤Ç¤­¤ë°ú¿ô¤Ç¤¹¡£¥»¥­¥å¥ê¥Æ¥£¤ò¹â¤á¤ë¤Ë¤Ï¡¢\fB\-httpproxyfile\fR¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-httpproxyfile file + .RS 4 +-¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢HTTP¤Þ¤¿¤ÏHTTPS¥×¥í¥­¥·¤ò»ØÄꤷ¤Þ¤¹¡£·Á¼°¤Ï\fI\-httpproxy\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¤¬¡¢¤³¤Î¥Õ¥¡¥¤¥ëÆâ¤Ë»ØÄꤵ¤ì¤¿¥Ñ¥¹¥ï¡¼¥É¤ò¾¤Î¥æ¡¼¥¶¡¼¤¬É½¼¨¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ++¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢HTTP¤Þ¤¿¤ÏHTTPS¥×¥í¥­¥·¤ò»ØÄꤷ¤Þ¤¹¡£·Á¼°¤Ï\fB\-httpproxy\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¤¬¡¢¤³¤Î¥Õ¥¡¥¤¥ëÆâ¤Ë»ØÄꤵ¤ì¤¿¥Ñ¥¹¥ï¡¼¥É¤ò¾¤Î¥æ¡¼¥¶¡¼¤¬É½¼¨¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP + \-classpath arg +@@ -158,12 +160,12 @@ + .PP + \-npa + .RS 4 +-\fI**/package\-info\&.java\fR¤Ø¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ì¥Ù¥ë¤ÎÃí¼á¤ÎÀ¸À®¤òÍÞÀ©¤·¤Þ¤¹¡£¤³¤Î¥¹¥¤¥Ã¥Á¤ò»ÈÍѤ·¤ÆÀ¸À®¤¹¤ë¥³¡¼¥É¤Ç¤Ï¡¢¤³¤ì¤é¤ÎÃí¼á¤¬Â¾¤ÎÀ¸À®ºÑ¥¯¥é¥¹¤ËÆâÉô²½¤µ¤ì¤Þ¤¹¡£ ++\fB**/package\-info\&.java\fR¤Ø¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ì¥Ù¥ë¤ÎÃí¼á¤ÎÀ¸À®¤òÍÞÀ©¤·¤Þ¤¹¡£¤³¤Î¥¹¥¤¥Ã¥Á¤ò»ÈÍѤ·¤ÆÀ¸À®¤¹¤ë¥³¡¼¥É¤Ç¤Ï¡¢¤³¤ì¤é¤ÎÃí¼á¤¬Â¾¤ÎÀ¸À®ºÑ¥¯¥é¥¹¤ËÆâÉô²½¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-no\-header + .RS 4 +-¿¾¯¤Î¥á¥â¤È¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤à¥Õ¥¡¥¤¥ë¡¦¥Ø¥Ã¥À¡¼¡¦¥³¥á¥ó¥È¤ÎÀ¸À®¤òÍÞÀ©¤·¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ¹¤ë¤È¡¢À¸À®¤µ¤ì¤¿¥³¡¼¥É¤È\fIdiff\fR¥³¥Þ¥ó¥É¤È¤Î¸ß´¹À­¤¬¤è¤ê¶¯¤¯¤Ê¤ê¤Þ¤¹¡£ ++¿¾¯¤Î¥á¥â¤È¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤à¥Õ¥¡¥¤¥ë¡¦¥Ø¥Ã¥À¡¼¡¦¥³¥á¥ó¥È¤ÎÀ¸À®¤òÍÞÀ©¤·¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ¹¤ë¤È¡¢À¸À®¤µ¤ì¤¿¥³¡¼¥É¤È\fBdiff\fR¥³¥Þ¥ó¥É¤È¤Î¸ß´¹À­¤¬¤è¤ê¶¯¤¯¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-target 2\&.0 +@@ -218,7 +220,7 @@ + .PP + \fIschema file/URL/dir\fR + .RS 4 +-¥³¥ó¥Ñ¥¤¥ëÂоݤȤʤë1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ë¾ì¹ç¡¢\fIxjc\fR¥³¥Þ¥ó¥É¤Ï¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò¥¹¥­¥ã¥ó¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥ëÂоݤȤʤë1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ë¾ì¹ç¡¢\fBxjc\fR¥³¥Þ¥ó¥É¤Ï¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò¥¹¥­¥ã¥ó¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .RE + .SS "Èóɸ½à¥ª¥×¥·¥ç¥ó" + .PP +@@ -229,12 +231,12 @@ + .PP + \-Xsync\-methods + .RS 4 +-À¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¡¦¥·¥°¥Ë¥Á¥ã¤Ë\fIsynchronized\fR¥­¡¼¥ï¡¼¥É¤¬´Þ¤á¤é¤ì¤Þ¤¹¡£ ++À¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¡¦¥·¥°¥Ë¥Á¥ã¤Ë\fBsynchronized\fR¥­¡¼¥ï¡¼¥É¤¬´Þ¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-mark\-generated + .RS 4 +-À¸À®¤µ¤ì¤¿¥³¡¼¥É¤ËÃí¼á\fI@javax\&.annotation\&.Generated\fR¤òÉÕ¤±¤Þ¤¹¡£ ++À¸À®¤µ¤ì¤¿¥³¡¼¥É¤ËÃí¼á\fB@javax\&.annotation\&.Generated\fR¤òÉÕ¤±¤Þ¤¹¡£ + .RE + .PP + \-episode file +@@ -245,21 +247,21 @@ + .PP + \-host & \-port + .RS 4 +-¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-httpproxy\fR¥ª¥×¥·¥ç¥ó¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤·¤¿¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢²¼°Ì¸ß´¹À­¤ò³ÎÊݤ¹¤ë¤¿¤á¤Ë¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¤¬¡¢¥É¥­¥å¥á¥ó¥È¤Ë¤Ïµ­ºÜ¤µ¤ì¤º¡¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤Çºï½ü¤µ¤ì¤ë²ÄǽÀ­¤â¤¢¤ê¤Þ¤¹¡£ ++¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-httpproxy\fR¥ª¥×¥·¥ç¥ó¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤·¤¿¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¸åÊý¸ß´¹À­¤ò³ÎÊݤ¹¤ë¤¿¤á¤Ë¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¤¬¡¢¥É¥­¥å¥á¥ó¥È¤Ë¤Ïµ­ºÜ¤µ¤ì¤º¡¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤Çºï½ü¤µ¤ì¤ë²ÄǽÀ­¤â¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-use\-runtime + .RS 4 +-JAXB 2\&.0»ÅÍͤǤϡ¢°Ü¿¢À­¤Î¤¢¤ë¥é¥ó¥¿¥¤¥à´Ä¶­¤¬ÄêµÁ¤µ¤ì¤¿¤¿¤á¡¢JAXB RI¤¬\fI**/impl/runtime \fR¥Ñ¥Ã¥±¡¼¥¸¤òÀ¸À®¤¹¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿¡£¤³¤Î¤¿¤á¡¢¤³¤Î¥¹¥¤¥Ã¥Á¤ÏÉÔÍפȤʤꡢºï½ü¤µ¤ì¤Þ¤·¤¿¡£ ++JAXB 2\&.0»ÅÍͤǤϡ¢°Ü¿¢À­¤Î¤¢¤ë¥é¥ó¥¿¥¤¥à´Ä¶­¤¬ÄêµÁ¤µ¤ì¤¿¤¿¤á¡¢JAXB RI¤¬\fB**/impl/runtime \fR¥Ñ¥Ã¥±¡¼¥¸¤òÀ¸À®¤¹¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿¡£¤³¤Î¤¿¤á¡¢¤³¤Î¥¹¥¤¥Ã¥Á¤ÏÉÔÍפȤʤꡢºï½ü¤µ¤ì¤Þ¤·¤¿¡£ + .RE + .PP + \-source + .RS 4 +-\fI\-source\fR¸ß´¹À­¥¹¥¤¥Ã¥Á¤Ï¡¢JAXB 2\&.0¤ÎºÇ½é¤ÎEarly AccessÈǤÇƳÆþ¤µ¤ì¤Þ¤·¤¿¡£¤³¤Î¥¹¥¤¥Ã¥Á¤ÏJAXB 2\&.0¤Îº£¸å¤Î¥ê¥ê¡¼¥¹¤«¤éºï½ü¤µ¤ì¤Þ¤¹¡£1\&.0\&.x¥³¡¼¥É¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢1\&.0\&.x¥³¡¼¥É¡¦¥Ù¡¼¥¹¤Î¥¤¥ó¥¹¥È¡¼¥ë¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-source\fR¸ß´¹À­¥¹¥¤¥Ã¥Á¤Ï¡¢JAXB 2\&.0¤ÎºÇ½é¤ÎEarly AccessÈǤÇƳÆþ¤µ¤ì¤Þ¤·¤¿¡£¤³¤Î¥¹¥¤¥Ã¥Á¤ÏJAXB 2\&.0¤Îº£¸å¤Î¥ê¥ê¡¼¥¹¤«¤éºï½ü¤µ¤ì¤Þ¤¹¡£1\&.0\&.x¥³¡¼¥É¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢1\&.0\&.x¥³¡¼¥É¡¦¥Ù¡¼¥¹¤Î¥¤¥ó¥¹¥È¡¼¥ë¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥³¥ó¥Ñ¥¤¥é¤ÎÀ©¸Â" + .PP +-Ä̾ï¤Ï¡¢´ØÏ¢¤¹¤ë¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¤ò¡¢Æ±¤¸¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¡¦¥¹¥¤¥Ã¥Á¤ò»ØÄꤷ¤Æ1¤Ä¤Îñ°Ì¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Î¤¬ºÇ¤â°ÂÁ´¤Ç¤¹¡£\fIxjc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¤Ï¡¢¼¡¤ÎÀ©¸Â¥ê¥¹¥È¤Ëα°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÎÌäÂê¤Î¤Û¤È¤ó¤É¤Ï¡¢\fIxjc\fR¥³¥Þ¥ó¥É¤ò²¿ÅÙ¤«¸Æ¤Ó½Ð¤·¤ÆÊ£¿ô¤Î¥¹¥­¡¼¥Þ¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¤Ë¤Î¤ßÅö¤Æ¤Ï¤Þ¤ê¤Þ¤¹¡£ ++Ä̾ï¤Ï¡¢´ØÏ¢¤¹¤ë¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¤ò¡¢Æ±¤¸¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¡¦¥¹¥¤¥Ã¥Á¤ò»ØÄꤷ¤Æ1¤Ä¤Îñ°Ì¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Î¤¬ºÇ¤â°ÂÁ´¤Ç¤¹¡£\fBxjc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¤Ï¡¢¼¡¤ÎÀ©¸Â¥ê¥¹¥È¤Ëα°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÎÌäÂê¤Î¤Û¤È¤ó¤É¤Ï¡¢\fBxjc\fR¥³¥Þ¥ó¥É¤ò²¿ÅÙ¤«¸Æ¤Ó½Ð¤·¤ÆÊ£¿ô¤Î¥¹¥­¡¼¥Þ¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¤Ë¤Î¤ßÅö¤Æ¤Ï¤Þ¤ê¤Þ¤¹¡£ + .PP + Ê£¿ô¤Î¥¹¥­¡¼¥Þ¤òƱ»þ¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¤Ï¡¢¥¿¡¼¥²¥Ã¥È¤ÎJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ë¼¡¤ÎÍ¥Àè½ç°Ì¤Î¥ë¡¼¥ë¤¬Å¬ÍѤµ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +@@ -271,7 +273,7 @@ + .sp -1 + .IP " 1." 4.2 + .\} +-\fI\-p\fR¥ª¥×¥·¥ç¥ó¤¬ºÇ¤âÍ¥À褵¤ì¤Þ¤¹¡£ ++\fB\-p\fR¥ª¥×¥·¥ç¥ó¤¬ºÇ¤âÍ¥À褵¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -293,7 +295,7 @@ + .sp -1 + .IP " 3." 4.2 + .\} +-\fItargetNamespace\fR¤¬Àë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fIt\fR\fIargetNamespace\fR¤ò»ÅÍͤÇÄêµÁ¤µ¤ì¤Æ¤¤¤ëJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¥¢¥ë¥´¥ê¥º¥à¤ËŬÍѤ·¤Þ¤¹¡£ ++\fBtargetNamespace\fR¤¬Àë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fBt\fR\fBargetNamespace\fR¤ò»ÅÍͤÇÄêµÁ¤µ¤ì¤Æ¤¤¤ëJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¥¢¥ë¥´¥ê¥º¥à¤ËŬÍѤ·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -304,7 +306,7 @@ + .sp -1 + .IP " 4." 4.2 + .\} +-\fItargetNamespace\fR¤¬Àë¸À¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIgenerated\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fBtargetNamespace\fR¤¬Àë¸À¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBgenerated\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + 1¤Ä¤Î¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤¬Ê£¿ô¤Î\fIjaxb:schemaBindings\fR¤ò»ý¤Ä¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤¿¤á¡¢°Û¤Ê¤ëJava¥Ñ¥Ã¥±¡¼¥¸¤Ë¥³¥ó¥Ñ¥¤¥é¤µ¤ì¤ëƱ°ì¥¿¡¼¥²¥Ã¥È¡¦¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤¬2¤Ä¤Î¥¹¥­¡¼¥Þ¤ò»ý¤Ä¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ +--- ./jdk/src/linux/doc/man/java.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/java.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,2001 +1,3461 @@ + '\" t +-.\" Copyright (c) 1994, 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. +-.\" +-.\" Arch: generic +-.\" Software: JDK 8 +-.\" Date: 21 November 2013 +-.\" SectDesc: Basic Tools +-.\" Title: java.1 ++.\" Copyright (c) 1994, 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. ++.\" ++.\" Title: java ++.\" Language: English ++.\" Date: 08 August 2014 ++.\" SectDesc: Basic Tools ++.\" Software: JDK 8 ++.\" Arch: generic ++.\" Part Number: E38207-03 + .\" + .if n .pl 99999 +-.TH java 1 "21 November 2013" "JDK 8" "Basic Tools" +-.\" ----------------------------------------------------------------- +-.\" * Define some portability stuff +-.\" ----------------------------------------------------------------- +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.\" http://bugs.debian.org/507673 +-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" ----------------------------------------------------------------- +-.\" * set default formatting +-.\" ----------------------------------------------------------------- +-.\" disable hyphenation +-.nh +-.\" disable justification (adjust text to left margin only) +-.ad l +-.\" ----------------------------------------------------------------- +-.\" * MAIN CONTENT STARTS HERE * +-.\" ----------------------------------------------------------------- +- +-.SH NAME ++.TH "java" "1" "08 August 2014" "JDK 8" "Basic Tools" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" + java \- Launches a Java application\&. +-.SH SYNOPSIS +-.sp +-.nf +- ++.SH "SYNOPSIS" ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjava\fR [\fIoptions\fR] \fIclassname\fR [\fIargs\fR] +-.fi +-.nf +- ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjava\fR [\fIoptions\fR] \fB\-jar\fR \fIfilename\fR [\fIargs\fR] +-.fi +-.sp +-.TP ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + \fIoptions\fR +-Command-line options separated by spaces\&. See Options\&. +-.TP ++.RS 4 ++Command\-line options separated by spaces\&. See Options\&. ++.RE ++.PP + \fIclassname\fR ++.RS 4 + The name of the class to be launched\&. +-.TP ++.RE ++.PP + \fIfilename\fR +-The name of the Java Archive (JAR) file to be called\&. Used only with the \f3-jar\fR option\&. +-.TP ++.RS 4 ++The name of the Java Archive (JAR) file to be called\&. Used only with the ++\fB\-jar\fR ++option\&. ++.RE ++.PP + \fIargs\fR +-The arguments passed to the \f3main()\fR method separated by spaces\&. +-.SH DESCRIPTION +-The \f3java\fR command starts a Java application\&. It does this by starting the Java Runtime Environment (JRE), loading the specified class, and calling that class\&'s \f3main()\fR method\&. The method must be declared \fIpublic\fR and \fIstatic\fR, it must not return any value, and it must accept a \f3String\fR array as a parameter\&. The method declaration has the following form: +-.sp +-.nf +-\f3public static void main(String[] args)\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The \f3java\fR command can be used to launch a JavaFX application by loading a class that either has a \f3main()\fR method or that extends \f3javafx\&.application\&.Application\fR\&. In the latter case, the launcher constructs an instance of the \f3Application\fR class, calls its \f3init()\fR method, and then calls the \f3start(javafx\&.stage\&.Stage)\fR method\&. ++.RS 4 ++The arguments passed to the ++\fBmain()\fR ++method separated by spaces\&. ++.RE ++.SH "DESCRIPTION" + .PP +-By default, the first argument that is not an option of the \f3java\fR command is the fully qualified name of the class to be called\&. If the \f3-jar\fR option is specified, its argument is the name of the JAR file containing class and resource files for the application\&. The startup class must be indicated by the \f3Main-Class\fR manifest header in its source code\&. ++The ++\fBjava\fR ++command starts a Java application\&. It does this by starting the Java Runtime Environment (JRE), loading the specified class, and calling that class\*(Aqs ++\fBmain()\fR ++method\&. The method must be declared ++\fIpublic\fR ++and ++\fIstatic\fR, it must not return any value, and it must accept a ++\fBString\fR ++array as a parameter\&. The method declaration has the following form: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic static void main(String[] args)\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The ++\fBjava\fR ++command can be used to launch a JavaFX application by loading a class that either has a ++\fBmain()\fR ++method or that extends ++\fBjavafx\&.application\&.Application\fR\&. In the latter case, the launcher constructs an instance of the ++\fBApplication\fR ++class, calls its ++\fBinit()\fR ++method, and then calls the ++\fBstart(javafx\&.stage\&.Stage)\fR ++method\&. ++.PP ++By default, the first argument that is not an option of the ++\fBjava\fR ++command is the fully qualified name of the class to be called\&. If the ++\fB\-jar\fR ++option is specified, its argument is the name of the JAR file containing class and resource files for the application\&. The startup class must be indicated by the ++\fBMain\-Class\fR ++manifest header in its source code\&. + .PP + The JRE searches for the startup class (and other classes used by the application) in three sets of locations: the bootstrap class path, the installed extensions, and the user\(cqs class path\&. + .PP +-Arguments after the class file name or the JAR file name are passed to the \f3main()\fR method\&. +-.SH OPTIONS +-The \f3java\fR command supports a wide range of options that can be divided into the following categories: +-.TP 0.2i +-\(bu ++Arguments after the class file name or the JAR file name are passed to the ++\fBmain()\fR ++method\&. ++.SH "OPTIONS" ++.PP ++The ++\fBjava\fR ++command supports a wide range of options that can be divided into the following categories: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Standard Options +-.TP 0.2i +-\(bu +-Non-Standard Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Non\-Standard Options ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced Runtime Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced JIT Compiler Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced Serviceability Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced Garbage Collection Options ++.RE + .PP + Standard options are guaranteed to be supported by all implementations of the Java Virtual Machine (JVM)\&. They are used for common actions, such as checking the version of the JRE, setting the class path, enabling verbose output, and so on\&. + .PP +-Non-standard options are general purpose options that are specific to the Java HotSpot Virtual Machine, so they are not guaranteed to be supported by all JVM implementations, and are subject to change\&. These options start with \f3-X\fR\&. ++Non\-standard options are general purpose options that are specific to the Java HotSpot Virtual Machine, so they are not guaranteed to be supported by all JVM implementations, and are subject to change\&. These options start with ++\fB\-X\fR\&. + .PP +-Advanced options are not recommended for casual use\&. These are developer options used for tuning specific areas of the Java HotSpot Virtual Machine operation that often have specific system requirements and may require privileged access to system configuration parameters\&. They are also not guaranteed to be supported by all JVM implementations, and are subject to change\&. Advanced options start with \f3-XX\fR\&. ++Advanced options are not recommended for casual use\&. These are developer options used for tuning specific areas of the Java HotSpot Virtual Machine operation that often have specific system requirements and may require privileged access to system configuration parameters\&. They are also not guaranteed to be supported by all JVM implementations, and are subject to change\&. Advanced options start with ++\fB\-XX\fR\&. + .PP + To keep track of the options that were deprecated or removed in the latest release, there is a section named Deprecated and Removed Options at the end of the document\&. + .PP +-Boolean options are used to either enable a feature that is disabled by default or disable a feature that is enabled by default\&. Such options do not require a parameter\&. Boolean \f3-XX\fR options are enabled using the plus sign (\f3-XX:+\fR\fIOptionName\fR) and disabled using the minus sign (\f3-XX:-\fR\fIOptionName\fR)\&. ++Boolean options are used to either enable a feature that is disabled by default or disable a feature that is enabled by default\&. Such options do not require a parameter\&. Boolean ++\fB\-XX\fR ++options are enabled using the plus sign (\fB\-XX:+\fR\fIOptionName\fR) and disabled using the minus sign (\fB\-XX:\-\fR\fIOptionName\fR)\&. + .PP +-For options that require an argument, the argument may be separated from the option name by a space, a colon (:), or an equal sign (=), or the argument may directly follow the option (the exact syntax differs for each option)\&. If you are expected to specify the size in bytes, you can use no suffix, or use the suffix \f3k\fR or \f3K\fR for kilobytes (KB), \f3m\fR or \f3M\fR for megabytes (MB), \f3g\fR or \f3G\fR for gigabytes (GB)\&. For example, to set the size to 8 GB, you can specify either \f38g\fR, \f38192m\fR, \f38388608k\fR, or \f38589934592\fR as the argument\&. If you are expected to specify the percentage, use a number from 0 to 1 (for example, specify \f30\&.25\fR for 25%)\&. +-.SS STANDARD\ OPTIONS ++For options that require an argument, the argument may be separated from the option name by a space, a colon (:), or an equal sign (=), or the argument may directly follow the option (the exact syntax differs for each option)\&. If you are expected to specify the size in bytes, you can use no suffix, or use the suffix ++\fBk\fR ++or ++\fBK\fR ++for kilobytes (KB), ++\fBm\fR ++or ++\fBM\fR ++for megabytes (MB), ++\fBg\fR ++or ++\fBG\fR ++for gigabytes (GB)\&. For example, to set the size to 8 GB, you can specify either ++\fB8g\fR, ++\fB8192m\fR, ++\fB8388608k\fR, or ++\fB8589934592\fR ++as the argument\&. If you are expected to specify the percentage, use a number from 0 to 1 (for example, specify ++\fB0\&.25\fR ++for 25%)\&. ++.SS "Standard Options" ++.PP + These are the most commonly used options that are supported by all implementations of the JVM\&. +-.TP +--agentlib:\fIlibname\fR[=\fIoptions\fR] ++.PP ++\-agentlib:\fIlibname\fR[=\fIoptions\fR] ++.RS 4 ++Loads the specified native agent library\&. After the library name, a comma\-separated list of options specific to the library can be used\&. ++.sp ++If the option ++\fB\-agentlib:foo\fR ++is specified, then the JVM attempts to load the library named ++\fBlibfoo\&.so\fR ++in the location specified by the ++\fBLD_LIBRARY_PATH\fR ++system variable (on OS X this variable is ++\fBDYLD_LIBRARY_PATH\fR)\&. ++.sp ++The following example shows how to load the heap profiling tool (HPROF) library and get sample CPU information every 20 ms, with a stack depth of 3: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-agentlib:hprof=cpu=samples,interval=20,depth=3\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example shows how to load the Java Debug Wire Protocol (JDWP) library and listen for the socket connection on port 8000, suspending the JVM before the main class loads: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-agentlib:jdwp=transport=dt_socket,server=y,address=8000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++For more information about the native agent libraries, refer to the following: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++The ++\fBjava\&.lang\&.instrument\fR ++package description at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Agent Command Line Options in the JVM Tools Interface guide at http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting ++.RE ++.RE ++.PP ++\-agentpath:\fIpathname\fR[=\fIoptions\fR] ++.RS 4 ++Loads the native agent library specified by the absolute path name\&. This option is equivalent to ++\fB\-agentlib\fR ++but uses the full path and file name of the library\&. ++.RE ++.PP ++\-client ++.RS 4 ++Selects the Java HotSpot Client VM\&. The 64\-bit version of the Java SE Development Kit (JDK) currently ignores this option and instead uses the Server JVM\&. ++.sp ++For default JVM selection, see Server\-Class Machine Detection at ++ ++http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server\-class\&.html ++.RE ++.PP ++\-D\fIproperty\fR=\fIvalue\fR ++.RS 4 ++Sets a system property value\&. The ++\fIproperty\fR ++variable is a string with no spaces that represents the name of the property\&. The ++\fIvalue\fR ++variable is a string that represents the value of the property\&. If ++\fIvalue\fR ++is a string with spaces, then enclose it in quotation marks (for example ++\fB\-Dfoo="foo bar"\fR)\&. ++.RE ++.PP ++\-d32 ++.RS 4 ++Runs the application in a 32\-bit environment\&. If a 32\-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32\-bit environment unless a 64\-bit system is used\&. ++.RE ++.PP ++\-d64 ++.RS 4 ++Runs the application in a 64\-bit environment\&. If a 64\-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32\-bit environment unless a 64\-bit system is used\&. ++.sp ++Currently only the Java HotSpot Server VM supports 64\-bit operation, and the ++\fB\-server\fR ++option is implicit with the use of ++\fB\-d64\fR\&. The ++\fB\-client\fR ++option is ignored with the use of ++\fB\-d64\fR\&. This is subject to change in a future release\&. ++.RE ++.PP ++\-disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] + .br +-Loads the specified native agent library\&. After the library name, a comma-separated list of options specific to the library can be used\&. ++\-da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.RS 4 ++Disables assertions\&. By default, assertions are disabled in all packages and classes\&. ++.sp ++With no arguments, ++\fB\-disableassertions\fR ++(\fB\-da\fR) disables assertions in all packages and classes\&. With the ++\fIpackagename\fR ++argument ending in ++\fB\&.\&.\&.\fR, the switch disables assertions in the specified package and any subpackages\&. If the argument is simply ++\fB\&.\&.\&.\fR, then the switch disables assertions in the unnamed package in the current working directory\&. With the ++\fIclassname\fR ++argument, the switch disables assertions in the specified class\&. ++.sp ++The ++\fB\-disableassertions\fR ++(\fB\-da\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to disable assertions in all classes except for system classes\&. The ++\fB\-disablesystemassertions\fR ++option enables you to disable assertions in all system classes\&. ++.sp ++To explicitly enable assertions in specific packages or classes, use the ++\fB\-enableassertions\fR ++(\fB\-ea\fR) option\&. Both options can be used at the same time\&. For example, to run the ++\fBMyClass\fR ++application with assertions enabled in package ++\fBcom\&.wombat\&.fruitbat\fR ++(and any subpackages) but disabled in class ++\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-disablesystemassertions ++.br ++\-dsa ++.RS 4 ++Disables assertions in all system classes\&. ++.RE ++.PP ++\-enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.br ++\-ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.RS 4 ++Enables assertions\&. By default, assertions are disabled in all packages and classes\&. ++.sp ++With no arguments, ++\fB\-enableassertions\fR ++(\fB\-ea\fR) enables assertions in all packages and classes\&. With the ++\fIpackagename\fR ++argument ending in ++\fB\&.\&.\&.\fR, the switch enables assertions in the specified package and any subpackages\&. If the argument is simply ++\fB\&.\&.\&.\fR, then the switch enables assertions in the unnamed package in the current working directory\&. With the ++\fIclassname\fR ++argument, the switch enables assertions in the specified class\&. ++.sp ++The ++\fB\-enableassertions\fR ++(\fB\-ea\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to enable assertions in all classes except for system classes\&. The ++\fB\-enablesystemassertions\fR ++option provides a separate switch to enable assertions in all system classes\&. ++.sp ++To explicitly disable assertions in specific packages or classes, use the ++\fB\-disableassertions\fR ++(\fB\-da\fR) option\&. If a single command contains multiple instances of these switches, then they are processed in order before loading any classes\&. For example, to run the ++\fBMyClass\fR ++application with assertions enabled only in package ++\fBcom\&.wombat\&.fruitbat\fR ++(and any subpackages) but disabled in class ++\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-enablesystemassertions ++.br ++\-esa ++.RS 4 ++Enables assertions in all system classes\&. ++.RE ++.PP ++\-help ++.br ++\-? ++.RS 4 ++Displays usage information for the ++\fBjava\fR ++command without actually running the JVM\&. ++.RE ++.PP ++\-jar \fIfilename\fR ++.RS 4 ++Executes a program encapsulated in a JAR file\&. The ++\fIfilename\fR ++argument is the name of a JAR file with a manifest that contains a line in the form ++\fBMain\-Class:\fR\fIclassname\fR ++that defines the class with the ++\fBpublic static void main(String[] args)\fR ++method that serves as your application\*(Aqs starting point\&. ++.sp ++When you use the ++\fB\-jar\fR ++option, the specified JAR file is the source of all user classes, and other class path settings are ignored\&. ++.sp ++For more information about JAR files, see the following resources: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++jar(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++The Java Archive (JAR) Files guide at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jar/index\&.html ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Lesson: Packaging Programs in JAR Files at + +-If the option \f3-agentlib:foo\fR is specified, then the JVM attempts to load the library named \f3libfoo\&.so\fR in the location specified by the \f3LD_LIBRARY_PATH\fR system variable (on OS X this variable is \f3DYLD_LIBRARY_PATH\fR)\&. ++http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html ++.RE ++.RE ++.PP ++\-javaagent:\fIjarpath\fR[=\fIoptions\fR] ++.RS 4 ++Loads the specified Java programming language agent\&. For more information about instrumenting Java applications, see the ++\fBjava\&.lang\&.instrument\fR ++package description in the Java API documentation at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html ++.RE ++.PP ++\-jre\-restrict\-search ++.RS 4 ++Includes user\-private JREs in the version search\&. ++.RE ++.PP ++\-no\-jre\-restrict\-search ++.RS 4 ++Excludes user\-private JREs from the version search\&. ++.RE ++.PP ++\-server ++.RS 4 ++Selects the Java HotSpot Server VM\&. The 64\-bit version of the JDK supports only the Server VM, so in that case the option is implicit\&. ++.sp ++For default JVM selection, see Server\-Class Machine Detection at + +-The following example shows how to load the heap profiling tool (HPROF) library and get sample CPU information every 20 ms, with a stack depth of 3: +-.sp +-.nf +-\f3\-agentlib:hprof=cpu=samples,interval=20,depth=3\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following example shows how to load the Java Debug Wire Protocol (JDWP) library and listen for the socket connection on port 8000, suspending the JVM before the main class loads: +-.sp +-.nf +-\f3\-agentlib:jdwp=transport=dt_socket,server=y,address=8000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-For more information about the native agent libraries, refer to the following: +-.RS +-.TP 0.2i +-\(bu +-The \f3java\&.lang\&.instrument\fR package description at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package-summary\&.html +-.TP 0.2i +-\(bu +-Agent Command Line Options in the JVM Tools Interface guide at http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting +-.RE +- +-.TP +--agentpath:\fIpathname\fR[=\fIoptions\fR] +-.br +-Loads the native agent library specified by the absolute path name\&. This option is equivalent to \f3-agentlib\fR but uses the full path and file name of the library\&. +-.TP +--client +-.br +-Selects the Java HotSpot Client VM\&. The 64-bit version of the Java SE Development Kit (JDK) currently ignores this option and instead uses the Server JVM\&. +- +-For default JVM selection, see Server-Class Machine Detection at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server-class\&.html +-.TP +--D\fIproperty\fR=\fIvalue\fR +-.br +-Sets a system property value\&. The \fIproperty\fR variable is a string with no spaces that represents the name of the property\&. The \fIvalue\fR variable is a string that represents the value of the property\&. If \fIvalue\fR is a string with spaces, then enclose it in quotation marks (for example \f3-Dfoo="foo bar"\fR)\&. +-.TP +--d32 +-.br +-Runs the application in a 32-bit environment\&. If a 32-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32-bit environment unless a 64-bit system is used\&. +-.TP +--d64 +-.br +-Runs the application in a 64-bit environment\&. If a 64-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32-bit environment unless a 64-bit system is used\&. +- +-Currently only the Java HotSpot Server VM supports 64-bit operation, and the \f3-server\fR option is implicit with the use of \f3-d64\fR\&. The \f3-client\fR option is ignored with the use of \f3-d64\fR\&. This is subject to change in a future release\&. +-.TP ++http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server\-class\&.html ++.RE ++.PP ++\-showversion ++.RS 4 ++Displays version information and continues execution of the application\&. This option is equivalent to the ++\fB\-version\fR ++option except that the latter instructs the JVM to exit after displaying version information\&. ++.RE ++.PP ++\-splash:\fIimgname\fR ++.RS 4 ++Shows the splash screen with the image specified by ++\fIimgname\fR\&. For example, to show the ++\fBsplash\&.gif\fR ++file from the ++\fBimages\fR ++directory when starting your application, use the following option: ++.sp ++.if n \{\ ++.RS 4 ++.\} + .nf +--disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], -da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] +-.br ++\fB\-splash:images/splash\&.gif\fR ++ + .fi +-Disables assertions\&. By default, assertions are disabled in all packages and classes\&. +- +-With no arguments, \f3-disableassertions\fR (\f3-da\fR) disables assertions in all packages and classes\&. With the \fIpackagename\fR argument ending in \f3\&.\&.\&.\fR, the switch disables assertions in the specified package and any subpackages\&. If the argument is simply \f3\&.\&.\&.\fR, then the switch disables assertions in the unnamed package in the current working directory\&. With the \fIclassname\fR argument\f3\fR, the switch disables assertions in the specified class\&. +- +-The \f3-disableassertions\fR (\f3-da\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to disable assertions in all classes except for system classes\&. The \f3-disablesystemassertions\fR option enables you to disable assertions in all system classes\&. +- +-To explicitly enable assertions in specific packages or classes, use the \f3-enableassertions\fR (\f3-ea\fR) option\&. Both options can be used at the same time\&. For example, to run the \f3MyClass\fR application with assertions enabled in package \f3com\&.wombat\&.fruitbat\fR (and any subpackages) but disabled in class \f3com\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: +-.sp +-.nf +-\f3java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--disablesystemassertions, -dsa +-.br +-Disables assertions in all system classes\&. +-.TP ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-verbose:class ++.RS 4 ++Displays information about each loaded class\&. ++.RE ++.PP ++\-verbose:gc ++.RS 4 ++Displays information about each garbage collection (GC) event\&. ++.RE ++.PP ++\-verbose:jni ++.RS 4 ++Displays information about the use of native methods and other Java Native Interface (JNI) activity\&. ++.RE ++.PP ++\-version ++.RS 4 ++Displays version information and then exits\&. This option is equivalent to the ++\fB\-showversion\fR ++option except that the latter does not instruct the JVM to exit after displaying version information\&. ++.RE ++.PP ++\-version:\fIrelease\fR ++.RS 4 ++Specifies the release version to be used for running the application\&. If the version of the ++\fBjava\fR ++command called does not meet this specification and an appropriate implementation is found on the system, then the appropriate implementation will be used\&. ++.sp ++The ++\fIrelease\fR ++argument specifies either the exact version string, or a list of version strings and ranges separated by spaces\&. A ++\fIversion string\fR ++is the developer designation of the version number in the following form: ++\fB1\&.\fR\fIx\fR\fB\&.0_\fR\fIu\fR ++(where ++\fIx\fR ++is the major version number, and ++\fIu\fR ++is the update version number)\&. A ++\fIversion range\fR ++is made up of a version string followed by a plus sign (\fB+\fR) to designate this version or later, or a part of a version string followed by an asterisk (\fB*\fR) to designate any version string with a matching prefix\&. Version strings and ranges can be combined using a space for a logical ++\fIOR\fR ++combination, or an ampersand (\fB&\fR) for a logical ++\fIAND\fR ++combination of two version strings/ranges\&. For example, if running the class or JAR file requires either JRE 6u13 (1\&.6\&.0_13), or any JRE 6 starting from 6u10 (1\&.6\&.0_10), specify the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} + .nf +--enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], -ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] +-.br ++\fB\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+"\fR ++ + .fi +-Enables assertions\&. By default, assertions are disabled in all packages and classes\&. +- +-With no arguments, \f3-enableassertions\fR (\f3-ea\fR) enables assertions in all packages and classes\&. With the \fIpackagename\fR argument ending in \f3\&.\&.\&.\fR, the switch enables assertions in the specified package and any subpackages\&. If the argument is simply \f3\&.\&.\&.\fR, then the switch enables assertions in the unnamed package in the current working directory\&. With the \fIclassname\fR argument\f3\fR, the switch enables assertions in the specified class\&. +- +-The \f3-enableassertions\fR (\f3-ea\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to enable assertions in all classes except for system classes\&. The \f3-enablesystemassertions\fR option provides a separate switch to enable assertions in all system classes\&. +- +-To explicitly disable assertions in specific packages or classes, use the \f3-disableassertions\fR (\f3-da\fR) option\&. If a single command contains multiple instances of these switches, then they are processed in order before loading any classes\&. For example, to run the \f3MyClass\fR application with assertions enabled only in package \f3com\&.wombat\&.fruitbat\fR (and any subpackages) but disabled in class \f3com\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: +-.sp +-.nf +-\f3java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--enablesystemassertions, -esa +-.br +-Enables assertions in all system classes\&. +-.TP +--help, -? +-.br +-Displays usage information for the \f3java\fR command without actually running the JVM\&. +-.TP +--jar \fIfilename\fR +-.br +-Executes a program encapsulated in a JAR file\&. The \fIfilename\fR argument is the name of a JAR file with a manifest that contains a line in the form \f3Main-Class:\fR\fIclassname\fR that defines the class with the \f3public static void main(String[] args)\fR method that serves as your application\&'s starting point\&. +- +-When you use the \f3-jar\fR option, the specified JAR file is the source of all user classes, and other class path settings are ignored\&. +- +-For more information about JAR files, see the following resources: +-.RS +-.TP 0.2i +-\(bu +-jar(1) +-.TP 0.2i +-\(bu +-The Java Archive (JAR) Files guide at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jar/index\&.html +-.TP 0.2i +-\(bu +-Lesson: Packaging Programs in JAR Files at http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html +-.RE +- +-.TP +--javaagent:\fIjarpath\fR[=\fIoptions\fR] +-.br +-Loads the specified Java programming language agent\&. For more information about instrumenting Java applications, see the \f3java\&.lang\&.instrument\fR package description in the Java API documentation at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package-summary\&.html +-.TP +--jre-restrict-search +-.br +-Includes user-private JREs in the version search\&. +-.TP +--no-jre-restrict-search +-.br +-Excludes user-private JREs from the version search\&. +-.TP +--server +-.br +-Selects the Java HotSpot Server VM\&. The 64-bit version of the JDK supports only the Server VM, so in that case the option is implicit\&. +- +-For default JVM selection, see Server-Class Machine Detection at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server-class\&.html +-.TP +--showversion +-.br +-Displays version information and continues execution of the application\&. This option is equivalent to the \f3-version\fR option except that the latter instructs the JVM to exit after displaying version information\&. +-.TP +--splash:\fIimgname\fR +-.br +-Shows the splash screen with the image specified by \fIimgname\fR\&. For example, to show the \f3splash\&.gif\fR file from the \f3images\fR directory when starting your application, use the following option: +-.sp +-.nf +-\f3\-splash:images/splash\&.gif\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--verbose:class +-.br +-Displays information about each loaded class\&. +-.TP +--verbose:gc +-.br +-Displays information about each garbage collection (GC) event\&. +-.TP +--verbose:jni +-.br +-Displays information about the use of native methods and other Java Native Interface (JNI) activity\&. +-.TP +--version +-.br +-Displays version information and then exits\&. This option is equivalent to the \f3-showversion\fR option except that the latter does not instruct the JVM to exit after displaying version information\&. +-.TP +--version:\fIrelease\fR +-.br +-Specifies the release version to be used for running the application\&. If the version of the \f3java\fR command called does not meet this specification and an appropriate implementation is found on the system, then the appropriate implementation will be used\&. +- +-The \fIrelease\fR argument specifies either the exact version string, or a list of version strings and ranges separated by spaces\&. A \fIversion string\fR is the developer designation of the version number in the following form: \f31\&.\fR\fIx\fR\f3\&.0_\fR\fIu\fR (where \fIx\fR is the major version number, and \fIu\fR is the update version number)\&. A \fIversion range\fR is made up of a version string followed by a plus sign (\f3+\fR) to designate this version or later, or a part of a version string followed by an asterisk (\f3*\fR) to designate any version string with a matching prefix\&. Version strings and ranges can be combined using a space for a logical \fIOR\fR combination, or an ampersand (\f3&\fR) for a logical \fIAND\fR combination of two version strings/ranges\&. For example, if running the class or JAR file requires either JRE 6u13 (1\&.6\&.0_13), or any JRE 6 starting from 6u10 (1\&.6\&.0_10), specify the following: +-.sp +-.nf +-\f3\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Quotation marks are necessary only if there are spaces in the \fIrelease\fR parameter\&. +- ++.if n \{\ ++.RE ++.\} ++Quotation marks are necessary only if there are spaces in the ++\fIrelease\fR ++parameter\&. ++.sp + For JAR files, the preference is to specify version requirements in the JAR file manifest rather than on the command line\&. +-.SS NON-STANDARD\ OPTIONS ++.RE ++.SS "Non\-Standard Options" ++.PP + These options are general purpose options that are specific to the Java HotSpot Virtual Machine\&. +-.TP +--X +-.br +-Displays help for all available \f3-X\fR options\&. +-.TP +--Xbatch +-.br +-Disables background compilation\&. By default, the JVM compiles the method as a background task, running the method in interpreter mode until the background compilation is finished\&. The \f3-Xbatch\fR flag disables background compilation so that compilation of all methods proceeds as a foreground task until completed\&. +- +-This option is equivalent to \f3-XX:-BackgroundCompilation\fR\&. +-.TP +--Xbootclasspath:\fIpath\fR +-.br ++.PP ++\-X ++.RS 4 ++Displays help for all available ++\fB\-X\fR ++options\&. ++.RE ++.PP ++\-Xbatch ++.RS 4 ++Disables background compilation\&. By default, the JVM compiles the method as a background task, running the method in interpreter mode until the background compilation is finished\&. The ++\fB\-Xbatch\fR ++flag disables background compilation so that compilation of all methods proceeds as a foreground task until completed\&. ++.sp ++This option is equivalent to ++\fB\-XX:\-BackgroundCompilation\fR\&. ++.RE ++.PP ++\-Xbootclasspath:\fIpath\fR ++.RS 4 + Specifies a list of directories, JAR files, and ZIP archives separated by colons (:) to search for boot class files\&. These are used in place of the boot class files included in the JDK\&. +- +-\fI\fRDo not deploy applications that use this option to override a class in \f3rt\&.jar\fR, because this violates the JRE binary code license\&. +-.TP +--Xbootclasspath/a:\fIpath\fR +-.br ++.sp ++Do not deploy applications that use this option to override a class in ++\fBrt\&.jar\fR, because this violates the JRE binary code license\&. ++.RE ++.PP ++\-Xbootclasspath/a:\fIpath\fR ++.RS 4 + Specifies a list of directories, JAR files, and ZIP archives separated by colons (:) to append to the end of the default bootstrap class path\&. +- +-Do not deploy applications that use this option to override a class in \f3rt\&.jar\fR, because this violates the JRE binary code license\&. +-.TP +--Xbootclasspath/p:\fIpath\fR +-.br ++.sp ++Do not deploy applications that use this option to override a class in ++\fBrt\&.jar\fR, because this violates the JRE binary code license\&. ++.RE ++.PP ++\-Xbootclasspath/p:\fIpath\fR ++.RS 4 + Specifies a list of directories, JAR files, and ZIP archives separated by colons (:) to prepend to the front of the default bootstrap class path\&. +- +-Do not deploy applications that use this option to override a class in \f3rt\&.jar\fR, because this violates the JRE binary code license\&. +-.TP +--Xboundthreads +-.br +-Binds user-level threads to kernel threads\&. +-.TP +--Xcheck:jni +-.br ++.sp ++Do not deploy applications that use this option to override a class in ++\fBrt\&.jar\fR, because this violates the JRE binary code license\&. ++.RE ++.PP ++\-Xcheck:jni ++.RS 4 + Performs additional checks for Java Native Interface (JNI) functions\&. Specifically, it validates the parameters passed to the JNI function and the runtime environment data before processing the JNI request\&. Any invalid data encountered indicates a problem in the native code, and the JVM will terminate with an irrecoverable error in such cases\&. Expect a performance degradation when this option is used\&. +-.TP +--Xcomp +-.br +-Forces compilation of methods on first invocation\&. By default, the Client VM (\f3-client\fR) performs 1,000 interpreted method invocations and the Server VM (\f3-server\fR) performs 10,000 interpreted method invocations to gather information for efficient compilation\&. Specifying the \f3-Xcomp\fR option disables interpreted method invocations to increase compilation performance at the expense of efficiency\&. +- +-You can also change the number of interpreted method invocations before compilation using the \f3-XX:CompileThreshold\fR option\&. +-.TP +--Xdebug +-.br ++.RE ++.PP ++\-Xcomp ++.RS 4 ++Forces compilation of methods on first invocation\&. By default, the Client VM (\fB\-client\fR) performs 1,000 interpreted method invocations and the Server VM (\fB\-server\fR) performs 10,000 interpreted method invocations to gather information for efficient compilation\&. Specifying the ++\fB\-Xcomp\fR ++option disables interpreted method invocations to increase compilation performance at the expense of efficiency\&. ++.sp ++You can also change the number of interpreted method invocations before compilation using the ++\fB\-XX:CompileThreshold\fR ++option\&. ++.RE ++.PP ++\-Xdebug ++.RS 4 + Does nothing\&. Provided for backward compatibility\&. +-.TP +--Xdiag +-.br ++.RE ++.PP ++\-Xdiag ++.RS 4 + Shows additional diagnostic messages\&. +-.TP +--Xfuture +-.br +-Enables strict class-file format checks that enforce close conformance to the class-file format specification\&. Developers are encouraged to use this flag when developing new code because the stricter checks will become the default in future releases\&. +-.TP +--Xint +-.br +-Runs the application in interpreted-only mode\&. Compilation to native code is disabled, and all bytecode is executed by the interpreter\&. The performance benefits offered by the just in time (JIT) compiler are not present in this mode\&. +-.TP +--Xinternalversion +-.br +-Displays more detailed JVM version information than the \f3-version\fR option, and then exits\&. +-.TP +--Xloggc:\fIfilename\fR +-.br +-Sets the file to which verbose GC events information should be redirected for logging\&. The information written to this file is similar to the output of \f3-verbose:gc\fR with the time elapsed since the first GC event preceding each logged event\&. The \f3-Xloggc\fR option overrides \f3-verbose:gc\fR if both are given with the same \f3java\fR command\&. +- ++.RE ++.PP ++\-Xfuture ++.RS 4 ++Enables strict class\-file format checks that enforce close conformance to the class\-file format specification\&. Developers are encouraged to use this flag when developing new code because the stricter checks will become the default in future releases\&. ++.RE ++.PP ++\-Xint ++.RS 4 ++Runs the application in interpreted\-only mode\&. Compilation to native code is disabled, and all bytecode is executed by the interpreter\&. The performance benefits offered by the just in time (JIT) compiler are not present in this mode\&. ++.RE ++.PP ++\-Xinternalversion ++.RS 4 ++Displays more detailed JVM version information than the ++\fB\-version\fR ++option, and then exits\&. ++.RE ++.PP ++\-Xloggc:\fIfilename\fR ++.RS 4 ++Sets the file to which verbose GC events information should be redirected for logging\&. The information written to this file is similar to the output of ++\fB\-verbose:gc\fR ++with the time elapsed since the first GC event preceding each logged event\&. The ++\fB\-Xloggc\fR ++option overrides ++\fB\-verbose:gc\fR ++if both are given with the same ++\fBjava\fR ++command\&. ++.sp + Example: +-.sp +-.nf +-\f3\-Xloggc:garbage\-collection\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--Xmaxjitcodesize=\fIsize\fR +-.br +-Specifies the maximum code cache size (in bytes) for JIT-compiled code\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the value is set to 48 MB: +-.sp +-.nf +-\f3\-Xmaxjitcodesize=48m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-This option is equivalent to \f3-XX:ReservedCodeCacheSize\fR\&. +-.TP +--Xmixed +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xloggc:garbage\-collection\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-Xmaxjitcodesize=\fIsize\fR ++.RS 4 ++Specifies the maximum code cache size (in bytes) for JIT\-compiled code\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the value is set to 48 MB: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xmaxjitcodesize=48m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This option is equivalent to ++\fB\-XX:ReservedCodeCacheSize\fR\&. ++.RE ++.PP ++\-Xmixed ++.RS 4 + Executes all bytecode by the interpreter except for hot methods, which are compiled to native code\&. +-.TP +--Xmn\fIsize\fR +-.br +-Sets the initial and maximum size (in bytes) of the heap for the young generation (nursery)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. +- ++.RE ++.PP ++\-Xmn\fIsize\fR ++.RS 4 ++Sets the initial and maximum size (in bytes) of the heap for the young generation (nursery)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. ++.sp + The young generation region of the heap is used for new objects\&. GC is performed in this region more often than in other regions\&. If the size for the young generation is too small, then a lot of minor garbage collections will be performed\&. If the size is too large, then only full garbage collections will be performed, which can take a long time to complete\&. Oracle recommends that you keep the size for the young generation between a half and a quarter of the overall heap size\&. +- ++.sp + The following examples show how to set the initial and maximum size of young generation to 256 MB using various units: +-.sp +-.nf +-\f3\-Xmn256m\fP +-.fi +-.nf +-\f3\-Xmn262144k\fP +-.fi +-.nf +-\f3\-Xmn268435456\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Instead of the \f3-Xmn\fR option to set both the initial and maximum size of the heap for the young generation, you can use \f3-XX:NewSize\fR to set the initial size and \f3-XX:MaxNewSize\fR to set the maximum size\&. +-.TP +--Xms\fIsize\fR +-.br +-Sets the initial size (in bytes) of the heap\&. This value must be a multiple of 1024 and greater than 1 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xmn256m\fR ++\fB\-Xmn262144k\fR ++\fB\-Xmn268435456\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Instead of the ++\fB\-Xmn\fR ++option to set both the initial and maximum size of the heap for the young generation, you can use ++\fB\-XX:NewSize\fR ++to set the initial size and ++\fB\-XX:MaxNewSize\fR ++to set the maximum size\&. ++.RE ++.PP ++\-Xms\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of the heap\&. This value must be a multiple of 1024 and greater than 1 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. ++.sp + The following examples show how to set the size of allocated memory to 6 MB using various units: +-.sp +-.nf +-\f3\-Xms6291456\fP +-.fi +-.nf +-\f3\-Xms6144k\fP +-.fi +-.nf +-\f3\-Xms6m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If you do not set this option, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The initial size of the heap for the young generation can be set using the \f3-Xmn\fR option or the \f3-XX:NewSize\fR option\&. +-.TP +--Xmx\fIsize\fR +-.br +-Specifies the maximum size (in bytes) of the memory allocation pool in bytes\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, \f3-Xms\fR and \f3-Xmx\fR are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc-ergonomics\&.html +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xms6291456\fR ++\fB\-Xms6144k\fR ++\fB\-Xms6m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you do not set this option, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The initial size of the heap for the young generation can be set using the ++\fB\-Xmn\fR ++option or the ++\fB\-XX:NewSize\fR ++option\&. ++.RE ++.PP ++\-Xmx\fIsize\fR ++.RS 4 ++Specifies the maximum size (in bytes) of the memory allocation pool in bytes\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, ++\fB\-Xms\fR ++and ++\fB\-Xmx\fR ++are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html ++.sp + The following examples show how to set the maximum allowed size of allocated memory to 80 MB using various units: +-.sp +-.nf +-\f3\-Xmx83886080\fP +-.fi +-.nf +-\f3\-Xmx81920k\fP +-.fi +-.nf +-\f3\-Xmx80m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The \f3-Xmx\fR option is equivalent to \f3-XX:MaxHeapSize\fR\&. +-.TP +--Xnoclassgc +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xmx83886080\fR ++\fB\-Xmx81920k\fR ++\fB\-Xmx80m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The ++\fB\-Xmx\fR ++option is equivalent to ++\fB\-XX:MaxHeapSize\fR\&. ++.RE ++.PP ++\-Xnoclassgc ++.RS 4 + Disables garbage collection (GC) of classes\&. This can save some GC time, which shortens interruptions during the application run\&. +- +-When you specify \f3-Xnoclassgc\fR at startup, the class objects in the application will be left untouched during GC and will always be considered live\&. This can result in more memory being permanently occupied which, if not used carefully, will throw an out of memory exception\&. +-.TP +--Xprof +-.br ++.sp ++When you specify ++\fB\-Xnoclassgc\fR ++at startup, the class objects in the application will be left untouched during GC and will always be considered live\&. This can result in more memory being permanently occupied which, if not used carefully, will throw an out of memory exception\&. ++.RE ++.PP ++\-Xprof ++.RS 4 + Profiles the running program and sends profiling data to standard output\&. This option is provided as a utility that is useful in program development and is not intended to be used in production systems\&. +-.TP +--Xrs +-.br ++.RE ++.PP ++\-Xrs ++.RS 4 + Reduces the use of operating system signals by the JVM\&. +- ++.sp + Shutdown hooks enable orderly shutdown of a Java application by running user cleanup code (such as closing database connections) at shutdown, even if the JVM terminates abruptly\&. +- +-The JVM catches signals to implement shutdown hooks for unexpected termination\&. The JVM uses \f3SIGHUP\fR, \f3SIGINT\fR, and \f3SIGTERM\fR to initiate the running of shutdown hooks\&. +- +-The JVM uses a similar mechanism to implement the feature of dumping thread stacks for debugging purposes\&. The JVM uses \f3SIGQUIT\fR to perform thread dumps\&. +- +-Applications embedding the JVM frequently need to trap signals such as \f3SIGINT\fR or \f3SIGTERM\fR, which can lead to interference with the JVM signal handlers\&. The \f3-Xrs\fR option is available to address this issue\&. When \f3-Xrs\fR is used, the signal masks for \f3SIGINT\fR, \f3SIGTERM\fR, \f3SIGHUP\fR, and \f3SIGQUIT\fR are not changed by the JVM, and signal handlers for these signals are not installed\&. +- +-There are two consequences of specifying \f3-Xrs\fR: +-.RS +-.TP 0.2i +-\(bu +-\f3SIGQUIT\fR thread dumps are not available\&. +-.TP 0.2i +-\(bu +-User code is responsible for causing shutdown hooks to run, for example, by calling \f3System\&.exit()\fR when the JVM is to be terminated\&. +-.RE +- +-.TP +--Xshare:\fImode\fR +-.br +-Sets the class data sharing mode\&. Possible \fImode\fR arguments for this option include the following: +-.RS +-.TP ++.sp ++The JVM catches signals to implement shutdown hooks for unexpected termination\&. The JVM uses ++\fBSIGHUP\fR, ++\fBSIGINT\fR, and ++\fBSIGTERM\fR ++to initiate the running of shutdown hooks\&. ++.sp ++The JVM uses a similar mechanism to implement the feature of dumping thread stacks for debugging purposes\&. The JVM uses ++\fBSIGQUIT\fR ++to perform thread dumps\&. ++.sp ++Applications embedding the JVM frequently need to trap signals such as ++\fBSIGINT\fR ++or ++\fBSIGTERM\fR, which can lead to interference with the JVM signal handlers\&. The ++\fB\-Xrs\fR ++option is available to address this issue\&. When ++\fB\-Xrs\fR ++is used, the signal masks for ++\fBSIGINT\fR, ++\fBSIGTERM\fR, ++\fBSIGHUP\fR, and ++\fBSIGQUIT\fR ++are not changed by the JVM, and signal handlers for these signals are not installed\&. ++.sp ++There are two consequences of specifying ++\fB\-Xrs\fR: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fBSIGQUIT\fR ++thread dumps are not available\&. ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++User code is responsible for causing shutdown hooks to run, for example, by calling ++\fBSystem\&.exit()\fR ++when the JVM is to be terminated\&. ++.RE ++.RE ++.PP ++\-Xshare:\fImode\fR ++.RS 4 ++Sets the class data sharing mode\&. Possible ++\fImode\fR ++arguments for this option include the following: ++.PP + auto +-Use shared class data if possible\&. This is the default value for Java HotSpot 32-Bit Client VM\&. +-.TP ++.RS 4 ++Use shared class data if possible\&. This is the default value for Java HotSpot 32\-Bit Client VM\&. ++.RE ++.PP + on ++.RS 4 + Require the use of class data sharing\&. Print an error message and exit if class data sharing cannot be used\&. +-.TP ++.RE ++.PP + off +-Do not use shared class data\&. This is the default value for Java HotSpot 32-Bit Server VM, Java HotSpot 64-Bit Client VM, and Java HotSpot 64-Bit Server VM\&. +-.TP ++.RS 4 ++Do not use shared class data\&. This is the default value for Java HotSpot 32\-Bit Server VM, Java HotSpot 64\-Bit Client VM, and Java HotSpot 64\-Bit Server VM\&. ++.RE ++.PP + dump ++.RS 4 + Manually generate the class data sharing archive\&. +-.RE +- +-.TP +--XshowSettings:\fIcategory\fR +-.br +-Shows settings and continues\&. Possible \fIcategory\fR arguments for this option include the following: +-.RS +-.TP ++.RE ++.RE ++.PP ++\-XshowSettings:\fIcategory\fR ++.RS 4 ++Shows settings and continues\&. Possible ++\fIcategory\fR ++arguments for this option include the following: ++.PP + all ++.RS 4 + Shows all categories of settings\&. This is the default value\&. +-.TP ++.RE ++.PP + locale ++.RS 4 + Shows settings related to locale\&. +-.TP ++.RE ++.PP + properties ++.RS 4 + Shows settings related to system properties\&. +-.TP ++.RE ++.PP + vm ++.RS 4 + Shows the settings of the JVM\&. +-.RE +- +-.TP +--Xss\fIsize\fR +-.br +-Sets the thread stack size (in bytes)\&. Append the letter \f3k\fR or \f3K\fR to indicate KB, \f3m\fR or \f3M\fR to indicate MB, \f3g\fR or \f3G\fR to indicate GB\&. The default value depends on the platform: +-.RS +-.TP 0.2i +-\(bu +-Linux/ARM (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-OS X (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu ++.RE ++.RE ++.PP ++\-Xss\fIsize\fR ++.RS 4 ++Sets the thread stack size (in bytes)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate KB, ++\fBm\fR ++or ++\fBM\fR ++to indicate MB, ++\fBg\fR ++or ++\fBG\fR ++to indicate GB\&. The default value depends on the platform: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/ARM (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++OS X (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Windows: depends on virtual memory + .RE +-.RS ++.sp + The following examples set the thread stack size to 1024 KB in different units: +-.sp +-.nf +-\f3\-Xss1m\fP +-.fi +-.nf +-\f3\-Xss1024k\fP +-.fi +-.nf +-\f3\-Xss1048576\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-This option is equivalent to \f3-XX:ThreadStackSize\fR\&. +- +-.RE +-.TP +--Xusealtsigs +-.br +-Use alternative signals instead of \f3SIGUSR1\fR and \f3SIGUSR2\fR for JVM internal signals\&. This option is equivalent to \f3-XX:+UseAltSigs\fR\&. +-.TP +--Xverify:\fImode\fR +-.br +-Sets the mode of the bytecode verifier\&. Bytecode verification helps to troubleshoot some problems, but it also adds overhead to the running application\&. Possible \fImode\fR arguments for this option include the following: +-.RS +-.TP ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xss1m\fR ++\fB\-Xss1024k\fR ++\fB\-Xss1048576\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This option is equivalent to ++\fB\-XX:ThreadStackSize\fR\&. ++.RE ++.PP ++\-Xusealtsigs ++.RS 4 ++Use alternative signals instead of ++\fBSIGUSR1\fR ++and ++\fBSIGUSR2\fR ++for JVM internal signals\&. This option is equivalent to ++\fB\-XX:+UseAltSigs\fR\&. ++.RE ++.PP ++\-Xverify:\fImode\fR ++.RS 4 ++Sets the mode of the bytecode verifier\&. Bytecode verification helps to troubleshoot some problems, but it also adds overhead to the running application\&. Possible ++\fImode\fR ++arguments for this option include the following: ++.PP + none ++.RS 4 + Do not verify the bytecode\&. This reduces startup time and also reduces the protection provided by Java\&. +-.TP ++.RE ++.PP + remote +-Verify only those classes that are loaded remotely over the network\&. This is the default behavior if you do not specify the \f3-Xverify\fR option\&. +-.TP ++.RS 4 ++Verify only those classes that are loaded remotely over the network\&. This is the default behavior if you do not specify the ++\fB\-Xverify\fR ++option\&. ++.RE ++.PP + all ++.RS 4 + Verify all classes\&. +-.RE +- +-.SS ADVANCED\ RUNTIME\ OPTIONS ++.RE ++.RE ++.SS "Advanced Runtime Options" ++.PP + These options control the runtime behavior of the Java HotSpot VM\&. +-.TP +--XX:+DisableAttachMechanism +-.br +-Enables the option that disables the mechanism that lets tools attach to the JVM\&. By default, this option is disabled, meaning that the attach mechanism is enabled and you can use tools such as \f3jcmd\fR, \f3jstack\fR, \f3jmap\fR, and \f3jinfo\fR\&. +-.TP +--XX:ErrorFile=\fIfilename\fR +-.br +-Specifies the path and file name to which error data is written when an irrecoverable error occurs\&. By default, this file is created in the current working directory and named \f3hs_err_pid\fR\fIpid\fR\f3\&.log\fR where \fIpid\fR is the identifier of the process that caused the error\&. The following example shows how to set the default log file (note that the identifier of the process is specified as \f3%p\fR): +-.sp +-.nf +-\f3\-XX:ErrorFile=\&./hs_err_pid%p\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following example shows how to set the error log to \f3/var/log/java/java_error\&.log\fR: +-.sp +-.nf +-\f3\-XX:ErrorFile=/var/log/java/java_error\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If the file cannot be created in the specified directory (due to insufficient space, permission problem, or another issue), then the file is created in the temporary directory for the operating system\&. The temporary directory is \f3/tmp\fR\&. +-.TP +--XX:LargePageSizeInBytes=\fIsize\fR +-.br +-Sets the maximum size (in bytes) for large pages used for Java heap\&. The \fIsize\fR argument must be a power of 2 (2, 4, 8, 16, \&.\&.\&.)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for large pages automatically\&. +- ++.PP ++\-XX:+DisableAttachMechanism ++.RS 4 ++Enables the option that disables the mechanism that lets tools attach to the JVM\&. By default, this option is disabled, meaning that the attach mechanism is enabled and you can use tools such as ++\fBjcmd\fR, ++\fBjstack\fR, ++\fBjmap\fR, and ++\fBjinfo\fR\&. ++.RE ++.PP ++\-XX:ErrorFile=\fIfilename\fR ++.RS 4 ++Specifies the path and file name to which error data is written when an irrecoverable error occurs\&. By default, this file is created in the current working directory and named ++\fBhs_err_pid\fR\fIpid\fR\fB\&.log\fR ++where ++\fIpid\fR ++is the identifier of the process that caused the error\&. The following example shows how to set the default log file (note that the identifier of the process is specified as ++\fB%p\fR): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ErrorFile=\&./hs_err_pid%p\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example shows how to set the error log to ++\fB/var/log/java/java_error\&.log\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ErrorFile=/var/log/java/java_error\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If the file cannot be created in the specified directory (due to insufficient space, permission problem, or another issue), then the file is created in the temporary directory for the operating system\&. The temporary directory is ++\fB/tmp\fR\&. ++.RE ++.PP ++\-XX:+FailOverToOldVerifier ++.RS 4 ++Enables automatic failover to the old verifier when the new type checker fails\&. By default, this option is disabled and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. ++.RE ++.PP ++\-XX:LargePageSizeInBytes=\fIsize\fR ++.RS 4 ++Sets the maximum size (in bytes) for large pages used for Java heap\&. The ++\fIsize\fR ++argument must be a power of 2 (2, 4, 8, 16, \&.\&.\&.)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for large pages automatically\&. ++.sp + The following example illustrates how to set the large page size to 4 megabytes (MB): +-.sp +-.nf +-\f3\-XX:LargePageSizeInBytes=4m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxDirectMemorySize=\fIsize\fR +-.br +-Sets the maximum total size (in bytes) of the New I/O (the \f3java\&.nio\fR package) direct-buffer allocations\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for NIO direct-buffer allocations automatically\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:LargePageSizeInBytes=4m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxDirectMemorySize=\fIsize\fR ++.RS 4 ++Sets the maximum total size (in bytes) of the New I/O (the ++\fBjava\&.nio\fR ++package) direct\-buffer allocations\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for NIO direct\-buffer allocations automatically\&. ++.sp + The following examples illustrate how to set the NIO size to 1024 KB in different units: +-.sp +-.nf +-\f3\-XX:MaxDirectMemorySize=1m\fP +-.fi +-.nf +-\f3\-XX:MaxDirectMemorySize=1024k\fP +-.fi +-.nf +-\f3\-XX:MaxDirectMemorySize=1048576\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:NativeMemoryTracking=\fImode\fR +-.br +-Specifies the mode for tracking JVM native memory usage\&. Possible \fImode\fR arguments for this option include the following: +-.RS +-.TP ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxDirectMemorySize=1m\fR ++\fB\-XX:MaxDirectMemorySize=1024k\fR ++\fB\-XX:MaxDirectMemorySize=1048576\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:NativeMemoryTracking=\fImode\fR ++.RS 4 ++Specifies the mode for tracking JVM native memory usage\&. Possible ++\fImode\fR ++arguments for this option include the following: ++.PP + off +-Do not track JVM native memory usage\&. This is the default behavior if you do not specify the \f3-XX:NativeMemoryTracking\fR option\&. +-.TP ++.RS 4 ++Do not track JVM native memory usage\&. This is the default behavior if you do not specify the ++\fB\-XX:NativeMemoryTracking\fR ++option\&. ++.RE ++.PP + summary ++.RS 4 + Only track memory usage by JVM subsystems, such as Java heap, class, code, and thread\&. +-.TP ++.RE ++.PP + detail +-In addition to tracking memory usage by JVM subsystems, track memory usage by individual \f3CallSite\fR, individual virtual memory region and its committed regions\&. +-.RE +- +-.TP +--XX:OnError=\fIstring\fR +-.br +-Sets a custom command or a series of semicolon-separated commands to run when an irrecoverable error occurs\&. If the string contains spaces, then it must be enclosed in quotation marks\&. +- +-\fI\fRThe following example shows how the \f3-XX:OnError\fR option can be used to run the \f3gcore\fR command to create the core image, and the debugger is started to attach to the process in case of an irrecoverable error (the \f3%p\fR designates the current process): +-.sp +-.nf +-\f3\-XX:OnError="gcore %p;dbx \- %p"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:OnOutOfMemoryError=\fIstring\fR +-.br +-Sets a custom command or a series of semicolon-separated commands to run when an \f3OutOfMemoryError\fR exception is first thrown\&. If the string contains spaces, then it must be enclosed in quotation marks\&. For an example of a command string, see the description of the \f3-XX:OnError\fR option\&. +-.TP +--XX:+PrintCommandLineFlags +-.br ++.RS 4 ++In addition to tracking memory usage by JVM subsystems, track memory usage by individual ++\fBCallSite\fR, individual virtual memory region and its committed regions\&. ++.RE ++.RE ++.PP ++\-XX:OnError=\fIstring\fR ++.RS 4 ++Sets a custom command or a series of semicolon\-separated commands to run when an irrecoverable error occurs\&. If the string contains spaces, then it must be enclosed in quotation marks\&. ++.sp ++The following example shows how the ++\fB\-XX:OnError\fR ++option can be used to run the ++\fBgcore\fR ++command to create the core image, and the debugger is started to attach to the process in case of an irrecoverable error (the ++\fB%p\fR ++designates the current process): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:OnError="gcore %p;dbx \- %p"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:OnOutOfMemoryError=\fIstring\fR ++.RS 4 ++Sets a custom command or a series of semicolon\-separated commands to run when an ++\fBOutOfMemoryError\fR ++exception is first thrown\&. If the string contains spaces, then it must be enclosed in quotation marks\&. For an example of a command string, see the description of the ++\fB\-XX:OnError\fR ++option\&. ++.RE ++.PP ++\-XX:+PrintCommandLineFlags ++.RS 4 + Enables printing of ergonomically selected JVM flags that appeared on the command line\&. It can be useful to know the ergonomic values set by the JVM, such as the heap space size and the selected garbage collector\&. By default, this option is disabled and flags are not printed\&. +-.TP +--XX:+PrintNMTStatistics +-.br +-Enables printing of collected native memory tracking data at JVM exit when native memory tracking is enabled (see \f3-XX:NativeMemoryTracking\fR)\&. By default, this option is disabled and native memory tracking data is not printed\&. +-.TP +--XX:+ShowMessageBoxOnError +-.br ++.RE ++.PP ++\-XX:+PrintNMTStatistics ++.RS 4 ++Enables printing of collected native memory tracking data at JVM exit when native memory tracking is enabled (see ++\fB\-XX:NativeMemoryTracking\fR)\&. By default, this option is disabled and native memory tracking data is not printed\&. ++.RE ++.PP ++\-XX:+RelaxAccessControlCheck ++.RS 4 ++Decreases the amount of access control checks in the verifier\&. By default, this option is disabled, and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. ++.RE ++.PP ++\-XX:+ShowMessageBoxOnError ++.RS 4 + Enables displaying of a dialog box when the JVM experiences an irrecoverable error\&. This prevents the JVM from exiting and keeps the process active so that you can attach a debugger to it to investigate the cause of the error\&. By default, this option is disabled\&. +-.TP +--XX:ThreadStackSize=\fIsize\fR +-.br +-Sets the thread stack size (in bytes)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value depends on the platform: +-.RS +-.TP 0.2i +-\(bu +-Linux/ARM (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-OS X (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu ++.RE ++.PP ++\-XX:ThreadStackSize=\fIsize\fR ++.RS 4 ++Sets the thread stack size (in bytes)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value depends on the platform: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/ARM (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++OS X (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Windows: depends on virtual memory + .RE +-.RS ++.sp + The following examples show how to set the thread stack size to 1024 KB in different units: +-.sp +-.nf +-\f3\-XX:ThreadStackSize=1m\fP +-.fi +-.nf +-\f3\-XX:ThreadStackSize=1024k\fP +-.fi +-.nf +-\f3\-XX:ThreadStackSize=1048576\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-This option is equivalent to \f3-Xss\fR\&. +- +-.RE +-.TP +--XX:+TraceClassLoading +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ThreadStackSize=1m\fR ++\fB\-XX:ThreadStackSize=1024k\fR ++\fB\-XX:ThreadStackSize=1048576\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This option is equivalent to ++\fB\-Xss\fR\&. ++.RE ++.PP ++\-XX:+TraceClassLoading ++.RS 4 + Enables tracing of classes as they are loaded\&. By default, this option is disabled and classes are not traced\&. +-.TP +--XX:+TraceClassLoadingPreorder +-.br ++.RE ++.PP ++\-XX:+TraceClassLoadingPreorder ++.RS 4 + Enables tracing of all loaded classes in the order in which they are referenced\&. By default, this option is disabled and classes are not traced\&. +-.TP +--XX:+TraceClassResolution +-.br ++.RE ++.PP ++\-XX:+TraceClassResolution ++.RS 4 + Enables tracing of constant pool resolutions\&. By default, this option is disabled and constant pool resolutions are not traced\&. +-.TP +--XX:+TraceClassUnloading +-.br ++.RE ++.PP ++\-XX:+TraceClassUnloading ++.RS 4 + Enables tracing of classes as they are unloaded\&. By default, this option is disabled and classes are not traced\&. +-.TP +--XX:+TraceLoaderConstraints +-.br +-Enables tracing of the loader constraints recording\&. By default, this option is disabled and loader constraints recoding is not traced\&. +-.TP +--XX:+UseAltSigs +-.br +-Enables the use of alternative signals instead of \f3SIGUSR1\fR and \f3SIGUSR2\fR for JVM internal signals\&. By default, this option is disabled and alternative signals are not used\&. This option is equivalent to \f3-Xusealtsigs\fR\&. +-.TP +--XX:+UseBiasedLocking +-.br +-Enables the use of biased locking\&. Some applications with significant amounts of uncontended synchronization may attain significant speedups with this flag enabled, whereas applications with certain patterns of locking may see slowdowns\&. For more information about the biased locking technique, see the example in Java Tuning White Paper at http://www\&.oracle\&.com/technetwork/java/tuning-139912\&.html#section4\&.2\&.5 +- +-By default, this option is disabled and biased locking is not used\&. +-.TP +--XX:+UseCompressedOops +-.br +-Enables the use of compressed pointers\&. When this option is enabled, object references are represented as 32-bit offsets instead of 64-bit pointers, which typically increases performance when running the application with Java heap sizes less than 32 GB\&. This option works only for 64-bit JVMs\&. +- +-By default, this option is disabled and compressed pointers are not used\&. +-.TP +--XX:+UseLargePages +-.br +-Enables the use of large page memory\&. This option is enabled by default\&. To disable the use of large page memory, specify \f3-XX:-UseLargePages\fR\&. +- +-For more information, see Java Support for Large Memory Pages at http://www\&.oracle\&.com/technetwork/java/javase/tech/largememory-jsp-137182\&.html +-.TP +--XX:+UseMembar +-.br +-Enables issuing of membars on thread state transitions\&. This option is disabled by default on all platforms except Power PC and ARM servers, where it is enabled\&. To disable issuing of membars on thread state transitions for Power PC and ARM, specify \f3-XX:-UseMembar\fR\&. +-.TP +--XX:+UsePerfData +-.br +-Enables the \f3perfdata\fR feature\&. This option is enabled by default to allow JVM monitoring and performance testing\&. Disabling it suppresses the creation of the \f3hsperfdata_userid\fR directories\&. To disable the \f3perfdata\fR feature, specify \f3-XX:-UsePerfData\fR\&. +-.TP +--XX:+AllowUserSignalHandlers +-.br ++.RE ++.PP ++\-XX:+TraceLoaderConstraints ++.RS 4 ++Enables tracing of the loader constraints recording\&. By default, this option is disabled and loader constraints recording is not traced\&. ++.RE ++.PP ++\-XX:+UseAltSigs ++.RS 4 ++Enables the use of alternative signals instead of ++\fBSIGUSR1\fR ++and ++\fBSIGUSR2\fR ++for JVM internal signals\&. By default, this option is disabled and alternative signals are not used\&. This option is equivalent to ++\fB\-Xusealtsigs\fR\&. ++.RE ++.PP ++\-XX:\-UseBiasedLocking ++.RS 4 ++Disables the use of biased locking\&. Some applications with significant amounts of uncontended synchronization may attain significant speedups with this flag enabled, whereas applications with certain patterns of locking may see slowdowns\&. For more information about the biased locking technique, see the example in Java Tuning White Paper at http://www\&.oracle\&.com/technetwork/java/tuning\-139912\&.html#section4\&.2\&.5 ++.sp ++By default, this option is enabled\&. ++.RE ++.PP ++\-XX:\-UseCompressedOops ++.RS 4 ++Disables the use of compressed pointers\&. By default, this option is enabled, and compressed pointers are used when Java heap sizes are less than 32 GB\&. When this option is enabled, object references are represented as 32\-bit offsets instead of 64\-bit pointers, which typically increases performance when running the application with Java heap sizes less than 32 GB\&. This option works only for 64\-bit JVMs\&. ++.RE ++.PP ++\-XX:\-UseLargePages ++.RS 4 ++Disables the use of large page memory\&. This option is enabled by default\&. ++.sp ++For more information, see Java Support for Large Memory Pages at http://www\&.oracle\&.com/technetwork/java/javase/tech/largememory\-jsp\-137182\&.html ++.RE ++.PP ++\-XX:+UseMembar ++.RS 4 ++Enables issuing of membars on thread state transitions\&. This option is disabled by default on all platforms except ARM servers, where it is enabled\&. (It is recommended that you do not disable this option on ARM servers\&.) ++.RE ++.PP ++\-XX:+UsePerfData ++.RS 4 ++Enables the ++\fBperfdata\fR ++feature\&. This option is enabled by default to allow JVM monitoring and performance testing\&. Disabling it suppresses the creation of the ++\fBhsperfdata_userid\fR ++directories\&. To disable the ++\fBperfdata\fR ++feature, specify ++\fB\-XX:\-UsePerfData\fR\&. ++.RE ++.PP ++\-XX:+AllowUserSignalHandlers ++.RS 4 + Enables installation of signal handlers by the application\&. By default, this option is disabled and the application is not allowed to install signal handlers\&. +-.SS ADVANCED\ JIT\ COMPILER\ OPTIONS +-These options control the dynamic just-in-time (JIT) compilation performed by the Java HotSpot VM\&. +-.TP +--XX:+AggressiveOpts +-.br ++.RE ++.SS "Advanced JIT Compiler Options" ++.PP ++These options control the dynamic just\-in\-time (JIT) compilation performed by the Java HotSpot VM\&. ++.PP ++\-XX:+AggressiveOpts ++.RS 4 + Enables the use of aggressive performance optimization features, which are expected to become default in upcoming releases\&. By default, this option is disabled and experimental performance features are not used\&. +-.TP +--XX:AllocateInstancePrefetchLines=\fIlines\fR +-.br ++.RE ++.PP ++\-XX:AllocateInstancePrefetchLines=\fIlines\fR ++.RS 4 + Sets the number of lines to prefetch ahead of the instance allocation pointer\&. By default, the number of lines to prefetch is set to 1: +-.sp +-.nf +-\f3\-XX:AllocateInstancePrefetchLines=1\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchInstr=\fIinstruction\fR +-.br +-Sets the prefetch instruction to prefetch ahead of the allocation pointer\&. Possible values are from 0 to 3\&. The actual instructions behind the values depend on the platform\&. By default, the prefetch instruction is set to 0: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchInstr=0\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchStepSize=\fIsize\fR +-.br +-Sets the step size (in bytes) for sequential prefetch instructions\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the step size is set to 16 bytes: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchStepSize=16\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+BackgroundCompilation +-.br +-Enables background compilation\&. This option is enabled by default\&. To disable background compilation, specify \f3-XX:-BackgroundCompilation\fR (this is equivalent to specifying \f3-Xbatch\fR)\&. +-.TP +--XX:CICompilerCount=\fIthreads\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocateInstancePrefetchLines=1\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchDistance=\fIsize\fR ++.RS 4 ++Sets the size (in bytes) of the prefetch distance for object allocation\&. Memory about to be written with the value of new objects is prefetched up to this distance starting from the address of the last allocated object\&. Each Java thread has its own allocation point\&. ++.sp ++Negative values denote that prefetch distance is chosen based on the platform\&. Positive values are bytes to prefetch\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is set to \-1\&. ++.sp ++The following example shows how to set the prefetch distance to 1024 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchDistance=1024\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchInstr=\fIinstruction\fR ++.RS 4 ++Sets the prefetch instruction to prefetch ahead of the allocation pointer\&. Only the Java HotSpot Server VM supports this option\&. Possible values are from 0 to 3\&. The actual instructions behind the values depend on the platform\&. By default, the prefetch instruction is set to 0: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchInstr=0\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchLines=\fIlines\fR ++.RS 4 ++Sets the number of cache lines to load after the last object allocation by using the prefetch instructions generated in compiled code\&. The default value is 1 if the last allocated object was an instance, and 3 if it was an array\&. ++.sp ++The following example shows how to set the number of loaded cache lines to 5: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchLines=5\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchStepSize=\fIsize\fR ++.RS 4 ++Sets the step size (in bytes) for sequential prefetch instructions\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the step size is set to 16 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchStepSize=16\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchStyle=\fIstyle\fR ++.RS 4 ++Sets the generated code style for prefetch instructions\&. The ++\fIstyle\fR ++argument is an integer from 0 to 3: ++.PP ++0 ++.RS 4 ++Do not generate prefetch instructions\&. ++.RE ++.PP ++1 ++.RS 4 ++Execute prefetch instructions after each allocation\&. This is the default parameter\&. ++.RE ++.PP ++2 ++.RS 4 ++Use the thread\-local allocation block (TLAB) watermark pointer to determine when prefetch instructions are executed\&. ++.RE ++.PP ++3 ++.RS 4 ++Use BIS instruction on SPARC for allocation prefetch\&. ++.RE ++.sp ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+BackgroundCompilation ++.RS 4 ++Enables background compilation\&. This option is enabled by default\&. To disable background compilation, specify ++\fB\-XX:\-BackgroundCompilation\fR ++(this is equivalent to specifying ++\fB\-Xbatch\fR)\&. ++.RE ++.PP ++\-XX:CICompilerCount=\fIthreads\fR ++.RS 4 + Sets the number of compiler threads to use for compilation\&. By default, the number of threads is set to 2 for the server JVM, to 1 for the client JVM, and it scales to the number of cores if tiered compilation is used\&. The following example shows how to set the number of threads to 2: +-.sp +-.nf +-\f3\-XX:CICompilerCount=2\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CodeCacheMinimumFreeSpace=\fIsize\fR +-.br +-Sets the minimum free space (in bytes) required for compilation\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. When less than the minimum free space remains, compiling stops\&. By default, this option is set to 500 KB\&. The following example shows how to set the minimum free space to 1024 MB: +-.sp +-.nf +-\f3\-XX:CodeCacheMinimumFreeSpace=1024m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] +-.br +-Specifies a command to perform on a method\&. For example, to exclude the \f3indexOf()\fR method of the \f3String\fR class from being compiled, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand=exclude,java/lang/String\&.indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Note that the full class name is specified, including all packages and subpackages separated by a slash (\f3/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the \f3-XX:+PrintCompilation\fR and \f3-XX:+LogCompilation\fR options: +-.sp +-.nf +-\f3\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If the method is specified without the signature, the command will be applied to all methods with the specified name\&. However, you can also specify the signature of the method in the class file format\&. In this case, you should enclose the arguments in quotation marks, because otherwise the shell treats the semicolon as command end\&. For example, if you want to exclude only the \f3indexOf(String)\fR method of the \f3String\fR class from being compiled, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand="exclude,java/lang/String\&.indexOf,(Ljava/lang/String;)I"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-You can also use the asterisk (*) as a wildcard for class and method names\&. For example, to exclude all \f3indexOf()\fR methods in all classes from being compiled, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand=exclude,*\&.indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The commas and periods are aliases for spaces, making it easier to pass compiler commands through a shell\&. You can pass arguments to \f3-XX:CompileCommand\fR using spaces as separators by enclosing the argument in quotation marks: +-.sp +-.nf +-\f3\-XX:CompileCommand="exclude java/lang/String indexOf"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Note that after parsing the commands passed on the command line using the \f3-XX:CompileCommand\fR options, the JIT compiler then reads commands from the \f3\&.hotspot_compiler\fR file\&. You can add commands to this file or specify a different file using the \f3-XX:CompileCommandFile\fR option\&. +- +-To add several commands, either specify the \f3-XX:CompileCommand\fR option multiple times, or separate each argument with the newline separator (\f3\en\fR)\&. The following commands are available: +-.RS +-.TP ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CICompilerCount=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CodeCacheMinimumFreeSpace=\fIsize\fR ++.RS 4 ++Sets the minimum free space (in bytes) required for compilation\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. When less than the minimum free space remains, compiling stops\&. By default, this option is set to 500 KB\&. The following example shows how to set the minimum free space to 1024 MB: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CodeCacheMinimumFreeSpace=1024m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] ++.RS 4 ++Specifies a command to perform on a method\&. For example, to exclude the ++\fBindexOf()\fR ++method of the ++\fBString\fR ++class from being compiled, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Note that the full class name is specified, including all packages and subpackages separated by a slash (\fB/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the ++\fB\-XX:+PrintCompilation\fR ++and ++\fB\-XX:+LogCompilation\fR ++options: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If the method is specified without the signature, the command will be applied to all methods with the specified name\&. However, you can also specify the signature of the method in the class file format\&. In this case, you should enclose the arguments in quotation marks, because otherwise the shell treats the semicolon as command end\&. For example, if you want to exclude only the ++\fBindexOf(String)\fR ++method of the ++\fBString\fR ++class from being compiled, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude,java/lang/String\&.indexOf,(Ljava/lang/String;)I"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++You can also use the asterisk (*) as a wildcard for class and method names\&. For example, to exclude all ++\fBindexOf()\fR ++methods in all classes from being compiled, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,*\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The commas and periods are aliases for spaces, making it easier to pass compiler commands through a shell\&. You can pass arguments to ++\fB\-XX:CompileCommand\fR ++using spaces as separators by enclosing the argument in quotation marks: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude java/lang/String indexOf"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Note that after parsing the commands passed on the command line using the ++\fB\-XX:CompileCommand\fR ++options, the JIT compiler then reads commands from the ++\fB\&.hotspot_compiler\fR ++file\&. You can add commands to this file or specify a different file using the ++\fB\-XX:CompileCommandFile\fR ++option\&. ++.sp ++To add several commands, either specify the ++\fB\-XX:CompileCommand\fR ++option multiple times, or separate each argument with the newline separator (\fB\en\fR)\&. The following commands are available: ++.PP + break ++.RS 4 + Set a breakpoint when debugging the JVM to stop at the beginning of compilation of the specified method\&. +-.TP ++.RE ++.PP + compileonly +-Exclude all methods from compilation except for the specified method\&. As an alternative, you can use the \f3-XX:CompileOnly\fR option, which allows to specify several methods\&. +-.TP ++.RS 4 ++Exclude all methods from compilation except for the specified method\&. As an alternative, you can use the ++\fB\-XX:CompileOnly\fR ++option, which allows to specify several methods\&. ++.RE ++.PP + dontinline ++.RS 4 + Prevent inlining of the specified method\&. +-.TP ++.RE ++.PP + exclude ++.RS 4 + Exclude the specified method from compilation\&. +-.TP ++.RE ++.PP + help +-Print a help message for the \f3-XX:CompileCommand\fR option\&. +-.TP ++.RS 4 ++Print a help message for the ++\fB\-XX:CompileCommand\fR ++option\&. ++.RE ++.PP + inline ++.RS 4 + Attempt to inline the specified method\&. +-.TP ++.RE ++.PP + log +-Exclude compilation logging (with the \f3-XX:+LogCompilation\fR option) for all methods except for the specified method\&. By default, logging is performed for all compiled methods\&. +-.TP ++.RS 4 ++Exclude compilation logging (with the ++\fB\-XX:+LogCompilation\fR ++option) for all methods except for the specified method\&. By default, logging is performed for all compiled methods\&. ++.RE ++.PP + option +-This command can be used to pass a JIT compilation option to the specified method in place of the last argument (\fIoption\fR)\&. The compilation option is set at the end, after the method name\&. For example, to enable the \f3BlockLayoutByFrequency\fR option for the \f3append()\fR method of the \f3StringBuffer\fR class, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.RS 4 ++This command can be used to pass a JIT compilation option to the specified method in place of the last argument (\fIoption\fR)\&. The compilation option is set at the end, after the method name\&. For example, to enable the ++\fBBlockLayoutByFrequency\fR ++option for the ++\fBappend()\fR ++method of the ++\fBStringBuffer\fR ++class, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + You can specify multiple compilation options, separated by commas or spaces\&. +-.TP ++.RE ++.PP + print ++.RS 4 + Print generated assembler code after compilation of the specified method\&. +-.TP ++.RE ++.PP + quiet +-Do not print the compile commands\&. By default, the commands that you specify with the -\f3XX:CompileCommand\fR option are printed; for example, if you exclude from compilation the \f3indexOf()\fR method of the \f3String\fR class, then the following will be printed to standard output: +-.sp +-.nf +-\f3CompilerOracle: exclude java/lang/String\&.indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-You can suppress this by specifying the \f3-XX:CompileCommand=quiet\fR option before other \f3-XX:CompileCommand\fR options\&. +-.RE +- +-.TP +--XX:CompileCommandFile=\fIfilename\fR +-.br +-Sets the file from which JIT compiler commands are read\&. By default, the \f3\&.hotspot_compiler\fR file is used to store commands performed by the JIT compiler\&. +- +-Each line in the command file represents a command, a class name, and a method name for which the command is used\&. For example, this line prints assembly code for the \f3toString()\fR method of the \f3String\fR class: +-.sp +-.nf +-\f3print java/lang/String toString\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-For more information about specifying the commands for the JIT compiler to perform on methods, see the \f3-XX:CompileCommand\fR option\&. +-.TP +--XX:CompileOnly=\fImethods\fR +-.br +-Sets the list of methods (separated by commas) to which compilation should be restricted\&. Only the specified methods will be compiled\&. Specify each method with the full class name (including the packages and subpackages)\&. For example, to compile only the \f3length()\fR method of the \f3String\fR class and the \f3size()\fR method of the \f3List\fR class, use the following: +-.sp +-.nf +-\f3\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Note that the full class name is specified, including all packages and subpackages separated by a slash (\f3/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the \f3-XX:+PrintCompilation\fR and \f3-XX:+LogCompilation\fR options: +-.sp +-.nf +-\f3\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.RS 4 ++Do not print the compile commands\&. By default, the commands that you specify with the \-\fBXX:CompileCommand\fR ++option are printed; for example, if you exclude from compilation the ++\fBindexOf()\fR ++method of the ++\fBString\fR ++class, then the following will be printed to standard output: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompilerOracle: exclude java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++You can suppress this by specifying the ++\fB\-XX:CompileCommand=quiet\fR ++option before other ++\fB\-XX:CompileCommand\fR ++options\&. ++.RE ++.RE ++.PP ++\-XX:CompileCommandFile=\fIfilename\fR ++.RS 4 ++Sets the file from which JIT compiler commands are read\&. By default, the ++\fB\&.hotspot_compiler\fR ++file is used to store commands performed by the JIT compiler\&. ++.sp ++Each line in the command file represents a command, a class name, and a method name for which the command is used\&. For example, this line prints assembly code for the ++\fBtoString()\fR ++method of the ++\fBString\fR ++class: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBprint java/lang/String toString\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++For more information about specifying the commands for the JIT compiler to perform on methods, see the ++\fB\-XX:CompileCommand\fR ++option\&. ++.RE ++.PP ++\-XX:CompileOnly=\fImethods\fR ++.RS 4 ++Sets the list of methods (separated by commas) to which compilation should be restricted\&. Only the specified methods will be compiled\&. Specify each method with the full class name (including the packages and subpackages)\&. For example, to compile only the ++\fBlength()\fR ++method of the ++\fBString\fR ++class and the ++\fBsize()\fR ++method of the ++\fBList\fR ++class, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Note that the full class name is specified, including all packages and subpackages separated by a slash (\fB/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the ++\fB\-XX:+PrintCompilation\fR ++and ++\fB\-XX:+LogCompilation\fR ++options: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + Although wildcards are not supported, you can specify only the class or package name to compile all methods in that class or package, as well as specify just the method to compile methods with this name in any class: +-.sp +-.nf +-\f3\-XX:CompileOnly=java/lang/String\fP +-.fi +-.nf +-\f3\-XX:CompileOnly=java/lang\fP +-.fi +-.nf +-\f3\-XX:CompileOnly=\&.length\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CompileThreshold=\fIinvocations\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\fR ++\fB\-XX:CompileOnly=java/lang\fR ++\fB\-XX:CompileOnly=\&.length\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileThreshold=\fIinvocations\fR ++.RS 4 + Sets the number of interpreted method invocations before compilation\&. By default, in the server JVM, the JIT compiler performs 10,000 interpreted method invocations to gather information for efficient compilation\&. For the client JVM, the default setting is 1,500 invocations\&. The following example shows how to set the number of interpreted method invocations to 5,000: +-.sp +-.nf +-\f3\-XX:CompileThreshold=5000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-You can completely disable interpretation of Java methods before compilation by specifying the \f3-Xcomp\fR option\&. +-.TP +--XX:+DoEscapeAnalysis +-.br +-Enables the use of escape analysis\&. This option is enabled by default\&. To disable the use of escape analysis, specify \f3-XX:-DoEscapeAnalysis\fR\&. +-.TP +--XX:+FailOverToOldVerifier +-.br +-Enables automatic failover to the old verifier when the new type checker fails\&. By default, this option is disabled and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. +-.TP +--XX:InitialCodeCacheSize=\fIsize\fR +-.br +-Sets the initial code cache size (in bytes)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is set to 500 KB\&. The following example shows how to set the initial code cache size to 32 KB: +-.sp +-.nf +-\f3\-XX:InitialCodeCacheSize=32k\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+Inline +-.br +-Enables method inlining\&. This option is enabled by default to increase performance\&. To disable method inlining, specify \f3-XX:-Inline\fR\&. +-.TP +--XX:InlineSmallCode=\fIsize\fR +-.br +-Sets the maximum code size (in bytes) for compiled methods that should be inlined\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. Only compiled methods with the size smaller than the specified size will be inlined\&. By default, the maximum code size is set to 1000 bytes: +-.sp +-.nf +-\f3\-XX:InlineSmallCode=1000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+LogCompilation +-.br +-Enables logging of compilation activity to a file named \f3hotspot\&.log\fR in the current working directory\&. You can specify a different log file path and name using the \f3-XX:LogFile\fR option\&. +- +-By default, this option is disabled and compilation activity is not logged\&. The \f3-XX:+LogCompilation\fR option has to be used together with the \f3-XX:UnlockDiagnosticVMOptions\fR option that unlocks diagnostic JVM options\&. +- +-You can enable verbose diagnostic output with a message printed to the console every time a method is compiled by using the \f3-XX:+PrintCompilation\fR option\&. +-.TP +--XX:MaxInlineSize=\fIsize\fR +-.br +-Sets the maximum bytecode size (in bytes) of a method to be inlined\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the maximum bytecode size is set to 35 bytes: +-.sp +-.nf +-\f3\-XX:MaxInlineSize=35\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxNodeLimit=\fInodes\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileThreshold=5000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++You can completely disable interpretation of Java methods before compilation by specifying the ++\fB\-Xcomp\fR ++option\&. ++.RE ++.PP ++\-XX:+DoEscapeAnalysis ++.RS 4 ++Enables the use of escape analysis\&. This option is enabled by default\&. To disable the use of escape analysis, specify ++\fB\-XX:\-DoEscapeAnalysis\fR\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:InitialCodeCacheSize=\fIsize\fR ++.RS 4 ++Sets the initial code cache size (in bytes)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is set to 500 KB\&. The following example shows how to set the initial code cache size to 32 KB: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialCodeCacheSize=32k\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+Inline ++.RS 4 ++Enables method inlining\&. This option is enabled by default to increase performance\&. To disable method inlining, specify ++\fB\-XX:\-Inline\fR\&. ++.RE ++.PP ++\-XX:InlineSmallCode=\fIsize\fR ++.RS 4 ++Sets the maximum code size (in bytes) for compiled methods that should be inlined\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. Only compiled methods with the size smaller than the specified size will be inlined\&. By default, the maximum code size is set to 1000 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InlineSmallCode=1000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+LogCompilation ++.RS 4 ++Enables logging of compilation activity to a file named ++\fBhotspot\&.log\fR ++in the current working directory\&. You can specify a different log file path and name using the ++\fB\-XX:LogFile\fR ++option\&. ++.sp ++By default, this option is disabled and compilation activity is not logged\&. The ++\fB\-XX:+LogCompilation\fR ++option has to be used together with the ++\fB\-XX:UnlockDiagnosticVMOptions\fR ++option that unlocks diagnostic JVM options\&. ++.sp ++You can enable verbose diagnostic output with a message printed to the console every time a method is compiled by using the ++\fB\-XX:+PrintCompilation\fR ++option\&. ++.RE ++.PP ++\-XX:MaxInlineSize=\fIsize\fR ++.RS 4 ++Sets the maximum bytecode size (in bytes) of a method to be inlined\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the maximum bytecode size is set to 35 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxInlineSize=35\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxNodeLimit=\fInodes\fR ++.RS 4 + Sets the maximum number of nodes to be used during single method compilation\&. By default, the maximum number of nodes is set to 65,000: +-.sp +-.nf +-\f3\-XX:MaxNodeLimit=65000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxTrivialSize=\fIsize\fR +-.br +-Sets the maximum bytecode size (in bytes) of a trivial method to be inlined\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the maximum bytecode size of a trivial method is set to 6 bytes: +-.sp +-.nf +-\f3\-XX:MaxTrivialSize=6\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+OptimizeStringConcat +-.br +-Enables the optimization of \f3String\fR concatenation operations\&. This option is enabled by default\&. To disable the optimization of \f3String\fR concatenation operations, specify \f3-XX:-OptimizeStringConcat\fR\&. +-.TP +--XX:+PrintAssembly +-.br +-Enables printing of assembly code for bytecoded and native methods by using the external \f3disassembler\&.so\fR library\&. This enables you to see the generated code, which may help you to diagnose performance issues\&. +- +-By default, this option is disabled and assembly code is not printed\&. The \f3-XX:+PrintAssembly\fR option has to be used together with the \f3-XX:UnlockDiagnosticVMOptions\fR option that unlocks diagnostic JVM options\&. +-.TP +--XX:+PrintCompilation +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxNodeLimit=65000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxTrivialSize=\fIsize\fR ++.RS 4 ++Sets the maximum bytecode size (in bytes) of a trivial method to be inlined\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the maximum bytecode size of a trivial method is set to 6 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxTrivialSize=6\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+OptimizeStringConcat ++.RS 4 ++Enables the optimization of ++\fBString\fR ++concatenation operations\&. This option is enabled by default\&. To disable the optimization of ++\fBString\fR ++concatenation operations, specify ++\fB\-XX:\-OptimizeStringConcat\fR\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+PrintAssembly ++.RS 4 ++Enables printing of assembly code for bytecoded and native methods by using the external ++\fBdisassembler\&.so\fR ++library\&. This enables you to see the generated code, which may help you to diagnose performance issues\&. ++.sp ++By default, this option is disabled and assembly code is not printed\&. The ++\fB\-XX:+PrintAssembly\fR ++option has to be used together with the ++\fB\-XX:UnlockDiagnosticVMOptions\fR ++option that unlocks diagnostic JVM options\&. ++.RE ++.PP ++\-XX:+PrintCompilation ++.RS 4 + Enables verbose diagnostic output from the JVM by printing a message to the console every time a method is compiled\&. This enables you to see which methods actually get compiled\&. By default, this option is disabled and diagnostic output is not printed\&. +- +-You can also log compilation activity to a file by using the \f3-XX:+LogCompilation\fR option\&. +-.TP +--XX:+PrintInlining +-.br ++.sp ++You can also log compilation activity to a file by using the ++\fB\-XX:+LogCompilation\fR ++option\&. ++.RE ++.PP ++\-XX:+PrintInlining ++.RS 4 + Enables printing of inlining decisions\&. This enables you to see which methods are getting inlined\&. +- +-By default, this option is disabled and inlining information is not printed\&. The \f3-XX:+PrintInlining\fR option has to be used together with the \f3-XX:+UnlockDiagnosticVMOptions\fR option that unlocks diagnostic JVM options\&. +-.TP +--XX:+RelaxAccessControlCheck +-.br +-Decreases the amount of access control checks in the verifier\&. By default, this option is disabled, and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. +-.TP +--XX:ReservedCodeCacheSize=\fIsize\fR +-.br +-Sets the maximum code cache size (in bytes) for JIT-compiled code\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. This option is equivalent to \f3-Xmaxjitcodesize\fR\&. +-.TP +--XX:+TieredCompilation +-.br +-Enables the use of tiered compilation\&. By default, this option is disabled and tiered compilation is not used\&. +-.TP +--XX:+UseCodeCacheFlushing +-.br +-Enables flushing of the code cache before shutting down the compiler\&. This option is enabled by default\&. To disable flushing of the code cache before shutting down the compiler, specify \f3-XX:-UseCodeCacheFlushing\fR\&. +-.TP +--XX:+UseCondCardMark +-.br +-Enables checking of whether the card is already marked before updating the card table\&. This option is disabled by default and should only be used on machines with multiple sockets, where it will increase performance of Java applications that rely heavily on concurrent operations\&. +-.TP +--XX:+UseSuperWord +-.br +-Enables the transformation of scalar operations into superword operations\&. This option is enabled by default\&. To disable the transformation of scalar operations into superword operations, specify \f3-XX:-UseSuperWord\fR\&. +-.SS ADVANCED\ SERVICEABILITY\ OPTIONS ++.sp ++By default, this option is disabled and inlining information is not printed\&. The ++\fB\-XX:+PrintInlining\fR ++option has to be used together with the ++\fB\-XX:+UnlockDiagnosticVMOptions\fR ++option that unlocks diagnostic JVM options\&. ++.RE ++.PP ++\-XX:ReservedCodeCacheSize=\fIsize\fR ++.RS 4 ++Sets the maximum code cache size (in bytes) for JIT\-compiled code\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. This option is equivalent to ++\fB\-Xmaxjitcodesize\fR\&. ++.RE ++.PP ++\-XX:+TieredCompilation ++.RS 4 ++Enables the use of tiered compilation\&. By default, this option is enabled\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+UseAES ++.RS 4 ++Enables hardware\-based AES intrinsics for Intel, AMD, and SPARC hardware\&. Intel Westmere (2010 and newer), AMD Bulldozer (2011 and newer), and SPARC (T4 and newer) are the supported hardware\&. UseAES is used in conjunction with UseAESIntrinsics\&. ++.RE ++.PP ++\-XX:+UseAESIntrinsics ++.RS 4 ++UseAES and UseAESIntrinsics flags are enabled by default and are supported only for Java HotSpot Server VM 32\-bit and 64\-bit\&. To disable hardware\-based AES intrinsics, specify ++\fB\-XX:\-UseAES \-XX:\-UseAESIntrinsics\fR\&. For example, to enable hardware AES, use the following flags: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:+UseAES \-XX:+UseAESIntrinsics\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++To support UseAES and UseAESIntrinsics flags for 32\-bit and 64\-bit use ++\fB\-server\fR ++option to choose Java HotSpot Server VM\&. These flags are not supported on Client VM\&. ++.RE ++.PP ++\-XX:+UseCodeCacheFlushing ++.RS 4 ++Enables flushing of the code cache before shutting down the compiler\&. This option is enabled by default\&. To disable flushing of the code cache before shutting down the compiler, specify ++\fB\-XX:\-UseCodeCacheFlushing\fR\&. ++.RE ++.PP ++\-XX:+UseCondCardMark ++.RS 4 ++Enables checking of whether the card is already marked before updating the card table\&. This option is disabled by default and should only be used on machines with multiple sockets, where it will increase performance of Java applications that rely heavily on concurrent operations\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+UseSuperWord ++.RS 4 ++Enables the transformation of scalar operations into superword operations\&. This option is enabled by default\&. To disable the transformation of scalar operations into superword operations, specify ++\fB\-XX:\-UseSuperWord\fR\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.SS "Experimental JIT Compiler Options" ++.PP ++The options related to the Restricted Transactional Memory (RTM) locking feature in this section are experimental and are not officially supported in Java SE 8u20; you must enable the ++\fB\-XX:+UnlockExperimentalVMOptions\fR ++option to use them\&. These options are only available for the Java HotSpot Server VM on x86 CPUs that support Transactional Synchronization Extensions (TSX)\&. ++.PP ++\-XX:RTMAbortRatio=\fIabort_ratio\fR ++.RS 4 ++The RTM abort ratio is specified as a percentage (%) of all executed RTM transactions\&. If a number of aborted transactions becomes greater than this ratio, then the compiled code will be deoptimized\&. This ratio is used when the ++\fB\-XX:+UseRTMDeopt\fR ++option is enabled\&. The default value of this option is 50\&. This means that the compiled code will be deoptimized if 50% of all transactions are aborted\&. ++.RE ++.PP ++\-XX:RTMRetryCount=\fInumber_of_retries\fR ++.RS 4 ++RTM locking code will be retried, when it is aborted or busy, the number of times specified by this option before falling back to the normal locking mechanism\&. The default value for this option is 5\&. The ++\fB\-XX:UseRTMLocking\fR ++option must be enabled\&. ++.RE ++.PP ++\-XX:+UseRTMDeopt ++.RS 4 ++Auto\-tunes RTM locking depending on the abort ratio\&. This ratio is specified by ++\fB\-XX:RTMAbortRatio\fR ++option\&. If the number of aborted transactions exceeds the abort ratio, then the method containing the lock will be deoptimized and recompiled with all locks as normal locks\&. This option is disabled by default\&. The ++\fB\-XX:UseRTMLocking\fR ++option must be enabled\&. ++.RE ++.PP ++\-XX:+UseRTMLocking ++.RS 4 ++Generate Restricted Transactional Memory (RTM) locking code for all inflated locks, with the normal locking mechanism as the fallback handler\&. This option is disabled by default\&. ++.sp ++RTM is part of Intel\*(Aqs Transactional Synchronization Extensions (TSX), which is an x86 instruction set extension and facilitates the creation of multithreaded applications\&. RTM introduces the new instructions ++\fBXBEGIN\fR, ++\fBXABORT\fR, ++\fBXEND\fR, and ++\fBXTEST\fR\&. The ++\fBXBEGIN\fR ++and ++\fBXEND\fR ++instructions enclose a set of instructions to run as a transaction\&. If no conflict is found when running the transaction, the memory and register modifications are committed together at the ++\fBXEND\fR ++instruction\&. The ++\fBXABORT\fR ++instruction can be used to explicitly abort a transaction and the ++\fBXEND\fR ++instruction to check if a set of instructions are being run in a transaction\&. ++.sp ++A lock on a transaction is inflated when another thread tries to access the same transaction, thereby blocking the thread that did not originally request access to the transaction\&. RTM requires that a fallback set of operations be specified in case a transaction aborts or fails\&. An RTM lock is a lock that has been delegated to the TSX\*(Aqs system\&. ++.sp ++RTM improves performance for highly contended locks with low conflict in a critical region (which is code that must not be accessed by more than one thread concurrently)\&. RTM also improves the performance of coarse\-grain locking, which typically does not perform well in multithreaded applications\&. (Coarse\-grain locking is the strategy of holding locks for long periods to minimize the overhead of taking and releasing locks, while fine\-grained locking is the strategy of trying to achieve maximum parallelism by locking only when necessary and unlocking as soon as possible\&.) Also, for lightly contended locks that are used by different threads, RTM can reduce false cache line sharing, also known as cache line ping\-pong\&. This occurs when multiple threads from different processors are accessing different resources, but the resources share the same cache line\&. As a result, the processors repeatedly invalidate the cache lines of other processors, which forces them to read from main memory instead of their cache\&. ++.RE ++.SS "Advanced Serviceability Options" ++.PP + These options provide the ability to gather system information and perform extensive debugging\&. +-.TP +--XX:+ExtendedDTraceProbes +-.br +-Enables additional \f3dtrace\fR tool probes that impact the performance\&. By default, this option is disabled and \f3dtrace\fR performs only standard probes\&. +-.TP +--XX:+HeapDumpOnOutOfMemory +-.br +-Enables the dumping of the Java heap to a file in the current directory by using the heap profiler (HPROF) when a \f3java\&.lang\&.OutOfMemoryError\fR exception is thrown\&. You can explicitly set the heap dump file path and name using the \f3-XX:HeapDumpPath\fR option\&. By default, this option is disabled and the heap is not dumped when an \f3OutOfMemoryError\fR exception is thrown\&. +-.TP +--XX:HeapDumpPath=\fIpath\fR +-.br +-Sets the path and file name for writing the heap dump provided by the heap profiler (HPROF) when the \f3-XX:+HeapDumpOnOutOfMemoryError\fR option is set\&. By default, the file is created in the current working directory, and it is named \f3java_pid\fR\fIpid\fR\f3\&.hprof\fR where \fIpid\fR is the identifier of the process that caused the error\&. The following example shows how to set the default file explicitly (\f3%p\fR represents the current process identificator): +-.sp +-.nf +-\f3\-XX:HeapDumpPath=\&./java_pid%p\&.hprof\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\fI\fRThe following example shows how to set the heap dump file to \f3/var/log/java/java_heapdump\&.hprof\fR: +-.sp +-.nf +-\f3\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:LogFile=\fIpath\fR +-.br +-Sets the path and file name where log data is written\&. By default, the file is created in the current working directory, and it is named \f3hotspot\&.log\fR\&. +- +-\fI\fRThe following example shows how to set the log file to \f3/var/log/java/hotspot\&.log\fR: +-.sp +-.nf +-\f3\-XX:LogFile=/var/log/java/hotspot\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+PrintClassHistogram +-.br +-\fI\fREnables printing of a class instance histogram after a \f3Control+C\fR event (\f3SIGTERM\fR)\&. By default, this option is disabled\&. +- +-Setting this option is equivalent to running the \f3jmap -histo\fR command, or the \f3jcmd\fR\fIpid\fR\f3GC\&.class_histogram\fR command, where \fIpid\fR is the current Java process identifier\&. +-.TP +--XX:+PrintConcurrentLocks +- +- +-Enables printing of j\f3ava\&.util\&.concurrent\fR locks after a \f3Control+C\fR event (\f3SIGTERM\fR)\&. By default, this option is disabled\&. +- +-Setting this option is equivalent to running the \f3jstack -l\fR command or the \f3jcmd\fR\fIpid\fR\f3Thread\&.print -l\fR command, where \fIpid\fR is the current Java process identifier\&. +-.TP +--XX:+UnlockDiagnosticVMOptions +-.br ++.PP ++\-XX:+ExtendedDTraceProbes ++.RS 4 ++Enables additional ++\fBdtrace\fR ++tool probes that impact the performance\&. By default, this option is disabled and ++\fBdtrace\fR ++performs only standard probes\&. ++.RE ++.PP ++\-XX:+HeapDumpOnOutOfMemory ++.RS 4 ++Enables the dumping of the Java heap to a file in the current directory by using the heap profiler (HPROF) when a ++\fBjava\&.lang\&.OutOfMemoryError\fR ++exception is thrown\&. You can explicitly set the heap dump file path and name using the ++\fB\-XX:HeapDumpPath\fR ++option\&. By default, this option is disabled and the heap is not dumped when an ++\fBOutOfMemoryError\fR ++exception is thrown\&. ++.RE ++.PP ++\-XX:HeapDumpPath=\fIpath\fR ++.RS 4 ++Sets the path and file name for writing the heap dump provided by the heap profiler (HPROF) when the ++\fB\-XX:+HeapDumpOnOutOfMemoryError\fR ++option is set\&. By default, the file is created in the current working directory, and it is named ++\fBjava_pid\fR\fIpid\fR\fB\&.hprof\fR ++where ++\fIpid\fR ++is the identifier of the process that caused the error\&. The following example shows how to set the default file explicitly (\fB%p\fR ++represents the current process identificator): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=\&./java_pid%p\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example shows how to set the heap dump file to ++\fB/var/log/java/java_heapdump\&.hprof\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:LogFile=\fIpath\fR ++.RS 4 ++Sets the path and file name where log data is written\&. By default, the file is created in the current working directory, and it is named ++\fBhotspot\&.log\fR\&. ++.sp ++The following example shows how to set the log file to ++\fB/var/log/java/hotspot\&.log\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:LogFile=/var/log/java/hotspot\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+PrintClassHistogram ++.RS 4 ++Enables printing of a class instance histogram after a ++\fBControl+C\fR ++event (\fBSIGTERM\fR)\&. By default, this option is disabled\&. ++.sp ++Setting this option is equivalent to running the ++\fBjmap \-histo\fR ++command, or the ++\fBjcmd \fR\fIpid\fR\fB GC\&.class_histogram\fR ++command, where ++\fIpid\fR ++is the current Java process identifier\&. ++.RE ++.PP ++\-XX:+PrintConcurrentLocks ++.RS 4 ++Enables printing of j locks after a event\&. By default, this option is disabled\&. ++.sp ++Enables printing of j\fBava\&.util\&.concurrent\fR ++locks after a ++\fBControl+C\fR ++event (\fBSIGTERM\fR)\&. By default, this option is disabled\&. ++.sp ++Setting this option is equivalent to running the ++\fBjstack \-l\fR ++command or the ++\fBjcmd \fR\fIpid\fR\fB Thread\&.print \-l\fR ++command, where ++\fIpid\fR ++is the current Java process identifier\&. ++.RE ++.PP ++\-XX:+UnlockDiagnosticVMOptions ++.RS 4 + Unlocks the options intended for diagnosing the JVM\&. By default, this option is disabled and diagnostic options are not available\&. +-.SS ADVANCED\ GARBAGE\ COLLECTION\ OPTIONS ++.RE ++.SS "Advanced Garbage Collection Options" ++.PP + These options control how garbage collection (GC) is performed by the Java HotSpot VM\&. +-.TP +--XX:+AggressiveHeap +-.br +-Enables Java heap optimization\&. This sets various parameters to be optimal for long-running jobs with intensive memory allocation, based on the configuration of the computer (RAM and CPU)\&. By default, the option is disabled and the heap is not optimized\&. +-.TP +--XX:AllocatePrefetchDistance=\fIsize\fR +-.br +-Sets the size (in bytes) of the prefetch distance for object allocation\&. Memory about to be written with the value of new objects is prefetched up to this distance starting from the address of the last allocated object\&. Each Java thread has its own allocation point\&. +- +-Negative values denote that prefetch distance is chosen based on the platform\&. Positive values are bytes to prefetch\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is set to -1\&. +- +-The following example shows how to set the prefetch distance to 1024 bytes: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchDistance=1024\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchLines=\fIlines\fR +-.br +-Sets the number of cache lines to load after the last object allocation by using the prefetch instructions generated in compiled code\&. The default value is 1 if the last allocated object was an instance, and 3 if it was an array\&. +- +-The following example shows how to set the number of loaded cache lines to 5: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchLines=5\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchStyle=\fIstyle\fR +-.br +-Sets the generated code style for prefetch instructions\&. The \fIstyle\fR argument is an integer from 0 to 3: +-.RS +-.TP +-0 +-Do not generate prefetch instructions\&. +-.TP +-1 +-Execute prefetch instructions after each allocation\&. This is the default parameter\&. +-.TP +-2 +-Use the thread-local allocation block (TLAB) watermark pointer to determine when prefetch instructions are executed\&. +-.TP +-3 +-Use BIS instruction on SPARC for allocation prefetch\&. +-.RE +- +-.TP +--XX:+AlwaysPreTouch +-.br +-Enables touching of every page on the Java heap during JVM initialization\&. This gets all pages into the memory before entering the \f3main()\fR method\&. The option can be used in testing to simulate a long-running system with all virtual memory mapped to physical memory\&. By default, this option is disabled and all pages are committed as JVM heap space fills\&. +-.TP +--XX:+CMSClassUnloadingEnabled +-.br +-Enables class unloading when using the concurrent mark-sweep (CMS) garbage collector\&. This option is enabled by default\&. To disable class unloading for the CMS garbage collector, specify \f3-XX:-CMSClassUnloadingEnabled\fR\&. +-.TP +--XX:CMSExpAvgFactor=\fIpercent\fR +-.br ++.PP ++\-XX:+AggressiveHeap ++.RS 4 ++Enables Java heap optimization\&. This sets various parameters to be optimal for long\-running jobs with intensive memory allocation, based on the configuration of the computer (RAM and CPU)\&. By default, the option is disabled and the heap is not optimized\&. ++.RE ++.PP ++\-XX:+AlwaysPreTouch ++.RS 4 ++Enables touching of every page on the Java heap during JVM initialization\&. This gets all pages into the memory before entering the ++\fBmain()\fR ++method\&. The option can be used in testing to simulate a long\-running system with all virtual memory mapped to physical memory\&. By default, this option is disabled and all pages are committed as JVM heap space fills\&. ++.RE ++.PP ++\-XX:+CMSClassUnloadingEnabled ++.RS 4 ++Enables class unloading when using the concurrent mark\-sweep (CMS) garbage collector\&. This option is enabled by default\&. To disable class unloading for the CMS garbage collector, specify ++\fB\-XX:\-CMSClassUnloadingEnabled\fR\&. ++.RE ++.PP ++\-XX:CMSExpAvgFactor=\fIpercent\fR ++.RS 4 + Sets the percentage of time (0 to 100) used to weight the current sample when computing exponential averages for the concurrent collection statistics\&. By default, the exponential averages factor is set to 25%\&. The following example shows how to set the factor to 15%: +-.sp +-.nf +-\f3\-XX:CMSExpAvgFactor=15\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CMSInitiatingOccupancyFraction=\fIpercent\fR +-.br +-Sets the percentage of the old generation occupancy (0 to 100) at which to start a CMS collection cycle\&. The default value is set to -1\&. Any negative value (including the default) implies that \f3-XX:CMSTriggerRatio\fR is used to define the value of the initiating occupancy fraction\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CMSExpAvgFactor=15\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CMSInitiatingOccupancyFraction=\fIpercent\fR ++.RS 4 ++Sets the percentage of the old generation occupancy (0 to 100) at which to start a CMS collection cycle\&. The default value is set to \-1\&. Any negative value (including the default) implies that ++\fB\-XX:CMSTriggerRatio\fR ++is used to define the value of the initiating occupancy fraction\&. ++.sp + The following example shows how to set the occupancy fraction to 20%: +-.sp +-.nf +-\f3\-XX:CMSInitiatingOccupancyFraction=20\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+CMSScavengeBeforeRemark +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CMSInitiatingOccupancyFraction=20\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+CMSScavengeBeforeRemark ++.RS 4 + Enables scavenging attempts before the CMS remark step\&. By default, this option is disabled\&. +-.TP +--XX:CMSTriggerRatio=\fIpercent\fR +-.br +-Sets the percentage (0 to 100) of the value specified by \f3-XX:MinHeapFreeRatio\fR that is allocated before a CMS collection cycle commences\&. The default value is set to 80%\&. +- ++.RE ++.PP ++\-XX:CMSTriggerRatio=\fIpercent\fR ++.RS 4 ++Sets the percentage (0 to 100) of the value specified by ++\fB\-XX:MinHeapFreeRatio\fR ++that is allocated before a CMS collection cycle commences\&. The default value is set to 80%\&. ++.sp + The following example shows how to set the occupancy fraction to 75%: +-.sp +-.nf +-\f3\-XX:CMSTriggerRatio=75\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:ConcGCThreads=\fIthreads\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CMSTriggerRatio=75\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:ConcGCThreads=\fIthreads\fR ++.RS 4 + Sets the number of threads used for concurrent GC\&. The default value depends on the number of CPUs available to the JVM\&. +- ++.sp + For example, to set the number of threads for concurrent GC to 2, specify the following option: +-.sp +-.nf +-\f3\-XX:ConcGCThreads=2\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+DisableExplicitGC +-.br +-Enables the option that disables processing of calls to \f3System\&.gc()\fR\&. This option is disabled by default, meaning that calls to \f3System\&.gc()\fR are processed\&. If processing of calls to \f3System\&.gc()\fR is disabled, the JVM still performs GC when necessary\&. +-.TP +--XX:+ExplicitGCInvokesConcurrent +-.br +-Enables invoking of concurrent GC by using the \f3System\&.gc()\fR request\&. This option is disabled by default and can be enabled only together with the \f3-XX:+UseConcMarkSweepGC\fR option\&. +-.TP +--XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses +-.br +-Enables invoking of concurrent GC by using the \f3System\&.gc()\fR request and unloading of classes during the concurrent GC cycle\&. This option is disabled by default and can be enabled only together with the \f3-XX:+UseConcMarkSweepGC\fR option\&. +-.TP +--XX:G1HeapRegionSize=\fIsize\fR +-.br +-Sets the size of the regions into which the Java heap is subdivided when using the garbage-first (G1) collector\&. The value can be between 1 MB and 32 MB\&. The default region size is determined ergonomically based on the heap size\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ConcGCThreads=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+DisableExplicitGC ++.RS 4 ++Enables the option that disables processing of calls to ++\fBSystem\&.gc()\fR\&. This option is disabled by default, meaning that calls to ++\fBSystem\&.gc()\fR ++are processed\&. If processing of calls to ++\fBSystem\&.gc()\fR ++is disabled, the JVM still performs GC when necessary\&. ++.RE ++.PP ++\-XX:+ExplicitGCInvokesConcurrent ++.RS 4 ++Enables invoking of concurrent GC by using the ++\fBSystem\&.gc()\fR ++request\&. This option is disabled by default and can be enabled only together with the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option\&. ++.RE ++.PP ++\-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses ++.RS 4 ++Enables invoking of concurrent GC by using the ++\fBSystem\&.gc()\fR ++request and unloading of classes during the concurrent GC cycle\&. This option is disabled by default and can be enabled only together with the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option\&. ++.RE ++.PP ++\-XX:G1HeapRegionSize=\fIsize\fR ++.RS 4 ++Sets the size of the regions into which the Java heap is subdivided when using the garbage\-first (G1) collector\&. The value can be between 1 MB and 32 MB\&. The default region size is determined ergonomically based on the heap size\&. ++.sp + The following example shows how to set the size of the subdivisions to 16 MB: +-.sp +-.nf +-\f3\-XX:G1HeapRegionSize=16m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+G1PrintHeapRegions +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:G1HeapRegionSize=16m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+G1PrintHeapRegions ++.RS 4 + Enables the printing of information about which regions are allocated and which are reclaimed by the G1 collector\&. By default, this option is disabled\&. +-.TP +--XX:G1ReservePercent=\fIpercent\fR +-.br ++.RE ++.PP ++\-XX:G1ReservePercent=\fIpercent\fR ++.RS 4 + Sets the percentage of the heap (0 to 50) that is reserved as a false ceiling to reduce the possibility of promotion failure for the G1 collector\&. By default, this option is set to 10%\&. +- ++.sp + The following example shows how to set the reserved heap to 20%: +-.sp +-.nf +-\f3\-XX:G1ReservePercent=20\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:InitialHeapSize=\fIsize\fR +-.br +-Sets the initial size (in bytes) of the memory allocation pool\&. This value must be either 0, or a multiple of 1024 and greater than 1 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc-ergonomics\&.html +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:G1ReservePercent=20\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:InitialHeapSize=\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of the memory allocation pool\&. This value must be either 0, or a multiple of 1024 and greater than 1 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html ++.sp + The following examples show how to set the size of allocated memory to 6 MB using various units: +-.sp +-.nf +-\f3\-XX:InitialHeapSize=6291456\fP +-.fi +-.nf +-\f3\-XX:InitialHeapSize=6144k\fP +-.fi +-.nf +-\f3\-XX:InitialHeapSize=6m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If you set this option to 0, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The size of the heap for the young generation can be set using the \f3-XX:NewSize\fR option\&. +-.TP +--XX:InitialSurvivorRatio=\fIratio\fR +-.br +-Sets the initial survivor space ratio used by the throughput garbage collector (which is enabled by the \f3-XX:+UseParallelGC\fR and/or -\f3XX:+UseParallelOldGC\fR options)\&. Adaptive sizing is enabled by default with the throughput garbage collector by using the \f3-XX:+UseParallelGC\fR and \f3-XX:+UseParallelOldGC\fR options, and survivor space is resized according to the application behavior, starting with the initial value\&. If adaptive sizing is disabled (using the \f3-XX:-UseAdaptiveSizePolicy\fR option), then the \f3-XX:SurvivorRatio\fR option should be used to set the size of the survivor space for the entire execution of the application\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialHeapSize=6291456\fR ++\fB\-XX:InitialHeapSize=6144k\fR ++\fB\-XX:InitialHeapSize=6m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you set this option to 0, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The size of the heap for the young generation can be set using the ++\fB\-XX:NewSize\fR ++option\&. ++.RE ++.PP ++\-XX:InitialSurvivorRatio=\fIratio\fR ++.RS 4 ++Sets the initial survivor space ratio used by the throughput garbage collector (which is enabled by the ++\fB\-XX:+UseParallelGC\fR ++and/or \-\fBXX:+UseParallelOldGC\fR ++options)\&. Adaptive sizing is enabled by default with the throughput garbage collector by using the ++\fB\-XX:+UseParallelGC\fR ++and ++\fB\-XX:+UseParallelOldGC\fR ++options, and survivor space is resized according to the application behavior, starting with the initial value\&. If adaptive sizing is disabled (using the ++\fB\-XX:\-UseAdaptiveSizePolicy\fR ++option), then the ++\fB\-XX:SurvivorRatio\fR ++option should be used to set the size of the survivor space for the entire execution of the application\&. ++.sp + The following formula can be used to calculate the initial size of survivor space (S) based on the size of the young generation (Y), and the initial survivor space ratio (R): +-.sp +-.nf +-\f3S=Y/(R+2)\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBS=Y/(R+2)\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + The 2 in the equation denotes two survivor spaces\&. The larger the value specified as the initial survivor space ratio, the smaller the initial survivor space size\&. +- ++.sp + By default, the initial survivor space ratio is set to 8\&. If the default value for the young generation space size is used (2 MB), the initial size of the survivor space will be 0\&.2 MB\&. +- ++.sp + The following example shows how to set the initial survivor space ratio to 4: +-.sp +-.nf +-\f3\-XX:InitialSurvivorRatio=4\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:InitiatingHeapOccupancyPercent=\fIpercent\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialSurvivorRatio=4\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:InitiatingHeapOccupancyPercent=\fIpercent\fR ++.RS 4 + Sets the percentage of the heap occupancy (0 to 100) at which to start a concurrent GC cycle\&. It is used by garbage collectors that trigger a concurrent GC cycle based on the occupancy of the entire heap, not just one of the generations (for example, the G1 garbage collector)\&. +- ++.sp + By default, the initiating value is set to 45%\&. A value of 0 implies nonstop GC cycles\&. The following example shows how to set the initiating heap occupancy to 75%: +-.sp +-.nf +-\f3\-XX:InitiatingHeapOccupancyPercent=75\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxGCPauseMillis=\fItime\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitiatingHeapOccupancyPercent=75\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxGCPauseMillis=\fItime\fR ++.RS 4 + Sets a target for the maximum GC pause time (in milliseconds)\&. This is a soft goal, and the JVM will make its best effort to achieve it\&. By default, there is no maximum pause time value\&. +- ++.sp + The following example shows how to set the maximum target pause time to 500 ms: +-.sp +-.nf +-\f3\-XX:MaxGCPauseMillis=500\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxHeapSize=\fIsize\fR +-.br +-Sets the maximum size (in byes) of the memory allocation pool\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, \f3-XX:InitialHeapSize\fR and \f3-XX:MaxHeapSize\fR are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc-ergonomics\&.html +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxGCPauseMillis=500\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxHeapSize=\fIsize\fR ++.RS 4 ++Sets the maximum size (in byes) of the memory allocation pool\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, ++\fB\-XX:InitialHeapSize\fR ++and ++\fB\-XX:MaxHeapSize\fR ++are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html ++.sp + The following examples show how to set the maximum allowed size of allocated memory to 80 MB using various units: +-.sp +-.nf +-\f3\-XX:MaxHeapSize=83886080\fP +-.fi +-.nf +-\f3\-XX:MaxHeapSize=81920k\fP +-.fi +-.nf +-\f3\-XX:MaxHeapSize=80m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxHeapSize=83886080\fR ++\fB\-XX:MaxHeapSize=81920k\fR ++\fB\-XX:MaxHeapSize=80m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + On Oracle Solaris 7 and Oracle Solaris 8 SPARC platforms, the upper limit for this value is approximately 4,000 MB minus overhead amounts\&. On Oracle Solaris 2\&.6 and x86 platforms, the upper limit is approximately 2,000 MB minus overhead amounts\&. On Linux platforms, the upper limit is approximately 2,000 MB minus overhead amounts\&. +- +-The \f3-XX:MaxHeapSize\fR option is equivalent to \f3-Xmx\fR\&. +-.TP +--XX:MaxHeapFreeRatio=\fIpercent\fR +-.br ++.sp ++The ++\fB\-XX:MaxHeapSize\fR ++option is equivalent to ++\fB\-Xmx\fR\&. ++.RE ++.PP ++\-XX:MaxHeapFreeRatio=\fIpercent\fR ++.RS 4 + Sets the maximum allowed percentage of free heap space (0 to 100) after a GC event\&. If free heap space expands above this value, then the heap will be shrunk\&. By default, this value is set to 70%\&. +- ++.sp + The following example shows how to set the maximum free heap ratio to 75%: +-.sp +-.nf +-\f3\-XX:MaxHeapFreeRatio=75\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxMetaspaceSize=\fIsize\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxHeapFreeRatio=75\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxMetaspaceSize=\fIsize\fR ++.RS 4 + Sets the maximum amount of native memory that can be allocated for class metadata\&. By default, the size is not limited\&. The amount of metadata for an application depends on the application itself, other running applications, and the amount of memory available on the system\&. +- ++.sp + The following example shows how to set the maximum class metadata size to 256 MB: +-.sp +-.nf +-\f3\-XX:MaxMetaspaceSize=256m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxNewSize=\fIsize\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxMetaspaceSize=256m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxNewSize=\fIsize\fR ++.RS 4 + Sets the maximum size (in bytes) of the heap for the young generation (nursery)\&. The default value is set ergonomically\&. +-.TP +--XX:MaxTenuringThreshold=\fIthreshold\fR +-.br ++.RE ++.PP ++\-XX:MaxTenuringThreshold=\fIthreshold\fR ++.RS 4 + Sets the maximum tenuring threshold for use in adaptive GC sizing\&. The largest value is 15\&. The default value is 15 for the parallel (throughput) collector, and 6 for the CMS collector\&. +- ++.sp + The following example shows how to set the maximum tenuring threshold to 10: +-.sp +-.nf +-\f3\-XX:MaxTenuringThreshold=10\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MetaspaceSize=\fIsize\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxTenuringThreshold=10\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MetaspaceSize=\fIsize\fR ++.RS 4 + Sets the size of the allocated class metadata space that will trigger a garbage collection the first time it is exceeded\&. This threshold for a garbage collection is increased or decreased depending on the amount of metadata used\&. The default size depends on the platform\&. +-.TP +--XX:MinHeapFreeRatio=\fIpercent\fR +-.br ++.RE ++.PP ++\-XX:MinHeapFreeRatio=\fIpercent\fR ++.RS 4 + Sets the minimum allowed percentage of free heap space (0 to 100) after a GC event\&. If free heap space falls below this value, then the heap will be expanded\&. By default, this value is set to 40%\&. +- ++.sp + The following example shows how to set the minimum free heap ratio to 25%: +-.sp +-.nf +-\f3\-XX:MinHeapFreeRatio=25\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:NewRatio=\fIratio\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MinHeapFreeRatio=25\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:NewRatio=\fIratio\fR ++.RS 4 + Sets the ratio between young and old generation sizes\&. By default, this option is set to 2\&. The following example shows how to set the young/old ratio to 1: +-.sp +-.nf +-\f3\-XX:NewRatio=1\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:NewSize=\fIsize\fR +-.br +-Sets the initial size (in bytes) of the heap for the young generation (nursery)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:NewRatio=1\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:NewSize=\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of the heap for the young generation (nursery)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. ++.sp + The young generation region of the heap is used for new objects\&. GC is performed in this region more often than in other regions\&. If the size for the young generation is too low, then a large number of minor GCs will be performed\&. If the size is too high, then only full GCs will be performed, which can take a long time to complete\&. Oracle recommends that you keep the size for the young generation between a half and a quarter of the overall heap size\&. +- ++.sp + The following examples show how to set the initial size of young generation to 256 MB using various units: +-.sp +-.nf +-\f3\-XX:NewSize=256m\fP +-.fi +-.nf +-\f3\-XX:NewSize=262144k\fP +-.fi +-.nf +-\f3\-XX:NewSize=268435456\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The \f3-XX:NewSize\fR option is equivalent to \f3-Xmn\fR\&. +-.TP +--XX:ParallelGCThreads=\fIthreads\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:NewSize=256m\fR ++\fB\-XX:NewSize=262144k\fR ++\fB\-XX:NewSize=268435456\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The ++\fB\-XX:NewSize\fR ++option is equivalent to ++\fB\-Xmn\fR\&. ++.RE ++.PP ++\-XX:ParallelGCThreads=\fIthreads\fR ++.RS 4 + Sets the number of threads used for parallel garbage collection in the young and old generations\&. The default value depends on the number of CPUs available to the JVM\&. +- ++.sp + For example, to set the number of threads for parallel GC to 2, specify the following option: +-.sp +-.nf +-\f3\-XX:ParallelGCThreads=2\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+ParallelRefProcEnabled +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ParallelGCThreads=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+ParallelRefProcEnabled ++.RS 4 + Enables parallel reference processing\&. By default, this option is disabled\&. +-.TP +--XX:+PrintAdaptiveSizePolicy +-.br ++.RE ++.PP ++\-XX:+PrintAdaptiveSizePolicy ++.RS 4 + Enables printing of information about adaptive generation sizing\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGC +-.br ++.RE ++.PP ++\-XX:+PrintGC ++.RS 4 + Enables printing of messages at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCApplicationConcurrentTime +-.br ++.RE ++.PP ++\-XX:+PrintGCApplicationConcurrentTime ++.RS 4 + Enables printing of how much time elapsed since the last pause (for example, a GC pause)\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCApplicationStoppedTime +-.br ++.RE ++.PP ++\-XX:+PrintGCApplicationStoppedTime ++.RS 4 + Enables printing of how much time the pause (for example, a GC pause) lasted\&. By default, this option is disabled\&. +-.TP +--XX+PrintGCDateStamp +-.br ++.RE ++.PP ++\-XX:+PrintGCDateStamps ++.RS 4 + Enables printing of a date stamp at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCDetails +-.br ++.RE ++.PP ++\-XX:+PrintGCDetails ++.RS 4 + Enables printing of detailed messages at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCTaskTimeStamps +-.br ++.RE ++.PP ++\-XX:+PrintGCTaskTimeStamps ++.RS 4 + Enables printing of time stamps for every individual GC worker thread task\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCTimeStamp +-.br ++.RE ++.PP ++\-XX:+PrintGCTimeStamps ++.RS 4 + Enables printing of time stamps at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintTenuringDistribution +-.br ++.RE ++.PP ++\-XX:+PrintStringDeduplicationStatistics ++.RS 4 ++Prints detailed deduplication statistics\&. By default, this option is disabled\&. See the ++\fB\-XX:+UseStringDeduplication\fR ++option\&. ++.RE ++.PP ++\-XX:+PrintTenuringDistribution ++.RS 4 + Enables printing of tenuring age information\&. The following is an example of the output: +-.sp +-.nf +-\f3Desired survivor size 48286924 bytes, new threshold 10 (max 10)\fP +-.fi +-.nf +-\f3\- age 1: 28992024 bytes, 28992024 total\fP +-.fi +-.nf +-\f3\- age 2: 1366864 bytes, 30358888 total\fP +-.fi +-.nf +-\f3\- age 3: 1425912 bytes, 31784800 total\fP +-.fi +-.nf +-\f3\&.\&.\&.\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBDesired survivor size 48286924 bytes, new threshold 10 (max 10)\fR ++\fB\- age 1: 28992024 bytes, 28992024 total\fR ++\fB\- age 2: 1366864 bytes, 30358888 total\fR ++\fB\- age 3: 1425912 bytes, 31784800 total\fR ++\fB\&.\&.\&.\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + Age 1 objects are the youngest survivors (they were created after the previous scavenge, survived the latest scavenge, and moved from eden to survivor space)\&. Age 2 objects have survived two scavenges (during the second scavenge they were copied from one survivor space to the next)\&. And so on\&. +- ++.sp + In the preceding example, 28 992 024 bytes survived one scavenge and were copied from eden to survivor space, 1 366 864 bytes are occupied by age 2 objects, etc\&. The third value in each row is the cumulative size of objects of age n or less\&. +- ++.sp + By default, this option is disabled\&. +-.TP +--XX:+ScavengeBeforeFullGC +-.br +-Enables GC of the young generation before each full GC\&. This option is enabled by default\&. Oracle recommends that you \fIdo not\fR disable it, because scavenging the young generation before a full GC can reduce the number of objects reachable from the old generation space into the young generation space\&. To disable GC of the young generation before each full GC, specify \f3-XX:-ScavengeBeforeFullGC\fR\&. +-.TP +--XX:SoftRefLRUPolicyMSPerMB=\fItime\fR +-.br +-Sets the amount of time (in milliseconds) a softly reachable object is kept active on the heap after the last time it was referenced\&. The default value is one second of lifetime per free megabyte in the heap\&. The \f3-XX:SoftRefLRUPolicyMSPerMB\fR option accepts integer values representing milliseconds per one megabyte of the current heap size (for Java HotSpot Client VM) or the maximum possible heap size (for Java HotSpot Server VM)\&. This difference means that the Client VM tends to flush soft references rather than grow the heap, whereas the Server VM tends to grow the heap rather than flush soft references\&. In the latter case, the value of the \f3-Xmx\fR option has a significant effect on how quickly soft references are garbage collected\&. +- ++.RE ++.PP ++\-XX:+ScavengeBeforeFullGC ++.RS 4 ++Enables GC of the young generation before each full GC\&. This option is enabled by default\&. Oracle recommends that you ++\fIdo not\fR ++disable it, because scavenging the young generation before a full GC can reduce the number of objects reachable from the old generation space into the young generation space\&. To disable GC of the young generation before each full GC, specify ++\fB\-XX:\-ScavengeBeforeFullGC\fR\&. ++.RE ++.PP ++\-XX:SoftRefLRUPolicyMSPerMB=\fItime\fR ++.RS 4 ++Sets the amount of time (in milliseconds) a softly reachable object is kept active on the heap after the last time it was referenced\&. The default value is one second of lifetime per free megabyte in the heap\&. The ++\fB\-XX:SoftRefLRUPolicyMSPerMB\fR ++option accepts integer values representing milliseconds per one megabyte of the current heap size (for Java HotSpot Client VM) or the maximum possible heap size (for Java HotSpot Server VM)\&. This difference means that the Client VM tends to flush soft references rather than grow the heap, whereas the Server VM tends to grow the heap rather than flush soft references\&. In the latter case, the value of the ++\fB\-Xmx\fR ++option has a significant effect on how quickly soft references are garbage collected\&. ++.sp + The following example shows how to set the value to 2\&.5 seconds: +-.sp +-.nf +-\f3\-XX:SoftRefLRUPolicyMSPerMB=2500\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:SurvivorRatio=\fIratio\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:SoftRefLRUPolicyMSPerMB=2500\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:StringDeduplicationAgeThreshold=\fIthreshold\fR ++.RS 4 ++\fBString\fR ++objects reaching the specified age are considered candidates for deduplication\&. An object\*(Aqs age is a measure of how many times it has survived garbage collection\&. This is sometimes referred to as tenuring; see the ++\fB\-XX:+PrintTenuringDistribution\fR ++option\&. Note that ++\fBString\fR ++objects that are promoted to an old heap region before this age has been reached are always considered candidates for deduplication\&. The default value for this option is ++\fB3\fR\&. See the ++\fB\-XX:+UseStringDeduplication\fR ++option\&. ++.RE ++.PP ++\-XX:SurvivorRatio=\fIratio\fR ++.RS 4 + Sets the ratio between eden space size and survivor space size\&. By default, this option is set to 8\&. The following example shows how to set the eden/survivor space ratio to 4: +-.sp +-.nf +-\f3\-XX:SurvivorRatio=4\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:TargetSurvivorRatio=\fIpercent\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:SurvivorRatio=4\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:TargetSurvivorRatio=\fIpercent\fR ++.RS 4 + Sets the desired percentage of survivor space (0 to 100) used after young garbage collection\&. By default, this option is set to 50%\&. +- ++.sp + The following example shows how to set the target survivor space ratio to 30%: +-.sp +-.nf +-\f3\-XX:TargetSurvivorRatio=30\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:TLABSize=\fIsize\fR +-.br +-Sets the initial size (in bytes) of a thread-local allocation buffer (TLAB)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. If this option is set to 0, then the JVM chooses the initial size automatically\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:TargetSurvivorRatio=30\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:TLABSize=\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of a thread\-local allocation buffer (TLAB)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. If this option is set to 0, then the JVM chooses the initial size automatically\&. ++.sp + The following example shows how to set the initial TLAB size to 512 KB: +-.sp +-.nf +-\f3\-XX:TLABSize=512k\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+UseAdaptiveSizePolicy +-.br +-Enables the use of adaptive generation sizing\&. This option is enabled by default\&. To disable adaptive generation sizing, specify \f3-XX:-UseAdaptiveSizePolicy\fR and set the size of the memory allocation pool explicitly (see the \f3-XX:SurvivorRatio\fR option)\&. +-.TP +--XX:+UseCMSInitiatingOccupancyOnly +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:TLABSize=512k\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+UseAdaptiveSizePolicy ++.RS 4 ++Enables the use of adaptive generation sizing\&. This option is enabled by default\&. To disable adaptive generation sizing, specify ++\fB\-XX:\-UseAdaptiveSizePolicy\fR ++and set the size of the memory allocation pool explicitly (see the ++\fB\-XX:SurvivorRatio\fR ++option)\&. ++.RE ++.PP ++\-XX:+UseCMSInitiatingOccupancyOnly ++.RS 4 + Enables the use of the occupancy value as the only criterion for initiating the CMS collector\&. By default, this option is disabled and other criteria may be used\&. +-.TP +--XX:+UseConcMarkSweepGC +-.br +-Enables the use of the CMS garbage collector for the old generation\&. Oracle recommends that you use the CMS garbage collector when application latency requirements cannot be met by the throughput (\f3-XX:+UseParallelGC\fR) garbage collector\&. The G1 garbage collector (\f3-XX:+UseG1GC\fR) is another alternative\&. +- +-By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. When this option is enabled, the \f3-XX:+UseParNewGC\fR option is automatically set and you should not disable it, because the following combination of options has been deprecated in JDK 8: \f3-XX:+UseConcMarkSweepGC -XX:-UseParNewGC\fR\&. +-.TP +--XX:+UseG1GC +-.br +-Enables the use of the G1 garbage collector\&. It is a server-style garbage collector, targeted for multiprocessor machines with a large amount of RAM\&. It meets GC pause time goals with high probability, while maintaining good throughput\&. The G1 collector is recommended for applications requiring large heaps (sizes of around 6 GB or larger) with limited GC latency requirements (stable and predictable pause time below 0\&.5 seconds)\&. +- ++.RE ++.PP ++\-XX:+UseConcMarkSweepGC ++.RS 4 ++Enables the use of the CMS garbage collector for the old generation\&. Oracle recommends that you use the CMS garbage collector when application latency requirements cannot be met by the throughput (\fB\-XX:+UseParallelGC\fR) garbage collector\&. The G1 garbage collector (\fB\-XX:+UseG1GC\fR) is another alternative\&. ++.sp ++By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. When this option is enabled, the ++\fB\-XX:+UseParNewGC\fR ++option is automatically set and you should not disable it, because the following combination of options has been deprecated in JDK 8: ++\fB\-XX:+UseConcMarkSweepGC \-XX:\-UseParNewGC\fR\&. ++.RE ++.PP ++\-XX:+UseG1GC ++.RS 4 ++Enables the use of the garbage\-first (G1) garbage collector\&. It is a server\-style garbage collector, targeted for multiprocessor machines with a large amount of RAM\&. It meets GC pause time goals with high probability, while maintaining good throughput\&. The G1 collector is recommended for applications requiring large heaps (sizes of around 6 GB or larger) with limited GC latency requirements (stable and predictable pause time below 0\&.5 seconds)\&. ++.sp + By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. +-.TP +--XX:+UseGCOverheadLimit +-.br +-Enables the use of a policy that limits the proportion of time spent by the JVM on GC before an \f3OutOfMemoryError\fR exception is thrown\&. This option is enabled, by default and the parallel GC will throw an \f3OutOfMemoryError\fR if more than 98% of the total time is spent on garbage collection and less than 2% of the heap is recovered\&. When the heap is small, this feature can be used to prevent applications from running for long periods of time with little or no progress\&. To disable this option, specify \f3-XX:-UseGCOverheadLimit\fR\&. +-.TP +--XX:+UseNUMA +-.br +-Enables performance optimization of an application on a machine with nonuniform memory architecture (NUMA) by increasing the application\&'s use of lower latency memory\&. By default, this option is disabled and no optimization for NUMA is made\&. The option is only available when the parallel garbage collector is used (\f3-XX:+UseParallelGC\fR)\&. +-.TP +--XX:+UseParallelGC +-.br ++.RE ++.PP ++\-XX:+UseGCOverheadLimit ++.RS 4 ++Enables the use of a policy that limits the proportion of time spent by the JVM on GC before an ++\fBOutOfMemoryError\fR ++exception is thrown\&. This option is enabled, by default and the parallel GC will throw an ++\fBOutOfMemoryError\fR ++if more than 98% of the total time is spent on garbage collection and less than 2% of the heap is recovered\&. When the heap is small, this feature can be used to prevent applications from running for long periods of time with little or no progress\&. To disable this option, specify ++\fB\-XX:\-UseGCOverheadLimit\fR\&. ++.RE ++.PP ++\-XX:+UseNUMA ++.RS 4 ++Enables performance optimization of an application on a machine with nonuniform memory architecture (NUMA) by increasing the application\*(Aqs use of lower latency memory\&. By default, this option is disabled and no optimization for NUMA is made\&. The option is only available when the parallel garbage collector is used (\fB\-XX:+UseParallelGC\fR)\&. ++.RE ++.PP ++\-XX:+UseParallelGC ++.RS 4 + Enables the use of the parallel scavenge garbage collector (also known as the throughput collector) to improve the performance of your application by leveraging multiple processors\&. +- +-By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. If it is enabled, then the \f3-XX:+UseParallelOldGC\fR option is automatically enabled, unless you explicitly disable it\&. +-.TP +--XX:+UseParallelOldGC +-.br +-Enables the use of the parallel garbage collector for full GCs\&. By default, this option is disabled\&. Enabling it automatically enables the \f3-XX:+UseParallelGC\fR option\&. +-.TP +--XX:+UseParNewGC +-.br +-Enables the use of parallel threads for collection in the young generation\&. By default, this option is disabled\&. It is automatically enabled when you set the \f3-XX:+UseConcMarkSweepGC\fR option\&. Using the \f3-XX:+UseParNewGC\fR option without the \f3-XX:+UseConcMarkSweepGC\fR option was deprecated in JDK 8\&. +-.TP +--XX:+UseSerialGC +-.br ++.sp ++By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. If it is enabled, then the ++\fB\-XX:+UseParallelOldGC\fR ++option is automatically enabled, unless you explicitly disable it\&. ++.RE ++.PP ++\-XX:+UseParallelOldGC ++.RS 4 ++Enables the use of the parallel garbage collector for full GCs\&. By default, this option is disabled\&. Enabling it automatically enables the ++\fB\-XX:+UseParallelGC\fR ++option\&. ++.RE ++.PP ++\-XX:+UseParNewGC ++.RS 4 ++Enables the use of parallel threads for collection in the young generation\&. By default, this option is disabled\&. It is automatically enabled when you set the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option\&. Using the ++\fB\-XX:+UseParNewGC\fR ++option without the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option was deprecated in JDK 8\&. ++.RE ++.PP ++\-XX:+UseSerialGC ++.RS 4 + Enables the use of the serial garbage collector\&. This is generally the best choice for small and simple applications that do not require any special functionality from garbage collection\&. By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. +-.TP +--XX:+UseTLAB +-.br +-Enables the use of thread-local allocation blocks (TLABs) in the young generation space\&. This option is enabled by default\&. To disable the use of TLABs, specify \f3-XX:-UseTLAB\fR\&. +-.SS DEPRECATED\ AND\ REMOVED\ OPTIONS ++.RE ++.PP ++\-XX:+UseStringDeduplication ++.RS 4 ++Enables string deduplication\&. By default, this option is disabled\&. To use this option, you must enable the garbage\-first (G1) garbage collector\&. See the ++\fB\-XX:+UseG1GC\fR ++option\&. ++.sp ++\fIString deduplication\fR ++reduces the memory footprint of ++\fBString\fR ++objects on the Java heap by taking advantage of the fact that many ++\fBString\fR ++objects are identical\&. Instead of each ++\fBString\fR ++object pointing to its own character array, identical ++\fBString\fR ++objects can point to and share the same character array\&. ++.RE ++.PP ++\-XX:+UseTLAB ++.RS 4 ++Enables the use of thread\-local allocation blocks (TLABs) in the young generation space\&. This option is enabled by default\&. To disable the use of TLABs, specify ++\fB\-XX:\-UseTLAB\fR\&. ++.RE ++.SS "Deprecated and Removed Options" ++.PP + These options were included in the previous release, but have since been considered unnecessary\&. +-.TP +--Xincgc +-.br ++.PP ++\-Xincgc ++.RS 4 + Enables incremental garbage collection\&. This option was deprecated in JDK 8 with no replacement\&. +-.TP +--Xrun\fIlibname\fR +-.br +-Loads the specified debugging/profiling library\&. This option was superseded by the \f3-agentlib\fR option\&. +-.TP +--XX:CMSIncrementalDutyCycle=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) between minor collections that the concurrent collector is allowed to run\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:CMSIncrementalDutyCycleMin=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) between minor collections that is the lower bound for the duty cycle when \f3-XX:+CMSIncrementalPacing\fR is enabled\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:+CMSIncrementalMode +-.br +-Enables the incremental mode for the CMS collector\&. This option was deprecated in JDK 8 with no replacement, along with other options that start with \f3CMSIncremental\fR\&. +-.TP +--XX:CMSIncrementalOffset=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) by which the incremental mode duty cycle is shifted to the right within the period between minor collections\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:+CMSIncrementalPacing +-.br +-Enables automatic adjustment of the incremental mode duty cycle based on statistics collected while the JVM is running\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:CMSIncrementalSafetyFactor=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) used to add conservatism when computing the duty cycle\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:CMSInitiatingPermOccupancyFraction=\fIpercent\fR +-.br ++.RE ++.PP ++\-Xrun\fIlibname\fR ++.RS 4 ++Loads the specified debugging/profiling library\&. This option was superseded by the ++\fB\-agentlib\fR ++option\&. ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycle=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) between minor collections that the concurrent collector is allowed to run\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycleMin=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) between minor collections that is the lower bound for the duty cycle when ++\fB\-XX:+CMSIncrementalPacing\fR ++is enabled\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:+CMSIncrementalMode ++.RS 4 ++Enables the incremental mode for the CMS collector\&. This option was deprecated in JDK 8 with no replacement, along with other options that start with ++\fBCMSIncremental\fR\&. ++.RE ++.PP ++\-XX:CMSIncrementalOffset=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) by which the incremental mode duty cycle is shifted to the right within the period between minor collections\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:+CMSIncrementalPacing ++.RS 4 ++Enables automatic adjustment of the incremental mode duty cycle based on statistics collected while the JVM is running\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:CMSIncrementalSafetyFactor=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) used to add conservatism when computing the duty cycle\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:CMSInitiatingPermOccupancyFraction=\fIpercent\fR ++.RS 4 + Sets the percentage of the permanent generation occupancy (0 to 100) at which to start a GC\&. This option was deprecated in JDK 8 with no replacement\&. +-.TP +--XX:MaxPermSize=\fIsize\fR +-.br +-Sets the maximum permanent generation space size (in bytes)\&. This option was deprecated in JDK 8, and superseded by the \f3-XX:MaxMetaspaceSize\fR option\&. +-.TP +--XX:PermSize=\fIsize\fR +-.br +-Sets the space (in bytes) allocated to the permanent generation that triggers a garbage collection if it is exceeded\&. This option was deprecated un JDK 8, and superseded by the \f3-XX:MetaspaceSize\fR option\&. +-.TP +--XX:+UseSplitVerifier +-.br ++.RE ++.PP ++\-XX:MaxPermSize=\fIsize\fR ++.RS 4 ++Sets the maximum permanent generation space size (in bytes)\&. This option was deprecated in JDK 8, and superseded by the ++\fB\-XX:MaxMetaspaceSize\fR ++option\&. ++.RE ++.PP ++\-XX:PermSize=\fIsize\fR ++.RS 4 ++Sets the space (in bytes) allocated to the permanent generation that triggers a garbage collection if it is exceeded\&. This option was deprecated un JDK 8, and superseded by the ++\fB\-XX:MetaspaceSize\fR ++option\&. ++.RE ++.PP ++\-XX:+UseSplitVerifier ++.RS 4 + Enables splitting of the verification process\&. By default, this option was enabled in the previous releases, and verification was split into two phases: type referencing (performed by the compiler) and type checking (performed by the JVM runtime)\&. This option was deprecated in JDK 8, and verification is now split by default without a way to disable it\&. +-.TP +--XX:+UseStringCache +-.br ++.RE ++.PP ++\-XX:+UseStringCache ++.RS 4 + Enables caching of commonly allocated strings\&. This option was removed from JDK 8 with no replacement\&. +-.SH PERFORMANCE\ TUNING\ EXAMPLES ++.RE ++.SH "PERFORMANCE TUNING EXAMPLES" ++.PP + The following examples show how to use experimental tuning flags to either optimize throughput or to provide lower response time\&. + .PP +-\f3Example 1 Tuning for Higher Throughput\fR +-.sp +-.nf +-\f3java \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 2 Tuning for Lower Response Time\fR +-.sp +-.nf +-\f3java \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-.SH EXIT\ STATUS +-The following exit values are typically returned by the launcher when the launcher is called with the wrong arguments, serious errors, or exceptions thrown by the JVM\&. However, a Java application may choose to return any value by using the API call \f3System\&.exit(exitValue)\fR\&. The values are: +-.TP 0.2i +-\(bu +-\f30\fR: Successful completion +-.TP 0.2i +-\(bu +-\f3>0\fR: An error occurred +-.SH SEE\ ALSO +-.TP 0.2i +-\(bu ++\fBExample 1\fR ++.br ++Tuning for Higher Throughput ++.RS 4 ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\fBExample 2\fR ++.br ++Tuning for Lower Response Time ++.RS 4 ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.SH "EXIT STATUS" ++.PP ++The following exit values are typically returned by the launcher when the launcher is called with the wrong arguments, serious errors, or exceptions thrown by the JVM\&. However, a Java application may choose to return any value by using the API call ++\fBSystem\&.exit(exitValue)\fR\&. The values are: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fB0\fR: Successful completion ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fB>0\fR: An error occurred ++.RE ++.SH "SEE ALSO" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javac(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jdb(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javah(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jar(1) +-.RE +-.br +-'pl 8.5i +-'bp ++.RE ++.br ++'pl 8.5i ++'bp +--- ./jdk/src/linux/doc/man/javac.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/javac.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,1364 +1,2116 @@ + '\" t +-.\" Copyright (c) 1994, 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. +-.\" +-.\" Arch: generic +-.\" Software: JDK 8 +-.\" Date: 21 November 2013 +-.\" SectDesc: Basic Tools +-.\" Title: javac.1 ++.\" Copyright (c) 1994, 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. ++.\" ++.\" Title: javac ++.\" Language: English ++.\" Date: 8 August 2014 ++.\" SectDesc: Basic Tools ++.\" Software: JDK 8 ++.\" Arch: generic ++.\" Part Number: E38207-03 + .\" + .if n .pl 99999 +-.TH javac 1 "21 November 2013" "JDK 8" "Basic Tools" +-.\" ----------------------------------------------------------------- +-.\" * Define some portability stuff +-.\" ----------------------------------------------------------------- +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.\" http://bugs.debian.org/507673 +-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" ----------------------------------------------------------------- +-.\" * set default formatting +-.\" ----------------------------------------------------------------- +-.\" disable hyphenation +-.nh +-.\" disable justification (adjust text to left margin only) +-.ad l +-.\" ----------------------------------------------------------------- +-.\" * MAIN CONTENT STARTS HERE * +-.\" ----------------------------------------------------------------- +- +-.SH NAME ++.TH "javac" "1" "8 August 2014" "JDK 8" "Basic Tools" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" + javac \- Reads Java class and interface definitions and compiles them into bytecode and class files\&. +-.SH SYNOPSIS +-.sp +-.nf +- ++.SH "SYNOPSIS" ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjavac\fR [ \fIoptions\fR ] [ \fIsourcefiles\fR ] [ \fIclasses\fR] [ \fI@argfiles\fR ] +-.fi +-.sp ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + Arguments can be in any order: +-.TP ++.PP + \fIoptions\fR +-Command-line options\&. See Options\&. +-.TP ++.RS 4 ++Command\-line options\&. See Options\&. ++.RE ++.PP + \fIsourcefiles\fR +-One or more source files to be compiled (such as \f3MyClass\&.java\fR)\&. +-.TP ++.RS 4 ++One or more source files to be compiled (such as ++\fBMyClass\&.java\fR)\&. ++.RE ++.PP + \fIclasses\fR +-One or more classes to be processed for annotations (such as \f3MyPackage\&.MyClass\fR)\&. +-.TP ++.RS 4 ++One or more classes to be processed for annotations (such as ++\fBMyPackage\&.MyClass\fR)\&. ++.RE ++.PP + \fI@argfiles\fR +-One or more files that list options and source files\&. The \f3-J\fR options are not allowed in these files\&. See Command-Line Argument Files\&. +-.SH DESCRIPTION +-The \f3javac\fR command reads class and interface definitions, written in the Java programming language, and compiles them into bytecode class files\&. The \f3javac\fR command can also process annotations in Java source files and classes\&. ++.RS 4 ++One or more files that list options and source files\&. The ++\fB\-J\fR ++options are not allowed in these files\&. See Command\-Line Argument Files\&. ++.RE ++.SH "DESCRIPTION" + .PP +-There are two ways to pass source code file names to \f3javac\fR\&. +-.TP 0.2i +-\(bu ++The ++\fBjavac\fR ++command reads class and interface definitions, written in the Java programming language, and compiles them into bytecode class files\&. The ++\fBjavac\fR ++command can also process annotations in Java source files and classes\&. ++.PP ++There are two ways to pass source code file names to ++\fBjavac\fR\&. ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + For a small number of source files, list the file names on the command line\&. +-.TP 0.2i +-\(bu +-For a large number of source files, list the file names in a file that is separated by blanks or line breaks\&. Use the list file name preceded by an at sign (@) with the \f3javac\fR command\&. ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++For a large number of source files, list the file names in a file that is separated by blanks or line breaks\&. Use the list file name preceded by an at sign (@) with the ++\fBjavac\fR ++command\&. ++.RE + .PP +-Source code file names must have \&.java suffixes, class file names must have \&.class suffixes, and both source and class files must have root names that identify the class\&. For example, a class called \f3MyClass\fR would be written in a source file called \f3MyClass\&.java\fR and compiled into a bytecode class file called \f3MyClass\&.class\fR\&. ++Source code file names must have \&.java suffixes, class file names must have \&.class suffixes, and both source and class files must have root names that identify the class\&. For example, a class called ++\fBMyClass\fR ++would be written in a source file called ++\fBMyClass\&.java\fR ++and compiled into a bytecode class file called ++\fBMyClass\&.class\fR\&. + .PP +-Inner class definitions produce additional class files\&. These class files have names that combine the inner and outer class names, such as \f3MyClass$MyInnerClass\&.class\fR\&. ++Inner class definitions produce additional class files\&. These class files have names that combine the inner and outer class names, such as ++\fBMyClass$MyInnerClass\&.class\fR\&. + .PP +-Arrange source files in a directory tree that reflects their package tree\&. For example, if all of your source files are in \f3/workspace\fR, then put the source code for \f3com\&.mysoft\&.mypack\&.MyClass\fR in \f3/workspace/com/mysoft/mypack/MyClass\&.java\fR\&. ++Arrange source files in a directory tree that reflects their package tree\&. For example, if all of your source files are in ++\fB/workspace\fR, then put the source code for ++\fBcom\&.mysoft\&.mypack\&.MyClass\fR ++in ++\fB/workspace/com/mysoft/mypack/MyClass\&.java\fR\&. + .PP +-By default, the compiler puts each class file in the same directory as its source file\&. You can specify a separate destination directory with the \f3-d\fR option\&. +-.SH OPTIONS +-The compiler has a set of standard options that are supported on the current development environment\&. An additional set of nonstandard options are specific to the current virtual machine and compiler implementations and are subject to change in the future\&. Nonstandard options begin with the \f3-X\fR option\&. +-.TP 0.2i +-\(bu +-See also Cross-Compilation Options +-.TP 0.2i +-\(bu ++By default, the compiler puts each class file in the same directory as its source file\&. You can specify a separate destination directory with the ++\fB\-d\fR ++option\&. ++.SH "OPTIONS" ++.PP ++The compiler has a set of standard options that are supported on the current development environment\&. An additional set of nonstandard options are specific to the current virtual machine and compiler implementations and are subject to change in the future\&. Nonstandard options begin with the ++\fB\-X\fR ++option\&. ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++See also Cross\-Compilation Options ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + See also Nonstandard Options +-.SS STANDARD\ OPTIONS +-.TP +--A\fIkey\fR[\fI=value\fR] ++.RE ++.SS "Standard Options" ++.PP ++\-A\fIkey\fR[\fI=value\fR] ++.RS 4 ++Specifies options to pass to annotation processors\&. These options are not interpreted by ++\fBjavac\fR ++directly, but are made available for use by individual processors\&. The ++\fBkey\fR ++value should be one or more identifiers separated by a dot (\&.)\&. ++.RE ++.PP ++\-cp \fIpath\fR or \-classpath \fIpath\fR ++.RS 4 ++Specifies where to find user class files, and (optionally) annotation processors and source files\&. This class path overrides the user class path in the ++\fBCLASSPATH\fR ++environment variable\&. If neither ++\fBCLASSPATH\fR, ++\fB\-cp\fR ++nor ++\fB\-classpath\fR ++is specified, then the user ++\fIclass path\fR ++is the current directory\&. See Setting the Class Path \&. ++.sp ++If the ++\fB\-sourcepath\fR ++option is not specified, then the user class path is also searched for source files\&. ++.sp ++If the ++\fB\-processorpath\fR ++option is not specified, then the class path is also searched for annotation processors\&. ++.RE ++.PP ++\-Djava\&.ext\&.dirs=\fIdirectories\fR ++.RS 4 ++Overrides the location of installed extensions\&. ++.RE ++.PP ++\-Djava\&.endorsed\&.dirs=\fIdirectories\fR ++.RS 4 ++Overrides the location of the endorsed standards path\&. ++.RE ++.PP ++\-d \fIdirectory\fR ++.RS 4 ++Sets the destination directory for class files\&. The directory must already exist because ++\fBjavac\fR ++does not create it\&. If a class is part of a package, then ++\fBjavac\fR ++puts the class file in a subdirectory that reflects the package name and creates directories as needed\&. ++.sp ++If you specify ++\fB\-d\fR ++\fB/home/myclasses\fR ++and the class is called ++\fBcom\&.mypackage\&.MyClass\fR, then the class file is ++\fB/home/myclasses/com/mypackage/MyClass\&.class\fR\&. ++.sp ++If the ++\fI\-d\fR ++option is not specified, then ++\fBjavac\fR ++puts each class file in the same directory as the source file from which it was generated\&. ++.sp ++\fBNote:\fR ++The directory specified by the ++\fI\-d\fR ++option is not automatically added to your user class path\&. ++.RE ++.PP ++\-deprecation ++.RS 4 ++Shows a description of each use or override of a deprecated member or class\&. Without the ++\fB\-deprecation\fR ++option, ++\fBjavac\fR ++shows a summary of the source files that use or override deprecated members or classes\&. The ++\fB\-deprecation\fR ++option is shorthand for ++\fB\-Xlint:deprecation\fR\&. ++.RE ++.PP ++\-encoding \fIencoding\fR ++.RS 4 ++Sets the source file encoding name, such as EUC\-JP and UTF\-8\&. If the ++\fB\-encoding\fR ++option is not specified, then the platform default converter is used\&. ++.RE ++.PP ++\-endorseddirs \fIdirectories\fR ++.RS 4 ++Overrides the location of the endorsed standards path\&. ++.RE ++.PP ++\-extdirs \fIdirectories\fR ++.RS 4 ++Overrides the location of the ++\fBext\fR ++directory\&. The directories variable is a colon\-separated list of directories\&. Each JAR file in the specified directories is searched for class files\&. All JAR files found become part of the class path\&. ++.sp ++If you are cross\-compiling (compiling classes against bootstrap and extension classes of a different Java platform implementation), then this option specifies the directories that contain the extension classes\&. See Cross\-Compilation Options for more information\&. ++.RE ++.PP ++\-g ++.RS 4 ++Generates all debugging information, including local variables\&. By default, only line number and source file information is generated\&. ++.RE ++.PP ++\-g:none ++.RS 4 ++Does not generate any debugging information\&. ++.RE ++.PP ++\-g:[\fIkeyword list\fR] ++.RS 4 ++Generates only some kinds of debugging information, specified by a comma separated list of keywords\&. Valid keywords are: ++.PP ++source ++.RS 4 ++Source file debugging information\&. ++.RE ++.PP ++lines ++.RS 4 ++Line number debugging information\&. ++.RE ++.PP ++vars ++.RS 4 ++Local variable debugging information\&. ++.RE ++.RE ++.PP ++\-help ++.RS 4 ++Prints a synopsis of standard options\&. ++.RE ++.PP ++\-implicit:[\fIclass, none\fR] ++.RS 4 ++Controls the generation of class files for implicitly loaded source files\&. To automatically generate class files, use ++\fB\-implicit:class\fR\&. To suppress class file generation, use ++\fB\-implicit:none\fR\&. If this option is not specified, then the default is to automatically generate class files\&. In this case, the compiler issues a warning if any such class files are generated when also doing annotation processing\&. The warning is not issued when the ++\fB\-implicit\fR ++option is set explicitly\&. See Searching for Types\&. ++.RE ++.PP ++\-J\fIoption\fR ++.RS 4 ++Passes ++\fBoption\fR ++to the Java Virtual Machine (JVM), where option is one of the options described on the reference page for the Java launcher\&. For example, ++\fB\-J\-Xms48m\fR ++sets the startup memory to 48 MB\&. See ++java(1)\&. ++.sp ++\fBNote:\fR ++The ++\fICLASSPATH\fR, ++\fB\-classpath\fR, ++\fB\-bootclasspath\fR, and ++\fB\-extdirs\fR ++options do not specify the classes used to run ++\fBjavac\fR\&. Trying to customize the compiler implementation with these options and variables is risky and often does not accomplish what you want\&. If you must customize the complier implementation, then use the ++\fB\-J\fR ++option to pass options through to the underlying Java launcher\&. ++.RE ++.PP ++\-nowarn ++.RS 4 ++Disables warning messages\&. This option operates the same as the ++\fB\-Xlint:none\fR ++option\&. ++.RE ++.PP ++\-parameters ++.RS 4 ++Stores formal parameter names of constructors and methods in the generated class file so that the method ++\fBjava\&.lang\&.reflect\&.Executable\&.getParameters\fR ++from the Reflection API can retrieve them\&. ++.RE ++.PP ++\-proc: [\fInone\fR, \fIonly\fR] ++.RS 4 ++Controls whether annotation processing and compilation are done\&. ++\fB\-proc:none\fR ++means that compilation takes place without annotation processing\&. ++\fB\-proc:only\fR ++means that only annotation processing is done, without any subsequent compilation\&. ++.RE ++.PP ++\-processor \fIclass1\fR [,\fIclass2\fR,\fIclass3\fR\&.\&.\&.] ++.RS 4 ++Names of the annotation processors to run\&. This bypasses the default discovery process\&. ++.RE ++.PP ++\-processorpath \fIpath\fR ++.RS 4 ++Specifies where to find annotation processors\&. If this option is not used, then the class path is searched for processors\&. ++.RE ++.PP ++\-s \fIdir\fR ++.RS 4 ++Specifies the directory where to place the generated source files\&. The directory must already exist because ++\fBjavac\fR ++does not create it\&. If a class is part of a package, then the compiler puts the source file in a subdirectory that reflects the package name and creates directories as needed\&. ++.sp ++If you specify ++\fB\-s /home/mysrc\fR ++and the class is called ++\fBcom\&.mypackage\&.MyClass\fR, then the source file is put in ++\fB/home/mysrc/com/mypackage/MyClass\&.java\fR\&. ++.RE ++.PP ++\-source \fIrelease\fR ++.RS 4 ++Specifies the version of source code accepted\&. The following values for ++\fBrelease\fR ++are allowed: ++.PP ++1\&.3 ++.RS 4 ++The compiler does not support assertions, generics, or other language features introduced after Java SE 1\&.3\&. ++.RE ++.PP ++1\&.4 ++.RS 4 ++The compiler accepts code containing assertions, which were introduced in Java SE 1\&.4\&. ++.RE ++.PP ++1\&.5 ++.RS 4 ++The compiler accepts code containing generics and other language features introduced in Java SE 5\&. ++.RE ++.PP ++5 ++.RS 4 ++Synonym for 1\&.5\&. ++.RE ++.PP ++1\&.6 ++.RS 4 ++No language changes were introduced in Java SE 6\&. However, encoding errors in source files are now reported as errors instead of warnings as in earlier releases of Java Platform, Standard Edition\&. ++.RE ++.PP ++6 ++.RS 4 ++Synonym for 1\&.6\&. ++.RE ++.PP ++1\&.7 ++.RS 4 ++The compiler accepts code with features introduced in Java SE 7\&. ++.RE ++.PP ++7 ++.RS 4 ++Synonym for 1\&.7\&. ++.RE ++.PP ++1\&.8 ++.RS 4 ++This is the default value\&. The compiler accepts code with features introduced in Java SE 8\&. ++.RE ++.PP ++8 ++.RS 4 ++Synonym for 1\&.8\&. ++.RE ++.RE ++.PP ++\-sourcepath \fIsourcepath\fR ++.RS 4 ++Specifies the source code path to search for class or interface definitions\&. As with the user class path, source path entries are separated by colons (:) on Oracle Solaris and semicolons on Windows and can be directories, JAR archives, or ZIP archives\&. If packages are used, then the local path name within the directory or archive must reflect the package name\&. ++.sp ++\fBNote:\fR ++Classes found through the class path might be recompiled when their source files are also found\&. See Searching for Types\&. ++.RE ++.PP ++\-verbose ++.RS 4 ++Uses verbose output, which includes information about each class loaded and each source file compiled\&. ++.RE ++.PP ++\-version ++.RS 4 ++Prints release information\&. ++.RE ++.PP ++\-werror ++.RS 4 ++Terminates compilation when warnings occur\&. ++.RE ++.PP ++\-X ++.RS 4 ++Displays information about nonstandard options and exits\&. ++.RE ++.SS "Cross\-Compilation Options" ++.PP ++By default, classes are compiled against the bootstrap and extension classes of the platform that ++\fBjavac\fR ++shipped with\&. But ++\fBjavac\fR ++also supports cross\-compiling, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation\&. It is important to use the ++\fB\-bootclasspath\fR ++and ++\fB\-extdirs\fR ++options when cross\-compiling\&. ++.PP ++\-target \fIversion\fR ++.RS 4 ++Generates class files that target a specified release of the virtual machine\&. Class files will run on the specified target and on later releases, but not on earlier releases of the JVM\&. Valid targets are 1\&.1, 1\&.2, 1\&.3, 1\&.4, 1\&.5 (also 5), 1\&.6 (also 6), 1\&.7 (also 7), and 1\&.8 (also 8)\&. ++.sp ++The default for the ++\fB\-target\fR ++option depends on the value of the ++\fB\-source\fR ++option: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is not specified, then the value of the ++\fB\-target\fR ++option is 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.2, then the value of the ++\fB\-target\fR ++option is 1\&.4 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.3, then the value of the ++\fB\-target\fR ++option is 1\&.4 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.5, then the value of the ++\fB\-target\fR ++option is 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.6, then the value of the ++\fB\-target\fR ++is option 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.7, then the value of the ++\fB\-target\fR ++is option 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++For all other values of the ++\fB\-source\fR ++option, the value of the ++\fB\-target\fR ++option is the value of the ++\fB\-source\fR ++option\&. ++.RE ++.RE ++.PP ++\-bootclasspath \fIbootclasspath\fR ++.RS 4 ++Cross\-compiles against the specified set of boot classes\&. As with the user class path, boot class path entries are separated by colons (:) and can be directories, JAR archives, or ZIP archives\&. ++.RE ++.SS "Compact Profile Option" ++.PP ++Beginning with JDK 8, the ++\fBjavac\fR ++compiler supports compact profiles\&. With compact profiles, applications that do not require the entire Java platform can be deployed and run with a smaller footprint\&. The compact profiles feature could be used to shorten the download time for applications from app stores\&. This feature makes for more compact deployment of Java applications that bundle the JRE\&. This feature is also useful in small devices\&. ++.PP ++The supported profile values are ++\fBcompact1\fR, ++\fBcompact2\fR, and ++\fBcompact3\fR\&. These are additive layers\&. Each higher\-numbered compact profile contains all of the APIs in profiles with smaller number names\&. ++.PP ++\-profile ++.RS 4 ++When using compact profiles, this option specifies the profile name when compiling\&. For example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-profile compact1 Hello\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++javac does not compile source code that uses any Java SE APIs that is not in the specified profile\&. Here is an example of the error message that results from attempting to compile such source code: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBcd jdk1\&.8\&.0/bin\fR ++\fB\&./javac \-profile compact1 Paint\&.java\fR ++\fBPaint\&.java:5: error: Applet is not available in profile \*(Aqcompact1\*(Aq\fR ++\fBimport java\&.applet\&.Applet;\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++In this example, you can correct the error by modifying the source to not use the ++\fBApplet\fR ++class\&. You could also correct the error by compiling without the \-profile option\&. Then the compilation would be run against the full set of Java SE APIs\&. (None of the compact profiles include the ++\fBApplet\fR ++class\&.) ++.sp ++An alternative way to compile with compact profiles is to use the ++\fB\-bootclasspath\fR ++option to specify a path to an ++\fBrt\&.jar\fR ++file that specifies a profile\*(Aqs image\&. Using the ++\fB\-profile\fR ++option instead does not require a profile image to be present on the system at compile time\&. This is useful when cross\-compiling\&. ++.RE ++.SS "Nonstandard Options" ++.PP ++\-Xbootclasspath/p:\fIpath\fR ++.RS 4 ++Adds a suffix to the bootstrap class path\&. ++.RE ++.PP ++\-Xbootclasspath/a:\fIpath\fR ++.RS 4 ++Adds a prefix to the bootstrap class path\&. ++.RE ++.PP ++\-Xbootclasspath/:\fIpath\fR ++.RS 4 ++Overrides the location of the bootstrap class files\&. ++.RE ++.PP ++\-Xdoclint:[\-]\fIgroup\fR [\fI/access\fR] ++.RS 4 ++Enables or disables specific groups of checks, where ++\fIgroup\fR ++is one of the following values: ++\fBaccessibility\fR, ++\fBsyntax\fR, ++\fBreference\fR, ++\fBhtml\fR ++or ++\fBmissing\fR\&. For more information about these groups of checks see the ++\fB\-Xdoclint\fR ++option of the ++\fBjavadoc\fR ++command\&. The ++\fB\-Xdoclint\fR ++option is disabled by default in the ++\fBjavac\fR ++command\&. ++.sp ++The variable ++\fIaccess\fR ++specifies the minimum visibility level of classes and members that the ++\fB\-Xdoclint\fR ++option checks\&. It can have one of the following values (in order of most to least visible) : ++\fBpublic\fR, ++\fBprotected\fR, ++\fBpackage\fR ++and ++\fBprivate\fR\&. For example, the following option checks classes and members (with all groups of checks) that have the access level protected and higher (which includes protected, package and public): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xdoclint:all/protected\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following option enables all groups of checks for all access levels, except it will not check for HTML errors for classes and members that have access level package and higher (which includes package and public): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xdoclint:all,\-html/package\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-Xdoclint:none ++.RS 4 ++Disables all groups of checks\&. ++.RE ++.PP ++\-Xdoclint:all[\fI/access\fR] ++.RS 4 ++Enables all groups of checks\&. ++.RE ++.PP ++\-Xlint ++.RS 4 ++Enables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. ++.RE ++.PP ++\-Xlint:all ++.RS 4 ++Enables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. ++.RE ++.PP ++\-Xlint:none ++.RS 4 ++Disables all warnings\&. ++.RE ++.PP ++\-Xlint:\fIname\fR ++.RS 4 ++Disables warning name\&. See Enable or Disable Warnings with the \-Xlint Option for a list of warnings you can disable with this option\&. ++.RE ++.PP ++\-Xlint:\fI\-name\fR ++.RS 4 ++Disables warning name\&. See Enable or Disable Warnings with the \-Xlint Option with the ++\fB\-Xlint\fR ++option to get a list of warnings that you can disable with this option\&. ++.RE ++.PP ++\-Xmaxerrs \fInumber\fR ++.RS 4 ++Sets the maximum number of errors to print\&. ++.RE ++.PP ++\-Xmaxwarns \fInumber\fR ++.RS 4 ++Sets the maximum number of warnings to print\&. ++.RE ++.PP ++\-Xstdout \fIfilename\fR ++.RS 4 ++Sends compiler messages to the named file\&. By default, compiler messages go to ++\fBSystem\&.err\fR\&. ++.RE ++.PP ++\-Xprefer:[\fInewer,source\fR] ++.RS 4 ++Specifies which file to read when both a source file and class file are found for a type\&. (See Searching for Types)\&. If the ++\fB\-Xprefer:newer\fR ++option is used, then it reads the newer of the source or class file for a type (default)\&. If the ++\fB\-Xprefer:source\fR ++option is used, then it reads the source file\&. Use \-\fBXprefer:source\fR ++when you want to be sure that any annotation processors can access annotations declared with a retention policy of ++\fBSOURCE\fR\&. ++.RE ++.PP ++\-Xpkginfo:[\fIalways\fR,\fIlegacy\fR,\fInonempty\fR] ++.RS 4 ++Control whether javac generates ++\fBpackage\-info\&.class\fR ++files from package\-info\&.java files\&. Possible mode arguments for this option include the following\&. ++.PP ++always ++.RS 4 ++Always generate a ++\fBpackage\-info\&.class\fR ++file for every ++\fBpackage\-info\&.java\fR ++file\&. This option may be useful if you use a build system such as Ant, which checks that each ++\fB\&.java\fR ++file has a corresponding ++\fB\&.class\fR ++file\&. ++.RE ++.PP ++legacy ++.RS 4 ++Generate a ++\fBpackage\-info\&.class\fR ++file only if package\-info\&.java contains annotations\&. Don\*(Aqt generate a ++\fBpackage\-info\&.class\fR ++file if package\-info\&.java only contains comments\&. ++.sp ++\fBNote:\fR ++A ++\fBpackage\-info\&.class\fR ++file might be generated but be empty if all the annotations in the package\-info\&.java file have ++\fBRetentionPolicy\&.SOURCE\fR\&. ++.RE ++.PP ++nonempty ++.RS 4 ++Generate a ++\fBpackage\-info\&.class\fR ++file only if package\-info\&.java contains annotations with ++\fBRetentionPolicy\&.CLASS\fR ++or ++\fBRetentionPolicy\&.RUNTIME\fR\&. ++.RE ++.RE ++.PP ++\-Xprint ++.RS 4 ++Prints a textual representation of specified types for debugging purposes\&. Perform neither annotation processing nor compilation\&. The format of the output could change\&. ++.RE ++.PP ++\-XprintProcessorInfo ++.RS 4 ++Prints information about which annotations a processor is asked to process\&. ++.RE ++.PP ++\-XprintRounds ++.RS 4 ++Prints information about initial and subsequent annotation processing rounds\&. ++.RE ++.SH "ENABLE OR DISABLE WARNINGS WITH THE -XLINT OPTION" ++.PP ++Enable warning ++\fIname\fR ++with the ++\fB\-Xlint:name\fR ++option, where ++\fBname\fR ++is one of the following warning names\&. Note that you can disable a warning with the ++\fB\-Xlint:\-name:\fR ++option\&. ++.PP ++cast ++.RS 4 ++Warns about unnecessary and redundant casts, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBString s = (String) "Hello!"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++classfile ++.RS 4 ++Warns about issues related to class file contents\&. ++.RE ++.PP ++deprecation ++.RS 4 ++Warns about the use of deprecated items, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava\&.util\&.Date myDate = new java\&.util\&.Date();\fR ++\fBint currentDay = myDate\&.getDay();\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The method ++\fBjava\&.util\&.Date\&.getDay\fR ++has been deprecated since JDK 1\&.1 ++.RE ++.PP ++dep\-ann ++.RS 4 ++Warns about items that are documented with an ++\fB@deprecated\fR ++Javadoc comment, but do not have a ++\fB@Deprecated\fR ++annotation, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * @deprecated As of Java SE 7, replaced by {@link #newMethod()}\fR ++\fB */\fR ++\fBpublic static void deprecatedMethood() { }\fR ++\fBpublic static void newMethod() { }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++divzero ++.RS 4 ++Warns about division by the constant integer 0, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBint divideByZero = 42 / 0;\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++empty ++.RS 4 ++Warns about empty statements after ++\fBif \fRstatements, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBclass E {\fR ++\fB void m() {\fR ++\fB if (true) ;\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++fallthrough ++.RS 4 ++Checks the switch blocks for fall\-through cases and provides a warning message for any that are found\&. Fall\-through cases are cases in a switch block, other than the last case in the block, whose code does not include a break statement, allowing code execution to fall through from that case to the next case\&. For example, the code following the case 1 label in this switch block does not end with a break statement: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBswitch (x) {\fR ++\fBcase 1:\fR ++\fB System\&.out\&.println("1");\fR ++\fB // No break statement here\&.\fR ++\fBcase 2:\fR ++\fB System\&.out\&.println("2");\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If the ++\fB\-Xlint:fallthrough\fR ++option was used when compiling this code, then the compiler emits a warning about possible fall\-through into case, with the line number of the case in question\&. ++.RE ++.PP ++finally ++.RS 4 ++Warns about ++\fBfinally\fR ++clauses that cannot complete normally, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic static int m() {\fR ++\fB try {\fR ++\fB throw new NullPointerException();\fR ++\fB } catch (NullPointerException(); {\fR ++\fB System\&.err\&.println("Caught NullPointerException\&.");\fR ++\fB return 1;\fR ++\fB } finally {\fR ++\fB return 0;\fR ++\fB }\fR ++\fB }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates a warning for the ++\fBfinally\fR ++block in this example\&. When the ++\fBint\fR ++method is called, it returns a value of 0\&. A ++\fBfinally\fR ++block executes when the ++\fBtry\fR ++block exits\&. In this example, when control is transferred to the ++\fBcatch\fR ++block, the ++\fBint\fR ++method exits\&. However, the ++\fBfinally\fR ++block must execute, so it is executed, even though control was transferred outside the method\&. ++.RE ++.PP ++options ++.RS 4 ++Warns about issues that related to the use of command\-line options\&. See Cross\-Compilation Options\&. ++.RE ++.PP ++overrides ++.RS 4 ++Warns about issues regarding method overrides\&. For example, consider the following two classes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic class ClassWithVarargsMethod {\fR ++\fB void varargsMethod(String\&.\&.\&. s) { }\fR ++\fB}\fR ++ ++\fBpublic class ClassWithOverridingMethod extends ClassWithVarargsMethod {\fR ++\fB @Override\fR ++\fB void varargsMethod(String[] s) { }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates a warning similar to the following:\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [override] varargsMethod(String[]) in ClassWithOverridingMethod \fR ++\fBoverrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding\fR ++\fBmethod is missing \*(Aq\&.\&.\&.\*(Aq\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++When the compiler encounters a ++\fBvarargs\fR ++method, it translates the ++\fBvarargs\fR ++formal parameter into an array\&. In the method ++\fBClassWithVarargsMethod\&.varargsMethod\fR, the compiler translates the ++\fBvarargs\fR ++formal parameter ++\fBString\&.\&.\&. s\fR ++to the formal parameter ++\fBString[] s\fR, an array, which matches the formal parameter of the method ++\fBClassWithOverridingMethod\&.varargsMethod\fR\&. Consequently, this example compiles\&. ++.RE ++.PP ++path ++.RS 4 ++Warns about invalid path elements and nonexistent path directories on the command line (with regard to the class path, the source path, and other paths)\&. Such warnings cannot be suppressed with the ++\fB@SuppressWarnings\fR ++annotation, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-Xlint:path \-classpath /nonexistentpath Example\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++processing ++.RS 4 ++Warn about issues regarding annotation processing\&. The compiler generates this warning when you have a class that has an annotation, and you use an annotation processor that cannot handle that type of exception\&. For example, the following is a simple annotation processor: ++.sp ++\fBSource file AnnocProc\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBimport java\&.util\&.*;\fR ++\fBimport javax\&.annotation\&.processing\&.*;\fR ++\fBimport javax\&.lang\&.model\&.*;\fR ++\fBimport\&.javaz\&.lang\&.model\&.element\&.*;\fR ++ ++\fB@SupportedAnnotationTypes("NotAnno")\fR ++\fBpublic class AnnoProc extends AbstractProcessor {\fR ++\fB public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv){\fR ++\fB return true;\fR ++\fB }\fR ++ ++\fB public SourceVersion getSupportedSourceVersion() {\fR ++\fB return SourceVersion\&.latest();\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fBSource file AnnosWithoutProcessors\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB@interface Anno { }\fR ++\fB \fR ++\fB@Anno\fR ++\fBclass AnnosWithoutProcessors { }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following commands compile the annotation processor ++\fBAnnoProc\fR, then run this annotation processor against the source file ++\fBAnnosWithoutProcessors\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac AnnoProc\&.java\fR ++\fBjavac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++When the compiler runs the annotation processor against the source file ++\fBAnnosWithoutProcessors\&.java\fR, it generates the following warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [processing] No processor claimed any of these annotations: Anno\fR ++\fB \fR ++.fi ++.if n \{\ ++.RE ++.\} ++To resolve this issue, you can rename the annotation defined and used in the class ++\fBAnnosWithoutProcessors\fR ++from ++\fBAnno\fR ++to ++\fBNotAnno\fR\&. ++.RE ++.PP ++rawtypes ++.RS 4 ++Warns about unchecked operations on raw types\&. The following statement generates a ++\fBrawtypes\fR ++warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBvoid countElements(List l) { \&.\&.\&. }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example does not generate a ++\fBrawtypes\fR ++warning ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBvoid countElements(List<?> l) { \&.\&.\&. }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fBList\fR ++is a raw type\&. However, ++\fBList<?>\fR ++is an unbounded wildcard parameterized type\&. Because ++\fBList\fR ++is a parameterized interface, always specify its type argument\&. In this example, the ++\fBList\fR ++formal argument is specified with an unbounded wildcard (\fB?\fR) as its formal type parameter, which means that the ++\fBcountElements\fR ++method can accept any instantiation of the ++\fBList\fR ++interface\&. ++.RE ++.PP ++Serial ++.RS 4 ++Warns about missing ++\fBserialVersionUID\fR ++definitions on serializable classes, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic class PersistentTime implements Serializable\fR ++\fB{\fR ++\fB private Date time;\fR ++\fB \fR ++\fB public PersistentTime() {\fR ++\fB time = Calendar\&.getInstance()\&.getTime();\fR ++\fB }\fR ++\fB \fR ++\fB public Date getTime() {\fR ++\fB return time;\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates the following warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [serial] serializable class PersistentTime has no definition of\fR ++\fBserialVersionUID\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If a serializable class does not explicitly declare a field named ++\fBserialVersionUID\fR, then the serialization runtime environment calculates a default ++\fBserialVersionUID\fR ++value for that class based on various aspects of the class, as described in the Java Object Serialization Specification\&. However, it is strongly recommended that all serializable classes explicitly declare ++\fBserialVersionUID\fR ++values because the default process of computing ++\fBserialVersionUID\fR ++vales is highly sensitive to class details that can vary depending on compiler implementations, and as a result, might cause an unexpected ++\fBInvalidClassExceptions\fR ++during deserialization\&. To guarantee a consistent ++\fBserialVersionUID\fR ++value across different Java compiler implementations, a serializable class must declare an explicit ++\fBserialVersionUID\fR ++value\&. ++.RE ++.PP ++static ++.RS 4 ++Warns about issues relating to the use of statics, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBclass XLintStatic {\fR ++\fB static void m1() { }\fR ++\fB void m2() { this\&.m1(); }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates the following warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [static] static method should be qualified by type name, \fR ++\fBXLintStatic, instead of by an expression\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++To resolve this issue, you can call the ++\fBstatic\fR ++method ++\fBm1\fR ++as follows: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBXLintStatic\&.m1();\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Alternately, you can remove the ++\fBstatic\fR ++keyword from the declaration of the method ++\fBm1\fR\&. ++.RE ++.PP ++try ++.RS 4 ++Warns about issues relating to use of ++\fBtry\fR ++blocks, including try\-with\-resources statements\&. For example, a warning is generated for the following statement because the resource ++\fBac\fR ++declared in the ++\fBtry\fR ++block is not used: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBtry ( AutoCloseable ac = getResource() ) { // do nothing}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++unchecked ++.RS 4 ++Gives more detail for unchecked conversion warnings that are mandated by the Java Language Specification, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBList l = new ArrayList<Number>();\fR ++\fBList<String> ls = l; // unchecked warning\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++During type erasure, the types ++\fBArrayList<Number>\fR ++and ++\fBList<String>\fR ++become ++\fBArrayList\fR ++and ++\fBList\fR, respectively\&. ++.sp ++The ++\fBls\fR ++command has the parameterized type ++\fBList<String>\fR\&. When the ++\fBList\fR ++referenced by ++\fBl\fR ++is assigned to ++\fBls\fR, the compiler generates an unchecked warning\&. At compile time, the compiler and JVM cannot determine whether ++\fBl\fR ++refers to a ++\fBList<String>\fR ++type\&. In this case, ++\fBl\fR ++does not refer to a ++\fBList<String>\fR ++type\&. As a result, heap pollution occurs\&. ++.sp ++A heap pollution situation occurs when the ++\fBList\fR ++object ++\fBl\fR, whose static type is ++\fBList<Number>\fR, is assigned to another ++\fBList\fR ++object, ++\fBls\fR, that has a different static type, ++\fBList<String>\fR\&. However, the compiler still allows this assignment\&. It must allow this assignment to preserve backward compatibility with releases of Java SE that do not support generics\&. Because of type erasure, ++\fBList<Number>\fR ++and ++\fBList<String>\fR ++both become ++\fBList\fR\&. Consequently, the compiler allows the assignment of the object ++\fBl\fR\fB,\fR ++which has a raw type of ++\fBList\fR, to the object ++\fBls\fR\&. ++.RE ++.PP ++varargs ++.RS 4 ++Warns about unsafe usages of variable arguments (\fBvarargs\fR) methods, in particular, those that contain non\-reifiable arguments, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic class ArrayBuilder {\fR ++\fB public static <T> void addToList (List<T> listArg, T\&.\&.\&. elements) {\fR ++\fB for (T x : elements) {\fR ++\fB listArg\&.add(x);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fBNote:\fR ++A non\-reifiable type is a type whose type information is not fully available at runtime\&. ++.sp ++The compiler generates the following warning for the definition of the method ++\fBArrayBuilder\&.addToList\fR ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [varargs] Possible heap pollution from parameterized vararg type T\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++When the compiler encounters a varargs method, it translates the ++\fBvarargs\fR ++formal parameter into an array\&. However, the Java programming language does not permit the creation of arrays of parameterized types\&. In the method ++\fBArrayBuilder\&.addToList\fR, the compiler translates the ++\fBvarargs\fR ++formal parameter ++\fBT\&.\&.\&.\fR ++elements to the formal parameter ++\fBT[]\fR ++elements, an array\&. However, because of type erasure, the compiler converts the ++\fBvarargs\fR ++formal parameter to ++\fBObject[]\fR ++elements\&. Consequently, there is a possibility of heap pollution\&. ++.RE ++.SH "COMMAND-LINE ARGUMENT FILES" ++.PP ++To shorten or simplify the ++\fBjavac\fR ++command, you can specify one or more files that contain arguments to the ++\fBjavac\fR ++command (except ++\fB\-J\fR ++options)\&. This enables you to create ++\fBjavac\fR ++commands of any length on any operating system\&. ++.PP ++An argument file can include ++\fBjavac\fR ++options and source file names in any combination\&. The arguments within a file can be separated by spaces or new line characters\&. If a file name contains embedded spaces, then put the whole file name in double quotation marks\&. ++.PP ++File Names within an argument file are relative to the current directory, not the location of the argument file\&. Wild cards (*) are not allowed in these lists (such as for specifying ++\fB*\&.java\fR)\&. Use of the at sign (@) to recursively interpret files is not supported\&. The ++\fB\-J\fR ++options are not supported because they are passed to the launcher, which does not support argument files\&. ++.PP ++When executing the ++\fBjavac\fR ++command, pass in the path and name of each argument file with the at sign (@) leading character\&. When the ++\fBjavac\fR ++command encounters an argument beginning with the at sign (@), it expands the contents of that file into the argument list\&. ++.PP ++\fBExample 1\fR + .br +-Specifies options to pass to annotation processors\&. These options are not interpreted by \f3javac\fR directly, but are made available for use by individual processors\&. The \f3key\fR value should be one or more identifiers separated by a dot (\&.)\&. +-.TP +--cp \fIpath\fR or -classpath \fIpath\fR ++Single Argument File ++.RS 4 ++You could use a single argument file named ++\fBargfile\fR ++to hold all ++\fBjavac\fR ++arguments: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac @argfile\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This argument file could contain the contents of both files shown in Example 2 ++.RE ++.PP ++\fBExample 2\fR + .br +-Specifies where to find user class files, and (optionally) annotation processors and source files\&. This class path overrides the user class path in the \f3CLASSPATH\fR environment variable\&. If neither \f3CLASSPATH\fR, \f3-cp\fR nor \f3-classpath\fR is specified, then the user \fIclass path\fR is the current directory\&. See Setting the Class Path\&. +- +-If the \f3-sourcepath\fR option is not specified, then the user class path is also searched for source files\&. +- +-If the \f3-processorpath\fR option is not specified, then the class path is also searched for annotation processors\&. +-.TP +--Djava\&.ext\&.dirs=\fIdirectories\fR ++Two Argument Files ++.RS 4 ++You can create two argument files: one for the ++\fBjavac\fR ++options and the other for the source file names\&. Note that the following lists have no line\-continuation characters\&. ++.sp ++Create a file named options that contains the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-d classes\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-g\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-sourcepath /java/pubs/ws/1\&.3/src/share/classes\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Create a file named classes that contains the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBMyClass1\&.java\fR ++\fBMyClass2\&.java\fR ++\fBMyClass3\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Then, run the ++\fBjavac\fR ++command as follows: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac @options @classes\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\fBExample 3\fR + .br +-Overrides the location of installed extensions\&. +-.TP +--Djava\&.endorsed\&.dirs=\fIdirectories\fR +-.br +-Overrides the location of the endorsed standards path\&. +-.TP +--d \fIdirectory\fR +-.br +-Sets the destination directory for class files\&. The directory must already exist because \f3javac\fR does not create it\&. If a class is part of a package, then \f3javac\fR puts the class file in a subdirectory that reflects the package name and creates directories as needed\&. +- +-If you specify \f3-d\fR\f3/home/myclasses\fR and the class is called \f3com\&.mypackage\&.MyClass\fR, then the class file is \f3/home/myclasses/com/mypackage/MyClass\&.class\fR\&. +- +-If the \fI-d\fR option is not specified, then \f3javac\fR puts each class file in the same directory as the source file from which it was generated\&. +- +-\fINote:\fR The directory specified by the \fI-d\fR option is not automatically added to your user class path\&. +-.TP +--deprecation +-.br +-Shows a description of each use or override of a deprecated member or class\&. Without the \f3-deprecation\fR option, \f3javac\fR shows a summary of the source files that use or override deprecated members or classes\&. The \f3-deprecation\fR option is shorthand for \f3-Xlint:deprecation\fR\&. +-.TP +--encoding \fIencoding\fR +-.br +-Sets the source file encoding name, such as EUC-JP and UTF-8\&. If the \f3-encoding\fR option is not specified, then the platform default converter is used\&. +-.TP +--endorseddirs \fIdirectories\fR +-.br +-Overrides the location of the endorsed standards path\&. +-.TP +--extdirs \fIdirectories\fR +-.br +-Overrides the location of the \f3ext\fR directory\&. The directories variable is a colon-separated list of directories\&. Each JAR file in the specified directories is searched for class files\&. All JAR files found become part of the class path\&. +- +-If you are cross-compiling (compiling classes against bootstrap and extension classes of a different Java platform implementation), then this option specifies the directories that contain the extension classes\&. See Cross-Compilation Options for more information\&. +-.TP +--g +-.br +-Generates all debugging information, including local variables\&. By default, only line number and source file information is generated\&. +-.TP +--g:none +-.br +-Does not generate any debugging information\&. +-.TP +--g:[\fIkeyword list\fR] +-.br +-Generates only some kinds of debugging information, specified by a comma separated list of keywords\&. Valid keywords are: +-.RS +-.TP +-source +-Source file debugging information\&. +-.TP +-lines +-Line number debugging information\&. +-.TP +-vars +-Local variable debugging information\&. +-.RE +- +-.TP +--help +-.br +-Prints a synopsis of standard options\&. +-.TP +--implicit:[\fIclass, none\fR] +-.br +-Controls the generation of class files for implicitly loaded source files\&. To automatically generate class files, use \f3-implicit:class\fR\&. To suppress class file generation, use \f3-implicit:none\fR\&. If this option is not specified, then the default is to automatically generate class files\&. In this case, the compiler issues a warning if any such class files are generated when also doing annotation processing\&. The warning is not issued when the \f3-implicit\fR option is set explicitly\&. See Searching for Types\&. +-.TP +--J\fIoption\fR +-.br +-Passes \f3option\fR to the Java Virtual Machine (JVM), where option is one of the options described on the reference page for the Java launcher\&. For example, \f3-J-Xms48m\fR sets the startup memory to 48 MB\&. See java(1)\&. +- +-\fINote:\fR The \fICLASSPATH\fR, \f3-classpath\fR, \f3-bootclasspath\fR, and \f3-extdirs\fR options do not specify the classes used to run \f3javac\fR\&. Trying to customize the compiler implementation with these options and variables is risky and often does not accomplish what you want\&. If you must customize the complier implementation, then use the \f3-J\fR option to pass options through to the underlying \f3\fRJava launcher\&. +-.TP +--nowarn +-.br +-Disables warning messages\&. This option operates the same as the \f3-Xlint:none\fR option\&. +-.TP +--parameters +-.br +-Stores formal parameter names of constructors and methods in the generated class file so that the method \f3java\&.lang\&.reflect\&.Executable\&.getParameters\fR from the Reflection API can retrieve them\&. +-.TP +--proc: [\fInone\fR, \fIonly\fR] +-.br +-Controls whether annotation processing and compilation are done\&. \f3-proc:none\fR means that compilation takes place without annotation processing\&. \f3-proc:only\fR means that only annotation processing is done, without any subsequent compilation\&. +-.TP +--processor \fIclass1\fR [,\fIclass2\fR,\fIclass3\fR\&.\&.\&.] +-.br +-Names of the annotation processors to run\&. This bypasses the default discovery process\&. +-.TP +--processorpath \fIpath\fR +-.br +-Specifies where to find annotation processors\&. If this option is not used, then the class path is searched for processors\&. +-.TP +--s \fIdir\fR +-.br +-Specifies the directory where to place the generated source files\&. The directory must already exist because \f3javac\fR does not create it\&. If a class is part of a package, then the compiler puts the source file in a subdirectory that reflects the package name and creates directories as needed\&. +- +-If you specify \f3-s /home/mysrc\fR and the class is called \f3com\&.mypackage\&.MyClass\fR, then the source file is put in \f3/home/mysrc/com/mypackage/MyClass\&.java\fR\&. +-.TP +--source \fIrelease\fR +-.br +-Specifies the version of source code accepted\&. The following values for \f3release\fR are allowed: +-.RS +-.TP +-1\&.3 +-The compiler does not support assertions, generics, or other language features introduced after Java SE 1\&.3\&. +-.TP +-1\&.4 +-The compiler accepts code containing assertions, which were introduced in Java SE 1\&.4\&. +-.TP +-1\&.5 +-The compiler accepts code containing generics and other language features introduced in Java SE 5\&. +-.TP +-5 +-Synonym for 1\&.5\&. +-.TP +-1\&.6 +-No language changes were introduced in Java SE 6\&. However, encoding errors in source files are now reported as errors instead of warnings as in earlier releases of Java Platform, Standard Edition\&. +-.TP +-6 +-Synonym for 1\&.6\&. +-.TP +-1\&.7 +-This is the default value\&. The compiler accepts code with features introduced in Java SE 7\&. +-.TP +-7 +-Synonym for 1\&.7\&. +-.RE +- +-.TP +--sourcepath \fIsourcepath\fR +-.br +-Specifies the source code path to search for class or interface definitions\&. As with the user class path, source path entries are separated by colons (:) on Oracle Solaris and semicolons on Windows and can be directories, JAR archives, or ZIP archives\&. If packages are used, then the local path name within the directory or archive must reflect the package name\&. +- +-\fINote:\fR Classes found through the class path might be recompiled when their source files are also found\&. See Searching for Types\&. +-.TP +--verbose +-.br +-Uses verbose output, which includes information about each class loaded and each source file compiled\&. +-.TP +--version +-.br +-Prints release information\&. +-.TP +--werror +-.br +-Terminates compilation when warnings occur\&. +-.TP +--X +-.br +-Displays information about nonstandard options and exits\&. +-.SS CROSS-COMPILATION\ OPTIONS +-By default, classes are compiled against the bootstrap and extension classes of the platform that \f3javac\fR shipped with\&. But \f3javac\fR also supports cross-compiling, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation\&. It is important to use the \f3-bootclasspath\fR and \f3-extdirs\fR options when cross-compiling\&. +-.TP +--target \fIversion\fR +-.br +-Generates class files that target a specified release of the virtual machine\&. Class files will run on the specified target and on later releases, but not on earlier releases of the JVM\&. Valid targets are 1\&.1, 1\&.2, 1\&.3, 1\&.4, 1\&.5 (also 5), 1\&.6 (also 6), and 1\&.7 (also 7)\&. +- +-The default for the \f3-target\fR option depends on the value of the \f3-source\fR option: +-.RS +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is not specified, then the value of the \f3-target\fR option is 1\&.7 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.2, then the value of the \f3-target\fR option is 1\&.4 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.3, then the value of the \f3-target\fR option is 1\&.4 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.5, then the value of the \f3-target\fR option is 1\&.7 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.6, then the value of the \f3-target\fR is option 1\&.7 +-.TP 0.2i +-\(bu +-For all other values of the \f3-source\fR option, the value of the \f3-target\fR option is the value of the \f3-source\fR option\&. +-.RE +- +-.TP +--bootclasspath \fIbootclasspath\fR +-.br +-Cross-compiles against the specified set of boot classes\&. As with the user class path, boot class path entries are separated by colons (:) and can be directories, JAR archives, or ZIP archives\&. +-.SS COMPACT\ PROFILE\ OPTION +-Beginning with JDK 8, the \f3javac\fR compiler supports compact profiles\&. With compact profiles, applications that do not require the entire Java platform can be deployed and run with a smaller footprint\&. The compact profiles feature could be used to shorten the download time for applications from app stores\&. This feature makes for more compact deployment of Java applications that bundle the JRE\&. This feature is also useful in small devices\&. ++Argument Files with Paths ++.RS 4 ++The argument files can have paths, but any file names inside the files are relative to the current working directory (not ++\fBpath1\fR ++or ++\fBpath2\fR): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac @path1/options @path2/classes\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.SH "ANNOTATION PROCESSING" + .PP +-The supported profile values are \f3compact1\fR, \f3compact2\fR, and \f3compact3\fR\&. These are additive layers\&. Each higher-numbered compact profile contains all of the APIs in profiles with smaller number names\&. +-.TP +--profile +-.br +-When using compact profiles, this option specifies the profile name when compiling\&. For example: +-.sp +-.nf +-\f3javac \-profile compact1 Hello\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-javac does not compile source code that uses any Java SE APIs that is not in the specified profile\&. Here is an example of the error message that results from attempting to compile such source code: +-.sp +-.nf +-\f3cd jdk1\&.8\&.0/bin\fP +-.fi +-.nf +-\f3\&./javac \-profile compact1 Paint\&.java\fP +-.fi +-.nf +-\f3Paint\&.java:5: error: Applet is not available in profile \&'compact1\&'\fP +-.fi +-.nf +-\f3import java\&.applet\&.Applet;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-In this example, you can correct the error by modifying the source to not use the \f3Applet\fR class\&. You could also correct the error by compiling without the -profile option\&. Then the compilation would be run against the full set of Java SE APIs\&. (None of the compact profiles include the \f3Applet\fR class\&.) +- +-An alternative way to compile with compact profiles is to use the \f3-bootclasspath\fR option to specify a path to an \f3rt\&.jar\fR file that specifies a profile\&'s image\&. Using the \f3-profile\fR option instead does not require a profile image to be present on the system at compile time\&. This is useful when cross-compiling\&. +-.SS NONSTANDARD\ OPTIONS +-.TP +--Xbootclasspath/p:\fIpath\fR +-.br +-Adds a suffix to the bootstrap class path\&. +-.TP +--Xbootclasspath/a:\fIpath\fR +-.br +-Adds a prefix to the bootstrap class path\&. +-.TP +--Xbootclasspath/:\fIpath\fR +-.br +-Overrides the location of the bootstrap class files\&. +-.TP +--Xdoclint:[-]\fIgroup\fR [\fI/access\fR] +-.br +-Enables or disables specific groups of checks, where \fIgroup\fR is one of the following values: \f3accessibility\fR, \f3syntax\fR, \f3reference\fR, \f3html\fR or \f3missing\fR\&. For more information about these groups of checks see the \f3-Xdoclint\fR option of the \f3javadoc\fR command\&. The \f3-Xdoclint\fR option is disabled by default in the \f3javac\fR command\&. +- +-The variable \fIaccess\fR specifies the minimum visibility level of classes and members that the \f3-Xdoclint\fR option checks\&. It can have one of the following values (in order of most to least visible) : \f3public\fR, \f3protected\fR, \f3package\fR and \f3private\fR\&. For example, the following option checks classes and members (with all groups of checks) that have the access level protected and higher (which includes protected, package and public): +-.sp +-.nf +-\f3\-Xdoclint:all/protected\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following option enables all groups of checks for all access levels, except it will not check for HTML errors for classes and members that have access level package and higher (which includes package and public): +-.sp +-.nf +-\f3\-Xdoclint:all,\-html/package\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--Xdoclint:none +-.br +-Disables all groups of checks\&. +-.TP +--Xdoclint:all[\fI/access\fR] +-.br +-Enables all groups of checks\&. +-.TP +--Xlint +-.br +-\fI\fREnables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. +-.TP +--Xlint:all +-.br +-\fI\fREnables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. +-.TP +--Xlint:none +-.br +-Disables all warnings\&. +-.TP +--Xlint:\fIname\fR +-.br +-Disables warning name\&. See Enable or Disable Warnings with the -Xlint Option for a list of warnings you can disable with this option\&. +-.TP +--Xlint:\fI-name\fR +-.br +-Disables warning name\&. See Enable or Disable Warnings with the -Xlint Option with the \f3-Xlint\fR option to get a list of warnings that you can disable with this option\&. +-.TP +--Xmaxerrs \fInumber\fR +-.br +-Sets the maximum number of errors to print\&. +-.TP +--Xmaxwarns \fInumber\fR +-.br +-Sets the maximum number of warnings to print\&. +-.TP +--Xstdout \fIfilename\fR +-.br +-Sends compiler messages to the named file\&. By default, compiler messages go to \f3System\&.err\fR\&. +-.TP +--Xprefer:[\fInewer,source\fR] +-.br +-Specifies which file to read when both a source file and class file are found for a type\&. (See Searching for Types)\&. If the \f3-Xprefer:newer\fR option is used, then it reads the newer of the source or class file for a type (default)\&. If the \f3-Xprefer:source\fR option is used, then it reads the source file\&. Use -\f3Xprefer:source\fR when you want to be sure that any annotation processors can access annotations declared with a retention policy of \f3SOURCE\fR\&. +-.TP +--Xpkginfo:[\fIalways\fR,\fIlegacy\fR,\fInonempty\fR] +-.br +-Control whether javac generates \f3package-info\&.class\fR files from package-info\&.java files\&. Possible mode arguments for this option include the following\&. +-.RS +-.TP +-always +-Always generate a \f3package-info\&.class\fR file for every \f3package-info\&.java\fR file\&. This option may be useful if you use a build system such as Ant, which checks that each \f3\&.java\fR file has a corresponding \f3\&.class\fR file\&. +-.TP +-legacy +-Generate a \f3package-info\&.class\fR file only if package-info\&.java contains annotations\&. Don\&'t generate a \f3package-info\&.class\fR file if package-info\&.java only contains comments\&. +- +-\fINote:\fR A \f3package-info\&.class\fR file might be generated but be empty if all the annotations in the package-info\&.java file have \f3RetentionPolicy\&.SOURCE\fR\&. +-.TP +-nonempty +-Generate a \f3package-info\&.class\fR file only if package-info\&.java contains annotations with \f3RetentionPolicy\&.CLASS\fR or \f3RetentionPolicy\&.RUNTIME\fR\&. +-.RE +- +-.TP +--Xprint +-.br +-Prints a textual representation of specified types for debugging purposes\&. Perform neither annotation processing nor compilation\&. The format of the output could change\&. +-.TP +--XprintProcessorInfo +-.br +-Prints information about which annotations a processor is asked to process\&. +-.TP +--XprintRounds +-.br +-Prints information about initial and subsequent annotation processing rounds\&. +-.SH ENABLE\ OR\ DISABLE\ WARNINGS\ WITH\ THE\ -XLINT\ OPTION +-Enable warning \fIname\fR with the \f3-Xlint:name\fR option, where \f3name\fR is one of the following warning names\&. Note that you can disable a warning with the \f3-Xlint:-name:\fR option\&. +-.TP +-cast +-Warns about unnecessary and redundant casts, for example: +-.sp +-.nf +-\f3String s = (String) "Hello!"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-classfile +-Warns about issues related to class file contents\&. +-.TP +-deprecation +-Warns about the use of deprecated items, for example: +-.sp +-.nf +-\f3java\&.util\&.Date myDate = new java\&.util\&.Date();\fP +-.fi +-.nf +-\f3int currentDay = myDate\&.getDay();\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The method \f3java\&.util\&.Date\&.getDay\fR has been deprecated since JDK 1\&.1 +-.TP +-dep-ann +-Warns about items that are documented with an \f3@deprecated\fR Javadoc comment, but do not have a \f3@Deprecated\fR annotation, for example: +-.sp +-.nf +-\f3/**\fP +-.fi +-.nf +-\f3 * @deprecated As of Java SE 7, replaced by {@link #newMethod()}\fP +-.fi +-.nf +-\f3 */\fP +-.fi +-.nf +-\f3public static void deprecatedMethood() { }\fP +-.fi +-.nf +-\f3public static void newMethod() { }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-divzero +-Warns about division by the constant integer 0, for example: +-.sp +-.nf +-\f3int divideByZero = 42 / 0;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-empty +-Warns about empty statements after \f3if\fRstatements, for example: +-.sp +-.nf +-\f3class E {\fP +-.fi +-.nf +-\f3 void m() {\fP +-.fi +-.nf +-\f3 if (true) ;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-fallthrough +-Checks the switch blocks for fall-through cases and provides a warning message for any that are found\&. Fall-through cases are cases in a switch block, other than the last case in the block, whose code does not include a break statement, allowing code execution to fall through from that case to the next case\&. For example, the code following the case 1 label in this switch block does not end with a break statement: +-.sp +-.nf +-\f3switch (x) {\fP +-.fi +-.nf +-\f3case 1:\fP +-.fi +-.nf +-\f3 System\&.out\&.println("1");\fP +-.fi +-.nf +-\f3 // No break statement here\&.\fP +-.fi +-.nf +-\f3case 2:\fP +-.fi +-.nf +-\f3 System\&.out\&.println("2");\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If the \f3-Xlint:fallthrough\fR option was used when compiling this code, then the compiler emits a warning about possible fall-through into case, with the line number of the case in question\&. +-.TP +-finally +-Warns about \f3finally\fR clauses that cannot complete normally, for example: +-.sp +-.nf +-\f3public static int m() {\fP +-.fi +-.nf +-\f3 try {\fP +-.fi +-.nf +-\f3 throw new NullPointerException();\fP +-.fi +-.nf +-\f3 } catch (NullPointerException(); {\fP +-.fi +-.nf +-\f3 System\&.err\&.println("Caught NullPointerException\&.");\fP +-.fi +-.nf +-\f3 return 1;\fP +-.fi +-.nf +-\f3 } finally {\fP +-.fi +-.nf +-\f3 return 0;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates a warning for the \f3finally\fR block in this example\&. When the \f3int\fR method is called, it returns a value of 0\&. A \f3finally\fR block executes when the \f3try\fR block exits\&. In this example, when control is transferred to the \f3catch\fR block, the \f3int\fR method exits\&. However, the \f3finally\fR block must execute, so it is executed, even though control was transferred outside the method\&. +-.TP +-options +-Warns about issues that related to the use of command-line options\&. See Cross-Compilation Options\&. +-.TP +-overrides +-Warns about issues regarding method overrides\&. For example, consider the following two classes: +-.sp +-.nf +-\f3public class ClassWithVarargsMethod {\fP +-.fi +-.nf +-\f3 void varargsMethod(String\&.\&.\&. s) { }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3public class ClassWithOverridingMethod extends ClassWithVarargsMethod {\fP +-.fi +-.nf +-\f3 @Override\fP +-.fi +-.nf +-\f3 void varargsMethod(String[] s) { }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates a warning similar to the following:\&. +-.sp +-.nf +-\f3warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod \fP +-.fi +-.nf +-\f3overrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding\fP +-.fi +-.nf +-\f3method is missing \&'\&.\&.\&.\&'\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-When the compiler encounters a \f3varargs\fR method, it translates the \f3varargs\fR formal parameter into an array\&. In the method \f3ClassWithVarargsMethod\&.varargsMethod\fR, the compiler translates the \f3varargs\fR formal parameter \f3String\&.\&.\&. s\fR to the formal parameter \f3String[] s\fR, an array, which matches the formal parameter of the method \f3ClassWithOverridingMethod\&.varargsMethod\fR\&. Consequently, this example compiles\&. +-.TP +-path +-Warns about invalid path elements and nonexistent path directories on the command line (with regard to the class path, the source path, and other paths)\&. Such warnings cannot be suppressed with the \f3@SuppressWarnings\fR annotation, for example: +-.sp +-.nf +-\f3javac \-Xlint:path \-classpath /nonexistentpath Example\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-processing +-Warn about issues regarding annotation processing\&. The compiler generates this warning when you have a class that has an annotation, and you use an annotation processor that cannot handle that type of exception\&. For example, the following is a simple annotation processor: +- +-\fISource file AnnocProc\&.java\fR: +-.sp +-.nf +-\f3import java\&.util\&.*;\fP +-.fi +-.nf +-\f3import javax\&.annotation\&.processing\&.*;\fP +-.fi +-.nf +-\f3import javax\&.lang\&.model\&.*;\fP +-.fi +-.nf +-\f3import\&.javaz\&.lang\&.model\&.element\&.*;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3@SupportedAnnotationTypes("NotAnno")\fP +-.fi +-.nf +-\f3public class AnnoProc extends AbstractProcessor {\fP +-.fi +-.nf +-\f3 public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv){\fP +-.fi +-.nf +-\f3 return true;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public SourceVersion getSupportedSourceVersion() {\fP +-.fi +-.nf +-\f3 return SourceVersion\&.latest();\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\fISource file AnnosWithoutProcessors\&.java\fR: +-.sp +-.nf +-\f3@interface Anno { }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3@Anno\fP +-.fi +-.nf +-\f3class AnnosWithoutProcessors { }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following commands compile the annotation processor \f3AnnoProc\fR, then run this annotation processor against the source file \f3AnnosWithoutProcessors\&.java\fR: +-.sp +-.nf +-\f3javac AnnoProc\&.java\fP +-.fi +-.nf +-\f3javac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-When the compiler runs the annotation processor against the source file \f3AnnosWithoutProcessors\&.java\fR, it generates the following warning: +-.sp +-.nf +-\f3warning: [processing] No processor claimed any of these annotations: Anno\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-To resolve this issue, you can rename the annotation defined and used in the class \f3AnnosWithoutProcessors\fR from \f3Anno\fR to \f3NotAnno\fR\&. +-.TP +-rawtypes +-Warns about unchecked operations on raw types\&. The following statement generates a \f3rawtypes\fR warning: +-.sp +-.nf +-\f3void countElements(List l) { \&.\&.\&. }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following example does not generate a \f3rawtypes\fR warning +-.sp +-.nf +-\f3void countElements(List<?> l) { \&.\&.\&. }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\f3List\fR is a raw type\&. However, \f3List<?>\fR is an unbounded wildcard parameterized type\&. Because \f3List\fR is a parameterized interface, always specify its type argument\&. In this example, the \f3List\fR formal argument is specified with an unbounded wildcard (\f3?\fR) as its formal type parameter, which means that the \f3countElements\fR method can accept any instantiation of the \f3List\fR interface\&. +-.TP +-Serial +-Warns about missing \f3serialVersionUID\fR definitions on serializable classes, for example: +-.sp +-.nf +-\f3public class PersistentTime implements Serializable\fP +-.fi +-.nf +-\f3{\fP +-.fi +-.nf +-\f3 private Date time;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public PersistentTime() {\fP +-.fi +-.nf +-\f3 time = Calendar\&.getInstance()\&.getTime();\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public Date getTime() {\fP +-.fi +-.nf +-\f3 return time;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates the following warning: +-.sp +-.nf +-\f3warning: [serial] serializable class PersistentTime has no definition of\fP +-.fi +-.nf +-\f3serialVersionUID\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If a serializable class does not explicitly declare a field named \f3serialVersionUID\fR, then the serialization runtime environment calculates a default \f3serialVersionUID\fR value for that class based on various aspects of the class, as described in the Java Object Serialization Specification\&. However, it is strongly recommended that all serializable classes explicitly declare \f3serialVersionUID\fR values because the default process of computing \f3serialVersionUID\fR vales is highly sensitive to class details that can vary depending on compiler implementations, and as a result, might cause an unexpected \f3InvalidClassExceptions\fR during deserialization\&. To guarantee a consistent \f3serialVersionUID\fR value across different Java compiler implementations, a serializable class must declare an explicit \f3serialVersionUID\fR value\&. +-.TP +-static +-Warns about issues relating to the use of statics, for example: +-.sp +-.nf +-\f3class XLintStatic {\fP +-.fi +-.nf +-\f3 static void m1() { }\fP +-.fi +-.nf +-\f3 void m2() { this\&.m1(); }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates the following warning: +-.sp +-.nf +-\f3warning: [static] static method should be qualified by type name, \fP +-.fi +-.nf +-\f3XLintStatic, instead of by an expression\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-To resolve this issue, you can call the \f3static\fR method \f3m1\fR as follows: +-.sp +-.nf +-\f3XLintStatic\&.m1();\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Alternately, you can remove the \f3static\fR keyword from the declaration of the method \f3m1\fR\&. +-.TP +-try +-Warns about issues relating to use of \f3try\fR blocks, including try-with-resources statements\&. For example, a warning is generated for the following statement because the resource \f3ac\fR declared in the \f3try\fR block is not used: +-.sp +-.nf +-\f3try ( AutoCloseable ac = getResource() ) { // do nothing}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-unchecked +-Gives more detail for unchecked conversion warnings that are mandated by the Java Language Specification, for example: +-.sp +-.nf +-\f3List l = new ArrayList<Number>();\fP +-.fi +-.nf +-\f3List<String> ls = l; // unchecked warning\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-During type erasure, the types \f3ArrayList<Number>\fR and \f3List<String>\fR become \f3ArrayList\fR and \f3List\fR, respectively\&. +- +-The \f3ls\fR command has the parameterized type \f3List<String>\fR\&. When the \f3List\fR referenced by \f3l\fR is assigned to \f3ls\fR, the compiler generates an unchecked warning\&. At compile time, the compiler and JVM cannot determine whether \f3l\fR refers to a \f3List<String>\fR type\&. In this case, \f3l\fR does not refer to a \f3List<String>\fR type\&. As a result, heap pollution occurs\&. +- +-A heap pollution situation occurs when the \f3List\fR object \f3l\fR, whose static type is \f3List<Number>\fR, is assigned to another \f3List\fR object, \f3ls\fR, that has a different static type, \f3List<String>\fR\&. However, the compiler still allows this assignment\&. It must allow this assignment to preserve backward compatibility with releases of Java SE that do not support generics\&. Because of type erasure, \f3List<Number>\fR and \f3List<String>\fR both become \f3List\fR\&. Consequently, the compiler allows the assignment of the object \f3l\fR\f3,\fR which has a raw type of \f3List\fR, to the object \f3ls\fR\&. +-.TP +-varargs +-Warns about unsafe usages of variable arguments (\f3varargs\fR) methods, in particular, those that contain non-reifiable arguments, for example: +-.sp +-.nf +-\f3public class ArrayBuilder {\fP +-.fi +-.nf +-\f3 public static <T> void addToList (List<T> listArg, T\&.\&.\&. elements) {\fP +-.fi +-.nf +-\f3 for (T x : elements) {\fP +-.fi +-.nf +-\f3 listArg\&.add(x);\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\fINote:\fR A non-reifiable type is a type whose type information is not fully available at runtime\&. +- +-The compiler generates the following warning for the definition of the method \f3ArrayBuilder\&.addToList\fR +-.sp +-.nf +-\f3warning: [varargs] Possible heap pollution from parameterized vararg type T\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-When the compiler encounters a varargs method, it translates the \f3varargs\fR formal parameter into an array\&. However, the Java programming language does not permit the creation of arrays of parameterized types\&. In the method \f3ArrayBuilder\&.addToList\fR, the compiler translates the \f3varargs\fR formal parameter \f3T\&.\&.\&.\fR elements to the formal parameter \f3T[]\fR elements, an array\&. However, because of type erasure, the compiler converts the \f3varargs\fR formal parameter to \f3Object[]\fR elements\&. Consequently, there is a possibility of heap pollution\&. +-.SH COMMAND-LINE\ ARGUMENT\ FILES +-To shorten or simplify the \f3javac\fR command, you can specify one or more files that contain arguments to the \f3javac\fR command (except \f3-J\fR options)\&. This enables you to create \f3javac\fR commands of any length on any operating system\&. ++The ++\fBjavac\fR ++command provides direct support for annotation processing, superseding the need for the separate annotation processing command, ++\fBapt\fR\&. + .PP +-An argument file can include \f3javac\fR options and source file names in any combination\&. The arguments within a file can be separated by spaces or new line characters\&. If a file name contains embedded spaces, then put the whole file name in double quotation marks\&. ++The API for annotation processors is defined in the ++\fBjavax\&.annotation\&.processing\fR ++and j\fBavax\&.lang\&.model\fR ++packages and subpackages\&. ++.SS "How Annotation Processing Works" + .PP +-File Names within an argument file are relative to the current directory, not the location of the argument file\&. Wild cards (*) are not allowed in these lists (such as for specifying \f3*\&.java\fR)\&. Use of the at sign (@) to recursively interpret files is not supported\&. The \f3-J\fR options are not supported because they are passed to the launcher, which does not support argument files\&. +-.PP +-When executing the \f3javac\fR command, pass in the path and name of each argument file with the at sign (@) leading character\&. When the \f3javac\fR command encounters an argument beginning with the at sign (@), it expands the contents of that file into the argument list\&. +-.PP +-\f3Example 1 Single Argument File\fR +-.PP +-You could use a single argument file named \f3argfile\fR to hold all \f3javac\fR arguments: +-.sp +-.nf +-\f3javac @argfile\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-This argument file could contain the contents of both files shown in Example 2 +-.PP +-\f3Example 2 Two Argument Files\fR +-.PP +-You can create two argument files: one for the \f3javac\fR options and the other for the source file names\&. Note that the following lists have no line-continuation characters\&. +-.PP +-Create a file named options that contains the following: +-.sp +-.nf +-\f3\-d classes\fP +-.fi +-.nf +-\f3\-g\fP +-.fi +-.nf +-\f3\-sourcepath /java/pubs/ws/1\&.3/src/share/classes\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Create a file named classes that contains the following: +-.sp +-.nf +-\f3MyClass1\&.java\fP +-.fi +-.nf +-\f3MyClass2\&.java\fP +-.fi +-.nf +-\f3MyClass3\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Then, run the \f3javac\fR command as follows: +-.sp +-.nf +-\f3javac @options @classes\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 3 Argument Files with Paths\fR +-.PP +-The argument files can have paths, but any file names inside the files are relative to the current working directory (not \f3path1\fR or \f3path2\fR): +-.sp +-.nf +-\f3javac @path1/options @path2/classes\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-.SH ANNOTATION\ PROCESSING +-The \f3javac\fR command provides direct support for annotation processing, superseding the need for the separate annotation processing command, \f3apt\fR\&. +-.PP +-The API for annotation processors is defined in the \f3javax\&.annotation\&.processing\fR and j\f3avax\&.lang\&.model\fR packages and subpackages\&. +-.SS HOW\ ANNOTATION\ PROCESSING\ WORKS +-Unless annotation processing is disabled with the \f3-proc:none\fR option, the compiler searches for any annotation processors that are available\&. The search path can be specified with the \f3-processorpath\fR option\&. If no path is specified, then the user class path is used\&. Processors are located by means of service provider-configuration files named \f3META-INF/services/javax\&.annotation\&.processing\fR\&.Processor on the search path\&. Such files should contain the names of any annotation processors to be used, listed one per line\&. Alternatively, processors can be specified explicitly, using the \f3-processor\fR option\&. ++Unless annotation processing is disabled with the ++\fB\-proc:none\fR ++option, the compiler searches for any annotation processors that are available\&. The search path can be specified with the ++\fB\-processorpath\fR ++option\&. If no path is specified, then the user class path is used\&. Processors are located by means of service provider\-configuration files named ++\fBMETA\-INF/services/javax\&.annotation\&.processing\fR\&.Processor on the search path\&. Such files should contain the names of any annotation processors to be used, listed one per line\&. Alternatively, processors can be specified explicitly, using the ++\fB\-processor\fR ++option\&. + .PP + After scanning the source files and classes on the command line to determine what annotations are present, the compiler queries the processors to determine what annotations they process\&. When a match is found, the processor is called\&. A processor can claim the annotations it processes, in which case no further attempt is made to find any processors for those annotations\&. After all of the annotations are claimed, the compiler does not search for additional processors\&. + .PP + If any processors generate new source files, then another round of annotation processing occurs: Any newly generated source files are scanned, and the annotations processed as before\&. Any processors called on previous rounds are also called on all subsequent rounds\&. This continues until no new source files are generated\&. + .PP +-After a round occurs where no new source files are generated, the annotation processors are called one last time, to give them a chance to complete any remaining work\&. Finally, unless the \f3-proc:only\fR option is used, the compiler compiles the original and all generated source files\&. +-.SS IMPLICITLY\ LOADED\ SOURCE\ FILES +-To compile a set of source files, the compiler might need to implicitly load additional source files\&. See Searching for Types\&. Such files are currently not subject to annotation processing\&. By default, the compiler gives a warning when annotation processing occurred and any implicitly loaded source files are compiled\&. The \f3-implicit\fR option provides a way to suppress the warning\&. +-.SH SEARCHING\ FOR\ TYPES ++After a round occurs where no new source files are generated, the annotation processors are called one last time, to give them a chance to complete any remaining work\&. Finally, unless the ++\fB\-proc:only\fR ++option is used, the compiler compiles the original and all generated source files\&. ++.SS "Implicitly Loaded Source Files" ++.PP ++To compile a set of source files, the compiler might need to implicitly load additional source files\&. See Searching for Types\&. Such files are currently not subject to annotation processing\&. By default, the compiler gives a warning when annotation processing occurred and any implicitly loaded source files are compiled\&. The ++\fB\-implicit\fR ++option provides a way to suppress the warning\&. ++.SH "SEARCHING FOR TYPES" ++.PP + To compile a source file, the compiler often needs information about a type, but the type definition is not in the source files specified on the command line\&. The compiler needs type information for every class or interface used, extended, or implemented in the source file\&. This includes classes and interfaces not explicitly mentioned in the source file, but that provide information through inheritance\&. + .PP +-For example, when you create a subclass \f3java\&.applet\&.Applet\fR, you are also using the ancestor classes of \f3Applet\fR: \f3java\&.awt\&.Panel\fR, \f3java\&.awt\&.Container\fR, \f3java\&.awt\&.Component\fR, and \f3java\&.lang\&.Object\fR\&. ++For example, when you create a subclass ++\fBjava\&.applet\&.Applet\fR, you are also using the ancestor classes of ++\fBApplet\fR: ++\fBjava\&.awt\&.Panel\fR, ++\fBjava\&.awt\&.Container\fR, ++\fBjava\&.awt\&.Component\fR, and ++\fBjava\&.lang\&.Object\fR\&. + .PP +-When the compiler needs type information, it searches for a source file or class file that defines the type\&. The compiler searches for class files first in the bootstrap and extension classes, then in the user class path (which by default is the current directory)\&. The user class path is defined by setting the \f3CLASSPATH\fR environment variable or by using the \f3-classpath\fR option\&. ++When the compiler needs type information, it searches for a source file or class file that defines the type\&. The compiler searches for class files first in the bootstrap and extension classes, then in the user class path (which by default is the current directory)\&. The user class path is defined by setting the ++\fBCLASSPATH\fR ++environment variable or by using the ++\fB\-classpath\fR ++option\&. + .PP +-If you set the \f3-sourcepath\fR option, then the compiler searches the indicated path for source files\&. Otherwise, the compiler searches the user class path for both class files and source files\&. ++If you set the ++\fB\-sourcepath\fR ++option, then the compiler searches the indicated path for source files\&. Otherwise, the compiler searches the user class path for both class files and source files\&. + .PP +-You can specify different bootstrap or extension classes with the \f3-bootclasspath\fR and the \f3-extdirs\fR options\&. See Cross-Compilation Options\&. ++You can specify different bootstrap or extension classes with the ++\fB\-bootclasspath\fR ++and the ++\fB\-extdirs\fR ++options\&. See Cross\-Compilation Options\&. + .PP +-A successful type search may produce a class file, a source file, or both\&. If both are found, then you can use the \f3-Xprefer\fR option to instruct the compiler which to use\&. If \f3newer\fR is specified, then the compiler uses the newer of the two files\&. If \f3source\fR is specified, the compiler uses the source file\&. The default is \f3newer\fR\&. ++A successful type search may produce a class file, a source file, or both\&. If both are found, then you can use the ++\fB\-Xprefer\fR ++option to instruct the compiler which to use\&. If ++\fBnewer\fR ++is specified, then the compiler uses the newer of the two files\&. If ++\fBsource\fR ++is specified, the compiler uses the source file\&. The default is ++\fBnewer\fR\&. + .PP +-If a type search finds a source file for a required type, either by itself, or as a result of the setting for the \f3-Xprefer\fR option, then the compiler reads the source file to get the information it needs\&. By default the compiler also compiles the source file\&. You can use the \f3-implicit\fR option to specify the behavior\&. If \f3none\fR is specified, then no class files are generated for the source file\&. If \f3class\fR is specified, then class files are generated for the source file\&. ++If a type search finds a source file for a required type, either by itself, or as a result of the setting for the ++\fB\-Xprefer\fR ++option, then the compiler reads the source file to get the information it needs\&. By default the compiler also compiles the source file\&. You can use the ++\fB\-implicit\fR ++option to specify the behavior\&. If ++\fBnone\fR ++is specified, then no class files are generated for the source file\&. If ++\fBclass\fR ++is specified, then class files are generated for the source file\&. + .PP +-The compiler might not discover the need for some type information until after annotation processing completes\&. When the type information is found in a source file and no \f3-implicit\fR option is specified, the compiler gives a warning that the file is being compiled without being subject to annotation processing\&. To disable the warning, either specify the file on the command line (so that it will be subject to annotation processing) or use the \f3-implicit\fR option to specify whether or not class files should be generated for such source files\&. +-.SH PROGRAMMATIC\ INTERFACE +-The \f3javac\fR command supports the new Java Compiler API defined by the classes and interfaces in the \f3javax\&.tools\fR package\&. +-.SS EXAMPLE +-To compile as though providing command-line arguments, use the following syntax: +-.sp +-.nf +-\f3JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fP +-.fi +-.nf +-\f3JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The example writes diagnostics to the standard output stream and returns the exit code that \f3javac\fR would give when called from the command line\&. ++The compiler might not discover the need for some type information until after annotation processing completes\&. When the type information is found in a source file and no ++\fB\-implicit\fR ++option is specified, the compiler gives a warning that the file is being compiled without being subject to annotation processing\&. To disable the warning, either specify the file on the command line (so that it will be subject to annotation processing) or use the ++\fB\-implicit\fR ++option to specify whether or not class files should be generated for such source files\&. ++.SH "PROGRAMMATIC INTERFACE" + .PP +-You can use other methods in the \f3javax\&.tools\&.JavaCompiler\fR interface to handle diagnostics, control where files are read from and written to, and more\&. +-.SS OLD\ INTERFACE +-\fINote:\fR This API is retained for backward compatibility only\&. All new code should use the newer Java Compiler API\&. ++The ++\fBjavac\fR ++command supports the new Java Compiler API defined by the classes and interfaces in the ++\fBjavax\&.tools\fR ++package\&. ++.SS "Example" + .PP +-The \f3com\&.sun\&.tools\&.javac\&.Main\fR class provides two static methods to call the compiler from a program: +-.sp +-.nf +-\f3public static int compile(String[] args);\fP +-.fi +-.nf +-\f3public static int compile(String[] args, PrintWriter out);\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The \f3args\fR parameter represents any of the command-line arguments that would typically be passed to the compiler\&. ++To compile as though providing command\-line arguments, use the following syntax: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBJavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + .PP +-The \f3out\fR parameter indicates where the compiler diagnostic output is directed\&. ++The example writes diagnostics to the standard output stream and returns the exit code that ++\fBjavac\fR ++would give when called from the command line\&. + .PP +-The \f3return\fR value is equivalent to the \f3exit\fR value from \f3javac\fR\&. ++You can use other methods in the ++\fBjavax\&.tools\&.JavaCompiler\fR ++interface to handle diagnostics, control where files are read from and written to, and more\&. ++.SS "Old Interface" + .PP +-\fINote:\fR All other classes and methods found in a package with names that start with \f3com\&.sun\&.tools\&.javac\fR (subpackages of \f3com\&.sun\&.tools\&.javac\fR) are strictly internal and subject to change at any time\&. +-.SH EXAMPLES +-\f3Example 1 Compile a Simple Program\fR ++\fBNote:\fR ++This API is retained for backward compatibility only\&. All new code should use the newer Java Compiler API\&. + .PP +-This example shows how to compile the \f3Hello\&.java\fR source file in the greetings directory\&. The class defined in \f3Hello\&.java\fR is called \f3greetings\&.Hello\fR\&. The greetings directory is the package directory both for the source file and the class file and is underneath the current directory\&. This makes it possible to use the default user class path\&. It also makes it unnecessary to specify a separate destination directory with the \f3-d\fR option\&. ++The ++\fBcom\&.sun\&.tools\&.javac\&.Main\fR ++class provides two static methods to call the compiler from a program: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic static int compile(String[] args);\fR ++\fBpublic static int compile(String[] args, PrintWriter out);\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + .PP +-The source code in \f3Hello\&.java\fR: +-.sp +-.nf +-\f3package greetings;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3public class Hello {\fP +-.fi +-.nf +-\f3 public static void main(String[] args) {\fP +-.fi +-.nf +-\f3 for (int i=0; i < args\&.length; i++) {\fP +-.fi +-.nf +-\f3 System\&.out\&.println("Hello " + args[i]);\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp ++The ++\fBargs\fR ++parameter represents any of the command\-line arguments that would typically be passed to the compiler\&. ++.PP ++The ++\fBout\fR ++parameter indicates where the compiler diagnostic output is directed\&. ++.PP ++The ++\fBreturn\fR ++value is equivalent to the ++\fBexit\fR ++value from ++\fBjavac\fR\&. ++.PP ++\fBNote:\fR ++All other classes and methods found in a package with names that start with ++\fBcom\&.sun\&.tools\&.javac\fR ++(subpackages of ++\fBcom\&.sun\&.tools\&.javac\fR) are strictly internal and subject to change at any time\&. ++.SH "EXAMPLES" ++.PP ++\fBExample 1\fR ++.br ++Compile a Simple Program ++.RS 4 ++This example shows how to compile the ++\fBHello\&.java\fR ++source file in the greetings directory\&. The class defined in ++\fBHello\&.java\fR ++is called ++\fBgreetings\&.Hello\fR\&. The greetings directory is the package directory both for the source file and the class file and is underneath the current directory\&. This makes it possible to use the default user class path\&. It also makes it unnecessary to specify a separate destination directory with the ++\fB\-d\fR ++option\&. ++.sp ++The source code in ++\fBHello\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpackage greetings;\fR ++\fB \fR ++\fBpublic class Hello {\fR ++\fB public static void main(String[] args) {\fR ++\fB for (int i=0; i < args\&.length; i++) {\fR ++\fB System\&.out\&.println("Hello " + args[i]);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + Compile greetings\&.Hello: +-.sp +-.nf +-\f3javac greetings/Hello\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Run \f3greetings\&.Hello\fR: +-.sp +-.nf +-\f3java greetings\&.Hello World Universe Everyone\fP +-.fi +-.nf +-\f3Hello World\fP +-.fi +-.nf +-\f3Hello Universe\fP +-.fi +-.nf +-\f3Hello Everyone\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 2 Compile Multiple Source Files\fR ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac greetings/Hello\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Run ++\fBgreetings\&.Hello\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava greetings\&.Hello World Universe Everyone\fR ++\fBHello World\fR ++\fBHello Universe\fR ++\fBHello Everyone\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE + .PP +-This example compiles the \f3Aloha\&.java\fR, \f3GutenTag\&.java\fR, \f3Hello\&.java\fR, and \f3Hi\&.java\fR source files in the \f3greetings\fR package\&. +-.sp +-.nf +-\f3% javac greetings/*\&.java\fP +-.fi +-.nf +-\f3% ls greetings\fP +-.fi +-.nf +-\f3Aloha\&.class GutenTag\&.class Hello\&.class Hi\&.class\fP +-.fi +-.nf +-\f3Aloha\&.java GutenTag\&.java Hello\&.java Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 3 Specify a User Class Path\fR ++\fBExample 2\fR ++.br ++Compile Multiple Source Files ++.RS 4 ++This example compiles the ++\fBAloha\&.java\fR, ++\fBGutenTag\&.java\fR, ++\fBHello\&.java\fR, and ++\fBHi\&.java\fR ++source files in the ++\fBgreetings\fR ++package\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB% javac greetings/*\&.java\fR ++\fB% ls greetings\fR ++\fBAloha\&.class GutenTag\&.class Hello\&.class Hi\&.class\fR ++\fBAloha\&.java GutenTag\&.java Hello\&.java Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE + .PP ++\fBExample 3\fR ++.br ++Specify a User Class Path ++.RS 4 + After changing one of the source files in the previous example, recompile it: +-.sp +-.nf +-\f3pwd\fP +-.fi +-.nf +-\f3/examples\fP +-.fi +-.nf +-\f3javac greetings/Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Because \f3greetings\&.Hi\fR refers to other classes in the \f3greetings\fR package, the compiler needs to find these other classes\&. The previous example works because the default user class path is the directory that contains the package directory\&. If you want to recompile this file without concern for which directory you are in, then add the examples directory to the user class path by setting \f3CLASSPATH\fR\&. This example uses the \f3-classpath\fR option\&. +-.sp +-.nf +-\f3javac \-classpath /examples /examples/greetings/Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-If you change \f3greetings\&.Hi\fR to use a banner utility, then that utility also needs to be accessible through the user class path\&. +-.sp +-.nf +-\f3javac \-classpath /examples:/lib/Banners\&.jar \e\fP +-.fi +-.nf +-\f3 /examples/greetings/Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-To execute a class in the \f3greetings\fR package, the program needs access to the \f3greetings\fR package, and to the classes that the \f3greetings\fR classes use\&. +-.sp +-.nf +-\f3java \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 4 Separate Source Files and Class Files\fR ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpwd\fR ++\fB/examples\fR ++\fBjavac greetings/Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Because ++\fBgreetings\&.Hi\fR ++refers to other classes in the ++\fBgreetings\fR ++package, the compiler needs to find these other classes\&. The previous example works because the default user class path is the directory that contains the package directory\&. If you want to recompile this file without concern for which directory you are in, then add the examples directory to the user class path by setting ++\fBCLASSPATH\fR\&. This example uses the ++\fB\-classpath\fR ++option\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-classpath /examples /examples/greetings/Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you change ++\fBgreetings\&.Hi\fR ++to use a banner utility, then that utility also needs to be accessible through the user class path\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-classpath /examples:/lib/Banners\&.jar \e\fR ++\fB /examples/greetings/Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++To execute a class in the ++\fBgreetings\fR ++package, the program needs access to the ++\fBgreetings\fR ++package, and to the classes that the ++\fBgreetings\fR ++classes use\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE + .PP +-The following example uses \f3javac\fR to compile code that runs on JVM 1\&.6\&. +-.sp +-.nf +-\f3javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e \fP +-.fi +-.nf +-\f3\-extdirs "" OldCode\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The \f3-source 1\&.6\fR option specifies that release 1\&.6 (or 6) of the Java programming language be used to compile \f3OldCode\&.java\fR\&. The option \f3-target 1\&.6\fR option ensures that the generated class files are compatible with JVM 1\&.6\&. Note that in most cases, the value of the \f3-target\fR option is the value of the \f3-source\fR option; in this example, you can omit the \f3-target\fR option\&. ++\fBExample 4\fR ++.br ++Separate Source Files and Class Files ++.RS 4 ++The following example uses ++\fBjavac\fR ++to compile code that runs on JVM 1\&.7\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e \fR ++\fB\-extdirs "" OldCode\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The ++\fB\-source 1\&.7\fR ++option specifies that release 1\&.7 (or 7) of the Java programming language be used to compile ++\fBOldCode\&.java\fR\&. The option ++\fB\-target 1\&.7\fR ++option ensures that the generated class files are compatible with JVM 1\&.7\&. Note that in most cases, the value of the ++\fB\-target\fR ++option is the value of the ++\fB\-source\fR ++option; in this example, you can omit the ++\fB\-target\fR ++option\&. ++.sp ++You must specify the ++\fB\-bootclasspath\fR ++option to specify the correct version of the bootstrap classes (the ++\fBrt\&.jar\fR ++library)\&. If not, then the compiler generates a warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \fR ++\fB\-source 1\&.7\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules (in this example, it uses version 1\&.7 of the Java programming language) combined with the new bootstrap classes, which can result in class files that do not work on the older platform (in this case, Java SE 7) because reference to nonexistent methods can get included\&. ++.RE + .PP +-You must specify the \f3-bootclasspath\fR option to specify the correct version of the bootstrap classes (the \f3rt\&.jar\fR library)\&. If not, then the compiler generates a warning: +-.sp +-.nf +-\f3javac \-source 1\&.6 OldCode\&.java\fP +-.fi +-.nf +-\f3warning: [options] bootstrap class path not set in conjunction with \fP +-.fi +-.nf +-\f3\-source 1\&.6\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules (in this example, it uses version 1\&.6 of the Java programming language) combined with the new bootstrap classes, which can result in class files that do not work on the older platform (in this case, Java SE 6) because reference to nonexistent methods can get included\&. +-.PP +-\f3Example 5 Cross Compile\fR +-.PP +-This example uses \f3javac\fR to compile code that runs on JVM 1\&.6\&. +-.sp +-.nf +-\f3javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e\fP +-.fi +-.nf +-\f3 \-extdirs "" OldCode\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The\f3-source 1\&.6\fR option specifies that release 1\&.6 (or 6) of the Java programming language to be used to compile OldCode\&.java\&. The \f3-target 1\&.6\fR option ensures that the generated class files are compatible with JVM 1\&.6\&. In most cases, the value of the \f3-target\fR is the value of \f3-source\fR\&. In this example, the \f3-target\fR option is omitted\&. +-.PP +-You must specify the \f3-bootclasspath\fR option to specify the correct version of the bootstrap classes (the \f3rt\&.jar\fR library)\&. If not, then the compiler generates a warning: +-.sp +-.nf +-\f3javac \-source 1\&.6 OldCode\&.java\fP +-.fi +-.nf +-\f3warning: [options] bootstrap class path not set in conjunction with \-source 1\&.6\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules combined with the new bootstrap classes\&. This combination can result in class files that do not work on the older platform (in this case, Java SE 6) because reference to nonexistent methods can get included\&. In this example, the compiler uses release 1\&.6 of the Java programming language\&. +-.SH SEE\ ALSO +-.TP 0.2i +-\(bu ++\fBExample 5\fR ++.br ++Cross Compile ++.RS 4 ++This example uses ++\fBjavac\fR ++to compile code that runs on JVM 1\&.7\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e\fR ++\fB \-extdirs "" OldCode\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The\fB \-source 1\&.7\fR ++option specifies that release 1\&.7 (or 7) of the Java programming language to be used to compile OldCode\&.java\&. The ++\fB\-target 1\&.7\fR ++option ensures that the generated class files are compatible with JVM 1\&.7\&. In most cases, the value of the ++\fB\-target\fR ++is the value of ++\fB\-source\fR\&. In this example, the ++\fB\-target\fR ++option is omitted\&. ++.sp ++You must specify the ++\fB\-bootclasspath\fR ++option to specify the correct version of the bootstrap classes (the ++\fBrt\&.jar\fR ++library)\&. If not, then the compiler generates a warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \-source 1\&.7\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules combined with the new bootstrap classes\&. This combination can result in class files that do not work on the older platform (in this case, Java SE 7) because reference to nonexistent methods can get included\&. In this example, the compiler uses release 1\&.7 of the Java programming language\&. ++.RE ++.SH "SEE ALSO" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + java(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jdb(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javah(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javadoc(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jar(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jdb(1) +-.RE +-.br +-'pl 8.5i +-'bp ++.RE ++.br ++'pl 8.5i ++'bp +--- ./jdk/src/linux/doc/man/javap.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/linux/doc/man/javap.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,443 +1,392 @@ + '\" t +-.\" Copyright (c) 1994, 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. +-.\" +-.\" Arch: generic +-.\" Software: JDK 8 +-.\" Date: 21 November 2013 +-.\" SectDesc: Basic Tools +-.\" Title: javap.1 ++.\" Copyright (c) 1994, 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. ++.\" ++.\" Title: javap ++.\" Language: English ++.\" Date: 8 August 2014 ++.\" SectDesc: Basic Tools ++.\" Software: JDK 8 ++.\" Arch: generic ++.\" Part Number: E38207-03 + .\" + .if n .pl 99999 +-.TH javap 1 "21 November 2013" "JDK 8" "Basic Tools" +-.\" ----------------------------------------------------------------- +-.\" * Define some portability stuff +-.\" ----------------------------------------------------------------- +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.\" http://bugs.debian.org/507673 +-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" ----------------------------------------------------------------- +-.\" * set default formatting +-.\" ----------------------------------------------------------------- +-.\" disable hyphenation +-.nh +-.\" disable justification (adjust text to left margin only) +-.ad l +-.\" ----------------------------------------------------------------- +-.\" * MAIN CONTENT STARTS HERE * +-.\" ----------------------------------------------------------------- +- +-.SH NAME ++.TH "javap" "1" "8 August 2014" "JDK 8" "Basic Tools" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" + javap \- Disassembles one or more class files\&. +-.SH SYNOPSIS +-.sp +-.nf +- ++.SH "SYNOPSIS" ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjavap\fR [\fIoptions\fR] \fIclassfile\fR\&.\&.\&. +-.fi +-.sp +-.TP ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + \fIoptions\fR +-The command-line options\&. See Options\&. +-.TP ++.RS 4 ++The command\-line options\&. See Options\&. ++.RE ++.PP + \fIclassfile\fR +-One or more classes separated by spaces to be processed for annotations such as DocFooter\&.class\&. You can specify a class that can be found in the class path, by its file name or with a URL such as \f3file:///home/user/myproject/src/DocFooter\&.class\fR\&. +-.SH DESCRIPTION +-The \f3javap\fR command disassembles one or more class files\&. The output depends on the options used\&. When no options are used, then the \f3javap\fR command prints the package, protected and public fields, and methods of the classes passed to it\&. The \f3javap\fR command prints its output to \f3stdout\fR\&. +-.SH OPTIONS +-.TP +--help, --help, -? ++.RS 4 ++One or more classes separated by spaces to be processed for annotations such as DocFooter\&.class\&. You can specify a class that can be found in the class path, by its file name or with a URL such as ++\fBfile:///home/user/myproject/src/DocFooter\&.class\fR\&. ++.RE ++.SH "DESCRIPTION" ++.PP ++The ++\fBjavap\fR ++command disassembles one or more class files\&. The output depends on the options used\&. When no options are used, then the ++\fBjavap\fR ++command prints the package, protected and public fields, and methods of the classes passed to it\&. The ++\fBjavap\fR ++command prints its output to ++\fBstdout\fR\&. ++.SH "OPTIONS" ++.PP ++\-help + .br +-Prints a help message for the \f3javap\fR command\&. +-.TP +--version ++\-\-help + .br ++\-? ++.RS 4 ++Prints a help message for the ++\fBjavap\fR ++command\&. ++.RE ++.PP ++\-version ++.RS 4 + Prints release information\&. +-.TP +--l ++.RE ++.PP ++\-l ++.RS 4 ++Prints line and local variable tables\&. ++.RE ++.PP ++\-public ++.RS 4 ++Shows only public classes and members\&. ++.RE ++.PP ++\-protected ++.RS 4 ++Shows only protected and public classes and members\&. ++.RE ++.PP ++\-private + .br +-Prints line and local variable tables\&. +-.TP +--public ++\-p ++.RS 4 ++Shows all classes and members\&. ++.RE ++.PP ++\-J\fIoption\fR ++.RS 4 ++Passes the specified option to the JVM\&. For example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavap \-J\-version\fR ++\fBjavap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++For more information about JVM options, see the command documentation\&. ++.RE ++.PP ++\-s ++.RS 4 ++Prints internal type signatures\&. ++.RE ++.PP ++\-sysinfo ++.RS 4 ++Shows system information (path, size, date, MD5 hash) of the class being processed\&. ++.RE ++.PP ++\-constants ++.RS 4 ++Shows ++\fBstatic final\fR ++constants\&. ++.RE ++.PP ++\-c ++.RS 4 ++Prints disassembled code, for example, the instructions that comprise the Java bytecodes, for each of the methods in the class\&. ++.RE ++.PP ++\-verbose ++.RS 4 ++Prints stack size, number of locals and arguments for methods\&. ++.RE ++.PP ++\-classpath \fIpath\fR ++.RS 4 ++Specifies the path the ++\fBjavap\fR ++command uses to look up classes\&. Overrides the default or the ++\fBCLASSPATH\fR ++environment variable when it is set\&. ++.RE ++.PP ++\-bootclasspath \fIpath\fR ++.RS 4 ++Specifies the path from which to load bootstrap classes\&. By default, the bootstrap classes are the classes that implement the core Java platform located in ++\fBjre/lib/rt\&.jar\fR ++and several other JAR files\&. ++.RE ++.PP ++\-extdir \fIdirs\fR ++.RS 4 ++Overrides the location at which installed extensions are searched for\&. The default location for extensions is the value of ++\fBjava\&.ext\&.dirs\fR\&. ++.RE ++.SH "EXAMPLE" ++.PP ++Compile the following ++\fBDocFooter\fR ++class: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBimport java\&.awt\&.*;\fR ++\fBimport java\&.applet\&.*;\fR ++\fB \fR ++\fBpublic class DocFooter extends Applet {\fR ++\fB String date;\fR ++\fB String email;\fR ++\fB \fR ++\fB public void init() {\fR ++\fB resize(500,100);\fR ++\fB date = getParameter("LAST_UPDATED");\fR ++\fB email = getParameter("EMAIL");\fR ++\fB }\fR ++\fB \fR ++\fB public void paint(Graphics g) {\fR ++\fB g\&.drawString(date + " by ",100, 15);\fR ++\fB g\&.drawString(email,290,15);\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The output from the ++\fBjavap DocFooter\&.class\fR ++command yields the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++\fB public DocFooter();\fR ++\fB public void init();\fR ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The output from ++\fBjavap \-c DocFooter\&.class\fR ++command yields the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++ ++\fB public DocFooter();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: invokespecial #1 // Method\fR ++\fBjava/applet/Applet\&."<init>":()V\fR ++\fB 4: return \fR ++ ++\fB public void init();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: sipush 500\fR ++\fB 4: bipush 100\fR ++\fB 6: invokevirtual #2 // Method resize:(II)V\fR ++\fB 9: aload_0 \fR ++\fB 10: aload_0 \fR ++\fB 11: ldc #3 // String LAST_UPDATED\fR ++\fB 13: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 16: putfield #5 // Field date:Ljava/lang/String;\fR ++\fB 19: aload_0 \fR ++\fB 20: aload_0 \fR ++\fB 21: ldc #6 // String EMAIL\fR ++\fB 23: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 26: putfield #7 // Field email:Ljava/lang/String;\fR ++\fB 29: return \fR ++ ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB Code:\fR ++\fB 0: aload_1 \fR ++\fB 1: new #8 // class java/lang/StringBuilder\fR ++\fB 4: dup \fR ++\fB 5: invokespecial #9 // Method\fR ++\fB java/lang/StringBuilder\&."<init>":()V\fR ++\fB 8: aload_0 \fR ++\fB 9: getfield #5 // Field date:Ljava/lang/String;\fR ++\fB 12: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 15: ldc #11 // String by \fR ++\fB 17: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 20: invokevirtual #12 // Method\fR ++\fB java/lang/StringBuilder\&.toString:()Ljava/lang/String;\fR ++\fB 23: bipush 100\fR ++\fB 25: bipush 15\fR ++\fB 27: invokevirtual #13 // Method\fR ++\fB java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 30: aload_1 \fR ++\fB 31: aload_0 \fR ++\fB 32: getfield #7 // Field email:Ljava/lang/String;\fR ++\fB 35: sipush 290\fR ++\fB 38: bipush 15\fR ++\fB 40: invokevirtual #13 // Method\fR ++\fBjava/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 43: return \fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.SH "SEE ALSO" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++java(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javac(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javadoc(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javah(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++jdb(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++jdeps(1) ++.RE + .br +-Shows only public classes and members\&. +-.TP +--protected +-.br +-Shows only protected and public classes and members\&. +-.TP +--private, -p +-.br +-Shows all classes and members\&. +-.TP +--J\fIoption\fR +-.br +-Passes the specified option to the JVM\&. For example: +-.sp +-.nf +-\f3javap \-J\-version\fP +-.fi +-.nf +-\f3javap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-For more information about JVM options, see the \f3java(1)\fR command documentation\&. +-.TP +--s +-.br +-Prints internal type signatures\&. +-.TP +--sysinfo +-.br +-Shows system information (path, size, date, MD5 hash) of the class being processed\&. +-.TP +--constants +-.br +-Shows \f3static final\fR constants\&. +-.TP +--c +-.br +-Prints disassembled code, for example, the instructions that comprise the Java bytecodes, for each of the methods in the class\&. +-.TP +--verbose +-.br +-Prints stack size, number of locals and arguments for methods\&. +-.TP +--classpath \fIpath\fR +-.br +-Specifies the path the \f3javap\fR command uses to look up classes\&. Overrides the default or the \f3CLASSPATH\fR environment variable when it is set\&. +-.TP +--bootclasspath \fIpath\fR +-.br +-Specifies the path from which to load bootstrap classes\&. By default, the bootstrap classes are the classes that implement the core Java platform located in \f3jre/lib/rt\&.jar\fR and several other JAR files\&. +-.TP +--extdir \fIdirs\fR +-.br +-Overrides the location at which installed extensions are searched for\&. The default location for extensions is the value of \f3java\&.ext\&.dirs\fR\&. +-.SH EXAMPLE +-Compile the following \f3DocFooter\fR class: +-.sp +-.nf +-\f3import java\&.awt\&.*;\fP +-.fi +-.nf +-\f3import java\&.applet\&.*;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3public class DocFooter extends Applet {\fP +-.fi +-.nf +-\f3 String date;\fP +-.fi +-.nf +-\f3 String email;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void init() {\fP +-.fi +-.nf +-\f3 resize(500,100);\fP +-.fi +-.nf +-\f3 date = getParameter("LAST_UPDATED");\fP +-.fi +-.nf +-\f3 email = getParameter("EMAIL");\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void paint(Graphics g) {\fP +-.fi +-.nf +-\f3 g\&.drawString(date + " by ",100, 15);\fP +-.fi +-.nf +-\f3 g\&.drawString(email,290,15);\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The output from the \f3javap DocFooter\&.class\fR command yields the following: +-.sp +-.nf +-\f3Compiled from "DocFooter\&.java"\fP +-.fi +-.nf +-\f3public class DocFooter extends java\&.applet\&.Applet {\fP +-.fi +-.nf +-\f3 java\&.lang\&.String date;\fP +-.fi +-.nf +-\f3 java\&.lang\&.String email;\fP +-.fi +-.nf +-\f3 public DocFooter();\fP +-.fi +-.nf +-\f3 public void init();\fP +-.fi +-.nf +-\f3 public void paint(java\&.awt\&.Graphics);\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The output from \f3javap -c DocFooter\&.class\fR command yields the following: +-.sp +-.nf +-\f3Compiled from "DocFooter\&.java"\fP +-.fi +-.nf +-\f3public class DocFooter extends java\&.applet\&.Applet {\fP +-.fi +-.nf +-\f3 java\&.lang\&.String date;\fP +-.fi +-.nf +-\f3 java\&.lang\&.String email;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public DocFooter();\fP +-.fi +-.nf +-\f3 Code:\fP +-.fi +-.nf +-\f3 0: aload_0 \fP +-.fi +-.nf +-\f3 1: invokespecial #1 // Method\fP +-.fi +-.nf +-\f3java/applet/Applet\&."<init>":()V\fP +-.fi +-.nf +-\f3 4: return \fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void init();\fP +-.fi +-.nf +-\f3 Code:\fP +-.fi +-.nf +-\f3 0: aload_0 \fP +-.fi +-.nf +-\f3 1: sipush 500\fP +-.fi +-.nf +-\f3 4: bipush 100\fP +-.fi +-.nf +-\f3 6: invokevirtual #2 // Method resize:(II)V\fP +-.fi +-.nf +-\f3 9: aload_0 \fP +-.fi +-.nf +-\f3 10: aload_0 \fP +-.fi +-.nf +-\f3 11: ldc #3 // String LAST_UPDATED\fP +-.fi +-.nf +-\f3 13: invokevirtual #4 // Method\fP +-.fi +-.nf +-\f3 getParameter:(Ljava/lang/String;)Ljava/lang/String;\fP +-.fi +-.nf +-\f3 16: putfield #5 // Field date:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 19: aload_0 \fP +-.fi +-.nf +-\f3 20: aload_0 \fP +-.fi +-.nf +-\f3 21: ldc #6 // String EMAIL\fP +-.fi +-.nf +-\f3 23: invokevirtual #4 // Method\fP +-.fi +-.nf +-\f3 getParameter:(Ljava/lang/String;)Ljava/lang/String;\fP +-.fi +-.nf +-\f3 26: putfield #7 // Field email:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 29: return \fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void paint(java\&.awt\&.Graphics);\fP +-.fi +-.nf +-\f3 Code:\fP +-.fi +-.nf +-\f3 0: aload_1 \fP +-.fi +-.nf +-\f3 1: new #8 // class java/lang/StringBuilder\fP +-.fi +-.nf +-\f3 4: dup \fP +-.fi +-.nf +-\f3 5: invokespecial #9 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&."<init>":()V\fP +-.fi +-.nf +-\f3 8: aload_0 \fP +-.fi +-.nf +-\f3 9: getfield #5 // Field date:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 12: invokevirtual #10 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fP +-.fi +-.nf +-\f3 15: ldc #11 // String by \fP +-.fi +-.nf +-\f3 17: invokevirtual #10 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fP +-.fi +-.nf +-\f3 20: invokevirtual #12 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&.toString:()Ljava/lang/String;\fP +-.fi +-.nf +-\f3 23: bipush 100\fP +-.fi +-.nf +-\f3 25: bipush 15\fP +-.fi +-.nf +-\f3 27: invokevirtual #13 // Method\fP +-.fi +-.nf +-\f3 java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fP +-.fi +-.nf +-\f3 30: aload_1 \fP +-.fi +-.nf +-\f3 31: aload_0 \fP +-.fi +-.nf +-\f3 32: getfield #7 // Field email:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 35: sipush 290\fP +-.fi +-.nf +-\f3 38: bipush 15\fP +-.fi +-.nf +-\f3 40: invokevirtual #13 // Method\fP +-.fi +-.nf +-\f3java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fP +-.fi +-.nf +-\f3 43: return \fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-.SH SEE\ ALSO +-.TP 0.2i +-\(bu +-javac(1) +-.TP 0.2i +-\(bu +-java(1) +-.TP 0.2i +-\(bu +-jdb(1) +-.TP 0.2i +-\(bu +-javah(1) +-.TP 0.2i +-\(bu +-javadoc(1) +-.RE +-.br +-'pl 8.5i +-'bp ++'pl 8.5i ++'bp +--- ./jdk/src/macosx/classes/apple/laf/JRSUIConstants.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/apple/laf/JRSUIConstants.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -31,6 +31,13 @@ + import java.lang.annotation.Native; + + public final class JRSUIConstants { ++ ++ /** ++ * There is no way to get width of focus border, so it is hardcoded here. ++ * All components, which can be focused should take care about it. ++ */ ++ public static final int FOCUS_SIZE = 4; ++ + private static native long getPtrForConstant(final int constant); + + static class Key { +--- ./jdk/src/macosx/classes/com/apple/laf/AquaButtonExtendedTypes.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/com/apple/laf/AquaButtonExtendedTypes.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -36,6 +36,8 @@ + import com.apple.laf.AquaUtilControlSize.*; + import com.apple.laf.AquaUtils.RecyclableSingleton; + ++import static apple.laf.JRSUIConstants.FOCUS_SIZE; ++ + /** + * All the "magic numbers" in this class should go away once + * <rdar://problem/4613866> "default font" and sizes for controls in Java Aqua Look and Feel +@@ -145,7 +147,8 @@ + protected static Map<String, TypeSpecifier> getAllTypes() { + final Map<String, TypeSpecifier> specifiersByName = new HashMap<String, TypeSpecifier>(); + +- final Insets focusInsets = new Insets(4, 4, 4, 4); ++ final Insets focusInsets = new Insets(FOCUS_SIZE, FOCUS_SIZE, ++ FOCUS_SIZE, FOCUS_SIZE); + + final TypeSpecifier[] specifiers = { + new TypeSpecifier("toolbar", true) { +--- ./jdk/src/macosx/classes/com/apple/laf/AquaComboBoxUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/com/apple/laf/AquaComboBoxUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -510,15 +510,17 @@ + } + }; + +- private static Action hideAction = new AbstractAction() { ++ private final Action hideAction = new AbstractAction() { + @Override + public void actionPerformed(final ActionEvent e) { + final JComboBox comboBox = (JComboBox)e.getSource(); ++ comboBox.firePopupMenuCanceled(); ++ comboBox.setPopupVisible(false); ++ } + +- if (comboBox.isPopupVisible()) { +- comboBox.firePopupMenuCanceled(); +- comboBox.setPopupVisible(false); +- } ++ @Override ++ public boolean isEnabled() { ++ return comboBox.isPopupVisible() && super.isEnabled(); + } + }; + +--- ./jdk/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1266,64 +1266,70 @@ + /** + * Data model for a type-face selection combo-box. + */ +- protected class FilterComboBoxModel extends DefaultListModel implements ComboBoxModel, PropertyChangeListener { +- int selectedIndex = -1; +- ++ protected class FilterComboBoxModel extends AbstractListModel<FileFilter> implements ComboBoxModel<FileFilter>, ++ PropertyChangeListener { ++ protected FileFilter[] filters; + protected FilterComboBoxModel() { + super(); +- final FileFilter filters[] = getFileChooser().getChoosableFileFilters(); +- for (int i = 0; i < filters.length; i++) { +- this.add(i, filters[i]); ++ filters = getFileChooser().getChoosableFileFilters(); ++ } ++ ++ public void propertyChange(PropertyChangeEvent e) { ++ String prop = e.getPropertyName(); ++ if(prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) { ++ filters = (FileFilter[]) e.getNewValue(); ++ fireContentsChanged(this, -1, -1); ++ } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) { ++ fireContentsChanged(this, -1, -1); + } + } + +- public void propertyChange(final PropertyChangeEvent e) { +- final String prop = e.getPropertyName(); +- if (prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) { +- this.clear(); +- final FileFilter filters[] = (FileFilter[])e.getNewValue(); +- +- for (int i = 0; i < filters.length; i++) { +- this.add(i, filters[i]); +- } +- +- fireContentsChanged(this, -1, -1); +- } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) { +- final FileFilter currentFilter = (FileFilter)e.getNewValue(); +- FileFilter filters[] = getFileChooser().getChoosableFileFilters(); +- +- boolean found = false; +- if (currentFilter != null) { +- for (final FileFilter element : filters) { +- if (element == currentFilter) { +- found = true; +- } +- } +- if (found == false) { +- getFileChooser().addChoosableFileFilter(currentFilter); +- } +- } +- +- filters = getFileChooser().getChoosableFileFilters(); +- setSelectedItem(e.getNewValue()); +- } +- } +- +- public void setSelectedItem(final Object filter) { +- if (filter != null) { +- selectedIndex = this.indexOf(filter); ++ public void setSelectedItem(Object filter) { ++ if(filter != null) { ++ getFileChooser().setFileFilter((FileFilter) filter); + fireContentsChanged(this, -1, -1); + } + } + + public Object getSelectedItem() { +- final Object returnValue = null; ++ // Ensure that the current filter is in the list. ++ // NOTE: we shouldnt' have to do this, since JFileChooser adds ++ // the filter to the choosable filters list when the filter ++ // is set. Lets be paranoid just in case someone overrides ++ // setFileFilter in JFileChooser. ++ FileFilter currentFilter = getFileChooser().getFileFilter(); ++ boolean found = false; ++ if(currentFilter != null) { ++ for (FileFilter filter : filters) { ++ if (filter == currentFilter) { ++ found = true; ++ } ++ } ++ if(found == false) { ++ getFileChooser().addChoosableFileFilter(currentFilter); ++ } ++ } ++ return getFileChooser().getFileFilter(); ++ } + +- if (this.size() > 0) { +- if ((selectedIndex != -1) && (selectedIndex < size())) { return this.get(selectedIndex); } ++ public int getSize() { ++ if(filters != null) { ++ return filters.length; ++ } else { ++ return 0; + } ++ } + +- return returnValue; ++ public FileFilter getElementAt(int index) { ++ if(index > getSize() - 1) { ++ // This shouldn't happen. Try to recover gracefully. ++ return getFileChooser().getFileFilter(); ++ } ++ if(filters != null) { ++ return filters[index]; ++ } else { ++ return null; ++ } + } + } + +--- ./jdk/src/macosx/classes/com/apple/laf/AquaIcon.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/com/apple/laf/AquaIcon.java Wed Jul 30 18:42:59 2014 +0100 +@@ -44,7 +44,8 @@ + } + + static UIResource getIconFor(final JRSUIControlSpec spec, final int width, final int height) { +- return new CachableJRSUIIcon(width, height) { ++ return new ScalingJRSUIIcon(width, height) { ++ @Override + public void initIconPainter(final AquaPainter<JRSUIState> painter) { + spec.initIconPainter(painter); + } +@@ -128,35 +129,12 @@ + if (image != null) return image; + + if (!GraphicsEnvironment.isHeadless()) { +- image = getOptimizedImage(); ++ image = createImage(); + } + + return image; + } + +- private Image getOptimizedImage() { +- final Image img = createImage(); +- // TODO: no RuntimeOptions for now +- //if (RuntimeOptions.getRenderer(null) != RuntimeOptions.Sun) return img; +- return getProgressiveOptimizedImage(img, getIconWidth(), getIconHeight()); +- } +- +- static Image getProgressiveOptimizedImage(final Image img, final int w, final int h) { +- if (img == null) return null; +- +- final int halfImgW = img.getWidth(null) / 2; +- final int halfImgH = img.getHeight(null) / 2; +- if (w * 2 > halfImgW && h * 2 > halfImgH) return img; +- +- final BufferedImage halfImage = new BufferedImage(halfImgW, halfImgH, BufferedImage.TYPE_INT_ARGB); +- final Graphics g = halfImage.getGraphics(); +- ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); +- g.drawImage(img, 0, 0, halfImgW, halfImgH, null); +- g.dispose(); +- +- return getProgressiveOptimizedImage(halfImage, w, h); +- } +- + abstract Image createImage(); + + public boolean hasIconRef() { +@@ -189,24 +167,50 @@ + + } + +- static abstract class CachableJRSUIIcon extends CachingScalingIcon implements UIResource { +- public CachableJRSUIIcon(final int width, final int height) { +- super(width, height); ++ static abstract class ScalingJRSUIIcon implements Icon, UIResource { ++ final int width; ++ final int height; ++ ++ public ScalingJRSUIIcon(final int width, final int height) { ++ this.width = width; ++ this.height = height; + } + +- Image createImage() { +- final AquaPainter<JRSUIState> painter = AquaPainter.create(JRSUIState.getInstance()); ++ @Override ++ public void paintIcon(final Component c, Graphics g, ++ final int x, final int y) { ++ if (GraphicsEnvironment.isHeadless()) { ++ return; ++ } ++ ++ g = g.create(); ++ ++ if (g instanceof Graphics2D) { ++ // improves icon rendering quality in Quartz ++ ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_RENDERING, ++ RenderingHints.VALUE_RENDER_QUALITY); ++ } ++ ++ final AquaPainter<JRSUIState> painter = ++ AquaPainter.create(JRSUIState.getInstance()); + initIconPainter(painter); + +- final BufferedImage img = new BufferedImage(getIconWidth(), getIconHeight(), BufferedImage.TYPE_INT_ARGB_PRE); +- final Graphics g = img.getGraphics(); +- g.setClip(new Rectangle(0, 0, getIconWidth(), getIconHeight())); +- painter.paint(g, null, 0, 0, getIconWidth(), getIconHeight()); ++ g.setClip(new Rectangle(x, y, width, height)); ++ painter.paint(g, c, x, y, width, height); + g.dispose(); +- return img; + } + + public abstract void initIconPainter(final AquaPainter<JRSUIState> painter); ++ ++ @Override ++ public int getIconWidth() { ++ return width; ++ } ++ ++ @Override ++ public int getIconHeight() { ++ return height; ++ } + } + + static class FileIcon extends CachingScalingIcon { +@@ -295,7 +299,8 @@ + } + + Image createImage() { +- return AquaUtils.getCImageCreator().createSystemImageFromSelector(selector, getIconWidth(), getIconHeight()); ++ return AquaUtils.getCImageCreator().createSystemImageFromSelector( ++ selector, getIconWidth(), getIconHeight()); + } + } + } +--- ./jdk/src/macosx/classes/com/apple/laf/AquaImageFactory.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/com/apple/laf/AquaImageFactory.java Wed Jul 30 18:42:59 2014 +0100 +@@ -46,6 +46,10 @@ + import com.apple.laf.AquaIcon.SystemIcon; + import com.apple.laf.AquaUtils.RecyclableObject; + import com.apple.laf.AquaUtils.RecyclableSingleton; ++import java.util.Arrays; ++import java.util.List; ++import sun.awt.image.MultiResolutionBufferedImage; ++import sun.awt.image.MultiResolutionImage; + + public class AquaImageFactory { + public static IconUIResource getConfirmImageIcon() { +@@ -53,7 +57,7 @@ + + return new IconUIResource(new AquaIcon.CachingScalingIcon(kAlertIconSize, kAlertIconSize) { + Image createImage() { +- return getThisApplicationsIcon(kAlertIconSize, kAlertIconSize); ++ return getGenericJavaIcon(); + } + }); + } +@@ -79,24 +83,6 @@ + return getAppIconCompositedOn(lockIcon); + } + +- static Image getThisApplicationsIcon(final int width, final int height) { +- final String path = getPathToThisApplication(); +- +- if (path == null) { +- return getGenericJavaIcon(); +- } +- +- if (path.endsWith("/Home/bin")) { +- return getGenericJavaIcon(); +- } +- +- if (path.startsWith("/usr/bin")) { +- return getGenericJavaIcon(); +- } +- +- return AquaUtils.getCImageCreator().createImageOfFile(path, height, width); +- } +- + static Image getGenericJavaIcon() { + return java.security.AccessController.doPrivileged(new PrivilegedAction<Image>() { + public Image run() { +@@ -120,28 +106,46 @@ + + private static final int kAlertIconSize = 64; + static IconUIResource getAppIconCompositedOn(final Image background) { +- final double scaleFactor = 1.0; // revise for HiDPI + +- final int kAlertSubIconSize = (int)(kAlertIconSize * 0.5 * scaleFactor); +- final int kAlertSubIconInset = (int)(kAlertIconSize * scaleFactor) - kAlertSubIconSize; +- final Icon smallAppIconScaled = new AquaIcon.CachingScalingIcon(kAlertSubIconSize, kAlertSubIconSize) { +- Image createImage() { +- return getThisApplicationsIcon(kAlertSubIconSize, kAlertSubIconSize); +- } +- }; ++ if (background instanceof MultiResolutionBufferedImage) { ++ int width = background.getWidth(null); ++ Image mrIconImage = ((MultiResolutionBufferedImage) background).map( ++ rv -> getAppIconImageCompositedOn(rv, rv.getWidth(null) / width)); ++ return new IconUIResource(new ImageIcon(mrIconImage)); ++ } + +- final BufferedImage image = new BufferedImage(kAlertIconSize, kAlertIconSize, BufferedImage.TYPE_INT_ARGB); ++ BufferedImage iconImage = getAppIconImageCompositedOn(background, 1); ++ return new IconUIResource(new ImageIcon(iconImage)); ++ } ++ ++ static BufferedImage getAppIconImageCompositedOn(final Image background, int scaleFactor) { ++ ++ final int scaledAlertIconSize = kAlertIconSize * scaleFactor; ++ final int kAlertSubIconSize = (int) (scaledAlertIconSize * 0.5); ++ final int kAlertSubIconInset = scaledAlertIconSize - kAlertSubIconSize; ++ final Icon smallAppIconScaled = new AquaIcon.CachingScalingIcon( ++ kAlertSubIconSize, kAlertSubIconSize) { ++ Image createImage() { ++ return getGenericJavaIcon(); ++ } ++ }; ++ ++ final BufferedImage image = new BufferedImage(scaledAlertIconSize, ++ scaledAlertIconSize, BufferedImage.TYPE_INT_ARGB); + final Graphics g = image.getGraphics(); +- g.drawImage(background, 0, 0, (int)(kAlertIconSize * scaleFactor), (int)(kAlertIconSize * scaleFactor), null); ++ g.drawImage(background, 0, 0, ++ scaledAlertIconSize, scaledAlertIconSize, null); + if (g instanceof Graphics2D) { + // improves icon rendering quality in Quartz +- ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); ++ ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_RENDERING, ++ RenderingHints.VALUE_RENDER_QUALITY); + } + +- smallAppIconScaled.paintIcon(null, g, kAlertSubIconInset, kAlertSubIconInset); ++ smallAppIconScaled.paintIcon(null, g, ++ kAlertSubIconInset, kAlertSubIconInset); + g.dispose(); + +- return new IconUIResource(new ImageIcon(image)); ++ return image; + } + + public static IconUIResource getTreeFolderIcon() { +@@ -207,7 +211,7 @@ + + @Override + protected Image getInstance() { +- return Toolkit.getDefaultToolkit().getImage("NSImage://" + namedImage); ++ return getNSIcon(namedImage); + } + } + +@@ -271,11 +275,33 @@ + } + + public static Icon getMenuItemCheckIcon() { +- return new InvertableImageIcon(AquaUtils.generateLightenedImage(Toolkit.getDefaultToolkit().getImage("NSImage://NSMenuItemSelection"), 25)); ++ return new InvertableImageIcon(AquaUtils.generateLightenedImage( ++ getNSIcon("NSMenuItemSelection"), 25)); + } + + public static Icon getMenuItemDashIcon() { +- return new InvertableImageIcon(AquaUtils.generateLightenedImage(Toolkit.getDefaultToolkit().getImage("NSImage://NSMenuMixedState"), 25)); ++ return new InvertableImageIcon(AquaUtils.generateLightenedImage( ++ getNSIcon("NSMenuMixedState"), 25)); ++ } ++ ++ private static Image getNSIcon(String imageName) { ++ Image icon = Toolkit.getDefaultToolkit() ++ .getImage("NSImage://" + imageName); ++ ++ if (icon instanceof MultiResolutionImage) { ++ return icon; ++ } ++ ++ int w = icon.getWidth(null); ++ int h = icon.getHeight(null); ++ ++ Dimension[] sizes = new Dimension[]{ ++ new Dimension(w, h), new Dimension(2 * w, 2 * h) ++ }; ++ ++ return new MultiResolutionBufferedImage(icon, sizes, (width, height) -> ++ AquaUtils.getCImageCreator().createImageFromName( ++ imageName, width, height)); + } + + public static class NineSliceMetrics { +--- ./jdk/src/macosx/classes/com/apple/laf/AquaInternalFrameUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/com/apple/laf/AquaInternalFrameUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -786,8 +786,9 @@ + } + + static final RecyclableSingleton<Icon> RESIZE_ICON = new RecyclableSingleton<Icon>() { ++ @Override + protected Icon getInstance() { +- return new AquaIcon.CachableJRSUIIcon(11, 11) { ++ return new AquaIcon.ScalingJRSUIIcon(11, 11) { + public void initIconPainter(final AquaPainter<JRSUIState> iconState) { + iconState.state.set(Widget.GROW_BOX_TEXTURED); + iconState.state.set(WindowType.UTILITY); +--- ./jdk/src/macosx/classes/com/apple/laf/AquaPainter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/com/apple/laf/AquaPainter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -38,6 +38,7 @@ + import sun.print.*; + import apple.laf.*; + import apple.laf.JRSUIUtils.NineSliceMetricsProvider; ++import sun.awt.image.ImageCache; + + abstract class AquaPainter <T extends JRSUIState> { + static <T extends JRSUIState> AquaPainter<T> create(final T state) { +@@ -140,35 +141,125 @@ + paintFromSingleCachedImage(g, control, stateToPaint, boundsRect); + } + ++ /** ++ * Paints a native control, which identified by its size and a set of ++ * additional arguments using a cached image. ++ * ++ * @param g Graphics to draw the control ++ * @param control the reference to the native control ++ * @param controlState the state of the native control ++ * @param bounds the rectangle where the native part should be drawn. ++ * Note: the focus can/will be drawn outside of this bounds. ++ */ + static void paintFromSingleCachedImage(final Graphics2D g, +- final JRSUIControl control, final JRSUIState controlState, +- final Rectangle bounds) { ++ final JRSUIControl control, ++ final JRSUIState controlState, ++ final Rectangle bounds) { + if (bounds.width <= 0 || bounds.height <= 0) { + return; + } + +- int scale = 1; +- if (g instanceof SunGraphics2D) { +- scale = ((SunGraphics2D) g).surfaceData.getDefaultScale(); ++ int focus = 0; ++ if (controlState.is(JRSUIConstants.Focused.YES)) { ++ focus = JRSUIConstants.FOCUS_SIZE; + } ++ ++ final int imgX = bounds.x - focus; ++ final int imgY = bounds.y - focus; ++ final int imgW = bounds.width + (focus << 1); ++ final int imgH = bounds.height + (focus << 1); + final GraphicsConfiguration config = g.getDeviceConfiguration(); + final ImageCache cache = ImageCache.getInstance(); +- final int imgW = bounds.width * scale; +- final int imgH = bounds.height * scale; +- BufferedImage img = (BufferedImage) cache.getImage(config, imgW, imgH, scale, controlState); ++ final AquaPixelsKey key = new AquaPixelsKey(config, imgW, imgH, ++ bounds, controlState); ++ Image img = cache.getImage(key); + if (img == null) { +- img = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB_PRE); +- cache.setImage(img, config, imgW, imgH, scale, controlState); +- final WritableRaster raster = img.getRaster(); +- final DataBufferInt buffer = (DataBufferInt) raster.getDataBuffer(); + +- control.set(controlState); +- control.paint(SunWritableRaster.stealData(buffer, 0), +- imgW, imgH, 0, 0, bounds.width, bounds.height); +- SunWritableRaster.markDirty(buffer); ++ Image baseImage = createImage(imgX, imgY, imgW, imgH, bounds, ++ control, controlState); ++ ++ img = new MultiResolutionBufferedImage(baseImage, ++ (rvWidth, rvHeight) -> createImage(imgX, imgY, ++ rvWidth, rvHeight, bounds, control, controlState)); ++ ++ if (!controlState.is(JRSUIConstants.Animating.YES)) { ++ cache.setImage(key, img); ++ } + } + +- g.drawImage(img, bounds.x, bounds.y, bounds.width, bounds.height, null); ++ g.drawImage(img, imgX, imgY, imgW, imgH, null); ++ } ++ ++ private static Image createImage(int imgX, int imgY, int imgW, int imgH, ++ final Rectangle bounds, ++ final JRSUIControl control, ++ JRSUIState controlState) { ++ BufferedImage img = new BufferedImage(imgW, imgH, ++ BufferedImage.TYPE_INT_ARGB_PRE); ++ ++ final WritableRaster raster = img.getRaster(); ++ final DataBufferInt buffer = (DataBufferInt) raster.getDataBuffer(); ++ ++ control.set(controlState); ++ control.paint(SunWritableRaster.stealData(buffer, 0), imgW, imgH, ++ bounds.x - imgX, bounds.y - imgY, bounds.width, ++ bounds.height); ++ SunWritableRaster.markDirty(buffer); ++ return img; ++ } ++ } ++ ++ private static class AquaPixelsKey implements ImageCache.PixelsKey { ++ ++ private final int pixelCount; ++ private final int hash; ++ ++ // key parts ++ private final GraphicsConfiguration config; ++ private final int w; ++ private final int h; ++ private final Rectangle bounds; ++ private final JRSUIState state; ++ ++ AquaPixelsKey(final GraphicsConfiguration config, ++ final int w, final int h, final Rectangle bounds, ++ final JRSUIState state) { ++ this.pixelCount = w * h; ++ this.config = config; ++ this.w = w; ++ this.h = h; ++ this.bounds = bounds; ++ this.state = state; ++ this.hash = hash(); ++ } ++ ++ @Override ++ public int getPixelCount() { ++ return pixelCount; ++ } ++ ++ private int hash() { ++ int hash = config != null ? config.hashCode() : 0; ++ hash = 31 * hash + w; ++ hash = 31 * hash + h; ++ hash = 31 * hash + bounds.hashCode(); ++ hash = 31 * hash + state.hashCode(); ++ return hash; ++ } ++ ++ @Override ++ public int hashCode() { ++ return hash; ++ } ++ ++ @Override ++ public boolean equals(Object obj) { ++ if (obj instanceof AquaPixelsKey) { ++ AquaPixelsKey key = (AquaPixelsKey) obj; ++ return config == key.config && w == key.w && h == key.h ++ && bounds.equals(key.bounds) && state.equals(key.state); ++ } ++ return false; + } + } + +--- ./jdk/src/macosx/classes/com/apple/laf/AquaUtils.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/com/apple/laf/AquaUtils.java Wed Jul 30 18:42:59 2014 +0100 +@@ -48,6 +48,7 @@ + import sun.swing.SwingUtilities2; + + import com.apple.laf.AquaImageFactory.SlicedImageControl; ++import sun.awt.image.MultiResolutionBufferedImage; + + final class AquaUtils { + +@@ -123,6 +124,13 @@ + + static Image generateLightenedImage(final Image image, final int percent) { + final GrayFilter filter = new GrayFilter(true, percent); ++ return (image instanceof MultiResolutionBufferedImage) ++ ? ((MultiResolutionBufferedImage) image).map( ++ rv -> generateLightenedImage(rv, filter)) ++ : generateLightenedImage(image, filter); ++ } ++ ++ static Image generateLightenedImage(Image image, ImageFilter filter) { + final ImageProducer prod = new FilteredImageSource(image.getSource(), filter); + return Toolkit.getDefaultToolkit().createImage(prod); + } +@@ -169,16 +177,7 @@ + + abstract static class RecyclableSingleton<T> { + final T get() { +- final AppContext appContext = AppContext.getAppContext(); +- SoftReference<T> ref = (SoftReference<T>) appContext.get(this); +- if (ref != null) { +- final T object = ref.get(); +- if (object != null) return object; +- } +- final T object = getInstance(); +- ref = new SoftReference<T>(object); +- appContext.put(this, ref); +- return object; ++ return AppContext.getSoftReferenceValue(this, () -> getInstance()); + } + + void reset() { +--- ./jdk/src/macosx/classes/com/apple/laf/ImageCache.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/com/apple/laf/ImageCache.java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,266 +0,0 @@ +-/* +- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. Oracle designates this +- * particular file as subject to the "Classpath" exception as provided +- * by Oracle in the LICENSE file that accompanied this code. +- * +- * This code is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * version 2 for more details (a copy is included in the LICENSE file that +- * accompanied this code). +- * +- * You should have received a copy of the GNU General Public License version +- * 2 along with this work; if not, write to the Free Software Foundation, +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +- * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- */ +- +-package com.apple.laf; +- +-import java.awt.*; +-import java.lang.ref.*; +-import java.util.*; +-import java.util.concurrent.locks.*; +- +-import apple.laf.JRSUIConstants; +-import apple.laf.JRSUIState; +-import com.apple.laf.AquaUtils.RecyclableSingleton; +- +-/** +- * ImageCache - A fixed pixel count sized cache of Images keyed by arbitrary set of arguments. All images are held with +- * SoftReferences so they will be dropped by the GC if heap memory gets tight. When our size hits max pixel count least +- * recently requested images are removed first. +- */ +-final class ImageCache { +- // Ordered Map keyed by args hash, ordered by most recent accessed entry. +- private final LinkedHashMap<Integer, PixelCountSoftReference> map = new LinkedHashMap<>(16, 0.75f, true); +- +- // Maximum number of pixels to cache, this is used if maxCount +- private final int maxPixelCount; +- // The current number of pixels stored in the cache +- private int currentPixelCount = 0; +- +- // Lock for concurrent access to map +- private final ReadWriteLock lock = new ReentrantReadWriteLock(); +- // Reference queue for tracking lost softreferences to images in the cache +- private final ReferenceQueue<Image> referenceQueue = new ReferenceQueue<>(); +- +- // Singleton Instance +- private static final RecyclableSingleton<ImageCache> instance = new RecyclableSingleton<ImageCache>() { +- @Override +- protected ImageCache getInstance() { +- return new ImageCache(); +- } +- }; +- static ImageCache getInstance() { +- return instance.get(); +- } +- +- ImageCache(final int maxPixelCount) { +- this.maxPixelCount = maxPixelCount; +- } +- +- ImageCache() { +- this((8 * 1024 * 1024) / 4); // 8Mb of pixels +- } +- +- public void flush() { +- lock.writeLock().lock(); +- try { +- map.clear(); +- } finally { +- lock.writeLock().unlock(); +- } +- } +- +- public Image getImage(final GraphicsConfiguration config, final int w, +- final int h, final int scale, +- final JRSUIState state) { +- final int hash = hash(config, w, h, scale, state); +- final PixelCountSoftReference ref; +- lock.readLock().lock(); +- try { +- ref = map.get(hash); +- } finally { +- lock.readLock().unlock(); +- } +- // check reference has not been lost and the key truly matches, +- // in case of false positive hash match +- if (ref != null && ref.equals(config, w, h, scale, state)) { +- return ref.get(); +- } +- return null; +- } +- +- /** +- * Sets the cached image for the specified constraints. +- * +- * @param image The image to store in cache +- * @param config The graphics configuration, needed if cached image is a Volatile Image. Used as part of cache key +- * @param w The image width, used as part of cache key +- * @param h The image height, used as part of cache key +- * @param scale The image scale factor, used as part of cache key +- * @return true if the image could be cached, false otherwise. +- */ +- public boolean setImage(final Image image, +- final GraphicsConfiguration config, final int w, final int h, +- final int scale, final JRSUIState state) { +- if (state.is(JRSUIConstants.Animating.YES)) { +- return false; +- } +- +- final int hash = hash(config, w, h, scale, state); +- +- lock.writeLock().lock(); +- try { +- PixelCountSoftReference ref = map.get(hash); +- // check if currently in map +- if (ref != null && ref.get() == image) return true; +- +- // clear out old +- if (ref != null) { +- currentPixelCount -= ref.pixelCount; +- map.remove(hash); +- } +- +- // add new image to pixel count +- final int newPixelCount = image.getWidth(null) * image.getHeight(null); +- currentPixelCount += newPixelCount; +- // clean out lost references if not enough space +- if (currentPixelCount > maxPixelCount) { +- while ((ref = (PixelCountSoftReference)referenceQueue.poll()) != null) { +- //reference lost +- map.remove(ref.hash); +- currentPixelCount -= ref.pixelCount; +- } +- } +- +- // remove old items till there is enough free space +- if (currentPixelCount > maxPixelCount) { +- final Iterator<Map.Entry<Integer, PixelCountSoftReference>> mapIter = map.entrySet().iterator(); +- while ((currentPixelCount > maxPixelCount) && mapIter.hasNext()) { +- final Map.Entry<Integer, PixelCountSoftReference> entry = mapIter.next(); +- mapIter.remove(); +- final Image img = entry.getValue().get(); +- if (img != null) img.flush(); +- currentPixelCount -= entry.getValue().pixelCount; +- } +- } +- // finally put new in map +- map.put(hash, new PixelCountSoftReference(image, referenceQueue, newPixelCount, hash, config, w, h, scale, state)); +- return true; +- } finally { +- lock.writeLock().unlock(); +- } +- } +- +- private static int hash(final GraphicsConfiguration config, final int w, +- final int h, final int scale, +- final JRSUIState state) { +- int hash = config != null ? config.hashCode() : 0; +- hash = 31 * hash + w; +- hash = 31 * hash + h; +- hash = 31 * hash + scale; +- hash = 31 * hash + state.hashCode(); +- return hash; +- } +- +- /** +- * Extended SoftReference that stores the pixel count even after the image +- * is lost. +- */ +- private static class PixelCountSoftReference extends SoftReference<Image> { +- +- // default access, because access to these fields shouldn't be emulated +- // by a synthetic accessor. +- final int pixelCount; +- final int hash; +- +- // key parts +- private final GraphicsConfiguration config; +- private final int w; +- private final int h; +- private final int scale; +- private final JRSUIState state; +- +- PixelCountSoftReference(final Image referent, +- final ReferenceQueue<? super Image> q, final int pixelCount, +- final int hash, final GraphicsConfiguration config, final int w, +- final int h, final int scale, final JRSUIState state) { +- super(referent, q); +- this.pixelCount = pixelCount; +- this.hash = hash; +- this.config = config; +- this.w = w; +- this.h = h; +- this.scale = scale; +- this.state = state; +- } +- +- boolean equals(final GraphicsConfiguration config, final int w, +- final int h, final int scale, final JRSUIState state) { +- return config == this.config && w == this.w && h == this.h +- && scale == this.scale && state.equals(this.state); +- } +- } +- +-// /** Gets the rendered image for this painter at the requested size, either from cache or create a new one */ +-// private VolatileImage getImage(GraphicsConfiguration config, JComponent c, int w, int h, Object[] extendedCacheKeys) { +-// VolatileImage buffer = (VolatileImage)getImage(config, w, h, this, extendedCacheKeys); +-// +-// int renderCounter = 0; // to avoid any potential, though unlikely, infinite loop +-// do { +-// //validate the buffer so we can check for surface loss +-// int bufferStatus = VolatileImage.IMAGE_INCOMPATIBLE; +-// if (buffer != null) { +-// bufferStatus = buffer.validate(config); +-// } +-// +-// //If the buffer status is incompatible or restored, then we need to re-render to the volatile image +-// if (bufferStatus == VolatileImage.IMAGE_INCOMPATIBLE || bufferStatus == VolatileImage.IMAGE_RESTORED) { +-// // if the buffer isn't the right size, or has lost its contents, then recreate +-// if (buffer != null) { +-// if (buffer.getWidth() != w || buffer.getHeight() != h || bufferStatus == VolatileImage.IMAGE_INCOMPATIBLE) { +-// // clear any resources related to the old back buffer +-// buffer.flush(); +-// buffer = null; +-// } +-// } +-// +-// if (buffer == null) { +-// // recreate the buffer +-// buffer = config.createCompatibleVolatileImage(w, h, Transparency.TRANSLUCENT); +-// // put in cache for future +-// setImage(buffer, config, w, h, this, extendedCacheKeys); +-// } +-// +-// //create the graphics context with which to paint to the buffer +-// Graphics2D bg = buffer.createGraphics(); +-// +-// //clear the background before configuring the graphics +-// bg.setComposite(AlphaComposite.Clear); +-// bg.fillRect(0, 0, w, h); +-// bg.setComposite(AlphaComposite.SrcOver); +-// bg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); +-// +-// // paint the painter into buffer +-// paint0(bg, c, w, h, extendedCacheKeys); +-// //close buffer graphics +-// bg.dispose(); +-// } +-// } while (buffer.contentsLost() && renderCounter++ < 3); +-// +-// // check if we failed +-// if (renderCounter >= 3) return null; +-// +-// return buffer; +-// } +-} +--- ./jdk/src/macosx/classes/sun/java2d/opengl/CGLGraphicsConfig.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/java2d/opengl/CGLGraphicsConfig.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -30,9 +30,6 @@ + import java.awt.Component; + import java.awt.Graphics; + import java.awt.Graphics2D; +-import java.awt.GraphicsConfiguration; +-import java.awt.GraphicsDevice; +-import java.awt.GraphicsEnvironment; + import java.awt.Image; + import java.awt.ImageCapabilities; + import java.awt.Rectangle; +@@ -80,23 +77,34 @@ + private ContextCapabilities oglCaps; + private OGLContext context; + private final Object disposerReferent = new Object(); ++ private final int maxTextureSize; ++ + private static native boolean initCGL(); + private static native long getCGLConfigInfo(int displayID, int visualnum, + int swapInterval); + private static native int getOGLCapabilities(long configInfo); + ++ /** ++ * Returns GL_MAX_TEXTURE_SIZE from the shared opengl context. Must be ++ * called under OGLRQ lock, because this method change current context. ++ * ++ * @return GL_MAX_TEXTURE_SIZE ++ */ ++ private static native int nativeGetMaxTextureSize(); ++ + static { + cglAvailable = initCGL(); + } + + private CGLGraphicsConfig(CGraphicsDevice device, int pixfmt, +- long configInfo, ContextCapabilities oglCaps) +- { ++ long configInfo, int maxTextureSize, ++ ContextCapabilities oglCaps) { + super(device); + + this.pixfmt = pixfmt; + this.pConfigInfo = configInfo; + this.oglCaps = oglCaps; ++ this.maxTextureSize = maxTextureSize; + context = new OGLContext(OGLRenderQueue.getInstance(), this); + + // add a record to the Disposer so that we destroy the native +@@ -126,6 +134,7 @@ + } + + long cfginfo = 0; ++ int textureSize = 0; + final String ids[] = new String[1]; + OGLRenderQueue rq = OGLRenderQueue.getInstance(); + rq.lock(); +@@ -138,11 +147,14 @@ + cfginfo = getCGLConfigInfo(device.getCGDisplayID(), pixfmt, + kOpenGLSwapInterval); + if (cfginfo != 0L) { ++ textureSize = nativeGetMaxTextureSize(); ++ // 7160609: GL still fails to create a square texture of this ++ // size. Half should be safe enough. ++ // Explicitly not support a texture more than 2^14, see 8010999. ++ textureSize = textureSize <= 16384 ? textureSize / 2 : 8192; + OGLContext.setScratchSurface(cfginfo); +- rq.flushAndInvokeNow(new Runnable() { +- public void run() { +- ids[0] = OGLContext.getOGLIdString(); +- } ++ rq.flushAndInvokeNow(() -> { ++ ids[0] = OGLContext.getOGLIdString(); + }); + } + } finally { +@@ -154,8 +166,7 @@ + + int oglCaps = getOGLCapabilities(cfginfo); + ContextCapabilities caps = new OGLContextCaps(oglCaps, ids[0]); +- +- return new CGLGraphicsConfig(device, pixfmt, cfginfo, caps); ++ return new CGLGraphicsConfig(device, pixfmt, cfginfo, textureSize, caps); + } + + public static boolean isCGLAvailable() { +@@ -246,8 +257,6 @@ + } finally { + rq.unlock(); + } +- +- updateTotalDisplayBounds(); + } + + @Override +@@ -421,57 +430,15 @@ + AccelDeviceEventNotifier.removeListener(l); + } + +- private static final Rectangle totalDisplayBounds = new Rectangle(); +- +- private static void updateTotalDisplayBounds() { +- synchronized (totalDisplayBounds) { +- Rectangle virtualBounds = new Rectangle(); +- for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) { +- for (GraphicsConfiguration gc : gd.getConfigurations()) { +- virtualBounds = virtualBounds.union(gc.getBounds()); +- } +- } +- totalDisplayBounds.setBounds(virtualBounds); +- } +- } +- +- // 7160609: GL still fails to create a square texture of this size, +- // so we use this value to cap the total display bounds. +- native private static int getMaxTextureSize(); +- + @Override + public int getMaxTextureWidth() { +- //Temporary disable this logic and use some magic constrain. +- /* +- int width; +- +- synchronized (totalDisplayBounds) { +- if (totalDisplayBounds.width == 0) { +- updateTotalDisplayBounds(); +- } +- width = totalDisplayBounds.width; +- } +- +- return Math.min(width, getMaxTextureSize()); +- */ +- return getMaxTextureSize() / (getDevice().getScaleFactor() * 2); ++ return Math.max(maxTextureSize / getDevice().getScaleFactor(), ++ getBounds().width); + } + + @Override + public int getMaxTextureHeight() { +- //Temporary disable this logic and use some magic constrain. +- /* +- int height; +- +- synchronized (totalDisplayBounds) { +- if (totalDisplayBounds.height == 0) { +- updateTotalDisplayBounds(); +- } +- height = totalDisplayBounds.height; +- } +- +- return Math.min(height, getMaxTextureSize()); +- */ +- return getMaxTextureSize() / (getDevice().getScaleFactor() * 2); ++ return Math.max(maxTextureSize / getDevice().getScaleFactor(), ++ getBounds().height); + } + } +--- ./jdk/src/macosx/classes/sun/lwawt/LWChoicePeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/LWChoicePeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -168,16 +168,18 @@ + @Override + public void firePopupMenuWillBecomeVisible() { + super.firePopupMenuWillBecomeVisible(); +- SwingUtilities.invokeLater(new Runnable() { +- @Override +- public void run() { +- JPopupMenu popupMenu = getPopupMenu(); +- if (popupMenu != null) { +- if (popupMenu.getInvoker() != LWChoicePeer.this.getTarget()) { +- popupMenu.setVisible(false); +- popupMenu.show(LWChoicePeer.this.getTarget(), 0, 0); +- } +- } ++ SwingUtilities.invokeLater(() -> { ++ JPopupMenu popupMenu = getPopupMenu(); ++ // Need to override the invoker for proper grab handling ++ if (popupMenu != null ++ && popupMenu.isShowing() ++ && popupMenu.getInvoker() != getTarget()) { ++ // The popup is now visible with correct location ++ // Save it and restore after toggling visibility and changing invoker ++ Point loc = popupMenu.getLocationOnScreen(); ++ SwingUtilities.convertPointFromScreen(loc, this); ++ popupMenu.setVisible(false); ++ popupMenu.show(getTarget(), loc.x, loc.y); + } + }); + } +--- ./jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -319,6 +319,8 @@ + * subclasses to initialize specific peers properties. + */ + void initializeImpl() { ++ // note that these methods can be overridden by the user and ++ // can return some strange values like null. + setBackground(target.getBackground()); + setForeground(target.getForeground()); + setFont(target.getFont()); +--- ./jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Wed Jul 30 18:42:59 2014 +0100 +@@ -28,19 +28,18 @@ + import java.awt.*; + import java.awt.List; + import java.awt.datatransfer.*; +-import java.awt.dnd.*; +-import java.awt.dnd.peer.*; + import java.awt.image.*; + import java.awt.peer.*; + import java.security.*; + import java.util.*; + + import sun.awt.*; +-import sun.lwawt.macosx.*; + import sun.print.*; + import sun.security.util.SecurityConstants; + import sun.misc.ThreadGroupUtils; + ++import static sun.lwawt.LWWindowPeer.PeerType; ++ + public abstract class LWToolkit extends SunToolkit implements Runnable { + + private final static int STATE_NONE = 0; +@@ -103,7 +102,7 @@ + /* + * Sends a request to stop the message pump. + */ +- public void shutdown() { ++ public final void shutdown() { + setRunState(STATE_SHUTDOWN); + platformShutdown(); + } +@@ -134,7 +133,7 @@ + notifyAll(); + } + +- public boolean isTerminating() { ++ public final boolean isTerminating() { + return getRunState() >= STATE_SHUTDOWN; + } + +@@ -151,7 +150,8 @@ + } + } + +- public void run() { ++ @Override ++ public final void run() { + setRunState(STATE_INIT); + platformInit(); + AWTAutoShutdown.notifyToolkitThreadFree(); +@@ -203,80 +203,51 @@ + * Note that LWWindowPeer implements WindowPeer, FramePeer + * and DialogPeer interfaces. + */ +- private LWWindowPeer createDelegatedPeer(Window target, PlatformComponent platformComponent, +- PlatformWindow platformWindow, LWWindowPeer.PeerType peerType) +- { ++ protected LWWindowPeer createDelegatedPeer(Window target, ++ PlatformComponent platformComponent, ++ PlatformWindow platformWindow, ++ PeerType peerType) { + LWWindowPeer peer = new LWWindowPeer(target, platformComponent, platformWindow, peerType); + targetCreatedPeer(target, peer); + peer.initialize(); + return peer; + } + +- private LWLightweightFramePeer createDelegatedLwPeer(LightweightFrame target, +- PlatformComponent platformComponent, +- PlatformWindow platformWindow) +- { +- LWLightweightFramePeer peer = new LWLightweightFramePeer(target, platformComponent, platformWindow); ++ @Override ++ public final FramePeer createLightweightFrame(LightweightFrame target) { ++ PlatformComponent platformComponent = createLwPlatformComponent(); ++ PlatformWindow platformWindow = createPlatformWindow(PeerType.LW_FRAME); ++ LWLightweightFramePeer peer = new LWLightweightFramePeer(target, ++ platformComponent, ++ platformWindow); + targetCreatedPeer(target, peer); + peer.initialize(); + return peer; + } + + @Override +- public FramePeer createLightweightFrame(LightweightFrame target) { +- PlatformComponent platformComponent = createLwPlatformComponent(); +- PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.LW_FRAME); +- return createDelegatedLwPeer(target, platformComponent, platformWindow); ++ public final WindowPeer createWindow(Window target) { ++ PlatformComponent platformComponent = createPlatformComponent(); ++ PlatformWindow platformWindow = createPlatformWindow(PeerType.SIMPLEWINDOW); ++ return createDelegatedPeer(target, platformComponent, platformWindow, PeerType.SIMPLEWINDOW); + } + + @Override +- public WindowPeer createWindow(Window target) { ++ public final FramePeer createFrame(Frame target) { + PlatformComponent platformComponent = createPlatformComponent(); +- PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.SIMPLEWINDOW); +- return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.SIMPLEWINDOW); +- } +- +- @Override +- public FramePeer createFrame(Frame target) { +- PlatformComponent platformComponent = createPlatformComponent(); +- PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.FRAME); +- return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.FRAME); +- } +- +- public LWWindowPeer createEmbeddedFrame(CEmbeddedFrame target) { +- PlatformComponent platformComponent = createPlatformComponent(); +- PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.EMBEDDED_FRAME); +- return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.EMBEDDED_FRAME); +- } +- +- public LWWindowPeer createEmbeddedFrame(CViewEmbeddedFrame target) { +- PlatformComponent platformComponent = createPlatformComponent(); +- PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.VIEW_EMBEDDED_FRAME); +- return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.VIEW_EMBEDDED_FRAME); +- } +- +- +- CPrinterDialogPeer createCPrinterDialog(CPrinterDialog target) { +- PlatformComponent platformComponent = createPlatformComponent(); +- PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.DIALOG); +- CPrinterDialogPeer peer = new CPrinterDialogPeer(target, platformComponent, platformWindow); +- targetCreatedPeer(target, peer); +- return peer; ++ PlatformWindow platformWindow = createPlatformWindow(PeerType.FRAME); ++ return createDelegatedPeer(target, platformComponent, platformWindow, PeerType.FRAME); + } + + @Override + public DialogPeer createDialog(Dialog target) { +- if (target instanceof CPrinterDialog) { +- return createCPrinterDialog((CPrinterDialog)target); +- } +- + PlatformComponent platformComponent = createPlatformComponent(); +- PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.DIALOG); +- return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.DIALOG); ++ PlatformWindow platformWindow = createPlatformWindow(PeerType.DIALOG); ++ return createDelegatedPeer(target, platformComponent, platformWindow, PeerType.DIALOG); + } + + @Override +- public FileDialogPeer createFileDialog(FileDialog target) { ++ public final FileDialogPeer createFileDialog(FileDialog target) { + FileDialogPeer peer = createFileDialogPeer(target); + targetCreatedPeer(target, peer); + return peer; +@@ -285,7 +256,7 @@ + // ---- LIGHTWEIGHT COMPONENT PEERS ---- // + + @Override +- public ButtonPeer createButton(Button target) { ++ public final ButtonPeer createButton(Button target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWButtonPeer peer = new LWButtonPeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -294,7 +265,7 @@ + } + + @Override +- public CheckboxPeer createCheckbox(Checkbox target) { ++ public final CheckboxPeer createCheckbox(Checkbox target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWCheckboxPeer peer = new LWCheckboxPeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -303,12 +274,7 @@ + } + + @Override +- public CheckboxMenuItemPeer createCheckboxMenuItem(CheckboxMenuItem target) { +- throw new RuntimeException("not implemented"); +- } +- +- @Override +- public ChoicePeer createChoice(Choice target) { ++ public final ChoicePeer createChoice(Choice target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWChoicePeer peer = new LWChoicePeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -317,7 +283,7 @@ + } + + @Override +- public LabelPeer createLabel(Label target) { ++ public final LabelPeer createLabel(Label target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWLabelPeer peer = new LWLabelPeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -326,7 +292,7 @@ + } + + @Override +- public CanvasPeer createCanvas(Canvas target) { ++ public final CanvasPeer createCanvas(Canvas target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWCanvasPeer<?, ?> peer = new LWCanvasPeer<>(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -335,7 +301,7 @@ + } + + @Override +- public ListPeer createList(List target) { ++ public final ListPeer createList(List target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWListPeer peer = new LWListPeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -344,22 +310,7 @@ + } + + @Override +- public MenuPeer createMenu(Menu target) { +- throw new RuntimeException("not implemented"); +- } +- +- @Override +- public MenuBarPeer createMenuBar(MenuBar target) { +- throw new RuntimeException("not implemented"); +- } +- +- @Override +- public MenuItemPeer createMenuItem(MenuItem target) { +- throw new RuntimeException("not implemented"); +- } +- +- @Override +- public PanelPeer createPanel(Panel target) { ++ public final PanelPeer createPanel(Panel target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWPanelPeer peer = new LWPanelPeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -368,12 +319,7 @@ + } + + @Override +- public PopupMenuPeer createPopupMenu(PopupMenu target) { +- throw new RuntimeException("not implemented"); +- } +- +- @Override +- public ScrollPanePeer createScrollPane(ScrollPane target) { ++ public final ScrollPanePeer createScrollPane(ScrollPane target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWScrollPanePeer peer = new LWScrollPanePeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -382,7 +328,7 @@ + } + + @Override +- public ScrollbarPeer createScrollbar(Scrollbar target) { ++ public final ScrollbarPeer createScrollbar(Scrollbar target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWScrollBarPeer peer = new LWScrollBarPeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -391,7 +337,7 @@ + } + + @Override +- public TextAreaPeer createTextArea(TextArea target) { ++ public final TextAreaPeer createTextArea(TextArea target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWTextAreaPeer peer = new LWTextAreaPeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -400,7 +346,7 @@ + } + + @Override +- public TextFieldPeer createTextField(TextField target) { ++ public final TextFieldPeer createTextField(TextField target) { + PlatformComponent platformComponent = createPlatformComponent(); + LWTextFieldPeer peer = new LWTextFieldPeer(target, platformComponent); + targetCreatedPeer(target, peer); +@@ -411,56 +357,51 @@ + // ---- NON-COMPONENT PEERS ---- // + + @Override +- public ColorModel getColorModel() throws HeadlessException { +- return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getColorModel(); ++ public final ColorModel getColorModel() throws HeadlessException { ++ return GraphicsEnvironment.getLocalGraphicsEnvironment() ++ .getDefaultScreenDevice() ++ .getDefaultConfiguration().getColorModel(); + } + + @Override +- public boolean isDesktopSupported() { ++ public final boolean isDesktopSupported() { + return true; + } + + @Override +- protected DesktopPeer createDesktopPeer(Desktop target) { +- return new CDesktopPeer(); +- } +- +- @Override +- public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) { +- DragSourceContextPeer dscp = CDragSourceContextPeer.createDragSourceContextPeer(dge); +- +- return dscp; +- } +- +- @Override +- public KeyboardFocusManagerPeer getKeyboardFocusManagerPeer() { ++ public final KeyboardFocusManagerPeer getKeyboardFocusManagerPeer() { + return LWKeyboardFocusManagerPeer.getInstance(); + } + + @Override +- public synchronized MouseInfoPeer getMouseInfoPeer() { ++ public final synchronized MouseInfoPeer getMouseInfoPeer() { + if (mouseInfoPeer == null) { + mouseInfoPeer = createMouseInfoPeerImpl(); + } + return mouseInfoPeer; + } + +- protected MouseInfoPeer createMouseInfoPeerImpl() { ++ protected final MouseInfoPeer createMouseInfoPeerImpl() { + return new LWMouseInfoPeer(); + } + +- public PrintJob getPrintJob(Frame frame, String doctitle, Properties props) { ++ @Override ++ public final PrintJob getPrintJob(Frame frame, String doctitle, ++ Properties props) { + return getPrintJob(frame, doctitle, null, null); + } + +- public PrintJob getPrintJob(Frame frame, String doctitle, JobAttributes jobAttributes, PageAttributes pageAttributes) { ++ @Override ++ public final PrintJob getPrintJob(Frame frame, String doctitle, ++ JobAttributes jobAttributes, ++ PageAttributes pageAttributes) { + if (GraphicsEnvironment.isHeadless()) { + throw new IllegalArgumentException(); + } + + PrintJob2D printJob = new PrintJob2D(frame, doctitle, jobAttributes, pageAttributes); + +- if (printJob.printDialog() == false) { ++ if (!printJob.printDialog()) { + printJob = null; + } + +@@ -468,27 +409,7 @@ + } + + @Override +- public RobotPeer createRobot(Robot target, GraphicsDevice screen) { +- throw new RuntimeException("not implemented"); +- } +- +- @Override +- public boolean isTraySupported() { +- throw new RuntimeException("not implemented"); +- } +- +- @Override +- public SystemTrayPeer createSystemTray(SystemTray target) { +- throw new RuntimeException("not implemented"); +- } +- +- @Override +- public TrayIconPeer createTrayIcon(TrayIcon target) { +- throw new RuntimeException("not implemented"); +- } +- +- @Override +- public Clipboard getSystemClipboard() { ++ public final Clipboard getSystemClipboard() { + SecurityManager security = System.getSecurityManager(); + if (security != null) { + security.checkPermission(SecurityConstants.AWT.ACCESS_CLIPBOARD_PERMISSION); +@@ -502,7 +423,8 @@ + return clipboard; + } + +- protected abstract SecurityWarningWindow createSecurityWarning(Window ownerWindow, LWWindowPeer ownerPeer); ++ protected abstract SecurityWarningWindow createSecurityWarning( ++ Window ownerWindow, LWWindowPeer ownerPeer); + + // ---- DELEGATES ---- // + +@@ -511,7 +433,7 @@ + /* + * Creates a delegate for the given peer type (window, frame, dialog, etc.) + */ +- protected abstract PlatformWindow createPlatformWindow(LWWindowPeer.PeerType peerType); ++ protected abstract PlatformWindow createPlatformWindow(PeerType peerType); + + protected abstract PlatformComponent createPlatformComponent(); + +@@ -545,7 +467,7 @@ + } + + @Override +- public void grab(final Window w) { ++ public final void grab(final Window w) { + final Object peer = AWTAccessor.getComponentAccessor().getPeer(w); + if (peer != null) { + ((LWWindowPeer) peer).grab(); +@@ -553,7 +475,7 @@ + } + + @Override +- public void ungrab(final Window w) { ++ public final void ungrab(final Window w) { + final Object peer = AWTAccessor.getComponentAccessor().getPeer(w); + if (peer != null) { + ((LWWindowPeer) peer).ungrab(false); +--- ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -444,6 +444,12 @@ + } + + @Override ++ public void setBackground(final Color c) { ++ super.setBackground(c); ++ updateOpaque(); ++ } ++ ++ @Override + public void setOpacity(float opacity) { + getPlatformWindow().setOpacity(opacity); + repaintPeer(); +@@ -629,6 +635,7 @@ + final boolean isNewDevice = updateGraphicsDevice(); + if (resized || isNewDevice) { + replaceSurfaceData(); ++ updateMinimumSize(); + } + + // Third, COMPONENT_MOVED/COMPONENT_RESIZED/PAINT events +@@ -684,7 +691,7 @@ + public void notifyNCMouseDown() { + // Ungrab except for a click on a Dialog with the grabbing owner + if (grabbingWindow != null && +- grabbingWindow != getOwnerFrameDialog(this)) ++ !grabbingWindow.isOneOfOwnersOf(this)) + { + grabbingWindow.ungrab(); + } +@@ -779,7 +786,7 @@ + + // Ungrab only if this window is not an owned window of the grabbing one. + if (!isGrabbing() && grabbingWindow != null && +- grabbingWindow != getOwnerFrameDialog(this)) ++ !grabbingWindow.isOneOfOwnersOf(this)) + { + grabbingWindow.ungrab(); + } +@@ -1046,7 +1053,9 @@ + + @Override + public final void displayChanged() { +- updateGraphicsDevice(); ++ if (updateGraphicsDevice()) { ++ updateMinimumSize(); ++ } + // Replace surface unconditionally, because internal state of the + // GraphicsDevice could be changed. + replaceSurfaceData(); +@@ -1232,6 +1241,17 @@ + changeFocusedWindow(activate, null); + } + ++ private boolean isOneOfOwnersOf(LWWindowPeer peer) { ++ Window owner = (peer != null ? peer.getTarget().getOwner() : null); ++ while (owner != null) { ++ if ((LWWindowPeer)owner.getPeer() == this) { ++ return true; ++ } ++ owner = owner.getOwner(); ++ } ++ return false; ++ } ++ + /* + * Changes focused window on java level. + */ +@@ -1263,7 +1283,7 @@ + // - when the opposite (gaining focus) window is an owned/owner window. + // - for a simple window in any case. + if (!becomesFocused && +- (isGrabbing() || getOwnerFrameDialog(grabbingWindow) == this)) ++ (isGrabbing() || this.isOneOfOwnersOf(grabbingWindow))) + { + if (focusLog.isLoggable(PlatformLogger.Level.FINE)) { + focusLog.fine("ungrabbing on " + grabbingWindow); +@@ -1282,6 +1302,11 @@ + postEvent(windowEvent); + } + ++ /* ++ * Retrieves the owner of the peer. ++ * Note: this method returns the owner which can be activated, (i.e. the instance ++ * of Frame or Dialog may be returned). ++ */ + static LWWindowPeer getOwnerFrameDialog(LWWindowPeer peer) { + Window owner = (peer != null ? peer.getTarget().getOwner() : null); + while (owner != null && !(owner instanceof Frame || owner instanceof Dialog)) { +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -40,20 +40,23 @@ + * sun.awt.datatransfer.DataTransferer. + */ + +-public class CClipboard extends SunClipboard { ++final class CClipboard extends SunClipboard { + + public CClipboard(String name) { + super(name); + } + ++ @Override + public long getID() { + return 0; + } + ++ @Override + protected void clearNativeContext() { + // Leaving Empty, as WClipboard.clearNativeContext is empty as well. + } + ++ @Override + protected void setContentsNative(Transferable contents) { + FlavorTable flavorMap = getDefaultFlavorTable(); + // Don't use delayed Clipboard rendering for the Transferable's data. +@@ -89,6 +92,39 @@ + notifyChanged(); + } + ++ @Override ++ protected native long[] getClipboardFormats(); ++ @Override ++ protected native byte[] getClipboardData(long format) throws IOException; ++ ++ // 1.5 peer method ++ @Override ++ protected void unregisterClipboardViewerChecked() { ++ // no-op because we lack OS support. This requires 4048791, which requires 4048792 ++ } ++ ++ // 1.5 peer method ++ @Override ++ protected void registerClipboardViewerChecked() { ++ // no-op because we lack OS support. This requires 4048791, which requires 4048792 ++ } ++ ++ // 1.5 peer method ++ // no-op. This appears to be win32 specific. Filed 4048790 for investigation ++ //protected Transferable createLocaleTransferable(long[] formats) throws IOException; ++ ++ private native void declareTypes(long[] formats, SunClipboard newOwner); ++ private native void setData(byte[] data, long format); ++ ++ /** ++ * Invokes native check whether a change count on the general pasteboard is different ++ * than when we set it. The different count value means the current owner lost ++ * pasteboard ownership and someone else put data on the clipboard. ++ * @since 1.7 ++ */ ++ native void checkPasteboard(); ++ ++ /*** Native Callbacks ***/ + private void notifyLostOwnership() { + lostOwnershipImpl(); + } +@@ -100,32 +136,4 @@ + } + clipboard.checkChange(clipboard.getClipboardFormats()); + } +- +- protected native long[] getClipboardFormats(); +- protected native byte[] getClipboardData(long format) throws IOException; +- +- // 1.5 peer method +- protected void unregisterClipboardViewerChecked() { +- // no-op because we lack OS support. This requires 4048791, which requires 4048792 +- } +- +- // 1.5 peer method +- protected void registerClipboardViewerChecked() { +- // no-op because we lack OS support. This requires 4048791, which requires 4048792 +- } +- +- // 1.5 peer method +- // no-op. This appears to be win32 specific. Filed 4048790 for investigation +- //protected Transferable createLocaleTransferable(long[] formats) throws IOException; +- +- public native void declareTypes(long[] formats, SunClipboard newOwner); +- public native void setData(byte[] data, long format); +- +- /** +- * Invokes native check whether a change count on the general pasteboard is different +- * than when we set it. The different count value means the current owner lost +- * pasteboard ownership and someone else put data on the clipboard. +- * @since 1.7 +- */ +- public native void checkPasteboard(); + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CCustomCursor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CCustomCursor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -38,6 +38,8 @@ + + Image fImage; + Point fHotspot; ++ int fWidth; ++ int fHeight; + + public CCustomCursor(final Image cursor, final Point hotSpot, final String name) throws IndexOutOfBoundsException, HeadlessException { + super(name); +@@ -50,6 +52,7 @@ + // Make sure image is fully loaded. + final Component c = new Canvas(); // for its imageUpdate method + final MediaTracker tracker = new MediaTracker(c); ++ // MediaTracker loads resolution variants from MultiResolution Toolkit image + tracker.addImage(fImage, 0); + try { + tracker.waitForAll(); +@@ -67,15 +70,15 @@ + width = height = 1; + fImage = createTransparentImage(width, height); + } else { +- // Scale image to nearest supported size ++ // Get the nearest supported cursor size + final Dimension nativeSize = toolkit.getBestCursorSize(width, height); +- if (nativeSize.width != width || nativeSize.height != height) { +- fImage = fImage.getScaledInstance(nativeSize.width, nativeSize.height, Image.SCALE_DEFAULT); +- width = nativeSize.width; +- height = nativeSize.height; +- } ++ width = nativeSize.width; ++ height = nativeSize.height; + } + ++ fWidth = width; ++ fHeight = height; ++ + // NOTE: this was removed for 3169146, but in 1.5 the JCK tests for an exception and fails if one isn't thrown. + // See what JBuilder does. + // Verify that the hotspot is within cursor bounds. +@@ -138,6 +141,7 @@ + // failed to do its job. Return null to keep the cursor unchanged. + return 0L; + } else { ++ fCImage.resizeRepresentations(fWidth, fHeight); + return fCImage.ptr; + } + } catch (IllegalArgumentException iae) { +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CDataTransferer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CDataTransferer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -56,11 +56,11 @@ + }; + + static { +- Map<String, Long> nameMap = new HashMap<String, Long>(predefinedClipboardNames.length, 1.0f); +- Map<Long, String> formatMap = new HashMap<Long, String>(predefinedClipboardNames.length, 1.0f); ++ Map<String, Long> nameMap = new HashMap<>(predefinedClipboardNames.length, 1.0f); ++ Map<Long, String> formatMap = new HashMap<>(predefinedClipboardNames.length, 1.0f); + for (int i = 1; i < predefinedClipboardNames.length; i++) { +- nameMap.put(predefinedClipboardNames[i], new Long(i)); +- formatMap.put(new Long(i), predefinedClipboardNames[i]); ++ nameMap.put(predefinedClipboardNames[i], (long) i); ++ formatMap.put((long) i, predefinedClipboardNames[i]); + } + predefinedClipboardNameMap = Collections.synchronizedMap(nameMap); + predefinedClipboardFormatMap = Collections.synchronizedMap(formatMap); +@@ -77,19 +77,11 @@ + public static final int CF_PNG = 10; + public static final int CF_JPEG = 11; + +- public static final Long L_CF_TIFF = predefinedClipboardNameMap.get(predefinedClipboardNames[CF_TIFF]); +- +- // Image file formats with java.awt.Image representation: +- private static final Long[] imageFormats = new Long[] { +- L_CF_TIFF +- }; +- +- + private CDataTransferer() {} + + private static CDataTransferer fTransferer; + +- public static synchronized CDataTransferer getInstanceImpl() { ++ static synchronized CDataTransferer getInstanceImpl() { + if (fTransferer == null) { + fTransferer = new CDataTransferer(); + } +@@ -97,18 +89,22 @@ + return fTransferer; + } + ++ @Override + public String getDefaultUnicodeEncoding() { + return "utf-16le"; + } + ++ @Override + public boolean isLocaleDependentTextFormat(long format) { + return format == CF_STRING; + } + ++ @Override + public boolean isFileFormat(long format) { + return format == CF_FILE; + } + ++ @Override + public boolean isImageFormat(long format) { + int ifmt = (int)format; + switch(ifmt) { +@@ -122,43 +118,12 @@ + } + } + +- protected Long[] getImageFormatsAsLongArray() { +- return imageFormats; +- } +- +- public byte[] translateTransferable(Transferable contents, DataFlavor flavor, long format) throws IOException +- { +- byte[] bytes = super.translateTransferable(contents, flavor, format); +- +- // 9-12-02 VL: we may need to do something like Windows here. +- //if (format == CF_HTML) { +- // bytes = HTMLSupport.convertToHTMLFormat(bytes); +- //} +- +- return bytes; +- } +- +- protected Object translateBytesOrStream(InputStream stream, byte[] bytes, DataFlavor flavor, long format, +- Transferable transferable) throws IOException +- { +- // 5-28-03 VL: [Radar 3266030] +- // We need to do like Windows does here. +- if (format == CF_HTML && flavor.isFlavorTextType()) { +- if (stream == null) { +- stream = new ByteArrayInputStream(bytes); +- bytes = null; +- } +- +- stream = new HTMLDecodingInputStream(stream); +- } ++ @Override ++ public Object translateBytes(byte[] bytes, DataFlavor flavor, ++ long format, Transferable transferable) throws IOException { + + if (format == CF_URL && URL.class.equals(flavor.getRepresentationClass())) + { +- if (bytes == null) { +- bytes = inputStreamToByteArray(stream); +- stream = null; +- } +- + String charset = getDefaultTextCharset(); + if (transferable != null && transferable.isDataFlavorSupported(javaTextEncodingFlavor)) { + try { +@@ -175,9 +140,9 @@ + } + + return super.translateBytes(bytes, flavor, format, transferable); +- } ++ } + +- ++ @Override + synchronized protected Long getFormatForNativeAsLong(String str) { + Long format = predefinedClipboardNameMap.get(str); + +@@ -202,6 +167,7 @@ + // Get registered native format string for an index, return null if unknown: + private native String formatForIndex(long index); + ++ @Override + protected String getNativeForFormat(long format) { + String returnValue = null; + +@@ -209,7 +175,7 @@ + if (format >= 0 && format < predefinedClipboardNames.length) { + returnValue = predefinedClipboardNames[(int) format]; + } else { +- Long formatObj = new Long(format); ++ Long formatObj = format; + returnValue = predefinedClipboardFormatMap.get(formatObj); + + // predefinedClipboardFormatMap may not know this format: +@@ -233,10 +199,13 @@ + + private final ToolkitThreadBlockedHandler handler = new CToolkitThreadBlockedHandler(); + ++ @Override + public ToolkitThreadBlockedHandler getToolkitThreadBlockedHandler() { + return handler; + } + ++ private native byte[] imageDataToPlatformImageBytes(int[] rData, int nW, int nH); ++ @Override + protected byte[] imageToPlatformBytes(Image image, long format) { + int w = image.getWidth(null); + int h = image.getHeight(null); +@@ -252,32 +221,28 @@ + } + + private static native String[] nativeDragQueryFile(final byte[] bytes); ++ @Override + protected String[] dragQueryFile(final byte[] bytes) { + if (bytes == null) return null; + if (new String(bytes).startsWith("Unsupported type")) return null; + return nativeDragQueryFile(bytes); + } + +- private native byte[] imageDataToPlatformImageBytes(int[] rData, int nW, int nH); +- ++ private native Image getImageForByteStream(byte[] bytes); + /** + * Translates a byte array which contains + * platform-specific image data in the given format into an Image. + */ +- protected Image platformImageBytesToImage(byte[] bytes, long format) +- throws IOException +- { ++ @Override ++ protected Image platformImageBytesToImage(byte[] bytes, long format) throws IOException { + return getImageForByteStream(bytes); + } + +- private native Image getImageForByteStream(byte[] bytes); +- + @Override + protected ByteArrayOutputStream convertFileListToBytes(ArrayList<String> fileList) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); +- for (int i = 0; i < fileList.size(); i++) +- { +- byte[] bytes = fileList.get(i).getBytes(); ++ for (String file : fileList) { ++ byte[] bytes = file.getBytes(); + bos.write(bytes, 0, bytes.length); + bos.write(0); + } +@@ -303,246 +268,3 @@ + } + + +-// ---- Code borrowed from WDataTransferer: ---- +-// This will come handy for supporting HTML data. +- +-final class HTMLSupport { +- public static final String ENCODING = "UTF-8"; +- +- public static final String VERSION = "Version:"; +- public static final String START_HTML = "StartHTML:"; +- public static final String END_HTML = "EndHTML:"; +- public static final String START_FRAGMENT = "StartFragment:"; +- public static final String END_FRAGMENT = "EndFragment:"; +- public static final String START_FRAGMENT_CMT = "<!--StartFragment-->"; +- public static final String END_FRAGMENT_CMT = "<!--EndFragment-->"; +- public static final String EOLN = "\r\n"; +- +- private static final String VERSION_NUM = "0.9"; +- private static final String HTML_START_END = "-1"; +- +- private static final int PADDED_WIDTH = 10; +- +- private static final int HEADER_LEN = +- VERSION.length() + VERSION_NUM.length() + EOLN.length() + +- START_HTML.length() + HTML_START_END.length() + EOLN.length() + +- END_HTML.length() + HTML_START_END.length() + EOLN.length() + +- START_FRAGMENT.length() + PADDED_WIDTH + EOLN.length() + +- END_FRAGMENT.length() + PADDED_WIDTH + EOLN.length() + +- START_FRAGMENT_CMT.length() + EOLN.length(); +- private static final String HEADER_LEN_STR = +- toPaddedString(HEADER_LEN, PADDED_WIDTH); +- +- private static final String TRAILER = END_FRAGMENT_CMT + EOLN + '\0'; +- +- private static String toPaddedString(int n, int width) { +- String string = "" + n; +- int len = string.length(); +- if (n >= 0 && len < width) { +- char[] array = new char[width - len]; +- Arrays.fill(array, '0'); +- StringBuffer buffer = new StringBuffer(); +- buffer.append(array); +- buffer.append(string); +- string = buffer.toString(); +- } +- return string; +- } +- +- public static byte[] convertToHTMLFormat(byte[] bytes) { +- StringBuffer header = new StringBuffer(HEADER_LEN); +- header.append(VERSION); +- header.append(VERSION_NUM); +- header.append(EOLN); +- header.append(START_HTML); +- header.append(HTML_START_END); +- header.append(EOLN); +- header.append(END_HTML); +- header.append(HTML_START_END); +- header.append(EOLN); +- header.append(START_FRAGMENT); +- header.append(HEADER_LEN_STR); +- header.append(EOLN); +- header.append(END_FRAGMENT); +- // Strip terminating NUL byte from array +- header.append(toPaddedString(HEADER_LEN + bytes.length - 1, +- PADDED_WIDTH)); +- header.append(EOLN); +- header.append(START_FRAGMENT_CMT); +- header.append(EOLN); +- +- byte[] headerBytes = null, trailerBytes = null; +- +- try { +- headerBytes = new String(header).getBytes(ENCODING); +- trailerBytes = TRAILER.getBytes(ENCODING); +- } catch (UnsupportedEncodingException cannotHappen) { +- } +- +- byte[] retval = new byte[headerBytes.length + bytes.length - 1 + +- trailerBytes.length]; +- +- System.arraycopy(headerBytes, 0, retval, 0, headerBytes.length); +- System.arraycopy(bytes, 0, retval, headerBytes.length, +- bytes.length - 1); +- System.arraycopy(trailerBytes, 0, retval, +- headerBytes.length + bytes.length - 1, +- trailerBytes.length); +- +- return retval; +- } +-} +- +-/** +-* This stream takes an InputStream which provides data in CF_HTML format, +- * strips off the description and context to extract the original HTML data. +- */ +-class HTMLDecodingInputStream extends InputStream { +- +- private final BufferedInputStream bufferedStream; +- private boolean descriptionParsed = false; +- private boolean closed = false; +- private int index; +- private int end; +- +- // InputStreamReader uses an 8K buffer. The size is not customizable. +- public static final int BYTE_BUFFER_LEN = 8192; +- +- // CharToByteUTF8.getMaxBytesPerChar returns 3, so we should not buffer +- // more chars than 3 times the number of bytes we can buffer. +- public static final int CHAR_BUFFER_LEN = BYTE_BUFFER_LEN / 3; +- +- private static final String FAILURE_MSG = +- "Unable to parse HTML description: "; +- private static final String INVALID_MSG = " invalid"; +- +- public HTMLDecodingInputStream(InputStream bytestream) throws IOException { +- bufferedStream = new BufferedInputStream(bytestream, BYTE_BUFFER_LEN); +- } +- +- private void parseDescription() throws IOException { +- bufferedStream.mark(BYTE_BUFFER_LEN); +- +- BufferedReader bufferedReader = new BufferedReader +- (new InputStreamReader(bufferedStream, HTMLSupport.ENCODING), +- CHAR_BUFFER_LEN); +- String version = bufferedReader.readLine().trim(); +- if (version == null || !version.startsWith(HTMLSupport.VERSION)) { +- // Not MS-compliant HTML text. Return raw text from read(). +- index = 0; +- end = -1; +- bufferedStream.reset(); +- return; +- } +- +- String input; +- boolean startHTML, endHTML, startFragment, endFragment; +- startHTML = endHTML = startFragment = endFragment = false; +- +- try { +- do { +- input = bufferedReader.readLine().trim(); +- if (input == null) { +- close(); +- throw new IOException(FAILURE_MSG); +- } else if (input.startsWith(HTMLSupport.START_HTML)) { +- int val = Integer.parseInt +- (input.substring(HTMLSupport.START_HTML.length(), +- input.length()).trim()); +- if (val >= 0) { +- index = val; +- startHTML = true; +- } else if (val != -1) { +- close(); +- throw new IOException(FAILURE_MSG + +- HTMLSupport.START_HTML + +- INVALID_MSG); +- } +- } else if (input.startsWith(HTMLSupport.END_HTML)) { +- int val = Integer.parseInt +- (input.substring(HTMLSupport.END_HTML.length(), +- input.length()).trim()); +- if (val >= 0) { +- end = val; +- endHTML = true; +- } else if (val != -1) { +- close(); +- throw new IOException(FAILURE_MSG + +- HTMLSupport.END_HTML + +- INVALID_MSG); +- } +- } else if (!startHTML && !endHTML && +- input.startsWith(HTMLSupport.START_FRAGMENT)) { +- index = Integer.parseInt +- (input.substring(HTMLSupport.START_FRAGMENT.length(), +- input.length()).trim()); +- if (index < 0) { +- close(); +- throw new IOException(FAILURE_MSG + +- HTMLSupport.START_FRAGMENT + +- INVALID_MSG); +- } +- startFragment = true; +- } else if (!startHTML && !endHTML && +- input.startsWith(HTMLSupport.END_FRAGMENT)) { +- end = Integer.parseInt +- (input.substring(HTMLSupport.END_FRAGMENT.length(), +- input.length()).trim()); +- if (end < 0) { +- close(); +- throw new IOException(FAILURE_MSG + +- HTMLSupport.END_FRAGMENT + +- INVALID_MSG); +- } +- endFragment = true; +- } +- } while (!((startHTML && endHTML) || +- (startFragment && endFragment))); +- } catch (NumberFormatException e) { +- close(); +- throw new IOException(FAILURE_MSG + e); +- } +- +- bufferedStream.reset(); +- +- for (int i = 0; i < index; i++) { +- if (bufferedStream.read() == -1) { +- close(); +- throw new IOException(FAILURE_MSG + +- "Byte stream ends in description."); +- } +- } +- } +- +- public int read() throws IOException { +- if (closed) { +- throw new IOException("Stream closed"); +- } +- +- if (!descriptionParsed) { +- parseDescription(); // initializes 'index' and 'end' +- descriptionParsed = true; +- } +- +- if (end != -1 && index >= end) { +- return -1; +- } +- +- int retval = bufferedStream.read(); +- if (retval == -1) { +- index = end = 0; // so future read() calls will fail quickly +- return -1; +- } +- +- index++; +- // System.out.print((char)retval); +- return retval; +- } +- +- public void close() throws IOException { +- if (!closed) { +- closed = true; +- bufferedStream.close(); +- } +- } +-} +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,17 +23,15 @@ + * questions. + */ + ++ + package sun.lwawt.macosx; + +-import sun.lwawt.LWToolkit; +-import sun.lwawt.LWWindowPeer; +-import sun.lwawt.macosx.CocoaConstants; +-import sun.lwawt.macosx.event.NSEvent; ++import java.awt.AWTKeyStroke; ++import java.awt.Point; ++import java.awt.Toolkit; + + import sun.awt.EmbeddedFrame; +- +-import java.awt.*; +-import java.awt.event.*; ++import sun.lwawt.LWWindowPeer; + + public class CEmbeddedFrame extends EmbeddedFrame { + +@@ -48,7 +46,7 @@ + + public void addNotify() { + if (getPeer() == null) { +- LWToolkit toolkit = (LWToolkit)Toolkit.getDefaultToolkit(); ++ LWCToolkit toolkit = (LWCToolkit)Toolkit.getDefaultToolkit(); + LWWindowPeer peer = toolkit.createEmbeddedFrame(this); + setPeer(peer); + responder = new CPlatformResponder(peer, true); +@@ -98,7 +96,8 @@ + public void handleKeyEvent(int eventType, int modifierFlags, String characters, + String charsIgnoringMods, boolean isRepeat, short keyCode, + boolean needsKeyTyped) { +- responder.handleKeyEvent(eventType, modifierFlags, charsIgnoringMods, keyCode, needsKeyTyped, isRepeat); ++ responder.handleKeyEvent(eventType, modifierFlags, characters, charsIgnoringMods, ++ keyCode, needsKeyTyped, isRepeat); + } + + public void handleInputEvent(String text) { +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CFileDialog.java Wed Jul 30 18:42:59 2014 +0100 +@@ -46,17 +46,16 @@ + @Override + public void run() { + try { +- boolean navigateApps = false; ++ boolean navigateApps = !AccessController.doPrivileged( ++ new GetBooleanAction("apple.awt.use-file-dialog-packages")); ++ boolean chooseDirectories = AccessController.doPrivileged( ++ new GetBooleanAction("apple.awt.fileDialogForDirectories")); ++ + int dialogMode = target.getMode(); +- +- navigateApps = true; +- + String title = target.getTitle(); + if (title == null) { + title = " "; + } +- Boolean chooseDirectories = AccessController.doPrivileged( +- new GetBooleanAction("apple.awt.fileDialogForDirectories")); + + String[] userFileNames = nativeRunFileDialog(title, + dialogMode, +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CImage.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CImage.java Wed Jul 30 18:42:59 2014 +0100 +@@ -31,6 +31,8 @@ + + import java.util.Arrays; + import java.util.List; ++import sun.awt.image.MultiResolutionImage; ++import sun.awt.image.MultiResolutionBufferedImage; + + import sun.awt.image.SunWritableRaster; + +@@ -41,9 +43,11 @@ + private static native long nativeCreateNSImageOfFileFromLaunchServices(String file); + private static native long nativeCreateNSImageFromImageName(String name); + private static native long nativeCreateNSImageFromIconSelector(int selector); +- private static native void nativeCopyNSImageIntoArray(long image, int[] buffer, int w, int h); ++ private static native void nativeCopyNSImageIntoArray(long image, int[] buffer, int sw, int sh, int dw, int dh); + private static native Dimension2D nativeGetNSImageSize(long image); + private static native void nativeSetNSImageSize(long image, double w, double h); ++ private static native void nativeResizeNSImageRepresentations(long image, double w, double h); ++ private static native Dimension2D[] nativeGetNSImageRepresentationSizes(long image, double w, double h); + + static Creator creator = new Creator(); + static Creator getCreator() { +@@ -145,6 +149,12 @@ + + // This is used to create a CImage from a Image + public CImage createFromImage(final Image image) { ++ if (image instanceof MultiResolutionImage) { ++ List<Image> resolutionVariants ++ = ((MultiResolutionImage) image).getResolutionVariants(); ++ return createFromImages(resolutionVariants); ++ } ++ + int[] buffer = imageToArray(image, true); + if (buffer == null) { + return null; +@@ -202,18 +212,30 @@ + super(nsImagePtr, true); + } + +- /** @return A BufferedImage created from nsImagePtr, or null. */ +- public BufferedImage toImage() { ++ /** @return A MultiResolution image created from nsImagePtr, or null. */ ++ private BufferedImage toImage() { + if (ptr == 0) return null; + + final Dimension2D size = nativeGetNSImageSize(ptr); + final int w = (int)size.getWidth(); + final int h = (int)size.getHeight(); + +- final BufferedImage bimg = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE); ++ Dimension2D[] sizes ++ = nativeGetNSImageRepresentationSizes(ptr, ++ size.getWidth(), size.getHeight()); ++ ++ BufferedImage baseImage = toImage(w, h, w, h); ++ ++ return sizes == null || sizes.length < 2 ? baseImage ++ : new MultiResolutionBufferedImage(baseImage, sizes, ++ (width, height) -> toImage(w, h, width, height)); ++ } ++ ++ private BufferedImage toImage(int srcWidth, int srcHeight, int dstWidth, int dstHeight) { ++ final BufferedImage bimg = new BufferedImage(dstWidth, dstHeight, BufferedImage.TYPE_INT_ARGB_PRE); + final DataBufferInt dbi = (DataBufferInt)bimg.getRaster().getDataBuffer(); + final int[] buffer = SunWritableRaster.stealData(dbi, 0); +- nativeCopyNSImageIntoArray(ptr, buffer, w, h); ++ nativeCopyNSImageIntoArray(ptr, buffer, srcWidth, srcHeight, dstWidth, dstHeight); + SunWritableRaster.markDirty(dbi); + return bimg; + } +@@ -223,4 +245,8 @@ + if (ptr != 0) nativeSetNSImageSize(ptr, w, h); + return this; + } ++ ++ void resizeRepresentations(double w, double h) { ++ if (ptr != 0) nativeResizeNSImageRepresentations(ptr, w, h); ++ } + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformLWWindow.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformLWWindow.java Wed Jul 30 18:42:59 2014 +0100 +@@ -29,12 +29,18 @@ + import java.awt.FontMetrics; + import java.awt.Graphics; + import java.awt.GraphicsDevice; ++import java.awt.GraphicsEnvironment; + import java.awt.Insets; + import java.awt.MenuBar; + import java.awt.Point; ++import java.awt.Rectangle; + import java.awt.Window; ++import sun.awt.CGraphicsDevice; ++import sun.awt.CGraphicsEnvironment; + import sun.awt.CausedFocusEvent; ++import sun.awt.LightweightFrame; + import sun.java2d.SurfaceData; ++import sun.lwawt.LWLightweightFramePeer; + import sun.lwawt.LWWindowPeer; + import sun.lwawt.PlatformWindow; + +@@ -73,11 +79,6 @@ + } + + @Override +- public GraphicsDevice getGraphicsDevice() { +- return null; +- } +- +- @Override + public SurfaceData getScreenSurface() { + return null; + } +@@ -199,4 +200,24 @@ + public long getLayerPtr() { + return 0; + } ++ ++ @Override ++ public GraphicsDevice getGraphicsDevice() { ++ CGraphicsEnvironment ge = (CGraphicsEnvironment)GraphicsEnvironment. ++ getLocalGraphicsEnvironment(); ++ ++ LWLightweightFramePeer peer = (LWLightweightFramePeer)getPeer(); ++ int scale = ((LightweightFrame)peer.getTarget()).getScaleFactor(); ++ ++ Rectangle bounds = ((LightweightFrame)peer.getTarget()).getHostBounds(); ++ for (GraphicsDevice d : ge.getScreenDevices()) { ++ if (d.getDefaultConfiguration().getBounds().intersects(bounds) && ++ ((CGraphicsDevice)d).getScaleFactor() == scale) ++ { ++ return d; ++ } ++ } ++ // We shouldn't be here... ++ return ge.getDefaultScreenDevice(); ++ } + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformResponder.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -28,7 +28,7 @@ + import sun.awt.SunToolkit; + import sun.lwawt.LWWindowPeer; + import sun.lwawt.PlatformEventNotifier; +-import sun.lwawt.macosx.event.NSEvent; ++ + import java.awt.Toolkit; + import java.awt.event.MouseEvent; + import java.awt.event.InputEvent; +@@ -125,7 +125,7 @@ + /** + * Handles key events. + */ +- void handleKeyEvent(int eventType, int modifierFlags, String chars, ++ void handleKeyEvent(int eventType, int modifierFlags, String chars, String charsIgnoringModifiers, + short keyCode, boolean needsKeyTyped, boolean needsKeyReleased) { + boolean isFlagsChangedEvent = + isNpapiCallback ? (eventType == CocoaConstants.NPCocoaEventFlagsChanged) : +@@ -153,7 +153,10 @@ + testChar = chars.charAt(0); + } + +- int[] in = new int[] {testChar, isDeadChar ? 1 : 0, modifierFlags, keyCode}; ++ char testCharIgnoringModifiers = charsIgnoringModifiers != null && charsIgnoringModifiers.length() > 0 ? ++ charsIgnoringModifiers.charAt(0) : KeyEvent.CHAR_UNDEFINED; ++ ++ int[] in = new int[] {testCharIgnoringModifiers, isDeadChar ? 1 : 0, modifierFlags, keyCode}; + int[] out = new int[3]; // [jkeyCode, jkeyLocation, deadChar] + + postsTyped = NSEvent.nsToJavaKeyInfo(in, out); +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -31,7 +31,6 @@ + import sun.awt.CGraphicsConfig; + import sun.awt.CGraphicsEnvironment; + import sun.lwawt.LWWindowPeer; +-import sun.lwawt.macosx.event.NSEvent; + + import sun.java2d.SurfaceData; + import sun.java2d.opengl.CGLLayer; +@@ -201,7 +200,7 @@ + } + + private void deliverKeyEvent(NSEvent event) { +- responder.handleKeyEvent(event.getType(), event.getModifierFlags(), ++ responder.handleKeyEvent(event.getType(), event.getModifierFlags(), event.getCharacters(), + event.getCharactersIgnoringModifiers(), event.getKeyCode(), true, false); + } + +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -119,6 +119,7 @@ + static final int NONACTIVATING = 1 << 24; + static final int IS_DIALOG = 1 << 25; + static final int IS_MODAL = 1 << 26; ++ static final int IS_POPUP = 1 << 27; + + static final int _STYLE_PROP_BITMASK = DECORATED | TEXTURED | UNIFIED | UTILITY | HUD | SHEET | CLOSEABLE | MINIMIZABLE | RESIZABLE; + +@@ -318,6 +319,7 @@ + styleBits = SET(styleBits, TEXTURED, false); + // Popups in applets don't activate applet's process + styleBits = SET(styleBits, NONACTIVATING, true); ++ styleBits = SET(styleBits, IS_POPUP, true); + } + + if (Window.Type.UTILITY.equals(target.getType())) { +@@ -583,7 +585,12 @@ + // setVisible could have changed the native maximized state + deliverZoom(true); + } else { +- switch (((Frame)target).getExtendedState()) { ++ int frameState = ((Frame)target).getExtendedState(); ++ if ((frameState & Frame.ICONIFIED) != 0) { ++ // Treat all state bit masks with ICONIFIED bit as ICONIFIED state. ++ frameState = Frame.ICONIFIED; ++ } ++ switch (frameState) { + case Frame.ICONIFIED: + CWrapper.NSWindow.miniaturize(nsWindowPtr); + break; +@@ -608,9 +615,7 @@ + // Add myself as a child + if (owner != null && owner.isVisible()) { + CWrapper.NSWindow.addChildWindow(owner.getNSWindowPtr(), nsWindowPtr, CWrapper.NSWindow.NSWindowAbove); +- if (target.isAlwaysOnTop()) { +- CWrapper.NSWindow.setLevel(nsWindowPtr, CWrapper.NSWindow.NSFloatingWindowLevel); +- } ++ applyWindowLevel(target); + } + + // Add my own children to myself +@@ -620,9 +625,7 @@ + CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow(); + if (pw != null && pw.isVisible()) { + CWrapper.NSWindow.addChildWindow(nsWindowPtr, pw.getNSWindowPtr(), CWrapper.NSWindow.NSWindowAbove); +- if (w.isAlwaysOnTop()) { +- CWrapper.NSWindow.setLevel(pw.getNSWindowPtr(), CWrapper.NSWindow.NSFloatingWindowLevel); +- } ++ pw.applyWindowLevel(w); + } + } + } +@@ -744,20 +747,22 @@ + @Override + public void setOpaque(boolean isOpaque) { + CWrapper.NSWindow.setOpaque(getNSWindowPtr(), isOpaque); +- boolean isTextured = (peer == null)? false : peer.isTextured(); +- if (!isOpaque && !isTextured) { +- long clearColor = CWrapper.NSColor.clearColor(); +- CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), clearColor); ++ boolean isTextured = (peer == null) ? false : peer.isTextured(); ++ if (!isTextured) { ++ if (!isOpaque) { ++ CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), 0); ++ } else if (peer != null) { ++ Color color = peer.getBackground(); ++ if (color != null) { ++ int rgb = color.getRGB(); ++ CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), rgb); ++ } ++ } + } + + //This is a temporary workaround. Looks like after 7124236 will be fixed + //the correct place for invalidateShadow() is CGLayer.drawInCGLContext. +- SwingUtilities.invokeLater(new Runnable() { +- @Override +- public void run() { +- invalidateShadow(); +- } +- }); ++ SwingUtilities.invokeLater(this::invalidateShadow); + } + + @Override +@@ -788,6 +793,10 @@ + if (prevWindowState == windowState) return; + + final long nsWindowPtr = getNSWindowPtr(); ++ if ((windowState & Frame.ICONIFIED) != 0) { ++ // Treat all state bit masks with ICONIFIED bit as ICONIFIED state. ++ windowState = Frame.ICONIFIED; ++ } + switch (windowState) { + case Frame.ICONIFIED: + if (prevWindowState == Frame.MAXIMIZED_BOTH) { +@@ -1041,8 +1050,14 @@ + CWrapper.NSWindow.addChildWindow(nsWindowOwnerPtr, nsWindowSelfPtr, CWrapper.NSWindow.NSWindowAbove); + } + +- if (target.isAlwaysOnTop()) { ++ applyWindowLevel(target); ++ } ++ ++ protected void applyWindowLevel(Window target) { ++ if (target.isAlwaysOnTop() && target.getType() != Window.Type.POPUP) { + CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSFloatingWindowLevel); ++ } else if (target.getType() == Window.Type.POPUP) { ++ CWrapper.NSWindow.setLevel(getNSWindowPtr(), CWrapper.NSWindow.NSPopUpMenuWindowLevel); + } + } + +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -41,7 +41,7 @@ + import sun.java2d.*; + import sun.print.*; + +-public class CPrinterJob extends RasterPrinterJob { ++public final class CPrinterJob extends RasterPrinterJob { + // NOTE: This uses RasterPrinterJob as a base, but it doesn't use + // all of the RasterPrinterJob functions. RasterPrinterJob will + // break down printing to pieces that aren't necessary under MacOSX +@@ -89,6 +89,7 @@ + * returns true. + * @see java.awt.GraphicsEnvironment#isHeadless + */ ++ @Override + public boolean printDialog() throws HeadlessException { + if (GraphicsEnvironment.isHeadless()) { + throw new HeadlessException(); +@@ -131,6 +132,7 @@ + * @see java.awt.GraphicsEnvironment#isHeadless + * @since 1.2 + */ ++ @Override + public PageFormat pageDialog(PageFormat page) throws HeadlessException { + if (GraphicsEnvironment.isHeadless()) { + throw new HeadlessException(); +@@ -156,12 +158,14 @@ + * @return clone of <code>page</code>, altered to describe a default + * <code>PageFormat</code>. + */ ++ @Override + public PageFormat defaultPage(PageFormat page) { + PageFormat newPage = (PageFormat)page.clone(); + getDefaultPage(newPage); + return newPage; + } + ++ @Override + protected void setAttributes(PrintRequestAttributeSet attributes) throws PrinterException { + super.setAttributes(attributes); + +@@ -216,7 +220,7 @@ + } + } + +- ++ @Override + public void print(PrintRequestAttributeSet attributes) throws PrinterException { + // NOTE: Some of this code is copied from RasterPrinterJob. + +@@ -343,6 +347,7 @@ + * Returns the resolution in dots per inch across the width + * of the page. + */ ++ @Override + protected double getXRes() { + // NOTE: This is not used in the CPrinterJob code path. + return 0; +@@ -352,6 +357,7 @@ + * Returns the resolution in dots per inch down the height + * of the page. + */ ++ @Override + protected double getYRes() { + // NOTE: This is not used in the CPrinterJob code path. + return 0; +@@ -362,6 +368,7 @@ + * Value is in device pixels. + * Not adjusted for orientation of the paper. + */ ++ @Override + protected double getPhysicalPrintableX(Paper p) { + // NOTE: This is not used in the CPrinterJob code path. + return 0; +@@ -372,6 +379,7 @@ + * Value is in device pixels. + * Not adjusted for orientation of the paper. + */ ++ @Override + protected double getPhysicalPrintableY(Paper p) { + // NOTE: This is not used in the CPrinterJob code path. + return 0; +@@ -382,6 +390,7 @@ + * Value is in device pixels. + * Not adjusted for orientation of the paper. + */ ++ @Override + protected double getPhysicalPrintableWidth(Paper p) { + // NOTE: This is not used in the CPrinterJob code path. + return 0; +@@ -392,6 +401,7 @@ + * Value is in device pixels. + * Not adjusted for orientation of the paper. + */ ++ @Override + protected double getPhysicalPrintableHeight(Paper p) { + // NOTE: This is not used in the CPrinterJob code path. + return 0; +@@ -402,6 +412,7 @@ + * Value is in device pixels. + * Not adjusted for orientation of the paper. + */ ++ @Override + protected double getPhysicalPageWidth(Paper p) { + // NOTE: This is not used in the CPrinterJob code path. + return 0; +@@ -412,6 +423,7 @@ + * Value is in device pixels. + * Not adjusted for orientation of the paper. + */ ++ @Override + protected double getPhysicalPageHeight(Paper p) { + // NOTE: This is not used in the CPrinterJob code path. + return 0; +@@ -429,6 +441,7 @@ + /** + * End a page. + */ ++ @Override + protected void endPage(PageFormat format, Printable painter, int index) throws PrinterException { + // NOTE: This is not used in the CPrinterJob code path. + throw new PrinterException(sShouldNotReachHere); +@@ -441,6 +454,7 @@ + * page. The width and height of the band is + * specified by the caller. + */ ++ @Override + protected void printBand(byte[] data, int x, int y, int width, int height) throws PrinterException { + // NOTE: This is not used in the CPrinterJob code path. + throw new PrinterException(sShouldNotReachHere); +@@ -450,6 +464,7 @@ + * Called by the print() method at the start of + * a print job. + */ ++ @Override + protected void startDoc() throws PrinterException { + // NOTE: This is not used in the CPrinterJob code path. + throw new PrinterException(sShouldNotReachHere); +@@ -459,12 +474,14 @@ + * Called by the print() method at the end of + * a print job. + */ ++ @Override + protected void endDoc() throws PrinterException { + // NOTE: This is not used in the CPrinterJob code path. + throw new PrinterException(sShouldNotReachHere); + } + + /* Called by cancelDoc */ ++ @Override + protected native void abortDoc(); + + /** +@@ -502,10 +519,12 @@ + /** + * validate the paper size against the current printer. + */ ++ @Override + protected native void validatePaper(Paper origPaper, Paper newPaper ); + + // The following methods are CPrinterJob specific. + ++ @Override + protected void finalize() { + if (fNSPrintInfo != -1) { + dispose(fNSPrintInfo); +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterJobDialog.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterJobDialog.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -29,7 +29,7 @@ + import java.awt.*; + import java.awt.print.*; + +-public class CPrinterJobDialog extends CPrinterDialog { ++final class CPrinterJobDialog extends CPrinterDialog { + private Pageable fPageable; + private boolean fAllowPrintToFile; + +@@ -39,5 +39,6 @@ + fAllowPrintToFile = allowPrintToFile; + } + ++ @Override + protected native boolean showDialog(); + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterPageDialog.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterPageDialog.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -29,7 +29,7 @@ + import java.awt.*; + import java.awt.print.*; + +-public class CPrinterPageDialog extends CPrinterDialog { ++final class CPrinterPageDialog extends CPrinterDialog { + private PageFormat fPage; + private Printable fPainter; + +@@ -39,5 +39,6 @@ + fPainter = painter; + } + ++ @Override + protected native boolean showDialog(); + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterSurfaceData.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPrinterSurfaceData.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -40,11 +40,11 @@ + // public static final SurfaceType IntArgbPQ = SurfaceType.IntArgb.deriveSubType(DESC_INT_ARGB_PQ); + public static final SurfaceType IntRgbPQ = SurfaceType.IntRgb.deriveSubType(DESC_INT_RGB_PQ); + +- public static SurfaceData createData(PageFormat pf, long context) { ++ static SurfaceData createData(PageFormat pf, long context) { + return new CPrinterSurfaceData(CPrinterGraphicsConfig.getConfig(pf), context); + } + +- public CPrinterSurfaceData(GraphicsConfiguration gc, long context) { ++ private CPrinterSurfaceData(GraphicsConfiguration gc, long context) { + super(IntRgbPQ, gc.getColorModel(), gc, gc.getBounds()); + initOps(context, this.fGraphicsStates, this.fGraphicsStatesObject, gc.getBounds().width, gc.getBounds().height); + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CTrayIcon.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CTrayIcon.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -27,7 +27,6 @@ + + import sun.awt.AWTAccessor; + import sun.awt.SunToolkit; +-import sun.lwawt.macosx.event.NSEvent; + + import javax.swing.*; + import java.awt.*; +@@ -76,8 +75,9 @@ + menuPeer = (CPopupMenu)popup.getPeer(); + if (menuPeer == null) { + popup.addNotify(); ++ menuPeer = (CPopupMenu)popup.getPeer(); + } +- }catch (Exception e){ ++ } catch (Exception e) { + e.printStackTrace(); + } + } +@@ -97,7 +97,12 @@ + //invocation from the AWTTrayIcon.m + public long getPopupMenuModel(){ + if(popup == null) { +- return 0L; ++ PopupMenu popupMenu = target.getPopupMenu(); ++ if (popupMenu != null) { ++ popup = popupMenu; ++ } else { ++ return 0L; ++ } + } + return checkAndCreatePopupPeer().getModel(); + } +@@ -134,6 +139,10 @@ + + dummyFrame.dispose(); + ++ if (popup != null) { ++ popup.removeNotify(); ++ } ++ + LWCToolkit.targetDisposedPeer(target, this); + target = null; + +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -22,14 +22,17 @@ + * or visit www.oracle.com if you need additional information or have any + * questions. + */ ++ ++ + package sun.lwawt.macosx; + + import java.awt.AWTKeyStroke; + import java.awt.Toolkit; + import java.lang.reflect.InvocationTargetException; ++ + import sun.awt.EmbeddedFrame; +-import sun.lwawt.LWToolkit; + import sun.lwawt.LWWindowPeer; ++ + /* + * The CViewEmbeddedFrame class is used in the SWT_AWT bridge. + * This is a part of public API and should not be renamed or moved +@@ -48,7 +51,7 @@ + @Override + public void addNotify() { + if (getPeer() == null) { +- LWToolkit toolkit = (LWToolkit) Toolkit.getDefaultToolkit(); ++ LWCToolkit toolkit = (LWCToolkit) Toolkit.getDefaultToolkit(); + setPeer(toolkit.createEmbeddedFrame(this)); + } + super.addNotify(); +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CWarningWindow.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CWarningWindow.java Wed Jul 30 18:42:59 2014 +0100 +@@ -247,10 +247,7 @@ + nsWindowPtr, CWrapper.NSWindow.NSWindowAbove); + + // do not allow security warning to be obscured by other windows +- if (ownerWindow.isAlwaysOnTop()) { +- CWrapper.NSWindow.setLevel(nsWindowPtr, +- CWrapper.NSWindow.NSFloatingWindowLevel); +- } ++ applyWindowLevel(ownerWindow); + } + } + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CWrapper.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CWrapper.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -25,73 +25,68 @@ + + package sun.lwawt.macosx; + +-import java.awt.geom.Rectangle2D; +- +-public final class CWrapper { ++final class CWrapper { + private CWrapper() { } + +- public static final class NSWindow { ++ static final class NSWindow { + // NSWindowOrderingMode +- public static final int NSWindowAbove = 1; +- public static final int NSWindowBelow = -1; +- public static final int NSWindowOut = 0; ++ static final int NSWindowAbove = 1; ++ static final int NSWindowBelow = -1; ++ static final int NSWindowOut = 0; + + // Window level constants + // The number of supported levels: (we'll use more in the future) +- public static final int MAX_WINDOW_LEVELS = 2; ++ static final int MAX_WINDOW_LEVELS = 3; + // The levels: (these are NOT real constants, these are keys. See native code.) +- public static final int NSNormalWindowLevel = 0; +- public static final int NSFloatingWindowLevel = 1; ++ static final int NSNormalWindowLevel = 0; ++ static final int NSFloatingWindowLevel = 1; ++ static final int NSPopUpMenuWindowLevel = 2; + + // 'level' is one of the keys defined above +- public static native void setLevel(long window, int level); ++ static native void setLevel(long window, int level); + +- public static native void makeKeyAndOrderFront(long window); +- public static native void makeKeyWindow(long window); +- public static native void makeMainWindow(long window); +- public static native boolean canBecomeMainWindow(long window); +- public static native boolean isKeyWindow(long window); ++ static native void makeKeyAndOrderFront(long window); ++ static native void makeKeyWindow(long window); ++ static native void makeMainWindow(long window); ++ static native boolean canBecomeMainWindow(long window); ++ static native boolean isKeyWindow(long window); + +- public static native void orderFront(long window); +- public static native void orderFrontRegardless(long window); +- public static native void orderWindow(long window, int ordered, long relativeTo); +- public static native void orderOut(long window); ++ static native void orderFront(long window); ++ static native void orderFrontRegardless(long window); ++ static native void orderWindow(long window, int ordered, long relativeTo); ++ static native void orderOut(long window); + +- public static native void addChildWindow(long parent, long child, int ordered); +- public static native void removeChildWindow(long parent, long child); ++ static native void addChildWindow(long parent, long child, int ordered); ++ static native void removeChildWindow(long parent, long child); + +- public static native void setFrame(long window, int x, int y, int w, int h, boolean display); ++ static native void setAlphaValue(long window, float alpha); ++ static native void setOpaque(long window, boolean opaque); + +- public static native void setAlphaValue(long window, float alpha); +- public static native void setOpaque(long window, boolean opaque); +- public static native void setBackgroundColor(long window, long color); ++ /** ++ * Sets background color of the NSWindow. ++ * ++ * @param window the pointer of the NSWindow ++ * @param color the color in argb format ++ */ ++ static native void setBackgroundColor(long window, int color); + +- public static native void miniaturize(long window); +- public static native void deminiaturize(long window); +- public static native boolean isZoomed(long window); +- public static native void zoom(long window); ++ static native void miniaturize(long window); ++ static native void deminiaturize(long window); ++ static native boolean isZoomed(long window); ++ static native void zoom(long window); + +- public static native void makeFirstResponder(long window, long responder); ++ static native void makeFirstResponder(long window, long responder); + } + +- public static final class NSView { +- public static native void addSubview(long view, long subview); +- public static native void removeFromSuperview(long view); ++ static final class NSView { ++ static native void addSubview(long view, long subview); ++ static native void removeFromSuperview(long view); + +- public static native void setFrame(long view, int x, int y, int w, int h); +- public static native Rectangle2D frame(long view); +- public static native long window(long view); ++ static native void setFrame(long view, int x, int y, int w, int h); ++ static native long window(long view); + +- public static native void setHidden(long view, boolean hidden); ++ static native void setHidden(long view, boolean hidden); + +- public static native void setToolTip(long view, String msg); +- } +- +- public static final class NSObject { +- public static native void release(long object); +- } +- +- public static final class NSColor { +- public static native long clearColor(); ++ static native void setToolTip(long view, String msg); + } + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -33,20 +33,26 @@ + import java.awt.event.InvocationEvent; + import java.awt.event.KeyEvent; + import java.awt.im.InputMethodHighlight; ++import java.awt.im.spi.InputMethodDescriptor; + import java.awt.peer.*; + import java.lang.reflect.*; ++import java.net.URL; + import java.security.*; + import java.util.*; + import java.util.concurrent.Callable; ++import java.net.MalformedURLException; + + import sun.awt.*; ++import sun.awt.datatransfer.DataTransferer; ++import sun.java2d.opengl.OGLRenderQueue; + import sun.lwawt.*; + import sun.lwawt.LWWindowPeer.PeerType; + import sun.security.action.GetBooleanAction; ++import sun.awt.image.MultiResolutionImage; + + import sun.util.CoreResourceBundleControl; + +-class NamedCursor extends Cursor { ++final class NamedCursor extends Cursor { + NamedCursor(String name) { + super(name); + } +@@ -72,6 +78,7 @@ + + ResourceBundle platformResources = java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction<ResourceBundle>() { ++ @Override + public ResourceBundle run() { + ResourceBundle platformResources = null; + try { +@@ -109,8 +116,6 @@ + private static final boolean inAWT; + + public LWCToolkit() { +- SunToolkit.setDataTransfererClassName("sun.lwawt.macosx.CDataTransferer"); +- + areExtraMouseButtonsEnabled = Boolean.parseBoolean(System.getProperty("sun.awt.enableExtraMouseButtons", "true")); + //set system property if not yet assigned + System.setProperty("sun.awt.enableExtraMouseButtons", ""+areExtraMouseButtonsEnabled); +@@ -131,18 +136,20 @@ + + private native void loadNativeColors(final int[] systemColors, final int[] appleColors); + ++ @Override + protected void loadSystemColors(final int[] systemColors) { + if (systemColors == null) return; + loadNativeColors(systemColors, appleColors); + } + + private static class AppleSpecificColor extends Color { +- int index; +- public AppleSpecificColor(int index) { ++ private final int index; ++ AppleSpecificColor(int index) { + super(appleColors[index]); + this.index = index; + } + ++ @Override + public int getRGB() { + return appleColors[index]; + } +@@ -150,31 +157,19 @@ + + /** + * Returns Apple specific colors that we may expose going forward. +- * + */ + public static Color getAppleColor(int color) { + return new AppleSpecificColor(color); + } + ++ // This is only called from native code. + static void systemColorsChanged() { +- // This is only called from native code. +- EventQueue.invokeLater(new Runnable() { +- public void run() { +- AccessController.doPrivileged (new PrivilegedAction<Object>() { +- public Object run() { +- try { +- final Method updateColorsMethod = SystemColor.class.getDeclaredMethod("updateSystemColors", new Class[0]); +- updateColorsMethod.setAccessible(true); +- updateColorsMethod.invoke(null, new Object[0]); +- } catch (final Throwable e) { +- e.printStackTrace(); +- // swallow this if something goes horribly wrong +- } +- return null; +- } +- }); +- } +- }); ++ EventQueue.invokeLater(() -> { ++ AccessController.doPrivileged ((PrivilegedAction<Object>) () -> { ++ AWTAccessor.getSystemColorAccessor().updateSystemColors(); ++ return null; ++ }); ++ }); + } + + public static LWCToolkit getLWCToolkit() { +@@ -190,13 +185,44 @@ + } else if (peerType == PeerType.LW_FRAME) { + return new CPlatformLWWindow(); + } else { +- assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME); ++ assert (peerType == PeerType.SIMPLEWINDOW ++ || peerType == PeerType.DIALOG ++ || peerType == PeerType.FRAME); + return new CPlatformWindow(); + } + } + ++ LWWindowPeer createEmbeddedFrame(CEmbeddedFrame target) { ++ PlatformComponent platformComponent = createPlatformComponent(); ++ PlatformWindow platformWindow = createPlatformWindow(PeerType.EMBEDDED_FRAME); ++ return createDelegatedPeer(target, platformComponent, platformWindow, PeerType.EMBEDDED_FRAME); ++ } ++ ++ LWWindowPeer createEmbeddedFrame(CViewEmbeddedFrame target) { ++ PlatformComponent platformComponent = createPlatformComponent(); ++ PlatformWindow platformWindow = createPlatformWindow(PeerType.VIEW_EMBEDDED_FRAME); ++ return createDelegatedPeer(target, platformComponent, platformWindow, PeerType.VIEW_EMBEDDED_FRAME); ++ } ++ ++ private CPrinterDialogPeer createCPrinterDialog(CPrinterDialog target) { ++ PlatformComponent platformComponent = createPlatformComponent(); ++ PlatformWindow platformWindow = createPlatformWindow(PeerType.DIALOG); ++ CPrinterDialogPeer peer = new CPrinterDialogPeer(target, platformComponent, platformWindow); ++ targetCreatedPeer(target, peer); ++ return peer; ++ } ++ + @Override +- protected SecurityWarningWindow createSecurityWarning(Window ownerWindow, LWWindowPeer ownerPeer) { ++ public DialogPeer createDialog(Dialog target) { ++ if (target instanceof CPrinterDialog) { ++ return createCPrinterDialog((CPrinterDialog)target); ++ } ++ return super.createDialog(target); ++ } ++ ++ @Override ++ protected SecurityWarningWindow createSecurityWarning(Window ownerWindow, ++ LWWindowPeer ownerPeer) { + return new CWarningWindow(ownerWindow, ownerPeer); + } + +@@ -248,13 +274,11 @@ + PopupMenuPeer peer = new CPopupMenu(target); + targetCreatedPeer(target, peer); + return peer; +- + } + + @Override + public SystemTrayPeer createSystemTray(SystemTray target) { +- SystemTrayPeer peer = new CSystemTray(); +- return peer; ++ return new CSystemTray(); + } + + @Override +@@ -265,56 +289,63 @@ + } + + @Override ++ protected DesktopPeer createDesktopPeer(Desktop target) { ++ return new CDesktopPeer(); ++ } ++ ++ @Override + public LWCursorManager getCursorManager() { + return CCursorManager.getInstance(); + } + + @Override +- public Cursor createCustomCursor(final Image cursor, final Point hotSpot, final String name) throws IndexOutOfBoundsException, HeadlessException { ++ public Cursor createCustomCursor(final Image cursor, final Point hotSpot, ++ final String name) ++ throws IndexOutOfBoundsException, HeadlessException { + return new CCustomCursor(cursor, hotSpot, name); + } + + @Override +- public Dimension getBestCursorSize(final int preferredWidth, final int preferredHeight) throws HeadlessException { ++ public Dimension getBestCursorSize(final int preferredWidth, ++ final int preferredHeight) ++ throws HeadlessException { + return CCustomCursor.getBestCursorSize(preferredWidth, preferredHeight); + } + + @Override + protected void platformCleanup() { + // TODO Auto-generated method stub +- + } + + @Override + protected void platformInit() { + // TODO Auto-generated method stub +- + } + + @Override + protected void platformRunMessage() { + // TODO Auto-generated method stub +- + } + + @Override + protected void platformShutdown() { + // TODO Auto-generated method stub +- + } + + class OSXPlatformFont extends sun.awt.PlatformFont + { +- public OSXPlatformFont(String name, int style) ++ OSXPlatformFont(String name, int style) + { + super(name, style); + } ++ @Override + protected char getMissingGlyphCharacter() + { + // Follow up for real implementation + return (char)0xfff8; // see http://developer.apple.com/fonts/LastResortFont/ + } + } ++ @Override + public FontPeer getFontPeer(String name, int style) { + return new OSXPlatformFont(name, style); + } +@@ -334,7 +365,7 @@ + @Override + protected void initializeDesktopProperties() { + super.initializeDesktopProperties(); +- Map <Object, Object> fontHints = new HashMap<Object, Object>(); ++ Map <Object, Object> fontHints = new HashMap<>(); + fontHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + fontHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + desktopProperties.put(SunToolkit.DESKTOPFONTHINTS, fontHints); +@@ -355,14 +386,8 @@ + desktopProperties.put("DnD.Cursor.CopyNoDrop", new NamedCursor("DnD.Cursor.CopyNoDrop")); + desktopProperties.put("DnD.Cursor.MoveNoDrop", new NamedCursor("DnD.Cursor.MoveNoDrop")); + desktopProperties.put("DnD.Cursor.LinkNoDrop", new NamedCursor("DnD.Cursor.LinkNoDrop")); +- + } + +- +-/* +- * The method returns true if some events were processed during that timeout. +- * @see sun.awt.SunToolkit#syncNativeQueue(long) +- */ + @Override + protected boolean syncNativeQueue(long timeout) { + return nativeSyncQueue(timeout); +@@ -385,8 +410,11 @@ + + @Override + public void sync() { +- // TODO Auto-generated method stub +- ++ // flush the OGL pipeline (this is a no-op if OGL is not enabled) ++ OGLRenderQueue.sync(); ++ // setNeedsDisplay() selector was sent to the appropriate CALayer so now ++ // we have to flush the native selectors queue. ++ flushNativeSelectors(); + } + + @Override +@@ -406,6 +434,7 @@ + * as Num Lock on PC keyboards is called Clear, doesn't lock + * anything and is used for entirely different purpose. + */ ++ @Override + public boolean getLockingKeyState(int keyCode) throws UnsupportedOperationException { + switch (keyCode) { + case KeyEvent.VK_NUM_LOCK: +@@ -425,10 +454,12 @@ + //Set to true by default. + private static boolean areExtraMouseButtonsEnabled = true; + ++ @Override + public boolean areExtraMouseButtonsEnabled() throws HeadlessException { + return areExtraMouseButtonsEnabled; + } + ++ @Override + public int getNumberOfButtons(){ + return BUTTONS; + } +@@ -439,6 +470,11 @@ + } + + @Override ++ public DataTransferer getDataTransferer() { ++ return CDataTransferer.getInstanceImpl(); ++ } ++ ++ @Override + public boolean isAlwaysOnTopSupported() { + return true; + } +@@ -486,6 +522,7 @@ + * @see java.awt.MenuShortcut + * @since JDK1.1 + */ ++ @Override + public int getMenuShortcutKeyMask() { + return Event.META_MASK; + } +@@ -493,13 +530,34 @@ + @Override + public Image getImage(final String filename) { + final Image nsImage = checkForNSImage(filename); +- if (nsImage != null) return nsImage; ++ if (nsImage != null) { ++ return nsImage; ++ } + +- return super.getImage(filename); ++ if (imageCached(filename)) { ++ return super.getImage(filename); ++ } ++ ++ String fileneame2x = getScaledImageName(filename); ++ return (imageExists(fileneame2x)) ++ ? getImageWithResolutionVariant(filename, fileneame2x) ++ : super.getImage(filename); + } + +- static final String nsImagePrefix = "NSImage://"; +- protected Image checkForNSImage(final String imageName) { ++ @Override ++ public Image getImage(URL url) { ++ ++ if (imageCached(url)) { ++ return super.getImage(url); ++ } ++ ++ URL url2x = getScaledImageURL(url); ++ return (imageExists(url2x)) ++ ? getImageWithResolutionVariant(url, url2x) : super.getImage(url); ++ } ++ ++ private static final String nsImagePrefix = "NSImage://"; ++ private Image checkForNSImage(final String imageName) { + if (imageName == null) return null; + if (!imageName.startsWith(nsImagePrefix)) return null; + return CImage.getCreator().createImageFromName(imageName.substring(nsImagePrefix.length())); +@@ -518,8 +576,9 @@ + synchronized(ret) { return ret[0]; } + } + +- public static <T> T invokeAndWait(final Callable<T> callable, Component component) throws Exception { +- final CallableWrapper<T> wrapper = new CallableWrapper<T>(callable); ++ public static <T> T invokeAndWait(final Callable<T> callable, ++ Component component) throws Exception { ++ final CallableWrapper<T> wrapper = new CallableWrapper<>(callable); + invokeAndWait(wrapper, component); + return wrapper.getResult(); + } +@@ -529,10 +588,11 @@ + T object; + Exception e; + +- public CallableWrapper(final Callable<T> callable) { ++ CallableWrapper(final Callable<T> callable) { + this.callable = callable; + } + ++ @Override + public void run() { + try { + object = callable.call(); +@@ -547,12 +607,16 @@ + } + } + +- // Kicks an event over to the appropriate eventqueue and waits for it to finish +- // To avoid deadlocking, we manually run the NSRunLoop while waiting +- // Any selector invoked using ThreadUtilities performOnMainThread will be processed in doAWTRunLoop +- // The InvocationEvent will call LWCToolkit.stopAWTRunLoop() when finished, which will stop our manual runloop +- // Does not dispatch native events while in the loop +- public static void invokeAndWait(Runnable runnable, Component component) throws InvocationTargetException { ++ /** ++ * Kicks an event over to the appropriate eventqueue and waits for it to ++ * finish To avoid deadlocking, we manually run the NSRunLoop while waiting ++ * Any selector invoked using ThreadUtilities performOnMainThread will be ++ * processed in doAWTRunLoop The InvocationEvent will call ++ * LWCToolkit.stopAWTRunLoop() when finished, which will stop our manual ++ * runloop Does not dispatch native events while in the loop ++ */ ++ public static void invokeAndWait(Runnable runnable, Component component) ++ throws InvocationTargetException { + final long mediator = createAWTRunLoopMediator(); + + InvocationEvent invocationEvent = +@@ -587,7 +651,8 @@ + } + } + +- public static void invokeLater(Runnable event, Component component) throws InvocationTargetException { ++ public static void invokeLater(Runnable event, Component component) ++ throws InvocationTargetException { + final InvocationEvent invocationEvent = + new InvocationEvent(component != null ? component : Toolkit.getDefaultToolkit(), event); + +@@ -616,16 +681,18 @@ + return getSystemEventQueueImpl(); + } + +- + // DnD support + +- public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException { +- DragSourceContextPeer dscp = CDragSourceContextPeer.createDragSourceContextPeer(dge); +- +- return dscp; ++ @Override ++ public DragSourceContextPeer createDragSourceContextPeer( ++ DragGestureEvent dge) throws InvalidDnDOperationException { ++ return CDragSourceContextPeer.createDragSourceContextPeer(dge); + } + +- public <T extends DragGestureRecognizer> T createDragGestureRecognizer(Class<T> abstractRecognizerClass, DragSource ds, Component c, int srcActions, DragGestureListener dgl) { ++ @Override ++ public <T extends DragGestureRecognizer> T createDragGestureRecognizer( ++ Class<T> abstractRecognizerClass, DragSource ds, Component c, ++ int srcActions, DragGestureListener dgl) { + DragGestureRecognizer dgr = null; + + // Create a new mouse drag gesture recognizer if we have a class match: +@@ -639,6 +706,7 @@ + /** + * Returns the default keyboard locale of the underlying operating system + */ ++ @Override + public Locale getDefaultKeyboardLocale() { + Locale locale = CInputMethod.getNativeLocale(); + +@@ -649,7 +717,8 @@ + return locale; + } + +- public java.awt.im.spi.InputMethodDescriptor getInputMethodAdapterDescriptor() { ++ @Override ++ public InputMethodDescriptor getInputMethodAdapterDescriptor() { + if (sInputMethodDescriptor == null) + sInputMethodDescriptor = new CInputMethodDescriptor(); + +@@ -665,12 +734,14 @@ + * @return style attribute map, or null + * @since 1.3 + */ ++ @Override + public Map mapInputMethodHighlight(InputMethodHighlight highlight) { + return CInputMethod.mapInputMethodHighlight(highlight); + } + + /** +- * Returns key modifiers used by Swing to set up a focus accelerator key stroke. ++ * Returns key modifiers used by Swing to set up a focus accelerator key ++ * stroke. + */ + @Override + public int getFocusAcceleratorKeyMask() { +@@ -678,8 +749,8 @@ + } + + /** +- * Tests whether specified key modifiers mask can be used to enter a printable +- * character. ++ * Tests whether specified key modifiers mask can be used to enter a ++ * printable character. + */ + @Override + public boolean isPrintableCharacterModifiersMask(int mods) { +@@ -700,19 +771,18 @@ + * Returns the value of "sun.awt.disableCALayers" property. Default + * value is {@code false}. + */ +- public synchronized static boolean getSunAwtDisableCALayers() { ++ public static synchronized boolean getSunAwtDisableCALayers() { + if (sunAwtDisableCALayers == null) { + sunAwtDisableCALayers = AccessController.doPrivileged( + new GetBooleanAction("sun.awt.disableCALayers")); + } +- return sunAwtDisableCALayers.booleanValue(); ++ return sunAwtDisableCALayers; + } + +- + /* + * Returns true if the application (one of its windows) owns keyboard focus. + */ +- public native boolean isApplicationActive(); ++ native boolean isApplicationActive(); + + /************************ + * Native methods section +@@ -733,11 +803,16 @@ + static void doAWTRunLoop(long mediator, boolean processEvents) { + doAWTRunLoopImpl(mediator, processEvents, inAWT); + } +- static private native void doAWTRunLoopImpl(long mediator, boolean processEvents, boolean inAWT); ++ private static native void doAWTRunLoopImpl(long mediator, boolean processEvents, boolean inAWT); + static native void stopAWTRunLoop(long mediator); + + private native boolean nativeSyncQueue(long timeout); + ++ /** ++ * Just spin a single empty block synchronously. ++ */ ++ private static native void flushNativeSelectors(); ++ + @Override + public Clipboard createPlatformClipboard() { + return new CClipboard("System"); +@@ -777,6 +852,7 @@ + return true; + } + ++ @Override + public boolean isSwingBackbufferTranslucencySupported() { + return true; + } +@@ -785,4 +861,36 @@ + public boolean enableInputMethodsForTextComponent() { + return true; + } ++ ++ private static URL getScaledImageURL(URL url) { ++ try { ++ String scaledImagePath = getScaledImageName(url.getPath()); ++ return scaledImagePath == null ? null : new URL(url.getProtocol(), ++ url.getHost(), url.getPort(), scaledImagePath); ++ } catch (MalformedURLException e) { ++ return null; ++ } ++ } ++ ++ private static String getScaledImageName(String path) { ++ if (!isValidPath(path)) { ++ return null; ++ } ++ ++ int slash = path.lastIndexOf('/'); ++ String name = (slash < 0) ? path : path.substring(slash + 1); ++ ++ if (name.contains("@2x")) { ++ return null; ++ } ++ ++ int dot = name.lastIndexOf('.'); ++ String name2x = (dot < 0) ? name + "@2x" ++ : name.substring(0, dot) + "@2x" + name.substring(dot); ++ return (slash < 0) ? name2x : path.substring(0, slash + 1) + name2x; ++ } ++ ++ private static boolean isValidPath(String path) { ++ return !path.isEmpty() && !path.endsWith("/") && !path.endsWith("."); ++ } + } +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/NSEvent.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/NSEvent.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,267 @@ ++/* ++ * 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 ++ * 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.lwawt.macosx; ++ ++import java.awt.event.*; ++ ++/** ++ * A class representing Cocoa NSEvent class with the fields only necessary for ++ * JDK functionality. ++ */ ++final class NSEvent { ++ private int type; ++ private int modifierFlags; ++ ++ // Mouse event information ++ private int clickCount; ++ private int buttonNumber; ++ private int x; ++ private int y; ++ private double scrollDeltaY; ++ private double scrollDeltaX; ++ private int absX; ++ private int absY; ++ ++ // Key event information ++ private short keyCode; ++ private String characters; ++ private String charactersIgnoringModifiers; ++ ++ // Called from native ++ NSEvent(int type, int modifierFlags, short keyCode, String characters, String charactersIgnoringModifiers) { ++ this.type = type; ++ this.modifierFlags = modifierFlags; ++ this.keyCode = keyCode; ++ this.characters = characters; ++ this.charactersIgnoringModifiers = charactersIgnoringModifiers; ++ } ++ ++ // Called from native ++ NSEvent(int type, int modifierFlags, int clickCount, int buttonNumber, ++ int x, int y, int absX, int absY, ++ double scrollDeltaY, double scrollDeltaX) { ++ this.type = type; ++ this.modifierFlags = modifierFlags; ++ this.clickCount = clickCount; ++ this.buttonNumber = buttonNumber; ++ this.x = x; ++ this.y = y; ++ this.absX = absX; ++ this.absY = absY; ++ this.scrollDeltaY = scrollDeltaY; ++ this.scrollDeltaX = scrollDeltaX; ++ } ++ ++ int getType() { ++ return type; ++ } ++ ++ int getModifierFlags() { ++ return modifierFlags; ++ } ++ ++ int getClickCount() { ++ return clickCount; ++ } ++ ++ int getButtonNumber() { ++ return buttonNumber; ++ } ++ ++ int getX() { ++ return x; ++ } ++ ++ int getY() { ++ return y; ++ } ++ ++ double getScrollDeltaY() { ++ return scrollDeltaY; ++ } ++ ++ double getScrollDeltaX() { ++ return scrollDeltaX; ++ } ++ ++ int getAbsX() { ++ return absX; ++ } ++ ++ int getAbsY() { ++ return absY; ++ } ++ ++ short getKeyCode() { ++ return keyCode; ++ } ++ ++ String getCharactersIgnoringModifiers() { ++ return charactersIgnoringModifiers; ++ } ++ ++ String getCharacters() { ++ return characters; ++ } ++ ++ @Override ++ public String toString() { ++ return "NSEvent[" + getType() + " ," + getModifierFlags() + " ," ++ + getClickCount() + " ," + getButtonNumber() + " ," + getX() + " ," ++ + getY() + " ," + getAbsX() + " ," + getAbsY()+ " ," + getKeyCode() + " ," ++ + getCharacters() + " ," + getCharactersIgnoringModifiers() + "]"; ++ } ++ ++ /* ++ * Converts an NSEvent button number to a MouseEvent constant. ++ */ ++ static int nsToJavaButton(int buttonNumber) { ++ int jbuttonNumber = buttonNumber + 1; ++ switch (buttonNumber) { ++ case CocoaConstants.kCGMouseButtonLeft: ++ jbuttonNumber = MouseEvent.BUTTON1; ++ break; ++ case CocoaConstants.kCGMouseButtonRight: ++ jbuttonNumber = MouseEvent.BUTTON3; ++ break; ++ case CocoaConstants.kCGMouseButtonCenter: ++ jbuttonNumber = MouseEvent.BUTTON2; ++ break; ++ } ++ return jbuttonNumber; ++ } ++ ++ /* ++ * Converts NPCocoaEvent types to AWT event types. ++ */ ++ static int npToJavaEventType(int npEventType) { ++ int jeventType = 0; ++ switch (npEventType) { ++ case CocoaConstants.NPCocoaEventMouseDown: ++ jeventType = MouseEvent.MOUSE_PRESSED; ++ break; ++ case CocoaConstants.NPCocoaEventMouseUp: ++ jeventType = MouseEvent.MOUSE_RELEASED; ++ break; ++ case CocoaConstants.NPCocoaEventMouseMoved: ++ jeventType = MouseEvent.MOUSE_MOVED; ++ break; ++ case CocoaConstants.NPCocoaEventMouseEntered: ++ jeventType = MouseEvent.MOUSE_ENTERED; ++ break; ++ case CocoaConstants.NPCocoaEventMouseExited: ++ jeventType = MouseEvent.MOUSE_EXITED; ++ break; ++ case CocoaConstants.NPCocoaEventMouseDragged: ++ jeventType = MouseEvent.MOUSE_DRAGGED; ++ break; ++ case CocoaConstants.NPCocoaEventKeyDown: ++ jeventType = KeyEvent.KEY_PRESSED; ++ break; ++ case CocoaConstants.NPCocoaEventKeyUp: ++ jeventType = KeyEvent.KEY_RELEASED; ++ break; ++ } ++ return jeventType; ++ } ++ ++ /* ++ * Converts NSEvent types to AWT event types. ++ */ ++ static int nsToJavaEventType(int nsEventType) { ++ int jeventType = 0; ++ switch (nsEventType) { ++ case CocoaConstants.NSLeftMouseDown: ++ case CocoaConstants.NSRightMouseDown: ++ case CocoaConstants.NSOtherMouseDown: ++ jeventType = MouseEvent.MOUSE_PRESSED; ++ break; ++ case CocoaConstants.NSLeftMouseUp: ++ case CocoaConstants.NSRightMouseUp: ++ case CocoaConstants.NSOtherMouseUp: ++ jeventType = MouseEvent.MOUSE_RELEASED; ++ break; ++ case CocoaConstants.NSMouseMoved: ++ jeventType = MouseEvent.MOUSE_MOVED; ++ break; ++ case CocoaConstants.NSLeftMouseDragged: ++ case CocoaConstants.NSRightMouseDragged: ++ case CocoaConstants.NSOtherMouseDragged: ++ jeventType = MouseEvent.MOUSE_DRAGGED; ++ break; ++ case CocoaConstants.NSMouseEntered: ++ jeventType = MouseEvent.MOUSE_ENTERED; ++ break; ++ case CocoaConstants.NSMouseExited: ++ jeventType = MouseEvent.MOUSE_EXITED; ++ break; ++ case CocoaConstants.NSScrollWheel: ++ jeventType = MouseEvent.MOUSE_WHEEL; ++ break; ++ case CocoaConstants.NSKeyDown: ++ jeventType = KeyEvent.KEY_PRESSED; ++ break; ++ case CocoaConstants.NSKeyUp: ++ jeventType = KeyEvent.KEY_RELEASED; ++ break; ++ } ++ return jeventType; ++ } ++ ++ /* ++ * Converts NSEvent mouse modifiers to AWT mouse modifiers. ++ */ ++ static native int nsToJavaMouseModifiers(int buttonNumber, ++ int modifierFlags); ++ ++ /* ++ * Converts NSEvent key modifiers to AWT key modifiers. ++ */ ++ static native int nsToJavaKeyModifiers(int modifierFlags); ++ ++ /* ++ * Converts NSEvent key info to AWT key info. ++ */ ++ static native boolean nsToJavaKeyInfo(int[] in, int[] out); ++ ++ /* ++ * Converts NSEvent key modifiers to AWT key info. ++ */ ++ static native void nsKeyModifiersToJavaKeyInfo(int[] in, int[] out); ++ ++ /* ++ * There is a small number of NS characters that need to be converted ++ * into other characters before we pass them to AWT. ++ */ ++ static native char nsToJavaChar(char nsChar, int modifierFlags); ++ ++ static boolean isPopupTrigger(int jmodifiers) { ++ final boolean isRightButtonDown = ((jmodifiers & InputEvent.BUTTON3_DOWN_MASK) != 0); ++ final boolean isLeftButtonDown = ((jmodifiers & InputEvent.BUTTON1_DOWN_MASK) != 0); ++ final boolean isControlDown = ((jmodifiers & InputEvent.CTRL_DOWN_MASK) != 0); ++ return isRightButtonDown || (isControlDown && isLeftButtonDown); ++ } ++} +--- ./jdk/src/macosx/classes/sun/lwawt/macosx/event/NSEvent.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/event/NSEvent.java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,260 +0,0 @@ +-/* +- * Copyright (c) 2011, 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. +- */ +- +-package sun.lwawt.macosx.event; +- +-import sun.lwawt.macosx.CocoaConstants; +-import java.awt.event.*; +- +-/** +- * A class representing Cocoa NSEvent class with the fields only necessary for +- * JDK functionality. +- */ +-public final class NSEvent { +- private int type; +- private int modifierFlags; +- +- // Mouse event information +- private int clickCount; +- private int buttonNumber; +- private int x; +- private int y; +- private double scrollDeltaY; +- private double scrollDeltaX; +- private int absX; +- private int absY; +- +- // Key event information +- private short keyCode; +- private String charactersIgnoringModifiers; +- +- public NSEvent(int type, int modifierFlags, short keyCode, String charactersIgnoringModifiers) { +- this.type = type; +- this.modifierFlags = modifierFlags; +- this.keyCode = keyCode; +- this.charactersIgnoringModifiers = charactersIgnoringModifiers; +- } +- +- public NSEvent(int type, int modifierFlags, int clickCount, int buttonNumber, +- int x, int y, int absX, int absY, +- double scrollDeltaY, double scrollDeltaX) { +- this.type = type; +- this.modifierFlags = modifierFlags; +- this.clickCount = clickCount; +- this.buttonNumber = buttonNumber; +- this.x = x; +- this.y = y; +- this.absX = absX; +- this.absY = absY; +- this.scrollDeltaY = scrollDeltaY; +- this.scrollDeltaX = scrollDeltaX; +- } +- +- public int getType() { +- return type; +- } +- +- public int getModifierFlags() { +- return modifierFlags; +- } +- +- public int getClickCount() { +- return clickCount; +- } +- +- public int getButtonNumber() { +- return buttonNumber; +- } +- +- public int getX() { +- return x; +- } +- +- public int getY() { +- return y; +- } +- +- public double getScrollDeltaY() { +- return scrollDeltaY; +- } +- +- public double getScrollDeltaX() { +- return scrollDeltaX; +- } +- +- public int getAbsX() { +- return absX; +- } +- +- public int getAbsY() { +- return absY; +- } +- +- public short getKeyCode() { +- return keyCode; +- } +- +- public String getCharactersIgnoringModifiers() { +- return charactersIgnoringModifiers; +- } +- +- @Override +- public String toString() { +- return "NSEvent[" + getType() + " ," + getModifierFlags() + " ," +- + getClickCount() + " ," + getButtonNumber() + " ," + getX() + " ," +- + getY() + " ," + getAbsX() + " ," + getAbsY()+ " ," + getKeyCode() + " ," +- + getCharactersIgnoringModifiers() + "]"; +- } +- +- /* +- * Converts an NSEvent button number to a MouseEvent constant. +- */ +- public static int nsToJavaButton(int buttonNumber) { +- int jbuttonNumber = buttonNumber + 1; +- switch (buttonNumber) { +- case CocoaConstants.kCGMouseButtonLeft: +- jbuttonNumber = MouseEvent.BUTTON1; +- break; +- case CocoaConstants.kCGMouseButtonRight: +- jbuttonNumber = MouseEvent.BUTTON3; +- break; +- case CocoaConstants.kCGMouseButtonCenter: +- jbuttonNumber = MouseEvent.BUTTON2; +- break; +- } +- return jbuttonNumber; +- } +- +- /* +- * Converts NPCocoaEvent types to AWT event types. +- */ +- public static int npToJavaEventType(int npEventType) { +- int jeventType = 0; +- switch (npEventType) { +- case CocoaConstants.NPCocoaEventMouseDown: +- jeventType = MouseEvent.MOUSE_PRESSED; +- break; +- case CocoaConstants.NPCocoaEventMouseUp: +- jeventType = MouseEvent.MOUSE_RELEASED; +- break; +- case CocoaConstants.NPCocoaEventMouseMoved: +- jeventType = MouseEvent.MOUSE_MOVED; +- break; +- case CocoaConstants.NPCocoaEventMouseEntered: +- jeventType = MouseEvent.MOUSE_ENTERED; +- break; +- case CocoaConstants.NPCocoaEventMouseExited: +- jeventType = MouseEvent.MOUSE_EXITED; +- break; +- case CocoaConstants.NPCocoaEventMouseDragged: +- jeventType = MouseEvent.MOUSE_DRAGGED; +- break; +- case CocoaConstants.NPCocoaEventKeyDown: +- jeventType = KeyEvent.KEY_PRESSED; +- break; +- case CocoaConstants.NPCocoaEventKeyUp: +- jeventType = KeyEvent.KEY_RELEASED; +- break; +- } +- return jeventType; +- } +- +- /* +- * Converts NSEvent types to AWT event types. +- */ +- public static int nsToJavaEventType(int nsEventType) { +- int jeventType = 0; +- switch (nsEventType) { +- case CocoaConstants.NSLeftMouseDown: +- case CocoaConstants.NSRightMouseDown: +- case CocoaConstants.NSOtherMouseDown: +- jeventType = MouseEvent.MOUSE_PRESSED; +- break; +- case CocoaConstants.NSLeftMouseUp: +- case CocoaConstants.NSRightMouseUp: +- case CocoaConstants.NSOtherMouseUp: +- jeventType = MouseEvent.MOUSE_RELEASED; +- break; +- case CocoaConstants.NSMouseMoved: +- jeventType = MouseEvent.MOUSE_MOVED; +- break; +- case CocoaConstants.NSLeftMouseDragged: +- case CocoaConstants.NSRightMouseDragged: +- case CocoaConstants.NSOtherMouseDragged: +- jeventType = MouseEvent.MOUSE_DRAGGED; +- break; +- case CocoaConstants.NSMouseEntered: +- jeventType = MouseEvent.MOUSE_ENTERED; +- break; +- case CocoaConstants.NSMouseExited: +- jeventType = MouseEvent.MOUSE_EXITED; +- break; +- case CocoaConstants.NSScrollWheel: +- jeventType = MouseEvent.MOUSE_WHEEL; +- break; +- case CocoaConstants.NSKeyDown: +- jeventType = KeyEvent.KEY_PRESSED; +- break; +- case CocoaConstants.NSKeyUp: +- jeventType = KeyEvent.KEY_RELEASED; +- break; +- } +- return jeventType; +- } +- +- /* +- * Converts NSEvent mouse modifiers to AWT mouse modifiers. +- */ +- public static native int nsToJavaMouseModifiers(int buttonNumber, +- int modifierFlags); +- +- /* +- * Converts NSEvent key modifiers to AWT key modifiers. +- */ +- public static native int nsToJavaKeyModifiers(int modifierFlags); +- +- /* +- * Converts NSEvent key info to AWT key info. +- */ +- public static native boolean nsToJavaKeyInfo(int[] in, int[] out); +- +- /* +- * Converts NSEvent key modifiers to AWT key info. +- */ +- public static native void nsKeyModifiersToJavaKeyInfo(int[] in, int[] out); +- +- /* +- * There is a small number of NS characters that need to be converted +- * into other characters before we pass them to AWT. +- */ +- public static native char nsToJavaChar(char nsChar, int modifierFlags); +- +- public static boolean isPopupTrigger(int jmodifiers) { +- final boolean isRightButtonDown = ((jmodifiers & InputEvent.BUTTON3_DOWN_MASK) != 0); +- final boolean isLeftButtonDown = ((jmodifiers & InputEvent.BUTTON1_DOWN_MASK) != 0); +- final boolean isControlDown = ((jmodifiers & InputEvent.CTRL_DOWN_MASK) != 0); +- return isRightButtonDown || (isControlDown && isLeftButtonDown); +- } +-} +--- ./jdk/src/macosx/classes/sun/nio/ch/KQueueArrayWrapper.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/classes/sun/nio/ch/KQueueArrayWrapper.java Wed Jul 30 18:42:59 2014 +0100 +@@ -53,10 +53,6 @@ + */ + + class KQueueArrayWrapper { +- // Event masks +- static final short POLLIN = AbstractPollArrayWrapper.POLLIN; +- static final short POLLOUT = AbstractPollArrayWrapper.POLLOUT; +- + // kevent filters + static short EVFILT_READ; + static short EVFILT_WRITE; +@@ -129,9 +125,9 @@ + // SinkChannelImpl, SourceChannelImpl, DatagramChannelImpl, + // ServerSocketChannelImpl, SocketChannelImpl + if (filter == EVFILT_READ) { +- result |= POLLIN; ++ result |= Net.POLLIN; + } else if (filter == EVFILT_WRITE) { +- result |= POLLOUT; ++ result |= Net.POLLOUT; + } + + return result; +@@ -180,7 +176,7 @@ + if (!ch.isOpen()) + continue; + +- register0(kq, ch.getFDVal(), u.events & POLLIN, u.events & POLLOUT); ++ register0(kq, ch.getFDVal(), u.events & Net.POLLIN, u.events & Net.POLLOUT); + } + } + } +--- ./jdk/src/macosx/lib/Info-privileged.plist Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/lib/Info-privileged.plist Wed Jul 30 18:42:59 2014 +0100 +@@ -7,7 +7,7 @@ + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> +- <string>OpenJDK 7 Command</string> ++ <string>OpenJDK 8 Command</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleVersion</key> +--- ./jdk/src/macosx/lib/flavormap.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/lib/flavormap.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -79,3 +79,5 @@ + TIFF=image/x-java-image;class=java.awt.Image + RICH_TEXT=text/rtf + HTML=text/html;charset=utf-8;eoln="\r\n";terminators=1 ++URL=application/x-java-url;class=java.net.URL ++URL=text/uri-list;eoln="\r\n";terminators=1 +--- ./jdk/src/macosx/native/com/apple/laf/AquaFileView.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/com/apple/laf/AquaFileView.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,6 +23,9 @@ + * questions. + */ + ++ ++#include <jni_util.h> ++ + #import "com_apple_laf_AquaFileView.h" + + #import <sys/param.h> // for MAXPATHLEN +@@ -98,6 +101,7 @@ + JNF_COCOA_ENTER(env); + + jbyte *byteArray = (*env)->GetByteArrayElements(env, absolutePath, NULL); ++ CHECK_NULL_RETURN(byteArray, returnValue); + jsize length = (*env)->GetArrayLength(env, absolutePath); + + // Can't assume that byteArray is NULL terminated and FSPathMakeRef doesn't +@@ -138,6 +142,7 @@ + JNF_COCOA_ENTER(env); + + jbyte *byteArray = (*env)->GetByteArrayElements(env, absolutePath, NULL); ++ CHECK_NULL_RETURN(byteArray, returnValue); + jsize length = (*env)->GetArrayLength(env, absolutePath); + + // Can't assume that byteArray is NULL terminated and FSPathMakeRef doesn't +@@ -153,7 +158,9 @@ + Boolean isDirectory = (isDir == JNI_TRUE ? true : false); + FSRef ref; + +- OSErr theErr = FSPathMakeRefWithOptions((const UInt8 *)&arrayCopy, kFSPathMakeRefDoNotFollowLeafSymlink, &ref, &isDirectory); ++ OSErr theErr = FSPathMakeRefWithOptions((const UInt8 *)&arrayCopy, ++ kFSPathMakeRefDoNotFollowLeafSymlink, ++ &ref, &isDirectory); + if (theErr == noErr) { + CFStringRef displayName = NULL; + +@@ -190,6 +197,7 @@ + size_t maxPathLen = sizeof(pathCString) - 1; + + jbyte *byteArray = (*env)->GetByteArrayElements(env, pathToAlias, NULL); ++ CHECK_NULL_RETURN(byteArray, returnValue); + jsize length = (*env)->GetArrayLength(env, pathToAlias); + + if (length > maxPathLen) { +@@ -205,7 +213,8 @@ + OSErr theErr = FSPathMakeRef(pathCString, &fileRef, &isDirectory); + + Boolean ignored; +- theErr = FSResolveAliasFileWithMountFlags(&fileRef, false, &ignored, &ignored, kResolveAliasFileNoUI); ++ theErr = FSResolveAliasFileWithMountFlags(&fileRef, false, &ignored, ++ &ignored, kResolveAliasFileNoUI); + if (theErr == noErr) { + UInt8 resolvedPath[MAXPATHLEN]; + theErr = FSRefMakePath(&fileRef, resolvedPath, MAXPATHLEN); +--- ./jdk/src/macosx/native/com/apple/laf/JRSUIController.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/com/apple/laf/JRSUIController.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -199,7 +199,7 @@ + CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); + CGContextRef cgRef = CGBitmapContextCreate(rawPixelData, imgW, imgH, 8, imgW * 4, colorspace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); + CGColorSpaceRelease(colorspace); +- CGContextScaleCTM(cgRef, imgW/w , imgH/h); ++ CGContextScaleCTM(cgRef, imgW/(w + x + x) , imgH/(h + y + y)); + + jint status = doPaintCGContext(cgRef, controlPtr, oldProperties, newProperties, x, y, w, h); + CGContextRelease(cgRef); +--- ./jdk/src/macosx/native/sun/awt/AWTEvent.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/AWTEvent.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -28,6 +28,7 @@ + #import <sys/time.h> + #include <Carbon/Carbon.h> + ++#import "jni_util.h" + #import "LWCToolkit.h" + #import "ThreadUtilities.h" + +@@ -633,12 +634,12 @@ + } + + /* +- * Class: sun_lwawt_macosx_event_NSEvent ++ * Class: sun_lwawt_macosx_NSEvent + * Method: nsToJavaMouseModifiers + * Signature: (II)I + */ + JNIEXPORT jint JNICALL +-Java_sun_lwawt_macosx_event_NSEvent_nsToJavaMouseModifiers ++Java_sun_lwawt_macosx_NSEvent_nsToJavaMouseModifiers + (JNIEnv *env, jclass cls, jint buttonNumber, jint modifierFlags) + { + jint jmodifiers = 0; +@@ -653,12 +654,12 @@ + } + + /* +- * Class: sun_lwawt_macosx_event_NSEvent ++ * Class: sun_lwawt_macosx_NSEvent + * Method: nsToJavaKeyModifiers + * Signature: (I)I + */ + JNIEXPORT jint JNICALL +-Java_sun_lwawt_macosx_event_NSEvent_nsToJavaKeyModifiers ++Java_sun_lwawt_macosx_NSEvent_nsToJavaKeyModifiers + (JNIEnv *env, jclass cls, jint modifierFlags) + { + jint jmodifiers = 0; +@@ -673,12 +674,12 @@ + } + + /* +- * Class: sun_lwawt_macosx_event_NSEvent ++ * Class: sun_lwawt_macosx_NSEvent + * Method: nsToJavaKeyInfo + * Signature: ([I[I)Z + */ + JNIEXPORT jboolean JNICALL +-Java_sun_lwawt_macosx_event_NSEvent_nsToJavaKeyInfo ++Java_sun_lwawt_macosx_NSEvent_nsToJavaKeyInfo + (JNIEnv *env, jclass cls, jintArray inData, jintArray outData) + { + BOOL postsTyped = NO; +@@ -687,6 +688,7 @@ + + jboolean copy = JNI_FALSE; + jint *data = (*env)->GetIntArrayElements(env, inData, ©); ++ CHECK_NULL_RETURN(data, postsTyped); + + // in = [testChar, testDeadChar, modifierFlags, keyCode] + jchar testChar = (jchar)data[0]; +@@ -715,18 +717,19 @@ + } + + /* +- * Class: sun_lwawt_macosx_event_NSEvent ++ * Class: sun_lwawt_macosx_NSEvent + * Method: nsKeyModifiersToJavaKeyInfo + * Signature: ([I[I)V + */ + JNIEXPORT void JNICALL +-Java_sun_lwawt_macosx_event_NSEvent_nsKeyModifiersToJavaKeyInfo ++Java_sun_lwawt_macosx_NSEvent_nsKeyModifiersToJavaKeyInfo + (JNIEnv *env, jclass cls, jintArray inData, jintArray outData) + { + JNF_COCOA_ENTER(env); + + jboolean copy = JNI_FALSE; + jint *data = (*env)->GetIntArrayElements(env, inData, ©); ++ CHECK_NULL(data); + + // in = [modifierFlags, keyCode] + jint modifierFlags = data[0]; +@@ -753,12 +756,12 @@ + } + + /* +- * Class: sun_lwawt_macosx_event_NSEvent ++ * Class: sun_lwawt_macosx_NSEvent + * Method: nsToJavaChar + * Signature: (CI)C + */ + JNIEXPORT jint JNICALL +-Java_sun_lwawt_macosx_event_NSEvent_nsToJavaChar ++Java_sun_lwawt_macosx_NSEvent_nsToJavaChar + (JNIEnv *env, jclass cls, jchar nsChar, jint modifierFlags) + { + jchar javaChar = 0; +--- ./jdk/src/macosx/native/sun/awt/AWTView.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/AWTView.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -29,7 +29,7 @@ + #import "CDragSource.h" + #import "CDropTarget.h" + +-@interface AWTView : NSView<NSTextInputClient> { ++@interface AWTView : NSView<NSTextInputClient, CDragSourceHolder, CDropTargetHolder> { + @private + jobject m_cPlatformView; + +@@ -61,14 +61,8 @@ + + - (id) initWithRect:(NSRect) rect platformView:(jobject)cPlatformView windowLayer:(CALayer*)windowLayer; + - (void) deliverJavaMouseEvent: (NSEvent *) event; +-- (void) resetTrackingArea; +-- (void) deliverJavaKeyEventHelper: (NSEvent *) event; + - (jobject) awtComponent:(JNIEnv *)env; + +-- (void) setDragSource:(CDragSource *)source; +-- (void) setDropTarget:(CDropTarget *)target; +- +- + // Input method-related events + - (void)setInputMethod:(jobject)inputMethod; + - (void)abandonInput; +--- ./jdk/src/macosx/native/sun/awt/AWTView.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/AWTView.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -42,6 +42,10 @@ + @interface AWTView() + @property (retain) CDropTarget *_dropTarget; + @property (retain) CDragSource *_dragSource; ++ ++-(void) deliverResize: (NSRect) rect; ++-(void) resetTrackingArea; ++-(void) deliverJavaKeyEventHelper: (NSEvent*) event; + @end + + // Uncomment this line to see fprintfs of each InputMethod API being called on this View +@@ -363,7 +367,7 @@ + // TODO: need consitent way for doing that both with global as well as with local coordinates. + // The reason to do it here is one more native method for getting screen dimension otherwise. + +- NSRect screenRect = [[NSScreen mainScreen] frame]; ++ NSRect screenRect = [[[NSScreen screens] objectAtIndex:0] frame]; + absP.y = screenRect.size.height - absP.y; + jint clickCount; + +@@ -376,7 +380,7 @@ + clickCount = [event clickCount]; + } + +- static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/event/NSEvent"); ++ static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/NSEvent"); + static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IIIIIIIIDD)V"); + jobject jEvent = JNFNewObject(env, jctor_NSEvent, + [event type], +@@ -393,7 +397,7 @@ + } + + static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); +- static JNF_MEMBER_CACHE(jm_deliverMouseEvent, jc_PlatformView, "deliverMouseEvent", "(Lsun/lwawt/macosx/event/NSEvent;)V"); ++ static JNF_MEMBER_CACHE(jm_deliverMouseEvent, jc_PlatformView, "deliverMouseEvent", "(Lsun/lwawt/macosx/NSEvent;)V"); + JNFCallVoidMethod(env, m_cPlatformView, jm_deliverMouseEvent, jEvent); + } + +@@ -437,21 +441,24 @@ + JNIEnv *env = [ThreadUtilities getJNIEnv]; + + jstring characters = NULL; ++ jstring charactersIgnoringModifiers = NULL; + if ([event type] != NSFlagsChanged) { + characters = JNFNSToJavaString(env, [event characters]); ++ charactersIgnoringModifiers = JNFNSToJavaString(env, [event charactersIgnoringModifiers]); + } + +- static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/event/NSEvent"); +- static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IISLjava/lang/String;)V"); ++ static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/NSEvent"); ++ static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IISLjava/lang/String;Ljava/lang/String;)V"); + jobject jevent = JNFNewObject(env, jctor_NSEvent, + [event type], + [event modifierFlags], + [event keyCode], +- characters); ++ characters, ++ charactersIgnoringModifiers); + + static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); + static JNF_MEMBER_CACHE(jm_deliverKeyEvent, jc_PlatformView, +- "deliverKeyEvent", "(Lsun/lwawt/macosx/event/NSEvent;)V"); ++ "deliverKeyEvent", "(Lsun/lwawt/macosx/NSEvent;)V"); + JNFCallVoidMethod(env, m_cPlatformView, jm_deliverKeyEvent, jevent); + + if (characters != NULL) { +@@ -1077,21 +1084,22 @@ + jarray array; + jboolean isCopy; + jint *_array; +- NSRange range; ++ NSRange range = NSMakeRange(NSNotFound, 0); + + array = JNFCallObjectMethod(env, fInputMethodLOCKABLE, jm_markedRange); // AWT_THREADING Safe (AWTRunLoopMode) + + if (array) { + _array = (*env)->GetIntArrayElements(env, array, &isCopy); +- range = NSMakeRange(_array[0], _array[1]); +- ++ if (_array != NULL) { ++ range.location = _array[0]; ++ range.length = _array[1]; + #ifdef IM_DEBUG +- fprintf(stderr, "markedRange returning (%lu, %lu)\n", (unsigned long)range.location, (unsigned long)range.length); ++ fprintf(stderr, "markedRange returning (%lu, %lu)\n", ++ (unsigned long)range.location, (unsigned long)range.length); + #endif // IM_DEBUG +- (*env)->ReleaseIntArrayElements(env, array, _array, 0); ++ (*env)->ReleaseIntArrayElements(env, array, _array, 0); ++ } + (*env)->DeleteLocalRef(env, array); +- } else { +- range = NSMakeRange(NSNotFound, 0); + } + + return range; +@@ -1111,7 +1119,7 @@ + jarray array; + jboolean isCopy; + jint *_array; +- NSRange range; ++ NSRange range = NSMakeRange(NSNotFound, 0); + + #ifdef IM_DEBUG + fprintf(stderr, "AWTView InputMethod Selector Called : [selectedRange]\n"); +@@ -1120,15 +1128,15 @@ + array = JNFCallObjectMethod(env, fInputMethodLOCKABLE, jm_selectedRange); // AWT_THREADING Safe (AWTRunLoopMode) + if (array) { + _array = (*env)->GetIntArrayElements(env, array, &isCopy); +- range = NSMakeRange(_array[0], _array[1]); +- (*env)->ReleaseIntArrayElements(env, array, _array, 0); ++ if (_array != NULL) { ++ range.location = _array[0]; ++ range.length = _array[1]; ++ (*env)->ReleaseIntArrayElements(env, array, _array, 0); ++ } + (*env)->DeleteLocalRef(env, array); +- } else { +- range = NSMakeRange(NSNotFound, 0); + } + + return range; +- + } + + /* This method returns the first frame of rects for theRange in screen coordindate system. +@@ -1136,7 +1144,7 @@ + - (NSRect) firstRectForCharacterRange:(NSRange)theRange actualRange:(NSRangePointer)actualRange + { + if (!fInputMethodLOCKABLE) { +- return NSMakeRect(0, 0, 0, 0); ++ return NSZeroRect; + } + + static JNF_MEMBER_CACHE(jm_firstRectForCharacterRange, jc_CInputMethod, +@@ -1148,18 +1156,27 @@ + NSRect rect; + + #ifdef IM_DEBUG +- fprintf(stderr, "AWTView InputMethod Selector Called : [firstRectForCharacterRange:] location=%lu, length=%lu\n", (unsigned long)theRange.location, (unsigned long)theRange.length); ++ fprintf(stderr, ++ "AWTView InputMethod Selector Called : [firstRectForCharacterRange:] location=%lu, length=%lu\n", ++ (unsigned long)theRange.location, (unsigned long)theRange.length); + #endif // IM_DEBUG + +- array = JNFCallObjectMethod(env, fInputMethodLOCKABLE, jm_firstRectForCharacterRange, theRange.location); // AWT_THREADING Safe (AWTRunLoopMode) ++ array = JNFCallObjectMethod(env, fInputMethodLOCKABLE, jm_firstRectForCharacterRange, ++ theRange.location); // AWT_THREADING Safe (AWTRunLoopMode) + + _array = (*env)->GetIntArrayElements(env, array, &isCopy); +- rect = ConvertNSScreenRect(env, NSMakeRect(_array[0], _array[1], _array[2], _array[3])); +- (*env)->ReleaseIntArrayElements(env, array, _array, 0); ++ if (_array) { ++ rect = ConvertNSScreenRect(env, NSMakeRect(_array[0], _array[1], _array[2], _array[3])); ++ (*env)->ReleaseIntArrayElements(env, array, _array, 0); ++ } else { ++ rect = NSZeroRect; ++ } + (*env)->DeleteLocalRef(env, array); + + #ifdef IM_DEBUG +- fprintf(stderr, "firstRectForCharacterRange returning x=%f, y=%f, width=%f, height=%f\n", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); ++ fprintf(stderr, ++ "firstRectForCharacterRange returning x=%f, y=%f, width=%f, height=%f\n", ++ rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); + #endif // IM_DEBUG + return rect; + } +--- ./jdk/src/macosx/native/sun/awt/AWTWindow.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/AWTWindow.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -252,6 +252,10 @@ + self.ownerWindow = owner; + [self setPropertiesForStyleBits:styleBits mask:MASK(_METHOD_PROP_BITMASK)]; + ++ if (IS(self.styleBits, IS_POPUP)) { ++ [self.nsWindow setCollectionBehavior:(1 << 8) /*NSWindowCollectionBehaviorFullScreenAuxiliary*/]; ++ } ++ + return self; + } + +@@ -765,6 +769,10 @@ + return lastKeyWindow; + } + ++- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame { ++ return !NSEqualSizes(self.nsWindow.frame.size, newFrame.size); ++} ++ + + @end // AWTWindow + +--- ./jdk/src/macosx/native/sun/awt/CClipboard.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CClipboard.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,14 +23,13 @@ + * questions. + */ + +-#include "CClipboard.h" +-#include "CDataTransferer.h" ++#import "CClipboard.h" ++#import "CDataTransferer.h" ++#import "ThreadUtilities.h" ++#import "jni_util.h" + #import <Cocoa/Cocoa.h> + #import <JavaNativeFoundation/JavaNativeFoundation.h> + +-#include "ThreadUtilities.h" +- +- + static CClipboard *sClipboard = nil; + + // +@@ -246,6 +245,7 @@ + JNF_COCOA_ENTER(env); + jint nBytes = (*env)->GetArrayLength(env, inBytes); + jbyte *rawBytes = (*env)->GetPrimitiveArrayCritical(env, inBytes, NULL); ++ CHECK_NULL(rawBytes); + NSData *bytesAsData = [NSData dataWithBytes:rawBytes length:nBytes]; + (*env)->ReleasePrimitiveArrayCritical(env, inBytes, rawBytes, JNI_ABORT); + NSString *format = formatForIndex(inFormat); +--- ./jdk/src/macosx/native/sun/awt/CDataTransferer.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CDataTransferer.m Wed Jul 30 18:42:59 2014 +0100 +@@ -28,6 +28,7 @@ + + #import <AppKit/AppKit.h> + #import <JavaNativeFoundation/JavaNativeFoundation.h> ++#import "jni_util.h" + + #include "ThreadUtilities.h" + +@@ -172,7 +173,9 @@ + NSData *tiffImage = [imageRep TIFFRepresentation]; + jsize tiffSize = (jsize)[tiffImage length]; // #warning 64-bit: -length returns NSUInteger, but NewByteArray takes jsize + returnValue = (*env)->NewByteArray(env, tiffSize); ++ CHECK_NULL_RETURN(returnValue, nil); + jbyte *tiffData = (jbyte *)(*env)->GetPrimitiveArrayCritical(env, returnValue, 0); ++ CHECK_NULL_RETURN(tiffData, nil); + [tiffImage getBytes:tiffData]; + (*env)->ReleasePrimitiveArrayCritical(env, returnValue, tiffData, 0); // Do not use JNI_COMMIT, as that will not free the buffer copy when +ProtectJavaHeap is on. + [imageRep release]; +@@ -184,12 +187,13 @@ + + static jobject getImageForByteStream(JNIEnv *env, jbyteArray sourceData) + { +- if (sourceData == NULL) return NULL; ++ CHECK_NULL_RETURN(sourceData, NULL); + + jsize sourceSize = (*env)->GetArrayLength(env, sourceData); + if (sourceSize == 0) return NULL; + + jbyte *sourceBytes = (*env)->GetPrimitiveArrayCritical(env, sourceData, NULL); ++ CHECK_NULL_RETURN(sourceBytes, NULL); + NSData *rawData = [NSData dataWithBytes:sourceBytes length:sourceSize]; + + NSImage *newImage = [[NSImage alloc] initWithData:rawData]; +@@ -197,8 +201,7 @@ + [newImage release]; + + (*env)->ReleasePrimitiveArrayCritical(env, sourceData, sourceBytes, JNI_ABORT); +- +- if (newImage == nil) return NULL; ++ CHECK_NULL_RETURN(newImage, NULL); + + // The ownership of the NSImage is passed to the new CImage jobject. No need to release it. + static JNF_CLASS_CACHE(jc_CImage, "sun/lwawt/macosx/CImage"); +@@ -231,7 +234,8 @@ + if (filenameCount == 0) return nil; + + // Get the java.lang.String class object: +- jclass stringClazz = (*env)->FindClass(env, "java/lang/String"); // can't be null ++ jclass stringClazz = (*env)->FindClass(env, "java/lang/String"); ++ CHECK_NULL_RETURN(stringClazz, nil); + jobject jfilenameArray = (*env)->NewObjectArray(env, filenameCount, stringClazz, NULL); // AWT_THREADING Safe (known object) + if ((*env)->ExceptionOccurred(env)) { + (*env)->ExceptionDescribe(env); +--- ./jdk/src/macosx/native/sun/awt/CDragSource.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CDragSource.h Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -29,9 +29,15 @@ + #import <Cocoa/Cocoa.h> + #include <jni.h> + ++@class CDragSource; ++ ++@protocol CDragSourceHolder ++- (void) setDragSource:(CDragSource *)source; ++@end ++ + @interface CDragSource : NSObject { + @private +- NSView* fView; ++ NSView<CDragSourceHolder>* fView; + jobject fComponent; + jobject fDragSourceContextPeer; + +@@ -53,8 +59,6 @@ + jint fDragMouseModifiers; + } + +-+ (CDragSource *) currentDragSource; +- + // Common methods: + - (id) init:(jobject)jDragSourceContextPeer + component:(jobject)jComponent +@@ -84,13 +88,6 @@ + - (void)draggedImage:(NSImage *)image movedTo:(NSPoint)screenPoint; + - (BOOL)ignoreModifierKeysWhileDragging; + +-// Updates from the destination to the source +-- (void) postDragEnter; +-- (void) postDragExit; +- +-// Utility +-- (NSPoint) mapNSScreenPointToJavaWithOffset:(NSPoint) point; +- + @end + + #endif // CDragSource_h +--- ./jdk/src/macosx/native/sun/awt/CDragSource.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CDragSource.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -75,15 +75,18 @@ + static NSDragOperation sDragOperation; + static NSPoint sDraggingLocation; + +-static CDragSource* sCurrentDragSource; + static BOOL sNeedsEnter; + ++@interface CDragSource () ++// Updates from the destination to the source ++- (void) postDragEnter; ++- (void) postDragExit; ++// Utility ++- (NSPoint) mapNSScreenPointToJavaWithOffset:(NSPoint) point; ++@end ++ + @implementation CDragSource + +-+ (CDragSource *) currentDragSource { +- return sCurrentDragSource; +-} +- + - (id) init:(jobject)jDragSourceContextPeer + component:(jobject)jComponent + control:(id)control +@@ -515,8 +518,6 @@ + fDragKeyModifiers = [DnDUtilities extractJavaExtKeyModifiersFromJavaExtModifiers:fModifiers]; + fDragMouseModifiers = [DnDUtilities extractJavaExtMouseModifiersFromJavaExtModifiers:fModifiers]; + +- // Set the current DragSource +- sCurrentDragSource = self; + sNeedsEnter = YES; + + @try { +@@ -566,8 +567,6 @@ + JNF_MEMBER_CACHE(resetHoveringMethod, CDragSourceContextPeerClass, "resetHovering", "()V"); + JNFCallVoidMethod(env, fDragSourceContextPeer, resetHoveringMethod); // Hust reset static variable + } @finally { +- // Clear the current DragSource +- sCurrentDragSource = nil; + sNeedsEnter = NO; + } + +--- ./jdk/src/macosx/native/sun/awt/CDropTarget.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CDropTarget.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -31,9 +31,15 @@ + + @class ControlModel; + ++@class CDropTarget; ++ ++@protocol CDropTargetHolder ++- (void) setDropTarget:(CDropTarget *)target; ++@end ++ + @interface CDropTarget : NSObject { + @private +- NSView* fView; ++ NSView<CDropTargetHolder>* fView; + jobject fComponent; + jobject fDropTarget; + jobject fDropTargetContextPeer; +--- ./jdk/src/macosx/native/sun/awt/CFileDialog.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CFileDialog.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -223,9 +223,8 @@ + NSArray *urls = [dialogDelegate URLs]; + jsize count = [urls count]; + +- jclass stringClass = (*env)->FindClass(env, "java/lang/String"); +- returnValue = (*env)->NewObjectArray(env, count, stringClass, NULL); +- (*env)->DeleteLocalRef(env, stringClass); ++ static JNF_CLASS_CACHE(jc_String, "java/lang/String"); ++ returnValue = JNFNewObjectArray(env, &jc_String, count); + + [urls enumerateObjectsUsingBlock:^(id url, NSUInteger index, BOOL *stop) { + jstring filename = JNFNormalizedJavaStringForPath(env, [url path]); +--- ./jdk/src/macosx/native/sun/awt/CGraphicsDevice.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CGraphicsDevice.m Wed Jul 30 18:42:59 2014 +0100 +@@ -57,7 +57,7 @@ + CFArrayRef allModes = CGDisplayCopyAllDisplayModes(displayID, NULL); + + CFIndex numModes = CFArrayGetCount(allModes); +- CFMutableArrayRef validModes = CFArrayCreateMutable(kCFAllocatorDefault, numModes + 1, NULL); ++ CFMutableArrayRef validModes = CFArrayCreateMutable(kCFAllocatorDefault, numModes + 1, &kCFTypeArrayCallBacks); + + CFIndex n; + for (n=0; n < numModes; n++) { +--- ./jdk/src/macosx/native/sun/awt/CGraphicsEnv.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CGraphicsEnv.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -25,6 +25,7 @@ + + #import <JavaNativeFoundation/JavaNativeFoundation.h> + ++#import "jni_util.h" + #import "LWCToolkit.h" + #import "AWT_debug.h" + +@@ -64,7 +65,7 @@ + + /* Get the count */ + CGDisplayCount displayCount; +- if (CGGetActiveDisplayList(MAX_DISPLAYS, NULL, &displayCount) != kCGErrorSuccess) { ++ if (CGGetOnlineDisplayList(MAX_DISPLAYS, NULL, &displayCount) != kCGErrorSuccess) { + [JNFException raise:env + as:kInternalError + reason:"CGGetOnlineDisplayList() failed to get display count"]; +@@ -73,23 +74,36 @@ + + /* Allocate an array and get the size list of display Ids */ + CGDirectDisplayID displays[MAX_DISPLAYS]; +- if (CGGetActiveDisplayList(displayCount, displays, &displayCount) != kCGErrorSuccess) { ++ if (CGGetOnlineDisplayList(displayCount, displays, &displayCount) != kCGErrorSuccess) { + [JNFException raise:env + as:kInternalError + reason:"CGGetOnlineDisplayList() failed to get display list"]; + return NULL; + } + ++ CGDisplayCount i; ++ CGDisplayCount displayActiveCount = 0; //Active and sleeping. ++ for (i = 0; i < displayCount; ++i) { ++ if (CGDisplayMirrorsDisplay(displays[i]) == kCGNullDirectDisplay) { ++ ++displayActiveCount; ++ } else { ++ displays[i] = kCGNullDirectDisplay; ++ } ++ } ++ + /* Allocate a java array for display identifiers */ +- ret = JNFNewIntArray(env, displayCount); ++ ret = JNFNewIntArray(env, displayActiveCount); + + /* Initialize and return the backing int array */ + assert(sizeof(jint) >= sizeof(CGDirectDisplayID)); + jint *elems = (*env)->GetIntArrayElements(env, ret, 0); ++ CHECK_NULL_RETURN(elems, NULL); + +- CGDisplayCount i; +- for (i = 0; i < displayCount; i++) { +- elems[i] = displays[i]; ++ /* Filter out the mirrored displays */ ++ for (i = 0; i < displayCount; ++i) { ++ if (displays[i] != kCGNullDirectDisplay) { ++ elems[--displayActiveCount] = displays[i]; ++ } + } + + (*env)->ReleaseIntArrayElements(env, ret, elems, 0); +--- ./jdk/src/macosx/native/sun/awt/CImage.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CImage.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -22,6 +22,7 @@ + * or visit www.oracle.com if you need additional information or have any + * questions. + */ ++#import "jni_util.h" + + #import <Cocoa/Cocoa.h> + #import <JavaNativeFoundation/JavaNativeFoundation.h> +@@ -52,18 +53,21 @@ + } + + static void CImage_CopyNSImageIntoArray +-(NSImage *srcImage, jint *dstPixels, int width, int height) ++(NSImage *srcImage, jint *dstPixels, NSRect fromRect, NSRect toRect) + { ++ int width = toRect.size.width; ++ int height = toRect.size.height; + CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); +- CGContextRef cgRef = CGBitmapContextCreate(dstPixels, width, height, 8, width * 4, colorspace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); ++ CGContextRef cgRef = CGBitmapContextCreate(dstPixels, width, height, ++ 8, width * 4, colorspace, ++ kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); + CGColorSpaceRelease(colorspace); + NSGraphicsContext *context = [NSGraphicsContext graphicsContextWithGraphicsPort:cgRef flipped:NO]; + CGContextRelease(cgRef); + NSGraphicsContext *oldContext = [[NSGraphicsContext currentContext] retain]; + [NSGraphicsContext setCurrentContext:context]; +- NSRect rect = NSMakeRect(0, 0, width, height); +- [srcImage drawInRect:rect +- fromRect:rect ++ [srcImage drawInRect:toRect ++ fromRect:fromRect + operation:NSCompositeSourceOver + fraction:1.0]; + [NSGraphicsContext setCurrentContext:oldContext]; +@@ -143,21 +147,23 @@ + NSMutableArray * reps = [NSMutableArray arrayWithCapacity: num]; + + jint * ws = (*env)->GetIntArrayElements(env, widths, NULL); +- jint * hs = (*env)->GetIntArrayElements(env, heights, NULL); ++ if (ws != NULL) { ++ jint * hs = (*env)->GetIntArrayElements(env, heights, NULL); ++ if (hs != NULL) { ++ jsize i; ++ for (i = 0; i < num; i++) { ++ jintArray buffer = (*env)->GetObjectArrayElement(env, buffers, i); + +- jsize i; +- for (i = 0; i < num; i++) { +- jintArray buffer = (*env)->GetObjectArrayElement(env, buffers, i); ++ NSBitmapImageRep* imageRep = CImage_CreateImageRep(env, buffer, ws[i], hs[i]); ++ if (imageRep) { ++ [reps addObject: imageRep]; ++ } ++ } + +- NSBitmapImageRep* imageRep = CImage_CreateImageRep(env, buffer, ws[i], hs[i]); +- if (imageRep) { +- [reps addObject: imageRep]; ++ (*env)->ReleaseIntArrayElements(env, heights, hs, JNI_ABORT); + } ++ (*env)->ReleaseIntArrayElements(env, widths, ws, JNI_ABORT); + } +- +- (*env)->ReleaseIntArrayElements(env, heights, hs, JNI_ABORT); +- (*env)->ReleaseIntArrayElements(env, widths, ws, JNI_ABORT); +- + if ([reps count]) { + NSImage *nsImage = [[NSImage alloc] initWithSize:NSMakeSize(0, 0)]; + [nsImage addRepresentations: reps]; +@@ -266,17 +272,20 @@ + /* + * Class: sun_lwawt_macosx_CImage + * Method: nativeCopyNSImageIntoArray +- * Signature: (J[III)V ++ * Signature: (J[IIIII)V + */ + JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CImage_nativeCopyNSImageIntoArray +-(JNIEnv *env, jclass klass, jlong nsImgPtr, jintArray buffer, jint w, jint h) ++(JNIEnv *env, jclass klass, jlong nsImgPtr, jintArray buffer, jint sw, jint sh, ++ jint dw, jint dh) + { + JNF_COCOA_ENTER(env); + + NSImage *img = (NSImage *)jlong_to_ptr(nsImgPtr); + jint *dst = (*env)->GetPrimitiveArrayCritical(env, buffer, NULL); + if (dst) { +- CImage_CopyNSImageIntoArray(img, dst, w, h); ++ NSRect fromRect = NSMakeRect(0, 0, sw, sh); ++ NSRect toRect = NSMakeRect(0, 0, dw, dh); ++ CImage_CopyNSImageIntoArray(img, dst, fromRect, toRect); + (*env)->ReleasePrimitiveArrayCritical(env, buffer, dst, JNI_ABORT); + } + +@@ -320,3 +329,110 @@ + + JNF_COCOA_EXIT(env); + } ++ ++/* ++ * Class: sun_lwawt_macosx_CImage ++ * Method: nativeResizeNSImageRepresentations ++ * Signature: (JDD)V ++ */ ++JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CImage_nativeResizeNSImageRepresentations ++(JNIEnv *env, jclass clazz, jlong image, jdouble w, jdouble h) ++{ ++ if (!image) return; ++ NSImage *i = (NSImage *)jlong_to_ptr(image); ++ ++JNF_COCOA_ENTER(env); ++ ++ NSImageRep *imageRep = nil; ++ NSArray *imageRepresentations = [i representations]; ++ NSEnumerator *imageEnumerator = [imageRepresentations objectEnumerator]; ++ while ((imageRep = [imageEnumerator nextObject]) != nil) { ++ [imageRep setSize:NSMakeSize(w, h)]; ++ } ++ ++JNF_COCOA_EXIT(env); ++} ++ ++NSComparisonResult getOrder(BOOL order){ ++ return (NSComparisonResult) (order ? NSOrderedAscending : NSOrderedDescending); ++} ++ ++/* ++ * Class: sun_lwawt_macosx_CImage ++ * Method: nativeGetNSImageRepresentationsCount ++ * Signature: (JDD)[Ljava/awt/geom/Dimension2D; ++ */ ++JNIEXPORT jobjectArray JNICALL ++ Java_sun_lwawt_macosx_CImage_nativeGetNSImageRepresentationSizes ++(JNIEnv *env, jclass clazz, jlong image, jdouble w, jdouble h) ++{ ++ if (!image) return NULL; ++ jobjectArray jreturnArray = NULL; ++ NSImage *img = (NSImage *)jlong_to_ptr(image); ++ ++JNF_COCOA_ENTER(env); ++ ++ NSArray *imageRepresentations = [img representations]; ++ if([imageRepresentations count] == 0){ ++ return NULL; ++ } ++ ++ NSArray *sortedImageRepresentations = [imageRepresentations ++ sortedArrayUsingComparator: ^(id obj1, id obj2) { ++ ++ NSImageRep *imageRep1 = (NSImageRep *) obj1; ++ NSImageRep *imageRep2 = (NSImageRep *) obj2; ++ NSSize size1 = [imageRep1 size]; ++ NSSize size2 = [imageRep2 size]; ++ ++ if (NSEqualSizes(size1, size2)) { ++ return getOrder([imageRep1 pixelsWide] <= [imageRep2 pixelsWide] && ++ [imageRep1 pixelsHigh] <= [imageRep2 pixelsHigh]); ++ } ++ ++ return getOrder(size1.width <= size2.width && size1.height <= size2.height); ++ }]; ++ ++ NSMutableArray *sortedPixelSizes = [[[NSMutableArray alloc] init] autorelease]; ++ NSSize lastSize = [[sortedImageRepresentations lastObject] size]; ++ ++ NSUInteger i = [sortedImageRepresentations indexOfObjectPassingTest: ++ ^BOOL(id obj, NSUInteger idx, BOOL *stop) { ++ NSSize imageRepSize = [obj size]; ++ return (w <= imageRepSize.width && h <= imageRepSize.height) ++ || NSEqualSizes(imageRepSize, lastSize); ++ }]; ++ ++ NSUInteger count = [sortedImageRepresentations count]; ++ i = (i == NSNotFound) ? count - 1 : i; ++ NSSize bestFitSize = [[sortedImageRepresentations objectAtIndex: i] size]; ++ ++ for(; i < count; i++){ ++ NSImageRep *imageRep = [sortedImageRepresentations objectAtIndex: i]; ++ ++ if (!NSEqualSizes([imageRep size], bestFitSize)) { ++ break; ++ } ++ ++ NSSize pixelSize = NSMakeSize( ++ [imageRep pixelsWide], [imageRep pixelsHigh]); ++ [sortedPixelSizes addObject: [NSValue valueWithSize: pixelSize]]; ++ } ++ ++ count = [sortedPixelSizes count]; ++ static JNF_CLASS_CACHE(jc_Dimension, "java/awt/Dimension"); ++ jreturnArray = JNFNewObjectArray(env, &jc_Dimension, count); ++ CHECK_NULL_RETURN(jreturnArray, NULL); ++ ++ for(i = 0; i < count; i++){ ++ NSSize pixelSize = [[sortedPixelSizes objectAtIndex: i] sizeValue]; ++ ++ (*env)->SetObjectArrayElement(env, jreturnArray, i, ++ NSToJavaSize(env, pixelSize)); ++ JNU_CHECK_EXCEPTION_RETURN(env, NULL); ++ } ++ ++JNF_COCOA_EXIT(env); ++ ++ return jreturnArray; ++} +\ No newline at end of file +--- ./jdk/src/macosx/native/sun/awt/CInputMethod.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CInputMethod.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -70,17 +70,23 @@ + } + + // Create the java.util.Locale object ++ jobject localeObj = NULL; + jobject langObj = (*env)->NewStringUTF(env, language); +- jobject ctryObj = (*env)->NewStringUTF(env, country); +- jobject vrntObj = (*env)->NewStringUTF(env, variant); +- jobject localeObj = JNFNewObject(env, jm_localeCons, langObj, ctryObj, vrntObj); // AWT_THREADING Safe (known object) +- ++ if (langObj != NULL) { ++ jobject ctryObj = (*env)->NewStringUTF(env, country); ++ if(ctryObj != NULL) { ++ jobject vrntObj = (*env)->NewStringUTF(env, variant); ++ if (vrntObj != NULL) { ++ localeObj = JNFNewObject(env, jm_localeCons,langObj, ctryObj, ++ vrntObj); ++ (*env)->DeleteLocalRef(env, vrntObj); ++ } ++ (*env)->DeleteLocalRef(env, ctryObj); ++ } ++ (*env)->DeleteLocalRef(env, langObj); ++ } + // Clean up and return. + free(language); +- (*env)->DeleteLocalRef(env, langObj); +- (*env)->DeleteLocalRef(env, ctryObj); +- (*env)->DeleteLocalRef(env, vrntObj); +- + return localeObj; + } + +@@ -234,10 +240,12 @@ + + if (sLastKeyboardLocaleObj) { + JNFDeleteGlobalRef(env, sLastKeyboardLocaleObj); ++ sLastKeyboardLocaleObj = NULL; + } +- +- sLastKeyboardLocaleObj = JNFNewGlobalRef(env, localObj); +- (*env)->DeleteLocalRef(env, localObj); ++ if (localObj != NULL) { ++ sLastKeyboardLocaleObj = JNFNewGlobalRef(env, localObj); ++ (*env)->DeleteLocalRef(env, localObj); ++ } + } + + returnValue = sLastKeyboardLocaleObj; +@@ -305,9 +313,12 @@ + + for(NSString *locale in selectableArray) { + jobject localeObj = CreateLocaleObjectFromNSString(env, locale); ++ if (localeObj == NULL) { ++ break; ++ } + +- if (JNFCallBooleanMethod(env, returnValue, jm_listContains, localeObj) == JNI_FALSE) { // AWT_THREADING Safe (known object) +- JNFCallBooleanMethod(env, returnValue, jm_listAdd, localeObj); // AWT_THREADING Safe (known object) ++ if (JNFCallBooleanMethod(env, returnValue, jm_listContains, localeObj) == JNI_FALSE) { ++ JNFCallBooleanMethod(env, returnValue, jm_listAdd, localeObj); + } + + (*env)->DeleteLocalRef(env, localeObj); +--- ./jdk/src/macosx/native/sun/awt/CRobot.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CRobot.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,6 +23,9 @@ + * questions. + */ + ++ ++#import "jni_util.h" ++ + #import <JavaNativeFoundation/JavaNativeFoundation.h> + #import <ApplicationServices/ApplicationServices.h> + +@@ -187,9 +190,8 @@ + // volatile, otherwise it warns that it might be clobbered by 'longjmp' + volatile CGPoint point; + +- // Translate the device relative point into a valid global CGPoint. +- point.x = mouseLastX + globalDeviceBounds.origin.x; +- point.y = mouseLastY + globalDeviceBounds.origin.y; ++ point.x = mouseLastX; ++ point.y = mouseLastY; + + __block CGMouseButton button = kCGMouseButtonLeft; + __block CGEventType type = kCGEventMouseMoved; +@@ -343,6 +345,7 @@ + + // get a pointer to the Java int array + void *jPixelData = (*env)->GetPrimitiveArrayCritical(env, pixels, 0); ++ CHECK_NULL(jPixelData); + + // create a graphics context around the Java int array + CGColorSpaceRef picColorSpace = CGColorSpaceCreateWithName( +--- ./jdk/src/macosx/native/sun/awt/CTextPipe.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CTextPipe.m Wed Jul 30 18:42:59 2014 +0100 +@@ -147,7 +147,7 @@ + + CGAffineTransform invTx = CGAffineTransformInvert(strike->fTx); + +- NSUInteger i; ++ NSInteger i; + for (i = 0; i < length; i++) + { + CGGlyph glyph = glyphs[i]; +@@ -355,19 +355,31 @@ + static JNF_CLASS_CACHE(jc_StandardGlyphVector_GlyphTransformInfo, "sun/font/StandardGlyphVector$GlyphTransformInfo"); + static JNF_MEMBER_CACHE(jm_StandardGlyphVector_GlyphTransformInfo_transforms, jc_StandardGlyphVector_GlyphTransformInfo, "transforms", "[D"); + jdoubleArray g_gtiTransformsArray = JNFGetObjectField(env, gti, jm_StandardGlyphVector_GlyphTransformInfo_transforms); //(*env)->GetObjectField(env, gti, g_gtiTransforms); ++ if (g_gtiTransformsArray == NULL) { ++ return; ++ } + jdouble *g_gvTransformsAsDoubles = (*env)->GetPrimitiveArrayCritical(env, g_gtiTransformsArray, NULL); ++ if (g_gvTransformsAsDoubles == NULL) { ++ (*env)->DeleteLocalRef(env, g_gtiTransformsArray); ++ return; ++ } + + static JNF_MEMBER_CACHE(jm_StandardGlyphVector_GlyphTransformInfo_indices, jc_StandardGlyphVector_GlyphTransformInfo, "indices", "[I"); + jintArray g_gtiTXIndicesArray = JNFGetObjectField(env, gti, jm_StandardGlyphVector_GlyphTransformInfo_indices); + jint *g_gvTXIndicesAsInts = (*env)->GetPrimitiveArrayCritical(env, g_gtiTXIndicesArray, NULL); +- ++ if (g_gvTXIndicesAsInts == NULL) { ++ (*env)->ReleasePrimitiveArrayCritical(env, g_gtiTransformsArray, g_gvTransformsAsDoubles, JNI_ABORT); ++ (*env)->DeleteLocalRef(env, g_gtiTransformsArray); ++ (*env)->DeleteLocalRef(env, g_gtiTXIndicesArray); ++ return; ++ } + // slowest case, we have per-glyph transforms, and possibly glyph substitution as well + JavaCT_DrawGlyphVector(qsdo, strike, useSubstituion, uniChars, glyphs, advances, g_gvTXIndicesAsInts, g_gvTransformsAsDoubles, length); + + (*env)->ReleasePrimitiveArrayCritical(env, g_gtiTransformsArray, g_gvTransformsAsDoubles, JNI_ABORT); ++ (*env)->ReleasePrimitiveArrayCritical(env, g_gtiTXIndicesArray, g_gvTXIndicesAsInts, JNI_ABORT); ++ + (*env)->DeleteLocalRef(env, g_gtiTransformsArray); +- +- (*env)->ReleasePrimitiveArrayCritical(env, g_gtiTXIndicesArray, g_gvTXIndicesAsInts, JNI_ABORT); + (*env)->DeleteLocalRef(env, g_gtiTXIndicesArray); + } + +@@ -403,6 +415,9 @@ + { + // fill the glyph buffer + jint *glyphsAsInts = (*env)->GetPrimitiveArrayCritical(env, glyphsArray, NULL); ++ if (glyphsAsInts == NULL) { ++ return; ++ } + + // if a glyph code from Java is negative, that means it is really a unicode value + // which we can use in CoreText to strike the character in another font +@@ -429,11 +444,15 @@ + // fill the advance buffer + static JNF_MEMBER_CACHE(jm_StandardGlyphVector_positions, jc_StandardGlyphVector, "positions", "[F"); + jfloatArray posArray = JNFGetObjectField(env, gVector, jm_StandardGlyphVector_positions); +- if (posArray != NULL) +- { ++ jfloat *positions = NULL; ++ if (posArray != NULL) { + // in this case, the positions have already been pre-calculated for us on the Java side +- +- jfloat *positions = (*env)->GetPrimitiveArrayCritical(env, posArray, NULL); ++ positions = (*env)->GetPrimitiveArrayCritical(env, posArray, NULL); ++ if (positions == NULL) { ++ (*env)->DeleteLocalRef(env, posArray); ++ } ++ } ++ if (positions != NULL) { + CGPoint prev; + prev.x = positions[0]; + prev.y = positions[1]; +--- ./jdk/src/macosx/native/sun/awt/CTrayIcon.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CTrayIcon.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -135,7 +135,7 @@ + + clickCount = [event clickCount]; + +- static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/event/NSEvent"); ++ static JNF_CLASS_CACHE(jc_NSEvent, "sun/lwawt/macosx/NSEvent"); + static JNF_CTOR_CACHE(jctor_NSEvent, jc_NSEvent, "(IIIIIIIIDD)V"); + jobject jEvent = JNFNewObject(env, jctor_NSEvent, + [event type], +@@ -152,7 +152,7 @@ + } + + static JNF_CLASS_CACHE(jc_TrayIcon, "sun/lwawt/macosx/CTrayIcon"); +- static JNF_MEMBER_CACHE(jm_handleMouseEvent, jc_TrayIcon, "handleMouseEvent", "(Lsun/lwawt/macosx/event/NSEvent;)V"); ++ static JNF_MEMBER_CACHE(jm_handleMouseEvent, jc_TrayIcon, "handleMouseEvent", "(Lsun/lwawt/macosx/NSEvent;)V"); + JNFCallVoidMethod(env, peer, jm_handleMouseEvent, jEvent); + } + +--- ./jdk/src/macosx/native/sun/awt/CWrapper.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CWrapper.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,24 +0,0 @@ +-/* +- * Copyright (c) 2011, 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. +- */ +--- ./jdk/src/macosx/native/sun/awt/CWrapper.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/CWrapper.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,38 +23,11 @@ + * questions. + */ + +-#import "CWrapper.h" +- + #import <JavaNativeFoundation/JavaNativeFoundation.h> +- +-#import "AWTWindow.h" +-#import "LWCToolkit.h" +-#import "GeomUtilities.h" + #import "ThreadUtilities.h" +- + #import "sun_lwawt_macosx_CWrapper_NSWindow.h" + + /* +- * Class: sun_lwawt_macosx_CWrapper$NSObject +- * Method: release +- * Signature: (J)V +- */ +-JNIEXPORT void JNICALL +-Java_sun_lwawt_macosx_CWrapper_00024NSObject_release +-(JNIEnv *env, jclass cls, jlong objectPtr) +-{ +-JNF_COCOA_ENTER(env); +- +- id obj = (id)jlong_to_ptr(objectPtr); +- [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ +- CFRelease(obj); +- }]; +- +-JNF_COCOA_EXIT(env); +-} +- +- +-/* + * Class: sun_lwawt_macosx_CWrapper$NSWindow + * Method: makeKeyAndOrderFront + * Signature: (J)V +@@ -249,6 +222,7 @@ + dispatch_once(&pred, ^{ + LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSNormalWindowLevel] = NSNormalWindowLevel; + LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSFloatingWindowLevel] = NSFloatingWindowLevel; ++ LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSPopUpMenuWindowLevel] = NSPopUpMenuWindowLevel; + }); + } + +@@ -308,8 +282,8 @@ + { + JNF_COCOA_ENTER(env); + +- AWTWindow *parent = (AWTWindow *)jlong_to_ptr(parentPtr); +- AWTWindow *child = (AWTWindow *)jlong_to_ptr(childPtr); ++ NSWindow *parent = (NSWindow *)jlong_to_ptr(parentPtr); ++ NSWindow *child = (NSWindow *)jlong_to_ptr(childPtr); + [ThreadUtilities performOnMainThread:@selector(removeChildWindow:) + on:parent + withObject:child +@@ -320,26 +294,6 @@ + + /* + * Class: sun_lwawt_macosx_CWrapper$NSWindow +- * Method: setFrame +- * Signature: (JIIIIZ)V +- */ +-JNIEXPORT void JNICALL +-Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setFrame +-(JNIEnv *env, jclass cls, jlong windowPtr, jint x, jint y, jint w, jint h, jboolean display) +-{ +-JNF_COCOA_ENTER(env); +- +- AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr); +- NSRect frame = NSMakeRect(x, y, w, h); +- [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ +- [window setFrame:frame display:display]; +- }]; +- +-JNF_COCOA_EXIT(env); +-} +- +-/* +- * Class: sun_lwawt_macosx_CWrapper$NSWindow + * Method: setAlphaValue + * Signature: (JF)V + */ +@@ -349,7 +303,7 @@ + { + JNF_COCOA_ENTER(env); + +- AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr); ++ NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); + [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ + [window setAlphaValue:(CGFloat)alpha]; + }]; +@@ -368,7 +322,7 @@ + { + JNF_COCOA_ENTER(env); + +- AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr); ++ NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); + [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ + [window setOpaque:(BOOL)opaque]; + }]; +@@ -383,12 +337,17 @@ + */ + JNIEXPORT void JNICALL + Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor +-(JNIEnv *env, jclass cls, jlong windowPtr, jlong colorPtr) ++(JNIEnv *env, jclass cls, jlong windowPtr, jint rgb) + { + JNF_COCOA_ENTER(env); + +- AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr); +- NSColor *color = (NSColor *)jlong_to_ptr(colorPtr); ++ NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); ++ CGFloat alpha = (((rgb >> 24) & 0xff) / 255.0); ++ CGFloat red = (((rgb >> 16) & 0xff) / 255.0); ++ CGFloat green = (((rgb >> 8) & 0xff) / 255.0); ++ CGFloat blue = (((rgb >> 0) & 0xff) / 255.0); ++ NSColor *color = [NSColor colorWithCalibratedRed:red green:green blue:blue ++ alpha:alpha]; + [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ + [window setBackgroundColor:color]; + }]; +@@ -397,6 +356,7 @@ + } + + /* ++ * Class: sun_lwawt_macosx_CWrapper$NSWindow + * Method: miniaturize + * Signature: (J)V + */ +@@ -560,33 +520,6 @@ + + /* + * Class: sun_lwawt_macosx_CWrapper$NSView +- * Method: frame +- * Signature: (J)Ljava/awt/Rectangle; +- */ +-JNIEXPORT jobject JNICALL +-Java_sun_lwawt_macosx_CWrapper_00024NSView_frame +-(JNIEnv *env, jclass cls, jlong viewPtr) +-{ +- jobject jRect = NULL; +- +-JNF_COCOA_ENTER(env); +- +- __block NSRect rect = NSZeroRect; +- +- NSView *view = (NSView *)jlong_to_ptr(viewPtr); +- [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ +- rect = [view frame]; +- }]; +- +- jRect = NSToJavaRect(env, rect); +- +-JNF_COCOA_EXIT(env); +- +- return jRect; +-} +- +-/* +- * Class: sun_lwawt_macosx_CWrapper$NSView + * Method: window + * Signature: (J)J + */ +@@ -647,26 +580,3 @@ + + JNF_COCOA_EXIT(env); + } +- +-/* +- * Class: sun_lwawt_macosx_CWrapper$NSColor +- * Method: clearColor +- * Signature: ()J +- */ +-JNIEXPORT jlong JNICALL +-Java_sun_lwawt_macosx_CWrapper_00024NSColor_clearColor +-(JNIEnv *env, jclass cls) +-{ +- __block jlong clearColorPtr = 0L; +- +-JNF_COCOA_ENTER(env); +- +- [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ +- clearColorPtr = ptr_to_jlong([NSColor clearColor]); +- }]; +- +-JNF_COCOA_EXIT(env); +- +- return clearColorPtr; +-} +- +--- ./jdk/src/macosx/native/sun/awt/ImageSurfaceData.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/ImageSurfaceData.m Wed Jul 30 18:42:59 2014 +0100 +@@ -849,7 +849,7 @@ + indexOfBest = 0; + distanceOfBest = DBL_MAX; + +- for (i=0; i<lutDataSize; i++) ++ for (i=0; (unsigned)i<lutDataSize; i++) + { + p2 = lutdata[i]; + +@@ -899,7 +899,7 @@ + { + if (data != NULL) + { +- free(data); ++ free((void*)data); + } + } + +@@ -1577,7 +1577,9 @@ + { + static char *bimgName = "java/awt/image/BufferedImage"; + jclass bimg = (*env)->FindClass(env, bimgName); ++ CHECK_NULL_RETURN(bimg, NULL); + sDataID = (*env)->GetFieldID(env, bimg, "sData", "Lsun/java2d/SurfaceData;"); ++ CHECK_NULL_RETURN(sDataID, NULL); + } + + return (*env)->GetObjectField(env, bufImg, sDataID); +@@ -1591,7 +1593,9 @@ + { + static char *bimgName = "java/awt/image/BufferedImage"; + jclass bimg = (*env)->FindClass(env, bimgName); ++ CHECK_NULL(bimg); + sDataID = (*env)->GetFieldID(env, bimg, "sData", "Lsun/java2d/SurfaceData;"); ++ CHECK_NULL(sDataID); + } + + (*env)->SetObjectField(env, bufImg, sDataID, sData); +@@ -1610,18 +1614,11 @@ + return; + } + +- icm = (*env)->FindClass(env, icmName); +- if (icm == NULL) { +- return; +- } +- +- rgbID = (*env)->GetFieldID(env, icm, "rgb", "[I"); +- allGrayID = (*env)->GetFieldID(env, icm, "allgrayopaque", "Z"); +- mapSizeID = (*env)->GetFieldID(env, icm, "map_size", "I"); +- CMpDataID = (*env)->GetFieldID(env, icm, "pData", "J"); +- if (allGrayID == 0 || rgbID == 0 || mapSizeID == 0 || CMpDataID == 0) { +- JNU_ThrowInternalError(env, "Could not get field IDs"); +- } ++ CHECK_NULL(icm = (*env)->FindClass(env, icmName)); ++ CHECK_NULL(rgbID = (*env)->GetFieldID(env, icm, "rgb", "[I")); ++ CHECK_NULL(allGrayID = (*env)->GetFieldID(env, icm, "allgrayopaque", "Z")); ++ CHECK_NULL(mapSizeID = (*env)->GetFieldID(env, icm, "map_size", "I")); ++ CHECK_NULL(CMpDataID = (*env)->GetFieldID(env, icm, "pData", "J")); + } + + gColorspaceRGB = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); +@@ -1795,6 +1792,7 @@ + //bisdo->sdOps.Dispose = BufImg_Dispose; + + bisdo->array = (*env)->NewWeakGlobalRef(env, array); ++ if (array != NULL) CHECK_NULL(bisdo->array); + bisdo->offset = offset; + //bisdo->scanStr = scanStr; + bisdo->scanStr = scanStride; +@@ -1807,8 +1805,10 @@ + } else { + jobject lutarray = (*env)->GetObjectField(env, icm, rgbID); + bisdo->lutarray = (*env)->NewWeakGlobalRef(env, lutarray); ++ if (lutarray != NULL) CHECK_NULL(bisdo->lutarray); + bisdo->lutsize = (*env)->GetIntField(env, icm, mapSizeID); + bisdo->icm = (*env)->NewWeakGlobalRef(env, icm); ++ if (icm != NULL) CHECK_NULL(bisdo->icm); + } + bisdo->rasbounds.x1 = 0; + bisdo->rasbounds.y1 = 0; +@@ -1887,7 +1887,7 @@ + Pixel32bit* src = lutdata; + Pixel32bit* dst = isdo->lutData; + jint i; +- for (i=0; i<isdo->lutDataSize; i++) ++ for (i=0; (unsigned)i<isdo->lutDataSize; i++) + { + if (i != transparent_index) + { +@@ -1919,7 +1919,7 @@ + Pixel32bit* src = lutdata; + Pixel32bit* dst = isdo->lutData; + jint i; +- for (i=0; i<isdo->lutDataSize; i++) ++ for (i=0; (unsigned)i<isdo->lutDataSize; i++) + { + *dst = *src | mask; + dst++; src++; +--- ./jdk/src/macosx/native/sun/awt/JavaComponentAccessibility.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/JavaComponentAccessibility.m Wed Jul 30 18:42:59 2014 +0100 +@@ -256,11 +256,15 @@ + jsize count = [ignoredKeys count]; + + JNIEnv *env = [ThreadUtilities getJNIEnv]; +- jclass clazz = (*env)->FindClass(env, "java/lang/String"); +- result = (*env)->NewObjectArray(env, count, clazz, NULL); // AWT_THREADING Safe (known object) +- (*env)->DeleteLocalRef(env, clazz); + +- NSUInteger i; ++ static JNF_CLASS_CACHE(jc_String, "java/lang/String"); ++ result = JNFNewObjectArray(env, &jc_String, count); ++ if (!result) { ++ NSLog(@"In %s, can't create Java array of String objects", __FUNCTION__); ++ return; ++ } ++ ++ NSInteger i; + for (i = 0; i < count; i++) { + jstring jString = JNFNSToJavaString(env, [ignoredKeys objectAtIndex:i]); + (*env)->SetObjectArrayElement(env, result, i, jString); +@@ -295,7 +299,7 @@ + jsize arrayLen = (*env)->GetArrayLength(env, jchildrenAndRoles); + NSMutableArray *children = [NSMutableArray arrayWithCapacity:arrayLen/2]; //childrenAndRoles array contains two elements (child, role) for each child + +- NSUInteger i; ++ NSInteger i; + NSUInteger childIndex = (whichChildren >= 0) ? whichChildren : 0; // if we're getting one particular child, make sure to set its index correctly + for(i = 0; i < arrayLen; i+=2) + { +@@ -391,8 +395,13 @@ + // Get all the other accessibility attributes states we need in one swell foop. + // javaRole isn't pulled in because we need protected access to AccessibleRole.key + jbooleanArray attributeStates = JNFCallStaticObjectMethod(env, jm_getInitialAttributeStates, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) +- if (attributeStates == NULL) return NULL; ++ if (attributeStates == NULL) return nil; + jboolean *attributeStatesArray = (*env)->GetBooleanArrayElements(env, attributeStates, 0); ++ if (attributeStatesArray == NULL) { ++ // Note: Java will not be on the stack here so a java exception can't happen and no need to call ExceptionCheck. ++ NSLog(@"%s failed calling GetBooleanArrayElements", __FUNCTION__); ++ return nil; ++ } + + // if there's a component, it can be enabled and it has a size/position + if (attributeStatesArray[0]) { +@@ -1220,7 +1229,7 @@ + // Go through the tabs and find selAccessible + _numTabs = [tabs count]; + JavaComponentAccessibility *aTab; +- NSUInteger i; ++ NSInteger i; + for (i = 0; i < _numTabs; i++) { + aTab = (JavaComponentAccessibility *)[tabs objectAtIndex:i]; + if ([aTab isAccessibleWithEnv:env forAccessible:selAccessible]) { +@@ -1247,7 +1256,7 @@ + + NSString *tabJavaRole = JNFJavaToNSString(env, JNFGetObjectField(env, jtabJavaRole, sjf_key)); + +- NSUInteger i; ++ NSInteger i; + NSUInteger tabIndex = (whichTabs >= 0) ? whichTabs : 0; // if we're getting one particular child, make sure to set its index correctly + for(i = 0; i < arrayLen; i+=2) { + jobject jtab = (*env)->GetObjectArrayElement(env, jtabsAndRoles, i); +--- ./jdk/src/macosx/native/sun/awt/JavaTextAccessibility.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/JavaTextAccessibility.m Wed Jul 30 18:42:59 2014 +0100 +@@ -40,6 +40,11 @@ + */ + NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { + jint *values = (*env)->GetIntArrayElements(env, array, 0); ++ if (values == NULL) { ++ // Note: Java will not be on the stack here so a java exception can't happen and no need to call ExceptionCheck. ++ NSLog(@"%s failed calling GetIntArrayElements", __FUNCTION__); ++ return nil; ++ }; + NSValue *value = [NSValue valueWithRange:NSMakeRange(values[0], values[1] - values[0])]; + (*env)->ReleaseIntArrayElements(env, array, values, 0); + return value; +@@ -285,6 +290,11 @@ + + // We cheat because we know that the array is 4 elements long (x, y, width, height) + jdouble *values = (*env)->GetDoubleArrayElements(env, axBounds, 0); ++ if (values == NULL) { ++ // Note: Java will not be on the stack here so a java exception can't happen and no need to call ExceptionCheck. ++ NSLog(@"%s failed calling GetDoubleArrayElements", __FUNCTION__); ++ return nil; ++ }; + NSRect bounds; + bounds.origin.x = values[0]; + bounds.origin.y = [[[[self view] window] screen] frame].size.height - values[1] - values[3]; //values[1] is y-coord from top-left of screen. Flip. Account for the height (values[3]) when flipping +--- ./jdk/src/macosx/native/sun/awt/LWCToolkit.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/LWCToolkit.m Wed Jul 30 18:42:59 2014 +0100 +@@ -111,6 +111,18 @@ + return JNI_FALSE; + } + ++/* ++ * Class: sun_lwawt_macosx_LWCToolkit ++ * Method: flushNativeSelectors ++ * Signature: ()J ++ */ ++JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_flushNativeSelectors ++(JNIEnv *env, jclass clz) ++{ ++JNF_COCOA_ENTER(env); ++ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){}]; ++JNF_COCOA_EXIT(env); ++} + + static JNF_CLASS_CACHE(jc_Component, "java/awt/Component"); + static JNF_MEMBER_CACHE(jf_Component_appContext, jc_Component, "appContext", "Lsun/awt/AppContext;"); +@@ -201,13 +213,17 @@ + gNumberOfButtons = sun_lwawt_macosx_LWCToolkit_BUTTONS; + + jclass inputEventClazz = (*env)->FindClass(env, "java/awt/event/InputEvent"); ++ CHECK_NULL(inputEventClazz); + jmethodID getButtonDownMasksID = (*env)->GetStaticMethodID(env, inputEventClazz, "getButtonDownMasks", "()[I"); ++ CHECK_NULL(getButtonDownMasksID); + jintArray obj = (jintArray)(*env)->CallStaticObjectMethod(env, inputEventClazz, getButtonDownMasksID); + jint * tmp = (*env)->GetIntArrayElements(env, obj, JNI_FALSE); ++ CHECK_NULL(tmp); + + gButtonDownMasks = (jint*)SAFE_SIZE_ARRAY_ALLOC(malloc, sizeof(jint), gNumberOfButtons); + if (gButtonDownMasks == NULL) { + gNumberOfButtons = 0; ++ (*env)->ReleaseIntArrayElements(env, obj, tmp, JNI_ABORT); + JNU_ThrowOutOfMemoryError(env, NULL); + return; + } +@@ -241,7 +257,7 @@ + return ((ia & 0xFF) << 24) | ((ir & 0xFF) << 16) | ((ig & 0xFF) << 8) | ((ib & 0xFF) << 0); + } + +-void doLoadNativeColors(JNIEnv *env, jintArray jColors, BOOL useAppleColors) { ++BOOL doLoadNativeColors(JNIEnv *env, jintArray jColors, BOOL useAppleColors) { + jint len = (*env)->GetArrayLength(env, jColors); + + UInt32 colorsArray[len]; +@@ -255,8 +271,12 @@ + }]; + + jint *_colors = (*env)->GetPrimitiveArrayCritical(env, jColors, 0); ++ if (_colors == NULL) { ++ return NO; ++ } + memcpy(_colors, colors, len * sizeof(UInt32)); + (*env)->ReleasePrimitiveArrayCritical(env, jColors, _colors, 0); ++ return YES; + } + + /** +@@ -268,8 +288,9 @@ + (JNIEnv *env, jobject peer, jintArray jSystemColors, jintArray jAppleColors) + { + JNF_COCOA_ENTER(env); +- doLoadNativeColors(env, jSystemColors, NO); +- doLoadNativeColors(env, jAppleColors, YES); ++ if (doLoadNativeColors(env, jSystemColors, NO)) { ++ doLoadNativeColors(env, jAppleColors, YES); ++ } + JNF_COCOA_EXIT(env); + } + +--- ./jdk/src/macosx/native/sun/awt/QuartzRenderer.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/QuartzRenderer.m Wed Jul 30 18:42:59 2014 +0100 +@@ -438,6 +438,9 @@ + { + SDRenderType renderType = SD_Nothing; + ++ if (xpointsarray == NULL || ypointsarray == NULL) { ++ return SD_Nothing; ++ } + if (npoints > 1) + { + if (fill == YES) +@@ -452,7 +455,14 @@ + jint i; + + jint* xpoints = (jint*)(*env)->GetPrimitiveArrayCritical(env, xpointsarray, NULL); ++ if (xpoints == NULL) { ++ return SD_Nothing; ++ } + jint* ypoints = (jint*)(*env)->GetPrimitiveArrayCritical(env, ypointsarray, NULL); ++ if (ypoints == NULL) { ++ (*env)->ReleasePrimitiveArrayCritical(env, xpointsarray, xpoints, 0); ++ return SD_Nothing; ++ } + + CGContextMoveToPoint(cgRef, xpoints[0]+offsetX, ypoints[0]+offsetY); + +--- ./jdk/src/macosx/native/sun/awt/QuartzSurfaceData.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/QuartzSurfaceData.m Wed Jul 30 18:42:59 2014 +0100 +@@ -778,6 +778,10 @@ + qsdo->graphicsStateInfo.simpleStroke = NO; + jint length = (*env)->GetArrayLength(env, dasharray); + jfloat* jdashes = (jfloat*)(*env)->GetPrimitiveArrayCritical(env, dasharray, NULL); ++ if (jdashes == NULL) { ++ CGContextSetLineDash(cgRef, 0, NULL, 0); ++ return; ++ } + CGFloat* dashes = (CGFloat*)malloc(sizeof(CGFloat)*length); + if (dashes != NULL) + { +--- ./jdk/src/macosx/native/sun/awt/splashscreen/splashscreen_sys.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/awt/splashscreen/splashscreen_sys.m Wed Jul 30 18:42:59 2014 +0100 +@@ -142,10 +142,9 @@ + splash->screenFormat.byteOrder = 1 ? BYTE_ORDER_LSBFIRST : BYTE_ORDER_MSBFIRST; + splash->screenFormat.depthBytes = 4; + +- dispatch_async(dispatch_get_main_queue(), ^(void) { +- NSApplication * app = [NSApplicationAWT sharedApplication]; +- [NSApplicationAWT runAWTLoopWithApp: app]; +- }); ++ [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^() { ++ [NSApplicationAWT runAWTLoopWithApp:[NSApplicationAWT sharedApplication]]; ++ }]; + } + + void +--- ./jdk/src/macosx/native/sun/font/AWTStrike.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/font/AWTStrike.m Wed Jul 30 18:42:59 2014 +0100 +@@ -127,6 +127,9 @@ + } + + jdouble *txPtr = (*env)->GetPrimitiveArrayCritical(env, txArray, NULL); ++ if (txPtr == NULL) { ++ return CGAffineTransformIdentity; ++ } + + CGAffineTransform tx = + CGAffineTransformMake(txPtr[0], txPtr[1], txPtr[2], +@@ -311,18 +314,22 @@ + + jlong *glyphInfos = + (*env)->GetPrimitiveArrayCritical(env, glyphInfoLongArray, NULL); ++ if (glyphInfos != NULL) { + jint *rawGlyphCodes = + (*env)->GetPrimitiveArrayCritical(env, glyphCodes, NULL); + ++ if (rawGlyphCodes != NULL) { + CGGlyphImages_GetGlyphImagePtrs(glyphInfos, awtStrike, + rawGlyphCodes, len); + + (*env)->ReleasePrimitiveArrayCritical(env, glyphCodes, + rawGlyphCodes, JNI_ABORT); ++ } + // Do not use JNI_COMMIT, as that will not free the buffer copy + // when +ProtectJavaHeap is on. + (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoLongArray, + glyphInfos, 0); ++ } + + JNF_COCOA_EXIT(env); + } +--- ./jdk/src/macosx/native/sun/font/CCharToGlyphMapper.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/font/CCharToGlyphMapper.m Wed Jul 30 18:42:59 2014 +0100 +@@ -101,10 +101,13 @@ + jchar *unicodesAsChars = + (*env)->GetPrimitiveArrayCritical(env, unicodes, NULL); + +- AllocateGlyphBuffer(env, awtFont, count, (UniChar *)unicodesAsChars, glyphs); ++ if (unicodesAsChars != NULL) { ++ AllocateGlyphBuffer(env, awtFont, count, ++ (UniChar *)unicodesAsChars, glyphs); + + (*env)->ReleasePrimitiveArrayCritical(env, unicodes, + unicodesAsChars, JNI_ABORT); ++ } + + JNF_COCOA_EXIT(env); + } +--- ./jdk/src/macosx/native/sun/java2d/opengl/CGLGraphicsConfig.m Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/macosx/native/sun/java2d/opengl/CGLGraphicsConfig.m Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -433,18 +433,18 @@ + } + + JNIEXPORT jint JNICALL +-Java_sun_java2d_opengl_CGLGraphicsConfig_getMaxTextureSize ++Java_sun_java2d_opengl_CGLGraphicsConfig_nativeGetMaxTextureSize + (JNIEnv *env, jclass cglgc) + { +- J2dTraceLn(J2D_TRACE_INFO, "CGLGraphicsConfig_getMaxTextureSize"); ++ J2dTraceLn(J2D_TRACE_INFO, "CGLGraphicsConfig_nativeGetMaxTextureSize"); + + __block int max = 0; + +- [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ ++ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ + [sharedContext makeCurrentContext]; + j2d_glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max); ++ [NSOpenGLContext clearCurrentContext]; + }]; + + return (jint)max; + } +- +--- ./jdk/src/share/bin/java.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/bin/java.c Wed Jul 30 18:42:59 2014 +0100 +@@ -732,6 +732,9 @@ + if (s == NULL) + return; + s = JLI_WildcardExpandClasspath(s); ++ if (sizeof(format) - 2 + JLI_StrLen(s) < JLI_StrLen(s)) ++ // s is corrupted after wildcard expansion ++ return; + def = JLI_MemAlloc(sizeof(format) + - 2 /* strlen("%s") */ + + JLI_StrLen(s)); +@@ -1351,9 +1354,11 @@ + if (s) { + s = (char *) JLI_WildcardExpandClasspath(s); + /* 40 for -Denv.class.path= */ +- envcp = (char *)JLI_MemAlloc(JLI_StrLen(s) + 40); +- sprintf(envcp, "-Denv.class.path=%s", s); +- AddOption(envcp, NULL); ++ if (JLI_StrLen(s) + 40 > JLI_StrLen(s)) { // Safeguard from overflow ++ envcp = (char *)JLI_MemAlloc(JLI_StrLen(s) + 40); ++ sprintf(envcp, "-Denv.class.path=%s", s); ++ AddOption(envcp, NULL); ++ } + } + } + +--- ./jdk/src/share/bin/jli_util.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/bin/jli_util.h Wed Jul 30 18:42:59 2014 +0100 +@@ -85,6 +85,9 @@ + #ifdef MACOSX + #define JLI_Lseek lseek + #endif ++#ifdef _AIX ++#define JLI_Lseek lseek ++#endif + #endif /* _WIN32 */ + + /* +--- ./jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_de.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_de.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -17,7 +17,7 @@ + awtcomponent=AWT-Komponente + checkbox=Kontrollk\u00E4stchen + colorchooser=Farbauswahl +-columnheader=Spalten-Header ++columnheader=Spaltenheader + combobox=Kombinationsfeld + canvas=Leinwand + desktopicon=Desktopsymbol +@@ -46,7 +46,7 @@ + pushbutton=Schaltfl\u00E4che + radiobutton=Optionsfeld + rootpane=Root-Bereich +-rowheader=Zeilen-Header ++rowheader=Zeilenheader + scrollbar=Bildlaufleiste + scrollpane=Bildlaufbereich + separator=Trennzeichen +--- ./jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_zh_TW.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_zh_TW.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -44,7 +44,7 @@ + popupmenu=\u5373\u73FE\u5F0F\u529F\u80FD\u8868 + progressbar=\u9032\u5EA6\u5217 + pushbutton=\u4E0B\u58D3\u6309\u9215 +-radiobutton=\u55AE\u9078\u9215 ++radiobutton=\u5713\u9215 + rootpane=root \u7A97\u683C + rowheader=\u5217\u6A19\u984C + scrollbar=\u6372\u8EF8 +--- ./jdk/src/share/classes/com/sun/beans/util/Cache.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/beans/util/Cache.java Wed Jul 30 18:42:59 2014 +0100 +@@ -119,13 +119,13 @@ + synchronized (this.queue) { + // synchronized search improves stability + // we must create and add new value if there are no needed entry +- int index = index(hash, this.table); +- current = getEntryValue(key, hash, this.table[index]); ++ current = getEntryValue(key, hash, this.table[index(hash, this.table)]); + if (current != null) { + return current; + } + V value = create(key); + Objects.requireNonNull(value, "value"); ++ int index = index(hash, this.table); + this.table[index] = new CacheEntry<>(hash, key, value, this.table[index]); + if (++this.size >= this.threshold) { + if (this.table.length == MAXIMUM_CAPACITY) { +--- ./jdk/src/share/classes/com/sun/crypto/provider/RSACipher.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/crypto/provider/RSACipher.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -39,6 +39,8 @@ + + import sun.security.rsa.*; + import sun.security.jca.Providers; ++import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; ++import sun.security.util.KeyUtil; + + /** + * RSA cipher implementation. Supports RSA en/decryption and signing/verifying +@@ -91,8 +93,8 @@ + // padding object + private RSAPadding padding; + +- // cipher parameter for OAEP padding +- private OAEPParameterSpec spec = null; ++ // cipher parameter for OAEP padding and TLS RSA premaster secret ++ private AlgorithmParameterSpec spec = null; + + // buffer for the data + private byte[] buffer; +@@ -110,6 +112,9 @@ + // hash algorithm for OAEP + private String oaepHashAlgorithm = "SHA-1"; + ++ // the source of randomness ++ private SecureRandom random; ++ + public RSACipher() { + paddingType = PAD_PKCS1; + } +@@ -175,7 +180,7 @@ + + // see JCE spec + protected AlgorithmParameters engineGetParameters() { +- if (spec != null) { ++ if (spec != null && spec instanceof OAEPParameterSpec) { + try { + AlgorithmParameters params = + AlgorithmParameters.getInstance("OAEP", +@@ -276,8 +281,13 @@ + buffer = new byte[n]; + } else if (paddingType == PAD_PKCS1) { + if (params != null) { +- throw new InvalidAlgorithmParameterException +- ("Parameters not supported"); ++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) { ++ throw new InvalidAlgorithmParameterException( ++ "Parameters not supported"); ++ } ++ ++ spec = params; ++ this.random = random; // for TLS RSA premaster secret + } + int blockType = (mode <= MODE_DECRYPT) ? RSAPadding.PAD_BLOCKTYPE_2 + : RSAPadding.PAD_BLOCKTYPE_1; +@@ -293,19 +303,18 @@ + throw new InvalidKeyException + ("OAEP cannot be used to sign or verify signatures"); + } +- OAEPParameterSpec myParams; + if (params != null) { + if (!(params instanceof OAEPParameterSpec)) { + throw new InvalidAlgorithmParameterException + ("Wrong Parameters for OAEP Padding"); + } +- myParams = (OAEPParameterSpec) params; ++ spec = params; + } else { +- myParams = new OAEPParameterSpec(oaepHashAlgorithm, "MGF1", ++ spec = new OAEPParameterSpec(oaepHashAlgorithm, "MGF1", + MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT); + } + padding = RSAPadding.getInstance(RSAPadding.PAD_OAEP_MGF1, n, +- random, myParams); ++ random, (OAEPParameterSpec)spec); + if (encrypt) { + int k = padding.getMaxDataSize(); + buffer = new byte[k]; +@@ -420,17 +429,40 @@ + if (wrappedKey.length > buffer.length) { + throw new InvalidKeyException("Key is too long for unwrapping"); + } ++ ++ boolean isTlsRsaPremasterSecret = ++ algorithm.equals("TlsRsaPremasterSecret"); ++ Exception failover = null; ++ byte[] encoded = null; ++ + update(wrappedKey, 0, wrappedKey.length); + try { +- byte[] encoded = doFinal(); +- return ConstructKeys.constructKey(encoded, algorithm, type); ++ encoded = doFinal(); + } catch (BadPaddingException e) { +- // should not occur +- throw new InvalidKeyException("Unwrapping failed", e); ++ if (isTlsRsaPremasterSecret) { ++ failover = e; ++ } else { ++ throw new InvalidKeyException("Unwrapping failed", e); ++ } + } catch (IllegalBlockSizeException e) { + // should not occur, handled with length check above + throw new InvalidKeyException("Unwrapping failed", e); + } ++ ++ if (isTlsRsaPremasterSecret) { ++ if (!(spec instanceof TlsRsaPremasterSecretParameterSpec)) { ++ throw new IllegalStateException( ++ "No TlsRsaPremasterSecretParameterSpec specified"); ++ } ++ ++ // polish the TLS premaster secret ++ encoded = KeyUtil.checkTlsPreMasterSecretKey( ++ ((TlsRsaPremasterSecretParameterSpec)spec).getClientVersion(), ++ ((TlsRsaPremasterSecretParameterSpec)spec).getServerVersion(), ++ random, encoded, (failover != null)); ++ } ++ ++ return ConstructKeys.constructKey(encoded, algorithm, type); + } + + // see JCE spec +@@ -438,5 +470,4 @@ + RSAKey rsaKey = RSAKeyFactory.toRSAKey(key); + return rsaKey.getModulus().bitLength(); + } +- + } +--- ./jdk/src/share/classes/com/sun/crypto/provider/TlsRsaPremasterSecretGenerator.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/crypto/provider/TlsRsaPremasterSecretGenerator.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -56,7 +56,7 @@ + + protected void engineInit(AlgorithmParameterSpec params, + SecureRandom random) throws InvalidAlgorithmParameterException { +- if (params instanceof TlsRsaPremasterSecretParameterSpec == false) { ++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) { + throw new InvalidAlgorithmParameterException(MSG); + } + this.spec = (TlsRsaPremasterSecretParameterSpec)params; +@@ -67,21 +67,20 @@ + throw new InvalidParameterException(MSG); + } + ++ // Only can be used in client side to generate TLS RSA premaster secret. + protected SecretKey engineGenerateKey() { + if (spec == null) { + throw new IllegalStateException( + "TlsRsaPremasterSecretGenerator must be initialized"); + } +- byte[] b = spec.getEncodedSecret(); +- if (b == null) { +- if (random == null) { +- random = new SecureRandom(); +- } +- b = new byte[48]; +- random.nextBytes(b); +- b[0] = (byte)spec.getMajorVersion(); +- b[1] = (byte)spec.getMinorVersion(); ++ ++ if (random == null) { ++ random = new SecureRandom(); + } ++ byte[] b = new byte[48]; ++ random.nextBytes(b); ++ b[0] = (byte)spec.getMajorVersion(); ++ b[1] = (byte)spec.getMinorVersion(); + + return new SecretKeySpec(b, "TlsRsaPremasterSecret"); + } +--- ./jdk/src/share/classes/com/sun/jarsigner/ContentSignerParameters.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/jarsigner/ContentSignerParameters.java Wed Jul 30 18:42:59 2014 +0100 +@@ -35,7 +35,7 @@ + * @since 1.5 + * @author Vincent Ryan + */ +- ++@jdk.Exported + public interface ContentSignerParameters { + + /** +@@ -64,7 +64,9 @@ + * + * @return The TSAPolicyID. May be null. + */ +- public String getTSAPolicyID(); ++ public default String getTSAPolicyID() { ++ return null; ++ } + + /** + * Retrieves the JAR file's signature. +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifScrollBarUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifScrollBarUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2003, 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 +@@ -24,17 +24,19 @@ + */ + package com.sun.java.swing.plaf.motif; + +-import javax.swing.*; +-import javax.swing.event.*; +-import javax.swing.plaf.*; +-import javax.swing.border.*; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Insets; ++import java.awt.Rectangle; ++ ++import javax.swing.JButton; ++import javax.swing.JComponent; ++import javax.swing.JScrollBar; ++import javax.swing.plaf.ComponentUI; + import javax.swing.plaf.basic.BasicScrollBarUI; + +-import java.awt.Dimension; +-import java.awt.Insets; +-import java.awt.Rectangle; +-import java.awt.Graphics; +-import java.awt.Color; ++import static sun.swing.SwingUtilities2.drawHLine; ++import static sun.swing.SwingUtilities2.drawVLine; + + + /** +@@ -74,17 +76,13 @@ + return new MotifScrollBarButton(orientation); + } + +- + public void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) { + g.setColor(trackColor); + g.fillRect(trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height); + } + +- +- public void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) +- { +- +- if(thumbBounds.isEmpty() || !scrollbar.isEnabled()) { ++ public void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { ++ if (thumbBounds.isEmpty() || !scrollbar.isEnabled()) { + return; + } + +@@ -93,15 +91,15 @@ + + g.translate(thumbBounds.x, thumbBounds.y); + g.setColor(thumbColor); +- g.fillRect(0, 0, w-1, h-1); ++ g.fillRect(0, 0, w - 1, h - 1); + + g.setColor(thumbHighlightColor); +- g.drawLine(0, 0, 0, h-1); +- g.drawLine(1, 0, w-1, 0); ++ drawVLine(g, 0, 0, h - 1); ++ drawHLine(g, 1, w - 1, 0); + + g.setColor(thumbLightShadowColor); +- g.drawLine(1, h-1, w-1, h-1); +- g.drawLine(w-1, 1, w-1, h-2); ++ drawHLine(g, 1, w - 1, h - 1); ++ drawVLine(g, w - 1, 1, h - 2); + + g.translate(-thumbBounds.x, -thumbBounds.y); + } +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifSliderUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifSliderUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 1999, 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 +@@ -25,14 +25,17 @@ + + package com.sun.java.swing.plaf.motif; + +-import java.awt.*; +-import java.awt.event.*; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Rectangle; + +-import javax.swing.*; +-import javax.swing.event.*; +-import javax.swing.plaf.*; ++import javax.swing.JComponent; ++import javax.swing.JSlider; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.basic.BasicSliderUI; + +-import javax.swing.plaf.basic.BasicSliderUI; ++import static sun.swing.SwingUtilities2.drawHLine; ++import static sun.swing.SwingUtilities2.drawVLine; + + /** + * Motif Slider +@@ -123,15 +126,15 @@ + + // highlight + g.setColor(getHighlightColor()); +- g.drawLine(0, 1, w - 1, 1); // top +- g.drawLine(0, 1, 0, h); // left +- g.drawLine(w/2, 2, w/2, h-1); // center ++ drawHLine(g, 0, w - 1, 1); // top ++ drawVLine(g, 0, 1, h); // left ++ drawVLine(g, w / 2, 2, h - 1); // center + + // shadow + g.setColor(getShadowColor()); +- g.drawLine(0, h, w - 1, h); // bottom +- g.drawLine(w - 1, 1, w - 1, h); // right +- g.drawLine(w/2 - 1, 2, w/2 - 1, h); // center ++ drawHLine(g, 0, w - 1, h); // bottom ++ drawVLine(g, w - 1, 1, h); // right ++ drawVLine(g, w / 2 - 1, 2, h); // center + + g.translate(-x, -(knobBounds.y-1)); + } +@@ -143,15 +146,15 @@ + + // highlight + g.setColor(getHighlightColor()); +- g.drawLine(1, y, w, y); // top +- g.drawLine(1, y+1, 1, y+h-1); // left +- g.drawLine(2, y+h/2, w-1, y+h/2); // center ++ drawHLine(g, 1, w, y); // top ++ drawVLine(g, 1, y + 1, y + h - 1); // left ++ drawHLine(g, 2, w - 1, y + h / 2); // center + + // shadow + g.setColor(getShadowColor()); +- g.drawLine(2, y+h-1, w, y+h-1); // bottom +- g.drawLine(w, y+h-1, w, y); // right +- g.drawLine(2, y+h/2-1, w-1, y+h/2-1); // center ++ drawHLine(g, 2, w, y + h - 1); // bottom ++ drawVLine(g, w, y + h - 1, y); // right ++ drawHLine(g, 2, w - 1, y + h / 2 - 1);// center + + g.translate(-(knobBounds.x-1), 0); + } +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsScrollBarUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsScrollBarUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -51,6 +51,8 @@ + public class WindowsScrollBarUI extends BasicScrollBarUI { + private Grid thumbGrid; + private Grid highlightGrid; ++ private Dimension horizontalThumbSize; ++ private Dimension verticalThumbSize; + + /** + * Creates a UI for a JScrollBar. +@@ -65,11 +67,32 @@ + protected void installDefaults() { + super.installDefaults(); + +- if (XPStyle.getXP() != null) { ++ XPStyle xp = XPStyle.getXP(); ++ if (xp != null) { + scrollbar.setBorder(null); ++ horizontalThumbSize = getSize(scrollbar, xp, Part.SBP_THUMBBTNHORZ); ++ verticalThumbSize = getSize(scrollbar, xp, Part.SBP_THUMBBTNVERT); ++ } else { ++ horizontalThumbSize = null; ++ verticalThumbSize = null; + } + } + ++ private static Dimension getSize(Component component, XPStyle xp, Part part) { ++ Skin skin = xp.getSkin(component, part); ++ return new Dimension(skin.getWidth(), skin.getHeight()); ++ } ++ ++ @Override ++ protected Dimension getMinimumThumbSize() { ++ if ((horizontalThumbSize == null) || (verticalThumbSize == null)) { ++ return super.getMinimumThumbSize(); ++ } ++ return JScrollBar.HORIZONTAL == scrollbar.getOrientation() ++ ? horizontalThumbSize ++ : verticalThumbSize; ++ } ++ + public void uninstallUI(JComponent c) { + super.uninstallUI(c); + thumbGrid = highlightGrid = null; +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/resources/windows_fr.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/resources/windows_fr.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -25,8 +25,8 @@ + FileChooser.filesOfTypeLabel.textAndMnemonic=&Type de fichier : + FileChooser.upFolderToolTip.textAndMnemonic=Remonte d'un niveau. + FileChooser.upFolderAccessibleName=Monter +-FileChooser.homeFolderToolTip.textAndMnemonic=R\u00E9pertoire d'origine +-FileChooser.homeFolderAccessibleName=R\u00E9pertoire d'origine ++FileChooser.homeFolderToolTip.textAndMnemonic=R\u00E9pertoire de base ++FileChooser.homeFolderAccessibleName=R\u00E9pertoire de base + FileChooser.newFolderToolTip.textAndMnemonic=Cr\u00E9e un dossier. + FileChooser.newFolderAccessibleName=Nouveau dossier + FileChooser.newFolderActionLabel.textAndMnemonic=Nouveau dossier +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/resources/windows_sv.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/windows/resources/windows_sv.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -22,7 +22,7 @@ + FileChooser.saveInLabel.textAndMnemonic=Spara i: + FileChooser.fileNameLabel.textAndMnemonic=Fil&namn: + FileChooser.folderNameLabel.textAndMnemonic=Mapp&namn: +-FileChooser.filesOfTypeLabel.textAndMnemonic=Filer av &typ: ++FileChooser.filesOfTypeLabel.textAndMnemonic=Filer av &typen: + FileChooser.upFolderToolTip.textAndMnemonic=Upp en niv\u00E5 + FileChooser.upFolderAccessibleName=Upp + FileChooser.homeFolderToolTip.textAndMnemonic=Hem +--- ./jdk/src/share/classes/com/sun/java/util/jar/pack/DriverResource_zh_CN.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/java/util/jar/pack/DriverResource_zh_CN.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -48,7 +48,7 @@ + * Do not translate command arguments and words with a prefix of '-' or '--'. + */ + private static final Object[][] resource = { +- {VERSION, "{0}\u7248\u672C{1}"}, // parameter 0:class name;parameter 1: version value ++ {VERSION, "{0}\u7248\u672C {1}"}, // parameter 0:class name;parameter 1: version value + {BAD_ARGUMENT, "\u9519\u8BEF\u53C2\u6570: {0}"}, + {BAD_OPTION, "\u9519\u8BEF\u9009\u9879: {0}={1}"}, // parameter 0:option name;parameter 1:option value + {BAD_REPACK_OUTPUT, "--repack \u8F93\u51FA\u9519\u8BEF: {0}"}, // parameter 0:filename +--- ./jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java Wed Jul 30 18:42:59 2014 +0100 +@@ -787,6 +787,14 @@ + if (!reconnected) { + try { + NotificationResult nr = fetchNotifs(-1, 0, 0); ++ ++ if (state != STOPPED) { // JDK-8038940 ++ // reconnection must happen during ++ // fetchNotifs(-1, 0, 0), and a new ++ // thread takes over the fetching job ++ return; ++ } ++ + clientSequenceNumber = nr.getNextSequenceNumber(); + } catch (ClassNotFoundException e) { + // can't happen +--- ./jdk/src/share/classes/com/sun/jndi/ldap/Connection.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/jndi/ldap/Connection.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -459,10 +459,10 @@ + // will be woken up before readTimeout only if reply is + // available + ldr.wait(readTimeout); +- waited = true; + } else { + ldr.wait(15 * 1000); // 15 second timeout + } ++ waited = true; + } else { + break; + } +@@ -474,7 +474,7 @@ + } + + if ((rber == null) && waited) { +- removeRequest(ldr); ++ abandonRequest(ldr, null); + throw new NamingException("LDAP response read timed out, timeout used:" + + readTimeout + "ms." ); + +--- ./jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_de.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_de.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -140,7 +140,7 @@ + #WebRowSetXmlReader exception + wrsxmlreader.invalidcp = Ende von RowSet wurde erreicht. Ung\u00FCltige Cursorposition + wrsxmlreader.readxml = readXML: {0} +-wrsxmlreader.parseerr = ** Parsing-Fehler: {0}, Zeile: {1} , URI: {2} ++wrsxmlreader.parseerr = ** Parsingfehler: {0}, Zeile: {1} , URI: {2} + + #WebRowSetXmlWriter exceptions + wrsxmlwriter.ioex = IOException: {0} +--- ./jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_ja.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_ja.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -51,8 +51,8 @@ + cachedrowsetimpl.last = last: TYPE_FORWARD_ONLY + cachedrowsetimpl.absolute = absolute: \u7121\u52B9\u306A\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E + cachedrowsetimpl.relative = relative: \u7121\u52B9\u306A\u30AB\u30FC\u30BD\u30EB\u4F4D\u7F6E +-cachedrowsetimpl.asciistream = ascii\u30B9\u30C8\u30EA\u30FC\u30E0\u306E\u8AAD\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F +-cachedrowsetimpl.binstream = \u30D0\u30A4\u30CA\u30EA\u30FB\u30B9\u30C8\u30EA\u30FC\u30E0\u306E\u8AAD\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F ++cachedrowsetimpl.asciistream = ascii\u30B9\u30C8\u30EA\u30FC\u30E0\u306E\u8AAD\u8FBC\u307F\u304C\u5931\u6557\u3057\u307E\u3057\u305F ++cachedrowsetimpl.binstream = \u30D0\u30A4\u30CA\u30EA\u30FB\u30B9\u30C8\u30EA\u30FC\u30E0\u306E\u8AAD\u8FBC\u307F\u304C\u5931\u6557\u3057\u307E\u3057\u305F + cachedrowsetimpl.failedins = \u884C\u306E\u633F\u5165\u306B\u5931\u6557 + cachedrowsetimpl.updateins = \u633F\u5165\u884C\u306B\u304A\u3044\u3066updateRow\u304C\u547C\u3073\u51FA\u3055\u308C\u307E\u3057\u305F + cachedrowsetimpl.movetoins = moveToInsertRow: CONCUR_READ_ONLY +@@ -101,7 +101,7 @@ + + #JdbcRowSetImpl exceptions + jdbcrowsetimpl.invalstate = \u7121\u52B9\u306A\u72B6\u614B +-jdbcrowsetimpl.connect = JdbcRowSet(connect): JNDI\u304C\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093 ++jdbcrowsetimpl.connect = JdbcRowSet (connect): JNDI\u304C\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093 + jdbcrowsetimpl.paramtype = \u30D1\u30E9\u30E1\u30FC\u30BF\u30FB\u30BF\u30A4\u30D7\u3092\u63A8\u5B9A\u3067\u304D\u307E\u305B\u3093 + jdbcrowsetimpl.matchcols = \u4E00\u81F4\u5217\u304C\u5217\u306E\u30BB\u30C3\u30C8\u3068\u540C\u3058\u3067\u306F\u3042\u308A\u307E\u305B\u3093 + jdbcrowsetimpl.setmatchcols = \u4E00\u81F4\u5217\u3092\u53D6\u5F97\u3059\u308B\u524D\u306B\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044 +--- ./jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_pt_BR.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_pt_BR.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -153,7 +153,7 @@ + xmlrch.errmetadata = Erro ao definir metadados : {0} + xmlrch.errinsertval = Erro ao inserir valores : {0} + xmlrch.errconstr = Erro ao construir a linha : {0} +-xmlrch.errdel = Erro ao deletar a linha : {0} ++xmlrch.errdel = Erro ao excluir a linha : {0} + xmlrch.errinsert = Erro ao construir a linha de inser\u00E7\u00E3o : {0} + xmlrch.errinsdel = Erro ao construir a linha insdel : {0} + xmlrch.errupdate = Erro ao construir a linha de atualiza\u00E7\u00E3o : {0} +--- ./jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_sv.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_sv.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -29,11 +29,11 @@ + cachedrowsetimpl.nullhash = Kan inte instansiera CachedRowSetImpl. Null-hashtabell skickades till konstruktor + cachedrowsetimpl.invalidop = En ogiltig \u00E5tg\u00E4rd utf\u00F6rdes p\u00E5 infogad rad + cachedrowsetimpl.accfailed = acceptChanges utf\u00F6rdes inte +-cachedrowsetimpl.invalidcp = Mark\u00F6rpositionen \u00E4r ogiltig ++cachedrowsetimpl.invalidcp = Ogiltigt mark\u00F6rl\u00E4ge + cachedrowsetimpl.illegalop = En otill\u00E5ten \u00E5tg\u00E4rd utf\u00F6rdes p\u00E5 en icke infogad rad + cachedrowsetimpl.clonefail = Kloningen utf\u00F6rdes inte: {0} +-cachedrowsetimpl.invalidcol = Kolumnindexet \u00E4r ogiltigt +-cachedrowsetimpl.invalcolnm = Kolumnnamnet \u00E4r ogiltigt ++cachedrowsetimpl.invalidcol = Ogiltigt kolumnindex ++cachedrowsetimpl.invalcolnm = Ogiltigt kolumnnamn + cachedrowsetimpl.boolfail = getBoolen utf\u00F6rdes inte f\u00F6r v\u00E4rdet ({0}) i kolumnen {1} + cachedrowsetimpl.bytefail = getByte utf\u00F6rdes inte f\u00F6r v\u00E4rdet ({0}) i kolumnen {1} + cachedrowsetimpl.shortfail = getShort utf\u00F6rdes inte f\u00F6r v\u00E4rdet ({0}) i kolumnen {1} +@@ -60,7 +60,7 @@ + cachedrowsetimpl.movetoins2 = moveToInsertRow: ogiltigt antal kolumner + cachedrowsetimpl.tablename = Tabellnamnet kan inte vara null + cachedrowsetimpl.keycols = Ogiltiga nyckelkolumner +-cachedrowsetimpl.invalidcol = Kolumnindexet \u00E4r ogiltigt ++cachedrowsetimpl.invalidcol = Ogiltigt kolumnindex + cachedrowsetimpl.opnotsupp = Databasen har inte st\u00F6d f\u00F6r denna \u00E5tg\u00E4rd + cachedrowsetimpl.matchcols = Matchningskolumnerna \u00E4r inte samma som de som st\u00E4llts in + cachedrowsetimpl.setmatchcols = St\u00E4ll in matchningskolumnerna innan du h\u00E4mtar dem +@@ -81,7 +81,7 @@ + + # WebRowSetImpl exceptions + webrowsetimpl.nullhash = Kan inte instansiera WebRowSetImpl. Null-hashtabell skickades till konstruktor. +-webrowsetimpl.invalidwr = Ogiltig f\u00F6rfattare ++webrowsetimpl.invalidwr = Ogiltig skrivfunktion + webrowsetimpl.invalidrd = Ogiltig l\u00E4sare + + #FilteredRowSetImpl exceptions +--- ./jdk/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_fr.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_fr.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -25,8 +25,8 @@ + FileChooser.filesOfTypeLabel.textAndMnemonic=&Type de fichier : + FileChooser.upFolderToolTip.textAndMnemonic=Remonte d'un niveau. + FileChooser.upFolderAccessibleName=Monter +-FileChooser.homeFolderToolTip.textAndMnemonic=R\u00E9pertoire d'origine +-FileChooser.homeFolderAccessibleName=R\u00E9pertoire d'origine ++FileChooser.homeFolderToolTip.textAndMnemonic=R\u00E9pertoire de base ++FileChooser.homeFolderAccessibleName=R\u00E9pertoire de base + FileChooser.newFolderToolTip.textAndMnemonic=Cr\u00E9e un dossier. + FileChooser.newFolderAccessibleName=Nouveau dossier + FileChooser.newFolderActionLabel.textAndMnemonic=Nouveau dossier +--- ./jdk/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_sv.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_sv.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -22,7 +22,7 @@ + FileChooser.saveInLabel.textAndMnemonic=Spara i: + FileChooser.fileNameLabel.textAndMnemonic=&Fil: + FileChooser.folderNameLabel.textAndMnemonic=&Mapp: +-FileChooser.filesOfTypeLabel.textAndMnemonic=Mapp&namn: ++FileChooser.filesOfTypeLabel.textAndMnemonic=Filer av &typen: + FileChooser.upFolderToolTip.textAndMnemonic=Upp en niv\u00E5 + FileChooser.upFolderAccessibleName=Upp + FileChooser.homeFolderToolTip.textAndMnemonic=Hem +--- ./jdk/src/share/classes/com/sun/swing/internal/plaf/synth/resources/synth_fr.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/swing/internal/plaf/synth/resources/synth_fr.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -25,8 +25,8 @@ + FileChooser.filesOfTypeLabel.textAndMnemonic=&Type de fichier : + FileChooser.upFolderToolTip.textAndMnemonic=Remonte d'un niveau. + FileChooser.upFolderAccessibleName=Monter +-FileChooser.homeFolderToolTip.textAndMnemonic=R\u00E9pertoire d'origine +-FileChooser.homeFolderAccessibleName=R\u00E9pertoire d'origine ++FileChooser.homeFolderToolTip.textAndMnemonic=R\u00E9pertoire de base ++FileChooser.homeFolderAccessibleName=R\u00E9pertoire de base + FileChooser.newFolderToolTip.textAndMnemonic=Cr\u00E9e un dossier. + FileChooser.newFolderAccessibleName=Nouveau dossier + FileChooser.newFolderActionLabel.textAndMnemonic=Nouveau dossier +--- ./jdk/src/share/classes/com/sun/swing/internal/plaf/synth/resources/synth_sv.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/swing/internal/plaf/synth/resources/synth_sv.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -22,7 +22,7 @@ + FileChooser.saveInLabel.textAndMnemonic=Spara i: + FileChooser.fileNameLabel.textAndMnemonic=Fil&namn: + FileChooser.folderNameLabel.textAndMnemonic=Mapp&namn: +-FileChooser.filesOfTypeLabel.textAndMnemonic=Filer av &typ: ++FileChooser.filesOfTypeLabel.textAndMnemonic=Filer av &typen: + FileChooser.upFolderToolTip.textAndMnemonic=Upp en niv\u00E5 + FileChooser.upFolderAccessibleName=Upp + FileChooser.homeFolderToolTip.textAndMnemonic=Hem +--- ./jdk/src/share/classes/com/sun/tools/example/debug/tty/TTYResources_ja.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/tools/example/debug/tty/TTYResources_ja.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -82,7 +82,7 @@ + {"Can only trace", "'methods'\u3001'method exit'\u307E\u305F\u306F'method exits'\u306E\u307F\u30C8\u30EC\u30FC\u30B9\u3067\u304D\u307E\u3059"}, + {"cannot redefine existing connection", "{0}\u306F\u65E2\u5B58\u306E\u63A5\u7D9A\u3092\u518D\u5B9A\u7FA9\u3067\u304D\u307E\u305B\u3093"}, + {"Cannot assign to a method invocation", "\u30E1\u30BD\u30C3\u30C9\u547C\u51FA\u3057\u306B\u5272\u5F53\u3066\u3067\u304D\u307E\u305B\u3093"}, +- {"Cannot specify command line with connector:", "\u30B3\u30CD\u30AF\u30BF\u3067\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u3092\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093: {0}"}, ++ {"Cannot specify command line with connector:", "\u30B3\u30CD\u30AF\u30BF\u3067\u30B3\u30DE\u30F3\u30C9\u884C\u3092\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093: {0}"}, + {"Cannot specify target vm arguments with connector:", "\u30B3\u30CD\u30AF\u30BF\u3067\u30BF\u30FC\u30B2\u30C3\u30C8VM\u5F15\u6570\u3092\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093: {0}"}, + {"Class containing field must be specified.", "\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u542B\u3080\u30AF\u30E9\u30B9\u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002"}, + {"Class:", "\u30AF\u30E9\u30B9: {0}"}, +--- ./jdk/src/share/classes/com/sun/tools/jdi/resources/jdi_ja.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/com/sun/tools/jdi/resources/jdi_ja.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -5,9 +5,9 @@ + raw.command.label = \u30B3\u30DE\u30F3\u30C9 + raw.address = raw\u30B3\u30DE\u30F3\u30C9\u5B9F\u884C\u5F8C\u306B\u63A5\u7D9A\u3092\u30EA\u30B9\u30CB\u30F3\u30B0\u3059\u308B\u30A2\u30C9\u30EC\u30B9 + raw.address.label = \u30A2\u30C9\u30EC\u30B9 +-raw.quote = \u5358\u4E00\u306E\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u5F15\u6570\u5185\u306B\u30B9\u30DA\u30FC\u30B9\u3067\u533A\u5207\u3089\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u7D50\u3073\u4ED8\u3051\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u6587\u5B57 ++raw.quote = \u5358\u4E00\u306E\u30B3\u30DE\u30F3\u30C9\u884C\u5F15\u6570\u5185\u306B\u30B9\u30DA\u30FC\u30B9\u3067\u533A\u5207\u3089\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u7D50\u3073\u4ED8\u3051\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u6587\u5B57 + raw.quote.label = \u5F15\u7528\u7B26 +-raw.description = \u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u3092\u4F7F\u7528\u3057\u3066\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u8D77\u52D5\u3057\u3001\u63A5\u7D9A\u3057\u307E\u3059 ++raw.description = \u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F\u30B3\u30DE\u30F3\u30C9\u884C\u3092\u4F7F\u7528\u3057\u3066\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u8D77\u52D5\u3057\u3001\u63A5\u7D9A\u3057\u307E\u3059 + sun.home = SDK\u306E\u30DB\u30FC\u30E0\u30FB\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u307E\u305F\u306F\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u306E\u8D77\u52D5\u306B\u4F7F\u7528\u3055\u308C\u308B\u5B9F\u884C\u74B0\u5883 + sun.home.label = \u30DB\u30FC\u30E0 + sun.options = \u8D77\u52D5\u3059\u308BVM\u306E\u30AA\u30D7\u30B7\u30E7\u30F3 +@@ -16,11 +16,11 @@ + sun.main.label = \u30E1\u30A4\u30F3 + sun.init_suspend = \u30E1\u30A4\u30F3\u306E\u5B9F\u884C\u524D\u306B\u3059\u3079\u3066\u306E\u30B9\u30EC\u30C3\u30C9\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3059\u3002 + sun.init_suspend.label = \u4E2D\u65AD +-sun.quote = \u5358\u4E00\u306E\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u5F15\u6570\u5185\u306B\u30B9\u30DA\u30FC\u30B9\u3067\u533A\u5207\u3089\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u7D50\u3073\u4ED8\u3051\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u6587\u5B57 ++sun.quote = \u5358\u4E00\u306E\u30B3\u30DE\u30F3\u30C9\u884C\u5F15\u6570\u5185\u306B\u30B9\u30DA\u30FC\u30B9\u3067\u533A\u5207\u3089\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u7D50\u3073\u4ED8\u3051\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u6587\u5B57 + sun.quote.label = \u5F15\u7528\u7B26 + sun.vm_exec = Java VM\u8D77\u52D5\u30C4\u30FC\u30EB\u540D + sun.vm_exec.label = \u8D77\u52D5\u30C4\u30FC\u30EB +-sun.description = Sun\u306EJava VM\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u3092\u4F7F\u7528\u3057\u3066\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u8D77\u52D5\u3057\u3001\u63A5\u7D9A\u3057\u307E\u3059 ++sun.description = Sun\u306EJava VM\u30B3\u30DE\u30F3\u30C9\u884C\u3092\u4F7F\u7528\u3057\u3066\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u8D77\u52D5\u3057\u3001\u63A5\u7D9A\u3057\u307E\u3059 + generic_attaching.address = VM\u306B\u63A5\u7D9A\u3059\u308B\u30A2\u30C9\u30EC\u30B9 + generic_attaching.address.label = \u30A2\u30C9\u30EC\u30B9 + generic_attaching.timeout = \u63A5\u7D9A\u3092\u5F85\u3064\u9593\u306E\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 +@@ -47,6 +47,6 @@ + memory_listening.name = VM\u3078\u306E\u63A5\u7D9A\u3092\u30EA\u30B9\u30CB\u30F3\u30B0\u3059\u308B\u305F\u3081\u306E\u5171\u6709\u30E1\u30E2\u30EA\u30FC\u9818\u57DF\u540D + memory_listening.name.label = \u540D\u524D + memory_listening.description = \u305D\u306E\u4ED6\u306EVM\u306B\u3088\u308A\u958B\u59CB\u3055\u308C\u308B\u5171\u6709\u30E1\u30E2\u30EA\u30FC\u63A5\u7D9A\u3092\u53D7\u3051\u5165\u308C\u307E\u3059 +-process_attaching.description = \u30C7\u30D0\u30C3\u30B0\u3059\u308B\u30D7\u30ED\u30BB\u30B9\u306B\u30D7\u30ED\u30BB\u30B9ID(pid)\u3092\u4F7F\u7528\u3057\u3066\u63A5\u7D9A\u3057\u307E\u3059 ++process_attaching.description = \u30C7\u30D0\u30C3\u30B0\u3059\u308B\u30D7\u30ED\u30BB\u30B9\u306B\u30D7\u30ED\u30BB\u30B9ID (pid)\u3092\u4F7F\u7528\u3057\u3066\u63A5\u7D9A\u3057\u307E\u3059 + process_attaching.pid = pid +-process_attaching.pid.label = \u30C7\u30D0\u30C3\u30B0\u3059\u308B\u30D7\u30ED\u30BB\u30B9ID(pid) ++process_attaching.pid.label = \u30C7\u30D0\u30C3\u30B0\u3059\u308B\u30D7\u30ED\u30BB\u30B9ID (pid) +--- ./jdk/src/share/classes/java/awt/Component.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/Component.java Wed Jul 30 18:42:59 2014 +0100 +@@ -26,10 +26,10 @@ + + import java.io.PrintStream; + import java.io.PrintWriter; ++import java.util.Objects; + import java.util.Vector; + import java.util.Locale; + import java.util.EventListener; +-import java.util.Iterator; + import java.util.HashSet; + import java.util.Map; + import java.util.Set; +@@ -50,8 +50,6 @@ + import java.beans.PropertyChangeListener; + import java.beans.PropertyChangeSupport; + import java.beans.Transient; +-import java.awt.event.InputMethodListener; +-import java.awt.event.InputMethodEvent; + import java.awt.im.InputContext; + import java.awt.im.InputMethodRequests; + import java.awt.dnd.DropTarget; +@@ -8120,18 +8118,12 @@ + * @since JDK1.0 + */ + protected String paramString() { +- String thisName = getName(); +- String str = (thisName != null? thisName : "") + "," + x + "," + y + "," + width + "x" + height; +- if (!isValid()) { +- str += ",invalid"; +- } +- if (!visible) { +- str += ",hidden"; +- } +- if (!enabled) { +- str += ",disabled"; +- } +- return str; ++ final String thisName = Objects.toString(getName(), ""); ++ final String invalid = isValid() ? "" : ",invalid"; ++ final String hidden = visible ? "" : ",hidden"; ++ final String disabled = enabled ? "" : ",disabled"; ++ return thisName + ',' + x + ',' + y + ',' + width + 'x' + height ++ + invalid + hidden + disabled; + } + + /** +@@ -8140,7 +8132,7 @@ + * @since JDK1.0 + */ + public String toString() { +- return getClass().getName() + "[" + paramString() + "]"; ++ return getClass().getName() + '[' + paramString() + ']'; + } + + /** +--- ./jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Wed Jul 30 18:42:59 2014 +0100 +@@ -287,7 +287,7 @@ + synchronized (this) { + KeyEvent ke = enqueuedKeyEvents.isEmpty() ? null : enqueuedKeyEvents.getFirst(); + if (ke != null && time >= ke.getWhen()) { +- TypeAheadMarker marker = typeAheadMarkers.getFirst(); ++ TypeAheadMarker marker = typeAheadMarkers.isEmpty() ? null : typeAheadMarkers.getFirst(); + if (marker != null) { + Window toplevel = marker.untilFocused.getContainingWindow(); + // Check that the component awaiting focus belongs to +--- ./jdk/src/share/classes/java/awt/EventQueue.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/EventQueue.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1093,6 +1093,13 @@ + dispatchThread = null; + } + AWTAutoShutdown.getInstance().notifyThreadFree(edt); ++ /* ++ * Event was posted after EDT events pumping had stopped, so start ++ * another EDT to handle this event ++ */ ++ if (peekEvent() != null) { ++ initDispatchThread(); ++ } + } finally { + pushPopLock.unlock(); + } +--- ./jdk/src/share/classes/java/awt/Label.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/Label.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -272,13 +272,13 @@ + * @return the parameter string of this label + */ + protected String paramString() { +- String str = ",align="; ++ String align = ""; + switch (alignment) { +- case LEFT: str += "left"; break; +- case CENTER: str += "center"; break; +- case RIGHT: str += "right"; break; ++ case LEFT: align = "left"; break; ++ case CENTER: align = "center"; break; ++ case RIGHT: align = "right"; break; + } +- return super.paramString() + str + ",text=" + text; ++ return super.paramString() + ",align=" + align + ",text=" + text; + } + + /** +--- ./jdk/src/share/classes/java/awt/MediaTracker.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/MediaTracker.java Wed Jul 30 18:42:59 2014 +0100 +@@ -28,6 +28,7 @@ + import java.awt.Component; + import java.awt.Image; + import java.awt.image.ImageObserver; ++import sun.awt.image.MultiResolutionToolkitImage; + + /** + * The <code>MediaTracker</code> class is a utility class to track +@@ -222,10 +223,19 @@ + * @param h the height at which the image is rendered + */ + public synchronized void addImage(Image image, int id, int w, int h) { ++ addImageImpl(image, id, w, h); ++ Image rvImage = getResolutionVariant(image); ++ if (rvImage != null) { ++ addImageImpl(rvImage, id, ++ w == -1 ? -1 : 2 * w, ++ h == -1 ? -1 : 2 * h); ++ } ++ } ++ ++ private void addImageImpl(Image image, int id, int w, int h) { + head = MediaEntry.insert(head, + new ImageMediaEntry(this, image, id, w, h)); + } +- + /** + * Flag indicating that media is currently being loaded. + * @see java.awt.MediaTracker#statusAll +@@ -719,6 +729,15 @@ + * @since JDK1.1 + */ + public synchronized void removeImage(Image image) { ++ removeImageImpl(image); ++ Image rvImage = getResolutionVariant(image); ++ if (rvImage != null) { ++ removeImageImpl(rvImage); ++ } ++ notifyAll(); // Notify in case remaining images are "done". ++ } ++ ++ private void removeImageImpl(Image image) { + MediaEntry cur = head; + MediaEntry prev = null; + while (cur != null) { +@@ -735,7 +754,6 @@ + } + cur = next; + } +- notifyAll(); // Notify in case remaining images are "done". + } + + /** +@@ -750,6 +768,15 @@ + * @since JDK1.1 + */ + public synchronized void removeImage(Image image, int id) { ++ removeImageImpl(image, id); ++ Image rvImage = getResolutionVariant(image); ++ if (rvImage != null) { ++ removeImageImpl(rvImage, id); ++ } ++ notifyAll(); // Notify in case remaining images are "done". ++ } ++ ++ private void removeImageImpl(Image image, int id) { + MediaEntry cur = head; + MediaEntry prev = null; + while (cur != null) { +@@ -766,7 +793,6 @@ + } + cur = next; + } +- notifyAll(); // Notify in case remaining images are "done". + } + + /** +@@ -783,6 +809,17 @@ + */ + public synchronized void removeImage(Image image, int id, + int width, int height) { ++ removeImageImpl(image, id, width, height); ++ Image rvImage = getResolutionVariant(image); ++ if (rvImage != null) { ++ removeImageImpl(rvImage, id, ++ width == -1 ? -1 : 2 * width, ++ height == -1 ? -1 : 2 * height); ++ } ++ notifyAll(); // Notify in case remaining images are "done". ++ } ++ ++ private void removeImageImpl(Image image, int id, int width, int height) { + MediaEntry cur = head; + MediaEntry prev = null; + while (cur != null) { +@@ -801,12 +838,18 @@ + } + cur = next; + } +- notifyAll(); // Notify in case remaining images are "done". + } + + synchronized void setDone() { + notifyAll(); + } ++ ++ private static Image getResolutionVariant(Image image) { ++ if (image instanceof MultiResolutionToolkitImage) { ++ return ((MultiResolutionToolkitImage) image).getResolutionVariant(); ++ } ++ return null; ++ } + } + + abstract class MediaEntry { +--- ./jdk/src/share/classes/java/awt/PointerInfo.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/PointerInfo.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 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 +@@ -23,62 +23,59 @@ + * questions. + */ + ++ + package java.awt; + + /** + * A class that describes the pointer position. +- * It provides the <code>GraphicsDevice</code> where the +- * pointer is and the <code>Point</code> that represents +- * the coordinates of the pointer. ++ * It provides the {@code GraphicsDevice} where the pointer is and ++ * the {@code Point} that represents the coordinates of the pointer. + * <p> + * Instances of this class should be obtained via + * {@link MouseInfo#getPointerInfo}. +- * The <code>PointerInfo</code> instance is not updated dynamically +- * as the mouse moves. To get the updated location, you must call ++ * The {@code PointerInfo} instance is not updated dynamically as the mouse ++ * moves. To get the updated location, you must call + * {@link MouseInfo#getPointerInfo} again. + * + * @see MouseInfo#getPointerInfo +- * @author Roman Poborchiy +- * @since 1.5 ++ * @author Roman Poborchiy ++ * @since 1.5 + */ +- + public class PointerInfo { + +- private GraphicsDevice device; +- private Point location; ++ private final GraphicsDevice device; ++ private final Point location; + + /** + * Package-private constructor to prevent instantiation. + */ +- PointerInfo(GraphicsDevice device, Point location) { ++ PointerInfo(final GraphicsDevice device, final Point location) { + this.device = device; + this.location = location; + } + + /** +- * Returns the <code>GraphicsDevice</code> where the mouse pointer +- * was at the moment this <code>PointerInfo</code> was created. ++ * Returns the {@code GraphicsDevice} where the mouse pointer was at the ++ * moment this {@code PointerInfo} was created. + * +- * @return <code>GraphicsDevice</code> corresponding to the pointer +- * @since 1.5 ++ * @return {@code GraphicsDevice} corresponding to the pointer ++ * @since 1.5 + */ + public GraphicsDevice getDevice() { + return device; + } + + /** +- * Returns the <code>Point</code> that represents the coordinates +- * of the pointer on the screen. See {@link MouseInfo#getPointerInfo} +- * for more information about coordinate calculation for multiscreen +- * systems. ++ * Returns the {@code Point} that represents the coordinates of the pointer ++ * on the screen. See {@link MouseInfo#getPointerInfo} for more information ++ * about coordinate calculation for multiscreen systems. + * ++ * @return coordinates of mouse pointer + * @see MouseInfo + * @see MouseInfo#getPointerInfo +- * @return coordinates of mouse pointer +- * @since 1.5 ++ * @since 1.5 + */ + public Point getLocation() { + return location; + } +- + } +--- ./jdk/src/share/classes/java/awt/Robot.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/Robot.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2009, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -72,9 +72,6 @@ + private int autoDelay = 0; + private static int LEGAL_BUTTON_MASK = 0; + +- // location of robot's GC, used in mouseMove(), getPixelColor() and captureScreenImage() +- private Point gdLoc; +- + private DirectColorModel screenCapCM = null; + + /** +@@ -132,7 +129,6 @@ + + private void init(GraphicsDevice screen) throws AWTException { + checkRobotAllowed(); +- gdLoc = screen.getDefaultConfiguration().getBounds().getLocation(); + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if (toolkit instanceof ComponentFactory) { + peer = ((ComponentFactory)toolkit).createRobot(this, screen); +@@ -200,7 +196,7 @@ + * @param y Y position + */ + public synchronized void mouseMove(int x, int y) { +- peer.mouseMove(gdLoc.x + x, gdLoc.y + y); ++ peer.mouseMove(x, y); + afterEvent(); + } + +@@ -395,7 +391,7 @@ + * @return Color of the pixel + */ + public synchronized Color getPixelColor(int x, int y) { +- Color color = new Color(peer.getRGBPixel(gdLoc.x + x, gdLoc.y + y)); ++ Color color = new Color(peer.getRGBPixel(x, y)); + return color; + } + +@@ -412,10 +408,7 @@ + public synchronized BufferedImage createScreenCapture(Rectangle screenRect) { + checkScreenCaptureAllowed(); + +- // according to the spec, screenRect is relative to robot's GD +- Rectangle translatedRect = new Rectangle(screenRect); +- translatedRect.translate(gdLoc.x, gdLoc.y); +- checkValidRect(translatedRect); ++ checkValidRect(screenRect); + + BufferedImage image; + DataBufferInt buffer; +@@ -441,14 +434,14 @@ + int pixels[]; + int[] bandmasks = new int[3]; + +- pixels = peer.getRGBPixels(translatedRect); ++ pixels = peer.getRGBPixels(screenRect); + buffer = new DataBufferInt(pixels, pixels.length); + + bandmasks[0] = screenCapCM.getRedMask(); + bandmasks[1] = screenCapCM.getGreenMask(); + bandmasks[2] = screenCapCM.getBlueMask(); + +- raster = Raster.createPackedRaster(buffer, translatedRect.width, translatedRect.height, translatedRect.width, bandmasks, null); ++ raster = Raster.createPackedRaster(buffer, screenRect.width, screenRect.height, screenRect.width, bandmasks, null); + SunWritableRaster.makeTrackable(buffer); + + image = new BufferedImage(screenCapCM, raster, false, null); +--- ./jdk/src/share/classes/java/awt/SystemColor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/SystemColor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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,8 @@ + */ + package java.awt; + ++import sun.awt.AWTAccessor; ++ + import java.io.ObjectStreamException; + + import java.lang.annotation.Native; +@@ -459,7 +461,8 @@ + }; + + static { +- updateSystemColors(); ++ AWTAccessor.setSystemColorAccessor(SystemColor::updateSystemColors); ++ updateSystemColors(); + } + + /** +--- ./jdk/src/share/classes/java/awt/Toolkit.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/Toolkit.java Wed Jul 30 18:42:59 2014 +0100 +@@ -26,10 +26,6 @@ + package java.awt; + + import java.beans.PropertyChangeEvent; +-import java.util.MissingResourceException; +-import java.util.Properties; +-import java.util.ResourceBundle; +-import java.util.StringTokenizer; + import java.awt.event.*; + import java.awt.peer.*; + import java.awt.im.InputMethodHighlight; +@@ -855,50 +851,39 @@ + */ + public static synchronized Toolkit getDefaultToolkit() { + if (toolkit == null) { +- try { +- // We disable the JIT during toolkit initialization. This +- // tends to touch lots of classes that aren't needed again +- // later and therefore JITing is counter-productiive. +- java.lang.Compiler.disable(); +- +- java.security.AccessController.doPrivileged( +- new java.security.PrivilegedAction<Void>() { +- public Void run() { +- String nm = null; +- Class<?> cls = null; +- try { +- nm = System.getProperty("awt.toolkit"); ++ java.security.AccessController.doPrivileged( ++ new java.security.PrivilegedAction<Void>() { ++ public Void run() { ++ Class<?> cls = null; ++ String nm = System.getProperty("awt.toolkit"); ++ try { ++ cls = Class.forName(nm); ++ } catch (ClassNotFoundException e) { ++ ClassLoader cl = ClassLoader.getSystemClassLoader(); ++ if (cl != null) { + try { +- cls = Class.forName(nm); +- } catch (ClassNotFoundException e) { +- ClassLoader cl = ClassLoader.getSystemClassLoader(); +- if (cl != null) { +- try { +- cls = cl.loadClass(nm); +- } catch (ClassNotFoundException ee) { +- throw new AWTError("Toolkit not found: " + nm); +- } +- } ++ cls = cl.loadClass(nm); ++ } catch (final ClassNotFoundException ignored) { ++ throw new AWTError("Toolkit not found: " + nm); + } +- if (cls != null) { +- toolkit = (Toolkit)cls.newInstance(); +- if (GraphicsEnvironment.isHeadless()) { +- toolkit = new HeadlessToolkit(toolkit); +- } ++ } ++ } ++ try { ++ if (cls != null) { ++ toolkit = (Toolkit)cls.newInstance(); ++ if (GraphicsEnvironment.isHeadless()) { ++ toolkit = new HeadlessToolkit(toolkit); + } +- } catch (InstantiationException e) { +- throw new AWTError("Could not instantiate Toolkit: " + nm); +- } catch (IllegalAccessException e) { +- throw new AWTError("Could not access Toolkit: " + nm); + } +- return null; ++ } catch (final InstantiationException ignored) { ++ throw new AWTError("Could not instantiate Toolkit: " + nm); ++ } catch (final IllegalAccessException ignored) { ++ throw new AWTError("Could not access Toolkit: " + nm); + } +- }); +- loadAssistiveTechnologies(); +- } finally { +- // Make sure to always re-enable the JIT. +- java.lang.Compiler.enable(); +- } ++ return null; ++ } ++ }); ++ loadAssistiveTechnologies(); + } + return toolkit; + } +--- ./jdk/src/share/classes/java/awt/datatransfer/DataFlavor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/datatransfer/DataFlavor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -25,13 +25,28 @@ + + package java.awt.datatransfer; + +-import java.io.*; +-import java.nio.*; +-import java.util.*; +- + import sun.awt.datatransfer.DataTransferer; + import sun.reflect.misc.ReflectUtil; + ++import java.io.ByteArrayInputStream; ++import java.io.CharArrayReader; ++import java.io.Externalizable; ++import java.io.IOException; ++import java.io.InputStream; ++import java.io.InputStreamReader; ++import java.io.ObjectInput; ++import java.io.ObjectOutput; ++import java.io.OptionalDataException; ++import java.io.Reader; ++import java.io.StringReader; ++import java.io.UnsupportedEncodingException; ++import java.nio.ByteBuffer; ++import java.nio.CharBuffer; ++import java.util.Arrays; ++import java.util.Collections; ++import java.util.Comparator; ++import java.util.Objects; ++ + import static sun.security.util.SecurityConstants.GET_CLASSLOADER_PERMISSION; + + /** +@@ -501,7 +516,7 @@ + * @throws ClassNotFoundException + * @throws NullPointerException if <code>mimeType</code> is null + * +- * @see tryToLoadClass ++ * @see #tryToLoadClass + */ + private void initialize(String mimeType, String humanPresentableName, ClassLoader classLoader) throws MimeTypeParseException, ClassNotFoundException { + if (mimeType == null) { +@@ -570,7 +585,7 @@ + if (DataTransferer.isFlavorCharsetTextType(this) && + (isRepresentationClassInputStream() || + isRepresentationClassByteBuffer() || +- DataTransferer.byteArrayClass.equals(representationClass))) ++ byte[].class.equals(representationClass))) + { + params += ";charset=" + DataTransferer.getTextCharset(this); + } +@@ -990,14 +1005,8 @@ + return true; + } + +- if (representationClass == null) { +- if (that.getRepresentationClass() != null) { +- return false; +- } +- } else { +- if (!representationClass.equals(that.getRepresentationClass())) { +- return false; +- } ++ if (!Objects.equals(this.getRepresentationClass(), that.getRepresentationClass())) { ++ return false; + } + + if (mimeType == null) { +@@ -1010,34 +1019,22 @@ + } + + if ("text".equals(getPrimaryType())) { +- if (DataTransferer.doesSubtypeSupportCharset(this) && +- representationClass != null && +- !(isRepresentationClassReader() || +- String.class.equals(representationClass) || +- isRepresentationClassCharBuffer() || +- DataTransferer.charArrayClass.equals(representationClass))) +- { ++ if (DataTransferer.doesSubtypeSupportCharset(this) ++ && representationClass != null ++ && !isStandardTextRepresentationClass()) { + String thisCharset = +- DataTransferer.canonicalName(getParameter("charset")); ++ DataTransferer.canonicalName(this.getParameter("charset")); + String thatCharset = +- DataTransferer.canonicalName(that.getParameter("charset")); +- if (thisCharset == null) { +- if (thatCharset != null) { +- return false; +- } +- } else { +- if (!thisCharset.equals(thatCharset)) { +- return false; +- } ++ DataTransferer.canonicalName(that.getParameter("charset")); ++ if (!Objects.equals(thisCharset, thatCharset)) { ++ return false; + } + } + +- if ("html".equals(getSubType()) && +- this.getParameter("document") != null ) +- { +- if (!this.getParameter("document"). +- equals(that.getParameter("document"))) +- { ++ if ("html".equals(getSubType())) { ++ String thisDocument = this.getParameter("document"); ++ String thatDocument = that.getParameter("document"); ++ if (!Objects.equals(thisDocument, thatDocument)) { + return false; + } + } +@@ -1094,19 +1091,21 @@ + // MimeType.match which reports a match if one or both of the + // subTypes is '*', regardless of the other subType. + +- if ("text".equals(primaryType) && +- DataTransferer.doesSubtypeSupportCharset(this) && +- representationClass != null && +- !(isRepresentationClassReader() || +- String.class.equals(representationClass) || +- isRepresentationClassCharBuffer() || +- DataTransferer.charArrayClass.equals +- (representationClass))) +- { +- String charset = +- DataTransferer.canonicalName(getParameter("charset")); +- if (charset != null) { +- total += charset.hashCode(); ++ if ("text".equals(primaryType)) { ++ if (DataTransferer.doesSubtypeSupportCharset(this) ++ && representationClass != null ++ && !isStandardTextRepresentationClass()) { ++ String charset = DataTransferer.canonicalName(getParameter("charset")); ++ if (charset != null) { ++ total += charset.hashCode(); ++ } ++ } ++ ++ if ("html".equals(getSubType())) { ++ String document = this.getParameter("document"); ++ if (document != null) { ++ total += document.hashCode(); ++ } + } + } + } +@@ -1182,6 +1181,20 @@ + return mimeType.match(mtype); + } + ++ /** ++ * Checks if the representation class is one of the standard text ++ * representation classes. ++ * ++ * @return true if the representation class is one of the standard text ++ * representation classes, otherwise false ++ */ ++ private boolean isStandardTextRepresentationClass() { ++ return isRepresentationClassReader() ++ || String.class.equals(representationClass) ++ || isRepresentationClassCharBuffer() ++ || char[].class.equals(representationClass); ++ } ++ + /** + * Does the <code>DataFlavor</code> represent a serialized object? + */ +--- ./jdk/src/share/classes/java/awt/dnd/DragGestureEvent.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/dnd/DragGestureEvent.java Wed Jul 30 18:42:59 2014 +0100 +@@ -36,6 +36,7 @@ + + import java.awt.datatransfer.Transferable; + ++import java.io.InvalidObjectException; + import java.util.EventObject; + + import java.util.Collections; +@@ -329,22 +330,50 @@ + { + ObjectInputStream.GetField f = s.readFields(); + +- dragSource = (DragSource)f.get("dragSource", null); +- component = (Component)f.get("component", null); +- origin = (Point)f.get("origin", null); +- action = f.get("action", 0); ++ DragSource newDragSource = (DragSource)f.get("dragSource", null); ++ if (newDragSource == null) { ++ throw new InvalidObjectException("null DragSource"); ++ } ++ dragSource = newDragSource; ++ ++ Component newComponent = (Component)f.get("component", null); ++ if (newComponent == null) { ++ throw new InvalidObjectException("null component"); ++ } ++ component = newComponent; ++ ++ Point newOrigin = (Point)f.get("origin", null); ++ if (newOrigin == null) { ++ throw new InvalidObjectException("null origin"); ++ } ++ origin = newOrigin; ++ ++ int newAction = f.get("action", 0); ++ if (newAction != DnDConstants.ACTION_COPY && ++ newAction != DnDConstants.ACTION_MOVE && ++ newAction != DnDConstants.ACTION_LINK) { ++ throw new InvalidObjectException("bad action"); ++ } ++ action = newAction; ++ + // Pre-1.4 support. 'events' was previously non-transient ++ List newEvents; + try { +- events = (List)f.get("events", null); ++ newEvents = (List)f.get("events", null); + } catch (IllegalArgumentException e) { + // 1.4-compatible byte stream. 'events' was written explicitly +- events = (List)s.readObject(); ++ newEvents = (List)s.readObject(); + } + + // Implementation assumes 'events' is never null. +- if (events == null) { +- events = Collections.EMPTY_LIST; ++ if (newEvents != null && newEvents.isEmpty()) { ++ // Constructor treats empty events list as invalid value ++ // Throw exception if serialized list is empty ++ throw new InvalidObjectException("empty list of events"); ++ } else if (newEvents == null) { ++ newEvents = Collections.emptyList(); + } ++ events = newEvents; + } + + /* +--- ./jdk/src/share/classes/java/awt/dnd/DragGestureRecognizer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/dnd/DragGestureRecognizer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -29,6 +29,8 @@ + import java.awt.Component; + import java.awt.Point; + ++import java.io.InvalidObjectException; ++import java.util.Collections; + import java.util.TooManyListenersException; + import java.util.ArrayList; + +@@ -411,10 +413,21 @@ + * + * @since 1.4 + */ ++ @SuppressWarnings("unchecked") + private void readObject(ObjectInputStream s) + throws ClassNotFoundException, IOException + { +- s.defaultReadObject(); ++ ObjectInputStream.GetField f = s.readFields(); ++ ++ DragSource newDragSource = (DragSource)f.get("dragSource", null); ++ if (newDragSource == null) { ++ throw new InvalidObjectException("null DragSource"); ++ } ++ dragSource = newDragSource; ++ ++ component = (Component)f.get("component", null); ++ sourceActions = f.get("sourceActions", 0) & (DnDConstants.ACTION_COPY_OR_MOVE | DnDConstants.ACTION_LINK); ++ events = (ArrayList<InputEvent>)f.get("events", new ArrayList<>(1)); + + dragGestureListener = (DragGestureListener)s.readObject(); + } +--- ./jdk/src/share/classes/java/awt/dnd/DragSourceContext.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/dnd/DragSourceContext.java Wed Jul 30 18:42:59 2014 +0100 +@@ -37,6 +37,7 @@ + import java.awt.dnd.peer.DragSourceContextPeer; + + import java.io.IOException; ++import java.io.InvalidObjectException; + import java.io.ObjectOutputStream; + import java.io.ObjectInputStream; + import java.io.Serializable; +@@ -562,7 +563,35 @@ + private void readObject(ObjectInputStream s) + throws ClassNotFoundException, IOException + { +- s.defaultReadObject(); ++ ObjectInputStream.GetField f = s.readFields(); ++ ++ DragGestureEvent newTrigger = (DragGestureEvent)f.get("trigger", null); ++ if (newTrigger == null) { ++ throw new InvalidObjectException("Null trigger"); ++ } ++ if (newTrigger.getDragSource() == null) { ++ throw new InvalidObjectException("Null DragSource"); ++ } ++ if (newTrigger.getComponent() == null) { ++ throw new InvalidObjectException("Null trigger component"); ++ } ++ ++ int newSourceActions = f.get("sourceActions", 0) ++ & (DnDConstants.ACTION_COPY_OR_MOVE | DnDConstants.ACTION_LINK); ++ if (newSourceActions == DnDConstants.ACTION_NONE) { ++ throw new InvalidObjectException("Invalid source actions"); ++ } ++ int triggerActions = newTrigger.getDragAction(); ++ if (triggerActions != DnDConstants.ACTION_COPY && ++ triggerActions != DnDConstants.ACTION_MOVE && ++ triggerActions != DnDConstants.ACTION_LINK) { ++ throw new InvalidObjectException("No drag action"); ++ } ++ trigger = newTrigger; ++ ++ cursor = (Cursor)f.get("cursor", null); ++ useCustomCursor = f.get("useCustomCursor", false); ++ sourceActions = newSourceActions; + + transferable = (Transferable)s.readObject(); + listener = (DragSourceListener)s.readObject(); +@@ -630,5 +659,5 @@ + * + * @serial + */ +- private final int sourceActions; ++ private int sourceActions; + } +--- ./jdk/src/share/classes/java/awt/geom/Path2D.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/geom/Path2D.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -285,6 +285,8 @@ + int grow = size; + if (grow > EXPAND_MAX) { + grow = EXPAND_MAX; ++ } else if (grow == 0) { ++ grow = 1; + } + pointTypes = Arrays.copyOf(pointTypes, size+grow); + } +@@ -1121,6 +1123,8 @@ + int grow = size; + if (grow > EXPAND_MAX) { + grow = EXPAND_MAX; ++ } else if (grow == 0) { ++ grow = 1; + } + pointTypes = Arrays.copyOf(pointTypes, size+grow); + } +--- ./jdk/src/share/classes/java/awt/peer/CheckboxMenuItemPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/peer/CheckboxMenuItemPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 1998, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -38,12 +38,12 @@ + public interface CheckboxMenuItemPeer extends MenuItemPeer { + + /** +- * Sets the state of the checkbox to be checked ({@code true}) or +- * unchecked ({@code false}). ++ * Sets the state of the checkbox to be checked {@code true} or ++ * unchecked {@code false}. + * +- * @param t the state to set on the checkbox ++ * @param state the state to set on the checkbox + * +- * @see CheckboxMenuItemPeer#setState(boolean) ++ * @see CheckboxMenuItem#setState(boolean) + */ +- void setState(boolean t); ++ void setState(boolean state); + } +--- ./jdk/src/share/classes/java/awt/peer/CheckboxPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/peer/CheckboxPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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,7 +24,8 @@ + */ + package java.awt.peer; + +-import java.awt.*; ++import java.awt.Checkbox; ++import java.awt.CheckboxGroup; + + /** + * The peer interface for {@link Checkbox}. +@@ -38,8 +39,8 @@ + public interface CheckboxPeer extends ComponentPeer { + + /** +- * Sets the state of the checkbox to be checked ({@code true}) or +- * unchecked ({@code false}). ++ * Sets the state of the checkbox to be checked {@code true} or ++ * unchecked {@code false}. + * + * @param state the state to set on the checkbox + * +@@ -60,7 +61,7 @@ + void setCheckboxGroup(CheckboxGroup g); + + /** +- * Sets the label that should be displayed on the ckeckbox. A value of ++ * Sets the label that should be displayed on the checkbox. A value of + * {@code null} means that no label should be displayed. + * + * @param label the label to be displayed on the checkbox, or +--- ./jdk/src/share/classes/java/awt/peer/ComponentPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/peer/ComponentPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -27,11 +27,11 @@ + + import java.awt.*; + import java.awt.event.PaintEvent; ++import java.awt.image.ColorModel; ++import java.awt.image.ImageObserver; + import java.awt.image.ImageProducer; +-import java.awt.image.ImageObserver; +-import java.awt.image.ColorModel; + import java.awt.image.VolatileImage; +-import java.awt.GraphicsConfiguration; ++ + import sun.awt.CausedFocusEvent; + import sun.java2d.pipe.Region; + +--- ./jdk/src/share/classes/java/awt/peer/TextAreaPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/awt/peer/TextAreaPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 1998, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -49,7 +49,7 @@ + void insert(String text, int pos); + + /** +- * Replaces a range of text by the specified string ++ * Replaces a range of text by the specified string. + * + * @param text the replacement string + * @param start the begin of the range to replace +--- ./jdk/src/share/classes/java/beans/Introspector.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/beans/Introspector.java Wed Jul 30 18:42:59 2014 +0100 +@@ -806,7 +806,7 @@ + } + + private static boolean isAssignable(Class<?> current, Class<?> candidate) { +- return current == null ? candidate == null : current.isAssignableFrom(candidate); ++ return ((current == null) || (candidate == null)) ? current == candidate : current.isAssignableFrom(candidate); + } + + /** +--- ./jdk/src/share/classes/java/beans/MethodDescriptor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/beans/MethodDescriptor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -162,6 +162,16 @@ + : null; + } + ++ private static Method resolve(Method oldMethod, Method newMethod) { ++ if (oldMethod == null) { ++ return newMethod; ++ } ++ if (newMethod == null) { ++ return oldMethod; ++ } ++ return !oldMethod.isSynthetic() && newMethod.isSynthetic() ? oldMethod : newMethod; ++ } ++ + /* + * Package-private constructor + * Merge two method descriptors. Where they conflict, give the +@@ -173,8 +183,7 @@ + MethodDescriptor(MethodDescriptor x, MethodDescriptor y) { + super(x, y); + +- Method method = y.methodRef.get(); +- this.methodRef.set(null != method ? method : x.methodRef.get()); ++ this.methodRef.set(resolve(x.methodRef.get(), y.methodRef.get())); + params = x.params; + if (y.params != null) { + params = y.params; +--- ./jdk/src/share/classes/java/io/FileInputStream.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/io/FileInputStream.java Wed Jul 30 18:42:59 2014 +0100 +@@ -51,6 +51,12 @@ + /* File Descriptor - handle to the open file */ + private final FileDescriptor fd; + ++ /** ++ * The path of the referenced file ++ * (null if the stream is created with a file descriptor) ++ */ ++ private final String path; ++ + private FileChannel channel = null; + + private final Object closeLock = new Object(); +@@ -128,6 +134,7 @@ + } + fd = new FileDescriptor(); + fd.attach(this); ++ path = name; + open(name); + } + +@@ -164,6 +171,7 @@ + security.checkRead(fdObj); + } + fd = fdObj; ++ path = null; + + /* + * FileDescriptor is being shared by streams. +@@ -186,7 +194,11 @@ + * file is reached. + * @exception IOException if an I/O error occurs. + */ +- public native int read() throws IOException; ++ public int read() throws IOException { ++ return read0(); ++ } ++ ++ private native int read0() throws IOException; + + /** + * Reads a subarray as a sequence of bytes. +@@ -345,7 +357,7 @@ + public FileChannel getChannel() { + synchronized (this) { + if (channel == null) { +- channel = FileChannelImpl.open(fd, true, false, this); ++ channel = FileChannelImpl.open(fd, path, true, false, this); + } + return channel; + } +--- ./jdk/src/share/classes/java/io/FileOutputStream.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/io/FileOutputStream.java Wed Jul 30 18:42:59 2014 +0100 +@@ -67,6 +67,12 @@ + */ + private FileChannel channel; + ++ /** ++ * The path of the referenced file ++ * (null if the stream is created with a file descriptor) ++ */ ++ private final String path; ++ + private final Object closeLock = new Object(); + private volatile boolean closed = false; + +@@ -202,6 +208,7 @@ + this.fd = new FileDescriptor(); + fd.attach(this); + this.append = append; ++ this.path = name; + + open(name, append); + } +@@ -239,6 +246,7 @@ + } + this.fd = fdObj; + this.append = false; ++ this.path = null; + + fd.attach(this); + } +@@ -376,7 +384,7 @@ + public FileChannel getChannel() { + synchronized (this) { + if (channel == null) { +- channel = FileChannelImpl.open(fd, false, true, append, this); ++ channel = FileChannelImpl.open(fd, path, false, true, append, this); + } + return channel; + } +--- ./jdk/src/share/classes/java/io/ObjectOutputStream.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/io/ObjectOutputStream.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1255,7 +1255,7 @@ + } + + bout.setBlockDataMode(true); +- if (isCustomSubclass()) { ++ if (cl != null && isCustomSubclass()) { + ReflectUtil.checkPackageAccess(cl); + } + annotateProxyClass(cl); +@@ -1284,7 +1284,7 @@ + + Class<?> cl = desc.forClass(); + bout.setBlockDataMode(true); +- if (isCustomSubclass()) { ++ if (cl != null && isCustomSubclass()) { + ReflectUtil.checkPackageAccess(cl); + } + annotateClass(cl); +--- ./jdk/src/share/classes/java/io/RandomAccessFile.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/io/RandomAccessFile.java Wed Jul 30 18:42:59 2014 +0100 +@@ -62,6 +62,12 @@ + private FileChannel channel = null; + private boolean rw; + ++ /** ++ * The path of the referenced file ++ * (null if the stream is created with a file descriptor) ++ */ ++ private final String path; ++ + private Object closeLock = new Object(); + private volatile boolean closed = false; + +@@ -233,6 +239,7 @@ + } + fd = new FileDescriptor(); + fd.attach(this); ++ path = name; + open(name, imode); + } + +@@ -272,7 +279,7 @@ + public final FileChannel getChannel() { + synchronized (this) { + if (channel == null) { +- channel = FileChannelImpl.open(fd, true, rw, this); ++ channel = FileChannelImpl.open(fd, path, true, rw, this); + } + return channel; + } +@@ -309,7 +316,11 @@ + * @exception IOException if an I/O error occurs. Not thrown if + * end-of-file has been reached. + */ +- public native int read() throws IOException; ++ public int read() throws IOException { ++ return read0(); ++ } ++ ++ private native int read0() throws IOException; + + /** + * Reads a sub array as a sequence of bytes. +@@ -457,7 +468,11 @@ + * @param b the {@code byte} to be written. + * @exception IOException if an I/O error occurs. + */ +- public native void write(int b) throws IOException; ++ public void write(int b) throws IOException { ++ write0(b); ++ } ++ ++ private native void write0(int b) throws IOException; + + /** + * Writes a sub array as a sequence of bytes. +--- ./jdk/src/share/classes/java/lang/Class.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/Class.java Wed Jul 30 18:42:59 2014 +0100 +@@ -2697,12 +2697,26 @@ + } + + static class MethodArray { ++ // Don't add or remove methods except by add() or remove() calls. + private Method[] methods; + private int length; ++ private int defaults; + + MethodArray() { +- methods = new Method[20]; ++ this(20); ++ } ++ ++ MethodArray(int initialSize) { ++ if (initialSize < 2) ++ throw new IllegalArgumentException("Size should be 2 or more"); ++ ++ methods = new Method[initialSize]; + length = 0; ++ defaults = 0; ++ } ++ ++ boolean hasDefaults() { ++ return defaults != 0; + } + + void add(Method m) { +@@ -2710,6 +2724,9 @@ + methods = Arrays.copyOf(methods, 2 * methods.length); + } + methods[length++] = m; ++ ++ if (m != null && m.isDefault()) ++ defaults++; + } + + void addAll(Method[] ma) { +@@ -2743,7 +2760,10 @@ + } + } + +- void addAllNonStatic(Method[] methods) { ++ /* Add Methods declared in an interface to this MethodArray. ++ * Static methods declared in interfaces are not inherited. ++ */ ++ void addInterfaceMethods(Method[] methods) { + for (Method candidate : methods) { + if (!Modifier.isStatic(candidate.getModifiers())) { + add(candidate); +@@ -2759,19 +2779,35 @@ + return methods[i]; + } + +- void removeByNameAndSignature(Method toRemove) { ++ Method getFirst() { ++ for (Method m : methods) ++ if (m != null) ++ return m; ++ return null; ++ } ++ ++ void removeByNameAndDescriptor(Method toRemove) { + for (int i = 0; i < length; i++) { + Method m = methods[i]; +- if (m != null && +- m.getReturnType() == toRemove.getReturnType() && +- m.getName() == toRemove.getName() && +- arrayContentsEq(m.getParameterTypes(), +- toRemove.getParameterTypes())) { +- methods[i] = null; ++ if (m != null && matchesNameAndDescriptor(m, toRemove)) { ++ remove(i); + } + } + } + ++ private void remove(int i) { ++ if (methods[i] != null && methods[i].isDefault()) ++ defaults--; ++ methods[i] = null; ++ } ++ ++ private boolean matchesNameAndDescriptor(Method m1, Method m2) { ++ return m1.getReturnType() == m2.getReturnType() && ++ m1.getName() == m2.getName() && // name is guaranteed to be interned ++ arrayContentsEq(m1.getParameterTypes(), ++ m2.getParameterTypes()); ++ } ++ + void compactAndTrim() { + int newPos = 0; + // Get rid of null slots +@@ -2789,9 +2825,48 @@ + } + } + ++ /* Removes all Methods from this MethodArray that have a more specific ++ * default Method in this MethodArray. ++ * ++ * Users of MethodArray are responsible for pruning Methods that have ++ * a more specific <em>concrete</em> Method. ++ */ ++ void removeLessSpecifics() { ++ if (!hasDefaults()) ++ return; ++ ++ for (int i = 0; i < length; i++) { ++ Method m = get(i); ++ if (m == null || !m.isDefault()) ++ continue; ++ ++ for (int j = 0; j < length; j++) { ++ if (i == j) ++ continue; ++ ++ Method candidate = get(j); ++ if (candidate == null) ++ continue; ++ ++ if (!matchesNameAndDescriptor(m, candidate)) ++ continue; ++ ++ if (hasMoreSpecificClass(m, candidate)) ++ remove(j); ++ } ++ } ++ } ++ + Method[] getArray() { + return methods; + } ++ ++ // Returns true if m1 is more specific than m2 ++ static boolean hasMoreSpecificClass(Method m1, Method m2) { ++ Class<?> m1Class = m1.getDeclaringClass(); ++ Class<?> m2Class = m2.getDeclaringClass(); ++ return m1Class != m2Class && m2Class.isAssignableFrom(m1Class); ++ } + } + + +@@ -2819,9 +2894,8 @@ + // out concrete implementations inherited from superclasses at + // the end. + MethodArray inheritedMethods = new MethodArray(); +- Class<?>[] interfaces = getInterfaces(); +- for (int i = 0; i < interfaces.length; i++) { +- inheritedMethods.addAllNonStatic(interfaces[i].privateGetPublicMethods()); ++ for (Class<?> i : getInterfaces()) { ++ inheritedMethods.addInterfaceMethods(i.privateGetPublicMethods()); + } + if (!isInterface()) { + Class<?> c = getSuperclass(); +@@ -2832,8 +2906,10 @@ + // interface methods + for (int i = 0; i < supers.length(); i++) { + Method m = supers.get(i); +- if (m != null && !Modifier.isAbstract(m.getModifiers())) { +- inheritedMethods.removeByNameAndSignature(m); ++ if (m != null && ++ !Modifier.isAbstract(m.getModifiers()) && ++ !m.isDefault()) { ++ inheritedMethods.removeByNameAndDescriptor(m); + } + } + // Insert superclass's inherited methods before +@@ -2846,9 +2922,10 @@ + // Filter out all local methods from inherited ones + for (int i = 0; i < methods.length(); i++) { + Method m = methods.get(i); +- inheritedMethods.removeByNameAndSignature(m); ++ inheritedMethods.removeByNameAndDescriptor(m); + } + methods.addAllIfNotPresent(inheritedMethods); ++ methods.removeLessSpecifics(); + methods.compactAndTrim(); + res = methods.getArray(); + if (rd != null) { +@@ -2923,8 +3000,21 @@ + return (res == null ? res : getReflectionFactory().copyMethod(res)); + } + +- + private Method getMethod0(String name, Class<?>[] parameterTypes, boolean includeStaticMethods) { ++ MethodArray interfaceCandidates = new MethodArray(2); ++ Method res = privateGetMethodRecursive(name, parameterTypes, includeStaticMethods, interfaceCandidates); ++ if (res != null) ++ return res; ++ ++ // Not found on class or superclass directly ++ interfaceCandidates.removeLessSpecifics(); ++ return interfaceCandidates.getFirst(); // may be null ++ } ++ ++ private Method privateGetMethodRecursive(String name, ++ Class<?>[] parameterTypes, ++ boolean includeStaticMethods, ++ MethodArray allInterfaceCandidates) { + // Note: the intent is that the search algorithm this routine + // uses be equivalent to the ordering imposed by + // privateGetPublicMethods(). It fetches only the declared +@@ -2932,6 +3022,14 @@ + // number of Method objects which have to be created for the + // common case where the method being requested is declared in + // the class which is being queried. ++ // ++ // Due to default methods, unless a method is found on a superclass, ++ // methods declared in any superinterface needs to be considered. ++ // Collect all candidates declared in superinterfaces in {@code ++ // allInterfaceCandidates} and select the most specific if no match on ++ // a superclass is found. ++ ++ // Must _not_ return root methods + Method res; + // Search declared public methods + if ((res = searchMethods(privateGetDeclaredMethods(true), +@@ -2953,7 +3051,7 @@ + Class<?>[] interfaces = getInterfaces(); + for (Class<?> c : interfaces) + if ((res = c.getMethod0(name, parameterTypes, false)) != null) +- return res; ++ allInterfaceCandidates.add(res); + // Not found + return null; + } +--- ./jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java Wed Jul 30 18:42:59 2014 +0100 +@@ -62,6 +62,7 @@ + //# Conditional mappings + //# ================================================================================ + new Entry(0x03A3, new char[]{0x03C2}, new char[]{0x03A3}, null, FINAL_CASED), // # GREEK CAPITAL LETTER SIGMA ++ new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, null, 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE + + //# ================================================================================ + //# Locale-sensitive mappings +@@ -77,8 +78,8 @@ + + //# ================================================================================ + //# Turkish and Azeri +-// new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE +-// new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE ++ new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE ++ new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE + new Entry(0x0307, new char[]{}, new char[]{0x0307}, "tr", AFTER_I), // # COMBINING DOT ABOVE + new Entry(0x0307, new char[]{}, new char[]{0x0307}, "az", AFTER_I), // # COMBINING DOT ABOVE + new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "tr", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I +@@ -148,21 +149,25 @@ + + private static char[] lookUpTable(String src, int index, Locale locale, boolean bLowerCasing) { + HashSet<Entry> set = entryTable.get(new Integer(src.codePointAt(index))); ++ char[] ret = null; + + if (set != null) { + Iterator<Entry> iter = set.iterator(); + String currentLang = locale.getLanguage(); + while (iter.hasNext()) { + Entry entry = iter.next(); +- String conditionLang= entry.getLanguage(); ++ String conditionLang = entry.getLanguage(); + if (((conditionLang == null) || (conditionLang.equals(currentLang))) && + isConditionMet(src, index, locale, entry.getCondition())) { +- return (bLowerCasing ? entry.getLowerCase() : entry.getUpperCase()); ++ ret = bLowerCasing ? entry.getLowerCase() : entry.getUpperCase(); ++ if (conditionLang != null) { ++ break; ++ } + } + } + } + +- return null; ++ return ret; + } + + private static boolean isConditionMet(String src, int index, Locale locale, int condition) { +--- ./jdk/src/share/classes/java/lang/String.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/String.java Wed Jul 30 18:42:59 2014 +0100 +@@ -2597,7 +2597,9 @@ + } else { + srcCount = 1; + } +- if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA ++ if (localeDependent || ++ srcChar == '\u03A3' || // GREEK CAPITAL LETTER SIGMA ++ srcChar == '\u0130') { // LATIN CAPITAL LETTER I WITH DOT ABOVE + lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale); + } else { + lowerChar = Character.toLowerCase(srcChar); +--- ./jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java Wed Jul 30 18:42:59 2014 +0100 +@@ -862,4 +862,18 @@ + * All subclasses must provide such a value describing their type signature. + */ + static final SpeciesData SPECIES_DATA = SpeciesData.EMPTY; ++ ++ private static final SpeciesData[] SPECIES_DATA_CACHE = new SpeciesData[5]; ++ private static SpeciesData checkCache(int size, String types) { ++ int idx = size - 1; ++ SpeciesData data = SPECIES_DATA_CACHE[idx]; ++ if (data != null) return data; ++ SPECIES_DATA_CACHE[idx] = data = getSpeciesData(types); ++ return data; ++ } ++ static SpeciesData speciesData_L() { return checkCache(1, "L"); } ++ static SpeciesData speciesData_LL() { return checkCache(2, "LL"); } ++ static SpeciesData speciesData_LLL() { return checkCache(3, "LLL"); } ++ static SpeciesData speciesData_LLLL() { return checkCache(4, "LLLL"); } ++ static SpeciesData speciesData_LLLLL() { return checkCache(5, "LLLLL"); } + } +--- ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Wed Jul 30 18:42:59 2014 +0100 +@@ -27,7 +27,6 @@ + + import sun.invoke.util.VerifyAccess; + import java.lang.invoke.LambdaForm.Name; +-import java.lang.invoke.MethodHandles.Lookup; + + import sun.invoke.util.Wrapper; + +@@ -39,9 +38,8 @@ + import java.lang.reflect.*; + import static java.lang.invoke.MethodHandleStatics.*; + import static java.lang.invoke.MethodHandleNatives.Constants.*; +-import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; +-import sun.invoke.util.ValueConversions; + import sun.invoke.util.VerifyType; ++import sun.reflect.misc.ReflectUtil; + + /** + * Code generation backend for LambdaForm. +@@ -51,7 +49,7 @@ + class InvokerBytecodeGenerator { + /** Define class names for convenience. */ + private static final String MH = "java/lang/invoke/MethodHandle"; +- private static final String BMH = "java/lang/invoke/BoundMethodHandle"; ++ private static final String MHI = "java/lang/invoke/MethodHandleImpl"; + private static final String LF = "java/lang/invoke/LambdaForm"; + private static final String LFN = "java/lang/invoke/LambdaForm$Name"; + private static final String CLS = "java/lang/Class"; +@@ -61,6 +59,7 @@ + private static final String LF_SIG = "L" + LF + ";"; + private static final String LFN_SIG = "L" + LFN + ";"; + private static final String LL_SIG = "(L" + OBJ + ";)L" + OBJ + ";"; ++ private static final String CLL_SIG = "(L" + CLS + ";L" + OBJ + ";)L" + OBJ + ";"; + + /** Name of its super class*/ + private static final String superName = LF; +@@ -438,7 +437,7 @@ + mv.visitLdcInsn(constantPlaceholder(pclass)); + mv.visitTypeInsn(Opcodes.CHECKCAST, CLS); + mv.visitInsn(Opcodes.SWAP); +- mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, CLS, "cast", LL_SIG); ++ mv.visitMethodInsn(Opcodes.INVOKESTATIC, MHI, "castReference", CLL_SIG); + if (pclass.isArray()) + mv.visitTypeInsn(Opcodes.CHECKCAST, OBJARY); + } +@@ -512,17 +511,22 @@ + Name name = lambdaForm.names[i]; + MemberName member = name.function.member(); + +- if (isSelectAlternative(member)) { +- // selectAlternative idiom +- // FIXME: make sure this idiom is really present! ++ if (isSelectAlternative(i)) { + emitSelectAlternative(name, lambdaForm.names[i + 1]); + i++; // skip MH.invokeBasic of the selectAlternative result ++ } else if (isGuardWithCatch(i)) { ++ emitGuardWithCatch(i); ++ i = i+2; // Jump to the end of GWC idiom + } else if (isStaticallyInvocable(member)) { + emitStaticInvoke(member, name); + } else { + emitInvoke(name); + } + ++ // Update cached form name's info in case an intrinsic spanning multiple names was encountered. ++ name = lambdaForm.names[i]; ++ member = name.function.member(); ++ + // store the result from evaluating to the target name in a local if required + // (if this is the last value, i.e., the one that is going to be returned, + // avoid store/load/return and just return) +@@ -592,6 +596,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; +@@ -610,6 +616,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; +@@ -675,12 +683,66 @@ + } + + /** +- * Check if MemberName is a call to MethodHandleImpl.selectAlternative. ++ * Check if MemberName is a call to a method named {@code name} in class {@code declaredClass}. + */ +- private boolean isSelectAlternative(MemberName member) { ++ private boolean memberRefersTo(MemberName member, Class<?> declaringClass, String name) { + return member != null && +- member.getDeclaringClass() == MethodHandleImpl.class && +- member.getName().equals("selectAlternative"); ++ member.getDeclaringClass() == declaringClass && ++ member.getName().equals(name); ++ } ++ private boolean nameRefersTo(Name name, Class<?> declaringClass, String methodName) { ++ return name.function != null && ++ memberRefersTo(name.function.member(), declaringClass, methodName); ++ } ++ ++ /** ++ * Check if MemberName is a call to MethodHandle.invokeBasic. ++ */ ++ private boolean isInvokeBasic(Name name) { ++ if (name.function == null) ++ return false; ++ if (name.arguments.length < 1) ++ return false; // must have MH argument ++ MemberName member = name.function.member(); ++ return memberRefersTo(member, MethodHandle.class, "invokeBasic") && ++ !member.isPublic() && !member.isStatic(); ++ } ++ ++ /** ++ * Check if i-th name is a call to MethodHandleImpl.selectAlternative. ++ */ ++ private boolean isSelectAlternative(int pos) { ++ // selectAlternative idiom: ++ // t_{n}:L=MethodHandleImpl.selectAlternative(...) ++ // t_{n+1}:?=MethodHandle.invokeBasic(t_{n}, ...) ++ if (pos+1 >= lambdaForm.names.length) return false; ++ Name name0 = lambdaForm.names[pos]; ++ Name name1 = lambdaForm.names[pos+1]; ++ return nameRefersTo(name0, MethodHandleImpl.class, "selectAlternative") && ++ isInvokeBasic(name1) && ++ name1.lastUseIndex(name0) == 0 && // t_{n+1}:?=MethodHandle.invokeBasic(t_{n}, ...) ++ lambdaForm.lastUseIndex(name0) == pos+1; // t_{n} is local: used only in t_{n+1} ++ } ++ ++ /** ++ * Check if i-th name is a start of GuardWithCatch idiom. ++ */ ++ private boolean isGuardWithCatch(int pos) { ++ // GuardWithCatch idiom: ++ // t_{n}:L=MethodHandle.invokeBasic(...) ++ // t_{n+1}:L=MethodHandleImpl.guardWithCatch(*, *, *, t_{n}); ++ // t_{n+2}:?=MethodHandle.invokeBasic(t_{n+1}) ++ if (pos+2 >= lambdaForm.names.length) return false; ++ Name name0 = lambdaForm.names[pos]; ++ Name name1 = lambdaForm.names[pos+1]; ++ Name name2 = lambdaForm.names[pos+2]; ++ return nameRefersTo(name1, MethodHandleImpl.class, "guardWithCatch") && ++ isInvokeBasic(name0) && ++ isInvokeBasic(name2) && ++ name1.lastUseIndex(name0) == 3 && // t_{n+1}:L=MethodHandleImpl.guardWithCatch(*, *, *, t_{n}); ++ lambdaForm.lastUseIndex(name0) == pos+1 && // t_{n} is local: used only in t_{n+1} ++ name2.lastUseIndex(name1) == 1 && // t_{n+2}:?=MethodHandle.invokeBasic(t_{n+1}) ++ lambdaForm.lastUseIndex(name1) == pos+2; // t_{n+1} is local: used only in t_{n+2} + } + + /** +@@ -695,8 +757,6 @@ + * }</pre></blockquote> + */ + private void emitSelectAlternative(Name selectAlternativeName, Name invokeBasicName) { +- MethodType type = selectAlternativeName.function.methodType(); +- + Name receiver = (Name) invokeBasicName.arguments[0]; + + Label L_fallback = new Label(); +@@ -710,7 +770,6 @@ + mv.visitJumpInsn(Opcodes.IF_ICMPNE, L_fallback); + + // invoke selectAlternativeName.arguments[1] +- MethodHandle target = (MethodHandle) selectAlternativeName.arguments[1]; + emitPushArgument(selectAlternativeName, 1); // get 2nd argument of selectAlternative + emitAstoreInsn(receiver.index()); // store the MH in the receiver slot + emitInvoke(invokeBasicName); +@@ -722,7 +781,6 @@ + mv.visitLabel(L_fallback); + + // invoke selectAlternativeName.arguments[2] +- MethodHandle fallback = (MethodHandle) selectAlternativeName.arguments[2]; + emitPushArgument(selectAlternativeName, 2); // get 3rd argument of selectAlternative + emitAstoreInsn(receiver.index()); // store the MH in the receiver slot + emitInvoke(invokeBasicName); +@@ -731,6 +789,85 @@ + mv.visitLabel(L_done); + } + ++ /** ++ * Emit bytecode for the guardWithCatch idiom. ++ * ++ * The pattern looks like (Cf. MethodHandleImpl.makeGuardWithCatch): ++ * <blockquote><pre>{@code ++ * guardWithCatch=Lambda(a0:L,a1:L,a2:L,a3:L,a4:L,a5:L,a6:L,a7:L)=>{ ++ * t8:L=MethodHandle.invokeBasic(a4:L,a6:L,a7:L); ++ * t9:L=MethodHandleImpl.guardWithCatch(a1:L,a2:L,a3:L,t8:L); ++ * t10:I=MethodHandle.invokeBasic(a5:L,t9:L);t10:I} ++ * }</pre></blockquote> ++ * ++ * It is compiled into bytecode equivalent of the following code: ++ * <blockquote><pre>{@code ++ * try { ++ * return a1.invokeBasic(a6, a7); ++ * } catch (Throwable e) { ++ * if (!a2.isInstance(e)) throw e; ++ * return a3.invokeBasic(ex, a6, a7); ++ * }} ++ */ ++ private void emitGuardWithCatch(int pos) { ++ Name args = lambdaForm.names[pos]; ++ Name invoker = lambdaForm.names[pos+1]; ++ Name result = lambdaForm.names[pos+2]; ++ ++ Label L_startBlock = new Label(); ++ Label L_endBlock = new Label(); ++ Label L_handler = new Label(); ++ Label L_done = new Label(); ++ ++ Class<?> returnType = result.function.resolvedHandle.type().returnType(); ++ MethodType type = args.function.resolvedHandle.type() ++ .dropParameterTypes(0,1) ++ .changeReturnType(returnType); ++ ++ mv.visitTryCatchBlock(L_startBlock, L_endBlock, L_handler, "java/lang/Throwable"); ++ ++ // Normal case ++ mv.visitLabel(L_startBlock); ++ // load target ++ emitPushArgument(invoker, 0); ++ emitPushArguments(args, 1); // skip 1st argument: method handle ++ mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", type.basicType().toMethodDescriptorString(), false); ++ mv.visitLabel(L_endBlock); ++ mv.visitJumpInsn(Opcodes.GOTO, L_done); ++ ++ // Exceptional case ++ mv.visitLabel(L_handler); ++ ++ // Check exception's type ++ mv.visitInsn(Opcodes.DUP); ++ // load exception class ++ emitPushArgument(invoker, 1); ++ mv.visitInsn(Opcodes.SWAP); ++ mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "isInstance", "(Ljava/lang/Object;)Z", false); ++ Label L_rethrow = new Label(); ++ mv.visitJumpInsn(Opcodes.IFEQ, L_rethrow); ++ ++ // Invoke catcher ++ // load catcher ++ emitPushArgument(invoker, 2); ++ mv.visitInsn(Opcodes.SWAP); ++ emitPushArguments(args, 1); // skip 1st argument: method handle ++ MethodType catcherType = type.insertParameterTypes(0, Throwable.class); ++ mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, MH, "invokeBasic", catcherType.basicType().toMethodDescriptorString(), false); ++ mv.visitJumpInsn(Opcodes.GOTO, L_done); ++ ++ mv.visitLabel(L_rethrow); ++ mv.visitInsn(Opcodes.ATHROW); ++ ++ mv.visitLabel(L_done); ++ } ++ ++ private void emitPushArguments(Name args, int start) { ++ for (int i = start; i < args.arguments.length; i++) { ++ emitPushArgument(args, i); ++ } ++ } ++ + private void emitPushArgument(Name name, int paramIndex) { + Object arg = name.arguments[paramIndex]; + char ptype = name.function.parameterType(paramIndex); +--- ./jdk/src/share/classes/java/lang/invoke/LambdaForm.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/invoke/LambdaForm.java Wed Jul 30 18:42:59 2014 +0100 +@@ -482,7 +482,7 @@ + assert(m.getName().equals("interpret" + sig.substring(sig.indexOf('_')))); + LambdaForm form = new LambdaForm(sig); + form.vmentry = m; +- mt.form().setCachedLambdaForm(MethodTypeForm.LF_COUNTER, form); ++ form = mt.form().setCachedLambdaForm(MethodTypeForm.LF_COUNTER, form); + // FIXME: get rid of PREPARED_FORMS; use MethodTypeForm cache only + forms.put(sig, form); + } +@@ -1465,6 +1465,33 @@ + return false; + } + ++ /** Return the index of the last occurrence of n in the argument array. ++ * Return -1 if the name is not used. ++ */ ++ int lastUseIndex(Name n) { ++ if (arguments == null) return -1; ++ for (int i = arguments.length; --i >= 0; ) { ++ if (arguments[i] == n) return i; ++ } ++ return -1; ++ } ++ ++ /** Return the number of occurrences of n in the argument array. ++ * Return 0 if the name is not used. ++ */ ++ int useCount(Name n) { ++ if (arguments == null) return 0; ++ int count = 0; ++ for (int i = arguments.length; --i >= 0; ) { ++ if (arguments[i] == n) ++count; ++ } ++ return count; ++ } ++ ++ boolean contains(Name n) { ++ return this == n || lastUseIndex(n) >= 0; ++ } ++ + public boolean equals(Name that) { + if (this == that) return true; + if (isParam()) +@@ -1488,6 +1515,35 @@ + } + } + ++ /** Return the index of the last name which contains n as an argument. ++ * Return -1 if the name is not used. Return names.length if it is the return value. ++ */ ++ int lastUseIndex(Name n) { ++ int ni = n.index, nmax = names.length; ++ assert(names[ni] == n); ++ if (result == ni) return nmax; // live all the way beyond the end ++ for (int i = nmax; --i > ni; ) { ++ if (names[i].lastUseIndex(n) >= 0) ++ return i; ++ } ++ return -1; ++ } ++ ++ /** Return the number of times n is used as an argument or return value. */ ++ int useCount(Name n) { ++ int ni = n.index, nmax = names.length; ++ int end = lastUseIndex(n); ++ if (end < 0) return 0; ++ int count = 0; ++ if (end == nmax) { count++; end--; } ++ int beg = n.index() + 1; ++ if (beg < arity) beg = arity; ++ for (int i = beg; i <= end; i++) { ++ count += names[i].useCount(n); ++ } ++ return count; ++ } ++ + static Name argument(int which, char type) { + int tn = ALL_TYPES.indexOf(type); + if (tn < 0 || which >= INTERNED_ARGUMENT_LIMIT) +--- ./jdk/src/share/classes/java/lang/invoke/LambdaMetafactory.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/invoke/LambdaMetafactory.java Wed Jul 30 18:42:59 2014 +0100 +@@ -313,7 +313,8 @@ + * reference expression</em> features of the Java Programming Language. + * + * <p>This is the general, more flexible metafactory; a streamlined version +- * is provided by {@link #altMetafactory(MethodHandles.Lookup, String, MethodType, Object...)}. ++ * is provided by {@link #metafactory(java.lang.invoke.MethodHandles.Lookup, ++ * String, MethodType, MethodType, MethodHandle, MethodType)}. + * A general description of the behavior of this method is provided + * {@link LambdaMetafactory above}. + * +--- ./jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -27,7 +27,6 @@ + + import java.security.AccessController; + import java.security.PrivilegedAction; +-import java.util.ArrayList; + import java.util.Arrays; + import java.util.HashMap; + import sun.invoke.empty.Empty; +@@ -254,7 +253,7 @@ + // Note: Do not check for a class hierarchy relation + // between src and dst. In all cases a 'null' argument + // will pass the cast conversion. +- fn = ValueConversions.cast(dst); ++ fn = ValueConversions.cast(dst, Lazy.MH_castReference); + } + } + Name conv = new Name(fn, names[INARG_BASE + i]); +@@ -294,6 +293,25 @@ + return SimpleMethodHandle.make(srcType, form); + } + ++ /** ++ * Identity function, with reference cast. ++ * @param t an arbitrary reference type ++ * @param x an arbitrary reference value ++ * @return the same value x ++ */ ++ @ForceInline ++ @SuppressWarnings("unchecked") ++ static <T,U> T castReference(Class<? extends T> t, U x) { ++ // inlined Class.cast because we can't ForceInline it ++ if (x != null && !t.isInstance(x)) ++ throw newClassCastException(t, x); ++ return (T) x; ++ } ++ ++ private static ClassCastException newClassCastException(Class<?> t, Object obj) { ++ return new ClassCastException("Cannot cast " + obj.getClass().getName() + " to " + t.getName()); ++ } ++ + static MethodHandle makeReferenceIdentity(Class<?> refType) { + MethodType lambdaType = MethodType.genericMethodType(1).invokerType(); + Name[] names = arguments(1, lambdaType); +@@ -482,12 +500,31 @@ + * Factored in an inner class to delay initialization until first usage. + */ + private static class Lazy { ++ private static final Class<?> MHI = MethodHandleImpl.class; ++ + static final NamedFunction NF_checkSpreadArgument; ++ static final NamedFunction NF_guardWithCatch; ++ static final NamedFunction NF_selectAlternative; ++ static final NamedFunction NF_throwException; ++ ++ static final MethodHandle MH_castReference; ++ + static { + try { +- NF_checkSpreadArgument = new NamedFunction(MethodHandleImpl.class +- .getDeclaredMethod("checkSpreadArgument", Object.class, int.class)); ++ NF_checkSpreadArgument = new NamedFunction(MHI.getDeclaredMethod("checkSpreadArgument", Object.class, int.class)); ++ NF_guardWithCatch = new NamedFunction(MHI.getDeclaredMethod("guardWithCatch", MethodHandle.class, Class.class, ++ MethodHandle.class, Object[].class)); ++ NF_selectAlternative = new NamedFunction(MHI.getDeclaredMethod("selectAlternative", boolean.class, MethodHandle.class, ++ MethodHandle.class)); ++ NF_throwException = new NamedFunction(MHI.getDeclaredMethod("throwException", Throwable.class)); ++ + NF_checkSpreadArgument.resolve(); ++ NF_guardWithCatch.resolve(); ++ NF_selectAlternative.resolve(); ++ NF_throwException.resolve(); ++ ++ MethodType mt = MethodType.methodType(Object.class, Class.class, Object.class); ++ MH_castReference = IMPL_LOOKUP.findStatic(MHI, "castReference", mt); + } catch (ReflectiveOperationException ex) { + throw newInternalError(ex); + } +@@ -548,24 +585,12 @@ + return SimpleMethodHandle.make(srcType, form); + } + ++ @LambdaForm.Hidden + static + MethodHandle selectAlternative(boolean testResult, MethodHandle target, MethodHandle fallback) { + return testResult ? target : fallback; + } + +- static MethodHandle SELECT_ALTERNATIVE; +- static MethodHandle selectAlternative() { +- if (SELECT_ALTERNATIVE != null) return SELECT_ALTERNATIVE; +- try { +- SELECT_ALTERNATIVE +- = IMPL_LOOKUP.findStatic(MethodHandleImpl.class, "selectAlternative", +- MethodType.methodType(MethodHandle.class, boolean.class, MethodHandle.class, MethodHandle.class)); +- } catch (ReflectiveOperationException ex) { +- throw new RuntimeException(ex); +- } +- return SELECT_ALTERNATIVE; +- } +- + static + MethodHandle makeGuardWithTest(MethodHandle test, + MethodHandle target, +@@ -585,7 +610,7 @@ + + // call selectAlternative + Object[] selectArgs = { names[arity + 1], target, fallback }; +- names[arity + 2] = new Name(MethodHandleImpl.selectAlternative(), selectArgs); ++ names[arity + 2] = new Name(Lazy.NF_selectAlternative, selectArgs); + targetArgs[0] = names[arity + 2]; + + // call target or fallback +@@ -595,167 +620,137 @@ + return SimpleMethodHandle.make(target.type(), form); + } + +- private static class GuardWithCatch { +- private final MethodHandle target; +- private final Class<? extends Throwable> exType; +- private final MethodHandle catcher; +- // FIXME: Build the control flow out of foldArguments. +- GuardWithCatch(MethodHandle target, Class<? extends Throwable> exType, MethodHandle catcher) { +- this.target = target; +- this.exType = exType; +- this.catcher = catcher; ++ /** ++ * The LambaForm shape for catchException combinator is the following: ++ * <blockquote><pre>{@code ++ * guardWithCatch=Lambda(a0:L,a1:L,a2:L)=>{ ++ * t3:L=BoundMethodHandle$Species_LLLLL.argL0(a0:L); ++ * t4:L=BoundMethodHandle$Species_LLLLL.argL1(a0:L); ++ * t5:L=BoundMethodHandle$Species_LLLLL.argL2(a0:L); ++ * t6:L=BoundMethodHandle$Species_LLLLL.argL3(a0:L); ++ * t7:L=BoundMethodHandle$Species_LLLLL.argL4(a0:L); ++ * t8:L=MethodHandle.invokeBasic(t6:L,a1:L,a2:L); ++ * t9:L=MethodHandleImpl.guardWithCatch(t3:L,t4:L,t5:L,t8:L); ++ * t10:I=MethodHandle.invokeBasic(t7:L,t9:L);t10:I} ++ * }</pre></blockquote> ++ * ++ * argL0 and argL2 are target and catcher method handles. argL1 is exception class. ++ * argL3 and argL4 are auxiliary method handles: argL3 boxes arguments and wraps them into Object[] ++ * (ValueConversions.array()) and argL4 unboxes result if necessary (ValueConversions.unbox()). ++ * ++ * Having t8 and t10 passed outside and not hardcoded into a lambda form allows to share lambda forms ++ * among catchException combinators with the same basic type. ++ */ ++ private static LambdaForm makeGuardWithCatchForm(MethodType basicType) { ++ MethodType lambdaType = basicType.invokerType(); ++ ++ LambdaForm lform = basicType.form().cachedLambdaForm(MethodTypeForm.LF_GWC); ++ if (lform != null) { ++ return lform; + } +- @LambdaForm.Hidden +- private Object invoke_V(Object... av) throws Throwable { +- try { +- return target.invokeExact(av); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t, av); +- } +- } +- @LambdaForm.Hidden +- private Object invoke_L0() throws Throwable { +- try { +- return target.invokeExact(); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t); +- } +- } +- @LambdaForm.Hidden +- private Object invoke_L1(Object a0) throws Throwable { +- try { +- return target.invokeExact(a0); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t, a0); +- } +- } +- @LambdaForm.Hidden +- private Object invoke_L2(Object a0, Object a1) throws Throwable { +- try { +- return target.invokeExact(a0, a1); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t, a0, a1); +- } +- } +- @LambdaForm.Hidden +- private Object invoke_L3(Object a0, Object a1, Object a2) throws Throwable { +- try { +- return target.invokeExact(a0, a1, a2); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t, a0, a1, a2); +- } +- } +- @LambdaForm.Hidden +- private Object invoke_L4(Object a0, Object a1, Object a2, Object a3) throws Throwable { +- try { +- return target.invokeExact(a0, a1, a2, a3); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t, a0, a1, a2, a3); +- } +- } +- @LambdaForm.Hidden +- private Object invoke_L5(Object a0, Object a1, Object a2, Object a3, Object a4) throws Throwable { +- try { +- return target.invokeExact(a0, a1, a2, a3, a4); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t, a0, a1, a2, a3, a4); +- } +- } +- @LambdaForm.Hidden +- private Object invoke_L6(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5) throws Throwable { +- try { +- return target.invokeExact(a0, a1, a2, a3, a4, a5); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t, a0, a1, a2, a3, a4, a5); +- } +- } +- @LambdaForm.Hidden +- private Object invoke_L7(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) throws Throwable { +- try { +- return target.invokeExact(a0, a1, a2, a3, a4, a5, a6); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t, a0, a1, a2, a3, a4, a5, a6); +- } +- } +- @LambdaForm.Hidden +- private Object invoke_L8(Object a0, Object a1, Object a2, Object a3, Object a4, Object a5, Object a6, Object a7) throws Throwable { +- try { +- return target.invokeExact(a0, a1, a2, a3, a4, a5, a6, a7); +- } catch (Throwable t) { +- if (!exType.isInstance(t)) throw t; +- return catcher.invokeExact(t, a0, a1, a2, a3, a4, a5, a6, a7); +- } +- } +- static MethodHandle[] makeInvokes() { +- ArrayList<MethodHandle> invokes = new ArrayList<>(); +- MethodHandles.Lookup lookup = IMPL_LOOKUP; +- for (;;) { +- int nargs = invokes.size(); +- String name = "invoke_L"+nargs; +- MethodHandle invoke = null; +- try { +- invoke = lookup.findVirtual(GuardWithCatch.class, name, MethodType.genericMethodType(nargs)); +- } catch (ReflectiveOperationException ex) { +- } +- if (invoke == null) break; +- invokes.add(invoke); +- } +- assert(invokes.size() == 9); // current number of methods +- return invokes.toArray(new MethodHandle[0]); +- }; +- static final MethodHandle[] INVOKES = makeInvokes(); +- // For testing use this: +- //static final MethodHandle[] INVOKES = Arrays.copyOf(makeInvokes(), 2); +- static final MethodHandle VARARGS_INVOKE; +- static { +- try { +- VARARGS_INVOKE = IMPL_LOOKUP.findVirtual(GuardWithCatch.class, "invoke_V", MethodType.genericMethodType(0, true)); +- } catch (ReflectiveOperationException ex) { +- throw uncaughtException(ex); +- } +- } ++ final int THIS_MH = 0; // the BMH_LLLLL ++ final int ARG_BASE = 1; // start of incoming arguments ++ final int ARG_LIMIT = ARG_BASE + basicType.parameterCount(); ++ ++ int nameCursor = ARG_LIMIT; ++ final int GET_TARGET = nameCursor++; ++ final int GET_CLASS = nameCursor++; ++ final int GET_CATCHER = nameCursor++; ++ final int GET_COLLECT_ARGS = nameCursor++; ++ final int GET_UNBOX_RESULT = nameCursor++; ++ final int BOXED_ARGS = nameCursor++; ++ final int TRY_CATCH = nameCursor++; ++ final int UNBOX_RESULT = nameCursor++; ++ ++ Name[] names = arguments(nameCursor - ARG_LIMIT, lambdaType); ++ ++ BoundMethodHandle.SpeciesData data = BoundMethodHandle.speciesData_LLLLL(); ++ names[GET_TARGET] = new Name(data.getterFunction(0), names[THIS_MH]); ++ names[GET_CLASS] = new Name(data.getterFunction(1), names[THIS_MH]); ++ names[GET_CATCHER] = new Name(data.getterFunction(2), names[THIS_MH]); ++ names[GET_COLLECT_ARGS] = new Name(data.getterFunction(3), names[THIS_MH]); ++ names[GET_UNBOX_RESULT] = new Name(data.getterFunction(4), names[THIS_MH]); ++ ++ // FIXME: rework argument boxing/result unboxing logic for LF interpretation ++ ++ // t_{i}:L=MethodHandle.invokeBasic(collectArgs:L,a1:L,...); ++ MethodType collectArgsType = basicType.changeReturnType(Object.class); ++ MethodHandle invokeBasic = MethodHandles.basicInvoker(collectArgsType); ++ Object[] args = new Object[invokeBasic.type().parameterCount()]; ++ args[0] = names[GET_COLLECT_ARGS]; ++ System.arraycopy(names, ARG_BASE, args, 1, ARG_LIMIT-ARG_BASE); ++ names[BOXED_ARGS] = new Name(new NamedFunction(invokeBasic), args); ++ ++ // t_{i+1}:L=MethodHandleImpl.guardWithCatch(target:L,exType:L,catcher:L,t_{i}:L); ++ Object[] gwcArgs = new Object[] {names[GET_TARGET], names[GET_CLASS], names[GET_CATCHER], names[BOXED_ARGS]}; ++ names[TRY_CATCH] = new Name(Lazy.NF_guardWithCatch, gwcArgs); ++ ++ // t_{i+2}:I=MethodHandle.invokeBasic(unbox:L,t_{i+1}:L); ++ MethodHandle invokeBasicUnbox = MethodHandles.basicInvoker(MethodType.methodType(basicType.rtype(), Object.class)); ++ Object[] unboxArgs = new Object[] {names[GET_UNBOX_RESULT], names[TRY_CATCH]}; ++ names[UNBOX_RESULT] = new Name(new NamedFunction(invokeBasicUnbox), unboxArgs); ++ ++ lform = new LambdaForm("guardWithCatch", lambdaType.parameterCount(), names); ++ ++ return basicType.form().setCachedLambdaForm(MethodTypeForm.LF_GWC, lform); + } + +- + static + MethodHandle makeGuardWithCatch(MethodHandle target, + Class<? extends Throwable> exType, + MethodHandle catcher) { + MethodType type = target.type(); +- MethodType ctype = catcher.type(); +- int nargs = type.parameterCount(); +- if (nargs < GuardWithCatch.INVOKES.length) { +- MethodType gtype = type.generic(); +- MethodType gcatchType = gtype.insertParameterTypes(0, Throwable.class); +- // Note: convertArguments(...2) avoids interface casts present in convertArguments(...0) +- MethodHandle gtarget = makePairwiseConvert(target, gtype, 2); +- MethodHandle gcatcher = makePairwiseConvert(catcher, gcatchType, 2); +- GuardWithCatch gguard = new GuardWithCatch(gtarget, exType, gcatcher); +- if (gtarget == null || gcatcher == null) throw new InternalError(); +- MethodHandle ginvoker = GuardWithCatch.INVOKES[nargs].bindReceiver(gguard); +- return makePairwiseConvert(ginvoker, type, 2); ++ LambdaForm form = makeGuardWithCatchForm(type.basicType()); ++ ++ // Prepare auxiliary method handles used during LambdaForm interpreation. ++ // Box arguments and wrap them into Object[]: ValueConversions.array(). ++ MethodType varargsType = type.changeReturnType(Object[].class); ++ MethodHandle collectArgs = ValueConversions.varargsArray(type.parameterCount()) ++ .asType(varargsType); ++ // Result unboxing: ValueConversions.unbox() OR ValueConversions.identity() OR ValueConversions.ignore(). ++ MethodHandle unboxResult; ++ if (type.returnType().isPrimitive()) { ++ unboxResult = ValueConversions.unbox(type.returnType()); + } else { +- target = target.asType(type.changeReturnType(Object.class)); +- MethodHandle gtarget = makeSpreadArguments(target, Object[].class, 0, nargs); +- MethodType catcherType = ctype.changeParameterType(0, Throwable.class) +- .changeReturnType(Object.class); +- catcher = catcher.asType(catcherType); +- MethodHandle gcatcher = makeSpreadArguments(catcher, Object[].class, 1, nargs); +- GuardWithCatch gguard = new GuardWithCatch(gtarget, exType, gcatcher); +- if (gtarget == null || gcatcher == null) throw new InternalError(); +- MethodHandle ginvoker = GuardWithCatch.VARARGS_INVOKE.bindReceiver(gguard); +- MethodHandle gcollect = makeCollectArguments(ginvoker, ValueConversions.varargsArray(nargs), 0, false); +- return makePairwiseConvert(gcollect, type, 2); ++ unboxResult = ValueConversions.identity(); + } ++ ++ BoundMethodHandle.SpeciesData data = BoundMethodHandle.speciesData_LLLLL(); ++ BoundMethodHandle mh; ++ try { ++ mh = (BoundMethodHandle) ++ data.constructor[0].invokeBasic(type, form, (Object) target, (Object) exType, (Object) catcher, ++ (Object) collectArgs, (Object) unboxResult); ++ } catch (Throwable ex) { ++ throw uncaughtException(ex); ++ } ++ assert(mh.type() == type); ++ return mh; ++ } ++ ++ /** ++ * Intrinsified during LambdaForm compilation ++ * (see {@link InvokerBytecodeGenerator#emitGuardWithCatch emitGuardWithCatch}). ++ */ ++ @LambdaForm.Hidden ++ static Object guardWithCatch(MethodHandle target, Class<? extends Throwable> exType, MethodHandle catcher, ++ Object... av) throws Throwable { ++ // Use asFixedArity() to avoid unnecessary boxing of last argument for VarargsCollector case. ++ try { ++ return target.asFixedArity().invokeWithArguments(av); ++ } catch (Throwable t) { ++ if (!exType.isInstance(t)) throw t; ++ return catcher.asFixedArity().invokeWithArguments(prepend(t, av)); ++ } ++ } ++ ++ /** Prepend an element {@code elem} to an {@code array}. */ ++ @LambdaForm.Hidden ++ private static Object[] prepend(Object elem, Object[] array) { ++ Object[] newArray = new Object[array.length+1]; ++ newArray[0] = elem; ++ System.arraycopy(array, 0, newArray, 1, array.length); ++ return newArray; + } + + static +@@ -765,23 +760,9 @@ + if (arity > 1) { + return throwException(type.dropParameterTypes(1, arity)).dropArguments(type, 1, arity-1); + } +- return makePairwiseConvert(throwException(), type, 2); ++ return makePairwiseConvert(Lazy.NF_throwException.resolvedHandle(), type, 2); + } + +- static MethodHandle THROW_EXCEPTION; +- static MethodHandle throwException() { +- MethodHandle mh = THROW_EXCEPTION; +- if (mh != null) return mh; +- try { +- mh +- = IMPL_LOOKUP.findStatic(MethodHandleImpl.class, "throwException", +- MethodType.methodType(Empty.class, Throwable.class)); +- } catch (ReflectiveOperationException ex) { +- throw new RuntimeException(ex); +- } +- THROW_EXCEPTION = mh; +- return mh; +- } + static <T extends Throwable> Empty throwException(T t) throws T { throw t; } + + static MethodHandle[] FAKE_METHOD_HANDLE_INVOKE = new MethodHandle[2]; +--- ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1617,23 +1617,30 @@ + checkSecurityManager(refc, method); + assert(!method.isMethodHandleInvoke()); + +- Class<?> refcAsSuper; + if (refKind == REF_invokeSpecial && + refc != lookupClass() && + !refc.isInterface() && +- refc != (refcAsSuper = lookupClass().getSuperclass()) && ++ refc != lookupClass().getSuperclass() && + refc.isAssignableFrom(lookupClass())) { + assert(!method.getName().equals("<init>")); // not this code path + // Per JVMS 6.5, desc. of invokespecial instruction: + // If the method is in a superclass of the LC, + // and if our original search was above LC.super, +- // repeat the search (symbolic lookup) from LC.super. ++ // repeat the search (symbolic lookup) from LC.super ++ // and continue with the direct superclass of that class, ++ // and so forth, until a match is found or no further superclasses exist. + // FIXME: MemberName.resolve should handle this instead. +- MemberName m2 = new MemberName(refcAsSuper, +- method.getName(), +- method.getMethodType(), +- REF_invokeSpecial); +- m2 = IMPL_NAMES.resolveOrNull(refKind, m2, lookupClassOrNull()); ++ Class<?> refcAsSuper = lookupClass(); ++ MemberName m2; ++ do { ++ refcAsSuper = refcAsSuper.getSuperclass(); ++ m2 = new MemberName(refcAsSuper, ++ method.getName(), ++ method.getMethodType(), ++ REF_invokeSpecial); ++ m2 = IMPL_NAMES.resolveOrNull(refKind, m2, lookupClassOrNull()); ++ } while (m2 == null && // no method is found yet ++ refc != refcAsSuper); // search up to refc + if (m2 == null) throw new InternalError(method.toString()); + method = m2; + refc = refcAsSuper; +--- ./jdk/src/share/classes/java/lang/invoke/MethodTypeForm.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/invoke/MethodTypeForm.java Wed Jul 30 18:42:59 2014 +0100 +@@ -76,7 +76,8 @@ + LF_GEN_INVOKER = 12, + LF_CS_LINKER = 13, // linkToCallSite_CS + LF_MH_LINKER = 14, // linkToCallSite_MH +- LF_LIMIT = 15; ++ LF_GWC = 15, ++ LF_LIMIT = 16; + + public MethodType erasedType() { + return erasedType; +@@ -90,8 +91,10 @@ + return lambdaForms[which]; + } + +- public LambdaForm setCachedLambdaForm(int which, LambdaForm form) { +- // Should we perform some sort of CAS, to avoid racy duplication? ++ synchronized public LambdaForm setCachedLambdaForm(int which, LambdaForm form) { ++ // Simulate a CAS, to avoid racy duplication of results. ++ LambdaForm prev = lambdaForms[which]; ++ if (prev != null) return prev; + return lambdaForms[which] = form; + } + +--- ./jdk/src/share/classes/java/lang/reflect/Executable.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/lang/reflect/Executable.java Wed Jul 30 18:42:59 2014 +0100 +@@ -644,7 +644,7 @@ + getConstantPool(getDeclaringClass()), + this, + getDeclaringClass(), +- getParameterTypes(), ++ getGenericParameterTypes(), + TypeAnnotation.TypeAnnotationTarget.METHOD_FORMAL_PARAMETER); + } + +--- ./jdk/src/share/classes/java/math/BigInteger.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/math/BigInteger.java Wed Jul 30 18:42:59 2014 +0100 +@@ -268,7 +268,15 @@ + */ + private static final int SCHOENHAGE_BASE_CONVERSION_THRESHOLD = 20; + +- //Constructors ++ /** ++ * The threshold value for using squaring code to perform multiplication ++ * of a {@code BigInteger} instance by itself. If the number of ints in ++ * the number are larger than this value, {@code multiply(this)} will ++ * return {@code square()}. ++ */ ++ private static final int MULTIPLY_SQUARE_THRESHOLD = 20; ++ ++ // Constructors + + /** + * Translates a byte array containing the two's-complement binary +@@ -1458,6 +1466,9 @@ + /** + * Returns a BigInteger whose value is {@code (this * val)}. + * ++ * @implNote An implementation may offer better algorithmic ++ * performance when {@code val == this}. ++ * + * @param val value to be multiplied by this BigInteger. + * @return {@code this * val} + */ +@@ -1466,6 +1477,11 @@ + return ZERO; + + int xlen = mag.length; ++ ++ if (val == this && xlen > MULTIPLY_SQUARE_THRESHOLD) { ++ return square(); ++ } ++ + int ylen = val.mag.length; + + if ((xlen < KARATSUBA_THRESHOLD) || (ylen < KARATSUBA_THRESHOLD)) { +--- ./jdk/src/share/classes/java/net/DatagramSocket.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/net/DatagramSocket.java Wed Jul 30 18:42:59 2014 +0100 +@@ -315,6 +315,7 @@ + } + // creates a udp socket + impl.create(); ++ impl.setDatagramSocket(this); + created = true; + } + +--- ./jdk/src/share/classes/java/net/DatagramSocketImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/net/DatagramSocketImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -48,6 +48,20 @@ + protected FileDescriptor fd; + + /** ++ * The DatagramSocket or MulticastSocket ++ * that owns this impl ++ */ ++ DatagramSocket socket; ++ ++ void setDatagramSocket(DatagramSocket socket) { ++ this.socket = socket; ++ } ++ ++ DatagramSocket getDatagramSocket() { ++ return socket; ++ } ++ ++ /** + * Creates a datagram socket. + * @exception SocketException if there is an error in the + * underlying protocol, such as a TCP error. +@@ -233,6 +247,56 @@ + return localPort; + } + ++ <T> void setOption(SocketOption<T> name, T value) throws IOException { ++ if (name == StandardSocketOptions.SO_SNDBUF) { ++ setOption(SocketOptions.SO_SNDBUF, value); ++ } else if (name == StandardSocketOptions.SO_RCVBUF) { ++ setOption(SocketOptions.SO_RCVBUF, value); ++ } else if (name == StandardSocketOptions.SO_REUSEADDR) { ++ setOption(SocketOptions.SO_REUSEADDR, value); ++ } else if (name == StandardSocketOptions.IP_TOS) { ++ setOption(SocketOptions.IP_TOS, value); ++ } else if (name == StandardSocketOptions.IP_MULTICAST_IF && ++ (getDatagramSocket() instanceof MulticastSocket)) { ++ setOption(SocketOptions.IP_MULTICAST_IF2, value); ++ } else if (name == StandardSocketOptions.IP_MULTICAST_TTL && ++ (getDatagramSocket() instanceof MulticastSocket)) { ++ if (! (value instanceof Integer)) { ++ throw new IllegalArgumentException("not an integer"); ++ } ++ setTimeToLive((Integer)value); ++ } else if (name == StandardSocketOptions.IP_MULTICAST_LOOP && ++ (getDatagramSocket() instanceof MulticastSocket)) { ++ setOption(SocketOptions.IP_MULTICAST_LOOP, value); ++ } else { ++ throw new UnsupportedOperationException("unsupported option"); ++ } ++ } ++ ++ <T> T getOption(SocketOption<T> name) throws IOException { ++ if (name == StandardSocketOptions.SO_SNDBUF) { ++ return (T) getOption(SocketOptions.SO_SNDBUF); ++ } else if (name == StandardSocketOptions.SO_RCVBUF) { ++ return (T) getOption(SocketOptions.SO_RCVBUF); ++ } else if (name == StandardSocketOptions.SO_REUSEADDR) { ++ return (T) getOption(SocketOptions.SO_REUSEADDR); ++ } else if (name == StandardSocketOptions.IP_TOS) { ++ return (T) getOption(SocketOptions.IP_TOS); ++ } else if (name == StandardSocketOptions.IP_MULTICAST_IF && ++ (getDatagramSocket() instanceof MulticastSocket)) { ++ return (T) getOption(SocketOptions.IP_MULTICAST_IF2); ++ } else if (name == StandardSocketOptions.IP_MULTICAST_TTL && ++ (getDatagramSocket() instanceof MulticastSocket)) { ++ Integer ttl = getTimeToLive(); ++ return (T)ttl; ++ } else if (name == StandardSocketOptions.IP_MULTICAST_LOOP && ++ (getDatagramSocket() instanceof MulticastSocket)) { ++ return (T) getOption(SocketOptions.IP_MULTICAST_LOOP); ++ } else { ++ throw new UnsupportedOperationException("unsupported option"); ++ } ++ } ++ + /** + * Gets the datagram socket file descriptor. + * @return a {@code FileDescriptor} object representing the datagram socket +--- ./jdk/src/share/classes/java/net/SocketImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/net/SocketImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -355,4 +355,44 @@ + { + /* Not implemented yet */ + } ++ ++ <T> void setOption(SocketOption<T> name, T value) throws IOException { ++ if (name == StandardSocketOptions.SO_KEEPALIVE) { ++ setOption(SocketOptions.SO_KEEPALIVE, value); ++ } else if (name == StandardSocketOptions.SO_SNDBUF) { ++ setOption(SocketOptions.SO_SNDBUF, value); ++ } else if (name == StandardSocketOptions.SO_RCVBUF) { ++ setOption(SocketOptions.SO_RCVBUF, value); ++ } else if (name == StandardSocketOptions.SO_REUSEADDR) { ++ setOption(SocketOptions.SO_REUSEADDR, value); ++ } else if (name == StandardSocketOptions.SO_LINGER) { ++ setOption(SocketOptions.SO_LINGER, value); ++ } else if (name == StandardSocketOptions.IP_TOS) { ++ setOption(SocketOptions.IP_TOS, value); ++ } else if (name == StandardSocketOptions.TCP_NODELAY) { ++ setOption(SocketOptions.TCP_NODELAY, value); ++ } else { ++ throw new UnsupportedOperationException("unsupported option"); ++ } ++ } ++ ++ <T> T getOption(SocketOption<T> name) throws IOException { ++ if (name == StandardSocketOptions.SO_KEEPALIVE) { ++ return (T)getOption(SocketOptions.SO_KEEPALIVE); ++ } else if (name == StandardSocketOptions.SO_SNDBUF) { ++ return (T)getOption(SocketOptions.SO_SNDBUF); ++ } else if (name == StandardSocketOptions.SO_RCVBUF) { ++ return (T)getOption(SocketOptions.SO_RCVBUF); ++ } else if (name == StandardSocketOptions.SO_REUSEADDR) { ++ return (T)getOption(SocketOptions.SO_REUSEADDR); ++ } else if (name == StandardSocketOptions.SO_LINGER) { ++ return (T)getOption(SocketOptions.SO_LINGER); ++ } else if (name == StandardSocketOptions.IP_TOS) { ++ return (T)getOption(SocketOptions.IP_TOS); ++ } else if (name == StandardSocketOptions.TCP_NODELAY) { ++ return (T)getOption(SocketOptions.TCP_NODELAY); ++ } else { ++ throw new UnsupportedOperationException("unsupported option"); ++ } ++ } + } +--- ./jdk/src/share/classes/java/net/SocketSecrets.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/java/net/SocketSecrets.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,70 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package java.net; ++ ++import java.io.IOException; ++ ++class SocketSecrets { ++ ++ /* accessed by reflection from jdk.net.Sockets */ ++ ++ /* obj must be a Socket or ServerSocket */ ++ ++ private static <T> void setOption(Object obj, SocketOption<T> name, T value) throws IOException { ++ SocketImpl impl; ++ ++ if (obj instanceof Socket) { ++ impl = ((Socket)obj).getImpl(); ++ } else if (obj instanceof ServerSocket) { ++ impl = ((ServerSocket)obj).getImpl(); ++ } else { ++ throw new IllegalArgumentException(); ++ } ++ impl.setOption(name, value); ++ } ++ ++ private static <T> T getOption(Object obj, SocketOption<T> name) throws IOException { ++ SocketImpl impl; ++ ++ if (obj instanceof Socket) { ++ impl = ((Socket)obj).getImpl(); ++ } else if (obj instanceof ServerSocket) { ++ impl = ((ServerSocket)obj).getImpl(); ++ } else { ++ throw new IllegalArgumentException(); ++ } ++ return impl.getOption(name); ++ } ++ ++ private static <T> void setOption(DatagramSocket s, SocketOption<T> name, T value) throws IOException { ++ s.getImpl().setOption(name, value); ++ } ++ ++ private static <T> T getOption(DatagramSocket s, SocketOption<T> name) throws IOException { ++ return s.getImpl().getOption(name); ++ } ++ ++} +--- ./jdk/src/share/classes/java/nio/file/CopyMoveHelper.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/nio/file/CopyMoveHelper.java Wed Jul 30 18:42:59 2014 +0100 +@@ -130,7 +130,7 @@ + // copy basic attributes to target + if (opts.copyAttributes) { + BasicFileAttributeView view = +- Files.getFileAttributeView(target, BasicFileAttributeView.class, linkOptions); ++ Files.getFileAttributeView(target, BasicFileAttributeView.class); + try { + view.setTimes(attrs.lastModifiedTime(), + attrs.lastAccessTime(), +--- ./jdk/src/share/classes/java/nio/file/Files.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/nio/file/Files.java Wed Jul 30 18:42:59 2014 +0100 +@@ -752,9 +752,12 @@ + } + if (parent == null) { + // unable to find existing parent +- if (se != null) ++ if (se == null) { ++ throw new FileSystemException(dir.toString(), null, ++ "Unable to determine if root directory exists"); ++ } else { + throw se; +- throw new IOException("Root directory does not exist"); ++ } + } + + // create directories +--- ./jdk/src/share/classes/java/time/Clock.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/Clock.java Wed Jul 30 18:42:59 2014 +0100 +@@ -104,7 +104,7 @@ + * resolution clock if one is available. + * + * @implSpec +- * This abstract class must be implemented with care to ensure other operate correctly. ++ * This abstract class must be implemented with care to ensure other classes operate correctly. + * All implementations that can be instantiated must be final, immutable and thread-safe. + * <p> + * The principal methods are defined to allow the throwing of an exception. +--- ./jdk/src/share/classes/java/time/Duration.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/Duration.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1326,6 +1326,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/Instant.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/Instant.java Wed Jul 30 18:42:59 2014 +0100 +@@ -100,11 +100,6 @@ + * This class models a single instantaneous point on the time-line. + * This might be used to record event time-stamps in the application. + * <p> +- * For practicality, the instant is stored with some constraints. +- * The measurable time-line is restricted to the number of seconds that can be held +- * in a {@code long}. This is greater than the current estimated age of the universe. +- * The instant is stored to nanosecond resolution. +- * <p> + * The range of an instant requires the storage of a number larger than a {@code long}. + * To achieve this, the class stores a {@code long} representing epoch-seconds and an + * {@code int} representing nanosecond-of-second, which will always be between 0 and 999,999,999. +@@ -380,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); + } + } + +@@ -1063,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); +@@ -1348,6 +1344,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/LocalDate.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/LocalDate.java Wed Jul 30 18:42:59 2014 +0100 +@@ -2053,6 +2053,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/LocalDateTime.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/LocalDateTime.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1986,6 +1986,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/LocalTime.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/LocalTime.java Wed Jul 30 18:42:59 2014 +0100 +@@ -838,9 +838,9 @@ + case NANO_OF_SECOND: return withNano((int) newValue); + case NANO_OF_DAY: return LocalTime.ofNanoOfDay(newValue); + case MICRO_OF_SECOND: return withNano((int) newValue * 1000); +- case MICRO_OF_DAY: return plusNanos((newValue - toNanoOfDay() / 1000) * 1000); ++ case MICRO_OF_DAY: return LocalTime.ofNanoOfDay(newValue * 1000); + case MILLI_OF_SECOND: return withNano((int) newValue * 1000_000); +- case MILLI_OF_DAY: return plusNanos((newValue - toNanoOfDay() / 1000_000) * 1000_000); ++ case MILLI_OF_DAY: return LocalTime.ofNanoOfDay(newValue * 1000_000); + case SECOND_OF_MINUTE: return withSecond((int) newValue); + case SECOND_OF_DAY: return plusSeconds(newValue - toSecondOfDay()); + case MINUTE_OF_HOUR: return withMinute((int) newValue); +@@ -1638,6 +1638,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/MonthDay.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/MonthDay.java Wed Jul 30 18:42:59 2014 +0100 +@@ -771,6 +771,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/OffsetDateTime.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/OffsetDateTime.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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); + } +@@ -1925,6 +1926,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/OffsetTime.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/OffsetTime.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1396,6 +1396,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/Period.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/Period.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1058,6 +1058,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws java.io.InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/Year.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/Year.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1104,6 +1104,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/YearMonth.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/YearMonth.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1230,6 +1230,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/ZoneId.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/ZoneId.java Wed Jul 30 18:42:59 2014 +0100 +@@ -624,6 +624,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/ZoneOffset.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/ZoneOffset.java Wed Jul 30 18:42:59 2014 +0100 +@@ -769,6 +769,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/ZoneRegion.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/ZoneRegion.java Wed Jul 30 18:42:59 2014 +0100 +@@ -196,6 +196,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/ZonedDateTime.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/ZonedDateTime.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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; +@@ -550,14 +551,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: " + +@@ -2037,8 +2038,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); + } + +@@ -2225,6 +2230,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/AbstractChronology.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/AbstractChronology.java Wed Jul 30 18:42:59 2014 +0100 +@@ -766,6 +766,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws java.io.InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws ObjectStreamException { +--- ./jdk/src/share/classes/java/time/chrono/ChronoLocalDate.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/ChronoLocalDate.java Wed Jul 30 18:42:59 2014 +0100 +@@ -101,19 +101,12 @@ + * <h3>When to use this interface</h3> + * The design of the API encourages the use of {@code LocalDate} rather than this + * interface, even in the case where the application needs to deal with multiple +- * calendar systems. The rationale for this is explored in the following documentation. ++ * calendar systems. + * <p> +- * The primary use case where this interface should be used is where the generic +- * type parameter {@code <D>} is fully defined as a specific chronology. +- * In that case, the assumptions of that chronology are known at development +- * time and specified in the code. +- * <p> +- * When the chronology is defined in the generic type parameter as ? or otherwise +- * unknown at development time, the rest of the discussion below applies. +- * <p> +- * To emphasize the point, declaring a method signature, field or variable as this +- * interface type can initially seem like the sensible way to globalize an application, +- * however it is usually the wrong approach. ++ * This concept can seem surprising at first, as the natural way to globalize an ++ * application might initially appear to be to abstract the calendar system. ++ * However, as explored below, abstracting the calendar system is usually the wrong ++ * approach, resulting in logic errors and hard to find bugs. + * As such, it should be considered an application-wide architectural decision to choose + * to use this interface as opposed to {@code LocalDate}. + * +--- ./jdk/src/share/classes/java/time/chrono/ChronoLocalDateTimeImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/ChronoLocalDateTimeImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -416,6 +416,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/ChronoPeriodImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/ChronoPeriodImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -376,6 +376,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws ObjectStreamException { +--- ./jdk/src/share/classes/java/time/chrono/ChronoZonedDateTimeImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/ChronoZonedDateTimeImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -340,6 +340,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/HijrahChronology.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/HijrahChronology.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1096,6 +1096,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/HijrahDate.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/HijrahDate.java Wed Jul 30 18:42:59 2014 +0100 +@@ -654,6 +654,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/IsoChronology.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/IsoChronology.java Wed Jul 30 18:42:59 2014 +0100 +@@ -604,6 +604,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/JapaneseChronology.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/JapaneseChronology.java Wed Jul 30 18:42:59 2014 +0100 +@@ -525,6 +525,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/JapaneseDate.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/JapaneseDate.java Wed Jul 30 18:42:59 2014 +0100 +@@ -716,6 +716,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/JapaneseEra.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/JapaneseEra.java Wed Jul 30 18:42:59 2014 +0100 +@@ -357,6 +357,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/MinguoChronology.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/MinguoChronology.java Wed Jul 30 18:42:59 2014 +0100 +@@ -355,6 +355,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/MinguoDate.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/MinguoDate.java Wed Jul 30 18:42:59 2014 +0100 +@@ -478,6 +478,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/ThaiBuddhistChronology.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/ThaiBuddhistChronology.java Wed Jul 30 18:42:59 2014 +0100 +@@ -391,6 +391,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/chrono/ThaiBuddhistDate.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/chrono/ThaiBuddhistDate.java Wed Jul 30 18:42:59 2014 +0100 +@@ -478,6 +478,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/format/DateTimeFormatter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/format/DateTimeFormatter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -344,10 +344,7 @@ + * <b>Fraction</b>: Outputs the nano-of-second field as a fraction-of-second. + * The nano-of-second value has nine digits, thus the count of pattern letters + * is from 1 to 9. If it is less than 9, then the nano-of-second value is +- * truncated, with only the most significant digits being output. When parsing +- * in strict mode, the number of parsed digits must match the count of pattern +- * letters. When parsing in lenient mode, the number of parsed digits must be at +- * least the count of pattern letters, up to 9 digits. ++ * truncated, with only the most significant digits being output. + * <p> + * <b>Year</b>: The count of letters determines the minimum field width below + * which padding is used. If the count of letters is two, then a +@@ -1647,12 +1644,13 @@ + * @return a formatter based on this formatter with the requested resolver style, not null + */ + public DateTimeFormatter withResolverFields(TemporalField... resolverFields) { +- Objects.requireNonNull(resolverFields, "resolverFields"); +- Set<TemporalField> fields = new HashSet<>(Arrays.asList(resolverFields)); ++ Set<TemporalField> fields = null; ++ if (resolverFields != null) { ++ fields = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(resolverFields))); ++ } + if (Objects.equals(this.resolverFields, fields)) { + return this; + } +- fields = Collections.unmodifiableSet(fields); + return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, fields, chrono, zone); + } + +@@ -1696,11 +1694,12 @@ + * @return a formatter based on this formatter with the requested resolver style, not null + */ + public DateTimeFormatter withResolverFields(Set<TemporalField> resolverFields) { +- Objects.requireNonNull(resolverFields, "resolverFields"); + if (Objects.equals(this.resolverFields, resolverFields)) { + return this; + } +- resolverFields = Collections.unmodifiableSet(new HashSet<>(resolverFields)); ++ if (resolverFields != null) { ++ resolverFields = Collections.unmodifiableSet(new HashSet<>(resolverFields)); ++ } + return new DateTimeFormatter(printerParser, locale, decimalStyle, resolverStyle, resolverFields, chrono, zone); + } + +@@ -1935,8 +1934,8 @@ + */ + private TemporalAccessor parseResolved0(final CharSequence text, final ParsePosition position) { + ParsePosition pos = (position != null ? position : new ParsePosition(0)); +- Parsed unresolved = parseUnresolved0(text, pos); +- if (unresolved == null || pos.getErrorIndex() >= 0 || (position == null && pos.getIndex() < text.length())) { ++ DateTimeParseContext context = parseUnresolved0(text, pos); ++ if (context == null || pos.getErrorIndex() >= 0 || (position == null && pos.getIndex() < text.length())) { + String abbr; + if (text.length() > 64) { + abbr = text.subSequence(0, 64).toString() + "..."; +@@ -1951,7 +1950,7 @@ + pos.getIndex(), text, pos.getIndex()); + } + } +- return unresolved.resolve(resolverStyle, resolverFields); ++ return context.toResolved(resolverStyle, resolverFields); + } + + /** +@@ -1994,10 +1993,14 @@ + * @throws IndexOutOfBoundsException if the position is invalid + */ + public TemporalAccessor parseUnresolved(CharSequence text, ParsePosition position) { +- return parseUnresolved0(text, position); ++ DateTimeParseContext context = parseUnresolved0(text, position); ++ if (context == null) { ++ return null; ++ } ++ return context.toUnresolved(); + } + +- private Parsed parseUnresolved0(CharSequence text, ParsePosition position) { ++ private DateTimeParseContext parseUnresolved0(CharSequence text, ParsePosition position) { + Objects.requireNonNull(text, "text"); + Objects.requireNonNull(position, "position"); + DateTimeParseContext context = new DateTimeParseContext(this); +@@ -2008,7 +2011,7 @@ + return null; + } + position.setIndex(pos); // errorIndex not updated from input +- return context.toParsed(); ++ return context; + } + + //----------------------------------------------------------------------- +@@ -2129,23 +2132,23 @@ + @Override + public Object parseObject(String text, ParsePosition pos) { + Objects.requireNonNull(text, "text"); +- Parsed unresolved; ++ DateTimeParseContext context; + try { +- unresolved = formatter.parseUnresolved0(text, pos); ++ context = formatter.parseUnresolved0(text, pos); + } catch (IndexOutOfBoundsException ex) { + if (pos.getErrorIndex() < 0) { + pos.setErrorIndex(0); + } + return null; + } +- if (unresolved == null) { ++ if (context == null) { + if (pos.getErrorIndex() < 0) { + pos.setErrorIndex(0); + } + return null; + } + try { +- TemporalAccessor resolved = unresolved.resolve(formatter.resolverStyle, formatter.resolverFields); ++ TemporalAccessor resolved = context.toResolved(formatter.resolverStyle, formatter.resolverFields); + if (parseType == null) { + return resolved; + } +--- ./jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/format/DateTimeFormatterBuilder.java Wed Jul 30 18:42:59 2014 +0100 +@@ -2596,8 +2596,16 @@ + return value; + } + +- boolean isFixedWidth() { +- return subsequentWidth == -1; ++ /** ++ * For NumberPrinterParser, the width is fixed depending on the ++ * minWidth, maxWidth, signStyle and whether subsequent fields are fixed. ++ * @param context the context ++ * @return true if the field is fixed width ++ * @see DateTimeFormatterBuilder#appendValue(java.time.temporal.TemporalField, int) ++ */ ++ boolean isFixedWidth(DateTimeParseContext context) { ++ return subsequentWidth == -1 || ++ (subsequentWidth > 0 && minWidth == maxWidth && signStyle == SignStyle.NOT_NEGATIVE); + } + + @Override +@@ -2626,12 +2634,12 @@ + return ~position; + } + } +- int effMinWidth = (context.isStrict() || isFixedWidth() ? minWidth : 1); ++ int effMinWidth = (context.isStrict() || isFixedWidth(context) ? minWidth : 1); + int minEndPos = position + effMinWidth; + if (minEndPos > length) { + return ~position; + } +- int effMaxWidth = (context.isStrict() || isFixedWidth() ? maxWidth : 9) + Math.max(subsequentWidth, 0); ++ int effMaxWidth = (context.isStrict() || isFixedWidth(context) ? maxWidth : 9) + Math.max(subsequentWidth, 0); + long total = 0; + BigInteger totalBig = null; + int pos = position; +@@ -2866,6 +2874,21 @@ + this.subsequentWidth + subsequentWidth); + } + ++ /** ++ * For a ReducedPrinterParser, fixed width is false if the mode is strict, ++ * otherwise it is set as for NumberPrinterParser. ++ * @param context the context ++ * @return if the field is fixed width ++ * @see DateTimeFormatterBuilder#appendValueReduced(java.time.temporal.TemporalField, int, int, int) ++ */ ++ @Override ++ boolean isFixedWidth(DateTimeParseContext context) { ++ if (context.isStrict() == false) { ++ return false; ++ } ++ return super.isFixedWidth(context); ++ } ++ + @Override + public String toString() { + return "ReducedValue(" + field + "," + minWidth + "," + maxWidth + "," + (baseDate != null ? baseDate : baseValue) + ")"; +@@ -3263,7 +3286,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); + } +--- ./jdk/src/share/classes/java/time/format/DateTimeParseContext.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/format/DateTimeParseContext.java Wed Jul 30 18:42:59 2014 +0100 +@@ -64,10 +64,12 @@ + import java.time.ZoneId; + import java.time.chrono.Chronology; + import java.time.chrono.IsoChronology; ++import java.time.temporal.TemporalAccessor; + import java.time.temporal.TemporalField; + import java.util.ArrayList; + import java.util.Locale; + import java.util.Objects; ++import java.util.Set; + import java.util.function.Consumer; + + /** +@@ -77,8 +79,8 @@ + * It has the ability to store and retrieve the parsed values and manage optional segments. + * It also provides key information to the parsing methods. + * <p> +- * Once parsing is complete, the {@link #toParsed()} is used to obtain the data. +- * It contains a method to resolve the separate parsed fields into meaningful values. ++ * Once parsing is complete, the {@link #toUnresolved()} is used to obtain the unresolved ++ * result data. The {@link #toResolved()} is used to obtain the resolved result. + * + * @implSpec + * This class is a mutable context intended for use from a single thread. +@@ -309,16 +311,27 @@ + } + + /** +- * Gets the result of the parse. ++ * Gets the unresolved result of the parse. + * + * @return the result of the parse, not null + */ +- Parsed toParsed() { ++ Parsed toUnresolved() { ++ return currentParsed(); ++ } ++ ++ /** ++ * Gets the resolved result of the parse. ++ * ++ * @return the result of the parse, not null ++ */ ++ TemporalAccessor toResolved(ResolverStyle resolverStyle, Set<TemporalField> resolverFields) { + Parsed parsed = currentParsed(); +- parsed.effectiveChrono = getEffectiveChronology(); +- return parsed; ++ parsed.chrono = getEffectiveChronology(); ++ parsed.zone = (parsed.zone != null ? parsed.zone : formatter.getZone()); ++ return parsed.resolve(resolverStyle, resolverFields); + } + ++ + //----------------------------------------------------------------------- + /** + * Gets the first value that was parsed for the specified field. +--- ./jdk/src/share/classes/java/time/format/Parsed.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/format/Parsed.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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; +@@ -136,10 +140,6 @@ + */ + boolean leapSecond; + /** +- * The effective chronology. +- */ +- Chronology effectiveChrono; +- /** + * The resolver style to use. + */ + private ResolverStyle resolverStyle; +@@ -241,17 +241,19 @@ + fieldValues.keySet().retainAll(resolverFields); + } + this.resolverStyle = resolverStyle; +- chrono = effectiveChrono; + resolveFields(); + resolveTimeLenient(); + crossCheck(); + resolvePeriod(); ++ resolveFractional(); ++ resolveInstant(); + return this; + } + + //----------------------------------------------------------------------- + private void resolveFields() { + // resolve ChronoField ++ resolveInstantFields(); + resolveDateFields(); + resolveTimeFields(); + +@@ -266,14 +268,16 @@ + TemporalAccessor resolvedObject = targetField.resolve(fieldValues, this, resolverStyle); + if (resolvedObject != null) { + if (resolvedObject instanceof ChronoZonedDateTime) { +- ChronoZonedDateTime<?> czdt = (ChronoZonedDateTime) resolvedObject; +- if (zone.equals(czdt.getZone()) == false) { ++ ChronoZonedDateTime<?> czdt = (ChronoZonedDateTime<?>) resolvedObject; ++ if (zone == null) { ++ zone = czdt.getZone(); ++ } else if (zone.equals(czdt.getZone()) == false) { + throw new DateTimeException("ChronoZonedDateTime must use the effective parsed zone: " + zone); + } + resolvedObject = czdt.toLocalDateTime(); + } + if (resolvedObject instanceof ChronoLocalDateTime) { +- ChronoLocalDateTime<?> cldt = (ChronoLocalDateTime) resolvedObject; ++ ChronoLocalDateTime<?> cldt = (ChronoLocalDateTime<?>) resolvedObject; + updateCheckConflict(cldt.toLocalTime(), Period.ZERO); + updateCheckConflict(cldt.toLocalDate()); + changedCount++; +@@ -289,7 +293,7 @@ + changedCount++; + continue outer; // have to restart to avoid concurrent modification + } +- throw new DateTimeException("Method resolveFields() can only return ChronoZonedDateTime," + ++ throw new DateTimeException("Method resolve() can only return ChronoZonedDateTime, " + + "ChronoLocalDateTime, ChronoLocalDate or LocalTime"); + } else if (fieldValues.containsKey(targetField) == false) { + changedCount++; +@@ -303,6 +307,7 @@ + } + // if something changed then have to redo ChronoField resolve + if (changedCount > 0) { ++ resolveInstantFields(); + resolveDateFields(); + resolveTimeFields(); + } +@@ -319,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)); + } +@@ -536,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) { +@@ -571,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(); + } + } + +--- ./jdk/src/share/classes/java/time/temporal/IsoFields.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/temporal/IsoFields.java Wed Jul 30 18:42:59 2014 +0100 +@@ -535,11 +535,17 @@ + if (isSupportedBy(temporal) == false) { + throw new UnsupportedTemporalTypeException("Unsupported field: WeekBasedYear"); + } +- int newVal = range().checkValidIntValue(newValue, WEEK_BASED_YEAR); // strict check ++ int newWby = range().checkValidIntValue(newValue, WEEK_BASED_YEAR); // strict check + LocalDate date = LocalDate.from(temporal); ++ int dow = date.get(DAY_OF_WEEK); + int week = getWeek(date); +- date = date.withDayOfYear(180).withYear(newVal).with(WEEK_OF_WEEK_BASED_YEAR, week); +- return (R) date.with(date); ++ if (week == 53 && getWeekRange(newWby) == 52) { ++ week = 52; ++ } ++ LocalDate resolved = LocalDate.of(newWby, 1, 4); // 4th is guaranteed to be in week one ++ int days = (dow - resolved.get(DAY_OF_WEEK)) + ((week - 1) * 7); ++ resolved = resolved.plusDays(days); ++ return (R) temporal.with(resolved); + } + @Override + public String toString() { +@@ -577,12 +583,16 @@ + + private static ValueRange getWeekRange(LocalDate date) { + int wby = getWeekBasedYear(date); +- date = date.withDayOfYear(1).withYear(wby); ++ return ValueRange.of(1, getWeekRange(wby)); ++ } ++ ++ private static int getWeekRange(int wby) { ++ LocalDate date = LocalDate.of(wby, 1, 1); + // 53 weeks if standard year starts on Thursday, or Wed in a leap year + if (date.getDayOfWeek() == THURSDAY || (date.getDayOfWeek() == WEDNESDAY && date.isLeapYear())) { +- return ValueRange.of(1, 53); ++ return 53; + } +- return ValueRange.of(1, 52); ++ return 52; + } + + private static int getWeek(LocalDate date) { +--- ./jdk/src/share/classes/java/time/temporal/TemporalAccessor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/temporal/TemporalAccessor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -217,7 +217,7 @@ + default int get(TemporalField field) { + ValueRange range = range(field); + if (range.isIntValue() == false) { +- throw new UnsupportedTemporalTypeException("Invalid field " + field + " + for get() method, use getLong() instead"); ++ throw new UnsupportedTemporalTypeException("Invalid field " + field + " for get() method, use getLong() instead"); + } + long value = getLong(field); + if (range.isValidValue(value) == false) { +--- ./jdk/src/share/classes/java/time/temporal/ValueRange.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/temporal/ValueRange.java Wed Jul 30 18:42:59 2014 +0100 +@@ -344,10 +344,13 @@ + /** + * Restore the state of an ValueRange from the stream. + * Check that the values are valid. ++ * ++ * @param s the stream to read + * @throws InvalidObjectException if + * the smallest minimum is greater than the smallest maximum, + * or the smallest maximum is greater than the largest maximum + * or the largest minimum is greater than the largest maximum ++ * @throws ClassNotFoundException if a class cannot be resolved + */ + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException, InvalidObjectException +--- ./jdk/src/share/classes/java/time/temporal/WeekFields.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/temporal/WeekFields.java Wed Jul 30 18:42:59 2014 +0100 +@@ -344,8 +344,11 @@ + /** + * Restore the state of a WeekFields from the stream. + * Check that the values are valid. ++ * ++ * @param s the stream to read + * @throws InvalidObjectException if the serialized object has an invalid + * value for firstDayOfWeek or minimalDays. ++ * @throws ClassNotFoundException if a class cannot be resolved + */ + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException, InvalidObjectException +@@ -697,7 +700,7 @@ + * @see WeekFields#weekOfWeekBasedYear() + */ + static ComputedDayOfField ofWeekOfWeekBasedYearField(WeekFields weekDef) { +- return new ComputedDayOfField("WeekOfWeekBasedYear", weekDef, WEEKS, IsoFields.WEEK_BASED_YEARS, WEEK_OF_YEAR_RANGE); ++ return new ComputedDayOfField("WeekOfWeekBasedYear", weekDef, WEEKS, IsoFields.WEEK_BASED_YEARS, WEEK_OF_WEEK_BASED_YEAR_RANGE); + } + + /** +@@ -750,6 +753,7 @@ + private static final ValueRange DAY_OF_WEEK_RANGE = ValueRange.of(1, 7); + private static final ValueRange WEEK_OF_MONTH_RANGE = ValueRange.of(0, 1, 4, 6); + private static final ValueRange WEEK_OF_YEAR_RANGE = ValueRange.of(0, 1, 52, 54); ++ private static final ValueRange WEEK_OF_WEEK_BASED_YEAR_RANGE = ValueRange.of(1, 52, 53); + + @Override + public long getFrom(TemporalAccessor temporal) { +--- ./jdk/src/share/classes/java/time/zone/ZoneOffsetTransition.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/zone/ZoneOffsetTransition.java Wed Jul 30 18:42:59 2014 +0100 +@@ -173,6 +173,8 @@ + //----------------------------------------------------------------------- + /** + * Defend against malicious streams. ++ * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/zone/ZoneOffsetTransitionRule.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/zone/ZoneOffsetTransitionRule.java Wed Jul 30 18:42:59 2014 +0100 +@@ -235,6 +235,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/time/zone/ZoneRules.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/time/zone/ZoneRules.java Wed Jul 30 18:42:59 2014 +0100 +@@ -319,6 +319,7 @@ + /** + * Defend against malicious streams. + * ++ * @param s the stream to read + * @throws InvalidObjectException always + */ + private void readObject(ObjectInputStream s) throws InvalidObjectException { +--- ./jdk/src/share/classes/java/util/AbstractMap.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/AbstractMap.java Wed Jul 30 18:42:59 2014 +0100 +@@ -305,8 +305,8 @@ + * appropriate view the first time this view is requested. The views are + * stateless, so there's no reason to create more than one of each. + */ +- transient volatile Set<K> keySet = null; +- transient volatile Collection<V> values = null; ++ transient volatile Set<K> keySet; ++ transient volatile Collection<V> values; + + /** + * {@inheritDoc} +--- ./jdk/src/share/classes/java/util/ArrayList.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/ArrayList.java Wed Jul 30 18:42:59 2014 +0100 +@@ -119,10 +119,17 @@ + private static final Object[] EMPTY_ELEMENTDATA = {}; + + /** ++ * Shared empty array instance used for default sized empty instances. We ++ * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when ++ * first element is added. ++ */ ++ private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; ++ ++ /** + * The array buffer into which the elements of the ArrayList are stored. + * The capacity of the ArrayList is the length of this array buffer. Any +- * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to +- * DEFAULT_CAPACITY when the first element is added. ++ * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA ++ * will be expanded to DEFAULT_CAPACITY when the first element is added. + */ + transient Object[] elementData; // non-private to simplify nested class access + +@@ -141,19 +148,21 @@ + * is negative + */ + public ArrayList(int initialCapacity) { +- super(); +- if (initialCapacity < 0) ++ if (initialCapacity > 0) { ++ this.elementData = new Object[initialCapacity]; ++ } else if (initialCapacity == 0) { ++ this.elementData = EMPTY_ELEMENTDATA; ++ } else { + throw new IllegalArgumentException("Illegal Capacity: "+ + initialCapacity); +- this.elementData = new Object[initialCapacity]; ++ } + } + + /** + * Constructs an empty list with an initial capacity of ten. + */ + public ArrayList() { +- super(); +- this.elementData = EMPTY_ELEMENTDATA; ++ this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; + } + + /** +@@ -166,10 +175,14 @@ + */ + public ArrayList(Collection<? extends E> c) { + elementData = c.toArray(); +- size = elementData.length; +- // c.toArray might (incorrectly) not return Object[] (see 6260652) +- if (elementData.getClass() != Object[].class) +- elementData = Arrays.copyOf(elementData, size, Object[].class); ++ if ((size = elementData.length) != 0) { ++ // c.toArray might (incorrectly) not return Object[] (see 6260652) ++ if (elementData.getClass() != Object[].class) ++ elementData = Arrays.copyOf(elementData, size, Object[].class); ++ } else { ++ // replace with empty array. ++ this.elementData = EMPTY_ELEMENTDATA; ++ } + } + + /** +@@ -180,7 +193,9 @@ + public void trimToSize() { + modCount++; + if (size < elementData.length) { +- elementData = Arrays.copyOf(elementData, size); ++ elementData = (size == 0) ++ ? EMPTY_ELEMENTDATA ++ : Arrays.copyOf(elementData, size); + } + } + +@@ -192,11 +207,11 @@ + * @param minCapacity the desired minimum capacity + */ + public void ensureCapacity(int minCapacity) { +- int minExpand = (elementData != EMPTY_ELEMENTDATA) +- // any size if real element table ++ int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) ++ // any size if not default element table + ? 0 +- // larger than default for empty table. It's already supposed to be +- // at default size. ++ // larger than default for default empty table. It's already ++ // supposed to be at default size. + : DEFAULT_CAPACITY; + + if (minCapacity > minExpand) { +@@ -205,7 +220,7 @@ + } + + private void ensureCapacityInternal(int minCapacity) { +- if (elementData == EMPTY_ELEMENTDATA) { ++ if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { + minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); + } + +--- ./jdk/src/share/classes/java/util/Arrays.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/Arrays.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -28,6 +28,7 @@ + import java.lang.reflect.Array; + import java.util.concurrent.ForkJoinPool; + import java.util.function.BinaryOperator; ++import java.util.function.Consumer; + import java.util.function.DoubleBinaryOperator; + import java.util.function.IntBinaryOperator; + import java.util.function.IntFunction; +@@ -35,6 +36,7 @@ + import java.util.function.IntToLongFunction; + import java.util.function.IntUnaryOperator; + import java.util.function.LongBinaryOperator; ++import java.util.function.UnaryOperator; + import java.util.stream.DoubleStream; + import java.util.stream.IntStream; + import java.util.stream.LongStream; +@@ -1427,12 +1429,14 @@ + * found to violate the {@link Comparator} contract + */ + public static <T> void sort(T[] a, Comparator<? super T> c) { +- if (c == null) +- c = NaturalOrder.INSTANCE; +- if (LegacyMergeSort.userRequested) +- legacyMergeSort(a, c); +- else +- TimSort.sort(a, 0, a.length, c, null, 0, 0); ++ if (c == null) { ++ sort(a); ++ } else { ++ if (LegacyMergeSort.userRequested) ++ legacyMergeSort(a, c); ++ else ++ TimSort.sort(a, 0, a.length, c, null, 0, 0); ++ } + } + + /** To be removed in a future release. */ +@@ -1498,13 +1502,15 @@ + */ + public static <T> void sort(T[] a, int fromIndex, int toIndex, + Comparator<? super T> c) { +- if (c == null) +- c = NaturalOrder.INSTANCE; +- rangeCheck(a.length, fromIndex, toIndex); +- if (LegacyMergeSort.userRequested) +- legacyMergeSort(a, fromIndex, toIndex, c); +- else +- TimSort.sort(a, fromIndex, toIndex, c, null, 0, 0); ++ if (c == null) { ++ sort(a, fromIndex, toIndex); ++ } else { ++ rangeCheck(a.length, fromIndex, toIndex); ++ if (LegacyMergeSort.userRequested) ++ legacyMergeSort(a, fromIndex, toIndex, c); ++ else ++ TimSort.sort(a, fromIndex, toIndex, c, null, 0, 0); ++ } + } + + /** To be removed in a future release. */ +@@ -3844,12 +3850,13 @@ + + @Override + public int indexOf(Object o) { +- if (o==null) { +- for (int i=0; i<a.length; i++) +- if (a[i]==null) ++ E[] a = this.a; ++ if (o == null) { ++ for (int i = 0; i < a.length; i++) ++ if (a[i] == null) + return i; + } else { +- for (int i=0; i<a.length; i++) ++ for (int i = 0; i < a.length; i++) + if (o.equals(a[i])) + return i; + } +@@ -3865,6 +3872,28 @@ + public Spliterator<E> spliterator() { + return Spliterators.spliterator(a, Spliterator.ORDERED); + } ++ ++ @Override ++ public void forEach(Consumer<? super E> action) { ++ Objects.requireNonNull(action); ++ for (E e : a) { ++ action.accept(e); ++ } ++ } ++ ++ @Override ++ public void replaceAll(UnaryOperator<E> operator) { ++ Objects.requireNonNull(operator); ++ E[] a = this.a; ++ for (int i = 0; i < a.length; i++) { ++ a[i] = operator.apply(a[i]); ++ } ++ } ++ ++ @Override ++ public void sort(Comparator<? super E> c) { ++ Arrays.sort(a, c); ++ } + } + + /** +--- ./jdk/src/share/classes/java/util/Collections.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/Collections.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -121,34 +121,9 @@ + * + * <p>The specified list must be modifiable, but need not be resizable. + * +- * <p>Implementation note: This implementation is a stable, adaptive, +- * iterative mergesort that requires far fewer than n lg(n) comparisons +- * when the input array is partially sorted, while offering the +- * performance of a traditional mergesort when the input array is +- * randomly ordered. If the input array is nearly sorted, the +- * implementation requires approximately n comparisons. Temporary +- * storage requirements vary from a small constant for nearly sorted +- * input arrays to n/2 object references for randomly ordered input +- * arrays. +- * +- * <p>The implementation takes equal advantage of ascending and +- * descending order in its input array, and can take advantage of +- * ascending and descending order in different parts of the same +- * input array. It is well-suited to merging two or more sorted arrays: +- * simply concatenate the arrays and sort the resulting array. +- * +- * <p>The implementation was adapted from Tim Peters's list sort for Python +- * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt"> +- * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic +- * Sorting and Information Theoretic Complexity", in Proceedings of the +- * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474, +- * January 1993. +- * +- * <p>This implementation dumps the specified list into an array, sorts +- * the array, and iterates over the list resetting each element +- * from the corresponding position in the array. This avoids the +- * n<sup>2</sup> log(n) performance that would result from attempting +- * to sort a linked list in place. ++ * @implNote ++ * This implementation defers to the {@link List#sort(Comparator)} ++ * method using the specified list and a {@code null} comparator. + * + * @param <T> the class of the objects in the list + * @param list the list to be sorted. +@@ -159,16 +134,11 @@ + * @throws IllegalArgumentException (optional) if the implementation + * detects that the natural ordering of the list elements is + * found to violate the {@link Comparable} contract ++ * @see List#sort(Comparator) + */ + @SuppressWarnings("unchecked") + public static <T extends Comparable<? super T>> void sort(List<T> list) { +- Object[] a = list.toArray(); +- Arrays.sort(a); +- ListIterator<T> i = list.listIterator(); +- for (int j=0; j<a.length; j++) { +- i.next(); +- i.set((T)a[j]); +- } ++ list.sort(null); + } + + /** +@@ -183,34 +153,9 @@ + * + * <p>The specified list must be modifiable, but need not be resizable. + * +- * <p>Implementation note: This implementation is a stable, adaptive, +- * iterative mergesort that requires far fewer than n lg(n) comparisons +- * when the input array is partially sorted, while offering the +- * performance of a traditional mergesort when the input array is +- * randomly ordered. If the input array is nearly sorted, the +- * implementation requires approximately n comparisons. Temporary +- * storage requirements vary from a small constant for nearly sorted +- * input arrays to n/2 object references for randomly ordered input +- * arrays. +- * +- * <p>The implementation takes equal advantage of ascending and +- * descending order in its input array, and can take advantage of +- * ascending and descending order in different parts of the same +- * input array. It is well-suited to merging two or more sorted arrays: +- * simply concatenate the arrays and sort the resulting array. +- * +- * <p>The implementation was adapted from Tim Peters's list sort for Python +- * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt"> +- * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic +- * Sorting and Information Theoretic Complexity", in Proceedings of the +- * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474, +- * January 1993. +- * +- * <p>This implementation dumps the specified list into an array, sorts +- * the array, and iterates over the list resetting each element +- * from the corresponding position in the array. This avoids the +- * n<sup>2</sup> log(n) performance that would result from attempting +- * to sort a linked list in place. ++ * @implNote ++ * This implementation defers to the {@link List#sort(Comparator)} ++ * method using the specified list and comparator. + * + * @param <T> the class of the objects in the list + * @param list the list to be sorted. +@@ -223,16 +168,11 @@ + * list-iterator does not support the {@code set} operation. + * @throws IllegalArgumentException (optional) if the comparator is + * found to violate the {@link Comparator} contract ++ * @see List#sort(Comparator) + */ + @SuppressWarnings({"unchecked", "rawtypes"}) + public static <T> void sort(List<T> list, Comparator<? super T> c) { +- Object[] a = list.toArray(); +- Arrays.sort(a, (Comparator)c); +- ListIterator<T> i = list.listIterator(); +- for (int j=0; j<a.length; j++) { +- i.next(); +- i.set((T)a[j]); +- } ++ list.sort(c); + } + + +@@ -1526,9 +1466,9 @@ + throw new UnsupportedOperationException(); + } + +- private transient Set<K> keySet = null; +- private transient Set<Map.Entry<K,V>> entrySet = null; +- private transient Collection<V> values = null; ++ private transient Set<K> keySet; ++ private transient Set<Map.Entry<K,V>> entrySet; ++ private transient Collection<V> values; + + public Set<K> keySet() { + if (keySet==null) +@@ -2657,9 +2597,9 @@ + synchronized (mutex) {m.clear();} + } + +- private transient Set<K> keySet = null; +- private transient Set<Map.Entry<K,V>> entrySet = null; +- private transient Collection<V> values = null; ++ private transient Set<K> keySet; ++ private transient Set<Map.Entry<K,V>> entrySet; ++ private transient Collection<V> values; + + public Set<K> keySet() { + synchronized (mutex) { +@@ -3091,9 +3031,11 @@ + final Collection<E> c; + final Class<E> type; + +- void typeCheck(Object o) { ++ @SuppressWarnings("unchecked") ++ E typeCheck(Object o) { + if (o != null && !type.isInstance(o)) + throw new ClassCastException(badElementMsg(o)); ++ return (E) o; + } + + private String badElementMsg(Object o) { +@@ -3102,10 +3044,8 @@ + } + + CheckedCollection(Collection<E> c, Class<E> type) { +- if (c==null || type == null) +- throw new NullPointerException(); +- this.c = c; +- this.type = type; ++ this.c = Objects.requireNonNull(c, "c"); ++ this.type = Objects.requireNonNull(type, "type"); + } + + public int size() { return c.size(); } +@@ -3142,7 +3082,7 @@ + return c.add(e); + } + +- private E[] zeroLengthElementArray = null; // Lazily initialized ++ private E[] zeroLengthElementArray; // Lazily initialized + + private E[] zeroLengthElementArray() { + return zeroLengthElementArray != null ? zeroLengthElementArray : +@@ -3151,7 +3091,7 @@ + + @SuppressWarnings("unchecked") + Collection<E> checkedCopyOf(Collection<? extends E> coll) { +- Object[] a = null; ++ Object[] a; + try { + E[] z = zeroLengthElementArray(); + a = coll.toArray(z); +@@ -3547,10 +3487,20 @@ + return new CheckedList<>(list.subList(fromIndex, toIndex), type); + } + ++ /** ++ * {@inheritDoc} ++ * ++ * @throws ClassCastException if the class of an element returned by the ++ * operator prevents it from being added to this collection. The ++ * exception may be thrown after some elements of the list have ++ * already been replaced. ++ */ + @Override + public void replaceAll(UnaryOperator<E> operator) { +- list.replaceAll(operator); +- } ++ Objects.requireNonNull(operator); ++ list.replaceAll(e -> typeCheck(operator.apply(e))); ++ } ++ + @Override + public void sort(Comparator<? super E> c) { + list.sort(c); +@@ -3703,7 +3653,7 @@ + m.put(e.getKey(), e.getValue()); + } + +- private transient Set<Map.Entry<K,V>> entrySet = null; ++ private transient Set<Map.Entry<K,V>> entrySet; + + public Set<Map.Entry<K,V>> entrySet() { + if (entrySet==null) +@@ -4464,10 +4414,12 @@ + * <pre> + * List<String> s = Collections.emptyList(); + * </pre> +- * Implementation note: Implementations of this method need not +- * create a separate <tt>List</tt> object for each call. Using this +- * method is likely to have comparable cost to using the like-named +- * field. (Unlike this method, the field does not provide type safety.) ++ * ++ * @implNote ++ * Implementations of this method need not create a separate <tt>List</tt> ++ * object for each call. Using this method is likely to have comparable ++ * cost to using the like-named field. (Unlike this method, the field does ++ * not provide type safety.) + * + * @param <T> type of elements, if there were any, in the list + * @return an empty immutable list +@@ -4935,9 +4887,9 @@ + public boolean containsValue(Object value) {return eq(value, v);} + public V get(Object key) {return (eq(key, k) ? v : null);} + +- private transient Set<K> keySet = null; +- private transient Set<Map.Entry<K,V>> entrySet = null; +- private transient Collection<V> values = null; ++ private transient Set<K> keySet; ++ private transient Set<Map.Entry<K,V>> entrySet; ++ private transient Collection<V> values; + + public Set<K> keySet() { + if (keySet==null) +--- ./jdk/src/share/classes/java/util/EnumMap.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/EnumMap.java Wed Jul 30 18:42:59 2014 +0100 +@@ -367,7 +367,7 @@ + * view the first time this view is requested. The view is stateless, + * so there's no reason to create more than one. + */ +- private transient Set<Map.Entry<K,V>> entrySet = null; ++ private transient Set<Map.Entry<K,V>> entrySet; + + /** + * Returns a {@link Set} view of the keys contained in this map. +@@ -562,7 +562,7 @@ + } + + private class EntryIterator extends EnumMapIterator<Map.Entry<K,V>> { +- private Entry lastReturnedEntry = null; ++ private Entry lastReturnedEntry; + + public Map.Entry<K,V> next() { + if (!hasNext()) +--- ./jdk/src/share/classes/java/util/HashMap.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/HashMap.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1967,7 +1967,7 @@ + dir = -1; + else if (ph < h) + dir = 1; +- else if ((pk = p.key) == k || (pk != null && k.equals(pk))) ++ else if ((pk = p.key) == k || (k != null && k.equals(pk))) + return p; + else if ((kc == null && + (kc = comparableClassFor(k)) == null) || +--- ./jdk/src/share/classes/java/util/Hashtable.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/Hashtable.java Wed Jul 30 18:42:59 2014 +0100 +@@ -617,9 +617,9 @@ + * appropriate view the first time this view is requested. The views are + * stateless, so there's no reason to create more than one of each. + */ +- private transient volatile Set<K> keySet = null; +- private transient volatile Set<Map.Entry<K,V>> entrySet = null; +- private transient volatile Collection<V> values = null; ++ private transient volatile Set<K> keySet; ++ private transient volatile Set<Map.Entry<K,V>> entrySet; ++ private transient volatile Collection<V> values; + + /** + * Returns a {@link Set} view of the keys contained in this map. +@@ -1303,8 +1303,8 @@ + private class Enumerator<T> implements Enumeration<T>, Iterator<T> { + Entry<?,?>[] table = Hashtable.this.table; + int index = table.length; +- Entry<?,?> entry = null; +- Entry<?,?> lastReturned = null; ++ Entry<?,?> entry; ++ Entry<?,?> lastReturned; + int type; + + /** +--- ./jdk/src/share/classes/java/util/IdentityHashMap.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/IdentityHashMap.java Wed Jul 30 18:42:59 2014 +0100 +@@ -842,7 +842,7 @@ + private class EntryIterator + extends IdentityHashMapIterator<Map.Entry<K,V>> + { +- private Entry lastReturnedEntry = null; ++ private Entry lastReturnedEntry; + + public Map.Entry<K,V> next() { + lastReturnedEntry = new Entry(nextIndex()); +@@ -928,7 +928,7 @@ + * view the first time this view is requested. The view is stateless, + * so there's no reason to create more than one. + */ +- private transient Set<Map.Entry<K,V>> entrySet = null; ++ private transient Set<Map.Entry<K,V>> entrySet; + + /** + * Returns an identity-based set view of the keys contained in this map. +--- ./jdk/src/share/classes/java/util/LinkedList.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/LinkedList.java Wed Jul 30 18:42:59 2014 +0100 +@@ -869,7 +869,7 @@ + } + + private class ListItr implements ListIterator<E> { +- private Node<E> lastReturned = null; ++ private Node<E> lastReturned; + private Node<E> next; + private int nextIndex; + private int expectedModCount = modCount; +--- ./jdk/src/share/classes/java/util/List.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/List.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -415,11 +415,49 @@ + } + + /** +- * Sorts this list using the supplied {@code Comparator} to compare elements. ++ * Sorts this list according to the order induced by the specified ++ * {@link Comparator}. ++ * ++ * <p>All elements in this list must be <i>mutually comparable</i> using the ++ * specified comparator (that is, {@code c.compare(e1, e2)} must not throw ++ * a {@code ClassCastException} for any elements {@code e1} and {@code e2} ++ * in the list). ++ * ++ * <p>If the specified comparator is {@code null} then all elements in this ++ * list must implement the {@link Comparable} interface and the elements' ++ * {@linkplain Comparable natural ordering} should be used. ++ * ++ * <p>This list must be modifiable, but need not be resizable. + * + * @implSpec +- * The default implementation is equivalent to, for this {@code list}: +- * <pre>Collections.sort(list, c)</pre> ++ * The default implementation obtains an array containing all elements in ++ * this list, sorts the array, and iterates over this list resetting each ++ * element from the corresponding position in the array. (This avoids the ++ * n<sup>2</sup> log(n) performance that would result from attempting ++ * to sort a linked list in place.) ++ * ++ * @implNote ++ * This implementation is a stable, adaptive, iterative mergesort that ++ * requires far fewer than n lg(n) comparisons when the input array is ++ * partially sorted, while offering the performance of a traditional ++ * mergesort when the input array is randomly ordered. If the input array ++ * is nearly sorted, the implementation requires approximately n ++ * comparisons. Temporary storage requirements vary from a small constant ++ * for nearly sorted input arrays to n/2 object references for randomly ++ * ordered input arrays. ++ * ++ * <p>The implementation takes equal advantage of ascending and ++ * descending order in its input array, and can take advantage of ++ * ascending and descending order in different parts of the same ++ * input array. It is well-suited to merging two or more sorted arrays: ++ * simply concatenate the arrays and sort the resulting array. ++ * ++ * <p>The implementation was adapted from Tim Peters's list sort for Python ++ * (<a href="http://svn.python.org/projects/python/trunk/Objects/listsort.txt"> ++ * TimSort</a>). It uses techniques from Peter McIlroy's "Optimistic ++ * Sorting and Information Theoretic Complexity", in Proceedings of the ++ * Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474, ++ * January 1993. + * + * @param c the {@code Comparator} used to compare list elements. + * A {@code null} value indicates that the elements' +@@ -434,8 +472,15 @@ + * contract + * @since 1.8 + */ ++ @SuppressWarnings({"unchecked", "rawtypes"}) + default void sort(Comparator<? super E> c) { +- Collections.sort(this, c); ++ Object[] a = this.toArray(); ++ Arrays.sort(a, (Comparator) c); ++ ListIterator<E> i = this.listIterator(); ++ for (Object e : a) { ++ i.next(); ++ i.set((E) e); ++ } + } + + /** +--- ./jdk/src/share/classes/java/util/Locale.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/Locale.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -2905,8 +2905,8 @@ + for (int i = 1; i < subtags.length; i++) { + if (isSubtagIllFormed(subtags[i], false)) { + isIllFormed = true; ++ break; + } +- break; + } + } + if (isIllFormed) { +@@ -3040,6 +3040,7 @@ + * 2616</a> + * @param map a map containing information to customize language ranges + * @return a Language Priority List with customization. The list is ++ * modifiable. + * @throws NullPointerException if {@code ranges} is null + * @throws IllegalArgumentException if a language range or a weight + * found in the given {@code ranges} is ill-formed +--- ./jdk/src/share/classes/java/util/Map.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/Map.java Wed Jul 30 18:42:59 2014 +0100 +@@ -157,10 +157,10 @@ + * key + * @throws ClassCastException if the key is of an inappropriate type for + * this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if the specified key is null and this map + * does not permit null keys +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + */ + boolean containsKey(Object key); + +@@ -177,10 +177,10 @@ + * specified value + * @throws ClassCastException if the value is of an inappropriate type for + * this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if the specified value is null and this + * map does not permit null values +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + */ + boolean containsValue(Object value); + +@@ -204,10 +204,10 @@ + * {@code null} if this map contains no mapping for the key + * @throws ClassCastException if the key is of an inappropriate type for + * this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if the specified key is null and this map + * does not permit null keys +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + */ + V get(Object key); + +@@ -264,10 +264,10 @@ + * is not supported by this map + * @throws ClassCastException if the key is of an inappropriate type for + * this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if the specified key is null and this + * map does not permit null keys +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + */ + V remove(Object key); + +@@ -577,10 +577,10 @@ + * {@code defaultValue} if this map contains no mapping for the key + * @throws ClassCastException if the key is of an inappropriate type for + * this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if the specified key is null and this map + * does not permit null keys +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @since 1.8 + */ + default V getOrDefault(Object key, V defaultValue) { +@@ -659,13 +659,13 @@ + * values + * @throws ClassCastException if a replacement value is of an inappropriate + * type for this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if function or a replacement value is null, + * and this map does not permit null keys or values +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws IllegalArgumentException if some property of a replacement value + * prevents it from being stored in this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws ConcurrentModificationException if an entry is found to be + * removed during iteration + * @since 1.8 +@@ -726,16 +726,16 @@ + * if the implementation supports null values.) + * @throws UnsupportedOperationException if the {@code put} operation + * is not supported by this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws ClassCastException if the key or value is of an inappropriate + * type for this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if the specified key or value is null, + * and this map does not permit null keys or values +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws IllegalArgumentException if some property of the specified key + * or value prevents it from being stored in this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @since 1.8 + */ + default V putIfAbsent(K key, V value) { +@@ -772,13 +772,13 @@ + * @return {@code true} if the value was removed + * @throws UnsupportedOperationException if the {@code remove} operation + * is not supported by this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws ClassCastException if the key or value is of an inappropriate + * type for this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if the specified key or value is null, + * and this map does not permit null keys or values +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @since 1.8 + */ + default boolean remove(Object key, Object value) { +@@ -821,14 +821,14 @@ + * @return {@code true} if the value was replaced + * @throws UnsupportedOperationException if the {@code put} operation + * is not supported by this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws ClassCastException if the class of a specified key or value + * prevents it from being stored in this map + * @throws NullPointerException if a specified key or newValue is null, + * and this map does not permit null keys or values + * @throws NullPointerException if oldValue is null and this map does not + * permit null values +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws IllegalArgumentException if some property of a specified key + * or value prevents it from being stored in this map + * @since 1.8 +@@ -871,10 +871,10 @@ + * if the implementation supports null values.) + * @throws UnsupportedOperationException if the {@code put} operation + * is not supported by this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws ClassCastException if the class of the specified key or value + * prevents it from being stored in this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if the specified key or value is null, + * and this map does not permit null keys or values + * @throws IllegalArgumentException if some property of the specified key +@@ -942,10 +942,10 @@ + * is null + * @throws UnsupportedOperationException if the {@code put} operation + * is not supported by this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws ClassCastException if the class of the specified key or value + * prevents it from being stored in this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @since 1.8 + */ + default V computeIfAbsent(K key, +@@ -1003,10 +1003,10 @@ + * remappingFunction is null + * @throws UnsupportedOperationException if the {@code put} operation + * is not supported by this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws ClassCastException if the class of the specified key or value + * prevents it from being stored in this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @since 1.8 + */ + default V computeIfPresent(K key, +@@ -1079,10 +1079,10 @@ + * remappingFunction is null + * @throws UnsupportedOperationException if the {@code put} operation + * is not supported by this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws ClassCastException if the class of the specified key or value + * prevents it from being stored in this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @since 1.8 + */ + default V compute(K key, +@@ -1157,10 +1157,10 @@ + * value is associated with the key + * @throws UnsupportedOperationException if the {@code put} operation + * is not supported by this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws ClassCastException if the class of the specified key or value + * prevents it from being stored in this map +- * (<a href="Collection.html#optional-restrictions">optional</a>) ++ * (<a href="{@docRoot}/java/util/Collection.html#optional-restrictions">optional</a>) + * @throws NullPointerException if the specified key is null and this map + * does not support null keys or the value or remappingFunction is + * null +--- ./jdk/src/share/classes/java/util/Random.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/Random.java Wed Jul 30 18:42:59 2014 +0100 +@@ -874,7 +874,7 @@ + * (inclusive) and one (exclusive). + * + * <p>A pseudorandom {@code double} value is generated as if it's the result +- * of calling the method {@link #nextDouble()}}. ++ * of calling the method {@link #nextDouble()}. + * + * @param streamSize the number of values to generate + * @return a stream of {@code double} values +@@ -897,7 +897,7 @@ + * (exclusive). + * + * <p>A pseudorandom {@code double} value is generated as if it's the result +- * of calling the method {@link #nextDouble()}}. ++ * of calling the method {@link #nextDouble()}. + * + * @implNote This method is implemented to be equivalent to {@code + * doubles(Long.MAX_VALUE)}. +--- ./jdk/src/share/classes/java/util/Spliterators.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/Spliterators.java Wed Jul 30 18:42:59 2014 +0100 +@@ -384,7 +384,7 @@ + */ + private static void checkFromToBounds(int arrayLength, int origin, int fence) { + if (origin > fence) { +- throw new IllegalArgumentException( ++ throw new ArrayIndexOutOfBoundsException( + "origin(" + origin + ") > fence(" + fence + ")"); + } + if (origin < 0) { +--- ./jdk/src/share/classes/java/util/TreeMap.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/TreeMap.java Wed Jul 30 18:42:59 2014 +0100 +@@ -120,7 +120,7 @@ + */ + private final Comparator<? super K> comparator; + +- private transient Entry<K,V> root = null; ++ private transient Entry<K,V> root; + + /** + * The number of entries in the tree +@@ -784,9 +784,9 @@ + * the first time this view is requested. Views are stateless, so + * there's no reason to create more than one. + */ +- private transient EntrySet entrySet = null; +- private transient KeySet<K> navigableKeySet = null; +- private transient NavigableMap<K,V> descendingMap = null; ++ private transient EntrySet entrySet; ++ private transient KeySet<K> navigableKeySet; ++ private transient NavigableMap<K,V> descendingMap; + + /** + * Returns a {@link Set} view of the keys contained in this map. +@@ -1586,9 +1586,9 @@ + } + + // Views +- transient NavigableMap<K,V> descendingMapView = null; +- transient EntrySetView entrySetView = null; +- transient KeySet<K> navigableKeySetView = null; ++ transient NavigableMap<K,V> descendingMapView; ++ transient EntrySetView entrySetView; ++ transient KeySet<K> navigableKeySetView; + + public final NavigableSet<K> navigableKeySet() { + KeySet<K> nksv = navigableKeySetView; +@@ -2049,8 +2049,8 @@ + static final class Entry<K,V> implements Map.Entry<K,V> { + K key; + V value; +- Entry<K,V> left = null; +- Entry<K,V> right = null; ++ Entry<K,V> left; ++ Entry<K,V> right; + Entry<K,V> parent; + boolean color = BLACK; + +--- ./jdk/src/share/classes/java/util/WeakHashMap.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/WeakHashMap.java Wed Jul 30 18:42:59 2014 +0100 +@@ -759,21 +759,21 @@ + + private abstract class HashIterator<T> implements Iterator<T> { + private int index; +- private Entry<K,V> entry = null; +- private Entry<K,V> lastReturned = null; ++ private Entry<K,V> entry; ++ private Entry<K,V> lastReturned; + private int expectedModCount = modCount; + + /** + * Strong reference needed to avoid disappearance of key + * between hasNext and next + */ +- private Object nextKey = null; ++ private Object nextKey; + + /** + * Strong reference needed to avoid disappearance of key + * between nextEntry() and any use of the entry + */ +- private Object currentKey = null; ++ private Object currentKey; + + HashIterator() { + index = isEmpty() ? 0 : table.length; +@@ -848,7 +848,7 @@ + + // Views + +- private transient Set<Map.Entry<K,V>> entrySet = null; ++ private transient Set<Map.Entry<K,V>> entrySet; + + /** + * Returns a {@link Set} view of the keys contained in this map. +--- ./jdk/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1400,7 +1400,7 @@ + lock.lock(); + try { + checkForComodification(); +- if (fromIndex < 0 || toIndex > size) ++ if (fromIndex < 0 || toIndex > size || fromIndex > toIndex) + throw new IndexOutOfBoundsException(); + return new COWSubList<E>(l, fromIndex + offset, + toIndex + offset); +--- ./jdk/src/share/classes/java/util/stream/SortedOps.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/stream/SortedOps.java Wed Jul 30 18:42:59 2014 +0100 +@@ -278,16 +278,60 @@ + } + + /** ++ * Abstract {@link Sink} for implementing sort on reference streams. ++ * ++ * <p> ++ * Note: documentation below applies to reference and all primitive sinks. ++ * <p> ++ * Sorting sinks first accept all elements, buffering then into an array ++ * or a re-sizable data structure, if the size of the pipeline is known or ++ * unknown respectively. At the end of the sink protocol those elements are ++ * sorted and then pushed downstream. ++ * This class records if {@link #cancellationRequested} is called. If so it ++ * can be inferred that the source pushing source elements into the pipeline ++ * knows that the pipeline is short-circuiting. In such cases sub-classes ++ * pushing elements downstream will preserve the short-circuiting protocol ++ * by calling {@code downstream.cancellationRequested()} and checking the ++ * result is {@code false} before an element is pushed. ++ * <p> ++ * Note that the above behaviour is an optimization for sorting with ++ * sequential streams. It is not an error that more elements, than strictly ++ * required to produce a result, may flow through the pipeline. This can ++ * occur, in general (not restricted to just sorting), for short-circuiting ++ * parallel pipelines. ++ */ ++ private static abstract class AbstractRefSortingSink<T> extends Sink.ChainedReference<T, T> { ++ protected final Comparator<? super T> comparator; ++ // @@@ could be a lazy final value, if/when support is added ++ protected boolean cancellationWasRequested; ++ ++ AbstractRefSortingSink(Sink<? super T> downstream, Comparator<? super T> comparator) { ++ super(downstream); ++ this.comparator = comparator; ++ } ++ ++ /** ++ * Records is cancellation is requested so short-circuiting behaviour ++ * can be preserved when the sorted elements are pushed downstream. ++ * ++ * @return false, as this sink never short-circuits. ++ */ ++ @Override ++ public final boolean cancellationRequested() { ++ cancellationWasRequested = true; ++ return false; ++ } ++ } ++ ++ /** + * {@link Sink} for implementing sort on SIZED reference streams. + */ +- private static final class SizedRefSortingSink<T> extends Sink.ChainedReference<T, T> { +- private final Comparator<? super T> comparator; ++ private static final class SizedRefSortingSink<T> extends AbstractRefSortingSink<T> { + private T[] array; + private int offset; + + SizedRefSortingSink(Sink<? super T> sink, Comparator<? super T> comparator) { +- super(sink); +- this.comparator = comparator; ++ super(sink, comparator); + } + + @Override +@@ -301,8 +345,14 @@ + public void end() { + Arrays.sort(array, 0, offset, comparator); + downstream.begin(offset); +- for (int i = 0; i < offset; i++) +- downstream.accept(array[i]); ++ if (!cancellationWasRequested) { ++ for (int i = 0; i < offset; i++) ++ downstream.accept(array[i]); ++ } ++ else { ++ for (int i = 0; i < offset && !downstream.cancellationRequested(); i++) ++ downstream.accept(array[i]); ++ } + downstream.end(); + array = null; + } +@@ -316,13 +366,11 @@ + /** + * {@link Sink} for implementing sort on reference streams. + */ +- private static final class RefSortingSink<T> extends Sink.ChainedReference<T, T> { +- private final Comparator<? super T> comparator; ++ private static final class RefSortingSink<T> extends AbstractRefSortingSink<T> { + private ArrayList<T> list; + + RefSortingSink(Sink<? super T> sink, Comparator<? super T> comparator) { +- super(sink); +- this.comparator = comparator; ++ super(sink, comparator); + } + + @Override +@@ -336,7 +384,15 @@ + public void end() { + list.sort(comparator); + downstream.begin(list.size()); +- list.forEach(downstream::accept); ++ if (!cancellationWasRequested) { ++ list.forEach(downstream::accept); ++ } ++ else { ++ for (T t : list) { ++ if (downstream.cancellationRequested()) break; ++ downstream.accept(t); ++ } ++ } + downstream.end(); + list = null; + } +@@ -348,9 +404,26 @@ + } + + /** ++ * Abstract {@link Sink} for implementing sort on int streams. ++ */ ++ private static abstract class AbstractIntSortingSink extends Sink.ChainedInt<Integer> { ++ protected boolean cancellationWasRequested; ++ ++ AbstractIntSortingSink(Sink<? super Integer> downstream) { ++ super(downstream); ++ } ++ ++ @Override ++ public final boolean cancellationRequested() { ++ cancellationWasRequested = true; ++ return false; ++ } ++ } ++ ++ /** + * {@link Sink} for implementing sort on SIZED int streams. + */ +- private static final class SizedIntSortingSink extends Sink.ChainedInt<Integer> { ++ private static final class SizedIntSortingSink extends AbstractIntSortingSink { + private int[] array; + private int offset; + +@@ -369,8 +442,14 @@ + public void end() { + Arrays.sort(array, 0, offset); + downstream.begin(offset); +- for (int i = 0; i < offset; i++) +- downstream.accept(array[i]); ++ if (!cancellationWasRequested) { ++ for (int i = 0; i < offset; i++) ++ downstream.accept(array[i]); ++ } ++ else { ++ for (int i = 0; i < offset && !downstream.cancellationRequested(); i++) ++ downstream.accept(array[i]); ++ } + downstream.end(); + array = null; + } +@@ -384,7 +463,7 @@ + /** + * {@link Sink} for implementing sort on int streams. + */ +- private static final class IntSortingSink extends Sink.ChainedInt<Integer> { ++ private static final class IntSortingSink extends AbstractIntSortingSink { + private SpinedBuffer.OfInt b; + + IntSortingSink(Sink<? super Integer> sink) { +@@ -403,8 +482,16 @@ + int[] ints = b.asPrimitiveArray(); + Arrays.sort(ints); + downstream.begin(ints.length); +- for (int anInt : ints) +- downstream.accept(anInt); ++ if (!cancellationWasRequested) { ++ for (int anInt : ints) ++ downstream.accept(anInt); ++ } ++ else { ++ for (int anInt : ints) { ++ if (downstream.cancellationRequested()) break; ++ downstream.accept(anInt); ++ } ++ } + downstream.end(); + } + +@@ -415,9 +502,26 @@ + } + + /** ++ * Abstract {@link Sink} for implementing sort on long streams. ++ */ ++ private static abstract class AbstractLongSortingSink extends Sink.ChainedLong<Long> { ++ protected boolean cancellationWasRequested; ++ ++ AbstractLongSortingSink(Sink<? super Long> downstream) { ++ super(downstream); ++ } ++ ++ @Override ++ public final boolean cancellationRequested() { ++ cancellationWasRequested = true; ++ return false; ++ } ++ } ++ ++ /** + * {@link Sink} for implementing sort on SIZED long streams. + */ +- private static final class SizedLongSortingSink extends Sink.ChainedLong<Long> { ++ private static final class SizedLongSortingSink extends AbstractLongSortingSink { + private long[] array; + private int offset; + +@@ -436,8 +540,14 @@ + public void end() { + Arrays.sort(array, 0, offset); + downstream.begin(offset); +- for (int i = 0; i < offset; i++) +- downstream.accept(array[i]); ++ if (!cancellationWasRequested) { ++ for (int i = 0; i < offset; i++) ++ downstream.accept(array[i]); ++ } ++ else { ++ for (int i = 0; i < offset && !downstream.cancellationRequested(); i++) ++ downstream.accept(array[i]); ++ } + downstream.end(); + array = null; + } +@@ -451,7 +561,7 @@ + /** + * {@link Sink} for implementing sort on long streams. + */ +- private static final class LongSortingSink extends Sink.ChainedLong<Long> { ++ private static final class LongSortingSink extends AbstractLongSortingSink { + private SpinedBuffer.OfLong b; + + LongSortingSink(Sink<? super Long> sink) { +@@ -470,8 +580,16 @@ + long[] longs = b.asPrimitiveArray(); + Arrays.sort(longs); + downstream.begin(longs.length); +- for (long aLong : longs) +- downstream.accept(aLong); ++ if (!cancellationWasRequested) { ++ for (long aLong : longs) ++ downstream.accept(aLong); ++ } ++ else { ++ for (long aLong : longs) { ++ if (downstream.cancellationRequested()) break; ++ downstream.accept(aLong); ++ } ++ } + downstream.end(); + } + +@@ -482,9 +600,26 @@ + } + + /** ++ * Abstract {@link Sink} for implementing sort on long streams. ++ */ ++ private static abstract class AbstractDoubleSortingSink extends Sink.ChainedDouble<Double> { ++ protected boolean cancellationWasRequested; ++ ++ AbstractDoubleSortingSink(Sink<? super Double> downstream) { ++ super(downstream); ++ } ++ ++ @Override ++ public final boolean cancellationRequested() { ++ cancellationWasRequested = true; ++ return false; ++ } ++ } ++ ++ /** + * {@link Sink} for implementing sort on SIZED double streams. + */ +- private static final class SizedDoubleSortingSink extends Sink.ChainedDouble<Double> { ++ private static final class SizedDoubleSortingSink extends AbstractDoubleSortingSink { + private double[] array; + private int offset; + +@@ -503,8 +638,14 @@ + public void end() { + Arrays.sort(array, 0, offset); + downstream.begin(offset); +- for (int i = 0; i < offset; i++) +- downstream.accept(array[i]); ++ if (!cancellationWasRequested) { ++ for (int i = 0; i < offset; i++) ++ downstream.accept(array[i]); ++ } ++ else { ++ for (int i = 0; i < offset && !downstream.cancellationRequested(); i++) ++ downstream.accept(array[i]); ++ } + downstream.end(); + array = null; + } +@@ -518,7 +659,7 @@ + /** + * {@link Sink} for implementing sort on double streams. + */ +- private static final class DoubleSortingSink extends Sink.ChainedDouble<Double> { ++ private static final class DoubleSortingSink extends AbstractDoubleSortingSink { + private SpinedBuffer.OfDouble b; + + DoubleSortingSink(Sink<? super Double> sink) { +@@ -537,8 +678,16 @@ + double[] doubles = b.asPrimitiveArray(); + Arrays.sort(doubles); + downstream.begin(doubles.length); +- for (double aDouble : doubles) +- downstream.accept(aDouble); ++ if (!cancellationWasRequested) { ++ for (double aDouble : doubles) ++ downstream.accept(aDouble); ++ } ++ else { ++ for (double aDouble : doubles) { ++ if (downstream.cancellationRequested()) break; ++ downstream.accept(aDouble); ++ } ++ } + downstream.end(); + } + +--- ./jdk/src/share/classes/java/util/zip/ZipFile.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/zip/ZipFile.java Wed Jul 30 18:42:59 2014 +0100 +@@ -700,24 +700,26 @@ + } + + public int read(byte b[], int off, int len) throws IOException { +- if (rem == 0) { +- return -1; +- } +- if (len <= 0) { +- return 0; +- } +- if (len > rem) { +- len = (int) rem; +- } + synchronized (ZipFile.this) { ++ long rem = this.rem; ++ long pos = this.pos; ++ if (rem == 0) { ++ return -1; ++ } ++ if (len <= 0) { ++ return 0; ++ } ++ if (len > rem) { ++ len = (int) rem; ++ } ++ + ensureOpenOrZipException(); +- + len = ZipFile.read(ZipFile.this.jzfile, jzentry, pos, b, + off, len); +- } +- if (len > 0) { +- pos += len; +- rem -= len; ++ if (len > 0) { ++ this.pos = (pos + len); ++ this.rem = (rem - len); ++ } + } + if (rem == 0) { + close(); +--- ./jdk/src/share/classes/java/util/zip/ZipInputStream.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/java/util/zip/ZipInputStream.java Wed Jul 30 18:42:59 2014 +0100 +@@ -319,7 +319,8 @@ + if (len > 0) { + byte[] extra = new byte[len]; + readFully(extra, 0, len); +- e.setExtra0(extra, true); ++ e.setExtra0(extra, ++ e.csize == ZIP64_MAGICVAL || e.size == ZIP64_MAGICVAL); + } + return e; + } +--- ./jdk/src/share/classes/javax/accessibility/AccessibleContext.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/accessibility/AccessibleContext.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,6 +25,9 @@ + + package javax.accessibility; + ++import sun.awt.AWTAccessor; ++import sun.awt.AppContext; ++ + import java.util.Locale; + import java.beans.PropertyChangeListener; + import java.beans.PropertyChangeSupport; +@@ -79,6 +82,26 @@ + */ + public abstract class AccessibleContext { + ++ /** ++ * The AppContext that should be used to dispatch events for this ++ * AccessibleContext ++ */ ++ private volatile AppContext targetAppContext; ++ ++ static { ++ AWTAccessor.setAccessibleContextAccessor(new AWTAccessor.AccessibleContextAccessor() { ++ @Override ++ public void setAppContext(AccessibleContext accessibleContext, AppContext appContext) { ++ accessibleContext.targetAppContext = appContext; ++ } ++ ++ @Override ++ public AppContext getAppContext(AccessibleContext accessibleContext) { ++ return accessibleContext.targetAppContext; ++ } ++ }); ++ } ++ + /** + * Constant used to determine when the accessibleName property has + * changed. The old value in the PropertyChangeEvent will be the old +--- ./jdk/src/share/classes/javax/crypto/JceSecurity.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/crypto/JceSecurity.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2011, 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 +@@ -216,26 +216,28 @@ + new WeakHashMap<>(); + + /* +- * Retuns the CodeBase for the given class. ++ * Returns the CodeBase for the given class. + */ + static URL getCodeBase(final Class<?> clazz) { +- URL url = codeBaseCacheRef.get(clazz); +- if (url == null) { +- url = AccessController.doPrivileged(new PrivilegedAction<URL>() { +- public URL run() { +- ProtectionDomain pd = clazz.getProtectionDomain(); +- if (pd != null) { +- CodeSource cs = pd.getCodeSource(); +- if (cs != null) { +- return cs.getLocation(); ++ synchronized (codeBaseCacheRef) { ++ URL url = codeBaseCacheRef.get(clazz); ++ if (url == null) { ++ url = AccessController.doPrivileged(new PrivilegedAction<URL>() { ++ public URL run() { ++ ProtectionDomain pd = clazz.getProtectionDomain(); ++ if (pd != null) { ++ CodeSource cs = pd.getCodeSource(); ++ if (cs != null) { ++ return cs.getLocation(); ++ } + } ++ return NULL_URL; + } +- return NULL_URL; +- } +- }); +- codeBaseCacheRef.put(clazz, url); ++ }); ++ codeBaseCacheRef.put(clazz, url); ++ } ++ return (url == NULL_URL) ? null : url; + } +- return (url == NULL_URL) ? null : url; + } + + private static void setupJurisdictionPolicies() throws Exception { +--- ./jdk/src/share/classes/javax/sound/midi/spi/MidiDeviceProvider.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/sound/midi/spi/MidiDeviceProvider.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -26,26 +26,24 @@ + package javax.sound.midi.spi; + + import javax.sound.midi.MidiDevice; +-import javax.sound.midi.MidiUnavailableException; + + /** +- * A <code>MidiDeviceProvider</code> is a factory or provider for a particular +- * type of MIDI device. +- * This mechanism allows the implementation to determine +- * how resources are managed in the creation and management of +- * a device. ++ * A {@code MidiDeviceProvider} is a factory or provider for a particular type ++ * of MIDI device. This mechanism allows the implementation to determine how ++ * resources are managed in the creation and management of a device. + * + * @author Kara Kytle + */ + public abstract class MidiDeviceProvider { + +- + /** + * Indicates whether the device provider supports the device represented by + * the specified device info object. +- * @param info an info object that describes the device for which support is queried +- * @return <code>true</code> if the specified device is supported, +- * otherwise <code>false</code> ++ * ++ * @param info an info object that describes the device for which support ++ * is queried ++ * @return {@code true} if the specified device is supported, otherwise ++ * {@code false} + */ + public boolean isDeviceSupported(MidiDevice.Info info) { + +@@ -59,21 +57,22 @@ + return false; + } + +- + /** +- * Obtains the set of info objects representing the device +- * or devices provided by this <code>MidiDeviceProvider</code>. ++ * Obtains the set of info objects representing the device or devices ++ * provided by this {@code MidiDeviceProvider}. ++ * + * @return set of device info objects + */ + public abstract MidiDevice.Info[] getDeviceInfo(); + +- + /** + * Obtains an instance of the device represented by the info object. +- * @param info an info object that describes the desired device ++ * ++ * @param info an info object that describes the desired device + * @return device instance + * @throws IllegalArgumentException if the info object specified does not +- * match the info object for a device supported by this <code>MidiDeviceProvider</code>. ++ * match the info object for a device supported by this ++ * {@code MidiDeviceProvider} + */ + public abstract MidiDevice getDevice(MidiDevice.Info info); + } +--- ./jdk/src/share/classes/javax/sound/midi/spi/MidiFileReader.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/sound/midi/spi/MidiFileReader.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -35,9 +35,10 @@ + import javax.sound.midi.InvalidMidiDataException; + + /** +- * A <code>MidiFileReader</code> supplies MIDI file-reading services. Classes implementing this +- * interface can parse the format information from one or more types of +- * MIDI file, and can produce a <code>Sequence</code> object from files of these types. ++ * A {@code MidiFileReader} supplies MIDI file-reading services. Classes ++ * implementing this interface can parse the format information from one or more ++ * types of MIDI file, and can produce a {@link Sequence} object from files of ++ * these types. + * + * @author Kara Kytle + * @since 1.3 +@@ -45,98 +46,102 @@ + public abstract class MidiFileReader { + + /** +- * Obtains the MIDI file format of the input stream provided. The stream must +- * point to valid MIDI file data. In general, MIDI file readers may ++ * Obtains the MIDI file format of the input stream provided. The stream ++ * must point to valid MIDI file data. In general, MIDI file readers may + * need to read some data from the stream before determining whether they +- * support it. These parsers must +- * be able to mark the stream, read enough data to determine whether they +- * support the stream, and, if not, reset the stream's read pointer to its original +- * position. If the input stream does not support this, this method may fail +- * with an <code>IOException</code>. +- * @param stream the input stream from which file format information should be +- * extracted +- * @return a <code>MidiFileFormat</code> object describing the MIDI file format +- * @throws InvalidMidiDataException if the stream does not point to valid MIDI +- * file data recognized by the system ++ * support it. These parsers must be able to mark the stream, read enough ++ * data to determine whether they support the stream, and, if not, reset the ++ * stream's read pointer to its original position. If the input stream does ++ * not support this, this method may fail with an {@code IOException}. ++ * ++ * @param stream the input stream from which file format information ++ * should be extracted ++ * @return a {@code MidiFileFormat} object describing the MIDI file format ++ * @throws InvalidMidiDataException if the stream does not point to valid ++ * MIDI file data recognized by the system + * @throws IOException if an I/O exception occurs + * @see InputStream#markSupported + * @see InputStream#mark + */ +- public abstract MidiFileFormat getMidiFileFormat(InputStream stream) throws InvalidMidiDataException, IOException; +- ++ public abstract MidiFileFormat getMidiFileFormat(InputStream stream) ++ throws InvalidMidiDataException, IOException; + + /** +- * Obtains the MIDI file format of the URL provided. The URL must +- * point to valid MIDI file data. +- * @param url the URL from which file format information should be +- * extracted +- * @return a <code>MidiFileFormat</code> object describing the MIDI file format ++ * Obtains the MIDI file format of the URL provided. The URL must point to ++ * valid MIDI file data. ++ * ++ * @param url the URL from which file format information should be ++ * extracted ++ * @return a {@code MidiFileFormat} object describing the MIDI file format + * @throws InvalidMidiDataException if the URL does not point to valid MIDI +- * file data recognized by the system ++ * file data recognized by the system + * @throws IOException if an I/O exception occurs + */ +- public abstract MidiFileFormat getMidiFileFormat(URL url) throws InvalidMidiDataException, IOException; +- ++ public abstract MidiFileFormat getMidiFileFormat(URL url) ++ throws InvalidMidiDataException, IOException; + + /** +- * Obtains the MIDI file format of the <code>File</code> provided. +- * The <code>File</code> must point to valid MIDI file data. +- * @param file the <code>File</code> from which file format information should be +- * extracted +- * @return a <code>MidiFileFormat</code> object describing the MIDI file format +- * @throws InvalidMidiDataException if the <code>File</code> does not point to valid MIDI +- * file data recognized by the system ++ * Obtains the MIDI file format of the {@code File} provided. The ++ * {@code File} must point to valid MIDI file data. ++ * ++ * @param file the {@code File} from which file format information should ++ * be extracted ++ * @return a {@code MidiFileFormat} object describing the MIDI file format ++ * @throws InvalidMidiDataException if the {@code File} does not point to ++ * valid MIDI file data recognized by the system + * @throws IOException if an I/O exception occurs + */ +- public abstract MidiFileFormat getMidiFileFormat(File file) throws InvalidMidiDataException, IOException; +- ++ public abstract MidiFileFormat getMidiFileFormat(File file) ++ throws InvalidMidiDataException, IOException; + + /** +- * Obtains a MIDI sequence from the input stream provided. The stream must +- * point to valid MIDI file data. In general, MIDI file readers may +- * need to read some data from the stream before determining whether they +- * support it. These parsers must +- * be able to mark the stream, read enough data to determine whether they +- * support the stream, and, if not, reset the stream's read pointer to its original +- * position. If the input stream does not support this, this method may fail +- * with an IOException. +- * @param stream the input stream from which the <code>Sequence</code> should be +- * constructed +- * @return a <code>Sequence</code> object based on the MIDI file data contained +- * in the input stream. +- * @throws InvalidMidiDataException if the stream does not point to valid MIDI +- * file data recognized by the system ++ * Obtains a MIDI sequence from the input stream provided. The stream must ++ * point to valid MIDI file data. In general, MIDI file readers may need to ++ * read some data from the stream before determining whether they support ++ * it. These parsers must be able to mark the stream, read enough data to ++ * determine whether they support the stream, and, if not, reset the ++ * stream's read pointer to its original position. If the input stream does ++ * not support this, this method may fail with an IOException. ++ * ++ * @param stream the input stream from which the {@code Sequence} should ++ * be constructed ++ * @return a {@code Sequence} object based on the MIDI file data contained ++ * in the input stream. ++ * @throws InvalidMidiDataException if the stream does not point to valid ++ * MIDI file data recognized by the system + * @throws IOException if an I/O exception occurs + * @see InputStream#markSupported + * @see InputStream#mark + */ +- public abstract Sequence getSequence(InputStream stream) throws InvalidMidiDataException, IOException; +- ++ public abstract Sequence getSequence(InputStream stream) ++ throws InvalidMidiDataException, IOException; + + /** +- * Obtains a MIDI sequence from the URL provided. The URL must +- * point to valid MIDI file data. +- * @param url the URL for which the <code>Sequence</code> should be +- * constructed +- * @return a <code>Sequence</code> object based on the MIDI file data pointed +- * to by the URL ++ * Obtains a MIDI sequence from the URL provided. The URL must point to ++ * valid MIDI file data. ++ * ++ * @param url the URL for which the {@code Sequence} should be constructed ++ * @return a {@code Sequence} object based on the MIDI file data pointed to ++ * by the URL + * @throws InvalidMidiDataException if the URL does not point to valid MIDI +- * file data recognized by the system ++ * file data recognized by the system + * @throws IOException if an I/O exception occurs + */ +- public abstract Sequence getSequence(URL url) throws InvalidMidiDataException, IOException; +- ++ public abstract Sequence getSequence(URL url) ++ throws InvalidMidiDataException, IOException; + + /** +- * Obtains a MIDI sequence from the <code>File</code> provided. The <code>File</code> must +- * point to valid MIDI file data. +- * @param file the <code>File</code> from which the <code>Sequence</code> should be +- * constructed +- * @return a <code>Sequence</code> object based on the MIDI file data pointed +- * to by the <code>File</code> +- * @throws InvalidMidiDataException if the <code>File</code> does not point to valid MIDI +- * file data recognized by the system ++ * Obtains a MIDI sequence from the {@code File} provided. The {@code File} ++ * must point to valid MIDI file data. ++ * ++ * @param file the {@code File} from which the {@code Sequence} should be ++ * constructed ++ * @return a {@code Sequence} object based on the MIDI file data pointed to ++ * by the {@code File} ++ * @throws InvalidMidiDataException if the {@code File} does not point to ++ * valid MIDI file data recognized by the system + * @throws IOException if an I/O exception occurs + */ +- public abstract Sequence getSequence(File file) throws InvalidMidiDataException, IOException; ++ public abstract Sequence getSequence(File file) ++ throws InvalidMidiDataException, IOException; + } +--- ./jdk/src/share/classes/javax/sound/midi/spi/MidiFileWriter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/sound/midi/spi/MidiFileWriter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,45 +30,44 @@ + import java.io.OutputStream; + + import javax.sound.midi.Sequence; +-import javax.sound.midi.MidiFileFormat; + + /** +- * A <code>MidiFileWriter</code> supplies MIDI file-writing services. Classes +- * that implement this interface can write one or more types of MIDI file from +- * a <code>{@link Sequence}</code> object. ++ * A {@code MidiFileWriter} supplies MIDI file-writing services. Classes that ++ * implement this interface can write one or more types of MIDI file from a ++ * {@link Sequence} object. + * + * @author Kara Kytle + * @since 1.3 + */ + public abstract class MidiFileWriter { + +- + /** + * Obtains the set of MIDI file types for which file writing support is + * provided by this file writer. +- * @return array of file types. If no file types are supported, +- * an array of length 0 is returned. ++ * ++ * @return array of file types. If no file types are supported, an array of ++ * length 0 is returned. + */ + public abstract int[] getMidiFileTypes(); + +- + /** +- * Obtains the file types that this file writer can write from the +- * sequence specified. +- * @param sequence the sequence for which MIDI file type support +- * is queried +- * @return array of file types. If no file types are supported, +- * returns an array of length 0. ++ * Obtains the file types that this file writer can write from the sequence ++ * specified. ++ * ++ * @param sequence the sequence for which MIDI file type support is ++ * queried ++ * @return array of file types. If no file types are supported, returns an ++ * array of length 0. + */ + public abstract int[] getMidiFileTypes(Sequence sequence); + +- + /** + * Indicates whether file writing support for the specified MIDI file type + * is provided by this file writer. +- * @param fileType the file type for which write capabilities are queried +- * @return <code>true</code> if the file type is supported, +- * otherwise <code>false</code> ++ * ++ * @param fileType the file type for which write capabilities are queried ++ * @return {@code true} if the file type is supported, otherwise ++ * {@code false} + */ + public boolean isFileTypeSupported(int fileType) { + +@@ -81,14 +80,14 @@ + return false; + } + +- + /** + * Indicates whether a MIDI file of the file type specified can be written + * from the sequence indicated. +- * @param fileType the file type for which write capabilities are queried +- * @param sequence the sequence for which file writing support is queried +- * @return <code>true</code> if the file type is supported for this sequence, +- * otherwise <code>false</code> ++ * ++ * @param fileType the file type for which write capabilities are queried ++ * @param sequence the sequence for which file writing support is queried ++ * @return {@code true} if the file type is supported for this sequence, ++ * otherwise {@code false} + */ + public boolean isFileTypeSupported(int fileType, Sequence sequence) { + +@@ -101,35 +100,38 @@ + return false; + } + +- + /** + * Writes a stream of bytes representing a MIDI file of the file type + * indicated to the output stream provided. +- * @param in sequence containing MIDI data to be written to the file +- * @param fileType type of the file to be written to the output stream +- * @param out stream to which the file data should be written ++ * ++ * @param in sequence containing MIDI data to be written to the file ++ * @param fileType type of the file to be written to the output stream ++ * @param out stream to which the file data should be written + * @return the number of bytes written to the output stream + * @throws IOException if an I/O exception occurs + * @throws IllegalArgumentException if the file type is not supported by +- * this file writer ++ * this file writer + * @see #isFileTypeSupported(int, Sequence) +- * @see #getMidiFileTypes(Sequence) ++ * @see #getMidiFileTypes(Sequence) + */ +- public abstract int write(Sequence in, int fileType, OutputStream out) throws IOException; +- ++ public abstract int write(Sequence in, int fileType, OutputStream out) ++ throws IOException; + + /** + * Writes a stream of bytes representing a MIDI file of the file type + * indicated to the external file provided. +- * @param in sequence containing MIDI data to be written to the external file +- * @param fileType type of the file to be written to the external file +- * @param out external file to which the file data should be written ++ * ++ * @param in sequence containing MIDI data to be written to the external ++ * file ++ * @param fileType type of the file to be written to the external file ++ * @param out external file to which the file data should be written + * @return the number of bytes written to the file + * @throws IOException if an I/O exception occurs + * @throws IllegalArgumentException if the file type is not supported by +- * this file writer ++ * this file writer + * @see #isFileTypeSupported(int, Sequence) +- * @see #getMidiFileTypes(Sequence) ++ * @see #getMidiFileTypes(Sequence) + */ +- public abstract int write(Sequence in, int fileType, File out) throws IOException; ++ public abstract int write(Sequence in, int fileType, File out) ++ throws IOException; + } +--- ./jdk/src/share/classes/javax/sound/midi/spi/SoundbankReader.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/sound/midi/spi/SoundbankReader.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -25,60 +25,58 @@ + + package javax.sound.midi.spi; + ++import java.io.File; ++import java.io.IOException; + import java.io.InputStream; +-import java.io.IOException; +-import java.io.File; +- + import java.net.URL; + ++import javax.sound.midi.InvalidMidiDataException; + import javax.sound.midi.Soundbank; +-import javax.sound.midi.InvalidMidiDataException; +- + + /** +- * A <code>SoundbankReader</code> supplies soundbank file-reading services. +- * Concrete subclasses of <code>SoundbankReader</code> parse a given +- * soundbank file, producing a {@link javax.sound.midi.Soundbank} +- * object that can be loaded into a {@link javax.sound.midi.Synthesizer}. ++ * A {@code SoundbankReader} supplies soundbank file-reading services. Concrete ++ * subclasses of {@code SoundbankReader} parse a given soundbank file, producing ++ * a {@link javax.sound.midi.Soundbank} object that can be loaded into a ++ * {@link javax.sound.midi.Synthesizer}. + * + * @since 1.3 + * @author Kara Kytle + */ + public abstract class SoundbankReader { + ++ /** ++ * Obtains a soundbank object from the URL provided. ++ * ++ * @param url URL representing the soundbank. ++ * @return soundbank object ++ * @throws InvalidMidiDataException if the URL does not point to valid MIDI ++ * soundbank data recognized by this soundbank reader ++ * @throws IOException if an I/O error occurs ++ */ ++ public abstract Soundbank getSoundbank(URL url) ++ throws InvalidMidiDataException, IOException; + + /** +- * Obtains a soundbank object from the URL provided. +- * @param url URL representing the soundbank. ++ * Obtains a soundbank object from the {@code InputStream} provided. ++ * ++ * @param stream {@code InputStream} representing the soundbank + * @return soundbank object +- * @throws InvalidMidiDataException if the URL does not point to +- * valid MIDI soundbank data recognized by this soundbank reader ++ * @throws InvalidMidiDataException if the stream does not point to valid ++ * MIDI soundbank data recognized by this soundbank reader + * @throws IOException if an I/O error occurs + */ +- public abstract Soundbank getSoundbank(URL url) throws InvalidMidiDataException, IOException; +- ++ public abstract Soundbank getSoundbank(InputStream stream) ++ throws InvalidMidiDataException, IOException; + + /** +- * Obtains a soundbank object from the <code>InputStream</code> provided. +- * @param stream <code>InputStream</code> representing the soundbank ++ * Obtains a soundbank object from the {@code File} provided. ++ * ++ * @param file the {@code File} representing the soundbank + * @return soundbank object +- * @throws InvalidMidiDataException if the stream does not point to +- * valid MIDI soundbank data recognized by this soundbank reader ++ * @throws InvalidMidiDataException if the file does not point to valid MIDI ++ * soundbank data recognized by this soundbank reader + * @throws IOException if an I/O error occurs + */ +- public abstract Soundbank getSoundbank(InputStream stream) throws InvalidMidiDataException, IOException; +- +- +- /** +- * Obtains a soundbank object from the <code>File</code> provided. +- * @param file the <code>File</code> representing the soundbank +- * @return soundbank object +- * @throws InvalidMidiDataException if the file does not point to +- * valid MIDI soundbank data recognized by this soundbank reader +- * @throws IOException if an I/O error occurs +- */ +- public abstract Soundbank getSoundbank(File file) throws InvalidMidiDataException, IOException; +- +- +- ++ public abstract Soundbank getSoundbank(File file) ++ throws InvalidMidiDataException, IOException; + } +--- ./jdk/src/share/classes/javax/swing/DefaultDesktopManager.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/DefaultDesktopManager.java Wed Jul 30 18:42:59 2014 +0100 +@@ -677,6 +677,11 @@ + + f.setBounds(currentBounds); + ++ if (!floaterCollision) { ++ Rectangle r = currentBounds; ++ currentManager.notifyRepaintPerformed(parent, r.x, r.y, r.width, r.height); ++ } ++ + if(floaterCollision) { + // since we couldn't blit we just redraw as fast as possible + // the isDragging mucking is to avoid activating emergency +@@ -706,6 +711,8 @@ + // Fix the damage + for (int i = 0; i < dirtyRects.length; i++) { + parent.paintImmediately(dirtyRects[i]); ++ Rectangle r = dirtyRects[i]; ++ currentManager.notifyRepaintPerformed(parent, r.x, r.y, r.width, r.height); + } + + // new areas of blit were exposed +@@ -716,9 +723,10 @@ + dirtyRects[i].x += newX - previousBounds.x; + dirtyRects[i].y += newY - previousBounds.y; + ((JInternalFrame)f).isDragging = false; +- + parent.paintImmediately(dirtyRects[i]); + ((JInternalFrame)f).isDragging = true; ++ Rectangle r = dirtyRects[i]; ++ currentManager.notifyRepaintPerformed(parent, r.x, r.y, r.width, r.height); + } + + } +--- ./jdk/src/share/classes/javax/swing/JComboBox.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JComboBox.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1307,13 +1307,15 @@ + * do not call or override. + */ + public void actionPerformed(ActionEvent e) { +- Object newItem = getEditor().getItem(); +- setPopupVisible(false); +- getModel().setSelectedItem(newItem); +- String oldCommand = getActionCommand(); +- setActionCommand("comboBoxEdited"); +- fireActionEvent(); +- setActionCommand(oldCommand); ++ ComboBoxEditor editor = getEditor(); ++ if ((editor != null) && (e != null) && (editor == e.getSource())) { ++ setPopupVisible(false); ++ getModel().setSelectedItem(editor.getItem()); ++ String oldCommand = getActionCommand(); ++ setActionCommand("comboBoxEdited"); ++ fireActionEvent(); ++ setActionCommand(oldCommand); ++ } + } + + /** +@@ -1416,6 +1418,28 @@ + } + + /** ++ * {@inheritDoc} ++ */ ++ @Override ++ protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) { ++ if (super.processKeyBinding(ks, e, condition, pressed)) { ++ return true; ++ } ++ ++ if (!isEditable() || condition != WHEN_FOCUSED || getEditor() == null ++ || !Boolean.TRUE.equals(getClientProperty("JComboBox.isTableCellEditor"))) { ++ return false; ++ } ++ ++ Component editorComponent = getEditor().getEditorComponent(); ++ if (editorComponent instanceof JComponent) { ++ JComponent component = (JComponent) editorComponent; ++ return component.processKeyBinding(ks, e, WHEN_FOCUSED, pressed); ++ } ++ return false; ++ } ++ ++ /** + * Sets the object that translates a keyboard character into a list + * selection. Typically, the first selection with a matching first + * character becomes the selected item. +--- ./jdk/src/share/classes/javax/swing/JComponent.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JComponent.java Wed Jul 30 18:42:59 2014 +0100 +@@ -3676,8 +3676,8 @@ + private volatile transient int propertyListenersCount = 0; + + /** +- * This field duplicates the one in java.awt.Component.AccessibleAWTComponent, +- * so it has been deprecated. ++ * This field duplicates the function of the accessibleAWTFocusHandler field ++ * in java.awt.Component.AccessibleAWTComponent, so it has been deprecated. + */ + @Deprecated + protected FocusListener accessibleFocusHandler = null; +@@ -3735,14 +3735,10 @@ + * @param listener the PropertyChangeListener to be added + */ + public void addPropertyChangeListener(PropertyChangeListener listener) { +- if (accessibleFocusHandler == null) { +- accessibleFocusHandler = new AccessibleFocusHandler(); +- } + if (accessibleContainerHandler == null) { + accessibleContainerHandler = new AccessibleContainerHandler(); + } + if (propertyListenersCount++ == 0) { +- JComponent.this.addFocusListener(accessibleFocusHandler); + JComponent.this.addContainerListener(accessibleContainerHandler); + } + super.addPropertyChangeListener(listener); +@@ -3757,7 +3753,6 @@ + */ + public void removePropertyChangeListener(PropertyChangeListener listener) { + if (--propertyListenersCount == 0) { +- JComponent.this.removeFocusListener(accessibleFocusHandler); + JComponent.this.removeContainerListener(accessibleContainerHandler); + } + super.removePropertyChangeListener(listener); +@@ -3985,6 +3980,17 @@ + * @since 1.4 + */ + public AccessibleKeyBinding getAccessibleKeyBinding() { ++ // Try to get the linked label's mnemonic if it exists ++ Object o = getClientProperty(JLabel.LABELED_BY_PROPERTY); ++ if (o instanceof Accessible){ ++ AccessibleContext ac = ((Accessible) o).getAccessibleContext(); ++ if (ac != null){ ++ AccessibleComponent comp = ac.getAccessibleComponent(); ++ if (! (comp instanceof AccessibleExtendedComponent)) ++ return null; ++ return ((AccessibleExtendedComponent)comp).getAccessibleKeyBinding(); ++ } ++ } + return null; + } + } // inner class AccessibleJComponent +--- ./jdk/src/share/classes/javax/swing/JDialog.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JDialog.java Wed Jul 30 18:42:59 2014 +0100 +@@ -646,6 +646,7 @@ + enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.WINDOW_EVENT_MASK); + setLocale( JComponent.getDefaultLocale() ); + setRootPane(createRootPane()); ++ setBackground(UIManager.getColor("control")); + setRootPaneCheckingEnabled(true); + if (JDialog.isDefaultLookAndFeelDecorated()) { + boolean supportsWindowDecorations = +--- ./jdk/src/share/classes/javax/swing/JTable.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JTable.java Wed Jul 30 18:42:59 2014 +0100 +@@ -34,7 +34,6 @@ + + import java.beans.*; + +-import java.io.Serializable; + import java.io.ObjectOutputStream; + import java.io.ObjectInputStream; + import java.io.IOException; +@@ -58,7 +57,6 @@ + import sun.swing.SwingUtilities2.Section; + import static sun.swing.SwingUtilities2.Section.*; + import sun.swing.PrintingStatus; +-import sun.swing.SwingLazyValue; + + /** + * The <code>JTable</code> is used to display and edit regular two-dimensional tables +@@ -4043,7 +4041,7 @@ + } + // Restore the lead + int viewLeadIndex = modelSelection.getLeadSelectionIndex(); +- if (viewLeadIndex != -1) { ++ if (viewLeadIndex != -1 && !modelSelection.isSelectionEmpty()) { + viewLeadIndex = convertRowIndexToView(viewLeadIndex); + } + SwingUtilities2.setLeadAnchorWithoutSelection( +@@ -5307,14 +5305,6 @@ + return retValue; + } + +- private void setLazyValue(Hashtable h, Class c, String s) { +- h.put(c, new SwingLazyValue(s)); +- } +- +- private void setLazyRenderer(Class c, String s) { +- setLazyValue(defaultRenderersByColumnClass, c, s); +- } +- + /** + * Creates default cell renderers for objects, numbers, doubles, dates, + * booleans, and icons. +@@ -5325,24 +5315,24 @@ + defaultRenderersByColumnClass = new UIDefaults(8, 0.75f); + + // Objects +- setLazyRenderer(Object.class, "javax.swing.table.DefaultTableCellRenderer$UIResource"); ++ defaultRenderersByColumnClass.put(Object.class, (UIDefaults.LazyValue) t -> new DefaultTableCellRenderer.UIResource()); + + // Numbers +- setLazyRenderer(Number.class, "javax.swing.JTable$NumberRenderer"); ++ defaultRenderersByColumnClass.put(Number.class, (UIDefaults.LazyValue) t -> new NumberRenderer()); + + // Doubles and Floats +- setLazyRenderer(Float.class, "javax.swing.JTable$DoubleRenderer"); +- setLazyRenderer(Double.class, "javax.swing.JTable$DoubleRenderer"); ++ defaultRenderersByColumnClass.put(Float.class, (UIDefaults.LazyValue) t -> new DoubleRenderer()); ++ defaultRenderersByColumnClass.put(Double.class, (UIDefaults.LazyValue) t -> new DoubleRenderer()); + + // Dates +- setLazyRenderer(Date.class, "javax.swing.JTable$DateRenderer"); ++ defaultRenderersByColumnClass.put(Date.class, (UIDefaults.LazyValue) t -> new DateRenderer()); + + // Icons and ImageIcons +- setLazyRenderer(Icon.class, "javax.swing.JTable$IconRenderer"); +- setLazyRenderer(ImageIcon.class, "javax.swing.JTable$IconRenderer"); ++ defaultRenderersByColumnClass.put(Icon.class, (UIDefaults.LazyValue) t -> new IconRenderer()); ++ defaultRenderersByColumnClass.put(ImageIcon.class, (UIDefaults.LazyValue) t -> new IconRenderer()); + + // Booleans +- setLazyRenderer(Boolean.class, "javax.swing.JTable$BooleanRenderer"); ++ defaultRenderersByColumnClass.put(Boolean.class, (UIDefaults.LazyValue) t -> new BooleanRenderer()); + } + + /** +@@ -5420,10 +5410,6 @@ + } + } + +- private void setLazyEditor(Class c, String s) { +- setLazyValue(defaultEditorsByColumnClass, c, s); +- } +- + /** + * Creates default cell editors for objects, numbers, and boolean values. + * @see DefaultCellEditor +@@ -5432,13 +5418,13 @@ + defaultEditorsByColumnClass = new UIDefaults(3, 0.75f); + + // Objects +- setLazyEditor(Object.class, "javax.swing.JTable$GenericEditor"); ++ defaultEditorsByColumnClass.put(Object.class, (UIDefaults.LazyValue) t -> new GenericEditor()); + + // Numbers +- setLazyEditor(Number.class, "javax.swing.JTable$NumberEditor"); ++ defaultEditorsByColumnClass.put(Number.class, (UIDefaults.LazyValue) t -> new NumberEditor()); + + // Booleans +- setLazyEditor(Boolean.class, "javax.swing.JTable$BooleanEditor"); ++ defaultEditorsByColumnClass.put(Boolean.class, (UIDefaults.LazyValue) t -> new BooleanEditor()); + } + + /** +@@ -6588,8 +6574,8 @@ + TableColumnModelListener, CellEditorListener, PropertyChangeListener, + AccessibleExtendedTable { + +- int lastSelectedRow; +- int lastSelectedCol; ++ int previousFocusedRow; ++ int previousFocusedCol; + + /** + * AccessibleJTable constructor +@@ -6604,8 +6590,10 @@ + tcm.addColumnModelListener(this); + tcm.getSelectionModel().addListSelectionListener(this); + JTable.this.getModel().addTableModelListener(this); +- lastSelectedRow = JTable.this.getSelectedRow(); +- lastSelectedCol = JTable.this.getSelectedColumn(); ++ previousFocusedRow = JTable.this.getSelectionModel(). ++ getLeadSelectionIndex(); ++ previousFocusedCol = JTable.this.getColumnModel(). ++ getSelectionModel().getLeadSelectionIndex(); + } + + // Listeners to track model, etc. changes to as to re-place the other +@@ -6933,18 +6921,21 @@ + firePropertyChange(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY, + Boolean.valueOf(false), Boolean.valueOf(true)); + +- int selectedRow = JTable.this.getSelectedRow(); +- int selectedCol = JTable.this.getSelectedColumn(); +- if (selectedRow != lastSelectedRow || +- selectedCol != lastSelectedCol) { +- Accessible oldA = getAccessibleAt(lastSelectedRow, +- lastSelectedCol); +- Accessible newA = getAccessibleAt(selectedRow, selectedCol); ++ // Using lead selection index to cover both cases: node selected and node ++ // is focused but not selected (Ctrl+up/down) ++ int focusedRow = JTable.this.getSelectionModel().getLeadSelectionIndex(); ++ int focusedCol = JTable.this.getColumnModel().getSelectionModel(). ++ getLeadSelectionIndex(); ++ ++ if (focusedRow != previousFocusedRow || ++ focusedCol != previousFocusedCol) { ++ Accessible oldA = getAccessibleAt(previousFocusedRow, previousFocusedCol); ++ Accessible newA = getAccessibleAt(focusedRow, focusedCol); + firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, +- oldA, newA); +- lastSelectedRow = selectedRow; +- lastSelectedCol = selectedCol; +- } ++ oldA, newA); ++ previousFocusedRow = focusedRow; ++ previousFocusedCol = focusedCol; ++ } + } + + +--- ./jdk/src/share/classes/javax/swing/JTree.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JTree.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -1664,6 +1664,11 @@ + + leadPath = newPath; + firePropertyChange(LEAD_SELECTION_PATH_PROPERTY, oldValue, newPath); ++ ++ if (accessibleContext != null){ ++ ((AccessibleJTree)accessibleContext). ++ fireActiveDescendantPropertyChange(oldValue, newPath); ++ } + } + + /** +@@ -4129,23 +4134,6 @@ + * + */ + public void valueChanged(TreeSelectionEvent e) { +- // Fixes 4546503 - JTree is sending incorrect active +- // descendant events +- TreePath oldLeadSelectionPath = e.getOldLeadSelectionPath(); +- leadSelectionPath = e.getNewLeadSelectionPath(); +- +- if (oldLeadSelectionPath != leadSelectionPath) { +- // Set parent to null so AccessibleJTreeNode computes +- // its parent. +- Accessible oldLSA = leadSelectionAccessible; +- leadSelectionAccessible = (leadSelectionPath != null) +- ? new AccessibleJTreeNode(JTree.this, +- leadSelectionPath, +- null) // parent +- : null; +- firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, +- oldLSA, leadSelectionAccessible); +- } + firePropertyChange(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY, + Boolean.valueOf(false), Boolean.valueOf(true)); + } +@@ -4249,6 +4237,34 @@ + } + } + ++ /** ++ * Fire an active descendant property change notification. ++ * The active descendant is used for objects such as list, ++ * tree, and table, which may have transient children. ++ * It notifies screen readers the active child of the component ++ * has been changed so user can be notified from there. ++ * ++ * @param oldPath - lead path of previous active child ++ * @param newPath - lead path of current active child ++ * ++ */ ++ void fireActiveDescendantPropertyChange(TreePath oldPath, TreePath newPath){ ++ if(oldPath != newPath){ ++ Accessible oldLSA = (oldPath != null) ++ ? new AccessibleJTreeNode(JTree.this, ++ oldPath, ++ null) ++ : null; ++ ++ Accessible newLSA = (newPath != null) ++ ? new AccessibleJTreeNode(JTree.this, ++ newPath, ++ null) ++ : null; ++ firePropertyChange(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY, ++ oldLSA, newLSA); ++ } ++ } + + private AccessibleContext getCurrentAccessibleContext() { + Component c = getCurrentComponent(); +--- ./jdk/src/share/classes/javax/swing/JViewport.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/JViewport.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,8 +25,6 @@ + + package javax.swing; + +-import sun.swing.JLightweightFrame; +- + import java.awt.*; + import java.awt.event.*; + import java.awt.peer.ComponentPeer; +@@ -37,10 +35,8 @@ + import javax.swing.border.*; + import javax.accessibility.*; + +- + import java.io.Serializable; + +- + /** + * The "viewport" or "porthole" through which you see the underlying + * information. When you scroll, what moves is the viewport. It is like +@@ -363,18 +359,6 @@ + super.remove(child); + } + +- @Override +- public void addNotify() { +- super.addNotify(); +- // JLightweightFrame does not support BLIT_SCROLL_MODE, so it should be replaced +- Window rootWindow = SwingUtilities.getWindowAncestor(this); +- if (rootWindow instanceof JLightweightFrame +- && getScrollMode() == BLIT_SCROLL_MODE) { +- setScrollMode(BACKINGSTORE_SCROLL_MODE); +- } +- } +- +- + /** + * Scrolls the view so that <code>Rectangle</code> + * within the view becomes visible. +@@ -1108,13 +1092,15 @@ + Graphics g = JComponent.safelyGetGraphics(this); + flushViewDirtyRegion(g, dirty); + view.setLocation(newX, newY); +- g.setClip(0,0,getWidth(), Math.min(getHeight(), +- jview.getHeight())); ++ Rectangle r = new Rectangle( ++ 0, 0, getWidth(), Math.min(getHeight(), jview.getHeight())); ++ g.setClip(r); + // Repaint the complete component if the blit succeeded + // and needsRepaintAfterBlit returns true. + repaintAll = (windowBlitPaint(g) && + needsRepaintAfterBlit()); + g.dispose(); ++ rm.notifyRepaintPerformed(this, r.x, r.y, r.width, r.height); + rm.markCompletelyClean((JComponent)getParent()); + rm.markCompletelyClean(this); + rm.markCompletelyClean(jview); +--- ./jdk/src/share/classes/javax/swing/MenuSelectionManager.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/MenuSelectionManager.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2011, 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 +@@ -30,6 +30,7 @@ + import javax.swing.event.*; + + import sun.awt.AppContext; ++import sun.swing.SwingUtilities2; + + /** + * A MenuSelectionManager owns the selection in menu hierarchy. +@@ -60,6 +61,12 @@ + if (msm == null) { + msm = new MenuSelectionManager(); + context.put(MENU_SELECTION_MANAGER_KEY, msm); ++ ++ // installing additional listener if found in the AppContext ++ Object o = context.get(SwingUtilities2.MENU_SELECTION_MANAGER_LISTENER_KEY); ++ if (o != null && o instanceof ChangeListener) { ++ msm.addChangeListener((ChangeListener) o); ++ } + } + + return msm; +--- ./jdk/src/share/classes/javax/swing/PopupFactory.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/PopupFactory.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,10 +25,14 @@ + + package javax.swing; + ++import sun.awt.EmbeddedFrame; ++import sun.awt.OSInfo; ++ + import java.applet.Applet; + import java.awt.*; + import java.awt.event.WindowAdapter; + import java.awt.event.WindowEvent; ++import java.security.AccessController; + import java.util.ArrayList; + import java.util.HashMap; + import java.util.List; +@@ -226,7 +230,13 @@ + case MEDIUM_WEIGHT_POPUP: + return getMediumWeightPopup(owner, contents, ownerX, ownerY); + case HEAVY_WEIGHT_POPUP: +- return getHeavyWeightPopup(owner, contents, ownerX, ownerY); ++ Popup popup = getHeavyWeightPopup(owner, contents, ownerX, ownerY); ++ if ((AccessController.doPrivileged(OSInfo.getOSTypeAction()) == ++ OSInfo.OSType.MACOSX) && (owner != null) && ++ (EmbeddedFrame.getAppletIfAncestorOf(owner) != null)) { ++ ((HeavyWeightPopup)popup).setCacheEnabled(false); ++ } ++ return popup; + } + return null; + } +@@ -294,6 +304,8 @@ + private static final Object heavyWeightPopupCacheKey = + new StringBuffer("PopupFactory.heavyWeightPopupCache"); + ++ private volatile boolean isCacheEnabled = true; ++ + /** + * Returns either a new or recycled <code>Popup</code> containing + * the specified children. +@@ -448,12 +460,23 @@ + } + } + ++ /** ++ * Enables or disables cache for current object. ++ */ ++ void setCacheEnabled(boolean enable) { ++ isCacheEnabled = enable; ++ } ++ + // + // Popup methods + // + public void hide() { + super.hide(); +- recycleHeavyWeightPopup(this); ++ if (isCacheEnabled) { ++ recycleHeavyWeightPopup(this); ++ } else { ++ this._dispose(); ++ } + } + + /** +--- ./jdk/src/share/classes/javax/swing/RepaintManager.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/RepaintManager.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -45,6 +45,8 @@ + import sun.security.action.GetPropertyAction; + + import com.sun.java.swing.SwingUtilities3; ++import sun.swing.SwingAccessor; ++import sun.swing.SwingUtilities2.RepaintListener; + + /** + * This class manages repaint requests, allowing the number +@@ -184,6 +186,17 @@ + + + static { ++ SwingAccessor.setRepaintManagerAccessor(new SwingAccessor.RepaintManagerAccessor() { ++ @Override ++ public void addRepaintListener(RepaintManager rm, RepaintListener l) { ++ rm.addRepaintListener(l); ++ } ++ @Override ++ public void removeRepaintListener(RepaintManager rm, RepaintListener l) { ++ rm.removeRepaintListener(l); ++ } ++ }); ++ + volatileImageBufferEnabled = "true".equals(AccessController. + doPrivileged(new GetPropertyAction( + "swing.volatileImageBufferEnabled", "true"))); +@@ -1267,6 +1280,33 @@ + getPaintManager().copyArea(c, g, x, y, w, h, deltaX, deltaY, clip); + } + ++ private java.util.List<RepaintListener> repaintListeners = new ArrayList<>(1); ++ ++ private void addRepaintListener(RepaintListener l) { ++ repaintListeners.add(l); ++ } ++ ++ private void removeRepaintListener(RepaintListener l) { ++ repaintListeners.remove(l); ++ } ++ ++ /** ++ * Notify the attached repaint listeners that an area of the {@code c} component ++ * has been immediately repainted, that is without scheduling a repaint runnable, ++ * due to performing a "blit" (via calling the {@code copyArea} method). ++ * ++ * @param c the component ++ * @param x the x coordinate of the area ++ * @param y the y coordinate of the area ++ * @param w the width of the area ++ * @param h the height of the area ++ */ ++ void notifyRepaintPerformed(JComponent c, int x, int y, int w, int h) { ++ for (RepaintListener l : repaintListeners) { ++ l.repaintPerformed(c, x, y, w, h); ++ } ++ } ++ + /** + * Invoked prior to any paint/copyArea method calls. This will + * be followed by an invocation of <code>endPaint</code>. +--- ./jdk/src/share/classes/javax/swing/border/LineBorder.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/border/LineBorder.java Wed Jul 30 18:42:59 2014 +0100 +@@ -133,8 +133,8 @@ + int offs = this.thickness; + int size = offs + offs; + if (this.roundedCorners) { +- int arc = offs + size; +- outer = new RoundRectangle2D.Float(x, y, width, height, arc, arc); ++ float arc = .2f * offs; ++ outer = new RoundRectangle2D.Float(x, y, width, height, offs, offs); + inner = new RoundRectangle2D.Float(x + offs, y + offs, width - size, height - size, arc, arc); + } + else { +--- ./jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxEditor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -32,6 +32,8 @@ + + import java.lang.reflect.Method; + ++import sun.reflect.misc.MethodUtil; ++ + /** + * The default editor for editable combo boxes. The editor is implemented as a JTextField. + * +@@ -98,8 +100,8 @@ + // Must take the value from the editor and get the value and cast it to the new type. + Class<?> cls = oldValue.getClass(); + try { +- Method method = cls.getMethod("valueOf", new Class[]{String.class}); +- newValue = method.invoke(oldValue, new Object[] { editor.getText()}); ++ Method method = MethodUtil.getMethod(cls, "valueOf", new Class[]{String.class}); ++ newValue = MethodUtil.invoke(method, oldValue, new Object[] { editor.getText()}); + } catch (Exception ex) { + // Fail silently and return the newValue (a String object) + } +--- ./jdk/src/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java Wed Jul 30 18:42:59 2014 +0100 +@@ -379,15 +379,11 @@ + InternalFrameEvent e = new InternalFrameEvent( + frame, InternalFrameEvent.INTERNAL_FRAME_CLOSING); + // Try posting event, unless there's a SecurityManager. +- if (JInternalFrame.class.getClassLoader() == null) { +- try { +- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(e); +- return; +- } catch (SecurityException se) { +- // Use dispatchEvent instead. +- } ++ try { ++ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(e); ++ } catch (SecurityException se) { ++ frame.dispatchEvent(e); + } +- frame.dispatchEvent(e); + } + + +--- ./jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollBarUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -37,6 +37,10 @@ + import javax.swing.event.*; + import javax.swing.plaf.*; + ++import static sun.swing.SwingUtilities2.drawHLine; ++import static sun.swing.SwingUtilities2.drawRect; ++import static sun.swing.SwingUtilities2.drawVLine; ++ + + /** + * Implementation of ScrollBarUI for the Basic Look and Feel +@@ -572,17 +576,17 @@ + g.translate(thumbBounds.x, thumbBounds.y); + + g.setColor(thumbDarkShadowColor); +- g.drawRect(0, 0, w-1, h-1); ++ drawRect(g, 0, 0, w - 1, h - 1); + g.setColor(thumbColor); +- g.fillRect(0, 0, w-1, h-1); ++ g.fillRect(0, 0, w - 1, h - 1); + + g.setColor(thumbHighlightColor); +- g.drawLine(1, 1, 1, h-2); +- g.drawLine(2, 1, w-3, 1); ++ drawVLine(g, 1, 1, h - 2); ++ drawHLine(g, 2, w - 3, 1); + + g.setColor(thumbLightShadowColor); +- g.drawLine(2, h-2, w-2, h-2); +- g.drawLine(w-2, 1, w-2, h-3); ++ drawHLine(g, 2, w - 2, h - 2); ++ drawVLine(g, w - 2, 1, h - 3); + + g.translate(-thumbBounds.x, -thumbBounds.y); + } +--- ./jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Wed Jul 30 18:42:59 2014 +0100 +@@ -32,15 +32,13 @@ + import javax.swing.*; + import javax.swing.plaf.basic.*; + import javax.swing.text.DefaultEditorKit; ++import javax.swing.UIDefaults.LazyValue; + + import java.awt.Color; +-import java.awt.event.KeyEvent; +-import java.lang.reflect.*; + import java.lang.ref.ReferenceQueue; + import java.lang.ref.WeakReference; + + import java.security.AccessController; +-import java.security.PrivilegedAction; + + import sun.awt.*; + import sun.security.action.GetPropertyAction; +@@ -460,11 +458,9 @@ + new SwingLazyValue("javax.swing.plaf.metal.MetalBorders", + "getTextFieldBorder"); + +- Object dialogBorder = new MetalLazyValue( +- "javax.swing.plaf.metal.MetalBorders$DialogBorder"); ++ LazyValue dialogBorder = t -> new MetalBorders.DialogBorder(); + +- Object questionDialogBorder = new MetalLazyValue( +- "javax.swing.plaf.metal.MetalBorders$QuestionDialogBorder"); ++ LazyValue questionDialogBorder = t -> new MetalBorders.QuestionDialogBorder(); + + Object fieldInputMap = new UIDefaults.LazyInputMap(new Object[] { + "ctrl C", DefaultEditorKit.copyAction, +@@ -1494,12 +1490,8 @@ + "ToolBar.floatingBackground", menuBackground, + "ToolBar.dockingForeground", primaryControlDarkShadow, + "ToolBar.floatingForeground", primaryControl, +- "ToolBar.rolloverBorder", new MetalLazyValue( +- "javax.swing.plaf.metal.MetalBorders", +- "getToolBarRolloverBorder"), +- "ToolBar.nonrolloverBorder", new MetalLazyValue( +- "javax.swing.plaf.metal.MetalBorders", +- "getToolBarNonrolloverBorder"), ++ "ToolBar.rolloverBorder", (LazyValue) t -> MetalBorders.getToolBarRolloverBorder(), ++ "ToolBar.nonrolloverBorder", (LazyValue) t -> MetalBorders.getToolBarNonrolloverBorder(), + "ToolBar.ancestorInputMap", + new UIDefaults.LazyInputMap(new Object[] { + "UP", "navigateUp", +@@ -1513,17 +1505,14 @@ + }), + + // RootPane +- "RootPane.frameBorder", new MetalLazyValue( +- "javax.swing.plaf.metal.MetalBorders$FrameBorder"), ++ "RootPane.frameBorder", (LazyValue) t -> new MetalBorders.FrameBorder(), + "RootPane.plainDialogBorder", dialogBorder, + "RootPane.informationDialogBorder", dialogBorder, +- "RootPane.errorDialogBorder", new MetalLazyValue( +- "javax.swing.plaf.metal.MetalBorders$ErrorDialogBorder"), ++ "RootPane.errorDialogBorder", (LazyValue) t -> new MetalBorders.ErrorDialogBorder(), + "RootPane.colorChooserDialogBorder", questionDialogBorder, + "RootPane.fileChooserDialogBorder", questionDialogBorder, + "RootPane.questionDialogBorder", questionDialogBorder, +- "RootPane.warningDialogBorder", new MetalLazyValue( +- "javax.swing.plaf.metal.MetalBorders$WarningDialogBorder"), ++ "RootPane.warningDialogBorder", (LazyValue) t -> new MetalBorders.WarningDialogBorder(), + // These bindings are only enabled when there is a default + // button set on the rootpane. + "RootPane.defaultButtonWindowKeyBindings", new Object[] { +@@ -2175,61 +2164,6 @@ + + + /** +- * MetalLazyValue is a slimmed down version of <code>ProxyLaxyValue</code>. +- * The code is duplicate so that it can get at the package private +- * classes in metal. +- */ +- private static class MetalLazyValue implements UIDefaults.LazyValue { +- /** +- * Name of the class to create. +- */ +- private String className; +- private String methodName; +- +- MetalLazyValue(String name) { +- this.className = name; +- } +- +- MetalLazyValue(String name, String methodName) { +- this(name); +- this.methodName = methodName; +- } +- +- public Object createValue(UIDefaults table) { +- try { +- final Class c = Class.forName(className); +- +- if (methodName == null) { +- return c.newInstance(); +- } +- Method method = AccessController.doPrivileged( +- new PrivilegedAction<Method>() { +- public Method run() { +- Method[] methods = c.getDeclaredMethods(); +- for (int counter = methods.length - 1; counter >= 0; +- counter--) { +- if (methods[counter].getName().equals(methodName)){ +- methods[counter].setAccessible(true); +- return methods[counter]; +- } +- } +- return null; +- } +- }); +- if (method != null) { +- return method.invoke(null, (Object[])null); +- } +- } catch (ClassNotFoundException cnfe) { +- } catch (InstantiationException ie) { +- } catch (IllegalAccessException iae) { +- } catch (InvocationTargetException ite) { +- } +- return null; +- } +- } +- +- +- /** + * FontActiveValue redirects to the appropriate metal theme method. + */ + private static class FontActiveValue implements UIDefaults.ActiveValue { +--- ./jdk/src/share/classes/javax/swing/plaf/metal/MetalScrollBarUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/metal/MetalScrollBarUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2004, 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 +@@ -25,33 +25,23 @@ + + package javax.swing.plaf.metal; + +-import java.awt.Component; +-import java.awt.Container; +-import java.awt.LayoutManager; +-import java.awt.Adjustable; +-import java.awt.event.AdjustmentListener; +-import java.awt.event.AdjustmentEvent; +-import java.awt.event.ActionListener; +-import java.awt.event.ActionEvent; +-import java.awt.event.MouseListener; +-import java.awt.event.MouseMotionListener; +-import java.awt.event.MouseAdapter; +-import java.awt.event.MouseEvent; ++import java.awt.Color; ++import java.awt.Dimension; + import java.awt.Graphics; +-import java.awt.Dimension; + import java.awt.Rectangle; +-import java.awt.Point; +-import java.awt.Insets; +-import java.awt.Color; +-import java.awt.IllegalComponentStateException; ++import java.beans.PropertyChangeEvent; ++import java.beans.PropertyChangeListener; + +-import java.beans.*; ++import javax.swing.JButton; ++import javax.swing.JComponent; ++import javax.swing.JScrollBar; ++import javax.swing.UIManager; ++import javax.swing.plaf.ComponentUI; ++import javax.swing.plaf.basic.BasicScrollBarUI; + +-import javax.swing.*; +-import javax.swing.event.*; +- +-import javax.swing.plaf.*; +-import javax.swing.plaf.basic.BasicScrollBarUI; ++import static sun.swing.SwingUtilities2.drawHLine; ++import static sun.swing.SwingUtilities2.drawRect; ++import static sun.swing.SwingUtilities2.drawVLine; + + + /** +@@ -159,21 +149,21 @@ + + if ( c.isEnabled() ) { + g.setColor( darkShadowColor ); +- g.drawLine( 0, 0, 0, trackBounds.height - 1 ); +- g.drawLine( trackBounds.width - 2, 0, trackBounds.width - 2, trackBounds.height - 1 ); +- g.drawLine( 2, trackBounds.height - 1, trackBounds.width - 1, trackBounds.height - 1); +- g.drawLine( 2, 0, trackBounds.width - 2, 0 ); ++ drawVLine(g, 0, 0, trackBounds.height - 1); ++ drawVLine(g, trackBounds.width - 2, 0, trackBounds.height - 1); ++ drawHLine(g, 2, trackBounds.width - 1, trackBounds.height - 1); ++ drawHLine(g, 2, trackBounds.width - 2, 0); + + g.setColor( shadowColor ); + // g.setColor( Color.red); +- g.drawLine( 1, 1, 1, trackBounds.height - 2 ); +- g.drawLine( 1, 1, trackBounds.width - 3, 1 ); ++ drawVLine(g, 1, 1, trackBounds.height - 2); ++ drawHLine(g, 1, trackBounds.width - 3, 1); + if (scrollbar.getValue() != scrollbar.getMaximum()) { // thumb shadow + int y = thumbRect.y + thumbRect.height - trackBounds.y; +- g.drawLine( 1, y, trackBounds.width-1, y); ++ drawHLine(g, 1, trackBounds.width - 1, y); + } + g.setColor(highlightColor); +- g.drawLine( trackBounds.width - 1, 0, trackBounds.width - 1, trackBounds.height - 1 ); ++ drawVLine(g, trackBounds.width - 1, 0, trackBounds.height - 1); + } else { + MetalUtils.drawDisabledBorder(g, 0, 0, trackBounds.width, trackBounds.height ); + } +@@ -193,19 +183,19 @@ + + if ( c.isEnabled() ) { + g.setColor( darkShadowColor ); +- g.drawLine( 0, 0, trackBounds.width - 1, 0 ); // top +- g.drawLine( 0, 2, 0, trackBounds.height - 2 ); // left +- g.drawLine( 0, trackBounds.height - 2, trackBounds.width - 1, trackBounds.height - 2 ); // bottom +- g.drawLine( trackBounds.width - 1, 2, trackBounds.width - 1, trackBounds.height - 1 ); // right ++ drawHLine(g, 0, trackBounds.width - 1, 0); // top ++ drawVLine(g, 0, 2, trackBounds.height - 2); // left ++ drawHLine(g, 0, trackBounds.width - 1, trackBounds.height - 2 ); // bottom ++ drawVLine(g, trackBounds.width - 1, 2, trackBounds.height - 1 ); // right + + g.setColor( shadowColor ); + // g.setColor( Color.red); +- g.drawLine( 1, 1, trackBounds.width - 2, 1 ); // top +- g.drawLine( 1, 1, 1, trackBounds.height - 3 ); // left +- g.drawLine( 0, trackBounds.height - 1, trackBounds.width - 1, trackBounds.height - 1 ); // bottom ++ drawHLine(g, 1, trackBounds.width - 2, 1 ); // top ++ drawVLine(g, 1, 1, trackBounds.height - 3 ); // left ++ drawHLine(g, 0, trackBounds.width - 1, trackBounds.height - 1 ); // bottom + if (scrollbar.getValue() != scrollbar.getMaximum()) { // thumb shadow + int x = thumbRect.x + thumbRect.width - trackBounds.x; +- g.drawLine( x, 1, x, trackBounds.height-1); ++ drawVLine(g, x, 1, trackBounds.height-1); + } + } else { + MetalUtils.drawDisabledBorder(g, 0, 0, trackBounds.width, trackBounds.height ); +@@ -247,11 +237,11 @@ + g.fillRect( 0, 0, thumbBounds.width - 2, thumbBounds.height - 1 ); + + g.setColor( thumbShadow ); +- g.drawRect( 0, 0, thumbBounds.width - 2, thumbBounds.height - 1 ); ++ drawRect(g, 0, 0, thumbBounds.width - 2, thumbBounds.height - 1); + + g.setColor( thumbHighlightColor ); +- g.drawLine( 1, 1, thumbBounds.width - 3, 1 ); +- g.drawLine( 1, 1, 1, thumbBounds.height - 2 ); ++ drawHLine(g, 1, thumbBounds.width - 3, 1); ++ drawVLine(g, 1, 1, thumbBounds.height - 2); + + bumps.setBumpArea( thumbBounds.width - 6, thumbBounds.height - 7 ); + bumps.paintIcon( c, g, 3, 4 ); +@@ -273,11 +263,11 @@ + g.fillRect( 0, 0, thumbBounds.width - 1, thumbBounds.height - 2 ); + + g.setColor( thumbShadow ); +- g.drawRect( 0, 0, thumbBounds.width - 1, thumbBounds.height - 2 ); ++ drawRect(g, 0, 0, thumbBounds.width - 1, thumbBounds.height - 2); + + g.setColor( thumbHighlightColor ); +- g.drawLine( 1, 1, thumbBounds.width - 3, 1 ); +- g.drawLine( 1, 1, 1, thumbBounds.height - 3 ); ++ drawHLine(g, 1, thumbBounds.width - 3, 1); ++ drawVLine(g, 1, 1, thumbBounds.height - 3); + + bumps.setBumpArea( thumbBounds.width - 7, thumbBounds.height - 6 ); + bumps.paintIcon( c, g, 4, 3 ); +@@ -310,11 +300,11 @@ + } + + g.setColor(thumbShadow); +- g.drawRect(0, 0, thumbBounds.width - 2, thumbBounds.height - 1); ++ drawRect(g, 0, 0, thumbBounds.width - 2, thumbBounds.height - 1); + + g.setColor(thumbHighlightColor); +- g.drawLine(1, 1, thumbBounds.width - 3, 1); +- g.drawLine(1, 1, 1, thumbBounds.height - 2); ++ drawHLine(g, 1, thumbBounds.width - 3, 1); ++ drawVLine(g, 1, 1, thumbBounds.height - 2); + + MetalUtils.drawGradient(c, g, "ScrollBar.gradient", 2, 2, + thumbBounds.width - 4, +@@ -352,11 +342,11 @@ + } + + g.setColor(thumbShadow); +- g.drawRect(0, 0, thumbBounds.width - 1, thumbBounds.height - 2); ++ drawRect(g, 0, 0, thumbBounds.width - 1, thumbBounds.height - 2); + + g.setColor(thumbHighlightColor); +- g.drawLine(1, 1, thumbBounds.width - 2, 1); +- g.drawLine(1, 1, 1, thumbBounds.height - 3); ++ drawHLine(g, 1, thumbBounds.width - 2, 1); ++ drawVLine(g, 1, 1, thumbBounds.height - 3); + + MetalUtils.drawGradient(c, g, "ScrollBar.gradient", 2, 2, + thumbBounds.width - 3, +--- ./jdk/src/share/classes/javax/swing/plaf/metal/MetalTabbedPaneUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/metal/MetalTabbedPaneUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -806,9 +806,8 @@ + + // Paint the background for the tab area + if ( tabPane.isOpaque() ) { +- Color bg = UIManager.getColor("TabbedPane.tabAreaBackground"); +- if (bg != null) { +- g.setColor(bg); ++ if (!c.isBackgroundSet() && (tabAreaBackground != null)) { ++ g.setColor(tabAreaBackground); + } + else { + g.setColor( c.getBackground() ); +--- ./jdk/src/share/classes/javax/swing/plaf/nimbus/AbstractRegionPainter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/nimbus/AbstractRegionPainter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -31,6 +31,7 @@ + import javax.swing.plaf.UIResource; + import javax.swing.Painter; + import java.awt.print.PrinterGraphics; ++import sun.reflect.misc.MethodUtil; + + /** + * Convenient base class for defining Painter instances for rendering a +@@ -445,8 +446,8 @@ + } else { + String s = "get" + Character.toUpperCase(property.charAt(0)) + property.substring(1); + try { +- Method method = c.getClass().getMethod(s); +- color = (Color) method.invoke(c); ++ Method method = MethodUtil.getMethod(c.getClass(), s, null); ++ color = (Color) MethodUtil.invoke(method, c, null); + } catch (Exception e) { + //don't do anything, it just didn't work, that's all. + //This could be a normal occurance if you use a property +--- ./jdk/src/share/classes/javax/swing/plaf/nimbus/skin.laf Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/nimbus/skin.laf Wed Jul 30 18:42:59 2014 +0100 +@@ -1,7 +1,7 @@ + <?xml version="1.0" encoding="UTF-8"?> + + <!-- +- Copyright (c) 1998, 2010, 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 +@@ -13424,10 +13424,10 @@ + <state stateKeys="Selected"> + <style> + <textForeground> +- <matte red="255" green="255" blue="255" alpha="255" uiDefaultParentName="nimbusLightBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="255" green="255" blue="255" alpha="255" uiDefaultParentName="nimbusLightBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </textForeground> + <textBackground> +- <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </textBackground> + <background/> + <inherit-textForeground>false</inherit-textForeground> +@@ -13453,7 +13453,7 @@ + <style> + <textForeground/> + <textBackground> +- <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </textBackground> + <background/> + <inherit-textBackground>false</inherit-textBackground> +@@ -13477,7 +13477,7 @@ + <state stateKeys="Disabled"> + <style> + <textForeground> +- <matte red="142" green="143" blue="145" alpha="255" uiDefaultParentName="nimbusDisabledText" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="142" green="143" blue="145" alpha="255" uiDefaultParentName="nimbusDisabledText" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </textForeground> + <textBackground/> + <background/> +@@ -13520,7 +13520,7 @@ + </textForeground> + <textBackground/> + <background> +- <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0" uiResource="false"/> ++ <matte red="57" green="105" blue="138" alpha="255" uiDefaultParentName="nimbusSelectionBackground" hueOffset="0.0" saturationOffset="0.0" brightnessOffset="0.0" alphaOffset="0"/> + </background> + <inherit-textForeground>false</inherit-textForeground> + <inherit-background>false</inherit-background> +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -138,9 +138,7 @@ + } + + SynthContext getContext(JComponent c, int state) { +- Region region = SynthLookAndFeel.getRegion(c); +- return SynthContext.getContext(SynthContext.class, c, region, +- style, state); ++ return SynthContext.getContext(c, style, state); + } + + /** +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -128,8 +128,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -208,8 +208,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthContext.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthContext.java Wed Jul 30 18:42:59 2014 +0100 +@@ -24,8 +24,9 @@ + */ + package javax.swing.plaf.synth; + +-import javax.swing.*; +-import java.util.*; ++import java.util.Queue; ++import java.util.concurrent.ConcurrentLinkedQueue; ++import javax.swing.JComponent; + + /** + * An immutable transient object containing contextual information about +@@ -39,59 +40,32 @@ + * @author Scott Violet + */ + public class SynthContext { +- private static final Map<Class, List<SynthContext>> contextMap; ++ private static final Queue<SynthContext> queue = new ConcurrentLinkedQueue<>(); + + private JComponent component; + private Region region; + private SynthStyle style; + private int state; + +- +- static { +- contextMap = new HashMap<Class, List<SynthContext>>(); ++ static SynthContext getContext(JComponent c, SynthStyle style, int state) { ++ return getContext(c, SynthLookAndFeel.getRegion(c), style, state); + } + +- +- static SynthContext getContext(Class type, JComponent component, ++ static SynthContext getContext(JComponent component, + Region region, SynthStyle style, + int state) { +- SynthContext context = null; +- +- synchronized(contextMap) { +- List<SynthContext> instances = contextMap.get(type); +- +- if (instances != null) { +- int size = instances.size(); +- +- if (size > 0) { +- context = instances.remove(size - 1); +- } +- } +- } ++ SynthContext context = queue.poll(); + if (context == null) { +- try { +- context = (SynthContext)type.newInstance(); +- } catch (IllegalAccessException iae) { +- } catch (InstantiationException ie) { +- } ++ context = new SynthContext(); + } + context.reset(component, region, style, state); + return context; + } + + static void releaseContext(SynthContext context) { +- synchronized(contextMap) { +- List<SynthContext> instances = contextMap.get(context.getClass()); +- +- if (instances == null) { +- instances = new ArrayList<SynthContext>(5); +- contextMap.put(context.getClass(), instances); +- } +- instances.add(context); +- } ++ queue.offer(context); + } + +- + SynthContext() { + } + +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -142,9 +142,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- Region region = SynthLookAndFeel.getRegion(c); +- return SynthContext.getContext(SynthContext.class, c, region, +- style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -430,8 +430,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -139,8 +139,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameTitlePane.java Wed Jul 30 18:42:59 2014 +0100 +@@ -67,8 +67,7 @@ + } + + public SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private Region getRegion(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -141,8 +141,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -91,8 +91,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -188,8 +188,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -116,8 +116,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -170,8 +170,7 @@ + } + + SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + SynthContext getContext(JComponent c, Region region) { +@@ -179,8 +178,7 @@ + } + + private SynthContext getContext(JComponent c, Region region, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- region, accStyle, state); ++ return SynthContext.getContext(c, region, accStyle, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -170,9 +170,7 @@ + } + + SynthContext getContext(JComponent c, int state) { +- Region region = SynthLookAndFeel.getRegion(c); +- return SynthContext.getContext(SynthContext.class, c, region, +- style, state); ++ return SynthContext.getContext(c, style, state); + } + + SynthContext getContext(JComponent c, Region region) { +@@ -180,8 +178,7 @@ + } + + private SynthContext getContext(JComponent c, Region region, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- region, accStyle, state); ++ return SynthContext.getContext(c, region, accStyle, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -140,8 +140,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -127,8 +127,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthParser.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthParser.java Wed Jul 30 18:42:59 2014 +0100 +@@ -67,6 +67,7 @@ + import org.xml.sax.helpers.DefaultHandler; + + import com.sun.beans.decoder.DocumentHandler; ++import sun.reflect.misc.ReflectUtil; + + class SynthParser extends DefaultHandler { + // +@@ -648,7 +649,7 @@ + } + else { + try { +- typeClass = Class.forName(typeName.substring( ++ typeClass = ReflectUtil.forName(typeName.substring( + 0, classIndex)); + } catch (ClassNotFoundException cnfe) { + throw new SAXException("Unknown class: " + +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -123,8 +123,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -138,8 +138,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthRootPaneUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthRootPaneUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -80,8 +80,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -185,8 +185,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private SynthContext getContext(JComponent c, Region region) { +@@ -199,8 +198,7 @@ + if (region == Region.SCROLL_BAR_THUMB) { + style = thumbStyle; + } +- return SynthContext.getContext(SynthContext.class, c, region, style, +- state); ++ return SynthContext.getContext(c, region, style, state); + } + + private int getComponentState(JComponent c, Region region) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -211,8 +211,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -248,8 +248,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + public void propertyChange(PropertyChangeEvent evt) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -722,8 +722,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private SynthContext getContext(JComponent c, Region subregion) { +@@ -732,14 +731,13 @@ + + private SynthContext getContext(JComponent c, Region subregion, int state) { + SynthStyle style = null; +- Class klass = SynthContext.class; + + if (subregion == Region.SLIDER_TRACK) { + style = sliderTrackStyle; + } else if (subregion == Region.SLIDER_THUMB) { + style = sliderThumbStyle; + } +- return SynthContext.getContext(klass, c, subregion, style, state); ++ return SynthContext.getContext(c, subregion, style, state); + } + + private int getComponentState(JComponent c, Region region) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -278,8 +278,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + /** +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -209,8 +209,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + SynthContext getContext(JComponent c, Region region) { +@@ -219,11 +218,9 @@ + + private SynthContext getContext(JComponent c, Region region, int state) { + if (region == Region.SPLIT_PANE_DIVIDER) { +- return SynthContext.getContext(SynthContext.class, c, region, +- dividerStyle, state); ++ return SynthContext.getContext(c, region, dividerStyle, state); + } +- return SynthContext.getContext(SynthContext.class, c, region, +- style, state); ++ return SynthContext.getContext(c, region, style, state); + } + + private int getComponentState(JComponent c, Region subregion) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -235,13 +235,11 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c),style, state); ++ return SynthContext.getContext(c, style, state); + } + + private SynthContext getContext(JComponent c, Region subregion, int state){ + SynthStyle style = null; +- Class klass = SynthContext.class; + + if (subregion == Region.TABBED_PANE_TAB) { + style = tabStyle; +@@ -252,7 +250,7 @@ + else if (subregion == Region.TABBED_PANE_CONTENT) { + style = tabContentStyle; + } +- return SynthContext.getContext(klass, c, subregion, style, state); ++ return SynthContext.getContext(c, subregion, style, state); + } + + /** +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -193,8 +193,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + /** +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -246,8 +246,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + // +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -118,8 +118,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + /** +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -156,8 +156,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + /** +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -178,19 +178,17 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private SynthContext getContext(JComponent c, Region region, SynthStyle style) { +- return SynthContext.getContext(SynthContext.class, c, region, ++ return SynthContext.getContext(c, region, + style, getComponentState(c, region)); + } + + private SynthContext getContext(JComponent c, Region region, + SynthStyle style, int state) { +- return SynthContext.getContext(SynthContext.class, c, region, +- style, state); ++ return SynthContext.getContext(c, region, style, state); + } + + private int getComponentState(JComponent c, Region region) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -107,8 +107,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private int getComponentState(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -173,8 +173,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- SynthLookAndFeel.getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private SynthContext getContext(JComponent c, Region region) { +@@ -182,8 +181,7 @@ + } + + private SynthContext getContext(JComponent c, Region region, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- region, cellStyle, state); ++ return SynthContext.getContext(c, region, cellStyle, state); + } + + private int getComponentState(JComponent c, Region region) { +--- ./jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java Wed Jul 30 18:42:59 2014 +0100 +@@ -141,8 +141,7 @@ + } + + private SynthContext getContext(JComponent c, int state) { +- return SynthContext.getContext(SynthContext.class, c, +- getRegion(c), style, state); ++ return SynthContext.getContext(c, style, state); + } + + private Region getRegion(JComponent c) { +--- ./jdk/src/share/classes/javax/swing/text/JTextComponent.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/text/JTextComponent.java Wed Jul 30 18:42:59 2014 +0100 +@@ -24,18 +24,16 @@ + */ + package javax.swing.text; + +-import java.lang.reflect.Method; ++import com.sun.beans.util.Cache; + + import java.security.AccessController; + import java.security.PrivilegedAction; + + import java.beans.Transient; +-import java.util.Collections; + import java.util.HashMap; + import java.util.Hashtable; + import java.util.Enumeration; + import java.util.Vector; +-import java.util.Map; + + import java.util.concurrent.*; + +@@ -1192,47 +1190,6 @@ + } + + /** +- * Returns true if <code>klass</code> is NOT a JTextComponent and it or +- * one of its superclasses (stoping at JTextComponent) overrides +- * <code>processInputMethodEvent</code>. It is assumed this will be +- * invoked from within a <code>doPrivileged</code>, and it is also +- * assumed <code>klass</code> extends <code>JTextComponent</code>. +- */ +- private static Boolean isProcessInputMethodEventOverridden(Class<?> klass) { +- if (klass == JTextComponent.class) { +- return Boolean.FALSE; +- } +- Boolean retValue = overrideMap.get(klass.getName()); +- +- if (retValue != null) { +- return retValue; +- } +- Boolean sOverriden = isProcessInputMethodEventOverridden( +- klass.getSuperclass()); +- +- if (sOverriden.booleanValue()) { +- // If our superclass has overriden it, then by definition klass +- // overrides it. +- overrideMap.put(klass.getName(), sOverriden); +- return sOverriden; +- } +- // klass's superclass didn't override it, check for an override in +- // klass. +- try { +- Class[] classes = new Class[1]; +- classes[0] = InputMethodEvent.class; +- +- Method m = klass.getDeclaredMethod("processInputMethodEvent", +- classes); +- retValue = Boolean.TRUE; +- } catch (NoSuchMethodException nsme) { +- retValue = Boolean.FALSE; +- } +- overrideMap.put(klass.getName(), retValue); +- return retValue; +- } +- +- /** + * Fetches the current color used to render the + * caret. + * +@@ -3913,7 +3870,33 @@ + * Maps from class name to Boolean indicating if + * <code>processInputMethodEvent</code> has been overriden. + */ +- private static Map<String, Boolean> overrideMap; ++ private static Cache<Class<?>,Boolean> METHOD_OVERRIDDEN ++ = new Cache<Class<?>,Boolean>(Cache.Kind.WEAK, Cache.Kind.STRONG) { ++ /** ++ * Returns {@code true} if the specified {@code type} extends {@link JTextComponent} ++ * and the {@link JTextComponent#processInputMethodEvent} method is overridden. ++ */ ++ @Override ++ public Boolean create(final Class<?> type) { ++ if (JTextComponent.class == type) { ++ return Boolean.FALSE; ++ } ++ if (get(type.getSuperclass())) { ++ return Boolean.TRUE; ++ } ++ return AccessController.doPrivileged( ++ new PrivilegedAction<Boolean>() { ++ public Boolean run() { ++ try { ++ type.getDeclaredMethod("processInputMethodEvent", InputMethodEvent.class); ++ return Boolean.TRUE; ++ } catch (NoSuchMethodException exception) { ++ return Boolean.FALSE; ++ } ++ } ++ }); ++ } ++ }; + + /** + * Returns a string representation of this <code>JTextComponent</code>. +@@ -4938,39 +4921,16 @@ + */ + private boolean shouldSynthensizeKeyEvents() { + if (!checkedInputOverride) { ++ // Checks whether the client code overrides processInputMethodEvent. ++ // If it is overridden, need not to generate KeyTyped events for committed text. ++ // If it's not, behave as an passive input method client. ++ needToSendKeyTypedEvent = !METHOD_OVERRIDDEN.get(getClass()); + checkedInputOverride = true; +- needToSendKeyTypedEvent = +- !isProcessInputMethodEventOverridden(); + } + return needToSendKeyTypedEvent; + } + + // +- // Checks whether the client code overrides processInputMethodEvent. If it is overridden, +- // need not to generate KeyTyped events for committed text. If it's not, behave as an +- // passive input method client. +- // +- private boolean isProcessInputMethodEventOverridden() { +- if (overrideMap == null) { +- overrideMap = Collections.synchronizedMap(new HashMap<String, Boolean>()); +- } +- Boolean retValue = overrideMap.get(getClass().getName()); +- +- if (retValue != null) { +- return retValue.booleanValue(); +- } +- Boolean ret = AccessController.doPrivileged(new +- PrivilegedAction<Boolean>() { +- public Boolean run() { +- return isProcessInputMethodEventOverridden( +- JTextComponent.this.getClass()); +- } +- }); +- +- return ret.booleanValue(); +- } +- +- // + // Checks whether a composed text in this text component + // + boolean composedTextExists() { +--- ./jdk/src/share/classes/javax/swing/text/html/EditableView.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/text/html/EditableView.java Wed Jul 30 18:42:59 2014 +0100 +@@ -73,7 +73,7 @@ + Component c = getComponent(); + Container host = getContainer(); + +- if (host != null && ++ if (host instanceof JTextComponent && + isVisible != ((JTextComponent)host).isEditable()) { + isVisible = ((JTextComponent)host).isEditable(); + preferenceChanged(null, true, true); +--- ./jdk/src/share/classes/javax/swing/text/html/HTMLEditorKit.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/text/html/HTMLEditorKit.java Wed Jul 30 18:42:59 2014 +0100 +@@ -26,7 +26,6 @@ + + import sun.awt.AppContext; + +-import java.lang.reflect.Method; + import java.awt.*; + import java.awt.event.*; + import java.io.*; +@@ -34,12 +33,13 @@ + import java.net.URL; + import javax.swing.text.*; + import javax.swing.*; +-import javax.swing.border.*; + import javax.swing.event.*; + import javax.swing.plaf.TextUI; + import java.util.*; + import javax.accessibility.*; + import java.lang.ref.*; ++import java.security.AccessController; ++import java.security.PrivilegedAction; + + /** + * The Swing JEditorPane text component supports different kinds +@@ -414,14 +414,13 @@ + * HTMLEditorKit class + * @return a stream representing the resource + */ +- static InputStream getResourceAsStream(String name) { +- try { +- return ResourceLoader.getResourceAsStream(name); +- } catch (Throwable e) { +- // If the class doesn't exist or we have some other +- // problem we just try to call getResourceAsStream directly. +- return HTMLEditorKit.class.getResourceAsStream(name); +- } ++ static InputStream getResourceAsStream(final String name) { ++ return AccessController.doPrivileged( ++ new PrivilegedAction<InputStream>() { ++ public InputStream run() { ++ return HTMLEditorKit.class.getResourceAsStream(name); ++ } ++ }); + } + + /** +--- ./jdk/src/share/classes/javax/swing/text/html/ResourceLoader.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/text/html/ResourceLoader.java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,60 +0,0 @@ +-/* +- * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. Oracle designates this +- * particular file as subject to the "Classpath" exception as provided +- * by Oracle in the LICENSE file that accompanied this code. +- * +- * This code is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * version 2 for more details (a copy is included in the LICENSE file that +- * accompanied this code). +- * +- * You should have received a copy of the GNU General Public License version +- * 2 along with this work; if not, write to the Free Software Foundation, +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +- * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- */ +- +-package javax.swing.text.html; +- +-import java.io.InputStream; +- +-/** +- * Simple class to load resources using the 1.2 +- * security model. Since the html support is loaded +- * lazily, it's resources are potentially fetched with +- * applet code in the call stack. By providing this +- * functionality in a class that is only built on 1.2, +- * reflection can be used from the code that is also +- * built on 1.1 to call this functionality (and avoid +- * the evils of preprocessing). This functionality +- * is called from HTMLEditorKit.getResourceAsStream. +- * +- * @author Timothy Prinzing +- */ +-class ResourceLoader implements java.security.PrivilegedAction { +- +- ResourceLoader(String name) { +- this.name = name; +- } +- +- public Object run() { +- Object o = HTMLEditorKit.class.getResourceAsStream(name); +- return o; +- } +- +- public static InputStream getResourceAsStream(String name) { +- java.security.PrivilegedAction a = new ResourceLoader(name); +- return (InputStream) java.security.AccessController.doPrivileged(a); +- } +- +- private String name; +-} +--- ./jdk/src/share/classes/javax/swing/text/html/parser/Parser.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/text/html/parser/Parser.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -2089,6 +2089,13 @@ + // null end tag. + endTag(false); + continue; ++ } else if (textpos == 0) { ++ if (!legalElementContext(dtd.pcdata)) { ++ error("unexpected.pcdata"); ++ } ++ if (last.breaksFlow()) { ++ space = false; ++ } + } + break; + +--- ./jdk/src/share/classes/javax/swing/text/html/parser/ParserDelegator.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/text/html/parser/ParserDelegator.java Wed Jul 30 18:42:59 2014 +0100 +@@ -22,7 +22,6 @@ + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +- + package javax.swing.text.html.parser; + + import sun.awt.AppContext; +@@ -35,6 +34,8 @@ + import java.io.ObjectInputStream; + import java.io.Reader; + import java.io.Serializable; ++import java.security.AccessController; ++import java.security.PrivilegedAction; + + /** + * Responsible for starting up a new DocumentParser +@@ -111,14 +112,13 @@ + * ParserDelegator class. + * @returns a stream representing the resource + */ +- static InputStream getResourceAsStream(String name) { +- try { +- return ResourceLoader.getResourceAsStream(name); +- } catch (Throwable e) { +- // If the class doesn't exist or we have some other +- // problem we just try to call getResourceAsStream directly. +- return ParserDelegator.class.getResourceAsStream(name); +- } ++ static InputStream getResourceAsStream(final String name) { ++ return AccessController.doPrivileged( ++ new PrivilegedAction<InputStream>() { ++ public InputStream run() { ++ return ParserDelegator.class.getResourceAsStream(name); ++ } ++ }); + } + + private void readObject(ObjectInputStream s) +--- ./jdk/src/share/classes/javax/swing/text/html/parser/ResourceLoader.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/text/html/parser/ResourceLoader.java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,60 +0,0 @@ +-/* +- * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. Oracle designates this +- * particular file as subject to the "Classpath" exception as provided +- * by Oracle in the LICENSE file that accompanied this code. +- * +- * This code is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * version 2 for more details (a copy is included in the LICENSE file that +- * accompanied this code). +- * +- * You should have received a copy of the GNU General Public License version +- * 2 along with this work; if not, write to the Free Software Foundation, +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +- * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- */ +- +-package javax.swing.text.html.parser; +- +-import java.io.InputStream; +- +-/** +- * Simple class to load resources using the 1.2 +- * security model. Since the html support is loaded +- * lazily, it's resources are potentially fetched with +- * applet code in the call stack. By providing this +- * functionality in a class that is only built on 1.2, +- * reflection can be used from the code that is also +- * built on 1.1 to call this functionality (and avoid +- * the evils of preprocessing). This functionality +- * is called from ParserDelegator.getResourceAsStream. +- * +- * @author Timothy Prinzing +- */ +-class ResourceLoader implements java.security.PrivilegedAction { +- +- ResourceLoader(String name) { +- this.name = name; +- } +- +- public Object run() { +- Object o = ParserDelegator.class.getResourceAsStream(name); +- return o; +- } +- +- public static InputStream getResourceAsStream(String name) { +- java.security.PrivilegedAction a = new ResourceLoader(name); +- return (InputStream) java.security.AccessController.doPrivileged(a); +- } +- +- private String name; +-} +--- ./jdk/src/share/classes/javax/swing/text/rtf/RTFReader.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/javax/swing/text/rtf/RTFReader.java Wed Jul 30 18:42:59 2014 +0100 +@@ -27,9 +27,9 @@ + import java.lang.*; + import java.util.*; + import java.io.*; +-import java.awt.Font; + import java.awt.Color; +- ++import java.security.AccessController; ++import java.security.PrivilegedAction; + import javax.swing.text.*; + + /** +@@ -558,16 +558,14 @@ + { + char[] set = characterSets.get(name); + if (set == null) { +- InputStream charsetStream; +- charsetStream = java.security.AccessController. +- doPrivileged(new java.security.PrivilegedAction<InputStream>() { +- public InputStream run() { +- return RTFReader.class.getResourceAsStream +- ("charsets/" + name + ".txt"); +- } +- }); +- set = readCharset(charsetStream); +- defineCharacterSet(name, set); ++ InputStream charsetStream = AccessController.doPrivileged( ++ new PrivilegedAction<InputStream>() { ++ public InputStream run() { ++ return RTFReader.class.getResourceAsStream("charsets/" + name + ".txt"); ++ } ++ }); ++ set = readCharset(charsetStream); ++ defineCharacterSet(name, set); + } + return set; + } +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/ByteVector.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/ByteVector.java Wed Jul 30 18:42:59 2014 +0100 +@@ -259,41 +259,68 @@ + if (c >= '\001' && c <= '\177') { + data[len++] = (byte) c; + } else { +- int byteLength = i; +- for (int j = i; j < charLength; ++j) { +- c = s.charAt(j); +- if (c >= '\001' && c <= '\177') { +- byteLength++; +- } else if (c > '\u07FF') { +- byteLength += 3; +- } else { +- byteLength += 2; +- } +- } +- if (byteLength > 65535) { +- throw new IllegalArgumentException(); +- } +- data[length] = (byte) (byteLength >>> 8); +- data[length + 1] = (byte) byteLength; +- if (length + 2 + byteLength > data.length) { +- length = len; +- enlarge(2 + byteLength); +- data = this.data; +- } +- for (int j = i; j < charLength; ++j) { +- c = s.charAt(j); +- if (c >= '\001' && c <= '\177') { +- data[len++] = (byte) c; +- } else if (c > '\u07FF') { +- data[len++] = (byte) (0xE0 | c >> 12 & 0xF); +- data[len++] = (byte) (0x80 | c >> 6 & 0x3F); +- data[len++] = (byte) (0x80 | c & 0x3F); +- } else { +- data[len++] = (byte) (0xC0 | c >> 6 & 0x1F); +- data[len++] = (byte) (0x80 | c & 0x3F); +- } +- } +- break; ++ length = len; ++ return encodeUTF8(s, i, 65535); ++ } ++ } ++ length = len; ++ return this; ++ } ++ ++ /** ++ * Puts an UTF8 string into this byte vector. The byte vector is ++ * automatically enlarged if necessary. The string length is encoded in two ++ * bytes before the encoded characters, if there is space for that (i.e. if ++ * this.length - i - 2 >= 0). ++ * ++ * @param s ++ * the String to encode. ++ * @param i ++ * the index of the first character to encode. The previous ++ * characters are supposed to have already been encoded, using ++ * only one byte per character. ++ * @param maxByteLength ++ * the maximum byte length of the encoded string, including the ++ * already encoded characters. ++ * @return this byte vector. ++ */ ++ ByteVector encodeUTF8(final String s, int i, int maxByteLength) { ++ int charLength = s.length(); ++ int byteLength = i; ++ char c; ++ for (int j = i; j < charLength; ++j) { ++ c = s.charAt(j); ++ if (c >= '\001' && c <= '\177') { ++ byteLength++; ++ } else if (c > '\u07FF') { ++ byteLength += 3; ++ } else { ++ byteLength += 2; ++ } ++ } ++ if (byteLength > maxByteLength) { ++ throw new IllegalArgumentException(); ++ } ++ int start = length - i - 2; ++ if (start >= 0) { ++ data[start] = (byte) (byteLength >>> 8); ++ data[start + 1] = (byte) byteLength; ++ } ++ if (length + byteLength - i > data.length) { ++ enlarge(byteLength - i); ++ } ++ int len = length; ++ for (int j = i; j < charLength; ++j) { ++ c = s.charAt(j); ++ if (c >= '\001' && c <= '\177') { ++ data[len++] = (byte) c; ++ } else if (c > '\u07FF') { ++ data[len++] = (byte) (0xE0 | c >> 12 & 0xF); ++ data[len++] = (byte) (0x80 | c >> 6 & 0x3F); ++ data[len++] = (byte) (0x80 | c & 0x3F); ++ } else { ++ data[len++] = (byte) (0xC0 | c >> 6 & 0x1F); ++ data[len++] = (byte) (0x80 | c & 0x3F); + } + } + length = len; +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/ClassWriter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/ClassWriter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -716,7 +716,8 @@ + sourceFile = newUTF8(file); + } + if (debug != null) { +- sourceDebug = new ByteVector().putUTF8(debug); ++ sourceDebug = new ByteVector().encodeUTF8(debug, 0, ++ Integer.MAX_VALUE); + } + } + +@@ -784,11 +785,29 @@ + if (innerClasses == null) { + innerClasses = new ByteVector(); + } +- ++innerClassesCount; +- innerClasses.putShort(name == null ? 0 : newClass(name)); +- innerClasses.putShort(outerName == null ? 0 : newClass(outerName)); +- innerClasses.putShort(innerName == null ? 0 : newUTF8(innerName)); +- innerClasses.putShort(access); ++ // Sec. 4.7.6 of the JVMS states "Every CONSTANT_Class_info entry in the ++ // constant_pool table which represents a class or interface C that is ++ // not a package member must have exactly one corresponding entry in the ++ // classes array". To avoid duplicates we keep track in the intVal field ++ // of the Item of each CONSTANT_Class_info entry C whether an inner ++ // class entry has already been added for C (this field is unused for ++ // class entries, and changing its value does not change the hashcode ++ // and equality tests). If so we store the index of this inner class ++ // entry (plus one) in intVal. This hack allows duplicate detection in ++ // O(1) time. ++ Item nameItem = newClassItem(name); ++ if (nameItem.intVal == 0) { ++ ++innerClassesCount; ++ innerClasses.putShort(nameItem.index); ++ innerClasses.putShort(outerName == null ? 0 : newClass(outerName)); ++ innerClasses.putShort(innerName == null ? 0 : newUTF8(innerName)); ++ innerClasses.putShort(access); ++ nameItem.intVal = innerClassesCount; ++ } else { ++ // Compare the inner classes entry nameItem.intVal - 1 with the ++ // arguments of this method and throw an exception if there is a ++ // difference? ++ } + } + + @Override +@@ -857,7 +876,7 @@ + } + if (sourceDebug != null) { + ++attributeCount; +- size += sourceDebug.length + 4; ++ size += sourceDebug.length + 6; + newUTF8("SourceDebugExtension"); + } + if (enclosingMethodOwner != 0) { +@@ -946,9 +965,9 @@ + out.putShort(newUTF8("SourceFile")).putInt(2).putShort(sourceFile); + } + if (sourceDebug != null) { +- int len = sourceDebug.length - 2; ++ int len = sourceDebug.length; + out.putShort(newUTF8("SourceDebugExtension")).putInt(len); +- out.putByteArray(sourceDebug.data, 2, len); ++ out.putByteArray(sourceDebug.data, 0, len); + } + if (enclosingMethodOwner != 0) { + out.putShort(newUTF8("EnclosingMethod")).putInt(4); +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/Frame.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/Frame.java Wed Jul 30 18:42:59 2014 +0100 +@@ -99,8 +99,8 @@ + * stack types. VALUE depends on KIND. For LOCAL types, it is an index in + * the input local variable types. For STACK types, it is a position + * relatively to the top of input frame stack. For BASE types, it is either +- * one of the constants defined in FrameVisitor, or for OBJECT and +- * UNINITIALIZED types, a tag and an index in the type table. ++ * one of the constants defined below, or for OBJECT and UNINITIALIZED ++ * types, a tag and an index in the type table. + * + * Output frames can contain types of any kind and with a positive or + * negative dimension (and even unassigned types, represented by 0 - which +@@ -537,7 +537,7 @@ + /** + * The types that are initialized in the basic block. A constructor + * invocation on an UNINITIALIZED or UNINITIALIZED_THIS type must replace +- * <i>every occurrence</i> of this type in the local variables and in the ++ * <i>every occurence</i> of this type in the local variables and in the + * operand stack. This cannot be done during the first phase of the + * algorithm since, during this phase, the local variables and the operand + * stack are not completely computed. It is therefore necessary to store the +@@ -1446,6 +1446,7 @@ + // if t is the NULL type, merge(u,t)=u, so there is no change + return false; + } else if ((t & (DIM | BASE_KIND)) == (u & (DIM | BASE_KIND))) { ++ // if t and u have the same dimension and same base kind + if ((u & BASE_KIND) == OBJECT) { + // if t is also a reference type, and if u and t have the + // same dimension merge(u,t) = dim(t) | common parent of the +@@ -1454,13 +1455,21 @@ + | cw.getMergedType(t & BASE_VALUE, u & BASE_VALUE); + } else { + // if u and t are array types, but not with the same element +- // type, merge(u,t)=java/lang/Object +- v = OBJECT | cw.addType("java/lang/Object"); ++ // type, merge(u,t) = dim(u) - 1 | java/lang/Object ++ int vdim = ELEMENT_OF + (u & DIM); ++ v = vdim | OBJECT | cw.addType("java/lang/Object"); + } + } else if ((t & BASE_KIND) == OBJECT || (t & DIM) != 0) { +- // if t is any other reference or array type, +- // merge(u,t)=java/lang/Object +- v = OBJECT | cw.addType("java/lang/Object"); ++ // if t is any other reference or array type, the merged type ++ // is min(udim, tdim) | java/lang/Object, where udim is the ++ // array dimension of u, minus 1 if u is an array type with a ++ // primitive element type (and similarly for tdim). ++ int tdim = (((t & DIM) == 0 || (t & BASE_KIND) == OBJECT) ? 0 ++ : ELEMENT_OF) + (t & DIM); ++ int udim = (((u & DIM) == 0 || (u & BASE_KIND) == OBJECT) ? 0 ++ : ELEMENT_OF) + (u & DIM); ++ v = Math.min(tdim, udim) | OBJECT ++ | cw.addType("java/lang/Object"); + } else { + // if t is any other type, merge(u,t)=TOP + v = TOP; +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/Item.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/Item.java Wed Jul 30 18:42:59 2014 +0100 +@@ -237,9 +237,10 @@ + this.strVal2 = strVal2; + this.strVal3 = strVal3; + switch (type) { ++ case ClassWriter.CLASS: ++ this.intVal = 0; // intVal of a class must be zero, see visitInnerClass + case ClassWriter.UTF8: + case ClassWriter.STR: +- case ClassWriter.CLASS: + case ClassWriter.MTYPE: + case ClassWriter.TYPE_NORMAL: + hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()); +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/Label.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/Label.java Wed Jul 30 18:42:59 2014 +0100 +@@ -502,7 +502,7 @@ + void addToSubroutine(final long id, final int nbSubroutines) { + if ((status & VISITED) == 0) { + status |= VISITED; +- srcAndRefPositions = new int[(nbSubroutines - 1) / 32 + 1]; ++ srcAndRefPositions = new int[nbSubroutines / 32 + 1]; + } + srcAndRefPositions[(int) (id >>> 32)] |= (int) id; + } +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/MethodWriter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/MethodWriter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1430,6 +1430,14 @@ + + @Override + public void visitMaxs(final int maxStack, final int maxLocals) { ++ if (resize) { ++ // replaces the temporary jump opcodes introduced by Label.resolve. ++ if (ClassReader.RESIZE) { ++ resizeInstructions(); ++ } else { ++ throw new RuntimeException("Method code too large!"); ++ } ++ } + if (ClassReader.FRAMES && compute == FRAMES) { + // completes the control flow graph with exception handler blocks + Handler handler = firstHandler; +@@ -1987,43 +1995,43 @@ + stackMap.putByte(v); + } + } else { +- StringBuffer buf = new StringBuffer(); ++ StringBuilder sb = new StringBuilder(); + d >>= 28; + while (d-- > 0) { +- buf.append('['); ++ sb.append('['); + } + if ((t & Frame.BASE_KIND) == Frame.OBJECT) { +- buf.append('L'); +- buf.append(cw.typeTable[t & Frame.BASE_VALUE].strVal1); +- buf.append(';'); ++ sb.append('L'); ++ sb.append(cw.typeTable[t & Frame.BASE_VALUE].strVal1); ++ sb.append(';'); + } else { + switch (t & 0xF) { + case 1: +- buf.append('I'); ++ sb.append('I'); + break; + case 2: +- buf.append('F'); ++ sb.append('F'); + break; + case 3: +- buf.append('D'); ++ sb.append('D'); + break; + case 9: +- buf.append('Z'); ++ sb.append('Z'); + break; + case 10: +- buf.append('B'); ++ sb.append('B'); + break; + case 11: +- buf.append('C'); ++ sb.append('C'); + break; + case 12: +- buf.append('S'); ++ sb.append('S'); + break; + default: +- buf.append('J'); ++ sb.append('J'); + } + } +- stackMap.putByte(7).putShort(cw.newClass(buf.toString())); ++ stackMap.putByte(7).putShort(cw.newClass(sb.toString())); + } + } + } +@@ -2051,14 +2059,6 @@ + if (classReaderOffset != 0) { + return 6 + classReaderLength; + } +- if (resize) { +- // replaces the temporary jump opcodes introduced by Label.resolve. +- if (ClassReader.RESIZE) { +- resizeInstructions(); +- } else { +- throw new RuntimeException("Method code too large!"); +- } +- } + int size = 8; + if (code.length > 0) { + if (code.length > 65536) { +@@ -2715,49 +2715,50 @@ + } + } + +- // recomputes the stack map frames +- if (frameCount > 0) { +- if (compute == FRAMES) { +- frameCount = 0; +- stackMap = null; +- previousFrame = null; +- frame = null; +- Frame f = new Frame(); +- f.owner = labels; +- Type[] args = Type.getArgumentTypes(descriptor); +- f.initInputFrame(cw, access, args, maxLocals); +- visitFrame(f); +- Label l = labels; +- while (l != null) { +- /* +- * here we need the original label position. getNewOffset +- * must therefore never have been called for this label. +- */ +- u = l.position - 3; +- if ((l.status & Label.STORE) != 0 || (u >= 0 && resize[u])) { +- getNewOffset(allIndexes, allSizes, l); +- // TODO update offsets in UNINITIALIZED values +- visitFrame(l.frame); +- } +- l = l.successor; ++ // updates the stack map frame labels ++ if (compute == FRAMES) { ++ Label l = labels; ++ while (l != null) { ++ /* ++ * Detects the labels that are just after an IF instruction that ++ * has been resized with the IFNOT GOTO_W pattern. These labels ++ * are now the target of a jump instruction (the IFNOT ++ * instruction). Note that we need the original label position ++ * here. getNewOffset must therefore never have been called for ++ * this label. ++ */ ++ u = l.position - 3; ++ if (u >= 0 && resize[u]) { ++ l.status |= Label.TARGET; + } +- } else { +- /* +- * Resizing an existing stack map frame table is really hard. +- * Not only the table must be parsed to update the offets, but +- * new frames may be needed for jump instructions that were +- * inserted by this method. And updating the offsets or +- * inserting frames can change the format of the following +- * frames, in case of packed frames. In practice the whole table +- * must be recomputed. For this the frames are marked as +- * potentially invalid. This will cause the whole class to be +- * reread and rewritten with the COMPUTE_FRAMES option (see the +- * ClassWriter.toByteArray method). This is not very efficient +- * but is much easier and requires much less code than any other +- * method I can think of. +- */ +- cw.invalidFrames = true; ++ getNewOffset(allIndexes, allSizes, l); ++ l = l.successor; + } ++ // Update the offsets in the uninitialized types ++ for (i = 0; i < cw.typeTable.length; ++i) { ++ Item item = cw.typeTable[i]; ++ if (item != null && item.type == ClassWriter.TYPE_UNINIT) { ++ item.intVal = getNewOffset(allIndexes, allSizes, 0, ++ item.intVal); ++ } ++ } ++ // The stack map frames are not serialized yet, so we don't need ++ // to update them. They will be serialized in visitMaxs. ++ } else if (frameCount > 0) { ++ /* ++ * Resizing an existing stack map frame table is really hard. Not ++ * only the table must be parsed to update the offets, but new ++ * frames may be needed for jump instructions that were inserted by ++ * this method. And updating the offsets or inserting frames can ++ * change the format of the following frames, in case of packed ++ * frames. In practice the whole table must be recomputed. For this ++ * the frames are marked as potentially invalid. This will cause the ++ * whole class to be reread and rewritten with the COMPUTE_FRAMES ++ * option (see the ClassWriter.toByteArray method). This is not very ++ * efficient but is much easier and requires much less code than any ++ * other method I can think of. ++ */ ++ cw.invalidFrames = true; + } + // updates the exception handler block labels + Handler h = firstHandler; +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/Type.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/Type.java Wed Jul 30 18:42:59 2014 +0100 +@@ -585,11 +585,11 @@ + case DOUBLE: + return "double"; + case ARRAY: +- StringBuffer b = new StringBuffer(getElementType().getClassName()); ++ StringBuilder sb = new StringBuilder(getElementType().getClassName()); + for (int i = getDimensions(); i > 0; --i) { +- b.append("[]"); ++ sb.append("[]"); + } +- return b.toString(); ++ return sb.toString(); + case OBJECT: + return new String(buf, off, len).replace('/', '.'); + default: +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/AnalyzerAdapter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/AnalyzerAdapter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -240,6 +240,7 @@ + locals.add(types[i].getInternalName()); + } + } ++ maxLocals = locals.size(); + } + + @Override +@@ -519,12 +520,12 @@ + // ------------------------------------------------------------------------ + + private Object get(final int local) { +- maxLocals = Math.max(maxLocals, local); ++ maxLocals = Math.max(maxLocals, local + 1); + return local < locals.size() ? locals.get(local) : Opcodes.TOP; + } + + private void set(final int local, final Object type) { +- maxLocals = Math.max(maxLocals, local); ++ maxLocals = Math.max(maxLocals, local + 1); + while (local >= locals.size()) { + locals.add(Opcodes.TOP); + } +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/InstructionAdapter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/InstructionAdapter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1089,7 +1089,7 @@ + @Deprecated + public void invokestatic(final String owner, final String name, + final String desc) { +- if (api < Opcodes.ASM5) { ++ if (api >= Opcodes.ASM5) { + invokestatic(owner, name, desc, false); + return; + } +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Method.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Method.java Wed Jul 30 18:42:59 2014 +0100 +@@ -205,7 +205,7 @@ + } + String returnType = method.substring(0, space); + String methodName = method.substring(space + 1, start - 1).trim(); +- StringBuffer sb = new StringBuffer(); ++ StringBuilder sb = new StringBuilder(); + sb.append('('); + int p; + do { +@@ -229,7 +229,7 @@ + return type; + } + +- StringBuffer sb = new StringBuffer(); ++ StringBuilder sb = new StringBuilder(); + int index = 0; + while ((index = type.indexOf("[]", index) + 1) > 0) { + sb.append('['); +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Remapper.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/Remapper.java Wed Jul 30 18:42:59 2014 +0100 +@@ -147,17 +147,17 @@ + } + + Type[] args = Type.getArgumentTypes(desc); +- StringBuffer s = new StringBuffer("("); ++ StringBuilder sb = new StringBuilder("("); + for (int i = 0; i < args.length; i++) { +- s.append(mapDesc(args[i].getDescriptor())); ++ sb.append(mapDesc(args[i].getDescriptor())); + } + Type returnType = Type.getReturnType(desc); + if (returnType == Type.VOID_TYPE) { +- s.append(")V"); +- return s.toString(); ++ sb.append(")V"); ++ return sb.toString(); + } +- s.append(')').append(mapDesc(returnType.getDescriptor())); +- return s.toString(); ++ sb.append(')').append(mapDesc(returnType.getDescriptor())); ++ return sb.toString(); + } + + public Object mapValue(Object value) { +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/SerialVersionUIDAdder.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/commons/SerialVersionUIDAdder.java Wed Jul 30 18:42:59 2014 +0100 +@@ -239,7 +239,9 @@ + if (computeSVUID) { + this.name = name; + this.access = access; +- this.interfaces = Arrays.copyOf(interfaces, interfaces.length); ++ this.interfaces = new String[interfaces.length]; ++ System.arraycopy(interfaces, 0, this.interfaces, 0, ++ interfaces.length); + } + + super.visit(version, access, name, signature, superName, interfaces); +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/InsnList.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/InsnList.java Wed Jul 30 18:42:59 2014 +0100 +@@ -556,6 +556,8 @@ + + AbstractInsnNode prev; + ++ AbstractInsnNode remove; ++ + InsnListIterator(int index) { + if (index == size()) { + next = null; +@@ -577,12 +579,22 @@ + AbstractInsnNode result = next; + prev = result; + next = result.next; ++ remove = result; + return result; + } + + public void remove() { +- InsnList.this.remove(prev); +- prev = prev.prev; ++ if (remove != null) { ++ if (remove == next) { ++ next = next.next; ++ } else { ++ prev = prev.prev; ++ } ++ InsnList.this.remove(remove); ++ remove = null; ++ } else { ++ throw new IllegalStateException(); ++ } + } + + public boolean hasPrevious() { +@@ -593,6 +605,7 @@ + AbstractInsnNode result = prev; + next = result; + prev = result.prev; ++ remove = result; + return result; + } + +@@ -619,6 +632,7 @@ + public void add(Object o) { + InsnList.this.insertBefore(next, (AbstractInsnNode) o); + prev = (AbstractInsnNode) o; ++ remove = null; + } + + public void set(Object o) { +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/MethodNode.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/MethodNode.java Wed Jul 30 18:42:59 2014 +0100 +@@ -351,6 +351,7 @@ + } + + @Override ++ @SuppressWarnings("serial") + public AnnotationVisitor visitAnnotationDefault() { + return new AnnotationNode(new ArrayList<Object>(0) { + @Override +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Analyzer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Analyzer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -404,7 +404,7 @@ + * instruction of the method. The size of the returned array is + * equal to the number of instructions (and labels) of the method. A + * given frame is <tt>null</tt> if the corresponding instruction +- * cannot be reached, or if an error occurred during the analysis of ++ * cannot be reached, or if an error occured during the analysis of + * the method. + */ + public Frame<V>[] getFrames() { +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/AnalyzerException.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/AnalyzerException.java Wed Jul 30 18:42:59 2014 +0100 +@@ -66,6 +66,7 @@ + * @author Bing Ran + * @author Eric Bruneton + */ ++@SuppressWarnings("serial") + public class AnalyzerException extends Exception { + + public final AbstractInsnNode node; +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Frame.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Frame.java Wed Jul 30 18:42:59 2014 +0100 +@@ -754,14 +754,14 @@ + */ + @Override + public String toString() { +- StringBuffer b = new StringBuffer(); ++ StringBuilder sb = new StringBuilder(); + for (int i = 0; i < getLocals(); ++i) { +- b.append(getLocal(i)); ++ sb.append(getLocal(i)); + } +- b.append(' '); ++ sb.append(' '); + for (int i = 0; i < getStackSize(); ++i) { +- b.append(getStack(i).toString()); ++ sb.append(getStack(i).toString()); + } +- return b.toString(); ++ return sb.toString(); + } + } +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Interpreter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/tree/analysis/Interpreter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -111,7 +111,7 @@ + * the bytecode instruction to be interpreted. + * @return the result of the interpretation of the given instruction. + * @throws AnalyzerException +- * if an error occurred during the interpretation. ++ * if an error occured during the interpretation. + */ + public abstract V newOperation(AbstractInsnNode insn) + throws AnalyzerException; +@@ -130,7 +130,7 @@ + * @return the result of the interpretation of the given instruction. The + * returned value must be <tt>equal</tt> to the given value. + * @throws AnalyzerException +- * if an error occurred during the interpretation. ++ * if an error occured during the interpretation. + */ + public abstract V copyOperation(AbstractInsnNode insn, V value) + throws AnalyzerException; +@@ -151,7 +151,7 @@ + * the argument of the instruction to be interpreted. + * @return the result of the interpretation of the given instruction. + * @throws AnalyzerException +- * if an error occurred during the interpretation. ++ * if an error occured during the interpretation. + */ + public abstract V unaryOperation(AbstractInsnNode insn, V value) + throws AnalyzerException; +@@ -175,7 +175,7 @@ + * the second argument of the instruction to be interpreted. + * @return the result of the interpretation of the given instruction. + * @throws AnalyzerException +- * if an error occurred during the interpretation. ++ * if an error occured during the interpretation. + */ + public abstract V binaryOperation(AbstractInsnNode insn, V value1, V value2) + throws AnalyzerException; +@@ -196,7 +196,7 @@ + * the third argument of the instruction to be interpreted. + * @return the result of the interpretation of the given instruction. + * @throws AnalyzerException +- * if an error occurred during the interpretation. ++ * if an error occured during the interpretation. + */ + public abstract V ternaryOperation(AbstractInsnNode insn, V value1, + V value2, V value3) throws AnalyzerException; +@@ -214,7 +214,7 @@ + * the arguments of the instruction to be interpreted. + * @return the result of the interpretation of the given instruction. + * @throws AnalyzerException +- * if an error occurred during the interpretation. ++ * if an error occured during the interpretation. + */ + public abstract V naryOperation(AbstractInsnNode insn, + List<? extends V> values) throws AnalyzerException; +@@ -232,7 +232,7 @@ + * @param expected + * the expected return type of the analyzed method. + * @throws AnalyzerException +- * if an error occurred during the interpretation. ++ * if an error occured during the interpretation. + */ + public abstract void returnOperation(AbstractInsnNode insn, V value, + V expected) throws AnalyzerException; +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/ASMifier.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/ASMifier.java Wed Jul 30 18:42:59 2014 +0100 +@@ -206,7 +206,6 @@ + } + text.add("import java.util.*;\n"); + text.add("import jdk.internal.org.objectweb.asm.*;\n"); +- text.add("import jdk.internal.org.objectweb.asm.attrs.*;\n"); + text.add("public class " + simpleName + "Dump implements Opcodes {\n\n"); + text.add("public static byte[] dump () throws Exception {\n\n"); + text.add("ClassWriter cw = new ClassWriter(0);\n"); +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/CheckAnnotationAdapter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/CheckAnnotationAdapter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -99,7 +99,7 @@ + } + if (value instanceof Type) { + int sort = ((Type) value).getSort(); +- if (sort != Type.OBJECT && sort != Type.ARRAY) { ++ if (sort == Type.METHOD) { + throw new IllegalArgumentException("Invalid annotation value"); + } + } +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/CheckClassAdapter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/CheckClassAdapter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -298,26 +298,26 @@ + for (int j = 0; j < method.instructions.size(); ++j) { + method.instructions.get(j).accept(mv); + +- StringBuffer s = new StringBuffer(); ++ StringBuilder sb = new StringBuilder(); + Frame<BasicValue> f = frames[j]; + if (f == null) { +- s.append('?'); ++ sb.append('?'); + } else { + for (int k = 0; k < f.getLocals(); ++k) { +- s.append(getShortName(f.getLocal(k).toString())) ++ sb.append(getShortName(f.getLocal(k).toString())) + .append(' '); + } +- s.append(" : "); ++ sb.append(" : "); + for (int k = 0; k < f.getStackSize(); ++k) { +- s.append(getShortName(f.getStack(k).toString())) ++ sb.append(getShortName(f.getStack(k).toString())) + .append(' '); + } + } +- while (s.length() < method.maxStack + method.maxLocals + 1) { +- s.append(' '); ++ while (sb.length() < method.maxStack + method.maxLocals + 1) { ++ sb.append(' '); + } + pw.print(Integer.toString(j + 100000).substring(1)); +- pw.print(" " + s + " : " + t.text.get(t.text.size() - 1)); ++ pw.print(" " + sb + " : " + t.text.get(t.text.size() - 1)); + } + for (int j = 0; j < method.tryCatchBlocks.size(); ++j) { + method.tryCatchBlocks.get(j).accept(mv); +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/Textifier.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/util/Textifier.java Wed Jul 30 18:42:59 2014 +0100 +@@ -166,6 +166,11 @@ + */ + protected Map<Label, String> labelNames; + ++ /** ++ * Class access flags ++ */ ++ private int access; ++ + private int valueNumber = 0; + + /** +@@ -245,6 +250,7 @@ + public void visit(final int version, final int access, final String name, + final String signature, final String superName, + final String[] interfaces) { ++ this.access = access; + int major = version & 0xFFFF; + int minor = version >>> 16; + buf.setLength(0); +@@ -437,7 +443,7 @@ + } + + buf.append(tab); +- appendAccess(access); ++ appendAccess(access & ~Opcodes.ACC_VOLATILE); + if ((access & Opcodes.ACC_NATIVE) != 0) { + buf.append("native "); + } +@@ -447,6 +453,11 @@ + if ((access & Opcodes.ACC_BRIDGE) != 0) { + buf.append("bridge "); + } ++ if ((this.access & Opcodes.ACC_INTERFACE) != 0 ++ && (access & Opcodes.ACC_ABSTRACT) == 0 ++ && (access & Opcodes.ACC_STATIC) == 0) { ++ buf.append("default "); ++ } + + buf.append(name); + appendDescriptor(METHOD_DESCRIPTOR, desc); +@@ -856,7 +867,6 @@ + appendDescriptor(INTERNAL_NAME, owner); + buf.append('.').append(name).append(' '); + appendDescriptor(METHOD_DESCRIPTOR, desc); +- buf.append(' ').append(itf ? "itf" : ""); + buf.append('\n'); + text.add(buf.toString()); + } +@@ -869,26 +879,35 @@ + buf.append(name); + appendDescriptor(METHOD_DESCRIPTOR, desc); + buf.append(" ["); ++ buf.append('\n'); ++ buf.append(tab3); + appendHandle(bsm); ++ buf.append('\n'); + buf.append(tab3).append("// arguments:"); + if (bsmArgs.length == 0) { + buf.append(" none"); + } else { +- buf.append('\n').append(tab3); ++ buf.append('\n'); + for (int i = 0; i < bsmArgs.length; i++) { ++ buf.append(tab3); + Object cst = bsmArgs[i]; + if (cst instanceof String) { + Printer.appendString(buf, (String) cst); + } else if (cst instanceof Type) { +- buf.append(((Type) cst).getDescriptor()).append(".class"); ++ Type type = (Type) cst; ++ if(type.getSort() == Type.METHOD){ ++ appendDescriptor(METHOD_DESCRIPTOR, type.getDescriptor()); ++ } else { ++ buf.append(type.getDescriptor()).append(".class"); ++ } + } else if (cst instanceof Handle) { + appendHandle((Handle) cst); + } else { + buf.append(cst); + } +- buf.append(", "); ++ buf.append(", \n"); + } +- buf.setLength(buf.length() - 2); ++ buf.setLength(buf.length() - 3); + } + buf.append('\n'); + buf.append(tab2).append("]\n"); +@@ -1234,10 +1253,10 @@ + * a handle, non null. + */ + protected void appendHandle(final Handle h) { +- buf.append('\n').append(tab3); + int tag = h.getTag(); + buf.append("// handle kind 0x").append(Integer.toHexString(tag)) + .append(" : "); ++ boolean isMethodHandle = false; + switch (tag) { + case Opcodes.H_GETFIELD: + buf.append("GETFIELD"); +@@ -1253,18 +1272,23 @@ + break; + case Opcodes.H_INVOKEINTERFACE: + buf.append("INVOKEINTERFACE"); ++ isMethodHandle = true; + break; + case Opcodes.H_INVOKESPECIAL: + buf.append("INVOKESPECIAL"); ++ isMethodHandle = true; + break; + case Opcodes.H_INVOKESTATIC: + buf.append("INVOKESTATIC"); ++ isMethodHandle = true; + break; + case Opcodes.H_INVOKEVIRTUAL: + buf.append("INVOKEVIRTUAL"); ++ isMethodHandle = true; + break; + case Opcodes.H_NEWINVOKESPECIAL: + buf.append("NEWINVOKESPECIAL"); ++ isMethodHandle = true; + break; + } + buf.append('\n'); +@@ -1272,9 +1296,13 @@ + appendDescriptor(INTERNAL_NAME, h.getOwner()); + buf.append('.'); + buf.append(h.getName()); +- buf.append('('); ++ if(!isMethodHandle){ ++ buf.append('('); ++ } + appendDescriptor(HANDLE_DESCRIPTOR, h.getDesc()); +- buf.append(')').append('\n'); ++ if(!isMethodHandle){ ++ buf.append(')'); ++ } + } + + /** +--- ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/version.txt Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/jdk/internal/org/objectweb/asm/version.txt Wed Jul 30 18:42:59 2014 +0100 +@@ -1,12 +1,12 @@ + Path: . +-Working Copy Root Path: /hudson/jobs/objectweb-pull/workspace/ASM_5_0_BETA +-URL: svn://svn.forge.objectweb.org/svnroot/asm/trunk/asm +-Repository Root: svn://svn.forge.objectweb.org/svnroot/asm ++Working Copy Root Path: /hudson/jobs/objectweb-pull/workspace/asm-svn-2014-05-27 ++URL: file:///svnroot/asm/trunk/asm ++Repository Root: file:///svnroot/asm + Repository UUID: 271bd773-ee82-43a6-9b2b-1890ed8ce7f9 +-Revision: 1700 ++Revision: 1748 + Node Kind: directory + Schedule: normal + Last Changed Author: ebruneton +-Last Changed Rev: 1700 +-Last Changed Date: 2013-10-29 20:22:52 +0100 (Tue, 29 Oct 2013) ++Last Changed Rev: 1747 ++Last Changed Date: 2014-05-24 10:22:13 +0200 (Sat, 24 May 2014) + +--- ./jdk/src/share/classes/jdk/net/ExtendedSocketOptions.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/jdk/net/ExtendedSocketOptions.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. 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 jdk.net; ++ ++import java.net.SocketOption; ++ ++/** ++ * Defines extended socket options, beyond those defined in ++ * {@link java.net.StandardSocketOptions}. These options may be platform ++ * specific. ++ */ ++@jdk.Exported ++public final class ExtendedSocketOptions { ++ ++ private static class ExtSocketOption<T> implements SocketOption<T> { ++ private final String name; ++ private final Class<T> type; ++ ExtSocketOption(String name, Class<T> type) { ++ this.name = name; ++ this.type = type; ++ } ++ @Override public String name() { return name; } ++ @Override public Class<T> type() { return type; } ++ @Override public String toString() { return name; } ++ } ++ ++ private ExtendedSocketOptions() {} ++ ++ /** ++ * Service level properties. When a security manager is installed, ++ * setting or getting this option requires a {@link NetworkPermission} ++ * {@code ("setOption.SO_FLOW_SLA")} or {@code "getOption.SO_FLOW_SLA"} ++ * respectively. ++ */ ++ public static final SocketOption<SocketFlow> SO_FLOW_SLA = new ++ ExtSocketOption<SocketFlow>("SO_FLOW_SLA", SocketFlow.class); ++} +--- ./jdk/src/share/classes/jdk/net/NetworkPermission.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/jdk/net/NetworkPermission.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,89 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package jdk.net; ++ ++import java.security.BasicPermission; ++ ++/** ++ * Represents permission to access the extended networking capabilities ++ * defined in the jdk.net package. These permissions contain a target ++ * name, but no actions list. Callers either possess the permission or not. ++ * <p> ++ * The following targets are defined: ++ * <p> ++ * <table border=1 cellpadding=5 summary="permission target name, ++ * what the target allows,and associated risks"> ++ * <tr> ++ * <th>Permission Target Name</th> ++ * <th>What the Permission Allows</th> ++ * <th>Risks of Allowing this Permission</th> ++ * </tr> ++ * <tr> ++ * <td>setOption.SO_FLOW_SLA</td> ++ * <td>set the {@link ExtendedSocketOptions#SO_FLOW_SLA SO_FLOW_SLA} option ++ * on any socket that supports it</td> ++ * <td>allows caller to set a higher priority or bandwidth allocation ++ * to sockets it creates, than they might otherwise be allowed.</td> ++ * </tr> ++ * <tr> ++ * <td>getOption.SO_FLOW_SLA</td> ++ * <td>retrieve the {@link ExtendedSocketOptions#SO_FLOW_SLA SO_FLOW_SLA} ++ * setting from any socket that supports the option</td> ++ * <td>allows caller access to SLA information that it might not ++ * otherwise have</td> ++ * </tr></table> ++ * ++ * @see jdk.net.ExtendedSocketOptions ++ */ ++ ++@jdk.Exported ++public final class NetworkPermission extends BasicPermission { ++ ++ private static final long serialVersionUID = -2012939586906722291L; ++ ++ /** ++ * Creates a NetworkPermission with the given target name. ++ * ++ * @param name the permission target name ++ * @throws NullPointerException if {@code name} is {@code null}. ++ * @throws IllegalArgumentException if {@code name} is empty. ++ */ ++ public NetworkPermission(String name) { ++ super(name); ++ } ++ ++ /** ++ * Creates a NetworkPermission with the given target name. ++ * ++ * @param name the permission target name ++ * @param actions should be {@code null}. Is ignored if not. ++ * @throws NullPointerException if {@code name} is {@code null}. ++ * @throws IllegalArgumentException if {@code name} is empty. ++ */ ++ public NetworkPermission(String name, String actions) { ++ super(name, actions); ++ } ++} +--- ./jdk/src/share/classes/jdk/net/SocketFlow.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/jdk/net/SocketFlow.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,165 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package jdk.net; ++ ++import java.lang.annotation.Native; ++ ++/** ++ * Represents the service level properties for the platform specific socket ++ * option {@link ExtendedSocketOptions#SO_FLOW_SLA}. ++ * <p> ++ * The priority and bandwidth parameters must be set before ++ * setting the socket option. ++ * <p> ++ * When the {@code SO_FLOW_SLA} option is set then it may not take effect ++ * immediately. If the value of the socket option is obtained with ++ * {@code getOption()} then the status may be returned as {@code INPROGRESS} ++ * until it takes effect. The priority and bandwidth values are only valid when ++ * the status is returned as OK. ++ * <p> ++ * When a security manager is installed, a {@link NetworkPermission} ++ * is required to set or get this option. ++ */ ++@jdk.Exported ++public class SocketFlow { ++ ++ private static final int UNSET = -1; ++ @Native public static final int NORMAL_PRIORITY = 1; ++ @Native public static final int HIGH_PRIORITY = 2; ++ ++ private int priority = NORMAL_PRIORITY; ++ ++ private long bandwidth = UNSET; ++ ++ private Status status = Status.NO_STATUS; ++ ++ private SocketFlow() {} ++ ++ /** ++ * Enumeration of the return values from the SO_FLOW_SLA ++ * socket option. Both setting and getting the option return ++ * one of these statuses, which reflect the state of socket's ++ * flow. ++ */ ++ @jdk.Exported ++ public enum Status { ++ /** ++ * Set or get socket option has not been called yet. Status ++ * values can only be retrieved after calling set or get. ++ */ ++ NO_STATUS, ++ /** ++ * Flow successfully created. ++ */ ++ OK, ++ /** ++ * Caller has no permission to create flow. ++ */ ++ NO_PERMISSION, ++ /** ++ * Flow can not be created because socket is not connected. ++ */ ++ NOT_CONNECTED, ++ /** ++ * Flow creation not supported for this socket. ++ */ ++ NOT_SUPPORTED, ++ /** ++ * A flow already exists with identical attributes. ++ */ ++ ALREADY_CREATED, ++ /** ++ * A flow is being created. ++ */ ++ IN_PROGRESS, ++ /** ++ * Some other unspecified error. ++ */ ++ OTHER ++ } ++ ++ /** ++ * Creates a new SocketFlow that can be used to set the SO_FLOW_SLA ++ * socket option and create a socket flow. ++ */ ++ public static SocketFlow create() { ++ return new SocketFlow(); ++ } ++ ++ /** ++ * Sets this SocketFlow's priority. Must be either NORMAL_PRIORITY ++ * HIGH_PRIORITY. If not set, a flow's priority is normal. ++ * ++ * @throws IllegalArgumentException if priority is not NORMAL_PRIORITY or ++ * HIGH_PRIORITY. ++ */ ++ public SocketFlow priority(int priority) { ++ if (priority != NORMAL_PRIORITY && priority != HIGH_PRIORITY) { ++ throw new IllegalArgumentException("invalid priority"); ++ } ++ this.priority = priority; ++ return this; ++ } ++ ++ /** ++ * Sets this SocketFlow's bandwidth. Must be greater than or equal to zero. ++ * A value of zero drops all packets for the socket. ++ * ++ * @throws IllegalArgumentException if bandwidth is less than zero. ++ */ ++ public SocketFlow bandwidth(long bandwidth) { ++ if (bandwidth < 0) { ++ throw new IllegalArgumentException("invalid bandwidth"); ++ } else { ++ this.bandwidth = bandwidth; ++ } ++ return this; ++ } ++ ++ /** ++ * Returns this SocketFlow's priority. ++ */ ++ public int priority() { ++ return priority; ++ } ++ ++ /** ++ * Returns this SocketFlow's bandwidth. ++ * ++ * @return this SocketFlow's bandwidth, or {@code -1} if status is not OK. ++ */ ++ public long bandwidth() { ++ return bandwidth; ++ } ++ ++ /** ++ * Returns the Status value of this SocketFlow. NO_STATUS is returned ++ * if the object was not used in a call to set or get the option. ++ */ ++ public Status status() { ++ return status; ++ } ++} +--- ./jdk/src/share/classes/jdk/net/Sockets.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/jdk/net/Sockets.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,402 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package jdk.net; ++ ++import java.net.*; ++import java.io.IOException; ++import java.io.FileDescriptor; ++import java.security.PrivilegedAction; ++import java.security.AccessController; ++import java.lang.reflect.*; ++import java.util.Set; ++import java.util.HashSet; ++import java.util.HashMap; ++import java.util.Collections; ++import sun.net.ExtendedOptionsImpl; ++ ++/** ++ * Defines static methods to set and get socket options defined by the ++ * {@link java.net.SocketOption} interface. All of the standard options defined ++ * by {@link java.net.Socket}, {@link java.net.ServerSocket}, and ++ * {@link java.net.DatagramSocket} can be set this way, as well as additional ++ * or platform specific options supported by each socket type. ++ * <p> ++ * The {@link #supportedOptions(Class)} method can be called to determine ++ * the complete set of options available (per socket type) on the ++ * current system. ++ * <p> ++ * When a security manager is installed, some non-standard socket options ++ * may require a security permission before being set or get. ++ * The details are specified in {@link ExtendedSocketOptions}. No permission ++ * is required for {@link java.net.StandardSocketOptions}. ++ * ++ * @see java.nio.channels.NetworkChannel ++ */ ++@jdk.Exported ++public class Sockets { ++ ++ private final static HashMap<Class<?>,Set<SocketOption<?>>> ++ options = new HashMap<>(); ++ ++ static { ++ initOptionSets(); ++ AccessController.doPrivileged( ++ new java.security.PrivilegedAction<Void>() { ++ public Void run() { ++ initMethods(); ++ return null; ++ } ++ } ++ ); ++ } ++ ++ private static Method siSetOption; ++ private static Method siGetOption; ++ private static Method dsiSetOption; ++ private static Method dsiGetOption; ++ ++ private static void initMethods() { ++ try { ++ Class<?> clazz = Class.forName("java.net.SocketSecrets"); ++ ++ siSetOption = clazz.getDeclaredMethod( ++ "setOption", Object.class, ++ SocketOption.class, Object.class ++ ); ++ siSetOption.setAccessible(true); ++ ++ siGetOption = clazz.getDeclaredMethod( ++ "getOption", Object.class, SocketOption.class ++ ); ++ siGetOption.setAccessible(true); ++ ++ dsiSetOption = clazz.getDeclaredMethod( ++ "setOption", DatagramSocket.class, ++ SocketOption.class, Object.class ++ ); ++ dsiSetOption.setAccessible(true); ++ ++ dsiGetOption = clazz.getDeclaredMethod( ++ "getOption", DatagramSocket.class, SocketOption.class ++ ); ++ dsiGetOption.setAccessible(true); ++ } catch (ReflectiveOperationException e) { ++ throw new InternalError(e); ++ } ++ } ++ ++ private static <T> void invokeSet( ++ Method method, Object socket, ++ SocketOption<T> option, T value) throws IOException ++ { ++ try { ++ method.invoke(null, socket, option, value); ++ } catch (Exception e) { ++ if (e instanceof InvocationTargetException) { ++ Throwable t = ((InvocationTargetException)e).getTargetException(); ++ if (t instanceof IOException) { ++ throw (IOException)t; ++ } ++ } ++ throw new RuntimeException(e); ++ } ++ } ++ ++ private static <T> T invokeGet( ++ Method method, Object socket, SocketOption<T> option) throws IOException ++ { ++ try { ++ return (T)method.invoke(null, socket, option); ++ } catch (Exception e) { ++ if (e instanceof InvocationTargetException) { ++ Throwable t = ((InvocationTargetException)e).getTargetException(); ++ if (t instanceof IOException) { ++ throw (IOException)t; ++ } ++ } ++ throw new RuntimeException(e); ++ } ++ } ++ ++ private Sockets() {} ++ ++ /** ++ * Sets the value of a socket option on a {@link java.net.Socket} ++ * ++ * @param s the socket ++ * @param name The socket option ++ * @param value The value of the socket option. May be null for some ++ * options. ++ * ++ * @throws UnsupportedOperationException if the socket does not support ++ * the option. ++ * ++ * @throws IllegalArgumentException if the value is not valid for ++ * the option. ++ * ++ * @throws IOException if an I/O error occurs, or socket is closed. ++ * ++ * @throws SecurityException if a security manager is set and the ++ * caller does not have any required permission. ++ * ++ * @throws NullPointerException if name is null ++ * ++ * @see java.net.StandardSocketOptions ++ */ ++ public static <T> void setOption(Socket s, SocketOption<T> name, T value) throws IOException ++ { ++ if (!isSupported(Socket.class, name)) { ++ throw new UnsupportedOperationException(name.name()); ++ } ++ invokeSet(siSetOption, s, name, value); ++ } ++ ++ /** ++ * Returns the value of a socket option from a {@link java.net.Socket} ++ * ++ * @param s the socket ++ * @param name The socket option ++ * ++ * @return The value of the socket option. ++ * ++ * @throws UnsupportedOperationException if the socket does not support ++ * the option. ++ * ++ * @throws IOException if an I/O error occurs ++ * ++ * @throws SecurityException if a security manager is set and the ++ * caller does not have any required permission. ++ * ++ * @throws NullPointerException if name is null ++ * ++ * @see java.net.StandardSocketOptions ++ */ ++ public static <T> T getOption(Socket s, SocketOption<T> name) throws IOException ++ { ++ if (!isSupported(Socket.class, name)) { ++ throw new UnsupportedOperationException(name.name()); ++ } ++ return invokeGet(siGetOption, s, name); ++ } ++ ++ /** ++ * Sets the value of a socket option on a {@link java.net.ServerSocket} ++ * ++ * @param s the socket ++ * @param name The socket option ++ * @param value The value of the socket option. ++ * ++ * @throws UnsupportedOperationException if the socket does not support ++ * the option. ++ * ++ * @throws IllegalArgumentException if the value is not valid for ++ * the option. ++ * ++ * @throws IOException if an I/O error occurs ++ * ++ * @throws NullPointerException if name is null ++ * ++ * @throws SecurityException if a security manager is set and the ++ * caller does not have any required permission. ++ * ++ * @see java.net.StandardSocketOptions ++ */ ++ public static <T> void setOption(ServerSocket s, SocketOption<T> name, T value) throws IOException ++ { ++ if (!isSupported(ServerSocket.class, name)) { ++ throw new UnsupportedOperationException(name.name()); ++ } ++ invokeSet(siSetOption, s, name, value); ++ } ++ ++ /** ++ * Returns the value of a socket option from a {@link java.net.ServerSocket} ++ * ++ * @param s the socket ++ * @param name The socket option ++ * ++ * @return The value of the socket option. ++ * ++ * @throws UnsupportedOperationException if the socket does not support ++ * the option. ++ * ++ * @throws IOException if an I/O error occurs ++ * ++ * @throws NullPointerException if name is null ++ * ++ * @throws SecurityException if a security manager is set and the ++ * caller does not have any required permission. ++ * ++ * @see java.net.StandardSocketOptions ++ */ ++ public static <T> T getOption(ServerSocket s, SocketOption<T> name) throws IOException ++ { ++ if (!isSupported(ServerSocket.class, name)) { ++ throw new UnsupportedOperationException(name.name()); ++ } ++ return invokeGet(siGetOption, s, name); ++ } ++ ++ /** ++ * Sets the value of a socket option on a {@link java.net.DatagramSocket} ++ * or {@link java.net.MulticastSocket} ++ * ++ * @param s the socket ++ * @param name The socket option ++ * @param value The value of the socket option. ++ * ++ * @throws UnsupportedOperationException if the socket does not support ++ * the option. ++ * ++ * @throws IllegalArgumentException if the value is not valid for ++ * the option. ++ * ++ * @throws IOException if an I/O error occurs ++ * ++ * @throws NullPointerException if name is null ++ * ++ * @throws SecurityException if a security manager is set and the ++ * caller does not have any required permission. ++ * ++ * @see java.net.StandardSocketOptions ++ */ ++ public static <T> void setOption(DatagramSocket s, SocketOption<T> name, T value) throws IOException ++ { ++ if (!isSupported(s.getClass(), name)) { ++ throw new UnsupportedOperationException(name.name()); ++ } ++ invokeSet(dsiSetOption, s, name, value); ++ } ++ ++ /** ++ * Returns the value of a socket option from a ++ * {@link java.net.DatagramSocket} or {@link java.net.MulticastSocket} ++ * ++ * @param s the socket ++ * @param name The socket option ++ * ++ * @return The value of the socket option. ++ * ++ * @throws UnsupportedOperationException if the socket does not support ++ * the option. ++ * ++ * @throws IOException if an I/O error occurs ++ * ++ * @throws NullPointerException if name is null ++ * ++ * @throws SecurityException if a security manager is set and the ++ * caller does not have any required permission. ++ * ++ * @see java.net.StandardSocketOptions ++ */ ++ public static <T> T getOption(DatagramSocket s, SocketOption<T> name) throws IOException ++ { ++ if (!isSupported(s.getClass(), name)) { ++ throw new UnsupportedOperationException(name.name()); ++ } ++ return invokeGet(dsiGetOption, s, name); ++ } ++ ++ /** ++ * Returns a set of {@link java.net.SocketOption}s supported by the ++ * given socket type. This set may include standard options and also ++ * non standard extended options. ++ * ++ * @param socketType the type of java.net socket ++ * ++ * @throws IllegalArgumentException if socketType is not a valid ++ * socket type from the java.net package. ++ */ ++ public static Set<SocketOption<?>> supportedOptions(Class<?> socketType) { ++ Set<SocketOption<?>> set = options.get(socketType); ++ if (set == null) { ++ throw new IllegalArgumentException("unknown socket type"); ++ } ++ return set; ++ } ++ ++ private static boolean isSupported(Class<?> type, SocketOption<?> option) { ++ Set<SocketOption<?>> options = supportedOptions(type); ++ return options.contains(option); ++ } ++ ++ private static void initOptionSets() { ++ boolean flowsupported = ExtendedOptionsImpl.flowSupported(); ++ ++ // Socket ++ ++ Set<SocketOption<?>> set = new HashSet<>(); ++ set.add(StandardSocketOptions.SO_KEEPALIVE); ++ set.add(StandardSocketOptions.SO_SNDBUF); ++ set.add(StandardSocketOptions.SO_RCVBUF); ++ set.add(StandardSocketOptions.SO_REUSEADDR); ++ set.add(StandardSocketOptions.SO_LINGER); ++ set.add(StandardSocketOptions.IP_TOS); ++ set.add(StandardSocketOptions.TCP_NODELAY); ++ if (flowsupported) { ++ set.add(ExtendedSocketOptions.SO_FLOW_SLA); ++ } ++ set = Collections.unmodifiableSet(set); ++ options.put(Socket.class, set); ++ ++ // ServerSocket ++ ++ set = new HashSet<>(); ++ set.add(StandardSocketOptions.SO_RCVBUF); ++ set.add(StandardSocketOptions.SO_REUSEADDR); ++ set = Collections.unmodifiableSet(set); ++ options.put(ServerSocket.class, set); ++ ++ // DatagramSocket ++ ++ set = new HashSet<>(); ++ set.add(StandardSocketOptions.SO_SNDBUF); ++ set.add(StandardSocketOptions.SO_RCVBUF); ++ set.add(StandardSocketOptions.SO_REUSEADDR); ++ set.add(StandardSocketOptions.IP_TOS); ++ if (flowsupported) { ++ set.add(ExtendedSocketOptions.SO_FLOW_SLA); ++ } ++ set = Collections.unmodifiableSet(set); ++ options.put(DatagramSocket.class, set); ++ ++ // MulticastSocket ++ ++ set = new HashSet<>(); ++ set.add(StandardSocketOptions.SO_SNDBUF); ++ set.add(StandardSocketOptions.SO_RCVBUF); ++ set.add(StandardSocketOptions.SO_REUSEADDR); ++ set.add(StandardSocketOptions.IP_TOS); ++ set.add(StandardSocketOptions.IP_MULTICAST_IF); ++ set.add(StandardSocketOptions.IP_MULTICAST_TTL); ++ set.add(StandardSocketOptions.IP_MULTICAST_LOOP); ++ if (flowsupported) { ++ set.add(ExtendedSocketOptions.SO_FLOW_SLA); ++ } ++ set = Collections.unmodifiableSet(set); ++ options.put(MulticastSocket.class, set); ++ } ++} +--- ./jdk/src/share/classes/jdk/net/package-info.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/jdk/net/package-info.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,32 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * Platform specific socket options for the {@code java.net} and {@code java.nio.channels} ++ * socket classes. ++ */ ++ ++@jdk.Exported ++package jdk.net; +--- ./jdk/src/share/classes/sun/applet/AppletPanel.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/applet/AppletPanel.java Wed Jul 30 18:42:59 2014 +0100 +@@ -28,23 +28,16 @@ + import java.applet.*; + import java.awt.*; + import java.awt.event.*; +-import java.awt.image.ColorModel; +-import java.awt.image.MemoryImageSource; + import java.io.*; + import java.lang.ref.WeakReference; + import java.lang.reflect.InvocationTargetException; + import java.lang.reflect.Method; +-import java.net.InetAddress; + import java.net.JarURLConnection; +-import java.net.MalformedURLException; + import java.net.SocketPermission; + import java.net.URL; +-import java.net.UnknownHostException; + import java.security.*; + import java.util.*; +-import java.util.Collections; + import java.util.Locale; +-import java.util.WeakHashMap; + import sun.awt.AWTAccessor; + import sun.awt.AppContext; + import sun.awt.EmbeddedFrame; +@@ -148,7 +141,9 @@ + abstract protected String getJarFiles(); + abstract protected String getSerializedObject(); + ++ @Override + abstract public int getWidth(); ++ @Override + abstract public int getHeight(); + abstract public boolean hasInitialFocus(); + +@@ -184,6 +179,7 @@ + handler = new Thread(appletGroup, this, "thread " + nm); + // set the context class loader for this thread + AccessController.doPrivileged(new PrivilegedAction() { ++ @Override + public Object run() { + handler.setContextClassLoader(loader); + return null; +@@ -236,6 +232,7 @@ + /** + * Minimum size + */ ++ @Override + public Dimension minimumSize() { + return new Dimension(defaultAppletSize.width, + defaultAppletSize.height); +@@ -244,6 +241,7 @@ + /** + * Preferred size + */ ++ @Override + public Dimension preferredSize() { + return new Dimension(currentAppletSize.width, + currentAppletSize.height); +@@ -368,6 +366,7 @@ + * + * + */ ++ @Override + public void run() { + + Thread curThread = Thread.currentThread(); +@@ -450,6 +449,7 @@ + try { + final AppletPanel p = this; + Runnable r = new Runnable() { ++ @Override + public void run() { + p.validate(); + } +@@ -480,6 +480,7 @@ + final AppletPanel p = this; + final Applet a = applet; + Runnable r = new Runnable() { ++ @Override + public void run() { + p.validate(); + a.setVisible(true); +@@ -515,6 +516,7 @@ + try { + final Applet a = applet; + Runnable r = new Runnable() { ++ @Override + public void run() { + a.setVisible(false); + } +@@ -574,6 +576,7 @@ + try { + final Applet a = applet; + Runnable r = new Runnable() { ++ @Override + public void run() { + remove(a); + } +@@ -628,10 +631,13 @@ + */ + private Component getMostRecentFocusOwnerForWindow(Window w) { + Method meth = (Method)AccessController.doPrivileged(new PrivilegedAction() { ++ @Override + public Object run() { + Method meth = null; + try { +- meth = KeyboardFocusManager.class.getDeclaredMethod("getMostRecentFocusOwner", new Class[] {Window.class}); ++ meth = KeyboardFocusManager.class.getDeclaredMethod( ++ "getMostRecentFocusOwner", ++ new Class[]{Window.class}); + meth.setAccessible(true); + } catch (Exception e) { + // Must never happen +@@ -880,6 +886,7 @@ + /** + * Return true when the applet has been started. + */ ++ @Override + public boolean isActive() { + return status == APPLET_START; + } +@@ -889,6 +896,7 @@ + /** + * Is called when the applet wants to be resized. + */ ++ @Override + public void appletResize(int width, int height) { + currentAppletSize.width = width; + currentAppletSize.height = height; +@@ -904,17 +912,20 @@ + final AppletPanel ap = this; + if (appEvtQ != null){ + appEvtQ.postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), +- new Runnable(){ +- public void run(){ +- if(ap != null) +- { +- ap.dispatchAppletEvent(APPLET_RESIZE, currentSize); ++ new Runnable() { ++ @Override ++ public void run() { ++ if (ap != null) { ++ ap.dispatchAppletEvent( ++ APPLET_RESIZE, ++ currentSize); + } + } + })); + } + } + ++ @Override + public void setBounds(int x, int y, int width, int height) { + super.setBounds(x, y, width, height); + currentAppletSize.width = width; +@@ -966,7 +977,7 @@ + public String getClassLoaderCacheKey() + { + /** +- * Fixed #4501142: Classlaoder sharing policy doesn't ++ * Fixed #4501142: Classloader sharing policy doesn't + * take "archive" into account. This will be overridden + * by Java Plug-in. [stanleyh] + */ +@@ -1012,6 +1023,7 @@ + getAccessControlContext(codebase); + c = (AppletClassLoader) + AccessController.doPrivileged(new PrivilegedAction() { ++ @Override + public Object run() { + AppletClassLoader ac = createClassLoader(codebase); + /* Should the creation of the classloader be +@@ -1055,6 +1067,7 @@ + + PermissionCollection perms = (PermissionCollection) + AccessController.doPrivileged(new PrivilegedAction() { ++ @Override + public Object run() { + Policy p = java.security.Policy.getPolicy(); + if (p != null) { +--- ./jdk/src/share/classes/sun/applet/AppletViewer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/applet/AppletViewer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -33,21 +33,17 @@ + import javax.print.attribute.*; + import java.applet.*; + import java.net.URL; +-import java.net.MalformedURLException; + import java.net.SocketPermission; + import sun.misc.Ref; + import java.security.AccessController; + import java.security.PrivilegedAction; +-import java.lang.reflect.InvocationTargetException; +-import java.lang.reflect.Method; + import sun.awt.SunToolkit; + import sun.awt.AppContext; +-import java.lang.ref.WeakReference; + + /** + * A frame to show the applet tag in. + */ +-class TextFrame extends Frame { ++final class TextFrame extends Frame { + + /** + * Create the tag frame. +@@ -66,6 +62,7 @@ + p.add(b); + + class ActionEventListener implements ActionListener { ++ @Override + public void actionPerformed(ActionEvent evt) { + dispose(); + } +@@ -78,6 +75,7 @@ + + WindowListener windowEventListener = new WindowAdapter() { + ++ @Override + public void windowClosing(WindowEvent evt) { + dispose(); + } +@@ -90,20 +88,22 @@ + } + + /** +- * Lets us construct one using unix-style one shot behaviors ++ * Lets us construct one using unix-style one shot behaviors. + */ ++final class StdAppletViewerFactory implements AppletViewerFactory { + +-class StdAppletViewerFactory implements AppletViewerFactory +-{ ++ @Override + public AppletViewer createAppletViewer(int x, int y, + URL doc, Hashtable atts) { + return new AppletViewer(x, y, doc, atts, System.out, this); + } + ++ @Override + public MenuBar getBaseMenuBar() { + return new MenuBar(); + } + ++ @Override + public boolean isStandalone() { + return true; + } +@@ -116,8 +116,7 @@ + * (The document named appletviewertags.html in the JDK's docs/tooldocs directory, + * once the JDK docs have been installed.) + */ +-public class AppletViewer extends Frame implements AppletContext, +- Printable { ++public class AppletViewer extends Frame implements AppletContext, Printable { + + /** + * Some constants... +@@ -147,13 +146,14 @@ + + + private final class UserActionListener implements ActionListener { ++ @Override + public void actionPerformed(ActionEvent evt) { + processUserAction(evt); + } + } + + /** +- * Create the applet viewer ++ * Create the applet viewer. + */ + public AppletViewer(int x, int y, URL doc, Hashtable atts, + PrintStream statusMsgStream, AppletViewerFactory factory) { +@@ -201,14 +201,17 @@ + + WindowListener windowEventListener = new WindowAdapter() { + ++ @Override + public void windowClosing(WindowEvent evt) { + appletClose(); + } + ++ @Override + public void windowIconified(WindowEvent evt) { + appletStop(); + } + ++ @Override + public void windowDeiconified(WindowEvent evt) { + appletStart(); + } +@@ -223,6 +226,7 @@ + this.frame = frame; + } + ++ @Override + public void appletStateChanged(AppletEvent evt) + { + AppletPanel src = (AppletPanel)evt.getSource(); +@@ -370,6 +374,7 @@ + /** + * Get an audio clip. + */ ++ @Override + public AudioClip getAudioClip(URL url) { + checkConnect(url); + synchronized (audioClips) { +@@ -386,6 +391,7 @@ + /** + * Get an image. + */ ++ @Override + public Image getImage(URL url) { + return getCachedImage(url); + } +@@ -421,6 +427,7 @@ + /** + * Get an applet by name. + */ ++ @Override + public Applet getApplet(String name) { + AppletSecurity security = (AppletSecurity)System.getSecurityManager(); + name = name.toLowerCase(); +@@ -450,6 +457,7 @@ + * Return an enumeration of all the accessible + * applets on this page. + */ ++ @Override + public Enumeration getApplets() { + AppletSecurity security = (AppletSecurity)System.getSecurityManager(); + Vector v = new Vector(); +@@ -473,31 +481,37 @@ + /** + * Ignore. + */ ++ @Override + public void showDocument(URL url) { + } + + /** + * Ignore. + */ ++ @Override + public void showDocument(URL url, String target) { + } + + /** + * Show status. + */ ++ @Override + public void showStatus(String status) { + label.setText(status); + } + ++ @Override + public void setStream(String key, InputStream stream)throws IOException{ + // We do nothing. + } + ++ @Override + public InputStream getStream(String key){ + // We do nothing. + return null; + } + ++ @Override + public Iterator getStreamKeys(){ + // We do nothing. + return null; +@@ -611,7 +625,7 @@ + panel.sendEvent(AppletPanel.APPLET_DISPOSE); + + /** +- * Fixed #4501142: Classlaoder sharing policy doesn't ++ * Fixed #4501142: Classloader sharing policy doesn't + * take "archive" into account. This will be overridden + * by Java Plug-in. [stanleyh] + */ +@@ -640,6 +654,7 @@ + void appletSave() { + AccessController.doPrivileged(new PrivilegedAction() { + ++ @Override + public Object run() { + // XXX: this privileged block should be made smaller + // by initializing a private static variable with "user.dir" +@@ -768,6 +783,7 @@ + } + } + ++ @Override + public int print(Graphics graphics, PageFormat pf, int pageIndex) { + if (pageIndex > 0) { + return Printable.NO_SUCH_PAGE; +@@ -832,6 +848,7 @@ + + new Thread(new Runnable() + { ++ @Override + public void run() + { + appletShutdown(p); +@@ -867,6 +884,7 @@ + // + new Thread(new Runnable() + { ++ @Override + public void run() + { + for (Enumeration e = appletPanels.elements() ; e.hasMoreElements() ;) { +--- ./jdk/src/share/classes/sun/applet/resources/MsgAppletViewer_ja.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/applet/resources/MsgAppletViewer_ja.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -57,9 +57,9 @@ + {"appletviewer.appletinfo.applet", "-- \u30A2\u30D7\u30EC\u30C3\u30C8\u60C5\u5831\u306A\u3057 --"}, + {"appletviewer.appletinfo.param", "-- \u30D1\u30E9\u30E1\u30FC\u30BF\u60C5\u5831\u306A\u3057 --"}, + {"appletviewer.appletinfo.textframe", "\u30A2\u30D7\u30EC\u30C3\u30C8\u60C5\u5831"}, +- {"appletviewer.appletprint.fail", "\u5370\u5237\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002"}, +- {"appletviewer.appletprint.finish", "\u5370\u5237\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002"}, +- {"appletviewer.appletprint.cancel", "\u5370\u5237\u304C\u4E2D\u6B62\u3055\u308C\u307E\u3057\u305F\u3002"}, ++ {"appletviewer.appletprint.fail", "\u5370\u5237\u304C\u5931\u6557\u3057\u307E\u3057\u305F\u3002"}, ++ {"appletviewer.appletprint.finish", "\u5370\u5237\u3092\u7D42\u4E86\u3057\u307E\u3057\u305F\u3002"}, ++ {"appletviewer.appletprint.cancel", "\u5370\u5237\u304C\u53D6\u308A\u6D88\u3055\u308C\u307E\u3057\u305F\u3002"}, + {"appletviewer.appletencoding", "\u6587\u5B57\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0: {0}"}, + {"appletviewer.parse.warning.requiresname", "\u8B66\u544A: <param name=... value=...>\u30BF\u30B0\u306Bname\u5C5E\u6027\u304C\u5FC5\u8981\u3067\u3059\u3002"}, + {"appletviewer.parse.warning.paramoutside", "\u8B66\u544A: <param>\u30BF\u30B0\u304C<applet> ... </applet>\u306E\u5916\u5074\u3067\u3059\u3002"}, +@@ -98,7 +98,7 @@ + {"appletioexception.loadclass.throw.notloaded", "\u30AF\u30E9\u30B9\u304C\u30ED\u30FC\u30C9\u3055\u308C\u307E\u305B\u3093: {0}"}, + {"appletclassloader.loadcode.verbose", "{1}\u3092\u53D6\u5F97\u3059\u308B\u305F\u3081\u306E{0}\u3078\u306E\u30B9\u30C8\u30EA\u30FC\u30E0\u3092\u958B\u304D\u307E\u3059"}, + {"appletclassloader.filenotfound", "{0}\u306E\u691C\u7D22\u4E2D\u306B\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093"}, +- {"appletclassloader.fileformat", "{0}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B\u30D5\u30A1\u30A4\u30EB\u30FB\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F"}, ++ {"appletclassloader.fileformat", "{0}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B\u30D5\u30A1\u30A4\u30EB\u5F62\u5F0F\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F"}, + {"appletclassloader.fileioexception", "{0}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B\u5165\u51FA\u529B\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F"}, + {"appletclassloader.fileexception", "{1}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B{0}\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F"}, + {"appletclassloader.filedeath", "{1}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B{0}\u304C\u5F37\u5236\u7D42\u4E86\u3057\u307E\u3057\u305F"}, +@@ -132,7 +132,7 @@ + {"appletpanel.notdisposed", "\u30ED\u30FC\u30C9: \u30A2\u30D7\u30EC\u30C3\u30C8\u304C\u7834\u68C4\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002"}, + {"appletpanel.bail", "\u4E2D\u65AD\u6E08: \u7D42\u4E86\u3057\u3066\u3044\u307E\u3059\u3002"}, + {"appletpanel.filenotfound", "{0}\u306E\u691C\u7D22\u4E2D\u306B\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093"}, +- {"appletpanel.fileformat", "{0}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B\u30D5\u30A1\u30A4\u30EB\u30FB\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F"}, ++ {"appletpanel.fileformat", "{0}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B\u30D5\u30A1\u30A4\u30EB\u5F62\u5F0F\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F"}, + {"appletpanel.fileioexception", "{0}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B\u5165\u51FA\u529B\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F"}, + {"appletpanel.fileexception", "{1}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B{0}\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F"}, + {"appletpanel.filedeath", "{1}\u306E\u30ED\u30FC\u30C9\u4E2D\u306B{0}\u304C\u5F37\u5236\u7D42\u4E86\u3057\u307E\u3057\u305F"}, +--- ./jdk/src/share/classes/sun/applet/resources/MsgAppletViewer_pt_BR.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/applet/resources/MsgAppletViewer_pt_BR.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -93,7 +93,7 @@ + {"appletviewer.main.nosecmgr", "Advert\u00EAncia: SecurityManager n\u00E3o instalado!"}, + {"appletviewer.main.warning", "Advert\u00EAncia: Nenhum applet iniciado. Certifique-se de que a entrada contenha uma tag <applet>."}, + {"appletviewer.main.warn.prop.overwrite", "Advert\u00EAncia: Substituindo a propriedade do sistema temporariamente a pedido do usu\u00E1rio: chave: {0} valor antigo: {1} valor novo: {2}"}, +- {"appletviewer.main.warn.cantreadprops", "Advert\u00EAncia: N\u00E3o \u00E9 poss\u00EDvel ler o arquivo de propriedades AppletViewer: {0} Usando defaults."}, ++ {"appletviewer.main.warn.cantreadprops", "Advert\u00EAncia: N\u00E3o \u00E9 poss\u00EDvel ler o arquivo de propriedades AppletViewer: {0} Usando padr\u00F5es."}, + {"appletioexception.loadclass.throw.interrupted", "carregamento de classe interrompido: {0}"}, + {"appletioexception.loadclass.throw.notloaded", "classe n\u00E3o carregada: {0}"}, + {"appletclassloader.loadcode.verbose", "Fluxo de abertura para: {0} para obter {1}"}, +--- ./jdk/src/share/classes/sun/applet/resources/MsgAppletViewer_sv.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/applet/resources/MsgAppletViewer_sv.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -85,7 +85,7 @@ + {"appletviewer.main.prop.store", "Anv\u00E4ndarspecifika egenskaper f\u00F6r AppletViewer"}, + {"appletviewer.main.err.prop.cantread", "Kan inte l\u00E4sa egenskapsfilen: {0}"}, + {"appletviewer.main.err.prop.cantsave", "Kan inte spara egenskapsfilen: {0}"}, +- {"appletviewer.main.warn.nosecmgr", "Varning: s\u00E4kerheten inaktiveras."}, ++ {"appletviewer.main.warn.nosecmgr", "Varning! S\u00E4kerheten avaktiveras."}, + {"appletviewer.main.debug.cantfinddebug", "Hittar inte fels\u00F6kningsprogrammet!"}, + {"appletviewer.main.debug.cantfindmain", "Hittar inte huvudmetoden i fels\u00F6kningsprogrammet!"}, + {"appletviewer.main.debug.exceptionindebug", "Undantag i fels\u00F6kningsprogrammet!"}, +--- ./jdk/src/share/classes/sun/awt/AWTAccessor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/AWTAccessor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,6 +27,7 @@ + + import sun.misc.Unsafe; + ++import javax.accessibility.AccessibleContext; + import java.awt.*; + import java.awt.KeyboardFocusManager; + import java.awt.DefaultKeyboardFocusManager; +@@ -729,6 +730,21 @@ + } + + /* ++ * An accessor object for the SystemColor class ++ */ ++ public interface SystemColorAccessor { ++ void updateSystemColors(); ++ } ++ ++ /* ++ * An accessor object for the AccessibleContext class ++ */ ++ public interface AccessibleContextAccessor { ++ void setAppContext(AccessibleContext accessibleContext, AppContext appContext); ++ AppContext getAppContext(AccessibleContext accessibleContext); ++ } ++ ++ /* + * Accessor instances are initialized in the static initializers of + * corresponding AWT classes by using setters defined below. + */ +@@ -757,6 +773,8 @@ + private static SequencedEventAccessor sequencedEventAccessor; + private static ToolkitAccessor toolkitAccessor; + private static InvocationEventAccessor invocationEventAccessor; ++ private static SystemColorAccessor systemColorAccessor; ++ private static AccessibleContextAccessor accessibleContextAccessor; + + /* + * Set an accessor object for the java.awt.Component class. +@@ -1182,4 +1200,39 @@ + public static InvocationEventAccessor getInvocationEventAccessor() { + return invocationEventAccessor; + } ++ ++ /* ++ * Get the accessor object for the java.awt.SystemColor class. ++ */ ++ public static SystemColorAccessor getSystemColorAccessor() { ++ if (systemColorAccessor == null) { ++ unsafe.ensureClassInitialized(SystemColor.class); ++ } ++ ++ return systemColorAccessor; ++ } ++ ++ /* ++ * Set the accessor object for the java.awt.SystemColor class. ++ */ ++ public static void setSystemColorAccessor(SystemColorAccessor systemColorAccessor) { ++ AWTAccessor.systemColorAccessor = systemColorAccessor; ++ } ++ ++ /* ++ * Get the accessor object for the javax.accessibility.AccessibleContext class. ++ */ ++ public static AccessibleContextAccessor getAccessibleContextAccessor() { ++ if (accessibleContextAccessor == null) { ++ unsafe.ensureClassInitialized(AccessibleContext.class); ++ } ++ return accessibleContextAccessor; ++ } ++ ++ /* ++ * Set the accessor object for the javax.accessibility.AccessibleContext class. ++ */ ++ public static void setAccessibleContextAccessor(AccessibleContextAccessor accessor) { ++ AWTAccessor.accessibleContextAccessor = accessor; ++ } + } +--- ./jdk/src/share/classes/sun/awt/AppContext.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/AppContext.java Wed Jul 30 18:42:59 2014 +0100 +@@ -42,11 +42,13 @@ + import java.util.HashSet; + import java.beans.PropertyChangeSupport; + import java.beans.PropertyChangeListener; ++import java.lang.ref.SoftReference; + import sun.util.logging.PlatformLogger; + import java.util.concurrent.locks.Condition; + import java.util.concurrent.locks.Lock; + import java.util.concurrent.locks.ReentrantLock; + import java.util.concurrent.atomic.AtomicInteger; ++import java.util.function.Supplier; + + /** + * The AppContext is a table referenced by ThreadGroup which stores +@@ -897,6 +899,23 @@ + + }); + } ++ ++ public static <T> T getSoftReferenceValue(Object key, ++ Supplier<T> supplier) { ++ ++ final AppContext appContext = AppContext.getAppContext(); ++ SoftReference<T> ref = (SoftReference<T>) appContext.get(key); ++ if (ref != null) { ++ final T object = ref.get(); ++ if (object != null) { ++ return object; ++ } ++ } ++ final T object = supplier.get(); ++ ref = new SoftReference<>(object); ++ appContext.put(key, ref); ++ return object; ++ } + } + + final class MostRecentKeyValue { +--- ./jdk/src/share/classes/sun/awt/HToolkit.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/HToolkit.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -25,6 +25,8 @@ + + package sun.awt; + ++import sun.awt.datatransfer.DataTransferer; ++ + import java.awt.*; + import java.awt.dnd.*; + import java.awt.dnd.peer.DragSourceContextPeer; +@@ -184,6 +186,11 @@ + return false; + } + ++ @Override ++ public DataTransferer getDataTransferer() { ++ return null; ++ } ++ + public GlobalCursorManager getGlobalCursorManager() + throws HeadlessException { + throw new HeadlessException(); +--- ./jdk/src/share/classes/sun/awt/LightweightFrame.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/LightweightFrame.java Wed Jul 30 18:42:59 2014 +0100 +@@ -31,6 +31,7 @@ + import java.awt.Image; + import java.awt.MenuBar; + import java.awt.MenuComponent; ++import java.awt.Rectangle; + import java.awt.Toolkit; + import java.awt.peer.FramePeer; + +@@ -124,4 +125,48 @@ + * @see SunToolkit#ungrab(java.awt.Window) + */ + public abstract void ungrabFocus(); ++ ++ /** ++ * Returns the scale factor of this frame. The default value is 1. ++ * ++ * @return the scale factor ++ * @see #notifyDisplayChanged(int) ++ */ ++ public abstract int getScaleFactor(); ++ ++ /** ++ * Called when display of the hosted frame is changed. ++ * ++ * @param scaleFactor the scale factor ++ */ ++ public abstract void notifyDisplayChanged(int scaleFactor); ++ ++ /** ++ * Host window absolute bounds. ++ */ ++ private int hostX, hostY, hostW, hostH; ++ ++ /** ++ * Returns the absolute bounds of the host (embedding) window. ++ * ++ * @return the host window bounds ++ */ ++ public Rectangle getHostBounds() { ++ if (hostX == 0 && hostY == 0 && hostW == 0 && hostH == 0) { ++ // The client app is probably unaware of the setHostBounds. ++ // A safe fall-back: ++ return getBounds(); ++ } ++ return new Rectangle(hostX, hostY, hostW, hostH); ++ } ++ ++ /** ++ * Sets the absolute bounds of the host (embedding) window. ++ */ ++ public void setHostBounds(int x, int y, int w, int h) { ++ hostX = x; ++ hostY = y; ++ hostW = w; ++ hostH = h; ++ } + } +--- ./jdk/src/share/classes/sun/awt/SunHints.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/SunHints.java Wed Jul 30 18:42:59 2014 +0100 +@@ -172,7 +172,7 @@ + } + } + +- private static final int NUM_KEYS = 9; ++ private static final int NUM_KEYS = 10; + private static final int VALS_PER_KEY = 8; + + /** +@@ -253,6 +253,13 @@ + @Native public static final int INTVAL_STROKE_PURE = 2; + + /** ++ * Image scaling hint key and values ++ */ ++ @Native public static final int INTKEY_RESOLUTION_VARIANT = 9; ++ @Native public static final int INTVAL_RESOLUTION_VARIANT_DEFAULT = 0; ++ @Native public static final int INTVAL_RESOLUTION_VARIANT_OFF = 1; ++ @Native public static final int INTVAL_RESOLUTION_VARIANT_ON = 2; ++ /** + * LCD text contrast control hint key. + * Value is "100" to make discontiguous with the others which + * are all enumerative and are of a different class. +@@ -450,6 +457,24 @@ + SunHints.INTVAL_STROKE_PURE, + "Pure stroke conversion for accurate paths"); + ++ /** ++ * Image resolution variant hint key and value objects ++ */ ++ public static final Key KEY_RESOLUTION_VARIANT = ++ new SunHints.Key(SunHints.INTKEY_RESOLUTION_VARIANT, ++ "Global image resolution variant key"); ++ public static final Object VALUE_RESOLUTION_VARIANT_DEFAULT = ++ new SunHints.Value(KEY_RESOLUTION_VARIANT, ++ SunHints.INTVAL_RESOLUTION_VARIANT_DEFAULT, ++ "Choose image resolutions based on a default heuristic"); ++ public static final Object VALUE_RESOLUTION_VARIANT_OFF = ++ new SunHints.Value(KEY_RESOLUTION_VARIANT, ++ SunHints.INTVAL_RESOLUTION_VARIANT_OFF, ++ "Use only the standard resolution of an image"); ++ public static final Object VALUE_RESOLUTION_VARIANT_ON = ++ new SunHints.Value(KEY_RESOLUTION_VARIANT, ++ SunHints.INTVAL_RESOLUTION_VARIANT_ON, ++ "Always use resolution-specific variants of images"); + + public static class LCDContrastKey extends Key { + +--- ./jdk/src/share/classes/sun/awt/SunToolkit.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/SunToolkit.java Wed Jul 30 18:42:59 2014 +0100 +@@ -36,14 +36,17 @@ + import java.awt.TrayIcon; + import java.awt.SystemTray; + import java.awt.event.InputEvent; ++import java.io.File; ++import java.io.IOException; ++import java.io.InputStream; + import java.net.URL; +-import java.security.PrivilegedAction; + import java.util.*; + import java.util.concurrent.TimeUnit; + import java.util.concurrent.locks.Condition; + import java.util.concurrent.locks.Lock; + import java.util.concurrent.locks.ReentrantLock; + ++import sun.awt.datatransfer.DataTransferer; + import sun.security.util.SecurityConstants; + import sun.util.logging.PlatformLogger; + import sun.misc.SoftCache; +@@ -202,6 +205,8 @@ + + public abstract boolean isTraySupported(); + ++ public abstract DataTransferer getDataTransferer(); ++ + @SuppressWarnings("deprecation") + public abstract FontPeer getFontPeer(String name, int style); + +@@ -717,6 +722,202 @@ + static final SoftCache imgCache = new SoftCache(); + + static Image getImageFromHash(Toolkit tk, URL url) { ++ checkPermissions(url); ++ synchronized (imgCache) { ++ Image img = (Image)imgCache.get(url); ++ if (img == null) { ++ try { ++ img = tk.createImage(new URLImageSource(url)); ++ imgCache.put(url, img); ++ } catch (Exception e) { ++ } ++ } ++ return img; ++ } ++ } ++ ++ static Image getImageFromHash(Toolkit tk, ++ String filename) { ++ checkPermissions(filename); ++ synchronized (imgCache) { ++ Image img = (Image)imgCache.get(filename); ++ if (img == null) { ++ try { ++ img = tk.createImage(new FileImageSource(filename)); ++ imgCache.put(filename, img); ++ } catch (Exception e) { ++ } ++ } ++ return img; ++ } ++ } ++ ++ public Image getImage(String filename) { ++ return getImageFromHash(this, filename); ++ } ++ ++ public Image getImage(URL url) { ++ return getImageFromHash(this, url); ++ } ++ ++ protected Image getImageWithResolutionVariant(String fileName, ++ String resolutionVariantName) { ++ synchronized (imgCache) { ++ Image image = getImageFromHash(this, fileName); ++ if (image instanceof MultiResolutionImage) { ++ return image; ++ } ++ Image resolutionVariant = getImageFromHash(this, resolutionVariantName); ++ image = createImageWithResolutionVariant(image, resolutionVariant); ++ imgCache.put(fileName, image); ++ return image; ++ } ++ } ++ ++ protected Image getImageWithResolutionVariant(URL url, ++ URL resolutionVariantURL) { ++ synchronized (imgCache) { ++ Image image = getImageFromHash(this, url); ++ if (image instanceof MultiResolutionImage) { ++ return image; ++ } ++ Image resolutionVariant = getImageFromHash(this, resolutionVariantURL); ++ image = createImageWithResolutionVariant(image, resolutionVariant); ++ imgCache.put(url, image); ++ return image; ++ } ++ } ++ ++ ++ public Image createImage(String filename) { ++ checkPermissions(filename); ++ return createImage(new FileImageSource(filename)); ++ } ++ ++ public Image createImage(URL url) { ++ checkPermissions(url); ++ return createImage(new URLImageSource(url)); ++ } ++ ++ public Image createImage(byte[] data, int offset, int length) { ++ return createImage(new ByteArrayImageSource(data, offset, length)); ++ } ++ ++ public Image createImage(ImageProducer producer) { ++ return new ToolkitImage(producer); ++ } ++ ++ public static Image createImageWithResolutionVariant(Image image, ++ Image resolutionVariant) { ++ return new MultiResolutionToolkitImage(image, resolutionVariant); ++ } ++ ++ public int checkImage(Image img, int w, int h, ImageObserver o) { ++ if (!(img instanceof ToolkitImage)) { ++ return ImageObserver.ALLBITS; ++ } ++ ++ ToolkitImage tkimg = (ToolkitImage)img; ++ int repbits; ++ if (w == 0 || h == 0) { ++ repbits = ImageObserver.ALLBITS; ++ } else { ++ repbits = tkimg.getImageRep().check(o); ++ } ++ return (tkimg.check(o) | repbits) & checkResolutionVariant(img, w, h, o); ++ } ++ ++ public boolean prepareImage(Image img, int w, int h, ImageObserver o) { ++ if (w == 0 || h == 0) { ++ return true; ++ } ++ ++ // Must be a ToolkitImage ++ if (!(img instanceof ToolkitImage)) { ++ return true; ++ } ++ ++ ToolkitImage tkimg = (ToolkitImage)img; ++ if (tkimg.hasError()) { ++ if (o != null) { ++ o.imageUpdate(img, ImageObserver.ERROR|ImageObserver.ABORT, ++ -1, -1, -1, -1); ++ } ++ return false; ++ } ++ ImageRepresentation ir = tkimg.getImageRep(); ++ return ir.prepare(o) & prepareResolutionVariant(img, w, h, o); ++ } ++ ++ private int checkResolutionVariant(Image img, int w, int h, ImageObserver o) { ++ ToolkitImage rvImage = getResolutionVariant(img); ++ int rvw = getRVSize(w); ++ int rvh = getRVSize(h); ++ // Ignore the resolution variant in case of error ++ return (rvImage == null || rvImage.hasError()) ? 0xFFFF : ++ checkImage(rvImage, rvw, rvh, MultiResolutionToolkitImage. ++ getResolutionVariantObserver( ++ img, o, w, h, rvw, rvh, true)); ++ } ++ ++ private boolean prepareResolutionVariant(Image img, int w, int h, ++ ImageObserver o) { ++ ++ ToolkitImage rvImage = getResolutionVariant(img); ++ int rvw = getRVSize(w); ++ int rvh = getRVSize(h); ++ // Ignore the resolution variant in case of error ++ return rvImage == null || rvImage.hasError() || prepareImage( ++ rvImage, rvw, rvh, ++ MultiResolutionToolkitImage.getResolutionVariantObserver( ++ img, o, w, h, rvw, rvh, true)); ++ } ++ ++ private static int getRVSize(int size){ ++ return size == -1 ? -1 : 2 * size; ++ } ++ ++ private static ToolkitImage getResolutionVariant(Image image) { ++ if (image instanceof MultiResolutionToolkitImage) { ++ Image resolutionVariant = ((MultiResolutionToolkitImage) image). ++ getResolutionVariant(); ++ if (resolutionVariant instanceof ToolkitImage) { ++ return (ToolkitImage) resolutionVariant; ++ } ++ } ++ return null; ++ } ++ ++ protected static boolean imageCached(Object key) { ++ return imgCache.containsKey(key); ++ } ++ ++ protected static boolean imageExists(String filename) { ++ checkPermissions(filename); ++ return filename != null && new File(filename).exists(); ++ } ++ ++ @SuppressWarnings("try") ++ protected static boolean imageExists(URL url) { ++ checkPermissions(url); ++ if (url != null) { ++ try (InputStream is = url.openStream()) { ++ return true; ++ }catch(IOException e){ ++ return false; ++ } ++ } ++ return false; ++ } ++ ++ private static void checkPermissions(String filename) { ++ SecurityManager security = System.getSecurityManager(); ++ if (security != null) { ++ security.checkRead(filename); ++ } ++ } ++ ++ private static void checkPermissions(URL url) { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + try { +@@ -744,128 +945,6 @@ + sm.checkConnect(url.getHost(), url.getPort()); + } + } +- synchronized (imgCache) { +- Image img = (Image)imgCache.get(url); +- if (img == null) { +- try { +- img = tk.createImage(new URLImageSource(url)); +- imgCache.put(url, img); +- } catch (Exception e) { +- } +- } +- return img; +- } +- } +- +- static Image getImageFromHash(Toolkit tk, +- String filename) { +- SecurityManager security = System.getSecurityManager(); +- if (security != null) { +- security.checkRead(filename); +- } +- synchronized (imgCache) { +- Image img = (Image)imgCache.get(filename); +- if (img == null) { +- try { +- img = tk.createImage(new FileImageSource(filename)); +- imgCache.put(filename, img); +- } catch (Exception e) { +- } +- } +- return img; +- } +- } +- +- public Image getImage(String filename) { +- return getImageFromHash(this, filename); +- } +- +- public Image getImage(URL url) { +- return getImageFromHash(this, url); +- } +- +- public Image createImage(String filename) { +- SecurityManager security = System.getSecurityManager(); +- if (security != null) { +- security.checkRead(filename); +- } +- return createImage(new FileImageSource(filename)); +- } +- +- public Image createImage(URL url) { +- SecurityManager sm = System.getSecurityManager(); +- if (sm != null) { +- try { +- java.security.Permission perm = +- URLUtil.getConnectPermission(url); +- if (perm != null) { +- try { +- sm.checkPermission(perm); +- } catch (SecurityException se) { +- // fallback to checkRead/checkConnect for pre 1.2 +- // security managers +- if ((perm instanceof java.io.FilePermission) && +- perm.getActions().indexOf("read") != -1) { +- sm.checkRead(perm.getName()); +- } else if ((perm instanceof +- java.net.SocketPermission) && +- perm.getActions().indexOf("connect") != -1) { +- sm.checkConnect(url.getHost(), url.getPort()); +- } else { +- throw se; +- } +- } +- } +- } catch (java.io.IOException ioe) { +- sm.checkConnect(url.getHost(), url.getPort()); +- } +- } +- return createImage(new URLImageSource(url)); +- } +- +- public Image createImage(byte[] data, int offset, int length) { +- return createImage(new ByteArrayImageSource(data, offset, length)); +- } +- +- public Image createImage(ImageProducer producer) { +- return new ToolkitImage(producer); +- } +- +- public int checkImage(Image img, int w, int h, ImageObserver o) { +- if (!(img instanceof ToolkitImage)) { +- return ImageObserver.ALLBITS; +- } +- +- ToolkitImage tkimg = (ToolkitImage)img; +- int repbits; +- if (w == 0 || h == 0) { +- repbits = ImageObserver.ALLBITS; +- } else { +- repbits = tkimg.getImageRep().check(o); +- } +- return tkimg.check(o) | repbits; +- } +- +- public boolean prepareImage(Image img, int w, int h, ImageObserver o) { +- if (w == 0 || h == 0) { +- return true; +- } +- +- // Must be a ToolkitImage +- if (!(img instanceof ToolkitImage)) { +- return true; +- } +- +- ToolkitImage tkimg = (ToolkitImage)img; +- if (tkimg.hasError()) { +- if (o != null) { +- o.imageUpdate(img, ImageObserver.ERROR|ImageObserver.ABORT, +- -1, -1, -1, -1); +- } +- return false; +- } +- ImageRepresentation ir = tkimg.getImageRep(); +- return ir.prepare(o); + } + + /** +@@ -1124,19 +1203,6 @@ + return getStartupLocale(); + } + +- private static String dataTransfererClassName = null; +- +- protected static void setDataTransfererClassName(String className) { +- dataTransfererClassName = className; +- } +- +- public static String getDataTransfererClassName() { +- if (dataTransfererClassName == null) { +- Toolkit.getDefaultToolkit(); // transferer set during toolkit init +- } +- return dataTransfererClassName; +- } +- + // Support for window closing event notifications + private transient WindowClosingListener windowClosingListener = null; + /** +--- ./jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -25,10 +25,10 @@ + + package sun.awt.datatransfer; + +-import java.awt.AWTError; + import java.awt.EventQueue; ++import java.awt.Graphics; + import java.awt.Image; +-import java.awt.Graphics; ++import java.awt.Toolkit; + + import java.awt.datatransfer.DataFlavor; + import java.awt.datatransfer.FlavorMap; +@@ -138,16 +138,6 @@ + public abstract class DataTransferer { + + /** +- * Cached value of Class.forName("[C"); +- */ +- public static final Class charArrayClass; +- +- /** +- * Cached value of Class.forName("[B"); +- */ +- public static final Class byteArrayClass; +- +- /** + * The <code>DataFlavor</code> representing plain text with Unicode + * encoding, where: + * <pre> +@@ -241,15 +231,6 @@ + private static final PlatformLogger dtLog = PlatformLogger.getLogger("sun.awt.datatransfer.DataTransfer"); + + static { +- Class tCharArrayClass = null, tByteArrayClass = null; +- try { +- tCharArrayClass = Class.forName("[C"); +- tByteArrayClass = Class.forName("[B"); +- } catch (ClassNotFoundException cannotHappen) { +- } +- charArrayClass = tCharArrayClass; +- byteArrayClass = tByteArrayClass; +- + DataFlavor tPlainTextStringFlavor = null; + try { + tPlainTextStringFlavor = new DataFlavor +@@ -290,63 +271,8 @@ + * that in a headless environment, there may be no DataTransferer instance; + * instead, null will be returned. + */ +- public static DataTransferer getInstance() { +- synchronized (DataTransferer.class) { +- if (transferer == null) { +- final String name = SunToolkit.getDataTransfererClassName(); +- if (name != null) { +- PrivilegedAction<DataTransferer> action = new PrivilegedAction<DataTransferer>() +- { +- public DataTransferer run() { +- Class cls = null; +- Method method = null; +- DataTransferer ret = null; +- +- try { +- cls = Class.forName(name); +- } catch (ClassNotFoundException e) { +- ClassLoader cl = ClassLoader. +- getSystemClassLoader(); +- if (cl != null) { +- try { +- cls = cl.loadClass(name); +- } catch (ClassNotFoundException ee) { +- ee.printStackTrace(); +- throw new AWTError("DataTransferer not found: " + name); +- } +- } +- } +- if (cls != null) { +- try { +- method = cls.getDeclaredMethod("getInstanceImpl"); +- method.setAccessible(true); +- } catch (NoSuchMethodException e) { +- e.printStackTrace(); +- throw new AWTError("Cannot instantiate DataTransferer: " + name); +- } catch (SecurityException e) { +- e.printStackTrace(); +- throw new AWTError("Access is denied for DataTransferer: " + name); +- } +- } +- if (method != null) { +- try { +- ret = (DataTransferer) method.invoke(null); +- } catch (InvocationTargetException e) { +- e.printStackTrace(); +- throw new AWTError("Cannot instantiate DataTransferer: " + name); +- } catch (IllegalAccessException e) { +- e.printStackTrace(); +- throw new AWTError("Cannot access DataTransferer: " + name); +- } +- } +- return ret; +- } +- }; +- transferer = AccessController.doPrivileged(action); +- } +- } +- } +- return transferer; ++ public static synchronized DataTransferer getInstance() { ++ return ((SunToolkit) Toolkit.getDefaultToolkit()).getDataTransferer(); + } + + /** +@@ -459,14 +385,14 @@ + if (flavor.isRepresentationClassReader() || + String.class.equals(rep_class) || + flavor.isRepresentationClassCharBuffer() || +- DataTransferer.charArrayClass.equals(rep_class)) ++ char[].class.equals(rep_class)) + { + return true; + } + + if (!(flavor.isRepresentationClassInputStream() || + flavor.isRepresentationClassByteBuffer() || +- DataTransferer.byteArrayClass.equals(rep_class))) { ++ byte[].class.equals(rep_class))) { + return false; + } + +@@ -490,8 +416,7 @@ + + return (flavor.isRepresentationClassInputStream() || + flavor.isRepresentationClassByteBuffer() || +- DataTransferer.byteArrayClass. +- equals(flavor.getRepresentationClass())); ++ byte[].class.equals(flavor.getRepresentationClass())); + } + + /** +@@ -1243,7 +1168,7 @@ + format); + + // Source data is a char array. Convert to a String and recur. +- } else if (charArrayClass.equals(flavor.getRepresentationClass())) { ++ } else if (char[].class.equals(flavor.getRepresentationClass())) { + if (!(isFlavorCharsetTextType(flavor) && isTextFormat(format))) { + throw new IOException + ("cannot transfer non-text data as char array"); +@@ -1274,7 +1199,7 @@ + // Source data is a byte array. For arbitrary flavors, simply return + // the array. For text flavors, decode back to a String and recur to + // reencode according to the requested format. +- } else if (byteArrayClass.equals(flavor.getRepresentationClass())) { ++ } else if (byte[].class.equals(flavor.getRepresentationClass())) { + byte[] bytes = (byte[])obj; + + if (isFlavorCharsetTextType(flavor) && isTextFormat(format)) { +@@ -1651,7 +1576,7 @@ + + // Target data is a char array. Recur to obtain String and convert to + // char array. +- } else if (charArrayClass.equals(flavor.getRepresentationClass())) { ++ } else if (char[].class.equals(flavor.getRepresentationClass())) { + if (!(isFlavorCharsetTextType(flavor) && isTextFormat(format))) { + throw new IOException + ("cannot transfer non-text data as char array"); +@@ -1679,7 +1604,7 @@ + // the raw bytes. For text flavors, convert to a String to strip + // terminators and search-and-replace EOLN, then reencode according to + // the requested flavor. +- } else if (byteArrayClass.equals(flavor.getRepresentationClass())) { ++ } else if (byte[].class.equals(flavor.getRepresentationClass())) { + if (isFlavorCharsetTextType(flavor) && isTextFormat(format)) { + theObject = translateBytesToString( + bytes, format, localeTransferable +@@ -1807,7 +1732,7 @@ + + theObject = constructFlavoredObject(reader, flavor, Reader.class); + // Target data is a byte array +- } else if (byteArrayClass.equals(flavor.getRepresentationClass())) { ++ } else if (byte[].class.equals(flavor.getRepresentationClass())) { + if(isFlavorCharsetTextType(flavor) && isTextFormat(format)) { + theObject = translateBytesToString(inputStreamToByteArray(str), format, localeTransferable) + .getBytes(DataTransferer.getTextCharset(flavor)); +@@ -2857,7 +2782,7 @@ + HashMap decodedTextRepresentationsMap = new HashMap(4, 1.0f); + + decodedTextRepresentationsMap.put +- (DataTransferer.charArrayClass, Integer.valueOf(0)); ++ (char[].class, Integer.valueOf(0)); + decodedTextRepresentationsMap.put + (java.nio.CharBuffer.class, Integer.valueOf(1)); + decodedTextRepresentationsMap.put +@@ -2873,7 +2798,7 @@ + HashMap encodedTextRepresentationsMap = new HashMap(3, 1.0f); + + encodedTextRepresentationsMap.put +- (DataTransferer.byteArrayClass, Integer.valueOf(0)); ++ (byte[].class, Integer.valueOf(0)); + encodedTextRepresentationsMap.put + (java.nio.ByteBuffer.class, Integer.valueOf(1)); + encodedTextRepresentationsMap.put +--- ./jdk/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/dnd/SunDropTargetContextPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -239,6 +239,13 @@ + + if (localTransferable != null) { + return localTransferable.getTransferData(df); ++ } else if (df.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType)) { ++ // Workaround to JDK-8024061: Exception thrown when drag and drop ++ // between two components is executed quickly. ++ // It is expected localTransferable is not null if javaJVMLocalObjectMimeType ++ // is used. Executing further results in ClassCastException, so null is ++ // returned here as no transfer data is available in this case. ++ return null; + } + + if (dropStatus != STATUS_ACCEPT || dropComplete) { +@@ -627,14 +634,14 @@ + if (dropOperation == DnDConstants.ACTION_NONE) + throw new IllegalArgumentException("invalid acceptDrop() action"); + +- if (dropStatus != STATUS_WAIT) { ++ if (dropStatus == STATUS_WAIT || dropStatus == STATUS_ACCEPT) { ++ currentDA = currentA = mapOperation(dropOperation & currentSA); ++ ++ dropStatus = STATUS_ACCEPT; ++ dropComplete = false; ++ } else { + throw new InvalidDnDOperationException("invalid acceptDrop()"); + } +- +- currentDA = currentA = mapOperation(dropOperation & currentSA); +- +- dropStatus = STATUS_ACCEPT; +- dropComplete = false; + } + + /** +--- ./jdk/src/share/classes/sun/awt/image/ByteBandedRaster.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/image/ByteBandedRaster.java Wed Jul 30 18:42:59 2014 +0100 +@@ -755,10 +755,22 @@ + + scanlineStride); + } + +- for (int i = 0; i < data.length; i++) { +- if (scanlineStride > data[i].length) { +- throw new RasterFormatException("Incorrect scanline stride: " +- + scanlineStride); ++ if ((long)minX - sampleModelTranslateX < 0 || ++ (long)minY - sampleModelTranslateY < 0) { ++ ++ throw new RasterFormatException("Incorrect origin/translate: (" + ++ minX + ", " + minY + ") / (" + ++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")"); ++ } ++ ++ ++ if (height > 1 || minY - sampleModelTranslateY > 0) { ++ // buffer should contain at least one scanline ++ for (int i = 0; i < data.length; i++) { ++ if (scanlineStride > data[i].length) { ++ throw new RasterFormatException("Incorrect scanline stride: " ++ + scanlineStride); ++ } + } + } + +--- ./jdk/src/share/classes/sun/awt/image/ByteComponentRaster.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/image/ByteComponentRaster.java Wed Jul 30 18:42:59 2014 +0100 +@@ -885,15 +885,31 @@ + } + } + ++ if ((long)minX - sampleModelTranslateX < 0 || ++ (long)minY - sampleModelTranslateY < 0) { ++ ++ throw new RasterFormatException("Incorrect origin/translate: (" + ++ minX + ", " + minY + ") / (" + ++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")"); ++ } ++ + // we can be sure that width and height are greater than 0 + if (scanlineStride < 0 || +- scanlineStride > (Integer.MAX_VALUE / height) || +- scanlineStride > data.length) ++ scanlineStride > (Integer.MAX_VALUE / height)) + { + // integer overflow + throw new RasterFormatException("Incorrect scanline stride: " + + scanlineStride); + } ++ ++ if (height > 1 || minY - sampleModelTranslateY > 0) { ++ // buffer should contain at least one scanline ++ if (scanlineStride > data.length) { ++ throw new RasterFormatException("Incorrect scanline stride: " ++ + scanlineStride); ++ } ++ } ++ + int lastScanOffset = (height - 1) * scanlineStride; + + if (pixelStride < 0 || +--- ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1386,13 +1386,28 @@ + throw new RasterFormatException("Invalid raster dimension"); + } + ++ if ((long)minX - sampleModelTranslateX < 0 || ++ (long)minY - sampleModelTranslateY < 0) { ++ ++ throw new RasterFormatException("Incorrect origin/translate: (" + ++ minX + ", " + minY + ") / (" + ++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")"); ++ } ++ + if (scanlineStride < 0 || +- scanlineStride > (Integer.MAX_VALUE / height) || +- scanlineStride > data.length) ++ scanlineStride > (Integer.MAX_VALUE / height)) + { + throw new RasterFormatException("Invalid scanline stride"); + } + ++ if (height > 1 || minY - sampleModelTranslateY > 0) { ++ // buffer should contain at least one scanline ++ if (scanlineStride > data.length) { ++ throw new RasterFormatException("Incorrect scanline stride: " ++ + scanlineStride); ++ } ++ } ++ + int lastbit = (dataBitOffset + + (height-1) * scanlineStride * 8 + + (width-1) * pixelBitStride +--- ./jdk/src/share/classes/sun/awt/image/FileImageSource.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/image/FileImageSource.java Wed Jul 30 18:42:59 2014 +0100 +@@ -48,6 +48,10 @@ + } + + protected ImageDecoder getDecoder() { ++ if (imagefile == null) { ++ return null; ++ } ++ + InputStream is; + try { + is = new BufferedInputStream(new FileInputStream(imagefile)); +--- ./jdk/src/share/classes/sun/awt/image/ImageCache.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/sun/awt/image/ImageCache.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,163 @@ ++/* ++ * 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 ++ * 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.awt.image; ++ ++import java.awt.*; ++import java.lang.ref.*; ++import java.util.*; ++import java.util.concurrent.locks.*; ++import sun.awt.AppContext; ++ ++/** ++ * ImageCache - A fixed pixel count sized cache of Images keyed by arbitrary ++ * set of arguments. All images are held with SoftReferences so they will be ++ * dropped by the GC if heap memory gets tight. When our size hits max pixel ++ * count least recently requested images are removed first. ++ * ++ * The ImageCache must be used from the thread with an AppContext only. ++ * ++ */ ++final public class ImageCache { ++ ++ // Ordered Map keyed by args hash, ordered by most recent accessed entry. ++ private final LinkedHashMap<PixelsKey, ImageSoftReference> map ++ = new LinkedHashMap<>(16, 0.75f, true); ++ ++ // Maximum number of pixels to cache, this is used if maxCount ++ private final int maxPixelCount; ++ // The current number of pixels stored in the cache ++ private int currentPixelCount = 0; ++ ++ // Lock for concurrent access to map ++ private final ReadWriteLock lock = new ReentrantReadWriteLock(); ++ // Reference queue for tracking lost softreferences to images in the cache ++ private final ReferenceQueue<Image> referenceQueue = new ReferenceQueue<>(); ++ ++ public static ImageCache getInstance() { ++ return AppContext.getSoftReferenceValue(ImageCache.class, ++ () -> new ImageCache()); ++ } ++ ++ ImageCache(final int maxPixelCount) { ++ this.maxPixelCount = maxPixelCount; ++ } ++ ++ ImageCache() { ++ this((8 * 1024 * 1024) / 4); // 8Mb of pixels ++ } ++ ++ public void flush() { ++ lock.writeLock().lock(); ++ try { ++ map.clear(); ++ } finally { ++ lock.writeLock().unlock(); ++ } ++ } ++ ++ public Image getImage(final PixelsKey key){ ++ final ImageSoftReference ref; ++ lock.readLock().lock(); ++ try { ++ ref = map.get(key); ++ } finally { ++ lock.readLock().unlock(); ++ } ++ return ref == null ? null : ref.get(); ++ } ++ ++ /** ++ * Sets the cached image for the specified constraints. ++ * ++ * @param key The key with which the specified image is to be associated ++ * @param image The image to store in cache ++ */ ++ public void setImage(final PixelsKey key, final Image image) { ++ ++ lock.writeLock().lock(); ++ try { ++ ImageSoftReference ref = map.get(key); ++ ++ // check if currently in map ++ if (ref != null) { ++ if (ref.get() != null) { ++ return; ++ } ++ // soft image has been removed ++ currentPixelCount -= key.getPixelCount(); ++ map.remove(key); ++ }; ++ ++ ++ // add new image to pixel count ++ final int newPixelCount = key.getPixelCount(); ++ currentPixelCount += newPixelCount; ++ // clean out lost references if not enough space ++ if (currentPixelCount > maxPixelCount) { ++ while ((ref = (ImageSoftReference)referenceQueue.poll()) != null) { ++ //reference lost ++ map.remove(ref.key); ++ currentPixelCount -= ref.key.getPixelCount(); ++ } ++ } ++ ++ // remove old items till there is enough free space ++ if (currentPixelCount > maxPixelCount) { ++ final Iterator<Map.Entry<PixelsKey, ImageSoftReference>> ++ mapIter = map.entrySet().iterator(); ++ while ((currentPixelCount > maxPixelCount) && mapIter.hasNext()) { ++ final Map.Entry<PixelsKey, ImageSoftReference> entry = ++ mapIter.next(); ++ mapIter.remove(); ++ final Image img = entry.getValue().get(); ++ if (img != null) img.flush(); ++ currentPixelCount -= entry.getValue().key.getPixelCount(); ++ } ++ } ++ ++ // finally put new in map ++ map.put(key, new ImageSoftReference(key, image, referenceQueue)); ++ } finally { ++ lock.writeLock().unlock(); ++ } ++ } ++ ++ public interface PixelsKey { ++ ++ int getPixelCount(); ++ } ++ ++ private static class ImageSoftReference extends SoftReference<Image> { ++ ++ final PixelsKey key; ++ ++ ImageSoftReference(final PixelsKey key, final Image referent, ++ final ReferenceQueue<? super Image> q) { ++ super(referent, q); ++ this.key = key; ++ } ++ } ++} +--- ./jdk/src/share/classes/sun/awt/image/IntegerComponentRaster.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/image/IntegerComponentRaster.java Wed Jul 30 18:42:59 2014 +0100 +@@ -654,15 +654,31 @@ + ") must be >= 0"); + } + ++ if ((long)minX - sampleModelTranslateX < 0 || ++ (long)minY - sampleModelTranslateY < 0) { ++ ++ throw new RasterFormatException("Incorrect origin/translate: (" + ++ minX + ", " + minY + ") / (" + ++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")"); ++ } ++ + // we can be sure that width and height are greater than 0 + if (scanlineStride < 0 || +- scanlineStride > (Integer.MAX_VALUE / height) || +- scanlineStride > data.length) ++ scanlineStride > (Integer.MAX_VALUE / height)) + { + // integer overflow + throw new RasterFormatException("Incorrect scanline stride: " + + scanlineStride); + } ++ ++ if (height > 1 || minY - sampleModelTranslateY > 0) { ++ // buffer should contain at least one scanline ++ if (scanlineStride > data.length) { ++ throw new RasterFormatException("Incorrect scanline stride: " ++ + scanlineStride); ++ } ++ } ++ + int lastScanOffset = (height - 1) * scanlineStride; + + if (pixelStride < 0 || +--- ./jdk/src/share/classes/sun/awt/image/MultiResolutionBufferedImage.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/sun/awt/image/MultiResolutionBufferedImage.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,185 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package sun.awt.image; ++ ++import java.awt.Dimension; ++import java.awt.Image; ++import java.awt.Graphics; ++import java.awt.geom.Dimension2D; ++import java.awt.image.BufferedImage; ++import java.awt.image.ImageObserver; ++import java.util.Arrays; ++import java.util.List; ++import java.util.function.Function; ++import java.util.function.BiFunction; ++import java.util.stream.Collectors; ++ ++public class MultiResolutionBufferedImage extends BufferedImage ++ implements MultiResolutionImage { ++ ++ private final BiFunction<Integer, Integer, Image> mapper; ++ private final Dimension2D[] sizes; ++ private int availableInfo; ++ ++ public MultiResolutionBufferedImage(Image baseImage, ++ BiFunction<Integer, Integer, Image> mapper) { ++ this(baseImage, new Dimension[]{new Dimension( ++ baseImage.getWidth(null), baseImage.getHeight(null)) ++ }, mapper); ++ } ++ ++ public MultiResolutionBufferedImage(Image baseImage, ++ Dimension2D[] sizes, BiFunction<Integer, Integer, Image> mapper) { ++ super(baseImage.getWidth(null), baseImage.getHeight(null), ++ BufferedImage.TYPE_INT_ARGB_PRE); ++ this.sizes = sizes; ++ this.mapper = mapper; ++ this.availableInfo = getInfo(baseImage); ++ Graphics g = getGraphics(); ++ g.drawImage(baseImage, 0, 0, null); ++ g.dispose(); ++ } ++ ++ @Override ++ public Image getResolutionVariant(int width, int height) { ++ int baseWidth = getWidth(); ++ int baseHeight = getHeight(); ++ ++ if (baseWidth == width && baseHeight == height) { ++ return this; ++ } ++ ++ ImageCache cache = ImageCache.getInstance(); ++ ImageCacheKey key = new ImageCacheKey(this, width, height); ++ Image resolutionVariant = cache.getImage(key); ++ if (resolutionVariant == null) { ++ resolutionVariant = mapper.apply(width, height); ++ cache.setImage(key, resolutionVariant); ++ preload(resolutionVariant, availableInfo); ++ } ++ ++ return resolutionVariant; ++ } ++ ++ @Override ++ public List<Image> getResolutionVariants() { ++ return Arrays.stream(sizes).map((Function<Dimension2D, Image>) size ++ -> getResolutionVariant((int) size.getWidth(), ++ (int) size.getHeight())).collect(Collectors.toList()); ++ } ++ ++ public MultiResolutionBufferedImage map(Function<Image, Image> mapper) { ++ return new MultiResolutionBufferedImage(mapper.apply(this), sizes, ++ (width, height) -> ++ mapper.apply(getResolutionVariant(width, height))); ++ } ++ ++ @Override ++ public int getWidth(ImageObserver observer) { ++ availableInfo |= ImageObserver.WIDTH; ++ return super.getWidth(observer); ++ } ++ ++ @Override ++ public int getHeight(ImageObserver observer) { ++ availableInfo |= ImageObserver.HEIGHT; ++ return super.getHeight(observer); ++ } ++ ++ @Override ++ public Object getProperty(String name, ImageObserver observer) { ++ availableInfo |= ImageObserver.PROPERTIES; ++ return super.getProperty(name, observer); ++ } ++ ++ private static int getInfo(Image image) { ++ if (image instanceof ToolkitImage) { ++ return ((ToolkitImage) image).getImageRep().check( ++ (img, infoflags, x, y, w, h) -> false); ++ } ++ return 0; ++ } ++ ++ private static void preload(Image image, int availableInfo) { ++ if (availableInfo != 0 && image instanceof ToolkitImage) { ++ ((ToolkitImage) image).preload(new ImageObserver() { ++ int flags = availableInfo; ++ ++ @Override ++ public boolean imageUpdate(Image img, int infoflags, ++ int x, int y, int width, int height) { ++ flags &= ~infoflags; ++ return (flags != 0) && ((infoflags ++ & (ImageObserver.ERROR | ImageObserver.ABORT)) == 0); ++ } ++ }); ++ } ++ } ++ ++ private static class ImageCacheKey implements ImageCache.PixelsKey { ++ ++ private final int pixelCount; ++ private final int hash; ++ ++ private final int w; ++ private final int h; ++ private final Image baseImage; ++ ++ ImageCacheKey(final Image baseImage, ++ final int w, final int h) { ++ this.baseImage = baseImage; ++ this.w = w; ++ this.h = h; ++ this.pixelCount = w * h; ++ hash = hash(); ++ } ++ ++ @Override ++ public int getPixelCount() { ++ return pixelCount; ++ } ++ ++ private int hash() { ++ int hash = baseImage.hashCode(); ++ hash = 31 * hash + w; ++ hash = 31 * hash + h; ++ return hash; ++ } ++ ++ @Override ++ public int hashCode() { ++ return hash; ++ } ++ ++ @Override ++ public boolean equals(Object obj) { ++ if (obj instanceof ImageCacheKey) { ++ ImageCacheKey key = (ImageCacheKey) obj; ++ return baseImage == key.baseImage && w == key.w && h == key.h; ++ } ++ return false; ++ } ++ } ++} +\ No newline at end of file +--- ./jdk/src/share/classes/sun/awt/image/MultiResolutionImage.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/sun/awt/image/MultiResolutionImage.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,83 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package sun.awt.image; ++ ++import java.awt.Image; ++import java.util.List; ++ ++/** ++ * This interface is designed to provide a set of images at various resolutions. ++ * ++ * The <code>MultiResolutionImage</code> interface should be implemented by any ++ * class whose instances are intended to provide image resolution variants ++ * according to the given image width and height. ++ * ++ * For example, ++ * <pre> ++ * {@code ++ * public class ScaledImage extends BufferedImage ++ * implements MultiResolutionImage { ++ * ++ * @Override ++ * public Image getResolutionVariant(int width, int height) { ++ * return ((width <= getWidth() && height <= getHeight())) ++ * ? this : highResolutionImage; ++ * } ++ * ++ * @Override ++ * public List<Image> getResolutionVariants() { ++ * return Arrays.asList(this, highResolutionImage); ++ * } ++ * } ++ * }</pre> ++ * ++ * It is recommended to cache image variants for performance reasons. ++ * ++ * <b>WARNING</b>: This class is an implementation detail. This API may change ++ * between update release, and it may even be removed or be moved in some other ++ * package(s)/class(es). ++ */ ++public interface MultiResolutionImage { ++ ++ /** ++ * Provides an image with necessary resolution which best fits to the given ++ * image width and height. ++ * ++ * @param width the desired image resolution width. ++ * @param height the desired image resolution height. ++ * @return image resolution variant. ++ * ++ * @since JDK1.8 ++ */ ++ public Image getResolutionVariant(int width, int height); ++ ++ /** ++ * Gets list of all resolution variants including the base image ++ * ++ * @return list of resolution variants. ++ * @since JDK1.8 ++ */ ++ public List<Image> getResolutionVariants(); ++} +--- ./jdk/src/share/classes/sun/awt/image/MultiResolutionToolkitImage.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/sun/awt/image/MultiResolutionToolkitImage.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,117 @@ ++/* ++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package sun.awt.image; ++ ++import java.awt.Image; ++import java.awt.image.ImageObserver; ++import java.util.Arrays; ++import java.util.List; ++import sun.misc.SoftCache; ++ ++public class MultiResolutionToolkitImage extends ToolkitImage implements MultiResolutionImage { ++ ++ Image resolutionVariant; ++ ++ public MultiResolutionToolkitImage(Image lowResolutionImage, Image resolutionVariant) { ++ super(lowResolutionImage.getSource()); ++ this.resolutionVariant = resolutionVariant; ++ } ++ ++ @Override ++ public Image getResolutionVariant(int width, int height) { ++ return ((width <= getWidth() && height <= getHeight())) ++ ? this : resolutionVariant; ++ } ++ ++ public Image getResolutionVariant() { ++ return resolutionVariant; ++ } ++ ++ @Override ++ public List<Image> getResolutionVariants() { ++ return Arrays.<Image>asList(this, resolutionVariant); ++ } ++ ++ private static final int BITS_INFO = ImageObserver.SOMEBITS ++ | ImageObserver.FRAMEBITS | ImageObserver.ALLBITS; ++ ++ private static class ObserverCache { ++ ++ static final SoftCache INSTANCE = new SoftCache(); ++ } ++ ++ public static ImageObserver getResolutionVariantObserver( ++ final Image image, final ImageObserver observer, ++ final int imgWidth, final int imgHeight, ++ final int rvWidth, final int rvHeight) { ++ return getResolutionVariantObserver(image, observer, ++ imgWidth, imgHeight, rvWidth, rvHeight, false); ++ } ++ ++ public static ImageObserver getResolutionVariantObserver( ++ final Image image, final ImageObserver observer, ++ final int imgWidth, final int imgHeight, ++ final int rvWidth, final int rvHeight, boolean concatenateInfo) { ++ ++ if (observer == null) { ++ return null; ++ } ++ ++ synchronized (ObserverCache.INSTANCE) { ++ ImageObserver o = (ImageObserver) ObserverCache.INSTANCE.get(image); ++ ++ if (o == null) { ++ ++ o = (Image resolutionVariant, int flags, ++ int x, int y, int width, int height) -> { ++ ++ if ((flags & (ImageObserver.WIDTH | BITS_INFO)) != 0) { ++ width = (width + 1) / 2; ++ } ++ ++ if ((flags & (ImageObserver.HEIGHT | BITS_INFO)) != 0) { ++ height = (height + 1) / 2; ++ } ++ ++ if ((flags & BITS_INFO) != 0) { ++ x /= 2; ++ y /= 2; ++ } ++ ++ if(concatenateInfo){ ++ flags &= ((ToolkitImage) image). ++ getImageRep().check(null); ++ } ++ ++ return observer.imageUpdate( ++ image, flags, x, y, width, height); ++ }; ++ ++ ObserverCache.INSTANCE.put(image, o); ++ } ++ return o; ++ } ++ } ++} +--- ./jdk/src/share/classes/sun/awt/image/ShortBandedRaster.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/image/ShortBandedRaster.java Wed Jul 30 18:42:59 2014 +0100 +@@ -754,10 +754,21 @@ + + scanlineStride); + } + +- for (int i = 0; i < data.length; i++) { +- if (scanlineStride > data[i].length) { +- throw new RasterFormatException("Incorrect scanline stride: " +- + scanlineStride); ++ if ((long)minX - sampleModelTranslateX < 0 || ++ (long)minY - sampleModelTranslateY < 0) { ++ ++ throw new RasterFormatException("Incorrect origin/translate: (" + ++ minX + ", " + minY + ") / (" + ++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")"); ++ } ++ ++ if (height > 1 || minY - sampleModelTranslateY > 0) { ++ // buffer should contain at least one scanline ++ for (int i = 0; i < data.length; i++) { ++ if (scanlineStride > data[i].length) { ++ throw new RasterFormatException("Incorrect scanline stride: " ++ + scanlineStride); ++ } + } + } + +--- ./jdk/src/share/classes/sun/awt/image/ShortComponentRaster.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/image/ShortComponentRaster.java Wed Jul 30 18:42:59 2014 +0100 +@@ -819,15 +819,31 @@ + } + } + ++ if ((long)minX - sampleModelTranslateX < 0 || ++ (long)minY - sampleModelTranslateY < 0) { ++ ++ throw new RasterFormatException("Incorrect origin/translate: (" + ++ minX + ", " + minY + ") / (" + ++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")"); ++ } ++ + // we can be sure that width and height are greater than 0 + if (scanlineStride < 0 || +- scanlineStride > (Integer.MAX_VALUE / height) || +- scanlineStride > data.length) ++ scanlineStride > (Integer.MAX_VALUE / height)) + { + // integer overflow + throw new RasterFormatException("Incorrect scanline stride: " + + scanlineStride); + } ++ ++ if (height > 1 || minY - sampleModelTranslateY > 0) { ++ // buffer should contain at least one scanline ++ if (scanlineStride > data.length) { ++ throw new RasterFormatException("Incorrect scanline stride: " ++ + scanlineStride); ++ } ++ } ++ + int lastScanOffset = (height - 1) * scanlineStride; + + if (pixelStride < 0 || +--- ./jdk/src/share/classes/sun/awt/resources/awt_pt_BR.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/resources/awt_pt_BR.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -44,7 +44,7 @@ + AWT.subtract=Teclado Num\u00E9rico - + AWT.decimal=Teclado Num\u00E9rico . + AWT.divide=Teclado Num\u00E9rico / +-AWT.delete=Deletar ++AWT.delete=Excluir + AWT.numLock=Num Lock + AWT.scrollLock=Scroll Lock + AWT.f1=F1 +@@ -151,7 +151,7 @@ + AWT.undefined=Indefinido + + # Predefined cursor names +-AWT.DefaultCursor=Cursor Default ++AWT.DefaultCursor=Cursor Padr\u00E3o + AWT.CrosshairCursor=Cursor em Forma de Cruz + AWT.TextCursor=Cursor de Texto + AWT.WaitCursor=Cursor em Forma de Ampulheta +@@ -165,9 +165,9 @@ + AWT.EResizeCursor=Cursor de Seta Que Aponta \u00E0 Direita + AWT.HandCursor=Cursor em Forma de M\u00E3o + AWT.MoveCursor=Cursor de Movimento +-AWT.DefaultDragCursor=Cursor Default de Arrastar +-AWT.DefaultNoDropCursor=Cursor Default sem Arrastar +-AWT.DefaultDropCursor=Cursor Default de Soltar ++AWT.DefaultDragCursor=Cursor Padr\u00E3o de Arrastar ++AWT.DefaultNoDropCursor=Cursor Padr\u00E3o sem Arrastar ++AWT.DefaultDropCursor=Cursor Padr\u00E3o de Soltar + + # Input method related strings + AWT.CompositionWindowTitle=Janela de Entrada +--- ./jdk/src/share/classes/sun/awt/shell/ShellFolder.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/shell/ShellFolder.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -199,19 +199,23 @@ + + // Static + +- private static ShellFolderManager shellFolderManager; ++ private static final ShellFolderManager shellFolderManager; + +- private static Invoker invoker; ++ private static final Invoker invoker; + + static { + String managerClassName = (String)Toolkit.getDefaultToolkit(). + getDesktopProperty("Shell.shellFolderManager"); + Class managerClass = null; + try { +- managerClass = Class.forName(managerClassName); ++ managerClass = Class.forName(managerClassName, false, null); ++ if (!ShellFolderManager.class.isAssignableFrom(managerClass)) { ++ managerClass = null; ++ } + // swallow the exceptions below and use default shell folder + } catch(ClassNotFoundException e) { + } catch(NullPointerException e) { ++ } catch(SecurityException e) { + } + + if (managerClass == null) { +--- ./jdk/src/share/classes/sun/font/FontFamily.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/font/FontFamily.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,6 +25,7 @@ + + package sun.font; + ++import java.io.File; + import java.awt.Font; + import java.util.HashMap; + import java.util.concurrent.ConcurrentHashMap; +@@ -105,8 +106,39 @@ + return familyRank; + } + ++ private boolean isFromSameSource(Font2D font) { ++ if (!(font instanceof FileFont)) { ++ return false; ++ } ++ ++ FileFont existingFont = null; ++ if (plain instanceof FileFont) { ++ existingFont = (FileFont)plain; ++ } else if (bold instanceof FileFont) { ++ existingFont = (FileFont)bold; ++ } else if (italic instanceof FileFont) { ++ existingFont = (FileFont)italic; ++ } else if (bolditalic instanceof FileFont) { ++ existingFont = (FileFont)bolditalic; ++ } ++ // A family isn't created until there's a font. ++ // So if we didn't find a file font it means this ++ // isn't a file-based family. ++ if (existingFont == null) { ++ return false; ++ } ++ File existDir = (new File(existingFont.platName)).getParentFile(); ++ ++ FileFont newFont = (FileFont)font; ++ File newDir = (new File(newFont.platName)).getParentFile(); ++ return java.util.Objects.equals(newDir, existDir); ++ } ++ + public void setFont(Font2D font, int style) { +- if (font.getRank() > familyRank) { ++ /* Allow a lower-rank font only if its a file font ++ * from the exact same source as any previous font. ++ */ ++ if ((font.getRank() > familyRank) && !isFromSameSource(font)) { + if (FontUtilities.isLogging()) { + FontUtilities.getLogger() + .warning("Rejecting adding " + font + +--- ./jdk/src/share/classes/sun/font/SunFontManager.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/font/SunFontManager.java Wed Jul 30 18:42:59 2014 +0100 +@@ -764,7 +764,7 @@ + if (family == null) { + family = new FontFamily(familyName, false, rank); + family.setFont(f, f.style); +- } else if (family.getRank() >= rank) { ++ } else { + family.setFont(f, f.style); + } + fullNameToFont.put(fontName.toLowerCase(Locale.ENGLISH), f); +@@ -855,7 +855,7 @@ + if (family == null) { + family = new FontFamily(familyName, false, rank); + family.setFont(newFont, newFont.style); +- } else if (family.getRank() >= rank) { ++ } else { + family.setFont(newFont, newFont.style); + } + return newFont; +--- ./jdk/src/share/classes/sun/invoke/util/ValueConversions.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/invoke/util/ValueConversions.java Wed Jul 30 18:42:59 2014 +0100 +@@ -443,20 +443,6 @@ + return x; + } + +- /** +- * Identity function, with reference cast. +- * @param t an arbitrary reference type +- * @param x an arbitrary reference value +- * @return the same value x +- */ +- @SuppressWarnings("unchecked") +- static <T,U> T castReference(Class<? extends T> t, U x) { +- // inlined Class.cast because we can't ForceInline it +- if (x != null && !t.isInstance(x)) +- throw newClassCastException(t, x); +- return (T) x; +- } +- + private static ClassCastException newClassCastException(Class<?> t, Object obj) { + return new ClassCastException("Cannot cast " + obj.getClass().getName() + " to " + t.getName()); + } +@@ -466,12 +452,10 @@ + static { + try { + MethodType idType = MethodType.genericMethodType(1); +- MethodType castType = idType.insertParameterTypes(0, Class.class); + MethodType ignoreType = idType.changeReturnType(void.class); + MethodType zeroObjectType = MethodType.genericMethodType(0); + IDENTITY = IMPL_LOOKUP.findStatic(THIS_CLASS, "identity", idType); +- //CAST_REFERENCE = IMPL_LOOKUP.findVirtual(Class.class, "cast", idType); +- CAST_REFERENCE = IMPL_LOOKUP.findStatic(THIS_CLASS, "castReference", castType); ++ CAST_REFERENCE = IMPL_LOOKUP.findVirtual(Class.class, "cast", idType); + ZERO_OBJECT = IMPL_LOOKUP.findStatic(THIS_CLASS, "zeroObject", zeroObjectType); + IGNORE = IMPL_LOOKUP.findStatic(THIS_CLASS, "ignore", ignoreType); + EMPTY = IMPL_LOOKUP.findStatic(THIS_CLASS, "empty", ignoreType.dropParameterTypes(0, 1)); +@@ -509,6 +493,9 @@ + * and returns it as the given type. + */ + public static MethodHandle cast(Class<?> type) { ++ return cast(type, CAST_REFERENCE); ++ } ++ public static MethodHandle cast(Class<?> type, MethodHandle castReference) { + if (type.isPrimitive()) throw new IllegalArgumentException("cannot cast primitive type "+type); + MethodHandle mh; + Wrapper wrap = null; +@@ -519,7 +506,7 @@ + mh = cache.get(wrap); + if (mh != null) return mh; + } +- mh = MethodHandles.insertArguments(CAST_REFERENCE, 0, type); ++ mh = MethodHandles.insertArguments(castReference, 0, type); + if (cache != null) + cache.put(wrap, mh); + return mh; +--- ./jdk/src/share/classes/sun/java2d/SunGraphics2D.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/java2d/SunGraphics2D.java Wed Jul 30 18:42:59 2014 +0100 +@@ -61,6 +61,7 @@ + import java.awt.Rectangle; + import java.text.AttributedCharacterIterator; + import java.awt.Font; ++import java.awt.Point; + import java.awt.image.ImageObserver; + import java.awt.Transparency; + import java.awt.font.GlyphVector; +@@ -93,6 +94,13 @@ + import sun.misc.PerformanceLogger; + + import java.lang.annotation.Native; ++import sun.awt.image.MultiResolutionImage; ++ ++import static java.awt.geom.AffineTransform.TYPE_FLIP; ++import static java.awt.geom.AffineTransform.TYPE_MASK_SCALE; ++import static java.awt.geom.AffineTransform.TYPE_TRANSLATION; ++import sun.awt.image.MultiResolutionToolkitImage; ++import sun.awt.image.ToolkitImage; + + /** + * This is a the master Graphics2D superclass for all of the Sun +@@ -237,6 +245,7 @@ + protected Region devClip; // Actual physical drawable in pixels + + private final int devScale; // Actual physical scale factor ++ private int resolutionVariantHint; + + // cached state for text rendering + private boolean validFontInfo; +@@ -274,6 +283,7 @@ + lcdTextContrast = lcdTextContrastDefaultValue; + interpolationHint = -1; + strokeHint = SunHints.INTVAL_STROKE_DEFAULT; ++ resolutionVariantHint = SunHints.INTVAL_RESOLUTION_VARIANT_DEFAULT; + + interpolationType = AffineTransformOp.TYPE_NEAREST_NEIGHBOR; + +@@ -1249,6 +1259,10 @@ + stateChanged = (strokeHint != newHint); + strokeHint = newHint; + break; ++ case SunHints.INTKEY_RESOLUTION_VARIANT: ++ stateChanged = (resolutionVariantHint != newHint); ++ resolutionVariantHint = newHint; ++ break; + default: + recognized = false; + stateChanged = false; +@@ -1322,6 +1336,9 @@ + case SunHints.INTKEY_STROKE_CONTROL: + return SunHints.Value.get(SunHints.INTKEY_STROKE_CONTROL, + strokeHint); ++ case SunHints.INTKEY_RESOLUTION_VARIANT: ++ return SunHints.Value.get(SunHints.INTKEY_RESOLUTION_VARIANT, ++ resolutionVariantHint); + } + return null; + } +@@ -2088,7 +2105,7 @@ + if (theData.copyArea(this, x, y, w, h, dx, dy)) { + return; + } +- if (transformState >= TRANSFORM_TRANSLATESCALE) { ++ if (transformState > TRANSFORM_TRANSLATESCALE) { + throw new InternalError("transformed copyArea not implemented yet"); + } + // REMIND: This method does not deal with missing data from the +@@ -2109,8 +2126,25 @@ + lastCAcomp = comp; + } + +- x += transX; +- y += transY; ++ double[] coords = {x, y, x + w, y + h, x + dx, y + dy}; ++ transform.transform(coords, 0, coords, 0, 3); ++ ++ x = (int)Math.ceil(coords[0] - 0.5); ++ y = (int)Math.ceil(coords[1] - 0.5); ++ w = ((int)Math.ceil(coords[2] - 0.5)) - x; ++ h = ((int)Math.ceil(coords[3] - 0.5)) - y; ++ dx = ((int)Math.ceil(coords[4] - 0.5)) - x; ++ dy = ((int)Math.ceil(coords[5] - 0.5)) - y; ++ ++ // In case of negative scale transform, reflect the rect coords. ++ if (w < 0) { ++ w *= -1; ++ x -= w; ++ } ++ if (h < 0) { ++ h *= -1; ++ y -= h; ++ } + + Blit ob = lastCAblit; + if (dy == 0 && dx > 0 && dx < w) { +@@ -2413,6 +2447,8 @@ + surfaceData = NullSurfaceData.theInstance; + } + ++ invalidatePipe(); ++ + // this will recalculate the composite clip + setDevClip(surfaceData.getBounds()); + +@@ -3050,18 +3086,58 @@ + } + // end of text rendering methods + +- private static boolean isHiDPIImage(final Image img) { +- return SurfaceManager.getImageScale(img) != 1; ++ private boolean isHiDPIImage(final Image img) { ++ return (SurfaceManager.getImageScale(img) != 1) || ++ (resolutionVariantHint != SunHints.INTVAL_RESOLUTION_VARIANT_OFF ++ && img instanceof MultiResolutionImage); + } + + private boolean drawHiDPIImage(Image img, int dx1, int dy1, int dx2, + int dy2, int sx1, int sy1, int sx2, int sy2, + Color bgcolor, ImageObserver observer) { +- final int scale = SurfaceManager.getImageScale(img); +- sx1 = Region.clipScale(sx1, scale); +- sx2 = Region.clipScale(sx2, scale); +- sy1 = Region.clipScale(sy1, scale); +- sy2 = Region.clipScale(sy2, scale); ++ ++ if (SurfaceManager.getImageScale(img) != 1) { // Volatile Image ++ final int scale = SurfaceManager.getImageScale(img); ++ sx1 = Region.clipScale(sx1, scale); ++ sx2 = Region.clipScale(sx2, scale); ++ sy1 = Region.clipScale(sy1, scale); ++ sy2 = Region.clipScale(sy2, scale); ++ } else if (img instanceof MultiResolutionImage) { ++ // get scaled destination image size ++ ++ int width = img.getWidth(observer); ++ int height = img.getHeight(observer); ++ ++ Image resolutionVariant = getResolutionVariant( ++ (MultiResolutionImage) img, width, height, ++ dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2); ++ ++ if (resolutionVariant != img && resolutionVariant != null) { ++ // recalculate source region for the resolution variant ++ ++ ImageObserver rvObserver = MultiResolutionToolkitImage. ++ getResolutionVariantObserver(img, observer, ++ width, height, -1, -1); ++ ++ int rvWidth = resolutionVariant.getWidth(rvObserver); ++ int rvHeight = resolutionVariant.getHeight(rvObserver); ++ ++ if (0 < width && 0 < height && 0 < rvWidth && 0 < rvHeight) { ++ ++ float widthScale = ((float) rvWidth) / width; ++ float heightScale = ((float) rvHeight) / height; ++ ++ sx1 = Region.clipScale(sx1, widthScale); ++ sy1 = Region.clipScale(sy1, heightScale); ++ sx2 = Region.clipScale(sx2, widthScale); ++ sy2 = Region.clipScale(sy2, heightScale); ++ ++ observer = rvObserver; ++ img = resolutionVariant; ++ } ++ } ++ } ++ + try { + return imagepipe.scaleImage(this, img, dx1, dy1, dx2, dy2, sx1, sy1, + sx2, sy2, bgcolor, observer); +@@ -3081,6 +3157,54 @@ + } + } + ++ private Image getResolutionVariant(MultiResolutionImage img, ++ int srcWidth, int srcHeight, int dx1, int dy1, int dx2, int dy2, ++ int sx1, int sy1, int sx2, int sy2) { ++ ++ if (srcWidth <= 0 || srcHeight <= 0) { ++ return null; ++ } ++ ++ int sw = sx2 - sx1; ++ int sh = sy2 - sy1; ++ ++ if (sw == 0 || sh == 0) { ++ return null; ++ } ++ ++ int type = transform.getType(); ++ int dw = dx2 - dx1; ++ int dh = dy2 - dy1; ++ double destRegionWidth; ++ double destRegionHeight; ++ ++ if ((type & ~(TYPE_TRANSLATION | TYPE_FLIP)) == 0) { ++ destRegionWidth = dw; ++ destRegionHeight = dh; ++ } else if ((type & ~(TYPE_TRANSLATION | TYPE_FLIP | TYPE_MASK_SCALE)) == 0) { ++ destRegionWidth = dw * transform.getScaleX(); ++ destRegionHeight = dh * transform.getScaleY(); ++ } else { ++ destRegionWidth = dw * Math.hypot( ++ transform.getScaleX(), transform.getShearY()); ++ destRegionHeight = dh * Math.hypot( ++ transform.getShearX(), transform.getScaleY()); ++ } ++ ++ int destImageWidth = (int) Math.abs(srcWidth * destRegionWidth / sw); ++ int destImageHeight = (int) Math.abs(srcHeight * destRegionHeight / sh); ++ ++ Image resolutionVariant ++ = img.getResolutionVariant(destImageWidth, destImageHeight); ++ ++ if (resolutionVariant instanceof ToolkitImage ++ && ((ToolkitImage) resolutionVariant).hasError()) { ++ return null; ++ } ++ ++ return resolutionVariant; ++ } ++ + /** + * Draws an image scaled to x,y,w,h in nonblocking mode with a + * callback object. +--- ./jdk/src/share/classes/sun/java2d/opengl/OGLBlitLoops.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/java2d/opengl/OGLBlitLoops.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -71,6 +71,8 @@ + // surface->sw ops + new OGLSurfaceToSwBlit(SurfaceType.IntArgb, + OGLSurfaceData.PF_INT_ARGB), ++ new OGLSurfaceToSwBlit(SurfaceType.IntArgbPre, ++ OGLSurfaceData.PF_INT_ARGB_PRE), + + // sw->surface ops + blitIntArgbPreToSurface, +@@ -505,23 +507,79 @@ + } + } + +-class OGLSurfaceToSwBlit extends Blit { ++final class OGLSurfaceToSwBlit extends Blit { + +- private int typeval; ++ private final int typeval; ++ private WeakReference<SurfaceData> srcTmp; + +- // REMIND: destination will actually be opaque/premultiplied... +- OGLSurfaceToSwBlit(SurfaceType dstType, int typeval) { ++ // destination will actually be ArgbPre or Argb ++ OGLSurfaceToSwBlit(final SurfaceType dstType,final int typeval) { + super(OGLSurfaceData.OpenGLSurface, + CompositeType.SrcNoEa, + dstType); + this.typeval = typeval; + } + ++ private synchronized void complexClipBlit(SurfaceData src, SurfaceData dst, ++ Composite comp, Region clip, ++ int sx, int sy, int dx, int dy, ++ int w, int h) { ++ SurfaceData cachedSrc = null; ++ if (srcTmp != null) { ++ // use cached intermediate surface, if available ++ cachedSrc = srcTmp.get(); ++ } ++ ++ // We can convert argb_pre data from OpenGL surface in two places: ++ // - During OpenGL surface -> SW blit ++ // - During SW -> SW blit ++ // The first one is faster when we use opaque OGL surface, because in ++ // this case we simply skip conversion and use color components as is. ++ // Because of this we align intermediate buffer type with type of ++ // destination not source. ++ final int type = typeval == OGLSurfaceData.PF_INT_ARGB_PRE ? ++ BufferedImage.TYPE_INT_ARGB_PRE : ++ BufferedImage.TYPE_INT_ARGB; ++ ++ src = convertFrom(this, src, sx, sy, w, h, cachedSrc, type); ++ ++ // copy intermediate SW to destination SW using complex clip ++ final Blit performop = Blit.getFromCache(src.getSurfaceType(), ++ CompositeType.SrcNoEa, ++ dst.getSurfaceType()); ++ performop.Blit(src, dst, comp, clip, 0, 0, dx, dy, w, h); ++ ++ if (src != cachedSrc) { ++ // cache the intermediate surface ++ srcTmp = new WeakReference<>(src); ++ } ++ } ++ + public void Blit(SurfaceData src, SurfaceData dst, + Composite comp, Region clip, + int sx, int sy, int dx, int dy, + int w, int h) + { ++ if (clip != null) { ++ clip = clip.getIntersectionXYWH(dx, dy, w, h); ++ // At the end this method will flush the RenderQueue, we should exit ++ // from it as soon as possible. ++ if (clip.isEmpty()) { ++ return; ++ } ++ sx += clip.getLoX() - dx; ++ sy += clip.getLoY() - dy; ++ dx = clip.getLoX(); ++ dy = clip.getLoY(); ++ w = clip.getWidth(); ++ h = clip.getHeight(); ++ ++ if (!clip.isRectangular()) { ++ complexClipBlit(src, dst, comp, clip, sx, sy, dx, dy, w, h); ++ return; ++ } ++ } ++ + OGLRenderQueue rq = OGLRenderQueue.getInstance(); + rq.lock(); + try { +--- ./jdk/src/share/classes/sun/java2d/pipe/DrawImage.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/java2d/pipe/DrawImage.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -310,11 +310,19 @@ + return false; + } + +- /* +- * Return a BufferedImage of the requested type with the indicated +- * subimage of the original image located at 0,0 in the new image. +- * If a bgColor is supplied, composite the original image over that +- * color with a SrcOver operation, otherwise make a SrcNoEa copy. ++ /** ++ * Return a non-accelerated BufferedImage of the requested type with the ++ * indicated subimage of the original image located at 0,0 in the new image. ++ * If a bgColor is supplied, composite the original image over that color ++ * with a SrcOver operation, otherwise make a SrcNoEa copy. ++ * <p> ++ * Returned BufferedImage is not accelerated for two reasons: ++ * <ul> ++ * <li> Types of the image and surface are predefined, because these types ++ * correspond to the TransformHelpers, which we know we have. And ++ * acceleration can change the type of the surface ++ * <li> Image will be used only once and acceleration caching wouldn't help ++ * </ul> + */ + BufferedImage makeBufferedImage(Image img, Color bgColor, int type, + int sx1, int sy1, int sx2, int sy2) +@@ -324,6 +332,7 @@ + final BufferedImage bimg = new BufferedImage(width, height, type); + final SunGraphics2D g2d = (SunGraphics2D) bimg.createGraphics(); + g2d.setComposite(AlphaComposite.Src); ++ bimg.setAccelerationPriority(0); + if (bgColor != null) { + g2d.setColor(bgColor); + g2d.fillRect(0, 0, width, height); +--- ./jdk/src/share/classes/sun/jvmstat/perfdata/monitor/protocol/local/PerfDataFile.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/jvmstat/perfdata/monitor/protocol/local/PerfDataFile.java Wed Jul 30 18:42:59 2014 +0100 +@@ -233,8 +233,6 @@ + * does not conform to the expected pattern + */ + public static int getLocalVmId(File file) { +- int lvmid = 0; +- + try { + // try 1.4.2 and later format first + return Integer.parseInt(file.getName()); +@@ -287,31 +285,13 @@ + return tmpDirName + dirNamePrefix + user + File.separator; + } + +- /* +- * this static initializer would not be necessary if the +- * Solaris java.io.tmpdir property were set to /tmp by default +- */ + static { + /* +- * Why is java.io.tmpdir on Solaris set to "/var/tmp/" when the +- * HotSpot JVM os:get_temp_path() method returns "/tmp/" +- * +- * Why do Solaris and Windows return a string with a trailing +- * file separator character where as Linix does not? (this change +- * seems to have occurred sometime during hopper beta) ++ * For this to work, the target VM and this code need to use ++ * the same directory. Instead of guessing which directory the ++ * VM is using, we will ask. + */ +- String tmpdir = System.getProperty("java.io.tmpdir"); +- +- if (tmpdir.compareTo("/var/tmp/") == 0) { +- /* +- * shared memory files are created in /tmp. Interestingly, +- * java.io.tmpdir is set to "/var/tmp/" on Solaris and Linux, +- * but os::get_temp_directory() is set to "/tmp/" on these +- * platforms. the java.io.logging packages also makes reference +- * to java.io.tmpdir. +- */ +- tmpdir = "/tmp/"; +- } ++ String tmpdir = sun.misc.VMSupport.getVMTemporaryDirectory(); + + /* + * Assure that the string returned has a trailing File.separator +--- ./jdk/src/share/classes/sun/launcher/resources/launcher_de.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/launcher/resources/launcher_de.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2007, 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 +@@ -37,7 +37,7 @@ + java.launcher.opt.footer =\ -cp <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n -classpath <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n Eine durch {0} getrennte Liste mit Verzeichnissen, JAR-Archiven\n und ZIP-Archiven zur Suche nach Klassendateien.\n -D<name>=<value>\n Legt eine Systemeigenschaft fest\n -verbose:[class|gc|jni]\n Aktiviert die Verbose-Ausgabe\n -version Druckt Produktversion und beendet das Programm\n -version:<value>\n Erfordert die angegebene Version zur Ausf\u00FChrung\n -showversion Druckt Produktversion und f\u00E4hrt fort\n -jre-restrict-search | -no-jre-restrict-search\n Bezieht private JREs des Benutzers in Versionssuche ein bzw. schlie\u00DFt sie aus\n -? -help Druckt diese Hilfemeldung\n -X Druckt Hilfe zu Nicht-Standardoptionen\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n Aktiviert Assertionen mit angegebener Granularit\u00E4t\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n Deaktiviert Assertionen mit angegebener Granularit\u00E4t\n -esa | -enablesystemassertions\n Aktiviert Systemassertionen\n -dsa | -disablesystemassertions\n Deaktiviert Systemassertionen\n -agentlib:<libname>[=<options>]\n L\u00E4dt native Agent Library <libname>, z.B. -agentlib:hprof\n siehe auch -agentlib:jdwp=help und -agentlib:hprof=help\n -agentpath:<pathname>[=<options>]\n L\u00E4dt native Agent Library nach vollem Pfadnamen\n -javaagent:<jarpath>[=<options>]\n L\u00E4dt Java-Programmiersprachen-Agent, siehe java.lang.instrument\n -splash:<imagepath>\n Zeigt Startbildschirm mit angegebenem Bild\nWeitere Einzelheiten finden Sie unter http://www.oracle.com/technetwork/java/javase/documentation/index.html + + # Translators please note do not translate the options themselves +-java.launcher.X.usage=\ -Xmixed Ausf\u00FChrung im gemischten Modus (Standard)\n -Xint Nur Ausf\u00FChrung im interpretierten Modus\n -Xbootclasspath:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n Legt Suchpfad f\u00FCr Bootstrap-Klassen und Ressourcen fest\n -Xbootclasspath/a:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n H\u00E4ngt an das Ende des Bootstrap Classpath an\n -Xbootclasspath/p:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n Stellt Bootstrap Classpath voran\n -Xdiag Zeigt zus\u00E4tzliche Diagnosemeldungen an\n -Xnoclassgc Deaktiviert Klassen-Garbage Collection\n -Xincgc Aktiviert inkrementelle Garbage Collection\n -Xloggc:<file> Loggt GC-Status in einer Datei mit Zeitstempeln\n -Xbatch Deaktiviert Hintergrundkompilierung\n -Xms<size> Legt anf\u00E4ngliche Java Heap-Gr\u00F6\u00DFe fest\n -Xmx<size> Legt maximale Java Heap-Gr\u00F6\u00DFe fest\n -Xss<size> Legt Java-Thread-Stackgr\u00F6\u00DFe fest\n -Xprof Gibt CPU-Profiling-Daten aus\n -Xfuture Aktiviert strengste Pr\u00FCfungen, antizipiert zuk\u00FCnftigen Standardwert\n -Xrs Reduziert Verwendung von BS-Signalen durch Java/VM (siehe Dokumentation)\n -Xcheck:jni F\u00FChrt zus\u00E4tzliche Pr\u00FCfungen f\u00FCr JNI-Funktionen durch\n -Xshare:off Kein Versuch, gemeinsame Klassendaten zu verwenden\n -Xshare:auto Verwendet gemeinsame Klassendaten, wenn m\u00F6glich (Standard)\n -Xshare:on Erfordert die Verwendung gemeinsamer Klassendaten, sonst verl\u00E4uft der Vorgang nicht erfolgreich.\n -XshowSettings Zeigt alle Einstellungen und f\u00E4hrt fort\n -XshowSettings:all\n Zeigt alle Einstellungen und f\u00E4hrt fort\n -XshowSettings:vm Zeigt alle VM-bezogenen Einstellungen und f\u00E4hrt fort\n -XshowSettings:properties\n Zeigt alle Eigenschaftseinstellungen und f\u00E4hrt fort\n -XshowSettings:locale\n Zeigt alle gebietsschemabezogenen Einstellungen und f\u00E4hrt fort\n\nDie -X-Optionen sind keine Standardoptionen und k\u00F6nnen ohne Vorank\u00FCndigung ge\u00E4ndert werden.\n ++java.launcher.X.usage=\ -Xmixed Ausf\u00FChrung im gemischten Modus (Standard)\n -Xint Nur Ausf\u00FChrung im interpretierten Modus\n -Xbootclasspath:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n Legt Suchpfad f\u00FCr Bootstrap-Klassen und Ressourcen fest\n -Xbootclasspath/a:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n H\u00E4ngt an das Ende des Bootstrap Classpath an\n -Xbootclasspath/p:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n Stellt Bootstrap Classpath voran\n -Xdiag Zeigt zus\u00E4tzliche Diagnosemeldungen an\n -Xnoclassgc Deaktiviert Klassen-Garbage Collection\n -Xincgc Aktiviert inkrementelle Garbage Collection\n -Xloggc:<file> Loggt GC-Status in einer Datei mit Zeitstempeln\n -Xbatch Deaktiviert Hintergrundkompilierung\n -Xms<size> Legt anf\u00E4ngliche Java Heap-Gr\u00F6\u00DFe fest\n -Xmx<size> Legt maximale Java Heap-Gr\u00F6\u00DFe fest\n -Xss<size> Legt Java-Threadstackgr\u00F6\u00DFe fest\n -Xprof Gibt CPU-Profiling-Daten aus\n -Xfuture Aktiviert strengste Pr\u00FCfungen, antizipiert zuk\u00FCnftigen Standardwert\n -Xrs Reduziert Verwendung von BS-Signalen durch Java/VM (siehe Dokumentation)\n -Xcheck:jni F\u00FChrt zus\u00E4tzliche Pr\u00FCfungen f\u00FCr JNI-Funktionen durch\n -Xshare:off Kein Versuch, gemeinsame Klassendaten zu verwenden\n -Xshare:auto Verwendet gemeinsame Klassendaten, wenn m\u00F6glich (Standard)\n -Xshare:on Erfordert die Verwendung gemeinsamer Klassendaten, sonst verl\u00E4uft der Vorgang nicht erfolgreich.\n -XshowSettings Zeigt alle Einstellungen und f\u00E4hrt fort\n -XshowSettings:all\n Zeigt alle Einstellungen und f\u00E4hrt fort\n -XshowSettings:vm Zeigt alle VM-bezogenen Einstellungen und f\u00E4hrt fort\n -XshowSettings:properties\n Zeigt alle Eigenschaftseinstellungen und f\u00E4hrt fort\n -XshowSettings:locale\n Zeigt alle gebietsschemabezogenen Einstellungen und f\u00E4hrt fort\n\nDie -X-Optionen sind keine Standardoptionen und k\u00F6nnen ohne Vorank\u00FCndigung ge\u00E4ndert werden.\n + + # Translators please note do not translate the options themselves + java.launcher.X.macosx.usage=\nDie folgenden Optionen sind f\u00FCr Mac OS X spezifisch:\n -XstartOnFirstThread\n f\u00FChrt die main()-Methode f\u00FCr den ersten (AppKit) Thread aus\n -Xdock:name=<Anwendungsname>"\n \u00DCberschreibt den in der Uhr angezeigten Standardanwendungsnamen\n -Xdock:icon=<Pfad zu Symboldatei>\n \u00DCberschreibt das in der Uhr angezeigte Standardsymbol\n\n +--- ./jdk/src/share/classes/sun/launcher/resources/launcher_pt_BR.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/launcher/resources/launcher_pt_BR.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2007, 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 +@@ -30,17 +30,17 @@ + java.launcher.opt.vmselect =\ {0}\t para selecionar a VM "{1}"\n + java.launcher.opt.hotspot =\ {0}\t \u00E9 um sin\u00F4nimo da VM "{1}" [obsoleto]\n + +-java.launcher.ergo.message1 =\ A VM default \u00E9 {0} ++java.launcher.ergo.message1 =\ A VM padr\u00E3o \u00E9 {0} + java.launcher.ergo.message2 =\ porque a execu\u00E7\u00E3o est\u00E1 sendo feita em uma m\u00E1quina de classe de servidor.\n + + # Translators please note do not translate the options themselves + java.launcher.opt.footer =\ -cp <caminho de pesquisa da classe dos diret\u00F3rios e arquivos zip/jar>\n -classpath <caminho de pesquisa da classe dos diret\u00F3rios e arquivos zip/jar>\n Uma lista separada por {0} de diret\u00F3rios, archives JAR\n e archives ZIP nos quais ser\u00E3o procurados os arquivos de classe.\n -D<nome>=<valor>\n define uma propriedade do sistema\n -verbose:[class|gc|jni]\n ativa a sa\u00EDda detalhada\n -version imprime a vers\u00E3o do produto e sai do programa\n -version:<valor>\n requer a execu\u00E7\u00E3o da vers\u00E3o especificada\n -showversion imprime a vers\u00E3o do produto e continua\n -jre-restrict-search | -no-jre-restrict-search\n inclui/exclui JREs privados do usu\u00E1rio na pesquisa de vers\u00E3o\n -? -help imprime esta mensagem de ajuda\n -X imprime a ajuda sobre op\u00E7\u00F5es n\u00E3o padronizadas\n -ea[:<nome do pacote>...|:<nome da classe>]\n -enableassertions[:<nome do pacote>...|:<nome da classe>]\n ativa asser\u00E7\u00F5es com granularidade especificada\n -da[:<nome do pacote>...|:<nome da classe>]\n -disableassertions[:<nome do pacote>...|:<nome da classe>]\n desativa asser\u00E7\u00F5es com granularidade especificada\n -esa | -enablesystemassertions\n ativa asser\u00E7\u00F5es do sistema\n -dsa | -disablesystemassertions\n desativa asser\u00E7\u00F5es do sistema\n -agentlib:<nome da biblioteca>[=<op\u00E7\u00F5es>]\n carrega a biblioteca de agentes nativa <nome da biblioteca>, por exemplo: -agentlib:hprof\n consulte tamb\u00E9m: -agentlib:jdwp=help e -agentlib:hprof=help\n -agentpath:<nome do caminho>[=<op\u00E7\u00F5es>]\n carrega a biblioteca de agentes nativa com base no nome do caminho completo\n -javaagent:<caminho do arquivo jar>[=<op\u00E7\u00F5es>]\n carrega o agente da linguagem de programa\u00E7\u00E3o Java; consulte java.lang.instrument\n -splash:<caminho da imagem>\n mostra a tela de abertura com a imagem especificada\nConsulte http://www.oracle.com/technetwork/java/javase/documentation/index.html para obter mais detalhes. + + # Translators please note do not translate the options themselves +-java.launcher.X.usage=\ -Xmixed execu\u00E7\u00E3o no modo misto (default)\n -Xint execu\u00E7\u00E3o somente no modo interpretado\n -Xbootclasspath:<diret\u00F3rios e arquivos zip/jar separados por {0}>\n define o caminho de pesquisa para classes e recursos de inicializa\u00E7\u00E3o\n -Xbootclasspath/a:<diret\u00F3rios e arquivos zip/jar separados por {0}>\n anexa no final do caminho da classe de inicializa\u00E7\u00E3o\n -Xbootclasspath/p:<diret\u00F3rios e arquivos zip/jar separados por {0}>\n anexa no in\u00EDcio do caminho da classe de inicializa\u00E7\u00E3o\n -Xdiag mostra mensagens de diagn\u00F3stico adicionais\n -Xnoclassgc desativa a coleta de lixo da classe\n -Xincgc ativa a coleta de lixo incremental\n -Xloggc:<arquivo> registra o status do GC status em um arquivo com marca\u00E7\u00F5es de data e hor\u00E1rio\n -Xbatch desativa a compila\u00E7\u00E3o em segundo plano\n -Xms<tamanho> define o tamanho inicial do heap Java\n -Xmx<tamanho> define o tamanho m\u00E1ximo do heap Java\n -Xss<tamanho> define o tamanho da pilha de threads java\n -Xprof produz dados de perfil da cpu\n -Xfuture ativa verifica\u00E7\u00F5es de n\u00EDvel m\u00E1ximo de exig\u00EAncia, prevendo o valor default futuro\n -Xrs reduz o uso de sinais do SO pelo(a) Java/VM (consulte a documenta\u00E7\u00E3o)\n -Xcheck:jni executa verifica\u00E7\u00F5es adicionais de fun\u00E7\u00F5es da JNI\n -Xshare:off n\u00E3o tenta usar dados da classe compartilhada\n -Xshare:auto se poss\u00EDvel, usa dados da classe compartilhada (default)\n -Xshare:on requer o uso de dados da classe compartilhada, caso contr\u00E1rio haver\u00E1 falha.\n -XshowSettings mostra todas as defini\u00E7\u00F5es e continua\n -XshowSettings:all\n mostra todas as defini\u00E7\u00F5es e continua\n -XshowSettings:vm mostra todas as defini\u00E7\u00F5es relacionadas \u00E0 vm e continua\n -XshowSettings:properties\n mostra todas as defini\u00E7\u00F5es da propriedade e continua\n -XshowSettings:locale\n mostra todas as defini\u00E7\u00F5es relativas \u00E0s configura\u00E7\u00F5es regionais e continua\n\nAs -X options n\u00E3o s\u00E3o padronizadas e est\u00E3o sujeitas a altera\u00E7\u00F5es sem aviso.\n ++java.launcher.X.usage=\ -Xmixed execu\u00E7\u00E3o no modo misto (padr\u00E3o)\n -Xint execu\u00E7\u00E3o somente no modo interpretado\n -Xbootclasspath:<diret\u00F3rios e arquivos zip/jar separados por {0}>\n define o caminho de pesquisa para classes e recursos de inicializa\u00E7\u00E3o\n -Xbootclasspath/a:<diret\u00F3rios e arquivos zip/jar separados por {0}>\n anexa no final do caminho da classe de inicializa\u00E7\u00E3o\n -Xbootclasspath/p:<diret\u00F3rios e arquivos zip/jar separados por {0}>\n anexa no in\u00EDcio do caminho da classe de inicializa\u00E7\u00E3o\n -Xdiag mostra mensagens de diagn\u00F3stico adicionais\n -Xnoclassgc desativa a coleta de lixo da classe\n -Xincgc ativa a coleta de lixo incremental\n -Xloggc:<arquivo> registra o status do GC status em um arquivo com marca\u00E7\u00F5es de data e hor\u00E1rio\n -Xbatch desativa a compila\u00E7\u00E3o em segundo plano\n -Xms<tamanho> define o tamanho inicial do heap Java\n -Xmx<tamanho> define o tamanho m\u00E1ximo do heap Java\n -Xss<tamanho> define o tamanho da pilha de threads java\n -Xprof produz dados de perfil da cpu\n -Xfuture ativa verifica\u00E7\u00F5es de n\u00EDvel m\u00E1ximo de exig\u00EAncia, prevendo o valor padr\u00E3o futuro\n -Xrs reduz o uso de sinais do SO pelo(a) Java/VM (consulte a documenta\u00E7\u00E3o)\n -Xcheck:jni executa verifica\u00E7\u00F5es adicionais de fun\u00E7\u00F5es da JNI\n -Xshare:off n\u00E3o tenta usar dados da classe compartilhada\n -Xshare:auto se poss\u00EDvel, usa dados da classe compartilhada (padr\u00E3o)\n -Xshare:on requer o uso de dados da classe compartilhada, caso contr\u00E1rio haver\u00E1 falha.\n -XshowSettings mostra todas as defini\u00E7\u00F5es e continua\n -XshowSettings:all\n mostra todas as defini\u00E7\u00F5es e continua\n -XshowSettings:vm mostra todas as defini\u00E7\u00F5es relacionadas \u00E0 vm e continua\n -XshowSettings:properties\n mostra todas as defini\u00E7\u00F5es da propriedade e continua\n -XshowSettings:locale\n mostra todas as defini\u00E7\u00F5es relativas \u00E0s configura\u00E7\u00F5es regionais e continua\n\nAs -X options n\u00E3o s\u00E3o padronizadas e est\u00E3o sujeitas a altera\u00E7\u00F5es sem aviso.\n + + # Translators please note do not translate the options themselves +-java.launcher.X.macosx.usage=\nAs op\u00E7\u00F5es a seguir s\u00E3o espec\u00EDficas para o Mac OS X:\n -XstartOnFirstThread\n executa o m\u00E9todo main() no primeiro thread (AppKit)\n -Xdock:name=<nome da aplica\u00E7\u00E3o>"\n substitui o nome da aplica\u00E7\u00E3o default exibido no encaixe\n -Xdock:icon=<caminho para o arquivo do \u00EDcone>\n substitui o \u00EDcone exibido no encaixe\n\n ++java.launcher.X.macosx.usage=\nAs op\u00E7\u00F5es a seguir s\u00E3o espec\u00EDficas para o Mac OS X:\n -XstartOnFirstThread\n executa o m\u00E9todo main() no primeiro thread (AppKit)\n -Xdock:name=<nome da aplica\u00E7\u00E3o>"\n substitui o nome da aplica\u00E7\u00E3o padr\u00E3o exibido no encaixe\n -Xdock:icon=<caminho para o arquivo do \u00EDcone>\n substitui o \u00EDcone exibido no encaixe\n\n + + java.launcher.cls.error1=Erro: N\u00E3o foi poss\u00EDvel localizar nem carregar a classe principal {0} + java.launcher.cls.error2=Erro: o m\u00E9todo main n\u00E3o \u00E9 {0} na classe {1}; defina o m\u00E9todo main como:\n public static void main(String[] args) +--- ./jdk/src/share/classes/sun/management/resources/agent_ja.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/management/resources/agent_ja.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -1,6 +1,6 @@ + # + # +-# Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2004, 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 +@@ -36,7 +36,7 @@ + agent.err.configfile.closed.failed = \u69CB\u6210\u30D5\u30A1\u30A4\u30EB\u3092\u9589\u3058\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F + agent.err.configfile.access.denied = \u69CB\u6210\u30D5\u30A1\u30A4\u30EB\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u304C\u62D2\u5426\u3055\u308C\u307E\u3057\u305F + +-agent.err.exportaddress.failed = JMX\u30B3\u30CD\u30AF\u30BF\u30FB\u30A2\u30C9\u30EC\u30B9\u306E\u8A08\u6E2C\u30D0\u30C3\u30D5\u30A1\u3078\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u5931\u6557\u3057\u307E\u3057\u305F ++agent.err.exportaddress.failed = JMX\u30B3\u30CD\u30AF\u30BF\u30FB\u30A2\u30C9\u30EC\u30B9\u306E\u8A08\u6E2C\u30D0\u30C3\u30D5\u30A1\u3078\u306E\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u304C\u5931\u6557\u3057\u307E\u3057\u305F + + agent.err.agentclass.notfound = \u7BA1\u7406\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30FB\u30AF\u30E9\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 + agent.err.agentclass.failed = \u7BA1\u7406\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30FB\u30AF\u30E9\u30B9\u304C\u5931\u6557\u3057\u307E\u3057\u305F +--- ./jdk/src/share/classes/sun/misc/InnocuousThread.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/misc/InnocuousThread.java Wed Jul 30 18:42:59 2014 +0100 +@@ -3,22 +3,22 @@ + * 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 GNUNSAFE General Public License version 2 only, as ++ * 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 WITHOUNSAFET ++ * 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 PARTICUNSAFELAR PUNSAFERPOSE. See the GNUNSAFE General Public License ++ * 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 GNUNSAFE General Public License version ++ * 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 UNSAFESA. ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 UNSAFESA ++ * 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/src/share/classes/sun/misc/VMSupport.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/misc/VMSupport.java Wed Jul 30 18:42:59 2014 +0100 +@@ -97,4 +97,14 @@ + throw new RuntimeException(ioe.getMessage()); + } + } ++ ++ /* ++ * Return the temporary directory that the VM uses for the attach ++ * and perf data files. ++ * ++ * It is important that this directory is well-known and the ++ * same for all VM instances. It cannot be affected by configuration ++ * variables such as java.io.tmpdir. ++ */ ++ public static native String getVMTemporaryDirectory(); + } +--- ./jdk/src/share/classes/sun/net/ExtendedOptionsImpl.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/classes/sun/net/ExtendedOptionsImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,92 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. 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.net; ++ ++import java.net.*; ++import jdk.net.*; ++import java.io.IOException; ++import java.io.FileDescriptor; ++import java.security.PrivilegedAction; ++import java.security.AccessController; ++import java.lang.reflect.Field; ++import java.util.Set; ++import java.util.HashSet; ++import java.util.HashMap; ++import java.util.Collections; ++ ++/** ++ * Contains the native implementation for extended socket options ++ * together with some other static utilities ++ */ ++public class ExtendedOptionsImpl { ++ ++ static { ++ AccessController.doPrivileged((PrivilegedAction<Void>)() -> { ++ System.loadLibrary("net"); ++ return null; ++ }); ++ init(); ++ } ++ ++ private ExtendedOptionsImpl() {} ++ ++ public static void checkSetOptionPermission(SocketOption<?> option) { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm == null) { ++ return; ++ } ++ String check = "setOption." + option.name(); ++ sm.checkPermission(new NetworkPermission(check)); ++ } ++ ++ public static void checkGetOptionPermission(SocketOption<?> option) { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm == null) { ++ return; ++ } ++ String check = "getOption." + option.name(); ++ sm.checkPermission(new NetworkPermission(check)); ++ } ++ ++ public static void checkValueType(Object value, Class<?> type) { ++ if (!type.isAssignableFrom(value.getClass())) { ++ String s = "Found: " + value.getClass().toString() + " Expected: " ++ + type.toString(); ++ throw new IllegalArgumentException(s); ++ } ++ } ++ ++ private static native void init(); ++ ++ /* ++ * Extension native implementations ++ * ++ * SO_FLOW_SLA ++ */ ++ public static native void setFlowOption(FileDescriptor fd, SocketFlow f); ++ public static native void getFlowOption(FileDescriptor fd, SocketFlow f); ++ public static native boolean flowSupported(); ++} +--- ./jdk/src/share/classes/sun/net/InetAddressCachePolicy.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/net/InetAddressCachePolicy.java Wed Jul 30 18:42:59 2014 +0100 +@@ -84,19 +84,31 @@ + * Initialize + */ + static { +- Integer tmp = null; + +- try { +- tmp = new Integer( +- java.security.AccessController.doPrivileged ( +- new PrivilegedAction<String>() { +- public String run() { +- return Security.getProperty(cachePolicyProp); +- } +- })); +- } catch (NumberFormatException e) { +- // ignore +- } ++ Integer tmp = java.security.AccessController.doPrivileged( ++ new PrivilegedAction<Integer>() { ++ public Integer run() { ++ try { ++ String tmpString = Security.getProperty(cachePolicyProp); ++ if (tmpString != null) { ++ return Integer.valueOf(tmpString); ++ } ++ } catch (NumberFormatException ignored) { ++ // Ignore ++ } ++ ++ try { ++ String tmpString = System.getProperty(cachePolicyPropFallback); ++ if (tmpString != null) { ++ return Integer.decode(tmpString); ++ } ++ } catch (NumberFormatException ignored) { ++ // Ignore ++ } ++ return null; ++ } ++ }); ++ + if (tmp != null) { + cachePolicy = tmp.intValue(); + if (cachePolicy < 0) { +@@ -104,35 +116,36 @@ + } + propertySet = true; + } else { +- tmp = java.security.AccessController.doPrivileged +- (new sun.security.action.GetIntegerAction(cachePolicyPropFallback)); +- if (tmp != null) { +- cachePolicy = tmp.intValue(); +- if (cachePolicy < 0) { +- cachePolicy = FOREVER; +- } +- propertySet = true; +- } else { +- /* No properties defined for positive caching. If there is no +- * security manager then use the default positive cache value. +- */ +- if (System.getSecurityManager() == null) { +- cachePolicy = DEFAULT_POSITIVE; +- } ++ /* No properties defined for positive caching. If there is no ++ * security manager then use the default positive cache value. ++ */ ++ if (System.getSecurityManager() == null) { ++ cachePolicy = DEFAULT_POSITIVE; + } + } ++ tmp = java.security.AccessController.doPrivileged ( ++ new PrivilegedAction<Integer>() { ++ public Integer run() { ++ try { ++ String tmpString = Security.getProperty(negativeCachePolicyProp); ++ if (tmpString != null) { ++ return Integer.valueOf(tmpString); ++ } ++ } catch (NumberFormatException ignored) { ++ // Ignore ++ } + +- try { +- tmp = new Integer( +- java.security.AccessController.doPrivileged ( +- new PrivilegedAction<String>() { +- public String run() { +- return Security.getProperty(negativeCachePolicyProp); +- } +- })); +- } catch (NumberFormatException e) { +- // ignore +- } ++ try { ++ String tmpString = System.getProperty(negativeCachePolicyPropFallback); ++ if (tmpString != null) { ++ return Integer.decode(tmpString); ++ } ++ } catch (NumberFormatException ignored) { ++ // Ignore ++ } ++ return null; ++ } ++ }); + + if (tmp != null) { + negativeCachePolicy = tmp.intValue(); +@@ -140,16 +153,6 @@ + negativeCachePolicy = FOREVER; + } + propertyNegativeSet = true; +- } else { +- tmp = java.security.AccessController.doPrivileged +- (new sun.security.action.GetIntegerAction(negativeCachePolicyPropFallback)); +- if (tmp != null) { +- negativeCachePolicy = tmp.intValue(); +- if (negativeCachePolicy < 0) { +- negativeCachePolicy = FOREVER; +- } +- propertyNegativeSet = true; +- } + } + } + +--- ./jdk/src/share/classes/sun/net/util/IPAddressUtil.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/net/util/IPAddressUtil.java Wed Jul 30 18:42:59 2014 +0100 +@@ -37,89 +37,72 @@ + * @param src a String representing an IPv4 address in standard format + * @return a byte array representing the IPv4 numeric address + */ ++ @SuppressWarnings("fallthrough") + public static byte[] textToNumericFormatV4(String src) + { +- if (src.length() == 0) { ++ byte[] res = new byte[INADDR4SZ]; ++ ++ long tmpValue = 0; ++ int currByte = 0; ++ ++ int len = src.length(); ++ if (len == 0 || len > 15) { + return null; + } +- +- byte[] res = new byte[INADDR4SZ]; +- String[] s = src.split("\\.", -1); +- long val; +- try { +- switch(s.length) { ++ /* ++ * When only one part is given, the value is stored directly in ++ * the network address without any byte rearrangement. ++ * ++ * When a two part address is supplied, the last part is ++ * interpreted as a 24-bit quantity and placed in the right ++ * most three bytes of the network address. This makes the ++ * two part address format convenient for specifying Class A ++ * network addresses as net.host. ++ * ++ * When a three part address is specified, the last part is ++ * interpreted as a 16-bit quantity and placed in the right ++ * most two bytes of the network address. This makes the ++ * three part address format convenient for specifying ++ * Class B net- work addresses as 128.net.host. ++ * ++ * When four parts are specified, each is interpreted as a ++ * byte of data and assigned, from left to right, to the ++ * four bytes of an IPv4 address. ++ * ++ * We determine and parse the leading parts, if any, as single ++ * byte values in one pass directly into the resulting byte[], ++ * then the remainder is treated as a 8-to-32-bit entity and ++ * translated into the remaining bytes in the array. ++ */ ++ for (int i = 0; i < len; i++) { ++ char c = src.charAt(i); ++ if (c == '.') { ++ if (tmpValue < 0 || tmpValue > 0xff || currByte == 3) { ++ return null; ++ } ++ res[currByte++] = (byte) (tmpValue & 0xff); ++ tmpValue = 0; ++ } else { ++ int digit = Character.digit(c, 10); ++ if (digit < 0) { ++ return null; ++ } ++ tmpValue *= 10; ++ tmpValue += digit; ++ } ++ } ++ if (tmpValue < 0 || tmpValue >= (1L << ((4 - currByte) * 8))) { ++ return null; ++ } ++ switch (currByte) { ++ case 0: ++ res[0] = (byte) ((tmpValue >> 24) & 0xff); + case 1: +- /* +- * When only one part is given, the value is stored directly in +- * the network address without any byte rearrangement. +- */ +- +- val = Long.parseLong(s[0]); +- if (val < 0 || val > 0xffffffffL) +- return null; +- res[0] = (byte) ((val >> 24) & 0xff); +- res[1] = (byte) (((val & 0xffffff) >> 16) & 0xff); +- res[2] = (byte) (((val & 0xffff) >> 8) & 0xff); +- res[3] = (byte) (val & 0xff); +- break; ++ res[1] = (byte) ((tmpValue >> 16) & 0xff); + case 2: +- /* +- * When a two part address is supplied, the last part is +- * interpreted as a 24-bit quantity and placed in the right +- * most three bytes of the network address. This makes the +- * two part address format convenient for specifying Class A +- * network addresses as net.host. +- */ +- +- val = Integer.parseInt(s[0]); +- if (val < 0 || val > 0xff) +- return null; +- res[0] = (byte) (val & 0xff); +- val = Integer.parseInt(s[1]); +- if (val < 0 || val > 0xffffff) +- return null; +- res[1] = (byte) ((val >> 16) & 0xff); +- res[2] = (byte) (((val & 0xffff) >> 8) &0xff); +- res[3] = (byte) (val & 0xff); +- break; ++ res[2] = (byte) ((tmpValue >> 8) & 0xff); + case 3: +- /* +- * When a three part address is specified, the last part is +- * interpreted as a 16-bit quantity and placed in the right +- * most two bytes of the network address. This makes the +- * three part address format convenient for specifying +- * Class B net- work addresses as 128.net.host. +- */ +- for (int i = 0; i < 2; i++) { +- val = Integer.parseInt(s[i]); +- if (val < 0 || val > 0xff) +- return null; +- res[i] = (byte) (val & 0xff); +- } +- val = Integer.parseInt(s[2]); +- if (val < 0 || val > 0xffff) +- return null; +- res[2] = (byte) ((val >> 8) & 0xff); +- res[3] = (byte) (val & 0xff); +- break; +- case 4: +- /* +- * When four parts are specified, each is interpreted as a +- * byte of data and assigned, from left to right, to the +- * four bytes of an IPv4 address. +- */ +- for (int i = 0; i < 4; i++) { +- val = Integer.parseInt(s[i]); +- if (val < 0 || val > 0xff) +- return null; +- res[i] = (byte) (val & 0xff); +- } +- break; +- default: +- return null; +- } +- } catch(NumberFormatException e) { +- return null; ++ res[3] = (byte) ((tmpValue >> 0) & 0xff); + } + return res; + } +--- ./jdk/src/share/classes/sun/net/www/http/HttpClient.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/net/www/http/HttpClient.java Wed Jul 30 18:42:59 2014 +0100 +@@ -665,7 +665,9 @@ + // try once more + openServer(); + if (needsTunneling()) { ++ MessageHeader origRequests = requests; + httpuc.doTunneling(); ++ requests = origRequests; + } + afterConnect(); + writeRequests(requests, poster); +@@ -776,7 +778,9 @@ + cachedHttpClient = false; + openServer(); + if (needsTunneling()) { ++ MessageHeader origRequests = requests; + httpuc.doTunneling(); ++ requests = origRequests; + } + afterConnect(); + writeRequests(requests, poster); +--- ./jdk/src/share/classes/sun/net/www/protocol/http/DigestAuthentication.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/net/www/protocol/http/DigestAuthentication.java Wed Jul 30 18:42:59 2014 +0100 +@@ -34,8 +34,11 @@ + import java.util.Random; + + import sun.net.www.HeaderParser; ++import sun.net.NetProperties; + import java.security.MessageDigest; + import java.security.NoSuchAlgorithmException; ++import java.security.PrivilegedAction; ++import java.security.AccessController; + import static sun.net.www.protocol.http.HttpURLConnection.HTTP_CONNECT; + + /** +@@ -51,6 +54,23 @@ + + private String authMethod; + ++ private final static String compatPropName = "http.auth.digest." + ++ "quoteParameters"; ++ ++ // true if http.auth.digest.quoteParameters Net property is true ++ private static final boolean delimCompatFlag; ++ ++ static { ++ Boolean b = AccessController.doPrivileged( ++ new PrivilegedAction<Boolean>() { ++ public Boolean run() { ++ return NetProperties.getBoolean(compatPropName); ++ } ++ } ++ ); ++ delimCompatFlag = (b == null) ? false : b.booleanValue(); ++ } ++ + // Authentication parameters defined in RFC2617. + // One instance of these may be shared among several DigestAuthentication + // instances as a result of a single authorization (for multiple domains) +@@ -357,24 +377,34 @@ + ncfield = "\", nc=" + ncstring; + } + ++ String algoS, qopS; ++ ++ if (delimCompatFlag) { ++ // Put quotes around these String value parameters ++ algoS = ", algorithm=\"" + algorithm + "\""; ++ qopS = ", qop=\"auth\""; ++ } else { ++ // Don't put quotes around them, per the RFC ++ algoS = ", algorithm=" + algorithm; ++ qopS = ", qop=auth"; ++ } ++ + String value = authMethod + + " username=\"" + pw.getUserName() + + "\", realm=\"" + realm + + "\", nonce=\"" + nonce + + ncfield + + ", uri=\"" + uri +- + "\", response=\"" + response +- + "\", algorithm=" + algorithm; ++ + "\", response=\"" + response + "\"" ++ + algoS; + if (opaque != null) { +- value = value + ", opaque=\"" + opaque; +- value = value + "\""; ++ value += ", opaque=\"" + opaque + "\""; + } + if (cnonce != null) { +- value = value + ", cnonce=\"" + cnonce; +- value = value + "\""; ++ value += ", cnonce=\"" + cnonce + "\""; + } + if (qop) { +- value = value + ", qop=auth"; ++ value += qopS; + } + return value; + } +--- ./jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/net/www/protocol/http/NegotiateAuthentication.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -31,6 +31,7 @@ + import java.util.Base64; + import java.util.HashMap; + import sun.net.www.HeaderParser; ++import sun.util.logging.PlatformLogger; + import static sun.net.www.protocol.http.AuthScheme.NEGOTIATE; + import static sun.net.www.protocol.http.AuthScheme.KERBEROS; + +@@ -44,6 +45,7 @@ + class NegotiateAuthentication extends AuthenticationInfo { + + private static final long serialVersionUID = 100L; ++ private static final PlatformLogger logger = HttpURLConnection.getHttpLogger(); + + final private HttpCallerInfo hci; + +@@ -79,6 +81,31 @@ + } + + /** ++ * Find out if the HttpCallerInfo supports Negotiate protocol. ++ * @return true if supported ++ */ ++ public static boolean isSupported(HttpCallerInfo hci) { ++ ClassLoader loader = null; ++ try { ++ loader = Thread.currentThread().getContextClassLoader(); ++ } catch (SecurityException se) { ++ if (logger.isLoggable(PlatformLogger.Level.FINER)) { ++ logger.finer("NegotiateAuthentication: " + ++ "Attempt to get the context class loader failed - " + se); ++ } ++ } ++ ++ if (loader != null) { ++ // Lock on the class loader instance to avoid the deadlock engaging ++ // the lock in "ClassLoader.loadClass(String, boolean)" method. ++ synchronized (loader) { ++ return isSupportedImpl(hci); ++ } ++ } ++ return isSupportedImpl(hci); ++ } ++ ++ /** + * Find out if the HttpCallerInfo supports Negotiate protocol. In order to + * find out yes or no, an initialization of a Negotiator object against it + * is tried. The generated object will be cached under the name of ths +@@ -89,7 +116,7 @@ + * + * @return true if supported + */ +- synchronized public static boolean isSupported(HttpCallerInfo hci) { ++ private static synchronized boolean isSupportedImpl(HttpCallerInfo hci) { + if (supported == null) { + supported = new HashMap <String, Boolean>(); + cache = new HashMap <String, Negotiator>(); +--- ./jdk/src/share/classes/sun/nio/ch/AbstractPollArrayWrapper.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/AbstractPollArrayWrapper.java Wed Jul 30 18:42:59 2014 +0100 +@@ -37,14 +37,6 @@ + + public abstract class AbstractPollArrayWrapper { + +- // Event masks +- public static final short POLLIN = 0x0001; +- public static final short POLLOUT = 0x0004; +- public static final short POLLERR = 0x0008; +- public static final short POLLHUP = 0x0010; +- public static final short POLLNVAL = 0x0020; +- public static final short POLLREMOVE = 0x0800; +- + // Miscellaneous constants + static final short SIZE_POLLFD = 8; + static final short FD_OFFSET = 0; +--- ./jdk/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -39,6 +39,7 @@ + import java.util.concurrent.*; + import java.util.concurrent.locks.*; + import sun.net.NetHooks; ++import sun.net.ExtendedOptionsImpl; + + /** + * Base implementation of AsynchronousSocketChannel +@@ -508,6 +509,9 @@ + set.add(StandardSocketOptions.SO_KEEPALIVE); + set.add(StandardSocketOptions.SO_REUSEADDR); + set.add(StandardSocketOptions.TCP_NODELAY); ++ if (ExtendedOptionsImpl.flowSupported()) { ++ set.add(jdk.net.ExtendedSocketOptions.SO_FLOW_SLA); ++ } + return Collections.unmodifiableSet(set); + } + } +--- ./jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -33,6 +33,7 @@ + import java.nio.channels.spi.*; + import java.util.*; + import sun.net.ResourceManager; ++import sun.net.ExtendedOptionsImpl; + + /** + * An implementation of DatagramChannels. +@@ -317,6 +318,9 @@ + set.add(StandardSocketOptions.IP_MULTICAST_IF); + set.add(StandardSocketOptions.IP_MULTICAST_TTL); + set.add(StandardSocketOptions.IP_MULTICAST_LOOP); ++ if (ExtendedOptionsImpl.flowSupported()) { ++ set.add(jdk.net.ExtendedSocketOptions.SO_FLOW_SLA); ++ } + return Collections.unmodifiableSet(set); + } + } +@@ -1042,25 +1046,24 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) { ++ if ((ops & Net.POLLNVAL) != 0) { + // This should only happen if this channel is pre-closed while a + // selection operation is in progress + // ## Throw an error if this channel has not been pre-closed + return false; + } + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLIN) != 0) && ++ if (((ops & Net.POLLIN) != 0) && + ((intOps & SelectionKey.OP_READ) != 0)) + newOps |= SelectionKey.OP_READ; + +- if (((ops & PollArrayWrapper.POLLOUT) != 0) && ++ if (((ops & Net.POLLOUT) != 0) && + ((intOps & SelectionKey.OP_WRITE) != 0)) + newOps |= SelectionKey.OP_WRITE; + +@@ -1105,11 +1108,11 @@ + int newOps = 0; + + if ((ops & SelectionKey.OP_READ) != 0) +- newOps |= PollArrayWrapper.POLLIN; ++ newOps |= Net.POLLIN; + if ((ops & SelectionKey.OP_WRITE) != 0) +- newOps |= PollArrayWrapper.POLLOUT; ++ newOps |= Net.POLLOUT; + if ((ops & SelectionKey.OP_CONNECT) != 0) +- newOps |= PollArrayWrapper.POLLIN; ++ newOps |= Net.POLLIN; + sk.selector.putEventOps(sk, newOps); + } + +--- ./jdk/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -187,9 +187,9 @@ + if (!dc.isOpen()) + throw new ClosedChannelException(); + long st = System.currentTimeMillis(); +- int result = dc.poll(PollArrayWrapper.POLLIN, to); ++ int result = dc.poll(Net.POLLIN, to); + if (result > 0 && +- ((result & PollArrayWrapper.POLLIN) != 0)) { ++ ((result & Net.POLLIN) != 0)) { + if ((sender = dc.receive(bb)) != null) + return sender; + } +--- ./jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -29,10 +29,20 @@ + import java.io.IOException; + import java.nio.ByteBuffer; + import java.nio.MappedByteBuffer; +-import java.nio.channels.*; ++import java.nio.channels.ClosedByInterruptException; ++import java.nio.channels.ClosedChannelException; ++import java.nio.channels.FileChannel; ++import java.nio.channels.FileLock; ++import java.nio.channels.FileLockInterruptionException; ++import java.nio.channels.NonReadableChannelException; ++import java.nio.channels.NonWritableChannelException; ++import java.nio.channels.OverlappingFileLockException; ++import java.nio.channels.ReadableByteChannel; ++import java.nio.channels.WritableByteChannel; ++import java.security.AccessController; + import java.util.ArrayList; + import java.util.List; +-import java.security.AccessController; ++ + import sun.misc.Cleaner; + import sun.security.action.GetPropertyAction; + +@@ -56,13 +66,17 @@ + // Required to prevent finalization of creating stream (immutable) + private final Object parent; + ++ // The path of the referenced file ++ // (null if the parent stream is created with a file descriptor) ++ private final String path; ++ + // Thread-safe set of IDs of native threads, for signalling + private final NativeThreadSet threads = new NativeThreadSet(2); + + // Lock for operations involving position and size + private final Object positionLock = new Object(); + +- private FileChannelImpl(FileDescriptor fd, boolean readable, ++ private FileChannelImpl(FileDescriptor fd, String path, boolean readable, + boolean writable, boolean append, Object parent) + { + this.fd = fd; +@@ -70,23 +84,24 @@ + this.writable = writable; + this.append = append; + this.parent = parent; ++ this.path = path; + this.nd = new FileDispatcherImpl(append); + } + + // Used by FileInputStream.getChannel() and RandomAccessFile.getChannel() +- public static FileChannel open(FileDescriptor fd, ++ public static FileChannel open(FileDescriptor fd, String path, + boolean readable, boolean writable, + Object parent) + { +- return new FileChannelImpl(fd, readable, writable, false, parent); ++ return new FileChannelImpl(fd, path, readable, writable, false, parent); + } + + // Used by FileOutputStream.getChannel +- public static FileChannel open(FileDescriptor fd, ++ public static FileChannel open(FileDescriptor fd, String path, + boolean readable, boolean writable, + boolean append, Object parent) + { +- return new FileChannelImpl(fd, readable, writable, append, parent); ++ return new FileChannelImpl(fd, path, readable, writable, append, parent); + } + + private void ensureOpen() throws IOException { +@@ -110,7 +125,7 @@ + } + } + +- nd.preClose(fd); ++ // signal any threads blocked on this channel + threads.signalAndWait(); + + if (parent != null) { +--- ./jdk/src/share/classes/sun/nio/ch/NativeThreadSet.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/NativeThreadSet.java Wed Jul 30 18:42:59 2014 +0100 +@@ -82,8 +82,9 @@ + + // Signals all threads in this set. + // +- void signalAndWait() { +- synchronized (this) { ++ synchronized void signalAndWait() { ++ boolean interrupted = false; ++ while (used > 0) { + int u = used; + int n = elts.length; + for (int i = 0; i < n; i++) { +@@ -96,16 +97,15 @@ + break; + } + waitingToEmpty = true; +- boolean interrupted = false; +- while (used > 0) { +- try { +- wait(); +- } catch (InterruptedException e) { +- interrupted = true; +- } ++ try { ++ wait(50); ++ } catch (InterruptedException e) { ++ interrupted = true; ++ } finally { ++ waitingToEmpty = false; + } +- if (interrupted) +- Thread.currentThread().interrupt(); + } ++ if (interrupted) ++ Thread.currentThread().interrupt(); + } + } +--- ./jdk/src/share/classes/sun/nio/ch/Net.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/Net.java Wed Jul 30 18:42:59 2014 +0100 +@@ -27,11 +27,13 @@ + + import java.io.*; + import java.net.*; ++import jdk.net.*; + import java.nio.channels.*; + import java.util.*; + import java.security.AccessController; + import java.security.PrivilegedAction; + import java.security.PrivilegedExceptionAction; ++import sun.net.ExtendedOptionsImpl; + + + public class Net { +@@ -297,6 +299,16 @@ + + // only simple values supported by this method + Class<?> type = name.type(); ++ ++ if (type == SocketFlow.class) { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm != null) { ++ sm.checkPermission(new NetworkPermission("setOption.SO_FLOW_SLA")); ++ } ++ ExtendedOptionsImpl.setFlowOption(fd, (SocketFlow)value); ++ return; ++ } ++ + if (type != Integer.class && type != Boolean.class) + throw new AssertionError("Should not reach here"); + +@@ -349,6 +361,16 @@ + { + Class<?> type = name.type(); + ++ if (type == SocketFlow.class) { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm != null) { ++ sm.checkPermission(new NetworkPermission("getOption.SO_FLOW_SLA")); ++ } ++ SocketFlow flow = SocketFlow.create(); ++ ExtendedOptionsImpl.getFlowOption(fd, flow); ++ return flow; ++ } ++ + // only simple values supported by this method + if (type != Integer.class && type != Boolean.class) + throw new AssertionError("Should not reach here"); +@@ -581,9 +603,34 @@ + + private static native void initIDs(); + ++ /** ++ * Event masks for the various poll system calls. ++ * They will be set platform dependant in the static initializer below. ++ */ ++ public static final short POLLIN; ++ public static final short POLLOUT; ++ public static final short POLLERR; ++ public static final short POLLHUP; ++ public static final short POLLNVAL; ++ public static final short POLLCONN; ++ ++ static native short pollinValue(); ++ static native short polloutValue(); ++ static native short pollerrValue(); ++ static native short pollhupValue(); ++ static native short pollnvalValue(); ++ static native short pollconnValue(); ++ + static { + IOUtil.load(); + initIDs(); ++ ++ POLLIN = pollinValue(); ++ POLLOUT = polloutValue(); ++ POLLERR = pollerrValue(); ++ POLLHUP = pollhupValue(); ++ POLLNVAL = pollnvalValue(); ++ POLLCONN = pollconnValue(); + } + + } +--- ./jdk/src/share/classes/sun/nio/ch/ServerSocketAdaptor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/ServerSocketAdaptor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -113,7 +113,7 @@ + if (!ssc.isOpen()) + throw new ClosedChannelException(); + long st = System.currentTimeMillis(); +- int result = ssc.poll(PollArrayWrapper.POLLIN, to); ++ int result = ssc.poll(Net.POLLIN, to); + if (result > 0 && ((sc = ssc.accept()) != null)) + return sc.socket(); + to -= System.currentTimeMillis() - st; +--- ./jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/ServerSocketChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -309,21 +309,20 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) { ++ if ((ops & Net.POLLNVAL) != 0) { + // This should only happen if this channel is pre-closed while a + // selection operation is in progress + // ## Throw an error if this channel has not been pre-closed + return false; + } + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLIN) != 0) && ++ if (((ops & Net.POLLIN) != 0) && + ((intOps & SelectionKey.OP_ACCEPT) != 0)) + newOps |= SelectionKey.OP_ACCEPT; + +@@ -369,7 +368,7 @@ + + // Translate ops + if ((ops & SelectionKey.OP_ACCEPT) != 0) +- newOps |= PollArrayWrapper.POLLIN; ++ newOps |= Net.POLLIN; + // Place ops into pollfd array + sk.selector.putEventOps(sk, newOps); + } +--- ./jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -88,7 +88,6 @@ + invalidateAllLocks(); + + // signal any threads blocked on this channel +- nd.preClose(fdObj); + threads.signalAndWait(); + + // wait until all async I/O operations have completely gracefully +--- ./jdk/src/share/classes/sun/nio/ch/SocketAdaptor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/SocketAdaptor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -107,7 +107,7 @@ + throw new ClosedChannelException(); + long st = System.currentTimeMillis(); + +- int result = sc.poll(PollArrayWrapper.POLLCONN, to); ++ int result = sc.poll(Net.POLLCONN, to); + if (result > 0 && sc.finishConnect()) + break; + to -= System.currentTimeMillis() - st; +@@ -201,7 +201,7 @@ + if (!sc.isOpen()) + throw new ClosedChannelException(); + long st = System.currentTimeMillis(); +- int result = sc.poll(PollArrayWrapper.POLLIN, to); ++ int result = sc.poll(Net.POLLIN, to); + if (result > 0) { + if ((n = sc.read(bb)) != 0) + return n; +--- ./jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/ch/SocketChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -33,6 +33,7 @@ + import java.nio.channels.spi.*; + import java.util.*; + import sun.net.NetHooks; ++import sun.net.ExtendedOptionsImpl; + + + /** +@@ -237,6 +238,9 @@ + // additional options required by socket adaptor + set.add(StandardSocketOptions.IP_TOS); + set.add(ExtendedSocketOption.SO_OOBINLINE); ++ if (ExtendedOptionsImpl.flowSupported()) { ++ set.add(jdk.net.ExtendedSocketOptions.SO_FLOW_SLA); ++ } + return Collections.unmodifiableSet(set); + } + } +@@ -888,15 +892,14 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) { ++ if ((ops & Net.POLLNVAL) != 0) { + // This should only happen if this channel is pre-closed while a + // selection operation is in progress + // ## Throw an error if this channel has not been pre-closed + return false; + } + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + // No need to poll again in checkConnect, +@@ -905,19 +908,19 @@ + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLIN) != 0) && ++ if (((ops & Net.POLLIN) != 0) && + ((intOps & SelectionKey.OP_READ) != 0) && + (state == ST_CONNECTED)) + newOps |= SelectionKey.OP_READ; + +- if (((ops & PollArrayWrapper.POLLCONN) != 0) && ++ if (((ops & Net.POLLCONN) != 0) && + ((intOps & SelectionKey.OP_CONNECT) != 0) && + ((state == ST_UNCONNECTED) || (state == ST_PENDING))) { + newOps |= SelectionKey.OP_CONNECT; + readyToConnect = true; + } + +- if (((ops & PollArrayWrapper.POLLOUT) != 0) && ++ if (((ops & Net.POLLOUT) != 0) && + ((intOps & SelectionKey.OP_WRITE) != 0) && + (state == ST_CONNECTED)) + newOps |= SelectionKey.OP_WRITE; +@@ -962,11 +965,11 @@ + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + int newOps = 0; + if ((ops & SelectionKey.OP_READ) != 0) +- newOps |= PollArrayWrapper.POLLIN; ++ newOps |= Net.POLLIN; + if ((ops & SelectionKey.OP_WRITE) != 0) +- newOps |= PollArrayWrapper.POLLOUT; ++ newOps |= Net.POLLOUT; + if ((ops & SelectionKey.OP_CONNECT) != 0) +- newOps |= PollArrayWrapper.POLLCONN; ++ newOps |= Net.POLLCONN; + sk.selector.putEventOps(sk, newOps); + } + +--- ./jdk/src/share/classes/sun/nio/cs/UTF_8.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/cs/UTF_8.java Wed Jul 30 18:42:59 2014 +0100 +@@ -111,12 +111,18 @@ + (b4 & 0xc0) != 0x80; + } + +- // only used when there is less than 4 bytes left in src buffer ++ // only used when there is less than 4 bytes left in src buffer. ++ // both b1 and b2 should be "& 0xff" before passed in. + private static boolean isMalformed4_2(int b1, int b2) { +- return (b1 == 0xf0 && b2 == 0x90) || ++ return (b1 == 0xf0 && (b2 < 0x90 || b2 > 0xbf)) || ++ (b1 == 0xf4 && (b2 & 0xf0) != 0x80) || + (b2 & 0xc0) != 0x80; + } + ++ // tests if b1 and b2 are malformed as the first 2 bytes of a ++ // legal`4-byte utf-8 byte sequence. ++ // only used when there is less than 4 bytes left in src buffer, ++ // after isMalformed4_2 has been invoked. + private static boolean isMalformed4_3(int b3) { + return (b3 & 0xc0) != 0x80; + } +@@ -280,7 +286,9 @@ + // 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int srcRemaining = sl - sp; + if (srcRemaining < 4 || dl - dp < 2) { +- if (srcRemaining > 1 && isMalformed4_2(b1, sa[sp + 1])) ++ b1 &= 0xff; ++ if (b1 > 0xf4 || ++ srcRemaining > 1 && isMalformed4_2(b1, sa[sp + 1] & 0xff)) + return malformedForLength(src, sp, dst, dp, 1); + if (srcRemaining > 2 && isMalformed4_3(sa[sp + 2])) + return malformedForLength(src, sp, dst, dp, 2); +@@ -363,7 +371,9 @@ + // 4 bytes, 21 bits: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + int srcRemaining = limit - mark; + if (srcRemaining < 4 || dst.remaining() < 2) { +- if (srcRemaining > 1 && isMalformed4_2(b1, src.get())) ++ b1 &= 0xff; ++ if (b1 > 0xf4 || ++ srcRemaining > 1 && isMalformed4_2(b1, src.get() & 0xff)) + return malformedForLength(src, mark, 1); + if (srcRemaining > 2 && isMalformed4_3(src.get())) + return malformedForLength(src, mark, 2); +@@ -518,8 +528,9 @@ + } + if (malformedInputAction() != CodingErrorAction.REPLACE) + return -1; +- +- if (sp < sl && isMalformed4_2(b1, sa[sp])) { ++ b1 &= 0xff; ++ if (b1 > 0xf4 || ++ sp < sl && isMalformed4_2(b1, sa[sp] & 0xff)) { + da[dp++] = replacement().charAt(0); + continue; + } +--- ./jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1297,7 +1297,7 @@ + } + String osName = AccessController.doPrivileged( + new GetPropertyAction("os.name")); +- if ("SunOS".equals(osName) || "Linux".equals(osName) ++ if ("SunOS".equals(osName) || "Linux".equals(osName) || "AIX".equals(osName) + || osName.contains("OS X")) { + charset("x-COMPOUND_TEXT", "COMPOUND_TEXT", + new String[] { +--- ./jdk/src/share/classes/sun/reflect/annotation/TypeAnnotationParser.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/reflect/annotation/TypeAnnotationParser.java Wed Jul 30 18:42:59 2014 +0100 +@@ -75,7 +75,7 @@ + if (ti.getTarget() == filter) + l.add(t); + } +- TypeAnnotation[] typeAnnotations = l.toArray(new TypeAnnotation[0]); ++ TypeAnnotation[] typeAnnotations = l.toArray(EMPTY_TYPE_ANNOTATION_ARRAY); + return AnnotatedTypeFactory.buildAnnotatedType(type, + LocationInfo.BASE_LOCATION, + typeAnnotations, +@@ -245,7 +245,6 @@ + if (bounds != null) { + int startIndex = 0; + AnnotatedType[] res = new AnnotatedType[bounds.length]; +- Arrays.fill(res, AnnotatedTypeFactory.EMPTY_ANNOTATED_TYPE); + + // Adjust bounds index + // +@@ -276,12 +275,12 @@ + tInfo.getCount() == typeVarIndex) { + l.add(t); + } +- res[i] = AnnotatedTypeFactory.buildAnnotatedType(bounds[i], +- loc, +- l.toArray(new TypeAnnotation[0]), +- candidates.toArray(new TypeAnnotation[0]), +- (AnnotatedElement)decl); + } ++ res[i] = AnnotatedTypeFactory.buildAnnotatedType(bounds[i], ++ loc, ++ l.toArray(EMPTY_TYPE_ANNOTATION_ARRAY), ++ candidates.toArray(EMPTY_TYPE_ANNOTATION_ARRAY), ++ (AnnotatedElement)decl); + } + return res; + } +--- ./jdk/src/share/classes/sun/rmi/rmic/resources/rmic_ja.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/rmi/rmic/resources/rmic_ja.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -1,6 +1,6 @@ + # + # +-# Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 1996, 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 +@@ -71,7 +71,7 @@ + generator.env.idl=sun.rmi.rmic.iiop.BatchEnvironment + generator.env.xprint=sun.rmi.rmic.iiop.BatchEnvironment + +-rmic.usage=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <class names>\n\n<options>\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059\u3002\n -keep \u4E2D\u9593\u751F\u6210\u3055\u308C\u305F\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u306A\u3044\n -keepgenerated("-keep"\u3068\u540C\u3058)\n -v1.1 1.1\u30B9\u30BF\u30D6\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u7248\u7528\u306E\u30B9\u30BF\u30D6/\u30B9\u30B1\u30EB\u30C8\u30F3\u3092\u4F5C\u6210\u3059\u308B\n -vcompat 1.1\u30681.2\u306E\u30B9\u30BF\u30D6\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u7248\u3068\n \u4E92\u63DB\u6027\u306E\u3042\u308B\u30B9\u30BF\u30D6/\u30B9\u30B1\u30EB\u30C8\u30F3\u3092\u4F5C\u6210\u3059\u308B\n -v1.2 (\u30C7\u30D5\u30A9\u30EB\u30C8)1.2\u30B9\u30BF\u30D6\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u7248\u5C02\u7528\u306E\u30B9\u30BF\u30D6\u3092\u4F5C\u6210\u3059\u308B\n -iiop IIOP\u7528\u306E\u30B9\u30BF\u30D6\u3092\u4F5C\u6210\u3059\u308B\u3002\u6307\u5B9A\u3059\u308B\u3068<options>\u306B\u306F\u6B21\u306E\u3082\u306E\u3082\u542B\u307E\u308C\u307E\u3059\u3002\n\n -always \u6700\u65B0\u306E\u5834\u5408\u3067\u3082\u30B9\u30BF\u30D6\u3092\u4F5C\u6210\u3059\u308B\n -alwaysgenerate ("-always"\u3068\u540C\u3058)\n -nolocalstubs \u540C\u3058\u30D7\u30ED\u30BB\u30B9\u306B\u3064\u3044\u3066\u6700\u9069\u5316\u3055\u308C\u305F\u30B9\u30BF\u30D6\u306F\u4F5C\u6210\u3057\u306A\u3044\n\n -idl IDL\u3092\u4F5C\u6210\u3059\u308B\u3002\u6307\u5B9A\u3059\u308B\u3068<options>\u306B\u306F\u6B21\u306E\u3082\u306E\u3082\u542B\u307E\u308C\u307E\u3059\u3002\n\n -noValueMethods valuetypes\u306B\u5BFE\u3057\u3066\u30E1\u30BD\u30C3\u30C9\u3092\u751F\u6210\u3057\u306A\u3044\n -always \u6700\u65B0\u306E\u5834\u5408\u3067\u3082IDL\u3092\u751F\u6210\u3059\u308B\n -alwaysgenerate ("-always"\u3068\u540C\u3058)\n\n -g \u30C7\u30D0\u30C3\u30B0\u60C5\u5831\u3092\u751F\u6210\u3059\u308B\n -nowarn \u8B66\u544A\u3092\u751F\u6210\u3057\u306A\u3044\n -nowrite \u30B3\u30F3\u30D1\u30A4\u30EB\u3057\u305F\u30AF\u30E9\u30B9\u3092\u30D5\u30A1\u30A4\u30EB\u30FB\u30B7\u30B9\u30C6\u30E0\u306B\u66F8\u304D\u8FBC\u307E\u306A\u3044\n -verbose \u30B3\u30F3\u30D1\u30A4\u30E9\u306E\u52D5\u4F5C\u306B\u95A2\u3059\u308B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B\n -classpath <path> \u5165\u529B\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u4F4D\u7F6E\u3092\u6307\u5B9A\u3059\u308B\n -bootclasspath<path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u4F4D\u7F6E\u3092\u7F6E\u304D\u63DB\u3048\u308B\n -extdirs<path> \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6E08\u62E1\u5F35\u6A5F\u80FD\u306E\u4F4D\u7F6E\u3092\u7F6E\u304D\u63DB\u3048\u308B\n -d <directory> \u751F\u6210\u3055\u308C\u305F\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u683C\u7D0D\u3059\u308B\u4F4D\u7F6E\u3092\u6307\u5B9A\u3059\u308B\n -J<runtime flag> java\u30A4\u30F3\u30BF\u30D7\u30EA\u30BF\u306B\u5F15\u6570\u3092\u6E21\u3059\n ++rmic.usage=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <class names>\n\n<options>\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059\u3002\n -keep \u4E2D\u9593\u751F\u6210\u3055\u308C\u305F\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u306A\u3044\n -keepgenerated("-keep"\u3068\u540C\u3058)\n -v1.1 1.1\u30B9\u30BF\u30D6\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u7248\u7528\u306E\u30B9\u30BF\u30D6/\u30B9\u30B1\u30EB\u30C8\u30F3\u3092\u4F5C\u6210\u3059\u308B(\u975E\u63A8\u5968)\n -vcompat 1.1\u30681.2\u306E\u30B9\u30BF\u30D6\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u7248\u3068\n \u4E92\u63DB\u6027\u306E\u3042\u308B\u30B9\u30BF\u30D6/\u30B9\u30B1\u30EB\u30C8\u30F3\u3092\u4F5C\u6210\u3059\u308B(\u975E\u63A8\u5968)\n -v1.2 (\u30C7\u30D5\u30A9\u30EB\u30C8)1.2\u30B9\u30BF\u30D6\u30FB\u30D7\u30ED\u30C8\u30B3\u30EB\u7248\u5C02\u7528\u306E\u30B9\u30BF\u30D6\u3092\u4F5C\u6210\u3059\u308B(\u975E\u63A8\u5968)\n -iiop IIOP\u7528\u306E\u30B9\u30BF\u30D6\u3092\u4F5C\u6210\u3059\u308B\u3002\u6307\u5B9A\u3059\u308B\u3068<options>\u306B\u306F\u6B21\u306E\u3082\u306E\u3082\u542B\u307E\u308C\u307E\u3059\u3002\n\n -always \u6700\u65B0\u306E\u5834\u5408\u3067\u3082\u30B9\u30BF\u30D6\u3092\u4F5C\u6210\u3059\u308B\n -alwaysgenerate ("-always"\u3068\u540C\u3058)\n -nolocalstubs \u540C\u3058\u30D7\u30ED\u30BB\u30B9\u306B\u3064\u3044\u3066\u6700\u9069\u5316\u3055\u308C\u305F\u30B9\u30BF\u30D6\u306F\u4F5C\u6210\u3057\u306A\u3044\n\n -idl IDL\u3092\u4F5C\u6210\u3059\u308B\u3002\u6307\u5B9A\u3059\u308B\u3068<options>\u306B\u306F\u6B21\u306E\u3082\u306E\u3082\u542B\u307E\u308C\u307E\u3059\u3002\n\n -noValueMethods valuetypes\u306B\u5BFE\u3057\u3066\u30E1\u30BD\u30C3\u30C9\u3092\u751F\u6210\u3057\u306A\u3044\n -always \u6700\u65B0\u306E\u5834\u5408\u3067\u3082IDL\u3092\u751F\u6210\u3059\u308B\n -alwaysgenerate ("-always"\u3068\u540C\u3058)\n\n -g \u30C7\u30D0\u30C3\u30B0\u60C5\u5831\u3092\u751F\u6210\u3059\u308B\n -nowarn \u8B66\u544A\u3092\u751F\u6210\u3057\u306A\u3044\n -nowrite \u30B3\u30F3\u30D1\u30A4\u30EB\u3057\u305F\u30AF\u30E9\u30B9\u3092\u30D5\u30A1\u30A4\u30EB\u30FB\u30B7\u30B9\u30C6\u30E0\u306B\u66F8\u304D\u8FBC\u307E\u306A\u3044\n -verbose \u30B3\u30F3\u30D1\u30A4\u30E9\u306E\u52D5\u4F5C\u306B\u95A2\u3059\u308B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B\n -classpath <path> \u5165\u529B\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -bootclasspath<path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -extdirs<path> \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6E08\u62E1\u5F35\u6A5F\u80FD\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -d <directory> \u751F\u6210\u3055\u308C\u305F\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u683C\u7D0D\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -J<runtime flag> java\u30A4\u30F3\u30BF\u30D7\u30EA\u30BF\u306B\u5F15\u6570\u3092\u6E21\u3059\n + + # + # Generic Messages +@@ -91,8 +91,8 @@ + rmic.warnings=\u8B66\u544A{0}\u500B + rmic.1warning=\u8B66\u544A1\u500B + rmic.done_in=[{0}\u30DF\u30EA\u79D2\u3067\u5B8C\u4E86] +-rmic.no.memory=\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u30E1\u30E2\u30EA\u30FC\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002"-J-Xmx<size>"\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u3001\u6700\u5927\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u5897\u3084\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +-rmic.stack.overflow=\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u30B9\u30BF\u30C3\u30AF\u7A7A\u9593\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002"-J-Xss<size>"\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u3001Java\u30B9\u30BF\u30C3\u30AF\u306B\u5272\u308A\u5F53\u3066\u308B\u30E1\u30E2\u30EA\u30FC\u3092\u5897\u3084\u3057\u3066\u304F\u3060\u3055\u3044\u3002 ++rmic.no.memory=\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u30E1\u30E2\u30EA\u30FC\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002"-J-Xmx<size>"\u30B3\u30DE\u30F3\u30C9\u884C\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u3001\u6700\u5927\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u5897\u3084\u3057\u3066\u304F\u3060\u3055\u3044\u3002 ++rmic.stack.overflow=\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u30B9\u30BF\u30C3\u30AF\u7A7A\u9593\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059\u3002"-J-Xss<size>"\u30B3\u30DE\u30F3\u30C9\u884C\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u3001Java\u30B9\u30BF\u30C3\u30AF\u306B\u5272\u308A\u5F53\u3066\u308B\u30E1\u30E2\u30EA\u30FC\u3092\u5897\u3084\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + rmic.class.not.found=\u30AF\u30E9\u30B9{0}\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002 + rmic.missing.property=\u30D7\u30ED\u30D1\u30C6\u30A3generator.class.{0}\u304C\u3042\u308A\u307E\u305B\u3093 + rmic.cannot.instantiate=\u30AF\u30E9\u30B9{0}\u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u751F\u6210\u3067\u304D\u307E\u305B\u3093 +@@ -111,6 +111,7 @@ + rmic.must.throw.remoteexception={0}\u306F\u4E0D\u6B63\u306A\u30EA\u30E2\u30FC\u30C8\u30FB\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3067\u3059\u3002\u30E1\u30BD\u30C3\u30C9{1}\u306Fjava.rmi.RemoteException\u3092\u30B9\u30ED\u30FC\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + rmic.must.only.throw.exception=\u30E1\u30BD\u30C3\u30C9{0}\u306F{1}\u3092\u30B9\u30ED\u30FC\u3059\u308B\u306E\u3067\u4E0D\u6B63\u306A\u30EA\u30E2\u30FC\u30C8\u30FB\u30E1\u30BD\u30C3\u30C9\u5B9F\u88C5\u3067\u3059\u3002\u30EA\u30E2\u30FC\u30C8\u30FB\u30E1\u30BD\u30C3\u30C9\u306E\u5B9F\u88C5\u304C\u30B9\u30ED\u30FC\u3059\u308B\u306E\u306Fjava.lang.Exception\u304B\u305D\u306E\u30B5\u30D6\u30AF\u30E9\u30B9\u306E\u307F\u3067\u3059\u3002 + warn.rmic.tie.found=IIOP "tie"\u306F\u30AF\u30E9\u30B9{0}\u306E\u305F\u3081\u306B\u3042\u308A\u307E\u3059\u3002\n {1}\nPortableRemoteObject.exportObject\u3092\u4F7F\u7528\u3059\u308B\u5834\u5408\u306F\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u307E\u3059\u3002\u524A\u9664\u3057\u306A\u3044\u3068\u3001\u30B5\u30FC\u30D0\u30FC\u30FB\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306FJRMP\u3067\u306A\u304FIIOP\u306B\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3055\u308C\u307E\u3059\u3002 ++rmic.jrmp.stubs.deprecated=\u8B66\u544A: JRMP\u306E\u30B9\u30B1\u30EB\u30C8\u30F3\u3068static\u30B9\u30BF\u30D6\u306E\u751F\u6210\u3068\u4F7F\u7528\u306F\n\u975E\u63A8\u5968\u3067\u3059\u3002\u30B9\u30B1\u30EB\u30C8\u30F3\u306F\u4E0D\u8981\u3067\u3001static\u30B9\u30BF\u30D6\u306F\n\u52D5\u7684\u306B\u751F\u6210\u3055\u308C\u308B\u30B9\u30BF\u30D6\u306B\u5DEE\u3057\u66FF\u3048\u3089\u308C\u307E\u3057\u305F\u3002\u30E6\u30FC\u30B6\u30FC\u306F\n\u30B9\u30B1\u30EB\u30C8\u30F3\u3068static\u30B9\u30BF\u30D6\u3092\u751F\u6210\u3059\u308B\u305F\u3081\u306B{0}\u3092\u4F7F\u7528\u305B\u305A\u306B\u79FB\u884C\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\njava.rmi.server.UnicastRemoteObject\u306B\u95A2\u3059\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + + # + # RMI-IIOP Messages +--- ./jdk/src/share/classes/sun/rmi/rmic/resources/rmic_zh_CN.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/rmi/rmic/resources/rmic_zh_CN.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -1,6 +1,6 @@ + # + # +-# Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 1996, 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 +@@ -71,7 +71,7 @@ + generator.env.idl=sun.rmi.rmic.iiop.BatchEnvironment + generator.env.xprint=sun.rmi.rmic.iiop.BatchEnvironment + +-rmic.usage=\u7528\u6CD5: {0} <options> <class names>\n\n\u5176\u4E2D, <options> \u5305\u62EC:\n -keep \u4E0D\u5220\u9664\u4E34\u65F6\u751F\u6210\u7684\u6E90\u6587\u4EF6\n -keepgenerated (\u4E0E "-keep" \u76F8\u540C)\n -v1.1 \u521B\u5EFA 1.1 \u5B58\u6839\u534F\u8BAE\u7248\u672C\u7684\u5B58\u6839/\u9AA8\u67B6\n -vcompat \u521B\u5EFA\u4E0E 1.1 \u548C 1.2 \u5B58\u6839\u534F\u8BAE\u7248\u672C\n \u90FD\u517C\u5BB9\u7684\u5B58\u6839/\u9AA8\u67B6\n -v1.2 (\u9ED8\u8BA4\u503C) \u4EC5\u521B\u5EFA 1.2 \u5B58\u6839\u534F\u8BAE\u7248\u672C\u7684\u5B58\u6839\n -iiop \u521B\u5EFA IIOP \u7684\u5B58\u6839\u3002\u5982\u679C\u63D0\u4F9B, <options> \u8FD8\u5305\u62EC:\n\n -always \u521B\u5EFA\u5B58\u6839 (\u5373\u4F7F\u5F53\u524D\u663E\u793A)\n -alwaysgenerate (\u4E0E "-always" \u76F8\u540C)\n -nolocalstubs \u4E0D\u521B\u5EFA\u5BF9\u76F8\u540C\u8FDB\u7A0B\u4F18\u5316\u7684\u5B58\u6839\n\n -idl \u521B\u5EFA IDL\u3002\u5982\u679C\u63D0\u4F9B, <options> \u8FD8\u5305\u62EC:\n\n -noValueMethods \u4E0D\u4E3A valuetype \u751F\u6210\u65B9\u6CD5\n -always \u521B\u5EFA IDL (\u5373\u4F7F\u5F53\u524D\u663E\u793A)\n -alwaysgenerate (\u4E0E "-always" \u76F8\u540C)\n\n -g \u751F\u6210\u8C03\u8BD5\u4FE1\u606F\n -nowarn \u4E0D\u751F\u6210\u4EFB\u4F55\u8B66\u544A\n -nowrite \u4E0D\u5C06\u7F16\u8BD1\u7684\u7C7B\u5199\u5165\u6587\u4EF6\u7CFB\u7EDF\n -verbose \u8F93\u51FA\u6709\u5173\u7F16\u8BD1\u5668\u6B63\u5728\u6267\u884C\u7684\u64CD\u4F5C\u7684\u6D88\u606F\n -classpath <path> \u6307\u5B9A\u67E5\u627E\u8F93\u5165\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -bootclasspath <path> \u8986\u76D6\u5F15\u5BFC\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -extdirs <path> \u8986\u76D6\u6240\u5B89\u88C5\u6269\u5C55\u7684\u4F4D\u7F6E\n -d <directory> \u6307\u5B9A\u653E\u7F6E\u751F\u6210\u7684\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -J<runtime flag> \u5C06\u53C2\u6570\u4F20\u9012\u7ED9 java \u89E3\u91CA\u5668\n ++rmic.usage=\u7528\u6CD5: {0} <options> <class names>\n\n\u5176\u4E2D <options> \u5305\u62EC:\n -keep \u4E0D\u5220\u9664\u4E34\u65F6\u751F\u6210\u7684\u6E90\u6587\u4EF6\n -keepgenerated (\u4E0E "-keep" \u76F8\u540C)\n -v1.1 \u521B\u5EFA 1.1 \u5B58\u6839\u534F\u8BAE\u7248\u672C\u7684\u5B58\u6839/\u9AA8\u67B6 (\u5DF2\u8FC7\u65F6)\n -vcompat \u521B\u5EFA\u4E0E 1.1 \u548C 1.2 \u5B58\u6839\u534F\u8BAE\u7248\u672C\n \u90FD\u517C\u5BB9\u7684\u5B58\u6839/\u9AA8\u67B6 (\u5DF2\u8FC7\u65F6)\n -v1.2 (\u9ED8\u8BA4\u503C) \u4EC5\u521B\u5EFA 1.2 \u5B58\u6839\u534F\u8BAE\u7248\u672C\u7684\u5B58\u6839 (\u5DF2\u8FC7\u65F6)\n -iiop \u521B\u5EFA IIOP \u7684\u5B58\u6839\u3002\u5982\u679C\u63D0\u4F9B, <options> \u8FD8\u5305\u62EC:\n\n -always \u521B\u5EFA\u5B58\u6839 (\u5373\u4F7F\u5F53\u524D\u663E\u793A)\n -alwaysgenerate (\u4E0E "-always" \u76F8\u540C)\n -nolocalstubs \u4E0D\u521B\u5EFA\u5BF9\u76F8\u540C\u8FDB\u7A0B\u4F18\u5316\u7684\u5B58\u6839\n\n -idl \u521B\u5EFA IDL\u3002\u5982\u679C\u63D0\u4F9B, <options> \u8FD8\u5305\u62EC:\n\n -noValueMethods \u4E0D\u4E3A\u503C\u7C7B\u578B\u751F\u6210\u65B9\u6CD5\n -always \u521B\u5EFA IDL (\u5373\u4F7F\u5F53\u524D\u663E\u793A)\n -alwaysgenerate (\u4E0E "-always" \u76F8\u540C)\n\n -g \u751F\u6210\u8C03\u8BD5\u4FE1\u606F\n -nowarn \u4E0D\u751F\u6210\u4EFB\u4F55\u8B66\u544A\n -nowrite \u4E0D\u5C06\u7F16\u8BD1\u7684\u7C7B\u5199\u5165\u6587\u4EF6\u7CFB\u7EDF\n -verbose \u8F93\u51FA\u6709\u5173\u7F16\u8BD1\u5668\u6B63\u5728\u6267\u884C\u7684\u64CD\u4F5C\u7684\u6D88\u606F\n -classpath <path> \u6307\u5B9A\u67E5\u627E\u8F93\u5165\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -bootclasspath <path> \u8986\u76D6\u5F15\u5BFC\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -extdirs <path> \u8986\u76D6\u6240\u5B89\u88C5\u6269\u5C55\u7684\u4F4D\u7F6E\n -d <directory> \u6307\u5B9A\u653E\u7F6E\u751F\u6210\u7684\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -J<runtime flag> \u5C06\u53C2\u6570\u4F20\u9012\u7ED9 java \u89E3\u91CA\u5668\n + + # + # Generic Messages +@@ -111,6 +111,7 @@ + rmic.must.throw.remoteexception={0}\u4E0D\u662F\u6709\u6548\u8FDC\u7A0B\u63A5\u53E3: \u65B9\u6CD5{1}\u5FC5\u987B\u629B\u51FA java.rmi.RemoteException\u3002 + rmic.must.only.throw.exception=\u65B9\u6CD5{0}\u4E0D\u662F\u6709\u6548\u7684\u8FDC\u7A0B\u65B9\u6CD5\u5B9E\u73B0, \u56E0\u4E3A\u5B83\u629B\u51FA\u4E86{1}; \u8FDC\u7A0B\u65B9\u6CD5\u5B9E\u73B0\u53EA\u53EF\u80FD\u629B\u51FA java.lang.Exception \u6216\u5176\u5B50\u7C7B\u3002 + warn.rmic.tie.found=\u5BF9\u4E8E\u7C7B{0}, \u5B58\u5728 IIOP "tie":\n {1}\n\u5982\u679C\u4F7F\u7528 PortableRemoteObject.exportObject, \u5219\u5E94\u8BE5\u5220\u9664\u6B64\u6587\u4EF6, \u5426\u5219, \u60A8\u7684\u670D\u52A1\u5668\u5BF9\u8C61\u5C06\u4F1A\u5BFC\u51FA\u5230 IIOP \u800C\u975E JRMP\u3002 ++rmic.jrmp.stubs.deprecated=\u8B66\u544A: \u4E3A JRMP \u751F\u6210\u548C\u4F7F\u7528\u9AA8\u67B6\u53CA\u9759\u6001\u5B58\u6839\n\u5DF2\u8FC7\u65F6\u3002\u9AA8\u67B6\u4E0D\u518D\u5FC5\u8981, \u800C\u9759\u6001\u5B58\u6839\n\u5DF2\u7531\u52A8\u6001\u751F\u6210\u7684\u5B58\u6839\u53D6\u4EE3\u3002\u5EFA\u8BAE\u7528\u6237\n\u4E0D\u518D\u4F7F\u7528{0}\u6765\u751F\u6210\u9AA8\u67B6\u548C\u9759\u6001\u5B58\u6839\u3002\n\u8BF7\u53C2\u9605 java.rmi.server.UnicastRemoteObject \u7684\u6587\u6863\u3002 + + # + # RMI-IIOP Messages +--- ./jdk/src/share/classes/sun/security/internal/spec/TlsRsaPremasterSecretParameterSpec.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/internal/spec/TlsRsaPremasterSecretParameterSpec.java Wed Jul 30 18:42:59 2014 +0100 +@@ -26,11 +26,11 @@ + package sun.security.internal.spec; + + import java.security.spec.AlgorithmParameterSpec; ++import java.security.AccessController; ++import java.security.PrivilegedAction; + + /** +- * Parameters for SSL/TLS RSA Premaster secret generation. +- * This class is used by SSL/TLS client to initialize KeyGenerators of the +- * type "TlsRsaPremasterSecret". ++ * Parameters for SSL/TLS RSA premaster secret. + * + * <p>Instances of this class are immutable. + * +@@ -43,90 +43,108 @@ + public class TlsRsaPremasterSecretParameterSpec + implements AlgorithmParameterSpec { + +- private final int majorVersion; +- private final int minorVersion; +- private final byte[] encodedSecret; ++ /* ++ * The TLS spec says that the version in the RSA premaster secret must ++ * be the maximum version supported by the client (i.e. the version it ++ * requested in its client hello version). However, we (and other ++ * implementations) used to send the active negotiated version. The ++ * system property below allows to toggle the behavior. ++ */ ++ private final static String PROP_NAME = ++ "com.sun.net.ssl.rsaPreMasterSecretFix"; ++ ++ /* ++ * Default is "false" (old behavior) for compatibility reasons in ++ * SSLv3/TLSv1. Later protocols (TLSv1.1+) do not use this property. ++ */ ++ private final static boolean rsaPreMasterSecretFix = ++ AccessController.doPrivileged(new PrivilegedAction<Boolean>() { ++ public Boolean run() { ++ String value = System.getProperty(PROP_NAME); ++ if (value != null && value.equalsIgnoreCase("true")) { ++ return Boolean.TRUE; ++ } ++ ++ return Boolean.FALSE; ++ } ++ }); ++ ++ private final int clientVersion; ++ private final int serverVersion; + + /** + * Constructs a new TlsRsaPremasterSecretParameterSpec. +- * <P> +- * The version numbers will be placed inside the premaster secret to +- * detect version rollbacks attacks as described in the TLS specification. +- * Note that they do not indicate the protocol version negotiated for +- * the handshake. + * +- * @param majorVersion the major number of the protocol version +- * @param minorVersion the minor number of the protocol version ++ * @param clientVersion the version of the TLS protocol by which the ++ * client wishes to communicate during this session ++ * @param serverVersion the negotiated version of the TLS protocol which ++ * contains the lower of that suggested by the client in the client ++ * hello and the highest supported by the server. + * +- * @throws IllegalArgumentException if minorVersion or majorVersion are +- * negative or larger than 255 ++ * @throws IllegalArgumentException if clientVersion or serverVersion are ++ * negative or larger than (2^16 - 1) + */ +- public TlsRsaPremasterSecretParameterSpec(int majorVersion, +- int minorVersion) { +- this.majorVersion = +- TlsMasterSecretParameterSpec.checkVersion(majorVersion); +- this.minorVersion = +- TlsMasterSecretParameterSpec.checkVersion(minorVersion); +- this.encodedSecret = null; ++ public TlsRsaPremasterSecretParameterSpec( ++ int clientVersion, int serverVersion) { ++ ++ this.clientVersion = checkVersion(clientVersion); ++ this.serverVersion = checkVersion(serverVersion); + } + + /** +- * Constructs a new TlsRsaPremasterSecretParameterSpec. +- * <P> +- * The version numbers will be placed inside the premaster secret to +- * detect version rollbacks attacks as described in the TLS specification. +- * Note that they do not indicate the protocol version negotiated for +- * the handshake. +- * <P> +- * Usually, the encoded secret key is a random number that acts as +- * dummy pre_master_secret to avoid vulnerabilities described by +- * section 7.4.7.1, RFC 5246. ++ * Returns the version of the TLS protocol by which the client wishes to ++ * communicate during this session. + * +- * @param majorVersion the major number of the protocol version +- * @param minorVersion the minor number of the protocol version +- * @param encodedSecret the encoded secret key +- * +- * @throws IllegalArgumentException if minorVersion or majorVersion are +- * negative or larger than 255, or encodedSecret is not exactly 48 bytes. ++ * @return the version of the TLS protocol in ClientHello message + */ +- public TlsRsaPremasterSecretParameterSpec(int majorVersion, +- int minorVersion, byte[] encodedSecret) { +- this.majorVersion = +- TlsMasterSecretParameterSpec.checkVersion(majorVersion); +- this.minorVersion = +- TlsMasterSecretParameterSpec.checkVersion(minorVersion); +- +- if (encodedSecret == null || encodedSecret.length != 48) { +- throw new IllegalArgumentException( +- "Encoded secret is not exactly 48 bytes"); +- } +- this.encodedSecret = encodedSecret.clone(); ++ public int getClientVersion() { ++ return clientVersion; + } + + /** +- * Returns the major version. ++ * Returns the negotiated version of the TLS protocol which contains the ++ * lower of that suggested by the client in the client hello and the ++ * highest supported by the server. + * +- * @return the major version. ++ * @return the negotiated version of the TLS protocol in ServerHello message + */ +- public int getMajorVersion() { +- return majorVersion; ++ public int getServerVersion() { ++ return serverVersion; + } + + /** +- * Returns the minor version. ++ * Returns the major version used in RSA premaster secret. + * +- * @return the minor version. ++ * @return the major version used in RSA premaster secret. + */ +- public int getMinorVersion() { +- return minorVersion; ++ public int getMajorVersion() { ++ if (rsaPreMasterSecretFix || clientVersion >= 0x0302) { ++ // 0x0302: TLSv1.1 ++ return (clientVersion >>> 8) & 0xFF; ++ } ++ ++ return (serverVersion >>> 8) & 0xFF; + } + + /** +- * Returns the encoded secret. ++ * Returns the minor version used in RSA premaster secret. + * +- * @return the encoded secret, may be null if no encoded secret. ++ * @return the minor version used in RSA premaster secret. + */ +- public byte[] getEncodedSecret() { +- return encodedSecret == null ? null : encodedSecret.clone(); ++ public int getMinorVersion() { ++ if (rsaPreMasterSecretFix || clientVersion >= 0x0302) { ++ // 0x0302: TLSv1.1 ++ return clientVersion & 0xFF; ++ } ++ ++ return serverVersion & 0xFF; ++ } ++ ++ private int checkVersion(int version) { ++ if ((version < 0) || (version > 0xFFFF)) { ++ throw new IllegalArgumentException( ++ "Version must be between 0 and 65,535"); ++ } ++ return version; + } + } +--- ./jdk/src/share/classes/sun/security/krb5/Config.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/krb5/Config.java Wed Jul 30 18:42:59 2014 +0100 +@@ -549,12 +549,11 @@ + previous = line.substring(1).trim(); + } + } else { +- if (previous == null) { +- throw new KrbException( +- "Config file must starts with a section"); ++ // Lines before the first section are ignored ++ if (previous != null) { ++ v.add(previous); ++ previous = line; + } +- v.add(previous); +- previous = line; + } + } + if (previous != null) { +--- ./jdk/src/share/classes/sun/security/krb5/KdcComm.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/krb5/KdcComm.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -144,7 +144,8 @@ + try { + Config cfg = Config.getInstance(); + String temp = cfg.get("libdefaults", "kdc_timeout"); +- timeout = parsePositiveIntString(temp); ++ timeout = parseTimeString(temp); ++ + temp = cfg.get("libdefaults", "max_retries"); + max_retries = parsePositiveIntString(temp); + temp = cfg.get("libdefaults", "udp_preference_limit"); +@@ -426,6 +427,25 @@ + } + + /** ++ * Parses a time value string. If it ends with "s", parses as seconds. ++ * Otherwise, parses as milliseconds. ++ * @param s the time string ++ * @return the integer value in milliseconds, or -1 if input is null or ++ * has an invalid format ++ */ ++ private static int parseTimeString(String s) { ++ if (s == null) { ++ return -1; ++ } ++ if (s.endsWith("s")) { ++ int seconds = parsePositiveIntString(s.substring(0, s.length()-1)); ++ return (seconds < 0) ? -1 : (seconds*1000); ++ } else { ++ return parsePositiveIntString(s); ++ } ++ } ++ ++ /** + * Returns krb5.conf setting of {@code key} for a specific realm, + * which can be: + * 1. defined in the sub-stanza for the given realm inside [realms], or +@@ -446,7 +466,11 @@ + try { + String value = + Config.getInstance().get("realms", realm, key); +- temp = parsePositiveIntString(value); ++ if (key.equals("kdc_timeout")) { ++ temp = parseTimeString(value); ++ } else { ++ temp = parsePositiveIntString(value); ++ } + } catch (Exception exc) { + // Ignored, defValue will be picked up + } +--- ./jdk/src/share/classes/sun/security/pkcs11/P11RSACipher.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/pkcs11/P11RSACipher.java Wed Jul 30 18:42:59 2014 +0100 +@@ -37,6 +37,8 @@ + import static sun.security.pkcs11.TemplateManager.*; + import sun.security.pkcs11.wrapper.*; + import static sun.security.pkcs11.wrapper.PKCS11Constants.*; ++import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; ++import sun.security.util.KeyUtil; + + /** + * RSA Cipher implementation class. We currently only support +@@ -102,6 +104,12 @@ + // maximum output size. this is the length of the key + private int outputSize; + ++ // cipher parameter for TLS RSA premaster secret ++ private AlgorithmParameterSpec spec = null; ++ ++ // the source of randomness ++ private SecureRandom random; ++ + P11RSACipher(Token token, String algorithm, long mechanism) + throws PKCS11Exception { + super(); +@@ -165,8 +173,12 @@ + AlgorithmParameterSpec params, SecureRandom random) + throws InvalidKeyException, InvalidAlgorithmParameterException { + if (params != null) { +- throw new InvalidAlgorithmParameterException +- ("Parameters not supported"); ++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) { ++ throw new InvalidAlgorithmParameterException( ++ "Parameters not supported"); ++ } ++ spec = params; ++ this.random = random; // for TLS RSA premaster secret + } + implInit(opmode, key); + } +@@ -176,8 +188,8 @@ + SecureRandom random) + throws InvalidKeyException, InvalidAlgorithmParameterException { + if (params != null) { +- throw new InvalidAlgorithmParameterException +- ("Parameters not supported"); ++ throw new InvalidAlgorithmParameterException( ++ "Parameters not supported"); + } + implInit(opmode, key); + } +@@ -452,21 +464,101 @@ + protected Key engineUnwrap(byte[] wrappedKey, String algorithm, + int type) throws InvalidKeyException, NoSuchAlgorithmException { + +- // XXX implement unwrap using C_Unwrap() for all keys +- implInit(Cipher.DECRYPT_MODE, p11Key); +- if (wrappedKey.length > maxInputSize) { +- throw new InvalidKeyException("Key is too long for unwrapping"); ++ boolean isTlsRsaPremasterSecret = ++ algorithm.equals("TlsRsaPremasterSecret"); ++ Exception failover = null; ++ ++ SecureRandom secureRandom = random; ++ if (secureRandom == null && isTlsRsaPremasterSecret) { ++ secureRandom = new SecureRandom(); + } +- implUpdate(wrappedKey, 0, wrappedKey.length); +- try { +- byte[] encoded = doFinal(); ++ ++ // Should C_Unwrap be preferred for non-TLS RSA premaster secret? ++ if (token.supportsRawSecretKeyImport()) { ++ // XXX implement unwrap using C_Unwrap() for all keys ++ implInit(Cipher.DECRYPT_MODE, p11Key); ++ if (wrappedKey.length > maxInputSize) { ++ throw new InvalidKeyException("Key is too long for unwrapping"); ++ } ++ ++ byte[] encoded = null; ++ implUpdate(wrappedKey, 0, wrappedKey.length); ++ try { ++ encoded = doFinal(); ++ } catch (BadPaddingException e) { ++ if (isTlsRsaPremasterSecret) { ++ failover = e; ++ } else { ++ throw new InvalidKeyException("Unwrapping failed", e); ++ } ++ } catch (IllegalBlockSizeException e) { ++ // should not occur, handled with length check above ++ throw new InvalidKeyException("Unwrapping failed", e); ++ } ++ ++ if (isTlsRsaPremasterSecret) { ++ if (!(spec instanceof TlsRsaPremasterSecretParameterSpec)) { ++ throw new IllegalStateException( ++ "No TlsRsaPremasterSecretParameterSpec specified"); ++ } ++ ++ // polish the TLS premaster secret ++ TlsRsaPremasterSecretParameterSpec psps = ++ (TlsRsaPremasterSecretParameterSpec)spec; ++ encoded = KeyUtil.checkTlsPreMasterSecretKey( ++ psps.getClientVersion(), psps.getServerVersion(), ++ secureRandom, encoded, (failover != null)); ++ } ++ + return ConstructKeys.constructKey(encoded, algorithm, type); +- } catch (BadPaddingException e) { +- // should not occur +- throw new InvalidKeyException("Unwrapping failed", e); +- } catch (IllegalBlockSizeException e) { +- // should not occur, handled with length check above +- throw new InvalidKeyException("Unwrapping failed", e); ++ } else { ++ Session s = null; ++ SecretKey secretKey = null; ++ try { ++ try { ++ s = token.getObjSession(); ++ long keyType = CKK_GENERIC_SECRET; ++ CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] { ++ new CK_ATTRIBUTE(CKA_CLASS, CKO_SECRET_KEY), ++ new CK_ATTRIBUTE(CKA_KEY_TYPE, keyType), ++ }; ++ attributes = token.getAttributes( ++ O_IMPORT, CKO_SECRET_KEY, keyType, attributes); ++ long keyID = token.p11.C_UnwrapKey(s.id(), ++ new CK_MECHANISM(mechanism), p11Key.keyID, ++ wrappedKey, attributes); ++ secretKey = P11Key.secretKey(s, keyID, ++ algorithm, 48 << 3, attributes); ++ } catch (PKCS11Exception e) { ++ if (isTlsRsaPremasterSecret) { ++ failover = e; ++ } else { ++ throw new InvalidKeyException("unwrap() failed", e); ++ } ++ } ++ ++ if (isTlsRsaPremasterSecret) { ++ byte[] replacer = new byte[48]; ++ if (failover == null) { ++ // Does smart compiler dispose this operation? ++ secureRandom.nextBytes(replacer); ++ } ++ ++ TlsRsaPremasterSecretParameterSpec psps = ++ (TlsRsaPremasterSecretParameterSpec)spec; ++ ++ // Please use the tricky failover and replacer byte array ++ // as the parameters so that smart compiler won't dispose ++ // the unused variable . ++ secretKey = polishPreMasterSecretKey(token, s, ++ failover, replacer, secretKey, ++ psps.getClientVersion(), psps.getServerVersion()); ++ } ++ ++ return secretKey; ++ } finally { ++ token.releaseSession(s); ++ } + } + } + +@@ -475,6 +567,34 @@ + int n = P11KeyFactory.convertKey(token, key, algorithm).length(); + return n; + } ++ ++ private static SecretKey polishPreMasterSecretKey( ++ Token token, Session session, ++ Exception failover, byte[] replacer, SecretKey secretKey, ++ int clientVersion, int serverVersion) { ++ ++ if (failover != null) { ++ CK_VERSION version = new CK_VERSION( ++ (clientVersion >>> 8) & 0xFF, clientVersion & 0xFF); ++ try { ++ CK_ATTRIBUTE[] attributes = token.getAttributes( ++ O_GENERATE, CKO_SECRET_KEY, ++ CKK_GENERIC_SECRET, new CK_ATTRIBUTE[0]); ++ long keyID = token.p11.C_GenerateKey(session.id(), ++ // new CK_MECHANISM(CKM_TLS_PRE_MASTER_KEY_GEN, version), ++ new CK_MECHANISM(CKM_SSL3_PRE_MASTER_KEY_GEN, version), ++ attributes); ++ return P11Key.secretKey(session, ++ keyID, "TlsRsaPremasterSecret", 48 << 3, attributes); ++ } catch (PKCS11Exception e) { ++ throw new ProviderException( ++ "Could not generate premaster secret", e); ++ } ++ } ++ ++ return secretKey; ++ } ++ + } + + final class ConstructKeys { +--- ./jdk/src/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java Wed Jul 30 18:42:59 2014 +0100 +@@ -73,7 +73,7 @@ + + protected void engineInit(AlgorithmParameterSpec params, + SecureRandom random) throws InvalidAlgorithmParameterException { +- if (params instanceof TlsRsaPremasterSecretParameterSpec == false) { ++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) { + throw new InvalidAlgorithmParameterException(MSG); + } + this.spec = (TlsRsaPremasterSecretParameterSpec)params; +@@ -83,38 +83,32 @@ + throw new InvalidParameterException(MSG); + } + ++ // Only can be used in client side to generate TLS RSA premaster secret. + protected SecretKey engineGenerateKey() { + if (spec == null) { + throw new IllegalStateException + ("TlsRsaPremasterSecretGenerator must be initialized"); + } + +- byte[] b = spec.getEncodedSecret(); +- if (b == null) { +- CK_VERSION version = new CK_VERSION( ++ CK_VERSION version = new CK_VERSION( + spec.getMajorVersion(), spec.getMinorVersion()); +- Session session = null; +- try { +- session = token.getObjSession(); +- CK_ATTRIBUTE[] attributes = token.getAttributes( +- O_GENERATE, CKO_SECRET_KEY, +- CKK_GENERIC_SECRET, new CK_ATTRIBUTE[0]); +- long keyID = token.p11.C_GenerateKey(session.id(), +- new CK_MECHANISM(mechanism, version), attributes); +- SecretKey key = P11Key.secretKey(session, +- keyID, "TlsRsaPremasterSecret", 48 << 3, attributes); +- return key; +- } catch (PKCS11Exception e) { +- throw new ProviderException( +- "Could not generate premaster secret", e); +- } finally { +- token.releaseSession(session); +- } ++ Session session = null; ++ try { ++ session = token.getObjSession(); ++ CK_ATTRIBUTE[] attributes = token.getAttributes( ++ O_GENERATE, CKO_SECRET_KEY, ++ CKK_GENERIC_SECRET, new CK_ATTRIBUTE[0]); ++ long keyID = token.p11.C_GenerateKey(session.id(), ++ new CK_MECHANISM(mechanism, version), attributes); ++ SecretKey key = P11Key.secretKey(session, ++ keyID, "TlsRsaPremasterSecret", 48 << 3, attributes); ++ return key; ++ } catch (PKCS11Exception e) { ++ throw new ProviderException( ++ "Could not generate premaster secret", e); ++ } finally { ++ token.releaseSession(session); + } +- +- // Won't worry, the TlsRsaPremasterSecret will be soon converted to +- // TlsMasterSecret. +- return new SecretKeySpec(b, "TlsRsaPremasterSecret"); + } + + } +--- ./jdk/src/share/classes/sun/security/pkcs11/Token.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/pkcs11/Token.java Wed Jul 30 18:42:59 2014 +0100 +@@ -36,6 +36,7 @@ + import sun.security.jca.JCAUtil; + + import sun.security.pkcs11.wrapper.*; ++import static sun.security.pkcs11.TemplateManager.*; + import static sun.security.pkcs11.wrapper.PKCS11Constants.*; + + /** +@@ -122,6 +123,9 @@ + private final static CK_MECHANISM_INFO INVALID_MECH = + new CK_MECHANISM_INFO(0, 0, 0); + ++ // flag indicating whether the token supports raw secret key material import ++ private Boolean supportsRawSecretKeyImport; ++ + Token(SunPKCS11 provider) throws PKCS11Exception { + this.provider = provider; + this.removable = provider.removable; +@@ -160,6 +164,36 @@ + return writeProtected; + } + ++ // return whether the token supports raw secret key material import ++ boolean supportsRawSecretKeyImport() { ++ if (supportsRawSecretKeyImport == null) { ++ SecureRandom random = JCAUtil.getSecureRandom(); ++ byte[] encoded = new byte[48]; ++ random.nextBytes(encoded); ++ ++ CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[3]; ++ attributes[0] = new CK_ATTRIBUTE(CKA_CLASS, CKO_SECRET_KEY); ++ attributes[1] = new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_GENERIC_SECRET); ++ attributes[2] = new CK_ATTRIBUTE(CKA_VALUE, encoded); ++ ++ Session session = null; ++ try { ++ attributes = getAttributes(O_IMPORT, ++ CKO_SECRET_KEY, CKK_GENERIC_SECRET, attributes); ++ session = getObjSession(); ++ long keyID = p11.C_CreateObject(session.id(), attributes); ++ ++ supportsRawSecretKeyImport = Boolean.TRUE; ++ } catch (PKCS11Exception e) { ++ supportsRawSecretKeyImport = Boolean.FALSE; ++ } finally { ++ releaseSession(session); ++ } ++ } ++ ++ return supportsRawSecretKeyImport; ++ } ++ + // return whether we are logged in + // uses cached result if current. session is optional and may be null + boolean isLoggedIn(Session session) throws PKCS11Exception { +--- ./jdk/src/share/classes/sun/security/provider/certpath/AdaptableX509CertSelector.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/provider/certpath/AdaptableX509CertSelector.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 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 +@@ -26,13 +26,16 @@ + package sun.security.provider.certpath; + + import java.io.IOException; +-import java.util.Date; +- ++import java.math.BigInteger; + import java.security.cert.Certificate; + import java.security.cert.X509Certificate; + import java.security.cert.X509CertSelector; + import java.security.cert.CertificateException; ++import java.util.Arrays; ++import java.util.Date; + ++import sun.security.util.Debug; ++import sun.security.util.DerInputStream; + import sun.security.util.DerOutputStream; + import sun.security.x509.SerialNumber; + import sun.security.x509.KeyIdentifier; +@@ -40,26 +43,27 @@ + + /** + * An adaptable X509 certificate selector for forward certification path +- * building. ++ * building. This selector overrides the default X509CertSelector matching ++ * rules for the subjectKeyIdentifier and serialNumber criteria, and adds ++ * additional rules for certificate validity. + * + * @since 1.7 + */ + class AdaptableX509CertSelector extends X509CertSelector { ++ ++ private static final Debug debug = Debug.getInstance("certpath"); ++ + // The start date of a validity period. + private Date startDate; + + // The end date of a validity period. + private Date endDate; + +- // Is subject key identifier sensitive? +- private boolean isSKIDSensitive = false; ++ // The subject key identifier ++ private byte[] ski; + +- // Is serial number sensitive? +- private boolean isSNSensitive = false; +- +- AdaptableX509CertSelector() { +- super(); +- } ++ // The serial number ++ private BigInteger serial; + + /** + * Sets the criterion of the X509Certificate validity period. +@@ -86,51 +90,70 @@ + } + + /** +- * Parse the authority key identifier extension. ++ * This selector overrides the subjectKeyIdentifier matching rules of ++ * X509CertSelector, so it throws IllegalArgumentException if this method ++ * is ever called. ++ */ ++ @Override ++ public void setSubjectKeyIdentifier(byte[] subjectKeyID) { ++ throw new IllegalArgumentException(); ++ } ++ ++ /** ++ * This selector overrides the serialNumber matching rules of ++ * X509CertSelector, so it throws IllegalArgumentException if this method ++ * is ever called. ++ */ ++ @Override ++ public void setSerialNumber(BigInteger serial) { ++ throw new IllegalArgumentException(); ++ } ++ ++ /** ++ * Sets the subjectKeyIdentifier and serialNumber criteria from the ++ * authority key identifier extension. + * +- * If the keyIdentifier field of the extension is non-null, set the +- * subjectKeyIdentifier criterion. If the authorityCertSerialNumber +- * field is non-null, set the serialNumber criterion. ++ * The subjectKeyIdentifier criterion is set to the keyIdentifier field ++ * of the extension, or null if it is empty. The serialNumber criterion ++ * is set to the authorityCertSerialNumber field, or null if it is empty. + * +- * Note that we will not set the subject criterion according to the ++ * Note that we do not set the subject criterion to the + * authorityCertIssuer field of the extension. The caller MUST set +- * the subject criterion before call match(). ++ * the subject criterion before calling match(). + * +- * @param akidext the authorityKeyIdentifier extension ++ * @param ext the authorityKeyIdentifier extension ++ * @throws IOException if there is an error parsing the extension + */ +- void parseAuthorityKeyIdentifierExtension( +- AuthorityKeyIdentifierExtension akidext) throws IOException { +- if (akidext != null) { +- KeyIdentifier akid = (KeyIdentifier)akidext.get( +- AuthorityKeyIdentifierExtension.KEY_ID); ++ void setSkiAndSerialNumber(AuthorityKeyIdentifierExtension ext) ++ throws IOException { ++ ++ ski = null; ++ serial = null; ++ ++ if (ext != null) { ++ KeyIdentifier akid = (KeyIdentifier)ext.get( ++ AuthorityKeyIdentifierExtension.KEY_ID); + if (akid != null) { +- // Do not override the previous setting for initial selection. +- if (isSKIDSensitive || getSubjectKeyIdentifier() == null) { +- DerOutputStream derout = new DerOutputStream(); +- derout.putOctetString(akid.getIdentifier()); +- super.setSubjectKeyIdentifier(derout.toByteArray()); +- +- isSKIDSensitive = true; +- } ++ DerOutputStream derout = new DerOutputStream(); ++ derout.putOctetString(akid.getIdentifier()); ++ ski = derout.toByteArray(); + } +- +- SerialNumber asn = (SerialNumber)akidext.get( +- AuthorityKeyIdentifierExtension.SERIAL_NUMBER); ++ SerialNumber asn = (SerialNumber)ext.get( ++ AuthorityKeyIdentifierExtension.SERIAL_NUMBER); + if (asn != null) { +- // Do not override the previous setting for initial selection. +- if (isSNSensitive || getSerialNumber() == null) { +- super.setSerialNumber(asn.getNumber()); +- isSNSensitive = true; +- } ++ serial = asn.getNumber(); + } +- +- // the subject criterion should be set by the caller. ++ // the subject criterion should be set by the caller + } + } + + /** + * Decides whether a <code>Certificate</code> should be selected. + * ++ * This method overrides the matching rules for the subjectKeyIdentifier ++ * and serialNumber criteria and adds additional rules for certificate ++ * validity. ++ * + * For the purpose of compatibility, when a certificate is of + * version 1 and version 2, or the certificate does not include + * a subject key identifier extension, the selection criterion +@@ -138,12 +161,28 @@ + */ + @Override + public boolean match(Certificate cert) { +- if (!(cert instanceof X509Certificate)) { ++ X509Certificate xcert = (X509Certificate)cert; ++ ++ // match subject key identifier ++ if (!matchSubjectKeyID(xcert)) { + return false; + } + +- X509Certificate xcert = (X509Certificate)cert; ++ // In practice, a CA may replace its root certificate and require that ++ // the existing certificate is still valid, even if the AKID extension ++ // does not match the replacement root certificate fields. ++ // ++ // Conservatively, we only support the replacement for version 1 and ++ // version 2 certificate. As for version 3, the certificate extension ++ // may contain sensitive information (for example, policies), the ++ // AKID need to be respected to seek the exact certificate in case ++ // of key or certificate abuse. + int version = xcert.getVersion(); ++ if (serial != null && version > 2) { ++ if (!serial.equals(xcert.getSerialNumber())) { ++ return false; ++ } ++ } + + // Check the validity period for version 1 and 2 certificate. + if (version < 3) { +@@ -154,7 +193,6 @@ + return false; + } + } +- + if (endDate != null) { + try { + xcert.checkValidity(endDate); +@@ -164,26 +202,50 @@ + } + } + +- // If no SubjectKeyIdentifier extension, don't bother to check it. +- if (isSKIDSensitive && +- (version < 3 || xcert.getExtensionValue("2.5.29.14") == null)) { +- setSubjectKeyIdentifier(null); ++ ++ if (!super.match(cert)) { ++ return false; + } + +- // In practice, a CA may replace its root certificate and require that +- // the existing certificate is still valid, even if the AKID extension +- // does not match the replacement root certificate fields. +- // +- // Conservatively, we only support the replacement for version 1 and +- // version 2 certificate. As for version 2, the certificate extension +- // may contain sensitive information (for example, policies), the +- // AKID need to be respected to seek the exact certificate in case +- // of key or certificate abuse. +- if (isSNSensitive && version < 3) { +- setSerialNumber(null); ++ return true; ++ } ++ ++ /* ++ * Match on subject key identifier extension value. These matching rules ++ * are identical to X509CertSelector except that if the certificate does ++ * not have a subject key identifier extension, it returns true. ++ */ ++ private boolean matchSubjectKeyID(X509Certificate xcert) { ++ if (ski == null) { ++ return true; + } +- +- return super.match(cert); ++ try { ++ byte[] extVal = xcert.getExtensionValue("2.5.29.14"); ++ if (extVal == null) { ++ if (debug != null) { ++ debug.println("AdaptableX509CertSelector.match: " ++ + "no subject key ID extension"); ++ } ++ return true; ++ } ++ DerInputStream in = new DerInputStream(extVal); ++ byte[] certSubjectKeyID = in.getOctetString(); ++ if (certSubjectKeyID == null || ++ !Arrays.equals(ski, certSubjectKeyID)) { ++ if (debug != null) { ++ debug.println("AdaptableX509CertSelector.match: " ++ + "subject key IDs don't match"); ++ } ++ return false; ++ } ++ } catch (IOException ex) { ++ if (debug != null) { ++ debug.println("AdaptableX509CertSelector.match: " ++ + "exception in subject key ID check"); ++ } ++ return false; ++ } ++ return true; + } + + @Override +@@ -198,6 +260,9 @@ + copy.endDate = (Date)endDate.clone(); + } + ++ if (ski != null) { ++ copy.ski = ski.clone(); ++ } + return copy; + } + } +--- ./jdk/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/provider/certpath/DistributionPointFetcher.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -751,9 +751,7 @@ + * issued. [section 5.2.1, RFC 2459] + */ + AuthorityKeyIdentifierExtension crlAKID = crl.getAuthKeyIdExtension(); +- if (crlAKID != null) { +- issuerSelector.parseAuthorityKeyIdentifierExtension(crlAKID); +- } ++ issuerSelector.setSkiAndSerialNumber(crlAKID); + + matched = issuerSelector.match(cert); + +--- ./jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -269,7 +269,7 @@ + */ + AuthorityKeyIdentifierExtension akidext = + currentState.cert.getAuthorityKeyIdentifierExtension(); +- caSelector.parseAuthorityKeyIdentifierExtension(akidext); ++ caSelector.setSkiAndSerialNumber(akidext); + + /* + * check the validity period +--- ./jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/provider/certpath/PKIXCertPathValidator.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -94,16 +94,13 @@ + X509Certificate firstCert = certList.get(0); + // check trusted certificate's subject + selector.setSubject(firstCert.getIssuerX500Principal()); +- // check the validity period +- selector.setValidityPeriod(firstCert.getNotBefore(), +- firstCert.getNotAfter()); + /* + * Facilitate certification path construction with authority + * key identifier and subject key identifier. + */ + try { + X509CertImpl firstCertImpl = X509CertImpl.toImpl(firstCert); +- selector.parseAuthorityKeyIdentifierExtension( ++ selector.setSkiAndSerialNumber( + firstCertImpl.getAuthorityKeyIdentifierExtension()); + } catch (CertificateException | IOException e) { + // ignore +--- ./jdk/src/share/classes/sun/security/provider/certpath/RevocationChecker.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/provider/certpath/RevocationChecker.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -1035,6 +1035,9 @@ + boolean signFlag = true; + List<? extends Certificate> cpList = + cpbr.getCertPath().getCertificates(); ++ if (cpList.isEmpty()) { ++ return; ++ } + try { + for (int i = cpList.size()-1; i >= 0; i-- ) { + X509Certificate cert = (X509Certificate)cpList.get(i); +--- ./jdk/src/share/classes/sun/security/smartcardio/CardImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/smartcardio/CardImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -237,6 +237,12 @@ + } + } + ++ private static final boolean invertReset = ++ Boolean.parseBoolean( ++ java.security.AccessController.doPrivileged( ++ new sun.security.action.GetPropertyAction( ++ "sun.security.smartcardio.invertCardReset", "false"))); ++ + public void disconnect(boolean reset) throws CardException { + if (reset) { + checkSecurity("reset"); +@@ -245,8 +251,12 @@ + return; + } + checkExclusive(); ++ // to preserve old behaviour, don't change flag until here ++ if (invertReset) { ++ reset = !reset; ++ } + try { +- SCardDisconnect(cardId, (reset ? SCARD_LEAVE_CARD : SCARD_RESET_CARD)); ++ SCardDisconnect(cardId, (reset ? SCARD_RESET_CARD : SCARD_LEAVE_CARD)); + } catch (PCSCException e) { + throw new CardException("disconnect() failed", e); + } finally { +--- ./jdk/src/share/classes/sun/security/ssl/ByteBufferInputStream.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/ByteBufferInputStream.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -60,7 +60,8 @@ + if (bb.remaining() == 0) { + return -1; + } +- return bb.get(); ++ ++ return (bb.get() & 0xFF); // need to be in the range 0 to 255 + } + + /** +--- ./jdk/src/share/classes/sun/security/ssl/EngineInputRecord.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/EngineInputRecord.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -109,14 +109,8 @@ + ProtocolVersion recordVersion = + ProtocolVersion.valueOf(buf.get(pos + 1), buf.get(pos + 2)); + +- // Check if too old (currently not possible) +- // or if the major version does not match. +- // The actual version negotiation is in the handshaker classes +- if ((recordVersion.v < ProtocolVersion.MIN.v) +- || (recordVersion.major > ProtocolVersion.MAX.major)) { +- throw new SSLException( +- "Unsupported record version " + recordVersion); +- } ++ // check the record version ++ checkRecordVersion(recordVersion, false); + + /* + * Reasonably sure this is a V3, disable further checks. +@@ -147,18 +141,8 @@ + ProtocolVersion recordVersion = + ProtocolVersion.valueOf(buf.get(pos + 3), buf.get(pos + 4)); + +- // Check if too old (currently not possible) +- // or if the major version does not match. +- // The actual version negotiation is in the handshaker classes +- if ((recordVersion.v < ProtocolVersion.MIN.v) +- || (recordVersion.major > ProtocolVersion.MAX.major)) { +- +- // if it's not SSLv2, we're out of here. +- if (recordVersion.v != ProtocolVersion.SSL20Hello.v) { +- throw new SSLException( +- "Unsupported record version " + recordVersion); +- } +- } ++ // check the record version ++ checkRecordVersion(recordVersion, true); + + /* + * Client or Server Hello +@@ -406,14 +390,9 @@ + + ProtocolVersion recordVersion = ProtocolVersion.valueOf( + srcBB.get(srcPos + 1), srcBB.get(srcPos + 2)); +- // Check if too old (currently not possible) +- // or if the major version does not match. +- // The actual version negotiation is in the handshaker classes +- if ((recordVersion.v < ProtocolVersion.MIN.v) +- || (recordVersion.major > ProtocolVersion.MAX.major)) { +- throw new SSLException( +- "Unsupported record version " + recordVersion); +- } ++ ++ // check the record version ++ checkRecordVersion(recordVersion, false); + + /* + * It's really application data. How much to consume? +--- ./jdk/src/share/classes/sun/security/ssl/InputRecord.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/InputRecord.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -534,19 +534,35 @@ + } + + /** ++ * Return true if the specified record protocol version is out of the ++ * range of the possible supported versions. ++ */ ++ static void checkRecordVersion(ProtocolVersion version, ++ boolean allowSSL20Hello) throws SSLException { ++ // Check if the record version is too old (currently not possible) ++ // or if the major version does not match. ++ // ++ // The actual version negotiation is in the handshaker classes ++ if ((version.v < ProtocolVersion.MIN.v) || ++ ((version.major & 0xFF) > (ProtocolVersion.MAX.major & 0xFF))) { ++ ++ // if it's not SSLv2, we're out of here. ++ if (!allowSSL20Hello || ++ (version.v != ProtocolVersion.SSL20Hello.v)) { ++ throw new SSLException("Unsupported record version " + version); ++ } ++ } ++ } ++ ++ /** + * Read a SSL/TLS record. Throw an IOException if the format is invalid. + */ + private void readV3Record(InputStream s, OutputStream o) + throws IOException { + ProtocolVersion recordVersion = ProtocolVersion.valueOf(buf[1], buf[2]); +- // Check if too old (currently not possible) +- // or if the major version does not match. +- // The actual version negotiation is in the handshaker classes +- if ((recordVersion.v < ProtocolVersion.MIN.v) +- || (recordVersion.major > ProtocolVersion.MAX.major)) { +- throw new SSLException( +- "Unsupported record version " + recordVersion); +- } ++ ++ // check the record version ++ checkRecordVersion(recordVersion, false); + + /* + * Get and check length, then the data. +--- ./jdk/src/share/classes/sun/security/ssl/ProtocolVersion.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/ProtocolVersion.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -101,7 +101,7 @@ + this.v = v; + this.name = name; + major = (byte)(v >>> 8); +- minor = (byte)(v & 0xff); ++ minor = (byte)(v & 0xFF); + } + + // private +@@ -117,8 +117,8 @@ + } else if (v == SSL20Hello.v) { + return SSL20Hello; + } else { +- int major = (v >>> 8) & 0xff; +- int minor = v & 0xff; ++ int major = (v >>> 8) & 0xFF; ++ int minor = v & 0xFF; + return new ProtocolVersion(v, "Unknown-" + major + "." + minor); + } + } +@@ -128,10 +128,7 @@ + * numbers. Never throws exceptions. + */ + public static ProtocolVersion valueOf(int major, int minor) { +- major &= 0xff; +- minor &= 0xff; +- int v = (major << 8) | minor; +- return valueOf(v); ++ return valueOf(((major & 0xFF) << 8) | (minor & 0xFF)); + } + + /** +--- ./jdk/src/share/classes/sun/security/ssl/RSAClientKeyExchange.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/ssl/RSAClientKeyExchange.java Wed Jul 30 18:42:59 2014 +0100 +@@ -48,23 +48,6 @@ + */ + final class RSAClientKeyExchange extends HandshakeMessage { + +- /** +- * The TLS spec says that the version in the RSA premaster secret must +- * be the maximum version supported by the client (i.e. the version it +- * requested in its client hello version). However, we (and other +- * implementations) used to send the active negotiated version. The +- * system property below allows to toggle the behavior. +- */ +- private final static String PROP_NAME = +- "com.sun.net.ssl.rsaPreMasterSecretFix"; +- +- /* +- * Default is "false" (old behavior) for compatibility reasons in +- * SSLv3/TLSv1. Later protocols (TLSv1.1+) do not use this property. +- */ +- private final static boolean rsaPreMasterSecretFix = +- Debug.getBooleanProperty(PROP_NAME, false); +- + /* + * The following field values were encrypted with the server's public + * key (or temp key from server key exchange msg) and are presented +@@ -88,22 +71,12 @@ + } + this.protocolVersion = protocolVersion; + +- int major, minor; +- +- if (rsaPreMasterSecretFix || maxVersion.v >= ProtocolVersion.TLS11.v) { +- major = maxVersion.major; +- minor = maxVersion.minor; +- } else { +- major = protocolVersion.major; +- minor = protocolVersion.minor; +- } +- + try { + String s = ((protocolVersion.v >= ProtocolVersion.TLS12.v) ? + "SunTls12RsaPremasterSecret" : "SunTlsRsaPremasterSecret"); + KeyGenerator kg = JsseJce.getKeyGenerator(s); +- kg.init(new TlsRsaPremasterSecretParameterSpec(major, minor), +- generator); ++ kg.init(new TlsRsaPremasterSecretParameterSpec( ++ maxVersion.v, protocolVersion.v), generator); + preMaster = kg.generateKey(); + + Cipher cipher = JsseJce.getCipher(JsseJce.CIPHER_RSA_PKCS1); +@@ -138,18 +111,16 @@ + } + } + +- Exception failover = null; +- byte[] encoded = null; + try { + Cipher cipher = JsseJce.getCipher(JsseJce.CIPHER_RSA_PKCS1); +- // Cannot generate key here, please don't use Cipher.UNWRAP_MODE! +- cipher.init(Cipher.DECRYPT_MODE, privateKey); +- encoded = cipher.doFinal(encrypted); +- } catch (BadPaddingException bpe) { +- failover = bpe; +- encoded = null; +- } catch (IllegalBlockSizeException ibse) { +- // the message it too big to process with RSA ++ cipher.init(Cipher.UNWRAP_MODE, privateKey, ++ new TlsRsaPremasterSecretParameterSpec( ++ maxVersion.v, currentVersion.v), ++ generator); ++ preMaster = (SecretKey)cipher.unwrap(encrypted, ++ "TlsRsaPremasterSecret", Cipher.SECRET_KEY); ++ } catch (InvalidKeyException ibk) { ++ // the message is too big to process with RSA + throw new SSLProtocolException( + "Unable to process PreMasterSecret, may be too big"); + } catch (Exception e) { +@@ -160,124 +131,6 @@ + } + throw new RuntimeException("Could not generate dummy secret", e); + } +- +- // polish the premaster secret +- preMaster = polishPreMasterSecretKey( +- currentVersion, maxVersion, generator, encoded, failover); +- } +- +- /** +- * To avoid vulnerabilities described by section 7.4.7.1, RFC 5246, +- * treating incorrectly formatted message blocks and/or mismatched +- * version numbers in a manner indistinguishable from correctly +- * formatted RSA blocks. +- * +- * RFC 5246 describes the approach as : +- * +- * 1. Generate a string R of 48 random bytes +- * +- * 2. Decrypt the message to recover the plaintext M +- * +- * 3. If the PKCS#1 padding is not correct, or the length of message +- * M is not exactly 48 bytes: +- * pre_master_secret = R +- * else If ClientHello.client_version <= TLS 1.0, and version +- * number check is explicitly disabled: +- * premaster secret = M +- * else If M[0..1] != ClientHello.client_version: +- * premaster secret = R +- * else: +- * premaster secret = M +- * +- * Note that #2 has completed before the call of this method. +- */ +- private SecretKey polishPreMasterSecretKey(ProtocolVersion currentVersion, +- ProtocolVersion clientHelloVersion, SecureRandom generator, +- byte[] encoded, Exception failoverException) { +- +- this.protocolVersion = clientHelloVersion; +- if (generator == null) { +- generator = new SecureRandom(); +- } +- byte[] random = new byte[48]; +- generator.nextBytes(random); +- +- if (failoverException == null && encoded != null) { +- // check the length +- if (encoded.length != 48) { +- if (debug != null && Debug.isOn("handshake")) { +- System.out.println( +- "incorrect length of premaster secret: " + +- encoded.length); +- } +- +- return generatePreMasterSecret( +- clientHelloVersion, random, generator); +- } +- +- if (clientHelloVersion.major != encoded[0] || +- clientHelloVersion.minor != encoded[1]) { +- +- if (clientHelloVersion.v <= ProtocolVersion.TLS10.v && +- currentVersion.major == encoded[0] && +- currentVersion.minor == encoded[1]) { +- /* +- * For compatibility, we maintain the behavior that the +- * version in pre_master_secret can be the negotiated +- * version for TLS v1.0 and SSL v3.0. +- */ +- this.protocolVersion = currentVersion; +- } else { +- if (debug != null && Debug.isOn("handshake")) { +- System.out.println("Mismatching Protocol Versions, " + +- "ClientHello.client_version is " + +- clientHelloVersion + +- ", while PreMasterSecret.client_version is " + +- ProtocolVersion.valueOf(encoded[0], encoded[1])); +- } +- +- encoded = random; +- } +- } +- +- return generatePreMasterSecret( +- clientHelloVersion, encoded, generator); +- } +- +- if (debug != null && Debug.isOn("handshake") && +- failoverException != null) { +- System.out.println("Error decrypting premaster secret:"); +- failoverException.printStackTrace(System.out); +- } +- +- return generatePreMasterSecret(clientHelloVersion, random, generator); +- } +- +- // generate a premaster secret with the specified version number +- private static SecretKey generatePreMasterSecret( +- ProtocolVersion version, byte[] encodedSecret, +- SecureRandom generator) { +- +- if (debug != null && Debug.isOn("handshake")) { +- System.out.println("Generating a random fake premaster secret"); +- } +- +- try { +- String s = ((version.v >= ProtocolVersion.TLS12.v) ? +- "SunTls12RsaPremasterSecret" : "SunTlsRsaPremasterSecret"); +- KeyGenerator kg = JsseJce.getKeyGenerator(s); +- kg.init(new TlsRsaPremasterSecretParameterSpec( +- version.major, version.minor, encodedSecret), generator); +- return kg.generateKey(); +- } catch (InvalidAlgorithmParameterException | +- NoSuchAlgorithmException iae) { +- // unlikely to happen, otherwise, must be a provider exception +- if (debug != null && Debug.isOn("handshake")) { +- System.out.println("RSA premaster secret generation error:"); +- iae.printStackTrace(System.out); +- } +- throw new RuntimeException("Could not generate dummy secret", iae); +- } + } + + @Override +--- ./jdk/src/share/classes/sun/security/tools/jarsigner/Main.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/tools/jarsigner/Main.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1553,8 +1553,7 @@ + first = false; + } + try { +- CertPath cp = certificateFactory.generateCertPath(certs); +- validator.validate(cp, pkixParameters); ++ validateCertChain(certs); + } catch (Exception e) { + if (debug) { + e.printStackTrace(); +@@ -1864,8 +1863,7 @@ + printCert("", certChain[0], true, null, true); + + try { +- CertPath cp = certificateFactory.generateCertPath(Arrays.asList(certChain)); +- validator.validate(cp, pkixParameters); ++ validateCertChain(Arrays.asList(certChain)); + } catch (Exception e) { + if (debug) { + e.printStackTrace(); +@@ -1930,6 +1928,22 @@ + System.exit(1); + } + ++ void validateCertChain(List<? extends Certificate> certs) throws Exception { ++ int cpLen = 0; ++ out: for (; cpLen<certs.size(); cpLen++) { ++ for (TrustAnchor ta: pkixParameters.getTrustAnchors()) { ++ if (ta.getTrustedCert().equals(certs.get(cpLen))) { ++ break out; ++ } ++ } ++ } ++ if (cpLen > 0) { ++ CertPath cp = certificateFactory.generateCertPath( ++ (cpLen == certs.size())? certs: certs.subList(0, cpLen)); ++ validator.validate(cp, pkixParameters); ++ } ++ } ++ + char[] getPass(String prompt) + { + System.err.print(prompt); +--- ./jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -135,7 +135,10 @@ + {".Unsigned.entries.", "(\u672A\u7F72\u540D\u306E\u30A8\u30F3\u30C8\u30EA)"}, + {"jar.is.unsigned.signatures.missing.or.not.parsable.", + "jar\u306F\u7F72\u540D\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002(\u30B7\u30B0\u30CD\u30C1\u30E3\u304C\u898B\u3064\u304B\u3089\u306A\u3044\u304B\u3001\u69CB\u6587\u89E3\u6790\u3067\u304D\u307E\u305B\u3093)"}, ++ {"jar.signed.", "jar\u306F\u7F72\u540D\u3055\u308C\u307E\u3057\u305F\u3002"}, ++ {"jar.signed.with.signer.errors.", "jar\u306F\u7F72\u540D\u3055\u308C\u307E\u3057\u305F - \u7F72\u540D\u8005\u30A8\u30E9\u30FC\u304C\u3042\u308A\u307E\u3059\u3002"}, + {"jar.verified.", "jar\u304C\u691C\u8A3C\u3055\u308C\u307E\u3057\u305F\u3002"}, ++ {"jar.verified.with.signer.errors.", "jar\u306F\u691C\u8A3C\u3055\u308C\u307E\u3057\u305F - \u7F72\u540D\u8005\u30A8\u30E9\u30FC\u304C\u3042\u308A\u307E\u3059\u3002"}, + {"jarsigner.", "jarsigner: "}, + {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.", + "\u30B7\u30B0\u30CD\u30C1\u30E3\u306E\u30D5\u30A1\u30A4\u30EB\u540D\u306B\u4F7F\u7528\u3067\u304D\u308B\u6587\u5B57\u306F\u3001A-Z\u30010-9\u3001_\u3001- \u306E\u307F\u3067\u3059\u3002"}, +@@ -191,6 +194,7 @@ + "\u4EE3\u66FF\u7F72\u540D\u30E1\u30AB\u30CB\u30BA\u30E0\u306E\u4F7F\u7528"}, + {"entry.was.signed.on", "\u30A8\u30F3\u30C8\u30EA\u306F{0}\u306B\u7F72\u540D\u3055\u308C\u307E\u3057\u305F"}, + {"Warning.", "\u8B66\u544A: "}, ++ {"Error.", "\u30A8\u30E9\u30FC: "}, + {"This.jar.contains.unsigned.entries.which.have.not.been.integrity.checked.", + "\u3053\u306Ejar\u306B\u306F\u3001\u6574\u5408\u6027\u30C1\u30A7\u30C3\u30AF\u3092\u3057\u3066\u3044\u306A\u3044\u672A\u7F72\u540D\u306E\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 "}, + {"This.jar.contains.entries.whose.signer.certificate.has.expired.", +@@ -227,6 +231,10 @@ + "\u7F72\u540D\u8005\u306E\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u307E\u3060\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002"}, + {"This.jar.contains.entries.whose.certificate.chain.is.not.validated.", + "\u3053\u306Ejar\u306B\u306F\u3001\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u307E\u3060\u691C\u8A3C\u3055\u308C\u3066\u3044\u306A\u3044\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002"}, ++ {"no.timestamp.signing", ++ "-tsa\u307E\u305F\u306F-tsacert\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u3001\u3053\u306Ejar\u306B\u306F\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u4ED8\u52A0\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u306A\u3044\u3068\u3001\u7F72\u540D\u8005\u8A3C\u660E\u66F8\u306E\u6709\u52B9\u671F\u9650(%1$tY-%1$tm-%1$td)\u5F8C\u307E\u305F\u306F\u5C06\u6765\u306E\u5931\u52B9\u65E5\u5F8C\u306B\u3001\u30E6\u30FC\u30B6\u30FC\u306F\u3053\u306Ejar\u3092\u691C\u8A3C\u3067\u304D\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002"}, ++ {"no.timestamp.verifying", ++ "\u3053\u306Ejar\u306B\u306F\u3001\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u306A\u3044\u7F72\u540D\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u306A\u3044\u3068\u3001\u7F72\u540D\u8005\u8A3C\u660E\u66F8\u306E\u6709\u52B9\u671F\u9650(%1$tY-%1$tm-%1$td)\u5F8C\u307E\u305F\u306F\u5C06\u6765\u306E\u5931\u52B9\u65E5\u5F8C\u306B\u3001\u30E6\u30FC\u30B6\u30FC\u306F\u3053\u306Ejar\u3092\u691C\u8A3C\u3067\u304D\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002"}, + {"Unknown.password.type.", "\u4E0D\u660E\u306A\u30D1\u30B9\u30EF\u30FC\u30C9\u30FB\u30BF\u30A4\u30D7: "}, + {"Cannot.find.environment.variable.", + "\u74B0\u5883\u5909\u6570\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: "}, +--- ./jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -65,7 +65,7 @@ + {".keypass.password.password.for.private.key.if.different.", + "[-keypass <\u53E3\u4EE4>] \u79C1\u6709\u5BC6\u94A5\u7684\u53E3\u4EE4 (\u5982\u679C\u4E0D\u540C)"}, + {".certchain.file.name.of.alternative.certchain.file", +- "[-certchain <\u6587\u4EF6>] \u66FF\u4EE3 certchain \u6587\u4EF6\u7684\u540D\u79F0"}, ++ "[-certchain <\u6587\u4EF6>] \u66FF\u4EE3\u8BC1\u4E66\u94FE\u6587\u4EF6\u7684\u540D\u79F0"}, + {".sigfile.file.name.of.SF.DSA.file", + "[-sigfile <\u6587\u4EF6>] .SF/.DSA \u6587\u4EF6\u7684\u540D\u79F0"}, + {".signedjar.file.name.of.signed.JAR.file", +@@ -135,7 +135,10 @@ + {".Unsigned.entries.", "(\u672A\u7B7E\u540D\u6761\u76EE)"}, + {"jar.is.unsigned.signatures.missing.or.not.parsable.", + "jar \u672A\u7B7E\u540D\u3002(\u7F3A\u5C11\u7B7E\u540D\u6216\u65E0\u6CD5\u89E3\u6790\u7B7E\u540D)"}, ++ {"jar.signed.", "jar \u5DF2\u7B7E\u540D\u3002"}, ++ {"jar.signed.with.signer.errors.", "jar \u5DF2\u7B7E\u540D, \u4F46\u51FA\u73B0\u7B7E\u540D\u8005\u9519\u8BEF\u3002"}, + {"jar.verified.", "jar \u5DF2\u9A8C\u8BC1\u3002"}, ++ {"jar.verified.with.signer.errors.", "jar \u5DF2\u9A8C\u8BC1, \u4F46\u51FA\u73B0\u7B7E\u540D\u8005\u9519\u8BEF\u3002"}, + {"jarsigner.", "jarsigner: "}, + {"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.", + "\u7B7E\u540D\u6587\u4EF6\u540D\u5FC5\u987B\u5305\u542B\u4EE5\u4E0B\u5B57\u7B26: A-Z, 0-9, _ \u6216 -"}, +@@ -191,6 +194,7 @@ + "\u6B63\u5728\u4F7F\u7528\u66FF\u4EE3\u7684\u7B7E\u540D\u673A\u5236"}, + {"entry.was.signed.on", "\u6761\u76EE\u7684\u7B7E\u540D\u65E5\u671F\u4E3A {0}"}, + {"Warning.", "\u8B66\u544A: "}, ++ {"Error.", "\u9519\u8BEF: "}, + {"This.jar.contains.unsigned.entries.which.have.not.been.integrity.checked.", + "\u6B64 jar \u5305\u542B\u5C1A\u672A\u8FDB\u884C\u5B8C\u6574\u6027\u68C0\u67E5\u7684\u672A\u7B7E\u540D\u6761\u76EE\u3002 "}, + {"This.jar.contains.entries.whose.signer.certificate.has.expired.", +@@ -227,6 +231,10 @@ + "\u7B7E\u540D\u8005\u7684\u8BC1\u4E66\u94FE\u672A\u9A8C\u8BC1\u3002"}, + {"This.jar.contains.entries.whose.certificate.chain.is.not.validated.", + "\u6B64 jar \u5305\u542B\u8BC1\u4E66\u94FE\u672A\u9A8C\u8BC1\u7684\u6761\u76EE\u3002"}, ++ {"no.timestamp.signing", ++ "\u672A\u63D0\u4F9B -tsa \u6216 -tsacert, \u6B64 jar \u6CA1\u6709\u65F6\u95F4\u6233\u3002\u5982\u679C\u6CA1\u6709\u65F6\u95F4\u6233, \u5219\u5728\u7B7E\u540D\u8005\u8BC1\u4E66\u7684\u5230\u671F\u65E5\u671F (%1$tY-%1$tm-%1$td) \u6216\u4EE5\u540E\u7684\u4EFB\u4F55\u64A4\u9500\u65E5\u671F\u4E4B\u540E, \u7528\u6237\u53EF\u80FD\u65E0\u6CD5\u9A8C\u8BC1\u6B64 jar\u3002"}, ++ {"no.timestamp.verifying", ++ "\u6B64 jar \u5305\u542B\u7684\u7B7E\u540D\u6CA1\u6709\u65F6\u95F4\u6233\u3002\u5982\u679C\u6CA1\u6709\u65F6\u95F4\u6233, \u5219\u5728\u7B7E\u540D\u8005\u8BC1\u4E66\u7684\u5230\u671F\u65E5\u671F (%1$tY-%1$tm-%1$td) \u6216\u4EE5\u540E\u7684\u4EFB\u4F55\u64A4\u9500\u65E5\u671F\u4E4B\u540E, \u7528\u6237\u53EF\u80FD\u65E0\u6CD5\u9A8C\u8BC1\u6B64 jar\u3002"}, + {"Unknown.password.type.", "\u672A\u77E5\u53E3\u4EE4\u7C7B\u578B: "}, + {"Cannot.find.environment.variable.", + "\u627E\u4E0D\u5230\u73AF\u5883\u53D8\u91CF: "}, +--- ./jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -72,7 +72,7 @@ + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "Importiert Eintr\u00E4ge aus einer Identity-Datenbank im JDK 1.1.x-Stil"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", +- "Importiert ein Zertifikat oder eine Zertifikatkette"}, //-importcert ++ "Importiert ein Zertifikat oder eine Zertifikatskette"}, //-importcert + {"Imports.a.password", + "Importiert ein Kennwort"}, //-importpass + {"Imports.one.or.all.entries.from.another.keystore", +@@ -304,7 +304,7 @@ + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "Eintragstyp: {0}"}, +- {"Certificate.chain.length.", "Zertifikatkettenl\u00E4nge: "}, ++ {"Certificate.chain.length.", "Zertifikatskettenl\u00E4nge: "}, + {"Certificate.i.1.", "Zertifikat[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "Zertifikat-Fingerprint (SHA1): "}, + {"Keystore.type.", "Keystore-Typ: "}, +@@ -388,9 +388,9 @@ + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "Zertifikatantwort enth\u00E4lt keinen Public Key f\u00FCr <{0}>"}, + {"Incomplete.certificate.chain.in.reply", +- "Unvollst\u00E4ndige Zertifikatkette in Antwort"}, ++ "Unvollst\u00E4ndige Zertifikatskette in Antwort"}, + {"Certificate.chain.in.reply.does.not.verify.", +- "Zertifikatkette in Antwort verifiziert nicht: "}, ++ "Zertifikatskette in Antwort verifiziert nicht: "}, + {"Top.level.certificate.in.reply.", + "Zertifikat der obersten Ebene in Antwort:\n"}, + {".is.not.trusted.", "... ist nicht vertrauensw\u00FCrdig. "}, +--- ./jdk/src/share/classes/sun/security/tools/keytool/Resources_ja.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/tools/keytool/Resources_ja.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -348,17 +348,17 @@ + {".PATTERN.printX509Cert", + "\u6240\u6709\u8005: {0}\n\u767A\u884C\u8005: {1}\n\u30B7\u30EA\u30A2\u30EB\u756A\u53F7: {2}\n\u6709\u52B9\u671F\u9593\u306E\u958B\u59CB\u65E5: {3}\u7D42\u4E86\u65E5: {4}\n\u8A3C\u660E\u66F8\u306E\u30D5\u30A3\u30F3\u30AC\u30D7\u30EA\u30F3\u30C8:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \u7F72\u540D\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u540D: {8}\n\t \u30D0\u30FC\u30B8\u30E7\u30F3: {9}"}, + {"What.is.your.first.and.last.name.", +- "\u59D3\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, ++ "\u59D3\u540D\u306F\u4F55\u3067\u3059\u304B\u3002"}, + {"What.is.the.name.of.your.organizational.unit.", +- "\u7D44\u7E54\u5358\u4F4D\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, ++ "\u7D44\u7E54\u5358\u4F4D\u540D\u306F\u4F55\u3067\u3059\u304B\u3002"}, + {"What.is.the.name.of.your.organization.", +- "\u7D44\u7E54\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, ++ "\u7D44\u7E54\u540D\u306F\u4F55\u3067\u3059\u304B\u3002"}, + {"What.is.the.name.of.your.City.or.Locality.", +- "\u90FD\u5E02\u540D\u307E\u305F\u306F\u5730\u57DF\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, ++ "\u90FD\u5E02\u540D\u307E\u305F\u306F\u5730\u57DF\u540D\u306F\u4F55\u3067\u3059\u304B\u3002"}, + {"What.is.the.name.of.your.State.or.Province.", +- "\u90FD\u9053\u5E9C\u770C\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, ++ "\u90FD\u9053\u5E9C\u770C\u540D\u307E\u305F\u306F\u5DDE\u540D\u306F\u4F55\u3067\u3059\u304B\u3002"}, + {"What.is.the.two.letter.country.code.for.this.unit.", +- "\u3053\u306E\u5358\u4F4D\u306B\u8A72\u5F53\u3059\u308B2\u6587\u5B57\u306E\u56FD\u30B3\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, ++ "\u3053\u306E\u5358\u4F4D\u306B\u8A72\u5F53\u3059\u308B2\u6587\u5B57\u306E\u56FD\u30B3\u30FC\u30C9\u306F\u4F55\u3067\u3059\u304B\u3002"}, + {"Is.name.correct.", "{0}\u3067\u3088\u308D\u3057\u3044\u3067\u3059\u304B\u3002"}, + {"no", "\u3044\u3044\u3048"}, + {"yes", "\u306F\u3044"}, +--- ./jdk/src/share/classes/sun/security/tools/keytool/Resources_pt_BR.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/tools/keytool/Resources_pt_BR.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -55,7 +55,7 @@ + {"Changes.an.entry.s.alias", + "Altera um alias de entrada"}, //-changealias + {"Deletes.an.entry", +- "Deleta uma entrada"}, //-delete ++ "Exclui uma entrada"}, //-delete + {"Exports.certificate", + "Exporta o certificado"}, //-exportcert + {"Generates.a.key.pair", +--- ./jdk/src/share/classes/sun/security/util/KeyUtil.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/util/KeyUtil.java Wed Jul 30 18:42:59 2014 +0100 +@@ -32,6 +32,7 @@ + import java.security.interfaces.ECKey; + import java.security.interfaces.RSAKey; + import java.security.interfaces.DSAKey; ++import java.security.SecureRandom; + import java.security.spec.KeySpec; + import javax.crypto.SecretKey; + import javax.crypto.interfaces.DHKey; +@@ -157,6 +158,79 @@ + } + + /** ++ * Check the format of TLS PreMasterSecret. ++ * <P> ++ * To avoid vulnerabilities described by section 7.4.7.1, RFC 5246, ++ * treating incorrectly formatted message blocks and/or mismatched ++ * version numbers in a manner indistinguishable from correctly ++ * formatted RSA blocks. ++ * ++ * RFC 5246 describes the approach as : ++ * ++ * 1. Generate a string R of 48 random bytes ++ * ++ * 2. Decrypt the message to recover the plaintext M ++ * ++ * 3. If the PKCS#1 padding is not correct, or the length of message ++ * M is not exactly 48 bytes: ++ * pre_master_secret = R ++ * else If ClientHello.client_version <= TLS 1.0, and version ++ * number check is explicitly disabled: ++ * premaster secret = M ++ * else If M[0..1] != ClientHello.client_version: ++ * premaster secret = R ++ * else: ++ * premaster secret = M ++ * ++ * Note that #2 should have completed before the call to this method. ++ * ++ * @param clientVersion the version of the TLS protocol by which the ++ * client wishes to communicate during this session ++ * @param serverVersion the negotiated version of the TLS protocol which ++ * contains the lower of that suggested by the client in the client ++ * hello and the highest supported by the server. ++ * @param encoded the encoded key in its "RAW" encoding format ++ * @param isFailover whether or not the previous decryption of the ++ * encrypted PreMasterSecret message run into problem ++ * @return the polished PreMasterSecret key in its "RAW" encoding format ++ */ ++ public static byte[] checkTlsPreMasterSecretKey( ++ int clientVersion, int serverVersion, SecureRandom random, ++ byte[] encoded, boolean isFailOver) { ++ ++ if (random == null) { ++ random = new SecureRandom(); ++ } ++ byte[] replacer = new byte[48]; ++ random.nextBytes(replacer); ++ ++ if (!isFailOver && (encoded != null)) { ++ // check the length ++ if (encoded.length != 48) { ++ // private, don't need to clone the byte array. ++ return replacer; ++ } ++ ++ int encodedVersion = ++ ((encoded[0] & 0xFF) << 8) | (encoded[1] & 0xFF); ++ if (clientVersion != encodedVersion) { ++ if (clientVersion > 0x0301 || // 0x0301: TLSv1 ++ serverVersion != encodedVersion) { ++ encoded = replacer; ++ } // Otherwise, For compatibility, we maintain the behavior ++ // that the version in pre_master_secret can be the ++ // negotiated version for TLS v1.0 and SSL v3.0. ++ } ++ ++ // private, don't need to clone the byte array. ++ return encoded; ++ } ++ ++ // private, don't need to clone the byte array. ++ return replacer; ++ } ++ ++ /** + * Returns whether the Diffie-Hellman public key is valid or not. + * + * Per RFC 2631 and NIST SP800-56A, the following algorithm is used to +--- ./jdk/src/share/classes/sun/security/x509/CRLReasonCodeExtension.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/x509/CRLReasonCodeExtension.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2011, 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 +@@ -34,29 +34,9 @@ + + /** + * The reasonCode is a non-critical CRL entry extension that identifies +- * the reason for the certificate revocation. CAs are strongly +- * encouraged to include reason codes in CRL entries; however, the +- * reason code CRL entry extension should be absent instead of using the +- * unspecified (0) reasonCode value. +- * <p>The ASN.1 syntax for this is: +- * <pre> +- * id-ce-cRLReason OBJECT IDENTIFIER ::= { id-ce 21 } +- * +- * -- reasonCode ::= { CRLReason } +- * +- * CRLReason ::= ENUMERATED { +- * unspecified (0), +- * keyCompromise (1), +- * cACompromise (2), +- * affiliationChanged (3), +- * superseded (4), +- * cessationOfOperation (5), +- * certificateHold (6), +- * removeFromCRL (8), +- * privilegeWithdrawn (9), +- * aACompromise (10) } +- * </pre> ++ * the reason for the certificate revocation. + * @author Hemma Prafullchandra ++ * @see java.security.cert.CRLReason + * @see Extension + * @see CertAttrSet + */ +@@ -64,23 +44,11 @@ + implements CertAttrSet<String> { + + /** +- * Attribute name and Reason codes ++ * Attribute name + */ + public static final String NAME = "CRLReasonCode"; + public static final String REASON = "reason"; + +- public static final int UNSPECIFIED = 0; +- public static final int KEY_COMPROMISE = 1; +- public static final int CA_COMPROMISE = 2; +- public static final int AFFLIATION_CHANGED = 3; +- public static final int SUPERSEDED = 4; +- public static final int CESSATION_OF_OPERATION = 5; +- public static final int CERTIFICATE_HOLD = 6; +- // note 7 missing in syntax +- public static final int REMOVE_FROM_CRL = 8; +- public static final int PRIVILEGE_WITHDRAWN = 9; +- public static final int AA_COMPROMISE = 10; +- + private static CRLReason[] values = CRLReason.values(); + + private int reasonCode = 0; +@@ -181,7 +149,7 @@ + * Returns a printable representation of the Reason code. + */ + public String toString() { +- return super.toString() + " Reason Code: " + values[reasonCode]; ++ return super.toString() + " Reason Code: " + getReasonCode(); + } + + /** +--- ./jdk/src/share/classes/sun/swing/JLightweightFrame.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/swing/JLightweightFrame.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * 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 +@@ -36,6 +36,7 @@ + import java.awt.MouseInfo; + import java.awt.Point; + import java.awt.Rectangle; ++import java.awt.Window; + import java.awt.event.ContainerEvent; + import java.awt.event.ContainerListener; + import java.awt.image.BufferedImage; +@@ -43,16 +44,20 @@ + import java.beans.PropertyChangeEvent; + import java.beans.PropertyChangeListener; + import java.security.AccessController; ++import javax.swing.JComponent; + + import javax.swing.JLayeredPane; + import javax.swing.JPanel; + import javax.swing.JRootPane; + import javax.swing.LayoutFocusTraversalPolicy; ++import javax.swing.RepaintManager; + import javax.swing.RootPaneContainer; + import javax.swing.SwingUtilities; + ++import sun.awt.DisplayChangedListener; + import sun.awt.LightweightFrame; + import sun.security.action.GetPropertyAction; ++import sun.swing.SwingUtilities2.RepaintListener; + + /** + * The frame serves as a lightweight container which paints its content +@@ -75,6 +80,8 @@ + + private BufferedImage bbImage; + ++ private volatile int scaleFactor = 1; ++ + /** + * {@code copyBufferEnabled}, true by default, defines the following strategy. + * A duplicating (copy) buffer is created for the original pixel buffer. +@@ -85,10 +92,11 @@ + * by the lock (managed with the {@link LightweightContent#paintLock()}, + * {@link LightweightContent#paintUnlock()} methods). + */ +- private boolean copyBufferEnabled; ++ private static boolean copyBufferEnabled; + private int[] copyBuffer; + + private PropertyChangeListener layoutSizeListener; ++ private RepaintListener repaintListener; + + static { + SwingAccessor.setJLightweightFrameAccessor(new SwingAccessor.JLightweightFrameAccessor() { +@@ -97,6 +105,8 @@ + frame.updateClientCursor(); + } + }); ++ copyBufferEnabled = "true".equals(AccessController. ++ doPrivileged(new GetPropertyAction("swing.jlf.copyBufferEnabled", "true"))); + } + + /** +@@ -130,6 +140,31 @@ + } + } + }; ++ ++ repaintListener = (JComponent c, int x, int y, int w, int h) -> { ++ Window jlf = SwingUtilities.getWindowAncestor(c); ++ if (jlf != JLightweightFrame.this) { ++ return; ++ } ++ Point p = SwingUtilities.convertPoint(c, x, y, jlf); ++ Rectangle r = new Rectangle(p.x, p.y, w, h).intersection( ++ new Rectangle(0, 0, bbImage.getWidth() / scaleFactor, ++ bbImage.getHeight() / scaleFactor)); ++ ++ if (!r.isEmpty()) { ++ notifyImageUpdated(r.x, r.y, r.width, r.height); ++ } ++ }; ++ ++ SwingAccessor.getRepaintManagerAccessor().addRepaintListener( ++ RepaintManager.currentManager(this), repaintListener); ++ } ++ ++ @Override ++ public void dispose() { ++ SwingAccessor.getRepaintManagerAccessor().removeRepaintListener( ++ RepaintManager.currentManager(this), repaintListener); ++ super.dispose(); + } + + /** +@@ -168,6 +203,7 @@ + g.setBackground(getBackground()); + g.setColor(getForeground()); + g.setFont(getFont()); ++ g.scale(scaleFactor, scaleFactor); + return g; + } + +@@ -191,7 +227,39 @@ + if (content != null) content.focusUngrabbed(); + } + +- private void syncCopyBuffer(boolean reset, int x, int y, int w, int h) { ++ @Override ++ public int getScaleFactor() { ++ return scaleFactor; ++ } ++ ++ @Override ++ public void notifyDisplayChanged(final int scaleFactor) { ++ if (scaleFactor != this.scaleFactor) { ++ if (!copyBufferEnabled) content.paintLock(); ++ try { ++ if (bbImage != null) { ++ resizeBuffer(getWidth(), getHeight(), scaleFactor); ++ } ++ } finally { ++ if (!copyBufferEnabled) content.paintUnlock(); ++ } ++ this.scaleFactor = scaleFactor; ++ } ++ if (getPeer() instanceof DisplayChangedListener) { ++ ((DisplayChangedListener)getPeer()).displayChanged(); ++ } ++ repaint(); ++ } ++ ++ @Override ++ public void addNotify() { ++ super.addNotify(); ++ if (getPeer() instanceof DisplayChangedListener) { ++ ((DisplayChangedListener)getPeer()).displayChanged(); ++ } ++ } ++ ++ private void syncCopyBuffer(boolean reset, int x, int y, int w, int h, int scale) { + content.paintLock(); + try { + int[] srcBuffer = ((DataBufferInt)bbImage.getRaster().getDataBuffer()).getData(); +@@ -200,6 +268,11 @@ + } + int linestride = bbImage.getWidth(); + ++ x *= scale; ++ y *= scale; ++ w *= scale; ++ h *= scale; ++ + for (int i=0; i<h; i++) { + int from = (y + i) * linestride + x; + System.arraycopy(srcBuffer, from, copyBuffer, from, w); +@@ -209,6 +282,13 @@ + } + } + ++ private void notifyImageUpdated(int x, int y, int width, int height) { ++ if (copyBufferEnabled) { ++ syncCopyBuffer(false, x, y, width, height, scaleFactor); ++ } ++ content.imageUpdated(x, y, width, height); ++ } ++ + private void initInterior() { + contentPane = new JPanel() { + @Override +@@ -231,10 +311,8 @@ + EventQueue.invokeLater(new Runnable() { + @Override + public void run() { +- if (copyBufferEnabled) { +- syncCopyBuffer(false, clip.x, clip.y, clip.width, clip.height); +- } +- content.imageUpdated(clip.x, clip.y, clip.width, clip.height); ++ Rectangle c = contentPane.getBounds().intersection(clip); ++ notifyImageUpdated(c.x, c.y, c.width, c.height); + } + }); + } finally { +@@ -288,48 +366,37 @@ + content.paintLock(); + } + try { +- if ((bbImage == null) || (width != bbImage.getWidth()) || (height != bbImage.getHeight())) { +- boolean createBB = true; +- int newW = width; +- int newH = height; +- if (bbImage != null) { +- int oldW = bbImage.getWidth(); +- int oldH = bbImage.getHeight(); +- if ((oldW >= newW) && (oldH >= newH)) { +- createBB = false; +- } else { +- if (oldW >= newW) { +- newW = oldW; ++ boolean createBB = (bbImage == null); ++ int newW = width; ++ int newH = height; ++ if (bbImage != null) { ++ int imgWidth = bbImage.getWidth() / scaleFactor; ++ int imgHeight = bbImage.getHeight() / scaleFactor; ++ if (width != imgWidth || height != imgHeight) { ++ createBB = true; ++ if (bbImage != null) { ++ int oldW = imgWidth; ++ int oldH = imgHeight; ++ if ((oldW >= newW) && (oldH >= newH)) { ++ createBB = false; + } else { +- newW = Math.max((int)(oldW * 1.2), width); +- } +- if (oldH >= newH) { +- newH = oldH; +- } else { +- newH = Math.max((int)(oldH * 1.2), height); ++ if (oldW >= newW) { ++ newW = oldW; ++ } else { ++ newW = Math.max((int)(oldW * 1.2), width); ++ } ++ if (oldH >= newH) { ++ newH = oldH; ++ } else { ++ newH = Math.max((int)(oldH * 1.2), height); ++ } + } + } + } +- if (createBB) { +- BufferedImage oldBB = bbImage; +- bbImage = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB_PRE); +- if (oldBB != null) { +- Graphics g = bbImage.getGraphics(); +- try { +- g.drawImage(oldBB, 0, 0, newW, newH, null); +- } finally { +- g.dispose(); +- oldBB.flush(); +- } +- } +- int[] pixels = ((DataBufferInt)bbImage.getRaster().getDataBuffer()).getData(); +- if (copyBufferEnabled) { +- syncCopyBuffer(true, 0, 0, width, height); +- pixels = copyBuffer; +- } +- content.imageBufferReset(pixels, 0, 0, width, height, bbImage.getWidth()); +- return; +- } ++ } ++ if (createBB) { ++ resizeBuffer(newW, newH, scaleFactor); ++ return; + } + content.imageReshaped(0, 0, width, height); + +@@ -340,6 +407,18 @@ + } + } + ++ private void resizeBuffer(int width, int height, int newScaleFactor) { ++ bbImage = new BufferedImage(width*newScaleFactor,height*newScaleFactor, ++ BufferedImage.TYPE_INT_ARGB_PRE); ++ int[] pixels= ((DataBufferInt)bbImage.getRaster().getDataBuffer()).getData(); ++ if (copyBufferEnabled) { ++ syncCopyBuffer(true, 0, 0, width, height, newScaleFactor); ++ pixels = copyBuffer; ++ } ++ content.imageBufferReset(pixels, 0, 0, width, height, ++ width * newScaleFactor, newScaleFactor); ++ } ++ + @Override + public JRootPane getRootPane() { + return rootPane; +--- ./jdk/src/share/classes/sun/swing/LightweightContent.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/swing/LightweightContent.java Wed Jul 30 18:42:59 2014 +0100 +@@ -85,31 +85,53 @@ + * {@code JLightweightFrame} calls this method to notify the client + * application that a new data buffer has been set as a content pixel + * buffer. Typically this occurs when a buffer of a larger size is +- * created in response to a content resize event. The method reports +- * a reference to the pixel data buffer, the content image bounds +- * within the buffer and the line stride of the buffer. These values +- * have the following correlation. ++ * created in response to a content resize event. + * <p> +- * The {@code width} and {@code height} matches the size of the content ++ * The method reports a reference to the pixel data buffer, the content ++ * image bounds within the buffer and the line stride of the buffer. ++ * These values have the following correlation. ++ * The {@code width} and {@code height} matches the layout size of the content + * (the component returned from the {@link #getComponent} method). The + * {@code x} and {@code y} is the origin of the content, {@code (0, 0)} +- * in the coordinate space of the content, appearing at +- * {@code data[y * linestride + x]} in the buffer. All indices +- * {@code data[(y + j) * linestride + (x + i)]} where +- * {@code (0 <= i < width)} and {@code (0 <= j < height)} will represent +- * valid pixel data, {@code (i, j)} in the coordinate space of the content. ++ * in the layout coordinate space of the content, appearing at ++ * {@code data[y * scale * linestride + x * scale]} in the buffer. ++ * A pixel with indices {@code (i, j)}, where {@code (0 <= i < width)} and ++ * {@code (0 <= j < height)}, in the layout coordinate space of the content ++ * is represented by a {@code scale^2} square of pixels in the physical ++ * coordinate space of the buffer. The top-left corner of the square has the ++ * following physical coordinate in the buffer: ++ * {@code data[(y + j) * scale * linestride + (x + i) * scale]}. + * + * @param data the content pixel data buffer of INT_ARGB_PRE type +- * @param x the x coordinate of the image +- * @param y the y coordinate of the image +- * @param width the width of the image +- * @param height the height of the image ++ * @param x the logical x coordinate of the image ++ * @param y the logical y coordinate of the image ++ * @param width the logical width of the image ++ * @param height the logical height of the image + * @param linestride the line stride of the pixel buffer ++ * @param scale the scale factor of the pixel buffer + */ +- public void imageBufferReset(int[] data, ++ default public void imageBufferReset(int[] data, + int x, int y, + int width, int height, +- int linestride); ++ int linestride, ++ int scale) ++ { ++ imageBufferReset(data, x, y, width, height, linestride); ++ } ++ ++ /** ++ * The default implementation for #imageBufferReset uses a hard-coded value ++ * of 1 for the scale factor. Both the old and the new methods provide ++ * default implementations in order to allow a client application to run ++ * with any JDK version without breaking backward compatibility. ++ */ ++ default public void imageBufferReset(int[] data, ++ int x, int y, ++ int width, int height, ++ int linestride) ++ { ++ imageBufferReset(data, x, y, width, height, linestride, 1); ++ } + + /** + * {@code JLightweightFrame} calls this method to notify the client +--- ./jdk/src/share/classes/sun/swing/SwingAccessor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/swing/SwingAccessor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -28,6 +28,7 @@ + import sun.misc.Unsafe; + + import java.awt.Point; ++import javax.swing.RepaintManager; + + import javax.swing.text.JTextComponent; + import javax.swing.TransferHandler; +@@ -82,6 +83,14 @@ + } + + /** ++ * An accessor for the RepaintManager class. ++ */ ++ public interface RepaintManagerAccessor { ++ void addRepaintListener(RepaintManager rm, SwingUtilities2.RepaintListener l); ++ void removeRepaintListener(RepaintManager rm, SwingUtilities2.RepaintListener l); ++ } ++ ++ /** + * The javax.swing.text.JTextComponent class accessor object. + */ + private static JTextComponentAccessor jtextComponentAccessor; +@@ -120,6 +129,31 @@ + * Retrieve the accessor object for the JLightweightFrame class + */ + public static JLightweightFrameAccessor getJLightweightFrameAccessor() { ++ if (jLightweightFrameAccessor == null) { ++ unsafe.ensureClassInitialized(JLightweightFrame.class); ++ } + return jLightweightFrameAccessor; + } ++ ++ /** ++ * The RepaintManager class accessor object. ++ */ ++ private static RepaintManagerAccessor repaintManagerAccessor; ++ ++ /** ++ * Set an accessor object for the RepaintManager class. ++ */ ++ public static void setRepaintManagerAccessor(RepaintManagerAccessor accessor) { ++ repaintManagerAccessor = accessor; ++ } ++ ++ /** ++ * Retrieve the accessor object for the RepaintManager class. ++ */ ++ public static RepaintManagerAccessor getRepaintManagerAccessor() { ++ if (repaintManagerAccessor == null) { ++ unsafe.ensureClassInitialized(RepaintManager.class); ++ } ++ return repaintManagerAccessor; ++ } + } +--- ./jdk/src/share/classes/sun/swing/SwingUtilities2.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/swing/SwingUtilities2.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -81,6 +81,9 @@ + public static final Object LAF_STATE_KEY = + new StringBuffer("LookAndFeel State"); + ++ public static final Object MENU_SELECTION_MANAGER_LISTENER_KEY = ++ new StringBuffer("MenuSelectionManager listener key"); ++ + // Maintain a cache of CACHE_SIZE fonts and the left side bearing + // of the characters falling into the range MIN_CHAR_INDEX to + // MAX_CHAR_INDEX. The values in fontCache are created as needed. +@@ -923,6 +926,77 @@ + return retVal; + } + ++ /** ++ * This method should be used for drawing a borders over a filled rectangle. ++ * Draws vertical line, using the current color, between the points {@code ++ * (x, y1)} and {@code (x, y2)} in graphics context's coordinate system. ++ * Note: it use {@code Graphics.fillRect()} internally. ++ * ++ * @param g Graphics to draw the line to. ++ * @param x the <i>x</i> coordinate. ++ * @param y1 the first point's <i>y</i> coordinate. ++ * @param y2 the second point's <i>y</i> coordinate. ++ */ ++ public static void drawVLine(Graphics g, int x, int y1, int y2) { ++ if (y2 < y1) { ++ final int temp = y2; ++ y2 = y1; ++ y1 = temp; ++ } ++ g.fillRect(x, y1, 1, y2 - y1 + 1); ++ } ++ ++ /** ++ * This method should be used for drawing a borders over a filled rectangle. ++ * Draws horizontal line, using the current color, between the points {@code ++ * (x1, y)} and {@code (x2, y)} in graphics context's coordinate system. ++ * Note: it use {@code Graphics.fillRect()} internally. ++ * ++ * @param g Graphics to draw the line to. ++ * @param x1 the first point's <i>x</i> coordinate. ++ * @param x2 the second point's <i>x</i> coordinate. ++ * @param y the <i>y</i> coordinate. ++ */ ++ public static void drawHLine(Graphics g, int x1, int x2, int y) { ++ if (x2 < x1) { ++ final int temp = x2; ++ x2 = x1; ++ x1 = temp; ++ } ++ g.fillRect(x1, y, x2 - x1 + 1, 1); ++ } ++ ++ /** ++ * This method should be used for drawing a borders over a filled rectangle. ++ * Draws the outline of the specified rectangle. The left and right edges of ++ * the rectangle are at {@code x} and {@code x + w}. The top and bottom ++ * edges are at {@code y} and {@code y + h}. The rectangle is drawn using ++ * the graphics context's current color. Note: it use {@code ++ * Graphics.fillRect()} internally. ++ * ++ * @param g Graphics to draw the rectangle to. ++ * @param x the <i>x</i> coordinate of the rectangle to be drawn. ++ * @param y the <i>y</i> coordinate of the rectangle to be drawn. ++ * @param w the w of the rectangle to be drawn. ++ * @param h the h of the rectangle to be drawn. ++ * @see SwingUtilities2#drawVLine(java.awt.Graphics, int, int, int) ++ * @see SwingUtilities2#drawHLine(java.awt.Graphics, int, int, int) ++ */ ++ public static void drawRect(Graphics g, int x, int y, int w, int h) { ++ if (w < 0 || h < 0) { ++ return; ++ } ++ ++ if (h == 0 || w == 0) { ++ g.fillRect(x, y, w + 1, h + 1); ++ } else { ++ g.fillRect(x, y, w, 1); ++ g.fillRect(x + w, y, 1, h); ++ g.fillRect(x + 1, y + h, w, 1); ++ g.fillRect(x, y + 1, 1, h); ++ } ++ } ++ + private static TextLayout createTextLayout(JComponent c, String s, + Font f, FontRenderContext frc) { + Object shaper = (c == null ? +@@ -1967,4 +2041,11 @@ + } + return path; + } ++ ++ /** ++ * Used to listen to "blit" repaints in RepaintManager. ++ */ ++ public interface RepaintListener { ++ void repaintPerformed(JComponent c, int x, int y, int w, int h); ++ } + } +--- ./jdk/src/share/classes/sun/text/resources/es/FormatData_es_CL.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/text/resources/es/FormatData_es_CL.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -57,10 +57,10 @@ + }, + { "TimePatterns", + new String[] { +- "hh:mm:ss a z", // full time pattern +- "hh:mm:ss a z", // long time pattern +- "hh:mm:ss a", // medium time pattern +- "hh:mm a", // short time pattern ++ "HH:mm:ss zzzz", // full time pattern ++ "H:mm:ss z", // long time pattern ++ "H:mm:ss", // medium time pattern ++ "H:mm", // short time pattern + } + }, + { "DatePatterns", +--- ./jdk/src/share/classes/sun/text/resources/es/FormatData_es_DO.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/text/resources/es/FormatData_es_DO.java Wed Jul 30 18:42:59 2014 +0100 +@@ -75,8 +75,8 @@ + new String[] { + "EEEE d' de 'MMMM' de 'yyyy", // full date pattern + "d' de 'MMMM' de 'yyyy", // long date pattern +- "MM/dd/yyyy", // medium date pattern +- "MM/dd/yy", // short date pattern ++ "dd/MM/yyyy", // medium date pattern ++ "dd/MM/yy", // short date pattern + } + }, + { "DateTimePatterns", +--- ./jdk/src/share/classes/sun/text/resources/es/FormatData_es_EC.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/text/resources/es/FormatData_es_EC.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -72,10 +72,10 @@ + }, + { "TimePatterns", + new String[] { +- "hh:mm:ss a z", // full time pattern +- "hh:mm:ss a z", // long time pattern +- "hh:mm:ss a", // medium time pattern +- "hh:mm a", // short time pattern ++ "HH:mm:ss zzzz", // full time pattern ++ "H:mm:ss z", // long time pattern ++ "H:mm:ss", // medium time pattern ++ "H:mm", // short time pattern + } + }, + { "DatePatterns", +--- ./jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider Wed Jul 30 18:42:59 2014 +0100 +@@ -31,3 +31,4 @@ + #[windows]sun.tools.attach.WindowsAttachProvider + #[linux]sun.tools.attach.LinuxAttachProvider + #[macosx]sun.tools.attach.BsdAttachProvider ++#[aix]sun.tools.attach.AixAttachProvider +--- ./jdk/src/share/classes/sun/tools/jar/resources/jar_es.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/jar/resources/jar_es.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -45,4 +45,4 @@ + out.inflated=\ inflado: {0} + out.size=(entrada = {0}) (salida = {1}) + +-usage=Sintaxis: jar {ctxui}[vfmn0Me] [jar-file] [manifest-file] [entry-point] [-C dir] archivos...\nOpciones:\n -c crear nuevo archivo\n -t crear la tabla de contenido del archivo\n -x extraer el archive mencionado (o todos) del archivo\n -u actualizar archive existente\n -v generar salida detallada de los datos de salida est\u00E1ndar\n -f especificar nombre de archive de almacenamiento\n -m incluir informaci\u00F3n de manifiesto del archive de manifiesto especificado\n -n realizar normalizaci\u00F3n de Pack200 despu\u00E9s de crear un nuevo archivo\n -e especificar punto de entrada de la aplicaci\u00F3n para la aplicaci\u00F3n aut\u00F3noma \n que se incluye dentro de un archive jar ejecutable\n -0 s\u00F3lo almacenar; no utilizar compresi\u00F3n ZIP\n -M no crear un archive de manifiesto para las entradas\n -i generar informaci\u00F3n de \u00EDndice para los archives jar especificados\n -C cambiar al directorio especificado e incluir el archivo siguiente\nSi alg\u00FAn archivo es un directorio, se procesar\u00E1 de forma recurrente.\nEl nombre del archivo de manifiesto, el nombre del archivo de almacenamiento y el nombre del punto de entrada se\nespecifican en el mismo orden que los indicadores 'm', 'f' y 'e'.\n\nEjemplo 1: para archivar archivos de dos clases en un archivo llamado classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nEjemplo 2: utilice un archivo de manifiesto existente 'mymanifest' y archive todos los\n archivos del directorio foo/ en 'classes.jar': \n jar cvfm classes.jar mymanifest -C foo/ .\n ++usage=Sintaxis: jar {ctxui}[vfmn0Me] [jar-file] [manifest-file] [entry-point] [-C dir] archivos...\nOpciones:\n -c crear nuevo archivo\n -t crear la tabla de contenido del archivo\n -x extraer el archive mencionado (o todos) del archivo\n -u actualizar archive existente\n -v generar salida detallada de los datos de salida est\u00E1ndar\n -f especificar nombre de archive de almacenamiento\n -m incluir informaci\u00F3n de manifiesto del archive de manifiesto especificado\n -n realizar normalizaci\u00F3n de Pack200 despu\u00E9s de crear un nuevo archivo\n -e especificar punto de entrada de la aplicaci\u00F3n para la aplicaci\u00F3n aut\u00F3noma \n que se incluye dentro de un archive jar ejecutable\n -0 s\u00F3lo almacenar; no utilizar compresi\u00F3n ZIP\n -M no crear un archive de manifiesto para las entradas\n -i generar informaci\u00F3n de \u00EDndice para los archives jar especificados\n -C cambiar al directorio especificado e incluir el archivo siguiente\nSi alg\u00FAn archivo es un directorio, se procesar\u00E1 de forma recurrente.\nEl nombre del archivo de manifiesto, el nombre del archivo de almacenamiento y el nombre del punto de entrada se\nespecifican en el mismo orden que los indicadores 'm', 'f' y 'e'.\n\nEjemplo 1: para archivar archivos de dos clases en un archivo llamado classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nEjemplo 2: utilice un archivo de manifiesto existente 'mymanifest' y archive todos los\n archivos del directorio foo/ en 'classes.jar': \n jar cvfm classes.jar mymanifest -C foo/ .\n +--- ./jdk/src/share/classes/sun/tools/jconsole/Messages.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/jconsole/Messages.java Wed Jul 30 18:42:59 2014 +0100 +@@ -36,7 +36,7 @@ + Resources.initializeMessages(Messages.class, BUNDLE_NAME); + } + // TODO: +- // The names of some of the constants below looks strange. ++ // The names of some of the constants below look strange. + // That's because they were generated programmatically + // from the messages. They should be cleaned up, + // ___ should be removed etc. +@@ -269,6 +269,7 @@ + public static String SUMMARY_TAB_TAB_NAME; + public static String SUMMARY_TAB_VM_VERSION; + public static String THREADS; ++ public static String THREAD_TAB_INFO_LABEL_FORMAT; + public static String THREAD_TAB_THREAD_INFO_ACCESSIBLE_NAME; + public static String THREAD_TAB_THREAD_PLOTTER_ACCESSIBLE_NAME; + public static String THREAD_TAB_INITIAL_STACK_TRACE_MESSAGE; +--- ./jdk/src/share/classes/sun/tools/jconsole/SummaryTab.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/jconsole/SummaryTab.java Wed Jul 30 18:42:59 2014 +0100 +@@ -213,8 +213,8 @@ + String[] strings2 = formatKByteStrings(u.getCommitted()); + append(Messages.COMMITTED_MEMORY, strings2[0]); + append(Messages.SUMMARY_TAB_PENDING_FINALIZATION_LABEL, +- Messages.SUMMARY_TAB_PENDING_FINALIZATION_VALUE, +- memoryBean.getObjectPendingFinalizationCount()); ++ Resources.format(Messages.SUMMARY_TAB_PENDING_FINALIZATION_VALUE, ++ memoryBean.getObjectPendingFinalizationCount())); + append(endTable); + + append(newTable); +--- ./jdk/src/share/classes/sun/tools/jconsole/ThreadTab.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/jconsole/ThreadTab.java Wed Jul 30 18:42:59 2014 +0100 +@@ -66,9 +66,6 @@ + + private static final Border thinEmptyBorder = new EmptyBorder(2, 2, 2, 2); + +- private static final String infoLabelFormat = "ThreadTab.infoLabelFormat"; +- +- + /* + Hierarchy of panels and layouts for this tab: + +@@ -692,7 +689,7 @@ + + private void updateThreadsInfo(long tlCount, long tpCount, long ttCount, long timeStamp) { + getPlotter().addValues(timeStamp, tlCount); +- getInfoLabel().setText(Resources.format(infoLabelFormat, tlCount, tpCount, ttCount)); ++ getInfoLabel().setText(Resources.format(Messages.THREAD_TAB_INFO_LABEL_FORMAT, tlCount, tpCount, ttCount)); + } + } + } +--- ./jdk/src/share/classes/sun/tools/jconsole/resources/messages.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/jconsole/resources/messages.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -227,6 +227,7 @@ + SUMMARY_TAB_TAB_NAME=VM Summary + SUMMARY_TAB_VM_VERSION={0} version {1} + THREADS=Threads ++THREAD_TAB_INFO_LABEL_FORMAT=<html>Live: {0} Peak: {1} Total: {2}</html> + THREAD_TAB_THREAD_INFO_ACCESSIBLE_NAME=Thread Information + THREAD_TAB_THREAD_PLOTTER_ACCESSIBLE_NAME=Chart for number of threads. + THREAD_TAB_INITIAL_STACK_TRACE_MESSAGE=[No thread selected] +@@ -249,7 +250,7 @@ + UNREGISTER=Unregister + UPTIME=Uptime + USAGE_THRESHOLD=Usage Threshold +-REMOTE_TF_USAGE=<b>Usage</b>: <hostname>:<port> OR service:jmx:<protocol>:<sap> ++REMOTE_TF_USAGE=<b>Usage</b>: &<hostname&>:&<port&> OR service:jmx:&<protocol&>:&<sap&> + USED=Used + USERNAME_COLON_=&Username: + USERNAME_ACCESSIBLE_NAME=User Name +--- ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -31,7 +31,7 @@ + CPU_USAGE=CPU\u4F7F\u7528\u7387 + CPU_USAGE_FORMAT=CPU\u4F7F\u7528\u7387: {0}% + CANCEL=\u53D6\u6D88 +-CASCADE=\u91CD\u306D\u3066\u8868\u793A(&C) ++CASCADE=\u30AB\u30B9\u30B1\u30FC\u30C9\u8868\u793A(&C) + CHART_COLON=\u30C1\u30E3\u30FC\u30C8(&C): + CLASS_PATH=\u30AF\u30E9\u30B9\u30D1\u30B9 + CLASS_NAME=ClassName +@@ -52,7 +52,7 @@ + CONNECT_DIALOG_STATUS_BAR_ACCESSIBLE_NAME=\u30B9\u30C6\u30FC\u30BF\u30B9\u30FB\u30D0\u30FC + CONNECT_DIALOG_TITLE=JConsole: \u65B0\u898F\u63A5\u7D9A + CONNECTED_PUNCTUATION_CLICK_TO_DISCONNECT_=\u63A5\u7D9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u5207\u65AD\u3057\u307E\u3059\u3002 +-CONNECTION_FAILED=\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F ++CONNECTION_FAILED=\u63A5\u7D9A\u304C\u5931\u6557\u3057\u307E\u3057\u305F + CONNECTION=\u63A5\u7D9A(&C) + CONNECTION_NAME=\u63A5\u7D9A\u540D + CONNECTION_NAME__DISCONNECTED_={0} (\u5207\u65AD\u6E08) +@@ -88,8 +88,8 @@ + FILE_CHOOSER_FILE_EXISTS_OK_OPTION=\u7F6E\u63DB + FILE_CHOOSER_FILE_EXISTS_TITLE=\u30D5\u30A1\u30A4\u30EB\u304C\u5B58\u5728\u3057\u3066\u3044\u307E\u3059 + FILE_CHOOSER_SAVED_FILE=<html>\u30D5\u30A1\u30A4\u30EB\u306B\u4FDD\u5B58\u3057\u307E\u3057\u305F:<br>{0}<br>({1}\u30D0\u30A4\u30C8) +-FILE_CHOOSER_SAVE_FAILED_MESSAGE=<html><center>\u30D5\u30A1\u30A4\u30EB\u3078\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F:<br>{0}<br>{1} +-FILE_CHOOSER_SAVE_FAILED_TITLE=\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F ++FILE_CHOOSER_SAVE_FAILED_MESSAGE=<html><center>\u30D5\u30A1\u30A4\u30EB\u3078\u306E\u4FDD\u5B58\u304C\u5931\u6557\u3057\u307E\u3057\u305F:<br>{0}<br>{1} ++FILE_CHOOSER_SAVE_FAILED_TITLE=\u4FDD\u5B58\u304C\u5931\u6557\u3057\u307E\u3057\u305F + FREE_PHYSICAL_MEMORY=\u7A7A\u304D\u7269\u7406\u30E1\u30E2\u30EA\u30FC + FREE_SWAP_SPACE=\u7A7A\u304D\u30B9\u30EF\u30C3\u30D7\u30FB\u30B9\u30DA\u30FC\u30B9 + GARBAGE_COLLECTOR=\u30AC\u30D9\u30FC\u30B8\u30FB\u30B3\u30EC\u30AF\u30BF +@@ -227,11 +227,12 @@ + SUMMARY_TAB_TAB_NAME=VM\u30B5\u30DE\u30EA\u30FC + SUMMARY_TAB_VM_VERSION={0}\u30D0\u30FC\u30B8\u30E7\u30F3{1} + THREADS=\u30B9\u30EC\u30C3\u30C9 ++THREAD_TAB_INFO_LABEL_FORMAT=<html>\u5B9F\u884C\u4E2D: {0} \u30D4\u30FC\u30AF: {1} \u5408\u8A08: {2}</html> + THREAD_TAB_THREAD_INFO_ACCESSIBLE_NAME=\u30B9\u30EC\u30C3\u30C9\u60C5\u5831 + THREAD_TAB_THREAD_PLOTTER_ACCESSIBLE_NAME=\u30B9\u30EC\u30C3\u30C9\u6570\u306E\u30C1\u30E3\u30FC\u30C8\u3002 + THREAD_TAB_INITIAL_STACK_TRACE_MESSAGE=[\u30B9\u30EC\u30C3\u30C9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093] + THRESHOLD=\u3057\u304D\u3044\u5024 +-TILE=\u4E26\u3079\u3066\u8868\u793A(&T) ++TILE=\u30BF\u30A4\u30EB\u8868\u793A(&T) + TIME_RANGE_COLON=\u6642\u9593\u7BC4\u56F2(&T): + TIME=\u6642\u9593 + TIME_STAMP=TimeStamp +@@ -249,14 +250,14 @@ + UNREGISTER=\u767B\u9332\u89E3\u9664 + UPTIME=\u7A3C\u50CD\u6642\u9593 + USAGE_THRESHOLD=\u4F7F\u7528\u3057\u304D\u3044\u5024 +-REMOTE_TF_USAGE=<b>\u4F7F\u7528\u65B9\u6CD5</b>: <hostname>:<port>\u307E\u305F\u306Fservice:jmx:<protocol>:<sap> ++REMOTE_TF_USAGE=<b>\u4F7F\u7528\u65B9\u6CD5</b>: &<hostname&>:&<port&> OR service:jmx:&<protocol&>:&<sap&> + USED=\u4F7F\u7528\u6E08 + USERNAME_COLON_=\u30E6\u30FC\u30B6\u30FC\u540D(&U): + USERNAME_ACCESSIBLE_NAME=\u30E6\u30FC\u30B6\u30FC\u540D + USER_DATA=UserData + VIRTUAL_MACHINE=\u4EEE\u60F3\u30DE\u30B7\u30F3 + VM_ARGUMENTS=VM\u5F15\u6570 +-VMINTERNAL_FRAME_ACCESSIBLE_DESCRIPTION=Java\u4EEE\u60F3\u30DE\u30B7\u30F3\u306E\u30E2\u30CB\u30BF\u30FC\u7528\u306E\u5185\u90E8\u30D5\u30EC\u30FC\u30E0 ++VMINTERNAL_FRAME_ACCESSIBLE_DESCRIPTION=Java\u4EEE\u60F3\u30DE\u30B7\u30F3\u306E\u30E2\u30CB\u30BF\u30EA\u30F3\u30B0\u7528\u306E\u5185\u90E8\u30D5\u30EC\u30FC\u30E0 + VALUE=\u5024 + VENDOR=\u30D9\u30F3\u30C0\u30FC + VERBOSE_OUTPUT=\u8A73\u7D30\u51FA\u529B +@@ -265,9 +266,9 @@ + WINDOW=\u30A6\u30A3\u30F3\u30C9\u30A6(&W) + WINDOWS=\u30A6\u30A3\u30F3\u30C9\u30A6 + WRITABLE=\u66F8\u8FBC\u307F\u53EF\u80FD +-CONNECTION_FAILED1=\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F: \u518D\u8A66\u884C\u3057\u307E\u3059\u304B\u3002 +-CONNECTION_FAILED2={0}\u3078\u306E\u63A5\u7D9A\u304C\u6210\u529F\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002<br>\u3082\u3046\u4E00\u5EA6\u8A66\u3057\u307E\u3059\u304B\u3002 +-CONNECTION_FAILED_SSL1=\u4FDD\u8B77\u3055\u308C\u305F\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u4FDD\u8B77\u305B\u305A\u306B\u518D\u8A66\u884C\u3057\u307E\u3059\u304B\u3002 ++CONNECTION_FAILED1=\u63A5\u7D9A\u304C\u5931\u6557\u3057\u307E\u3057\u305F: \u518D\u8A66\u884C\u3057\u307E\u3059\u304B\u3002 ++CONNECTION_FAILED2={0}\u3078\u306E\u63A5\u7D9A\u304C\u6210\u529F\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002<br>\u518D\u8A66\u884C\u3057\u307E\u3059\u304B\u3002 ++CONNECTION_FAILED_SSL1=\u30BB\u30AD\u30E5\u30A2\u306A\u63A5\u7D9A\u304C\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u975E\u30BB\u30AD\u30E5\u30A2\u3067\u518D\u8A66\u884C\u3057\u307E\u3059\u304B\u3002 + CONNECTION_FAILED_SSL2=SSL\u3092\u4F7F\u7528\u3057\u3066{0}\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002<br>SSL\u306A\u3057\u3067\u63A5\u7D9A\u3057\u307E\u3059\u304B\u3002<br>(\u30E6\u30FC\u30B6\u30FC\u540D\u304A\u3088\u3073\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u30D7\u30EC\u30FC\u30F3\u30FB\u30C6\u30AD\u30B9\u30C8\u3067\u9001\u4FE1\u3055\u308C\u307E\u3059\u3002) + CONNECTION_LOST1=\u63A5\u7D9A\u304C\u5931\u308F\u308C\u307E\u3057\u305F: \u518D\u63A5\u7D9A\u3057\u307E\u3059\u304B\u3002 + CONNECTING_TO1={0}\u306B\u63A5\u7D9A\u4E2D +@@ -278,4 +279,4 @@ + KBYTES={0} KB + PLOT=\u30D7\u30ED\u30C3\u30C8 + VISUALIZE=\u8996\u899A\u5316 +-ZZ_USAGE_TEXT=\u4F7F\u7528\u65B9\u6CD5: {0} [ -interval=n ] [ -notile ] [ -pluginpath <path> ] [ -version ] [ connection ... ]\n\n -interval \u66F4\u65B0\u9593\u9694\u3092n\u79D2\u306B\u8A2D\u5B9A\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8\u306F4\u79D2)\n -notile \u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u6700\u521D\u306B\u4E26\u3079\u3066\u8868\u793A\u3057\u306A\u3044(2\u3064\u4EE5\u4E0A\u306E\u63A5\u7D9A\u306B\u3064\u3044\u3066)\n -pluginpath JConsole\u304C\u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u53C2\u7167\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3059\u308B\u30D1\u30B9\u3092\u6307\u5B9A\u3059\u308B\n -version \u30D7\u30ED\u30B0\u30E9\u30E0\u30FB\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3059\u308B\n\n connection = pid || host:port || JMX URL (service:jmx:<protocol>://...)\n pid \u30BF\u30FC\u30B2\u30C3\u30C8\u30FB\u30D7\u30ED\u30BB\u30B9\u306E\u30D7\u30ED\u30BB\u30B9ID\n host \u30EA\u30E2\u30FC\u30C8\u30FB\u30DB\u30B9\u30C8\u540D\u307E\u305F\u306FIP\u30A2\u30C9\u30EC\u30B9\n port \u30EA\u30E2\u30FC\u30C8\u63A5\u7D9A\u7528\u306E\u30DD\u30FC\u30C8\u756A\u53F7\n\n -J JConsole\u304C\u5B9F\u884C\u4E2D\u306EJava\u4EEE\u60F3\u30DE\u30B7\u30F3\u3078\u306E\n \u5165\u529B\u5F15\u6570\u3092\u6307\u5B9A\u3059\u308B ++ZZ_USAGE_TEXT=\u4F7F\u7528\u65B9\u6CD5: {0} [ -interval=n ] [ -notile ] [ -pluginpath <path> ] [ -version ] [ connection ... ]\n\n -interval \u66F4\u65B0\u9593\u9694\u3092n\u79D2\u306B\u8A2D\u5B9A\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8\u306F4\u79D2)\n -notile \u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u6700\u521D\u306B\u30BF\u30A4\u30EB\u8868\u793A\u3057\u306A\u3044(2\u3064\u4EE5\u4E0A\u306E\u63A5\u7D9A\u306B\u3064\u3044\u3066)\n -pluginpath JConsole\u304C\u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u53C2\u7167\u3059\u308B\u305F\u3081\u306B\u4F7F\u7528\u3059\u308B\u30D1\u30B9\u3092\u6307\u5B9A\u3059\u308B\n -version \u30D7\u30ED\u30B0\u30E9\u30E0\u30FB\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3059\u308B\n\n connection = pid || host:port || JMX URL (service:jmx:<protocol>://...)\n pid \u30BF\u30FC\u30B2\u30C3\u30C8\u30FB\u30D7\u30ED\u30BB\u30B9\u306E\u30D7\u30ED\u30BB\u30B9ID\n host \u30EA\u30E2\u30FC\u30C8\u30FB\u30DB\u30B9\u30C8\u540D\u307E\u305F\u306FIP\u30A2\u30C9\u30EC\u30B9\n port \u30EA\u30E2\u30FC\u30C8\u63A5\u7D9A\u7528\u306E\u30DD\u30FC\u30C8\u756A\u53F7\n\n -J JConsole\u304C\u5B9F\u884C\u4E2D\u306EJava\u4EEE\u60F3\u30DE\u30B7\u30F3\u3078\u306E\n \u5165\u529B\u5F15\u6570\u3092\u6307\u5B9A\u3059\u308B +--- ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_zh_CN.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_zh_CN.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -227,6 +227,7 @@ + SUMMARY_TAB_TAB_NAME=VM \u6982\u8981 + SUMMARY_TAB_VM_VERSION={0}\u7248\u672C {1} + THREADS=\u7EBF\u7A0B ++THREAD_TAB_INFO_LABEL_FORMAT=<html>\u6D3B\u52A8: {0} \u5CF0\u503C: {1} \u603B\u8BA1: {2}</html> + THREAD_TAB_THREAD_INFO_ACCESSIBLE_NAME=\u7EBF\u7A0B\u4FE1\u606F + THREAD_TAB_THREAD_PLOTTER_ACCESSIBLE_NAME=\u8868\u793A\u7EBF\u7A0B\u6570\u7684\u56FE\u8868\u3002 + THREAD_TAB_INITIAL_STACK_TRACE_MESSAGE=[\u672A\u9009\u62E9\u7EBF\u7A0B] +@@ -249,7 +250,7 @@ + UNREGISTER=\u6CE8\u9500 + UPTIME=\u8FD0\u884C\u65F6\u95F4 + USAGE_THRESHOLD=\u7528\u6CD5\u9608\u503C +-REMOTE_TF_USAGE=<b>\u7528\u6CD5</b>: <hostname>:<port> \u6216 service:jmx:<protocol>:<sap> ++REMOTE_TF_USAGE=<b>\u7528\u6CD5</b>: &<hostname&>:&<port&> \u6216 service:jmx:&<protocol&>:&<sap&> + USED=\u5DF2\u7528 + USERNAME_COLON_=\u7528\u6237\u540D(&U): + USERNAME_ACCESSIBLE_NAME=\u7528\u6237\u540D +--- ./jdk/src/share/instrument/Reentrancy.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/instrument/Reentrancy.c Wed Jul 30 18:42:59 2014 +0100 +@@ -130,6 +130,7 @@ + error = confirmingTLSSet ( jvmtienv, + thread, + JPLIS_CURRENTLY_INSIDE_TOKEN); ++ check_phase_ret_false(error); + jplis_assert(error == JVMTI_ERROR_NONE); + if ( error != JVMTI_ERROR_NONE ) { + result = JNI_FALSE; +@@ -158,6 +159,7 @@ + error = confirmingTLSSet( jvmtienv, + thread, + JPLIS_CURRENTLY_OUTSIDE_TOKEN); ++ check_phase_ret(error); + jplis_assert(error == JVMTI_ERROR_NONE); + + } +--- ./jdk/src/share/javavm/export/jvm.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/javavm/export/jvm.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1331,6 +1331,9 @@ + JNIEXPORT jobject JNICALL + JVM_InitAgentProperties(JNIEnv *env, jobject agent_props); + ++JNIEXPORT jstring JNICALL ++JVM_GetTemporaryDirectory(JNIEnv *env); ++ + /* Generics reflection support. + * + * Returns information about the given class's EnclosingMethod +--- ./jdk/src/share/lib/security/java.security-aix Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/lib/security/java.security-aix Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,498 @@ ++# ++# This is the "master security properties file". ++# ++# An alternate java.security properties file may be specified ++# from the command line via the system property ++# ++# -Djava.security.properties=<URL> ++# ++# This properties file appends to the master security properties file. ++# If both properties files specify values for the same key, the value ++# from the command-line properties file is selected, as it is the last ++# one loaded. ++# ++# Also, if you specify ++# ++# -Djava.security.properties==<URL> (2 equals), ++# ++# then that properties file completely overrides the master security ++# properties file. ++# ++# To disable the ability to specify an additional properties file from ++# the command line, set the key security.overridePropertiesFile ++# to false in the master security properties file. It is set to true ++# by default. ++ ++# In this file, various security properties are set for use by ++# java.security classes. This is where users can statically register ++# Cryptography Package Providers ("providers" for short). The term ++# "provider" refers to a package or set of packages that supply a ++# concrete implementation of a subset of the cryptography aspects of ++# the Java Security API. A provider may, for example, implement one or ++# more digital signature algorithms or message digest algorithms. ++# ++# Each provider must implement a subclass of the Provider class. ++# To register a provider in this master security properties file, ++# specify the Provider subclass name and priority in the format ++# ++# security.provider.<n>=<className> ++# ++# This declares a provider, and specifies its preference ++# order n. The preference order is the order in which providers are ++# searched for requested algorithms (when no specific provider is ++# requested). The order is 1-based; 1 is the most preferred, followed ++# by 2, and so on. ++# ++# <className> must specify the subclass of the Provider class whose ++# constructor sets the values of various properties that are required ++# for the Java Security API to look up the algorithms or other ++# facilities implemented by the provider. ++# ++# There must be at least one provider specification in java.security. ++# There is a default provider that comes standard with the JDK. It ++# is called the "SUN" provider, and its Provider subclass ++# named Sun appears in the sun.security.provider package. Thus, the ++# "SUN" provider is registered via the following: ++# ++# security.provider.1=sun.security.provider.Sun ++# ++# (The number 1 is used for the default provider.) ++# ++# Note: Providers can be dynamically registered instead by calls to ++# either the addProvider or insertProviderAt method in the Security ++# class. ++ ++# ++# List of providers and their preference orders (see above): ++# ++security.provider.1=sun.security.provider.Sun ++security.provider.2=sun.security.rsa.SunRsaSign ++security.provider.3=sun.security.ec.SunEC ++security.provider.4=com.sun.net.ssl.internal.ssl.Provider ++security.provider.5=com.sun.crypto.provider.SunJCE ++security.provider.6=sun.security.jgss.SunProvider ++security.provider.7=com.sun.security.sasl.Provider ++security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI ++security.provider.9=sun.security.smartcardio.SunPCSC ++ ++# ++# Sun Provider SecureRandom seed source. ++# ++# Select the primary source of seed data for the "SHA1PRNG" and ++# "NativePRNG" SecureRandom implementations in the "Sun" provider. ++# (Other SecureRandom implementations might also use this property.) ++# ++# On Unix-like systems (for example, Solaris/Linux/MacOS), the ++# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from ++# special device files such as file:/dev/random. ++# ++# On Windows systems, specifying the URLs "file:/dev/random" or ++# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding ++# mechanism for SHA1PRNG. ++# ++# By default, an attempt is made to use the entropy gathering device ++# specified by the "securerandom.source" Security property. If an ++# exception occurs while accessing the specified URL: ++# ++# SHA1PRNG: ++# the traditional system/thread activity algorithm will be used. ++# ++# NativePRNG: ++# a default value of /dev/random will be used. If neither ++# are available, the implementation will be disabled. ++# "file" is the only currently supported protocol type. ++# ++# The entropy gathering device can also be specified with the System ++# property "java.security.egd". For example: ++# ++# % java -Djava.security.egd=file:/dev/random MainClass ++# ++# Specifying this System property will override the ++# "securerandom.source" Security property. ++# ++# In addition, if "file:/dev/random" or "file:/dev/urandom" is ++# specified, the "NativePRNG" implementation will be more preferred than ++# SHA1PRNG in the Sun provider. ++# ++securerandom.source=file:/dev/random ++ ++# ++# A list of known strong SecureRandom implementations. ++# ++# To help guide applications in selecting a suitable strong ++# java.security.SecureRandom implementation, Java distributions should ++# indicate a list of known strong implementations using the property. ++# ++# This is a comma-separated list of algorithm and/or algorithm:provider ++# entries. ++# ++securerandom.strongAlgorithms=NativePRNGBlocking:SUN ++ ++# ++# Class to instantiate as the javax.security.auth.login.Configuration ++# provider. ++# ++login.configuration.provider=sun.security.provider.ConfigFile ++ ++# ++# Default login configuration file ++# ++#login.config.url.1=file:${user.home}/.java.login.config ++ ++# ++# Class to instantiate as the system Policy. This is the name of the class ++# that will be used as the Policy object. ++# ++policy.provider=sun.security.provider.PolicyFile ++ ++# The default is to have a single system-wide policy file, ++# and a policy file in the user's home directory. ++policy.url.1=file:${java.home}/lib/security/java.policy ++policy.url.2=file:${user.home}/.java.policy ++ ++# whether or not we expand properties in the policy file ++# if this is set to false, properties (${...}) will not be expanded in policy ++# files. ++policy.expandProperties=true ++ ++# whether or not we allow an extra policy to be passed on the command line ++# with -Djava.security.policy=somefile. Comment out this line to disable ++# this feature. ++policy.allowSystemProperty=true ++ ++# whether or not we look into the IdentityScope for trusted Identities ++# when encountering a 1.1 signed JAR file. If the identity is found ++# and is trusted, we grant it AllPermission. ++policy.ignoreIdentityScope=false ++ ++# ++# Default keystore type. ++# ++keystore.type=jks ++ ++# ++# List of comma-separated packages that start with or equal this string ++# will cause a security exception to be thrown when ++# passed to checkPackageAccess unless the ++# corresponding RuntimePermission ("accessClassInPackage."+package) has ++# been granted. ++package.access=sun.,\ ++ com.sun.xml.internal.,\ ++ com.sun.imageio.,\ ++ com.sun.istack.internal.,\ ++ com.sun.jmx.,\ ++ com.sun.media.sound.,\ ++ com.sun.naming.internal.,\ ++ com.sun.proxy.,\ ++ com.sun.corba.se.,\ ++ com.sun.org.apache.bcel.internal.,\ ++ com.sun.org.apache.regexp.internal.,\ ++ com.sun.org.apache.xerces.internal.,\ ++ com.sun.org.apache.xpath.internal.,\ ++ com.sun.org.apache.xalan.internal.extensions.,\ ++ com.sun.org.apache.xalan.internal.lib.,\ ++ com.sun.org.apache.xalan.internal.res.,\ ++ com.sun.org.apache.xalan.internal.templates.,\ ++ com.sun.org.apache.xalan.internal.utils.,\ ++ com.sun.org.apache.xalan.internal.xslt.,\ ++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\ ++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\ ++ com.sun.org.apache.xalan.internal.xsltc.trax.,\ ++ com.sun.org.apache.xalan.internal.xsltc.util.,\ ++ com.sun.org.apache.xml.internal.res.,\ ++ com.sun.org.apache.xml.internal.security.,\ ++ com.sun.org.apache.xml.internal.serializer.utils.,\ ++ com.sun.org.apache.xml.internal.utils.,\ ++ com.sun.org.glassfish.,\ ++ com.oracle.xmlns.internal.,\ ++ com.oracle.webservices.internal.,\ ++ oracle.jrockit.jfr.,\ ++ org.jcp.xml.dsig.internal.,\ ++ jdk.internal.,\ ++ jdk.nashorn.internal.,\ ++ jdk.nashorn.tools. ++ ++ ++# ++# List of comma-separated packages that start with or equal this string ++# will cause a security exception to be thrown when ++# passed to checkPackageDefinition unless the ++# corresponding RuntimePermission ("defineClassInPackage."+package) has ++# been granted. ++# ++# by default, none of the class loaders supplied with the JDK call ++# checkPackageDefinition. ++# ++package.definition=sun.,\ ++ com.sun.xml.internal.,\ ++ com.sun.imageio.,\ ++ com.sun.istack.internal.,\ ++ com.sun.jmx.,\ ++ com.sun.media.sound.,\ ++ com.sun.naming.internal.,\ ++ com.sun.proxy.,\ ++ com.sun.corba.se.,\ ++ com.sun.org.apache.bcel.internal.,\ ++ com.sun.org.apache.regexp.internal.,\ ++ com.sun.org.apache.xerces.internal.,\ ++ com.sun.org.apache.xpath.internal.,\ ++ com.sun.org.apache.xalan.internal.extensions.,\ ++ com.sun.org.apache.xalan.internal.lib.,\ ++ com.sun.org.apache.xalan.internal.res.,\ ++ com.sun.org.apache.xalan.internal.templates.,\ ++ com.sun.org.apache.xalan.internal.utils.,\ ++ com.sun.org.apache.xalan.internal.xslt.,\ ++ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\ ++ com.sun.org.apache.xalan.internal.xsltc.compiler.,\ ++ com.sun.org.apache.xalan.internal.xsltc.trax.,\ ++ com.sun.org.apache.xalan.internal.xsltc.util.,\ ++ com.sun.org.apache.xml.internal.res.,\ ++ com.sun.org.apache.xml.internal.security.,\ ++ com.sun.org.apache.xml.internal.serializer.utils.,\ ++ com.sun.org.apache.xml.internal.utils.,\ ++ com.sun.org.glassfish.,\ ++ com.oracle.xmlns.internal.,\ ++ com.oracle.webservices.internal.,\ ++ oracle.jrockit.jfr.,\ ++ org.jcp.xml.dsig.internal.,\ ++ jdk.internal.,\ ++ jdk.nashorn.internal.,\ ++ jdk.nashorn.tools. ++ ++ ++# ++# Determines whether this properties file can be appended to ++# or overridden on the command line via -Djava.security.properties ++# ++security.overridePropertiesFile=true ++ ++# ++# Determines the default key and trust manager factory algorithms for ++# the javax.net.ssl package. ++# ++ssl.KeyManagerFactory.algorithm=SunX509 ++ssl.TrustManagerFactory.algorithm=PKIX ++ ++# ++# The Java-level namelookup cache policy for successful lookups: ++# ++# any negative value: caching forever ++# any positive value: the number of seconds to cache an address for ++# zero: do not cache ++# ++# default value is forever (FOREVER). For security reasons, this ++# caching is made forever when a security manager is set. When a security ++# manager is not set, the default behavior in this implementation ++# is to cache for 30 seconds. ++# ++# NOTE: setting this to anything other than the default value can have ++# serious security implications. Do not set it unless ++# you are sure you are not exposed to DNS spoofing attack. ++# ++#networkaddress.cache.ttl=-1 ++ ++# The Java-level namelookup cache policy for failed lookups: ++# ++# any negative value: cache forever ++# any positive value: the number of seconds to cache negative lookup results ++# zero: do not cache ++# ++# In some Microsoft Windows networking environments that employ ++# the WINS name service in addition to DNS, name service lookups ++# that fail may take a noticeably long time to return (approx. 5 seconds). ++# For this reason the default caching policy is to maintain these ++# results for 10 seconds. ++# ++# ++networkaddress.cache.negative.ttl=10 ++ ++# ++# Properties to configure OCSP for certificate revocation checking ++# ++ ++# Enable OCSP ++# ++# By default, OCSP is not used for certificate revocation checking. ++# This property enables the use of OCSP when set to the value "true". ++# ++# NOTE: SocketPermission is required to connect to an OCSP responder. ++# ++# Example, ++# ocsp.enable=true ++ ++# ++# Location of the OCSP responder ++# ++# By default, the location of the OCSP responder is determined implicitly ++# from the certificate being validated. This property explicitly specifies ++# the location of the OCSP responder. The property is used when the ++# Authority Information Access extension (defined in RFC 3280) is absent ++# from the certificate or when it requires overriding. ++# ++# Example, ++# ocsp.responderURL=http://ocsp.example.net:80 ++ ++# ++# Subject name of the OCSP responder's certificate ++# ++# By default, the certificate of the OCSP responder is that of the issuer ++# of the certificate being validated. This property identifies the certificate ++# of the OCSP responder when the default does not apply. Its value is a string ++# distinguished name (defined in RFC 2253) which identifies a certificate in ++# the set of certificates supplied during cert path validation. In cases where ++# the subject name alone is not sufficient to uniquely identify the certificate ++# then both the "ocsp.responderCertIssuerName" and ++# "ocsp.responderCertSerialNumber" properties must be used instead. When this ++# property is set then those two properties are ignored. ++# ++# Example, ++# ocsp.responderCertSubjectName="CN=OCSP Responder, O=XYZ Corp" ++ ++# ++# Issuer name of the OCSP responder's certificate ++# ++# By default, the certificate of the OCSP responder is that of the issuer ++# of the certificate being validated. This property identifies the certificate ++# of the OCSP responder when the default does not apply. Its value is a string ++# distinguished name (defined in RFC 2253) which identifies a certificate in ++# the set of certificates supplied during cert path validation. When this ++# property is set then the "ocsp.responderCertSerialNumber" property must also ++# be set. When the "ocsp.responderCertSubjectName" property is set then this ++# property is ignored. ++# ++# Example, ++# ocsp.responderCertIssuerName="CN=Enterprise CA, O=XYZ Corp" ++ ++# ++# Serial number of the OCSP responder's certificate ++# ++# By default, the certificate of the OCSP responder is that of the issuer ++# of the certificate being validated. This property identifies the certificate ++# of the OCSP responder when the default does not apply. Its value is a string ++# of hexadecimal digits (colon or space separators may be present) which ++# identifies a certificate in the set of certificates supplied during cert path ++# validation. When this property is set then the "ocsp.responderCertIssuerName" ++# property must also be set. When the "ocsp.responderCertSubjectName" property ++# is set then this property is ignored. ++# ++# Example, ++# ocsp.responderCertSerialNumber=2A:FF:00 ++ ++# ++# Policy for failed Kerberos KDC lookups: ++# ++# When a KDC is unavailable (network error, service failure, etc), it is ++# put inside a blacklist and accessed less often for future requests. The ++# value (case-insensitive) for this policy can be: ++# ++# tryLast ++# KDCs in the blacklist are always tried after those not on the list. ++# ++# tryLess[:max_retries,timeout] ++# KDCs in the blacklist are still tried by their order in the configuration, ++# but with smaller max_retries and timeout values. max_retries and timeout ++# are optional numerical parameters (default 1 and 5000, which means once ++# and 5 seconds). Please notes that if any of the values defined here is ++# more than what is defined in krb5.conf, it will be ignored. ++# ++# Whenever a KDC is detected as available, it is removed from the blacklist. ++# The blacklist is reset when krb5.conf is reloaded. You can add ++# refreshKrb5Config=true to a JAAS configuration file so that krb5.conf is ++# reloaded whenever a JAAS authentication is attempted. ++# ++# Example, ++# krb5.kdc.bad.policy = tryLast ++# krb5.kdc.bad.policy = tryLess:2,2000 ++krb5.kdc.bad.policy = tryLast ++ ++# Algorithm restrictions for certification path (CertPath) processing ++# ++# In some environments, certain algorithms or key lengths may be undesirable ++# for certification path building and validation. For example, "MD2" is ++# generally no longer considered to be a secure hash algorithm. This section ++# describes the mechanism for disabling algorithms based on algorithm name ++# and/or key length. This includes algorithms used in certificates, as well ++# as revocation information such as CRLs and signed OCSP Responses. ++# ++# The syntax of the disabled algorithm string is described as this Java ++# BNF-style: ++# DisabledAlgorithms: ++# " DisabledAlgorithm { , DisabledAlgorithm } " ++# ++# DisabledAlgorithm: ++# AlgorithmName [Constraint] ++# ++# AlgorithmName: ++# (see below) ++# ++# Constraint: ++# KeySizeConstraint ++# ++# KeySizeConstraint: ++# keySize Operator DecimalInteger ++# ++# Operator: ++# <= | < | == | != | >= | > ++# ++# DecimalInteger: ++# DecimalDigits ++# ++# DecimalDigits: ++# DecimalDigit {DecimalDigit} ++# ++# DecimalDigit: one of ++# 1 2 3 4 5 6 7 8 9 0 ++# ++# The "AlgorithmName" is the standard algorithm name of the disabled ++# algorithm. See "Java Cryptography Architecture Standard Algorithm Name ++# Documentation" for information about Standard Algorithm Names. Matching ++# is performed using a case-insensitive sub-element matching rule. (For ++# example, in "SHA1withECDSA" the sub-elements are "SHA1" for hashing and ++# "ECDSA" for signatures.) If the assertion "AlgorithmName" is a ++# sub-element of the certificate algorithm name, the algorithm will be ++# rejected during certification path building and validation. For example, ++# the assertion algorithm name "DSA" will disable all certificate algorithms ++# that rely on DSA, such as NONEwithDSA, SHA1withDSA. However, the assertion ++# will not disable algorithms related to "ECDSA". ++# ++# A "Constraint" provides further guidance for the algorithm being specified. ++# The "KeySizeConstraint" requires a key of a valid size range if the ++# "AlgorithmName" is of a key algorithm. The "DecimalInteger" indicates the ++# key size specified in number of bits. For example, "RSA keySize <= 1024" ++# indicates that any RSA key with key size less than or equal to 1024 bits ++# should be disabled, and "RSA keySize < 1024, RSA keySize > 2048" indicates ++# that any RSA key with key size less than 1024 or greater than 2048 should ++# be disabled. Note that the "KeySizeConstraint" only makes sense to key ++# algorithms. ++# ++# Note: This property is currently used by Oracle's PKIX implementation. It ++# is not guaranteed to be examined and used by other implementations. ++# ++# Example: ++# jdk.certpath.disabledAlgorithms=MD2, DSA, RSA keySize < 2048 ++# ++# ++jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024 ++ ++# Algorithm restrictions for Secure Socket Layer/Transport Layer Security ++# (SSL/TLS) processing ++# ++# In some environments, certain algorithms or key lengths may be undesirable ++# when using SSL/TLS. This section describes the mechanism for disabling ++# algorithms during SSL/TLS security parameters negotiation, including cipher ++# suites selection, peer authentication and key exchange mechanisms. ++# ++# For PKI-based peer authentication and key exchange mechanisms, this list ++# of disabled algorithms will also be checked during certification path ++# building and validation, including algorithms used in certificates, as ++# well as revocation information such as CRLs and signed OCSP Responses. ++# This is in addition to the jdk.certpath.disabledAlgorithms property above. ++# ++# See the specification of "jdk.certpath.disabledAlgorithms" for the ++# syntax of the disabled algorithm string. ++# ++# Note: This property is currently used by Oracle's JSSE implementation. ++# It is not guaranteed to be examined and used by other implementations. ++# ++# Example: ++# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 +--- ./jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -32,6 +32,8 @@ + #include <stdlib.h> + #include <stdarg.h> + ++#include "jni_util.h" ++ + #include "defines.h" + #include "bytes.h" + #include "utils.h" +@@ -147,7 +149,7 @@ + break; + } + coding* ptr = NEW(coding, 1); +- CHECK_NULL_0(ptr); ++ CHECK_NULL_RETURN(ptr, 0); + coding* c = ptr->initFrom(spec); + if (c == null) { + mtrace('f', ptr, 0); +--- ./jdk/src/share/native/com/sun/java/util/jar/pack/defines.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/com/sun/java/util/jar/pack/defines.h Wed Jul 30 18:42:59 2014 +0100 +@@ -159,10 +159,6 @@ + #define CHECK_(y) _CHECK_DO(aborting(), return y) + #define CHECK_0 _CHECK_DO(aborting(), return 0) + +-#define CHECK_NULL(p) _CHECK_DO((p)==null, return) +-#define CHECK_NULL_(y,p) _CHECK_DO((p)==null, return y) +-#define CHECK_NULL_0(p) _CHECK_DO((p)==null, return 0) +- + #define CHECK_COUNT(t) if (t < 0){abort("bad value count");} CHECK + + #define STR_TRUE "true" +--- ./jdk/src/share/native/com/sun/java/util/jar/pack/zip.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/com/sun/java/util/jar/pack/zip.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -73,8 +73,9 @@ + SWAP_BYTES(a & 0xFFFF) + + #define GET_INT_HI(a) \ +- SWAP_BYTES((a >> 16) & 0xFFFF); ++ SWAP_BYTES((a >> 16) & 0xFFFF) + ++static const ushort jarmagic[2] = { SWAP_BYTES(0xCAFE), 0 }; + + void jar::init(unpacker* u_) { + BYTES_OF(*this).clear(); +@@ -105,13 +106,14 @@ + + header[0] = (ushort)SWAP_BYTES(0x4B50); + header[1] = (ushort)SWAP_BYTES(0x0201); +- header[2] = (ushort)SWAP_BYTES(0xA); ++ header[2] = (ushort)SWAP_BYTES(( store ) ? 0x0A : 0x14); + + // required version +- header[3] = (ushort)SWAP_BYTES(0xA); ++ header[3] = (ushort)SWAP_BYTES(( store ) ? 0x0A : 0x14); + +- // flags 02 = maximum sub-compression flag +- header[4] = ( store ) ? 0x0 : SWAP_BYTES(0x2); ++ // Flags - UTF-8 compression and separating crc and sizes ++ // into separate headers for deflated file ++ header[4] = ( store ) ? SWAP_BYTES(0x0800) : 0x0808; + + // Compression method 8=deflate. + header[5] = ( store ) ? 0x0 : SWAP_BYTES(0x08); +@@ -135,7 +137,8 @@ + // Filename length + header[14] = (ushort)SWAP_BYTES(fname_length); + // So called "extra field" length. +- header[15] = 0; ++ // If it's the first record we must add JAR magic sequence ++ header[15] = ( central_directory_count ) ? 0 : (ushort)SWAP_BYTES(4); + // So called "comment" length. + header[16] = 0; + // Disk number start +@@ -155,6 +158,11 @@ + // Copy the fname to the header. + central_directory.append(fname, fname_length); + ++ // Add jar magic for the first record ++ if (central_directory_count == 0) { ++ central_directory.append((void *)jarmagic, sizeof(jarmagic)); ++ } ++ + central_directory_count++; + } + +@@ -170,10 +178,10 @@ + header[1] = (ushort)SWAP_BYTES(0x0403); + + // Version +- header[2] = (ushort)SWAP_BYTES(0xA); ++ header[2] = (ushort)SWAP_BYTES(( store ) ? 0x0A : 0x14); + +- // flags 02 = maximum sub-compression flag +- header[3] = ( store ) ? 0x0 : SWAP_BYTES(0x2); ++ // General purpose flags - same as in the Central Directory ++ header[3] = ( store ) ? SWAP_BYTES(0x0800) : 0x0808; + + // Compression method = deflate + header[4] = ( store ) ? 0x0 : SWAP_BYTES(0x08); +@@ -182,28 +190,51 @@ + header[5] = (ushort)GET_INT_LO(dostime); + header[6] = (ushort)GET_INT_HI(dostime); + +- // CRC +- header[7] = (ushort)GET_INT_LO(crc); +- header[8] = (ushort)GET_INT_HI(crc); ++ // CRC, 0 if deflated, will come separately in extra header ++ header[7] = ( store ) ? (ushort)GET_INT_LO(crc) : 0; ++ header[8] = ( store ) ? (ushort)GET_INT_HI(crc) : 0; + +- // Compressed length: +- header[9] = (ushort)GET_INT_LO(clen); +- header[10] = (ushort)GET_INT_HI(clen); ++ // Compressed length, 0 if deflated ++ header[9] = ( store ) ? (ushort)GET_INT_LO(clen) : 0; ++ header[10] = ( store ) ? (ushort)GET_INT_HI(clen) : 0; + +- // Uncompressed length. +- header[11] = (ushort)GET_INT_LO(len); +- header[12] = (ushort)GET_INT_HI(len); ++ // Uncompressed length, 0 if deflated ++ header[11] = ( store ) ? (ushort)GET_INT_LO(len) : 0; ++ header[12] = ( store ) ? (ushort)GET_INT_HI(len) : 0; + + // Filename length + header[13] = (ushort)SWAP_BYTES(fname_length); + // So called "extra field" length. +- header[14] = 0; ++ header[14] = ( central_directory_count - 1 ) ? 0 : (ushort)SWAP_BYTES(4); + + // Write the LOC header to the output file. + write_data(header, (int)sizeof(header)); + + // Copy the fname to the header. + write_data((char*)fname, (int)fname_length); ++ ++ if (central_directory_count == 1) { ++ // Write JAR magic sequence ++ write_data((void *)jarmagic, (int)sizeof(jarmagic)); ++ } ++} ++ ++void jar::write_jar_extra(int len, int clen, uint crc) { ++ ushort header[8]; ++ // Extra field signature ++ header[0] = (ushort)SWAP_BYTES(0x4B50); ++ header[1] = (ushort)SWAP_BYTES(0x0807); ++ // CRC ++ header[2] = (ushort)GET_INT_LO(crc); ++ header[3] = (ushort)GET_INT_HI(crc); ++ // Compressed length ++ header[4] = (ushort)GET_INT_LO(clen); ++ header[5] = (ushort)GET_INT_HI(clen); ++ // Uncompressed length ++ header[6] = (ushort)GET_INT_LO(len); ++ header[7] = (ushort)GET_INT_HI(len); ++ ++ write_data(header, sizeof(header)); + } + + static const char marker_comment[] = ZIP_ARCHIVE_MARKER_COMMENT; +@@ -212,6 +243,7 @@ + bytes mc; mc.set(marker_comment); + + ushort header[11]; ++ ushort header64[38]; + + // Create the End of Central Directory structure. + header[0] = (ushort)SWAP_BYTES(0x4B50); +@@ -220,8 +252,8 @@ + header[2] = 0; + header[3] = 0; + // Number of entries in central directory. +- header[4] = (ushort)SWAP_BYTES(central_directory_count); +- header[5] = (ushort)SWAP_BYTES(central_directory_count); ++ header[4] = ( central_directory_count >= 0xffff ) ? 0xffff : (ushort)SWAP_BYTES(central_directory_count); ++ header[5] = ( central_directory_count >= 0xffff ) ? 0xffff : (ushort)SWAP_BYTES(central_directory_count); + // Size of the central directory} + header[6] = (ushort)GET_INT_LO((int)central_directory.size()); + header[7] = (ushort)GET_INT_HI((int)central_directory.size()); +@@ -229,12 +261,71 @@ + header[8] = (ushort)GET_INT_LO(output_file_offset); + header[9] = (ushort)GET_INT_HI(output_file_offset); + // zipfile comment length; +- header [10] = (ushort)SWAP_BYTES((int)mc.len); ++ header[10] = (ushort)SWAP_BYTES((int)mc.len); + + // Write the central directory. + PRINTCR((2, "Central directory at %d\n", output_file_offset)); + write_data(central_directory.b); + ++ // If number of records exceeds the 0xFFFF we need to prepend extended ++ // Zip64 End of Central Directory record and its locator to the old ++ // style ECD record ++ if (central_directory_count > 0xFFFF) { ++ // Zip64 END signature ++ header64[0] = (ushort)SWAP_BYTES(0x4B50); ++ header64[1] = (ushort)0x0606; ++ // Size of header (long) ++ header64[2] = (ushort)SWAP_BYTES(44);; ++ header64[3] = 0; ++ header64[4] = 0; ++ header64[5] = 0; ++ // Version produced and required (short) ++ header64[6] = (ushort)SWAP_BYTES(45); ++ header64[7] = (ushort)SWAP_BYTES(45); ++ // Current disk number (int) ++ header64[8] = 0; ++ header64[9] = 0; ++ // Central directory start disk (int) ++ header64[10] = 0; ++ header64[11] = 0; ++ // Count of records on disk (long) ++ header64[12] = (ushort)GET_INT_LO(central_directory_count); ++ header64[13] = (ushort)GET_INT_HI(central_directory_count); ++ header64[14] = 0; ++ header64[15] = 0; ++ // Count of records totally (long) ++ header64[16] = (ushort)GET_INT_LO(central_directory_count); ++ header64[17] = (ushort)GET_INT_HI(central_directory_count); ++ header64[18] = 0; ++ header64[19] = 0; ++ // Length of the central directory (long) ++ header64[20] = header[6]; ++ header64[21] = header[7]; ++ header64[22] = 0; ++ header64[23] = 0; ++ // Offset of central directory (long) ++ header64[24] = header[8]; ++ header64[25] = header[9]; ++ header64[26] = 0; ++ header64[27] = 0; ++ // Zip64 end of central directory locator ++ // Locator signature ++ header64[28] = (ushort)SWAP_BYTES(0x4B50); ++ header64[29] = (ushort)SWAP_BYTES(0x0706); ++ // Start disk number (int) ++ header64[30] = 0; ++ header64[31] = 0; ++ // Offset of zip64 END record (long) ++ header64[32] = (ushort)GET_INT_LO(output_file_offset); ++ header64[33] = (ushort)GET_INT_HI(output_file_offset); ++ header64[34] = 0; ++ header64[35] = 0; ++ // Total number of disks (int) ++ header64[36] = (ushort)SWAP_BYTES(1); ++ header64[37] = 0; ++ write_data(header64, (int)sizeof(header64)); ++ } ++ + // Write the End of Central Directory structure. + PRINTCR((2, "end-of-directory at %d\n", output_file_offset)); + write_data(header, (int)sizeof(header)); +@@ -286,6 +377,8 @@ + + if (deflate) { + write_data(deflated.b); ++ // Write deflated information in extra header ++ write_jar_extra(len, clen, crc); + } else { + write_data(head); + write_data(tail); +@@ -368,7 +461,7 @@ + // NOTE: the window size should always be -MAX_WBITS normally -15. + // unzip/zipup.c and java/Deflater.c + +- int error = deflateInit2(&zs, Z_BEST_COMPRESSION, Z_DEFLATED, ++ int error = deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, + -MAX_WBITS, 8, Z_DEFAULT_STRATEGY); + if (error != Z_OK) { + switch (error) { +@@ -414,7 +507,8 @@ + error = deflate(&zs, Z_FINISH); + } + if (error == Z_STREAM_END) { +- if (len > (int)zs.total_out ) { ++ if ((int)zs.total_out > 0) { ++ // Even if compressed size is bigger than uncompressed, write it + PRINTCR((2, "deflate compressed data %d -> %d\n", len, zs.total_out)); + deflated.b.len = zs.total_out; + deflateEnd(&zs); +--- ./jdk/src/share/native/com/sun/java/util/jar/pack/zip.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/com/sun/java/util/jar/pack/zip.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -40,7 +40,7 @@ + + // Private members + fillbytes central_directory; +- ushort central_directory_count; ++ uint central_directory_count; + uint output_file_offset; + fillbytes deflated; // temporary buffer + +@@ -74,6 +74,7 @@ + int len, int clen, uLong crc); + void write_jar_header(const char* fname, bool store, int modtime, + int len, int clen, unsigned int crc); ++ void write_jar_extra(int len, int clen, unsigned int crc); + void write_central_directory(); + uLong dostime(int y, int n, int d, int h, int m, int s); + uLong get_dostime(int modtime); +--- ./jdk/src/share/native/com/sun/media/sound/DirectAudioDevice.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/com/sun/media/sound/DirectAudioDevice.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2012, 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 +@@ -32,6 +32,7 @@ + + + #include <jni.h> ++#include <jni_util.h> + // for malloc + #ifdef _ALLBSD_SOURCE + #include <stdlib.h> +@@ -603,6 +604,7 @@ + if (len == 0) return 0; + if (info && info->handle) { + data = (UINT8*) ((*env)->GetByteArrayElements(env, jData, &didCopy)); ++ CHECK_NULL_RETURN(data, ret); + dataOffset = data; + dataOffset += (int) offset; + convertedData = dataOffset; +@@ -671,6 +673,7 @@ + } + if (info && info->handle) { + data = (char*) ((*env)->GetByteArrayElements(env, jData, NULL)); ++ CHECK_NULL_RETURN(data, ret); + dataOffset = data; + dataOffset += (int) offset; + ret = DAUDIO_Read(info->handle, dataOffset, (int) len); +--- ./jdk/src/share/native/com/sun/media/sound/DirectAudioDeviceProvider.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/com/sun/media/sound/DirectAudioDeviceProvider.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2007, 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 +@@ -28,6 +28,7 @@ + + + #include <jni.h> ++#include <jni_util.h> + #include "SoundDefs.h" + #include "DirectAudio.h" + #include "Utilities.h" +@@ -70,6 +71,11 @@ + jmethodID directAudioDeviceInfoConstructor; + DirectAudioDeviceDescription desc; + jobject info = NULL; ++ jstring name; ++ jstring vendor; ++ jstring description; ++ jstring version; ++ + TRACE1("Java_com_sun_media_sound_DirectAudioDeviceProvider_nNewDirectAudioDeviceInfo(%d).\n", mixerIndex); + + // retrieve class and constructor of DirectAudioDeviceProvider.DirectAudioDeviceInfo +@@ -89,14 +95,18 @@ + + if (getDirectAudioDeviceDescription(mixerIndex, &desc)) { + // create a new DirectAudioDeviceInfo object and return it +- info = (*env)->NewObject(env, directAudioDeviceInfoClass, directAudioDeviceInfoConstructor, +- mixerIndex, +- desc.deviceID, +- desc.maxSimulLines, +- (*env)->NewStringUTF(env, desc.name), +- (*env)->NewStringUTF(env, desc.vendor), +- (*env)->NewStringUTF(env, desc.description), +- (*env)->NewStringUTF(env, desc.version)); ++ name = (*env)->NewStringUTF(env, desc.name); ++ CHECK_NULL_RETURN(name, info); ++ vendor = (*env)->NewStringUTF(env, desc.vendor); ++ CHECK_NULL_RETURN(vendor, info); ++ description = (*env)->NewStringUTF(env, desc.description); ++ CHECK_NULL_RETURN(description, info); ++ version = (*env)->NewStringUTF(env, desc.version); ++ CHECK_NULL_RETURN(version, info); ++ info = (*env)->NewObject(env, directAudioDeviceInfoClass, ++ directAudioDeviceInfoConstructor, mixerIndex, ++ desc.deviceID, desc.maxSimulLines, ++ name, vendor, description, version); + } else { + ERROR1("ERROR: getDirectAudioDeviceDescription(%d, desc) returned FALSE!\n", mixerIndex); + } +--- ./jdk/src/share/native/com/sun/media/sound/PortMixer.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/com/sun/media/sound/PortMixer.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2007, 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 +@@ -28,6 +28,7 @@ + + + #include <jni.h> ++#include <jni_util.h> + #include "SoundDefs.h" + #include "Ports.h" + #include "Utilities.h" +@@ -170,6 +171,7 @@ + void* PORT_NewBooleanControl(void* creatorV, void* controlID, char* type) { + ControlCreatorJNI* creator = (ControlCreatorJNI*) creatorV; + jobject ctrl = NULL; ++ jstring typeString; + + #ifdef USE_TRACE + if (((UINT_PTR) type) <= CONTROL_TYPE_MAX) { +@@ -199,8 +201,11 @@ + type = "Select"; + } + +- ctrl = (*creator->env)->NewObject(creator->env, creator->boolCtrlClass, creator->boolCtrlConstructor, +- (jlong) (UINT_PTR) controlID, (*creator->env)->NewStringUTF(creator->env, type)); ++ typeString = (*creator->env)->NewStringUTF(creator->env, type); ++ CHECK_NULL_RETURN(typeString, (void*) ctrl); ++ ctrl = (*creator->env)->NewObject(creator->env, creator->boolCtrlClass, ++ creator->boolCtrlConstructor, ++ (jlong) (UINT_PTR) controlID, typeString); + if (!ctrl) { + ERROR0("PORT_NewBooleanControl: ctrl is NULL\n"); + } +@@ -216,6 +221,7 @@ + jobject ctrl = NULL; + jobjectArray controlArray; + int i; ++ jstring typeString; + + TRACE2("PORT_NewCompoundControl: creating '%s' with %d controls\n", type, controlCount); + if (!creator->compCtrlClass) { +@@ -250,8 +256,11 @@ + (*creator->env)->SetObjectArrayElement(creator->env, controlArray, i, (jobject) controls[i]); + } + TRACE0("PORT_NewCompoundControl: creating compound control\n"); +- ctrl = (*creator->env)->NewObject(creator->env, creator->compCtrlClass, creator->compCtrlConstructor, +- (*creator->env)->NewStringUTF(creator->env, type), controlArray); ++ typeString = (*creator->env)->NewStringUTF(creator->env, type); ++ CHECK_NULL_RETURN(typeString, (void*) ctrl); ++ ctrl = (*creator->env)->NewObject(creator->env, creator->compCtrlClass, ++ creator->compCtrlConstructor, ++ typeString, controlArray); + if (!ctrl) { + ERROR0("PORT_NewCompoundControl: ctrl is NULL\n"); + } +@@ -266,6 +275,8 @@ + float min, float max, float precision, char* units) { + ControlCreatorJNI* creator = (ControlCreatorJNI*) creatorV; + jobject ctrl = NULL; ++ jstring unitsString; ++ jstring typeString; + + #ifdef USE_TRACE + if (((UINT_PTR) type) <= CONTROL_TYPE_MAX) { +@@ -294,18 +305,24 @@ + return NULL; + } + } ++ unitsString = (*creator->env)->NewStringUTF(creator->env, units); ++ CHECK_NULL_RETURN(unitsString, (void*) ctrl); + if (((UINT_PTR) type) <= CONTROL_TYPE_MAX) { + // constructor with int parameter + TRACE1("PORT_NewFloatControl: calling constructor2 with type %d\n", (int) (UINT_PTR) type); +- ctrl = (*creator->env)->NewObject(creator->env, creator->floatCtrlClass, creator->floatCtrlConstructor2, +- (jlong) (UINT_PTR) controlID, (jint) (UINT_PTR) type, +- min, max, precision, (*creator->env)->NewStringUTF(creator->env, units)); ++ ctrl = (*creator->env)->NewObject(creator->env, creator->floatCtrlClass, ++ creator->floatCtrlConstructor2, ++ (jlong) (UINT_PTR) controlID, (jint) (UINT_PTR) type, ++ min, max, precision, unitsString); + } else { + TRACE0("PORT_NewFloatControl: calling constructor1\n"); + // constructor with string parameter +- ctrl = (*creator->env)->NewObject(creator->env, creator->floatCtrlClass, creator->floatCtrlConstructor1, +- (jlong) (UINT_PTR) controlID, (*creator->env)->NewStringUTF(creator->env, type), +- min, max, precision, (*creator->env)->NewStringUTF(creator->env, units)); ++ typeString = (*creator->env)->NewStringUTF(creator->env, type); ++ CHECK_NULL_RETURN(typeString, (void*) ctrl); ++ ctrl = (*creator->env)->NewObject(creator->env, creator->floatCtrlClass, ++ creator->floatCtrlConstructor1, ++ (jlong) (UINT_PTR) controlID, typeString, ++ min, max, precision, unitsString); + } + if (!ctrl) { + ERROR0("PORT_NewFloatControl: ctrl is NULL!\n"); +--- ./jdk/src/share/native/com/sun/media/sound/PortMixerProvider.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/com/sun/media/sound/PortMixerProvider.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2007, 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 +@@ -27,6 +27,7 @@ + + + #include <jni.h> ++#include <jni_util.h> + #include "SoundDefs.h" + #include "Ports.h" + #include "Utilities.h" +@@ -65,6 +66,11 @@ + jmethodID portMixerInfoConstructor; + PortMixerDescription desc; + jobject info = NULL; ++ jstring name; ++ jstring vendor; ++ jstring description; ++ jstring version; ++ + TRACE1("Java_com_sun_media_sound_PortMixerProvider_nNewPortMixerInfo(%d).\n", mixerIndex); + + // retrieve class and constructor of PortMixerProvider.PortMixerInfo +@@ -82,11 +88,17 @@ + + if (getPortMixerDescription(mixerIndex, &desc)) { + // create a new PortMixerInfo object and return it +- info = (*env)->NewObject(env, portMixerInfoClass, portMixerInfoConstructor, mixerIndex, +- (*env)->NewStringUTF(env, desc.name), +- (*env)->NewStringUTF(env, desc.vendor), +- (*env)->NewStringUTF(env, desc.description), +- (*env)->NewStringUTF(env, desc.version)); ++ name = (*env)->NewStringUTF(env, desc.name); ++ CHECK_NULL_RETURN(name, info); ++ vendor = (*env)->NewStringUTF(env, desc.vendor); ++ CHECK_NULL_RETURN(vendor, info); ++ description = (*env)->NewStringUTF(env, desc.description); ++ CHECK_NULL_RETURN(description, info); ++ version = (*env)->NewStringUTF(env, desc.version); ++ CHECK_NULL_RETURN(version, info); ++ info = (*env)->NewObject(env, portMixerInfoClass, ++ portMixerInfoConstructor, mixerIndex, ++ name, vendor, description, version); + } + + TRACE0("Java_com_sun_media_sound_PortMixerProvider_nNewPortMixerInfo succeeded.\n"); +--- ./jdk/src/share/native/common/check_code.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/common/check_code.c Wed Jul 30 18:42:59 2014 +0100 +@@ -90,6 +90,41 @@ + #include "classfile_constants.h" + #include "opcodes.in_out" + ++/* On AIX malloc(0) and calloc(0, ...) return a NULL pointer, which is legal, ++ * but the code here does not handles it. So we wrap the methods and return non-NULL ++ * pointers even if we allocate 0 bytes. ++ */ ++#ifdef _AIX ++static int aix_dummy; ++static void* aix_malloc(size_t len) { ++ if (len == 0) { ++ return &aix_dummy; ++ } ++ return malloc(len); ++} ++ ++static void* aix_calloc(size_t n, size_t size) { ++ if (n == 0) { ++ return &aix_dummy; ++ } ++ return calloc(n, size); ++} ++ ++static void aix_free(void* p) { ++ if (p == &aix_dummy) { ++ return; ++ } ++ free(p); ++} ++ ++#undef malloc ++#undef calloc ++#undef free ++#define malloc aix_malloc ++#define calloc aix_calloc ++#define free aix_free ++#endif ++ + #ifdef __APPLE__ + /* use setjmp/longjmp versions that do not save/restore the signal mask */ + #define setjmp _setjmp +--- ./jdk/src/share/native/common/jni_util.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/common/jni_util.h Wed Jul 30 18:42:59 2014 +0100 +@@ -278,7 +278,54 @@ + #define IS_NULL(obj) ((obj) == NULL) + #define JNU_IsNull(env,obj) ((obj) == NULL) + ++/************************************************************************ ++ * Miscellaneous utilities used by the class libraries to return from ++ * a function if a value is NULL or an exception is pending. ++ */ + ++#define CHECK_NULL(x) \ ++ do { \ ++ if ((x) == NULL) { \ ++ return; \ ++ } \ ++ } while (0) \ ++ ++#define CHECK_NULL_RETURN(x, y) \ ++ do { \ ++ if ((x) == NULL) { \ ++ return (y); \ ++ } \ ++ } while (0) \ ++ ++#ifdef __cplusplus ++#define JNU_CHECK_EXCEPTION(env) \ ++ do { \ ++ if ((env)->ExceptionCheck()) { \ ++ return; \ ++ } \ ++ } while (0) \ ++ ++#define JNU_CHECK_EXCEPTION_RETURN(env, y) \ ++ do { \ ++ if ((env)->ExceptionCheck()) { \ ++ return (y); \ ++ } \ ++ } while (0) ++#else ++#define JNU_CHECK_EXCEPTION(env) \ ++ do { \ ++ if ((*env)->ExceptionCheck(env)) { \ ++ return; \ ++ } \ ++ } while (0) \ ++ ++#define JNU_CHECK_EXCEPTION_RETURN(env, y) \ ++ do { \ ++ if ((*env)->ExceptionCheck(env)) { \ ++ return (y); \ ++ } \ ++ } while (0) ++#endif /* __cplusplus */ + /************************************************************************ + * Debugging utilities + */ +--- ./jdk/src/share/native/java/io/FileInputStream.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/io/FileInputStream.c Wed Jul 30 18:42:59 2014 +0100 +@@ -62,7 +62,7 @@ + } + + JNIEXPORT jint JNICALL +-Java_java_io_FileInputStream_read(JNIEnv *env, jobject this) { ++Java_java_io_FileInputStream_read0(JNIEnv *env, jobject this) { + return readSingle(env, this, fis_fd); + } + +--- ./jdk/src/share/native/java/io/RandomAccessFile.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/io/RandomAccessFile.c Wed Jul 30 18:42:59 2014 +0100 +@@ -64,7 +64,7 @@ + } + + JNIEXPORT jint JNICALL +-Java_java_io_RandomAccessFile_read(JNIEnv *env, jobject this) { ++Java_java_io_RandomAccessFile_read0(JNIEnv *env, jobject this) { + return readSingle(env, this, raf_fd); + } + +@@ -75,7 +75,7 @@ + } + + JNIEXPORT void JNICALL +-Java_java_io_RandomAccessFile_write(JNIEnv *env, jobject this, jint byte) { ++Java_java_io_RandomAccessFile_write0(JNIEnv *env, jobject this, jint byte) { + writeSingle(env, this, byte, JNI_FALSE, raf_fd); + } + +--- ./jdk/src/share/native/java/net/net_util.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/net/net_util.c Wed Jul 30 18:42:59 2014 +0100 +@@ -67,7 +67,7 @@ + supporting socket APIs are available + */ + IPv6_available = IPv6_supported() & (!preferIPv4Stack); +- initLocalAddrTable (); ++ platformInit(); + parseExclusiveBindProperty(env); + + return JNI_VERSION_1_2; +--- ./jdk/src/share/native/java/net/net_util.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/net/net_util.h Wed Jul 30 18:42:59 2014 +0100 +@@ -40,10 +40,7 @@ + #define IPv6 2 + + #define NET_ERROR(env, ex, msg) \ +-{ if (!(*env)->ExceptionOccurred(env)) JNU_ThrowByName(env, ex, msg) } +- +-#define CHECK_NULL(x) if ((x) == NULL) return; +-#define CHECK_NULL_RETURN(x, y) if ((x) == NULL) return y; ++{ if (!(*env)->ExceptionOccurred(env)) JNU_ThrowByName(env, ex, msg); } + + /************************************************************************ + * Cached field IDs +@@ -140,7 +137,7 @@ + JNIEXPORT jobject JNICALL + NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port); + +-void initLocalAddrTable (); ++void platformInit(); + void parseExclusiveBindProperty(JNIEnv *env); + + void +--- ./jdk/src/share/native/java/util/zip/zip_util.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zip_util.c Wed Jul 30 18:42:59 2014 +0100 +@@ -659,7 +659,10 @@ + entries = zip->entries = calloc(total, sizeof(entries[0])); + tablelen = zip->tablelen = ((total/2) | 1); // Odd -> fewer collisions + table = zip->table = malloc(tablelen * sizeof(table[0])); +- if (entries == NULL || table == NULL) goto Catch; ++ /* According to ISO C it is perfectly legal for malloc to return zero ++ * if called with a zero argument. We check this for 'entries' but not ++ * for 'table' because 'tablelen' can't be zero (see computation above). */ ++ if ((entries == NULL && total != 0) || table == NULL) goto Catch; + for (j = 0; j < tablelen; j++) + table[j] = ZIP_ENDCHAIN; + +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/ChangeLog Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/ChangeLog Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1208 +0,0 @@ +- +- ChangeLog file for zlib +- +-Changes in 1.2.5 (19 Apr 2010) +-- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] +-- Default to libdir as sharedlibdir in configure [Nieder] +-- Update copyright dates on modified source files +-- Update trees.c to be able to generate modified trees.h +-- Exit configure for MinGW, suggesting win32/Makefile.gcc +- +-Changes in 1.2.4.5 (18 Apr 2010) +-- Set sharedlibdir in configure [Torok] +-- Set LDFLAGS in Makefile.in [Bar-Lev] +-- Avoid mkdir objs race condition in Makefile.in [Bowler] +-- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays +-- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C +-- Don't use hidden attribute when it is a warning generator (e.g. Solaris) +- +-Changes in 1.2.4.4 (18 Apr 2010) +-- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] +-- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty +-- Try to use bash or ksh regardless of functionality of /bin/sh +-- Fix configure incompatibility with NetBSD sh +-- Remove attempt to run under bash or ksh since have better NetBSD fix +-- Fix win32/Makefile.gcc for MinGW [Bar-Lev] +-- Add diagnostic messages when using CROSS_PREFIX in configure +-- Added --sharedlibdir option to configure [Weigelt] +-- Use hidden visibility attribute when available [Frysinger] +- +-Changes in 1.2.4.3 (10 Apr 2010) +-- Only use CROSS_PREFIX in configure for ar and ranlib if they exist +-- Use CROSS_PREFIX for nm [Bar-Lev] +-- Assume _LARGEFILE64_SOURCE defined is equivalent to true +-- Avoid use of undefined symbols in #if with && and || +-- Make *64 prototypes in gzguts.h consistent with functions +-- Add -shared load option for MinGW in configure [Bowler] +-- Move z_off64_t to public interface, use instead of off64_t +-- Remove ! from shell test in configure (not portable to Solaris) +-- Change +0 macro tests to -0 for possibly increased portability +- +-Changes in 1.2.4.2 (9 Apr 2010) +-- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 +-- Really provide prototypes for *64 functions when building without LFS +-- Only define unlink() in minigzip.c if unistd.h not included +-- Update README to point to contrib/vstudio project files +-- Move projects/vc6 to old/ and remove projects/ +-- Include stdlib.h in minigzip.c for setmode() definition under WinCE +-- Clean up assembler builds in win32/Makefile.msc [Rowe] +-- Include sys/types.h for Microsoft for off_t definition +-- Fix memory leak on error in gz_open() +-- Symbolize nm as $NM in configure [Weigelt] +-- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] +-- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined +-- Fix bug in gzeof() to take into account unused input data +-- Avoid initialization of structures with variables in puff.c +-- Updated win32/README-WIN32.txt [Rowe] +- +-Changes in 1.2.4.1 (28 Mar 2010) +-- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] +-- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] +-- Restore "for debugging" comment on sprintf() in gzlib.c +-- Remove fdopen for MVS from gzguts.h +-- Put new README-WIN32.txt in win32 [Rowe] +-- Add check for shell to configure and invoke another shell if needed +-- Fix big fat stinking bug in gzseek() on uncompressed files +-- Remove vestigial F_OPEN64 define in zutil.h +-- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE +-- Avoid errors on non-LFS systems when applications define LFS macros +-- Set EXE to ".exe" in configure for MINGW [Kahle] +-- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] +-- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] +-- Add DLL install in win32/makefile.gcc [Bar-Lev] +-- Allow Linux* or linux* from uname in configure [Bar-Lev] +-- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] +-- Add cross-compilation prefixes to configure [Bar-Lev] +-- Match type exactly in gz_load() invocation in gzread.c +-- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func +-- Provide prototypes for *64 functions when building zlib without LFS +-- Don't use -lc when linking shared library on MinGW +-- Remove errno.h check in configure and vestigial errno code in zutil.h +- +-Changes in 1.2.4 (14 Mar 2010) +-- Fix VER3 extraction in configure for no fourth subversion +-- Update zlib.3, add docs to Makefile.in to make .pdf out of it +-- Add zlib.3.pdf to distribution +-- Don't set error code in gzerror() if passed pointer is NULL +-- Apply destination directory fixes to CMakeLists.txt [Lowman] +-- Move #cmakedefine's to a new zconf.in.cmakein +-- Restore zconf.h for builds that don't use configure or cmake +-- Add distclean to dummy Makefile for convenience +-- Update and improve INDEX, README, and FAQ +-- Update CMakeLists.txt for the return of zconf.h [Lowman] +-- Update contrib/vstudio/vc9 and vc10 [Vollant] +-- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc +-- Apply license and readme changes to contrib/asm686 [Raiter] +-- Check file name lengths and add -c option in minigzip.c [Li] +-- Update contrib/amd64 and contrib/masmx86/ [Vollant] +-- Avoid use of "eof" parameter in trees.c to not shadow library variable +-- Update make_vms.com for removal of zlibdefs.h [Zinser] +-- Update assembler code and vstudio projects in contrib [Vollant] +-- Remove outdated assembler code contrib/masm686 and contrib/asm586 +-- Remove old vc7 and vc8 from contrib/vstudio +-- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] +-- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() +-- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] +-- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) +-- Fix bug in void-returning vsprintf() case in gzwrite.c +-- Fix name change from inflate.h in contrib/inflate86/inffas86.c +-- Check if temporary file exists before removing in make_vms.com [Zinser] +-- Fix make install and uninstall for --static option +-- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] +-- Update readme.txt in contrib/masmx64 and masmx86 to assemble +- +-Changes in 1.2.3.9 (21 Feb 2010) +-- Expunge gzio.c +-- Move as400 build information to old +-- Fix updates in contrib/minizip and contrib/vstudio +-- Add const to vsnprintf test in configure to avoid warnings [Weigelt] +-- Delete zconf.h (made by configure) [Weigelt] +-- Change zconf.in.h to zconf.h.in per convention [Weigelt] +-- Check for NULL buf in gzgets() +-- Return empty string for gzgets() with len == 1 (like fgets()) +-- Fix description of gzgets() in zlib.h for end-of-file, NULL return +-- Update minizip to 1.1 [Vollant] +-- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c +-- Note in zlib.h that gzerror() should be used to distinguish from EOF +-- Remove use of snprintf() from gzlib.c +-- Fix bug in gzseek() +-- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] +-- Fix zconf.h generation in CMakeLists.txt [Lowman] +-- Improve comments in zconf.h where modified by configure +- +-Changes in 1.2.3.8 (13 Feb 2010) +-- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] +-- Use z_off64_t in gz_zero() and gz_skip() to match state->skip +-- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) +-- Revert to Makefile.in from 1.2.3.6 (live with the clutter) +-- Fix missing error return in gzflush(), add zlib.h note +-- Add *64 functions to zlib.map [Levin] +-- Fix signed/unsigned comparison in gz_comp() +-- Use SFLAGS when testing shared linking in configure +-- Add --64 option to ./configure to use -m64 with gcc +-- Fix ./configure --help to correctly name options +-- Have make fail if a test fails [Levin] +-- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] +-- Remove assembler object files from contrib +- +-Changes in 1.2.3.7 (24 Jan 2010) +-- Always gzopen() with O_LARGEFILE if available +-- Fix gzdirect() to work immediately after gzopen() or gzdopen() +-- Make gzdirect() more precise when the state changes while reading +-- Improve zlib.h documentation in many places +-- Catch memory allocation failure in gz_open() +-- Complete close operation if seek forward in gzclose_w() fails +-- Return Z_ERRNO from gzclose_r() if close() fails +-- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL +-- Return zero for gzwrite() errors to match zlib.h description +-- Return -1 on gzputs() error to match zlib.h description +-- Add zconf.in.h to allow recovery from configure modification [Weigelt] +-- Fix static library permissions in Makefile.in [Weigelt] +-- Avoid warnings in configure tests that hide functionality [Weigelt] +-- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] +-- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] +-- Avoid access of uninitialized data for first inflateReset2 call [Gomes] +-- Keep object files in subdirectories to reduce the clutter somewhat +-- Remove default Makefile and zlibdefs.h, add dummy Makefile +-- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ +-- Remove zlibdefs.h completely -- modify zconf.h instead +- +-Changes in 1.2.3.6 (17 Jan 2010) +-- Avoid void * arithmetic in gzread.c and gzwrite.c +-- Make compilers happier with const char * for gz_error message +-- Avoid unused parameter warning in inflate.c +-- Avoid signed-unsigned comparison warning in inflate.c +-- Indent #pragma's for traditional C +-- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() +-- Correct email address in configure for system options +-- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] +-- Update zlib.map [Brown] +-- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] +-- Apply various fixes to CMakeLists.txt [Lowman] +-- Add checks on len in gzread() and gzwrite() +-- Add error message for no more room for gzungetc() +-- Remove zlib version check in gzwrite() +-- Defer compression of gzprintf() result until need to +-- Use snprintf() in gzdopen() if available +-- Remove USE_MMAP configuration determination (only used by minigzip) +-- Remove examples/pigz.c (available separately) +-- Update examples/gun.c to 1.6 +- +-Changes in 1.2.3.5 (8 Jan 2010) +-- Add space after #if in zutil.h for some compilers +-- Fix relatively harmless bug in deflate_fast() [Exarevsky] +-- Fix same problem in deflate_slow() +-- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] +-- Add deflate_rle() for faster Z_RLE strategy run-length encoding +-- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding +-- Change name of "write" variable in inffast.c to avoid library collisions +-- Fix premature EOF from gzread() in gzio.c [Brown] +-- Use zlib header window size if windowBits is 0 in inflateInit2() +-- Remove compressBound() call in deflate.c to avoid linking compress.o +-- Replace use of errno in gz* with functions, support WinCE [Alves] +-- Provide alternative to perror() in minigzip.c for WinCE [Alves] +-- Don't use _vsnprintf on later versions of MSVC [Lowman] +-- Add CMake build script and input file [Lowman] +-- Update contrib/minizip to 1.1 [Svensson, Vollant] +-- Moved nintendods directory from contrib to . +-- Replace gzio.c with a new set of routines with the same functionality +-- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above +-- Update contrib/minizip to 1.1b +-- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h +- +-Changes in 1.2.3.4 (21 Dec 2009) +-- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility +-- Update comments in configure and Makefile.in for default --shared +-- Fix test -z's in configure [Marquess] +-- Build examplesh and minigzipsh when not testing +-- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h +-- Import LDFLAGS from the environment in configure +-- Fix configure to populate SFLAGS with discovered CFLAGS options +-- Adapt make_vms.com to the new Makefile.in [Zinser] +-- Add zlib2ansi script for C++ compilation [Marquess] +-- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) +-- Add AMD64 assembler code for longest match to contrib [Teterin] +-- Include options from $SFLAGS when doing $LDSHARED +-- Simplify 64-bit file support by introducing z_off64_t type +-- Make shared object files in objs directory to work around old Sun cc +-- Use only three-part version number for Darwin shared compiles +-- Add rc option to ar in Makefile.in for when ./configure not run +-- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* +-- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile +-- Protect against _FILE_OFFSET_BITS being defined when compiling zlib +-- Rename Makefile.in targets allstatic to static and allshared to shared +-- Fix static and shared Makefile.in targets to be independent +-- Correct error return bug in gz_open() by setting state [Brown] +-- Put spaces before ;;'s in configure for better sh compatibility +-- Add pigz.c (parallel implementation of gzip) to examples/ +-- Correct constant in crc32.c to UL [Leventhal] +-- Reject negative lengths in crc32_combine() +-- Add inflateReset2() function to work like inflateEnd()/inflateInit2() +-- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] +-- Correct typo in doc/algorithm.txt [Janik] +-- Fix bug in adler32_combine() [Zhu] +-- Catch missing-end-of-block-code error in all inflates and in puff +- Assures that random input to inflate eventually results in an error +-- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ +-- Update ENOUGH and its usage to reflect discovered bounds +-- Fix gzerror() error report on empty input file [Brown] +-- Add ush casts in trees.c to avoid pedantic runtime errors +-- Fix typo in zlib.h uncompress() description [Reiss] +-- Correct inflate() comments with regard to automatic header detection +-- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) +-- Put new version of gzlog (2.0) in examples with interruption recovery +-- Add puff compile option to permit invalid distance-too-far streams +-- Add puff TEST command options, ability to read piped input +-- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but +- _LARGEFILE64_SOURCE not defined +-- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart +-- Fix deflateSetDictionary() to use all 32K for output consistency +-- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) +-- Clear bytes after deflate lookahead to avoid use of uninitialized data +-- Change a limit in inftrees.c to be more transparent to Coverity Prevent +-- Update win32/zlib.def with exported symbols from zlib.h +-- Correct spelling error in zlib.h [Willem] +-- Allow Z_BLOCK for deflate() to force a new block +-- Allow negative bits in inflatePrime() to delete existing bit buffer +-- Add Z_TREES flush option to inflate() to return at end of trees +-- Add inflateMark() to return current state information for random access +-- Add Makefile for NintendoDS to contrib [Costa] +-- Add -w in configure compile tests to avoid spurious warnings [Beucler] +-- Fix typos in zlib.h comments for deflateSetDictionary() +-- Fix EOF detection in transparent gzread() [Maier] +- +-Changes in 1.2.3.3 (2 October 2006) +-- Make --shared the default for configure, add a --static option +-- Add compile option to permit invalid distance-too-far streams +-- Add inflateUndermine() function which is required to enable above +-- Remove use of "this" variable name for C++ compatibility [Marquess] +-- Add testing of shared library in make test, if shared library built +-- Use ftello() and fseeko() if available instead of ftell() and fseek() +-- Provide two versions of all functions that use the z_off_t type for +- binary compatibility -- a normal version and a 64-bit offset version, +- per the Large File Support Extension when _LARGEFILE64_SOURCE is +- defined; use the 64-bit versions by default when _FILE_OFFSET_BITS +- is defined to be 64 +-- Add a --uname= option to configure to perhaps help with cross-compiling +- +-Changes in 1.2.3.2 (3 September 2006) +-- Turn off silly Borland warnings [Hay] +-- Use off64_t and define _LARGEFILE64_SOURCE when present +-- Fix missing dependency on inffixed.h in Makefile.in +-- Rig configure --shared to build both shared and static [Teredesai, Truta] +-- Remove zconf.in.h and instead create a new zlibdefs.h file +-- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] +-- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] +- +-Changes in 1.2.3.1 (16 August 2006) +-- Add watcom directory with OpenWatcom make files [Daniel] +-- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] +-- Update make_vms.com [Zinser] +-- Use -fPIC for shared build in configure [Teredesai, Nicholson] +-- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] +-- Use fdopen() (not _fdopen()) for Interix in zutil.h [BŠck] +-- Add some FAQ entries about the contrib directory +-- Update the MVS question in the FAQ +-- Avoid extraneous reads after EOF in gzio.c [Brown] +-- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] +-- Add comments to zlib.h about gzerror() usage [Brown] +-- Set extra flags in gzip header in gzopen() like deflate() does +-- Make configure options more compatible with double-dash conventions +- [Weigelt] +-- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] +-- Fix uninstall target in Makefile.in [Truta] +-- Add pkgconfig support [Weigelt] +-- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] +-- Replace set_data_type() with a more accurate detect_data_type() in +- trees.c, according to the txtvsbin.txt document [Truta] +-- Swap the order of #include <stdio.h> and #include "zlib.h" in +- gzio.c, example.c and minigzip.c [Truta] +-- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, +- Truta] (where?) +-- Fix target "clean" from win32/Makefile.bor [Truta] +-- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] +-- Update zlib www home address in win32/DLL_FAQ.txt [Truta] +-- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] +-- Enable browse info in the "Debug" and "ASM Debug" configurations in +- the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] +-- Add pkgconfig support [Weigelt] +-- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, +- for use in win32/zlib1.rc [Polushin, Rowe, Truta] +-- Add a document that explains the new text detection scheme to +- doc/txtvsbin.txt [Truta] +-- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] +-- Move algorithm.txt into doc/ [Truta] +-- Synchronize FAQ with website +-- Fix compressBound(), was low for some pathological cases [Fearnley] +-- Take into account wrapper variations in deflateBound() +-- Set examples/zpipe.c input and output to binary mode for Windows +-- Update examples/zlib_how.html with new zpipe.c (also web site) +-- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems +- that gcc became pickier in 4.0) +-- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain +- un-versioned, the patch adds versioning only for symbols introduced in +- zlib-1.2.0 or later. It also declares as local those symbols which are +- not designed to be exported." [Levin] +-- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure +-- Do not initialize global static by default in trees.c, add a response +- NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] +-- Don't use strerror() in gzio.c under WinCE [Yakimov] +-- Don't use errno.h in zutil.h under WinCE [Yakimov] +-- Move arguments for AR to its usage to allow replacing ar [Marot] +-- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] +-- Improve inflateInit() and inflateInit2() documentation +-- Fix structure size comment in inflate.h +-- Change configure help option from --h* to --help [Santos] +- +-Changes in 1.2.3 (18 July 2005) +-- Apply security vulnerability fixes to contrib/infback9 as well +-- Clean up some text files (carriage returns, trailing space) +-- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] +- +-Changes in 1.2.2.4 (11 July 2005) +-- Add inflatePrime() function for starting inflation at bit boundary +-- Avoid some Visual C warnings in deflate.c +-- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit +- compile +-- Fix some spelling errors in comments [Betts] +-- Correct inflateInit2() error return documentation in zlib.h +-- Add zran.c example of compressed data random access to examples +- directory, shows use of inflatePrime() +-- Fix cast for assignments to strm->state in inflate.c and infback.c +-- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] +-- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] +-- Add cast in trees.c t avoid a warning [Oberhumer] +-- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] +-- Update make_vms.com [Zinser] +-- Initialize state->write in inflateReset() since copied in inflate_fast() +-- Be more strict on incomplete code sets in inflate_table() and increase +- ENOUGH and MAXD -- this repairs a possible security vulnerability for +- invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for +- discovering the vulnerability and providing test cases. +-- Add ia64 support to configure for HP-UX [Smith] +-- Add error return to gzread() for format or i/o error [Levin] +-- Use malloc.h for OS/2 [Necasek] +- +-Changes in 1.2.2.3 (27 May 2005) +-- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile +-- Typecast fread() return values in gzio.c [Vollant] +-- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) +-- Fix crc check bug in gzread() after gzungetc() [Heiner] +-- Add the deflateTune() function to adjust internal compression parameters +-- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) +-- Remove an incorrect assertion in examples/zpipe.c +-- Add C++ wrapper in infback9.h [Donais] +-- Fix bug in inflateCopy() when decoding fixed codes +-- Note in zlib.h how much deflateSetDictionary() actually uses +-- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) +-- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] +-- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] +-- Add gzdirect() function to indicate transparent reads +-- Update contrib/minizip [Vollant] +-- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] +-- Add casts in crc32.c to avoid warnings [Oberhumer] +-- Add contrib/masmx64 [Vollant] +-- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] +- +-Changes in 1.2.2.2 (30 December 2004) +-- Replace structure assignments in deflate.c and inflate.c with zmemcpy to +- avoid implicit memcpy calls (portability for no-library compilation) +-- Increase sprintf() buffer size in gzdopen() to allow for large numbers +-- Add INFLATE_STRICT to check distances against zlib header +-- Improve WinCE errno handling and comments [Chang] +-- Remove comment about no gzip header processing in FAQ +-- Add Z_FIXED strategy option to deflateInit2() to force fixed trees +-- Add updated make_vms.com [Coghlan], update README +-- Create a new "examples" directory, move gzappend.c there, add zpipe.c, +- fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. +-- Add FAQ entry and comments in deflate.c on uninitialized memory access +-- Add Solaris 9 make options in configure [Gilbert] +-- Allow strerror() usage in gzio.c for STDC +-- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] +-- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] +-- Use z_off_t for adler32_combine() and crc32_combine() lengths +-- Make adler32() much faster for small len +-- Use OS_CODE in deflate() default gzip header +- +-Changes in 1.2.2.1 (31 October 2004) +-- Allow inflateSetDictionary() call for raw inflate +-- Fix inflate header crc check bug for file names and comments +-- Add deflateSetHeader() and gz_header structure for custom gzip headers +-- Add inflateGetheader() to retrieve gzip headers +-- Add crc32_combine() and adler32_combine() functions +-- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list +-- Use zstreamp consistently in zlib.h (inflate_back functions) +-- Remove GUNZIP condition from definition of inflate_mode in inflate.h +- and in contrib/inflate86/inffast.S [Truta, Anderson] +-- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] +-- Update projects/README.projects and projects/visualc6 [Truta] +-- Update win32/DLL_FAQ.txt [Truta] +-- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] +-- Deprecate Z_ASCII; use Z_TEXT instead [Truta] +-- Use a new algorithm for setting strm->data_type in trees.c [Truta] +-- Do not define an exit() prototype in zutil.c unless DEBUG defined +-- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] +-- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() +-- Fix Darwin build version identification [Peterson] +- +-Changes in 1.2.2 (3 October 2004) +-- Update zlib.h comments on gzip in-memory processing +-- Set adler to 1 in inflateReset() to support Java test suite [Walles] +-- Add contrib/dotzlib [Ravn] +-- Update win32/DLL_FAQ.txt [Truta] +-- Update contrib/minizip [Vollant] +-- Move contrib/visual-basic.txt to old/ [Truta] +-- Fix assembler builds in projects/visualc6/ [Truta] +- +-Changes in 1.2.1.2 (9 September 2004) +-- Update INDEX file +-- Fix trees.c to update strm->data_type (no one ever noticed!) +-- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] +-- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) +-- Add limited multitasking protection to DYNAMIC_CRC_TABLE +-- Add NO_vsnprintf for VMS in zutil.h [Mozilla] +-- Don't declare strerror() under VMS [Mozilla] +-- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize +-- Update contrib/ada [Anisimkov] +-- Update contrib/minizip [Vollant] +-- Fix configure to not hardcode directories for Darwin [Peterson] +-- Fix gzio.c to not return error on empty files [Brown] +-- Fix indentation; update version in contrib/delphi/ZLib.pas and +- contrib/pascal/zlibpas.pas [Truta] +-- Update mkasm.bat in contrib/masmx86 [Truta] +-- Update contrib/untgz [Truta] +-- Add projects/README.projects [Truta] +-- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] +-- Update win32/DLL_FAQ.txt [Truta] +-- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] +-- Remove an unnecessary assignment to curr in inftrees.c [Truta] +-- Add OS/2 to exe builds in configure [Poltorak] +-- Remove err dummy parameter in zlib.h [Kientzle] +- +-Changes in 1.2.1.1 (9 January 2004) +-- Update email address in README +-- Several FAQ updates +-- Fix a big fat bug in inftrees.c that prevented decoding valid +- dynamic blocks with only literals and no distance codes -- +- Thanks to "Hot Emu" for the bug report and sample file +-- Add a note to puff.c on no distance codes case. +- +-Changes in 1.2.1 (17 November 2003) +-- Remove a tab in contrib/gzappend/gzappend.c +-- Update some interfaces in contrib for new zlib functions +-- Update zlib version number in some contrib entries +-- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] +-- Support shared libraries on Hurd and KFreeBSD [Brown] +-- Fix error in NO_DIVIDE option of adler32.c +- +-Changes in 1.2.0.8 (4 November 2003) +-- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas +-- Add experimental NO_DIVIDE #define in adler32.c +- - Possibly faster on some processors (let me know if it is) +-- Correct Z_BLOCK to not return on first inflate call if no wrap +-- Fix strm->data_type on inflate() return to correctly indicate EOB +-- Add deflatePrime() function for appending in the middle of a byte +-- Add contrib/gzappend for an example of appending to a stream +-- Update win32/DLL_FAQ.txt [Truta] +-- Delete Turbo C comment in README [Truta] +-- Improve some indentation in zconf.h [Truta] +-- Fix infinite loop on bad input in configure script [Church] +-- Fix gzeof() for concatenated gzip files [Johnson] +-- Add example to contrib/visual-basic.txt [Michael B.] +-- Add -p to mkdir's in Makefile.in [vda] +-- Fix configure to properly detect presence or lack of printf functions +-- Add AS400 support [Monnerat] +-- Add a little Cygwin support [Wilson] +- +-Changes in 1.2.0.7 (21 September 2003) +-- Correct some debug formats in contrib/infback9 +-- Cast a type in a debug statement in trees.c +-- Change search and replace delimiter in configure from % to # [Beebe] +-- Update contrib/untgz to 0.2 with various fixes [Truta] +-- Add build support for Amiga [Nikl] +-- Remove some directories in old that have been updated to 1.2 +-- Add dylib building for Mac OS X in configure and Makefile.in +-- Remove old distribution stuff from Makefile +-- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X +-- Update links in README +- +-Changes in 1.2.0.6 (13 September 2003) +-- Minor FAQ updates +-- Update contrib/minizip to 1.00 [Vollant] +-- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] +-- Update POSTINC comment for 68060 [Nikl] +-- Add contrib/infback9 with deflate64 decoding (unsupported) +-- For MVS define NO_vsnprintf and undefine FAR [van Burik] +-- Add pragma for fdopen on MVS [van Burik] +- +-Changes in 1.2.0.5 (8 September 2003) +-- Add OF to inflateBackEnd() declaration in zlib.h +-- Remember start when using gzdopen in the middle of a file +-- Use internal off_t counters in gz* functions to properly handle seeks +-- Perform more rigorous check for distance-too-far in inffast.c +-- Add Z_BLOCK flush option to return from inflate at block boundary +-- Set strm->data_type on return from inflate +- - Indicate bits unused, if at block boundary, and if in last block +-- Replace size_t with ptrdiff_t in crc32.c, and check for correct size +-- Add condition so old NO_DEFLATE define still works for compatibility +-- FAQ update regarding the Windows DLL [Truta] +-- INDEX update: add qnx entry, remove aix entry [Truta] +-- Install zlib.3 into mandir [Wilson] +-- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] +-- Adapt the zlib interface to the new DLL convention guidelines [Truta] +-- Introduce ZLIB_WINAPI macro to allow the export of functions using +- the WINAPI calling convention, for Visual Basic [Vollant, Truta] +-- Update msdos and win32 scripts and makefiles [Truta] +-- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] +-- Add contrib/ada [Anisimkov] +-- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] +-- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] +-- Add contrib/masm686 [Truta] +-- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm +- [Truta, Vollant] +-- Update contrib/delphi; rename to contrib/pascal; add example [Truta] +-- Remove contrib/delphi2; add a new contrib/delphi [Truta] +-- Avoid inclusion of the nonstandard <memory.h> in contrib/iostream, +- and fix some method prototypes [Truta] +-- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip +- [Truta] +-- Avoid the use of backslash (\) in contrib/minizip [Vollant] +-- Fix file time handling in contrib/untgz; update makefiles [Truta] +-- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines +- [Vollant] +-- Remove contrib/vstudio/vc15_16 [Vollant] +-- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] +-- Update README.contrib [Truta] +-- Invert the assignment order of match_head and s->prev[...] in +- INSERT_STRING [Truta] +-- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings +- [Truta] +-- Compare function pointers with 0, not with NULL or Z_NULL [Truta] +-- Fix prototype of syncsearch in inflate.c [Truta] +-- Introduce ASMINF macro to be enabled when using an ASM implementation +- of inflate_fast [Truta] +-- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] +-- Modify test_gzio in example.c to take a single file name as a +- parameter [Truta] +-- Exit the example.c program if gzopen fails [Truta] +-- Add type casts around strlen in example.c [Truta] +-- Remove casting to sizeof in minigzip.c; give a proper type +- to the variable compared with SUFFIX_LEN [Truta] +-- Update definitions of STDC and STDC99 in zconf.h [Truta] +-- Synchronize zconf.h with the new Windows DLL interface [Truta] +-- Use SYS16BIT instead of __32BIT__ to distinguish between +- 16- and 32-bit platforms [Truta] +-- Use far memory allocators in small 16-bit memory models for +- Turbo C [Truta] +-- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in +- zlibCompileFlags [Truta] +-- Cygwin has vsnprintf [Wilson] +-- In Windows16, OS_CODE is 0, as in MSDOS [Truta] +-- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] +- +-Changes in 1.2.0.4 (10 August 2003) +-- Minor FAQ updates +-- Be more strict when checking inflateInit2's windowBits parameter +-- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well +-- Add gzip wrapper option to deflateInit2 using windowBits +-- Add updated QNX rule in configure and qnx directory [Bonnefoy] +-- Make inflate distance-too-far checks more rigorous +-- Clean up FAR usage in inflate +-- Add casting to sizeof() in gzio.c and minigzip.c +- +-Changes in 1.2.0.3 (19 July 2003) +-- Fix silly error in gzungetc() implementation [Vollant] +-- Update contrib/minizip and contrib/vstudio [Vollant] +-- Fix printf format in example.c +-- Correct cdecl support in zconf.in.h [Anisimkov] +-- Minor FAQ updates +- +-Changes in 1.2.0.2 (13 July 2003) +-- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons +-- Attempt to avoid warnings in crc32.c for pointer-int conversion +-- Add AIX to configure, remove aix directory [Bakker] +-- Add some casts to minigzip.c +-- Improve checking after insecure sprintf() or vsprintf() calls +-- Remove #elif's from crc32.c +-- Change leave label to inf_leave in inflate.c and infback.c to avoid +- library conflicts +-- Remove inflate gzip decoding by default--only enable gzip decoding by +- special request for stricter backward compatibility +-- Add zlibCompileFlags() function to return compilation information +-- More typecasting in deflate.c to avoid warnings +-- Remove leading underscore from _Capital #defines [Truta] +-- Fix configure to link shared library when testing +-- Add some Windows CE target adjustments [Mai] +-- Remove #define ZLIB_DLL in zconf.h [Vollant] +-- Add zlib.3 [Rodgers] +-- Update RFC URL in deflate.c and algorithm.txt [Mai] +-- Add zlib_dll_FAQ.txt to contrib [Truta] +-- Add UL to some constants [Truta] +-- Update minizip and vstudio [Vollant] +-- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h +-- Expand use of NO_DUMMY_DECL to avoid all dummy structures +-- Added iostream3 to contrib [Schwardt] +-- Replace rewind() with fseek() for WinCE [Truta] +-- Improve setting of zlib format compression level flags +- - Report 0 for huffman and rle strategies and for level == 0 or 1 +- - Report 2 only for level == 6 +-- Only deal with 64K limit when necessary at compile time [Truta] +-- Allow TOO_FAR check to be turned off at compile time [Truta] +-- Add gzclearerr() function [Souza] +-- Add gzungetc() function +- +-Changes in 1.2.0.1 (17 March 2003) +-- Add Z_RLE strategy for run-length encoding [Truta] +- - When Z_RLE requested, restrict matches to distance one +- - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE +-- Correct FASTEST compilation to allow level == 0 +-- Clean up what gets compiled for FASTEST +-- Incorporate changes to zconf.in.h [Vollant] +- - Refine detection of Turbo C need for dummy returns +- - Refine ZLIB_DLL compilation +- - Include additional header file on VMS for off_t typedef +-- Try to use _vsnprintf where it supplants vsprintf [Vollant] +-- Add some casts in inffast.c +-- Enchance comments in zlib.h on what happens if gzprintf() tries to +- write more than 4095 bytes before compression +-- Remove unused state from inflateBackEnd() +-- Remove exit(0) from minigzip.c, example.c +-- Get rid of all those darn tabs +-- Add "check" target to Makefile.in that does the same thing as "test" +-- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in +-- Update contrib/inflate86 [Anderson] +-- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] +-- Add msdos and win32 directories with makefiles [Truta] +-- More additions and improvements to the FAQ +- +-Changes in 1.2.0 (9 March 2003) +-- New and improved inflate code +- - About 20% faster +- - Does not allocate 32K window unless and until needed +- - Automatically detects and decompresses gzip streams +- - Raw inflate no longer needs an extra dummy byte at end +- - Added inflateBack functions using a callback interface--even faster +- than inflate, useful for file utilities (gzip, zip) +- - Added inflateCopy() function to record state for random access on +- externally generated deflate streams (e.g. in gzip files) +- - More readable code (I hope) +-- New and improved crc32() +- - About 50% faster, thanks to suggestions from Rodney Brown +-- Add deflateBound() and compressBound() functions +-- Fix memory leak in deflateInit2() +-- Permit setting dictionary for raw deflate (for parallel deflate) +-- Fix const declaration for gzwrite() +-- Check for some malloc() failures in gzio.c +-- Fix bug in gzopen() on single-byte file 0x1f +-- Fix bug in gzread() on concatenated file with 0x1f at end of buffer +- and next buffer doesn't start with 0x8b +-- Fix uncompress() to return Z_DATA_ERROR on truncated input +-- Free memory at end of example.c +-- Remove MAX #define in trees.c (conflicted with some libraries) +-- Fix static const's in deflate.c, gzio.c, and zutil.[ch] +-- Declare malloc() and free() in gzio.c if STDC not defined +-- Use malloc() instead of calloc() in zutil.c if int big enough +-- Define STDC for AIX +-- Add aix/ with approach for compiling shared library on AIX +-- Add HP-UX support for shared libraries in configure +-- Add OpenUNIX support for shared libraries in configure +-- Use $cc instead of gcc to build shared library +-- Make prefix directory if needed when installing +-- Correct Macintosh avoidance of typedef Byte in zconf.h +-- Correct Turbo C memory allocation when under Linux +-- Use libz.a instead of -lz in Makefile (assure use of compiled library) +-- Update configure to check for snprintf or vsnprintf functions and their +- return value, warn during make if using an insecure function +-- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that +- is lost when library is used--resolution is to build new zconf.h +-- Documentation improvements (in zlib.h): +- - Document raw deflate and inflate +- - Update RFCs URL +- - Point out that zlib and gzip formats are different +- - Note that Z_BUF_ERROR is not fatal +- - Document string limit for gzprintf() and possible buffer overflow +- - Note requirement on avail_out when flushing +- - Note permitted values of flush parameter of inflate() +-- Add some FAQs (and even answers) to the FAQ +-- Add contrib/inflate86/ for x86 faster inflate +-- Add contrib/blast/ for PKWare Data Compression Library decompression +-- Add contrib/puff/ simple inflate for deflate format description +- +-Changes in 1.1.4 (11 March 2002) +-- ZFREE was repeated on same allocation on some error conditions. +- This creates a security problem described in +- http://www.zlib.org/advisory-2002-03-11.txt +-- Returned incorrect error (Z_MEM_ERROR) on some invalid data +-- Avoid accesses before window for invalid distances with inflate window +- less than 32K. +-- force windowBits > 8 to avoid a bug in the encoder for a window size +- of 256 bytes. (A complete fix will be available in 1.1.5). +- +-Changes in 1.1.3 (9 July 1998) +-- fix "an inflate input buffer bug that shows up on rare but persistent +- occasions" (Mark) +-- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) +-- fix gzseek(..., SEEK_SET) in write mode +-- fix crc check after a gzeek (Frank Faubert) +-- fix miniunzip when the last entry in a zip file is itself a zip file +- (J Lillge) +-- add contrib/asm586 and contrib/asm686 (Brian Raiter) +- See http://www.muppetlabs.com/~breadbox/software/assembly.html +-- add support for Delphi 3 in contrib/delphi (Bob Dellaca) +-- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) +-- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) +-- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) +-- added a FAQ file +- +-- Support gzdopen on Mac with Metrowerks (Jason Linhart) +-- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) +-- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) +-- avoid some warnings with Borland C (Tom Tanner) +-- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) +-- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) +-- allow several arguments to configure (Tim Mooney, Frodo Looijaard) +-- use libdir and includedir in Makefile.in (Tim Mooney) +-- support shared libraries on OSF1 V4 (Tim Mooney) +-- remove so_locations in "make clean" (Tim Mooney) +-- fix maketree.c compilation error (Glenn, Mark) +-- Python interface to zlib now in Python 1.5 (Jeremy Hylton) +-- new Makefile.riscos (Rich Walker) +-- initialize static descriptors in trees.c for embedded targets (Nick Smith) +-- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) +-- add the OS/2 files in Makefile.in too (Andrew Zabolotny) +-- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) +-- fix maketree.c to allow clean compilation of inffixed.h (Mark) +-- fix parameter check in deflateCopy (Gunther Nikl) +-- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) +-- Many portability patches by Christian Spieler: +- . zutil.c, zutil.h: added "const" for zmem* +- . Make_vms.com: fixed some typos +- . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists +- . msdos/Makefile.msc: remove "default rtl link library" info from obj files +- . msdos/Makefile.*: use model-dependent name for the built zlib library +- . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: +- new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) +-- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) +-- replace __far with _far for better portability (Christian Spieler, Tom Lane) +-- fix test for errno.h in configure (Tim Newsham) +- +-Changes in 1.1.2 (19 March 98) +-- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) +- See http://www.winimage.com/zLibDll/unzip.html +-- preinitialize the inflate tables for fixed codes, to make the code +- completely thread safe (Mark) +-- some simplifications and slight speed-up to the inflate code (Mark) +-- fix gzeof on non-compressed files (Allan Schrum) +-- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) +-- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) +-- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) +-- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) +-- do not wrap extern "C" around system includes (Tom Lane) +-- mention zlib binding for TCL in README (Andreas Kupries) +-- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) +-- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) +-- allow "configure --prefix $HOME" (Tim Mooney) +-- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) +-- move Makefile.sas to amiga/Makefile.sas +- +-Changes in 1.1.1 (27 Feb 98) +-- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) +-- remove block truncation heuristic which had very marginal effect for zlib +- (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the +- compression ratio on some files. This also allows inlining _tr_tally for +- matches in deflate_slow. +-- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) +- +-Changes in 1.1.0 (24 Feb 98) +-- do not return STREAM_END prematurely in inflate (John Bowler) +-- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) +-- compile with -DFASTEST to get compression code optimized for speed only +-- in minigzip, try mmap'ing the input file first (Miguel Albrecht) +-- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain +- on Sun but significant on HP) +- +-- add a pointer to experimental unzip library in README (Gilles Vollant) +-- initialize variable gcc in configure (Chris Herborth) +- +-Changes in 1.0.9 (17 Feb 1998) +-- added gzputs and gzgets functions +-- do not clear eof flag in gzseek (Mark Diekhans) +-- fix gzseek for files in transparent mode (Mark Diekhans) +-- do not assume that vsprintf returns the number of bytes written (Jens Krinke) +-- replace EXPORT with ZEXPORT to avoid conflict with other programs +-- added compress2 in zconf.h, zlib.def, zlib.dnt +-- new asm code from Gilles Vollant in contrib/asm386 +-- simplify the inflate code (Mark): +- . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() +- . ZALLOC the length list in inflate_trees_fixed() instead of using stack +- . ZALLOC the value area for huft_build() instead of using stack +- . Simplify Z_FINISH check in inflate() +- +-- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 +-- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) +-- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with +- the declaration of FAR (Gilles VOllant) +-- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) +-- read_buf buf parameter of type Bytef* instead of charf* +-- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) +-- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) +-- fix check for presence of directories in "make install" (Ian Willis) +- +-Changes in 1.0.8 (27 Jan 1998) +-- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) +-- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) +-- added compress2() to allow setting the compression level +-- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) +-- use constant arrays for the static trees in trees.c instead of computing +- them at run time (thanks to Ken Raeburn for this suggestion). To create +- trees.h, compile with GEN_TREES_H and run "make test". +-- check return code of example in "make test" and display result +-- pass minigzip command line options to file_compress +-- simplifying code of inflateSync to avoid gcc 2.8 bug +- +-- support CC="gcc -Wall" in configure -s (QingLong) +-- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) +-- fix test for shared library support to avoid compiler warnings +-- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) +-- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) +-- do not use fdopen for Metrowerks on Mac (Brad Pettit)) +-- add checks for gzputc and gzputc in example.c +-- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) +-- use const for the CRC table (Ken Raeburn) +-- fixed "make uninstall" for shared libraries +-- use Tracev instead of Trace in infblock.c +-- in example.c use correct compressed length for test_sync +-- suppress +vnocompatwarnings in configure for HPUX (not always supported) +- +-Changes in 1.0.7 (20 Jan 1998) +-- fix gzseek which was broken in write mode +-- return error for gzseek to negative absolute position +-- fix configure for Linux (Chun-Chung Chen) +-- increase stack space for MSC (Tim Wegner) +-- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) +-- define EXPORTVA for gzprintf (Gilles Vollant) +-- added man page zlib.3 (Rick Rodgers) +-- for contrib/untgz, fix makedir() and improve Makefile +- +-- check gzseek in write mode in example.c +-- allocate extra buffer for seeks only if gzseek is actually called +-- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) +-- add inflateSyncPoint in zconf.h +-- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def +- +-Changes in 1.0.6 (19 Jan 1998) +-- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and +- gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) +-- Fix a deflate bug occurring only with compression level 0 (thanks to +- Andy Buckler for finding this one). +-- In minigzip, pass transparently also the first byte for .Z files. +-- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() +-- check Z_FINISH in inflate (thanks to Marc Schluper) +-- Implement deflateCopy (thanks to Adam Costello) +-- make static libraries by default in configure, add --shared option. +-- move MSDOS or Windows specific files to directory msdos +-- suppress the notion of partial flush to simplify the interface +- (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) +-- suppress history buffer provided by application to simplify the interface +- (this feature was not implemented anyway in 1.0.4) +-- next_in and avail_in must be initialized before calling inflateInit or +- inflateInit2 +-- add EXPORT in all exported functions (for Windows DLL) +-- added Makefile.nt (thanks to Stephen Williams) +-- added the unsupported "contrib" directory: +- contrib/asm386/ by Gilles Vollant <info@winimage.com> +- 386 asm code replacing longest_match(). +- contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu> +- A C++ I/O streams interface to the zlib gz* functions +- contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no> +- Another C++ I/O streams interface +- contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es> +- A very simple tar.gz file extractor using zlib +- contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl> +- How to use compress(), uncompress() and the gz* functions from VB. +-- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression +- level) in minigzip (thanks to Tom Lane) +- +-- use const for rommable constants in deflate +-- added test for gzseek and gztell in example.c +-- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) +-- add undocumented function zError to convert error code to string +- (for Tim Smithers) +-- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. +-- Use default memcpy for Symantec MSDOS compiler. +-- Add EXPORT keyword for check_func (needed for Windows DLL) +-- add current directory to LD_LIBRARY_PATH for "make test" +-- create also a link for libz.so.1 +-- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) +-- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) +-- added -soname for Linux in configure (Chun-Chung Chen, +-- assign numbers to the exported functions in zlib.def (for Windows DLL) +-- add advice in zlib.h for best usage of deflateSetDictionary +-- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) +-- allow compilation with ANSI keywords only enabled for TurboC in large model +-- avoid "versionString"[0] (Borland bug) +-- add NEED_DUMMY_RETURN for Borland +-- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). +-- allow compilation with CC +-- defined STDC for OS/2 (David Charlap) +-- limit external names to 8 chars for MVS (Thomas Lund) +-- in minigzip.c, use static buffers only for 16-bit systems +-- fix suffix check for "minigzip -d foo.gz" +-- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) +-- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) +-- added makelcc.bat for lcc-win32 (Tom St Denis) +-- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) +-- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. +-- check for unistd.h in configure (for off_t) +-- remove useless check parameter in inflate_blocks_free +-- avoid useless assignment of s->check to itself in inflate_blocks_new +-- do not flush twice in gzclose (thanks to Ken Raeburn) +-- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h +-- use NO_ERRNO_H instead of enumeration of operating systems with errno.h +-- work around buggy fclose on pipes for HP/UX +-- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) +-- fix configure if CC is already equal to gcc +- +-Changes in 1.0.5 (3 Jan 98) +-- Fix inflate to terminate gracefully when fed corrupted or invalid data +-- Use const for rommable constants in inflate +-- Eliminate memory leaks on error conditions in inflate +-- Removed some vestigial code in inflate +-- Update web address in README +- +-Changes in 1.0.4 (24 Jul 96) +-- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF +- bit, so the decompressor could decompress all the correct data but went +- on to attempt decompressing extra garbage data. This affected minigzip too. +-- zlibVersion and gzerror return const char* (needed for DLL) +-- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) +-- use z_error only for DEBUG (avoid problem with DLLs) +- +-Changes in 1.0.3 (2 Jul 96) +-- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS +- small and medium models; this makes the library incompatible with previous +- versions for these models. (No effect in large model or on other systems.) +-- return OK instead of BUF_ERROR if previous deflate call returned with +- avail_out as zero but there is nothing to do +-- added memcmp for non STDC compilers +-- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) +-- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) +-- better check for 16-bit mode MSC (avoids problem with Symantec) +- +-Changes in 1.0.2 (23 May 96) +-- added Windows DLL support +-- added a function zlibVersion (for the DLL support) +-- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) +-- Bytef is define's instead of typedef'd only for Borland C +-- avoid reading uninitialized memory in example.c +-- mention in README that the zlib format is now RFC1950 +-- updated Makefile.dj2 +-- added algorithm.doc +- +-Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] +-- fix array overlay in deflate.c which sometimes caused bad compressed data +-- fix inflate bug with empty stored block +-- fix MSDOS medium model which was broken in 0.99 +-- fix deflateParams() which could generated bad compressed data. +-- Bytef is define'd instead of typedef'ed (work around Borland bug) +-- added an INDEX file +-- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), +- Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) +-- speed up adler32 for modern machines without auto-increment +-- added -ansi for IRIX in configure +-- static_init_done in trees.c is an int +-- define unlink as delete for VMS +-- fix configure for QNX +-- add configure branch for SCO and HPUX +-- avoid many warnings (unused variables, dead assignments, etc...) +-- no fdopen for BeOS +-- fix the Watcom fix for 32 bit mode (define FAR as empty) +-- removed redefinition of Byte for MKWERKS +-- work around an MWKERKS bug (incorrect merge of all .h files) +- +-Changes in 0.99 (27 Jan 96) +-- allow preset dictionary shared between compressor and decompressor +-- allow compression level 0 (no compression) +-- add deflateParams in zlib.h: allow dynamic change of compression level +- and compression strategy. +-- test large buffers and deflateParams in example.c +-- add optional "configure" to build zlib as a shared library +-- suppress Makefile.qnx, use configure instead +-- fixed deflate for 64-bit systems (detected on Cray) +-- fixed inflate_blocks for 64-bit systems (detected on Alpha) +-- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) +-- always return Z_BUF_ERROR when deflate() has nothing to do +-- deflateInit and inflateInit are now macros to allow version checking +-- prefix all global functions and types with z_ with -DZ_PREFIX +-- make falloc completely reentrant (inftrees.c) +-- fixed very unlikely race condition in ct_static_init +-- free in reverse order of allocation to help memory manager +-- use zlib-1.0/* instead of zlib/* inside the tar.gz +-- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith +- -Wconversion -Wstrict-prototypes -Wmissing-prototypes" +-- allow gzread on concatenated .gz files +-- deflateEnd now returns Z_DATA_ERROR if it was premature +-- deflate is finally (?) fully deterministic (no matches beyond end of input) +-- Document Z_SYNC_FLUSH +-- add uninstall in Makefile +-- Check for __cpluplus in zlib.h +-- Better test in ct_align for partial flush +-- avoid harmless warnings for Borland C++ +-- initialize hash_head in deflate.c +-- avoid warning on fdopen (gzio.c) for HP cc -Aa +-- include stdlib.h for STDC compilers +-- include errno.h for Cray +-- ignore error if ranlib doesn't exist +-- call ranlib twice for NeXTSTEP +-- use exec_prefix instead of prefix for libz.a +-- renamed ct_* as _tr_* to avoid conflict with applications +-- clear z->msg in inflateInit2 before any error return +-- initialize opaque in example.c, gzio.c, deflate.c and inflate.c +-- fixed typo in zconf.h (_GNUC__ => __GNUC__) +-- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) +-- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) +-- in fcalloc, normalize pointer if size > 65520 bytes +-- don't use special fcalloc for 32 bit Borland C++ +-- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... +-- use Z_BINARY instead of BINARY +-- document that gzclose after gzdopen will close the file +-- allow "a" as mode in gzopen. +-- fix error checking in gzread +-- allow skipping .gz extra-field on pipes +-- added reference to Perl interface in README +-- put the crc table in FAR data (I dislike more and more the medium model :) +-- added get_crc_table +-- added a dimension to all arrays (Borland C can't count). +-- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast +-- guard against multiple inclusion of *.h (for precompiled header on Mac) +-- Watcom C pretends to be Microsoft C small model even in 32 bit mode. +-- don't use unsized arrays to avoid silly warnings by Visual C++: +- warning C4746: 'inflate_mask' : unsized array treated as '__far' +- (what's wrong with far data in far model?). +-- define enum out of inflate_blocks_state to allow compilation with C++ +- +-Changes in 0.95 (16 Aug 95) +-- fix MSDOS small and medium model (now easier to adapt to any compiler) +-- inlined send_bits +-- fix the final (:-) bug for deflate with flush (output was correct but +- not completely flushed in rare occasions). +-- default window size is same for compression and decompression +- (it's now sufficient to set MAX_WBITS in zconf.h). +-- voidp -> voidpf and voidnp -> voidp (for consistency with other +- typedefs and because voidnp was not near in large model). +- +-Changes in 0.94 (13 Aug 95) +-- support MSDOS medium model +-- fix deflate with flush (could sometimes generate bad output) +-- fix deflateReset (zlib header was incorrectly suppressed) +-- added support for VMS +-- allow a compression level in gzopen() +-- gzflush now calls fflush +-- For deflate with flush, flush even if no more input is provided. +-- rename libgz.a as libz.a +-- avoid complex expression in infcodes.c triggering Turbo C bug +-- work around a problem with gcc on Alpha (in INSERT_STRING) +-- don't use inline functions (problem with some gcc versions) +-- allow renaming of Byte, uInt, etc... with #define. +-- avoid warning about (unused) pointer before start of array in deflate.c +-- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c +-- avoid reserved word 'new' in trees.c +- +-Changes in 0.93 (25 June 95) +-- temporarily disable inline functions +-- make deflate deterministic +-- give enough lookahead for PARTIAL_FLUSH +-- Set binary mode for stdin/stdout in minigzip.c for OS/2 +-- don't even use signed char in inflate (not portable enough) +-- fix inflate memory leak for segmented architectures +- +-Changes in 0.92 (3 May 95) +-- don't assume that char is signed (problem on SGI) +-- Clear bit buffer when starting a stored block +-- no memcpy on Pyramid +-- suppressed inftest.c +-- optimized fill_window, put longest_match inline for gcc +-- optimized inflate on stored blocks. +-- untabify all sources to simplify patches +- +-Changes in 0.91 (2 May 95) +-- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h +-- Document the memory requirements in zconf.h +-- added "make install" +-- fix sync search logic in inflateSync +-- deflate(Z_FULL_FLUSH) now works even if output buffer too short +-- after inflateSync, don't scare people with just "lo world" +-- added support for DJGPP +- +-Changes in 0.9 (1 May 95) +-- don't assume that zalloc clears the allocated memory (the TurboC bug +- was Mark's bug after all :) +-- let again gzread copy uncompressed data unchanged (was working in 0.71) +-- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented +-- added a test of inflateSync in example.c +-- moved MAX_WBITS to zconf.h because users might want to change that. +-- document explicitly that zalloc(64K) on MSDOS must return a normalized +- pointer (zero offset) +-- added Makefiles for Microsoft C, Turbo C, Borland C++ +-- faster crc32() +- +-Changes in 0.8 (29 April 95) +-- added fast inflate (inffast.c) +-- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this +- is incompatible with previous versions of zlib which returned Z_OK. +-- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) +- (actually that was not a compiler bug, see 0.81 above) +-- gzread no longer reads one extra byte in certain cases +-- In gzio destroy(), don't reference a freed structure +-- avoid many warnings for MSDOS +-- avoid the ERROR symbol which is used by MS Windows +- +-Changes in 0.71 (14 April 95) +-- Fixed more MSDOS compilation problems :( There is still a bug with +- TurboC large model. +- +-Changes in 0.7 (14 April 95) +-- Added full inflate support. +-- Simplified the crc32() interface. The pre- and post-conditioning +- (one's complement) is now done inside crc32(). WARNING: this is +- incompatible with previous versions; see zlib.h for the new usage. +- +-Changes in 0.61 (12 April 95) +-- workaround for a bug in TurboC. example and minigzip now work on MSDOS. +- +-Changes in 0.6 (11 April 95) +-- added minigzip.c +-- added gzdopen to reopen a file descriptor as gzFile +-- added transparent reading of non-gziped files in gzread. +-- fixed bug in gzread (don't read crc as data) +-- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). +-- don't allocate big arrays in the stack (for MSDOS) +-- fix some MSDOS compilation problems +- +-Changes in 0.5: +-- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but +- not yet Z_FULL_FLUSH. +-- support decompression but only in a single step (forced Z_FINISH) +-- added opaque object for zalloc and zfree. +-- added deflateReset and inflateReset +-- added a variable zlib_version for consistency checking. +-- renamed the 'filter' parameter of deflateInit2 as 'strategy'. +- Added Z_FILTERED and Z_HUFFMAN_ONLY constants. +- +-Changes in 0.4: +-- avoid "zip" everywhere, use zlib instead of ziplib. +-- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush +- if compression method == 8. +-- added adler32 and crc32 +-- renamed deflateOptions as deflateInit2, call one or the other but not both +-- added the method parameter for deflateInit2. +-- added inflateInit2 +-- simplied considerably deflateInit and inflateInit by not supporting +- user-provided history buffer. This is supported only in deflateInit2 +- and inflateInit2. +- +-Changes in 0.3: +-- prefix all macro names with Z_ +-- use Z_FINISH instead of deflateEnd to finish compression. +-- added Z_HUFFMAN_ONLY +-- added gzerror() +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/README Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/README Thu Jan 01 00:00:00 1970 +0000 +@@ -1,115 +0,0 @@ +-ZLIB DATA COMPRESSION LIBRARY +- +-zlib 1.2.5 is a general purpose data compression library. All the code is +-thread safe. The data format used by the zlib library is described by RFCs +-(Request for Comments) 1950 to 1952 in the files +-http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) +-and rfc1952.txt (gzip format). +- +-All functions of the compression library are documented in the file zlib.h +-(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +-of the library is given in the file example.c which also tests that the library +-is working correctly. Another example is given in the file minigzip.c. The +-compression library itself is composed of all source files except example.c and +-minigzip.c. +- +-To compile all files and run the test program, follow the instructions given at +-the top of Makefile.in. In short "./configure; make test", and if that goes +-well, "make install" should work for most flavors of Unix. For Windows, use one +-of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use +-make_vms.com. +- +-Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant +-<info@winimage.com> for the Windows DLL version. The zlib home page is +-http://zlib.net/ . Before reporting a problem, please check this site to +-verify that you have the latest version of zlib; otherwise get the latest +-version and check whether the problem still exists or not. +- +-PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. +- +-Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997 +-issue of Dr. Dobb's Journal; a copy of the article is available at +-http://marknelson.us/1997/01/01/zlib-engine/ . +- +-The changes made in version 1.2.5 are documented in the file ChangeLog. +- +-Unsupported third party contributions are provided in directory contrib/ . +- +-zlib is available in Java using the java.util.zip package, documented at +-http://java.sun.com/developer/technicalArticles/Programming/compression/ . +- +-A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available +-at CPAN (Comprehensive Perl Archive Network) sites, including +-http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . +- +-A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is +-available in Python 1.5 and later versions, see +-http://www.python.org/doc/lib/module-zlib.html . +- +-zlib is built into tcl: http://wiki.tcl.tk/4610 . +- +-An experimental package to read and write files in .zip format, written on top +-of zlib by Gilles Vollant <info@winimage.com>, is available in the +-contrib/minizip directory of zlib. +- +- +-Notes for some targets: +- +-- For Windows DLL versions, please see win32/DLL_FAQ.txt +- +-- For 64-bit Irix, deflate.c must be compiled without any optimization. With +- -O, one libpng test fails. The test works in 32 bit mode (with the -n32 +- compiler flag). The compiler bug has been reported to SGI. +- +-- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works +- when compiled with cc. +- +-- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is +- necessary to get gzprintf working correctly. This is done by configure. +- +-- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with +- other compilers. Use "make test" to check your compiler. +- +-- gzdopen is not supported on RISCOS or BEOS. +- +-- For PalmOs, see http://palmzlib.sourceforge.net/ +- +- +-Acknowledgments: +- +- The deflate format used by zlib was defined by Phil Katz. The deflate and +- zlib specifications were written by L. Peter Deutsch. Thanks to all the +- people who reported problems and suggested various improvements in zlib; they +- are too numerous to cite here. +- +-Copyright notice: +- +- (C) 1995-2010 Jean-loup Gailly and Mark Adler +- +- This software is provided 'as-is', without any express or implied +- warranty. In no event will the authors be held liable for any damages +- arising from the use of this software. +- +- Permission is granted to anyone to use this software for any purpose, +- including commercial applications, and to alter it and redistribute it +- freely, subject to the following restrictions: +- +- 1. The origin of this software must not be misrepresented; you must not +- claim that you wrote the original software. If you use this software +- in a product, an acknowledgment in the product documentation would be +- appreciated but is not required. +- 2. Altered source versions must be plainly marked as such, and must not be +- misrepresented as being the original software. +- 3. This notice may not be removed or altered from any source distribution. +- +- Jean-loup Gailly Mark Adler +- jloup@gzip.org madler@alumni.caltech.edu +- +-If you use the zlib library in a product, we would appreciate *not* receiving +-lengthy legal documents to sign. The sources are provided for free but without +-warranty of any kind. The library has been entirely written by Jean-loup +-Gailly and Mark Adler; it does not include third-party code. +- +-If you redistribute modified sources, we would appreciate that you include in +-the file ChangeLog history information documenting your changes. Please read +-the FAQ for more information on the distribution of modified source versions. +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/compress.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/compress.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,104 +0,0 @@ +-/* +- * 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. +- */ +- +-/* compress.c -- compress a memory buffer +- * Copyright (C) 1995-2005 Jean-loup Gailly. +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* @(#) $Id$ */ +- +-#define ZLIB_INTERNAL +-#include "zlib.h" +- +-/* =========================================================================== +- Compresses the source buffer into the destination buffer. The level +- parameter has the same meaning as in deflateInit. sourceLen is the byte +- length of the source buffer. Upon entry, destLen is the total size of the +- destination buffer, which must be at least 0.1% larger than sourceLen plus +- 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. +- +- compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough +- memory, Z_BUF_ERROR if there was not enough room in the output buffer, +- Z_STREAM_ERROR if the level parameter is invalid. +-*/ +-int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) +- Bytef *dest; +- uLongf *destLen; +- const Bytef *source; +- uLong sourceLen; +- int level; +-{ +- z_stream stream; +- int err; +- +- stream.next_in = (Bytef*)source; +- stream.avail_in = (uInt)sourceLen; +-#ifdef MAXSEG_64K +- /* Check for source > 64K on 16-bit machine: */ +- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +-#endif +- stream.next_out = dest; +- stream.avail_out = (uInt)*destLen; +- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; +- +- stream.zalloc = (alloc_func)0; +- stream.zfree = (free_func)0; +- stream.opaque = (voidpf)0; +- +- err = deflateInit(&stream, level); +- if (err != Z_OK) return err; +- +- err = deflate(&stream, Z_FINISH); +- if (err != Z_STREAM_END) { +- deflateEnd(&stream); +- return err == Z_OK ? Z_BUF_ERROR : err; +- } +- *destLen = stream.total_out; +- +- err = deflateEnd(&stream); +- return err; +-} +- +-/* =========================================================================== +- */ +-int ZEXPORT compress (dest, destLen, source, sourceLen) +- Bytef *dest; +- uLongf *destLen; +- const Bytef *source; +- uLong sourceLen; +-{ +- return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +-} +- +-/* =========================================================================== +- If the default memLevel or windowBits for deflateInit() is changed, then +- this function needs to be updated. +- */ +-uLong ZEXPORT compressBound (sourceLen) +- uLong sourceLen; +-{ +- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + +- (sourceLen >> 25) + 13; +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/crc32.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/crc32.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,465 +0,0 @@ +-/* +- * 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. +- */ +- +-/* crc32.h -- tables for rapid CRC calculation +- * Generated automatically by crc32.c +- */ +- +-local const unsigned long FAR crc_table[TBLS][256] = +-{ +- { +- 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, +- 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, +- 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, +- 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, +- 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, +- 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, +- 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, +- 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, +- 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, +- 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, +- 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, +- 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, +- 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, +- 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, +- 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, +- 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, +- 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, +- 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, +- 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, +- 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, +- 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, +- 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, +- 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, +- 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, +- 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, +- 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, +- 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, +- 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, +- 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, +- 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, +- 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, +- 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, +- 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, +- 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, +- 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, +- 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, +- 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, +- 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, +- 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, +- 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, +- 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, +- 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, +- 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, +- 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, +- 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, +- 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, +- 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, +- 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, +- 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, +- 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, +- 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, +- 0x2d02ef8dUL +-#ifdef BYFOUR +- }, +- { +- 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, +- 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, +- 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, +- 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, +- 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, +- 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, +- 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, +- 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, +- 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, +- 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, +- 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, +- 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, +- 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, +- 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, +- 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, +- 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, +- 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, +- 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, +- 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, +- 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, +- 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, +- 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, +- 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, +- 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, +- 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, +- 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, +- 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, +- 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, +- 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, +- 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, +- 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, +- 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, +- 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, +- 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, +- 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, +- 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, +- 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, +- 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, +- 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, +- 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, +- 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, +- 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, +- 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, +- 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, +- 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, +- 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, +- 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, +- 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, +- 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, +- 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, +- 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, +- 0x9324fd72UL +- }, +- { +- 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, +- 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, +- 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, +- 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, +- 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, +- 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, +- 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, +- 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, +- 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, +- 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, +- 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, +- 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, +- 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, +- 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, +- 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, +- 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, +- 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, +- 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, +- 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, +- 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, +- 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, +- 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, +- 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, +- 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, +- 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, +- 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, +- 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, +- 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, +- 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, +- 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, +- 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, +- 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, +- 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, +- 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, +- 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, +- 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, +- 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, +- 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, +- 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, +- 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, +- 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, +- 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, +- 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, +- 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, +- 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, +- 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, +- 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, +- 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, +- 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, +- 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, +- 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, +- 0xbe9834edUL +- }, +- { +- 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, +- 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, +- 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, +- 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, +- 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, +- 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, +- 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, +- 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, +- 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, +- 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, +- 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, +- 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, +- 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, +- 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, +- 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, +- 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, +- 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, +- 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, +- 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, +- 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, +- 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, +- 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, +- 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, +- 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, +- 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, +- 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, +- 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, +- 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, +- 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, +- 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, +- 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, +- 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, +- 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, +- 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, +- 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, +- 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, +- 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, +- 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, +- 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, +- 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, +- 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, +- 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, +- 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, +- 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, +- 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, +- 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, +- 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, +- 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, +- 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, +- 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, +- 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, +- 0xde0506f1UL +- }, +- { +- 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, +- 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, +- 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, +- 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, +- 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, +- 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, +- 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, +- 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, +- 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, +- 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, +- 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, +- 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, +- 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, +- 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, +- 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, +- 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, +- 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, +- 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, +- 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, +- 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, +- 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, +- 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, +- 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, +- 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, +- 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, +- 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, +- 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, +- 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, +- 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, +- 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, +- 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, +- 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, +- 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, +- 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, +- 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, +- 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, +- 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, +- 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, +- 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, +- 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, +- 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, +- 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, +- 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, +- 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, +- 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, +- 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, +- 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, +- 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, +- 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, +- 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, +- 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, +- 0x8def022dUL +- }, +- { +- 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, +- 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, +- 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, +- 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, +- 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, +- 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, +- 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, +- 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, +- 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, +- 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, +- 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, +- 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, +- 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, +- 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, +- 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, +- 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, +- 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, +- 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, +- 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, +- 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, +- 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, +- 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, +- 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, +- 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, +- 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, +- 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, +- 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, +- 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, +- 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, +- 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, +- 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, +- 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, +- 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, +- 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, +- 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, +- 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, +- 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, +- 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, +- 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, +- 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, +- 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, +- 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, +- 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, +- 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, +- 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, +- 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, +- 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, +- 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, +- 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, +- 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, +- 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, +- 0x72fd2493UL +- }, +- { +- 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, +- 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, +- 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, +- 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, +- 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, +- 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, +- 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, +- 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, +- 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, +- 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, +- 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, +- 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, +- 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, +- 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, +- 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, +- 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, +- 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, +- 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, +- 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, +- 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, +- 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, +- 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, +- 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, +- 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, +- 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, +- 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, +- 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, +- 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, +- 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, +- 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, +- 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, +- 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, +- 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, +- 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, +- 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, +- 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, +- 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, +- 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, +- 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, +- 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, +- 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, +- 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, +- 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, +- 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, +- 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, +- 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, +- 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, +- 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, +- 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, +- 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, +- 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, +- 0xed3498beUL +- }, +- { +- 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, +- 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, +- 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, +- 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, +- 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, +- 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, +- 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, +- 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, +- 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, +- 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, +- 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, +- 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, +- 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, +- 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, +- 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, +- 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, +- 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, +- 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, +- 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, +- 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, +- 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, +- 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, +- 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, +- 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, +- 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, +- 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, +- 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, +- 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, +- 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, +- 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, +- 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, +- 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, +- 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, +- 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, +- 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, +- 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, +- 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, +- 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, +- 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, +- 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, +- 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, +- 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, +- 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, +- 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, +- 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, +- 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, +- 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, +- 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, +- 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, +- 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, +- 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, +- 0xf10605deUL +-#endif +- } +-}; +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/deflate.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/deflate.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1858 +0,0 @@ +-/* +- * 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. +- */ +- +-/* deflate.c -- compress data using the deflation algorithm +- * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* +- * ALGORITHM +- * +- * The "deflation" process depends on being able to identify portions +- * of the input text which are identical to earlier input (within a +- * sliding window trailing behind the input currently being processed). +- * +- * The most straightforward technique turns out to be the fastest for +- * most input files: try all possible matches and select the longest. +- * The key feature of this algorithm is that insertions into the string +- * dictionary are very simple and thus fast, and deletions are avoided +- * completely. Insertions are performed at each input character, whereas +- * string matches are performed only when the previous match ends. So it +- * is preferable to spend more time in matches to allow very fast string +- * insertions and avoid deletions. The matching algorithm for small +- * strings is inspired from that of Rabin & Karp. A brute force approach +- * is used to find longer strings when a small match has been found. +- * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze +- * (by Leonid Broukhis). +- * A previous version of this file used a more sophisticated algorithm +- * (by Fiala and Greene) which is guaranteed to run in linear amortized +- * time, but has a larger average cost, uses more memory and is patented. +- * However the F&G algorithm may be faster for some highly redundant +- * files if the parameter max_chain_length (described below) is too large. +- * +- * ACKNOWLEDGEMENTS +- * +- * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and +- * I found it in 'freeze' written by Leonid Broukhis. +- * Thanks to many people for bug reports and testing. +- * +- * REFERENCES +- * +- * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". +- * Available in http://www.ietf.org/rfc/rfc1951.txt +- * +- * A description of the Rabin and Karp algorithm is given in the book +- * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. +- * +- * Fiala,E.R., and Greene,D.H. +- * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 +- * +- */ +- +-/* @(#) $Id$ */ +- +-#include "deflate.h" +- +-const char deflate_copyright[] = +- " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; +-/* +- If you use the zlib library in a product, an acknowledgment is welcome +- in the documentation of your product. If for some reason you cannot +- include such an acknowledgment, I would appreciate that you keep this +- copyright string in the executable of your product. +- */ +- +-/* =========================================================================== +- * Function prototypes. +- */ +-typedef enum { +- need_more, /* block not completed, need more input or more output */ +- block_done, /* block flush performed */ +- finish_started, /* finish started, need only more output at next deflate */ +- finish_done /* finish done, accept no more input or output */ +-} block_state; +- +-typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +-/* Compression function. Returns the block state after the call. */ +- +-local void fill_window OF((deflate_state *s)); +-local block_state deflate_stored OF((deflate_state *s, int flush)); +-local block_state deflate_fast OF((deflate_state *s, int flush)); +-#ifndef FASTEST +-local block_state deflate_slow OF((deflate_state *s, int flush)); +-#endif +-local block_state deflate_rle OF((deflate_state *s, int flush)); +-local block_state deflate_huff OF((deflate_state *s, int flush)); +-local void lm_init OF((deflate_state *s)); +-local void putShortMSB OF((deflate_state *s, uInt b)); +-local void flush_pending OF((z_streamp strm)); +-local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +-#ifdef ASMV +- void match_init OF((void)); /* asm code initialization */ +- uInt longest_match OF((deflate_state *s, IPos cur_match)); +-#else +-local uInt longest_match OF((deflate_state *s, IPos cur_match)); +-#endif +- +-#ifdef DEBUG +-local void check_match OF((deflate_state *s, IPos start, IPos match, +- int length)); +-#endif +- +-/* =========================================================================== +- * Local data +- */ +- +-#define NIL 0 +-/* Tail of hash chains */ +- +-#ifndef TOO_FAR +-# define TOO_FAR 4096 +-#endif +-/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ +- +-/* Values for max_lazy_match, good_match and max_chain_length, depending on +- * the desired pack level (0..9). The values given below have been tuned to +- * exclude worst case performance for pathological files. Better values may be +- * found for specific files. +- */ +-typedef struct config_s { +- ush good_length; /* reduce lazy search above this match length */ +- ush max_lazy; /* do not perform lazy search above this match length */ +- ush nice_length; /* quit search above this match length */ +- ush max_chain; +- compress_func func; +-} config; +- +-#ifdef FASTEST +-local const config configuration_table[2] = { +-/* good lazy nice chain */ +-/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +-/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +-#else +-local const config configuration_table[10] = { +-/* good lazy nice chain */ +-/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +-/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +-/* 2 */ {4, 5, 16, 8, deflate_fast}, +-/* 3 */ {4, 6, 32, 32, deflate_fast}, +- +-/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +-/* 5 */ {8, 16, 32, 32, deflate_slow}, +-/* 6 */ {8, 16, 128, 128, deflate_slow}, +-/* 7 */ {8, 32, 128, 256, deflate_slow}, +-/* 8 */ {32, 128, 258, 1024, deflate_slow}, +-/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +-#endif +- +-/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 +- * For deflate_fast() (levels <= 3) good is ignored and lazy has a different +- * meaning. +- */ +- +-#define EQUAL 0 +-/* result of memcmp for equal strings */ +- +-#ifndef NO_DUMMY_DECL +-struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +-#endif +- +-/* =========================================================================== +- * Update a hash value with the given input byte +- * IN assertion: all calls to to UPDATE_HASH are made with consecutive +- * input characters, so that a running hash key can be computed from the +- * previous key instead of complete recalculation each time. +- */ +-#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) +- +- +-/* =========================================================================== +- * Insert string str in the dictionary and set match_head to the previous head +- * of the hash chain (the most recent string with same hash key). Return +- * the previous length of the hash chain. +- * If this file is compiled with -DFASTEST, the compression level is forced +- * to 1, and no hash chains are maintained. +- * IN assertion: all calls to to INSERT_STRING are made with consecutive +- * input characters and the first MIN_MATCH bytes of str are valid +- * (except for the last MIN_MATCH-1 bytes of the input file). +- */ +-#ifdef FASTEST +-#define INSERT_STRING(s, str, match_head) \ +- (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ +- match_head = s->head[s->ins_h], \ +- s->head[s->ins_h] = (Pos)(str)) +-#else +-#define INSERT_STRING(s, str, match_head) \ +- (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ +- match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ +- s->head[s->ins_h] = (Pos)(str)) +-#endif +- +-/* =========================================================================== +- * Initialize the hash table (avoiding 64K overflow for 16 bit systems). +- * prev[] will be initialized on the fly. +- */ +-#define CLEAR_HASH(s) \ +- s->head[s->hash_size-1] = NIL; \ +- zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); +- +-/* ========================================================================= */ +-int ZEXPORT deflateInit_(strm, level, version, stream_size) +- z_streamp strm; +- int level; +- const char *version; +- int stream_size; +-{ +- return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, +- Z_DEFAULT_STRATEGY, version, stream_size); +- /* To do: ignore strm->next_in if we use it as window */ +-} +- +-/* ========================================================================= */ +-int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, +- version, stream_size) +- z_streamp strm; +- int level; +- int method; +- int windowBits; +- int memLevel; +- int strategy; +- const char *version; +- int stream_size; +-{ +- deflate_state *s; +- int wrap = 1; +- static const char my_version[] = ZLIB_VERSION; +- +- ushf *overlay; +- /* We overlay pending_buf and d_buf+l_buf. This works since the average +- * output size for (length,distance) codes is <= 24 bits. +- */ +- +- if (version == Z_NULL || version[0] != my_version[0] || +- stream_size != sizeof(z_stream)) { +- return Z_VERSION_ERROR; +- } +- if (strm == Z_NULL) return Z_STREAM_ERROR; +- +- strm->msg = Z_NULL; +- if (strm->zalloc == (alloc_func)0) { +- strm->zalloc = zcalloc; +- strm->opaque = (voidpf)0; +- } +- if (strm->zfree == (free_func)0) strm->zfree = zcfree; +- +-#ifdef FASTEST +- if (level != 0) level = 1; +-#else +- if (level == Z_DEFAULT_COMPRESSION) level = 6; +-#endif +- +- if (windowBits < 0) { /* suppress zlib wrapper */ +- wrap = 0; +- windowBits = -windowBits; +- } +-#ifdef GZIP +- else if (windowBits > 15) { +- wrap = 2; /* write gzip wrapper instead */ +- windowBits -= 16; +- } +-#endif +- if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || +- windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || +- strategy < 0 || strategy > Z_FIXED) { +- return Z_STREAM_ERROR; +- } +- if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ +- s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); +- if (s == Z_NULL) return Z_MEM_ERROR; +- strm->state = (struct internal_state FAR *)s; +- s->strm = strm; +- +- s->wrap = wrap; +- s->gzhead = Z_NULL; +- s->w_bits = windowBits; +- s->w_size = 1 << s->w_bits; +- s->w_mask = s->w_size - 1; +- +- s->hash_bits = memLevel + 7; +- s->hash_size = 1 << s->hash_bits; +- s->hash_mask = s->hash_size - 1; +- s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); +- +- s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); +- s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); +- s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); +- +- s->high_water = 0; /* nothing written to s->window yet */ +- +- s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ +- +- overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); +- s->pending_buf = (uchf *) overlay; +- s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); +- +- if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || +- s->pending_buf == Z_NULL) { +- s->status = FINISH_STATE; +- strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); +- deflateEnd (strm); +- return Z_MEM_ERROR; +- } +- s->d_buf = overlay + s->lit_bufsize/sizeof(ush); +- s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; +- +- s->level = level; +- s->strategy = strategy; +- s->method = (Byte)method; +- +- return deflateReset(strm); +-} +- +-/* ========================================================================= */ +-int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) +- z_streamp strm; +- const Bytef *dictionary; +- uInt dictLength; +-{ +- deflate_state *s; +- uInt length = dictLength; +- uInt n; +- IPos hash_head = 0; +- +- if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || +- strm->state->wrap == 2 || +- (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) +- return Z_STREAM_ERROR; +- +- s = strm->state; +- if (s->wrap) +- strm->adler = adler32(strm->adler, dictionary, dictLength); +- +- if (length < MIN_MATCH) return Z_OK; +- if (length > s->w_size) { +- length = s->w_size; +- dictionary += dictLength - length; /* use the tail of the dictionary */ +- } +- zmemcpy(s->window, dictionary, length); +- s->strstart = length; +- s->block_start = (long)length; +- +- /* Insert all strings in the hash table (except for the last two bytes). +- * s->lookahead stays null, so s->ins_h will be recomputed at the next +- * call of fill_window. +- */ +- s->ins_h = s->window[0]; +- UPDATE_HASH(s, s->ins_h, s->window[1]); +- for (n = 0; n <= length - MIN_MATCH; n++) { +- INSERT_STRING(s, n, hash_head); +- } +- if (hash_head) hash_head = 0; /* to make compiler happy */ +- return Z_OK; +-} +- +-/* ========================================================================= */ +-int ZEXPORT deflateReset (strm) +- z_streamp strm; +-{ +- deflate_state *s; +- +- if (strm == Z_NULL || strm->state == Z_NULL || +- strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { +- return Z_STREAM_ERROR; +- } +- +- strm->total_in = strm->total_out = 0; +- strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ +- strm->data_type = Z_UNKNOWN; +- +- s = (deflate_state *)strm->state; +- s->pending = 0; +- s->pending_out = s->pending_buf; +- +- if (s->wrap < 0) { +- s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ +- } +- s->status = s->wrap ? INIT_STATE : BUSY_STATE; +- strm->adler = +-#ifdef GZIP +- s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +-#endif +- adler32(0L, Z_NULL, 0); +- s->last_flush = Z_NO_FLUSH; +- +- _tr_init(s); +- lm_init(s); +- +- return Z_OK; +-} +- +-/* ========================================================================= */ +-int ZEXPORT deflateSetHeader (strm, head) +- z_streamp strm; +- gz_headerp head; +-{ +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- if (strm->state->wrap != 2) return Z_STREAM_ERROR; +- strm->state->gzhead = head; +- return Z_OK; +-} +- +-/* ========================================================================= */ +-int ZEXPORT deflatePrime (strm, bits, value) +- z_streamp strm; +- int bits; +- int value; +-{ +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- strm->state->bi_valid = bits; +- strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); +- return Z_OK; +-} +- +-/* ========================================================================= */ +-int ZEXPORT deflateParams(strm, level, strategy) +- z_streamp strm; +- int level; +- int strategy; +-{ +- deflate_state *s; +- compress_func func; +- int err = Z_OK; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- s = strm->state; +- +-#ifdef FASTEST +- if (level != 0) level = 1; +-#else +- if (level == Z_DEFAULT_COMPRESSION) level = 6; +-#endif +- if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { +- return Z_STREAM_ERROR; +- } +- func = configuration_table[s->level].func; +- +- if ((strategy != s->strategy || func != configuration_table[level].func) && +- strm->total_in != 0) { +- /* Flush the last buffer: */ +- err = deflate(strm, Z_BLOCK); +- } +- if (s->level != level) { +- s->level = level; +- s->max_lazy_match = configuration_table[level].max_lazy; +- s->good_match = configuration_table[level].good_length; +- s->nice_match = configuration_table[level].nice_length; +- s->max_chain_length = configuration_table[level].max_chain; +- } +- s->strategy = strategy; +- return err; +-} +- +-/* ========================================================================= */ +-int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) +- z_streamp strm; +- int good_length; +- int max_lazy; +- int nice_length; +- int max_chain; +-{ +- deflate_state *s; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- s = strm->state; +- s->good_match = good_length; +- s->max_lazy_match = max_lazy; +- s->nice_match = nice_length; +- s->max_chain_length = max_chain; +- return Z_OK; +-} +- +-/* ========================================================================= +- * For the default windowBits of 15 and memLevel of 8, this function returns +- * a close to exact, as well as small, upper bound on the compressed size. +- * They are coded as constants here for a reason--if the #define's are +- * changed, then this function needs to be changed as well. The return +- * value for 15 and 8 only works for those exact settings. +- * +- * For any setting other than those defaults for windowBits and memLevel, +- * the value returned is a conservative worst case for the maximum expansion +- * resulting from using fixed blocks instead of stored blocks, which deflate +- * can emit on compressed data for some combinations of the parameters. +- * +- * This function could be more sophisticated to provide closer upper bounds for +- * every combination of windowBits and memLevel. But even the conservative +- * upper bound of about 14% expansion does not seem onerous for output buffer +- * allocation. +- */ +-uLong ZEXPORT deflateBound(strm, sourceLen) +- z_streamp strm; +- uLong sourceLen; +-{ +- deflate_state *s; +- uLong complen, wraplen; +- Bytef *str; +- +- /* conservative upper bound for compressed data */ +- complen = sourceLen + +- ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; +- +- /* if can't get parameters, return conservative bound plus zlib wrapper */ +- if (strm == Z_NULL || strm->state == Z_NULL) +- return complen + 6; +- +- /* compute wrapper length */ +- s = strm->state; +- switch (s->wrap) { +- case 0: /* raw deflate */ +- wraplen = 0; +- break; +- case 1: /* zlib wrapper */ +- wraplen = 6 + (s->strstart ? 4 : 0); +- break; +- case 2: /* gzip wrapper */ +- wraplen = 18; +- if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ +- if (s->gzhead->extra != Z_NULL) +- wraplen += 2 + s->gzhead->extra_len; +- str = s->gzhead->name; +- if (str != Z_NULL) +- do { +- wraplen++; +- } while (*str++); +- str = s->gzhead->comment; +- if (str != Z_NULL) +- do { +- wraplen++; +- } while (*str++); +- if (s->gzhead->hcrc) +- wraplen += 2; +- } +- break; +- default: /* for compiler happiness */ +- wraplen = 6; +- } +- +- /* if not default parameters, return conservative bound */ +- if (s->w_bits != 15 || s->hash_bits != 8 + 7) +- return complen + wraplen; +- +- /* default settings: return tight bound for that case */ +- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + +- (sourceLen >> 25) + 13 - 6 + wraplen; +-} +- +-/* ========================================================================= +- * Put a short in the pending buffer. The 16-bit value is put in MSB order. +- * IN assertion: the stream state is correct and there is enough room in +- * pending_buf. +- */ +-local void putShortMSB (s, b) +- deflate_state *s; +- uInt b; +-{ +- put_byte(s, (Byte)(b >> 8)); +- put_byte(s, (Byte)(b & 0xff)); +-} +- +-/* ========================================================================= +- * Flush as much pending output as possible. All deflate() output goes +- * through this function so some applications may wish to modify it +- * to avoid allocating a large strm->next_out buffer and copying into it. +- * (See also read_buf()). +- */ +-local void flush_pending(strm) +- z_streamp strm; +-{ +- unsigned len = strm->state->pending; +- +- if (len > strm->avail_out) len = strm->avail_out; +- if (len == 0) return; +- +- zmemcpy(strm->next_out, strm->state->pending_out, len); +- strm->next_out += len; +- strm->state->pending_out += len; +- strm->total_out += len; +- strm->avail_out -= len; +- strm->state->pending -= len; +- if (strm->state->pending == 0) { +- strm->state->pending_out = strm->state->pending_buf; +- } +-} +- +-/* ========================================================================= */ +-int ZEXPORT deflate (strm, flush) +- z_streamp strm; +- int flush; +-{ +- int old_flush; /* value of flush param for previous deflate call */ +- deflate_state *s; +- +- if (strm == Z_NULL || strm->state == Z_NULL || +- flush > Z_BLOCK || flush < 0) { +- return Z_STREAM_ERROR; +- } +- s = strm->state; +- +- if (strm->next_out == Z_NULL || +- (strm->next_in == Z_NULL && strm->avail_in != 0) || +- (s->status == FINISH_STATE && flush != Z_FINISH)) { +- ERR_RETURN(strm, Z_STREAM_ERROR); +- } +- if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); +- +- s->strm = strm; /* just in case */ +- old_flush = s->last_flush; +- s->last_flush = flush; +- +- /* Write the header */ +- if (s->status == INIT_STATE) { +-#ifdef GZIP +- if (s->wrap == 2) { +- strm->adler = crc32(0L, Z_NULL, 0); +- put_byte(s, 31); +- put_byte(s, 139); +- put_byte(s, 8); +- if (s->gzhead == Z_NULL) { +- put_byte(s, 0); +- put_byte(s, 0); +- put_byte(s, 0); +- put_byte(s, 0); +- put_byte(s, 0); +- put_byte(s, s->level == 9 ? 2 : +- (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? +- 4 : 0)); +- put_byte(s, OS_CODE); +- s->status = BUSY_STATE; +- } +- else { +- put_byte(s, (s->gzhead->text ? 1 : 0) + +- (s->gzhead->hcrc ? 2 : 0) + +- (s->gzhead->extra == Z_NULL ? 0 : 4) + +- (s->gzhead->name == Z_NULL ? 0 : 8) + +- (s->gzhead->comment == Z_NULL ? 0 : 16) +- ); +- put_byte(s, (Byte)(s->gzhead->time & 0xff)); +- put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); +- put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); +- put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); +- put_byte(s, s->level == 9 ? 2 : +- (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? +- 4 : 0)); +- put_byte(s, s->gzhead->os & 0xff); +- if (s->gzhead->extra != Z_NULL) { +- put_byte(s, s->gzhead->extra_len & 0xff); +- put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); +- } +- if (s->gzhead->hcrc) +- strm->adler = crc32(strm->adler, s->pending_buf, +- s->pending); +- s->gzindex = 0; +- s->status = EXTRA_STATE; +- } +- } +- else +-#endif +- { +- uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; +- uInt level_flags; +- +- if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) +- level_flags = 0; +- else if (s->level < 6) +- level_flags = 1; +- else if (s->level == 6) +- level_flags = 2; +- else +- level_flags = 3; +- header |= (level_flags << 6); +- if (s->strstart != 0) header |= PRESET_DICT; +- header += 31 - (header % 31); +- +- s->status = BUSY_STATE; +- putShortMSB(s, header); +- +- /* Save the adler32 of the preset dictionary: */ +- if (s->strstart != 0) { +- putShortMSB(s, (uInt)(strm->adler >> 16)); +- putShortMSB(s, (uInt)(strm->adler & 0xffff)); +- } +- strm->adler = adler32(0L, Z_NULL, 0); +- } +- } +-#ifdef GZIP +- if (s->status == EXTRA_STATE) { +- if (s->gzhead->extra != Z_NULL) { +- uInt beg = s->pending; /* start of bytes to update crc */ +- +- while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { +- if (s->pending == s->pending_buf_size) { +- if (s->gzhead->hcrc && s->pending > beg) +- strm->adler = crc32(strm->adler, s->pending_buf + beg, +- s->pending - beg); +- flush_pending(strm); +- beg = s->pending; +- if (s->pending == s->pending_buf_size) +- break; +- } +- put_byte(s, s->gzhead->extra[s->gzindex]); +- s->gzindex++; +- } +- if (s->gzhead->hcrc && s->pending > beg) +- strm->adler = crc32(strm->adler, s->pending_buf + beg, +- s->pending - beg); +- if (s->gzindex == s->gzhead->extra_len) { +- s->gzindex = 0; +- s->status = NAME_STATE; +- } +- } +- else +- s->status = NAME_STATE; +- } +- if (s->status == NAME_STATE) { +- if (s->gzhead->name != Z_NULL) { +- uInt beg = s->pending; /* start of bytes to update crc */ +- int val; +- +- do { +- if (s->pending == s->pending_buf_size) { +- if (s->gzhead->hcrc && s->pending > beg) +- strm->adler = crc32(strm->adler, s->pending_buf + beg, +- s->pending - beg); +- flush_pending(strm); +- beg = s->pending; +- if (s->pending == s->pending_buf_size) { +- val = 1; +- break; +- } +- } +- val = s->gzhead->name[s->gzindex++]; +- put_byte(s, val); +- } while (val != 0); +- if (s->gzhead->hcrc && s->pending > beg) +- strm->adler = crc32(strm->adler, s->pending_buf + beg, +- s->pending - beg); +- if (val == 0) { +- s->gzindex = 0; +- s->status = COMMENT_STATE; +- } +- } +- else +- s->status = COMMENT_STATE; +- } +- if (s->status == COMMENT_STATE) { +- if (s->gzhead->comment != Z_NULL) { +- uInt beg = s->pending; /* start of bytes to update crc */ +- int val; +- +- do { +- if (s->pending == s->pending_buf_size) { +- if (s->gzhead->hcrc && s->pending > beg) +- strm->adler = crc32(strm->adler, s->pending_buf + beg, +- s->pending - beg); +- flush_pending(strm); +- beg = s->pending; +- if (s->pending == s->pending_buf_size) { +- val = 1; +- break; +- } +- } +- val = s->gzhead->comment[s->gzindex++]; +- put_byte(s, val); +- } while (val != 0); +- if (s->gzhead->hcrc && s->pending > beg) +- strm->adler = crc32(strm->adler, s->pending_buf + beg, +- s->pending - beg); +- if (val == 0) +- s->status = HCRC_STATE; +- } +- else +- s->status = HCRC_STATE; +- } +- if (s->status == HCRC_STATE) { +- if (s->gzhead->hcrc) { +- if (s->pending + 2 > s->pending_buf_size) +- flush_pending(strm); +- if (s->pending + 2 <= s->pending_buf_size) { +- put_byte(s, (Byte)(strm->adler & 0xff)); +- put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); +- strm->adler = crc32(0L, Z_NULL, 0); +- s->status = BUSY_STATE; +- } +- } +- else +- s->status = BUSY_STATE; +- } +-#endif +- +- /* Flush as much pending output as possible */ +- if (s->pending != 0) { +- flush_pending(strm); +- if (strm->avail_out == 0) { +- /* Since avail_out is 0, deflate will be called again with +- * more output space, but possibly with both pending and +- * avail_in equal to zero. There won't be anything to do, +- * but this is not an error situation so make sure we +- * return OK instead of BUF_ERROR at next call of deflate: +- */ +- s->last_flush = -1; +- return Z_OK; +- } +- +- /* Make sure there is something to do and avoid duplicate consecutive +- * flushes. For repeated and useless calls with Z_FINISH, we keep +- * returning Z_STREAM_END instead of Z_BUF_ERROR. +- */ +- } else if (strm->avail_in == 0 && flush <= old_flush && +- flush != Z_FINISH) { +- ERR_RETURN(strm, Z_BUF_ERROR); +- } +- +- /* User must not provide more input after the first FINISH: */ +- if (s->status == FINISH_STATE && strm->avail_in != 0) { +- ERR_RETURN(strm, Z_BUF_ERROR); +- } +- +- /* Start a new block or continue the current one. +- */ +- if (strm->avail_in != 0 || s->lookahead != 0 || +- (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { +- block_state bstate; +- +- bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : +- (s->strategy == Z_RLE ? deflate_rle(s, flush) : +- (*(configuration_table[s->level].func))(s, flush)); +- +- if (bstate == finish_started || bstate == finish_done) { +- s->status = FINISH_STATE; +- } +- if (bstate == need_more || bstate == finish_started) { +- if (strm->avail_out == 0) { +- s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ +- } +- return Z_OK; +- /* If flush != Z_NO_FLUSH && avail_out == 0, the next call +- * of deflate should use the same flush parameter to make sure +- * that the flush is complete. So we don't have to output an +- * empty block here, this will be done at next call. This also +- * ensures that for a very small output buffer, we emit at most +- * one empty block. +- */ +- } +- if (bstate == block_done) { +- if (flush == Z_PARTIAL_FLUSH) { +- _tr_align(s); +- } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ +- _tr_stored_block(s, (char*)0, 0L, 0); +- /* For a full flush, this empty block will be recognized +- * as a special marker by inflate_sync(). +- */ +- if (flush == Z_FULL_FLUSH) { +- CLEAR_HASH(s); /* forget history */ +- if (s->lookahead == 0) { +- s->strstart = 0; +- s->block_start = 0L; +- } +- } +- } +- flush_pending(strm); +- if (strm->avail_out == 0) { +- s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ +- return Z_OK; +- } +- } +- } +- Assert(strm->avail_out > 0, "bug2"); +- +- if (flush != Z_FINISH) return Z_OK; +- if (s->wrap <= 0) return Z_STREAM_END; +- +- /* Write the trailer */ +-#ifdef GZIP +- if (s->wrap == 2) { +- put_byte(s, (Byte)(strm->adler & 0xff)); +- put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); +- put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); +- put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); +- put_byte(s, (Byte)(strm->total_in & 0xff)); +- put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); +- put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); +- put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); +- } +- else +-#endif +- { +- putShortMSB(s, (uInt)(strm->adler >> 16)); +- putShortMSB(s, (uInt)(strm->adler & 0xffff)); +- } +- flush_pending(strm); +- /* If avail_out is zero, the application will call deflate again +- * to flush the rest. +- */ +- if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ +- return s->pending != 0 ? Z_OK : Z_STREAM_END; +-} +- +-/* ========================================================================= */ +-int ZEXPORT deflateEnd (strm) +- z_streamp strm; +-{ +- int status; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- +- status = strm->state->status; +- if (status != INIT_STATE && +- status != EXTRA_STATE && +- status != NAME_STATE && +- status != COMMENT_STATE && +- status != HCRC_STATE && +- status != BUSY_STATE && +- status != FINISH_STATE) { +- return Z_STREAM_ERROR; +- } +- +- /* Deallocate in reverse order of allocations: */ +- TRY_FREE(strm, strm->state->pending_buf); +- TRY_FREE(strm, strm->state->head); +- TRY_FREE(strm, strm->state->prev); +- TRY_FREE(strm, strm->state->window); +- +- ZFREE(strm, strm->state); +- strm->state = Z_NULL; +- +- return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +-} +- +-/* ========================================================================= +- * Copy the source state to the destination state. +- * To simplify the source, this is not supported for 16-bit MSDOS (which +- * doesn't have enough memory anyway to duplicate compression states). +- */ +-int ZEXPORT deflateCopy (dest, source) +- z_streamp dest; +- z_streamp source; +-{ +-#ifdef MAXSEG_64K +- return Z_STREAM_ERROR; +-#else +- deflate_state *ds; +- deflate_state *ss; +- ushf *overlay; +- +- +- if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { +- return Z_STREAM_ERROR; +- } +- +- ss = source->state; +- +- zmemcpy(dest, source, sizeof(z_stream)); +- +- ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); +- if (ds == Z_NULL) return Z_MEM_ERROR; +- dest->state = (struct internal_state FAR *) ds; +- zmemcpy(ds, ss, sizeof(deflate_state)); +- ds->strm = dest; +- +- ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); +- ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); +- ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); +- overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); +- ds->pending_buf = (uchf *) overlay; +- +- if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || +- ds->pending_buf == Z_NULL) { +- deflateEnd (dest); +- return Z_MEM_ERROR; +- } +- /* following zmemcpy do not work for 16-bit MSDOS */ +- zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); +- zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); +- zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); +- zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); +- +- ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); +- ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); +- ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; +- +- ds->l_desc.dyn_tree = ds->dyn_ltree; +- ds->d_desc.dyn_tree = ds->dyn_dtree; +- ds->bl_desc.dyn_tree = ds->bl_tree; +- +- return Z_OK; +-#endif /* MAXSEG_64K */ +-} +- +-/* =========================================================================== +- * Read a new buffer from the current input stream, update the adler32 +- * and total number of bytes read. All deflate() input goes through +- * this function so some applications may wish to modify it to avoid +- * allocating a large strm->next_in buffer and copying from it. +- * (See also flush_pending()). +- */ +-local int read_buf(strm, buf, size) +- z_streamp strm; +- Bytef *buf; +- unsigned size; +-{ +- unsigned len = strm->avail_in; +- +- if (len > size) len = size; +- if (len == 0) return 0; +- +- strm->avail_in -= len; +- +- if (strm->state->wrap == 1) { +- strm->adler = adler32(strm->adler, strm->next_in, len); +- } +-#ifdef GZIP +- else if (strm->state->wrap == 2) { +- strm->adler = crc32(strm->adler, strm->next_in, len); +- } +-#endif +- zmemcpy(buf, strm->next_in, len); +- strm->next_in += len; +- strm->total_in += len; +- +- return (int)len; +-} +- +-/* =========================================================================== +- * Initialize the "longest match" routines for a new zlib stream +- */ +-local void lm_init (s) +- deflate_state *s; +-{ +- s->window_size = (ulg)2L*s->w_size; +- +- CLEAR_HASH(s); +- +- /* Set the default configuration parameters: +- */ +- s->max_lazy_match = configuration_table[s->level].max_lazy; +- s->good_match = configuration_table[s->level].good_length; +- s->nice_match = configuration_table[s->level].nice_length; +- s->max_chain_length = configuration_table[s->level].max_chain; +- +- s->strstart = 0; +- s->block_start = 0L; +- s->lookahead = 0; +- s->match_length = s->prev_length = MIN_MATCH-1; +- s->match_available = 0; +- s->ins_h = 0; +-#ifndef FASTEST +-#ifdef ASMV +- match_init(); /* initialize the asm code */ +-#endif +-#endif +-} +- +-#ifndef FASTEST +-/* =========================================================================== +- * Set match_start to the longest match starting at the given string and +- * return its length. Matches shorter or equal to prev_length are discarded, +- * in which case the result is equal to prev_length and match_start is +- * garbage. +- * IN assertions: cur_match is the head of the hash chain for the current +- * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 +- * OUT assertion: the match length is not greater than s->lookahead. +- */ +-#ifndef ASMV +-/* For 80x86 and 680x0, an optimized version will be provided in match.asm or +- * match.S. The code will be functionally equivalent. +- */ +-local uInt longest_match(s, cur_match) +- deflate_state *s; +- IPos cur_match; /* current match */ +-{ +- unsigned chain_length = s->max_chain_length;/* max hash chain length */ +- register Bytef *scan = s->window + s->strstart; /* current string */ +- register Bytef *match; /* matched string */ +- register int len; /* length of current match */ +- int best_len = s->prev_length; /* best match length so far */ +- int nice_match = s->nice_match; /* stop if match long enough */ +- IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +- s->strstart - (IPos)MAX_DIST(s) : NIL; +- /* Stop when cur_match becomes <= limit. To simplify the code, +- * we prevent matches with the string of window index 0. +- */ +- Posf *prev = s->prev; +- uInt wmask = s->w_mask; +- +-#ifdef UNALIGNED_OK +- /* Compare two bytes at a time. Note: this is not always beneficial. +- * Try with and without -DUNALIGNED_OK to check. +- */ +- register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; +- register ush scan_start = *(ushf*)scan; +- register ush scan_end = *(ushf*)(scan+best_len-1); +-#else +- register Bytef *strend = s->window + s->strstart + MAX_MATCH; +- register Byte scan_end1 = scan[best_len-1]; +- register Byte scan_end = scan[best_len]; +-#endif +- +- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. +- * It is easy to get rid of this optimization if necessary. +- */ +- Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); +- +- /* Do not waste too much time if we already have a good match: */ +- if (s->prev_length >= s->good_match) { +- chain_length >>= 2; +- } +- /* Do not look for matches beyond the end of the input. This is necessary +- * to make deflate deterministic. +- */ +- if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; +- +- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); +- +- do { +- Assert(cur_match < s->strstart, "no future"); +- match = s->window + cur_match; +- +- /* Skip to next match if the match length cannot increase +- * or if the match length is less than 2. Note that the checks below +- * for insufficient lookahead only occur occasionally for performance +- * reasons. Therefore uninitialized memory will be accessed, and +- * conditional jumps will be made that depend on those values. +- * However the length of the match is limited to the lookahead, so +- * the output of deflate is not affected by the uninitialized values. +- */ +-#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) +- /* This code assumes sizeof(unsigned short) == 2. Do not use +- * UNALIGNED_OK if your compiler uses a different size. +- */ +- if (*(ushf*)(match+best_len-1) != scan_end || +- *(ushf*)match != scan_start) continue; +- +- /* It is not necessary to compare scan[2] and match[2] since they are +- * always equal when the other bytes match, given that the hash keys +- * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at +- * strstart+3, +5, ... up to strstart+257. We check for insufficient +- * lookahead only every 4th comparison; the 128th check will be made +- * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is +- * necessary to put more guard bytes at the end of the window, or +- * to check more often for insufficient lookahead. +- */ +- Assert(scan[2] == match[2], "scan[2]?"); +- scan++, match++; +- do { +- } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && +- *(ushf*)(scan+=2) == *(ushf*)(match+=2) && +- *(ushf*)(scan+=2) == *(ushf*)(match+=2) && +- *(ushf*)(scan+=2) == *(ushf*)(match+=2) && +- scan < strend); +- /* The funny "do {}" generates better code on most compilers */ +- +- /* Here, scan <= window+strstart+257 */ +- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); +- if (*scan == *match) scan++; +- +- len = (MAX_MATCH - 1) - (int)(strend-scan); +- scan = strend - (MAX_MATCH-1); +- +-#else /* UNALIGNED_OK */ +- +- if (match[best_len] != scan_end || +- match[best_len-1] != scan_end1 || +- *match != *scan || +- *++match != scan[1]) continue; +- +- /* The check at best_len-1 can be removed because it will be made +- * again later. (This heuristic is not always a win.) +- * It is not necessary to compare scan[2] and match[2] since they +- * are always equal when the other bytes match, given that +- * the hash keys are equal and that HASH_BITS >= 8. +- */ +- scan += 2, match++; +- Assert(*scan == *match, "match[2]?"); +- +- /* We check for insufficient lookahead only every 8th comparison; +- * the 256th check will be made at strstart+258. +- */ +- do { +- } while (*++scan == *++match && *++scan == *++match && +- *++scan == *++match && *++scan == *++match && +- *++scan == *++match && *++scan == *++match && +- *++scan == *++match && *++scan == *++match && +- scan < strend); +- +- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); +- +- len = MAX_MATCH - (int)(strend - scan); +- scan = strend - MAX_MATCH; +- +-#endif /* UNALIGNED_OK */ +- +- if (len > best_len) { +- s->match_start = cur_match; +- best_len = len; +- if (len >= nice_match) break; +-#ifdef UNALIGNED_OK +- scan_end = *(ushf*)(scan+best_len-1); +-#else +- scan_end1 = scan[best_len-1]; +- scan_end = scan[best_len]; +-#endif +- } +- } while ((cur_match = prev[cur_match & wmask]) > limit +- && --chain_length != 0); +- +- if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +- return s->lookahead; +-} +-#endif /* ASMV */ +- +-#else /* FASTEST */ +- +-/* --------------------------------------------------------------------------- +- * Optimized version for FASTEST only +- */ +-local uInt longest_match(s, cur_match) +- deflate_state *s; +- IPos cur_match; /* current match */ +-{ +- register Bytef *scan = s->window + s->strstart; /* current string */ +- register Bytef *match; /* matched string */ +- register int len; /* length of current match */ +- register Bytef *strend = s->window + s->strstart + MAX_MATCH; +- +- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. +- * It is easy to get rid of this optimization if necessary. +- */ +- Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); +- +- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); +- +- Assert(cur_match < s->strstart, "no future"); +- +- match = s->window + cur_match; +- +- /* Return failure if the match length is less than 2: +- */ +- if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; +- +- /* The check at best_len-1 can be removed because it will be made +- * again later. (This heuristic is not always a win.) +- * It is not necessary to compare scan[2] and match[2] since they +- * are always equal when the other bytes match, given that +- * the hash keys are equal and that HASH_BITS >= 8. +- */ +- scan += 2, match += 2; +- Assert(*scan == *match, "match[2]?"); +- +- /* We check for insufficient lookahead only every 8th comparison; +- * the 256th check will be made at strstart+258. +- */ +- do { +- } while (*++scan == *++match && *++scan == *++match && +- *++scan == *++match && *++scan == *++match && +- *++scan == *++match && *++scan == *++match && +- *++scan == *++match && *++scan == *++match && +- scan < strend); +- +- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); +- +- len = MAX_MATCH - (int)(strend - scan); +- +- if (len < MIN_MATCH) return MIN_MATCH - 1; +- +- s->match_start = cur_match; +- return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +-} +- +-#endif /* FASTEST */ +- +-#ifdef DEBUG +-/* =========================================================================== +- * Check that the match at match_start is indeed a match. +- */ +-local void check_match(s, start, match, length) +- deflate_state *s; +- IPos start, match; +- int length; +-{ +- /* check that the match is indeed a match */ +- if (zmemcmp(s->window + match, +- s->window + start, length) != EQUAL) { +- fprintf(stderr, " start %u, match %u, length %d\n", +- start, match, length); +- do { +- fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); +- } while (--length != 0); +- z_error("invalid match"); +- } +- if (z_verbose > 1) { +- fprintf(stderr,"\\[%d,%d]", start-match, length); +- do { putc(s->window[start++], stderr); } while (--length != 0); +- } +-} +-#else +-# define check_match(s, start, match, length) +-#endif /* DEBUG */ +- +-/* =========================================================================== +- * Fill the window when the lookahead becomes insufficient. +- * Updates strstart and lookahead. +- * +- * IN assertion: lookahead < MIN_LOOKAHEAD +- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD +- * At least one byte has been read, or avail_in == 0; reads are +- * performed for at least two bytes (required for the zip translate_eol +- * option -- not supported here). +- */ +-local void fill_window(s) +- deflate_state *s; +-{ +- register unsigned n, m; +- register Posf *p; +- unsigned more; /* Amount of free space at the end of the window. */ +- uInt wsize = s->w_size; +- +- do { +- more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); +- +- /* Deal with !@#$% 64K limit: */ +- if (sizeof(int) <= 2) { +- if (more == 0 && s->strstart == 0 && s->lookahead == 0) { +- more = wsize; +- +- } else if (more == (unsigned)(-1)) { +- /* Very unlikely, but possible on 16 bit machine if +- * strstart == 0 && lookahead == 1 (input done a byte at time) +- */ +- more--; +- } +- } +- +- /* If the window is almost full and there is insufficient lookahead, +- * move the upper half to the lower one to make room in the upper half. +- */ +- if (s->strstart >= wsize+MAX_DIST(s)) { +- +- zmemcpy(s->window, s->window+wsize, (unsigned)wsize); +- s->match_start -= wsize; +- s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ +- s->block_start -= (long) wsize; +- +- /* Slide the hash table (could be avoided with 32 bit values +- at the expense of memory usage). We slide even when level == 0 +- to keep the hash table consistent if we switch back to level > 0 +- later. (Using level 0 permanently is not an optimal usage of +- zlib, so we don't care about this pathological case.) +- */ +- n = s->hash_size; +- p = &s->head[n]; +- do { +- m = *--p; +- *p = (Pos)(m >= wsize ? m-wsize : NIL); +- } while (--n); +- +- n = wsize; +-#ifndef FASTEST +- p = &s->prev[n]; +- do { +- m = *--p; +- *p = (Pos)(m >= wsize ? m-wsize : NIL); +- /* If n is not on any hash chain, prev[n] is garbage but +- * its value will never be used. +- */ +- } while (--n); +-#endif +- more += wsize; +- } +- if (s->strm->avail_in == 0) return; +- +- /* If there was no sliding: +- * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && +- * more == window_size - lookahead - strstart +- * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) +- * => more >= window_size - 2*WSIZE + 2 +- * In the BIG_MEM or MMAP case (not yet supported), +- * window_size == input_size + MIN_LOOKAHEAD && +- * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. +- * Otherwise, window_size == 2*WSIZE so more >= 2. +- * If there was sliding, more >= WSIZE. So in all cases, more >= 2. +- */ +- Assert(more >= 2, "more < 2"); +- +- n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); +- s->lookahead += n; +- +- /* Initialize the hash value now that we have some input: */ +- if (s->lookahead >= MIN_MATCH) { +- s->ins_h = s->window[s->strstart]; +- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +-#if MIN_MATCH != 3 +- Call UPDATE_HASH() MIN_MATCH-3 more times +-#endif +- } +- /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, +- * but this is not important since only literal bytes will be emitted. +- */ +- +- } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); +- +- /* If the WIN_INIT bytes after the end of the current data have never been +- * written, then zero those bytes in order to avoid memory check reports of +- * the use of uninitialized (or uninitialised as Julian writes) bytes by +- * the longest match routines. Update the high water mark for the next +- * time through here. WIN_INIT is set to MAX_MATCH since the longest match +- * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. +- */ +- if (s->high_water < s->window_size) { +- ulg curr = s->strstart + (ulg)(s->lookahead); +- ulg init; +- +- if (s->high_water < curr) { +- /* Previous high water mark below current data -- zero WIN_INIT +- * bytes or up to end of window, whichever is less. +- */ +- init = s->window_size - curr; +- if (init > WIN_INIT) +- init = WIN_INIT; +- zmemzero(s->window + curr, (unsigned)init); +- s->high_water = curr + init; +- } +- else if (s->high_water < (ulg)curr + WIN_INIT) { +- /* High water mark at or above current data, but below current data +- * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up +- * to end of window, whichever is less. +- */ +- init = (ulg)curr + WIN_INIT - s->high_water; +- if (init > s->window_size - s->high_water) +- init = s->window_size - s->high_water; +- zmemzero(s->window + s->high_water, (unsigned)init); +- s->high_water += init; +- } +- } +-} +- +-/* =========================================================================== +- * Flush the current block, with given end-of-file flag. +- * IN assertion: strstart is set to the end of the current match. +- */ +-#define FLUSH_BLOCK_ONLY(s, last) { \ +- _tr_flush_block(s, (s->block_start >= 0L ? \ +- (charf *)&s->window[(unsigned)s->block_start] : \ +- (charf *)Z_NULL), \ +- (ulg)((long)s->strstart - s->block_start), \ +- (last)); \ +- s->block_start = s->strstart; \ +- flush_pending(s->strm); \ +- Tracev((stderr,"[FLUSH]")); \ +-} +- +-/* Same but force premature exit if necessary. */ +-#define FLUSH_BLOCK(s, last) { \ +- FLUSH_BLOCK_ONLY(s, last); \ +- if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +-} +- +-/* =========================================================================== +- * Copy without compression as much as possible from the input stream, return +- * the current block state. +- * This function does not insert new strings in the dictionary since +- * uncompressible data is probably not useful. This function is used +- * only for the level=0 compression option. +- * NOTE: this function should be optimized to avoid extra copying from +- * window to pending_buf. +- */ +-local block_state deflate_stored(s, flush) +- deflate_state *s; +- int flush; +-{ +- /* Stored blocks are limited to 0xffff bytes, pending_buf is limited +- * to pending_buf_size, and each stored block has a 5 byte header: +- */ +- ulg max_block_size = 0xffff; +- ulg max_start; +- +- if (max_block_size > s->pending_buf_size - 5) { +- max_block_size = s->pending_buf_size - 5; +- } +- +- /* Copy as much as possible from input to output: */ +- for (;;) { +- /* Fill the window as much as possible: */ +- if (s->lookahead <= 1) { +- +- Assert(s->strstart < s->w_size+MAX_DIST(s) || +- s->block_start >= (long)s->w_size, "slide too late"); +- +- fill_window(s); +- if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; +- +- if (s->lookahead == 0) break; /* flush the current block */ +- } +- Assert(s->block_start >= 0L, "block gone"); +- +- s->strstart += s->lookahead; +- s->lookahead = 0; +- +- /* Emit a stored block if pending_buf will be full: */ +- max_start = s->block_start + max_block_size; +- if (s->strstart == 0 || (ulg)s->strstart >= max_start) { +- /* strstart == 0 is possible when wraparound on 16-bit machine */ +- s->lookahead = (uInt)(s->strstart - max_start); +- s->strstart = (uInt)max_start; +- FLUSH_BLOCK(s, 0); +- } +- /* Flush if we may have to slide, otherwise block_start may become +- * negative and the data will be gone: +- */ +- if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { +- FLUSH_BLOCK(s, 0); +- } +- } +- FLUSH_BLOCK(s, flush == Z_FINISH); +- return flush == Z_FINISH ? finish_done : block_done; +-} +- +-/* =========================================================================== +- * Compress as much as possible from the input stream, return the current +- * block state. +- * This function does not perform lazy evaluation of matches and inserts +- * new strings in the dictionary only for unmatched strings or for short +- * matches. It is used only for the fast compression options. +- */ +-local block_state deflate_fast(s, flush) +- deflate_state *s; +- int flush; +-{ +- IPos hash_head; /* head of the hash chain */ +- int bflush; /* set if current block must be flushed */ +- +- for (;;) { +- /* Make sure that we always have enough lookahead, except +- * at the end of the input file. We need MAX_MATCH bytes +- * for the next match, plus MIN_MATCH bytes to insert the +- * string following the next match. +- */ +- if (s->lookahead < MIN_LOOKAHEAD) { +- fill_window(s); +- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { +- return need_more; +- } +- if (s->lookahead == 0) break; /* flush the current block */ +- } +- +- /* Insert the string window[strstart .. strstart+2] in the +- * dictionary, and set hash_head to the head of the hash chain: +- */ +- hash_head = NIL; +- if (s->lookahead >= MIN_MATCH) { +- INSERT_STRING(s, s->strstart, hash_head); +- } +- +- /* Find the longest match, discarding those <= prev_length. +- * At this point we have always match_length < MIN_MATCH +- */ +- if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { +- /* To simplify the code, we prevent matches with the string +- * of window index 0 (in particular we have to avoid a match +- * of the string with itself at the start of the input file). +- */ +- s->match_length = longest_match (s, hash_head); +- /* longest_match() sets match_start */ +- } +- if (s->match_length >= MIN_MATCH) { +- check_match(s, s->strstart, s->match_start, s->match_length); +- +- _tr_tally_dist(s, s->strstart - s->match_start, +- s->match_length - MIN_MATCH, bflush); +- +- s->lookahead -= s->match_length; +- +- /* Insert new strings in the hash table only if the match length +- * is not too large. This saves time but degrades compression. +- */ +-#ifndef FASTEST +- if (s->match_length <= s->max_insert_length && +- s->lookahead >= MIN_MATCH) { +- s->match_length--; /* string at strstart already in table */ +- do { +- s->strstart++; +- INSERT_STRING(s, s->strstart, hash_head); +- /* strstart never exceeds WSIZE-MAX_MATCH, so there are +- * always MIN_MATCH bytes ahead. +- */ +- } while (--s->match_length != 0); +- s->strstart++; +- } else +-#endif +- { +- s->strstart += s->match_length; +- s->match_length = 0; +- s->ins_h = s->window[s->strstart]; +- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +-#if MIN_MATCH != 3 +- Call UPDATE_HASH() MIN_MATCH-3 more times +-#endif +- /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not +- * matter since it will be recomputed at next deflate call. +- */ +- } +- } else { +- /* No match, output a literal byte */ +- Tracevv((stderr,"%c", s->window[s->strstart])); +- _tr_tally_lit (s, s->window[s->strstart], bflush); +- s->lookahead--; +- s->strstart++; +- } +- if (bflush) FLUSH_BLOCK(s, 0); +- } +- FLUSH_BLOCK(s, flush == Z_FINISH); +- return flush == Z_FINISH ? finish_done : block_done; +-} +- +-#ifndef FASTEST +-/* =========================================================================== +- * Same as above, but achieves better compression. We use a lazy +- * evaluation for matches: a match is finally adopted only if there is +- * no better match at the next window position. +- */ +-local block_state deflate_slow(s, flush) +- deflate_state *s; +- int flush; +-{ +- IPos hash_head; /* head of hash chain */ +- int bflush; /* set if current block must be flushed */ +- +- /* Process the input block. */ +- for (;;) { +- /* Make sure that we always have enough lookahead, except +- * at the end of the input file. We need MAX_MATCH bytes +- * for the next match, plus MIN_MATCH bytes to insert the +- * string following the next match. +- */ +- if (s->lookahead < MIN_LOOKAHEAD) { +- fill_window(s); +- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { +- return need_more; +- } +- if (s->lookahead == 0) break; /* flush the current block */ +- } +- +- /* Insert the string window[strstart .. strstart+2] in the +- * dictionary, and set hash_head to the head of the hash chain: +- */ +- hash_head = NIL; +- if (s->lookahead >= MIN_MATCH) { +- INSERT_STRING(s, s->strstart, hash_head); +- } +- +- /* Find the longest match, discarding those <= prev_length. +- */ +- s->prev_length = s->match_length, s->prev_match = s->match_start; +- s->match_length = MIN_MATCH-1; +- +- if (hash_head != NIL && s->prev_length < s->max_lazy_match && +- s->strstart - hash_head <= MAX_DIST(s)) { +- /* To simplify the code, we prevent matches with the string +- * of window index 0 (in particular we have to avoid a match +- * of the string with itself at the start of the input file). +- */ +- s->match_length = longest_match (s, hash_head); +- /* longest_match() sets match_start */ +- +- if (s->match_length <= 5 && (s->strategy == Z_FILTERED +-#if TOO_FAR <= 32767 +- || (s->match_length == MIN_MATCH && +- s->strstart - s->match_start > TOO_FAR) +-#endif +- )) { +- +- /* If prev_match is also MIN_MATCH, match_start is garbage +- * but we will ignore the current match anyway. +- */ +- s->match_length = MIN_MATCH-1; +- } +- } +- /* If there was a match at the previous step and the current +- * match is not better, output the previous match: +- */ +- if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { +- uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; +- /* Do not insert strings in hash table beyond this. */ +- +- check_match(s, s->strstart-1, s->prev_match, s->prev_length); +- +- _tr_tally_dist(s, s->strstart -1 - s->prev_match, +- s->prev_length - MIN_MATCH, bflush); +- +- /* Insert in hash table all strings up to the end of the match. +- * strstart-1 and strstart are already inserted. If there is not +- * enough lookahead, the last two strings are not inserted in +- * the hash table. +- */ +- s->lookahead -= s->prev_length-1; +- s->prev_length -= 2; +- do { +- if (++s->strstart <= max_insert) { +- INSERT_STRING(s, s->strstart, hash_head); +- } +- } while (--s->prev_length != 0); +- s->match_available = 0; +- s->match_length = MIN_MATCH-1; +- s->strstart++; +- +- if (bflush) FLUSH_BLOCK(s, 0); +- +- } else if (s->match_available) { +- /* If there was no match at the previous position, output a +- * single literal. If there was a match but the current match +- * is longer, truncate the previous match to a single literal. +- */ +- Tracevv((stderr,"%c", s->window[s->strstart-1])); +- _tr_tally_lit(s, s->window[s->strstart-1], bflush); +- if (bflush) { +- FLUSH_BLOCK_ONLY(s, 0); +- } +- s->strstart++; +- s->lookahead--; +- if (s->strm->avail_out == 0) return need_more; +- } else { +- /* There is no previous match to compare with, wait for +- * the next step to decide. +- */ +- s->match_available = 1; +- s->strstart++; +- s->lookahead--; +- } +- } +- Assert (flush != Z_NO_FLUSH, "no flush?"); +- if (s->match_available) { +- Tracevv((stderr,"%c", s->window[s->strstart-1])); +- _tr_tally_lit(s, s->window[s->strstart-1], bflush); +- s->match_available = 0; +- } +- FLUSH_BLOCK(s, flush == Z_FINISH); +- return flush == Z_FINISH ? finish_done : block_done; +-} +-#endif /* FASTEST */ +- +-/* =========================================================================== +- * For Z_RLE, simply look for runs of bytes, generate matches only of distance +- * one. Do not maintain a hash table. (It will be regenerated if this run of +- * deflate switches away from Z_RLE.) +- */ +-local block_state deflate_rle(s, flush) +- deflate_state *s; +- int flush; +-{ +- int bflush; /* set if current block must be flushed */ +- uInt prev; /* byte at distance one to match */ +- Bytef *scan, *strend; /* scan goes up to strend for length of run */ +- +- for (;;) { +- /* Make sure that we always have enough lookahead, except +- * at the end of the input file. We need MAX_MATCH bytes +- * for the longest encodable run. +- */ +- if (s->lookahead < MAX_MATCH) { +- fill_window(s); +- if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { +- return need_more; +- } +- if (s->lookahead == 0) break; /* flush the current block */ +- } +- +- /* See how many times the previous byte repeats */ +- s->match_length = 0; +- if (s->lookahead >= MIN_MATCH && s->strstart > 0) { +- scan = s->window + s->strstart - 1; +- prev = *scan; +- if (prev == *++scan && prev == *++scan && prev == *++scan) { +- strend = s->window + s->strstart + MAX_MATCH; +- do { +- } while (prev == *++scan && prev == *++scan && +- prev == *++scan && prev == *++scan && +- prev == *++scan && prev == *++scan && +- prev == *++scan && prev == *++scan && +- scan < strend); +- s->match_length = MAX_MATCH - (int)(strend - scan); +- if (s->match_length > s->lookahead) +- s->match_length = s->lookahead; +- } +- } +- +- /* Emit match if have run of MIN_MATCH or longer, else emit literal */ +- if (s->match_length >= MIN_MATCH) { +- check_match(s, s->strstart, s->strstart - 1, s->match_length); +- +- _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); +- +- s->lookahead -= s->match_length; +- s->strstart += s->match_length; +- s->match_length = 0; +- } else { +- /* No match, output a literal byte */ +- Tracevv((stderr,"%c", s->window[s->strstart])); +- _tr_tally_lit (s, s->window[s->strstart], bflush); +- s->lookahead--; +- s->strstart++; +- } +- if (bflush) FLUSH_BLOCK(s, 0); +- } +- FLUSH_BLOCK(s, flush == Z_FINISH); +- return flush == Z_FINISH ? finish_done : block_done; +-} +- +-/* =========================================================================== +- * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. +- * (It will be regenerated if this run of deflate switches away from Huffman.) +- */ +-local block_state deflate_huff(s, flush) +- deflate_state *s; +- int flush; +-{ +- int bflush; /* set if current block must be flushed */ +- +- for (;;) { +- /* Make sure that we have a literal to write. */ +- if (s->lookahead == 0) { +- fill_window(s); +- if (s->lookahead == 0) { +- if (flush == Z_NO_FLUSH) +- return need_more; +- break; /* flush the current block */ +- } +- } +- +- /* Output a literal byte */ +- s->match_length = 0; +- Tracevv((stderr,"%c", s->window[s->strstart])); +- _tr_tally_lit (s, s->window[s->strstart], bflush); +- s->lookahead--; +- s->strstart++; +- if (bflush) FLUSH_BLOCK(s, 0); +- } +- FLUSH_BLOCK(s, flush == Z_FINISH); +- return flush == Z_FINISH ? finish_done : block_done; +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/deflate.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/deflate.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,366 +0,0 @@ +-/* +- * 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. +- */ +- +-/* deflate.h -- internal compression state +- * Copyright (C) 1995-2010 Jean-loup Gailly +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-/* @(#) $Id$ */ +- +-#ifndef DEFLATE_H +-#define DEFLATE_H +- +-#include "zutil.h" +- +-/* define NO_GZIP when compiling if you want to disable gzip header and +- trailer creation by deflate(). NO_GZIP would be used to avoid linking in +- the crc code when it is not needed. For shared libraries, gzip encoding +- should be left enabled. */ +-#ifndef NO_GZIP +-# define GZIP +-#endif +- +-/* =========================================================================== +- * Internal compression state. +- */ +- +-#define LENGTH_CODES 29 +-/* number of length codes, not counting the special END_BLOCK code */ +- +-#define LITERALS 256 +-/* number of literal bytes 0..255 */ +- +-#define L_CODES (LITERALS+1+LENGTH_CODES) +-/* number of Literal or Length codes, including the END_BLOCK code */ +- +-#define D_CODES 30 +-/* number of distance codes */ +- +-#define BL_CODES 19 +-/* number of codes used to transfer the bit lengths */ +- +-#define HEAP_SIZE (2*L_CODES+1) +-/* maximum heap size */ +- +-#define MAX_BITS 15 +-/* All codes must not exceed MAX_BITS bits */ +- +-#define INIT_STATE 42 +-#define EXTRA_STATE 69 +-#define NAME_STATE 73 +-#define COMMENT_STATE 91 +-#define HCRC_STATE 103 +-#define BUSY_STATE 113 +-#define FINISH_STATE 666 +-/* Stream status */ +- +- +-/* Data structure describing a single value and its code string. */ +-typedef struct ct_data_s { +- union { +- ush freq; /* frequency count */ +- ush code; /* bit string */ +- } fc; +- union { +- ush dad; /* father node in Huffman tree */ +- ush len; /* length of bit string */ +- } dl; +-} FAR ct_data; +- +-#define Freq fc.freq +-#define Code fc.code +-#define Dad dl.dad +-#define Len dl.len +- +-typedef struct static_tree_desc_s static_tree_desc; +- +-typedef struct tree_desc_s { +- ct_data *dyn_tree; /* the dynamic tree */ +- int max_code; /* largest code with non zero frequency */ +- static_tree_desc *stat_desc; /* the corresponding static tree */ +-} FAR tree_desc; +- +-typedef ush Pos; +-typedef Pos FAR Posf; +-typedef unsigned IPos; +- +-/* A Pos is an index in the character window. We use short instead of int to +- * save space in the various tables. IPos is used only for parameter passing. +- */ +- +-typedef struct internal_state { +- z_streamp strm; /* pointer back to this zlib stream */ +- int status; /* as the name implies */ +- Bytef *pending_buf; /* output still pending */ +- ulg pending_buf_size; /* size of pending_buf */ +- Bytef *pending_out; /* next pending byte to output to the stream */ +- uInt pending; /* nb of bytes in the pending buffer */ +- int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ +- gz_headerp gzhead; /* gzip header information to write */ +- uInt gzindex; /* where in extra, name, or comment */ +- Byte method; /* STORED (for zip only) or DEFLATED */ +- int last_flush; /* value of flush param for previous deflate call */ +- +- /* used by deflate.c: */ +- +- uInt w_size; /* LZ77 window size (32K by default) */ +- uInt w_bits; /* log2(w_size) (8..16) */ +- uInt w_mask; /* w_size - 1 */ +- +- Bytef *window; +- /* Sliding window. Input bytes are read into the second half of the window, +- * and move to the first half later to keep a dictionary of at least wSize +- * bytes. With this organization, matches are limited to a distance of +- * wSize-MAX_MATCH bytes, but this ensures that IO is always +- * performed with a length multiple of the block size. Also, it limits +- * the window size to 64K, which is quite useful on MSDOS. +- * To do: use the user input buffer as sliding window. +- */ +- +- ulg window_size; +- /* Actual size of window: 2*wSize, except when the user input buffer +- * is directly used as sliding window. +- */ +- +- Posf *prev; +- /* Link to older string with same hash index. To limit the size of this +- * array to 64K, this link is maintained only for the last 32K strings. +- * An index in this array is thus a window index modulo 32K. +- */ +- +- Posf *head; /* Heads of the hash chains or NIL. */ +- +- uInt ins_h; /* hash index of string to be inserted */ +- uInt hash_size; /* number of elements in hash table */ +- uInt hash_bits; /* log2(hash_size) */ +- uInt hash_mask; /* hash_size-1 */ +- +- uInt hash_shift; +- /* Number of bits by which ins_h must be shifted at each input +- * step. It must be such that after MIN_MATCH steps, the oldest +- * byte no longer takes part in the hash key, that is: +- * hash_shift * MIN_MATCH >= hash_bits +- */ +- +- long block_start; +- /* Window position at the beginning of the current output block. Gets +- * negative when the window is moved backwards. +- */ +- +- uInt match_length; /* length of best match */ +- IPos prev_match; /* previous match */ +- int match_available; /* set if previous match exists */ +- uInt strstart; /* start of string to insert */ +- uInt match_start; /* start of matching string */ +- uInt lookahead; /* number of valid bytes ahead in window */ +- +- uInt prev_length; +- /* Length of the best match at previous step. Matches not greater than this +- * are discarded. This is used in the lazy match evaluation. +- */ +- +- uInt max_chain_length; +- /* To speed up deflation, hash chains are never searched beyond this +- * length. A higher limit improves compression ratio but degrades the +- * speed. +- */ +- +- uInt max_lazy_match; +- /* Attempt to find a better match only when the current match is strictly +- * smaller than this value. This mechanism is used only for compression +- * levels >= 4. +- */ +-# define max_insert_length max_lazy_match +- /* Insert new strings in the hash table only if the match length is not +- * greater than this length. This saves time but degrades compression. +- * max_insert_length is used only for compression levels <= 3. +- */ +- +- int level; /* compression level (1..9) */ +- int strategy; /* favor or force Huffman coding*/ +- +- uInt good_match; +- /* Use a faster search when the previous match is longer than this */ +- +- int nice_match; /* Stop searching when current match exceeds this */ +- +- /* used by trees.c: */ +- /* Didn't use ct_data typedef below to supress compiler warning */ +- struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ +- struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ +- struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ +- +- struct tree_desc_s l_desc; /* desc. for literal tree */ +- struct tree_desc_s d_desc; /* desc. for distance tree */ +- struct tree_desc_s bl_desc; /* desc. for bit length tree */ +- +- ush bl_count[MAX_BITS+1]; +- /* number of codes at each bit length for an optimal tree */ +- +- int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ +- int heap_len; /* number of elements in the heap */ +- int heap_max; /* element of largest frequency */ +- /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. +- * The same heap array is used to build all trees. +- */ +- +- uch depth[2*L_CODES+1]; +- /* Depth of each subtree used as tie breaker for trees of equal frequency +- */ +- +- uchf *l_buf; /* buffer for literals or lengths */ +- +- uInt lit_bufsize; +- /* Size of match buffer for literals/lengths. There are 4 reasons for +- * limiting lit_bufsize to 64K: +- * - frequencies can be kept in 16 bit counters +- * - if compression is not successful for the first block, all input +- * data is still in the window so we can still emit a stored block even +- * when input comes from standard input. (This can also be done for +- * all blocks if lit_bufsize is not greater than 32K.) +- * - if compression is not successful for a file smaller than 64K, we can +- * even emit a stored file instead of a stored block (saving 5 bytes). +- * This is applicable only for zip (not gzip or zlib). +- * - creating new Huffman trees less frequently may not provide fast +- * adaptation to changes in the input data statistics. (Take for +- * example a binary file with poorly compressible code followed by +- * a highly compressible string table.) Smaller buffer sizes give +- * fast adaptation but have of course the overhead of transmitting +- * trees more frequently. +- * - I can't count above 4 +- */ +- +- uInt last_lit; /* running index in l_buf */ +- +- ushf *d_buf; +- /* Buffer for distances. To simplify the code, d_buf and l_buf have +- * the same number of elements. To use different lengths, an extra flag +- * array would be necessary. +- */ +- +- ulg opt_len; /* bit length of current block with optimal trees */ +- ulg static_len; /* bit length of current block with static trees */ +- uInt matches; /* number of string matches in current block */ +- int last_eob_len; /* bit length of EOB code for last block */ +- +-#ifdef DEBUG +- ulg compressed_len; /* total bit length of compressed file mod 2^32 */ +- ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +-#endif +- +- ush bi_buf; +- /* Output buffer. bits are inserted starting at the bottom (least +- * significant bits). +- */ +- int bi_valid; +- /* Number of valid bits in bi_buf. All bits above the last valid bit +- * are always zero. +- */ +- +- ulg high_water; +- /* High water mark offset in window for initialized bytes -- bytes above +- * this are set to zero in order to avoid memory check warnings when +- * longest match routines access bytes past the input. This is then +- * updated to the new high water mark. +- */ +- +-} FAR deflate_state; +- +-/* Output a byte on the stream. +- * IN assertion: there is enough room in pending_buf. +- */ +-#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} +- +- +-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +-/* Minimum amount of lookahead, except at the end of the input file. +- * See deflate.c for comments about the MIN_MATCH+1. +- */ +- +-#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +-/* In order to simplify the code, particularly on 16 bit machines, match +- * distances are limited to MAX_DIST instead of WSIZE. +- */ +- +-#define WIN_INIT MAX_MATCH +-/* Number of bytes after end of data in window to initialize in order to avoid +- memory checker errors from longest match routines */ +- +- /* in trees.c */ +-void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +-int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +-void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, +- ulg stored_len, int last)); +-void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +-void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, +- ulg stored_len, int last)); +- +-#define d_code(dist) \ +- ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +-/* Mapping from a distance to a distance code. dist is the distance - 1 and +- * must not have side effects. _dist_code[256] and _dist_code[257] are never +- * used. +- */ +- +-#ifndef DEBUG +-/* Inline versions of _tr_tally for speed: */ +- +-#if defined(GEN_TREES_H) || !defined(STDC) +- extern uch ZLIB_INTERNAL _length_code[]; +- extern uch ZLIB_INTERNAL _dist_code[]; +-#else +- extern const uch ZLIB_INTERNAL _length_code[]; +- extern const uch ZLIB_INTERNAL _dist_code[]; +-#endif +- +-# define _tr_tally_lit(s, c, flush) \ +- { uch cc = (c); \ +- s->d_buf[s->last_lit] = 0; \ +- s->l_buf[s->last_lit++] = cc; \ +- s->dyn_ltree[cc].Freq++; \ +- flush = (s->last_lit == s->lit_bufsize-1); \ +- } +-# define _tr_tally_dist(s, distance, length, flush) \ +- { uch len = (length); \ +- ush dist = (distance); \ +- s->d_buf[s->last_lit] = dist; \ +- s->l_buf[s->last_lit++] = len; \ +- dist--; \ +- s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ +- s->dyn_dtree[d_code(dist)].Freq++; \ +- flush = (s->last_lit == s->lit_bufsize-1); \ +- } +-#else +-# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +-# define _tr_tally_dist(s, distance, length, flush) \ +- flush = _tr_tally(s, distance, length) +-#endif +- +-#endif /* DEFLATE_H */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzclose.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzclose.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,49 +0,0 @@ +-/* +- * 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. +- */ +- +-/* gzclose.c -- zlib gzclose() function +- * Copyright (C) 2004, 2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include "gzguts.h" +- +-/* gzclose() is in a separate file so that it is linked in only if it is used. +- That way the other gzclose functions can be used instead to avoid linking in +- unneeded compression or decompression routines. */ +-int ZEXPORT gzclose(file) +- gzFile file; +-{ +-#ifndef NO_GZCOMPRESS +- gz_statep state; +- +- if (file == NULL) +- return Z_STREAM_ERROR; +- state = (gz_statep)file; +- +- return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +-#else +- return gzclose_r(file); +-#endif +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzguts.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzguts.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,156 +0,0 @@ +-/* +- * 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. +- */ +- +-/* gzguts.h -- zlib internal header definitions for gz* operations +- * Copyright (C) 2004, 2005, 2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#ifdef _LARGEFILE64_SOURCE +-# ifndef _LARGEFILE_SOURCE +-# define _LARGEFILE_SOURCE 1 +-# endif +-# ifdef _FILE_OFFSET_BITS +-# undef _FILE_OFFSET_BITS +-# endif +-#endif +- +-#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +-# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +-#else +-# define ZLIB_INTERNAL +-#endif +- +-#include <stdio.h> +-#include "zlib.h" +-#ifdef STDC +-# include <string.h> +-# include <stdlib.h> +-# include <limits.h> +-#endif +-#include <fcntl.h> +- +-#ifdef NO_DEFLATE /* for compatibility with old definition */ +-# define NO_GZCOMPRESS +-#endif +- +-#ifdef _MSC_VER +-# include <io.h> +-# define vsnprintf _vsnprintf +-#endif +- +-#ifndef local +-# define local static +-#endif +-/* compile with -Dlocal if your debugger can't find static symbols */ +- +-/* gz* functions always use library allocation functions */ +-#ifndef STDC +- extern voidp malloc OF((uInt size)); +- extern void free OF((voidpf ptr)); +-#endif +- +-/* get errno and strerror definition */ +-#if defined UNDER_CE +-# include <windows.h> +-# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +-#else +-# ifdef STDC +-# include <errno.h> +-# define zstrerror() strerror(errno) +-# else +-# define zstrerror() "stdio error (consult errno)" +-# endif +-#endif +- +-/* provide prototypes for these when building zlib without LFS */ +-#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 +- ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); +- ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); +- ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); +- ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +-#endif +- +-/* default i/o buffer size -- double this for output when reading */ +-#define GZBUFSIZE 8192 +- +-/* gzip modes, also provide a little integrity check on the passed structure */ +-#define GZ_NONE 0 +-#define GZ_READ 7247 +-#define GZ_WRITE 31153 +-#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ +- +-/* values for gz_state how */ +-#define LOOK 0 /* look for a gzip header */ +-#define COPY 1 /* copy input directly */ +-#define GZIP 2 /* decompress a gzip stream */ +- +-/* internal gzip file state data structure */ +-typedef struct { +- /* used for both reading and writing */ +- int mode; /* see gzip modes above */ +- int fd; /* file descriptor */ +- char *path; /* path or fd for error messages */ +- z_off64_t pos; /* current position in uncompressed data */ +- unsigned size; /* buffer size, zero if not allocated yet */ +- unsigned want; /* requested buffer size, default is GZBUFSIZE */ +- unsigned char *in; /* input buffer */ +- unsigned char *out; /* output buffer (double-sized when reading) */ +- unsigned char *next; /* next output data to deliver or write */ +- /* just for reading */ +- unsigned have; /* amount of output data unused at next */ +- int eof; /* true if end of input file reached */ +- z_off64_t start; /* where the gzip data started, for rewinding */ +- z_off64_t raw; /* where the raw data started, for seeking */ +- int how; /* 0: get header, 1: copy, 2: decompress */ +- int direct; /* true if last read direct, false if gzip */ +- /* just for writing */ +- int level; /* compression level */ +- int strategy; /* compression strategy */ +- /* seek request */ +- z_off64_t skip; /* amount to skip (already rewound if backwards) */ +- int seek; /* true if seek request pending */ +- /* error information */ +- int err; /* error code */ +- char *msg; /* error message */ +- /* zlib inflate or deflate stream */ +- z_stream strm; /* stream structure in-place (not a pointer) */ +-} gz_state; +-typedef gz_state FAR *gz_statep; +- +-/* shared functions */ +-void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +-#if defined UNDER_CE +-char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +-#endif +- +-/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t +- value -- needed when comparing unsigned to z_off64_t, which is signed +- (possible z_off64_t types off_t, off64_t, and long are all signed) */ +-#ifdef INT_MAX +-# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +-#else +-unsigned ZLIB_INTERNAL gz_intmax OF((void)); +-# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +-#endif +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzlib.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzlib.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,561 +0,0 @@ +-/* +- * 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. +- */ +- +-/* +- * Copyright (C) 2004, 2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include "gzguts.h" +- +-#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +-# define LSEEK lseek64 +-#else +-# define LSEEK lseek +-#endif +- +-/* Local functions */ +-local void gz_reset OF((gz_statep)); +-local gzFile gz_open OF((const char *, int, const char *)); +- +-#if defined UNDER_CE +- +-/* Map the Windows error number in ERROR to a locale-dependent error message +- string and return a pointer to it. Typically, the values for ERROR come +- from GetLastError. +- +- The string pointed to shall not be modified by the application, but may be +- overwritten by a subsequent call to gz_strwinerror +- +- The gz_strwinerror function does not change the current setting of +- GetLastError. */ +-char ZLIB_INTERNAL *gz_strwinerror (error) +- DWORD error; +-{ +- static char buf[1024]; +- +- wchar_t *msgbuf; +- DWORD lasterr = GetLastError(); +- DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM +- | FORMAT_MESSAGE_ALLOCATE_BUFFER, +- NULL, +- error, +- 0, /* Default language */ +- (LPVOID)&msgbuf, +- 0, +- NULL); +- if (chars != 0) { +- /* If there is an \r\n appended, zap it. */ +- if (chars >= 2 +- && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { +- chars -= 2; +- msgbuf[chars] = 0; +- } +- +- if (chars > sizeof (buf) - 1) { +- chars = sizeof (buf) - 1; +- msgbuf[chars] = 0; +- } +- +- wcstombs(buf, msgbuf, chars + 1); +- LocalFree(msgbuf); +- } +- else { +- sprintf(buf, "unknown win32 error (%ld)", error); +- } +- +- SetLastError(lasterr); +- return buf; +-} +- +-#endif /* UNDER_CE */ +- +-/* Reset gzip file state */ +-local void gz_reset(state) +- gz_statep state; +-{ +- if (state->mode == GZ_READ) { /* for reading ... */ +- state->have = 0; /* no output data available */ +- state->eof = 0; /* not at end of file */ +- state->how = LOOK; /* look for gzip header */ +- state->direct = 1; /* default for empty file */ +- } +- state->seek = 0; /* no seek request pending */ +- gz_error(state, Z_OK, NULL); /* clear error */ +- state->pos = 0; /* no uncompressed data yet */ +- state->strm.avail_in = 0; /* no input data yet */ +-} +- +-/* Open a gzip file either by name or file descriptor. */ +-local gzFile gz_open(path, fd, mode) +- const char *path; +- int fd; +- const char *mode; +-{ +- gz_statep state; +- +- /* allocate gzFile structure to return */ +- state = malloc(sizeof(gz_state)); +- if (state == NULL) +- return NULL; +- state->size = 0; /* no buffers allocated yet */ +- state->want = GZBUFSIZE; /* requested buffer size */ +- state->msg = NULL; /* no error message yet */ +- +- /* interpret mode */ +- state->mode = GZ_NONE; +- state->level = Z_DEFAULT_COMPRESSION; +- state->strategy = Z_DEFAULT_STRATEGY; +- while (*mode) { +- if (*mode >= '0' && *mode <= '9') +- state->level = *mode - '0'; +- else +- switch (*mode) { +- case 'r': +- state->mode = GZ_READ; +- break; +-#ifndef NO_GZCOMPRESS +- case 'w': +- state->mode = GZ_WRITE; +- break; +- case 'a': +- state->mode = GZ_APPEND; +- break; +-#endif +- case '+': /* can't read and write at the same time */ +- free(state); +- return NULL; +- case 'b': /* ignore -- will request binary anyway */ +- break; +- case 'f': +- state->strategy = Z_FILTERED; +- break; +- case 'h': +- state->strategy = Z_HUFFMAN_ONLY; +- break; +- case 'R': +- state->strategy = Z_RLE; +- break; +- case 'F': +- state->strategy = Z_FIXED; +- default: /* could consider as an error, but just ignore */ +- ; +- } +- mode++; +- } +- +- /* must provide an "r", "w", or "a" */ +- if (state->mode == GZ_NONE) { +- free(state); +- return NULL; +- } +- +- /* save the path name for error messages */ +- state->path = malloc(strlen(path) + 1); +- if (state->path == NULL) { +- free(state); +- return NULL; +- } +- strcpy(state->path, path); +- +- /* open the file with the appropriate mode (or just use fd) */ +- state->fd = fd != -1 ? fd : +- open(path, +-#ifdef O_LARGEFILE +- O_LARGEFILE | +-#endif +-#ifdef O_BINARY +- O_BINARY | +-#endif +- (state->mode == GZ_READ ? +- O_RDONLY : +- (O_WRONLY | O_CREAT | ( +- state->mode == GZ_WRITE ? +- O_TRUNC : +- O_APPEND))), +- 0666); +- if (state->fd == -1) { +- free(state->path); +- free(state); +- return NULL; +- } +- if (state->mode == GZ_APPEND) +- state->mode = GZ_WRITE; /* simplify later checks */ +- +- /* save the current position for rewinding (only if reading) */ +- if (state->mode == GZ_READ) { +- state->start = LSEEK(state->fd, 0, SEEK_CUR); +- if (state->start == -1) state->start = 0; +- } +- +- /* initialize stream */ +- gz_reset(state); +- +- /* return stream */ +- return (gzFile)state; +-} +- +-/* -- see zlib.h -- */ +-gzFile ZEXPORT gzopen(path, mode) +- const char *path; +- const char *mode; +-{ +- return gz_open(path, -1, mode); +-} +- +-/* -- see zlib.h -- */ +-gzFile ZEXPORT gzopen64(path, mode) +- const char *path; +- const char *mode; +-{ +- return gz_open(path, -1, mode); +-} +- +-/* -- see zlib.h -- */ +-gzFile ZEXPORT gzdopen(fd, mode) +- int fd; +- const char *mode; +-{ +- char *path; /* identifier for error messages */ +- gzFile gz; +- +- if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL) +- return NULL; +- sprintf(path, "<fd:%d>", fd); /* for debugging */ +- gz = gz_open(path, fd, mode); +- free(path); +- return gz; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzbuffer(file, size) +- gzFile file; +- unsigned size; +-{ +- gz_statep state; +- +- /* get internal structure and check integrity */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- if (state->mode != GZ_READ && state->mode != GZ_WRITE) +- return -1; +- +- /* make sure we haven't already allocated memory */ +- if (state->size != 0) +- return -1; +- +- /* check and set requested size */ +- if (size == 0) +- return -1; +- state->want = size; +- return 0; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzrewind(file) +- gzFile file; +-{ +- gz_statep state; +- +- /* get internal structure */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- +- /* check that we're reading and that there's no error */ +- if (state->mode != GZ_READ || state->err != Z_OK) +- return -1; +- +- /* back up and start over */ +- if (LSEEK(state->fd, state->start, SEEK_SET) == -1) +- return -1; +- gz_reset(state); +- return 0; +-} +- +-/* -- see zlib.h -- */ +-z_off64_t ZEXPORT gzseek64(file, offset, whence) +- gzFile file; +- z_off64_t offset; +- int whence; +-{ +- unsigned n; +- z_off64_t ret; +- gz_statep state; +- +- /* get internal structure and check integrity */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- if (state->mode != GZ_READ && state->mode != GZ_WRITE) +- return -1; +- +- /* check that there's no error */ +- if (state->err != Z_OK) +- return -1; +- +- /* can only seek from start or relative to current position */ +- if (whence != SEEK_SET && whence != SEEK_CUR) +- return -1; +- +- /* normalize offset to a SEEK_CUR specification */ +- if (whence == SEEK_SET) +- offset -= state->pos; +- else if (state->seek) +- offset += state->skip; +- state->seek = 0; +- +- /* if within raw area while reading, just go there */ +- if (state->mode == GZ_READ && state->how == COPY && +- state->pos + offset >= state->raw) { +- ret = LSEEK(state->fd, offset - state->have, SEEK_CUR); +- if (ret == -1) +- return -1; +- state->have = 0; +- state->eof = 0; +- state->seek = 0; +- gz_error(state, Z_OK, NULL); +- state->strm.avail_in = 0; +- state->pos += offset; +- return state->pos; +- } +- +- /* calculate skip amount, rewinding if needed for back seek when reading */ +- if (offset < 0) { +- if (state->mode != GZ_READ) /* writing -- can't go backwards */ +- return -1; +- offset += state->pos; +- if (offset < 0) /* before start of file! */ +- return -1; +- if (gzrewind(file) == -1) /* rewind, then skip to offset */ +- return -1; +- } +- +- /* if reading, skip what's in output buffer (one less gzgetc() check) */ +- if (state->mode == GZ_READ) { +- n = GT_OFF(state->have) || (z_off64_t)state->have > offset ? +- (unsigned)offset : state->have; +- state->have -= n; +- state->next += n; +- state->pos += n; +- offset -= n; +- } +- +- /* request skip (if not zero) */ +- if (offset) { +- state->seek = 1; +- state->skip = offset; +- } +- return state->pos + offset; +-} +- +-/* -- see zlib.h -- */ +-z_off_t ZEXPORT gzseek(file, offset, whence) +- gzFile file; +- z_off_t offset; +- int whence; +-{ +- z_off64_t ret; +- +- ret = gzseek64(file, (z_off64_t)offset, whence); +- return ret == (z_off_t)ret ? (z_off_t)ret : -1; +-} +- +-/* -- see zlib.h -- */ +-z_off64_t ZEXPORT gztell64(file) +- gzFile file; +-{ +- gz_statep state; +- +- /* get internal structure and check integrity */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- if (state->mode != GZ_READ && state->mode != GZ_WRITE) +- return -1; +- +- /* return position */ +- return state->pos + (state->seek ? state->skip : 0); +-} +- +-/* -- see zlib.h -- */ +-z_off_t ZEXPORT gztell(file) +- gzFile file; +-{ +- z_off64_t ret; +- +- ret = gztell64(file); +- return ret == (z_off_t)ret ? (z_off_t)ret : -1; +-} +- +-/* -- see zlib.h -- */ +-z_off64_t ZEXPORT gzoffset64(file) +- gzFile file; +-{ +- z_off64_t offset; +- gz_statep state; +- +- /* get internal structure and check integrity */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- if (state->mode != GZ_READ && state->mode != GZ_WRITE) +- return -1; +- +- /* compute and return effective offset in file */ +- offset = LSEEK(state->fd, 0, SEEK_CUR); +- if (offset == -1) +- return -1; +- if (state->mode == GZ_READ) /* reading */ +- offset -= state->strm.avail_in; /* don't count buffered input */ +- return offset; +-} +- +-/* -- see zlib.h -- */ +-z_off_t ZEXPORT gzoffset(file) +- gzFile file; +-{ +- z_off64_t ret; +- +- ret = gzoffset64(file); +- return ret == (z_off_t)ret ? (z_off_t)ret : -1; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzeof(file) +- gzFile file; +-{ +- gz_statep state; +- +- /* get internal structure and check integrity */ +- if (file == NULL) +- return 0; +- state = (gz_statep)file; +- if (state->mode != GZ_READ && state->mode != GZ_WRITE) +- return 0; +- +- /* return end-of-file state */ +- return state->mode == GZ_READ ? +- (state->eof && state->strm.avail_in == 0 && state->have == 0) : 0; +-} +- +-/* -- see zlib.h -- */ +-const char * ZEXPORT gzerror(file, errnum) +- gzFile file; +- int *errnum; +-{ +- gz_statep state; +- +- /* get internal structure and check integrity */ +- if (file == NULL) +- return NULL; +- state = (gz_statep)file; +- if (state->mode != GZ_READ && state->mode != GZ_WRITE) +- return NULL; +- +- /* return error information */ +- if (errnum != NULL) +- *errnum = state->err; +- return state->msg == NULL ? "" : state->msg; +-} +- +-/* -- see zlib.h -- */ +-void ZEXPORT gzclearerr(file) +- gzFile file; +-{ +- gz_statep state; +- +- /* get internal structure and check integrity */ +- if (file == NULL) +- return; +- state = (gz_statep)file; +- if (state->mode != GZ_READ && state->mode != GZ_WRITE) +- return; +- +- /* clear error and end-of-file */ +- if (state->mode == GZ_READ) +- state->eof = 0; +- gz_error(state, Z_OK, NULL); +-} +- +-/* Create an error message in allocated memory and set state->err and +- state->msg accordingly. Free any previous error message already there. Do +- not try to free or allocate space if the error is Z_MEM_ERROR (out of +- memory). Simply save the error message as a static string. If there is an +- allocation failure constructing the error message, then convert the error to +- out of memory. */ +-void ZLIB_INTERNAL gz_error(state, err, msg) +- gz_statep state; +- int err; +- const char *msg; +-{ +- /* free previously allocated message and clear */ +- if (state->msg != NULL) { +- if (state->err != Z_MEM_ERROR) +- free(state->msg); +- state->msg = NULL; +- } +- +- /* set error code, and if no message, then done */ +- state->err = err; +- if (msg == NULL) +- return; +- +- /* for an out of memory error, save as static string */ +- if (err == Z_MEM_ERROR) { +- state->msg = (char *)msg; +- return; +- } +- +- /* construct error message with path */ +- if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { +- state->err = Z_MEM_ERROR; +- state->msg = (char *)"out of memory"; +- return; +- } +- strcpy(state->msg, state->path); +- strcat(state->msg, ": "); +- strcat(state->msg, msg); +- return; +-} +- +-#ifndef INT_MAX +-/* portably return maximum value for an int (when limits.h presumed not +- available) -- we need to do this to cover cases where 2's complement not +- used, since C standard permits 1's complement and sign-bit representations, +- otherwise we could just use ((unsigned)-1) >> 1 */ +-unsigned ZLIB_INTERNAL gz_intmax() +-{ +- unsigned p, q; +- +- p = 1; +- do { +- q = p; +- p <<= 1; +- p++; +- } while (p > q); +- return q >> 1; +-} +-#endif +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzread.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzread.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,677 +0,0 @@ +-/* +- * 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. +- */ +- +-/* gzread.c -- zlib functions for reading gzip files +- * Copyright (C) 2004, 2005, 2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include "gzguts.h" +- +-/* Local functions */ +-local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +-local int gz_avail OF((gz_statep)); +-local int gz_next4 OF((gz_statep, unsigned long *)); +-local int gz_head OF((gz_statep)); +-local int gz_decomp OF((gz_statep)); +-local int gz_make OF((gz_statep)); +-local int gz_skip OF((gz_statep, z_off64_t)); +- +-/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from +- state->fd, and update state->eof, state->err, and state->msg as appropriate. +- This function needs to loop on read(), since read() is not guaranteed to +- read the number of bytes requested, depending on the type of descriptor. */ +-local int gz_load(state, buf, len, have) +- gz_statep state; +- unsigned char *buf; +- unsigned len; +- unsigned *have; +-{ +- int ret; +- +- *have = 0; +- do { +- ret = read(state->fd, buf + *have, len - *have); +- if (ret <= 0) +- break; +- *have += ret; +- } while (*have < len); +- if (ret < 0) { +- gz_error(state, Z_ERRNO, zstrerror()); +- return -1; +- } +- if (ret == 0) +- state->eof = 1; +- return 0; +-} +- +-/* Load up input buffer and set eof flag if last data loaded -- return -1 on +- error, 0 otherwise. Note that the eof flag is set when the end of the input +- file is reached, even though there may be unused data in the buffer. Once +- that data has been used, no more attempts will be made to read the file. +- gz_avail() assumes that strm->avail_in == 0. */ +-local int gz_avail(state) +- gz_statep state; +-{ +- z_streamp strm = &(state->strm); +- +- if (state->err != Z_OK) +- return -1; +- if (state->eof == 0) { +- if (gz_load(state, state->in, state->size, +- (unsigned *)&(strm->avail_in)) == -1) +- return -1; +- strm->next_in = state->in; +- } +- return 0; +-} +- +-/* Get next byte from input, or -1 if end or error. */ +-#define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \ +- (strm->avail_in == 0 ? -1 : \ +- (strm->avail_in--, *(strm->next_in)++))) +- +-/* Get a four-byte little-endian integer and return 0 on success and the value +- in *ret. Otherwise -1 is returned and *ret is not modified. */ +-local int gz_next4(state, ret) +- gz_statep state; +- unsigned long *ret; +-{ +- int ch; +- unsigned long val; +- z_streamp strm = &(state->strm); +- +- val = NEXT(); +- val += (unsigned)NEXT() << 8; +- val += (unsigned long)NEXT() << 16; +- ch = NEXT(); +- if (ch == -1) +- return -1; +- val += (unsigned long)ch << 24; +- *ret = val; +- return 0; +-} +- +-/* Look for gzip header, set up for inflate or copy. state->have must be zero. +- If this is the first time in, allocate required memory. state->how will be +- left unchanged if there is no more input data available, will be set to COPY +- if there is no gzip header and direct copying will be performed, or it will +- be set to GZIP for decompression, and the gzip header will be skipped so +- that the next available input data is the raw deflate stream. If direct +- copying, then leftover input data from the input buffer will be copied to +- the output buffer. In that case, all further file reads will be directly to +- either the output buffer or a user buffer. If decompressing, the inflate +- state and the check value will be initialized. gz_head() will return 0 on +- success or -1 on failure. Failures may include read errors or gzip header +- errors. */ +-local int gz_head(state) +- gz_statep state; +-{ +- z_streamp strm = &(state->strm); +- int flags; +- unsigned len; +- +- /* allocate read buffers and inflate memory */ +- if (state->size == 0) { +- /* allocate buffers */ +- state->in = malloc(state->want); +- state->out = malloc(state->want << 1); +- if (state->in == NULL || state->out == NULL) { +- if (state->out != NULL) +- free(state->out); +- if (state->in != NULL) +- free(state->in); +- gz_error(state, Z_MEM_ERROR, "out of memory"); +- return -1; +- } +- state->size = state->want; +- +- /* allocate inflate memory */ +- state->strm.zalloc = Z_NULL; +- state->strm.zfree = Z_NULL; +- state->strm.opaque = Z_NULL; +- state->strm.avail_in = 0; +- state->strm.next_in = Z_NULL; +- if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */ +- free(state->out); +- free(state->in); +- state->size = 0; +- gz_error(state, Z_MEM_ERROR, "out of memory"); +- return -1; +- } +- } +- +- /* get some data in the input buffer */ +- if (strm->avail_in == 0) { +- if (gz_avail(state) == -1) +- return -1; +- if (strm->avail_in == 0) +- return 0; +- } +- +- /* look for the gzip magic header bytes 31 and 139 */ +- if (strm->next_in[0] == 31) { +- strm->avail_in--; +- strm->next_in++; +- if (strm->avail_in == 0 && gz_avail(state) == -1) +- return -1; +- if (strm->avail_in && strm->next_in[0] == 139) { +- /* we have a gzip header, woo hoo! */ +- strm->avail_in--; +- strm->next_in++; +- +- /* skip rest of header */ +- if (NEXT() != 8) { /* compression method */ +- gz_error(state, Z_DATA_ERROR, "unknown compression method"); +- return -1; +- } +- flags = NEXT(); +- if (flags & 0xe0) { /* reserved flag bits */ +- gz_error(state, Z_DATA_ERROR, "unknown header flags set"); +- return -1; +- } +- NEXT(); /* modification time */ +- NEXT(); +- NEXT(); +- NEXT(); +- NEXT(); /* extra flags */ +- NEXT(); /* operating system */ +- if (flags & 4) { /* extra field */ +- len = (unsigned)NEXT(); +- len += (unsigned)NEXT() << 8; +- while (len--) +- if (NEXT() < 0) +- break; +- } +- if (flags & 8) /* file name */ +- while (NEXT() > 0) +- ; +- if (flags & 16) /* comment */ +- while (NEXT() > 0) +- ; +- if (flags & 2) { /* header crc */ +- NEXT(); +- NEXT(); +- } +- /* an unexpected end of file is not checked for here -- it will be +- noticed on the first request for uncompressed data */ +- +- /* set up for decompression */ +- inflateReset(strm); +- strm->adler = crc32(0L, Z_NULL, 0); +- state->how = GZIP; +- state->direct = 0; +- return 0; +- } +- else { +- /* not a gzip file -- save first byte (31) and fall to raw i/o */ +- state->out[0] = 31; +- state->have = 1; +- } +- } +- +- /* doing raw i/o, save start of raw data for seeking, copy any leftover +- input to output -- this assumes that the output buffer is larger than +- the input buffer, which also assures space for gzungetc() */ +- state->raw = state->pos; +- state->next = state->out; +- if (strm->avail_in) { +- memcpy(state->next + state->have, strm->next_in, strm->avail_in); +- state->have += strm->avail_in; +- strm->avail_in = 0; +- } +- state->how = COPY; +- state->direct = 1; +- return 0; +-} +- +-/* Decompress from input to the provided next_out and avail_out in the state. +- If the end of the compressed data is reached, then verify the gzip trailer +- check value and length (modulo 2^32). state->have and state->next are set +- to point to the just decompressed data, and the crc is updated. If the +- trailer is verified, state->how is reset to LOOK to look for the next gzip +- stream or raw data, once state->have is depleted. Returns 0 on success, -1 +- on failure. Failures may include invalid compressed data or a failed gzip +- trailer verification. */ +-local int gz_decomp(state) +- gz_statep state; +-{ +- int ret; +- unsigned had; +- unsigned long crc, len; +- z_streamp strm = &(state->strm); +- +- /* fill output buffer up to end of deflate stream */ +- had = strm->avail_out; +- do { +- /* get more input for inflate() */ +- if (strm->avail_in == 0 && gz_avail(state) == -1) +- return -1; +- if (strm->avail_in == 0) { +- gz_error(state, Z_DATA_ERROR, "unexpected end of file"); +- return -1; +- } +- +- /* decompress and handle errors */ +- ret = inflate(strm, Z_NO_FLUSH); +- if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { +- gz_error(state, Z_STREAM_ERROR, +- "internal error: inflate stream corrupt"); +- return -1; +- } +- if (ret == Z_MEM_ERROR) { +- gz_error(state, Z_MEM_ERROR, "out of memory"); +- return -1; +- } +- if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ +- gz_error(state, Z_DATA_ERROR, +- strm->msg == NULL ? "compressed data error" : strm->msg); +- return -1; +- } +- } while (strm->avail_out && ret != Z_STREAM_END); +- +- /* update available output and crc check value */ +- state->have = had - strm->avail_out; +- state->next = strm->next_out - state->have; +- strm->adler = crc32(strm->adler, state->next, state->have); +- +- /* check gzip trailer if at end of deflate stream */ +- if (ret == Z_STREAM_END) { +- if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { +- gz_error(state, Z_DATA_ERROR, "unexpected end of file"); +- return -1; +- } +- if (crc != strm->adler) { +- gz_error(state, Z_DATA_ERROR, "incorrect data check"); +- return -1; +- } +- if (len != (strm->total_out & 0xffffffffL)) { +- gz_error(state, Z_DATA_ERROR, "incorrect length check"); +- return -1; +- } +- state->how = LOOK; /* ready for next stream, once have is 0 (leave +- state->direct unchanged to remember how) */ +- } +- +- /* good decompression */ +- return 0; +-} +- +-/* Make data and put in the output buffer. Assumes that state->have == 0. +- Data is either copied from the input file or decompressed from the input +- file depending on state->how. If state->how is LOOK, then a gzip header is +- looked for (and skipped if found) to determine wither to copy or decompress. +- Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY +- or GZIP unless the end of the input file has been reached and all data has +- been processed. */ +-local int gz_make(state) +- gz_statep state; +-{ +- z_streamp strm = &(state->strm); +- +- if (state->how == LOOK) { /* look for gzip header */ +- if (gz_head(state) == -1) +- return -1; +- if (state->have) /* got some data from gz_head() */ +- return 0; +- } +- if (state->how == COPY) { /* straight copy */ +- if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1) +- return -1; +- state->next = state->out; +- } +- else if (state->how == GZIP) { /* decompress */ +- strm->avail_out = state->size << 1; +- strm->next_out = state->out; +- if (gz_decomp(state) == -1) +- return -1; +- } +- return 0; +-} +- +-/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +-local int gz_skip(state, len) +- gz_statep state; +- z_off64_t len; +-{ +- unsigned n; +- +- /* skip over len bytes or reach end-of-file, whichever comes first */ +- while (len) +- /* skip over whatever is in output buffer */ +- if (state->have) { +- n = GT_OFF(state->have) || (z_off64_t)state->have > len ? +- (unsigned)len : state->have; +- state->have -= n; +- state->next += n; +- state->pos += n; +- len -= n; +- } +- +- /* output buffer empty -- return if we're at the end of the input */ +- else if (state->eof && state->strm.avail_in == 0) +- break; +- +- /* need more data to skip -- load up output buffer */ +- else { +- /* get more output, looking for header if required */ +- if (gz_make(state) == -1) +- return -1; +- } +- return 0; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzread(file, buf, len) +- gzFile file; +- voidp buf; +- unsigned len; +-{ +- unsigned got, n; +- gz_statep state; +- z_streamp strm; +- +- /* get internal structure */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- strm = &(state->strm); +- +- /* check that we're reading and that there's no error */ +- if (state->mode != GZ_READ || state->err != Z_OK) +- return -1; +- +- /* since an int is returned, make sure len fits in one, otherwise return +- with an error (this avoids the flaw in the interface) */ +- if ((int)len < 0) { +- gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); +- return -1; +- } +- +- /* if len is zero, avoid unnecessary operations */ +- if (len == 0) +- return 0; +- +- /* process a skip request */ +- if (state->seek) { +- state->seek = 0; +- if (gz_skip(state, state->skip) == -1) +- return -1; +- } +- +- /* get len bytes to buf, or less than len if at the end */ +- got = 0; +- do { +- /* first just try copying data from the output buffer */ +- if (state->have) { +- n = state->have > len ? len : state->have; +- memcpy(buf, state->next, n); +- state->next += n; +- state->have -= n; +- } +- +- /* output buffer empty -- return if we're at the end of the input */ +- else if (state->eof && strm->avail_in == 0) +- break; +- +- /* need output data -- for small len or new stream load up our output +- buffer */ +- else if (state->how == LOOK || len < (state->size << 1)) { +- /* get more output, looking for header if required */ +- if (gz_make(state) == -1) +- return -1; +- continue; /* no progress yet -- go back to memcpy() above */ +- /* the copy above assures that we will leave with space in the +- output buffer, allowing at least one gzungetc() to succeed */ +- } +- +- /* large len -- read directly into user buffer */ +- else if (state->how == COPY) { /* read directly */ +- if (gz_load(state, buf, len, &n) == -1) +- return -1; +- } +- +- /* large len -- decompress directly into user buffer */ +- else { /* state->how == GZIP */ +- strm->avail_out = len; +- strm->next_out = buf; +- if (gz_decomp(state) == -1) +- return -1; +- n = state->have; +- state->have = 0; +- } +- +- /* update progress */ +- len -= n; +- buf = (char *)buf + n; +- got += n; +- state->pos += n; +- } while (len); +- +- /* return number of bytes read into user buffer (will fit in int) */ +- return (int)got; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzgetc(file) +- gzFile file; +-{ +- int ret; +- unsigned char buf[1]; +- gz_statep state; +- +- /* get internal structure */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- +- /* check that we're reading and that there's no error */ +- if (state->mode != GZ_READ || state->err != Z_OK) +- return -1; +- +- /* try output buffer (no need to check for skip request) */ +- if (state->have) { +- state->have--; +- state->pos++; +- return *(state->next)++; +- } +- +- /* nothing there -- try gzread() */ +- ret = gzread(file, buf, 1); +- return ret < 1 ? -1 : buf[0]; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzungetc(c, file) +- int c; +- gzFile file; +-{ +- gz_statep state; +- +- /* get internal structure */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- +- /* check that we're reading and that there's no error */ +- if (state->mode != GZ_READ || state->err != Z_OK) +- return -1; +- +- /* process a skip request */ +- if (state->seek) { +- state->seek = 0; +- if (gz_skip(state, state->skip) == -1) +- return -1; +- } +- +- /* can't push EOF */ +- if (c < 0) +- return -1; +- +- /* if output buffer empty, put byte at end (allows more pushing) */ +- if (state->have == 0) { +- state->have = 1; +- state->next = state->out + (state->size << 1) - 1; +- state->next[0] = c; +- state->pos--; +- return c; +- } +- +- /* if no room, give up (must have already done a gzungetc()) */ +- if (state->have == (state->size << 1)) { +- gz_error(state, Z_BUF_ERROR, "out of room to push characters"); +- return -1; +- } +- +- /* slide output data if needed and insert byte before existing data */ +- if (state->next == state->out) { +- unsigned char *src = state->out + state->have; +- unsigned char *dest = state->out + (state->size << 1); +- while (src > state->out) +- *--dest = *--src; +- state->next = dest; +- } +- state->have++; +- state->next--; +- state->next[0] = c; +- state->pos--; +- return c; +-} +- +-/* -- see zlib.h -- */ +-char * ZEXPORT gzgets(file, buf, len) +- gzFile file; +- char *buf; +- int len; +-{ +- unsigned left, n; +- char *str; +- unsigned char *eol; +- gz_statep state; +- +- /* check parameters and get internal structure */ +- if (file == NULL || buf == NULL || len < 1) +- return NULL; +- state = (gz_statep)file; +- +- /* check that we're reading and that there's no error */ +- if (state->mode != GZ_READ || state->err != Z_OK) +- return NULL; +- +- /* process a skip request */ +- if (state->seek) { +- state->seek = 0; +- if (gz_skip(state, state->skip) == -1) +- return NULL; +- } +- +- /* copy output bytes up to new line or len - 1, whichever comes first -- +- append a terminating zero to the string (we don't check for a zero in +- the contents, let the user worry about that) */ +- str = buf; +- left = (unsigned)len - 1; +- if (left) do { +- /* assure that something is in the output buffer */ +- if (state->have == 0) { +- if (gz_make(state) == -1) +- return NULL; /* error */ +- if (state->have == 0) { /* end of file */ +- if (buf == str) /* got bupkus */ +- return NULL; +- break; /* got something -- return it */ +- } +- } +- +- /* look for end-of-line in current output buffer */ +- n = state->have > left ? left : state->have; +- eol = memchr(state->next, '\n', n); +- if (eol != NULL) +- n = (unsigned)(eol - state->next) + 1; +- +- /* copy through end-of-line, or remainder if not found */ +- memcpy(buf, state->next, n); +- state->have -= n; +- state->next += n; +- state->pos += n; +- left -= n; +- buf += n; +- } while (left && eol == NULL); +- +- /* found end-of-line or out of space -- terminate string and return it */ +- buf[0] = 0; +- return str; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzdirect(file) +- gzFile file; +-{ +- gz_statep state; +- +- /* get internal structure */ +- if (file == NULL) +- return 0; +- state = (gz_statep)file; +- +- /* check that we're reading */ +- if (state->mode != GZ_READ) +- return 0; +- +- /* if the state is not known, but we can find out, then do so (this is +- mainly for right after a gzopen() or gzdopen()) */ +- if (state->how == LOOK && state->have == 0) +- (void)gz_head(state); +- +- /* return 1 if reading direct, 0 if decompressing a gzip stream */ +- return state->direct; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzclose_r(file) +- gzFile file; +-{ +- int ret; +- gz_statep state; +- +- /* get internal structure */ +- if (file == NULL) +- return Z_STREAM_ERROR; +- state = (gz_statep)file; +- +- /* check that we're reading */ +- if (state->mode != GZ_READ) +- return Z_STREAM_ERROR; +- +- /* free memory and close file */ +- if (state->size) { +- inflateEnd(&(state->strm)); +- free(state->out); +- free(state->in); +- } +- gz_error(state, Z_OK, NULL); +- free(state->path); +- ret = close(state->fd); +- free(state); +- return ret ? Z_ERRNO : Z_OK; +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzwrite.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/gzwrite.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,555 +0,0 @@ +-/* +- * 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. +- */ +- +-/* gzwrite.c -- zlib functions for writing gzip files +- * Copyright (C) 2004, 2005, 2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include "gzguts.h" +- +-/* Local functions */ +-local int gz_init OF((gz_statep)); +-local int gz_comp OF((gz_statep, int)); +-local int gz_zero OF((gz_statep, z_off64_t)); +- +-/* Initialize state for writing a gzip file. Mark initialization by setting +- state->size to non-zero. Return -1 on failure or 0 on success. */ +-local int gz_init(state) +- gz_statep state; +-{ +- int ret; +- z_streamp strm = &(state->strm); +- +- /* allocate input and output buffers */ +- state->in = malloc(state->want); +- state->out = malloc(state->want); +- if (state->in == NULL || state->out == NULL) { +- if (state->out != NULL) +- free(state->out); +- if (state->in != NULL) +- free(state->in); +- gz_error(state, Z_MEM_ERROR, "out of memory"); +- return -1; +- } +- +- /* allocate deflate memory, set up for gzip compression */ +- strm->zalloc = Z_NULL; +- strm->zfree = Z_NULL; +- strm->opaque = Z_NULL; +- ret = deflateInit2(strm, state->level, Z_DEFLATED, +- 15 + 16, 8, state->strategy); +- if (ret != Z_OK) { +- free(state->in); +- gz_error(state, Z_MEM_ERROR, "out of memory"); +- return -1; +- } +- +- /* mark state as initialized */ +- state->size = state->want; +- +- /* initialize write buffer */ +- strm->avail_out = state->size; +- strm->next_out = state->out; +- state->next = strm->next_out; +- return 0; +-} +- +-/* Compress whatever is at avail_in and next_in and write to the output file. +- Return -1 if there is an error writing to the output file, otherwise 0. +- flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, +- then the deflate() state is reset to start a new gzip stream. */ +-local int gz_comp(state, flush) +- gz_statep state; +- int flush; +-{ +- int ret, got; +- unsigned have; +- z_streamp strm = &(state->strm); +- +- /* allocate memory if this is the first time through */ +- if (state->size == 0 && gz_init(state) == -1) +- return -1; +- +- /* run deflate() on provided input until it produces no more output */ +- ret = Z_OK; +- do { +- /* write out current buffer contents if full, or if flushing, but if +- doing Z_FINISH then don't write until we get to Z_STREAM_END */ +- if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && +- (flush != Z_FINISH || ret == Z_STREAM_END))) { +- have = (unsigned)(strm->next_out - state->next); +- if (have && ((got = write(state->fd, state->next, have)) < 0 || +- (unsigned)got != have)) { +- gz_error(state, Z_ERRNO, zstrerror()); +- return -1; +- } +- if (strm->avail_out == 0) { +- strm->avail_out = state->size; +- strm->next_out = state->out; +- } +- state->next = strm->next_out; +- } +- +- /* compress */ +- have = strm->avail_out; +- ret = deflate(strm, flush); +- if (ret == Z_STREAM_ERROR) { +- gz_error(state, Z_STREAM_ERROR, +- "internal error: deflate stream corrupt"); +- return -1; +- } +- have -= strm->avail_out; +- } while (have); +- +- /* if that completed a deflate stream, allow another to start */ +- if (flush == Z_FINISH) +- deflateReset(strm); +- +- /* all done, no errors */ +- return 0; +-} +- +-/* Compress len zeros to output. Return -1 on error, 0 on success. */ +-local int gz_zero(state, len) +- gz_statep state; +- z_off64_t len; +-{ +- int first; +- unsigned n; +- z_streamp strm = &(state->strm); +- +- /* consume whatever's left in the input buffer */ +- if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) +- return -1; +- +- /* compress len zeros (len guaranteed > 0) */ +- first = 1; +- while (len) { +- n = GT_OFF(state->size) || (z_off64_t)state->size > len ? +- (unsigned)len : state->size; +- if (first) { +- memset(state->in, 0, n); +- first = 0; +- } +- strm->avail_in = n; +- strm->next_in = state->in; +- state->pos += n; +- if (gz_comp(state, Z_NO_FLUSH) == -1) +- return -1; +- len -= n; +- } +- return 0; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzwrite(file, buf, len) +- gzFile file; +- voidpc buf; +- unsigned len; +-{ +- unsigned put = len; +- unsigned n; +- gz_statep state; +- z_streamp strm; +- +- /* get internal structure */ +- if (file == NULL) +- return 0; +- state = (gz_statep)file; +- strm = &(state->strm); +- +- /* check that we're writing and that there's no error */ +- if (state->mode != GZ_WRITE || state->err != Z_OK) +- return 0; +- +- /* since an int is returned, make sure len fits in one, otherwise return +- with an error (this avoids the flaw in the interface) */ +- if ((int)len < 0) { +- gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); +- return 0; +- } +- +- /* if len is zero, avoid unnecessary operations */ +- if (len == 0) +- return 0; +- +- /* allocate memory if this is the first time through */ +- if (state->size == 0 && gz_init(state) == -1) +- return 0; +- +- /* check for seek request */ +- if (state->seek) { +- state->seek = 0; +- if (gz_zero(state, state->skip) == -1) +- return 0; +- } +- +- /* for small len, copy to input buffer, otherwise compress directly */ +- if (len < state->size) { +- /* copy to input buffer, compress when full */ +- do { +- if (strm->avail_in == 0) +- strm->next_in = state->in; +- n = state->size - strm->avail_in; +- if (n > len) +- n = len; +- memcpy(strm->next_in + strm->avail_in, buf, n); +- strm->avail_in += n; +- state->pos += n; +- buf = (char *)buf + n; +- len -= n; +- if (len && gz_comp(state, Z_NO_FLUSH) == -1) +- return 0; +- } while (len); +- } +- else { +- /* consume whatever's left in the input buffer */ +- if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) +- return 0; +- +- /* directly compress user buffer to file */ +- strm->avail_in = len; +- strm->next_in = (voidp)buf; +- state->pos += len; +- if (gz_comp(state, Z_NO_FLUSH) == -1) +- return 0; +- } +- +- /* input was all buffered or compressed (put will fit in int) */ +- return (int)put; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzputc(file, c) +- gzFile file; +- int c; +-{ +- unsigned char buf[1]; +- gz_statep state; +- z_streamp strm; +- +- /* get internal structure */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- strm = &(state->strm); +- +- /* check that we're writing and that there's no error */ +- if (state->mode != GZ_WRITE || state->err != Z_OK) +- return -1; +- +- /* check for seek request */ +- if (state->seek) { +- state->seek = 0; +- if (gz_zero(state, state->skip) == -1) +- return -1; +- } +- +- /* try writing to input buffer for speed (state->size == 0 if buffer not +- initialized) */ +- if (strm->avail_in < state->size) { +- if (strm->avail_in == 0) +- strm->next_in = state->in; +- strm->next_in[strm->avail_in++] = c; +- state->pos++; +- return c; +- } +- +- /* no room in buffer or not initialized, use gz_write() */ +- buf[0] = c; +- if (gzwrite(file, buf, 1) != 1) +- return -1; +- return c; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzputs(file, str) +- gzFile file; +- const char *str; +-{ +- int ret; +- unsigned len; +- +- /* write string */ +- len = (unsigned)strlen(str); +- ret = gzwrite(file, str, len); +- return ret == 0 && len != 0 ? -1 : ret; +-} +- +-#ifdef STDC +-#include <stdarg.h> +- +-/* -- see zlib.h -- */ +-int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) +-{ +- int size, len; +- gz_statep state; +- z_streamp strm; +- va_list va; +- +- /* get internal structure */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- strm = &(state->strm); +- +- /* check that we're writing and that there's no error */ +- if (state->mode != GZ_WRITE || state->err != Z_OK) +- return 0; +- +- /* make sure we have some buffer space */ +- if (state->size == 0 && gz_init(state) == -1) +- return 0; +- +- /* check for seek request */ +- if (state->seek) { +- state->seek = 0; +- if (gz_zero(state, state->skip) == -1) +- return 0; +- } +- +- /* consume whatever's left in the input buffer */ +- if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) +- return 0; +- +- /* do the printf() into the input buffer, put length in len */ +- size = (int)(state->size); +- state->in[size - 1] = 0; +- va_start(va, format); +-#ifdef NO_vsnprintf +-# ifdef HAS_vsprintf_void +- (void)vsprintf(state->in, format, va); +- va_end(va); +- for (len = 0; len < size; len++) +- if (state->in[len] == 0) break; +-# else +- len = vsprintf(state->in, format, va); +- va_end(va); +-# endif +-#else +-# ifdef HAS_vsnprintf_void +- (void)vsnprintf(state->in, size, format, va); +- va_end(va); +- len = strlen(state->in); +-# else +- len = vsnprintf((char *)(state->in), size, format, va); +- va_end(va); +-# endif +-#endif +- +- /* check that printf() results fit in buffer */ +- if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) +- return 0; +- +- /* update buffer and position, defer compression until needed */ +- strm->avail_in = (unsigned)len; +- strm->next_in = state->in; +- state->pos += len; +- return len; +-} +- +-#else /* !STDC */ +- +-/* -- see zlib.h -- */ +-int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, +- a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) +- gzFile file; +- const char *format; +- int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, +- a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +-{ +- int size, len; +- gz_statep state; +- z_streamp strm; +- +- /* get internal structure */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- strm = &(state->strm); +- +- /* check that we're writing and that there's no error */ +- if (state->mode != GZ_WRITE || state->err != Z_OK) +- return 0; +- +- /* make sure we have some buffer space */ +- if (state->size == 0 && gz_init(state) == -1) +- return 0; +- +- /* check for seek request */ +- if (state->seek) { +- state->seek = 0; +- if (gz_zero(state, state->skip) == -1) +- return 0; +- } +- +- /* consume whatever's left in the input buffer */ +- if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) +- return 0; +- +- /* do the printf() into the input buffer, put length in len */ +- size = (int)(state->size); +- state->in[size - 1] = 0; +-#ifdef NO_snprintf +-# ifdef HAS_sprintf_void +- sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, +- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +- for (len = 0; len < size; len++) +- if (state->in[len] == 0) break; +-# else +- len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, +- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +-# endif +-#else +-# ifdef HAS_snprintf_void +- snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, +- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +- len = strlen(state->in); +-# else +- len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, +- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +-# endif +-#endif +- +- /* check that printf() results fit in buffer */ +- if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) +- return 0; +- +- /* update buffer and position, defer compression until needed */ +- strm->avail_in = (unsigned)len; +- strm->next_in = state->in; +- state->pos += len; +- return len; +-} +- +-#endif +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzflush(file, flush) +- gzFile file; +- int flush; +-{ +- gz_statep state; +- +- /* get internal structure */ +- if (file == NULL) +- return -1; +- state = (gz_statep)file; +- +- /* check that we're writing and that there's no error */ +- if (state->mode != GZ_WRITE || state->err != Z_OK) +- return Z_STREAM_ERROR; +- +- /* check flush parameter */ +- if (flush < 0 || flush > Z_FINISH) +- return Z_STREAM_ERROR; +- +- /* check for seek request */ +- if (state->seek) { +- state->seek = 0; +- if (gz_zero(state, state->skip) == -1) +- return -1; +- } +- +- /* compress remaining data with requested flush */ +- gz_comp(state, flush); +- return state->err; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzsetparams(file, level, strategy) +- gzFile file; +- int level; +- int strategy; +-{ +- gz_statep state; +- z_streamp strm; +- +- /* get internal structure */ +- if (file == NULL) +- return Z_STREAM_ERROR; +- state = (gz_statep)file; +- strm = &(state->strm); +- +- /* check that we're writing and that there's no error */ +- if (state->mode != GZ_WRITE || state->err != Z_OK) +- return Z_STREAM_ERROR; +- +- /* if no change is requested, then do nothing */ +- if (level == state->level && strategy == state->strategy) +- return Z_OK; +- +- /* check for seek request */ +- if (state->seek) { +- state->seek = 0; +- if (gz_zero(state, state->skip) == -1) +- return -1; +- } +- +- /* change compression parameters for subsequent input */ +- if (state->size) { +- /* flush previous input with previous parameters before changing */ +- if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) +- return state->err; +- deflateParams(strm, level, strategy); +- } +- state->level = level; +- state->strategy = strategy; +- return Z_OK; +-} +- +-/* -- see zlib.h -- */ +-int ZEXPORT gzclose_w(file) +- gzFile file; +-{ +- int ret = 0; +- gz_statep state; +- +- /* get internal structure */ +- if (file == NULL) +- return Z_STREAM_ERROR; +- state = (gz_statep)file; +- +- /* check that we're writing */ +- if (state->mode != GZ_WRITE) +- return Z_STREAM_ERROR; +- +- /* check for seek request */ +- if (state->seek) { +- state->seek = 0; +- ret += gz_zero(state, state->skip); +- } +- +- /* flush, free memory, and close file */ +- ret += gz_comp(state, Z_FINISH); +- (void)deflateEnd(&(state->strm)); +- free(state->out); +- free(state->in); +- gz_error(state, Z_OK, NULL); +- free(state->path); +- ret += close(state->fd); +- free(state); +- return ret ? Z_ERRNO : Z_OK; +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/infback.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/infback.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,656 +0,0 @@ +-/* +- * 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. +- */ +- +-/* infback.c -- inflate using a call-back interface +- * Copyright (C) 1995-2009 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* +- This code is largely copied from inflate.c. Normally either infback.o or +- inflate.o would be linked into an application--not both. The interface +- with inffast.c is retained so that optimized assembler-coded versions of +- inflate_fast() can be used with either inflate.c or infback.c. +- */ +- +-#include "zutil.h" +-#include "inftrees.h" +-#include "inflate.h" +-#include "inffast.h" +- +-/* function prototypes */ +-local void fixedtables OF((struct inflate_state FAR *state)); +- +-/* +- strm provides memory allocation functions in zalloc and zfree, or +- Z_NULL to use the library memory allocation functions. +- +- windowBits is in the range 8..15, and window is a user-supplied +- window and output buffer that is 2**windowBits bytes. +- */ +-int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +-z_streamp strm; +-int windowBits; +-unsigned char FAR *window; +-const char *version; +-int stream_size; +-{ +- struct inflate_state FAR *state; +- +- if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || +- stream_size != (int)(sizeof(z_stream))) +- return Z_VERSION_ERROR; +- if (strm == Z_NULL || window == Z_NULL || +- windowBits < 8 || windowBits > 15) +- return Z_STREAM_ERROR; +- strm->msg = Z_NULL; /* in case we return an error */ +- if (strm->zalloc == (alloc_func)0) { +- strm->zalloc = zcalloc; +- strm->opaque = (voidpf)0; +- } +- if (strm->zfree == (free_func)0) strm->zfree = zcfree; +- state = (struct inflate_state FAR *)ZALLOC(strm, 1, +- sizeof(struct inflate_state)); +- if (state == Z_NULL) return Z_MEM_ERROR; +- Tracev((stderr, "inflate: allocated\n")); +- strm->state = (struct internal_state FAR *)state; +- state->dmax = 32768U; +- state->wbits = windowBits; +- state->wsize = 1U << windowBits; +- state->window = window; +- state->wnext = 0; +- state->whave = 0; +- return Z_OK; +-} +- +-/* +- Return state with length and distance decoding tables and index sizes set to +- fixed code decoding. Normally this returns fixed tables from inffixed.h. +- If BUILDFIXED is defined, then instead this routine builds the tables the +- first time it's called, and returns those tables the first time and +- thereafter. This reduces the size of the code by about 2K bytes, in +- exchange for a little execution time. However, BUILDFIXED should not be +- used for threaded applications, since the rewriting of the tables and virgin +- may not be thread-safe. +- */ +-local void fixedtables(state) +-struct inflate_state FAR *state; +-{ +-#ifdef BUILDFIXED +- static int virgin = 1; +- static code *lenfix, *distfix; +- static code fixed[544]; +- +- /* build fixed huffman tables if first call (may not be thread safe) */ +- if (virgin) { +- unsigned sym, bits; +- static code *next; +- +- /* literal/length table */ +- sym = 0; +- while (sym < 144) state->lens[sym++] = 8; +- while (sym < 256) state->lens[sym++] = 9; +- while (sym < 280) state->lens[sym++] = 7; +- while (sym < 288) state->lens[sym++] = 8; +- next = fixed; +- lenfix = next; +- bits = 9; +- inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); +- +- /* distance table */ +- sym = 0; +- while (sym < 32) state->lens[sym++] = 5; +- distfix = next; +- bits = 5; +- inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); +- +- /* do this just once */ +- virgin = 0; +- } +-#else /* !BUILDFIXED */ +-# include "inffixed.h" +-#endif /* BUILDFIXED */ +- state->lencode = lenfix; +- state->lenbits = 9; +- state->distcode = distfix; +- state->distbits = 5; +-} +- +-/* Macros for inflateBack(): */ +- +-/* Load returned state from inflate_fast() */ +-#define LOAD() \ +- do { \ +- put = strm->next_out; \ +- left = strm->avail_out; \ +- next = strm->next_in; \ +- have = strm->avail_in; \ +- hold = state->hold; \ +- bits = state->bits; \ +- } while (0) +- +-/* Set state from registers for inflate_fast() */ +-#define RESTORE() \ +- do { \ +- strm->next_out = put; \ +- strm->avail_out = left; \ +- strm->next_in = next; \ +- strm->avail_in = have; \ +- state->hold = hold; \ +- state->bits = bits; \ +- } while (0) +- +-/* Clear the input bit accumulator */ +-#define INITBITS() \ +- do { \ +- hold = 0; \ +- bits = 0; \ +- } while (0) +- +-/* Assure that some input is available. If input is requested, but denied, +- then return a Z_BUF_ERROR from inflateBack(). */ +-#define PULL() \ +- do { \ +- if (have == 0) { \ +- have = in(in_desc, &next); \ +- if (have == 0) { \ +- next = Z_NULL; \ +- ret = Z_BUF_ERROR; \ +- goto inf_leave; \ +- } \ +- } \ +- } while (0) +- +-/* Get a byte of input into the bit accumulator, or return from inflateBack() +- with an error if there is no input available. */ +-#define PULLBYTE() \ +- do { \ +- PULL(); \ +- have--; \ +- hold += (unsigned long)(*next++) << bits; \ +- bits += 8; \ +- } while (0) +- +-/* Assure that there are at least n bits in the bit accumulator. If there is +- not enough available input to do that, then return from inflateBack() with +- an error. */ +-#define NEEDBITS(n) \ +- do { \ +- while (bits < (unsigned)(n)) \ +- PULLBYTE(); \ +- } while (0) +- +-/* Return the low n bits of the bit accumulator (n < 16) */ +-#define BITS(n) \ +- ((unsigned)hold & ((1U << (n)) - 1)) +- +-/* Remove n bits from the bit accumulator */ +-#define DROPBITS(n) \ +- do { \ +- hold >>= (n); \ +- bits -= (unsigned)(n); \ +- } while (0) +- +-/* Remove zero to seven bits as needed to go to a byte boundary */ +-#define BYTEBITS() \ +- do { \ +- hold >>= bits & 7; \ +- bits -= bits & 7; \ +- } while (0) +- +-/* Assure that some output space is available, by writing out the window +- if it's full. If the write fails, return from inflateBack() with a +- Z_BUF_ERROR. */ +-#define ROOM() \ +- do { \ +- if (left == 0) { \ +- put = state->window; \ +- left = state->wsize; \ +- state->whave = left; \ +- if (out(out_desc, put, left)) { \ +- ret = Z_BUF_ERROR; \ +- goto inf_leave; \ +- } \ +- } \ +- } while (0) +- +-/* +- strm provides the memory allocation functions and window buffer on input, +- and provides information on the unused input on return. For Z_DATA_ERROR +- returns, strm will also provide an error message. +- +- in() and out() are the call-back input and output functions. When +- inflateBack() needs more input, it calls in(). When inflateBack() has +- filled the window with output, or when it completes with data in the +- window, it calls out() to write out the data. The application must not +- change the provided input until in() is called again or inflateBack() +- returns. The application must not change the window/output buffer until +- inflateBack() returns. +- +- in() and out() are called with a descriptor parameter provided in the +- inflateBack() call. This parameter can be a structure that provides the +- information required to do the read or write, as well as accumulated +- information on the input and output such as totals and check values. +- +- in() should return zero on failure. out() should return non-zero on +- failure. If either in() or out() fails, than inflateBack() returns a +- Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it +- was in() or out() that caused in the error. Otherwise, inflateBack() +- returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format +- error, or Z_MEM_ERROR if it could not allocate memory for the state. +- inflateBack() can also return Z_STREAM_ERROR if the input parameters +- are not correct, i.e. strm is Z_NULL or the state was not initialized. +- */ +-int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +-z_streamp strm; +-in_func in; +-void FAR *in_desc; +-out_func out; +-void FAR *out_desc; +-{ +- struct inflate_state FAR *state; +- unsigned char FAR *next; /* next input */ +- unsigned char FAR *put; /* next output */ +- unsigned have, left; /* available input and output */ +- unsigned long hold; /* bit buffer */ +- unsigned bits; /* bits in bit buffer */ +- unsigned copy; /* number of stored or match bytes to copy */ +- unsigned char FAR *from; /* where to copy match bytes from */ +- code here; /* current decoding table entry */ +- code last; /* parent table entry */ +- unsigned len; /* length to copy for repeats, bits to drop */ +- int ret; /* return code */ +- static const unsigned short order[19] = /* permutation of code lengths */ +- {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +- +- /* Check that the strm exists and that the state was initialized */ +- if (strm == Z_NULL || strm->state == Z_NULL) +- return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- +- /* Reset the state */ +- strm->msg = Z_NULL; +- state->mode = TYPE; +- state->last = 0; +- state->whave = 0; +- next = strm->next_in; +- have = next != Z_NULL ? strm->avail_in : 0; +- hold = 0; +- bits = 0; +- put = state->window; +- left = state->wsize; +- +- /* Inflate until end of block marked as last */ +- for (;;) +- switch (state->mode) { +- case TYPE: +- /* determine and dispatch block type */ +- if (state->last) { +- BYTEBITS(); +- state->mode = DONE; +- break; +- } +- NEEDBITS(3); +- state->last = BITS(1); +- DROPBITS(1); +- switch (BITS(2)) { +- case 0: /* stored block */ +- Tracev((stderr, "inflate: stored block%s\n", +- state->last ? " (last)" : "")); +- state->mode = STORED; +- break; +- case 1: /* fixed block */ +- fixedtables(state); +- Tracev((stderr, "inflate: fixed codes block%s\n", +- state->last ? " (last)" : "")); +- state->mode = LEN; /* decode codes */ +- break; +- case 2: /* dynamic block */ +- Tracev((stderr, "inflate: dynamic codes block%s\n", +- state->last ? " (last)" : "")); +- state->mode = TABLE; +- break; +- case 3: +- strm->msg = (char *)"invalid block type"; +- state->mode = BAD; +- } +- DROPBITS(2); +- break; +- +- case STORED: +- /* get and verify stored block length */ +- BYTEBITS(); /* go to byte boundary */ +- NEEDBITS(32); +- if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { +- strm->msg = (char *)"invalid stored block lengths"; +- state->mode = BAD; +- break; +- } +- state->length = (unsigned)hold & 0xffff; +- Tracev((stderr, "inflate: stored length %u\n", +- state->length)); +- INITBITS(); +- +- /* copy stored block from input to output */ +- while (state->length != 0) { +- copy = state->length; +- PULL(); +- ROOM(); +- if (copy > have) copy = have; +- if (copy > left) copy = left; +- zmemcpy(put, next, copy); +- have -= copy; +- next += copy; +- left -= copy; +- put += copy; +- state->length -= copy; +- } +- Tracev((stderr, "inflate: stored end\n")); +- state->mode = TYPE; +- break; +- +- case TABLE: +- /* get dynamic table entries descriptor */ +- NEEDBITS(14); +- state->nlen = BITS(5) + 257; +- DROPBITS(5); +- state->ndist = BITS(5) + 1; +- DROPBITS(5); +- state->ncode = BITS(4) + 4; +- DROPBITS(4); +-#ifndef PKZIP_BUG_WORKAROUND +- if (state->nlen > 286 || state->ndist > 30) { +- strm->msg = (char *)"too many length or distance symbols"; +- state->mode = BAD; +- break; +- } +-#endif +- Tracev((stderr, "inflate: table sizes ok\n")); +- +- /* get code length code lengths (not a typo) */ +- state->have = 0; +- while (state->have < state->ncode) { +- NEEDBITS(3); +- state->lens[order[state->have++]] = (unsigned short)BITS(3); +- DROPBITS(3); +- } +- while (state->have < 19) +- state->lens[order[state->have++]] = 0; +- state->next = state->codes; +- state->lencode = (code const FAR *)(state->next); +- state->lenbits = 7; +- ret = inflate_table(CODES, state->lens, 19, &(state->next), +- &(state->lenbits), state->work); +- if (ret) { +- strm->msg = (char *)"invalid code lengths set"; +- state->mode = BAD; +- break; +- } +- Tracev((stderr, "inflate: code lengths ok\n")); +- +- /* get length and distance code code lengths */ +- state->have = 0; +- while (state->have < state->nlen + state->ndist) { +- for (;;) { +- here = state->lencode[BITS(state->lenbits)]; +- if ((unsigned)(here.bits) <= bits) break; +- PULLBYTE(); +- } +- if (here.val < 16) { +- NEEDBITS(here.bits); +- DROPBITS(here.bits); +- state->lens[state->have++] = here.val; +- } +- else { +- if (here.val == 16) { +- NEEDBITS(here.bits + 2); +- DROPBITS(here.bits); +- if (state->have == 0) { +- strm->msg = (char *)"invalid bit length repeat"; +- state->mode = BAD; +- break; +- } +- len = (unsigned)(state->lens[state->have - 1]); +- copy = 3 + BITS(2); +- DROPBITS(2); +- } +- else if (here.val == 17) { +- NEEDBITS(here.bits + 3); +- DROPBITS(here.bits); +- len = 0; +- copy = 3 + BITS(3); +- DROPBITS(3); +- } +- else { +- NEEDBITS(here.bits + 7); +- DROPBITS(here.bits); +- len = 0; +- copy = 11 + BITS(7); +- DROPBITS(7); +- } +- if (state->have + copy > state->nlen + state->ndist) { +- strm->msg = (char *)"invalid bit length repeat"; +- state->mode = BAD; +- break; +- } +- while (copy--) +- state->lens[state->have++] = (unsigned short)len; +- } +- } +- +- /* handle error breaks in while */ +- if (state->mode == BAD) break; +- +- /* check for end-of-block code (better have one) */ +- if (state->lens[256] == 0) { +- strm->msg = (char *)"invalid code -- missing end-of-block"; +- state->mode = BAD; +- break; +- } +- +- /* build code tables -- note: do not change the lenbits or distbits +- values here (9 and 6) without reading the comments in inftrees.h +- concerning the ENOUGH constants, which depend on those values */ +- state->next = state->codes; +- state->lencode = (code const FAR *)(state->next); +- state->lenbits = 9; +- ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), +- &(state->lenbits), state->work); +- if (ret) { +- strm->msg = (char *)"invalid literal/lengths set"; +- state->mode = BAD; +- break; +- } +- state->distcode = (code const FAR *)(state->next); +- state->distbits = 6; +- ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, +- &(state->next), &(state->distbits), state->work); +- if (ret) { +- strm->msg = (char *)"invalid distances set"; +- state->mode = BAD; +- break; +- } +- Tracev((stderr, "inflate: codes ok\n")); +- state->mode = LEN; +- +- case LEN: +- /* use inflate_fast() if we have enough input and output */ +- if (have >= 6 && left >= 258) { +- RESTORE(); +- if (state->whave < state->wsize) +- state->whave = state->wsize - left; +- inflate_fast(strm, state->wsize); +- LOAD(); +- break; +- } +- +- /* get a literal, length, or end-of-block code */ +- for (;;) { +- here = state->lencode[BITS(state->lenbits)]; +- if ((unsigned)(here.bits) <= bits) break; +- PULLBYTE(); +- } +- if (here.op && (here.op & 0xf0) == 0) { +- last = here; +- for (;;) { +- here = state->lencode[last.val + +- (BITS(last.bits + last.op) >> last.bits)]; +- if ((unsigned)(last.bits + here.bits) <= bits) break; +- PULLBYTE(); +- } +- DROPBITS(last.bits); +- } +- DROPBITS(here.bits); +- state->length = (unsigned)here.val; +- +- /* process literal */ +- if (here.op == 0) { +- Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? +- "inflate: literal '%c'\n" : +- "inflate: literal 0x%02x\n", here.val)); +- ROOM(); +- *put++ = (unsigned char)(state->length); +- left--; +- state->mode = LEN; +- break; +- } +- +- /* process end of block */ +- if (here.op & 32) { +- Tracevv((stderr, "inflate: end of block\n")); +- state->mode = TYPE; +- break; +- } +- +- /* invalid code */ +- if (here.op & 64) { +- strm->msg = (char *)"invalid literal/length code"; +- state->mode = BAD; +- break; +- } +- +- /* length code -- get extra bits, if any */ +- state->extra = (unsigned)(here.op) & 15; +- if (state->extra != 0) { +- NEEDBITS(state->extra); +- state->length += BITS(state->extra); +- DROPBITS(state->extra); +- } +- Tracevv((stderr, "inflate: length %u\n", state->length)); +- +- /* get distance code */ +- for (;;) { +- here = state->distcode[BITS(state->distbits)]; +- if ((unsigned)(here.bits) <= bits) break; +- PULLBYTE(); +- } +- if ((here.op & 0xf0) == 0) { +- last = here; +- for (;;) { +- here = state->distcode[last.val + +- (BITS(last.bits + last.op) >> last.bits)]; +- if ((unsigned)(last.bits + here.bits) <= bits) break; +- PULLBYTE(); +- } +- DROPBITS(last.bits); +- } +- DROPBITS(here.bits); +- if (here.op & 64) { +- strm->msg = (char *)"invalid distance code"; +- state->mode = BAD; +- break; +- } +- state->offset = (unsigned)here.val; +- +- /* get distance extra bits, if any */ +- state->extra = (unsigned)(here.op) & 15; +- if (state->extra != 0) { +- NEEDBITS(state->extra); +- state->offset += BITS(state->extra); +- DROPBITS(state->extra); +- } +- if (state->offset > state->wsize - (state->whave < state->wsize ? +- left : 0)) { +- strm->msg = (char *)"invalid distance too far back"; +- state->mode = BAD; +- break; +- } +- Tracevv((stderr, "inflate: distance %u\n", state->offset)); +- +- /* copy match from window to output */ +- do { +- ROOM(); +- copy = state->wsize - state->offset; +- if (copy < left) { +- from = put + copy; +- copy = left - copy; +- } +- else { +- from = put - state->offset; +- copy = left; +- } +- if (copy > state->length) copy = state->length; +- state->length -= copy; +- left -= copy; +- do { +- *put++ = *from++; +- } while (--copy); +- } while (state->length != 0); +- break; +- +- case DONE: +- /* inflate stream terminated properly -- write leftover output */ +- ret = Z_STREAM_END; +- if (left < state->wsize) { +- if (out(out_desc, state->window, state->wsize - left)) +- ret = Z_BUF_ERROR; +- } +- goto inf_leave; +- +- case BAD: +- ret = Z_DATA_ERROR; +- goto inf_leave; +- +- default: /* can't happen, but makes compilers happy */ +- ret = Z_STREAM_ERROR; +- goto inf_leave; +- } +- +- /* Return unused input */ +- inf_leave: +- strm->next_in = next; +- strm->avail_in = have; +- return ret; +-} +- +-int ZEXPORT inflateBackEnd(strm) +-z_streamp strm; +-{ +- if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) +- return Z_STREAM_ERROR; +- ZFREE(strm, strm->state); +- strm->state = Z_NULL; +- Tracev((stderr, "inflate: end\n")); +- return Z_OK; +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inffast.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inffast.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,364 +0,0 @@ +-/* +- * 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. +- */ +- +-/* inffast.c -- fast decoding +- * Copyright (C) 1995-2008, 2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include "zutil.h" +-#include "inftrees.h" +-#include "inflate.h" +-#include "inffast.h" +- +-#ifndef ASMINF +- +-/* Allow machine dependent optimization for post-increment or pre-increment. +- Based on testing to date, +- Pre-increment preferred for: +- - PowerPC G3 (Adler) +- - MIPS R5000 (Randers-Pehrson) +- Post-increment preferred for: +- - none +- No measurable difference: +- - Pentium III (Anderson) +- - M68060 (Nikl) +- */ +-#ifdef POSTINC +-# define OFF 0 +-# define PUP(a) *(a)++ +-#else +-# define OFF 1 +-# define PUP(a) *++(a) +-#endif +- +-/* +- Decode literal, length, and distance codes and write out the resulting +- literal and match bytes until either not enough input or output is +- available, an end-of-block is encountered, or a data error is encountered. +- When large enough input and output buffers are supplied to inflate(), for +- example, a 16K input buffer and a 64K output buffer, more than 95% of the +- inflate execution time is spent in this routine. +- +- Entry assumptions: +- +- state->mode == LEN +- strm->avail_in >= 6 +- strm->avail_out >= 258 +- start >= strm->avail_out +- state->bits < 8 +- +- On return, state->mode is one of: +- +- LEN -- ran out of enough output space or enough available input +- TYPE -- reached end of block code, inflate() to interpret next block +- BAD -- error in block data +- +- Notes: +- +- - The maximum input bits used by a length/distance pair is 15 bits for the +- length code, 5 bits for the length extra, 15 bits for the distance code, +- and 13 bits for the distance extra. This totals 48 bits, or six bytes. +- Therefore if strm->avail_in >= 6, then there is enough input to avoid +- checking for available input while decoding. +- +- - The maximum bytes that a single length/distance pair can output is 258 +- bytes, which is the maximum length that can be coded. inflate_fast() +- requires strm->avail_out >= 258 for each loop to avoid checking for +- output space. +- */ +-void ZLIB_INTERNAL inflate_fast(strm, start) +-z_streamp strm; +-unsigned start; /* inflate()'s starting value for strm->avail_out */ +-{ +- struct inflate_state FAR *state; +- unsigned char FAR *in; /* local strm->next_in */ +- unsigned char FAR *last; /* while in < last, enough input available */ +- unsigned char FAR *out; /* local strm->next_out */ +- unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ +- unsigned char FAR *end; /* while out < end, enough space available */ +-#ifdef INFLATE_STRICT +- unsigned dmax; /* maximum distance from zlib header */ +-#endif +- unsigned wsize; /* window size or zero if not using window */ +- unsigned whave; /* valid bytes in the window */ +- unsigned wnext; /* window write index */ +- unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ +- unsigned long hold; /* local strm->hold */ +- unsigned bits; /* local strm->bits */ +- code const FAR *lcode; /* local strm->lencode */ +- code const FAR *dcode; /* local strm->distcode */ +- unsigned lmask; /* mask for first level of length codes */ +- unsigned dmask; /* mask for first level of distance codes */ +- code here; /* retrieved table entry */ +- unsigned op; /* code bits, operation, extra bits, or */ +- /* window position, window bytes to copy */ +- unsigned len; /* match length, unused bytes */ +- unsigned dist; /* match distance */ +- unsigned char FAR *from; /* where to copy match from */ +- +- /* copy state to local variables */ +- state = (struct inflate_state FAR *)strm->state; +- in = strm->next_in - OFF; +- last = in + (strm->avail_in - 5); +- out = strm->next_out - OFF; +- beg = out - (start - strm->avail_out); +- end = out + (strm->avail_out - 257); +-#ifdef INFLATE_STRICT +- dmax = state->dmax; +-#endif +- wsize = state->wsize; +- whave = state->whave; +- wnext = state->wnext; +- window = state->window; +- hold = state->hold; +- bits = state->bits; +- lcode = state->lencode; +- dcode = state->distcode; +- lmask = (1U << state->lenbits) - 1; +- dmask = (1U << state->distbits) - 1; +- +- /* decode literals and length/distances until end-of-block or not enough +- input data or output space */ +- do { +- if (bits < 15) { +- hold += (unsigned long)(PUP(in)) << bits; +- bits += 8; +- hold += (unsigned long)(PUP(in)) << bits; +- bits += 8; +- } +- here = lcode[hold & lmask]; +- dolen: +- op = (unsigned)(here.bits); +- hold >>= op; +- bits -= op; +- op = (unsigned)(here.op); +- if (op == 0) { /* literal */ +- Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? +- "inflate: literal '%c'\n" : +- "inflate: literal 0x%02x\n", here.val)); +- PUP(out) = (unsigned char)(here.val); +- } +- else if (op & 16) { /* length base */ +- len = (unsigned)(here.val); +- op &= 15; /* number of extra bits */ +- if (op) { +- if (bits < op) { +- hold += (unsigned long)(PUP(in)) << bits; +- bits += 8; +- } +- len += (unsigned)hold & ((1U << op) - 1); +- hold >>= op; +- bits -= op; +- } +- Tracevv((stderr, "inflate: length %u\n", len)); +- if (bits < 15) { +- hold += (unsigned long)(PUP(in)) << bits; +- bits += 8; +- hold += (unsigned long)(PUP(in)) << bits; +- bits += 8; +- } +- here = dcode[hold & dmask]; +- dodist: +- op = (unsigned)(here.bits); +- hold >>= op; +- bits -= op; +- op = (unsigned)(here.op); +- if (op & 16) { /* distance base */ +- dist = (unsigned)(here.val); +- op &= 15; /* number of extra bits */ +- if (bits < op) { +- hold += (unsigned long)(PUP(in)) << bits; +- bits += 8; +- if (bits < op) { +- hold += (unsigned long)(PUP(in)) << bits; +- bits += 8; +- } +- } +- dist += (unsigned)hold & ((1U << op) - 1); +-#ifdef INFLATE_STRICT +- if (dist > dmax) { +- strm->msg = (char *)"invalid distance too far back"; +- state->mode = BAD; +- break; +- } +-#endif +- hold >>= op; +- bits -= op; +- Tracevv((stderr, "inflate: distance %u\n", dist)); +- op = (unsigned)(out - beg); /* max distance in output */ +- if (dist > op) { /* see if copy from window */ +- op = dist - op; /* distance back in window */ +- if (op > whave) { +- if (state->sane) { +- strm->msg = +- (char *)"invalid distance too far back"; +- state->mode = BAD; +- break; +- } +-#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR +- if (len <= op - whave) { +- do { +- PUP(out) = 0; +- } while (--len); +- continue; +- } +- len -= op - whave; +- do { +- PUP(out) = 0; +- } while (--op > whave); +- if (op == 0) { +- from = out - dist; +- do { +- PUP(out) = PUP(from); +- } while (--len); +- continue; +- } +-#endif +- } +- from = window - OFF; +- if (wnext == 0) { /* very common case */ +- from += wsize - op; +- if (op < len) { /* some from window */ +- len -= op; +- do { +- PUP(out) = PUP(from); +- } while (--op); +- from = out - dist; /* rest from output */ +- } +- } +- else if (wnext < op) { /* wrap around window */ +- from += wsize + wnext - op; +- op -= wnext; +- if (op < len) { /* some from end of window */ +- len -= op; +- do { +- PUP(out) = PUP(from); +- } while (--op); +- from = window - OFF; +- if (wnext < len) { /* some from start of window */ +- op = wnext; +- len -= op; +- do { +- PUP(out) = PUP(from); +- } while (--op); +- from = out - dist; /* rest from output */ +- } +- } +- } +- else { /* contiguous in window */ +- from += wnext - op; +- if (op < len) { /* some from window */ +- len -= op; +- do { +- PUP(out) = PUP(from); +- } while (--op); +- from = out - dist; /* rest from output */ +- } +- } +- while (len > 2) { +- PUP(out) = PUP(from); +- PUP(out) = PUP(from); +- PUP(out) = PUP(from); +- len -= 3; +- } +- if (len) { +- PUP(out) = PUP(from); +- if (len > 1) +- PUP(out) = PUP(from); +- } +- } +- else { +- from = out - dist; /* copy direct from output */ +- do { /* minimum length is three */ +- PUP(out) = PUP(from); +- PUP(out) = PUP(from); +- PUP(out) = PUP(from); +- len -= 3; +- } while (len > 2); +- if (len) { +- PUP(out) = PUP(from); +- if (len > 1) +- PUP(out) = PUP(from); +- } +- } +- } +- else if ((op & 64) == 0) { /* 2nd level distance code */ +- here = dcode[here.val + (hold & ((1U << op) - 1))]; +- goto dodist; +- } +- else { +- strm->msg = (char *)"invalid distance code"; +- state->mode = BAD; +- break; +- } +- } +- else if ((op & 64) == 0) { /* 2nd level length code */ +- here = lcode[here.val + (hold & ((1U << op) - 1))]; +- goto dolen; +- } +- else if (op & 32) { /* end-of-block */ +- Tracevv((stderr, "inflate: end of block\n")); +- state->mode = TYPE; +- break; +- } +- else { +- strm->msg = (char *)"invalid literal/length code"; +- state->mode = BAD; +- break; +- } +- } while (in < last && out < end); +- +- /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ +- len = bits >> 3; +- in -= len; +- bits -= len << 3; +- hold &= (1U << bits) - 1; +- +- /* update state and return */ +- strm->next_in = in + OFF; +- strm->next_out = out + OFF; +- strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); +- strm->avail_out = (unsigned)(out < end ? +- 257 + (end - out) : 257 - (out - end)); +- state->hold = hold; +- state->bits = bits; +- return; +-} +- +-/* +- inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): +- - Using bit fields for code structure +- - Different op definition to avoid & for extra bits (do & for table bits) +- - Three separate decoding do-loops for direct, window, and wnext == 0 +- - Special case for distance > 1 copies to do overlapped load and store copy +- - Explicit branch predictions (based on measured branch probabilities) +- - Deferring match copy and interspersed it with decoding subsequent codes +- - Swapping literal/length else +- - Swapping window/direct else +- - Larger unrolled copy loops (three is about right) +- - Moving len -= 3 statement into middle of loop +- */ +- +-#endif /* !ASMINF */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inffast.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inffast.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,35 +0,0 @@ +-/* +- * 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. +- */ +- +-/* inffast.h -- header to use inffast.c +- * Copyright (C) 1995-2003, 2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inffixed.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inffixed.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,118 +0,0 @@ +-/* +- * 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. +- */ +- +- /* inffixed.h -- table for decoding fixed codes +- * Generated automatically by makefixed(). +- */ +- +- /* WARNING: this file should *not* be used by applications. It +- is part of the implementation of the compression library and +- is subject to change. Applications should only use zlib.h. +- */ +- +- static const code lenfix[512] = { +- {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, +- {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, +- {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, +- {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, +- {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, +- {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, +- {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, +- {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, +- {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, +- {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, +- {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, +- {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, +- {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, +- {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, +- {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, +- {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, +- {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, +- {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, +- {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, +- {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, +- {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, +- {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, +- {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, +- {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, +- {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, +- {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, +- {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, +- {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, +- {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, +- {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, +- {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, +- {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, +- {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, +- {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, +- {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, +- {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, +- {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, +- {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, +- {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, +- {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, +- {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, +- {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, +- {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, +- {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, +- {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, +- {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, +- {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, +- {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, +- {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, +- {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, +- {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, +- {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, +- {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, +- {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, +- {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, +- {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, +- {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, +- {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, +- {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, +- {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, +- {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, +- {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, +- {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, +- {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, +- {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, +- {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, +- {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, +- {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, +- {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, +- {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, +- {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, +- {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, +- {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, +- {0,9,255} +- }; +- +- static const code distfix[32] = { +- {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, +- {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, +- {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, +- {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, +- {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, +- {22,5,193},{64,5,0} +- }; +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inflate.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inflate.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1504 +0,0 @@ +-/* +- * 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. +- */ +- +-/* inflate.c -- zlib decompression +- * Copyright (C) 1995-2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* +- * Change history: +- * +- * 1.2.beta0 24 Nov 2002 +- * - First version -- complete rewrite of inflate to simplify code, avoid +- * creation of window when not needed, minimize use of window when it is +- * needed, make inffast.c even faster, implement gzip decoding, and to +- * improve code readability and style over the previous zlib inflate code +- * +- * 1.2.beta1 25 Nov 2002 +- * - Use pointers for available input and output checking in inffast.c +- * - Remove input and output counters in inffast.c +- * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 +- * - Remove unnecessary second byte pull from length extra in inffast.c +- * - Unroll direct copy to three copies per loop in inffast.c +- * +- * 1.2.beta2 4 Dec 2002 +- * - Change external routine names to reduce potential conflicts +- * - Correct filename to inffixed.h for fixed tables in inflate.c +- * - Make hbuf[] unsigned char to match parameter type in inflate.c +- * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) +- * to avoid negation problem on Alphas (64 bit) in inflate.c +- * +- * 1.2.beta3 22 Dec 2002 +- * - Add comments on state->bits assertion in inffast.c +- * - Add comments on op field in inftrees.h +- * - Fix bug in reuse of allocated window after inflateReset() +- * - Remove bit fields--back to byte structure for speed +- * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths +- * - Change post-increments to pre-increments in inflate_fast(), PPC biased? +- * - Add compile time option, POSTINC, to use post-increments instead (Intel?) +- * - Make MATCH copy in inflate() much faster for when inflate_fast() not used +- * - Use local copies of stream next and avail values, as well as local bit +- * buffer and bit count in inflate()--for speed when inflate_fast() not used +- * +- * 1.2.beta4 1 Jan 2003 +- * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings +- * - Move a comment on output buffer sizes from inffast.c to inflate.c +- * - Add comments in inffast.c to introduce the inflate_fast() routine +- * - Rearrange window copies in inflate_fast() for speed and simplification +- * - Unroll last copy for window match in inflate_fast() +- * - Use local copies of window variables in inflate_fast() for speed +- * - Pull out common wnext == 0 case for speed in inflate_fast() +- * - Make op and len in inflate_fast() unsigned for consistency +- * - Add FAR to lcode and dcode declarations in inflate_fast() +- * - Simplified bad distance check in inflate_fast() +- * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new +- * source file infback.c to provide a call-back interface to inflate for +- * programs like gzip and unzip -- uses window as output buffer to avoid +- * window copying +- * +- * 1.2.beta5 1 Jan 2003 +- * - Improved inflateBack() interface to allow the caller to provide initial +- * input in strm. +- * - Fixed stored blocks bug in inflateBack() +- * +- * 1.2.beta6 4 Jan 2003 +- * - Added comments in inffast.c on effectiveness of POSTINC +- * - Typecasting all around to reduce compiler warnings +- * - Changed loops from while (1) or do {} while (1) to for (;;), again to +- * make compilers happy +- * - Changed type of window in inflateBackInit() to unsigned char * +- * +- * 1.2.beta7 27 Jan 2003 +- * - Changed many types to unsigned or unsigned short to avoid warnings +- * - Added inflateCopy() function +- * +- * 1.2.0 9 Mar 2003 +- * - Changed inflateBack() interface to provide separate opaque descriptors +- * for the in() and out() functions +- * - Changed inflateBack() argument and in_func typedef to swap the length +- * and buffer address return values for the input function +- * - Check next_in and next_out for Z_NULL on entry to inflate() +- * +- * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. +- */ +- +-#include "zutil.h" +-#include "inftrees.h" +-#include "inflate.h" +-#include "inffast.h" +- +-#ifdef MAKEFIXED +-# ifndef BUILDFIXED +-# define BUILDFIXED +-# endif +-#endif +- +-/* function prototypes */ +-local void fixedtables OF((struct inflate_state FAR *state)); +-local int updatewindow OF((z_streamp strm, unsigned out)); +-#ifdef BUILDFIXED +- void makefixed OF((void)); +-#endif +-local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, +- unsigned len)); +- +-int ZEXPORT inflateReset(strm) +-z_streamp strm; +-{ +- struct inflate_state FAR *state; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- strm->total_in = strm->total_out = state->total = 0; +- strm->msg = Z_NULL; +- strm->adler = 1; /* to support ill-conceived Java test suite */ +- state->mode = HEAD; +- state->last = 0; +- state->havedict = 0; +- state->dmax = 32768U; +- state->head = Z_NULL; +- state->wsize = 0; +- state->whave = 0; +- state->wnext = 0; +- state->hold = 0; +- state->bits = 0; +- state->lencode = state->distcode = state->next = state->codes; +- state->sane = 1; +- state->back = -1; +- Tracev((stderr, "inflate: reset\n")); +- return Z_OK; +-} +- +-int ZEXPORT inflateReset2(strm, windowBits) +-z_streamp strm; +-int windowBits; +-{ +- int wrap; +- struct inflate_state FAR *state; +- +- /* get the state */ +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- +- /* extract wrap request from windowBits parameter */ +- if (windowBits < 0) { +- wrap = 0; +- windowBits = -windowBits; +- } +- else { +- wrap = (windowBits >> 4) + 1; +-#ifdef GUNZIP +- if (windowBits < 48) +- windowBits &= 15; +-#endif +- } +- +- /* set number of window bits, free window if different */ +- if (windowBits && (windowBits < 8 || windowBits > 15)) +- return Z_STREAM_ERROR; +- if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { +- ZFREE(strm, state->window); +- state->window = Z_NULL; +- } +- +- /* update state and reset the rest of it */ +- state->wrap = wrap; +- state->wbits = (unsigned)windowBits; +- return inflateReset(strm); +-} +- +-int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +-z_streamp strm; +-int windowBits; +-const char *version; +-int stream_size; +-{ +- int ret; +- struct inflate_state FAR *state; +- +- if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || +- stream_size != (int)(sizeof(z_stream))) +- return Z_VERSION_ERROR; +- if (strm == Z_NULL) return Z_STREAM_ERROR; +- strm->msg = Z_NULL; /* in case we return an error */ +- if (strm->zalloc == (alloc_func)0) { +- strm->zalloc = zcalloc; +- strm->opaque = (voidpf)0; +- } +- if (strm->zfree == (free_func)0) strm->zfree = zcfree; +- state = (struct inflate_state FAR *) +- ZALLOC(strm, 1, sizeof(struct inflate_state)); +- if (state == Z_NULL) return Z_MEM_ERROR; +- Tracev((stderr, "inflate: allocated\n")); +- strm->state = (struct internal_state FAR *)state; +- state->window = Z_NULL; +- ret = inflateReset2(strm, windowBits); +- if (ret != Z_OK) { +- ZFREE(strm, state); +- strm->state = Z_NULL; +- } +- return ret; +-} +- +-int ZEXPORT inflateInit_(strm, version, stream_size) +-z_streamp strm; +-const char *version; +-int stream_size; +-{ +- return inflateInit2_(strm, DEF_WBITS, version, stream_size); +-} +- +-int ZEXPORT inflatePrime(strm, bits, value) +-z_streamp strm; +-int bits; +-int value; +-{ +- struct inflate_state FAR *state; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- if (bits < 0) { +- state->hold = 0; +- state->bits = 0; +- return Z_OK; +- } +- if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; +- value &= (1L << bits) - 1; +- state->hold += value << state->bits; +- state->bits += bits; +- return Z_OK; +-} +- +-/* +- Return state with length and distance decoding tables and index sizes set to +- fixed code decoding. Normally this returns fixed tables from inffixed.h. +- If BUILDFIXED is defined, then instead this routine builds the tables the +- first time it's called, and returns those tables the first time and +- thereafter. This reduces the size of the code by about 2K bytes, in +- exchange for a little execution time. However, BUILDFIXED should not be +- used for threaded applications, since the rewriting of the tables and virgin +- may not be thread-safe. +- */ +-local void fixedtables(state) +-struct inflate_state FAR *state; +-{ +-#ifdef BUILDFIXED +- static int virgin = 1; +- static code *lenfix, *distfix; +- static code fixed[544]; +- +- /* build fixed huffman tables if first call (may not be thread safe) */ +- if (virgin) { +- unsigned sym, bits; +- static code *next; +- +- /* literal/length table */ +- sym = 0; +- while (sym < 144) state->lens[sym++] = 8; +- while (sym < 256) state->lens[sym++] = 9; +- while (sym < 280) state->lens[sym++] = 7; +- while (sym < 288) state->lens[sym++] = 8; +- next = fixed; +- lenfix = next; +- bits = 9; +- inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); +- +- /* distance table */ +- sym = 0; +- while (sym < 32) state->lens[sym++] = 5; +- distfix = next; +- bits = 5; +- inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); +- +- /* do this just once */ +- virgin = 0; +- } +-#else /* !BUILDFIXED */ +-# include "inffixed.h" +-#endif /* BUILDFIXED */ +- state->lencode = lenfix; +- state->lenbits = 9; +- state->distcode = distfix; +- state->distbits = 5; +-} +- +-#ifdef MAKEFIXED +-#include <stdio.h> +- +-/* +- Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also +- defines BUILDFIXED, so the tables are built on the fly. makefixed() writes +- those tables to stdout, which would be piped to inffixed.h. A small program +- can simply call makefixed to do this: +- +- void makefixed(void); +- +- int main(void) +- { +- makefixed(); +- return 0; +- } +- +- Then that can be linked with zlib built with MAKEFIXED defined and run: +- +- a.out > inffixed.h +- */ +-void makefixed() +-{ +- unsigned low, size; +- struct inflate_state state; +- +- fixedtables(&state); +- puts(" /* inffixed.h -- table for decoding fixed codes"); +- puts(" * Generated automatically by makefixed()."); +- puts(" */"); +- puts(""); +- puts(" /* WARNING: this file should *not* be used by applications."); +- puts(" It is part of the implementation of this library and is"); +- puts(" subject to change. Applications should only use zlib.h."); +- puts(" */"); +- puts(""); +- size = 1U << 9; +- printf(" static const code lenfix[%u] = {", size); +- low = 0; +- for (;;) { +- if ((low % 7) == 0) printf("\n "); +- printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, +- state.lencode[low].val); +- if (++low == size) break; +- putchar(','); +- } +- puts("\n };"); +- size = 1U << 5; +- printf("\n static const code distfix[%u] = {", size); +- low = 0; +- for (;;) { +- if ((low % 6) == 0) printf("\n "); +- printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, +- state.distcode[low].val); +- if (++low == size) break; +- putchar(','); +- } +- puts("\n };"); +-} +-#endif /* MAKEFIXED */ +- +-/* +- Update the window with the last wsize (normally 32K) bytes written before +- returning. If window does not exist yet, create it. This is only called +- when a window is already in use, or when output has been written during this +- inflate call, but the end of the deflate stream has not been reached yet. +- It is also called to create a window for dictionary data when a dictionary +- is loaded. +- +- Providing output buffers larger than 32K to inflate() should provide a speed +- advantage, since only the last 32K of output is copied to the sliding window +- upon return from inflate(), and since all distances after the first 32K of +- output will fall in the output data, making match copies simpler and faster. +- The advantage may be dependent on the size of the processor's data caches. +- */ +-local int updatewindow(strm, out) +-z_streamp strm; +-unsigned out; +-{ +- struct inflate_state FAR *state; +- unsigned copy, dist; +- +- state = (struct inflate_state FAR *)strm->state; +- +- /* if it hasn't been done already, allocate space for the window */ +- if (state->window == Z_NULL) { +- state->window = (unsigned char FAR *) +- ZALLOC(strm, 1U << state->wbits, +- sizeof(unsigned char)); +- if (state->window == Z_NULL) return 1; +- } +- +- /* if window not in use yet, initialize */ +- if (state->wsize == 0) { +- state->wsize = 1U << state->wbits; +- state->wnext = 0; +- state->whave = 0; +- } +- +- /* copy state->wsize or less output bytes into the circular window */ +- copy = out - strm->avail_out; +- if (copy >= state->wsize) { +- zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); +- state->wnext = 0; +- state->whave = state->wsize; +- } +- else { +- dist = state->wsize - state->wnext; +- if (dist > copy) dist = copy; +- zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); +- copy -= dist; +- if (copy) { +- zmemcpy(state->window, strm->next_out - copy, copy); +- state->wnext = copy; +- state->whave = state->wsize; +- } +- else { +- state->wnext += dist; +- if (state->wnext == state->wsize) state->wnext = 0; +- if (state->whave < state->wsize) state->whave += dist; +- } +- } +- return 0; +-} +- +-/* Macros for inflate(): */ +- +-/* check function to use adler32() for zlib or crc32() for gzip */ +-#ifdef GUNZIP +-# define UPDATE(check, buf, len) \ +- (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +-#else +-# define UPDATE(check, buf, len) adler32(check, buf, len) +-#endif +- +-/* check macros for header crc */ +-#ifdef GUNZIP +-# define CRC2(check, word) \ +- do { \ +- hbuf[0] = (unsigned char)(word); \ +- hbuf[1] = (unsigned char)((word) >> 8); \ +- check = crc32(check, hbuf, 2); \ +- } while (0) +- +-# define CRC4(check, word) \ +- do { \ +- hbuf[0] = (unsigned char)(word); \ +- hbuf[1] = (unsigned char)((word) >> 8); \ +- hbuf[2] = (unsigned char)((word) >> 16); \ +- hbuf[3] = (unsigned char)((word) >> 24); \ +- check = crc32(check, hbuf, 4); \ +- } while (0) +-#endif +- +-/* Load registers with state in inflate() for speed */ +-#define LOAD() \ +- do { \ +- put = strm->next_out; \ +- left = strm->avail_out; \ +- next = strm->next_in; \ +- have = strm->avail_in; \ +- hold = state->hold; \ +- bits = state->bits; \ +- } while (0) +- +-/* Restore state from registers in inflate() */ +-#define RESTORE() \ +- do { \ +- strm->next_out = put; \ +- strm->avail_out = left; \ +- strm->next_in = next; \ +- strm->avail_in = have; \ +- state->hold = hold; \ +- state->bits = bits; \ +- } while (0) +- +-/* Clear the input bit accumulator */ +-#define INITBITS() \ +- do { \ +- hold = 0; \ +- bits = 0; \ +- } while (0) +- +-/* Get a byte of input into the bit accumulator, or return from inflate() +- if there is no input available. */ +-#define PULLBYTE() \ +- do { \ +- if (have == 0) goto inf_leave; \ +- have--; \ +- hold += (unsigned long)(*next++) << bits; \ +- bits += 8; \ +- } while (0) +- +-/* Assure that there are at least n bits in the bit accumulator. If there is +- not enough available input to do that, then return from inflate(). */ +-#define NEEDBITS(n) \ +- do { \ +- while (bits < (unsigned)(n)) \ +- PULLBYTE(); \ +- } while (0) +- +-/* Return the low n bits of the bit accumulator (n < 16) */ +-#define BITS(n) \ +- ((unsigned)hold & ((1U << (n)) - 1)) +- +-/* Remove n bits from the bit accumulator */ +-#define DROPBITS(n) \ +- do { \ +- hold >>= (n); \ +- bits -= (unsigned)(n); \ +- } while (0) +- +-/* Remove zero to seven bits as needed to go to a byte boundary */ +-#define BYTEBITS() \ +- do { \ +- hold >>= bits & 7; \ +- bits -= bits & 7; \ +- } while (0) +- +-/* Reverse the bytes in a 32-bit value */ +-#define REVERSE(q) \ +- ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ +- (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) +- +-/* +- inflate() uses a state machine to process as much input data and generate as +- much output data as possible before returning. The state machine is +- structured roughly as follows: +- +- for (;;) switch (state) { +- ... +- case STATEn: +- if (not enough input data or output space to make progress) +- return; +- ... make progress ... +- state = STATEm; +- break; +- ... +- } +- +- so when inflate() is called again, the same case is attempted again, and +- if the appropriate resources are provided, the machine proceeds to the +- next state. The NEEDBITS() macro is usually the way the state evaluates +- whether it can proceed or should return. NEEDBITS() does the return if +- the requested bits are not available. The typical use of the BITS macros +- is: +- +- NEEDBITS(n); +- ... do something with BITS(n) ... +- DROPBITS(n); +- +- where NEEDBITS(n) either returns from inflate() if there isn't enough +- input left to load n bits into the accumulator, or it continues. BITS(n) +- gives the low n bits in the accumulator. When done, DROPBITS(n) drops +- the low n bits off the accumulator. INITBITS() clears the accumulator +- and sets the number of available bits to zero. BYTEBITS() discards just +- enough bits to put the accumulator on a byte boundary. After BYTEBITS() +- and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. +- +- NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return +- if there is no input available. The decoding of variable length codes uses +- PULLBYTE() directly in order to pull just enough bytes to decode the next +- code, and no more. +- +- Some states loop until they get enough input, making sure that enough +- state information is maintained to continue the loop where it left off +- if NEEDBITS() returns in the loop. For example, want, need, and keep +- would all have to actually be part of the saved state in case NEEDBITS() +- returns: +- +- case STATEw: +- while (want < need) { +- NEEDBITS(n); +- keep[want++] = BITS(n); +- DROPBITS(n); +- } +- state = STATEx; +- case STATEx: +- +- As shown above, if the next state is also the next case, then the break +- is omitted. +- +- A state may also return if there is not enough output space available to +- complete that state. Those states are copying stored data, writing a +- literal byte, and copying a matching string. +- +- When returning, a "goto inf_leave" is used to update the total counters, +- update the check value, and determine whether any progress has been made +- during that inflate() call in order to return the proper return code. +- Progress is defined as a change in either strm->avail_in or strm->avail_out. +- When there is a window, goto inf_leave will update the window with the last +- output written. If a goto inf_leave occurs in the middle of decompression +- and there is no window currently, goto inf_leave will create one and copy +- output to the window for the next call of inflate(). +- +- In this implementation, the flush parameter of inflate() only affects the +- return code (per zlib.h). inflate() always writes as much as possible to +- strm->next_out, given the space available and the provided input--the effect +- documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers +- the allocation of and copying into a sliding window until necessary, which +- provides the effect documented in zlib.h for Z_FINISH when the entire input +- stream available. So the only thing the flush parameter actually does is: +- when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it +- will return Z_BUF_ERROR if it has not reached the end of the stream. +- */ +- +-int ZEXPORT inflate(strm, flush) +-z_streamp strm; +-int flush; +-{ +- struct inflate_state FAR *state; +- unsigned char FAR *next; /* next input */ +- unsigned char FAR *put; /* next output */ +- unsigned have, left; /* available input and output */ +- unsigned long hold; /* bit buffer */ +- unsigned bits; /* bits in bit buffer */ +- unsigned in, out; /* save starting available input and output */ +- unsigned copy; /* number of stored or match bytes to copy */ +- unsigned char FAR *from; /* where to copy match bytes from */ +- code here; /* current decoding table entry */ +- code last; /* parent table entry */ +- unsigned len; /* length to copy for repeats, bits to drop */ +- int ret; /* return code */ +-#ifdef GUNZIP +- unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +-#endif +- static const unsigned short order[19] = /* permutation of code lengths */ +- {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +- +- if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || +- (strm->next_in == Z_NULL && strm->avail_in != 0)) +- return Z_STREAM_ERROR; +- +- state = (struct inflate_state FAR *)strm->state; +- if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ +- LOAD(); +- in = have; +- out = left; +- ret = Z_OK; +- for (;;) +- switch (state->mode) { +- case HEAD: +- if (state->wrap == 0) { +- state->mode = TYPEDO; +- break; +- } +- NEEDBITS(16); +-#ifdef GUNZIP +- if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ +- state->check = crc32(0L, Z_NULL, 0); +- CRC2(state->check, hold); +- INITBITS(); +- state->mode = FLAGS; +- break; +- } +- state->flags = 0; /* expect zlib header */ +- if (state->head != Z_NULL) +- state->head->done = -1; +- if (!(state->wrap & 1) || /* check if zlib header allowed */ +-#else +- if ( +-#endif +- ((BITS(8) << 8) + (hold >> 8)) % 31) { +- strm->msg = (char *)"incorrect header check"; +- state->mode = BAD; +- break; +- } +- if (BITS(4) != Z_DEFLATED) { +- strm->msg = (char *)"unknown compression method"; +- state->mode = BAD; +- break; +- } +- DROPBITS(4); +- len = BITS(4) + 8; +- if (state->wbits == 0) +- state->wbits = len; +- else if (len > state->wbits) { +- strm->msg = (char *)"invalid window size"; +- state->mode = BAD; +- break; +- } +- state->dmax = 1U << len; +- Tracev((stderr, "inflate: zlib header ok\n")); +- strm->adler = state->check = adler32(0L, Z_NULL, 0); +- state->mode = hold & 0x200 ? DICTID : TYPE; +- INITBITS(); +- break; +-#ifdef GUNZIP +- case FLAGS: +- NEEDBITS(16); +- state->flags = (int)(hold); +- if ((state->flags & 0xff) != Z_DEFLATED) { +- strm->msg = (char *)"unknown compression method"; +- state->mode = BAD; +- break; +- } +- if (state->flags & 0xe000) { +- strm->msg = (char *)"unknown header flags set"; +- state->mode = BAD; +- break; +- } +- if (state->head != Z_NULL) +- state->head->text = (int)((hold >> 8) & 1); +- if (state->flags & 0x0200) CRC2(state->check, hold); +- INITBITS(); +- state->mode = TIME; +- case TIME: +- NEEDBITS(32); +- if (state->head != Z_NULL) +- state->head->time = hold; +- if (state->flags & 0x0200) CRC4(state->check, hold); +- INITBITS(); +- state->mode = OS; +- case OS: +- NEEDBITS(16); +- if (state->head != Z_NULL) { +- state->head->xflags = (int)(hold & 0xff); +- state->head->os = (int)(hold >> 8); +- } +- if (state->flags & 0x0200) CRC2(state->check, hold); +- INITBITS(); +- state->mode = EXLEN; +- case EXLEN: +- if (state->flags & 0x0400) { +- NEEDBITS(16); +- state->length = (unsigned)(hold); +- if (state->head != Z_NULL) +- state->head->extra_len = (unsigned)hold; +- if (state->flags & 0x0200) CRC2(state->check, hold); +- INITBITS(); +- } +- else if (state->head != Z_NULL) +- state->head->extra = Z_NULL; +- state->mode = EXTRA; +- case EXTRA: +- if (state->flags & 0x0400) { +- copy = state->length; +- if (copy > have) copy = have; +- if (copy) { +- if (state->head != Z_NULL && +- state->head->extra != Z_NULL) { +- len = state->head->extra_len - state->length; +- zmemcpy(state->head->extra + len, next, +- len + copy > state->head->extra_max ? +- state->head->extra_max - len : copy); +- } +- if (state->flags & 0x0200) +- state->check = crc32(state->check, next, copy); +- have -= copy; +- next += copy; +- state->length -= copy; +- } +- if (state->length) goto inf_leave; +- } +- state->length = 0; +- state->mode = NAME; +- case NAME: +- if (state->flags & 0x0800) { +- if (have == 0) goto inf_leave; +- copy = 0; +- do { +- len = (unsigned)(next[copy++]); +- if (state->head != Z_NULL && +- state->head->name != Z_NULL && +- state->length < state->head->name_max) +- state->head->name[state->length++] = len; +- } while (len && copy < have); +- if (state->flags & 0x0200) +- state->check = crc32(state->check, next, copy); +- have -= copy; +- next += copy; +- if (len) goto inf_leave; +- } +- else if (state->head != Z_NULL) +- state->head->name = Z_NULL; +- state->length = 0; +- state->mode = COMMENT; +- case COMMENT: +- if (state->flags & 0x1000) { +- if (have == 0) goto inf_leave; +- copy = 0; +- do { +- len = (unsigned)(next[copy++]); +- if (state->head != Z_NULL && +- state->head->comment != Z_NULL && +- state->length < state->head->comm_max) +- state->head->comment[state->length++] = len; +- } while (len && copy < have); +- if (state->flags & 0x0200) +- state->check = crc32(state->check, next, copy); +- have -= copy; +- next += copy; +- if (len) goto inf_leave; +- } +- else if (state->head != Z_NULL) +- state->head->comment = Z_NULL; +- state->mode = HCRC; +- case HCRC: +- if (state->flags & 0x0200) { +- NEEDBITS(16); +- if (hold != (state->check & 0xffff)) { +- strm->msg = (char *)"header crc mismatch"; +- state->mode = BAD; +- break; +- } +- INITBITS(); +- } +- if (state->head != Z_NULL) { +- state->head->hcrc = (int)((state->flags >> 9) & 1); +- state->head->done = 1; +- } +- strm->adler = state->check = crc32(0L, Z_NULL, 0); +- state->mode = TYPE; +- break; +-#endif +- case DICTID: +- NEEDBITS(32); +- strm->adler = state->check = REVERSE(hold); +- INITBITS(); +- state->mode = DICT; +- case DICT: +- if (state->havedict == 0) { +- RESTORE(); +- return Z_NEED_DICT; +- } +- strm->adler = state->check = adler32(0L, Z_NULL, 0); +- state->mode = TYPE; +- case TYPE: +- if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; +- case TYPEDO: +- if (state->last) { +- BYTEBITS(); +- state->mode = CHECK; +- break; +- } +- NEEDBITS(3); +- state->last = BITS(1); +- DROPBITS(1); +- switch (BITS(2)) { +- case 0: /* stored block */ +- Tracev((stderr, "inflate: stored block%s\n", +- state->last ? " (last)" : "")); +- state->mode = STORED; +- break; +- case 1: /* fixed block */ +- fixedtables(state); +- Tracev((stderr, "inflate: fixed codes block%s\n", +- state->last ? " (last)" : "")); +- state->mode = LEN_; /* decode codes */ +- if (flush == Z_TREES) { +- DROPBITS(2); +- goto inf_leave; +- } +- break; +- case 2: /* dynamic block */ +- Tracev((stderr, "inflate: dynamic codes block%s\n", +- state->last ? " (last)" : "")); +- state->mode = TABLE; +- break; +- case 3: +- strm->msg = (char *)"invalid block type"; +- state->mode = BAD; +- } +- DROPBITS(2); +- break; +- case STORED: +- BYTEBITS(); /* go to byte boundary */ +- NEEDBITS(32); +- if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { +- strm->msg = (char *)"invalid stored block lengths"; +- state->mode = BAD; +- break; +- } +- state->length = (unsigned)hold & 0xffff; +- Tracev((stderr, "inflate: stored length %u\n", +- state->length)); +- INITBITS(); +- state->mode = COPY_; +- if (flush == Z_TREES) goto inf_leave; +- case COPY_: +- state->mode = COPY; +- case COPY: +- copy = state->length; +- if (copy) { +- if (copy > have) copy = have; +- if (copy > left) copy = left; +- if (copy == 0) goto inf_leave; +- zmemcpy(put, next, copy); +- have -= copy; +- next += copy; +- left -= copy; +- put += copy; +- state->length -= copy; +- break; +- } +- Tracev((stderr, "inflate: stored end\n")); +- state->mode = TYPE; +- break; +- case TABLE: +- NEEDBITS(14); +- state->nlen = BITS(5) + 257; +- DROPBITS(5); +- state->ndist = BITS(5) + 1; +- DROPBITS(5); +- state->ncode = BITS(4) + 4; +- DROPBITS(4); +-#ifndef PKZIP_BUG_WORKAROUND +- if (state->nlen > 286 || state->ndist > 30) { +- strm->msg = (char *)"too many length or distance symbols"; +- state->mode = BAD; +- break; +- } +-#endif +- Tracev((stderr, "inflate: table sizes ok\n")); +- state->have = 0; +- state->mode = LENLENS; +- case LENLENS: +- while (state->have < state->ncode) { +- NEEDBITS(3); +- state->lens[order[state->have++]] = (unsigned short)BITS(3); +- DROPBITS(3); +- } +- while (state->have < 19) +- state->lens[order[state->have++]] = 0; +- state->next = state->codes; +- state->lencode = (code const FAR *)(state->next); +- state->lenbits = 7; +- ret = inflate_table(CODES, state->lens, 19, &(state->next), +- &(state->lenbits), state->work); +- if (ret) { +- strm->msg = (char *)"invalid code lengths set"; +- state->mode = BAD; +- break; +- } +- Tracev((stderr, "inflate: code lengths ok\n")); +- state->have = 0; +- state->mode = CODELENS; +- case CODELENS: +- while (state->have < state->nlen + state->ndist) { +- for (;;) { +- here = state->lencode[BITS(state->lenbits)]; +- if ((unsigned)(here.bits) <= bits) break; +- PULLBYTE(); +- } +- if (here.val < 16) { +- NEEDBITS(here.bits); +- DROPBITS(here.bits); +- state->lens[state->have++] = here.val; +- } +- else { +- if (here.val == 16) { +- NEEDBITS(here.bits + 2); +- DROPBITS(here.bits); +- if (state->have == 0) { +- strm->msg = (char *)"invalid bit length repeat"; +- state->mode = BAD; +- break; +- } +- len = state->lens[state->have - 1]; +- copy = 3 + BITS(2); +- DROPBITS(2); +- } +- else if (here.val == 17) { +- NEEDBITS(here.bits + 3); +- DROPBITS(here.bits); +- len = 0; +- copy = 3 + BITS(3); +- DROPBITS(3); +- } +- else { +- NEEDBITS(here.bits + 7); +- DROPBITS(here.bits); +- len = 0; +- copy = 11 + BITS(7); +- DROPBITS(7); +- } +- if (state->have + copy > state->nlen + state->ndist) { +- strm->msg = (char *)"invalid bit length repeat"; +- state->mode = BAD; +- break; +- } +- while (copy--) +- state->lens[state->have++] = (unsigned short)len; +- } +- } +- +- /* handle error breaks in while */ +- if (state->mode == BAD) break; +- +- /* check for end-of-block code (better have one) */ +- if (state->lens[256] == 0) { +- strm->msg = (char *)"invalid code -- missing end-of-block"; +- state->mode = BAD; +- break; +- } +- +- /* build code tables -- note: do not change the lenbits or distbits +- values here (9 and 6) without reading the comments in inftrees.h +- concerning the ENOUGH constants, which depend on those values */ +- state->next = state->codes; +- state->lencode = (code const FAR *)(state->next); +- state->lenbits = 9; +- ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), +- &(state->lenbits), state->work); +- if (ret) { +- strm->msg = (char *)"invalid literal/lengths set"; +- state->mode = BAD; +- break; +- } +- state->distcode = (code const FAR *)(state->next); +- state->distbits = 6; +- ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, +- &(state->next), &(state->distbits), state->work); +- if (ret) { +- strm->msg = (char *)"invalid distances set"; +- state->mode = BAD; +- break; +- } +- Tracev((stderr, "inflate: codes ok\n")); +- state->mode = LEN_; +- if (flush == Z_TREES) goto inf_leave; +- case LEN_: +- state->mode = LEN; +- case LEN: +- if (have >= 6 && left >= 258) { +- RESTORE(); +- inflate_fast(strm, out); +- LOAD(); +- if (state->mode == TYPE) +- state->back = -1; +- break; +- } +- state->back = 0; +- for (;;) { +- here = state->lencode[BITS(state->lenbits)]; +- if ((unsigned)(here.bits) <= bits) break; +- PULLBYTE(); +- } +- if (here.op && (here.op & 0xf0) == 0) { +- last = here; +- for (;;) { +- here = state->lencode[last.val + +- (BITS(last.bits + last.op) >> last.bits)]; +- if ((unsigned)(last.bits + here.bits) <= bits) break; +- PULLBYTE(); +- } +- DROPBITS(last.bits); +- state->back += last.bits; +- } +- DROPBITS(here.bits); +- state->back += here.bits; +- state->length = (unsigned)here.val; +- if ((int)(here.op) == 0) { +- Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? +- "inflate: literal '%c'\n" : +- "inflate: literal 0x%02x\n", here.val)); +- state->mode = LIT; +- break; +- } +- if (here.op & 32) { +- Tracevv((stderr, "inflate: end of block\n")); +- state->back = -1; +- state->mode = TYPE; +- break; +- } +- if (here.op & 64) { +- strm->msg = (char *)"invalid literal/length code"; +- state->mode = BAD; +- break; +- } +- state->extra = (unsigned)(here.op) & 15; +- state->mode = LENEXT; +- case LENEXT: +- if (state->extra) { +- NEEDBITS(state->extra); +- state->length += BITS(state->extra); +- DROPBITS(state->extra); +- state->back += state->extra; +- } +- Tracevv((stderr, "inflate: length %u\n", state->length)); +- state->was = state->length; +- state->mode = DIST; +- case DIST: +- for (;;) { +- here = state->distcode[BITS(state->distbits)]; +- if ((unsigned)(here.bits) <= bits) break; +- PULLBYTE(); +- } +- if ((here.op & 0xf0) == 0) { +- last = here; +- for (;;) { +- here = state->distcode[last.val + +- (BITS(last.bits + last.op) >> last.bits)]; +- if ((unsigned)(last.bits + here.bits) <= bits) break; +- PULLBYTE(); +- } +- DROPBITS(last.bits); +- state->back += last.bits; +- } +- DROPBITS(here.bits); +- state->back += here.bits; +- if (here.op & 64) { +- strm->msg = (char *)"invalid distance code"; +- state->mode = BAD; +- break; +- } +- state->offset = (unsigned)here.val; +- state->extra = (unsigned)(here.op) & 15; +- state->mode = DISTEXT; +- case DISTEXT: +- if (state->extra) { +- NEEDBITS(state->extra); +- state->offset += BITS(state->extra); +- DROPBITS(state->extra); +- state->back += state->extra; +- } +-#ifdef INFLATE_STRICT +- if (state->offset > state->dmax) { +- strm->msg = (char *)"invalid distance too far back"; +- state->mode = BAD; +- break; +- } +-#endif +- Tracevv((stderr, "inflate: distance %u\n", state->offset)); +- state->mode = MATCH; +- case MATCH: +- if (left == 0) goto inf_leave; +- copy = out - left; +- if (state->offset > copy) { /* copy from window */ +- copy = state->offset - copy; +- if (copy > state->whave) { +- if (state->sane) { +- strm->msg = (char *)"invalid distance too far back"; +- state->mode = BAD; +- break; +- } +-#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR +- Trace((stderr, "inflate.c too far\n")); +- copy -= state->whave; +- if (copy > state->length) copy = state->length; +- if (copy > left) copy = left; +- left -= copy; +- state->length -= copy; +- do { +- *put++ = 0; +- } while (--copy); +- if (state->length == 0) state->mode = LEN; +- break; +-#endif +- } +- if (copy > state->wnext) { +- copy -= state->wnext; +- from = state->window + (state->wsize - copy); +- } +- else +- from = state->window + (state->wnext - copy); +- if (copy > state->length) copy = state->length; +- } +- else { /* copy from output */ +- from = put - state->offset; +- copy = state->length; +- } +- if (copy > left) copy = left; +- left -= copy; +- state->length -= copy; +- do { +- *put++ = *from++; +- } while (--copy); +- if (state->length == 0) state->mode = LEN; +- break; +- case LIT: +- if (left == 0) goto inf_leave; +- *put++ = (unsigned char)(state->length); +- left--; +- state->mode = LEN; +- break; +- case CHECK: +- if (state->wrap) { +- NEEDBITS(32); +- out -= left; +- strm->total_out += out; +- state->total += out; +- if (out) +- strm->adler = state->check = +- UPDATE(state->check, put - out, out); +- out = left; +- if (( +-#ifdef GUNZIP +- state->flags ? hold : +-#endif +- REVERSE(hold)) != state->check) { +- strm->msg = (char *)"incorrect data check"; +- state->mode = BAD; +- break; +- } +- INITBITS(); +- Tracev((stderr, "inflate: check matches trailer\n")); +- } +-#ifdef GUNZIP +- state->mode = LENGTH; +- case LENGTH: +- if (state->wrap && state->flags) { +- NEEDBITS(32); +- if (hold != (state->total & 0xffffffffUL)) { +- strm->msg = (char *)"incorrect length check"; +- state->mode = BAD; +- break; +- } +- INITBITS(); +- Tracev((stderr, "inflate: length matches trailer\n")); +- } +-#endif +- state->mode = DONE; +- case DONE: +- ret = Z_STREAM_END; +- goto inf_leave; +- case BAD: +- ret = Z_DATA_ERROR; +- goto inf_leave; +- case MEM: +- return Z_MEM_ERROR; +- case SYNC: +- default: +- return Z_STREAM_ERROR; +- } +- +- /* +- Return from inflate(), updating the total counts and the check value. +- If there was no progress during the inflate() call, return a buffer +- error. Call updatewindow() to create and/or update the window state. +- Note: a memory error from inflate() is non-recoverable. +- */ +- inf_leave: +- RESTORE(); +- if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) +- if (updatewindow(strm, out)) { +- state->mode = MEM; +- return Z_MEM_ERROR; +- } +- in -= strm->avail_in; +- out -= strm->avail_out; +- strm->total_in += in; +- strm->total_out += out; +- state->total += out; +- if (state->wrap && out) +- strm->adler = state->check = +- UPDATE(state->check, strm->next_out - out, out); +- strm->data_type = state->bits + (state->last ? 64 : 0) + +- (state->mode == TYPE ? 128 : 0) + +- (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); +- if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) +- ret = Z_BUF_ERROR; +- return ret; +-} +- +-int ZEXPORT inflateEnd(strm) +-z_streamp strm; +-{ +- struct inflate_state FAR *state; +- if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) +- return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- if (state->window != Z_NULL) ZFREE(strm, state->window); +- ZFREE(strm, strm->state); +- strm->state = Z_NULL; +- Tracev((stderr, "inflate: end\n")); +- return Z_OK; +-} +- +-int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +-z_streamp strm; +-const Bytef *dictionary; +-uInt dictLength; +-{ +- struct inflate_state FAR *state; +- unsigned long id; +- +- /* check state */ +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- if (state->wrap != 0 && state->mode != DICT) +- return Z_STREAM_ERROR; +- +- /* check for correct dictionary id */ +- if (state->mode == DICT) { +- id = adler32(0L, Z_NULL, 0); +- id = adler32(id, dictionary, dictLength); +- if (id != state->check) +- return Z_DATA_ERROR; +- } +- +- /* copy dictionary to window */ +- if (updatewindow(strm, strm->avail_out)) { +- state->mode = MEM; +- return Z_MEM_ERROR; +- } +- if (dictLength > state->wsize) { +- zmemcpy(state->window, dictionary + dictLength - state->wsize, +- state->wsize); +- state->whave = state->wsize; +- } +- else { +- zmemcpy(state->window + state->wsize - dictLength, dictionary, +- dictLength); +- state->whave = dictLength; +- } +- state->havedict = 1; +- Tracev((stderr, "inflate: dictionary set\n")); +- return Z_OK; +-} +- +-int ZEXPORT inflateGetHeader(strm, head) +-z_streamp strm; +-gz_headerp head; +-{ +- struct inflate_state FAR *state; +- +- /* check state */ +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; +- +- /* save header structure */ +- state->head = head; +- head->done = 0; +- return Z_OK; +-} +- +-/* +- Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found +- or when out of input. When called, *have is the number of pattern bytes +- found in order so far, in 0..3. On return *have is updated to the new +- state. If on return *have equals four, then the pattern was found and the +- return value is how many bytes were read including the last byte of the +- pattern. If *have is less than four, then the pattern has not been found +- yet and the return value is len. In the latter case, syncsearch() can be +- called again with more data and the *have state. *have is initialized to +- zero for the first call. +- */ +-local unsigned syncsearch(have, buf, len) +-unsigned FAR *have; +-unsigned char FAR *buf; +-unsigned len; +-{ +- unsigned got; +- unsigned next; +- +- got = *have; +- next = 0; +- while (next < len && got < 4) { +- if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) +- got++; +- else if (buf[next]) +- got = 0; +- else +- got = 4 - got; +- next++; +- } +- *have = got; +- return next; +-} +- +-int ZEXPORT inflateSync(strm) +-z_streamp strm; +-{ +- unsigned len; /* number of bytes to look at or looked at */ +- unsigned long in, out; /* temporary to save total_in and total_out */ +- unsigned char buf[4]; /* to restore bit buffer to byte string */ +- struct inflate_state FAR *state; +- +- /* check parameters */ +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; +- +- /* if first time, start search in bit buffer */ +- if (state->mode != SYNC) { +- state->mode = SYNC; +- state->hold <<= state->bits & 7; +- state->bits -= state->bits & 7; +- len = 0; +- while (state->bits >= 8) { +- buf[len++] = (unsigned char)(state->hold); +- state->hold >>= 8; +- state->bits -= 8; +- } +- state->have = 0; +- syncsearch(&(state->have), buf, len); +- } +- +- /* search available input */ +- len = syncsearch(&(state->have), strm->next_in, strm->avail_in); +- strm->avail_in -= len; +- strm->next_in += len; +- strm->total_in += len; +- +- /* return no joy or set up to restart inflate() on a new block */ +- if (state->have != 4) return Z_DATA_ERROR; +- in = strm->total_in; out = strm->total_out; +- inflateReset(strm); +- strm->total_in = in; strm->total_out = out; +- state->mode = TYPE; +- return Z_OK; +-} +- +-/* +- Returns true if inflate is currently at the end of a block generated by +- Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP +- implementation to provide an additional safety check. PPP uses +- Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored +- block. When decompressing, PPP checks that at the end of input packet, +- inflate is waiting for these length bytes. +- */ +-int ZEXPORT inflateSyncPoint(strm) +-z_streamp strm; +-{ +- struct inflate_state FAR *state; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- return state->mode == STORED && state->bits == 0; +-} +- +-int ZEXPORT inflateCopy(dest, source) +-z_streamp dest; +-z_streamp source; +-{ +- struct inflate_state FAR *state; +- struct inflate_state FAR *copy; +- unsigned char FAR *window; +- unsigned wsize; +- +- /* check input */ +- if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || +- source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) +- return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)source->state; +- +- /* allocate space */ +- copy = (struct inflate_state FAR *) +- ZALLOC(source, 1, sizeof(struct inflate_state)); +- if (copy == Z_NULL) return Z_MEM_ERROR; +- window = Z_NULL; +- if (state->window != Z_NULL) { +- window = (unsigned char FAR *) +- ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); +- if (window == Z_NULL) { +- ZFREE(source, copy); +- return Z_MEM_ERROR; +- } +- } +- +- /* copy state */ +- zmemcpy(dest, source, sizeof(z_stream)); +- zmemcpy(copy, state, sizeof(struct inflate_state)); +- if (state->lencode >= state->codes && +- state->lencode <= state->codes + ENOUGH - 1) { +- copy->lencode = copy->codes + (state->lencode - state->codes); +- copy->distcode = copy->codes + (state->distcode - state->codes); +- } +- copy->next = copy->codes + (state->next - state->codes); +- if (window != Z_NULL) { +- wsize = 1U << state->wbits; +- zmemcpy(window, state->window, wsize); +- } +- copy->window = window; +- dest->state = (struct internal_state FAR *)copy; +- return Z_OK; +-} +- +-int ZEXPORT inflateUndermine(strm, subvert) +-z_streamp strm; +-int subvert; +-{ +- struct inflate_state FAR *state; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +- state = (struct inflate_state FAR *)strm->state; +- state->sane = !subvert; +-#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR +- return Z_OK; +-#else +- state->sane = 1; +- return Z_DATA_ERROR; +-#endif +-} +- +-long ZEXPORT inflateMark(strm) +-z_streamp strm; +-{ +- struct inflate_state FAR *state; +- +- if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; +- state = (struct inflate_state FAR *)strm->state; +- return ((long)(state->back) << 16) + +- (state->mode == COPY ? state->length : +- (state->mode == MATCH ? state->was - state->length : 0)); +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inflate.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inflate.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,146 +0,0 @@ +-/* +- * 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. +- */ +- +-/* inflate.h -- internal inflate state definition +- * Copyright (C) 1995-2009 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-/* define NO_GZIP when compiling if you want to disable gzip header and +- trailer decoding by inflate(). NO_GZIP would be used to avoid linking in +- the crc code when it is not needed. For shared libraries, gzip decoding +- should be left enabled. */ +-#ifndef NO_GZIP +-# define GUNZIP +-#endif +- +-/* Possible inflate modes between inflate() calls */ +-typedef enum { +- HEAD, /* i: waiting for magic header */ +- FLAGS, /* i: waiting for method and flags (gzip) */ +- TIME, /* i: waiting for modification time (gzip) */ +- OS, /* i: waiting for extra flags and operating system (gzip) */ +- EXLEN, /* i: waiting for extra length (gzip) */ +- EXTRA, /* i: waiting for extra bytes (gzip) */ +- NAME, /* i: waiting for end of file name (gzip) */ +- COMMENT, /* i: waiting for end of comment (gzip) */ +- HCRC, /* i: waiting for header crc (gzip) */ +- DICTID, /* i: waiting for dictionary check value */ +- DICT, /* waiting for inflateSetDictionary() call */ +- TYPE, /* i: waiting for type bits, including last-flag bit */ +- TYPEDO, /* i: same, but skip check to exit inflate on new block */ +- STORED, /* i: waiting for stored size (length and complement) */ +- COPY_, /* i/o: same as COPY below, but only first time in */ +- COPY, /* i/o: waiting for input or output to copy stored block */ +- TABLE, /* i: waiting for dynamic block table lengths */ +- LENLENS, /* i: waiting for code length code lengths */ +- CODELENS, /* i: waiting for length/lit and distance code lengths */ +- LEN_, /* i: same as LEN below, but only first time in */ +- LEN, /* i: waiting for length/lit/eob code */ +- LENEXT, /* i: waiting for length extra bits */ +- DIST, /* i: waiting for distance code */ +- DISTEXT, /* i: waiting for distance extra bits */ +- MATCH, /* o: waiting for output space to copy string */ +- LIT, /* o: waiting for output space to write literal */ +- CHECK, /* i: waiting for 32-bit check value */ +- LENGTH, /* i: waiting for 32-bit length (gzip) */ +- DONE, /* finished check, done -- remain here until reset */ +- BAD, /* got a data error -- remain here until reset */ +- MEM, /* got an inflate() memory error -- remain here until reset */ +- SYNC /* looking for synchronization bytes to restart inflate() */ +-} inflate_mode; +- +-/* +- State transitions between above modes - +- +- (most modes can go to BAD or MEM on error -- not shown for clarity) +- +- Process header: +- HEAD -> (gzip) or (zlib) or (raw) +- (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> +- HCRC -> TYPE +- (zlib) -> DICTID or TYPE +- DICTID -> DICT -> TYPE +- (raw) -> TYPEDO +- Read deflate blocks: +- TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK +- STORED -> COPY_ -> COPY -> TYPE +- TABLE -> LENLENS -> CODELENS -> LEN_ +- LEN_ -> LEN +- Read deflate codes in fixed or dynamic block: +- LEN -> LENEXT or LIT or TYPE +- LENEXT -> DIST -> DISTEXT -> MATCH -> LEN +- LIT -> LEN +- Process trailer: +- CHECK -> LENGTH -> DONE +- */ +- +-/* state maintained between inflate() calls. Approximately 10K bytes. */ +-struct inflate_state { +- inflate_mode mode; /* current inflate mode */ +- int last; /* true if processing last block */ +- int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ +- int havedict; /* true if dictionary provided */ +- int flags; /* gzip header method and flags (0 if zlib) */ +- unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ +- unsigned long check; /* protected copy of check value */ +- unsigned long total; /* protected copy of output count */ +- gz_headerp head; /* where to save gzip header information */ +- /* sliding window */ +- unsigned wbits; /* log base 2 of requested window size */ +- unsigned wsize; /* window size or zero if not using window */ +- unsigned whave; /* valid bytes in the window */ +- unsigned wnext; /* window write index */ +- unsigned char FAR *window; /* allocated sliding window, if needed */ +- /* bit accumulator */ +- unsigned long hold; /* input bit accumulator */ +- unsigned bits; /* number of bits in "in" */ +- /* for string and stored block copying */ +- unsigned length; /* literal or length of data to copy */ +- unsigned offset; /* distance back to copy string from */ +- /* for table and code decoding */ +- unsigned extra; /* extra bits needed */ +- /* fixed and dynamic code tables */ +- code const FAR *lencode; /* starting table for length/literal codes */ +- code const FAR *distcode; /* starting table for distance codes */ +- unsigned lenbits; /* index bits for lencode */ +- unsigned distbits; /* index bits for distcode */ +- /* dynamic table building */ +- unsigned ncode; /* number of code length code lengths */ +- unsigned nlen; /* number of length code lengths */ +- unsigned ndist; /* number of distance code lengths */ +- unsigned have; /* number of code lengths in lens[] */ +- code FAR *next; /* next available space in codes[] */ +- unsigned short lens[320]; /* temporary storage for code lengths */ +- unsigned short work[288]; /* work area for code table building */ +- code codes[ENOUGH]; /* space for code tables */ +- int sane; /* if false, allow invalid distance too far */ +- int back; /* bits back of last unprocessed length/lit */ +- unsigned was; /* initial length of match */ +-}; +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inftrees.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inftrees.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,354 +0,0 @@ +-/* +- * 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. +- */ +- +-/* inftrees.c -- generate Huffman trees for efficient decoding +- * Copyright (C) 1995-2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-#include "zutil.h" +-#include "inftrees.h" +- +-#define MAXBITS 15 +- +-const char inflate_copyright[] = +- " inflate 1.2.5 Copyright 1995-2010 Mark Adler "; +-/* +- If you use the zlib library in a product, an acknowledgment is welcome +- in the documentation of your product. If for some reason you cannot +- include such an acknowledgment, I would appreciate that you keep this +- copyright string in the executable of your product. +- */ +- +-/* +- Build a set of tables to decode the provided canonical Huffman code. +- The code lengths are lens[0..codes-1]. The result starts at *table, +- whose indices are 0..2^bits-1. work is a writable array of at least +- lens shorts, which is used as a work area. type is the type of code +- to be generated, CODES, LENS, or DISTS. On return, zero is success, +- -1 is an invalid code, and +1 means that ENOUGH isn't enough. table +- on return points to the next available entry's address. bits is the +- requested root table index bits, and on return it is the actual root +- table index bits. It will differ if the request is greater than the +- longest code or if it is less than the shortest code. +- */ +-int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +-codetype type; +-unsigned short FAR *lens; +-unsigned codes; +-code FAR * FAR *table; +-unsigned FAR *bits; +-unsigned short FAR *work; +-{ +- unsigned len; /* a code's length in bits */ +- unsigned sym; /* index of code symbols */ +- unsigned min, max; /* minimum and maximum code lengths */ +- unsigned root; /* number of index bits for root table */ +- unsigned curr; /* number of index bits for current table */ +- unsigned drop; /* code bits to drop for sub-table */ +- int left; /* number of prefix codes available */ +- unsigned used; /* code entries in table used */ +- unsigned huff; /* Huffman code */ +- unsigned incr; /* for incrementing code, index */ +- unsigned fill; /* index for replicating entries */ +- unsigned low; /* low bits for current root entry */ +- unsigned mask; /* mask for low root bits */ +- code here; /* table entry for duplication */ +- code FAR *next; /* next available space in table */ +- const unsigned short FAR *base; /* base value table to use */ +- const unsigned short FAR *extra; /* extra bits table to use */ +- int end; /* use base and extra for symbol > end */ +- unsigned short count[MAXBITS+1]; /* number of codes of each length */ +- unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ +- static const unsigned short lbase[31] = { /* Length codes 257..285 base */ +- 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, +- 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; +- static const unsigned short lext[31] = { /* Length codes 257..285 extra */ +- 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, +- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195}; +- static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ +- 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, +- 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, +- 8193, 12289, 16385, 24577, 0, 0}; +- static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ +- 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, +- 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, +- 28, 28, 29, 29, 64, 64}; +- +- /* +- Process a set of code lengths to create a canonical Huffman code. The +- code lengths are lens[0..codes-1]. Each length corresponds to the +- symbols 0..codes-1. The Huffman code is generated by first sorting the +- symbols by length from short to long, and retaining the symbol order +- for codes with equal lengths. Then the code starts with all zero bits +- for the first code of the shortest length, and the codes are integer +- increments for the same length, and zeros are appended as the length +- increases. For the deflate format, these bits are stored backwards +- from their more natural integer increment ordering, and so when the +- decoding tables are built in the large loop below, the integer codes +- are incremented backwards. +- +- This routine assumes, but does not check, that all of the entries in +- lens[] are in the range 0..MAXBITS. The caller must assure this. +- 1..MAXBITS is interpreted as that code length. zero means that that +- symbol does not occur in this code. +- +- The codes are sorted by computing a count of codes for each length, +- creating from that a table of starting indices for each length in the +- sorted table, and then entering the symbols in order in the sorted +- table. The sorted table is work[], with that space being provided by +- the caller. +- +- The length counts are used for other purposes as well, i.e. finding +- the minimum and maximum length codes, determining if there are any +- codes at all, checking for a valid set of lengths, and looking ahead +- at length counts to determine sub-table sizes when building the +- decoding tables. +- */ +- +- /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ +- for (len = 0; len <= MAXBITS; len++) +- count[len] = 0; +- for (sym = 0; sym < codes; sym++) +- count[lens[sym]]++; +- +- /* bound code lengths, force root to be within code lengths */ +- root = *bits; +- for (max = MAXBITS; max >= 1; max--) +- if (count[max] != 0) break; +- if (root > max) root = max; +- if (max == 0) { /* no symbols to code at all */ +- here.op = (unsigned char)64; /* invalid code marker */ +- here.bits = (unsigned char)1; +- here.val = (unsigned short)0; +- *(*table)++ = here; /* make a table to force an error */ +- *(*table)++ = here; +- *bits = 1; +- return 0; /* no symbols, but wait for decoding to report error */ +- } +- for (min = 1; min < max; min++) +- if (count[min] != 0) break; +- if (root < min) root = min; +- +- /* check for an over-subscribed or incomplete set of lengths */ +- left = 1; +- for (len = 1; len <= MAXBITS; len++) { +- left <<= 1; +- left -= count[len]; +- if (left < 0) return -1; /* over-subscribed */ +- } +- if (left > 0 && (type == CODES || max != 1)) +- return -1; /* incomplete set */ +- +- /* generate offsets into symbol table for each length for sorting */ +- offs[1] = 0; +- for (len = 1; len < MAXBITS; len++) +- offs[len + 1] = offs[len] + count[len]; +- +- /* sort symbols by length, by symbol order within each length */ +- for (sym = 0; sym < codes; sym++) +- if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; +- +- /* +- Create and fill in decoding tables. In this loop, the table being +- filled is at next and has curr index bits. The code being used is huff +- with length len. That code is converted to an index by dropping drop +- bits off of the bottom. For codes where len is less than drop + curr, +- those top drop + curr - len bits are incremented through all values to +- fill the table with replicated entries. +- +- root is the number of index bits for the root table. When len exceeds +- root, sub-tables are created pointed to by the root entry with an index +- of the low root bits of huff. This is saved in low to check for when a +- new sub-table should be started. drop is zero when the root table is +- being filled, and drop is root when sub-tables are being filled. +- +- When a new sub-table is needed, it is necessary to look ahead in the +- code lengths to determine what size sub-table is needed. The length +- counts are used for this, and so count[] is decremented as codes are +- entered in the tables. +- +- used keeps track of how many table entries have been allocated from the +- provided *table space. It is checked for LENS and DIST tables against +- the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in +- the initial root table size constants. See the comments in inftrees.h +- for more information. +- +- sym increments through all symbols, and the loop terminates when +- all codes of length max, i.e. all codes, have been processed. This +- routine permits incomplete codes, so another loop after this one fills +- in the rest of the decoding tables with invalid code markers. +- */ +- +- /* set up for code type */ +- switch (type) { +- case CODES: +- base = extra = work; /* dummy value--not used */ +- end = 19; +- break; +- case LENS: +- base = lbase; +- base -= 257; +- extra = lext; +- extra -= 257; +- end = 256; +- break; +- default: /* DISTS */ +- base = dbase; +- extra = dext; +- end = -1; +- } +- +- /* initialize state for loop */ +- huff = 0; /* starting code */ +- sym = 0; /* starting code symbol */ +- len = min; /* starting code length */ +- next = *table; /* current table to fill in */ +- curr = root; /* current table index bits */ +- drop = 0; /* current bits to drop from code for index */ +- low = (unsigned)(-1); /* trigger new sub-table when len > root */ +- used = 1U << root; /* use root table entries */ +- mask = used - 1; /* mask for comparing low */ +- +- /* check available table space */ +- if ((type == LENS && used >= ENOUGH_LENS) || +- (type == DISTS && used >= ENOUGH_DISTS)) +- return 1; +- +- /* process all codes and make table entries */ +- for (;;) { +- /* create table entry */ +- here.bits = (unsigned char)(len - drop); +- if ((int)(work[sym]) < end) { +- here.op = (unsigned char)0; +- here.val = work[sym]; +- } +- else if ((int)(work[sym]) > end) { +- here.op = (unsigned char)(extra[work[sym]]); +- here.val = base[work[sym]]; +- } +- else { +- here.op = (unsigned char)(32 + 64); /* end of block */ +- here.val = 0; +- } +- +- /* replicate for those indices with low len bits equal to huff */ +- incr = 1U << (len - drop); +- fill = 1U << curr; +- min = fill; /* save offset to next table */ +- do { +- fill -= incr; +- next[(huff >> drop) + fill] = here; +- } while (fill != 0); +- +- /* backwards increment the len-bit code huff */ +- incr = 1U << (len - 1); +- while (huff & incr) +- incr >>= 1; +- if (incr != 0) { +- huff &= incr - 1; +- huff += incr; +- } +- else +- huff = 0; +- +- /* go to next symbol, update count, len */ +- sym++; +- if (--(count[len]) == 0) { +- if (len == max) break; +- len = lens[work[sym]]; +- } +- +- /* create new sub-table if needed */ +- if (len > root && (huff & mask) != low) { +- /* if first time, transition to sub-tables */ +- if (drop == 0) +- drop = root; +- +- /* increment past last table */ +- next += min; /* here min is 1 << curr */ +- +- /* determine length of next table */ +- curr = len - drop; +- left = (int)(1 << curr); +- while (curr + drop < max) { +- left -= count[curr + drop]; +- if (left <= 0) break; +- curr++; +- left <<= 1; +- } +- +- /* check for enough space */ +- used += 1U << curr; +- if ((type == LENS && used >= ENOUGH_LENS) || +- (type == DISTS && used >= ENOUGH_DISTS)) +- return 1; +- +- /* point entry in root table to sub-table */ +- low = huff & mask; +- (*table)[low].op = (unsigned char)curr; +- (*table)[low].bits = (unsigned char)root; +- (*table)[low].val = (unsigned short)(next - *table); +- } +- } +- +- /* +- Fill in rest of table for incomplete codes. This loop is similar to the +- loop above in incrementing huff for table indices. It is assumed that +- len is equal to curr + drop, so there is no loop needed to increment +- through high index bits. When the current sub-table is filled, the loop +- drops back to the root table to fill in any remaining entries there. +- */ +- here.op = (unsigned char)64; /* invalid code marker */ +- here.bits = (unsigned char)(len - drop); +- here.val = (unsigned short)0; +- while (huff != 0) { +- /* when done with sub-table, drop back to root table */ +- if (drop != 0 && (huff & mask) != low) { +- drop = 0; +- len = root; +- next = *table; +- here.bits = (unsigned char)len; +- } +- +- /* put invalid code marker in table */ +- next[huff >> drop] = here; +- +- /* backwards increment the len-bit code huff */ +- incr = 1U << (len - 1); +- while (huff & incr) +- incr >>= 1; +- if (incr != 0) { +- huff &= incr - 1; +- huff += incr; +- } +- else +- huff = 0; +- } +- +- /* set return parameters */ +- *table += used; +- *bits = root; +- return 0; +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inftrees.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/inftrees.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,86 +0,0 @@ +-/* +- * 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. +- */ +- +-/* inftrees.h -- header to use inftrees.c +- * Copyright (C) 1995-2005, 2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-/* Structure for decoding tables. Each entry provides either the +- information needed to do the operation requested by the code that +- indexed that table entry, or it provides a pointer to another +- table that indexes more bits of the code. op indicates whether +- the entry is a pointer to another table, a literal, a length or +- distance, an end-of-block, or an invalid code. For a table +- pointer, the low four bits of op is the number of index bits of +- that table. For a length or distance, the low four bits of op +- is the number of extra bits to get after the code. bits is +- the number of bits in this code or part of the code to drop off +- of the bit buffer. val is the actual byte to output in the case +- of a literal, the base length or distance, or the offset from +- the current table to the next table. Each entry is four bytes. */ +-typedef struct { +- unsigned char op; /* operation, extra bits, table bits */ +- unsigned char bits; /* bits in this part of the code */ +- unsigned short val; /* offset in table or code value */ +-} code; +- +-/* op values as set by inflate_table(): +- 00000000 - literal +- 0000tttt - table link, tttt != 0 is the number of table index bits +- 0001eeee - length or distance, eeee is the number of extra bits +- 01100000 - end of block +- 01000000 - invalid code +- */ +- +-/* Maximum size of the dynamic table. The maximum number of code structures is +- 1444, which is the sum of 852 for literal/length codes and 592 for distance +- codes. These values were found by exhaustive searches using the program +- examples/enough.c found in the zlib distribtution. The arguments to that +- program are the number of symbols, the initial root table size, and the +- maximum bit length of a code. "enough 286 9 15" for literal/length codes +- returns returns 852, and "enough 30 6 15" for distance codes returns 592. +- The initial root table size (9 or 6) is found in the fifth argument of the +- inflate_table() calls in inflate.c and infback.c. If the root table size is +- changed, then these maximum sizes would be need to be recalculated and +- updated. */ +-#define ENOUGH_LENS 852 +-#define ENOUGH_DISTS 592 +-#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) +- +-/* Type of code to build for inflate_table() */ +-typedef enum { +- CODES, +- LENS, +- DISTS +-} codetype; +- +-int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, +- unsigned codes, code FAR * FAR *table, +- unsigned FAR *bits, unsigned short FAR *work)); +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/patches/ChangeLog_java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/patches/ChangeLog_java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,10 +0,0 @@ +-(1)renamed +- adler32.c -> zadler32.c +- zcrc32c -> zcrc32.c +- +-(2)added _LP64 to make uLong a 32-bit int on 64-bit platform +- zconf.h: +- uLong -> 32-bit int +- +-(3)updated crc32.c/crc32() +- unsigned long -> uLong +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/trees.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/trees.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1268 +0,0 @@ +-/* +- * 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. +- */ +- +-/* trees.c -- output deflated data using Huffman coding +- * Copyright (C) 1995-2010 Jean-loup Gailly +- * detect_data_type() function provided freely by Cosmin Truta, 2006 +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* +- * ALGORITHM +- * +- * The "deflation" process uses several Huffman trees. The more +- * common source values are represented by shorter bit sequences. +- * +- * Each code tree is stored in a compressed form which is itself +- * a Huffman encoding of the lengths of all the code strings (in +- * ascending order by source values). The actual code strings are +- * reconstructed from the lengths in the inflate process, as described +- * in the deflate specification. +- * +- * REFERENCES +- * +- * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". +- * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc +- * +- * Storer, James A. +- * Data Compression: Methods and Theory, pp. 49-50. +- * Computer Science Press, 1988. ISBN 0-7167-8156-5. +- * +- * Sedgewick, R. +- * Algorithms, p290. +- * Addison-Wesley, 1983. ISBN 0-201-06672-6. +- */ +- +-/* @(#) $Id$ */ +- +-/* #define GEN_TREES_H */ +- +-#include "deflate.h" +- +-#ifdef DEBUG +-# include <ctype.h> +-#endif +- +-/* =========================================================================== +- * Constants +- */ +- +-#define MAX_BL_BITS 7 +-/* Bit length codes must not exceed MAX_BL_BITS bits */ +- +-#define END_BLOCK 256 +-/* end of block literal code */ +- +-#define REP_3_6 16 +-/* repeat previous bit length 3-6 times (2 bits of repeat count) */ +- +-#define REPZ_3_10 17 +-/* repeat a zero length 3-10 times (3 bits of repeat count) */ +- +-#define REPZ_11_138 18 +-/* repeat a zero length 11-138 times (7 bits of repeat count) */ +- +-local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ +- = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; +- +-local const int extra_dbits[D_CODES] /* extra bits for each distance code */ +- = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; +- +-local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ +- = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; +- +-local const uch bl_order[BL_CODES] +- = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +-/* The lengths of the bit length codes are sent in order of decreasing +- * probability, to avoid transmitting the lengths for unused bit length codes. +- */ +- +-#define Buf_size (8 * 2*sizeof(char)) +-/* Number of bits used within bi_buf. (bi_buf might be implemented on +- * more than 16 bits on some systems.) +- */ +- +-/* =========================================================================== +- * Local data. These are initialized only once. +- */ +- +-#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ +- +-#if defined(GEN_TREES_H) || !defined(STDC) +-/* non ANSI compilers may not accept trees.h */ +- +-local ct_data static_ltree[L_CODES+2]; +-/* The static literal tree. Since the bit lengths are imposed, there is no +- * need for the L_CODES extra codes used during heap construction. However +- * The codes 286 and 287 are needed to build a canonical tree (see _tr_init +- * below). +- */ +- +-local ct_data static_dtree[D_CODES]; +-/* The static distance tree. (Actually a trivial tree since all codes use +- * 5 bits.) +- */ +- +-uch _dist_code[DIST_CODE_LEN]; +-/* Distance codes. The first 256 values correspond to the distances +- * 3 .. 258, the last 256 values correspond to the top 8 bits of +- * the 15 bit distances. +- */ +- +-uch _length_code[MAX_MATCH-MIN_MATCH+1]; +-/* length code for each normalized match length (0 == MIN_MATCH) */ +- +-local int base_length[LENGTH_CODES]; +-/* First normalized length for each code (0 = MIN_MATCH) */ +- +-local int base_dist[D_CODES]; +-/* First normalized distance for each code (0 = distance of 1) */ +- +-#else +-# include "trees.h" +-#endif /* GEN_TREES_H */ +- +-struct static_tree_desc_s { +- const ct_data *static_tree; /* static tree or NULL */ +- const intf *extra_bits; /* extra bits for each code or NULL */ +- int extra_base; /* base index for extra_bits */ +- int elems; /* max number of elements in the tree */ +- int max_length; /* max bit length for the codes */ +-}; +- +-local static_tree_desc static_l_desc = +-{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; +- +-local static_tree_desc static_d_desc = +-{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; +- +-local static_tree_desc static_bl_desc = +-{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; +- +-/* =========================================================================== +- * Local (static) routines in this file. +- */ +- +-local void tr_static_init OF((void)); +-local void init_block OF((deflate_state *s)); +-local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +-local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +-local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +-local void build_tree OF((deflate_state *s, tree_desc *desc)); +-local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +-local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +-local int build_bl_tree OF((deflate_state *s)); +-local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, +- int blcodes)); +-local void compress_block OF((deflate_state *s, ct_data *ltree, +- ct_data *dtree)); +-local int detect_data_type OF((deflate_state *s)); +-local unsigned bi_reverse OF((unsigned value, int length)); +-local void bi_windup OF((deflate_state *s)); +-local void bi_flush OF((deflate_state *s)); +-local void copy_block OF((deflate_state *s, charf *buf, unsigned len, +- int header)); +- +-#ifdef GEN_TREES_H +-local void gen_trees_header OF((void)); +-#endif +- +-#ifndef DEBUG +-# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) +- /* Send a code of the given tree. c and tree must not have side effects */ +- +-#else /* DEBUG */ +-# define send_code(s, c, tree) \ +- { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ +- send_bits(s, tree[c].Code, tree[c].Len); } +-#endif +- +-/* =========================================================================== +- * Output a short LSB first on the stream. +- * IN assertion: there is enough room in pendingBuf. +- */ +-#define put_short(s, w) { \ +- put_byte(s, (uch)((w) & 0xff)); \ +- put_byte(s, (uch)((ush)(w) >> 8)); \ +-} +- +-/* =========================================================================== +- * Send a value on a given number of bits. +- * IN assertion: length <= 16 and value fits in length bits. +- */ +-#ifdef DEBUG +-local void send_bits OF((deflate_state *s, int value, int length)); +- +-local void send_bits(s, value, length) +- deflate_state *s; +- int value; /* value to send */ +- int length; /* number of bits */ +-{ +- Tracevv((stderr," l %2d v %4x ", length, value)); +- Assert(length > 0 && length <= 15, "invalid length"); +- s->bits_sent += (ulg)length; +- +- /* If not enough room in bi_buf, use (valid) bits from bi_buf and +- * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) +- * unused bits in value. +- */ +- if (s->bi_valid > (int)Buf_size - length) { +- s->bi_buf |= (ush)value << s->bi_valid; +- put_short(s, s->bi_buf); +- s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); +- s->bi_valid += length - Buf_size; +- } else { +- s->bi_buf |= (ush)value << s->bi_valid; +- s->bi_valid += length; +- } +-} +-#else /* !DEBUG */ +- +-#define send_bits(s, value, length) \ +-{ int len = length;\ +- if (s->bi_valid > (int)Buf_size - len) {\ +- int val = value;\ +- s->bi_buf |= (ush)val << s->bi_valid;\ +- put_short(s, s->bi_buf);\ +- s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ +- s->bi_valid += len - Buf_size;\ +- } else {\ +- s->bi_buf |= (ush)(value) << s->bi_valid;\ +- s->bi_valid += len;\ +- }\ +-} +-#endif /* DEBUG */ +- +- +-/* the arguments must not have side effects */ +- +-/* =========================================================================== +- * Initialize the various 'constant' tables. +- */ +-local void tr_static_init() +-{ +-#if defined(GEN_TREES_H) || !defined(STDC) +- static int static_init_done = 0; +- int n; /* iterates over tree elements */ +- int bits; /* bit counter */ +- int length; /* length value */ +- int code; /* code value */ +- int dist; /* distance index */ +- ush bl_count[MAX_BITS+1]; +- /* number of codes at each bit length for an optimal tree */ +- +- if (static_init_done) return; +- +- /* For some embedded targets, global variables are not initialized: */ +-#ifdef NO_INIT_GLOBAL_POINTERS +- static_l_desc.static_tree = static_ltree; +- static_l_desc.extra_bits = extra_lbits; +- static_d_desc.static_tree = static_dtree; +- static_d_desc.extra_bits = extra_dbits; +- static_bl_desc.extra_bits = extra_blbits; +-#endif +- +- /* Initialize the mapping length (0..255) -> length code (0..28) */ +- length = 0; +- for (code = 0; code < LENGTH_CODES-1; code++) { +- base_length[code] = length; +- for (n = 0; n < (1<<extra_lbits[code]); n++) { +- _length_code[length++] = (uch)code; +- } +- } +- Assert (length == 256, "tr_static_init: length != 256"); +- /* Note that the length 255 (match length 258) can be represented +- * in two different ways: code 284 + 5 bits or code 285, so we +- * overwrite length_code[255] to use the best encoding: +- */ +- _length_code[length-1] = (uch)code; +- +- /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ +- dist = 0; +- for (code = 0 ; code < 16; code++) { +- base_dist[code] = dist; +- for (n = 0; n < (1<<extra_dbits[code]); n++) { +- _dist_code[dist++] = (uch)code; +- } +- } +- Assert (dist == 256, "tr_static_init: dist != 256"); +- dist >>= 7; /* from now on, all distances are divided by 128 */ +- for ( ; code < D_CODES; code++) { +- base_dist[code] = dist << 7; +- for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { +- _dist_code[256 + dist++] = (uch)code; +- } +- } +- Assert (dist == 256, "tr_static_init: 256+dist != 512"); +- +- /* Construct the codes of the static literal tree */ +- for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; +- n = 0; +- while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; +- while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; +- while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; +- while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; +- /* Codes 286 and 287 do not exist, but we must include them in the +- * tree construction to get a canonical Huffman tree (longest code +- * all ones) +- */ +- gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); +- +- /* The static distance tree is trivial: */ +- for (n = 0; n < D_CODES; n++) { +- static_dtree[n].Len = 5; +- static_dtree[n].Code = bi_reverse((unsigned)n, 5); +- } +- static_init_done = 1; +- +-# ifdef GEN_TREES_H +- gen_trees_header(); +-# endif +-#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +-} +- +-/* =========================================================================== +- * Genererate the file trees.h describing the static trees. +- */ +-#ifdef GEN_TREES_H +-# ifndef DEBUG +-# include <stdio.h> +-# endif +- +-# define SEPARATOR(i, last, width) \ +- ((i) == (last)? "\n};\n\n" : \ +- ((i) % (width) == (width)-1 ? ",\n" : ", ")) +- +-void gen_trees_header() +-{ +- FILE *header = fopen("trees.h", "w"); +- int i; +- +- Assert (header != NULL, "Can't open trees.h"); +- fprintf(header, +- "/* header created automatically with -DGEN_TREES_H */\n\n"); +- +- fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); +- for (i = 0; i < L_CODES+2; i++) { +- fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, +- static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); +- } +- +- fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); +- for (i = 0; i < D_CODES; i++) { +- fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, +- static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); +- } +- +- fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); +- for (i = 0; i < DIST_CODE_LEN; i++) { +- fprintf(header, "%2u%s", _dist_code[i], +- SEPARATOR(i, DIST_CODE_LEN-1, 20)); +- } +- +- fprintf(header, +- "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); +- for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { +- fprintf(header, "%2u%s", _length_code[i], +- SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); +- } +- +- fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); +- for (i = 0; i < LENGTH_CODES; i++) { +- fprintf(header, "%1u%s", base_length[i], +- SEPARATOR(i, LENGTH_CODES-1, 20)); +- } +- +- fprintf(header, "local const int base_dist[D_CODES] = {\n"); +- for (i = 0; i < D_CODES; i++) { +- fprintf(header, "%5u%s", base_dist[i], +- SEPARATOR(i, D_CODES-1, 10)); +- } +- +- fclose(header); +-} +-#endif /* GEN_TREES_H */ +- +-/* =========================================================================== +- * Initialize the tree data structures for a new zlib stream. +- */ +-void ZLIB_INTERNAL _tr_init(s) +- deflate_state *s; +-{ +- tr_static_init(); +- +- s->l_desc.dyn_tree = s->dyn_ltree; +- s->l_desc.stat_desc = &static_l_desc; +- +- s->d_desc.dyn_tree = s->dyn_dtree; +- s->d_desc.stat_desc = &static_d_desc; +- +- s->bl_desc.dyn_tree = s->bl_tree; +- s->bl_desc.stat_desc = &static_bl_desc; +- +- s->bi_buf = 0; +- s->bi_valid = 0; +- s->last_eob_len = 8; /* enough lookahead for inflate */ +-#ifdef DEBUG +- s->compressed_len = 0L; +- s->bits_sent = 0L; +-#endif +- +- /* Initialize the first block of the first file: */ +- init_block(s); +-} +- +-/* =========================================================================== +- * Initialize a new block. +- */ +-local void init_block(s) +- deflate_state *s; +-{ +- int n; /* iterates over tree elements */ +- +- /* Initialize the trees. */ +- for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; +- for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; +- for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; +- +- s->dyn_ltree[END_BLOCK].Freq = 1; +- s->opt_len = s->static_len = 0L; +- s->last_lit = s->matches = 0; +-} +- +-#define SMALLEST 1 +-/* Index within the heap array of least frequent node in the Huffman tree */ +- +- +-/* =========================================================================== +- * Remove the smallest element from the heap and recreate the heap with +- * one less element. Updates heap and heap_len. +- */ +-#define pqremove(s, tree, top) \ +-{\ +- top = s->heap[SMALLEST]; \ +- s->heap[SMALLEST] = s->heap[s->heap_len--]; \ +- pqdownheap(s, tree, SMALLEST); \ +-} +- +-/* =========================================================================== +- * Compares to subtrees, using the tree depth as tie breaker when +- * the subtrees have equal frequency. This minimizes the worst case length. +- */ +-#define smaller(tree, n, m, depth) \ +- (tree[n].Freq < tree[m].Freq || \ +- (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) +- +-/* =========================================================================== +- * Restore the heap property by moving down the tree starting at node k, +- * exchanging a node with the smallest of its two sons if necessary, stopping +- * when the heap property is re-established (each father smaller than its +- * two sons). +- */ +-local void pqdownheap(s, tree, k) +- deflate_state *s; +- ct_data *tree; /* the tree to restore */ +- int k; /* node to move down */ +-{ +- int v = s->heap[k]; +- int j = k << 1; /* left son of k */ +- while (j <= s->heap_len) { +- /* Set j to the smallest of the two sons: */ +- if (j < s->heap_len && +- smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { +- j++; +- } +- /* Exit if v is smaller than both sons */ +- if (smaller(tree, v, s->heap[j], s->depth)) break; +- +- /* Exchange v with the smallest son */ +- s->heap[k] = s->heap[j]; k = j; +- +- /* And continue down the tree, setting j to the left son of k */ +- j <<= 1; +- } +- s->heap[k] = v; +-} +- +-/* =========================================================================== +- * Compute the optimal bit lengths for a tree and update the total bit length +- * for the current block. +- * IN assertion: the fields freq and dad are set, heap[heap_max] and +- * above are the tree nodes sorted by increasing frequency. +- * OUT assertions: the field len is set to the optimal bit length, the +- * array bl_count contains the frequencies for each bit length. +- * The length opt_len is updated; static_len is also updated if stree is +- * not null. +- */ +-local void gen_bitlen(s, desc) +- deflate_state *s; +- tree_desc *desc; /* the tree descriptor */ +-{ +- ct_data *tree = desc->dyn_tree; +- int max_code = desc->max_code; +- const ct_data *stree = desc->stat_desc->static_tree; +- const intf *extra = desc->stat_desc->extra_bits; +- int base = desc->stat_desc->extra_base; +- int max_length = desc->stat_desc->max_length; +- int h; /* heap index */ +- int n, m; /* iterate over the tree elements */ +- int bits; /* bit length */ +- int xbits; /* extra bits */ +- ush f; /* frequency */ +- int overflow = 0; /* number of elements with bit length too large */ +- +- for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; +- +- /* In a first pass, compute the optimal bit lengths (which may +- * overflow in the case of the bit length tree). +- */ +- tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ +- +- for (h = s->heap_max+1; h < HEAP_SIZE; h++) { +- n = s->heap[h]; +- bits = tree[tree[n].Dad].Len + 1; +- if (bits > max_length) bits = max_length, overflow++; +- tree[n].Len = (ush)bits; +- /* We overwrite tree[n].Dad which is no longer needed */ +- +- if (n > max_code) continue; /* not a leaf node */ +- +- s->bl_count[bits]++; +- xbits = 0; +- if (n >= base) xbits = extra[n-base]; +- f = tree[n].Freq; +- s->opt_len += (ulg)f * (bits + xbits); +- if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); +- } +- if (overflow == 0) return; +- +- Trace((stderr,"\nbit length overflow\n")); +- /* This happens for example on obj2 and pic of the Calgary corpus */ +- +- /* Find the first bit length which could increase: */ +- do { +- bits = max_length-1; +- while (s->bl_count[bits] == 0) bits--; +- s->bl_count[bits]--; /* move one leaf down the tree */ +- s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ +- s->bl_count[max_length]--; +- /* The brother of the overflow item also moves one step up, +- * but this does not affect bl_count[max_length] +- */ +- overflow -= 2; +- } while (overflow > 0); +- +- /* Now recompute all bit lengths, scanning in increasing frequency. +- * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all +- * lengths instead of fixing only the wrong ones. This idea is taken +- * from 'ar' written by Haruhiko Okumura.) +- */ +- for (bits = max_length; bits != 0; bits--) { +- n = s->bl_count[bits]; +- while (n != 0) { +- m = s->heap[--h]; +- if (m > max_code) continue; +- if ((unsigned) tree[m].Len != (unsigned) bits) { +- Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); +- s->opt_len += ((long)bits - (long)tree[m].Len) +- *(long)tree[m].Freq; +- tree[m].Len = (ush)bits; +- } +- n--; +- } +- } +-} +- +-/* =========================================================================== +- * Generate the codes for a given tree and bit counts (which need not be +- * optimal). +- * IN assertion: the array bl_count contains the bit length statistics for +- * the given tree and the field len is set for all tree elements. +- * OUT assertion: the field code is set for all tree elements of non +- * zero code length. +- */ +-local void gen_codes (tree, max_code, bl_count) +- ct_data *tree; /* the tree to decorate */ +- int max_code; /* largest code with non zero frequency */ +- ushf *bl_count; /* number of codes at each bit length */ +-{ +- ush next_code[MAX_BITS+1]; /* next code value for each bit length */ +- ush code = 0; /* running code value */ +- int bits; /* bit index */ +- int n; /* code index */ +- +- /* The distribution counts are first used to generate the code values +- * without bit reversal. +- */ +- for (bits = 1; bits <= MAX_BITS; bits++) { +- next_code[bits] = code = (code + bl_count[bits-1]) << 1; +- } +- /* Check that the bit counts in bl_count are consistent. The last code +- * must be all ones. +- */ +- Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1, +- "inconsistent bit counts"); +- Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); +- +- for (n = 0; n <= max_code; n++) { +- int len = tree[n].Len; +- if (len == 0) continue; +- /* Now reverse the bits */ +- tree[n].Code = bi_reverse(next_code[len]++, len); +- +- Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", +- n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); +- } +-} +- +-/* =========================================================================== +- * Construct one Huffman tree and assigns the code bit strings and lengths. +- * Update the total bit length for the current block. +- * IN assertion: the field freq is set for all tree elements. +- * OUT assertions: the fields len and code are set to the optimal bit length +- * and corresponding code. The length opt_len is updated; static_len is +- * also updated if stree is not null. The field max_code is set. +- */ +-local void build_tree(s, desc) +- deflate_state *s; +- tree_desc *desc; /* the tree descriptor */ +-{ +- ct_data *tree = desc->dyn_tree; +- const ct_data *stree = desc->stat_desc->static_tree; +- int elems = desc->stat_desc->elems; +- int n, m; /* iterate over heap elements */ +- int max_code = -1; /* largest code with non zero frequency */ +- int node; /* new node being created */ +- +- /* Construct the initial heap, with least frequent element in +- * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. +- * heap[0] is not used. +- */ +- s->heap_len = 0, s->heap_max = HEAP_SIZE; +- +- for (n = 0; n < elems; n++) { +- if (tree[n].Freq != 0) { +- s->heap[++(s->heap_len)] = max_code = n; +- s->depth[n] = 0; +- } else { +- tree[n].Len = 0; +- } +- } +- +- /* The pkzip format requires that at least one distance code exists, +- * and that at least one bit should be sent even if there is only one +- * possible code. So to avoid special checks later on we force at least +- * two codes of non zero frequency. +- */ +- while (s->heap_len < 2) { +- node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); +- tree[node].Freq = 1; +- s->depth[node] = 0; +- s->opt_len--; if (stree) s->static_len -= stree[node].Len; +- /* node is 0 or 1 so it does not have extra bits */ +- } +- desc->max_code = max_code; +- +- /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, +- * establish sub-heaps of increasing lengths: +- */ +- for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); +- +- /* Construct the Huffman tree by repeatedly combining the least two +- * frequent nodes. +- */ +- node = elems; /* next internal node of the tree */ +- do { +- pqremove(s, tree, n); /* n = node of least frequency */ +- m = s->heap[SMALLEST]; /* m = node of next least frequency */ +- +- s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ +- s->heap[--(s->heap_max)] = m; +- +- /* Create a new node father of n and m */ +- tree[node].Freq = tree[n].Freq + tree[m].Freq; +- s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? +- s->depth[n] : s->depth[m]) + 1); +- tree[n].Dad = tree[m].Dad = (ush)node; +-#ifdef DUMP_BL_TREE +- if (tree == s->bl_tree) { +- fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", +- node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); +- } +-#endif +- /* and insert the new node in the heap */ +- s->heap[SMALLEST] = node++; +- pqdownheap(s, tree, SMALLEST); +- +- } while (s->heap_len >= 2); +- +- s->heap[--(s->heap_max)] = s->heap[SMALLEST]; +- +- /* At this point, the fields freq and dad are set. We can now +- * generate the bit lengths. +- */ +- gen_bitlen(s, (tree_desc *)desc); +- +- /* The field len is now set, we can generate the bit codes */ +- gen_codes ((ct_data *)tree, max_code, s->bl_count); +-} +- +-/* =========================================================================== +- * Scan a literal or distance tree to determine the frequencies of the codes +- * in the bit length tree. +- */ +-local void scan_tree (s, tree, max_code) +- deflate_state *s; +- ct_data *tree; /* the tree to be scanned */ +- int max_code; /* and its largest code of non zero frequency */ +-{ +- int n; /* iterates over all tree elements */ +- int prevlen = -1; /* last emitted length */ +- int curlen; /* length of current code */ +- int nextlen = tree[0].Len; /* length of next code */ +- int count = 0; /* repeat count of the current code */ +- int max_count = 7; /* max repeat count */ +- int min_count = 4; /* min repeat count */ +- +- if (nextlen == 0) max_count = 138, min_count = 3; +- tree[max_code+1].Len = (ush)0xffff; /* guard */ +- +- for (n = 0; n <= max_code; n++) { +- curlen = nextlen; nextlen = tree[n+1].Len; +- if (++count < max_count && curlen == nextlen) { +- continue; +- } else if (count < min_count) { +- s->bl_tree[curlen].Freq += count; +- } else if (curlen != 0) { +- if (curlen != prevlen) s->bl_tree[curlen].Freq++; +- s->bl_tree[REP_3_6].Freq++; +- } else if (count <= 10) { +- s->bl_tree[REPZ_3_10].Freq++; +- } else { +- s->bl_tree[REPZ_11_138].Freq++; +- } +- count = 0; prevlen = curlen; +- if (nextlen == 0) { +- max_count = 138, min_count = 3; +- } else if (curlen == nextlen) { +- max_count = 6, min_count = 3; +- } else { +- max_count = 7, min_count = 4; +- } +- } +-} +- +-/* =========================================================================== +- * Send a literal or distance tree in compressed form, using the codes in +- * bl_tree. +- */ +-local void send_tree (s, tree, max_code) +- deflate_state *s; +- ct_data *tree; /* the tree to be scanned */ +- int max_code; /* and its largest code of non zero frequency */ +-{ +- int n; /* iterates over all tree elements */ +- int prevlen = -1; /* last emitted length */ +- int curlen; /* length of current code */ +- int nextlen = tree[0].Len; /* length of next code */ +- int count = 0; /* repeat count of the current code */ +- int max_count = 7; /* max repeat count */ +- int min_count = 4; /* min repeat count */ +- +- /* tree[max_code+1].Len = -1; */ /* guard already set */ +- if (nextlen == 0) max_count = 138, min_count = 3; +- +- for (n = 0; n <= max_code; n++) { +- curlen = nextlen; nextlen = tree[n+1].Len; +- if (++count < max_count && curlen == nextlen) { +- continue; +- } else if (count < min_count) { +- do { send_code(s, curlen, s->bl_tree); } while (--count != 0); +- +- } else if (curlen != 0) { +- if (curlen != prevlen) { +- send_code(s, curlen, s->bl_tree); count--; +- } +- Assert(count >= 3 && count <= 6, " 3_6?"); +- send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); +- +- } else if (count <= 10) { +- send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); +- +- } else { +- send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); +- } +- count = 0; prevlen = curlen; +- if (nextlen == 0) { +- max_count = 138, min_count = 3; +- } else if (curlen == nextlen) { +- max_count = 6, min_count = 3; +- } else { +- max_count = 7, min_count = 4; +- } +- } +-} +- +-/* =========================================================================== +- * Construct the Huffman tree for the bit lengths and return the index in +- * bl_order of the last bit length code to send. +- */ +-local int build_bl_tree(s) +- deflate_state *s; +-{ +- int max_blindex; /* index of last bit length code of non zero freq */ +- +- /* Determine the bit length frequencies for literal and distance trees */ +- scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); +- scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); +- +- /* Build the bit length tree: */ +- build_tree(s, (tree_desc *)(&(s->bl_desc))); +- /* opt_len now includes the length of the tree representations, except +- * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. +- */ +- +- /* Determine the number of bit length codes to send. The pkzip format +- * requires that at least 4 bit length codes be sent. (appnote.txt says +- * 3 but the actual value used is 4.) +- */ +- for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { +- if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; +- } +- /* Update opt_len to include the bit length tree and counts */ +- s->opt_len += 3*(max_blindex+1) + 5+5+4; +- Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", +- s->opt_len, s->static_len)); +- +- return max_blindex; +-} +- +-/* =========================================================================== +- * Send the header for a block using dynamic Huffman trees: the counts, the +- * lengths of the bit length codes, the literal tree and the distance tree. +- * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. +- */ +-local void send_all_trees(s, lcodes, dcodes, blcodes) +- deflate_state *s; +- int lcodes, dcodes, blcodes; /* number of codes for each tree */ +-{ +- int rank; /* index in bl_order */ +- +- Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); +- Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, +- "too many codes"); +- Tracev((stderr, "\nbl counts: ")); +- send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ +- send_bits(s, dcodes-1, 5); +- send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ +- for (rank = 0; rank < blcodes; rank++) { +- Tracev((stderr, "\nbl code %2d ", bl_order[rank])); +- send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); +- } +- Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); +- +- send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ +- Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); +- +- send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ +- Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +-} +- +-/* =========================================================================== +- * Send a stored block +- */ +-void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) +- deflate_state *s; +- charf *buf; /* input block */ +- ulg stored_len; /* length of input block */ +- int last; /* one if this is the last block for a file */ +-{ +- send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ +-#ifdef DEBUG +- s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; +- s->compressed_len += (stored_len + 4) << 3; +-#endif +- copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +-} +- +-/* =========================================================================== +- * Send one empty static block to give enough lookahead for inflate. +- * This takes 10 bits, of which 7 may remain in the bit buffer. +- * The current inflate code requires 9 bits of lookahead. If the +- * last two codes for the previous block (real code plus EOB) were coded +- * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode +- * the last real code. In this case we send two empty static blocks instead +- * of one. (There are no problems if the previous block is stored or fixed.) +- * To simplify the code, we assume the worst case of last real code encoded +- * on one bit only. +- */ +-void ZLIB_INTERNAL _tr_align(s) +- deflate_state *s; +-{ +- send_bits(s, STATIC_TREES<<1, 3); +- send_code(s, END_BLOCK, static_ltree); +-#ifdef DEBUG +- s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +-#endif +- bi_flush(s); +- /* Of the 10 bits for the empty block, we have already sent +- * (10 - bi_valid) bits. The lookahead for the last real code (before +- * the EOB of the previous block) was thus at least one plus the length +- * of the EOB plus what we have just sent of the empty static block. +- */ +- if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { +- send_bits(s, STATIC_TREES<<1, 3); +- send_code(s, END_BLOCK, static_ltree); +-#ifdef DEBUG +- s->compressed_len += 10L; +-#endif +- bi_flush(s); +- } +- s->last_eob_len = 7; +-} +- +-/* =========================================================================== +- * Determine the best encoding for the current block: dynamic trees, static +- * trees or store, and output the encoded block to the zip file. +- */ +-void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) +- deflate_state *s; +- charf *buf; /* input block, or NULL if too old */ +- ulg stored_len; /* length of input block */ +- int last; /* one if this is the last block for a file */ +-{ +- ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ +- int max_blindex = 0; /* index of last bit length code of non zero freq */ +- +- /* Build the Huffman trees unless a stored block is forced */ +- if (s->level > 0) { +- +- /* Check if the file is binary or text */ +- if (s->strm->data_type == Z_UNKNOWN) +- s->strm->data_type = detect_data_type(s); +- +- /* Construct the literal and distance trees */ +- build_tree(s, (tree_desc *)(&(s->l_desc))); +- Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, +- s->static_len)); +- +- build_tree(s, (tree_desc *)(&(s->d_desc))); +- Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, +- s->static_len)); +- /* At this point, opt_len and static_len are the total bit lengths of +- * the compressed block data, excluding the tree representations. +- */ +- +- /* Build the bit length tree for the above two trees, and get the index +- * in bl_order of the last bit length code to send. +- */ +- max_blindex = build_bl_tree(s); +- +- /* Determine the best encoding. Compute the block lengths in bytes. */ +- opt_lenb = (s->opt_len+3+7)>>3; +- static_lenb = (s->static_len+3+7)>>3; +- +- Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", +- opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, +- s->last_lit)); +- +- if (static_lenb <= opt_lenb) opt_lenb = static_lenb; +- +- } else { +- Assert(buf != (char*)0, "lost buf"); +- opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ +- } +- +-#ifdef FORCE_STORED +- if (buf != (char*)0) { /* force stored block */ +-#else +- if (stored_len+4 <= opt_lenb && buf != (char*)0) { +- /* 4: two words for the lengths */ +-#endif +- /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. +- * Otherwise we can't have processed more than WSIZE input bytes since +- * the last block flush, because compression would have been +- * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to +- * transform a block into a stored block. +- */ +- _tr_stored_block(s, buf, stored_len, last); +- +-#ifdef FORCE_STATIC +- } else if (static_lenb >= 0) { /* force static trees */ +-#else +- } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +-#endif +- send_bits(s, (STATIC_TREES<<1)+last, 3); +- compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +-#ifdef DEBUG +- s->compressed_len += 3 + s->static_len; +-#endif +- } else { +- send_bits(s, (DYN_TREES<<1)+last, 3); +- send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, +- max_blindex+1); +- compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +-#ifdef DEBUG +- s->compressed_len += 3 + s->opt_len; +-#endif +- } +- Assert (s->compressed_len == s->bits_sent, "bad compressed size"); +- /* The above check is made mod 2^32, for files larger than 512 MB +- * and uLong implemented on 32 bits. +- */ +- init_block(s); +- +- if (last) { +- bi_windup(s); +-#ifdef DEBUG +- s->compressed_len += 7; /* align on byte boundary */ +-#endif +- } +- Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, +- s->compressed_len-7*last)); +-} +- +-/* =========================================================================== +- * Save the match info and tally the frequency counts. Return true if +- * the current block must be flushed. +- */ +-int ZLIB_INTERNAL _tr_tally (s, dist, lc) +- deflate_state *s; +- unsigned dist; /* distance of matched string */ +- unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +-{ +- s->d_buf[s->last_lit] = (ush)dist; +- s->l_buf[s->last_lit++] = (uch)lc; +- if (dist == 0) { +- /* lc is the unmatched char */ +- s->dyn_ltree[lc].Freq++; +- } else { +- s->matches++; +- /* Here, lc is the match length - MIN_MATCH */ +- dist--; /* dist = match distance - 1 */ +- Assert((ush)dist < (ush)MAX_DIST(s) && +- (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && +- (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); +- +- s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; +- s->dyn_dtree[d_code(dist)].Freq++; +- } +- +-#ifdef TRUNCATE_BLOCK +- /* Try to guess if it is profitable to stop the current block here */ +- if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { +- /* Compute an upper bound for the compressed length */ +- ulg out_length = (ulg)s->last_lit*8L; +- ulg in_length = (ulg)((long)s->strstart - s->block_start); +- int dcode; +- for (dcode = 0; dcode < D_CODES; dcode++) { +- out_length += (ulg)s->dyn_dtree[dcode].Freq * +- (5L+extra_dbits[dcode]); +- } +- out_length >>= 3; +- Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", +- s->last_lit, in_length, out_length, +- 100L - out_length*100L/in_length)); +- if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; +- } +-#endif +- return (s->last_lit == s->lit_bufsize-1); +- /* We avoid equality with lit_bufsize because of wraparound at 64K +- * on 16 bit machines and because stored blocks are restricted to +- * 64K-1 bytes. +- */ +-} +- +-/* =========================================================================== +- * Send the block data compressed using the given Huffman trees +- */ +-local void compress_block(s, ltree, dtree) +- deflate_state *s; +- ct_data *ltree; /* literal tree */ +- ct_data *dtree; /* distance tree */ +-{ +- unsigned dist; /* distance of matched string */ +- int lc; /* match length or unmatched char (if dist == 0) */ +- unsigned lx = 0; /* running index in l_buf */ +- unsigned code; /* the code to send */ +- int extra; /* number of extra bits to send */ +- +- if (s->last_lit != 0) do { +- dist = s->d_buf[lx]; +- lc = s->l_buf[lx++]; +- if (dist == 0) { +- send_code(s, lc, ltree); /* send a literal byte */ +- Tracecv(isgraph(lc), (stderr," '%c' ", lc)); +- } else { +- /* Here, lc is the match length - MIN_MATCH */ +- code = _length_code[lc]; +- send_code(s, code+LITERALS+1, ltree); /* send the length code */ +- extra = extra_lbits[code]; +- if (extra != 0) { +- lc -= base_length[code]; +- send_bits(s, lc, extra); /* send the extra length bits */ +- } +- dist--; /* dist is now the match distance - 1 */ +- code = d_code(dist); +- Assert (code < D_CODES, "bad d_code"); +- +- send_code(s, code, dtree); /* send the distance code */ +- extra = extra_dbits[code]; +- if (extra != 0) { +- dist -= base_dist[code]; +- send_bits(s, dist, extra); /* send the extra distance bits */ +- } +- } /* literal or match pair ? */ +- +- /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ +- Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, +- "pendingBuf overflow"); +- +- } while (lx < s->last_lit); +- +- send_code(s, END_BLOCK, ltree); +- s->last_eob_len = ltree[END_BLOCK].Len; +-} +- +-/* =========================================================================== +- * Check if the data type is TEXT or BINARY, using the following algorithm: +- * - TEXT if the two conditions below are satisfied: +- * a) There are no non-portable control characters belonging to the +- * "black list" (0..6, 14..25, 28..31). +- * b) There is at least one printable character belonging to the +- * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). +- * - BINARY otherwise. +- * - The following partially-portable control characters form a +- * "gray list" that is ignored in this detection algorithm: +- * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). +- * IN assertion: the fields Freq of dyn_ltree are set. +- */ +-local int detect_data_type(s) +- deflate_state *s; +-{ +- /* black_mask is the bit mask of black-listed bytes +- * set bits 0..6, 14..25, and 28..31 +- * 0xf3ffc07f = binary 11110011111111111100000001111111 +- */ +- unsigned long black_mask = 0xf3ffc07fUL; +- int n; +- +- /* Check for non-textual ("black-listed") bytes. */ +- for (n = 0; n <= 31; n++, black_mask >>= 1) +- if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) +- return Z_BINARY; +- +- /* Check for textual ("white-listed") bytes. */ +- if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 +- || s->dyn_ltree[13].Freq != 0) +- return Z_TEXT; +- for (n = 32; n < LITERALS; n++) +- if (s->dyn_ltree[n].Freq != 0) +- return Z_TEXT; +- +- /* There are no "black-listed" or "white-listed" bytes: +- * this stream either is empty or has tolerated ("gray-listed") bytes only. +- */ +- return Z_BINARY; +-} +- +-/* =========================================================================== +- * Reverse the first len bits of a code, using straightforward code (a faster +- * method would use a table) +- * IN assertion: 1 <= len <= 15 +- */ +-local unsigned bi_reverse(code, len) +- unsigned code; /* the value to invert */ +- int len; /* its bit length */ +-{ +- register unsigned res = 0; +- do { +- res |= code & 1; +- code >>= 1, res <<= 1; +- } while (--len > 0); +- return res >> 1; +-} +- +-/* =========================================================================== +- * Flush the bit buffer, keeping at most 7 bits in it. +- */ +-local void bi_flush(s) +- deflate_state *s; +-{ +- if (s->bi_valid == 16) { +- put_short(s, s->bi_buf); +- s->bi_buf = 0; +- s->bi_valid = 0; +- } else if (s->bi_valid >= 8) { +- put_byte(s, (Byte)s->bi_buf); +- s->bi_buf >>= 8; +- s->bi_valid -= 8; +- } +-} +- +-/* =========================================================================== +- * Flush the bit buffer and align the output on a byte boundary +- */ +-local void bi_windup(s) +- deflate_state *s; +-{ +- if (s->bi_valid > 8) { +- put_short(s, s->bi_buf); +- } else if (s->bi_valid > 0) { +- put_byte(s, (Byte)s->bi_buf); +- } +- s->bi_buf = 0; +- s->bi_valid = 0; +-#ifdef DEBUG +- s->bits_sent = (s->bits_sent+7) & ~7; +-#endif +-} +- +-/* =========================================================================== +- * Copy a stored block, storing first the length and its +- * one's complement if requested. +- */ +-local void copy_block(s, buf, len, header) +- deflate_state *s; +- charf *buf; /* the input data */ +- unsigned len; /* its length */ +- int header; /* true if block header must be written */ +-{ +- bi_windup(s); /* align on byte boundary */ +- s->last_eob_len = 8; /* enough lookahead for inflate */ +- +- if (header) { +- put_short(s, (ush)len); +- put_short(s, (ush)~len); +-#ifdef DEBUG +- s->bits_sent += 2*16; +-#endif +- } +-#ifdef DEBUG +- s->bits_sent += (ulg)len<<3; +-#endif +- while (len--) { +- put_byte(s, *buf++); +- } +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/trees.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/trees.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,152 +0,0 @@ +-/* +- * 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. +- */ +- +-/* header created automatically with -DGEN_TREES_H */ +- +-local const ct_data static_ltree[L_CODES+2] = { +-{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +-{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +-{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +-{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +-{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +-{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +-{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +-{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +-{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +-{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +-{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +-{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +-{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +-{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +-{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +-{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +-{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +-{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +-{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +-{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +-{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +-{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +-{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +-{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +-{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +-{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +-{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +-{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +-{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +-{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +-{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +-{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +-{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +-{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +-{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +-{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +-{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +-{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +-{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +-{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +-{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +-{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +-{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +-{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +-{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +-{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +-{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +-{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +-{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +-{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +-{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +-{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +-{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +-{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +-{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +-{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +-{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +-{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +-}; +- +-local const ct_data static_dtree[D_CODES] = { +-{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +-{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +-{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +-{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +-{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +-{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +-}; +- +-const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { +- 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, +- 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +-10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +-11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +-12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +-13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +-13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +-18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +-24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +-27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +-28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +-}; +- +-const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { +- 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +-13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +-17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +-19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +-21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +-22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +-24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +-26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +-}; +- +-local const int base_length[LENGTH_CODES] = { +-0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +-64, 80, 96, 112, 128, 160, 192, 224, 0 +-}; +- +-local const int base_dist[D_CODES] = { +- 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, +- 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, +- 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +-}; +- +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/uncompr.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/uncompr.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,83 +0,0 @@ +-/* +- * 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. +- */ +- +-/* uncompr.c -- decompress a memory buffer +- * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* @(#) $Id$ */ +- +-#define ZLIB_INTERNAL +-#include "zlib.h" +- +-/* =========================================================================== +- Decompresses the source buffer into the destination buffer. sourceLen is +- the byte length of the source buffer. Upon entry, destLen is the total +- size of the destination buffer, which must be large enough to hold the +- entire uncompressed data. (The size of the uncompressed data must have +- been saved previously by the compressor and transmitted to the decompressor +- by some mechanism outside the scope of this compression library.) +- Upon exit, destLen is the actual size of the compressed buffer. +- +- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not +- enough memory, Z_BUF_ERROR if there was not enough room in the output +- buffer, or Z_DATA_ERROR if the input data was corrupted. +-*/ +-int ZEXPORT uncompress (dest, destLen, source, sourceLen) +- Bytef *dest; +- uLongf *destLen; +- const Bytef *source; +- uLong sourceLen; +-{ +- z_stream stream; +- int err; +- +- stream.next_in = (Bytef*)source; +- stream.avail_in = (uInt)sourceLen; +- /* Check for source > 64K on 16-bit machine: */ +- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +- +- stream.next_out = dest; +- stream.avail_out = (uInt)*destLen; +- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; +- +- stream.zalloc = (alloc_func)0; +- stream.zfree = (free_func)0; +- +- err = inflateInit(&stream); +- if (err != Z_OK) return err; +- +- err = inflate(&stream, Z_FINISH); +- if (err != Z_STREAM_END) { +- inflateEnd(&stream); +- if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) +- return Z_DATA_ERROR; +- return err; +- } +- *destLen = (uLong)stream.total_out; +- +- err = inflateEnd(&stream); +- return err; +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zadler32.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zadler32.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,193 +0,0 @@ +-/* +- * 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. +- */ +- +-/* adler32.c -- compute the Adler-32 checksum of a data stream +- * Copyright (C) 1995-2007 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* @(#) $Id$ */ +- +-#include "zutil.h" +- +-#define local static +- +-local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2); +- +-#define BASE 65521UL /* largest prime smaller than 65536 */ +-#define NMAX 5552 +-/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ +- +-#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +-#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +-#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +-#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +-#define DO16(buf) DO8(buf,0); DO8(buf,8); +- +-/* use NO_DIVIDE if your processor does not do division in hardware */ +-#ifdef NO_DIVIDE +-# define MOD(a) \ +- do { \ +- if (a >= (BASE << 16)) a -= (BASE << 16); \ +- if (a >= (BASE << 15)) a -= (BASE << 15); \ +- if (a >= (BASE << 14)) a -= (BASE << 14); \ +- if (a >= (BASE << 13)) a -= (BASE << 13); \ +- if (a >= (BASE << 12)) a -= (BASE << 12); \ +- if (a >= (BASE << 11)) a -= (BASE << 11); \ +- if (a >= (BASE << 10)) a -= (BASE << 10); \ +- if (a >= (BASE << 9)) a -= (BASE << 9); \ +- if (a >= (BASE << 8)) a -= (BASE << 8); \ +- if (a >= (BASE << 7)) a -= (BASE << 7); \ +- if (a >= (BASE << 6)) a -= (BASE << 6); \ +- if (a >= (BASE << 5)) a -= (BASE << 5); \ +- if (a >= (BASE << 4)) a -= (BASE << 4); \ +- if (a >= (BASE << 3)) a -= (BASE << 3); \ +- if (a >= (BASE << 2)) a -= (BASE << 2); \ +- if (a >= (BASE << 1)) a -= (BASE << 1); \ +- if (a >= BASE) a -= BASE; \ +- } while (0) +-# define MOD4(a) \ +- do { \ +- if (a >= (BASE << 4)) a -= (BASE << 4); \ +- if (a >= (BASE << 3)) a -= (BASE << 3); \ +- if (a >= (BASE << 2)) a -= (BASE << 2); \ +- if (a >= (BASE << 1)) a -= (BASE << 1); \ +- if (a >= BASE) a -= BASE; \ +- } while (0) +-#else +-# define MOD(a) a %= BASE +-# define MOD4(a) a %= BASE +-#endif +- +-/* ========================================================================= */ +-uLong ZEXPORT adler32(adler, buf, len) +- uLong adler; +- const Bytef *buf; +- uInt len; +-{ +- unsigned long sum2; +- unsigned n; +- +- /* split Adler-32 into component sums */ +- sum2 = (adler >> 16) & 0xffff; +- adler &= 0xffff; +- +- /* in case user likes doing a byte at a time, keep it fast */ +- if (len == 1) { +- adler += buf[0]; +- if (adler >= BASE) +- adler -= BASE; +- sum2 += adler; +- if (sum2 >= BASE) +- sum2 -= BASE; +- return adler | (sum2 << 16); +- } +- +- /* initial Adler-32 value (deferred check for len == 1 speed) */ +- if (buf == Z_NULL) +- return 1L; +- +- /* in case short lengths are provided, keep it somewhat fast */ +- if (len < 16) { +- while (len--) { +- adler += *buf++; +- sum2 += adler; +- } +- if (adler >= BASE) +- adler -= BASE; +- MOD4(sum2); /* only added so many BASE's */ +- return adler | (sum2 << 16); +- } +- +- /* do length NMAX blocks -- requires just one modulo operation */ +- while (len >= NMAX) { +- len -= NMAX; +- n = NMAX / 16; /* NMAX is divisible by 16 */ +- do { +- DO16(buf); /* 16 sums unrolled */ +- buf += 16; +- } while (--n); +- MOD(adler); +- MOD(sum2); +- } +- +- /* do remaining bytes (less than NMAX, still just one modulo) */ +- if (len) { /* avoid modulos if none remaining */ +- while (len >= 16) { +- len -= 16; +- DO16(buf); +- buf += 16; +- } +- while (len--) { +- adler += *buf++; +- sum2 += adler; +- } +- MOD(adler); +- MOD(sum2); +- } +- +- /* return recombined sums */ +- return adler | (sum2 << 16); +-} +- +-/* ========================================================================= */ +-local uLong adler32_combine_(adler1, adler2, len2) +- uLong adler1; +- uLong adler2; +- z_off64_t len2; +-{ +- unsigned long sum1; +- unsigned long sum2; +- unsigned rem; +- +- /* the derivation of this formula is left as an exercise for the reader */ +- rem = (unsigned)(len2 % BASE); +- sum1 = adler1 & 0xffff; +- sum2 = rem * sum1; +- MOD(sum2); +- sum1 += (adler2 & 0xffff) + BASE - 1; +- sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; +- if (sum1 >= BASE) sum1 -= BASE; +- if (sum1 >= BASE) sum1 -= BASE; +- if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); +- if (sum2 >= BASE) sum2 -= BASE; +- return sum1 | (sum2 << 16); +-} +- +-/* ========================================================================= */ +-uLong ZEXPORT adler32_combine(adler1, adler2, len2) +- uLong adler1; +- uLong adler2; +- z_off_t len2; +-{ +- return adler32_combine_(adler1, adler2, len2); +-} +- +-uLong ZEXPORT adler32_combine64(adler1, adler2, len2) +- uLong adler1; +- uLong adler2; +- z_off64_t len2; +-{ +- return adler32_combine_(adler1, adler2, len2); +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zconf.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zconf.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,459 +0,0 @@ +-/* +- * 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. +- */ +- +-/* zconf.h -- configuration of the zlib compression library +- * Copyright (C) 1995-2010 Jean-loup Gailly. +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* @(#) $Id$ */ +- +-#ifndef ZCONF_H +-#define ZCONF_H +- +-/* for _LP64 */ +-#include <sys/types.h> +- +-/* +- * If you *really* need a unique prefix for all types and library functions, +- * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. +- * Even better than compiling with -DZ_PREFIX would be to use configure to set +- * this permanently in zconf.h using "./configure --zprefix". +- */ +-#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +- +-/* all linked symbols */ +-# define _dist_code z__dist_code +-# define _length_code z__length_code +-# define _tr_align z__tr_align +-# define _tr_flush_block z__tr_flush_block +-# define _tr_init z__tr_init +-# define _tr_stored_block z__tr_stored_block +-# define _tr_tally z__tr_tally +-# define adler32 z_adler32 +-# define adler32_combine z_adler32_combine +-# define adler32_combine64 z_adler32_combine64 +-# define compress z_compress +-# define compress2 z_compress2 +-# define compressBound z_compressBound +-# define crc32 z_crc32 +-# define crc32_combine z_crc32_combine +-# define crc32_combine64 z_crc32_combine64 +-# define deflate z_deflate +-# define deflateBound z_deflateBound +-# define deflateCopy z_deflateCopy +-# define deflateEnd z_deflateEnd +-# define deflateInit2_ z_deflateInit2_ +-# define deflateInit_ z_deflateInit_ +-# define deflateParams z_deflateParams +-# define deflatePrime z_deflatePrime +-# define deflateReset z_deflateReset +-# define deflateSetDictionary z_deflateSetDictionary +-# define deflateSetHeader z_deflateSetHeader +-# define deflateTune z_deflateTune +-# define deflate_copyright z_deflate_copyright +-# define get_crc_table z_get_crc_table +-# define gz_error z_gz_error +-# define gz_intmax z_gz_intmax +-# define gz_strwinerror z_gz_strwinerror +-# define gzbuffer z_gzbuffer +-# define gzclearerr z_gzclearerr +-# define gzclose z_gzclose +-# define gzclose_r z_gzclose_r +-# define gzclose_w z_gzclose_w +-# define gzdirect z_gzdirect +-# define gzdopen z_gzdopen +-# define gzeof z_gzeof +-# define gzerror z_gzerror +-# define gzflush z_gzflush +-# define gzgetc z_gzgetc +-# define gzgets z_gzgets +-# define gzoffset z_gzoffset +-# define gzoffset64 z_gzoffset64 +-# define gzopen z_gzopen +-# define gzopen64 z_gzopen64 +-# define gzprintf z_gzprintf +-# define gzputc z_gzputc +-# define gzputs z_gzputs +-# define gzread z_gzread +-# define gzrewind z_gzrewind +-# define gzseek z_gzseek +-# define gzseek64 z_gzseek64 +-# define gzsetparams z_gzsetparams +-# define gztell z_gztell +-# define gztell64 z_gztell64 +-# define gzungetc z_gzungetc +-# define gzwrite z_gzwrite +-# define inflate z_inflate +-# define inflateBack z_inflateBack +-# define inflateBackEnd z_inflateBackEnd +-# define inflateBackInit_ z_inflateBackInit_ +-# define inflateCopy z_inflateCopy +-# define inflateEnd z_inflateEnd +-# define inflateGetHeader z_inflateGetHeader +-# define inflateInit2_ z_inflateInit2_ +-# define inflateInit_ z_inflateInit_ +-# define inflateMark z_inflateMark +-# define inflatePrime z_inflatePrime +-# define inflateReset z_inflateReset +-# define inflateReset2 z_inflateReset2 +-# define inflateSetDictionary z_inflateSetDictionary +-# define inflateSync z_inflateSync +-# define inflateSyncPoint z_inflateSyncPoint +-# define inflateUndermine z_inflateUndermine +-# define inflate_copyright z_inflate_copyright +-# define inflate_fast z_inflate_fast +-# define inflate_table z_inflate_table +-# define uncompress z_uncompress +-# define zError z_zError +-# define zcalloc z_zcalloc +-# define zcfree z_zcfree +-# define zlibCompileFlags z_zlibCompileFlags +-# define zlibVersion z_zlibVersion +- +-/* all zlib typedefs in zlib.h and zconf.h */ +-# define Byte z_Byte +-# define Bytef z_Bytef +-# define alloc_func z_alloc_func +-# define charf z_charf +-# define free_func z_free_func +-# define gzFile z_gzFile +-# define gz_header z_gz_header +-# define gz_headerp z_gz_headerp +-# define in_func z_in_func +-# define intf z_intf +-# define out_func z_out_func +-# define uInt z_uInt +-# define uIntf z_uIntf +-# define uLong z_uLong +-# define uLongf z_uLongf +-# define voidp z_voidp +-# define voidpc z_voidpc +-# define voidpf z_voidpf +- +-/* all zlib structs in zlib.h and zconf.h */ +-# define gz_header_s z_gz_header_s +-# define internal_state z_internal_state +- +-#endif +- +-#if defined(__MSDOS__) && !defined(MSDOS) +-# define MSDOS +-#endif +-#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +-# define OS2 +-#endif +-#if defined(_WINDOWS) && !defined(WINDOWS) +-# define WINDOWS +-#endif +-#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +-# ifndef WIN32 +-# define WIN32 +-# endif +-#endif +-#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +-# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +-# ifndef SYS16BIT +-# define SYS16BIT +-# endif +-# endif +-#endif +- +-/* +- * Compile with -DMAXSEG_64K if the alloc function cannot allocate more +- * than 64k bytes at a time (needed on systems with 16-bit int). +- */ +-#ifdef SYS16BIT +-# define MAXSEG_64K +-#endif +-#ifdef MSDOS +-# define UNALIGNED_OK +-#endif +- +-#ifdef __STDC_VERSION__ +-# ifndef STDC +-# define STDC +-# endif +-# if __STDC_VERSION__ >= 199901L +-# ifndef STDC99 +-# define STDC99 +-# endif +-# endif +-#endif +-#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +-# define STDC +-#endif +-#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +-# define STDC +-#endif +-#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +-# define STDC +-#endif +-#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +-# define STDC +-#endif +- +-#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +-# define STDC +-#endif +- +-#ifndef STDC +-# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +-# define const /* note: need a more gentle solution here */ +-# endif +-#endif +- +-/* Some Mac compilers merge all .h files incorrectly: */ +-#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +-# define NO_DUMMY_DECL +-#endif +- +-/* Maximum value for memLevel in deflateInit2 */ +-#ifndef MAX_MEM_LEVEL +-# ifdef MAXSEG_64K +-# define MAX_MEM_LEVEL 8 +-# else +-# define MAX_MEM_LEVEL 9 +-# endif +-#endif +- +-/* Maximum value for windowBits in deflateInit2 and inflateInit2. +- * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files +- * created by gzip. (Files created by minigzip can still be extracted by +- * gzip.) +- */ +-#ifndef MAX_WBITS +-# define MAX_WBITS 15 /* 32K LZ77 window */ +-#endif +- +-/* The memory requirements for deflate are (in bytes): +- (1 << (windowBits+2)) + (1 << (memLevel+9)) +- that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) +- plus a few kilobytes for small objects. For example, if you want to reduce +- the default memory requirements from 256K to 128K, compile with +- make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" +- Of course this will generally degrade compression (there's no free lunch). +- +- The memory requirements for inflate are (in bytes) 1 << windowBits +- that is, 32K for windowBits=15 (default value) plus a few kilobytes +- for small objects. +-*/ +- +- /* Type declarations */ +- +-#ifndef OF /* function prototypes */ +-# ifdef STDC +-# define OF(args) args +-# else +-# define OF(args) () +-# endif +-#endif +- +-/* The following definitions for FAR are needed only for MSDOS mixed +- * model programming (small or medium model with some far allocations). +- * This was tested only with MSC; for other MSDOS compilers you may have +- * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, +- * just define FAR to be empty. +- */ +-#ifdef SYS16BIT +-# if defined(M_I86SM) || defined(M_I86MM) +- /* MSC small or medium model */ +-# define SMALL_MEDIUM +-# ifdef _MSC_VER +-# define FAR _far +-# else +-# define FAR far +-# endif +-# endif +-# if (defined(__SMALL__) || defined(__MEDIUM__)) +- /* Turbo C small or medium model */ +-# define SMALL_MEDIUM +-# ifdef __BORLANDC__ +-# define FAR _far +-# else +-# define FAR far +-# endif +-# endif +-#endif +- +-#if defined(WINDOWS) || defined(WIN32) +- /* If building or using zlib as a DLL, define ZLIB_DLL. +- * This is not mandatory, but it offers a little performance increase. +- */ +-# ifdef ZLIB_DLL +-# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +-# ifdef ZLIB_INTERNAL +-# define ZEXTERN extern __declspec(dllexport) +-# else +-# define ZEXTERN extern __declspec(dllimport) +-# endif +-# endif +-# endif /* ZLIB_DLL */ +- /* If building or using zlib with the WINAPI/WINAPIV calling convention, +- * define ZLIB_WINAPI. +- * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. +- */ +-# ifdef ZLIB_WINAPI +-# ifdef FAR +-# undef FAR +-# endif +-# include <windows.h> +- /* No need for _export, use ZLIB.DEF instead. */ +- /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +-# define ZEXPORT WINAPI +-# ifdef WIN32 +-# define ZEXPORTVA WINAPIV +-# else +-# define ZEXPORTVA FAR CDECL +-# endif +-# endif +-#endif +- +-#if defined (__BEOS__) +-# ifdef ZLIB_DLL +-# ifdef ZLIB_INTERNAL +-# define ZEXPORT __declspec(dllexport) +-# define ZEXPORTVA __declspec(dllexport) +-# else +-# define ZEXPORT __declspec(dllimport) +-# define ZEXPORTVA __declspec(dllimport) +-# endif +-# endif +-#endif +- +-#ifndef ZEXTERN +-# define ZEXTERN extern +-#endif +-#ifndef ZEXPORT +-# define ZEXPORT +-#endif +-#ifndef ZEXPORTVA +-# define ZEXPORTVA +-#endif +- +-#ifndef FAR +-# define FAR +-#endif +- +-#if !defined(__MACTYPES__) +-typedef unsigned char Byte; /* 8 bits */ +-#endif +-typedef unsigned int uInt; /* 16 bits or more */ +-#ifdef _LP64 +-typedef unsigned int uLong; /* 32 bits or more */ +-#else +-typedef unsigned long uLong; /* 32 bits or more */ +-#endif +- +-#ifdef SMALL_MEDIUM +- /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +-# define Bytef Byte FAR +-#else +- typedef Byte FAR Bytef; +-#endif +-typedef char FAR charf; +-typedef int FAR intf; +-typedef uInt FAR uIntf; +-typedef uLong FAR uLongf; +- +-#ifdef STDC +- typedef void const *voidpc; +- typedef void FAR *voidpf; +- typedef void *voidp; +-#else +- typedef Byte const *voidpc; +- typedef Byte FAR *voidpf; +- typedef Byte *voidp; +-#endif +- +-#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +-# define Z_HAVE_UNISTD_H +-#endif +- +-#ifdef STDC +-# include <sys/types.h> /* for off_t */ +-#endif +- +-/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and +- * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even +- * though the former does not conform to the LFS document), but considering +- * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as +- * equivalently requesting no 64-bit operations +- */ +-#if -_LARGEFILE64_SOURCE - -1 == 1 +-# undef _LARGEFILE64_SOURCE +-#endif +- +-#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +-# include <unistd.h> /* for SEEK_* and off_t */ +-# ifdef VMS +-# include <unixio.h> /* for off_t */ +-# endif +-# ifndef z_off_t +-# define z_off_t off_t +-# endif +-#endif +- +-#ifndef SEEK_SET +-# define SEEK_SET 0 /* Seek from beginning of file. */ +-# define SEEK_CUR 1 /* Seek from current position. */ +-# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +-#endif +- +-#ifndef z_off_t +-# define z_off_t long +-#endif +- +-#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +-# define z_off64_t off64_t +-#else +-# define z_off64_t z_off_t +-#endif +- +-#if defined(__OS400__) +-# define NO_vsnprintf +-#endif +- +-#if defined(__MVS__) +-# define NO_vsnprintf +-#endif +- +-/* MVS linker does not support external names larger than 8 bytes */ +-#if defined(__MVS__) +- #pragma map(deflateInit_,"DEIN") +- #pragma map(deflateInit2_,"DEIN2") +- #pragma map(deflateEnd,"DEEND") +- #pragma map(deflateBound,"DEBND") +- #pragma map(inflateInit_,"ININ") +- #pragma map(inflateInit2_,"ININ2") +- #pragma map(inflateEnd,"INEND") +- #pragma map(inflateSync,"INSY") +- #pragma map(inflateSetDictionary,"INSEDI") +- #pragma map(compressBound,"CMBND") +- #pragma map(inflate_table,"INTABL") +- #pragma map(inflate_fast,"INFA") +- #pragma map(inflate_copyright,"INCOPY") +-#endif +- +-#endif /* ZCONF_H */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zcrc32.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zcrc32.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,466 +0,0 @@ +-/* +- * 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. +- */ +- +-/* crc32.c -- compute the CRC-32 of a data stream +- * Copyright (C) 1995-2006, 2010 Mark Adler +- * For conditions of distribution and use, see copyright notice in zlib.h +- * +- * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster +- * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing +- * tables for updating the shift register in one step with three exclusive-ors +- * instead of four steps with four exclusive-ors. This results in about a +- * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. +- */ +- +-/* @(#) $Id$ */ +- +-/* +- Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore +- protection on the static variables used to control the first-use generation +- of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should +- first call get_crc_table() to initialize the tables before allowing more than +- one thread to use crc32(). +- */ +- +-#ifdef MAKECRCH +-# include <stdio.h> +-# ifndef DYNAMIC_CRC_TABLE +-# define DYNAMIC_CRC_TABLE +-# endif /* !DYNAMIC_CRC_TABLE */ +-#endif /* MAKECRCH */ +- +-#include "zutil.h" /* for STDC and FAR definitions */ +- +-#define local static +- +-/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +-#ifndef NOBYFOUR +-# ifdef STDC /* need ANSI C limits.h to determine sizes */ +-# include <limits.h> +-# define BYFOUR +-# if (UINT_MAX == 0xffffffffUL) +- typedef unsigned int u4; +-# else +-# if (ULONG_MAX == 0xffffffffUL) +- typedef unsigned long u4; +-# else +-# if (USHRT_MAX == 0xffffffffUL) +- typedef unsigned short u4; +-# else +-# undef BYFOUR /* can't find a four-byte integer type! */ +-# endif +-# endif +-# endif +-# endif /* STDC */ +-#endif /* !NOBYFOUR */ +- +-/* Definitions for doing the crc four data bytes at a time. */ +-#ifdef BYFOUR +-# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ +- (((w)&0xff00)<<8)+(((w)&0xff)<<24)) +- local unsigned long crc32_little OF((unsigned long, +- const unsigned char FAR *, unsigned)); +- local unsigned long crc32_big OF((unsigned long, +- const unsigned char FAR *, unsigned)); +-# define TBLS 8 +-#else +-# define TBLS 1 +-#endif /* BYFOUR */ +- +-/* Local functions for crc concatenation */ +-local unsigned long gf2_matrix_times OF((unsigned long *mat, +- unsigned long vec)); +-local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +-local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2); +- +- +-#ifdef DYNAMIC_CRC_TABLE +- +-local volatile int crc_table_empty = 1; +-local unsigned long FAR crc_table[TBLS][256]; +-local void make_crc_table OF((void)); +-#ifdef MAKECRCH +- local void write_table OF((FILE *, const unsigned long FAR *)); +-#endif /* MAKECRCH */ +-/* +- Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: +- x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. +- +- Polynomials over GF(2) are represented in binary, one bit per coefficient, +- with the lowest powers in the most significant bit. Then adding polynomials +- is just exclusive-or, and multiplying a polynomial by x is a right shift by +- one. If we call the above polynomial p, and represent a byte as the +- polynomial q, also with the lowest power in the most significant bit (so the +- byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, +- where a mod b means the remainder after dividing a by b. +- +- This calculation is done using the shift-register method of multiplying and +- taking the remainder. The register is initialized to zero, and for each +- incoming bit, x^32 is added mod p to the register if the bit is a one (where +- x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by +- x (which is shifting right by one and adding x^32 mod p if the bit shifted +- out is a one). We start with the highest power (least significant bit) of +- q and repeat for all eight bits of q. +- +- The first table is simply the CRC of all possible eight bit values. This is +- all the information needed to generate CRCs on data a byte at a time for all +- combinations of CRC register values and incoming bytes. The remaining tables +- allow for word-at-a-time CRC calculation for both big-endian and little- +- endian machines, where a word is four bytes. +-*/ +-local void make_crc_table() +-{ +- unsigned long c; +- int n, k; +- unsigned long poly; /* polynomial exclusive-or pattern */ +- /* terms of polynomial defining this crc (except x^32): */ +- static volatile int first = 1; /* flag to limit concurrent making */ +- static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; +- +- /* See if another task is already doing this (not thread-safe, but better +- than nothing -- significantly reduces duration of vulnerability in +- case the advice about DYNAMIC_CRC_TABLE is ignored) */ +- if (first) { +- first = 0; +- +- /* make exclusive-or pattern from polynomial (0xedb88320UL) */ +- poly = 0UL; +- for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) +- poly |= 1UL << (31 - p[n]); +- +- /* generate a crc for every 8-bit value */ +- for (n = 0; n < 256; n++) { +- c = (unsigned long)n; +- for (k = 0; k < 8; k++) +- c = c & 1 ? poly ^ (c >> 1) : c >> 1; +- crc_table[0][n] = c; +- } +- +-#ifdef BYFOUR +- /* generate crc for each value followed by one, two, and three zeros, +- and then the byte reversal of those as well as the first table */ +- for (n = 0; n < 256; n++) { +- c = crc_table[0][n]; +- crc_table[4][n] = REV(c); +- for (k = 1; k < 4; k++) { +- c = crc_table[0][c & 0xff] ^ (c >> 8); +- crc_table[k][n] = c; +- crc_table[k + 4][n] = REV(c); +- } +- } +-#endif /* BYFOUR */ +- +- crc_table_empty = 0; +- } +- else { /* not first */ +- /* wait for the other guy to finish (not efficient, but rare) */ +- while (crc_table_empty) +- ; +- } +- +-#ifdef MAKECRCH +- /* write out CRC tables to crc32.h */ +- { +- FILE *out; +- +- out = fopen("crc32.h", "w"); +- if (out == NULL) return; +- fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); +- fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); +- fprintf(out, "local const unsigned long FAR "); +- fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); +- write_table(out, crc_table[0]); +-# ifdef BYFOUR +- fprintf(out, "#ifdef BYFOUR\n"); +- for (k = 1; k < 8; k++) { +- fprintf(out, " },\n {\n"); +- write_table(out, crc_table[k]); +- } +- fprintf(out, "#endif\n"); +-# endif /* BYFOUR */ +- fprintf(out, " }\n};\n"); +- fclose(out); +- } +-#endif /* MAKECRCH */ +-} +- +-#ifdef MAKECRCH +-local void write_table(out, table) +- FILE *out; +- const unsigned long FAR *table; +-{ +- int n; +- +- for (n = 0; n < 256; n++) +- fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], +- n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +-} +-#endif /* MAKECRCH */ +- +-#else /* !DYNAMIC_CRC_TABLE */ +-/* ======================================================================== +- * Tables of CRC-32s of all single-byte values, made by make_crc_table(). +- */ +-#include "crc32.h" +-#endif /* DYNAMIC_CRC_TABLE */ +- +-/* ========================================================================= +- * This function can be used by asm versions of crc32() +- */ +-const unsigned long FAR * ZEXPORT get_crc_table() +-{ +-#ifdef DYNAMIC_CRC_TABLE +- if (crc_table_empty) +- make_crc_table(); +-#endif /* DYNAMIC_CRC_TABLE */ +- return (const unsigned long FAR *)crc_table; +-} +- +-/* ========================================================================= */ +-#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +-#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 +- +-/* ========================================================================= */ +-uLong ZEXPORT crc32(crc, buf, len) +- uLong crc; +- const unsigned char FAR *buf; +- uInt len; +-{ +- if (buf == Z_NULL) return 0UL; +- +-#ifdef DYNAMIC_CRC_TABLE +- if (crc_table_empty) +- make_crc_table(); +-#endif /* DYNAMIC_CRC_TABLE */ +- +-#ifdef BYFOUR +- if (sizeof(void *) == sizeof(ptrdiff_t)) { +- u4 endian; +- +- endian = 1; +- if (*((unsigned char *)(&endian))) +- return (uLong)crc32_little(crc, buf, len); +- else +- return (uLong)crc32_big(crc, buf, len); +- } +-#endif /* BYFOUR */ +- crc = crc ^ 0xffffffffUL; +- while (len >= 8) { +- DO8; +- len -= 8; +- } +- if (len) do { +- DO1; +- } while (--len); +- return crc ^ 0xffffffffUL; +-} +- +-#ifdef BYFOUR +- +-/* ========================================================================= */ +-#define DOLIT4 c ^= *buf4++; \ +- c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ +- crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +-#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 +- +-/* ========================================================================= */ +-local unsigned long crc32_little(crc, buf, len) +- unsigned long crc; +- const unsigned char FAR *buf; +- unsigned len; +-{ +- register u4 c; +- register const u4 FAR *buf4; +- +- c = (u4)crc; +- c = ~c; +- while (len && ((ptrdiff_t)buf & 3)) { +- c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); +- len--; +- } +- +- buf4 = (const u4 FAR *)(const void FAR *)buf; +- while (len >= 32) { +- DOLIT32; +- len -= 32; +- } +- while (len >= 4) { +- DOLIT4; +- len -= 4; +- } +- buf = (const unsigned char FAR *)buf4; +- +- if (len) do { +- c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); +- } while (--len); +- c = ~c; +- return (unsigned long)c; +-} +- +-/* ========================================================================= */ +-#define DOBIG4 c ^= *++buf4; \ +- c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ +- crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +-#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 +- +-/* ========================================================================= */ +-local unsigned long crc32_big(crc, buf, len) +- unsigned long crc; +- const unsigned char FAR *buf; +- unsigned len; +-{ +- register u4 c; +- register const u4 FAR *buf4; +- +- c = REV((u4)crc); +- c = ~c; +- while (len && ((ptrdiff_t)buf & 3)) { +- c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); +- len--; +- } +- +- buf4 = (const u4 FAR *)(const void FAR *)buf; +- buf4--; +- while (len >= 32) { +- DOBIG32; +- len -= 32; +- } +- while (len >= 4) { +- DOBIG4; +- len -= 4; +- } +- buf4++; +- buf = (const unsigned char FAR *)buf4; +- +- if (len) do { +- c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); +- } while (--len); +- c = ~c; +- return (unsigned long)(REV(c)); +-} +- +-#endif /* BYFOUR */ +- +-#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ +- +-/* ========================================================================= */ +-local unsigned long gf2_matrix_times(mat, vec) +- unsigned long *mat; +- unsigned long vec; +-{ +- unsigned long sum; +- +- sum = 0; +- while (vec) { +- if (vec & 1) +- sum ^= *mat; +- vec >>= 1; +- mat++; +- } +- return sum; +-} +- +-/* ========================================================================= */ +-local void gf2_matrix_square(square, mat) +- unsigned long *square; +- unsigned long *mat; +-{ +- int n; +- +- for (n = 0; n < GF2_DIM; n++) +- square[n] = gf2_matrix_times(mat, mat[n]); +-} +- +-/* ========================================================================= */ +-local uLong crc32_combine_(crc1, crc2, len2) +- uLong crc1; +- uLong crc2; +- z_off64_t len2; +-{ +- int n; +- unsigned long row; +- unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ +- unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ +- +- /* degenerate case (also disallow negative lengths) */ +- if (len2 <= 0) +- return crc1; +- +- /* put operator for one zero bit in odd */ +- odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ +- row = 1; +- for (n = 1; n < GF2_DIM; n++) { +- odd[n] = row; +- row <<= 1; +- } +- +- /* put operator for two zero bits in even */ +- gf2_matrix_square(even, odd); +- +- /* put operator for four zero bits in odd */ +- gf2_matrix_square(odd, even); +- +- /* apply len2 zeros to crc1 (first square will put the operator for one +- zero byte, eight zero bits, in even) */ +- do { +- /* apply zeros operator for this bit of len2 */ +- gf2_matrix_square(even, odd); +- if (len2 & 1) +- crc1 = gf2_matrix_times(even, crc1); +- len2 >>= 1; +- +- /* if no more bits set, then done */ +- if (len2 == 0) +- break; +- +- /* another iteration of the loop with odd and even swapped */ +- gf2_matrix_square(odd, even); +- if (len2 & 1) +- crc1 = gf2_matrix_times(odd, crc1); +- len2 >>= 1; +- +- /* if no more bits set, then done */ +- } while (len2 != 0); +- +- /* return combined crc */ +- crc1 ^= crc2; +- return crc1; +-} +- +-/* ========================================================================= */ +-uLong ZEXPORT crc32_combine(crc1, crc2, len2) +- uLong crc1; +- uLong crc2; +- z_off_t len2; +-{ +- return crc32_combine_(crc1, crc2, len2); +-} +- +-uLong ZEXPORT crc32_combine64(crc1, crc2, len2) +- uLong crc1; +- uLong crc2; +- z_off64_t len2; +-{ +- return crc32_combine_(crc1, crc2, len2); +-} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zlib.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zlib.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1637 +0,0 @@ +-/* +- * 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. +- */ +- +-/* zlib.h -- interface of the 'zlib' general purpose compression library +- version 1.2.5, April 19th, 2010 +- +- Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler +- +- This software is provided 'as-is', without any express or implied +- warranty. In no event will the authors be held liable for any damages +- arising from the use of this software. +- +- Permission is granted to anyone to use this software for any purpose, +- including commercial applications, and to alter it and redistribute it +- freely, subject to the following restrictions: +- +- 1. The origin of this software must not be misrepresented; you must not +- claim that you wrote the original software. If you use this software +- in a product, an acknowledgment in the product documentation would be +- appreciated but is not required. +- 2. Altered source versions must be plainly marked as such, and must not be +- misrepresented as being the original software. +- 3. This notice may not be removed or altered from any source distribution. +- +- Jean-loup Gailly Mark Adler +- jloup@gzip.org madler@alumni.caltech.edu +- +- +- The data format used by the zlib library is described by RFCs (Request for +- Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt +- (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +-*/ +- +-#ifndef ZLIB_H +-#define ZLIB_H +- +-#include "zconf.h" +- +-#ifdef __cplusplus +-extern "C" { +-#endif +- +-#define ZLIB_VERSION "1.2.5" +-#define ZLIB_VERNUM 0x1250 +-#define ZLIB_VER_MAJOR 1 +-#define ZLIB_VER_MINOR 2 +-#define ZLIB_VER_REVISION 5 +-#define ZLIB_VER_SUBREVISION 0 +- +-/* +- The 'zlib' compression library provides in-memory compression and +- decompression functions, including integrity checks of the uncompressed data. +- This version of the library supports only one compression method (deflation) +- but other algorithms will be added later and will have the same stream +- interface. +- +- Compression can be done in a single step if the buffers are large enough, +- or can be done by repeated calls of the compression function. In the latter +- case, the application must provide more input and/or consume the output +- (providing more output space) before each call. +- +- The compressed data format used by default by the in-memory functions is +- the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped +- around a deflate stream, which is itself documented in RFC 1951. +- +- The library also supports reading and writing files in gzip (.gz) format +- with an interface similar to that of stdio using the functions that start +- with "gz". The gzip format is different from the zlib format. gzip is a +- gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. +- +- This library can optionally read and write gzip streams in memory as well. +- +- The zlib format was designed to be compact and fast for use in memory +- and on communications channels. The gzip format was designed for single- +- file compression on file systems, has a larger header than zlib to maintain +- directory information, and uses a different, slower check method than zlib. +- +- The library does not install any signal handler. The decoder checks +- the consistency of the compressed data, so the library should never crash +- even in case of corrupted input. +-*/ +- +-typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +-typedef void (*free_func) OF((voidpf opaque, voidpf address)); +- +-struct internal_state; +- +-typedef struct z_stream_s { +- Bytef *next_in; /* next input byte */ +- uInt avail_in; /* number of bytes available at next_in */ +- uLong total_in; /* total nb of input bytes read so far */ +- +- Bytef *next_out; /* next output byte should be put there */ +- uInt avail_out; /* remaining free space at next_out */ +- uLong total_out; /* total nb of bytes output so far */ +- +- char *msg; /* last error message, NULL if no error */ +- struct internal_state FAR *state; /* not visible by applications */ +- +- alloc_func zalloc; /* used to allocate the internal state */ +- free_func zfree; /* used to free the internal state */ +- voidpf opaque; /* private data object passed to zalloc and zfree */ +- +- int data_type; /* best guess about the data type: binary or text */ +- uLong adler; /* adler32 value of the uncompressed data */ +- uLong reserved; /* reserved for future use */ +-} z_stream; +- +-typedef z_stream FAR *z_streamp; +- +-/* +- gzip header information passed to and from zlib routines. See RFC 1952 +- for more details on the meanings of these fields. +-*/ +-typedef struct gz_header_s { +- int text; /* true if compressed data believed to be text */ +- uLong time; /* modification time */ +- int xflags; /* extra flags (not used when writing a gzip file) */ +- int os; /* operating system */ +- Bytef *extra; /* pointer to extra field or Z_NULL if none */ +- uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ +- uInt extra_max; /* space at extra (only when reading header) */ +- Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ +- uInt name_max; /* space at name (only when reading header) */ +- Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ +- uInt comm_max; /* space at comment (only when reading header) */ +- int hcrc; /* true if there was or will be a header crc */ +- int done; /* true when done reading gzip header (not used +- when writing a gzip file) */ +-} gz_header; +- +-typedef gz_header FAR *gz_headerp; +- +-/* +- The application must update next_in and avail_in when avail_in has dropped +- to zero. It must update next_out and avail_out when avail_out has dropped +- to zero. The application must initialize zalloc, zfree and opaque before +- calling the init function. All other fields are set by the compression +- library and must not be updated by the application. +- +- The opaque value provided by the application will be passed as the first +- parameter for calls of zalloc and zfree. This can be useful for custom +- memory management. The compression library attaches no meaning to the +- opaque value. +- +- zalloc must return Z_NULL if there is not enough memory for the object. +- If zlib is used in a multi-threaded application, zalloc and zfree must be +- thread safe. +- +- On 16-bit systems, the functions zalloc and zfree must be able to allocate +- exactly 65536 bytes, but will not be required to allocate more than this if +- the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers +- returned by zalloc for objects of exactly 65536 bytes *must* have their +- offset normalized to zero. The default allocation function provided by this +- library ensures this (see zutil.c). To reduce memory requirements and avoid +- any allocation of 64K objects, at the expense of compression ratio, compile +- the library with -DMAX_WBITS=14 (see zconf.h). +- +- The fields total_in and total_out can be used for statistics or progress +- reports. After compression, total_in holds the total size of the +- uncompressed data and may be saved for use in the decompressor (particularly +- if the decompressor wants to decompress everything in a single step). +-*/ +- +- /* constants */ +- +-#define Z_NO_FLUSH 0 +-#define Z_PARTIAL_FLUSH 1 +-#define Z_SYNC_FLUSH 2 +-#define Z_FULL_FLUSH 3 +-#define Z_FINISH 4 +-#define Z_BLOCK 5 +-#define Z_TREES 6 +-/* Allowed flush values; see deflate() and inflate() below for details */ +- +-#define Z_OK 0 +-#define Z_STREAM_END 1 +-#define Z_NEED_DICT 2 +-#define Z_ERRNO (-1) +-#define Z_STREAM_ERROR (-2) +-#define Z_DATA_ERROR (-3) +-#define Z_MEM_ERROR (-4) +-#define Z_BUF_ERROR (-5) +-#define Z_VERSION_ERROR (-6) +-/* Return codes for the compression/decompression functions. Negative values +- * are errors, positive values are used for special but normal events. +- */ +- +-#define Z_NO_COMPRESSION 0 +-#define Z_BEST_SPEED 1 +-#define Z_BEST_COMPRESSION 9 +-#define Z_DEFAULT_COMPRESSION (-1) +-/* compression levels */ +- +-#define Z_FILTERED 1 +-#define Z_HUFFMAN_ONLY 2 +-#define Z_RLE 3 +-#define Z_FIXED 4 +-#define Z_DEFAULT_STRATEGY 0 +-/* compression strategy; see deflateInit2() below for details */ +- +-#define Z_BINARY 0 +-#define Z_TEXT 1 +-#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +-#define Z_UNKNOWN 2 +-/* Possible values of the data_type field (though see inflate()) */ +- +-#define Z_DEFLATED 8 +-/* The deflate compression method (the only one supported in this version) */ +- +-#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ +- +-#define zlib_version zlibVersion() +-/* for compatibility with versions < 1.0.2 */ +- +- +- /* basic functions */ +- +-ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +-/* The application can compare zlibVersion and ZLIB_VERSION for consistency. +- If the first character differs, the library code actually used is not +- compatible with the zlib.h header file used by the application. This check +- is automatically made by deflateInit and inflateInit. +- */ +- +-/* +-ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); +- +- Initializes the internal stream state for compression. The fields +- zalloc, zfree and opaque must be initialized before by the caller. If +- zalloc and zfree are set to Z_NULL, deflateInit updates them to use default +- allocation functions. +- +- The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: +- 1 gives best speed, 9 gives best compression, 0 gives no compression at all +- (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION +- requests a default compromise between speed and compression (currently +- equivalent to level 6). +- +- deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough +- memory, Z_STREAM_ERROR if level is not a valid compression level, or +- Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible +- with the version assumed by the caller (ZLIB_VERSION). msg is set to null +- if there is no error message. deflateInit does not perform any compression: +- this will be done by deflate(). +-*/ +- +- +-ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +-/* +- deflate compresses as much data as possible, and stops when the input +- buffer becomes empty or the output buffer becomes full. It may introduce +- some output latency (reading input without producing any output) except when +- forced to flush. +- +- The detailed semantics are as follows. deflate performs one or both of the +- following actions: +- +- - Compress more input starting at next_in and update next_in and avail_in +- accordingly. If not all input can be processed (because there is not +- enough room in the output buffer), next_in and avail_in are updated and +- processing will resume at this point for the next call of deflate(). +- +- - Provide more output starting at next_out and update next_out and avail_out +- accordingly. This action is forced if the parameter flush is non zero. +- Forcing flush frequently degrades the compression ratio, so this parameter +- should be set only when necessary (in interactive applications). Some +- output may be provided even if flush is not set. +- +- Before the call of deflate(), the application should ensure that at least +- one of the actions is possible, by providing more input and/or consuming more +- output, and updating avail_in or avail_out accordingly; avail_out should +- never be zero before the call. The application can consume the compressed +- output when it wants, for example when the output buffer is full (avail_out +- == 0), or after each call of deflate(). If deflate returns Z_OK and with +- zero avail_out, it must be called again after making room in the output +- buffer because there might be more output pending. +- +- Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to +- decide how much data to accumulate before producing output, in order to +- maximize compression. +- +- If the parameter flush is set to Z_SYNC_FLUSH, all pending output is +- flushed to the output buffer and the output is aligned on a byte boundary, so +- that the decompressor can get all input data available so far. (In +- particular avail_in is zero after the call if enough output space has been +- provided before the call.) Flushing may degrade compression for some +- compression algorithms and so it should be used only when necessary. This +- completes the current deflate block and follows it with an empty stored block +- that is three bits plus filler bits to the next byte, followed by four bytes +- (00 00 ff ff). +- +- If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the +- output buffer, but the output is not aligned to a byte boundary. All of the +- input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. +- This completes the current deflate block and follows it with an empty fixed +- codes block that is 10 bits long. This assures that enough bytes are output +- in order for the decompressor to finish the block before the empty fixed code +- block. +- +- If flush is set to Z_BLOCK, a deflate block is completed and emitted, as +- for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to +- seven bits of the current block are held to be written as the next byte after +- the next deflate block is completed. In this case, the decompressor may not +- be provided enough bits at this point in order to complete decompression of +- the data provided so far to the compressor. It may need to wait for the next +- block to be emitted. This is for advanced applications that need to control +- the emission of deflate blocks. +- +- If flush is set to Z_FULL_FLUSH, all output is flushed as with +- Z_SYNC_FLUSH, and the compression state is reset so that decompression can +- restart from this point if previous compressed data has been damaged or if +- random access is desired. Using Z_FULL_FLUSH too often can seriously degrade +- compression. +- +- If deflate returns with avail_out == 0, this function must be called again +- with the same value of the flush parameter and more output space (updated +- avail_out), until the flush is complete (deflate returns with non-zero +- avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that +- avail_out is greater than six to avoid repeated flush markers due to +- avail_out == 0 on return. +- +- If the parameter flush is set to Z_FINISH, pending input is processed, +- pending output is flushed and deflate returns with Z_STREAM_END if there was +- enough output space; if deflate returns with Z_OK, this function must be +- called again with Z_FINISH and more output space (updated avail_out) but no +- more input data, until it returns with Z_STREAM_END or an error. After +- deflate has returned Z_STREAM_END, the only possible operations on the stream +- are deflateReset or deflateEnd. +- +- Z_FINISH can be used immediately after deflateInit if all the compression +- is to be done in a single step. In this case, avail_out must be at least the +- value returned by deflateBound (see below). If deflate does not return +- Z_STREAM_END, then it must be called again as described above. +- +- deflate() sets strm->adler to the adler32 checksum of all input read +- so far (that is, total_in bytes). +- +- deflate() may update strm->data_type if it can make a good guess about +- the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered +- binary. This field is only for information purposes and does not affect the +- compression algorithm in any manner. +- +- deflate() returns Z_OK if some progress has been made (more input +- processed or more output produced), Z_STREAM_END if all input has been +- consumed and all output has been produced (only when flush is set to +- Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example +- if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible +- (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not +- fatal, and deflate() can be called again with more input and more output +- space to continue compressing. +-*/ +- +- +-ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +-/* +- All dynamically allocated data structures for this stream are freed. +- This function discards any unprocessed input and does not flush any pending +- output. +- +- deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the +- stream state was inconsistent, Z_DATA_ERROR if the stream was freed +- prematurely (some input or output was discarded). In the error case, msg +- may be set but then points to a static string (which must not be +- deallocated). +-*/ +- +- +-/* +-ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); +- +- Initializes the internal stream state for decompression. The fields +- next_in, avail_in, zalloc, zfree and opaque must be initialized before by +- the caller. If next_in is not Z_NULL and avail_in is large enough (the +- exact value depends on the compression method), inflateInit determines the +- compression method from the zlib header and allocates all data structures +- accordingly; otherwise the allocation will be deferred to the first call of +- inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to +- use default allocation functions. +- +- inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough +- memory, Z_VERSION_ERROR if the zlib library version is incompatible with the +- version assumed by the caller, or Z_STREAM_ERROR if the parameters are +- invalid, such as a null pointer to the structure. msg is set to null if +- there is no error message. inflateInit does not perform any decompression +- apart from possibly reading the zlib header if present: actual decompression +- will be done by inflate(). (So next_in and avail_in may be modified, but +- next_out and avail_out are unused and unchanged.) The current implementation +- of inflateInit() does not process any header information -- that is deferred +- until inflate() is called. +-*/ +- +- +-ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +-/* +- inflate decompresses as much data as possible, and stops when the input +- buffer becomes empty or the output buffer becomes full. It may introduce +- some output latency (reading input without producing any output) except when +- forced to flush. +- +- The detailed semantics are as follows. inflate performs one or both of the +- following actions: +- +- - Decompress more input starting at next_in and update next_in and avail_in +- accordingly. If not all input can be processed (because there is not +- enough room in the output buffer), next_in is updated and processing will +- resume at this point for the next call of inflate(). +- +- - Provide more output starting at next_out and update next_out and avail_out +- accordingly. inflate() provides as much output as possible, until there is +- no more input data or no more space in the output buffer (see below about +- the flush parameter). +- +- Before the call of inflate(), the application should ensure that at least +- one of the actions is possible, by providing more input and/or consuming more +- output, and updating the next_* and avail_* values accordingly. The +- application can consume the uncompressed output when it wants, for example +- when the output buffer is full (avail_out == 0), or after each call of +- inflate(). If inflate returns Z_OK and with zero avail_out, it must be +- called again after making room in the output buffer because there might be +- more output pending. +- +- The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, +- Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much +- output as possible to the output buffer. Z_BLOCK requests that inflate() +- stop if and when it gets to the next deflate block boundary. When decoding +- the zlib or gzip format, this will cause inflate() to return immediately +- after the header and before the first block. When doing a raw inflate, +- inflate() will go ahead and process the first block, and will return when it +- gets to the end of that block, or when it runs out of data. +- +- The Z_BLOCK option assists in appending to or combining deflate streams. +- Also to assist in this, on return inflate() will set strm->data_type to the +- number of unused bits in the last byte taken from strm->next_in, plus 64 if +- inflate() is currently decoding the last block in the deflate stream, plus +- 128 if inflate() returned immediately after decoding an end-of-block code or +- decoding the complete header up to just before the first byte of the deflate +- stream. The end-of-block will not be indicated until all of the uncompressed +- data from that block has been written to strm->next_out. The number of +- unused bits may in general be greater than seven, except when bit 7 of +- data_type is set, in which case the number of unused bits will be less than +- eight. data_type is set as noted here every time inflate() returns for all +- flush options, and so can be used to determine the amount of currently +- consumed input in bits. +- +- The Z_TREES option behaves as Z_BLOCK does, but it also returns when the +- end of each deflate block header is reached, before any actual data in that +- block is decoded. This allows the caller to determine the length of the +- deflate block header for later use in random access within a deflate block. +- 256 is added to the value of strm->data_type when inflate() returns +- immediately after reaching the end of the deflate block header. +- +- inflate() should normally be called until it returns Z_STREAM_END or an +- error. However if all decompression is to be performed in a single step (a +- single call of inflate), the parameter flush should be set to Z_FINISH. In +- this case all pending input is processed and all pending output is flushed; +- avail_out must be large enough to hold all the uncompressed data. (The size +- of the uncompressed data may have been saved by the compressor for this +- purpose.) The next operation on this stream must be inflateEnd to deallocate +- the decompression state. The use of Z_FINISH is never required, but can be +- used to inform inflate that a faster approach may be used for the single +- inflate() call. +- +- In this implementation, inflate() always flushes as much output as +- possible to the output buffer, and always uses the faster approach on the +- first call. So the only effect of the flush parameter in this implementation +- is on the return value of inflate(), as noted below, or when it returns early +- because Z_BLOCK or Z_TREES is used. +- +- If a preset dictionary is needed after this call (see inflateSetDictionary +- below), inflate sets strm->adler to the adler32 checksum of the dictionary +- chosen by the compressor and returns Z_NEED_DICT; otherwise it sets +- strm->adler to the adler32 checksum of all output produced so far (that is, +- total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described +- below. At the end of the stream, inflate() checks that its computed adler32 +- checksum is equal to that saved by the compressor and returns Z_STREAM_END +- only if the checksum is correct. +- +- inflate() can decompress and check either zlib-wrapped or gzip-wrapped +- deflate data. The header type is detected automatically, if requested when +- initializing with inflateInit2(). Any information contained in the gzip +- header is not retained, so applications that need that information should +- instead use raw inflate, see inflateInit2() below, or inflateBack() and +- perform their own processing of the gzip header and trailer. +- +- inflate() returns Z_OK if some progress has been made (more input processed +- or more output produced), Z_STREAM_END if the end of the compressed data has +- been reached and all uncompressed output has been produced, Z_NEED_DICT if a +- preset dictionary is needed at this point, Z_DATA_ERROR if the input data was +- corrupted (input stream not conforming to the zlib format or incorrect check +- value), Z_STREAM_ERROR if the stream structure was inconsistent (for example +- next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, +- Z_BUF_ERROR if no progress is possible or if there was not enough room in the +- output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and +- inflate() can be called again with more input and more output space to +- continue decompressing. If Z_DATA_ERROR is returned, the application may +- then call inflateSync() to look for a good compression block if a partial +- recovery of the data is desired. +-*/ +- +- +-ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +-/* +- All dynamically allocated data structures for this stream are freed. +- This function discards any unprocessed input and does not flush any pending +- output. +- +- inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state +- was inconsistent. In the error case, msg may be set but then points to a +- static string (which must not be deallocated). +-*/ +- +- +- /* Advanced functions */ +- +-/* +- The following functions are needed only in some special applications. +-*/ +- +-/* +-ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, +- int level, +- int method, +- int windowBits, +- int memLevel, +- int strategy)); +- +- This is another version of deflateInit with more compression options. The +- fields next_in, zalloc, zfree and opaque must be initialized before by the +- caller. +- +- The method parameter is the compression method. It must be Z_DEFLATED in +- this version of the library. +- +- The windowBits parameter is the base two logarithm of the window size +- (the size of the history buffer). It should be in the range 8..15 for this +- version of the library. Larger values of this parameter result in better +- compression at the expense of memory usage. The default value is 15 if +- deflateInit is used instead. +- +- windowBits can also be -8..-15 for raw deflate. In this case, -windowBits +- determines the window size. deflate() will then generate raw deflate data +- with no zlib header or trailer, and will not compute an adler32 check value. +- +- windowBits can also be greater than 15 for optional gzip encoding. Add +- 16 to windowBits to write a simple gzip header and trailer around the +- compressed data instead of a zlib wrapper. The gzip header will have no +- file name, no extra data, no comment, no modification time (set to zero), no +- header crc, and the operating system will be set to 255 (unknown). If a +- gzip stream is being written, strm->adler is a crc32 instead of an adler32. +- +- The memLevel parameter specifies how much memory should be allocated +- for the internal compression state. memLevel=1 uses minimum memory but is +- slow and reduces compression ratio; memLevel=9 uses maximum memory for +- optimal speed. The default value is 8. See zconf.h for total memory usage +- as a function of windowBits and memLevel. +- +- The strategy parameter is used to tune the compression algorithm. Use the +- value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a +- filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no +- string match), or Z_RLE to limit match distances to one (run-length +- encoding). Filtered data consists mostly of small values with a somewhat +- random distribution. In this case, the compression algorithm is tuned to +- compress them better. The effect of Z_FILTERED is to force more Huffman +- coding and less string matching; it is somewhat intermediate between +- Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as +- fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The +- strategy parameter only affects the compression ratio but not the +- correctness of the compressed output even if it is not set appropriately. +- Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler +- decoder for special applications. +- +- deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough +- memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid +- method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is +- incompatible with the version assumed by the caller (ZLIB_VERSION). msg is +- set to null if there is no error message. deflateInit2 does not perform any +- compression: this will be done by deflate(). +-*/ +- +-ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, +- const Bytef *dictionary, +- uInt dictLength)); +-/* +- Initializes the compression dictionary from the given byte sequence +- without producing any compressed output. This function must be called +- immediately after deflateInit, deflateInit2 or deflateReset, before any call +- of deflate. The compressor and decompressor must use exactly the same +- dictionary (see inflateSetDictionary). +- +- The dictionary should consist of strings (byte sequences) that are likely +- to be encountered later in the data to be compressed, with the most commonly +- used strings preferably put towards the end of the dictionary. Using a +- dictionary is most useful when the data to be compressed is short and can be +- predicted with good accuracy; the data can then be compressed better than +- with the default empty dictionary. +- +- Depending on the size of the compression data structures selected by +- deflateInit or deflateInit2, a part of the dictionary may in effect be +- discarded, for example if the dictionary is larger than the window size +- provided in deflateInit or deflateInit2. Thus the strings most likely to be +- useful should be put at the end of the dictionary, not at the front. In +- addition, the current implementation of deflate will use at most the window +- size minus 262 bytes of the provided dictionary. +- +- Upon return of this function, strm->adler is set to the adler32 value +- of the dictionary; the decompressor may later use this value to determine +- which dictionary has been used by the compressor. (The adler32 value +- applies to the whole dictionary even if only a subset of the dictionary is +- actually used by the compressor.) If a raw deflate was requested, then the +- adler32 value is not computed and strm->adler is not set. +- +- deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a +- parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is +- inconsistent (for example if deflate has already been called for this stream +- or if the compression method is bsort). deflateSetDictionary does not +- perform any compression: this will be done by deflate(). +-*/ +- +-ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, +- z_streamp source)); +-/* +- Sets the destination stream as a complete copy of the source stream. +- +- This function can be useful when several compression strategies will be +- tried, for example when there are several ways of pre-processing the input +- data with a filter. The streams that will be discarded should then be freed +- by calling deflateEnd. Note that deflateCopy duplicates the internal +- compression state which can be quite large, so this strategy is slow and can +- consume lots of memory. +- +- deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not +- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent +- (such as zalloc being Z_NULL). msg is left unchanged in both source and +- destination. +-*/ +- +-ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +-/* +- This function is equivalent to deflateEnd followed by deflateInit, +- but does not free and reallocate all the internal compression state. The +- stream will keep the same compression level and any other attributes that +- may have been set by deflateInit2. +- +- deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source +- stream state was inconsistent (such as zalloc or state being Z_NULL). +-*/ +- +-ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, +- int level, +- int strategy)); +-/* +- Dynamically update the compression level and compression strategy. The +- interpretation of level and strategy is as in deflateInit2. This can be +- used to switch between compression and straight copy of the input data, or +- to switch to a different kind of input data requiring a different strategy. +- If the compression level is changed, the input available so far is +- compressed with the old level (and may be flushed); the new level will take +- effect only at the next call of deflate(). +- +- Before the call of deflateParams, the stream state must be set as for +- a call of deflate(), since the currently available input may have to be +- compressed and flushed. In particular, strm->avail_out must be non-zero. +- +- deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source +- stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if +- strm->avail_out was zero. +-*/ +- +-ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, +- int good_length, +- int max_lazy, +- int nice_length, +- int max_chain)); +-/* +- Fine tune deflate's internal compression parameters. This should only be +- used by someone who understands the algorithm used by zlib's deflate for +- searching for the best matching string, and even then only by the most +- fanatic optimizer trying to squeeze out the last compressed bit for their +- specific input data. Read the deflate.c source code for the meaning of the +- max_lazy, good_length, nice_length, and max_chain parameters. +- +- deflateTune() can be called after deflateInit() or deflateInit2(), and +- returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. +- */ +- +-ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, +- uLong sourceLen)); +-/* +- deflateBound() returns an upper bound on the compressed size after +- deflation of sourceLen bytes. It must be called after deflateInit() or +- deflateInit2(), and after deflateSetHeader(), if used. This would be used +- to allocate an output buffer for deflation in a single pass, and so would be +- called before deflate(). +-*/ +- +-ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, +- int bits, +- int value)); +-/* +- deflatePrime() inserts bits in the deflate output stream. The intent +- is that this function is used to start off the deflate output with the bits +- leftover from a previous deflate stream when appending to it. As such, this +- function can only be used for raw deflate, and must be used before the first +- deflate() call after a deflateInit2() or deflateReset(). bits must be less +- than or equal to 16, and that many of the least significant bits of value +- will be inserted in the output. +- +- deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source +- stream state was inconsistent. +-*/ +- +-ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, +- gz_headerp head)); +-/* +- deflateSetHeader() provides gzip header information for when a gzip +- stream is requested by deflateInit2(). deflateSetHeader() may be called +- after deflateInit2() or deflateReset() and before the first call of +- deflate(). The text, time, os, extra field, name, and comment information +- in the provided gz_header structure are written to the gzip header (xflag is +- ignored -- the extra flags are set according to the compression level). The +- caller must assure that, if not Z_NULL, name and comment are terminated with +- a zero byte, and that if extra is not Z_NULL, that extra_len bytes are +- available there. If hcrc is true, a gzip header crc is included. Note that +- the current versions of the command-line version of gzip (up through version +- 1.3.x) do not support header crc's, and will report that it is a "multi-part +- gzip file" and give up. +- +- If deflateSetHeader is not used, the default gzip header has text false, +- the time set to zero, and os set to 255, with no extra, name, or comment +- fields. The gzip header is returned to the default state by deflateReset(). +- +- deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source +- stream state was inconsistent. +-*/ +- +-/* +-ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, +- int windowBits)); +- +- This is another version of inflateInit with an extra parameter. The +- fields next_in, avail_in, zalloc, zfree and opaque must be initialized +- before by the caller. +- +- The windowBits parameter is the base two logarithm of the maximum window +- size (the size of the history buffer). It should be in the range 8..15 for +- this version of the library. The default value is 15 if inflateInit is used +- instead. windowBits must be greater than or equal to the windowBits value +- provided to deflateInit2() while compressing, or it must be equal to 15 if +- deflateInit2() was not used. If a compressed stream with a larger window +- size is given as input, inflate() will return with the error code +- Z_DATA_ERROR instead of trying to allocate a larger window. +- +- windowBits can also be zero to request that inflate use the window size in +- the zlib header of the compressed stream. +- +- windowBits can also be -8..-15 for raw inflate. In this case, -windowBits +- determines the window size. inflate() will then process raw deflate data, +- not looking for a zlib or gzip header, not generating a check value, and not +- looking for any check values for comparison at the end of the stream. This +- is for use with other formats that use the deflate compressed data format +- such as zip. Those formats provide their own check values. If a custom +- format is developed using the raw deflate format for compressed data, it is +- recommended that a check value such as an adler32 or a crc32 be applied to +- the uncompressed data as is done in the zlib, gzip, and zip formats. For +- most applications, the zlib format should be used as is. Note that comments +- above on the use in deflateInit2() applies to the magnitude of windowBits. +- +- windowBits can also be greater than 15 for optional gzip decoding. Add +- 32 to windowBits to enable zlib and gzip decoding with automatic header +- detection, or add 16 to decode only the gzip format (the zlib format will +- return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a +- crc32 instead of an adler32. +- +- inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough +- memory, Z_VERSION_ERROR if the zlib library version is incompatible with the +- version assumed by the caller, or Z_STREAM_ERROR if the parameters are +- invalid, such as a null pointer to the structure. msg is set to null if +- there is no error message. inflateInit2 does not perform any decompression +- apart from possibly reading the zlib header if present: actual decompression +- will be done by inflate(). (So next_in and avail_in may be modified, but +- next_out and avail_out are unused and unchanged.) The current implementation +- of inflateInit2() does not process any header information -- that is +- deferred until inflate() is called. +-*/ +- +-ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, +- const Bytef *dictionary, +- uInt dictLength)); +-/* +- Initializes the decompression dictionary from the given uncompressed byte +- sequence. This function must be called immediately after a call of inflate, +- if that call returned Z_NEED_DICT. The dictionary chosen by the compressor +- can be determined from the adler32 value returned by that call of inflate. +- The compressor and decompressor must use exactly the same dictionary (see +- deflateSetDictionary). For raw inflate, this function can be called +- immediately after inflateInit2() or inflateReset() and before any call of +- inflate() to set the dictionary. The application must insure that the +- dictionary that was used for compression is provided. +- +- inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a +- parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is +- inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the +- expected one (incorrect adler32 value). inflateSetDictionary does not +- perform any decompression: this will be done by subsequent calls of +- inflate(). +-*/ +- +-ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +-/* +- Skips invalid compressed data until a full flush point (see above the +- description of deflate with Z_FULL_FLUSH) can be found, or until all +- available input is skipped. No output is provided. +- +- inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR +- if no more input was provided, Z_DATA_ERROR if no flush point has been +- found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the +- success case, the application may save the current current value of total_in +- which indicates where valid compressed data was found. In the error case, +- the application may repeatedly call inflateSync, providing more input each +- time, until success or end of the input data. +-*/ +- +-ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, +- z_streamp source)); +-/* +- Sets the destination stream as a complete copy of the source stream. +- +- This function can be useful when randomly accessing a large stream. The +- first pass through the stream can periodically record the inflate state, +- allowing restarting inflate at those points when randomly accessing the +- stream. +- +- inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not +- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent +- (such as zalloc being Z_NULL). msg is left unchanged in both source and +- destination. +-*/ +- +-ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +-/* +- This function is equivalent to inflateEnd followed by inflateInit, +- but does not free and reallocate all the internal decompression state. The +- stream will keep attributes that may have been set by inflateInit2. +- +- inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source +- stream state was inconsistent (such as zalloc or state being Z_NULL). +-*/ +- +-ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, +- int windowBits)); +-/* +- This function is the same as inflateReset, but it also permits changing +- the wrap and window size requests. The windowBits parameter is interpreted +- the same as it is for inflateInit2. +- +- inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source +- stream state was inconsistent (such as zalloc or state being Z_NULL), or if +- the windowBits parameter is invalid. +-*/ +- +-ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, +- int bits, +- int value)); +-/* +- This function inserts bits in the inflate input stream. The intent is +- that this function is used to start inflating at a bit position in the +- middle of a byte. The provided bits will be used before any bytes are used +- from next_in. This function should only be used with raw inflate, and +- should be used before the first inflate() call after inflateInit2() or +- inflateReset(). bits must be less than or equal to 16, and that many of the +- least significant bits of value will be inserted in the input. +- +- If bits is negative, then the input stream bit buffer is emptied. Then +- inflatePrime() can be called again to put bits in the buffer. This is used +- to clear out bits leftover after feeding inflate a block description prior +- to feeding inflate codes. +- +- inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source +- stream state was inconsistent. +-*/ +- +-ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +-/* +- This function returns two values, one in the lower 16 bits of the return +- value, and the other in the remaining upper bits, obtained by shifting the +- return value down 16 bits. If the upper value is -1 and the lower value is +- zero, then inflate() is currently decoding information outside of a block. +- If the upper value is -1 and the lower value is non-zero, then inflate is in +- the middle of a stored block, with the lower value equaling the number of +- bytes from the input remaining to copy. If the upper value is not -1, then +- it is the number of bits back from the current bit position in the input of +- the code (literal or length/distance pair) currently being processed. In +- that case the lower value is the number of bytes already emitted for that +- code. +- +- A code is being processed if inflate is waiting for more input to complete +- decoding of the code, or if it has completed decoding but is waiting for +- more output space to write the literal or match data. +- +- inflateMark() is used to mark locations in the input data for random +- access, which may be at bit positions, and to note those cases where the +- output of a code may span boundaries of random access blocks. The current +- location in the input stream can be determined from avail_in and data_type +- as noted in the description for the Z_BLOCK flush parameter for inflate. +- +- inflateMark returns the value noted above or -1 << 16 if the provided +- source stream state was inconsistent. +-*/ +- +-ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, +- gz_headerp head)); +-/* +- inflateGetHeader() requests that gzip header information be stored in the +- provided gz_header structure. inflateGetHeader() may be called after +- inflateInit2() or inflateReset(), and before the first call of inflate(). +- As inflate() processes the gzip stream, head->done is zero until the header +- is completed, at which time head->done is set to one. If a zlib stream is +- being decoded, then head->done is set to -1 to indicate that there will be +- no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be +- used to force inflate() to return immediately after header processing is +- complete and before any actual data is decompressed. +- +- The text, time, xflags, and os fields are filled in with the gzip header +- contents. hcrc is set to true if there is a header CRC. (The header CRC +- was valid if done is set to one.) If extra is not Z_NULL, then extra_max +- contains the maximum number of bytes to write to extra. Once done is true, +- extra_len contains the actual extra field length, and extra contains the +- extra field, or that field truncated if extra_max is less than extra_len. +- If name is not Z_NULL, then up to name_max characters are written there, +- terminated with a zero unless the length is greater than name_max. If +- comment is not Z_NULL, then up to comm_max characters are written there, +- terminated with a zero unless the length is greater than comm_max. When any +- of extra, name, or comment are not Z_NULL and the respective field is not +- present in the header, then that field is set to Z_NULL to signal its +- absence. This allows the use of deflateSetHeader() with the returned +- structure to duplicate the header. However if those fields are set to +- allocated memory, then the application will need to save those pointers +- elsewhere so that they can be eventually freed. +- +- If inflateGetHeader is not used, then the header information is simply +- discarded. The header is always checked for validity, including the header +- CRC if present. inflateReset() will reset the process to discard the header +- information. The application would need to call inflateGetHeader() again to +- retrieve the header from the next gzip stream. +- +- inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source +- stream state was inconsistent. +-*/ +- +-/* +-ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, +- unsigned char FAR *window)); +- +- Initialize the internal stream state for decompression using inflateBack() +- calls. The fields zalloc, zfree and opaque in strm must be initialized +- before the call. If zalloc and zfree are Z_NULL, then the default library- +- derived memory allocation routines are used. windowBits is the base two +- logarithm of the window size, in the range 8..15. window is a caller +- supplied buffer of that size. Except for special applications where it is +- assured that deflate was used with small window sizes, windowBits must be 15 +- and a 32K byte window must be supplied to be able to decompress general +- deflate streams. +- +- See inflateBack() for the usage of these routines. +- +- inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of +- the paramaters are invalid, Z_MEM_ERROR if the internal state could not be +- allocated, or Z_VERSION_ERROR if the version of the library does not match +- the version of the header file. +-*/ +- +-typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +-typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); +- +-ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, +- in_func in, void FAR *in_desc, +- out_func out, void FAR *out_desc)); +-/* +- inflateBack() does a raw inflate with a single call using a call-back +- interface for input and output. This is more efficient than inflate() for +- file i/o applications in that it avoids copying between the output and the +- sliding window by simply making the window itself the output buffer. This +- function trusts the application to not change the output buffer passed by +- the output function, at least until inflateBack() returns. +- +- inflateBackInit() must be called first to allocate the internal state +- and to initialize the state with the user-provided window buffer. +- inflateBack() may then be used multiple times to inflate a complete, raw +- deflate stream with each call. inflateBackEnd() is then called to free the +- allocated state. +- +- A raw deflate stream is one with no zlib or gzip header or trailer. +- This routine would normally be used in a utility that reads zip or gzip +- files and writes out uncompressed files. The utility would decode the +- header and process the trailer on its own, hence this routine expects only +- the raw deflate stream to decompress. This is different from the normal +- behavior of inflate(), which expects either a zlib or gzip header and +- trailer around the deflate stream. +- +- inflateBack() uses two subroutines supplied by the caller that are then +- called by inflateBack() for input and output. inflateBack() calls those +- routines until it reads a complete deflate stream and writes out all of the +- uncompressed data, or until it encounters an error. The function's +- parameters and return types are defined above in the in_func and out_func +- typedefs. inflateBack() will call in(in_desc, &buf) which should return the +- number of bytes of provided input, and a pointer to that input in buf. If +- there is no input available, in() must return zero--buf is ignored in that +- case--and inflateBack() will return a buffer error. inflateBack() will call +- out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() +- should return zero on success, or non-zero on failure. If out() returns +- non-zero, inflateBack() will return with an error. Neither in() nor out() +- are permitted to change the contents of the window provided to +- inflateBackInit(), which is also the buffer that out() uses to write from. +- The length written by out() will be at most the window size. Any non-zero +- amount of input may be provided by in(). +- +- For convenience, inflateBack() can be provided input on the first call by +- setting strm->next_in and strm->avail_in. If that input is exhausted, then +- in() will be called. Therefore strm->next_in must be initialized before +- calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called +- immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in +- must also be initialized, and then if strm->avail_in is not zero, input will +- initially be taken from strm->next_in[0 .. strm->avail_in - 1]. +- +- The in_desc and out_desc parameters of inflateBack() is passed as the +- first parameter of in() and out() respectively when they are called. These +- descriptors can be optionally used to pass any information that the caller- +- supplied in() and out() functions need to do their job. +- +- On return, inflateBack() will set strm->next_in and strm->avail_in to +- pass back any unused input that was provided by the last in() call. The +- return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR +- if in() or out() returned an error, Z_DATA_ERROR if there was a format error +- in the deflate stream (in which case strm->msg is set to indicate the nature +- of the error), or Z_STREAM_ERROR if the stream was not properly initialized. +- In the case of Z_BUF_ERROR, an input or output error can be distinguished +- using strm->next_in which will be Z_NULL only if in() returned an error. If +- strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning +- non-zero. (in() will always be called before out(), so strm->next_in is +- assured to be defined if out() returns non-zero.) Note that inflateBack() +- cannot return Z_OK. +-*/ +- +-ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +-/* +- All memory allocated by inflateBackInit() is freed. +- +- inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream +- state was inconsistent. +-*/ +- +-ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +-/* Return flags indicating compile-time options. +- +- Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: +- 1.0: size of uInt +- 3.2: size of uLong +- 5.4: size of voidpf (pointer) +- 7.6: size of z_off_t +- +- Compiler, assembler, and debug options: +- 8: DEBUG +- 9: ASMV or ASMINF -- use ASM code +- 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention +- 11: 0 (reserved) +- +- One-time table building (smaller code, but not thread-safe if true): +- 12: BUILDFIXED -- build static block decoding tables when needed +- 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed +- 14,15: 0 (reserved) +- +- Library content (indicates missing functionality): +- 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking +- deflate code when not needed) +- 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect +- and decode gzip streams (to avoid linking crc code) +- 18-19: 0 (reserved) +- +- Operation variations (changes in library functionality): +- 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate +- 21: FASTEST -- deflate algorithm with only one, lowest compression level +- 22,23: 0 (reserved) +- +- The sprintf variant used by gzprintf (zero is best): +- 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format +- 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! +- 26: 0 = returns value, 1 = void -- 1 means inferred string length returned +- +- Remainder: +- 27-31: 0 (reserved) +- */ +- +- +- /* utility functions */ +- +-/* +- The following utility functions are implemented on top of the basic +- stream-oriented functions. To simplify the interface, some default options +- are assumed (compression level and memory usage, standard memory allocation +- functions). The source code of these utility functions can be modified if +- you need special options. +-*/ +- +-ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, +- const Bytef *source, uLong sourceLen)); +-/* +- Compresses the source buffer into the destination buffer. sourceLen is +- the byte length of the source buffer. Upon entry, destLen is the total size +- of the destination buffer, which must be at least the value returned by +- compressBound(sourceLen). Upon exit, destLen is the actual size of the +- compressed buffer. +- +- compress returns Z_OK if success, Z_MEM_ERROR if there was not +- enough memory, Z_BUF_ERROR if there was not enough room in the output +- buffer. +-*/ +- +-ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, +- const Bytef *source, uLong sourceLen, +- int level)); +-/* +- Compresses the source buffer into the destination buffer. The level +- parameter has the same meaning as in deflateInit. sourceLen is the byte +- length of the source buffer. Upon entry, destLen is the total size of the +- destination buffer, which must be at least the value returned by +- compressBound(sourceLen). Upon exit, destLen is the actual size of the +- compressed buffer. +- +- compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough +- memory, Z_BUF_ERROR if there was not enough room in the output buffer, +- Z_STREAM_ERROR if the level parameter is invalid. +-*/ +- +-ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +-/* +- compressBound() returns an upper bound on the compressed size after +- compress() or compress2() on sourceLen bytes. It would be used before a +- compress() or compress2() call to allocate the destination buffer. +-*/ +- +-ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, +- const Bytef *source, uLong sourceLen)); +-/* +- Decompresses the source buffer into the destination buffer. sourceLen is +- the byte length of the source buffer. Upon entry, destLen is the total size +- of the destination buffer, which must be large enough to hold the entire +- uncompressed data. (The size of the uncompressed data must have been saved +- previously by the compressor and transmitted to the decompressor by some +- mechanism outside the scope of this compression library.) Upon exit, destLen +- is the actual size of the uncompressed buffer. +- +- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not +- enough memory, Z_BUF_ERROR if there was not enough room in the output +- buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +-*/ +- +- +- /* gzip file access functions */ +- +-/* +- This library supports reading and writing files in gzip (.gz) format with +- an interface similar to that of stdio, using the functions that start with +- "gz". The gzip format is different from the zlib format. gzip is a gzip +- wrapper, documented in RFC 1952, wrapped around a deflate stream. +-*/ +- +-typedef voidp gzFile; /* opaque gzip file descriptor */ +- +-/* +-ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +- +- Opens a gzip (.gz) file for reading or writing. The mode parameter is as +- in fopen ("rb" or "wb") but can also include a compression level ("wb9") or +- a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only +- compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' +- for fixed code compression as in "wb9F". (See the description of +- deflateInit2 for more information about the strategy parameter.) Also "a" +- can be used instead of "w" to request that the gzip stream that will be +- written be appended to the file. "+" will result in an error, since reading +- and writing to the same gzip file is not supported. +- +- gzopen can be used to read a file which is not in gzip format; in this +- case gzread will directly read from the file without decompression. +- +- gzopen returns NULL if the file could not be opened, if there was +- insufficient memory to allocate the gzFile state, or if an invalid mode was +- specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). +- errno can be checked to determine if the reason gzopen failed was that the +- file could not be opened. +-*/ +- +-ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +-/* +- gzdopen associates a gzFile with the file descriptor fd. File descriptors +- are obtained from calls like open, dup, creat, pipe or fileno (if the file +- has been previously opened with fopen). The mode parameter is as in gzopen. +- +- The next call of gzclose on the returned gzFile will also close the file +- descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor +- fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, +- mode);. The duplicated descriptor should be saved to avoid a leak, since +- gzdopen does not close fd if it fails. +- +- gzdopen returns NULL if there was insufficient memory to allocate the +- gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not +- provided, or '+' was provided), or if fd is -1. The file descriptor is not +- used until the next gz* read, write, seek, or close operation, so gzdopen +- will not detect if fd is invalid (unless fd is -1). +-*/ +- +-ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +-/* +- Set the internal buffer size used by this library's functions. The +- default buffer size is 8192 bytes. This function must be called after +- gzopen() or gzdopen(), and before any other calls that read or write the +- file. The buffer memory allocation is always deferred to the first read or +- write. Two buffers are allocated, either both of the specified size when +- writing, or one of the specified size and the other twice that size when +- reading. A larger buffer size of, for example, 64K or 128K bytes will +- noticeably increase the speed of decompression (reading). +- +- The new buffer size also affects the maximum length for gzprintf(). +- +- gzbuffer() returns 0 on success, or -1 on failure, such as being called +- too late. +-*/ +- +-ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +-/* +- Dynamically update the compression level or strategy. See the description +- of deflateInit2 for the meaning of these parameters. +- +- gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not +- opened for writing. +-*/ +- +-ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +-/* +- Reads the given number of uncompressed bytes from the compressed file. If +- the input file was not in gzip format, gzread copies the given number of +- bytes into the buffer. +- +- After reaching the end of a gzip stream in the input, gzread will continue +- to read, looking for another gzip stream, or failing that, reading the rest +- of the input file directly without decompression. The entire input file +- will be read if gzread is called until it returns less than the requested +- len. +- +- gzread returns the number of uncompressed bytes actually read, less than +- len for end of file, or -1 for error. +-*/ +- +-ZEXTERN int ZEXPORT gzwrite OF((gzFile file, +- voidpc buf, unsigned len)); +-/* +- Writes the given number of uncompressed bytes into the compressed file. +- gzwrite returns the number of uncompressed bytes written or 0 in case of +- error. +-*/ +- +-ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +-/* +- Converts, formats, and writes the arguments to the compressed file under +- control of the format string, as in fprintf. gzprintf returns the number of +- uncompressed bytes actually written, or 0 in case of error. The number of +- uncompressed bytes written is limited to 8191, or one less than the buffer +- size given to gzbuffer(). The caller should assure that this limit is not +- exceeded. If it is exceeded, then gzprintf() will return an error (0) with +- nothing written. In this case, there may also be a buffer overflow with +- unpredictable consequences, which is possible only if zlib was compiled with +- the insecure functions sprintf() or vsprintf() because the secure snprintf() +- or vsnprintf() functions were not available. This can be determined using +- zlibCompileFlags(). +-*/ +- +-ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +-/* +- Writes the given null-terminated string to the compressed file, excluding +- the terminating null character. +- +- gzputs returns the number of characters written, or -1 in case of error. +-*/ +- +-ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +-/* +- Reads bytes from the compressed file until len-1 characters are read, or a +- newline character is read and transferred to buf, or an end-of-file +- condition is encountered. If any characters are read or if len == 1, the +- string is terminated with a null character. If no characters are read due +- to an end-of-file or len < 1, then the buffer is left untouched. +- +- gzgets returns buf which is a null-terminated string, or it returns NULL +- for end-of-file or in case of error. If there was an error, the contents at +- buf are indeterminate. +-*/ +- +-ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +-/* +- Writes c, converted to an unsigned char, into the compressed file. gzputc +- returns the value that was written, or -1 in case of error. +-*/ +- +-ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +-/* +- Reads one byte from the compressed file. gzgetc returns this byte or -1 +- in case of end of file or error. +-*/ +- +-ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +-/* +- Push one character back onto the stream to be read as the first character +- on the next read. At least one character of push-back is allowed. +- gzungetc() returns the character pushed, or -1 on failure. gzungetc() will +- fail if c is -1, and may fail if a character has been pushed but not read +- yet. If gzungetc is used immediately after gzopen or gzdopen, at least the +- output buffer size of pushed characters is allowed. (See gzbuffer above.) +- The pushed character will be discarded if the stream is repositioned with +- gzseek() or gzrewind(). +-*/ +- +-ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +-/* +- Flushes all pending output into the compressed file. The parameter flush +- is as in the deflate() function. The return value is the zlib error number +- (see function gzerror below). gzflush is only permitted when writing. +- +- If the flush parameter is Z_FINISH, the remaining data is written and the +- gzip stream is completed in the output. If gzwrite() is called again, a new +- gzip stream will be started in the output. gzread() is able to read such +- concatented gzip streams. +- +- gzflush should be called only when strictly necessary because it will +- degrade compression if called too often. +-*/ +- +-/* +-ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, +- z_off_t offset, int whence)); +- +- Sets the starting position for the next gzread or gzwrite on the given +- compressed file. The offset represents a number of bytes in the +- uncompressed data stream. The whence parameter is defined as in lseek(2); +- the value SEEK_END is not supported. +- +- If the file is opened for reading, this function is emulated but can be +- extremely slow. If the file is opened for writing, only forward seeks are +- supported; gzseek then compresses a sequence of zeroes up to the new +- starting position. +- +- gzseek returns the resulting offset location as measured in bytes from +- the beginning of the uncompressed stream, or -1 in case of error, in +- particular if the file is opened for writing and the new starting position +- would be before the current position. +-*/ +- +-ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +-/* +- Rewinds the given file. This function is supported only for reading. +- +- gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +-*/ +- +-/* +-ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +- +- Returns the starting position for the next gzread or gzwrite on the given +- compressed file. This position represents a number of bytes in the +- uncompressed data stream, and is zero when starting, even if appending or +- reading a gzip stream from the middle of a file using gzdopen(). +- +- gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +-*/ +- +-/* +-ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); +- +- Returns the current offset in the file being read or written. This offset +- includes the count of bytes that precede the gzip stream, for example when +- appending or when using gzdopen() for reading. When reading, the offset +- does not include as yet unused buffered input. This information can be used +- for a progress indicator. On error, gzoffset() returns -1. +-*/ +- +-ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +-/* +- Returns true (1) if the end-of-file indicator has been set while reading, +- false (0) otherwise. Note that the end-of-file indicator is set only if the +- read tried to go past the end of the input, but came up short. Therefore, +- just like feof(), gzeof() may return false even if there is no more data to +- read, in the event that the last read request was for the exact number of +- bytes remaining in the input file. This will happen if the input file size +- is an exact multiple of the buffer size. +- +- If gzeof() returns true, then the read functions will return no more data, +- unless the end-of-file indicator is reset by gzclearerr() and the input file +- has grown since the previous end of file was detected. +-*/ +- +-ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +-/* +- Returns true (1) if file is being copied directly while reading, or false +- (0) if file is a gzip stream being decompressed. This state can change from +- false to true while reading the input file if the end of a gzip stream is +- reached, but is followed by data that is not another gzip stream. +- +- If the input file is empty, gzdirect() will return true, since the input +- does not contain a gzip stream. +- +- If gzdirect() is used immediately after gzopen() or gzdopen() it will +- cause buffers to be allocated to allow reading the file to determine if it +- is a gzip file. Therefore if gzbuffer() is used, it should be called before +- gzdirect(). +-*/ +- +-ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +-/* +- Flushes all pending output if necessary, closes the compressed file and +- deallocates the (de)compression state. Note that once file is closed, you +- cannot call gzerror with file, since its structures have been deallocated. +- gzclose must not be called more than once on the same file, just as free +- must not be called more than once on the same allocation. +- +- gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a +- file operation error, or Z_OK on success. +-*/ +- +-ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +-ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +-/* +- Same as gzclose(), but gzclose_r() is only for use when reading, and +- gzclose_w() is only for use when writing or appending. The advantage to +- using these instead of gzclose() is that they avoid linking in zlib +- compression or decompression code that is not used when only reading or only +- writing respectively. If gzclose() is used, then both compression and +- decompression code will be included the application when linking to a static +- zlib library. +-*/ +- +-ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +-/* +- Returns the error message for the last error which occurred on the given +- compressed file. errnum is set to zlib error number. If an error occurred +- in the file system and not in the compression library, errnum is set to +- Z_ERRNO and the application may consult errno to get the exact error code. +- +- The application must not modify the returned string. Future calls to +- this function may invalidate the previously returned string. If file is +- closed, then the string previously returned by gzerror will no longer be +- available. +- +- gzerror() should be used to distinguish errors from end-of-file for those +- functions above that do not distinguish those cases in their return values. +-*/ +- +-ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +-/* +- Clears the error and end-of-file flags for file. This is analogous to the +- clearerr() function in stdio. This is useful for continuing to read a gzip +- file that is being written concurrently. +-*/ +- +- +- /* checksum functions */ +- +-/* +- These functions are not related to compression but are exported +- anyway because they might be useful in applications using the compression +- library. +-*/ +- +-ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +-/* +- Update a running Adler-32 checksum with the bytes buf[0..len-1] and +- return the updated checksum. If buf is Z_NULL, this function returns the +- required initial value for the checksum. +- +- An Adler-32 checksum is almost as reliable as a CRC32 but can be computed +- much faster. +- +- Usage example: +- +- uLong adler = adler32(0L, Z_NULL, 0); +- +- while (read_buffer(buffer, length) != EOF) { +- adler = adler32(adler, buffer, length); +- } +- if (adler != original_adler) error(); +-*/ +- +-/* +-ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, +- z_off_t len2)); +- +- Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 +- and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for +- each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of +- seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +-*/ +- +-ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +-/* +- Update a running CRC-32 with the bytes buf[0..len-1] and return the +- updated CRC-32. If buf is Z_NULL, this function returns the required +- initial value for the for the crc. Pre- and post-conditioning (one's +- complement) is performed within this function so it shouldn't be done by the +- application. +- +- Usage example: +- +- uLong crc = crc32(0L, Z_NULL, 0); +- +- while (read_buffer(buffer, length) != EOF) { +- crc = crc32(crc, buffer, length); +- } +- if (crc != original_crc) error(); +-*/ +- +-/* +-ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); +- +- Combine two CRC-32 check values into one. For two sequences of bytes, +- seq1 and seq2 with lengths len1 and len2, CRC-32 check values were +- calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 +- check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and +- len2. +-*/ +- +- +- /* various hacks, don't look :) */ +- +-/* deflateInit and inflateInit are macros to allow checking the zlib version +- * and the compiler's view of z_stream: +- */ +-ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, +- const char *version, int stream_size)); +-ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, +- const char *version, int stream_size)); +-ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, +- int windowBits, int memLevel, +- int strategy, const char *version, +- int stream_size)); +-ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, +- const char *version, int stream_size)); +-ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, +- unsigned char FAR *window, +- const char *version, +- int stream_size)); +-#define deflateInit(strm, level) \ +- deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +-#define inflateInit(strm) \ +- inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +-#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ +- deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ +- (strategy), ZLIB_VERSION, sizeof(z_stream)) +-#define inflateInit2(strm, windowBits) \ +- inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +-#define inflateBackInit(strm, windowBits, window) \ +- inflateBackInit_((strm), (windowBits), (window), \ +- ZLIB_VERSION, sizeof(z_stream)) +- +-/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or +- * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if +- * both are true, the application gets the *64 functions, and the regular +- * functions are changed to 64 bits) -- in case these are set on systems +- * without large file support, _LFS64_LARGEFILE must also be true +- */ +-#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +- ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); +- ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); +- ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); +- ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); +- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +-#endif +- +-#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 +-# define gzopen gzopen64 +-# define gzseek gzseek64 +-# define gztell gztell64 +-# define gzoffset gzoffset64 +-# define adler32_combine adler32_combine64 +-# define crc32_combine crc32_combine64 +-# ifdef _LARGEFILE64_SOURCE +- ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); +- ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); +- ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); +- ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); +- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); +- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +-# endif +-#else +- ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); +- ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); +- ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); +- ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); +- ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); +- ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +-#endif +- +-/* hack for buggy compilers */ +-#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) +- struct internal_state {int dummy;}; +-#endif +- +-/* undocumented functions */ +-ZEXTERN const char * ZEXPORT zError OF((int)); +-ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +-ZEXTERN const unsigned long FAR * ZEXPORT get_crc_table OF((void)); +-ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +- +-#ifdef __cplusplus +-} +-#endif +- +-#endif /* ZLIB_H */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zutil.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zutil.c Thu Jan 01 00:00:00 1970 +0000 +@@ -1,342 +0,0 @@ +-/* +- * 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. +- */ +- +-/* zutil.c -- target dependent utility functions for the compression library +- * Copyright (C) 1995-2005, 2010 Jean-loup Gailly. +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* @(#) $Id$ */ +- +-#include "zutil.h" +- +-#ifndef NO_DUMMY_DECL +-struct internal_state {int dummy;}; /* for buggy compilers */ +-#endif +- +-const char * const z_errmsg[10] = { +-"need dictionary", /* Z_NEED_DICT 2 */ +-"stream end", /* Z_STREAM_END 1 */ +-"", /* Z_OK 0 */ +-"file error", /* Z_ERRNO (-1) */ +-"stream error", /* Z_STREAM_ERROR (-2) */ +-"data error", /* Z_DATA_ERROR (-3) */ +-"insufficient memory", /* Z_MEM_ERROR (-4) */ +-"buffer error", /* Z_BUF_ERROR (-5) */ +-"incompatible version",/* Z_VERSION_ERROR (-6) */ +-""}; +- +- +-const char * ZEXPORT zlibVersion() +-{ +- return ZLIB_VERSION; +-} +- +-uLong ZEXPORT zlibCompileFlags() +-{ +- uLong flags; +- +- flags = 0; +- switch ((int)(sizeof(uInt))) { +- case 2: break; +- case 4: flags += 1; break; +- case 8: flags += 2; break; +- default: flags += 3; +- } +- switch ((int)(sizeof(uLong))) { +- case 2: break; +- case 4: flags += 1 << 2; break; +- case 8: flags += 2 << 2; break; +- default: flags += 3 << 2; +- } +- switch ((int)(sizeof(voidpf))) { +- case 2: break; +- case 4: flags += 1 << 4; break; +- case 8: flags += 2 << 4; break; +- default: flags += 3 << 4; +- } +- switch ((int)(sizeof(z_off_t))) { +- case 2: break; +- case 4: flags += 1 << 6; break; +- case 8: flags += 2 << 6; break; +- default: flags += 3 << 6; +- } +-#ifdef DEBUG +- flags += 1 << 8; +-#endif +-#if defined(ASMV) || defined(ASMINF) +- flags += 1 << 9; +-#endif +-#ifdef ZLIB_WINAPI +- flags += 1 << 10; +-#endif +-#ifdef BUILDFIXED +- flags += 1 << 12; +-#endif +-#ifdef DYNAMIC_CRC_TABLE +- flags += 1 << 13; +-#endif +-#ifdef NO_GZCOMPRESS +- flags += 1L << 16; +-#endif +-#ifdef NO_GZIP +- flags += 1L << 17; +-#endif +-#ifdef PKZIP_BUG_WORKAROUND +- flags += 1L << 20; +-#endif +-#ifdef FASTEST +- flags += 1L << 21; +-#endif +-#ifdef STDC +-# ifdef NO_vsnprintf +- flags += 1L << 25; +-# ifdef HAS_vsprintf_void +- flags += 1L << 26; +-# endif +-# else +-# ifdef HAS_vsnprintf_void +- flags += 1L << 26; +-# endif +-# endif +-#else +- flags += 1L << 24; +-# ifdef NO_snprintf +- flags += 1L << 25; +-# ifdef HAS_sprintf_void +- flags += 1L << 26; +-# endif +-# else +-# ifdef HAS_snprintf_void +- flags += 1L << 26; +-# endif +-# endif +-#endif +- return flags; +-} +- +-#ifdef DEBUG +- +-# ifndef verbose +-# define verbose 0 +-# endif +-int ZLIB_INTERNAL z_verbose = verbose; +- +-void ZLIB_INTERNAL z_error (m) +- char *m; +-{ +- fprintf(stderr, "%s\n", m); +- exit(1); +-} +-#endif +- +-/* exported to allow conversion of error code to string for compress() and +- * uncompress() +- */ +-const char * ZEXPORT zError(err) +- int err; +-{ +- return ERR_MSG(err); +-} +- +-#if defined(_WIN32_WCE) +- /* The Microsoft C Run-Time Library for Windows CE doesn't have +- * errno. We define it as a global variable to simplify porting. +- * Its value is always 0 and should not be used. +- */ +- int errno = 0; +-#endif +- +-#ifndef HAVE_MEMCPY +- +-void ZLIB_INTERNAL zmemcpy(dest, source, len) +- Bytef* dest; +- const Bytef* source; +- uInt len; +-{ +- if (len == 0) return; +- do { +- *dest++ = *source++; /* ??? to be unrolled */ +- } while (--len != 0); +-} +- +-int ZLIB_INTERNAL zmemcmp(s1, s2, len) +- const Bytef* s1; +- const Bytef* s2; +- uInt len; +-{ +- uInt j; +- +- for (j = 0; j < len; j++) { +- if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; +- } +- return 0; +-} +- +-void ZLIB_INTERNAL zmemzero(dest, len) +- Bytef* dest; +- uInt len; +-{ +- if (len == 0) return; +- do { +- *dest++ = 0; /* ??? to be unrolled */ +- } while (--len != 0); +-} +-#endif +- +- +-#ifdef SYS16BIT +- +-#ifdef __TURBOC__ +-/* Turbo C in 16-bit mode */ +- +-# define MY_ZCALLOC +- +-/* Turbo C malloc() does not allow dynamic allocation of 64K bytes +- * and farmalloc(64K) returns a pointer with an offset of 8, so we +- * must fix the pointer. Warning: the pointer must be put back to its +- * original form in order to free it, use zcfree(). +- */ +- +-#define MAX_PTR 10 +-/* 10*64K = 640K */ +- +-local int next_ptr = 0; +- +-typedef struct ptr_table_s { +- voidpf org_ptr; +- voidpf new_ptr; +-} ptr_table; +- +-local ptr_table table[MAX_PTR]; +-/* This table is used to remember the original form of pointers +- * to large buffers (64K). Such pointers are normalized with a zero offset. +- * Since MSDOS is not a preemptive multitasking OS, this table is not +- * protected from concurrent access. This hack doesn't work anyway on +- * a protected system like OS/2. Use Microsoft C instead. +- */ +- +-voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +-{ +- voidpf buf = opaque; /* just to make some compilers happy */ +- ulg bsize = (ulg)items*size; +- +- /* If we allocate less than 65520 bytes, we assume that farmalloc +- * will return a usable pointer which doesn't have to be normalized. +- */ +- if (bsize < 65520L) { +- buf = farmalloc(bsize); +- if (*(ush*)&buf != 0) return buf; +- } else { +- buf = farmalloc(bsize + 16L); +- } +- if (buf == NULL || next_ptr >= MAX_PTR) return NULL; +- table[next_ptr].org_ptr = buf; +- +- /* Normalize the pointer to seg:0 */ +- *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; +- *(ush*)&buf = 0; +- table[next_ptr++].new_ptr = buf; +- return buf; +-} +- +-void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +-{ +- int n; +- if (*(ush*)&ptr != 0) { /* object < 64K */ +- farfree(ptr); +- return; +- } +- /* Find the original pointer */ +- for (n = 0; n < next_ptr; n++) { +- if (ptr != table[n].new_ptr) continue; +- +- farfree(table[n].org_ptr); +- while (++n < next_ptr) { +- table[n-1] = table[n]; +- } +- next_ptr--; +- return; +- } +- ptr = opaque; /* just to make some compilers happy */ +- Assert(0, "zcfree: ptr not found"); +-} +- +-#endif /* __TURBOC__ */ +- +- +-#ifdef M_I86 +-/* Microsoft C in 16-bit mode */ +- +-# define MY_ZCALLOC +- +-#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +-# define _halloc halloc +-# define _hfree hfree +-#endif +- +-voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +-{ +- if (opaque) opaque = 0; /* to make compiler happy */ +- return _halloc((long)items, size); +-} +- +-void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +-{ +- if (opaque) opaque = 0; /* to make compiler happy */ +- _hfree(ptr); +-} +- +-#endif /* M_I86 */ +- +-#endif /* SYS16BIT */ +- +- +-#ifndef MY_ZCALLOC /* Any system without a special alloc function */ +- +-#ifndef STDC +-extern voidp malloc OF((uInt size)); +-extern voidp calloc OF((uInt items, uInt size)); +-extern void free OF((voidpf ptr)); +-#endif +- +-voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) +- voidpf opaque; +- unsigned items; +- unsigned size; +-{ +- if (opaque) items += size - size; /* make compiler happy */ +- return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : +- (voidpf)calloc(items, size); +-} +- +-void ZLIB_INTERNAL zcfree (opaque, ptr) +- voidpf opaque; +- voidpf ptr; +-{ +- free(ptr); +- if (opaque) return; /* make compiler happy */ +-} +- +-#endif /* MY_ZCALLOC */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zutil.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.5/zutil.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,298 +0,0 @@ +-/* +- * 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. +- */ +- +-/* zutil.h -- internal interface and configuration of the compression library +- * Copyright (C) 1995-2010 Jean-loup Gailly. +- * For conditions of distribution and use, see copyright notice in zlib.h +- */ +- +-/* WARNING: this file should *not* be used by applications. It is +- part of the implementation of the compression library and is +- subject to change. Applications should only use zlib.h. +- */ +- +-/* @(#) $Id$ */ +- +-#ifndef ZUTIL_H +-#define ZUTIL_H +- +-#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +-# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +-#else +-# define ZLIB_INTERNAL +-#endif +- +-#include "zlib.h" +- +-#ifdef STDC +-# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +-# include <stddef.h> +-# endif +-# include <string.h> +-# include <stdlib.h> +-#endif +- +-#ifndef local +-# define local static +-#endif +-/* compile with -Dlocal if your debugger can't find static symbols */ +- +-typedef unsigned char uch; +-typedef uch FAR uchf; +-typedef unsigned short ush; +-typedef ush FAR ushf; +-typedef unsigned long ulg; +- +-extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +-/* (size given to avoid silly warnings with Visual C++) */ +- +-#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] +- +-#define ERR_RETURN(strm,err) \ +- return (strm->msg = (char*)ERR_MSG(err), (err)) +-/* To be used only when the state is known to be valid */ +- +- /* common constants */ +- +-#ifndef DEF_WBITS +-# define DEF_WBITS MAX_WBITS +-#endif +-/* default windowBits for decompression. MAX_WBITS is for compression only */ +- +-#if MAX_MEM_LEVEL >= 8 +-# define DEF_MEM_LEVEL 8 +-#else +-# define DEF_MEM_LEVEL MAX_MEM_LEVEL +-#endif +-/* default memLevel */ +- +-#define STORED_BLOCK 0 +-#define STATIC_TREES 1 +-#define DYN_TREES 2 +-/* The three kinds of block type */ +- +-#define MIN_MATCH 3 +-#define MAX_MATCH 258 +-/* The minimum and maximum match lengths */ +- +-#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ +- +- /* target dependencies */ +- +-#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +-# define OS_CODE 0x00 +-# if defined(__TURBOC__) || defined(__BORLANDC__) +-# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) +- /* Allow compilation with ANSI keywords only enabled */ +- void _Cdecl farfree( void *block ); +- void *_Cdecl farmalloc( unsigned long nbytes ); +-# else +-# include <alloc.h> +-# endif +-# else /* MSC or DJGPP */ +-# include <malloc.h> +-# endif +-#endif +- +-#ifdef AMIGA +-# define OS_CODE 0x01 +-#endif +- +-#if defined(VAXC) || defined(VMS) +-# define OS_CODE 0x02 +-# define F_OPEN(name, mode) \ +- fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +-#endif +- +-#if defined(ATARI) || defined(atarist) +-# define OS_CODE 0x05 +-#endif +- +-#ifdef OS2 +-# define OS_CODE 0x06 +-# ifdef M_I86 +-# include <malloc.h> +-# endif +-#endif +- +-#if defined(MACOS) || defined(TARGET_OS_MAC) +-# define OS_CODE 0x07 +-# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +-# include <unix.h> /* for fdopen */ +-# else +-# ifndef fdopen +-# define fdopen(fd,mode) NULL /* No fdopen() */ +-# endif +-# endif +-#endif +- +-#ifdef TOPS20 +-# define OS_CODE 0x0a +-#endif +- +-#ifdef WIN32 +-# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +-# define OS_CODE 0x0b +-# endif +-#endif +- +-#ifdef __50SERIES /* Prime/PRIMOS */ +-# define OS_CODE 0x0f +-#endif +- +-#if defined(_BEOS_) || defined(RISCOS) +-# define fdopen(fd,mode) NULL /* No fdopen() */ +-#endif +- +-#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +-# if defined(_WIN32_WCE) +-# define fdopen(fd,mode) NULL /* No fdopen() */ +-# ifndef _PTRDIFF_T_DEFINED +- typedef int ptrdiff_t; +-# define _PTRDIFF_T_DEFINED +-# endif +-# else +-# define fdopen(fd,type) _fdopen(fd,type) +-# endif +-#endif +- +-#if defined(__BORLANDC__) +- #pragma warn -8004 +- #pragma warn -8008 +- #pragma warn -8066 +-#endif +- +-/* provide prototypes for these when building zlib without LFS */ +-#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 +- ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); +- ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +-#endif +- +- /* common defaults */ +- +-#ifndef OS_CODE +-# define OS_CODE 0x03 /* assume Unix */ +-#endif +- +-#ifndef F_OPEN +-# define F_OPEN(name, mode) fopen((name), (mode)) +-#endif +- +- /* functions */ +- +-#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +-# ifndef HAVE_VSNPRINTF +-# define HAVE_VSNPRINTF +-# endif +-#endif +-#if defined(__CYGWIN__) +-# ifndef HAVE_VSNPRINTF +-# define HAVE_VSNPRINTF +-# endif +-#endif +-#ifndef HAVE_VSNPRINTF +-# ifdef MSDOS +- /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), +- but for now we just assume it doesn't. */ +-# define NO_vsnprintf +-# endif +-# ifdef __TURBOC__ +-# define NO_vsnprintf +-# endif +-# ifdef WIN32 +- /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +-# if !defined(vsnprintf) && !defined(NO_vsnprintf) +-# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +-# define vsnprintf _vsnprintf +-# endif +-# endif +-# endif +-# ifdef __SASC +-# define NO_vsnprintf +-# endif +-#endif +-#ifdef VMS +-# define NO_vsnprintf +-#endif +- +-#if defined(pyr) +-# define NO_MEMCPY +-#endif +-#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) +- /* Use our own functions for small and medium model with MSC <= 5.0. +- * You may have to use the same strategy for Borland C (untested). +- * The __SC__ check is for Symantec. +- */ +-# define NO_MEMCPY +-#endif +-#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +-# define HAVE_MEMCPY +-#endif +-#ifdef HAVE_MEMCPY +-# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +-# define zmemcpy _fmemcpy +-# define zmemcmp _fmemcmp +-# define zmemzero(dest, len) _fmemset(dest, 0, len) +-# else +-# define zmemcpy memcpy +-# define zmemcmp memcmp +-# define zmemzero(dest, len) memset(dest, 0, len) +-# endif +-#else +- void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); +- int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); +- void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +-#endif +- +-/* Diagnostic functions */ +-#ifdef DEBUG +-# include <stdio.h> +- extern int ZLIB_INTERNAL z_verbose; +- extern void ZLIB_INTERNAL z_error OF((char *m)); +-# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +-# define Trace(x) {if (z_verbose>=0) fprintf x ;} +-# define Tracev(x) {if (z_verbose>0) fprintf x ;} +-# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +-# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +-# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +-#else +-# define Assert(cond,msg) +-# define Trace(x) +-# define Tracev(x) +-# define Tracevv(x) +-# define Tracec(c,x) +-# define Tracecv(c,x) +-#endif +- +- +-voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, +- unsigned size)); +-void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +- +-#define ZALLOC(strm, items, size) \ +- (*((strm)->zalloc))((strm)->opaque, (items), (size)) +-#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +-#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} +- +-#endif /* ZUTIL_H */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/ChangeLog Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/ChangeLog Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,1472 @@ ++ ++ ChangeLog file for zlib ++ ++Changes in 1.2.8 (28 Apr 2013) ++- Update contrib/minizip/iowin32.c for Windows RT [Vollant] ++- Do not force Z_CONST for C++ ++- Clean up contrib/vstudio [Ro§] ++- Correct spelling error in zlib.h ++- Fix mixed line endings in contrib/vstudio ++ ++Changes in 1.2.7.3 (13 Apr 2013) ++- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc ++ ++Changes in 1.2.7.2 (13 Apr 2013) ++- Change check for a four-byte type back to hexadecimal ++- Fix typo in win32/Makefile.msc ++- Add casts in gzwrite.c for pointer differences ++ ++Changes in 1.2.7.1 (24 Mar 2013) ++- Replace use of unsafe string functions with snprintf if available ++- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink] ++- Fix gzgetc undefine when Z_PREFIX set [Turk] ++- Eliminate use of mktemp in Makefile (not always available) ++- Fix bug in 'F' mode for gzopen() ++- Add inflateGetDictionary() function ++- Correct comment in deflate.h ++- Use _snprintf for snprintf in Microsoft C ++- On Darwin, only use /usr/bin/libtool if libtool is not Apple ++- Delete "--version" file if created by "ar --version" [Richard G.] ++- Fix configure check for veracity of compiler error return codes ++- Fix CMake compilation of static lib for MSVC2010 x64 ++- Remove unused variable in infback9.c ++- Fix argument checks in gzlog_compress() and gzlog_write() ++- Clean up the usage of z_const and respect const usage within zlib ++- Clean up examples/gzlog.[ch] comparisons of different types ++- Avoid shift equal to bits in type (caused endless loop) ++- Fix unintialized value bug in gzputc() introduced by const patches ++- Fix memory allocation error in examples/zran.c [Nor] ++- Fix bug where gzopen(), gzclose() would write an empty file ++- Fix bug in gzclose() when gzwrite() runs out of memory ++- Check for input buffer malloc failure in examples/gzappend.c ++- Add note to contrib/blast to use binary mode in stdio ++- Fix comparisons of differently signed integers in contrib/blast ++- Check for invalid code length codes in contrib/puff ++- Fix serious but very rare decompression bug in inftrees.c ++- Update inflateBack() comments, since inflate() can be faster ++- Use underscored I/O function names for WINAPI_FAMILY ++- Add _tr_flush_bits to the external symbols prefixed by --zprefix ++- Add contrib/vstudio/vc10 pre-build step for static only ++- Quote --version-script argument in CMakeLists.txt ++- Don't specify --version-script on Apple platforms in CMakeLists.txt ++- Fix casting error in contrib/testzlib/testzlib.c ++- Fix types in contrib/minizip to match result of get_crc_table() ++- Simplify contrib/vstudio/vc10 with 'd' suffix ++- Add TOP support to win32/Makefile.msc ++- Suport i686 and amd64 assembler builds in CMakeLists.txt ++- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h ++- Add vc11 and vc12 build files to contrib/vstudio ++- Add gzvprintf() as an undocumented function in zlib ++- Fix configure for Sun shell ++- Remove runtime check in configure for four-byte integer type ++- Add casts and consts to ease user conversion to C++ ++- Add man pages for minizip and miniunzip ++- In Makefile uninstall, don't rm if preceding cd fails ++- Do not return Z_BUF_ERROR if deflateParam() has nothing to write ++ ++Changes in 1.2.7 (2 May 2012) ++- Replace use of memmove() with a simple copy for portability ++- Test for existence of strerror ++- Restore gzgetc_ for backward compatibility with 1.2.6 ++- Fix build with non-GNU make on Solaris ++- Require gcc 4.0 or later on Mac OS X to use the hidden attribute ++- Include unistd.h for Watcom C ++- Use __WATCOMC__ instead of __WATCOM__ ++- Do not use the visibility attribute if NO_VIZ defined ++- Improve the detection of no hidden visibility attribute ++- Avoid using __int64 for gcc or solo compilation ++- Cast to char * in gzprintf to avoid warnings [Zinser] ++- Fix make_vms.com for VAX [Zinser] ++- Don't use library or built-in byte swaps ++- Simplify test and use of gcc hidden attribute ++- Fix bug in gzclose_w() when gzwrite() fails to allocate memory ++- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen() ++- Fix bug in test/minigzip.c for configure --solo ++- Fix contrib/vstudio project link errors [Mohanathas] ++- Add ability to choose the builder in make_vms.com [Schweda] ++- Add DESTDIR support to mingw32 win32/Makefile.gcc ++- Fix comments in win32/Makefile.gcc for proper usage ++- Allow overriding the default install locations for cmake ++- Generate and install the pkg-config file with cmake ++- Build both a static and a shared version of zlib with cmake ++- Include version symbols for cmake builds ++- If using cmake with MSVC, add the source directory to the includes ++- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta] ++- Move obsolete emx makefile to old [Truta] ++- Allow the use of -Wundef when compiling or using zlib ++- Avoid the use of the -u option with mktemp ++- Improve inflate() documentation on the use of Z_FINISH ++- Recognize clang as gcc ++- Add gzopen_w() in Windows for wide character path names ++- Rename zconf.h in CMakeLists.txt to move it out of the way ++- Add source directory in CMakeLists.txt for building examples ++- Look in build directory for zlib.pc in CMakeLists.txt ++- Remove gzflags from zlibvc.def in vc9 and vc10 ++- Fix contrib/minizip compilation in the MinGW environment ++- Update ./configure for Solaris, support --64 [Mooney] ++- Remove -R. from Solaris shared build (possible security issue) ++- Avoid race condition for parallel make (-j) running example ++- Fix type mismatch between get_crc_table() and crc_table ++- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler] ++- Fix the path to zlib.map in CMakeLists.txt ++- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe] ++- Add instructions to win32/Makefile.gcc for shared install [Torri] ++ ++Changes in 1.2.6.1 (12 Feb 2012) ++- Avoid the use of the Objective-C reserved name "id" ++- Include io.h in gzguts.h for Microsoft compilers ++- Fix problem with ./configure --prefix and gzgetc macro ++- Include gz_header definition when compiling zlib solo ++- Put gzflags() functionality back in zutil.c ++- Avoid library header include in crc32.c for Z_SOLO ++- Use name in GCC_CLASSIC as C compiler for coverage testing, if set ++- Minor cleanup in contrib/minizip/zip.c [Vollant] ++- Update make_vms.com [Zinser] ++- Remove unnecessary gzgetc_ function ++- Use optimized byte swap operations for Microsoft and GNU [Snyder] ++- Fix minor typo in zlib.h comments [Rzesniowiecki] ++ ++Changes in 1.2.6 (29 Jan 2012) ++- Update the Pascal interface in contrib/pascal ++- Fix function numbers for gzgetc_ in zlibvc.def files ++- Fix configure.ac for contrib/minizip [Schiffer] ++- Fix large-entry detection in minizip on 64-bit systems [Schiffer] ++- Have ./configure use the compiler return code for error indication ++- Fix CMakeLists.txt for cross compilation [McClure] ++- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes] ++- Fix compilation of contrib/minizip on FreeBSD [Marquez] ++- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath] ++- Include io.h for Turbo C / Borland C on all platforms [Truta] ++- Make version explicit in contrib/minizip/configure.ac [Bosmans] ++- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant] ++- Minor cleanup up contrib/minizip/unzip.c [Vollant] ++- Fix bug when compiling minizip with C++ [Vollant] ++- Protect for long name and extra fields in contrib/minizip [Vollant] ++- Avoid some warnings in contrib/minizip [Vollant] ++- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip ++- Add missing libs to minizip linker command ++- Add support for VPATH builds in contrib/minizip ++- Add an --enable-demos option to contrib/minizip/configure ++- Add the generation of configure.log by ./configure ++- Exit when required parameters not provided to win32/Makefile.gcc ++- Have gzputc return the character written instead of the argument ++- Use the -m option on ldconfig for BSD systems [Tobias] ++- Correct in zlib.map when deflateResetKeep was added ++ ++Changes in 1.2.5.3 (15 Jan 2012) ++- Restore gzgetc function for binary compatibility ++- Do not use _lseeki64 under Borland C++ [Truta] ++- Update win32/Makefile.msc to build test/*.c [Truta] ++- Remove old/visualc6 given CMakefile and other alternatives ++- Update AS400 build files and documentation [Monnerat] ++- Update win32/Makefile.gcc to build test/*.c [Truta] ++- Permit stronger flushes after Z_BLOCK flushes ++- Avoid extraneous empty blocks when doing empty flushes ++- Permit Z_NULL arguments to deflatePending ++- Allow deflatePrime() to insert bits in the middle of a stream ++- Remove second empty static block for Z_PARTIAL_FLUSH ++- Write out all of the available bits when using Z_BLOCK ++- Insert the first two strings in the hash table after a flush ++ ++Changes in 1.2.5.2 (17 Dec 2011) ++- fix ld error: unable to find version dependency 'ZLIB_1.2.5' ++- use relative symlinks for shared libs ++- Avoid searching past window for Z_RLE strategy ++- Assure that high-water mark initialization is always applied in deflate ++- Add assertions to fill_window() in deflate.c to match comments ++- Update python link in README ++- Correct spelling error in gzread.c ++- Fix bug in gzgets() for a concatenated empty gzip stream ++- Correct error in comment for gz_make() ++- Change gzread() and related to ignore junk after gzip streams ++- Allow gzread() and related to continue after gzclearerr() ++- Allow gzrewind() and gzseek() after a premature end-of-file ++- Simplify gzseek() now that raw after gzip is ignored ++- Change gzgetc() to a macro for speed (~40% speedup in testing) ++- Fix gzclose() to return the actual error last encountered ++- Always add large file support for windows ++- Include zconf.h for windows large file support ++- Include zconf.h.cmakein for windows large file support ++- Update zconf.h.cmakein on make distclean ++- Merge vestigial vsnprintf determination from zutil.h to gzguts.h ++- Clarify how gzopen() appends in zlib.h comments ++- Correct documentation of gzdirect() since junk at end now ignored ++- Add a transparent write mode to gzopen() when 'T' is in the mode ++- Update python link in zlib man page ++- Get inffixed.h and MAKEFIXED result to match ++- Add a ./config --solo option to make zlib subset with no libary use ++- Add undocumented inflateResetKeep() function for CAB file decoding ++- Add --cover option to ./configure for gcc coverage testing ++- Add #define ZLIB_CONST option to use const in the z_stream interface ++- Add comment to gzdopen() in zlib.h to use dup() when using fileno() ++- Note behavior of uncompress() to provide as much data as it can ++- Add files in contrib/minizip to aid in building libminizip ++- Split off AR options in Makefile.in and configure ++- Change ON macro to Z_ARG to avoid application conflicts ++- Facilitate compilation with Borland C++ for pragmas and vsnprintf ++- Include io.h for Turbo C / Borland C++ ++- Move example.c and minigzip.c to test/ ++- Simplify incomplete code table filling in inflate_table() ++- Remove code from inflate.c and infback.c that is impossible to execute ++- Test the inflate code with full coverage ++- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw) ++- Add deflateResetKeep and fix inflateResetKeep to retain dictionary ++- Fix gzwrite.c to accommodate reduced memory zlib compilation ++- Have inflate() with Z_FINISH avoid the allocation of a window ++- Do not set strm->adler when doing raw inflate ++- Fix gzeof() to behave just like feof() when read is not past end of file ++- Fix bug in gzread.c when end-of-file is reached ++- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF ++- Document gzread() capability to read concurrently written files ++- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo] ++ ++Changes in 1.2.5.1 (10 Sep 2011) ++- Update FAQ entry on shared builds (#13) ++- Avoid symbolic argument to chmod in Makefile.in ++- Fix bug and add consts in contrib/puff [Oberhumer] ++- Update contrib/puff/zeros.raw test file to have all block types ++- Add full coverage test for puff in contrib/puff/Makefile ++- Fix static-only-build install in Makefile.in ++- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno] ++- Add libz.a dependency to shared in Makefile.in for parallel builds ++- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out ++- Replace $(...) with `...` in configure for non-bash sh [Bowler] ++- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen] ++- Add solaris* to Linux* in configure to allow gcc use [Groffen] ++- Add *bsd* to Linux* case in configure [Bar-Lev] ++- Add inffast.obj to dependencies in win32/Makefile.msc ++- Correct spelling error in deflate.h [Kohler] ++- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc ++- Add test to configure for GNU C looking for gcc in output of $cc -v ++- Add zlib.pc generation to win32/Makefile.gcc [Weigelt] ++- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not ++- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense ++- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser) ++- Make stronger test in zconf.h to include unistd.h for LFS ++- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack] ++- Fix zlib.h LFS support when Z_PREFIX used ++- Add updated as400 support (removed from old) [Monnerat] ++- Avoid deflate sensitivity to volatile input data ++- Avoid division in adler32_combine for NO_DIVIDE ++- Clarify the use of Z_FINISH with deflateBound() amount of space ++- Set binary for output file in puff.c ++- Use u4 type for crc_table to avoid conversion warnings ++- Apply casts in zlib.h to avoid conversion warnings ++- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller] ++- Improve inflateSync() documentation to note indeterminancy ++- Add deflatePending() function to return the amount of pending output ++- Correct the spelling of "specification" in FAQ [Randers-Pehrson] ++- Add a check in configure for stdarg.h, use for gzprintf() ++- Check that pointers fit in ints when gzprint() compiled old style ++- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler] ++- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt] ++- Add debug records in assmebler code [Londer] ++- Update RFC references to use http://tools.ietf.org/html/... [Li] ++- Add --archs option, use of libtool to configure for Mac OS X [Borstel] ++ ++Changes in 1.2.5 (19 Apr 2010) ++- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev] ++- Default to libdir as sharedlibdir in configure [Nieder] ++- Update copyright dates on modified source files ++- Update trees.c to be able to generate modified trees.h ++- Exit configure for MinGW, suggesting win32/Makefile.gcc ++- Check for NULL path in gz_open [Homurlu] ++ ++Changes in 1.2.4.5 (18 Apr 2010) ++- Set sharedlibdir in configure [Torok] ++- Set LDFLAGS in Makefile.in [Bar-Lev] ++- Avoid mkdir objs race condition in Makefile.in [Bowler] ++- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays ++- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C ++- Don't use hidden attribute when it is a warning generator (e.g. Solaris) ++ ++Changes in 1.2.4.4 (18 Apr 2010) ++- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok] ++- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty ++- Try to use bash or ksh regardless of functionality of /bin/sh ++- Fix configure incompatibility with NetBSD sh ++- Remove attempt to run under bash or ksh since have better NetBSD fix ++- Fix win32/Makefile.gcc for MinGW [Bar-Lev] ++- Add diagnostic messages when using CROSS_PREFIX in configure ++- Added --sharedlibdir option to configure [Weigelt] ++- Use hidden visibility attribute when available [Frysinger] ++ ++Changes in 1.2.4.3 (10 Apr 2010) ++- Only use CROSS_PREFIX in configure for ar and ranlib if they exist ++- Use CROSS_PREFIX for nm [Bar-Lev] ++- Assume _LARGEFILE64_SOURCE defined is equivalent to true ++- Avoid use of undefined symbols in #if with && and || ++- Make *64 prototypes in gzguts.h consistent with functions ++- Add -shared load option for MinGW in configure [Bowler] ++- Move z_off64_t to public interface, use instead of off64_t ++- Remove ! from shell test in configure (not portable to Solaris) ++- Change +0 macro tests to -0 for possibly increased portability ++ ++Changes in 1.2.4.2 (9 Apr 2010) ++- Add consistent carriage returns to readme.txt's in masmx86 and masmx64 ++- Really provide prototypes for *64 functions when building without LFS ++- Only define unlink() in minigzip.c if unistd.h not included ++- Update README to point to contrib/vstudio project files ++- Move projects/vc6 to old/ and remove projects/ ++- Include stdlib.h in minigzip.c for setmode() definition under WinCE ++- Clean up assembler builds in win32/Makefile.msc [Rowe] ++- Include sys/types.h for Microsoft for off_t definition ++- Fix memory leak on error in gz_open() ++- Symbolize nm as $NM in configure [Weigelt] ++- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt] ++- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined ++- Fix bug in gzeof() to take into account unused input data ++- Avoid initialization of structures with variables in puff.c ++- Updated win32/README-WIN32.txt [Rowe] ++ ++Changes in 1.2.4.1 (28 Mar 2010) ++- Remove the use of [a-z] constructs for sed in configure [gentoo 310225] ++- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech] ++- Restore "for debugging" comment on sprintf() in gzlib.c ++- Remove fdopen for MVS from gzguts.h ++- Put new README-WIN32.txt in win32 [Rowe] ++- Add check for shell to configure and invoke another shell if needed ++- Fix big fat stinking bug in gzseek() on uncompressed files ++- Remove vestigial F_OPEN64 define in zutil.h ++- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE ++- Avoid errors on non-LFS systems when applications define LFS macros ++- Set EXE to ".exe" in configure for MINGW [Kahle] ++- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill] ++- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev] ++- Add DLL install in win32/makefile.gcc [Bar-Lev] ++- Allow Linux* or linux* from uname in configure [Bar-Lev] ++- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev] ++- Add cross-compilation prefixes to configure [Bar-Lev] ++- Match type exactly in gz_load() invocation in gzread.c ++- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func ++- Provide prototypes for *64 functions when building zlib without LFS ++- Don't use -lc when linking shared library on MinGW ++- Remove errno.h check in configure and vestigial errno code in zutil.h ++ ++Changes in 1.2.4 (14 Mar 2010) ++- Fix VER3 extraction in configure for no fourth subversion ++- Update zlib.3, add docs to Makefile.in to make .pdf out of it ++- Add zlib.3.pdf to distribution ++- Don't set error code in gzerror() if passed pointer is NULL ++- Apply destination directory fixes to CMakeLists.txt [Lowman] ++- Move #cmakedefine's to a new zconf.in.cmakein ++- Restore zconf.h for builds that don't use configure or cmake ++- Add distclean to dummy Makefile for convenience ++- Update and improve INDEX, README, and FAQ ++- Update CMakeLists.txt for the return of zconf.h [Lowman] ++- Update contrib/vstudio/vc9 and vc10 [Vollant] ++- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc ++- Apply license and readme changes to contrib/asm686 [Raiter] ++- Check file name lengths and add -c option in minigzip.c [Li] ++- Update contrib/amd64 and contrib/masmx86/ [Vollant] ++- Avoid use of "eof" parameter in trees.c to not shadow library variable ++- Update make_vms.com for removal of zlibdefs.h [Zinser] ++- Update assembler code and vstudio projects in contrib [Vollant] ++- Remove outdated assembler code contrib/masm686 and contrib/asm586 ++- Remove old vc7 and vc8 from contrib/vstudio ++- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe] ++- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open() ++- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant] ++- Remove *64 functions from win32/zlib.def (they're not 64-bit yet) ++- Fix bug in void-returning vsprintf() case in gzwrite.c ++- Fix name change from inflate.h in contrib/inflate86/inffas86.c ++- Check if temporary file exists before removing in make_vms.com [Zinser] ++- Fix make install and uninstall for --static option ++- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta] ++- Update readme.txt in contrib/masmx64 and masmx86 to assemble ++ ++Changes in 1.2.3.9 (21 Feb 2010) ++- Expunge gzio.c ++- Move as400 build information to old ++- Fix updates in contrib/minizip and contrib/vstudio ++- Add const to vsnprintf test in configure to avoid warnings [Weigelt] ++- Delete zconf.h (made by configure) [Weigelt] ++- Change zconf.in.h to zconf.h.in per convention [Weigelt] ++- Check for NULL buf in gzgets() ++- Return empty string for gzgets() with len == 1 (like fgets()) ++- Fix description of gzgets() in zlib.h for end-of-file, NULL return ++- Update minizip to 1.1 [Vollant] ++- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c ++- Note in zlib.h that gzerror() should be used to distinguish from EOF ++- Remove use of snprintf() from gzlib.c ++- Fix bug in gzseek() ++- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant] ++- Fix zconf.h generation in CMakeLists.txt [Lowman] ++- Improve comments in zconf.h where modified by configure ++ ++Changes in 1.2.3.8 (13 Feb 2010) ++- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer] ++- Use z_off64_t in gz_zero() and gz_skip() to match state->skip ++- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t) ++- Revert to Makefile.in from 1.2.3.6 (live with the clutter) ++- Fix missing error return in gzflush(), add zlib.h note ++- Add *64 functions to zlib.map [Levin] ++- Fix signed/unsigned comparison in gz_comp() ++- Use SFLAGS when testing shared linking in configure ++- Add --64 option to ./configure to use -m64 with gcc ++- Fix ./configure --help to correctly name options ++- Have make fail if a test fails [Levin] ++- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson] ++- Remove assembler object files from contrib ++ ++Changes in 1.2.3.7 (24 Jan 2010) ++- Always gzopen() with O_LARGEFILE if available ++- Fix gzdirect() to work immediately after gzopen() or gzdopen() ++- Make gzdirect() more precise when the state changes while reading ++- Improve zlib.h documentation in many places ++- Catch memory allocation failure in gz_open() ++- Complete close operation if seek forward in gzclose_w() fails ++- Return Z_ERRNO from gzclose_r() if close() fails ++- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL ++- Return zero for gzwrite() errors to match zlib.h description ++- Return -1 on gzputs() error to match zlib.h description ++- Add zconf.in.h to allow recovery from configure modification [Weigelt] ++- Fix static library permissions in Makefile.in [Weigelt] ++- Avoid warnings in configure tests that hide functionality [Weigelt] ++- Add *BSD and DragonFly to Linux case in configure [gentoo 123571] ++- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212] ++- Avoid access of uninitialized data for first inflateReset2 call [Gomes] ++- Keep object files in subdirectories to reduce the clutter somewhat ++- Remove default Makefile and zlibdefs.h, add dummy Makefile ++- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_ ++- Remove zlibdefs.h completely -- modify zconf.h instead ++ ++Changes in 1.2.3.6 (17 Jan 2010) ++- Avoid void * arithmetic in gzread.c and gzwrite.c ++- Make compilers happier with const char * for gz_error message ++- Avoid unused parameter warning in inflate.c ++- Avoid signed-unsigned comparison warning in inflate.c ++- Indent #pragma's for traditional C ++- Fix usage of strwinerror() in glib.c, change to gz_strwinerror() ++- Correct email address in configure for system options ++- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser] ++- Update zlib.map [Brown] ++- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok] ++- Apply various fixes to CMakeLists.txt [Lowman] ++- Add checks on len in gzread() and gzwrite() ++- Add error message for no more room for gzungetc() ++- Remove zlib version check in gzwrite() ++- Defer compression of gzprintf() result until need to ++- Use snprintf() in gzdopen() if available ++- Remove USE_MMAP configuration determination (only used by minigzip) ++- Remove examples/pigz.c (available separately) ++- Update examples/gun.c to 1.6 ++ ++Changes in 1.2.3.5 (8 Jan 2010) ++- Add space after #if in zutil.h for some compilers ++- Fix relatively harmless bug in deflate_fast() [Exarevsky] ++- Fix same problem in deflate_slow() ++- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown] ++- Add deflate_rle() for faster Z_RLE strategy run-length encoding ++- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding ++- Change name of "write" variable in inffast.c to avoid library collisions ++- Fix premature EOF from gzread() in gzio.c [Brown] ++- Use zlib header window size if windowBits is 0 in inflateInit2() ++- Remove compressBound() call in deflate.c to avoid linking compress.o ++- Replace use of errno in gz* with functions, support WinCE [Alves] ++- Provide alternative to perror() in minigzip.c for WinCE [Alves] ++- Don't use _vsnprintf on later versions of MSVC [Lowman] ++- Add CMake build script and input file [Lowman] ++- Update contrib/minizip to 1.1 [Svensson, Vollant] ++- Moved nintendods directory from contrib to . ++- Replace gzio.c with a new set of routines with the same functionality ++- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above ++- Update contrib/minizip to 1.1b ++- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h ++ ++Changes in 1.2.3.4 (21 Dec 2009) ++- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility ++- Update comments in configure and Makefile.in for default --shared ++- Fix test -z's in configure [Marquess] ++- Build examplesh and minigzipsh when not testing ++- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h ++- Import LDFLAGS from the environment in configure ++- Fix configure to populate SFLAGS with discovered CFLAGS options ++- Adapt make_vms.com to the new Makefile.in [Zinser] ++- Add zlib2ansi script for C++ compilation [Marquess] ++- Add _FILE_OFFSET_BITS=64 test to make test (when applicable) ++- Add AMD64 assembler code for longest match to contrib [Teterin] ++- Include options from $SFLAGS when doing $LDSHARED ++- Simplify 64-bit file support by introducing z_off64_t type ++- Make shared object files in objs directory to work around old Sun cc ++- Use only three-part version number for Darwin shared compiles ++- Add rc option to ar in Makefile.in for when ./configure not run ++- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4* ++- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile ++- Protect against _FILE_OFFSET_BITS being defined when compiling zlib ++- Rename Makefile.in targets allstatic to static and allshared to shared ++- Fix static and shared Makefile.in targets to be independent ++- Correct error return bug in gz_open() by setting state [Brown] ++- Put spaces before ;;'s in configure for better sh compatibility ++- Add pigz.c (parallel implementation of gzip) to examples/ ++- Correct constant in crc32.c to UL [Leventhal] ++- Reject negative lengths in crc32_combine() ++- Add inflateReset2() function to work like inflateEnd()/inflateInit2() ++- Include sys/types.h for _LARGEFILE64_SOURCE [Brown] ++- Correct typo in doc/algorithm.txt [Janik] ++- Fix bug in adler32_combine() [Zhu] ++- Catch missing-end-of-block-code error in all inflates and in puff ++ Assures that random input to inflate eventually results in an error ++- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/ ++- Update ENOUGH and its usage to reflect discovered bounds ++- Fix gzerror() error report on empty input file [Brown] ++- Add ush casts in trees.c to avoid pedantic runtime errors ++- Fix typo in zlib.h uncompress() description [Reiss] ++- Correct inflate() comments with regard to automatic header detection ++- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays) ++- Put new version of gzlog (2.0) in examples with interruption recovery ++- Add puff compile option to permit invalid distance-too-far streams ++- Add puff TEST command options, ability to read piped input ++- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but ++ _LARGEFILE64_SOURCE not defined ++- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart ++- Fix deflateSetDictionary() to use all 32K for output consistency ++- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h) ++- Clear bytes after deflate lookahead to avoid use of uninitialized data ++- Change a limit in inftrees.c to be more transparent to Coverity Prevent ++- Update win32/zlib.def with exported symbols from zlib.h ++- Correct spelling errors in zlib.h [Willem, Sobrado] ++- Allow Z_BLOCK for deflate() to force a new block ++- Allow negative bits in inflatePrime() to delete existing bit buffer ++- Add Z_TREES flush option to inflate() to return at end of trees ++- Add inflateMark() to return current state information for random access ++- Add Makefile for NintendoDS to contrib [Costa] ++- Add -w in configure compile tests to avoid spurious warnings [Beucler] ++- Fix typos in zlib.h comments for deflateSetDictionary() ++- Fix EOF detection in transparent gzread() [Maier] ++ ++Changes in 1.2.3.3 (2 October 2006) ++- Make --shared the default for configure, add a --static option ++- Add compile option to permit invalid distance-too-far streams ++- Add inflateUndermine() function which is required to enable above ++- Remove use of "this" variable name for C++ compatibility [Marquess] ++- Add testing of shared library in make test, if shared library built ++- Use ftello() and fseeko() if available instead of ftell() and fseek() ++- Provide two versions of all functions that use the z_off_t type for ++ binary compatibility -- a normal version and a 64-bit offset version, ++ per the Large File Support Extension when _LARGEFILE64_SOURCE is ++ defined; use the 64-bit versions by default when _FILE_OFFSET_BITS ++ is defined to be 64 ++- Add a --uname= option to configure to perhaps help with cross-compiling ++ ++Changes in 1.2.3.2 (3 September 2006) ++- Turn off silly Borland warnings [Hay] ++- Use off64_t and define _LARGEFILE64_SOURCE when present ++- Fix missing dependency on inffixed.h in Makefile.in ++- Rig configure --shared to build both shared and static [Teredesai, Truta] ++- Remove zconf.in.h and instead create a new zlibdefs.h file ++- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant] ++- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt] ++ ++Changes in 1.2.3.1 (16 August 2006) ++- Add watcom directory with OpenWatcom make files [Daniel] ++- Remove #undef of FAR in zconf.in.h for MVS [Fedtke] ++- Update make_vms.com [Zinser] ++- Use -fPIC for shared build in configure [Teredesai, Nicholson] ++- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen] ++- Use fdopen() (not _fdopen()) for Interix in zutil.h [BŠck] ++- Add some FAQ entries about the contrib directory ++- Update the MVS question in the FAQ ++- Avoid extraneous reads after EOF in gzio.c [Brown] ++- Correct spelling of "successfully" in gzio.c [Randers-Pehrson] ++- Add comments to zlib.h about gzerror() usage [Brown] ++- Set extra flags in gzip header in gzopen() like deflate() does ++- Make configure options more compatible with double-dash conventions ++ [Weigelt] ++- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen] ++- Fix uninstall target in Makefile.in [Truta] ++- Add pkgconfig support [Weigelt] ++- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt] ++- Replace set_data_type() with a more accurate detect_data_type() in ++ trees.c, according to the txtvsbin.txt document [Truta] ++- Swap the order of #include <stdio.h> and #include "zlib.h" in ++ gzio.c, example.c and minigzip.c [Truta] ++- Shut up annoying VS2005 warnings about standard C deprecation [Rowe, ++ Truta] (where?) ++- Fix target "clean" from win32/Makefile.bor [Truta] ++- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe] ++- Update zlib www home address in win32/DLL_FAQ.txt [Truta] ++- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove] ++- Enable browse info in the "Debug" and "ASM Debug" configurations in ++ the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta] ++- Add pkgconfig support [Weigelt] ++- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h, ++ for use in win32/zlib1.rc [Polushin, Rowe, Truta] ++- Add a document that explains the new text detection scheme to ++ doc/txtvsbin.txt [Truta] ++- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta] ++- Move algorithm.txt into doc/ [Truta] ++- Synchronize FAQ with website ++- Fix compressBound(), was low for some pathological cases [Fearnley] ++- Take into account wrapper variations in deflateBound() ++- Set examples/zpipe.c input and output to binary mode for Windows ++- Update examples/zlib_how.html with new zpipe.c (also web site) ++- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems ++ that gcc became pickier in 4.0) ++- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain ++ un-versioned, the patch adds versioning only for symbols introduced in ++ zlib-1.2.0 or later. It also declares as local those symbols which are ++ not designed to be exported." [Levin] ++- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure ++- Do not initialize global static by default in trees.c, add a response ++ NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess] ++- Don't use strerror() in gzio.c under WinCE [Yakimov] ++- Don't use errno.h in zutil.h under WinCE [Yakimov] ++- Move arguments for AR to its usage to allow replacing ar [Marot] ++- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson] ++- Improve inflateInit() and inflateInit2() documentation ++- Fix structure size comment in inflate.h ++- Change configure help option from --h* to --help [Santos] ++ ++Changes in 1.2.3 (18 July 2005) ++- Apply security vulnerability fixes to contrib/infback9 as well ++- Clean up some text files (carriage returns, trailing space) ++- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] ++ ++Changes in 1.2.2.4 (11 July 2005) ++- Add inflatePrime() function for starting inflation at bit boundary ++- Avoid some Visual C warnings in deflate.c ++- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit ++ compile ++- Fix some spelling errors in comments [Betts] ++- Correct inflateInit2() error return documentation in zlib.h ++- Add zran.c example of compressed data random access to examples ++ directory, shows use of inflatePrime() ++- Fix cast for assignments to strm->state in inflate.c and infback.c ++- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] ++- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] ++- Add cast in trees.c t avoid a warning [Oberhumer] ++- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] ++- Update make_vms.com [Zinser] ++- Initialize state->write in inflateReset() since copied in inflate_fast() ++- Be more strict on incomplete code sets in inflate_table() and increase ++ ENOUGH and MAXD -- this repairs a possible security vulnerability for ++ invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for ++ discovering the vulnerability and providing test cases. ++- Add ia64 support to configure for HP-UX [Smith] ++- Add error return to gzread() for format or i/o error [Levin] ++- Use malloc.h for OS/2 [Necasek] ++ ++Changes in 1.2.2.3 (27 May 2005) ++- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile ++- Typecast fread() return values in gzio.c [Vollant] ++- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) ++- Fix crc check bug in gzread() after gzungetc() [Heiner] ++- Add the deflateTune() function to adjust internal compression parameters ++- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) ++- Remove an incorrect assertion in examples/zpipe.c ++- Add C++ wrapper in infback9.h [Donais] ++- Fix bug in inflateCopy() when decoding fixed codes ++- Note in zlib.h how much deflateSetDictionary() actually uses ++- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) ++- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] ++- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] ++- Add gzdirect() function to indicate transparent reads ++- Update contrib/minizip [Vollant] ++- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] ++- Add casts in crc32.c to avoid warnings [Oberhumer] ++- Add contrib/masmx64 [Vollant] ++- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] ++ ++Changes in 1.2.2.2 (30 December 2004) ++- Replace structure assignments in deflate.c and inflate.c with zmemcpy to ++ avoid implicit memcpy calls (portability for no-library compilation) ++- Increase sprintf() buffer size in gzdopen() to allow for large numbers ++- Add INFLATE_STRICT to check distances against zlib header ++- Improve WinCE errno handling and comments [Chang] ++- Remove comment about no gzip header processing in FAQ ++- Add Z_FIXED strategy option to deflateInit2() to force fixed trees ++- Add updated make_vms.com [Coghlan], update README ++- Create a new "examples" directory, move gzappend.c there, add zpipe.c, ++ fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. ++- Add FAQ entry and comments in deflate.c on uninitialized memory access ++- Add Solaris 9 make options in configure [Gilbert] ++- Allow strerror() usage in gzio.c for STDC ++- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] ++- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] ++- Use z_off_t for adler32_combine() and crc32_combine() lengths ++- Make adler32() much faster for small len ++- Use OS_CODE in deflate() default gzip header ++ ++Changes in 1.2.2.1 (31 October 2004) ++- Allow inflateSetDictionary() call for raw inflate ++- Fix inflate header crc check bug for file names and comments ++- Add deflateSetHeader() and gz_header structure for custom gzip headers ++- Add inflateGetheader() to retrieve gzip headers ++- Add crc32_combine() and adler32_combine() functions ++- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list ++- Use zstreamp consistently in zlib.h (inflate_back functions) ++- Remove GUNZIP condition from definition of inflate_mode in inflate.h ++ and in contrib/inflate86/inffast.S [Truta, Anderson] ++- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] ++- Update projects/README.projects and projects/visualc6 [Truta] ++- Update win32/DLL_FAQ.txt [Truta] ++- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] ++- Deprecate Z_ASCII; use Z_TEXT instead [Truta] ++- Use a new algorithm for setting strm->data_type in trees.c [Truta] ++- Do not define an exit() prototype in zutil.c unless DEBUG defined ++- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] ++- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() ++- Fix Darwin build version identification [Peterson] ++ ++Changes in 1.2.2 (3 October 2004) ++- Update zlib.h comments on gzip in-memory processing ++- Set adler to 1 in inflateReset() to support Java test suite [Walles] ++- Add contrib/dotzlib [Ravn] ++- Update win32/DLL_FAQ.txt [Truta] ++- Update contrib/minizip [Vollant] ++- Move contrib/visual-basic.txt to old/ [Truta] ++- Fix assembler builds in projects/visualc6/ [Truta] ++ ++Changes in 1.2.1.2 (9 September 2004) ++- Update INDEX file ++- Fix trees.c to update strm->data_type (no one ever noticed!) ++- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] ++- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) ++- Add limited multitasking protection to DYNAMIC_CRC_TABLE ++- Add NO_vsnprintf for VMS in zutil.h [Mozilla] ++- Don't declare strerror() under VMS [Mozilla] ++- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize ++- Update contrib/ada [Anisimkov] ++- Update contrib/minizip [Vollant] ++- Fix configure to not hardcode directories for Darwin [Peterson] ++- Fix gzio.c to not return error on empty files [Brown] ++- Fix indentation; update version in contrib/delphi/ZLib.pas and ++ contrib/pascal/zlibpas.pas [Truta] ++- Update mkasm.bat in contrib/masmx86 [Truta] ++- Update contrib/untgz [Truta] ++- Add projects/README.projects [Truta] ++- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] ++- Update win32/DLL_FAQ.txt [Truta] ++- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] ++- Remove an unnecessary assignment to curr in inftrees.c [Truta] ++- Add OS/2 to exe builds in configure [Poltorak] ++- Remove err dummy parameter in zlib.h [Kientzle] ++ ++Changes in 1.2.1.1 (9 January 2004) ++- Update email address in README ++- Several FAQ updates ++- Fix a big fat bug in inftrees.c that prevented decoding valid ++ dynamic blocks with only literals and no distance codes -- ++ Thanks to "Hot Emu" for the bug report and sample file ++- Add a note to puff.c on no distance codes case. ++ ++Changes in 1.2.1 (17 November 2003) ++- Remove a tab in contrib/gzappend/gzappend.c ++- Update some interfaces in contrib for new zlib functions ++- Update zlib version number in some contrib entries ++- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] ++- Support shared libraries on Hurd and KFreeBSD [Brown] ++- Fix error in NO_DIVIDE option of adler32.c ++ ++Changes in 1.2.0.8 (4 November 2003) ++- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas ++- Add experimental NO_DIVIDE #define in adler32.c ++ - Possibly faster on some processors (let me know if it is) ++- Correct Z_BLOCK to not return on first inflate call if no wrap ++- Fix strm->data_type on inflate() return to correctly indicate EOB ++- Add deflatePrime() function for appending in the middle of a byte ++- Add contrib/gzappend for an example of appending to a stream ++- Update win32/DLL_FAQ.txt [Truta] ++- Delete Turbo C comment in README [Truta] ++- Improve some indentation in zconf.h [Truta] ++- Fix infinite loop on bad input in configure script [Church] ++- Fix gzeof() for concatenated gzip files [Johnson] ++- Add example to contrib/visual-basic.txt [Michael B.] ++- Add -p to mkdir's in Makefile.in [vda] ++- Fix configure to properly detect presence or lack of printf functions ++- Add AS400 support [Monnerat] ++- Add a little Cygwin support [Wilson] ++ ++Changes in 1.2.0.7 (21 September 2003) ++- Correct some debug formats in contrib/infback9 ++- Cast a type in a debug statement in trees.c ++- Change search and replace delimiter in configure from % to # [Beebe] ++- Update contrib/untgz to 0.2 with various fixes [Truta] ++- Add build support for Amiga [Nikl] ++- Remove some directories in old that have been updated to 1.2 ++- Add dylib building for Mac OS X in configure and Makefile.in ++- Remove old distribution stuff from Makefile ++- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X ++- Update links in README ++ ++Changes in 1.2.0.6 (13 September 2003) ++- Minor FAQ updates ++- Update contrib/minizip to 1.00 [Vollant] ++- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] ++- Update POSTINC comment for 68060 [Nikl] ++- Add contrib/infback9 with deflate64 decoding (unsupported) ++- For MVS define NO_vsnprintf and undefine FAR [van Burik] ++- Add pragma for fdopen on MVS [van Burik] ++ ++Changes in 1.2.0.5 (8 September 2003) ++- Add OF to inflateBackEnd() declaration in zlib.h ++- Remember start when using gzdopen in the middle of a file ++- Use internal off_t counters in gz* functions to properly handle seeks ++- Perform more rigorous check for distance-too-far in inffast.c ++- Add Z_BLOCK flush option to return from inflate at block boundary ++- Set strm->data_type on return from inflate ++ - Indicate bits unused, if at block boundary, and if in last block ++- Replace size_t with ptrdiff_t in crc32.c, and check for correct size ++- Add condition so old NO_DEFLATE define still works for compatibility ++- FAQ update regarding the Windows DLL [Truta] ++- INDEX update: add qnx entry, remove aix entry [Truta] ++- Install zlib.3 into mandir [Wilson] ++- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] ++- Adapt the zlib interface to the new DLL convention guidelines [Truta] ++- Introduce ZLIB_WINAPI macro to allow the export of functions using ++ the WINAPI calling convention, for Visual Basic [Vollant, Truta] ++- Update msdos and win32 scripts and makefiles [Truta] ++- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] ++- Add contrib/ada [Anisimkov] ++- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] ++- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] ++- Add contrib/masm686 [Truta] ++- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm ++ [Truta, Vollant] ++- Update contrib/delphi; rename to contrib/pascal; add example [Truta] ++- Remove contrib/delphi2; add a new contrib/delphi [Truta] ++- Avoid inclusion of the nonstandard <memory.h> in contrib/iostream, ++ and fix some method prototypes [Truta] ++- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip ++ [Truta] ++- Avoid the use of backslash (\) in contrib/minizip [Vollant] ++- Fix file time handling in contrib/untgz; update makefiles [Truta] ++- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines ++ [Vollant] ++- Remove contrib/vstudio/vc15_16 [Vollant] ++- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] ++- Update README.contrib [Truta] ++- Invert the assignment order of match_head and s->prev[...] in ++ INSERT_STRING [Truta] ++- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings ++ [Truta] ++- Compare function pointers with 0, not with NULL or Z_NULL [Truta] ++- Fix prototype of syncsearch in inflate.c [Truta] ++- Introduce ASMINF macro to be enabled when using an ASM implementation ++ of inflate_fast [Truta] ++- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] ++- Modify test_gzio in example.c to take a single file name as a ++ parameter [Truta] ++- Exit the example.c program if gzopen fails [Truta] ++- Add type casts around strlen in example.c [Truta] ++- Remove casting to sizeof in minigzip.c; give a proper type ++ to the variable compared with SUFFIX_LEN [Truta] ++- Update definitions of STDC and STDC99 in zconf.h [Truta] ++- Synchronize zconf.h with the new Windows DLL interface [Truta] ++- Use SYS16BIT instead of __32BIT__ to distinguish between ++ 16- and 32-bit platforms [Truta] ++- Use far memory allocators in small 16-bit memory models for ++ Turbo C [Truta] ++- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in ++ zlibCompileFlags [Truta] ++- Cygwin has vsnprintf [Wilson] ++- In Windows16, OS_CODE is 0, as in MSDOS [Truta] ++- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] ++ ++Changes in 1.2.0.4 (10 August 2003) ++- Minor FAQ updates ++- Be more strict when checking inflateInit2's windowBits parameter ++- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well ++- Add gzip wrapper option to deflateInit2 using windowBits ++- Add updated QNX rule in configure and qnx directory [Bonnefoy] ++- Make inflate distance-too-far checks more rigorous ++- Clean up FAR usage in inflate ++- Add casting to sizeof() in gzio.c and minigzip.c ++ ++Changes in 1.2.0.3 (19 July 2003) ++- Fix silly error in gzungetc() implementation [Vollant] ++- Update contrib/minizip and contrib/vstudio [Vollant] ++- Fix printf format in example.c ++- Correct cdecl support in zconf.in.h [Anisimkov] ++- Minor FAQ updates ++ ++Changes in 1.2.0.2 (13 July 2003) ++- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons ++- Attempt to avoid warnings in crc32.c for pointer-int conversion ++- Add AIX to configure, remove aix directory [Bakker] ++- Add some casts to minigzip.c ++- Improve checking after insecure sprintf() or vsprintf() calls ++- Remove #elif's from crc32.c ++- Change leave label to inf_leave in inflate.c and infback.c to avoid ++ library conflicts ++- Remove inflate gzip decoding by default--only enable gzip decoding by ++ special request for stricter backward compatibility ++- Add zlibCompileFlags() function to return compilation information ++- More typecasting in deflate.c to avoid warnings ++- Remove leading underscore from _Capital #defines [Truta] ++- Fix configure to link shared library when testing ++- Add some Windows CE target adjustments [Mai] ++- Remove #define ZLIB_DLL in zconf.h [Vollant] ++- Add zlib.3 [Rodgers] ++- Update RFC URL in deflate.c and algorithm.txt [Mai] ++- Add zlib_dll_FAQ.txt to contrib [Truta] ++- Add UL to some constants [Truta] ++- Update minizip and vstudio [Vollant] ++- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h ++- Expand use of NO_DUMMY_DECL to avoid all dummy structures ++- Added iostream3 to contrib [Schwardt] ++- Replace rewind() with fseek() for WinCE [Truta] ++- Improve setting of zlib format compression level flags ++ - Report 0 for huffman and rle strategies and for level == 0 or 1 ++ - Report 2 only for level == 6 ++- Only deal with 64K limit when necessary at compile time [Truta] ++- Allow TOO_FAR check to be turned off at compile time [Truta] ++- Add gzclearerr() function [Souza] ++- Add gzungetc() function ++ ++Changes in 1.2.0.1 (17 March 2003) ++- Add Z_RLE strategy for run-length encoding [Truta] ++ - When Z_RLE requested, restrict matches to distance one ++ - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE ++- Correct FASTEST compilation to allow level == 0 ++- Clean up what gets compiled for FASTEST ++- Incorporate changes to zconf.in.h [Vollant] ++ - Refine detection of Turbo C need for dummy returns ++ - Refine ZLIB_DLL compilation ++ - Include additional header file on VMS for off_t typedef ++- Try to use _vsnprintf where it supplants vsprintf [Vollant] ++- Add some casts in inffast.c ++- Enchance comments in zlib.h on what happens if gzprintf() tries to ++ write more than 4095 bytes before compression ++- Remove unused state from inflateBackEnd() ++- Remove exit(0) from minigzip.c, example.c ++- Get rid of all those darn tabs ++- Add "check" target to Makefile.in that does the same thing as "test" ++- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in ++- Update contrib/inflate86 [Anderson] ++- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] ++- Add msdos and win32 directories with makefiles [Truta] ++- More additions and improvements to the FAQ ++ ++Changes in 1.2.0 (9 March 2003) ++- New and improved inflate code ++ - About 20% faster ++ - Does not allocate 32K window unless and until needed ++ - Automatically detects and decompresses gzip streams ++ - Raw inflate no longer needs an extra dummy byte at end ++ - Added inflateBack functions using a callback interface--even faster ++ than inflate, useful for file utilities (gzip, zip) ++ - Added inflateCopy() function to record state for random access on ++ externally generated deflate streams (e.g. in gzip files) ++ - More readable code (I hope) ++- New and improved crc32() ++ - About 50% faster, thanks to suggestions from Rodney Brown ++- Add deflateBound() and compressBound() functions ++- Fix memory leak in deflateInit2() ++- Permit setting dictionary for raw deflate (for parallel deflate) ++- Fix const declaration for gzwrite() ++- Check for some malloc() failures in gzio.c ++- Fix bug in gzopen() on single-byte file 0x1f ++- Fix bug in gzread() on concatenated file with 0x1f at end of buffer ++ and next buffer doesn't start with 0x8b ++- Fix uncompress() to return Z_DATA_ERROR on truncated input ++- Free memory at end of example.c ++- Remove MAX #define in trees.c (conflicted with some libraries) ++- Fix static const's in deflate.c, gzio.c, and zutil.[ch] ++- Declare malloc() and free() in gzio.c if STDC not defined ++- Use malloc() instead of calloc() in zutil.c if int big enough ++- Define STDC for AIX ++- Add aix/ with approach for compiling shared library on AIX ++- Add HP-UX support for shared libraries in configure ++- Add OpenUNIX support for shared libraries in configure ++- Use $cc instead of gcc to build shared library ++- Make prefix directory if needed when installing ++- Correct Macintosh avoidance of typedef Byte in zconf.h ++- Correct Turbo C memory allocation when under Linux ++- Use libz.a instead of -lz in Makefile (assure use of compiled library) ++- Update configure to check for snprintf or vsnprintf functions and their ++ return value, warn during make if using an insecure function ++- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that ++ is lost when library is used--resolution is to build new zconf.h ++- Documentation improvements (in zlib.h): ++ - Document raw deflate and inflate ++ - Update RFCs URL ++ - Point out that zlib and gzip formats are different ++ - Note that Z_BUF_ERROR is not fatal ++ - Document string limit for gzprintf() and possible buffer overflow ++ - Note requirement on avail_out when flushing ++ - Note permitted values of flush parameter of inflate() ++- Add some FAQs (and even answers) to the FAQ ++- Add contrib/inflate86/ for x86 faster inflate ++- Add contrib/blast/ for PKWare Data Compression Library decompression ++- Add contrib/puff/ simple inflate for deflate format description ++ ++Changes in 1.1.4 (11 March 2002) ++- ZFREE was repeated on same allocation on some error conditions. ++ This creates a security problem described in ++ http://www.zlib.org/advisory-2002-03-11.txt ++- Returned incorrect error (Z_MEM_ERROR) on some invalid data ++- Avoid accesses before window for invalid distances with inflate window ++ less than 32K. ++- force windowBits > 8 to avoid a bug in the encoder for a window size ++ of 256 bytes. (A complete fix will be available in 1.1.5). ++ ++Changes in 1.1.3 (9 July 1998) ++- fix "an inflate input buffer bug that shows up on rare but persistent ++ occasions" (Mark) ++- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) ++- fix gzseek(..., SEEK_SET) in write mode ++- fix crc check after a gzeek (Frank Faubert) ++- fix miniunzip when the last entry in a zip file is itself a zip file ++ (J Lillge) ++- add contrib/asm586 and contrib/asm686 (Brian Raiter) ++ See http://www.muppetlabs.com/~breadbox/software/assembly.html ++- add support for Delphi 3 in contrib/delphi (Bob Dellaca) ++- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) ++- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) ++- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) ++- added a FAQ file ++ ++- Support gzdopen on Mac with Metrowerks (Jason Linhart) ++- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) ++- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) ++- avoid some warnings with Borland C (Tom Tanner) ++- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) ++- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) ++- allow several arguments to configure (Tim Mooney, Frodo Looijaard) ++- use libdir and includedir in Makefile.in (Tim Mooney) ++- support shared libraries on OSF1 V4 (Tim Mooney) ++- remove so_locations in "make clean" (Tim Mooney) ++- fix maketree.c compilation error (Glenn, Mark) ++- Python interface to zlib now in Python 1.5 (Jeremy Hylton) ++- new Makefile.riscos (Rich Walker) ++- initialize static descriptors in trees.c for embedded targets (Nick Smith) ++- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) ++- add the OS/2 files in Makefile.in too (Andrew Zabolotny) ++- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) ++- fix maketree.c to allow clean compilation of inffixed.h (Mark) ++- fix parameter check in deflateCopy (Gunther Nikl) ++- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) ++- Many portability patches by Christian Spieler: ++ . zutil.c, zutil.h: added "const" for zmem* ++ . Make_vms.com: fixed some typos ++ . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists ++ . msdos/Makefile.msc: remove "default rtl link library" info from obj files ++ . msdos/Makefile.*: use model-dependent name for the built zlib library ++ . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: ++ new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) ++- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) ++- replace __far with _far for better portability (Christian Spieler, Tom Lane) ++- fix test for errno.h in configure (Tim Newsham) ++ ++Changes in 1.1.2 (19 March 98) ++- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) ++ See http://www.winimage.com/zLibDll/unzip.html ++- preinitialize the inflate tables for fixed codes, to make the code ++ completely thread safe (Mark) ++- some simplifications and slight speed-up to the inflate code (Mark) ++- fix gzeof on non-compressed files (Allan Schrum) ++- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) ++- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) ++- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) ++- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) ++- do not wrap extern "C" around system includes (Tom Lane) ++- mention zlib binding for TCL in README (Andreas Kupries) ++- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) ++- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) ++- allow "configure --prefix $HOME" (Tim Mooney) ++- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) ++- move Makefile.sas to amiga/Makefile.sas ++ ++Changes in 1.1.1 (27 Feb 98) ++- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) ++- remove block truncation heuristic which had very marginal effect for zlib ++ (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the ++ compression ratio on some files. This also allows inlining _tr_tally for ++ matches in deflate_slow. ++- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) ++ ++Changes in 1.1.0 (24 Feb 98) ++- do not return STREAM_END prematurely in inflate (John Bowler) ++- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) ++- compile with -DFASTEST to get compression code optimized for speed only ++- in minigzip, try mmap'ing the input file first (Miguel Albrecht) ++- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain ++ on Sun but significant on HP) ++ ++- add a pointer to experimental unzip library in README (Gilles Vollant) ++- initialize variable gcc in configure (Chris Herborth) ++ ++Changes in 1.0.9 (17 Feb 1998) ++- added gzputs and gzgets functions ++- do not clear eof flag in gzseek (Mark Diekhans) ++- fix gzseek for files in transparent mode (Mark Diekhans) ++- do not assume that vsprintf returns the number of bytes written (Jens Krinke) ++- replace EXPORT with ZEXPORT to avoid conflict with other programs ++- added compress2 in zconf.h, zlib.def, zlib.dnt ++- new asm code from Gilles Vollant in contrib/asm386 ++- simplify the inflate code (Mark): ++ . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() ++ . ZALLOC the length list in inflate_trees_fixed() instead of using stack ++ . ZALLOC the value area for huft_build() instead of using stack ++ . Simplify Z_FINISH check in inflate() ++ ++- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 ++- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) ++- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with ++ the declaration of FAR (Gilles VOllant) ++- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) ++- read_buf buf parameter of type Bytef* instead of charf* ++- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) ++- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) ++- fix check for presence of directories in "make install" (Ian Willis) ++ ++Changes in 1.0.8 (27 Jan 1998) ++- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) ++- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) ++- added compress2() to allow setting the compression level ++- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) ++- use constant arrays for the static trees in trees.c instead of computing ++ them at run time (thanks to Ken Raeburn for this suggestion). To create ++ trees.h, compile with GEN_TREES_H and run "make test". ++- check return code of example in "make test" and display result ++- pass minigzip command line options to file_compress ++- simplifying code of inflateSync to avoid gcc 2.8 bug ++ ++- support CC="gcc -Wall" in configure -s (QingLong) ++- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) ++- fix test for shared library support to avoid compiler warnings ++- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) ++- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) ++- do not use fdopen for Metrowerks on Mac (Brad Pettit)) ++- add checks for gzputc and gzputc in example.c ++- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) ++- use const for the CRC table (Ken Raeburn) ++- fixed "make uninstall" for shared libraries ++- use Tracev instead of Trace in infblock.c ++- in example.c use correct compressed length for test_sync ++- suppress +vnocompatwarnings in configure for HPUX (not always supported) ++ ++Changes in 1.0.7 (20 Jan 1998) ++- fix gzseek which was broken in write mode ++- return error for gzseek to negative absolute position ++- fix configure for Linux (Chun-Chung Chen) ++- increase stack space for MSC (Tim Wegner) ++- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) ++- define EXPORTVA for gzprintf (Gilles Vollant) ++- added man page zlib.3 (Rick Rodgers) ++- for contrib/untgz, fix makedir() and improve Makefile ++ ++- check gzseek in write mode in example.c ++- allocate extra buffer for seeks only if gzseek is actually called ++- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) ++- add inflateSyncPoint in zconf.h ++- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def ++ ++Changes in 1.0.6 (19 Jan 1998) ++- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and ++ gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) ++- Fix a deflate bug occurring only with compression level 0 (thanks to ++ Andy Buckler for finding this one). ++- In minigzip, pass transparently also the first byte for .Z files. ++- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() ++- check Z_FINISH in inflate (thanks to Marc Schluper) ++- Implement deflateCopy (thanks to Adam Costello) ++- make static libraries by default in configure, add --shared option. ++- move MSDOS or Windows specific files to directory msdos ++- suppress the notion of partial flush to simplify the interface ++ (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) ++- suppress history buffer provided by application to simplify the interface ++ (this feature was not implemented anyway in 1.0.4) ++- next_in and avail_in must be initialized before calling inflateInit or ++ inflateInit2 ++- add EXPORT in all exported functions (for Windows DLL) ++- added Makefile.nt (thanks to Stephen Williams) ++- added the unsupported "contrib" directory: ++ contrib/asm386/ by Gilles Vollant <info@winimage.com> ++ 386 asm code replacing longest_match(). ++ contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu> ++ A C++ I/O streams interface to the zlib gz* functions ++ contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no> ++ Another C++ I/O streams interface ++ contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es> ++ A very simple tar.gz file extractor using zlib ++ contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl> ++ How to use compress(), uncompress() and the gz* functions from VB. ++- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression ++ level) in minigzip (thanks to Tom Lane) ++ ++- use const for rommable constants in deflate ++- added test for gzseek and gztell in example.c ++- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) ++- add undocumented function zError to convert error code to string ++ (for Tim Smithers) ++- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. ++- Use default memcpy for Symantec MSDOS compiler. ++- Add EXPORT keyword for check_func (needed for Windows DLL) ++- add current directory to LD_LIBRARY_PATH for "make test" ++- create also a link for libz.so.1 ++- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) ++- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) ++- added -soname for Linux in configure (Chun-Chung Chen, ++- assign numbers to the exported functions in zlib.def (for Windows DLL) ++- add advice in zlib.h for best usage of deflateSetDictionary ++- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) ++- allow compilation with ANSI keywords only enabled for TurboC in large model ++- avoid "versionString"[0] (Borland bug) ++- add NEED_DUMMY_RETURN for Borland ++- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). ++- allow compilation with CC ++- defined STDC for OS/2 (David Charlap) ++- limit external names to 8 chars for MVS (Thomas Lund) ++- in minigzip.c, use static buffers only for 16-bit systems ++- fix suffix check for "minigzip -d foo.gz" ++- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) ++- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) ++- added makelcc.bat for lcc-win32 (Tom St Denis) ++- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) ++- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. ++- check for unistd.h in configure (for off_t) ++- remove useless check parameter in inflate_blocks_free ++- avoid useless assignment of s->check to itself in inflate_blocks_new ++- do not flush twice in gzclose (thanks to Ken Raeburn) ++- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h ++- use NO_ERRNO_H instead of enumeration of operating systems with errno.h ++- work around buggy fclose on pipes for HP/UX ++- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) ++- fix configure if CC is already equal to gcc ++ ++Changes in 1.0.5 (3 Jan 98) ++- Fix inflate to terminate gracefully when fed corrupted or invalid data ++- Use const for rommable constants in inflate ++- Eliminate memory leaks on error conditions in inflate ++- Removed some vestigial code in inflate ++- Update web address in README ++ ++Changes in 1.0.4 (24 Jul 96) ++- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF ++ bit, so the decompressor could decompress all the correct data but went ++ on to attempt decompressing extra garbage data. This affected minigzip too. ++- zlibVersion and gzerror return const char* (needed for DLL) ++- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) ++- use z_error only for DEBUG (avoid problem with DLLs) ++ ++Changes in 1.0.3 (2 Jul 96) ++- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS ++ small and medium models; this makes the library incompatible with previous ++ versions for these models. (No effect in large model or on other systems.) ++- return OK instead of BUF_ERROR if previous deflate call returned with ++ avail_out as zero but there is nothing to do ++- added memcmp for non STDC compilers ++- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) ++- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) ++- better check for 16-bit mode MSC (avoids problem with Symantec) ++ ++Changes in 1.0.2 (23 May 96) ++- added Windows DLL support ++- added a function zlibVersion (for the DLL support) ++- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) ++- Bytef is define's instead of typedef'd only for Borland C ++- avoid reading uninitialized memory in example.c ++- mention in README that the zlib format is now RFC1950 ++- updated Makefile.dj2 ++- added algorithm.doc ++ ++Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] ++- fix array overlay in deflate.c which sometimes caused bad compressed data ++- fix inflate bug with empty stored block ++- fix MSDOS medium model which was broken in 0.99 ++- fix deflateParams() which could generated bad compressed data. ++- Bytef is define'd instead of typedef'ed (work around Borland bug) ++- added an INDEX file ++- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), ++ Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) ++- speed up adler32 for modern machines without auto-increment ++- added -ansi for IRIX in configure ++- static_init_done in trees.c is an int ++- define unlink as delete for VMS ++- fix configure for QNX ++- add configure branch for SCO and HPUX ++- avoid many warnings (unused variables, dead assignments, etc...) ++- no fdopen for BeOS ++- fix the Watcom fix for 32 bit mode (define FAR as empty) ++- removed redefinition of Byte for MKWERKS ++- work around an MWKERKS bug (incorrect merge of all .h files) ++ ++Changes in 0.99 (27 Jan 96) ++- allow preset dictionary shared between compressor and decompressor ++- allow compression level 0 (no compression) ++- add deflateParams in zlib.h: allow dynamic change of compression level ++ and compression strategy. ++- test large buffers and deflateParams in example.c ++- add optional "configure" to build zlib as a shared library ++- suppress Makefile.qnx, use configure instead ++- fixed deflate for 64-bit systems (detected on Cray) ++- fixed inflate_blocks for 64-bit systems (detected on Alpha) ++- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) ++- always return Z_BUF_ERROR when deflate() has nothing to do ++- deflateInit and inflateInit are now macros to allow version checking ++- prefix all global functions and types with z_ with -DZ_PREFIX ++- make falloc completely reentrant (inftrees.c) ++- fixed very unlikely race condition in ct_static_init ++- free in reverse order of allocation to help memory manager ++- use zlib-1.0/* instead of zlib/* inside the tar.gz ++- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith ++ -Wconversion -Wstrict-prototypes -Wmissing-prototypes" ++- allow gzread on concatenated .gz files ++- deflateEnd now returns Z_DATA_ERROR if it was premature ++- deflate is finally (?) fully deterministic (no matches beyond end of input) ++- Document Z_SYNC_FLUSH ++- add uninstall in Makefile ++- Check for __cpluplus in zlib.h ++- Better test in ct_align for partial flush ++- avoid harmless warnings for Borland C++ ++- initialize hash_head in deflate.c ++- avoid warning on fdopen (gzio.c) for HP cc -Aa ++- include stdlib.h for STDC compilers ++- include errno.h for Cray ++- ignore error if ranlib doesn't exist ++- call ranlib twice for NeXTSTEP ++- use exec_prefix instead of prefix for libz.a ++- renamed ct_* as _tr_* to avoid conflict with applications ++- clear z->msg in inflateInit2 before any error return ++- initialize opaque in example.c, gzio.c, deflate.c and inflate.c ++- fixed typo in zconf.h (_GNUC__ => __GNUC__) ++- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) ++- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) ++- in fcalloc, normalize pointer if size > 65520 bytes ++- don't use special fcalloc for 32 bit Borland C++ ++- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... ++- use Z_BINARY instead of BINARY ++- document that gzclose after gzdopen will close the file ++- allow "a" as mode in gzopen. ++- fix error checking in gzread ++- allow skipping .gz extra-field on pipes ++- added reference to Perl interface in README ++- put the crc table in FAR data (I dislike more and more the medium model :) ++- added get_crc_table ++- added a dimension to all arrays (Borland C can't count). ++- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast ++- guard against multiple inclusion of *.h (for precompiled header on Mac) ++- Watcom C pretends to be Microsoft C small model even in 32 bit mode. ++- don't use unsized arrays to avoid silly warnings by Visual C++: ++ warning C4746: 'inflate_mask' : unsized array treated as '__far' ++ (what's wrong with far data in far model?). ++- define enum out of inflate_blocks_state to allow compilation with C++ ++ ++Changes in 0.95 (16 Aug 95) ++- fix MSDOS small and medium model (now easier to adapt to any compiler) ++- inlined send_bits ++- fix the final (:-) bug for deflate with flush (output was correct but ++ not completely flushed in rare occasions). ++- default window size is same for compression and decompression ++ (it's now sufficient to set MAX_WBITS in zconf.h). ++- voidp -> voidpf and voidnp -> voidp (for consistency with other ++ typedefs and because voidnp was not near in large model). ++ ++Changes in 0.94 (13 Aug 95) ++- support MSDOS medium model ++- fix deflate with flush (could sometimes generate bad output) ++- fix deflateReset (zlib header was incorrectly suppressed) ++- added support for VMS ++- allow a compression level in gzopen() ++- gzflush now calls fflush ++- For deflate with flush, flush even if no more input is provided. ++- rename libgz.a as libz.a ++- avoid complex expression in infcodes.c triggering Turbo C bug ++- work around a problem with gcc on Alpha (in INSERT_STRING) ++- don't use inline functions (problem with some gcc versions) ++- allow renaming of Byte, uInt, etc... with #define. ++- avoid warning about (unused) pointer before start of array in deflate.c ++- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c ++- avoid reserved word 'new' in trees.c ++ ++Changes in 0.93 (25 June 95) ++- temporarily disable inline functions ++- make deflate deterministic ++- give enough lookahead for PARTIAL_FLUSH ++- Set binary mode for stdin/stdout in minigzip.c for OS/2 ++- don't even use signed char in inflate (not portable enough) ++- fix inflate memory leak for segmented architectures ++ ++Changes in 0.92 (3 May 95) ++- don't assume that char is signed (problem on SGI) ++- Clear bit buffer when starting a stored block ++- no memcpy on Pyramid ++- suppressed inftest.c ++- optimized fill_window, put longest_match inline for gcc ++- optimized inflate on stored blocks. ++- untabify all sources to simplify patches ++ ++Changes in 0.91 (2 May 95) ++- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h ++- Document the memory requirements in zconf.h ++- added "make install" ++- fix sync search logic in inflateSync ++- deflate(Z_FULL_FLUSH) now works even if output buffer too short ++- after inflateSync, don't scare people with just "lo world" ++- added support for DJGPP ++ ++Changes in 0.9 (1 May 95) ++- don't assume that zalloc clears the allocated memory (the TurboC bug ++ was Mark's bug after all :) ++- let again gzread copy uncompressed data unchanged (was working in 0.71) ++- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented ++- added a test of inflateSync in example.c ++- moved MAX_WBITS to zconf.h because users might want to change that. ++- document explicitly that zalloc(64K) on MSDOS must return a normalized ++ pointer (zero offset) ++- added Makefiles for Microsoft C, Turbo C, Borland C++ ++- faster crc32() ++ ++Changes in 0.8 (29 April 95) ++- added fast inflate (inffast.c) ++- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this ++ is incompatible with previous versions of zlib which returned Z_OK. ++- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) ++ (actually that was not a compiler bug, see 0.81 above) ++- gzread no longer reads one extra byte in certain cases ++- In gzio destroy(), don't reference a freed structure ++- avoid many warnings for MSDOS ++- avoid the ERROR symbol which is used by MS Windows ++ ++Changes in 0.71 (14 April 95) ++- Fixed more MSDOS compilation problems :( There is still a bug with ++ TurboC large model. ++ ++Changes in 0.7 (14 April 95) ++- Added full inflate support. ++- Simplified the crc32() interface. The pre- and post-conditioning ++ (one's complement) is now done inside crc32(). WARNING: this is ++ incompatible with previous versions; see zlib.h for the new usage. ++ ++Changes in 0.61 (12 April 95) ++- workaround for a bug in TurboC. example and minigzip now work on MSDOS. ++ ++Changes in 0.6 (11 April 95) ++- added minigzip.c ++- added gzdopen to reopen a file descriptor as gzFile ++- added transparent reading of non-gziped files in gzread. ++- fixed bug in gzread (don't read crc as data) ++- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). ++- don't allocate big arrays in the stack (for MSDOS) ++- fix some MSDOS compilation problems ++ ++Changes in 0.5: ++- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but ++ not yet Z_FULL_FLUSH. ++- support decompression but only in a single step (forced Z_FINISH) ++- added opaque object for zalloc and zfree. ++- added deflateReset and inflateReset ++- added a variable zlib_version for consistency checking. ++- renamed the 'filter' parameter of deflateInit2 as 'strategy'. ++ Added Z_FILTERED and Z_HUFFMAN_ONLY constants. ++ ++Changes in 0.4: ++- avoid "zip" everywhere, use zlib instead of ziplib. ++- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush ++ if compression method == 8. ++- added adler32 and crc32 ++- renamed deflateOptions as deflateInit2, call one or the other but not both ++- added the method parameter for deflateInit2. ++- added inflateInit2 ++- simplied considerably deflateInit and inflateInit by not supporting ++ user-provided history buffer. This is supported only in deflateInit2 ++ and inflateInit2. ++ ++Changes in 0.3: ++- prefix all macro names with Z_ ++- use Z_FINISH instead of deflateEnd to finish compression. ++- added Z_HUFFMAN_ONLY ++- added gzerror() +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/README Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/README Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,115 @@ ++ZLIB DATA COMPRESSION LIBRARY ++ ++zlib 1.2.8 is a general purpose data compression library. All the code is ++thread safe. The data format used by the zlib library is described by RFCs ++(Request for Comments) 1950 to 1952 in the files ++http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and ++rfc1952 (gzip format). ++ ++All functions of the compression library are documented in the file zlib.h ++(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example ++of the library is given in the file test/example.c which also tests that ++the library is working correctly. Another example is given in the file ++test/minigzip.c. The compression library itself is composed of all source ++files in the root directory. ++ ++To compile all files and run the test program, follow the instructions given at ++the top of Makefile.in. In short "./configure; make test", and if that goes ++well, "make install" should work for most flavors of Unix. For Windows, use ++one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use ++make_vms.com. ++ ++Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant ++<info@winimage.com> for the Windows DLL version. The zlib home page is ++http://zlib.net/ . Before reporting a problem, please check this site to ++verify that you have the latest version of zlib; otherwise get the latest ++version and check whether the problem still exists or not. ++ ++PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. ++ ++Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997 ++issue of Dr. Dobb's Journal; a copy of the article is available at ++http://marknelson.us/1997/01/01/zlib-engine/ . ++ ++The changes made in version 1.2.8 are documented in the file ChangeLog. ++ ++Unsupported third party contributions are provided in directory contrib/ . ++ ++zlib is available in Java using the java.util.zip package, documented at ++http://java.sun.com/developer/technicalArticles/Programming/compression/ . ++ ++A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available ++at CPAN (Comprehensive Perl Archive Network) sites, including ++http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . ++ ++A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is ++available in Python 1.5 and later versions, see ++http://docs.python.org/library/zlib.html . ++ ++zlib is built into tcl: http://wiki.tcl.tk/4610 . ++ ++An experimental package to read and write files in .zip format, written on top ++of zlib by Gilles Vollant <info@winimage.com>, is available in the ++contrib/minizip directory of zlib. ++ ++ ++Notes for some targets: ++ ++- For Windows DLL versions, please see win32/DLL_FAQ.txt ++ ++- For 64-bit Irix, deflate.c must be compiled without any optimization. With ++ -O, one libpng test fails. The test works in 32 bit mode (with the -n32 ++ compiler flag). The compiler bug has been reported to SGI. ++ ++- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works ++ when compiled with cc. ++ ++- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is ++ necessary to get gzprintf working correctly. This is done by configure. ++ ++- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with ++ other compilers. Use "make test" to check your compiler. ++ ++- gzdopen is not supported on RISCOS or BEOS. ++ ++- For PalmOs, see http://palmzlib.sourceforge.net/ ++ ++ ++Acknowledgments: ++ ++ The deflate format used by zlib was defined by Phil Katz. The deflate and ++ zlib specifications were written by L. Peter Deutsch. Thanks to all the ++ people who reported problems and suggested various improvements in zlib; they ++ are too numerous to cite here. ++ ++Copyright notice: ++ ++ (C) 1995-2013 Jean-loup Gailly and Mark Adler ++ ++ This software is provided 'as-is', without any express or implied ++ warranty. In no event will the authors be held liable for any damages ++ arising from the use of this software. ++ ++ Permission is granted to anyone to use this software for any purpose, ++ including commercial applications, and to alter it and redistribute it ++ freely, subject to the following restrictions: ++ ++ 1. The origin of this software must not be misrepresented; you must not ++ claim that you wrote the original software. If you use this software ++ in a product, an acknowledgment in the product documentation would be ++ appreciated but is not required. ++ 2. Altered source versions must be plainly marked as such, and must not be ++ misrepresented as being the original software. ++ 3. This notice may not be removed or altered from any source distribution. ++ ++ Jean-loup Gailly Mark Adler ++ jloup@gzip.org madler@alumni.caltech.edu ++ ++If you use the zlib library in a product, we would appreciate *not* receiving ++lengthy legal documents to sign. The sources are provided for free but without ++warranty of any kind. The library has been entirely written by Jean-loup ++Gailly and Mark Adler; it does not include third-party code. ++ ++If you redistribute modified sources, we would appreciate that you include in ++the file ChangeLog history information documenting your changes. Please read ++the FAQ for more information on the distribution of modified source versions. +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/compress.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/compress.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,104 @@ ++/* ++ * 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. ++ */ ++ ++/* compress.c -- compress a memory buffer ++ * Copyright (C) 1995-2005 Jean-loup Gailly. ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* @(#) $Id$ */ ++ ++#define ZLIB_INTERNAL ++#include "zlib.h" ++ ++/* =========================================================================== ++ Compresses the source buffer into the destination buffer. The level ++ parameter has the same meaning as in deflateInit. sourceLen is the byte ++ length of the source buffer. Upon entry, destLen is the total size of the ++ destination buffer, which must be at least 0.1% larger than sourceLen plus ++ 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. ++ ++ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough ++ memory, Z_BUF_ERROR if there was not enough room in the output buffer, ++ Z_STREAM_ERROR if the level parameter is invalid. ++*/ ++int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) ++ Bytef *dest; ++ uLongf *destLen; ++ const Bytef *source; ++ uLong sourceLen; ++ int level; ++{ ++ z_stream stream; ++ int err; ++ ++ stream.next_in = (z_const Bytef *)source; ++ stream.avail_in = (uInt)sourceLen; ++#ifdef MAXSEG_64K ++ /* Check for source > 64K on 16-bit machine: */ ++ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; ++#endif ++ stream.next_out = dest; ++ stream.avail_out = (uInt)*destLen; ++ if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; ++ ++ stream.zalloc = (alloc_func)0; ++ stream.zfree = (free_func)0; ++ stream.opaque = (voidpf)0; ++ ++ err = deflateInit(&stream, level); ++ if (err != Z_OK) return err; ++ ++ err = deflate(&stream, Z_FINISH); ++ if (err != Z_STREAM_END) { ++ deflateEnd(&stream); ++ return err == Z_OK ? Z_BUF_ERROR : err; ++ } ++ *destLen = stream.total_out; ++ ++ err = deflateEnd(&stream); ++ return err; ++} ++ ++/* =========================================================================== ++ */ ++int ZEXPORT compress (dest, destLen, source, sourceLen) ++ Bytef *dest; ++ uLongf *destLen; ++ const Bytef *source; ++ uLong sourceLen; ++{ ++ return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); ++} ++ ++/* =========================================================================== ++ If the default memLevel or windowBits for deflateInit() is changed, then ++ this function needs to be updated. ++ */ ++uLong ZEXPORT compressBound (sourceLen) ++ uLong sourceLen; ++{ ++ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + ++ (sourceLen >> 25) + 13; ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/crc32.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/crc32.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,465 @@ ++/* ++ * 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. ++ */ ++ ++/* crc32.h -- tables for rapid CRC calculation ++ * Generated automatically by crc32.c ++ */ ++ ++local const z_crc_t FAR crc_table[TBLS][256] = ++{ ++ { ++ 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, ++ 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, ++ 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, ++ 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, ++ 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, ++ 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, ++ 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, ++ 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, ++ 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, ++ 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, ++ 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, ++ 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, ++ 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, ++ 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, ++ 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, ++ 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, ++ 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, ++ 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, ++ 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, ++ 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, ++ 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, ++ 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, ++ 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, ++ 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, ++ 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, ++ 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, ++ 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, ++ 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, ++ 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, ++ 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, ++ 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, ++ 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, ++ 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, ++ 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, ++ 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, ++ 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, ++ 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, ++ 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, ++ 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, ++ 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, ++ 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, ++ 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, ++ 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, ++ 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, ++ 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, ++ 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, ++ 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, ++ 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, ++ 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, ++ 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, ++ 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, ++ 0x2d02ef8dUL ++#ifdef BYFOUR ++ }, ++ { ++ 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, ++ 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, ++ 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, ++ 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, ++ 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, ++ 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, ++ 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, ++ 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, ++ 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, ++ 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, ++ 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, ++ 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, ++ 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, ++ 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, ++ 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, ++ 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, ++ 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, ++ 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, ++ 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, ++ 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, ++ 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, ++ 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, ++ 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, ++ 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, ++ 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, ++ 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, ++ 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, ++ 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, ++ 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, ++ 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, ++ 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, ++ 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, ++ 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, ++ 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, ++ 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, ++ 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, ++ 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, ++ 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, ++ 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, ++ 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, ++ 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, ++ 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, ++ 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, ++ 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, ++ 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, ++ 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, ++ 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, ++ 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, ++ 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, ++ 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, ++ 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, ++ 0x9324fd72UL ++ }, ++ { ++ 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, ++ 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, ++ 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, ++ 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, ++ 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, ++ 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, ++ 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, ++ 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, ++ 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, ++ 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, ++ 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, ++ 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, ++ 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, ++ 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, ++ 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, ++ 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, ++ 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, ++ 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, ++ 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, ++ 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, ++ 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, ++ 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, ++ 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, ++ 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, ++ 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, ++ 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, ++ 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, ++ 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, ++ 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, ++ 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, ++ 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, ++ 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, ++ 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, ++ 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, ++ 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, ++ 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, ++ 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, ++ 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, ++ 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, ++ 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, ++ 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, ++ 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, ++ 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, ++ 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, ++ 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, ++ 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, ++ 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, ++ 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, ++ 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, ++ 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, ++ 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, ++ 0xbe9834edUL ++ }, ++ { ++ 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, ++ 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, ++ 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, ++ 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, ++ 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, ++ 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, ++ 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, ++ 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, ++ 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, ++ 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, ++ 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, ++ 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, ++ 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, ++ 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, ++ 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, ++ 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, ++ 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, ++ 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, ++ 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, ++ 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, ++ 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, ++ 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, ++ 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, ++ 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, ++ 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, ++ 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, ++ 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, ++ 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, ++ 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, ++ 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, ++ 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, ++ 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, ++ 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, ++ 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, ++ 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, ++ 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, ++ 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, ++ 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, ++ 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, ++ 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, ++ 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, ++ 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, ++ 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, ++ 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, ++ 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, ++ 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, ++ 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, ++ 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, ++ 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, ++ 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, ++ 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, ++ 0xde0506f1UL ++ }, ++ { ++ 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, ++ 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, ++ 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, ++ 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, ++ 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, ++ 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, ++ 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, ++ 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, ++ 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, ++ 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, ++ 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, ++ 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, ++ 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, ++ 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, ++ 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, ++ 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, ++ 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, ++ 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, ++ 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, ++ 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, ++ 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, ++ 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, ++ 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, ++ 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, ++ 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, ++ 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, ++ 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, ++ 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, ++ 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, ++ 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, ++ 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, ++ 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, ++ 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, ++ 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, ++ 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, ++ 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, ++ 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, ++ 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, ++ 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, ++ 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, ++ 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, ++ 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, ++ 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, ++ 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, ++ 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, ++ 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, ++ 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, ++ 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, ++ 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, ++ 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, ++ 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, ++ 0x8def022dUL ++ }, ++ { ++ 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, ++ 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, ++ 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, ++ 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, ++ 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, ++ 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, ++ 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, ++ 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, ++ 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, ++ 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, ++ 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, ++ 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, ++ 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, ++ 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, ++ 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, ++ 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, ++ 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, ++ 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, ++ 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, ++ 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, ++ 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, ++ 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, ++ 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, ++ 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, ++ 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, ++ 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, ++ 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, ++ 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, ++ 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, ++ 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, ++ 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, ++ 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, ++ 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, ++ 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, ++ 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, ++ 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, ++ 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, ++ 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, ++ 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, ++ 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, ++ 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, ++ 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, ++ 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, ++ 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, ++ 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, ++ 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, ++ 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, ++ 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, ++ 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, ++ 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, ++ 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, ++ 0x72fd2493UL ++ }, ++ { ++ 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, ++ 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, ++ 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, ++ 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, ++ 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, ++ 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, ++ 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, ++ 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, ++ 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, ++ 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, ++ 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, ++ 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, ++ 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, ++ 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, ++ 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, ++ 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, ++ 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, ++ 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, ++ 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, ++ 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, ++ 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, ++ 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, ++ 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, ++ 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, ++ 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, ++ 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, ++ 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, ++ 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, ++ 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, ++ 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, ++ 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, ++ 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, ++ 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, ++ 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, ++ 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, ++ 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, ++ 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, ++ 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, ++ 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, ++ 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, ++ 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, ++ 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, ++ 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, ++ 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, ++ 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, ++ 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, ++ 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, ++ 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, ++ 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, ++ 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, ++ 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, ++ 0xed3498beUL ++ }, ++ { ++ 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, ++ 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, ++ 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, ++ 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, ++ 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, ++ 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, ++ 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, ++ 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, ++ 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, ++ 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, ++ 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, ++ 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, ++ 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, ++ 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, ++ 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, ++ 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, ++ 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, ++ 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, ++ 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, ++ 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, ++ 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, ++ 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, ++ 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, ++ 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, ++ 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, ++ 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, ++ 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, ++ 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, ++ 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, ++ 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, ++ 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, ++ 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, ++ 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, ++ 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, ++ 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, ++ 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, ++ 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, ++ 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, ++ 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, ++ 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, ++ 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, ++ 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, ++ 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, ++ 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, ++ 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, ++ 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, ++ 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, ++ 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, ++ 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, ++ 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, ++ 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, ++ 0xf10605deUL ++#endif ++ } ++}; +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/deflate.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/deflate.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,1991 @@ ++/* ++ * 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. ++ */ ++ ++/* deflate.c -- compress data using the deflation algorithm ++ * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* ++ * ALGORITHM ++ * ++ * The "deflation" process depends on being able to identify portions ++ * of the input text which are identical to earlier input (within a ++ * sliding window trailing behind the input currently being processed). ++ * ++ * The most straightforward technique turns out to be the fastest for ++ * most input files: try all possible matches and select the longest. ++ * The key feature of this algorithm is that insertions into the string ++ * dictionary are very simple and thus fast, and deletions are avoided ++ * completely. Insertions are performed at each input character, whereas ++ * string matches are performed only when the previous match ends. So it ++ * is preferable to spend more time in matches to allow very fast string ++ * insertions and avoid deletions. The matching algorithm for small ++ * strings is inspired from that of Rabin & Karp. A brute force approach ++ * is used to find longer strings when a small match has been found. ++ * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze ++ * (by Leonid Broukhis). ++ * A previous version of this file used a more sophisticated algorithm ++ * (by Fiala and Greene) which is guaranteed to run in linear amortized ++ * time, but has a larger average cost, uses more memory and is patented. ++ * However the F&G algorithm may be faster for some highly redundant ++ * files if the parameter max_chain_length (described below) is too large. ++ * ++ * ACKNOWLEDGEMENTS ++ * ++ * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and ++ * I found it in 'freeze' written by Leonid Broukhis. ++ * Thanks to many people for bug reports and testing. ++ * ++ * REFERENCES ++ * ++ * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". ++ * Available in http://tools.ietf.org/html/rfc1951 ++ * ++ * A description of the Rabin and Karp algorithm is given in the book ++ * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. ++ * ++ * Fiala,E.R., and Greene,D.H. ++ * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 ++ * ++ */ ++ ++/* @(#) $Id$ */ ++ ++#include "deflate.h" ++ ++const char deflate_copyright[] = ++ " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; ++/* ++ If you use the zlib library in a product, an acknowledgment is welcome ++ in the documentation of your product. If for some reason you cannot ++ include such an acknowledgment, I would appreciate that you keep this ++ copyright string in the executable of your product. ++ */ ++ ++/* =========================================================================== ++ * Function prototypes. ++ */ ++typedef enum { ++ need_more, /* block not completed, need more input or more output */ ++ block_done, /* block flush performed */ ++ finish_started, /* finish started, need only more output at next deflate */ ++ finish_done /* finish done, accept no more input or output */ ++} block_state; ++ ++typedef block_state (*compress_func) OF((deflate_state *s, int flush)); ++/* Compression function. Returns the block state after the call. */ ++ ++local void fill_window OF((deflate_state *s)); ++local block_state deflate_stored OF((deflate_state *s, int flush)); ++local block_state deflate_fast OF((deflate_state *s, int flush)); ++#ifndef FASTEST ++local block_state deflate_slow OF((deflate_state *s, int flush)); ++#endif ++local block_state deflate_rle OF((deflate_state *s, int flush)); ++local block_state deflate_huff OF((deflate_state *s, int flush)); ++local void lm_init OF((deflate_state *s)); ++local void putShortMSB OF((deflate_state *s, uInt b)); ++local void flush_pending OF((z_streamp strm)); ++local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); ++#ifdef ASMV ++ void match_init OF((void)); /* asm code initialization */ ++ uInt longest_match OF((deflate_state *s, IPos cur_match)); ++#else ++local uInt longest_match OF((deflate_state *s, IPos cur_match)); ++#endif ++ ++#ifdef DEBUG ++local void check_match OF((deflate_state *s, IPos start, IPos match, ++ int length)); ++#endif ++ ++/* =========================================================================== ++ * Local data ++ */ ++ ++#define NIL 0 ++/* Tail of hash chains */ ++ ++#ifndef TOO_FAR ++# define TOO_FAR 4096 ++#endif ++/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ ++ ++/* Values for max_lazy_match, good_match and max_chain_length, depending on ++ * the desired pack level (0..9). The values given below have been tuned to ++ * exclude worst case performance for pathological files. Better values may be ++ * found for specific files. ++ */ ++typedef struct config_s { ++ ush good_length; /* reduce lazy search above this match length */ ++ ush max_lazy; /* do not perform lazy search above this match length */ ++ ush nice_length; /* quit search above this match length */ ++ ush max_chain; ++ compress_func func; ++} config; ++ ++#ifdef FASTEST ++local const config configuration_table[2] = { ++/* good lazy nice chain */ ++/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ ++/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ ++#else ++local const config configuration_table[10] = { ++/* good lazy nice chain */ ++/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ ++/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ ++/* 2 */ {4, 5, 16, 8, deflate_fast}, ++/* 3 */ {4, 6, 32, 32, deflate_fast}, ++ ++/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ ++/* 5 */ {8, 16, 32, 32, deflate_slow}, ++/* 6 */ {8, 16, 128, 128, deflate_slow}, ++/* 7 */ {8, 32, 128, 256, deflate_slow}, ++/* 8 */ {32, 128, 258, 1024, deflate_slow}, ++/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ ++#endif ++ ++/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 ++ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different ++ * meaning. ++ */ ++ ++#define EQUAL 0 ++/* result of memcmp for equal strings */ ++ ++#ifndef NO_DUMMY_DECL ++struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ ++#endif ++ ++/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ ++#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) ++ ++/* =========================================================================== ++ * Update a hash value with the given input byte ++ * IN assertion: all calls to to UPDATE_HASH are made with consecutive ++ * input characters, so that a running hash key can be computed from the ++ * previous key instead of complete recalculation each time. ++ */ ++#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) ++ ++ ++/* =========================================================================== ++ * Insert string str in the dictionary and set match_head to the previous head ++ * of the hash chain (the most recent string with same hash key). Return ++ * the previous length of the hash chain. ++ * If this file is compiled with -DFASTEST, the compression level is forced ++ * to 1, and no hash chains are maintained. ++ * IN assertion: all calls to to INSERT_STRING are made with consecutive ++ * input characters and the first MIN_MATCH bytes of str are valid ++ * (except for the last MIN_MATCH-1 bytes of the input file). ++ */ ++#ifdef FASTEST ++#define INSERT_STRING(s, str, match_head) \ ++ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ ++ match_head = s->head[s->ins_h], \ ++ s->head[s->ins_h] = (Pos)(str)) ++#else ++#define INSERT_STRING(s, str, match_head) \ ++ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ ++ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ ++ s->head[s->ins_h] = (Pos)(str)) ++#endif ++ ++/* =========================================================================== ++ * Initialize the hash table (avoiding 64K overflow for 16 bit systems). ++ * prev[] will be initialized on the fly. ++ */ ++#define CLEAR_HASH(s) \ ++ s->head[s->hash_size-1] = NIL; \ ++ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); ++ ++/* ========================================================================= */ ++int ZEXPORT deflateInit_(strm, level, version, stream_size) ++ z_streamp strm; ++ int level; ++ const char *version; ++ int stream_size; ++{ ++ return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, ++ Z_DEFAULT_STRATEGY, version, stream_size); ++ /* To do: ignore strm->next_in if we use it as window */ ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, ++ version, stream_size) ++ z_streamp strm; ++ int level; ++ int method; ++ int windowBits; ++ int memLevel; ++ int strategy; ++ const char *version; ++ int stream_size; ++{ ++ deflate_state *s; ++ int wrap = 1; ++ static const char my_version[] = ZLIB_VERSION; ++ ++ ushf *overlay; ++ /* We overlay pending_buf and d_buf+l_buf. This works since the average ++ * output size for (length,distance) codes is <= 24 bits. ++ */ ++ ++ if (version == Z_NULL || version[0] != my_version[0] || ++ stream_size != sizeof(z_stream)) { ++ return Z_VERSION_ERROR; ++ } ++ if (strm == Z_NULL) return Z_STREAM_ERROR; ++ ++ strm->msg = Z_NULL; ++ if (strm->zalloc == (alloc_func)0) { ++#ifdef Z_SOLO ++ return Z_STREAM_ERROR; ++#else ++ strm->zalloc = zcalloc; ++ strm->opaque = (voidpf)0; ++#endif ++ } ++ if (strm->zfree == (free_func)0) ++#ifdef Z_SOLO ++ return Z_STREAM_ERROR; ++#else ++ strm->zfree = zcfree; ++#endif ++ ++#ifdef FASTEST ++ if (level != 0) level = 1; ++#else ++ if (level == Z_DEFAULT_COMPRESSION) level = 6; ++#endif ++ ++ if (windowBits < 0) { /* suppress zlib wrapper */ ++ wrap = 0; ++ windowBits = -windowBits; ++ } ++#ifdef GZIP ++ else if (windowBits > 15) { ++ wrap = 2; /* write gzip wrapper instead */ ++ windowBits -= 16; ++ } ++#endif ++ if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || ++ windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || ++ strategy < 0 || strategy > Z_FIXED) { ++ return Z_STREAM_ERROR; ++ } ++ if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ ++ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); ++ if (s == Z_NULL) return Z_MEM_ERROR; ++ strm->state = (struct internal_state FAR *)s; ++ s->strm = strm; ++ ++ s->wrap = wrap; ++ s->gzhead = Z_NULL; ++ s->w_bits = windowBits; ++ s->w_size = 1 << s->w_bits; ++ s->w_mask = s->w_size - 1; ++ ++ s->hash_bits = memLevel + 7; ++ s->hash_size = 1 << s->hash_bits; ++ s->hash_mask = s->hash_size - 1; ++ s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); ++ ++ s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); ++ s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); ++ s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); ++ ++ s->high_water = 0; /* nothing written to s->window yet */ ++ ++ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ ++ ++ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); ++ s->pending_buf = (uchf *) overlay; ++ s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); ++ ++ if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || ++ s->pending_buf == Z_NULL) { ++ s->status = FINISH_STATE; ++ strm->msg = ERR_MSG(Z_MEM_ERROR); ++ deflateEnd (strm); ++ return Z_MEM_ERROR; ++ } ++ s->d_buf = overlay + s->lit_bufsize/sizeof(ush); ++ s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; ++ ++ s->level = level; ++ s->strategy = strategy; ++ s->method = (Byte)method; ++ ++ return deflateReset(strm); ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) ++ z_streamp strm; ++ const Bytef *dictionary; ++ uInt dictLength; ++{ ++ deflate_state *s; ++ uInt str, n; ++ int wrap; ++ unsigned avail; ++ z_const unsigned char *next; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) ++ return Z_STREAM_ERROR; ++ s = strm->state; ++ wrap = s->wrap; ++ if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) ++ return Z_STREAM_ERROR; ++ ++ /* when using zlib wrappers, compute Adler-32 for provided dictionary */ ++ if (wrap == 1) ++ strm->adler = adler32(strm->adler, dictionary, dictLength); ++ s->wrap = 0; /* avoid computing Adler-32 in read_buf */ ++ ++ /* if dictionary would fill window, just replace the history */ ++ if (dictLength >= s->w_size) { ++ if (wrap == 0) { /* already empty otherwise */ ++ CLEAR_HASH(s); ++ s->strstart = 0; ++ s->block_start = 0L; ++ s->insert = 0; ++ } ++ dictionary += dictLength - s->w_size; /* use the tail */ ++ dictLength = s->w_size; ++ } ++ ++ /* insert dictionary into window and hash */ ++ avail = strm->avail_in; ++ next = strm->next_in; ++ strm->avail_in = dictLength; ++ strm->next_in = (z_const Bytef *)dictionary; ++ fill_window(s); ++ while (s->lookahead >= MIN_MATCH) { ++ str = s->strstart; ++ n = s->lookahead - (MIN_MATCH-1); ++ do { ++ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); ++#ifndef FASTEST ++ s->prev[str & s->w_mask] = s->head[s->ins_h]; ++#endif ++ s->head[s->ins_h] = (Pos)str; ++ str++; ++ } while (--n); ++ s->strstart = str; ++ s->lookahead = MIN_MATCH-1; ++ fill_window(s); ++ } ++ s->strstart += s->lookahead; ++ s->block_start = (long)s->strstart; ++ s->insert = s->lookahead; ++ s->lookahead = 0; ++ s->match_length = s->prev_length = MIN_MATCH-1; ++ s->match_available = 0; ++ strm->next_in = next; ++ strm->avail_in = avail; ++ s->wrap = wrap; ++ return Z_OK; ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflateResetKeep (strm) ++ z_streamp strm; ++{ ++ deflate_state *s; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL || ++ strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { ++ return Z_STREAM_ERROR; ++ } ++ ++ strm->total_in = strm->total_out = 0; ++ strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ ++ strm->data_type = Z_UNKNOWN; ++ ++ s = (deflate_state *)strm->state; ++ s->pending = 0; ++ s->pending_out = s->pending_buf; ++ ++ if (s->wrap < 0) { ++ s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ ++ } ++ s->status = s->wrap ? INIT_STATE : BUSY_STATE; ++ strm->adler = ++#ifdef GZIP ++ s->wrap == 2 ? crc32(0L, Z_NULL, 0) : ++#endif ++ adler32(0L, Z_NULL, 0); ++ s->last_flush = Z_NO_FLUSH; ++ ++ _tr_init(s); ++ ++ return Z_OK; ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflateReset (strm) ++ z_streamp strm; ++{ ++ int ret; ++ ++ ret = deflateResetKeep(strm); ++ if (ret == Z_OK) ++ lm_init(strm->state); ++ return ret; ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflateSetHeader (strm, head) ++ z_streamp strm; ++ gz_headerp head; ++{ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ if (strm->state->wrap != 2) return Z_STREAM_ERROR; ++ strm->state->gzhead = head; ++ return Z_OK; ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflatePending (strm, pending, bits) ++ unsigned *pending; ++ int *bits; ++ z_streamp strm; ++{ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ if (pending != Z_NULL) ++ *pending = strm->state->pending; ++ if (bits != Z_NULL) ++ *bits = strm->state->bi_valid; ++ return Z_OK; ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflatePrime (strm, bits, value) ++ z_streamp strm; ++ int bits; ++ int value; ++{ ++ deflate_state *s; ++ int put; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ s = strm->state; ++ if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) ++ return Z_BUF_ERROR; ++ do { ++ put = Buf_size - s->bi_valid; ++ if (put > bits) ++ put = bits; ++ s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); ++ s->bi_valid += put; ++ _tr_flush_bits(s); ++ value >>= put; ++ bits -= put; ++ } while (bits); ++ return Z_OK; ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflateParams(strm, level, strategy) ++ z_streamp strm; ++ int level; ++ int strategy; ++{ ++ deflate_state *s; ++ compress_func func; ++ int err = Z_OK; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ s = strm->state; ++ ++#ifdef FASTEST ++ if (level != 0) level = 1; ++#else ++ if (level == Z_DEFAULT_COMPRESSION) level = 6; ++#endif ++ if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { ++ return Z_STREAM_ERROR; ++ } ++ func = configuration_table[s->level].func; ++ ++ if ((strategy != s->strategy || func != configuration_table[level].func) && ++ strm->total_in != 0) { ++ /* Flush the last buffer: */ ++ err = deflate(strm, Z_BLOCK); ++ if (err == Z_BUF_ERROR && s->pending == 0) ++ err = Z_OK; ++ } ++ if (s->level != level) { ++ s->level = level; ++ s->max_lazy_match = configuration_table[level].max_lazy; ++ s->good_match = configuration_table[level].good_length; ++ s->nice_match = configuration_table[level].nice_length; ++ s->max_chain_length = configuration_table[level].max_chain; ++ } ++ s->strategy = strategy; ++ return err; ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) ++ z_streamp strm; ++ int good_length; ++ int max_lazy; ++ int nice_length; ++ int max_chain; ++{ ++ deflate_state *s; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ s = strm->state; ++ s->good_match = good_length; ++ s->max_lazy_match = max_lazy; ++ s->nice_match = nice_length; ++ s->max_chain_length = max_chain; ++ return Z_OK; ++} ++ ++/* ========================================================================= ++ * For the default windowBits of 15 and memLevel of 8, this function returns ++ * a close to exact, as well as small, upper bound on the compressed size. ++ * They are coded as constants here for a reason--if the #define's are ++ * changed, then this function needs to be changed as well. The return ++ * value for 15 and 8 only works for those exact settings. ++ * ++ * For any setting other than those defaults for windowBits and memLevel, ++ * the value returned is a conservative worst case for the maximum expansion ++ * resulting from using fixed blocks instead of stored blocks, which deflate ++ * can emit on compressed data for some combinations of the parameters. ++ * ++ * This function could be more sophisticated to provide closer upper bounds for ++ * every combination of windowBits and memLevel. But even the conservative ++ * upper bound of about 14% expansion does not seem onerous for output buffer ++ * allocation. ++ */ ++uLong ZEXPORT deflateBound(strm, sourceLen) ++ z_streamp strm; ++ uLong sourceLen; ++{ ++ deflate_state *s; ++ uLong complen, wraplen; ++ Bytef *str; ++ ++ /* conservative upper bound for compressed data */ ++ complen = sourceLen + ++ ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; ++ ++ /* if can't get parameters, return conservative bound plus zlib wrapper */ ++ if (strm == Z_NULL || strm->state == Z_NULL) ++ return complen + 6; ++ ++ /* compute wrapper length */ ++ s = strm->state; ++ switch (s->wrap) { ++ case 0: /* raw deflate */ ++ wraplen = 0; ++ break; ++ case 1: /* zlib wrapper */ ++ wraplen = 6 + (s->strstart ? 4 : 0); ++ break; ++ case 2: /* gzip wrapper */ ++ wraplen = 18; ++ if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ ++ if (s->gzhead->extra != Z_NULL) ++ wraplen += 2 + s->gzhead->extra_len; ++ str = s->gzhead->name; ++ if (str != Z_NULL) ++ do { ++ wraplen++; ++ } while (*str++); ++ str = s->gzhead->comment; ++ if (str != Z_NULL) ++ do { ++ wraplen++; ++ } while (*str++); ++ if (s->gzhead->hcrc) ++ wraplen += 2; ++ } ++ break; ++ default: /* for compiler happiness */ ++ wraplen = 6; ++ } ++ ++ /* if not default parameters, return conservative bound */ ++ if (s->w_bits != 15 || s->hash_bits != 8 + 7) ++ return complen + wraplen; ++ ++ /* default settings: return tight bound for that case */ ++ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + ++ (sourceLen >> 25) + 13 - 6 + wraplen; ++} ++ ++/* ========================================================================= ++ * Put a short in the pending buffer. The 16-bit value is put in MSB order. ++ * IN assertion: the stream state is correct and there is enough room in ++ * pending_buf. ++ */ ++local void putShortMSB (s, b) ++ deflate_state *s; ++ uInt b; ++{ ++ put_byte(s, (Byte)(b >> 8)); ++ put_byte(s, (Byte)(b & 0xff)); ++} ++ ++/* ========================================================================= ++ * Flush as much pending output as possible. All deflate() output goes ++ * through this function so some applications may wish to modify it ++ * to avoid allocating a large strm->next_out buffer and copying into it. ++ * (See also read_buf()). ++ */ ++local void flush_pending(strm) ++ z_streamp strm; ++{ ++ unsigned len; ++ deflate_state *s = strm->state; ++ ++ _tr_flush_bits(s); ++ len = s->pending; ++ if (len > strm->avail_out) len = strm->avail_out; ++ if (len == 0) return; ++ ++ zmemcpy(strm->next_out, s->pending_out, len); ++ strm->next_out += len; ++ s->pending_out += len; ++ strm->total_out += len; ++ strm->avail_out -= len; ++ s->pending -= len; ++ if (s->pending == 0) { ++ s->pending_out = s->pending_buf; ++ } ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflate (strm, flush) ++ z_streamp strm; ++ int flush; ++{ ++ int old_flush; /* value of flush param for previous deflate call */ ++ deflate_state *s; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL || ++ flush > Z_BLOCK || flush < 0) { ++ return Z_STREAM_ERROR; ++ } ++ s = strm->state; ++ ++ if (strm->next_out == Z_NULL || ++ (strm->next_in == Z_NULL && strm->avail_in != 0) || ++ (s->status == FINISH_STATE && flush != Z_FINISH)) { ++ ERR_RETURN(strm, Z_STREAM_ERROR); ++ } ++ if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); ++ ++ s->strm = strm; /* just in case */ ++ old_flush = s->last_flush; ++ s->last_flush = flush; ++ ++ /* Write the header */ ++ if (s->status == INIT_STATE) { ++#ifdef GZIP ++ if (s->wrap == 2) { ++ strm->adler = crc32(0L, Z_NULL, 0); ++ put_byte(s, 31); ++ put_byte(s, 139); ++ put_byte(s, 8); ++ if (s->gzhead == Z_NULL) { ++ put_byte(s, 0); ++ put_byte(s, 0); ++ put_byte(s, 0); ++ put_byte(s, 0); ++ put_byte(s, 0); ++ put_byte(s, s->level == 9 ? 2 : ++ (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? ++ 4 : 0)); ++ put_byte(s, OS_CODE); ++ s->status = BUSY_STATE; ++ } ++ else { ++ put_byte(s, (s->gzhead->text ? 1 : 0) + ++ (s->gzhead->hcrc ? 2 : 0) + ++ (s->gzhead->extra == Z_NULL ? 0 : 4) + ++ (s->gzhead->name == Z_NULL ? 0 : 8) + ++ (s->gzhead->comment == Z_NULL ? 0 : 16) ++ ); ++ put_byte(s, (Byte)(s->gzhead->time & 0xff)); ++ put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); ++ put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); ++ put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); ++ put_byte(s, s->level == 9 ? 2 : ++ (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? ++ 4 : 0)); ++ put_byte(s, s->gzhead->os & 0xff); ++ if (s->gzhead->extra != Z_NULL) { ++ put_byte(s, s->gzhead->extra_len & 0xff); ++ put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); ++ } ++ if (s->gzhead->hcrc) ++ strm->adler = crc32(strm->adler, s->pending_buf, ++ s->pending); ++ s->gzindex = 0; ++ s->status = EXTRA_STATE; ++ } ++ } ++ else ++#endif ++ { ++ uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; ++ uInt level_flags; ++ ++ if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) ++ level_flags = 0; ++ else if (s->level < 6) ++ level_flags = 1; ++ else if (s->level == 6) ++ level_flags = 2; ++ else ++ level_flags = 3; ++ header |= (level_flags << 6); ++ if (s->strstart != 0) header |= PRESET_DICT; ++ header += 31 - (header % 31); ++ ++ s->status = BUSY_STATE; ++ putShortMSB(s, header); ++ ++ /* Save the adler32 of the preset dictionary: */ ++ if (s->strstart != 0) { ++ putShortMSB(s, (uInt)(strm->adler >> 16)); ++ putShortMSB(s, (uInt)(strm->adler & 0xffff)); ++ } ++ strm->adler = adler32(0L, Z_NULL, 0); ++ } ++ } ++#ifdef GZIP ++ if (s->status == EXTRA_STATE) { ++ if (s->gzhead->extra != Z_NULL) { ++ uInt beg = s->pending; /* start of bytes to update crc */ ++ ++ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { ++ if (s->pending == s->pending_buf_size) { ++ if (s->gzhead->hcrc && s->pending > beg) ++ strm->adler = crc32(strm->adler, s->pending_buf + beg, ++ s->pending - beg); ++ flush_pending(strm); ++ beg = s->pending; ++ if (s->pending == s->pending_buf_size) ++ break; ++ } ++ put_byte(s, s->gzhead->extra[s->gzindex]); ++ s->gzindex++; ++ } ++ if (s->gzhead->hcrc && s->pending > beg) ++ strm->adler = crc32(strm->adler, s->pending_buf + beg, ++ s->pending - beg); ++ if (s->gzindex == s->gzhead->extra_len) { ++ s->gzindex = 0; ++ s->status = NAME_STATE; ++ } ++ } ++ else ++ s->status = NAME_STATE; ++ } ++ if (s->status == NAME_STATE) { ++ if (s->gzhead->name != Z_NULL) { ++ uInt beg = s->pending; /* start of bytes to update crc */ ++ int val; ++ ++ do { ++ if (s->pending == s->pending_buf_size) { ++ if (s->gzhead->hcrc && s->pending > beg) ++ strm->adler = crc32(strm->adler, s->pending_buf + beg, ++ s->pending - beg); ++ flush_pending(strm); ++ beg = s->pending; ++ if (s->pending == s->pending_buf_size) { ++ val = 1; ++ break; ++ } ++ } ++ val = s->gzhead->name[s->gzindex++]; ++ put_byte(s, val); ++ } while (val != 0); ++ if (s->gzhead->hcrc && s->pending > beg) ++ strm->adler = crc32(strm->adler, s->pending_buf + beg, ++ s->pending - beg); ++ if (val == 0) { ++ s->gzindex = 0; ++ s->status = COMMENT_STATE; ++ } ++ } ++ else ++ s->status = COMMENT_STATE; ++ } ++ if (s->status == COMMENT_STATE) { ++ if (s->gzhead->comment != Z_NULL) { ++ uInt beg = s->pending; /* start of bytes to update crc */ ++ int val; ++ ++ do { ++ if (s->pending == s->pending_buf_size) { ++ if (s->gzhead->hcrc && s->pending > beg) ++ strm->adler = crc32(strm->adler, s->pending_buf + beg, ++ s->pending - beg); ++ flush_pending(strm); ++ beg = s->pending; ++ if (s->pending == s->pending_buf_size) { ++ val = 1; ++ break; ++ } ++ } ++ val = s->gzhead->comment[s->gzindex++]; ++ put_byte(s, val); ++ } while (val != 0); ++ if (s->gzhead->hcrc && s->pending > beg) ++ strm->adler = crc32(strm->adler, s->pending_buf + beg, ++ s->pending - beg); ++ if (val == 0) ++ s->status = HCRC_STATE; ++ } ++ else ++ s->status = HCRC_STATE; ++ } ++ if (s->status == HCRC_STATE) { ++ if (s->gzhead->hcrc) { ++ if (s->pending + 2 > s->pending_buf_size) ++ flush_pending(strm); ++ if (s->pending + 2 <= s->pending_buf_size) { ++ put_byte(s, (Byte)(strm->adler & 0xff)); ++ put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); ++ strm->adler = crc32(0L, Z_NULL, 0); ++ s->status = BUSY_STATE; ++ } ++ } ++ else ++ s->status = BUSY_STATE; ++ } ++#endif ++ ++ /* Flush as much pending output as possible */ ++ if (s->pending != 0) { ++ flush_pending(strm); ++ if (strm->avail_out == 0) { ++ /* Since avail_out is 0, deflate will be called again with ++ * more output space, but possibly with both pending and ++ * avail_in equal to zero. There won't be anything to do, ++ * but this is not an error situation so make sure we ++ * return OK instead of BUF_ERROR at next call of deflate: ++ */ ++ s->last_flush = -1; ++ return Z_OK; ++ } ++ ++ /* Make sure there is something to do and avoid duplicate consecutive ++ * flushes. For repeated and useless calls with Z_FINISH, we keep ++ * returning Z_STREAM_END instead of Z_BUF_ERROR. ++ */ ++ } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && ++ flush != Z_FINISH) { ++ ERR_RETURN(strm, Z_BUF_ERROR); ++ } ++ ++ /* User must not provide more input after the first FINISH: */ ++ if (s->status == FINISH_STATE && strm->avail_in != 0) { ++ ERR_RETURN(strm, Z_BUF_ERROR); ++ } ++ ++ /* Start a new block or continue the current one. ++ */ ++ if (strm->avail_in != 0 || s->lookahead != 0 || ++ (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { ++ block_state bstate; ++ ++ bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : ++ (s->strategy == Z_RLE ? deflate_rle(s, flush) : ++ (*(configuration_table[s->level].func))(s, flush)); ++ ++ if (bstate == finish_started || bstate == finish_done) { ++ s->status = FINISH_STATE; ++ } ++ if (bstate == need_more || bstate == finish_started) { ++ if (strm->avail_out == 0) { ++ s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ ++ } ++ return Z_OK; ++ /* If flush != Z_NO_FLUSH && avail_out == 0, the next call ++ * of deflate should use the same flush parameter to make sure ++ * that the flush is complete. So we don't have to output an ++ * empty block here, this will be done at next call. This also ++ * ensures that for a very small output buffer, we emit at most ++ * one empty block. ++ */ ++ } ++ if (bstate == block_done) { ++ if (flush == Z_PARTIAL_FLUSH) { ++ _tr_align(s); ++ } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ ++ _tr_stored_block(s, (char*)0, 0L, 0); ++ /* For a full flush, this empty block will be recognized ++ * as a special marker by inflate_sync(). ++ */ ++ if (flush == Z_FULL_FLUSH) { ++ CLEAR_HASH(s); /* forget history */ ++ if (s->lookahead == 0) { ++ s->strstart = 0; ++ s->block_start = 0L; ++ s->insert = 0; ++ } ++ } ++ } ++ flush_pending(strm); ++ if (strm->avail_out == 0) { ++ s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ ++ return Z_OK; ++ } ++ } ++ } ++ Assert(strm->avail_out > 0, "bug2"); ++ ++ if (flush != Z_FINISH) return Z_OK; ++ if (s->wrap <= 0) return Z_STREAM_END; ++ ++ /* Write the trailer */ ++#ifdef GZIP ++ if (s->wrap == 2) { ++ put_byte(s, (Byte)(strm->adler & 0xff)); ++ put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); ++ put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); ++ put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); ++ put_byte(s, (Byte)(strm->total_in & 0xff)); ++ put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); ++ put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); ++ put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); ++ } ++ else ++#endif ++ { ++ putShortMSB(s, (uInt)(strm->adler >> 16)); ++ putShortMSB(s, (uInt)(strm->adler & 0xffff)); ++ } ++ flush_pending(strm); ++ /* If avail_out is zero, the application will call deflate again ++ * to flush the rest. ++ */ ++ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ ++ return s->pending != 0 ? Z_OK : Z_STREAM_END; ++} ++ ++/* ========================================================================= */ ++int ZEXPORT deflateEnd (strm) ++ z_streamp strm; ++{ ++ int status; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ ++ status = strm->state->status; ++ if (status != INIT_STATE && ++ status != EXTRA_STATE && ++ status != NAME_STATE && ++ status != COMMENT_STATE && ++ status != HCRC_STATE && ++ status != BUSY_STATE && ++ status != FINISH_STATE) { ++ return Z_STREAM_ERROR; ++ } ++ ++ /* Deallocate in reverse order of allocations: */ ++ TRY_FREE(strm, strm->state->pending_buf); ++ TRY_FREE(strm, strm->state->head); ++ TRY_FREE(strm, strm->state->prev); ++ TRY_FREE(strm, strm->state->window); ++ ++ ZFREE(strm, strm->state); ++ strm->state = Z_NULL; ++ ++ return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; ++} ++ ++/* ========================================================================= ++ * Copy the source state to the destination state. ++ * To simplify the source, this is not supported for 16-bit MSDOS (which ++ * doesn't have enough memory anyway to duplicate compression states). ++ */ ++int ZEXPORT deflateCopy (dest, source) ++ z_streamp dest; ++ z_streamp source; ++{ ++#ifdef MAXSEG_64K ++ return Z_STREAM_ERROR; ++#else ++ deflate_state *ds; ++ deflate_state *ss; ++ ushf *overlay; ++ ++ ++ if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { ++ return Z_STREAM_ERROR; ++ } ++ ++ ss = source->state; ++ ++ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); ++ ++ ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); ++ if (ds == Z_NULL) return Z_MEM_ERROR; ++ dest->state = (struct internal_state FAR *) ds; ++ zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); ++ ds->strm = dest; ++ ++ ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ++ ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ++ ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); ++ overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ++ ds->pending_buf = (uchf *) overlay; ++ ++ if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ++ ds->pending_buf == Z_NULL) { ++ deflateEnd (dest); ++ return Z_MEM_ERROR; ++ } ++ /* following zmemcpy do not work for 16-bit MSDOS */ ++ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); ++ zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); ++ zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); ++ zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ++ ++ ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ++ ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ++ ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ++ ++ ds->l_desc.dyn_tree = ds->dyn_ltree; ++ ds->d_desc.dyn_tree = ds->dyn_dtree; ++ ds->bl_desc.dyn_tree = ds->bl_tree; ++ ++ return Z_OK; ++#endif /* MAXSEG_64K */ ++} ++ ++/* =========================================================================== ++ * Read a new buffer from the current input stream, update the adler32 ++ * and total number of bytes read. All deflate() input goes through ++ * this function so some applications may wish to modify it to avoid ++ * allocating a large strm->next_in buffer and copying from it. ++ * (See also flush_pending()). ++ */ ++local int read_buf(strm, buf, size) ++ z_streamp strm; ++ Bytef *buf; ++ unsigned size; ++{ ++ unsigned len = strm->avail_in; ++ ++ if (len > size) len = size; ++ if (len == 0) return 0; ++ ++ strm->avail_in -= len; ++ ++ zmemcpy(buf, strm->next_in, len); ++ if (strm->state->wrap == 1) { ++ strm->adler = adler32(strm->adler, buf, len); ++ } ++#ifdef GZIP ++ else if (strm->state->wrap == 2) { ++ strm->adler = crc32(strm->adler, buf, len); ++ } ++#endif ++ strm->next_in += len; ++ strm->total_in += len; ++ ++ return (int)len; ++} ++ ++/* =========================================================================== ++ * Initialize the "longest match" routines for a new zlib stream ++ */ ++local void lm_init (s) ++ deflate_state *s; ++{ ++ s->window_size = (ulg)2L*s->w_size; ++ ++ CLEAR_HASH(s); ++ ++ /* Set the default configuration parameters: ++ */ ++ s->max_lazy_match = configuration_table[s->level].max_lazy; ++ s->good_match = configuration_table[s->level].good_length; ++ s->nice_match = configuration_table[s->level].nice_length; ++ s->max_chain_length = configuration_table[s->level].max_chain; ++ ++ s->strstart = 0; ++ s->block_start = 0L; ++ s->lookahead = 0; ++ s->insert = 0; ++ s->match_length = s->prev_length = MIN_MATCH-1; ++ s->match_available = 0; ++ s->ins_h = 0; ++#ifndef FASTEST ++#ifdef ASMV ++ match_init(); /* initialize the asm code */ ++#endif ++#endif ++} ++ ++#ifndef FASTEST ++/* =========================================================================== ++ * Set match_start to the longest match starting at the given string and ++ * return its length. Matches shorter or equal to prev_length are discarded, ++ * in which case the result is equal to prev_length and match_start is ++ * garbage. ++ * IN assertions: cur_match is the head of the hash chain for the current ++ * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 ++ * OUT assertion: the match length is not greater than s->lookahead. ++ */ ++#ifndef ASMV ++/* For 80x86 and 680x0, an optimized version will be provided in match.asm or ++ * match.S. The code will be functionally equivalent. ++ */ ++local uInt longest_match(s, cur_match) ++ deflate_state *s; ++ IPos cur_match; /* current match */ ++{ ++ unsigned chain_length = s->max_chain_length;/* max hash chain length */ ++ register Bytef *scan = s->window + s->strstart; /* current string */ ++ register Bytef *match; /* matched string */ ++ register int len; /* length of current match */ ++ int best_len = s->prev_length; /* best match length so far */ ++ int nice_match = s->nice_match; /* stop if match long enough */ ++ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? ++ s->strstart - (IPos)MAX_DIST(s) : NIL; ++ /* Stop when cur_match becomes <= limit. To simplify the code, ++ * we prevent matches with the string of window index 0. ++ */ ++ Posf *prev = s->prev; ++ uInt wmask = s->w_mask; ++ ++#ifdef UNALIGNED_OK ++ /* Compare two bytes at a time. Note: this is not always beneficial. ++ * Try with and without -DUNALIGNED_OK to check. ++ */ ++ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; ++ register ush scan_start = *(ushf*)scan; ++ register ush scan_end = *(ushf*)(scan+best_len-1); ++#else ++ register Bytef *strend = s->window + s->strstart + MAX_MATCH; ++ register Byte scan_end1 = scan[best_len-1]; ++ register Byte scan_end = scan[best_len]; ++#endif ++ ++ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. ++ * It is easy to get rid of this optimization if necessary. ++ */ ++ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); ++ ++ /* Do not waste too much time if we already have a good match: */ ++ if (s->prev_length >= s->good_match) { ++ chain_length >>= 2; ++ } ++ /* Do not look for matches beyond the end of the input. This is necessary ++ * to make deflate deterministic. ++ */ ++ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; ++ ++ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); ++ ++ do { ++ Assert(cur_match < s->strstart, "no future"); ++ match = s->window + cur_match; ++ ++ /* Skip to next match if the match length cannot increase ++ * or if the match length is less than 2. Note that the checks below ++ * for insufficient lookahead only occur occasionally for performance ++ * reasons. Therefore uninitialized memory will be accessed, and ++ * conditional jumps will be made that depend on those values. ++ * However the length of the match is limited to the lookahead, so ++ * the output of deflate is not affected by the uninitialized values. ++ */ ++#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) ++ /* This code assumes sizeof(unsigned short) == 2. Do not use ++ * UNALIGNED_OK if your compiler uses a different size. ++ */ ++ if (*(ushf*)(match+best_len-1) != scan_end || ++ *(ushf*)match != scan_start) continue; ++ ++ /* It is not necessary to compare scan[2] and match[2] since they are ++ * always equal when the other bytes match, given that the hash keys ++ * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at ++ * strstart+3, +5, ... up to strstart+257. We check for insufficient ++ * lookahead only every 4th comparison; the 128th check will be made ++ * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is ++ * necessary to put more guard bytes at the end of the window, or ++ * to check more often for insufficient lookahead. ++ */ ++ Assert(scan[2] == match[2], "scan[2]?"); ++ scan++, match++; ++ do { ++ } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && ++ *(ushf*)(scan+=2) == *(ushf*)(match+=2) && ++ *(ushf*)(scan+=2) == *(ushf*)(match+=2) && ++ *(ushf*)(scan+=2) == *(ushf*)(match+=2) && ++ scan < strend); ++ /* The funny "do {}" generates better code on most compilers */ ++ ++ /* Here, scan <= window+strstart+257 */ ++ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); ++ if (*scan == *match) scan++; ++ ++ len = (MAX_MATCH - 1) - (int)(strend-scan); ++ scan = strend - (MAX_MATCH-1); ++ ++#else /* UNALIGNED_OK */ ++ ++ if (match[best_len] != scan_end || ++ match[best_len-1] != scan_end1 || ++ *match != *scan || ++ *++match != scan[1]) continue; ++ ++ /* The check at best_len-1 can be removed because it will be made ++ * again later. (This heuristic is not always a win.) ++ * It is not necessary to compare scan[2] and match[2] since they ++ * are always equal when the other bytes match, given that ++ * the hash keys are equal and that HASH_BITS >= 8. ++ */ ++ scan += 2, match++; ++ Assert(*scan == *match, "match[2]?"); ++ ++ /* We check for insufficient lookahead only every 8th comparison; ++ * the 256th check will be made at strstart+258. ++ */ ++ do { ++ } while (*++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ scan < strend); ++ ++ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); ++ ++ len = MAX_MATCH - (int)(strend - scan); ++ scan = strend - MAX_MATCH; ++ ++#endif /* UNALIGNED_OK */ ++ ++ if (len > best_len) { ++ s->match_start = cur_match; ++ best_len = len; ++ if (len >= nice_match) break; ++#ifdef UNALIGNED_OK ++ scan_end = *(ushf*)(scan+best_len-1); ++#else ++ scan_end1 = scan[best_len-1]; ++ scan_end = scan[best_len]; ++#endif ++ } ++ } while ((cur_match = prev[cur_match & wmask]) > limit ++ && --chain_length != 0); ++ ++ if ((uInt)best_len <= s->lookahead) return (uInt)best_len; ++ return s->lookahead; ++} ++#endif /* ASMV */ ++ ++#else /* FASTEST */ ++ ++/* --------------------------------------------------------------------------- ++ * Optimized version for FASTEST only ++ */ ++local uInt longest_match(s, cur_match) ++ deflate_state *s; ++ IPos cur_match; /* current match */ ++{ ++ register Bytef *scan = s->window + s->strstart; /* current string */ ++ register Bytef *match; /* matched string */ ++ register int len; /* length of current match */ ++ register Bytef *strend = s->window + s->strstart + MAX_MATCH; ++ ++ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. ++ * It is easy to get rid of this optimization if necessary. ++ */ ++ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); ++ ++ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); ++ ++ Assert(cur_match < s->strstart, "no future"); ++ ++ match = s->window + cur_match; ++ ++ /* Return failure if the match length is less than 2: ++ */ ++ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; ++ ++ /* The check at best_len-1 can be removed because it will be made ++ * again later. (This heuristic is not always a win.) ++ * It is not necessary to compare scan[2] and match[2] since they ++ * are always equal when the other bytes match, given that ++ * the hash keys are equal and that HASH_BITS >= 8. ++ */ ++ scan += 2, match += 2; ++ Assert(*scan == *match, "match[2]?"); ++ ++ /* We check for insufficient lookahead only every 8th comparison; ++ * the 256th check will be made at strstart+258. ++ */ ++ do { ++ } while (*++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ *++scan == *++match && *++scan == *++match && ++ scan < strend); ++ ++ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); ++ ++ len = MAX_MATCH - (int)(strend - scan); ++ ++ if (len < MIN_MATCH) return MIN_MATCH - 1; ++ ++ s->match_start = cur_match; ++ return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; ++} ++ ++#endif /* FASTEST */ ++ ++#ifdef DEBUG ++/* =========================================================================== ++ * Check that the match at match_start is indeed a match. ++ */ ++local void check_match(s, start, match, length) ++ deflate_state *s; ++ IPos start, match; ++ int length; ++{ ++ /* check that the match is indeed a match */ ++ if (zmemcmp(s->window + match, ++ s->window + start, length) != EQUAL) { ++ fprintf(stderr, " start %u, match %u, length %d\n", ++ start, match, length); ++ do { ++ fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); ++ } while (--length != 0); ++ z_error("invalid match"); ++ } ++ if (z_verbose > 1) { ++ fprintf(stderr,"\\[%d,%d]", start-match, length); ++ do { putc(s->window[start++], stderr); } while (--length != 0); ++ } ++} ++#else ++# define check_match(s, start, match, length) ++#endif /* DEBUG */ ++ ++/* =========================================================================== ++ * Fill the window when the lookahead becomes insufficient. ++ * Updates strstart and lookahead. ++ * ++ * IN assertion: lookahead < MIN_LOOKAHEAD ++ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD ++ * At least one byte has been read, or avail_in == 0; reads are ++ * performed for at least two bytes (required for the zip translate_eol ++ * option -- not supported here). ++ */ ++local void fill_window(s) ++ deflate_state *s; ++{ ++ register unsigned n, m; ++ register Posf *p; ++ unsigned more; /* Amount of free space at the end of the window. */ ++ uInt wsize = s->w_size; ++ ++ Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); ++ ++ do { ++ more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); ++ ++ /* Deal with !@#$% 64K limit: */ ++ if (sizeof(int) <= 2) { ++ if (more == 0 && s->strstart == 0 && s->lookahead == 0) { ++ more = wsize; ++ ++ } else if (more == (unsigned)(-1)) { ++ /* Very unlikely, but possible on 16 bit machine if ++ * strstart == 0 && lookahead == 1 (input done a byte at time) ++ */ ++ more--; ++ } ++ } ++ ++ /* If the window is almost full and there is insufficient lookahead, ++ * move the upper half to the lower one to make room in the upper half. ++ */ ++ if (s->strstart >= wsize+MAX_DIST(s)) { ++ ++ zmemcpy(s->window, s->window+wsize, (unsigned)wsize); ++ s->match_start -= wsize; ++ s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ ++ s->block_start -= (long) wsize; ++ ++ /* Slide the hash table (could be avoided with 32 bit values ++ at the expense of memory usage). We slide even when level == 0 ++ to keep the hash table consistent if we switch back to level > 0 ++ later. (Using level 0 permanently is not an optimal usage of ++ zlib, so we don't care about this pathological case.) ++ */ ++ n = s->hash_size; ++ p = &s->head[n]; ++ do { ++ m = *--p; ++ *p = (Pos)(m >= wsize ? m-wsize : NIL); ++ } while (--n); ++ ++ n = wsize; ++#ifndef FASTEST ++ p = &s->prev[n]; ++ do { ++ m = *--p; ++ *p = (Pos)(m >= wsize ? m-wsize : NIL); ++ /* If n is not on any hash chain, prev[n] is garbage but ++ * its value will never be used. ++ */ ++ } while (--n); ++#endif ++ more += wsize; ++ } ++ if (s->strm->avail_in == 0) break; ++ ++ /* If there was no sliding: ++ * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && ++ * more == window_size - lookahead - strstart ++ * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) ++ * => more >= window_size - 2*WSIZE + 2 ++ * In the BIG_MEM or MMAP case (not yet supported), ++ * window_size == input_size + MIN_LOOKAHEAD && ++ * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. ++ * Otherwise, window_size == 2*WSIZE so more >= 2. ++ * If there was sliding, more >= WSIZE. So in all cases, more >= 2. ++ */ ++ Assert(more >= 2, "more < 2"); ++ ++ n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); ++ s->lookahead += n; ++ ++ /* Initialize the hash value now that we have some input: */ ++ if (s->lookahead + s->insert >= MIN_MATCH) { ++ uInt str = s->strstart - s->insert; ++ s->ins_h = s->window[str]; ++ UPDATE_HASH(s, s->ins_h, s->window[str + 1]); ++#if MIN_MATCH != 3 ++ Call UPDATE_HASH() MIN_MATCH-3 more times ++#endif ++ while (s->insert) { ++ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); ++#ifndef FASTEST ++ s->prev[str & s->w_mask] = s->head[s->ins_h]; ++#endif ++ s->head[s->ins_h] = (Pos)str; ++ str++; ++ s->insert--; ++ if (s->lookahead + s->insert < MIN_MATCH) ++ break; ++ } ++ } ++ /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, ++ * but this is not important since only literal bytes will be emitted. ++ */ ++ ++ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); ++ ++ /* If the WIN_INIT bytes after the end of the current data have never been ++ * written, then zero those bytes in order to avoid memory check reports of ++ * the use of uninitialized (or uninitialised as Julian writes) bytes by ++ * the longest match routines. Update the high water mark for the next ++ * time through here. WIN_INIT is set to MAX_MATCH since the longest match ++ * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. ++ */ ++ if (s->high_water < s->window_size) { ++ ulg curr = s->strstart + (ulg)(s->lookahead); ++ ulg init; ++ ++ if (s->high_water < curr) { ++ /* Previous high water mark below current data -- zero WIN_INIT ++ * bytes or up to end of window, whichever is less. ++ */ ++ init = s->window_size - curr; ++ if (init > WIN_INIT) ++ init = WIN_INIT; ++ zmemzero(s->window + curr, (unsigned)init); ++ s->high_water = curr + init; ++ } ++ else if (s->high_water < (ulg)curr + WIN_INIT) { ++ /* High water mark at or above current data, but below current data ++ * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up ++ * to end of window, whichever is less. ++ */ ++ init = (ulg)curr + WIN_INIT - s->high_water; ++ if (init > s->window_size - s->high_water) ++ init = s->window_size - s->high_water; ++ zmemzero(s->window + s->high_water, (unsigned)init); ++ s->high_water += init; ++ } ++ } ++ ++ Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, ++ "not enough room for search"); ++} ++ ++/* =========================================================================== ++ * Flush the current block, with given end-of-file flag. ++ * IN assertion: strstart is set to the end of the current match. ++ */ ++#define FLUSH_BLOCK_ONLY(s, last) { \ ++ _tr_flush_block(s, (s->block_start >= 0L ? \ ++ (charf *)&s->window[(unsigned)s->block_start] : \ ++ (charf *)Z_NULL), \ ++ (ulg)((long)s->strstart - s->block_start), \ ++ (last)); \ ++ s->block_start = s->strstart; \ ++ flush_pending(s->strm); \ ++ Tracev((stderr,"[FLUSH]")); \ ++} ++ ++/* Same but force premature exit if necessary. */ ++#define FLUSH_BLOCK(s, last) { \ ++ FLUSH_BLOCK_ONLY(s, last); \ ++ if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ ++} ++ ++/* =========================================================================== ++ * Copy without compression as much as possible from the input stream, return ++ * the current block state. ++ * This function does not insert new strings in the dictionary since ++ * uncompressible data is probably not useful. This function is used ++ * only for the level=0 compression option. ++ * NOTE: this function should be optimized to avoid extra copying from ++ * window to pending_buf. ++ */ ++local block_state deflate_stored(s, flush) ++ deflate_state *s; ++ int flush; ++{ ++ /* Stored blocks are limited to 0xffff bytes, pending_buf is limited ++ * to pending_buf_size, and each stored block has a 5 byte header: ++ */ ++ ulg max_block_size = 0xffff; ++ ulg max_start; ++ ++ if (max_block_size > s->pending_buf_size - 5) { ++ max_block_size = s->pending_buf_size - 5; ++ } ++ ++ /* Copy as much as possible from input to output: */ ++ for (;;) { ++ /* Fill the window as much as possible: */ ++ if (s->lookahead <= 1) { ++ ++ Assert(s->strstart < s->w_size+MAX_DIST(s) || ++ s->block_start >= (long)s->w_size, "slide too late"); ++ ++ fill_window(s); ++ if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; ++ ++ if (s->lookahead == 0) break; /* flush the current block */ ++ } ++ Assert(s->block_start >= 0L, "block gone"); ++ ++ s->strstart += s->lookahead; ++ s->lookahead = 0; ++ ++ /* Emit a stored block if pending_buf will be full: */ ++ max_start = s->block_start + max_block_size; ++ if (s->strstart == 0 || (ulg)s->strstart >= max_start) { ++ /* strstart == 0 is possible when wraparound on 16-bit machine */ ++ s->lookahead = (uInt)(s->strstart - max_start); ++ s->strstart = (uInt)max_start; ++ FLUSH_BLOCK(s, 0); ++ } ++ /* Flush if we may have to slide, otherwise block_start may become ++ * negative and the data will be gone: ++ */ ++ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { ++ FLUSH_BLOCK(s, 0); ++ } ++ } ++ s->insert = 0; ++ if (flush == Z_FINISH) { ++ FLUSH_BLOCK(s, 1); ++ return finish_done; ++ } ++ if ((long)s->strstart > s->block_start) ++ FLUSH_BLOCK(s, 0); ++ return block_done; ++} ++ ++/* =========================================================================== ++ * Compress as much as possible from the input stream, return the current ++ * block state. ++ * This function does not perform lazy evaluation of matches and inserts ++ * new strings in the dictionary only for unmatched strings or for short ++ * matches. It is used only for the fast compression options. ++ */ ++local block_state deflate_fast(s, flush) ++ deflate_state *s; ++ int flush; ++{ ++ IPos hash_head; /* head of the hash chain */ ++ int bflush; /* set if current block must be flushed */ ++ ++ for (;;) { ++ /* Make sure that we always have enough lookahead, except ++ * at the end of the input file. We need MAX_MATCH bytes ++ * for the next match, plus MIN_MATCH bytes to insert the ++ * string following the next match. ++ */ ++ if (s->lookahead < MIN_LOOKAHEAD) { ++ fill_window(s); ++ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { ++ return need_more; ++ } ++ if (s->lookahead == 0) break; /* flush the current block */ ++ } ++ ++ /* Insert the string window[strstart .. strstart+2] in the ++ * dictionary, and set hash_head to the head of the hash chain: ++ */ ++ hash_head = NIL; ++ if (s->lookahead >= MIN_MATCH) { ++ INSERT_STRING(s, s->strstart, hash_head); ++ } ++ ++ /* Find the longest match, discarding those <= prev_length. ++ * At this point we have always match_length < MIN_MATCH ++ */ ++ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { ++ /* To simplify the code, we prevent matches with the string ++ * of window index 0 (in particular we have to avoid a match ++ * of the string with itself at the start of the input file). ++ */ ++ s->match_length = longest_match (s, hash_head); ++ /* longest_match() sets match_start */ ++ } ++ if (s->match_length >= MIN_MATCH) { ++ check_match(s, s->strstart, s->match_start, s->match_length); ++ ++ _tr_tally_dist(s, s->strstart - s->match_start, ++ s->match_length - MIN_MATCH, bflush); ++ ++ s->lookahead -= s->match_length; ++ ++ /* Insert new strings in the hash table only if the match length ++ * is not too large. This saves time but degrades compression. ++ */ ++#ifndef FASTEST ++ if (s->match_length <= s->max_insert_length && ++ s->lookahead >= MIN_MATCH) { ++ s->match_length--; /* string at strstart already in table */ ++ do { ++ s->strstart++; ++ INSERT_STRING(s, s->strstart, hash_head); ++ /* strstart never exceeds WSIZE-MAX_MATCH, so there are ++ * always MIN_MATCH bytes ahead. ++ */ ++ } while (--s->match_length != 0); ++ s->strstart++; ++ } else ++#endif ++ { ++ s->strstart += s->match_length; ++ s->match_length = 0; ++ s->ins_h = s->window[s->strstart]; ++ UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); ++#if MIN_MATCH != 3 ++ Call UPDATE_HASH() MIN_MATCH-3 more times ++#endif ++ /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not ++ * matter since it will be recomputed at next deflate call. ++ */ ++ } ++ } else { ++ /* No match, output a literal byte */ ++ Tracevv((stderr,"%c", s->window[s->strstart])); ++ _tr_tally_lit (s, s->window[s->strstart], bflush); ++ s->lookahead--; ++ s->strstart++; ++ } ++ if (bflush) FLUSH_BLOCK(s, 0); ++ } ++ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; ++ if (flush == Z_FINISH) { ++ FLUSH_BLOCK(s, 1); ++ return finish_done; ++ } ++ if (s->last_lit) ++ FLUSH_BLOCK(s, 0); ++ return block_done; ++} ++ ++#ifndef FASTEST ++/* =========================================================================== ++ * Same as above, but achieves better compression. We use a lazy ++ * evaluation for matches: a match is finally adopted only if there is ++ * no better match at the next window position. ++ */ ++local block_state deflate_slow(s, flush) ++ deflate_state *s; ++ int flush; ++{ ++ IPos hash_head; /* head of hash chain */ ++ int bflush; /* set if current block must be flushed */ ++ ++ /* Process the input block. */ ++ for (;;) { ++ /* Make sure that we always have enough lookahead, except ++ * at the end of the input file. We need MAX_MATCH bytes ++ * for the next match, plus MIN_MATCH bytes to insert the ++ * string following the next match. ++ */ ++ if (s->lookahead < MIN_LOOKAHEAD) { ++ fill_window(s); ++ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { ++ return need_more; ++ } ++ if (s->lookahead == 0) break; /* flush the current block */ ++ } ++ ++ /* Insert the string window[strstart .. strstart+2] in the ++ * dictionary, and set hash_head to the head of the hash chain: ++ */ ++ hash_head = NIL; ++ if (s->lookahead >= MIN_MATCH) { ++ INSERT_STRING(s, s->strstart, hash_head); ++ } ++ ++ /* Find the longest match, discarding those <= prev_length. ++ */ ++ s->prev_length = s->match_length, s->prev_match = s->match_start; ++ s->match_length = MIN_MATCH-1; ++ ++ if (hash_head != NIL && s->prev_length < s->max_lazy_match && ++ s->strstart - hash_head <= MAX_DIST(s)) { ++ /* To simplify the code, we prevent matches with the string ++ * of window index 0 (in particular we have to avoid a match ++ * of the string with itself at the start of the input file). ++ */ ++ s->match_length = longest_match (s, hash_head); ++ /* longest_match() sets match_start */ ++ ++ if (s->match_length <= 5 && (s->strategy == Z_FILTERED ++#if TOO_FAR <= 32767 ++ || (s->match_length == MIN_MATCH && ++ s->strstart - s->match_start > TOO_FAR) ++#endif ++ )) { ++ ++ /* If prev_match is also MIN_MATCH, match_start is garbage ++ * but we will ignore the current match anyway. ++ */ ++ s->match_length = MIN_MATCH-1; ++ } ++ } ++ /* If there was a match at the previous step and the current ++ * match is not better, output the previous match: ++ */ ++ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { ++ uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; ++ /* Do not insert strings in hash table beyond this. */ ++ ++ check_match(s, s->strstart-1, s->prev_match, s->prev_length); ++ ++ _tr_tally_dist(s, s->strstart -1 - s->prev_match, ++ s->prev_length - MIN_MATCH, bflush); ++ ++ /* Insert in hash table all strings up to the end of the match. ++ * strstart-1 and strstart are already inserted. If there is not ++ * enough lookahead, the last two strings are not inserted in ++ * the hash table. ++ */ ++ s->lookahead -= s->prev_length-1; ++ s->prev_length -= 2; ++ do { ++ if (++s->strstart <= max_insert) { ++ INSERT_STRING(s, s->strstart, hash_head); ++ } ++ } while (--s->prev_length != 0); ++ s->match_available = 0; ++ s->match_length = MIN_MATCH-1; ++ s->strstart++; ++ ++ if (bflush) FLUSH_BLOCK(s, 0); ++ ++ } else if (s->match_available) { ++ /* If there was no match at the previous position, output a ++ * single literal. If there was a match but the current match ++ * is longer, truncate the previous match to a single literal. ++ */ ++ Tracevv((stderr,"%c", s->window[s->strstart-1])); ++ _tr_tally_lit(s, s->window[s->strstart-1], bflush); ++ if (bflush) { ++ FLUSH_BLOCK_ONLY(s, 0); ++ } ++ s->strstart++; ++ s->lookahead--; ++ if (s->strm->avail_out == 0) return need_more; ++ } else { ++ /* There is no previous match to compare with, wait for ++ * the next step to decide. ++ */ ++ s->match_available = 1; ++ s->strstart++; ++ s->lookahead--; ++ } ++ } ++ Assert (flush != Z_NO_FLUSH, "no flush?"); ++ if (s->match_available) { ++ Tracevv((stderr,"%c", s->window[s->strstart-1])); ++ _tr_tally_lit(s, s->window[s->strstart-1], bflush); ++ s->match_available = 0; ++ } ++ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; ++ if (flush == Z_FINISH) { ++ FLUSH_BLOCK(s, 1); ++ return finish_done; ++ } ++ if (s->last_lit) ++ FLUSH_BLOCK(s, 0); ++ return block_done; ++} ++#endif /* FASTEST */ ++ ++/* =========================================================================== ++ * For Z_RLE, simply look for runs of bytes, generate matches only of distance ++ * one. Do not maintain a hash table. (It will be regenerated if this run of ++ * deflate switches away from Z_RLE.) ++ */ ++local block_state deflate_rle(s, flush) ++ deflate_state *s; ++ int flush; ++{ ++ int bflush; /* set if current block must be flushed */ ++ uInt prev; /* byte at distance one to match */ ++ Bytef *scan, *strend; /* scan goes up to strend for length of run */ ++ ++ for (;;) { ++ /* Make sure that we always have enough lookahead, except ++ * at the end of the input file. We need MAX_MATCH bytes ++ * for the longest run, plus one for the unrolled loop. ++ */ ++ if (s->lookahead <= MAX_MATCH) { ++ fill_window(s); ++ if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { ++ return need_more; ++ } ++ if (s->lookahead == 0) break; /* flush the current block */ ++ } ++ ++ /* See how many times the previous byte repeats */ ++ s->match_length = 0; ++ if (s->lookahead >= MIN_MATCH && s->strstart > 0) { ++ scan = s->window + s->strstart - 1; ++ prev = *scan; ++ if (prev == *++scan && prev == *++scan && prev == *++scan) { ++ strend = s->window + s->strstart + MAX_MATCH; ++ do { ++ } while (prev == *++scan && prev == *++scan && ++ prev == *++scan && prev == *++scan && ++ prev == *++scan && prev == *++scan && ++ prev == *++scan && prev == *++scan && ++ scan < strend); ++ s->match_length = MAX_MATCH - (int)(strend - scan); ++ if (s->match_length > s->lookahead) ++ s->match_length = s->lookahead; ++ } ++ Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); ++ } ++ ++ /* Emit match if have run of MIN_MATCH or longer, else emit literal */ ++ if (s->match_length >= MIN_MATCH) { ++ check_match(s, s->strstart, s->strstart - 1, s->match_length); ++ ++ _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); ++ ++ s->lookahead -= s->match_length; ++ s->strstart += s->match_length; ++ s->match_length = 0; ++ } else { ++ /* No match, output a literal byte */ ++ Tracevv((stderr,"%c", s->window[s->strstart])); ++ _tr_tally_lit (s, s->window[s->strstart], bflush); ++ s->lookahead--; ++ s->strstart++; ++ } ++ if (bflush) FLUSH_BLOCK(s, 0); ++ } ++ s->insert = 0; ++ if (flush == Z_FINISH) { ++ FLUSH_BLOCK(s, 1); ++ return finish_done; ++ } ++ if (s->last_lit) ++ FLUSH_BLOCK(s, 0); ++ return block_done; ++} ++ ++/* =========================================================================== ++ * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. ++ * (It will be regenerated if this run of deflate switches away from Huffman.) ++ */ ++local block_state deflate_huff(s, flush) ++ deflate_state *s; ++ int flush; ++{ ++ int bflush; /* set if current block must be flushed */ ++ ++ for (;;) { ++ /* Make sure that we have a literal to write. */ ++ if (s->lookahead == 0) { ++ fill_window(s); ++ if (s->lookahead == 0) { ++ if (flush == Z_NO_FLUSH) ++ return need_more; ++ break; /* flush the current block */ ++ } ++ } ++ ++ /* Output a literal byte */ ++ s->match_length = 0; ++ Tracevv((stderr,"%c", s->window[s->strstart])); ++ _tr_tally_lit (s, s->window[s->strstart], bflush); ++ s->lookahead--; ++ s->strstart++; ++ if (bflush) FLUSH_BLOCK(s, 0); ++ } ++ s->insert = 0; ++ if (flush == Z_FINISH) { ++ FLUSH_BLOCK(s, 1); ++ return finish_done; ++ } ++ if (s->last_lit) ++ FLUSH_BLOCK(s, 0); ++ return block_done; ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/deflate.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/deflate.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,370 @@ ++/* ++ * 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. ++ */ ++ ++/* deflate.h -- internal compression state ++ * Copyright (C) 1995-2012 Jean-loup Gailly ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++/* @(#) $Id$ */ ++ ++#ifndef DEFLATE_H ++#define DEFLATE_H ++ ++#include "zutil.h" ++ ++/* define NO_GZIP when compiling if you want to disable gzip header and ++ trailer creation by deflate(). NO_GZIP would be used to avoid linking in ++ the crc code when it is not needed. For shared libraries, gzip encoding ++ should be left enabled. */ ++#ifndef NO_GZIP ++# define GZIP ++#endif ++ ++/* =========================================================================== ++ * Internal compression state. ++ */ ++ ++#define LENGTH_CODES 29 ++/* number of length codes, not counting the special END_BLOCK code */ ++ ++#define LITERALS 256 ++/* number of literal bytes 0..255 */ ++ ++#define L_CODES (LITERALS+1+LENGTH_CODES) ++/* number of Literal or Length codes, including the END_BLOCK code */ ++ ++#define D_CODES 30 ++/* number of distance codes */ ++ ++#define BL_CODES 19 ++/* number of codes used to transfer the bit lengths */ ++ ++#define HEAP_SIZE (2*L_CODES+1) ++/* maximum heap size */ ++ ++#define MAX_BITS 15 ++/* All codes must not exceed MAX_BITS bits */ ++ ++#define Buf_size 16 ++/* size of bit buffer in bi_buf */ ++ ++#define INIT_STATE 42 ++#define EXTRA_STATE 69 ++#define NAME_STATE 73 ++#define COMMENT_STATE 91 ++#define HCRC_STATE 103 ++#define BUSY_STATE 113 ++#define FINISH_STATE 666 ++/* Stream status */ ++ ++ ++/* Data structure describing a single value and its code string. */ ++typedef struct ct_data_s { ++ union { ++ ush freq; /* frequency count */ ++ ush code; /* bit string */ ++ } fc; ++ union { ++ ush dad; /* father node in Huffman tree */ ++ ush len; /* length of bit string */ ++ } dl; ++} FAR ct_data; ++ ++#define Freq fc.freq ++#define Code fc.code ++#define Dad dl.dad ++#define Len dl.len ++ ++typedef struct static_tree_desc_s static_tree_desc; ++ ++typedef struct tree_desc_s { ++ ct_data *dyn_tree; /* the dynamic tree */ ++ int max_code; /* largest code with non zero frequency */ ++ static_tree_desc *stat_desc; /* the corresponding static tree */ ++} FAR tree_desc; ++ ++typedef ush Pos; ++typedef Pos FAR Posf; ++typedef unsigned IPos; ++ ++/* A Pos is an index in the character window. We use short instead of int to ++ * save space in the various tables. IPos is used only for parameter passing. ++ */ ++ ++typedef struct internal_state { ++ z_streamp strm; /* pointer back to this zlib stream */ ++ int status; /* as the name implies */ ++ Bytef *pending_buf; /* output still pending */ ++ ulg pending_buf_size; /* size of pending_buf */ ++ Bytef *pending_out; /* next pending byte to output to the stream */ ++ uInt pending; /* nb of bytes in the pending buffer */ ++ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ ++ gz_headerp gzhead; /* gzip header information to write */ ++ uInt gzindex; /* where in extra, name, or comment */ ++ Byte method; /* can only be DEFLATED */ ++ int last_flush; /* value of flush param for previous deflate call */ ++ ++ /* used by deflate.c: */ ++ ++ uInt w_size; /* LZ77 window size (32K by default) */ ++ uInt w_bits; /* log2(w_size) (8..16) */ ++ uInt w_mask; /* w_size - 1 */ ++ ++ Bytef *window; ++ /* Sliding window. Input bytes are read into the second half of the window, ++ * and move to the first half later to keep a dictionary of at least wSize ++ * bytes. With this organization, matches are limited to a distance of ++ * wSize-MAX_MATCH bytes, but this ensures that IO is always ++ * performed with a length multiple of the block size. Also, it limits ++ * the window size to 64K, which is quite useful on MSDOS. ++ * To do: use the user input buffer as sliding window. ++ */ ++ ++ ulg window_size; ++ /* Actual size of window: 2*wSize, except when the user input buffer ++ * is directly used as sliding window. ++ */ ++ ++ Posf *prev; ++ /* Link to older string with same hash index. To limit the size of this ++ * array to 64K, this link is maintained only for the last 32K strings. ++ * An index in this array is thus a window index modulo 32K. ++ */ ++ ++ Posf *head; /* Heads of the hash chains or NIL. */ ++ ++ uInt ins_h; /* hash index of string to be inserted */ ++ uInt hash_size; /* number of elements in hash table */ ++ uInt hash_bits; /* log2(hash_size) */ ++ uInt hash_mask; /* hash_size-1 */ ++ ++ uInt hash_shift; ++ /* Number of bits by which ins_h must be shifted at each input ++ * step. It must be such that after MIN_MATCH steps, the oldest ++ * byte no longer takes part in the hash key, that is: ++ * hash_shift * MIN_MATCH >= hash_bits ++ */ ++ ++ long block_start; ++ /* Window position at the beginning of the current output block. Gets ++ * negative when the window is moved backwards. ++ */ ++ ++ uInt match_length; /* length of best match */ ++ IPos prev_match; /* previous match */ ++ int match_available; /* set if previous match exists */ ++ uInt strstart; /* start of string to insert */ ++ uInt match_start; /* start of matching string */ ++ uInt lookahead; /* number of valid bytes ahead in window */ ++ ++ uInt prev_length; ++ /* Length of the best match at previous step. Matches not greater than this ++ * are discarded. This is used in the lazy match evaluation. ++ */ ++ ++ uInt max_chain_length; ++ /* To speed up deflation, hash chains are never searched beyond this ++ * length. A higher limit improves compression ratio but degrades the ++ * speed. ++ */ ++ ++ uInt max_lazy_match; ++ /* Attempt to find a better match only when the current match is strictly ++ * smaller than this value. This mechanism is used only for compression ++ * levels >= 4. ++ */ ++# define max_insert_length max_lazy_match ++ /* Insert new strings in the hash table only if the match length is not ++ * greater than this length. This saves time but degrades compression. ++ * max_insert_length is used only for compression levels <= 3. ++ */ ++ ++ int level; /* compression level (1..9) */ ++ int strategy; /* favor or force Huffman coding*/ ++ ++ uInt good_match; ++ /* Use a faster search when the previous match is longer than this */ ++ ++ int nice_match; /* Stop searching when current match exceeds this */ ++ ++ /* used by trees.c: */ ++ /* Didn't use ct_data typedef below to suppress compiler warning */ ++ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ ++ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ ++ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ ++ ++ struct tree_desc_s l_desc; /* desc. for literal tree */ ++ struct tree_desc_s d_desc; /* desc. for distance tree */ ++ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ++ ++ ush bl_count[MAX_BITS+1]; ++ /* number of codes at each bit length for an optimal tree */ ++ ++ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ ++ int heap_len; /* number of elements in the heap */ ++ int heap_max; /* element of largest frequency */ ++ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. ++ * The same heap array is used to build all trees. ++ */ ++ ++ uch depth[2*L_CODES+1]; ++ /* Depth of each subtree used as tie breaker for trees of equal frequency ++ */ ++ ++ uchf *l_buf; /* buffer for literals or lengths */ ++ ++ uInt lit_bufsize; ++ /* Size of match buffer for literals/lengths. There are 4 reasons for ++ * limiting lit_bufsize to 64K: ++ * - frequencies can be kept in 16 bit counters ++ * - if compression is not successful for the first block, all input ++ * data is still in the window so we can still emit a stored block even ++ * when input comes from standard input. (This can also be done for ++ * all blocks if lit_bufsize is not greater than 32K.) ++ * - if compression is not successful for a file smaller than 64K, we can ++ * even emit a stored file instead of a stored block (saving 5 bytes). ++ * This is applicable only for zip (not gzip or zlib). ++ * - creating new Huffman trees less frequently may not provide fast ++ * adaptation to changes in the input data statistics. (Take for ++ * example a binary file with poorly compressible code followed by ++ * a highly compressible string table.) Smaller buffer sizes give ++ * fast adaptation but have of course the overhead of transmitting ++ * trees more frequently. ++ * - I can't count above 4 ++ */ ++ ++ uInt last_lit; /* running index in l_buf */ ++ ++ ushf *d_buf; ++ /* Buffer for distances. To simplify the code, d_buf and l_buf have ++ * the same number of elements. To use different lengths, an extra flag ++ * array would be necessary. ++ */ ++ ++ ulg opt_len; /* bit length of current block with optimal trees */ ++ ulg static_len; /* bit length of current block with static trees */ ++ uInt matches; /* number of string matches in current block */ ++ uInt insert; /* bytes at end of window left to insert */ ++ ++#ifdef DEBUG ++ ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ++ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ ++#endif ++ ++ ush bi_buf; ++ /* Output buffer. bits are inserted starting at the bottom (least ++ * significant bits). ++ */ ++ int bi_valid; ++ /* Number of valid bits in bi_buf. All bits above the last valid bit ++ * are always zero. ++ */ ++ ++ ulg high_water; ++ /* High water mark offset in window for initialized bytes -- bytes above ++ * this are set to zero in order to avoid memory check warnings when ++ * longest match routines access bytes past the input. This is then ++ * updated to the new high water mark. ++ */ ++ ++} FAR deflate_state; ++ ++/* Output a byte on the stream. ++ * IN assertion: there is enough room in pending_buf. ++ */ ++#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} ++ ++ ++#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) ++/* Minimum amount of lookahead, except at the end of the input file. ++ * See deflate.c for comments about the MIN_MATCH+1. ++ */ ++ ++#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) ++/* In order to simplify the code, particularly on 16 bit machines, match ++ * distances are limited to MAX_DIST instead of WSIZE. ++ */ ++ ++#define WIN_INIT MAX_MATCH ++/* Number of bytes after end of data in window to initialize in order to avoid ++ memory checker errors from longest match routines */ ++ ++ /* in trees.c */ ++void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); ++int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); ++void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, ++ ulg stored_len, int last)); ++void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); ++void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); ++void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, ++ ulg stored_len, int last)); ++ ++#define d_code(dist) \ ++ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) ++/* Mapping from a distance to a distance code. dist is the distance - 1 and ++ * must not have side effects. _dist_code[256] and _dist_code[257] are never ++ * used. ++ */ ++ ++#ifndef DEBUG ++/* Inline versions of _tr_tally for speed: */ ++ ++#if defined(GEN_TREES_H) || !defined(STDC) ++ extern uch ZLIB_INTERNAL _length_code[]; ++ extern uch ZLIB_INTERNAL _dist_code[]; ++#else ++ extern const uch ZLIB_INTERNAL _length_code[]; ++ extern const uch ZLIB_INTERNAL _dist_code[]; ++#endif ++ ++# define _tr_tally_lit(s, c, flush) \ ++ { uch cc = (c); \ ++ s->d_buf[s->last_lit] = 0; \ ++ s->l_buf[s->last_lit++] = cc; \ ++ s->dyn_ltree[cc].Freq++; \ ++ flush = (s->last_lit == s->lit_bufsize-1); \ ++ } ++# define _tr_tally_dist(s, distance, length, flush) \ ++ { uch len = (length); \ ++ ush dist = (distance); \ ++ s->d_buf[s->last_lit] = dist; \ ++ s->l_buf[s->last_lit++] = len; \ ++ dist--; \ ++ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ ++ s->dyn_dtree[d_code(dist)].Freq++; \ ++ flush = (s->last_lit == s->lit_bufsize-1); \ ++ } ++#else ++# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) ++# define _tr_tally_dist(s, distance, length, flush) \ ++ flush = _tr_tally(s, distance, length) ++#endif ++ ++#endif /* DEFLATE_H */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzclose.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzclose.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,49 @@ ++/* ++ * 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. ++ */ ++ ++/* gzclose.c -- zlib gzclose() function ++ * Copyright (C) 2004, 2010 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "gzguts.h" ++ ++/* gzclose() is in a separate file so that it is linked in only if it is used. ++ That way the other gzclose functions can be used instead to avoid linking in ++ unneeded compression or decompression routines. */ ++int ZEXPORT gzclose(file) ++ gzFile file; ++{ ++#ifndef NO_GZCOMPRESS ++ gz_statep state; ++ ++ if (file == NULL) ++ return Z_STREAM_ERROR; ++ state = (gz_statep)file; ++ ++ return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); ++#else ++ return gzclose_r(file); ++#endif ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzguts.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzguts.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,233 @@ ++/* ++ * 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. ++ */ ++ ++/* gzguts.h -- zlib internal header definitions for gz* operations ++ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#ifdef _LARGEFILE64_SOURCE ++# ifndef _LARGEFILE_SOURCE ++# define _LARGEFILE_SOURCE 1 ++# endif ++# ifdef _FILE_OFFSET_BITS ++# undef _FILE_OFFSET_BITS ++# endif ++#endif ++ ++#ifdef HAVE_HIDDEN ++# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) ++#else ++# define ZLIB_INTERNAL ++#endif ++ ++#include <stdio.h> ++#include "zlib.h" ++#ifdef STDC ++# include <string.h> ++# include <stdlib.h> ++# include <limits.h> ++#endif ++#include <fcntl.h> ++ ++#ifdef _WIN32 ++# include <stddef.h> ++#endif ++ ++#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) ++# include <io.h> ++#endif ++ ++#ifdef WINAPI_FAMILY ++# define open _open ++# define read _read ++# define write _write ++# define close _close ++#endif ++ ++#ifdef NO_DEFLATE /* for compatibility with old definition */ ++# define NO_GZCOMPRESS ++#endif ++ ++#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) ++# ifndef HAVE_VSNPRINTF ++# define HAVE_VSNPRINTF ++# endif ++#endif ++ ++#if defined(__CYGWIN__) ++# ifndef HAVE_VSNPRINTF ++# define HAVE_VSNPRINTF ++# endif ++#endif ++ ++#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) ++# ifndef HAVE_VSNPRINTF ++# define HAVE_VSNPRINTF ++# endif ++#endif ++ ++#ifndef HAVE_VSNPRINTF ++# ifdef MSDOS ++/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), ++ but for now we just assume it doesn't. */ ++# define NO_vsnprintf ++# endif ++# ifdef __TURBOC__ ++# define NO_vsnprintf ++# endif ++# ifdef WIN32 ++/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ ++# if !defined(vsnprintf) && !defined(NO_vsnprintf) ++# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) ++# define vsnprintf _vsnprintf ++# endif ++# endif ++# endif ++# ifdef __SASC ++# define NO_vsnprintf ++# endif ++# ifdef VMS ++# define NO_vsnprintf ++# endif ++# ifdef __OS400__ ++# define NO_vsnprintf ++# endif ++# ifdef __MVS__ ++# define NO_vsnprintf ++# endif ++#endif ++ ++/* unlike snprintf (which is required in C99, yet still not supported by ++ Microsoft more than a decade later!), _snprintf does not guarantee null ++ termination of the result -- however this is only used in gzlib.c where ++ the result is assured to fit in the space provided */ ++#ifdef _MSC_VER ++# define snprintf _snprintf ++#endif ++ ++#ifndef local ++# define local static ++#endif ++/* compile with -Dlocal if your debugger can't find static symbols */ ++ ++/* gz* functions always use library allocation functions */ ++#ifndef STDC ++ extern voidp malloc OF((uInt size)); ++ extern void free OF((voidpf ptr)); ++#endif ++ ++/* get errno and strerror definition */ ++#if defined UNDER_CE ++# include <windows.h> ++# define zstrerror() gz_strwinerror((DWORD)GetLastError()) ++#else ++# ifndef NO_STRERROR ++# include <errno.h> ++# define zstrerror() strerror(errno) ++# else ++# define zstrerror() "stdio error (consult errno)" ++# endif ++#endif ++ ++/* provide prototypes for these when building zlib without LFS */ ++#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 ++ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ++ ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ++ ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); ++ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); ++#endif ++ ++/* default memLevel */ ++#if MAX_MEM_LEVEL >= 8 ++# define DEF_MEM_LEVEL 8 ++#else ++# define DEF_MEM_LEVEL MAX_MEM_LEVEL ++#endif ++ ++/* default i/o buffer size -- double this for output when reading (this and ++ twice this must be able to fit in an unsigned type) */ ++#define GZBUFSIZE 8192 ++ ++/* gzip modes, also provide a little integrity check on the passed structure */ ++#define GZ_NONE 0 ++#define GZ_READ 7247 ++#define GZ_WRITE 31153 ++#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ ++ ++/* values for gz_state how */ ++#define LOOK 0 /* look for a gzip header */ ++#define COPY 1 /* copy input directly */ ++#define GZIP 2 /* decompress a gzip stream */ ++ ++/* internal gzip file state data structure */ ++typedef struct { ++ /* exposed contents for gzgetc() macro */ ++ struct gzFile_s x; /* "x" for exposed */ ++ /* x.have: number of bytes available at x.next */ ++ /* x.next: next output data to deliver or write */ ++ /* x.pos: current position in uncompressed data */ ++ /* used for both reading and writing */ ++ int mode; /* see gzip modes above */ ++ int fd; /* file descriptor */ ++ char *path; /* path or fd for error messages */ ++ unsigned size; /* buffer size, zero if not allocated yet */ ++ unsigned want; /* requested buffer size, default is GZBUFSIZE */ ++ unsigned char *in; /* input buffer */ ++ unsigned char *out; /* output buffer (double-sized when reading) */ ++ int direct; /* 0 if processing gzip, 1 if transparent */ ++ /* just for reading */ ++ int how; /* 0: get header, 1: copy, 2: decompress */ ++ z_off64_t start; /* where the gzip data started, for rewinding */ ++ int eof; /* true if end of input file reached */ ++ int past; /* true if read requested past end */ ++ /* just for writing */ ++ int level; /* compression level */ ++ int strategy; /* compression strategy */ ++ /* seek request */ ++ z_off64_t skip; /* amount to skip (already rewound if backwards) */ ++ int seek; /* true if seek request pending */ ++ /* error information */ ++ int err; /* error code */ ++ char *msg; /* error message */ ++ /* zlib inflate or deflate stream */ ++ z_stream strm; /* stream structure in-place (not a pointer) */ ++} gz_state; ++typedef gz_state FAR *gz_statep; ++ ++/* shared functions */ ++void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); ++#if defined UNDER_CE ++char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); ++#endif ++ ++/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t ++ value -- needed when comparing unsigned to z_off64_t, which is signed ++ (possible z_off64_t types off_t, off64_t, and long are all signed) */ ++#ifdef INT_MAX ++# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) ++#else ++unsigned ZLIB_INTERNAL gz_intmax OF((void)); ++# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) ++#endif +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzlib.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzlib.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,658 @@ ++/* ++ * 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. ++ */ ++ ++/* gzlib.c -- zlib functions common to reading and writing gzip files ++ * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "gzguts.h" ++ ++#if defined(_WIN32) && !defined(__BORLANDC__) ++# define LSEEK _lseeki64 ++#else ++#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 ++# define LSEEK lseek64 ++#else ++# define LSEEK lseek ++#endif ++#endif ++ ++/* Local functions */ ++local void gz_reset OF((gz_statep)); ++local gzFile gz_open OF((const void *, int, const char *)); ++ ++#if defined UNDER_CE ++ ++/* Map the Windows error number in ERROR to a locale-dependent error message ++ string and return a pointer to it. Typically, the values for ERROR come ++ from GetLastError. ++ ++ The string pointed to shall not be modified by the application, but may be ++ overwritten by a subsequent call to gz_strwinerror ++ ++ The gz_strwinerror function does not change the current setting of ++ GetLastError. */ ++char ZLIB_INTERNAL *gz_strwinerror (error) ++ DWORD error; ++{ ++ static char buf[1024]; ++ ++ wchar_t *msgbuf; ++ DWORD lasterr = GetLastError(); ++ DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM ++ | FORMAT_MESSAGE_ALLOCATE_BUFFER, ++ NULL, ++ error, ++ 0, /* Default language */ ++ (LPVOID)&msgbuf, ++ 0, ++ NULL); ++ if (chars != 0) { ++ /* If there is an \r\n appended, zap it. */ ++ if (chars >= 2 ++ && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { ++ chars -= 2; ++ msgbuf[chars] = 0; ++ } ++ ++ if (chars > sizeof (buf) - 1) { ++ chars = sizeof (buf) - 1; ++ msgbuf[chars] = 0; ++ } ++ ++ wcstombs(buf, msgbuf, chars + 1); ++ LocalFree(msgbuf); ++ } ++ else { ++ sprintf(buf, "unknown win32 error (%ld)", error); ++ } ++ ++ SetLastError(lasterr); ++ return buf; ++} ++ ++#endif /* UNDER_CE */ ++ ++/* Reset gzip file state */ ++local void gz_reset(state) ++ gz_statep state; ++{ ++ state->x.have = 0; /* no output data available */ ++ if (state->mode == GZ_READ) { /* for reading ... */ ++ state->eof = 0; /* not at end of file */ ++ state->past = 0; /* have not read past end yet */ ++ state->how = LOOK; /* look for gzip header */ ++ } ++ state->seek = 0; /* no seek request pending */ ++ gz_error(state, Z_OK, NULL); /* clear error */ ++ state->x.pos = 0; /* no uncompressed data yet */ ++ state->strm.avail_in = 0; /* no input data yet */ ++} ++ ++/* Open a gzip file either by name or file descriptor. */ ++local gzFile gz_open(path, fd, mode) ++ const void *path; ++ int fd; ++ const char *mode; ++{ ++ gz_statep state; ++ size_t len; ++ int oflag; ++#ifdef O_CLOEXEC ++ int cloexec = 0; ++#endif ++#ifdef O_EXCL ++ int exclusive = 0; ++#endif ++ ++ /* check input */ ++ if (path == NULL) ++ return NULL; ++ ++ /* allocate gzFile structure to return */ ++ state = (gz_statep)malloc(sizeof(gz_state)); ++ if (state == NULL) ++ return NULL; ++ state->size = 0; /* no buffers allocated yet */ ++ state->want = GZBUFSIZE; /* requested buffer size */ ++ state->msg = NULL; /* no error message yet */ ++ ++ /* interpret mode */ ++ state->mode = GZ_NONE; ++ state->level = Z_DEFAULT_COMPRESSION; ++ state->strategy = Z_DEFAULT_STRATEGY; ++ state->direct = 0; ++ while (*mode) { ++ if (*mode >= '0' && *mode <= '9') ++ state->level = *mode - '0'; ++ else ++ switch (*mode) { ++ case 'r': ++ state->mode = GZ_READ; ++ break; ++#ifndef NO_GZCOMPRESS ++ case 'w': ++ state->mode = GZ_WRITE; ++ break; ++ case 'a': ++ state->mode = GZ_APPEND; ++ break; ++#endif ++ case '+': /* can't read and write at the same time */ ++ free(state); ++ return NULL; ++ case 'b': /* ignore -- will request binary anyway */ ++ break; ++#ifdef O_CLOEXEC ++ case 'e': ++ cloexec = 1; ++ break; ++#endif ++#ifdef O_EXCL ++ case 'x': ++ exclusive = 1; ++ break; ++#endif ++ case 'f': ++ state->strategy = Z_FILTERED; ++ break; ++ case 'h': ++ state->strategy = Z_HUFFMAN_ONLY; ++ break; ++ case 'R': ++ state->strategy = Z_RLE; ++ break; ++ case 'F': ++ state->strategy = Z_FIXED; ++ break; ++ case 'T': ++ state->direct = 1; ++ break; ++ default: /* could consider as an error, but just ignore */ ++ ; ++ } ++ mode++; ++ } ++ ++ /* must provide an "r", "w", or "a" */ ++ if (state->mode == GZ_NONE) { ++ free(state); ++ return NULL; ++ } ++ ++ /* can't force transparent read */ ++ if (state->mode == GZ_READ) { ++ if (state->direct) { ++ free(state); ++ return NULL; ++ } ++ state->direct = 1; /* for empty file */ ++ } ++ ++ /* save the path name for error messages */ ++#ifdef _WIN32 ++ if (fd == -2) { ++ len = wcstombs(NULL, path, 0); ++ if (len == (size_t)-1) ++ len = 0; ++ } ++ else ++#endif ++ len = strlen((const char *)path); ++ state->path = (char *)malloc(len + 1); ++ if (state->path == NULL) { ++ free(state); ++ return NULL; ++ } ++#ifdef _WIN32 ++ if (fd == -2) ++ if (len) ++ wcstombs(state->path, path, len + 1); ++ else ++ *(state->path) = 0; ++ else ++#endif ++#if !defined(NO_snprintf) && !defined(NO_vsnprintf) ++ snprintf(state->path, len + 1, "%s", (const char *)path); ++#else ++ strcpy(state->path, path); ++#endif ++ ++ /* compute the flags for open() */ ++ oflag = ++#ifdef O_LARGEFILE ++ O_LARGEFILE | ++#endif ++#ifdef O_BINARY ++ O_BINARY | ++#endif ++#ifdef O_CLOEXEC ++ (cloexec ? O_CLOEXEC : 0) | ++#endif ++ (state->mode == GZ_READ ? ++ O_RDONLY : ++ (O_WRONLY | O_CREAT | ++#ifdef O_EXCL ++ (exclusive ? O_EXCL : 0) | ++#endif ++ (state->mode == GZ_WRITE ? ++ O_TRUNC : ++ O_APPEND))); ++ ++ /* open the file with the appropriate flags (or just use fd) */ ++ state->fd = fd > -1 ? fd : ( ++#ifdef _WIN32 ++ fd == -2 ? _wopen(path, oflag, 0666) : ++#endif ++ open((const char *)path, oflag, 0666)); ++ if (state->fd == -1) { ++ free(state->path); ++ free(state); ++ return NULL; ++ } ++ if (state->mode == GZ_APPEND) ++ state->mode = GZ_WRITE; /* simplify later checks */ ++ ++ /* save the current position for rewinding (only if reading) */ ++ if (state->mode == GZ_READ) { ++ state->start = LSEEK(state->fd, 0, SEEK_CUR); ++ if (state->start == -1) state->start = 0; ++ } ++ ++ /* initialize stream */ ++ gz_reset(state); ++ ++ /* return stream */ ++ return (gzFile)state; ++} ++ ++/* -- see zlib.h -- */ ++gzFile ZEXPORT gzopen(path, mode) ++ const char *path; ++ const char *mode; ++{ ++ return gz_open(path, -1, mode); ++} ++ ++/* -- see zlib.h -- */ ++gzFile ZEXPORT gzopen64(path, mode) ++ const char *path; ++ const char *mode; ++{ ++ return gz_open(path, -1, mode); ++} ++ ++/* -- see zlib.h -- */ ++gzFile ZEXPORT gzdopen(fd, mode) ++ int fd; ++ const char *mode; ++{ ++ char *path; /* identifier for error messages */ ++ gzFile gz; ++ ++ if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) ++ return NULL; ++#if !defined(NO_snprintf) && !defined(NO_vsnprintf) ++ snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */ ++#else ++ sprintf(path, "<fd:%d>", fd); /* for debugging */ ++#endif ++ gz = gz_open(path, fd, mode); ++ free(path); ++ return gz; ++} ++ ++/* -- see zlib.h -- */ ++#ifdef _WIN32 ++gzFile ZEXPORT gzopen_w(path, mode) ++ const wchar_t *path; ++ const char *mode; ++{ ++ return gz_open(path, -2, mode); ++} ++#endif ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzbuffer(file, size) ++ gzFile file; ++ unsigned size; ++{ ++ gz_statep state; ++ ++ /* get internal structure and check integrity */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ if (state->mode != GZ_READ && state->mode != GZ_WRITE) ++ return -1; ++ ++ /* make sure we haven't already allocated memory */ ++ if (state->size != 0) ++ return -1; ++ ++ /* check and set requested size */ ++ if (size < 2) ++ size = 2; /* need two bytes to check magic header */ ++ state->want = size; ++ return 0; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzrewind(file) ++ gzFile file; ++{ ++ gz_statep state; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ ++ /* check that we're reading and that there's no error */ ++ if (state->mode != GZ_READ || ++ (state->err != Z_OK && state->err != Z_BUF_ERROR)) ++ return -1; ++ ++ /* back up and start over */ ++ if (LSEEK(state->fd, state->start, SEEK_SET) == -1) ++ return -1; ++ gz_reset(state); ++ return 0; ++} ++ ++/* -- see zlib.h -- */ ++z_off64_t ZEXPORT gzseek64(file, offset, whence) ++ gzFile file; ++ z_off64_t offset; ++ int whence; ++{ ++ unsigned n; ++ z_off64_t ret; ++ gz_statep state; ++ ++ /* get internal structure and check integrity */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ if (state->mode != GZ_READ && state->mode != GZ_WRITE) ++ return -1; ++ ++ /* check that there's no error */ ++ if (state->err != Z_OK && state->err != Z_BUF_ERROR) ++ return -1; ++ ++ /* can only seek from start or relative to current position */ ++ if (whence != SEEK_SET && whence != SEEK_CUR) ++ return -1; ++ ++ /* normalize offset to a SEEK_CUR specification */ ++ if (whence == SEEK_SET) ++ offset -= state->x.pos; ++ else if (state->seek) ++ offset += state->skip; ++ state->seek = 0; ++ ++ /* if within raw area while reading, just go there */ ++ if (state->mode == GZ_READ && state->how == COPY && ++ state->x.pos + offset >= 0) { ++ ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); ++ if (ret == -1) ++ return -1; ++ state->x.have = 0; ++ state->eof = 0; ++ state->past = 0; ++ state->seek = 0; ++ gz_error(state, Z_OK, NULL); ++ state->strm.avail_in = 0; ++ state->x.pos += offset; ++ return state->x.pos; ++ } ++ ++ /* calculate skip amount, rewinding if needed for back seek when reading */ ++ if (offset < 0) { ++ if (state->mode != GZ_READ) /* writing -- can't go backwards */ ++ return -1; ++ offset += state->x.pos; ++ if (offset < 0) /* before start of file! */ ++ return -1; ++ if (gzrewind(file) == -1) /* rewind, then skip to offset */ ++ return -1; ++ } ++ ++ /* if reading, skip what's in output buffer (one less gzgetc() check) */ ++ if (state->mode == GZ_READ) { ++ n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? ++ (unsigned)offset : state->x.have; ++ state->x.have -= n; ++ state->x.next += n; ++ state->x.pos += n; ++ offset -= n; ++ } ++ ++ /* request skip (if not zero) */ ++ if (offset) { ++ state->seek = 1; ++ state->skip = offset; ++ } ++ return state->x.pos + offset; ++} ++ ++/* -- see zlib.h -- */ ++z_off_t ZEXPORT gzseek(file, offset, whence) ++ gzFile file; ++ z_off_t offset; ++ int whence; ++{ ++ z_off64_t ret; ++ ++ ret = gzseek64(file, (z_off64_t)offset, whence); ++ return ret == (z_off_t)ret ? (z_off_t)ret : -1; ++} ++ ++/* -- see zlib.h -- */ ++z_off64_t ZEXPORT gztell64(file) ++ gzFile file; ++{ ++ gz_statep state; ++ ++ /* get internal structure and check integrity */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ if (state->mode != GZ_READ && state->mode != GZ_WRITE) ++ return -1; ++ ++ /* return position */ ++ return state->x.pos + (state->seek ? state->skip : 0); ++} ++ ++/* -- see zlib.h -- */ ++z_off_t ZEXPORT gztell(file) ++ gzFile file; ++{ ++ z_off64_t ret; ++ ++ ret = gztell64(file); ++ return ret == (z_off_t)ret ? (z_off_t)ret : -1; ++} ++ ++/* -- see zlib.h -- */ ++z_off64_t ZEXPORT gzoffset64(file) ++ gzFile file; ++{ ++ z_off64_t offset; ++ gz_statep state; ++ ++ /* get internal structure and check integrity */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ if (state->mode != GZ_READ && state->mode != GZ_WRITE) ++ return -1; ++ ++ /* compute and return effective offset in file */ ++ offset = LSEEK(state->fd, 0, SEEK_CUR); ++ if (offset == -1) ++ return -1; ++ if (state->mode == GZ_READ) /* reading */ ++ offset -= state->strm.avail_in; /* don't count buffered input */ ++ return offset; ++} ++ ++/* -- see zlib.h -- */ ++z_off_t ZEXPORT gzoffset(file) ++ gzFile file; ++{ ++ z_off64_t ret; ++ ++ ret = gzoffset64(file); ++ return ret == (z_off_t)ret ? (z_off_t)ret : -1; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzeof(file) ++ gzFile file; ++{ ++ gz_statep state; ++ ++ /* get internal structure and check integrity */ ++ if (file == NULL) ++ return 0; ++ state = (gz_statep)file; ++ if (state->mode != GZ_READ && state->mode != GZ_WRITE) ++ return 0; ++ ++ /* return end-of-file state */ ++ return state->mode == GZ_READ ? state->past : 0; ++} ++ ++/* -- see zlib.h -- */ ++const char * ZEXPORT gzerror(file, errnum) ++ gzFile file; ++ int *errnum; ++{ ++ gz_statep state; ++ ++ /* get internal structure and check integrity */ ++ if (file == NULL) ++ return NULL; ++ state = (gz_statep)file; ++ if (state->mode != GZ_READ && state->mode != GZ_WRITE) ++ return NULL; ++ ++ /* return error information */ ++ if (errnum != NULL) ++ *errnum = state->err; ++ return state->err == Z_MEM_ERROR ? "out of memory" : ++ (state->msg == NULL ? "" : state->msg); ++} ++ ++/* -- see zlib.h -- */ ++void ZEXPORT gzclearerr(file) ++ gzFile file; ++{ ++ gz_statep state; ++ ++ /* get internal structure and check integrity */ ++ if (file == NULL) ++ return; ++ state = (gz_statep)file; ++ if (state->mode != GZ_READ && state->mode != GZ_WRITE) ++ return; ++ ++ /* clear error and end-of-file */ ++ if (state->mode == GZ_READ) { ++ state->eof = 0; ++ state->past = 0; ++ } ++ gz_error(state, Z_OK, NULL); ++} ++ ++/* Create an error message in allocated memory and set state->err and ++ state->msg accordingly. Free any previous error message already there. Do ++ not try to free or allocate space if the error is Z_MEM_ERROR (out of ++ memory). Simply save the error message as a static string. If there is an ++ allocation failure constructing the error message, then convert the error to ++ out of memory. */ ++void ZLIB_INTERNAL gz_error(state, err, msg) ++ gz_statep state; ++ int err; ++ const char *msg; ++{ ++ /* free previously allocated message and clear */ ++ if (state->msg != NULL) { ++ if (state->err != Z_MEM_ERROR) ++ free(state->msg); ++ state->msg = NULL; ++ } ++ ++ /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ ++ if (err != Z_OK && err != Z_BUF_ERROR) ++ state->x.have = 0; ++ ++ /* set error code, and if no message, then done */ ++ state->err = err; ++ if (msg == NULL) ++ return; ++ ++ /* for an out of memory error, return literal string when requested */ ++ if (err == Z_MEM_ERROR) ++ return; ++ ++ /* construct error message with path */ ++ if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == ++ NULL) { ++ state->err = Z_MEM_ERROR; ++ return; ++ } ++#if !defined(NO_snprintf) && !defined(NO_vsnprintf) ++ snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, ++ "%s%s%s", state->path, ": ", msg); ++#else ++ strcpy(state->msg, state->path); ++ strcat(state->msg, ": "); ++ strcat(state->msg, msg); ++#endif ++ return; ++} ++ ++#ifndef INT_MAX ++/* portably return maximum value for an int (when limits.h presumed not ++ available) -- we need to do this to cover cases where 2's complement not ++ used, since C standard permits 1's complement and sign-bit representations, ++ otherwise we could just use ((unsigned)-1) >> 1 */ ++unsigned ZLIB_INTERNAL gz_intmax() ++{ ++ unsigned p, q; ++ ++ p = 1; ++ do { ++ q = p; ++ p <<= 1; ++ p++; ++ } while (p > q); ++ return q >> 1; ++} ++#endif +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzread.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzread.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,618 @@ ++/* ++ * 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. ++ */ ++ ++/* gzread.c -- zlib functions for reading gzip files ++ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "gzguts.h" ++ ++/* Local functions */ ++local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); ++local int gz_avail OF((gz_statep)); ++local int gz_look OF((gz_statep)); ++local int gz_decomp OF((gz_statep)); ++local int gz_fetch OF((gz_statep)); ++local int gz_skip OF((gz_statep, z_off64_t)); ++ ++/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from ++ state->fd, and update state->eof, state->err, and state->msg as appropriate. ++ This function needs to loop on read(), since read() is not guaranteed to ++ read the number of bytes requested, depending on the type of descriptor. */ ++local int gz_load(state, buf, len, have) ++ gz_statep state; ++ unsigned char *buf; ++ unsigned len; ++ unsigned *have; ++{ ++ int ret; ++ ++ *have = 0; ++ do { ++ ret = read(state->fd, buf + *have, len - *have); ++ if (ret <= 0) ++ break; ++ *have += ret; ++ } while (*have < len); ++ if (ret < 0) { ++ gz_error(state, Z_ERRNO, zstrerror()); ++ return -1; ++ } ++ if (ret == 0) ++ state->eof = 1; ++ return 0; ++} ++ ++/* Load up input buffer and set eof flag if last data loaded -- return -1 on ++ error, 0 otherwise. Note that the eof flag is set when the end of the input ++ file is reached, even though there may be unused data in the buffer. Once ++ that data has been used, no more attempts will be made to read the file. ++ If strm->avail_in != 0, then the current data is moved to the beginning of ++ the input buffer, and then the remainder of the buffer is loaded with the ++ available data from the input file. */ ++local int gz_avail(state) ++ gz_statep state; ++{ ++ unsigned got; ++ z_streamp strm = &(state->strm); ++ ++ if (state->err != Z_OK && state->err != Z_BUF_ERROR) ++ return -1; ++ if (state->eof == 0) { ++ if (strm->avail_in) { /* copy what's there to the start */ ++ unsigned char *p = state->in; ++ unsigned const char *q = strm->next_in; ++ unsigned n = strm->avail_in; ++ do { ++ *p++ = *q++; ++ } while (--n); ++ } ++ if (gz_load(state, state->in + strm->avail_in, ++ state->size - strm->avail_in, &got) == -1) ++ return -1; ++ strm->avail_in += got; ++ strm->next_in = state->in; ++ } ++ return 0; ++} ++ ++/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. ++ If this is the first time in, allocate required memory. state->how will be ++ left unchanged if there is no more input data available, will be set to COPY ++ if there is no gzip header and direct copying will be performed, or it will ++ be set to GZIP for decompression. If direct copying, then leftover input ++ data from the input buffer will be copied to the output buffer. In that ++ case, all further file reads will be directly to either the output buffer or ++ a user buffer. If decompressing, the inflate state will be initialized. ++ gz_look() will return 0 on success or -1 on failure. */ ++local int gz_look(state) ++ gz_statep state; ++{ ++ z_streamp strm = &(state->strm); ++ ++ /* allocate read buffers and inflate memory */ ++ if (state->size == 0) { ++ /* allocate buffers */ ++ state->in = (unsigned char *)malloc(state->want); ++ state->out = (unsigned char *)malloc(state->want << 1); ++ if (state->in == NULL || state->out == NULL) { ++ if (state->out != NULL) ++ free(state->out); ++ if (state->in != NULL) ++ free(state->in); ++ gz_error(state, Z_MEM_ERROR, "out of memory"); ++ return -1; ++ } ++ state->size = state->want; ++ ++ /* allocate inflate memory */ ++ state->strm.zalloc = Z_NULL; ++ state->strm.zfree = Z_NULL; ++ state->strm.opaque = Z_NULL; ++ state->strm.avail_in = 0; ++ state->strm.next_in = Z_NULL; ++ if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ ++ free(state->out); ++ free(state->in); ++ state->size = 0; ++ gz_error(state, Z_MEM_ERROR, "out of memory"); ++ return -1; ++ } ++ } ++ ++ /* get at least the magic bytes in the input buffer */ ++ if (strm->avail_in < 2) { ++ if (gz_avail(state) == -1) ++ return -1; ++ if (strm->avail_in == 0) ++ return 0; ++ } ++ ++ /* look for gzip magic bytes -- if there, do gzip decoding (note: there is ++ a logical dilemma here when considering the case of a partially written ++ gzip file, to wit, if a single 31 byte is written, then we cannot tell ++ whether this is a single-byte file, or just a partially written gzip ++ file -- for here we assume that if a gzip file is being written, then ++ the header will be written in a single operation, so that reading a ++ single byte is sufficient indication that it is not a gzip file) */ ++ if (strm->avail_in > 1 && ++ strm->next_in[0] == 31 && strm->next_in[1] == 139) { ++ inflateReset(strm); ++ state->how = GZIP; ++ state->direct = 0; ++ return 0; ++ } ++ ++ /* no gzip header -- if we were decoding gzip before, then this is trailing ++ garbage. Ignore the trailing garbage and finish. */ ++ if (state->direct == 0) { ++ strm->avail_in = 0; ++ state->eof = 1; ++ state->x.have = 0; ++ return 0; ++ } ++ ++ /* doing raw i/o, copy any leftover input to output -- this assumes that ++ the output buffer is larger than the input buffer, which also assures ++ space for gzungetc() */ ++ state->x.next = state->out; ++ if (strm->avail_in) { ++ memcpy(state->x.next, strm->next_in, strm->avail_in); ++ state->x.have = strm->avail_in; ++ strm->avail_in = 0; ++ } ++ state->how = COPY; ++ state->direct = 1; ++ return 0; ++} ++ ++/* Decompress from input to the provided next_out and avail_out in the state. ++ On return, state->x.have and state->x.next point to the just decompressed ++ data. If the gzip stream completes, state->how is reset to LOOK to look for ++ the next gzip stream or raw data, once state->x.have is depleted. Returns 0 ++ on success, -1 on failure. */ ++local int gz_decomp(state) ++ gz_statep state; ++{ ++ int ret = Z_OK; ++ unsigned had; ++ z_streamp strm = &(state->strm); ++ ++ /* fill output buffer up to end of deflate stream */ ++ had = strm->avail_out; ++ do { ++ /* get more input for inflate() */ ++ if (strm->avail_in == 0 && gz_avail(state) == -1) ++ return -1; ++ if (strm->avail_in == 0) { ++ gz_error(state, Z_BUF_ERROR, "unexpected end of file"); ++ break; ++ } ++ ++ /* decompress and handle errors */ ++ ret = inflate(strm, Z_NO_FLUSH); ++ if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { ++ gz_error(state, Z_STREAM_ERROR, ++ "internal error: inflate stream corrupt"); ++ return -1; ++ } ++ if (ret == Z_MEM_ERROR) { ++ gz_error(state, Z_MEM_ERROR, "out of memory"); ++ return -1; ++ } ++ if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ ++ gz_error(state, Z_DATA_ERROR, ++ strm->msg == NULL ? "compressed data error" : strm->msg); ++ return -1; ++ } ++ } while (strm->avail_out && ret != Z_STREAM_END); ++ ++ /* update available output */ ++ state->x.have = had - strm->avail_out; ++ state->x.next = strm->next_out - state->x.have; ++ ++ /* if the gzip stream completed successfully, look for another */ ++ if (ret == Z_STREAM_END) ++ state->how = LOOK; ++ ++ /* good decompression */ ++ return 0; ++} ++ ++/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. ++ Data is either copied from the input file or decompressed from the input ++ file depending on state->how. If state->how is LOOK, then a gzip header is ++ looked for to determine whether to copy or decompress. Returns -1 on error, ++ otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the ++ end of the input file has been reached and all data has been processed. */ ++local int gz_fetch(state) ++ gz_statep state; ++{ ++ z_streamp strm = &(state->strm); ++ ++ do { ++ switch(state->how) { ++ case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ ++ if (gz_look(state) == -1) ++ return -1; ++ if (state->how == LOOK) ++ return 0; ++ break; ++ case COPY: /* -> COPY */ ++ if (gz_load(state, state->out, state->size << 1, &(state->x.have)) ++ == -1) ++ return -1; ++ state->x.next = state->out; ++ return 0; ++ case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ ++ strm->avail_out = state->size << 1; ++ strm->next_out = state->out; ++ if (gz_decomp(state) == -1) ++ return -1; ++ } ++ } while (state->x.have == 0 && (!state->eof || strm->avail_in)); ++ return 0; ++} ++ ++/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ ++local int gz_skip(state, len) ++ gz_statep state; ++ z_off64_t len; ++{ ++ unsigned n; ++ ++ /* skip over len bytes or reach end-of-file, whichever comes first */ ++ while (len) ++ /* skip over whatever is in output buffer */ ++ if (state->x.have) { ++ n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? ++ (unsigned)len : state->x.have; ++ state->x.have -= n; ++ state->x.next += n; ++ state->x.pos += n; ++ len -= n; ++ } ++ ++ /* output buffer empty -- return if we're at the end of the input */ ++ else if (state->eof && state->strm.avail_in == 0) ++ break; ++ ++ /* need more data to skip -- load up output buffer */ ++ else { ++ /* get more output, looking for header if required */ ++ if (gz_fetch(state) == -1) ++ return -1; ++ } ++ return 0; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzread(file, buf, len) ++ gzFile file; ++ voidp buf; ++ unsigned len; ++{ ++ unsigned got, n; ++ gz_statep state; ++ z_streamp strm; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ strm = &(state->strm); ++ ++ /* check that we're reading and that there's no (serious) error */ ++ if (state->mode != GZ_READ || ++ (state->err != Z_OK && state->err != Z_BUF_ERROR)) ++ return -1; ++ ++ /* since an int is returned, make sure len fits in one, otherwise return ++ with an error (this avoids the flaw in the interface) */ ++ if ((int)len < 0) { ++ gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); ++ return -1; ++ } ++ ++ /* if len is zero, avoid unnecessary operations */ ++ if (len == 0) ++ return 0; ++ ++ /* process a skip request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_skip(state, state->skip) == -1) ++ return -1; ++ } ++ ++ /* get len bytes to buf, or less than len if at the end */ ++ got = 0; ++ do { ++ /* first just try copying data from the output buffer */ ++ if (state->x.have) { ++ n = state->x.have > len ? len : state->x.have; ++ memcpy(buf, state->x.next, n); ++ state->x.next += n; ++ state->x.have -= n; ++ } ++ ++ /* output buffer empty -- return if we're at the end of the input */ ++ else if (state->eof && strm->avail_in == 0) { ++ state->past = 1; /* tried to read past end */ ++ break; ++ } ++ ++ /* need output data -- for small len or new stream load up our output ++ buffer */ ++ else if (state->how == LOOK || len < (state->size << 1)) { ++ /* get more output, looking for header if required */ ++ if (gz_fetch(state) == -1) ++ return -1; ++ continue; /* no progress yet -- go back to copy above */ ++ /* the copy above assures that we will leave with space in the ++ output buffer, allowing at least one gzungetc() to succeed */ ++ } ++ ++ /* large len -- read directly into user buffer */ ++ else if (state->how == COPY) { /* read directly */ ++ if (gz_load(state, (unsigned char *)buf, len, &n) == -1) ++ return -1; ++ } ++ ++ /* large len -- decompress directly into user buffer */ ++ else { /* state->how == GZIP */ ++ strm->avail_out = len; ++ strm->next_out = (unsigned char *)buf; ++ if (gz_decomp(state) == -1) ++ return -1; ++ n = state->x.have; ++ state->x.have = 0; ++ } ++ ++ /* update progress */ ++ len -= n; ++ buf = (char *)buf + n; ++ got += n; ++ state->x.pos += n; ++ } while (len); ++ ++ /* return number of bytes read into user buffer (will fit in int) */ ++ return (int)got; ++} ++ ++/* -- see zlib.h -- */ ++#ifdef Z_PREFIX_SET ++# undef z_gzgetc ++#else ++# undef gzgetc ++#endif ++int ZEXPORT gzgetc(file) ++ gzFile file; ++{ ++ int ret; ++ unsigned char buf[1]; ++ gz_statep state; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ ++ /* check that we're reading and that there's no (serious) error */ ++ if (state->mode != GZ_READ || ++ (state->err != Z_OK && state->err != Z_BUF_ERROR)) ++ return -1; ++ ++ /* try output buffer (no need to check for skip request) */ ++ if (state->x.have) { ++ state->x.have--; ++ state->x.pos++; ++ return *(state->x.next)++; ++ } ++ ++ /* nothing there -- try gzread() */ ++ ret = gzread(file, buf, 1); ++ return ret < 1 ? -1 : buf[0]; ++} ++ ++int ZEXPORT gzgetc_(file) ++gzFile file; ++{ ++ return gzgetc(file); ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzungetc(c, file) ++ int c; ++ gzFile file; ++{ ++ gz_statep state; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ ++ /* check that we're reading and that there's no (serious) error */ ++ if (state->mode != GZ_READ || ++ (state->err != Z_OK && state->err != Z_BUF_ERROR)) ++ return -1; ++ ++ /* process a skip request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_skip(state, state->skip) == -1) ++ return -1; ++ } ++ ++ /* can't push EOF */ ++ if (c < 0) ++ return -1; ++ ++ /* if output buffer empty, put byte at end (allows more pushing) */ ++ if (state->x.have == 0) { ++ state->x.have = 1; ++ state->x.next = state->out + (state->size << 1) - 1; ++ state->x.next[0] = c; ++ state->x.pos--; ++ state->past = 0; ++ return c; ++ } ++ ++ /* if no room, give up (must have already done a gzungetc()) */ ++ if (state->x.have == (state->size << 1)) { ++ gz_error(state, Z_DATA_ERROR, "out of room to push characters"); ++ return -1; ++ } ++ ++ /* slide output data if needed and insert byte before existing data */ ++ if (state->x.next == state->out) { ++ unsigned char *src = state->out + state->x.have; ++ unsigned char *dest = state->out + (state->size << 1); ++ while (src > state->out) ++ *--dest = *--src; ++ state->x.next = dest; ++ } ++ state->x.have++; ++ state->x.next--; ++ state->x.next[0] = c; ++ state->x.pos--; ++ state->past = 0; ++ return c; ++} ++ ++/* -- see zlib.h -- */ ++char * ZEXPORT gzgets(file, buf, len) ++ gzFile file; ++ char *buf; ++ int len; ++{ ++ unsigned left, n; ++ char *str; ++ unsigned char *eol; ++ gz_statep state; ++ ++ /* check parameters and get internal structure */ ++ if (file == NULL || buf == NULL || len < 1) ++ return NULL; ++ state = (gz_statep)file; ++ ++ /* check that we're reading and that there's no (serious) error */ ++ if (state->mode != GZ_READ || ++ (state->err != Z_OK && state->err != Z_BUF_ERROR)) ++ return NULL; ++ ++ /* process a skip request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_skip(state, state->skip) == -1) ++ return NULL; ++ } ++ ++ /* copy output bytes up to new line or len - 1, whichever comes first -- ++ append a terminating zero to the string (we don't check for a zero in ++ the contents, let the user worry about that) */ ++ str = buf; ++ left = (unsigned)len - 1; ++ if (left) do { ++ /* assure that something is in the output buffer */ ++ if (state->x.have == 0 && gz_fetch(state) == -1) ++ return NULL; /* error */ ++ if (state->x.have == 0) { /* end of file */ ++ state->past = 1; /* read past end */ ++ break; /* return what we have */ ++ } ++ ++ /* look for end-of-line in current output buffer */ ++ n = state->x.have > left ? left : state->x.have; ++ eol = (unsigned char *)memchr(state->x.next, '\n', n); ++ if (eol != NULL) ++ n = (unsigned)(eol - state->x.next) + 1; ++ ++ /* copy through end-of-line, or remainder if not found */ ++ memcpy(buf, state->x.next, n); ++ state->x.have -= n; ++ state->x.next += n; ++ state->x.pos += n; ++ left -= n; ++ buf += n; ++ } while (left && eol == NULL); ++ ++ /* return terminated string, or if nothing, end of file */ ++ if (buf == str) ++ return NULL; ++ buf[0] = 0; ++ return str; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzdirect(file) ++ gzFile file; ++{ ++ gz_statep state; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return 0; ++ state = (gz_statep)file; ++ ++ /* if the state is not known, but we can find out, then do so (this is ++ mainly for right after a gzopen() or gzdopen()) */ ++ if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) ++ (void)gz_look(state); ++ ++ /* return 1 if transparent, 0 if processing a gzip stream */ ++ return state->direct; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzclose_r(file) ++ gzFile file; ++{ ++ int ret, err; ++ gz_statep state; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return Z_STREAM_ERROR; ++ state = (gz_statep)file; ++ ++ /* check that we're reading */ ++ if (state->mode != GZ_READ) ++ return Z_STREAM_ERROR; ++ ++ /* free memory and close file */ ++ if (state->size) { ++ inflateEnd(&(state->strm)); ++ free(state->out); ++ free(state->in); ++ } ++ err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; ++ gz_error(state, Z_OK, NULL); ++ free(state->path); ++ ret = close(state->fd); ++ free(state); ++ return ret ? Z_ERRNO : err; ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzwrite.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/gzwrite.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,601 @@ ++/* ++ * 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. ++ */ ++ ++/* gzwrite.c -- zlib functions for writing gzip files ++ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "gzguts.h" ++ ++/* Local functions */ ++local int gz_init OF((gz_statep)); ++local int gz_comp OF((gz_statep, int)); ++local int gz_zero OF((gz_statep, z_off64_t)); ++ ++/* Initialize state for writing a gzip file. Mark initialization by setting ++ state->size to non-zero. Return -1 on failure or 0 on success. */ ++local int gz_init(state) ++ gz_statep state; ++{ ++ int ret; ++ z_streamp strm = &(state->strm); ++ ++ /* allocate input buffer */ ++ state->in = (unsigned char *)malloc(state->want); ++ if (state->in == NULL) { ++ gz_error(state, Z_MEM_ERROR, "out of memory"); ++ return -1; ++ } ++ ++ /* only need output buffer and deflate state if compressing */ ++ if (!state->direct) { ++ /* allocate output buffer */ ++ state->out = (unsigned char *)malloc(state->want); ++ if (state->out == NULL) { ++ free(state->in); ++ gz_error(state, Z_MEM_ERROR, "out of memory"); ++ return -1; ++ } ++ ++ /* allocate deflate memory, set up for gzip compression */ ++ strm->zalloc = Z_NULL; ++ strm->zfree = Z_NULL; ++ strm->opaque = Z_NULL; ++ ret = deflateInit2(strm, state->level, Z_DEFLATED, ++ MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); ++ if (ret != Z_OK) { ++ free(state->out); ++ free(state->in); ++ gz_error(state, Z_MEM_ERROR, "out of memory"); ++ return -1; ++ } ++ } ++ ++ /* mark state as initialized */ ++ state->size = state->want; ++ ++ /* initialize write buffer if compressing */ ++ if (!state->direct) { ++ strm->avail_out = state->size; ++ strm->next_out = state->out; ++ state->x.next = strm->next_out; ++ } ++ return 0; ++} ++ ++/* Compress whatever is at avail_in and next_in and write to the output file. ++ Return -1 if there is an error writing to the output file, otherwise 0. ++ flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, ++ then the deflate() state is reset to start a new gzip stream. If gz->direct ++ is true, then simply write to the output file without compressing, and ++ ignore flush. */ ++local int gz_comp(state, flush) ++ gz_statep state; ++ int flush; ++{ ++ int ret, got; ++ unsigned have; ++ z_streamp strm = &(state->strm); ++ ++ /* allocate memory if this is the first time through */ ++ if (state->size == 0 && gz_init(state) == -1) ++ return -1; ++ ++ /* write directly if requested */ ++ if (state->direct) { ++ got = write(state->fd, strm->next_in, strm->avail_in); ++ if (got < 0 || (unsigned)got != strm->avail_in) { ++ gz_error(state, Z_ERRNO, zstrerror()); ++ return -1; ++ } ++ strm->avail_in = 0; ++ return 0; ++ } ++ ++ /* run deflate() on provided input until it produces no more output */ ++ ret = Z_OK; ++ do { ++ /* write out current buffer contents if full, or if flushing, but if ++ doing Z_FINISH then don't write until we get to Z_STREAM_END */ ++ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && ++ (flush != Z_FINISH || ret == Z_STREAM_END))) { ++ have = (unsigned)(strm->next_out - state->x.next); ++ if (have && ((got = write(state->fd, state->x.next, have)) < 0 || ++ (unsigned)got != have)) { ++ gz_error(state, Z_ERRNO, zstrerror()); ++ return -1; ++ } ++ if (strm->avail_out == 0) { ++ strm->avail_out = state->size; ++ strm->next_out = state->out; ++ } ++ state->x.next = strm->next_out; ++ } ++ ++ /* compress */ ++ have = strm->avail_out; ++ ret = deflate(strm, flush); ++ if (ret == Z_STREAM_ERROR) { ++ gz_error(state, Z_STREAM_ERROR, ++ "internal error: deflate stream corrupt"); ++ return -1; ++ } ++ have -= strm->avail_out; ++ } while (have); ++ ++ /* if that completed a deflate stream, allow another to start */ ++ if (flush == Z_FINISH) ++ deflateReset(strm); ++ ++ /* all done, no errors */ ++ return 0; ++} ++ ++/* Compress len zeros to output. Return -1 on error, 0 on success. */ ++local int gz_zero(state, len) ++ gz_statep state; ++ z_off64_t len; ++{ ++ int first; ++ unsigned n; ++ z_streamp strm = &(state->strm); ++ ++ /* consume whatever's left in the input buffer */ ++ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) ++ return -1; ++ ++ /* compress len zeros (len guaranteed > 0) */ ++ first = 1; ++ while (len) { ++ n = GT_OFF(state->size) || (z_off64_t)state->size > len ? ++ (unsigned)len : state->size; ++ if (first) { ++ memset(state->in, 0, n); ++ first = 0; ++ } ++ strm->avail_in = n; ++ strm->next_in = state->in; ++ state->x.pos += n; ++ if (gz_comp(state, Z_NO_FLUSH) == -1) ++ return -1; ++ len -= n; ++ } ++ return 0; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzwrite(file, buf, len) ++ gzFile file; ++ voidpc buf; ++ unsigned len; ++{ ++ unsigned put = len; ++ gz_statep state; ++ z_streamp strm; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return 0; ++ state = (gz_statep)file; ++ strm = &(state->strm); ++ ++ /* check that we're writing and that there's no error */ ++ if (state->mode != GZ_WRITE || state->err != Z_OK) ++ return 0; ++ ++ /* since an int is returned, make sure len fits in one, otherwise return ++ with an error (this avoids the flaw in the interface) */ ++ if ((int)len < 0) { ++ gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); ++ return 0; ++ } ++ ++ /* if len is zero, avoid unnecessary operations */ ++ if (len == 0) ++ return 0; ++ ++ /* allocate memory if this is the first time through */ ++ if (state->size == 0 && gz_init(state) == -1) ++ return 0; ++ ++ /* check for seek request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_zero(state, state->skip) == -1) ++ return 0; ++ } ++ ++ /* for small len, copy to input buffer, otherwise compress directly */ ++ if (len < state->size) { ++ /* copy to input buffer, compress when full */ ++ do { ++ unsigned have, copy; ++ ++ if (strm->avail_in == 0) ++ strm->next_in = state->in; ++ have = (unsigned)((strm->next_in + strm->avail_in) - state->in); ++ copy = state->size - have; ++ if (copy > len) ++ copy = len; ++ memcpy(state->in + have, buf, copy); ++ strm->avail_in += copy; ++ state->x.pos += copy; ++ buf = (const char *)buf + copy; ++ len -= copy; ++ if (len && gz_comp(state, Z_NO_FLUSH) == -1) ++ return 0; ++ } while (len); ++ } ++ else { ++ /* consume whatever's left in the input buffer */ ++ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) ++ return 0; ++ ++ /* directly compress user buffer to file */ ++ strm->avail_in = len; ++ strm->next_in = (z_const Bytef *)buf; ++ state->x.pos += len; ++ if (gz_comp(state, Z_NO_FLUSH) == -1) ++ return 0; ++ } ++ ++ /* input was all buffered or compressed (put will fit in int) */ ++ return (int)put; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzputc(file, c) ++ gzFile file; ++ int c; ++{ ++ unsigned have; ++ unsigned char buf[1]; ++ gz_statep state; ++ z_streamp strm; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ strm = &(state->strm); ++ ++ /* check that we're writing and that there's no error */ ++ if (state->mode != GZ_WRITE || state->err != Z_OK) ++ return -1; ++ ++ /* check for seek request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_zero(state, state->skip) == -1) ++ return -1; ++ } ++ ++ /* try writing to input buffer for speed (state->size == 0 if buffer not ++ initialized) */ ++ if (state->size) { ++ if (strm->avail_in == 0) ++ strm->next_in = state->in; ++ have = (unsigned)((strm->next_in + strm->avail_in) - state->in); ++ if (have < state->size) { ++ state->in[have] = c; ++ strm->avail_in++; ++ state->x.pos++; ++ return c & 0xff; ++ } ++ } ++ ++ /* no room in buffer or not initialized, use gz_write() */ ++ buf[0] = c; ++ if (gzwrite(file, buf, 1) != 1) ++ return -1; ++ return c & 0xff; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzputs(file, str) ++ gzFile file; ++ const char *str; ++{ ++ int ret; ++ unsigned len; ++ ++ /* write string */ ++ len = (unsigned)strlen(str); ++ ret = gzwrite(file, str, len); ++ return ret == 0 && len != 0 ? -1 : ret; ++} ++ ++#if defined(STDC) || defined(Z_HAVE_STDARG_H) ++#include <stdarg.h> ++ ++/* -- see zlib.h -- */ ++int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) ++{ ++ int size, len; ++ gz_statep state; ++ z_streamp strm; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ strm = &(state->strm); ++ ++ /* check that we're writing and that there's no error */ ++ if (state->mode != GZ_WRITE || state->err != Z_OK) ++ return 0; ++ ++ /* make sure we have some buffer space */ ++ if (state->size == 0 && gz_init(state) == -1) ++ return 0; ++ ++ /* check for seek request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_zero(state, state->skip) == -1) ++ return 0; ++ } ++ ++ /* consume whatever's left in the input buffer */ ++ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) ++ return 0; ++ ++ /* do the printf() into the input buffer, put length in len */ ++ size = (int)(state->size); ++ state->in[size - 1] = 0; ++#ifdef NO_vsnprintf ++# ifdef HAS_vsprintf_void ++ (void)vsprintf((char *)(state->in), format, va); ++ for (len = 0; len < size; len++) ++ if (state->in[len] == 0) break; ++# else ++ len = vsprintf((char *)(state->in), format, va); ++# endif ++#else ++# ifdef HAS_vsnprintf_void ++ (void)vsnprintf((char *)(state->in), size, format, va); ++ len = strlen((char *)(state->in)); ++# else ++ len = vsnprintf((char *)(state->in), size, format, va); ++# endif ++#endif ++ ++ /* check that printf() results fit in buffer */ ++ if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) ++ return 0; ++ ++ /* update buffer and position, defer compression until needed */ ++ strm->avail_in = (unsigned)len; ++ strm->next_in = state->in; ++ state->x.pos += len; ++ return len; ++} ++ ++int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) ++{ ++ va_list va; ++ int ret; ++ ++ va_start(va, format); ++ ret = gzvprintf(file, format, va); ++ va_end(va); ++ return ret; ++} ++ ++#else /* !STDC && !Z_HAVE_STDARG_H */ ++ ++/* -- see zlib.h -- */ ++int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, ++ a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) ++ gzFile file; ++ const char *format; ++ int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, ++ a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; ++{ ++ int size, len; ++ gz_statep state; ++ z_streamp strm; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ strm = &(state->strm); ++ ++ /* check that can really pass pointer in ints */ ++ if (sizeof(int) != sizeof(void *)) ++ return 0; ++ ++ /* check that we're writing and that there's no error */ ++ if (state->mode != GZ_WRITE || state->err != Z_OK) ++ return 0; ++ ++ /* make sure we have some buffer space */ ++ if (state->size == 0 && gz_init(state) == -1) ++ return 0; ++ ++ /* check for seek request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_zero(state, state->skip) == -1) ++ return 0; ++ } ++ ++ /* consume whatever's left in the input buffer */ ++ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) ++ return 0; ++ ++ /* do the printf() into the input buffer, put length in len */ ++ size = (int)(state->size); ++ state->in[size - 1] = 0; ++#ifdef NO_snprintf ++# ifdef HAS_sprintf_void ++ sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, ++ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); ++ for (len = 0; len < size; len++) ++ if (state->in[len] == 0) break; ++# else ++ len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, ++ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); ++# endif ++#else ++# ifdef HAS_snprintf_void ++ snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, ++ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); ++ len = strlen((char *)(state->in)); ++# else ++ len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, ++ a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, ++ a19, a20); ++# endif ++#endif ++ ++ /* check that printf() results fit in buffer */ ++ if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) ++ return 0; ++ ++ /* update buffer and position, defer compression until needed */ ++ strm->avail_in = (unsigned)len; ++ strm->next_in = state->in; ++ state->x.pos += len; ++ return len; ++} ++ ++#endif ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzflush(file, flush) ++ gzFile file; ++ int flush; ++{ ++ gz_statep state; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return -1; ++ state = (gz_statep)file; ++ ++ /* check that we're writing and that there's no error */ ++ if (state->mode != GZ_WRITE || state->err != Z_OK) ++ return Z_STREAM_ERROR; ++ ++ /* check flush parameter */ ++ if (flush < 0 || flush > Z_FINISH) ++ return Z_STREAM_ERROR; ++ ++ /* check for seek request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_zero(state, state->skip) == -1) ++ return -1; ++ } ++ ++ /* compress remaining data with requested flush */ ++ gz_comp(state, flush); ++ return state->err; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzsetparams(file, level, strategy) ++ gzFile file; ++ int level; ++ int strategy; ++{ ++ gz_statep state; ++ z_streamp strm; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return Z_STREAM_ERROR; ++ state = (gz_statep)file; ++ strm = &(state->strm); ++ ++ /* check that we're writing and that there's no error */ ++ if (state->mode != GZ_WRITE || state->err != Z_OK) ++ return Z_STREAM_ERROR; ++ ++ /* if no change is requested, then do nothing */ ++ if (level == state->level && strategy == state->strategy) ++ return Z_OK; ++ ++ /* check for seek request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_zero(state, state->skip) == -1) ++ return -1; ++ } ++ ++ /* change compression parameters for subsequent input */ ++ if (state->size) { ++ /* flush previous input with previous parameters before changing */ ++ if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) ++ return state->err; ++ deflateParams(strm, level, strategy); ++ } ++ state->level = level; ++ state->strategy = strategy; ++ return Z_OK; ++} ++ ++/* -- see zlib.h -- */ ++int ZEXPORT gzclose_w(file) ++ gzFile file; ++{ ++ int ret = Z_OK; ++ gz_statep state; ++ ++ /* get internal structure */ ++ if (file == NULL) ++ return Z_STREAM_ERROR; ++ state = (gz_statep)file; ++ ++ /* check that we're writing */ ++ if (state->mode != GZ_WRITE) ++ return Z_STREAM_ERROR; ++ ++ /* check for seek request */ ++ if (state->seek) { ++ state->seek = 0; ++ if (gz_zero(state, state->skip) == -1) ++ ret = state->err; ++ } ++ ++ /* flush, free memory, and close file */ ++ if (gz_comp(state, Z_FINISH) == -1) ++ ret = state->err; ++ if (state->size) { ++ if (!state->direct) { ++ (void)deflateEnd(&(state->strm)); ++ free(state->out); ++ } ++ free(state->in); ++ } ++ gz_error(state, Z_OK, NULL); ++ free(state->path); ++ if (close(state->fd) == -1) ++ ret = Z_ERRNO; ++ free(state); ++ return ret; ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/infback.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/infback.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,664 @@ ++/* ++ * 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. ++ */ ++ ++/* infback.c -- inflate using a call-back interface ++ * Copyright (C) 1995-2011 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* ++ This code is largely copied from inflate.c. Normally either infback.o or ++ inflate.o would be linked into an application--not both. The interface ++ with inffast.c is retained so that optimized assembler-coded versions of ++ inflate_fast() can be used with either inflate.c or infback.c. ++ */ ++ ++#include "zutil.h" ++#include "inftrees.h" ++#include "inflate.h" ++#include "inffast.h" ++ ++/* function prototypes */ ++local void fixedtables OF((struct inflate_state FAR *state)); ++ ++/* ++ strm provides memory allocation functions in zalloc and zfree, or ++ Z_NULL to use the library memory allocation functions. ++ ++ windowBits is in the range 8..15, and window is a user-supplied ++ window and output buffer that is 2**windowBits bytes. ++ */ ++int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) ++z_streamp strm; ++int windowBits; ++unsigned char FAR *window; ++const char *version; ++int stream_size; ++{ ++ struct inflate_state FAR *state; ++ ++ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || ++ stream_size != (int)(sizeof(z_stream))) ++ return Z_VERSION_ERROR; ++ if (strm == Z_NULL || window == Z_NULL || ++ windowBits < 8 || windowBits > 15) ++ return Z_STREAM_ERROR; ++ strm->msg = Z_NULL; /* in case we return an error */ ++ if (strm->zalloc == (alloc_func)0) { ++#ifdef Z_SOLO ++ return Z_STREAM_ERROR; ++#else ++ strm->zalloc = zcalloc; ++ strm->opaque = (voidpf)0; ++#endif ++ } ++ if (strm->zfree == (free_func)0) ++#ifdef Z_SOLO ++ return Z_STREAM_ERROR; ++#else ++ strm->zfree = zcfree; ++#endif ++ state = (struct inflate_state FAR *)ZALLOC(strm, 1, ++ sizeof(struct inflate_state)); ++ if (state == Z_NULL) return Z_MEM_ERROR; ++ Tracev((stderr, "inflate: allocated\n")); ++ strm->state = (struct internal_state FAR *)state; ++ state->dmax = 32768U; ++ state->wbits = windowBits; ++ state->wsize = 1U << windowBits; ++ state->window = window; ++ state->wnext = 0; ++ state->whave = 0; ++ return Z_OK; ++} ++ ++/* ++ Return state with length and distance decoding tables and index sizes set to ++ fixed code decoding. Normally this returns fixed tables from inffixed.h. ++ If BUILDFIXED is defined, then instead this routine builds the tables the ++ first time it's called, and returns those tables the first time and ++ thereafter. This reduces the size of the code by about 2K bytes, in ++ exchange for a little execution time. However, BUILDFIXED should not be ++ used for threaded applications, since the rewriting of the tables and virgin ++ may not be thread-safe. ++ */ ++local void fixedtables(state) ++struct inflate_state FAR *state; ++{ ++#ifdef BUILDFIXED ++ static int virgin = 1; ++ static code *lenfix, *distfix; ++ static code fixed[544]; ++ ++ /* build fixed huffman tables if first call (may not be thread safe) */ ++ if (virgin) { ++ unsigned sym, bits; ++ static code *next; ++ ++ /* literal/length table */ ++ sym = 0; ++ while (sym < 144) state->lens[sym++] = 8; ++ while (sym < 256) state->lens[sym++] = 9; ++ while (sym < 280) state->lens[sym++] = 7; ++ while (sym < 288) state->lens[sym++] = 8; ++ next = fixed; ++ lenfix = next; ++ bits = 9; ++ inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); ++ ++ /* distance table */ ++ sym = 0; ++ while (sym < 32) state->lens[sym++] = 5; ++ distfix = next; ++ bits = 5; ++ inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); ++ ++ /* do this just once */ ++ virgin = 0; ++ } ++#else /* !BUILDFIXED */ ++# include "inffixed.h" ++#endif /* BUILDFIXED */ ++ state->lencode = lenfix; ++ state->lenbits = 9; ++ state->distcode = distfix; ++ state->distbits = 5; ++} ++ ++/* Macros for inflateBack(): */ ++ ++/* Load returned state from inflate_fast() */ ++#define LOAD() \ ++ do { \ ++ put = strm->next_out; \ ++ left = strm->avail_out; \ ++ next = strm->next_in; \ ++ have = strm->avail_in; \ ++ hold = state->hold; \ ++ bits = state->bits; \ ++ } while (0) ++ ++/* Set state from registers for inflate_fast() */ ++#define RESTORE() \ ++ do { \ ++ strm->next_out = put; \ ++ strm->avail_out = left; \ ++ strm->next_in = next; \ ++ strm->avail_in = have; \ ++ state->hold = hold; \ ++ state->bits = bits; \ ++ } while (0) ++ ++/* Clear the input bit accumulator */ ++#define INITBITS() \ ++ do { \ ++ hold = 0; \ ++ bits = 0; \ ++ } while (0) ++ ++/* Assure that some input is available. If input is requested, but denied, ++ then return a Z_BUF_ERROR from inflateBack(). */ ++#define PULL() \ ++ do { \ ++ if (have == 0) { \ ++ have = in(in_desc, &next); \ ++ if (have == 0) { \ ++ next = Z_NULL; \ ++ ret = Z_BUF_ERROR; \ ++ goto inf_leave; \ ++ } \ ++ } \ ++ } while (0) ++ ++/* Get a byte of input into the bit accumulator, or return from inflateBack() ++ with an error if there is no input available. */ ++#define PULLBYTE() \ ++ do { \ ++ PULL(); \ ++ have--; \ ++ hold += (unsigned long)(*next++) << bits; \ ++ bits += 8; \ ++ } while (0) ++ ++/* Assure that there are at least n bits in the bit accumulator. If there is ++ not enough available input to do that, then return from inflateBack() with ++ an error. */ ++#define NEEDBITS(n) \ ++ do { \ ++ while (bits < (unsigned)(n)) \ ++ PULLBYTE(); \ ++ } while (0) ++ ++/* Return the low n bits of the bit accumulator (n < 16) */ ++#define BITS(n) \ ++ ((unsigned)hold & ((1U << (n)) - 1)) ++ ++/* Remove n bits from the bit accumulator */ ++#define DROPBITS(n) \ ++ do { \ ++ hold >>= (n); \ ++ bits -= (unsigned)(n); \ ++ } while (0) ++ ++/* Remove zero to seven bits as needed to go to a byte boundary */ ++#define BYTEBITS() \ ++ do { \ ++ hold >>= bits & 7; \ ++ bits -= bits & 7; \ ++ } while (0) ++ ++/* Assure that some output space is available, by writing out the window ++ if it's full. If the write fails, return from inflateBack() with a ++ Z_BUF_ERROR. */ ++#define ROOM() \ ++ do { \ ++ if (left == 0) { \ ++ put = state->window; \ ++ left = state->wsize; \ ++ state->whave = left; \ ++ if (out(out_desc, put, left)) { \ ++ ret = Z_BUF_ERROR; \ ++ goto inf_leave; \ ++ } \ ++ } \ ++ } while (0) ++ ++/* ++ strm provides the memory allocation functions and window buffer on input, ++ and provides information on the unused input on return. For Z_DATA_ERROR ++ returns, strm will also provide an error message. ++ ++ in() and out() are the call-back input and output functions. When ++ inflateBack() needs more input, it calls in(). When inflateBack() has ++ filled the window with output, or when it completes with data in the ++ window, it calls out() to write out the data. The application must not ++ change the provided input until in() is called again or inflateBack() ++ returns. The application must not change the window/output buffer until ++ inflateBack() returns. ++ ++ in() and out() are called with a descriptor parameter provided in the ++ inflateBack() call. This parameter can be a structure that provides the ++ information required to do the read or write, as well as accumulated ++ information on the input and output such as totals and check values. ++ ++ in() should return zero on failure. out() should return non-zero on ++ failure. If either in() or out() fails, than inflateBack() returns a ++ Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it ++ was in() or out() that caused in the error. Otherwise, inflateBack() ++ returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format ++ error, or Z_MEM_ERROR if it could not allocate memory for the state. ++ inflateBack() can also return Z_STREAM_ERROR if the input parameters ++ are not correct, i.e. strm is Z_NULL or the state was not initialized. ++ */ ++int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) ++z_streamp strm; ++in_func in; ++void FAR *in_desc; ++out_func out; ++void FAR *out_desc; ++{ ++ struct inflate_state FAR *state; ++ z_const unsigned char FAR *next; /* next input */ ++ unsigned char FAR *put; /* next output */ ++ unsigned have, left; /* available input and output */ ++ unsigned long hold; /* bit buffer */ ++ unsigned bits; /* bits in bit buffer */ ++ unsigned copy; /* number of stored or match bytes to copy */ ++ unsigned char FAR *from; /* where to copy match bytes from */ ++ code here; /* current decoding table entry */ ++ code last; /* parent table entry */ ++ unsigned len; /* length to copy for repeats, bits to drop */ ++ int ret; /* return code */ ++ static const unsigned short order[19] = /* permutation of code lengths */ ++ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; ++ ++ /* Check that the strm exists and that the state was initialized */ ++ if (strm == Z_NULL || strm->state == Z_NULL) ++ return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ ++ /* Reset the state */ ++ strm->msg = Z_NULL; ++ state->mode = TYPE; ++ state->last = 0; ++ state->whave = 0; ++ next = strm->next_in; ++ have = next != Z_NULL ? strm->avail_in : 0; ++ hold = 0; ++ bits = 0; ++ put = state->window; ++ left = state->wsize; ++ ++ /* Inflate until end of block marked as last */ ++ for (;;) ++ switch (state->mode) { ++ case TYPE: ++ /* determine and dispatch block type */ ++ if (state->last) { ++ BYTEBITS(); ++ state->mode = DONE; ++ break; ++ } ++ NEEDBITS(3); ++ state->last = BITS(1); ++ DROPBITS(1); ++ switch (BITS(2)) { ++ case 0: /* stored block */ ++ Tracev((stderr, "inflate: stored block%s\n", ++ state->last ? " (last)" : "")); ++ state->mode = STORED; ++ break; ++ case 1: /* fixed block */ ++ fixedtables(state); ++ Tracev((stderr, "inflate: fixed codes block%s\n", ++ state->last ? " (last)" : "")); ++ state->mode = LEN; /* decode codes */ ++ break; ++ case 2: /* dynamic block */ ++ Tracev((stderr, "inflate: dynamic codes block%s\n", ++ state->last ? " (last)" : "")); ++ state->mode = TABLE; ++ break; ++ case 3: ++ strm->msg = (char *)"invalid block type"; ++ state->mode = BAD; ++ } ++ DROPBITS(2); ++ break; ++ ++ case STORED: ++ /* get and verify stored block length */ ++ BYTEBITS(); /* go to byte boundary */ ++ NEEDBITS(32); ++ if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { ++ strm->msg = (char *)"invalid stored block lengths"; ++ state->mode = BAD; ++ break; ++ } ++ state->length = (unsigned)hold & 0xffff; ++ Tracev((stderr, "inflate: stored length %u\n", ++ state->length)); ++ INITBITS(); ++ ++ /* copy stored block from input to output */ ++ while (state->length != 0) { ++ copy = state->length; ++ PULL(); ++ ROOM(); ++ if (copy > have) copy = have; ++ if (copy > left) copy = left; ++ zmemcpy(put, next, copy); ++ have -= copy; ++ next += copy; ++ left -= copy; ++ put += copy; ++ state->length -= copy; ++ } ++ Tracev((stderr, "inflate: stored end\n")); ++ state->mode = TYPE; ++ break; ++ ++ case TABLE: ++ /* get dynamic table entries descriptor */ ++ NEEDBITS(14); ++ state->nlen = BITS(5) + 257; ++ DROPBITS(5); ++ state->ndist = BITS(5) + 1; ++ DROPBITS(5); ++ state->ncode = BITS(4) + 4; ++ DROPBITS(4); ++#ifndef PKZIP_BUG_WORKAROUND ++ if (state->nlen > 286 || state->ndist > 30) { ++ strm->msg = (char *)"too many length or distance symbols"; ++ state->mode = BAD; ++ break; ++ } ++#endif ++ Tracev((stderr, "inflate: table sizes ok\n")); ++ ++ /* get code length code lengths (not a typo) */ ++ state->have = 0; ++ while (state->have < state->ncode) { ++ NEEDBITS(3); ++ state->lens[order[state->have++]] = (unsigned short)BITS(3); ++ DROPBITS(3); ++ } ++ while (state->have < 19) ++ state->lens[order[state->have++]] = 0; ++ state->next = state->codes; ++ state->lencode = (code const FAR *)(state->next); ++ state->lenbits = 7; ++ ret = inflate_table(CODES, state->lens, 19, &(state->next), ++ &(state->lenbits), state->work); ++ if (ret) { ++ strm->msg = (char *)"invalid code lengths set"; ++ state->mode = BAD; ++ break; ++ } ++ Tracev((stderr, "inflate: code lengths ok\n")); ++ ++ /* get length and distance code code lengths */ ++ state->have = 0; ++ while (state->have < state->nlen + state->ndist) { ++ for (;;) { ++ here = state->lencode[BITS(state->lenbits)]; ++ if ((unsigned)(here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ if (here.val < 16) { ++ DROPBITS(here.bits); ++ state->lens[state->have++] = here.val; ++ } ++ else { ++ if (here.val == 16) { ++ NEEDBITS(here.bits + 2); ++ DROPBITS(here.bits); ++ if (state->have == 0) { ++ strm->msg = (char *)"invalid bit length repeat"; ++ state->mode = BAD; ++ break; ++ } ++ len = (unsigned)(state->lens[state->have - 1]); ++ copy = 3 + BITS(2); ++ DROPBITS(2); ++ } ++ else if (here.val == 17) { ++ NEEDBITS(here.bits + 3); ++ DROPBITS(here.bits); ++ len = 0; ++ copy = 3 + BITS(3); ++ DROPBITS(3); ++ } ++ else { ++ NEEDBITS(here.bits + 7); ++ DROPBITS(here.bits); ++ len = 0; ++ copy = 11 + BITS(7); ++ DROPBITS(7); ++ } ++ if (state->have + copy > state->nlen + state->ndist) { ++ strm->msg = (char *)"invalid bit length repeat"; ++ state->mode = BAD; ++ break; ++ } ++ while (copy--) ++ state->lens[state->have++] = (unsigned short)len; ++ } ++ } ++ ++ /* handle error breaks in while */ ++ if (state->mode == BAD) break; ++ ++ /* check for end-of-block code (better have one) */ ++ if (state->lens[256] == 0) { ++ strm->msg = (char *)"invalid code -- missing end-of-block"; ++ state->mode = BAD; ++ break; ++ } ++ ++ /* build code tables -- note: do not change the lenbits or distbits ++ values here (9 and 6) without reading the comments in inftrees.h ++ concerning the ENOUGH constants, which depend on those values */ ++ state->next = state->codes; ++ state->lencode = (code const FAR *)(state->next); ++ state->lenbits = 9; ++ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), ++ &(state->lenbits), state->work); ++ if (ret) { ++ strm->msg = (char *)"invalid literal/lengths set"; ++ state->mode = BAD; ++ break; ++ } ++ state->distcode = (code const FAR *)(state->next); ++ state->distbits = 6; ++ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, ++ &(state->next), &(state->distbits), state->work); ++ if (ret) { ++ strm->msg = (char *)"invalid distances set"; ++ state->mode = BAD; ++ break; ++ } ++ Tracev((stderr, "inflate: codes ok\n")); ++ state->mode = LEN; ++ ++ case LEN: ++ /* use inflate_fast() if we have enough input and output */ ++ if (have >= 6 && left >= 258) { ++ RESTORE(); ++ if (state->whave < state->wsize) ++ state->whave = state->wsize - left; ++ inflate_fast(strm, state->wsize); ++ LOAD(); ++ break; ++ } ++ ++ /* get a literal, length, or end-of-block code */ ++ for (;;) { ++ here = state->lencode[BITS(state->lenbits)]; ++ if ((unsigned)(here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ if (here.op && (here.op & 0xf0) == 0) { ++ last = here; ++ for (;;) { ++ here = state->lencode[last.val + ++ (BITS(last.bits + last.op) >> last.bits)]; ++ if ((unsigned)(last.bits + here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ DROPBITS(last.bits); ++ } ++ DROPBITS(here.bits); ++ state->length = (unsigned)here.val; ++ ++ /* process literal */ ++ if (here.op == 0) { ++ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? ++ "inflate: literal '%c'\n" : ++ "inflate: literal 0x%02x\n", here.val)); ++ ROOM(); ++ *put++ = (unsigned char)(state->length); ++ left--; ++ state->mode = LEN; ++ break; ++ } ++ ++ /* process end of block */ ++ if (here.op & 32) { ++ Tracevv((stderr, "inflate: end of block\n")); ++ state->mode = TYPE; ++ break; ++ } ++ ++ /* invalid code */ ++ if (here.op & 64) { ++ strm->msg = (char *)"invalid literal/length code"; ++ state->mode = BAD; ++ break; ++ } ++ ++ /* length code -- get extra bits, if any */ ++ state->extra = (unsigned)(here.op) & 15; ++ if (state->extra != 0) { ++ NEEDBITS(state->extra); ++ state->length += BITS(state->extra); ++ DROPBITS(state->extra); ++ } ++ Tracevv((stderr, "inflate: length %u\n", state->length)); ++ ++ /* get distance code */ ++ for (;;) { ++ here = state->distcode[BITS(state->distbits)]; ++ if ((unsigned)(here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ if ((here.op & 0xf0) == 0) { ++ last = here; ++ for (;;) { ++ here = state->distcode[last.val + ++ (BITS(last.bits + last.op) >> last.bits)]; ++ if ((unsigned)(last.bits + here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ DROPBITS(last.bits); ++ } ++ DROPBITS(here.bits); ++ if (here.op & 64) { ++ strm->msg = (char *)"invalid distance code"; ++ state->mode = BAD; ++ break; ++ } ++ state->offset = (unsigned)here.val; ++ ++ /* get distance extra bits, if any */ ++ state->extra = (unsigned)(here.op) & 15; ++ if (state->extra != 0) { ++ NEEDBITS(state->extra); ++ state->offset += BITS(state->extra); ++ DROPBITS(state->extra); ++ } ++ if (state->offset > state->wsize - (state->whave < state->wsize ? ++ left : 0)) { ++ strm->msg = (char *)"invalid distance too far back"; ++ state->mode = BAD; ++ break; ++ } ++ Tracevv((stderr, "inflate: distance %u\n", state->offset)); ++ ++ /* copy match from window to output */ ++ do { ++ ROOM(); ++ copy = state->wsize - state->offset; ++ if (copy < left) { ++ from = put + copy; ++ copy = left - copy; ++ } ++ else { ++ from = put - state->offset; ++ copy = left; ++ } ++ if (copy > state->length) copy = state->length; ++ state->length -= copy; ++ left -= copy; ++ do { ++ *put++ = *from++; ++ } while (--copy); ++ } while (state->length != 0); ++ break; ++ ++ case DONE: ++ /* inflate stream terminated properly -- write leftover output */ ++ ret = Z_STREAM_END; ++ if (left < state->wsize) { ++ if (out(out_desc, state->window, state->wsize - left)) ++ ret = Z_BUF_ERROR; ++ } ++ goto inf_leave; ++ ++ case BAD: ++ ret = Z_DATA_ERROR; ++ goto inf_leave; ++ ++ default: /* can't happen, but makes compilers happy */ ++ ret = Z_STREAM_ERROR; ++ goto inf_leave; ++ } ++ ++ /* Return unused input */ ++ inf_leave: ++ strm->next_in = next; ++ strm->avail_in = have; ++ return ret; ++} ++ ++int ZEXPORT inflateBackEnd(strm) ++z_streamp strm; ++{ ++ if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) ++ return Z_STREAM_ERROR; ++ ZFREE(strm, strm->state); ++ strm->state = Z_NULL; ++ Tracev((stderr, "inflate: end\n")); ++ return Z_OK; ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inffast.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inffast.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,364 @@ ++/* ++ * 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. ++ */ ++ ++/* inffast.c -- fast decoding ++ * Copyright (C) 1995-2008, 2010, 2013 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "zutil.h" ++#include "inftrees.h" ++#include "inflate.h" ++#include "inffast.h" ++ ++#ifndef ASMINF ++ ++/* Allow machine dependent optimization for post-increment or pre-increment. ++ Based on testing to date, ++ Pre-increment preferred for: ++ - PowerPC G3 (Adler) ++ - MIPS R5000 (Randers-Pehrson) ++ Post-increment preferred for: ++ - none ++ No measurable difference: ++ - Pentium III (Anderson) ++ - M68060 (Nikl) ++ */ ++#ifdef POSTINC ++# define OFF 0 ++# define PUP(a) *(a)++ ++#else ++# define OFF 1 ++# define PUP(a) *++(a) ++#endif ++ ++/* ++ Decode literal, length, and distance codes and write out the resulting ++ literal and match bytes until either not enough input or output is ++ available, an end-of-block is encountered, or a data error is encountered. ++ When large enough input and output buffers are supplied to inflate(), for ++ example, a 16K input buffer and a 64K output buffer, more than 95% of the ++ inflate execution time is spent in this routine. ++ ++ Entry assumptions: ++ ++ state->mode == LEN ++ strm->avail_in >= 6 ++ strm->avail_out >= 258 ++ start >= strm->avail_out ++ state->bits < 8 ++ ++ On return, state->mode is one of: ++ ++ LEN -- ran out of enough output space or enough available input ++ TYPE -- reached end of block code, inflate() to interpret next block ++ BAD -- error in block data ++ ++ Notes: ++ ++ - The maximum input bits used by a length/distance pair is 15 bits for the ++ length code, 5 bits for the length extra, 15 bits for the distance code, ++ and 13 bits for the distance extra. This totals 48 bits, or six bytes. ++ Therefore if strm->avail_in >= 6, then there is enough input to avoid ++ checking for available input while decoding. ++ ++ - The maximum bytes that a single length/distance pair can output is 258 ++ bytes, which is the maximum length that can be coded. inflate_fast() ++ requires strm->avail_out >= 258 for each loop to avoid checking for ++ output space. ++ */ ++void ZLIB_INTERNAL inflate_fast(strm, start) ++z_streamp strm; ++unsigned start; /* inflate()'s starting value for strm->avail_out */ ++{ ++ struct inflate_state FAR *state; ++ z_const unsigned char FAR *in; /* local strm->next_in */ ++ z_const unsigned char FAR *last; /* have enough input while in < last */ ++ unsigned char FAR *out; /* local strm->next_out */ ++ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ ++ unsigned char FAR *end; /* while out < end, enough space available */ ++#ifdef INFLATE_STRICT ++ unsigned dmax; /* maximum distance from zlib header */ ++#endif ++ unsigned wsize; /* window size or zero if not using window */ ++ unsigned whave; /* valid bytes in the window */ ++ unsigned wnext; /* window write index */ ++ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ ++ unsigned long hold; /* local strm->hold */ ++ unsigned bits; /* local strm->bits */ ++ code const FAR *lcode; /* local strm->lencode */ ++ code const FAR *dcode; /* local strm->distcode */ ++ unsigned lmask; /* mask for first level of length codes */ ++ unsigned dmask; /* mask for first level of distance codes */ ++ code here; /* retrieved table entry */ ++ unsigned op; /* code bits, operation, extra bits, or */ ++ /* window position, window bytes to copy */ ++ unsigned len; /* match length, unused bytes */ ++ unsigned dist; /* match distance */ ++ unsigned char FAR *from; /* where to copy match from */ ++ ++ /* copy state to local variables */ ++ state = (struct inflate_state FAR *)strm->state; ++ in = strm->next_in - OFF; ++ last = in + (strm->avail_in - 5); ++ out = strm->next_out - OFF; ++ beg = out - (start - strm->avail_out); ++ end = out + (strm->avail_out - 257); ++#ifdef INFLATE_STRICT ++ dmax = state->dmax; ++#endif ++ wsize = state->wsize; ++ whave = state->whave; ++ wnext = state->wnext; ++ window = state->window; ++ hold = state->hold; ++ bits = state->bits; ++ lcode = state->lencode; ++ dcode = state->distcode; ++ lmask = (1U << state->lenbits) - 1; ++ dmask = (1U << state->distbits) - 1; ++ ++ /* decode literals and length/distances until end-of-block or not enough ++ input data or output space */ ++ do { ++ if (bits < 15) { ++ hold += (unsigned long)(PUP(in)) << bits; ++ bits += 8; ++ hold += (unsigned long)(PUP(in)) << bits; ++ bits += 8; ++ } ++ here = lcode[hold & lmask]; ++ dolen: ++ op = (unsigned)(here.bits); ++ hold >>= op; ++ bits -= op; ++ op = (unsigned)(here.op); ++ if (op == 0) { /* literal */ ++ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? ++ "inflate: literal '%c'\n" : ++ "inflate: literal 0x%02x\n", here.val)); ++ PUP(out) = (unsigned char)(here.val); ++ } ++ else if (op & 16) { /* length base */ ++ len = (unsigned)(here.val); ++ op &= 15; /* number of extra bits */ ++ if (op) { ++ if (bits < op) { ++ hold += (unsigned long)(PUP(in)) << bits; ++ bits += 8; ++ } ++ len += (unsigned)hold & ((1U << op) - 1); ++ hold >>= op; ++ bits -= op; ++ } ++ Tracevv((stderr, "inflate: length %u\n", len)); ++ if (bits < 15) { ++ hold += (unsigned long)(PUP(in)) << bits; ++ bits += 8; ++ hold += (unsigned long)(PUP(in)) << bits; ++ bits += 8; ++ } ++ here = dcode[hold & dmask]; ++ dodist: ++ op = (unsigned)(here.bits); ++ hold >>= op; ++ bits -= op; ++ op = (unsigned)(here.op); ++ if (op & 16) { /* distance base */ ++ dist = (unsigned)(here.val); ++ op &= 15; /* number of extra bits */ ++ if (bits < op) { ++ hold += (unsigned long)(PUP(in)) << bits; ++ bits += 8; ++ if (bits < op) { ++ hold += (unsigned long)(PUP(in)) << bits; ++ bits += 8; ++ } ++ } ++ dist += (unsigned)hold & ((1U << op) - 1); ++#ifdef INFLATE_STRICT ++ if (dist > dmax) { ++ strm->msg = (char *)"invalid distance too far back"; ++ state->mode = BAD; ++ break; ++ } ++#endif ++ hold >>= op; ++ bits -= op; ++ Tracevv((stderr, "inflate: distance %u\n", dist)); ++ op = (unsigned)(out - beg); /* max distance in output */ ++ if (dist > op) { /* see if copy from window */ ++ op = dist - op; /* distance back in window */ ++ if (op > whave) { ++ if (state->sane) { ++ strm->msg = ++ (char *)"invalid distance too far back"; ++ state->mode = BAD; ++ break; ++ } ++#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR ++ if (len <= op - whave) { ++ do { ++ PUP(out) = 0; ++ } while (--len); ++ continue; ++ } ++ len -= op - whave; ++ do { ++ PUP(out) = 0; ++ } while (--op > whave); ++ if (op == 0) { ++ from = out - dist; ++ do { ++ PUP(out) = PUP(from); ++ } while (--len); ++ continue; ++ } ++#endif ++ } ++ from = window - OFF; ++ if (wnext == 0) { /* very common case */ ++ from += wsize - op; ++ if (op < len) { /* some from window */ ++ len -= op; ++ do { ++ PUP(out) = PUP(from); ++ } while (--op); ++ from = out - dist; /* rest from output */ ++ } ++ } ++ else if (wnext < op) { /* wrap around window */ ++ from += wsize + wnext - op; ++ op -= wnext; ++ if (op < len) { /* some from end of window */ ++ len -= op; ++ do { ++ PUP(out) = PUP(from); ++ } while (--op); ++ from = window - OFF; ++ if (wnext < len) { /* some from start of window */ ++ op = wnext; ++ len -= op; ++ do { ++ PUP(out) = PUP(from); ++ } while (--op); ++ from = out - dist; /* rest from output */ ++ } ++ } ++ } ++ else { /* contiguous in window */ ++ from += wnext - op; ++ if (op < len) { /* some from window */ ++ len -= op; ++ do { ++ PUP(out) = PUP(from); ++ } while (--op); ++ from = out - dist; /* rest from output */ ++ } ++ } ++ while (len > 2) { ++ PUP(out) = PUP(from); ++ PUP(out) = PUP(from); ++ PUP(out) = PUP(from); ++ len -= 3; ++ } ++ if (len) { ++ PUP(out) = PUP(from); ++ if (len > 1) ++ PUP(out) = PUP(from); ++ } ++ } ++ else { ++ from = out - dist; /* copy direct from output */ ++ do { /* minimum length is three */ ++ PUP(out) = PUP(from); ++ PUP(out) = PUP(from); ++ PUP(out) = PUP(from); ++ len -= 3; ++ } while (len > 2); ++ if (len) { ++ PUP(out) = PUP(from); ++ if (len > 1) ++ PUP(out) = PUP(from); ++ } ++ } ++ } ++ else if ((op & 64) == 0) { /* 2nd level distance code */ ++ here = dcode[here.val + (hold & ((1U << op) - 1))]; ++ goto dodist; ++ } ++ else { ++ strm->msg = (char *)"invalid distance code"; ++ state->mode = BAD; ++ break; ++ } ++ } ++ else if ((op & 64) == 0) { /* 2nd level length code */ ++ here = lcode[here.val + (hold & ((1U << op) - 1))]; ++ goto dolen; ++ } ++ else if (op & 32) { /* end-of-block */ ++ Tracevv((stderr, "inflate: end of block\n")); ++ state->mode = TYPE; ++ break; ++ } ++ else { ++ strm->msg = (char *)"invalid literal/length code"; ++ state->mode = BAD; ++ break; ++ } ++ } while (in < last && out < end); ++ ++ /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ ++ len = bits >> 3; ++ in -= len; ++ bits -= len << 3; ++ hold &= (1U << bits) - 1; ++ ++ /* update state and return */ ++ strm->next_in = in + OFF; ++ strm->next_out = out + OFF; ++ strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); ++ strm->avail_out = (unsigned)(out < end ? ++ 257 + (end - out) : 257 - (out - end)); ++ state->hold = hold; ++ state->bits = bits; ++ return; ++} ++ ++/* ++ inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): ++ - Using bit fields for code structure ++ - Different op definition to avoid & for extra bits (do & for table bits) ++ - Three separate decoding do-loops for direct, window, and wnext == 0 ++ - Special case for distance > 1 copies to do overlapped load and store copy ++ - Explicit branch predictions (based on measured branch probabilities) ++ - Deferring match copy and interspersed it with decoding subsequent codes ++ - Swapping literal/length else ++ - Swapping window/direct else ++ - Larger unrolled copy loops (three is about right) ++ - Moving len -= 3 statement into middle of loop ++ */ ++ ++#endif /* !ASMINF */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inffast.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inffast.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,35 @@ ++/* ++ * 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. ++ */ ++ ++/* inffast.h -- header to use inffast.c ++ * Copyright (C) 1995-2003, 2010 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inffixed.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inffixed.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,118 @@ ++/* ++ * 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. ++ */ ++ ++ /* inffixed.h -- table for decoding fixed codes ++ * Generated automatically by makefixed(). ++ */ ++ ++ /* WARNING: this file should *not* be used by applications. ++ It is part of the implementation of this library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++ static const code lenfix[512] = { ++ {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, ++ {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, ++ {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, ++ {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, ++ {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, ++ {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, ++ {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, ++ {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, ++ {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, ++ {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, ++ {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, ++ {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, ++ {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, ++ {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, ++ {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, ++ {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, ++ {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, ++ {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, ++ {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, ++ {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, ++ {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, ++ {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, ++ {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, ++ {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, ++ {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, ++ {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, ++ {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, ++ {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, ++ {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, ++ {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, ++ {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, ++ {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, ++ {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, ++ {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, ++ {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, ++ {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, ++ {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, ++ {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, ++ {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, ++ {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, ++ {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, ++ {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, ++ {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, ++ {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, ++ {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, ++ {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, ++ {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, ++ {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, ++ {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, ++ {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, ++ {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, ++ {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, ++ {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, ++ {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, ++ {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, ++ {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, ++ {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, ++ {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, ++ {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, ++ {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, ++ {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, ++ {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, ++ {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, ++ {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, ++ {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, ++ {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, ++ {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, ++ {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, ++ {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, ++ {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, ++ {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, ++ {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, ++ {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, ++ {0,9,255} ++ }; ++ ++ static const code distfix[32] = { ++ {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, ++ {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, ++ {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, ++ {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, ++ {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, ++ {22,5,193},{64,5,0} ++ }; +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inflate.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inflate.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,1536 @@ ++/* ++ * 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. ++ */ ++ ++/* inflate.c -- zlib decompression ++ * Copyright (C) 1995-2012 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* ++ * Change history: ++ * ++ * 1.2.beta0 24 Nov 2002 ++ * - First version -- complete rewrite of inflate to simplify code, avoid ++ * creation of window when not needed, minimize use of window when it is ++ * needed, make inffast.c even faster, implement gzip decoding, and to ++ * improve code readability and style over the previous zlib inflate code ++ * ++ * 1.2.beta1 25 Nov 2002 ++ * - Use pointers for available input and output checking in inffast.c ++ * - Remove input and output counters in inffast.c ++ * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 ++ * - Remove unnecessary second byte pull from length extra in inffast.c ++ * - Unroll direct copy to three copies per loop in inffast.c ++ * ++ * 1.2.beta2 4 Dec 2002 ++ * - Change external routine names to reduce potential conflicts ++ * - Correct filename to inffixed.h for fixed tables in inflate.c ++ * - Make hbuf[] unsigned char to match parameter type in inflate.c ++ * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) ++ * to avoid negation problem on Alphas (64 bit) in inflate.c ++ * ++ * 1.2.beta3 22 Dec 2002 ++ * - Add comments on state->bits assertion in inffast.c ++ * - Add comments on op field in inftrees.h ++ * - Fix bug in reuse of allocated window after inflateReset() ++ * - Remove bit fields--back to byte structure for speed ++ * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths ++ * - Change post-increments to pre-increments in inflate_fast(), PPC biased? ++ * - Add compile time option, POSTINC, to use post-increments instead (Intel?) ++ * - Make MATCH copy in inflate() much faster for when inflate_fast() not used ++ * - Use local copies of stream next and avail values, as well as local bit ++ * buffer and bit count in inflate()--for speed when inflate_fast() not used ++ * ++ * 1.2.beta4 1 Jan 2003 ++ * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings ++ * - Move a comment on output buffer sizes from inffast.c to inflate.c ++ * - Add comments in inffast.c to introduce the inflate_fast() routine ++ * - Rearrange window copies in inflate_fast() for speed and simplification ++ * - Unroll last copy for window match in inflate_fast() ++ * - Use local copies of window variables in inflate_fast() for speed ++ * - Pull out common wnext == 0 case for speed in inflate_fast() ++ * - Make op and len in inflate_fast() unsigned for consistency ++ * - Add FAR to lcode and dcode declarations in inflate_fast() ++ * - Simplified bad distance check in inflate_fast() ++ * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new ++ * source file infback.c to provide a call-back interface to inflate for ++ * programs like gzip and unzip -- uses window as output buffer to avoid ++ * window copying ++ * ++ * 1.2.beta5 1 Jan 2003 ++ * - Improved inflateBack() interface to allow the caller to provide initial ++ * input in strm. ++ * - Fixed stored blocks bug in inflateBack() ++ * ++ * 1.2.beta6 4 Jan 2003 ++ * - Added comments in inffast.c on effectiveness of POSTINC ++ * - Typecasting all around to reduce compiler warnings ++ * - Changed loops from while (1) or do {} while (1) to for (;;), again to ++ * make compilers happy ++ * - Changed type of window in inflateBackInit() to unsigned char * ++ * ++ * 1.2.beta7 27 Jan 2003 ++ * - Changed many types to unsigned or unsigned short to avoid warnings ++ * - Added inflateCopy() function ++ * ++ * 1.2.0 9 Mar 2003 ++ * - Changed inflateBack() interface to provide separate opaque descriptors ++ * for the in() and out() functions ++ * - Changed inflateBack() argument and in_func typedef to swap the length ++ * and buffer address return values for the input function ++ * - Check next_in and next_out for Z_NULL on entry to inflate() ++ * ++ * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. ++ */ ++ ++#include "zutil.h" ++#include "inftrees.h" ++#include "inflate.h" ++#include "inffast.h" ++ ++#ifdef MAKEFIXED ++# ifndef BUILDFIXED ++# define BUILDFIXED ++# endif ++#endif ++ ++/* function prototypes */ ++local void fixedtables OF((struct inflate_state FAR *state)); ++local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, ++ unsigned copy)); ++#ifdef BUILDFIXED ++ void makefixed OF((void)); ++#endif ++local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, ++ unsigned len)); ++ ++int ZEXPORT inflateResetKeep(strm) ++z_streamp strm; ++{ ++ struct inflate_state FAR *state; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ strm->total_in = strm->total_out = state->total = 0; ++ strm->msg = Z_NULL; ++ if (state->wrap) /* to support ill-conceived Java test suite */ ++ strm->adler = state->wrap & 1; ++ state->mode = HEAD; ++ state->last = 0; ++ state->havedict = 0; ++ state->dmax = 32768U; ++ state->head = Z_NULL; ++ state->hold = 0; ++ state->bits = 0; ++ state->lencode = state->distcode = state->next = state->codes; ++ state->sane = 1; ++ state->back = -1; ++ Tracev((stderr, "inflate: reset\n")); ++ return Z_OK; ++} ++ ++int ZEXPORT inflateReset(strm) ++z_streamp strm; ++{ ++ struct inflate_state FAR *state; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ state->wsize = 0; ++ state->whave = 0; ++ state->wnext = 0; ++ return inflateResetKeep(strm); ++} ++ ++int ZEXPORT inflateReset2(strm, windowBits) ++z_streamp strm; ++int windowBits; ++{ ++ int wrap; ++ struct inflate_state FAR *state; ++ ++ /* get the state */ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ ++ /* extract wrap request from windowBits parameter */ ++ if (windowBits < 0) { ++ wrap = 0; ++ windowBits = -windowBits; ++ } ++ else { ++ wrap = (windowBits >> 4) + 1; ++#ifdef GUNZIP ++ if (windowBits < 48) ++ windowBits &= 15; ++#endif ++ } ++ ++ /* set number of window bits, free window if different */ ++ if (windowBits && (windowBits < 8 || windowBits > 15)) ++ return Z_STREAM_ERROR; ++ if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { ++ ZFREE(strm, state->window); ++ state->window = Z_NULL; ++ } ++ ++ /* update state and reset the rest of it */ ++ state->wrap = wrap; ++ state->wbits = (unsigned)windowBits; ++ return inflateReset(strm); ++} ++ ++int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) ++z_streamp strm; ++int windowBits; ++const char *version; ++int stream_size; ++{ ++ int ret; ++ struct inflate_state FAR *state; ++ ++ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || ++ stream_size != (int)(sizeof(z_stream))) ++ return Z_VERSION_ERROR; ++ if (strm == Z_NULL) return Z_STREAM_ERROR; ++ strm->msg = Z_NULL; /* in case we return an error */ ++ if (strm->zalloc == (alloc_func)0) { ++#ifdef Z_SOLO ++ return Z_STREAM_ERROR; ++#else ++ strm->zalloc = zcalloc; ++ strm->opaque = (voidpf)0; ++#endif ++ } ++ if (strm->zfree == (free_func)0) ++#ifdef Z_SOLO ++ return Z_STREAM_ERROR; ++#else ++ strm->zfree = zcfree; ++#endif ++ state = (struct inflate_state FAR *) ++ ZALLOC(strm, 1, sizeof(struct inflate_state)); ++ if (state == Z_NULL) return Z_MEM_ERROR; ++ Tracev((stderr, "inflate: allocated\n")); ++ strm->state = (struct internal_state FAR *)state; ++ state->window = Z_NULL; ++ ret = inflateReset2(strm, windowBits); ++ if (ret != Z_OK) { ++ ZFREE(strm, state); ++ strm->state = Z_NULL; ++ } ++ return ret; ++} ++ ++int ZEXPORT inflateInit_(strm, version, stream_size) ++z_streamp strm; ++const char *version; ++int stream_size; ++{ ++ return inflateInit2_(strm, DEF_WBITS, version, stream_size); ++} ++ ++int ZEXPORT inflatePrime(strm, bits, value) ++z_streamp strm; ++int bits; ++int value; ++{ ++ struct inflate_state FAR *state; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ if (bits < 0) { ++ state->hold = 0; ++ state->bits = 0; ++ return Z_OK; ++ } ++ if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; ++ value &= (1L << bits) - 1; ++ state->hold += value << state->bits; ++ state->bits += bits; ++ return Z_OK; ++} ++ ++/* ++ Return state with length and distance decoding tables and index sizes set to ++ fixed code decoding. Normally this returns fixed tables from inffixed.h. ++ If BUILDFIXED is defined, then instead this routine builds the tables the ++ first time it's called, and returns those tables the first time and ++ thereafter. This reduces the size of the code by about 2K bytes, in ++ exchange for a little execution time. However, BUILDFIXED should not be ++ used for threaded applications, since the rewriting of the tables and virgin ++ may not be thread-safe. ++ */ ++local void fixedtables(state) ++struct inflate_state FAR *state; ++{ ++#ifdef BUILDFIXED ++ static int virgin = 1; ++ static code *lenfix, *distfix; ++ static code fixed[544]; ++ ++ /* build fixed huffman tables if first call (may not be thread safe) */ ++ if (virgin) { ++ unsigned sym, bits; ++ static code *next; ++ ++ /* literal/length table */ ++ sym = 0; ++ while (sym < 144) state->lens[sym++] = 8; ++ while (sym < 256) state->lens[sym++] = 9; ++ while (sym < 280) state->lens[sym++] = 7; ++ while (sym < 288) state->lens[sym++] = 8; ++ next = fixed; ++ lenfix = next; ++ bits = 9; ++ inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); ++ ++ /* distance table */ ++ sym = 0; ++ while (sym < 32) state->lens[sym++] = 5; ++ distfix = next; ++ bits = 5; ++ inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); ++ ++ /* do this just once */ ++ virgin = 0; ++ } ++#else /* !BUILDFIXED */ ++# include "inffixed.h" ++#endif /* BUILDFIXED */ ++ state->lencode = lenfix; ++ state->lenbits = 9; ++ state->distcode = distfix; ++ state->distbits = 5; ++} ++ ++#ifdef MAKEFIXED ++#include <stdio.h> ++ ++/* ++ Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also ++ defines BUILDFIXED, so the tables are built on the fly. makefixed() writes ++ those tables to stdout, which would be piped to inffixed.h. A small program ++ can simply call makefixed to do this: ++ ++ void makefixed(void); ++ ++ int main(void) ++ { ++ makefixed(); ++ return 0; ++ } ++ ++ Then that can be linked with zlib built with MAKEFIXED defined and run: ++ ++ a.out > inffixed.h ++ */ ++void makefixed() ++{ ++ unsigned low, size; ++ struct inflate_state state; ++ ++ fixedtables(&state); ++ puts(" /* inffixed.h -- table for decoding fixed codes"); ++ puts(" * Generated automatically by makefixed()."); ++ puts(" */"); ++ puts(""); ++ puts(" /* WARNING: this file should *not* be used by applications."); ++ puts(" It is part of the implementation of this library and is"); ++ puts(" subject to change. Applications should only use zlib.h."); ++ puts(" */"); ++ puts(""); ++ size = 1U << 9; ++ printf(" static const code lenfix[%u] = {", size); ++ low = 0; ++ for (;;) { ++ if ((low % 7) == 0) printf("\n "); ++ printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, ++ state.lencode[low].bits, state.lencode[low].val); ++ if (++low == size) break; ++ putchar(','); ++ } ++ puts("\n };"); ++ size = 1U << 5; ++ printf("\n static const code distfix[%u] = {", size); ++ low = 0; ++ for (;;) { ++ if ((low % 6) == 0) printf("\n "); ++ printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, ++ state.distcode[low].val); ++ if (++low == size) break; ++ putchar(','); ++ } ++ puts("\n };"); ++} ++#endif /* MAKEFIXED */ ++ ++/* ++ Update the window with the last wsize (normally 32K) bytes written before ++ returning. If window does not exist yet, create it. This is only called ++ when a window is already in use, or when output has been written during this ++ inflate call, but the end of the deflate stream has not been reached yet. ++ It is also called to create a window for dictionary data when a dictionary ++ is loaded. ++ ++ Providing output buffers larger than 32K to inflate() should provide a speed ++ advantage, since only the last 32K of output is copied to the sliding window ++ upon return from inflate(), and since all distances after the first 32K of ++ output will fall in the output data, making match copies simpler and faster. ++ The advantage may be dependent on the size of the processor's data caches. ++ */ ++local int updatewindow(strm, end, copy) ++z_streamp strm; ++const Bytef *end; ++unsigned copy; ++{ ++ struct inflate_state FAR *state; ++ unsigned dist; ++ ++ state = (struct inflate_state FAR *)strm->state; ++ ++ /* if it hasn't been done already, allocate space for the window */ ++ if (state->window == Z_NULL) { ++ state->window = (unsigned char FAR *) ++ ZALLOC(strm, 1U << state->wbits, ++ sizeof(unsigned char)); ++ if (state->window == Z_NULL) return 1; ++ } ++ ++ /* if window not in use yet, initialize */ ++ if (state->wsize == 0) { ++ state->wsize = 1U << state->wbits; ++ state->wnext = 0; ++ state->whave = 0; ++ } ++ ++ /* copy state->wsize or less output bytes into the circular window */ ++ if (copy >= state->wsize) { ++ zmemcpy(state->window, end - state->wsize, state->wsize); ++ state->wnext = 0; ++ state->whave = state->wsize; ++ } ++ else { ++ dist = state->wsize - state->wnext; ++ if (dist > copy) dist = copy; ++ zmemcpy(state->window + state->wnext, end - copy, dist); ++ copy -= dist; ++ if (copy) { ++ zmemcpy(state->window, end - copy, copy); ++ state->wnext = copy; ++ state->whave = state->wsize; ++ } ++ else { ++ state->wnext += dist; ++ if (state->wnext == state->wsize) state->wnext = 0; ++ if (state->whave < state->wsize) state->whave += dist; ++ } ++ } ++ return 0; ++} ++ ++/* Macros for inflate(): */ ++ ++/* check function to use adler32() for zlib or crc32() for gzip */ ++#ifdef GUNZIP ++# define UPDATE(check, buf, len) \ ++ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) ++#else ++# define UPDATE(check, buf, len) adler32(check, buf, len) ++#endif ++ ++/* check macros for header crc */ ++#ifdef GUNZIP ++# define CRC2(check, word) \ ++ do { \ ++ hbuf[0] = (unsigned char)(word); \ ++ hbuf[1] = (unsigned char)((word) >> 8); \ ++ check = crc32(check, hbuf, 2); \ ++ } while (0) ++ ++# define CRC4(check, word) \ ++ do { \ ++ hbuf[0] = (unsigned char)(word); \ ++ hbuf[1] = (unsigned char)((word) >> 8); \ ++ hbuf[2] = (unsigned char)((word) >> 16); \ ++ hbuf[3] = (unsigned char)((word) >> 24); \ ++ check = crc32(check, hbuf, 4); \ ++ } while (0) ++#endif ++ ++/* Load registers with state in inflate() for speed */ ++#define LOAD() \ ++ do { \ ++ put = strm->next_out; \ ++ left = strm->avail_out; \ ++ next = strm->next_in; \ ++ have = strm->avail_in; \ ++ hold = state->hold; \ ++ bits = state->bits; \ ++ } while (0) ++ ++/* Restore state from registers in inflate() */ ++#define RESTORE() \ ++ do { \ ++ strm->next_out = put; \ ++ strm->avail_out = left; \ ++ strm->next_in = next; \ ++ strm->avail_in = have; \ ++ state->hold = hold; \ ++ state->bits = bits; \ ++ } while (0) ++ ++/* Clear the input bit accumulator */ ++#define INITBITS() \ ++ do { \ ++ hold = 0; \ ++ bits = 0; \ ++ } while (0) ++ ++/* Get a byte of input into the bit accumulator, or return from inflate() ++ if there is no input available. */ ++#define PULLBYTE() \ ++ do { \ ++ if (have == 0) goto inf_leave; \ ++ have--; \ ++ hold += (unsigned long)(*next++) << bits; \ ++ bits += 8; \ ++ } while (0) ++ ++/* Assure that there are at least n bits in the bit accumulator. If there is ++ not enough available input to do that, then return from inflate(). */ ++#define NEEDBITS(n) \ ++ do { \ ++ while (bits < (unsigned)(n)) \ ++ PULLBYTE(); \ ++ } while (0) ++ ++/* Return the low n bits of the bit accumulator (n < 16) */ ++#define BITS(n) \ ++ ((unsigned)hold & ((1U << (n)) - 1)) ++ ++/* Remove n bits from the bit accumulator */ ++#define DROPBITS(n) \ ++ do { \ ++ hold >>= (n); \ ++ bits -= (unsigned)(n); \ ++ } while (0) ++ ++/* Remove zero to seven bits as needed to go to a byte boundary */ ++#define BYTEBITS() \ ++ do { \ ++ hold >>= bits & 7; \ ++ bits -= bits & 7; \ ++ } while (0) ++ ++/* ++ inflate() uses a state machine to process as much input data and generate as ++ much output data as possible before returning. The state machine is ++ structured roughly as follows: ++ ++ for (;;) switch (state) { ++ ... ++ case STATEn: ++ if (not enough input data or output space to make progress) ++ return; ++ ... make progress ... ++ state = STATEm; ++ break; ++ ... ++ } ++ ++ so when inflate() is called again, the same case is attempted again, and ++ if the appropriate resources are provided, the machine proceeds to the ++ next state. The NEEDBITS() macro is usually the way the state evaluates ++ whether it can proceed or should return. NEEDBITS() does the return if ++ the requested bits are not available. The typical use of the BITS macros ++ is: ++ ++ NEEDBITS(n); ++ ... do something with BITS(n) ... ++ DROPBITS(n); ++ ++ where NEEDBITS(n) either returns from inflate() if there isn't enough ++ input left to load n bits into the accumulator, or it continues. BITS(n) ++ gives the low n bits in the accumulator. When done, DROPBITS(n) drops ++ the low n bits off the accumulator. INITBITS() clears the accumulator ++ and sets the number of available bits to zero. BYTEBITS() discards just ++ enough bits to put the accumulator on a byte boundary. After BYTEBITS() ++ and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. ++ ++ NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return ++ if there is no input available. The decoding of variable length codes uses ++ PULLBYTE() directly in order to pull just enough bytes to decode the next ++ code, and no more. ++ ++ Some states loop until they get enough input, making sure that enough ++ state information is maintained to continue the loop where it left off ++ if NEEDBITS() returns in the loop. For example, want, need, and keep ++ would all have to actually be part of the saved state in case NEEDBITS() ++ returns: ++ ++ case STATEw: ++ while (want < need) { ++ NEEDBITS(n); ++ keep[want++] = BITS(n); ++ DROPBITS(n); ++ } ++ state = STATEx; ++ case STATEx: ++ ++ As shown above, if the next state is also the next case, then the break ++ is omitted. ++ ++ A state may also return if there is not enough output space available to ++ complete that state. Those states are copying stored data, writing a ++ literal byte, and copying a matching string. ++ ++ When returning, a "goto inf_leave" is used to update the total counters, ++ update the check value, and determine whether any progress has been made ++ during that inflate() call in order to return the proper return code. ++ Progress is defined as a change in either strm->avail_in or strm->avail_out. ++ When there is a window, goto inf_leave will update the window with the last ++ output written. If a goto inf_leave occurs in the middle of decompression ++ and there is no window currently, goto inf_leave will create one and copy ++ output to the window for the next call of inflate(). ++ ++ In this implementation, the flush parameter of inflate() only affects the ++ return code (per zlib.h). inflate() always writes as much as possible to ++ strm->next_out, given the space available and the provided input--the effect ++ documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers ++ the allocation of and copying into a sliding window until necessary, which ++ provides the effect documented in zlib.h for Z_FINISH when the entire input ++ stream available. So the only thing the flush parameter actually does is: ++ when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it ++ will return Z_BUF_ERROR if it has not reached the end of the stream. ++ */ ++ ++int ZEXPORT inflate(strm, flush) ++z_streamp strm; ++int flush; ++{ ++ struct inflate_state FAR *state; ++ z_const unsigned char FAR *next; /* next input */ ++ unsigned char FAR *put; /* next output */ ++ unsigned have, left; /* available input and output */ ++ unsigned long hold; /* bit buffer */ ++ unsigned bits; /* bits in bit buffer */ ++ unsigned in, out; /* save starting available input and output */ ++ unsigned copy; /* number of stored or match bytes to copy */ ++ unsigned char FAR *from; /* where to copy match bytes from */ ++ code here; /* current decoding table entry */ ++ code last; /* parent table entry */ ++ unsigned len; /* length to copy for repeats, bits to drop */ ++ int ret; /* return code */ ++#ifdef GUNZIP ++ unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ ++#endif ++ static const unsigned short order[19] = /* permutation of code lengths */ ++ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || ++ (strm->next_in == Z_NULL && strm->avail_in != 0)) ++ return Z_STREAM_ERROR; ++ ++ state = (struct inflate_state FAR *)strm->state; ++ if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ ++ LOAD(); ++ in = have; ++ out = left; ++ ret = Z_OK; ++ for (;;) ++ switch (state->mode) { ++ case HEAD: ++ if (state->wrap == 0) { ++ state->mode = TYPEDO; ++ break; ++ } ++ NEEDBITS(16); ++#ifdef GUNZIP ++ if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ ++ state->check = crc32(0L, Z_NULL, 0); ++ CRC2(state->check, hold); ++ INITBITS(); ++ state->mode = FLAGS; ++ break; ++ } ++ state->flags = 0; /* expect zlib header */ ++ if (state->head != Z_NULL) ++ state->head->done = -1; ++ if (!(state->wrap & 1) || /* check if zlib header allowed */ ++#else ++ if ( ++#endif ++ ((BITS(8) << 8) + (hold >> 8)) % 31) { ++ strm->msg = (char *)"incorrect header check"; ++ state->mode = BAD; ++ break; ++ } ++ if (BITS(4) != Z_DEFLATED) { ++ strm->msg = (char *)"unknown compression method"; ++ state->mode = BAD; ++ break; ++ } ++ DROPBITS(4); ++ len = BITS(4) + 8; ++ if (state->wbits == 0) ++ state->wbits = len; ++ else if (len > state->wbits) { ++ strm->msg = (char *)"invalid window size"; ++ state->mode = BAD; ++ break; ++ } ++ state->dmax = 1U << len; ++ Tracev((stderr, "inflate: zlib header ok\n")); ++ strm->adler = state->check = adler32(0L, Z_NULL, 0); ++ state->mode = hold & 0x200 ? DICTID : TYPE; ++ INITBITS(); ++ break; ++#ifdef GUNZIP ++ case FLAGS: ++ NEEDBITS(16); ++ state->flags = (int)(hold); ++ if ((state->flags & 0xff) != Z_DEFLATED) { ++ strm->msg = (char *)"unknown compression method"; ++ state->mode = BAD; ++ break; ++ } ++ if (state->flags & 0xe000) { ++ strm->msg = (char *)"unknown header flags set"; ++ state->mode = BAD; ++ break; ++ } ++ if (state->head != Z_NULL) ++ state->head->text = (int)((hold >> 8) & 1); ++ if (state->flags & 0x0200) CRC2(state->check, hold); ++ INITBITS(); ++ state->mode = TIME; ++ case TIME: ++ NEEDBITS(32); ++ if (state->head != Z_NULL) ++ state->head->time = hold; ++ if (state->flags & 0x0200) CRC4(state->check, hold); ++ INITBITS(); ++ state->mode = OS; ++ case OS: ++ NEEDBITS(16); ++ if (state->head != Z_NULL) { ++ state->head->xflags = (int)(hold & 0xff); ++ state->head->os = (int)(hold >> 8); ++ } ++ if (state->flags & 0x0200) CRC2(state->check, hold); ++ INITBITS(); ++ state->mode = EXLEN; ++ case EXLEN: ++ if (state->flags & 0x0400) { ++ NEEDBITS(16); ++ state->length = (unsigned)(hold); ++ if (state->head != Z_NULL) ++ state->head->extra_len = (unsigned)hold; ++ if (state->flags & 0x0200) CRC2(state->check, hold); ++ INITBITS(); ++ } ++ else if (state->head != Z_NULL) ++ state->head->extra = Z_NULL; ++ state->mode = EXTRA; ++ case EXTRA: ++ if (state->flags & 0x0400) { ++ copy = state->length; ++ if (copy > have) copy = have; ++ if (copy) { ++ if (state->head != Z_NULL && ++ state->head->extra != Z_NULL) { ++ len = state->head->extra_len - state->length; ++ zmemcpy(state->head->extra + len, next, ++ len + copy > state->head->extra_max ? ++ state->head->extra_max - len : copy); ++ } ++ if (state->flags & 0x0200) ++ state->check = crc32(state->check, next, copy); ++ have -= copy; ++ next += copy; ++ state->length -= copy; ++ } ++ if (state->length) goto inf_leave; ++ } ++ state->length = 0; ++ state->mode = NAME; ++ case NAME: ++ if (state->flags & 0x0800) { ++ if (have == 0) goto inf_leave; ++ copy = 0; ++ do { ++ len = (unsigned)(next[copy++]); ++ if (state->head != Z_NULL && ++ state->head->name != Z_NULL && ++ state->length < state->head->name_max) ++ state->head->name[state->length++] = len; ++ } while (len && copy < have); ++ if (state->flags & 0x0200) ++ state->check = crc32(state->check, next, copy); ++ have -= copy; ++ next += copy; ++ if (len) goto inf_leave; ++ } ++ else if (state->head != Z_NULL) ++ state->head->name = Z_NULL; ++ state->length = 0; ++ state->mode = COMMENT; ++ case COMMENT: ++ if (state->flags & 0x1000) { ++ if (have == 0) goto inf_leave; ++ copy = 0; ++ do { ++ len = (unsigned)(next[copy++]); ++ if (state->head != Z_NULL && ++ state->head->comment != Z_NULL && ++ state->length < state->head->comm_max) ++ state->head->comment[state->length++] = len; ++ } while (len && copy < have); ++ if (state->flags & 0x0200) ++ state->check = crc32(state->check, next, copy); ++ have -= copy; ++ next += copy; ++ if (len) goto inf_leave; ++ } ++ else if (state->head != Z_NULL) ++ state->head->comment = Z_NULL; ++ state->mode = HCRC; ++ case HCRC: ++ if (state->flags & 0x0200) { ++ NEEDBITS(16); ++ if (hold != (state->check & 0xffff)) { ++ strm->msg = (char *)"header crc mismatch"; ++ state->mode = BAD; ++ break; ++ } ++ INITBITS(); ++ } ++ if (state->head != Z_NULL) { ++ state->head->hcrc = (int)((state->flags >> 9) & 1); ++ state->head->done = 1; ++ } ++ strm->adler = state->check = crc32(0L, Z_NULL, 0); ++ state->mode = TYPE; ++ break; ++#endif ++ case DICTID: ++ NEEDBITS(32); ++ strm->adler = state->check = ZSWAP32(hold); ++ INITBITS(); ++ state->mode = DICT; ++ case DICT: ++ if (state->havedict == 0) { ++ RESTORE(); ++ return Z_NEED_DICT; ++ } ++ strm->adler = state->check = adler32(0L, Z_NULL, 0); ++ state->mode = TYPE; ++ case TYPE: ++ if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; ++ case TYPEDO: ++ if (state->last) { ++ BYTEBITS(); ++ state->mode = CHECK; ++ break; ++ } ++ NEEDBITS(3); ++ state->last = BITS(1); ++ DROPBITS(1); ++ switch (BITS(2)) { ++ case 0: /* stored block */ ++ Tracev((stderr, "inflate: stored block%s\n", ++ state->last ? " (last)" : "")); ++ state->mode = STORED; ++ break; ++ case 1: /* fixed block */ ++ fixedtables(state); ++ Tracev((stderr, "inflate: fixed codes block%s\n", ++ state->last ? " (last)" : "")); ++ state->mode = LEN_; /* decode codes */ ++ if (flush == Z_TREES) { ++ DROPBITS(2); ++ goto inf_leave; ++ } ++ break; ++ case 2: /* dynamic block */ ++ Tracev((stderr, "inflate: dynamic codes block%s\n", ++ state->last ? " (last)" : "")); ++ state->mode = TABLE; ++ break; ++ case 3: ++ strm->msg = (char *)"invalid block type"; ++ state->mode = BAD; ++ } ++ DROPBITS(2); ++ break; ++ case STORED: ++ BYTEBITS(); /* go to byte boundary */ ++ NEEDBITS(32); ++ if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { ++ strm->msg = (char *)"invalid stored block lengths"; ++ state->mode = BAD; ++ break; ++ } ++ state->length = (unsigned)hold & 0xffff; ++ Tracev((stderr, "inflate: stored length %u\n", ++ state->length)); ++ INITBITS(); ++ state->mode = COPY_; ++ if (flush == Z_TREES) goto inf_leave; ++ case COPY_: ++ state->mode = COPY; ++ case COPY: ++ copy = state->length; ++ if (copy) { ++ if (copy > have) copy = have; ++ if (copy > left) copy = left; ++ if (copy == 0) goto inf_leave; ++ zmemcpy(put, next, copy); ++ have -= copy; ++ next += copy; ++ left -= copy; ++ put += copy; ++ state->length -= copy; ++ break; ++ } ++ Tracev((stderr, "inflate: stored end\n")); ++ state->mode = TYPE; ++ break; ++ case TABLE: ++ NEEDBITS(14); ++ state->nlen = BITS(5) + 257; ++ DROPBITS(5); ++ state->ndist = BITS(5) + 1; ++ DROPBITS(5); ++ state->ncode = BITS(4) + 4; ++ DROPBITS(4); ++#ifndef PKZIP_BUG_WORKAROUND ++ if (state->nlen > 286 || state->ndist > 30) { ++ strm->msg = (char *)"too many length or distance symbols"; ++ state->mode = BAD; ++ break; ++ } ++#endif ++ Tracev((stderr, "inflate: table sizes ok\n")); ++ state->have = 0; ++ state->mode = LENLENS; ++ case LENLENS: ++ while (state->have < state->ncode) { ++ NEEDBITS(3); ++ state->lens[order[state->have++]] = (unsigned short)BITS(3); ++ DROPBITS(3); ++ } ++ while (state->have < 19) ++ state->lens[order[state->have++]] = 0; ++ state->next = state->codes; ++ state->lencode = (const code FAR *)(state->next); ++ state->lenbits = 7; ++ ret = inflate_table(CODES, state->lens, 19, &(state->next), ++ &(state->lenbits), state->work); ++ if (ret) { ++ strm->msg = (char *)"invalid code lengths set"; ++ state->mode = BAD; ++ break; ++ } ++ Tracev((stderr, "inflate: code lengths ok\n")); ++ state->have = 0; ++ state->mode = CODELENS; ++ case CODELENS: ++ while (state->have < state->nlen + state->ndist) { ++ for (;;) { ++ here = state->lencode[BITS(state->lenbits)]; ++ if ((unsigned)(here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ if (here.val < 16) { ++ DROPBITS(here.bits); ++ state->lens[state->have++] = here.val; ++ } ++ else { ++ if (here.val == 16) { ++ NEEDBITS(here.bits + 2); ++ DROPBITS(here.bits); ++ if (state->have == 0) { ++ strm->msg = (char *)"invalid bit length repeat"; ++ state->mode = BAD; ++ break; ++ } ++ len = state->lens[state->have - 1]; ++ copy = 3 + BITS(2); ++ DROPBITS(2); ++ } ++ else if (here.val == 17) { ++ NEEDBITS(here.bits + 3); ++ DROPBITS(here.bits); ++ len = 0; ++ copy = 3 + BITS(3); ++ DROPBITS(3); ++ } ++ else { ++ NEEDBITS(here.bits + 7); ++ DROPBITS(here.bits); ++ len = 0; ++ copy = 11 + BITS(7); ++ DROPBITS(7); ++ } ++ if (state->have + copy > state->nlen + state->ndist) { ++ strm->msg = (char *)"invalid bit length repeat"; ++ state->mode = BAD; ++ break; ++ } ++ while (copy--) ++ state->lens[state->have++] = (unsigned short)len; ++ } ++ } ++ ++ /* handle error breaks in while */ ++ if (state->mode == BAD) break; ++ ++ /* check for end-of-block code (better have one) */ ++ if (state->lens[256] == 0) { ++ strm->msg = (char *)"invalid code -- missing end-of-block"; ++ state->mode = BAD; ++ break; ++ } ++ ++ /* build code tables -- note: do not change the lenbits or distbits ++ values here (9 and 6) without reading the comments in inftrees.h ++ concerning the ENOUGH constants, which depend on those values */ ++ state->next = state->codes; ++ state->lencode = (const code FAR *)(state->next); ++ state->lenbits = 9; ++ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), ++ &(state->lenbits), state->work); ++ if (ret) { ++ strm->msg = (char *)"invalid literal/lengths set"; ++ state->mode = BAD; ++ break; ++ } ++ state->distcode = (const code FAR *)(state->next); ++ state->distbits = 6; ++ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, ++ &(state->next), &(state->distbits), state->work); ++ if (ret) { ++ strm->msg = (char *)"invalid distances set"; ++ state->mode = BAD; ++ break; ++ } ++ Tracev((stderr, "inflate: codes ok\n")); ++ state->mode = LEN_; ++ if (flush == Z_TREES) goto inf_leave; ++ case LEN_: ++ state->mode = LEN; ++ case LEN: ++ if (have >= 6 && left >= 258) { ++ RESTORE(); ++ inflate_fast(strm, out); ++ LOAD(); ++ if (state->mode == TYPE) ++ state->back = -1; ++ break; ++ } ++ state->back = 0; ++ for (;;) { ++ here = state->lencode[BITS(state->lenbits)]; ++ if ((unsigned)(here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ if (here.op && (here.op & 0xf0) == 0) { ++ last = here; ++ for (;;) { ++ here = state->lencode[last.val + ++ (BITS(last.bits + last.op) >> last.bits)]; ++ if ((unsigned)(last.bits + here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ DROPBITS(last.bits); ++ state->back += last.bits; ++ } ++ DROPBITS(here.bits); ++ state->back += here.bits; ++ state->length = (unsigned)here.val; ++ if ((int)(here.op) == 0) { ++ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? ++ "inflate: literal '%c'\n" : ++ "inflate: literal 0x%02x\n", here.val)); ++ state->mode = LIT; ++ break; ++ } ++ if (here.op & 32) { ++ Tracevv((stderr, "inflate: end of block\n")); ++ state->back = -1; ++ state->mode = TYPE; ++ break; ++ } ++ if (here.op & 64) { ++ strm->msg = (char *)"invalid literal/length code"; ++ state->mode = BAD; ++ break; ++ } ++ state->extra = (unsigned)(here.op) & 15; ++ state->mode = LENEXT; ++ case LENEXT: ++ if (state->extra) { ++ NEEDBITS(state->extra); ++ state->length += BITS(state->extra); ++ DROPBITS(state->extra); ++ state->back += state->extra; ++ } ++ Tracevv((stderr, "inflate: length %u\n", state->length)); ++ state->was = state->length; ++ state->mode = DIST; ++ case DIST: ++ for (;;) { ++ here = state->distcode[BITS(state->distbits)]; ++ if ((unsigned)(here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ if ((here.op & 0xf0) == 0) { ++ last = here; ++ for (;;) { ++ here = state->distcode[last.val + ++ (BITS(last.bits + last.op) >> last.bits)]; ++ if ((unsigned)(last.bits + here.bits) <= bits) break; ++ PULLBYTE(); ++ } ++ DROPBITS(last.bits); ++ state->back += last.bits; ++ } ++ DROPBITS(here.bits); ++ state->back += here.bits; ++ if (here.op & 64) { ++ strm->msg = (char *)"invalid distance code"; ++ state->mode = BAD; ++ break; ++ } ++ state->offset = (unsigned)here.val; ++ state->extra = (unsigned)(here.op) & 15; ++ state->mode = DISTEXT; ++ case DISTEXT: ++ if (state->extra) { ++ NEEDBITS(state->extra); ++ state->offset += BITS(state->extra); ++ DROPBITS(state->extra); ++ state->back += state->extra; ++ } ++#ifdef INFLATE_STRICT ++ if (state->offset > state->dmax) { ++ strm->msg = (char *)"invalid distance too far back"; ++ state->mode = BAD; ++ break; ++ } ++#endif ++ Tracevv((stderr, "inflate: distance %u\n", state->offset)); ++ state->mode = MATCH; ++ case MATCH: ++ if (left == 0) goto inf_leave; ++ copy = out - left; ++ if (state->offset > copy) { /* copy from window */ ++ copy = state->offset - copy; ++ if (copy > state->whave) { ++ if (state->sane) { ++ strm->msg = (char *)"invalid distance too far back"; ++ state->mode = BAD; ++ break; ++ } ++#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR ++ Trace((stderr, "inflate.c too far\n")); ++ copy -= state->whave; ++ if (copy > state->length) copy = state->length; ++ if (copy > left) copy = left; ++ left -= copy; ++ state->length -= copy; ++ do { ++ *put++ = 0; ++ } while (--copy); ++ if (state->length == 0) state->mode = LEN; ++ break; ++#endif ++ } ++ if (copy > state->wnext) { ++ copy -= state->wnext; ++ from = state->window + (state->wsize - copy); ++ } ++ else ++ from = state->window + (state->wnext - copy); ++ if (copy > state->length) copy = state->length; ++ } ++ else { /* copy from output */ ++ from = put - state->offset; ++ copy = state->length; ++ } ++ if (copy > left) copy = left; ++ left -= copy; ++ state->length -= copy; ++ do { ++ *put++ = *from++; ++ } while (--copy); ++ if (state->length == 0) state->mode = LEN; ++ break; ++ case LIT: ++ if (left == 0) goto inf_leave; ++ *put++ = (unsigned char)(state->length); ++ left--; ++ state->mode = LEN; ++ break; ++ case CHECK: ++ if (state->wrap) { ++ NEEDBITS(32); ++ out -= left; ++ strm->total_out += out; ++ state->total += out; ++ if (out) ++ strm->adler = state->check = ++ UPDATE(state->check, put - out, out); ++ out = left; ++ if (( ++#ifdef GUNZIP ++ state->flags ? hold : ++#endif ++ ZSWAP32(hold)) != state->check) { ++ strm->msg = (char *)"incorrect data check"; ++ state->mode = BAD; ++ break; ++ } ++ INITBITS(); ++ Tracev((stderr, "inflate: check matches trailer\n")); ++ } ++#ifdef GUNZIP ++ state->mode = LENGTH; ++ case LENGTH: ++ if (state->wrap && state->flags) { ++ NEEDBITS(32); ++ if (hold != (state->total & 0xffffffffUL)) { ++ strm->msg = (char *)"incorrect length check"; ++ state->mode = BAD; ++ break; ++ } ++ INITBITS(); ++ Tracev((stderr, "inflate: length matches trailer\n")); ++ } ++#endif ++ state->mode = DONE; ++ case DONE: ++ ret = Z_STREAM_END; ++ goto inf_leave; ++ case BAD: ++ ret = Z_DATA_ERROR; ++ goto inf_leave; ++ case MEM: ++ return Z_MEM_ERROR; ++ case SYNC: ++ default: ++ return Z_STREAM_ERROR; ++ } ++ ++ /* ++ Return from inflate(), updating the total counts and the check value. ++ If there was no progress during the inflate() call, return a buffer ++ error. Call updatewindow() to create and/or update the window state. ++ Note: a memory error from inflate() is non-recoverable. ++ */ ++ inf_leave: ++ RESTORE(); ++ if (state->wsize || (out != strm->avail_out && state->mode < BAD && ++ (state->mode < CHECK || flush != Z_FINISH))) ++ if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { ++ state->mode = MEM; ++ return Z_MEM_ERROR; ++ } ++ in -= strm->avail_in; ++ out -= strm->avail_out; ++ strm->total_in += in; ++ strm->total_out += out; ++ state->total += out; ++ if (state->wrap && out) ++ strm->adler = state->check = ++ UPDATE(state->check, strm->next_out - out, out); ++ strm->data_type = state->bits + (state->last ? 64 : 0) + ++ (state->mode == TYPE ? 128 : 0) + ++ (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); ++ if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ++ ret = Z_BUF_ERROR; ++ return ret; ++} ++ ++int ZEXPORT inflateEnd(strm) ++z_streamp strm; ++{ ++ struct inflate_state FAR *state; ++ if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) ++ return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ if (state->window != Z_NULL) ZFREE(strm, state->window); ++ ZFREE(strm, strm->state); ++ strm->state = Z_NULL; ++ Tracev((stderr, "inflate: end\n")); ++ return Z_OK; ++} ++ ++int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) ++z_streamp strm; ++Bytef *dictionary; ++uInt *dictLength; ++{ ++ struct inflate_state FAR *state; ++ ++ /* check state */ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ ++ /* copy dictionary */ ++ if (state->whave && dictionary != Z_NULL) { ++ zmemcpy(dictionary, state->window + state->wnext, ++ state->whave - state->wnext); ++ zmemcpy(dictionary + state->whave - state->wnext, ++ state->window, state->wnext); ++ } ++ if (dictLength != Z_NULL) ++ *dictLength = state->whave; ++ return Z_OK; ++} ++ ++int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) ++z_streamp strm; ++const Bytef *dictionary; ++uInt dictLength; ++{ ++ struct inflate_state FAR *state; ++ unsigned long dictid; ++ int ret; ++ ++ /* check state */ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ if (state->wrap != 0 && state->mode != DICT) ++ return Z_STREAM_ERROR; ++ ++ /* check for correct dictionary identifier */ ++ if (state->mode == DICT) { ++ dictid = adler32(0L, Z_NULL, 0); ++ dictid = adler32(dictid, dictionary, dictLength); ++ if (dictid != state->check) ++ return Z_DATA_ERROR; ++ } ++ ++ /* copy dictionary to window using updatewindow(), which will amend the ++ existing dictionary if appropriate */ ++ ret = updatewindow(strm, dictionary + dictLength, dictLength); ++ if (ret) { ++ state->mode = MEM; ++ return Z_MEM_ERROR; ++ } ++ state->havedict = 1; ++ Tracev((stderr, "inflate: dictionary set\n")); ++ return Z_OK; ++} ++ ++int ZEXPORT inflateGetHeader(strm, head) ++z_streamp strm; ++gz_headerp head; ++{ ++ struct inflate_state FAR *state; ++ ++ /* check state */ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; ++ ++ /* save header structure */ ++ state->head = head; ++ head->done = 0; ++ return Z_OK; ++} ++ ++/* ++ Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found ++ or when out of input. When called, *have is the number of pattern bytes ++ found in order so far, in 0..3. On return *have is updated to the new ++ state. If on return *have equals four, then the pattern was found and the ++ return value is how many bytes were read including the last byte of the ++ pattern. If *have is less than four, then the pattern has not been found ++ yet and the return value is len. In the latter case, syncsearch() can be ++ called again with more data and the *have state. *have is initialized to ++ zero for the first call. ++ */ ++local unsigned syncsearch(have, buf, len) ++unsigned FAR *have; ++const unsigned char FAR *buf; ++unsigned len; ++{ ++ unsigned got; ++ unsigned next; ++ ++ got = *have; ++ next = 0; ++ while (next < len && got < 4) { ++ if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) ++ got++; ++ else if (buf[next]) ++ got = 0; ++ else ++ got = 4 - got; ++ next++; ++ } ++ *have = got; ++ return next; ++} ++ ++int ZEXPORT inflateSync(strm) ++z_streamp strm; ++{ ++ unsigned len; /* number of bytes to look at or looked at */ ++ unsigned long in, out; /* temporary to save total_in and total_out */ ++ unsigned char buf[4]; /* to restore bit buffer to byte string */ ++ struct inflate_state FAR *state; ++ ++ /* check parameters */ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; ++ ++ /* if first time, start search in bit buffer */ ++ if (state->mode != SYNC) { ++ state->mode = SYNC; ++ state->hold <<= state->bits & 7; ++ state->bits -= state->bits & 7; ++ len = 0; ++ while (state->bits >= 8) { ++ buf[len++] = (unsigned char)(state->hold); ++ state->hold >>= 8; ++ state->bits -= 8; ++ } ++ state->have = 0; ++ syncsearch(&(state->have), buf, len); ++ } ++ ++ /* search available input */ ++ len = syncsearch(&(state->have), strm->next_in, strm->avail_in); ++ strm->avail_in -= len; ++ strm->next_in += len; ++ strm->total_in += len; ++ ++ /* return no joy or set up to restart inflate() on a new block */ ++ if (state->have != 4) return Z_DATA_ERROR; ++ in = strm->total_in; out = strm->total_out; ++ inflateReset(strm); ++ strm->total_in = in; strm->total_out = out; ++ state->mode = TYPE; ++ return Z_OK; ++} ++ ++/* ++ Returns true if inflate is currently at the end of a block generated by ++ Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP ++ implementation to provide an additional safety check. PPP uses ++ Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored ++ block. When decompressing, PPP checks that at the end of input packet, ++ inflate is waiting for these length bytes. ++ */ ++int ZEXPORT inflateSyncPoint(strm) ++z_streamp strm; ++{ ++ struct inflate_state FAR *state; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ return state->mode == STORED && state->bits == 0; ++} ++ ++int ZEXPORT inflateCopy(dest, source) ++z_streamp dest; ++z_streamp source; ++{ ++ struct inflate_state FAR *state; ++ struct inflate_state FAR *copy; ++ unsigned char FAR *window; ++ unsigned wsize; ++ ++ /* check input */ ++ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || ++ source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) ++ return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)source->state; ++ ++ /* allocate space */ ++ copy = (struct inflate_state FAR *) ++ ZALLOC(source, 1, sizeof(struct inflate_state)); ++ if (copy == Z_NULL) return Z_MEM_ERROR; ++ window = Z_NULL; ++ if (state->window != Z_NULL) { ++ window = (unsigned char FAR *) ++ ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); ++ if (window == Z_NULL) { ++ ZFREE(source, copy); ++ return Z_MEM_ERROR; ++ } ++ } ++ ++ /* copy state */ ++ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); ++ zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); ++ if (state->lencode >= state->codes && ++ state->lencode <= state->codes + ENOUGH - 1) { ++ copy->lencode = copy->codes + (state->lencode - state->codes); ++ copy->distcode = copy->codes + (state->distcode - state->codes); ++ } ++ copy->next = copy->codes + (state->next - state->codes); ++ if (window != Z_NULL) { ++ wsize = 1U << state->wbits; ++ zmemcpy(window, state->window, wsize); ++ } ++ copy->window = window; ++ dest->state = (struct internal_state FAR *)copy; ++ return Z_OK; ++} ++ ++int ZEXPORT inflateUndermine(strm, subvert) ++z_streamp strm; ++int subvert; ++{ ++ struct inflate_state FAR *state; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; ++ state = (struct inflate_state FAR *)strm->state; ++ state->sane = !subvert; ++#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR ++ return Z_OK; ++#else ++ state->sane = 1; ++ return Z_DATA_ERROR; ++#endif ++} ++ ++long ZEXPORT inflateMark(strm) ++z_streamp strm; ++{ ++ struct inflate_state FAR *state; ++ ++ if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; ++ state = (struct inflate_state FAR *)strm->state; ++ return ((long)(state->back) << 16) + ++ (state->mode == COPY ? state->length : ++ (state->mode == MATCH ? state->was - state->length : 0)); ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inflate.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inflate.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,146 @@ ++/* ++ * 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. ++ */ ++ ++/* inflate.h -- internal inflate state definition ++ * Copyright (C) 1995-2009 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++/* define NO_GZIP when compiling if you want to disable gzip header and ++ trailer decoding by inflate(). NO_GZIP would be used to avoid linking in ++ the crc code when it is not needed. For shared libraries, gzip decoding ++ should be left enabled. */ ++#ifndef NO_GZIP ++# define GUNZIP ++#endif ++ ++/* Possible inflate modes between inflate() calls */ ++typedef enum { ++ HEAD, /* i: waiting for magic header */ ++ FLAGS, /* i: waiting for method and flags (gzip) */ ++ TIME, /* i: waiting for modification time (gzip) */ ++ OS, /* i: waiting for extra flags and operating system (gzip) */ ++ EXLEN, /* i: waiting for extra length (gzip) */ ++ EXTRA, /* i: waiting for extra bytes (gzip) */ ++ NAME, /* i: waiting for end of file name (gzip) */ ++ COMMENT, /* i: waiting for end of comment (gzip) */ ++ HCRC, /* i: waiting for header crc (gzip) */ ++ DICTID, /* i: waiting for dictionary check value */ ++ DICT, /* waiting for inflateSetDictionary() call */ ++ TYPE, /* i: waiting for type bits, including last-flag bit */ ++ TYPEDO, /* i: same, but skip check to exit inflate on new block */ ++ STORED, /* i: waiting for stored size (length and complement) */ ++ COPY_, /* i/o: same as COPY below, but only first time in */ ++ COPY, /* i/o: waiting for input or output to copy stored block */ ++ TABLE, /* i: waiting for dynamic block table lengths */ ++ LENLENS, /* i: waiting for code length code lengths */ ++ CODELENS, /* i: waiting for length/lit and distance code lengths */ ++ LEN_, /* i: same as LEN below, but only first time in */ ++ LEN, /* i: waiting for length/lit/eob code */ ++ LENEXT, /* i: waiting for length extra bits */ ++ DIST, /* i: waiting for distance code */ ++ DISTEXT, /* i: waiting for distance extra bits */ ++ MATCH, /* o: waiting for output space to copy string */ ++ LIT, /* o: waiting for output space to write literal */ ++ CHECK, /* i: waiting for 32-bit check value */ ++ LENGTH, /* i: waiting for 32-bit length (gzip) */ ++ DONE, /* finished check, done -- remain here until reset */ ++ BAD, /* got a data error -- remain here until reset */ ++ MEM, /* got an inflate() memory error -- remain here until reset */ ++ SYNC /* looking for synchronization bytes to restart inflate() */ ++} inflate_mode; ++ ++/* ++ State transitions between above modes - ++ ++ (most modes can go to BAD or MEM on error -- not shown for clarity) ++ ++ Process header: ++ HEAD -> (gzip) or (zlib) or (raw) ++ (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> ++ HCRC -> TYPE ++ (zlib) -> DICTID or TYPE ++ DICTID -> DICT -> TYPE ++ (raw) -> TYPEDO ++ Read deflate blocks: ++ TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK ++ STORED -> COPY_ -> COPY -> TYPE ++ TABLE -> LENLENS -> CODELENS -> LEN_ ++ LEN_ -> LEN ++ Read deflate codes in fixed or dynamic block: ++ LEN -> LENEXT or LIT or TYPE ++ LENEXT -> DIST -> DISTEXT -> MATCH -> LEN ++ LIT -> LEN ++ Process trailer: ++ CHECK -> LENGTH -> DONE ++ */ ++ ++/* state maintained between inflate() calls. Approximately 10K bytes. */ ++struct inflate_state { ++ inflate_mode mode; /* current inflate mode */ ++ int last; /* true if processing last block */ ++ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ ++ int havedict; /* true if dictionary provided */ ++ int flags; /* gzip header method and flags (0 if zlib) */ ++ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ ++ unsigned long check; /* protected copy of check value */ ++ unsigned long total; /* protected copy of output count */ ++ gz_headerp head; /* where to save gzip header information */ ++ /* sliding window */ ++ unsigned wbits; /* log base 2 of requested window size */ ++ unsigned wsize; /* window size or zero if not using window */ ++ unsigned whave; /* valid bytes in the window */ ++ unsigned wnext; /* window write index */ ++ unsigned char FAR *window; /* allocated sliding window, if needed */ ++ /* bit accumulator */ ++ unsigned long hold; /* input bit accumulator */ ++ unsigned bits; /* number of bits in "in" */ ++ /* for string and stored block copying */ ++ unsigned length; /* literal or length of data to copy */ ++ unsigned offset; /* distance back to copy string from */ ++ /* for table and code decoding */ ++ unsigned extra; /* extra bits needed */ ++ /* fixed and dynamic code tables */ ++ code const FAR *lencode; /* starting table for length/literal codes */ ++ code const FAR *distcode; /* starting table for distance codes */ ++ unsigned lenbits; /* index bits for lencode */ ++ unsigned distbits; /* index bits for distcode */ ++ /* dynamic table building */ ++ unsigned ncode; /* number of code length code lengths */ ++ unsigned nlen; /* number of length code lengths */ ++ unsigned ndist; /* number of distance code lengths */ ++ unsigned have; /* number of code lengths in lens[] */ ++ code FAR *next; /* next available space in codes[] */ ++ unsigned short lens[320]; /* temporary storage for code lengths */ ++ unsigned short work[288]; /* work area for code table building */ ++ code codes[ENOUGH]; /* space for code tables */ ++ int sane; /* if false, allow invalid distance too far */ ++ int back; /* bits back of last unprocessed length/lit */ ++ unsigned was; /* initial length of match */ ++}; +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inftrees.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inftrees.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,330 @@ ++/* ++ * 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. ++ */ ++ ++/* inftrees.c -- generate Huffman trees for efficient decoding ++ * Copyright (C) 1995-2013 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++#include "zutil.h" ++#include "inftrees.h" ++ ++#define MAXBITS 15 ++ ++const char inflate_copyright[] = ++ " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; ++/* ++ If you use the zlib library in a product, an acknowledgment is welcome ++ in the documentation of your product. If for some reason you cannot ++ include such an acknowledgment, I would appreciate that you keep this ++ copyright string in the executable of your product. ++ */ ++ ++/* ++ Build a set of tables to decode the provided canonical Huffman code. ++ The code lengths are lens[0..codes-1]. The result starts at *table, ++ whose indices are 0..2^bits-1. work is a writable array of at least ++ lens shorts, which is used as a work area. type is the type of code ++ to be generated, CODES, LENS, or DISTS. On return, zero is success, ++ -1 is an invalid code, and +1 means that ENOUGH isn't enough. table ++ on return points to the next available entry's address. bits is the ++ requested root table index bits, and on return it is the actual root ++ table index bits. It will differ if the request is greater than the ++ longest code or if it is less than the shortest code. ++ */ ++int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) ++codetype type; ++unsigned short FAR *lens; ++unsigned codes; ++code FAR * FAR *table; ++unsigned FAR *bits; ++unsigned short FAR *work; ++{ ++ unsigned len; /* a code's length in bits */ ++ unsigned sym; /* index of code symbols */ ++ unsigned min, max; /* minimum and maximum code lengths */ ++ unsigned root; /* number of index bits for root table */ ++ unsigned curr; /* number of index bits for current table */ ++ unsigned drop; /* code bits to drop for sub-table */ ++ int left; /* number of prefix codes available */ ++ unsigned used; /* code entries in table used */ ++ unsigned huff; /* Huffman code */ ++ unsigned incr; /* for incrementing code, index */ ++ unsigned fill; /* index for replicating entries */ ++ unsigned low; /* low bits for current root entry */ ++ unsigned mask; /* mask for low root bits */ ++ code here; /* table entry for duplication */ ++ code FAR *next; /* next available space in table */ ++ const unsigned short FAR *base; /* base value table to use */ ++ const unsigned short FAR *extra; /* extra bits table to use */ ++ int end; /* use base and extra for symbol > end */ ++ unsigned short count[MAXBITS+1]; /* number of codes of each length */ ++ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ ++ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ ++ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, ++ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; ++ static const unsigned short lext[31] = { /* Length codes 257..285 extra */ ++ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, ++ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; ++ static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ ++ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, ++ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, ++ 8193, 12289, 16385, 24577, 0, 0}; ++ static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ ++ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, ++ 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, ++ 28, 28, 29, 29, 64, 64}; ++ ++ /* ++ Process a set of code lengths to create a canonical Huffman code. The ++ code lengths are lens[0..codes-1]. Each length corresponds to the ++ symbols 0..codes-1. The Huffman code is generated by first sorting the ++ symbols by length from short to long, and retaining the symbol order ++ for codes with equal lengths. Then the code starts with all zero bits ++ for the first code of the shortest length, and the codes are integer ++ increments for the same length, and zeros are appended as the length ++ increases. For the deflate format, these bits are stored backwards ++ from their more natural integer increment ordering, and so when the ++ decoding tables are built in the large loop below, the integer codes ++ are incremented backwards. ++ ++ This routine assumes, but does not check, that all of the entries in ++ lens[] are in the range 0..MAXBITS. The caller must assure this. ++ 1..MAXBITS is interpreted as that code length. zero means that that ++ symbol does not occur in this code. ++ ++ The codes are sorted by computing a count of codes for each length, ++ creating from that a table of starting indices for each length in the ++ sorted table, and then entering the symbols in order in the sorted ++ table. The sorted table is work[], with that space being provided by ++ the caller. ++ ++ The length counts are used for other purposes as well, i.e. finding ++ the minimum and maximum length codes, determining if there are any ++ codes at all, checking for a valid set of lengths, and looking ahead ++ at length counts to determine sub-table sizes when building the ++ decoding tables. ++ */ ++ ++ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ ++ for (len = 0; len <= MAXBITS; len++) ++ count[len] = 0; ++ for (sym = 0; sym < codes; sym++) ++ count[lens[sym]]++; ++ ++ /* bound code lengths, force root to be within code lengths */ ++ root = *bits; ++ for (max = MAXBITS; max >= 1; max--) ++ if (count[max] != 0) break; ++ if (root > max) root = max; ++ if (max == 0) { /* no symbols to code at all */ ++ here.op = (unsigned char)64; /* invalid code marker */ ++ here.bits = (unsigned char)1; ++ here.val = (unsigned short)0; ++ *(*table)++ = here; /* make a table to force an error */ ++ *(*table)++ = here; ++ *bits = 1; ++ return 0; /* no symbols, but wait for decoding to report error */ ++ } ++ for (min = 1; min < max; min++) ++ if (count[min] != 0) break; ++ if (root < min) root = min; ++ ++ /* check for an over-subscribed or incomplete set of lengths */ ++ left = 1; ++ for (len = 1; len <= MAXBITS; len++) { ++ left <<= 1; ++ left -= count[len]; ++ if (left < 0) return -1; /* over-subscribed */ ++ } ++ if (left > 0 && (type == CODES || max != 1)) ++ return -1; /* incomplete set */ ++ ++ /* generate offsets into symbol table for each length for sorting */ ++ offs[1] = 0; ++ for (len = 1; len < MAXBITS; len++) ++ offs[len + 1] = offs[len] + count[len]; ++ ++ /* sort symbols by length, by symbol order within each length */ ++ for (sym = 0; sym < codes; sym++) ++ if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; ++ ++ /* ++ Create and fill in decoding tables. In this loop, the table being ++ filled is at next and has curr index bits. The code being used is huff ++ with length len. That code is converted to an index by dropping drop ++ bits off of the bottom. For codes where len is less than drop + curr, ++ those top drop + curr - len bits are incremented through all values to ++ fill the table with replicated entries. ++ ++ root is the number of index bits for the root table. When len exceeds ++ root, sub-tables are created pointed to by the root entry with an index ++ of the low root bits of huff. This is saved in low to check for when a ++ new sub-table should be started. drop is zero when the root table is ++ being filled, and drop is root when sub-tables are being filled. ++ ++ When a new sub-table is needed, it is necessary to look ahead in the ++ code lengths to determine what size sub-table is needed. The length ++ counts are used for this, and so count[] is decremented as codes are ++ entered in the tables. ++ ++ used keeps track of how many table entries have been allocated from the ++ provided *table space. It is checked for LENS and DIST tables against ++ the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in ++ the initial root table size constants. See the comments in inftrees.h ++ for more information. ++ ++ sym increments through all symbols, and the loop terminates when ++ all codes of length max, i.e. all codes, have been processed. This ++ routine permits incomplete codes, so another loop after this one fills ++ in the rest of the decoding tables with invalid code markers. ++ */ ++ ++ /* set up for code type */ ++ switch (type) { ++ case CODES: ++ base = extra = work; /* dummy value--not used */ ++ end = 19; ++ break; ++ case LENS: ++ base = lbase; ++ base -= 257; ++ extra = lext; ++ extra -= 257; ++ end = 256; ++ break; ++ default: /* DISTS */ ++ base = dbase; ++ extra = dext; ++ end = -1; ++ } ++ ++ /* initialize state for loop */ ++ huff = 0; /* starting code */ ++ sym = 0; /* starting code symbol */ ++ len = min; /* starting code length */ ++ next = *table; /* current table to fill in */ ++ curr = root; /* current table index bits */ ++ drop = 0; /* current bits to drop from code for index */ ++ low = (unsigned)(-1); /* trigger new sub-table when len > root */ ++ used = 1U << root; /* use root table entries */ ++ mask = used - 1; /* mask for comparing low */ ++ ++ /* check available table space */ ++ if ((type == LENS && used > ENOUGH_LENS) || ++ (type == DISTS && used > ENOUGH_DISTS)) ++ return 1; ++ ++ /* process all codes and make table entries */ ++ for (;;) { ++ /* create table entry */ ++ here.bits = (unsigned char)(len - drop); ++ if ((int)(work[sym]) < end) { ++ here.op = (unsigned char)0; ++ here.val = work[sym]; ++ } ++ else if ((int)(work[sym]) > end) { ++ here.op = (unsigned char)(extra[work[sym]]); ++ here.val = base[work[sym]]; ++ } ++ else { ++ here.op = (unsigned char)(32 + 64); /* end of block */ ++ here.val = 0; ++ } ++ ++ /* replicate for those indices with low len bits equal to huff */ ++ incr = 1U << (len - drop); ++ fill = 1U << curr; ++ min = fill; /* save offset to next table */ ++ do { ++ fill -= incr; ++ next[(huff >> drop) + fill] = here; ++ } while (fill != 0); ++ ++ /* backwards increment the len-bit code huff */ ++ incr = 1U << (len - 1); ++ while (huff & incr) ++ incr >>= 1; ++ if (incr != 0) { ++ huff &= incr - 1; ++ huff += incr; ++ } ++ else ++ huff = 0; ++ ++ /* go to next symbol, update count, len */ ++ sym++; ++ if (--(count[len]) == 0) { ++ if (len == max) break; ++ len = lens[work[sym]]; ++ } ++ ++ /* create new sub-table if needed */ ++ if (len > root && (huff & mask) != low) { ++ /* if first time, transition to sub-tables */ ++ if (drop == 0) ++ drop = root; ++ ++ /* increment past last table */ ++ next += min; /* here min is 1 << curr */ ++ ++ /* determine length of next table */ ++ curr = len - drop; ++ left = (int)(1 << curr); ++ while (curr + drop < max) { ++ left -= count[curr + drop]; ++ if (left <= 0) break; ++ curr++; ++ left <<= 1; ++ } ++ ++ /* check for enough space */ ++ used += 1U << curr; ++ if ((type == LENS && used > ENOUGH_LENS) || ++ (type == DISTS && used > ENOUGH_DISTS)) ++ return 1; ++ ++ /* point entry in root table to sub-table */ ++ low = huff & mask; ++ (*table)[low].op = (unsigned char)curr; ++ (*table)[low].bits = (unsigned char)root; ++ (*table)[low].val = (unsigned short)(next - *table); ++ } ++ } ++ ++ /* fill in remaining table entry if code is incomplete (guaranteed to have ++ at most one remaining entry, since if the code is incomplete, the ++ maximum code length that was allowed to get this far is one bit) */ ++ if (huff != 0) { ++ here.op = (unsigned char)64; /* invalid code marker */ ++ here.bits = (unsigned char)(len - drop); ++ here.val = (unsigned short)0; ++ next[huff] = here; ++ } ++ ++ /* set return parameters */ ++ *table += used; ++ *bits = root; ++ return 0; ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inftrees.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/inftrees.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,86 @@ ++/* ++ * 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. ++ */ ++ ++/* inftrees.h -- header to use inftrees.c ++ * Copyright (C) 1995-2005, 2010 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++/* Structure for decoding tables. Each entry provides either the ++ information needed to do the operation requested by the code that ++ indexed that table entry, or it provides a pointer to another ++ table that indexes more bits of the code. op indicates whether ++ the entry is a pointer to another table, a literal, a length or ++ distance, an end-of-block, or an invalid code. For a table ++ pointer, the low four bits of op is the number of index bits of ++ that table. For a length or distance, the low four bits of op ++ is the number of extra bits to get after the code. bits is ++ the number of bits in this code or part of the code to drop off ++ of the bit buffer. val is the actual byte to output in the case ++ of a literal, the base length or distance, or the offset from ++ the current table to the next table. Each entry is four bytes. */ ++typedef struct { ++ unsigned char op; /* operation, extra bits, table bits */ ++ unsigned char bits; /* bits in this part of the code */ ++ unsigned short val; /* offset in table or code value */ ++} code; ++ ++/* op values as set by inflate_table(): ++ 00000000 - literal ++ 0000tttt - table link, tttt != 0 is the number of table index bits ++ 0001eeee - length or distance, eeee is the number of extra bits ++ 01100000 - end of block ++ 01000000 - invalid code ++ */ ++ ++/* Maximum size of the dynamic table. The maximum number of code structures is ++ 1444, which is the sum of 852 for literal/length codes and 592 for distance ++ codes. These values were found by exhaustive searches using the program ++ examples/enough.c found in the zlib distribtution. The arguments to that ++ program are the number of symbols, the initial root table size, and the ++ maximum bit length of a code. "enough 286 9 15" for literal/length codes ++ returns returns 852, and "enough 30 6 15" for distance codes returns 592. ++ The initial root table size (9 or 6) is found in the fifth argument of the ++ inflate_table() calls in inflate.c and infback.c. If the root table size is ++ changed, then these maximum sizes would be need to be recalculated and ++ updated. */ ++#define ENOUGH_LENS 852 ++#define ENOUGH_DISTS 592 ++#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) ++ ++/* Type of code to build for inflate_table() */ ++typedef enum { ++ CODES, ++ LENS, ++ DISTS ++} codetype; ++ ++int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, ++ unsigned codes, code FAR * FAR *table, ++ unsigned FAR *bits, unsigned short FAR *work)); +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/patches/ChangeLog_java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/patches/ChangeLog_java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,10 @@ ++(1)renamed ++ adler32.c -> zadler32.c ++ zcrc32c -> zcrc32.c ++ ++(2)added _LP64 to make uLong a 32-bit int on 64-bit platform ++ zconf.h: ++ uLong -> 32-bit int ++ ++(3)updated crc32.c/crc32() ++ unsigned long -> uLong +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/trees.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/trees.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,1250 @@ ++/* ++ * 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. ++ */ ++ ++/* trees.c -- output deflated data using Huffman coding ++ * Copyright (C) 1995-2012 Jean-loup Gailly ++ * detect_data_type() function provided freely by Cosmin Truta, 2006 ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* ++ * ALGORITHM ++ * ++ * The "deflation" process uses several Huffman trees. The more ++ * common source values are represented by shorter bit sequences. ++ * ++ * Each code tree is stored in a compressed form which is itself ++ * a Huffman encoding of the lengths of all the code strings (in ++ * ascending order by source values). The actual code strings are ++ * reconstructed from the lengths in the inflate process, as described ++ * in the deflate specification. ++ * ++ * REFERENCES ++ * ++ * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". ++ * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc ++ * ++ * Storer, James A. ++ * Data Compression: Methods and Theory, pp. 49-50. ++ * Computer Science Press, 1988. ISBN 0-7167-8156-5. ++ * ++ * Sedgewick, R. ++ * Algorithms, p290. ++ * Addison-Wesley, 1983. ISBN 0-201-06672-6. ++ */ ++ ++/* @(#) $Id$ */ ++ ++/* #define GEN_TREES_H */ ++ ++#include "deflate.h" ++ ++#ifdef DEBUG ++# include <ctype.h> ++#endif ++ ++/* =========================================================================== ++ * Constants ++ */ ++ ++#define MAX_BL_BITS 7 ++/* Bit length codes must not exceed MAX_BL_BITS bits */ ++ ++#define END_BLOCK 256 ++/* end of block literal code */ ++ ++#define REP_3_6 16 ++/* repeat previous bit length 3-6 times (2 bits of repeat count) */ ++ ++#define REPZ_3_10 17 ++/* repeat a zero length 3-10 times (3 bits of repeat count) */ ++ ++#define REPZ_11_138 18 ++/* repeat a zero length 11-138 times (7 bits of repeat count) */ ++ ++local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ ++ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; ++ ++local const int extra_dbits[D_CODES] /* extra bits for each distance code */ ++ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; ++ ++local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ ++ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; ++ ++local const uch bl_order[BL_CODES] ++ = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; ++/* The lengths of the bit length codes are sent in order of decreasing ++ * probability, to avoid transmitting the lengths for unused bit length codes. ++ */ ++ ++/* =========================================================================== ++ * Local data. These are initialized only once. ++ */ ++ ++#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ ++ ++#if defined(GEN_TREES_H) || !defined(STDC) ++/* non ANSI compilers may not accept trees.h */ ++ ++local ct_data static_ltree[L_CODES+2]; ++/* The static literal tree. Since the bit lengths are imposed, there is no ++ * need for the L_CODES extra codes used during heap construction. However ++ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init ++ * below). ++ */ ++ ++local ct_data static_dtree[D_CODES]; ++/* The static distance tree. (Actually a trivial tree since all codes use ++ * 5 bits.) ++ */ ++ ++uch _dist_code[DIST_CODE_LEN]; ++/* Distance codes. The first 256 values correspond to the distances ++ * 3 .. 258, the last 256 values correspond to the top 8 bits of ++ * the 15 bit distances. ++ */ ++ ++uch _length_code[MAX_MATCH-MIN_MATCH+1]; ++/* length code for each normalized match length (0 == MIN_MATCH) */ ++ ++local int base_length[LENGTH_CODES]; ++/* First normalized length for each code (0 = MIN_MATCH) */ ++ ++local int base_dist[D_CODES]; ++/* First normalized distance for each code (0 = distance of 1) */ ++ ++#else ++# include "trees.h" ++#endif /* GEN_TREES_H */ ++ ++struct static_tree_desc_s { ++ const ct_data *static_tree; /* static tree or NULL */ ++ const intf *extra_bits; /* extra bits for each code or NULL */ ++ int extra_base; /* base index for extra_bits */ ++ int elems; /* max number of elements in the tree */ ++ int max_length; /* max bit length for the codes */ ++}; ++ ++local static_tree_desc static_l_desc = ++{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; ++ ++local static_tree_desc static_d_desc = ++{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; ++ ++local static_tree_desc static_bl_desc = ++{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; ++ ++/* =========================================================================== ++ * Local (static) routines in this file. ++ */ ++ ++local void tr_static_init OF((void)); ++local void init_block OF((deflate_state *s)); ++local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); ++local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); ++local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); ++local void build_tree OF((deflate_state *s, tree_desc *desc)); ++local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); ++local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); ++local int build_bl_tree OF((deflate_state *s)); ++local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, ++ int blcodes)); ++local void compress_block OF((deflate_state *s, const ct_data *ltree, ++ const ct_data *dtree)); ++local int detect_data_type OF((deflate_state *s)); ++local unsigned bi_reverse OF((unsigned value, int length)); ++local void bi_windup OF((deflate_state *s)); ++local void bi_flush OF((deflate_state *s)); ++local void copy_block OF((deflate_state *s, charf *buf, unsigned len, ++ int header)); ++ ++#ifdef GEN_TREES_H ++local void gen_trees_header OF((void)); ++#endif ++ ++#ifndef DEBUG ++# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) ++ /* Send a code of the given tree. c and tree must not have side effects */ ++ ++#else /* DEBUG */ ++# define send_code(s, c, tree) \ ++ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ ++ send_bits(s, tree[c].Code, tree[c].Len); } ++#endif ++ ++/* =========================================================================== ++ * Output a short LSB first on the stream. ++ * IN assertion: there is enough room in pendingBuf. ++ */ ++#define put_short(s, w) { \ ++ put_byte(s, (uch)((w) & 0xff)); \ ++ put_byte(s, (uch)((ush)(w) >> 8)); \ ++} ++ ++/* =========================================================================== ++ * Send a value on a given number of bits. ++ * IN assertion: length <= 16 and value fits in length bits. ++ */ ++#ifdef DEBUG ++local void send_bits OF((deflate_state *s, int value, int length)); ++ ++local void send_bits(s, value, length) ++ deflate_state *s; ++ int value; /* value to send */ ++ int length; /* number of bits */ ++{ ++ Tracevv((stderr," l %2d v %4x ", length, value)); ++ Assert(length > 0 && length <= 15, "invalid length"); ++ s->bits_sent += (ulg)length; ++ ++ /* If not enough room in bi_buf, use (valid) bits from bi_buf and ++ * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) ++ * unused bits in value. ++ */ ++ if (s->bi_valid > (int)Buf_size - length) { ++ s->bi_buf |= (ush)value << s->bi_valid; ++ put_short(s, s->bi_buf); ++ s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); ++ s->bi_valid += length - Buf_size; ++ } else { ++ s->bi_buf |= (ush)value << s->bi_valid; ++ s->bi_valid += length; ++ } ++} ++#else /* !DEBUG */ ++ ++#define send_bits(s, value, length) \ ++{ int len = length;\ ++ if (s->bi_valid > (int)Buf_size - len) {\ ++ int val = value;\ ++ s->bi_buf |= (ush)val << s->bi_valid;\ ++ put_short(s, s->bi_buf);\ ++ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ ++ s->bi_valid += len - Buf_size;\ ++ } else {\ ++ s->bi_buf |= (ush)(value) << s->bi_valid;\ ++ s->bi_valid += len;\ ++ }\ ++} ++#endif /* DEBUG */ ++ ++ ++/* the arguments must not have side effects */ ++ ++/* =========================================================================== ++ * Initialize the various 'constant' tables. ++ */ ++local void tr_static_init() ++{ ++#if defined(GEN_TREES_H) || !defined(STDC) ++ static int static_init_done = 0; ++ int n; /* iterates over tree elements */ ++ int bits; /* bit counter */ ++ int length; /* length value */ ++ int code; /* code value */ ++ int dist; /* distance index */ ++ ush bl_count[MAX_BITS+1]; ++ /* number of codes at each bit length for an optimal tree */ ++ ++ if (static_init_done) return; ++ ++ /* For some embedded targets, global variables are not initialized: */ ++#ifdef NO_INIT_GLOBAL_POINTERS ++ static_l_desc.static_tree = static_ltree; ++ static_l_desc.extra_bits = extra_lbits; ++ static_d_desc.static_tree = static_dtree; ++ static_d_desc.extra_bits = extra_dbits; ++ static_bl_desc.extra_bits = extra_blbits; ++#endif ++ ++ /* Initialize the mapping length (0..255) -> length code (0..28) */ ++ length = 0; ++ for (code = 0; code < LENGTH_CODES-1; code++) { ++ base_length[code] = length; ++ for (n = 0; n < (1<<extra_lbits[code]); n++) { ++ _length_code[length++] = (uch)code; ++ } ++ } ++ Assert (length == 256, "tr_static_init: length != 256"); ++ /* Note that the length 255 (match length 258) can be represented ++ * in two different ways: code 284 + 5 bits or code 285, so we ++ * overwrite length_code[255] to use the best encoding: ++ */ ++ _length_code[length-1] = (uch)code; ++ ++ /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ ++ dist = 0; ++ for (code = 0 ; code < 16; code++) { ++ base_dist[code] = dist; ++ for (n = 0; n < (1<<extra_dbits[code]); n++) { ++ _dist_code[dist++] = (uch)code; ++ } ++ } ++ Assert (dist == 256, "tr_static_init: dist != 256"); ++ dist >>= 7; /* from now on, all distances are divided by 128 */ ++ for ( ; code < D_CODES; code++) { ++ base_dist[code] = dist << 7; ++ for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { ++ _dist_code[256 + dist++] = (uch)code; ++ } ++ } ++ Assert (dist == 256, "tr_static_init: 256+dist != 512"); ++ ++ /* Construct the codes of the static literal tree */ ++ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; ++ n = 0; ++ while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; ++ while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; ++ while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; ++ while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; ++ /* Codes 286 and 287 do not exist, but we must include them in the ++ * tree construction to get a canonical Huffman tree (longest code ++ * all ones) ++ */ ++ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); ++ ++ /* The static distance tree is trivial: */ ++ for (n = 0; n < D_CODES; n++) { ++ static_dtree[n].Len = 5; ++ static_dtree[n].Code = bi_reverse((unsigned)n, 5); ++ } ++ static_init_done = 1; ++ ++# ifdef GEN_TREES_H ++ gen_trees_header(); ++# endif ++#endif /* defined(GEN_TREES_H) || !defined(STDC) */ ++} ++ ++/* =========================================================================== ++ * Genererate the file trees.h describing the static trees. ++ */ ++#ifdef GEN_TREES_H ++# ifndef DEBUG ++# include <stdio.h> ++# endif ++ ++# define SEPARATOR(i, last, width) \ ++ ((i) == (last)? "\n};\n\n" : \ ++ ((i) % (width) == (width)-1 ? ",\n" : ", ")) ++ ++void gen_trees_header() ++{ ++ FILE *header = fopen("trees.h", "w"); ++ int i; ++ ++ Assert (header != NULL, "Can't open trees.h"); ++ fprintf(header, ++ "/* header created automatically with -DGEN_TREES_H */\n\n"); ++ ++ fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); ++ for (i = 0; i < L_CODES+2; i++) { ++ fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, ++ static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); ++ } ++ ++ fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); ++ for (i = 0; i < D_CODES; i++) { ++ fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, ++ static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); ++ } ++ ++ fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); ++ for (i = 0; i < DIST_CODE_LEN; i++) { ++ fprintf(header, "%2u%s", _dist_code[i], ++ SEPARATOR(i, DIST_CODE_LEN-1, 20)); ++ } ++ ++ fprintf(header, ++ "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); ++ for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { ++ fprintf(header, "%2u%s", _length_code[i], ++ SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); ++ } ++ ++ fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); ++ for (i = 0; i < LENGTH_CODES; i++) { ++ fprintf(header, "%1u%s", base_length[i], ++ SEPARATOR(i, LENGTH_CODES-1, 20)); ++ } ++ ++ fprintf(header, "local const int base_dist[D_CODES] = {\n"); ++ for (i = 0; i < D_CODES; i++) { ++ fprintf(header, "%5u%s", base_dist[i], ++ SEPARATOR(i, D_CODES-1, 10)); ++ } ++ ++ fclose(header); ++} ++#endif /* GEN_TREES_H */ ++ ++/* =========================================================================== ++ * Initialize the tree data structures for a new zlib stream. ++ */ ++void ZLIB_INTERNAL _tr_init(s) ++ deflate_state *s; ++{ ++ tr_static_init(); ++ ++ s->l_desc.dyn_tree = s->dyn_ltree; ++ s->l_desc.stat_desc = &static_l_desc; ++ ++ s->d_desc.dyn_tree = s->dyn_dtree; ++ s->d_desc.stat_desc = &static_d_desc; ++ ++ s->bl_desc.dyn_tree = s->bl_tree; ++ s->bl_desc.stat_desc = &static_bl_desc; ++ ++ s->bi_buf = 0; ++ s->bi_valid = 0; ++#ifdef DEBUG ++ s->compressed_len = 0L; ++ s->bits_sent = 0L; ++#endif ++ ++ /* Initialize the first block of the first file: */ ++ init_block(s); ++} ++ ++/* =========================================================================== ++ * Initialize a new block. ++ */ ++local void init_block(s) ++ deflate_state *s; ++{ ++ int n; /* iterates over tree elements */ ++ ++ /* Initialize the trees. */ ++ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; ++ for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; ++ for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; ++ ++ s->dyn_ltree[END_BLOCK].Freq = 1; ++ s->opt_len = s->static_len = 0L; ++ s->last_lit = s->matches = 0; ++} ++ ++#define SMALLEST 1 ++/* Index within the heap array of least frequent node in the Huffman tree */ ++ ++ ++/* =========================================================================== ++ * Remove the smallest element from the heap and recreate the heap with ++ * one less element. Updates heap and heap_len. ++ */ ++#define pqremove(s, tree, top) \ ++{\ ++ top = s->heap[SMALLEST]; \ ++ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ ++ pqdownheap(s, tree, SMALLEST); \ ++} ++ ++/* =========================================================================== ++ * Compares to subtrees, using the tree depth as tie breaker when ++ * the subtrees have equal frequency. This minimizes the worst case length. ++ */ ++#define smaller(tree, n, m, depth) \ ++ (tree[n].Freq < tree[m].Freq || \ ++ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) ++ ++/* =========================================================================== ++ * Restore the heap property by moving down the tree starting at node k, ++ * exchanging a node with the smallest of its two sons if necessary, stopping ++ * when the heap property is re-established (each father smaller than its ++ * two sons). ++ */ ++local void pqdownheap(s, tree, k) ++ deflate_state *s; ++ ct_data *tree; /* the tree to restore */ ++ int k; /* node to move down */ ++{ ++ int v = s->heap[k]; ++ int j = k << 1; /* left son of k */ ++ while (j <= s->heap_len) { ++ /* Set j to the smallest of the two sons: */ ++ if (j < s->heap_len && ++ smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { ++ j++; ++ } ++ /* Exit if v is smaller than both sons */ ++ if (smaller(tree, v, s->heap[j], s->depth)) break; ++ ++ /* Exchange v with the smallest son */ ++ s->heap[k] = s->heap[j]; k = j; ++ ++ /* And continue down the tree, setting j to the left son of k */ ++ j <<= 1; ++ } ++ s->heap[k] = v; ++} ++ ++/* =========================================================================== ++ * Compute the optimal bit lengths for a tree and update the total bit length ++ * for the current block. ++ * IN assertion: the fields freq and dad are set, heap[heap_max] and ++ * above are the tree nodes sorted by increasing frequency. ++ * OUT assertions: the field len is set to the optimal bit length, the ++ * array bl_count contains the frequencies for each bit length. ++ * The length opt_len is updated; static_len is also updated if stree is ++ * not null. ++ */ ++local void gen_bitlen(s, desc) ++ deflate_state *s; ++ tree_desc *desc; /* the tree descriptor */ ++{ ++ ct_data *tree = desc->dyn_tree; ++ int max_code = desc->max_code; ++ const ct_data *stree = desc->stat_desc->static_tree; ++ const intf *extra = desc->stat_desc->extra_bits; ++ int base = desc->stat_desc->extra_base; ++ int max_length = desc->stat_desc->max_length; ++ int h; /* heap index */ ++ int n, m; /* iterate over the tree elements */ ++ int bits; /* bit length */ ++ int xbits; /* extra bits */ ++ ush f; /* frequency */ ++ int overflow = 0; /* number of elements with bit length too large */ ++ ++ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; ++ ++ /* In a first pass, compute the optimal bit lengths (which may ++ * overflow in the case of the bit length tree). ++ */ ++ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ ++ ++ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { ++ n = s->heap[h]; ++ bits = tree[tree[n].Dad].Len + 1; ++ if (bits > max_length) bits = max_length, overflow++; ++ tree[n].Len = (ush)bits; ++ /* We overwrite tree[n].Dad which is no longer needed */ ++ ++ if (n > max_code) continue; /* not a leaf node */ ++ ++ s->bl_count[bits]++; ++ xbits = 0; ++ if (n >= base) xbits = extra[n-base]; ++ f = tree[n].Freq; ++ s->opt_len += (ulg)f * (bits + xbits); ++ if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); ++ } ++ if (overflow == 0) return; ++ ++ Trace((stderr,"\nbit length overflow\n")); ++ /* This happens for example on obj2 and pic of the Calgary corpus */ ++ ++ /* Find the first bit length which could increase: */ ++ do { ++ bits = max_length-1; ++ while (s->bl_count[bits] == 0) bits--; ++ s->bl_count[bits]--; /* move one leaf down the tree */ ++ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ ++ s->bl_count[max_length]--; ++ /* The brother of the overflow item also moves one step up, ++ * but this does not affect bl_count[max_length] ++ */ ++ overflow -= 2; ++ } while (overflow > 0); ++ ++ /* Now recompute all bit lengths, scanning in increasing frequency. ++ * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all ++ * lengths instead of fixing only the wrong ones. This idea is taken ++ * from 'ar' written by Haruhiko Okumura.) ++ */ ++ for (bits = max_length; bits != 0; bits--) { ++ n = s->bl_count[bits]; ++ while (n != 0) { ++ m = s->heap[--h]; ++ if (m > max_code) continue; ++ if ((unsigned) tree[m].Len != (unsigned) bits) { ++ Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); ++ s->opt_len += ((long)bits - (long)tree[m].Len) ++ *(long)tree[m].Freq; ++ tree[m].Len = (ush)bits; ++ } ++ n--; ++ } ++ } ++} ++ ++/* =========================================================================== ++ * Generate the codes for a given tree and bit counts (which need not be ++ * optimal). ++ * IN assertion: the array bl_count contains the bit length statistics for ++ * the given tree and the field len is set for all tree elements. ++ * OUT assertion: the field code is set for all tree elements of non ++ * zero code length. ++ */ ++local void gen_codes (tree, max_code, bl_count) ++ ct_data *tree; /* the tree to decorate */ ++ int max_code; /* largest code with non zero frequency */ ++ ushf *bl_count; /* number of codes at each bit length */ ++{ ++ ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ++ ush code = 0; /* running code value */ ++ int bits; /* bit index */ ++ int n; /* code index */ ++ ++ /* The distribution counts are first used to generate the code values ++ * without bit reversal. ++ */ ++ for (bits = 1; bits <= MAX_BITS; bits++) { ++ next_code[bits] = code = (code + bl_count[bits-1]) << 1; ++ } ++ /* Check that the bit counts in bl_count are consistent. The last code ++ * must be all ones. ++ */ ++ Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1, ++ "inconsistent bit counts"); ++ Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); ++ ++ for (n = 0; n <= max_code; n++) { ++ int len = tree[n].Len; ++ if (len == 0) continue; ++ /* Now reverse the bits */ ++ tree[n].Code = bi_reverse(next_code[len]++, len); ++ ++ Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", ++ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); ++ } ++} ++ ++/* =========================================================================== ++ * Construct one Huffman tree and assigns the code bit strings and lengths. ++ * Update the total bit length for the current block. ++ * IN assertion: the field freq is set for all tree elements. ++ * OUT assertions: the fields len and code are set to the optimal bit length ++ * and corresponding code. The length opt_len is updated; static_len is ++ * also updated if stree is not null. The field max_code is set. ++ */ ++local void build_tree(s, desc) ++ deflate_state *s; ++ tree_desc *desc; /* the tree descriptor */ ++{ ++ ct_data *tree = desc->dyn_tree; ++ const ct_data *stree = desc->stat_desc->static_tree; ++ int elems = desc->stat_desc->elems; ++ int n, m; /* iterate over heap elements */ ++ int max_code = -1; /* largest code with non zero frequency */ ++ int node; /* new node being created */ ++ ++ /* Construct the initial heap, with least frequent element in ++ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. ++ * heap[0] is not used. ++ */ ++ s->heap_len = 0, s->heap_max = HEAP_SIZE; ++ ++ for (n = 0; n < elems; n++) { ++ if (tree[n].Freq != 0) { ++ s->heap[++(s->heap_len)] = max_code = n; ++ s->depth[n] = 0; ++ } else { ++ tree[n].Len = 0; ++ } ++ } ++ ++ /* The pkzip format requires that at least one distance code exists, ++ * and that at least one bit should be sent even if there is only one ++ * possible code. So to avoid special checks later on we force at least ++ * two codes of non zero frequency. ++ */ ++ while (s->heap_len < 2) { ++ node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); ++ tree[node].Freq = 1; ++ s->depth[node] = 0; ++ s->opt_len--; if (stree) s->static_len -= stree[node].Len; ++ /* node is 0 or 1 so it does not have extra bits */ ++ } ++ desc->max_code = max_code; ++ ++ /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, ++ * establish sub-heaps of increasing lengths: ++ */ ++ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); ++ ++ /* Construct the Huffman tree by repeatedly combining the least two ++ * frequent nodes. ++ */ ++ node = elems; /* next internal node of the tree */ ++ do { ++ pqremove(s, tree, n); /* n = node of least frequency */ ++ m = s->heap[SMALLEST]; /* m = node of next least frequency */ ++ ++ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ ++ s->heap[--(s->heap_max)] = m; ++ ++ /* Create a new node father of n and m */ ++ tree[node].Freq = tree[n].Freq + tree[m].Freq; ++ s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? ++ s->depth[n] : s->depth[m]) + 1); ++ tree[n].Dad = tree[m].Dad = (ush)node; ++#ifdef DUMP_BL_TREE ++ if (tree == s->bl_tree) { ++ fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", ++ node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); ++ } ++#endif ++ /* and insert the new node in the heap */ ++ s->heap[SMALLEST] = node++; ++ pqdownheap(s, tree, SMALLEST); ++ ++ } while (s->heap_len >= 2); ++ ++ s->heap[--(s->heap_max)] = s->heap[SMALLEST]; ++ ++ /* At this point, the fields freq and dad are set. We can now ++ * generate the bit lengths. ++ */ ++ gen_bitlen(s, (tree_desc *)desc); ++ ++ /* The field len is now set, we can generate the bit codes */ ++ gen_codes ((ct_data *)tree, max_code, s->bl_count); ++} ++ ++/* =========================================================================== ++ * Scan a literal or distance tree to determine the frequencies of the codes ++ * in the bit length tree. ++ */ ++local void scan_tree (s, tree, max_code) ++ deflate_state *s; ++ ct_data *tree; /* the tree to be scanned */ ++ int max_code; /* and its largest code of non zero frequency */ ++{ ++ int n; /* iterates over all tree elements */ ++ int prevlen = -1; /* last emitted length */ ++ int curlen; /* length of current code */ ++ int nextlen = tree[0].Len; /* length of next code */ ++ int count = 0; /* repeat count of the current code */ ++ int max_count = 7; /* max repeat count */ ++ int min_count = 4; /* min repeat count */ ++ ++ if (nextlen == 0) max_count = 138, min_count = 3; ++ tree[max_code+1].Len = (ush)0xffff; /* guard */ ++ ++ for (n = 0; n <= max_code; n++) { ++ curlen = nextlen; nextlen = tree[n+1].Len; ++ if (++count < max_count && curlen == nextlen) { ++ continue; ++ } else if (count < min_count) { ++ s->bl_tree[curlen].Freq += count; ++ } else if (curlen != 0) { ++ if (curlen != prevlen) s->bl_tree[curlen].Freq++; ++ s->bl_tree[REP_3_6].Freq++; ++ } else if (count <= 10) { ++ s->bl_tree[REPZ_3_10].Freq++; ++ } else { ++ s->bl_tree[REPZ_11_138].Freq++; ++ } ++ count = 0; prevlen = curlen; ++ if (nextlen == 0) { ++ max_count = 138, min_count = 3; ++ } else if (curlen == nextlen) { ++ max_count = 6, min_count = 3; ++ } else { ++ max_count = 7, min_count = 4; ++ } ++ } ++} ++ ++/* =========================================================================== ++ * Send a literal or distance tree in compressed form, using the codes in ++ * bl_tree. ++ */ ++local void send_tree (s, tree, max_code) ++ deflate_state *s; ++ ct_data *tree; /* the tree to be scanned */ ++ int max_code; /* and its largest code of non zero frequency */ ++{ ++ int n; /* iterates over all tree elements */ ++ int prevlen = -1; /* last emitted length */ ++ int curlen; /* length of current code */ ++ int nextlen = tree[0].Len; /* length of next code */ ++ int count = 0; /* repeat count of the current code */ ++ int max_count = 7; /* max repeat count */ ++ int min_count = 4; /* min repeat count */ ++ ++ /* tree[max_code+1].Len = -1; */ /* guard already set */ ++ if (nextlen == 0) max_count = 138, min_count = 3; ++ ++ for (n = 0; n <= max_code; n++) { ++ curlen = nextlen; nextlen = tree[n+1].Len; ++ if (++count < max_count && curlen == nextlen) { ++ continue; ++ } else if (count < min_count) { ++ do { send_code(s, curlen, s->bl_tree); } while (--count != 0); ++ ++ } else if (curlen != 0) { ++ if (curlen != prevlen) { ++ send_code(s, curlen, s->bl_tree); count--; ++ } ++ Assert(count >= 3 && count <= 6, " 3_6?"); ++ send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); ++ ++ } else if (count <= 10) { ++ send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); ++ ++ } else { ++ send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); ++ } ++ count = 0; prevlen = curlen; ++ if (nextlen == 0) { ++ max_count = 138, min_count = 3; ++ } else if (curlen == nextlen) { ++ max_count = 6, min_count = 3; ++ } else { ++ max_count = 7, min_count = 4; ++ } ++ } ++} ++ ++/* =========================================================================== ++ * Construct the Huffman tree for the bit lengths and return the index in ++ * bl_order of the last bit length code to send. ++ */ ++local int build_bl_tree(s) ++ deflate_state *s; ++{ ++ int max_blindex; /* index of last bit length code of non zero freq */ ++ ++ /* Determine the bit length frequencies for literal and distance trees */ ++ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); ++ scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); ++ ++ /* Build the bit length tree: */ ++ build_tree(s, (tree_desc *)(&(s->bl_desc))); ++ /* opt_len now includes the length of the tree representations, except ++ * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. ++ */ ++ ++ /* Determine the number of bit length codes to send. The pkzip format ++ * requires that at least 4 bit length codes be sent. (appnote.txt says ++ * 3 but the actual value used is 4.) ++ */ ++ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { ++ if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; ++ } ++ /* Update opt_len to include the bit length tree and counts */ ++ s->opt_len += 3*(max_blindex+1) + 5+5+4; ++ Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", ++ s->opt_len, s->static_len)); ++ ++ return max_blindex; ++} ++ ++/* =========================================================================== ++ * Send the header for a block using dynamic Huffman trees: the counts, the ++ * lengths of the bit length codes, the literal tree and the distance tree. ++ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. ++ */ ++local void send_all_trees(s, lcodes, dcodes, blcodes) ++ deflate_state *s; ++ int lcodes, dcodes, blcodes; /* number of codes for each tree */ ++{ ++ int rank; /* index in bl_order */ ++ ++ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); ++ Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, ++ "too many codes"); ++ Tracev((stderr, "\nbl counts: ")); ++ send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ ++ send_bits(s, dcodes-1, 5); ++ send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ ++ for (rank = 0; rank < blcodes; rank++) { ++ Tracev((stderr, "\nbl code %2d ", bl_order[rank])); ++ send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); ++ } ++ Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); ++ ++ send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ ++ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); ++ ++ send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ ++ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); ++} ++ ++/* =========================================================================== ++ * Send a stored block ++ */ ++void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) ++ deflate_state *s; ++ charf *buf; /* input block */ ++ ulg stored_len; /* length of input block */ ++ int last; /* one if this is the last block for a file */ ++{ ++ send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ ++#ifdef DEBUG ++ s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; ++ s->compressed_len += (stored_len + 4) << 3; ++#endif ++ copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ ++} ++ ++/* =========================================================================== ++ * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) ++ */ ++void ZLIB_INTERNAL _tr_flush_bits(s) ++ deflate_state *s; ++{ ++ bi_flush(s); ++} ++ ++/* =========================================================================== ++ * Send one empty static block to give enough lookahead for inflate. ++ * This takes 10 bits, of which 7 may remain in the bit buffer. ++ */ ++void ZLIB_INTERNAL _tr_align(s) ++ deflate_state *s; ++{ ++ send_bits(s, STATIC_TREES<<1, 3); ++ send_code(s, END_BLOCK, static_ltree); ++#ifdef DEBUG ++ s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ ++#endif ++ bi_flush(s); ++} ++ ++/* =========================================================================== ++ * Determine the best encoding for the current block: dynamic trees, static ++ * trees or store, and output the encoded block to the zip file. ++ */ ++void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) ++ deflate_state *s; ++ charf *buf; /* input block, or NULL if too old */ ++ ulg stored_len; /* length of input block */ ++ int last; /* one if this is the last block for a file */ ++{ ++ ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ ++ int max_blindex = 0; /* index of last bit length code of non zero freq */ ++ ++ /* Build the Huffman trees unless a stored block is forced */ ++ if (s->level > 0) { ++ ++ /* Check if the file is binary or text */ ++ if (s->strm->data_type == Z_UNKNOWN) ++ s->strm->data_type = detect_data_type(s); ++ ++ /* Construct the literal and distance trees */ ++ build_tree(s, (tree_desc *)(&(s->l_desc))); ++ Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, ++ s->static_len)); ++ ++ build_tree(s, (tree_desc *)(&(s->d_desc))); ++ Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, ++ s->static_len)); ++ /* At this point, opt_len and static_len are the total bit lengths of ++ * the compressed block data, excluding the tree representations. ++ */ ++ ++ /* Build the bit length tree for the above two trees, and get the index ++ * in bl_order of the last bit length code to send. ++ */ ++ max_blindex = build_bl_tree(s); ++ ++ /* Determine the best encoding. Compute the block lengths in bytes. */ ++ opt_lenb = (s->opt_len+3+7)>>3; ++ static_lenb = (s->static_len+3+7)>>3; ++ ++ Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", ++ opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, ++ s->last_lit)); ++ ++ if (static_lenb <= opt_lenb) opt_lenb = static_lenb; ++ ++ } else { ++ Assert(buf != (char*)0, "lost buf"); ++ opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ ++ } ++ ++#ifdef FORCE_STORED ++ if (buf != (char*)0) { /* force stored block */ ++#else ++ if (stored_len+4 <= opt_lenb && buf != (char*)0) { ++ /* 4: two words for the lengths */ ++#endif ++ /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. ++ * Otherwise we can't have processed more than WSIZE input bytes since ++ * the last block flush, because compression would have been ++ * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to ++ * transform a block into a stored block. ++ */ ++ _tr_stored_block(s, buf, stored_len, last); ++ ++#ifdef FORCE_STATIC ++ } else if (static_lenb >= 0) { /* force static trees */ ++#else ++ } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { ++#endif ++ send_bits(s, (STATIC_TREES<<1)+last, 3); ++ compress_block(s, (const ct_data *)static_ltree, ++ (const ct_data *)static_dtree); ++#ifdef DEBUG ++ s->compressed_len += 3 + s->static_len; ++#endif ++ } else { ++ send_bits(s, (DYN_TREES<<1)+last, 3); ++ send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, ++ max_blindex+1); ++ compress_block(s, (const ct_data *)s->dyn_ltree, ++ (const ct_data *)s->dyn_dtree); ++#ifdef DEBUG ++ s->compressed_len += 3 + s->opt_len; ++#endif ++ } ++ Assert (s->compressed_len == s->bits_sent, "bad compressed size"); ++ /* The above check is made mod 2^32, for files larger than 512 MB ++ * and uLong implemented on 32 bits. ++ */ ++ init_block(s); ++ ++ if (last) { ++ bi_windup(s); ++#ifdef DEBUG ++ s->compressed_len += 7; /* align on byte boundary */ ++#endif ++ } ++ Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, ++ s->compressed_len-7*last)); ++} ++ ++/* =========================================================================== ++ * Save the match info and tally the frequency counts. Return true if ++ * the current block must be flushed. ++ */ ++int ZLIB_INTERNAL _tr_tally (s, dist, lc) ++ deflate_state *s; ++ unsigned dist; /* distance of matched string */ ++ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ ++{ ++ s->d_buf[s->last_lit] = (ush)dist; ++ s->l_buf[s->last_lit++] = (uch)lc; ++ if (dist == 0) { ++ /* lc is the unmatched char */ ++ s->dyn_ltree[lc].Freq++; ++ } else { ++ s->matches++; ++ /* Here, lc is the match length - MIN_MATCH */ ++ dist--; /* dist = match distance - 1 */ ++ Assert((ush)dist < (ush)MAX_DIST(s) && ++ (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && ++ (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); ++ ++ s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; ++ s->dyn_dtree[d_code(dist)].Freq++; ++ } ++ ++#ifdef TRUNCATE_BLOCK ++ /* Try to guess if it is profitable to stop the current block here */ ++ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { ++ /* Compute an upper bound for the compressed length */ ++ ulg out_length = (ulg)s->last_lit*8L; ++ ulg in_length = (ulg)((long)s->strstart - s->block_start); ++ int dcode; ++ for (dcode = 0; dcode < D_CODES; dcode++) { ++ out_length += (ulg)s->dyn_dtree[dcode].Freq * ++ (5L+extra_dbits[dcode]); ++ } ++ out_length >>= 3; ++ Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", ++ s->last_lit, in_length, out_length, ++ 100L - out_length*100L/in_length)); ++ if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; ++ } ++#endif ++ return (s->last_lit == s->lit_bufsize-1); ++ /* We avoid equality with lit_bufsize because of wraparound at 64K ++ * on 16 bit machines and because stored blocks are restricted to ++ * 64K-1 bytes. ++ */ ++} ++ ++/* =========================================================================== ++ * Send the block data compressed using the given Huffman trees ++ */ ++local void compress_block(s, ltree, dtree) ++ deflate_state *s; ++ const ct_data *ltree; /* literal tree */ ++ const ct_data *dtree; /* distance tree */ ++{ ++ unsigned dist; /* distance of matched string */ ++ int lc; /* match length or unmatched char (if dist == 0) */ ++ unsigned lx = 0; /* running index in l_buf */ ++ unsigned code; /* the code to send */ ++ int extra; /* number of extra bits to send */ ++ ++ if (s->last_lit != 0) do { ++ dist = s->d_buf[lx]; ++ lc = s->l_buf[lx++]; ++ if (dist == 0) { ++ send_code(s, lc, ltree); /* send a literal byte */ ++ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); ++ } else { ++ /* Here, lc is the match length - MIN_MATCH */ ++ code = _length_code[lc]; ++ send_code(s, code+LITERALS+1, ltree); /* send the length code */ ++ extra = extra_lbits[code]; ++ if (extra != 0) { ++ lc -= base_length[code]; ++ send_bits(s, lc, extra); /* send the extra length bits */ ++ } ++ dist--; /* dist is now the match distance - 1 */ ++ code = d_code(dist); ++ Assert (code < D_CODES, "bad d_code"); ++ ++ send_code(s, code, dtree); /* send the distance code */ ++ extra = extra_dbits[code]; ++ if (extra != 0) { ++ dist -= base_dist[code]; ++ send_bits(s, dist, extra); /* send the extra distance bits */ ++ } ++ } /* literal or match pair ? */ ++ ++ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ ++ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, ++ "pendingBuf overflow"); ++ ++ } while (lx < s->last_lit); ++ ++ send_code(s, END_BLOCK, ltree); ++} ++ ++/* =========================================================================== ++ * Check if the data type is TEXT or BINARY, using the following algorithm: ++ * - TEXT if the two conditions below are satisfied: ++ * a) There are no non-portable control characters belonging to the ++ * "black list" (0..6, 14..25, 28..31). ++ * b) There is at least one printable character belonging to the ++ * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). ++ * - BINARY otherwise. ++ * - The following partially-portable control characters form a ++ * "gray list" that is ignored in this detection algorithm: ++ * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). ++ * IN assertion: the fields Freq of dyn_ltree are set. ++ */ ++local int detect_data_type(s) ++ deflate_state *s; ++{ ++ /* black_mask is the bit mask of black-listed bytes ++ * set bits 0..6, 14..25, and 28..31 ++ * 0xf3ffc07f = binary 11110011111111111100000001111111 ++ */ ++ unsigned long black_mask = 0xf3ffc07fUL; ++ int n; ++ ++ /* Check for non-textual ("black-listed") bytes. */ ++ for (n = 0; n <= 31; n++, black_mask >>= 1) ++ if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) ++ return Z_BINARY; ++ ++ /* Check for textual ("white-listed") bytes. */ ++ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 ++ || s->dyn_ltree[13].Freq != 0) ++ return Z_TEXT; ++ for (n = 32; n < LITERALS; n++) ++ if (s->dyn_ltree[n].Freq != 0) ++ return Z_TEXT; ++ ++ /* There are no "black-listed" or "white-listed" bytes: ++ * this stream either is empty or has tolerated ("gray-listed") bytes only. ++ */ ++ return Z_BINARY; ++} ++ ++/* =========================================================================== ++ * Reverse the first len bits of a code, using straightforward code (a faster ++ * method would use a table) ++ * IN assertion: 1 <= len <= 15 ++ */ ++local unsigned bi_reverse(code, len) ++ unsigned code; /* the value to invert */ ++ int len; /* its bit length */ ++{ ++ register unsigned res = 0; ++ do { ++ res |= code & 1; ++ code >>= 1, res <<= 1; ++ } while (--len > 0); ++ return res >> 1; ++} ++ ++/* =========================================================================== ++ * Flush the bit buffer, keeping at most 7 bits in it. ++ */ ++local void bi_flush(s) ++ deflate_state *s; ++{ ++ if (s->bi_valid == 16) { ++ put_short(s, s->bi_buf); ++ s->bi_buf = 0; ++ s->bi_valid = 0; ++ } else if (s->bi_valid >= 8) { ++ put_byte(s, (Byte)s->bi_buf); ++ s->bi_buf >>= 8; ++ s->bi_valid -= 8; ++ } ++} ++ ++/* =========================================================================== ++ * Flush the bit buffer and align the output on a byte boundary ++ */ ++local void bi_windup(s) ++ deflate_state *s; ++{ ++ if (s->bi_valid > 8) { ++ put_short(s, s->bi_buf); ++ } else if (s->bi_valid > 0) { ++ put_byte(s, (Byte)s->bi_buf); ++ } ++ s->bi_buf = 0; ++ s->bi_valid = 0; ++#ifdef DEBUG ++ s->bits_sent = (s->bits_sent+7) & ~7; ++#endif ++} ++ ++/* =========================================================================== ++ * Copy a stored block, storing first the length and its ++ * one's complement if requested. ++ */ ++local void copy_block(s, buf, len, header) ++ deflate_state *s; ++ charf *buf; /* the input data */ ++ unsigned len; /* its length */ ++ int header; /* true if block header must be written */ ++{ ++ bi_windup(s); /* align on byte boundary */ ++ ++ if (header) { ++ put_short(s, (ush)len); ++ put_short(s, (ush)~len); ++#ifdef DEBUG ++ s->bits_sent += 2*16; ++#endif ++ } ++#ifdef DEBUG ++ s->bits_sent += (ulg)len<<3; ++#endif ++ while (len--) { ++ put_byte(s, *buf++); ++ } ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/trees.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/trees.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,152 @@ ++/* ++ * 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. ++ */ ++ ++/* header created automatically with -DGEN_TREES_H */ ++ ++local const ct_data static_ltree[L_CODES+2] = { ++{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, ++{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, ++{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, ++{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, ++{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, ++{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, ++{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, ++{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, ++{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, ++{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, ++{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, ++{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, ++{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, ++{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, ++{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, ++{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, ++{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, ++{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, ++{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, ++{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, ++{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, ++{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, ++{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, ++{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, ++{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, ++{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, ++{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, ++{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, ++{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, ++{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, ++{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, ++{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, ++{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, ++{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, ++{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, ++{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, ++{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, ++{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, ++{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, ++{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, ++{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, ++{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, ++{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, ++{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, ++{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, ++{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, ++{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, ++{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, ++{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, ++{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, ++{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, ++{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, ++{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, ++{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, ++{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, ++{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, ++{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, ++{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} ++}; ++ ++local const ct_data static_dtree[D_CODES] = { ++{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, ++{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, ++{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, ++{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, ++{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, ++{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} ++}; ++ ++const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { ++ 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, ++ 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, ++10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, ++11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, ++12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, ++13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, ++13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, ++14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, ++14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, ++14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, ++15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, ++15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, ++15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, ++18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, ++23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, ++24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, ++26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, ++26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, ++27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, ++27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, ++28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, ++28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, ++28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, ++29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, ++29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, ++29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 ++}; ++ ++const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { ++ 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, ++13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, ++17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, ++19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, ++21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, ++22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, ++23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, ++24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, ++25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, ++25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, ++26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, ++26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, ++27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 ++}; ++ ++local const int base_length[LENGTH_CODES] = { ++0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, ++64, 80, 96, 112, 128, 160, 192, 224, 0 ++}; ++ ++local const int base_dist[D_CODES] = { ++ 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, ++ 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, ++ 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 ++}; ++ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/uncompr.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/uncompr.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,83 @@ ++/* ++ * 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. ++ */ ++ ++/* uncompr.c -- decompress a memory buffer ++ * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* @(#) $Id$ */ ++ ++#define ZLIB_INTERNAL ++#include "zlib.h" ++ ++/* =========================================================================== ++ Decompresses the source buffer into the destination buffer. sourceLen is ++ the byte length of the source buffer. Upon entry, destLen is the total ++ size of the destination buffer, which must be large enough to hold the ++ entire uncompressed data. (The size of the uncompressed data must have ++ been saved previously by the compressor and transmitted to the decompressor ++ by some mechanism outside the scope of this compression library.) ++ Upon exit, destLen is the actual size of the compressed buffer. ++ ++ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_BUF_ERROR if there was not enough room in the output ++ buffer, or Z_DATA_ERROR if the input data was corrupted. ++*/ ++int ZEXPORT uncompress (dest, destLen, source, sourceLen) ++ Bytef *dest; ++ uLongf *destLen; ++ const Bytef *source; ++ uLong sourceLen; ++{ ++ z_stream stream; ++ int err; ++ ++ stream.next_in = (z_const Bytef *)source; ++ stream.avail_in = (uInt)sourceLen; ++ /* Check for source > 64K on 16-bit machine: */ ++ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; ++ ++ stream.next_out = dest; ++ stream.avail_out = (uInt)*destLen; ++ if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; ++ ++ stream.zalloc = (alloc_func)0; ++ stream.zfree = (free_func)0; ++ ++ err = inflateInit(&stream); ++ if (err != Z_OK) return err; ++ ++ err = inflate(&stream, Z_FINISH); ++ if (err != Z_STREAM_END) { ++ inflateEnd(&stream); ++ if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) ++ return Z_DATA_ERROR; ++ return err; ++ } ++ *destLen = stream.total_out; ++ ++ err = inflateEnd(&stream); ++ return err; ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zadler32.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zadler32.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,203 @@ ++/* ++ * 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. ++ */ ++ ++/* adler32.c -- compute the Adler-32 checksum of a data stream ++ * Copyright (C) 1995-2011 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* @(#) $Id$ */ ++ ++#include "zutil.h" ++ ++#define local static ++ ++local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); ++ ++#define BASE 65521 /* largest prime smaller than 65536 */ ++#define NMAX 5552 ++/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ ++ ++#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} ++#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); ++#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); ++#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); ++#define DO16(buf) DO8(buf,0); DO8(buf,8); ++ ++/* use NO_DIVIDE if your processor does not do division in hardware -- ++ try it both ways to see which is faster */ ++#ifdef NO_DIVIDE ++/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 ++ (thank you to John Reiser for pointing this out) */ ++# define CHOP(a) \ ++ do { \ ++ unsigned long tmp = a >> 16; \ ++ a &= 0xffffUL; \ ++ a += (tmp << 4) - tmp; \ ++ } while (0) ++# define MOD28(a) \ ++ do { \ ++ CHOP(a); \ ++ if (a >= BASE) a -= BASE; \ ++ } while (0) ++# define MOD(a) \ ++ do { \ ++ CHOP(a); \ ++ MOD28(a); \ ++ } while (0) ++# define MOD63(a) \ ++ do { /* this assumes a is not negative */ \ ++ z_off64_t tmp = a >> 32; \ ++ a &= 0xffffffffL; \ ++ a += (tmp << 8) - (tmp << 5) + tmp; \ ++ tmp = a >> 16; \ ++ a &= 0xffffL; \ ++ a += (tmp << 4) - tmp; \ ++ tmp = a >> 16; \ ++ a &= 0xffffL; \ ++ a += (tmp << 4) - tmp; \ ++ if (a >= BASE) a -= BASE; \ ++ } while (0) ++#else ++# define MOD(a) a %= BASE ++# define MOD28(a) a %= BASE ++# define MOD63(a) a %= BASE ++#endif ++ ++/* ========================================================================= */ ++uLong ZEXPORT adler32(adler, buf, len) ++ uLong adler; ++ const Bytef *buf; ++ uInt len; ++{ ++ unsigned long sum2; ++ unsigned n; ++ ++ /* split Adler-32 into component sums */ ++ sum2 = (adler >> 16) & 0xffff; ++ adler &= 0xffff; ++ ++ /* in case user likes doing a byte at a time, keep it fast */ ++ if (len == 1) { ++ adler += buf[0]; ++ if (adler >= BASE) ++ adler -= BASE; ++ sum2 += adler; ++ if (sum2 >= BASE) ++ sum2 -= BASE; ++ return adler | (sum2 << 16); ++ } ++ ++ /* initial Adler-32 value (deferred check for len == 1 speed) */ ++ if (buf == Z_NULL) ++ return 1L; ++ ++ /* in case short lengths are provided, keep it somewhat fast */ ++ if (len < 16) { ++ while (len--) { ++ adler += *buf++; ++ sum2 += adler; ++ } ++ if (adler >= BASE) ++ adler -= BASE; ++ MOD28(sum2); /* only added so many BASE's */ ++ return adler | (sum2 << 16); ++ } ++ ++ /* do length NMAX blocks -- requires just one modulo operation */ ++ while (len >= NMAX) { ++ len -= NMAX; ++ n = NMAX / 16; /* NMAX is divisible by 16 */ ++ do { ++ DO16(buf); /* 16 sums unrolled */ ++ buf += 16; ++ } while (--n); ++ MOD(adler); ++ MOD(sum2); ++ } ++ ++ /* do remaining bytes (less than NMAX, still just one modulo) */ ++ if (len) { /* avoid modulos if none remaining */ ++ while (len >= 16) { ++ len -= 16; ++ DO16(buf); ++ buf += 16; ++ } ++ while (len--) { ++ adler += *buf++; ++ sum2 += adler; ++ } ++ MOD(adler); ++ MOD(sum2); ++ } ++ ++ /* return recombined sums */ ++ return adler | (sum2 << 16); ++} ++ ++/* ========================================================================= */ ++local uLong adler32_combine_(adler1, adler2, len2) ++ uLong adler1; ++ uLong adler2; ++ z_off64_t len2; ++{ ++ unsigned long sum1; ++ unsigned long sum2; ++ unsigned rem; ++ ++ /* for negative len, return invalid adler32 as a clue for debugging */ ++ if (len2 < 0) ++ return 0xffffffffUL; ++ ++ /* the derivation of this formula is left as an exercise for the reader */ ++ MOD63(len2); /* assumes len2 >= 0 */ ++ rem = (unsigned)len2; ++ sum1 = adler1 & 0xffff; ++ sum2 = rem * sum1; ++ MOD(sum2); ++ sum1 += (adler2 & 0xffff) + BASE - 1; ++ sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; ++ if (sum1 >= BASE) sum1 -= BASE; ++ if (sum1 >= BASE) sum1 -= BASE; ++ if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); ++ if (sum2 >= BASE) sum2 -= BASE; ++ return sum1 | (sum2 << 16); ++} ++ ++/* ========================================================================= */ ++uLong ZEXPORT adler32_combine(adler1, adler2, len2) ++ uLong adler1; ++ uLong adler2; ++ z_off_t len2; ++{ ++ return adler32_combine_(adler1, adler2, len2); ++} ++ ++uLong ZEXPORT adler32_combine64(adler1, adler2, len2) ++ uLong adler1; ++ uLong adler2; ++ z_off64_t len2; ++{ ++ return adler32_combine_(adler1, adler2, len2); ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zconf.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zconf.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,543 @@ ++/* ++ * 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. ++ */ ++ ++/* zconf.h -- configuration of the zlib compression library ++ * Copyright (C) 1995-2013 Jean-loup Gailly. ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* @(#) $Id$ */ ++ ++#ifndef ZCONF_H ++#define ZCONF_H ++ ++/* for _LP64 */ ++#include <sys/types.h> ++ ++/* ++ * If you *really* need a unique prefix for all types and library functions, ++ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. ++ * Even better than compiling with -DZ_PREFIX would be to use configure to set ++ * this permanently in zconf.h using "./configure --zprefix". ++ */ ++#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ ++# define Z_PREFIX_SET ++ ++/* all linked symbols */ ++# define _dist_code z__dist_code ++# define _length_code z__length_code ++# define _tr_align z__tr_align ++# define _tr_flush_bits z__tr_flush_bits ++# define _tr_flush_block z__tr_flush_block ++# define _tr_init z__tr_init ++# define _tr_stored_block z__tr_stored_block ++# define _tr_tally z__tr_tally ++# define adler32 z_adler32 ++# define adler32_combine z_adler32_combine ++# define adler32_combine64 z_adler32_combine64 ++# ifndef Z_SOLO ++# define compress z_compress ++# define compress2 z_compress2 ++# define compressBound z_compressBound ++# endif ++# define crc32 z_crc32 ++# define crc32_combine z_crc32_combine ++# define crc32_combine64 z_crc32_combine64 ++# define deflate z_deflate ++# define deflateBound z_deflateBound ++# define deflateCopy z_deflateCopy ++# define deflateEnd z_deflateEnd ++# define deflateInit2_ z_deflateInit2_ ++# define deflateInit_ z_deflateInit_ ++# define deflateParams z_deflateParams ++# define deflatePending z_deflatePending ++# define deflatePrime z_deflatePrime ++# define deflateReset z_deflateReset ++# define deflateResetKeep z_deflateResetKeep ++# define deflateSetDictionary z_deflateSetDictionary ++# define deflateSetHeader z_deflateSetHeader ++# define deflateTune z_deflateTune ++# define deflate_copyright z_deflate_copyright ++# define get_crc_table z_get_crc_table ++# ifndef Z_SOLO ++# define gz_error z_gz_error ++# define gz_intmax z_gz_intmax ++# define gz_strwinerror z_gz_strwinerror ++# define gzbuffer z_gzbuffer ++# define gzclearerr z_gzclearerr ++# define gzclose z_gzclose ++# define gzclose_r z_gzclose_r ++# define gzclose_w z_gzclose_w ++# define gzdirect z_gzdirect ++# define gzdopen z_gzdopen ++# define gzeof z_gzeof ++# define gzerror z_gzerror ++# define gzflush z_gzflush ++# define gzgetc z_gzgetc ++# define gzgetc_ z_gzgetc_ ++# define gzgets z_gzgets ++# define gzoffset z_gzoffset ++# define gzoffset64 z_gzoffset64 ++# define gzopen z_gzopen ++# define gzopen64 z_gzopen64 ++# ifdef _WIN32 ++# define gzopen_w z_gzopen_w ++# endif ++# define gzprintf z_gzprintf ++# define gzvprintf z_gzvprintf ++# define gzputc z_gzputc ++# define gzputs z_gzputs ++# define gzread z_gzread ++# define gzrewind z_gzrewind ++# define gzseek z_gzseek ++# define gzseek64 z_gzseek64 ++# define gzsetparams z_gzsetparams ++# define gztell z_gztell ++# define gztell64 z_gztell64 ++# define gzungetc z_gzungetc ++# define gzwrite z_gzwrite ++# endif ++# define inflate z_inflate ++# define inflateBack z_inflateBack ++# define inflateBackEnd z_inflateBackEnd ++# define inflateBackInit_ z_inflateBackInit_ ++# define inflateCopy z_inflateCopy ++# define inflateEnd z_inflateEnd ++# define inflateGetHeader z_inflateGetHeader ++# define inflateInit2_ z_inflateInit2_ ++# define inflateInit_ z_inflateInit_ ++# define inflateMark z_inflateMark ++# define inflatePrime z_inflatePrime ++# define inflateReset z_inflateReset ++# define inflateReset2 z_inflateReset2 ++# define inflateSetDictionary z_inflateSetDictionary ++# define inflateGetDictionary z_inflateGetDictionary ++# define inflateSync z_inflateSync ++# define inflateSyncPoint z_inflateSyncPoint ++# define inflateUndermine z_inflateUndermine ++# define inflateResetKeep z_inflateResetKeep ++# define inflate_copyright z_inflate_copyright ++# define inflate_fast z_inflate_fast ++# define inflate_table z_inflate_table ++# ifndef Z_SOLO ++# define uncompress z_uncompress ++# endif ++# define zError z_zError ++# ifndef Z_SOLO ++# define zcalloc z_zcalloc ++# define zcfree z_zcfree ++# endif ++# define zlibCompileFlags z_zlibCompileFlags ++# define zlibVersion z_zlibVersion ++ ++/* all zlib typedefs in zlib.h and zconf.h */ ++# define Byte z_Byte ++# define Bytef z_Bytef ++# define alloc_func z_alloc_func ++# define charf z_charf ++# define free_func z_free_func ++# ifndef Z_SOLO ++# define gzFile z_gzFile ++# endif ++# define gz_header z_gz_header ++# define gz_headerp z_gz_headerp ++# define in_func z_in_func ++# define intf z_intf ++# define out_func z_out_func ++# define uInt z_uInt ++# define uIntf z_uIntf ++# define uLong z_uLong ++# define uLongf z_uLongf ++# define voidp z_voidp ++# define voidpc z_voidpc ++# define voidpf z_voidpf ++ ++/* all zlib structs in zlib.h and zconf.h */ ++# define gz_header_s z_gz_header_s ++# define internal_state z_internal_state ++ ++#endif ++ ++#if defined(__MSDOS__) && !defined(MSDOS) ++# define MSDOS ++#endif ++#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) ++# define OS2 ++#endif ++#if defined(_WINDOWS) && !defined(WINDOWS) ++# define WINDOWS ++#endif ++#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) ++# ifndef WIN32 ++# define WIN32 ++# endif ++#endif ++#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) ++# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) ++# ifndef SYS16BIT ++# define SYS16BIT ++# endif ++# endif ++#endif ++ ++/* ++ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more ++ * than 64k bytes at a time (needed on systems with 16-bit int). ++ */ ++#ifdef SYS16BIT ++# define MAXSEG_64K ++#endif ++#ifdef MSDOS ++# define UNALIGNED_OK ++#endif ++ ++#ifdef __STDC_VERSION__ ++# ifndef STDC ++# define STDC ++# endif ++# if __STDC_VERSION__ >= 199901L ++# ifndef STDC99 ++# define STDC99 ++# endif ++# endif ++#endif ++#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) ++# define STDC ++#endif ++#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) ++# define STDC ++#endif ++#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) ++# define STDC ++#endif ++#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) ++# define STDC ++#endif ++ ++#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ ++# define STDC ++#endif ++ ++#ifndef STDC ++# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ ++# define const /* note: need a more gentle solution here */ ++# endif ++#endif ++ ++#if defined(ZLIB_CONST) && !defined(z_const) ++# define z_const const ++#else ++# define z_const ++#endif ++ ++/* Some Mac compilers merge all .h files incorrectly: */ ++#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) ++# define NO_DUMMY_DECL ++#endif ++ ++/* Maximum value for memLevel in deflateInit2 */ ++#ifndef MAX_MEM_LEVEL ++# ifdef MAXSEG_64K ++# define MAX_MEM_LEVEL 8 ++# else ++# define MAX_MEM_LEVEL 9 ++# endif ++#endif ++ ++/* Maximum value for windowBits in deflateInit2 and inflateInit2. ++ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files ++ * created by gzip. (Files created by minigzip can still be extracted by ++ * gzip.) ++ */ ++#ifndef MAX_WBITS ++# define MAX_WBITS 15 /* 32K LZ77 window */ ++#endif ++ ++/* The memory requirements for deflate are (in bytes): ++ (1 << (windowBits+2)) + (1 << (memLevel+9)) ++ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) ++ plus a few kilobytes for small objects. For example, if you want to reduce ++ the default memory requirements from 256K to 128K, compile with ++ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" ++ Of course this will generally degrade compression (there's no free lunch). ++ ++ The memory requirements for inflate are (in bytes) 1 << windowBits ++ that is, 32K for windowBits=15 (default value) plus a few kilobytes ++ for small objects. ++*/ ++ ++ /* Type declarations */ ++ ++#ifndef OF /* function prototypes */ ++# ifdef STDC ++# define OF(args) args ++# else ++# define OF(args) () ++# endif ++#endif ++ ++#ifndef Z_ARG /* function prototypes for stdarg */ ++# if defined(STDC) || defined(Z_HAVE_STDARG_H) ++# define Z_ARG(args) args ++# else ++# define Z_ARG(args) () ++# endif ++#endif ++ ++/* The following definitions for FAR are needed only for MSDOS mixed ++ * model programming (small or medium model with some far allocations). ++ * This was tested only with MSC; for other MSDOS compilers you may have ++ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, ++ * just define FAR to be empty. ++ */ ++#ifdef SYS16BIT ++# if defined(M_I86SM) || defined(M_I86MM) ++ /* MSC small or medium model */ ++# define SMALL_MEDIUM ++# ifdef _MSC_VER ++# define FAR _far ++# else ++# define FAR far ++# endif ++# endif ++# if (defined(__SMALL__) || defined(__MEDIUM__)) ++ /* Turbo C small or medium model */ ++# define SMALL_MEDIUM ++# ifdef __BORLANDC__ ++# define FAR _far ++# else ++# define FAR far ++# endif ++# endif ++#endif ++ ++#if defined(WINDOWS) || defined(WIN32) ++ /* If building or using zlib as a DLL, define ZLIB_DLL. ++ * This is not mandatory, but it offers a little performance increase. ++ */ ++# ifdef ZLIB_DLL ++# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) ++# ifdef ZLIB_INTERNAL ++# define ZEXTERN extern __declspec(dllexport) ++# else ++# define ZEXTERN extern __declspec(dllimport) ++# endif ++# endif ++# endif /* ZLIB_DLL */ ++ /* If building or using zlib with the WINAPI/WINAPIV calling convention, ++ * define ZLIB_WINAPI. ++ * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. ++ */ ++# ifdef ZLIB_WINAPI ++# ifdef FAR ++# undef FAR ++# endif ++# include <windows.h> ++ /* No need for _export, use ZLIB.DEF instead. */ ++ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ ++# define ZEXPORT WINAPI ++# ifdef WIN32 ++# define ZEXPORTVA WINAPIV ++# else ++# define ZEXPORTVA FAR CDECL ++# endif ++# endif ++#endif ++ ++#if defined (__BEOS__) ++# ifdef ZLIB_DLL ++# ifdef ZLIB_INTERNAL ++# define ZEXPORT __declspec(dllexport) ++# define ZEXPORTVA __declspec(dllexport) ++# else ++# define ZEXPORT __declspec(dllimport) ++# define ZEXPORTVA __declspec(dllimport) ++# endif ++# endif ++#endif ++ ++#ifndef ZEXTERN ++# define ZEXTERN extern ++#endif ++#ifndef ZEXPORT ++# define ZEXPORT ++#endif ++#ifndef ZEXPORTVA ++# define ZEXPORTVA ++#endif ++ ++#ifndef FAR ++# define FAR ++#endif ++ ++#if !defined(__MACTYPES__) ++typedef unsigned char Byte; /* 8 bits */ ++#endif ++typedef unsigned int uInt; /* 16 bits or more */ ++ ++#ifdef _LP64 ++typedef unsigned int uLong; /* 32 bits or more */ ++#else ++typedef unsigned long uLong; /* 32 bits or more */ ++#endif ++ ++#ifdef SMALL_MEDIUM ++ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ ++# define Bytef Byte FAR ++#else ++ typedef Byte FAR Bytef; ++#endif ++typedef char FAR charf; ++typedef int FAR intf; ++typedef uInt FAR uIntf; ++typedef uLong FAR uLongf; ++ ++#ifdef STDC ++ typedef void const *voidpc; ++ typedef void FAR *voidpf; ++ typedef void *voidp; ++#else ++ typedef Byte const *voidpc; ++ typedef Byte FAR *voidpf; ++ typedef Byte *voidp; ++#endif ++ ++#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) ++# include <limits.h> ++# if (UINT_MAX == 0xffffffffUL) ++# define Z_U4 unsigned ++# elif (ULONG_MAX == 0xffffffffUL) ++# define Z_U4 unsigned long ++# elif (USHRT_MAX == 0xffffffffUL) ++# define Z_U4 unsigned short ++# endif ++#endif ++ ++#ifdef Z_U4 ++ typedef Z_U4 z_crc_t; ++#else ++ typedef unsigned long z_crc_t; ++#endif ++ ++#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ ++# define Z_HAVE_UNISTD_H ++#endif ++ ++#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ ++# define Z_HAVE_STDARG_H ++#endif ++ ++#ifdef STDC ++# ifndef Z_SOLO ++# include <sys/types.h> /* for off_t */ ++# endif ++#endif ++ ++#if defined(STDC) || defined(Z_HAVE_STDARG_H) ++# ifndef Z_SOLO ++# include <stdarg.h> /* for va_list */ ++# endif ++#endif ++ ++#ifdef _WIN32 ++# ifndef Z_SOLO ++# include <stddef.h> /* for wchar_t */ ++# endif ++#endif ++ ++/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and ++ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even ++ * though the former does not conform to the LFS document), but considering ++ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as ++ * equivalently requesting no 64-bit operations ++ */ ++#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 ++# undef _LARGEFILE64_SOURCE ++#endif ++ ++#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) ++# define Z_HAVE_UNISTD_H ++#endif ++#ifndef Z_SOLO ++# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) ++# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ ++# ifdef VMS ++# include <unixio.h> /* for off_t */ ++# endif ++# ifndef z_off_t ++# define z_off_t off_t ++# endif ++# endif ++#endif ++ ++#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 ++# define Z_LFS64 ++#endif ++ ++#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) ++# define Z_LARGE64 ++#endif ++ ++#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) ++# define Z_WANT64 ++#endif ++ ++#if !defined(SEEK_SET) && !defined(Z_SOLO) ++# define SEEK_SET 0 /* Seek from beginning of file. */ ++# define SEEK_CUR 1 /* Seek from current position. */ ++# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ ++#endif ++ ++#ifndef z_off_t ++# define z_off_t long ++#endif ++ ++#if !defined(_WIN32) && defined(Z_LARGE64) ++# define z_off64_t off64_t ++#else ++# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) ++# define z_off64_t __int64 ++# else ++# define z_off64_t z_off_t ++# endif ++#endif ++ ++/* MVS linker does not support external names larger than 8 bytes */ ++#if defined(__MVS__) ++ #pragma map(deflateInit_,"DEIN") ++ #pragma map(deflateInit2_,"DEIN2") ++ #pragma map(deflateEnd,"DEEND") ++ #pragma map(deflateBound,"DEBND") ++ #pragma map(inflateInit_,"ININ") ++ #pragma map(inflateInit2_,"ININ2") ++ #pragma map(inflateEnd,"INEND") ++ #pragma map(inflateSync,"INSY") ++ #pragma map(inflateSetDictionary,"INSEDI") ++ #pragma map(compressBound,"CMBND") ++ #pragma map(inflate_table,"INTABL") ++ #pragma map(inflate_fast,"INFA") ++ #pragma map(inflate_copyright,"INCOPY") ++#endif ++ ++#endif /* ZCONF_H */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zcrc32.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zcrc32.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,449 @@ ++/* ++ * 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. ++ */ ++ ++/* crc32.c -- compute the CRC-32 of a data stream ++ * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ * ++ * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster ++ * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing ++ * tables for updating the shift register in one step with three exclusive-ors ++ * instead of four steps with four exclusive-ors. This results in about a ++ * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. ++ */ ++ ++/* @(#) $Id$ */ ++ ++/* ++ Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore ++ protection on the static variables used to control the first-use generation ++ of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should ++ first call get_crc_table() to initialize the tables before allowing more than ++ one thread to use crc32(). ++ ++ DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. ++ */ ++ ++#ifdef MAKECRCH ++# include <stdio.h> ++# ifndef DYNAMIC_CRC_TABLE ++# define DYNAMIC_CRC_TABLE ++# endif /* !DYNAMIC_CRC_TABLE */ ++#endif /* MAKECRCH */ ++ ++#include "zutil.h" /* for STDC and FAR definitions */ ++ ++#define local static ++ ++/* Definitions for doing the crc four data bytes at a time. */ ++#if !defined(NOBYFOUR) && defined(Z_U4) ++# define BYFOUR ++#endif ++#ifdef BYFOUR ++ local unsigned long crc32_little OF((unsigned long, ++ const unsigned char FAR *, unsigned)); ++ local unsigned long crc32_big OF((unsigned long, ++ const unsigned char FAR *, unsigned)); ++# define TBLS 8 ++#else ++# define TBLS 1 ++#endif /* BYFOUR */ ++ ++/* Local functions for crc concatenation */ ++local unsigned long gf2_matrix_times OF((unsigned long *mat, ++ unsigned long vec)); ++local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); ++local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); ++ ++ ++#ifdef DYNAMIC_CRC_TABLE ++ ++local volatile int crc_table_empty = 1; ++local z_crc_t FAR crc_table[TBLS][256]; ++local void make_crc_table OF((void)); ++#ifdef MAKECRCH ++ local void write_table OF((FILE *, const z_crc_t FAR *)); ++#endif /* MAKECRCH */ ++/* ++ Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: ++ x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. ++ ++ Polynomials over GF(2) are represented in binary, one bit per coefficient, ++ with the lowest powers in the most significant bit. Then adding polynomials ++ is just exclusive-or, and multiplying a polynomial by x is a right shift by ++ one. If we call the above polynomial p, and represent a byte as the ++ polynomial q, also with the lowest power in the most significant bit (so the ++ byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, ++ where a mod b means the remainder after dividing a by b. ++ ++ This calculation is done using the shift-register method of multiplying and ++ taking the remainder. The register is initialized to zero, and for each ++ incoming bit, x^32 is added mod p to the register if the bit is a one (where ++ x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by ++ x (which is shifting right by one and adding x^32 mod p if the bit shifted ++ out is a one). We start with the highest power (least significant bit) of ++ q and repeat for all eight bits of q. ++ ++ The first table is simply the CRC of all possible eight bit values. This is ++ all the information needed to generate CRCs on data a byte at a time for all ++ combinations of CRC register values and incoming bytes. The remaining tables ++ allow for word-at-a-time CRC calculation for both big-endian and little- ++ endian machines, where a word is four bytes. ++*/ ++local void make_crc_table() ++{ ++ z_crc_t c; ++ int n, k; ++ z_crc_t poly; /* polynomial exclusive-or pattern */ ++ /* terms of polynomial defining this crc (except x^32): */ ++ static volatile int first = 1; /* flag to limit concurrent making */ ++ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; ++ ++ /* See if another task is already doing this (not thread-safe, but better ++ than nothing -- significantly reduces duration of vulnerability in ++ case the advice about DYNAMIC_CRC_TABLE is ignored) */ ++ if (first) { ++ first = 0; ++ ++ /* make exclusive-or pattern from polynomial (0xedb88320UL) */ ++ poly = 0; ++ for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) ++ poly |= (z_crc_t)1 << (31 - p[n]); ++ ++ /* generate a crc for every 8-bit value */ ++ for (n = 0; n < 256; n++) { ++ c = (z_crc_t)n; ++ for (k = 0; k < 8; k++) ++ c = c & 1 ? poly ^ (c >> 1) : c >> 1; ++ crc_table[0][n] = c; ++ } ++ ++#ifdef BYFOUR ++ /* generate crc for each value followed by one, two, and three zeros, ++ and then the byte reversal of those as well as the first table */ ++ for (n = 0; n < 256; n++) { ++ c = crc_table[0][n]; ++ crc_table[4][n] = ZSWAP32(c); ++ for (k = 1; k < 4; k++) { ++ c = crc_table[0][c & 0xff] ^ (c >> 8); ++ crc_table[k][n] = c; ++ crc_table[k + 4][n] = ZSWAP32(c); ++ } ++ } ++#endif /* BYFOUR */ ++ ++ crc_table_empty = 0; ++ } ++ else { /* not first */ ++ /* wait for the other guy to finish (not efficient, but rare) */ ++ while (crc_table_empty) ++ ; ++ } ++ ++#ifdef MAKECRCH ++ /* write out CRC tables to crc32.h */ ++ { ++ FILE *out; ++ ++ out = fopen("crc32.h", "w"); ++ if (out == NULL) return; ++ fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); ++ fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); ++ fprintf(out, "local const z_crc_t FAR "); ++ fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); ++ write_table(out, crc_table[0]); ++# ifdef BYFOUR ++ fprintf(out, "#ifdef BYFOUR\n"); ++ for (k = 1; k < 8; k++) { ++ fprintf(out, " },\n {\n"); ++ write_table(out, crc_table[k]); ++ } ++ fprintf(out, "#endif\n"); ++# endif /* BYFOUR */ ++ fprintf(out, " }\n};\n"); ++ fclose(out); ++ } ++#endif /* MAKECRCH */ ++} ++ ++#ifdef MAKECRCH ++local void write_table(out, table) ++ FILE *out; ++ const z_crc_t FAR *table; ++{ ++ int n; ++ ++ for (n = 0; n < 256; n++) ++ fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", ++ (unsigned long)(table[n]), ++ n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); ++} ++#endif /* MAKECRCH */ ++ ++#else /* !DYNAMIC_CRC_TABLE */ ++/* ======================================================================== ++ * Tables of CRC-32s of all single-byte values, made by make_crc_table(). ++ */ ++#include "crc32.h" ++#endif /* DYNAMIC_CRC_TABLE */ ++ ++/* ========================================================================= ++ * This function can be used by asm versions of crc32() ++ */ ++const z_crc_t FAR * ZEXPORT get_crc_table() ++{ ++#ifdef DYNAMIC_CRC_TABLE ++ if (crc_table_empty) ++ make_crc_table(); ++#endif /* DYNAMIC_CRC_TABLE */ ++ return (const z_crc_t FAR *)crc_table; ++} ++ ++/* ========================================================================= */ ++#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) ++#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 ++ ++/* ========================================================================= */ ++uLong ZEXPORT crc32(crc, buf, len) ++ uLong crc; ++ const unsigned char FAR *buf; ++ uInt len; ++{ ++ if (buf == Z_NULL) return 0UL; ++ ++#ifdef DYNAMIC_CRC_TABLE ++ if (crc_table_empty) ++ make_crc_table(); ++#endif /* DYNAMIC_CRC_TABLE */ ++ ++#ifdef BYFOUR ++ if (sizeof(void *) == sizeof(ptrdiff_t)) { ++ z_crc_t endian; ++ ++ endian = 1; ++ if (*((unsigned char *)(&endian))) ++ return (uLong)crc32_little(crc, buf, len); ++ else ++ return (uLong)crc32_big(crc, buf, len); ++ } ++#endif /* BYFOUR */ ++ crc = crc ^ 0xffffffffUL; ++ while (len >= 8) { ++ DO8; ++ len -= 8; ++ } ++ if (len) do { ++ DO1; ++ } while (--len); ++ return crc ^ 0xffffffffUL; ++} ++ ++#ifdef BYFOUR ++ ++/* ========================================================================= */ ++#define DOLIT4 c ^= *buf4++; \ ++ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ ++ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] ++#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 ++ ++/* ========================================================================= */ ++local unsigned long crc32_little(crc, buf, len) ++ unsigned long crc; ++ const unsigned char FAR *buf; ++ unsigned len; ++{ ++ register z_crc_t c; ++ register const z_crc_t FAR *buf4; ++ ++ c = (z_crc_t)crc; ++ c = ~c; ++ while (len && ((ptrdiff_t)buf & 3)) { ++ c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); ++ len--; ++ } ++ ++ buf4 = (const z_crc_t FAR *)(const void FAR *)buf; ++ while (len >= 32) { ++ DOLIT32; ++ len -= 32; ++ } ++ while (len >= 4) { ++ DOLIT4; ++ len -= 4; ++ } ++ buf = (const unsigned char FAR *)buf4; ++ ++ if (len) do { ++ c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); ++ } while (--len); ++ c = ~c; ++ return (unsigned long)c; ++} ++ ++/* ========================================================================= */ ++#define DOBIG4 c ^= *++buf4; \ ++ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ ++ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] ++#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 ++ ++/* ========================================================================= */ ++local unsigned long crc32_big(crc, buf, len) ++ unsigned long crc; ++ const unsigned char FAR *buf; ++ unsigned len; ++{ ++ register z_crc_t c; ++ register const z_crc_t FAR *buf4; ++ ++ c = ZSWAP32((z_crc_t)crc); ++ c = ~c; ++ while (len && ((ptrdiff_t)buf & 3)) { ++ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); ++ len--; ++ } ++ ++ buf4 = (const z_crc_t FAR *)(const void FAR *)buf; ++ buf4--; ++ while (len >= 32) { ++ DOBIG32; ++ len -= 32; ++ } ++ while (len >= 4) { ++ DOBIG4; ++ len -= 4; ++ } ++ buf4++; ++ buf = (const unsigned char FAR *)buf4; ++ ++ if (len) do { ++ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); ++ } while (--len); ++ c = ~c; ++ return (unsigned long)(ZSWAP32(c)); ++} ++ ++#endif /* BYFOUR */ ++ ++#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ ++ ++/* ========================================================================= */ ++local unsigned long gf2_matrix_times(mat, vec) ++ unsigned long *mat; ++ unsigned long vec; ++{ ++ unsigned long sum; ++ ++ sum = 0; ++ while (vec) { ++ if (vec & 1) ++ sum ^= *mat; ++ vec >>= 1; ++ mat++; ++ } ++ return sum; ++} ++ ++/* ========================================================================= */ ++local void gf2_matrix_square(square, mat) ++ unsigned long *square; ++ unsigned long *mat; ++{ ++ int n; ++ ++ for (n = 0; n < GF2_DIM; n++) ++ square[n] = gf2_matrix_times(mat, mat[n]); ++} ++ ++/* ========================================================================= */ ++local uLong crc32_combine_(crc1, crc2, len2) ++ uLong crc1; ++ uLong crc2; ++ z_off64_t len2; ++{ ++ int n; ++ unsigned long row; ++ unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ ++ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ ++ ++ /* degenerate case (also disallow negative lengths) */ ++ if (len2 <= 0) ++ return crc1; ++ ++ /* put operator for one zero bit in odd */ ++ odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ ++ row = 1; ++ for (n = 1; n < GF2_DIM; n++) { ++ odd[n] = row; ++ row <<= 1; ++ } ++ ++ /* put operator for two zero bits in even */ ++ gf2_matrix_square(even, odd); ++ ++ /* put operator for four zero bits in odd */ ++ gf2_matrix_square(odd, even); ++ ++ /* apply len2 zeros to crc1 (first square will put the operator for one ++ zero byte, eight zero bits, in even) */ ++ do { ++ /* apply zeros operator for this bit of len2 */ ++ gf2_matrix_square(even, odd); ++ if (len2 & 1) ++ crc1 = gf2_matrix_times(even, crc1); ++ len2 >>= 1; ++ ++ /* if no more bits set, then done */ ++ if (len2 == 0) ++ break; ++ ++ /* another iteration of the loop with odd and even swapped */ ++ gf2_matrix_square(odd, even); ++ if (len2 & 1) ++ crc1 = gf2_matrix_times(odd, crc1); ++ len2 >>= 1; ++ ++ /* if no more bits set, then done */ ++ } while (len2 != 0); ++ ++ /* return combined crc */ ++ crc1 ^= crc2; ++ return crc1; ++} ++ ++/* ========================================================================= */ ++uLong ZEXPORT crc32_combine(crc1, crc2, len2) ++ uLong crc1; ++ uLong crc2; ++ z_off_t len2; ++{ ++ return crc32_combine_(crc1, crc2, len2); ++} ++ ++uLong ZEXPORT crc32_combine64(crc1, crc2, len2) ++ uLong crc1; ++ uLong crc2; ++ z_off64_t len2; ++{ ++ return crc32_combine_(crc1, crc2, len2); ++} +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zlib.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zlib.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,1792 @@ ++/* ++ * 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. ++ */ ++ ++/* zlib.h -- interface of the 'zlib' general purpose compression library ++ version 1.2.8, April 28th, 2013 ++ ++ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler ++ ++ This software is provided 'as-is', without any express or implied ++ warranty. In no event will the authors be held liable for any damages ++ arising from the use of this software. ++ ++ Permission is granted to anyone to use this software for any purpose, ++ including commercial applications, and to alter it and redistribute it ++ freely, subject to the following restrictions: ++ ++ 1. The origin of this software must not be misrepresented; you must not ++ claim that you wrote the original software. If you use this software ++ in a product, an acknowledgment in the product documentation would be ++ appreciated but is not required. ++ 2. Altered source versions must be plainly marked as such, and must not be ++ misrepresented as being the original software. ++ 3. This notice may not be removed or altered from any source distribution. ++ ++ Jean-loup Gailly Mark Adler ++ jloup@gzip.org madler@alumni.caltech.edu ++ ++ ++ The data format used by the zlib library is described by RFCs (Request for ++ Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 ++ (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). ++*/ ++ ++#ifndef ZLIB_H ++#define ZLIB_H ++ ++#include "zconf.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#define ZLIB_VERSION "1.2.8" ++#define ZLIB_VERNUM 0x1280 ++#define ZLIB_VER_MAJOR 1 ++#define ZLIB_VER_MINOR 2 ++#define ZLIB_VER_REVISION 8 ++#define ZLIB_VER_SUBREVISION 0 ++ ++/* ++ The 'zlib' compression library provides in-memory compression and ++ decompression functions, including integrity checks of the uncompressed data. ++ This version of the library supports only one compression method (deflation) ++ but other algorithms will be added later and will have the same stream ++ interface. ++ ++ Compression can be done in a single step if the buffers are large enough, ++ or can be done by repeated calls of the compression function. In the latter ++ case, the application must provide more input and/or consume the output ++ (providing more output space) before each call. ++ ++ The compressed data format used by default by the in-memory functions is ++ the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped ++ around a deflate stream, which is itself documented in RFC 1951. ++ ++ The library also supports reading and writing files in gzip (.gz) format ++ with an interface similar to that of stdio using the functions that start ++ with "gz". The gzip format is different from the zlib format. gzip is a ++ gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. ++ ++ This library can optionally read and write gzip streams in memory as well. ++ ++ The zlib format was designed to be compact and fast for use in memory ++ and on communications channels. The gzip format was designed for single- ++ file compression on file systems, has a larger header than zlib to maintain ++ directory information, and uses a different, slower check method than zlib. ++ ++ The library does not install any signal handler. The decoder checks ++ the consistency of the compressed data, so the library should never crash ++ even in case of corrupted input. ++*/ ++ ++typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); ++typedef void (*free_func) OF((voidpf opaque, voidpf address)); ++ ++struct internal_state; ++ ++typedef struct z_stream_s { ++ z_const Bytef *next_in; /* next input byte */ ++ uInt avail_in; /* number of bytes available at next_in */ ++ uLong total_in; /* total number of input bytes read so far */ ++ ++ Bytef *next_out; /* next output byte should be put there */ ++ uInt avail_out; /* remaining free space at next_out */ ++ uLong total_out; /* total number of bytes output so far */ ++ ++ z_const char *msg; /* last error message, NULL if no error */ ++ struct internal_state FAR *state; /* not visible by applications */ ++ ++ alloc_func zalloc; /* used to allocate the internal state */ ++ free_func zfree; /* used to free the internal state */ ++ voidpf opaque; /* private data object passed to zalloc and zfree */ ++ ++ int data_type; /* best guess about the data type: binary or text */ ++ uLong adler; /* adler32 value of the uncompressed data */ ++ uLong reserved; /* reserved for future use */ ++} z_stream; ++ ++typedef z_stream FAR *z_streamp; ++ ++/* ++ gzip header information passed to and from zlib routines. See RFC 1952 ++ for more details on the meanings of these fields. ++*/ ++typedef struct gz_header_s { ++ int text; /* true if compressed data believed to be text */ ++ uLong time; /* modification time */ ++ int xflags; /* extra flags (not used when writing a gzip file) */ ++ int os; /* operating system */ ++ Bytef *extra; /* pointer to extra field or Z_NULL if none */ ++ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ ++ uInt extra_max; /* space at extra (only when reading header) */ ++ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ ++ uInt name_max; /* space at name (only when reading header) */ ++ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ ++ uInt comm_max; /* space at comment (only when reading header) */ ++ int hcrc; /* true if there was or will be a header crc */ ++ int done; /* true when done reading gzip header (not used ++ when writing a gzip file) */ ++} gz_header; ++ ++typedef gz_header FAR *gz_headerp; ++ ++/* ++ The application must update next_in and avail_in when avail_in has dropped ++ to zero. It must update next_out and avail_out when avail_out has dropped ++ to zero. The application must initialize zalloc, zfree and opaque before ++ calling the init function. All other fields are set by the compression ++ library and must not be updated by the application. ++ ++ The opaque value provided by the application will be passed as the first ++ parameter for calls of zalloc and zfree. This can be useful for custom ++ memory management. The compression library attaches no meaning to the ++ opaque value. ++ ++ zalloc must return Z_NULL if there is not enough memory for the object. ++ If zlib is used in a multi-threaded application, zalloc and zfree must be ++ thread safe. ++ ++ On 16-bit systems, the functions zalloc and zfree must be able to allocate ++ exactly 65536 bytes, but will not be required to allocate more than this if ++ the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers ++ returned by zalloc for objects of exactly 65536 bytes *must* have their ++ offset normalized to zero. The default allocation function provided by this ++ library ensures this (see zutil.c). To reduce memory requirements and avoid ++ any allocation of 64K objects, at the expense of compression ratio, compile ++ the library with -DMAX_WBITS=14 (see zconf.h). ++ ++ The fields total_in and total_out can be used for statistics or progress ++ reports. After compression, total_in holds the total size of the ++ uncompressed data and may be saved for use in the decompressor (particularly ++ if the decompressor wants to decompress everything in a single step). ++*/ ++ ++ /* constants */ ++ ++#define Z_NO_FLUSH 0 ++#define Z_PARTIAL_FLUSH 1 ++#define Z_SYNC_FLUSH 2 ++#define Z_FULL_FLUSH 3 ++#define Z_FINISH 4 ++#define Z_BLOCK 5 ++#define Z_TREES 6 ++/* Allowed flush values; see deflate() and inflate() below for details */ ++ ++#define Z_OK 0 ++#define Z_STREAM_END 1 ++#define Z_NEED_DICT 2 ++#define Z_ERRNO (-1) ++#define Z_STREAM_ERROR (-2) ++#define Z_DATA_ERROR (-3) ++#define Z_MEM_ERROR (-4) ++#define Z_BUF_ERROR (-5) ++#define Z_VERSION_ERROR (-6) ++/* Return codes for the compression/decompression functions. Negative values ++ * are errors, positive values are used for special but normal events. ++ */ ++ ++#define Z_NO_COMPRESSION 0 ++#define Z_BEST_SPEED 1 ++#define Z_BEST_COMPRESSION 9 ++#define Z_DEFAULT_COMPRESSION (-1) ++/* compression levels */ ++ ++#define Z_FILTERED 1 ++#define Z_HUFFMAN_ONLY 2 ++#define Z_RLE 3 ++#define Z_FIXED 4 ++#define Z_DEFAULT_STRATEGY 0 ++/* compression strategy; see deflateInit2() below for details */ ++ ++#define Z_BINARY 0 ++#define Z_TEXT 1 ++#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ ++#define Z_UNKNOWN 2 ++/* Possible values of the data_type field (though see inflate()) */ ++ ++#define Z_DEFLATED 8 ++/* The deflate compression method (the only one supported in this version) */ ++ ++#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ ++ ++#define zlib_version zlibVersion() ++/* for compatibility with versions < 1.0.2 */ ++ ++ ++ /* basic functions */ ++ ++ZEXTERN const char * ZEXPORT zlibVersion OF((void)); ++/* The application can compare zlibVersion and ZLIB_VERSION for consistency. ++ If the first character differs, the library code actually used is not ++ compatible with the zlib.h header file used by the application. This check ++ is automatically made by deflateInit and inflateInit. ++ */ ++ ++/* ++ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); ++ ++ Initializes the internal stream state for compression. The fields ++ zalloc, zfree and opaque must be initialized before by the caller. If ++ zalloc and zfree are set to Z_NULL, deflateInit updates them to use default ++ allocation functions. ++ ++ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: ++ 1 gives best speed, 9 gives best compression, 0 gives no compression at all ++ (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION ++ requests a default compromise between speed and compression (currently ++ equivalent to level 6). ++ ++ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough ++ memory, Z_STREAM_ERROR if level is not a valid compression level, or ++ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible ++ with the version assumed by the caller (ZLIB_VERSION). msg is set to null ++ if there is no error message. deflateInit does not perform any compression: ++ this will be done by deflate(). ++*/ ++ ++ ++ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); ++/* ++ deflate compresses as much data as possible, and stops when the input ++ buffer becomes empty or the output buffer becomes full. It may introduce ++ some output latency (reading input without producing any output) except when ++ forced to flush. ++ ++ The detailed semantics are as follows. deflate performs one or both of the ++ following actions: ++ ++ - Compress more input starting at next_in and update next_in and avail_in ++ accordingly. If not all input can be processed (because there is not ++ enough room in the output buffer), next_in and avail_in are updated and ++ processing will resume at this point for the next call of deflate(). ++ ++ - Provide more output starting at next_out and update next_out and avail_out ++ accordingly. This action is forced if the parameter flush is non zero. ++ Forcing flush frequently degrades the compression ratio, so this parameter ++ should be set only when necessary (in interactive applications). Some ++ output may be provided even if flush is not set. ++ ++ Before the call of deflate(), the application should ensure that at least ++ one of the actions is possible, by providing more input and/or consuming more ++ output, and updating avail_in or avail_out accordingly; avail_out should ++ never be zero before the call. The application can consume the compressed ++ output when it wants, for example when the output buffer is full (avail_out ++ == 0), or after each call of deflate(). If deflate returns Z_OK and with ++ zero avail_out, it must be called again after making room in the output ++ buffer because there might be more output pending. ++ ++ Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to ++ decide how much data to accumulate before producing output, in order to ++ maximize compression. ++ ++ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is ++ flushed to the output buffer and the output is aligned on a byte boundary, so ++ that the decompressor can get all input data available so far. (In ++ particular avail_in is zero after the call if enough output space has been ++ provided before the call.) Flushing may degrade compression for some ++ compression algorithms and so it should be used only when necessary. This ++ completes the current deflate block and follows it with an empty stored block ++ that is three bits plus filler bits to the next byte, followed by four bytes ++ (00 00 ff ff). ++ ++ If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the ++ output buffer, but the output is not aligned to a byte boundary. All of the ++ input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. ++ This completes the current deflate block and follows it with an empty fixed ++ codes block that is 10 bits long. This assures that enough bytes are output ++ in order for the decompressor to finish the block before the empty fixed code ++ block. ++ ++ If flush is set to Z_BLOCK, a deflate block is completed and emitted, as ++ for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to ++ seven bits of the current block are held to be written as the next byte after ++ the next deflate block is completed. In this case, the decompressor may not ++ be provided enough bits at this point in order to complete decompression of ++ the data provided so far to the compressor. It may need to wait for the next ++ block to be emitted. This is for advanced applications that need to control ++ the emission of deflate blocks. ++ ++ If flush is set to Z_FULL_FLUSH, all output is flushed as with ++ Z_SYNC_FLUSH, and the compression state is reset so that decompression can ++ restart from this point if previous compressed data has been damaged or if ++ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade ++ compression. ++ ++ If deflate returns with avail_out == 0, this function must be called again ++ with the same value of the flush parameter and more output space (updated ++ avail_out), until the flush is complete (deflate returns with non-zero ++ avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that ++ avail_out is greater than six to avoid repeated flush markers due to ++ avail_out == 0 on return. ++ ++ If the parameter flush is set to Z_FINISH, pending input is processed, ++ pending output is flushed and deflate returns with Z_STREAM_END if there was ++ enough output space; if deflate returns with Z_OK, this function must be ++ called again with Z_FINISH and more output space (updated avail_out) but no ++ more input data, until it returns with Z_STREAM_END or an error. After ++ deflate has returned Z_STREAM_END, the only possible operations on the stream ++ are deflateReset or deflateEnd. ++ ++ Z_FINISH can be used immediately after deflateInit if all the compression ++ is to be done in a single step. In this case, avail_out must be at least the ++ value returned by deflateBound (see below). Then deflate is guaranteed to ++ return Z_STREAM_END. If not enough output space is provided, deflate will ++ not return Z_STREAM_END, and it must be called again as described above. ++ ++ deflate() sets strm->adler to the adler32 checksum of all input read ++ so far (that is, total_in bytes). ++ ++ deflate() may update strm->data_type if it can make a good guess about ++ the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered ++ binary. This field is only for information purposes and does not affect the ++ compression algorithm in any manner. ++ ++ deflate() returns Z_OK if some progress has been made (more input ++ processed or more output produced), Z_STREAM_END if all input has been ++ consumed and all output has been produced (only when flush is set to ++ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example ++ if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible ++ (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not ++ fatal, and deflate() can be called again with more input and more output ++ space to continue compressing. ++*/ ++ ++ ++ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); ++/* ++ All dynamically allocated data structures for this stream are freed. ++ This function discards any unprocessed input and does not flush any pending ++ output. ++ ++ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the ++ stream state was inconsistent, Z_DATA_ERROR if the stream was freed ++ prematurely (some input or output was discarded). In the error case, msg ++ may be set but then points to a static string (which must not be ++ deallocated). ++*/ ++ ++ ++/* ++ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); ++ ++ Initializes the internal stream state for decompression. The fields ++ next_in, avail_in, zalloc, zfree and opaque must be initialized before by ++ the caller. If next_in is not Z_NULL and avail_in is large enough (the ++ exact value depends on the compression method), inflateInit determines the ++ compression method from the zlib header and allocates all data structures ++ accordingly; otherwise the allocation will be deferred to the first call of ++ inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to ++ use default allocation functions. ++ ++ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough ++ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the ++ version assumed by the caller, or Z_STREAM_ERROR if the parameters are ++ invalid, such as a null pointer to the structure. msg is set to null if ++ there is no error message. inflateInit does not perform any decompression ++ apart from possibly reading the zlib header if present: actual decompression ++ will be done by inflate(). (So next_in and avail_in may be modified, but ++ next_out and avail_out are unused and unchanged.) The current implementation ++ of inflateInit() does not process any header information -- that is deferred ++ until inflate() is called. ++*/ ++ ++ ++ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); ++/* ++ inflate decompresses as much data as possible, and stops when the input ++ buffer becomes empty or the output buffer becomes full. It may introduce ++ some output latency (reading input without producing any output) except when ++ forced to flush. ++ ++ The detailed semantics are as follows. inflate performs one or both of the ++ following actions: ++ ++ - Decompress more input starting at next_in and update next_in and avail_in ++ accordingly. If not all input can be processed (because there is not ++ enough room in the output buffer), next_in is updated and processing will ++ resume at this point for the next call of inflate(). ++ ++ - Provide more output starting at next_out and update next_out and avail_out ++ accordingly. inflate() provides as much output as possible, until there is ++ no more input data or no more space in the output buffer (see below about ++ the flush parameter). ++ ++ Before the call of inflate(), the application should ensure that at least ++ one of the actions is possible, by providing more input and/or consuming more ++ output, and updating the next_* and avail_* values accordingly. The ++ application can consume the uncompressed output when it wants, for example ++ when the output buffer is full (avail_out == 0), or after each call of ++ inflate(). If inflate returns Z_OK and with zero avail_out, it must be ++ called again after making room in the output buffer because there might be ++ more output pending. ++ ++ The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, ++ Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much ++ output as possible to the output buffer. Z_BLOCK requests that inflate() ++ stop if and when it gets to the next deflate block boundary. When decoding ++ the zlib or gzip format, this will cause inflate() to return immediately ++ after the header and before the first block. When doing a raw inflate, ++ inflate() will go ahead and process the first block, and will return when it ++ gets to the end of that block, or when it runs out of data. ++ ++ The Z_BLOCK option assists in appending to or combining deflate streams. ++ Also to assist in this, on return inflate() will set strm->data_type to the ++ number of unused bits in the last byte taken from strm->next_in, plus 64 if ++ inflate() is currently decoding the last block in the deflate stream, plus ++ 128 if inflate() returned immediately after decoding an end-of-block code or ++ decoding the complete header up to just before the first byte of the deflate ++ stream. The end-of-block will not be indicated until all of the uncompressed ++ data from that block has been written to strm->next_out. The number of ++ unused bits may in general be greater than seven, except when bit 7 of ++ data_type is set, in which case the number of unused bits will be less than ++ eight. data_type is set as noted here every time inflate() returns for all ++ flush options, and so can be used to determine the amount of currently ++ consumed input in bits. ++ ++ The Z_TREES option behaves as Z_BLOCK does, but it also returns when the ++ end of each deflate block header is reached, before any actual data in that ++ block is decoded. This allows the caller to determine the length of the ++ deflate block header for later use in random access within a deflate block. ++ 256 is added to the value of strm->data_type when inflate() returns ++ immediately after reaching the end of the deflate block header. ++ ++ inflate() should normally be called until it returns Z_STREAM_END or an ++ error. However if all decompression is to be performed in a single step (a ++ single call of inflate), the parameter flush should be set to Z_FINISH. In ++ this case all pending input is processed and all pending output is flushed; ++ avail_out must be large enough to hold all of the uncompressed data for the ++ operation to complete. (The size of the uncompressed data may have been ++ saved by the compressor for this purpose.) The use of Z_FINISH is not ++ required to perform an inflation in one step. However it may be used to ++ inform inflate that a faster approach can be used for the single inflate() ++ call. Z_FINISH also informs inflate to not maintain a sliding window if the ++ stream completes, which reduces inflate's memory footprint. If the stream ++ does not complete, either because not all of the stream is provided or not ++ enough output space is provided, then a sliding window will be allocated and ++ inflate() can be called again to continue the operation as if Z_NO_FLUSH had ++ been used. ++ ++ In this implementation, inflate() always flushes as much output as ++ possible to the output buffer, and always uses the faster approach on the ++ first call. So the effects of the flush parameter in this implementation are ++ on the return value of inflate() as noted below, when inflate() returns early ++ when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of ++ memory for a sliding window when Z_FINISH is used. ++ ++ If a preset dictionary is needed after this call (see inflateSetDictionary ++ below), inflate sets strm->adler to the Adler-32 checksum of the dictionary ++ chosen by the compressor and returns Z_NEED_DICT; otherwise it sets ++ strm->adler to the Adler-32 checksum of all output produced so far (that is, ++ total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described ++ below. At the end of the stream, inflate() checks that its computed adler32 ++ checksum is equal to that saved by the compressor and returns Z_STREAM_END ++ only if the checksum is correct. ++ ++ inflate() can decompress and check either zlib-wrapped or gzip-wrapped ++ deflate data. The header type is detected automatically, if requested when ++ initializing with inflateInit2(). Any information contained in the gzip ++ header is not retained, so applications that need that information should ++ instead use raw inflate, see inflateInit2() below, or inflateBack() and ++ perform their own processing of the gzip header and trailer. When processing ++ gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output ++ producted so far. The CRC-32 is checked against the gzip trailer. ++ ++ inflate() returns Z_OK if some progress has been made (more input processed ++ or more output produced), Z_STREAM_END if the end of the compressed data has ++ been reached and all uncompressed output has been produced, Z_NEED_DICT if a ++ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was ++ corrupted (input stream not conforming to the zlib format or incorrect check ++ value), Z_STREAM_ERROR if the stream structure was inconsistent (for example ++ next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, ++ Z_BUF_ERROR if no progress is possible or if there was not enough room in the ++ output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and ++ inflate() can be called again with more input and more output space to ++ continue decompressing. If Z_DATA_ERROR is returned, the application may ++ then call inflateSync() to look for a good compression block if a partial ++ recovery of the data is desired. ++*/ ++ ++ ++ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); ++/* ++ All dynamically allocated data structures for this stream are freed. ++ This function discards any unprocessed input and does not flush any pending ++ output. ++ ++ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state ++ was inconsistent. In the error case, msg may be set but then points to a ++ static string (which must not be deallocated). ++*/ ++ ++ ++ /* Advanced functions */ ++ ++/* ++ The following functions are needed only in some special applications. ++*/ ++ ++/* ++ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, ++ int level, ++ int method, ++ int windowBits, ++ int memLevel, ++ int strategy)); ++ ++ This is another version of deflateInit with more compression options. The ++ fields next_in, zalloc, zfree and opaque must be initialized before by the ++ caller. ++ ++ The method parameter is the compression method. It must be Z_DEFLATED in ++ this version of the library. ++ ++ The windowBits parameter is the base two logarithm of the window size ++ (the size of the history buffer). It should be in the range 8..15 for this ++ version of the library. Larger values of this parameter result in better ++ compression at the expense of memory usage. The default value is 15 if ++ deflateInit is used instead. ++ ++ windowBits can also be -8..-15 for raw deflate. In this case, -windowBits ++ determines the window size. deflate() will then generate raw deflate data ++ with no zlib header or trailer, and will not compute an adler32 check value. ++ ++ windowBits can also be greater than 15 for optional gzip encoding. Add ++ 16 to windowBits to write a simple gzip header and trailer around the ++ compressed data instead of a zlib wrapper. The gzip header will have no ++ file name, no extra data, no comment, no modification time (set to zero), no ++ header crc, and the operating system will be set to 255 (unknown). If a ++ gzip stream is being written, strm->adler is a crc32 instead of an adler32. ++ ++ The memLevel parameter specifies how much memory should be allocated ++ for the internal compression state. memLevel=1 uses minimum memory but is ++ slow and reduces compression ratio; memLevel=9 uses maximum memory for ++ optimal speed. The default value is 8. See zconf.h for total memory usage ++ as a function of windowBits and memLevel. ++ ++ The strategy parameter is used to tune the compression algorithm. Use the ++ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a ++ filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no ++ string match), or Z_RLE to limit match distances to one (run-length ++ encoding). Filtered data consists mostly of small values with a somewhat ++ random distribution. In this case, the compression algorithm is tuned to ++ compress them better. The effect of Z_FILTERED is to force more Huffman ++ coding and less string matching; it is somewhat intermediate between ++ Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as ++ fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The ++ strategy parameter only affects the compression ratio but not the ++ correctness of the compressed output even if it is not set appropriately. ++ Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler ++ decoder for special applications. ++ ++ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough ++ memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid ++ method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is ++ incompatible with the version assumed by the caller (ZLIB_VERSION). msg is ++ set to null if there is no error message. deflateInit2 does not perform any ++ compression: this will be done by deflate(). ++*/ ++ ++ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, ++ const Bytef *dictionary, ++ uInt dictLength)); ++/* ++ Initializes the compression dictionary from the given byte sequence ++ without producing any compressed output. When using the zlib format, this ++ function must be called immediately after deflateInit, deflateInit2 or ++ deflateReset, and before any call of deflate. When doing raw deflate, this ++ function must be called either before any call of deflate, or immediately ++ after the completion of a deflate block, i.e. after all input has been ++ consumed and all output has been delivered when using any of the flush ++ options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The ++ compressor and decompressor must use exactly the same dictionary (see ++ inflateSetDictionary). ++ ++ The dictionary should consist of strings (byte sequences) that are likely ++ to be encountered later in the data to be compressed, with the most commonly ++ used strings preferably put towards the end of the dictionary. Using a ++ dictionary is most useful when the data to be compressed is short and can be ++ predicted with good accuracy; the data can then be compressed better than ++ with the default empty dictionary. ++ ++ Depending on the size of the compression data structures selected by ++ deflateInit or deflateInit2, a part of the dictionary may in effect be ++ discarded, for example if the dictionary is larger than the window size ++ provided in deflateInit or deflateInit2. Thus the strings most likely to be ++ useful should be put at the end of the dictionary, not at the front. In ++ addition, the current implementation of deflate will use at most the window ++ size minus 262 bytes of the provided dictionary. ++ ++ Upon return of this function, strm->adler is set to the adler32 value ++ of the dictionary; the decompressor may later use this value to determine ++ which dictionary has been used by the compressor. (The adler32 value ++ applies to the whole dictionary even if only a subset of the dictionary is ++ actually used by the compressor.) If a raw deflate was requested, then the ++ adler32 value is not computed and strm->adler is not set. ++ ++ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a ++ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is ++ inconsistent (for example if deflate has already been called for this stream ++ or if not at a block boundary for raw deflate). deflateSetDictionary does ++ not perform any compression: this will be done by deflate(). ++*/ ++ ++ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, ++ z_streamp source)); ++/* ++ Sets the destination stream as a complete copy of the source stream. ++ ++ This function can be useful when several compression strategies will be ++ tried, for example when there are several ways of pre-processing the input ++ data with a filter. The streams that will be discarded should then be freed ++ by calling deflateEnd. Note that deflateCopy duplicates the internal ++ compression state which can be quite large, so this strategy is slow and can ++ consume lots of memory. ++ ++ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent ++ (such as zalloc being Z_NULL). msg is left unchanged in both source and ++ destination. ++*/ ++ ++ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); ++/* ++ This function is equivalent to deflateEnd followed by deflateInit, ++ but does not free and reallocate all the internal compression state. The ++ stream will keep the same compression level and any other attributes that ++ may have been set by deflateInit2. ++ ++ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source ++ stream state was inconsistent (such as zalloc or state being Z_NULL). ++*/ ++ ++ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, ++ int level, ++ int strategy)); ++/* ++ Dynamically update the compression level and compression strategy. The ++ interpretation of level and strategy is as in deflateInit2. This can be ++ used to switch between compression and straight copy of the input data, or ++ to switch to a different kind of input data requiring a different strategy. ++ If the compression level is changed, the input available so far is ++ compressed with the old level (and may be flushed); the new level will take ++ effect only at the next call of deflate(). ++ ++ Before the call of deflateParams, the stream state must be set as for ++ a call of deflate(), since the currently available input may have to be ++ compressed and flushed. In particular, strm->avail_out must be non-zero. ++ ++ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source ++ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if ++ strm->avail_out was zero. ++*/ ++ ++ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, ++ int good_length, ++ int max_lazy, ++ int nice_length, ++ int max_chain)); ++/* ++ Fine tune deflate's internal compression parameters. This should only be ++ used by someone who understands the algorithm used by zlib's deflate for ++ searching for the best matching string, and even then only by the most ++ fanatic optimizer trying to squeeze out the last compressed bit for their ++ specific input data. Read the deflate.c source code for the meaning of the ++ max_lazy, good_length, nice_length, and max_chain parameters. ++ ++ deflateTune() can be called after deflateInit() or deflateInit2(), and ++ returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. ++ */ ++ ++ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, ++ uLong sourceLen)); ++/* ++ deflateBound() returns an upper bound on the compressed size after ++ deflation of sourceLen bytes. It must be called after deflateInit() or ++ deflateInit2(), and after deflateSetHeader(), if used. This would be used ++ to allocate an output buffer for deflation in a single pass, and so would be ++ called before deflate(). If that first deflate() call is provided the ++ sourceLen input bytes, an output buffer allocated to the size returned by ++ deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed ++ to return Z_STREAM_END. Note that it is possible for the compressed size to ++ be larger than the value returned by deflateBound() if flush options other ++ than Z_FINISH or Z_NO_FLUSH are used. ++*/ ++ ++ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, ++ unsigned *pending, ++ int *bits)); ++/* ++ deflatePending() returns the number of bytes and bits of output that have ++ been generated, but not yet provided in the available output. The bytes not ++ provided would be due to the available output space having being consumed. ++ The number of bits of output not provided are between 0 and 7, where they ++ await more bits to join them in order to fill out a full byte. If pending ++ or bits are Z_NULL, then those values are not set. ++ ++ deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source ++ stream state was inconsistent. ++ */ ++ ++ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, ++ int bits, ++ int value)); ++/* ++ deflatePrime() inserts bits in the deflate output stream. The intent ++ is that this function is used to start off the deflate output with the bits ++ leftover from a previous deflate stream when appending to it. As such, this ++ function can only be used for raw deflate, and must be used before the first ++ deflate() call after a deflateInit2() or deflateReset(). bits must be less ++ than or equal to 16, and that many of the least significant bits of value ++ will be inserted in the output. ++ ++ deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough ++ room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the ++ source stream state was inconsistent. ++*/ ++ ++ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, ++ gz_headerp head)); ++/* ++ deflateSetHeader() provides gzip header information for when a gzip ++ stream is requested by deflateInit2(). deflateSetHeader() may be called ++ after deflateInit2() or deflateReset() and before the first call of ++ deflate(). The text, time, os, extra field, name, and comment information ++ in the provided gz_header structure are written to the gzip header (xflag is ++ ignored -- the extra flags are set according to the compression level). The ++ caller must assure that, if not Z_NULL, name and comment are terminated with ++ a zero byte, and that if extra is not Z_NULL, that extra_len bytes are ++ available there. If hcrc is true, a gzip header crc is included. Note that ++ the current versions of the command-line version of gzip (up through version ++ 1.3.x) do not support header crc's, and will report that it is a "multi-part ++ gzip file" and give up. ++ ++ If deflateSetHeader is not used, the default gzip header has text false, ++ the time set to zero, and os set to 255, with no extra, name, or comment ++ fields. The gzip header is returned to the default state by deflateReset(). ++ ++ deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source ++ stream state was inconsistent. ++*/ ++ ++/* ++ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, ++ int windowBits)); ++ ++ This is another version of inflateInit with an extra parameter. The ++ fields next_in, avail_in, zalloc, zfree and opaque must be initialized ++ before by the caller. ++ ++ The windowBits parameter is the base two logarithm of the maximum window ++ size (the size of the history buffer). It should be in the range 8..15 for ++ this version of the library. The default value is 15 if inflateInit is used ++ instead. windowBits must be greater than or equal to the windowBits value ++ provided to deflateInit2() while compressing, or it must be equal to 15 if ++ deflateInit2() was not used. If a compressed stream with a larger window ++ size is given as input, inflate() will return with the error code ++ Z_DATA_ERROR instead of trying to allocate a larger window. ++ ++ windowBits can also be zero to request that inflate use the window size in ++ the zlib header of the compressed stream. ++ ++ windowBits can also be -8..-15 for raw inflate. In this case, -windowBits ++ determines the window size. inflate() will then process raw deflate data, ++ not looking for a zlib or gzip header, not generating a check value, and not ++ looking for any check values for comparison at the end of the stream. This ++ is for use with other formats that use the deflate compressed data format ++ such as zip. Those formats provide their own check values. If a custom ++ format is developed using the raw deflate format for compressed data, it is ++ recommended that a check value such as an adler32 or a crc32 be applied to ++ the uncompressed data as is done in the zlib, gzip, and zip formats. For ++ most applications, the zlib format should be used as is. Note that comments ++ above on the use in deflateInit2() applies to the magnitude of windowBits. ++ ++ windowBits can also be greater than 15 for optional gzip decoding. Add ++ 32 to windowBits to enable zlib and gzip decoding with automatic header ++ detection, or add 16 to decode only the gzip format (the zlib format will ++ return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a ++ crc32 instead of an adler32. ++ ++ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough ++ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the ++ version assumed by the caller, or Z_STREAM_ERROR if the parameters are ++ invalid, such as a null pointer to the structure. msg is set to null if ++ there is no error message. inflateInit2 does not perform any decompression ++ apart from possibly reading the zlib header if present: actual decompression ++ will be done by inflate(). (So next_in and avail_in may be modified, but ++ next_out and avail_out are unused and unchanged.) The current implementation ++ of inflateInit2() does not process any header information -- that is ++ deferred until inflate() is called. ++*/ ++ ++ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, ++ const Bytef *dictionary, ++ uInt dictLength)); ++/* ++ Initializes the decompression dictionary from the given uncompressed byte ++ sequence. This function must be called immediately after a call of inflate, ++ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor ++ can be determined from the adler32 value returned by that call of inflate. ++ The compressor and decompressor must use exactly the same dictionary (see ++ deflateSetDictionary). For raw inflate, this function can be called at any ++ time to set the dictionary. If the provided dictionary is smaller than the ++ window and there is already data in the window, then the provided dictionary ++ will amend what's there. The application must insure that the dictionary ++ that was used for compression is provided. ++ ++ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a ++ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is ++ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the ++ expected one (incorrect adler32 value). inflateSetDictionary does not ++ perform any decompression: this will be done by subsequent calls of ++ inflate(). ++*/ ++ ++ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, ++ Bytef *dictionary, ++ uInt *dictLength)); ++/* ++ Returns the sliding dictionary being maintained by inflate. dictLength is ++ set to the number of bytes in the dictionary, and that many bytes are copied ++ to dictionary. dictionary must have enough space, where 32768 bytes is ++ always enough. If inflateGetDictionary() is called with dictionary equal to ++ Z_NULL, then only the dictionary length is returned, and nothing is copied. ++ Similary, if dictLength is Z_NULL, then it is not set. ++ ++ inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the ++ stream state is inconsistent. ++*/ ++ ++ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); ++/* ++ Skips invalid compressed data until a possible full flush point (see above ++ for the description of deflate with Z_FULL_FLUSH) can be found, or until all ++ available input is skipped. No output is provided. ++ ++ inflateSync searches for a 00 00 FF FF pattern in the compressed data. ++ All full flush points have this pattern, but not all occurrences of this ++ pattern are full flush points. ++ ++ inflateSync returns Z_OK if a possible full flush point has been found, ++ Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point ++ has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. ++ In the success case, the application may save the current current value of ++ total_in which indicates where valid compressed data was found. In the ++ error case, the application may repeatedly call inflateSync, providing more ++ input each time, until success or end of the input data. ++*/ ++ ++ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, ++ z_streamp source)); ++/* ++ Sets the destination stream as a complete copy of the source stream. ++ ++ This function can be useful when randomly accessing a large stream. The ++ first pass through the stream can periodically record the inflate state, ++ allowing restarting inflate at those points when randomly accessing the ++ stream. ++ ++ inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent ++ (such as zalloc being Z_NULL). msg is left unchanged in both source and ++ destination. ++*/ ++ ++ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); ++/* ++ This function is equivalent to inflateEnd followed by inflateInit, ++ but does not free and reallocate all the internal decompression state. The ++ stream will keep attributes that may have been set by inflateInit2. ++ ++ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source ++ stream state was inconsistent (such as zalloc or state being Z_NULL). ++*/ ++ ++ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, ++ int windowBits)); ++/* ++ This function is the same as inflateReset, but it also permits changing ++ the wrap and window size requests. The windowBits parameter is interpreted ++ the same as it is for inflateInit2. ++ ++ inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source ++ stream state was inconsistent (such as zalloc or state being Z_NULL), or if ++ the windowBits parameter is invalid. ++*/ ++ ++ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, ++ int bits, ++ int value)); ++/* ++ This function inserts bits in the inflate input stream. The intent is ++ that this function is used to start inflating at a bit position in the ++ middle of a byte. The provided bits will be used before any bytes are used ++ from next_in. This function should only be used with raw inflate, and ++ should be used before the first inflate() call after inflateInit2() or ++ inflateReset(). bits must be less than or equal to 16, and that many of the ++ least significant bits of value will be inserted in the input. ++ ++ If bits is negative, then the input stream bit buffer is emptied. Then ++ inflatePrime() can be called again to put bits in the buffer. This is used ++ to clear out bits leftover after feeding inflate a block description prior ++ to feeding inflate codes. ++ ++ inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source ++ stream state was inconsistent. ++*/ ++ ++ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); ++/* ++ This function returns two values, one in the lower 16 bits of the return ++ value, and the other in the remaining upper bits, obtained by shifting the ++ return value down 16 bits. If the upper value is -1 and the lower value is ++ zero, then inflate() is currently decoding information outside of a block. ++ If the upper value is -1 and the lower value is non-zero, then inflate is in ++ the middle of a stored block, with the lower value equaling the number of ++ bytes from the input remaining to copy. If the upper value is not -1, then ++ it is the number of bits back from the current bit position in the input of ++ the code (literal or length/distance pair) currently being processed. In ++ that case the lower value is the number of bytes already emitted for that ++ code. ++ ++ A code is being processed if inflate is waiting for more input to complete ++ decoding of the code, or if it has completed decoding but is waiting for ++ more output space to write the literal or match data. ++ ++ inflateMark() is used to mark locations in the input data for random ++ access, which may be at bit positions, and to note those cases where the ++ output of a code may span boundaries of random access blocks. The current ++ location in the input stream can be determined from avail_in and data_type ++ as noted in the description for the Z_BLOCK flush parameter for inflate. ++ ++ inflateMark returns the value noted above or -1 << 16 if the provided ++ source stream state was inconsistent. ++*/ ++ ++ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, ++ gz_headerp head)); ++/* ++ inflateGetHeader() requests that gzip header information be stored in the ++ provided gz_header structure. inflateGetHeader() may be called after ++ inflateInit2() or inflateReset(), and before the first call of inflate(). ++ As inflate() processes the gzip stream, head->done is zero until the header ++ is completed, at which time head->done is set to one. If a zlib stream is ++ being decoded, then head->done is set to -1 to indicate that there will be ++ no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be ++ used to force inflate() to return immediately after header processing is ++ complete and before any actual data is decompressed. ++ ++ The text, time, xflags, and os fields are filled in with the gzip header ++ contents. hcrc is set to true if there is a header CRC. (The header CRC ++ was valid if done is set to one.) If extra is not Z_NULL, then extra_max ++ contains the maximum number of bytes to write to extra. Once done is true, ++ extra_len contains the actual extra field length, and extra contains the ++ extra field, or that field truncated if extra_max is less than extra_len. ++ If name is not Z_NULL, then up to name_max characters are written there, ++ terminated with a zero unless the length is greater than name_max. If ++ comment is not Z_NULL, then up to comm_max characters are written there, ++ terminated with a zero unless the length is greater than comm_max. When any ++ of extra, name, or comment are not Z_NULL and the respective field is not ++ present in the header, then that field is set to Z_NULL to signal its ++ absence. This allows the use of deflateSetHeader() with the returned ++ structure to duplicate the header. However if those fields are set to ++ allocated memory, then the application will need to save those pointers ++ elsewhere so that they can be eventually freed. ++ ++ If inflateGetHeader is not used, then the header information is simply ++ discarded. The header is always checked for validity, including the header ++ CRC if present. inflateReset() will reset the process to discard the header ++ information. The application would need to call inflateGetHeader() again to ++ retrieve the header from the next gzip stream. ++ ++ inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source ++ stream state was inconsistent. ++*/ ++ ++/* ++ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, ++ unsigned char FAR *window)); ++ ++ Initialize the internal stream state for decompression using inflateBack() ++ calls. The fields zalloc, zfree and opaque in strm must be initialized ++ before the call. If zalloc and zfree are Z_NULL, then the default library- ++ derived memory allocation routines are used. windowBits is the base two ++ logarithm of the window size, in the range 8..15. window is a caller ++ supplied buffer of that size. Except for special applications where it is ++ assured that deflate was used with small window sizes, windowBits must be 15 ++ and a 32K byte window must be supplied to be able to decompress general ++ deflate streams. ++ ++ See inflateBack() for the usage of these routines. ++ ++ inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of ++ the parameters are invalid, Z_MEM_ERROR if the internal state could not be ++ allocated, or Z_VERSION_ERROR if the version of the library does not match ++ the version of the header file. ++*/ ++ ++typedef unsigned (*in_func) OF((void FAR *, ++ z_const unsigned char FAR * FAR *)); ++typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ++ ++ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, ++ in_func in, void FAR *in_desc, ++ out_func out, void FAR *out_desc)); ++/* ++ inflateBack() does a raw inflate with a single call using a call-back ++ interface for input and output. This is potentially more efficient than ++ inflate() for file i/o applications, in that it avoids copying between the ++ output and the sliding window by simply making the window itself the output ++ buffer. inflate() can be faster on modern CPUs when used with large ++ buffers. inflateBack() trusts the application to not change the output ++ buffer passed by the output function, at least until inflateBack() returns. ++ ++ inflateBackInit() must be called first to allocate the internal state ++ and to initialize the state with the user-provided window buffer. ++ inflateBack() may then be used multiple times to inflate a complete, raw ++ deflate stream with each call. inflateBackEnd() is then called to free the ++ allocated state. ++ ++ A raw deflate stream is one with no zlib or gzip header or trailer. ++ This routine would normally be used in a utility that reads zip or gzip ++ files and writes out uncompressed files. The utility would decode the ++ header and process the trailer on its own, hence this routine expects only ++ the raw deflate stream to decompress. This is different from the normal ++ behavior of inflate(), which expects either a zlib or gzip header and ++ trailer around the deflate stream. ++ ++ inflateBack() uses two subroutines supplied by the caller that are then ++ called by inflateBack() for input and output. inflateBack() calls those ++ routines until it reads a complete deflate stream and writes out all of the ++ uncompressed data, or until it encounters an error. The function's ++ parameters and return types are defined above in the in_func and out_func ++ typedefs. inflateBack() will call in(in_desc, &buf) which should return the ++ number of bytes of provided input, and a pointer to that input in buf. If ++ there is no input available, in() must return zero--buf is ignored in that ++ case--and inflateBack() will return a buffer error. inflateBack() will call ++ out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() ++ should return zero on success, or non-zero on failure. If out() returns ++ non-zero, inflateBack() will return with an error. Neither in() nor out() ++ are permitted to change the contents of the window provided to ++ inflateBackInit(), which is also the buffer that out() uses to write from. ++ The length written by out() will be at most the window size. Any non-zero ++ amount of input may be provided by in(). ++ ++ For convenience, inflateBack() can be provided input on the first call by ++ setting strm->next_in and strm->avail_in. If that input is exhausted, then ++ in() will be called. Therefore strm->next_in must be initialized before ++ calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called ++ immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in ++ must also be initialized, and then if strm->avail_in is not zero, input will ++ initially be taken from strm->next_in[0 .. strm->avail_in - 1]. ++ ++ The in_desc and out_desc parameters of inflateBack() is passed as the ++ first parameter of in() and out() respectively when they are called. These ++ descriptors can be optionally used to pass any information that the caller- ++ supplied in() and out() functions need to do their job. ++ ++ On return, inflateBack() will set strm->next_in and strm->avail_in to ++ pass back any unused input that was provided by the last in() call. The ++ return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR ++ if in() or out() returned an error, Z_DATA_ERROR if there was a format error ++ in the deflate stream (in which case strm->msg is set to indicate the nature ++ of the error), or Z_STREAM_ERROR if the stream was not properly initialized. ++ In the case of Z_BUF_ERROR, an input or output error can be distinguished ++ using strm->next_in which will be Z_NULL only if in() returned an error. If ++ strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning ++ non-zero. (in() will always be called before out(), so strm->next_in is ++ assured to be defined if out() returns non-zero.) Note that inflateBack() ++ cannot return Z_OK. ++*/ ++ ++ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); ++/* ++ All memory allocated by inflateBackInit() is freed. ++ ++ inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream ++ state was inconsistent. ++*/ ++ ++ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); ++/* Return flags indicating compile-time options. ++ ++ Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: ++ 1.0: size of uInt ++ 3.2: size of uLong ++ 5.4: size of voidpf (pointer) ++ 7.6: size of z_off_t ++ ++ Compiler, assembler, and debug options: ++ 8: DEBUG ++ 9: ASMV or ASMINF -- use ASM code ++ 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention ++ 11: 0 (reserved) ++ ++ One-time table building (smaller code, but not thread-safe if true): ++ 12: BUILDFIXED -- build static block decoding tables when needed ++ 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed ++ 14,15: 0 (reserved) ++ ++ Library content (indicates missing functionality): ++ 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking ++ deflate code when not needed) ++ 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect ++ and decode gzip streams (to avoid linking crc code) ++ 18-19: 0 (reserved) ++ ++ Operation variations (changes in library functionality): ++ 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate ++ 21: FASTEST -- deflate algorithm with only one, lowest compression level ++ 22,23: 0 (reserved) ++ ++ The sprintf variant used by gzprintf (zero is best): ++ 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format ++ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! ++ 26: 0 = returns value, 1 = void -- 1 means inferred string length returned ++ ++ Remainder: ++ 27-31: 0 (reserved) ++ */ ++ ++#ifndef Z_SOLO ++ ++ /* utility functions */ ++ ++/* ++ The following utility functions are implemented on top of the basic ++ stream-oriented functions. To simplify the interface, some default options ++ are assumed (compression level and memory usage, standard memory allocation ++ functions). The source code of these utility functions can be modified if ++ you need special options. ++*/ ++ ++ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen)); ++/* ++ Compresses the source buffer into the destination buffer. sourceLen is ++ the byte length of the source buffer. Upon entry, destLen is the total size ++ of the destination buffer, which must be at least the value returned by ++ compressBound(sourceLen). Upon exit, destLen is the actual size of the ++ compressed buffer. ++ ++ compress returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_BUF_ERROR if there was not enough room in the output ++ buffer. ++*/ ++ ++ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen, ++ int level)); ++/* ++ Compresses the source buffer into the destination buffer. The level ++ parameter has the same meaning as in deflateInit. sourceLen is the byte ++ length of the source buffer. Upon entry, destLen is the total size of the ++ destination buffer, which must be at least the value returned by ++ compressBound(sourceLen). Upon exit, destLen is the actual size of the ++ compressed buffer. ++ ++ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough ++ memory, Z_BUF_ERROR if there was not enough room in the output buffer, ++ Z_STREAM_ERROR if the level parameter is invalid. ++*/ ++ ++ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); ++/* ++ compressBound() returns an upper bound on the compressed size after ++ compress() or compress2() on sourceLen bytes. It would be used before a ++ compress() or compress2() call to allocate the destination buffer. ++*/ ++ ++ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, ++ const Bytef *source, uLong sourceLen)); ++/* ++ Decompresses the source buffer into the destination buffer. sourceLen is ++ the byte length of the source buffer. Upon entry, destLen is the total size ++ of the destination buffer, which must be large enough to hold the entire ++ uncompressed data. (The size of the uncompressed data must have been saved ++ previously by the compressor and transmitted to the decompressor by some ++ mechanism outside the scope of this compression library.) Upon exit, destLen ++ is the actual size of the uncompressed buffer. ++ ++ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not ++ enough memory, Z_BUF_ERROR if there was not enough room in the output ++ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In ++ the case where there is not enough room, uncompress() will fill the output ++ buffer with the uncompressed data up to that point. ++*/ ++ ++ /* gzip file access functions */ ++ ++/* ++ This library supports reading and writing files in gzip (.gz) format with ++ an interface similar to that of stdio, using the functions that start with ++ "gz". The gzip format is different from the zlib format. gzip is a gzip ++ wrapper, documented in RFC 1952, wrapped around a deflate stream. ++*/ ++ ++typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ ++ ++/* ++ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); ++ ++ Opens a gzip (.gz) file for reading or writing. The mode parameter is as ++ in fopen ("rb" or "wb") but can also include a compression level ("wb9") or ++ a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only ++ compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' ++ for fixed code compression as in "wb9F". (See the description of ++ deflateInit2 for more information about the strategy parameter.) 'T' will ++ request transparent writing or appending with no compression and not using ++ the gzip format. ++ ++ "a" can be used instead of "w" to request that the gzip stream that will ++ be written be appended to the file. "+" will result in an error, since ++ reading and writing to the same gzip file is not supported. The addition of ++ "x" when writing will create the file exclusively, which fails if the file ++ already exists. On systems that support it, the addition of "e" when ++ reading or writing will set the flag to close the file on an execve() call. ++ ++ These functions, as well as gzip, will read and decode a sequence of gzip ++ streams in a file. The append function of gzopen() can be used to create ++ such a file. (Also see gzflush() for another way to do this.) When ++ appending, gzopen does not test whether the file begins with a gzip stream, ++ nor does it look for the end of the gzip streams to begin appending. gzopen ++ will simply append a gzip stream to the existing file. ++ ++ gzopen can be used to read a file which is not in gzip format; in this ++ case gzread will directly read from the file without decompression. When ++ reading, this will be detected automatically by looking for the magic two- ++ byte gzip header. ++ ++ gzopen returns NULL if the file could not be opened, if there was ++ insufficient memory to allocate the gzFile state, or if an invalid mode was ++ specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). ++ errno can be checked to determine if the reason gzopen failed was that the ++ file could not be opened. ++*/ ++ ++ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); ++/* ++ gzdopen associates a gzFile with the file descriptor fd. File descriptors ++ are obtained from calls like open, dup, creat, pipe or fileno (if the file ++ has been previously opened with fopen). The mode parameter is as in gzopen. ++ ++ The next call of gzclose on the returned gzFile will also close the file ++ descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor ++ fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, ++ mode);. The duplicated descriptor should be saved to avoid a leak, since ++ gzdopen does not close fd if it fails. If you are using fileno() to get the ++ file descriptor from a FILE *, then you will have to use dup() to avoid ++ double-close()ing the file descriptor. Both gzclose() and fclose() will ++ close the associated file descriptor, so they need to have different file ++ descriptors. ++ ++ gzdopen returns NULL if there was insufficient memory to allocate the ++ gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not ++ provided, or '+' was provided), or if fd is -1. The file descriptor is not ++ used until the next gz* read, write, seek, or close operation, so gzdopen ++ will not detect if fd is invalid (unless fd is -1). ++*/ ++ ++ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); ++/* ++ Set the internal buffer size used by this library's functions. The ++ default buffer size is 8192 bytes. This function must be called after ++ gzopen() or gzdopen(), and before any other calls that read or write the ++ file. The buffer memory allocation is always deferred to the first read or ++ write. Two buffers are allocated, either both of the specified size when ++ writing, or one of the specified size and the other twice that size when ++ reading. A larger buffer size of, for example, 64K or 128K bytes will ++ noticeably increase the speed of decompression (reading). ++ ++ The new buffer size also affects the maximum length for gzprintf(). ++ ++ gzbuffer() returns 0 on success, or -1 on failure, such as being called ++ too late. ++*/ ++ ++ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); ++/* ++ Dynamically update the compression level or strategy. See the description ++ of deflateInit2 for the meaning of these parameters. ++ ++ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not ++ opened for writing. ++*/ ++ ++ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); ++/* ++ Reads the given number of uncompressed bytes from the compressed file. If ++ the input file is not in gzip format, gzread copies the given number of ++ bytes into the buffer directly from the file. ++ ++ After reaching the end of a gzip stream in the input, gzread will continue ++ to read, looking for another gzip stream. Any number of gzip streams may be ++ concatenated in the input file, and will all be decompressed by gzread(). ++ If something other than a gzip stream is encountered after a gzip stream, ++ that remaining trailing garbage is ignored (and no error is returned). ++ ++ gzread can be used to read a gzip file that is being concurrently written. ++ Upon reaching the end of the input, gzread will return with the available ++ data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then ++ gzclearerr can be used to clear the end of file indicator in order to permit ++ gzread to be tried again. Z_OK indicates that a gzip stream was completed ++ on the last gzread. Z_BUF_ERROR indicates that the input file ended in the ++ middle of a gzip stream. Note that gzread does not return -1 in the event ++ of an incomplete gzip stream. This error is deferred until gzclose(), which ++ will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip ++ stream. Alternatively, gzerror can be used before gzclose to detect this ++ case. ++ ++ gzread returns the number of uncompressed bytes actually read, less than ++ len for end of file, or -1 for error. ++*/ ++ ++ZEXTERN int ZEXPORT gzwrite OF((gzFile file, ++ voidpc buf, unsigned len)); ++/* ++ Writes the given number of uncompressed bytes into the compressed file. ++ gzwrite returns the number of uncompressed bytes written or 0 in case of ++ error. ++*/ ++ ++ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); ++/* ++ Converts, formats, and writes the arguments to the compressed file under ++ control of the format string, as in fprintf. gzprintf returns the number of ++ uncompressed bytes actually written, or 0 in case of error. The number of ++ uncompressed bytes written is limited to 8191, or one less than the buffer ++ size given to gzbuffer(). The caller should assure that this limit is not ++ exceeded. If it is exceeded, then gzprintf() will return an error (0) with ++ nothing written. In this case, there may also be a buffer overflow with ++ unpredictable consequences, which is possible only if zlib was compiled with ++ the insecure functions sprintf() or vsprintf() because the secure snprintf() ++ or vsnprintf() functions were not available. This can be determined using ++ zlibCompileFlags(). ++*/ ++ ++ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); ++/* ++ Writes the given null-terminated string to the compressed file, excluding ++ the terminating null character. ++ ++ gzputs returns the number of characters written, or -1 in case of error. ++*/ ++ ++ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); ++/* ++ Reads bytes from the compressed file until len-1 characters are read, or a ++ newline character is read and transferred to buf, or an end-of-file ++ condition is encountered. If any characters are read or if len == 1, the ++ string is terminated with a null character. If no characters are read due ++ to an end-of-file or len < 1, then the buffer is left untouched. ++ ++ gzgets returns buf which is a null-terminated string, or it returns NULL ++ for end-of-file or in case of error. If there was an error, the contents at ++ buf are indeterminate. ++*/ ++ ++ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); ++/* ++ Writes c, converted to an unsigned char, into the compressed file. gzputc ++ returns the value that was written, or -1 in case of error. ++*/ ++ ++ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); ++/* ++ Reads one byte from the compressed file. gzgetc returns this byte or -1 ++ in case of end of file or error. This is implemented as a macro for speed. ++ As such, it does not do all of the checking the other functions do. I.e. ++ it does not check to see if file is NULL, nor whether the structure file ++ points to has been clobbered or not. ++*/ ++ ++ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); ++/* ++ Push one character back onto the stream to be read as the first character ++ on the next read. At least one character of push-back is allowed. ++ gzungetc() returns the character pushed, or -1 on failure. gzungetc() will ++ fail if c is -1, and may fail if a character has been pushed but not read ++ yet. If gzungetc is used immediately after gzopen or gzdopen, at least the ++ output buffer size of pushed characters is allowed. (See gzbuffer above.) ++ The pushed character will be discarded if the stream is repositioned with ++ gzseek() or gzrewind(). ++*/ ++ ++ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); ++/* ++ Flushes all pending output into the compressed file. The parameter flush ++ is as in the deflate() function. The return value is the zlib error number ++ (see function gzerror below). gzflush is only permitted when writing. ++ ++ If the flush parameter is Z_FINISH, the remaining data is written and the ++ gzip stream is completed in the output. If gzwrite() is called again, a new ++ gzip stream will be started in the output. gzread() is able to read such ++ concatented gzip streams. ++ ++ gzflush should be called only when strictly necessary because it will ++ degrade compression if called too often. ++*/ ++ ++/* ++ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, ++ z_off_t offset, int whence)); ++ ++ Sets the starting position for the next gzread or gzwrite on the given ++ compressed file. The offset represents a number of bytes in the ++ uncompressed data stream. The whence parameter is defined as in lseek(2); ++ the value SEEK_END is not supported. ++ ++ If the file is opened for reading, this function is emulated but can be ++ extremely slow. If the file is opened for writing, only forward seeks are ++ supported; gzseek then compresses a sequence of zeroes up to the new ++ starting position. ++ ++ gzseek returns the resulting offset location as measured in bytes from ++ the beginning of the uncompressed stream, or -1 in case of error, in ++ particular if the file is opened for writing and the new starting position ++ would be before the current position. ++*/ ++ ++ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); ++/* ++ Rewinds the given file. This function is supported only for reading. ++ ++ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) ++*/ ++ ++/* ++ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); ++ ++ Returns the starting position for the next gzread or gzwrite on the given ++ compressed file. This position represents a number of bytes in the ++ uncompressed data stream, and is zero when starting, even if appending or ++ reading a gzip stream from the middle of a file using gzdopen(). ++ ++ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) ++*/ ++ ++/* ++ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); ++ ++ Returns the current offset in the file being read or written. This offset ++ includes the count of bytes that precede the gzip stream, for example when ++ appending or when using gzdopen() for reading. When reading, the offset ++ does not include as yet unused buffered input. This information can be used ++ for a progress indicator. On error, gzoffset() returns -1. ++*/ ++ ++ZEXTERN int ZEXPORT gzeof OF((gzFile file)); ++/* ++ Returns true (1) if the end-of-file indicator has been set while reading, ++ false (0) otherwise. Note that the end-of-file indicator is set only if the ++ read tried to go past the end of the input, but came up short. Therefore, ++ just like feof(), gzeof() may return false even if there is no more data to ++ read, in the event that the last read request was for the exact number of ++ bytes remaining in the input file. This will happen if the input file size ++ is an exact multiple of the buffer size. ++ ++ If gzeof() returns true, then the read functions will return no more data, ++ unless the end-of-file indicator is reset by gzclearerr() and the input file ++ has grown since the previous end of file was detected. ++*/ ++ ++ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); ++/* ++ Returns true (1) if file is being copied directly while reading, or false ++ (0) if file is a gzip stream being decompressed. ++ ++ If the input file is empty, gzdirect() will return true, since the input ++ does not contain a gzip stream. ++ ++ If gzdirect() is used immediately after gzopen() or gzdopen() it will ++ cause buffers to be allocated to allow reading the file to determine if it ++ is a gzip file. Therefore if gzbuffer() is used, it should be called before ++ gzdirect(). ++ ++ When writing, gzdirect() returns true (1) if transparent writing was ++ requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: ++ gzdirect() is not needed when writing. Transparent writing must be ++ explicitly requested, so the application already knows the answer. When ++ linking statically, using gzdirect() will include all of the zlib code for ++ gzip file reading and decompression, which may not be desired.) ++*/ ++ ++ZEXTERN int ZEXPORT gzclose OF((gzFile file)); ++/* ++ Flushes all pending output if necessary, closes the compressed file and ++ deallocates the (de)compression state. Note that once file is closed, you ++ cannot call gzerror with file, since its structures have been deallocated. ++ gzclose must not be called more than once on the same file, just as free ++ must not be called more than once on the same allocation. ++ ++ gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a ++ file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the ++ last read ended in the middle of a gzip stream, or Z_OK on success. ++*/ ++ ++ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); ++ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); ++/* ++ Same as gzclose(), but gzclose_r() is only for use when reading, and ++ gzclose_w() is only for use when writing or appending. The advantage to ++ using these instead of gzclose() is that they avoid linking in zlib ++ compression or decompression code that is not used when only reading or only ++ writing respectively. If gzclose() is used, then both compression and ++ decompression code will be included the application when linking to a static ++ zlib library. ++*/ ++ ++ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); ++/* ++ Returns the error message for the last error which occurred on the given ++ compressed file. errnum is set to zlib error number. If an error occurred ++ in the file system and not in the compression library, errnum is set to ++ Z_ERRNO and the application may consult errno to get the exact error code. ++ ++ The application must not modify the returned string. Future calls to ++ this function may invalidate the previously returned string. If file is ++ closed, then the string previously returned by gzerror will no longer be ++ available. ++ ++ gzerror() should be used to distinguish errors from end-of-file for those ++ functions above that do not distinguish those cases in their return values. ++*/ ++ ++ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); ++/* ++ Clears the error and end-of-file flags for file. This is analogous to the ++ clearerr() function in stdio. This is useful for continuing to read a gzip ++ file that is being written concurrently. ++*/ ++ ++#endif /* !Z_SOLO */ ++ ++ /* checksum functions */ ++ ++/* ++ These functions are not related to compression but are exported ++ anyway because they might be useful in applications using the compression ++ library. ++*/ ++ ++ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); ++/* ++ Update a running Adler-32 checksum with the bytes buf[0..len-1] and ++ return the updated checksum. If buf is Z_NULL, this function returns the ++ required initial value for the checksum. ++ ++ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed ++ much faster. ++ ++ Usage example: ++ ++ uLong adler = adler32(0L, Z_NULL, 0); ++ ++ while (read_buffer(buffer, length) != EOF) { ++ adler = adler32(adler, buffer, length); ++ } ++ if (adler != original_adler) error(); ++*/ ++ ++/* ++ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, ++ z_off_t len2)); ++ ++ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 ++ and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for ++ each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of ++ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note ++ that the z_off_t type (like off_t) is a signed integer. If len2 is ++ negative, the result has no meaning or utility. ++*/ ++ ++ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); ++/* ++ Update a running CRC-32 with the bytes buf[0..len-1] and return the ++ updated CRC-32. If buf is Z_NULL, this function returns the required ++ initial value for the crc. Pre- and post-conditioning (one's complement) is ++ performed within this function so it shouldn't be done by the application. ++ ++ Usage example: ++ ++ uLong crc = crc32(0L, Z_NULL, 0); ++ ++ while (read_buffer(buffer, length) != EOF) { ++ crc = crc32(crc, buffer, length); ++ } ++ if (crc != original_crc) error(); ++*/ ++ ++/* ++ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); ++ ++ Combine two CRC-32 check values into one. For two sequences of bytes, ++ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were ++ calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 ++ check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and ++ len2. ++*/ ++ ++ ++ /* various hacks, don't look :) */ ++ ++/* deflateInit and inflateInit are macros to allow checking the zlib version ++ * and the compiler's view of z_stream: ++ */ ++ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, ++ const char *version, int stream_size)); ++ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, ++ const char *version, int stream_size)); ++ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, ++ int windowBits, int memLevel, ++ int strategy, const char *version, ++ int stream_size)); ++ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, ++ const char *version, int stream_size)); ++ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, ++ unsigned char FAR *window, ++ const char *version, ++ int stream_size)); ++#define deflateInit(strm, level) \ ++ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) ++#define inflateInit(strm) \ ++ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) ++#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ ++ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ ++ (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) ++#define inflateInit2(strm, windowBits) \ ++ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ ++ (int)sizeof(z_stream)) ++#define inflateBackInit(strm, windowBits, window) \ ++ inflateBackInit_((strm), (windowBits), (window), \ ++ ZLIB_VERSION, (int)sizeof(z_stream)) ++ ++#ifndef Z_SOLO ++ ++/* gzgetc() macro and its supporting function and exposed data structure. Note ++ * that the real internal state is much larger than the exposed structure. ++ * This abbreviated structure exposes just enough for the gzgetc() macro. The ++ * user should not mess with these exposed elements, since their names or ++ * behavior could change in the future, perhaps even capriciously. They can ++ * only be used by the gzgetc() macro. You have been warned. ++ */ ++struct gzFile_s { ++ unsigned have; ++ unsigned char *next; ++ z_off64_t pos; ++}; ++ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ ++#ifdef Z_PREFIX_SET ++# undef z_gzgetc ++# define z_gzgetc(g) \ ++ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) ++#else ++# define gzgetc(g) \ ++ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) ++#endif ++ ++/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or ++ * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if ++ * both are true, the application gets the *64 functions, and the regular ++ * functions are changed to 64 bits) -- in case these are set on systems ++ * without large file support, _LFS64_LARGEFILE must also be true ++ */ ++#ifdef Z_LARGE64 ++ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ++ ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); ++ ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); ++ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); ++ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); ++ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); ++#endif ++ ++#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) ++# ifdef Z_PREFIX_SET ++# define z_gzopen z_gzopen64 ++# define z_gzseek z_gzseek64 ++# define z_gztell z_gztell64 ++# define z_gzoffset z_gzoffset64 ++# define z_adler32_combine z_adler32_combine64 ++# define z_crc32_combine z_crc32_combine64 ++# else ++# define gzopen gzopen64 ++# define gzseek gzseek64 ++# define gztell gztell64 ++# define gzoffset gzoffset64 ++# define adler32_combine adler32_combine64 ++# define crc32_combine crc32_combine64 ++# endif ++# ifndef Z_LARGE64 ++ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); ++ ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); ++ ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); ++ ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); ++ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ++ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); ++# endif ++#else ++ ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); ++ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); ++ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); ++ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); ++ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ++ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); ++#endif ++ ++#else /* Z_SOLO */ ++ ++ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); ++ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); ++ ++#endif /* !Z_SOLO */ ++ ++/* hack for buggy compilers */ ++#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) ++ struct internal_state {int dummy;}; ++#endif ++ ++/* undocumented functions */ ++ZEXTERN const char * ZEXPORT zError OF((int)); ++ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); ++ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ++ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); ++ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ++ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); ++#if defined(_WIN32) && !defined(Z_SOLO) ++ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, ++ const char *mode)); ++#endif ++#if defined(STDC) || defined(Z_HAVE_STDARG_H) ++# ifndef Z_SOLO ++ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, ++ const char *format, ++ va_list va)); ++# endif ++#endif ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* ZLIB_H */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zutil.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zutil.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,348 @@ ++/* ++ * 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. ++ */ ++ ++/* zutil.c -- target dependent utility functions for the compression library ++ * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* @(#) $Id$ */ ++ ++#include "zutil.h" ++#ifndef Z_SOLO ++# include "gzguts.h" ++#endif ++ ++#ifndef NO_DUMMY_DECL ++struct internal_state {int dummy;}; /* for buggy compilers */ ++#endif ++ ++z_const char * const z_errmsg[10] = { ++"need dictionary", /* Z_NEED_DICT 2 */ ++"stream end", /* Z_STREAM_END 1 */ ++"", /* Z_OK 0 */ ++"file error", /* Z_ERRNO (-1) */ ++"stream error", /* Z_STREAM_ERROR (-2) */ ++"data error", /* Z_DATA_ERROR (-3) */ ++"insufficient memory", /* Z_MEM_ERROR (-4) */ ++"buffer error", /* Z_BUF_ERROR (-5) */ ++"incompatible version",/* Z_VERSION_ERROR (-6) */ ++""}; ++ ++ ++const char * ZEXPORT zlibVersion() ++{ ++ return ZLIB_VERSION; ++} ++ ++uLong ZEXPORT zlibCompileFlags() ++{ ++ uLong flags; ++ ++ flags = 0; ++ switch ((int)(sizeof(uInt))) { ++ case 2: break; ++ case 4: flags += 1; break; ++ case 8: flags += 2; break; ++ default: flags += 3; ++ } ++ switch ((int)(sizeof(uLong))) { ++ case 2: break; ++ case 4: flags += 1 << 2; break; ++ case 8: flags += 2 << 2; break; ++ default: flags += 3 << 2; ++ } ++ switch ((int)(sizeof(voidpf))) { ++ case 2: break; ++ case 4: flags += 1 << 4; break; ++ case 8: flags += 2 << 4; break; ++ default: flags += 3 << 4; ++ } ++ switch ((int)(sizeof(z_off_t))) { ++ case 2: break; ++ case 4: flags += 1 << 6; break; ++ case 8: flags += 2 << 6; break; ++ default: flags += 3 << 6; ++ } ++#ifdef DEBUG ++ flags += 1 << 8; ++#endif ++#if defined(ASMV) || defined(ASMINF) ++ flags += 1 << 9; ++#endif ++#ifdef ZLIB_WINAPI ++ flags += 1 << 10; ++#endif ++#ifdef BUILDFIXED ++ flags += 1 << 12; ++#endif ++#ifdef DYNAMIC_CRC_TABLE ++ flags += 1 << 13; ++#endif ++#ifdef NO_GZCOMPRESS ++ flags += 1L << 16; ++#endif ++#ifdef NO_GZIP ++ flags += 1L << 17; ++#endif ++#ifdef PKZIP_BUG_WORKAROUND ++ flags += 1L << 20; ++#endif ++#ifdef FASTEST ++ flags += 1L << 21; ++#endif ++#if defined(STDC) || defined(Z_HAVE_STDARG_H) ++# ifdef NO_vsnprintf ++ flags += 1L << 25; ++# ifdef HAS_vsprintf_void ++ flags += 1L << 26; ++# endif ++# else ++# ifdef HAS_vsnprintf_void ++ flags += 1L << 26; ++# endif ++# endif ++#else ++ flags += 1L << 24; ++# ifdef NO_snprintf ++ flags += 1L << 25; ++# ifdef HAS_sprintf_void ++ flags += 1L << 26; ++# endif ++# else ++# ifdef HAS_snprintf_void ++ flags += 1L << 26; ++# endif ++# endif ++#endif ++ return flags; ++} ++ ++#ifdef DEBUG ++ ++# ifndef verbose ++# define verbose 0 ++# endif ++int ZLIB_INTERNAL z_verbose = verbose; ++ ++void ZLIB_INTERNAL z_error (m) ++ char *m; ++{ ++ fprintf(stderr, "%s\n", m); ++ exit(1); ++} ++#endif ++ ++/* exported to allow conversion of error code to string for compress() and ++ * uncompress() ++ */ ++const char * ZEXPORT zError(err) ++ int err; ++{ ++ return ERR_MSG(err); ++} ++ ++#if defined(_WIN32_WCE) ++ /* The Microsoft C Run-Time Library for Windows CE doesn't have ++ * errno. We define it as a global variable to simplify porting. ++ * Its value is always 0 and should not be used. ++ */ ++ int errno = 0; ++#endif ++ ++#ifndef HAVE_MEMCPY ++ ++void ZLIB_INTERNAL zmemcpy(dest, source, len) ++ Bytef* dest; ++ const Bytef* source; ++ uInt len; ++{ ++ if (len == 0) return; ++ do { ++ *dest++ = *source++; /* ??? to be unrolled */ ++ } while (--len != 0); ++} ++ ++int ZLIB_INTERNAL zmemcmp(s1, s2, len) ++ const Bytef* s1; ++ const Bytef* s2; ++ uInt len; ++{ ++ uInt j; ++ ++ for (j = 0; j < len; j++) { ++ if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; ++ } ++ return 0; ++} ++ ++void ZLIB_INTERNAL zmemzero(dest, len) ++ Bytef* dest; ++ uInt len; ++{ ++ if (len == 0) return; ++ do { ++ *dest++ = 0; /* ??? to be unrolled */ ++ } while (--len != 0); ++} ++#endif ++ ++#ifndef Z_SOLO ++ ++#ifdef SYS16BIT ++ ++#ifdef __TURBOC__ ++/* Turbo C in 16-bit mode */ ++ ++# define MY_ZCALLOC ++ ++/* Turbo C malloc() does not allow dynamic allocation of 64K bytes ++ * and farmalloc(64K) returns a pointer with an offset of 8, so we ++ * must fix the pointer. Warning: the pointer must be put back to its ++ * original form in order to free it, use zcfree(). ++ */ ++ ++#define MAX_PTR 10 ++/* 10*64K = 640K */ ++ ++local int next_ptr = 0; ++ ++typedef struct ptr_table_s { ++ voidpf org_ptr; ++ voidpf new_ptr; ++} ptr_table; ++ ++local ptr_table table[MAX_PTR]; ++/* This table is used to remember the original form of pointers ++ * to large buffers (64K). Such pointers are normalized with a zero offset. ++ * Since MSDOS is not a preemptive multitasking OS, this table is not ++ * protected from concurrent access. This hack doesn't work anyway on ++ * a protected system like OS/2. Use Microsoft C instead. ++ */ ++ ++voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) ++{ ++ voidpf buf = opaque; /* just to make some compilers happy */ ++ ulg bsize = (ulg)items*size; ++ ++ /* If we allocate less than 65520 bytes, we assume that farmalloc ++ * will return a usable pointer which doesn't have to be normalized. ++ */ ++ if (bsize < 65520L) { ++ buf = farmalloc(bsize); ++ if (*(ush*)&buf != 0) return buf; ++ } else { ++ buf = farmalloc(bsize + 16L); ++ } ++ if (buf == NULL || next_ptr >= MAX_PTR) return NULL; ++ table[next_ptr].org_ptr = buf; ++ ++ /* Normalize the pointer to seg:0 */ ++ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; ++ *(ush*)&buf = 0; ++ table[next_ptr++].new_ptr = buf; ++ return buf; ++} ++ ++void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) ++{ ++ int n; ++ if (*(ush*)&ptr != 0) { /* object < 64K */ ++ farfree(ptr); ++ return; ++ } ++ /* Find the original pointer */ ++ for (n = 0; n < next_ptr; n++) { ++ if (ptr != table[n].new_ptr) continue; ++ ++ farfree(table[n].org_ptr); ++ while (++n < next_ptr) { ++ table[n-1] = table[n]; ++ } ++ next_ptr--; ++ return; ++ } ++ ptr = opaque; /* just to make some compilers happy */ ++ Assert(0, "zcfree: ptr not found"); ++} ++ ++#endif /* __TURBOC__ */ ++ ++ ++#ifdef M_I86 ++/* Microsoft C in 16-bit mode */ ++ ++# define MY_ZCALLOC ++ ++#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) ++# define _halloc halloc ++# define _hfree hfree ++#endif ++ ++voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) ++{ ++ if (opaque) opaque = 0; /* to make compiler happy */ ++ return _halloc((long)items, size); ++} ++ ++void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) ++{ ++ if (opaque) opaque = 0; /* to make compiler happy */ ++ _hfree(ptr); ++} ++ ++#endif /* M_I86 */ ++ ++#endif /* SYS16BIT */ ++ ++ ++#ifndef MY_ZCALLOC /* Any system without a special alloc function */ ++ ++#ifndef STDC ++extern voidp malloc OF((uInt size)); ++extern voidp calloc OF((uInt items, uInt size)); ++extern void free OF((voidpf ptr)); ++#endif ++ ++voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) ++ voidpf opaque; ++ unsigned items; ++ unsigned size; ++{ ++ if (opaque) items += size - size; /* make compiler happy */ ++ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : ++ (voidpf)calloc(items, size); ++} ++ ++void ZLIB_INTERNAL zcfree (opaque, ptr) ++ voidpf opaque; ++ voidpf ptr; ++{ ++ free(ptr); ++ if (opaque) return; /* make compiler happy */ ++} ++ ++#endif /* MY_ZCALLOC */ ++ ++#endif /* !Z_SOLO */ +--- ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zutil.h Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/native/java/util/zip/zlib-1.2.8/zutil.h Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,277 @@ ++/* ++ * 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. ++ */ ++ ++/* zutil.h -- internal interface and configuration of the compression library ++ * Copyright (C) 1995-2013 Jean-loup Gailly. ++ * For conditions of distribution and use, see copyright notice in zlib.h ++ */ ++ ++/* WARNING: this file should *not* be used by applications. It is ++ part of the implementation of the compression library and is ++ subject to change. Applications should only use zlib.h. ++ */ ++ ++/* @(#) $Id$ */ ++ ++#ifndef ZUTIL_H ++#define ZUTIL_H ++ ++#ifdef HAVE_HIDDEN ++# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) ++#else ++# define ZLIB_INTERNAL ++#endif ++ ++#include "zlib.h" ++ ++#if defined(STDC) && !defined(Z_SOLO) ++# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) ++# include <stddef.h> ++# endif ++# include <string.h> ++# include <stdlib.h> ++#endif ++ ++#ifdef Z_SOLO ++ typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ ++#endif ++ ++#ifndef local ++# define local static ++#endif ++/* compile with -Dlocal if your debugger can't find static symbols */ ++ ++typedef unsigned char uch; ++typedef uch FAR uchf; ++typedef unsigned short ush; ++typedef ush FAR ushf; ++typedef unsigned long ulg; ++ ++extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ ++/* (size given to avoid silly warnings with Visual C++) */ ++ ++#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] ++ ++#define ERR_RETURN(strm,err) \ ++ return (strm->msg = ERR_MSG(err), (err)) ++/* To be used only when the state is known to be valid */ ++ ++ /* common constants */ ++ ++#ifndef DEF_WBITS ++# define DEF_WBITS MAX_WBITS ++#endif ++/* default windowBits for decompression. MAX_WBITS is for compression only */ ++ ++#if MAX_MEM_LEVEL >= 8 ++# define DEF_MEM_LEVEL 8 ++#else ++# define DEF_MEM_LEVEL MAX_MEM_LEVEL ++#endif ++/* default memLevel */ ++ ++#define STORED_BLOCK 0 ++#define STATIC_TREES 1 ++#define DYN_TREES 2 ++/* The three kinds of block type */ ++ ++#define MIN_MATCH 3 ++#define MAX_MATCH 258 ++/* The minimum and maximum match lengths */ ++ ++#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ ++ ++ /* target dependencies */ ++ ++#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) ++# define OS_CODE 0x00 ++# ifndef Z_SOLO ++# if defined(__TURBOC__) || defined(__BORLANDC__) ++# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) ++ /* Allow compilation with ANSI keywords only enabled */ ++ void _Cdecl farfree( void *block ); ++ void *_Cdecl farmalloc( unsigned long nbytes ); ++# else ++# include <alloc.h> ++# endif ++# else /* MSC or DJGPP */ ++# include <malloc.h> ++# endif ++# endif ++#endif ++ ++#ifdef AMIGA ++# define OS_CODE 0x01 ++#endif ++ ++#if defined(VAXC) || defined(VMS) ++# define OS_CODE 0x02 ++# define F_OPEN(name, mode) \ ++ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") ++#endif ++ ++#if defined(ATARI) || defined(atarist) ++# define OS_CODE 0x05 ++#endif ++ ++#ifdef OS2 ++# define OS_CODE 0x06 ++# if defined(M_I86) && !defined(Z_SOLO) ++# include <malloc.h> ++# endif ++#endif ++ ++#if defined(MACOS) || defined(TARGET_OS_MAC) ++# define OS_CODE 0x07 ++# ifndef Z_SOLO ++# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os ++# include <unix.h> /* for fdopen */ ++# else ++# ifndef fdopen ++# define fdopen(fd,mode) NULL /* No fdopen() */ ++# endif ++# endif ++# endif ++#endif ++ ++#ifdef TOPS20 ++# define OS_CODE 0x0a ++#endif ++ ++#ifdef WIN32 ++# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ ++# define OS_CODE 0x0b ++# endif ++#endif ++ ++#ifdef __50SERIES /* Prime/PRIMOS */ ++# define OS_CODE 0x0f ++#endif ++ ++#if defined(_BEOS_) || defined(RISCOS) ++# define fdopen(fd,mode) NULL /* No fdopen() */ ++#endif ++ ++#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX ++# if defined(_WIN32_WCE) ++# define fdopen(fd,mode) NULL /* No fdopen() */ ++# ifndef _PTRDIFF_T_DEFINED ++ typedef int ptrdiff_t; ++# define _PTRDIFF_T_DEFINED ++# endif ++# else ++# define fdopen(fd,type) _fdopen(fd,type) ++# endif ++#endif ++ ++#if defined(__BORLANDC__) && !defined(MSDOS) ++ #pragma warn -8004 ++ #pragma warn -8008 ++ #pragma warn -8066 ++#endif ++ ++/* provide prototypes for these when building zlib without LFS */ ++#if !defined(_WIN32) && \ ++ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) ++ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); ++ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); ++#endif ++ ++ /* common defaults */ ++ ++#ifndef OS_CODE ++# define OS_CODE 0x03 /* assume Unix */ ++#endif ++ ++#ifndef F_OPEN ++# define F_OPEN(name, mode) fopen((name), (mode)) ++#endif ++ ++ /* functions */ ++ ++#if defined(pyr) || defined(Z_SOLO) ++# define NO_MEMCPY ++#endif ++#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) ++ /* Use our own functions for small and medium model with MSC <= 5.0. ++ * You may have to use the same strategy for Borland C (untested). ++ * The __SC__ check is for Symantec. ++ */ ++# define NO_MEMCPY ++#endif ++#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) ++# define HAVE_MEMCPY ++#endif ++#ifdef HAVE_MEMCPY ++# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ ++# define zmemcpy _fmemcpy ++# define zmemcmp _fmemcmp ++# define zmemzero(dest, len) _fmemset(dest, 0, len) ++# else ++# define zmemcpy memcpy ++# define zmemcmp memcmp ++# define zmemzero(dest, len) memset(dest, 0, len) ++# endif ++#else ++ void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); ++ int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); ++ void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); ++#endif ++ ++/* Diagnostic functions */ ++#ifdef DEBUG ++# include <stdio.h> ++ extern int ZLIB_INTERNAL z_verbose; ++ extern void ZLIB_INTERNAL z_error OF((char *m)); ++# define Assert(cond,msg) {if(!(cond)) z_error(msg);} ++# define Trace(x) {if (z_verbose>=0) fprintf x ;} ++# define Tracev(x) {if (z_verbose>0) fprintf x ;} ++# define Tracevv(x) {if (z_verbose>1) fprintf x ;} ++# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} ++# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} ++#else ++# define Assert(cond,msg) ++# define Trace(x) ++# define Tracev(x) ++# define Tracevv(x) ++# define Tracec(c,x) ++# define Tracecv(c,x) ++#endif ++ ++#ifndef Z_SOLO ++ voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, ++ unsigned size)); ++ void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); ++#endif ++ ++#define ZALLOC(strm, items, size) \ ++ (*((strm)->zalloc))((strm)->opaque, (items), (size)) ++#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) ++#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} ++ ++/* Reverse the bytes in a 32-bit value */ ++#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ ++ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) ++ ++#endif /* ZUTIL_H */ +--- ./jdk/src/share/native/sun/awt/giflib/dgif_lib.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/giflib/dgif_lib.c Wed Jul 30 18:42:59 2014 +0100 +@@ -195,6 +195,11 @@ + GifFileType *GifFile; + GifFilePrivateType *Private; + ++ if (!readFunc) { ++ _GifError = D_GIF_ERR_READ_FAILED; ++ return NULL; ++ } ++ + GifFile = (GifFileType *)malloc(sizeof(GifFileType)); + if (GifFile == NULL) { + _GifError = D_GIF_ERR_NOT_ENOUGH_MEM; +--- ./jdk/src/share/native/sun/awt/image/BufImgSurfaceData.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/image/BufImgSurfaceData.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -69,17 +69,14 @@ + } + + clsICMCD = (*env)->NewWeakGlobalRef(env, cd); +- initICMCDmID = (*env)->GetMethodID(env, cd, "<init>", "(J)V"); +- pDataID = (*env)->GetFieldID(env, cd, "pData", "J"); +- +- rgbID = (*env)->GetFieldID(env, icm, "rgb", "[I"); +- allGrayID = (*env)->GetFieldID(env, icm, "allgrayopaque", "Z"); +- mapSizeID = (*env)->GetFieldID(env, icm, "map_size", "I"); +- colorDataID = (*env)->GetFieldID(env, icm, "colorData", +- "Lsun/awt/image/BufImgSurfaceData$ICMColorData;"); +- if (allGrayID == 0 || rgbID == 0 || mapSizeID == 0 || pDataID == 0|| colorDataID == 0 || initICMCDmID == 0) { +- JNU_ThrowInternalError(env, "Could not get field IDs"); +- } ++ JNU_CHECK_EXCEPTION(env); ++ CHECK_NULL(initICMCDmID = (*env)->GetMethodID(env, cd, "<init>", "(J)V")); ++ CHECK_NULL(pDataID = (*env)->GetFieldID(env, cd, "pData", "J")); ++ CHECK_NULL(rgbID = (*env)->GetFieldID(env, icm, "rgb", "[I")); ++ CHECK_NULL(allGrayID = (*env)->GetFieldID(env, icm, "allgrayopaque", "Z")); ++ CHECK_NULL(mapSizeID = (*env)->GetFieldID(env, icm, "map_size", "I")); ++ CHECK_NULL(colorDataID = (*env)->GetFieldID(env, icm, "colorData", ++ "Lsun/awt/image/BufImgSurfaceData$ICMColorData;")); + } + + /* +@@ -120,6 +117,7 @@ + bisdo->sdOps.Unlock = NULL; + bisdo->sdOps.Dispose = BufImg_Dispose; + bisdo->array = (*env)->NewWeakGlobalRef(env, array); ++ JNU_CHECK_EXCEPTION(env); + bisdo->offset = offset; + bisdo->bitoffset = bitoffset; + bisdo->scanStr = scanStr; +@@ -131,6 +129,7 @@ + } else { + jobject lutarray = (*env)->GetObjectField(env, icm, rgbID); + bisdo->lutarray = (*env)->NewWeakGlobalRef(env, lutarray); ++ JNU_CHECK_EXCEPTION(env); + bisdo->lutsize = (*env)->GetIntField(env, icm, mapSizeID); + bisdo->icm = (*env)->NewWeakGlobalRef(env, icm); + } +@@ -174,8 +173,8 @@ + { + bipriv->cData = BufImg_SetupICM(env, bisdo); + if (bipriv->cData == NULL) { +- JNU_ThrowNullPointerException(env, "Could not initialize " +- "inverse tables"); ++ (*env)->ExceptionClear(env); ++ JNU_ThrowNullPointerException(env, "Could not initialize inverse tables"); + return SD_FAILURE; + } + } else { +@@ -201,6 +200,7 @@ + if ((bipriv->lockFlags & (SD_LOCK_RD_WR)) != 0) { + bipriv->base = + (*env)->GetPrimitiveArrayCritical(env, bisdo->array, NULL); ++ CHECK_NULL(bipriv->base); + } + if ((bipriv->lockFlags & (SD_LOCK_LUT)) != 0) { + bipriv->lutbase = +@@ -291,6 +291,7 @@ + = (*env)->GetBooleanField(env, bisdo->icm, allGrayID); + int *pRgb = (int *) + ((*env)->GetPrimitiveArrayCritical(env, bisdo->lutarray, NULL)); ++ CHECK_NULL_RETURN(pRgb, (ColorData*)NULL); + cData->img_clr_tbl = initCubemap(pRgb, bisdo->lutsize, 32); + if (allGray == JNI_TRUE) { + initInverseGrayLut(pRgb, bisdo->lutsize, cData); +@@ -303,6 +304,7 @@ + if (JNU_IsNull(env, colorData)) { + jlong pData = ptr_to_jlong(cData); + colorData = (*env)->NewObjectA(env, clsICMCD, initICMCDmID, (jvalue *)&pData); ++ JNU_CHECK_EXCEPTION_RETURN(env, (ColorData*)NULL); + (*env)->SetObjectField(env, bisdo->icm, colorDataID, colorData); + } + } +--- ./jdk/src/share/native/sun/awt/image/DataBufferNative.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/image/DataBufferNative.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -74,6 +74,7 @@ + SurfaceDataOps *ops; + + ops = SurfaceData_GetOps(env, sd); ++ JNU_CHECK_EXCEPTION_RETURN(env, -1); + + if (!(pixelPtr = DBN_GetPixelPointer(env, x, y, &lockInfo, + ops, SD_LOCK_READ))) +@@ -115,6 +116,7 @@ + + + ops = SurfaceData_GetOps(env, sd); ++ JNU_CHECK_EXCEPTION(env); + + if (!(pixelPtr = DBN_GetPixelPointer(env, x, y, &lockInfo, + ops, SD_LOCK_WRITE))) +--- ./jdk/src/share/native/sun/awt/image/awt_ImageRep.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/image/awt_ImageRep.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -97,9 +97,9 @@ + + JNIEXPORT void JNICALL + Java_sun_awt_image_ImageRepresentation_initIDs(JNIEnv *env, jclass cls) { +- s_JnumSrcLUTID = (*env)->GetFieldID(env, cls, "numSrcLUT", "I"); +- s_JsrcLUTtransIndexID = (*env)->GetFieldID(env, cls, "srcLUTtransIndex", +- "I"); ++ CHECK_NULL(s_JnumSrcLUTID = (*env)->GetFieldID(env, cls, "numSrcLUT", "I")); ++ CHECK_NULL(s_JsrcLUTtransIndexID = (*env)->GetFieldID(env, cls, ++ "srcLUTtransIndex", "I")); + } + + /* +@@ -166,6 +166,7 @@ + + cOffs = (int *) (*env)->GetPrimitiveArrayCritical(env, joffs, NULL); + if (cOffs == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowNullPointerException(env, "Null channel offset array"); + return JNI_FALSE; + } +@@ -190,6 +191,7 @@ + + srcLUT = (int *) (*env)->GetPrimitiveArrayCritical(env, jlut, NULL); + if (srcLUT == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowNullPointerException(env, "Null IndexColorModel LUT"); + return JNI_FALSE; + } +@@ -198,6 +200,7 @@ + NULL); + if (srcData == NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT); ++ (*env)->ExceptionClear(env); + JNU_ThrowNullPointerException(env, "Null data array"); + return JNI_FALSE; + } +@@ -206,6 +209,7 @@ + if (dstData == NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, jlut, srcLUT, JNI_ABORT); + (*env)->ReleasePrimitiveArrayCritical(env, jpix, srcData, JNI_ABORT); ++ (*env)->ExceptionClear(env); + JNU_ThrowNullPointerException(env, "Null tile data array"); + return JNI_FALSE; + } +--- ./jdk/src/share/native/sun/awt/image/awt_parseImage.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/image/awt_parseImage.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -182,6 +182,11 @@ + int awt_parseRaster(JNIEnv *env, jobject jraster, RasterS_t *rasterP) { + jobject joffs = NULL; + /* int status;*/ ++ jclass singlePixelPackedSampleModelClass = NULL; ++ jclass integerComponentRasterClass = NULL; ++ jclass byteComponentRasterClass = NULL; ++ jclass shortComponentRasterClass = NULL; ++ jclass bytePackedRasterClass = NULL; + + if (JNU_IsNull(env, jraster)) { + JNU_ThrowNullPointerException(env, "null Raster object"); +@@ -226,8 +231,11 @@ + + rasterP->sppsm.isUsed = 0; + ++ singlePixelPackedSampleModelClass = (*env)->FindClass(env, ++ "java/awt/image/SinglePixelPackedSampleModel"); ++ CHECK_NULL_RETURN(singlePixelPackedSampleModelClass, -1); + if ((*env)->IsInstanceOf(env, rasterP->jsampleModel, +- (*env)->FindClass(env,"java/awt/image/SinglePixelPackedSampleModel"))) { ++ singlePixelPackedSampleModelClass)) { + jobject jmask, joffs, jnbits; + + rasterP->sppsm.isUsed = 1; +@@ -261,8 +269,15 @@ + rasterP->jsampleModel, + g_SMHeightID); + +- if ((*env)->IsInstanceOf(env, jraster, +- (*env)->FindClass(env, "sun/awt/image/IntegerComponentRaster"))){ ++ integerComponentRasterClass = (*env)->FindClass(env, "sun/awt/image/IntegerComponentRaster"); ++ CHECK_NULL_RETURN(integerComponentRasterClass, -1); ++ byteComponentRasterClass = (*env)->FindClass(env, "sun/awt/image/ByteComponentRaster"); ++ CHECK_NULL_RETURN(byteComponentRasterClass, -1); ++ shortComponentRasterClass = (*env)->FindClass(env,"sun/awt/image/ShortComponentRaster"); ++ CHECK_NULL_RETURN(shortComponentRasterClass, -1); ++ bytePackedRasterClass = (*env)->FindClass(env, "sun/awt/image/BytePackedRaster"); ++ CHECK_NULL_RETURN(bytePackedRasterClass, -1); ++ if ((*env)->IsInstanceOf(env, jraster, integerComponentRasterClass)){ + rasterP->jdata = (*env)->GetObjectField(env, jraster, g_ICRdataID); + rasterP->dataType = INT_DATA_TYPE; + rasterP->dataSize = 4; +@@ -273,8 +288,7 @@ + rasterP->pixelStride = (*env)->GetIntField(env, jraster, g_ICRpixstrID); + joffs = (*env)->GetObjectField(env, jraster, g_ICRdataOffsetsID); + } +- else if ((*env)->IsInstanceOf(env, jraster, +- (*env)->FindClass(env, "sun/awt/image/ByteComponentRaster"))){ ++ else if ((*env)->IsInstanceOf(env, jraster, byteComponentRasterClass)){ + rasterP->jdata = (*env)->GetObjectField(env, jraster, g_BCRdataID); + rasterP->dataType = BYTE_DATA_TYPE; + rasterP->dataSize = 1; +@@ -285,8 +299,7 @@ + rasterP->pixelStride = (*env)->GetIntField(env, jraster, g_BCRpixstrID); + joffs = (*env)->GetObjectField(env, jraster, g_BCRdataOffsetsID); + } +- else if ((*env)->IsInstanceOf(env, jraster, +- (*env)->FindClass(env, "sun/awt/image/ShortComponentRaster"))){ ++ else if ((*env)->IsInstanceOf(env, jraster, shortComponentRasterClass)){ + rasterP->jdata = (*env)->GetObjectField(env, jraster, g_SCRdataID); + rasterP->dataType = SHORT_DATA_TYPE; + rasterP->dataSize = 2; +@@ -297,8 +310,7 @@ + rasterP->pixelStride = (*env)->GetIntField(env, jraster, g_SCRpixstrID); + joffs = (*env)->GetObjectField(env, jraster, g_SCRdataOffsetsID); + } +- else if ((*env)->IsInstanceOf(env, jraster, +- (*env)->FindClass(env, "sun/awt/image/BytePackedRaster"))){ ++ else if ((*env)->IsInstanceOf(env, jraster, bytePackedRasterClass)){ + rasterP->rasterType = PACKED_RASTER_TYPE; + rasterP->dataType = BYTE_DATA_TYPE; + rasterP->dataSize = 1; +@@ -397,30 +409,41 @@ + } + + static int getColorModelType(JNIEnv *env, jobject jcmodel) { +- int type = UNKNOWN_CM_TYPE; ++ jclass colorModelClass; + +- if ((*env)->IsInstanceOf(env, jcmodel, +- (*env)->FindClass(env, "java/awt/image/IndexColorModel"))) ++ colorModelClass = (*env)->FindClass(env, ++ "java/awt/image/IndexColorModel"); ++ CHECK_NULL_RETURN(colorModelClass, UNKNOWN_CM_TYPE); ++ ++ if ((*env)->IsInstanceOf(env, jcmodel, colorModelClass)) + { +- type = INDEX_CM_TYPE; +- } else if ((*env)->IsInstanceOf(env, jcmodel, +- (*env)->FindClass(env, "java/awt/image/PackedColorModel"))) ++ return INDEX_CM_TYPE; ++ } ++ ++ colorModelClass = (*env)->FindClass(env, ++ "java/awt/image/PackedColorModel"); ++ CHECK_NULL_RETURN(colorModelClass, UNKNOWN_CM_TYPE); ++ if ((*env)->IsInstanceOf(env, jcmodel, colorModelClass)) + { +- if ((*env)->IsInstanceOf(env, jcmodel, +- (*env)->FindClass(env, "java/awt/image/DirectColorModel"))) { +- type = DIRECT_CM_TYPE; ++ colorModelClass = (*env)->FindClass(env, ++ "java/awt/image/DirectColorModel"); ++ CHECK_NULL_RETURN(colorModelClass, UNKNOWN_CM_TYPE); ++ if ((*env)->IsInstanceOf(env, jcmodel, colorModelClass)) { ++ return DIRECT_CM_TYPE; + } + else { +- type = PACKED_CM_TYPE; ++ return PACKED_CM_TYPE; + } + } +- else if ((*env)->IsInstanceOf(env, jcmodel, +- (*env)->FindClass(env, "java/awt/image/ComponentColorModel"))) ++ colorModelClass = (*env)->FindClass(env, ++ "java/awt/image/ComponentColorModel"); ++ CHECK_NULL_RETURN(colorModelClass, UNKNOWN_CM_TYPE); ++ if ((*env)->IsInstanceOf(env, jcmodel, colorModelClass)) + { +- type = COMPONENT_CM_TYPE; ++ return COMPONENT_CM_TYPE; + } + +- return type; ++ return UNKNOWN_CM_TYPE; + } + + int awt_parseColorModel (JNIEnv *env, jobject jcmodel, int imageType, +@@ -506,12 +529,13 @@ + if (s_jdefCM == NULL) { + jobject defCM; + jclass jcm = (*env)->FindClass(env, "java/awt/image/ColorModel"); ++ CHECK_NULL_RETURN(jcm, -1); + defCM = (*env)->CallStaticObjectMethod(env, jcm, + g_CMgetRGBdefaultMID, NULL); + s_jdefCM = (*env)->NewGlobalRef(env, defCM); + if (defCM == NULL || s_jdefCM == NULL) { +- JNU_ThrowNullPointerException(env, +- "Unable to find default CM"); ++ (*env)->ExceptionClear(env); ++ JNU_ThrowNullPointerException(env, "Unable to find default CM"); + return -1; + } + } +@@ -931,6 +955,7 @@ + + jdata = (*env)->NewIntArray(env, maxSamples); + if (JNU_IsNull(env, jdata)) { ++ (*env)->ExceptionClear(env); + JNU_ThrowOutOfMemoryError(env, "Out of Memory"); + return -1; + } +@@ -1028,6 +1053,7 @@ + + jdata = (*env)->NewIntArray(env, maxSamples); + if (JNU_IsNull(env, jdata)) { ++ (*env)->ExceptionClear(env); + JNU_ThrowOutOfMemoryError(env, "Out of Memory"); + return -1; + } +--- ./jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -104,12 +104,12 @@ + JNIEXPORT void JNICALL + Java_sun_awt_image_GifImageDecoder_initIDs(JNIEnv *env, jclass this) + { +- readID = (*env)->GetMethodID(env, this, "readBytes", "([BII)I"); +- sendID = (*env)->GetMethodID(env, this, "sendPixels", +- "(IIII[BLjava/awt/image/ColorModel;)I"); +- prefixID = (*env)->GetFieldID(env, this, "prefix", "[S"); +- suffixID = (*env)->GetFieldID(env, this, "suffix", "[B"); +- outCodeID = (*env)->GetFieldID(env, this, "outCode", "[B"); ++ CHECK_NULL(readID = (*env)->GetMethodID(env, this, "readBytes", "([BII)I")); ++ CHECK_NULL(sendID = (*env)->GetMethodID(env, this, "sendPixels", ++ "(IIII[BLjava/awt/image/ColorModel;)I")); ++ CHECK_NULL(prefixID = (*env)->GetFieldID(env, this, "prefix", "[S")); ++ CHECK_NULL(suffixID = (*env)->GetFieldID(env, this, "suffix", "[B")); ++ CHECK_NULL(outCodeID = (*env)->GetFieldID(env, this, "outCode", "[B")); + } + + JNIEXPORT jboolean JNICALL +@@ -292,8 +292,10 @@ + * reads the immediately subsequent code as uncompressed data. + */ + if (verbose) { ++ RELEASE_ARRAYS(); + fprintf(stdout, "."); + fflush(stdout); ++ GET_ARRAYS(); + } + + /* Note that freeCode is one less than it is supposed to be, +@@ -319,10 +321,10 @@ + /* make sure we read the whole block of pixels. */ + flushit: + while (!blockEnd) { ++ RELEASE_ARRAYS(); + if (verbose) { + fprintf(stdout, "flushing %d bytes\n", blockLength); + } +- RELEASE_ARRAYS(); + if ((*env)->CallIntMethod(env, this, readID, + blockh, 0, blockLength + 1) != 0 + || (*env)->ExceptionOccurred(env)) +--- ./jdk/src/share/native/sun/awt/image/imageInitIDs.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/image/imageInitIDs.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 1998, 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 +@@ -29,211 +29,139 @@ + + JNIEXPORT void JNICALL + Java_java_awt_image_BufferedImage_initIDs(JNIEnv *env, jclass cls) { +- g_BImgRasterID = (*env)->GetFieldID(env, cls, "raster", +- "Ljava/awt/image/WritableRaster;"); +- g_BImgTypeID = (*env)->GetFieldID(env, cls, "imageType", "I"); +- g_BImgCMID = (*env)->GetFieldID(env, cls, "colorModel", +- "Ljava/awt/image/ColorModel;"); +- g_BImgGetRGBMID = (*env)->GetMethodID(env, cls, "getRGB", +- "(IIII[III)[I"); +- g_BImgSetRGBMID = (*env)->GetMethodID(env, cls, "setRGB", +- "(IIII[III)V"); +- if (g_BImgRasterID == NULL || g_BImgTypeID == NULL || g_BImgCMID == NULL +- || g_BImgGetRGBMID == NULL) { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_BImgRasterID = (*env)->GetFieldID(env, cls, "raster", ++ "Ljava/awt/image/WritableRaster;")); ++ CHECK_NULL(g_BImgTypeID = (*env)->GetFieldID(env, cls, "imageType", "I")); ++ CHECK_NULL(g_BImgCMID = (*env)->GetFieldID(env, cls, "colorModel", ++ "Ljava/awt/image/ColorModel;")); ++ CHECK_NULL(g_BImgGetRGBMID = (*env)->GetMethodID(env, cls, "getRGB", ++ "(IIII[III)[I")); ++ CHECK_NULL(g_BImgSetRGBMID = (*env)->GetMethodID(env, cls, "setRGB", ++ "(IIII[III)V")); + } + + JNIEXPORT void JNICALL + Java_java_awt_image_Raster_initIDs(JNIEnv *env, jclass cls) { +- g_RasterWidthID = (*env)->GetFieldID(env, cls, "width", "I"); +- g_RasterHeightID = (*env)->GetFieldID(env, cls, "height", "I"); +- g_RasterNumBandsID = (*env)->GetFieldID(env, cls, "numBands", "I"); +- g_RasterGetDataMID = (*env)->GetMethodID(env, cls, "getDataElements", +- "(IIIILjava/lang/Object;)Ljava/lang/Object;"); +- g_RasterMinXID = (*env)->GetFieldID(env, cls, "minX", "I"); +- g_RasterMinYID = (*env)->GetFieldID(env, cls, "minY", "I"); +- g_RasterBaseOriginXID = (*env)->GetFieldID(env, cls, +- "sampleModelTranslateX", "I"); +- g_RasterBaseOriginYID = (*env)->GetFieldID(env, cls, +- "sampleModelTranslateY", "I"); +- g_RasterSampleModelID = (*env)->GetFieldID(env, cls, +- "sampleModel","Ljava/awt/image/SampleModel;"); +- g_RasterNumDataElementsID = (*env)->GetFieldID(env, cls, "numDataElements", +- "I"); +- g_RasterNumBandsID = (*env)->GetFieldID(env, cls, "numBands", "I"); +- g_RasterDataBufferID = (*env)->GetFieldID(env, cls, "dataBuffer", +- "Ljava/awt/image/DataBuffer;"); +- if (g_RasterWidthID == NULL || g_RasterHeightID == NULL +- || g_RasterNumBandsID == NULL || g_RasterGetDataMID == NULL +- || g_RasterMinXID == NULL || g_RasterMinYID == NULL +- || g_RasterBaseOriginXID == NULL || g_RasterBaseOriginYID == NULL +- || g_RasterSampleModelID == NULL || g_RasterNumDataElementsID == NULL +- || g_RasterNumBandsID == NULL || g_RasterDataBufferID == NULL) +- { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_RasterWidthID = (*env)->GetFieldID(env, cls, "width", "I")); ++ CHECK_NULL(g_RasterHeightID = (*env)->GetFieldID(env, cls, "height", "I")); ++ CHECK_NULL(g_RasterNumBandsID = (*env)->GetFieldID(env, cls, "numBands", "I")); ++ CHECK_NULL(g_RasterGetDataMID = (*env)->GetMethodID(env, cls, "getDataElements", ++ "(IIIILjava/lang/Object;)Ljava/lang/Object;")); ++ CHECK_NULL(g_RasterMinXID = (*env)->GetFieldID(env, cls, "minX", "I")); ++ CHECK_NULL(g_RasterMinYID = (*env)->GetFieldID(env, cls, "minY", "I")); ++ CHECK_NULL(g_RasterBaseOriginXID = (*env)->GetFieldID(env, cls, ++ "sampleModelTranslateX", "I")); ++ CHECK_NULL(g_RasterBaseOriginYID = (*env)->GetFieldID(env, cls, ++ "sampleModelTranslateY", "I")); ++ CHECK_NULL(g_RasterSampleModelID = (*env)->GetFieldID(env, cls, ++ "sampleModel","Ljava/awt/image/SampleModel;")); ++ CHECK_NULL(g_RasterNumDataElementsID = (*env)->GetFieldID(env, cls, ++ "numDataElements", "I")); ++ CHECK_NULL(g_RasterNumBandsID = (*env)->GetFieldID(env, cls, "numBands", "I")); ++ CHECK_NULL(g_RasterDataBufferID = (*env)->GetFieldID(env, cls, "dataBuffer", ++ "Ljava/awt/image/DataBuffer;")); + } + + JNIEXPORT void JNICALL + Java_sun_awt_image_ByteComponentRaster_initIDs(JNIEnv *env, jclass cls) { +- g_BCRdataID = (*env)->GetFieldID(env, cls, "data", "[B"); +- g_BCRscanstrID = (*env)->GetFieldID(env, cls, "scanlineStride", "I"); +- g_BCRpixstrID = (*env)->GetFieldID(env, cls, "pixelStride", "I"); +- g_BCRbandoffsID = (*env)->GetFieldID(env, cls, "bandOffset", "I"); +- g_BCRdataOffsetsID = (*env)->GetFieldID(env, cls, "dataOffsets", "[I"); +- g_BCRtypeID = (*env)->GetFieldID(env, cls, "type", "I"); +- if (g_BCRdataID == NULL || g_BCRscanstrID == NULL || +- g_BCRpixstrID == NULL || g_BCRbandoffsID == NULL || +- g_BCRtypeID == NULL) +- { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_BCRdataID = (*env)->GetFieldID(env, cls, "data", "[B")); ++ CHECK_NULL(g_BCRscanstrID = (*env)->GetFieldID(env, cls, "scanlineStride", "I")); ++ CHECK_NULL(g_BCRpixstrID = (*env)->GetFieldID(env, cls, "pixelStride", "I")); ++ CHECK_NULL(g_BCRbandoffsID = (*env)->GetFieldID(env, cls, "bandOffset", "I")); ++ CHECK_NULL(g_BCRdataOffsetsID = (*env)->GetFieldID(env, cls, "dataOffsets", "[I")); ++ CHECK_NULL(g_BCRtypeID = (*env)->GetFieldID(env, cls, "type", "I")); + } + + JNIEXPORT void JNICALL + Java_sun_awt_image_BytePackedRaster_initIDs(JNIEnv *env, jclass cls) { +- g_BPRdataID = (*env)->GetFieldID(env, cls, "data", "[B"); +- g_BPRscanstrID = (*env)->GetFieldID(env, cls, "scanlineStride", "I"); +- g_BPRpixstrID = (*env)->GetFieldID(env, cls, "pixelBitStride", "I"); +- g_BPRtypeID = (*env)->GetFieldID(env, cls, "type", "I"); +- g_BPRdataBitOffsetID = (*env)->GetFieldID(env, cls, "dataBitOffset", "I"); +- if (g_BPRdataID == NULL || g_BPRscanstrID == NULL || +- g_BPRpixstrID == NULL || g_BPRtypeID == NULL) +- { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_BPRdataID = (*env)->GetFieldID(env, cls, "data", "[B")); ++ CHECK_NULL(g_BPRscanstrID = (*env)->GetFieldID(env, cls, "scanlineStride", "I")); ++ CHECK_NULL(g_BPRpixstrID = (*env)->GetFieldID(env, cls, "pixelBitStride", "I")); ++ CHECK_NULL(g_BPRtypeID = (*env)->GetFieldID(env, cls, "type", "I")); ++ CHECK_NULL(g_BPRdataBitOffsetID = (*env)->GetFieldID(env, cls, "dataBitOffset", "I")); + } + + JNIEXPORT void JNICALL + Java_sun_awt_image_ShortComponentRaster_initIDs(JNIEnv *env, jclass cls) { +- g_SCRdataID = (*env)->GetFieldID(env, cls, "data", "[S"); +- g_SCRscanstrID = (*env)->GetFieldID(env, cls, "scanlineStride", "I"); +- g_SCRpixstrID = (*env)->GetFieldID(env, cls, "pixelStride", "I"); +- g_SCRbandoffsID = (*env)->GetFieldID(env, cls, "bandOffset", "I"); +- g_SCRdataOffsetsID = (*env)->GetFieldID(env, cls, "dataOffsets", "[I"); +- g_SCRtypeID = (*env)->GetFieldID(env, cls, "type", "I"); +- if (g_SCRdataID == NULL || g_SCRscanstrID == NULL || +- g_SCRpixstrID == NULL || g_SCRbandoffsID == NULL || +- g_SCRdataOffsetsID == NULL || g_SCRtypeID == NULL) +- { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_SCRdataID = (*env)->GetFieldID(env, cls, "data", "[S")); ++ CHECK_NULL(g_SCRscanstrID = (*env)->GetFieldID(env, cls, "scanlineStride", "I")); ++ CHECK_NULL(g_SCRpixstrID = (*env)->GetFieldID(env, cls, "pixelStride", "I")); ++ CHECK_NULL(g_SCRbandoffsID = (*env)->GetFieldID(env, cls, "bandOffset", "I")); ++ CHECK_NULL(g_SCRdataOffsetsID = (*env)->GetFieldID(env, cls, "dataOffsets", "[I")); ++ CHECK_NULL(g_SCRtypeID = (*env)->GetFieldID(env, cls, "type", "I")); + } + JNIEXPORT void JNICALL + Java_sun_awt_image_IntegerComponentRaster_initIDs(JNIEnv *env, jclass cls) { +- g_ICRdataID = (*env)->GetFieldID(env, cls, "data", "[I"); +- g_ICRscanstrID = (*env)->GetFieldID(env, cls, "scanlineStride", "I"); +- g_ICRpixstrID = (*env)->GetFieldID(env, cls, "pixelStride", "I"); +- g_ICRdataOffsetsID = (*env)->GetFieldID(env, cls, "dataOffsets", "[I"); +- g_ICRbandoffsID = (*env)->GetFieldID(env, cls, "bandOffset", "I"); +- g_ICRputDataMID = (*env)->GetMethodID(env, cls, "setDataElements", +- "(IIIILjava/lang/Object;)V"); +- g_ICRtypeID = (*env)->GetFieldID(env, cls, "type", "I"); +- if (g_ICRdataID == NULL || g_ICRscanstrID == NULL +- || g_ICRpixstrID == NULL || g_ICRbandoffsID == NULL +- || g_ICRputDataMID == NULL || g_ICRdataOffsetsID == NULL || g_ICRtypeID == NULL) +- { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_ICRdataID = (*env)->GetFieldID(env, cls, "data", "[I")); ++ CHECK_NULL(g_ICRscanstrID = (*env)->GetFieldID(env, cls, "scanlineStride", "I")); ++ CHECK_NULL(g_ICRpixstrID = (*env)->GetFieldID(env, cls, "pixelStride", "I")); ++ CHECK_NULL(g_ICRdataOffsetsID = (*env)->GetFieldID(env, cls, "dataOffsets", "[I")); ++ CHECK_NULL(g_ICRbandoffsID = (*env)->GetFieldID(env, cls, "bandOffset", "I")); ++ CHECK_NULL(g_ICRputDataMID = (*env)->GetMethodID(env, cls, "setDataElements", ++ "(IIIILjava/lang/Object;)V")); ++ CHECK_NULL(g_ICRtypeID = (*env)->GetFieldID(env, cls, "type", "I")); + } + + JNIEXPORT void JNICALL +-Java_java_awt_image_SinglePixelPackedSampleModel_initIDs(JNIEnv *env, +- jclass cls) { +- g_SPPSMmaskArrID = (*env)->GetFieldID(env, cls, "bitMasks", "[I"); +- g_SPPSMmaskOffID = (*env)->GetFieldID(env, cls, "bitOffsets", "[I"); +- g_SPPSMnBitsID = (*env)->GetFieldID(env, cls, "bitSizes", "[I"); +- g_SPPSMmaxBitID = (*env)->GetFieldID(env, cls, "maxBitSize", "I"); +- +- if (g_SPPSMmaskArrID == NULL || g_SPPSMmaskOffID == NULL || +- g_SPPSMnBitsID == NULL || g_SPPSMmaxBitID == NULL) { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++Java_java_awt_image_SinglePixelPackedSampleModel_initIDs(JNIEnv *env, jclass cls) { ++ CHECK_NULL(g_SPPSMmaskArrID = (*env)->GetFieldID(env, cls, "bitMasks", "[I")); ++ CHECK_NULL(g_SPPSMmaskOffID = (*env)->GetFieldID(env, cls, "bitOffsets", "[I")); ++ CHECK_NULL(g_SPPSMnBitsID = (*env)->GetFieldID(env, cls, "bitSizes", "[I")); ++ CHECK_NULL(g_SPPSMmaxBitID = (*env)->GetFieldID(env, cls, "maxBitSize", "I")); + } + + JNIEXPORT void JNICALL + Java_java_awt_image_ColorModel_initIDs(JNIEnv *env, jclass cls) { +- g_CMpDataID = (*env)->GetFieldID (env, cls, "pData", "J"); +- g_CMnBitsID = (*env)->GetFieldID(env, cls, "nBits", "[I"); +- g_CMcspaceID = (*env)->GetFieldID(env, cls, "colorSpace", +- "Ljava/awt/color/ColorSpace;"); +- g_CMnumComponentsID = (*env)->GetFieldID(env, cls, "numComponents", "I"); +- g_CMsuppAlphaID = (*env)->GetFieldID(env, cls, "supportsAlpha", "Z"); +- g_CMisAlphaPreID = (*env)->GetFieldID(env, cls, "isAlphaPremultiplied", +- "Z"); +- g_CMtransparencyID = (*env)->GetFieldID(env, cls, "transparency", "I"); +- g_CMgetRGBMID = (*env)->GetMethodID(env, cls, "getRGB", +- "(Ljava/lang/Object;)I"); +- g_CMcsTypeID = (*env)->GetFieldID(env, cls, "colorSpaceType", "I"); +- g_CMis_sRGBID = (*env)->GetFieldID(env, cls, "is_sRGB", "Z"); +- g_CMgetRGBdefaultMID = (*env)->GetStaticMethodID(env, cls, ++ CHECK_NULL(g_CMpDataID = (*env)->GetFieldID (env, cls, "pData", "J")); ++ CHECK_NULL(g_CMnBitsID = (*env)->GetFieldID(env, cls, "nBits", "[I")); ++ CHECK_NULL(g_CMcspaceID = (*env)->GetFieldID(env, cls, "colorSpace", ++ "Ljava/awt/color/ColorSpace;")); ++ CHECK_NULL(g_CMnumComponentsID = (*env)->GetFieldID(env, cls, "numComponents", "I")); ++ CHECK_NULL(g_CMsuppAlphaID = (*env)->GetFieldID(env, cls, "supportsAlpha", "Z")); ++ CHECK_NULL(g_CMisAlphaPreID = (*env)->GetFieldID(env, cls, "isAlphaPremultiplied", ++ "Z")); ++ CHECK_NULL(g_CMtransparencyID = (*env)->GetFieldID(env, cls, "transparency", "I")); ++ CHECK_NULL(g_CMgetRGBMID = (*env)->GetMethodID(env, cls, "getRGB", ++ "(Ljava/lang/Object;)I")); ++ CHECK_NULL(g_CMcsTypeID = (*env)->GetFieldID(env, cls, "colorSpaceType", "I")); ++ CHECK_NULL(g_CMis_sRGBID = (*env)->GetFieldID(env, cls, "is_sRGB", "Z")); ++ CHECK_NULL(g_CMgetRGBdefaultMID = (*env)->GetStaticMethodID(env, cls, + "getRGBdefault", +- "()Ljava/awt/image/ColorModel;"); +- if (g_CMnBitsID == NULL || g_CMcspaceID == NULL +- || g_CMnumComponentsID == NULL || g_CMsuppAlphaID == NULL +- || g_CMisAlphaPreID == NULL || g_CMtransparencyID == NULL +- || g_CMgetRGBMID == NULL || g_CMgetRGBMID == NULL +- || g_CMis_sRGBID == NULL || g_CMgetRGBdefaultMID == NULL +- || g_CMpDataID == NULL) +- { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ "()Ljava/awt/image/ColorModel;")); + } + + JNIEXPORT void JNICALL + Java_java_awt_image_IndexColorModel_initIDs(JNIEnv *env, jclass cls) { +- g_ICMtransIdxID = (*env)->GetFieldID(env, cls, "transparent_index", "I"); +- g_ICMmapSizeID = (*env)->GetFieldID(env, cls, "map_size", "I"); +- g_ICMrgbID = (*env)->GetFieldID(env, cls, "rgb", "[I"); +- if (g_ICMtransIdxID == NULL || g_ICMmapSizeID == NULL +- || g_ICMrgbID == NULL) { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_ICMtransIdxID = (*env)->GetFieldID(env, cls, "transparent_index", "I")); ++ CHECK_NULL(g_ICMmapSizeID = (*env)->GetFieldID(env, cls, "map_size", "I")); ++ CHECK_NULL(g_ICMrgbID = (*env)->GetFieldID(env, cls, "rgb", "[I")); + } + + JNIEXPORT void JNICALL + Java_java_awt_image_SampleModel_initIDs(JNIEnv *env, jclass cls) { +- g_SMWidthID = (*env)->GetFieldID(env, cls, "width","I"); +- g_SMHeightID = (*env)->GetFieldID(env, cls, "height","I"); +- g_SMGetPixelsMID = (*env)->GetMethodID(env, cls, "getPixels", +- "(IIII[ILjava/awt/image/DataBuffer;)[I"); +- g_SMSetPixelsMID = (*env)->GetMethodID(env, cls, "setPixels", +- "(IIII[ILjava/awt/image/DataBuffer;)V"); +- if (g_SMWidthID == NULL || g_SMHeightID == NULL || g_SMGetPixelsMID == NULL +- || g_SMSetPixelsMID == NULL) { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_SMWidthID = (*env)->GetFieldID(env, cls, "width","I")); ++ CHECK_NULL(g_SMHeightID = (*env)->GetFieldID(env, cls, "height","I")); ++ CHECK_NULL(g_SMGetPixelsMID = (*env)->GetMethodID(env, cls, "getPixels", ++ "(IIII[ILjava/awt/image/DataBuffer;)[I")); ++ CHECK_NULL(g_SMSetPixelsMID = (*env)->GetMethodID(env, cls, "setPixels", ++ "(IIII[ILjava/awt/image/DataBuffer;)V")); + } + + JNIEXPORT void JNICALL + Java_java_awt_image_ComponentSampleModel_initIDs(JNIEnv *env, jclass cls) { +- g_CSMPixStrideID = (*env)->GetFieldID(env, cls, "pixelStride", "I"); +- g_CSMScanStrideID = (*env)->GetFieldID(env, cls, "scanlineStride", "I"); +- g_CSMBandOffsetsID = (*env)->GetFieldID(env, cls, "bandOffsets", "[I"); +- if (g_CSMPixStrideID == NULL || g_CSMScanStrideID == NULL || +- g_CSMBandOffsetsID == NULL) { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_CSMPixStrideID = (*env)->GetFieldID(env, cls, "pixelStride", "I")); ++ CHECK_NULL(g_CSMScanStrideID = (*env)->GetFieldID(env, cls, "scanlineStride", "I")); ++ CHECK_NULL(g_CSMBandOffsetsID = (*env)->GetFieldID(env, cls, "bandOffsets", "[I")); + } + + JNIEXPORT void JNICALL + Java_java_awt_image_Kernel_initIDs(JNIEnv *env, jclass cls) { +- g_KernelWidthID = (*env)->GetFieldID(env, cls, "width", "I"); +- g_KernelHeightID = (*env)->GetFieldID(env, cls, "height", "I"); +- g_KernelDataID = (*env)->GetFieldID(env, cls, "data", "[F"); +- if (g_KernelWidthID == NULL || g_KernelHeightID == NULL +- || g_KernelDataID == NULL) +- { +- JNU_ThrowNullPointerException(env, "Unable to grab field ids"); +- } ++ CHECK_NULL(g_KernelWidthID = (*env)->GetFieldID(env, cls, "width", "I")); ++ CHECK_NULL(g_KernelHeightID = (*env)->GetFieldID(env, cls, "height", "I")); ++ CHECK_NULL(g_KernelDataID = (*env)->GetFieldID(env, cls, "data", "[F")); + } + + JNIEXPORT void JNICALL + Java_java_awt_image_DataBufferInt_initIDs(JNIEnv *env, jclass cls) { +- g_DataBufferIntPdataID = (*env)->GetFieldID(env, cls, "pData", "J"); +- if (g_DataBufferIntPdataID == NULL) { +- JNU_ThrowNullPointerException(env, "Unable to grab DataBufferInt.pData"); +- return; +- } ++ CHECK_NULL(g_DataBufferIntPdataID = (*env)->GetFieldID(env, cls, "pData", "J")); + } +--- ./jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -153,6 +153,7 @@ + /* Initialize a new buffer */ + jbyteArray hInputBuffer = (*env)->NewByteArray(env, STREAMBUF_SIZE); + if (hInputBuffer == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowByName( env, + "java/lang/OutOfMemoryError", + "Initializing Reader"); +@@ -557,6 +558,7 @@ + + // Create a new java string from the message + string = (*env)->NewStringUTF(env, buffer); ++ CHECK_NULL(string); + + theObject = data->imageIOobj; + +@@ -591,12 +593,7 @@ + /* Now we need a new weak global reference for the I/O provider */ + if (io != NULL) { // Fix for 4411955 + sb->ioRef = (*env)->NewWeakGlobalRef(env, io); +- if (sb->ioRef == NULL) { +- JNU_ThrowByName(env, +- "java/lang/OutOfMemoryError", +- "Setting I/O provider"); +- return; +- } ++ CHECK_NULL(sb->ioRef); + } + + /* And finally reset state */ +@@ -693,6 +690,7 @@ + } + for (i = 0; i < qlen; i++) { + table = (*env)->GetObjectArrayElement(env, qtables, i); ++ CHECK_NULL_RETURN(table, 0); + qdata = (*env)->GetObjectField(env, table, JPEGQTable_tableID); + qdataBody = (*env)->GetPrimitiveArrayCritical(env, qdata, NULL); + +@@ -724,7 +722,7 @@ + return qlen; + } + +-static void setHuffTable(JNIEnv *env, ++static boolean setHuffTable(JNIEnv *env, + JHUFF_TBL *huff_ptr, + jobject table) { + +@@ -742,6 +740,8 @@ + hlensBody = (*env)->GetShortArrayElements(env, + huffLens, + NULL); ++ CHECK_NULL_RETURN(hlensBody, FALSE); ++ + if (hlensLen > 16) { + /* Ignore extra elements of bits array. Only 16 elements can be + stored. 0-th element is not used. (see jpeglib.h, line 107) */ +@@ -762,6 +762,7 @@ + hvalsBody = (*env)->GetShortArrayElements(env, + huffValues, + NULL); ++ CHECK_NULL_RETURN(hvalsBody, FALSE); + + if (hvalsLen > 256) { + /* Ignore extra elements of hufval array. Only 256 elements +@@ -775,6 +776,7 @@ + huffValues, + hvalsBody, + JNI_ABORT); ++ return TRUE; + } + + static int setHTables(JNIEnv *env, +@@ -810,7 +812,9 @@ + huff_ptr = comp->dc_huff_tbl_ptrs[i]; + } + table = (*env)->GetObjectArrayElement(env, DCHuffmanTables, i); +- setHuffTable(env, huff_ptr, table); ++ if (table == NULL || !setHuffTable(env, huff_ptr, table)) { ++ return 0; ++ } + huff_ptr->sent_table = !write; + } + hlen = (*env)->GetArrayLength(env, ACHuffmanTables); +@@ -835,7 +839,9 @@ + huff_ptr = comp->ac_huff_tbl_ptrs[i]; + } + table = (*env)->GetObjectArrayElement(env, ACHuffmanTables, i); +- setHuffTable(env, huff_ptr, table); ++ if(table == NULL || !setHuffTable(env, huff_ptr, table)) { ++ return 0; ++ } + huff_ptr->sent_table = !write; + } + return hlen; +@@ -1409,57 +1415,57 @@ + jclass qTableClass, + jclass huffClass) { + +- JPEGImageReader_readInputDataID = (*env)->GetMethodID(env, ++ CHECK_NULL(JPEGImageReader_readInputDataID = (*env)->GetMethodID(env, + cls, + "readInputData", +- "([BII)I"); +- JPEGImageReader_skipInputBytesID = (*env)->GetMethodID(env, ++ "([BII)I")); ++ CHECK_NULL(JPEGImageReader_skipInputBytesID = (*env)->GetMethodID(env, + cls, + "skipInputBytes", +- "(J)J"); +- JPEGImageReader_warningOccurredID = (*env)->GetMethodID(env, ++ "(J)J")); ++ CHECK_NULL(JPEGImageReader_warningOccurredID = (*env)->GetMethodID(env, + cls, + "warningOccurred", +- "(I)V"); +- JPEGImageReader_warningWithMessageID = ++ "(I)V")); ++ CHECK_NULL(JPEGImageReader_warningWithMessageID = + (*env)->GetMethodID(env, + cls, + "warningWithMessage", +- "(Ljava/lang/String;)V"); +- JPEGImageReader_setImageDataID = (*env)->GetMethodID(env, ++ "(Ljava/lang/String;)V")); ++ CHECK_NULL(JPEGImageReader_setImageDataID = (*env)->GetMethodID(env, + cls, + "setImageData", +- "(IIIII[B)V"); +- JPEGImageReader_acceptPixelsID = (*env)->GetMethodID(env, ++ "(IIIII[B)V")); ++ CHECK_NULL(JPEGImageReader_acceptPixelsID = (*env)->GetMethodID(env, + cls, + "acceptPixels", +- "(IZ)V"); +- JPEGImageReader_passStartedID = (*env)->GetMethodID(env, ++ "(IZ)V")); ++ CHECK_NULL(JPEGImageReader_passStartedID = (*env)->GetMethodID(env, + cls, + "passStarted", +- "(I)V"); +- JPEGImageReader_passCompleteID = (*env)->GetMethodID(env, ++ "(I)V")); ++ CHECK_NULL(JPEGImageReader_passCompleteID = (*env)->GetMethodID(env, + cls, + "passComplete", +- "()V"); +- JPEGImageReader_pushBackID = (*env)->GetMethodID(env, ++ "()V")); ++ CHECK_NULL(JPEGImageReader_pushBackID = (*env)->GetMethodID(env, + cls, + "pushBack", +- "(I)V"); +- JPEGQTable_tableID = (*env)->GetFieldID(env, ++ "(I)V")); ++ CHECK_NULL(JPEGQTable_tableID = (*env)->GetFieldID(env, + qTableClass, + "qTable", +- "[I"); +- +- JPEGHuffmanTable_lengthsID = (*env)->GetFieldID(env, ++ "[I")); ++ ++ CHECK_NULL(JPEGHuffmanTable_lengthsID = (*env)->GetFieldID(env, + huffClass, + "lengths", +- "[S"); +- +- JPEGHuffmanTable_valuesID = (*env)->GetFieldID(env, ++ "[S")); ++ ++ CHECK_NULL(JPEGHuffmanTable_valuesID = (*env)->GetFieldID(env, + huffClass, + "values", +- "[S"); ++ "[S")); + } + + JNIEXPORT jlong JNICALL +@@ -1540,9 +1546,9 @@ + /* set up the association to persist for future calls */ + ret = initImageioData(env, (j_common_ptr) cinfo, this); + if (ret == NULL) { +- JNU_ThrowByName( env, +- "java/lang/OutOfMemoryError", +- "Initializing Reader"); ++ (*env)->ExceptionClear(env); ++ JNU_ThrowByName(env, "java/lang/OutOfMemoryError", ++ "Initializing Reader"); + imageio_dispose((j_common_ptr)cinfo); + return 0; + } +@@ -1637,6 +1643,7 @@ + #endif + + if (GET_ARRAYS(env, data, &src->next_input_byte) == NOT_OK) { ++ (*env)->ExceptionClear(env); + JNU_ThrowByName(env, + "javax/imageio/IIOException", + "Array pin failed"); +@@ -1900,6 +1907,7 @@ + + body = (*env)->GetIntArrayElements(env, srcBands, NULL); + if (body == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowByName( env, + "java/lang/OutOfMemoryError", + "Initializing Read"); +@@ -1958,6 +1966,7 @@ + } + + if (GET_ARRAYS(env, data, &src->next_input_byte) == NOT_OK) { ++ (*env)->ExceptionClear(env); + JNU_ThrowByName(env, + "javax/imageio/IIOException", + "Array pin failed"); +@@ -2403,44 +2412,39 @@ + jclass qTableClass, + jclass huffClass) { + +- JPEGImageWriter_writeOutputDataID = (*env)->GetMethodID(env, ++ CHECK_NULL(JPEGImageWriter_writeOutputDataID = (*env)->GetMethodID(env, + cls, + "writeOutputData", +- "([BII)V"); +- +- JPEGImageWriter_warningOccurredID = (*env)->GetMethodID(env, ++ "([BII)V")); ++ CHECK_NULL(JPEGImageWriter_warningOccurredID = (*env)->GetMethodID(env, + cls, + "warningOccurred", +- "(I)V"); +- JPEGImageWriter_warningWithMessageID = +- (*env)->GetMethodID(env, +- cls, +- "warningWithMessage", +- "(Ljava/lang/String;)V"); +- +- JPEGImageWriter_writeMetadataID = (*env)->GetMethodID(env, ++ "(I)V")); ++ CHECK_NULL(JPEGImageWriter_warningWithMessageID = ++ (*env)->GetMethodID(env, ++ cls, ++ "warningWithMessage", ++ "(Ljava/lang/String;)V")); ++ CHECK_NULL(JPEGImageWriter_writeMetadataID = (*env)->GetMethodID(env, + cls, + "writeMetadata", +- "()V"); +- JPEGImageWriter_grabPixelsID = (*env)->GetMethodID(env, ++ "()V")); ++ CHECK_NULL(JPEGImageWriter_grabPixelsID = (*env)->GetMethodID(env, + cls, + "grabPixels", +- "(I)V"); +- +- JPEGQTable_tableID = (*env)->GetFieldID(env, ++ "(I)V")); ++ CHECK_NULL(JPEGQTable_tableID = (*env)->GetFieldID(env, + qTableClass, + "qTable", +- "[I"); +- +- JPEGHuffmanTable_lengthsID = (*env)->GetFieldID(env, ++ "[I")); ++ CHECK_NULL(JPEGHuffmanTable_lengthsID = (*env)->GetFieldID(env, + huffClass, + "lengths", +- "[S"); +- +- JPEGHuffmanTable_valuesID = (*env)->GetFieldID(env, ++ "[S")); ++ CHECK_NULL(JPEGHuffmanTable_valuesID = (*env)->GetFieldID(env, + huffClass, + "values", +- "[S"); ++ "[S")); + } + + JNIEXPORT jlong JNICALL +@@ -2516,6 +2520,7 @@ + /* set up the association to persist for future calls */ + ret = initImageioData(env, (j_common_ptr) cinfo, this); + if (ret == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowByName( env, + "java/lang/OutOfMemoryError", + "Initializing Writer"); +@@ -2593,6 +2598,7 @@ + + if (GET_ARRAYS(env, data, + (const JOCTET **)(&dest->next_output_byte)) == NOT_OK) { ++ (*env)->ExceptionClear(env); + JNU_ThrowByName(env, + "javax/imageio/IIOException", + "Array pin failed"); +@@ -2664,6 +2670,7 @@ + imageIODataPtr data = (imageIODataPtr)jlong_to_ptr(ptr); + j_compress_ptr cinfo; + UINT8** scale = NULL; ++ boolean success = TRUE; + + + /* verify the inputs */ +@@ -2708,13 +2715,14 @@ + } + + bandSize = (*env)->GetIntArrayElements(env, bandSizes, NULL); ++ CHECK_NULL_RETURN(bandSize, JNI_FALSE); + + for (i = 0; i < numBands; i++) { + if (bandSize[i] <= 0 || bandSize[i] > JPEG_BAND_SIZE) { + (*env)->ReleaseIntArrayElements(env, bandSizes, + bandSize, JNI_ABORT); + JNU_ThrowByName(env, "javax/imageio/IIOException", "Invalid Image"); +- return JNI_FALSE;; ++ return JNI_FALSE; + } + } + +@@ -2825,30 +2833,30 @@ + vfactors = (*env)->GetIntArrayElements(env, VsamplingFactors, NULL); + qsels = (*env)->GetIntArrayElements(env, QtableSelectors, NULL); + +- if ((ids == NULL) || +- (hfactors == NULL) || (vfactors == NULL) || +- (qsels == NULL)) { +- JNU_ThrowByName( env, +- "java/lang/OutOfMemoryError", +- "Writing JPEG"); +- return JNI_FALSE; ++ if (ids && hfactors && vfactors && qsels) { ++ for (i = 0; i < numBands; i++) { ++ cinfo->comp_info[i].component_id = ids[i]; ++ cinfo->comp_info[i].h_samp_factor = hfactors[i]; ++ cinfo->comp_info[i].v_samp_factor = vfactors[i]; ++ cinfo->comp_info[i].quant_tbl_no = qsels[i]; ++ } ++ } else { ++ success = FALSE; + } + +- for (i = 0; i < numBands; i++) { +- cinfo->comp_info[i].component_id = ids[i]; +- cinfo->comp_info[i].h_samp_factor = hfactors[i]; +- cinfo->comp_info[i].v_samp_factor = vfactors[i]; +- cinfo->comp_info[i].quant_tbl_no = qsels[i]; ++ if (ids) { ++ (*env)->ReleaseIntArrayElements(env, componentIds, ids, JNI_ABORT); + } +- +- (*env)->ReleaseIntArrayElements(env, componentIds, +- ids, JNI_ABORT); +- (*env)->ReleaseIntArrayElements(env, HsamplingFactors, +- hfactors, JNI_ABORT); +- (*env)->ReleaseIntArrayElements(env, VsamplingFactors, +- vfactors, JNI_ABORT); +- (*env)->ReleaseIntArrayElements(env, QtableSelectors, +- qsels, JNI_ABORT); ++ if (hfactors) { ++ (*env)->ReleaseIntArrayElements(env, HsamplingFactors, hfactors, JNI_ABORT); ++ } ++ if (vfactors) { ++ (*env)->ReleaseIntArrayElements(env, VsamplingFactors, vfactors, JNI_ABORT); ++ } ++ if (qsels) { ++ (*env)->ReleaseIntArrayElements(env, QtableSelectors, qsels, JNI_ABORT); ++ } ++ if (!success) return data->abortFlag; + + jpeg_suppress_tables(cinfo, TRUE); // Disable writing any current + +@@ -2865,6 +2873,7 @@ + + if (GET_ARRAYS(env, data, + (const JOCTET **)(&dest->next_output_byte)) == NOT_OK) { ++ (*env)->ExceptionClear(env); + JNU_ThrowByName(env, + "javax/imageio/IIOException", + "Array pin failed"); +@@ -2899,6 +2908,7 @@ + cinfo->scan_info = cinfo->script_space; + scanptr = (int *) cinfo->script_space; + scanData = (*env)->GetIntArrayElements(env, scanInfo, NULL); ++ CHECK_NULL_RETURN(scanData, data->abortFlag); + // number of jints per scan is 9 + // We avoid a memcpy to handle different size ints + for (i = 0; i < numScans*9; i++) { +--- ./jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -465,14 +465,14 @@ + Java_sun_awt_image_JPEGImageDecoder_initIDs(JNIEnv *env, jclass cls, + jclass InputStreamClass) + { +- sendHeaderInfoID = (*env)->GetMethodID(env, cls, "sendHeaderInfo", +- "(IIZZZ)Z"); +- sendPixelsByteID = (*env)->GetMethodID(env, cls, "sendPixels", "([BI)Z"); +- sendPixelsIntID = (*env)->GetMethodID(env, cls, "sendPixels", "([II)Z"); +- InputStream_readID = (*env)->GetMethodID(env, InputStreamClass, +- "read", "([BII)I"); +- InputStream_availableID = (*env)->GetMethodID(env, InputStreamClass, +- "available", "()I"); ++ CHECK_NULL(sendHeaderInfoID = (*env)->GetMethodID(env, cls, "sendHeaderInfo", ++ "(IIZZZ)Z")); ++ CHECK_NULL(sendPixelsByteID = (*env)->GetMethodID(env, cls, "sendPixels", "([BI)Z")); ++ CHECK_NULL(sendPixelsIntID = (*env)->GetMethodID(env, cls, "sendPixels", "([II)Z")); ++ CHECK_NULL(InputStream_readID = (*env)->GetMethodID(env, InputStreamClass, ++ "read", "([BII)I")); ++ CHECK_NULL(InputStream_availableID = (*env)->GetMethodID(env, InputStreamClass, ++ "available", "()I")); + } + + +--- ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1151,6 +1151,7 @@ + if (ddata == NULL) { + /* Need to store it back into the array */ + if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) { ++ (*env)->ExceptionClear(env); // Could not store the array, try another way + retStatus = setPixelsFormMlibImage(env, dstRasterP, dst); + } + } +@@ -2062,6 +2063,7 @@ + + jpixels = (*env)->NewIntArray(env, nbytes); + if (JNU_IsNull(env, jpixels)) { ++ (*env)->ExceptionClear(env); + JNU_ThrowOutOfMemoryError(env, "Out of Memory"); + return -1; + } +@@ -2127,6 +2129,7 @@ + + jpixels = (*env)->NewIntArray(env, nbytes); + if (JNU_IsNull(env, jpixels)) { ++ (*env)->ExceptionClear(env); + JNU_ThrowOutOfMemoryError(env, "Out of Memory"); + return -1; + } +@@ -2823,21 +2826,14 @@ + + /* Need to grab the lookup tables. Right now only bytes */ + rgb = (int *) (*env)->GetPrimitiveArrayCritical(env, cmP->jrgb, NULL); ++ CHECK_NULL_RETURN(rgb, -1); + + /* Interleaved with shared data */ + dataP = (void *) (*env)->GetPrimitiveArrayCritical(env, + rasterP->jdata, NULL); +- if (rgb == NULL || dataP == NULL) { ++ if (dataP == NULL) { + /* Release the lookup tables */ +- if (rgb) { +- (*env)->ReleasePrimitiveArrayCritical(env, cmP->jrgb, rgb, +- JNI_ABORT); +- } +- if (dataP) { +- (*env)->ReleasePrimitiveArrayCritical(env, +- rasterP->jdata, dataP, +- JNI_ABORT); +- } ++ (*env)->ReleasePrimitiveArrayCritical(env, cmP->jrgb, rgb, JNI_ABORT); + return -1; + } + +--- ./jdk/src/share/native/sun/awt/medialib/mlib_sys.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_sys.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 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 +@@ -86,10 +86,13 @@ + + void *__mlib_malloc(mlib_u32 size) + { +-#ifdef _MSC_VER ++#if defined(_MSC_VER) || defined(AIX) + /* + * Currently, all MS C compilers for Win32 platforms default to 8 byte + * alignment. -- from stdlib.h of MS VC++5.0. ++ * ++ * On AIX, the malloc subroutine returns a pointer to space suitably ++ * aligned for the storage of any type of object (see 'man malloc'). + */ + return (void *) malloc(size); + #elif defined(MACOSX) +--- ./jdk/src/share/native/sun/awt/medialib/mlib_types.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_types.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 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 +@@ -57,7 +57,7 @@ + typedef float mlib_f32; + typedef double mlib_d64; + +-#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__GNUC__) ++#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__GNUC__) || defined(_AIX) + + #include <stdint.h> + #include <stddef.h> +--- ./jdk/src/share/native/sun/awt/splashscreen/java_awt_SplashScreen.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/splashscreen/java_awt_SplashScreen.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -24,8 +24,9 @@ + */ + + #include "splashscreen_impl.h" ++#include <jlong_md.h> + #include <jni.h> +-#include <jlong_md.h> ++#include <jni_util.h> + #include <sizecalc.h> + + JNIEXPORT jint JNICALL +@@ -212,8 +213,9 @@ + if (!splash) { + return JNI_FALSE; + } ++ pBytes = (*env)->GetByteArrayElements(env, data, NULL); ++ CHECK_NULL_RETURN(pBytes, JNI_FALSE); + size = (*env)->GetArrayLength(env, data); +- pBytes = (*env)->GetByteArrayElements(env, data, NULL); + rc = SplashLoadMemory(pBytes, size); + (*env)->ReleaseByteArrayElements(env, data, pBytes, JNI_ABORT); + return rc ? JNI_TRUE : JNI_FALSE; +--- ./jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h Wed Jul 30 18:42:59 2014 +0100 +@@ -189,7 +189,11 @@ + PUT(rgbquad_t, ptr, value); + break; + case 3: /* not supported, LSB or MSB should always be specified */ +- *(int *) 0 = 0; /* crash */ ++ PUT(byte_t, ptr, 0xff); /* Put a stub value */ ++ INCP(byte_t, ptr); ++ PUT(byte_t, ptr, 0xff); ++ INCP(byte_t, ptr); ++ PUT(byte_t, ptr, 0xff); + break; + case 2: + PUT(word_t, ptr, value); +@@ -253,7 +257,7 @@ + value = GET(rgbquad_t, ptr); + break; + case 3: /* not supported, LSB or MSB should always be specified */ +- *(int *) 0 = 0; ++ value = 0xFFFFFFFF; /*return a stub value */ + break; + case 2: + value = (rgbquad_t) GET(word_t, ptr); +--- ./jdk/src/share/native/sun/font/FontInstanceAdapter.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/font/FontInstanceAdapter.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -222,10 +222,16 @@ + jobject pt = env->NewObject(sunFontIDs.pt2DFloatClass, + sunFontIDs.pt2DFloatCtr, + adjustment.fX, adjustment.fY); ++ if (pt == NULL) { ++ env->ExceptionClear(); ++ adjustment.fX = 0.0f; ++ adjustment.fY = 0.0f; ++ } else { + env->CallObjectMethod(fontStrike, sunFontIDs.adjustPointMID, pt); + adjustment.fX = env->GetFloatField(pt, sunFontIDs.xFID); + adjustment.fY = env->GetFloatField(pt, sunFontIDs.yFID); + } ++} + + void FontInstanceAdapter::getWideGlyphAdvance(le_uint32 glyph, LEPoint &advance) const + { +--- ./jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/IndicLayoutEngine.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -151,7 +151,7 @@ + le_int32 outCharCount; + if (fVersion2) { + _LETRACE("v2process"); +- outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage); ++ outCharCount = IndicReordering::v2process(&chars[offset], count, fScriptCode, outChars, glyphStorage, success); + } else { + _LETRACE("reorder"); + outCharCount = IndicReordering::reorder(&chars[offset], count, fScriptCode, outChars, glyphStorage, &fMPreFixups, success); +--- ./jdk/src/share/native/sun/font/layout/IndicReordering.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/IndicReordering.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1096,9 +1096,13 @@ + + + le_int32 IndicReordering::v2process(const LEUnicode *chars, le_int32 charCount, le_int32 scriptCode, +- LEUnicode *outChars, LEGlyphStorage &glyphStorage) ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage, LEErrorCode& success) + { + const IndicClassTable *classTable = IndicClassTable::getScriptClassTable(scriptCode); ++ if (classTable == NULL) { ++ success = LE_MEMORY_ALLOCATION_ERROR; ++ return 0; ++ } + + DynamicProperties dynProps[INDIC_BLOCK_SIZE]; + IndicReordering::getDynamicProperties(dynProps,classTable); +--- ./jdk/src/share/native/sun/font/layout/IndicReordering.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/IndicReordering.h Wed Jul 30 18:42:59 2014 +0100 +@@ -181,7 +181,7 @@ + static void adjustMPres(MPreFixups *mpreFixups, LEGlyphStorage &glyphStorage, LEErrorCode& success); + + static le_int32 v2process(const LEUnicode *theChars, le_int32 charCount, le_int32 scriptCode, +- LEUnicode *outChars, LEGlyphStorage &glyphStorage); ++ LEUnicode *outChars, LEGlyphStorage &glyphStorage, LEErrorCode& success); + + static const FeatureMap *getFeatureMap(le_int32 &count); + +--- ./jdk/src/share/native/sun/font/layout/LEScripts.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/LEScripts.h Wed Jul 30 18:42:59 2014 +0100 +@@ -263,12 +263,6 @@ + tirhScriptCode = 158, + + /** +- * @stable ICU 52 +- */ +- aghbScriptCode = 159, +- mahjScriptCode = 160, +- +-/** + * @stable ICU 2.2 + */ + scriptCodeCount +--- ./jdk/src/share/native/sun/font/layout/SunLayoutEngine.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/SunLayoutEngine.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -56,50 +56,13 @@ + JNIEXPORT void JNICALL + Java_sun_font_SunLayoutEngine_initGVIDs + (JNIEnv *env, jclass cls) { +- gvdClass = env->FindClass(gvdClassName); +- if (!gvdClass) { +- JNU_ThrowClassNotFoundException(env, gvdClassName); +- return; +- } +- gvdClass = (jclass)env->NewGlobalRef(gvdClass); +- if (!gvdClass) { +- JNU_ThrowInternalError(env, "could not create global ref"); +- return; +- } +- gvdCountFID = env->GetFieldID(gvdClass, "_count", "I"); +- if (!gvdCountFID) { +- gvdClass = 0; +- JNU_ThrowNoSuchFieldException(env, "_count"); +- return; +- } +- +- gvdFlagsFID = env->GetFieldID(gvdClass, "_flags", "I"); +- if (!gvdFlagsFID) { +- gvdClass = 0; +- JNU_ThrowNoSuchFieldException(env, "_flags"); +- return; +- } +- +- gvdGlyphsFID = env->GetFieldID(gvdClass, "_glyphs", "[I"); +- if (!gvdGlyphsFID) { +- gvdClass = 0; +- JNU_ThrowNoSuchFieldException(env, "_glyphs"); +- return; +- } +- +- gvdPositionsFID = env->GetFieldID(gvdClass, "_positions", "[F"); +- if (!gvdPositionsFID) { +- gvdClass = 0; +- JNU_ThrowNoSuchFieldException(env, "_positions"); +- return; +- } +- ++ CHECK_NULL(gvdClass = env->FindClass(gvdClassName)); ++ CHECK_NULL(gvdClass = (jclass)env->NewGlobalRef(gvdClass)); ++ CHECK_NULL(gvdCountFID = env->GetFieldID(gvdClass, "_count", "I")); ++ CHECK_NULL(gvdFlagsFID = env->GetFieldID(gvdClass, "_flags", "I")); ++ CHECK_NULL(gvdGlyphsFID = env->GetFieldID(gvdClass, "_glyphs", "[I")); ++ CHECK_NULL(gvdPositionsFID = env->GetFieldID(gvdClass, "_positions", "[F")); + gvdIndicesFID = env->GetFieldID(gvdClass, "_indices", "[I"); +- if (!gvdIndicesFID) { +- gvdClass = 0; +- JNU_ThrowNoSuchFieldException(env, "_indices"); +- return; +- } + } + + int putGV(JNIEnv* env, jint gmask, jint baseIndex, jobject gvdata, const LayoutEngine* engine, int glyphCount) { +@@ -195,7 +158,7 @@ + jchar* chars = buffer; + if (len > 256) { + size_t size = len * sizeof(jchar); +- if (size / sizeof(jchar) != len) { ++ if (size / sizeof(jchar) != (size_t)len) { + return; + } + chars = (jchar*)malloc(size); +@@ -220,10 +183,12 @@ + env->SetIntField(gvdata, gvdCountFID, -1); // flag failure + } else { + if (putGV(env, gmask, baseIndex, gvdata, engine, glyphCount)) { ++ if (!(env->ExceptionCheck())) { + // !!! hmmm, could use current value in positions array of GVData... + putFloat(env, pt, x, y); + } + } ++ } + + if (chars != buffer) { + free(chars); +--- ./jdk/src/share/native/sun/font/sunFont.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/font/sunFont.c Wed Jul 30 18:42:59 2014 +0100 +@@ -27,6 +27,7 @@ + #include "string.h" + #include "gdefs.h" + #include "jlong.h" ++#include "jni_util.h" + #include "sunfontids.h" + #include "fontscalerdefs.h" + #include "sun_font_SunFontManager.h" +@@ -81,100 +82,106 @@ + if (initialisedFontIDs) { + return; + } +- tmpClass = (*env)->FindClass(env, "sun/font/TrueTypeFont"); +- sunFontIDs.ttReadBlockMID = ++ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/TrueTypeFont")); ++ CHECK_NULL(sunFontIDs.ttReadBlockMID = + (*env)->GetMethodID(env, tmpClass, "readBlock", +- "(Ljava/nio/ByteBuffer;II)I"); +- sunFontIDs.ttReadBytesMID = +- (*env)->GetMethodID(env, tmpClass, "readBytes", "(II)[B"); ++ "(Ljava/nio/ByteBuffer;II)I")); ++ CHECK_NULL(sunFontIDs.ttReadBytesMID = ++ (*env)->GetMethodID(env, tmpClass, "readBytes", "(II)[B")); + +- tmpClass = (*env)->FindClass(env, "sun/font/Type1Font"); +- sunFontIDs.readFileMID = ++ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/Type1Font")); ++ CHECK_NULL(sunFontIDs.readFileMID = + (*env)->GetMethodID(env, tmpClass, +- "readFile", "(Ljava/nio/ByteBuffer;)V"); ++ "readFile", "(Ljava/nio/ByteBuffer;)V")); + +- tmpClass = (*env)->FindClass(env, "java/awt/geom/Point2D$Float"); ++ CHECK_NULL(tmpClass = ++ (*env)->FindClass(env, "java/awt/geom/Point2D$Float")); + sunFontIDs.pt2DFloatClass = (jclass)(*env)->NewGlobalRef(env, tmpClass); +- sunFontIDs.pt2DFloatCtr = +- (*env)->GetMethodID(env, sunFontIDs.pt2DFloatClass, "<init>","(FF)V"); ++ CHECK_NULL(sunFontIDs.pt2DFloatCtr = ++ (*env)->GetMethodID(env, sunFontIDs.pt2DFloatClass, "<init>","(FF)V")); + +- sunFontIDs.xFID = +- (*env)->GetFieldID(env, sunFontIDs.pt2DFloatClass, "x", "F"); +- sunFontIDs.yFID = +- (*env)->GetFieldID(env, sunFontIDs.pt2DFloatClass, "y", "F"); ++ CHECK_NULL(sunFontIDs.xFID = ++ (*env)->GetFieldID(env, sunFontIDs.pt2DFloatClass, "x", "F")); ++ CHECK_NULL(sunFontIDs.yFID = ++ (*env)->GetFieldID(env, sunFontIDs.pt2DFloatClass, "y", "F")); + +- tmpClass = (*env)->FindClass(env, "sun/font/StrikeMetrics"); +- sunFontIDs.strikeMetricsClass=(jclass)(*env)->NewGlobalRef(env, tmpClass); ++ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/StrikeMetrics")); ++ CHECK_NULL(sunFontIDs.strikeMetricsClass = ++ (jclass)(*env)->NewGlobalRef(env, tmpClass)); + +- sunFontIDs.strikeMetricsCtr = ++ CHECK_NULL(sunFontIDs.strikeMetricsCtr = + (*env)->GetMethodID(env, sunFontIDs.strikeMetricsClass, +- "<init>", "(FFFFFFFFFF)V"); ++ "<init>", "(FFFFFFFFFF)V")); + +- tmpClass = (*env)->FindClass(env, "java/awt/geom/Rectangle2D$Float"); ++ CHECK_NULL(tmpClass = ++ (*env)->FindClass(env, "java/awt/geom/Rectangle2D$Float")); + sunFontIDs.rect2DFloatClass = (jclass)(*env)->NewGlobalRef(env, tmpClass); +- sunFontIDs.rect2DFloatCtr = +- (*env)->GetMethodID(env, sunFontIDs.rect2DFloatClass, "<init>", "()V"); +- sunFontIDs.rect2DFloatCtr4 = ++ CHECK_NULL(sunFontIDs.rect2DFloatCtr = ++ (*env)->GetMethodID(env, sunFontIDs.rect2DFloatClass, "<init>", "()V")); ++ CHECK_NULL(sunFontIDs.rect2DFloatCtr4 = + (*env)->GetMethodID(env, sunFontIDs.rect2DFloatClass, +- "<init>", "(FFFF)V"); +- sunFontIDs.rectF2DX = +- (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "x", "F"); +- sunFontIDs.rectF2DY = +- (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "y", "F"); +- sunFontIDs.rectF2DWidth = +- (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "width", "F"); +- sunFontIDs.rectF2DHeight = +- (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "height", "F"); ++ "<init>", "(FFFF)V")); ++ CHECK_NULL(sunFontIDs.rectF2DX = ++ (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "x", "F")); ++ CHECK_NULL(sunFontIDs.rectF2DY = ++ (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "y", "F")); ++ CHECK_NULL(sunFontIDs.rectF2DWidth = ++ (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "width", "F")); ++ CHECK_NULL(sunFontIDs.rectF2DHeight = ++ (*env)->GetFieldID(env, sunFontIDs.rect2DFloatClass, "height", "F")); + +- tmpClass = (*env)->FindClass(env, "java/awt/geom/GeneralPath"); ++ CHECK_NULL(tmpClass = (*env)->FindClass(env, "java/awt/geom/GeneralPath")); + sunFontIDs.gpClass = (jclass)(*env)->NewGlobalRef(env, tmpClass); +- sunFontIDs.gpCtr = +- (*env)->GetMethodID(env, sunFontIDs.gpClass, "<init>", "(I[BI[FI)V"); +- sunFontIDs.gpCtrEmpty = +- (*env)->GetMethodID(env, sunFontIDs.gpClass, "<init>", "()V"); ++ CHECK_NULL(sunFontIDs.gpCtr = ++ (*env)->GetMethodID(env, sunFontIDs.gpClass, "<init>", "(I[BI[FI)V")); ++ CHECK_NULL(sunFontIDs.gpCtrEmpty = ++ (*env)->GetMethodID(env, sunFontIDs.gpClass, "<init>", "()V")); + +- tmpClass = (*env)->FindClass(env, "sun/font/Font2D"); +- sunFontIDs.f2dCharToGlyphMID = +- (*env)->GetMethodID(env, tmpClass, "charToGlyph", "(I)I"); +- sunFontIDs.getMapperMID = ++ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/Font2D")); ++ CHECK_NULL(sunFontIDs.f2dCharToGlyphMID = ++ (*env)->GetMethodID(env, tmpClass, "charToGlyph", "(I)I")); ++ CHECK_NULL(sunFontIDs.getMapperMID = + (*env)->GetMethodID(env, tmpClass, "getMapper", +- "()Lsun/font/CharToGlyphMapper;"); +- sunFontIDs.getTableBytesMID = +- (*env)->GetMethodID(env, tmpClass, "getTableBytes", "(I)[B"); +- sunFontIDs.canDisplayMID = +- (*env)->GetMethodID(env, tmpClass, "canDisplay", "(C)Z"); ++ "()Lsun/font/CharToGlyphMapper;")); ++ CHECK_NULL(sunFontIDs.getTableBytesMID = ++ (*env)->GetMethodID(env, tmpClass, "getTableBytes", "(I)[B")); ++ CHECK_NULL(sunFontIDs.canDisplayMID = ++ (*env)->GetMethodID(env, tmpClass, "canDisplay", "(C)Z")); + +- tmpClass = (*env)->FindClass(env, "sun/font/CharToGlyphMapper"); +- sunFontIDs.charToGlyphMID = +- (*env)->GetMethodID(env, tmpClass, "charToGlyph", "(I)I"); ++ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/CharToGlyphMapper")); ++ CHECK_NULL(sunFontIDs.charToGlyphMID = ++ (*env)->GetMethodID(env, tmpClass, "charToGlyph", "(I)I")); + +- tmpClass = (*env)->FindClass(env, "sun/font/PhysicalStrike"); +- sunFontIDs.getGlyphMetricsMID = ++ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/PhysicalStrike")); ++ CHECK_NULL(sunFontIDs.getGlyphMetricsMID = + (*env)->GetMethodID(env, tmpClass, "getGlyphMetrics", +- "(I)Ljava/awt/geom/Point2D$Float;"); +- sunFontIDs.getGlyphPointMID = ++ "(I)Ljava/awt/geom/Point2D$Float;")); ++ CHECK_NULL(sunFontIDs.getGlyphPointMID = + (*env)->GetMethodID(env, tmpClass, "getGlyphPoint", +- "(II)Ljava/awt/geom/Point2D$Float;"); +- sunFontIDs.adjustPointMID = ++ "(II)Ljava/awt/geom/Point2D$Float;")); ++ CHECK_NULL(sunFontIDs.adjustPointMID = + (*env)->GetMethodID(env, tmpClass, "adjustPoint", +- "(Ljava/awt/geom/Point2D$Float;)V"); +- sunFontIDs.pScalerContextFID = +- (*env)->GetFieldID(env, tmpClass, "pScalerContext", "J"); ++ "(Ljava/awt/geom/Point2D$Float;)V")); ++ CHECK_NULL(sunFontIDs.pScalerContextFID = ++ (*env)->GetFieldID(env, tmpClass, "pScalerContext", "J")); + +- tmpClass = (*env)->FindClass(env, "sun/font/GlyphList"); +- sunFontIDs.glyphListX = (*env)->GetFieldID(env, tmpClass, "x", "F"); +- sunFontIDs.glyphListY = (*env)->GetFieldID(env, tmpClass, "y", "F"); +- sunFontIDs.glyphListLen = (*env)->GetFieldID(env, tmpClass, "len", "I"); +- sunFontIDs.glyphImages = +- (*env)->GetFieldID(env, tmpClass, "images", "[J"); +- sunFontIDs.glyphListUsePos = +- (*env)->GetFieldID(env, tmpClass, "usePositions", "Z"); +- sunFontIDs.glyphListPos = +- (*env)->GetFieldID(env, tmpClass, "positions", "[F"); +- sunFontIDs.lcdRGBOrder = +- (*env)->GetFieldID(env, tmpClass, "lcdRGBOrder", "Z"); +- sunFontIDs.lcdSubPixPos = +- (*env)->GetFieldID(env, tmpClass, "lcdSubPixPos", "Z"); ++ CHECK_NULL(tmpClass = (*env)->FindClass(env, "sun/font/GlyphList")); ++ CHECK_NULL(sunFontIDs.glyphListX = ++ (*env)->GetFieldID(env, tmpClass, "x", "F")); ++ CHECK_NULL(sunFontIDs.glyphListY = ++ (*env)->GetFieldID(env, tmpClass, "y", "F")); ++ CHECK_NULL(sunFontIDs.glyphListLen = ++ (*env)->GetFieldID(env, tmpClass, "len", "I")); ++ CHECK_NULL(sunFontIDs.glyphImages = ++ (*env)->GetFieldID(env, tmpClass, "images", "[J")); ++ CHECK_NULL(sunFontIDs.glyphListUsePos = ++ (*env)->GetFieldID(env, tmpClass, "usePositions", "Z")); ++ CHECK_NULL(sunFontIDs.glyphListPos = ++ (*env)->GetFieldID(env, tmpClass, "positions", "[F")); ++ CHECK_NULL(sunFontIDs.lcdRGBOrder = ++ (*env)->GetFieldID(env, tmpClass, "lcdRGBOrder", "Z")); ++ CHECK_NULL(sunFontIDs.lcdSubPixPos = ++ (*env)->GetFieldID(env, tmpClass, "lcdSubPixPos", "Z")); + + initLCDGammaTables(); + +--- ./jdk/src/share/native/sun/java2d/loops/TransformHelper.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/java2d/loops/TransformHelper.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2004, 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 +@@ -384,6 +384,7 @@ + return; + } + Region_IntersectBounds(&clipInfo, &dstInfo.bounds); ++ Transform_GetInfo(env, itxform, &itxInfo); + + numedges = (((jlong) dstInfo.bounds.y2) - ((jlong) dstInfo.bounds.y1)); + if (numedges <= 0) { +@@ -423,7 +424,6 @@ + return; + } + +- Transform_GetInfo(env, itxform, &itxInfo); + + if (!Region_IsEmpty(&clipInfo)) { + srcOps->GetRasInfo(env, srcOps, &srcInfo); +--- ./jdk/src/share/native/sun/java2d/opengl/OGLBlitLoops.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/java2d/opengl/OGLBlitLoops.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -34,6 +34,10 @@ + #include "OGLSurfaceData.h" + #include "GraphicsPrimitiveMgr.h" + ++#include <stdlib.h> // malloc ++#include <string.h> // memcpy ++#include "IntArgbPre.h" ++ + extern OGLPixelFormat PixelFormats[]; + + /** +@@ -335,6 +339,9 @@ + 0, 0, sw, sh, + pf->format, pf->type, + srcInfo->rasBase); ++ ++ j2d_glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); ++ j2d_glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + } + + // the texture image is "right side up", so we align the +@@ -697,6 +704,50 @@ + } + + /** ++ * This method makes vertical flip of the provided area of Surface and convert ++ * pixel's data from argbPre to argb format if requested. ++ */ ++void flip(void *pDst, juint w, juint h, jint scanStride, jboolean convert) { ++ const size_t clippedStride = 4 * w; ++ void *tempRow = (h > 1 && !convert) ? malloc(clippedStride) : NULL; ++ juint i = 0; ++ juint step = 0; ++ // vertical flip and convert argbpre to argb if necessary ++ for (; i < h / 2; ++i) { ++ juint *r1 = PtrAddBytes(pDst, (i * scanStride)); ++ juint *r2 = PtrAddBytes(pDst, (h - i - 1) * scanStride); ++ if (tempRow) { ++ // fast path ++ memcpy(tempRow, r1, clippedStride); ++ memcpy(r1, r2, clippedStride); ++ memcpy(r2, tempRow, clippedStride); ++ } else { ++ // slow path ++ for (step = 0; step < w; ++step) { ++ juint tmp = r1[step]; ++ if (convert) { ++ LoadIntArgbPreTo1IntArgb(r2, 0, step, r1[step]); ++ LoadIntArgbPreTo1IntArgb(&tmp, 0, 0, r2[step]); ++ } else { ++ r1[step] = r2[step]; ++ r2[step] = tmp; ++ } ++ } ++ } ++ } ++ // convert the middle line if necessary ++ if (convert && h % 2) { ++ juint *r1 = PtrAddBytes(pDst, (i * scanStride)); ++ for (step = 0; step < w; ++step) { ++ LoadIntArgbPreTo1IntArgb(r1, 0, step, r1[step]); ++ } ++ } ++ if (tempRow) { ++ free(tempRow); ++ } ++} ++ ++/** + * Specialized blit method for copying a native OpenGL "Surface" (pbuffer, + * window, etc.) to a system memory ("Sw") surface. + */ +@@ -758,7 +809,9 @@ + width = srcInfo.bounds.x2 - srcInfo.bounds.x1; + height = srcInfo.bounds.y2 - srcInfo.bounds.y1; + +- j2d_glPixelStorei(GL_PACK_SKIP_PIXELS, dstx); ++ pDst = PtrAddBytes(pDst, dstx * dstInfo.pixelStride); ++ pDst = PtrAddBytes(pDst, dsty * dstInfo.scanStride); ++ + j2d_glPixelStorei(GL_PACK_ROW_LENGTH, + dstInfo.scanStride / dstInfo.pixelStride); + j2d_glPixelStorei(GL_PACK_ALIGNMENT, pf.alignment); +@@ -779,27 +832,20 @@ + + // this accounts for lower-left origin of the source region + srcx = srcOps->xOffset + srcx; +- srcy = srcOps->yOffset + srcOps->height - (srcy + 1); ++ srcy = srcOps->yOffset + srcOps->height - srcy - height; + +- // we must read one scanline at a time because there is no way +- // to read starting at the top-left corner of the source region +- while (height > 0) { +- j2d_glPixelStorei(GL_PACK_SKIP_ROWS, dsty); +- j2d_glReadPixels(srcx, srcy, width, 1, +- pf.format, pf.type, pDst); +- srcy--; +- dsty++; +- height--; +- } +- ++ // Note that glReadPixels() is extremely slow! ++ // So we call it only once and flip the image using memcpy. ++ j2d_glReadPixels(srcx, srcy, width, height, ++ pf.format, pf.type, pDst); ++ // It was checked above that width and height are positive. ++ flip(pDst, (juint) width, (juint) height, dstInfo.scanStride, ++ !pf.isPremult && !srcOps->isOpaque); + #ifdef MACOSX + if (srcOps->isOpaque) { + j2d_glPixelTransferf(GL_ALPHA_BIAS, 0.0); + } + #endif +- +- j2d_glPixelStorei(GL_PACK_SKIP_PIXELS, 0); +- j2d_glPixelStorei(GL_PACK_SKIP_ROWS, 0); + j2d_glPixelStorei(GL_PACK_ROW_LENGTH, 0); + j2d_glPixelStorei(GL_PACK_ALIGNMENT, 4); + } +--- ./jdk/src/share/native/sun/java2d/opengl/OGLSurfaceData.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/java2d/opengl/OGLSurfaceData.c Wed Jul 30 18:42:59 2014 +0100 +@@ -543,7 +543,9 @@ + } + + JNU_SetFieldByName(env, NULL, sdObject, "nativeWidth", "I", width); ++ if (!((*env)->ExceptionOccurred(env))) { + JNU_SetFieldByName(env, NULL, sdObject, "nativeHeight", "I", height); ++ } + + (*env)->DeleteLocalRef(env, sdObject); + } +--- ./jdk/src/share/native/sun/management/DiagnosticCommandImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/management/DiagnosticCommandImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -23,18 +23,19 @@ + * questions. + */ + ++#include <stdlib.h> + #include <jni.h> + #include "management.h" + #include "sun_management_DiagnosticCommandImpl.h" + + JNIEXPORT void JNICALL Java_sun_management_DiagnosticCommandImpl_setNotificationEnabled + (JNIEnv *env, jobject dummy, jboolean enabled) { +- if(jmm_version > JMM_VERSION_1_2_2) { +- jmm_interface->SetDiagnosticFrameworkNotificationEnabled(env, enabled); +- } else { ++ if (jmm_version <= JMM_VERSION_1_2_2) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", + "JMX interface to diagnostic framework notifications is not supported by this VM"); ++ return; + } ++ jmm_interface->SetDiagnosticFrameworkNotificationEnabled(env, enabled); + } + + JNIEXPORT jobjectArray JNICALL +@@ -56,7 +57,8 @@ + jobject resultList; + + dcmd_arg_info_array = (dcmdArgInfo*) malloc(num_arg * sizeof(dcmdArgInfo)); +- if (dcmd_arg_info_array == NULL) { ++ /* According to ISO C it is perfectly legal for malloc to return zero if called with a zero argument */ ++ if (dcmd_arg_info_array == NULL && num_arg != 0) { + return NULL; + } + jmm_interface->GetDiagnosticCommandArgumentsInfo(env, command, +@@ -117,19 +119,24 @@ + return NULL; + } + num_commands = (*env)->GetArrayLength(env, commands); +- dcmd_info_array = (dcmdInfo*) malloc(num_commands * +- sizeof(dcmdInfo)); +- if (dcmd_info_array == NULL) { +- JNU_ThrowOutOfMemoryError(env, NULL); +- } +- jmm_interface->GetDiagnosticCommandInfo(env, commands, dcmd_info_array); + dcmdInfoCls = (*env)->FindClass(env, + "sun/management/DiagnosticCommandInfo"); + result = (*env)->NewObjectArray(env, num_commands, dcmdInfoCls, NULL); + if (result == NULL) { +- free(dcmd_info_array); + JNU_ThrowOutOfMemoryError(env, 0); ++ return NULL; + } ++ if (num_commands == 0) { ++ /* Handle the 'zero commands' case specially to avoid calling 'malloc()' */ ++ /* with a zero argument because that may legally return a NULL pointer. */ ++ return result; ++ } ++ dcmd_info_array = (dcmdInfo*) malloc(num_commands * sizeof(dcmdInfo)); ++ if (dcmd_info_array == NULL) { ++ JNU_ThrowOutOfMemoryError(env, NULL); ++ return NULL; ++ } ++ jmm_interface->GetDiagnosticCommandInfo(env, commands, dcmd_info_array); + for (i=0; i<num_commands; i++) { + args = getDiagnosticCommandArgumentInfoArray(env, + (*env)->GetObjectArrayElement(env,commands,i), +@@ -137,6 +144,7 @@ + if (args == NULL) { + free(dcmd_info_array); + JNU_ThrowOutOfMemoryError(env, 0); ++ return NULL; + } + obj = JNU_NewObjectByName(env, + "sun/management/DiagnosticCommandInfo", +@@ -152,6 +160,7 @@ + if (obj == NULL) { + free(dcmd_info_array); + JNU_ThrowOutOfMemoryError(env, 0); ++ return NULL; + } + (*env)->SetObjectArrayElement(env, result, i, obj); + } +--- ./jdk/src/share/native/sun/misc/VMSupport.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/misc/VMSupport.c Wed Jul 30 18:42:59 2014 +0100 +@@ -53,3 +53,9 @@ + } + return (*InitAgentProperties_fp)(env, props); + } ++ ++JNIEXPORT jstring JNICALL ++Java_sun_misc_VMSupport_getVMTemporaryDirectory(JNIEnv *env, jclass cls) ++{ ++ return JVM_GetTemporaryDirectory(env); ++} +--- ./jdk/src/share/native/sun/misc/Version.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/misc/Version.c Wed Jul 30 18:42:59 2014 +0100 +@@ -90,10 +90,15 @@ + + (*func_p)(env, &info, sizeof(info)); + setStaticIntField(env, cls, "jvm_major_version", JVM_VERSION_MAJOR(info.jvm_version)); ++ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); + setStaticIntField(env, cls, "jvm_minor_version", JVM_VERSION_MINOR(info.jvm_version)); ++ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); + setStaticIntField(env, cls, "jvm_micro_version", JVM_VERSION_MICRO(info.jvm_version)); ++ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); + setStaticIntField(env, cls, "jvm_build_number", JVM_VERSION_BUILD(info.jvm_version)); ++ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); + setStaticIntField(env, cls, "jvm_update_version", info.update_version); ++ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); + jvm_special_version = info.special_update_version; + + return JNI_TRUE; +@@ -116,10 +121,15 @@ + + JDK_GetVersionInfo0(&info, sizeof(info)); + setStaticIntField(env, cls, "jdk_major_version", JDK_VERSION_MAJOR(info.jdk_version)); ++ JNU_CHECK_EXCEPTION(env); + setStaticIntField(env, cls, "jdk_minor_version", JDK_VERSION_MINOR(info.jdk_version)); ++ JNU_CHECK_EXCEPTION(env); + setStaticIntField(env, cls, "jdk_micro_version", JDK_VERSION_MICRO(info.jdk_version)); ++ JNU_CHECK_EXCEPTION(env); + setStaticIntField(env, cls, "jdk_build_number", JDK_VERSION_BUILD(info.jdk_version)); ++ JNU_CHECK_EXCEPTION(env); + setStaticIntField(env, cls, "jdk_update_version", info.update_version); ++ JNU_CHECK_EXCEPTION(env); + jdk_special_version = info.special_update_version; + } + +--- ./jdk/src/share/native/sun/security/ec/impl/ecc_impl.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/security/ec/impl/ecc_impl.h Wed Jul 30 18:42:59 2014 +0100 +@@ -65,6 +65,13 @@ + typedef enum boolean { B_FALSE, B_TRUE } boolean_t; + #endif /* _ALLBSD_SOURCE */ + ++#ifdef AIX ++#define B_FALSE FALSE ++#define B_TRUE TRUE ++typedef unsigned char uint8_t; ++typedef unsigned long ulong_t; ++#endif /* AIX */ ++ + #ifdef _WIN32 + typedef unsigned char uint8_t; + typedef unsigned long ulong_t; +--- ./jdk/src/share/native/sun/security/pkcs11/j2secmod.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/security/pkcs11/j2secmod.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -30,20 +30,27 @@ + // #define SECMOD_DEBUG + + #include "j2secmod.h" ++#include "jni_util.h" + + + JNIEXPORT jboolean JNICALL Java_sun_security_pkcs11_Secmod_nssVersionCheck + (JNIEnv *env, jclass thisClass, jlong jHandle, jstring jVersion) + { +- const char *requiredVersion = (*env)->GetStringUTFChars(env, jVersion, NULL); +- int res; +- FPTR_VersionCheck versionCheck = +- (FPTR_VersionCheck)findFunction(env, jHandle, "NSS_VersionCheck"); ++ int res = 0; ++ FPTR_VersionCheck versionCheck; ++ const char *requiredVersion; + ++ versionCheck = (FPTR_VersionCheck)findFunction(env, jHandle, ++ "NSS_VersionCheck"); + if (versionCheck == NULL) { + return JNI_FALSE; + } + ++ requiredVersion = (*env)->GetStringUTFChars(env, jVersion, NULL); ++ if (requiredVersion == NULL) { ++ return JNI_FALSE; ++ } ++ + res = versionCheck(requiredVersion); + dprintf2("-version >=%s: %d\n", requiredVersion, res); + (*env)->ReleaseStringUTFChars(env, jVersion, requiredVersion); +@@ -59,55 +66,73 @@ + JNIEXPORT jboolean JNICALL Java_sun_security_pkcs11_Secmod_nssInitialize + (JNIEnv *env, jclass thisClass, jstring jFunctionName, jlong jHandle, jstring jConfigDir, jboolean jNssOptimizeSpace) + { +- const char *functionName = +- (*env)->GetStringUTFChars(env, jFunctionName, NULL); +- const char *configDir = (jConfigDir == NULL) +- ? NULL : (*env)->GetStringUTFChars(env, jConfigDir, NULL); ++ int res = 0; + FPTR_Initialize initialize = + (FPTR_Initialize)findFunction(env, jHandle, "NSS_Initialize"); +- int res = 0; + unsigned int flags = 0x00; ++ const char *configDir = NULL; ++ const char *functionName = NULL; ++ ++ /* If we cannot initialize, exit now */ ++ if (initialize == NULL) { ++ res = 1; ++ goto cleanup; ++ } ++ ++ functionName = (*env)->GetStringUTFChars(env, jFunctionName, NULL); ++ if (functionName == NULL) { ++ res = 1; ++ goto cleanup; ++ } ++ ++ if (jConfigDir != NULL) { ++ configDir = (*env)->GetStringUTFChars(env, jConfigDir, NULL); ++ if (!configDir) { ++ res = 1; ++ goto cleanup; ++ } ++ } + + if (jNssOptimizeSpace == JNI_TRUE) { + flags = 0x20; // NSS_INIT_OPTIMIZESPACE flag + } + +- if (initialize != NULL) { +- /* +- * If the NSS_Init function is requested then call NSS_Initialize to +- * open the Cert, Key and Security Module databases, read only. +- */ +- if (strcmp("NSS_Init", functionName) == 0) { +- flags = flags | 0x01; // NSS_INIT_READONLY flag +- res = initialize(configDir, "", "", "secmod.db", flags); ++ /* ++ * If the NSS_Init function is requested then call NSS_Initialize to ++ * open the Cert, Key and Security Module databases, read only. ++ */ ++ if (strcmp("NSS_Init", functionName) == 0) { ++ flags = flags | 0x01; // NSS_INIT_READONLY flag ++ res = initialize(configDir, "", "", "secmod.db", flags); + +- /* +- * If the NSS_InitReadWrite function is requested then call +- * NSS_Initialize to open the Cert, Key and Security Module databases, +- * read/write. +- */ +- } else if (strcmp("NSS_InitReadWrite", functionName) == 0) { +- res = initialize(configDir, "", "", "secmod.db", flags); ++ /* ++ * If the NSS_InitReadWrite function is requested then call ++ * NSS_Initialize to open the Cert, Key and Security Module databases, ++ * read/write. ++ */ ++ } else if (strcmp("NSS_InitReadWrite", functionName) == 0) { ++ res = initialize(configDir, "", "", "secmod.db", flags); + +- /* +- * If the NSS_NoDB_Init function is requested then call +- * NSS_Initialize without creating Cert, Key or Security Module +- * databases. +- */ +- } else if (strcmp("NSS_NoDB_Init", functionName) == 0) { +- flags = flags | 0x02 // NSS_INIT_NOCERTDB flag +- | 0x04 // NSS_INIT_NOMODDB flag +- | 0x08 // NSS_INIT_FORCEOPEN flag +- | 0x10; // NSS_INIT_NOROOTINIT flag +- res = initialize("", "", "", "", flags); ++ /* ++ * If the NSS_NoDB_Init function is requested then call ++ * NSS_Initialize without creating Cert, Key or Security Module ++ * databases. ++ */ ++ } else if (strcmp("NSS_NoDB_Init", functionName) == 0) { ++ flags = flags | 0x02 // NSS_INIT_NOCERTDB flag ++ | 0x04 // NSS_INIT_NOMODDB flag ++ | 0x08 // NSS_INIT_FORCEOPEN flag ++ | 0x10; // NSS_INIT_NOROOTINIT flag ++ res = initialize("", "", "", "", flags); + +- } else { +- res = 2; +- } + } else { +- res = 1; ++ res = 2; + } +- (*env)->ReleaseStringUTFChars(env, jFunctionName, functionName); ++ ++cleanup: ++ if (functionName != NULL) { ++ (*env)->ReleaseStringUTFChars(env, jFunctionName, functionName); ++ } + if (configDir != NULL) { + (*env)->ReleaseStringUTFChars(env, jConfigDir, configDir); + } +@@ -142,13 +167,30 @@ + } + + jListClass = (*env)->FindClass(env, "java/util/ArrayList"); ++ if (jListClass == NULL) { ++ return NULL; ++ } + jListConstructor = (*env)->GetMethodID(env, jListClass, "<init>", "()V"); ++ if (jListConstructor == NULL) { ++ return NULL; ++ } + jAdd = (*env)->GetMethodID(env, jListClass, "add", "(Ljava/lang/Object;)Z"); ++ if (jAdd == NULL) { ++ return NULL; ++ } + jList = (*env)->NewObject(env, jListClass, jListConstructor); +- ++ if (jList == NULL) { ++ return NULL; ++ } + jModuleClass = (*env)->FindClass(env, "sun/security/pkcs11/Secmod$Module"); ++ if (jModuleClass == NULL) { ++ return NULL; ++ } + jModuleConstructor = (*env)->GetMethodID(env, jModuleClass, "<init>", + "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZI)V"); ++ if (jModuleConstructor == NULL) { ++ return NULL; ++ } + + while (list != NULL) { + module = list->module; +@@ -160,16 +202,28 @@ + dprintf1("-internal: %d\n", module->internal); + dprintf1("-fips: %d\n", module->isFIPS); + jCommonName = (*env)->NewStringUTF(env, module->commonName); ++ if (jCommonName == NULL) { ++ return NULL; ++ } + if (module->dllName == NULL) { + jDllName = NULL; + } else { + jDllName = (*env)->NewStringUTF(env, module->dllName); ++ if (jDllName == NULL) { ++ return NULL; ++ } + } + jFIPS = module->isFIPS; + for (i = 0; i < module->slotCount; i++ ) { + jModule = (*env)->NewObject(env, jModuleClass, jModuleConstructor, + jLibDir, jDllName, jCommonName, jFIPS, i); ++ if (jModule == NULL) { ++ return NULL; ++ } + (*env)->CallVoidMethod(env, jList, jAdd, jModule); ++ if ((*env)->ExceptionCheck(env)) { ++ return NULL; ++ } + } + list = list->next; + } +--- ./jdk/src/share/native/sun/security/smartcardio/pcsc.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/native/sun/security/smartcardio/pcsc.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2006, 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 +@@ -64,17 +64,32 @@ + + #define J2PCSC_EXCEPTION_NAME "sun/security/smartcardio/PCSCException" + ++void throwOutOfMemoryError(JNIEnv *env, const char *msg) { ++ jclass cls = (*env)->FindClass(env, "java/lang/OutOfMemoryError"); ++ ++ if (cls != NULL) /* Otherwise an exception has already been thrown */ ++ (*env)->ThrowNew(env, cls, msg); ++ ++} ++ + void throwPCSCException(JNIEnv* env, LONG code) { + jclass pcscClass; + jmethodID constructor; + jthrowable pcscException; + + pcscClass = (*env)->FindClass(env, J2PCSC_EXCEPTION_NAME); +- assert(pcscClass != NULL); ++ if (pcscClass == NULL) { ++ return; ++ } + constructor = (*env)->GetMethodID(env, pcscClass, "<init>", "(I)V"); +- assert(constructor != NULL); +- pcscException = (jthrowable) (*env)->NewObject(env, pcscClass, constructor, (jint)code); +- (*env)->Throw(env, pcscException); ++ if (constructor == NULL) { ++ return; ++ } ++ pcscException = (jthrowable) (*env)->NewObject(env, pcscClass, ++ constructor, (jint)code); ++ if (pcscException != NULL) { ++ (*env)->Throw(env, pcscException); ++ } + } + + jboolean handleRV(JNIEnv* env, LONG code) { +@@ -93,7 +108,7 @@ + JNIEXPORT jlong JNICALL Java_sun_security_smartcardio_PCSC_SCardEstablishContext + (JNIEnv *env, jclass thisClass, jint dwScope) + { +- SCARDCONTEXT context; ++ SCARDCONTEXT context = 0; + LONG rv; + dprintf("-establishContext\n"); + rv = CALL_SCardEstablishContext(dwScope, NULL, NULL, &context); +@@ -110,7 +125,7 @@ + jobjectArray pcsc_multi2jstring(JNIEnv *env, char *spec) { + jobjectArray result; + jclass stringClass; +- char *cp, **tab; ++ char *cp, **tab = NULL; + jstring js; + int cnt = 0; + +@@ -121,6 +136,10 @@ + } + + tab = (char **)malloc(cnt * sizeof(char *)); ++ if (tab == NULL) { ++ throwOutOfMemoryError(env, NULL); ++ return NULL; ++ } + + cnt = 0; + cp = spec; +@@ -130,12 +149,26 @@ + } + + stringClass = (*env)->FindClass(env, "java/lang/String"); +- assert(stringClass != NULL); ++ if (stringClass == NULL) { ++ free(tab); ++ return NULL; ++ } + + result = (*env)->NewObjectArray(env, cnt, stringClass, NULL); +- while (cnt-- > 0) { +- js = (*env)->NewStringUTF(env, tab[cnt]); +- (*env)->SetObjectArrayElement(env, result, cnt, js); ++ if (result != NULL) { ++ while (cnt-- > 0) { ++ js = (*env)->NewStringUTF(env, tab[cnt]); ++ if ((*env)->ExceptionCheck(env)) { ++ free(tab); ++ return NULL; ++ } ++ (*env)->SetObjectArrayElement(env, result, cnt, js); ++ if ((*env)->ExceptionCheck(env)) { ++ free(tab); ++ return NULL; ++ } ++ (*env)->DeleteLocalRef(env, js); ++ } + } + free(tab); + return result; +@@ -146,8 +179,8 @@ + { + SCARDCONTEXT context = (SCARDCONTEXT)jContext; + LONG rv; +- LPTSTR mszReaders; +- DWORD size; ++ LPTSTR mszReaders = NULL; ++ DWORD size = 0; + jobjectArray result; + + dprintf1("-context: %x\n", context); +@@ -157,13 +190,20 @@ + } + dprintf1("-size: %d\n", size); + +- mszReaders = malloc(size); +- rv = CALL_SCardListReaders(context, NULL, mszReaders, &size); +- if (handleRV(env, rv)) { +- free(mszReaders); +- return NULL; ++ if (size) { ++ mszReaders = malloc(size); ++ if (mszReaders == NULL) { ++ throwOutOfMemoryError(env, NULL); ++ return NULL; ++ } ++ ++ rv = CALL_SCardListReaders(context, NULL, mszReaders, &size); ++ if (handleRV(env, rv)) { ++ free(mszReaders); ++ return NULL; ++ } ++ dprintf1("-String: %s\n", mszReaders); + } +- dprintf1("-String: %s\n", mszReaders); + + result = pcsc_multi2jstring(env, mszReaders); + free(mszReaders); +@@ -177,10 +217,13 @@ + SCARDCONTEXT context = (SCARDCONTEXT)jContext; + LONG rv; + LPCTSTR readerName; +- SCARDHANDLE card; +- DWORD proto; ++ SCARDHANDLE card = 0; ++ DWORD proto = 0; + + readerName = (*env)->GetStringUTFChars(env, jReaderName, NULL); ++ if (readerName == NULL) { ++ return 0; ++ } + rv = CALL_SCardConnect(context, readerName, jShareMode, jPreferredProtocols, &card, &proto); + (*env)->ReleaseStringUTFChars(env, jReaderName, readerName); + dprintf1("-cardhandle: %x\n", card); +@@ -210,6 +253,9 @@ + sendPci.cbPciLength = sizeof(SCARD_IO_REQUEST); + + sbuf = (unsigned char *) ((*env)->GetByteArrayElements(env, jBuf, NULL)); ++ if (sbuf == NULL) { ++ return NULL; ++ } + rv = CALL_SCardTransmit(card, &sendPci, sbuf + ofs, len, NULL, rbuf, &rlen); + (*env)->ReleaseByteArrayElements(env, jBuf, (jbyte *)sbuf, JNI_ABORT); + +@@ -218,7 +264,12 @@ + } + + jOut = (*env)->NewByteArray(env, rlen); +- (*env)->SetByteArrayRegion(env, jOut, 0, rlen, (jbyte *)rbuf); ++ if (jOut != NULL) { ++ (*env)->SetByteArrayRegion(env, jOut, 0, rlen, (jbyte *)rbuf); ++ if ((*env)->ExceptionCheck(env)) { ++ return NULL; ++ } ++ } + return jOut; + } + +@@ -231,10 +282,10 @@ + DWORD readerLen = READERNAME_BUFFER_SIZE; + unsigned char atr[ATR_BUFFER_SIZE]; + DWORD atrLen = ATR_BUFFER_SIZE; +- DWORD state; +- DWORD protocol; ++ DWORD state = 0; ++ DWORD protocol = 0; + jbyteArray jArray; +- jbyte tmp; ++ jbyte status[2]; + + rv = CALL_SCardStatus(card, readerName, &readerLen, &state, &protocol, atr, &atrLen); + if (handleRV(env, rv)) { +@@ -245,13 +296,19 @@ + dprintf1("-protocol: %d\n", protocol); + + jArray = (*env)->NewByteArray(env, atrLen); ++ if (jArray == NULL) { ++ return NULL; ++ } + (*env)->SetByteArrayRegion(env, jArray, 0, atrLen, (jbyte *)atr); +- +- tmp = (jbyte)state; +- (*env)->SetByteArrayRegion(env, jStatus, 0, 1, &tmp); +- tmp = (jbyte)protocol; +- (*env)->SetByteArrayRegion(env, jStatus, 1, 1, &tmp); +- ++ if ((*env)->ExceptionCheck(env)) { ++ return NULL; ++ } ++ status[0] = (jbyte) state; ++ status[1] = (jbyte) protocol; ++ (*env)->SetByteArrayRegion(env, jStatus, 0, 2, status); ++ if ((*env)->ExceptionCheck(env)) { ++ return NULL; ++ } + return jArray; + } + +@@ -274,36 +331,78 @@ + SCARDCONTEXT context = (SCARDCONTEXT)jContext; + LONG rv; + int readers = (*env)->GetArrayLength(env, jReaderNames); +- SCARD_READERSTATE *readerState = malloc(readers * sizeof(SCARD_READERSTATE)); ++ SCARD_READERSTATE *readerState; + int i; +- jintArray jEventState; +- int *currentState = (*env)->GetIntArrayElements(env, jCurrentState, NULL); ++ jintArray jEventState = NULL; ++ int *currentState = NULL; ++ const char *readerName; ++ ++ readerState = calloc(readers, sizeof(SCARD_READERSTATE)); ++ if (readerState == NULL && readers > 0) { ++ throwOutOfMemoryError(env, NULL); ++ return NULL; ++ } ++ ++ currentState = (*env)->GetIntArrayElements(env, jCurrentState, NULL); ++ if (currentState == NULL) { ++ free(readerState); ++ return NULL; ++ } ++ ++ for (i = 0; i < readers; i++) { ++ readerState[i].szReader = NULL; ++ } + + for (i = 0; i < readers; i++) { + jobject jReaderName = (*env)->GetObjectArrayElement(env, jReaderNames, i); +- readerState[i].szReader = (*env)->GetStringUTFChars(env, jReaderName, NULL); ++ if ((*env)->ExceptionCheck(env)) { ++ goto cleanup; ++ } ++ readerName = (*env)->GetStringUTFChars(env, jReaderName, NULL); ++ if (readerName == NULL) { ++ goto cleanup; ++ } ++ readerState[i].szReader = strdup(readerName); ++ (*env)->ReleaseStringUTFChars(env, jReaderName, readerName); ++ if (readerState[i].szReader == NULL) { ++ throwOutOfMemoryError(env, NULL); ++ goto cleanup; ++ } + readerState[i].pvUserData = NULL; + readerState[i].dwCurrentState = currentState[i]; + readerState[i].dwEventState = SCARD_STATE_UNAWARE; + readerState[i].cbAtr = 0; ++ (*env)->DeleteLocalRef(env, jReaderName); + } +- (*env)->ReleaseIntArrayElements(env, jCurrentState, currentState, JNI_ABORT); + +- rv = CALL_SCardGetStatusChange(context, (DWORD)jTimeout, readerState, readers); ++ if (readers > 0) { ++ rv = CALL_SCardGetStatusChange(context, (DWORD)jTimeout, readerState, readers); ++ if (handleRV(env, rv)) { ++ goto cleanup; ++ } ++ } + + jEventState = (*env)->NewIntArray(env, readers); ++ if (jEventState == NULL) { ++ goto cleanup; ++ } + for (i = 0; i < readers; i++) { + jint eventStateTmp; +- jobject jReaderName = (*env)->GetObjectArrayElement(env, jReaderNames, i); + dprintf3("-reader status %s: 0x%X, 0x%X\n", readerState[i].szReader, + readerState[i].dwCurrentState, readerState[i].dwEventState); +- (*env)->ReleaseStringUTFChars(env, jReaderName, readerState[i].szReader); + eventStateTmp = (jint)readerState[i].dwEventState; + (*env)->SetIntArrayRegion(env, jEventState, i, 1, &eventStateTmp); ++ if ((*env)->ExceptionCheck(env)) { ++ jEventState = NULL; ++ goto cleanup; ++ } ++ } ++cleanup: ++ (*env)->ReleaseIntArrayElements(env, jCurrentState, currentState, JNI_ABORT); ++ for (i = 0; i < readers; i++) { ++ free((char *)readerState[i].szReader); + } + free(readerState); +- +- handleRV(env, rv); + return jEventState; + } + +@@ -336,13 +435,18 @@ + { + SCARDHANDLE card = (SCARDHANDLE)jCard; + LONG rv; +- jbyte* sendBuffer = (*env)->GetByteArrayElements(env, jSendBuffer, NULL); ++ jbyte* sendBuffer; + jint sendBufferLength = (*env)->GetArrayLength(env, jSendBuffer); + jbyte receiveBuffer[MAX_STACK_BUFFER_SIZE]; + jint receiveBufferLength = MAX_STACK_BUFFER_SIZE; + ULONG returnedLength = 0; + jbyteArray jReceiveBuffer; + ++ sendBuffer = (*env)->GetByteArrayElements(env, jSendBuffer, NULL); ++ if (sendBuffer == NULL) { ++ return NULL; ++ } ++ + #ifdef J2PCSC_DEBUG + { + int k; +@@ -375,7 +479,12 @@ + #endif + + jReceiveBuffer = (*env)->NewByteArray(env, returnedLength); ++ if (jReceiveBuffer == NULL) { ++ return NULL; ++ } + (*env)->SetByteArrayRegion(env, jReceiveBuffer, 0, returnedLength, receiveBuffer); +- ++ if ((*env)->ExceptionCheck(env)) { ++ return NULL; ++ } + return jReceiveBuffer; + } +--- ./jdk/src/share/npt/utf.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/npt/utf.c Wed Jul 30 18:42:59 2014 +0100 +@@ -396,7 +396,7 @@ + + /* ================================================================= */ + +-#if 1 /* Test program */ ++#ifdef COMPILE_WITH_UTF_TEST /* Test program */ + + /* + * Convert any byte array into a printable string. +--- ./jdk/src/share/transport/socket/socketTransport.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/share/transport/socket/socketTransport.c Wed Jul 30 18:42:59 2014 +0100 +@@ -506,6 +506,19 @@ + if (fd < 0) { + return JDWPTRANSPORT_ERROR_NONE; + } ++#ifdef _AIX ++ /* ++ AIX needs a workaround for I/O cancellation, see: ++ http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/close.htm ++ ... ++ The close subroutine is blocked until all subroutines which use the file ++ descriptor return to usr space. For example, when a thread is calling close ++ and another thread is calling select with the same file descriptor, the ++ close subroutine does not return until the select call returns. ++ ... ++ */ ++ shutdown(fd, 2); ++#endif + if (dbgsysSocketClose(fd) < 0) { + /* + * close failed - it's pointless to restore socketFD here because +--- ./jdk/src/solaris/back/exec_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/back/exec_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1998, 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 +@@ -30,8 +30,8 @@ + #include "sys.h" + #include "util.h" + +-#if defined(LINUX) || defined(_ALLBSD_SOURCE) +- /* Linux */ ++#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) ++ /* Linux, BSD, AIX */ + #define FORK() fork() + #else + /* Solaris (make sure we always get the POSIX-specified behavior) */ +--- ./jdk/src/solaris/bin/java_md_solinux.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/bin/java_md_solinux.c Wed Jul 30 18:42:59 2014 +0100 +@@ -41,7 +41,11 @@ + + #define JVM_DLL "libjvm.so" + #define JAVA_DLL "libjava.so" ++#ifdef AIX ++#define LD_LIBRARY_PATH "LIBPATH" ++#else + #define LD_LIBRARY_PATH "LD_LIBRARY_PATH" ++#endif + + /* help jettison the LD_LIBRARY_PATH settings in the future */ + #ifndef SETENV_REQUIRED +@@ -287,6 +291,11 @@ + char *dmllp = NULL; + char *p; /* a utility pointer */ + ++#ifdef AIX ++ /* We always have to set the LIBPATH on AIX because ld doesn't support $ORIGIN. */ ++ return JNI_TRUE; ++#endif ++ + llp = getenv("LD_LIBRARY_PATH"); + #ifdef __solaris__ + dmllp = (CURRENT_DATA_MODEL == 32) +@@ -598,7 +607,7 @@ + * If not on Solaris, assume only a single LD_LIBRARY_PATH + * variable. + */ +- runpath = getenv("LD_LIBRARY_PATH"); ++ runpath = getenv(LD_LIBRARY_PATH); + #endif /* __solaris__ */ + + /* runpath contains current effective LD_LIBRARY_PATH setting */ +@@ -606,8 +615,12 @@ + jvmpath = JLI_StringDup(jvmpath); + new_runpath = JLI_MemAlloc(((runpath != NULL) ? JLI_StrLen(runpath) : 0) + + 2 * JLI_StrLen(jrepath) + 2 * JLI_StrLen(arch) + ++#ifdef AIX ++ /* On AIX we additionally need 'jli' in the path because ld doesn't support $ORIGIN. */ ++ JLI_StrLen(jrepath) + JLI_StrLen(arch) + JLI_StrLen("/lib//jli:") + ++#endif + JLI_StrLen(jvmpath) + 52); +- newpath = new_runpath + JLI_StrLen("LD_LIBRARY_PATH="); ++ newpath = new_runpath + JLI_StrLen(LD_LIBRARY_PATH "="); + + + /* +@@ -619,9 +632,12 @@ + if (lastslash) + *lastslash = '\0'; + +- sprintf(new_runpath, "LD_LIBRARY_PATH=" ++ sprintf(new_runpath, LD_LIBRARY_PATH "=" + "%s:" + "%s/lib/%s:" ++#ifdef AIX ++ "%s/lib/%s/jli:" /* Needed on AIX because ld doesn't support $ORIGIN. */ ++#endif + "%s/../lib/%s", + jvmpath, + #ifdef DUAL_MODE +@@ -629,6 +645,9 @@ + jrepath, GetArchPath(wanted) + #else /* !DUAL_MODE */ + jrepath, arch, ++#ifdef AIX ++ jrepath, arch, ++#endif + jrepath, arch + #endif /* DUAL_MODE */ + ); +@@ -1000,7 +1019,7 @@ + int + ContinueInNewThread0(int (JNICALL *continuation)(void *), jlong stack_size, void * args) { + int rslt; +-#ifdef __linux__ ++#ifndef __solaris__ + pthread_t tid; + pthread_attr_t attr; + pthread_attr_init(&attr); +@@ -1025,7 +1044,7 @@ + } + + pthread_attr_destroy(&attr); +-#else /* ! __linux__ */ ++#else /* __solaris__ */ + thread_t tid; + long flags = 0; + if (thr_create(NULL, stack_size, (void *(*)(void *))continuation, args, flags, &tid) == 0) { +@@ -1036,7 +1055,7 @@ + /* See above. Continue in current thread if thr_create() failed */ + rslt = continuation(args); + } +-#endif /* __linux__ */ ++#endif /* !__solaris__ */ + return rslt; + } + +--- ./jdk/src/solaris/bin/java_md_solinux.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/bin/java_md_solinux.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 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 +@@ -45,23 +45,19 @@ + * A collection of useful strings. One should think of these as #define + * entries, but actual strings can be more efficient (with many compilers). + */ +-#ifdef __linux__ ++#ifdef __solaris__ ++static const char *system_dir = "/usr/jdk"; ++static const char *user_dir = "/jdk"; ++#else /* !__solaris__, i.e. Linux, AIX,.. */ + static const char *system_dir = "/usr/java"; + static const char *user_dir = "/java"; +-#else /* Solaris */ +-static const char *system_dir = "/usr/jdk"; +-static const char *user_dir = "/jdk"; + #endif + + #include <dlfcn.h> +-#ifdef __linux__ ++#ifdef __solaris__ ++#include <thread.h> ++#else + #include <pthread.h> +-#else +-#include <thread.h> + #endif + +-#define JVM_DLL "libjvm.so" +-#define JAVA_DLL "libjava.so" +-#define LD_LIBRARY_PATH "LD_LIBRARY_PATH" +- + #endif /* JAVA_MD_SOLINUX_H */ +--- ./jdk/src/solaris/bin/ppc64/jvm.cfg Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/solaris/bin/ppc64/jvm.cfg Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,33 @@ ++# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++# ++# This code is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License version 2 only, as ++# published by the Free Software Foundation. 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. ++# ++# List of JVMs that can be used as an option to java, javac, etc. ++# Order is important -- first in this list is the default JVM. ++# NOTE that this both this file and its format are UNSUPPORTED and ++# WILL GO AWAY in a future release. ++# ++# You may also select a JVM in an arbitrary location with the ++# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported ++# and may not be available in a future release. ++# ++-server KNOWN +--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.aix Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.aix Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,504 @@ ++/* ++ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package java.lang; ++ ++import java.io.BufferedInputStream; ++import java.io.BufferedOutputStream; ++import java.io.ByteArrayInputStream; ++import java.io.FileDescriptor; ++import java.io.FileInputStream; ++import java.io.FileOutputStream; ++import java.io.IOException; ++import java.io.InputStream; ++import java.io.OutputStream; ++import java.util.Arrays; ++import java.util.concurrent.Executors; ++import java.util.concurrent.Executor; ++import java.util.concurrent.ThreadFactory; ++import java.util.concurrent.TimeUnit; ++import java.security.AccessController; ++import static java.security.AccessController.doPrivileged; ++import java.security.PrivilegedAction; ++import java.security.PrivilegedActionException; ++import java.security.PrivilegedExceptionAction; ++ ++/** ++ * java.lang.Process subclass in the UNIX environment. ++ * ++ * @author Mario Wolczko and Ross Knippel. ++ * @author Konstantin Kladko (ported to Linux) ++ * @author Martin Buchholz ++ * @author Volker Simonis (ported to AIX) ++ */ ++final class UNIXProcess extends Process { ++ private static final sun.misc.JavaIOFileDescriptorAccess fdAccess ++ = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); ++ ++ private final int pid; ++ private int exitcode; ++ private boolean hasExited; ++ ++ private /* final */ OutputStream stdin; ++ private /* final */ InputStream stdout; ++ private /* final */ InputStream stderr; ++ ++ private static enum LaunchMechanism { ++ FORK(1), ++ POSIX_SPAWN(2); ++ ++ private int value; ++ LaunchMechanism(int x) {value = x;} ++ }; ++ ++ /* On AIX, the default is to spawn */ ++ private static final LaunchMechanism launchMechanism; ++ private static byte[] helperpath; ++ ++ private static byte[] toCString(String s) { ++ if (s == null) ++ return null; ++ byte[] bytes = s.getBytes(); ++ byte[] result = new byte[bytes.length + 1]; ++ System.arraycopy(bytes, 0, ++ result, 0, ++ bytes.length); ++ result[result.length-1] = (byte)0; ++ return result; ++ } ++ ++ static { ++ launchMechanism = AccessController.doPrivileged( ++ new PrivilegedAction<LaunchMechanism>() ++ { ++ public LaunchMechanism run() { ++ String javahome = System.getProperty("java.home"); ++ String osArch = System.getProperty("os.arch"); ++ ++ helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); ++ String s = System.getProperty( ++ "jdk.lang.Process.launchMechanism", "posix_spawn"); ++ ++ try { ++ return LaunchMechanism.valueOf(s.toUpperCase()); ++ } catch (IllegalArgumentException e) { ++ throw new Error(s + " is not a supported " + ++ "process launch mechanism on this platform."); ++ } ++ } ++ }); ++ } ++ ++ /* this is for the reaping thread */ ++ private native int waitForProcessExit(int pid); ++ ++ /** ++ * Create a process. Depending on the mode flag, this is done by ++ * one of the following mechanisms. ++ * - fork(2) and exec(2) ++ * - clone(2) and exec(2) ++ * - vfork(2) and exec(2) ++ * ++ * @param fds an array of three file descriptors. ++ * Indexes 0, 1, and 2 correspond to standard input, ++ * standard output and standard error, respectively. On ++ * input, a value of -1 means to create a pipe to connect ++ * child and parent processes. On output, a value which ++ * is not -1 is the parent pipe fd corresponding to the ++ * pipe which has been created. An element of this array ++ * is -1 on input if and only if it is <em>not</em> -1 on ++ * output. ++ * @return the pid of the subprocess ++ */ ++ private native int forkAndExec(int mode, byte[] helperpath, ++ byte[] prog, ++ byte[] argBlock, int argc, ++ byte[] envBlock, int envc, ++ byte[] dir, ++ int[] fds, ++ boolean redirectErrorStream) ++ throws IOException; ++ ++ /** ++ * The thread factory used to create "process reaper" daemon threads. ++ */ ++ private static class ProcessReaperThreadFactory implements ThreadFactory { ++ private final static ThreadGroup group = getRootThreadGroup(); ++ ++ private static ThreadGroup getRootThreadGroup() { ++ return doPrivileged(new PrivilegedAction<ThreadGroup> () { ++ public ThreadGroup run() { ++ ThreadGroup root = Thread.currentThread().getThreadGroup(); ++ while (root.getParent() != null) ++ root = root.getParent(); ++ return root; ++ }}); ++ } ++ ++ public Thread newThread(Runnable grimReaper) { ++ // Our thread stack requirement is quite modest. ++ Thread t = new Thread(group, grimReaper, "process reaper", 32768); ++ t.setDaemon(true); ++ // A small attempt (probably futile) to avoid priority inversion ++ t.setPriority(Thread.MAX_PRIORITY); ++ return t; ++ } ++ } ++ ++ /** ++ * The thread pool of "process reaper" daemon threads. ++ */ ++ private static final Executor processReaperExecutor = ++ doPrivileged(new PrivilegedAction<Executor>() { ++ public Executor run() { ++ return Executors.newCachedThreadPool ++ (new ProcessReaperThreadFactory()); ++ }}); ++ ++ UNIXProcess(final byte[] prog, ++ final byte[] argBlock, final int argc, ++ final byte[] envBlock, final int envc, ++ final byte[] dir, ++ final int[] fds, ++ final boolean redirectErrorStream) ++ throws IOException { ++ ++ pid = forkAndExec(launchMechanism.value, ++ helperpath, ++ prog, ++ argBlock, argc, ++ envBlock, envc, ++ dir, ++ fds, ++ redirectErrorStream); ++ ++ try { ++ doPrivileged(new PrivilegedExceptionAction<Void>() { ++ public Void run() throws IOException { ++ initStreams(fds); ++ return null; ++ }}); ++ } catch (PrivilegedActionException ex) { ++ throw (IOException) ex.getException(); ++ } ++ } ++ ++ static FileDescriptor newFileDescriptor(int fd) { ++ FileDescriptor fileDescriptor = new FileDescriptor(); ++ fdAccess.set(fileDescriptor, fd); ++ return fileDescriptor; ++ } ++ ++ void initStreams(int[] fds) throws IOException { ++ stdin = (fds[0] == -1) ? ++ ProcessBuilder.NullOutputStream.INSTANCE : ++ new ProcessPipeOutputStream(fds[0]); ++ ++ stdout = (fds[1] == -1) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ProcessPipeInputStream(fds[1]); ++ ++ stderr = (fds[2] == -1) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ProcessPipeInputStream(fds[2]); ++ ++ processReaperExecutor.execute(new Runnable() { ++ public void run() { ++ int exitcode = waitForProcessExit(pid); ++ UNIXProcess.this.processExited(exitcode); ++ }}); ++ } ++ ++ void processExited(int exitcode) { ++ synchronized (this) { ++ this.exitcode = exitcode; ++ hasExited = true; ++ notifyAll(); ++ } ++ ++ if (stdout instanceof ProcessPipeInputStream) ++ ((ProcessPipeInputStream) stdout).processExited(); ++ ++ if (stderr instanceof ProcessPipeInputStream) ++ ((ProcessPipeInputStream) stderr).processExited(); ++ ++ if (stdin instanceof ProcessPipeOutputStream) ++ ((ProcessPipeOutputStream) stdin).processExited(); ++ } ++ ++ public OutputStream getOutputStream() { ++ return stdin; ++ } ++ ++ public InputStream getInputStream() { ++ return stdout; ++ } ++ ++ public InputStream getErrorStream() { ++ return stderr; ++ } ++ ++ public synchronized int waitFor() throws InterruptedException { ++ while (!hasExited) { ++ wait(); ++ } ++ return exitcode; ++ } ++ ++ @Override ++ public synchronized boolean waitFor(long timeout, TimeUnit unit) ++ throws InterruptedException ++ { ++ if (hasExited) return true; ++ if (timeout <= 0) return false; ++ ++ long timeoutAsNanos = unit.toNanos(timeout); ++ long startTime = System.nanoTime(); ++ long rem = timeoutAsNanos; ++ ++ while (!hasExited && (rem > 0)) { ++ wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); ++ rem = timeoutAsNanos - (System.nanoTime() - startTime); ++ } ++ return hasExited; ++ } ++ ++ public synchronized int exitValue() { ++ if (!hasExited) { ++ throw new IllegalThreadStateException("process hasn't exited"); ++ } ++ return exitcode; ++ } ++ ++ private static native void destroyProcess(int pid, boolean force); ++ private void destroy(boolean force) { ++ // There is a risk that pid will be recycled, causing us to ++ // kill the wrong process! So we only terminate processes ++ // that appear to still be running. Even with this check, ++ // there is an unavoidable race condition here, but the window ++ // is very small, and OSes try hard to not recycle pids too ++ // soon, so this is quite safe. ++ synchronized (this) { ++ if (!hasExited) ++ destroyProcess(pid, force); ++ } ++ try { stdin.close(); } catch (IOException ignored) {} ++ try { stdout.close(); } catch (IOException ignored) {} ++ try { stderr.close(); } catch (IOException ignored) {} ++ } ++ ++ public void destroy() { ++ destroy(false); ++ } ++ ++ @Override ++ public Process destroyForcibly() { ++ destroy(true); ++ return this; ++ } ++ ++ @Override ++ public synchronized boolean isAlive() { ++ return !hasExited; ++ } ++ ++ private static native void init(); ++ ++ static { ++ init(); ++ } ++ ++ /** ++ * A buffered input stream for a subprocess pipe file descriptor ++ * that allows the underlying file descriptor to be reclaimed when ++ * the process exits, via the processExited hook. ++ * ++ * This is tricky because we do not want the user-level InputStream to be ++ * closed until the user invokes close(), and we need to continue to be ++ * able to read any buffered data lingering in the OS pipe buffer. ++ * ++ * On AIX this is especially tricky, because the 'close()' system call ++ * will block if another thread is at the same time blocked in a file ++ * operation (e.g. 'read()') on the same file descriptor. We therefore ++ * combine this 'ProcessPipeInputStream' with the DeferredCloseInputStream ++ * approach used on Solaris (see "UNIXProcess.java.solaris"). This means ++ * that every potentially blocking operation on the file descriptor ++ * increments a counter before it is executed and decrements it once it ++ * finishes. The 'close()' operation will only be executed if there are ++ * no pending operations. Otherwise it is deferred after the last pending ++ * operation has finished. ++ * ++ */ ++ static class ProcessPipeInputStream extends BufferedInputStream { ++ private final Object closeLock = new Object(); ++ private int useCount = 0; ++ private boolean closePending = false; ++ ++ ProcessPipeInputStream(int fd) { ++ super(new FileInputStream(newFileDescriptor(fd))); ++ } ++ ++ private InputStream drainInputStream(InputStream in) ++ throws IOException { ++ int n = 0; ++ int j; ++ byte[] a = null; ++ synchronized (closeLock) { ++ if (buf == null) // asynchronous close()? ++ return null; // discard ++ j = in.available(); ++ } ++ while (j > 0) { ++ a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); ++ synchronized (closeLock) { ++ if (buf == null) // asynchronous close()? ++ return null; // discard ++ n += in.read(a, n, j); ++ j = in.available(); ++ } ++ } ++ return (a == null) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); ++ } ++ ++ /** Called by the process reaper thread when the process exits. */ ++ synchronized void processExited() { ++ try { ++ InputStream in = this.in; ++ if (in != null) { ++ InputStream stragglers = drainInputStream(in); ++ in.close(); ++ this.in = stragglers; ++ } ++ } catch (IOException ignored) { } ++ } ++ ++ private void raise() { ++ synchronized (closeLock) { ++ useCount++; ++ } ++ } ++ ++ private void lower() throws IOException { ++ synchronized (closeLock) { ++ useCount--; ++ if (useCount == 0 && closePending) { ++ closePending = false; ++ super.close(); ++ } ++ } ++ } ++ ++ @Override ++ public int read() throws IOException { ++ raise(); ++ try { ++ return super.read(); ++ } finally { ++ lower(); ++ } ++ } ++ ++ @Override ++ public int read(byte[] b) throws IOException { ++ raise(); ++ try { ++ return super.read(b); ++ } finally { ++ lower(); ++ } ++ } ++ ++ @Override ++ public int read(byte[] b, int off, int len) throws IOException { ++ raise(); ++ try { ++ return super.read(b, off, len); ++ } finally { ++ lower(); ++ } ++ } ++ ++ @Override ++ public long skip(long n) throws IOException { ++ raise(); ++ try { ++ return super.skip(n); ++ } finally { ++ lower(); ++ } ++ } ++ ++ @Override ++ public int available() throws IOException { ++ raise(); ++ try { ++ return super.available(); ++ } finally { ++ lower(); ++ } ++ } ++ ++ @Override ++ public void close() throws IOException { ++ // BufferedInputStream#close() is not synchronized unlike most other methods. ++ // Synchronizing helps avoid racing with drainInputStream(). ++ synchronized (closeLock) { ++ if (useCount == 0) { ++ super.close(); ++ } ++ else { ++ closePending = true; ++ } ++ } ++ } ++ } ++ ++ /** ++ * A buffered output stream for a subprocess pipe file descriptor ++ * that allows the underlying file descriptor to be reclaimed when ++ * the process exits, via the processExited hook. ++ */ ++ static class ProcessPipeOutputStream extends BufferedOutputStream { ++ ProcessPipeOutputStream(int fd) { ++ super(new FileOutputStream(newFileDescriptor(fd))); ++ } ++ ++ /** Called by the process reaper thread when the process exits. */ ++ synchronized void processExited() { ++ OutputStream out = this.out; ++ if (out != null) { ++ try { ++ out.close(); ++ } catch (IOException ignored) { ++ // We know of no reason to get an IOException, but if ++ // we do, there's nothing else to do but carry on. ++ } ++ this.out = ProcessBuilder.NullOutputStream.INSTANCE; ++ } ++ } ++ } ++} +--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Wed Jul 30 18:42:59 2014 +0100 +@@ -342,47 +342,39 @@ + ProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } +- +- private InputStream drainInputStream(InputStream in) ++ private static byte[] drainInputStream(InputStream in) + throws IOException { + int n = 0; + int j; + byte[] a = null; +- synchronized (closeLock) { +- if (buf == null) // asynchronous close()? +- return null; // discard +- j = in.available(); ++ while ((j = in.available()) > 0) { ++ a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); ++ n += in.read(a, n, j); + } +- while (j > 0) { +- a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); +- synchronized (closeLock) { +- if (buf == null) // asynchronous close()? +- return null; // discard +- n += in.read(a, n, j); +- j = in.available(); +- } +- } +- return (a == null) ? +- ProcessBuilder.NullInputStream.INSTANCE : +- new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); ++ return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { +- try { +- InputStream in = this.in; +- if (in != null) { +- InputStream stragglers = drainInputStream(in); +- in.close(); +- this.in = stragglers; +- } +- } catch (IOException ignored) { } ++ synchronized (closeLock) { ++ try { ++ InputStream in = this.in; ++ // this stream is closed if and only if: in == null ++ if (in != null) { ++ byte[] stragglers = drainInputStream(in); ++ in.close(); ++ this.in = (stragglers == null) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ByteArrayInputStream(stragglers); ++ } ++ } catch (IOException ignored) {} ++ } + } + + @Override + public void close() throws IOException { + // BufferedInputStream#close() is not synchronized unlike most other methods. +- // Synchronizing helps avoid racing with drainInputStream(). ++ // Synchronizing helps avoid race with processExited(). + synchronized (closeLock) { + super.close(); + } +--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Wed Jul 30 18:42:59 2014 +0100 +@@ -344,47 +344,39 @@ + ProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } +- +- private InputStream drainInputStream(InputStream in) ++ private static byte[] drainInputStream(InputStream in) + throws IOException { + int n = 0; + int j; + byte[] a = null; +- synchronized (closeLock) { +- if (buf == null) // asynchronous close()? +- return null; // discard +- j = in.available(); ++ while ((j = in.available()) > 0) { ++ a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); ++ n += in.read(a, n, j); + } +- while (j > 0) { +- a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); +- synchronized (closeLock) { +- if (buf == null) // asynchronous close()? +- return null; // discard +- n += in.read(a, n, j); +- j = in.available(); +- } +- } +- return (a == null) ? +- ProcessBuilder.NullInputStream.INSTANCE : +- new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); ++ return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { +- try { +- InputStream in = this.in; +- if (in != null) { +- InputStream stragglers = drainInputStream(in); +- in.close(); +- this.in = stragglers; +- } +- } catch (IOException ignored) { } ++ synchronized (closeLock) { ++ try { ++ InputStream in = this.in; ++ // this stream is closed if and only if: in == null ++ if (in != null) { ++ byte[] stragglers = drainInputStream(in); ++ in.close(); ++ this.in = (stragglers == null) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ByteArrayInputStream(stragglers); ++ } ++ } catch (IOException ignored) {} ++ } + } + + @Override + public void close() throws IOException { + // BufferedInputStream#close() is not synchronized unlike most other methods. +- // Synchronizing helps avoid racing with drainInputStream(). ++ // Synchronizing helps avoid race with processExited(). + synchronized (closeLock) { + super.close(); + } +--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Wed Jul 30 18:42:59 2014 +0100 +@@ -25,10 +25,23 @@ + + package java.lang; + +-import java.io.*; ++import java.io.BufferedInputStream; ++import java.io.BufferedOutputStream; ++import java.io.FileDescriptor; ++import java.io.FileInputStream; ++import java.io.FileOutputStream; ++import java.io.IOException; ++import java.io.InputStream; ++import java.io.OutputStream; ++import java.util.concurrent.Executors; ++import java.util.concurrent.Executor; ++import java.util.concurrent.ThreadFactory; + import java.util.concurrent.TimeUnit; + import java.security.AccessController; ++import static java.security.AccessController.doPrivileged; + import java.security.PrivilegedAction; ++import java.security.PrivilegedActionException; ++import java.security.PrivilegedExceptionAction; + + /* java.lang.Process subclass in the UNIX environment. + * +@@ -108,14 +121,15 @@ + * - fork(2) and exec(2) + * - posix_spawn(2) + * +- * @param std_fds array of file descriptors. Indexes 0, 1, and +- * 2 correspond to standard input, standard output and +- * standard error, respectively. On input, a value of -1 +- * means to create a pipe to connect child and parent +- * processes. On output, a value which is not -1 is the +- * parent pipe fd corresponding to the pipe which has +- * been created. An element of this array is -1 on input +- * if and only if it is <em>not</em> -1 on output. ++ * @param fds an array of three file descriptors. ++ * Indexes 0, 1, and 2 correspond to standard input, ++ * standard output and standard error, respectively. On ++ * input, a value of -1 means to create a pipe to connect ++ * child and parent processes. On output, a value which ++ * is not -1 is the parent pipe fd corresponding to the ++ * pipe which has been created. An element of this array ++ * is -1 on input if and only if it is <em>not</em> -1 on ++ * output. + * @return the pid of the subprocess + */ + private native int forkAndExec(int mode, byte[] helperpath, +@@ -123,15 +137,51 @@ + byte[] argBlock, int argc, + byte[] envBlock, int envc, + byte[] dir, +- int[] std_fds, ++ int[] fds, + boolean redirectErrorStream) + throws IOException; + ++ /** ++ * The thread factory used to create "process reaper" daemon threads. ++ */ ++ private static class ProcessReaperThreadFactory implements ThreadFactory { ++ private final static ThreadGroup group = getRootThreadGroup(); ++ ++ private static ThreadGroup getRootThreadGroup() { ++ return doPrivileged(new PrivilegedAction<ThreadGroup> () { ++ public ThreadGroup run() { ++ ThreadGroup root = Thread.currentThread().getThreadGroup(); ++ while (root.getParent() != null) ++ root = root.getParent(); ++ return root; ++ }}); ++ } ++ ++ public Thread newThread(Runnable grimReaper) { ++ // Our thread stack requirement is quite modest. ++ Thread t = new Thread(group, grimReaper, "process reaper", 32768); ++ t.setDaemon(true); ++ // A small attempt (probably futile) to avoid priority inversion ++ t.setPriority(Thread.MAX_PRIORITY); ++ return t; ++ } ++ } ++ ++ /** ++ * The thread pool of "process reaper" daemon threads. ++ */ ++ private static final Executor processReaperExecutor = ++ doPrivileged(new PrivilegedAction<Executor>() { ++ public Executor run() { ++ return Executors.newCachedThreadPool ++ (new ProcessReaperThreadFactory()); ++ }}); ++ + UNIXProcess(final byte[] prog, + final byte[] argBlock, int argc, + final byte[] envBlock, int envc, + final byte[] dir, +- final int[] std_fds, ++ final int[] fds, + final boolean redirectErrorStream) + throws IOException { + pid = forkAndExec(launchMechanism.value, +@@ -140,63 +190,62 @@ + argBlock, argc, + envBlock, envc, + dir, +- std_fds, ++ fds, + redirectErrorStream); + +- java.security.AccessController.doPrivileged( +- new java.security.PrivilegedAction<Void>() { public Void run() { +- if (std_fds[0] == -1) +- stdin_stream = ProcessBuilder.NullOutputStream.INSTANCE; +- else { +- FileDescriptor stdin_fd = new FileDescriptor(); +- fdAccess.set(stdin_fd, std_fds[0]); +- stdin_stream = new BufferedOutputStream( +- new FileOutputStream(stdin_fd)); +- } ++ try { ++ doPrivileged( ++ new PrivilegedExceptionAction<Void>() { ++ public Void run() throws IOException { ++ initStreams(fds); ++ return null; ++ } ++ }); ++ } catch (PrivilegedActionException ex) { ++ throw (IOException) ex.getException(); ++ } ++ } + +- if (std_fds[1] == -1) +- stdout_stream = ProcessBuilder.NullInputStream.INSTANCE; +- else { +- FileDescriptor stdout_fd = new FileDescriptor(); +- fdAccess.set(stdout_fd, std_fds[1]); +- stdout_inner_stream = new DeferredCloseInputStream(stdout_fd); +- stdout_stream = new BufferedInputStream(stdout_inner_stream); +- } ++ void initStreams(int[] fds) throws IOException { ++ if (fds[0] == -1) ++ stdin_stream = ProcessBuilder.NullOutputStream.INSTANCE; ++ else { ++ FileDescriptor stdin_fd = new FileDescriptor(); ++ fdAccess.set(stdin_fd, fds[0]); ++ stdin_stream = new BufferedOutputStream( ++ new FileOutputStream(stdin_fd)); ++ } + +- if (std_fds[2] == -1) +- stderr_stream = ProcessBuilder.NullInputStream.INSTANCE; +- else { +- FileDescriptor stderr_fd = new FileDescriptor(); +- fdAccess.set(stderr_fd, std_fds[2]); +- stderr_stream = new DeferredCloseInputStream(stderr_fd); +- } ++ if (fds[1] == -1) ++ stdout_stream = ProcessBuilder.NullInputStream.INSTANCE; ++ else { ++ FileDescriptor stdout_fd = new FileDescriptor(); ++ fdAccess.set(stdout_fd, fds[1]); ++ stdout_inner_stream = new DeferredCloseInputStream(stdout_fd); ++ stdout_stream = new BufferedInputStream(stdout_inner_stream); ++ } + +- return null; }}); ++ if (fds[2] == -1) ++ stderr_stream = ProcessBuilder.NullInputStream.INSTANCE; ++ else { ++ FileDescriptor stderr_fd = new FileDescriptor(); ++ fdAccess.set(stderr_fd, fds[2]); ++ stderr_stream = new DeferredCloseInputStream(stderr_fd); ++ } + +- /* +- * For each subprocess forked a corresponding reaper thread +- * is started. That thread is the only thread which waits +- * for the subprocess to terminate and it doesn't hold any +- * locks while doing so. This design allows waitFor() and +- * exitStatus() to be safely executed in parallel (and they +- * need no native code). +- */ ++ processReaperExecutor.execute(new Runnable() { ++ public void run() { ++ int exitcode = waitForProcessExit(pid); ++ UNIXProcess.this.processExited(exitcode); ++ }}); ++ } + +- java.security.AccessController.doPrivileged( +- new java.security.PrivilegedAction<Void>() { public Void run() { +- Thread t = new Thread("process reaper") { +- public void run() { +- int res = waitForProcessExit(pid); +- synchronized (UNIXProcess.this) { +- hasExited = true; +- exitcode = res; +- UNIXProcess.this.notifyAll(); +- } +- } +- }; +- t.setDaemon(true); +- t.start(); +- return null; }}); ++ void processExited(int exitcode) { ++ synchronized (this) { ++ this.exitcode = exitcode; ++ hasExited = true; ++ notifyAll(); ++ } + } + + public OutputStream getOutputStream() { +--- ./jdk/src/solaris/classes/java/net/PlainDatagramSocketImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/java/net/PlainDatagramSocketImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,6 +25,11 @@ + package java.net; + + import java.io.IOException; ++import java.util.Set; ++import java.util.HashSet; ++import java.util.Collections; ++import jdk.net.*; ++import static sun.net.ExtendedOptionsImpl.*; + + /* + * On Unix systems we simply delegate to native methods. +@@ -38,6 +43,32 @@ + init(); + } + ++ protected <T> void setOption(SocketOption<T> name, T value) throws IOException { ++ if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) { ++ super.setOption(name, value); ++ } else { ++ if (isClosed()) { ++ throw new SocketException("Socket closed"); ++ } ++ checkSetOptionPermission(name); ++ checkValueType(value, SocketFlow.class); ++ setFlowOption(getFileDescriptor(), (SocketFlow)value); ++ } ++ } ++ ++ protected <T> T getOption(SocketOption<T> name) throws IOException { ++ if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) { ++ return super.getOption(name); ++ } ++ if (isClosed()) { ++ throw new SocketException("Socket closed"); ++ } ++ checkGetOptionPermission(name); ++ SocketFlow flow = SocketFlow.create(); ++ getFlowOption(getFileDescriptor(), flow); ++ return (T)flow; ++ } ++ + protected synchronized native void bind0(int lport, InetAddress laddr) + throws SocketException; + +--- ./jdk/src/solaris/classes/java/net/PlainSocketImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/java/net/PlainSocketImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -26,6 +26,12 @@ + + import java.io.IOException; + import java.io.FileDescriptor; ++import java.util.Set; ++import java.util.HashSet; ++import java.util.Collections; ++import jdk.net.*; ++ ++import static sun.net.ExtendedOptionsImpl.*; + + /* + * On Unix systems we simply delegate to native methods. +@@ -51,6 +57,32 @@ + this.fd = fd; + } + ++ protected <T> void setOption(SocketOption<T> name, T value) throws IOException { ++ if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) { ++ super.setOption(name, value); ++ } else { ++ if (isClosedOrPending()) { ++ throw new SocketException("Socket closed"); ++ } ++ checkSetOptionPermission(name); ++ checkValueType(value, SocketFlow.class); ++ setFlowOption(getFileDescriptor(), (SocketFlow)value); ++ } ++ } ++ ++ protected <T> T getOption(SocketOption<T> name) throws IOException { ++ if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) { ++ return super.getOption(name); ++ } ++ if (isClosedOrPending()) { ++ throw new SocketException("Socket closed"); ++ } ++ checkGetOptionPermission(name); ++ SocketFlow flow = SocketFlow.create(); ++ getFlowOption(getFileDescriptor(), flow); ++ return (T)flow; ++ } ++ + native void socketCreate(boolean isServer) throws IOException; + + native void socketConnect(InetAddress address, int port, int timeout) +@@ -77,5 +109,4 @@ + native int socketGetOption(int opt, Object iaContainerObj) throws SocketException; + + native void socketSendUrgentData(int data) throws IOException; +- + } +--- ./jdk/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2010, 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 +@@ -24,7 +24,6 @@ + */ + package sun.awt.X11; + +-import java.awt.Dialog; + import java.awt.FileDialog; + import java.awt.peer.FileDialogPeer; + import java.io.File; +@@ -36,15 +35,15 @@ + * + * @author Costantino Cerbo (c.cerbo@gmail.com) + */ +-class GtkFileDialogPeer extends XDialogPeer implements FileDialogPeer { ++final class GtkFileDialogPeer extends XDialogPeer implements FileDialogPeer { + +- private FileDialog fd; ++ private final FileDialog fd; + + // A pointer to the native GTK FileChooser widget + private volatile long widget = 0L; + +- public GtkFileDialogPeer(FileDialog fd) { +- super((Dialog) fd); ++ GtkFileDialogPeer(FileDialog fd) { ++ super(fd); + this.fd = fd; + } + +@@ -172,9 +171,7 @@ + dirname = file.getParent(); + } + } +- GtkFileDialogPeer.this.run(fd.getTitle(), fd.getMode(), dirname, +- filename, fd.getFilenameFilter(), +- fd.isMultipleMode(), fd.getX(), fd.getY()); ++ run(fd.getTitle(), fd.getMode(), dirname, filename, ++ fd.getFilenameFilter(), fd.isMultipleMode(), fd.getX(), fd.getY()); + } +- + } +--- ./jdk/src/solaris/classes/sun/awt/X11/XDataTransferer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XDataTransferer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -77,11 +77,9 @@ + + private static XDataTransferer transferer; + +- static XDataTransferer getInstanceImpl() { +- synchronized (XDataTransferer.class) { +- if (transferer == null) { +- transferer = new XDataTransferer(); +- } ++ static synchronized XDataTransferer getInstanceImpl() { ++ if (transferer == null) { ++ transferer = new XDataTransferer(); + } + return transferer; + } +@@ -411,7 +409,7 @@ + if (df.getRepresentationClass() != null && + (df.isRepresentationClassInputStream() || + df.isRepresentationClassByteBuffer() || +- byteArrayClass.equals(df.getRepresentationClass()))) { ++ byte[].class.equals(df.getRepresentationClass()))) { + natives.add(mimeType); + } + +--- ./jdk/src/solaris/classes/sun/awt/X11/XErrorHandlerUtil.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XErrorHandlerUtil.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -97,6 +97,7 @@ + * @param handler the synthetic error handler to set + */ + public static void WITH_XERROR_HANDLER(XErrorHandler handler) { ++ XSync(); + saved_error = null; + current_error_handler = handler; + } +@@ -105,15 +106,9 @@ + * Unsets a current synthetic error handler. Must be called with the acquired AWT lock. + */ + public static void RESTORE_XERROR_HANDLER() { +- RESTORE_XERROR_HANDLER(true); +- } +- +- private static void RESTORE_XERROR_HANDLER(boolean doXSync) { +- if (doXSync) { +- // Wait until all requests are processed by the X server +- // and only then uninstall the error handler. +- XSync(); +- } ++ // Wait until all requests are processed by the X server ++ // and only then uninstall the error handler. ++ XSync(); + current_error_handler = null; + } + +--- ./jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XFramePeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -284,6 +284,11 @@ + if (stateLog.isLoggable(PlatformLogger.Level.FINER)) { + stateLog.finer("DeIconifying " + this); + } ++ ++ XNETProtocol net_protocol = XWM.getWM().getNETProtocol(); ++ if (net_protocol != null) { ++ net_protocol.setActiveWindow(this); ++ } + xSetVisible(true); + } + } +--- ./jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Wed Jul 30 18:42:59 2014 +0100 +@@ -213,7 +213,7 @@ + * If window is showing then it uses ClientMessage, otherwise adjusts NET_WM_STATE list + * @param window Window which NET_WM_STATE property is being modified + * @param state State atom to be set/reset +- * @param reset Indicates operation, 'set' if false, 'reset' if true ++ * @param set Indicates operation, 'set' if false, 'reset' if true + */ + private void setStateHelper(XWindowPeer window, XAtom state, boolean set) { + if (log.isLoggable(PlatformLogger.Level.FINER)) { +@@ -249,6 +249,7 @@ + XAtom XA_UTF8_STRING = XAtom.get("UTF8_STRING"); /* like STRING but encoding is UTF-8 */ + XAtom XA_NET_SUPPORTING_WM_CHECK = XAtom.get("_NET_SUPPORTING_WM_CHECK"); + XAtom XA_NET_SUPPORTED = XAtom.get("_NET_SUPPORTED"); /* list of protocols (property of root) */ ++ XAtom XA_NET_ACTIVE_WINDOW = XAtom.get("_NET_ACTIVE_WINDOW"); + XAtom XA_NET_WM_NAME = XAtom.get("_NET_WM_NAME"); /* window property */ + XAtom XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE");/* both window property and request */ + +@@ -325,6 +326,32 @@ + return res; + } + ++ public void setActiveWindow(XWindow window) { ++ if (!active() || !checkProtocol(XA_NET_SUPPORTED, XA_NET_ACTIVE_WINDOW)) { ++ return; ++ } ++ ++ XClientMessageEvent msg = new XClientMessageEvent(); ++ msg.zero(); ++ msg.set_type(XConstants.ClientMessage); ++ msg.set_message_type(XA_NET_ACTIVE_WINDOW.getAtom()); ++ msg.set_display(XToolkit.getDisplay()); ++ msg.set_window(window.getWindow()); ++ msg.set_format(32); ++ msg.set_data(0, 1); ++ msg.set_data(1, XToolkit.getCurrentServerTime()); ++ msg.set_data(2, 0); ++ ++ XToolkit.awtLock(); ++ try { ++ XlibWrapper.XSendEvent(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), false, ++ XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask, msg.getPData()); ++ } finally { ++ XToolkit.awtUnlock(); ++ msg.dispose(); ++ } ++ } ++ + boolean isWMName(String name) { + if (!active()) { + return false; +--- ./jdk/src/solaris/classes/sun/awt/X11/XRepaintArea.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XRepaintArea.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2011, 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 +@@ -28,8 +28,8 @@ + + import java.awt.Component; + import java.awt.Graphics; ++ + import sun.awt.RepaintArea; +-import java.awt.peer.ComponentPeer; + + /** + * The <code>RepaintArea</code> is a geometric construct created for the +@@ -39,24 +39,15 @@ + * + * @author Eric Hawkes + */ +-class XRepaintArea extends RepaintArea { +- +- /** +- * Constructs a new <code>XRepaintArea</code> +- * @since 1.3 +- */ +- public XRepaintArea() { +- } ++final class XRepaintArea extends RepaintArea { + + /** + * Calls <code>Component.update(Graphics)</code> with given Graphics. + */ + protected void updateComponent(Component comp, Graphics g) { + if (comp != null) { +- final XComponentPeer peer = (XComponentPeer) comp.getPeer(); +- if (peer != null) { +- peer.paintPeer(g); +- } ++ // We don't call peer.paintPeer() here, because we shouldn't paint ++ // native component when processing UPDATE events. + super.updateComponent(comp, g); + } + } +--- ./jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Wed Jul 30 18:42:59 2014 +0100 +@@ -47,6 +47,7 @@ + import javax.swing.LookAndFeel; + import javax.swing.UIDefaults; + import sun.awt.*; ++import sun.awt.datatransfer.DataTransferer; + import sun.font.FontConfigManager; + import sun.java2d.SunGraphicsEnvironment; + import sun.misc.*; +@@ -292,8 +293,6 @@ + return awtAppClassName; + } + +- static final String DATA_TRANSFERER_CLASS_NAME = "sun.awt.X11.XDataTransferer"; +- + public XToolkit() { + super(); + if (PerformanceLogger.loggingEnabled()) { +@@ -315,7 +314,6 @@ + + init(); + XWM.init(); +- SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME); + toolkitThread = AccessController.doPrivileged((PrivilegedAction<Thread>) () -> { + Thread thread = new Thread(sun.misc.ThreadGroupUtils.getRootThreadGroup(), XToolkit.this, "AWT-XAWT"); + thread.setContextClassLoader(null); +@@ -1108,6 +1106,11 @@ + return false; + } + ++ @Override ++ public DataTransferer getDataTransferer() { ++ return XDataTransferer.getInstanceImpl(); ++ } ++ + /** + * Returns the supported cursor size + */ +--- ./jdk/src/solaris/classes/sun/awt/windows/ThemeReader.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/windows/ThemeReader.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2004, 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 +@@ -25,7 +25,10 @@ + + package sun.awt.windows; + +-import java.awt.*; ++import java.awt.Color; ++import java.awt.Dimension; ++import java.awt.Insets; ++import java.awt.Point; + + + /** +@@ -36,7 +39,8 @@ + * + * @author Leif Samuelsson + */ +-public class ThemeReader { ++public final class ThemeReader { ++ + public static boolean isThemed() { + return false; + } +@@ -84,16 +88,18 @@ + public static Dimension getPartSize(String widget, int part, int state) { + return null; + } ++ + public static long getThemeTransitionDuration(String widget, int part, + int stateFrom, int stateTo, int propId) { + return 0; + } ++ + public static boolean isGetThemeTransitionDurationDefined() { + return false; + } ++ + public static Insets getThemeBackgroundContentMargins(String widget, + int part, int state, int boundingWidth, int boundingHeight) { + return null; + } +- + } +--- ./jdk/src/solaris/classes/sun/net/PortConfig.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/net/PortConfig.java Wed Jul 30 18:42:59 2014 +0100 +@@ -55,6 +55,14 @@ + } else if (os.contains("OS X")) { + defaultLower = 49152; + defaultUpper = 65535; ++ } else if (os.startsWith("AIX")) { ++ // The ephemeral port is OS version dependent on AIX: ++ // http://publib.boulder.ibm.com/infocenter/aix/v7r1/topic/com.ibm.aix.rsct315.admin/bl503_ephport.htm ++ // However, on AIX 5.3 / 6.1 / 7.1 we always see the ++ // settings below by using: ++ // /usr/sbin/no -a | fgrep ephemeral ++ defaultLower = 32768; ++ defaultUpper = 65535; + } else { + throw new InternalError( + "sun.net.PortConfig: unknown OS"); +--- ./jdk/src/solaris/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java Wed Jul 30 18:42:59 2014 +0100 +@@ -68,6 +68,8 @@ + return createProvider("sun.nio.ch.LinuxAsynchronousChannelProvider"); + if (osname.contains("OS X")) + return createProvider("sun.nio.ch.BsdAsynchronousChannelProvider"); ++ if (osname.equals("AIX")) ++ return createProvider("sun.nio.ch.AixAsynchronousChannelProvider"); + throw new InternalError("platform not recognized"); + } + } +--- ./jdk/src/solaris/classes/sun/nio/ch/EPollPort.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/EPollPort.java Wed Jul 30 18:42:59 2014 +0100 +@@ -93,7 +93,7 @@ + try { + socketpair(sv); + // register one end with epoll +- epollCtl(epfd, EPOLL_CTL_ADD, sv[0], POLLIN); ++ epollCtl(epfd, EPOLL_CTL_ADD, sv[0], Net.POLLIN); + } catch (IOException x) { + close0(epfd); + throw x; +--- ./jdk/src/solaris/classes/sun/nio/ch/KQueuePort.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/KQueuePort.java Wed Jul 30 18:42:59 2014 +0100 +@@ -172,9 +172,9 @@ + // TBD: Measure cost of EV_ONESHOT vs. EV_CLEAR, either will do here. + int err = 0; + int flags = (EV_ADD|EV_ONESHOT); +- if ((events & Port.POLLIN) > 0) ++ if ((events & Net.POLLIN) > 0) + err = keventRegister(kqfd, fd, EVFILT_READ, flags); +- if (err == 0 && (events & Port.POLLOUT) > 0) ++ if (err == 0 && (events & Net.POLLOUT) > 0) + err = keventRegister(kqfd, fd, EVFILT_WRITE, flags); + if (err != 0) + throw new InternalError("kevent failed: " + err); // should not happen +@@ -227,9 +227,9 @@ + int filter = getFilter(keventAddress); + int events = 0; + if (filter == EVFILT_READ) +- events = Port.POLLIN; ++ events = Net.POLLIN; + else if (filter == EVFILT_WRITE) +- events = Port.POLLOUT; ++ events = Net.POLLOUT; + + Event ev = new Event(channel, events); + +--- ./jdk/src/solaris/classes/sun/nio/ch/PollArrayWrapper.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/PollArrayWrapper.java Wed Jul 30 18:42:59 2014 +0100 +@@ -43,8 +43,6 @@ + + public class PollArrayWrapper extends AbstractPollArrayWrapper { + +- public static final short POLLCONN = POLLOUT; +- + // File descriptor to write for interrupt + int interruptFD; + +@@ -58,7 +56,7 @@ + void initInterrupt(int fd0, int fd1) { + interruptFD = fd1; + putDescriptor(0, fd0); +- putEventOps(0, POLLIN); ++ putEventOps(0, Net.POLLIN); + putReventOps(0, 0); + } + +--- ./jdk/src/solaris/classes/sun/nio/ch/Port.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/Port.java Wed Jul 30 18:42:59 2014 +0100 +@@ -40,10 +40,6 @@ + */ + + abstract class Port extends AsynchronousChannelGroupImpl { +- static final short POLLIN = 0x0001; +- static final short POLLOUT = 0x0004; +- static final short POLLERR = 0x0008; +- static final short POLLHUP = 0x0010; + + /** + * Implemented by clients registered with this port. +@@ -77,11 +73,21 @@ + } + + /** ++ * Callback method for implementations that need special handling when fd is ++ * removed (currently only needed in the AIX-Port - see AixPollPort.java). ++ */ ++ protected void preUnregister(int fd) { ++ // Do nothing by default. ++ } ++ ++ /** + * Unregister channel identified by its file descriptor + */ + final void unregister(int fd) { + boolean checkForShutdown = false; + ++ preUnregister(fd); ++ + fdToChannelLock.writeLock().lock(); + try { + fdToChannel.remove(Integer.valueOf(fd)); +--- ./jdk/src/solaris/classes/sun/nio/ch/SinkChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/SinkChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -118,17 +118,16 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) ++ if ((ops & Net.POLLNVAL) != 0) + throw new Error("POLLNVAL detected"); + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLOUT) != 0) && ++ if (((ops & Net.POLLOUT) != 0) && + ((intOps & SelectionKey.OP_WRITE) != 0)) + newOps |= SelectionKey.OP_WRITE; + +@@ -146,7 +145,7 @@ + + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + if (ops == SelectionKey.OP_WRITE) +- ops = PollArrayWrapper.POLLOUT; ++ ops = Net.POLLOUT; + sk.selector.putEventOps(sk, ops); + } + +--- ./jdk/src/solaris/classes/sun/nio/ch/SourceChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/SourceChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -118,17 +118,16 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) ++ if ((ops & Net.POLLNVAL) != 0) + throw new Error("POLLNVAL detected"); + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLIN) != 0) && ++ if (((ops & Net.POLLIN) != 0) && + ((intOps & SelectionKey.OP_READ) != 0)) + newOps |= SelectionKey.OP_READ; + +@@ -146,7 +145,7 @@ + + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + if (ops == SelectionKey.OP_READ) +- ops = PollArrayWrapper.POLLIN; ++ ops = Net.POLLIN; + sk.selector.putEventOps(sk, ops); + } + +--- ./jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousServerSocketChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -148,7 +148,7 @@ + synchronized (updateLock) { + acceptPending = true; + } +- port.startPoll(fdVal, Port.POLLIN); ++ port.startPoll(fdVal, Net.POLLIN); + return; + } + +@@ -299,7 +299,7 @@ + } + + // register for connections +- port.startPoll(fdVal, Port.POLLIN); ++ port.startPoll(fdVal, Net.POLLIN); + return result; + } + } catch (Throwable x) { +--- ./jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/UnixAsynchronousSocketChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -142,9 +142,9 @@ + assert Thread.holdsLock(updateLock); + int events = 0; + if (readPending) +- events |= Port.POLLIN; ++ events |= Net.POLLIN; + if (connectPending || writePending) +- events |= Port.POLLOUT; ++ events |= Net.POLLOUT; + if (events != 0) + port.startPoll(fdVal, events); + } +@@ -204,9 +204,9 @@ + */ + @Override + public void onEvent(int events, boolean mayInvokeDirect) { +- boolean readable = (events & Port.POLLIN) > 0; +- boolean writable = (events & Port.POLLOUT) > 0; +- if ((events & (Port.POLLERR | Port.POLLHUP)) > 0) { ++ boolean readable = (events & Net.POLLIN) > 0; ++ boolean writable = (events & Net.POLLOUT) > 0; ++ if ((events & (Net.POLLERR | Net.POLLHUP)) > 0) { + readable = true; + writable = true; + } +--- ./jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -593,15 +593,14 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) { ++ if ((ops & Net.POLLNVAL) != 0) { + /* This should only happen if this channel is pre-closed while a + * selection operation is in progress + * ## Throw an error if this channel has not been pre-closed */ + return false; + } + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + /* No need to poll again in checkConnect, +@@ -610,19 +609,19 @@ + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLIN) != 0) && ++ if (((ops & Net.POLLIN) != 0) && + ((intOps & SelectionKey.OP_READ) != 0) && + isConnected()) + newOps |= SelectionKey.OP_READ; + +- if (((ops & PollArrayWrapper.POLLCONN) != 0) && ++ if (((ops & Net.POLLCONN) != 0) && + ((intOps & SelectionKey.OP_CONNECT) != 0) && + ((state == ChannelState.UNCONNECTED) || (state == ChannelState.PENDING))) { + newOps |= SelectionKey.OP_CONNECT; + readyToConnect = true; + } + +- if (((ops & PollArrayWrapper.POLLOUT) != 0) && ++ if (((ops & Net.POLLOUT) != 0) && + ((intOps & SelectionKey.OP_WRITE) != 0) && + isConnected()) + newOps |= SelectionKey.OP_WRITE; +@@ -646,11 +645,11 @@ + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + int newOps = 0; + if ((ops & SelectionKey.OP_READ) != 0) +- newOps |= PollArrayWrapper.POLLIN; ++ newOps |= Net.POLLIN; + if ((ops & SelectionKey.OP_WRITE) != 0) +- newOps |= PollArrayWrapper.POLLOUT; ++ newOps |= Net.POLLOUT; + if ((ops & SelectionKey.OP_CONNECT) != 0) +- newOps |= PollArrayWrapper.POLLCONN; ++ newOps |= Net.POLLCONN; + sk.selector.putEventOps(sk, newOps); + } + +--- ./jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -321,25 +321,24 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) { ++ if ((ops & Net.POLLNVAL) != 0) { + /* This should only happen if this channel is pre-closed while a + * selection operation is in progress + * ## Throw an error if this channel has not been pre-closed */ + return false; + } + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLIN) != 0) && ++ if (((ops & Net.POLLIN) != 0) && + ((intOps & SelectionKey.OP_READ) != 0)) + newOps |= SelectionKey.OP_READ; + +- if (((ops & PollArrayWrapper.POLLOUT) != 0) && ++ if (((ops & Net.POLLOUT) != 0) && + ((intOps & SelectionKey.OP_WRITE) != 0)) + newOps |= SelectionKey.OP_WRITE; + +@@ -361,9 +360,9 @@ + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + int newOps = 0; + if ((ops & SelectionKey.OP_READ) != 0) +- newOps |= PollArrayWrapper.POLLIN; ++ newOps |= Net.POLLIN; + if ((ops & SelectionKey.OP_WRITE) != 0) +- newOps |= PollArrayWrapper.POLLOUT; ++ newOps |= Net.POLLOUT; + sk.selector.putEventOps(sk, newOps); + } + +--- ./jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -314,21 +314,20 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) { ++ if ((ops & Net.POLLNVAL) != 0) { + /* This should only happen if this channel is pre-closed while a + * selection operation is in progress + * ## Throw an error if this channel has not been pre-closed */ + return false; + } + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLIN) != 0) && ++ if (((ops & Net.POLLIN) != 0) && + ((intOps & SelectionKey.OP_ACCEPT) != 0)) + newOps |= SelectionKey.OP_ACCEPT; + +@@ -352,7 +351,7 @@ + + /* Translate ops */ + if ((ops & SelectionKey.OP_ACCEPT) != 0) +- newOps |= PollArrayWrapper.POLLIN; ++ newOps |= Net.POLLIN; + /* Place ops into pollfd array */ + sk.selector.putEventOps(sk, newOps); + +--- ./jdk/src/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java Wed Jul 30 18:42:59 2014 +0100 +@@ -63,6 +63,8 @@ + return createProvider("sun.nio.fs.LinuxFileSystemProvider"); + if (osname.contains("OS X")) + return createProvider("sun.nio.fs.MacOSXFileSystemProvider"); ++ if (osname.equals("AIX")) ++ return createProvider("sun.nio.fs.AixFileSystemProvider"); + throw new AssertionError("Platform not recognized"); + } + } +--- ./jdk/src/solaris/classes/sun/nio/fs/SolarisUserDefinedFileAttributeView.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/fs/SolarisUserDefinedFileAttributeView.java Wed Jul 30 18:42:59 2014 +0100 +@@ -149,7 +149,7 @@ + int afd = openat(fd, nameAsBytes(file,name), (O_RDONLY|O_XATTR), 0); + + // wrap with channel +- FileChannel fc = UnixChannelFactory.newFileChannel(afd, true, false); ++ FileChannel fc = UnixChannelFactory.newFileChannel(afd, file.toString(), true, false); + + // read to EOF (nothing we can do if I/O error occurs) + try { +@@ -190,7 +190,7 @@ + UnixFileModeAttribute.ALL_PERMISSIONS); + + // wrap with channel +- FileChannel fc = UnixChannelFactory.newFileChannel(afd, false, true); ++ FileChannel fc = UnixChannelFactory.newFileChannel(afd, file.toString(), false, true); + + // write value (nothing we can do if I/O error occurs) + try { +--- ./jdk/src/solaris/classes/sun/nio/fs/UnixChannelFactory.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/fs/UnixChannelFactory.java Wed Jul 30 18:42:59 2014 +0100 +@@ -100,10 +100,10 @@ + /** + * Constructs a file channel from an existing (open) file descriptor + */ +- static FileChannel newFileChannel(int fd, boolean reading, boolean writing) { ++ static FileChannel newFileChannel(int fd, String path, boolean reading, boolean writing) { + FileDescriptor fdObj = new FileDescriptor(); + fdAccess.set(fdObj, fd); +- return FileChannelImpl.open(fdObj, reading, writing, null); ++ return FileChannelImpl.open(fdObj, path, reading, writing, null); + } + + /** +@@ -134,7 +134,7 @@ + throw new IllegalArgumentException("APPEND + TRUNCATE_EXISTING not allowed"); + + FileDescriptor fdObj = open(dfd, path, pathForPermissionCheck, flags, mode); +- return FileChannelImpl.open(fdObj, flags.read, flags.write, flags.append, null); ++ return FileChannelImpl.open(fdObj, path.toString(), flags.read, flags.write, flags.append, null); + } + + /** +--- ./jdk/src/solaris/classes/sun/nio/fs/UnixFileSystemProvider.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/fs/UnixFileSystemProvider.java Wed Jul 30 18:42:59 2014 +0100 +@@ -375,11 +375,12 @@ + UnixPath dir = UnixPath.toUnixPath(obj); + dir.checkWrite(); + +- int mode = UnixFileModeAttribute +- .toUnixMode(UnixFileModeAttribute.ALL_PERMISSIONS, attrs); ++ int mode = UnixFileModeAttribute.toUnixMode(UnixFileModeAttribute.ALL_PERMISSIONS, attrs); + try { + mkdir(dir, mode); + } catch (UnixException x) { ++ if (x.errno() == EISDIR) ++ throw new FileAlreadyExistsException(dir.toString()); + x.rethrowAsIOException(dir); + } + } +--- ./jdk/src/solaris/classes/sun/nio/fs/UnixPath.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/fs/UnixPath.java Wed Jul 30 18:42:59 2014 +0100 +@@ -482,7 +482,7 @@ + @Override + public Path normalize() { + final int count = getNameCount(); +- if (count == 0) ++ if (count == 0 || isEmpty()) + return this; + + boolean[] ignore = new boolean[count]; // true => ignore name +--- ./jdk/src/solaris/classes/sun/print/CUPSPrinter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/print/CUPSPrinter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -252,6 +252,7 @@ + try { + return urlConnection.getOutputStream(); + } catch (Exception e) { ++ IPPPrintService.debug_println(debugPrefix+e); + } + return null; + } +@@ -282,6 +283,9 @@ + + if (responseMap != null && responseMap.length > 0) { + defaultMap = responseMap[0]; ++ } else { ++ IPPPrintService.debug_println(debugPrefix+ ++ " empty response map for GET_DEFAULT."); + } + + if (defaultMap == null) { +@@ -310,7 +314,10 @@ + + if (attribClass != null) { + printerInfo[0] = attribClass.getStringValue(); +- attribClass = (AttributeClass)defaultMap.get("device-uri"); ++ attribClass = (AttributeClass) ++ defaultMap.get("printer-uri-supported"); ++ IPPPrintService.debug_println(debugPrefix+ ++ "printer-uri-supported="+attribClass); + if (attribClass != null) { + printerInfo[1] = attribClass.getStringValue(); + } else { +--- ./jdk/src/solaris/classes/sun/print/IPPPrintService.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/print/IPPPrintService.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1906,9 +1906,8 @@ + new HashMap[respList.size()]); + } else { + debug_println(debugPrefix+ +- "readIPPResponse client error, IPP status code-" +- +Integer.toHexString(response[2])+" & " +- +Integer.toHexString(response[3])); ++ "readIPPResponse client error, IPP status code: 0x"+ ++ toHex(response[2]) + toHex(response[3])); + return null; + } + +@@ -1921,6 +1920,10 @@ + } + } + ++ private static String toHex(byte v) { ++ String s = Integer.toHexString(v&0xff); ++ return (s.length() == 2) ? s : "0"+s; ++ } + + public String toString() { + return "IPP Printer : " + getName(); +--- ./jdk/src/solaris/classes/sun/print/UnixPrintService.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/print/UnixPrintService.java Wed Jul 30 18:42:59 2014 +0100 +@@ -28,6 +28,7 @@ + import java.io.File; + import java.net.URI; + import java.net.URISyntaxException; ++import java.util.ArrayList; + import java.util.Locale; + + import javax.print.DocFlavor; +@@ -273,11 +274,58 @@ + return PrinterIsAcceptingJobs.NOT_ACCEPTING_JOBS ; + } + ++ // Filter the list of possible AIX Printers and remove header lines ++ // and extra lines which have been added for remote printers. ++ // 'protected' because this method is also used from UnixPrintServiceLookup. ++ protected static String[] filterPrinterNamesAIX(String[] posPrinters) { ++ ArrayList printers = new ArrayList(); ++ String [] splitPart; ++ ++ for(int i = 0; i < posPrinters.length; i++) { ++ // Remove the header lines ++ if (posPrinters[i].startsWith("---") || ++ posPrinters[i].startsWith("Queue") || ++ posPrinters[i].equals("")) continue; ++ ++ // Check if there is a ":" in the end of the first colomn. ++ // This means that it is not a valid printer definition. ++ splitPart = posPrinters[i].split(" "); ++ if(splitPart.length >= 1 && !splitPart[0].trim().endsWith(":")) { ++ printers.add(posPrinters[i]); ++ } ++ } ++ ++ return (String[])printers.toArray(new String[printers.size()]); ++ } ++ ++ private PrinterIsAcceptingJobs getPrinterIsAcceptingJobsAIX() { ++ // On AIX there should not be a blank after '-a'. ++ String command = "/usr/bin/lpstat -a" + printer; ++ String results[]= UnixPrintServiceLookup.execCmd(command); ++ ++ // Remove headers and bogus entries added by remote printers. ++ results = filterPrinterNamesAIX(results); ++ ++ if (results != null && results.length > 0) { ++ for (int i = 0; i < results.length; i++) { ++ if (results[i].contains("READY") || ++ results[i].contains("RUNNING")) { ++ return PrinterIsAcceptingJobs.ACCEPTING_JOBS; ++ } ++ } ++ } ++ ++ return PrinterIsAcceptingJobs.NOT_ACCEPTING_JOBS; ++ ++ } ++ + private PrinterIsAcceptingJobs getPrinterIsAcceptingJobs() { + if (UnixPrintServiceLookup.isSysV()) { + return getPrinterIsAcceptingJobsSysV(); + } else if (UnixPrintServiceLookup.isBSD()) { + return getPrinterIsAcceptingJobsBSD(); ++ } else if (UnixPrintServiceLookup.isAIX()) { ++ return getPrinterIsAcceptingJobsAIX(); + } else { + return PrinterIsAcceptingJobs.ACCEPTING_JOBS; + } +@@ -345,11 +393,32 @@ + return new QueuedJobCount(qlen); + } + ++ private QueuedJobCount getQueuedJobCountAIX() { ++ // On AIX there should not be a blank after '-a'. ++ String command = "/usr/bin/lpstat -a" + printer; ++ String results[]= UnixPrintServiceLookup.execCmd(command); ++ ++ // Remove headers and bogus entries added by remote printers. ++ results = filterPrinterNamesAIX(results); ++ ++ int qlen = 0; ++ if (results != null && results.length > 0){ ++ for (int i = 0; i < results.length; i++) { ++ if (results[i].contains("QUEUED")){ ++ qlen ++; ++ } ++ } ++ } ++ return new QueuedJobCount(qlen); ++ } ++ + private QueuedJobCount getQueuedJobCount() { + if (UnixPrintServiceLookup.isSysV()) { + return getQueuedJobCountSysV(); + } else if (UnixPrintServiceLookup.isBSD()) { + return getQueuedJobCountBSD(); ++ } else if (UnixPrintServiceLookup.isAIX()) { ++ return getQueuedJobCountAIX(); + } else { + return new QueuedJobCount(0); + } +@@ -369,6 +438,13 @@ + return attrs; + } + ++ private PrintServiceAttributeSet getAIXServiceAttributes() { ++ PrintServiceAttributeSet attrs = new HashPrintServiceAttributeSet(); ++ attrs.add(getQueuedJobCountAIX()); ++ attrs.add(getPrinterIsAcceptingJobsAIX()); ++ return attrs; ++ } ++ + private boolean isSupportedCopies(Copies copies) { + int numCopies = copies.getValue(); + return (numCopies > 0 && numCopies < MAXCOPIES); +@@ -394,6 +470,8 @@ + private PrintServiceAttributeSet getDynamicAttributes() { + if (UnixPrintServiceLookup.isSysV()) { + return getSysVServiceAttributes(); ++ } else if (UnixPrintServiceLookup.isAIX()) { ++ return getAIXServiceAttributes(); + } else { + return getBSDServiceAttributes(); + } +--- ./jdk/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Wed Jul 30 18:42:59 2014 +0100 +@@ -78,6 +78,19 @@ + + static String osname; + ++ // List of commands used to deal with the printer queues on AIX ++ String[] lpNameComAix = { ++ "/usr/bin/lsallq", ++ "/usr/bin/lpstat -W -p|/usr/bin/expand|/usr/bin/cut -f1 -d' '", ++ "/usr/bin/lpstat -W -d|/usr/bin/expand|/usr/bin/cut -f1 -d' '", ++ "/usr/bin/lpstat -W -v" ++ }; ++ private static final int aix_lsallq = 0; ++ private static final int aix_lpstat_p = 1; ++ private static final int aix_lpstat_d = 2; ++ private static final int aix_lpstat_v = 3; ++ private static int aix_defaultPrinterEnumeration = aix_lsallq; ++ + static { + /* The system property "sun.java2d.print.polling" + * can be used to force the printing code to poll or not poll +@@ -114,6 +127,24 @@ + + osname = java.security.AccessController.doPrivileged( + new sun.security.action.GetPropertyAction("os.name")); ++ ++ /* The system property "sun.java2d.print.aix.lpstat" ++ * can be used to force the usage of 'lpstat -p' to enumerate all ++ * printer queues. By default we use 'lsallq', because 'lpstat -p' can ++ * take lots of time if thousands of printers are attached to a server. ++ */ ++ if (isAIX()) { ++ String aixPrinterEnumerator = java.security.AccessController.doPrivileged( ++ new sun.security.action.GetPropertyAction("sun.java2d.print.aix.lpstat")); ++ ++ if (aixPrinterEnumerator != null) { ++ if (aixPrinterEnumerator.equalsIgnoreCase("lpstat")) { ++ aix_defaultPrinterEnumeration = aix_lpstat_p; ++ } else if (aixPrinterEnumerator.equalsIgnoreCase("lsallq")) { ++ aix_defaultPrinterEnumeration = aix_lsallq; ++ } ++ } ++ } + } + + static boolean isMac() { +@@ -133,6 +164,10 @@ + osname.contains("OS X")); + } + ++ static boolean isAIX() { ++ return osname.equals("AIX"); ++ } ++ + static final int UNINITIALIZED = -1; + static final int BSD_LPD = 0; + static final int BSD_LPD_NG = 1; +@@ -238,9 +273,25 @@ + String[] printers = null; // array of printer names + String[] printerURIs = null; //array of printer URIs + +- getDefaultPrintService(); ++ try { ++ getDefaultPrintService(); ++ } catch (Throwable t) { ++ IPPPrintService.debug_println(debugPrefix+ ++ "Exception getting default printer : " + t); ++ } + if (CUPSPrinter.isCupsRunning()) { +- printerURIs = CUPSPrinter.getAllPrinters(); ++ try { ++ printerURIs = CUPSPrinter.getAllPrinters(); ++ IPPPrintService.debug_println("CUPS URIs = " + printerURIs); ++ if (printerURIs != null) { ++ for (int p = 0; p < printerURIs.length; p++) { ++ IPPPrintService.debug_println("URI="+printerURIs[p]); ++ } ++ } ++ } catch (Throwable t) { ++ IPPPrintService.debug_println(debugPrefix+ ++ "Exception getting all CUPS printers : " + t); ++ } + if ((printerURIs != null) && (printerURIs.length > 0)) { + printers = new String[printerURIs.length]; + for (int i=0; i<printerURIs.length; i++) { +@@ -251,6 +302,8 @@ + } else { + if (isMac() || isSysV()) { + printers = getAllPrinterNamesSysV(); ++ } else if (isAIX()) { ++ printers = getAllPrinterNamesAIX(); + } else { //BSD + printers = getAllPrinterNamesBSD(); + } +@@ -435,6 +488,8 @@ + PrintService printer = null; + if (isMac() || isSysV()) { + printer = getNamedPrinterNameSysV(name); ++ } else if (isAIX()) { ++ printer = getNamedPrinterNameAIX(name); + } else { + printer = getNamedPrinterNameBSD(name); + } +@@ -595,11 +650,15 @@ + (CUPSPrinter.isCupsRunning())); + if (CUPSPrinter.isCupsRunning()) { + String[] printerInfo = CUPSPrinter.getDefaultPrinter(); +- defaultPrinter = printerInfo[0]; +- psuri = printerInfo[1]; ++ if (printerInfo != null && printerInfo.length >= 2) { ++ defaultPrinter = printerInfo[0]; ++ psuri = printerInfo[1]; ++ } + } else { + if (isMac() || isSysV()) { + defaultPrinter = getDefaultPrinterNameSysV(); ++ } else if (isAIX()) { ++ defaultPrinter = getDefaultPrinterNameAIX(); + } else { + defaultPrinter = getDefaultPrinterNameBSD(); + } +@@ -774,11 +833,49 @@ + return (String[])printerNames.toArray(new String[printerNames.size()]); + } + ++ private String getDefaultPrinterNameAIX() { ++ String[] names = execCmd(lpNameComAix[aix_lpstat_d]); ++ // Remove headers and bogus entries added by remote printers. ++ names = UnixPrintService.filterPrinterNamesAIX(names); ++ if (names == null || names.length != 1) { ++ // No default printer found ++ return null; ++ } else { ++ return names[0]; ++ } ++ } ++ ++ private PrintService getNamedPrinterNameAIX(String name) { ++ // On AIX there should be no blank after '-v'. ++ String[] result = execCmd(lpNameComAix[aix_lpstat_v] + name); ++ // Remove headers and bogus entries added by remote printers. ++ result = UnixPrintService.filterPrinterNamesAIX(result); ++ if (result == null || result.length != 1) { ++ return null; ++ } else { ++ return new UnixPrintService(name); ++ } ++ } ++ ++ private String[] getAllPrinterNamesAIX() { ++ // Determine all printers of the system. ++ String [] names = execCmd(lpNameComAix[aix_defaultPrinterEnumeration]); ++ ++ // Remove headers and bogus entries added by remote printers. ++ names = UnixPrintService.filterPrinterNamesAIX(names); ++ ++ ArrayList<String> printerNames = new ArrayList<String>(); ++ for ( int i=0; i < names.length; i++) { ++ printerNames.add(names[i]); ++ } ++ return (String[])printerNames.toArray(new String[printerNames.size()]); ++ } ++ + static String[] execCmd(final String command) { + ArrayList results = null; + try { + final String[] cmd = new String[3]; +- if (isSysV()) { ++ if (isSysV() || isAIX()) { + cmd[0] = "/usr/bin/sh"; + cmd[1] = "-c"; + cmd[2] = "env LC_ALL=C " + command; +--- ./jdk/src/solaris/demo/jvmti/hprof/hprof_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/demo/jvmti/hprof/hprof_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -42,7 +42,7 @@ + #include <sys/stat.h> + #include <fcntl.h> + +-#if !defined(LINUX) && !defined(_ALLBSD_SOURCE) ++#if !defined(LINUX) && !defined(_ALLBSD_SOURCE) && !defined(AIX) + #include <procfs.h> + #endif + +@@ -65,6 +65,10 @@ + #include "jvm_md.h" + #include "hprof.h" + ++#ifdef AIX ++#include "porting_aix.h" /* For the 'dladdr' function. */ ++#endif ++ + int + md_getpid(void) + { +@@ -86,7 +90,7 @@ + void + md_init(void) + { +-#if defined(LINUX) || defined(_ALLBSD_SOURCE) ++#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) + /* No Hi-Res timer option? */ + #else + if ( gdata->micro_state_accounting ) { +@@ -253,7 +257,7 @@ + jlong + md_get_microsecs(void) + { +-#if defined(LINUX) || defined(_ALLBSD_SOURCE) ++#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) + return (jlong)(md_timeofday() * (jlong)1000); /* Milli to micro */ + #else + return (jlong)(gethrtime()/(hrtime_t)1000); /* Nano seconds to micro seconds */ +@@ -271,7 +275,7 @@ + jlong + md_get_thread_cpu_timemillis(void) + { +-#if defined(LINUX) || defined(_ALLBSD_SOURCE) ++#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) + return md_timeofday(); + #else + return (jlong)(gethrvtime()/1000); /* Nano seconds to milli seconds */ +@@ -286,7 +290,7 @@ + Dl_info dlinfo; + + libdir[0] = 0; +-#if defined(LINUX) || defined(_ALLBSD_SOURCE) ++#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX) + addr = (void*)&Agent_OnLoad; + #else + /* Just using &Agent_OnLoad will get the first external symbol with +@@ -457,3 +461,5 @@ + sym = dlsym(handle, name); + return sym; + } ++ ++ +--- ./jdk/src/solaris/doc/sun/man/man1/ja/appletviewer.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/appletviewer.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: appletviewer +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: appletviewer ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "appletviewer" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + appletviewer \- Web¥Ö¥é¥¦¥¶¤Î³°Â¦¤Ç¥¢¥×¥ì¥Ã¥È¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIappletviewer\fR [\fIoptions\fR] \fIurl\fR\&.\&.\&. ++\fBappletviewer\fR [\fIoptions\fR] \fIurl\fR\&.\&.\&. + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIurl\fR +@@ -73,20 +75,20 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ï\fIurls\fR¤Ë»ØÄꤵ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¢¤ë¤¤¤Ï¥ê¥½¡¼¥¹¤ÈÀܳ¤·¤Æ¡¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤¬»²¾È¤¹¤ë¤½¤ì¤¾¤ì¤Î¥¢¥×¥ì¥Ã¥È¤òÆȼ«¤Î¥¦¥£¥ó¥É¥¦¤Çɽ¼¨¤·¤Þ¤¹¡£urls¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¬¡¢\fIOBJECT\fR¡¢\fIEMBED\fR¤Þ¤¿¤Ï\fIAPPLET\fR¥¿¥°¤Ç¤É¤Î¥¢¥×¥ì¥Ã¥È¤â»²¾È¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ï²¿¤â¹Ô¤¤¤Þ¤»¤ó¡£\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëHTML¥¿¥°¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/appletviewertags\&.html¤Ë¤¢¤ë ++\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ï\fIurls\fR¤Ë»ØÄꤵ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¢¤ë¤¤¤Ï¥ê¥½¡¼¥¹¤ÈÀܳ¤·¤Æ¡¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤¬»²¾È¤¹¤ë¤½¤ì¤¾¤ì¤Î¥¢¥×¥ì¥Ã¥È¤òÆȼ«¤Î¥¦¥£¥ó¥É¥¦¤Çɽ¼¨¤·¤Þ¤¹¡£urls¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¬¡¢\fBOBJECT\fR¡¢\fBEMBED\fR¤Þ¤¿¤Ï\fBAPPLET\fR¥¿¥°¤Ç¤É¤Î¥¢¥×¥ì¥Ã¥È¤â»²¾È¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ï²¿¤â¹Ô¤¤¤Þ¤»¤ó¡£\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëHTML¥¿¥°¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/appletviewertags\&.html¤Ë¤¢¤ë + ¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¡¦¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ï¡¢RFC2396¤ÇÄêµÁ¤µ¤ì¤¿¥¨¥¹¥±¡¼¥×¡¦¥á¥«¥Ë¥º¥à¤Ë½¾¤Ã¤Æ¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿URL¤òɬÍפȤ·¤Þ¤¹¡£¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤Î¤Ï¡¢¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿URL¤Î¤ß¤Ç¤¹¡£¤¿¤À¤·¡¢¥Õ¥¡¥¤¥ë̾¤Ë¤Ä¤¤¤Æ¤Ï¡¢RFC2396¤Î»ÅÍͤ˽¾¤Ã¤Æ¥¨¥ó¥³¡¼¥É¤ò²ò½ü¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ï¡¢RFC2396¤ÇÄêµÁ¤µ¤ì¤¿¥¨¥¹¥±¡¼¥×¡¦¥á¥«¥Ë¥º¥à¤Ë½¾¤Ã¤Æ¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿URL¤òɬÍפȤ·¤Þ¤¹¡£¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤Î¤Ï¡¢¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿URL¤Î¤ß¤Ç¤¹¡£¤¿¤À¤·¡¢¥Õ¥¡¥¤¥ë̾¤Ë¤Ä¤¤¤Æ¤Ï¡¢RFC2396¤Î»ÅÍͤ˽¾¤Ã¤Æ¥¨¥ó¥³¡¼¥É¤ò²ò½ü¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR + The +-\fIappletviewer\fR¥³¥Þ¥ó¥É¤Ï³«È¯ÀìÍѤǤ¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/samples/aboutCodeSamples\&.html¤Ë¤¢¤ë ++\fBappletviewer\fR¥³¥Þ¥ó¥É¤Ï³«È¯ÀìÍѤǤ¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/samples/aboutCodeSamples\&.html¤Ë¤¢¤ë + ¥µ¥ó¥×¥ë/¥Æ¥¹¥È¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ª¤è¤Ó¥³¡¼¥É¤Ë¤Ä¤¤¤Æ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-debug + .RS 4 +-\fIjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJava¥Ç¥Ð¥Ã¥¬¤Ç¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¤ò³«»Ï¤·¤Æ¡¢¥É¥­¥å¥á¥ó¥ÈÃæ¤Î¥¢¥×¥ì¥Ã¥È¤ò¥Ç¥Ð¥Ã¥°¤·¤Þ¤¹¡£ ++\fBjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJava¥Ç¥Ð¥Ã¥¬¤Ç¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¤ò³«»Ï¤·¤Æ¡¢¥É¥­¥å¥á¥ó¥ÈÃæ¤Î¥¢¥×¥ì¥Ã¥È¤ò¥Ç¥Ð¥Ã¥°¤·¤Þ¤¹¡£ + .RE + .PP + \-encoding \fIencoding\-name\fR +@@ -96,7 +98,7 @@ + .PP + \-J\fIjavaoption\fR + .RS 4 +-ʸ»úÎó\fIjavaoption\fR¤Ï¡¢¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¤ò¼Â¹Ô¤¹¤ëJava¥¤¥ó¥¿¥×¥ê¥¿¤Ë1¤Ä¤Î°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤Þ¤¹¡£°ú¿ô¤Ë¥¹¥Ú¡¼¥¹¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£Ê£¿ô¤Î°ú¿ô¤Ï¡¢¤¹¤Ù¤Æ¤¬ÀÜƬ¼­\fI\-J\fR¤Ç»Ï¤Þ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤÎÄ´À°¤ËÍ­¸ú¤Ç¤¹¡£ ++ʸ»úÎó\fBjavaoption\fR¤Ï¡¢¥¢¥×¥ì¥Ã¥È¡¦¥Ó¥å¡¼¥¢¤ò¼Â¹Ô¤¹¤ëJava¥¤¥ó¥¿¥×¥ê¥¿¤Ë1¤Ä¤Î°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤Þ¤¹¡£°ú¿ô¤Ë¥¹¥Ú¡¼¥¹¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£Ê£¿ô¤Î°ú¿ô¤Ï¡¢¤¹¤Ù¤Æ¤¬ÀÜƬ¼­\fB\-J\fR¤Ç»Ï¤Þ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤÎÄ´À°¤ËÍ­¸ú¤Ç¤¹¡£ + .RE + .PP + +--- ./jdk/src/solaris/doc/sun/man/man1/ja/extcheck.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/extcheck.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: extcheck +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: extcheck ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "extcheck" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + extcheck \- ¥¿¡¼¥²¥Ã¥È¤ÎJava¥¢¡¼¥«¥¤¥Ö(JAR)¥Õ¥¡¥¤¥ë¤È¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë³ÈÄ¥µ¡Ç½¤ÎJAR¥Õ¥¡¥¤¥ë´Ö¤Î¥Ð¡¼¥¸¥ç¥ó¤Î¶¥¹ç¤ò¸¡½Ð¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIextcheck\fR [\fIoptions\fR] \fItargetfile\&.jar\fR ++\fBextcheck\fR [\fIoptions\fR] \fItargetfile\&.jar\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fItargetfile\&.jar\fR +@@ -73,13 +75,13 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Î¥¿¥¤¥È¥ë¤ª¤è¤Ó¥Ð¡¼¥¸¥ç¥ó¤¬Java SE SDK¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë³ÈÄ¥µ¡Ç½¤È¶¥¹ç¤·¤Æ¤¤¤Ê¤¤¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¤ò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ëÁ°¤Ë¡¢¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ·¤Æ¡¢Æ±¤¸¥Ð¡¼¥¸¥ç¥ó¤Þ¤¿¤Ï¤è¤ê¿·¤·¤¤¥Ð¡¼¥¸¥ç¥ó¤Î³ÈÄ¥µ¡Ç½¤¬¤¹¤Ç¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Î¥¿¥¤¥È¥ë¤ª¤è¤Ó¥Ð¡¼¥¸¥ç¥ó¤¬Java SE SDK¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë³ÈÄ¥µ¡Ç½¤È¶¥¹ç¤·¤Æ¤¤¤Ê¤¤¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¤ò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ëÁ°¤Ë¡¢¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ·¤Æ¡¢Æ±¤¸¥Ð¡¼¥¸¥ç¥ó¤Þ¤¿¤Ï¤è¤ê¿·¤·¤¤¥Ð¡¼¥¸¥ç¥ó¤Î³ÈÄ¥µ¡Ç½¤¬¤¹¤Ç¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢\fItargetfile\&.jar\fR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î¥Ø¥Ã¥À¡¼Specification\-title¤ª¤è¤ÓSpecification\-version¤ò¡¢³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥Ø¥Ã¥À¡¼¤ÈÈæ³Ó¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢Oracle Solaris¤Î¾ì¹ç¤Ï\fIjre/lib/ext\fR¡¢Windows¤Î¾ì¹ç¤Ï\fI\ejre\elib\eext\fR¤Ç¤¹¡£\fIextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjava\&.lang\&.Package\&.isCompatibleWith\fR¥á¥½¥Ã¥É¤ÈƱÍͤÎÊýË¡¤Ç¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òÈæ³Ó¤·¤Þ¤¹¡£ ++\fBextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBtargetfile\&.jar\fR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î¥Ø¥Ã¥À¡¼Specification\-title¤ª¤è¤ÓSpecification\-version¤ò¡¢³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥Ø¥Ã¥À¡¼¤ÈÈæ³Ó¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢Oracle Solaris¤Î¾ì¹ç¤Ï\fBjre/lib/ext\fR¡¢Windows¤Î¾ì¹ç¤Ï\fB\ejre\elib\eext\fR¤Ç¤¹¡£\fBextcheck\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBjava\&.lang\&.Package\&.isCompatibleWith\fR¥á¥½¥Ã¥É¤ÈƱÍͤÎÊýË¡¤Ç¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤òÈæ³Ó¤·¤Þ¤¹¡£ + .PP + ¶¥¹ç¤¬¸¡½Ð¤µ¤ì¤Ê¤¤¾ì¹ç¡¢¥ê¥¿¡¼¥ó¡¦¥³¡¼¥É¤Ï0¤Ç¤¹¡£ + .PP +-³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¤¤º¤ì¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¡¢Æ±°ì¤Î\fISpecification\-title\fR¡¢¤ª¤è¤ÓƱ°ì¤Þ¤¿¤Ï¤è¤ê¿·¤·¤¤\fISpecification\-version\fRÈֹ椬¤¢¤ë¾ì¹ç¤Ï¡¢¥¼¥í¤Ç¤Ê¤¤¥¨¥é¡¼¡¦¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£\fItargetfile\&.jar\fR¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë\fISpecification\-title\fR¤Þ¤¿¤Ï\fISpecification\-version\fR°À­¤¬¤Ê¤¤¾ì¹ç¤â¡¢¥¼¥í¤Ç¤Ê¤¤¥¨¥é¡¼¡¦¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£ ++³ÈÄ¥µ¡Ç½¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¤¤º¤ì¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¡¢Æ±°ì¤Î\fBSpecification\-title\fR¡¢¤ª¤è¤ÓƱ°ì¤Þ¤¿¤Ï¤è¤ê¿·¤·¤¤\fBSpecification\-version\fRÈֹ椬¤¢¤ë¾ì¹ç¤Ï¡¢¥¼¥í¤Ç¤Ê¤¤¥¨¥é¡¼¡¦¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£\fBtargetfile\&.jar\fR¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë\fBSpecification\-title\fR¤Þ¤¿¤Ï\fBSpecification\-version\fR°À­¤¬¤Ê¤¤¾ì¹ç¤â¡¢¥¼¥í¤Ç¤Ê¤¤¥¨¥é¡¼¡¦¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-verbose +@@ -89,7 +91,7 @@ + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine (JVM)¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/idlj.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/idlj.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: idlj +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: idlj ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "idlj" "1" "2013ǯ11·î21Æü" "JDK 8" "Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + idlj \- »ØÄꤵ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹ÄêµÁ¸À¸ì(IDL)¥Õ¥¡¥¤¥ë¤ËÂФ·¤ÆJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIidlj\fR [ \fIoptions\fR ] \fIidlfile\fR ++\fBidlj\fR [ \fIoptions\fR ] \fIidlfile\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£options¤Î½çÈÖ¤ÏǤ°Õ¤Ç¤¹¤¬¡¢\fIidlfile\fR¤è¤ê¤âÁ°¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£options¤Î½çÈÖ¤ÏǤ°Õ¤Ç¤¹¤¬¡¢\fBidlfile\fR¤è¤ê¤âÁ°¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \fIidlfile\fR +@@ -76,16 +78,17 @@ + IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Ï¡¢»ØÄꤵ¤ì¤¿IDL¥Õ¥¡¥¤¥ë¤ËÂФ·¤ÆJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/mapping/jidlMapping\&.html¤Ë¤¢¤ë + Java IDL: Java¸À¸ì¥Þ¥Ã¥Ô¥ó¥°¤Ø¤ÎIDL¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Î°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤ÎÃæ¤Ë¤Ï¡¢\fIidltojava\fR¤È¤¤¤¦Ì¾Á°¤À¤Ã¤¿¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£ ++IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Î°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤ÎÃæ¤Ë¤Ï¡¢\fBidltojava\fR¤È¤¤¤¦Ì¾Á°¤À¤Ã¤¿¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£ + .SS "¥¯¥é¥¤¥¢¥ó¥È¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ª¤è¤Ó¥µ¡¼¥Ð¡¼¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Îȯ¹Ô" + .PP +-¼¡¤Î\fIidlj\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò´Þ¤à\fIMy\&.idl\fR¤È¤¤¤¦Ì¾Á°¤ÎIDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ ++¼¡¤Î\fBidlj\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò´Þ¤à\fBMy\&.idl\fR¤È¤¤¤¦Ì¾Á°¤ÎIDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj My\&.idl ++\fBidlj My\&.idl\fR ++ + .fi + .if n \{\ + .RE +@@ -97,7 +100,8 @@ + .RS 4 + .\} + .nf +-idlj \-fclient My\&.idl ++\fBidlj \-fclient My\&.idl\fR ++ + .fi + .if n \{\ + .RE +@@ -109,7 +113,8 @@ + .RS 4 + .\} + .nf +-idlg \-fserver My\&.idl ++\fBidlg \-fserver My\&.idl\fR ++ + .fi + .if n \{\ + .RE +@@ -121,102 +126,78 @@ + .RS 4 + .\} + .nf +-idlj \-fclient \-fserver My\&.idl +-idlj \-fall My\&.idl ++\fBidlj \-fclient \-fserver My\&.idl\fR ++\fBidlj \-fall My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP + ¥µ¡¼¥Ð¡¼Â¦¤Ç²Äǽ¤Ê¥â¥Ç¥ë¤Ï2¤Ä¤¢¤ê¤Þ¤¹¡£°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë¤ÈTie¥â¥Ç¥ë¤Ç¤¹¡£Tie°Ñ¾ù¥â¥Ç¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.if n \{\ +-.sp +-.\} +-.RS 4 +-.it 1 an-trap +-.nr an-no-space-flag 1 +-.nr an-break-flag 1 +-.br +-.ps +1 +-\fB°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë\fR +-.ps -1 +-.br + .PP +-¥Ç¥Õ¥©¥ë¥È¤Î¥µ¡¼¥Ð¡¼Â¦¤Î¥â¥Ç¥ë¤Ï¡¢°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë¤Ç¤¹¡£\fIMy\&.idl\fRÆâ¤Ç\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fIMyPOA\&.java\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¡¢\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fIMyPOA\fR¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIMyPOA\&.java\fR¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/api/org/omg/PortableServer/Servant\&.html¤Ë¤¢¤ë +-\fIorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤ò³ÈÄ¥¤¹¤ë¥¹¥È¥ê¡¼¥à¥Ù¡¼¥¹¤Î¥¹¥±¥ë¥È¥ó¤Ç¤¹¡£ ++\fB°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë\fR. ¥Ç¥Õ¥©¥ë¥È¤Î¥µ¡¼¥Ð¡¼Â¦¤Î¥â¥Ç¥ë¤Ï¡¢°Ü¿£²Äǽ¥µ¡¼¥Ð¥ó¥È·Ñ¾µ¥â¥Ç¥ë¤Ç¤¹¡£\fBMy\&.idl\fRÆâ¤Ç\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fBMyPOA\&.java\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¡¢\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fBMyPOA\fR¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBMyPOA\&.java\fR¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/api/org/omg/PortableServer/Servant\&.html¤Ë¤¢¤ë ++\fBorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤ò³ÈÄ¥¤¹¤ë¥¹¥È¥ê¡¼¥à¥Ù¡¼¥¹¤Î¥¹¥±¥ë¥È¥ó¤Ç¤¹¡£ + .PP +-\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢¥¹¥±¥ë¥È¥ó¤¬¼ÂÁõ¤¹¤ëIDL¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë\fIcallHandler\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÈÁàºî¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤Þ¤¹¡£ ++\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢¥¹¥±¥ë¥È¥ó¤¬¼ÂÁõ¤¹¤ëIDL¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë\fBcallHandler\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÈÁàºî¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤·¤Þ¤¹¡£ + .PP +-¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤Î\fIPortableServer\fR¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¤Î\fIServant\fR·¿¤òÄêµÁ¤·¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/POA\&.html¤Ë¤¢¤ë ++¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤Î\fBPortableServer\fR¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¤Î\fBServant\fR·¿¤òÄêµÁ¤·¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/POA\&.html¤Ë¤¢¤ë + ¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢\fIServant\fR·¿¤ÏJava¤Î\fIorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤Ë¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤ÎPOA¥µ¡¼¥Ð¥ó¥È¼ÂÁõ¤Î¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤È¤·¤Æµ¡Ç½¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¸Æ¤Ó½Ð¤¹¤³¤È¤Î¤Ç¤­¤ë¤¤¤¯¤Ä¤«¤Î¥á¥½¥Ã¥É¡¢¤ª¤è¤ÓPOA¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¡¢¥µ¡¼¥Ð¥ó¥È¤ÎÆ°ºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë¥æ¡¼¥¶¡¼¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤ë¥á¥½¥Ã¥É¤òÄ󶡤·¤Þ¤¹¡£ ++Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢\fBServant\fR·¿¤ÏJava¤Î\fBorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤Ë¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤ÎPOA¥µ¡¼¥Ð¥ó¥È¼ÂÁõ¤Î¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤È¤·¤Æµ¡Ç½¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¸Æ¤Ó½Ð¤¹¤³¤È¤Î¤Ç¤­¤ë¤¤¤¯¤Ä¤«¤Î¥á¥½¥Ã¥É¡¢¤ª¤è¤ÓPOA¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¡¢¥µ¡¼¥Ð¥ó¥È¤ÎÆ°ºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë¥æ¡¼¥¶¡¼¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤ë¥á¥½¥Ã¥É¤òÄ󶡤·¤Þ¤¹¡£ + .PP +-·Ñ¾µ¥â¥Ç¥ë¤Î¤â¤¦1¤Ä¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-oldImplBase\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤Æ¡¢Java SE 1\&.4¤è¤êÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¸ß´¹À­¤Î¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤¹¤ë¤³¤È¤Ç¤¹¡£\-\fIoldImplBase\fR¥Õ¥é¥°¤ÏÈóɸ½à¤Ç¡¢¤³¤ì¤é¤ÎAPI¤ÏÈó¿ä¾©¤Ç¤¹¡£¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤Î¤Ï¡¢Java SE 1\&.3¤Çµ­½Ò¤µ¤ì¤¿´û¸¤Î¥µ¡¼¥Ð¡¼¤È¤Î¸ß´¹À­¤¬É¬Íפʾì¹ç¤Î¤ß¤Ç¤¹¡£¤½¤Î¾ì¹ç¡¢´û¸¤Îmake¥Õ¥¡¥¤¥ë¤òÊѹ¹¤·¤Æ¡¢\fI\-oldImplBase\fR¥Õ¥é¥°¤ò\fIidlj\fR¥³¥ó¥Ñ¥¤¥é¤ËÄɲ乤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢POA¥Ù¡¼¥¹¤Î¥µ¡¼¥Ð¡¼Â¦¥Þ¥Ã¥Ô¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£²¼°Ì¸ß´¹À­¤Î¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¼Â¹Ô¤·¤Þ¤¹¡£ +-.sp .5v +-.RE ++·Ñ¾µ¥â¥Ç¥ë¤Î¤â¤¦1¤Ä¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-oldImplBase\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤Æ¡¢Java SE 1\&.4¤è¤êÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¸ß´¹À­¤Î¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤¹¤ë¤³¤È¤Ç¤¹¡£\-\fBoldImplBase\fR¥Õ¥é¥°¤ÏÈóɸ½à¤Ç¡¢¤³¤ì¤é¤ÎAPI¤ÏÈó¿ä¾©¤Ç¤¹¡£¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤Î¤Ï¡¢Java SE 1\&.3¤Çµ­½Ò¤µ¤ì¤¿´û¸¤Î¥µ¡¼¥Ð¡¼¤È¤Î¸ß´¹À­¤¬É¬Íפʾì¹ç¤Î¤ß¤Ç¤¹¡£¤½¤Î¾ì¹ç¡¢´û¸¤Îmake¥Õ¥¡¥¤¥ë¤òÊѹ¹¤·¤Æ¡¢\fB\-oldImplBase\fR¥Õ¥é¥°¤ò\fBidlj\fR¥³¥ó¥Ñ¥¤¥é¤ËÄɲ乤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢POA¥Ù¡¼¥¹¤Î¥µ¡¼¥Ð¡¼Â¦¥Þ¥Ã¥Ô¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¸åÊý¸ß´¹À­¤Î¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-fclient \-fserver \-oldImplBase My\&.idl +-idlj \-fall \-oldImplBase My\&.idl ++\fBidlj \-fclient \-fserver \-oldImplBase My\&.idl\fR ++\fBidlj \-fall \-oldImplBase My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIMy\&.idl\fRÆâ¤Ç\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fI_MyImplBase\&.java\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¡¢\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fI_MyImplBase\fR¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.if n \{\ +-.sp +-.\} +-.RS 4 +-.it 1 an-trap +-.nr an-no-space-flag 1 +-.nr an-break-flag 1 +-.br +-.ps +1 +-\fBTie°Ñ¾ù¥â¥Ç¥ë\fR +-.ps -1 +-.br ++\fBMy\&.idl\fRÆâ¤Ç\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fB_MyImplBase\&.java\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¡¢\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fB_MyImplBase\fR¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¤â¤¦1¤Ä¤Î¥µ¡¼¥Ð¡¼Â¦¥â¥Ç¥ë¤Ï¡¢Tie¥â¥Ç¥ë¤È¸Æ¤Ð¤ì¤ë¤â¤Î¤Ç¤¹¡£¤³¤Î¥µ¡¼¥Ð¡¼Â¦¥â¥Ç¥ë¤Ï¡¢°Ñ¾ù¥â¥Ç¥ë¤Ç¤¹¡£Tie¤È¥¹¥±¥ë¥È¥ó¤òƱ»þ¤ËÀ¸À®¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤¿¤á¡¢¤½¤ì¤é¤ÏÊÌ¡¹¤ËÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢Tie¥â¥Ç¥ëÍѤΥХ¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ +-.sp .5v +-.RE ++\fBTie°Ñ¾ù¥â¥Ç¥ë\fR. ¤â¤¦1¤Ä¤Î¥µ¡¼¥Ð¡¼Â¦¥â¥Ç¥ë¤Ï¡¢Tie¥â¥Ç¥ë¤È¸Æ¤Ð¤ì¤ë¤â¤Î¤Ç¤¹¡£¤³¤Î¥µ¡¼¥Ð¡¼Â¦¥â¥Ç¥ë¤Ï¡¢°Ñ¾ù¥â¥Ç¥ë¤Ç¤¹¡£Tie¤È¥¹¥±¥ë¥È¥ó¤òƱ»þ¤ËÀ¸À®¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤¿¤á¡¢¤½¤ì¤é¤ÏÊÌ¡¹¤ËÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢Tie¥â¥Ç¥ëÍѤΥХ¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-fall My\&.idl +-idlj \-fallTIE My\&.idl ++\fBidlj \-fall My\&.idl\fR ++\fBidlj \-fallTIE My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢2ÈÖÌܤΥ³¥Þ¥ó¥É¤Ë¤è¤ê¡¢\fIMyPOATie\&.java\fR¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fIMyPOATie\fR¥¯¥é¥¹¤Ø¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢delegate¤ò¼è¤ê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎPOA¥â¥Ç¥ë¤ò»ÈÍѤ·¤Æ¤¤¤ë¤¿¤á¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Ë¤âPOA¤¬É¬ÍפǤ¹¡£delegate¤ËÂФ·¤Æ¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤³¤Î¼ÂÁõ¤Ï\fIMyOperations\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ë¤Î¤ß¤Ç¡¢¤½¤Î¾¤Î¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤òORB¤È°ì½ï¤Ë»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¼¡¤Î¤è¤¦¤Ë\fIMyPOATie\fR¥¯¥é¥¹Æâ¤Ç¼ÂÁõ¤ò¥é¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢2ÈÖÌܤΥ³¥Þ¥ó¥É¤Ë¤è¤ê¡¢\fBMyPOATie\&.java\fR¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fBMyPOATie\fR¥¯¥é¥¹¤Ø¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢delegate¤ò¼è¤ê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎPOA¥â¥Ç¥ë¤ò»ÈÍѤ·¤Æ¤¤¤ë¤¿¤á¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Ë¤âPOA¤¬É¬ÍפǤ¹¡£delegate¤ËÂФ·¤Æ¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤³¤Î¼ÂÁõ¤Ï\fBMyOperations\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ë¤Î¤ß¤Ç¡¢¤½¤Î¾¤Î¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤òORB¤È°ì½ï¤Ë»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¼¡¤Î¤è¤¦¤Ë\fBMyPOATie\fR¥¯¥é¥¹Æâ¤Ç¼ÂÁõ¤ò¥é¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-ORB orb = ORB\&.init(args, System\&.getProperties()); ++\fBORB orb = ORB\&.init(args, System\&.getProperties());\fR ++\fB \fR ++\fB// Get reference to rootpoa & activate the POAManager\fR ++\fBPOA rootpoa = (POA)orb\&.resolve_initial_references("RootPOA");\fR ++\fBrootpoa\&.the_POAManager()\&.activate();\fR ++\fB \fR ++\fB// create servant and register it with the ORB\fR ++\fBMyServant myDelegate = new MyServant();\fR ++\fBmyDelegate\&.setORB(orb); \fR ++\fB \fR ++\fB// create a tie, with servant being the delegate\&.\fR ++\fBMyPOATie tie = new MyPOATie(myDelegate, rootpoa);\fR ++\fB \fR ++\fB// obtain the objectRef for the tie\fR ++\fBMy ref = tie\&._this(orb);\fR + +-// Get reference to rootpoa & activate the POAManager +-POA rootpoa = (POA)orb\&.resolve_initial_references("RootPOA"); +-rootpoa\&.the_POAManager()\&.activate(); +- +-// create servant and register it with the ORB +-MyServant myDelegate = new MyServant(); +-myDelegate\&.setORB(orb); +- +-// create a tie, with servant being the delegate\&. +-MyPOATie tie = new MyPOATie(myDelegate, rootpoa); +- +-// obtain the objectRef for the tie +-My ref = tie\&._this(orb); + .fi + .if n \{\ + .RE +@@ -230,146 +211,154 @@ + .RS 4 + .\} + .nf +-idlj \-oldImplBase \-fall My\&.idl +-idlj \-oldImplBase \-fallTIE My\&.idl ++\fBidlj \-oldImplBase \-fall My\&.idl\fR ++\fBidlj \-oldImplBase \-fallTIE My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢¤³¤ì¤Ë¤è¤ê¡¢\fIMy_Tie\&.java\fR¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fIMy_Tie\fR¥¯¥é¥¹¤Ø¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢\fIimpl\fR¥ª¥Ö¥¸¥§¥¯¥È¤ò¼è¤ê¤Þ¤¹¡£\fIimpl\fR¤ËÂФ·¤Æ¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤Î¼ÂÁõ¤Ï\fIHelloOperations\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ë¤Î¤ß¤Ç¡¢¤½¤Î¾¤Î¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤·¤«¤·¡¢¤³¤ì¤òORB¤È°ì½ï¤Ë»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¼¡¤Î¤è¤¦¤Ë\fIMy_Tie\fRÆâ¤Ç¼ÂÁõ¤ò¥é¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢¤³¤ì¤Ë¤è¤ê¡¢\fBMy_Tie\&.java\fR¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fBMy_Tie\fR¥¯¥é¥¹¤Ø¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢\fBimpl\fR¥ª¥Ö¥¸¥§¥¯¥È¤ò¼è¤ê¤Þ¤¹¡£\fBimpl\fR¤ËÂФ·¤Æ¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤Î¼ÂÁõ¤Ï\fBHelloOperations\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפ¬¤¢¤ë¤Î¤ß¤Ç¡¢¤½¤Î¾¤Î¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤·¤«¤·¡¢¤³¤ì¤òORB¤È°ì½ï¤Ë»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¼¡¤Î¤è¤¦¤Ë\fBMy_Tie\fRÆâ¤Ç¼ÂÁõ¤ò¥é¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-ORB orb = ORB\&.init(args, System\&.getProperties()); +- +-// create servant and register it with the ORB +-MyServant myDelegate = new MyServant(); +-myDelegate\&.setORB(orb); ++\fBORB orb = ORB\&.init(args, System\&.getProperties());\fR + +-// create a tie, with servant being the delegate\&. +-MyPOATie tie = new MyPOATie(myDelegate); ++\fB// create servant and register it with the ORB\fR ++\fBMyServant myDelegate = new MyServant();\fR ++\fBmyDelegate\&.setORB(orb); \fR ++\fB \fR ++\fB// create a tie, with servant being the delegate\&.\fR ++\fBMyPOATie tie = new MyPOATie(myDelegate);\fR ++\fB \fR ++\fB// obtain the objectRef for the tie\fR ++\fBMy ref = tie\&._this(orb);\fR + +-// obtain the objectRef for the tie +-My ref = tie\&._this(orb); + .fi + .if n \{\ + .RE + .\} + .SS "ȯ¹Ô¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ÎÂåÂØ°ÌÃ֤λØÄê" + .PP +-ȯ¹Ô¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê°Ê³°¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤¯¤Ë¤Ï¡¢\fIi\fR\fIdlj \-td /altdir My\&.idl\fR¤Î¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ ++ȯ¹Ô¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê°Ê³°¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤¯¤Ë¤Ï¡¢\fBi\fR\fBdlj \-td /altdir My\&.idl\fR¤Î¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ + .PP + +-\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fI\&./My\&.java\fR¤Ç¤Ï¤Ê¤¯¡¢\fI/altdir/My\&.java\fR¤Ê¤É¤Ëȯ¹Ô¤µ¤ì¤Þ¤¹¡£ ++\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ì¹ç¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fB\&./My\&.java\fR¤Ç¤Ï¤Ê¤¯¡¢\fB/altdir/My\&.java\fR¤Ê¤É¤Ëȯ¹Ô¤µ¤ì¤Þ¤¹¡£ + .SS "¥¤¥ó¥¯¥ë¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤ÎÂåÂØ°ÌÃ֤λØÄê" + .PP +-\fIMy\&.idl\fR¥Õ¥¡¥¤¥ë¤¬Ê̤Î\fIidl\fR¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë\fIMyOther\&.idl\fR¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¡¢\fIMyOther\&.idl\fR¥Õ¥¡¥¤¥ë¤¬¥í¡¼¥«¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¸ºß¤¹¤ë¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤½¤ì¤¬\fI/includes\fR¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ ++\fBMy\&.idl\fR¥Õ¥¡¥¤¥ë¤¬Ê̤Î\fBidl\fR¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë\fBMyOther\&.idl\fR¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¡¢\fBMyOther\&.idl\fR¥Õ¥¡¥¤¥ë¤¬¥í¡¼¥«¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¸ºß¤¹¤ë¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤½¤ì¤¬\fB/includes\fR¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-i /includes My\&.idl ++\fBidlj \-i /includes My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤¿¤È¤¨¤Ð¡¢\fI/moreIncludes\fR¤Ë¤¢¤ë\fIAnother\&.idl\fR¤â\fIMy\&.idl\fR¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢¼¡¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fB/moreIncludes\fR¤Ë¤¢¤ë\fBAnother\&.idl\fR¤â\fBMy\&.idl\fR¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢¼¡¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-i /includes \-i /moreIncludes My\&.idl ++\fBidlj \-i /includes \-i /moreIncludes My\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤Î¤è¤¦¤Ê·Á¼°¤Î\fIinclude\fR¤ÏŤ¯¤Ê¤ë¤¿¤á¡¢¥¤¥ó¥¯¥ë¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò¥³¥ó¥Ñ¥¤¥é¤Ë»Ø¼¨¤¹¤ë¤¿¤á¤ÎÊ̤ÎÊýË¡¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢´Ä¶­ÊÑ¿ô¤Î¹Í¤¨Êý¤È»÷¤Æ¤¤¤Þ¤¹¡£\fICLASSPATH\fRÊÑ¿ô¤Ë°ìÍ÷ɽ¼¨¤µ¤ì¤Æ¤¤¤ë¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ëidl\&.config¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£¤½¤Î\fIidl\&.config\fR¤ÎÃæ¤Ë¡¢¼¡¤Î¤è¤¦¤Ê·Á¼°¤Î¹Ô¤òÆþ¤ì¤Þ¤¹¡£ ++¤³¤Î¤è¤¦¤Ê·Á¼°¤Î\fBinclude\fR¤ÏŤ¯¤Ê¤ë¤¿¤á¡¢¥¤¥ó¥¯¥ë¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò¥³¥ó¥Ñ¥¤¥é¤Ë»Ø¼¨¤¹¤ë¤¿¤á¤ÎÊ̤ÎÊýË¡¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢´Ä¶­ÊÑ¿ô¤Î¹Í¤¨Êý¤È»÷¤Æ¤¤¤Þ¤¹¡£\fBCLASSPATH\fRÊÑ¿ô¤Ë°ìÍ÷ɽ¼¨¤µ¤ì¤Æ¤¤¤ë¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ëidl\&.config¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£¤½¤Î\fBidl\&.config\fR¤ÎÃæ¤Ë¡¢¼¡¤Î¤è¤¦¤Ê·Á¼°¤Î¹Ô¤òÆþ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-includes=/includes;/moreIncludes ++\fBincludes=/includes;/moreIncludes\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¡¢¥¤¥ó¥¯¥ë¡¼¥É¡¦¥ê¥¹¥È¤òÆɤ߹þ¤ß¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥£¥ì¥¯¥È¥ê¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤Ï¥»¥ß¥³¥í¥ó(;)¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¶èÀÚ¤êʸ»ú¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£Windows¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥»¥ß¥³¥í¥ó¤ò»ÈÍѤ·¡¢UNIX¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥³¥í¥ó¤ò»ÈÍѤ¹¤ë¤Ê¤É¤Ç¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¡¢¥¤¥ó¥¯¥ë¡¼¥É¡¦¥ê¥¹¥È¤òÆɤ߹þ¤ß¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥£¥ì¥¯¥È¥ê¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤Ï¥»¥ß¥³¥í¥ó(;)¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¶èÀÚ¤êʸ»ú¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£Windows¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥»¥ß¥³¥í¥ó¤ò»ÈÍѤ·¡¢Solaris¡¢Linux¤ª¤è¤ÓOS X¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¥³¥í¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .SS "¥¤¥ó¥¯¥ë¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Îȯ¹Ô" + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤷ¤¿\fIidl\fR¥Õ¥¡¥¤¥ë¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ä¹½Â¤ÂΤʤɤˤĤ¤¤Æ¤Î¤ß¡¢Java¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë·¿¤Ë¤Ä¤¤¤Æ¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î2¤Ä¤Î\fIidl\fR¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¹Í¤¨¤Æ¤ß¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤷ¤¿\fBidl\fR¥Õ¥¡¥¤¥ë¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ä¹½Â¤ÂΤʤɤˤĤ¤¤Æ¤Î¤ß¡¢Java¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë·¿¤Ë¤Ä¤¤¤Æ¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î2¤Ä¤Î\fBidl\fR¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¹Í¤¨¤Æ¤ß¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-My\&.idl file: ++\fBMy\&.idl file:\fR ++\fB \fR ++\fB#include <MyOther\&.idl>\fR ++\fBinterface My\fR ++\fB{\fR ++\fB};\fR ++\fB \fR ++\fBMyOther\&.idl file:\fR ++\fB \fR ++\fBinterface MyOther\fR ++\fB{\fR ++\fB};\fR + +-#include <MyOther\&.idl> +-interface My +-{ +-}; +- +-MyOther\&.idl file: +- +-interface MyOther +-{ +-}; + .fi + .if n \{\ + .RE + .\} + .PP +-¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤Ë´Ø¤·¤Æ·Ù¹ð¤¬¤¢¤ê¤Þ¤¹¡£¥°¥í¡¼¥Ð¥ë¡¦¥¹¥³¡¼¥×¤Ëɽ¼¨¤µ¤ì¤ë\fI#include\fRʸ¤Ï¡¢Á°½Ò¤Î¤È¤ª¤ê¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î\fI#include\fRʸ¤Ï¡¢¥¤¥ó¥Ý¡¼¥Èʸ¤È¸«¤Ê¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°Ï¤Þ¤ì¤¿¥¹¥³¡¼¥×Æâ¤Ëɽ¼¨¤µ¤ì¤ë\fI#include\fRʸ¤Ï¡¢ËÜÅö¤Î°ÕÌ£¤Ç¤Î\fI#include\fRʸ¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¥³¡¼¥É¤¬¡¢¸µ¤Î¥Õ¥¡¥¤¥ë¤Ë¤½¤Î¤Þ¤Þɽ¼¨¤µ¤ì¤Æ¤¤¤ë¤«¤Î¤è¤¦¤Ë½èÍý¤µ¤ì¡¢¤½¤ì¤ËÂФ·¤ÆJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£¼¡¤Ï¤½¤ÎÎã¤Ç¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤Ë´Ø¤·¤Æ·Ù¹ð¤¬¤¢¤ê¤Þ¤¹¡£¥°¥í¡¼¥Ð¥ë¡¦¥¹¥³¡¼¥×¤Ëɽ¼¨¤µ¤ì¤ë\fB#include\fRʸ¤Ï¡¢Á°½Ò¤Î¤È¤ª¤ê¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î\fB#include\fRʸ¤Ï¡¢¥¤¥ó¥Ý¡¼¥Èʸ¤È¸«¤Ê¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°Ï¤Þ¤ì¤¿¥¹¥³¡¼¥×Æâ¤Ëɽ¼¨¤µ¤ì¤ë\fB#include\fRʸ¤Ï¡¢ËÜÅö¤Î°ÕÌ£¤Ç¤Î\fB#include\fRʸ¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¥³¡¼¥É¤¬¡¢¸µ¤Î¥Õ¥¡¥¤¥ë¤Ë¤½¤Î¤Þ¤Þɽ¼¨¤µ¤ì¤Æ¤¤¤ë¤«¤Î¤è¤¦¤Ë½èÍý¤µ¤ì¡¢¤½¤ì¤ËÂФ·¤ÆJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£¼¡¤Ï¤½¤ÎÎã¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-My\&.idl file: ++\fBMy\&.idl file:\fR ++\fB \fR ++\fB#include <MyOther\&.idl>\fR ++\fBinterface My\fR ++\fB{\fR ++\fB #include <Embedded\&.idl>\fR ++\fB};\fR ++\fB \fR ++\fBMyOther\&.idl file:\fR ++\fB \fR ++\fBinterface MyOther\fR ++\fB{\fR ++\fB};\fR ++\fB \fR ++\fBEmbedded\&.idl\fR ++\fB \fR ++\fBenum E {one, two, three};\fR + +-#include <MyOther\&.idl> +-interface My +-{ +- #include <Embedded\&.idl> +-}; +- +-MyOther\&.idl file: +- +-interface MyOther +-{ +-}; +- +-Embedded\&.idl +- +-enum E {one, two, three}; + .fi + .if n \{\ + .RE + .\} + .PP +-\fI idlj My\&.idl \fR¤ò¼Â¹Ô¤·¤Æ¡¢Java¥Õ¥¡¥¤¥ë¤Î¼¡¤Î¥ê¥¹¥È¤òÀ¸À®¤·¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥Èʸ¤È¤ß¤Ê¤µ¤ì¤ë\fI#include\fR¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤¿¤á¡¢\fIMyOther\&.java\fR¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£¤¿¤À¤·¡¢ËÜÅö¤Î°ÕÌ£¤Ç¤Î\fI#include\fR¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤¿¤á¡¢\fIE\&.java\fR¤ÏÀ¸À®¤µ¤ì¤Þ¤·¤¿¡£\fIEmbedded\&.idl\fR¥Õ¥¡¥¤¥ë¤¬\fIMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥¹¥³¡¼¥×Æâ¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢\fIMy\fR¤Î¥¹¥³¡¼¥×Æâ(¤Ä¤Þ¤ê¡¢\fIMyPackage\fRÆâ)¤ËÀ¸À®¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fI\-emitAll\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¤¹¤Ù¤Æ¤Î·¿¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£ ++\fB idlj My\&.idl \fR¤ò¼Â¹Ô¤·¤Æ¡¢Java¥Õ¥¡¥¤¥ë¤Î¼¡¤Î¥ê¥¹¥È¤òÀ¸À®¤·¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥Èʸ¤È¤ß¤Ê¤µ¤ì¤ë\fB#include\fR¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤¿¤á¡¢\fBMyOther\&.java\fR¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£¤¿¤À¤·¡¢ËÜÅö¤Î°ÕÌ£¤Ç¤Î\fB#include\fR¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤¿¤á¡¢\fBE\&.java\fR¤ÏÀ¸À®¤µ¤ì¤Þ¤·¤¿¡£\fBEmbedded\&.idl\fR¥Õ¥¡¥¤¥ë¤¬\fBMy\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥¹¥³¡¼¥×Æâ¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢\fBMy\fR¤Î¥¹¥³¡¼¥×Æâ(¤Ä¤Þ¤ê¡¢\fBMyPackage\fRÆâ)¤ËÀ¸À®¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fB\-emitAll\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¤¹¤Ù¤Æ¤Î·¿¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\&./MyHolder\&.java +-\&./MyHelper\&.java +-\&./_MyStub\&.java +-\&./MyPackage +-\&./MyPackage/EHolder\&.java +-\&./MyPackage/EHelper\&.java +-\&./MyPackage/E\&.java +-\&./My\&.java ++\fB\&./MyHolder\&.java\fR ++\fB\&./MyHelper\&.java\fR ++\fB\&./_MyStub\&.java\fR ++\fB\&./MyPackage\fR ++\fB\&./MyPackage/EHolder\&.java\fR ++\fB\&./MyPackage/EHelper\&.java\fR ++\fB\&./MyPackage/E\&.java\fR ++\fB\&./My\&.java\fR ++ + .fi + .if n \{\ + .RE +@@ -382,49 +371,51 @@ + .RS 4 + .\} + .nf +-Widgets\&.idl file: ++\fBWidgets\&.idl file:\fR ++\fB \fR ++\fBmodule Widgets\fR ++\fB{\fR ++\fB interface W1 {\&.\&.\&.};\fR ++\fB interface W2 {\&.\&.\&.};\fR ++\fB};\fR + +-module Widgets +-{ +- interface W1 {\&.\&.\&.}; +- interface W2 {\&.\&.\&.}; +-}; + .fi + .if n \{\ + .RE + .\} + .PP +-IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤ò²ð¤·¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢W1¤ª¤è¤ÓW2¤ËÂФ¹¤ëJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fIWidgets\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¶È³¦¤Î´·Îã¤Ë¤è¤ë¤È¡¢²ñ¼Ò¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢\fIcom\&.<company name>\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËÃÖ¤¯¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î´·Îã¤Ë½¾¤¦¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò\fIcom\&.abc\&.Widgets\fR¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Ñ¥Ã¥±¡¼¥¸ÀÜƬ¼­¤òWidgets¥â¥¸¥å¡¼¥ë¤ËÉղ乤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤ò²ð¤·¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢W1¤ª¤è¤ÓW2¤ËÂФ¹¤ëJava¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fBWidgets\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¶È³¦¤Î´·Îã¤Ë¤è¤ë¤È¡¢²ñ¼Ò¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢\fBcom\&.<company name>\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËÃÖ¤¯¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î´·Îã¤Ë½¾¤¦¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò\fBcom\&.abc\&.Widgets\fR¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Ñ¥Ã¥±¡¼¥¸ÀÜƬ¼­¤òWidgets¥â¥¸¥å¡¼¥ë¤ËÉղ乤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-idlj \-pkgPrefix Widgets com\&.abc Widgets\&.idl ++\fBidlj \-pkgPrefix Widgets com\&.abc Widgets\&.idl\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-Widgets\&.idl¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Æ¤¤¤ëIDL¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ï¡¢¤½¤Î¥³¥Þ¥ó¥É¤Ë¤â\fI\-pkgPrefix\fR¥Õ¥é¥°¤¬É¬ÍפǤ¹¡£¤³¤Î¥Õ¥é¥°¤ò»ØÄꤷ¤Ê¤¤¤È¡¢¤½¤ÎIDL¥Õ¥¡¥¤¥ë¤Ï¡¢\fIcom\&.abc\&.Widgets\fR¥Ñ¥Ã¥±¡¼¥¸¤Ç¤Ï¤Ê¤¯¡¢\fIWidgets\fR¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++Widgets\&.idl¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Æ¤¤¤ëIDL¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ï¡¢¤½¤Î¥³¥Þ¥ó¥É¤Ë¤â\fB\-pkgPrefix\fR¥Õ¥é¥°¤¬É¬ÍפǤ¹¡£¤³¤Î¥Õ¥é¥°¤ò»ØÄꤷ¤Ê¤¤¤È¡¢¤½¤ÎIDL¥Õ¥¡¥¤¥ë¤Ï¡¢\fBcom\&.abc\&.Widgets\fR¥Ñ¥Ã¥±¡¼¥¸¤Ç¤Ï¤Ê¤¯¡¢\fBWidgets\fR¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-ÀÜƬ¼­¤¬É¬Íפʥѥ屡¼¥¸¤¬¤¤¤¯¤Ä¤â¤¢¤ë¾ì¹ç¤Ï¡¢Á°½Ò¤Îidl\&.config¥Õ¥¡¥¤¥ë¤ÇÀÜƬ¼­¤ò»ØÄꤹ¤ë¤Î¤¬´Êñ¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸ÀÜƬ¼­¤Î³Æ¹Ô¤Ï¡¢\fIPkgPrefix\&.<type>=<prefix>\fR¤Î·Á¼°¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Á°½Ò¤ÎÎã¤Î¹Ô¤Ç¤Ï¡¢\fIPkgPrefix\&.Widgets=com\&.abc\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥ê¥Ý¥¸¥È¥êID¤Ë¤Ï±Æ¶Á¤·¤Þ¤»¤ó¡£ ++ÀÜƬ¼­¤¬É¬Íפʥѥ屡¼¥¸¤¬¤¤¤¯¤Ä¤â¤¢¤ë¾ì¹ç¤Ï¡¢Á°½Ò¤Îidl\&.config¥Õ¥¡¥¤¥ë¤ÇÀÜƬ¼­¤ò»ØÄꤹ¤ë¤Î¤¬´Êñ¤Ç¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸¤ÎÀÜƬ¼­¹Ô¤Ï¡¢\fBPkgPrefix\&.<type>=<prefix>\fR¤Î·Á¼°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Á°½Ò¤ÎÎã¤Î¹Ô¤Ç¤Ï¡¢\fBPkgPrefix\&.Widgets=com\&.abc\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥ê¥Ý¥¸¥È¥êID¤Ë¤Ï±Æ¶Á¤·¤Þ¤»¤ó¡£ + .SS "¥³¥ó¥Ñ¥¤¥ëÁ°¤Î¥·¥ó¥Ü¥ë¤ÎÄêµÁ" + .PP +-¥³¥ó¥Ñ¥¤¥ëÍѤΥ·¥ó¥Ü¥ë¤¬IDL¥Õ¥¡¥¤¥ëÆâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¤½¤Î¥·¥ó¥Ü¥ë¤òÄêµÁ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¿¤È¤¨¤Ð¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°Æâ¤Ë¥Ç¥Ð¥Ã¥°¡¦¥³¡¼¥É¤òÁȤßÆþ¤ì¤ë¤È¤­¤Ë»ÈÍѤ·¤Þ¤¹¡£¥³¥Þ¥ó¥É\fIidlj \-d MYDEF My\&.idl \fR¤Ï¡¢My\&.idlÆâ¤Ë¹Ô\fI#define MYDEF\fR¤òÇÛÃÖ¤·¤¿¾ì¹ç¤ÈƱÅù¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥ëÍѤΥ·¥ó¥Ü¥ë¤¬IDL¥Õ¥¡¥¤¥ëÆâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¤½¤Î¥·¥ó¥Ü¥ë¤òÄêµÁ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¿¤È¤¨¤Ð¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°Æâ¤Ë¥Ç¥Ð¥Ã¥°¡¦¥³¡¼¥É¤òÁȤßÆþ¤ì¤ë¤È¤­¤Ë»ÈÍѤ·¤Þ¤¹¡£¥³¥Þ¥ó¥É\fBidlj \-d MYDEF My\&.idl \fR¤Ï¡¢My\&.idlÆâ¤Ë¹Ô\fB#define MYDEF\fR¤òÇÛÃÖ¤·¤¿¾ì¹ç¤ÈƱÅù¤Ë¤Ê¤ê¤Þ¤¹¡£ + .SS "´û¸¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ÎÊÝ»ý" + .PP +-Java¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ï¡¢\fI\-keep\fR¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤ë¾å½ñ¤­¤ò²óÈò¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤¹¤Ç¤Ë¸ºß¤¹¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿¾ì¹ç(¤¿¤À¤·¡¢¤½¤ì¤é¤ÎÆâÍƤ¬Àµ³Î¤Ç¤¢¤ë¤È¤­°Ê³°¤Ï¥«¥¹¥¿¥Þ¥¤¥º¤ÏÈò¤±¤ë)¡¢\fI\-keep\fR¥ª¥×¥·¥ç¥ó¤ÏÍ­ÍѤǤ¹¡£¥³¥Þ¥ó¥É\fIidlj \-keep My\&.idl\fR¤Ï¡¢¤¹¤Ç¤Ë¸ºß¤·¤Ê¤¤¤¹¤Ù¤Æ¤Î¥¯¥é¥¤¥¢¥ó¥È¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òȯ¹Ô¤·¤Þ¤¹¡£ ++Java¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ï¡¢\fB\-keep\fR¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤ë¾å½ñ¤­¤ò²óÈò¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤¹¤Ç¤Ë¸ºß¤¹¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿¾ì¹ç(¤¿¤À¤·¡¢¤½¤ì¤é¤ÎÆâÍƤ¬Àµ³Î¤Ç¤¢¤ë¤È¤­°Ê³°¤Ï¥«¥¹¥¿¥Þ¥¤¥º¤ÏÈò¤±¤ë)¡¢\fB\-keep\fR¥ª¥×¥·¥ç¥ó¤ÏÍ­ÍѤǤ¹¡£¥³¥Þ¥ó¥É\fBidlj \-keep My\&.idl\fR¤Ï¡¢¤¹¤Ç¤Ë¸ºß¤·¤Ê¤¤¤¹¤Ù¤Æ¤Î¥¯¥é¥¤¥¢¥ó¥È¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òȯ¹Ô¤·¤Þ¤¹¡£ + .SS "¥³¥ó¥Ñ¥¤¥ë¤Î¿ÊĽ¾õ¶·¤Îɽ¼¨" + .PP +-IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¼Â¹Ô¤Î³ÆÃʳ¬¤Ç¾õÂÖ¥á¥Ã¥»¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£\fI\-v\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fIidlj \-v My\&.idl\fR¤Î¤è¤¦¤Ê¾éĹ¥â¡¼¥É¤ò¥¢¥¯¥Æ¥£¥Ö²½¤·¤Þ¤¹¡£ ++IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¼Â¹Ô¤Î³ÆÃʳ¬¤Ç¾õÂÖ¥á¥Ã¥»¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£\fB\-v\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fBidlj \-v My\&.idl\fR¤Î¤è¤¦¤Ê¾éĹ¥â¡¼¥É¤ò¥¢¥¯¥Æ¥£¥Ö²½¤·¤Þ¤¹¡£ + .PP + ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¾éĹ¥â¡¼¥É¤Ç¤Ï¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£ + .SS "¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨" + .PP +-IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Î¥Ó¥ë¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó\fIidlj \-version\fR¤Ç\fI\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£ ++IDL\-to\-Java¥³¥ó¥Ñ¥¤¥é¤Î¥Ó¥ë¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô\fBidlj \-version\fR¤Ç\fB\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£ + .PP +-¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿¥Ð¥¤¥ó¥Ç¥£¥ó¥°Æâ¤Ë¤â½ñ¤­¹þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤹ¤ë¤È¡¢¤½¤ì°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¤â¡¢¤¹¤Ù¤Æ̵»ë¤µ¤ì¤Þ¤¹¡£ ++¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿¥Ð¥¤¥ó¥Ç¥£¥ó¥°Æâ¤Ë¤â½ñ¤­¹þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤹ¤ë¤È¡¢¤½¤ì°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¤â¡¢¤¹¤Ù¤Æ̵»ë¤µ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-d \fIsymbol\fR +@@ -435,7 +426,8 @@ + .RS 4 + .\} + .nf +-#define \fIsymbol\fR ++\fB#define \fR\fB\fIsymbol\fR\fR ++ + .fi + .if n \{\ + .RE +@@ -444,12 +436,12 @@ + .PP + \-demitAll + .RS 4 +-\fI#include\fR¥Õ¥¡¥¤¥ëÆâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤â´Þ¤á¤Æ¡¢¤¹¤Ù¤Æ¤Î·¿¤òȯ¹Ô¤·¤Þ¤¹¡£ ++\fB#include\fR¥Õ¥¡¥¤¥ëÆâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤â´Þ¤á¤Æ¡¢¤¹¤Ù¤Æ¤Î·¿¤òȯ¹Ô¤·¤Þ¤¹¡£ + .RE + .PP + \-fside + .RS 4 +-ȯ¹Ô¤¹¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÄêµÁ¤·¤Þ¤¹¡£\fIside\fR¥Ñ¥é¥á¡¼¥¿¤Ë¤Ï¡¢\fIclient\fR¡¢\fIserver\fR¡¢\fIserverTIE\fR¡¢\fIall\fR¤Þ¤¿¤Ï\fIallTIE\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fI\-fserverTIE\fR¤Þ¤¿¤Ï\fI\-fallTIE\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢°Ñ¾ù¥â¥Ç¥ë¡¦¥¹¥±¥ë¥È¥ó¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£¥Õ¥é¥°¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fI\-fclient\fR¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ ++ȯ¹Ô¤¹¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÄêµÁ¤·¤Þ¤¹¡£\fBside\fR¥Ñ¥é¥á¡¼¥¿¤Ë¤Ï¡¢\fBclient\fR¡¢\fBserver\fR¡¢\fBserverTIE\fR¡¢\fBall\fR¤Þ¤¿¤Ï\fBallTIE\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fB\-fserverTIE\fR¤Þ¤¿¤Ï\fB\-fallTIE\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢°Ñ¾ù¥â¥Ç¥ë¡¦¥¹¥±¥ë¥È¥ó¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£¥Õ¥é¥°¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fB\-fclient\fR¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .PP + \-i \fIinclude\-path\fR +@@ -469,17 +461,17 @@ + .PP + \-oldImplBase + .RS 4 +-1\&.4¤è¤êÁ°¤ÎJDK ORB¤È¸ß´¹À­¤Î¤¢¤ë¥¹¥±¥ë¥È¥ó¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢POA·Ñ¾µ¥â¥Ç¥ë¤Î¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢\fIImplBase\fR·Ñ¾µ¥â¥Ç¥ë¤Î¥¯¥é¥¹¤Ç¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤ë¤Î¤Ç¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Î²¼°Ì¸ß´¹À­¤¬ÆÀ¤é¤ì¤Þ¤¹¡£ ++1\&.4¤è¤êÁ°¤ÎJDK ORB¤È¸ß´¹À­¤Î¤¢¤ë¥¹¥±¥ë¥È¥ó¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢POA·Ñ¾µ¥â¥Ç¥ë¤Î¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢\fBImplBase\fR·Ñ¾µ¥â¥Ç¥ë¤Î¥¯¥é¥¹¤Ç¤¢¤ë¥µ¡¼¥Ð¡¼Â¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬À¸À®¤µ¤ì¤ë¤Î¤Ç¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Î¸åÊý¸ß´¹À­¤¬ÆÀ¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-pkgPrefix \fItype\fR \fIprefix\fR + .RS 4 +-\fItype\fR¤¬¥Õ¥¡¥¤¥ë¡¦¥¹¥³¡¼¥×¤Ç¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï¡¢¤½¤Î·¿¤ËÂФ·¤ÆÀ¸À®¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¡¢À¸À®¤µ¤ì¤ëJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ë\fIprefix\fR¤È¤¤¤¦ÀÜƬ¼­¤¬Éղ䵤ì¤Þ¤¹¡£type¤Ï¡¢¥È¥Ã¥×¥ì¥Ù¥ë¡¦¥â¥¸¥å¡¼¥ë¤Îñ½ã̾¤«¡¢¤É¤Î¥â¥¸¥å¡¼¥ë¤è¤ê¤â³°Â¦¤ÇÄêµÁ¤µ¤ì¤¿IDL·¿¤Îñ½ã̾¤Î¤É¤Á¤é¤«¤Ç¤¹¡£ ++\fBtype\fR¤¬¥Õ¥¡¥¤¥ë¡¦¥¹¥³¡¼¥×¤Ç¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï¡¢¤½¤Î·¿¤ËÂФ·¤ÆÀ¸À®¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¡¢À¸À®¤µ¤ì¤ëJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ë\fBprefix\fR¤È¤¤¤¦ÀÜƬ¼­¤¬Éղ䵤ì¤Þ¤¹¡£type¤Ï¡¢¥È¥Ã¥×¥ì¥Ù¥ë¡¦¥â¥¸¥å¡¼¥ë¤Îñ½ã̾¤«¡¢¤É¤Î¥â¥¸¥å¡¼¥ë¤è¤ê¤â³°Â¦¤ÇÄêµÁ¤µ¤ì¤¿IDL·¿¤Îñ½ã̾¤Î¤É¤Á¤é¤«¤Ç¤¹¡£ + .RE + .PP + \-pkgTranslate \fItype\fR \fIpackage\fR + .RS 4 +-¼±Ê̻ҤÎÃæ¤Ë¥â¥¸¥å¡¼¥ë̾type¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢À¸À®¤µ¤ì¤ëJava¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¡¢¼±Ê̻ҤÎÃæ¤Î¤½¤Î̾Á°¤¬package¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£ºÇ½é¤Ë\fIpkgPrefix\fR¤ÎÊѹ¹¤¬¹Ô¤ï¤ì¤Þ¤¹¡£type¤ÎÃͤϡ¢¥È¥Ã¥×¥ì¥Ù¥ë¤Î¥â¥¸¥å¡¼¥ë¤Îñ½ã̾¡¢¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥â¥¸¥å¡¼¥ë¤Î³°Éô¤ÇÄêµÁ¤µ¤ì¤¿IDL·¿¤Îñ½ã̾¤Ç¡¢´°Á´¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÀµ³Î¤Ë°ìÃפ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¼±Ê̻ҤÎÃæ¤Ë¥â¥¸¥å¡¼¥ë̾type¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢À¸À®¤µ¤ì¤ëJava¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¡¢¼±Ê̻ҤÎÃæ¤Î¤½¤Î̾Á°¤¬package¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£ºÇ½é¤Ë\fBpkgPrefix\fR¤ÎÊѹ¹¤¬¹Ô¤ï¤ì¤Þ¤¹¡£type¤ÎÃͤϡ¢¥È¥Ã¥×¥ì¥Ù¥ë¤Î¥â¥¸¥å¡¼¥ë¤Îñ½ã̾¡¢¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥â¥¸¥å¡¼¥ë¤Î³°Éô¤ÇÄêµÁ¤µ¤ì¤¿IDL·¿¤Îñ½ã̾¤Ç¡¢´°Á´¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÀµ³Î¤Ë°ìÃפ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + Ê£¿ô¤ÎÊÑ´¹¤¬¼±Ê̻Ҥ˰ìÃפ¹¤ë¾ì¹ç¡¢¼¡¤ÎÎã¤Ë¼¨¤¹¤è¤¦¤Ë¡¢ºÇ¤âŤ¤°ìÃפ¬ÁªÂò¤µ¤ì¤Þ¤¹¡£ + .sp +@@ -489,7 +481,8 @@ + .RS 4 + .\} + .nf +-pkgTranslate type pkg \-pkgTranslate type2\&.baz pkg2\&.fizz ++\fBpkgTranslate type pkg \-pkgTranslate type2\&.baz pkg2\&.fizz\fR ++ + .fi + .if n \{\ + .RE +@@ -500,22 +493,23 @@ + .RS 4 + .\} + .nf +-type => pkg +-type\&.ext => pkg\&.ext +-type\&.baz => pkg2\&.fizz +-type2\&.baz\&.pkg => pkg2\&.fizz\&.pkg ++\fBtype => pkg\fR ++\fBtype\&.ext => pkg\&.ext\fR ++\fBtype\&.baz => pkg2\&.fizz\fR ++\fBtype2\&.baz\&.pkg => pkg2\&.fizz\&.pkg\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥Ñ¥Ã¥±¡¼¥¸Ì¾\fIorg\fR¡¢\fIorg\fR\&.o\fImg\fR¡¢¤Þ¤¿¤Ï\fIorg\&.omg\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢ÊÑ´¹¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÊÑ´¹¤·¤è¤¦¤È¤¹¤ë¤È¡¢¸ß´¹À­¤Î¤Ê¤¤¥³¡¼¥É¤¬À¸À®¤µ¤ì¡¢\fI\-pkgTranslate\fR¤Î¸å¤ÎºÇ½é¤Î°ú¿ô¤È¤·¤Æ¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò»ÈÍѤ¹¤ë¤È¡¢¥¨¥é¡¼¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£ ++¥Ñ¥Ã¥±¡¼¥¸Ì¾\fBorg\fR¡¢\fBorg\fR\&.o\fBmg\fR¡¢¤Þ¤¿¤Ï\fBorg\&.omg\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢ÊÑ´¹¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÊÑ´¹¤·¤è¤¦¤È¤¹¤ë¤È¡¢¸ß´¹À­¤Î¤Ê¤¤¥³¡¼¥É¤¬À¸À®¤µ¤ì¡¢\fB\-pkgTranslate\fR¤Î¸å¤ÎºÇ½é¤Î°ú¿ô¤È¤·¤Æ¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò»ÈÍѤ¹¤ë¤È¡¢¥¨¥é¡¼¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£ + .RE + .PP + \-skeletonName \fIxxx%yyy\fR + .RS 4 +-\fIxxx%yyy\fR¤¬¡¢¥¹¥±¥ë¥È¥ó¤Ë̾Á°¤òÉÕ¤±¤ë¥Ñ¥¿¡¼¥ó¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£\fIPOA\fR¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fI%POA\fR +-(\fI\-fserver\fR¤Þ¤¿¤Ï\fI\-fall\fR)¡¢\fIoldImplBase\fR¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fI_%ImplBase\fR +-(\-\fIoldImplBase\fR)¤ª¤è¤Ó(\fI\-fserver\fR¤Þ¤¿¤Ï\fI\-fall\fR))¡£ ++\fBxxx%yyy\fR¤¬¡¢¥¹¥±¥ë¥È¥ó¤Ë̾Á°¤òÉÕ¤±¤ë¥Ñ¥¿¡¼¥ó¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£\fBPOA\fR¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fB%POA\fR ++(\fB\-fserver\fR¤Þ¤¿¤Ï\fB\-fall\fR)¡¢\fBoldImplBase\fR¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fB_%ImplBase\fR ++(\-\fBoldImplBase\fR)¤ª¤è¤Ó(\fB\-fserver\fR¤Þ¤¿¤Ï\fB\-fall\fR))¡£ + .RE + .PP + \-td \fIdir\fR +@@ -525,10 +519,10 @@ + .PP + \-tieName \fIxxx%yyy\fR + .RS 4 +-¥Ñ¥¿¡¼¥ó¤Ë½¾¤Ã¤Æ¡¢\fIxxx%yyy\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£\fIPOA\fR¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fI%POA\fR +-(\fI\-fserverTie¤Þ¤¿¤Ï\-fallTie\fR)¡¢\fIoldImplBase\fR +-tie¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fI_%Tie\fR +-(\-\fIoldImplBase\fR)¤ª¤è¤Ó(\fI\-fserverTie\fR¤Þ¤¿¤Ï\fI\-fallTie\fR))¡£ ++¥Ñ¥¿¡¼¥ó¤Ë½¾¤Ã¤Æ¡¢\fBxxx%yyy\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£\fBPOA\fR¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fB%POA\fR ++(\fB\-fserverTie¤Þ¤¿¤Ï\-fallTie\fR)¡¢\fBoldImplBase\fR ++tie¥¯¥é¥¹¤Î¾ì¹ç¤Ï\fB_%Tie\fR ++(\-\fBoldImplBase\fR)¤ª¤è¤Ó(\fB\-fserverTie\fR¤Þ¤¿¤Ï\fB\-fallTie\fR))¡£ + .RE + .PP + \-nowarn¡¢\-verbose +@@ -542,13 +536,13 @@ + .RE + .SH "À©¸Â»ö¹à" + .PP +-¥°¥í¡¼¥Ð¥ë¡¦¥¹¥³¡¼¥×Æâ¤Î¥¨¥¹¥±¡¼¥×¤µ¤ì¤¿¼±Ê̻Ҥϡ¢IDL¥×¥ê¥ß¥Æ¥£¥Ö·¿¤Î\fIObject\fR¤Þ¤¿¤Ï\fIValueBase\fR¤ÈƱ¤¸ÄÖ¤ê¤Ë¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤³¤ì¤Ï¡¢¥·¥ó¥Ü¥ëɽ¤¬¤³¤ì¤é¤Î¼±Ê̻Ҥǥץê¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤¿¤á¤Ç¤¹¡£¤³¤ì¤é¤ÎºÆÄêµÁ¤òµö²Ä¤¹¤ë¤È¡¢¸µ¤ÎÄêµÁ¤¬¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤ª¤½¤é¤¯¹±µ×Ū¤ÊÀ©Ìó¤Ç¤¹¡£ ++¥°¥í¡¼¥Ð¥ë¡¦¥¹¥³¡¼¥×Æâ¤Î¥¨¥¹¥±¡¼¥×¤µ¤ì¤¿¼±Ê̻Ҥϡ¢IDL¥×¥ê¥ß¥Æ¥£¥Ö·¿¤Î\fBObject\fR¤Þ¤¿¤Ï\fBValueBase\fR¤ÈƱ¤¸ÄÖ¤ê¤Ë¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤³¤ì¤Ï¡¢¥·¥ó¥Ü¥ëɽ¤¬¤³¤ì¤é¤Î¼±Ê̻Ҥǥץê¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤¿¤á¤Ç¤¹¡£¤³¤ì¤é¤ÎºÆÄêµÁ¤òµö²Ä¤¹¤ë¤È¡¢¸µ¤ÎÄêµÁ¤¬¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤ª¤½¤é¤¯¹±µ×Ū¤ÊÀ©Ìó¤Ç¤¹¡£ + .PP +-\fIfixed\fR¤È¤¤¤¦IDL·¿¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ++\fBfixed\fR¤È¤¤¤¦IDL·¿¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "´ûÃΤÎÌäÂê" + .PP +-¥°¥í¡¼¥Ð¥ë¼±Ê̻ҤˤĤ¤¤Æ¥¤¥ó¥Ý¡¼¥È¤¬À¸À®¤µ¤ì¤Þ¤»¤ó¡£Í½´ü¤µ¤ì¤Ê¤¤¥í¡¼¥«¥ë\fIimpl\fR¥ª¥Ö¥¸¥§¥¯¥È¤ò¸Æ¤Ó½Ð¤¹¤È¡¢Îã³°¤ò¼õ¤±¼è¤ê¤Þ¤¹¡£¤·¤«¤·¡¢¤½¤Î¸¶°ø¤Ï¡¢\fIServerDelegate\fR +-DSI¥³¡¼¥ÉÆâ¤Î\fINullPointerException\fR¤Ë¤¢¤ë¤è¤¦¤Ç¤¹¡£ ++¥°¥í¡¼¥Ð¥ë¼±Ê̻ҤˤĤ¤¤Æ¥¤¥ó¥Ý¡¼¥È¤¬À¸À®¤µ¤ì¤Þ¤»¤ó¡£Í½´ü¤µ¤ì¤Ê¤¤¥í¡¼¥«¥ë\fBimpl\fR¥ª¥Ö¥¸¥§¥¯¥È¤ò¸Æ¤Ó½Ð¤¹¤È¡¢Îã³°¤ò¼õ¤±¼è¤ê¤Þ¤¹¡£¤·¤«¤·¡¢¤½¤Î¸¶°ø¤Ï¡¢\fBServerDelegate\fR ++DSI¥³¡¼¥ÉÆâ¤Î\fBNullPointerException\fR¤Ë¤¢¤ë¤è¤¦¤Ç¤¹¡£ + .br + 'pl 8.5i + 'bp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jar.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jar.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jar +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jar ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jar" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,72 +50,77 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jar \- Java Archive (JAR)¥Õ¥¡¥¤¥ë¤òÁàºî¤·¤Þ¤¹¡£ + .SH "³µÍ×" ++.PP + JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ® + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar c\fR[\fIefmMnv0\fR] [\fIentrypoint\fR] [\fIjarfile\fR] [\fImanifest\fR] [\fI\-C\fR \fIdir\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar c\fR[\fBefmMnv0\fR] [\fIentrypoint\fR] [\fIjarfile\fR] [\fImanifest\fR] [\fB\-C\fR \fIdir\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} ++.PP + JAR¥Õ¥¡¥¤¥ë¤Î¹¹¿· + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar u\fR[\fIefmMnv0\fR] [\fIentrypoint\fR] [\fIjarfile\fR] [\fImanifest\fR] [\fI\-C\fR \fIdir\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar u\fR[\fBefmMnv0\fR] [\fIentrypoint\fR] [\fIjarfile\fR] [\fImanifest\fR] [\fB\-C\fR \fIdir\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} ++.PP + JAR¥Õ¥¡¥¤¥ë¤ÎÃê½Ð + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar\fR \fIx\fR[\fIvf\fR] [\fIjarfile\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar\fR \fBx\fR[\fBvf\fR] [\fIjarfile\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} ++.PP + JAR¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar\fR \fIt\fR[\fIvf\fR] [\fIjarfile\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar\fR \fBt\fR[\fBvf\fR] [\fIjarfile\fR] \fIfile\fR \&.\&.\&. [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} ++.PP + JAR¥Õ¥¡¥¤¥ë¤Ø¤Îº÷°ú¤ÎÄɲà + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjar\fR \fIi\fR \fIjarfile\fR [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] ++\fBjar\fR \fBi\fR \fIjarfile\fR [\-J\fIoption\fR \&.\&.\&.] [@\fIarg\-file\fR \&.\&.\&.] + .fi + .if n \{\ + .RE + .\} + .SH "ÀâÌÀ" + .PP +-\fIjar\fR¥³¥Þ¥ó¥É¤Ï¡¢ZIP¤ª¤è¤ÓZLIB°µ½Ì·Á¼°¤Ë´ð¤Å¤¯ÈÆÍѤΥ¢¡¼¥«¥¤¥Ö¤ª¤è¤Ó°µ½Ì¥Ä¡¼¥ë¤Ç¤¹¡£¤¿¤À¤·¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ï¡¢¼ç¤Ë¤¤¤¯¤Ä¤«¤ÎJava¥¢¥×¥ì¥Ã¥È¤ä¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òñ°ì¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¥Ñ¥Ã¥±¡¼¥¸²½¤¹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Þ¤·¤¿¡£¥¢¥×¥ì¥Ã¥È¤ä¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È(¥Õ¥¡¥¤¥ë¡¢¥¤¥á¡¼¥¸¡¢¤ª¤è¤Ó¥µ¥¦¥ó¥É)¤¬1¤Ä¤Î¥¢¡¼¥«¥¤¥Ö¤Ë·ë¹ç¤µ¤ì¤Æ¤¤¤ë¤È¡¢Java¥¨¡¼¥¸¥§¥ó¥È(¥Ö¥é¥¦¥¶¤Ê¤É)¤Ï¡¢¤½¤ì¤é¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò1²ó¤ÎHTTP¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Ç¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¥³¥ó¥Ý¡¼¥Í¥ó¥È¤´¤È¤Ë¿·¤·¤¤Àܳ¤¬ÉÔÍפˤʤê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤¬ÂçÉý¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ï¥Õ¥¡¥¤¥ë¤Î°µ½Ì¤â¹Ô¤¦¤¿¤á¡¢¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤¬¤µ¤é¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¸Ä¡¹¤Î¥¨¥ó¥È¥ê¤Ë¥¢¥×¥ì¥Ã¥ÈºîÀ®¼Ô¤Ë¤è¤ë½ð̾¤ò½ñ¤­¹þ¤á¤ë¤¿¤á¡¢ÇÛÉÛ¸µ¤Îǧ¾Ú¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Ï¡¢°µ½Ì¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥¨¥ó¥È¥ê¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤Ï¡¢ZIP¤ª¤è¤ÓZLIB°µ½Ì·Á¼°¤Ë´ð¤Å¤¯ÈÆÍѤΥ¢¡¼¥«¥¤¥Ö¤ª¤è¤Ó°µ½Ì¥Ä¡¼¥ë¤Ç¤¹¡£¤¿¤À¤·¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ï¡¢¼ç¤Ë¤¤¤¯¤Ä¤«¤ÎJava¥¢¥×¥ì¥Ã¥È¤ä¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òñ°ì¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¥Ñ¥Ã¥±¡¼¥¸²½¤¹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Þ¤·¤¿¡£¥¢¥×¥ì¥Ã¥È¤ä¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È(¥Õ¥¡¥¤¥ë¡¢¥¤¥á¡¼¥¸¡¢¤ª¤è¤Ó¥µ¥¦¥ó¥É)¤¬1¤Ä¤Î¥¢¡¼¥«¥¤¥Ö¤Ë·ë¹ç¤µ¤ì¤Æ¤¤¤ë¤È¡¢Java¥¨¡¼¥¸¥§¥ó¥È(¥Ö¥é¥¦¥¶¤Ê¤É)¤Ï¡¢¤½¤ì¤é¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò1²ó¤ÎHTTP¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Ç¥À¥¦¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¥³¥ó¥Ý¡¼¥Í¥ó¥È¤´¤È¤Ë¿·¤·¤¤Àܳ¤¬ÉÔÍפˤʤê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤¬ÂçÉý¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ï¥Õ¥¡¥¤¥ë¤Î°µ½Ì¤â¹Ô¤¦¤¿¤á¡¢¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤¬¤µ¤é¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¸Ä¡¹¤Î¥¨¥ó¥È¥ê¤Ë¥¢¥×¥ì¥Ã¥ÈºîÀ®¼Ô¤Ë¤è¤ë½ð̾¤ò½ñ¤­¹þ¤á¤ë¤¿¤á¡¢ÇÛÉÛ¸µ¤Îǧ¾Ú¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Ï¡¢°µ½Ì¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥¨¥ó¥È¥ê¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£ + .PP +-\fIjar\fR¥³¥Þ¥ó¥É¤Î¹½Ê¸¤Ï¡¢\fItar\fR¥³¥Þ¥ó¥É¤Î¹½Ê¸¤Ë»÷¤Æ¤¤¤Þ¤¹¡£É¬¿Ü¤Î\fIÁàºî¤Î°ú¿ô\fR¤Î1¤Ä¤ÇÄêµÁ¤µ¤ì¤¿Ê£¿ô¤ÎÁàºî¥â¡¼¥É¤¬¤¢¤ê¤Þ¤¹¡£Â¾¤Î°ú¿ô¤Ï¡¢Áàºî¤ÎÆ°ºî¤òÊѹ¹¤¹¤ë\fI¥ª¥×¥·¥ç¥ó\fR¡¢¤Þ¤¿¤ÏÁàºî¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤ËɬÍפÊ\fI¥ª¥Ú¥é¥ó¥É\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤Î¹½Ê¸¤Ï¡¢\fBtar\fR¥³¥Þ¥ó¥É¤Î¹½Ê¸¤Ë»÷¤Æ¤¤¤Þ¤¹¡£É¬¿Ü¤Î\fIÁàºî¤Î°ú¿ô\fR¤Î1¤Ä¤ÇÄêµÁ¤µ¤ì¤¿Ê£¿ô¤ÎÁàºî¥â¡¼¥É¤¬¤¢¤ê¤Þ¤¹¡£Â¾¤Î°ú¿ô¤Ï¡¢Áàºî¤ÎÆ°ºî¤òÊѹ¹¤¹¤ë\fI¥ª¥×¥·¥ç¥ó\fR¡¢¤Þ¤¿¤ÏÁàºî¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤ËɬÍפÊ\fI¥ª¥Ú¥é¥ó¥É\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ + .SH "Áàºî¤Î°ú¿ô" + .PP +-\fIjar\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¼¡¤ÎÁàºî¤Î°ú¿ô¤Î¤¤¤º¤ì¤«¤ò»ØÄꤷ¤Æ¼Â¹Ô¤µ¤ì¤ëÁàºî¤òÁªÂò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¾¤Î1ʸ»ú¤Î¥ª¥×¥·¥ç¥ó¤Èº®ºß¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Ä̾Áàºî¤Î°ú¿ô¤Ï»ØÄꤵ¤ì¤ëºÇ½é¤Î°ú¿ô¤Ç¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¼¡¤ÎÁàºî¤Î°ú¿ô¤Î¤¤¤º¤ì¤«¤ò»ØÄꤷ¤Æ¼Â¹Ô¤µ¤ì¤ëÁàºî¤òÁªÂò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¾¤Î1ʸ»ú¤Î¥ª¥×¥·¥ç¥ó¤Èº®ºß¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Ä̾Áàºî¤Î°ú¿ô¤Ï»ØÄꤵ¤ì¤ëºÇ½é¤Î°ú¿ô¤Ç¤¹¡£ + .PP + c + .RS 4 +@@ -145,15 +152,16 @@ + .PP + e + .RS 4 +-\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤ë¥¯¥é¥¹¤ò¡¢¼Â¹Ô²ÄǽJAR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤ë¥¹¥¿¥ó¥É¥¢¥í¥óJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤ËÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î\fIMain\-Class\fR°À­Ãͤ¬ºîÀ®¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Þ¤¹¡£\fIe\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fIu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤ë¥¯¥é¥¹¤ò¡¢¼Â¹Ô²ÄǽJAR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤ë¥¹¥¿¥ó¥É¥¢¥í¥óJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤ËÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î\fBMain\-Class\fR°À­Ãͤ¬ºîÀ®¤Þ¤¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Þ¤¹¡£\fBe\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fBu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIMain\&.jar\fR¥¢¡¼¥«¥¤¥Ö¤¬\fIMain\&.class\fR¥Õ¥¡¥¤¥ë¤È¤È¤â¤ËºîÀ®¤µ¤ì¤Þ¤¹¤¬¡¢¤½¤ÎºÝ¡¢¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î\fIMain\-Class\fR°À­ÃͤÏ\fIMain\fR¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBMain\&.jar\fR¥¢¡¼¥«¥¤¥Ö¤¬\fBMain\&.class\fR¥Õ¥¡¥¤¥ë¤È¤È¤â¤ËºîÀ®¤µ¤ì¤Þ¤¹¤¬¡¢¤½¤ÎºÝ¡¢¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î\fBMain\-Class\fR°À­ÃͤÏ\fBMain\fR¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar cfe Main\&.jar Main Main\&.class ++\fBjar cfe Main\&.jar Main Main\&.class\fR ++ + .fi + .if n \{\ + .RE +@@ -164,19 +172,21 @@ + .RS 4 + .\} + .nf +-java \-jar Main\&.jar ++\fBjava \-jar Main\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤¢¤ë¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤Î¥¯¥é¥¹Ì¾¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥É¥Ã¥È(\&.)¤Þ¤¿¤Ï¥¹¥é¥Ã¥·¥å(/)¤Î¤¤¤º¤ì¤«¤ò¶èÀÚ¤êʸ»ú¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIMain\&.class\fR¤¬\fImydir\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤Ï¼¡¤Î¤¤¤º¤ì¤«¤ÎÊýË¡¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¤¢¤ë¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤Î¥¯¥é¥¹Ì¾¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥É¥Ã¥È(\&.)¤Þ¤¿¤Ï¥¹¥é¥Ã¥·¥å(/)¤Î¤¤¤º¤ì¤«¤ò¶èÀÚ¤êʸ»ú¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBMain\&.class\fR¤¬\fBmydir\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤Ï¼¡¤Î¤¤¤º¤ì¤«¤ÎÊýË¡¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar \-cfe Main\&.jar mydir/Main mydir/Main\&.class +-jar \-cfe Main\&.jar mydir\&.Main mydir/Main\&.class ++\fBjar \-cfe Main\&.jar mydir/Main mydir/Main\&.class\fR ++\fBjar \-cfe Main\&.jar mydir\&.Main mydir/Main\&.class\fR ++ + .fi + .if n \{\ + .RE +@@ -190,7 +200,7 @@ + .nr an-break-flag 1 + .br + .ps +1 +-\fBNote\fR ++\fBÃíµ­\fR + .ps -1 + .br + .TS +@@ -198,7 +208,7 @@ + l. + T{ + Ãí°Õ +-ÆÃÄê¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¤â\fIMain\-Class\fR°À­¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë\fIm\fR¥ª¥×¥·¥ç¥ó¤È\fIe\fR¥ª¥×¥·¥ç¥ó¤ÎξÊý¤òƱ»þ¤Ë»ØÄꤹ¤ë¤È¡¢\fIMain\-Class\fR¤Î»ØÄ꤬¤¢¤¤¤Þ¤¤¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î¤¢¤¤¤Þ¤¤¤µ¤Ë¤è¤Ã¤Æ¥¨¥é¡¼¤¬È¯À¸¤·¡¢\fIjar\fR¥³¥Þ¥ó¥É¤ÎºîÀ®¤ä¹¹¿·¤ÎÁàºî¤¬½ªÎ»¤·¤Þ¤¹¡£ ++ÆÃÄê¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¤â\fBMain\-Class\fR°À­¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë\fBm\fR¥ª¥×¥·¥ç¥ó¤È\fBe\fR¥ª¥×¥·¥ç¥ó¤ÎξÊý¤òƱ»þ¤Ë»ØÄꤹ¤ë¤È¡¢\fBMain\-Class\fR¤Î»ØÄ꤬¤¢¤¤¤Þ¤¤¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î¤¢¤¤¤Þ¤¤¤µ¤Ë¤è¤Ã¤Æ¥¨¥é¡¼¤¬È¯À¸¤·¡¢\fBjar\fR¥³¥Þ¥ó¥É¤ÎºîÀ®¤ä¹¹¿·¤ÎÁàºî¤¬½ªÎ»¤·¤Þ¤¹¡£ + T} + .TE + .sp 1 +@@ -208,26 +218,26 @@ + .PP + f + .RS 4 +-\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢ºîÀ®(\fIc\fR)¡¢¹¹¿·(\fIu\fR)¡¢Ãê½Ð(\fIx\fR)¤Þ¤¿¤Ïɽ¼¨(\fIt\fR)¤µ¤ì¤ëJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤ËÀßÄꤷ¤Þ¤¹¡£\fIf\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò¾Êά¤¹¤ë¤È¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ë¡¢\fIstdin\fR¤«¤é¤ÎJAR¥Õ¥¡¥¤¥ë̾¤ò¼õ¤±Æþ¤ì¤ë¤«(\fIx\fR¤ª¤è¤Ó\fIt\fR¤Î¾ì¹ç)¡¢JAR¥Õ¥¡¥¤¥ë¤ò\fIstdout\fR¤ËÁ÷¿®¤¹¤ë¤³¤È(\fIc\fR¤ª¤è¤Ó\fIu\fR¤Î¾ì¹ç)¤¬»Ø¼¨¤µ¤ì¤Þ¤¹¡£ ++\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢ºîÀ®(\fBc\fR)¡¢¹¹¿·(\fBu\fR)¡¢Ãê½Ð(\fBx\fR)¤Þ¤¿¤Ïɽ¼¨(\fBt\fR)¤µ¤ì¤ëJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤ËÀßÄꤷ¤Þ¤¹¡£\fBf\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò¾Êά¤¹¤ë¤È¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ë¡¢\fBstdin\fR¤«¤é¤ÎJAR¥Õ¥¡¥¤¥ë̾¤ò¼õ¤±Æþ¤ì¤ë¤«(\fBx\fR¤ª¤è¤Ó\fBt\fR¤Î¾ì¹ç)¡¢JAR¥Õ¥¡¥¤¥ë¤ò\fBstdout\fR¤ËÁ÷¿®¤¹¤ë¤³¤È(\fBc\fR¤ª¤è¤Ó\fBu\fR¤Î¾ì¹ç)¤¬»Ø¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + m + .RS 4 +-(\fIMETA\-INF/MANIFEST\&.MF\fR¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¤¢¤ë) +-\fIjar\fR¥³¥Þ¥ó¥É¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤«¤é¡¢Â°À­¤Î̾Á°¤ÈÃͤΥڥ¢¤ò´Þ¤á¤Þ¤¹¡£\fIjar\fR¥³¥Þ¥ó¥É¤Ï¡¢Æ±¤¸Ì¾Á°¤Î¥¨¥ó¥È¥ê¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¤ò½ü¤­¡¢Â°À­¤Î̾Á°¤ÈÃͤòJAR¥Õ¥¡¥¤¥ë¤ËÄɲä·¤Þ¤¹¡£Æ±¤¸Ì¾Á°¤Î¥¨¥ó¥È¥ê¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ï°À­¤ÎÃͤò¹¹¿·¤·¤Þ¤¹¡£\fIm\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fIu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++(\fBMETA\-INF/MANIFEST\&.MF\fR¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¤¢¤ë) ++\fBjar\fR¥³¥Þ¥ó¥É¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î\fBmanifest\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤«¤é¡¢Â°À­¤Î̾Á°¤ÈÃͤΥڥ¢¤ò´Þ¤á¤Þ¤¹¡£\fBjar\fR¥³¥Þ¥ó¥É¤Ï¡¢Æ±¤¸Ì¾Á°¤Î¥¨¥ó¥È¥ê¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¤ò½ü¤­¡¢Â°À­¤Î̾Á°¤ÈÃͤòJAR¥Õ¥¡¥¤¥ë¤ËÄɲä·¤Þ¤¹¡£Æ±¤¸Ì¾Á°¤Î¥¨¥ó¥È¥ê¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¾ì¹ç¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ï°À­¤ÎÃͤò¹¹¿·¤·¤Þ¤¹¡£\fBm\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fBu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï´Þ¤Þ¤ì¤Ê¤¤¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¡¢ÆÃÊ̤ÊÌÜŪ¤Î̾Á°\-ÃͤΰÀ­¥Ú¥¢¤òÄɲäǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ù¥ó¥À¡¼¾ðÊó¡¢¥ê¥ê¡¼¥¹¾ðÊ󡢥ѥ屡¼¥¸¡¦¥·¡¼¥ê¥ó¥°¤ò»ØÄꤹ¤ë°À­¡¢¤Þ¤¿¤ÏJAR¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô²Äǽ¤Ë¤¹¤ë¤¿¤á¤Î°À­¤òÄɲäǤ­¤Þ¤¹¡£\fIm\fR¥ª¥×¥·¥ç¥ó¤Î»ÈÍÑÎã¤Ï¡¢http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html¤Ë¤¢¤ë ++¥Ç¥Õ¥©¥ë¥È¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï´Þ¤Þ¤ì¤Ê¤¤¥Þ¥Ë¥Õ¥§¥¹¥È¤Ë¡¢ÆÃÊ̤ÊÌÜŪ¤Î̾Á°\-ÃͤΰÀ­¥Ú¥¢¤òÄɲäǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ù¥ó¥À¡¼¾ðÊó¡¢¥ê¥ê¡¼¥¹¾ðÊ󡢥ѥ屡¼¥¸¡¦¥·¡¼¥ê¥ó¥°¤ò»ØÄꤹ¤ë°À­¡¢¤Þ¤¿¤ÏJAR¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô²Äǽ¤Ë¤¹¤ë¤¿¤á¤Î°À­¤òÄɲäǤ­¤Þ¤¹¡£\fBm\fR¥ª¥×¥·¥ç¥ó¤Î»ÈÍÑÎã¤Ï¡¢http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html¤Ë¤¢¤ë + ¥×¥í¥°¥é¥à¤Î¥Ñ¥Ã¥±¡¼¥¸²½¤Ë´Ø¤¹¤ë¹à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + M + .RS 4 +-¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥¨¥ó¥È¥ê¤òºîÀ®¤·¤Ê¤¤(\fIc\fR¤ª¤è¤Ó\fIu\fR¤Î¾ì¹ç)¤«¡¢¤Þ¤¿¤Ï¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥¨¥ó¥È¥ê¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ïºï½ü¤·¤Þ¤¹(\fIu\fR¤Î¾ì¹ç)¡£\fIM\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fIu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥¨¥ó¥È¥ê¤òºîÀ®¤·¤Ê¤¤(\fBc\fR¤ª¤è¤Ó\fBu\fR¤Î¾ì¹ç)¤«¡¢¤Þ¤¿¤Ï¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥¨¥ó¥È¥ê¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ïºï½ü¤·¤Þ¤¹(\fBu\fR¤Î¾ì¹ç)¡£\fBM\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®»þ(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·»þ(\fBu\fR)¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + n + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)»þ¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¥ó¥Æ¥ó¥Ä¤¬pack200(1)¥³¥Þ¥ó¥É¤Î¥Ñ¥Ã¥¯¤ª¤è¤Ó¥¢¥ó¥Ñ¥Ã¥¯Áàºî¤Î±Æ¶Á¤ò¼õ¤±¤Ê¤¤¤è¤¦¤Ë¥¢¡¼¥«¥¤¥Ö¤òÀµµ¬²½¤·¤Þ¤¹¡£¤³¤ÎÀµµ¬²½¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¡¢½ð̾ÉÕ¤­JAR¤Î½ð̾¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)»þ¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¥ó¥Æ¥ó¥Ä¤¬pack200(1)¥³¥Þ¥ó¥É¤Î¥Ñ¥Ã¥¯¤ª¤è¤Ó¥¢¥ó¥Ñ¥Ã¥¯Áàºî¤Î±Æ¶Á¤ò¼õ¤±¤Ê¤¤¤è¤¦¤Ë¥¢¡¼¥«¥¤¥Ö¤òÀµµ¬²½¤·¤Þ¤¹¡£¤³¤ÎÀµµ¬²½¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¡¢½ð̾ÉÕ¤­JAR¤Î½ð̾¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + v +@@ -237,46 +247,48 @@ + .PP + 0 + .RS 4 +-(¥¼¥í) ZIP°µ½Ì¤ò»ÈÍѤ·¤Ê¤¤¤ÇJAR¥Õ¥¡¥¤¥ë¤òºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)¤·¤Þ¤¹¡£ ++(¥¼¥í) ZIP°µ½Ì¤ò»ÈÍѤ·¤Ê¤¤¤ÇJAR¥Õ¥¡¥¤¥ë¤òºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)¤·¤Þ¤¹¡£ + .RE + .PP + \-C \fIdir\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)»þ¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fIfile\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤Î½èÍýÃæ¤Ë¥Ç¥£¥ì¥¯¥È¥ê¤ò°ì»þŪ¤ËÊѹ¹¤·¤Þ¤¹¡£¤³¤ÎÁàºî¤Ï¡¢UNIX +-\fItar\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î\fI\-C\fR¥ª¥×¥·¥ç¥ó¤ÈƱÍͤˤʤ뤳¤È¤òÌÜŪ¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fIclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹¤µ¤ì¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é\fImy\&.jar\fR¤Ë\fIBar\&.class\fR¥Õ¥¡¥¤¥ë¤¬Äɲ䵤ì¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)»þ¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fIfile\fR¥ª¥Ú¥é¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤Î½èÍýÃæ¤Ë¥Ç¥£¥ì¥¯¥È¥ê¤ò°ì»þŪ¤ËÊѹ¹¤·¤Þ¤¹¡£¤³¤ÎÁàºî¤Ï¡¢\fBtar\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î\fB\-C\fR¥ª¥×¥·¥ç¥ó¤ÈƱÍͤˤʤ뤳¤È¤òÌÜŪ¤È¤·¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fBclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹¤µ¤ì¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é\fBmy\&.jar\fR¤Ë\fBBar\&.class\fR¥Õ¥¡¥¤¥ë¤¬Äɲ䵤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar uf my\&.jar \-C classes Bar\&.class ++\fBjar uf my\&.jar \-C classes Bar\&.class\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¡¢classes¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò\fImy\&.jar\fR¤ËÄɲä·¤Þ¤¹(JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fIclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤»¤ó)¡£¼¡¤Ë¸µ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÌá¤Ã¤Æ¤«¤é¡¢\fIbin\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¡¢\fIXyz\&.class\fR¤ò\fImy\&.jar\fR¤ËÄɲä·¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¡¢classes¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò\fBmy\&.jar\fR¤ËÄɲä·¤Þ¤¹(JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fBclasses\fR¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤»¤ó)¡£¼¡¤Ë¸µ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÌá¤Ã¤Æ¤«¤é¡¢\fBbin\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¡¢\fBXyz\&.class\fR¤ò\fBmy\&.jar\fR¤ËÄɲä·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar uf my\&.jar \-C classes \&. \-C bin Xyz\&.class ++\fBjar uf my\&.jar \-C classes \&. \-C bin Xyz\&.class\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIclasses\fR¤Ë\fIbar1\fR¥Õ¥¡¥¤¥ë¤È\fIbar2\fR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢Á°½Ò¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¼¡¤Î¤â¤Î¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++\fBclasses\fR¤Ë\fBbar1\fR¥Õ¥¡¥¤¥ë¤È\fBbar2\fR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢Á°½Ò¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¼¡¤Î¤â¤Î¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% \fIjar tf my\&.jar\fR +-META\-INF/ +-META\-INF/MANIFEST\&.MF +-bar1 +-bar2 +-Xyz\&.class ++\fB% \fR\fB\fBjar tf my\&.jar\fR\fR ++\fBMETA\-INF/\fR ++\fBMETA\-INF/MANIFEST\&.MF\fR ++\fBbar1\fR ++\fBbar2\fR ++\fBXyz\&.class\fR ++ + .fi + .if n \{\ + .RE +@@ -285,69 +297,72 @@ + .PP + \-J\fIoption\fR + .RS 4 +-»ØÄꤷ¤¿JVM¥ª¥×¥·¥ç¥ó¤ò¡¢JRE¤¬JAR¥Õ¥¡¥¤¥ë¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë»ÈÍѤ¹¤ë¤è¤¦¤ËÀßÄꤷ¤Þ¤¹¡£JVM¥ª¥×¥·¥ç¥ó¤Ï¡¢java(1)¥³¥Þ¥ó¥É¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ++»ØÄꤷ¤¿JVM¥ª¥×¥·¥ç¥ó¤ò¡¢JRE¤¬JAR¥Õ¥¡¥¤¥ë¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë»ÈÍѤ¹¤ë¤è¤¦¤ËÀßÄꤷ¤Þ¤¹¡£JVM¥ª¥×¥·¥ç¥ó¤Ï¡¢java(1)¥³¥Þ¥ó¥É¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .SH "¥ª¥Ú¥é¥ó¥É" + .PP +-¼¡¤Î¥ª¥Ú¥é¥ó¥É¤Ï¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Çǧ¼±¤µ¤ì¤Þ¤¹¡£ ++¼¡¤Î¥ª¥Ú¥é¥ó¥É¤Ï¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Çǧ¼±¤µ¤ì¤Þ¤¹¡£ + .PP + \fIfile\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)»þ¤Ë¡¢\fIfile\fR¥ª¥Ú¥é¥ó¥É¤Ï¡¢¥¢¡¼¥«¥¤¥Ö¤ËÄɲ乤ëɬÍפΤ¢¤ë¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤Î¥Ñ¥¹¤È̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤ÎÃê½Ð(\fIx\fR)¤Þ¤¿¤Ï¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È(\fIt\fR)»þ¤Ë¡¢\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ÏÃê½Ð¤Þ¤¿¤Ï¥ê¥¹¥È¤¹¤ë¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£¾¯¤Ê¤¯¤È¤â1¤Ä¤ÎÍ­¸ú¤Ê¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Ê£¿ô¤Î\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ò¶õÇò¤Ç¶èÀÚ¤ê¤Þ¤¹¡£\fIentrypoint\fR¡¢\fIjarfile\fR¤Þ¤¿¤Ï\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¤Ï¡¢¤½¤Î¸å¤Ë\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)»þ¤Ë¡¢\fIfile\fR¥ª¥Ú¥é¥ó¥É¤Ï¡¢¥¢¡¼¥«¥¤¥Ö¤ËÄɲ乤ëɬÍפΤ¢¤ë¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤Î¥Ñ¥¹¤È̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤ÎÃê½Ð(\fBx\fR)¤Þ¤¿¤Ï¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È(\fBt\fR)»þ¤Ë¡¢\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ÏÃê½Ð¤Þ¤¿¤Ï¥ê¥¹¥È¤¹¤ë¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£¾¯¤Ê¤¯¤È¤â1¤Ä¤ÎÍ­¸ú¤Ê¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Ê£¿ô¤Î\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ò¶õÇò¤Ç¶èÀÚ¤ê¤Þ¤¹¡£\fIentrypoint\fR¡¢\fIjarfile\fR¤Þ¤¿¤Ï\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¤Ï¡¢¤½¤Î¸å¤Ë\fIfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \fIentrypoint\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)»þ¤Ë¡¢\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤Ï¡¢¼Â¹Ô²ÄǽJAR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤Æ¤¤¤ë¥¹¥¿¥ó¥É¥¢¥í¥óJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤È¤Ê¤ë¥¯¥é¥¹¤Î̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£\fIe\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)»þ¤Ë¡¢\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤Ï¡¢¼Â¹Ô²ÄǽJAR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤Æ¤¤¤ë¥¹¥¿¥ó¥É¥¢¥í¥óJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¨¥ó¥È¥ê¡¦¥Ý¥¤¥ó¥È¤È¤Ê¤ë¥¯¥é¥¹¤Î̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£\fBe\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fIentrypoint\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \fIjarfile\fR + .RS 4 +-ºîÀ®(\fIc\fR)¡¢¹¹¿·(\fIu\fR)¡¢Ãê½Ð(\fIx\fR)¤Þ¤¿¤Ïɽ¼¨(\fIt\fR)¤¹¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£\fIf\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIf\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò¾Êά¤¹¤ë¤È¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ë¡¢\fIstdin\fR¤«¤é¤ÎJAR¥Õ¥¡¥¤¥ë̾¤ò¼õ¤±Æþ¤ì¤ë¤«(\fIx\fR¤ª¤è¤Ó\fIt\fR¤Î¾ì¹ç)¡¢JAR¥Õ¥¡¥¤¥ë¤ò\fIstdout\fR¤ËÁ÷¿®¤¹¤ë¤³¤È(\fIc\fR¤ª¤è¤Ó\fIu\fR¤Î¾ì¹ç)¤¬»Ø¼¨¤µ¤ì¤Þ¤¹¡£ ++ºîÀ®(\fBc\fR)¡¢¹¹¿·(\fBu\fR)¡¢Ãê½Ð(\fBx\fR)¤Þ¤¿¤Ïɽ¼¨(\fBt\fR)¤¹¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¤òÄêµÁ¤·¤Þ¤¹¡£\fBf\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBf\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò¾Êά¤¹¤ë¤È¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ë¡¢\fBstdin\fR¤«¤é¤ÎJAR¥Õ¥¡¥¤¥ë̾¤ò¼õ¤±Æþ¤ì¤ë¤«(\fBx\fR¤ª¤è¤Ó\fBt\fR¤Î¾ì¹ç)¡¢JAR¥Õ¥¡¥¤¥ë¤ò\fBstdout\fR¤ËÁ÷¿®¤¹¤ë¤³¤È(\fBc\fR¤ª¤è¤Ó\fBu\fR¤Î¾ì¹ç)¤¬»Ø¼¨¤µ¤ì¤Þ¤¹¡£ + .sp +-JAR¥Õ¥¡¥¤¥ë¤òº÷°úÉÕ¤±(\fIi\fR)¤¹¤ë¾ì¹ç¤Ï¡¢\fIf\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤Ç\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤷ¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤òº÷°úÉÕ¤±(\fBi\fR)¤¹¤ë¾ì¹ç¤Ï¡¢\fBf\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤Ç\fIjarfile\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \fImanifest\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fIc\fR)¤Þ¤¿¤Ï¹¹¿·(\fIu\fR)»þ¤Ë¡¢\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ÏJAR¥Õ¥¡¥¤¥ë¤Î\fIMANIFEST\&.MF\fR¤Ë´Þ¤á¤ë°À­¤Î̾Á°¤ÈÃͤò»ý¤Ä´û¸¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤òÄêµÁ¤·¤Þ¤¹¡£\fIf\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ÎºîÀ®(\fBc\fR)¤Þ¤¿¤Ï¹¹¿·(\fBu\fR)»þ¤Ë¡¢\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ÏJAR¥Õ¥¡¥¤¥ë¤Î\fBMANIFEST\&.MF\fR¤Ë´Þ¤á¤ë°À­¤Î̾Á°¤ÈÃͤò»ý¤Ä´û¸¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤òÄêµÁ¤·¤Þ¤¹¡£\fBf\fR¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \fI@arg\-file\fR + .RS 4 +-\fIjar\fR¥³¥Þ¥ó¥É¤òû½Ì¤Þ¤¿¤Ï´ÊÁDz½¤¹¤ë¤Ë¤Ï¡¢Ê̤Υƥ­¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤ò»ØÄꤷ¡¢ÀÜƬ¼­¤È¤·¤Æ¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤òÉÕ¤±¤Æ\fIjar\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIjar\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯Ê¸»ú¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤òû½Ì¤Þ¤¿¤Ï´ÊÁDz½¤¹¤ë¤Ë¤Ï¡¢Ê̤Υƥ­¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤ò»ØÄꤷ¡¢ÀÜƬ¼­¤È¤·¤Æ¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤òÉÕ¤±¤Æ\fBjar\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBjar\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯Ê¸»ú¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ + .sp +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤È°ú¿ô(°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Ê¤¤µ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤ë\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤Ï¡¢¶õÇò¤Þ¤¿¤Ï²þ¹Ôʸ»ú¤Ç¶èÀڤ뤳¤È¤¬¤Ç¤­¤Þ¤¹¡£°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢\fIjar\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÂФ·¤ÆÁêÂÐŪ¤Ç¤¢¤ê¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î¾ì½ê¤ËÂФ·¤Æ¤ÏÁêÂÐŪ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£Ä̾ï¤Ï¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥·¥§¥ë¤Ë¤è¤Ã¤ÆŸ³«¤µ¤ì¤ë¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ê¤É¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÏŸ³«¤µ¤ì¤Þ¤»¤ó¡£ ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤È°ú¿ô(°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Ê¤¤µ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤ë\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤Ï¡¢¶õÇò¤Þ¤¿¤Ï²þ¹Ôʸ»ú¤Ç¶èÀڤ뤳¤È¤¬¤Ç¤­¤Þ¤¹¡£°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢\fBjar\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÂФ·¤ÆÁêÂÐŪ¤Ç¤¢¤ê¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î¾ì½ê¤ËÂФ·¤Æ¤ÏÁêÂÐŪ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£Ä̾ï¤Ï¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥·¥§¥ë¤Ë¤è¤Ã¤ÆŸ³«¤µ¤ì¤ë¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ê¤É¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÏŸ³«¤µ¤ì¤Þ¤»¤ó¡£ + .sp +-¼¡¤ÎÎã¤Ï¡¢\fIfind\fR¥³¥Þ¥ó¥É¤Ë¤è¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê½ÐÎϤ«¤é¤Î¥Õ¥¡¥¤¥ë̾¤Ç\fIclasses\&.list\fR¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ï¡¢\fBfind\fR¥³¥Þ¥ó¥É¤Ë¤è¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê½ÐÎϤ«¤é¤Î¥Õ¥¡¥¤¥ë̾¤Ç\fBclasses\&.list\fR¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-find \&. \-name \*(Aq*\&.class\*(Aq \-print > classes\&.list ++\fBfind \&. \-name \*(Aq*\&.class\*(Aq \-print > classes\&.list\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIjar\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢\fI@arg\-file\fR¹½Ê¸¤ò»ÈÍѤ·¤Æ\fIclasses\&.list\fR¥Õ¥¡¥¤¥ë¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBjar\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢\fI@arg\-file\fR¹½Ê¸¤ò»ÈÍѤ·¤Æ\fBclasses\&.list\fR¥Õ¥¡¥¤¥ë¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar cf my\&.jar @classes\&.list ++\fBjar cf my\&.jar @classes\&.list\fR ++ + .fi + .if n \{\ + .RE + .\} +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢ÁêÂХѥ¹¤¬µ­½Ò¤µ¤ì¤¿°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢ÅϤµ¤ì¤¿¥Ñ¥¹¤ËÂФ·¤ÆÁêÂÐŪ¤Ç¤Ï¤Ê¤¯¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Î¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢ÁêÂХѥ¹¤¬µ­½Ò¤µ¤ì¤¿°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢ÅϤµ¤ì¤¿¥Ñ¥¹¤ËÂФ·¤ÆÁêÂÐŪ¤Ç¤Ï¤Ê¤¯¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Î¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar @dir/classes\&.list ++\fBjar @dir/classes\&.list\fR ++ + .fi + .if n \{\ + .RE +@@ -355,86 +370,95 @@ + .RE + .SH "Ãí°Õ" + .PP +-\fIe\fR¡¢\fIf\fR¤ª¤è¤Ó\fIm\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIentrypoint\fR¡¢\fIjarfile\fR¤ª¤è¤Ó\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ÈƱ¤¸½ç½ø¤Ç¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë½Ð¸½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBe\fR¡¢\fBf\fR¤ª¤è¤Ó\fBm\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIentrypoint\fR¡¢\fIjarfile\fR¤ª¤è¤Ó\fImanifest\fR¥ª¥Ú¥é¥ó¥É¤ÈƱ¤¸½ç½ø¤Ç¥³¥Þ¥ó¥É¹Ô¤Ë½Ð¸½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jar cmef myManifestFile MyMainClass myFile\&.jar *\&.class ++\fBjar cmef myManifestFile MyMainClass myFile\&.jar *\&.class\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "Îã" + .PP +-\fBExample 1\fR, ¾éĹ¤Ê½ÐÎϤˤè¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ÎÄɲà ++\fBÎã 1\fR ++.br ++¾éĹ¤Ê½ÐÎϤˤè¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ÎÄɲà + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% ls +-1\&.au Animator\&.class monkey\&.jpg +-2\&.au Wave\&.class spacemusic\&.au +-3\&.au at_work\&.gif +- +-% jar cvf bundle\&.jar * +-added manifest +-adding: 1\&.au(in = 2324) (out= 67)(deflated 97%) +-adding: 2\&.au(in = 6970) (out= 90)(deflated 98%) +-adding: 3\&.au(in = 11616) (out= 108)(deflated 99%) +-adding: Animator\&.class(in = 2266) (out= 66)(deflated 97%) +-adding: Wave\&.class(in = 3778) (out= 81)(deflated 97%) +-adding: at_work\&.gif(in = 6621) (out= 89)(deflated 98%) +-adding: monkey\&.jpg(in = 7667) (out= 91)(deflated 98%) +-adding: spacemusic\&.au(in = 3079) (out= 73)(deflated 97%) ++\fB% ls\fR ++\fB1\&.au Animator\&.class monkey\&.jpg\fR ++\fB2\&.au Wave\&.class spacemusic\&.au\fR ++\fB3\&.au at_work\&.gif\fR ++ ++\fB% jar cvf bundle\&.jar *\fR ++\fBadded manifest\fR ++\fBadding: 1\&.au(in = 2324) (out= 67)(deflated 97%)\fR ++\fBadding: 2\&.au(in = 6970) (out= 90)(deflated 98%)\fR ++\fBadding: 3\&.au(in = 11616) (out= 108)(deflated 99%)\fR ++\fBadding: Animator\&.class(in = 2266) (out= 66)(deflated 97%)\fR ++\fBadding: Wave\&.class(in = 3778) (out= 81)(deflated 97%)\fR ++\fBadding: at_work\&.gif(in = 6621) (out= 89)(deflated 98%)\fR ++\fBadding: monkey\&.jpg(in = 7667) (out= 91)(deflated 98%)\fR ++\fBadding: spacemusic\&.au(in = 3079) (out= 73)(deflated 97%)\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¥Õ¥¡¥¤¥ë¤ÎÄɲà ++\fBÎã 2\fR ++.br ++¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¥Õ¥¡¥¤¥ë¤ÎÄɲà + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% ls \-F +-audio/ classes/ images/ +-% jar cvf bundle\&.jar audio classes images +-added manifest +-adding: audio/(in = 0) (out= 0)(stored 0%) +-adding: audio/1\&.au(in = 2324) (out= 67)(deflated 97%) +-adding: audio/2\&.au(in = 6970) (out= 90)(deflated 98%) +-adding: audio/3\&.au(in = 11616) (out= 108)(deflated 99%) +-adding: audio/spacemusic\&.au(in = 3079) (out= 73)(deflated 97%) +-adding: classes/(in = 0) (out= 0)(stored 0%) +-adding: classes/Animator\&.class(in = 2266) (out= 66)(deflated 97%) +-adding: classes/Wave\&.class(in = 3778) (out= 81)(deflated 97%) +-adding: images/(in = 0) (out= 0)(stored 0%) +-adding: images/monkey\&.jpg(in = 7667) (out= 91)(deflated 98%) +-adding: images/at_work\&.gif(in = 6621) (out= 89)(deflated 98%) +- +-% ls \-F +-audio/ bundle\&.jar classes/ images/ ++\fB% ls \-F\fR ++\fBaudio/ classes/ images/\fR ++\fB% jar cvf bundle\&.jar audio classes images\fR ++\fBadded manifest\fR ++\fBadding: audio/(in = 0) (out= 0)(stored 0%)\fR ++\fBadding: audio/1\&.au(in = 2324) (out= 67)(deflated 97%)\fR ++\fBadding: audio/2\&.au(in = 6970) (out= 90)(deflated 98%)\fR ++\fBadding: audio/3\&.au(in = 11616) (out= 108)(deflated 99%)\fR ++\fBadding: audio/spacemusic\&.au(in = 3079) (out= 73)(deflated 97%)\fR ++\fBadding: classes/(in = 0) (out= 0)(stored 0%)\fR ++\fBadding: classes/Animator\&.class(in = 2266) (out= 66)(deflated 97%)\fR ++\fBadding: classes/Wave\&.class(in = 3778) (out= 81)(deflated 97%)\fR ++\fBadding: images/(in = 0) (out= 0)(stored 0%)\fR ++\fBadding: images/monkey\&.jpg(in = 7667) (out= 91)(deflated 98%)\fR ++\fBadding: images/at_work\&.gif(in = 6621) (out= 89)(deflated 98%)\fR ++ ++\fB% ls \-F\fR ++\fBaudio/ bundle\&.jar classes/ images/\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, JAR¤Î¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È ++\fBÎã 3\fR ++.br ++JAR¤Î¥³¥ó¥Æ¥ó¥Ä¤Î¥ê¥¹¥È + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% jar tf bundle\&.jar ++\fB% jar tf bundle\&.jar\fR + .fi + .if n \{\ + .RE +@@ -444,45 +468,50 @@ + .RS 4 + .\} + .nf +-META\-INF/ +-META\-INF/MANIFEST\&.MF +-audio/1\&.au +-audio/2\&.au +-audio/3\&.au +-audio/spacemusic\&.au +-classes/Animator\&.class +-classes/Wave\&.class +-images/monkey\&.jpg +-images/at_work\&.gif ++\fBMETA\-INF/\fR ++\fBMETA\-INF/MANIFEST\&.MF\fR ++\fBaudio/1\&.au\fR ++\fBaudio/2\&.au\fR ++\fBaudio/3\&.au\fR ++\fBaudio/spacemusic\&.au\fR ++\fBclasses/Animator\&.class\fR ++\fBclasses/Wave\&.class\fR ++\fBimages/monkey\&.jpg\fR ++\fBimages/at_work\&.gif\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 4\fR, º÷°ú¤ÎÄɲà ++\fBÎã 4\fR ++.br ++º÷°ú¤ÎÄɲà + .RS 4 +-³ô¼°¼è°ú¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÁê¸ß°Í¸¥¯¥é¥¹¤ò¡¢\fImain\&.jar\fR¡¢\fIbuy\&.jar\fR¤ª¤è¤Ó\fIsell\&.jar\fR¤Î3¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤¹¤ë¾ì¹ç¡¢\fIi\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fImain\&.jar\fR¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î\fIClass\-Path\fR°À­¤ò»ØÄꤹ¤ë¾ì¹ç¡¢\fIi\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥É¤Î®ÅÙ¤ò¸þ¾å¤Ç¤­¤Þ¤¹¡£ ++³ô¼°¼è°ú¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÁê¸ß°Í¸¥¯¥é¥¹¤ò¡¢\fBmain\&.jar\fR¡¢\fBbuy\&.jar\fR¤ª¤è¤Ó\fBsell\&.jar\fR¤Î3¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤¹¤ë¾ì¹ç¡¢\fBi\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fBmain\&.jar\fR¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Î\fBClass\-Path\fR°À­¤ò»ØÄꤹ¤ë¾ì¹ç¡¢\fBi\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥É¤Î®ÅÙ¤ò¸þ¾å¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Class\-Path: buy\&.jar sell\&.jar +-jar i main\&.jar ++\fBClass\-Path: buy\&.jar sell\&.jar\fR ++\fBjar i main\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIINDEX\&.LIST\fR¥Õ¥¡¥¤¥ë¤¬\fIMETA\-INF\fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÁÞÆþ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ë¤è¤Ã¤Æ¥¯¥é¥¹¤Þ¤¿¤Ï¥ê¥½¡¼¥¹¤Î¸¡º÷¤¬¹Ô¤ï¤ì¤ë¤È¤­¤Ë¡¢»ØÄꤷ¤¿JAR¥Õ¥¡¥¤¥ë¤¬¥À¥¦¥ó¥í¡¼¥É¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBINDEX\&.LIST\fR¥Õ¥¡¥¤¥ë¤¬\fBMETA\-INF\fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÁÞÆþ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ë¤è¤Ã¤Æ¥¯¥é¥¹¤Þ¤¿¤Ï¥ê¥½¡¼¥¹¤Î¸¡º÷¤¬¹Ô¤ï¤ì¤ë¤È¤­¤Ë¡¢»ØÄꤷ¤¿JAR¥Õ¥¡¥¤¥ë¤¬¥À¥¦¥ó¥í¡¼¥É¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢¸úΨŪ¤Ë¥¯¥é¥¹¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ò¥³¥Ô¡¼¤¹¤ë¤Ë¤Ï¡¢ºÇ½é¤Ë\fIdir1\fRÆâ¤Î¥Õ¥¡¥¤¥ë¤ò\fIstdout\fR¤Ë°µ½Ì¤·¤Æ¤«¤é¡¢\fIstdin\fR¤«¤é\fIdir2\fR¤Ë¥Ñ¥¤¥×¥é¥¤¥ó¤òºîÀ®¤·¤ÆÃê½Ð¤·¤Þ¤¹(\fI\-f\fR¥ª¥×¥·¥ç¥ó¤ÏξÊý¤Î\fIjar\fR¥³¥Þ¥ó¥É¤Ç¾Êά¤·¤Þ¤¹)¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢¸úΨŪ¤Ë¥¯¥é¥¹¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ò¥³¥Ô¡¼¤¹¤ë¤Ë¤Ï¡¢ºÇ½é¤Ë\fBdir1\fRÆâ¤Î¥Õ¥¡¥¤¥ë¤ò\fBstdout\fR¤Ë°µ½Ì¤·¤Æ¤«¤é¡¢\fBstdin\fR¤«¤é\fBdir2\fR¤Ë¥Ñ¥¤¥×¥é¥¤¥ó¤òºîÀ®¤·¤ÆÃê½Ð¤·¤Þ¤¹(\fB\-f\fR¥ª¥×¥·¥ç¥ó¤ÏξÊý¤Î\fBjar\fR¥³¥Þ¥ó¥É¤Ç¾Êά¤·¤Þ¤¹)¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-(cd dir1; jar c \&.) | (cd dir2; jar x) ++\fB(cd dir1; jar c \&.) | (cd dir2; jar x)\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jarsigner.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jarsigner.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jarsigner +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jarsigner ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jarsigner" "1" "2013ǯ11·î21Æü" "JDK 8" "¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jarsigner \- Java¥¢¡¼¥«¥¤¥Ö(JAR)¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ½ð̾¤ª¤è¤Ó¸¡¾Ú¤ò¹Ô¤¤¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjarsigner\fR [ \fIoptions\fR ] \fIjar\-file\fR \fIalias\fR ++\fBjarsigner\fR [ \fIoptions\fR ] \fIjar\-file\fR \fIalias\fR + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjarsigner\fR \fI\-verify\fR [ \fIoptions\fR ] \fIjar\-file\fR [\fIalias \&.\&.\&.\fR] ++\fBjarsigner\fR \fB\-verify\fR [ \fIoptions\fR ] \fIjar\-file\fR [\fIalias \&.\&.\&.\fR] + .fi + .if n \{\ + .RE +@@ -74,30 +76,30 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-verify + .RS 4 +-\fI\-verify\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ë̾¤Î¸å¤Ë0¸Ä°Ê¾å¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fI\-verify\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ½ð̾ÉÕ¤­¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸¡¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬¡¢¤¤¤º¤ì¤«¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤Ë°ìÃפ¹¤ë¤³¤È¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ÊÌ̾¤Ï¡¢\fI\-keystore\fR¤Ç»ØÄꤵ¤ì¤¿¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢Æâ¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ ++\fB\-verify\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ë̾¤Î¸å¤Ë0¸Ä°Ê¾å¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fB\-verify\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ½ð̾ÉÕ¤­¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸¡¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬¡¢¤¤¤º¤ì¤«¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤Ë°ìÃפ¹¤ë¤³¤È¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ÊÌ̾¤Ï¡¢\fB\-keystore\fR¤Ç»ØÄꤵ¤ì¤¿¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢Æâ¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢¥á¥Ã¥»¡¼¥¸¡Öjar¤¬¸¡¾Ú¤µ¤ì¤Þ¤·¤¿¡£½ð̾¼Ô¥¨¥é¡¼¡×¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢¥á¥Ã¥»¡¼¥¸¡Öjar¤¬¸¡¾Ú¤µ¤ì¤Þ¤·¤¿¡£½ð̾¼Ô¥¨¥é¡¼¡×¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \fIjar\-file\fR + .RS 4 + ½ð̾¤µ¤ì¤ëJAR¥Õ¥¡¥¤¥ë¡£ + .sp +-\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢¥á¥Ã¥»¡¼¥¸¡Öjar¤Ï½ð̾¤µ¤ì¤Þ¤·¤¿ \- ½ð̾¼Ô¥¨¥é¡¼¤¬¤¢¤ê¤Þ¤¹¡£¡×¤È¤¤¤¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¸¡½Ð¤µ¤ì¤ë¤È¡¢¥á¥Ã¥»¡¼¥¸¡Öjar¤Ï½ð̾¤µ¤ì¤Þ¤·¤¿ \- ½ð̾¼Ô¥¨¥é¡¼¤¬¤¢¤ê¤Þ¤¹¡£¡×¤È¤¤¤¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \fIalias\fR + .RS 4 +-ÊÌ̾¤Ï¡¢\fI\-keystore\fR¤Ç»ØÄꤵ¤ì¤¿¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢Æâ¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ ++ÊÌ̾¤Ï¡¢\fB\-keystore\fR¤Ç»ØÄꤵ¤ì¤¿¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢Æâ¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjarsigner\fR¥Ä¡¼¥ë¤Ë¤Ï¡¢¼¡¤Î2¤Ä¤ÎÌÜŪ¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBjarsigner\fR¥Ä¡¼¥ë¤Ë¤Ï¡¢¼¡¤Î2¤Ä¤ÎÌÜŪ¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -121,7 +123,7 @@ + ½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ÈÀ°¹çÀ­¤ò¸¡¾Ú¤¹¤ëÌÜŪ¡£ + .RE + .PP +-JARµ¡Ç½¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥¤¥á¡¼¥¸¡¢¥µ¥¦¥ó¥É¤ª¤è¤Ó¤½¤Î¾¤Î¥Ç¥¸¥¿¥ë¡¦¥Ç¡¼¥¿¤òñ°ì¤Î¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸²½¤Ç¤­¤ë¤Î¤Ç¡¢¥Õ¥¡¥¤¥ë¤ò¿×®¤«¤ÄÍưפËÇÛÉۤǤ­¤Þ¤¹¡£\fIjar\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¡¢³«È¯¼Ô¤ÏJAR¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£(µ»½ÑŪ¤Ê´ÑÅÀ¤«¤é¸À¤¨¤Ð¡¢¤¹¤Ù¤Æ¤ÎZIP¥Õ¥¡¥¤¥ë¤âJAR¥Õ¥¡¥¤¥ë¤È¤ß¤Ê¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ½èÍý¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤â´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£) ++JARµ¡Ç½¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥¤¥á¡¼¥¸¡¢¥µ¥¦¥ó¥É¤ª¤è¤Ó¤½¤Î¾¤Î¥Ç¥¸¥¿¥ë¡¦¥Ç¡¼¥¿¤òñ°ì¤Î¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸²½¤Ç¤­¤ë¤Î¤Ç¡¢¥Õ¥¡¥¤¥ë¤ò¿×®¤«¤ÄÍưפËÇÛÉۤǤ­¤Þ¤¹¡£\fBjar\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¡¢³«È¯¼Ô¤ÏJAR¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£(µ»½ÑŪ¤Ê´ÑÅÀ¤«¤é¸À¤¨¤Ð¡¢¤¹¤Ù¤Æ¤ÎZIP¥Õ¥¡¥¤¥ë¤âJAR¥Õ¥¡¥¤¥ë¤È¤ß¤Ê¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ½èÍý¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤â´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£) + .PP + ¥Ç¥¸¥¿¥ë½ð̾¤Ï¡¢¤Ê¤ó¤é¤«¤Î¥Ç¡¼¥¿(½ð̾¤ÎÂоݤȤʤë¥Ç¡¼¥¿)¡¢¤ª¤è¤Ó¥¨¥ó¥Æ¥£¥Æ¥£(¿Í¡¢²ñ¼Ò¤Ê¤É)¤ÎÈëÌ©¸°¤«¤é·×»»¤µ¤ì¤ë¥Ó¥Ã¥È¤Îʸ»úÎó¤Ç¤¹¡£¼ê½ñ¤­¤Î½ð̾ƱÍÍ¡¢¥Ç¥¸¥¿¥ë½ð̾¤Ë¤Ï¿¤¯¤ÎÍøÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +@@ -171,97 +173,101 @@ + .PP + ¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¨¥ó¥Æ¥£¥Æ¥£¤Î½ð̾¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢¤Þ¤º¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢¤½¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ë´ØÏ¢¤¹¤ë¸ø³«¸°/ÈëÌ©¸°¤Î¥Ú¥¢¤È¡¢¸ø³«¸°¤òǧ¾Ú¤¹¤ë1¤Ä°Ê¾å¤Î¾ÚÌÀ½ñ¤ò»ý¤ÄɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÚÌÀ½ñ¤È¤Ï¡¢¤¢¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤«¤é¤Î¥Ç¥¸¥¿¥ë½ð̾ÉÕ¤­¤Îʸ½ñ¤Ç¡¢Ê̤Υ¨¥ó¥Æ¥£¥Æ¥£¤Î¸ø³«¸°¤¬ÆÃÄê¤ÎÃͤò»ý¤Ä¤³¤È¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤«¤é¤Î¸°¤È¾ÚÌÀ½ñ¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢JAR¥Õ¥¡¥¤¥ë¤Î¥Ç¥¸¥¿¥ë½ð̾¤òÀ¸À®¤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¡¢ÈëÌ©¸°¡¢¤ª¤è¤ÓÂбþ¤¹¤ë¸ø³«¸°¤òǧ¾Ú¤¹¤ë¡¢ÈëÌ©¸°¤Ë´ØÏ¢¤·¤¿X\&.509¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ç¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢¤òºîÀ®¤ª¤è¤Ó´ÉÍý¤·¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤«¤é¤Î¸°¤È¾ÚÌÀ½ñ¾ðÊó¤ò»ÈÍѤ·¤Æ¡¢JAR¥Õ¥¡¥¤¥ë¤Î¥Ç¥¸¥¿¥ë½ð̾¤òÀ¸À®¤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¡¢ÈëÌ©¸°¡¢¤ª¤è¤ÓÂбþ¤¹¤ë¸ø³«¸°¤òǧ¾Ú¤¹¤ë¡¢ÈëÌ©¸°¤Ë´ØÏ¢¤·¤¿X\&.509¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ç¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢¤òºîÀ®¤ª¤è¤Ó´ÉÍý¤·¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤ÎÈëÌ©¸°¤ò»ÈÍѤ·¤Æ½ð̾¤òÀ¸À®¤·¤Þ¤¹¡£½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Æäˡ¢¥Õ¥¡¥¤¥ë¤Ø¤Î½ð̾¤Ë»ÈÍѤ¹¤ëÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤Î¥­¡¼¥¹¥È¥¢¤«¤é¤Î¾ÚÌÀ½ñ¤Î¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Þ¤¹¡£\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÆâÉô(½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ëÆâ)¤Î¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î¥Ç¥¸¥¿¥ë½ð̾¤ò¸¡¾Ú¤Ç¤­¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤ÎÈëÌ©¸°¤ò»ÈÍѤ·¤Æ½ð̾¤òÀ¸À®¤·¤Þ¤¹¡£½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Æäˡ¢¥Õ¥¡¥¤¥ë¤Ø¤Î½ð̾¤Ë»ÈÍѤ¹¤ëÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤Î¥­¡¼¥¹¥È¥¢¤«¤é¤Î¾ÚÌÀ½ñ¤Î¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Þ¤¹¡£\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÆâÉô(½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ëÆâ)¤Î¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î¥Ç¥¸¥¿¥ë½ð̾¤ò¸¡¾Ú¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢½ð̾¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü´ÖÃæ¤ËJAR¥Õ¥¡¥¤¥ë¤¬½ð̾¤µ¤ì¤¿¤µ¤ì¤¿¤«¤É¤¦¤«¤ò¥·¥¹¥Æ¥à¤ä¥Ç¥×¥í¥¤¥ä(Java Plug\-in¤ò´Þ¤à)¤¬¥Á¥§¥Ã¥¯¤Ç¤­¤ë¡¢¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤à½ð̾¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë¡¢API¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¥¿¥¤¥à¥¹¥¿¥ó¥×¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢½ð̾¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü´ÖÃæ¤ËJAR¥Õ¥¡¥¤¥ë¤¬½ð̾¤µ¤ì¤¿¤µ¤ì¤¿¤«¤É¤¦¤«¤ò¥·¥¹¥Æ¥à¤ä¥Ç¥×¥í¥¤¥ä(Java Plug\-in¤ò´Þ¤à)¤¬¥Á¥§¥Ã¥¯¤Ç¤­¤ë¡¢¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤à½ð̾¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë¡¢API¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¥¿¥¤¥à¥¹¥¿¥ó¥×¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£ + .PP +-¸½»þÅÀ¤Ç¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIjar\fR¥³¥Þ¥ó¥É¤Þ¤¿¤ÏZIP¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Î¤ß¤Ë½ð̾¤Ç¤­¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤ÏZIP¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤Ç¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fIMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤â´Þ¤Þ¤ì¤Æ¤¤¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£\fIMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆZIP¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ëºÝ¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ ++¸½»þÅÀ¤Ç¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBjar\fR¥³¥Þ¥ó¥É¤Þ¤¿¤ÏZIP¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤Î¤ß¤Ë½ð̾¤Ç¤­¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤ÏZIP¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤Ç¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fBMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤â´Þ¤Þ¤ì¤Æ¤¤¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£\fBMETA\-INF/MANIFEST\&.MF\fR¥Õ¥¡¥¤¥ë¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆZIP¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ëºÝ¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Î\fIjarsigner\fR¥³¥Þ¥ó¥É¤ÎÆ°ºî¤Ç¤Ï¡¢JAR¤Þ¤¿¤ÏZIP¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£\fI\-verify\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤·¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Î\fBjarsigner\fR¥³¥Þ¥ó¥É¤ÎÆ°ºî¤Ç¤Ï¡¢JAR¤Þ¤¿¤ÏZIP¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£\fB\-verify\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤·¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢½ð̾¤Þ¤¿¤Ï¸¡¾Ú¤Î¸å¤Ë½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤Î¸¡¾Ú¤â»î¹Ô¤·¤Þ¤¹¡£¸¡¾Ú¥¨¥é¡¼¤Þ¤¿¤Ï¤½¤Î¾¤ÎÌäÂ꤬ȯÀ¸¤¹¤ë¤È¡¢¥³¥Þ¥ó¥É¤Ë¤è¤ê·Ù¹ð¥á¥Ã¥»¡¼¥¸¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¥¨¥é¡¼¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£¥¨¥é¡¼¤È·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢½ð̾¤Þ¤¿¤Ï¸¡¾Ú¤Î¸å¤Ë½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤Î¸¡¾Ú¤â»î¹Ô¤·¤Þ¤¹¡£¸¡¾Ú¥¨¥é¡¼¤Þ¤¿¤Ï¤½¤Î¾¤ÎÌäÂ꤬ȯÀ¸¤¹¤ë¤È¡¢¥³¥Þ¥ó¥É¤Ë¤è¤ê·Ù¹ð¥á¥Ã¥»¡¼¥¸¤¬À¸À®¤µ¤ì¤Þ¤¹¡£\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ë¤è¤ê½ÅÂç¤Ê·Ù¹ð¤¬¥¨¥é¡¼¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£¥¨¥é¡¼¤È·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾" + .PP + ¥­¡¼¥¹¥È¥¢¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢°ì°Õ¤ÎÊÌ̾¤ò»ÈÍѤ·¤Æ¥¢¥¯¥»¥¹¤µ¤ì¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¤È¤­¤Ï¡¢½ð̾¤ÎÀ¸À®¤ËɬÍפÊÈëÌ©¸°¤ò´Þ¤à¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÊÌ̾¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIworking\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fImystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤Ë´Þ¤Þ¤ì¤ëÊÌ̾\fIduke\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤ò»ÈÍѤ·¤Æ¡¢\fIMyJARFile\&.jar\fR¤È¤¤¤¦Ì¾Á°¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ï»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢\fIMyJARFile\&.jar\fR¤Ï½ð̾ÉÕ¤­¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤Æ¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¤È¤­¤Ï¡¢½ð̾¤ÎÀ¸À®¤ËɬÍפÊÈëÌ©¸°¤ò´Þ¤à¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÊÌ̾¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBworking\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fBmystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤Ë´Þ¤Þ¤ì¤ëÊÌ̾\fBduke\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤ò»ÈÍѤ·¤Æ¡¢\fBMyJARFile\&.jar\fR¤È¤¤¤¦Ì¾Á°¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ï»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢\fBMyJARFile\&.jar\fR¤Ï½ð̾ÉÕ¤­¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤è¤Ã¤Æ¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore /working/mystore \-storepass <keystore password> +- \-keypass <private key password> MyJARFile\&.jar duke ++\fBjarsigner \-keystore /working/mystore \-storepass <keystore password>\fR ++\fB \-keypass <private key password> MyJARFile\&.jar duke\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥­¡¼¥¹¥È¥¢¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤¤¤È¡¢ÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£Æ±Íͤˡ¢ÈëÌ©¸°¤â¥­¡¼¥¹¥È¥¢Æâ¤Ç¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Æ¤¤¤ë¤¿¤á¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¤Þ¤¿¤Ï»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥È¤¬Êݸ¤µ¤ì¤Æ¤¤¤ë¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤¤¤È¡¢ÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£Æ±Íͤˡ¢ÈëÌ©¸°¤â¥­¡¼¥¹¥È¥¢Æâ¤Ç¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Æ¤¤¤ë¤¿¤á¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¤Þ¤¿¤Ï»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥È¤¬Êݸ¤µ¤ì¤Æ¤¤¤ë¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .SS "¥­¡¼¥¹¥È¥¢¤Î¾ì½ê" + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢»ÈÍѤ¹¤ë¥­¡¼¥¹¥È¥¢¤ÎURL¤ò»ØÄꤹ¤ë\fI\-keystore\fR¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¡¢\fIuser\&.home\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç·è¤Þ¤ë¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î\fI\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ëÆâ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢»ÈÍѤ¹¤ë¥­¡¼¥¹¥È¥¢¤ÎURL¤ò»ØÄꤹ¤ë\fB\-keystore\fR¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¡¢\fBuser\&.home\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç·è¤Þ¤ë¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î\fB\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ëÆâ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .PP +-Oracle Solaris¥·¥¹¥Æ¥à¤Î¾ì¹ç¡¢\fIuser\&.home\fR¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ ++Oracle Solaris¥·¥¹¥Æ¥à¤Î¾ì¹ç¡¢\fBuser\&.home\fR¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ + .PP +-\fI\-keystore\fR¥ª¥×¥·¥ç¥ó¤«¤é¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¡¢\fIKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£URL¤È¤·¤Æ\fINONE\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢null¤Î¥¹¥È¥ê¡¼¥à¤¬\fIKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£\fINONE\fR¤Ï¡¢\fIKeyStore\fR¥¯¥é¥¹¤¬¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¡¦¥Ç¥Ð¥¤¥¹¤ËÃÖ¤«¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fB\-keystore\fR¥ª¥×¥·¥ç¥ó¤«¤é¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¡¢\fBKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£URL¤È¤·¤Æ\fBNONE\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢null¤Î¥¹¥È¥ê¡¼¥à¤¬\fBKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£\fBNONE\fR¤Ï¡¢\fBKeyStore\fR¥¯¥é¥¹¤¬¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¡¦¥Ç¥Ð¥¤¥¹¤ËÃÖ¤«¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë»ØÄꤷ¤Þ¤¹¡£ + .SS "¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ" + .PP +-\fIjava\&.security package\fR¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë\fIKeyStore\fR¥¯¥é¥¹¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¾ðÊó¤Ø¤Î¥¢¥¯¥»¥¹¤ª¤è¤Ó¾ðÊó¤ÎÊѹ¹¤ò¹Ô¤¦¤¿¤á¤Î¡¢ÌÀ³Î¤ËÄêµÁ¤µ¤ì¤¿Â¿¤¯¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£Ê£¿ô¤Î°Û¤Ê¤ë¸ÇÄê¼ÂÁõ¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¡¢³Æ¼ÂÁõ¤ÏÆÃÄê¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤òÂоݤȤ·¤Þ¤¹¡£ ++\fBjava\&.security package\fR¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë\fBKeyStore\fR¥¯¥é¥¹¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¾ðÊó¤Ø¤Î¥¢¥¯¥»¥¹¤ª¤è¤Ó¾ðÊó¤ÎÊѹ¹¤ò¹Ô¤¦¤¿¤á¤Î¡¢ÌÀ³Î¤ËÄêµÁ¤µ¤ì¤¿Â¿¤¯¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£Ê£¿ô¤Î°Û¤Ê¤ë¸ÇÄê¼ÂÁõ¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¡¢³Æ¼ÂÁõ¤ÏÆÃÄê¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤òÂоݤȤ·¤Þ¤¹¡£ + .PP +-¸½ºß¡¢¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë2¤Ä¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ä¡¼¥ë(\fIkeytool\fR¤È\fIjarsigner\fR)¡¢¤ª¤è¤Ó¥Ý¥ê¥·¡¼¡¦¥Ä¡¼¥ë¤È¤¤¤¦Ì¾Á°¤Î1¤Ä¤ÎGUI¥Ù¡¼¥¹¤Î¥Ä¡¼¥ë¤¬¤¢¤ê¤Þ¤¹¡£\fIKeyStore\fR¥¯¥é¥¹¤Ï¸ø³«¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢JDK¥æ¡¼¥¶¡¼¤Ï¡¢¤½¤ì¤ò»ÈÍѤ¹¤ë¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò½ñ¤­¹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¸½ºß¡¢¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë2¤Ä¤Î¥³¥Þ¥ó¥É¹Ô¥Ä¡¼¥ë(\fBkeytool\fR¤È\fBjarsigner\fR)¡¢¤ª¤è¤Ó¥Ý¥ê¥·¡¼¡¦¥Ä¡¼¥ë¤È¤¤¤¦Ì¾Á°¤Î1¤Ä¤ÎGUI¥Ù¡¼¥¹¤Î¥Ä¡¼¥ë¤¬¤¢¤ê¤Þ¤¹¡£\fBKeyStore\fR¥¯¥é¥¹¤Ï¸ø³«¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢JDK¥æ¡¼¥¶¡¼¤Ï¡¢¤½¤ì¤ò»ÈÍѤ¹¤ë¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò½ñ¤­¹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .PP + Oracle¤¬Ä󶡤¹¤ëÁȹþ¤ß¤Î¥Ç¥Õ¥©¥ë¥È¤Î¼ÂÁõ¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢JKS¤È¤¤¤¦Ì¾Á°¤ÎÆȼ«¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×(·Á¼°)¤ò»ÈÍѤ¹¤ë¤â¤Î¤Ç¡¢¥­¡¼¥¹¥È¥¢¤ò¥Õ¥¡¥¤¥ë¤È¤·¤Æ¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£Áȹþ¤ß¤Î¼ÂÁõ¤Ç¤Ï¡¢³ÆÈëÌ©¸°¤Ï¸ÄÊ̤Υѥ¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¡¢¥­¡¼¥¹¥È¥¢Á´ÂΤÎÀ°¹çÀ­¤Ï(ÈëÌ©¸°¤È¤ÏÊ̤Î)¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£ + .PP +-¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ï¥×¥í¥Ð¥¤¥À¥Ù¡¼¥¹¤Ç¡¢¤Ä¤Þ¤ê¡¢\fIKeyStore\fR¥¯¥é¥¹¤Ë¤è¤êÄ󶡤µ¤ì¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹(SPI)¤Ë´Ø¤·¤Æ¼ÂÁõ¤µ¤ì¤Þ¤¹¡£Âбþ¤¹¤ë\fIKeystoreSpi\fRÃê¾Ý¥¯¥é¥¹¤¬¤¢¤ê¡¢¤³¤ì¤â\fIjava\&.security package\fR¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¤¬¡¢¥×¥í¥Ð¥¤¥À¤¬¼ÂÁõ¤¹¤ëɬÍפΤ¢¤ë¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢¥×¥í¥Ð¥¤¥À¤È¤Ï¡¢Java Security API¤Ë¤è¤Ã¤Æ¥¢¥¯¥»¥¹²Äǽ¤Ê¥µ¡¼¥Ó¥¹¤Î¥µ¥Ö¥»¥Ã¥È¤ËÂФ·¡¢¤½¤Î¸ÇÄê¼ÂÁõ¤òÄ󶡤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î½¸¹ç¤Î¤³¤È¤Ç¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¤Ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider\&.html¤Ë¤¢¤ë +-Java°Å¹æ²½¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥×¥í¥Ð¥¤¥À¤Î¼ÂÁõÊýË¡¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¥×¥í¥Ð¥¤¥À¤ò¼ÂÁõ¤·¡¢\fIKeystoreSpi\fR¥µ¥Ö¥¯¥é¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ï¥×¥í¥Ð¥¤¥À¥Ù¡¼¥¹¤Ç¡¢¤Ä¤Þ¤ê¡¢\fBKeyStore\fR¥¯¥é¥¹¤Ë¤è¤êÄ󶡤µ¤ì¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹(SPI)¤Ë´Ø¤·¤Æ¼ÂÁõ¤µ¤ì¤Þ¤¹¡£Âбþ¤¹¤ë\fBKeystoreSpi\fRÃê¾Ý¥¯¥é¥¹¤¬¤¢¤ê¡¢¤³¤ì¤â\fBjava\&.security package\fR¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¤¬¡¢¥×¥í¥Ð¥¤¥À¤¬¼ÂÁõ¤¹¤ëɬÍפΤ¢¤ë¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢¥×¥í¥Ð¥¤¥À¤È¤Ï¡¢Java Security API¤Ë¤è¤Ã¤Æ¥¢¥¯¥»¥¹²Äǽ¤Ê¥µ¡¼¥Ó¥¹¤Î¥µ¥Ö¥»¥Ã¥È¤ËÂФ·¡¢¤½¤Î¸ÇÄê¼ÂÁõ¤òÄ󶡤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î½¸¹ç¤Î¤³¤È¤Ç¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¤Ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider\&.html¤Ë¤¢¤ë ++Java°Å¹æ²½¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥×¥í¥Ð¥¤¥À¤Î¼ÂÁõÊýË¡¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¥×¥í¥Ð¥¤¥À¤ò¼ÂÁõ¤·¡¢\fBKeystoreSpi\fR¥µ¥Ö¥¯¥é¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢\fIKeyStore\fR¥¯¥é¥¹¤Î\fIgetInstance\fR¥Õ¥¡¥¯¥È¥ê¡¦¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ¡¢ÍÍ¡¹¤Ê¥×¥í¥Ð¥¤¥À¤«¤é°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÁªÂò¤Ç¤­¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Ï¡¢¥­¡¼¥¹¥È¥¢¾ðÊó¤Î³ÊǼ·Á¼°¤È¥Ç¡¼¥¿·Á¼°¤òÄêµÁ¤¹¤ë¤È¤È¤â¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÈëÌ©¸°¤È¥­¡¼¥¹¥È¥¢¼«ÂΤÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à¤òÄêµÁ¤·¤Þ¤¹¡£°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ë¤Ï¡¢¸ß´¹À­¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢\fBKeyStore\fR¥¯¥é¥¹¤Î\fBgetInstance\fR¥Õ¥¡¥¯¥È¥ê¡¦¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ¡¢ÍÍ¡¹¤Ê¥×¥í¥Ð¥¤¥À¤«¤é°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÁªÂò¤Ç¤­¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Ï¡¢¥­¡¼¥¹¥È¥¢¾ðÊó¤Î³ÊǼ·Á¼°¤È¥Ç¡¼¥¿·Á¼°¤òÄêµÁ¤¹¤ë¤È¤È¤â¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÈëÌ©¸°¤È¥­¡¼¥¹¥È¥¢¼«ÂΤÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à¤òÄêµÁ¤·¤Þ¤¹¡£°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ë¤Ï¡¢¸ß´¹À­¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .PP +-\fIjarsigner\fR¤ª¤è¤Ó\fIpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢URL¤ò»ÈÍѤ·¤Æ»ØÄê¤Ç¤­¤ëǤ°Õ¤Î¾ì½ê¤«¤é¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¤³¤ì¤é¤Î¥³¥Þ¥ó¥É¤Ï¡¢Windows¾å¤ÎMSCAPI¤ª¤è¤Ó¤¹¤Ù¤Æ¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤ÎPKCS11¤ÇÄ󶡤µ¤ì¤ë¤è¤¦¤ÊÈó¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBjarsigner\fR¤ª¤è¤Ó\fBpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢URL¤ò»ÈÍѤ·¤Æ»ØÄê¤Ç¤­¤ëǤ°Õ¤Î¾ì½ê¤«¤é¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¤³¤ì¤é¤Î¥³¥Þ¥ó¥É¤Ï¡¢Windows¾å¤ÎMSCAPI¤ª¤è¤Ó¤¹¤Ù¤Æ¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤ÎPKCS11¤ÇÄ󶡤µ¤ì¤ë¤è¤¦¤ÊÈó¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤ª¤è¤Ó\fIkeytool\fR¥³¥Þ¥ó¥É¤Î¾ì¹ç¡¢\fI\-storetype\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Ä¡¼¥ë¤Î¾ì¹ç¡¢\fB¡Ö¥­¡¼¥¹¥È¥¢¡×\fR¥á¥Ë¥å¡¼¤Î\fB¡ÖÊÔ½¸¡×\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤ª¤è¤Ó\fBkeytool\fR¥³¥Þ¥ó¥É¤Î¾ì¹ç¡¢\fB\-storetype\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥Þ¥ó¥É¹Ô¤Ç¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Ä¡¼¥ë¤Î¾ì¹ç¡¢\fB¡Ö¥­¡¼¥¹¥È¥¢¡×\fR¥á¥Ë¥å¡¼¤Î\fB¡ÖÊÔ½¸¡×\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .PP +-¥æ¡¼¥¶¡¼¤¬¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤵ¤ì¤¿\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ˴ð¤Å¤¤¤Æ¡¢¥Ä¡¼¥ë¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤¬ÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ï\fIjava\&.security\fR¤È¸Æ¤Ð¤ì¡¢JDK¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fIjava\&.home/lib/security\fRÆâ¤Ë¸ºß¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢\fIjava\&.home\fR¤Ï¼Â¹Ô»þ´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£\fIjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢JDK¤Þ¤¿¤ÏJava Runtime Environment (JRE)¤ÎºÇ¾å°Ì¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£ ++¥æ¡¼¥¶¡¼¤¬¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤵ¤ì¤¿\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ˴ð¤Å¤¤¤Æ¡¢¥Ä¡¼¥ë¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤¬ÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ï\fBjava\&.security\fR¤È¸Æ¤Ð¤ì¡¢JDK¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fBjava\&.home/lib/security\fRÆâ¤Ë¸ºß¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢\fBjava\&.home\fR¤Ï¼Â¹Ô»þ´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£\fBjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢JDK¤Þ¤¿¤ÏJava Runtime Environment (JRE)¤ÎºÇ¾å°Ì¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£ + .PP +-³Æ¥Ä¡¼¥ë¤Ï¡¢\fIkeystore\&.type\fR¤ÎÃͤò¼èÆÀ¤·¡¢¤½¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¡¢¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥Ð¥¤¥À¤òÄ´¤Ù¤Þ¤¹¡£ÌÜŪ¤Î¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤È¡¢¤½¤Î¥×¥í¥Ð¥¤¥À¤«¤é¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Þ¤¹¡£ ++³Æ¥Ä¡¼¥ë¤Ï¡¢\fBkeystore\&.type\fR¤ÎÃͤò¼èÆÀ¤·¡¢¤½¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¡¢¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥Ð¥¤¥À¤òÄ´¤Ù¤Þ¤¹¡£ÌÜŪ¤Î¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤È¡¢¤½¤Î¥×¥í¥Ð¥¤¥À¤«¤é¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Þ¤¹¡£ + .PP +-\fIKeyStore\fR¥¯¥é¥¹¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëstatic¥á¥½¥Ã¥É\fIgetDefaultType\fR¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¥¢¥×¥ì¥Ã¥È¤«¤é\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤Î¹Ô¤Ç¤Ï¡¢\fIkeystore\&.type property\fR¤Ç»ØÄꤵ¤ì¤¿¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ®¤·¤Þ¤¹¡£ ++\fBKeyStore\fR¥¯¥é¥¹¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëstatic¥á¥½¥Ã¥É\fBgetDefaultType\fR¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¥¢¥×¥ì¥Ã¥È¤«¤é\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤Î¹Ô¤Ç¤Ï¡¢\fBkeystore\&.type property\fR¤Ç»ØÄꤵ¤ì¤¿¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òºîÀ®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-KeyStore keyStore = KeyStore\&.getInstance(KeyStore\&.getDefaultType()); ++\fBKeyStore keyStore = KeyStore\&.getInstance(KeyStore\&.getDefaultType());\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï¡¢\fIjks\fR ++¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï¡¢\fBjks\fR + (Oracle¤¬Ä󶡤¹¤ëÆȼ«¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ)¤Ç¤¹¡£¤³¤ì¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¼¡¤Î¹Ô¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keystore\&.type=jks ++\fBkeystore\&.type=jks\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î»ØÄê¤Ç¤Ï¡¢Âçʸ»ú¤È¾®Ê¸»ú¤Ï¶èÊ̤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fIJKS\fR¤Ï\fIjks\fR¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î»ØÄê¤Ç¤Ï¡¢Âçʸ»ú¤È¾®Ê¸»ú¤Ï¶èÊ̤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fBJKS\fR¤Ï\fBjks\fR¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥Ä¡¼¥ë¤Ç¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤½¤Î¹Ô¤òÊѹ¹¤·¤ÆÊ̤Υ­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIpkcs12\fR¤È¸Æ¤Ð¤ì¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¡¦¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ë¾ì¹ç¡¢¹Ô¤ò¼¡¤Î¤è¤¦¤ËÊѹ¹¤·¤Þ¤¹¡£ ++¥Ä¡¼¥ë¤Ç¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤½¤Î¹Ô¤òÊѹ¹¤·¤ÆÊ̤Υ­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBpkcs12\fR¤È¸Æ¤Ð¤ì¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¡¦¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ë¾ì¹ç¡¢¹Ô¤ò¼¡¤Î¤è¤¦¤ËÊѹ¹¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keystore\&.type=pkcs12 ++\fBkeystore\&.type=pkcs12\fR ++ + .fi + .if n \{\ + .RE +@@ -272,7 +278,7 @@ + Java PKCS #11¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥¬¥¤¥É¤Î¡ÖKeyTool¡×¤ª¤è¤Ó¡ÖJarSigner¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "¥µ¥Ý¡¼¥È¤µ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à" + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¼¡¤Î¤¤¤º¤ì¤«¤Î¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¼¡¤Î¤¤¤º¤ì¤«¤Î¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -307,12 +313,12 @@ + SHA256¤ÈÂʱ߶ÊÀþ¥Ç¥¸¥¿¥ë½ð̾¥¢¥ë¥´¥ê¥º¥à(ECDSA)¤ò»ÈÍѤ·¤¿Âʱ߶ÊÀþ(EC)°Å¹æÊý¼°¥¢¥ë¥´¥ê¥º¥à + .RE + .PP +-½ð̾¼Ô¤Î¸ø³«¸°¤ÈÈëÌ©¸°¤¬DSA¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fIjarsigner\fR¤Ï\fISHA1withDSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£½ð̾¼Ô¤Î¸°¤¬RSA¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fIjarsigner\fR¤Ï\fISHA256withRSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤è¤¦¤È¤·¤Þ¤¹¡£½ð̾¼Ô¤Î¸°¤¬EC¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fIjarsigner\fR¤Ï\fISHA256withECDSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£ ++½ð̾¼Ô¤Î¸ø³«¸°¤ÈÈëÌ©¸°¤¬DSA¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fBjarsigner\fR¤Ï\fBSHA1withDSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£½ð̾¼Ô¤Î¸°¤¬RSA¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fBjarsigner\fR¤Ï\fBSHA256withRSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤è¤¦¤È¤·¤Þ¤¹¡£½ð̾¼Ô¤Î¸°¤¬EC¸°¤Ç¤¢¤ë¾ì¹ç¡¢\fBjarsigner\fR¤Ï\fBSHA256withECDSA\fR¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤·¤Þ¤¹¡£ + .PP +-¤³¤ì¤é¤Î¥Ç¥Õ¥©¥ë¥È¤Î½ð̾¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£ ++¤³¤ì¤é¤Î¥Ç¥Õ¥©¥ë¥È¤Î½ð̾¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£ + .SS "½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë" + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¡¢½ÐÎϤµ¤ì¤ë½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ÏÆþÎÏJAR¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤Ç¤¹¤¬¡¢¼¡¤Î2¤Ä¤ÎÄɲåե¡¥¤¥ë¤¬META\-INF¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤«¤ì¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¡¢½ÐÎϤµ¤ì¤ë½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ÏÆþÎÏJAR¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤Ç¤¹¤¬¡¢¼¡¤Î2¤Ä¤ÎÄɲåե¡¥¤¥ë¤¬META\-INF¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤«¤ì¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -322,7 +328,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\&.SF\fR³ÈÄ¥»Ò¤ÎÉÕ¤¤¤¿½ð̾¥Õ¥¡¥¤¥ë ++\fB\&.SF\fR³ÈÄ¥»Ò¤ÎÉÕ¤¤¤¿½ð̾¥Õ¥¡¥¤¥ë + .RE + .sp + .RS 4 +@@ -333,14 +339,16 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\&.DSA\fR¡¢\fI\&.RSA\fR¤Þ¤¿¤Ï\fI\&.EC\fR³ÈÄ¥»Ò¤ÎÉÕ¤¤¤¿½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë ++\fB\&.DSA\fR¡¢\fB\&.RSA\fR¤Þ¤¿¤Ï\fB\&.EC\fR³ÈÄ¥»Ò¤ÎÉÕ¤¤¤¿½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë + .RE + .PP +-¤³¤ì¤é2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢\fI\-sigFile\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤ«¤éºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥ª¥×¥·¥ç¥ó¤¬\fI\-sigFile MKSIGN\fR¤Î¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ï\fIMKSIGN\&.SF\fR¤ª¤è¤Ó\fIMKSIGN\&.DSA\fR¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¤³¤ì¤é2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢\fB\-sigFile\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤ«¤éºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥ª¥×¥·¥ç¥ó¤¬\fB\-sigFile MKSIGN\fR¤Î¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ï\fBMKSIGN\&.SF\fR¤ª¤è¤Ó\fBMKSIGN\&.DSA\fR¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-sigfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ÎÀèƬ¤Î8ʸ»ú¤ò¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ÊÌ̾¤¬8ʸ»ṳ́Ëþ¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤¬¤½¤Î¤Þ¤Þ»ÈÍѤµ¤ì¤Þ¤¹¡£ÊÌ̾¤Ë¡¢½ð̾¥Õ¥¡¥¤¥ë̾¤Ç»ÈÍѤǤ­¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾¤ÎºîÀ®»þ¤Ë¡¢³ºÅö¤¹¤ëʸ»ú¤¬²¼Àþ(_)ʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£Í­¸ú¤Êʸ»ú¤Ï¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¡¢¿ô»ú¡¢²¼Àþ¤ª¤è¤Ó¥Ï¥¤¥Õ¥ó¤Ç¤¹¡£ +-½ð̾¥Õ¥¡¥¤¥ë.PP +-½ð̾¥Õ¥¡¥¤¥ë(\fI\&.SF\fR¥Õ¥¡¥¤¥ë)¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ëºÝ¤ËJAR¥Õ¥¡¥¤¥ë¤Ë¾ï¤Ë´Þ¤Þ¤ì¤ë¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤È»÷¤Æ¤¤¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¤è¤¦¤Ê¡¢¼¡¤Ë¼¨¤¹3¤Ä¤Î¹Ô¤¬¤¢¤ê¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-sigfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ÎÀèƬ¤Î8ʸ»ú¤ò¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ÊÌ̾¤¬8ʸ»ṳ́Ëþ¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤¬¤½¤Î¤Þ¤Þ»ÈÍѤµ¤ì¤Þ¤¹¡£ÊÌ̾¤Ë¡¢½ð̾¥Õ¥¡¥¤¥ë̾¤Ç»ÈÍѤǤ­¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾¤ÎºîÀ®»þ¤Ë¡¢³ºÅö¤¹¤ëʸ»ú¤¬²¼Àþ(_)ʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£Í­¸ú¤Êʸ»ú¤Ï¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¡¢¿ô»ú¡¢²¼Àþ¤ª¤è¤Ó¥Ï¥¤¥Õ¥ó¤Ç¤¹¡£ ++.PP ++½ð̾¥Õ¥¡¥¤¥ë ++.PP ++½ð̾¥Õ¥¡¥¤¥ë(\fB\&.SF\fR¥Õ¥¡¥¤¥ë)¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ëºÝ¤ËJAR¥Õ¥¡¥¤¥ë¤Ë¾ï¤Ë´Þ¤Þ¤ì¤ë¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤È»÷¤Æ¤¤¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¤è¤¦¤Ê¡¢¼¡¤Ë¼¨¤¹3¤Ä¤Î¹Ô¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -375,24 +383,27 @@ + SHA¥À¥¤¥¸¥§¥¹¥È¤ÎÃÍ + .RE + .PP +-¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎSHA¥À¥¤¥¸¥§¥¹¥È¤ÎÃͤϡ¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Ð¥¤¥Ê¥ê¡¦¥Ç¡¼¥¿¤Î¥À¥¤¥¸¥§¥¹¥È(¥Ï¥Ã¥·¥å)¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢»ØÄꤵ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ÎÃͤϡ¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¤½¤Î3¹Ô¤Î¥Ï¥Ã¥·¥å¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎSHA¥À¥¤¥¸¥§¥¹¥È¤ÎÃͤϡ¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Ð¥¤¥Ê¥ê¡¦¥Ç¡¼¥¿¤Î¥À¥¤¥¸¥§¥¹¥È(¥Ï¥Ã¥·¥å)¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢»ØÄꤵ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ÎÃͤϡ¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¤½¤Î3¹Ô¤Î¥Ï¥Ã¥·¥å¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP + ½ð̾¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥ工夬³ÊǼ¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Ë¤Ï¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Ø¥Ã¥À¡¼¤Î¥Ï¥Ã¥·¥å¤â´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¤È¡¢¸¡¾Ú¤ÎºÇŬ²½¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë.PP +-\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï½ð̾¤¬ÉÕ¤±¤é¤ì¡¢½ð̾¤Ï½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ËÃÖ¤«¤ì¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢½ð̾¤Ë»ÈÍѤµ¤ì¤¿ÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤òǧ¾Ú¤¹¤ë¥­¡¼¥¹¥È¥¢¤«¤é¤Î¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤â¡¢ÆâÉô¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤Î³ÈÄ¥»Ò¤Ï¡¢»ÈÍѤµ¤ì¤ë¥À¥¤¥¸¥§¥¹¥È¡¦¥¢¥ë¥´¥ê¥º¥à¤Ë±þ¤¸¤Æ¡¢\fI\&.DSA\fR¡¢\fI\&.RSA\fR¤Þ¤¿¤Ï\fI\&.EC\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.PP ++½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë ++.PP ++\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï½ð̾¤¬ÉÕ¤±¤é¤ì¡¢½ð̾¤Ï½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ËÃÖ¤«¤ì¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢½ð̾¤Ë»ÈÍѤµ¤ì¤¿ÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤òǧ¾Ú¤¹¤ë¥­¡¼¥¹¥È¥¢¤«¤é¤Î¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤â¡¢ÆâÉô¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤Î³ÈÄ¥»Ò¤Ï¡¢»ÈÍѤµ¤ì¤ë¥À¥¤¥¸¥§¥¹¥È¡¦¥¢¥ë¥´¥ê¥º¥à¤Ë±þ¤¸¤Æ¡¢\fB\&.DSA\fR¡¢\fB\&.RSA\fR¤Þ¤¿¤Ï\fB\&.EC\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .SS "½ð̾¥¿¥¤¥à¥¹¥¿¥ó¥×" + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë½ð̾¥¿¥¤¥à¥¹¥¿¥ó¥×¤òÀ¸À®¤ª¤è¤ÓÊݸ¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fIjarsigner\fR¤ÏÂåÂؽð̾µ¡¹½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¤³¤ÎÆ°ºî¤Ï¾Êά²Äǽ¤Ç¡¢½ð̾»þ¤Ë¼¡¤Î³Æ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ©¸æ¤µ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë½ð̾¥¿¥¤¥à¥¹¥¿¥ó¥×¤òÀ¸À®¤ª¤è¤ÓÊݸ¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fBjarsigner\fR¤ÏÂåÂؽð̾µ¡¹½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¤³¤ÎÆ°ºî¤Ï¾Êά²Äǽ¤Ç¡¢½ð̾»þ¤Ë¼¡¤Î³Æ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ©¸æ¤µ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-tsa \fIurl\fR +-\-tsacert \fIalias\fR +-\-altsigner \fIclass\fR +-\-altsignerpath \fIclasspathlist\fR +-\-tsapolicyid \fIpolicyid\fR ++\fB\-tsa \fR\fB\fIurl\fR\fR ++\fB\-tsacert \fR\fB\fIalias\fR\fR ++\fB\-altsigner \fR\fB\fIclass\fR\fR ++\fB\-altsignerpath \fR\fB\fIclasspathlist\fR\fR ++\fB\-tsapolicyid \fR\fB\fIpolicyid\fR\fR ++ + .fi + .if n \{\ + .RE +@@ -409,9 +420,9 @@ + .sp -1 + .IP " 1." 4.2 + .\} +-\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ò¸¡¾Ú¤·¤Þ¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ò¸¡¾Ú¤·¤Þ¤¹¡£ + .sp +-¸¡¾Ú¤Ç¤Ï¡¢³Æ½ð̾¥Ö¥í¥Ã¥¯(\fI\&.DSA\fR)¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤¿½ð̾¤¬¡¢¾ÚÌÀ½ñ(¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó)¤â\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë¼¨¤µ¤ì¤ë¸ø³«¸°¤ËÂбþ¤¹¤ëÈëÌ©¸°¤ò»ÈÍѤ·¤ÆÀ¸À®¤µ¤ì¤¿¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤Þ¤¿¡¢½ð̾¤¬Âбþ¤¹¤ë½ð̾(\fI\&.SF\fR)¥Õ¥¡¥¤¥ë¤ÎÍ­¸ú¤Ê½ð̾¤Ç¤¢¤ë¤³¤È¤¬³Îǧ¤µ¤ì¡¢¤½¤ì¤Ë¤è¤ê¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤¬²þ¤¶¤ó¤µ¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤â³Îǧ¤µ¤ì¤Þ¤¹¡£ ++¸¡¾Ú¤Ç¤Ï¡¢³Æ½ð̾¥Ö¥í¥Ã¥¯(\fB\&.DSA\fR)¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤¿½ð̾¤¬¡¢¾ÚÌÀ½ñ(¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó)¤â\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë¼¨¤µ¤ì¤ë¸ø³«¸°¤ËÂбþ¤¹¤ëÈëÌ©¸°¤ò»ÈÍѤ·¤ÆÀ¸À®¤µ¤ì¤¿¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤Þ¤¿¡¢½ð̾¤¬Âбþ¤¹¤ë½ð̾(\fB\&.SF\fR)¥Õ¥¡¥¤¥ë¤ÎÍ­¸ú¤Ê½ð̾¤Ç¤¢¤ë¤³¤È¤¬³Îǧ¤µ¤ì¡¢¤½¤ì¤Ë¤è¤ê¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤¬²þ¤¶¤ó¤µ¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤â³Îǧ¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -422,13 +433,13 @@ + .sp -1 + .IP " 2." 4.2 + .\} +-\fI\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥¨¥ó¥È¥ê¤Ë¼¨¤µ¤ì¤ë¥À¥¤¥¸¥§¥¹¥È¤ò¡¢¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤ÎÂбþ¤¹¤ë³Æ¥»¥¯¥·¥ç¥ó¤ÈÆͤ­¤¢¤ï¤»¤Æ¸¡¾Ú¤·¤Þ¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥¨¥ó¥È¥ê¤Ë¼¨¤µ¤ì¤ë¥À¥¤¥¸¥§¥¹¥È¤ò¡¢¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤ÎÂбþ¤¹¤ë³Æ¥»¥¯¥·¥ç¥ó¤ÈÆͤ­¤¢¤ï¤»¤Æ¸¡¾Ú¤·¤Þ¤¹¡£ + .sp +-\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥ工夬³ÊǼ¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤¬¥Ç¥Õ¥©¥ë¥È¤Ç´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ç¤Ï¡¢¥Ø¥Ã¥À¡¼Æâ¤Î¥Ï¥Ã¥·¥å¤¬¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£°ìÃפ¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ï¼¡¤Î¼ê½ç¤Ë¿Ê¤ß¤Þ¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥ工夬³ÊǼ¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤¬¥Ç¥Õ¥©¥ë¥È¤Ç´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ç¤Ï¡¢¥Ø¥Ã¥À¡¼Æâ¤Î¥Ï¥Ã¥·¥å¤¬¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£°ìÃפ¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ï¼¡¤Î¼ê½ç¤Ë¿Ê¤ß¤Þ¤¹¡£ + .sp +-°ìÃפ·¤Ê¤¤¾ì¹ç¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¾ðÊ󥻥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¡¢¤¢¤Þ¤êºÇŬ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¸¡¾Ú¤¬É¬Íפˤʤê¤Þ¤¹¡£½ð̾¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++°ìÃפ·¤Ê¤¤¾ì¹ç¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¾ðÊ󥻥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¡¢¤¢¤Þ¤êºÇŬ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¸¡¾Ú¤¬É¬Íפˤʤê¤Þ¤¹¡£½ð̾¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥Ø¥Ã¥À¡¼¤Ë³ÊǼ¤µ¤ì¤¿¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤¬¡¢¸½ºß¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤Ë°ìÃפ·¤Ê¤¤Íýͳ¤Î1¤Ä¤Ï¡¢½ð̾¤ª¤è¤Ó\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¸å¤Ë¡¢(\fIjar\fR¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ)1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ë¤ËÄɲ䵤줿¤³¤È¤Ç¤¹¡£\fIjar\fR¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¥Õ¥¡¥¤¥ë¤òÄɲä·¤¿¾ì¹ç¡¢¿·¤·¤¤¥Õ¥¡¥¤¥ëÍѤΥ»¥¯¥·¥ç¥ó¤¬Äɲ䵤ì¤ë¤³¤È¤Ë¤è¤ê¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ÏÊѹ¹¤µ¤ì¤Þ¤¹¤¬¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤ÏÊѹ¹¤µ¤ì¤Þ¤»¤ó¡£¸¡¾Ú¤¬¤Þ¤ÀÀ®¸ù¤·¤Æ¤¤¤ë¤È¤ß¤Ê¤µ¤ì¤ë¤Î¤Ï¡¢½ð̾¤ÎÀ¸À®°Ê¹ß¤ËJAR¥Õ¥¡¥¤¥ëÆâ¤Î¤É¤Î¥Õ¥¡¥¤¥ë¤âÊѹ¹¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ç¤¹¡£¤³¤ì¤¬È¯À¸¤¹¤ë¤Î¤Ï¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥Ø¥Ã¥À¡¼°Ê³°¤Î¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¾ì¹ç¤Ç¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥Ø¥Ã¥À¡¼¤Ë³ÊǼ¤µ¤ì¤¿¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤¬¡¢¸½ºß¤Î¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ï¥Ã¥·¥å¤Ë°ìÃפ·¤Ê¤¤Íýͳ¤Î1¤Ä¤Ï¡¢½ð̾¤ª¤è¤Ó\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¸å¤Ë¡¢(\fBjar\fR¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ)1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ë¤ËÄɲ䵤줿¤³¤È¤Ç¤¹¡£\fBjar\fR¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¥Õ¥¡¥¤¥ë¤òÄɲä·¤¿¾ì¹ç¡¢¿·¤·¤¤¥Õ¥¡¥¤¥ëÍѤΥ»¥¯¥·¥ç¥ó¤¬Äɲ䵤ì¤ë¤³¤È¤Ë¤è¤ê¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ÏÊѹ¹¤µ¤ì¤Þ¤¹¤¬¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤ÏÊѹ¹¤µ¤ì¤Þ¤»¤ó¡£¸¡¾Ú¤¬¤Þ¤ÀÀ®¸ù¤·¤Æ¤¤¤ë¤È¤ß¤Ê¤µ¤ì¤ë¤Î¤Ï¡¢½ð̾¤ÎÀ¸À®°Ê¹ß¤ËJAR¥Õ¥¡¥¤¥ëÆâ¤Î¤É¤Î¥Õ¥¡¥¤¥ë¤âÊѹ¹¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ç¤¹¡£¤³¤ì¤¬È¯À¸¤¹¤ë¤Î¤Ï¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥Ø¥Ã¥À¡¼°Ê³°¤Î¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¾ì¹ç¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -439,45 +450,46 @@ + .sp -1 + .IP " 3." 4.2 + .\} +-\fI\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Ë¥¨¥ó¥È¥ê¤ò»ý¤ÄJAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¤Þ¤¹¡£Æɼè¤êÃæ¤Ë¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ò·×»»¤·¡¢·ë²Ì¤ò¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥»¥¯¥·¥ç¥óÆâ¤Î¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ÈÈæ³Ó¤·¤Þ¤¹¡£¥À¥¤¥¸¥§¥¹¥È¤ÏƱ¤¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¡¢¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¸¡¾Ú¤¬¼ºÇÔ¤·¤Þ¤¹¡£ ++\fB\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Ë¥¨¥ó¥È¥ê¤ò»ý¤ÄJAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¤Þ¤¹¡£Æɼè¤êÃæ¤Ë¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ò·×»»¤·¡¢·ë²Ì¤ò¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥»¥¯¥·¥ç¥óÆâ¤Î¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥À¥¤¥¸¥§¥¹¥È¤ÈÈæ³Ó¤·¤Þ¤¹¡£¥À¥¤¥¸¥§¥¹¥È¤ÏƱ¤¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¡¢¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¸¡¾Ú¤¬¼ºÇÔ¤·¤Þ¤¹¡£ + .sp +-¸¡¾Ú¥×¥í¥»¥¹Ãæ¤Ë¤Ê¤ó¤é¤«¤Î½ÅÂç¤Ê¸¡¾Ú¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¡¢¤½¤Î¥×¥í¥»¥¹¤ÏÄä»ß¤µ¤ì¡¢¥»¥­¥å¥ê¥Æ¥£Îã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Îã³°¤òÊ᪤ª¤è¤Óɽ¼¨¤·¤Þ¤¹¡£ ++¸¡¾Ú¥×¥í¥»¥¹Ãæ¤Ë¤Ê¤ó¤é¤«¤Î½ÅÂç¤Ê¸¡¾Ú¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¡¢¤½¤Î¥×¥í¥»¥¹¤ÏÄä»ß¤µ¤ì¡¢¥»¥­¥å¥ê¥Æ¥£Îã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Îã³°¤òÊ᪤ª¤è¤Óɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \fBÃí°Õ:\fR +-Äɲäηٹð(¤Þ¤¿¤Ï¡¢\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¥¨¥é¡¼)¤Ï¤¹¤Ù¤ÆÆɤàɬÍפ¬¤¢¤ê¤Þ¤¹¡£Æ±Íͤˡ¢¾ÚÌÀ¤¬¿®Íê¤Ç¤­¤ë¤«¤ò·èÄꤹ¤ë¤¿¤á¤Ë¡¢(\fI\-verbose\fR¤ª¤è¤Ó\fI\-certs\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ)¾ÚÌÀ½ñ¤ÎÆâÍƤâÆɤàɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++Äɲäηٹð(¤Þ¤¿¤Ï¡¢\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¥¨¥é¡¼)¤Ï¤¹¤Ù¤ÆÆɤàɬÍפ¬¤¢¤ê¤Þ¤¹¡£Æ±Íͤˡ¢¾ÚÌÀ¤¬¿®Íê¤Ç¤­¤ë¤«¤ò·èÄꤹ¤ë¤¿¤á¤Ë¡¢(\fB\-verbose\fR¤ª¤è¤Ó\fB\-certs\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ)¾ÚÌÀ½ñ¤ÎÆâÍƤâÆɤàɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .SS "1¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤òÂоݤȤ¹¤ëÊ£¿ô¤Î½ð̾" + .PP +-¼¡¤Î¤è¤¦¤Ë¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò¥Õ¥¡¥¤¥ë¤ÇÊ£¿ô²ó¼Â¹Ô¤·¡¢¼Â¹Ô¤Î¤¿¤Ó¤Ë°Û¤Ê¤ë¥æ¡¼¥¶¡¼¤ÎÊÌ̾¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢1¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤ËÊ£¿ô¤Î¥æ¡¼¥¶¡¼¤Î½ð̾¤òÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¼¡¤Î¤è¤¦¤Ë¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò¥Õ¥¡¥¤¥ë¤ÇÊ£¿ô²ó¼Â¹Ô¤·¡¢¼Â¹Ô¤Î¤¿¤Ó¤Ë°Û¤Ê¤ë¥æ¡¼¥¶¡¼¤ÎÊÌ̾¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢1¤Ä¤ÎJAR¥Õ¥¡¥¤¥ë¤ËÊ£¿ô¤Î¥æ¡¼¥¶¡¼¤Î½ð̾¤òÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner myBundle\&.jar susan +-jarsigner myBundle\&.jar kevin ++\fBjarsigner myBundle\&.jar susan\fR ++\fBjarsigner myBundle\&.jar kevin\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-JAR¥Õ¥¡¥¤¥ë¤¬Ê£¿ô²ó½ð̾¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Ê£¿ô¤Î\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤ª¤ê¡¢1²ó¤Î½ð̾¤ËÂФ·¤Æ1¤Ä¤Î¥Ú¥¢¤È¤Ê¤ê¤Þ¤¹¡£Á°½Ò¤ÎÎã¤Ç¤Ï¡¢½ÐÎÏJAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î̾Á°¤Î¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤¬Ê£¿ô²ó½ð̾¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Ê£¿ô¤Î\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤ª¤ê¡¢1²ó¤Î½ð̾¤ËÂФ·¤Æ1¤Ä¤Î¥Ú¥¢¤È¤Ê¤ê¤Þ¤¹¡£Á°½Ò¤ÎÎã¤Ç¤Ï¡¢½ÐÎÏJAR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î̾Á°¤Î¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-SUSAN\&.SF +-SUSAN\&.DSA +-KEVIN\&.SF +-KEVIN\&.DSA ++\fBSUSAN\&.SF\fR ++\fBSUSAN\&.DSA\fR ++\fBKEVIN\&.SF\fR ++\fBKEVIN\&.DSA\fR + .fi + .if n \{\ + .RE + .\} + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-¼¡¤Î³Æ¹à¤Ç¤Ï¡¢ÍÍ¡¹¤Ê\fIjarsigner\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£¼¡¤Îɸ½à¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¼¡¤Î³Æ¹à¤Ç¤Ï¡¢ÍÍ¡¹¤Ê\fBjarsigner\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£¼¡¤Îɸ½à¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .RS 4 + .ie n \{\ +@@ -520,38 +532,40 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-storepass\fR¡¢\fI\-keypass\fR¡¢\fI\-sigfile\fR¡¢\fI\-sigalg\fR¡¢\fI\-digestalg\fR¡¢\fI\-signedjar\fR¤ª¤è¤ÓTSA´ØÏ¢¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤¹¤ë¾ì¹ç¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fI\-keystore \fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ª¤è¤Ó¸¡¾Ú¤Ë´ØÏ¢¤·¤Þ¤¹¡£¤Þ¤¿¡¢ÊÌ̾¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ª¤è¤Ó¸¡¾Ú»þ¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fB\-storepass\fR¡¢\fB\-keypass\fR¡¢\fB\-sigfile\fR¡¢\fB\-sigalg\fR¡¢\fB\-digestalg\fR¡¢\fB\-signedjar\fR¤ª¤è¤ÓTSA´ØÏ¢¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤¹¤ë¾ì¹ç¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fB\-keystore \fR¥ª¥×¥·¥ç¥ó¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ª¤è¤Ó¸¡¾Ú¤Ë´ØÏ¢¤·¤Þ¤¹¡£¤Þ¤¿¡¢ÊÌ̾¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤ª¤è¤Ó¸¡¾Ú»þ¤Ë»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-keystore \fIurl\fR + .RS 4 +-¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò¼¨¤¹URL¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fIuser\&.home\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç·èÄꤵ¤ì¤¿¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¥Õ¥¡¥¤¥ë\fI\&.keystore\fR¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò¼¨¤¹URL¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fBuser\&.home\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç·èÄꤵ¤ì¤¿¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¥Õ¥¡¥¤¥ë\fB\&.keystore\fR¤Ë¥Ç¥Õ¥©¥ë¥ÈÀßÄꤵ¤ì¤Þ¤¹¡£ + .sp + ¥­¡¼¥¹¥È¥¢¤Ï½ð̾»þ¤Ë¤ÏɬÍפǤ¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¡¢¤Þ¤¿¤Ï¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¥­¡¼¥¹¥È¥¢¤òÌÀ¼¨Åª¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¸¡¾Ú¤¹¤ë¤È¤­¤Ï¥­¡¼¥¹¥È¥¢¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥­¡¼¥¹¥È¥¢¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¤«¡¢¤¢¤ë¤¤¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¤¬Â¸ºß¤·¤Æ¤¤¤Æ¡¢¤µ¤é¤Ë\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬¤½¤Î¥­¡¼¥¹¥È¥¢¤Ë1¤Ä¤Ç¤â´Þ¤Þ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë´Ø¤¹¤ëÄɲþðÊ󤬽ÐÎϤµ¤ì¤Þ¤¹¡£ ++¸¡¾Ú¤¹¤ë¤È¤­¤Ï¥­¡¼¥¹¥È¥¢¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥­¡¼¥¹¥È¥¢¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¤«¡¢¤¢¤ë¤¤¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¤¬Â¸ºß¤·¤Æ¤¤¤Æ¡¢¤µ¤é¤Ë\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬¤½¤Î¥­¡¼¥¹¥È¥¢¤Ë1¤Ä¤Ç¤â´Þ¤Þ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë´Ø¤¹¤ëÄɲþðÊ󤬽ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp +-\fI\-keystore\fR°ú¿ô¤Ë¤Ï¡¢URL¤Ç¤Ï¤Ê¤¯¥Õ¥¡¥¤¥ë̾¤È¥Ñ¥¹¤ò»ØÄê¤Ç¤­¡¢¤³¤Î¾ì¹ç¡¢¥Õ¥¡¥¤¥ë: URL¤ÈƱ¤¸¤è¤¦¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Ë¤è¤¦¤Ë»ØÄꤹ¤ë¤ÈƱÅù¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB\-keystore\fR°ú¿ô¤Ë¤Ï¡¢URL¤Ç¤Ï¤Ê¤¯¥Õ¥¡¥¤¥ë̾¤È¥Ñ¥¹¤ò»ØÄê¤Ç¤­¡¢¤³¤Î¾ì¹ç¡¢¥Õ¥¡¥¤¥ë: URL¤ÈƱ¤¸¤è¤¦¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Ë¤è¤¦¤Ë»ØÄꤹ¤ë¤ÈƱÅù¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-keystore \fIfilePathAndName\fR +-\-keystore file:\fIfilePathAndName\fR ++\fB\-keystore \fR\fB\fIfilePathAndName\fR\fR ++\fB\-keystore file:\fR\fB\fIfilePathAndName\fR\fR ++ + .fi + .if n \{\ + .RE + .\} +-(JRE¤Î\fI$JAVA_HOME/lib/security directory\fR¤Ë¤¢¤ë) +-\fIjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤ÇSun PKCS #11¥×¥í¥Ð¥¤¥À¤¬¹½À®¤µ¤ì¤¿¾ì¹ç¡¢\fIkeytool\fR¤ª¤è¤Ó\fIjarsigner\fR¥Ä¡¼¥ë¤ÏPKCS#11¥È¡¼¥¯¥ó¤Ë´ð¤Å¤¤¤ÆÆ°ºî¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£ ++(JRE¤Î\fB$JAVA_HOME/lib/security directory\fR¤Ë¤¢¤ë) ++\fBjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤ÇSun PKCS #11¥×¥í¥Ð¥¤¥À¤¬¹½À®¤µ¤ì¤¿¾ì¹ç¡¢\fBkeytool\fR¤ª¤è¤Ó\fBjarsigner\fR¥Ä¡¼¥ë¤ÏPKCS#11¥È¡¼¥¯¥ó¤Ë´ð¤Å¤¤¤ÆÆ°ºî¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-keystore NONE +-\-storetype PKCS11 ++\fB\-keystore NONE\fR ++\fB\-storetype PKCS11\fR ++ + .fi + .if n \{\ + .RE +@@ -562,7 +576,8 @@ + .RS 4 + .\} + .nf +-keytool \-keystore NONE \-storetype PKCS11 \-list ++\fBkeytool \-keystore NONE \-storetype PKCS11 \-list\fR ++ + .fi + .if n \{\ + .RE +@@ -571,17 +586,17 @@ + .PP + \-storetype \fIstoretype\fR + .RS 4 +-¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤¹¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤǻØÄꤵ¤ì¤¿¥¿¥¤¥×¤Ç¤¹¡£¤³¤ÎÃͤϡ¢\fIjava\&.security\&.KeyStore\fR¤Îstatic +-\fIgetDefaultType\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£ ++¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤¹¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤǻØÄꤵ¤ì¤¿¥¿¥¤¥×¤Ç¤¹¡£¤³¤ÎÃͤϡ¢\fBjava\&.security\&.KeyStore\fR¤Îstatic ++\fBgetDefaultType\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢PCKS #11¥È¡¼¥¯¥ó¤ÎPIN¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£²¿¤â»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fIkeytool\fR¤ª¤è¤Ó\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢¥È¡¼¥¯¥óPIN¤Î»ØÄê¤òµá¤á¤é¤ì¤Þ¤¹¡£¥È¡¼¥¯¥ó¤ËÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹(ÀìÍѤÎPIN¥Ñ¥Ã¥É¤äÀ¸ÂÎÆɼè¤êµ¡¤Ê¤É)¤¬¤¢¤ë¾ì¹ç¡¢\fI\-protected\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¥Ñ¥¹¥ï¡¼¥É¡¦¥ª¥×¥·¥ç¥ó¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£ ++\fB\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢PCKS #11¥È¡¼¥¯¥ó¤ÎPIN¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£²¿¤â»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fBkeytool\fR¤ª¤è¤Ó\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢¥È¡¼¥¯¥óPIN¤Î»ØÄê¤òµá¤á¤é¤ì¤Þ¤¹¡£¥È¡¼¥¯¥ó¤ËÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹(ÀìÍѤÎPIN¥Ñ¥Ã¥É¤äÀ¸ÂÎÆɼè¤êµ¡¤Ê¤É)¤¬¤¢¤ë¾ì¹ç¡¢\fB\-protected\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¥Ñ¥¹¥ï¡¼¥É¡¦¥ª¥×¥·¥ç¥ó¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP + \-storepass[:env | :file] \fIargument\fR + .RS 4 +-¥­¡¼¥¹¥È¥¢¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Î¤ËɬÍפʥѥ¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤¬É¬ÍפʤΤϡ¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Î¤ß¤Ç¤¹(¸¡¾Ú¤¹¤ë¤È¤­¤Ë¤ÏÉÔÍפǤ¹)¡£¤½¤Î¾ì¹ç¡¢\fI\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤¤¤È¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Î¤ËɬÍפʥѥ¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤¬É¬ÍפʤΤϡ¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Î¤ß¤Ç¤¹(¸¡¾Ú¤¹¤ë¤È¤­¤Ë¤ÏÉÔÍפǤ¹)¡£¤½¤Î¾ì¹ç¡¢\fB\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤¤¤È¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp +-½¤¾þ»Ò\fIenv\fR¤Þ¤¿¤Ï\fIfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fIargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ ++½¤¾þ»Ò\fBenv\fR¤Þ¤¿¤Ï\fBfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fIargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -591,8 +606,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIenv\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBenv\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -603,19 +618,19 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIfile\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBfile\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + \fBÃí°Õ:\fR +-¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¤Þ¤¿¤Ï¥»¥­¥å¥ê¥Æ¥£Êݸ¤ì¤¿¥·¥¹¥Æ¥à¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¤Þ¤¿¤Ï¥»¥­¥å¥¢¤Ê¥·¥¹¥Æ¥à¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-keypass [:env | :file] \fIargument\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ËÂбþ¤¹¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤òÊݸ¤ë¤Î¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£\fIjarsigner\fR¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Æ¤ª¤é¤º¡¢É¬Íפʥѥ¹¥ï¡¼¥É¤¬¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ËÂбþ¤¹¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤òÊݸ¤ë¤Î¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£\fBjarsigner\fR¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Æ¤ª¤é¤º¡¢É¬Íפʥѥ¹¥ï¡¼¥É¤¬¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp +-½¤¾þ»Ò\fIenv\fR¤Þ¤¿¤Ï\fIfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fIargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ ++½¤¾þ»Ò\fBenv\fR¤Þ¤¿¤Ï\fBfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fBargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -625,8 +640,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIenv\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBenv\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -637,21 +652,21 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIfile\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBfile\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + \fBÃí°Õ:\fR +-¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¤Þ¤¿¤Ï¥»¥­¥å¥ê¥Æ¥£Êݸ¤ì¤¿¥·¥¹¥Æ¥à¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¤Þ¤¿¤Ï¥»¥­¥å¥¢¤Ê¥·¥¹¥Æ¥à¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-sigfile \fIfile\fR + .RS 4 +-À¸À®¤µ¤ì¤¿\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤ª¤è¤Ó\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë»ÈÍѤ¹¤ë¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Õ¥¡¥¤¥ë¤¬\fIDUKESIGN\fR¤Î¾ì¹ç¡¢À¸À®¤µ¤ì¤ë\fI\&.SF\fR¤ª¤è¤Ó\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ï¡¢\fIDUKESIGN\&.SF\fR¤ª¤è¤Ó\fIDUKESIGN\&.DSA\fR¤È¤¤¤¦Ì¾Á°¤Ç¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î\fIMETA\-INF\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ ++À¸À®¤µ¤ì¤¿\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤ª¤è¤Ó\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë»ÈÍѤ¹¤ë¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Õ¥¡¥¤¥ë¤¬\fBDUKESIGN\fR¤Î¾ì¹ç¡¢À¸À®¤µ¤ì¤ë\fB\&.SF\fR¤ª¤è¤Ó\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ï¡¢\fBDUKESIGN\&.SF\fR¤ª¤è¤Ó\fBDUKESIGN\&.DSA\fR¤È¤¤¤¦Ì¾Á°¤Ç¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î\fBMETA\-INF\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .sp +-¥Õ¥¡¥¤¥ëÆâ¤Îʸ»ú¤Ï¡¢¥»¥Ã¥È\fIa\-zA\-Z0\-9_\-\fR¤«¤é»ØÄꤵ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¡¢¿ô»ú¡¢²¼Àþ¤ª¤è¤Ó¥Ï¥¤¥Õ¥óʸ»ú¤Î¤ß¤ò»ÈÍѤǤ­¤Þ¤¹¡£\fI\&.SF\fR¤ª¤è¤Ó\fI\&.DSA\fR¤Î¥Õ¥¡¥¤¥ë̾¤Ç¤Ï¡¢¾®Ê¸»ú¤Ï¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ëÆâ¤Îʸ»ú¤Ï¡¢¥»¥Ã¥È\fBa\-zA\-Z0\-9_\-\fR¤«¤é»ØÄꤵ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¡¢¿ô»ú¡¢²¼Àþ¤ª¤è¤Ó¥Ï¥¤¥Õ¥óʸ»ú¤Î¤ß¤ò»ÈÍѤǤ­¤Þ¤¹¡£\fB\&.SF\fR¤ª¤è¤Ó\fB\&.DSA\fR¤Î¥Õ¥¡¥¤¥ë̾¤Ç¤Ï¡¢¾®Ê¸»ú¤Ï¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£ + .sp +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-sigfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ÎÀèƬ¤Î8ʸ»ú¤ò¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ÊÌ̾¤¬8ʸ»ṳ́Ëþ¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤¬¤½¤Î¤Þ¤Þ»ÈÍѤµ¤ì¤Þ¤¹¡£ÊÌ̾¤Ë¡¢½ð̾¥Õ¥¡¥¤¥ë̾¤Ç̵¸ú¤Êʸ»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾¤òºîÀ®¤¹¤ë¤¿¤á¤Ë¡¢³ºÅö¤¹¤ëʸ»ú¤¬²¼Àþ(_)ʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-sigfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤È\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿ÊÌ̾¤ÎÀèƬ¤Î8ʸ»ú¤ò¤¹¤Ù¤ÆÂçʸ»ú¤ËÊÑ´¹¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ÊÌ̾¤¬8ʸ»ṳ́Ëþ¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤¬¤½¤Î¤Þ¤Þ»ÈÍѤµ¤ì¤Þ¤¹¡£ÊÌ̾¤Ë¡¢½ð̾¥Õ¥¡¥¤¥ë̾¤Ç̵¸ú¤Êʸ»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾¤òºîÀ®¤¹¤ë¤¿¤á¤Ë¡¢³ºÅö¤¹¤ëʸ»ú¤¬²¼Àþ(_)ʸ»ú¤ËÊÑ´¹¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-sigalg \fIalgorithm\fR +@@ -661,7 +676,7 @@ + ɸ½àŪ¤Ê½ð̾¥¢¥ë¥´¥ê¥º¥à̾¤Î¥ê¥¹¥È¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec\&.html#AppA¤Ë¤¢¤ë + Java Cryptography Architecture (JCA)¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥¬¥¤¥É¤Î¡ÖÉÕÏ¿A: ɸ½à̾¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ë¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤Ë»ÈÍѤ¹¤ëÈëÌ©¸°¤È¤Î¸ß´¹À­¤¬É¬ÍפǤ¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢ÈëÌ©¸°¤Î¥¿¥¤¥×¤Ë±þ¤¸¤Æ¡¢\fISHA1withDSA\fR¡¢\fISHA256withRSA\fR¤Þ¤¿¤Ï\fISHA256withECDSA\fR¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥¢¥ë¥´¥ê¥º¥à¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¤¬ÀÅŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fI\-providerClass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤Î¤è¤¦¤Ê¥×¥í¥Ð¥¤¥À¤ò¥æ¡¼¥¶¡¼¤¬»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¼ºÇÔ¤·¤Þ¤¹¡£ ++¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ë¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤Ë»ÈÍѤ¹¤ëÈëÌ©¸°¤È¤Î¸ß´¹À­¤¬É¬ÍפǤ¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢ÈëÌ©¸°¤Î¥¿¥¤¥×¤Ë±þ¤¸¤Æ¡¢\fBSHA1withDSA\fR¡¢\fBSHA256withRSA\fR¤Þ¤¿¤Ï\fBSHA256withECDSA\fR¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥¢¥ë¥´¥ê¥º¥à¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¤¬ÀÅŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fB\-providerClass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤Î¤è¤¦¤Ê¥×¥í¥Ð¥¤¥À¤ò¥æ¡¼¥¶¡¼¤¬»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¼ºÇÔ¤·¤Þ¤¹¡£ + .RE + .PP + \-digestalg \fIalgorithm\fR +@@ -671,60 +686,61 @@ + ɸ½àŪ¤Ê¥á¥Ã¥»¡¼¥¸¡¦¥À¥¤¥¸¥§¥¹¥È¡¦¥¢¥ë¥´¥ê¥º¥à̾¤Î¥ê¥¹¥È¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec\&.html#AppA¤Ë¤¢¤ë + Java Cryptography Architecture (JCA)¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥¬¥¤¥É¤Î¡ÖÉÕÏ¿A: ɸ½à̾¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fISHA256\fR¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥¢¥ë¥´¥ê¥º¥à¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¤¬ÀÅŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fI\-providerClass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤Î¤è¤¦¤Ê¥×¥í¥Ð¥¤¥À¤ò¥æ¡¼¥¶¡¼¤¬»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¼ºÇÔ¤·¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fBSHA256\fR¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥¢¥ë¥´¥ê¥º¥à¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¤¬ÀÅŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fB\-providerClass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤Î¤è¤¦¤Ê¥×¥í¥Ð¥¤¥À¤ò¥æ¡¼¥¶¡¼¤¬»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¼ºÇÔ¤·¤Þ¤¹¡£ + .RE + .PP + \-certs + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¡¢\fI\-certs\fR¥ª¥×¥·¥ç¥ó¤ò\fI\-verify\fR¤ª¤è¤Ó\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊ󤬽ÐÎϤ˴ޤޤì¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ë¤Ï¡¢½ð̾¼Ô¤Î¸ø³«¸°¤ò¾ÚÌÀ¤¹¤ë¾ÚÌÀ½ñ(\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ)¤Î¥¿¥¤¥×¤Î̾Á°¤¬´Þ¤Þ¤ì¡¢¾ÚÌÀ½ñ¤¬X\&.509¾ÚÌÀ½ñ(\fIjava\&.security\&.cert\&.X509Certificate\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹)¤Î¾ì¹ç¡¢½ð̾¼Ô¤Î¼±ÊÌ̾¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç¡¢\fB\-certs\fR¥ª¥×¥·¥ç¥ó¤ò\fB\-verify\fR¤ª¤è¤Ó\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊ󤬽ÐÎϤ˴ޤޤì¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ë¤Ï¡¢½ð̾¼Ô¤Î¸ø³«¸°¤ò¾ÚÌÀ¤¹¤ë¾ÚÌÀ½ñ(\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ)¤Î¥¿¥¤¥×¤Î̾Á°¤¬´Þ¤Þ¤ì¡¢¾ÚÌÀ½ñ¤¬X\&.509¾ÚÌÀ½ñ(\fBjava\&.security\&.cert\&.X509Certificate\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹)¤Î¾ì¹ç¡¢½ð̾¼Ô¤Î¼±ÊÌ̾¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .sp +-¥­¡¼¥¹¥È¥¢¤Î³Îǧ¤â¹Ô¤ï¤ì¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥­¡¼¥¹¥È¥¢¤ÎÃͤ¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë(¤¢¤ë¾ì¹ç)¤¬¥Á¥§¥Ã¥¯¤µ¤ì¤Þ¤¹¡£½ð̾¼Ô¤Î¸ø³«¸°¤Î¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢Æâ¤Î¥¨¥ó¥È¥ê¤È°ìÃפ¹¤ë¾ì¹ç¡¢¤½¤Î½ð̾¼Ô¤Î¥­¡¼¥¹¥È¥¢¤Î¥¨¥ó¥È¥ê¤ÎÊÌ̾¤¬´Ý¥«¥Ã¥³Æâ¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î³Îǧ¤â¹Ô¤ï¤ì¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¥­¡¼¥¹¥È¥¢¤ÎÃͤ¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë(¤¢¤ë¾ì¹ç)¤¬¥Á¥§¥Ã¥¯¤µ¤ì¤Þ¤¹¡£½ð̾¼Ô¤Î¸ø³«¸°¤Î¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢Æâ¤Î¥¨¥ó¥È¥ê¤È°ìÃפ¹¤ë¾ì¹ç¡¢¤½¤Î½ð̾¼Ô¤Î¥­¡¼¥¹¥È¥¢¤Î¥¨¥ó¥È¥ê¤ÎÊÌ̾¤¬´Ý¥«¥Ã¥³Æâ¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-certchain \fIfile\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤¿ÊÌ̾¤Ë¤è¤Ã¤Æɽ¤µ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬´°Á´¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ë¡¢»ÈÍѤ¹¤ë¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥óÁ´ÂΤòÊÝ»ý¤¹¤ë¤Î¤Ë½½Ê¬¤ÊÎΰ褬¤Ê¤¤¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¾å¤Ë¥­¡¼¥¹¥È¥¢¤¬³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï°ìÏ¢¤ÎÏ¢·ë¤µ¤ì¤¿X\&.509¾ÚÌÀ½ñ¡¢PKCS#7·Á¼°¤Îñ°ì¥Ç¡¼¥¿¡¦¥Ö¥í¥Ã¥¯¤Î¤¤¤º¤ì¤«¤È¤Ê¤ê¡¢¤½¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°¤Ï¥Ð¥¤¥Ê¥ê¡¦¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°¡¢Internet RFC 1421ɸ½à¤Çµ¬Äꤵ¤ì¤ë°õºþ²Äǽ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°(Base64¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤È¤â¸Æ¤Ð¤ì¤ë)¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ê¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ª¤è¤Óhttp://tools\&.ietf\&.org/html/rfc1421¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤¿ÊÌ̾¤Ë¤è¤Ã¤Æɽ¤µ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬´°Á´¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ë¡¢»ÈÍѤ¹¤ë¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥óÁ´ÂΤòÊÝ»ý¤¹¤ë¤Î¤Ë½½Ê¬¤ÊÎΰ褬¤Ê¤¤¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¾å¤Ë¥­¡¼¥¹¥È¥¢¤¬³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï°ìÏ¢¤ÎÏ¢·ë¤µ¤ì¤¿X\&.509¾ÚÌÀ½ñ¡¢PKCS#7·Á¼°¤Îñ°ì¥Ç¡¼¥¿¡¦¥Ö¥í¥Ã¥¯¤Î¤¤¤º¤ì¤«¤È¤Ê¤ê¡¢¤½¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°¤Ï¥Ð¥¤¥Ê¥ê¡¦¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°¡¢Internet RFC 1421ɸ½à¤Çµ¬Äꤵ¤ì¤ë°õºþ²Äǽ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°·Á¼°(Base64¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤È¤â¸Æ¤Ð¤ì¤ë)¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ê¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ª¤è¤Óhttp://tools\&.ietf\&.org/html/rfc1421¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-verbose + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¾éĹ¥â¡¼¥É¤ÇÆ°ºî¤·¡¢¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢\fIjarsigner\fR¤Ï¡¢JAR¤Î½ð̾¤Þ¤¿¤Ï¸¡¾Ú¤Î¿Ê¹Ô¾õ¶·¤Ë´Ø¤¹¤ëÄɲþðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¾éĹ¥â¡¼¥É¤ÇÆ°ºî¤·¡¢¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢\fBjarsigner\fR¤Ï¡¢JAR¤Î½ð̾¤Þ¤¿¤Ï¸¡¾Ú¤Î¿Ê¹Ô¾õ¶·¤Ë´Ø¤¹¤ëÄɲþðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-internalsf + .RS 4 +-°ÊÁ°¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤ËÀ¸À®¤µ¤ì¤¿\fI\&.DSA\fR +-(½ð̾¥Ö¥í¥Ã¥¯)¥Õ¥¡¥¤¥ë¤Ë¡¢À¸À®¤µ¤ì¤¿\fI\&.SF\fR¥Õ¥¡¥¤¥ë(½ð̾¥Õ¥¡¥¤¥ë)¤Î¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿´°Á´¤Ê¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤·¤¿¡£ ¤³¤ÎÆ°ºî¤ÏÊѹ¹¤µ¤ì¤Þ¤·¤¿¡£½ÐÎÏJAR¥Õ¥¡¥¤¥ëÁ´ÂΤΥµ¥¤¥º¤ò¾®¤µ¤¯¤¹¤ë¤¿¤á¤Ë¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Ê¤¤¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-internalsf\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢°ÊÁ°¤ÈƱ¤¸¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Æ¥¹¥È¤ò¹Ô¤¦¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¼ÂºÝ¤Ë¤Ï¡¢\fI\-internalsf\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礭¤¯¤Ê¤ë¤¿¤á¡¢»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++°ÊÁ°¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤ËÀ¸À®¤µ¤ì¤¿\fB\&.DSA\fR ++(½ð̾¥Ö¥í¥Ã¥¯)¥Õ¥¡¥¤¥ë¤Ë¡¢À¸À®¤µ¤ì¤¿\fB\&.SF\fR¥Õ¥¡¥¤¥ë(½ð̾¥Õ¥¡¥¤¥ë)¤Î¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿´°Á´¤Ê¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤·¤¿¡£ ¤³¤ÎÆ°ºî¤ÏÊѹ¹¤µ¤ì¤Þ¤·¤¿¡£½ÐÎÏJAR¥Õ¥¡¥¤¥ëÁ´ÂΤΥµ¥¤¥º¤ò¾®¤µ¤¯¤¹¤ë¤¿¤á¤Ë¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤¬´Þ¤Þ¤ì¤Ê¤¤¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-internalsf\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢°ÊÁ°¤ÈƱ¤¸¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Æ¥¹¥È¤ò¹Ô¤¦¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¼ÂºÝ¤Ë¤Ï¡¢\fB\-internalsf\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礭¤¯¤Ê¤ë¤¿¤á¡¢»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-sectionsonly + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-sectionsonly\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤ËÀ¸À®¤µ¤ì¤ë\fI\&.SF\fR¥Õ¥¡¥¤¥ë(½ð̾¥Õ¥¡¥¤¥ë)¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥå·¥å¤ò´Þ¤à¥Ø¥Ã¥À¡¼¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë´Þ¤Þ¤ì¤ë¤Î¤Ï¡¢JAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë´ØÏ¢¤¹¤ë¾ðÊ󤪤è¤Ó¥Ï¥Ã¥·¥å¤Î¤ß¤Ç¤¹¡£½ð̾¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-sectionsonly\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤ËÀ¸À®¤µ¤ì¤ë\fB\&.SF\fR¥Õ¥¡¥¤¥ë(½ð̾¥Õ¥¡¥¤¥ë)¤Ë¤Ï¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥå·¥å¤ò´Þ¤à¥Ø¥Ã¥À¡¼¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë´Þ¤Þ¤ì¤ë¤Î¤Ï¡¢JAR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë´ØÏ¢¤¹¤ë¾ðÊ󤪤è¤Ó¥Ï¥Ã¥·¥å¤Î¤ß¤Ç¤¹¡£½ð̾¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇŬ²½¤Î¤¿¤á¤Ë¡¢¤³¤Î¥Ø¥Ã¥À¡¼¤¬Äɲ䵤ì¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤¹¤ë¤¿¤Ó¤Ë¡¢¸¡¾Ú¤Ç¤Ï¡¢¤Þ¤º¥Ø¥Ã¥À¡¼Æâ¤Î¥Ï¥Ã¥·¥å¤¬¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥå·¥å¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£°ìÃפ¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ï¼¡¤Î¼ê½ç¤Ë¿Ê¤ß¤Þ¤¹¡£°ìÃפ·¤Ê¤¤¾ì¹ç¡¢\fI\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¾ðÊ󥻥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤È¤¤¤¦¡¢¤¢¤Þ¤êºÇŬ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¸¡¾Ú¤ò¼Â¹Ô¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇŬ²½¤Î¤¿¤á¤Ë¡¢¤³¤Î¥Ø¥Ã¥À¡¼¤¬Äɲ䵤ì¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤¬Â¸ºß¤¹¤ë¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤¹¤ë¤¿¤Ó¤Ë¡¢¸¡¾Ú¤Ç¤Ï¡¢¤Þ¤º¥Ø¥Ã¥À¡¼Æâ¤Î¥Ï¥Ã¥·¥å¤¬¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÁ´ÂΤΥϥå·¥å¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤¹¤ë¤¿¤á¤Ë¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£°ìÃפ¹¤ë¾ì¹ç¡¢¸¡¾Ú¤Ï¼¡¤Î¼ê½ç¤Ë¿Ê¤ß¤Þ¤¹¡£°ìÃפ·¤Ê¤¤¾ì¹ç¡¢\fB\&.SF\fR¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¾ðÊ󥻥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤¬¡¢¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Õ¥¡¥¤¥ëÆâ¤ÎÂбþ¤¹¤ë¥»¥¯¥·¥ç¥ó¤Î¥Ï¥Ã¥·¥å¤È°ìÃפ¹¤ë¤È¤¤¤¦¡¢¤¢¤Þ¤êºÇŬ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¸¡¾Ú¤ò¼Â¹Ô¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-sectionsonly\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¼ç¤Ë¥Æ¥¹¥ÈÍѤ˻ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ¹¤ë¤È¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礭¤¯¤Ê¤ë¤¿¤á¡¢¥Æ¥¹¥ÈÍѰʳ°¤Ç¤Ï»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++\fB\-sectionsonly\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¼ç¤Ë¥Æ¥¹¥ÈÍѤ˻ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ¹¤ë¤È¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬Â礭¤¯¤Ê¤ë¤¿¤á¡¢¥Æ¥¹¥ÈÍѰʳ°¤Ç¤Ï»ÈÍѤ·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-protected + .RS 4 +-\fItrue\fR¤Þ¤¿¤Ï\fIfalse\fR¤Î¤¤¤º¤ì¤«¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£ÀìÍÑPIN¥ê¡¼¥À¡¼¤Ê¤É¤ÎÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹¤Ë¤è¤Ã¤Æ¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢\fItrue\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBtrue\fR¤Þ¤¿¤Ï\fBfalse\fR¤Î¤¤¤º¤ì¤«¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£ÀìÍÑPIN¥ê¡¼¥À¡¼¤Ê¤É¤ÎÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹¤Ë¤è¤Ã¤Æ¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢\fBtrue\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-providerClass \fIprovider\-class\-name\fR + .RS 4 +-°Å¹æ²½¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¤¬\fIjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¤­¤Ï¡¢¤½¤Î¥Þ¥¹¥¿¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò»ØÄꤹ¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ ++°Å¹æ²½¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¤¬\fBjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¤­¤Ï¡¢¤½¤Î¥Þ¥¹¥¿¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò»ØÄꤹ¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp +-\fI\-providerArg ConfigFilePath\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¡¢\fIkeytool\fR¤ª¤è¤Ó\fIjarsigner\fR¥Ä¡¼¥ë¤Ï¡¢¥×¥í¥Ð¥¤¥À¤òưŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤·¡¢¥È¡¼¥¯¥ó¹½À®¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤Ë\fIConfigFilePath\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤ÎÎã¤Ï¡¢Oracle PKCS #11¥×¥í¥Ð¥¤¥À¤¬¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ë¹½À®¤µ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë\fIPKCS #11\fR¥­¡¼¥¹¥È¥¢¤ò°ìÍ÷ɽ¼¨¤¹¤ë¥³¥Þ¥ó¥É¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ ++\fB\-providerArg ConfigFilePath\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¡¢\fBkeytool\fR¤ª¤è¤Ó\fBjarsigner\fR¥Ä¡¼¥ë¤Ï¡¢¥×¥í¥Ð¥¤¥À¤òưŪ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤·¡¢¥È¡¼¥¯¥ó¹½À®¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤Ë\fIConfigFilePath\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤ÎÎã¤Ï¡¢Oracle PKCS #11¥×¥í¥Ð¥¤¥À¤¬¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ë¹½À®¤µ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë\fBPKCS #11\fR¥­¡¼¥¹¥È¥¢¤ò°ìÍ÷ɽ¼¨¤¹¤ë¥³¥Þ¥ó¥É¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore NONE \-storetype PKCS11 \e +- \-providerClass sun\&.security\&.pkcs11\&.SunPKCS11 \e +- \-providerArg /mydir1/mydir2/token\&.config \e +- \-list ++\fBjarsigner \-keystore NONE \-storetype PKCS11 \e\fR ++\fB \-providerClass sun\&.security\&.pkcs11\&.SunPKCS11 \e\fR ++\fB \-providerArg /mydir1/mydir2/token\&.config \e\fR ++\fB \-list\fR ++ + .fi + .if n \{\ + .RE +@@ -733,17 +749,18 @@ + .PP + \-providerName \fIproviderName\fR + .RS 4 +-\fIjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Ç2¤Ä°Ê¾å¤Î¥×¥í¥Ð¥¤¥À¤¬¹½À®¤µ¤ì¤¿¾ì¹ç¡¢\fI\-providerName\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢ÆÃÄê¤Î¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤òÂоݤˤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ï¡¢¥×¥í¥Ð¥¤¥À¤Î̾Á°¤Ç¤¹¡£ ++\fBjava\&.security\fR¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Ç2¤Ä°Ê¾å¤Î¥×¥í¥Ð¥¤¥À¤¬¹½À®¤µ¤ì¤¿¾ì¹ç¡¢\fB\-providerName\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢ÆÃÄê¤Î¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤òÂоݤˤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ï¡¢¥×¥í¥Ð¥¤¥À¤Î̾Á°¤Ç¤¹¡£ + .sp +-Oracle PKCS #11¥×¥í¥Ð¥¤¥À¤Î¾ì¹ç¡¢\fIproviderName\fR¤Ï\fISunPKCS11\-\fR\fITokenName\fR¤È¤¤¤¦·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤³¤Ç¡¢¹½À®Â°À­¤Îɽ¤Ç¾ÜºÙ¤ËÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢\fITokenName\fR¤Ï¡¢¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤¬¹½À®¤µ¤ì¤¿Ì¾Á°¤ÎÀÜÈø¼­¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Ì¾Á°ÀÜÈø¼­\fISmartCard\fR¤Î\fIPKCS #11\fR¥­¡¼¥¹¥È¥¢¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÆâÍƤò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£ ++Oracle PKCS #11¥×¥í¥Ð¥¤¥À¤Î¾ì¹ç¡¢\fIproviderName\fR¤Ï\fBSunPKCS11\-\fR\fITokenName\fR¤È¤¤¤¦·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤³¤Ç¡¢¹½À®Â°À­¤Îɽ¤Ç¾ÜºÙ¤ËÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢\fITokenName\fR¤Ï¡¢¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤¬¹½À®¤µ¤ì¤¿Ì¾Á°¤ÎÀÜÈø¼­¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Ì¾Á°ÀÜÈø¼­\fBSmartCard\fR¤Î\fBPKCS #11\fR¥­¡¼¥¹¥È¥¢¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÆâÍƤò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore NONE \-storetype PKCS11 \e +- \-providerName SunPKCS11\-SmartCard \e +- \-list ++\fBjarsigner \-keystore NONE \-storetype PKCS11 \e\fR ++\fB \-providerName SunPKCS11\-SmartCard \e\fR ++\fB \-list\fR ++ + .fi + .if n \{\ + .RE +@@ -752,41 +769,41 @@ + .PP + \-J\fIjavaoption\fR + .RS 4 +-»ØÄꤵ¤ì¤¿\fIjavaoption\fRʸ»úÎó¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤ËľÀÜÅϤ·¤Þ¤¹¡£\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¤¥ó¥¿¥×¥ê¥¿¤ËÂФ¹¤ë¥é¥Ã¥Ñ¡¼¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤòÄ´À°¤¹¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£»ØÄê¤Ç¤­¤ë¥¤¥ó¥¿¥×¥ê¥¿¡¦¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjava \-h\fR¤Þ¤¿¤Ï\fIjava \-X\fR¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£ ++»ØÄꤵ¤ì¤¿\fIjavaoption\fRʸ»úÎó¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤ËľÀÜÅϤ·¤Þ¤¹¡£\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¤¥ó¥¿¥×¥ê¥¿¤ËÂФ¹¤ë¥é¥Ã¥Ñ¡¼¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤòÄ´À°¤¹¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£»ØÄê¤Ç¤­¤ë¥¤¥ó¥¿¥×¥ê¥¿¡¦¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç\fBjava \-h\fR¤Þ¤¿¤Ï\fBjava \-X\fR¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-tsa \fIurl\fR + .RS 4 +-\fI\-tsa http://example\&.tsa\&.url\fR¤¬JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¤¢¤ë¾ì¹ç¡¢½ð̾¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬À¸À®¤µ¤ì¤Þ¤¹¡£URL +-\fIhttp://example\&.tsa\&.url\fR¤Ï¡¢Time Stamping Authority (TSA)¤Î¾ì½ê¤òÆÃÄꤷ¡¢\fI\-tsacert\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¸¡½Ð¤µ¤ì¤¿URL¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fI\-tsa\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢TSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤ËÇÛÃÖ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ ++\fB\-tsa http://example\&.tsa\&.url\fR¤¬JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë¥³¥Þ¥ó¥É¹Ô¤Ë¤¢¤ë¾ì¹ç¡¢½ð̾¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬À¸À®¤µ¤ì¤Þ¤¹¡£URL ++\fBhttp://example\&.tsa\&.url\fR¤Ï¡¢Time Stamping Authority (TSA)¤Î¾ì½ê¤òÆÃÄꤷ¡¢\fB\-tsacert\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¸¡½Ð¤µ¤ì¤¿URL¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fB\-tsa\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢TSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤ËÇÛÃÖ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ + .sp +-¥¿¥¤¥à¥¹¥¿¥ó¥×¤òÀ¸À®¤¹¤ë¤¿¤á¤Ë¡¢\fIjarsigner\fR¤Ï¡¢RFC 3161¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥¿¥¤¥à¥¹¥¿¥ó¥×¡¦¥×¥í¥È¥³¥ë(TSP)¤ò»ÈÍѤ·¤ÆTSA¤ÈÄÌ¿®¤·¤Þ¤¹¡£À®¸ù¤¹¤ë¤È¡¢TSA¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤¿¥¿¥¤¥à¥¹¥¿¥ó¥×¡¦¥È¡¼¥¯¥ó¤Ï¡¢½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤Î½ð̾¤È¤È¤â¤ËÊݸ¤µ¤ì¤Þ¤¹¡£ ++¥¿¥¤¥à¥¹¥¿¥ó¥×¤òÀ¸À®¤¹¤ë¤¿¤á¤Ë¡¢\fBjarsigner\fR¤Ï¡¢RFC 3161¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥¿¥¤¥à¥¹¥¿¥ó¥×¡¦¥×¥í¥È¥³¥ë(TSP)¤ò»ÈÍѤ·¤ÆTSA¤ÈÄÌ¿®¤·¤Þ¤¹¡£À®¸ù¤¹¤ë¤È¡¢TSA¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤¿¥¿¥¤¥à¥¹¥¿¥ó¥×¡¦¥È¡¼¥¯¥ó¤Ï¡¢½ð̾¥Ö¥í¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤Î½ð̾¤È¤È¤â¤ËÊݸ¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-tsacert \fIalias\fR + .RS 4 +-\fI\-tsacert alias\fR¤¬JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¤¢¤ë¾ì¹ç¡¢½ð̾¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ÊÌ̾¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÍ­¸ú¤ÊTSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤òÆÃÄꤷ¤Þ¤¹¡£¥¨¥ó¥È¥ê¤Î¾ÚÌÀ½ñ¤Ç¡¢TSA¤Î¾ì½ê¤òÆÃÄꤹ¤ëURL¤ò´Þ¤àSubject Information Access³ÈÄ¥µ¡Ç½¤¬³Îǧ¤µ¤ì¤Þ¤¹¡£ ++\fB\-tsacert alias\fR¤¬JAR¥Õ¥¡¥¤¥ë¤Î½ð̾»þ¤Ë¥³¥Þ¥ó¥É¹Ô¤Ë¤¢¤ë¾ì¹ç¡¢½ð̾¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ÊÌ̾¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÍ­¸ú¤ÊTSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤òÆÃÄꤷ¤Þ¤¹¡£¥¨¥ó¥È¥ê¤Î¾ÚÌÀ½ñ¤Ç¡¢TSA¤Î¾ì½ê¤òÆÃÄꤹ¤ëURL¤ò´Þ¤àSubject Information Access³ÈÄ¥µ¡Ç½¤¬³Îǧ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-tsacert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢TSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fB\-tsacert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢TSA¤Î¸ø³«¸°¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-tsapolicyid \fIpolicyid\fR + .RS 4 + TSA¥µ¡¼¥Ð¡¼¤ËÁ÷¿®¤¹¤ë¥Ý¥ê¥·¡¼ID¤ò¼±Ê̤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¼±ÊÌ»Ò(OID)¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ý¥ê¥·¡¼ID¤ÏÁ÷¿®¤µ¤ì¤º¡¢TSA¥µ¡¼¥Ð¡¼¤Ï¥Ç¥Õ¥©¥ë¥È¤Î¥Ý¥ê¥·¡¼ID¤òÁªÂò¤·¤Þ¤¹¡£ + .sp +-¥ª¥Ö¥¸¥§¥¯¥È¼±Ê̻Ҥϡ¢ITU Telecommunication Standardization Sector (ITU\-T)ɸ½à¤Ç¤¢¤ëX\&.696¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¼±Ê̻Ҥϡ¢Ä̾\fI1\&.2\&.3\&.4\fR¤Ê¤É¤Î¡¢Éé¤Ç¤Ï¤Ê¤¤¿ô»ú¤Î¥Ô¥ê¥ª¥É¶èÀÚ¤ê¤Î¥»¥Ã¥È¤Ç¤¹¡£ ++¥ª¥Ö¥¸¥§¥¯¥È¼±Ê̻Ҥϡ¢ITU Telecommunication Standardization Sector (ITU\-T)ɸ½à¤Ç¤¢¤ëX\&.696¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¼±Ê̻Ҥϡ¢Ä̾\fB1\&.2\&.3\&.4\fR¤Ê¤É¤Î¡¢Éé¤Ç¤Ï¤Ê¤¤¿ô»ú¤Î¥Ô¥ê¥ª¥É¶èÀÚ¤ê¤Î¥»¥Ã¥È¤Ç¤¹¡£ + .RE + .PP + \-altsigner \fIclass\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ÂåÂؽð̾¥á¥«¥Ë¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤Ï¡¢\fIcom\&.sun\&.jarsigner\&.ContentSigner\fRÃê¾Ý¥¯¥é¥¹¤ò³ÈÄ¥¤¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¼±Ê̤·¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤Ï¡¢\fI\-altsignerpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£\fI\-altsigner\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥Õ¥©¥ë¥È¤Î½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ÂåÂؽð̾¥á¥«¥Ë¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤Ï¡¢\fBcom\&.sun\&.jarsigner\&.ContentSigner\fRÃê¾Ý¥¯¥é¥¹¤ò³ÈÄ¥¤¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¼±Ê̤·¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤Ï¡¢\fB\-altsignerpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£\fB\-altsigner\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥Õ¥©¥ë¥È¤Î½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢\fIcom\&.sun\&.sun\&.jarsigner\&.AuthSigner\fR¤È¤¤¤¦Ì¾Á°¤Î¥¯¥é¥¹¤¬Ä󶡤¹¤ë½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢jarsigner¤Î¥ª¥×¥·¥ç¥ó\fI\-altsigner com\&.sun\&.jarsigner\&.AuthSigner\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fBcom\&.sun\&.sun\&.jarsigner\&.AuthSigner\fR¤È¤¤¤¦Ì¾Á°¤Î¥¯¥é¥¹¤¬Ä󶡤¹¤ë½ð̾¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢jarsigner¤Î¥ª¥×¥·¥ç¥ó\fB\-altsigner com\&.sun\&.jarsigner\&.AuthSigner\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-altsignerpath \fIclasspathlist\fR + .RS 4 +-¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¤½¤ì¤¬°Í¸¤¹¤ëJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-altsigner\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¤½¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¤½¤ì¤¬°Í¸¤¹¤ëJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-altsigner\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¤½¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + ÀäÂХѥ¹¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤ÎÁêÂХѥ¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIclasspathlist\fR¤ËÊ£¿ô¤Î¥Ñ¥¹¤äJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¡¢¤½¤ì¤é¤ò¡¢Oracle Solaris¤Î¾ì¹ç¤Ï¥³¥í¥ó(:)¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó(;)¤Ç¡¢¤½¤ì¤¾¤ì¶èÀÚ¤ê¤Þ¤¹¡£ÌÜŪ¤Î¥¯¥é¥¹¤¬¤¹¤Ç¤Ë¸¡º÷¥Ñ¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹¡£ + .sp +@@ -796,7 +813,8 @@ + .RS 4 + .\} + .nf +-\-altsignerpath /home/user/lib/authsigner\&.jar ++\fB\-altsignerpath /home/user/lib/authsigner\&.jar\fR ++ + .fi + .if n \{\ + .RE +@@ -807,7 +825,8 @@ + .RS 4 + .\} + .nf +-\-altsignerpath /home/user/classes/com/sun/tools/jarsigner/ ++\fB\-altsignerpath /home/user/classes/com/sun/tools/jarsigner/\fR ++ + .fi + .if n \{\ + .RE +@@ -821,23 +840,23 @@ + .PP + \-verbose \fIsuboptions\fR + .RS 4 +-¸¡¾Ú½èÍý¤Î¾ì¹ç¡¢\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢É½¼¨¤¹¤ë¾ðÊó¤ÎÎ̤ò·èÄꤹ¤ë¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-certs\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥â¡¼¥É(¤Þ¤¿¤Ï¥µ¥Ö¥ª¥×¥·¥ç¥ó\fIall\fR)¤Ç¤Ï¡¢¥¨¥ó¥È¥ê¤¬½èÍý¤µ¤ì¤ë¤¿¤Ó¤Ë³Æ¥¨¥ó¥È¥ê¤¬É½¼¨¤µ¤ì¡¢¤½¤Î¸å¤ËJAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊó¤âɽ¼¨¤µ¤ì¤Þ¤¹¡£\fI\-certs\fR¤ª¤è¤Ó\fI\-verbose:grouped\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Æ±¤¸½ð̾¼Ô¾ðÊó¤ò»ý¤Ä¥¨¥ó¥È¥ê¤¬¡¢¤½¤Î¾ÚÌÀ½ñ¾ðÊó¤È¤È¤â¤Ë¡¢¥°¥ë¡¼¥×²½¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£\fI\-certs\fR¤ª¤è¤Ó\fI\-verbose:summary\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Æ±¤¸½ð̾¼Ô¾ðÊó¤ò»ý¤Ä¥¨¥ó¥È¥ê¤¬¡¢¤½¤Î¾ÚÌÀ½ñ¾ðÊó¤È¤È¤â¤Ë¡¢¥°¥ë¡¼¥×²½¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£³Æ¥¨¥ó¥È¥ê¤Î¾ÜºÙ¤Ï¡¢\fI1¤Ä¤Î¥¨¥ó¥È¥ê(°Ê¾å)\fR¤Ë¤Þ¤È¤á¤é¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£Îã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¸¡¾Ú½èÍý¤Î¾ì¹ç¡¢\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢É½¼¨¤¹¤ë¾ðÊó¤ÎÎ̤ò·èÄꤹ¤ë¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-certs\fR¥ª¥×¥·¥ç¥ó¤â»ØÄꤷ¤¿¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥â¡¼¥É(¤Þ¤¿¤Ï¥µ¥Ö¥ª¥×¥·¥ç¥ó\fBall\fR)¤Ç¤Ï¡¢¥¨¥ó¥È¥ê¤¬½èÍý¤µ¤ì¤ë¤¿¤Ó¤Ë³Æ¥¨¥ó¥È¥ê¤¬É½¼¨¤µ¤ì¡¢¤½¤Î¸å¤ËJAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊó¤âɽ¼¨¤µ¤ì¤Þ¤¹¡£\fB\-certs\fR¤ª¤è¤Ó\fB\-verbose:grouped\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Æ±¤¸½ð̾¼Ô¾ðÊó¤ò»ý¤Ä¥¨¥ó¥È¥ê¤¬¡¢¤½¤Î¾ÚÌÀ½ñ¾ðÊó¤È¤È¤â¤Ë¡¢¥°¥ë¡¼¥×²½¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£\fB\-certs\fR¤ª¤è¤Ó\fB\-verbose:summary\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Æ±¤¸½ð̾¼Ô¾ðÊó¤ò»ý¤Ä¥¨¥ó¥È¥ê¤¬¡¢¤½¤Î¾ÚÌÀ½ñ¾ðÊó¤È¤È¤â¤Ë¡¢¥°¥ë¡¼¥×²½¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£³Æ¥¨¥ó¥È¥ê¤Î¾ÜºÙ¤Ï¡¢\fI1¤Ä¤Î¥¨¥ó¥È¥ê(°Ê¾å)\fR¤Ë¤Þ¤È¤á¤é¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£Îã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥¨¥é¡¼¤È·Ù¹ð" + .PP +-½ð̾¤Þ¤¿¤Ï¸¡¾Ú¥×¥í¥»¥¹Ãæ¤Ë¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ç¡¢ÍÍ¡¹¤Ê¥¨¥é¡¼¤Þ¤¿¤Ï·Ù¹ð¤¬È¯¹Ô¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++½ð̾¤Þ¤¿¤Ï¸¡¾Ú¥×¥í¥»¥¹Ãæ¤Ë¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ç¡¢ÍÍ¡¹¤Ê¥¨¥é¡¼¤Þ¤¿¤Ï·Ù¹ð¤¬È¯¹Ô¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¾ã³²¤¬¤¢¤ë¾ì¹ç¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É1¤Ç½ªÎ»¤·¤Þ¤¹¡£¾ã³²¤Ï¤Ê¤¤¤¬¡¢1¤Ä°Ê¾å¤Î½ÅÂç¤Ê·Ù¹ð¤¬¤¢¤ë¾ì¹ç¡¢\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ\fB¤¤¤Ê¤¤\fR¾ì¹ç¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É0¤Ç½ªÎ»¤·¡¢\fI\-strict\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï·Ù¹ð¥³¡¼¥É¤ÎORÃͤǽªÎ»¤·¤Þ¤¹¡£¾ðÊó·Ù¹ð¤Î¤ß¤¬¤¢¤ë¡¢¤Þ¤¿¤Ï·Ù¹ð¤¬¤Þ¤Ã¤¿¤¯¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¾ï¤Ë¥³¡¼¥É0¤Ç½ªÎ»¤·¤Þ¤¹¡£ ++¾ã³²¤¬¤¢¤ë¾ì¹ç¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É1¤Ç½ªÎ»¤·¤Þ¤¹¡£¾ã³²¤Ï¤Ê¤¤¤¬¡¢1¤Ä°Ê¾å¤Î½ÅÂç¤Ê·Ù¹ð¤¬¤¢¤ë¾ì¹ç¡¢\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ\fB¤¤¤Ê¤¤\fR¾ì¹ç¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É0¤Ç½ªÎ»¤·¡¢\fB\-strict\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï·Ù¹ð¥³¡¼¥É¤ÎORÃͤǽªÎ»¤·¤Þ¤¹¡£¾ðÊó·Ù¹ð¤Î¤ß¤¬¤¢¤ë¡¢¤Þ¤¿¤Ï·Ù¹ð¤¬¤Þ¤Ã¤¿¤¯¤Ê¤¤¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¾ï¤Ë¥³¡¼¥É0¤Ç½ªÎ»¤·¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¥¨¥ó¥È¥ê¤Î½ð̾¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬´ü¸ÂÀÚ¤ì¤Ç¡¢¥Õ¥¡¥¤¥ë¤Î½ð̾¤òµö²Ä¤·¤Ê¤¤KeyUsage³ÈÄ¥µ¡Ç½¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¡¢\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¤È¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É12 (=4+8)¤Ç½ªÎ»¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥¨¥ó¥È¥ê¤Î½ð̾¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤¬´ü¸ÂÀÚ¤ì¤Ç¡¢¥Õ¥¡¥¤¥ë¤Î½ð̾¤òµö²Ä¤·¤Ê¤¤KeyUsage³ÈÄ¥µ¡Ç½¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¡¢\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¤È¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ï¥³¡¼¥É12 (=4+8)¤Ç½ªÎ»¤·¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-UNIX¥Ù¡¼¥¹¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¤Ï0¤«¤é255¤Þ¤Ç¤ÎÃͤΤߤ¬Í­¸ú¤Î¤¿¤á¡¢½ªÎ»¥³¡¼¥É¤ÏºÆÍøÍѤµ¤ì¤Þ¤¹¡£ ++Solaris¡¢Linux¤ª¤è¤ÓOS X¤Ç¤Ï0¤«¤é255¤Þ¤Ç¤ÎÃͤΤߤ¬Í­¸ú¤Î¤¿¤á¡¢½ªÎ»¥³¡¼¥É¤ÏºÆÍøÍѤµ¤ì¤Þ¤¹¡£ + .PP +-¼¡¤Î¥»¥¯¥·¥ç¥ó¤Ç¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤êȯ¹Ô¤Ç¤­¤ë¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¤Î̾Á°¡¢¥³¡¼¥É¡¢ÀâÌÀ¤òµ­½Ò¤·¤Þ¤¹¡£ ++¼¡¤Î¥»¥¯¥·¥ç¥ó¤Ç¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Ë¤è¤êȯ¹Ô¤Ç¤­¤ë¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¤Î̾Á°¡¢¥³¡¼¥É¡¢ÀâÌÀ¤òµ­½Ò¤·¤Þ¤¹¡£ + .SS "¾ã³²" + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó²òÀÏ¥¨¥é¡¼¡¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¸°¥Ú¥¢¤ò¸¡º÷¤Ç¤­¤Ê¤¤¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¼ºÇԤʤÉ(¸ÂÄꤵ¤ì¤Þ¤»¤ó)¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤Î¼ºÇÔÍýͳ¡£ ++¥³¥Þ¥ó¥É¹Ô²òÀÏ¥¨¥é¡¼¡¢JAR¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¸°¥Ú¥¢¤ò¸¡º÷¤Ç¤­¤Ê¤¤¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Î¸¡¾Ú¼ºÇԤʤÉ(¸ÂÄꤵ¤ì¤Þ¤»¤ó)¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤Î¼ºÇÔÍýͳ¡£ + .PP + failure + .RS 4 +@@ -846,9 +865,9 @@ + .SS "½ÅÂç¤Ê·Ù¹ð" + .PP + \fBÃí°Õ:\fR +-\fI\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢½ÅÂç¤Ê·Ù¹ð¤Ï¥¨¥é¡¼¤È¤·¤ÆÊó¹ð¤µ¤ì¤Þ¤¹¡£ ++\fB\-strict\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢½ÅÂç¤Ê·Ù¹ð¤Ï¥¨¥é¡¼¤È¤·¤ÆÊó¹ð¤µ¤ì¤Þ¤¹¡£ + .PP +-JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤Ë»ÈÍѤ¹¤ë¾ÚÌÀ½ñ¤Ë¥¨¥é¡¼¤¬¤¢¤ë¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë¾¤ÎÌäÂ꤬¤¢¤ë¤Ê¤É¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤¬½ÅÂç¤Ê·Ù¹ð¤òȯ¹Ô¤¹¤ëÍýͳ¡£ ++JAR¥Õ¥¡¥¤¥ë¤Î½ð̾¤Ë»ÈÍѤ¹¤ë¾ÚÌÀ½ñ¤Ë¥¨¥é¡¼¤¬¤¢¤ë¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë¾¤ÎÌäÂ꤬¤¢¤ë¤Ê¤É¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤¬½ÅÂç¤Ê·Ù¹ð¤òȯ¹Ô¤¹¤ëÍýͳ¡£ + .PP + hasExpiredCert + .RS 4 +@@ -862,7 +881,7 @@ + .PP + chainNotValidated + .RS 4 +-¥³¡¼¥É4¡£¤³¤Îjar¤Ë¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬Àµ¤·¤¯¸¡¾Ú¤Ç¤­¤Ê¤¤¥¨¥ó¥È¥ê¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¥³¡¼¥É4¡£¤³¤Îjar¤Ë¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬¸¡¾Ú¤µ¤ì¤Æ¤¤¤Ê¤¤¥¨¥ó¥È¥ê¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + badKeyUsage +@@ -905,27 +924,28 @@ + .PP + noTimestamp + .RS 4 +-¤³¤Îjar¤Ë¤Ï¡¢¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤Þ¤Ê¤¤½ð̾¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ê¤·¤Ç¤Ï¡¢½ð̾¼Ô¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü¸Â(\fIYYYY\-MM\-DD\fR)¸å¤Þ¤¿¤Ï¾­Íè¤Î¼è¾ÃÆü¸å¡¢¥æ¡¼¥¶¡¼¤Ï¤³¤ÎJAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤Ç¤­¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ ++¤³¤Îjar¤Ë¤Ï¡¢¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤Þ¤Ê¤¤½ð̾¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ê¤·¤Ç¤Ï¡¢½ð̾¼Ô¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü¸Â(\fBYYYY\-MM\-DD\fR)¸å¤Þ¤¿¤Ï¾­Íè¤Î¼è¾ÃÆü¸å¡¢¥æ¡¼¥¶¡¼¤Ï¤³¤ÎJAR¥Õ¥¡¥¤¥ë¤ò¸¡¾Ú¤Ç¤­¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .SH "Îã" + .SS "JAR¥Õ¥¡¥¤¥ë¤Î½ð̾" + .PP +-¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢ÊÌ̾¤¬\fIworking\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fImystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤Ë¤¢¤ë\fIjane\fR¤Ç¤¢¤ë¥æ¡¼¥¶¡¼¤ÎÈëÌ©¸°¤Çbundle\&.jar¤Ë½ð̾¤·¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë\fIsbundle\&.jar\fR¤È¤¤¤¦Ì¾Á°¤òÉÕ¤±¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥­¡¼¥¹¥È¥¢ÊÌ̾¤¬\fBworking\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fBmystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤Ë¤¢¤ë\fBjane\fR¤Ç¤¢¤ë¥æ¡¼¥¶¡¼¤ÎÈëÌ©¸°¤Çbundle\&.jar¤Ë½ð̾¤·¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë\fBsbundle\&.jar\fR¤È¤¤¤¦Ì¾Á°¤òÉÕ¤±¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore /working/mystore +- \-storepass <keystore password> +- \-keypass <private key password> +- \-signedjar sbundle\&.jar bundle\&.jar jane ++\fBjarsigner \-keystore /working/mystore\fR ++\fB \-storepass <keystore password>\fR ++\fB \-keypass <private key password>\fR ++\fB \-signedjar sbundle\&.jar bundle\&.jar jane\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-Á°½Ò¤Î¥³¥Þ¥ó¥É¤Ç¤Ï\fI\-sigfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤ëÀ¸À®¤µ¤ì¤¿\fI\&.SF\fR¥Õ¥¡¥¤¥ë¤ª¤è¤Ó\fI\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ï¡¢ÊÌ̾¤Ë´ð¤Å¤¤¤¿¥Ç¥Õ¥©¥ë¥È¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢Ì¾Á°ÉÕ¤­¤Î\fIJANE\&.SF\fR¤ª¤è¤Ó\fIJANE\&.DSA\fR¤Ç¤¹¡£ ++Á°½Ò¤Î¥³¥Þ¥ó¥É¤Ç¤Ï\fB\-sigfile\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤µ¤ì¤ëÀ¸À®¤µ¤ì¤¿\fB\&.SF\fR¥Õ¥¡¥¤¥ë¤ª¤è¤Ó\fB\&.DSA\fR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ï¡¢ÊÌ̾¤Ë´ð¤Å¤¤¤¿¥Ç¥Õ¥©¥ë¥È¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢Ì¾Á°ÉÕ¤­¤Î\fBJANE\&.SF\fR¤ª¤è¤Ó\fBJANE\&.DSA\fR¤Ç¤¹¡£ + .PP + ¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ª¤è¤ÓÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤òµá¤á¤é¤ì¤ë¾ì¹ç¡¢Á°½Ò¤Î¥³¥Þ¥ó¥É¤òû½Ì¤·¤Æ¡¢¼¡¤Î¤³¤È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ + .sp +@@ -933,8 +953,9 @@ + .RS 4 + .\} + .nf +-jarsigner \-keystore /working/mystore +- \-signedjar sbundle\&.jar bundle\&.jar jane ++\fBjarsigner \-keystore /working/mystore\fR ++\fB \-signedjar sbundle\&.jar bundle\&.jar jane\fR ++ + .fi + .if n \{\ + .RE +@@ -946,19 +967,21 @@ + .RS 4 + .\} + .nf +-jarsigner \-signedjar sbundle\&.jar bundle\&.jar jane ++\fBjarsigner \-signedjar sbundle\&.jar bundle\&.jar jane\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-ÆþÎÏJAR¥Õ¥¡¥¤¥ë(bundle\&.jar)¤ò½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ç¾å½ñ¤­¤¹¤ë¾ì¹ç¡¢¼¡¤Î¤è¤¦¤Ë\fI\-signedjar\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ ++ÆþÎÏJAR¥Õ¥¡¥¤¥ë(bundle\&.jar)¤ò½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤Ç¾å½ñ¤­¤¹¤ë¾ì¹ç¡¢¼¡¤Î¤è¤¦¤Ë\fB\-signedjar\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner bundle\&.jar jane ++\fBjarsigner bundle\&.jar jane\fR ++ + .fi + .if n \{\ + .RE +@@ -971,66 +994,69 @@ + .RS 4 + .\} + .nf +-jarsigner \-verify sbundle\&.jar ++\fBjarsigner \-verify sbundle\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¸¡¾Ú¤¬À®¸ù¤¹¤ë¤È¡¢\fIjar verified\fR¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¢¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÜºÙ¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£\fIjarsigner\fR¤ò\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¥µ¥ó¥×¥ë¤ò¡¢¼¡¤Ë¼¨¤·¤Þ¤¹¡£ ++¸¡¾Ú¤¬À®¸ù¤¹¤ë¤È¡¢\fBjar verified\fR¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¢¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÜºÙ¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£\fBjarsigner\fR¤ò\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¥µ¥ó¥×¥ë¤ò¡¢¼¡¤Ë¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-verify \-verbose sbundle\&.jar ++\fBjarsigner \-verify \-verbose sbundle\&.jar\fR ++\fB \fR ++\fB 198 Fri Sep 26 16:14:06 PDT 1997 META\-INF/MANIFEST\&.MF\fR ++\fB 199 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.SF\fR ++\fB 1013 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.DSA\fR ++\fB smk 2752 Fri Sep 26 16:12:30 PDT 1997 AclEx\&.class\fR ++\fB smk 849 Fri Sep 26 16:12:46 PDT 1997 test\&.class\fR ++\fB \fR ++\fB s = signature was verified\fR ++\fB m = entry is listed in manifest\fR ++\fB k = at least one certificate was found in keystore\fR ++\fB \fR ++\fB jar verified\&.\fR + +- 198 Fri Sep 26 16:14:06 PDT 1997 META\-INF/MANIFEST\&.MF +- 199 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.SF +- 1013 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.DSA +- smk 2752 Fri Sep 26 16:12:30 PDT 1997 AclEx\&.class +- smk 849 Fri Sep 26 16:12:46 PDT 1997 test\&.class +- +- s = signature was verified +- m = entry is listed in manifest +- k = at least one certificate was found in keystore +- +- jar verified\&. + .fi + .if n \{\ + .RE + .\} + .SS "¾ÚÌÀ½ñ¾ðÊó¤ò»ÈÍѤ·¤¿¸¡¾Ú" + .PP +-\fI\-certs\fR¥ª¥×¥·¥ç¥ó¤ò\fI\-verify\fR¤ª¤è¤Ó\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊ󤬽ÐÎϤ˴ޤޤì¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ë¤Ï¡¢¾ÚÌÀ½ñ¥¿¥¤¥×¡¢½ð̾¼Ô¤Î¼±ÊÌ̾¾ðÊó(X\&.509¾ÚÌÀ½ñ¤Î¾ì¹ç)¤¬´Þ¤Þ¤ì¡¢´Ý¥«¥Ã¥³Æâ¤Ë¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î¸ø³«¸°¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤Î¸ø³«¸°¾ÚÌÀ½ñ¤Ë°ìÃפ¹¤ë¾ì¹ç¤Î½ð̾¼Ô¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB\-certs\fR¥ª¥×¥·¥ç¥ó¤ò\fB\-verify\fR¤ª¤è¤Ó\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ØÄꤷ¤¿¾ì¹ç¡¢JAR¥Õ¥¡¥¤¥ë¤Î³Æ½ð̾¼Ô¤Î¾ÚÌÀ½ñ¾ðÊ󤬽ÐÎϤ˴ޤޤì¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ë¤Ï¡¢¾ÚÌÀ½ñ¥¿¥¤¥×¡¢½ð̾¼Ô¤Î¼±ÊÌ̾¾ðÊó(X\&.509¾ÚÌÀ½ñ¤Î¾ì¹ç)¤¬´Þ¤Þ¤ì¡¢´Ý¥«¥Ã¥³Æâ¤Ë¤Ï¡¢JAR¥Õ¥¡¥¤¥ë¤Î¸ø³«¸°¾ÚÌÀ½ñ¤¬¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤Î¸ø³«¸°¾ÚÌÀ½ñ¤Ë°ìÃפ¹¤ë¾ì¹ç¤Î½ð̾¼Ô¤Î¥­¡¼¥¹¥È¥¢ÊÌ̾¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jarsigner \-keystore /working/mystore \-verify \-verbose \-certs myTest\&.jar ++\fBjarsigner \-keystore /working/mystore \-verify \-verbose \-certs myTest\&.jar\fR ++\fB \fR ++\fB 198 Fri Sep 26 16:14:06 PDT 1997 META\-INF/MANIFEST\&.MF\fR ++\fB 199 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.SF\fR ++\fB 1013 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.DSA\fR ++\fB 208 Fri Sep 26 16:23:30 PDT 1997 META\-INF/JAVATEST\&.SF\fR ++\fB 1087 Fri Sep 26 16:23:30 PDT 1997 META\-INF/JAVATEST\&.DSA\fR ++\fB smk 2752 Fri Sep 26 16:12:30 PDT 1997 Tst\&.class\fR ++\fB \fR ++\fB X\&.509, CN=Test Group, OU=Java Software, O=Oracle, L=CUP, S=CA, C=US (javatest)\fR ++\fB X\&.509, CN=Jane Smith, OU=Java Software, O=Oracle, L=cup, S=ca, C=us (jane)\fR ++\fB \fR ++\fB s = signature was verified\fR ++\fB m = entry is listed in manifest\fR ++\fB k = at least one certificate was found in keystore\fR ++\fB \fR ++\fB jar verified\&.\fR + +- 198 Fri Sep 26 16:14:06 PDT 1997 META\-INF/MANIFEST\&.MF +- 199 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.SF +- 1013 Fri Sep 26 16:22:10 PDT 1997 META\-INF/JANE\&.DSA +- 208 Fri Sep 26 16:23:30 PDT 1997 META\-INF/JAVATEST\&.SF +- 1087 Fri Sep 26 16:23:30 PDT 1997 META\-INF/JAVATEST\&.DSA +- smk 2752 Fri Sep 26 16:12:30 PDT 1997 Tst\&.class +- +- X\&.509, CN=Test Group, OU=Java Software, O=Oracle, L=CUP, S=CA, C=US (javatest) +- X\&.509, CN=Jane Smith, OU=Java Software, O=Oracle, L=cup, S=ca, C=us (jane) +- +- s = signature was verified +- m = entry is listed in manifest +- k = at least one certificate was found in keystore +- +- jar verified\&. + .fi + .if n \{\ + .RE + .\} + .PP +-½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤¬X\&.509¾ÚÌÀ½ñ¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢¼±ÊÌ̾¾ðÊó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£¤½¤Î¾ì¹ç¤Ë¤Ï¡¢¾ÚÌÀ½ñ¤Î¥¿¥¤¥×¤ÈÊÌ̾¤Î¤ß¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬PGP¾ÚÌÀ½ñ¤Ç¡¢ÊÌ̾¤¬\fIbob\fR¤Ç¤¢¤ë¾ì¹ç¡¢\fIPGP, (bob)\fR¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤¬X\&.509¾ÚÌÀ½ñ¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢¼±ÊÌ̾¾ðÊó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£¤½¤Î¾ì¹ç¤Ë¤Ï¡¢¾ÚÌÀ½ñ¤Î¥¿¥¤¥×¤ÈÊÌ̾¤Î¤ß¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬PGP¾ÚÌÀ½ñ¤Ç¡¢ÊÌ̾¤¬\fBbob\fR¤Ç¤¢¤ë¾ì¹ç¡¢\fBPGP, (bob)\fR¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/solaris/doc/sun/man/man1/ja/java.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/java.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: java +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,8 +21,16 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 +-.TH "java" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" ++.\" Title: java ++.\" Language: Japanese ++.\" Date: 2014ǯ8·î8Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 ++.TH "java" "1" "2014ǯ8·î8Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff + .\" ----------------------------------------------------------------- +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + java \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjava\fR [\fIoptions\fR] \fIclassname\fR [\fIargs\fR] ++\fBjava\fR [\fIoptions\fR] \fIclassname\fR [\fIargs\fR] + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjava\fR [\fIoptions\fR] \fI\-jar\fR \fIfilename\fR [\fIargs\fR] ++\fBjava\fR [\fIoptions\fR] \fB\-jar\fR \fIfilename\fR [\fIargs\fR] + .fi + .if n \{\ + .RE +@@ -74,7 +76,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclassname\fR +@@ -84,37 +86,38 @@ + .PP + \fIfilename\fR + .RS 4 +-¸Æ¤Ó½Ð¤µ¤ì¤ëJava¥¢¡¼¥«¥¤¥Ö(JAR)¥Õ¥¡¥¤¥ë¤Î̾Á°¡£\fI\-jar\fR¥ª¥×¥·¥ç¥ó¤È°ì½ï¤Ë¤Î¤ß»ÈÍѤ·¤Þ¤¹¡£ ++¸Æ¤Ó½Ð¤µ¤ì¤ëJava¥¢¡¼¥«¥¤¥Ö(JAR)¥Õ¥¡¥¤¥ë¤Î̾Á°¡£\fB\-jar\fR¥ª¥×¥·¥ç¥ó¤È°ì½ï¤Ë¤Î¤ß»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \fIargs\fR + .RS 4 +-¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿\fImain()\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¡£ ++¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿\fBmain()\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjava\fR¥³¥Þ¥ó¥É¤ÏJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò³«»Ï¤·¤Þ¤¹¡£Java Runtime Environment (JRE)¤òµ¯Æ°¤·¤¿¸å¡¢»ØÄꤷ¤¿¥¯¥é¥¹¤ò¥í¡¼¥É¤·¡¢¤½¤Î¥¯¥é¥¹¤Î\fImain()\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤ê¡¢¤³¤ì¤ò¹Ô¤¤¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ï¡¢\fIpublic\fR¤ª¤è¤Ó\fIstatic\fR¤È¤·¤ÆÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢ÃͤÏÊÖ¤»¤Þ¤»¤ó¡£¤µ¤é¤Ë¡¢\fIString\fRÇÛÎó¤ò¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ»ØÄê¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥á¥½¥Ã¥ÉÀë¸À¤Ï¼¡¤Î·Á¼°¤ò´Þ¤ß¤Þ¤¹¡£ ++\fBjava\fR¥³¥Þ¥ó¥É¤ÏJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò³«»Ï¤·¤Þ¤¹¡£Java Runtime Environment (JRE)¤òµ¯Æ°¤·¤¿¸å¡¢»ØÄꤷ¤¿¥¯¥é¥¹¤ò¥í¡¼¥É¤·¡¢¤½¤Î¥¯¥é¥¹¤Î\fBmain()\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤ê¡¢¤³¤ì¤ò¹Ô¤¤¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ï¡¢\fIpublic\fR¤ª¤è¤Ó\fIstatic\fR¤È¤·¤ÆÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢ÃͤÏÊÖ¤»¤Þ¤»¤ó¡£¤µ¤é¤Ë¡¢\fBString\fRÇÛÎó¤ò¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ»ØÄê¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥á¥½¥Ã¥ÉÀë¸À¤Ï¼¡¤Î·Á¼°¤ò´Þ¤ß¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public static void main(String[] args) ++\fBpublic static void main(String[] args)\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fImain()\fR¥á¥½¥Ã¥É¤¬¤¢¤ë¤«\fIjavafx\&.application\&.Application\fR¤ò³ÈÄ¥¤¹¤ë¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¤³¤È¤Ç¡¢JavaFX¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òµ¯Æ°¤Ç¤­¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¡¢µ¯Æ°¥Ä¡¼¥ë¤Ï\fIApplication\fR¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¹½À®¤·¡¢¤½¤Î\fIinit()\fR¥á¥½¥Ã¥É¤ò¥³¡¼¥ë¤·¡¢\fIstart(javafx\&.stage\&.Stage)\fR¥á¥½¥Ã¥É¤ò¥³¡¼¥ë¤·¤Þ¤¹¡£ ++\fBjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fBmain()\fR¥á¥½¥Ã¥É¤¬¤¢¤ë¤«\fBjavafx\&.application\&.Application\fR¤ò³ÈÄ¥¤¹¤ë¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¤³¤È¤Ç¡¢JavaFX¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òµ¯Æ°¤Ç¤­¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¡¢µ¯Æ°¥Ä¡¼¥ë¤Ï\fBApplication\fR¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¹½À®¤·¡¢¤½¤Î\fBinit()\fR¥á¥½¥Ã¥É¤ò¥³¡¼¥ë¤·¡¢\fBstart(javafx\&.stage\&.Stage)\fR¥á¥½¥Ã¥É¤ò¥³¡¼¥ë¤·¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjava\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¤Ê¤¤ºÇ½é¤Î°ú¿ô¤Ï¡¢¸Æ¤Ó½Ð¤µ¤ì¤ë¥¯¥é¥¹¤Î´°Á´½¤¾þ̾¤Ç¤¹¡£\fI\-jar\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î°ú¿ô¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤àJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£µ¯Æ°¥¯¥é¥¹¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î\fIMain\-Class\fR¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Ø¥Ã¥À¡¼¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjava\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¤Ê¤¤ºÇ½é¤Î°ú¿ô¤Ï¡¢¸Æ¤Ó½Ð¤µ¤ì¤ë¥¯¥é¥¹¤Î´°Á´½¤¾þ̾¤Ç¤¹¡£\fB\-jar\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î°ú¿ô¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤àJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£µ¯Æ°¥¯¥é¥¹¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î\fBMain\-Class\fR¥Þ¥Ë¥Õ¥§¥¹¥È¡¦¥Ø¥Ã¥À¡¼¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP + JRE¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¡¢¥¤¥ó¥¹¥È¡¼¥ëºÑ³ÈÄ¥µ¡Ç½¤ª¤è¤Ó¥æ¡¼¥¶¡¼¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Î3²Õ½ê¤«¤é¡¢µ¯Æ°¥¯¥é¥¹(¤ª¤è¤Ó¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¾¤Î¥¯¥é¥¹)¤ò¸¡º÷¤·¤Þ¤¹¡£ + .PP +-¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤Î¸å¤Î°ú¿ô¤Ï¡¢\fImain()\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤Î¸å¤Î°ú¿ô¤Ï¡¢\fBmain()\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjava\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥«¥Æ¥´¥ê¤ËʬÎà¤Ç¤­¤ë¹­ÈϤʥª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++\fBjava\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥«¥Æ¥´¥ê¤ËʬÎà¤Ç¤­¤ë¹­ÈϤʥª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -184,15 +187,15 @@ + .PP + ɸ½à¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java Virtual Machine (JVM)¤Î¤¹¤Ù¤Æ¤Î¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤¹¤ë¤³¤È¤¬Êݾڤµ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢JRE¤Î¥Ð¡¼¥¸¥ç¥ó¤Î³Îǧ¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎÀßÄê¡¢¾éĹ¤Ê½ÐÎϤÎÍ­¸ú²½¤Ê¤É¤Î°ìÈÌŪ¤Ê¥¢¥¯¥·¥ç¥ó¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ + .PP +-ɸ½à°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java HotSpot²¾ÁÛ¥Þ¥·¥ó¤Ë¸ÇÍ­¤ÎÈÆÍÑ¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ë¤¿¤á¡¢¤¹¤Ù¤Æ¤ÎJVM¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ÏÊݾڤµ¤ì¤º¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-X\fR¤Ç³«»Ï¤·¤Þ¤¹¡£ ++ɸ½à°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java HotSpot²¾ÁÛ¥Þ¥·¥ó¤Ë¸ÇÍ­¤ÎÈÆÍÑ¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ë¤¿¤á¡¢¤¹¤Ù¤Æ¤ÎJVM¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ÏÊݾڤµ¤ì¤º¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-X\fR¤Ç³«»Ï¤·¤Þ¤¹¡£ + .PP +-³ÈÄ¥¥ª¥×¥·¥ç¥ó¤Ï¡¢ÉÔÍѰդ˻ÈÍѤ·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢ÆÃÄê¤Î¥·¥¹¥Æ¥àÍ×·ï¤ò»ý¤Ä¤³¤È¤¬Â¿¤¯¡¢¥·¥¹¥Æ¥à¹½À®¥Ñ¥é¥á¡¼¥¿¤Ø¤ÎÆø¢¥¢¥¯¥»¥¹¤¬É¬Íפʾì¹ç¤¬¤¢¤ëJava HotSpot²¾ÁÛ¥Þ¥·¥óÁàºî¤ÎÆÃÄê¤ÎÎΰè¤òÄ´À°¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë³«È¯¼Ô¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£¤³¤ì¤é¤Ï¡¢¤¹¤Ù¤Æ¤ÎJVM¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ÏÊݾڤµ¤ì¤º¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£³ÈÄ¥¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX\fR¤Ç»Ï¤Þ¤ê¤Þ¤¹¡£ ++³ÈÄ¥¥ª¥×¥·¥ç¥ó¤Ï¡¢ÉÔÍѰդ˻ÈÍѤ·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢ÆÃÄê¤Î¥·¥¹¥Æ¥àÍ×·ï¤ò»ý¤Ä¤³¤È¤¬Â¿¤¯¡¢¥·¥¹¥Æ¥à¹½À®¥Ñ¥é¥á¡¼¥¿¤Ø¤ÎÆø¢¥¢¥¯¥»¥¹¤¬É¬Íפʾì¹ç¤¬¤¢¤ëJava HotSpot²¾ÁÛ¥Þ¥·¥óÁàºî¤ÎÆÃÄê¤ÎÎΰè¤òÄ´À°¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë³«È¯¼Ô¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£¤³¤ì¤é¤Ï¡¢¤¹¤Ù¤Æ¤ÎJVM¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ÏÊݾڤµ¤ì¤º¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£³ÈÄ¥¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX\fR¤Ç»Ï¤Þ¤ê¤Þ¤¹¡£ + .PP + ºÇ¿·¥ê¥ê¡¼¥¹¤ÇÈó¿ä¾©¤Þ¤¿¤Ïºï½ü¤µ¤ì¤ë¥ª¥×¥·¥ç¥ó¤òÄÉÀפ¹¤ë¤¿¤á¤Ë¡¢¥É¥­¥å¥á¥ó¥È¤ÎºÇ¸å¤ËÈó¿ä¾©¤Çºï½ü¤µ¤ì¤¿¥ª¥×¥·¥ç¥ó¤È¤¤¤¦Ì¾Á°¤Î¥»¥¯¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¥Ö¡¼¥ë¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëµ¡Ç½¤òÍ­¸ú¤Ë¤·¤¿¤ê¡¢¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëµ¡Ç½¤ò̵¸ú¤Ë¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤òɬÍפȤ·¤Þ¤»¤ó¡£¥Ö¡¼¥ëÃÍ\fI\-XX\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥×¥é¥¹µ­¹æ(\fI\-XX:+\fR\fIOptionName\fR)¤ò»ÈÍѤ·¤ÆÍ­¸ú¤Ë¤·¡¢¥Þ¥¤¥Ê¥¹µ­¹æ(\fI\-XX:\-\fR\fIOptionName\fR)¤ò»ÈÍѤ·¤Æ̵¸ú¤Ë¤·¤Þ¤¹¡£ ++¥Ö¡¼¥ë¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëµ¡Ç½¤òÍ­¸ú¤Ë¤·¤¿¤ê¡¢¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëµ¡Ç½¤ò̵¸ú¤Ë¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤òɬÍפȤ·¤Þ¤»¤ó¡£¥Ö¡¼¥ëÃÍ\fB\-XX\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥×¥é¥¹µ­¹æ(\fB\-XX:+\fR\fIOptionName\fR)¤ò»ÈÍѤ·¤ÆÍ­¸ú¤Ë¤·¡¢¥Þ¥¤¥Ê¥¹µ­¹æ(\fB\-XX:\-\fR\fIOptionName\fR)¤ò»ÈÍѤ·¤Æ̵¸ú¤Ë¤·¤Þ¤¹¡£ + .PP +-°ú¿ô¤¬É¬Íפʥª¥×¥·¥ç¥ó¤Î¾ì¹ç¡¢°ú¿ô¤Ï¡¢¥ª¥×¥·¥ç¥ó̾¤ò¶õÇò¡¢¥³¥í¥ó(:)¤Þ¤¿¤ÏÅù¹æ(=)¤Ç¶èÀڤ俤â¤Î¤Ë¤Ê¤ë¤«¡¢¤¢¤ë¤¤¤Ï°ú¿ô¤¬¥ª¥×¥·¥ç¥ó¤Î¸å¤ËľÀܳ¤¯¾ì¹ç¤â¤¢¤ê¤Þ¤¹(Àµ³Î¤Ê¹½Ê¸¤Ï³Æ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹)¡£¥µ¥¤¥º¤ò¥Ð¥¤¥Èñ°Ì¤Ç»ØÄꤹ¤ë¤è¤¦µá¤á¤é¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ÀÜÈø¼­¤ò»ÈÍѤ·¤Ê¤¤¤«¡¢¤¢¤ë¤¤¤Ï¥­¥í¥Ð¥¤¥È(KB)¤Ë¤ÏÀÜÈø¼­\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È(MB)¤Ë¤ÏÀÜÈø¼­\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È(GB)¤Ë¤ÏÀÜÈø¼­\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥µ¥¤¥º¤ò8GB¤ËÀßÄꤹ¤ë¤Ë¤Ï¡¢\fI8g\fR¡¢\fI8192m\fR¡¢\fI8388608k\fR¤Þ¤¿¤Ï\fI8589934592\fR¤Î¤¤¤º¤ì¤«¤ò°ú¿ô¤È¤·¤Æ»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ñ¡¼¥»¥ó¥È¤Î»ØÄ꤬ɬÍפʾì¹ç¤Ï¡¢0¤«¤é1¤Î¿ôÃͤò»ÈÍѤ·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢25%¤Î¾ì¹ç¤Ï\fI0\&.25\fR¤ò»ØÄꤷ¤Þ¤¹)¡£ ++°ú¿ô¤¬É¬Íפʥª¥×¥·¥ç¥ó¤Î¾ì¹ç¡¢°ú¿ô¤Ï¡¢¥ª¥×¥·¥ç¥ó̾¤ò¶õÇò¡¢¥³¥í¥ó(:)¤Þ¤¿¤ÏÅù¹æ(=)¤Ç¶èÀڤ俤â¤Î¤Ë¤Ê¤ë¤«¡¢¤¢¤ë¤¤¤Ï°ú¿ô¤¬¥ª¥×¥·¥ç¥ó¤Î¸å¤ËľÀܳ¤¯¾ì¹ç¤â¤¢¤ê¤Þ¤¹(Àµ³Î¤Ê¹½Ê¸¤Ï³Æ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹)¡£¥µ¥¤¥º¤ò¥Ð¥¤¥Èñ°Ì¤Ç»ØÄꤹ¤ë¤è¤¦µá¤á¤é¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ÀÜÈø¼­¤ò»ÈÍѤ·¤Ê¤¤¤«¡¢¤¢¤ë¤¤¤Ï¥­¥í¥Ð¥¤¥È(KB)¤Ë¤ÏÀÜÈø¼­\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È(MB)¤Ë¤ÏÀÜÈø¼­\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È(GB)¤Ë¤ÏÀÜÈø¼­\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥µ¥¤¥º¤ò8GB¤ËÀßÄꤹ¤ë¤Ë¤Ï¡¢\fB8g\fR¡¢\fB8192m\fR¡¢\fB8388608k\fR¤Þ¤¿¤Ï\fB8589934592\fR¤Î¤¤¤º¤ì¤«¤ò°ú¿ô¤È¤·¤Æ»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ñ¡¼¥»¥ó¥È¤Î»ØÄ꤬ɬÍפʾì¹ç¤Ï¡¢0¤«¤é1¤Î¿ôÃͤò»ÈÍѤ·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢25%¤Î¾ì¹ç¤Ï\fB0\&.25\fR¤ò»ØÄꤷ¤Þ¤¹)¡£ + .SS "ɸ½à¥ª¥×¥·¥ç¥ó" + .PP + ¤³¤ì¤é¤Ï¡¢JVM¤Î¤¹¤Ù¤Æ¤Î¼ÂÁõ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëºÇ¤â°ìÈÌŪ¤Ë»ÈÍѤµ¤ì¤ë¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£ +@@ -201,7 +204,7 @@ + .RS 4 + »ØÄꤷ¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥¨¡¼¥¸¥§¥ó¥È¡¦¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¥é¥¤¥Ö¥é¥ê̾¤Î¸å¤Ë¡¢¥é¥¤¥Ö¥é¥ê¤Ë¸ÇÍ­¤Î¥ª¥×¥·¥ç¥ó¤Î¥«¥ó¥Þ¶èÀÚ¤ê¥ê¥¹¥È¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .sp +-¥ª¥×¥·¥ç¥ó\fI\-agentlib:foo\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢JVM¤Ï¡¢\fILD_LIBRARY_PATH\fR¥·¥¹¥Æ¥àÊÑ¿ô(OS X¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ï\fIDYLD_LIBRARY_PATH\fR¤Ë¤Ê¤ê¤Þ¤¹)¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Ë\fIlibfoo\&.so\fR¤È¤¤¤¦Ì¾Á°¤Î¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤è¤¦¤È¤·¤Þ¤¹¡£ ++¥ª¥×¥·¥ç¥ó\fB\-agentlib:foo\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢JVM¤Ï¡¢\fBLD_LIBRARY_PATH\fR¥·¥¹¥Æ¥àÊÑ¿ô(OS X¤Ç¤Ï¡¢¤³¤ÎÊÑ¿ô¤Ï\fBDYLD_LIBRARY_PATH\fR¤Ë¤Ê¤ê¤Þ¤¹)¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Ë\fBlibfoo\&.so\fR¤È¤¤¤¦Ì¾Á°¤Î¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤è¤¦¤È¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢¥¹¥¿¥Ã¥¯¤Î¿¼¤µ3¤Ç¡¢20¥ß¥êÉ䴤Ȥ˥ҡ¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥Ä¡¼¥ë(HPROF)¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Æ¡¢¥µ¥ó¥×¥ë¤ÎCPU¾ðÊó¤ò¼èÆÀ¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -209,7 +212,8 @@ + .RS 4 + .\} + .nf +-\-agentlib:hprof=cpu=samples,interval=20,depth=3 ++\fB\-agentlib:hprof=cpu=samples,interval=20,depth=3\fR ++ + .fi + .if n \{\ + .RE +@@ -220,7 +224,8 @@ + .RS 4 + .\} + .nf +-\-agentlib:jdwp=transport=dt_socket,server=y,address=8000 ++\fB\-agentlib:jdwp=transport=dt_socket,server=y,address=8000\fR ++ + .fi + .if n \{\ + .RE +@@ -235,7 +240,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html¤Ë¤¢¤ë\fIjava\&.lang\&.instrument\fR¥Ñ¥Ã¥±¡¼¥¸¤ÎÀâÌÀ ++http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html¤Ë¤¢¤ë\fBjava\&.lang\&.instrument\fR¥Ñ¥Ã¥±¡¼¥¸¤ÎÀâÌÀ + .RE + .sp + .RS 4 +@@ -246,13 +251,13 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting¤Ë¤¢¤ëJVM¥Ä¡¼¥ë¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥¬¥¤¥É¤Î¥¨¡¼¥¸¥§¥ó¥È¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Ë´Ø¤¹¤ë¹à ++http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting¤Ë¤¢¤ëJVM¥Ä¡¼¥ë¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥¬¥¤¥É¤Î¥¨¡¼¥¸¥§¥ó¥È¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Ë´Ø¤¹¤ë¹à + .RE + .RE + .PP + \-agentpath:\fIpathname\fR[=\fIoptions\fR] + .RS 4 +-ÀäÂХѥ¹Ì¾¤Ç»ØÄꤵ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥¨¡¼¥¸¥§¥ó¥È¡¦¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-agentlib\fR¤ÈƱÅù¤Ç¤¹¤¬¡¢¥é¥¤¥Ö¥é¥ê¤Î¥Õ¥ë¡¦¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤ò»ÈÍѤ·¤Þ¤¹¡£ ++ÀäÂХѥ¹Ì¾¤Ç»ØÄꤵ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥¨¡¼¥¸¥§¥ó¥È¡¦¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-agentlib\fR¤ÈƱÅù¤Ç¤¹¤¬¡¢¥é¥¤¥Ö¥é¥ê¤Î¥Õ¥ë¡¦¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-client +@@ -266,7 +271,7 @@ + \-D\fIproperty\fR=\fIvalue\fR + .RS 4 + ¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÀßÄꤷ¤Þ¤¹¡£\fIproperty\fRÊÑ¿ô¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¤Î̾Á°¤òɽ¤¹¡¢¶õÇò¤Î¤Ê¤¤Ê¸»úÎó¤Ç¤¹¡£\fIvalue\fRÊÑ¿ô¤Ï¡¢¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòɽ¤¹Ê¸»úÎó¤Ç¤¹¡£\fIvalue\fR¤¬¶õÇò¤ò´Þ¤àʸ»úÎó¤Î¾ì¹ç¡¢¤½¤ì¤ò°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹(Îã: +-\fI\-Dfoo="foo bar"\fR)¡£ ++\fB\-Dfoo="foo bar"\fR)¡£ + .RE + .PP + \-d32 +@@ -278,79 +283,91 @@ + .RS 4 + ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò64¥Ó¥Ã¥È´Ä¶­¤Ç¼Â¹Ô¤·¤Þ¤¹¡£64¥Ó¥Ã¥È´Ä¶­¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥¨¥é¡¼¤¬Êó¹ð¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢64¥Ó¥Ã¥È¡¦¥·¥¹¥Æ¥à¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¤ò½ü¤­¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï32¥Ó¥Ã¥È´Ä¶­¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ + .sp +-¸½ºß¤Î¤È¤³¤í¡¢Java HotSpot Server VM¤Î¤ß¤¬64¥Ó¥Ã¥È¤ÎÁàºî¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤¿¤á¡¢\fI\-d64\fR»ÈÍÑ»þ¤Ë¤Ï\fI\-server\fR¥ª¥×¥·¥ç¥ó¤¬°ÅÌÛŪ¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£\fI\-d64\fR»ÈÍÑ»þ¤Ë¤Ï¡¢\fI\-client\fR¥ª¥×¥·¥ç¥ó¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤³¤Î»ÅÍͤϡ¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÊѹ¹¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++¸½ºß¤Î¤È¤³¤í¡¢Java HotSpot Server VM¤Î¤ß¤¬64¥Ó¥Ã¥È¤ÎÁàºî¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤¿¤á¡¢\fB\-d64\fR»ÈÍÑ»þ¤Ë¤Ï\fB\-server\fR¥ª¥×¥·¥ç¥ó¤¬°ÅÌÛŪ¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£\fB\-d64\fR»ÈÍÑ»þ¤Ë¤Ï¡¢\fB\-client\fR¥ª¥×¥·¥ç¥ó¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤³¤Î»ÅÍͤϡ¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÊѹ¹¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\-disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], \-da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++\-disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.br ++\-da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] + .RS 4 + ¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¢¥µ¡¼¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ + .sp +-°ú¿ô¤Ê¤·¤Î\fI\-disableassertions\fR +-(\fI\-da\fR)¤ò»ØÄꤹ¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\&.\&.\&.\fR¤Ç½ª¤ï¤ë\fIpackagename\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£°ú¿ô¤È¤·¤Æ\fI\&.\&.\&.\fR¤Î¤ß¤ò»ØÄꤹ¤ë¤È¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë̾Á°¤Î¤Ê¤¤¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIclassname\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢ÀÚÂؤ¨¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++°ú¿ô¤Ê¤·¤Î\fB\-disableassertions\fR ++(\fB\-da\fR)¤ò»ØÄꤹ¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\&.\&.\&.\fR¤Ç½ª¤ï¤ë\fIpackagename\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£°ú¿ô¤È¤·¤Æ\fB\&.\&.\&.\fR¤Î¤ß¤ò»ØÄꤹ¤ë¤È¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë̾Á°¤Î¤Ê¤¤¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIclassname\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢ÀÚÂؤ¨¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-\fI\-disableassertions\fR +-(\fI\-da\fR)¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤¹(¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ë¤Ï¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î¥ë¡¼¥ë¤Ë¤Ï1¤ÄÎã³°¤¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò´Êñ¤Ë̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fI\-disablesystemassertions\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fB\-disableassertions\fR ++(\fB\-da\fR)¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤¹(¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ë¤Ï¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î¥ë¡¼¥ë¤Ë¤Ï1¤ÄÎã³°¤¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò´Êñ¤Ë̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fB\-disablesystemassertions\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-ÆÃÄê¤Î¥Ñ¥Ã¥±¡¼¥¸¤ä¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÌÀ¼¨Åª¤ËÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-enableassertions\fR +-(\fI\-ea\fR)¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Î¾Êý¤Î¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ñ¥Ã¥±¡¼¥¸\fIcom\&.wombat\&.fruitbat\fR +-(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥¯¥é¥¹\fIcom\&.wombat\&.fruitbat\&.Brickbat\fR¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Æ¡¢\fIMyClass\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++ÆÃÄê¤Î¥Ñ¥Ã¥±¡¼¥¸¤ä¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÌÀ¼¨Åª¤ËÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-enableassertions\fR ++(\fB\-ea\fR)¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Î¾Êý¤Î¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ñ¥Ã¥±¡¼¥¸\fBcom\&.wombat\&.fruitbat\fR ++(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥¯¥é¥¹\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Æ¡¢\fBMyClass\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-disablesystemassertions, \-dsa ++\-disablesystemassertions ++.br ++\-dsa + .RS 4 + ¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .PP +-\-enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], \-ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++\-enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.br ++\-ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] + .RS 4 + ¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¢¥µ¡¼¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ + .sp +-°ú¿ô¤Ê¤·¤Î\fI\-enableassertions\fR +-(\fI\-ea\fR)¤ò»ØÄꤹ¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\&.\&.\&.\fR¤Ç½ª¤ï¤ë\fIpackagename\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£°ú¿ô¤È¤·¤Æ\fI\&.\&.\&.\fR¤Î¤ß¤ò»ØÄꤹ¤ë¤È¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë̾Á°¤Î¤Ê¤¤¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIclassname\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢ÀÚÂؤ¨¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++°ú¿ô¤Ê¤·¤Î\fB\-enableassertions\fR ++(\fB\-ea\fR)¤ò»ØÄꤹ¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\&.\&.\&.\fR¤Ç½ª¤ï¤ë\fIpackagename\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£°ú¿ô¤È¤·¤Æ\fB\&.\&.\&.\fR¤Î¤ß¤ò»ØÄꤹ¤ë¤È¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë̾Á°¤Î¤Ê¤¤¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIclassname\fR°ú¿ô¤ò»ØÄꤹ¤ë¤È¡¢ÀÚÂؤ¨¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-\fI\-enableassertions\fR +-(\fI\-ea\fR)¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤¹(¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ë¤Ï¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î¥ë¡¼¥ë¤Ë¤Ï1¤ÄÎã³°¤¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò´Êñ¤ËÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fI\-enablesystemassertions\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ëÊ̤Υ¹¥¤¥Ã¥Á¤òÄ󶡤·¤Þ¤¹¡£ ++\fB\-enableassertions\fR ++(\fB\-ea\fR)¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ª¤è¤Ó¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤¹(¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ë¤Ï¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î¥ë¡¼¥ë¤Ë¤Ï1¤ÄÎã³°¤¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ËŬÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤ò´Êñ¤ËÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fB\-enablesystemassertions\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ëÊ̤Υ¹¥¤¥Ã¥Á¤òÄ󶡤·¤Þ¤¹¡£ + .sp +-ÆÃÄê¤Î¥Ñ¥Ã¥±¡¼¥¸¤ä¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÌÀ¼¨Åª¤Ë̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-disableassertions\fR +-(\fI\-da\fR)¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Ã±°ì¥³¥Þ¥ó¥É¤Ë¤³¤ì¤é¤Î¥¹¥¤¥Ã¥Á¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÊ£¿ô»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢»ØÄꤷ¤¿¥¹¥¤¥Ã¥Á¤¬½çÈ֤˽èÍý¤µ¤ì¤Æ¤«¤é¥¯¥é¥¹¤¬¥í¡¼¥É¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ñ¥Ã¥±¡¼¥¸\fIcom\&.wombat\&.fruitbat\fR +-(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¤Î¤ß¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥¯¥é¥¹\fIcom\&.wombat\&.fruitbat\&.Brickbat\fR¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Æ¡¢\fIMyClass\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++ÆÃÄê¤Î¥Ñ¥Ã¥±¡¼¥¸¤ä¥¯¥é¥¹¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÌÀ¼¨Åª¤Ë̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-disableassertions\fR ++(\fB\-da\fR)¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Ã±°ì¥³¥Þ¥ó¥É¤Ë¤³¤ì¤é¤Î¥¹¥¤¥Ã¥Á¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÊ£¿ô»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢»ØÄꤷ¤¿¥¹¥¤¥Ã¥Á¤¬½çÈ֤˽èÍý¤µ¤ì¤Æ¤«¤é¥¯¥é¥¹¤¬¥í¡¼¥É¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ñ¥Ã¥±¡¼¥¸\fBcom\&.wombat\&.fruitbat\fR ++(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¤Î¤ß¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥¯¥é¥¹\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR¤Ç¤Ï¥¢¥µ¡¼¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Æ¡¢\fBMyClass\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-enablesystemassertions, \-esa ++\-enablesystemassertions ++.br ++\-esa + .RS 4 + ¤¹¤Ù¤Æ¤Î¥·¥¹¥Æ¥à¡¦¥¯¥é¥¹Æâ¤Ç¥¢¥µ¡¼¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .PP +-\-help, \-? ++\-help ++.br ++\-? + .RS 4 +-¼ÂºÝ¤ËJVM¤ò¼Â¹Ô¤»¤º¤Ë¡¢\fIjava\fR¥³¥Þ¥ó¥É¤Î»ÈÍѾõ¶·¾ðÊó¤òɽ¼¨¤·¤Þ¤¹¡£ ++¼ÂºÝ¤ËJVM¤ò¼Â¹Ô¤»¤º¤Ë¡¢\fBjava\fR¥³¥Þ¥ó¥É¤Î»ÈÍѾõ¶·¾ðÊó¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-jar \fIfilename\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤Ë¥«¥×¥»¥ë²½¤µ¤ì¤¿¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fIfilename\fR°ú¿ô¤Ï¡¢»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î³«»ÏÅÀ¤È¤·¤Æµ¡Ç½¤¹¤ë\fIpublic static void main(String[] args)\fR¥á¥½¥Ã¥É¤òÄêµÁ¤¹¤ë¡¢\fIMain\-Class:\fR\fIclassname\fR¤È¤¤¤¦·Á¼°¤Î1¹Ô¤ò´Þ¤à¥Þ¥Ë¥Õ¥§¥¹¥È¤ò»ý¤ÄJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ç¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤Ë¥«¥×¥»¥ë²½¤µ¤ì¤¿¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fIfilename\fR°ú¿ô¤Ï¡¢»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î³«»ÏÅÀ¤È¤·¤Æµ¡Ç½¤¹¤ë\fBpublic static void main(String[] args)\fR¥á¥½¥Ã¥É¤òÄêµÁ¤¹¤ë¡¢\fBMain\-Class:\fR\fIclassname\fR¤È¤¤¤¦·Á¼°¤Î1¹Ô¤ò´Þ¤à¥Þ¥Ë¥Õ¥§¥¹¥È¤ò»ý¤ÄJAR¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ç¤¹¡£ + .sp +-\fI\-jar\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢»ØÄꤷ¤¿JAR¥Õ¥¡¥¤¥ë¤¬¤¹¤Ù¤Æ¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤Î¥½¡¼¥¹¤Ë¤Ê¤ê¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¾¤ÎÀßÄê¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£ ++\fB\-jar\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢»ØÄꤷ¤¿JAR¥Õ¥¡¥¤¥ë¤¬¤¹¤Ù¤Æ¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤Î¥½¡¼¥¹¤Ë¤Ê¤ê¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¾¤ÎÀßÄê¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£ + .sp + JAR¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢¼¡¤Î¥ê¥½¡¼¥¹¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +@@ -391,7 +408,7 @@ + .PP + \-javaagent:\fIjarpath\fR[=\fIoptions\fR] + .RS 4 +-»ØÄꤷ¤¿Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¥¨¡¼¥¸¥§¥ó¥È¤ò¥í¡¼¥É¤·¤Þ¤¹¡£Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥È¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html¤Ë¤¢¤ëJava API¥É¥­¥å¥á¥ó¥È¤Î\fIjava\&.lang\&.instrument\fR¥Ñ¥Ã¥±¡¼¥¸¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++»ØÄꤷ¤¿Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¥¨¡¼¥¸¥§¥ó¥È¤ò¥í¡¼¥É¤·¤Þ¤¹¡£Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥È¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html¤Ë¤¢¤ëJava API¥É¥­¥å¥á¥ó¥È¤Î\fBjava\&.lang\&.instrument\fR¥Ñ¥Ã¥±¡¼¥¸¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-jre\-restrict\-search +@@ -414,18 +431,19 @@ + .PP + \-showversion + .RS 4 +-¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤ò³¹Ô¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-version\fR¥ª¥×¥·¥ç¥ó¤ÈƱÅù¤Ç¤¹¤¬¡¢\-version¤Ï¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨¸å¤ËJVM¤Ë½ªÎ»¤ò»Ø¼¨¤¹¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ ++¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤ò³¹Ô¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-version\fR¥ª¥×¥·¥ç¥ó¤ÈƱÅù¤Ç¤¹¤¬¡¢\-version¤Ï¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨¸å¤ËJVM¤Ë½ªÎ»¤ò»Ø¼¨¤¹¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-splash:\fIimgname\fR + .RS 4 +-\fIimgname\fR¤Ç»ØÄꤵ¤ì¤¿¥¤¥á¡¼¥¸¤ò´Þ¤à¥¹¥×¥é¥Ã¥·¥å²èÌ̤òɽ¼¨¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Îµ¯Æ°»þ¤Ë\fIimages\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fIsplash\&.gif\fR¥Õ¥¡¥¤¥ë¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fIimgname\fR¤Ç»ØÄꤵ¤ì¤¿¥¤¥á¡¼¥¸¤ò´Þ¤à¥¹¥×¥é¥Ã¥·¥å²èÌ̤òɽ¼¨¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Îµ¯Æ°»þ¤Ë\fBimages\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î\fBsplash\&.gif\fR¥Õ¥¡¥¤¥ë¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-splash:images/splash\&.gif ++\fB\-splash:images/splash\&.gif\fR ++ + .fi + .if n \{\ + .RE +@@ -449,29 +467,30 @@ + .PP + \-version + .RS 4 +-¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ¤«¤é½ªÎ»¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-showversion\fR¥ª¥×¥·¥ç¥ó¤ÈƱÅù¤Ç¤¹¤¬¡¢\-showversion¤Ï¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨¸å¤ËJVM¤Ë½ªÎ»¤ò»Ø¼¨¤·¤Ê¤¤ÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ ++¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ¤«¤é½ªÎ»¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-showversion\fR¥ª¥×¥·¥ç¥ó¤ÈƱÅù¤Ç¤¹¤¬¡¢\-showversion¤Ï¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤Îɽ¼¨¸å¤ËJVM¤Ë½ªÎ»¤ò»Ø¼¨¤·¤Ê¤¤ÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-version:\fIrelease\fR + .RS 4 +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤Ë»ÈÍѤ¹¤ë¥ê¥ê¡¼¥¹¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¥³¡¼¥ë¤µ¤ì¤¿\fIjava\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤¬¤³¤Î»ØÄêÆâÍƤòËþ¤¿¤µ¤º¡¢¤«¤ÄŬÀڤʼÂÁõ¤¬¥·¥¹¥Æ¥à¾å¤Ç¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎŬÀڤʼÂÁõ¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤Ë»ÈÍѤ¹¤ë¥ê¥ê¡¼¥¹¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¥³¡¼¥ë¤µ¤ì¤¿\fBjava\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤¬¤³¤Î»ØÄêÆâÍƤòËþ¤¿¤µ¤º¡¢¤«¤ÄŬÀڤʼÂÁõ¤¬¥·¥¹¥Æ¥à¾å¤Ç¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢¤½¤ÎŬÀڤʼÂÁõ¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp + \fIrelease\fR°ú¿ô¤Ï¡¢Àµ³Î¤Ê¥Ð¡¼¥¸¥ç¥óʸ»úÎ󡢤ޤ¿¤Ï¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤È¥Ð¡¼¥¸¥ç¥óÈϰϤΥꥹ¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fI¥Ð¡¼¥¸¥ç¥óʸ»úÎó\fR¤Ï¡¢¼¡¤Î·Á¼°¤Ç¡¢³«È¯¼Ô¤Î¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤ò»ØÄꤷ¤Þ¤¹: +-\fI1\&.\fR\fIx\fR\fI\&.0_\fR\fIu\fR +-(\fIx\fR¤Ï¥á¥¸¥ã¡¼¡¦¥Ð¡¼¥¸¥ç¥óÈֹ桢\fIu\fR¤Ï¹¹¿·¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤Ç¤¹)¡£\fI¥Ð¡¼¥¸¥ç¥óÈÏ°Ï\fR¤Ï¡¢¤³¤Î¥Ð¡¼¥¸¥ç¥ó°Ê¹ß¤ò»ØÄꤹ¤ë¤Ë¤Ï¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤Î¸å¤Ë¥×¥é¥¹µ­¹æ(\fI+\fR)¤ò³¤±¤¿¤â¤Î¡¢¤Þ¤¿¤Ï°ìÃפ¹¤ëÀÜƬ¼­¤ò´Þ¤àǤ°Õ¤Î¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤ò»ØÄꤹ¤ë¤Ë¤Ï°ìÉô¤Î¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤Î¸å¤Ë¥¢¥¹¥¿¥ê¥¹¥¯(\fI*\fR)¤ò³¤±¤¿¤â¤Î¤Ç¹½À®¤µ¤ì¤Þ¤¹¡£ÏÀÍý\fIOR\fR¤ÎÁȹ礻¤Ë¤Ï¶õÇò¡¢2¤Ä¤Î¥Ð¡¼¥¸¥ç¥ó¤Îʸ»úÎó/ÈϰϤÎÏÀÍý\fIAND\fR¤ÎÁȹ礻¤Ë¤Ï¥¢¥ó¥Ñ¥µ¥ó¥É(\fI&\fR)¤ò»ÈÍѤ·¤Æ¡¢¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤È¥Ð¡¼¥¸¥ç¥óÈϰϤòÁȤ߹礻¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô¤ËJRE 6u13 (1\&.6\&.0_13)¤Þ¤¿¤Ï6u10 (1\&.6\&.0_10)°Ê¹ß¤ÎǤ°Õ¤ÎJRE 6¤Î¤¤¤º¤ì¤«¤òɬÍפȤ¹¤ë¾ì¹ç¡¢¼¡¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fB1\&.\fR\fIx\fR\fB\&.0_\fR\fIu\fR ++(\fIx\fR¤Ï¥á¥¸¥ã¡¼¡¦¥Ð¡¼¥¸¥ç¥óÈֹ桢\fIu\fR¤Ï¹¹¿·¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤Ç¤¹)¡£\fI¥Ð¡¼¥¸¥ç¥óÈÏ°Ï\fR¤Ï¡¢¤³¤Î¥Ð¡¼¥¸¥ç¥ó°Ê¹ß¤ò»ØÄꤹ¤ë¤Ë¤Ï¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤Î¸å¤Ë¥×¥é¥¹µ­¹æ(\fB+\fR)¤ò³¤±¤¿¤â¤Î¡¢¤Þ¤¿¤Ï°ìÃפ¹¤ëÀÜƬ¼­¤ò´Þ¤àǤ°Õ¤Î¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤ò»ØÄꤹ¤ë¤Ë¤Ï°ìÉô¤Î¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤Î¸å¤Ë¥¢¥¹¥¿¥ê¥¹¥¯(\fB*\fR)¤ò³¤±¤¿¤â¤Î¤Ç¹½À®¤µ¤ì¤Þ¤¹¡£ÏÀÍý\fIOR\fR¤ÎÁȹ礻¤Ë¤Ï¶õÇò¡¢2¤Ä¤Î¥Ð¡¼¥¸¥ç¥ó¤Îʸ»úÎó/ÈϰϤÎÏÀÍý\fIAND\fR¤ÎÁȹ礻¤Ë¤Ï¥¢¥ó¥Ñ¥µ¥ó¥É(\fB&\fR)¤ò»ÈÍѤ·¤Æ¡¢¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤È¥Ð¡¼¥¸¥ç¥óÈϰϤòÁȤ߹礻¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô¤ËJRE 6u13 (1\&.6\&.0_13)¤Þ¤¿¤Ï6u10 (1\&.6\&.0_10)°Ê¹ß¤ÎǤ°Õ¤ÎJRE 6¤Î¤¤¤º¤ì¤«¤òɬÍפȤ¹¤ë¾ì¹ç¡¢¼¡¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+" ++\fB\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+"\fR ++ + .fi + .if n \{\ + .RE + .\} + °úÍÑÉ䤬ɬÍפʤΤϡ¢\fIrelease\fR¥Ñ¥é¥á¡¼¥¿¤Ë¶õÇò¤¬¤¢¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£ + .sp +-JAR¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¤Ï¡¢¥Ð¡¼¥¸¥ç¥óÍ×·ï¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤹ¤ë¤è¤ê¤â¡¢JAR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Ë»ØÄꤹ¤ë¤³¤È¤¬¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¤Ï¡¢¥Ð¡¼¥¸¥ç¥óÍ×·ï¤ò¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤹ¤ë¤è¤ê¤â¡¢JAR¥Õ¥¡¥¤¥ë¤Î¥Þ¥Ë¥Õ¥§¥¹¥ÈÆâ¤Ë»ØÄꤹ¤ë¤³¤È¤¬¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .RE + .SS "Èóɸ½à¥ª¥×¥·¥ç¥ó" + .PP +@@ -479,40 +498,35 @@ + .PP + \-X + .RS 4 +-»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤Î\fI\-X\fR¥ª¥×¥·¥ç¥ó¤Î¥Ø¥ë¥×¤òɽ¼¨¤·¤Þ¤¹¡£ ++»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤Î\fB\-X\fR¥ª¥×¥·¥ç¥ó¤Î¥Ø¥ë¥×¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-Xbatch + .RS 4 +-¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JVM¤Ç¤Ï¡¢¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢¥á¥½¥Ã¥É¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥¿¥¹¥¯¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤·¡¢¥¤¥ó¥¿¥×¥ê¥¿¡¦¥â¡¼¥É¤Ç¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fI\-Xbatch\fR¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤¬´°Î»¤¹¤ë¤Þ¤Ç¥Õ¥©¥¢¥°¥é¥¦¥ó¥É¡¦¥¿¥¹¥¯¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£ ++¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JVM¤Ç¤Ï¡¢¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢¥á¥½¥Ã¥É¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥¿¥¹¥¯¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤·¡¢¥¤¥ó¥¿¥×¥ê¥¿¡¦¥â¡¼¥É¤Ç¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fB\-Xbatch\fR¥Õ¥é¥°¤ò»ØÄꤹ¤ë¤È¡¢¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤¬´°Î»¤¹¤ë¤Þ¤Ç¥Õ¥©¥¢¥°¥é¥¦¥ó¥É¡¦¥¿¥¹¥¯¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹¡£ + .sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:\-BackgroundCompilation\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:\-BackgroundCompilation\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xbootclasspath:\fIpath\fR + .RS 4 + ¥Ö¡¼¥È¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¤ª¤è¤ÓZIP¥¢¡¼¥«¥¤¥Ö¤Î¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤é¤ì¤¿¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤é¤Ï¡¢JDK¤Ë´Þ¤Þ¤ì¤ë¥Ö¡¼¥È¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤«¤ï¤ê¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp +-JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fIrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fBrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xbootclasspath/a:\fIpath\fR + .RS 4 + ¥Ç¥Õ¥©¥ë¥È¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎºÇ¸å¤ËÄɲ乤ë¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¤ª¤è¤ÓZIP¥¢¡¼¥«¥¤¥Ö¤Î¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤é¤ì¤¿¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fIrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fBrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xbootclasspath/p:\fIpath\fR + .RS 4 + ¥Ç¥Õ¥©¥ë¥È¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎÀèƬ¤ËÄɲ乤ë¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¤ª¤è¤ÓZIP¥¢¡¼¥«¥¤¥Ö¤Î¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤é¤ì¤¿¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fIrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ +-.RE +-.PP +-\-Xboundthreads +-.RS 4 +-¥æ¡¼¥¶¡¼¡¦¥ì¥Ù¥ë¤Î¥¹¥ì¥Ã¥É¤ò¥«¡¼¥Í¥ë¡¦¥¹¥ì¥Ã¥É¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£ ++JRE¥Ð¥¤¥Ê¥ê¡¦¥³¡¼¥É¡¦¥é¥¤¥»¥ó¥¹¤Ë°ãÈ¿¤¹¤ë¤¿¤á¡¢\fBrt\&.jar\fR¤Ç¥¯¥é¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ëÌÜŪ¤Ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥Ç¥×¥í¥¤¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xcheck:jni +@@ -522,14 +536,14 @@ + .PP + \-Xcomp + .RS 4 +-ºÇ½é¤Î¸Æ½Ð¤·¤ÇJava¥³¡¼¥É¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥ë¡¦¥á¥½¥Ã¥É¤Î²ò¼á¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï¡¢10,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¤Æ¡¢¸úΨŪ¤Ê¥³¥ó¥Ñ¥¤¥ë¤Î¤¿¤á¤Î¾ðÊó¤ò¼ý½¸¤·¤Þ¤¹¡£¸úΨ¤òµ¾À·¤Ë¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¤Ë¤Ï¡¢\fI\-Xcomp\fR¥Õ¥é¥°¤ò»ÈÍѤ·¤Æ¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£ ++ºÇ½é¤Î¸Æ½Ð¤·¤Ç¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤ò¶¯À©Åª¤Ë¼Â¹Ô¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥ÈVM(\fB\-client\fR)¤Ï1,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¡¢¥µ¡¼¥Ð¡¼VM(\fB\-server\fR)¤Ï10,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¤Æ¡¢¸úΨŪ¤Ê¥³¥ó¥Ñ¥¤¥ë¤Î¤¿¤á¤Î¾ðÊó¤ò¼ý½¸¤·¤Þ¤¹¡£\fB\-Xcomp\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¸úΨ¤òµ¾À·¤Ë¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤·¤Þ¤¹¡£ + .sp +-\fI\-XX:CompileThreshold\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¤ÎÁ°¤Ë¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤òÊѹ¹¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++\fB\-XX:CompileThreshold\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¤ÎÁ°¤Ë¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤òÊѹ¹¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-Xdebug + .RS 4 +-²¿¤â¹Ô¤¤¤Þ¤»¤ó¡£²¼°Ì¸ß´¹À­¤Î¤¿¤á¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++²¿¤â¹Ô¤¤¤Þ¤»¤ó¡£¸åÊý¸ß´¹À­¤Î¤¿¤á¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-Xdiag +@@ -542,11 +556,6 @@ + ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë·Á¼°¤Î»ÅÍͤؤνàµò¤ò¶¯²½¤¹¤ë¡¢¸·Ì©¤Ê¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë·Á¼°¤Î¥Á¥§¥Ã¥¯¤¬Í­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢¤è¤ê¸·Ì©¤Ê¥Á¥§¥Ã¥¯¤¬¥Ç¥Õ¥©¥ë¥È¤Ë¤Ê¤ë¤¿¤á¡¢¿·¤·¤¤¥³¡¼¥É¤ò³«È¯¤¹¤ë¤È¤­¤Ë¤Ï¡¢³«È¯¼Ô¤Ï¤³¤Î¥Õ¥é¥°¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .RE + .PP +-\-Xincgc +-.RS 4 +-ÁýʬGC¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ +-.RE +-.PP + \-Xint + .RS 4 + ¥¤¥ó¥¿¥×¥ê¥¿ÀìÍѥ⡼¥É¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£¥Í¥¤¥Æ¥£¥Ö¡¦¥³¡¼¥É¤Ø¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï̵¸ú¤Ë¤Ê¤ê¡¢¤¹¤Ù¤Æ¤Î¥Ð¥¤¥È¥³¡¼¥É¤¬¥¤¥ó¥¿¥×¥ê¥¿¤Ë¤è¤Ã¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥¸¥ã¥¹¥È¡¦¥¤¥ó¡¦¥¿¥¤¥à(JIT)¥³¥ó¥Ñ¥¤¥é¤¬Ä󶡤¹¤ë¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¾å¤ÎÍøÅÀ¤Ï¡¢¤³¤Î¥â¡¼¥É¤Ç¤Ï¼Â¸½¤µ¤ì¤Þ¤»¤ó¡£ +@@ -554,12 +563,12 @@ + .PP + \-Xinternalversion + .RS 4 +-\fI\-version\fR¥ª¥×¥·¥ç¥ó¤è¤ê¾ÜºÙ¤ÊJVM¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ¤«¤é½ªÎ»¤·¤Þ¤¹¡£ ++\fB\-version\fR¥ª¥×¥·¥ç¥ó¤è¤ê¾ÜºÙ¤ÊJVM¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ¤«¤é½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP + \-Xloggc:\fIfilename\fR + .RS 4 +-¾ÜºÙ¤ÊGC¥¤¥Ù¥ó¥È¾ðÊó¤ò¥í¥®¥ó¥°ÍѤ˥ê¥À¥¤¥ì¥¯¥È¤¹¤ë¥Õ¥¡¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤Þ¤ì¤ë¾ðÊó¤Ï¡¢µ­Ï¿¤µ¤ì¤¿³Æ¥¤¥Ù¥ó¥È¤ÎÁ°¤Ë¹Ô¤ï¤ì¤ëºÇ½é¤ÎGC¥¤¥Ù¥ó¥È°Ê¹ß¤Ë·Ð²á¤·¤¿»þ´Ö¤ò»ØÄꤷ¤¿\fI\-verbose:gc\fR¤Î½ÐÎϤÈÎà»÷¤·¤Æ¤¤¤Þ¤¹¡£\fI\-Xloggc\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-verbose:gc\fR¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹(¤³¤ì¤é¤ÎξÊý¤¬Æ±¤¸\fIjava\fR¥³¥Þ¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¾ì¹ç)¡£ ++¾ÜºÙ¤ÊGC¥¤¥Ù¥ó¥È¾ðÊó¤ò¥í¥®¥ó¥°ÍѤ˥ê¥À¥¤¥ì¥¯¥È¤¹¤ë¥Õ¥¡¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤Þ¤ì¤ë¾ðÊó¤Ï¡¢µ­Ï¿¤µ¤ì¤¿³Æ¥¤¥Ù¥ó¥È¤ÎÁ°¤Ë¹Ô¤ï¤ì¤ëºÇ½é¤ÎGC¥¤¥Ù¥ó¥È°Ê¹ß¤Ë·Ð²á¤·¤¿»þ´Ö¤ò»ØÄꤷ¤¿\fB\-verbose:gc\fR¤Î½ÐÎϤÈÎà»÷¤·¤Æ¤¤¤Þ¤¹¡£\fB\-Xloggc\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-verbose:gc\fR¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹(¤³¤ì¤é¤ÎξÊý¤¬Æ±¤¸\fBjava\fR¥³¥Þ¥ó¥É¤Ç»ØÄꤵ¤ì¤¿¾ì¹ç)¡£ + .sp + Îã: + .sp +@@ -567,7 +576,8 @@ + .RS 4 + .\} + .nf +-\-Xloggc:garbage\-collection\&.log ++\fB\-Xloggc:garbage\-collection\&.log\fR ++ + .fi + .if n \{\ + .RE +@@ -576,18 +586,19 @@ + .PP + \-Xmaxjitcodesize=\fIsize\fR + .RS 4 +-JIT¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤ÎºÇÂ祳¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤ò»ØÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤ÎÃͤÏ48MB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++JIT¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤ÎºÇÂ祳¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤ò»ØÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤ÎÃͤÏ48MB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-Xmaxjitcodesize=48m ++\fB\-Xmaxjitcodesize=48m\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:ReservedCodeCacheSize\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:ReservedCodeCacheSize\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xmixed +@@ -597,7 +608,7 @@ + .PP + \-Xmn\fIsize\fR + .RS 4 +-¼ã¤¤À¤Âå(¥Ê¡¼¥µ¥ê)¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤ª¤è¤ÓºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£ ++¼ã¤¤À¤Âå(¥Ê¡¼¥µ¥ê)¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤ª¤è¤ÓºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£ + .sp + ¥Ò¡¼¥×¤Î¼ã¤¤À¤Âå¥ê¡¼¥¸¥ç¥ó¤Ï¿·¤·¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£GC¤Ï¡¢Â¾¤Î¥ê¡¼¥¸¥ç¥ó¤è¤ê¤³¤Î¥ê¡¼¥¸¥ç¥ó¤Ç¡¢¤è¤êÉÑÈˤ˼¹Ԥµ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥µ¥¤¥º¤¬¾®¤µ¤¹¤®¤ë¾ì¹ç¡¢Â¿¿ô¤Î¥Þ¥¤¥Ê¡¼¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥µ¥¤¥º¤¬Â礭¤¹¤®¤ë¾ì¹ç¡¢¥Õ¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¤ß¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¤¬¡¢´°Î»¤Þ¤Ç¤Ë»þ´Ö¤¬¤«¤«¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥µ¥¤¥º¤Ï¡¢Á´ÂΤΥҡ¼¥×¡¦¥µ¥¤¥º¤ÎȾʬ¤«¤é4ʬ¤Î1¤Î´Ö¤Ë¤·¤Æ¤ª¤¯¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .sp +@@ -607,19 +618,20 @@ + .RS 4 + .\} + .nf +-\-Xmn256m +-\-Xmn262144k +-\-Xmn268435456 ++\fB\-Xmn256m\fR ++\fB\-Xmn262144k\fR ++\fB\-Xmn268435456\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤ÈºÇÂ祵¥¤¥º¤ÎξÊý¤òÀßÄꤹ¤ë\fI\-Xmn\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë¡¢½é´ü¥µ¥¤¥º¤ÎÀßÄê¤Ë¤Ï\fI\-XX:NewSize\fR¤ò¡¢ºÇÂ祵¥¤¥º¤ÎÀßÄê¤Ë¤Ï\fI\-XX:MaxNewSize\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤ÈºÇÂ祵¥¤¥º¤ÎξÊý¤òÀßÄꤹ¤ë\fB\-Xmn\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë¡¢½é´ü¥µ¥¤¥º¤ÎÀßÄê¤Ë¤Ï\fB\-XX:NewSize\fR¤ò¡¢ºÇÂ祵¥¤¥º¤ÎÀßÄê¤Ë¤Ï\fB\-XX:MaxNewSize\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-Xms\fIsize\fR + .RS 4 +-¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢1MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£ ++¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢1MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢³ä¤êÅö¤Æ¤é¤ì¤¿¥á¥â¥ê¡¼¤Î¥µ¥¤¥º¤òÍÍ¡¹¤Êñ°Ì¤ò»ÈÍѤ·¤Æ6MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -627,19 +639,20 @@ + .RS 4 + .\} + .nf +-\-Xms6291456 +-\-Xms6144k +-\-Xms6m ++\fB\-Xms6291456\fR ++\fB\-Xms6144k\fR ++\fB\-Xms6m\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤷ¤Ê¤¤¾ì¹ç¡¢½é´ü¥µ¥¤¥º¤Ï¡¢¸Å¤¤À¤Âå¤È¼ã¤¤À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥µ¥¤¥º¤Î¹ç·×¤È¤·¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤Ï¡¢\fI\-Xmn\fR¥ª¥×¥·¥ç¥ó¤Þ¤¿¤Ï\fI\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÀßÄê¤Ç¤­¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤷ¤Ê¤¤¾ì¹ç¡¢½é´ü¥µ¥¤¥º¤Ï¡¢¸Å¤¤À¤Âå¤È¼ã¤¤À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥µ¥¤¥º¤Î¹ç·×¤È¤·¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º¤Ï¡¢\fB\-Xmn\fR¥ª¥×¥·¥ç¥ó¤Þ¤¿¤Ï\fB\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÀßÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-Xmx\fIsize\fR + .RS 4 +-¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢2MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Ç¥×¥í¥¤¥á¥ó¥È¤Ç¤Ï¡¢\fI\-Xms\fR¤ª¤è¤Ó\fI\-Xmx\fR¤ÏÄ̾ïƱ¤¸ÃͤËÀßÄꤵ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢2MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Ç¥×¥í¥¤¥á¥ó¥È¤Ç¤Ï¡¢\fB\-Xms\fR¤ª¤è¤Ó\fB\-Xmx\fR¤ÏÄ̾ïƱ¤¸ÃͤËÀßÄꤵ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢³ä¤êÅö¤Æ¤é¤ì¤¿¥á¥â¥ê¡¼¤Îµö²Ä¤µ¤ì¤ëºÇÂ祵¥¤¥º¤òÍÍ¡¹¤Êñ°Ì¤ò»ÈÍѤ·¤Æ80MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -647,26 +660,27 @@ + .RS 4 + .\} + .nf +-\-Xmx83886080 +-\-Xmx81920k +-\-Xmx80m ++\fB\-Xmx83886080\fR ++\fB\-Xmx81920k\fR ++\fB\-Xmx80m\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fI\-Xmx\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:MaxHeapSize\fR¤ÈƱÅù¤Ç¤¹¡£ ++\fB\-Xmx\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:MaxHeapSize\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xnoclassgc + .RS 4 + ¥¯¥é¥¹¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(GC)¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢GC»þ´Ö¤òÀáÌó¤Ç¤­¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¼Â¹ÔÃæ¤ÎÃæÃǤ¬Ã»½Ì¤µ¤ì¤Þ¤¹¡£ + .sp +-µ¯Æ°»þ¤Ë\fI\-Xnoclassgc\fR¤ò»ØÄꤹ¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥óÆâ¤Î¥¯¥é¥¹¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢GC¤Î´Ö¤Ï¤½¤Î¤Þ¤Þ»Ä¤ê¡¢¾ï¤Ë¥é¥¤¥Ö¤Ç¤¢¤ë¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¤è¤ê¿¤¯¤Î¥á¥â¥ê¡¼¤¬±Êµ×¤ËÀêÍ­¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¡¢Ãí°Õ¤·¤Æ»ÈÍѤ·¤Ê¤¤¤È¡¢¥á¥â¥ê¡¼ÉÔ­¤ÎÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ ++µ¯Æ°»þ¤Ë\fB\-Xnoclassgc\fR¤ò»ØÄꤹ¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥óÆâ¤Î¥¯¥é¥¹¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢GC¤Î´Ö¤Ï¤½¤Î¤Þ¤Þ»Ä¤ê¡¢¾ï¤Ë¥é¥¤¥Ö¤Ç¤¢¤ë¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¤è¤ê¿¤¯¤Î¥á¥â¥ê¡¼¤¬±Êµ×¤ËÀêÍ­¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¡¢Ãí°Õ¤·¤Æ»ÈÍѤ·¤Ê¤¤¤È¡¢¥á¥â¥ê¡¼ÉÔ­¤ÎÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-Xprof + .RS 4 +-¼Â¹ÔÃæ¤Î¥×¥í¥°¥é¥à¤Î¥×¥í¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¡¢¥×¥í¥Õ¥¡¥¤¥ë¡¦¥Ç¡¼¥¿¤òɸ½à½ÐÎϤËÁ÷¿®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥×¥í¥°¥é¥à³«È¯ÍѤΥ桼¥Æ¥£¥ê¥Æ¥£¤È¤·¤ÆÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£ËÜÈÖ²ÔƯ¥·¥¹¥Æ¥à¤Ç¤Î»ÈÍѤòÌÜŪ¤È¤·¤¿¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++¼Â¹ÔÃæ¤Î¥×¥í¥°¥é¥à¤ò¥×¥í¥Õ¥¡¥¤¥ë¤·¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥Ç¡¼¥¿¤òɸ½à½ÐÎϤËÁ÷¿®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥×¥í¥°¥é¥à³«È¯ÍѤΥ桼¥Æ¥£¥ê¥Æ¥£¤È¤·¤ÆÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£ËÜÈÖ²ÔƯ¥·¥¹¥Æ¥à¤Ç¤Î»ÈÍѤòÌÜŪ¤È¤·¤¿¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .RE + .PP + \-Xrs +@@ -675,13 +689,13 @@ + .sp + ¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤Ï¡¢JVM¤¬ÆÍÁ³½ªÎ»¤·¤¿¾ì¹ç¤Ç¤â¡¢¥·¥ã¥Ã¥È¥À¥¦¥ó»þ¤Ë¥æ¡¼¥¶¡¼¡¦¥¯¥ê¡¼¥ó¥¢¥Ã¥×¡¦¥³¡¼¥É(¥Ç¡¼¥¿¥Ù¡¼¥¹Àܳ¤Î¥¯¥í¡¼¥º¤Ê¤É)¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥·¥ã¥Ã¥È¥À¥¦¥ó¤ò½çÈÖ¤ËÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .sp +-JVM¤Ï¡¢Í½´ü¤·¤Ê¤¤½ªÎ»¤Î¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤Ë¥·¥°¥Ê¥ë¤ò¥­¥ã¥Ã¥Á¤·¤Þ¤¹¡£JVM¤Ï¡¢\fISIGHUP\fR¡¢\fISIGINT\fR¤ª¤è¤Ó\fISIGTERM\fR¤ò»ÈÍѤ·¤Æ¡¢¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤Î¼Â¹Ô¤ò³«»Ï¤·¤Þ¤¹¡£ ++JVM¤Ï¡¢Í½´ü¤·¤Ê¤¤½ªÎ»¤Î¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤Ë¥·¥°¥Ê¥ë¤ò¥­¥ã¥Ã¥Á¤·¤Þ¤¹¡£JVM¤Ï¡¢\fBSIGHUP\fR¡¢\fBSIGINT\fR¤ª¤è¤Ó\fBSIGTERM\fR¤ò»ÈÍѤ·¤Æ¡¢¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯¤Î¼Â¹Ô¤ò³«»Ï¤·¤Þ¤¹¡£ + .sp +-JVM¤Ï¡¢¥Ç¥Ð¥Ã¥°¤ÎÌÜŪ¤Ç¥¹¥ì¥Ã¥É¡¦¥¹¥¿¥Ã¥¯¤ò¥À¥ó¥×¤¹¤ë¤È¤¤¤¦µ¡Ç½¤ò¼Â¸½¤¹¤ë¤¿¤á¤Ë¡¢Æ±ÍͤΥᥫ¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£JVM¤Ï¡¢¥¹¥ì¥Ã¥É¡¦¥À¥ó¥×¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤Ë\fISIGQUIT\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++JVM¤Ï¡¢¥Ç¥Ð¥Ã¥°¤ÎÌÜŪ¤Ç¥¹¥ì¥Ã¥É¡¦¥¹¥¿¥Ã¥¯¤ò¥À¥ó¥×¤¹¤ë¤È¤¤¤¦µ¡Ç½¤ò¼Â¸½¤¹¤ë¤¿¤á¤Ë¡¢Æ±ÍͤΥᥫ¥Ë¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£JVM¤Ï¡¢¥¹¥ì¥Ã¥É¡¦¥À¥ó¥×¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤Ë\fBSIGQUIT\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp +-JVM¤òËä¤á¹þ¤ó¤Ç¤¤¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢\fISIGINT\fR¤ä\fISIGTERM\fR¤Ê¤É¤Î¥·¥°¥Ê¥ë¤òÉÑÈˤ˥ȥé¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¡¢¤½¤Î·ë²Ì¡¢JVM¤Î¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤È¾×Æͤ¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fI\-Xrs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¤³¤ÎÌäÂê¤ËÂн褹¤ë¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£\fI\-Xrs\fR¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fISIGINT\fR¡¢\fISIGTERM\fR¡¢\fISIGHUP\fR¤ª¤è¤Ó\fISIGQUIT\fR¤Î¥·¥°¥Ê¥ë¡¦¥Þ¥¹¥¯¤ÏJVM¤Ë¤è¤Ã¤ÆÊѹ¹¤µ¤ì¤º¡¢¤³¤ì¤é¤Î¥·¥°¥Ê¥ë¤Î¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤Ï¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Þ¤»¤ó¡£ ++JVM¤òËä¤á¹þ¤ó¤Ç¤¤¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢\fBSIGINT\fR¤ä\fBSIGTERM\fR¤Ê¤É¤Î¥·¥°¥Ê¥ë¤òÉÑÈˤ˥ȥé¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¡¢¤½¤Î·ë²Ì¡¢JVM¤Î¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤È¾×Æͤ¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fB\-Xrs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¤³¤ÎÌäÂê¤ËÂн褹¤ë¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£\fB\-Xrs\fR¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBSIGINT\fR¡¢\fBSIGTERM\fR¡¢\fBSIGHUP\fR¤ª¤è¤Ó\fBSIGQUIT\fR¤Î¥·¥°¥Ê¥ë¡¦¥Þ¥¹¥¯¤ÏJVM¤Ë¤è¤Ã¤ÆÊѹ¹¤µ¤ì¤º¡¢¤³¤ì¤é¤Î¥·¥°¥Ê¥ë¤Î¥·¥°¥Ê¥ë¡¦¥Ï¥ó¥É¥é¤Ï¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Þ¤»¤ó¡£ + .sp +-\fI\-Xrs\fR¤ò»ØÄꤹ¤ë¤È¡¢¼¡¤Î2¤Ä¤Î·ë²Ì¤¬À¸¤¸¤Þ¤¹: ++\fB\-Xrs\fR¤ò»ØÄꤹ¤ë¤È¡¢¼¡¤Î2¤Ä¤Î·ë²Ì¤¬À¸¤¸¤Þ¤¹: + .sp + .RS 4 + .ie n \{\ +@@ -691,7 +705,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fISIGQUIT\fR¤Ë¤è¤ë¥¹¥ì¥Ã¥É¡¦¥À¥ó¥×¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++\fBSIGQUIT\fR¤Ë¤è¤ë¥¹¥ì¥Ã¥É¡¦¥À¥ó¥×¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -702,7 +716,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯½èÍý¤Î¼Â¹Ô¤Ï¡¢JVM¤¬½ªÎ»¤·¤è¤¦¤È¤·¤Æ¤¤¤ë»þÅÀ¤Ç\fISystem\&.exit()\fR¤ò¸Æ¤Ó½Ð¤¹¤Ê¤É¤·¤Æ¡¢¥æ¡¼¥¶¡¼¡¦¥³¡¼¥É¦¤Ç¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ++¥·¥ã¥Ã¥È¥À¥¦¥ó¡¦¥Õ¥Ã¥¯½èÍý¤Î¼Â¹Ô¤Ï¡¢JVM¤¬½ªÎ»¤·¤è¤¦¤È¤·¤Æ¤¤¤ë»þÅÀ¤Ç\fBSystem\&.exit()\fR¤ò¸Æ¤Ó½Ð¤¹¤Ê¤É¤·¤Æ¡¢¥æ¡¼¥¶¡¼¡¦¥³¡¼¥É¦¤Ç¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .RE + .PP +@@ -758,7 +772,7 @@ + .PP + \-Xss\fIsize\fR + .RS 4 +-¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£KB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢MB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢GB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϥץé¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ ++¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£KB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢MB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢GB¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϥץé¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -843,19 +857,20 @@ + .RS 4 + .\} + .nf +-\-Xss1m +-\-Xss1024k +-\-Xss1048576 ++\fB\-Xss1m\fR ++\fB\-Xss1024k\fR ++\fB\-Xss1048576\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:ThreadStackSize\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:ThreadStackSize\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xusealtsigs + .RS 4 +-JVMÆâÉô¥·¥°¥Ê¥ë¤Î\fISIGUSR1\fR¤ª¤è¤Ó\fISIGUSR2\fR¤Î¤«¤ï¤ê¤Ë¡¢ÂåÂØ¥·¥°¥Ê¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-XX:+UseAltSigs\fR¤ÈƱÅù¤Ç¤¹¡£ ++JVMÆâÉô¥·¥°¥Ê¥ë¤Î\fBSIGUSR1\fR¤ª¤è¤Ó\fBSIGUSR2\fR¤Î¤«¤ï¤ê¤Ë¡¢ÂåÂØ¥·¥°¥Ê¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-XX:+UseAltSigs\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-Xverify:\fImode\fR +@@ -869,7 +884,7 @@ + .PP + remote + .RS 4 +-¥Í¥Ã¥È¥ï¡¼¥¯¤ò²ð¤·¤Æ¥ê¥â¡¼¥È¤Ç¥í¡¼¥É¤µ¤ì¤ë¥¯¥é¥¹¤Î¤ß¤ò¸¡¾Ú¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fI\-Xverify\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ ++¥Í¥Ã¥È¥ï¡¼¥¯¤ò²ð¤·¤Æ¥ê¥â¡¼¥È¤Ç¥í¡¼¥É¤µ¤ì¤ë¥¯¥é¥¹¤Î¤ß¤ò¸¡¾Ú¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fB\-Xverify\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ + .RE + .PP + all +@@ -883,40 +898,47 @@ + .PP + \-XX:+DisableAttachMechanism + .RS 4 +-JVM¤Ë¥Ä¡¼¥ë¤ò¥¢¥¿¥Ã¥Á¤¹¤ë¥á¥«¥Ë¥º¥à¤ò̵¸ú¤Ë¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤Ï¡¢¥¢¥¿¥Ã¥Á¡¦¥á¥«¥Ë¥º¥à¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fIjcmd\fR¡¢\fIjstack\fR¡¢\fIjmap\fR¡¢\fIjinfo\fR¤Ê¤É¤Î¥Ä¡¼¥ë¤ò»ÈÍѤǤ­¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++JVM¤Ë¥Ä¡¼¥ë¤ò¥¢¥¿¥Ã¥Á¤¹¤ë¥á¥«¥Ë¥º¥à¤ò̵¸ú¤Ë¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤Ï¡¢¥¢¥¿¥Ã¥Á¡¦¥á¥«¥Ë¥º¥à¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fBjcmd\fR¡¢\fBjstack\fR¡¢\fBjmap\fR¡¢\fBjinfo\fR¤Ê¤É¤Î¥Ä¡¼¥ë¤ò»ÈÍѤǤ­¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .RE + .PP + \-XX:ErrorFile=\fIfilename\fR + .RS 4 +-¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ë¥¨¥é¡¼¡¦¥Ç¡¼¥¿¤¬½ñ¤­¹þ¤Þ¤ì¤ë¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fIhs_err_pid\fR\fIpid\fR\fI\&.log\fR +-(\fIpid\fR¤Ï¥¨¥é¡¼¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥í¥°¡¦¥Õ¥¡¥¤¥ë¤òÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(¥×¥í¥»¥¹¤Î¼±Ê̻ҤÏ\fI%p\fR¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹)¡£ ++¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ë¥¨¥é¡¼¡¦¥Ç¡¼¥¿¤¬½ñ¤­¹þ¤Þ¤ì¤ë¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fBhs_err_pid\fR\fIpid\fR\fB\&.log\fR ++(\fIpid\fR¤Ï¥¨¥é¡¼¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥í¥°¡¦¥Õ¥¡¥¤¥ë¤òÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(¥×¥í¥»¥¹¤Î¼±Ê̻ҤÏ\fB%p\fR¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹)¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-XX:ErrorFile=\&./hs_err_pid%p\&.log ++\fB\-XX:ErrorFile=\&./hs_err_pid%p\&.log\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤ÎÎã¤Ç¤Ï¡¢¥¨¥é¡¼¡¦¥í¥°¤ò\fI/var/log/java/java_error\&.log\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢¥¨¥é¡¼¡¦¥í¥°¤ò\fB/var/log/java/java_error\&.log\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-XX:ErrorFile=/var/log/java/java_error\&.log ++\fB\-XX:ErrorFile=/var/log/java/java_error\&.log\fR ++ + .fi + .if n \{\ + .RE + .\} +-(ÎΰèÉÔ­¡¢¸¢¸Â¤ÎÌäÂê¤Þ¤¿¤ÏÊ̤ÎÌäÂê¤Ë¤è¤ê)»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ï¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î°ì»þ¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£°ì»þ¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fI/tmp\fR¤Ç¤¹¡£ ++(ÎΰèÉÔ­¡¢¸¢¸Â¤ÎÌäÂê¤Þ¤¿¤ÏÊ̤ÎÌäÂê¤Ë¤è¤ê)»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Ê¤¤¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ï¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î°ì»þ¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£°ì»þ¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fB/tmp\fR¤Ç¤¹¡£ ++.RE ++.PP ++\-XX:+FailOverToOldVerifier ++.RS 4 ++¿·¤·¤¤¥¿¥¤¥×¡¦¥Á¥§¥Ã¥«¤¬¼ºÇÔ¤·¤¿¾ì¹ç¤Î¡¢¸Å¤¤¥Ù¥ê¥Õ¥¡¥¤¥¢¤Ø¤Î¼«Æ°¥Õ¥§¥¤¥ë¥ª¡¼¥Ð¡¼¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢ºÇ¶á¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤Ï̵»ë¤µ¤ì¤Þ¤¹(¤Ä¤Þ¤ê¡¢Ìµ¸ú¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹)¡£¸Å¤¤¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥¤¥È¥³¡¼¥É¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤òÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:LargePageSizeInBytes=\fIsize\fR + .RS 4 +-Java¥Ò¡¼¥×¤Ë»ÈÍѤµ¤ì¤ëÂ礭¤¤¥Ú¡¼¥¸¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£\fIsize\fR°ú¿ô¤Ï¡¢2¤ÎÎß¾è(2¡¢4¡¢8¡¢16¡¢\&.\&.\&.)¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¥¤¥º¤Ï0¤ËÀßÄꤵ¤ì¡¢¤³¤ì¤Ï¡¢JVM¤Ç¤ÏÂ礭¤¤¥Ú¡¼¥¸¤Î¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++Java¥Ò¡¼¥×¤Ë»ÈÍѤµ¤ì¤ëÂ礭¤¤¥Ú¡¼¥¸¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£\fIsize\fR°ú¿ô¤Ï¡¢2¤ÎÎß¾è(2¡¢4¡¢8¡¢16¡¢\&.\&.\&.)¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¥¤¥º¤Ï0¤ËÀßÄꤵ¤ì¡¢¤³¤ì¤Ï¡¢JVM¤Ç¤ÏÂ礭¤¤¥Ú¡¼¥¸¤Î¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢Â礭¤¤¥Ú¡¼¥¸¤Î¥µ¥¤¥º¤ò4¥á¥¬¥Ð¥¤¥È(MB)¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -924,7 +946,8 @@ + .RS 4 + .\} + .nf +-\-XX:LargePageSizeInBytes=4m ++\fB\-XX:LargePageSizeInBytes=4m\fR ++ + .fi + .if n \{\ + .RE +@@ -933,7 +956,7 @@ + .PP + \-XX:MaxDirectMemorySize=\fIsize\fR + .RS 4 +-¿·µ¬I/O (\fIjava\&.nio\fR¥Ñ¥Ã¥±¡¼¥¸)¤ÎľÀܥХåե¡³äÅö¤Æ¤ÎºÇÂç¹ç·×¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¥¤¥º¤Ï0¤ËÀßÄꤵ¤ì¡¢¤³¤ì¤Ï¡¢JVM¤Ç¤ÏNIO¤ÎľÀܥХåե¡³äÅö¤Æ¤Î¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++¿·µ¬I/O (\fBjava\&.nio\fR¥Ñ¥Ã¥±¡¼¥¸)¤ÎľÀܥХåե¡³äÅö¤Æ¤ÎºÇÂç¹ç·×¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¥¤¥º¤Ï0¤ËÀßÄꤵ¤ì¡¢¤³¤ì¤Ï¡¢JVM¤Ç¤ÏNIO¤ÎľÀܥХåե¡³äÅö¤Æ¤Î¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢NIO¥µ¥¤¥º¤ò°Û¤Ê¤ëñ°Ì¤Ç1024KB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -941,9 +964,10 @@ + .RS 4 + .\} + .nf +-\-XX:MaxDirectMemorySize=1m +-\-XX:MaxDirectMemorySize=1024k +-\-XX:MaxDirectMemorySize=1048576 ++\fB\-XX:MaxDirectMemorySize=1m\fR ++\fB\-XX:MaxDirectMemorySize=1024k\fR ++\fB\-XX:MaxDirectMemorySize=1048576\fR ++ + .fi + .if n \{\ + .RE +@@ -956,7 +980,7 @@ + .PP + off + .RS 4 +-JVM¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼»ÈÍѾõ¶·¤òÄÉÀפ·¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢\fI\-XX:NativeMemoryTracking\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ ++JVM¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼»ÈÍѾõ¶·¤òÄÉÀפ·¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢\fB\-XX:NativeMemoryTracking\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ + .RE + .PP + summary +@@ -966,7 +990,7 @@ + .PP + detail + .RS 4 +-JVM¥µ¥Ö¥·¥¹¥Æ¥à¤Ë¤è¤ë¥á¥â¥ê¡¼»ÈÍѾõ¶·¤Î¥È¥é¥Ã¥­¥ó¥°¤Ë²Ã¤¨¤Æ¡¢¸Ä¡¹¤Î\fICallSite\fR ++JVM¥µ¥Ö¥·¥¹¥Æ¥à¤Ë¤è¤ë¥á¥â¥ê¡¼»ÈÍѾõ¶·¤Î¥È¥é¥Ã¥­¥ó¥°¤Ë²Ã¤¨¤Æ¡¢¸Ä¡¹¤Î\fBCallSite\fR + (¸Ä¡¹¤Î²¾ÁÛ¥á¥â¥ê¡¼¡¦¥ê¡¼¥¸¥ç¥ó¤ª¤è¤Ó¤½¤Î¥³¥ß¥Ã¥ÈºÑ¥ê¡¼¥¸¥ç¥ó)¤Ë¤è¤ë¥á¥â¥ê¡¼»ÈÍѾõ¶·¤òÄÉÀפ·¤Þ¤¹¡£ + .RE + .RE +@@ -975,13 +999,14 @@ + .RS 4 + ¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤È¤­¤Ë¼Â¹Ô¤¹¤ë¡¢¥«¥¹¥¿¥à¡¦¥³¥Þ¥ó¥É¤Þ¤¿¤Ï°ìÏ¢¤Î¥»¥ß¥³¥í¥ó¶èÀÚ¤ê¤Î¥³¥Þ¥ó¥É¤òÀßÄꤷ¤Þ¤¹¡£Ê¸»úÎó¤Ë¶õÇò¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fI\-XX:OnError\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥¢¡¦¥¤¥á¡¼¥¸¤òºîÀ®¤¹¤ë¤¿¤á¤Ë\fIgcore\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëÊýË¡¡¢¤ª¤è¤Ó¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤Î¾ì¹ç¤Ë¥Ç¥Ð¥Ã¥¬¤òµ¯Æ°¤·¤Æ¥×¥í¥»¥¹¤ËÀܳ¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(\fI%p\fR¤Ï¸½ºß¤Î¥×¥í¥»¥¹¤ò»ØÄꤷ¤Þ¤¹)¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fB\-XX:OnError\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥¢¡¦¥¤¥á¡¼¥¸¤òºîÀ®¤¹¤ë¤¿¤á¤Ë\fBgcore\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëÊýË¡¡¢¤ª¤è¤Ó¥ê¥«¥Ð¥êÉÔǽ¤Ê¥¨¥é¡¼¤Î¾ì¹ç¤Ë¥Ç¥Ð¥Ã¥¬¤òµ¯Æ°¤·¤Æ¥×¥í¥»¥¹¤ËÀܳ¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(\fB%p\fR¤Ï¸½ºß¤Î¥×¥í¥»¥¹¤ò»ØÄꤷ¤Þ¤¹)¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-XX:OnError="gcore %p;dbx \- %p" ++\fB\-XX:OnError="gcore %p;dbx \- %p"\fR ++ + .fi + .if n \{\ + .RE +@@ -990,17 +1015,22 @@ + .PP + \-XX:OnOutOfMemoryError=\fIstring\fR + .RS 4 +-\fIOutOfMemoryError\fRÎã³°¤¬ºÇ½é¤Ë¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤Ë¼Â¹Ô¤¹¤ë¡¢¥«¥¹¥¿¥à¡¦¥³¥Þ¥ó¥É¤Þ¤¿¤Ï°ìÏ¢¤Î¥»¥ß¥³¥í¥ó¶èÀÚ¤ê¤Î¥³¥Þ¥ó¥É¤òÀßÄꤷ¤Þ¤¹¡£Ê¸»úÎó¤Ë¶õÇò¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥Éʸ»úÎó¤ÎÎã¤Ï¡¢\fI\-XX:OnError\fR¥ª¥×¥·¥ç¥ó¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBOutOfMemoryError\fRÎã³°¤¬ºÇ½é¤Ë¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤Ë¼Â¹Ô¤¹¤ë¡¢¥«¥¹¥¿¥à¡¦¥³¥Þ¥ó¥É¤Þ¤¿¤Ï°ìÏ¢¤Î¥»¥ß¥³¥í¥ó¶èÀÚ¤ê¤Î¥³¥Þ¥ó¥É¤òÀßÄꤷ¤Þ¤¹¡£Ê¸»úÎó¤Ë¶õÇò¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥Éʸ»úÎó¤ÎÎã¤Ï¡¢\fB\-XX:OnError\fR¥ª¥×¥·¥ç¥ó¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-XX:+PrintCommandLineFlags + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ëɽ¼¨¤µ¤ì¤¿¡¢¿Í´Ö¹©³ØŪ¤ËÁªÂò¤·¤¿JVM¥Õ¥é¥°¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥Ò¡¼¥×Îΰ襵¥¤¥º¤äÁªÂò¤µ¤ì¤¿¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ê¤É¡¢JVM¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤¿¥¨¥ë¥´¥Î¥ß¥Ã¥¯Ãͤò³Îǧ¤¹¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Õ¥é¥°¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ëɽ¼¨¤µ¤ì¤¿¡¢¿Í´Ö¹©³ØŪ¤ËÁªÂò¤·¤¿JVM¥Õ¥é¥°¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥Ò¡¼¥×Îΰ襵¥¤¥º¤äÁªÂò¤µ¤ì¤¿¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ê¤É¡¢JVM¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤¿¥¨¥ë¥´¥Î¥ß¥Ã¥¯Ãͤò³Îǧ¤¹¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Õ¥é¥°¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .PP + \-XX:+PrintNMTStatistics + .RS 4 +-¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¤¬Í­¸ú¤Ê¾ì¹ç¤Ë¡¢JVM¤Î½ªÎ»»þ¤Ë¼ý½¸¤µ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¡¦¥Ç¡¼¥¿¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹(\fI\-XX:NativeMemoryTracking\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¡¦¥Ç¡¼¥¿¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£ ++¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¤¬Í­¸ú¤Ê¾ì¹ç¤Ë¡¢JVM¤Î½ªÎ»»þ¤Ë¼ý½¸¤µ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¡¦¥Ç¡¼¥¿¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹(\fB\-XX:NativeMemoryTracking\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥â¥ê¡¼¤Î¥È¥é¥Ã¥­¥ó¥°¡¦¥Ç¡¼¥¿¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:+RelaxAccessControlCheck ++.RS 4 ++¥Ù¥ê¥Õ¥¡¥¤¥¢Æâ¤Î¥¢¥¯¥»¥¹À©¸æ¥Á¥§¥Ã¥¯¤ÎÎ̤ò¸º¤é¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢ºÇ¶á¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤Ï̵»ë¤µ¤ì¤Þ¤¹(¤Ä¤Þ¤ê¡¢Ìµ¸ú¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹)¡£¸Å¤¤¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥¤¥È¥³¡¼¥É¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤òÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:+ShowMessageBoxOnError +@@ -1010,7 +1040,7 @@ + .PP + \-XX:ThreadStackSize=\fIsize\fR + .RS 4 +-¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϥץé¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ ++¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϥץé¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1095,14 +1125,15 @@ + .RS 4 + .\} + .nf +-\-XX:ThreadStackSize=1m +-\-XX:ThreadStackSize=1024k +-\-XX:ThreadStackSize=1048576 ++\fB\-XX:ThreadStackSize=1m\fR ++\fB\-XX:ThreadStackSize=1024k\fR ++\fB\-XX:ThreadStackSize=1048576\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xss\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xss\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-XX:+TraceClassLoading +@@ -1132,14 +1163,14 @@ + .PP + \-XX:+UseAltSigs + .RS 4 +-JVMÆâÉô¥·¥°¥Ê¥ë¤Î\fISIGUSR1\fR¤ª¤è¤Ó\fISIGUSR2\fR¤Î¤«¤ï¤ê¤Ë¡¢ÂåÂØ¥·¥°¥Ê¥ë¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢ÂåÂØ¥·¥°¥Ê¥ë¤Ï»ÈÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xusealtsigs\fR¤ÈƱÅù¤Ç¤¹¡£ ++JVMÆâÉô¥·¥°¥Ê¥ë¤Î\fBSIGUSR1\fR¤ª¤è¤Ó\fBSIGUSR2\fR¤Î¤«¤ï¤ê¤Ë¡¢ÂåÂØ¥·¥°¥Ê¥ë¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢ÂåÂØ¥·¥°¥Ê¥ë¤Ï»ÈÍѤµ¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xusealtsigs\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-XX:+UseBiasedLocking + .RS 4 + ¥Ð¥¤¥¢¥¹¡¦¥í¥Ã¥¯¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤«¤Ê¤ê¤ÎÎ̤ÎÈ󶥹ç¤ÎƱ´ü²½¤¬¤¢¤ë°ìÉô¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¤³¤Î¥Õ¥é¥°¤òÍ­¸ú¤Ë¤¹¤ë¤ÈÂçÉý¤Ê¹â®²½¤¬¼Â¸½¤·¤Þ¤¹¤¬¡¢ÆÃÄê¤Î¥Ñ¥¿¡¼¥ó¤Î¥í¥Ã¥¯¤¬¤¢¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢Â®ÅÙ¤¬Äã²¼¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¥Ð¥¤¥¢¥¹¡¦¥í¥Ã¥¯¤ÎÊýË¡¤Î¾ÜºÙ¤Ï¡¢http://www\&.oracle\&.com/technetwork/java/tuning\-139912\&.html#section4\&.2\&.5¤Ë¤¢¤ëJava¥Á¥å¡¼¥Ë¥ó¥°¤Î¥Û¥ï¥¤¥È¡¦¥Ú¡¼¥Ñ¡¼¤ÎÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Ð¥¤¥¢¥¹¡¦¥í¥Ã¥¯¤Ï»ÈÍѤµ¤ì¤Þ¤»¤ó¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseCompressedOops +@@ -1151,19 +1182,19 @@ + .PP + \-XX:+UseLargePages + .RS 4 +-Â礭¤¤¥Ú¡¼¥¸¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Â礭¤¤¥Ú¡¼¥¸¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseLargePages\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++Â礭¤¤¥Ú¡¼¥¸¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Â礭¤¤¥Ú¡¼¥¸¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseLargePages\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + ¾ÜºÙ¤Ï¡¢http://www\&.oracle\&.com/technetwork/java/javase/tech/largememory\-jsp\-137182\&.html¤Ë¤¢¤ëÂ礭¤¤¥á¥â¥ê¡¼¡¦¥Ú¡¼¥¸ÍѤÎJava¥µ¥Ý¡¼¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-XX:+UseMembar + .RS 4 +-¥¹¥ì¥Ã¥É¤Î¾õÂÖ¤ÎÁ«°Ü¤Ç¥á¥ó¥Ð¡¼¤Îȯ¹Ô¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëPower PC¤ª¤è¤ÓARM¥µ¡¼¥Ð¡¼¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Power PC¤ÈARM¤Î¥¹¥ì¥Ã¥É¾õÂÖÁ«°Ü¤ËÂФ¹¤ë¥á¥ó¥Ð¡¼¤Îȯ¹Ô¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseMembar\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥¹¥ì¥Ã¥É¤Î¾õÂÖ¤ÎÁ«°Ü¤Ç¥á¥ó¥Ð¡¼¤Îȯ¹Ô¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ëARM¥µ¡¼¥Ð¡¼¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¾å¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£(ARM¥µ¡¼¥Ð¡¼¤Ç¤³¤Î¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£) + .RE + .PP + \-XX:+UsePerfData + .RS 4 +-\fIperfdata\fRµ¡Ç½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢JVM¤Î¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¡¦¥Æ¥¹¥È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤ò̵¸ú¤Ë¤¹¤ë¤È¡¢\fIhsperfdata_userid\fR¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤òÍÞÀ©¤·¤Þ¤¹¡£\fIperfdata\fRµ¡Ç½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UsePerfData\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBperfdata\fRµ¡Ç½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢JVM¤Î¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¡¦¥Æ¥¹¥È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤ò̵¸ú¤Ë¤¹¤ë¤È¡¢\fBhsperfdata_userid\fR¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤òÍÞÀ©¤·¤Þ¤¹¡£\fBperfdata\fRµ¡Ç½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UsePerfData\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-XX:+AllowUserSignalHandlers +@@ -1187,530 +1218,20 @@ + .RS 4 + .\} + .nf +-\-XX:AllocateInstancePrefetchLines=1 ++\fB\-XX:AllocateInstancePrefetchLines=1\fR ++ + .fi + .if n \{\ + .RE + .\} +-.RE +-.PP +-\-XX:AllocatePrefetchInstr=\fIinstruction\fR +-.RS 4 +-³äÅö¤Æ¥Ý¥¤¥ó¥¿¤ÎÁ°¤Ë¥×¥ê¥Õ¥§¥Ã¥Á¤¹¤ë¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤òÀßÄꤷ¤Þ¤¹¡£»ÈÍѲÄǽ¤ÊÃͤÏ0¤«¤é3¤Þ¤Ç¤Ç¤¹¡£ÃͤÎÇظå¤Ë¤¢¤ë¼ÂºÝ¤ÎÌ¿Îá¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤Ï0¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:AllocatePrefetchInstr=0 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:AllocatePrefetchStepSize=\fIsize\fR +-.RS 4 +-½ç¼¡¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤Î¥¹¥Æ¥Ã¥×¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¥Æ¥Ã¥×¡¦¥µ¥¤¥º¤Ï16¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:AllocatePrefetchStepSize=16 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+BackgroundCompilation +-.RS 4 +-¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-BackgroundCompilation\fR¤ò»ØÄꤷ¤Þ¤¹(¤³¤ì¤Ï\fI\-Xbatch\fR¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤Ç¤¹)¡£ +-.RE +-.PP +-\-XX:CICompilerCount=\fIthreads\fR +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤Ë»ÈÍѤ¹¤ë¥³¥ó¥Ñ¥¤¥é¡¦¥¹¥ì¥Ã¥É¤Î¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¿ô¤Ï¡¢¥µ¡¼¥Ð¡¼JVM¤Î¾ì¹ç¤Ï2¡¢¥¯¥é¥¤¥¢¥ó¥ÈJVM¤Î¾ì¹ç¤Ï1¤ËÀßÄꤵ¤ì¤Æ¤ª¤ê¡¢ÁØ¥³¥ó¥Ñ¥¤¥ë¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥³¥¢¿ô¤Ë¹ç¤»¤ÆÁý¸º¤·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¤Î¿ô¤ò2¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CICompilerCount=2 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CodeCacheMinimumFreeSpace=\fIsize\fR +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤ËɬÍפʺǾ®¶õ¤­Îΰè(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£ºÇ¾®¶õ¤­Îΰè¤è¤ê¾¯¤Ê¤¤Îΰ褷¤«»Ä¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥ë¤ÏÄä»ß¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï500KB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢ºÇ¾®¶õ¤­Îΰè¤ò1024MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CodeCacheMinimumFreeSpace=1024m +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] +-.RS 4 +-¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é\fIString\fR¥¯¥é¥¹¤Î\fIindexOf()\fR¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=exclude,java/lang/String\&.indexOf +-.fi +-.if n \{\ +-.RE +-.\} +-¥¹¥é¥Ã¥·¥å(\fI/\fR)¤Ç¶èÀÚ¤é¤ì¤¿¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¡¢´°Á´¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ÀÚ¼è¤ê¤ÈŽÉÕ¤±¤ÎÁàºî¤òÍưפˤ¹¤ë¤¿¤á¤Ë¡¢\fI\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥á¥½¥Ã¥É̾¤Î·Á¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf +-.fi +-.if n \{\ +-.RE +-.\} +-½ð̾¤Ê¤·¤Ç¥á¥½¥Ã¥É¤ò»ØÄꤹ¤ë¤È¡¢¥³¥Þ¥ó¥É¤Ï»ØÄꤷ¤¿Ì¾Á°¤ò»ý¤Ä¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ËŬÍѤµ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë·Á¼°¤Ç¥á¥½¥Ã¥É¤Î½ð̾¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é\fIString\fR¥¯¥é¥¹¤Î\fIindexOf(String)\fR¥á¥½¥Ã¥É¤Î¤ß½ü³°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=exclude,java/lang/String\&.indexOf(Ljava/lang/String;)I +-.fi +-.if n \{\ +-.RE +-.\} +-¤Þ¤¿¡¢¥¯¥é¥¹Ì¾¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤Ë¥ï¥¤¥ë¥É¥«¡¼¥É¤È¤·¤Æ¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ò»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î¤¹¤Ù¤Æ¤Î\fIindexOf()\fR¥á¥½¥Ã¥É¤ò½ü³°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=exclude,*\&.indexOf +-.fi +-.if n \{\ +-.RE +-.\} +-¥«¥ó¥Þ¤È¥Ô¥ê¥ª¥É¤Ï¶õÇò¤ÎÊÌ̾¤Ç¡¢¤³¤ì¤Ë¤è¤ê¡¢¥·¥§¥ë¤ò²ð¤·¤Æ¥³¥ó¥Ñ¥¤¥é¡¦¥³¥Þ¥ó¥É¤òÅϤ¹¤³¤È¤¬Íưפˤʤê¤Þ¤¹¡£°ú¿ô¤ò°úÍÑÉä¤Ç°Ï¤à¤³¤È¤Ç¡¢¶õÇò¤ò¥»¥Ñ¥ì¡¼¥¿¤È¤·¤Æ»ÈÍѤ·¤Æ\fI\-XX:CompileCommand\fR¤Ë°ú¿ô¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand="exclude java/lang/String indexOf" +-.fi +-.if n \{\ +-.RE +-.\} +-\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¤ÇÅϤµ¤ì¤¿¥³¥Þ¥ó¥É¤ò²òÀϤ·¤¿¸å¤Ë¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï\fI\&.hotspot_compiler\fR¥Õ¥¡¥¤¥ë¤«¤é¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¥³¥Þ¥ó¥É¤òÄɲ乤뤫¡¢¤Þ¤¿¤Ï\fI\-XX:CompileCommandFile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ̤Υե¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ +-.sp +-Ê£¿ô¤Î¥³¥Þ¥ó¥É¤òÄɲ乤ë¤Ë¤Ï¡¢\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄꤹ¤ë¤«¡¢¤Þ¤¿¤Ï²þ¹Ô¥»¥Ñ¥ì¡¼¥¿(\fI\en\fR)¤ò»ÈÍѤ·¤Æ³Æ°ú¿ô¤ò¶èÀÚ¤ê¤Þ¤¹¡£¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤǤ­¤Þ¤¹¡£ +-.PP +-break +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤ÎºÇ½é¤ËÄä»ß¤¹¤ë¤¿¤á¤Ë¡¢JVM¤Î¥Ç¥Ð¥Ã¥°»þ¤Î¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-compileonly +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò½ü¤¤¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ò¡¢¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤·¤Þ¤¹¡£Ê̤ÎÊýË¡¤È¤·¤Æ¡¢\fI\-XX:CompileOnly\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ£¿ô¤Î¥á¥½¥Ã¥É¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-dontinline +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥¤¥ó¥é¥¤¥ó²½¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£ +-.RE +-.PP +-exclude +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤·¤Þ¤¹¡£ +-.RE +-.PP +-help +-.RS 4 +-\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò°õºþ¤·¤Þ¤¹¡£ +-.RE +-.PP +-inline +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥¤¥ó¥é¥¤¥ó²½¤·¤è¤¦¤È¤·¤Þ¤¹¡£ +-.RE +-.PP +-log +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ËÂФ·¤Æ¡¢(\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ)¥³¥ó¥Ñ¥¤¥ë¡¦¥í¥®¥ó¥°¤ò½ü³°¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤Ë¥í¥®¥ó¥°¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ +-.RE +-.PP +-option +-.RS 4 +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢ºÇ¸å¤Î°ú¿ô(\fIoption\fR)¤Î¤«¤ï¤ê¤Ë¡¢»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ËJIT¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤òÅϤ¹¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢¥á¥½¥Ã¥É̾¤Î¸å¤ÎËöÈø¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIStringBuffer\fR¥¯¥é¥¹¤Î\fIappend()\fR¥á¥½¥Ã¥É¤ËÂФ·¤Æ\fIBlockLayoutByFrequency\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency +-.fi +-.if n \{\ +-.RE +-.\} +-¥«¥ó¥Þ¤Þ¤¿¤Ï¶õÇò¤Ç¶èÀڤäơ¢Ê£¿ô¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-print +-.RS 4 +-»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¸å¤ËÀ¸À®¤µ¤ì¤¿¥¢¥»¥ó¥Ö¥é¡¦¥³¡¼¥É¤ò½ÐÎϤ·¤Þ¤¹¡£ +-.RE +-.PP +-quiet +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ë¡¦¥³¥Þ¥ó¥É¤ò½ÐÎϤ·¤Þ¤»¤ó¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄꤷ¤¿¥³¥Þ¥ó¥É¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIString\fR¥¯¥é¥¹¤Î\fIindexOf()\fR¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤¹¤ë¾ì¹ç¡¢¼¡¤¬É¸½à½ÐÎϤ˽ÐÎϤµ¤ì¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-CompilerOracle: exclude java/lang/String\&.indexOf +-.fi +-.if n \{\ +-.RE +-.\} +-¾¤Î\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ÎÁ°¤Ë\fI\-XX:CompileCommand=quiet\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¤³¤ì¤òÍÞÀ©¤Ç¤­¤Þ¤¹¡£ +-.RE +-.RE +-.PP +-\-XX:CompileCommandFile=\fIfilename\fR +-.RS 4 +-JIT¥³¥ó¥Ñ¥¤¥é¡¦¥³¥Þ¥ó¥É¤ÎÆɼè¤ê¸µ¤Î¥Õ¥¡¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼Â¹Ô¤µ¤ì¤ë¥³¥Þ¥ó¥É¤ò³ÊǼ¤¹¤ë¤¿¤á¤Ë¡¢\fI\&.hotspot_compiler\fR¥Õ¥¡¥¤¥ë¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ +-.sp +-¥³¥Þ¥ó¥É¡¦¥Õ¥¡¥¤¥ë¤Î³Æ¹Ô¤Ï¡¢¥³¥Þ¥ó¥É¤¬»ÈÍѤµ¤ì¤ë¥³¥Þ¥ó¥É¡¢¥¯¥é¥¹Ì¾¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤òɽ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¹Ô¤Ï¡¢\fIString\fR¥¯¥é¥¹¤Î\fItoString()\fR¥á¥½¥Ã¥É¤ËÂФ·¤Æ¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤ò½ÐÎϤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-print java/lang/String toString +-.fi +-.if n \{\ +-.RE +-.\} +-¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤¹¤ëJIT¥³¥ó¥Ñ¥¤¥é¤Î¥³¥Þ¥ó¥É¤Î»ØÄê¤Î¾ÜºÙ¤Ï¡¢\fI\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.RE +-.PP +-\-XX:CompileOnly=\fImethods\fR +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤òÀ©¸Â¤¹¤ë(¥«¥ó¥Þ¤Ç¶èÀÚ¤é¤ì¤¿)¥á¥½¥Ã¥É¤Î¥ê¥¹¥È¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¤ß¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£´°Á´¥¯¥é¥¹Ì¾(¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à)¤Ç³Æ¥á¥½¥Ã¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIString\fR¥¯¥é¥¹¤Î\fIlength()\fR¥á¥½¥Ã¥É¤ª¤è¤Ó\fIList\fR¥¯¥é¥¹¤Î\fIsize()\fR¥á¥½¥Ã¥É¤Î¤ß¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size +-.fi +-.if n \{\ +-.RE +-.\} +-¥¹¥é¥Ã¥·¥å(\fI/\fR)¤Ç¶èÀÚ¤é¤ì¤¿¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¡¢´°Á´¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ÀÚ¼è¤ê¤ÈŽÉÕ¤±¤ÎÁàºî¤òÍưפˤ¹¤ë¤¿¤á¤Ë¡¢\fI\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥á¥½¥Ã¥É̾¤Î·Á¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size +-.fi +-.if n \{\ +-.RE +-.\} +-¥ï¥¤¥ë¥É¥«¡¼¥É¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¤¬¡¢¥¯¥é¥¹Ì¾¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸Ì¾¤À¤±¤ò»ØÄꤷ¤Æ¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¡¢¥á¥½¥Ã¥É¤À¤±¤ò»ØÄꤷ¤ÆǤ°Õ¤Î¥¯¥é¥¹¤Î¤³¤Î̾Á°¤ò»ý¤Ä¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileOnly=java/lang/String +-\-XX:CompileOnly=java/lang +-\-XX:CompileOnly=\&.length +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CompileThreshold=\fIinvocations\fR +-.RS 4 +-¥³¥ó¥Ñ¥¤¥ëÁ°¤Ë²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¡¼¥Ð¡¼JVM¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï¡¢10,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¤Æ¡¢¸úΨŪ¤Ê¥³¥ó¥Ñ¥¤¥ë¤Î¤¿¤á¤Î¾ðÊó¤ò¼ý½¸¤·¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥ÈJVM¤Î¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÀßÄê¤Ï1,500¸Æ½Ð¤·¤Ç¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤ò5,000¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CompileThreshold=5000 +-.fi +-.if n \{\ +-.RE +-.\} +-\fI\-Xcomp\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¤ÎÁ°¤Ë¡¢Java¥á¥½¥Ã¥É¤Î²ò¼á¤ò´°Á´¤Ë̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+DoEscapeAnalysis +-.RS 4 +-¥¨¥¹¥±¡¼¥×ʬÀϤλÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥¨¥¹¥±¡¼¥×ʬÀϤλÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-DoEscapeAnalysis\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+FailOverToOldVerifier +-.RS 4 +-¿·¤·¤¤¥¿¥¤¥×¡¦¥Á¥§¥Ã¥«¤¬¼ºÇÔ¤·¤¿¾ì¹ç¤Î¡¢¸Å¤¤¥Ù¥ê¥Õ¥¡¥¤¥¢¤Ø¤Î¼«Æ°¥Õ¥§¥¤¥ë¥ª¡¼¥Ð¡¼¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢ºÇ¶á¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤Ï̵»ë¤µ¤ì¤Þ¤¹(¤Ä¤Þ¤ê¡¢Ìµ¸ú¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹)¡£¸Å¤¤¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥¤¥È¥³¡¼¥É¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤òÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:InitialCodeCacheSize=\fIsize\fR +-.RS 4 +-½é´ü¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ500KB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢½é´ü¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤ò32KB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:InitialCodeCacheSize=32k +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+Inline +-.RS 4 +-¥á¥½¥Ã¥É¤Î¥¤¥ó¥é¥¤¥ó²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¤¿¤á¤Ë¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥á¥½¥Ã¥É¤Î¥¤¥ó¥é¥¤¥ó²½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-Inline\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:InlineSmallCode=\fIsize\fR +-.RS 4 +-¥¤¥ó¥é¥¤¥ó²½¤¬É¬Íפʥ³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤ÎºÇÂ祳¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£»ØÄꤷ¤¿¥µ¥¤¥º¤è¤ê¾®¤µ¤¤¥µ¥¤¥º¤Î¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¤ß¤¬¡¢¥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇÂ祳¡¼¥É¡¦¥µ¥¤¥º¤Ï1000¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:InlineSmallCode=1000 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+LogCompilation +-.RS 4 +-¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë\fIhotspot\&.log\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤Î¥í¥®¥ó¥°¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fI\-XX:LogFile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢°Û¤Ê¤ë¥í¥°¡¦¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¤È̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤Ïµ­Ï¿¤µ¤ì¤Þ¤»¤ó¡£\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fI\-XX:UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.sp +-\fI\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤Ó¤Ë¡¢¥³¥ó¥½¡¼¥ë¤Ë½ÐÎϤµ¤ì¤¿¥á¥Ã¥»¡¼¥¸¤ò´Þ¤à¾ÜºÙ¤Ê¿ÇÃǽÐÎϤòÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:MaxInlineSize=\fIsize\fR +-.RS 4 +-¥¤¥ó¥é¥¤¥ó²½¤¹¤ë¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º¤Ï35¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:MaxInlineSize=35 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:MaxNodeLimit=\fInodes\fR +-.RS 4 +-ñ°ì¤Î¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë»þ¤Ë»ÈÍѤµ¤ì¤ë¥Î¡¼¥É¤ÎºÇÂç¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Î¡¼¥É¤ÎºÇÂç¿ô¤Ï65,000¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:MaxNodeLimit=65000 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:MaxTrivialSize=\fIsize\fR +-.RS 4 +-¥¤¥ó¥é¥¤¥ó²½¤¹¤ëñ½ã¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ã±½ã¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º¤Ï6¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:MaxTrivialSize=6 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+OptimizeStringConcat +-.RS 4 +-\fIString\fRÏ¢·ëÁàºî¤ÎºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fIString\fRÏ¢·ëÁàºî¤ÎºÇŬ²½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-OptimizeStringConcat\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+PrintAssembly +-.RS 4 +-³°Éô¤Î\fIdisassembler\&.so\fR¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ·¤Æ¡¢¥Ð¥¤¥È¥³¡¼¥É²½¤µ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¤Î¥á¥½¥Ã¥É¤Î¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢À¸À®¤µ¤ì¤¿¥³¡¼¥É¤òɽ¼¨¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ÎÌäÂê¤Î¿ÇÃǤËÌòΩ¤Á¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£\fI\-XX:+PrintAssembly\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fI\-XX:UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+PrintCompilation +-.RS 4 +-¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤Ó¤Ë¡¢¥³¥ó¥½¡¼¥ë¤Ë¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢JVM¤«¤é¤Î¾ÜºÙ¤Ê¿ÇÃǽÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¼ÂºÝ¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¥á¥½¥Ã¥É¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¿ÇÃǽÐÎϤϰõºþ¤µ¤ì¤Þ¤»¤ó¡£ +-.sp +-\fI\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤ò¥Õ¥¡¥¤¥ë¤Ëµ­Ï¿¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+PrintInlining +-.RS 4 +-¥¤¥ó¥é¥¤¥ó²½¤Î·èÄêÆâÍƤνÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤ë¥á¥½¥Ã¥É¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥¤¥ó¥é¥¤¥ó²½¾ðÊó¤Ï½ÐÎϤµ¤ì¤Þ¤»¤ó¡£\fI\-XX:+PrintInlining\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fI\-XX:+UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+RelaxAccessControlCheck +-.RS 4 +-¥Ù¥ê¥Õ¥¡¥¤¥¢Æâ¤Î¥¢¥¯¥»¥¹À©¸æ¥Á¥§¥Ã¥¯¤ÎÎ̤ò¸º¤é¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢ºÇ¶á¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤Ï̵»ë¤µ¤ì¤Þ¤¹(¤Ä¤Þ¤ê¡¢Ìµ¸ú¤È¤·¤Æ½èÍý¤µ¤ì¤Þ¤¹)¡£¸Å¤¤¥Ð¡¼¥¸¥ç¥ó¤Î¥Ð¥¤¥È¥³¡¼¥É¤ò»ÈÍѤ·¤¿¥¯¥é¥¹¤Ë¤Ï¡¢¤³¤ì¤òÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:ReservedCodeCacheSize=\fIsize\fR +-.RS 4 +-JIT¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤ÎºÇÂ祳¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xmaxjitcodesize\fR¤ÈƱÅù¤Ç¤¹¡£ +-.RE +-.PP +-\-XX:+TieredCompilation +-.RS 4 +-ÁØ¥³¥ó¥Ñ¥¤¥ë¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢ÁØ¥³¥ó¥Ñ¥¤¥ë¤Ï»ÈÍѤµ¤ì¤Þ¤»¤ó¡£ +-.RE +-.PP +-\-XX:+UseCodeCacheFlushing +-.RS 4 +-¥³¥ó¥Ñ¥¤¥é¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ëÁ°¤Ë¡¢¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¤Î¥Õ¥é¥Ã¥·¥å¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥é¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ëÁ°¤Ë¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¤Î¥Õ¥é¥Ã¥·¥å¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï\fI\-XX:\-UseCodeCacheFlushing\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+UseCondCardMark +-.RS 4 +-¥«¡¼¥Éɽ¤Î¹¹¿·Á°¤Ë¡¢¥«¡¼¥É¤¬¤¹¤Ç¤Ë¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Î¥Á¥§¥Ã¥¯¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢Ê£¿ô¤Î¥½¥±¥Ã¥È¤ò»ý¤Ä¥Þ¥·¥ó¾å¤Ç¤Î¤ß»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢Æ±»þÁàºî¤Ë¤«¤Ê¤ê°Í¸¤·¤Æ¤¤¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤·¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+UseSuperWord +-.RS 4 +-¥¹¥«¥é¡¼±é»»¤Î¥¹¡¼¥Ñ¡¼¥ï¡¼¥É±é»»¤Ø¤ÎÊÑ´¹¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥¹¥«¥é¡¼±é»»¤Î¥¹¡¼¥Ñ¡¼¥ï¡¼¥É±é»»¤Ø¤ÎÊÑ´¹¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseSuperWord\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.SS "¹âÅ٤ʥµ¡¼¥Ó¥¹¥¢¥Ó¥ê¥Æ¥£¡¦¥ª¥×¥·¥ç¥ó" +-.PP +-¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥·¥¹¥Æ¥à¾ðÊó¤ò¼ý½¸¤·¡¢¾ÜºÙ¤Ê¥Ç¥Ð¥Ã¥°¤ò¼Â¹Ô¤¹¤ëµ¡Ç½¤òÄ󶡤·¤Þ¤¹¡£ +-.PP +-\-XX:+ExtendedDTraceProbes +-.RS 4 +-¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ë±Æ¶Á¤òÍ¿¤¨¤ëÄɲäÎ\fIdtrace\fR¥Ä¡¼¥ë¡¦¥×¥í¡¼¥Ö¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fIdtrace\fR¤Ïɸ½à¥×¥í¡¼¥Ö¤Î¤ß¤ò¼Â¹Ô¤·¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+HeapDumpOnOutOfMemory +-.RS 4 +-\fIjava\&.lang\&.OutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ë¡¢¥Ò¡¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥é(HPROF)¤ò»ÈÍѤ·¤Æ¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¥Õ¥¡¥¤¥ë¤Ø¤ÎJava¥Ò¡¼¥×¤Î¥À¥ó¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fI\-XX:HeapDumpPath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤ª¤è¤Ó̾Á°¤òÌÀ¼¨Åª¤ËÀßÄê¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢\fIOutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ë¥Ò¡¼¥×¤Ï¥À¥ó¥×¤µ¤ì¤Þ¤»¤ó¡£ +-.RE +-.PP +-\-XX:HeapDumpPath=\fIpath\fR +-.RS 4 +-\fI\-XX:+HeapDumpOnOutOfMemoryError\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Ò¡¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥é(HPROF)¤¬Ä󶡤¹¤ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò½ñ¤­¹þ¤à¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fIjava_pid\fR\fIpid\fR\fI\&.hprof\fR +-(\fIpid\fR¤Ï¥¨¥é¡¼¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥¡¥¤¥ë¤òÌÀ¼¨Åª¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(\fI%p\fR¤Ï¸½ºß¤Î¥×¥í¥»¥¹¤Î¼±Ê̻Ҥòɽ¤·¤Þ¤¹)¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:HeapDumpPath=\&./java_pid%p\&.hprof +-.fi +-.if n \{\ +-.RE +-.\} +-¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤ò\fI/var/log/java/java_heapdump\&.hprof\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:LogFile=\fIpath\fR +-.RS 4 +-¥í¥°¡¦¥Ç¡¼¥¿¤¬½ñ¤­¹þ¤Þ¤ì¤ë¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fIhotspot\&.log\fR¤Ç¤¹¡£ +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò\fI/var/log/java/hotspot\&.log\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:LogFile=/var/log/java/hotspot\&.log +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+PrintClassHistogram +-.RS 4 +-\fI[Control]+[C]\fR¥¤¥Ù¥ó¥È(\fISIGTERM\fR)¸å¤Ë¥¯¥é¥¹¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤Î¥Ò¥¹¥È¥°¥é¥à¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ +-.sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢\fIjmap \-histo\fR¥³¥Þ¥ó¥É¡¢¤Þ¤¿¤Ï\fIjcmd \fR\fIpid\fR\fI GC\&.class_histogram\fR¥³¥Þ¥ó¥É(\fIpid\fR¤Ï¸½ºß¤ÎJava¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+PrintConcurrentLocks +-.RS 4 +-.sp +-\fI[Control]+[C]\fR¥¤¥Ù¥ó¥È(\fISIGTERM\fR)¸å¤Ë\fIjava\&.util\&.concurrent\fR¥í¥Ã¥¯¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ +-.sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢\fIjstack \-l\fR¥³¥Þ¥ó¥É¡¢¤Þ¤¿¤Ï\fIjcmd \fR\fIpid\fR\fI Thread\&.print \-l\fR¥³¥Þ¥ó¥É(\fIpid\fR¤Ï¸½ºß¤ÎJava¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:+UnlockDiagnosticVMOptions +-.RS 4 +-JVM¤Î¿ÇÃǤòÌÜŪ¤È¤·¤¿¥ª¥×¥·¥ç¥ó¤ò¥¢¥ó¥í¥Ã¥¯¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¿ÇÃÇ¥ª¥×¥·¥ç¥ó¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ +-.RE +-.SS "¹âÅ٤ʥ¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥ª¥×¥·¥ç¥ó" +-.PP +-¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(GC)¤¬Java HotSpot VM¤Ë¤è¤Ã¤Æ¤É¤Î¤è¤¦¤Ë¼Â¹Ô¤µ¤ì¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹¡£ +-.PP +-\-XX:+AggressiveHeap +-.RS 4 +-Java¥Ò¡¼¥×¤ÎºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥³¥ó¥Ô¥å¡¼¥¿¤Î¹½À®(RAM¤ª¤è¤ÓCPU)¤Ë´ð¤Å¤¤¤Æ¡¢ÍÍ¡¹¤Ê¥Ñ¥é¥á¡¼¥¿¤¬¡¢¥á¥â¥ê¡¼³äÅö¤Æ¤¬½¸Ã椷¤¿Ä¹»þ´Ö¼Â¹Ô¥¸¥ç¥Ö¤ËºÇŬ¤Ë¤Ê¤ë¤è¤¦¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Ò¡¼¥×¤ÏºÇŬ²½¤µ¤ì¤Þ¤»¤ó¡£ ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-XX:AllocatePrefetchDistance=\fIsize\fR + .RS 4 + ¥ª¥Ö¥¸¥§¥¯¥È³äÅö¤Æ¤Î¥×¥ê¥Õ¥§¥Ã¥Áµ÷Î¥¤Î¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¿·µ¬¥ª¥Ö¥¸¥§¥¯¥È¤ÎÃͤǽñ¤­¹þ¤â¤¦¤È¤¹¤ë¥á¥â¥ê¡¼¤Ï¡¢ºÇ¸å¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¢¥É¥ì¥¹¤«¤é¡¢¤³¤Îµ÷Î¥¤Þ¤Ç¥×¥ê¥Õ¥§¥Ã¥Á¤µ¤ì¤Þ¤¹¡£³ÆJava¥¹¥ì¥Ã¥É¤Ë¤ÏÆȼ«¤Î³äÅö¤Æ¥Ý¥¤¥ó¥È¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +-Éé¤ÎÃͤϡ¢¥×¥ê¥Õ¥§¥Ã¥Áµ÷Î¥¤Ï¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤ë¤³¤È¤ò¼¨¤·¤Þ¤¹¡£Àµ¤ÎÃͤϡ¢¥×¥ê¥Õ¥§¥Ã¥Á¤¹¤ë¥Ð¥¤¥È¿ô¤Ç¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\-1¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++Éé¤ÎÃͤϡ¢¥×¥ê¥Õ¥§¥Ã¥Áµ÷Î¥¤Ï¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤ë¤³¤È¤ò¼¨¤·¤Þ¤¹¡£Àµ¤ÎÃͤϡ¢¥×¥ê¥Õ¥§¥Ã¥Á¤¹¤ë¥Ð¥¤¥È¿ô¤Ç¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\-1¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢¥×¥ê¥Õ¥§¥Ã¥Áµ÷Î¥¤ò1024¥Ð¥¤¥È¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -1718,11 +1239,30 @@ + .RS 4 + .\} + .nf +-\-XX:AllocatePrefetchDistance=1024 ++\fB\-XX:AllocatePrefetchDistance=1024\fR ++ + .fi + .if n \{\ + .RE + .\} ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:AllocatePrefetchInstr=\fIinstruction\fR ++.RS 4 ++³äÅö¤Æ¥Ý¥¤¥ó¥¿¤ÎÁ°¤Ë¥×¥ê¥Õ¥§¥Ã¥Á¤¹¤ë¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤òÀßÄꤷ¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£»ÈÍѲÄǽ¤ÊÃͤÏ0¤«¤é3¤Þ¤Ç¤Ç¤¹¡£ÃͤÎÇظå¤Ë¤¢¤ë¼ÂºÝ¤ÎÌ¿Îá¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤Ï0¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchInstr=0\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-XX:AllocatePrefetchLines=\fIlines\fR +@@ -1735,11 +1275,30 @@ + .RS 4 + .\} + .nf +-\-XX:AllocatePrefetchLines=5 ++\fB\-XX:AllocatePrefetchLines=5\fR ++ + .fi + .if n \{\ + .RE + .\} ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:AllocatePrefetchStepSize=\fIsize\fR ++.RS 4 ++½ç¼¡¥×¥ê¥Õ¥§¥Ã¥ÁÌ¿Îá¤Î¥¹¥Æ¥Ã¥×¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¥Æ¥Ã¥×¡¦¥µ¥¤¥º¤Ï16¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchStepSize=16\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-XX:AllocatePrefetchStyle=\fIstyle\fR +@@ -1765,16 +1324,565 @@ + .RS 4 + ³äÅö¤Æ¥×¥ê¥Õ¥§¥Ã¥ÁÍѤÎSPARC¤ÇBISÌ¿Îá¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE ++.sp ++Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+BackgroundCompilation ++.RS 4 ++¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¡¦¥³¥ó¥Ñ¥¤¥ë¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-BackgroundCompilation\fR¤ò»ØÄꤷ¤Þ¤¹(¤³¤ì¤Ï\fB\-Xbatch\fR¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤Ç¤¹)¡£ ++.RE ++.PP ++\-XX:CICompilerCount=\fIthreads\fR ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ë¤Ë»ÈÍѤ¹¤ë¥³¥ó¥Ñ¥¤¥é¡¦¥¹¥ì¥Ã¥É¤Î¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¿ô¤Ï¡¢¥µ¡¼¥Ð¡¼JVM¤Î¾ì¹ç¤Ï2¡¢¥¯¥é¥¤¥¢¥ó¥ÈJVM¤Î¾ì¹ç¤Ï1¤ËÀßÄꤵ¤ì¤Æ¤ª¤ê¡¢ÁØ¥³¥ó¥Ñ¥¤¥ë¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥³¥¢¿ô¤Ë¹ç¤»¤ÆÁý¸º¤·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¤Î¿ô¤ò2¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CICompilerCount=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CodeCacheMinimumFreeSpace=\fIsize\fR ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ë¤ËɬÍפʺǾ®¶õ¤­Îΰè(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£ºÇ¾®¶õ¤­Îΰè¤è¤ê¾¯¤Ê¤¤Îΰ褷¤«»Ä¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥ë¤ÏÄä»ß¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï500KB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢ºÇ¾®¶õ¤­Îΰè¤ò1024MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CodeCacheMinimumFreeSpace=1024m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] ++.RS 4 ++¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é\fBString\fR¥¯¥é¥¹¤Î\fBindexOf()\fR¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥¹¥é¥Ã¥·¥å(\fB/\fR)¤Ç¶èÀÚ¤é¤ì¤¿¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¡¢´°Á´¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ÀÚ¼è¤ê¤ÈŽÉÕ¤±¤ÎÁàºî¤òÍưפˤ¹¤ë¤¿¤á¤Ë¡¢\fB\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥á¥½¥Ã¥É̾¤Î·Á¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++½ð̾¤Ê¤·¤Ç¥á¥½¥Ã¥É¤ò»ØÄꤹ¤ë¤È¡¢¥³¥Þ¥ó¥É¤Ï»ØÄꤷ¤¿Ì¾Á°¤ò»ý¤Ä¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ËŬÍѤµ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë·Á¼°¤Ç¥á¥½¥Ã¥É¤Î½ð̾¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢°ú¿ô¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¡¢°Ï¤Þ¤Ê¤¤¤È¡¢¥·¥§¥ë¤Ë¤è¤ê¥»¥ß¥³¥í¥ó¤¬¥³¥Þ¥ó¥É¤Î½ªÎ»¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é\fBString\fR¥¯¥é¥¹¤Î\fBindexOf(String)\fR¥á¥½¥Ã¥É¤Î¤ß½ü³°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude,java/lang/String\&.indexOf,(Ljava/lang/String;)I"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¤Þ¤¿¡¢¥¯¥é¥¹Ì¾¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤Ë¥ï¥¤¥ë¥É¥«¡¼¥É¤È¤·¤Æ¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ò»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥ë¸µ¤«¤é¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î¤¹¤Ù¤Æ¤Î\fBindexOf()\fR¥á¥½¥Ã¥É¤ò½ü³°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,*\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥«¥ó¥Þ¤È¥Ô¥ê¥ª¥É¤Ï¶õÇò¤ÎÊÌ̾¤Ç¡¢¤³¤ì¤Ë¤è¤ê¡¢¥·¥§¥ë¤ò²ð¤·¤Æ¥³¥ó¥Ñ¥¤¥é¡¦¥³¥Þ¥ó¥É¤òÅϤ¹¤³¤È¤¬Íưפˤʤê¤Þ¤¹¡£°ú¿ô¤ò°úÍÑÉä¤Ç°Ï¤à¤³¤È¤Ç¡¢¶õÇò¤ò¥»¥Ñ¥ì¡¼¥¿¤È¤·¤Æ»ÈÍѤ·¤Æ\fB\-XX:CompileCommand\fR¤Ë°ú¿ô¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude java/lang/String indexOf"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥Þ¥ó¥É¹Ô¤ÇÅϤµ¤ì¤¿¥³¥Þ¥ó¥É¤ò²òÀϤ·¤¿¸å¤Ë¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï\fB\&.hotspot_compiler\fR¥Õ¥¡¥¤¥ë¤«¤é¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¥³¥Þ¥ó¥É¤òÄɲ乤뤫¡¢¤Þ¤¿¤Ï\fB\-XX:CompileCommandFile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ̤Υե¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.sp ++Ê£¿ô¤Î¥³¥Þ¥ó¥É¤òÄɲ乤ë¤Ë¤Ï¡¢\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄꤹ¤ë¤«¡¢¤Þ¤¿¤Ï²þ¹Ô¥»¥Ñ¥ì¡¼¥¿(\fB\en\fR)¤ò»ÈÍѤ·¤Æ³Æ°ú¿ô¤ò¶èÀÚ¤ê¤Þ¤¹¡£¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++.PP ++break ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤ÎºÇ½é¤ËÄä»ß¤¹¤ë¤¿¤á¤Ë¡¢JVM¤Î¥Ç¥Ð¥Ã¥°»þ¤Î¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ ++.RE ++.PP ++compileonly ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò½ü¤¤¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ò¡¢¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤·¤Þ¤¹¡£Ê̤ÎÊýË¡¤È¤·¤Æ¡¢\fB\-XX:CompileOnly\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ£¿ô¤Î¥á¥½¥Ã¥É¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++dontinline ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥¤¥ó¥é¥¤¥ó²½¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£ ++.RE ++.PP ++exclude ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤·¤Þ¤¹¡£ ++.RE ++.PP ++help ++.RS 4 ++\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò°õºþ¤·¤Þ¤¹¡£ ++.RE ++.PP ++inline ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò¥¤¥ó¥é¥¤¥ó²½¤·¤è¤¦¤È¤·¤Þ¤¹¡£ ++.RE ++.PP ++log ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ËÂФ·¤Æ¡¢(\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ)¥³¥ó¥Ñ¥¤¥ë¡¦¥í¥®¥ó¥°¤ò½ü³°¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤Ë¥í¥®¥ó¥°¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ ++.RE ++.PP ++option ++.RS 4 ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢ºÇ¸å¤Î°ú¿ô(\fIoption\fR)¤Î¤«¤ï¤ê¤Ë¡¢»ØÄꤷ¤¿¥á¥½¥Ã¥É¤ËJIT¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤òÅϤ¹¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢¥á¥½¥Ã¥É̾¤Î¸å¤ÎËöÈø¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBStringBuffer\fR¥¯¥é¥¹¤Î\fBappend()\fR¥á¥½¥Ã¥É¤ËÂФ·¤Æ\fBBlockLayoutByFrequency\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥«¥ó¥Þ¤Þ¤¿¤Ï¶õÇò¤Ç¶èÀڤäơ¢Ê£¿ô¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++print ++.RS 4 ++»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¸å¤ËÀ¸À®¤µ¤ì¤¿¥¢¥»¥ó¥Ö¥é¡¦¥³¡¼¥É¤ò½ÐÎϤ·¤Þ¤¹¡£ ++.RE ++.PP ++quiet ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ë¡¦¥³¥Þ¥ó¥É¤ò½ÐÎϤ·¤Þ¤»¤ó¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄꤷ¤¿¥³¥Þ¥ó¥É¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBString\fR¥¯¥é¥¹¤Î\fBindexOf()\fR¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤«¤é½ü³°¤¹¤ë¾ì¹ç¡¢¼¡¤¬É¸½à½ÐÎϤ˽ÐÎϤµ¤ì¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompilerOracle: exclude java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¾¤Î\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ÎÁ°¤Ë\fB\-XX:CompileCommand=quiet\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¤³¤ì¤òÍÞÀ©¤Ç¤­¤Þ¤¹¡£ ++.RE ++.RE ++.PP ++\-XX:CompileCommandFile=\fIfilename\fR ++.RS 4 ++JIT¥³¥ó¥Ñ¥¤¥é¡¦¥³¥Þ¥ó¥É¤ÎÆɼè¤ê¸µ¤Î¥Õ¥¡¥¤¥ë¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼Â¹Ô¤µ¤ì¤ë¥³¥Þ¥ó¥É¤ò³ÊǼ¤¹¤ë¤¿¤á¤Ë¡¢\fB\&.hotspot_compiler\fR¥Õ¥¡¥¤¥ë¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++.sp ++¥³¥Þ¥ó¥É¡¦¥Õ¥¡¥¤¥ë¤Î³Æ¹Ô¤Ï¡¢¥³¥Þ¥ó¥É¤¬»ÈÍѤµ¤ì¤ë¥³¥Þ¥ó¥É¡¢¥¯¥é¥¹Ì¾¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤òɽ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¹Ô¤Ï¡¢\fBString\fR¥¯¥é¥¹¤Î\fBtoString()\fR¥á¥½¥Ã¥É¤ËÂФ·¤Æ¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤ò½ÐÎϤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBprint java/lang/String toString\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤¹¤ëJIT¥³¥ó¥Ñ¥¤¥é¤Î¥³¥Þ¥ó¥É¤Î»ØÄê¤Î¾ÜºÙ¤Ï¡¢\fB\-XX:CompileCommand\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.RE ++.PP ++\-XX:CompileOnly=\fImethods\fR ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ë¤òÀ©¸Â¤¹¤ë(¥«¥ó¥Þ¤Ç¶èÀÚ¤é¤ì¤¿)¥á¥½¥Ã¥É¤Î¥ê¥¹¥È¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥á¥½¥Ã¥É¤Î¤ß¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£´°Á´¥¯¥é¥¹Ì¾(¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à)¤Ç³Æ¥á¥½¥Ã¥É¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBString\fR¥¯¥é¥¹¤Î\fBlength()\fR¥á¥½¥Ã¥É¤ª¤è¤Ó\fBList\fR¥¯¥é¥¹¤Î\fBsize()\fR¥á¥½¥Ã¥É¤Î¤ß¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥¹¥é¥Ã¥·¥å(\fB/\fR)¤Ç¶èÀÚ¤é¤ì¤¿¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¡¢´°Á´¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ÀÚ¼è¤ê¤ÈŽÉÕ¤±¤ÎÁàºî¤òÍưפˤ¹¤ë¤¿¤á¤Ë¡¢\fB\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥á¥½¥Ã¥É̾¤Î·Á¼°¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¥ï¥¤¥ë¥É¥«¡¼¥É¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¤¬¡¢¥¯¥é¥¹Ì¾¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸Ì¾¤À¤±¤ò»ØÄꤷ¤Æ¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¡¢¥á¥½¥Ã¥É¤À¤±¤ò»ØÄꤷ¤ÆǤ°Õ¤Î¥¯¥é¥¹¤Î¤³¤Î̾Á°¤ò»ý¤Ä¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\fR ++\fB\-XX:CompileOnly=java/lang\fR ++\fB\-XX:CompileOnly=\&.length\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileThreshold=\fIinvocations\fR ++.RS 4 ++¥³¥ó¥Ñ¥¤¥ëÁ°¤Ë²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥µ¡¼¥Ð¡¼JVM¤Ç¤Ï¡¢JIT¥³¥ó¥Ñ¥¤¥é¤Ï¡¢10,000¤Î²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¼Â¹Ô¤·¤Æ¡¢¸úΨŪ¤Ê¥³¥ó¥Ñ¥¤¥ë¤Î¤¿¤á¤Î¾ðÊó¤ò¼ý½¸¤·¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥ÈJVM¤Î¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÀßÄê¤Ï1,500¸Æ½Ð¤·¤Ç¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢²ò¼á¤µ¤ì¤¿¥á¥½¥Ã¥É¸Æ½Ð¤·¤Î¿ô¤ò5,000¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileThreshold=5000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fB\-Xcomp\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¤ÎÁ°¤Ë¡¢Java¥á¥½¥Ã¥É¤Î²ò¼á¤ò´°Á´¤Ë̵¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+DoEscapeAnalysis ++.RS 4 ++¥¨¥¹¥±¡¼¥×ʬÀϤλÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥¨¥¹¥±¡¼¥×ʬÀϤλÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-DoEscapeAnalysis\fR¤ò»ØÄꤷ¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:InitialCodeCacheSize=\fIsize\fR ++.RS 4 ++½é´ü¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ500KB¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢½é´ü¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤ò32KB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialCodeCacheSize=32k\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+Inline ++.RS 4 ++¥á¥½¥Ã¥É¤Î¥¤¥ó¥é¥¤¥ó²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¤¿¤á¤Ë¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥á¥½¥Ã¥É¤Î¥¤¥ó¥é¥¤¥ó²½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-Inline\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:InlineSmallCode=\fIsize\fR ++.RS 4 ++¥¤¥ó¥é¥¤¥ó²½¤¬É¬Íפʥ³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤ÎºÇÂ祳¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£»ØÄꤷ¤¿¥µ¥¤¥º¤è¤ê¾®¤µ¤¤¥µ¥¤¥º¤Î¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¤ß¤¬¡¢¥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇÂ祳¡¼¥É¡¦¥µ¥¤¥º¤Ï1000¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InlineSmallCode=1000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+LogCompilation ++.RS 4 ++¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë\fBhotspot\&.log\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤Î¥í¥®¥ó¥°¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fB\-XX:LogFile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢°Û¤Ê¤ë¥í¥°¡¦¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¤È̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤Ïµ­Ï¿¤µ¤ì¤Þ¤»¤ó¡£\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fB\-XX:UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.sp ++\fB\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤Ó¤Ë¡¢¥³¥ó¥½¡¼¥ë¤Ë½ÐÎϤµ¤ì¤¿¥á¥Ã¥»¡¼¥¸¤ò´Þ¤à¾ÜºÙ¤Ê¿ÇÃǽÐÎϤòÍ­¸ú²½¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:MaxInlineSize=\fIsize\fR ++.RS 4 ++¥¤¥ó¥é¥¤¥ó²½¤¹¤ë¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º¤Ï35¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxInlineSize=35\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxNodeLimit=\fInodes\fR ++.RS 4 ++ñ°ì¤Î¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë»þ¤Ë»ÈÍѤµ¤ì¤ë¥Î¡¼¥É¤ÎºÇÂç¿ô¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Î¡¼¥É¤ÎºÇÂç¿ô¤Ï65,000¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxNodeLimit=65000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxTrivialSize=\fIsize\fR ++.RS 4 ++¥¤¥ó¥é¥¤¥ó²½¤¹¤ëñ½ã¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ã±½ã¥á¥½¥Ã¥É¤ÎºÇÂç¥Ð¥¤¥È¥³¡¼¥É¡¦¥µ¥¤¥º¤Ï6¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxTrivialSize=6\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+OptimizeStringConcat ++.RS 4 ++\fBString\fRÏ¢·ëÁàºî¤ÎºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fBString\fRÏ¢·ëÁàºî¤ÎºÇŬ²½¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-OptimizeStringConcat\fR¤ò»ØÄꤷ¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+PrintAssembly ++.RS 4 ++³°Éô¤Î\fBdisassembler\&.so\fR¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ·¤Æ¡¢¥Ð¥¤¥È¥³¡¼¥É²½¤µ¤ì¤¿¥Í¥¤¥Æ¥£¥Ö¤Î¥á¥½¥Ã¥É¤Î¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢À¸À®¤µ¤ì¤¿¥³¡¼¥É¤òɽ¼¨¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ÎÌäÂê¤Î¿ÇÃǤËÌòΩ¤Á¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥¢¥»¥ó¥Ö¥ê¡¦¥³¡¼¥É¤Ï°õºþ¤µ¤ì¤Þ¤»¤ó¡£\fB\-XX:+PrintAssembly\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fB\-XX:UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+PrintCompilation ++.RS 4 ++¥á¥½¥Ã¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤Ó¤Ë¡¢¥³¥ó¥½¡¼¥ë¤Ë¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢JVM¤«¤é¤Î¾ÜºÙ¤Ê¿ÇÃǽÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¼ÂºÝ¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¥á¥½¥Ã¥É¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¿ÇÃǽÐÎϤϰõºþ¤µ¤ì¤Þ¤»¤ó¡£ ++.sp ++\fB\-XX:+LogCompilation\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥³¥ó¥Ñ¥¤¥ë¡¦¥¢¥¯¥Æ¥£¥Ó¥Æ¥£¤ò¥Õ¥¡¥¤¥ë¤Ëµ­Ï¿¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+PrintInlining ++.RS 4 ++¥¤¥ó¥é¥¤¥ó²½¤Î·èÄêÆâÍƤνÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥¤¥ó¥é¥¤¥ó²½¤µ¤ì¤ë¥á¥½¥Ã¥É¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥¤¥ó¥é¥¤¥ó²½¾ðÊó¤Ï½ÐÎϤµ¤ì¤Þ¤»¤ó¡£\fB\-XX:+PrintInlining\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¿ÇÃÇJVM¥ª¥×¥·¥ç¥ó¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë\fB\-XX:+UnlockDiagnosticVMOptions\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:ReservedCodeCacheSize=\fIsize\fR ++.RS 4 ++JIT¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤ÎºÇÂ祳¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xmaxjitcodesize\fR¤ÈƱÅù¤Ç¤¹¡£ ++.RE ++.PP ++\-XX:+TieredCompilation ++.RS 4 ++ÁØ¥³¥ó¥Ñ¥¤¥ë¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseAES ++.RS 4 ++Intel¡¢AMD¤ª¤è¤ÓSPARC¥Ï¡¼¥É¥¦¥§¥¢¤ËÂФ·¤Æ¡¢¥Ï¡¼¥É¥¦¥§¥¢¥Ù¡¼¥¹¤ÎAESÁȹþ¤ß¤òÍ­¸ú²½¤·¤Þ¤¹¡£Intel Westmere (2010°Ê¹ß)¡¢AMD Bulldozer (2011°Ê¹ß)¤ª¤è¤ÓSPARC (T4°Ê¹ß)¤¬¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ï¡¼¥É¥¦¥§¥¢¤Ç¤¹¡£UseAES¤Ï¡¢UseAESIntrinsics¤È¤È¤â¤Ë»ÈÍѤ·¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseAESIntrinsics ++.RS 4 ++UseAES¤ÈUseAESIntrinsics¥Õ¥é¥°¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú²½¤µ¤ì¤Æ¤ª¤ê¡¢Java HotSpot Server VM 32¥Ó¥Ã¥È¤ª¤è¤Ó64¥Ó¥Ã¥È¤ËÂФ·¤Æ¤Î¤ß¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ï¡¼¥É¥¦¥§¥¢¥Ù¡¼¥¹¤ÎAESÁȹþ¤ß¤ò̵¸ú²½¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseAES \-XX:\-UseAESIntrinsics\fR¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢AES¤òÍ­¸ú²½¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥Õ¥é¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:+UseAES \-XX:+UseAESIntrinsics\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++32¥Ó¥Ã¥È¤ª¤è¤Ó64¥Ó¥Ã¥È¤ËÂФ·¤ÆUseAES¤ª¤è¤ÓUseAESIntrinsics¥Õ¥é¥°¤ò¥µ¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢\fB\-server\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆJava HotSpot Server VM¤òÁªÂò¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥é¥°¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥ÈVM¤Ç¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:+UseCodeCacheFlushing ++.RS 4 ++¥³¥ó¥Ñ¥¤¥é¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ëÁ°¤Ë¡¢¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¤Î¥Õ¥é¥Ã¥·¥å¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥é¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ëÁ°¤Ë¥³¡¼¥É¡¦¥­¥ã¥Ã¥·¥å¤Î¥Õ¥é¥Ã¥·¥å¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï\fB\-XX:\-UseCodeCacheFlushing\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseCondCardMark ++.RS 4 ++¥«¡¼¥Éɽ¤Î¹¹¿·Á°¤Ë¡¢¥«¡¼¥É¤¬¤¹¤Ç¤Ë¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Î¥Á¥§¥Ã¥¯¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢Ê£¿ô¤Î¥½¥±¥Ã¥È¤ò»ý¤Ä¥Þ¥·¥ó¾å¤Ç¤Î¤ß»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢Æ±»þÁàºî¤Ë¤«¤Ê¤ê°Í¸¤·¤Æ¤¤¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤·¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseSuperWord ++.RS 4 ++¥¹¥«¥é¡¼±é»»¤Î¥¹¡¼¥Ñ¡¼¥ï¡¼¥É±é»»¤Ø¤ÎÊÑ´¹¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥¹¥«¥é¡¼±é»»¤Î¥¹¡¼¥Ñ¡¼¥ï¡¼¥É±é»»¤Ø¤ÎÊÑ´¹¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseSuperWord\fR¤ò»ØÄꤷ¤Þ¤¹¡£Java HotSpot Server VM¤Î¤ß¤¬¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.SS "»î¸³Åª¤ÊJIT¥³¥ó¥Ñ¥¤¥é¡¦¥ª¥×¥·¥ç¥ó" ++.PP ++¤³¤Î¹à¤ÎRestricted Transactional Memory (RTM)¤Î¥í¥Ã¥¯µ¡Ç½¤Ë´ØÏ¢¤¹¤ë¥ª¥×¥·¥ç¥ó¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢Java SE 8u20¤ÇÀµ¼°¤Ë¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤ì¤é¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fB\-XX:+UnlockExperimentalVMOptions\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Transactional Synchronization Extensions (TSX)¤ò¥µ¥Ý¡¼¥È¤¹¤ëx86 CPU¾å¤ÎJava HotSpot Server VM¤ËÂФ·¤Æ¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ ++.PP ++\-XX:RTMAbortRatio=\fIabort_ratio\fR ++.RS 4 ++RTMÃæ»ßΨ¤Ï¡¢¤¹¤Ù¤Æ¤Î¼Â¹ÔºÑRTM¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸(%)¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹¡£Ãæ»ß¤µ¤ì¤¿¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¿ô¤¬¤³¤ÎΨ¤òĶ¤¨¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤¬ÈóºÇŬ²½¤µ¤ì¤Þ¤¹¡£¤³¤ÎΨ¤Ï¡¢\fB\-XX:+UseRTMDeopt\fR¥ª¥×¥·¥ç¥ó¤¬Í­¸ú¤Ê¾ì¹ç¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏ50¤Ç¤¹¡£¤Ä¤Þ¤ê¡¢¤¹¤Ù¤Æ¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Î50%¤¬Ãæ»ß¤µ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤¬ÈóºÇŬ²½¤µ¤ì¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:RTMRetryCount=\fInumber_of_retries\fR ++.RS 4 ++Ãæ»ß¤Þ¤¿¤Ï¥Ó¥¸¡¼¤Î¾ì¹ç¡¢RTM¥í¥Ã¥¯¡¦¥³¡¼¥É¤Ï¡¢É¸½à¤Î¥í¥Ã¥¯¡¦¥á¥«¥Ë¥º¥à¤Ë¥Õ¥©¡¼¥ë¥Ð¥Ã¥¯¤¹¤ëÁ°¤Ë¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿²ó¿ôºÆ»î¹Ô¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏ5¤Ç¤¹¡£\fB\-XX:UseRTMLocking\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseRTMDeopt ++.RS 4 ++Ãæ»ßΨ¤Ë±þ¤¸¤Æ¡¢RTM¥í¥Ã¥¯¤ò¼«Æ°Ä´À°¤·¤Þ¤¹¡£¤³¤ÎΨ¤Ï¡¢\fB\-XX:RTMAbortRatio\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤Þ¤¹¡£Ãæ»ß¤µ¤ì¤¿¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¿ô¤¬Ãæ»ßΨ¤òĶ¤¨¤¿¾ì¹ç¡¢¥í¥Ã¥¯¤ò´Þ¤à¥á¥½¥Ã¥É¤¬¤¹¤Ù¤Æ¤Î¥í¥Ã¥¯¤Çɸ½à¤Î¥í¥Ã¥¯¤È¤·¤ÆÈóºÇŬ²½¤ª¤è¤ÓºÆ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fB\-XX:UseRTMLocking\fR¥ª¥×¥·¥ç¥ó¤òÍ­¸ú²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UseRTMLocking ++.RS 4 ++¥Õ¥©¡¼¥ë¥Ð¥Ã¥¯¡¦¥Ï¥ó¥É¥é¤È¤·¤Æɸ½à¤Î¥í¥Ã¥¯¡¦¥á¥«¥Ë¥º¥à¤ò»ÈÍѤ·¤Æ¡¢Å¸³«¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥í¥Ã¥¯¤ËÂФ·¤ÆRestricted Transactional Memory (RTM)¥í¥Ã¥¯¡¦¥³¡¼¥É¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ++.sp ++RTM¤Ï¡¢x86Ì¿Î᥻¥Ã¥È³ÈÄ¥¤Ç¥Þ¥ë¥Á¥¹¥ì¥Ã¥É¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎºîÀ®¤òÍưפˤ¹¤ëIntel¤ÎTransactional Synchronization Extensions (TSX)¤Î°ìÉô¤Ç¤¹¡£RTM¤Ç¤Ï¡¢¿·¤·¤¤Ì¿Îá ++\fBXBEGIN\fR¡¢\fBXABORT\fR¡¢\fBXEND\fR¤ª¤è¤Ó\fBXTEST\fR¤¬Æ³Æþ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fBXBEGIN\fR¤ª¤è¤Ó\fBXEND\fRÌ¿Îá¤Ï¡¢¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤È¤·¤Æ¼Â¹Ô¤¹¤ë¤¿¤á¤ÎÌ¿Î᥻¥Ã¥È¤ò°Ï¤ß¤Þ¤¹¡£¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Î¼Â¹Ô»þ¤Ë¶¥¹ç¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥á¥â¥ê¡¼¤È¥ì¥¸¥¹¥¿¤ÎÊѹ¹¤¬¡¢\fBXEND\fRÌ¿Îá¤ÇƱ»þ¤Ë¥³¥ß¥Ã¥È¤µ¤ì¤Þ¤¹¡£\fBXABORT\fRÌ¿Îá¤Ç¤Ï¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤òÌÀ¼¨Åª¤ËÃæ»ß¤Ç¤­¡¢\fBXEND\fRÌ¿Îá¤Ç¤ÏÌ¿Î᥻¥Ã¥È¤¬¥È¥é¥ó¥¶¥¯¥·¥ç¥óÆâ¤Ç¼Â¹ÔÃ椫¤É¤¦¤«¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£ ++.sp ++¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Î¥í¥Ã¥¯¤Ï¡¢Ê̤Υ¹¥ì¥Ã¥É¤¬Æ±¤¸¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Ë¥¢¥¯¥»¥¹¤·¤è¤¦¤È¤·¤¿¤È¤­¤ËŸ³«¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¤½¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Ø¤Î¥¢¥¯¥»¥¹¤òºÇ½é¤Ë¥ê¥¯¥¨¥¹¥È¤·¤Ê¤«¤Ã¤¿¥¹¥ì¥Ã¥É¤Ï¥Ö¥í¥Ã¥¯¤µ¤ì¤Þ¤¹¡£RTM¤Ç¤Ï¡¢¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤¬Ãæ»ß¤Þ¤¿¤Ï¼ºÇÔ¤·¤¿¾ì¹ç¤Î¤¿¤á¤Ë¡¢¥Õ¥©¡¼¥ë¥Ð¥Ã¥¯¤ÎÁàºî¥»¥Ã¥È¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£RTM¥í¥Ã¥¯¤È¤Ï¡¢TSX¤Î¥·¥¹¥Æ¥à¤Ë°Ñ¾ù¤µ¤ì¤Æ¤¤¤ë¥í¥Ã¥¯¤Ç¤¹¡£ ++.sp ++RTM¤Ë¤è¤ê¡¢½ÅÍפʥ꡼¥¸¥ç¥ó¤Ë¤ª¤¤¤Æ¾×Æͤ¬¾¯¤Ê¤¯¶¥¹çÅ٤ι⤤¥í¥Ã¥¯¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤¬¸þ¾å¤µ¤ì¤Þ¤¹(¤³¤ì¤Ï¡¢Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤Ë¤è¤Ã¤ÆƱ»þ¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¥³¡¼¥É¤Ç¤¹)¡£¤Þ¤¿¡¢RTM¤Ë¤è¤ê¡¢ÁÆγÅÙ¥í¥Ã¥¯¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤â¸þ¾å¤µ¤ì¤Þ¤¹¤¬¡¢°ìÈÌŪ¤Ë¥Þ¥ë¥Á¥¹¥ì¥Ã¥É¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ï¤è¤¯¤¢¤ê¤Þ¤»¤ó¡£(ÁÆγÅÙ¥í¥Ã¥¯¤È¤Ï¡¢¥í¥Ã¥¯¤Î¼èÆÀ¤ª¤è¤Ó²òÊü¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤òºÇ¾®²½¤¹¤ë¤¿¤á¤ËŤ¤´ü´Ö¥í¥Ã¥¯¤òÊÝ»ý¤¹¤ëÀïά¤Ç¤¢¤ê¡¢°ìÊý¡¢ºÙγÅÙ¥í¥Ã¥¯¤È¤ÏɬÍפʾì¹ç¤Î¤ß¥í¥Ã¥¯¤·²Äǽ¤Ê¤«¤®¤êÁá´ü¤Ë¥í¥Ã¥¯²ò½ü¤¹¤ë¤³¤È¤ÇºÇÂç¸Â¤ÎʹԽèÍý¤ÎãÀ®¤ò»î¤ß¤ëÀïά¤Ç¤¹¡£)¤µ¤é¤Ë¡¢°Û¤Ê¤ë¥¹¥ì¥Ã¥É¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤Æ¤¤¤ë·ÚÅ٤ʶ¥¹ç¥í¥Ã¥¯¤Î¾ì¹ç¡¢RTM¤Ë¤è¤ê¡¢¸í¤Ã¤¿¥­¥ã¥Ã¥·¥å¡¦¥é¥¤¥ó¶¦Í­(¥­¥ã¥Ã¥·¥å¡¦¥é¥¤¥ó¡¦¥Ô¥ó¥Ý¥ó¤È¤â¸Æ¤Ð¤ì¤ë)¤òºï¸º¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢°Û¤Ê¤ë¥×¥í¥»¥Ã¥µ¤«¤é¤ÎÊ£¿ô¤Î¥¹¥ì¥Ã¥É¤¬°Û¤Ê¤ë¥ê¥½¡¼¥¹¤Ë¥¢¥¯¥»¥¹¤·¤Æ¤¤¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¤¬¡¢¥ê¥½¡¼¥¹¤ÏƱ¤¸¥­¥ã¥Ã¥·¥å¡¦¥é¥¤¥ó¤ò¶¦Í­¤·¤Þ¤¹¡£·ë²Ì¤È¤·¤Æ¡¢¥×¥í¥»¥Ã¥µ¤Ï¾¤Î¥×¥í¥»¥Ã¥µ¤Î¥­¥ã¥Ã¥·¥å¡¦¥é¥¤¥ó¤ò·«¤êÊÖ¤·Ìµ¸ú¤Ë¤·¡¢¤³¤ì¤Ë¤è¤ê¡¢¥­¥ã¥Ã¥·¥å¤Ç¤Ï¤Ê¤¯¥á¥¤¥ó¡¦¥á¥â¥ê¡¼¤«¤é¤ÎÆɼè¤ê¤¬¶¯À©¤µ¤ì¤Þ¤¹¡£ ++.RE ++.SS "¹âÅ٤ʥµ¡¼¥Ó¥¹¥¢¥Ó¥ê¥Æ¥£¡¦¥ª¥×¥·¥ç¥ó" ++.PP ++¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥·¥¹¥Æ¥à¾ðÊó¤ò¼ý½¸¤·¡¢¾ÜºÙ¤Ê¥Ç¥Ð¥Ã¥°¤ò¼Â¹Ô¤¹¤ëµ¡Ç½¤òÄ󶡤·¤Þ¤¹¡£ ++.PP ++\-XX:+ExtendedDTraceProbes ++.RS 4 ++¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ë±Æ¶Á¤òÍ¿¤¨¤ëÄɲäÎ\fBdtrace\fR¥Ä¡¼¥ë¡¦¥×¥í¡¼¥Ö¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fBdtrace\fR¤Ïɸ½à¥×¥í¡¼¥Ö¤Î¤ß¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+HeapDumpOnOutOfMemory ++.RS 4 ++\fBjava\&.lang\&.OutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ë¡¢¥Ò¡¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥é(HPROF)¤ò»ÈÍѤ·¤Æ¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¥Õ¥¡¥¤¥ë¤Ø¤ÎJava¥Ò¡¼¥×¤Î¥À¥ó¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fB\-XX:HeapDumpPath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤ª¤è¤Ó̾Á°¤òÌÀ¼¨Åª¤ËÀßÄê¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢\fBOutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ë¥Ò¡¼¥×¤Ï¥À¥ó¥×¤µ¤ì¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:HeapDumpPath=\fIpath\fR ++.RS 4 ++\fB\-XX:+HeapDumpOnOutOfMemoryError\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Ò¡¼¥×¡¦¥×¥í¥Õ¥¡¥¤¥é(HPROF)¤¬Ä󶡤¹¤ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò½ñ¤­¹þ¤à¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fBjava_pid\fR\fIpid\fR\fB\&.hprof\fR ++(\fIpid\fR¤Ï¥¨¥é¡¼¤Î¸¶°ø¤È¤Ê¤Ã¤¿¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤Ë¤Ê¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥¡¥¤¥ë¤òÌÀ¼¨Åª¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹(\fB%p\fR¤Ï¸½ºß¤Î¥×¥í¥»¥¹¤Î¼±Ê̻Ҥòɽ¤·¤Þ¤¹)¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=\&./java_pid%p\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤ò\fB/var/log/java/java_heapdump\&.hprof\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:LogFile=\fIpath\fR ++.RS 4 ++¥í¥°¡¦¥Ç¡¼¥¿¤¬½ñ¤­¹þ¤Þ¤ì¤ë¥Ñ¥¹¤ª¤è¤Ó¥Õ¥¡¥¤¥ë̾¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢Ì¾Á°¤Ï\fBhotspot\&.log\fR¤Ç¤¹¡£ ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò\fB/var/log/java/hotspot\&.log\fR¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:LogFile=/var/log/java/hotspot\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+PrintClassHistogram ++.RS 4 ++\fB[Control]+[C]\fR¥¤¥Ù¥ó¥È(\fBSIGTERM\fR)¸å¤Ë¥¯¥é¥¹¡¦¥¤¥ó¥¹¥¿¥ó¥¹¤Î¥Ò¥¹¥È¥°¥é¥à¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ ++.sp ++¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢\fBjmap \-histo\fR¥³¥Þ¥ó¥É¡¢¤Þ¤¿¤Ï\fBjcmd \fR\fIpid\fR\fB GC\&.class_histogram\fR¥³¥Þ¥ó¥É(\fIpid\fR¤Ï¸½ºß¤ÎJava¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+PrintConcurrentLocks ++.RS 4 ++¼¡¤Î°õºþ¤òÍ­¸ú²½¤·¤Þ¤¹: j ¥í¥Ã¥¯(¼¡¤Î¸å) \- ¥¤¥Ù¥ó¥È¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ ++.sp ++\fB[Control]+[C]\fR¥¤¥Ù¥ó¥È(\fBSIGTERM\fR)¸å¤Ë\fBjava\&.util\&.concurrent\fR¥í¥Ã¥¯¤Î°õºþ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ ++.sp ++¤³¤Î¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢\fBjstack \-l\fR¥³¥Þ¥ó¥É¡¢¤Þ¤¿¤Ï\fBjcmd \fR\fIpid\fR\fB Thread\&.print \-l\fR¥³¥Þ¥ó¥É(\fIpid\fR¤Ï¸½ºß¤ÎJava¥×¥í¥»¥¹¤Î¼±ÊÌ»Ò)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.RE ++.PP ++\-XX:+UnlockDiagnosticVMOptions ++.RS 4 ++JVM¤Î¿ÇÃǤòÌÜŪ¤È¤·¤¿¥ª¥×¥·¥ç¥ó¤ò¥¢¥ó¥í¥Ã¥¯¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¿ÇÃÇ¥ª¥×¥·¥ç¥ó¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++.RE ++.SS "¹âÅ٤ʥ¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥ª¥×¥·¥ç¥ó" ++.PP ++¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(GC)¤¬Java HotSpot VM¤Ë¤è¤Ã¤Æ¤É¤Î¤è¤¦¤Ë¼Â¹Ô¤µ¤ì¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹¡£ ++.PP ++\-XX:+AggressiveHeap ++.RS 4 ++Java¥Ò¡¼¥×¤ÎºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥³¥ó¥Ô¥å¡¼¥¿¤Î¹½À®(RAM¤ª¤è¤ÓCPU)¤Ë´ð¤Å¤¤¤Æ¡¢ÍÍ¡¹¤Ê¥Ñ¥é¥á¡¼¥¿¤¬¡¢¥á¥â¥ê¡¼³äÅö¤Æ¤¬½¸Ã椷¤¿Ä¹»þ´Ö¼Â¹Ô¥¸¥ç¥Ö¤ËºÇŬ¤Ë¤Ê¤ë¤è¤¦¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¢¤ê¡¢¥Ò¡¼¥×¤ÏºÇŬ²½¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .PP + \-XX:+AlwaysPreTouch + .RS 4 +-JVM¤Î½é´ü²½Ãæ¤ËJava¥Ò¡¼¥×¾å¤Î¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤Î¥¿¥Ã¥Á¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fImain()\fR¥á¥½¥Ã¥É¤ÎÆþÎÏÁ°¤Ë¡¢¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤¬¥á¥â¥ê¡¼¤Ë¼èÆÀ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ÊªÍý¥á¥â¥ê¡¼¤Ë¥Þ¥Ã¥×¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î²¾ÁÛ¥á¥â¥ê¡¼¤ò´Þ¤àĹ»þ´Ö¼Â¹Ô¤Î¥·¥¹¥Æ¥à¤ò¥·¥ß¥å¥ì¡¼¥È¤¹¤ë¥Æ¥¹¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢JVM¥Ò¡¼¥×Îΰ褬¤¤¤Ã¤Ñ¤¤¤Ë¤Ê¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤¬¥³¥ß¥Ã¥È¤µ¤ì¤Þ¤¹¡£ ++JVM¤Î½é´ü²½Ãæ¤ËJava¥Ò¡¼¥×¾å¤Î¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤Î¥¿¥Ã¥Á¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fBmain()\fR¥á¥½¥Ã¥É¤ÎÆþÎÏÁ°¤Ë¡¢¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤¬¥á¥â¥ê¡¼¤Ë¼èÆÀ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ÊªÍý¥á¥â¥ê¡¼¤Ë¥Þ¥Ã¥×¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î²¾ÁÛ¥á¥â¥ê¡¼¤ò´Þ¤àĹ»þ´Ö¼Â¹Ô¤Î¥·¥¹¥Æ¥à¤ò¥·¥ß¥å¥ì¡¼¥È¤¹¤ë¥Æ¥¹¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢JVM¥Ò¡¼¥×Îΰ褬¤¤¤Ã¤Ñ¤¤¤Ë¤Ê¤ë¤È¡¢¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤¬¥³¥ß¥Ã¥È¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-XX:+CMSClassUnloadingEnabled + .RS 4 +-ʹԥޡ¼¥¯¥¹¥¤¡¼¥×(CMS)¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ë¡¢¥¢¥ó¥í¡¼¥É¤¹¤ë¥¯¥é¥¹¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£CMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î¥¯¥é¥¹¡¦¥¢¥ó¥í¡¼¥É¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-CMSClassUnloadingEnabled\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++ʹԥޡ¼¥¯¥¹¥¤¡¼¥×(CMS)¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ë¡¢¥¢¥ó¥í¡¼¥É¤¹¤ë¥¯¥é¥¹¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£CMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î¥¯¥é¥¹¡¦¥¢¥ó¥í¡¼¥É¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-CMSClassUnloadingEnabled\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-XX:CMSExpAvgFactor=\fIpercent\fR +@@ -1785,79 +1893,8 @@ + .RS 4 + .\} + .nf +-\-XX:CMSExpAvgFactor=15 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CMSIncrementalDutyCycle=\fIpercent\fR +-.RS 4 +-ʹԥ³¥ì¥¯¥¿¤Î¼Â¹Ô¤¬µö²Ä¤µ¤ì¤Æ¤¤¤ë¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Î»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fI\-XX:+CMSIncrementalPacing\fR¤¬Í­¸ú¤Ê¾ì¹ç¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤¬¼«Æ°Åª¤ËÀßÄꤵ¤ì¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï½é´üÃͤΤߤòÀßÄꤷ¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Ï10%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò20%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CMSIncrementalDutyCycle=20 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:CMSIncrementalDutyCycleMin=\fIpercent\fR +-.RS 4 +-\fI\-XX:+CMSIncrementalPacing\fR¤¬Í­¸ú¤Ê¾ì¹ç¤Ë¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î²¼¸Â¤Ç¤¢¤ë¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Î»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î²¼¸Â¤Ï0%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢²¼¸Â¤ò10%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CMSIncrementalDutyCycleMin=10 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+CMSIncrementalMode +-.RS 4 +-CMS¥³¥ì¥¯¥¿¤ÎÁýʬ¥â¡¼¥É¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢2¤Ä°Ê²¼¤ÎGC¥¹¥ì¥Ã¥É¤ò»ý¤Ä¹½À®¤Ë¤Î¤ßÍ­¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fICMSIncremental\fR¤Ç»Ï¤Þ¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤¬Í­¸ú¤Ê¾ì¹ç¤Î¤ß¡¢Å¬ÍѤµ¤ì¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:CMSIncrementalOffset=\fIpercent\fR +-.RS 4 +-Áýʬ¥â¡¼¥É¤Î¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Ç´ü´ÖÆâ¤Ë±¦¤Ë°ÜÆ°¤¹¤ë»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥ª¥Õ¥»¥Ã¥È¤Ï0%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î¥ª¥Õ¥»¥Ã¥È¤ò25%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CMSIncrementalOffset=25 +-.fi +-.if n \{\ +-.RE +-.\} +-.RE +-.PP +-\-XX:+CMSIncrementalPacing +-.RS 4 +-JVM¤Î¼Â¹ÔÃæ¤Ë¼ý½¸¤µ¤ì¤¿Åý·×¤Ë´ð¤Å¤¤¤Æ¡¢Áýʬ¥â¡¼¥É¤Î¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î¼«Æ°Ä´À°¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Áýʬ¥â¡¼¥É¡¦¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î¼«Æ°Ä´À°¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-CMSIncrementalPacing\fR¤ò»ØÄꤷ¤Þ¤¹¡£ +-.RE +-.PP +-\-XX:CMSIncrementalSafetyFactor=\fIpercent\fR +-.RS 4 +-¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò·×»»¤¹¤ëºÝ¤Ë¡¢Êݼé¤òÄɲ乤뤿¤á¤Ë»ÈÍѤµ¤ì¤ë»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢°ÂÁ´·¸¿ô¤Ï10%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢°ÂÁ´·¸¿ô¤ò5%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-\-XX:CMSIncrementalSafetyFactor=5 ++\fB\-XX:CMSExpAvgFactor=15\fR ++ + .fi + .if n \{\ + .RE +@@ -1866,7 +1903,7 @@ + .PP + \-XX:CMSInitiatingOccupancyFraction=\fIpercent\fR + .RS 4 +-CMS¼ý½¸¥µ¥¤¥¯¥ë¤ò³«»Ï¤¹¤ë¸Å¤¤À¤Âå¤ÎÀêͭΨ(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\-1¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£Éé¤ÎÃÍ(¥Ç¥Õ¥©¥ë¥È¤ò´Þ¤à)¤Ï¡¢\fI\-XX:CMSTriggerRatio\fR¤¬³«»ÏÀêͭΨ¤ÎÃͤòÄêµÁ¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++CMS¼ý½¸¥µ¥¤¥¯¥ë¤ò³«»Ï¤¹¤ë¸Å¤¤À¤Âå¤ÎÀêͭΨ(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\-1¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£Éé¤ÎÃÍ(¥Ç¥Õ¥©¥ë¥È¤ò´Þ¤à)¤Ï¡¢\fB\-XX:CMSTriggerRatio\fR¤¬³«»ÏÀêͭΨ¤ÎÃͤòÄêµÁ¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢ÀêͭΨ¤ò20%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -1874,7 +1911,8 @@ + .RS 4 + .\} + .nf +-\-XX:CMSInitiatingOccupancyFraction=20 ++\fB\-XX:CMSInitiatingOccupancyFraction=20\fR ++ + .fi + .if n \{\ + .RE +@@ -1888,7 +1926,7 @@ + .PP + \-XX:CMSTriggerRatio=\fIpercent\fR + .RS 4 +-CMS¼ý½¸¥µ¥¤¥¯¥ë¤¬³«»Ï¤¹¤ëÁ°¤Ë³ä¤êÅö¤Æ¤é¤ì¤ë\fI\-XX:MinHeapFreeRatio\fR¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëÃͤγä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ80%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++CMS¼ý½¸¥µ¥¤¥¯¥ë¤¬³«»Ï¤¹¤ëÁ°¤Ë³ä¤êÅö¤Æ¤é¤ì¤ë\fB\-XX:MinHeapFreeRatio\fR¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëÃͤγä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ80%¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢ÀêͭΨ¤ò75%¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -1896,7 +1934,8 @@ + .RS 4 + .\} + .nf +-\-XX:CMSTriggerRatio=75 ++\fB\-XX:CMSTriggerRatio=75\fR ++ + .fi + .if n \{\ + .RE +@@ -1913,7 +1952,8 @@ + .RS 4 + .\} + .nf +-\-XX:ConcGCThreads=2 ++\fB\-XX:ConcGCThreads=2\fR ++ + .fi + .if n \{\ + .RE +@@ -1922,17 +1962,17 @@ + .PP + \-XX:+DisableExplicitGC + .RS 4 +-\fISystem\&.gc()\fR¤Î¸Æ½Ð¤·¤Î½èÍý¤ò̵¸ú¤Ë¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤Ï\fISystem\&.gc()\fR¤Ø¤Î¸Æ½Ð¤·¤¬½èÍý¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fISystem\&.gc()\fR¤Î¸Æ½Ð¤·¤Î½èÍý¤¬Ìµ¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢JVM¤ÏɬÍפ˱þ¤¸¤ÆGC¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBSystem\&.gc()\fR¤Î¸Æ½Ð¤·¤Î½èÍý¤ò̵¸ú¤Ë¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤Ï\fBSystem\&.gc()\fR¤Ø¤Î¸Æ½Ð¤·¤¬½èÍý¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fBSystem\&.gc()\fR¤Î¸Æ½Ð¤·¤Î½èÍý¤¬Ìµ¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢JVM¤ÏɬÍפ˱þ¤¸¤ÆGC¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .RE + .PP + \-XX:+ExplicitGCInvokesConcurrent + .RS 4 +-\fISystem\&.gc()\fR¥ê¥¯¥¨¥¹¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Ê¹ÔGC¤Î¸Æ½Ð¤·¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fI\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¾ì¹ç¤Î¤ß¡¢Í­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBSystem\&.gc()\fR¥ê¥¯¥¨¥¹¥È¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Ê¹ÔGC¤Î¸Æ½Ð¤·¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fB\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¾ì¹ç¤Î¤ß¡¢Í­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses + .RS 4 +-\fISystem\&.gc()\fR¥ê¥¯¥¨¥¹¥È¤ò»ÈÍѤ·¡¢Ê¹ÔGC¥µ¥¤¥¯¥ëÃæ¤Ë¥¯¥é¥¹¤ò¥¢¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Ê¹ÔGC¤Î¸Æ½Ð¤·¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fI\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¾ì¹ç¤Î¤ß¡¢Í­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBSystem\&.gc()\fR¥ê¥¯¥¨¥¹¥È¤ò»ÈÍѤ·¡¢Ê¹ÔGC¥µ¥¤¥¯¥ëÃæ¤Ë¥¯¥é¥¹¤ò¥¢¥ó¥í¡¼¥É¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢Ê¹ÔGC¤Î¸Æ½Ð¤·¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢\fB\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¾ì¹ç¤Î¤ß¡¢Í­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:G1HeapRegionSize=\fIsize\fR +@@ -1945,7 +1985,8 @@ + .RS 4 + .\} + .nf +-\-XX:G1HeapRegionSize=16m ++\fB\-XX:G1HeapRegionSize=16m\fR ++ + .fi + .if n \{\ + .RE +@@ -1967,7 +2008,8 @@ + .RS 4 + .\} + .nf +-\-XX:G1ReservePercent=20 ++\fB\-XX:G1ReservePercent=20\fR ++ + .fi + .if n \{\ + .RE +@@ -1976,7 +2018,7 @@ + .PP + \-XX:InitialHeapSize=\fIsize\fR + .RS 4 +-¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢0¡¢¤Þ¤¿¤Ï1MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Î¤¤¤º¤ì¤«¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢0¡¢¤Þ¤¿¤Ï1MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Î¤¤¤º¤ì¤«¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢³ä¤êÅö¤Æ¤é¤ì¤¿¥á¥â¥ê¡¼¤Î¥µ¥¤¥º¤òÍÍ¡¹¤Êñ°Ì¤ò»ÈÍѤ·¤Æ6MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -1984,19 +2026,20 @@ + .RS 4 + .\} + .nf +-\-XX:InitialHeapSize=6291456 +-\-XX:InitialHeapSize=6144k +-\-XX:InitialHeapSize=6m ++\fB\-XX:InitialHeapSize=6291456\fR ++\fB\-XX:InitialHeapSize=6144k\fR ++\fB\-XX:InitialHeapSize=6m\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò0¤ËÀßÄꤷ¤¿¾ì¹ç¡¢½é´ü¥µ¥¤¥º¤Ï¡¢¸Å¤¤À¤Âå¤È¼ã¤¤À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥µ¥¤¥º¤Î¹ç·×¤È¤·¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î¥µ¥¤¥º¤Ï¡¢\fI\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÀßÄê¤Ç¤­¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò0¤ËÀßÄꤷ¤¿¾ì¹ç¡¢½é´ü¥µ¥¤¥º¤Ï¡¢¸Å¤¤À¤Âå¤È¼ã¤¤À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¥µ¥¤¥º¤Î¹ç·×¤È¤·¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥Ò¡¼¥×¤Î¥µ¥¤¥º¤Ï¡¢\fB\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÀßÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-XX:InitialSurvivorRatio=\fIratio\fR + .RS 4 +-¥¹¥ë¡¼¥×¥Ã¥È¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤¬»ÈÍѤ¹¤ë¥µ¥Ð¥¤¥ÐÎΰè¤Î½é´üÈæ¤òÀßÄꤷ¤Þ¤¹(\fI\-XX:+UseParallelGC\fR¤ª¤è¤Ó/¤Þ¤¿¤Ï\fI\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹)¡£\fI\-XX:+UseParallelGC\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¹¥ë¡¼¥×¥Ã¥È¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ÇŬ±þ¥µ¥¤¥º»ØÄê¤ò¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤·¤Þ¤¹¡£½é´üÃͤ«¤é»Ï¤á¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÆ°ºî¤Ë½¾¤Ã¤Æ¡¢¥µ¥Ð¥¤¥ÐÎΰ褬¥µ¥¤¥ºÊѹ¹¤µ¤ì¤Þ¤¹¡£(\fI\-XX:\-UseAdaptiveSizePolicy\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ)Ŭ±þ¥µ¥¤¥º»ØÄê¤ò̵¸ú¤Ë¤·¤¿¾ì¹ç¡¢\fI\-XX:SurvivorRatio\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹ÔÁ´ÂΤΥµ¥Ð¥¤¥ÐÎΰè¤Î¥µ¥¤¥º¤òÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥¹¥ë¡¼¥×¥Ã¥È¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤¬»ÈÍѤ¹¤ë¥µ¥Ð¥¤¥ÐÎΰè¤Î½é´üÈæ¤òÀßÄꤷ¤Þ¤¹(\fB\-XX:+UseParallelGC\fR¤ª¤è¤Ó/¤Þ¤¿¤Ï\fB\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹)¡£\fB\-XX:+UseParallelGC\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¹¥ë¡¼¥×¥Ã¥È¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ÇŬ±þ¥µ¥¤¥º»ØÄê¤ò¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤·¤Þ¤¹¡£½é´üÃͤ«¤é»Ï¤á¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÆ°ºî¤Ë½¾¤Ã¤Æ¡¢¥µ¥Ð¥¤¥ÐÎΰ褬¥µ¥¤¥ºÊѹ¹¤µ¤ì¤Þ¤¹¡£(\fB\-XX:\-UseAdaptiveSizePolicy\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ)Ŭ±þ¥µ¥¤¥º»ØÄê¤ò̵¸ú¤Ë¤·¤¿¾ì¹ç¡¢\fB\-XX:SurvivorRatio\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹ÔÁ´ÂΤΥµ¥Ð¥¤¥ÐÎΰè¤Î¥µ¥¤¥º¤òÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + ¼¡¤Î¼°¤ò»ÈÍѤ·¤Æ¡¢¼ã¤¤À¤Âå¤Î¥µ¥¤¥º(Y)¤ª¤è¤Ó¥µ¥Ð¥¤¥ÐÎΰè¤Î½é´üÈæ(R)¤Ë´ð¤Å¤¤¤Æ¡¢¥µ¥Ð¥¤¥ÐÎΰè¤Î½é´ü¥µ¥¤¥º(S)¤ò·×»»¤Ç¤­¤Þ¤¹¡£ + .sp +@@ -2004,7 +2047,8 @@ + .RS 4 + .\} + .nf +-S=Y/(R+2) ++\fBS=Y/(R+2)\fR ++ + .fi + .if n \{\ + .RE +@@ -2019,7 +2063,8 @@ + .RS 4 + .\} + .nf +-\-XX:InitialSurvivorRatio=4 ++\fB\-XX:InitialSurvivorRatio=4\fR ++ + .fi + .if n \{\ + .RE +@@ -2036,7 +2081,8 @@ + .RS 4 + .\} + .nf +-\-XX:InitiatingHeapOccupancyPercent=75 ++\fB\-XX:InitiatingHeapOccupancyPercent=75\fR ++ + .fi + .if n \{\ + .RE +@@ -2053,7 +2099,8 @@ + .RS 4 + .\} + .nf +-\-XX:MaxGCPauseMillis=500 ++\fB\-XX:MaxGCPauseMillis=500\fR ++ + .fi + .if n \{\ + .RE +@@ -2062,7 +2109,7 @@ + .PP + \-XX:MaxHeapSize=\fIsize\fR + .RS 4 +-¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢2MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Ç¥×¥í¥¤¥á¥ó¥È¤Ç¤Ï¡¢\fI\-XX:InitialHeapSize\fR¤ª¤è¤Ó\fI\-XX:MaxHeapSize\fR¤ÏÄ̾ïƱ¤¸ÃͤËÀßÄꤵ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£»ØÄꤹ¤ëÃͤϡ¢2MB¤è¤êÂ礭¤¤1024¤ÎÇÜ¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¼Â¹Ô»þ¤Ë¥·¥¹¥Æ¥à¹½À®¤Ë´ð¤Å¤¤¤ÆÁªÂò¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Ç¥×¥í¥¤¥á¥ó¥È¤Ç¤Ï¡¢\fB\-XX:InitialHeapSize\fR¤ª¤è¤Ó\fB\-XX:MaxHeapSize\fR¤ÏÄ̾ïƱ¤¸ÃͤËÀßÄꤵ¤ì¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html¤Ë¤¢¤ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¡¦¥¨¥ë¥´¥Î¥ß¥Ã¥¯¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢³ä¤êÅö¤Æ¤é¤ì¤¿¥á¥â¥ê¡¼¤Îµö²Ä¤µ¤ì¤ëºÇÂ祵¥¤¥º¤òÍÍ¡¹¤Êñ°Ì¤ò»ÈÍѤ·¤Æ80MB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -2070,16 +2117,17 @@ + .RS 4 + .\} + .nf +-\-XX:MaxHeapSize=83886080 +-\-XX:MaxHeapSize=81920k +-\-XX:MaxHeapSize=80m ++\fB\-XX:MaxHeapSize=83886080\fR ++\fB\-XX:MaxHeapSize=81920k\fR ++\fB\-XX:MaxHeapSize=80m\fR ++ + .fi + .if n \{\ + .RE + .\} + Oracle Solaris 7¤ª¤è¤ÓOracle Solaris 8 SPARC¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¾ì¹ç¤Î¤³¤ÎÃͤξå¸Â¤Ï¡¢¤ª¤è¤½4,000MB¤«¤é¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤ÎÎ̤ò°ú¤¤¤¿¤â¤Î¤Ç¤¹¡£Oracle Solaris 2\&.6¤ª¤è¤Óx86¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¾ì¹ç¤Î¾å¸Â¤Ï¡¢¤ª¤è¤½2,000MB¤«¤é¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤ÎÎ̤ò°ú¤¤¤¿¤â¤Î¤Ç¤¹¡£Linux¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¾ì¹ç¤Î¾å¸Â¤Ï¡¢¤ª¤è¤½2,000MB¤«¤é¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤ÎÎ̤ò°ú¤¤¤¿¤â¤Î¤Ç¤¹¡£ + .sp +-\fI\-XX:MaxHeapSize\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xmx\fR¤ÈƱÅù¤Ç¤¹¡£ ++\fB\-XX:MaxHeapSize\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xmx\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-XX:MaxHeapFreeRatio=\fIpercent\fR +@@ -2092,7 +2140,8 @@ + .RS 4 + .\} + .nf +-\-XX:MaxHeapFreeRatio=75 ++\fB\-XX:MaxHeapFreeRatio=75\fR ++ + .fi + .if n \{\ + .RE +@@ -2109,7 +2158,8 @@ + .RS 4 + .\} + .nf +-\-XX:MaxMetaspaceSize=256m ++\fB\-XX:MaxMetaspaceSize=256m\fR ++ + .fi + .if n \{\ + .RE +@@ -2131,7 +2181,8 @@ + .RS 4 + .\} + .nf +-\-XX:MaxTenuringThreshold=10 ++\fB\-XX:MaxTenuringThreshold=10\fR ++ + .fi + .if n \{\ + .RE +@@ -2153,7 +2204,8 @@ + .RS 4 + .\} + .nf +-\-XX:MinHeapFreeRatio=25 ++\fB\-XX:MinHeapFreeRatio=25\fR ++ + .fi + .if n \{\ + .RE +@@ -2168,7 +2220,8 @@ + .RS 4 + .\} + .nf +-\-XX:NewRatio=1 ++\fB\-XX:NewRatio=1\fR ++ + .fi + .if n \{\ + .RE +@@ -2177,7 +2230,7 @@ + .PP + \-XX:NewSize=\fIsize\fR + .RS 4 +-¼ã¤¤À¤Âå(¥Ê¡¼¥µ¥ê)¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£ ++¼ã¤¤À¤Âå(¥Ê¡¼¥µ¥ê)¤Î¥Ò¡¼¥×¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£ + .sp + ¥Ò¡¼¥×¤Î¼ã¤¤À¤Âå¥ê¡¼¥¸¥ç¥ó¤Ï¿·¤·¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£GC¤Ï¡¢Â¾¤Î¥ê¡¼¥¸¥ç¥ó¤è¤ê¤³¤Î¥ê¡¼¥¸¥ç¥ó¤Ç¡¢¤è¤êÉÑÈˤ˼¹Ԥµ¤ì¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥µ¥¤¥º¤¬¾®¤µ¤¹¤®¤ë¾ì¹ç¡¢Â¿¿ô¤Î¥Þ¥¤¥Ê¡¼GC¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥µ¥¤¥º¤¬Â礭¤¹¤®¤ë¾ì¹ç¡¢¥Õ¥ëGC¤Î¤ß¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¤¬¡¢´°Î»¤Þ¤Ç¤Ë»þ´Ö¤¬¤«¤«¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¼ã¤¤À¤Âå¤Î¥µ¥¤¥º¤Ï¡¢Á´ÂΤΥҡ¼¥×¡¦¥µ¥¤¥º¤ÎȾʬ¤«¤é4ʬ¤Î1¤Î´Ö¤Ë¤·¤Æ¤ª¤¯¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .sp +@@ -2187,14 +2240,15 @@ + .RS 4 + .\} + .nf +-\-XX:NewSize=256m +-\-XX:NewSize=262144k +-\-XX:NewSize=268435456 ++\fB\-XX:NewSize=256m\fR ++\fB\-XX:NewSize=262144k\fR ++\fB\-XX:NewSize=268435456\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fI\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-Xmn\fR¤ÈƱÅù¤Ç¤¹¡£ ++\fB\-XX:NewSize\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-Xmn\fR¤ÈƱÅù¤Ç¤¹¡£ + .RE + .PP + \-XX:ParallelGCThreads=\fIthreads\fR +@@ -2207,7 +2261,8 @@ + .RS 4 + .\} + .nf +-\-XX:ParallelGCThreads=2 ++\fB\-XX:ParallelGCThreads=2\fR ++ + .fi + .if n \{\ + .RE +@@ -2239,7 +2294,7 @@ + µÙ»ß(¤¿¤È¤¨¤ÐGCµÙ»ß¤Ê¤É)¤¬·Ñ³¤·¤¿»þ´Ö¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ + .RE + .PP +-\-XX+PrintGCDateStamp ++\-XX:+PrintGCDateStamps + .RS 4 + GC¤´¤È¤ÎÆüÉÕ¥¹¥¿¥ó¥×¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ + .RE +@@ -2254,11 +2309,16 @@ + ¸Ä¡¹¤ÎGC¥ï¡¼¥«¡¼¡¦¥¹¥ì¥Ã¥É¡¦¥¿¥¹¥¯¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ + .RE + .PP +-\-XX:+PrintGCTimeStamp ++\-XX:+PrintGCTimeStamps + .RS 4 + GC¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£ + .RE + .PP ++\-XX:+PrintStringDeduplicationStatistics ++.RS 4 ++¾ÜºÙ¤Ê½ÅÊ£½ü³°Åý·×¤ò°õºþ¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£\fB\-XX:+UseStringDeduplication\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.RE ++.PP + \-XX:+PrintTenuringDistribution + .RS 4 + ÅÂƲÆþ¤ê´ü´Ö¾ðÊó¤Î½ÐÎϤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¼¡¤Ë¡¢½ÐÎϤÎÎã¤ò¼¨¤·¤Þ¤¹¡£ +@@ -2267,11 +2327,12 @@ + .RS 4 + .\} + .nf +-Desired survivor size 48286924 bytes, new threshold 10 (max 10) +-\- age 1: 28992024 bytes, 28992024 total +-\- age 2: 1366864 bytes, 30358888 total +-\- age 3: 1425912 bytes, 31784800 total +-\&.\&.\&. ++\fBDesired survivor size 48286924 bytes, new threshold 10 (max 10)\fR ++\fB\- age 1: 28992024 bytes, 28992024 total\fR ++\fB\- age 2: 1366864 bytes, 30358888 total\fR ++\fB\- age 3: 1425912 bytes, 31784800 total\fR ++\fB\&.\&.\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -2285,12 +2346,12 @@ + .PP + \-XX:+ScavengeBeforeFullGC + .RS 4 +-¤½¤ì¤¾¤ì¤Î¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤ÎGC¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤Î¥¹¥«¥Ù¥ó¥¸¤ò¹Ô¤¦¤È¡¢¸Å¤¤À¤ÂåÎΰ褫¤é¼ã¤¤À¤ÂåÎΰè¤Ø¤Î¥¢¥¯¥»¥¹¤¬²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¤ò¸º¤é¤¹¤³¤È¤¬¤Ç¤­¤ë¤¿¤á¡¢¤³¤ì¤ò̵¸ú¤Ë\fI¤·¤Ê¤¤\fR¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£³Æ¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤ÎGC¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-ScavengeBeforeFullGC\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¤½¤ì¤¾¤ì¤Î¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤ÎGC¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤Î¥¹¥«¥Ù¥ó¥¸¤ò¹Ô¤¦¤È¡¢¸Å¤¤À¤ÂåÎΰ褫¤é¼ã¤¤À¤ÂåÎΰè¤Ø¤Î¥¢¥¯¥»¥¹¤¬²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¤ò¸º¤é¤¹¤³¤È¤¬¤Ç¤­¤ë¤¿¤á¡¢¤³¤ì¤ò̵¸ú¤Ë\fI¤·¤Ê¤¤\fR¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£³Æ¥Õ¥ëGC¤ÎÁ°¤Ë¼ã¤¤À¤Âå¤ÎGC¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-ScavengeBeforeFullGC\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-XX:SoftRefLRUPolicyMSPerMB=\fItime\fR + .RS 4 +-¥½¥Õ¥È¡¦¥¢¥¯¥»¥¹¤¬²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤¬ºÇ¸å¤Ë»²¾È¤µ¤ì¤Æ¤«¤é¥Ò¡¼¥×¾å¤Ç¥¢¥¯¥Æ¥£¥Ö¤Ê¤Þ¤Þ¤Ë¤Ê¤Ã¤Æ¤¤¤ë»þ´Ö(¥ß¥êÉÃñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¥Ò¡¼¥×Æâ¤Î¶õ¤­¥á¥¬¥Ð¥¤¥ÈÅö¤¿¤ê¤Ç1Éäθ³´ü´Ö¤Ç¤¹¡£\fI\-XX:SoftRefLRUPolicyMSPerMB\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¸½ºß¤Î¥Ò¡¼¥×¡¦¥µ¥¤¥º(Java HotSpot Client VMÍÑ)¤Þ¤¿¤ÏºÇÂç²Äǽ¥Ò¡¼¥×¡¦¥µ¥¤¥º(Java HotSpot Server VMÍÑ)¤Î1¥á¥¬¥Ð¥¤¥ÈÅö¤¿¤ê¤Î¥ß¥êÉäòɽ¤¹À°¿ôÃͤò¼õ¤±Æþ¤ì¤Þ¤¹¡£¤³¤Î°ã¤¤¤Ï¡¢Client VM¤Ï¡¢¥Ò¡¼¥×¤òÂ礭¤¯¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥½¥Õ¥È»²¾È¤ò¥Õ¥é¥Ã¥·¥å¤¹¤ë·¹¸þ¤¬¤¢¤ë¤Î¤ËÂФ·¡¢Server VM¤Ï¡¢¥½¥Õ¥È»²¾È¤ò¥Õ¥é¥Ã¥·¥å¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥Ò¡¼¥×¤òÂ礭¤¯¤¹¤ë·¹¸þ¤¬¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¡¢\fI\-Xmx\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢¥½¥Õ¥È»²¾È¤¬¤É¤Î¤¯¤é¤¤¿×®¤Ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤µ¤ì¤ë¤«¤Ë½ÅÍפʱƶÁ¤òµÚ¤Ü¤·¤Þ¤¹¡£ ++¥½¥Õ¥È¡¦¥¢¥¯¥»¥¹¤¬²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤¬ºÇ¸å¤Ë»²¾È¤µ¤ì¤Æ¤«¤é¥Ò¡¼¥×¾å¤Ç¥¢¥¯¥Æ¥£¥Ö¤Ê¤Þ¤Þ¤Ë¤Ê¤Ã¤Æ¤¤¤ë»þ´Ö(¥ß¥êÉÃñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤϡ¢¥Ò¡¼¥×Æâ¤Î¶õ¤­¥á¥¬¥Ð¥¤¥ÈÅö¤¿¤ê¤Ç1Éäθ³´ü´Ö¤Ç¤¹¡£\fB\-XX:SoftRefLRUPolicyMSPerMB\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¸½ºß¤Î¥Ò¡¼¥×¡¦¥µ¥¤¥º(Java HotSpot Client VMÍÑ)¤Þ¤¿¤ÏºÇÂç²Äǽ¥Ò¡¼¥×¡¦¥µ¥¤¥º(Java HotSpot Server VMÍÑ)¤Î1¥á¥¬¥Ð¥¤¥ÈÅö¤¿¤ê¤Î¥ß¥êÉäòɽ¤¹À°¿ôÃͤò¼õ¤±Æþ¤ì¤Þ¤¹¡£¤³¤Î°ã¤¤¤Ï¡¢Client VM¤Ï¡¢¥Ò¡¼¥×¤òÂ礭¤¯¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥½¥Õ¥È»²¾È¤ò¥Õ¥é¥Ã¥·¥å¤¹¤ë·¹¸þ¤¬¤¢¤ë¤Î¤ËÂФ·¡¢Server VM¤Ï¡¢¥½¥Õ¥È»²¾È¤ò¥Õ¥é¥Ã¥·¥å¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥Ò¡¼¥×¤òÂ礭¤¯¤¹¤ë·¹¸þ¤¬¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¡¢\fB\-Xmx\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢¥½¥Õ¥È»²¾È¤¬¤É¤Î¤¯¤é¤¤¿×®¤Ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤µ¤ì¤ë¤«¤Ë½ÅÍפʱƶÁ¤òµÚ¤Ü¤·¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢Ãͤò2\&.5ÉäËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -2298,13 +2359,19 @@ + .RS 4 + .\} + .nf +-\-XX:SoftRefLRUPolicyMSPerMB=2500 ++\fB\-XX:SoftRefLRUPolicyMSPerMB=2500\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP ++\-XX:StringDeduplicationAgeThreshold=\fIthreshold\fR ++.RS 4 ++»ØÄꤷ¤¿´ü´Ö¤ËÅþ㤷¤Ä¤Ä¤¢¤ë\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢½ÅÊ£½ü³°¤Î¸õÊä¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î´ü´Ö¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¤¬¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Ç¸³¤·¤¿²ó¿ô¤Î¬ÄêÃͤǤ¹¡£¤³¤ì¤Ï¡¢ÅÂƲÆþ¤ê¤È¸Æ¤Ð¤ì¤ë¾ì¹ç¤â¤¢¤ê¤Þ¤¹¡£\fB\-XX:+PrintTenuringDistribution\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î´ü´Ö¤ËÅþ㤹¤ëÁ°¤Ë¸Å¤¤¥Ò¡¼¥×¡¦¥ê¡¼¥¸¥ç¥ó¤Ë¾º³Ê¤µ¤ì¤¿\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢¾ï¤Ë½ÅÊ£½ü³°¤Î¸õÊä¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\fB3\fR¤Ç¤¹¡£\fB\-XX:+UseStringDeduplication\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.RE ++.PP + \-XX:SurvivorRatio=\fIratio\fR + .RS 4 + EdenÎΰè¤Î¥µ¥¤¥º¤È¥µ¥Ð¥¤¥ÐÎΰè¤Î¥µ¥¤¥º¤È¤ÎÈæΨ¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï8¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢Eden/¥µ¥Ð¥¤¥ÐÎΰè¤ÎÈæΨ¤ò4¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ +@@ -2313,7 +2380,8 @@ + .RS 4 + .\} + .nf +-\-XX:SurvivorRatio=4 ++\fB\-XX:SurvivorRatio=4\fR ++ + .fi + .if n \{\ + .RE +@@ -2330,7 +2398,8 @@ + .RS 4 + .\} + .nf +-\-XX:TargetSurvivorRatio=30 ++\fB\-XX:TargetSurvivorRatio=30\fR ++ + .fi + .if n \{\ + .RE +@@ -2339,7 +2408,7 @@ + .PP + \-XX:TLABSize=\fIsize\fR + .RS 4 +-¥¹¥ì¥Ã¥É¡¦¥í¡¼¥«¥ë¤Ê³äÅö¤Æ¥Ð¥Ã¥Õ¥¡(TLAB)¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIk\fR¤Þ¤¿¤Ï\fIK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIm\fR¤Þ¤¿¤Ï\fIM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬0¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢JVM¤Ç¤Ï½é´ü¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£ ++¥¹¥ì¥Ã¥É¡¦¥í¡¼¥«¥ë¤Ê³äÅö¤Æ¥Ð¥Ã¥Õ¥¡(TLAB)¤Î½é´ü¥µ¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBk\fR¤Þ¤¿¤Ï\fBK\fR¡¢¥á¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBm\fR¤Þ¤¿¤Ï\fBM\fR¡¢¥®¥¬¥Ð¥¤¥È¤ò¼¨¤¹¾ì¹ç¤Ïʸ»ú\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬0¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢JVM¤Ç¤Ï½é´ü¥µ¥¤¥º¤¬¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£ + .sp + ¼¡¤ÎÎã¤Ç¤Ï¡¢TLAB¤Î½é´ü¥µ¥¤¥º¤ò512KB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp +@@ -2347,7 +2416,8 @@ + .RS 4 + .\} + .nf +-\-XX:TLABSize=512k ++\fB\-XX:TLABSize=512k\fR ++ + .fi + .if n \{\ + .RE +@@ -2356,7 +2426,7 @@ + .PP + \-XX:+UseAdaptiveSizePolicy + .RS 4 +-Ŭ±þÀ¤Â奵¥¤¥º»ØÄê¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Å¬±þÀ¤Â奵¥¤¥º»ØÄê¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseAdaptiveSizePolicy\fR¤ò»ØÄꤷ¡¢¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤Î¥µ¥¤¥º¤òÌÀ¼¨Åª¤ËÀßÄꤷ¤Þ¤¹(\fI\-XX:SurvivorRatio\fR¥ª¥×¥·¥ç¥ó¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤)¡£ ++Ŭ±þÀ¤Â奵¥¤¥º»ØÄê¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Å¬±þÀ¤Â奵¥¤¥º»ØÄê¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseAdaptiveSizePolicy\fR¤ò»ØÄꤷ¡¢¥á¥â¥ê¡¼³äÅö¤Æ¥×¡¼¥ë¤Î¥µ¥¤¥º¤òÌÀ¼¨Åª¤ËÀßÄꤷ¤Þ¤¹(\fB\-XX:SurvivorRatio\fR¥ª¥×¥·¥ç¥ó¤ò»²¹Í¤Ë¤·¤Æ¤¯¤À¤µ¤¤)¡£ + .RE + .PP + \-XX:+UseCMSInitiatingOccupancyOnly +@@ -2366,43 +2436,43 @@ + .PP + \-XX:+UseConcMarkSweepGC + .RS 4 +-¸Å¤¤À¤Âå¤Ø¤ÎCMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÂÔµ¡»þ´Ö¤ÎÍ×·ï¤ò¡¢¥¹¥ë¡¼¥×¥Ã¥È(\fI\-XX:+UseParallelGC\fR)¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ë¤è¤Ã¤ÆËþ¤¿¤¹¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢CMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£G1¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(\fI\-XX:+UseG1GC\fR)¤ÏÊ̤ÎÂåÂؤȤʤê¤Þ¤¹¡£ ++¸Å¤¤À¤Âå¤Ø¤ÎCMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÂÔµ¡»þ´Ö¤ÎÍ×·ï¤ò¡¢¥¹¥ë¡¼¥×¥Ã¥È(\fB\-XX:+UseParallelGC\fR)¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ë¤è¤Ã¤ÆËþ¤¿¤¹¤³¤È¤¬¤Ç¤­¤Ê¤¤¾ì¹ç¡¢CMS¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£G1¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(\fB\-XX:+UseG1GC\fR)¤ÏÊ̤ÎÂåÂؤȤʤê¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fI\-XX:+UseParNewGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬Í­¸ú¤Ê¾ì¹ç¡¢\fB\-XX:+UseParNewGC\fR¥ª¥×¥·¥ç¥ó¤Ï¼«Æ°Åª¤ËÀßÄꤵ¤ì¡¢Ìµ¸ú²½¤·¤Ê¤¤É¬Íפ¬¤¢¤ê¤Þ¤¹¤¬¡¢Íýͳ¤ÏJDK 8¤Ç¤Ï\fB\-XX:+UseConcMarkSweepGC \-XX:\-UseParNewGC\fR¥ª¥×¥·¥ç¥ó¤ÎÁȹ礻¤¬Èó¿ä¾©¤Ç¤¢¤ë¤¿¤á¤Ç¤¹¡£ + .RE + .PP + \-XX:+UseG1GC + .RS 4 +-G1¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï¥µ¡¼¥Ð¡¼·Á¼°¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ç¡¢ÂçÎ̤ÎRAM¤ò»ý¤Ä¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¡¦¥Þ¥·¥ó¤òÂоݤȤ·¤Æ¤¤¤Þ¤¹¡£¹â¤¤³ÎΨ¤ÇGCµÙ»ß»þ´Ö¤ÎÌÜɸ¤òãÀ®¤·¡¢Æ±»þ¤ËŬÀڤʥ¹¥ë¡¼¥×¥Ã¥È¤â°Ý»ý¤·¤Þ¤¹¡£G1¥³¥ì¥¯¥¿¤Ï¡¢GCÂÔµ¡»þ´Ö¤Î¸ÂÄꤵ¤ì¤¿Í×·ï(°ÂÄꤷ¤¿Í½Â¬²Äǽ¤Ê0\&.5ÉÃ̤Ëþ¤ÎµÙ»ß»þ´Ö)¤ò»ý¤Ä¡¢Â礭¤¤¥Ò¡¼¥×(Ìó6GB°Ê¾å¤Î¥µ¥¤¥º)¤¬É¬Íפʥ¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¿ä¾©¤µ¤ì¤Þ¤¹¡£ ++¥¬¥Ù¡¼¥¸¥Õ¥¡¡¼¥¹¥È(G1)¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ï¥µ¡¼¥Ð¡¼·Á¼°¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Ç¡¢ÂçÎ̤ÎRAM¤ò»ý¤Ä¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¡¦¥Þ¥·¥ó¤òÂоݤȤ·¤Æ¤¤¤Þ¤¹¡£¹â¤¤³ÎΨ¤ÇGCµÙ»ß»þ´Ö¤ÎÌÜɸ¤òãÀ®¤·¡¢Æ±»þ¤ËŬÀڤʥ¹¥ë¡¼¥×¥Ã¥È¤â°Ý»ý¤·¤Þ¤¹¡£G1¥³¥ì¥¯¥¿¤Ï¡¢GCÂÔµ¡»þ´Ö¤Î¸ÂÄꤵ¤ì¤¿Í×·ï(°ÂÄꤷ¤¿Í½Â¬²Äǽ¤Ê0\&.5ÉÃ̤Ëþ¤ÎµÙ»ß»þ´Ö)¤ò»ý¤Ä¡¢Â礭¤¤¥Ò¡¼¥×(Ìó6GB°Ê¾å¤Î¥µ¥¤¥º)¤¬É¬Íפʥ¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¿ä¾©¤µ¤ì¤Þ¤¹¡£ + .sp + ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseGCOverheadLimit + .RS 4 +-\fIOutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤ë¤Þ¤Ç¤Ë¡¢GC¤ÇJVM¤Ë¤è¤Ã¤ÆÍפ·¤¿»þ´Ö¤Î³ä¹ç¤òÀ©¸Â¤¹¤ë¥Ý¥ê¥·¡¼¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Ë¹ç·×»þ´Ö¤Î98%¤è¤ê¿¤¯Èñ¤ä¤µ¤ì¡¢¥Ò¡¼¥×¤Î¥ê¥«¥Ð¥ê¤¬2%̤Ëþ¤Ç¤¢¤ë¾ì¹ç¡¢¥Ñ¥é¥ì¥ëGC¤Ë¤è¤Ã¤Æ\fIOutOfMemoryError\fR¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£¥Ò¡¼¥×¤¬¾®¤µ¤¤¾ì¹ç¡¢¤³¤Îµ¡Ç½¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬Ä¹´ü´Ö¤Û¤È¤ó¤É¤Þ¤¿¤Ï¤Þ¤Ã¤¿¤¯¿ÊĽ¤Ê¤¯¼Â¹Ô¤·¤Æ¤¤¤ë¾õÂÖ¤ò²óÈò¤¹¤ë¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseGCOverheadLimit\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBOutOfMemoryError\fRÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤ë¤Þ¤Ç¤Ë¡¢GC¤ÇJVM¤Ë¤è¤Ã¤ÆÍפ·¤¿»þ´Ö¤Î³ä¹ç¤òÀ©¸Â¤¹¤ë¥Ý¥ê¥·¡¼¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Ë¹ç·×»þ´Ö¤Î98%¤è¤ê¿¤¯Èñ¤ä¤µ¤ì¡¢¥Ò¡¼¥×¤Î¥ê¥«¥Ð¥ê¤¬2%̤Ëþ¤Ç¤¢¤ë¾ì¹ç¡¢¥Ñ¥é¥ì¥ëGC¤Ë¤è¤Ã¤Æ\fBOutOfMemoryError\fR¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£¥Ò¡¼¥×¤¬¾®¤µ¤¤¾ì¹ç¡¢¤³¤Îµ¡Ç½¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬Ä¹´ü´Ö¤Û¤È¤ó¤É¤Þ¤¿¤Ï¤Þ¤Ã¤¿¤¯¿ÊĽ¤Ê¤¯¼Â¹Ô¤·¤Æ¤¤¤ë¾õÂÖ¤ò²óÈò¤¹¤ë¤¿¤á¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseGCOverheadLimit\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseNUMA + .RS 4 +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Çû¤¤ÂÔµ¡»þ´Ö¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤòÁý²Ã¤µ¤»¤ë¤³¤È¤Ç¡¢ÉԶѰì¤Ê¥á¥â¥ê¡¼¡¦¥¢¡¼¥­¥Æ¥¯¥Á¥ã(NUMA)¤ò»ÈÍѤ·¤¿¥Þ¥·¥ó¾å¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹ºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢NUMA¤ËÂФ¹¤ëºÇŬ²½¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥é¥ì¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(\fI\-XX:+UseParallelGC\fR)¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Çû¤¤ÂÔµ¡»þ´Ö¤Î¥á¥â¥ê¡¼¤Î»ÈÍѤòÁý²Ã¤µ¤»¤ë¤³¤È¤Ç¡¢ÉԶѰì¤Ê¥á¥â¥ê¡¼¡¦¥¢¡¼¥­¥Æ¥¯¥Á¥ã(NUMA)¤ò»ÈÍѤ·¤¿¥Þ¥·¥ó¾å¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹ºÇŬ²½¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢NUMA¤ËÂФ¹¤ëºÇŬ²½¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥é¥ì¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(\fB\-XX:+UseParallelGC\fR)¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ + .RE + .PP + \-XX:+UseParallelGC + .RS 4 + Ê£¿ô¤Î¥×¥í¥»¥Ã¥µ¤òÍøÍѤ·¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¡¢¥Ñ¥é¥ì¥ë¡¦¥¹¥«¥Ù¥ó¥¸¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿(¥¹¥ë¡¼¥×¥Ã¥È¡¦¥³¥ì¥¯¥¿¤È¤â¸Æ¤Ð¤ì¤ë)¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤ì¤òÍ­¸ú¤Ë¤·¤¿¾ì¹ç¡¢ÌÀ¼¨Åª¤Ë̵¸ú¤Ë¤·¤Ê¤¤¤«¤®¤ê¡¢\fI\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤ì¤òÍ­¸ú¤Ë¤·¤¿¾ì¹ç¡¢ÌÀ¼¨Åª¤Ë̵¸ú¤Ë¤·¤Ê¤¤¤«¤®¤ê¡¢\fB\-XX:+UseParallelOldGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseParallelOldGC + .RS 4 +-¥Õ¥ëGC¤Ø¤Î¥Ñ¥é¥ì¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£¤³¤ì¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fI\-XX:+UseParallelGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥Õ¥ëGC¤Ø¤Î¥Ñ¥é¥ì¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£¤³¤ì¤òÍ­¸ú¤Ë¤¹¤ë¤È¡¢\fB\-XX:+UseParallelGC\fR¥ª¥×¥·¥ç¥ó¤¬¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-XX:+UseParNewGC + .RS 4 +-¼ã¤¤À¤Âå¤Ç¤Î¥³¥ì¥¯¥·¥ç¥ó¤Ø¤Î¥Ñ¥é¥ì¥ë¡¦¥¹¥ì¥Ã¥É¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£\fI\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢¤³¤ì¤Ï¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¼ã¤¤À¤Âå¤Ç¤Î¥³¥ì¥¯¥·¥ç¥ó¤Ø¤Î¥Ñ¥é¥ì¥ë¡¦¥¹¥ì¥Ã¥É¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£\fB\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤òÀßÄꤹ¤ë¤È¡¢¤³¤ì¤Ï¼«Æ°Åª¤ËÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£JDK 8¤Ç¤Ï¡¢\fB\-XX:+UseConcMarkSweepGC\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fB\-XX:+UseParNewGC\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤ÏÈó¿ä¾©¤Ç¤¹¡£ + .RE + .PP + \-XX:+UseSerialGC +@@ -2410,17 +2480,59 @@ + ¥·¥ê¥¢¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤«¤éÆÃÊ̤ʵ¡Ç½¤òɬÍפȤ·¤Ê¤¤¡¢¾®µ¬ÌϤÇñ½ã¤Ê¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¾ì¹ç¤Ë¤Ï¡¢¤³¤ì¤Ï°ìÈ̤˺ÇŬ¤ÊÁªÂò¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¥³¥ì¥¯¥¿¤Ï¡¢¥Þ¥·¥ó¤Î¹½À®¤ª¤è¤ÓJVM¤Î¥¿¥¤¥×¤Ë´ð¤Å¤¤¤Æ¡¢¼«Æ°Åª¤ËÁªÂò¤µ¤ì¤Þ¤¹¡£ + .RE + .PP ++\-XX:+UseStringDeduplication ++.RS 4 ++ʸ»úÎó¤Î½ÅÊ£½ü³°¤òÍ­¸ú²½¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï̵¸ú¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¥¬¥Ù¡¼¥¸¥Õ¥¡¡¼¥¹¥È(G1)¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥¿¤òÍ­¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-XX:+UseG1GC\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¿¤¯¤Î\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤¬Æ±¤¸¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤«¤é¡¢\fIString deduplication\fR¤Ë¤è¤ê¡¢Java¥Ò¡¼¥×¾å¤Î\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤Î¥á¥â¥ê¡¼¡¦¥Õ¥Ã¥È¥×¥ê¥ó¥È¤¬ºï¸º¤µ¤ì¤Þ¤¹¡£³Æ\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤¬Æȼ«¤Îʸ»úÇÛÎó¤ò¥Ý¥¤¥ó¥È¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢Æ±°ì¤Î\fBString\fR¥ª¥Ö¥¸¥§¥¯¥È¤ÏƱ¤¸Ê¸»úÇÛÎó¤ò¥Ý¥¤¥ó¥È¤·¶¦Í­¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP + \-XX:+UseTLAB + .RS 4 +-¼ã¤¤À¤Âå¤ÎÎΰè¤Ç¤Î¥¹¥ì¥Ã¥É¡¦¥í¡¼¥«¥ë¤Ê³äÅö¤Æ¥Ö¥í¥Ã¥¯(TLAB)¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£TLAB¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fI\-XX:\-UseTLAB\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¼ã¤¤À¤Âå¤ÎÎΰè¤Ç¤Î¥¹¥ì¥Ã¥É¡¦¥í¡¼¥«¥ë¤Ê³äÅö¤Æ¥Ö¥í¥Ã¥¯(TLAB)¤Î»ÈÍѤòÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£TLAB¤Î»ÈÍѤò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢\fB\-XX:\-UseTLAB\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .SS "Èó¿ä¾©¤Çºï½ü¤µ¤ì¤¿¥ª¥×¥·¥ç¥ó" + .PP + ¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ë¤Ï´Þ¤Þ¤ì¤Æ¤¤¤Þ¤·¤¿¤¬¡¢°Ê¹ß¤ÏÉÔÍפȤߤʤµ¤ì¤Æ¤¤¤Þ¤¹¡£ + .PP ++\-Xincgc ++.RS 4 ++¥¤¥ó¥¯¥ê¥á¥ó¥¿¥ë¡¦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤Ç¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP + \-Xrun\fIlibname\fR + .RS 4 +-»ØÄꤷ¤¿¥Ç¥Ð¥Ã¥°/¥×¥í¥Õ¥¡¥¤¥ë¤Î¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-agentlib\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ ++»ØÄꤷ¤¿¥Ç¥Ð¥Ã¥°/¥×¥í¥Õ¥¡¥¤¥ë¤Î¥é¥¤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-agentlib\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycle=\fIpercent\fR ++.RS 4 ++ʹԥ³¥ì¥¯¥¿¤Î¼Â¹Ô¤¬µö²Ä¤µ¤ì¤Æ¤¤¤ë¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Î»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycleMin=\fIpercent\fR ++.RS 4 ++\fB\-XX:+CMSIncrementalPacing\fR¤¬Í­¸ú¤Ê¾ì¹ç¤Ë¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î²¼¸Â¤Ç¤¢¤ë¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Î»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:+CMSIncrementalMode ++.RS 4 ++CMS¥³¥ì¥¯¥¿¤ÎÁýʬ¥â¡¼¥É¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fBCMSIncremental\fR¤Ç»Ï¤Þ¤ë¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó ++.RE ++.PP ++\-XX:CMSIncrementalOffset=\fIpercent\fR ++.RS 4 ++Áýʬ¥â¡¼¥É¤Î¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò¥Þ¥¤¥Ê¡¼¡¦¥³¥ì¥¯¥·¥ç¥ó´Ö¤Ç´ü´ÖÆâ¤Ë±¦¤Ë°ÜÆ°¤¹¤ë»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:+CMSIncrementalPacing ++.RS 4 ++JVM¤Î¼Â¹ÔÃæ¤Ë¼ý½¸¤µ¤ì¤¿Åý·×¤Ë´ð¤Å¤¤¤Æ¡¢Áýʬ¥â¡¼¥É¤Î¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤Î¼«Æ°Ä´À°¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.RE ++.PP ++\-XX:CMSIncrementalSafetyFactor=\fIpercent\fR ++.RS 4 ++¥Ç¥å¡¼¥Æ¥£¡¦¥µ¥¤¥¯¥ë¤ò·×»»¤¹¤ëºÝ¤Ë¡¢Êݼé¤òÄɲ乤뤿¤á¤Ë»ÈÍѤµ¤ì¤ë»þ´Ö¤Î³ä¹ç(0¤«¤é100¤Þ¤Ç)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-XX:+CMSIncrementalMode\fR¥ª¥×¥·¥ç¥ó¤ÎÈó¿ä¾©¤ò¼õ¤±¤Æ¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏJDK 8¤Ç¤ÏÈó¿ä¾©¤È¤Ê¤ê¡¢¤½¤ì¤ËÂå¤ï¤ë¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .RE + .PP + \-XX:CMSInitiatingPermOccupancyFraction=\fIpercent\fR +@@ -2430,12 +2542,12 @@ + .PP + \-XX:MaxPermSize=\fIsize\fR + .RS 4 +-±Êµ×À¤ÂåÎΰè¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢JDK 8¤ÇÈó¿ä¾©¤Ë¤Ê¤ê¡¢\fI\-XX:MaxMetaspaceSize\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ ++±Êµ×À¤ÂåÎΰè¤ÎºÇÂ祵¥¤¥º(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢JDK 8¤ÇÈó¿ä¾©¤Ë¤Ê¤ê¡¢\fB\-XX:MaxMetaspaceSize\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ + .RE + .PP + \-XX:PermSize=\fIsize\fR + .RS 4 +-Ķ¤¨¤¿¾ì¹ç¤Ë¤Ï¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤ò¥È¥ê¥¬¡¼¤¹¤ë¡¢±Êµ×À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿Îΰè(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢JDK 8¤ÇÈó¿ä¾©¤Ë¤Ê¤ê¡¢\fI\-XX:MetaspaceSize\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ ++Ķ¤¨¤¿¾ì¹ç¤Ë¤Ï¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤ò¥È¥ê¥¬¡¼¤¹¤ë¡¢±Êµ×À¤Âå¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿Îΰè(¥Ð¥¤¥Èñ°Ì)¤òÀßÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢JDK 8¤ÇÈó¿ä¾©¤Ë¤Ê¤ê¡¢\fB\-XX:MetaspaceSize\fR¥ª¥×¥·¥ç¥ó¤Ë¼è¤Ã¤ÆÂå¤ï¤é¤ì¤Þ¤·¤¿¡£ + .RE + .PP + \-XX:+UseSplitVerifier +@@ -2451,28 +2563,34 @@ + .PP + ¼¡¤ÎÎã¤Ç¤Ï¡¢¥¹¥ë¡¼¥×¥Ã¥È¤ÎºÇŬ²½¤Þ¤¿¤Ï¥ì¥¹¥Ý¥ó¥¹»þ´Ö¤Îû½Ì²½¤Î¤¤¤º¤ì¤«¤ò¹Ô¤¦¤¿¤á¤Î¡¢»î¸³Åª¤Ê¥Á¥å¡¼¥Ë¥ó¥°¡¦¥Õ¥é¥°¤Î»ÈÍÑÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .PP +-\fBExample 1\fR, ¥¹¥ë¡¼¥×¥Ã¥È¤ò¸þ¾å¤¹¤ë¤¿¤á¤Î¥Á¥å¡¼¥Ë¥ó¥° ++\fBÎã 1\fR ++.br ++¥¹¥ë¡¼¥×¥Ã¥È¤ò¸þ¾å¤¹¤ë¤¿¤á¤Î¥Á¥å¡¼¥Ë¥ó¥° + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g ++\fBjava \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ¥ì¥¹¥Ý¥ó¥¹»þ´Ö¤ò®¤¯¤¹¤ë¤¿¤á¤Î¥Á¥å¡¼¥Ë¥ó¥° ++\fBÎã 2\fR ++.br ++¥ì¥¹¥Ý¥ó¥¹»þ´Ö¤ò®¤¯¤¹¤ë¤¿¤á¤Î¥Á¥å¡¼¥Ë¥ó¥° + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp ++\fBjava \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp\fR ++ + .fi + .if n \{\ + .RE +@@ -2480,7 +2598,7 @@ + .RE + .SH "½ªÎ»¥¹¥Æ¡¼¥¿¥¹" + .PP +-Ä̾¼¡¤Î½ªÎ»Ãͤ¬µ¯Æ°¥Ä¡¼¥ë¤«¤éÊÖ¤µ¤ì¤ë¤Î¤Ï¡¢µ¯Æ°¸µ¤¬ÉÔÀµ¤Ê°ú¿ô¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¤«¡¢¿¼¹ï¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤«¡¢¤¢¤ë¤¤¤ÏJVM¤Ë¤è¤êÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ç¤¹¡£¤¿¤À¤·¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢API¸Æ½Ð¤·\fISystem\&.exit(exitValue)\fR¤ò»ÈÍѤ·¤ÆǤ°Õ¤ÎÃͤòÊÖ¤¹¤³¤È¤òÁªÂò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Ãͤϼ¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ ++Ä̾¼¡¤Î½ªÎ»Ãͤ¬µ¯Æ°¥Ä¡¼¥ë¤«¤éÊÖ¤µ¤ì¤ë¤Î¤Ï¡¢µ¯Æ°¸µ¤¬ÉÔÀµ¤Ê°ú¿ô¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¤«¡¢¿¼¹ï¤Ê¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤«¡¢¤¢¤ë¤¤¤ÏJVM¤Ë¤è¤êÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì¹ç¤Ç¤¹¡£¤¿¤À¤·¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢API¸Æ½Ð¤·\fBSystem\&.exit(exitValue)\fR¤ò»ÈÍѤ·¤ÆǤ°Õ¤ÎÃͤòÊÖ¤¹¤³¤È¤òÁªÂò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Ãͤϼ¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2490,7 +2608,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI0\fR: Àµ¾ï½ªÎ» ++\fB0\fR: Àµ¾ï½ªÎ» + .RE + .sp + .RS 4 +@@ -2501,7 +2619,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI>0\fR: ¥¨¥é¡¼È¯À¸ ++\fB>0\fR: ¥¨¥é¡¼È¯À¸ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/javac.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/javac.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: javac +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,8 +21,16 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 +-.TH "javac" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" ++.\" Title: javac ++.\" Language: Japanese ++.\" Date: 2014ǯ8·î8Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 ++.TH "javac" "1" "2014ǯ8·î8Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff + .\" ----------------------------------------------------------------- +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + javac \- Java¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÄêµÁ¤òÆɤ߼è¤ê¡¢¥Ð¥¤¥È¥³¡¼¥É¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjavac\fR [ \fIoptions\fR ] [ \fIsourcefiles\fR ] [ \fIclasses\fR] [ \fI@argfiles\fR ] ++\fBjavac\fR [ \fIoptions\fR ] [ \fIsourcefiles\fR ] [ \fIclasses\fR] [ \fI@argfiles\fR ] + .fi + .if n \{\ + .RE +@@ -66,28 +68,28 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIsourcefiles\fR + .RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(\fIMyClass\&.java\fR¤Ê¤É)¡£ ++¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(\fBMyClass\&.java\fR¤Ê¤É)¡£ + .RE + .PP + \fIclasses\fR + .RS 4 +-Ãí¼á¤Î½èÍýÂоݤȤʤë1¤Ä°Ê¾å¤Î¥¯¥é¥¹(\fIMyPackage\&.MyClass\fR¤Ê¤É)¡£ ++Ãí¼á¤Î½èÍýÂоݤȤʤë1¤Ä°Ê¾å¤Î¥¯¥é¥¹(\fBMyPackage\&.MyClass\fR¤Ê¤É)¡£ + .RE + .PP + \fI@argfiles\fR + .RS 4 +-¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò°ìÍ÷ɽ¼¨¤¹¤ë1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¡£¤³¤Î¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¤Ï\fI\-J\fR¥ª¥×¥·¥ç¥ó¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò°ìÍ÷ɽ¼¨¤¹¤ë1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¡£¤³¤Î¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¤Ï\fB\-J\fR¥ª¥×¥·¥ç¥ó¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£¥³¥Þ¥ó¥É¹Ô°ú¿ô¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÄêµÁ¤òÆɤ߼è¤ê¡¢¥Ð¥¤¥È¥³¡¼¥É¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹Æâ¤ÎÃí¼á¤Î½èÍý¤â¤Ç¤­¤Þ¤¹¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÄêµÁ¤òÆɤ߼è¤ê¡¢¥Ð¥¤¥È¥³¡¼¥É¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹Æâ¤ÎÃí¼á¤Î½èÍý¤â¤Ç¤­¤Þ¤¹¡£ + .PP +-¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë̾¤ò\fIjavac\fR¤ËÅϤ¹¤Ë¤Ï¡¢2¤Ä¤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë̾¤ò\fBjavac\fR¤ËÅϤ¹¤Ë¤Ï¡¢2¤Ä¤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -97,7 +99,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¿ô¤¬¾¯¤Ê¤¤¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ë̾¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¿ô¤¬¾¯¤Ê¤¤¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ë̾¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -108,19 +110,19 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¿ô¤¬Â¿¤¤¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤ò¶õÇò¤Þ¤¿¤Ï²þ¹Ô¤Ç¶èÀڤäƻØÄꤷ¤Þ¤¹¡£\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¡¢¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤Ë¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¿ô¤¬Â¿¤¤¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤ò¶õÇò¤Þ¤¿¤Ï²þ¹Ô¤Ç¶èÀڤäƻØÄꤷ¤Þ¤¹¡£\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¡¢¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤Ë¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP +-¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë̾¤Ï\&.java³ÈÄ¥»Ò¤ò¡¢¥¯¥é¥¹¤Î¥Õ¥¡¥¤¥ë̾¤Ï\&.class³ÈÄ¥»Ò¤ò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤É¤Á¤é¤â¡¢³ºÅö¤¹¤ë¥¯¥é¥¹¤ËÂбþ¤¹¤ë¥ë¡¼¥È̾¤ò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIMyClass\fR¤È¤¤¤¦Ì¾Á°¤Î¥¯¥é¥¹¤Ï¡¢\fIMyClass\&.java\fR¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ëµ­½Ò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢\fIMyClass\&.class\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë̾¤Ï\&.java³ÈÄ¥»Ò¤ò¡¢¥¯¥é¥¹¤Î¥Õ¥¡¥¤¥ë̾¤Ï\&.class³ÈÄ¥»Ò¤ò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤É¤Á¤é¤â¡¢³ºÅö¤¹¤ë¥¯¥é¥¹¤ËÂбþ¤¹¤ë¥ë¡¼¥È̾¤ò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBMyClass\fR¤È¤¤¤¦Ì¾Á°¤Î¥¯¥é¥¹¤Ï¡¢\fBMyClass\&.java\fR¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ëµ­½Ò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢\fBMyClass\&.class\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ð¥¤¥È¥³¡¼¥É¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£ + .PP +-ÆâÉô¥¯¥é¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤È¡¢ÄɲäΥ¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ï¡¢\fIMyClass$MyInnerClass\&.class\fR¤Î¤è¤¦¤Ë¡¢ÆâÉô¥¯¥é¥¹Ì¾¤È³°Éô¥¯¥é¥¹Ì¾¤òÁȤ߹礻¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ÆâÉô¥¯¥é¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤È¡¢ÄɲäΥ¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤Ï¡¢\fBMyClass$MyInnerClass\&.class\fR¤Î¤è¤¦¤Ë¡¢ÆâÉô¥¯¥é¥¹Ì¾¤È³°Éô¥¯¥é¥¹Ì¾¤òÁȤ߹礻¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤òÈ¿±Ç¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¡¦¥Ä¥ê¡¼¤ËÇÛÃÖ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fI/workspace\fR¤Ë¤¢¤ë¾ì¹ç¡¢\fIcom\&.mysoft\&.mypack\&.MyClass\fR¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤ò¡¢\fI/workspace/com/mysoft/mypack/MyClass\&.java\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤òÈ¿±Ç¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¡¦¥Ä¥ê¡¼¤ËÇÛÃÖ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fB/workspace\fR¤Ë¤¢¤ë¾ì¹ç¡¢\fBcom\&.mysoft\&.mypack\&.MyClass\fR¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤ò¡¢\fB/workspace/com/mysoft/mypack/MyClass\&.java\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢³Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÂбþ¤¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤·¤Þ¤¹¡£\fI\-d\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê̤νÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢³Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÂбþ¤¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤·¤Þ¤¹¡£\fB\-d\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê̤νÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ë¤Ï¡¢¸½ºß¤Î³«È¯´Ä¶­¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëɸ½à¥ª¥×¥·¥ç¥ó¤Î¥»¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì°Ê³°¤ÎÈóɸ½à¥ª¥×¥·¥ç¥ó¤Ï¡¢¸½ºß¤Î²¾ÁÛ¥Þ¥·¥ó¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤Ë¸ÇÍ­¤Î¥ª¥×¥·¥ç¥ó¤Ç¡¢¾­Íè¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£Èóɸ½à¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-X\fR¥ª¥×¥·¥ç¥ó¤Ç»Ï¤Þ¤ê¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ë¤Ï¡¢¸½ºß¤Î³«È¯´Ä¶­¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëɸ½à¥ª¥×¥·¥ç¥ó¤Î¥»¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì°Ê³°¤ÎÈóɸ½à¥ª¥×¥·¥ç¥ó¤Ï¡¢¸½ºß¤Î²¾ÁÛ¥Þ¥·¥ó¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤Ë¸ÇÍ­¤Î¥ª¥×¥·¥ç¥ó¤Ç¡¢¾­Íè¡¢Êѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£Èóɸ½à¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-X\fR¥ª¥×¥·¥ç¥ó¤Ç»Ï¤Þ¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -130,7 +132,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .sp + .RS 4 +@@ -141,22 +143,22 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-Èóɸ½à¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Èóɸ½à¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .SS "ɸ½à¥ª¥×¥·¥ç¥ó" + .PP + \-A\fIkey\fR[\fI=value\fR] + .RS 4 +-Ãí¼á¥×¥í¥»¥Ã¥µ¤ËÅϤ¹¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavac\fR¤¬Ä¾Àܲò¼á¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¤½¤ì¤¾¤ì¤Î¥×¥í¥»¥Ã¥µ¤Ç»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£\fIkey\fR¤ÎÃͤϡ¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¼±Ê̻Ҥò¥É¥Ã¥È(\&.)¤Ç¶èÀÚ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++Ãí¼á¥×¥í¥»¥Ã¥µ¤ËÅϤ¹¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavac\fR¤¬Ä¾Àܲò¼á¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¤½¤ì¤¾¤ì¤Î¥×¥í¥»¥Ã¥µ¤Ç»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£\fBkey\fR¤ÎÃͤϡ¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¼±Ê̻Ҥò¥É¥Ã¥È(\&.)¤Ç¶èÀÚ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-cp \fIpath\fR or \-classpath \fIpath\fR + .RS 4 +-¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó(¥ª¥×¥·¥ç¥ó¤Ç)Ãí¼á¥×¥í¥»¥Ã¥µ¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fICLASSPATH\fR¡¢\fI\-cp\fR¡¢\fI\-classpath\fR¤Î¤¤¤º¤ì¤â»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Î\fI¥¯¥é¥¹¡¦¥Ñ¥¹\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ê¤ê¤Þ¤¹¡£Setting the Class Path ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó(¥ª¥×¥·¥ç¥ó¤Ç)Ãí¼á¥×¥í¥»¥Ã¥µ¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fBCLASSPATH\fR¡¢\fB\-cp\fR¡¢\fB\-classpath\fR¤Î¤¤¤º¤ì¤â»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Î\fI¥¯¥é¥¹¡¦¥Ñ¥¹\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ê¤ê¤Þ¤¹¡£Setting the Class Path ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤â¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¸¡º÷¤µ¤ì¤Þ¤¹¡£ ++\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤â¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¸¡º÷¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-processorpath\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢Ãí¼á¥×¥í¥»¥Ã¥µ¤â¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¸¡º÷¤µ¤ì¤Þ¤¹¡£ ++\fB\-processorpath\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢Ãí¼á¥×¥í¥»¥Ã¥µ¤â¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¸¡º÷¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-Djava\&.ext\&.dirs=\fIdirectories\fR +@@ -171,12 +173,12 @@ + .PP + \-d \fIdirectory\fR + .RS 4 +-¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½ÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fIjavac\fR¤Ç¤ÏºîÀ®¤µ¤ì¤Ê¤¤¤¿¤á¡¢¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤Î°ìÉô¤Ç¤¢¤ë¾ì¹ç¡¢\fIjavac\fR¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÈ¿±Ç¤·¤¿¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤·¡¢É¬Íפ˱þ¤¸¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½ÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fBjavac\fR¤Ç¤ÏºîÀ®¤µ¤ì¤Ê¤¤¤¿¤á¡¢¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤Î°ìÉô¤Ç¤¢¤ë¾ì¹ç¡¢\fBjavac\fR¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÈ¿±Ç¤·¤¿¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤·¡¢É¬Íפ˱þ¤¸¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤¹¡£ + .sp +-\fI\-d\fR +-\fI/home/myclasses\fR¤È»ØÄꤷ¡¢¥¯¥é¥¹¤Î̾Á°¤¬\fIcom\&.mypackage\&.MyClass\fR¤Ç¤¢¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï\fI/home/myclasses/com/mypackage/MyClass\&.class\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB\-d\fR ++\fB/home/myclasses\fR¤È»ØÄꤷ¡¢¥¯¥é¥¹¤Î̾Á°¤¬\fBcom\&.mypackage\&.MyClass\fR¤Ç¤¢¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï\fB/home/myclasses/com/mypackage/MyClass\&.class\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-\fI\-d\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fIjavac\fR¤Ï¡¢³Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¤½¤ÎÀ¸À®¸µ¤È¤Ê¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë³ÊǼ¤·¤Þ¤¹¡£ ++\fI\-d\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fBjavac\fR¤Ï¡¢³Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¤½¤ÎÀ¸À®¸µ¤È¤Ê¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë³ÊǼ¤·¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR + \fI\-d\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ë¼«Æ°Åª¤ËÄɲ䵤ì¤Þ¤»¤ó¡£ +@@ -184,12 +186,12 @@ + .PP + \-deprecation + .RS 4 +-Èó¿ä¾©¤Î¥á¥ó¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¹¤¬»ÈÍѤޤ¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤ë¤¿¤Ó¤Ë¡¢ÀâÌÀ¤òɽ¼¨¤·¤Þ¤¹¡£\fI\-deprecation\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavac\fR¤Ï¡¢Èó¿ä¾©¤Î¥á¥ó¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¹¤ò»ÈÍѤޤ¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥µ¥Þ¥ê¡¼¤òɽ¼¨¤·¤Þ¤¹¡£\fI\-deprecation\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-Xlint:deprecation\fR¤Î¾Êάɽµ­¤Ç¤¹¡£ ++Èó¿ä¾©¤Î¥á¥ó¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¹¤¬»ÈÍѤޤ¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤ë¤¿¤Ó¤Ë¡¢ÀâÌÀ¤òɽ¼¨¤·¤Þ¤¹¡£\fB\-deprecation\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavac\fR¤Ï¡¢Èó¿ä¾©¤Î¥á¥ó¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¹¤ò»ÈÍѤޤ¿¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥µ¥Þ¥ê¡¼¤òɽ¼¨¤·¤Þ¤¹¡£\fB\-deprecation\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-Xlint:deprecation\fR¤Î¾Êάɽµ­¤Ç¤¹¡£ + .RE + .PP + \-encoding \fIencoding\fR + .RS 4 +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°Ì¾(EUC\-JP¤äUTF\-8¤Ê¤É)¤òÀßÄꤷ¤Þ¤¹¡£\fI\-encoding\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥Ð¡¼¥¿¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°Ì¾(EUC\-JP¤äUTF\-8¤Ê¤É)¤òÀßÄꤷ¤Þ¤¹¡£\fB\-encoding\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥Ð¡¼¥¿¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \-endorseddirs \fIdirectories\fR +@@ -199,7 +201,7 @@ + .PP + \-extdirs \fIdirectories\fR + .RS 4 +-\fIext\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î°ÌÃÖ¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£directoriesÊÑ¿ô¤Ë¤Ï¡¢¥³¥í¥ó¤Ç¶èÀڤ俥ǥ£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î³ÆJAR¥Õ¥¡¥¤¥ë¤«¤é¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£¸¡½Ð¤µ¤ì¤¿¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î°ìÉô¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBext\fR¥Ç¥£¥ì¥¯¥È¥ê¤Î°ÌÃÖ¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£directoriesÊÑ¿ô¤Ë¤Ï¡¢¥³¥í¥ó¤Ç¶èÀڤ俥ǥ£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î³ÆJAR¥Õ¥¡¥¤¥ë¤«¤é¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£¸¡½Ð¤µ¤ì¤¿¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î°ìÉô¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + ¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë(°Û¤Ê¤ëJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¼ÂÁõ¤µ¤ì¤¿¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ä³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦)¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¾ÜºÙ¤Ï¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE +@@ -241,30 +243,30 @@ + .PP + \-implicit:[\fIclass, none\fR] + .RS 4 +-°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤òÀ©¸æ¤·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¼«Æ°À¸À®¤¹¤ë¤Ë¤Ï¡¢\fI\-implicit:class\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤òÍÞÀ©¤¹¤ë¤Ë¤Ï¡¢\fI\-implicit:none\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤Ï¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¼«Æ°À¸À®¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤Î¾ì¹ç¡¢¤½¤Î¤è¤¦¤Ê¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿»þ¤ËÃí¼á½èÍý¤â¼Â¹Ô¤µ¤ì¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤«¤é·Ù¹ð¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤¬ÌÀ¼¨Åª¤ËÀßÄꤵ¤ì¤¿¾ì¹ç¡¢·Ù¹ð¤Ïȯ¹Ô¤µ¤ì¤Þ¤»¤ó¡£·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤òÀ©¸æ¤·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¼«Æ°À¸À®¤¹¤ë¤Ë¤Ï¡¢\fB\-implicit:class\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤òÍÞÀ©¤¹¤ë¤Ë¤Ï¡¢\fB\-implicit:none\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤Ï¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¼«Æ°À¸À®¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤Î¾ì¹ç¡¢¤½¤Î¤è¤¦¤Ê¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿»þ¤ËÃí¼á½èÍý¤â¼Â¹Ô¤µ¤ì¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤«¤é·Ù¹ð¤¬È¯¹Ô¤µ¤ì¤Þ¤¹¡£\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤¬ÌÀ¼¨Åª¤ËÀßÄꤵ¤ì¤¿¾ì¹ç¡¢·Ù¹ð¤Ïȯ¹Ô¤µ¤ì¤Þ¤»¤ó¡£·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine (JVM)¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fBÃí°Õ:\fR +-\fICLASSPATH\fR¡¢\fI\-classpath\fR¡¢\fI\-bootclasspath\fR¤ª¤è¤Ó\fI\-extdirs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavac\fR¤Î¼Â¹Ô¤Ë»ÈÍѤµ¤ì¤ë¥¯¥é¥¹¤ò»ØÄꤷ¤Þ¤»¤ó¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÊÑ¿ô¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤ò¥«¥¹¥¿¥Þ¥¤¥º¤·¤è¤¦¤È¤¹¤ë¤È¡¢¥ê¥¹¥¯¤¬¹â¤¯¡¢Â¿¤¯¤Î¾ì¹ç¡¢É¬ÍפʽèÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤ò¥«¥¹¥¿¥Þ¥¤¥º¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢´ðÁäȤʤëJavaµ¯Æ°¥Ä¡¼¥ë¤Ë¥ª¥×¥·¥ç¥ó¤òÅϤ·¤Þ¤¹¡£ ++\fICLASSPATH\fR¡¢\fB\-classpath\fR¡¢\fB\-bootclasspath\fR¤ª¤è¤Ó\fB\-extdirs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavac\fR¤Î¼Â¹Ô¤Ë»ÈÍѤµ¤ì¤ë¥¯¥é¥¹¤ò»ØÄꤷ¤Þ¤»¤ó¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÊÑ¿ô¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤ò¥«¥¹¥¿¥Þ¥¤¥º¤·¤è¤¦¤È¤¹¤ë¤È¡¢¥ê¥¹¥¯¤¬¹â¤¯¡¢Â¿¤¯¤Î¾ì¹ç¡¢É¬ÍפʽèÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤ò¥«¥¹¥¿¥Þ¥¤¥º¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢´ðÁäȤʤëJavaµ¯Æ°¥Ä¡¼¥ë¤Ë¥ª¥×¥·¥ç¥ó¤òÅϤ·¤Þ¤¹¡£ + .RE + .PP + \-nowarn + .RS 4 +-·Ù¹ð¥á¥Ã¥»¡¼¥¸¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-Xlint:none\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹¡£ ++·Ù¹ð¥á¥Ã¥»¡¼¥¸¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-Xlint:none\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹¡£ + .RE + .PP + \-parameters + .RS 4 +-¥ê¥Õ¥ì¥¯¥·¥ç¥óAPI¤Î¥á¥½¥Ã¥É\fIjava\&.lang\&.reflect\&.Executable\&.getParameters\fR¤¬¼èÆÀ¤Ç¤­¤ë¤è¤¦¤Ë¡¢À¸À®¤µ¤ì¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤È¥á¥½¥Ã¥É¤Î²¾¥Ñ¥é¥á¡¼¥¿Ì¾¤ò³ÊǼ¤·¤Þ¤¹¡£ ++¥ê¥Õ¥ì¥¯¥·¥ç¥óAPI¤Î¥á¥½¥Ã¥É\fBjava\&.lang\&.reflect\&.Executable\&.getParameters\fR¤¬¼èÆÀ¤Ç¤­¤ë¤è¤¦¤Ë¡¢À¸À®¤µ¤ì¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤È¥á¥½¥Ã¥É¤Î²¾¥Ñ¥é¥á¡¼¥¿Ì¾¤ò³ÊǼ¤·¤Þ¤¹¡£ + .RE + .PP + \-proc: [\fInone\fR, \fIonly\fR] + .RS 4 +-Ãí¼á½èÍý¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥ë¤ò¼Â¹Ô¤¹¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹¡£\fI\-proc:none\fR¤Ï¡¢Ãí¼á½èÍý¤Ê¤·¤Ç¥³¥ó¥Ñ¥¤¥ë¤¬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fI\-proc:only\fR¤Ï¡¢Ãí¼á½èÍý¤Î¤ß¤¬¼Â¹Ô¤µ¤ì¡¢¸å³¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï¤Þ¤Ã¤¿¤¯¼Â¹Ô¤µ¤ì¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ ++Ãí¼á½èÍý¤ª¤è¤Ó¥³¥ó¥Ñ¥¤¥ë¤ò¼Â¹Ô¤¹¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹¡£\fB\-proc:none\fR¤Ï¡¢Ãí¼á½èÍý¤Ê¤·¤Ç¥³¥ó¥Ñ¥¤¥ë¤¬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fB\-proc:only\fR¤Ï¡¢Ãí¼á½èÍý¤Î¤ß¤¬¼Â¹Ô¤µ¤ì¡¢¸å³¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï¤Þ¤Ã¤¿¤¯¼Â¹Ô¤µ¤ì¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .RE + .PP + \-processor \fIclass1\fR [,\fIclass2\fR,\fIclass3\fR\&.\&.\&.] +@@ -279,14 +281,14 @@ + .PP + \-s \fIdir\fR + .RS 4 +-À¸À®¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î³ÊǼÀè¤È¤Ê¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fIjavac\fR¤Ç¤ÏºîÀ®¤µ¤ì¤Ê¤¤¤¿¤á¡¢¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤Î°ìÉô¤Ç¤¢¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÈ¿±Ç¤·¤¿¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤·¡¢É¬Íפ˱þ¤¸¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤¹¡£ ++À¸À®¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î³ÊǼÀè¤È¤Ê¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï\fBjavac\fR¤Ç¤ÏºîÀ®¤µ¤ì¤Ê¤¤¤¿¤á¡¢¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤Î°ìÉô¤Ç¤¢¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÈ¿±Ç¤·¤¿¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò³ÊǼ¤·¡¢É¬Íפ˱þ¤¸¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤·¤Þ¤¹¡£ + .sp +-\fI\-s /home/mysrc\fR¤È»ØÄꤷ¡¢¥¯¥é¥¹¤Î̾Á°¤¬\fIcom\&.mypackage\&.MyClass\fR¤Ç¤¢¤ë¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï\fI/home/mysrc/com/mypackage/MyClass\&.java\fR¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ ++\fB\-s /home/mysrc\fR¤È»ØÄꤷ¡¢¥¯¥é¥¹¤Î̾Á°¤¬\fBcom\&.mypackage\&.MyClass\fR¤Ç¤¢¤ë¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï\fB/home/mysrc/com/mypackage/MyClass\&.java\fR¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-source \fIrelease\fR + .RS 4 +-¼õ¤±ÉÕ¤±¤ë¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fIrelease\fR¤Ë¤Ï¼¡¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¼õ¤±ÉÕ¤±¤ë¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fBrelease\fR¤Ë¤Ï¼¡¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .PP + 1\&.3 + .RS 4 +@@ -320,13 +322,23 @@ + .PP + 1\&.7 + .RS 4 +-¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥ÈÃͤǤ¹¡£Java SE 7¤ÇƳÆþ¤µ¤ì¤¿µ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ ++Java SE 7¤ÇƳÆþ¤µ¤ì¤¿µ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ + .RE + .PP + 7 + .RS 4 + 1\&.7¤ÈƱµÁ¤Ç¤¹¡£ + .RE ++.PP ++1\&.8 ++.RS 4 ++¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥ÈÃͤǤ¹¡£Java SE 8¤ÇƳÆþ¤µ¤ì¤¿µ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ ++.RE ++.PP ++8 ++.RS 4 ++1\&.8¤ÈƱµÁ¤Ç¤¹¡£ ++.RE + .RE + .PP + \-sourcepath \fIsourcepath\fR +@@ -358,13 +370,13 @@ + .RE + .SS "¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó" + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¹¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï¡¢\fIjavac\fR¤¬ÅºÉÕ¤µ¤ì¤Æ¤¤¤ë¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ª¤è¤Ó³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢\fIjavac\fR¤Ï¡¢°Û¤Ê¤ëJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¼ÂÁõ¤µ¤ì¤¿¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ª¤è¤Ó³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¤â¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦¾ì¹ç¤Ï¡¢\fI\-bootclasspath\fR¤ª¤è¤Ó\fI\-extdirs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¹¤Î¥³¥ó¥Ñ¥¤¥ë¤Ï¡¢\fBjavac\fR¤¬ÅºÉÕ¤µ¤ì¤Æ¤¤¤ë¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ª¤è¤Ó³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢\fBjavac\fR¤Ï¡¢°Û¤Ê¤ëJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ë¼ÂÁõ¤µ¤ì¤¿¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ª¤è¤Ó³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ËÂФ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¤â¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦¾ì¹ç¤Ï¡¢\fB\-bootclasspath\fR¤ª¤è¤Ó\fB\-extdirs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£ + .PP + \-target \fIversion\fR + .RS 4 +-²¾ÁÛ¥Þ¥·¥ó¤Î»ØÄꤵ¤ì¤¿¥ê¥ê¡¼¥¹¤òÂоݤȤ¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢»ØÄꤵ¤ì¤¿¥¿¡¼¥²¥Ã¥È°Ê¹ß¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÆ°ºî¤·¤Þ¤¹¤¬¡¢¤½¤ì¤è¤êÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJVM¤Ç¤ÏÆ°ºî¤·¤Þ¤»¤ó¡£Í­¸ú¤Ê¥¿¡¼¥²¥Ã¥È¤Ï¡¢1\&.1¡¢1\&.2¡¢1\&.3¡¢1\&.4¡¢1\&.5 (5¤â²Ä)¡¢1\&.6 (6¤â²Ä)¤ª¤è¤Ó1\&.7 (7¤â²Ä)¤Ç¤¹¡£ ++²¾ÁÛ¥Þ¥·¥ó¤Î»ØÄꤵ¤ì¤¿¥ê¥ê¡¼¥¹¤òÂоݤȤ¹¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢»ØÄꤵ¤ì¤¿¥¿¡¼¥²¥Ã¥È°Ê¹ß¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÆ°ºî¤·¤Þ¤¹¤¬¡¢¤½¤ì¤è¤êÁ°¤Î¥ê¥ê¡¼¥¹¤ÎJVM¤Ç¤ÏÆ°ºî¤·¤Þ¤»¤ó¡£Í­¸ú¤Ê¥¿¡¼¥²¥Ã¥È¤Ï¡¢1\&.1¡¢1\&.2¡¢1\&.3¡¢1\&.4¡¢1\&.5 (5¤â²Ä)¡¢1\&.6 (6¤â²Ä)¡¢1\&.7 (7¤â²Ä)¤ª¤è¤Ó1\&.8 (8¤â²Ä)¤Ç¤¹¡£ + .sp +-\fI\-target\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¡¢\fI\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤè¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ ++\fB\-target\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¡¢\fB\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤè¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -374,7 +386,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.7¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.8¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -385,7 +397,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.2¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.4¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.2¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.4¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -396,7 +408,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.3¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.4¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.3¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.4¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -407,7 +419,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.5¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.7¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.5¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.8¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -418,7 +430,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.6¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.7¤Ç¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.6¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.8¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -429,7 +441,18 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-source\fR¥ª¥×¥·¥ç¥ó¤Î¾¤Î¤¹¤Ù¤Æ¤ÎÃͤξì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢\fI\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤʤê¤Þ¤¹¡£ ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬1\&.7¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ1\&.8¤Ç¤¹¡£ ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fB\-source\fR¥ª¥×¥·¥ç¥ó¤Î¾¤Î¤¹¤Ù¤Æ¤ÎÃͤξì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢\fB\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤʤê¤Þ¤¹¡£ + .RE + .RE + .PP +@@ -439,9 +462,9 @@ + .RE + .SS "¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó" + .PP +-JDK 8°Ê¹ß¤«¤é¡¢\fIjavac\fR¥³¥ó¥Ñ¥¤¥é¤Ï¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤È¡¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥àÁ´ÂΤòɬÍפȤ·¤Ê¤¤¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¥Ç¥×¥í¥¤²Äǽ¤Ç¡¢¾®¤µ¤¤¥Õ¥Ã¥È¥×¥ê¥ó¥È¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ëµ¡Ç½¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¹¥È¥¢¤«¤é¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤òû½Ì¤¹¤ë¤Î¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Îµ¡Ç½¤Ï¡¢JRE¤ò¥Ð¥ó¥É¥ë¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¡¢¤è¤ê¥³¥ó¥Ñ¥¯¥È¤Ê¥Ç¥×¥í¥¤¥á¥ó¥È¤ËÌòΩ¤Á¤Þ¤¹¡£¤³¤Îµ¡Ç½¤Ï¡¢¾®¤µ¤¤¥Ç¥Ð¥¤¥¹¤Ç¤âÌòΩ¤Á¤Þ¤¹¡£ ++JDK 8°Ê¹ß¤«¤é¡¢\fBjavac\fR¥³¥ó¥Ñ¥¤¥é¤Ï¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤È¡¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥àÁ´ÂΤòɬÍפȤ·¤Ê¤¤¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢¥Ç¥×¥í¥¤²Äǽ¤Ç¡¢¾®¤µ¤¤¥Õ¥Ã¥È¥×¥ê¥ó¥È¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ëµ¡Ç½¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¹¥È¥¢¤«¤é¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤òû½Ì¤¹¤ë¤Î¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Îµ¡Ç½¤Ï¡¢JRE¤ò¥Ð¥ó¥É¥ë¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¡¢¤è¤ê¥³¥ó¥Ñ¥¯¥È¤Ê¥Ç¥×¥í¥¤¥á¥ó¥È¤ËÌòΩ¤Á¤Þ¤¹¡£¤³¤Îµ¡Ç½¤Ï¡¢¾®¤µ¤¤¥Ç¥Ð¥¤¥¹¤Ç¤âÌòΩ¤Á¤Þ¤¹¡£ + .PP +-¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥×¥í¥Õ¥¡¥¤¥ëÃͤϡ¢\fIcompact1\fR¡¢\fIcompact2\fR¤ª¤è¤Ó\fIcompact3\fR¤Ç¤¹¡£¤³¤ì¤é¤Ï¡¢ÄɲäΥ쥤¥ä¡¼¤Ç¤¹¡£Â礭¤¤ÈÖ¹æ¤Î³Æ¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¾®¤µ¤¤ÈÖ¹æ¤Î̾Á°¤Î¥×¥í¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎAPI¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥×¥í¥Õ¥¡¥¤¥ëÃͤϡ¢\fBcompact1\fR¡¢\fBcompact2\fR¤ª¤è¤Ó\fBcompact3\fR¤Ç¤¹¡£¤³¤ì¤é¤Ï¡¢ÄɲäΥ쥤¥ä¡¼¤Ç¤¹¡£Â礭¤¤ÈÖ¹æ¤Î³Æ¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¾®¤µ¤¤ÈÖ¹æ¤Î̾Á°¤Î¥×¥í¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎAPI¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .PP + \-profile + .RS 4 +@@ -451,7 +474,8 @@ + .RS 4 + .\} + .nf +-javac \-profile compact1 Hello\&.java ++\fBjavac \-profile compact1 Hello\&.java\fR ++ + .fi + .if n \{\ + .RE +@@ -462,17 +486,18 @@ + .RS 4 + .\} + .nf +-cd jdk1\&.8\&.0/bin +-\&./javac \-profile compact1 Paint\&.java +-Paint\&.java:5: error: Applet is not available in profile \*(Aqcompact1\*(Aq +-import java\&.applet\&.Applet; ++\fBcd jdk1\&.8\&.0/bin\fR ++\fB\&./javac \-profile compact1 Paint\&.java\fR ++\fBPaint\&.java:5: error: Applet is not available in profile \*(Aqcompact1\*(Aq\fR ++\fBimport java\&.applet\&.Applet;\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIApplet\fR¥¯¥é¥¹¤ò»ÈÍѤ·¤Ê¤¤¤è¤¦¤Ë¥½¡¼¥¹¤òÊѹ¹¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¨¥é¡¼¤ò½¤Àµ¤Ç¤­¤Þ¤¹¡£\-profile¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¨¥é¡¼¤ò½¤Àµ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë¤Ï¡¢Java SE API¤Î´°Á´¤Ê¥»¥Ã¥È¤ËÂФ·¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£(¤É¤Î¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤Ë¤â¡¢\fIApplet\fR¥¯¥é¥¹¤Ï´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£) ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBApplet\fR¥¯¥é¥¹¤ò»ÈÍѤ·¤Ê¤¤¤è¤¦¤Ë¥½¡¼¥¹¤òÊѹ¹¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¨¥é¡¼¤ò½¤Àµ¤Ç¤­¤Þ¤¹¡£\-profile¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¨¥é¡¼¤ò½¤Àµ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë¤Ï¡¢Java SE API¤Î´°Á´¤Ê¥»¥Ã¥È¤ËÂФ·¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£(¤É¤Î¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤Ë¤â¡¢\fBApplet\fR¥¯¥é¥¹¤Ï´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£) + .sp +-¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤á¤ÎÊ̤ÎÊýË¡¤È¤·¤Æ¡¢\fI\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥×¥í¥Õ¥¡¥¤¥ë¤Î¥¤¥á¡¼¥¸¤ò»ØÄꤹ¤ë\fIrt\&.jar\fR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤«¤ï¤ê¤Ë\fI\-profile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥×¥í¥Õ¥¡¥¤¥ë¡¦¥¤¥á¡¼¥¸¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥·¥¹¥Æ¥à¾å¤Ë¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë»þ¤ËÌòΩ¤Á¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¯¥È¡¦¥×¥í¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤á¤ÎÊ̤ÎÊýË¡¤È¤·¤Æ¡¢\fB\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥×¥í¥Õ¥¡¥¤¥ë¤Î¥¤¥á¡¼¥¸¤ò»ØÄꤹ¤ë\fBrt\&.jar\fR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤«¤ï¤ê¤Ë\fB\-profile\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥×¥í¥Õ¥¡¥¤¥ë¡¦¥¤¥á¡¼¥¸¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥·¥¹¥Æ¥à¾å¤Ë¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë»þ¤ËÌòΩ¤Á¤Þ¤¹¡£ + .RE + .SS "Èóɸ½à¥ª¥×¥·¥ç¥ó" + .PP +@@ -493,15 +518,16 @@ + .PP + \-Xdoclint:[\-]\fIgroup\fR [\fI/access\fR] + .RS 4 +-\fIgroup\fR¤ÎÃͤ¬\fIaccessibility\fR¡¢\fIsyntax\fR¡¢\fIreference\fR¡¢\fIhtml\fR¤Þ¤¿¤Ï\fImissing\fR¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ëÆÃÄê¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤òÍ­¸ú¤Þ¤¿¤Ï̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤Î¾ÜºÙ¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fIgroup\fR¤ÎÃͤ¬\fBaccessibility\fR¡¢\fBsyntax\fR¡¢\fBreference\fR¡¢\fBhtml\fR¤Þ¤¿¤Ï\fBmissing\fR¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ëÆÃÄê¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤òÍ­¸ú¤Þ¤¿¤Ï̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤Î¾ÜºÙ¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-ÊÑ¿ô\fIaccess\fR¤Ï¡¢\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤¬¥Á¥§¥Ã¥¯¤¹¤ë¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤ÎºÇ¾®¤Î²Ä»ëÀ­¥ì¥Ù¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fIpublic\fR¡¢\fIprotected\fR¡¢\fIpackage\fR¤ª¤è¤Ó\fIprivate\fR¤ÎÃÍ(²Ä»ëÀ­¤Î¹â¤¤½ç)¤Î1¤Ä¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢(protected¡¢package¡¢public¤ò´Þ¤à) protected°Ê¾å¤Î¥¢¥¯¥»¥¹¡¦¥ì¥Ù¥ë¤ò»ý¤Ä¥¯¥é¥¹¤ª¤è¤Ó¥á¥ó¥Ð¡¼¤ò(¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤Ç)¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ ++ÊÑ¿ô\fIaccess\fR¤Ï¡¢\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤¬¥Á¥§¥Ã¥¯¤¹¤ë¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤ÎºÇ¾®¤Î²Ä»ëÀ­¥ì¥Ù¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fBpublic\fR¡¢\fBprotected\fR¡¢\fBpackage\fR¤ª¤è¤Ó\fBprivate\fR¤ÎÃÍ(²Ä»ëÀ­¤Î¹â¤¤½ç)¤Î1¤Ä¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢(protected¡¢package¡¢public¤ò´Þ¤à) protected°Ê¾å¤Î¥¢¥¯¥»¥¹¡¦¥ì¥Ù¥ë¤ò»ý¤Ä¥¯¥é¥¹¤ª¤è¤Ó¥á¥ó¥Ð¡¼¤ò(¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤Ç)¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-Xdoclint:all/protected ++\fB\-Xdoclint:all/protected\fR ++ + .fi + .if n \{\ + .RE +@@ -512,7 +538,8 @@ + .RS 4 + .\} + .nf +-\-Xdoclint:all,\-html/package ++\fB\-Xdoclint:all,\-html/package\fR ++ + .fi + .if n \{\ + .RE +@@ -551,7 +578,7 @@ + .PP + \-Xlint:\fI\-name\fR + .RS 4 +-·Ù¹ð̾¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç̵¸ú¤Ë¤Ç¤­¤ë·Ù¹ð¤Î¥ê¥¹¥È¤ò¼èÆÀ¤¹¤ë¤Ë¤Ï¡¢\-Xlint¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿·Ù¹ð¤ÎÍ­¸ú²½¤Þ¤¿¤Ï̵¸ú²½\-Xlint\fI¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++·Ù¹ð̾¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç̵¸ú¤Ë¤Ç¤­¤ë·Ù¹ð¤Î¥ê¥¹¥È¤ò¼èÆÀ¤¹¤ë¤Ë¤Ï¡¢\-Xlint¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿·Ù¹ð¤ÎÍ­¸ú²½¤Þ¤¿¤Ï̵¸ú²½\-Xlint\fB¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xmaxerrs \fInumber\fR +@@ -566,34 +593,34 @@ + .PP + \-Xstdout \fIfilename\fR + .RS 4 +-¥³¥ó¥Ñ¥¤¥é¤Î¥á¥Ã¥»¡¼¥¸¤ò¡¢»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÁ÷¿®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¥á¥Ã¥»¡¼¥¸¤Ï\fISystem\&.err\fR¤ËÁ÷¤é¤ì¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Î¥á¥Ã¥»¡¼¥¸¤ò¡¢»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÁ÷¿®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¥á¥Ã¥»¡¼¥¸¤Ï\fBSystem\&.err\fR¤ËÁ÷¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-Xprefer:[\fInewer,source\fR] + .RS 4 +-¤¢¤ë·¿¤ËÂФ·¤Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¤É¤Á¤é¤Î¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ë¤«¤ò»ØÄꤷ¤Þ¤¹¡£(·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£\fI\-Xprefer:newer\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¤¢¤ë·¿¤ËÂФ¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¦¤Á¿·¤·¤¤Êý¤¬Æɤ߼è¤é¤ì¤Þ¤¹(¥Ç¥Õ¥©¥ë¥È)¡£\fI\-Xprefer:source\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Æɤ߼è¤é¤ì¤Þ¤¹¡£\fISOURCE\fR¤ÎÊݸ¥Ý¥ê¥·¡¼¤ò»ÈÍѤ·¤ÆÀë¸À¤µ¤ì¤¿Ãí¼á¤ËǤ°Õ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤¬¥¢¥¯¥»¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¾ì¹ç¤Ï¡¢\fI\-Xprefer:source\fR¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ ++¤¢¤ë·¿¤ËÂФ·¤Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¤É¤Á¤é¤Î¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ë¤«¤ò»ØÄꤷ¤Þ¤¹¡£(·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£\fB\-Xprefer:newer\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¤¢¤ë·¿¤ËÂФ¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¦¤Á¿·¤·¤¤Êý¤¬Æɤ߼è¤é¤ì¤Þ¤¹(¥Ç¥Õ¥©¥ë¥È)¡£\fB\-Xprefer:source\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Æɤ߼è¤é¤ì¤Þ¤¹¡£\fBSOURCE\fR¤ÎÊݸ¥Ý¥ê¥·¡¼¤ò»ÈÍѤ·¤ÆÀë¸À¤µ¤ì¤¿Ãí¼á¤ËǤ°Õ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤¬¥¢¥¯¥»¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¾ì¹ç¤Ï¡¢\fB\-Xprefer:source\fR¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-Xpkginfo:[\fIalways\fR,\fIlegacy\fR,\fInonempty\fR] + .RS 4 +-javac¤¬package\-info\&.java¥Õ¥¡¥¤¥ë¤«¤é\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¤«¤É¤¦¤«¤òÀ©¸æ¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç»ÈÍѲÄǽ¤Êmode°ú¿ô¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ ++javac¤¬package\-info\&.java¥Õ¥¡¥¤¥ë¤«¤é\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¤«¤É¤¦¤«¤òÀ©¸æ¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç»ÈÍѲÄǽ¤Êmode°ú¿ô¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP + always + .RS 4 +-¤¹¤Ù¤Æ¤Î\fIpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Î\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤ò¾ï¤ËÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢³Æ\fI\&.java\fR¥Õ¥¡¥¤¥ë¤ËÂбþ¤¹¤ë\fI\&.class\fR¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ëAnt¤Ê¤É¤Î¥Ó¥ë¥É¡¦¥·¥¹¥Æ¥à¤ò»ÈÍѤ¹¤ë¾ì¹ç¤ËÌòΩ¤Ä¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ++¤¹¤Ù¤Æ¤Î\fBpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Î\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤ò¾ï¤ËÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢³Æ\fB\&.java\fR¥Õ¥¡¥¤¥ë¤ËÂбþ¤¹¤ë\fB\&.class\fR¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ëAnt¤Ê¤É¤Î¥Ó¥ë¥É¡¦¥·¥¹¥Æ¥à¤ò»ÈÍѤ¹¤ë¾ì¹ç¤ËÌòΩ¤Ä¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + legacy + .RS 4 +-package\-info\&.java¤ËÃí¼á¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Î¤ß\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£package\-info\&.java¤Ë¥³¥á¥ó¥È¤Î¤ß´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤»¤ó¡£ ++package\-info\&.java¤ËÃí¼á¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Î¤ß\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£package\-info\&.java¤Ë¥³¥á¥ó¥È¤Î¤ß´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤»¤ó¡£ + .sp + \fBÃí°Õ:\fR +-\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤ÏÀ¸À®¤Ç¤­¤Þ¤¹¤¬¡¢package\-info\&.java¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎÃí¼á¤Ë\fIRetentionPolicy\&.SOURCE\fR¤¬¤¢¤ë¾ì¹ç¤Ï¶õ¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤ÏÀ¸À®¤Ç¤­¤Þ¤¹¤¬¡¢package\-info\&.java¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎÃí¼á¤Ë\fBRetentionPolicy\&.SOURCE\fR¤¬¤¢¤ë¾ì¹ç¤Ï¶õ¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + nonempty + .RS 4 +-package\-info\&.java¤Ë\fIRetentionPolicy\&.CLASS\fR¤Þ¤¿¤Ï\fIRetentionPolicy\&.RUNTIME\fR¤È¤È¤â¤ËÃí¼á¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Î¤ß\fIpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ ++package\-info\&.java¤Ë\fBRetentionPolicy\&.CLASS\fR¤Þ¤¿¤Ï\fBRetentionPolicy\&.RUNTIME\fR¤È¤È¤â¤ËÃí¼á¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Î¤ß\fBpackage\-info\&.class\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .RE + .PP +@@ -613,7 +640,7 @@ + .RE + .SH "-XLINT¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿·Ù¹ð¤ÎÍ­¸ú²½¤Þ¤¿¤Ï̵¸ú²½" + .PP +-\fI\-Xlint:name\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ·Ù¹ð\fIname\fR¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤³¤Ç¡¢\fIname\fR¤Ï¼¡¤Î·Ù¹ð̾¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\-Xlint:\-name:\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢·Ù¹ð¤ò̵¸ú²½¤Ç¤­¤Þ¤¹¡£ ++\fB\-Xlint:name\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ·Ù¹ð\fIname\fR¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£¤³¤³¤Ç¡¢\fBname\fR¤Ï¼¡¤Î·Ù¹ð̾¤Î¤¤¤º¤ì¤«¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\-Xlint:\-name:\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢·Ù¹ð¤ò̵¸ú²½¤Ç¤­¤Þ¤¹¡£ + .PP + cast + .RS 4 +@@ -623,7 +650,8 @@ + .RS 4 + .\} + .nf +-String s = (String) "Hello!" ++\fBString s = (String) "Hello!"\fR ++ + .fi + .if n \{\ + .RE +@@ -643,29 +671,31 @@ + .RS 4 + .\} + .nf +-java\&.util\&.Date myDate = new java\&.util\&.Date(); +-int currentDay = myDate\&.getDay(); ++\fBjava\&.util\&.Date myDate = new java\&.util\&.Date();\fR ++\fBint currentDay = myDate\&.getDay();\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥á¥½¥Ã¥É\fIjava\&.util\&.Date\&.getDay\fR¤ÏJDK 1\&.1°Ê¹ß¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ ++¥á¥½¥Ã¥É\fBjava\&.util\&.Date\&.getDay\fR¤ÏJDK 1\&.1°Ê¹ß¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ + .RE + .PP + dep\-ann + .RS 4 +-\fI@deprecated\fR +-Javadoc¥³¥á¥ó¥È¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Æ¤¤¤ë¤¬¡¢\fI@Deprecated\fRÃí¼á¤¬ÉÕ¤¤¤Æ¤¤¤Ê¤¤¹àÌܤˤĤ¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB@deprecated\fR ++Javadoc¥³¥á¥ó¥È¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Æ¤¤¤ë¤¬¡¢\fB@Deprecated\fRÃí¼á¤¬ÉÕ¤¤¤Æ¤¤¤Ê¤¤¹àÌܤˤĤ¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * @deprecated As of Java SE 7, replaced by {@link #newMethod()} +- */ +-public static void deprecatedMethood() { } +-public static void newMethod() { } ++\fB/**\fR ++\fB * @deprecated As of Java SE 7, replaced by {@link #newMethod()}\fR ++\fB */\fR ++\fBpublic static void deprecatedMethood() { }\fR ++\fBpublic static void newMethod() { }\fR ++ + .fi + .if n \{\ + .RE +@@ -680,7 +710,8 @@ + .RS 4 + .\} + .nf +-int divideByZero = 42 / 0; ++\fBint divideByZero = 42 / 0;\fR ++ + .fi + .if n \{\ + .RE +@@ -689,17 +720,18 @@ + .PP + empty + .RS 4 +-\fIif \fRʸ°Ê¹ß¤¬¶õ¤Îʸ¤Ç¤¢¤ë¤³¤È¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBif \fRʸ°Ê¹ß¤¬¶õ¤Îʸ¤Ç¤¢¤ë¤³¤È¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-class E { +- void m() { +- if (true) ; +- } +-} ++\fBclass E {\fR ++\fB void m() {\fR ++\fB if (true) ;\fR ++\fB }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -714,48 +746,50 @@ + .RS 4 + .\} + .nf +-switch (x) { +-case 1: +- System\&.out\&.println("1"); +- // No break statement here\&. +-case 2: +- System\&.out\&.println("2"); +-} ++\fBswitch (x) {\fR ++\fBcase 1:\fR ++\fB System\&.out\&.println("1");\fR ++\fB // No break statement here\&.\fR ++\fBcase 2:\fR ++\fB System\&.out\&.println("2");\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥³¡¼¥É¤Î¥³¥ó¥Ñ¥¤¥ë»þ¤Ë\fI\-Xlint:fallthrough\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢ÌäÂê¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥±¡¼¥¹¤Î¹ÔÈÖ¹æ¤È¤È¤â¤Ë¡¢case¤Ëfall\-through¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤³¤È¤ò¼¨¤¹·Ù¹ð¤òȯ¹Ô¤·¤Þ¤¹¡£ ++¤³¤Î¥³¡¼¥É¤Î¥³¥ó¥Ñ¥¤¥ë»þ¤Ë\fB\-Xlint:fallthrough\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢ÌäÂê¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥±¡¼¥¹¤Î¹ÔÈÖ¹æ¤È¤È¤â¤Ë¡¢case¤Ëfall\-through¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤³¤È¤ò¼¨¤¹·Ù¹ð¤òȯ¹Ô¤·¤Þ¤¹¡£ + .RE + .PP + finally + .RS 4 +-Àµ¾ï¤Ë´°Î»¤Ç¤­¤Ê¤¤\fIfinally\fR¶ç¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++Àµ¾ï¤Ë´°Î»¤Ç¤­¤Ê¤¤\fBfinally\fR¶ç¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public static int m() { +- try { +- throw new NullPointerException(); +- } catch (NullPointerException(); { +- System\&.err\&.println("Caught NullPointerException\&."); +- return 1; +- } finally { +- return 0; +- } +- } ++\fBpublic static int m() {\fR ++\fB try {\fR ++\fB throw new NullPointerException();\fR ++\fB } catch (NullPointerException(); {\fR ++\fB System\&.err\&.println("Caught NullPointerException\&.");\fR ++\fB return 1;\fR ++\fB } finally {\fR ++\fB return 0;\fR ++\fB }\fR ++\fB }\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÎã¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fIfinally\fR¥Ö¥í¥Ã¥¯¤Ë´Ø¤¹¤ë·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£\fIint\fR¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢ÃÍ0¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£\fIfinally\fR¥Ö¥í¥Ã¥¯¤Ï¡¢\fItry\fR¥Ö¥í¥Ã¥¯¤¬½ªÎ»¤¹¤ë¤È¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢À©¸æ¤¬\fIcatch\fR¥Ö¥í¥Ã¥¯¤Ë°Ü¤µ¤ì¤¿¾ì¹ç¡¢\fIint\fR¥á¥½¥Ã¥É¤Ï½ªÎ»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fIfinally\fR¥Ö¥í¥Ã¥¯¤Ï¼Â¹Ô¤µ¤ì¤ëɬÍפ¬¤¢¤ë¤¿¤á¡¢À©¸æ¤¬¥á¥½¥Ã¥É¤Î³°Éô¤Ë°Ü¤µ¤ì¤Æ¤¤¤Æ¤â¡¢¤³¤Î¥Ö¥í¥Ã¥¯¤Ï¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fBfinally\fR¥Ö¥í¥Ã¥¯¤Ë´Ø¤¹¤ë·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£\fBint\fR¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢ÃÍ0¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£\fBfinally\fR¥Ö¥í¥Ã¥¯¤Ï¡¢\fBtry\fR¥Ö¥í¥Ã¥¯¤¬½ªÎ»¤¹¤ë¤È¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢À©¸æ¤¬\fBcatch\fR¥Ö¥í¥Ã¥¯¤Ë°Ü¤µ¤ì¤¿¾ì¹ç¡¢\fBint\fR¥á¥½¥Ã¥É¤Ï½ªÎ»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fBfinally\fR¥Ö¥í¥Ã¥¯¤Ï¼Â¹Ô¤µ¤ì¤ëɬÍפ¬¤¢¤ë¤¿¤á¡¢À©¸æ¤¬¥á¥½¥Ã¥É¤Î³°Éô¤Ë°Ü¤µ¤ì¤Æ¤¤¤Æ¤â¡¢¤³¤Î¥Ö¥í¥Ã¥¯¤Ï¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + options + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Î»ÈÍѤ˴ؤ¹¤ëÌäÂê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Î»ÈÍѤ˴ؤ¹¤ëÌäÂê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + overrides +@@ -766,14 +800,15 @@ + .RS 4 + .\} + .nf +-public class ClassWithVarargsMethod { +- void varargsMethod(String\&.\&.\&. s) { } +-} +- +-public class ClassWithOverridingMethod extends ClassWithVarargsMethod { +- @Override +- void varargsMethod(String[] s) { } +-} ++\fBpublic class ClassWithVarargsMethod {\fR ++\fB void varargsMethod(String\&.\&.\&. s) { }\fR ++\fB}\fR ++ ++\fBpublic class ClassWithOverridingMethod extends ClassWithVarargsMethod {\fR ++\fB @Override\fR ++\fB void varargsMethod(String[] s) { }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -784,25 +819,27 @@ + .RS 4 + .\} + .nf +-warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod +-overrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding +-method is missing \*(Aq\&.\&.\&.\*(Aq ++\fBwarning: [override] varargsMethod(String[]) in ClassWithOverridingMethod \fR ++\fBoverrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding\fR ++\fBmethod is missing \*(Aq\&.\&.\&.\*(Aq\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢\fIvarargs\fR¥á¥½¥Ã¥É¤ò¸¡½Ð¤¹¤ë¤È¡¢\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤òÇÛÎó¤ËÊÑ´¹¤·¤Þ¤¹¡£¥á¥½¥Ã¥É\fIClassWithVarargsMethod\&.varargsMethod\fR¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿\fIString\&.\&.\&. s\fR¤ò²¾¥Ñ¥é¥á¡¼¥¿\fIString[] s\fR¤ËÊÑ´¹¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥á¥½¥Ã¥É\fIClassWithOverridingMethod\&.varargsMethod\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤ËÂбþ¤¹¤ëÇÛÎó¤Ç¤¹¡£¤½¤Î·ë²Ì¡¢¤³¤ÎÎã¤Ç¤Ï¥³¥ó¥Ñ¥¤¥ë¤¬¹Ô¤ï¤ì¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢\fBvarargs\fR¥á¥½¥Ã¥É¤ò¸¡½Ð¤¹¤ë¤È¡¢\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤òÇÛÎó¤ËÊÑ´¹¤·¤Þ¤¹¡£¥á¥½¥Ã¥É\fBClassWithVarargsMethod\&.varargsMethod\fR¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿\fBString\&.\&.\&. s\fR¤ò²¾¥Ñ¥é¥á¡¼¥¿\fBString[] s\fR¤ËÊÑ´¹¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥á¥½¥Ã¥É\fBClassWithOverridingMethod\&.varargsMethod\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤ËÂбþ¤¹¤ëÇÛÎó¤Ç¤¹¡£¤½¤Î·ë²Ì¡¢¤³¤ÎÎã¤Ç¤Ï¥³¥ó¥Ñ¥¤¥ë¤¬¹Ô¤ï¤ì¤Þ¤¹¡£ + .RE + .PP + path + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¤Î̵¸ú¤Ê¥Ñ¥¹Í×ÁǤȸºß¤·¤Ê¤¤¥Ñ¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹(¥¯¥é¥¹¡¦¥Ñ¥¹¡¢¥½¡¼¥¹¡¦¥Ñ¥¹¤Ê¤É¤Î¥Ñ¥¹´ØÏ¢)¡£¤³¤Î¤è¤¦¤Ê·Ù¹ð¤ò\fI@SuppressWarnings\fRÃí¼á¤ÇÍÞÀ©¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç¤Î̵¸ú¤Ê¥Ñ¥¹Í×ÁǤȸºß¤·¤Ê¤¤¥Ñ¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹(¥¯¥é¥¹¡¦¥Ñ¥¹¡¢¥½¡¼¥¹¡¦¥Ñ¥¹¤Ê¤É¤Î¥Ñ¥¹´ØÏ¢)¡£¤³¤Î¤è¤¦¤Ê·Ù¹ð¤ò\fB@SuppressWarnings\fRÃí¼á¤ÇÍÞÀ©¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-Xlint:path \-classpath /nonexistentpath Example\&.java ++\fBjavac \-Xlint:path \-classpath /nonexistentpath Example\&.java\fR ++ + .fi + .if n \{\ + .RE +@@ -819,21 +856,22 @@ + .RS 4 + .\} + .nf +-import java\&.util\&.*; +-import javax\&.annotation\&.processing\&.*; +-import javax\&.lang\&.model\&.*; +-import\&.javaz\&.lang\&.model\&.element\&.*; +- +-@SupportedAnnotationTypes("NotAnno") +-public class AnnoProc extends AbstractProcessor { +- public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv){ +- return true; +- } +- +- public SourceVersion getSupportedSourceVersion() { +- return SourceVersion\&.latest(); +- } +-} ++\fBimport java\&.util\&.*;\fR ++\fBimport javax\&.annotation\&.processing\&.*;\fR ++\fBimport javax\&.lang\&.model\&.*;\fR ++\fBimport\&.javaz\&.lang\&.model\&.element\&.*;\fR ++ ++\fB@SupportedAnnotationTypes("NotAnno")\fR ++\fBpublic class AnnoProc extends AbstractProcessor {\fR ++\fB public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv){\fR ++\fB return true;\fR ++\fB }\fR ++ ++\fB public SourceVersion getSupportedSourceVersion() {\fR ++\fB return SourceVersion\&.latest();\fR ++\fB }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -844,88 +882,93 @@ + .RS 4 + .\} + .nf +-@interface Anno { } ++\fB@interface Anno { }\fR ++\fB \fR ++\fB@Anno\fR ++\fBclass AnnosWithoutProcessors { }\fR + +-@Anno +-class AnnosWithoutProcessors { } + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Ãí¼á¥×¥í¥»¥Ã¥µ\fIAnnoProc\fR¤ò¥³¥ó¥Ñ¥¤¥ë¤·¡¢¤³¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fIAnnosWithoutProcessors\&.java\fR¤ËÂФ·¤Æ¼Â¹Ô¤·¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Ãí¼á¥×¥í¥»¥Ã¥µ\fBAnnoProc\fR¤ò¥³¥ó¥Ñ¥¤¥ë¤·¡¢¤³¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fBAnnosWithoutProcessors\&.java\fR¤ËÂФ·¤Æ¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac AnnoProc\&.java +-javac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java ++\fBjavac AnnoProc\&.java\fR ++\fBjavac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥³¥ó¥Ñ¥¤¥é¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fIAnnosWithoutProcessors\&.java\fR¤ËÂФ·¤ÆÃí¼á¥×¥í¥»¥Ã¥µ¤ò¼Â¹Ô¤¹¤ë¤È¡¢¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fBAnnosWithoutProcessors\&.java\fR¤ËÂФ·¤ÆÃí¼á¥×¥í¥»¥Ã¥µ¤ò¼Â¹Ô¤¹¤ë¤È¡¢¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-warning: [processing] No processor claimed any of these annotations: Anno ++\fBwarning: [processing] No processor claimed any of these annotations: Anno\fR ++\fB \fR ++.fi ++.if n \{\ ++.RE ++.\} ++¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¡¢¥¯¥é¥¹\fBAnnosWithoutProcessors\fR¤ÇÄêµÁ¤ª¤è¤Ó»ÈÍѤµ¤ì¤ëÃí¼á¤Î̾Á°¤ò¡¢\fBAnno\fR¤«¤é\fBNotAnno\fR¤ËÊѹ¹¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++rawtypes ++.RS 4 ++raw·¿¤ËÂФ¹¤ë̤¸¡ººÁàºî¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¼¡¤Îʸ¤Ç¤Ï¡¢\fBrawtypes\fR·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBvoid countElements(List l) { \&.\&.\&. }\fR + + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¡¢¥¯¥é¥¹\fIAnnosWithoutProcessors\fR¤ÇÄêµÁ¤ª¤è¤Ó»ÈÍѤµ¤ì¤ëÃí¼á¤Î̾Á°¤ò¡¢\fIAnno\fR¤«¤é\fINotAnno\fR¤ËÊѹ¹¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-rawtypes +-.RS 4 +-raw·¿¤ËÂФ¹¤ë̤¸¡ººÁàºî¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¼¡¤Îʸ¤Ç¤Ï¡¢\fIrawtypes\fR·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBrawtypes\fR·Ù¹ð¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-void countElements(List l) { \&.\&.\&. } ++\fBvoid countElements(List<?> l) { \&.\&.\&. }\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIrawtypes\fR·Ù¹ð¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£ ++\fBList\fR¤Ïraw·¿¤Ç¤¹¡£¤¿¤À¤·¡¢\fBList<?>\fR¤Ï¡¢¥¢¥ó¥Ð¥¦¥ó¥É·Á¼°¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤Î¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿¤Ç¤¹¡£\fBList\fR¤Ï¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¢¤ë¤¿¤á¡¢¾ï¤Ë¤½¤Î·¿°ú¿ô¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fBList\fR¤Î²¾°ú¿ô¤Ï¥¢¥ó¥Ð¥¦¥ó¥É·Á¼°¤Î¥ï¥¤¥ë¥É¥«¡¼¥É(\fB?\fR)¤ò»ÈÍѤ·¤Æ¤½¤Î²¾·¿¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢\fBcountElements\fR¥á¥½¥Ã¥É¤Ï\fBList\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¤É¤Î¥¤¥ó¥¹¥¿¥ó¥¹²½¤â¼õ¤±ÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.RE ++.PP ++Serial ++.RS 4 ++ľÎó²½²Äǽ¥¯¥é¥¹¤Ë\fBserialVersionUID\fRÄêµÁ¤¬¤Ê¤¤¤³¤È¤ò·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-void countElements(List<?> l) { \&.\&.\&. } +-.fi +-.if n \{\ +-.RE +-.\} +-\fIList\fR¤Ïraw·¿¤Ç¤¹¡£¤¿¤À¤·¡¢\fIList<?>\fR¤Ï¡¢¥¢¥ó¥Ð¥¦¥ó¥É·Á¼°¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤Î¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿¤Ç¤¹¡£\fIList\fR¤Ï¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¢¤ë¤¿¤á¡¢¾ï¤Ë¤½¤Î·¿°ú¿ô¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fIList\fR¤Î²¾°ú¿ô¤Ï¥¢¥ó¥Ð¥¦¥ó¥É·Á¼°¤Î¥ï¥¤¥ë¥É¥«¡¼¥É(\fI?\fR)¤ò»ÈÍѤ·¤Æ¤½¤Î²¾·¿¥Ñ¥é¥á¡¼¥¿¤È¤·¤Æ»ØÄꤵ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢\fIcountElements\fR¥á¥½¥Ã¥É¤Ï\fIList\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¤É¤Î¥¤¥ó¥¹¥¿¥ó¥¹²½¤â¼õ¤±ÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ +-.RE +-.PP +-Serial +-.RS 4 +-ľÎó²½²Äǽ¥¯¥é¥¹¤Ë\fIserialVersionUID\fRÄêµÁ¤¬¤Ê¤¤¤³¤È¤ò·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-public class PersistentTime implements Serializable +-{ +- private Date time; ++\fBpublic class PersistentTime implements Serializable\fR ++\fB{\fR ++\fB private Date time;\fR ++\fB \fR ++\fB public PersistentTime() {\fR ++\fB time = Calendar\&.getInstance()\&.getTime();\fR ++\fB }\fR ++\fB \fR ++\fB public Date getTime() {\fR ++\fB return time;\fR ++\fB }\fR ++\fB}\fR + +- public PersistentTime() { +- time = Calendar\&.getInstance()\&.getTime(); +- } +- +- public Date getTime() { +- return time; +- } +-} + .fi + .if n \{\ + .RE +@@ -936,13 +979,14 @@ + .RS 4 + .\} + .nf +-warning: [serial] serializable class PersistentTime has no definition of +-serialVersionUID ++\fBwarning: [serial] serializable class PersistentTime has no definition of\fR ++\fBserialVersionUID\fR ++ + .fi + .if n \{\ + .RE + .\} +-ľÎó²½²Äǽ¥¯¥é¥¹¤¬\fIserialVersionUID\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥£¡¼¥ë¥É¤òÌÀ¼¨Åª¤ËÀë¸À¤·¤Ê¤¤¾ì¹ç¡¢Ä¾Îó²½¥é¥ó¥¿¥¤¥à´Ä¶­¤Ç¤Ï¡¢¡ÖJava¥ª¥Ö¥¸¥§¥¯¥ÈľÎó²½»ÅÍ͡פÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¹¤ÎÍÍ¡¹¤Ê¦Ì̤˴ð¤Å¤¤¤Æ¡¢¥¯¥é¥¹¤Î\fIserialVersionUID\fR¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò·×»»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢¤¹¤Ù¤Æ¤ÎľÎó²½²Äǽ¥¯¥é¥¹¤¬\fIserialVersionUID\fRÃͤòÌÀ¼¨Åª¤ËÀë¸À¤¹¤ë¤³¤È¤ò¶¯¤¯¤ªÁ¦¤á¤·¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢\fIserialVersionUID\fRÃͤò·×»»¤¹¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥»¥¹¤¬¡¢¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ë²ÄǽÀ­¤Î¤¢¤ë¥¯¥é¥¹¤Î¾ÜºÙ¤Ë¤­¤ï¤á¤Æ±Æ¶Á¤ò¼õ¤±¤ä¤¹¤¯¡¢¤½¤Î·ë²Ì¡¢Ä¾Îó²½Éü¸µÃæ¤Ëͽ´ü¤·¤Ê¤¤\fIInvalidClassExceptions\fR¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¤Ç¤¹¡£Java¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤¬°Û¤Ê¤Ã¤Æ¤â\fIserialVersionUID\fRÃͤΰì´ÓÀ­¤ò³ÎÊݤˤ¹¤ë¤Ë¤Ï¡¢Ä¾Îó²½²Äǽ¥¯¥é¥¹¤¬\fIserialVersionUID\fRÃͤòÌÀ¼¨Åª¤ËÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++ľÎó²½²Äǽ¥¯¥é¥¹¤¬\fBserialVersionUID\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥£¡¼¥ë¥É¤òÌÀ¼¨Åª¤ËÀë¸À¤·¤Ê¤¤¾ì¹ç¡¢Ä¾Îó²½¥é¥ó¥¿¥¤¥à´Ä¶­¤Ç¤Ï¡¢¡ÖJava¥ª¥Ö¥¸¥§¥¯¥ÈľÎó²½»ÅÍ͡פÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¹¤ÎÍÍ¡¹¤Ê¦Ì̤˴ð¤Å¤¤¤Æ¡¢¥¯¥é¥¹¤Î\fBserialVersionUID\fR¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò·×»»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢¤¹¤Ù¤Æ¤ÎľÎó²½²Äǽ¥¯¥é¥¹¤¬\fBserialVersionUID\fRÃͤòÌÀ¼¨Åª¤ËÀë¸À¤¹¤ë¤³¤È¤ò¶¯¤¯¤ªÁ¦¤á¤·¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢\fBserialVersionUID\fRÃͤò·×»»¤¹¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥»¥¹¤¬¡¢¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ë²ÄǽÀ­¤Î¤¢¤ë¥¯¥é¥¹¤Î¾ÜºÙ¤Ë¤­¤ï¤á¤Æ±Æ¶Á¤ò¼õ¤±¤ä¤¹¤¯¡¢¤½¤Î·ë²Ì¡¢Ä¾Îó²½Éü¸µÃæ¤Ëͽ´ü¤·¤Ê¤¤\fBInvalidClassExceptions\fR¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¤Ç¤¹¡£Java¥³¥ó¥Ñ¥¤¥é¤Î¼ÂÁõ¤¬°Û¤Ê¤Ã¤Æ¤â\fBserialVersionUID\fRÃͤΰì´ÓÀ­¤ò³ÎÊݤˤ¹¤ë¤Ë¤Ï¡¢Ä¾Îó²½²Äǽ¥¯¥é¥¹¤¬\fBserialVersionUID\fRÃͤòÌÀ¼¨Åª¤ËÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + static +@@ -953,10 +997,11 @@ + .RS 4 + .\} + .nf +-class XLintStatic { +- static void m1() { } +- void m2() { this\&.m1(); } +-} ++\fBclass XLintStatic {\fR ++\fB static void m1() { }\fR ++\fB void m2() { this\&.m1(); }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -967,35 +1012,38 @@ + .RS 4 + .\} + .nf +-warning: [static] static method should be qualified by type name, +-XLintStatic, instead of by an expression ++\fBwarning: [static] static method should be qualified by type name, \fR ++\fBXLintStatic, instead of by an expression\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¡¢¼¡¤Î¤è¤¦¤Ë\fIstatic\fR¥á¥½¥Ã¥É\fIm1\fR¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¤³¤ÎÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¡¢¼¡¤Î¤è¤¦¤Ë\fBstatic\fR¥á¥½¥Ã¥É\fBm1\fR¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-XLintStatic\&.m1(); ++\fBXLintStatic\&.m1();\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤¢¤ë¤¤¤Ï¡¢\fIstatic\fR¥­¡¼¥ï¡¼¥É¤ò¥á¥½¥Ã¥É\fIm1\fR¤ÎÀë¸À¤«¤éºï½ü¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++¤¢¤ë¤¤¤Ï¡¢\fBstatic\fR¥­¡¼¥ï¡¼¥É¤ò¥á¥½¥Ã¥É\fBm1\fR¤ÎÀë¸À¤«¤éºï½ü¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + try + .RS 4 +-try\-with\-resourcesʸ¤ò´Þ¤à¡¢\fItry\fR¥Ö¥í¥Ã¥¯¤Î»ÈÍѤ˴ؤ¹¤ëÌäÂê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fItry\fR¥Ö¥í¥Ã¥¯¤ÇÀë¸À¤µ¤ì¤¿¥ê¥½¡¼¥¹\fIac\fR¤¬»ÈÍѤµ¤ì¤Ê¤¤¤¿¤á¤Ë¡¢¼¡¤Îʸ¤ËÂФ·¤Æ·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++try\-with\-resourcesʸ¤ò´Þ¤à¡¢\fBtry\fR¥Ö¥í¥Ã¥¯¤Î»ÈÍѤ˴ؤ¹¤ëÌäÂê¤Ë¤Ä¤¤¤Æ·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBtry\fR¥Ö¥í¥Ã¥¯¤ÇÀë¸À¤µ¤ì¤¿¥ê¥½¡¼¥¹\fBac\fR¤¬»ÈÍѤµ¤ì¤Ê¤¤¤¿¤á¤Ë¡¢¼¡¤Îʸ¤ËÂФ·¤Æ·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-try ( AutoCloseable ac = getResource() ) { // do nothing} ++\fBtry ( AutoCloseable ac = getResource() ) { // do nothing}\fR ++ + .fi + .if n \{\ + .RE +@@ -1010,37 +1058,39 @@ + .RS 4 + .\} + .nf +-List l = new ArrayList<Number>(); +-List<String> ls = l; // unchecked warning ++\fBList l = new ArrayList<Number>();\fR ++\fBList<String> ls = l; // unchecked warning\fR ++ + .fi + .if n \{\ + .RE + .\} +-·¿¤Î¾ÃµîÃæ¤Ë¡¢·¿\fIArrayList<Number>\fR¤ª¤è¤Ó\fIList<String>\fR¤Ï¡¢¤½¤ì¤¾¤ì\fIArrayList\fR¤ª¤è¤Ó\fIList\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++·¿¤Îºï½üÃæ¡¢·¿\fBArrayList<Number>\fR¤ª¤è¤Ó\fBList<String>\fR¤Ï¡¢¤½¤ì¤¾¤ì\fBArrayList\fR¤ª¤è¤Ó\fBList\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp +-\fIls\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿\fIList<String>\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£\fIl\fR¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë\fIList\fR¤¬\fIls\fR¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï̤¸¡ºº·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤ª¤è¤ÓJVM¤Ï¡¢\fIl\fR¤¬\fIList<String>\fR·¿¤ò»²¾È¤¹¤ë¤«¤É¤¦¤«¤òȽÊ̤Ǥ­¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fIl\fR¤Ï¡¢\fIList<String>\fR·¿¤ò»²¾È¤·¤Þ¤»¤ó¡£¤½¤Î·ë²Ì¡¢¥Ò¡¼¥×±øÀ÷¤¬È¯À¸¤·¤Þ¤¹¡£ ++\fBls\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿\fBList<String>\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£\fBl\fR¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë\fBList\fR¤¬\fBls\fR¤Ë³ä¤êÅö¤Æ¤é¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï̤¸¡ºº·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤ª¤è¤ÓJVM¤Ï¡¢\fBl\fR¤¬\fBList<String>\fR·¿¤ò»²¾È¤¹¤ë¤«¤É¤¦¤«¤òȽÊ̤Ǥ­¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fBl\fR¤Ï¡¢\fBList<String>\fR·¿¤ò»²¾È¤·¤Þ¤»¤ó¡£¤½¤Î·ë²Ì¡¢¥Ò¡¼¥×±øÀ÷¤¬È¯À¸¤·¤Þ¤¹¡£ + .sp +-¥Ò¡¼¥×±øÀ÷¾õÂÖ¤¬È¯À¸¤¹¤ë¤Î¤Ï¡¢\fIList\fR¥ª¥Ö¥¸¥§¥¯¥È\fIl\fR +-(¤½¤Îstatic·¿¤Ï\fIList<Number>\fR)¤¬Ê̤Î\fIList\fR¥ª¥Ö¥¸¥§¥¯¥È\fIls\fR +-(°Û¤Ê¤ëstatic·¿\fIList<String>\fR¤ò»ý¤Ä)¤ËÂåÆþ¤µ¤ì¤ë¾ì¹ç¤Ç¤¹¡£¤·¤«¤·¡¢¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¤³¤ÎÂåÆþ¤ò¤¤¤Þ¤À¤Ëµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£Áí¾Î¤ò¥µ¥Ý¡¼¥È¤·¤Ê¤¤Java SE¤Î¥ê¥ê¡¼¥¹¤È¤Î²¼°Ì¸ß´¹À­¤ò³ÎÊݤ¹¤ë¤¿¤á¤Ë¡¢¤³¤ÎÂåÆþ¤òµö²Ä¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£·¿¾Ãµî¤Ë¤è¤ê¡¢\fIList<Number>\fR¤ª¤è¤Ó\fIList<String>\fR¤Ï¡¢Î¾Êý¤È¤â\fIList\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥ª¥Ö¥¸¥§¥¯¥È\fIl\fR +-(\fIList\fR¤È¤¤¤¦raw·¿¤ò»ý¤Ä)¤ò¥ª¥Ö¥¸¥§¥¯¥È\fIls\fR¤ËÂåÆþ¤¹¤ë¤³¤È¤òµö²Ä¤·¤Þ¤¹¡£ ++¥Ò¡¼¥×±øÀ÷¾õÂÖ¤¬È¯À¸¤¹¤ë¤Î¤Ï¡¢\fBList\fR¥ª¥Ö¥¸¥§¥¯¥È\fBl\fR ++(¤½¤Îstatic·¿¤Ï\fBList<Number>\fR)¤¬Ê̤Î\fBList\fR¥ª¥Ö¥¸¥§¥¯¥È\fBls\fR ++(°Û¤Ê¤ëstatic·¿\fBList<String>\fR¤ò»ý¤Ä)¤ËÂåÆþ¤µ¤ì¤ë¾ì¹ç¤Ç¤¹¡£¤·¤«¤·¡¢¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¤³¤ÎÂåÆþ¤ò¤¤¤Þ¤À¤Ëµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£Áí¾Î¤ò¥µ¥Ý¡¼¥È¤·¤Ê¤¤Java SE¤Î¥ê¥ê¡¼¥¹¤È¤Î¸åÊý¸ß´¹À­¤ò³ÎÊݤ¹¤ë¤¿¤á¤Ë¡¢¤³¤ÎÂåÆþ¤òµö²Ä¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£·¿¤Îºï½ü¤Î¤¿¤á¡¢\fBList<Number>\fR¤ª¤è¤Ó\fBList<String>\fR¤Ï¡¢Î¾Êý\fBList\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥ª¥Ö¥¸¥§¥¯¥È\fBl\fR ++(\fBList\fR¤È¤¤¤¦raw·¿¤ò»ý¤Ä)¤ò¥ª¥Ö¥¸¥§¥¯¥È\fBls\fR¤ËÂåÆþ¤¹¤ë¤³¤È¤òµö²Ä¤·¤Þ¤¹¡£ + .RE + .PP + varargs + .RS 4 +-²ÄÊÑ°ú¿ô(\fIvarargs\fR)¥á¥½¥Ã¥É¡¢ÆäËÈó¶ñ¾Ý²½²Äǽ°ú¿ô¤ò´Þ¤à¤â¤Î¤Î»ÈÍѤ¬°ÂÁ´¤Ç¤Ê¤¤¤³¤È¤ò·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++²ÄÊÑ°ú¿ô(\fBvarargs\fR)¥á¥½¥Ã¥É¡¢ÆäËÈó¶ñ¾Ý²½²Äǽ°ú¿ô¤ò´Þ¤à¤â¤Î¤Î»ÈÍѤ¬°ÂÁ´¤Ç¤Ê¤¤¤³¤È¤ò·Ù¹ð¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public class ArrayBuilder { +- public static <T> void addToList (List<T> listArg, T\&.\&.\&. elements) { +- for (T x : elements) { +- listArg\&.add(x); +- } +- } +-} ++\fBpublic class ArrayBuilder {\fR ++\fB public static <T> void addToList (List<T> listArg, T\&.\&.\&. elements) {\fR ++\fB for (T x : elements) {\fR ++\fB listArg\&.add(x);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -1048,38 +1098,42 @@ + \fBÃí°Õ:\fR + Èó¶ñ¾Ý²½²Äǽ·¿¤Ï¡¢·¿¾ðÊ󤬼¹Իþ¤Ë´°Á´¤Ë»ÈÍÑÉÔ²Äǽ¤Ê·¿¤Ç¤¹¡£ + .sp +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥á¥½¥Ã¥É\fIArrayBuilder\&.addToList\fR¤ÎÄêµÁ¤Ë´Ø¤¹¤ë¼¡¤Î·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥á¥½¥Ã¥É\fBArrayBuilder\&.addToList\fR¤ÎÄêµÁ¤Ë´Ø¤¹¤ë¼¡¤Î·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-warning: [varargs] Possible heap pollution from parameterized vararg type T ++\fBwarning: [varargs] Possible heap pollution from parameterized vararg type T\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢varargs¥á¥½¥Ã¥É¤ò¸¡½Ð¤¹¤ë¤È¡¢\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤òÇÛÎó¤ËÊÑ´¹¤·¤Þ¤¹¡£¤·¤«¤·¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿¤ÎÇÛÎó¤ÎºîÀ®¤òµö²Ä¤·¤Æ¤¤¤Þ¤»¤ó¡£¥á¥½¥Ã¥É\fIArrayBuilder\&.addToList\fR¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿\fIT\&.\&.\&.\fRÍ×ÁǤò²¾¥Ñ¥é¥á¡¼¥¿\fIT[]\fRÍ×ÁÇ(ÇÛÎó)¤ËÊÑ´¹¤·¤Þ¤¹¡£¤·¤«¤·¡¢·¿¾Ãµî¤Ë¤è¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fIvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤ò\fIObject[]\fRÍ×ÁǤËÊÑ´¹¤·¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢¥Ò¡¼¥×±øÀ÷¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢varargs¥á¥½¥Ã¥É¤ò¸¡½Ð¤¹¤ë¤È¡¢\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤òÇÛÎó¤ËÊÑ´¹¤·¤Þ¤¹¡£¤·¤«¤·¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤¿·¿¤ÎÇÛÎó¤ÎºîÀ®¤òµö²Ä¤·¤Æ¤¤¤Þ¤»¤ó¡£¥á¥½¥Ã¥É\fBArrayBuilder\&.addToList\fR¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿\fBT\&.\&.\&.\fRÍ×ÁǤò²¾¥Ñ¥é¥á¡¼¥¿\fBT[]\fRÍ×ÁÇ(ÇÛÎó)¤ËÊÑ´¹¤·¤Þ¤¹¡£¤·¤«¤·¡¢·¿¾Ãµî¤Ë¤è¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï\fBvarargs\fR¤Î²¾¥Ñ¥é¥á¡¼¥¿¤ò\fBObject[]\fRÍ×ÁǤËÊÑ´¹¤·¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢¥Ò¡¼¥×±øÀ÷¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .RE +-.SH "¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¥Õ¥¡¥¤¥ë" ++.SH "¥³¥Þ¥ó¥É¹Ô°ú¿ô¥Õ¥¡¥¤¥ë" + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤òû¤¯¤·¤¿¤ê´Ê·é¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ë¡¢\fIjavac\fR¥³¥Þ¥ó¥É¤ËÂФ¹¤ë°ú¿ô(\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤ò´Þ¤à1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¾å¤Ç¤â¡¢Ç¤°Õ¤ÎŤµ¤Î\fIjavac\fR¥³¥Þ¥ó¥É¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤òû¤¯¤·¤¿¤ê´Ê·é¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ë¡¢\fBjavac\fR¥³¥Þ¥ó¥É¤ËÂФ¹¤ë°ú¿ô(\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤ò´Þ¤à1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¾å¤Ç¤â¡¢Ç¤°Õ¤ÎŤµ¤Î\fBjavac\fR¥³¥Þ¥ó¥É¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ + .PP +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIjavac\fR¤Î¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò¼«Í³¤ËÁȤ߹礻¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤Ï¡¢¶õÇò¤Þ¤¿¤Ï²þ¹Ôʸ»ú¤Ç¶èÀڤ뤳¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤ËËä¤á¹þ¤Þ¤ì¤¿¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾Á´ÂΤòÆó½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£ ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBjavac\fR¤Î¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò¼«Í³¤ËÁȤ߹礻¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î°ú¿ô¤Ï¡¢¶õÇò¤Þ¤¿¤Ï²þ¹Ôʸ»ú¤Ç¶èÀڤ뤳¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤ËËä¤á¹þ¤Þ¤ì¤¿¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾Á´ÂΤòÆó½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£ + .PP +-°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ǤϤʤ¯¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ê¥¹¥È¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É(*)¤Ï»ÈÍѤǤ­¤Þ¤»¤ó(¤¿¤È¤¨¤Ð¡¢\fI*\&.java\fR¤È¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó)¡£¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤¿¥Õ¥¡¥¤¥ë¤ÎºÆµ¢Åª¤Ê²ò¼á¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fI\-J\fR¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïµ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤Þ¤¹¤¬¡¢µ¯Æ°¥Ä¡¼¥ë¤Ç¤Ï°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ ++°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ǤϤʤ¯¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ê¥¹¥È¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É(*)¤Ï»ÈÍѤǤ­¤Þ¤»¤ó(¤¿¤È¤¨¤Ð¡¢\fB*\&.java\fR¤È¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó)¡£¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤¿¥Õ¥¡¥¤¥ë¤ÎºÆµ¢Åª¤Ê²ò¼á¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fB\-J\fR¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïµ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤Þ¤¹¤¬¡¢µ¯Æ°¥Ä¡¼¥ë¤Ç¤Ï°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢³Æ°ú¿ô¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È̾Á°¤ÎÀèƬ¤Ë¥¢¥Ã¥È¥Þ¡¼¥¯(@)ʸ»ú¤òÉÕ¤±¤ÆÅϤ·¤Þ¤¹¡£\fIjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢³Æ°ú¿ô¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È̾Á°¤ÎÀèƬ¤Ë¥¢¥Ã¥È¥Þ¡¼¥¯(@)ʸ»ú¤òÉÕ¤±¤ÆÅϤ·¤Þ¤¹¡£\fBjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ + .PP +-\fBExample 1\fR, ñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë ++\fBÎã 1\fR ++.br ++ñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë + .RS 4 +-\fIargfile\fR¤È¤¤¤¦Ì¾Á°¤Îñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¤¹¤Ù¤Æ¤Î\fIjavac\fR°ú¿ô¤ò³ÊǼ¤¹¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fBargfile\fR¤È¤¤¤¦Ì¾Á°¤Îñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¤¹¤Ù¤Æ¤Î\fBjavac\fR°ú¿ô¤ò³ÊǼ¤¹¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac @argfile ++\fBjavac @argfile\fR ++ + .fi + .if n \{\ + .RE +@@ -1087,9 +1141,11 @@ + ¤³¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Îã2¤Ç¼¨¤µ¤ì¤Æ¤¤¤ëξÊý¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòÆþ¤ì¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP +-\fBExample 2\fR, 2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë ++\fBÎã 2\fR ++.br ++2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë + .RS 4 +-\fIjavac\fR¥ª¥×¥·¥ç¥óÍѤȥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾ÍѤˡ¢2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥ê¥¹¥È¤Ë¤Ï¡¢¹Ô¤Î·Ñ³ʸ»ú¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++\fBjavac\fR¥ª¥×¥·¥ç¥óÍѤȥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾ÍѤˡ¢2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥ê¥¹¥È¤Ë¤Ï¡¢¹Ô¤Î·Ñ³ʸ»ú¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .sp + ¼¡¤ò´Þ¤àoptions¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£ + .sp +@@ -1097,9 +1153,7 @@ + .RS 4 + .\} + .nf +-\-d classes +-\-g +-\-sourcepath /java/pubs/ws/1\&.3/src/share/classes ++\fB\-d classes\fR + .fi + .if n \{\ + .RE +@@ -1109,6 +1163,27 @@ + .RS 4 + .\} + .nf ++\fB\-g\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-sourcepath /java/pubs/ws/1\&.3/src/share/classes\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++ + .fi + .if n \{\ + .RE +@@ -1119,35 +1194,40 @@ + .RS 4 + .\} + .nf +-MyClass1\&.java +-MyClass2\&.java +-MyClass3\&.java ++\fBMyClass1\&.java\fR ++\fBMyClass2\&.java\fR ++\fBMyClass3\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤½¤ì¤«¤é¡¢¼¡¤Î¤è¤¦¤Ë\fIjavac\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤½¤ì¤«¤é¡¢¼¡¤Î¤è¤¦¤Ë\fBjavac\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac @options @classes ++\fBjavac @options @classes\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, ¥Ñ¥¹¤ò»ÈÍѤ·¤¿°ú¿ô¥Õ¥¡¥¤¥ë ++\fBÎã 3\fR ++.br ++¥Ñ¥¹¤ò»ÈÍѤ·¤¿°ú¿ô¥Õ¥¡¥¤¥ë + .RS 4 +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢(\fIpath1\fR¤ä\fIpath2\fR¤Ç¤Ï¤Ê¤¯)¼¡¤Î¤è¤¦¤Ë¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£ ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢(\fBpath1\fR¤ä\fBpath2\fR¤Ç¤Ï¤Ê¤¯)¼¡¤Î¤è¤¦¤Ë¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac @path1/options @path2/classes ++\fBjavac @path1/options @path2/classes\fR ++ + .fi + .if n \{\ + .RE +@@ -1155,106 +1235,110 @@ + .RE + .SH "Ãí¼á½èÍý" + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤¬Ãí¼á½èÍý¤òľÀÜ¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤¿¤á¡¢ÆÈΩ¤·¤¿Ãí¼á½èÍý¥³¥Þ¥ó¥É¤Ç¤¢¤ë\fIapt\fR¤ò»ÈÍѤ¹¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤¬Ãí¼á½èÍý¤òľÀÜ¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤¿¤á¡¢ÆÈΩ¤·¤¿Ãí¼á½èÍý¥³¥Þ¥ó¥É¤Ç¤¢¤ë\fBapt\fR¤ò»ÈÍѤ¹¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿¡£ + .PP +-Ãí¼á¥×¥í¥»¥Ã¥µ¤ÎAPI¤Ï¡¢\fIjavax\&.annotation\&.processing\fR¤ª¤è¤Ó\fIjavax\&.lang\&.model\fR¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++Ãí¼á¥×¥í¥»¥Ã¥µ¤ÎAPI¤Ï¡¢\fBjavax\&.annotation\&.processing\fR¤ª¤è¤Ó\fBjavax\&.lang\&.model\fR¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .SS "Ãí¼á½èÍý¤ò¹Ô¤¦ÊýË¡" + .PP +-\fI\-proc:none\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÃí¼á½èÍý¤¬Ìµ¸ú²½¤µ¤ì¤Ê¤¤¸Â¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤ò¸¡º÷¤·¤Þ¤¹¡£¸¡º÷¥Ñ¥¹¤Ï¡¢\fI\-processorpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ñ¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥×¥í¥»¥Ã¥µ¤Î¸¡º÷¤Ï¡¢¸¡º÷¥Ñ¥¹¾å¤Î\fIMETA\-INF/services/javax\&.annotation\&.processing\fR\&.Processor¤È¤¤¤¦Ì¾Á°¤Î¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¹½À®¥Õ¥¡¥¤¥ë¤Ë´ð¤Å¤¤¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢»ÈÍѤ¹¤ë¤¹¤Ù¤Æ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤Î̾Á°¤ò¡¢1¹Ô¤Ë1¤Ä¤º¤Ä´Þ¤á¤Æ¤¯¤À¤µ¤¤¡£¤Þ¤¿¡¢Ê̤ÎÊýË¡¤È¤·¤Æ¡¢\fI\-processor\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥×¥í¥»¥Ã¥µ¤òÌÀ¼¨Åª¤Ë»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++\fB\-proc:none\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÃí¼á½èÍý¤¬Ìµ¸ú²½¤µ¤ì¤Ê¤¤¸Â¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤ò¸¡º÷¤·¤Þ¤¹¡£¸¡º÷¥Ñ¥¹¤Ï¡¢\fB\-processorpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄê¤Ç¤­¤Þ¤¹¡£¥Ñ¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥×¥í¥»¥Ã¥µ¤Î¸¡º÷¤Ï¡¢¸¡º÷¥Ñ¥¹¾å¤Î\fBMETA\-INF/services/javax\&.annotation\&.processing\fR\&.Processor¤È¤¤¤¦Ì¾Á°¤Î¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¹½À®¥Õ¥¡¥¤¥ë¤Ë´ð¤Å¤¤¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢»ÈÍѤ¹¤ë¤¹¤Ù¤Æ¤ÎÃí¼á¥×¥í¥»¥Ã¥µ¤Î̾Á°¤ò¡¢1¹Ô¤Ë1¤Ä¤º¤Ä´Þ¤á¤Æ¤¯¤À¤µ¤¤¡£¤Þ¤¿¡¢Ê̤ÎÊýË¡¤È¤·¤Æ¡¢\fB\-processor\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥×¥í¥»¥Ã¥µ¤òÌÀ¼¨Åª¤Ë»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ä¥¯¥é¥¹¤òÁöºº¤¹¤ë¤³¤È¤Ç¡¢¤É¤Î¤è¤¦¤ÊÃí¼á¤¬Â¸ºß¤·¤Æ¤¤¤ë¤«¤ò³Îǧ¤·½ª¤ï¤ë¤È¡¢¥×¥í¥»¥Ã¥µ¤ËÂФ·¤ÆÌä¹ç¤»¤ò¹Ô¤¤¡¢¤½¤ì¤é¤Î¥×¥í¥»¥Ã¥µ¤¬¤É¤ÎÃí¼á¤ò½èÍý¤Ç¤­¤ë¤Î¤«¤ò³Îǧ¤·¤Þ¤¹¡£°ìÃפ¹¤ë¤â¤Î¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¥×¥í¥»¥Ã¥µ¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£³Æ¥×¥í¥»¥Ã¥µ¤Ï¡¢¼«¿È¤¬½èÍý¤¹¤ëÃí¼á¤òÍ×µá¤Ç¤­¤Þ¤¹¡£¤½¤Î¾ì¹ç¡¢¤½¤ì¤é¤ÎÃí¼á¤ËÂФ¹¤ëÊÌ¤Î¥×¥í¥»¥Ã¥µ¤ò¸«¤Ä¤±¤ë»î¤ß¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£¤¹¤Ù¤Æ¤ÎÃí¼á¤¬Í׵ᤵ¤ì¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤½¤ì°Ê¾å¥×¥í¥»¥Ã¥µ¤Î¸¡º÷¤ò¹Ô¤¤¤Þ¤»¤ó¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ä¥¯¥é¥¹¤òÁöºº¤¹¤ë¤³¤È¤Ç¡¢¤É¤Î¤è¤¦¤ÊÃí¼á¤¬Â¸ºß¤·¤Æ¤¤¤ë¤«¤ò³Îǧ¤·½ª¤ï¤ë¤È¡¢¥×¥í¥»¥Ã¥µ¤ËÂФ·¤ÆÌä¹ç¤»¤ò¹Ô¤¤¡¢¤½¤ì¤é¤Î¥×¥í¥»¥Ã¥µ¤¬¤É¤ÎÃí¼á¤ò½èÍý¤Ç¤­¤ë¤Î¤«¤ò³Îǧ¤·¤Þ¤¹¡£°ìÃפ¹¤ë¤â¤Î¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¥×¥í¥»¥Ã¥µ¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£³Æ¥×¥í¥»¥Ã¥µ¤Ï¡¢¼«¿È¤¬½èÍý¤¹¤ëÃí¼á¤òÍ×µá¤Ç¤­¤Þ¤¹¡£¤½¤Î¾ì¹ç¡¢¤½¤ì¤é¤ÎÃí¼á¤ËÂФ¹¤ëÊÌ¤Î¥×¥í¥»¥Ã¥µ¤ò¸«¤Ä¤±¤ë»î¤ß¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£¤¹¤Ù¤Æ¤ÎÃí¼á¤¬Í׵ᤵ¤ì¤ë¤È¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤½¤ì°Ê¾å¥×¥í¥»¥Ã¥µ¤Î¸¡º÷¤ò¹Ô¤¤¤Þ¤»¤ó¡£ + .PP + ¤¤¤º¤ì¤«¤Î¥×¥í¥»¥Ã¥µ¤Ë¤è¤Ã¤Æ¿·¤·¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤ë¤È¡¢Ãí¼á½èÍý¤Î2²óÌܤΥ饦¥ó¥É¤¬³«»Ï¤µ¤ì¤Þ¤¹¡£¿·¤·¤¯À¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥¹¥­¥ã¥ó¤µ¤ì¡¢Á°²ó¤ÈƱÍͤËÃí¼á¤¬½èÍý¤µ¤ì¤Þ¤¹¡£°ÊÁ°¤Î¥é¥¦¥ó¥É¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¥×¥í¥»¥Ã¥µ¤Ï¤¹¤Ù¤Æ¡¢¸å³¤Î¤É¤Î¥é¥¦¥ó¥É¤Ç¤â¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£¤³¤ì¤¬¡¢¿·¤·¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤¯¤Ê¤ë¤Þ¤Ç³¤­¤Þ¤¹¡£ + .PP +-¤¢¤ë¥é¥¦¥ó¥É¤Ç¿·¤·¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢Ãí¼á¥×¥í¥»¥Ã¥µ¤¬¤¢¤È1²ó¤Î¤ß¸Æ¤Ó½Ð¤µ¤ì¡¢»Ä¤ê¤Î½èÍý¤ò¼Â¹Ô¤¹¤ëµ¡²ñ¤¬Í¿¤¨¤é¤ì¤Þ¤¹¡£ºÇ¸å¤Ë¡¢\fI\-proc:only\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Ê¤¤¤«¤®¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¸µ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈÀ¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¤¢¤ë¥é¥¦¥ó¥É¤Ç¿·¤·¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢Ãí¼á¥×¥í¥»¥Ã¥µ¤¬¤¢¤È1²ó¤Î¤ß¸Æ¤Ó½Ð¤µ¤ì¡¢»Ä¤ê¤Î½èÍý¤ò¼Â¹Ô¤¹¤ëµ¡²ñ¤¬Í¿¤¨¤é¤ì¤Þ¤¹¡£ºÇ¸å¤Ë¡¢\fB\-proc:only\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Ê¤¤¤«¤®¤ê¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¸µ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈÀ¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .SS "°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë" + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢°ìÏ¢¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ëºÝ¤Ë¡¢Ê̤Υ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò°ÅÌÛŪ¤Ë¥í¡¼¥É¤¹¤ë¤³¤È¤¬É¬Íפʾì¹ç¤¬¤¢¤ê¤Þ¤¹¡£·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤½¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ï¡¢¸½»þÅÀ¤Ç¤ÏÃí¼á½èÍý¤ÎÂоݤˤʤê¤Þ¤»¤ó¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ãí¼á½èÍý¤¬¼Â¹Ô¤µ¤ì¡¢¤«¤Ä°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿Ç¤°Õ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï·Ù¹ð¤òȯ¹Ô¤·¤Þ¤¹¡£\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢·Ù¹ð¤òÍÞÀ©¤¹¤ëÊýË¡¤¬Ä󶡤µ¤ì¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢°ìÏ¢¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ëºÝ¤Ë¡¢Ê̤Υ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò°ÅÌÛŪ¤Ë¥í¡¼¥É¤¹¤ë¤³¤È¤¬É¬Íפʾì¹ç¤¬¤¢¤ê¤Þ¤¹¡£·¿¤Î¸¡º÷¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤½¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ï¡¢¸½»þÅÀ¤Ç¤ÏÃí¼á½èÍý¤ÎÂоݤˤʤê¤Þ¤»¤ó¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Ãí¼á½èÍý¤¬¼Â¹Ô¤µ¤ì¡¢¤«¤Ä°ÅÌÛŪ¤Ë¥í¡¼¥É¤µ¤ì¤¿Ç¤°Õ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï·Ù¹ð¤òȯ¹Ô¤·¤Þ¤¹¡£\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢·Ù¹ð¤òÍÞÀ©¤¹¤ëÊýË¡¤¬Ä󶡤µ¤ì¤Þ¤¹¡£ + .SH "·¿¤Î¸¡º÷" + .PP +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤á¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤ÏÄ̾·¿¤Ë´Ø¤¹¤ë¾ðÊó¤òɬÍפȤ·¤Þ¤¹¤¬¡¢¤½¤Î·¿¤ÎÄêµÁ¤Ï¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ê¤Þ¤»¤ó¡£¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢³ÈÄ¥¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤¢¤ë¤¤¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¹¤Ù¤Æ¤Ë¤Ä¤¤¤Æ¡¢·¿¤Î¾ðÊó¤òɬÍפȤ·¤Þ¤¹¡£¤³¤ì¤Ë¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÇÌÀ¼¨Åª¤Ë¤Ï¸ÀµÚ¤µ¤ì¤Æ¤¤¤Ê¤¯¤Æ¤â¡¢·Ñ¾µ¤òÄ̤¸¤Æ¾ðÊó¤òÄ󶡤¹¤ë¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤â´Þ¤Þ¤ì¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤¿¤á¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤ÏÄ̾·¿¤Ë´Ø¤¹¤ë¾ðÊó¤òɬÍפȤ·¤Þ¤¹¤¬¡¢¤½¤Î·¿¤ÎÄêµÁ¤Ï¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ê¤Þ¤»¤ó¡£¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢³ÈÄ¥¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤¢¤ë¤¤¤Ï¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¹¤Ù¤Æ¤Ë¤Ä¤¤¤Æ¡¢·¿¤Î¾ðÊó¤òɬÍפȤ·¤Þ¤¹¡£¤³¤ì¤Ë¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÇÌÀ¼¨Åª¤Ë¤Ï¸ÀµÚ¤µ¤ì¤Æ¤¤¤Ê¤¯¤Æ¤â¡¢·Ñ¾µ¤òÄ̤¸¤Æ¾ðÊó¤òÄ󶡤¹¤ë¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤â´Þ¤Þ¤ì¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¥µ¥Ö¥¯¥é¥¹\fIjava\&.applet\&.Applet\fR¤òºîÀ®¤¹¤ë¤È¡¢\fI¥¢¥×¥ì¥Ã¥È\fR¤ÎÁÄÀè¤Î¥¯¥é¥¹(\fIjava\&.awt\&.Panel\fR¡¢\fIjava\&.awt\&.Container\fR¡¢\fIjava\&.awt\&.Component\fR¤ª¤è¤Ó\fIjava\&.lang\&.Object\fR)¤ò»ÈÍѤ·¤Æ¤¤¤ë¤³¤È¤Ë¤â¤Ê¤ê¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥µ¥Ö¥¯¥é¥¹\fBjava\&.applet\&.Applet\fR¤òºîÀ®¤¹¤ë¤È¡¢\fB¥¢¥×¥ì¥Ã¥È\fR¤ÎÁÄÀè¤Î¥¯¥é¥¹(\fBjava\&.awt\&.Panel\fR¡¢\fBjava\&.awt\&.Container\fR¡¢\fBjava\&.awt\&.Component\fR¤ª¤è¤Ó\fBjava\&.lang\&.Object\fR)¤ò»ÈÍѤ·¤Æ¤¤¤ë¤³¤È¤Ë¤â¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢·¿¤Î¾ðÊó¤¬É¬Íפˤʤë¤È¡¢¤½¤Î·¿¤òÄêµÁ¤·¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£¤Þ¤º¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤È³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò¸¡º÷¤·¡¢Â³¤¤¤Æ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹(¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê)¤ò¸¡º÷¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï¡¢\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤òÀßÄꤷ¤ÆÄêµÁ¤¹¤ë¤«¡¢¤Þ¤¿¤Ï\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÄêµÁ¤·¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢·¿¤Î¾ðÊó¤¬É¬Íפˤʤë¤È¡¢¤½¤Î·¿¤òÄêµÁ¤·¤Æ¤¤¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£¤Þ¤º¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤È³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò¸¡º÷¤·¡¢Â³¤¤¤Æ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹(¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê)¤ò¸¡º÷¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï¡¢\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤òÀßÄꤷ¤ÆÄêµÁ¤¹¤ë¤«¡¢¤Þ¤¿¤Ï\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÄêµÁ¤·¤Þ¤¹¡£ + .PP +-\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤ò¸¡º÷¤·¤Þ¤¹¡£ ++\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤«¤é¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤ò¸¡º÷¤·¤Þ¤¹¡£ + .PP +-\fI\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-extdirs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê̤Υ֡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ä³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-extdirs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê̤Υ֡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ä³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥¯¥í¥¹¥³¥ó¥Ñ¥¤¥ë¡¦¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-·¿¤Î¸¡º÷¤ËÀ®¸ù¤·¤¿¤È¤­¤ËÆÀ¤é¤ì¤ë·ë²Ì¤Ï¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤½¤ÎξÊý¤Ç¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£Î¾Êý¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¤É¤Á¤é¤ò»ÈÍѤ¹¤ë¤«¤ò\fI\-Xprefer\fR¥ª¥×¥·¥ç¥ó¤Ç¥³¥ó¥Ñ¥¤¥é¤Ë»Ø¼¨¤Ç¤­¤Þ¤¹¡£\fInewer\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Î¤¦¤Á¿·¤·¤¤Êý¤ò»ÈÍѤ·¤Þ¤¹¡£\fIsource\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fInewer\fR¤Ç¤¹¡£ ++·¿¤Î¸¡º÷¤ËÀ®¸ù¤·¤¿¤È¤­¤ËÆÀ¤é¤ì¤ë·ë²Ì¤Ï¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤½¤ÎξÊý¤Ç¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£Î¾Êý¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¤É¤Á¤é¤ò»ÈÍѤ¹¤ë¤«¤ò\fB\-Xprefer\fR¥ª¥×¥·¥ç¥ó¤Ç¥³¥ó¥Ñ¥¤¥é¤Ë»Ø¼¨¤Ç¤­¤Þ¤¹¡£\fBnewer\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Î¤¦¤Á¿·¤·¤¤Êý¤ò»ÈÍѤ·¤Þ¤¹¡£\fBsource\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fBnewer\fR¤Ç¤¹¡£ + .PP +-·¿¤Î¸¡º÷¼«ÂΤˤè¤Ã¤Æ¡¢¤Þ¤¿¤Ï\fI\-Xprefer\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤¿·ë²Ì¤È¤·¤ÆɬÍפʷ¿¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¡¢É¬ÍפʾðÊó¤ò¼èÆÀ¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë¤â¹Ô¤¤¤Þ¤¹¡£\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤ÎÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fInone\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£\fIclass\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++·¿¤Î¸¡º÷¼«ÂΤˤè¤Ã¤Æ¡¢¤Þ¤¿¤Ï\fB\-Xprefer\fR¥ª¥×¥·¥ç¥ó¤¬ÀßÄꤵ¤ì¤¿·ë²Ì¤È¤·¤ÆɬÍפʷ¿¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¡¢É¬ÍפʾðÊó¤ò¼èÆÀ¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë¤â¹Ô¤¤¤Þ¤¹¡£\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤½¤ÎÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBnone\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£\fBclass\fR¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .PP +-¥³¥ó¥Ñ¥¤¥é¤Ï¡¢Ãí¼á½èÍý¤¬´°Î»¤¹¤ë¤Þ¤Ç¡¢¤¢¤ë·¿¾ðÊó¤ÎɬÍ×À­¤òǧ¼±¤·¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£·¿¾ðÊ󤬥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¸«¤Ä¤«¤ê¡¢¤«¤Ä\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬Ãí¼á½èÍý¤ÎÂоݤȤʤ餺¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤³¤È¤¬·Ù¹ð¤µ¤ì¤Þ¤¹¡£¤³¤Î·Ù¹ð¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢(¤½¤Î¥Õ¥¡¥¤¥ë¤¬Ãí¼á½èÍý¤ÎÂоݤȤʤë¤è¤¦¤Ë)¤½¤Î¥Õ¥¡¥¤¥ë¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤹ¤ë¤«¡¢¤¢¤ë¤¤¤Ï¤½¤Î¤è¤¦¤Ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¤«¤É¤¦¤«¤ò\fI\-implicit\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄꤷ¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥é¤Ï¡¢Ãí¼á½èÍý¤¬´°Î»¤¹¤ë¤Þ¤Ç¡¢¤¢¤ë·¿¾ðÊó¤ÎɬÍ×À­¤òǧ¼±¤·¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£·¿¾ðÊ󤬥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¸«¤Ä¤«¤ê¡¢¤«¤Ä\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬Ãí¼á½èÍý¤ÎÂоݤȤʤ餺¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤³¤È¤¬·Ù¹ð¤µ¤ì¤Þ¤¹¡£¤³¤Î·Ù¹ð¤ò̵¸ú¤Ë¤¹¤ë¤Ë¤Ï¡¢(¤½¤Î¥Õ¥¡¥¤¥ë¤¬Ãí¼á½èÍý¤ÎÂоݤȤʤë¤è¤¦¤Ë)¤½¤Î¥Õ¥¡¥¤¥ë¤ò¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤹ¤ë¤«¡¢¤¢¤ë¤¤¤Ï¤½¤Î¤è¤¦¤Ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¤«¤É¤¦¤«¤ò\fB\-implicit\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ»ØÄꤷ¤Þ¤¹¡£ + .SH "¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹" + .PP +-\fIjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjavax\&.tools\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤ë¿·¤·¤¤Java Compiler API¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ ++\fBjavac\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBjavax\&.tools\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤ë¿·¤·¤¤Java Compiler API¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .SS "Îã" + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤ò»ØÄꤹ¤ë¤è¤¦¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¹½Ê¸¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô°ú¿ô¤ò»ØÄꤹ¤ë¤è¤¦¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¹½Ê¸¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler(); +-JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler(); ++\fBJavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-Îã¤Ç¤Ï¡¢¿ÇÃǤòɸ½à½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë½ñ¤­¹þ¤ß¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é¤Î¸Æ½Ð¤·»þ¤Ë\fIjavac\fR¤¬»ØÄꤹ¤ë½ªÎ»¥³¡¼¥É¤òÊÖ¤·¤Þ¤¹¡£ ++Îã¤Ç¤Ï¡¢¿ÇÃǤòɸ½à½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë½ñ¤­¹þ¤ß¡¢¥³¥Þ¥ó¥É¹Ô¤«¤é¤Î¸Æ½Ð¤·»þ¤Ë\fBjavac\fR¤¬»ØÄꤹ¤ë½ªÎ»¥³¡¼¥É¤òÊÖ¤·¤Þ¤¹¡£ + .PP +-\fIjavax\&.tools\&.JavaCompiler\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾¤Î¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¿ÇÃǤνèÍý¤ä¥Õ¥¡¥¤¥ë¤ÎÆɼè¤ê¸µ/½ñ¹þ¤ßÀè¤ÎÀ©¸æ¤Ê¤É¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBjavax\&.tools\&.JavaCompiler\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾¤Î¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¿ÇÃǤνèÍý¤ä¥Õ¥¡¥¤¥ë¤ÎÆɼè¤ê¸µ/½ñ¹þ¤ßÀè¤ÎÀ©¸æ¤Ê¤É¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .SS "µì¼°¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹" + .PP + \fBÃí°Õ:\fR +-¤³¤ÎAPI¤Ï¡¢²¼°Ì¸ß´¹À­¤Î¤¿¤á¤Ë¤Î¤ßÊÝ»ý¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¿·¤·¤¤¥³¡¼¥É¤Ï¡¢¿·¤·¤¤Java Compiler API¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¤³¤ÎAPI¤Ï¡¢¸åÊý¸ß´¹À­¤Î¤¿¤á¤Ë¤Î¤ßÊÝ»ý¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¿·¤·¤¤¥³¡¼¥É¤Ï¡¢¿·¤·¤¤Java Compiler API¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¼¡¤Î¤è¤¦¤Ë¡¢\fIcom\&.sun\&.tools\&.javac\&.Main\fR¥¯¥é¥¹¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤«¤é¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤¹¤¿¤á¤Îstatic¥á¥½¥Ã¥É¤¬2¤ÄÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¼¡¤Î¤è¤¦¤Ë¡¢\fBcom\&.sun\&.tools\&.javac\&.Main\fR¥¯¥é¥¹¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤«¤é¥³¥ó¥Ñ¥¤¥é¤ò¸Æ¤Ó½Ð¤¹¤¿¤á¤Îstatic¥á¥½¥Ã¥É¤¬2¤ÄÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public static int compile(String[] args); +-public static int compile(String[] args, PrintWriter out); ++\fBpublic static int compile(String[] args);\fR ++\fBpublic static int compile(String[] args, PrintWriter out);\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIargs\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢Ä̾拾¥ó¥Ñ¥¤¥é¤ËÅϤµ¤ì¤ëǤ°Õ¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£ ++\fBargs\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢Ä̾拾¥ó¥Ñ¥¤¥é¤ËÅϤµ¤ì¤ëǤ°Õ¤Î¥³¥Þ¥ó¥É¹Ô°ú¿ô¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£ + .PP +-\fIout\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¿ÇÃǽÐÎϤΰ¸Àè¤ò¼¨¤·¤Þ¤¹¡£ ++\fBout\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¿ÇÃǽÐÎϤΰ¸Àè¤ò¼¨¤·¤Þ¤¹¡£ + .PP +-\fIreturn\fRÃͤϡ¢\fIjavac\fR¤Î\fIexit\fRÃͤÈƱ¤¸¤Ç¤¹¡£ ++\fBreturn\fRÃͤϡ¢\fBjavac\fR¤Î\fBexit\fRÃͤÈƱ¤¸¤Ç¤¹¡£ + .PP + \fBÃí°Õ:\fR +-̾Á°¤¬\fIcom\&.sun\&.tools\&.javac\fR¤Ç»Ï¤Þ¤ë¥Ñ¥Ã¥±¡¼¥¸(\fIcom\&.sun\&.tools\&.javac\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¸¡½Ð¤µ¤ì¤ë¾¤Î¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤ª¤è¤Ó¥á¥½¥Ã¥É¤Ï¡¢´°Á´¤ËÆâÉôÍѤǤ¢¤ê¡¢¤¤¤Ä¤Ç¤âÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++̾Á°¤¬\fBcom\&.sun\&.tools\&.javac\fR¤Ç»Ï¤Þ¤ë¥Ñ¥Ã¥±¡¼¥¸(\fBcom\&.sun\&.tools\&.javac\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸)¤Ç¸¡½Ð¤µ¤ì¤ë¾¤Î¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤ª¤è¤Ó¥á¥½¥Ã¥É¤Ï¡¢´°Á´¤ËÆâÉôÍѤǤ¢¤ê¡¢¤¤¤Ä¤Ç¤âÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .SH "Îã" + .PP +-\fBExample 1\fR, ´Êñ¤Ê¥×¥í¥°¥é¥à¤Î¥³¥ó¥Ñ¥¤¥ë ++\fBÎã 1\fR ++.br ++´Êñ¤Ê¥×¥í¥°¥é¥à¤Î¥³¥ó¥Ñ¥¤¥ë + .RS 4 +-¤³¤ÎÎã¤Ç¤Ï¡¢greetings¥Ç¥£¥ì¥¯¥È¥ê¤Ç\fIHello\&.java\fR¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ëÊýË¡¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£\fIHello\&.java\fR¤ÇÄêµÁ¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢\fIgreetings\&.Hello\fR¤È¸Æ¤Ð¤ì¤Þ¤¹¡£greetings¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤¬¤¢¤ë¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Î¤¹¤°²¼¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ò»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¤Þ¤¿¡¢\fI\-d\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ̤νÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ëɬÍפ⤢¤ê¤Þ¤»¤ó¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢greetings¥Ç¥£¥ì¥¯¥È¥ê¤Ç\fBHello\&.java\fR¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ëÊýË¡¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£\fBHello\&.java\fR¤ÇÄêµÁ¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢\fBgreetings\&.Hello\fR¤È¸Æ¤Ð¤ì¤Þ¤¹¡£greetings¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎξÊý¤¬¤¢¤ë¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Î¤¹¤°²¼¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ò»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¤Þ¤¿¡¢\fB\-d\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆÊ̤νÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ëɬÍפ⤢¤ê¤Þ¤»¤ó¡£ + .sp +-\fIHello\&.java\fRÆâ¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ ++\fBHello\&.java\fRÆâ¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-package greetings; ++\fBpackage greetings;\fR ++\fB \fR ++\fBpublic class Hello {\fR ++\fB public static void main(String[] args) {\fR ++\fB for (int i=0; i < args\&.length; i++) {\fR ++\fB System\&.out\&.println("Hello " + args[i]);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR + +-public class Hello { +- public static void main(String[] args) { +- for (int i=0; i < args\&.length; i++) { +- System\&.out\&.println("Hello " + args[i]); +- } +- } +-} + .fi + .if n \{\ + .RE +@@ -1265,46 +1349,53 @@ + .RS 4 + .\} + .nf +-javac greetings/Hello\&.java ++\fBjavac greetings/Hello\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIgreetings\&.Hello\fR¤Î¼Â¹Ô: ++\fBgreetings\&.Hello\fR¤Î¼Â¹Ô: + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java greetings\&.Hello World Universe Everyone +-Hello World +-Hello Universe +-Hello Everyone ++\fBjava greetings\&.Hello World Universe Everyone\fR ++\fBHello World\fR ++\fBHello Universe\fR ++\fBHello Everyone\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, Ê£¿ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë ++\fBÎã 2\fR ++.br ++Ê£¿ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë + .RS 4 +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fIAloha\&.java\fR¡¢\fIGutenTag\&.java\fR¡¢\fIHello\&.java\fR¤ª¤è¤Ó\fIHi\&.java\fR¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë\fBAloha\&.java\fR¡¢\fBGutenTag\&.java\fR¡¢\fBHello\&.java\fR¤ª¤è¤Ó\fBHi\&.java\fR¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-% javac greetings/*\&.java +-% ls greetings +-Aloha\&.class GutenTag\&.class Hello\&.class Hi\&.class +-Aloha\&.java GutenTag\&.java Hello\&.java Hi\&.java ++\fB% javac greetings/*\&.java\fR ++\fB% ls greetings\fR ++\fBAloha\&.class GutenTag\&.class Hello\&.class Hi\&.class\fR ++\fBAloha\&.java GutenTag\&.java Hello\&.java Hi\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Î»ØÄê ++\fBÎã 3\fR ++.br ++¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Î»ØÄê + .RS 4 + Á°½Ò¤ÎÎã¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¦¤Á1¤Ä¤òÊѹ¹¤·¤¿¸å¤Ë¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp +@@ -1312,110 +1403,122 @@ + .RS 4 + .\} + .nf +-pwd +-/examples +-javac greetings/Hi\&.java ++\fBpwd\fR ++\fB/examples\fR ++\fBjavac greetings/Hi\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIgreetings\&.Hi\fR¤Ï\fIgreetings\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¾¤Î¥¯¥é¥¹¤ò»²¾È¤·¤Æ¤¤¤ë¤¿¤á¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤³¤ì¤é¤Î¾¤Î¥¯¥é¥¹¤òõ¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¢¤ë¤¿¤á¡¢Á°½Ò¤ÎÎã¤ÏÆ°ºî¤·¤Þ¤¹¡£¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òµ¤¤Ë¤»¤º¤Ë¤³¤Î¥Õ¥¡¥¤¥ë¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¡¢\fICLASSPATH\fR¤òÀßÄꤷ¤Æ¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ËÎã¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òÄɲä·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ ++\fBgreetings\&.Hi\fR¤Ï\fBgreetings\fR¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¾¤Î¥¯¥é¥¹¤ò»²¾È¤·¤Æ¤¤¤ë¤¿¤á¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¤³¤ì¤é¤Î¾¤Î¥¯¥é¥¹¤òõ¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¢¤ë¤¿¤á¡¢Á°½Ò¤ÎÎã¤ÏÆ°ºî¤·¤Þ¤¹¡£¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òµ¤¤Ë¤»¤º¤Ë¤³¤Î¥Õ¥¡¥¤¥ë¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¡¢\fBCLASSPATH\fR¤òÀßÄꤷ¤Æ¡¢¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤ËÎã¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òÄɲä·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-classpath /examples /examples/greetings/Hi\&.java ++\fBjavac \-classpath /examples /examples/greetings/Hi\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIgreetings\&.Hi\fR¤òÊѹ¹¤·¤Æ¥Ð¥Ê¡¼¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë¤·¤¿¾ì¹ç¡¢ ¤½¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤â¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤òÄ̤¸¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBgreetings\&.Hi\fR¤òÊѹ¹¤·¤Æ¥Ð¥Ê¡¼¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë¤·¤¿¾ì¹ç¡¢ ¤½¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤â¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Ñ¥¹¤òÄ̤¸¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-classpath /examples:/lib/Banners\&.jar \e +- /examples/greetings/Hi\&.java ++\fBjavac \-classpath /examples:/lib/Banners\&.jar \e\fR ++\fB /examples/greetings/Hi\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¤Ç¥¯¥é¥¹¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤Ï\fIgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó\fIgreetings\fR¥¯¥é¥¹¤¬»ÈÍѤ¹¤ë¥¯¥é¥¹¤Ë¥¢¥¯¥»¥¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¤Ç¥¯¥é¥¹¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤Ï\fBgreetings\fR¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó\fBgreetings\fR¥¯¥é¥¹¤¬»ÈÍѤ¹¤ë¥¯¥é¥¹¤Ë¥¢¥¯¥»¥¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi ++\fBjava \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 4\fR, ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎʬΥ ++\fBÎã 4\fR ++.br ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎʬΥ + .RS 4 +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIjavac\fR¤ò»ÈÍѤ·¤Æ¡¢JVM 1\&.6¾å¤Ç¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBjavac\fR¤ò»ÈÍѤ·¤Æ¡¢JVM 1\&.7¾å¤Ç¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e +-\-extdirs "" OldCode\&.java ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e \fR ++\fB\-extdirs "" OldCode\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fI\-source 1\&.6\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fIOldCode\&.java\fR¤Î¥³¥ó¥Ñ¥¤¥ë¤Ë¤Ï¥ê¥ê¡¼¥¹1\&.6(¤Þ¤¿¤Ï6)¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fI\-target 1\&.6\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢JVM 1\&.6¤È¸ß´¹À­¤Î¤¢¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ\fI\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤Ç¤­¤Þ¤¹¡£ ++\fB\-source 1\&.7\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fBOldCode\&.java\fR¤Î¥³¥ó¥Ñ¥¤¥ë¤Ë¤Ï¥ê¥ê¡¼¥¹1\&.7(¤Þ¤¿¤Ï7)¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fB\-target 1\&.7\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢JVM 1\&.7¤È¸ß´¹À­¤Î¤¢¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤÏ\fB\-source\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤Ç¤­¤Þ¤¹¡£ + .sp +-\fI\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Å¬ÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹(\fIrt\&.jar\fR¥é¥¤¥Ö¥é¥ê)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++\fB\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Å¬ÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹(\fBrt\&.jar\fR¥é¥¤¥Ö¥é¥ê)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-source 1\&.6 OldCode\&.java +-warning: [options] bootstrap class path not set in conjunction with +-\-source 1\&.6 ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \fR ++\fB\-source 1\&.7\fR ++ + .fi + .if n \{\ + .RE + .\} +-ŬÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¸Å¤¤¸À¸ì»ÅÍÍ(¤³¤ÎÎã¤Ç¤Ï¡¢¥Ð¡¼¥¸¥ç¥ó1\&.6¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì)¤ò¿·¤·¤¤¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ÈÁȤ߹礻¤Æ»ÈÍѤ·¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢Â¸ºß¤·¤Ê¤¤¥á¥½¥Ã¥É¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¤¿¤á¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸Å¤¤¥×¥é¥Ã¥È¥Õ¥©¡¼¥à(¤³¤Î¾ì¹ç¤ÏJava SE 6)¤ÇÆ°ºî¤·¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++ŬÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¸Å¤¤¸À¸ì»ÅÍÍ(¤³¤ÎÎã¤Ç¤Ï¡¢¥Ð¡¼¥¸¥ç¥ó1\&.7¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì)¤ò¿·¤·¤¤¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ÈÁȤ߹礻¤Æ»ÈÍѤ·¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢Â¸ºß¤·¤Ê¤¤¥á¥½¥Ã¥É¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¤¿¤á¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸Å¤¤¥×¥é¥Ã¥È¥Õ¥©¡¼¥à(¤³¤Î¾ì¹ç¤ÏJava SE 7)¤ÇÆ°ºî¤·¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\fBExample 5\fR, ¥¯¥í¥¹¡¦¥³¥ó¥Ñ¥¤¥ë ++\fBÎã 5\fR ++.br ++¥¯¥í¥¹¡¦¥³¥ó¥Ñ¥¤¥ë + .RS 4 +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIjavac\fR¤ò»ÈÍѤ·¤Æ¡¢JVM 1\&.6¾å¤Ç¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBjavac\fR¤ò»ÈÍѤ·¤Æ¡¢JVM 1\&.7¾å¤Ç¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e +- \-extdirs "" OldCode\&.java ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e\fR ++\fB \-extdirs "" OldCode\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} +-The\fI \-source 1\&.6\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢OldCode\&.java¤Î¥³¥ó¥Ñ¥¤¥ë¤Ë¤Ï¥ê¥ê¡¼¥¹1\&.6(¤Þ¤¿¤Ï6)¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fI\-target 1\&.6\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢JVM 1\&.6¤È¸ß´¹À­¤Î¤¢¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢\fI\-target\fR¤ÎÃͤÏ\fI\-source\fR¤ÎÃͤˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fI\-target\fR¥ª¥×¥·¥ç¥ó¤Ï¾Êά¤µ¤ì¤Þ¤¹¡£ ++\fB \-source 1\&.7\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢OldCode\&.java¤Î¥³¥ó¥Ñ¥¤¥ë¤Ë¤Ï¥ê¥ê¡¼¥¹1\&.7(¤Þ¤¿¤Ï7)¤ÎJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fB\-target 1\&.7\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢JVM 1\&.7¤È¸ß´¹À­¤Î¤¢¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢\fB\-target\fR¤ÎÃͤÏ\fB\-source\fR¤ÎÃͤˤʤê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fB\-target\fR¥ª¥×¥·¥ç¥ó¤Ï¾Êά¤µ¤ì¤Þ¤¹¡£ + .sp +-\fI\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Å¬ÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹(\fIrt\&.jar\fR¥é¥¤¥Ö¥é¥ê)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++\fB\-bootclasspath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Å¬ÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹(\fBrt\&.jar\fR¥é¥¤¥Ö¥é¥ê)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ¼¡¤Î·Ù¹ð¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javac \-source 1\&.6 OldCode\&.java +-warning: [options] bootstrap class path not set in conjunction with \-source 1\&.6 ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \-source 1\&.7\fR ++ + .fi + .if n \{\ + .RE + .\} +-ŬÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¸Å¤¤¸À¸ì»ÅÍͤò¿·¤·¤¤¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ÈÁȤ߹礻¤Æ»ÈÍѤ·¤Þ¤¹¡£¤³¤ÎÁȹ礻¤Ï¡¢Â¸ºß¤·¤Ê¤¤¥á¥½¥Ã¥É¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¤¿¤á¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸Å¤¤¥×¥é¥Ã¥È¥Õ¥©¡¼¥à(¤³¤Î¾ì¹ç¤ÏJava SE 6)¤ÇÆ°ºî¤·¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤ÏJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥ê¥ê¡¼¥¹1\&.6¤ò»ÈÍѤ·¤Þ¤¹¡£ ++ŬÀڤʥС¼¥¸¥ç¥ó¤Î¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï¸Å¤¤¸À¸ì»ÅÍͤò¿·¤·¤¤¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ÈÁȤ߹礻¤Æ»ÈÍѤ·¤Þ¤¹¡£¤³¤ÎÁȹ礻¤Ï¡¢Â¸ºß¤·¤Ê¤¤¥á¥½¥Ã¥É¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ë¤¿¤á¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¸Å¤¤¥×¥é¥Ã¥È¥Õ¥©¡¼¥à(¤³¤Î¾ì¹ç¤ÏJava SE 7)¤ÇÆ°ºî¤·¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤ÏJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥ê¥ê¡¼¥¹1\&.7¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/javadoc.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/javadoc.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: javadoc +-.\" Language: English +-.\" Date: 2011ǯ5·î10Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: javadoc ++.\" Language: Japanese ++.\" Date: 2011ǯ5·î10Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "javadoc" "1" "2011ǯ5·î10Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + javadoc \- Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é¡¢API¥É¥­¥å¥á¥ó¥È¤ÎHTML¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjavadoc\fR {\fIpackages\fR|\fIsource\-files\fR} [\fIoptions\fR] [\fI@argfiles\fR] ++\fBjavadoc\fR {\fIpackages\fR|\fIsource\-files\fR} [\fIoptions\fR] [\fI@argfiles\fR] + .fi + .if n \{\ + .RE +@@ -64,33 +66,33 @@ + .PP + \fIpackages\fR + .RS 4 +-\fIjava\&.lang java\&.lang\&.reflect java\&.awt\fR¤Ê¤É¡¢¶õÇò¤Ç¶èÀڤäƥɥ­¥å¥á¥ó¥È²½¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¡£¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤â¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ï¡¢\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥Ñ¥Ã¥±¡¼¥¸¤ò»ØÄꤷ¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjavadoc\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ª¤è¤Ó¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ç»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤òõ¤·¤Þ¤¹¡£\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸¤òõ¤¹¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBjava\&.lang java\&.lang\&.reflect java\&.awt\fR¤Ê¤É¡¢¶õÇò¤Ç¶èÀڤäƥɥ­¥å¥á¥ó¥È²½¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¡£¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤â¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ï¡¢\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥Ñ¥Ã¥±¡¼¥¸¤ò»ØÄꤷ¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjavadoc\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ª¤è¤Ó¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ç»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤òõ¤·¤Þ¤¹¡£\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸¤òõ¤¹¥Ç¥£¥ì¥¯¥È¥ê¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \fIsource\-files\fR + .RS 4 +-\fIClass\&.java Object\&.java Button\&.java\fR¤Î¤è¤¦¤Ë¶õÇò¤Ç¶èÀڤä¿¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ëJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjavadoc\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤òõ¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fI/home/src/java/awt/Graphics*\&.java\fR¤Î¤è¤¦¤Ë¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Õ¥ë¥Ñ¥¹¤ò»ØÄꤷ¡¢¥ï¥¤¥ë¥É¥«¡¼¥Éʸ»ú¤ò»ÈÍѤǤ­¤Þ¤¹¡£¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBClass\&.java Object\&.java Button\&.java\fR¤Î¤è¤¦¤Ë¶õÇò¤Ç¶èÀڤä¿¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ëJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjavadoc\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤òõ¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fB/home/src/java/awt/Graphics*\&.java\fR¤Î¤è¤¦¤Ë¡¢¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Õ¥ë¥Ñ¥¹¤ò»ØÄꤷ¡¢¥ï¥¤¥ë¥É¥«¡¼¥Éʸ»ú¤ò»ÈÍѤǤ­¤Þ¤¹¡£¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \fIoptions\fR + .RS 4 +-¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¶õÇò¤Ç¶èÀÚ¤é¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fI@argfiles\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¡¦¥ª¥×¥·¥ç¥ó¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ª¤è¤Ó¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤òǤ°Õ¤Î½ç½ø¤Ç´Þ¤à¥Õ¥¡¥¤¥ë¤Î̾Á°¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¡¦¥ª¥×¥·¥ç¥ó¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ª¤è¤Ó¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤òǤ°Õ¤Î½ç½ø¤Ç´Þ¤à¥Õ¥¡¥¤¥ë¤Î̾Á°¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢°ìÏ¢¤ÎJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ëÀë¸À¤ª¤è¤Ó¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò²òÀϤ·¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢public¥¯¥é¥¹¡¢protected¥¯¥é¥¹¡¢¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹(ƿ̾¤ÎÆâÉô¥¯¥é¥¹¤Ï½ü¤¯)¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤Ë¤Ä¤¤¤Æµ­½Ò¤·¤¿°ìÏ¢¤ÎHTML¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢API¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤ä¡¢°ìÏ¢¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¼ÂÁõ¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Á´ÂΡ¢¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤½¤ÎξÊý¤ËÂФ·¤Æ¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤΥɥ­¥å¥á¥ó¥È²½¤ò¹Ô¤¦¤Ë¤Ï¡¢\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤òºÆµ¢Åª¤Ë¤¿¤É¤ë¤«¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ÎÌÀ¼¨Åª¤Ê¥ê¥¹¥È¤òÅϤ·¤Þ¤¹¡£¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤òÅϤ·¤Þ¤¹¡£´Êñ¤ÊÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢°ìÏ¢¤ÎJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤¢¤ëÀë¸À¤ª¤è¤Ó¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò²òÀϤ·¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢public¥¯¥é¥¹¡¢protected¥¯¥é¥¹¡¢¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹(ƿ̾¤ÎÆâÉô¥¯¥é¥¹¤Ï½ü¤¯)¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤Ë¤Ä¤¤¤Æµ­½Ò¤·¤¿°ìÏ¢¤ÎHTML¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢API¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤ä¡¢°ìÏ¢¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¼ÂÁõ¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Á´ÂΡ¢¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤½¤ÎξÊý¤ËÂФ·¤Æ¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤΥɥ­¥å¥á¥ó¥È²½¤ò¹Ô¤¦¤Ë¤Ï¡¢\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤òºÆµ¢Åª¤Ë¤¿¤É¤ë¤«¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ÎÌÀ¼¨Åª¤Ê¥ê¥¹¥È¤òÅϤ·¤Þ¤¹¡£¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¥ê¥¹¥È¤òÅϤ·¤Þ¤¹¡£´Êñ¤ÊÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¤Ç½ª¤ï¤ë¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤½¤Î¾¤Î¥Õ¥¡¥¤¥ë¤ò½èÍý¤·¤Þ¤¹¡£¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÅϤ·¤Æ\fIjavadoc\fR¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¤É¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò½èÍý¤¹¤ë¤«¤òÀµ³Î¤Ë»ØÄê¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢Â¿¤¯¤Î³«È¯¼Ô¤Ï¤³¤ÎÊýË¡¤Ç¤Ïºî¶È¤·¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ¹¤Û¤¦¤¬´Êñ¤À¤«¤é¤Ç¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤¯¤Æ¤â¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï3¤Ä¤ÎÊýË¡¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¡¢\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤«¡¢¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ë¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò¹Ô¤¦¤Î¤Ï¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬¼¡¤Î¤¹¤Ù¤Æ¤ÎÍ×·ï¤òËþ¤¿¤¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¤Ç½ª¤ï¤ë¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤½¤Î¾¤Î¥Õ¥¡¥¤¥ë¤ò½èÍý¤·¤Þ¤¹¡£¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÅϤ·¤Æ\fBjavadoc\fR¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¤É¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò½èÍý¤¹¤ë¤«¤òÀµ³Î¤Ë»ØÄê¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢Â¿¤¯¤Î³«È¯¼Ô¤Ï¤³¤ÎÊýË¡¤Ç¤Ïºî¶È¤·¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ¹¤Û¤¦¤¬´Êñ¤À¤«¤é¤Ç¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤¯¤Æ¤â¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï3¤Ä¤ÎÊýË¡¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¡¢\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤«¡¢¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ë¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò¹Ô¤¦¤Î¤Ï¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬¼¡¤Î¤¹¤Ù¤Æ¤ÎÍ×·ï¤òËþ¤¿¤¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -100,7 +102,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Õ¥¡¥¤¥ë̾¤ÎÀÜƬ¼­(\fI\&.java\fR¤òºï½ü)¤¬Í­¸ú¤Ê¥¯¥é¥¹Ì¾¤Ç¤¢¤ë¡£ ++¥Õ¥¡¥¤¥ë̾¤ÎÀÜƬ¼­(\fB\&.java\fR¤òºï½ü)¤¬Í­¸ú¤Ê¥¯¥é¥¹Ì¾¤Ç¤¢¤ë¡£ + .RE + .sp + .RS 4 +@@ -124,8 +126,10 @@ + .\} + ¥Ñ¥Ã¥±¡¼¥¸Ê¸¤ËÍ­¸ú¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¡£ + .RE +-¥ê¥ó¥¯¤Î½èÍý.PP +-½èÍý¤Î¼Â¹ÔÃæ¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¼Â¹Ô¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥á¥ó¥Ð¡¼¤Î̾Á°¤ËÂФ·¤Æ¡¢Áê¸ß»²¾È¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤Ï¡¢¼¡¤Î¾ì½ê¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£@¥¿¥°¤ÎÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢javadoc¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++¥ê¥ó¥¯¤Î½èÍý ++.PP ++½èÍý¤Î¼Â¹ÔÃæ¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¼Â¹Ô¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥á¥ó¥Ð¡¼¤Î̾Á°¤ËÂФ·¤Æ¡¢Áê¸ß»²¾È¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤Ï¡¢¼¡¤Î¾ì½ê¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£@¥¿¥°¤ÎÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢javadoc¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .RS 4 + .ie n \{\ +@@ -146,7 +150,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI@see\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿¡Ö\fI´ØÏ¢¹àÌÜ\fR¡×¥»¥¯¥·¥ç¥ó¡£ ++\fB@see\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿\fI¡Ö´ØÏ¢¹àÌÜ¡×\fR¥»¥¯¥·¥ç¥ó¡£ + .RE + .sp + .RS 4 +@@ -157,7 +161,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI{@link}\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿¥¤¥ó¥é¥¤¥ó¡¦¥Æ¥­¥¹¥È¡£ ++\fB{@link}\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿¥¤¥ó¥é¥¤¥ó¡¦¥Æ¥­¥¹¥È¡£ + .RE + .sp + .RS 4 +@@ -168,7 +172,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI@throws\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿Îã³°¤Î̾Á°¡£ ++\fB@throws\fR¥¿¥°¤«¤éÀ¸À®¤µ¤ì¤¿Îã³°¤Î̾Á°¡£ + .RE + .sp + .RS 4 +@@ -179,7 +183,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë¡Ö\fIÄêµÁ\fR¡×¥ê¥ó¥¯¤È¡¢¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë¡Ö\fI¥ª¡¼¥Ð¡¼¥é¥¤¥É\fR¡×¥ê¥ó¥¯¡£¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë\fI¡ÖÄêµÁ¡×\fR¥ê¥ó¥¯¤È¡¢¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë\fI¡Ö¥ª¡¼¥Ð¡¼¥é¥¤¥É¡×\fR¥ê¥ó¥¯¡£¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -215,37 +219,39 @@ + º÷°ú¡£ + .RE + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¤Î´û¸¤Î¥Æ¥­¥¹¥È(Ê̤ËÀ¸À®¤·¤¿¥Æ¥­¥¹¥È)¤ËÂФ·¤Æ¥ê¥ó¥¯¤òÄɲ乤ë¤Ë¤Ï¡¢\fI\-link\fR¤ª¤è¤Ó\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤òÍøÍѤǤ­¤Þ¤¹¡£ +-½èÍý¤Î¾ÜºÙ.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼Â¹Ô¤¹¤ë¤¿¤Ó¤Ë1¤Ä¤Î´°Á´¤Ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£Á°¤Î¼Â¹Ô¤Î·ë²Ì¤òÊѹ¹¤Þ¤¿¤ÏľÀܼè¤ê¹þ¤à¡¢Áýʬ¥Ó¥ë¥É¤ò¹Ô¤¤¤Þ¤»¤ó¡£¤¿¤À¤·¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Â¾¤Î¼Â¹Ô¤Î·ë²Ì¤Ë¥ê¥ó¥¯¤Ç¤­¤Þ¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼ÂÁõ¤Ë¤ÏJava¥³¥ó¥Ñ¥¤¥é¤¬É¬Íפǡ¢Java¥³¥ó¥Ñ¥¤¥é¤Ë°Í¸¤·¤Æ¤¤¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï\fIjavac\fR¥³¥Þ¥ó¥É¤Î°ìÉô¤ò¸Æ¤Ó½Ð¤·¡¢Àë¸À¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¡¢¥á¥ó¥Ð¡¼¤Î¼ÂÁõ¤ò̵»ë¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¹³¬Áؤò´Þ¤à¥¯¥é¥¹¤ÎË­ÉÙ¤ÊÆâÉôɽ¸½¤È¥¯¥é¥¹¤Î¡Ö»ÈÍѡ״ط¸¤ò¹½ÃÛ¤·¡¢HTML¤òÀ¸À®¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢J\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤«¤é¡¢¥æ¡¼¥¶¡¼¤ÎÄ󶡤·¤¿¥É¥­¥å¥á¥ó¥È¤â¼èÆÀ¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥á¥½¥Ã¥ÉËÜÂΤò»ý¤¿¤Ê¤¤½ã¿è¤Ê¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢API¤Î¼ÂÁõÁ°¤ÎÀ߷פÎÁᤤÃʳ¬¤Ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤·¤Æ\fIjavadoc\fR¥³¥á¥ó¥È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ +-.PP +-¥³¥ó¥Ñ¥¤¥é¤Ë°Í¸¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢HTML½ÐÎϤϡ¢¼ÂºÝ¤Î¼ÂÁõ¤ËÀµ³Î¤ËÂбþ¤·¤Þ¤¹¡£¼ÂºÝ¤Î¼ÂÁõ¤Ï¡¢ÌÀ¼¨Åª¤Ê¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤Ç¤Ï¤Ê¤¯¡¢°ÅÌۤΥ½¡¼¥¹¡¦¥³¡¼¥É¤Ë°Í¸¤¹¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥ó¥Ñ¥¤¥ëºÑ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï¸ºß¤¹¤ë¤¬¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤Ï¸ºß¤·¤Ê¤¤¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥¹¥È¥é¥¯¥¿¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£ +-.PP +-¿¤¯¤Î¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¡¼¥É¤¬ÉÔ´°Á´¤Þ¤¿¤Ï¥¨¥é¡¼¤ò´Þ¤ó¤Ç¤¤¤ë¾ì¹ç¤Ç¤â¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ç¥Ð¥Ã¥°¤ä¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ò´°Î»¤¹¤ëÁ°¤Ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î´ðËÜŪ¤Ê¥Á¥§¥Ã¥¯¤ò¹Ô¤¤¤Þ¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥É¥­¥å¥á¥ó¥È¤ÎÆâÉô¹½Â¤¤ò¹½ÃÛ¤¹¤ëºÝ¡¢»²¾È¥¯¥é¥¹¤ò¤¹¤Ù¤Æ¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢ +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¢³ÈÄ¥µ¡Ç½¡¢¤Þ¤¿¤Ï¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤Ë¤«¤«¤ï¤é¤º¡¢¤¹¤Ù¤Æ¤Î»²¾È¥¯¥é¥¹¤ò¸¡º÷¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤Î¸¡½ÐÊýË¡ ++¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¤Î´û¸¤Î¥Æ¥­¥¹¥È(Ê̤ËÀ¸À®¤·¤¿¥Æ¥­¥¹¥È)¤ËÂФ·¤Æ¥ê¥ó¥¯¤òÄɲ乤ë¤Ë¤Ï¡¢\fB\-link\fR¤ª¤è¤Ó\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤òÍøÍѤǤ­¤Þ¤¹¡£ ++.PP ++½èÍý¤Î¾ÜºÙ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼Â¹Ô¤¹¤ë¤¿¤Ó¤Ë1¤Ä¤Î´°Á´¤Ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£Á°¤Î¼Â¹Ô¤Î·ë²Ì¤òÊѹ¹¤Þ¤¿¤ÏľÀܼè¤ê¹þ¤à¡¢Áýʬ¥Ó¥ë¥É¤ò¹Ô¤¤¤Þ¤»¤ó¡£¤¿¤À¤·¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Â¾¤Î¼Â¹Ô¤Î·ë²Ì¤Ë¥ê¥ó¥¯¤Ç¤­¤Þ¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼ÂÁõ¤Ë¤ÏJava¥³¥ó¥Ñ¥¤¥é¤¬É¬Íפǡ¢Java¥³¥ó¥Ñ¥¤¥é¤Ë°Í¸¤·¤Æ¤¤¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï\fBjavac\fR¥³¥Þ¥ó¥É¤Î°ìÉô¤ò¸Æ¤Ó½Ð¤·¡¢Àë¸À¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¡¢¥á¥ó¥Ð¡¼¤Î¼ÂÁõ¤ò̵»ë¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¹³¬Áؤò´Þ¤à¥¯¥é¥¹¤ÎË­ÉÙ¤ÊÆâÉôɽ¸½¤È¥¯¥é¥¹¤Î¡Ö»ÈÍѡ״ط¸¤ò¹½ÃÛ¤·¡¢HTML¤òÀ¸À®¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢J\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤«¤é¡¢¥æ¡¼¥¶¡¼¤ÎÄ󶡤·¤¿¥É¥­¥å¥á¥ó¥È¤â¼èÆÀ¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥á¥½¥Ã¥ÉËÜÂΤò»ý¤¿¤Ê¤¤½ã¿è¤Ê¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢API¤Î¼ÂÁõÁ°¤ÎÀ߷פÎÁᤤÃʳ¬¤Ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤·¤Æ\fBjavadoc\fR¥³¥á¥ó¥È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ ++.PP ++¥³¥ó¥Ñ¥¤¥é¤Ë°Í¸¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢HTML½ÐÎϤϡ¢¼ÂºÝ¤Î¼ÂÁõ¤ËÀµ³Î¤ËÂбþ¤·¤Þ¤¹¡£¼ÂºÝ¤Î¼ÂÁõ¤Ï¡¢ÌÀ¼¨Åª¤Ê¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤Ç¤Ï¤Ê¤¯¡¢°ÅÌۤΥ½¡¼¥¹¡¦¥³¡¼¥É¤Ë°Í¸¤¹¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥ó¥Ñ¥¤¥ëºÑ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï¸ºß¤¹¤ë¤¬¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤Ï¸ºß¤·¤Ê¤¤¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥¹¥È¥é¥¯¥¿¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£ ++.PP ++¿¤¯¤Î¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¡¼¥É¤¬ÉÔ´°Á´¤Þ¤¿¤Ï¥¨¥é¡¼¤ò´Þ¤ó¤Ç¤¤¤ë¾ì¹ç¤Ç¤â¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ç¥Ð¥Ã¥°¤ä¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ò´°Î»¤¹¤ëÁ°¤Ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î´ðËÜŪ¤Ê¥Á¥§¥Ã¥¯¤ò¹Ô¤¤¤Þ¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥É¥­¥å¥á¥ó¥È¤ÎÆâÉô¹½Â¤¤ò¹½ÃÛ¤¹¤ëºÝ¡¢»²¾È¥¯¥é¥¹¤ò¤¹¤Ù¤Æ¥í¡¼¥É¤·¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¡¢³ÈÄ¥µ¡Ç½¡¢¤Þ¤¿¤Ï¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤Ë¤«¤«¤ï¤é¤º¡¢¤¹¤Ù¤Æ¤Î»²¾È¥¯¥é¥¹¤ò¸¡º÷¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¹¤Î¸¡½ÐÊýË¡ + (http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/findingclasses\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-Ä̾ºîÀ®¤¹¤ë¥¯¥é¥¹¤Ï¡¢³ÈÄ¥¥¯¥é¥¹¤È¤·¤Æ¡¢¤Þ¤¿¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Ç¥í¡¼¥É¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++Ä̾ºîÀ®¤¹¤ë¥¯¥é¥¹¤Ï¡¢³ÈÄ¥¥¯¥é¥¹¤È¤·¤Æ¡¢¤Þ¤¿¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥¯¥é¥¹¡¦¥Ñ¥¹¤Ç¥í¡¼¥É¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .SS "Javadoc¤Î¥É¥Ã¥¯¥ì¥Ã¥È" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤÎÆâÍƤȷÁ¼°¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤È¸Æ¤Ð¤ì¤ë¥Ç¥Õ¥©¥ë¥È¤ÎÁȹþ¤ß¥É¥Ã¥¯¥ì¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢HTML·Á¼°¤ÎAPI¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò½¤Àµ¤Þ¤¿¤Ï¥µ¥Ö¥¯¥é¥¹¤òºîÀ®¤¹¤ë¤³¤È¤ä¡¢HTML¡¢XML¡¢MIF¡¢RTF¤Ê¤É¤Î¹¥¤ß¤Î½ÐÎÏ·Á¼°¤òÀ¸À®¤¹¤ëÆȼ«¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤òµ­½Ò¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£ +-.PP +-\fI\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢»ÈÍѤµ¤ì¤Æ¤¤¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤Ë´Ø·¸¤Ê¤¯»ÈÍѤǤ­¤ë¤¤¤¯¤Ä¤«¤Î¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¤³¤ì¤é¤Î¾¤Ë¡¢¤¤¤¯¤Ä¤«¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬Äɲ䵤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤÎÆâÍƤȷÁ¼°¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤È¸Æ¤Ð¤ì¤ë¥Ç¥Õ¥©¥ë¥È¤ÎÁȹþ¤ß¥É¥Ã¥¯¥ì¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢HTML·Á¼°¤ÎAPI¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò½¤Àµ¤Þ¤¿¤Ï¥µ¥Ö¥¯¥é¥¹¤òºîÀ®¤¹¤ë¤³¤È¤ä¡¢HTML¡¢XML¡¢MIF¡¢RTF¤Ê¤É¤Î¹¥¤ß¤Î½ÐÎÏ·Á¼°¤òÀ¸À®¤¹¤ëÆȼ«¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤òµ­½Ò¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£ ++.PP ++\fB\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢»ÈÍѤµ¤ì¤Æ¤¤¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤Ë´Ø·¸¤Ê¤¯»ÈÍѤǤ­¤ë¤¤¤¯¤Ä¤«¤Î¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¤³¤ì¤é¤Î¾¤Ë¡¢¤¤¤¯¤Ä¤«¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬Äɲ䵤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥¿¥¤¥×¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£¤½¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¥¯¥é¥¹¤ÎJava¸À¸ì¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(\fI\&.java\fR)¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¤½¤Î¾¤Î̤½èÍý¤Î¥Õ¥¡¥¤¥ë¤Ç¤¹¡£¤³¤³¤Ç¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤·¤Ê¤¤¤¬¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Ë¸ºß¤¹¤ë¾ì¹ç¤¬¤¢¤ë¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ä¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¤âÀâÌÀ¤·¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥¿¥¤¥×¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£¤½¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¥¯¥é¥¹¤ÎJava¸À¸ì¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(\fB\&.java\fR)¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¤½¤Î¾¤Î̤½èÍý¤Î¥Õ¥¡¥¤¥ë¤Ç¤¹¡£¤³¤³¤Ç¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤·¤Ê¤¤¤¬¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Ë¸ºß¤¹¤ë¾ì¹ç¤¬¤¢¤ë¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ä¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¤âÀâÌÀ¤·¤Þ¤¹¡£ + .SS "¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë" + .PP + ¤½¤ì¤¾¤ì¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤ª¤è¤Ó¤½¤Î¥á¥ó¥Ð¡¼¤Ï¡¢Æȼ«¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤ËÊÝ»ý¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë" + .PP +-¤½¤ì¤¾¤ì¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢Æȼ«¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤òÀìÍѤΥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÊÝ»ý¤·¤Þ¤¹¡£¤½¤ÎÆâÍƤϡ¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¡¦¥Ú¡¼¥¸¤ËÁȤ߹þ¤Þ¤ì¤Þ¤¹¡£¤³¤Î¥³¥á¥ó¥È¤Ë¤Ï¡¢Ä̾¤½¤Î¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤËÅö¤Æ¤Ï¤Þ¤ë¥É¥­¥å¥á¥ó¥È¤òµ­½Ò¤·¤Þ¤¹¡£ ++¤½¤ì¤¾¤ì¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢Æȼ«¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤òÀìÍѤΥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÊÝ»ý¤·¤Þ¤¹¡£¤½¤ÎÆâÍƤϡ¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¡¦¥Ú¡¼¥¸¤ËÁȤ߹þ¤Þ¤ì¤Þ¤¹¡£¤³¤Î¥³¥á¥ó¥È¤Ë¤Ï¡¢Ä̾¤½¤Î¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤËÅö¤Æ¤Ï¤Þ¤ë¥É¥­¥å¥á¥ó¥È¤òµ­½Ò¤·¤Þ¤¹¡£ + .PP + ¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤¤¤º¤ì¤«¤Î¥Õ¥¡¥¤¥ë¤Ë¥³¥á¥ó¥È¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£ + .sp +@@ -257,7 +263,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¡¢¥Ñ¥Ã¥±¡¼¥¸Ãí¼á¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¢¤ª¤è¤ÓJavadoc¥¿¥°¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤¬Í¥À褵¤ì¤Þ¤¹¡£ ++\fBpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¡¢¥Ñ¥Ã¥±¡¼¥¸Ãí¼á¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¢¤ª¤è¤ÓJavadoc¥¿¥°¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤¬Í¥À褵¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -268,73 +274,81 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÈJavadoc¥¿¥°¤Î¤ß¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ãí¼á¤Ï³ÊǼ¤Ç¤­¤Þ¤»¤ó¡£ +-.RE +-.PP +-³Æ¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢\fIpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï\fIpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Î¤¤¤º¤ì¤«¤ò1¤Ä»ý¤Ä¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤ÎξÊý¤ò»ý¤Ä¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¤É¤Á¤é¤«¤Î¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¤È¤â¤Ë¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Î¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤ËÇÛÃÖ¤·¤Æ¤¯¤À¤µ¤¤¡£ +-package\-info\&.java¥Õ¥¡¥¤¥ë.PP +-\fIpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î¹½Â¤¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥á¥ó¥È¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¤ÎÁ°¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ ++\fBpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÈJavadoc¥¿¥°¤Î¤ß¤ò³ÊǼ¤Ç¤­¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ãí¼á¤Ï³ÊǼ¤Ç¤­¤Þ¤»¤ó¡£ ++.RE ++.PP ++³Æ¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢\fBpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï\fBpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Î¤¤¤º¤ì¤«¤ò1¤Ä»ý¤Ä¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤ÎξÊý¤ò»ý¤Ä¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¤É¤Á¤é¤«¤Î¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¤È¤â¤Ë¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Î¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤ËÇÛÃÖ¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++package\-info\&.java¥Õ¥¡¥¤¥ë ++.PP ++\fBpackage\-info\&.java\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î¹½Â¤¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥á¥ó¥È¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¤ÎÁ°¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤Ç¤¢¤ë\fI/**\fR¤ª¤è¤Ó\fI*/\fR¤¬Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢Ãæ´Ö¤Î¹Ô¤ÎÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤Ï¾Êά²Äǽ¤Ç¤¹¡£ ++¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤Ç¤¢¤ë\fB/**\fR¤ª¤è¤Ó\fB*/\fR¤¬Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢Ãæ´Ö¤Î¹Ô¤ÎÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤Ï¾Êά²Äǽ¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * Provides the classes necessary to create an +- * applet and the classes an applet uses +- * to communicate with its applet context\&. +- * <p> +- * The applet framework involves two entities: +- * the applet and the applet context\&. +- * An applet is an embeddable window (see the +- * {@link java\&.awt\&.Panel} class) with a few extra +- * methods that the applet context can use to +- * initialize, start, and stop the applet\&. +- * +- * @since 1\&.0 +- * @see java\&.awt +- */ +-package java\&.lang\&.applet; ++\fB/**\fR ++\fB * Provides the classes necessary to create an \fR ++\fB * applet and the classes an applet uses \fR ++\fB * to communicate with its applet context\&.\fR ++\fB * <p>\fR ++\fB * The applet framework involves two entities:\fR ++\fB * the applet and the applet context\&.\fR ++\fB * An applet is an embeddable window (see the\fR ++\fB * {@link java\&.awt\&.Panel} class) with a few extra\fR ++\fB * methods that the applet context can use to \fR ++\fB * initialize, start, and stop the applet\&.\fR ++\fB *\fR ++\fB * @since 1\&.0\fR ++\fB * @see java\&.awt\fR ++\fB */\fR ++\fBpackage java\&.lang\&.applet;\fR ++ + .fi + .if n \{\ + .RE + .\} +-package\&.html¥Õ¥¡¥¤¥ë.PP +-\fIpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î¹½Â¤¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥á¥ó¥È¤Ï¡¢\fI<body>\fRÍ×ÁǤËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ ++.PP ++package\&.html¥Õ¥¡¥¤¥ë ++.PP ++\fBpackage\&.html\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¼¡¤Î¹½Â¤¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥á¥ó¥È¤Ï¡¢\fB<body>\fRÍ×ÁǤËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ + .PP + ¥Õ¥¡¥¤¥ë: +-\fIjava/applet/package\&.html\fR ++\fBjava/applet/package\&.html\fR + .sp + .if n \{\ + .RS 4 + .\} + .nf +-<HTML> +-<BODY> +-Provides the classes necessary to create an applet and the +-classes an applet uses to communicate with its applet context\&. +-<p> +-The applet framework involves two entities: the applet +-and the applet context\&. An applet is an embeddable +-window (see the {@link java\&.awt\&.Panel} class) with a +-few extra methods that the applet context can use to +-initialize, start, and stop the applet\&. +- +-@since 1\&.0 +-@see java\&.awt +-</BODY> +-</HTML> ++\fB<HTML>\fR ++\fB<BODY>\fR ++\fBProvides the classes necessary to create an applet and the \fR ++\fBclasses an applet uses to communicate with its applet context\&.\fR ++\fB<p>\fR ++\fBThe applet framework involves two entities: the applet\fR ++\fBand the applet context\&. An applet is an embeddable\fR ++\fBwindow (see the {@link java\&.awt\&.Panel} class) with a\fR ++\fBfew extra methods that the applet context can use to\fR ++\fBinitialize, start, and stop the applet\&. \fR ++ ++\fB@since 1\&.0 \fR ++\fB@see java\&.awt\fR ++\fB</BODY>\fR ++\fB</HTML>\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIpackage\&.html\fR¥Õ¥¡¥¤¥ë¤ÏÄ̾ï¤ÎHTML¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¤ò´Þ¤ó¤Ç¤¤¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÏHTML¤Çµ­½Ò¤·¤Þ¤¹¤¬¡¢Îã³°¤¬1¤Ä¤¢¤ê¤Þ¤¹¡£¤³¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤Ç¤¢¤ë\fI/**\fR¤È\fI*/\fR¡¢¤Þ¤¿¤Ï¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤ò´Þ¤á¤Ê¤¤¡¢¤È¤¤¤¦ÅÀ¤Ç¤¹¡£¥³¥á¥ó¥È¤ò½ñ¤¯¾ì¹ç¤Ï¡¢ºÇ½é¤Îʸ¤ò¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¤È¤·¡¢\fI<body>\fR¥¿¥°¤ÈºÇ½é¤Îʸ¤Î´Ö¤Ë¥¿¥¤¥È¥ë¤ä¤½¤Î¾¤Î¥Æ¥­¥¹¥È¤ò´Þ¤á¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤ËÇÛÃÖ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI@see\fR¥¿¥°¤ò¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢´°Á´½¤¾þ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý.PP +-\fIjavadoc\fR¥³¥á¥ó¥È¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¼ê½ç¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBpackage\&.html\fR¥Õ¥¡¥¤¥ë¤ÏÄ̾ï¤ÎHTML¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¥Ñ¥Ã¥±¡¼¥¸Àë¸À¤ò´Þ¤ó¤Ç¤¤¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÏHTML¤Çµ­½Ò¤·¤Þ¤¹¤¬¡¢Îã³°¤¬1¤Ä¤¢¤ê¤Þ¤¹¡£¤³¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤Ç¤¢¤ë\fB/**\fR¤È\fB*/\fR¡¢¤Þ¤¿¤Ï¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤ò´Þ¤á¤Ê¤¤¡¢¤È¤¤¤¦ÅÀ¤Ç¤¹¡£¥³¥á¥ó¥È¤ò½ñ¤¯¾ì¹ç¤Ï¡¢ºÇ½é¤Îʸ¤ò¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¤È¤·¡¢\fB<body>\fR¥¿¥°¤ÈºÇ½é¤Îʸ¤Î´Ö¤Ë¥¿¥¤¥È¥ë¤ä¤½¤Î¾¤Î¥Æ¥­¥¹¥È¤ò´Þ¤á¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤ËÇÛÃÖ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB@see\fR¥¿¥°¤ò¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢´°Á´½¤¾þ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý ++.PP ++\fBjavadoc\fR¥³¥á¥ó¥È¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¼ê½ç¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -344,8 +358,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-½èÍý¤Ç¤­¤ë¤è¤¦¤Ë¥³¥á¥ó¥È¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£package\&.html¤Î¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI<body>\fR¤È\fI</body>\fR +-HTML¥¿¥°´Ö¤Î¤¹¤Ù¤Æ¤ÎÆâÍƤò¥³¥Ô¡¼¤·¤Þ¤¹¡£\fI<head>\fR¥»¥¯¥·¥ç¥ó¤ò´Þ¤á¡¢¤½¤³¤Ë\fI<title>\fR¥¿¥°¤ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÃøºî¸¢µ­½Ò¤Ê¤É¤Î¾ðÊó¤òÇÛÃÖ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¤¬¡¢À¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¤½¤ì¤é¤Ï°ìÀÚɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ ++½èÍý¤Ç¤­¤ë¤è¤¦¤Ë¥³¥á¥ó¥È¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£package\&.html¤Î¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB<body>\fR¤È\fB</body>\fR ++HTML¥¿¥°´Ö¤Ç¤¹¤Ù¤Æ¤Î¥³¥ó¥Æ¥ó¥Ä¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£\fB<head>\fR¥»¥¯¥·¥ç¥ó¤ò´Þ¤á¤Æ¡¢\fB<title>\fR¥¿¥°¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¥é¥¤¥Èʸ¡¢¤½¤Î¾¤Î¾ðÊó¤òÇÛÃÖ¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤¹¤¬¡¢¤³¤ì¤é¤ÏÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤Ë¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -379,24 +393,24 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¡¦¥Ú¡¼¥¸¤ÎÀèƬ¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢³µÍ×¥Ú¡¼¥¸¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤È¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤òÄɲä·¤Þ¤¹¡£Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¢Standard Edition API»ÅÍͤγµÍ× ++¥Ñ¥Ã¥±¡¼¥¸¤Î¥µ¥Þ¥ê¡¼¡¦¥Ú¡¼¥¸¤ÎÀèƬ¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢³µÍ×¥Ú¡¼¥¸¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤È¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤òÄɲä·¤Þ¤¹¡£Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¢Standard Edition API»ÅÍͤγµÍ× + (http://docs\&.oracle\&.com/javase/8/docs/api/overview\-summary\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp + ʸ¤Î½ª¤ï¤ê¤Ï¡¢¥¯¥é¥¹¤ä¥á¥ó¥Ð¡¼¤Î¼çÀâÌÀ¤ÎºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤ÈƱ¤¸¥ë¡¼¥ë¤Ë¤è¤Ã¤ÆȽÃǤµ¤ì¤Þ¤¹¡£ + .RE + .SS "³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë" + .PP +-¥É¥­¥å¥á¥ó¥È²½¤¹¤ë³Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤Ï¡¢Æȼ«¤Î³µÍץɥ­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤ÏÀìÍѤΥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÊÝ»ý¤µ¤ì¤Þ¤¹¡£¤½¤ÎÆâÍƤϡ¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë³µÍ×¥Ú¡¼¥¸¤ËÁȤ߹þ¤Þ¤ì¤Þ¤¹¡£¤³¤Î¥³¥á¥ó¥È¤Ë¤Ï¡¢Ä̾¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥ÈÁ´ÂΤËÅö¤Æ¤Ï¤Þ¤ë¥É¥­¥å¥á¥ó¥È¤òµ­½Ò¤·¤Þ¤¹¡£ ++¥É¥­¥å¥á¥ó¥È²½¤¹¤ë³Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤Ï¡¢Æȼ«¤Î³µÍץɥ­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¢¤½¤ì¤ÏÀìÍѤΥ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÊÝ»ý¤µ¤ì¤Þ¤¹¡£¤½¤ÎÆâÍƤϡ¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë³µÍ×¥Ú¡¼¥¸¤ËÁȤ߹þ¤Þ¤ì¤Þ¤¹¡£¤³¤Î¥³¥á¥ó¥È¤Ë¤Ï¡¢Ä̾¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥ÈÁ´ÂΤËÅö¤Æ¤Ï¤Þ¤ë¥É¥­¥å¥á¥ó¥È¤òµ­½Ò¤·¤Þ¤¹¡£ + .PP + ¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ïoverview\&.html¤Ê¤É¤Î̾Á°¤òÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¡¢¤É¤³¤ËÇÛÃÖ¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£°ìÈÌŪ¤Ê¾ì½ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤ÎºÇ¾åÉô¤Ç¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢\fIjava\&.applet\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬/home/user/src/java/applet¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Ï/home/user/src/overview\&.html¤ËºîÀ®¤Ç¤­¤Þ¤¹¡£ +-.PP +-°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥È¤ËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤òÊ£¿ô²ó¼Â¹Ô¤¹¤ë¾ì¹ç¤Ï¡¢Æ±¤¸1¤Ä¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥»¥Ã¥È¤ËÂФ·¤ÆÊ£¿ô¤Î³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢ÆâÉô¥É¥­¥å¥á¥ó¥ÈÍѤË\fI\-private\fR¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò1²ó¼Â¹Ô¤·¤¿¸å¡¢¸ø³«¥É¥­¥å¥á¥ó¥ÈÍѤˤ½¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤ÇºÆÅټ¹Ԥ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢³Æ³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Î1ʸÌܤǡ¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤ò¸ø³«ÍѤޤ¿¤ÏÆâÉôÍѤȤ·¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£ +-.PP +-³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤϡ¢HTML¤Çµ­½Ò¤µ¤ì¤¿1¤Ä¤ÎÂ礭¤Ê¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤¹¡£ºÇ½é¤Îʸ¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥È¤Î¥µ¥Þ¥ê¡¼¤È¤·¤Þ¤¹¡£\fI<body>\fR¥¿¥°¤ÈºÇ½é¤Îʸ¤Î´Ö¤Ë¥¿¥¤¥È¥ë¤ä¤½¤Î¾¤Î¥Æ¥­¥¹¥È¤ò´Þ¤á¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£{\fI@link}\fR¤Ê¤É¤Î¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤ËÇÛÃÖ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI@see\fR¥¿¥°¤òÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢´°Á´½¤¾þ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¡¢\fI\-overview\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤è¤¦¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¼ê½ç¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fBjava\&.applet\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬/home/user/src/java/applet¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Ï/home/user/src/overview\&.html¤ËºîÀ®¤Ç¤­¤Þ¤¹¡£ ++.PP ++°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥È¤ËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤òÊ£¿ô²ó¼Â¹Ô¤¹¤ë¾ì¹ç¤Ï¡¢Æ±¤¸1¤Ä¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥»¥Ã¥È¤ËÂФ·¤ÆÊ£¿ô¤Î³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢ÆâÉô¥É¥­¥å¥á¥ó¥ÈÍѤË\fB\-private\fR¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò1²ó¼Â¹Ô¤·¤¿¸å¡¢¸ø³«¥É¥­¥å¥á¥ó¥ÈÍѤˤ½¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤ÇºÆÅټ¹Ԥ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢³Æ³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤Î1ʸÌܤǡ¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤ò¸ø³«ÍѤޤ¿¤ÏÆâÉôÍѤȤ·¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£ ++.PP ++³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤϡ¢HTML¤Çµ­½Ò¤µ¤ì¤¿1¤Ä¤ÎÂ礭¤Ê¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤¹¡£ºÇ½é¤Îʸ¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥È¤Î¥µ¥Þ¥ê¡¼¤È¤·¤Þ¤¹¡£\fB<body>\fR¥¿¥°¤ÈºÇ½é¤Îʸ¤Î´Ö¤Ë¥¿¥¤¥È¥ë¤ä¤½¤Î¾¤Î¥Æ¥­¥¹¥È¤ò´Þ¤á¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£{\fB@link}\fR¤Ê¤É¤Î¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤ËÇÛÃÖ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB@see\fR¥¿¥°¤òÄɲ乤ë¾ì¹ç¤Ë¤Ï¡¢´°Á´½¤¾þ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¡¢\fB\-overview\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¤è¤¦¤Ë½èÍý¤µ¤ì¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¼ê½ç¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -406,7 +420,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI<body>\fR¤È\fI</body>\fR¥¿¥°¤Î´Ö¤Ë¤¢¤ëÆâÍƤò¤¹¤Ù¤Æ½èÍýÂоݤȤ·¤Æ¥³¥Ô¡¼¤·¤Þ¤¹¡£ ++\fB<body>\fR¤È\fB</body>\fR¥¿¥°´Ö¤Ç¡¢½èÍý¤¹¤ë¤¹¤Ù¤Æ¤Î¥³¥ó¥Æ¥ó¥Ä¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -444,50 +458,56 @@ + .RE + .SS "̤½èÍý¤Î¥Õ¥¡¥¤¥ë" + .PP +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ°¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Ä̾¥°¥é¥Õ¥£¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¡¢¥µ¥ó¥×¥ë¤ÎJava¥½¡¼¥¹¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢°ìÈÌŪ¤ÊJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î±Æ¶Á¤ò¼õ¤±¤Ê¤¤Â¿¤¯¤ÎÆâÍƤò´Þ¤àÆÈΩ¤·¤¿HTML¥Õ¥¡¥¤¥ë¤Ê¤É¤¬¤¢¤ê¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ°¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢Ä̾¥°¥é¥Õ¥£¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¡¢¥µ¥ó¥×¥ë¤ÎJava¥½¡¼¥¹¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢°ìÈÌŪ¤ÊJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î±Æ¶Á¤ò¼õ¤±¤Ê¤¤Â¿¤¯¤ÎÆâÍƤò´Þ¤àÆÈΩ¤·¤¿HTML¥Õ¥¡¥¤¥ë¤Ê¤É¤¬¤¢¤ê¤Þ¤¹¡£ + .PP + ̤½èÍý¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤Ë¤Ï¡¢doc\-files¤È¤¤¤¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤·¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤àǤ°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤Ê¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£doc\-files¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤ÄÍѰդǤ­¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¥Ü¥¿¥ó¤Î¥¤¥á¡¼¥¸¤ò\fIjava\&.awt\&.Button\fR¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ë´Þ¤á¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤Î¥¤¥á¡¼¥¸¡¦¥Õ¥¡¥¤¥ë¤ò/home/user/src/java/awt/doc\-files/¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤­¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤ò/home/user/src/java/doc\-files¤ËÃÖ¤«¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£java¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ç¤Ï¤Ê¤¤¤«¤é¤Ç¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤³¤È¤â¤Ç¤­¤Þ¤»¤ó¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Ê¤¤¤Î¤Ç¡¢Ì¤½èÍý¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î¤¹¤Ù¤Æ¤Î¥ê¥ó¥¯¤Ï¡¢¥³¡¼¥É¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤È¤½¤Î¤¹¤Ù¤Æ¤ÎÆâÍƤò°¸Àè¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢Button\&.java¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥ê¥ó¥¯¤¬¤É¤Î¤è¤¦¤Ë¸«¤¨¤ë¤«¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥Ü¥¿¥ó¤Î¥¤¥á¡¼¥¸¤ò\fBjava\&.awt\&.Button\fR¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ë´Þ¤á¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤Î¥¤¥á¡¼¥¸¡¦¥Õ¥¡¥¤¥ë¤ò/home/user/src/java/awt/doc\-files/¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤­¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤ò/home/user/src/java/doc\-files¤ËÃÖ¤«¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£java¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ç¤Ï¤Ê¤¤¤«¤é¤Ç¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ë¤³¤È¤â¤Ç¤­¤Þ¤»¤ó¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Ê¤¤¤Î¤Ç¡¢Ì¤½èÍý¤Î¥Õ¥¡¥¤¥ë¤Ø¤Î¤¹¤Ù¤Æ¤Î¥ê¥ó¥¯¤Ï¡¢¥³¡¼¥É¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤È¤½¤Î¤¹¤Ù¤Æ¤ÎÆâÍƤò°¸Àè¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢Button\&.java¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥ê¥ó¥¯¤¬¤É¤Î¤è¤¦¤Ë¸«¤¨¤ë¤«¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * This button looks like this: +- * <img src="doc\-files/Button\&.gif"> +- */ ++\fB/**\fR ++\fB * This button looks like this: \fR ++\fB * <img src="doc\-files/Button\&.gif">\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë" + .PP +-¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤Ï¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤Ç¤­¤Þ¤¹¡£¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤¬½èÍý¤µ¤ì¤ë¤Î¤òËɤ°¤Ë¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢ÌÀ¼¨Åª¤Ë¸ÄÊ̤Υ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÅϤ·¤Þ¤¹¡£ +-.PP +-¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Í­¸ú¤Ê¡¢¥³¥ó¥Ñ¥¤¥ë²Äǽ¤Ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Í­¸ú¤Ê¡¢¸ß´¹À­¤Î¤¢¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢Â¿¤¯¤Î¾ì¹ç¡¢\fI\&.java\fRÀÜÈø¼­¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£ +-¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë.PP +-¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¡¢Ì¾Á°¤Ê¤·¥Ñ¥Ã¥±¡¼¥¸¤ä¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤È¤ÏÊ̤Υѥ屡¼¥¸¤Ë°¤¹¤ë¤è¤¦¤Ë¤¹¤ë¾ì¹ç¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î²¼¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë̵¸ú¤Ê̾Á°¤òÉÕ¤±¤Þ¤¹¡£¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¼¨¤¹¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï·Ù¹ð¤Þ¤¿¤Ï¥¨¥é¡¼¤ò°ú¤­µ¯¤³¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬Ìµ¸ú¤Ê̾Á°¤ò»ý¤Ä¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¸ºß¤¹¤ë¾ì¹ç¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥¹¥­¥Ã¥×¤µ¤ì¡¢¥¨¥é¡¼¤Þ¤¿¤Ï·Ù¹ð¤Ïȯ¹Ô¤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤òcom\&.package1¤ËÄɲ乤ë¤Ë¤Ï¡¢Ìµ¸ú¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¤Þ¤¹¡£¼¡¤Î¥Ç¥£¥ì¥¯¥È¥ê̾¤Ë¤Ï¥Ï¥¤¥Õ¥ó¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤¿¤á̵¸ú¤Ç¤¹¡£ ++¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤Ï¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤Ç¤­¤Þ¤¹¡£¥Æ¥¹¥È¤ª¤è¤Ó¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤¬½èÍý¤µ¤ì¤ë¤Î¤òËɤ°¤Ë¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢ÌÀ¼¨Åª¤Ë¸ÄÊ̤Υ½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤òÅϤ·¤Þ¤¹¡£ ++.PP ++¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Í­¸ú¤Ê¡¢¥³¥ó¥Ñ¥¤¥ë²Äǽ¤Ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Í­¸ú¤Ê¡¢¸ß´¹À­¤Î¤¢¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢Â¿¤¯¤Î¾ì¹ç¡¢\fB\&.java\fRÀÜÈø¼­¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£ ++.PP ++¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë ++.PP ++¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¡¢Ì¾Á°¤Ê¤·¥Ñ¥Ã¥±¡¼¥¸¤ä¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤È¤ÏÊ̤Υѥ屡¼¥¸¤Ë°¤¹¤ë¤è¤¦¤Ë¤¹¤ë¾ì¹ç¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î²¼¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë̵¸ú¤Ê̾Á°¤òÉÕ¤±¤Þ¤¹¡£¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¼¨¤¹¥³¥Þ¥ó¥É¹Ô°ú¿ô¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï·Ù¹ð¤Þ¤¿¤Ï¥¨¥é¡¼¤ò°ú¤­µ¯¤³¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬Ìµ¸ú¤Ê̾Á°¤ò»ý¤Ä¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¸ºß¤¹¤ë¾ì¹ç¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥¹¥­¥Ã¥×¤µ¤ì¡¢¥¨¥é¡¼¤Þ¤¿¤Ï·Ù¹ð¤Ïȯ¹Ô¤µ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤òcom\&.package1¤ËÄɲ乤ë¤Ë¤Ï¡¢Ìµ¸ú¤Ê¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¤Þ¤¹¡£¼¡¤Î¥Ç¥£¥ì¥¯¥È¥ê̾¤Ë¤Ï¥Ï¥¤¥Õ¥ó¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤¿¤á̵¸ú¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-com/package1/test\-files/ ++\fBcom/package1/test\-files/\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¸ÄÊ̤μ¹Ԥǡ¢¥ï¥¤¥ë¥É¥«¡¼¥É¤ò´Þ¤ó¤À¥Æ¥¹¥È¡¦¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾(\fIcom/package1/test\-files/*\&.java\fR¤Ê¤É)¤òÅϤ·¤Æ¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤è¤¦¤ËÀßÄê¤Ç¤­¤Þ¤¹¡£ +-¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë.PP +-¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤¹¤ë¤¬¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¥¨¥é¡¼¤òÀ¸À®¤·¤Ê¤¤¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ë\fIBuffer\-Template\&.java\fR¤Ê¤É¤Î̵¸ú¤Ê̾Á°¤òÉÕ¤±¤Æ¡¢½èÍý¤µ¤»¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ÀÜÈø¼­¤Î\fI\&.java\fR¤¬ºï½ü¤µ¤ì¤ë¤ÈÍ­¸ú¤Ê¥¯¥é¥¹Ì¾¤Ë¤Ê¤ë̾Á°¤ò»ý¤Ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤ß¤ò½èÍý¤·¤Þ¤¹¡£ ++¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¸ÄÊ̤μ¹Ԥǡ¢¥ï¥¤¥ë¥É¥«¡¼¥É¤ò´Þ¤ó¤À¥Æ¥¹¥È¡¦¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾(\fBcom/package1/test\-files/*\&.java\fR¤Ê¤É)¤òÅϤ·¤Æ¡¢¥Æ¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤è¤¦¤ËÀßÄê¤Ç¤­¤Þ¤¹¡£ ++.PP ++¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë ++.PP ++¥Æ¥ó¥×¥ì¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤ò¥½¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤¹¤ë¤¬¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¥¨¥é¡¼¤òÀ¸À®¤·¤Ê¤¤¾ì¹ç¡¢¥Õ¥¡¥¤¥ë¤Ë\fBBuffer\-Template\&.java\fR¤Ê¤É¤Î̵¸ú¤Ê̾Á°¤òÉÕ¤±¤Æ¡¢½èÍý¤µ¤»¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ÀÜÈø¼­¤Î\fB\&.java\fR¤¬ºï½ü¤µ¤ì¤ë¤ÈÍ­¸ú¤Ê¥¯¥é¥¹Ì¾¤Ë¤Ê¤ë̾Á°¤ò»ý¤Ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤ß¤ò½èÍý¤·¤Þ¤¹¡£ + .SH "À¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë" + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ëɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¤³¤³¤ÇÀâÌÀ¤¹¤ë¡¢´ðËÜÆâÍÆ¥Ú¡¼¥¸¡¢Áê¸ß»²¾È¥Ú¡¼¥¸¡¢¥µ¥Ý¡¼¥È¡¦¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£³ÆHTML¥Ú¡¼¥¸¤Ï¸ÄÊ̤Υե¡¥¤¥ë¤ËÂбþ¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢2¤Ä¤Î¥¿¥¤¥×¤Î¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ºÇ½é¤Î¥¿¥¤¥×¤Ë¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë±þ¤¸¤¿Ì¾Á°¤¬ÉÕ¤±¤é¤ì¤Þ¤¹¡£2ÈÖÌܤΥ¿¥¤¥×¤Ë¤Ï¡¢ºÇ½é¤Î¥¿¥¤¥×¤Î¥Õ¥¡¥¤¥ë¤È¤Î¶¥¹ç¤òËɤ°¤¿¤á¤Ë¡¢¥Ï¥¤¥Õ¥ó¤¬´Þ¤Þ¤ì¤Þ¤¹(package\-summary\&.html¤Ê¤É)¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ëɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¤³¤³¤ÇÀâÌÀ¤¹¤ë¡¢´ðËÜÆâÍÆ¥Ú¡¼¥¸¡¢Áê¸ß»²¾È¥Ú¡¼¥¸¡¢¥µ¥Ý¡¼¥È¡¦¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£³ÆHTML¥Ú¡¼¥¸¤Ï¸ÄÊ̤Υե¡¥¤¥ë¤ËÂбþ¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢2¤Ä¤Î¥¿¥¤¥×¤Î¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ºÇ½é¤Î¥¿¥¤¥×¤Ë¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë±þ¤¸¤¿Ì¾Á°¤¬ÉÕ¤±¤é¤ì¤Þ¤¹¡£2ÈÖÌܤΥ¿¥¤¥×¤Ë¤Ï¡¢ºÇ½é¤Î¥¿¥¤¥×¤Î¥Õ¥¡¥¤¥ë¤È¤Î¶¥¹ç¤òËɤ°¤¿¤á¤Ë¡¢¥Ï¥¤¥Õ¥ó¤¬´Þ¤Þ¤ì¤Þ¤¹(package\-summary\&.html¤Ê¤É)¡£ + .SS "´ðËÜÆâÍÆ¥Ú¡¼¥¸" + .sp + .RS 4 +@@ -509,7 +529,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-µ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ú¡¼¥¸(package\-summary\&.html)¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¤¢¤ëpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.java¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¥Æ¥­¥¹¥È¤ò¤¹¤Ù¤ÆÁȤßÆþ¤ì¤Þ¤¹¡£ ++µ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ú¡¼¥¸(package\-summary\&.html)¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¤¢¤ëpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.java¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¥Æ¥­¥¹¥È¤ò¤¹¤Ù¤ÆÁȤßÆþ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -520,7 +540,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥ÈÁ´ÂΤËÂФ·¤Æ1¤Ä¤Î³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¡£³µÍ×¥Ú¡¼¥¸¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤ÎÀèƬ¥Ú¡¼¥¸¤Ë¤Ê¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI\-overview\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¥Æ¥­¥¹¥È¤ò¤¹¤Ù¤ÆÁȤßÆþ¤ì¤Þ¤¹¡£³µÍ×¥Ú¡¼¥¸¤¬ºîÀ®¤µ¤ì¤ë¤Î¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£HTML¥Õ¥ì¡¼¥à¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥ÈÁ´ÂΤËÂФ·¤Æ1¤Ä¤Î³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¡£³µÍ×¥Ú¡¼¥¸¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤ÎÀèƬ¥Ú¡¼¥¸¤Ë¤Ê¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB\-overview\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¥Æ¥­¥¹¥È¤ò¤¹¤Ù¤ÆÁȤßÆþ¤ì¤Þ¤¹¡£³µÍ×¥Ú¡¼¥¸¤¬ºîÀ®¤µ¤ì¤ë¤Î¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£HTML¥Õ¥ì¡¼¥à¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SS "Áê¸ß»²¾È¥Ú¡¼¥¸" + .sp +@@ -587,9 +607,9 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-ľÎ󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸(serialized\-form\&.html)¡£¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥á¥½¥Ã¥É¤ÎÀâÌÀ¤ò´Þ¤à¡¢Ä¾Îó²½²Äǽ¤«¤Ä³°Éô²½²Äǽ¤Ê¥¯¥é¥¹¤Ë´Ø¤¹¤ë¾ðÊóÍѤΥڡ¼¥¸¤Ç¤¹¡£¤³¤Î¥Ú¡¼¥¸Æâ¤Î¾ðÊó¤Ï¡¢API¤ò»ÈÍѤ¹¤ë³«È¯¼Ô¤Ç¤Ï¤Ê¤¯¡¢ºÆ¼ÂÁõ¼Ô¤ËɬÍפʾðÊó¤Ç¤¹¡£Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤Ø¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢Ä¾Î󲽤µ¤ì¤¿¥¯¥é¥¹¤Ë°ÜÆ°¤·¤Æ¡¢¤½¤Î¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤Ë¤¢¤ë¡Ö´ØÏ¢¹àÌܡץ»¥¯¥·¥ç¥ó¤Ç¡ÖľÎ󲽤µ¤ì¤¿·Á¼°¡×¤ò¥¯¥ê¥Ã¥¯¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ÏľÎ󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥Ú¡¼¥¸¤Ë¤Ï¡¢Serializable¤ò¼ÂÁõ¤¹¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹(public¤Þ¤¿¤ÏÈópublic)¤¬¡¢¤½¤Î\fIreadObject\fR¤ä\fIwriteObject\fR¥á¥½¥Ã¥É¡¢Ä¾Î󲽤µ¤ì¤¿¥Õ¥£¡¼¥ë¥É¡¢¤ª¤è¤Ó\fI@serial\fR¡¢\fI@serialField\fR¡¢\fI@serialData\fR¥¿¥°¤«¤é¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤È¤È¤â¤Ë¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£Ä¾Îó²½²Äǽ¤Êpublic¥¯¥é¥¹¤ò½ü³°¤¹¤ë¤Ë¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸)¤ò\fI@serial\fR +-exclude¤Ç¥Þ¡¼¥¯¤·¤Þ¤¹¡£Ä¾Îó²½²Äǽ¤Êpackage\-private¥¯¥é¥¹¤ò´Þ¤á¤ë¤Ë¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸)¤ò\fI@serial\fR +-include¤Ç¥Þ¡¼¥¯¤·¤Þ¤¹¡£¥ê¥ê¡¼¥¹1\&.4¤Ç¤Ï¡¢\fI\-private\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢public¥¯¥é¥¹¤ª¤è¤Óprivate¥¯¥é¥¹¤Î´°Á´¤ËľÎ󲽤µ¤ì¤¿·Á¼°¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ľÎ󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸(serialized\-form\&.html)¡£¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥á¥½¥Ã¥É¤ÎÀâÌÀ¤ò´Þ¤à¡¢Ä¾Îó²½²Äǽ¤«¤Ä³°Éô²½²Äǽ¤Ê¥¯¥é¥¹¤Ë´Ø¤¹¤ë¾ðÊóÍѤΥڡ¼¥¸¤Ç¤¹¡£¤³¤Î¥Ú¡¼¥¸Æâ¤Î¾ðÊó¤Ï¡¢API¤ò»ÈÍѤ¹¤ë³«È¯¼Ô¤Ç¤Ï¤Ê¤¯¡¢ºÆ¼ÂÁõ¼Ô¤ËɬÍפʾðÊó¤Ç¤¹¡£Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤Ø¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢Ä¾Î󲽤µ¤ì¤¿¥¯¥é¥¹¤Ë°ÜÆ°¤·¤Æ¡¢¤½¤Î¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤Ë¤¢¤ë¡Ö´ØÏ¢¹àÌܡץ»¥¯¥·¥ç¥ó¤Ç¡ÖľÎ󲽤µ¤ì¤¿·Á¼°¡×¤ò¥¯¥ê¥Ã¥¯¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ÏľÎ󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥Ú¡¼¥¸¤Ë¤Ï¡¢Serializable¤ò¼ÂÁõ¤¹¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹(public¤Þ¤¿¤ÏÈópublic)¤¬¡¢¤½¤Î\fBreadObject\fR¤ä\fBwriteObject\fR¥á¥½¥Ã¥É¡¢Ä¾Î󲽤µ¤ì¤¿¥Õ¥£¡¼¥ë¥É¡¢¤ª¤è¤Ó\fB@serial\fR¡¢\fB@serialField\fR¡¢\fB@serialData\fR¥¿¥°¤«¤é¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤È¤È¤â¤Ë¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£Ä¾Îó²½²Äǽ¤Êpublic¥¯¥é¥¹¤ò½ü³°¤¹¤ë¤Ë¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸)¤ò\fB@serial\fR ++exclude¤Ç¥Þ¡¼¥¯¤·¤Þ¤¹¡£Ä¾Îó²½²Äǽ¤Êpackage\-private¥¯¥é¥¹¤ò´Þ¤á¤ë¤Ë¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸)¤ò\fB@serial\fR ++include¤Ç¥Þ¡¼¥¯¤·¤Þ¤¹¡£¥ê¥ê¡¼¥¹1\&.4¤Ç¤Ï¡¢\fB\-private\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢public¥¯¥é¥¹¤ª¤è¤Óprivate¥¯¥é¥¹¤Î´°Á´¤ËľÎ󲽤µ¤ì¤¿·Á¼°¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -600,7 +620,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-º÷°ú¥Ú¡¼¥¸(\fIindex\-*\&.html\fR)¡£¤¹¤Ù¤Æ¤Î¥¯¥é¥¹Ì¾¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹Ì¾¡¢¥³¥ó¥¹¥È¥é¥¯¥¿Ì¾¡¢¥Õ¥£¡¼¥ë¥É̾¡¢¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤¬¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ëʤó¤Ç¤¤¤Þ¤¹¡£º÷°ú¥Ú¡¼¥¸¤Ï¡¢Unicode¤ò°·¤¨¤ë¤è¤¦¤Ë¹ñºÝ²½¤µ¤ì¤Æ¤¤¤Þ¤¹¡£1¤Ä¤Î¥Õ¥¡¥¤¥ë¤È¤·¤ÆÀ¸À®¤¹¤ë¤³¤È¤â¡¢ÀèƬʸ»ú(±Ñ¸ì¤Î¾ì¹çA\(enZ)¤´¤È¤ËÊÌ¡¹¤Î¥Õ¥¡¥¤¥ë¤È¤·¤ÆÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++º÷°ú¥Ú¡¼¥¸(\fBindex\-*\&.html\fR)¡£¤¹¤Ù¤Æ¤Î¥¯¥é¥¹Ì¾¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹Ì¾¡¢¥³¥ó¥¹¥È¥é¥¯¥¿Ì¾¡¢¥Õ¥£¡¼¥ë¥É̾¡¢¤ª¤è¤Ó¥á¥½¥Ã¥É̾¤¬¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ëʤó¤Ç¤¤¤Þ¤¹¡£º÷°ú¥Ú¡¼¥¸¤Ï¡¢Unicode¤ò°·¤¨¤ë¤è¤¦¤Ë¹ñºÝ²½¤µ¤ì¤Æ¤¤¤Þ¤¹¡£1¤Ä¤Î¥Õ¥¡¥¤¥ë¤È¤·¤ÆÀ¸À®¤¹¤ë¤³¤È¤â¡¢ÀèƬʸ»ú(±Ñ¸ì¤Î¾ì¹çA\(enZ)¤´¤È¤ËÊÌ¡¹¤Î¥Õ¥¡¥¤¥ë¤È¤·¤ÆÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .RE + .SS "¥µ¥Ý¡¼¥È¡¦¥Ú¡¼¥¸" + .sp +@@ -612,7 +632,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ø¥ë¥×¡¦¥Ú¡¼¥¸(help\-doc\&.html)¡£¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤äÁ°½Ò¤Î³Æ¥Ú¡¼¥¸¤Ë´Ø¤¹¤ëÀâÌÀ¤¬µ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤òÆȼ«¤Î¥«¥¹¥¿¥à¡¦¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤Ç¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ë¤Ë¤Ï¡¢\fI\-helpfile\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥Ø¥ë¥×¡¦¥Ú¡¼¥¸(help\-doc\&.html)¡£¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤äÁ°½Ò¤Î³Æ¥Ú¡¼¥¸¤Ë´Ø¤¹¤ëÀâÌÀ¤¬µ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤òÆȼ«¤Î¥«¥¹¥¿¥à¡¦¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤Ç¥ª¡¼¥Ð¡¼¥é¥¤¥É¤¹¤ë¤Ë¤Ï¡¢\fB\-helpfile\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -634,7 +654,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-Ê£¿ô¤Î¥Õ¥ì¡¼¥à¡¦¥Õ¥¡¥¤¥ë(\fI*\-frame\&.html\fR)¡£¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥ê¥¹¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Õ¥ì¡¼¥à¡¦¥Õ¥¡¥¤¥ë¤ÏHTML¥Õ¥ì¡¼¥à¤òɽ¼¨¤·¤Þ¤¹¡£ ++Ê£¿ô¤Î¥Õ¥ì¡¼¥à¡¦¥Õ¥¡¥¤¥ë(\fB*\-frame\&.html\fR)¡£¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥ê¥¹¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Õ¥ì¡¼¥à¡¦¥Õ¥¡¥¤¥ë¤ÏHTML¥Õ¥ì¡¼¥à¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -645,7 +665,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë(package\-list)¡£\fI\-link\fR¤ª¤è¤Ó\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¤É¤Î¥ê¥ó¥¯¤«¤é¤â¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£ ++¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë(package\-list)¡£\fB\-link\fR¤ª¤è¤Ó\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¤É¤Î¥ê¥ó¥¯¤«¤é¤â¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -667,22 +687,22 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-doc\-files¥Ç¥£¥ì¥¯¥È¥ê¡£°¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥³¥Ô¡¼¤¹¤ë¥¤¥á¡¼¥¸¡¢¥µ¥ó¥×¥ë¡¦¥³¡¼¥É¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ê¤É¤Î¥Õ¥¡¥¤¥ë¤¬³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ½èÍý¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤ÎÃæ¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ë¤Î¤ß½èÍý¤µ¤ì¤Þ¤¹¡£ ++doc\-files¥Ç¥£¥ì¥¯¥È¥ê¡£°¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥³¥Ô¡¼¤¹¤ë¥¤¥á¡¼¥¸¡¢¥µ¥ó¥×¥ë¡¦¥³¡¼¥É¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ê¤É¤Î¥Õ¥¡¥¤¥ë¤¬³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ½èÍý¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤ÎÃæ¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ë¤Î¤ß½èÍý¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "HTML¥Õ¥ì¡¼¥à" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤¿Ãͤ˴ð¤Å¤­¡¢ºÇ¾®¸ÂɬÍפʿô(2¤Þ¤¿¤Ï3)¤Î¥Õ¥ì¡¼¥à¤òÀ¸À®¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë°ú¿ô¤È¤·¤Æ1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ¹¾ì¹ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥ê¥¹¥È¤¬¾Êά¤µ¤ì¤Þ¤¹¡£¤½¤Î¤«¤ï¤ê¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ïº¸Â¦¤ÎÎó¤Ë1¤Ä¤Î¥Õ¥ì¡¼¥à¤òºîÀ®¤·¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¤òɽ¼¨¤·¤Þ¤¹¡£Ê£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¥ê¥¹¥È¤¹¤ëÂè3¤Î¥Õ¥ì¡¼¥à¤È³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¤òºîÀ®¤·¤Þ¤¹¡£¥Õ¥ì¡¼¥à¤ò¾Êά¤¹¤ë¤Ë¤Ï¡¢¡Ö¥Õ¥ì¡¼¥à¤Ê¤·¡×¥ê¥ó¥¯¤ò¥¯¥ê¥Ã¥¯¤¹¤ë¤«¡¢overview\-summary\&.html¥Ú¡¼¥¸¤«¤é¥Ú¡¼¥¸¡¦¥»¥Ã¥È¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤¿Ãͤ˴ð¤Å¤­¡¢ºÇ¾®¸ÂɬÍפʿô(2¤Þ¤¿¤Ï3)¤Î¥Õ¥ì¡¼¥à¤òÀ¸À®¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë°ú¿ô¤È¤·¤Æ1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ¹¾ì¹ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥ê¥¹¥È¤¬¾Êά¤µ¤ì¤Þ¤¹¡£¤½¤Î¤«¤ï¤ê¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ïº¸Â¦¤ÎÎó¤Ë1¤Ä¤Î¥Õ¥ì¡¼¥à¤òºîÀ®¤·¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¤òɽ¼¨¤·¤Þ¤¹¡£Ê£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¥ê¥¹¥È¤¹¤ëÂè3¤Î¥Õ¥ì¡¼¥à¤È³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¤òºîÀ®¤·¤Þ¤¹¡£¥Õ¥ì¡¼¥à¤ò¾Êά¤¹¤ë¤Ë¤Ï¡¢¡Ö¥Õ¥ì¡¼¥à¤Ê¤·¡×¥ê¥ó¥¯¤ò¥¯¥ê¥Ã¥¯¤¹¤ë¤«¡¢overview\-summary\&.html¥Ú¡¼¥¸¤«¤é¥Ú¡¼¥¸¡¦¥»¥Ã¥È¤òɽ¼¨¤·¤Þ¤¹¡£ + .SS "À¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤Î¹½Â¤" + .PP + À¸À®¤µ¤ì¤ë¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê³¬ÁؤËÊÔÀ®¤µ¤ì¤Þ¤¹¡£1¤Ä¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ë¤Ä¤­1¤Ä¤Î¥Ç¥£¥ì¥¯¥È¥ê¡¢¤È¤¤¤¦¹½Â¤¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢\fIjava\&.applet\&.Applet\fR¥¯¥é¥¹ÍѤËÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤Ï¡¢java/applet/Applet\&.html¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ +-.PP +-À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤¬\fIapidocs\fR¤À¤È¤¹¤ë¤È¡¢\fIjava\&.applet\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥Õ¥¡¥¤¥ë¤Î¹½Â¤¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£Á°½Ò¤Î¤è¤¦¤Ë¡¢\fIframe\fR¤È¤¤¤¦¸ì¤ò̾Á°¤Ë´Þ¤à¥Õ¥¡¥¤¥ë¤Ï¡¢¤¹¤Ù¤Æº¸¾å¤Þ¤¿¤Ïº¸²¼¤Î¥Õ¥ì¡¼¥à¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤ÎHTML¥Õ¥¡¥¤¥ë¤Ï¡¢¤¹¤Ù¤Æ±¦Â¦¤Î¥Õ¥ì¡¼¥à¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ +-.PP +-¥Ç¥£¥ì¥¯¥È¥ê¤ÏÂÀ»ú¤Ç¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ø¤Î°ú¿ô¤¬¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ç¤¢¤ë¾ì¹ç¤Ë¾Êά¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£°ú¿ô¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¾ì¹ç¡¢¶õ¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ë¤Î¤ß¡¢À¸À®Àè¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£À¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¤¿¤È¤¨¤Ð¡¢\fBjava\&.applet\&.Applet\fR¥¯¥é¥¹ÍѤËÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤Ï¡¢java/applet/Applet\&.html¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ ++.PP ++À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤¬\fBapidocs\fR¤À¤È¤¹¤ë¤È¡¢\fBjava\&.applet\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥Õ¥¡¥¤¥ë¤Î¹½Â¤¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£Á°½Ò¤Î¤è¤¦¤Ë¡¢\fIframe\fR¤È¤¤¤¦¸ì¤ò̾Á°¤Ë´Þ¤à¥Õ¥¡¥¤¥ë¤Ï¡¢¤¹¤Ù¤Æº¸¾å¤Þ¤¿¤Ïº¸²¼¤Î¥Õ¥ì¡¼¥à¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤ÎHTML¥Õ¥¡¥¤¥ë¤Ï¡¢¤¹¤Ù¤Æ±¦Â¦¤Î¥Õ¥ì¡¼¥à¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++.PP ++¥Ç¥£¥ì¥¯¥È¥ê¤ÏÂÀ»ú¤Ç¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ø¤Î°ú¿ô¤¬¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Ç¤¢¤ë¾ì¹ç¤Ë¾Êά¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£°ú¿ô¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤Î¾ì¹ç¡¢¶õ¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£doc\-files¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Ë¸ºß¤¹¤ë¾ì¹ç¤Ë¤Î¤ß¡¢À¸À®Àè¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£À¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .RS 4 + .ie n \{\ +@@ -802,7 +822,7 @@ + .IP \(bu 2.3 + .\} + index\-all\&.html: +-\fI\-splitindex\fR¥ª¥×¥·¥ç¥ó¤Ê¤·¤ÇºîÀ®¤µ¤ì¤¿¥Ç¥Õ¥©¥ë¥È¤Îº÷°ú ++\fB\-splitindex\fR¥ª¥×¥·¥ç¥ó¤Ê¤·¤ÇºîÀ®¤µ¤ì¤¿¥Ç¥Õ¥©¥ë¥È¤Îº÷°ú + .RE + .sp + .RS 4 +@@ -814,7 +834,7 @@ + .IP \(bu 2.3 + .\} + \fBindex\-files\fR: +-\fI\-splitindex\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆºîÀ®¤µ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê ++\fB\-splitindex\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆºîÀ®¤µ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥ê + .sp + .RS 4 + .ie n \{\ +@@ -825,7 +845,7 @@ + .IP \(bu 2.3 + .\} + index\-<number>\&.html: +-\fI\-splitindex\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆºîÀ®¤µ¤ì¤¿º÷°ú¥Õ¥¡¥¤¥ë ++\fB\-splitindex\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆºîÀ®¤µ¤ì¤¿º÷°ú¥Õ¥¡¥¤¥ë + .RE + .RE + .sp +@@ -881,7 +901,7 @@ + .IP \(bu 2.3 + .\} + Applet\&.html: +-\fIApplet\fR¥¯¥é¥¹¡¦¥Ú¡¼¥¸ ++\fBApplet\fR¥¯¥é¥¹¡¦¥Ú¡¼¥¸ + .RE + .sp + .RS 4 +@@ -893,7 +913,7 @@ + .IP \(bu 2.3 + .\} + AppletContext\&.html: +-\fIAppletContext\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ ++\fBAppletContext\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ + .RE + .sp + .RS 4 +@@ -905,7 +925,7 @@ + .IP \(bu 2.3 + .\} + AppletStub\&.html: +-\fIAppletStub\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ ++\fBAppletStub\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ + .RE + .sp + .RS 4 +@@ -917,7 +937,7 @@ + .IP \(bu 2.3 + .\} + AudioClip\&.html: +-\fIAudioClip\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ ++\fBAudioClip\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹ + .RE + .sp + .RS 4 +@@ -988,13 +1008,13 @@ + \- Applet\&.html: Applet¥¯¥é¥¹¤Î»ÈÍÑ + .sp + \- AppletContext\&.html: +-\fIAppletContext\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ ++\fBAppletContext\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ + .sp + \- AppletStub\&.html: +-\fIAppletStub\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ ++\fBAppletStub\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ + .sp + \- AudioClip\&.html: +-\fIAudioClip\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ ++\fBAudioClip\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î»ÈÍÑ + .RE + .RE + .RE +@@ -1032,208 +1052,238 @@ + \- Applet\&.html: Applet¥½¡¼¥¹¡¦¥³¡¼¥É + .sp + \- AppletContext\&.html: +-\fIAppletContext\fR¥½¡¼¥¹¡¦¥³¡¼¥É ++\fBAppletContext\fR¥½¡¼¥¹¡¦¥³¡¼¥É + .sp + \- AppletStub\&.html: +-\fIAppletStub\fR¥½¡¼¥¹¡¦¥³¡¼¥É ++\fBAppletStub\fR¥½¡¼¥¹¡¦¥³¡¼¥É + .sp + \- AudioClip\&.html: +-\fIAudioClip\fR¥½¡¼¥¹¡¦¥³¡¼¥É ++\fBAudioClip\fR¥½¡¼¥¹¡¦¥³¡¼¥É + .RE + .RE + .RE + .SS "À¸À®¤µ¤ì¤ëAPIÀë¸À" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤ì¤¾¤ì¤Î¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥Õ¥£¡¼¥ë¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤ª¤è¤Ó¥á¥½¥Ã¥É¤Îµ­½Ò¤ÎºÇ½é¤Ë¡¢¤½¤ÎAPIÍѤÎÀë¸À¤òÀ¸À®¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIBoolean\fR¥¯¥é¥¹¤ÎÀë¸À¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤ì¤¾¤ì¤Î¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥Õ¥£¡¼¥ë¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤ª¤è¤Ó¥á¥½¥Ã¥É¤Îµ­½Ò¤ÎºÇ½é¤Ë¡¢¤½¤ÎAPIÍѤÎÀë¸À¤òÀ¸À®¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBBoolean\fR¥¯¥é¥¹¤ÎÀë¸À¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public final class Boolean +-extends Object +-implements Serializable +-.fi +-.if n \{\ +-.RE +-.\} +-.PP +-\fIBoolean\&.valueOf\fR¥á¥½¥Ã¥É¤ÎÀë¸À¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-public static Boolean valueOf(String s) +-.fi +-.if n \{\ +-.RE +-.\} +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢½¤¾þ»Ò\fIpublic\fR¡¢\fIprotected\fR¡¢\fIprivate\fR¡¢\fIabstract\fR¡¢\fIfinal\fR¡¢\fIstatic\fR¡¢\fItransient\fR¡¢¤ª¤è¤Ó\fIvolatile\fR¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢\fIsynchronized\fR¤ª¤è¤Ó\fInative\fR¤Ï¤Ç¤­¤Þ¤»¤ó¡£\fIsynchronized\fR¤ª¤è¤Ó\fInative\fR½¤¾þ»Ò¤Ï¡¢¼ÂÁõ¤Î¾ÜºÙ¤È¤ß¤Ê¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢API»ÅÍͤˤϴޤޤì¤Þ¤»¤ó¡£ +-.PP +-API¤Ç¤Ï¡¢Ê¹ÔÀ­¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤Ë¤Ä¤¤¤Æ¡¢¥­¡¼¥ï¡¼¥É\fIsynchronized\fR¤Ë°Í¸¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥³¥á¥ó¥È¤Î¼çÀâÌÀ¤È¤·¤Æ¥É¥­¥å¥á¥ó¥È²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¡Ö1¤Ä¤Îenumeration¤òÊ£¿ô¤Î¥¹¥ì¥Ã¥É¤«¤éʹԤ·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡×¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤³¤ì¤é¤Î¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤ò¼Â¸½¤¹¤ëÊýË¡¤òµ­½Ò¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fIHashtable\fR¥ª¥×¥·¥ç¥ó¤Ï¥¹¥ì¥Ã¥É¥»¡¼¥Õ¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¡Ö¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤òƱ´ü²½¤·¤Æ¤½¤ì¤ò¼Â¸½¤¹¤ë¡×¤Î¤è¤¦¤Ë»ØÄꤹ¤ëº¬µò¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤è¤ê¹âÅÙ¤ÊʹÔÀ­¤Î¤¿¤á¤Ë¡¢¥Ð¥±¥Ã¥È¡¦¥ì¥Ù¥ë¤ÇÆâÉôŪ¤ËƱ´ü²½¤¹¤ë¸¢¸Â¤òÊÝÍ­¤·¤Æ¤ª¤¯¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ +-.SH "¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È" +-.PP +-¤³¤Î¥»¥¯¥·¥ç¥ó¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥³¥á¥ó¥È¤È¥³¥á¥ó¥È¤Î·Ñ¾µ¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£ +-.SS "¥½¡¼¥¹¡¦¥³¡¼¥É¡¦¥³¥á¥ó¥È" +-.PP +-¥½¡¼¥¹¡¦¥³¡¼¥É¤ÎǤ°Õ¤Î¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÎÀë¸À¤ÎÁ°¤Ë¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸¤Ë¤â¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¹½Ê¸¤Ï¼ã´³°Û¤Ê¤ê¤Þ¤¹¤¬¡¢³µÍפˤâ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢\fI/**\fR¤È¡¢½ª¤ï¤ê¤òɽ¤¹\fI*/\fR¤Î´Ö¤Ë¤¢¤ëʸ»ú¤«¤é¹½À®¤µ¤ì¤Þ¤¹¡£ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤Ï³Æ¹Ô¤Ç»ÈÍѤǤ­¡¢¼¡¤Î¹à¤Ç¾Ü¤·¤¯ÀâÌÀ¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * This is the typical format of a simple documentation comment +- * that spans two lines\&. +- */ +-.fi +-.if n \{\ +-.RE +-.\} +-.PP +-¥¹¥Ú¡¼¥¹¤òÀáÌ󤹤ë¤Ë¤Ï¡¢¥³¥á¥ó¥È¤ò1¹Ô¤ËÆþ¤ì¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** This comment takes up only one line\&. */ +-.fi +-.if n \{\ +-.RE +-.\} +-¥³¥á¥ó¥È¤ÎÇÛÃÖ.PP +-¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥ÉÀë¸À¤ÎľÁ°¤ËÇÛÃÖ¤µ¤ì¤ë¾ì¹ç¤Ë¤Î¤ßǧ¼±¤µ¤ì¤Þ¤¹¡£¥á¥½¥Ã¥É¤ÎËÜÂΤËÃÖ¤«¤ì¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Àë¸Àʸ¤´¤È¤Ë1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤·¤«Ç§¼±¤·¤Þ¤»¤ó¡£¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.PP +-¤è¤¯¤¢¤ë´Ö°ã¤¤¤Ï¡¢¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤È¥¯¥é¥¹Àë¸À¤Î´Ö¤Ë\fIimport\fRʸ¤òÃÖ¤¤¤Æ¤·¤Þ¤¦¤³¤È¤Ç¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤ò̵»ë¤¹¤ë¤Î¤Ç¡¢\fIimport\fRʸ¤ò¤³¤Î¾ì½ê¤ËÇÛÃÖ¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * This is the class comment for the class Whatever\&. +- */ +- +-import com\&.example; // MISTAKE \- Important not to put import statement here +- +-public class Whatever{ } +-.fi +-.if n \{\ +-.RE +-.\} +-¥³¥á¥ó¥È¤Î¥Ñ¡¼¥Ä.PP +-¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢¼çÀâÌÀ¤È¤½¤Î¸å¤Ë³¤¯¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¼çÀâÌÀ¤Ï¡¢³«»Ï¶èÀÚ¤êʸ»ú\fI/**\fR¤Ç»Ï¤Þ¤ê¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Þ¤Ç³¤­¤Þ¤¹¡£¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Ï¡¢ÀèƬʸ»ú¤¬\fI@\fR¤Î¹Ô¤ÇÄêµÁ¤µ¤ì¤ëºÇ½é¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤«¤é»Ï¤Þ¤ê¤Þ¤¹(ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¡¢¶õÇòʸ»ú¡¢ÀèƬ¤Î¶èÀÚ¤êʸ»ú\fI/**\fR¤Ï½ü¤¯)¡£¼çÀâÌÀ¤òµ­½Ò¤»¤º¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Î¤ß¤Î¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¼çÀâÌÀ¤Ï¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó°Ê¹ß¤Ë³¤±¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¥¿¥°¤Î°ú¿ô¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥¿¥°¤Î¿ô¤ËÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£²¿²ó¤âµ­½Ò¤Ç¤­¤ë¥¿¥°¤È¡¢1²ó¤·¤«µ­½Ò¤Ç¤­¤Ê¤¤¥¿¥°¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î\fI@see\fR¥¿¥°¤«¤é¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Ï»Ï¤Þ¤ê¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * This sentence holds the main description for this documentation comment\&. +- * @see java\&.lang\&.Object +- */ +-.fi +-.if n \{\ +-.RE +-.\} +-¥Ö¥í¥Ã¥¯¤ª¤è¤Ó¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°.PP +-¥¿¥°¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬½èÍý¤¹¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ÎÆüì¤Ê¥­¡¼¥ï¡¼¥É¤Ç¤¹¡£¥¿¥°¤Ë¤Ï2¤Ä¤Î¥¿¥¤¥×¤¬¤¢¤ê¤Þ¤¹¡£1¤Ä¤Ï\fI@tag\fR¥¿¥°¤Î¤è¤¦¤Ëɽµ­¤µ¤ì¤ë¥Ö¥í¥Ã¥¯¡¦¥¿¥°(¥¹¥¿¥ó¥É¥¢¥í¥ó¡¦¥¿¥°¤È¤â¸Æ¤Ð¤ì¤ë)¡¢¤â¤¦1¤Ä¤Ï\fI{@tag}\fR¥¿¥°¤Î¤è¤¦¤ËÃ楫¥Ã¥³¤Ç°Ï¤ó¤Çɽµ­¤µ¤ì¤ë¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤Ç¤¹¡£¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤¬²ò¼á¤µ¤ì¤ë¤Ë¤Ï¡¢¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¡¢¶õÇòʸ»ú¡¢¶èÀÚ¤êʸ»ú(\fI/**\fR)¤ò½ü¤¤¤Æ¡¢¹Ô¤ÎÀèƬ¤ËÃÖ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fI@\fRʸ»ú¤ò¥Æ¥­¥¹¥ÈÆâ¤ÎÊ̤ξì½ê¤Ç»ÈÍѤ·¤Æ¤â¡¢¥¿¥°¤Î³«»Ï¤È¤·¤Æ²ò¼á¤µ¤ì¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£\fI@\fRʸ»ú¤ò»ÈÍѤ·¤Æ¹Ô¤ò³«»Ï¤·¤Æ¤â¡¢¤½¤ì¤¬²ò¼á¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¢HTML¥¨¥ó¥Æ¥£¥Æ¥£\fI@\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤½¤ì¤¾¤ì¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤Ë¤Ï¡¢´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Æ¥­¥¹¥È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ï¡¢¥¿¥°¤Î¸å¤«¤é¡¢¼¡¤Î¥¿¥°¤ÎÁ°¡¢¤Þ¤¿¤Ï¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ÎºÇ¸å¤Þ¤Ç¤Î´Ö¤Ëµ­½Ò¤µ¤ì¤¿¥Æ¥­¥¹¥È¤Ç¤¹(¥¿¥°¤Þ¤¿¤Ï¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤ò½ü¤¯)¡£¤³¤Î´ØÏ¢¥Æ¥­¥¹¥È¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤Ï¡¢¥Æ¥­¥¹¥È¤òµ­½Ò¤Ç¤­¤ë¾ì½ê¤Ç¤¢¤ì¤Ð¤É¤³¤Ë¤Ç¤âÃÖ¤¯¤³¤È¤¬¤Ç¤­¡¢²ò¼á¤µ¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤Ë¤Ï¥Ö¥í¥Ã¥¯¡¦¥¿¥°\fI@deprecated\fR¤È¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°\fI{@link}\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£javadoc¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * @deprecated As of JDK 1\&.1, replaced by {@link #setBounds(int,int,int,int)} +- */ +-.fi +-.if n \{\ +-.RE +-.\} +-HTML¤Ç¤Î¥³¥á¥ó¥È¤Îµ­½Ò.PP +-¥Æ¥­¥¹¥È¤ÏHTML¥¨¥ó¥Æ¥£¥Æ¥£¤ÈHTML¥¿¥°¤ò»ÈÍѤ·¤ÆHTML¤Çµ­½Ò¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ÈÍѤ¹¤ë¥Ö¥é¥¦¥¶¤¬¥µ¥Ý¡¼¥È¤¹¤ëǤ°Õ¤ÎHTML¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¥«¥¹¥±¡¼¥Ç¥£¥ó¥°¡¦¥¹¥¿¥¤¥ë¡¦¥·¡¼¥È¤ª¤è¤Ó¥Õ¥ì¡¼¥à¤ò´Þ¤á¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È°Ê³°¤ÎÉôʬ¤ÇHTML 3\&.2¤Ë½àµò¤·¤¿¥³¡¼¥É¤òÀ¸À®¤·¤Þ¤¹¡£¥Õ¥ì¡¼¥à¡¦¥»¥Ã¥È¤Î¤¿¤á¡¢À¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë¤ÏHTML 4\&.0¤¬¿ä¾©¤µ¤ì¤Þ¤¹¡£ +-.PP +-¤¿¤È¤¨¤Ð¡¢¤è¤ê¾®¤µ¤¤µ­¹æ(<)¤ª¤è¤Ó¤è¤êÂ礭¤¤µ­¹æ(>)¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢\fI<\fR¤ª¤è¤Ó\fI>\fR¤Èµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Æ±Íͤˡ¢¥¢¥ó¥Ñ¥µ¥ó¥É(&)¤Ï\fI&\fR¤Èµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢ÂÀ»ú¤ÎHTML¥¿¥°\fI<b>\fR¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * This is a <b>doc</b> comment\&. +- * @see java\&.lang\&.Object +- */ +-.fi +-.if n \{\ +-.RE +-.\} +-ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î²òÀÏ»þ¤Ë¡¢³Æ¹Ô¤ÎÀèƬ¤Ë¤¢¤ë¥¢¥¹¥¿¥ê¥¹¥¯(*)ʸ»ú¤ÏÇË´þ¤µ¤ì¤Þ¤¹¡£ºÇ½é¤Î¥¢¥¹¥¿¥ê¥¹¥¯(*)ʸ»ú¤è¤êÁ°¤Ë¤¢¤ë¶õÇò¤ä¥¿¥Ö¤âÇË´þ¤µ¤ì¤Þ¤¹¡£¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥¤¥ó¥Ç¥ó¥È¤òÊÝ»ý¤·¤¿¤Þ¤Þ¤Ç¥µ¥ó¥×¥ë¡¦¥³¡¼¥É¤ò\fI<PRE>\fR¥¿¥°Æâ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËľÀÜŽ¤êÉÕ¤±¤é¤ì¤ë¤è¤¦¤Ë¡¢ÀèƬ¤Î¶õÇòʸ»ú¤Ïºï½ü¤µ¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¥Ö¥é¥¦¥¶¤Ï¡¢¶õÇòʸ»ú¤ò¥¿¥Ö¤è¤ê¤â°ìΧ¤Ë²ò¼á¤·¤Þ¤¹¡£¥¤¥ó¥Ç¥ó¥È¤Îµ¯ÅÀ¤Ï(¶èÀÚ¤êʸ»ú\fI/**\fR¤Þ¤¿¤Ï\fI<PRE>\fR¥¿¥°¤Ç¤Ï¤Ê¤¯)º¸¥Þ¡¼¥¸¥ó¤Ë¤Ê¤ê¤Þ¤¹¡£ +-ºÇ½é¤Îʸ.PP +-³Æ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤Ï¡¢Àë¸À¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Ë´Ø¤¹¤ë´Ê·é¤«¤Ä´°Á´¤Ê¥µ¥Þ¥ê¡¼Ê¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Îʸ¤Ï¡¢¶õÇò¡¢¥¿¥Ö¡¢¤Þ¤¿¤Ï¹Ô½ªÎ»Ê¸»ú¤¬Â³¤¯ºÇ½é¤Î¥Ô¥ê¥ª¥É¡¢¤Þ¤¿¤ÏºÇ½é¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤¬¤¢¤ë°ÌÃ֤ǽª¤ï¤ê¤Þ¤¹¡£ºÇ½é¤Îʸ¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆHTML¥Ú¡¼¥¸¤ÎÀèƬ¤Ë¤¢¤ë¥á¥ó¥Ð¡¼¤Î¥µ¥Þ¥ê¡¼¤ÎÉôʬ¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ +-Ê£¿ô¥Õ¥£¡¼¥ë¥É¤ÎÀë¸À.PP +-Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¡¢1¤Ä¤Îʸ¤ÇÊ£¿ô¤Î¥Õ¥£¡¼¥ë¥É¤òÀë¸À¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Îʸ¤Ë¤Ï¡¢1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤·¤«µ­½Ò¤Ç¤­¤Þ¤»¤ó¡£¤½¤Î¥³¥á¥ó¥È¤¬¡¢¤¹¤Ù¤Æ¤Î¥Õ¥£¡¼¥ë¥É¤ËÂФ·¤Æ¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¥Õ¥£¡¼¥ë¥É¤´¤È¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢³Æ¥Õ¥£¡¼¥ë¥É¤òÊÌ¡¹¤Îʸ¤ÇÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢1¤Ä¤ÎÀë¸À¤È¤·¤Æµ­½Ò¤¹¤ë¤ÈÉÔŬÀڤǤ¹¡£¤³¤Î¾ì¹ç¤Ï¡¢Àë¸À¤ò2¤Ä¤Ëʬ¤±¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ +-.sp +-.if n \{\ +-.RS 4 +-.\} +-.nf +-/** +- * The horizontal and vertical distances of point (x,y) +- */ +-public int x, y; // Avoid this ++\fBpublic final class Boolean\fR ++\fBextends Object\fR ++\fBimplements Serializable\fR + + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¾å¤Î¥³¡¼¥É¤«¤é¼¡¤Î¤è¤¦¤Ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBBoolean\&.valueOf\fR¥á¥½¥Ã¥É¤ÎÀë¸À¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public int x ++\fBpublic static Boolean valueOf(String s)\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-The horizontal and vertical distances of point (x, y)\&. ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢½¤¾þ»Ò\fBpublic\fR¡¢\fBprotected\fR¡¢\fBprivate\fR¡¢\fBabstract\fR¡¢\fBfinal\fR¡¢\fBstatic\fR¡¢\fBtransient\fR¡¢¤ª¤è¤Ó\fBvolatile\fR¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢\fBsynchronized\fR¤ª¤è¤Ó\fBnative\fR¤Ï¤Ç¤­¤Þ¤»¤ó¡£\fBsynchronized\fR¤ª¤è¤Ó\fBnative\fR½¤¾þ»Ò¤Ï¡¢¼ÂÁõ¤Î¾ÜºÙ¤È¤ß¤Ê¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢API»ÅÍͤˤϴޤޤì¤Þ¤»¤ó¡£ ++.PP ++API¤Ç¤Ï¡¢Ê¹ÔÀ­¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤Ë¤Ä¤¤¤Æ¡¢¥­¡¼¥ï¡¼¥É\fBsynchronized\fR¤Ë°Í¸¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¥³¥á¥ó¥È¤Î¼çÀâÌÀ¤È¤·¤Æ¥É¥­¥å¥á¥ó¥È²½¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¡Ö1¤Ä¤Îenumeration¤òÊ£¿ô¤Î¥¹¥ì¥Ã¥É¤«¤éʹԤ·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡×¤Î¤è¤¦¤Ëµ­½Ò¤·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤³¤ì¤é¤Î¥»¥Þ¥ó¥Æ¥£¥¯¥¹¤ò¼Â¸½¤¹¤ëÊýË¡¤òµ­½Ò¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fBHashtable\fR¥ª¥×¥·¥ç¥ó¤Ï¥¹¥ì¥Ã¥É¥»¡¼¥Õ¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¡Ö¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¤òƱ´ü²½¤·¤Æ¤½¤ì¤ò¼Â¸½¤¹¤ë¡×¤Î¤è¤¦¤Ë»ØÄꤹ¤ëº¬µò¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤è¤ê¹âÅÙ¤ÊʹÔÀ­¤Î¤¿¤á¤Ë¡¢¥Ð¥±¥Ã¥È¡¦¥ì¥Ù¥ë¤ÇÆâÉôŪ¤ËƱ´ü²½¤¹¤ë¸¢¸Â¤òÊÝÍ­¤·¤Æ¤ª¤¯¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++.SH "¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È" ++.PP ++¤³¤Î¥»¥¯¥·¥ç¥ó¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥³¥á¥ó¥È¤È¥³¥á¥ó¥È¤Î·Ñ¾µ¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£ ++.SS "¥½¡¼¥¹¡¦¥³¡¼¥É¡¦¥³¥á¥ó¥È" ++.PP ++¥½¡¼¥¹¡¦¥³¡¼¥É¤ÎǤ°Õ¤Î¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÎÀë¸À¤ÎÁ°¤Ë¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸¤Ë¤â¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¹½Ê¸¤Ï¼ã´³°Û¤Ê¤ê¤Þ¤¹¤¬¡¢³µÍפˤâ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢\fB/**\fR¤È¡¢½ª¤ï¤ê¤òɽ¤¹\fB*/\fR¤Î´Ö¤Ë¤¢¤ëʸ»ú¤«¤é¹½À®¤µ¤ì¤Þ¤¹¡£ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤Ï³Æ¹Ô¤Ç»ÈÍѤǤ­¡¢¼¡¤Î¹à¤Ç¾Ü¤·¤¯ÀâÌÀ¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public int y ++\fB/**\fR ++\fB * This is the typical format of a simple documentation comment\fR ++\fB * that spans two lines\&.\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP ++¥¹¥Ú¡¼¥¹¤òÀáÌ󤹤ë¤Ë¤Ï¡¢¥³¥á¥ó¥È¤ò1¹Ô¤ËÆþ¤ì¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/** This comment takes up only one line\&. */\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++¥³¥á¥ó¥È¤ÎÇÛÃÖ ++.PP ++¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥ÉÀë¸À¤ÎľÁ°¤ËÇÛÃÖ¤µ¤ì¤ë¾ì¹ç¤Ë¤Î¤ßǧ¼±¤µ¤ì¤Þ¤¹¡£¥á¥½¥Ã¥É¤ÎËÜÂΤËÃÖ¤«¤ì¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Àë¸Àʸ¤´¤È¤Ë1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤·¤«Ç§¼±¤·¤Þ¤»¤ó¡£¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++¤è¤¯¤¢¤ë´Ö°ã¤¤¤Ï¡¢¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤È¥¯¥é¥¹Àë¸À¤Î´Ö¤Ë\fBimport\fRʸ¤òÃÖ¤¤¤Æ¤·¤Þ¤¦¤³¤È¤Ç¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥¯¥é¥¹¡¦¥³¥á¥ó¥È¤ò̵»ë¤¹¤ë¤Î¤Ç¡¢\fBimport\fRʸ¤ò¤³¤Î¾ì½ê¤ËÇÛÃÖ¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * This is the class comment for the class Whatever\&.\fR ++\fB */\fR ++\fB \fR ++\fBimport com\&.example; // MISTAKE \- Important not to put import statement here\fR ++\fB \fR ++\fBpublic class Whatever{ }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++¥³¥á¥ó¥È¤Î¥Ñ¡¼¥Ä ++.PP ++¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢¼çÀâÌÀ¤È¤½¤Î¸å¤Ë³¤¯¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¼çÀâÌÀ¤Ï¡¢³«»Ï¶èÀÚ¤êʸ»ú\fB/**\fR¤Ç»Ï¤Þ¤ê¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Þ¤Ç³¤­¤Þ¤¹¡£¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Ï¡¢ÀèƬʸ»ú¤¬\fB@\fR¤Î¹Ô¤ÇÄêµÁ¤µ¤ì¤ëºÇ½é¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤«¤é»Ï¤Þ¤ê¤Þ¤¹(ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¡¢¶õÇòʸ»ú¡¢ÀèƬ¤Î¶èÀÚ¤êʸ»ú\fB/**\fR¤Ï½ü¤¯)¡£¼çÀâÌÀ¤òµ­½Ò¤»¤º¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Î¤ß¤Î¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¼çÀâÌÀ¤Ï¡¢¥¿¥°¡¦¥»¥¯¥·¥ç¥ó°Ê¹ß¤Ë³¤±¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¥¿¥°¤Î°ú¿ô¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥¿¥°¤Î¿ô¤ËÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£²¿²ó¤âµ­½Ò¤Ç¤­¤ë¥¿¥°¤È¡¢1²ó¤·¤«µ­½Ò¤Ç¤­¤Ê¤¤¥¿¥°¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î\fB@see\fR¥¿¥°¤«¤é¥¿¥°¡¦¥»¥¯¥·¥ç¥ó¤Ï»Ï¤Þ¤ê¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * This sentence holds the main description for this documentation comment\&.\fR ++\fB * @see java\&.lang\&.Object\fR ++\fB */\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++¥Ö¥í¥Ã¥¯¤ª¤è¤Ó¥¤¥ó¥é¥¤¥ó¡¦¥¿¥° ++.PP ++¥¿¥°¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬½èÍý¤¹¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ÎÆüì¤Ê¥­¡¼¥ï¡¼¥É¤Ç¤¹¡£¥¿¥°¤Ë¤Ï2¤Ä¤Î¥¿¥¤¥×¤¬¤¢¤ê¤Þ¤¹¡£1¤Ä¤Ï\fB@tag\fR¥¿¥°¤Î¤è¤¦¤Ëɽµ­¤µ¤ì¤ë¥Ö¥í¥Ã¥¯¡¦¥¿¥°(¥¹¥¿¥ó¥É¥¢¥í¥ó¡¦¥¿¥°¤È¤â¸Æ¤Ð¤ì¤ë)¡¢¤â¤¦1¤Ä¤Ï\fB{@tag}\fR¥¿¥°¤Î¤è¤¦¤ËÃ楫¥Ã¥³¤Ç°Ï¤ó¤Çɽµ­¤µ¤ì¤ë¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤Ç¤¹¡£¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤¬²ò¼á¤µ¤ì¤ë¤Ë¤Ï¡¢¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¡¢¶õÇòʸ»ú¡¢¶èÀÚ¤êʸ»ú(\fB/**\fR)¤ò½ü¤¤¤Æ¡¢¹Ô¤ÎÀèƬ¤ËÃÖ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fB@\fRʸ»ú¤ò¥Æ¥­¥¹¥ÈÆâ¤ÎÊ̤ξì½ê¤Ç»ÈÍѤ·¤Æ¤â¡¢¥¿¥°¤Î³«»Ï¤È¤·¤Æ²ò¼á¤µ¤ì¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£\fB@\fRʸ»ú¤ò»ÈÍѤ·¤Æ¹Ô¤ò³«»Ï¤·¤Æ¤â¡¢¤½¤ì¤¬²ò¼á¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¢HTML¥¨¥ó¥Æ¥£¥Æ¥£\fB@\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤½¤ì¤¾¤ì¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤Ë¤Ï¡¢´ØÏ¢ÉÕ¤±¤é¤ì¤¿¥Æ¥­¥¹¥È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ï¡¢¥¿¥°¤Î¸å¤«¤é¡¢¼¡¤Î¥¿¥°¤ÎÁ°¡¢¤Þ¤¿¤Ï¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ÎºÇ¸å¤Þ¤Ç¤Î´Ö¤Ëµ­½Ò¤µ¤ì¤¿¥Æ¥­¥¹¥È¤Ç¤¹(¥¿¥°¤Þ¤¿¤Ï¥³¥á¥ó¥È¶èÀÚ¤êʸ»ú¤ò½ü¤¯)¡£¤³¤Î´ØÏ¢¥Æ¥­¥¹¥È¤Ï¡¢Ê£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤Ï¡¢¥Æ¥­¥¹¥È¤òµ­½Ò¤Ç¤­¤ë¾ì½ê¤Ç¤¢¤ì¤Ð¤É¤³¤Ë¤Ç¤âÃÖ¤¯¤³¤È¤¬¤Ç¤­¡¢²ò¼á¤µ¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤Ë¤Ï¥Ö¥í¥Ã¥¯¡¦¥¿¥°\fB@deprecated\fR¤È¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°\fB{@link}\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£javadoc¥¿¥°¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * @deprecated As of JDK 1\&.1, replaced by {@link #setBounds(int,int,int,int)}\fR ++\fB */\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++HTML¤Ç¤Î¥³¥á¥ó¥È¤Îµ­½Ò ++.PP ++¥Æ¥­¥¹¥È¤ÏHTML¥¨¥ó¥Æ¥£¥Æ¥£¤ÈHTML¥¿¥°¤ò»ÈÍѤ·¤ÆHTML¤Çµ­½Ò¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ÈÍѤ¹¤ë¥Ö¥é¥¦¥¶¤¬¥µ¥Ý¡¼¥È¤¹¤ëǤ°Õ¤ÎHTML¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¥«¥¹¥±¡¼¥Ç¥£¥ó¥°¡¦¥¹¥¿¥¤¥ë¡¦¥·¡¼¥È¤ª¤è¤Ó¥Õ¥ì¡¼¥à¤ò´Þ¤á¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È°Ê³°¤ÎÉôʬ¤ÇHTML 3\&.2¤Ë½àµò¤·¤¿¥³¡¼¥É¤òÀ¸À®¤·¤Þ¤¹¡£¥Õ¥ì¡¼¥à¡¦¥»¥Ã¥È¤Î¤¿¤á¡¢À¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë¤ÏHTML 4\&.0¤¬¿ä¾©¤µ¤ì¤Þ¤¹¡£ ++.PP ++¤¿¤È¤¨¤Ð¡¢¤è¤ê¾®¤µ¤¤µ­¹æ(<)¤ª¤è¤Ó¤è¤êÂ礭¤¤µ­¹æ(>)¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢\fB<\fR¤ª¤è¤Ó\fB>\fR¤Èµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Æ±Íͤˡ¢¥¢¥ó¥Ñ¥µ¥ó¥É(&)¤Ï\fB&\fR¤Èµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢ÂÀ»ú¤ÎHTML¥¿¥°\fB<b>\fR¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * This is a <b>doc</b> comment\&.\fR ++\fB * @see java\&.lang\&.Object\fR ++\fB */\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++ÀèƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î²òÀÏ»þ¤Ë¡¢³Æ¹Ô¤ÎÀèƬ¤Ë¤¢¤ë¥¢¥¹¥¿¥ê¥¹¥¯(*)ʸ»ú¤ÏÇË´þ¤µ¤ì¤Þ¤¹¡£ºÇ½é¤Î¥¢¥¹¥¿¥ê¥¹¥¯(*)ʸ»ú¤è¤êÁ°¤Ë¤¢¤ë¶õÇò¤ä¥¿¥Ö¤âÇË´þ¤µ¤ì¤Þ¤¹¡£¹ÔƬ¤Î¥¢¥¹¥¿¥ê¥¹¥¯¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥¤¥ó¥Ç¥ó¥È¤òÊÝ»ý¤·¤¿¤Þ¤Þ¤Ç¥µ¥ó¥×¥ë¡¦¥³¡¼¥É¤ò\fB<PRE>\fR¥¿¥°Æâ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËľÀÜŽ¤êÉÕ¤±¤é¤ì¤ë¤è¤¦¤Ë¡¢ÀèƬ¤Î¶õÇòʸ»ú¤Ïºï½ü¤µ¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¥Ö¥é¥¦¥¶¤Ï¡¢¶õÇòʸ»ú¤ò¥¿¥Ö¤è¤ê¤â°ìΧ¤Ë²ò¼á¤·¤Þ¤¹¡£¥¤¥ó¥Ç¥ó¥È¤Îµ¯ÅÀ¤Ï(¶èÀÚ¤êʸ»ú\fB/**\fR¤Þ¤¿¤Ï\fB<PRE>\fR¥¿¥°¤Ç¤Ï¤Ê¤¯)º¸¥Þ¡¼¥¸¥ó¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.PP ++ºÇ½é¤Îʸ ++.PP ++³Æ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ÎºÇ½é¤Îʸ¤Ï¡¢Àë¸À¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Ë´Ø¤¹¤ë´Ê·é¤«¤Ä´°Á´¤Ê¥µ¥Þ¥ê¡¼Ê¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Îʸ¤Ï¡¢¶õÇò¡¢¥¿¥Ö¡¢¤Þ¤¿¤Ï¹Ô½ªÎ»Ê¸»ú¤¬Â³¤¯ºÇ½é¤Î¥Ô¥ê¥ª¥É¡¢¤Þ¤¿¤ÏºÇ½é¤Î¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤¬¤¢¤ë°ÌÃ֤ǽª¤ï¤ê¤Þ¤¹¡£ºÇ½é¤Îʸ¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆHTML¥Ú¡¼¥¸¤ÎÀèƬ¤Ë¤¢¤ë¥á¥ó¥Ð¡¼¤Î¥µ¥Þ¥ê¡¼¤ÎÉôʬ¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++.PP ++Ê£¿ô¥Õ¥£¡¼¥ë¥É¤ÎÀë¸À ++.PP ++Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï¡¢1¤Ä¤Îʸ¤ÇÊ£¿ô¤Î¥Õ¥£¡¼¥ë¥É¤òÀë¸À¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Îʸ¤Ë¤Ï¡¢1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤·¤«µ­½Ò¤Ç¤­¤Þ¤»¤ó¡£¤½¤Î¥³¥á¥ó¥È¤¬¡¢¤¹¤Ù¤Æ¤Î¥Õ¥£¡¼¥ë¥É¤ËÂФ·¤Æ¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¥Õ¥£¡¼¥ë¥É¤´¤È¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢³Æ¥Õ¥£¡¼¥ë¥É¤òÊÌ¡¹¤Îʸ¤ÇÀë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢1¤Ä¤ÎÀë¸À¤È¤·¤Æµ­½Ò¤¹¤ë¤ÈÉÔŬÀڤǤ¹¡£¤³¤Î¾ì¹ç¤Ï¡¢Àë¸À¤ò2¤Ä¤Ëʬ¤±¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/** \fR ++\fB * The horizontal and vertical distances of point (x,y)\fR ++\fB */\fR ++\fBpublic int x, y; // Avoid this \fR ++\fB \fR ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¾å¤Î¥³¡¼¥É¤«¤é¼¡¤Î¤è¤¦¤Ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic int x\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + The horizontal and vertical distances of point (x, y)\&. +-¥Ø¥Ã¥À¡¼¡¦¥¿¥°¤Î»ÈÍÑ.PP +-¥á¥ó¥Ð¡¼¤ËÂФ·¤Æ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤È¤­¤Ë¤Ï¡¢\fI<H1>\fR¤ä\fI<H2>\fR¤Ê¤É¤ÎHTML¸«½Ð¤·¥¿¥°¤ò»ÈÍѤ·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´°Á´¤Ê¹½Â¤²½¥É¥­¥å¥á¥ó¥È¤òºîÀ®¤¹¤ë¤Î¤Ç¡¢¤³¤Î¤è¤¦¤Ê¹½Â¤²½¥¿¥°¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤È¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Î·Á¼°¤¬°­±Æ¶Á¤ò¼õ¤±¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¥¯¥é¥¹¤ä¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥á¥ó¥È¤Ç¤Ï¡¢¤³¤ì¤é¤Î¸«½Ð¤·¤ò»ÈÍѤ·¤ÆÆȼ«¤Î¹½Â¤¤ò»ØÄꤷ¤Æ¤«¤Þ¤¤¤Þ¤»¤ó¡£ ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic int y\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The horizontal and vertical distances of point (x, y)\&. ++.PP ++¥Ø¥Ã¥À¡¼¡¦¥¿¥°¤Î»ÈÍÑ ++.PP ++¥á¥ó¥Ð¡¼¤ËÂФ·¤Æ¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤È¤­¤Ë¤Ï¡¢\fB<H1>\fR¤ª¤è¤Ó\fB<H2>\fR¤Ê¤É¤ÎHTML¸«½Ð¤·¥¿¥°¤ò»ÈÍѤ·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´°Á´¤Ê¹½Â¤²½¥É¥­¥å¥á¥ó¥È¤òºîÀ®¤¹¤ë¤Î¤Ç¡¢¤³¤Î¤è¤¦¤Ê¹½Â¤²½¥¿¥°¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤È¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Î·Á¼°¤¬°­±Æ¶Á¤ò¼õ¤±¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¥¯¥é¥¹¤ä¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥á¥ó¥È¤Ç¤Ï¡¢¤³¤ì¤é¤Î¸«½Ð¤·¤ò»ÈÍѤ·¤ÆÆȼ«¤Î¹½Â¤¤ò»ØÄꤷ¤Æ¤«¤Þ¤¤¤Þ¤»¤ó¡£ + .SS "¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤·¤Æ¡¢·çÍ¤¿¥Æ¥­¥¹¥È¤òÆþÎϤ·¤¿¤ê¡¢ÌÀ¼¨Åª¤Ë¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥Õ¥£¡¼¥ë¥É¡¢¤ª¤è¤Ó¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤·¤Þ¤»¤ó¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤·¤Æ¡¢·çÍ¤¿¥Æ¥­¥¹¥È¤òÆþÎϤ·¤¿¤ê¡¢ÌÀ¼¨Åª¤Ë¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥Õ¥£¡¼¥ë¥É¡¢¤ª¤è¤Ó¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò·Ñ¾µ¤·¤Þ¤»¤ó¡£ + .PP + \fBÃí°Õ:\fR +-¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò¥³¥Ô¡¼¤ËÍøÍѤ¹¤ë¤Ë¤Ï¡¢·Ñ¾µ¤·¤¿¥á¥½¥Ã¥É¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿¥Ñ¥¹¤Î¤ß¤ËÃÖ¤«¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¡¢¥¯¥é¥¹¤â¥Ñ¥Ã¥±¡¼¥¸¤âÅϤ¹É¬ÍפϤ¢¤ê¤Þ¤»¤ó¡£¤³¤ÎÅÀ¤Ï¥ê¥ê¡¼¥¹1\&.3\&.\fIn\fR°ÊÁ°¤È¤ÏÂоÈŪ¤Ç¤¹¡£¤³¤ì¤Þ¤Ç¤Ï¡¢¥¯¥é¥¹¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Ç¤¢¤ë¤³¤È¤¬É¬ÍפǤ·¤¿¡£ +-·çÍî¥Æ¥­¥¹¥È¤ÎÆþÎÏ.PP +-¼çÀâÌÀ¡¢¤Þ¤¿¤Ï\fI@return\fR¡¢\fI@param\fR¡¢\fI@throws\fR¥¿¥°¤¬¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤«¤é·çÍ¤Æ¤¤¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Âбþ¤¹¤ë¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¡¦¥³¥á¥ó¥È¤ò¡¢¤½¤ì¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Þ¤¿¤Ï¼ÂÁõ¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É(¤¢¤ë¾ì¹ç)¤«¤é¥³¥Ô¡¼¤·¤Þ¤¹¡£¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.PP +-ÆÃÄê¤Î¥Ñ¥é¥á¡¼¥¿¤Î\fI@param\fR¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¤½¤Î¥Ñ¥é¥á¡¼¥¿¤Î¥³¥á¥ó¥È¤¬¡¢¾å°Ì¤Î·Ñ¾µ³¬ÁؤΥ᥽¥Ã¥É¤«¤é¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ÆÃÄê¤ÎÎã³°¤Î\fI@throws\fR¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¤½¤ÎÎã³°¤¬Àë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤«¤®¤ê¡¢\fI@throws\fR¥¿¥°¤¬¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò¥³¥Ô¡¼¤ËÍøÍѤ¹¤ë¤Ë¤Ï¡¢·Ñ¾µ¤·¤¿¥á¥½¥Ã¥É¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿¥Ñ¥¹¤Î¤ß¤ËÃÖ¤«¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¡¢¥¯¥é¥¹¤â¥Ñ¥Ã¥±¡¼¥¸¤âÅϤ¹É¬ÍפϤ¢¤ê¤Þ¤»¤ó¡£¤³¤ÎÅÀ¤Ï¥ê¥ê¡¼¥¹1\&.3\&.\fIn\fR°ÊÁ°¤È¤ÏÂоÈŪ¤Ç¤¹¡£¤³¤ì¤Þ¤Ç¤Ï¡¢¥¯¥é¥¹¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Ç¤¢¤ë¤³¤È¤¬É¬ÍפǤ·¤¿¡£ ++.PP ++·çÍî¥Æ¥­¥¹¥È¤ÎÆþÎÏ ++.PP ++¼çÀâÌÀ¡¢¤Þ¤¿¤Ï\fB@return\fR¡¢\fB@param\fR¡¢\fB@throws\fR¥¿¥°¤¬¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤«¤é·çÍ¤Æ¤¤¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Âбþ¤¹¤ë¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¡¦¥³¥á¥ó¥È¤ò¡¢¤½¤ì¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Þ¤¿¤Ï¼ÂÁõ¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É(¤¢¤ë¾ì¹ç)¤«¤é¥³¥Ô¡¼¤·¤Þ¤¹¡£¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.PP ++ÆÃÄê¤Î¥Ñ¥é¥á¡¼¥¿¤Î\fB@param\fR¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¤½¤Î¥Ñ¥é¥á¡¼¥¿¤Î¥³¥á¥ó¥È¤¬¡¢¾å°Ì¤Î·Ñ¾µ³¬ÁؤΥ᥽¥Ã¥É¤«¤é¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ÆÃÄê¤ÎÎã³°¤Î\fB@throws\fR¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¤½¤ÎÎã³°¤¬Àë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤«¤®¤ê¡¢\fB@throws\fR¥¿¥°¤¬¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .PP + ¤³¤ÎÆ°ºî¤Ï¥ê¥ê¡¼¥¹1\&.3°ÊÁ°¤ÎÆ°ºî¤È¤ÏÂоÈŪ¤Ç¤¹¡£¤³¤ì¤Þ¤Ç¤Î¥Ð¡¼¥¸¥ç¥ó¤Ç¤Ï¡¢¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¤¬Â¸ºß¤¹¤ì¤Ð¡¢¥³¥á¥ó¥È¤Ï°ìÀڷѾµ¤µ¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£ + .PP + javadoc¥¿¥°¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-ÌÀ¼¨Åª¤Ê·Ñ¾µ.PP +-\fI{@inheritDoc}\fR¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò¥á¥½¥Ã¥É¤Î¼çÀâÌÀ¤Þ¤¿¤Ï\fI@return\fR¡¢\fI@param\fR¡¢\fI@throws\fR¥¿¥°¡¦¥³¥á¥ó¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£Âбþ¤¹¤ë·Ñ¾µ¤µ¤ì¤¿¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¡¦¥³¥á¥ó¥È¤Ï¡¢¤½¤Î¾ì½ê¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++.PP ++ÌÀ¼¨Åª¤Ê·Ñ¾µ ++.PP ++\fB{@inheritDoc}\fR¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò¥á¥½¥Ã¥É¤Î¼çÀâÌÀ¤Þ¤¿¤Ï\fB@return\fR¡¢\fB@param\fR¡¢\fB@throws\fR¥¿¥°¡¦¥³¥á¥ó¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£Âбþ¤¹¤ë·Ñ¾µ¤µ¤ì¤¿¼çÀâÌÀ¤Þ¤¿¤Ï¥¿¥°¡¦¥³¥á¥ó¥È¤Ï¡¢¤½¤Î¾ì½ê¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .SS "¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î·Ñ¾µ" + .PP + ¥³¥á¥ó¥È¤Î·Ñ¾µ¤Ï¡¢¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é¤Î·Ñ¾µ¤Î¡¢¹Í¤¨¤é¤ì¤ë¤¹¤Ù¤Æ¤Î¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£ +@@ -1271,12 +1321,12 @@ + ¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¾ì¹ç + .RE + .PP +-ºÇ½é¤Î2¤Ä¤Î¥±¡¼¥¹¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥ÈÆâ¤Ë\fI¡Ö¥ª¡¼¥Ð¡¼¥é¥¤¥É¡×\fR¤È¤¤¤¦¾®¸«½Ð¤·¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤¬·Ñ¾µ¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ +-.PP +-3¤ÄÌܤΥ±¡¼¥¹(ÆÃÄê¤Î¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¾ì¹ç)¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥ÈÆâ¤Ë\fI¡ÖÄêµÁ¡×\fR¤È¤¤¤¦¾®¸«½Ð¤·¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤¬·Ñ¾µ¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++ºÇ½é¤Î2¤Ä¤Î¥±¡¼¥¹¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥ÈÆâ¤Ë\fI¡Ö¥ª¡¼¥Ð¡¼¥é¥¤¥É¡×\fR¤È¤¤¤¦¾®¸«½Ð¤·¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤¬·Ñ¾µ¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++.PP ++3¤ÄÌܤΥ±¡¼¥¹(ÆÃÄê¤Î¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤¬¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¾ì¹ç)¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥ÈÆâ¤Ë\fI¡ÖÄêµÁ¡×\fR¤È¤¤¤¦¾®¸«½Ð¤·¤òÀ¸À®¤·¤Þ¤¹¡£¥³¥á¥ó¥È¤¬·Ñ¾µ¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤º¡¢¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .SS "¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î¥¢¥ë¥´¥ê¥º¥à" + .PP +-¥á¥½¥Ã¥É¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬¤Ê¤¤¡¢¤Þ¤¿¤Ï\fI{@inheritDoc}\fR¥¿¥°¤¬¤¢¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆŬÍѤǤ­¤ë¥³¥á¥ó¥È¤ò¸¡º÷¤·¤Þ¤¹¡£¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢ºÇ¤âÆÃÄꤵ¤ì¤ëŬÍѲÄǽ¤Ê¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òõ¤·¡¢¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤è¤ê¤â¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÍ¥À褹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¥á¥½¥Ã¥É¤Ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬¤Ê¤¤¡¢¤Þ¤¿¤Ï\fB{@inheritDoc}\fR¥¿¥°¤¬¤¢¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¼¡¤Î¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤ÆŬÍѤǤ­¤ë¥³¥á¥ó¥È¤ò¸¡º÷¤·¤Þ¤¹¡£¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢ºÇ¤âÆÃÄꤵ¤ì¤ëŬÍѲÄǽ¤Ê¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òõ¤·¡¢¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤è¤ê¤â¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÍ¥À褹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1286,7 +1336,7 @@ + .sp -1 + .IP " 1." 4.2 + .\} +-ľÀܤ˼ÂÁõ¤µ¤ì¤Æ¤¤¤ë(¤Þ¤¿¤Ï¡¢³ÈÄ¥¤µ¤ì¤Æ¤¤¤ë)¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¡¢¥á¥½¥Ã¥É¤ÎÀë¸À¤Ç\fIimplements\fR(¤Þ¤¿¤Ï\fIextends\fR)¤È¤¤¤¦¸ì¤Î¸å¤Ë½Ð¸½¤¹¤ë½ç½ø¤Ç¡¢1¤Ä¤º¤ÄÄ´¤Ù¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ë¤Ä¤¤¤ÆºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºÎÍѤ·¤Þ¤¹¡£ ++ľÀܤ˼ÂÁõ¤µ¤ì¤Æ¤¤¤ë(¤Þ¤¿¤Ï¡¢³ÈÄ¥¤µ¤ì¤Æ¤¤¤ë)¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¡¢¥á¥½¥Ã¥É¤ÎÀë¸À¤Ç\fBimplements\fR(¤Þ¤¿¤Ï\fBextends\fR)¤È¤¤¤¦¸ì¤Î¸å¤Ë½Ð¸½¤¹¤ë½ç½ø¤Ç¡¢1¤Ä¤º¤ÄÄ´¤Ù¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤Ë¤Ä¤¤¤ÆºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òºÎÍѤ·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -1308,7 +1358,7 @@ + .sp -1 + .IP " 3." 4.2 + .\} +-¼ê½ç2¤Ç¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ç¡¢¤³¤Î¥¯¥é¥¹¤¬\fIObject\fR°Ê³°¤Î¥¯¥é¥¹¤Ç¤¢¤ë¤¬¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë½èÍý¤·¤Þ¤¹¡£ ++¼ê½ç2¤Ç¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¾ì¹ç¤Ç¡¢¤³¤Î¥¯¥é¥¹¤¬\fBObject\fR°Ê³°¤Î¥¯¥é¥¹¤Ç¤¢¤ë¤¬¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë½èÍý¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1334,7 +1384,7 @@ + .RE + .SH "JAVADOC¥¿¥°" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ËËä¤á¹þ¤Þ¤ì¤¿ÆÃÊ̤ʥ¿¥°¤ò²òÀϤ·¤Þ¤¹¡£\fIjavadoc\fR¥¿¥°¤ò»ÈÍѤ¹¤ë¤È¡¢´°Á´¤ÊÀ°·Á¼°¤ÎAPI¤ò¥½¡¼¥¹¡¦¥³¡¼¥É¤«¤é¼«Æ°Åª¤ËÀ¸À®¤Ç¤­¤Þ¤¹¡£¥¿¥°¤Ï¥¢¥Ã¥È¥Þ¡¼¥¯µ­¹æ(\fI@\fR)¤Ç»Ï¤Þ¤ê¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢É½¼¨¤µ¤ì¤Æ¤¤¤ë¤È¤ª¤ê¤ËÂçʸ»ú¤È¾®Ê¸»ú¤ò»ÈÍѤ·¤ÆÆþÎϤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¿¥°¤Ï¡¢¹Ô¤ÎÀèƬ(ÀèƬ¤Î¶õÇòʸ»ú¤È¾Êά²Äǽ¤Ê¥¢¥¹¥¿¥ê¥¹¥¯¤Î¸å)¤ËÃÖ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤·¤Ê¤¤¤È¡¢¥Æ¥­¥¹¥È¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£´·Îã¤È¤·¤Æ¡¢Æ±¤¸Ì¾Á°¤Î¥¿¥°¤Ï1²Õ½ê¤Ë¤Þ¤È¤á¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@see\fR¥¿¥°¤¬Ê£¿ô¤¢¤ë¾ì¹ç¤Ï¡¢¤¹¤Ù¤ÆƱ¤¸¾ì½ê¤Ë¤Þ¤È¤á¤ÆÇÛÃÖ¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ËËä¤á¹þ¤Þ¤ì¤¿ÆÃÊ̤ʥ¿¥°¤ò²òÀϤ·¤Þ¤¹¡£\fBjavadoc\fR¥¿¥°¤ò»ÈÍѤ¹¤ë¤È¡¢´°Á´¤ÊÀ°·Á¼°¤ÎAPI¤ò¥½¡¼¥¹¡¦¥³¡¼¥É¤«¤é¼«Æ°Åª¤ËÀ¸À®¤Ç¤­¤Þ¤¹¡£¥¿¥°¤Ï¥¢¥Ã¥È¥Þ¡¼¥¯µ­¹æ(\fB@\fR)¤Ç»Ï¤Þ¤ê¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢É½¼¨¤µ¤ì¤Æ¤¤¤ë¤È¤ª¤ê¤ËÂçʸ»ú¤È¾®Ê¸»ú¤ò»ÈÍѤ·¤ÆÆþÎϤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¿¥°¤Ï¡¢¹Ô¤ÎÀèƬ(ÀèƬ¤Î¶õÇòʸ»ú¤È¾Êά²Äǽ¤Ê¥¢¥¹¥¿¥ê¥¹¥¯¤Î¸å)¤ËÃÖ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤·¤Ê¤¤¤È¡¢¥Æ¥­¥¹¥È¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£´·Îã¤È¤·¤Æ¡¢Æ±¤¸Ì¾Á°¤Î¥¿¥°¤Ï1²Õ½ê¤Ë¤Þ¤È¤á¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@see\fR¥¿¥°¤¬Ê£¿ô¤¢¤ë¾ì¹ç¤Ï¡¢¤¹¤Ù¤ÆƱ¤¸¾ì½ê¤Ë¤Þ¤È¤á¤ÆÇÛÃÖ¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP + ¥¿¥°¤Ë¤Ï¡¢¼¡¤Î¥¿¥¤¥×¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +@@ -1367,7 +1417,7 @@ + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-\fI\-author\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢»ØÄꤷ¤¿Ì¾Á°¤Î¥Æ¥­¥¹¥È¤ÎºîÀ®¼Ô¥¨¥ó¥È¥ê¤òÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤ËÄɲä·¤Þ¤¹¡£1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËÊ£¿ô¤Î\fI@author\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£1¤Ä¤Î\fI@author\fR¥¿¥°¤Ë1¤Ä¤Î̾Á°¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ê£¿ô¤Î̾Á°¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Á°¼Ô¤Î¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ̾Á°¤È̾Á°¤Î´Ö¤Ë¥«¥ó¥Þ(,)¤È¶õÇòʸ»ú¤¬ÁÞÆþ¤µ¤ì¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¤Ï¡¢¥Æ¥­¥¹¥ÈÁ´ÂΤ¬²òÀϤµ¤ì¤ë¤³¤È¤Ê¤¯¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥«¥ó¥Þ¤Ç¤Ï¤Ê¤¯¡¢³Æ¸À¸ì¤ËÂбþ¤·¤¿Ì¾Á°¶èÀÚ¤êʸ»ú¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¤È¤­¤Ë¡¢1¹Ô¤ËÊ£¿ô¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@author¤Ë´Ø¤¹¤ë¹à ++\fB\-author\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢»ØÄꤷ¤¿Ì¾Á°¤Î¥Æ¥­¥¹¥È¤ÎºîÀ®¼Ô¥¨¥ó¥È¥ê¤òÀ¸À®¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥È¤ËÄɲä·¤Þ¤¹¡£1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËÊ£¿ô¤Î\fB@author\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£1¤Ä¤Î\fB@author\fR¥¿¥°¤Ë1¤Ä¤Î̾Á°¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ê£¿ô¤Î̾Á°¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Á°¼Ô¤Î¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ̾Á°¤È̾Á°¤Î´Ö¤Ë¥«¥ó¥Þ(,)¤È¶õÇòʸ»ú¤¬ÁÞÆþ¤µ¤ì¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¤Ï¡¢¥Æ¥­¥¹¥ÈÁ´ÂΤ¬²òÀϤµ¤ì¤ë¤³¤È¤Ê¤¯¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥«¥ó¥Þ¤Ç¤Ï¤Ê¤¯¡¢³Æ¸À¸ì¤ËÂбþ¤·¤¿Ì¾Á°¶èÀÚ¤êʸ»ú¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¤È¤­¤Ë¡¢1¹Ô¤ËÊ£¿ô¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@author¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@author)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +@@ -1375,18 +1425,18 @@ + .RS 4 + JDK 1\&.5¤ÇƳÆþ + .sp +-\fI<code>{@literal}</code>\fR¤ÈƱÅù¤Ç¤¹¡£ +-.sp +-¥Æ¥­¥¹¥È¤òHTML¥Þ¡¼¥¯¥¢¥Ã¥×¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿Javadoc¥¿¥°¤È¤·¤Æ²ò¼á¤»¤º¤Ë¡¢text¤ò¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Çɽ¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤Î·¿(\fI<Object>\fR)¡¢ÉÔÅù¹æ(\fI3 < 4\fR)¡¢Ìð°õ(\fI<\-\fR)¤Ê¤É¤Ç¡¢Ä̾ï¤Î»³¥«¥Ã¥³(<¤ª¤è¤Ó>)¤òHTML¥¨¥ó¥Æ¥£¥Æ¥£(\fI<\fR¤ª¤è¤Ó\fI>\fR)¤Î¤«¤ï¤ê¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È\fI{@code A<B>C}\fR¤Ï\fIA<B>C\fR¤È¤·¤ÆÊѹ¹¤µ¤ì¤º¤ËÀ¸À®¤µ¤ì¤¿HTML¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢\fI<B>\fR¤¬ÂÀ»ú¤È¤·¤Æ²ò¼á¤µ¤ì¤º¡¢¤½¤Î¥Õ¥©¥ó¥È¤Ï¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ë¤Ê¤ê¤Þ¤¹¡£¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ê¤·¤ÇƱ¤¸µ¡Ç½¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¢\fI{@literal}\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fB<code>{@literal}</code>\fR¤ÈƱÅù¤Ç¤¹¡£ ++.sp ++¥Æ¥­¥¹¥È¤òHTML¥Þ¡¼¥¯¥¢¥Ã¥×¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿Javadoc¥¿¥°¤È¤·¤Æ²ò¼á¤»¤º¤Ë¡¢text¤ò¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Çɽ¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤Î·¿(\fB<Object>\fR)¡¢ÉÔÅù¹æ(\fB3 < 4\fR)¡¢Ìð°õ(\fB<\-\fR)¤Ê¤É¤Ç¡¢Ä̾ï¤Î»³¥«¥Ã¥³(<¤ª¤è¤Ó>)¤òHTML¥¨¥ó¥Æ¥£¥Æ¥£(\fB<\fR¤ª¤è¤Ó\fB>\fR)¤Î¤«¤ï¤ê¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢À¸À®¤µ¤ì¤¿HTML¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¦¥Æ¥­¥¹¥È\fB{@code A<B>C}\fR¤Ï¡¢Êѹ¹¤µ¤ì¤º\fBA<B>C\fR¤È¤Ê¤ê¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢\fB<B>\fR¤¬ÂÀ»ú¤È¤·¤Æ²ò¼á¤µ¤ì¤º¡¢¤½¤Î¥Õ¥©¥ó¥È¤Ï¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ë¤Ê¤ê¤Þ¤¹¡£¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ê¤·¤ÇƱ¤¸µ¡Ç½¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¢\fB{@literal}\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + @deprecated \fIdeprecated\-text\fR + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-¤³¤ÎAPI¤ÏÆ°ºî¤·Â³¤±¤Þ¤¹¤¬¡¢¤³¤ÎAPI¤ò»ÈÍѤ·¤Ê¤¤¤³¤È¤òÁ¦¤á¤ë¥³¥á¥ó¥È¤òÄɲä·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIdeprecated\-text\fR¤ò¼çÀâÌÀ¤ÎÁ°¤Ë°ÜÆ°¤·¤Æ¥¤¥¿¥ê¥Ã¥¯¤Ë¤·¡¢¤½¤ÎÁ°¤ËÂÀ»ú¤Î·Ù¹ð¡Ö¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¡×¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£ +-.sp +-Èó¿ä¾©¥Æ¥­¥¹¥È¤ÎºÇ½é¤Îʸ¤Ç¤Ï¡¢¤½¤ÎAPI¤¬¿ä¾©¤µ¤ì¤Ê¤¯¤Ê¤Ã¤¿»þ´ü¤È¡¢ÂåÂؤȤ·¤Æ»ÈÍѤ¹¤ëAPI¤ò¥æ¡¼¥¶¡¼¤ËÄ󼨤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤³¤ÎºÇ½é¤Îʸ¤ò¡¢¥µ¥Þ¥ê¡¼¡¦¥»¥¯¥·¥ç¥ó¤Èº÷°ú¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¤½¤Î¸å¤Îʸ¤ÇÈó¿ä¾©¤Ë¤Ê¤Ã¤¿Íýͳ¤òÀâÌÀ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ÂåÂØAPI¤ò»Ø¤·¼¨¤¹\fI{@link}\fR¥¿¥°(Javadoc 1\&.2°Ê¹ß¤Î¾ì¹ç)¤ò´Þ¤á¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¤³¤ÎAPI¤ÏÆ°ºî¤·Â³¤±¤Þ¤¹¤¬¡¢¤³¤ÎAPI¤ò»ÈÍѤ·¤Ê¤¤¤³¤È¤òÁ¦¤á¤ë¥³¥á¥ó¥È¤òÄɲä·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBdeprecated\-text\fR¤ò¼çÀâÌÀ¤ÎÁ°¤Ë°ÜÆ°¤·¤Æ¥¤¥¿¥ê¥Ã¥¯¤Ë¤·¡¢¤½¤ÎÁ°¤ËÂÀ»ú¤Î·Ù¹ð¡Ö¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¡×¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£ ++.sp ++Èó¿ä¾©¥Æ¥­¥¹¥È¤ÎºÇ½é¤Îʸ¤Ç¤Ï¡¢¤½¤ÎAPI¤¬¿ä¾©¤µ¤ì¤Ê¤¯¤Ê¤Ã¤¿»þ´ü¤È¡¢ÂåÂؤȤ·¤Æ»ÈÍѤ¹¤ëAPI¤ò¥æ¡¼¥¶¡¼¤ËÄ󼨤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤³¤ÎºÇ½é¤Îʸ¤ò¡¢¥µ¥Þ¥ê¡¼¡¦¥»¥¯¥·¥ç¥ó¤Èº÷°ú¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¤½¤Î¸å¤Îʸ¤ÇÈó¿ä¾©¤Ë¤Ê¤Ã¤¿Íýͳ¤òÀâÌÀ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ÂåÂØAPI¤ò»Ø¤·¼¨¤¹\fB{@link}\fR¥¿¥°(Javadoc 1\&.2°Ê¹ß¤Î¾ì¹ç)¤ò´Þ¤á¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + \fI@deprecated annotation\fR¥¿¥°¤ò»ÈÍѤ·¤Æ¥×¥í¥°¥é¥àÍ×ÁǤòÈó¿ä¾©¤Ë¤·¤Þ¤¹¡£API¤òÈó¿ä¾©¤Ë¤¹¤ëÊýË¡¤È»þ´ü + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/deprecation/deprecation\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +@@ -1402,7 +1452,7 @@ + .sp + À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤«¤é¤Î¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Î(À¸À®Àè)¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤ÎÁêÂХѥ¹¤òɽ¤·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢Ãøºî¸¢¤Î¥Ú¡¼¥¸¤ä²ñ¼Ò¤Î¥í¥´¤Ê¤É¡¢À¸À®¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤«¤é»²¾È¤¹¤ë¥Õ¥¡¥¤¥ë¤òÁȤ߹þ¤à¤È¤­¤ËÊØÍø¤Ç¤¹¡£Ä̾ï¤Ï¡¢³Æ¥Ú¡¼¥¸¤ÎºÇ²¼Éô¤«¤éÃøºî¸¢¤Î¥Ú¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£ + .sp +-¤³¤Î\fI{@docRoot}\fR¥¿¥°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¤â¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤â»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢Ç¤°Õ¤Î¥¿¥°(\fI@return\fR¡¢\fI@param\fR¤ª¤è¤Ó\fI@deprecated\fR¥¿¥°¤Ê¤É)¤Î¥Æ¥­¥¹¥ÈÉôʬ¤ò´Þ¤à¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£ ++¤³¤Î\fB{@docRoot}\fR¥¿¥°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç¤â¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤â»ÈÍѤǤ­¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢Ç¤°Õ¤Î¥¿¥°(\fB@return\fR¡¢\fB@param\fR¤ª¤è¤Ó\fB@deprecated\fR¥¿¥°¤Ê¤É)¤Î¥Æ¥­¥¹¥ÈÉôʬ¤ò´Þ¤à¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1412,9 +1462,9 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¡¢¥Ø¥Ã¥À¡¼¡¢¥Õ¥Ã¥¿¡¼¤Þ¤¿¤ÏºÇ²¼Éô¤¬¼¡¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£\fIjavadoc \-bottom \*(Aq<a href="{@docRoot}/copyright\&.html">Copyright</a>\*(Aq\fR +-.sp +-\fI{@docRoot}\fR¥¿¥°¤òmakefileÆâ¤Ç¤³¤Î¤è¤¦¤ËÍøÍѤ¹¤ë¾ì¹ç¡¢°ìÉô¤Î\fImakefile\fR¥×¥í¥°¥é¥à¤Ç¤Ï¡¢Ã楫¥Ã¥³\fI{}\fRʸ»ú¤òÆÃÊ̤˥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢Inprise MAKE¥Ð¡¼¥¸¥ç¥ó5\&.2¤òWindows¾å¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç¤Ï¡¢\fI{{@docRoot}}\fR¤Î¤è¤¦¤Ë¡¢Ã楫¥Ã¥³¤òÆó½Å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤Ê¤É¤Î¥ª¥×¥·¥ç¥ó¤Ø¤Î°ú¿ô¤ò°Ï¤à¤Î¤Ë¡¢Æó½Å(°ì½Å¤Ç¤Ï¤Ê¤¯)°úÍÑÉä¤âɬÍפǤ¹(\fIhref\fR°ú¿ô¤ò°Ï¤à°úÍÑÉä¤Ï¾Êά)¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç¡¢header¡¢footer¤Þ¤¿¤Ïbottom¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBjavadoc \-bottom \*(Aq<a href="{@docRoot}/copyright\&.html">Copyright</a>\*(Aq\fR¤È¤Ê¤ê¤Þ¤¹¡£ ++.sp ++\fB{@docRoot}\fR¥¿¥°¤òmakefileÆâ¤Ç¤³¤Î¤è¤¦¤ËÍøÍѤ¹¤ë¾ì¹ç¡¢°ìÉô¤Î\fBmakefile\fR¥×¥í¥°¥é¥à¤Ç¤Ï¡¢Ã楫¥Ã¥³\fB{}\fRʸ»ú¤òÆÃÊ̤˥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢Inprise MAKE¥Ð¡¼¥¸¥ç¥ó5\&.2¤òWindows¾å¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç¤Ï¡¢\fB{{@docRoot}}\fR¤Î¤è¤¦¤Ë¡¢Ã楫¥Ã¥³¤òÆó½Å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤Ê¤É¤Î¥ª¥×¥·¥ç¥ó¤Ø¤Î°ú¿ô¤ò°Ï¤à¤Î¤Ë¡¢Æó½Å(°ì½Å¤Ç¤Ï¤Ê¤¯)°úÍÑÉä¤âɬÍפǤ¹(\fBhref\fR°ú¿ô¤ò°Ï¤à°úÍÑÉä¤Ï¾Êά)¡£ + .RE + .sp + .RS 4 +@@ -1431,14 +1481,16 @@ + .RS 4 + .\} + .nf +-/** +- * See the <a href="{@docRoot}/copyright\&.html">Copyright</a>\&. +- */ ++\fB/**\fR ++\fB * See the <a href="{@docRoot}/copyright\&.html">Copyright</a>\&.\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥¿¥°¤¬É¬ÍפÊÍýͳ¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤¬¡¢¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä³¬Áع½Â¤¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£¼°\fI<a href="{@docRoot}/copyright\&.html">\fR¤Ï¡¢\fIjava/lang/Object\&.java\fR¤ËÂФ·¤Æ¤Ï\fI<a href="\&.\&./\&.\&./copyright\&.html">\fR¤Ë²ò·è¤µ¤ì¡¢\fIjava/lang/ref/Reference\&.java\fR¤ËÂФ·¤Æ¤Ï\fI<a href="\&.\&./\&.\&./\&.\&./copyright\&.html">\fR¤Ë²ò·è¤µ¤ì¤Þ¤¹¡£ ++¤³¤Î¥¿¥°¤¬É¬ÍפÊÍýͳ¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤¬¡¢¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ÈƱ¤¸¿¼¤µ¤ò»ý¤Ä³¬Áع½Â¤¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë³ÊǼ¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£¼°: ++\fB<a href="{@docRoot}/copyright\&.html">\fR¤Ï¡¢\fBjava/lang/Object\&.java\fR¤Î¾ì¹ç\fB<a href="\&.\&./\&.\&./copyright\&.html">\fR¤Ë¡¢\fBjava/lang/ref/Reference\&.java\fR¤Î¾ì¹ç\fB<a href="\&.\&./\&.\&./\&.\&./copyright\&.html">\fR¤Ë²ò·è¤µ¤ì¤Þ¤¹¡£ + .RE + .RE + .PP +@@ -1446,7 +1498,7 @@ + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-\fI@throws\fR¥¿¥°¤ÈƱ¤¸¤Ç¤¹¡£@throws class\-name description¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB@throws\fR¥¿¥°¤ÈƱ¤¸¤Ç¤¹¡£@throws class\-name description¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + {@inheritDoc} +@@ -1476,7 +1528,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥á¥½¥Ã¥É¤Î\fI@return\fR¡¢\fI@param\fR¡¢\fI@throws\fR¥¿¥°¤Î¥Æ¥­¥¹¥È°ú¿ôÆâ¡£¤³¤Î¾ì¹ç¡¢¥¿¥°¡¦¥Æ¥­¥¹¥È¤Ï¡¢¾å°Ì³¬ÁؤÎÂбþ¤¹¤ë¥¿¥°¤«¤é¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++¥á¥½¥Ã¥É¤Î\fB@return\fR¡¢\fB@param\fR¡¢\fB@throws\fR¥¿¥°¤Î¥Æ¥­¥¹¥È°ú¿ôÆâ¡£¤³¤Î¾ì¹ç¡¢¥¿¥°¡¦¥Æ¥­¥¹¥È¤Ï¡¢¾å°Ì³¬ÁؤÎÂбþ¤¹¤ë¥¿¥°¤«¤é¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + ·Ñ¾µ³¬Áؤǥ³¥á¥ó¥È¤ò¸«¤Ä¤±¤ëÊýË¡¤Ë´Ø¤¹¤ëÀâÌÀ¤Ï¡¢¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤Î·Ñ¾µ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î¥¿¥°¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢¥³¥á¥ó¥È¤Ï¡¢¤³¤Î¹à¤ÇÀâÌÀ¤¹¤ë¥ë¡¼¥ë¤Ë±þ¤¸¤Æ¡¢¼«Æ°Åª¤Ë·Ñ¾µ¤µ¤ì¤ë¤«¤É¤¦¤«¤¬·è¤Þ¤ê¤Þ¤¹¡£ +@@ -1486,20 +1538,21 @@ + .RS 4 + JDK 1\&.2¤ÇƳÆþ + .sp +-ɽ¼¨¥Æ¥­¥¹¥Èlabel¤È¤È¤â¤Ë¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤òÁÞÆþ¤·¤Þ¤¹¡£label¤Ï¡¢»²¾È¥¯¥é¥¹¤Î»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î̾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»Ø¤·¼¨¤·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢\fI@return\fR¡¢\fI@param\fR¤ª¤è¤Ó\fI@deprecated\fR¥¿¥°¤Ê¤É¤ÎǤ°Õ¤Î¥¿¥°¤Î¥Æ¥­¥¹¥ÈÉôʬ¤ò´Þ¤à¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@link¤Ë´Ø¤¹¤ë¹à ++ɽ¼¨¥Æ¥­¥¹¥Èlabel¤È¤È¤â¤Ë¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤òÁÞÆþ¤·¤Þ¤¹¡£label¤Ï¡¢»²¾È¥¯¥é¥¹¤Î»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î̾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»Ø¤·¼¨¤·¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢\fB@return\fR¡¢\fB@param\fR¤ª¤è¤Ó\fB@deprecated\fR¥¿¥°¤Ê¤É¤ÎǤ°Õ¤Î¥¿¥°¤Î¥Æ¥­¥¹¥ÈÉôʬ¤ò´Þ¤à¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@link¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#{@link)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¤³¤Î¥¿¥°¤Ï\fI@see\fR¥¿¥°¤Ë»÷¤Æ¤¤¤Þ¤¹¡£¤É¤Á¤é¤Î¥¿¥°¤â¡¢\fIpackage\&.class#member\fR¤È\fIlabel\fR¤Î»²¾ÈÊýË¡¤È¡¢Í­¸ú¤Ê¹½Ê¸¤¬Æ±¤¸¤Ç¤¹¡£¼ç¤Ê°ã¤¤¤Ï¡¢\fI{@link}\fR¥¿¥°¤Ç¤Ï¡¢¡Ö´ØÏ¢¹àÌܡץ»¥¯¥·¥ç¥ó¤Ë¥ê¥ó¥¯¤¬ÇÛÃÖ¤µ¤ì¤ë¤«¤ï¤ê¤Ë¡¢¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤¬À¸À®¤µ¤ì¤ë¤È¤¤¤¦ÅÀ¤Ç¤¹¡£¥¤¥ó¥é¥¤¥ó¡¦¥Æ¥­¥¹¥È¤Î¾¤ÎÉôʬ¤È¶èÊ̤¹¤ë¤¿¤á¤Ë¡¢\fI{@link}\fR¥¿¥°¤ÎºÇ½é¤ÈºÇ¸å¤ËÃ楫¥Ã¥³¤òµ­½Ò¤·¤Þ¤¹¡£¥é¥Ù¥ëÆâ¤Ç±¦Ã楫¥Ã¥³(\fI}\fR)¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢HTML¥¨¥ó¥Æ¥£¥Æ¥£µ­Ë¡\fI}\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-1¤Äʸ¤ÎÃæ¤Ç»ÈÍѤǤ­¤ë\fI{@link}\fR¥¿¥°¤Î¿ô¤ËÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¥¿¥°¤Ï¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¼çÀâÌÀÉôʬ¡¢¤Þ¤¿¤Ï\fI@deprecated\fR¡¢\fI@return\fR¡¢\fI@param\fR¥¿¥°¤Ê¤É¤ÎǤ°Õ¤Î¥¿¥°¤Î¥Æ¥­¥¹¥ÈÉôʬ¤Ç»ÈÍѤǤ­¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥á¥ó¥È¤Ç¤Ï\fIgetComponentAt(int,int)\fR¥á¥½¥Ã¥É¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹¡£ ++¤³¤Î¥¿¥°¤Ï\fB@see\fR¥¿¥°¤Ë»÷¤Æ¤¤¤Þ¤¹¡£¤É¤Á¤é¤Î¥¿¥°¤â¡¢\fBpackage\&.class#member\fR¤È\fBlabel\fR¤Î»²¾ÈÊýË¡¤È¡¢Í­¸ú¤Ê¹½Ê¸¤¬Æ±¤¸¤Ç¤¹¡£¼ç¤Ê°ã¤¤¤Ï¡¢\fB{@link}\fR¥¿¥°¤Ç¤Ï¡¢¡Ö´ØÏ¢¹àÌܡץ»¥¯¥·¥ç¥ó¤Ë¥ê¥ó¥¯¤¬ÇÛÃÖ¤µ¤ì¤ë¤«¤ï¤ê¤Ë¡¢¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤¬À¸À®¤µ¤ì¤ë¤È¤¤¤¦ÅÀ¤Ç¤¹¡£¥¤¥ó¥é¥¤¥ó¡¦¥Æ¥­¥¹¥È¤Î¾¤ÎÉôʬ¤È¶èÊ̤¹¤ë¤¿¤á¤Ë¡¢\fB{@link}\fR¥¿¥°¤ÎºÇ½é¤ÈºÇ¸å¤ËÃ楫¥Ã¥³¤òµ­½Ò¤·¤Þ¤¹¡£¥é¥Ù¥ëÆâ¤Ç±¦Ã楫¥Ã¥³(\fB}\fR)¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¡¢HTML¥¨¥ó¥Æ¥£¥Æ¥£µ­Ë¡\fB}\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++1¤Äʸ¤ÎÃæ¤Ç»ÈÍѤǤ­¤ë\fB{@link}\fR¥¿¥°¤Î¿ô¤ËÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¥¿¥°¤Ï¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¼çÀâÌÀÉôʬ¡¢¤Þ¤¿¤Ï\fB@deprecated\fR¡¢\fB@return\fR¡¢\fB@param\fR¥¿¥°¤Ê¤É¤ÎǤ°Õ¤Î¥¿¥°¤Î¥Æ¥­¥¹¥ÈÉôʬ¤Ç»ÈÍѤǤ­¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥á¥ó¥È¤Ç¤Ï\fBgetComponentAt(int,int)\fR¥á¥½¥Ã¥É¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Use the {@link #getComponentAt(int, int) getComponentAt} method\&. ++\fBUse the {@link #getComponentAt(int, int) getComponentAt} method\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -1510,7 +1563,8 @@ + .RS 4 + .\} + .nf +-Use the <a href="Component\&.html#getComponentAt(int, int)">getComponentAt</a> method\&. ++\fBUse the <a href="Component\&.html#getComponentAt(int, int)">getComponentAt</a> method\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -1521,7 +1575,8 @@ + .RS 4 + .\} + .nf +-Use the getComponentAt method\&. ++\fBUse the getComponentAt method\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -1532,24 +1587,24 @@ + .RS 4 + JDK 1\&.4¤ÇƳÆþ + .sp +-\fI{@link}\fR¥¿¥°¤ÈƱ¤¸Æ°ºî¤ò¤·¤Þ¤¹¤¬¡¢¥ê¥ó¥¯¡¦¥é¥Ù¥ë¤¬¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ç¤Ï¤Ê¤¯¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Çɽ¼¨¤µ¤ì¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£¥é¥Ù¥ë¤¬¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¤ÈÊØÍø¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¡Ö\fIRefer to {@linkplain add() the overridden method}\fR\&.¡×¤Ï¡ÖRefer to the overridden method¡×¤Èɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++\fB{@link}\fR¥¿¥°¤ÈƱ¤¸Æ°ºî¤ò¤·¤Þ¤¹¤¬¡¢¥ê¥ó¥¯¡¦¥é¥Ù¥ë¤¬¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ç¤Ï¤Ê¤¯¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Çɽ¼¨¤µ¤ì¤ëÅÀ¤¬°Û¤Ê¤ê¤Þ¤¹¡£¥é¥Ù¥ë¤¬¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¤ÈÊØÍø¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¡Ö\fBRefer to {@linkplain add() the overridden method}\fR\&.¡×¤Ï¡ÖRefer to the overridden method¡×¤Èɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + {@literal \fItext\fR} + .RS 4 + JDK 1\&.5¤ÇƳÆþ + .sp +-¥Æ¥­¥¹¥È¤òHTML¥Þ¡¼¥¯¥¢¥Ã¥×¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿Javadoc¥¿¥°¤È¤·¤Æ²ò¼á¤»¤º¤Ë¡¢text¤òɽ¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤Î·¿(\fI<Object>\fR)¡¢ÉÔÅù¹æ(\fI3 < 4\fR)¡¢Ìð°õ(<\-)¤Ê¤É¤Ç¡¢»³¥«¥Ã¥³(\fI<¤ª¤è¤Ó>\fR)¤òHTML¥¨¥ó¥Æ¥£¥Æ¥£(\fI<\fR¤ª¤è¤Ó\fI>\fR)¤Î¤«¤ï¤ê¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È\fI{@literal A<B>C}\fR¤Ï\fIA<B>C\fR¤È¤·¤Æ¡¢¥Ö¥é¥¦¥¶¤ÎÀ¸À®¤µ¤ì¤¿HTML¥Ú¡¼¥¸¤ËÊѹ¹¤µ¤ì¤º¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£\fI<B>\fR¤ÏÂÀ»ú¤È¤·¤Æ²ò¼á¤µ¤ì¤Þ¤»¤ó(¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ë¤Ê¤ê¤Þ¤»¤ó)¡£¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤ÇƱ¤¸µ¡Ç½¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¢\fI{@code}\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥Æ¥­¥¹¥È¤òHTML¥Þ¡¼¥¯¥¢¥Ã¥×¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿Javadoc¥¿¥°¤È¤·¤Æ²ò¼á¤»¤º¤Ë¡¢text¤òɽ¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¤Î·¿(\fB<Object>\fR)¡¢ÉÔÅù¹æ(\fB3 < 4\fR)¡¢Ìð°õ(<\-)¤Ê¤É¤Ç¡¢»³¥«¥Ã¥³(\fB<¤ª¤è¤Ó>\fR)¤òHTML¥¨¥ó¥Æ¥£¥Æ¥£(\fB<\fR¤ª¤è¤Ó\fB>\fR)¤Î¤«¤ï¤ê¤Ë»ÈÍѤǤ­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¦¥Æ¥­¥¹¥È\fB{@literal A<B>C}\fR¤Ï¡¢Êѹ¹¤µ¤ì¤º¤Ë¥Ö¥é¥¦¥¶¤ËÀ¸À®¤µ¤ì¤¿HTML¥Ú¡¼¥¸¤Ë\fBA<B>C\fR¤Èɽ¼¨¤µ¤ì¤Þ¤¹¡£\fB<B>\fR¤ÏÂÀ»ú¤È¤·¤Æ²ò¼á¤µ¤ì¤Þ¤»¤ó(¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤Ë¤Ê¤ê¤Þ¤»¤ó)¡£¥³¡¼¥É¡¦¥Õ¥©¥ó¥È¤ÇƱ¤¸µ¡Ç½¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¢\fB{@code}\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + @param \fIparameter\-name description\fR + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-¡Ö¥Ñ¥é¥á¡¼¥¿¡×¥»¥¯¥·¥ç¥ó¤Ë¡¢»ØÄꤵ¤ì¤¿\fIparameter\-name\fR¤Î¸å¤Ë»ØÄꤵ¤ì¤¿description¤ò³¤±¤Æ¥Ñ¥é¥á¡¼¥¿¤òÄɲä·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤È¤­¤Ë¤Ï¡¢description¤òÊ£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤Þ¤¿¤Ï¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤Î¤ßÍ­¸ú¤Ç¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@param¤Ë´Ø¤¹¤ë¹à ++¡Ö¥Ñ¥é¥á¡¼¥¿¡×¥»¥¯¥·¥ç¥ó¤Ë¡¢»ØÄꤵ¤ì¤¿\fBparameter\-name\fR¤Î¸å¤Ë»ØÄꤵ¤ì¤¿description¤ò³¤±¤Æ¥Ñ¥é¥á¡¼¥¿¤òÄɲä·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òµ­½Ò¤¹¤ë¤È¤­¤Ë¤Ï¡¢description¤òÊ£¿ô¹Ô¤Ë¤ï¤¿¤Ã¤Æµ­½Ò¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤Þ¤¿¤Ï¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤Î¤ßÍ­¸ú¤Ç¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@param¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@param)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fIparameter\-name\fR¤Ï¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¤Î¥Ñ¥é¥á¡¼¥¿¤Î̾Á°¤«¡¢¥¯¥é¥¹¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Î·¿¥Ñ¥é¥á¡¼¥¿¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£»³¥«¥Ã¥³¤Ç¤³¤Î¥Ñ¥é¥á¡¼¥¿Ì¾¤ò°Ï¤ß¡¢·¿¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ¹¤ë¤³¤È¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBparameter\-name\fR¤Ï¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¤Î¥Ñ¥é¥á¡¼¥¿¤Î̾Á°¤«¡¢¥¯¥é¥¹¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Î·¿¥Ñ¥é¥á¡¼¥¿¤Î̾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£»³¥«¥Ã¥³¤Ç¤³¤Î¥Ñ¥é¥á¡¼¥¿Ì¾¤ò°Ï¤ß¡¢·¿¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ¹¤ë¤³¤È¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + ¥¯¥é¥¹¤Î·¿¥Ñ¥é¥á¡¼¥¿¤ÎÎã: + .sp +@@ -1557,11 +1612,12 @@ + .RS 4 + .\} + .nf +-/** +- * @param <E> Type of element stored in a list +- */ +-public interface List<E> extends Collection<E> { +-} ++\fB/**\fR ++\fB * @param <E> Type of element stored in a list\fR ++\fB */\fR ++\fBpublic interface List<E> extends Collection<E> {\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -1572,14 +1628,15 @@ + .RS 4 + .\} + .nf +-/** +- * @param string the string to be converted +- * @param type the type to convert the string to +- * @param <T> the type of the element +- * @param <V> the value of the element +- */ +-<T, V extends T> V convert(String string, Class<T> type) { +-} ++\fB/**\fR ++\fB * @param string the string to be converted\fR ++\fB * @param type the type to convert the string to\fR ++\fB * @param <T> the type of the element\fR ++\fB * @param <V> the value of the element\fR ++\fB */\fR ++\fB<T, V extends T> V convert(String string, Class<T> type) {\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -1598,25 +1655,25 @@ + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-\fI¡Ö´ØÏ¢¹àÌÜ¡×\fR¸«½Ð¤·¤òÄɲ䷤ơ¢reference¤ò»Ø¤¹¥ê¥ó¥¯¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥È¡¦¥¨¥ó¥È¥ê¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤ÏǤ°Õ¤Î¿ô¤Î\fI@see\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤ì¤é¤Ï¤¹¤Ù¤ÆƱ¤¸¸«½Ð¤·¤Î²¼¤Ë¥°¥ë¡¼¥×²½¤µ¤ì¤Þ¤¹¡£\fI@see\fR¥¿¥°¤Ë¤Ï¡¢3¤Ä¤Î¥¿¥¤¥×¤Î·Á¼°¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î·Á¼°¤¬ºÇ¤â°ìÈÌŪ¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤òʸÃæ¤ËÁÞÆþ¤¹¤ëÊýË¡¤Ï¡¢\fI{@link}\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fI¡Ö´ØÏ¢¹àÌÜ¡×\fR¸«½Ð¤·¤òÄɲ䷤ơ¢reference¤ò»Ø¤¹¥ê¥ó¥¯¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥È¡¦¥¨¥ó¥È¥ê¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤ÏǤ°Õ¤Î¿ô¤Î\fB@see\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤ì¤é¤Ï¤¹¤Ù¤ÆƱ¤¸¸«½Ð¤·¤Î²¼¤Ë¥°¥ë¡¼¥×²½¤µ¤ì¤Þ¤¹¡£\fB@see\fR¥¿¥°¤Ë¤Ï¡¢3¤Ä¤Î¥¿¥¤¥×¤Î·Á¼°¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î·Á¼°¤¬ºÇ¤â°ìÈÌŪ¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤ËÂФ¹¤ë¥¤¥ó¥é¥¤¥ó¡¦¥ê¥ó¥¯¤òʸÃæ¤ËÁÞÆþ¤¹¤ëÊýË¡¤Ï¡¢\fB{@link}\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fB·Á¼°1\fR¡£@see +-\fIstring\fR¥¿¥°·Á¼°¤Ï¡¢\fIstring\fR¤Î¥Æ¥­¥¹¥È¡¦¥¨¥ó¥È¥ê¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£string¤Ï¡¢½ñÀÒ¤Þ¤¿¤ÏURL¤Ç¤Ï¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¾ðÊó¤Î»²¾ÈÀè¤Ç¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ºÇ½é¤Îʸ»ú¤È¤·¤ÆÆó½Å°úÍÑÉä(")¤ò¸¡º÷¤·¤Æ¡¢¤³¤Î·Á¼°¤òÁ°½Ò¤Î·Á¼°¤È¶èÊ̤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@see "The Java Programming Language"\fR¤Ï¼¡¤Î¥Æ¥­¥¹¥È¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBstring\fR¥¿¥°·Á¼°¤Ï¡¢\fIstring\fR¤Î¥Æ¥­¥¹¥È¡¦¥¨¥ó¥È¥ê¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£string¤Ï¡¢½ñÀÒ¤Þ¤¿¤ÏURL¤Ç¤Ï¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¾ðÊó¤Î»²¾ÈÀè¤Ç¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ºÇ½é¤Îʸ»ú¤È¤·¤ÆÆó½Å°úÍÑÉä(")¤ò¸¡º÷¤·¤Æ¡¢¤³¤Î·Á¼°¤òÁ°½Ò¤Î·Á¼°¤È¶èÊ̤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@see "The Java Programming Language"\fR¤Ï¼¡¤Î¥Æ¥­¥¹¥È¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + \fB´ØÏ¢¹àÌÜ\fR: + .sp + "The Java Programming Language" + .sp +-\fB·Á¼°2\fR¡£\fI@see <a href="URL#value">label</a>\fR·Á¼°¤Ï¡¢\fIURL#value\fR¤Ë¤è¤êÄêµÁ¤µ¤ì¤¿¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£\fIURL#value\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢ÁêÂÐURL¤Þ¤¿¤ÏÀäÂÐURL¤Ç¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ºÇ½é¤Îʸ»ú¤È¤·¤Æ¡Ö¤è¤ê¾®¤µ¤¤¡×µ­¹æ(\fI<\fR)¤ò¸¡º÷¤·¤Æ¡¢¤³¤Î·Á¼°¤ò¾¤Î·Á¼°¤È¶èÊ̤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@see <a href="spec\&.html#section">Java Spec</a>\fR¤Ï¼¡¤Î¥ê¥ó¥¯¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fB·Á¼°2\fR¡£\fB@see <a href="URL#value">label</a>\fR·Á¼°¤Ï¡¢\fBURL#value\fR¤ÇÄêµÁ¤µ¤ì¤¿¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£\fBURL#value\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢ÁêÂÐURL¤Þ¤¿¤ÏÀäÂÐURL¤Ç¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ºÇ½é¤Îʸ»ú¤È¤·¤Æ¡Ö¤è¤ê¾®¤µ¤¤¡×µ­¹æ(\fB<\fR)¤ò¸¡º÷¤·¤Æ¡¢¤³¤Î·Á¼°¤ò¾¤Î·Á¼°¤È¶èÊ̤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@see <a href="spec\&.html#section">Java Spec</a>\fR¤Ï¼¡¤Î¥ê¥ó¥¯¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + \fB´ØÏ¢¹àÌÜ\fR: + .sp + Java Spec + .sp +-\fB·Á¼°3\fR¡£\fI@see package\&.class#member label\fR·Á¼°¤Ï¡¢É½¼¨¥Æ¥­¥¹¥È¡¦¥é¥Ù¥ë¤È¤È¤â¤Ë¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥é¥Ù¥ë¤Ï»²¾È¤µ¤ì¤Æ¤¤¤ëJava¸À¸ì¤Î»ØÄꤵ¤ì¤¿Ì¾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»Ø¤·¼¨¤·¤Þ¤¹¡£¥é¥Ù¥ë¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£¥é¥Ù¥ë¤ò¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É½¼¨¥Æ¥­¥¹¥È¤Î¤«¤ï¤ê¤Ë¡¢Ì¾Á°¤¬Å¬ÀÚ¤Ëû½Ì¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£\fI\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤³¤Îɽ¼¨¥Æ¥­¥¹¥È¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬Á´ÂÎŪ¤Ëºï½ü¤µ¤ì¤Þ¤¹¡£¥é¥Ù¥ë¤Ï¡¢¼«Æ°À¸À®¤µ¤ì¤ëɽ¼¨¥Æ¥­¥¹¥È¤È¤Ï°Û¤Ê¤ëɽ¼¨¥Æ¥­¥¹¥È¤Ë¤¹¤ë¾ì¹ç¤Ë»ÈÍѤ·¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-Java SE 1\&.2¤À¤±¤Ï¡¢¥é¥Ù¥ë¤Ç¤Ï¤Ê¤¯Ì¾Á°¤¬\fI<code>\fR +-HTML¥¿¥°Æâ¤Ë¼«Æ°Åª¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£Java SE 1\&.2\&.2¤«¤é¤Ï¡¢¥é¥Ù¥ë¤ò»ÈÍѤ¹¤ë¤«¤·¤Ê¤¤¤«¤Ë¤«¤«¤ï¤é¤º¡¢\fI<code>\fR¥¿¥°¤Ï¾ï¤Ëɽ¼¨¥Æ¥­¥¹¥È¤ò°Ï¤à¤«¤¿¤Á¤Ç´Þ¤Þ¤ì¤Þ¤¹¡£ ++\fB·Á¼°3\fR¡£\fB@see package\&.class#member label\fR·Á¼°¤Ï¡¢É½¼¨¥Æ¥­¥¹¥È¡¦¥é¥Ù¥ë¤È¤È¤â¤Ë¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥é¥Ù¥ë¤Ï»²¾È¤µ¤ì¤Æ¤¤¤ëJava¸À¸ì¤Î»ØÄꤵ¤ì¤¿Ì¾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»Ø¤·¼¨¤·¤Þ¤¹¡£¥é¥Ù¥ë¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£¥é¥Ù¥ë¤ò¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É½¼¨¥Æ¥­¥¹¥È¤Î¤«¤ï¤ê¤Ë¡¢Ì¾Á°¤¬Å¬ÀÚ¤Ëû½Ì¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£\fB\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤³¤Îɽ¼¨¥Æ¥­¥¹¥È¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬Á´ÂÎŪ¤Ëºï½ü¤µ¤ì¤Þ¤¹¡£¥é¥Ù¥ë¤Ï¡¢¼«Æ°À¸À®¤µ¤ì¤ëɽ¼¨¥Æ¥­¥¹¥È¤È¤Ï°Û¤Ê¤ëɽ¼¨¥Æ¥­¥¹¥È¤Ë¤¹¤ë¾ì¹ç¤Ë»ÈÍѤ·¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++Java SE 1\&.2¤À¤±¤Ï¡¢¥é¥Ù¥ë¤Ç¤Ï¤Ê¤¯Ì¾Á°¤¬\fB<code>\fR ++HTML¥¿¥°Æâ¤Ë¼«Æ°Åª¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£Java SE 1\&.2\&.2¤«¤é¤Ï¡¢¥é¥Ù¥ë¤ò»ÈÍѤ¹¤ë¤«¤·¤Ê¤¤¤«¤Ë¤«¤«¤ï¤é¤º¡¢\fB<code>\fR¥¿¥°¤Ï¾ï¤Ëɽ¼¨¥Æ¥­¥¹¥È¤ò°Ï¤à¤«¤¿¤Á¤Ç´Þ¤Þ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1626,10 +1683,10 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackage\&.class#member\fR¤Ë¤Ï¡¢»²¾È¤µ¤ì¤Æ¤¤¤ëǤ°Õ¤ÎÍ­¸ú¤Ê¥×¥í¥°¥é¥àÍ×ÁǤÎ̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤Î̾Á°¤Ç¤¹¡£¤¿¤À¤·¡¢¥á¥ó¥Ð¡¼Ì¾¤ÎÁ°¤Îʸ»ú¤Ï¡¢¥·¥ã¡¼¥×µ­¹æ(\fI#\fR)¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£class¤Ï¡¢Ç¤°Õ¤Î¥È¥Ã¥×¥ì¥Ù¥ë¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤«¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òɽ¤·¤Þ¤¹¡£member¤Ï¡¢Ç¤°Õ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤òɽ¤·¤Þ¤¹(¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î̾Á°¤¬¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î̾Á°¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£³°Éô»²¾È¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£»²¾È¥¯¥é¥¹¤Ë°¤·¤Æ¤¤¤Ê¤¤Ì¾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢Â¾¤Î2¤Ä¤Î\fI@see\fR¥¿¥°·Á¼°¤Î¤É¤Á¤é¤«¤ò»ÈÍѤ·¤Þ¤¹¡£¡Ö̾Á°¤Î»ØÄê¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBpackage\&.class#member\fR¤Ë¤Ï¡¢»²¾È¤µ¤ì¤Æ¤¤¤ëǤ°Õ¤ÎÍ­¸ú¤Ê¥×¥í¥°¥é¥àÍ×ÁǤÎ̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤Î̾Á°¤Ç¤¹¡£¤¿¤À¤·¡¢¥á¥ó¥Ð¡¼Ì¾¤ÎÁ°¤Îʸ»ú¤Ï¡¢¥·¥ã¡¼¥×µ­¹æ(\fB#\fR)¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£class¤Ï¡¢Ç¤°Õ¤Î¥È¥Ã¥×¥ì¥Ù¥ë¤Þ¤¿¤Ï¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤«¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òɽ¤·¤Þ¤¹¡£member¤Ï¡¢Ç¤°Õ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤òɽ¤·¤Þ¤¹(¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó)¡£¤³¤Î̾Á°¤¬¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î̾Á°¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£³°Éô»²¾È¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£»²¾È¥¯¥é¥¹¤Ë°¤·¤Æ¤¤¤Ê¤¤Ì¾Á°¤Î¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢Â¾¤Î2¤Ä¤Î\fB@see\fR¥¿¥°·Á¼°¤Î¤É¤Á¤é¤«¤ò»ÈÍѤ·¤Þ¤¹¡£¡Ö̾Á°¤Î»ØÄê¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fBÃí°Õ:\fR +-³°Éô»²¾È¥¯¥é¥¹¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤Ê¤¤¥¯¥é¥¹¤Ç¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥ÈÆâ¤Ç³°Éô»²¾È¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤·¤Æ¤¤¤ë²Õ½ê¤Ï¡¢³°Éô»²¾È¤Þ¤¿¤Ï³°Éô¥ê¥ó¥¯¤È¸Æ¤Ð¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjava\&.awt package\fR¤ËÂФ·¤Æ¤Î¤ß\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢\fIObject\fR¤Ê¤É¤Î\fIjava\&.lang\fRÆâ¤Î¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤¬³°Éô»²¾È¥¯¥é¥¹¤Ë¤Ê¤ê¤Þ¤¹¡£\fI\-link\fR¤ª¤è¤Ó\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢³°Éô»²¾È¥¯¥é¥¹¤Ø¥ê¥ó¥¯¤·¤Þ¤¹¡£³°Éô»²¾È¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥³¥á¥ó¥È¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ë¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++³°Éô»²¾È¥¯¥é¥¹¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤Ê¤¤¥¯¥é¥¹¤Ç¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥ÈÆâ¤Ç³°Éô»²¾È¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤·¤Æ¤¤¤ë²Õ½ê¤Ï¡¢³°Éô»²¾È¤Þ¤¿¤Ï³°Éô¥ê¥ó¥¯¤È¸Æ¤Ð¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjava\&.awt package\fR¤ËÂФ·¤Æ¤Î¤ß\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢\fBObject\fR¤Ê¤É¤Î\fBjava\&.lang\fRÆâ¤Î¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤¬³°Éô»²¾È¥¯¥é¥¹¤Ë¤Ê¤ê¤Þ¤¹¡£\fB\-link\fR¤ª¤è¤Ó\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢³°Éô»²¾È¥¯¥é¥¹¤Ø¥ê¥ó¥¯¤·¤Þ¤¹¡£³°Éô»²¾È¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥³¥á¥ó¥È¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ë¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -1640,7 +1697,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIlabel\fR¤Ï¡¢¾Êά²Äǽ¤Ê¥Æ¥­¥¹¥È¤Ç¡¢¥ê¥ó¥¯¤Î¥é¥Ù¥ë¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£¥é¥Ù¥ë¤Ë¤Ï¶õÇò¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIlabel\fR¤ò¾Êά¤¹¤ë¤È¡¢\fIpackage\&.class\&.member\fR¤¬¡¢¸½ºß¤Î¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤Ë±þ¤¸¤ÆŬÀÚ¤Ëû½Ì¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBlabel\fR¤Ï¡¢¾Êά²Äǽ¤Ê¥Æ¥­¥¹¥È¤Ç¡¢¥ê¥ó¥¯¤Î¥é¥Ù¥ë¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£¥é¥Ù¥ë¤Ë¤Ï¶õÇò¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBlabel\fR¤ò¾Êά¤¹¤ë¤È¡¢\fBpackage\&.class\&.member\fR¤¬¡¢¸½ºß¤Î¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤Ë±þ¤¸¤ÆŬÀÚ¤Ëû½Ì¤µ¤ì¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -1651,18 +1708,19 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¶õÇòʸ»ú¤¬¡¢\fIpackage\&.class#member\fR¤È\fIlabel\fR¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤Ë¤Ê¤ê¤Þ¤¹¡£¥«¥Ã¥³¤ÎÆ⦤ζõÇòʸ»ú¤Ï¥é¥Ù¥ë¤ÎÀèƬ¤È¤Ï²ò¼á¤µ¤ì¤Ê¤¤¤¿¤á¡¢¥á¥½¥Ã¥É¤Î¥Ñ¥é¥á¡¼¥¿´Ö¤Ë¶õÇòʸ»ú¤òÆþ¤ì¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ +-.RE +-.sp +-¤³¤ÎÎã¤Ç¤Ï¡¢\fI@see\fR¥¿¥°(\fICharacter\fR¥¯¥é¥¹Æâ)¤¬¡¢\fIString\fR¥¯¥é¥¹¤Îequals¥á¥½¥Ã¥É¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹¡£¥¿¥°¤Ë¤Ï¡¢Ì¾Á°\fIString#equals(Object)\fR¤È¥é¥Ù¥ë\fIequals\fR¤ÎξÊý¤Î°ú¿ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¶õÇòʸ»ú¤¬¡¢\fBpackage\&.class#member\fR¤È\fBlabel\fR¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤Ë¤Ê¤ê¤Þ¤¹¡£¥«¥Ã¥³¤ÎÆ⦤ζõÇòʸ»ú¤Ï¥é¥Ù¥ë¤ÎÀèƬ¤È¤Ï²ò¼á¤µ¤ì¤Ê¤¤¤¿¤á¡¢¥á¥½¥Ã¥É¤Î¥Ñ¥é¥á¡¼¥¿´Ö¤Ë¶õÇòʸ»ú¤òÆþ¤ì¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ ++.RE ++.sp ++¤³¤ÎÎã¤Ç¤Ï¡¢\fB@see\fR¥¿¥°(\fBCharacter\fR¥¯¥é¥¹Æâ)¤¬¡¢\fBString\fR¥¯¥é¥¹¤Îequals¥á¥½¥Ã¥É¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹¡£¥¿¥°¤Ë¤Ï¡¢Ì¾Á°\fBString#equals(Object)\fR¤È¥é¥Ù¥ë\fBequals\fR¤ÎξÊý¤Î°ú¿ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * @see String#equals(Object) equals +- */ ++\fB/**\fR ++\fB * @see String#equals(Object) equals\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE +@@ -1673,10 +1731,11 @@ + .RS 4 + .\} + .nf +-<dl> +-<dt><b>See Also:</b> +-<dd><a href="\&.\&./\&.\&./java/lang/String#equals(java\&.lang\&.Object)"><code>equals<code></a> +-</dl> ++\fB<dl>\fR ++\fB<dt><b>See Also:</b>\fR ++\fB<dd><a href="\&.\&./\&.\&./java/lang/String#equals(java\&.lang\&.Object)"><code>equals<code></a>\fR ++\fB</dl>\fR ++ + .fi + .if n \{\ + .RE +@@ -1687,39 +1746,42 @@ + .sp + equals + .RE +-̾Á°¤Î»ØÄê.PP +-¤³¤Î\fIpackage\&.class#member\fR¤È¤¤¤¦Ì¾Á°¤Ï¡¢\fIjava\&.lang\&.String#toUpperCase()\fR¤Î¤è¤¦¤Ê´°Á´½¤¾þ̾¤Ë¤¹¤ë¤³¤È¤â¡¢\fIString#toUpperCase()\fR¤ä\fI#toUpperCase()\fR¤Î¤è¤¦¤ÊÈó´°Á´½¤¾þ̾¤Ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Ì¾Á°¤¬´°Á´½¤¾þ¤è¤êû¤¤¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¸½à¤ÎJava¥³¥ó¥Ñ¥¤¥é¤Î¸¡º÷½ç½ø¤ò»ÈÍѤ·¤Æõ¤·¤Þ¤¹¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£Ì¾Á°¤Ï¡¢¥á¥½¥Ã¥É°ú¿ô¤Î´Ö¤Ê¤É¡¢¥«¥Ã¥³Æâ¤Î¥¹¥Ú¡¼¥¹¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ÉôʬŪ¤Ë½¤¾þ¤·¤¿Ã»¤¤Ì¾Á°¤ò»ØÄꤹ¤ë¤³¤È¤ÎÍøÅÀ¤Ï¡¢ÆþÎϤ¹¤ëʸ»ú¿ô¤¬¸º¤ë¤³¤È¤ä¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤¬Æɤߤ䤹¤¯¤Ê¤ë¤³¤È¤Ç¤¹¡£¼¡¤Î¥ê¥¹¥È¤ËÍÍ¡¹¤Ê·Á¼°¤Î̾Á°¤ò¼¨¤·¤Þ¤¹¡£¤³¤³¤Ç¡¢\fIClass\fR¤Ë¤Ï¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¡¢Type¤Ë¤Ï¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢ÇÛÎ󡢤ޤ¿¤Ï¥×¥ê¥ß¥Æ¥£¥Ö¤ò¡¢method¤Ë¤Ï¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ò¡¢¤½¤ì¤¾¤ì»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.PP ++̾Á°¤Î»ØÄê ++.PP ++¤³¤Î\fBpackage\&.class#member\fR¤È¤¤¤¦Ì¾Á°¤Ï¡¢\fBjava\&.lang\&.String#toUpperCase()\fR¤Î¤è¤¦¤Ê´°Á´½¤¾þ̾¤Ë¤¹¤ë¤³¤È¤â¡¢\fBString#toUpperCase()\fR¤ä\fB#toUpperCase()\fR¤Î¤è¤¦¤ÊÈó´°Á´½¤¾þ̾¤Ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Ì¾Á°¤¬´°Á´½¤¾þ¤è¤êû¤¤¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¸½à¤ÎJava¥³¥ó¥Ñ¥¤¥é¤Î¸¡º÷½ç½ø¤ò»ÈÍѤ·¤Æõ¤·¤Þ¤¹¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£Ì¾Á°¤Ï¡¢¥á¥½¥Ã¥É°ú¿ô¤Î´Ö¤Ê¤É¡¢¥«¥Ã¥³Æâ¤Î¥¹¥Ú¡¼¥¹¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ÉôʬŪ¤Ë½¤¾þ¤·¤¿Ã»¤¤Ì¾Á°¤ò»ØÄꤹ¤ë¤³¤È¤ÎÍøÅÀ¤Ï¡¢ÆþÎϤ¹¤ëʸ»ú¿ô¤¬¸º¤ë¤³¤È¤ä¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤¬Æɤߤ䤹¤¯¤Ê¤ë¤³¤È¤Ç¤¹¡£¼¡¤Î¥ê¥¹¥È¤ËÍÍ¡¹¤Ê·Á¼°¤Î̾Á°¤ò¼¨¤·¤Þ¤¹¡£¤³¤³¤Ç¡¢\fBClass\fR¤Ë¤Ï¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¡¢Type¤Ë¤Ï¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢ÇÛÎ󡢤ޤ¿¤Ï¥×¥ê¥ß¥Æ¥£¥Ö¤ò¡¢method¤Ë¤Ï¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ò¡¢¤½¤ì¤¾¤ì»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fBTypical forms for\fR\fB @see package\&.class#member\fR +-\fBReferencing a member of the current class\fR +-@see #field +-@see #method(Type, Type,\&.\&.\&.) +-@see #method(Type argname, Type argname,\&.\&.\&.) +-@see #constructor(Type, Type,\&.\&.\&.) +-@see #constructor(Type argname, Type argname,\&.\&.\&.) +- +-\fBReferencing another class in the current or imported packages\fR +-@see Class#field +-@see Class#method(Type, Type,\&.\&.\&.) +-@see Class#method(Type argname, Type argname,\&.\&.\&.) +-@see Class#constructor(Type, Type,\&.\&.\&.) +-@see Class#constructor(Type argname, Type argname,\&.\&.\&.) +-@see Class\&.NestedClass +-@see Class +- +-\fBReferencing an element in another package (fully qualified)\fR +-@see package\&.Class#field +-@see package\&.Class#method(Type, Type,\&.\&.\&.) +-@see package\&.Class#method(Type argname, Type argname,\&.\&.\&.) +-@see package\&.Class#constructor(Type, Type,\&.\&.\&.) +-@see package\&.Class#constructor(Type argname, Type argname,\&.\&.\&.) +-@see package\&.Class\&.NestedClass +-@see package\&.Class +-@see package ++\fB\fBTypical forms for\fR\fR\fB\fB @see package\&.class#member\fR\fR\fB \fR ++\fB\fBReferencing a member of the current class\fR\fR ++\fB@see #field\fR ++\fB@see #method(Type, Type,\&.\&.\&.)\fR ++\fB@see #method(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see #constructor(Type, Type,\&.\&.\&.)\fR ++\fB@see #constructor(Type argname, Type argname,\&.\&.\&.) \fR ++ ++\fB\fBReferencing another class in the current or imported packages\fR\fR ++\fB@see Class#field\fR ++\fB@see Class#method(Type, Type,\&.\&.\&.)\fR ++\fB@see Class#method(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see Class#constructor(Type, Type,\&.\&.\&.)\fR ++\fB@see Class#constructor(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see Class\&.NestedClass\fR ++\fB@see Class \fR ++ ++\fB\fBReferencing an element in another package (fully qualified)\fR\fR ++\fB@see package\&.Class#field\fR ++\fB@see package\&.Class#method(Type, Type,\&.\&.\&.)\fR ++\fB@see package\&.Class#method(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see package\&.Class#constructor(Type, Type,\&.\&.\&.)\fR ++\fB@see package\&.Class#constructor(Type argname, Type argname,\&.\&.\&.)\fR ++\fB@see package\&.Class\&.NestedClass\fR ++\fB@see package\&.Class\fR ++\fB@see package\fR ++ + .fi + .if n \{\ + .RE +@@ -1735,7 +1797,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-ºÇ½é¤Î¥¿¥¤¥×¤Î·Á¼°(¥Ñ¥Ã¥±¡¼¥¸¤È¥¯¥é¥¹¤ò¾Êά)¤Î¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¯¥é¥¹¤Î³¬ÁؤΤߤò¸¡º÷¤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¸½ºß¤Î¥¯¥é¥¹¤«¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤½¤Î¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤«¥¹¡¼¥Ñ¡¼¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤Þ¤¿¤Ï¤½¤Î³°Â¦¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤«¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é¥á¥ó¥Ð¡¼¤ò¸¡º÷¤·¤Þ¤¹(¸¡º÷¹àÌÜ1\(en3)¡£¸½ºß¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¾¤ÎÉôʬ¤ä¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¸¡º÷¤·¤Þ¤»¤ó(¸¡º÷¹àÌÜ4\(en5)¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ºÇ½é¤Î¥¿¥¤¥×¤Î·Á¼°(¥Ñ¥Ã¥±¡¼¥¸¤È¥¯¥é¥¹¤ò¾Êά)¤Î¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¯¥é¥¹¤Î³¬ÁؤΤߤò¸¡º÷¤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¸½ºß¤Î¥¯¥é¥¹¤«¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤½¤Î¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤«¥¹¡¼¥Ñ¡¼¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¤Þ¤¿¤Ï¤½¤Î³°Â¦¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤«¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤«¤é¥á¥ó¥Ð¡¼¤ò¸¡º÷¤·¤Þ¤¹(¸¡º÷¹àÌÜ1\(en3)¡£¸½ºß¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¾¤ÎÉôʬ¤ä¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¸¡º÷¤·¤Þ¤»¤ó(¸¡º÷¹àÌÜ4\(en5)¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -1746,7 +1808,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÆþÎÏ»þ¤Ë¡¢\fIgetValue\fR¤Î¤è¤¦¤Ë¥«¥Ã¥³¤Ê¤·¤Î̾Á°¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢Æ±¤¸Ì¾Á°¤Î¥Õ¥£¡¼¥ë¥É¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤¬¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡º÷¤ÇºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¥á¥½¥Ã¥É¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£·ë²Ì¤ÏÁ°¤â¤Ã¤ÆÆÃÄê¤Ç¤­¤Þ¤»¤ó¡£ ++¥á¥½¥Ã¥É¤Þ¤¿¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ÎÆþÎÏ»þ¤Ë¡¢\fBgetValue\fR¤Î¤è¤¦¤Ë¥«¥Ã¥³¤Ê¤·¤Î̾Á°¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢Æ±¤¸Ì¾Á°¤Î¥Õ¥£¡¼¥ë¥É¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î¥á¥½¥Ã¥É¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤¬¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡º÷¤ÇºÇ½é¤Ë¸«¤Ä¤«¤Ã¤¿¥á¥½¥Ã¥É¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£·ë²Ì¤ÏÁ°¤â¤Ã¤ÆÆÃÄê¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -1757,7 +1819,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢¤¹¤Ù¤Æ¤Î·Á¼°¤Ë¤Ä¤¤¤Æ¡¢\fIouter\&.inner\fR¤È¤·¤Æ»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Ã±½ã¤Ë\fIinner\fR¤È¤Ï¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¤Ï¡¢¤¹¤Ù¤Æ¤Î·Á¼°¤Ë¤Ä¤¤¤Æ¡¢\fBouter\&.inner\fR¤È¤·¤Æ»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Ã±½ã¤Ë\fBinner\fR¤È¤Ï¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -1768,12 +1830,14 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¤¹¤Ç¤Ë½Ò¤Ù¤¿¤è¤¦¤Ë¡¢¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤È¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ¤Ï¡¢¥É¥Ã¥È(\fI\&.\fR)¤Ç¤Ï¤Ê¤¯¥·¥ã¡¼¥×µ­¹æ(\fI#\fR)¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ë»ØÄꤹ¤ë¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¢¤¤¤Þ¤¤¤µ¤ò²ò·è¤Ç¤­¤Þ¤¹¡£¥É¥Ã¥È¤Ï¡¢¥¯¥é¥¹¡¢¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¶èÀڤ뤿¤á¤Ë¤â»ÈÍѤµ¤ì¤ë¤«¤é¤Ç¤¹¡£¤¿¤À¤·¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤¢¤¤¤Þ¤¤¤µ¤¬¤Ê¤±¤ì¤Ð¥É¥Ã¥È¤ÏÀµ¤·¤¯²òÀϤµ¤ì¤Þ¤¹¤¬¡¢·Ù¹ð¤Ïɽ¼¨¤µ¤ì¤Þ¤¹¡£ +-.RE +-@see¥¿¥°¤Î¸¡º÷½ç½ø.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Õ¥¡¥¤¥ë¡¢³µÍ×¥Õ¥¡¥¤¥ë¤Ëɽ¼¨¤µ¤ì¤ë\fI@see\fR¥¿¥°¤ò½èÍý¤·¤Þ¤¹¡£¸å¼Ô¤Î2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢´°Á´½¤¾þ¤Î̾Á°¤ò\fI@see\fR¥¿¥°¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢´°Á´½¤¾þ¤Î̾Á°¡¢¤Þ¤¿¤ÏÉôʬ½¤¾þ¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.PP +-¼¡¤Ë¡¢\fI@see\fR¥¿¥°¤Î¸¡º÷½ç½ø¤ò¼¨¤·¤Þ¤¹¡£ ++¤¹¤Ç¤Ë½Ò¤Ù¤¿¤è¤¦¤Ë¡¢¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤È¤Î´Ö¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ¤Ï¡¢¥É¥Ã¥È(\fB\&.\fR)¤Ç¤Ï¤Ê¤¯¥·¥ã¡¼¥×µ­¹æ(\fB#\fR)¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ë»ØÄꤹ¤ë¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¢¤¤¤Þ¤¤¤µ¤ò²ò·è¤Ç¤­¤Þ¤¹¡£¥É¥Ã¥È¤Ï¡¢¥¯¥é¥¹¡¢¥Í¥¹¥È¤µ¤ì¤¿¥¯¥é¥¹¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¶èÀڤ뤿¤á¤Ë¤â»ÈÍѤµ¤ì¤ë¤«¤é¤Ç¤¹¡£¤¿¤À¤·¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤¢¤¤¤Þ¤¤¤µ¤¬¤Ê¤±¤ì¤Ð¥É¥Ã¥È¤ÏÀµ¤·¤¯²òÀϤµ¤ì¤Þ¤¹¤¬¡¢·Ù¹ð¤Ïɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++.RE ++.PP ++@see¥¿¥°¤Î¸¡º÷½ç½ø ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Õ¥¡¥¤¥ë¡¢³µÍ×¥Õ¥¡¥¤¥ë¤Ëɽ¼¨¤µ¤ì¤ë\fB@see\fR¥¿¥°¤ò½èÍý¤·¤Þ¤¹¡£¸å¼Ô¤Î2¤Ä¤Î¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢´°Á´½¤¾þ¤Î̾Á°¤ò\fB@see\fR¥¿¥°¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢´°Á´½¤¾þ¤Î̾Á°¡¢¤Þ¤¿¤ÏÉôʬ½¤¾þ¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.PP ++¼¡¤Ë¡¢\fB@see\fR¥¿¥°¤Î¸¡º÷½ç½ø¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1827,12 +1891,12 @@ + .sp -1 + .IP " 5." 4.2 + .\} +-¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹(\fIimport\fRʸ¤Î½ç½ø¤Ë½¾¤Ã¤Æ¸¡º÷)¡£ +-.RE +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢³Æ¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¹àÌÜ1\-3¤òºÆµ¢Åª¤ËŬÍѤ·¤Ê¤¬¤é¡¢°ìÃפ¹¤ë̾Á°¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¸¡º÷¤ò³¤±¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¤Þ¤º¸½ºß¤Î¥¯¥é¥¹¤ò¸¡º÷¤·¡¢¼¡¤Ë¤½¤Î³°Â¦¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹E¤ò¸¡º÷¤·¤¿¸å¡¢E¤Î¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤ò¸¡º÷¤·¤Æ¤«¤é¡¢E¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤ò¸¡º÷¤·¤Þ¤¹¡£¹àÌÜ4¤È5¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¸¡º÷¤¹¤ë½ç½ø¤Ï·è¤Þ¤Ã¤Æ¤¤¤Þ¤»¤ó(¤½¤Î½ç½ø¤Ï¡¢¸Ä¡¹¤Î¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹)¡£¹àÌÜ5¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjava\&.lang\fR¤ò¸¡º÷¤·¤Þ¤¹¡£¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥°¥é¥à¤Ë¼«Æ°Åª¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£ +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´°Á´½¤¾þ¤Ç¤Ê¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç\fI@see\fR¥¿¥°¤ò¸«¤Ä¤±¤ë¤È¡¢Java¥³¥ó¥Ñ¥¤¥é¤ÈƱ¤¸½ç½ø¤Ç»ØÄꤵ¤ì¤¿Ì¾Á°¤ò¸¡º÷¤·¤Þ¤¹(¤¿¤À¤·¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ÆÃÄê¤Î̾Á°¶õ´Ö¤Î¤¢¤¤¤Þ¤¤¤µ¤ò¸¡½Ð¤·¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤³¤ì¤é¤Î¥¨¥é¡¼¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤ë¤¿¤á¤Ç¤¹)¡£¤³¤Î¸¡º÷½ç½ø¤Ï¡¢Java¸À¸ì»ÅÍͤÇÀµ¼°¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´ØÏ¢¤¹¤ë¥¯¥é¥¹¤È¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤¿¥¯¥é¥¹¤È¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤«¤é¤½¤Î̾Á°¤ò¸¡º÷¤·¤Þ¤¹¡£¶ñÂÎŪ¤Ë¤Ï¡¢¼¡¤Î½ç½ø¤Ç¸¡º÷¤·¤Þ¤¹¡£ ++¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹(\fBimport\fRʸ¤Î½ç½ø¤Ë½¾¤Ã¤Æ¸¡º÷)¡£ ++.RE ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢³Æ¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¹àÌÜ1\-3¤òºÆµ¢Åª¤ËŬÍѤ·¤Ê¤¬¤é¡¢°ìÃפ¹¤ë̾Á°¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¸¡º÷¤ò³¤±¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¤Þ¤º¸½ºß¤Î¥¯¥é¥¹¤ò¸¡º÷¤·¡¢¼¡¤Ë¤½¤Î³°Â¦¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹E¤ò¸¡º÷¤·¤¿¸å¡¢E¤Î¥¹¡¼¥Ñ¡¼¥¯¥é¥¹¤ò¸¡º÷¤·¤Æ¤«¤é¡¢E¤ò°Ï¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤ò¸¡º÷¤·¤Þ¤¹¡£¹àÌÜ4¤È5¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¸¡º÷¤¹¤ë½ç½ø¤Ï·è¤Þ¤Ã¤Æ¤¤¤Þ¤»¤ó(¤½¤Î½ç½ø¤Ï¡¢¸Ä¡¹¤Î¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹)¡£¹àÌÜ5¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjava\&.lang\fR¤ò¸¡º÷¤·¤Þ¤¹¡£¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢¤¹¤Ù¤Æ¤Î¥×¥í¥°¥é¥à¤Ë¼«Æ°Åª¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£ ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´°Á´½¤¾þ¤Ç¤Ê¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç\fB@see\fR¥¿¥°¤ò¸«¤Ä¤±¤ë¤È¡¢Java¥³¥ó¥Ñ¥¤¥é¤ÈƱ¤¸½ç½ø¤Ç»ØÄꤵ¤ì¤¿Ì¾Á°¤ò¸¡º÷¤·¤Þ¤¹(¤¿¤À¤·¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢ÆÃÄê¤Î̾Á°¶õ´Ö¤Î¤¢¤¤¤Þ¤¤¤µ¤ò¸¡½Ð¤·¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¤³¤ì¤é¤Î¥¨¥é¡¼¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤ë¤¿¤á¤Ç¤¹)¡£¤³¤Î¸¡º÷½ç½ø¤Ï¡¢Java¸À¸ì»ÅÍͤÇÀµ¼°¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢´ØÏ¢¤¹¤ë¥¯¥é¥¹¤È¥Ñ¥Ã¥±¡¼¥¸¡¢¤ª¤è¤Ó¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤¿¥¯¥é¥¹¤È¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤«¤é¤½¤Î̾Á°¤ò¸¡º÷¤·¤Þ¤¹¡£¶ñÂÎŪ¤Ë¤Ï¡¢¼¡¤Î½ç½ø¤Ç¸¡º÷¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1886,70 +1950,75 @@ + .sp -1 + .IP " 5." 4.2 + .\} +-¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹(\fIimport\fRʸ¤Î½ç½ø¤Ë½¾¤Ã¤Æ¸¡º÷)¡£ +-.RE +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¬¤º¤·¤â¥µ¥Ö¥¯¥é¥¹¤ò¸¡º÷¤¹¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£¤Þ¤¿¡¢¼Â¹ÔÃæ¤Ë¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¤ë¾ì¹ç¤Ç¤â¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤·¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fI@see\fR¥¿¥°¤¬\fIjava\&.awt\&.event\&.KeyEvent\fR¥¯¥é¥¹Æâ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Æ¡¢\fIjava\&.awt package\fRÆâ¤Î¤¢¤ë̾Á°¤ò»²¾È¤·¤Æ¤¤¤Æ¤â¡¢¤½¤Î¥¯¥é¥¹¤¬¥¤¥ó¥Ý¡¼¥È¤·¤Ê¤¤¤«¤®¤ê\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤·¤Þ¤»¤ó¡£ +-̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡.PP +-\fIlabel\fR¤ò¾Êά¤¹¤ë¤È¡¢\fIpackage\&.class\&.member\fR¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£°ìÈ̤ˡ¢¤³¤ì¤Ï¸½ºß¤Î¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤Ë±þ¤¸¤ÆŬÀÚ¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£Ã»½Ì¤µ¤ì¤ë¤È¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤êɬÍ׺Ǿ®¸Â¤Î̾Á°¤Î¤ß¤¬É½¼¨¤µ¤ì¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIString\&.toUpperCase()\fR¥á¥½¥Ã¥É¤Ë¡¢Æ±¤¸¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤Ø¤Î»²¾È¤È¾¤Î¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹Ì¾¤¬É½¼¨¤µ¤ì¤ë¤Î¤Ï¸å¼Ô¤Î¥±¡¼¥¹¤Î¤ß¤Ç¤¹(¼¡¤Î¥ê¥¹¥È¤ò»²¾È)¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÁ´ÂÎŪ¤Ëºï½ü¤¹¤ë¤Ë¤Ï¡¢\fI\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.RS 4 +-\fB»²¾È¤Î¥¿¥¤¥×\fR: \fI@see\fR¥¿¥°¤ÏƱ¤¸¥¯¥é¥¹¡¢Æ±¤¸¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ +-.RE +-.RS 4 +-\fBÎã\fR: \fI@see String#toLowerCase()\fR +-.RE +-.RS 4 +-\fBɽ¼¨\fR: \fItoLowerCase()\fR \- ¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹Ì¾¤ò¾Êά¤·¤Þ¤¹ +-.RE +-.RS 4 +-.RE +-.RS 4 +-\fB»²¾È¤Î¥¿¥¤¥×\fR: \fI@see\fR¥¿¥°¤ÏÊ̤Υ¯¥é¥¹¡¢Æ±¤¸¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ +-.RE +-.RS 4 +-\fBÎã\fR: \fI@see Character#toLowerCase(char)\fR +-.RE +-.RS 4 +-\fBɽ¼¨\fR: \fICharacter\&.toLowerCase(char)\fR \- ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¾Êά¤·¡¢¥¯¥é¥¹Ì¾¤ò´Þ¤ß¤Þ¤¹ +-.RE +-.RS 4 +-.RE +-.RS 4 +-\fB»²¾È¤Î¥¿¥¤¥×\fR: \fI@see\fR¥¿¥°¤Ï°Û¤Ê¤ë¥¯¥é¥¹¡¢°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ +-.RE +-.RS 4 +-\fBÎã\fR: \fI@see java\&.io\&.File#exists()\fR +-.RE +-.RS 4 +-\fBɽ¼¨\fR: \fIjava\&.io\&.File\&.exists()\fR \- ¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹Ì¾¤ò´Þ¤ß¤Þ¤¹ +-.RE +-.RS 4 +-.RE +-@see¥¿¥°¤ÎÎã.PP +-±¦Â¦¤Î¥³¥á¥ó¥È¤Ï¡¢\fI@see\fR¥¿¥°¤¬\fIjava\&.applet\&.Applet\fR¤Ê¤É¤ÎÊ̤Υѥ屡¼¥¸¤Î¥¯¥é¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ë¡¢Ì¾Á°¤¬¤É¤Î¤è¤¦¤Ëɽ¼¨¤µ¤ì¤ë¤«¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@see¤Ë´Ø¤¹¤ë¹à ++¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹(\fBimport\fRʸ¤Î½ç½ø¤Ë½¾¤Ã¤Æ¸¡º÷)¡£ ++.RE ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¬¤º¤·¤â¥µ¥Ö¥¯¥é¥¹¤ò¸¡º÷¤¹¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£¤Þ¤¿¡¢¼Â¹ÔÃæ¤Ë¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¤ë¾ì¹ç¤Ç¤â¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤·¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fB@see\fR¥¿¥°¤¬\fBjava\&.awt\&.event\&.KeyEvent\fR¥¯¥é¥¹Æâ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Æ¡¢\fBjava\&.awt package\fRÆâ¤Î¤¢¤ë̾Á°¤ò»²¾È¤·¤Æ¤¤¤Æ¤â¡¢¤½¤Î¥¯¥é¥¹¤¬¥¤¥ó¥Ý¡¼¥È¤·¤Ê¤¤¤«¤®¤ê\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¸¡º÷¤·¤Þ¤»¤ó¡£ ++.PP ++̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡ ++.PP ++\fBlabel\fR¤ò¾Êά¤¹¤ë¤È¡¢\fBpackage\&.class\&.member\fR¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£°ìÈ̤ˡ¢¤³¤ì¤Ï¸½ºß¤Î¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤Ë±þ¤¸¤ÆŬÀÚ¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£Ã»½Ì¤µ¤ì¤ë¤È¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤êɬÍ׺Ǿ®¸Â¤Î̾Á°¤Î¤ß¤¬É½¼¨¤µ¤ì¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBString\&.toUpperCase()\fR¥á¥½¥Ã¥É¤Ë¡¢Æ±¤¸¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤Ø¤Î»²¾È¤È¾¤Î¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹Ì¾¤¬É½¼¨¤µ¤ì¤ë¤Î¤Ï¸å¼Ô¤Î¥±¡¼¥¹¤Î¤ß¤Ç¤¹(¼¡¤Î¥ê¥¹¥È¤ò»²¾È)¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÁ´ÂÎŪ¤Ëºï½ü¤¹¤ë¤Ë¤Ï¡¢\fB\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.RS 4 ++\fB»²¾È¤Î¥¿¥¤¥×\fR: \fB@see\fR¥¿¥°¤ÏƱ¤¸¥¯¥é¥¹¡¢Æ±¤¸¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ ++.RE ++.RS 4 ++\fBÎã\fR: \fB@see String#toLowerCase()\fR ++.RE ++.RS 4 ++\fBɽ¼¨\fR: \fBtoLowerCase()\fR \- ¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹Ì¾¤ò¾Êά¤·¤Þ¤¹ ++.RE ++.RS 4 ++.RE ++.RS 4 ++\fB»²¾È¤Î¥¿¥¤¥×\fR: \fB@see\fR¥¿¥°¤ÏÊ̤Υ¯¥é¥¹¡¢Æ±¤¸¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ ++.RE ++.RS 4 ++\fBÎã\fR: \fB@see Character#toLowerCase(char)\fR ++.RE ++.RS 4 ++\fBɽ¼¨\fR: \fBCharacter\&.toLowerCase(char)\fR \- ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¾Êά¤·¡¢¥¯¥é¥¹Ì¾¤ò´Þ¤ß¤Þ¤¹ ++.RE ++.RS 4 ++.RE ++.RS 4 ++\fB»²¾È¤Î¥¿¥¤¥×\fR: \fB@see\fR¥¿¥°¤Ï°Û¤Ê¤ë¥¯¥é¥¹¡¢°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥á¥ó¥Ð¡¼¤ò»²¾È¤·¤Þ¤¹ ++.RE ++.RS 4 ++\fBÎã\fR: \fB@see java\&.io\&.File#exists()\fR ++.RE ++.RS 4 ++\fBɽ¼¨\fR: \fBjava\&.io\&.File\&.exists()\fR \- ¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹Ì¾¤ò´Þ¤ß¤Þ¤¹ ++.RE ++.RS 4 ++.RE ++.PP ++@see¥¿¥°¤ÎÎã ++.PP ++±¦Â¦¤Î¥³¥á¥ó¥È¤Ï¡¢\fB@see\fR¥¿¥°¤¬\fBjava\&.applet\&.Applet\fR¤Ê¤É¤ÎÊ̤Υѥ屡¼¥¸¤Î¥¯¥é¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ë¡¢Ì¾Á°¤¬¤É¤Î¤è¤¦¤Ëɽ¼¨¤µ¤ì¤ë¤«¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@see¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@see)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- See also: +-@see java\&.lang\&.String // String +-@see java\&.lang\&.String The String class // The String class +-@see String // String +-@see String#equals(Object) // String\&.equals(Object) +-@see String#equals // String\&.equals(java\&.lang\&.Object) +-@see java\&.lang\&.Object#wait(long) // java\&.lang\&.Object\&.wait(long) +-@see Character#MAX_RADIX // Character\&.MAX_RADIX +-@see <a href="spec\&.html">Java Spec</a> // Java Spec +-@see "The Java Programming Language" // "The Java Programming Language" ++\fB See also:\fR ++\fB@see java\&.lang\&.String // String \fR ++\fB@see java\&.lang\&.String The String class // The String class \fR ++\fB@see String // String \fR ++\fB@see String#equals(Object) // String\&.equals(Object) \fR ++\fB@see String#equals // String\&.equals(java\&.lang\&.Object) \fR ++\fB@see java\&.lang\&.Object#wait(long) // java\&.lang\&.Object\&.wait(long) \fR ++\fB@see Character#MAX_RADIX // Character\&.MAX_RADIX \fR ++\fB@see <a href="spec\&.html">Java Spec</a> // Java Spec \fR ++\fB@see "The Java Programming Language" // "The Java Programming Language" \fR ++ + .fi + .if n \{\ + .RE + .\} + .PP + \fBÃí°Õ:\fR +-\fI@se\fR\fIe\fR¥¿¥°¤ò³ÈÄ¥¤·¤Æ¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤¹¤ë¤Ë¤Ï¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fB@se\fR\fBe\fR¥¿¥°¤ò³ÈÄ¥¤·¤Æ¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤¹¤ë¤Ë¤Ï¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .PP + @serial \fIfield\-description\fR | include | exclude + .RS 4 +@@ -1961,11 +2030,11 @@ + Oracle¤ÎľÎ󲽤µ¤ì¤¿·Á¼°¤Î»ÅÍͤ˥¯¥é¥¹¤ò´Þ¤á¤ë´ð½à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/serialized\-criteria\-137781\&.html)¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fIfield\-description\fR(¾Êά²Äǽ)¤Ç¤Ï¡¢¥Õ¥£¡¼¥ë¥É¤Î°ÕÌ£¤òÀâÌÀ¤·¡¢¼è¤êÆÀ¤ëÃͤΥꥹ¥È¤ò¼¨¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£É¬Íפʾì¹ç¤Ï¡¢Ê£¿ô¤Î¹Ô¤ËÅϤäÆÀâÌÀ¤òµ­½Ò¤Ç¤­¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¤³¤Î¾ðÊó¤ò¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤ËÄɲä·¤Þ¤¹¡£Áê¸ß»²¾È¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBfield\-description\fR(¾Êά²Äǽ)¤Ç¤Ï¡¢¥Õ¥£¡¼¥ë¥É¤Î°ÕÌ£¤òÀâÌÀ¤·¡¢¼è¤êÆÀ¤ëÃͤΥꥹ¥È¤ò¼¨¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£É¬Íפʾì¹ç¤Ï¡¢Ê£¿ô¤Î¹Ô¤ËÅϤäÆÀâÌÀ¤òµ­½Ò¤Ç¤­¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ï¡¢¤³¤Î¾ðÊó¤ò¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤ËÄɲä·¤Þ¤¹¡£Áê¸ß»²¾È¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¥¯¥é¥¹¤òľÎ󲽤·¤¿¸å¤ËľÎó²½²Äǽ¥Õ¥£¡¼¥ë¥É¤ò¥¯¥é¥¹¤ËÄɲä·¤¿¾ì¹ç¡¢¼çÀâÌÀ¤Ë¡¢Äɲä·¤¿¥Ð¡¼¥¸¥ç¥ó¤ò¼±Ê̤¹¤ëʸ¤òÄɲ乤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fIinclude\fR¤ª¤è¤Ó\fIexclude\fR°ú¿ô¤Ï¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤Ë¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤á¤ë¤«½ü³°¤¹¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£¼¡¤Î¤è¤¦¤Ëµ¡Ç½¤·¤Þ¤¹¡£ ++\fBinclude\fR¤ª¤è¤Ó\fBexclude\fR°ú¿ô¤Ï¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¥Ú¡¼¥¸¤Ë¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤á¤ë¤«½ü³°¤¹¤ë¤«¤ò¼¨¤·¤Þ¤¹¡£¼¡¤Î¤è¤¦¤Ëµ¡Ç½¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1975,7 +2044,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fISerializable\fR¤ò¼ÂÁõ¤·¤Æ¤¤¤ëpublic¤Þ¤¿¤Ïprotected¥¯¥é¥¹¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥¯¥é¥¹¤¬Â°¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸)¤¬\fI@serial exclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤®¤ê¡¢´Þ¤á¤é¤ì¤Þ¤¹¡£ ++\fBSerializable\fR¤ò¼ÂÁõ¤·¤Æ¤¤¤ëpublic¤Þ¤¿¤Ïprotected¥¯¥é¥¹¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥¯¥é¥¹¤¬Â°¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸)¤¬\fB@serial exclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤®¤ê¡¢´Þ¤á¤é¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -1986,87 +2055,89 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fISerializable\fR¤ò¼ÂÁõ¤·¤Æ¤¤¤ëprivate¤Þ¤¿¤Ïpackage\-private¥¯¥é¥¹¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥¯¥é¥¹¤¬Â°¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸)¤¬\fI@serial include\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤®¤ê¡¢½ü³°¤µ¤ì¤Þ¤¹¡£ +-.RE +-.sp +-¤¿¤È¤¨¤Ð¡¢\fIjavax\&.swing\fR¥Ñ¥Ã¥±¡¼¥¸¤Ïpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.javaÆâ¤Ç\fI@serial\fR +-\fIexclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£public¥¯¥é¥¹\fIjava\&.security\&.BasicPermission\fR¤Ï\fI@serial exclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£package\-private¥¯¥é¥¹\fIjava\&.util\&.PropertyPermissionCollection\fR¤Ï\fI@serial include\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.sp +-¥¯¥é¥¹¡¦¥ì¥Ù¥ë¤Î\fI@serial\fR¥¿¥°¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥ì¥Ù¥ë¤Î\fI@serial\fR¥¿¥°¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ ++\fBSerializable\fR¤ò¼ÂÁõ¤·¤Æ¤¤¤ëprivate¤Þ¤¿¤Ïpackage\-private¥¯¥é¥¹¤Ï¡¢¤½¤Î¥¯¥é¥¹(¤Þ¤¿¤Ï¤½¤Î¥¯¥é¥¹¤¬Â°¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸)¤¬\fB@serial include\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤®¤ê¡¢½ü³°¤µ¤ì¤Þ¤¹¡£ ++.RE ++.sp ++¤¿¤È¤¨¤Ð¡¢\fBjavax\&.swing\fR¥Ñ¥Ã¥±¡¼¥¸¤Ïpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.javaÆâ¤Ç\fB@serial\fR ++\fBexclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£public¥¯¥é¥¹\fBjava\&.security\&.BasicPermission\fR¤Ï\fB@serial exclude\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£package\-private¥¯¥é¥¹\fBjava\&.util\&.PropertyPermissionCollection\fR¤Ï\fB@serial include\fR¥¿¥°¤Ç¥Þ¡¼¥¯¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.sp ++¥¯¥é¥¹¡¦¥ì¥Ù¥ë¤Î\fB@serial\fR¥¿¥°¤Ï¥Ñ¥Ã¥±¡¼¥¸¡¦¥ì¥Ù¥ë¤Î\fB@serial\fR¥¿¥°¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ + .RE + .PP + @serialData \fIdata\-description\fR + .RS 4 + JDK 1\&.2¤ÇƳÆþ + .sp +-¥Ç¡¼¥¿¤ÎÀâÌÀÃͤò»ÈÍѤ·¤Æ¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¤Ç¤Î¥Ç¡¼¥¿¤Î·¿¤È½ç½ø¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£¤³¤Î¥Ç¡¼¥¿¤Ë¤Ï¡¢\fIwriteObject\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤Æ½ñ¤­¹þ¤Þ¤ì¤ë¾Êά²Äǽ¤Ê¥Ç¡¼¥¿¡¢¤ª¤è¤Ó\fIExternalizable\&.writeExternal\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤Æ½ñ¤­¹þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Ç¡¼¥¿(¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤ò´Þ¤à)¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ +-.sp +-\fI@serialData\fR¥¿¥°¤Ï¡¢\fIwriteObject\fR¡¢\fIreadObject\fR¡¢\fIwriteExternal\fR¡¢\fIreadExternal\fR¡¢\fIwriteReplace\fR¤ª¤è¤Ó\fIreadResolve\fR¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£ ++¥Ç¡¼¥¿¤ÎÀâÌÀÃͤò»ÈÍѤ·¤Æ¡¢Ä¾Î󲽤µ¤ì¤¿·Á¼°¤Ç¤Î¥Ç¡¼¥¿¤Î·¿¤È½ç½ø¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£¤³¤Î¥Ç¡¼¥¿¤Ë¤Ï¡¢\fBwriteObject\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤Æ½ñ¤­¹þ¤Þ¤ì¤ë¾Êά²Äǽ¤Ê¥Ç¡¼¥¿¡¢¤ª¤è¤Ó\fBExternalizable\&.writeExternal\fR¥á¥½¥Ã¥É¤Ë¤è¤Ã¤Æ½ñ¤­¹þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Ç¡¼¥¿(¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤ò´Þ¤à)¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ ++.sp ++\fB@serialData\fR¥¿¥°¤Ï¡¢\fBwriteObject\fR¡¢\fBreadObject\fR¡¢\fBwriteExternal\fR¡¢\fBreadExternal\fR¡¢\fBwriteReplace\fR¤ª¤è¤Ó\fBreadResolve\fR¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + @serialField \fIfield\-name\fR \fIfield\-type\fR \fIfield\-description\fR + .RS 4 + JDK 1\&.2¤ÇƳÆþ + .sp +-\fISerializable\fR¥¯¥é¥¹¤Î\fIserialPersistentFields\fR¥á¥ó¥Ð¡¼¤Î\fIObjectStreamField\fR¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£\fIObjectStreamField\fR¥³¥ó¥Ý¡¼¥Í¥ó¥È¤´¤È¤Ë1¤Ä¤Î\fI@serialField\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fBSerializable\fR¥¯¥é¥¹¤Î\fBserialPersistentFields\fR¥á¥ó¥Ð¡¼¤Î\fBObjectStreamField\fR¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£\fBObjectStreamField\fR¥³¥ó¥Ý¡¼¥Í¥ó¥È¤´¤È¤Ë1¤Ä¤Î\fB@serialField\fR¥¿¥°¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + @since \fIsince\-text\fR + .RS 4 + JDK 1\&.1¤ÇƳÆþ + .sp +-À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢»ØÄꤵ¤ì¤¿\fIsince\-text\fR¤ÎÃͤÎ\fI¡ÖƳÆþ¤µ¤ì¤¿¥Ð¡¼¥¸¥ç¥ó¡×\fR¸«½Ð¤·¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ë¤Ï¡¢ÆÃÊ̤ÊÆâÉô¹½Â¤¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢ÆÃÄê¤ÎÊѹ¹¤Þ¤¿¤Ïµ¡Ç½¤¬¡¢\fIsince\-text\fR¤ÎÃͤˤè¤Ã¤Æ»ØÄꤵ¤ì¤¿¥½¥Õ¥È¥¦¥§¥¢¡¦¥ê¥ê¡¼¥¹°Ê¹ß¡¢Â¸ºß¤·¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@since 1\&.5\fR¤Ç¤¹¡£ +-.sp +-Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¾ì¹ç¡¢\fI@since\fR¥¿¥°¤Ï¡¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥àAPI»ÅÍͤΥС¼¥¸¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤¬¥ê¥Õ¥¡¥ì¥ó¥¹¼ÂÁõ¤ËÄɲ䵤줿»þ´ü¤ò¼¨¤¹¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£Ê£¿ô¤Î\fI@since\fR¥¿¥°¤ò»ÈÍѤǤ­¡¢Ê£¿ô¤Î\fI@author\fR¥¿¥°¤Î¤è¤¦¤Ë°·¤ï¤ì¤Þ¤¹¡£¥×¥í¥°¥é¥àÍ×ÁǤ¬Ê£¿ô¤ÎAPI¤Ç»ÈÍѤµ¤ì¤ë¾ì¹ç¡¢Ê£¿ô¤Î¥¿¥°¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢»ØÄꤵ¤ì¤¿\fBsince\-text\fR¤ÎÃͤÎ\fI¡ÖƳÆþ¤µ¤ì¤¿¥Ð¡¼¥¸¥ç¥ó¡×\fR¸«½Ð¤·¤òÄɲä·¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ë¤Ï¡¢ÆÃÊ̤ÊÆâÉô¹½Â¤¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¥¿¥°¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¡¢¤Ä¤Þ¤ê³µÍס¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤ÇÍ­¸ú¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢ÆÃÄê¤ÎÊѹ¹¤Þ¤¿¤Ïµ¡Ç½¤¬¡¢\fBsince\-text\fR¤ÎÃͤˤè¤Ã¤Æ»ØÄꤵ¤ì¤¿¥½¥Õ¥È¥¦¥§¥¢¡¦¥ê¥ê¡¼¥¹°Ê¹ß¡¢Â¸ºß¤·¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@since 1\&.5\fR¤Ç¤¹¡£ ++.sp ++Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¾ì¹ç¡¢\fB@since\fR¥¿¥°¤Ï¡¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥àAPI»ÅÍͤΥС¼¥¸¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤¬¥ê¥Õ¥¡¥ì¥ó¥¹¼ÂÁõ¤ËÄɲ䵤줿»þ´ü¤ò¼¨¤¹¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£Ê£¿ô¤Î\fB@since\fR¥¿¥°¤ò»ÈÍѤǤ­¡¢Ê£¿ô¤Î\fB@author\fR¥¿¥°¤Î¤è¤¦¤Ë°·¤ï¤ì¤Þ¤¹¡£¥×¥í¥°¥é¥àÍ×ÁǤ¬Ê£¿ô¤ÎAPI¤Ç»ÈÍѤµ¤ì¤ë¾ì¹ç¡¢Ê£¿ô¤Î¥¿¥°¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + @throws \fIclass\-name\fR \fIdescription\fR + .RS 4 + JDK 1\&.2¤ÇƳÆþ + .sp +-\fI@exception\fR¥¿¥°¤ÈƱ¤¸Æ°ºî¤ò¤·¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@throws¤Ë´Ø¤¹¤ë¹à ++\fB@exception\fR¥¿¥°¤ÈƱ¤¸Æ°ºî¤ò¤·¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@throws¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@exception)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fI@throws\fR¥¿¥°¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë\fIThrows\fR¾®¸«½Ð¤·¤òÄɲ䷤ơ¢\fIclass\-name\fR¤ª¤è¤Ó\fIdescription\fR¥Æ¥­¥¹¥È¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£\fIclass\-name\fR¤Ï¡¢¤½¤Î¥á¥½¥Ã¥É¤«¤é¥¹¥í¡¼¤µ¤ì¤ë²ÄǽÀ­¤Î¤¢¤ëÎã³°¤Î̾Á°¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤Î¤ßÍ­¸ú¤Ç¤¹¡£¤³¤Î¥¯¥é¥¹¤¬´°Á´»ØÄê¤Î̾Á°¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡º÷½ç½ø¤Ë½¾¤Ã¤Æ¥¯¥é¥¹¤òõ¤·¤Þ¤¹¡£Ê£¿ô¤Î\fI@throws\fR¥¿¥°¤ò¡¢Æ±¤¸Îã³°¤Þ¤¿¤Ï°ã¤¦Îã³°¤Î»ØÄꤷ¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯ºÑÎã³°¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë¡¢\fI@throws\fR¥¿¥°¤¬throwsÀáÆâ¤ÎÎã³°ÍѤ˸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fI@throws\fR¥¿¥°¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¤«¤Î¤è¤¦¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÎã³°¤¬HTML½ÐÎϤËÀâÌÀ¤Ê¤·¤ÇÄɲ䵤ì¤Þ¤¹¡£ +-.sp +-¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤ë¥á¥½¥Ã¥ÉÆâ¤ÇÎã³°¤¬ÌÀ¼¨Åª¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Î¤ß¡¢\fI@throws\fR¤Î¥É¥­¥å¥á¥ó¥È¤¬¤½¤Î¥á¥½¥Ã¥É¤«¤é¥µ¥Ö¥¯¥é¥¹¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥á¥½¥Ã¥É¤«¤é¼ÂÁõ¥á¥½¥Ã¥É¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¾ì¹ç¤âƱÍͤǤ¹¡£\fI{@inheritDoc}\fR¥¿¥°¤ò»ÈÍѤ·¤Æ¡¢\fI@throws\fR¥¿¥°¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤ò·Ñ¾µ¤¹¤ë¤è¤¦¤Ë¶¯À©¤Ç¤­¤Þ¤¹¡£ ++\fB@throws\fR¥¿¥°¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë\fIThrows\fR¾®¸«½Ð¤·¤òÄɲ䷤ơ¢\fBclass\-name\fR¤ª¤è¤Ó\fBdescription\fR¥Æ¥­¥¹¥È¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£\fIclass\-name\fR¤Ï¡¢¤½¤Î¥á¥½¥Ã¥É¤«¤é¥¹¥í¡¼¤µ¤ì¤ë²ÄǽÀ­¤Î¤¢¤ëÎã³°¤Î̾Á°¤Ç¤¹¡£¤³¤Î¥¿¥°¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç¤Î¤ßÍ­¸ú¤Ç¤¹¡£¤³¤Î¥¯¥é¥¹¤¬´°Á´»ØÄê¤Î̾Á°¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡º÷½ç½ø¤Ë½¾¤Ã¤Æ¥¯¥é¥¹¤òõ¤·¤Þ¤¹¡£Ê£¿ô¤Î\fB@throws\fR¥¿¥°¤ò¡¢Æ±¤¸Îã³°¤Þ¤¿¤Ï°ã¤¦Îã³°¤Î»ØÄꤷ¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£¡Ö@see¥¿¥°¤Î¸¡º÷½ç½ø¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯ºÑÎã³°¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë¡¢\fB@throws\fR¥¿¥°¤¬throwsÀáÆâ¤ÎÎã³°ÍѤ˸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fB@throws\fR¥¿¥°¤Ç¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¤«¤Î¤è¤¦¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÎã³°¤¬HTML½ÐÎϤËÀâÌÀ¤Ê¤·¤ÇÄɲ䵤ì¤Þ¤¹¡£ ++.sp ++¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤ë¥á¥½¥Ã¥ÉÆâ¤ÇÎã³°¤¬ÌÀ¼¨Åª¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Î¤ß¡¢\fB@throws\fR¤Î¥É¥­¥å¥á¥ó¥È¤¬¤½¤Î¥á¥½¥Ã¥É¤«¤é¥µ¥Ö¥¯¥é¥¹¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥á¥½¥Ã¥É¤«¤é¼ÂÁõ¥á¥½¥Ã¥É¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¾ì¹ç¤âƱÍͤǤ¹¡£\fB{@inheritDoc}\fR¥¿¥°¤ò»ÈÍѤ·¤Æ¡¢\fB@throws\fR¥¿¥°¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤ò·Ñ¾µ¤¹¤ë¤è¤¦¤Ë¶¯À©¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + {@value \fIpackage\&.class#field\fR} + .RS 4 + JDK 1\&.4¤ÇƳÆþ + .sp +-Äê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£\fI{@value}\fR¥¿¥°¤¬ÀÅŪ¥Õ¥£¡¼¥ë¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç°ú¿ô¤Ê¤·¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎÄê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£ ++Äê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£\fB{@value}\fR¥¿¥°¤¬ÀÅŪ¥Õ¥£¡¼¥ë¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç°ú¿ô¤Ê¤·¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎÄê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * The value of this constant is {@value}\&. +- */ +-public static final String SCRIPT_START = "<script>" ++\fB/**\fR ++\fB * The value of this constant is {@value}\&.\fR ++\fB */\fR ++\fBpublic static final String SCRIPT_START = "<script>"\fR ++ + .fi + .if n \{\ + .RE + .\} +-Ǥ°Õ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç°ú¿ô\fIpackage\&.class#field\fR¤¢¤ê¤Ç»ÈÍѤµ¤ì¤¿¾ì¹ç¡¢\fI{@value}\fR¥¿¥°¤Ï»ØÄꤵ¤ì¤¿Äê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£ ++Ǥ°Õ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Ç°ú¿ô\fBpackage\&.class#field\fR¤¢¤ê¤Ç»ÈÍѤµ¤ì¤¿¾ì¹ç¡¢\fB{@value}\fR¥¿¥°¤Ï»ØÄꤵ¤ì¤¿Äê¿ô¤ÎÃͤòɽ¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * Evaluates the script starting with {@value #SCRIPT_START}\&. +- */ +-public String evalScript(String script) {} ++\fB/**\fR ++\fB * Evaluates the script starting with {@value #SCRIPT_START}\&.\fR ++\fB */\fR ++\fBpublic String evalScript(String script) {}\fR ++ + .fi + .if n \{\ + .RE + .\} +-°ú¿ô\fIpackage\&.class#field\fR¤Ï¡¢\fI@see\fR¥¿¥°°ú¿ô¤ÈƱ°ì¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¥á¥ó¥Ð¡¼¤ÏÀÅŪ¥Õ¥£¡¼¥ë¥É¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++°ú¿ô\fBpackage\&.class#field\fR¤Ï¡¢\fB@see\fR¥¿¥°°ú¿ô¤ÈƱ°ì¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢¥á¥ó¥Ð¡¼¤ÏÀÅŪ¥Õ¥£¡¼¥ë¥É¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + ¤³¤ì¤é¤ÎÄê¿ô¤ÎÃͤϡÖÄê¿ô¥Õ¥£¡¼¥ë¥ÉÃÍ¡× + (http://docs\&.oracle\&.com/javase/8/docs/api/constant\-values\&.html)¤Ë¤âɽ¼¨¤µ¤ì¤Þ¤¹ +@@ -2076,34 +2147,34 @@ + .RS 4 + JDK 1\&.0¤ÇƳÆþ + .sp +-\fI\-version\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë\fI¡Ö¥Ð¡¼¥¸¥ç¥ó¡×\fR¾®¸«½Ð¤·¤òÄɲ䷤ơ¢»ØÄꤵ¤ì¤¿\fIversion\-text\fR¤ÎÃͤò½ñ¤­¹þ¤ß¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¤³¤Î¥³¡¼¥É¤¬´Þ¤Þ¤ì¤ë¥½¥Õ¥È¥¦¥§¥¢¤Î¸½ºß¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤òÊÝ»ý¤¹¤ë¤¿¤á¤Î¤â¤Î¤Ç¤¢¤ë¤Î¤ËÂФ·¡¢\fI@since\fR¥¿¥°¤Ï¡¢¤³¤Î¥³¡¼¥É¤¬Æ³Æþ¤µ¤ì¤¿¥ê¥ê¡¼¥¹ÈÖ¹æ¤òÊÝ»ý¤·¤Þ¤¹¡£\fIversion\-text\fR¤ÎÃͤˤϡ¢ÆÃÊ̤ÊÆâÉô¹½Â¤¤Ï¤¢¤ê¤Þ¤»¤ó¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@version¤Ë´Ø¤¹¤ë¹à ++\fB\-version\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë\fI¡Ö¥Ð¡¼¥¸¥ç¥ó¡×\fR¾®¸«½Ð¤·¤òÄɲ䷤ơ¢»ØÄꤵ¤ì¤¿\fBversion\-text\fR¤ÎÃͤò½ñ¤­¹þ¤ß¤Þ¤¹¡£¤³¤Î¥¿¥°¤Ï¤³¤Î¥³¡¼¥É¤¬´Þ¤Þ¤ì¤ë¥½¥Õ¥È¥¦¥§¥¢¤Î¸½ºß¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤òÊÝ»ý¤¹¤ë¤¿¤á¤Î¤â¤Î¤Ç¤¢¤ë¤Î¤ËÂФ·¡¢\fB@since\fR¥¿¥°¤Ï¡¢¤³¤Î¥³¡¼¥É¤¬Æ³Æþ¤µ¤ì¤¿¥ê¥ê¡¼¥¹ÈÖ¹æ¤òÊÝ»ý¤·¤Þ¤¹¡£\fBversion\-text\fR¤ÎÃͤˤϡ¢ÆÃÊ̤ÊÆâÉô¹½Â¤¤Ï¤¢¤ê¤Þ¤»¤ó¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î@version¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#@version)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËÊ£¿ô¤Î\fI@version\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£É¬Íפ˱þ¤¸¤Æ¡¢1¤Ä¤Î\fI@version\fR¥¿¥°¤Ë1¤Ä¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ê£¿ô¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Á°¼Ô¤Î¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ̾Á°¤È̾Á°¤Î´Ö¤Ë¥«¥ó¥Þ(,)¤È¶õÇòʸ»ú¤¬ÁÞÆþ¤µ¤ì¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¤Ï¡¢¥Æ¥­¥¹¥ÈÁ´ÂΤ¬²òÀϤµ¤ì¤ë¤³¤È¤Ê¤¯¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥«¥ó¥Þ¤Ç¤Ï¤Ê¤¯¡¢³Æ¸À¸ì¤ËÂбþ¤·¤¿Ì¾Á°¶èÀÚ¤êʸ»ú¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¤È¤­¤Ë¡¢1¹Ô¤ËÊ£¿ô¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++1¤Ä¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ËÊ£¿ô¤Î\fB@version\fR¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£É¬Íפ˱þ¤¸¤Æ¡¢1¤Ä¤Î\fB@version\fR¥¿¥°¤Ë1¤Ä¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ê£¿ô¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£Á°¼Ô¤Î¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ̾Á°¤È̾Á°¤Î´Ö¤Ë¥«¥ó¥Þ(,)¤È¶õÇòʸ»ú¤¬ÁÞÆþ¤µ¤ì¤Þ¤¹¡£¸å¼Ô¤Î¾ì¹ç¤Ï¡¢¥Æ¥­¥¹¥ÈÁ´ÂΤ¬²òÀϤµ¤ì¤ë¤³¤È¤Ê¤¯¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥«¥ó¥Þ¤Ç¤Ï¤Ê¤¯¡¢³Æ¸À¸ì¤ËÂбþ¤·¤¿Ì¾Á°¶èÀÚ¤êʸ»ú¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ë¤È¤­¤Ë¡¢1¹Ô¤ËÊ£¿ô¤Î̾Á°¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .SH "¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê" + .PP +-¤³¤³¤Ç¤Ï¡¢¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£¼¡¤Î¥¿¥°¤¬¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£\fI@see\fR¡¢\fI@since\fR¡¢\fI@deprecated\fR¡¢\fI{@link}\fR¡¢\fI{@linkplain}\fR¤ª¤è¤Ó\fI{@docroot}\fR¡£ ++¤³¤³¤Ç¤Ï¡¢¥¿¥°¤ò»ÈÍѤǤ­¤ë¾ì½ê¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£¼¡¤Î¥¿¥°¤¬¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤Þ¤¹¡£\fB@see\fR¡¢\fB@since\fR¡¢\fB@deprecated\fR¡¢\fB{@link}\fR¡¢\fB{@linkplain}\fR¤ª¤è¤Ó\fB{@docroot}\fR¡£ + .SS "³µÍ×¥¿¥°" + .PP + ³µÍ×¥¿¥°¤Ï¡¢³µÍ×¥Ú¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤Ç¤¹(¤³¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ï¡¢Ä̾ïoverview\&.html¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ê¤Þ¤¹)¡£Â¾¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¾ì¹ç¤ÈƱÍͤˡ¢¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢¼çÀâÌÀ¤Î¸å¤Ç»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-Java SE 1\&.2¤Ç¤Ï¡¢³µÍץɥ­¥å¥á¥ó¥ÈÆâ¤Î\fI{@link}\fR¥¿¥°¤ËÉÔ¶ñ¹ç¤¬¤¢¤ê¤Þ¤¹¡£¥Æ¥­¥¹¥È¤ÏÀµ¤·¤¯É½¼¨¤µ¤ì¤Þ¤¹¤¬¡¢¥ê¥ó¥¯¤¬ÀßÄꤵ¤ì¤Þ¤»¤ó¡£¸½ºß¤Î¤È¤³¤í¡¢\fI{@docRoot}\fR¥¿¥°¤Ï¡¢³µÍץɥ­¥å¥á¥ó¥ÈÆâ¤Ç¤Ïµ¡Ç½¤·¤Þ¤»¤ó¡£ ++Java SE 1\&.2¤Ç¤Ï¡¢³µÍץɥ­¥å¥á¥ó¥ÈÆâ¤Î\fB{@link}\fR¥¿¥°¤Ëbug¤¬¤¢¤ê¤Þ¤¹¡£¥Æ¥­¥¹¥È¤ÏÀµ¤·¤¯É½¼¨¤µ¤ì¤Þ¤¹¤¬¡¢¥ê¥ó¥¯¤¬ÀßÄꤵ¤ì¤Þ¤»¤ó¡£¸½ºß¤Î¤È¤³¤í¡¢\fB{@docRoot}\fR¥¿¥°¤Ï¡¢³µÍץɥ­¥å¥á¥ó¥ÈÆâ¤Ç¤Ïµ¡Ç½¤·¤Þ¤»¤ó¡£ + .PP + ³µÍ×¥¿¥°¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP + @see reference || @since since\-text || @serialField field\-name field\-type field\-description || @author name\-text || @version version\-text || {@link package\&.class#member label} || {@linkplain package\&.class#member label} || {@docRoot} || + .SS "¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°" + .PP +-¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤Ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ïpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.java¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤³¤Ç»ÈÍѤǤ­¤ë\fI@serial\fR¥¿¥°¤Ï¡¢\fIinclude\fR¤Þ¤¿¤Ï\fIexclude\fR°ú¿ô¤ò»ØÄꤷ¤¿¤â¤Î¤Î¤ß¤Ç¤¹¡£ ++¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤Ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ïpackage\&.html¤Þ¤¿¤Ïpackage\-info\&.java¤È¤¤¤¦Ì¾Á°¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤³¤Ç»ÈÍѤǤ­¤ë\fB@serial\fR¥¿¥°¤Ï¡¢\fBinclude\fR¤Þ¤¿¤Ï\fBexclude\fR°ú¿ô¤ò»ØÄꤷ¤¿¤â¤Î¤Î¤ß¤Ç¤¹¡£ + .PP + ¥Ñ¥Ã¥±¡¼¥¸¡¦¥¿¥°¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP + @see reference || @since since\-text || @serial field\-description | include | exclude || @author name\-text || @version version\-text || {@linkplain package\&.class#member label} || {@linkplain package\&.class#member label} || {@docRoot} || + .SS "¥¯¥é¥¹¤ª¤è¤Ó¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¦¥¿¥°" + .PP +-¼¡¤Ë¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤ò¼¨¤·¤Þ¤¹¡£\fI@serial\fR¥¿¥°¤Ï¡¢\fIinclude\fR¤Þ¤¿¤Ï\fIexclude\fR°ú¿ô¤ò»ØÄꤷ¤Æ¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤Ç¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++¼¡¤Ë¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤ò¼¨¤·¤Þ¤¹¡£\fB@serial\fR¥¿¥°¤Ï¡¢\fBinclude\fR¤Þ¤¿¤Ï\fBexclude\fR°ú¿ô¤ò»ØÄꤷ¤Æ¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤Ç¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .PP + @see reference || @since since\-text || @deprecated deprecated\-text || @serial field\-description | include | exclude || @author name\-text || @version version\-text || {@link package\&.class#member label} || {@linkplain package\&.class#member label} || {@docRoot} || + .PP +@@ -2113,22 +2184,23 @@ + .RS 4 + .\} + .nf +-/** +- * A class representing a window on the screen\&. +- * For example: +- * <pre> +- * Window win = new Window(parent); +- * win\&.show(); +- * </pre> +- * +- * @author Sami Shaio +- * @version 1\&.13, 06/08/06 +- * @see java\&.awt\&.BaseWindow +- * @see java\&.awt\&.Button +- */ +-class Window extends BaseWindow { +- \&.\&.\&. +-} ++\fB/**\fR ++\fB * A class representing a window on the screen\&.\fR ++\fB * For example:\fR ++\fB * <pre>\fR ++\fB * Window win = new Window(parent);\fR ++\fB * win\&.show();\fR ++\fB * </pre>\fR ++\fB *\fR ++\fB * @author Sami Shaio\fR ++\fB * @version 1\&.13, 06/08/06\fR ++\fB * @see java\&.awt\&.BaseWindow\fR ++\fB * @see java\&.awt\&.Button\fR ++\fB */\fR ++\fBclass Window extends BaseWindow {\fR ++\fB \&.\&.\&.\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -2145,25 +2217,26 @@ + .RS 4 + .\} + .nf +- /** +- * The X\-coordinate of the component\&. +- * +- * @see #getLocation() +- */ +- int x = 1263732; ++\fB /**\fR ++\fB * The X\-coordinate of the component\&.\fR ++\fB *\fR ++\fB * @see #getLocation()\fR ++\fB */\fR ++\fB int x = 1263732;\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥³¥ó¥¹¥È¥é¥¯¥¿¤È¥á¥½¥Ã¥É¡¦¥¿¥°" + .PP +-¼¡¤Ë¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Þ¤¿¤Ï¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤ò¼¨¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fI@return\fR¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¤Ï»ÈÍѤǤ­¤º¡¢ +-\fI{@inheritDoc}\fR¤Ë¤ÏÀ©¸Â¤¬¤¢¤ê¤Þ¤¹¡£ ++¼¡¤Ë¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤Þ¤¿¤Ï¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç»ÈÍѤǤ­¤ë¥¿¥°¤ò¼¨¤·¤Þ¤¹¡£¤¿¤À¤·¡¢\fB@return\fR¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¤Ï»ÈÍѤǤ­¤º¡¢ ++\fB{@inheritDoc}\fR¤Ë¤ÏÀ©¸Â¤¬¤¢¤ê¤Þ¤¹¡£ + .PP + @see reference || @since since\-text || @deprecated deprecated\-text || @param parameter\-name description || @return description || @throws class\-name description || @exception class\-name description || @serialData data\-description || {@link package\&.class#member label} || {@linkplain package\&.class#member label} || {@inheritDoc} || {@docRoot} + .PP + \fBÃí°Õ:\fR +-\fI@serialData\fR¥¿¥°¤Ï¡¢\fIwriteObject\fR¡¢\fIreadObject\fR¡¢\fIwriteExternal\fR¡¢\fIreadExternal\fR¡¢\fIwriteReplace\fR¤ª¤è¤Ó\fIreadResolve\fR¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++\fB@serialData\fR¥¿¥°¤Ï¡¢\fBwriteObject\fR¡¢\fBreadObject\fR¡¢\fBwriteExternal\fR¡¢\fBreadExternal\fR¡¢\fBwriteReplace\fR¤ª¤è¤Ó\fBreadResolve\fR¥á¥½¥Ã¥É¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ç¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .PP + ¥á¥½¥Ã¥É¡¦¥³¥á¥ó¥È¤ÎÎã: + .sp +@@ -2171,27 +2244,28 @@ + .RS 4 + .\} + .nf +-/** +- * Returns the character at the specified index\&. An index +- * ranges from <code>0</code> to <code>length() \- 1</code> +- * +- * @param index the index of the desired character\&. +- * @return the desired character\&. +- * @exception StringIndexOutOfRangeException +- * if the index is not in the range <code>0</code> +- * to <code>length()\-1</code> +- * @see java\&.lang\&.Character#charValue() +- */ +- public char charAt(int index) { +- \&.\&.\&. +- } ++\fB/**\fR ++\fB * Returns the character at the specified index\&. An index \fR ++\fB * ranges from <code>0</code> to <code>length() \- 1</code>\fR ++\fB *\fR ++\fB * @param index the index of the desired character\&.\fR ++\fB * @return the desired character\&.\fR ++\fB * @exception StringIndexOutOfRangeException \fR ++\fB * if the index is not in the range <code>0</code> \fR ++\fB * to <code>length()\-1</code>\fR ++\fB * @see java\&.lang\&.Character#charValue()\fR ++\fB */\fR ++\fB public char charAt(int index) {\fR ++\fB \&.\&.\&.\fR ++\fB }\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ½ÐÎϤò·èÄꤷ¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢Ç¤°Õ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤È¤È¤â¤Ë»ÈÍѤǤ­¤ë¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc¥ª¥×¥·¥ç¥ó¤ÇÀâÌÀ¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¤³¤Î¾¤Ë¡¢¤¤¤¯¤Ä¤«¤ÎÄɲäΥ³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬Ä󶡤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ª¥×¥·¥ç¥ó¤ÇÀâÌÀ¤·¤Þ¤¹¡£¤É¤Î¥ª¥×¥·¥ç¥ó̾¤â¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ç¤Ï¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ½ÐÎϤò·èÄꤷ¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç°Ê³°¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢Ç¤°Õ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤È¤È¤â¤Ë»ÈÍѤǤ­¤ë¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc¥ª¥×¥·¥ç¥ó¤ÇÀâÌÀ¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¤³¤Î¾¤Ë¡¢¤¤¤¯¤Ä¤«¤ÎÄɲäΥ³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬Ä󶡤µ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ª¥×¥·¥ç¥ó¤ÇÀâÌÀ¤·¤Þ¤¹¡£¤É¤Î¥ª¥×¥·¥ç¥ó̾¤â¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ç¤Ï¡¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2218,39 +2292,44 @@ + ¥ª¥×¥·¥ç¥ó¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP + \-1\&.1 || \-author || \-bootclasspath classpathlist || \-bottom text || \-breakiterator || \-charset name || \-classpath classpathlist || \-d directory || \-docencoding name || \-docfilesubdirs || \-doclet class || \-docletpath classpathlist || \-doctitle title || \-encoding || \-exclude packagename1:packagename2:\&.\&.\&. || \-excludedocfilessubdir name1:name2 || \-extdirs dirist || \-footer footer || \-group groupheading packagepattern:packagepattern || \-header header || \-help || \-helpfile path\efilename || \-Jflag || \-keywords || \-link extdocURL || \-linkoffline extdocURL packagelistLoc || \-linksource || \-locale language_country_variant || \-nocomment || \-nodeprecated || \-nodeprecatedlist || \-nohelp || \-noindex || \-nonavbar || \-noqualifier all | packagename1:packagename2\&.\&.\&. || \-nosince || \-notimestamp || \-notree || +-\fI\-overview path/filename || \fR\-package || \-private || \-protected || \-public || \-quiet || \-serialwarn || \-source release || \-sourcepath sourcepathlist || \-sourcetab tablength || \-splitindex || +-\fI\-stylesheet path/filename || \fR\-subpackages package1:package2:\&.\&.\&. || \-tag tagname:Xaoptcmf:"taghead" || \-taglet class || \-tagletpath tagletpathlist || \-title title || \-top || \-use || \-verbose || \-version || \-windowtitle title +-.PP +-¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤Ë»ÈÍѲÄǽ¤Ê¥³¥¢¤ÎJavadoc¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤Î¾¤ÎÉôʬ¤òÄ󶡤·¤Þ¤¹¡£\fI\-bootclasspath\fR¡¢\fI\-breakiterator\fR¡¢\fI\-classpath\fR¡¢\fI\-doclet\fR¡¢\fI\-docletpath\fR¡¢\fI\-encoding\fR¡¢\-\fIexclude\fR¡¢\fI\-extdirs\fR¡¢\fI\-help\fR¡¢\fI\-locale\fR¡¢\fI\-\fR\fIoverview\fR¡¢\fI\-package\fR¡¢\fI\-private\fR¡¢\fI\-protected\fR¡¢\fI\-public\fR¡¢\fI\-quiet\fR¡¢\fI\-source\fR¡¢\fI\-sourcepath\fR¡¢\fI\-subpackages\fR¤ª¤è¤Ó\fI\-verbose\fR¡£ ++ ++\-overview path/filename || ++\-package || \-private || \-protected || \-public || \-quiet || \-serialwarn || \-source release || \-sourcepath sourcepathlist || \-sourcetab tablength || \-splitindex || ++ ++\-stylesheet path/filename || ++ ++||\-subpackages package1:package2:\&.\&.\&. || \-tag tagname:Xaoptcmf:"taghead" || \-taglet class || \-tagletpath tagletpathlist || \-title title || \-top || \-use || \-verbose || \-version || \-windowtitle title ++.PP ++¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¤¹¤Ù¤Æ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤Ë»ÈÍѲÄǽ¤Ê¥³¥¢¤ÎJavadoc¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Ç¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤Î¾¤ÎÉôʬ¤òÄ󶡤·¤Þ¤¹¡£\fB\-bootclasspath\fR¡¢\fB\-breakiterator\fR¡¢\fB\-classpath\fR¡¢\fB\-doclet\fR¡¢\fB\-docletpath\fR¡¢\fB\-encoding\fR¡¢\-\fBexclude\fR¡¢\fB\-extdirs\fR¡¢\fB\-help\fR¡¢\fB\-locale\fR¡¢\fB\-\fR\fBoverview\fR¡¢\fB\-package\fR¡¢\fB\-private\fR¡¢\fB\-protected\fR¡¢\fB\-public\fR¡¢\fB\-quiet\fR¡¢\fB\-source\fR¡¢\fB\-sourcepath\fR¡¢\fB\-subpackages\fR¤ª¤è¤Ó\fB\-verbose\fR¡£ + .SS "Javadoc¥ª¥×¥·¥ç¥ó" + .PP + \-overview \fIpath/filename \fR + .RS 4 + +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢\fIpath/filename \fR¤Ç»ØÄꤵ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é³µÍץɥ­¥å¥á¥ó¥ÈÍѤΥƥ­¥¹¥È¤ò¼èÆÀ¤·¡¢¤½¤Î¥Æ¥­¥¹¥È¤ò³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¤ËÇÛÃÖ¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£\fIpath/filename\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤Ç¤¹¡£ +-.sp +-\fIfilename\fR¤ÎÃͤÇǤ°Õ¤Î̾Á°¤ò»ÈÍѤ·¡¢path¤ÇǤ°Õ¤ÎÇÛÃÖÀè¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢Ä̾ï¤Ïoverview\&.html¤È¤¤¤¦Ì¾Á°¤òÉÕ¤±¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤ÎºÇ¾å°Ì¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¤Þ¤¹¡£¤³¤Î¾ì½ê¤ËÇÛÃÖ¤¹¤ë¤È¡¢¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤È¤­¤Ëpath¤ò»ØÄꤹ¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤¬»Ø¤·¼¨¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢\fIjava\&.lang\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤¬/src/classes/java/lang/¤Î¾ì¹ç¡¢³µÍ×¥Õ¥¡¥¤¥ë¤ò/src/classes/overview\&.html¤ËÇÛÃ֤Ǥ­¤Þ¤¹ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢\fIpath/filename \fR¤Ç»ØÄꤵ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é³µÍץɥ­¥å¥á¥ó¥ÈÍѤΥƥ­¥¹¥È¤ò¼èÆÀ¤·¡¢¤½¤Î¥Æ¥­¥¹¥È¤ò³µÍ×¥Ú¡¼¥¸(overview\-summary\&.html)¤ËÇÛÃÖ¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£\fIpath/filename\fR¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤Ç¤¹¡£ ++.sp ++\fBfilename\fR¤ÎÃͤÇǤ°Õ¤Î̾Á°¤ò»ÈÍѤ·¡¢path¤ÇǤ°Õ¤ÎÇÛÃÖÀè¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢Ä̾ï¤Ïoverview\&.html¤È¤¤¤¦Ì¾Á°¤òÉÕ¤±¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤ÎºÇ¾å°Ì¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ËÇÛÃÖ¤·¤Þ¤¹¡£¤³¤Î¾ì½ê¤ËÇÛÃÖ¤¹¤ë¤È¡¢¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤È¤­¤Ëpath¤ò»ØÄꤹ¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤¬»Ø¤·¼¨¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢\fBjava\&.lang\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤¬/src/classes/java/lang/¤Î¾ì¹ç¡¢³µÍ×¥Õ¥¡¥¤¥ë¤ò/src/classes/overview\&.html¤ËÇÛÃ֤Ǥ­¤Þ¤¹ + .sp + ¼ÂºÝ¤ÎÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fIpath/filename\fR¤Ç»ØÄꤹ¤ë¥Õ¥¡¥¤¥ë¤Ë¤Ä¤¤¤Æ¤Ï¡¢³µÍ×¥³¥á¥ó¥È¡¦¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-³µÍ×¥Ú¡¼¥¸¤¬ºîÀ®¤µ¤ì¤ë¤Î¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢HTML¥Õ¥ì¡¼¥à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£³µÍ×¥Ú¡¼¥¸¤Î¥¿¥¤¥È¥ë¤Ï¡¢\fI\-doctitle\fR¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£ ++³µÍ×¥Ú¡¼¥¸¤¬ºîÀ®¤µ¤ì¤ë¤Î¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ·¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢HTML¥Õ¥ì¡¼¥à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£³µÍ×¥Ú¡¼¥¸¤Î¥¿¥¤¥È¥ë¤Ï¡¢\fB\-doctitle\fR¤Ë¤è¤Ã¤ÆÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .PP + \-Xdoclint:(all|none|[\-]\fI<group>\fR) + .RS 4 + ÉÔÀµ¤Ê»²¾È¡¢¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¤Î·çÍ¤è¤ÓJavadoc¥³¥á¥ó¥È¤ÎÉÔ­¤Î·Ù¹ð¤ò¥ì¥Ý¡¼¥È¤·¡¢Ìµ¸ú¤ÊJavadoc¹½Ê¸¤ª¤è¤ÓÉÔ­¤·¤Æ¤¤¤ëHTML¥¿¥°¤Î¥¨¥é¡¼¤ò¥ì¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ÏÀ¸À®¤µ¤ì¤¿½ÐÎϤ˴ޤޤì¤ë¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È¡¦¥³¥á¥ó¥È¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£Ä̾ï¤É¤ª¤ê¡¢É¸½à¥ª¥×¥·¥ç¥ó\fI\-public\fR¡¢\fI\-protected\fR¡¢\fI\-package\fR¤ª¤è¤Ó\fI\-private\fR¤ÇÀ¸À®¤µ¤ì¤¿½ÐÎϤ˴ޤà¹àÌܤòÁªÂò¤Ç¤­¤Þ¤¹¡£ +-.sp +-\fI\-Xdoclint\fR¤¬Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fIjavac\fR¥³¥Þ¥ó¥É¤ÈƱÍͤ˥á¥Ã¥»¡¼¥¸¤ÇÌäÂ꤬¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥á¥Ã¥»¡¼¥¸¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤ª¤è¤Ó¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿Àµ³Î¤Ê°ÌÃÖ¤ò»Ø¤¹¥­¥ã¥ì¥Ã¥È¤ò½ÐÎϤ·¤Þ¤¹¡£¥á¥Ã¥»¡¼¥¸¤Ï¡¢½ÅÂçÅÙ¡¢¤ª¤è¤ÓÀ¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¬¥Ð¥ê¥Ç¡¼¥¿¤ò»ÈÍѤ·¤Æ¼Â¹Ô¤µ¤ì¤¿¾ì¹ç¤Ë¥¨¥é¡¼¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤Ë±þ¤¸¤Æ¡¢·Ù¹ð¤Þ¤¿¤Ï¥¨¥é¡¼¤Ë¤Ê¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢ÉÔÀµ¤Ê»²¾È¤Þ¤¿¤ÏJavadoc¥³¥á¥ó¥È¤Î·çÍî¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬Ìµ¸ú¤ÊHTML¤òÀ¸À®¤¹¤ë¸¶°ø¤Ë¤Ê¤é¤Ê¤¤¤¿¤á¡¢¤³¤ì¤é¤ÎÌäÂê¤Ï·Ù¹ð¤È¤·¤Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£¹½Ê¸¥¨¥é¡¼¤Þ¤¿¤ÏHTML½ªÎ»¥¿¥°¤Î·çÍî¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬Ìµ¸ú¤ÊHTML¤òÀ¸À®¤¹¤ë¸¶°ø¤Ë¤Ê¤ë¤¿¤á¡¢¤³¤ì¤é¤ÎÌäÂê¤Ï¥¨¥é¡¼¤È¤·¤Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£ +-.sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó\fI\-Xdoclint:none\fR¤Ç̵¸ú¤Ë¤·¤Þ¤¹¡£ +-.sp +-\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤Ç¥ì¥Ý¡¼¥È¤µ¤ì¤ëÆâÍƤϼ¡¤Î¥ª¥×¥·¥ç¥ó¤ÇÊѹ¹¤·¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ÏÀ¸À®¤µ¤ì¤¿½ÐÎϤ˴ޤޤì¤ë¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È¡¦¥³¥á¥ó¥È¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£Ä̾ï¤É¤ª¤ê¡¢É¸½à¥ª¥×¥·¥ç¥ó\fB\-public\fR¡¢\fB\-protected\fR¡¢\fB\-package\fR¤ª¤è¤Ó\fB\-private\fR¤ÇÀ¸À®¤µ¤ì¤¿½ÐÎϤ˴ޤà¹àÌܤòÁªÂò¤Ç¤­¤Þ¤¹¡£ ++.sp ++\fB\-Xdoclint\fR¤¬Í­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fBjavac\fR¥³¥Þ¥ó¥É¤ÈƱÍͤ˥á¥Ã¥»¡¼¥¸¤ÇÌäÂ꤬¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥á¥Ã¥»¡¼¥¸¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤ª¤è¤Ó¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿Àµ³Î¤Ê°ÌÃÖ¤ò»Ø¤¹¥­¥ã¥ì¥Ã¥È¤ò½ÐÎϤ·¤Þ¤¹¡£¥á¥Ã¥»¡¼¥¸¤Ï¡¢½ÅÂçÅÙ¡¢¤ª¤è¤ÓÀ¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥È¤¬¥Ð¥ê¥Ç¡¼¥¿¤ò»ÈÍѤ·¤Æ¼Â¹Ô¤µ¤ì¤¿¾ì¹ç¤Ë¥¨¥é¡¼¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤Ë±þ¤¸¤Æ¡¢·Ù¹ð¤Þ¤¿¤Ï¥¨¥é¡¼¤Ë¤Ê¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢ÉÔÀµ¤Ê»²¾È¤Þ¤¿¤ÏJavadoc¥³¥á¥ó¥È¤Î·çÍî¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬Ìµ¸ú¤ÊHTML¤òÀ¸À®¤¹¤ë¸¶°ø¤Ë¤Ê¤é¤Ê¤¤¤¿¤á¡¢¤³¤ì¤é¤ÎÌäÂê¤Ï·Ù¹ð¤È¤·¤Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£¹½Ê¸¥¨¥é¡¼¤Þ¤¿¤ÏHTML½ªÎ»¥¿¥°¤Î·çÍî¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬Ìµ¸ú¤ÊHTML¤òÀ¸À®¤¹¤ë¸¶°ø¤Ë¤Ê¤ë¤¿¤á¡¢¤³¤ì¤é¤ÎÌäÂê¤Ï¥¨¥é¡¼¤È¤·¤Æ¥ì¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£ ++.sp ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó\fB\-Xdoclint:none\fR¤Ç̵¸ú¤Ë¤·¤Þ¤¹¡£ ++.sp ++\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤Ç¥ì¥Ý¡¼¥È¤µ¤ì¤ëÆâÍƤϼ¡¤Î¥ª¥×¥·¥ç¥ó¤ÇÊѹ¹¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2260,8 +2339,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-Xdoclint\fR\fI\fR\fI none\fR: +-\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£ ++\fB\-Xdoclint none\fR: ++\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2272,7 +2351,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-Xdoclint\fR\fI\fR\fI \fR\fIgroup\fR: ++\fB\-Xdoclint \fR\fIgroup\fR: + \fIgroup\fR¥Á¥§¥Ã¥¯¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .sp +@@ -2284,7 +2363,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-Xdoclint\fR\fI\fR\fI all\fR: ¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ ++\fB\-Xdoclint all\fR: ¤¹¤Ù¤Æ¤Î¥Á¥§¥Ã¥¯¡¦¥°¥ë¡¼¥×¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2295,7 +2374,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-Xdoclint\fR\fI\fR\fI all,\fR\fI\-group\fR: ++\fB\-Xdoclint all,\fR\fI\-group\fR: + \fIgroup\fR¥Á¥§¥Ã¥¯°Ê³°¤Î¤¹¤Ù¤Æ¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .sp +@@ -2309,7 +2388,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIaccessibility\fR: ¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¡¦¥Á¥§¥Ã¥«¤Ç¸¡½Ð¤¹¤ëÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢\fI<table>\fR¥¿¥°¤Ç»ØÄꤵ¤ì¤ëno caption¤Þ¤¿¤Ïsummary°À­)¡£ ++\fBaccessibility\fR: ¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¡¦¥Á¥§¥Ã¥«¤Ç¸¡½Ð¤¹¤ëÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢\fB<table>\fR¥¿¥°¤Ç»ØÄꤵ¤ì¤ëno caption¤Þ¤¿¤Ïsummary°À­)¡£ + .RE + .sp + .RS 4 +@@ -2320,7 +2399,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIhtml\fR: ¥¤¥ó¥é¥¤¥óÍ×ÁǤؤΥ֥í¥Ã¥¯Í×ÁǤÎÁÞÆþ¤ä½ªÎ»¥¿¥°¤òɬÍפȤ¹¤ëÍ×ÁǤò½ªÎ»¤·¤Ê¤¤¤Ê¤É¡¢¾å°Ì¥ì¥Ù¥ëHTML¤ÎÌäÂê¤ò¸¡½Ð¤·¤Þ¤¹¡£¥ë¡¼¥ë¤Ï¡¢HTML 4\&.01»ÅÍͤ«¤éƳ½Ð¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¿¥¤¥×¤Î¥Á¥§¥Ã¥¯¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥Ö¥é¥¦¥¶¤¬¼õ¤±Æþ¤ì¤ë²ÄǽÀ­¤Î¤¢¤ëHTML¤ÎÌäÂê¤ò¸¡½Ð¤·¤Þ¤¹¡£ ++\fBhtml\fR: ¥¤¥ó¥é¥¤¥óÍ×ÁǤؤΥ֥í¥Ã¥¯Í×ÁǤÎÁÞÆþ¤ä½ªÎ»¥¿¥°¤òɬÍפȤ¹¤ëÍ×ÁǤò½ªÎ»¤·¤Ê¤¤¤Ê¤É¡¢¾å°Ì¥ì¥Ù¥ëHTML¤ÎÌäÂê¤ò¸¡½Ð¤·¤Þ¤¹¡£¥ë¡¼¥ë¤Ï¡¢HTML 4\&.01»ÅÍͤ«¤éƳ½Ð¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¿¥¤¥×¤Î¥Á¥§¥Ã¥¯¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤òÍ­¸ú¤Ë¤·¤Æ¡¢¥Ö¥é¥¦¥¶¤¬¼õ¤±Æþ¤ì¤ë²ÄǽÀ­¤Î¤¢¤ëHTML¤ÎÌäÂê¤ò¸¡½Ð¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2331,7 +2410,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fImissing\fR: ·çÍ¤Æ¤¤¤ëJavadoc¥³¥á¥ó¥È¤Þ¤¿¤Ï¥¿¥°¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢·çÍ¤Æ¤¤¤ë¥³¥á¥ó¥È¤ä¥¯¥é¥¹¡¢¤Þ¤¿¤Ï·çÍ¤Æ¤¤¤ë\fI@return\fR¥¿¥°¤ä¥á¥½¥Ã¥É¾å¤ÎƱÍͤΥ¿¥°)¡£ ++\fBmissing\fR: ·çÍ¤Æ¤¤¤ëJavadoc¥³¥á¥ó¥È¤Þ¤¿¤Ï¥¿¥°¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢·çÍ¤Æ¤¤¤ë¥³¥á¥ó¥È¤ä¥¯¥é¥¹¡¢¤Þ¤¿¤Ï·çÍ¤Æ¤¤¤ë\fB@return\fR¥¿¥°¤ä¥á¥½¥Ã¥É¾å¤ÎƱÍͤΥ¿¥°)¡£ + .RE + .sp + .RS 4 +@@ -2342,7 +2421,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIreference\fR: Javadoc¥¿¥°¤ÎJava APIÍ×ÁǤλ²¾È¤Ë´ØÏ¢¤¹¤ëÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢\fI@see\fR¤Ç¸«¤Ä¤«¤é¤Ê¤¤¹àÌÜ¡¢¤Þ¤¿¤Ï\fI@param\fR¤Î¸å¤ÎÉÔÀµ¤Ê̾Á°)¡£ ++\fBreference\fR: Javadoc¥¿¥°¤ÎJava APIÍ×ÁǤλ²¾È¤Ë´ØÏ¢¤¹¤ëÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹(¤¿¤È¤¨¤Ð¡¢\fB@see\fR¤Ç¸«¤Ä¤«¤é¤Ê¤¤¹àÌÜ¡¢¤Þ¤¿¤Ï\fB@param\fR¤Î¸å¤ÎÉÔÀµ¤Ê̾Á°)¡£ + .RE + .sp + .RS 4 +@@ -2353,25 +2432,26 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIsyntax\fR: ¥¨¥¹¥±¡¼¥×¤µ¤ì¤Æ¤¤¤Ê¤¤»³¥«¥Ã¥³(\fI<\fR¤ª¤è¤Ó\fI>\fR)¤ä¥¢¥ó¥Ñ¥µ¥ó¥É(\fI&\fR)¡¢Ìµ¸ú¤ÊJavadoc¥¿¥°¤Ê¤É¤Î²¼°Ì¥ì¥Ù¥ë¤ÎÌäÂê¤ò³Îǧ¤·¤Þ¤¹¡£ +-.RE +-.sp +-\fI\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄꤷ¤Æ¡¢Ê£¿ô¤Î¥«¥Æ¥´¥ê¤Î¥¨¥é¡¼¤È·Ù¹ð¤ò¥Á¥§¥Ã¥¯¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢Á°¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¥«¥Æ¥´¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Î¤¤¤º¤ì¤«¤ò»ÈÍѤ·¤Æ¡¢\fIfilename\fR¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¡¢¹½Ê¸¤ª¤è¤Ó¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¤ÎÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ ++\fBsyntax\fR: ¥¨¥¹¥±¡¼¥×¤µ¤ì¤Æ¤¤¤Ê¤¤»³¥«¥Ã¥³(\fB<\fR¤ª¤è¤Ó\fB>\fR)¤ä¥¢¥ó¥Ñ¥µ¥ó¥É(\fB&\fR)¡¢Ìµ¸ú¤ÊJavadoc¥¿¥°¤Ê¤É¤Î²¼°Ì¥ì¥Ù¥ë¤ÎÌäÂê¤ò³Îǧ¤·¤Þ¤¹¡£ ++.RE ++.sp ++\fB\-Xdoclint\fR¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄꤷ¤Æ¡¢Ê£¿ô¤Î¥«¥Æ¥´¥ê¤Î¥¨¥é¡¼¤È·Ù¹ð¤ò¥Á¥§¥Ã¥¯¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÍ­¸ú¤Ë¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢Á°¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¥«¥Æ¥´¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Î¤¤¤º¤ì¤«¤ò»ÈÍѤ·¤Æ¡¢\fIfilename\fR¥Õ¥¡¥¤¥ëÆâ¤ÎHTML¡¢¹½Ê¸¤ª¤è¤Ó¥¢¥¯¥»¥·¥Ó¥ê¥Æ¥£¤ÎÌäÂê¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-Xdoclint:html \-Xdoclint:syntax \-Xdoclint:accessibility \fIfilename\fR +-javadoc \-Xdoclint:html,syntax,accessibility \fIfilename\fR ++\fBjavadoc \-Xdoclint:html \-Xdoclint:syntax \-Xdoclint:accessibility \fR\fB\fIfilename\fR\fR ++\fBjavadoc \-Xdoclint:html,syntax,accessibility \fR\fB\fIfilename\fR\fR ++ + .fi + .if n \{\ + .RE + .\} + \fBÃí°Õ:\fR +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤ì¤é¤Î¥Á¥§¥Ã¥¯¤Î´°Á´À­¤ÏÊݾڤµ¤ì¤Þ¤»¤ó¡£¶ñÂÎŪ¤Ë¤Ï¡¢´°Á´¤ÊHTML¥³¥ó¥×¥é¥¤¥¢¥ó¥¹¡¦¥Á¥§¥Ã¥«¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\-\fIXdoclint\fR¥ª¥×¥·¥ç¥ó¤ÎÌÜŪ¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤òÍ­¸ú¤Ë¤·¤Æ°ìÈÌŪ¤Ê¥¨¥é¡¼¤ÎÂçȾ¤ò¥ì¥Ý¡¼¥È¤¹¤ë¤³¤È¤Ç¤¹¡£ +-.sp +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Ìµ¸ú¤ÊÆþÎϤν¤Àµ¤ò»î¹Ô¤»¤º¡¢¥ì¥Ý¡¼¥È¤Î¤ß¹Ô¤¤¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤ì¤é¤Î¥Á¥§¥Ã¥¯¤Î´°Á´À­¤ÏÊݾڤµ¤ì¤Þ¤»¤ó¡£¶ñÂÎŪ¤Ë¤Ï¡¢´°Á´¤ÊHTML¥³¥ó¥×¥é¥¤¥¢¥ó¥¹¡¦¥Á¥§¥Ã¥«¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\-\fBXdoclint\fR¥ª¥×¥·¥ç¥ó¤ÎÌÜŪ¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤òÍ­¸ú¤Ë¤·¤Æ°ìÈÌŪ¤Ê¥¨¥é¡¼¤ÎÂçȾ¤ò¥ì¥Ý¡¼¥È¤¹¤ë¤³¤È¤Ç¤¹¡£ ++.sp ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢Ìµ¸ú¤ÊÆþÎϤν¤Àµ¤ò»î¹Ô¤»¤º¡¢¥ì¥Ý¡¼¥È¤Î¤ß¹Ô¤¤¤Þ¤¹¡£ + .RE + .PP + \-public +@@ -2396,18 +2476,18 @@ + .PP + \-help + .RS 4 +-¥ª¥ó¥é¥¤¥ó¡¦¥Ø¥ë¥×¤òɽ¼¨¤·¤Þ¤¹¡£\fIjavadoc\fR¤È\fI¥É¥Ã¥¯¥ì¥Ã¥È\fR¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£ ++¥ª¥ó¥é¥¤¥ó¡¦¥Ø¥ë¥×¤òɽ¼¨¤·¤Þ¤¹¡£\fBjavadoc\fR¤È\fB¥É¥Ã¥¯¥ì¥Ã¥È\fR¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-doclet \fIclass\fR + .RS 4 +-¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤òµ¯Æ°¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£´°Á´½¤¾þ̾¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤Ë¤è¤ê¡¢½ÐÎϤÎÆâÍƤȷÁ¼°¤¬ÄêµÁ¤µ¤ì¤Þ¤¹¡£\fI\-doclet\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¥Ç¥Õ¥©¥ë¥È¤ÎHTML·Á¼°¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¤Ë¤Ï\fIstart(Root)\fR¥á¥½¥Ã¥É¤¬´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Îµ¯Æ°¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤Ï\fI\-docletpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× ++¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤òµ¯Æ°¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£´°Á´½¤¾þ̾¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤Ë¤è¤ê¡¢½ÐÎϤÎÆâÍƤȷÁ¼°¤¬ÄêµÁ¤µ¤ì¤Þ¤¹¡£\fB\-doclet\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¥Ç¥Õ¥©¥ë¥È¤ÎHTML·Á¼°¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¤Ë¤Ï\fBstart(Root)\fR¥á¥½¥Ã¥É¤¬´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Îµ¯Æ°¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤Ï\fB\-docletpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/doclet/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + \-docletpath \fIclasspathlist\fR + .RS 4 +-\fI\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥É¥Ã¥¯¥ì¥Ã¥È³«»Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¤½¤Î¥¯¥é¥¹¤¬°Í¸¤¹¤ë¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£³«»Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÇJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ÀäÂХѥ¹¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIclasspathlist\fR¤ËÊ£¿ô¤Î¥Ñ¥¹¤äJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ì¤é¤òSolaris¤Î¾ì¹ç¤Ï¥³¥í¥ó(:)¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó(;)¤Ç¤½¤ì¤¾¤ì¶èÀÚ¤ê¤Þ¤¹¡£ÌÜŪ¤Î¥É¥Ã¥¯¥ì¥Ã¥È³«»Ï¥¯¥é¥¹¤¬¤¹¤Ç¤Ë¸¡º÷¥Ñ¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹¡£¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× ++\fB\-doclet\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥É¥Ã¥¯¥ì¥Ã¥È³«»Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¡¢¤ª¤è¤Ó¤½¤Î¥¯¥é¥¹¤¬°Í¸¤¹¤ë¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£³«»Ï¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬JAR¥Õ¥¡¥¤¥ëÆâ¤Ë¤¢¤ë¾ì¹ç¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÇJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ÀäÂХѥ¹¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBclasspathlist\fR¤ËÊ£¿ô¤Î¥Ñ¥¹¤äJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢¤½¤ì¤é¤òSolaris¤Î¾ì¹ç¤Ï¥³¥í¥ó(:)¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó(;)¤Ç¤½¤ì¤¾¤ì¶èÀÚ¤ê¤Þ¤¹¡£ÌÜŪ¤Î¥É¥Ã¥¯¥ì¥Ã¥È³«»Ï¥¯¥é¥¹¤¬¤¹¤Ç¤Ë¸¡º÷¥Ñ¥¹Æâ¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹¡£¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/doclet/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP +@@ -2418,7 +2498,7 @@ + .PP + \-source \fIrelease\fR + .RS 4 +-¼õ¤±ÉÕ¤±¤ë¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥ê¥ê¡¼¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fIrelease\fR¥Ñ¥é¥á¡¼¥¿¤Ë¤Ï¼¡¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¤­¤Ë»ÈÍѤ¹¤ëÃͤËÂбþ¤¹¤ë\fI¥ê¥ê¡¼¥¹\fR¤ÎÃͤò»ÈÍѤ·¤Þ¤¹¡£ ++¼õ¤±ÉÕ¤±¤ë¥½¡¼¥¹¡¦¥³¡¼¥É¤Î¥ê¥ê¡¼¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fBrelease\fR¥Ñ¥é¥á¡¼¥¿¤Ë¤Ï¼¡¤ÎÃͤò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¤­¤Ë»ÈÍѤ¹¤ëÃͤËÂбþ¤¹¤ë\fB¥ê¥ê¡¼¥¹\fR¤ÎÃͤò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2428,7 +2508,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.5\fR¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.5¤ÇƳÆþ¤µ¤ì¤¿Áí¾Î¤ª¤è¤Ó¾¤Î¸À¸ìµ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£\fI\-source\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Î¥³¥ó¥Ñ¥¤¥é¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤Ï¡¢1\&.5¤Î¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.5\fR¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.5¤ÇƳÆþ¤µ¤ì¤¿Áí¾Î¤ª¤è¤Ó¾¤Î¸À¸ìµ¡Ç½¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£\fB\-source\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Î¥³¥ó¥Ñ¥¤¥é¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤Ï¡¢1\&.5¤Î¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2439,7 +2519,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.4\fR¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.4¤ÇƳÆþ¤µ¤ì¤¿¥¢¥µ¡¼¥·¥ç¥ó¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ ++\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.4\fR¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.4¤ÇƳÆþ¤µ¤ì¤¿¥¢¥µ¡¼¥·¥ç¥ó¤ò´Þ¤à¥³¡¼¥É¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2450,26 +2530,29 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.3\fR¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.3°Ê¹ß¤ËƳÆþ¤µ¤ì¤¿¥¢¥µ¡¼¥·¥ç¥ó¡¢Áí¾Î¡¢¤Þ¤¿¤Ï¾¤Î¸À¸ìµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¡£ ++\fB¥ê¥ê¡¼¥¹ÃÍ: 1\&.3\fR¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢JDK 1\&.3°Ê¹ß¤ËƳÆþ¤µ¤ì¤¿¥¢¥µ¡¼¥·¥ç¥ó¡¢Áí¾Î¡¢¤Þ¤¿¤Ï¾¤Î¸À¸ìµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¡£ + .RE + .RE + .PP + \-sourcepath \fIsourcepathlist\fR + .RS 4 +-¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤È¤­¤Ë¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸«¤Ä¤±¤ë¤¿¤á¤Î¸¡º÷¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ +-\fIÊ£¿ô¤Î¥Ñ¥¹¤Ï¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£\fR\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ΤߤǤʤ¯¡¢¤½¤ì¼«ÂΤϥɥ­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é·Ñ¾µ¤µ¤ì¤¿¥³¥á¥ó¥È¤ò»ý¤Ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î°ÌÃÖ¤â³Îǧ¤Ç¤­¤Þ¤¹¡£ +-.sp +-\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¸¡º÷¤µ¤ì¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÆÃÄꤹ¤ë¤Ë¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤¹¤ë¤«¡¢¡Ö1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½¡×¤Ë¼¨¤¹¤è¤¦¤Ë³Æ¥Õ¥¡¥¤¥ë¤ÎÁ°¤Ë¥Ñ¥¹¤ò´Þ¤á¤Þ¤¹¡£\fI\-sourcepath\fR¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ò»ÈÍѤ·¤Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹(\fI\-classpath\fR¤ò»²¾È)¡£¥Ç¥Õ¥©¥ë¥È¤Î\fI\-sourcepath\fR¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎÃͤǤ¹¡£\fI\-classpath\fR¤ò¾Êά¤·¤Æ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê)¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£ +-.sp +-\fIsourcepathlist\fR¤Ë¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢\fIcom\&.mypackage\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ë¡¢¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬/home/user/src/com/mypackage/*\&.java¤Ë¤¢¤ë¤È¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Ñ¥¹¤òcom\emypackage¤¬´Þ¤Þ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê/home/user/src¤Ë»ØÄꤷ¤Æ¤«¤é¡¢¼¡¤Î¤è¤¦¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤ò\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤È¤­¤Ë¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸«¤Ä¤±¤ë¤¿¤á¤Î¸¡º÷¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ ++ ++Ê£¿ô¤Î¥Ñ¥¹¤Ï¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ΤߤǤʤ¯¡¢¤½¤ì¼«ÂΤϥɥ­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¤¬¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é·Ñ¾µ¤µ¤ì¤¿¥³¥á¥ó¥È¤ò»ý¤Ä¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î°ÌÃÖ¤â³Îǧ¤Ç¤­¤Þ¤¹¡£ ++.sp ++\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÅϤ¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¸¡º÷¤µ¤ì¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÆÃÄꤹ¤ë¤Ë¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤¹¤ë¤«¡¢¡Ö1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½¡×¤Ë¼¨¤¹¤è¤¦¤Ë³Æ¥Õ¥¡¥¤¥ë¤ÎÁ°¤Ë¥Ñ¥¹¤ò´Þ¤á¤Þ¤¹¡£\fB\-sourcepath\fR¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ò»ÈÍѤ·¤Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹(\fB\-classpath\fR¤ò»²¾È)¡£¥Ç¥Õ¥©¥ë¥È¤Î\fB\-sourcepath\fR¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤ÎÃͤǤ¹¡£\fB\-classpath\fR¤ò¾Êά¤·¤Æ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÅϤ¹¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê(¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê)¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹¡£ ++.sp ++\fBsourcepathlist\fR¤Ë¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢\fBcom\&.mypackage\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ë¡¢¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬/home/user/src/com/mypackage/*\&.java¤Ë¤¢¤ë¤È¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Ñ¥¹¤òcom\emypackage¤¬´Þ¤Þ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê/home/user/src¤Ë»ØÄꤷ¤Æ¤«¤é¡¢¼¡¤Î¤è¤¦¤Ë¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /home/user/src/ com\&.mypackage ++\fBjavadoc \-sourcepath /home/user/src/ com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE +@@ -2484,7 +2567,8 @@ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /home/user1/src:/home/user2/src com\&.mypackage ++\fBjavadoc \-sourcepath /home/user1/src:/home/user2/src com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE +@@ -2493,43 +2577,47 @@ + .PP + \-classpath \fIclasspathlist\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬»²¾È¥¯¥é¥¹¤Î¸¡º÷¤ò¹Ô¤¦¤È¤­¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£»²¾È¥¯¥é¥¹¤È¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤È¡¢¤½¤ì¤é¤Î¥¯¥é¥¹¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î¤³¤È¤Ç¤¹¡£ +-\fIÊ£¿ô¤Î¥Ñ¥¹¤Ï¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£\fR\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£\fIclasspathlist\fR¤ÎÃͤò»ØÄꤹ¤ë¤È¤­¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ë¤¢¤ë»Ø¼¨¤Ë½¾¤Ã¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-\fI\-sourcepath\fR¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï\fI\-classpath\fR¤ò»ÈÍѤ·¤Æ¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹(²¼°Ì¸ß´¹À­¤Î¤¿¤á)¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÊÌ¡¹¤Î¥Ñ¥¹¤«¤é¸¡º÷¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-sourcepath\fR¤È\fI\-classpath\fR¤ÎξÊý¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢\fIcom\&.mypackage\fR¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ë¡¢¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥Ç¥£¥ì¥¯¥È¥ê/home/user/src/com/mypackage¤Ë¤¢¤ê¡¢¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬/home/user/libthenÆâ¤Î¥é¥¤¥Ö¥é¥ê¤Ë°Í¸¤·¤Æ¤¤¤ë¤È¤­¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬»²¾È¥¯¥é¥¹¤Î¸¡º÷¤ò¹Ô¤¦¤È¤­¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£»²¾È¥¯¥é¥¹¤È¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤È¡¢¤½¤ì¤é¤Î¥¯¥é¥¹¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î¤³¤È¤Ç¤¹¡£ ++ ++Ê£¿ô¤Î¥Ñ¥¹¤Ï¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£\fBclasspathlist\fR¤ÎÃͤò»ØÄꤹ¤ë¤È¤­¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ë¤¢¤ë»Ø¼¨¤Ë½¾¤Ã¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++\fB\-sourcepath\fR¤¬¾Êά¤µ¤ì¤¿¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï\fB\-classpath\fR¤ò»ÈÍѤ·¤Æ¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ª¤è¤Ó¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¤Þ¤¹(¸åÊý¸ß´¹À­¤Î¤¿¤á)¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÊÌ¡¹¤Î¥Ñ¥¹¤«¤é¸¡º÷¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-sourcepath\fR¤È\fB\-classpath\fR¤ÎξÊý¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢\fBcom\&.mypackage\fR¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¾ì¹ç¤Ë¡¢¤½¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¥Ç¥£¥ì¥¯¥È¥ê/home/user/src/com/mypackage¤Ë¤¢¤ê¡¢¤³¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬/home/user/libÆâ¤Î¥é¥¤¥Ö¥é¥ê¤Ë°Í¸¤·¤Æ¤¤¤ë¤È¤­¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /home/user/lib \-classpath /home/user/src com\&.mypackage ++\fBjavadoc \-sourcepath /home/user/lib \-classpath /home/user/src com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE + .\} +-¾¤Î¥Ä¡¼¥ë¤ÈƱÍͤˡ¢\fI\-classpath\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ì¤Ð¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î´Ä¶­ÊÑ¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Á¤é¤âÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¥¯¥é¥¹¤ò¸¡º÷¤·¤Þ¤¹¡£ +-.sp +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬\fI\-classpath\fR¤ò»ÈÍѤ·¤Æ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤ò¸¡º÷¤¹¤ëÊýË¡¤Ë¤Ä¤¤¤Æ¤Î¡¢³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ä¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ë´ØÏ¢¤·¤¿¾ÜºÙ¤Ï¡¢¥¯¥é¥¹¤Î¸¡º÷ÊýË¡ ++¾¤Î¥Ä¡¼¥ë¤ÈƱÍͤˡ¢\fB\-classpath\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ì¤Ð¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î´Ä¶­ÊÑ¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Á¤é¤âÀßÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¥¯¥é¥¹¤ò¸¡º÷¤·¤Þ¤¹¡£ ++.sp ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬\fB\-classpath\fR¤ò»ÈÍѤ·¤Æ¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¤ò¸¡º÷¤¹¤ëÊýË¡¤Ë¤Ä¤¤¤Æ¤Î¡¢³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤ä¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ë´ØÏ¢¤·¤¿¾ÜºÙ¤Ï¡¢¥¯¥é¥¹¤Î¸¡º÷ÊýË¡ + (http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/findingclasses\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-*¤Î¥Ù¡¼¥¹Ì¾¤ò´Þ¤à¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁǤϡ¢\fI\&.jar\fR¤Þ¤¿¤Ï\fI\&.JAR\fR¤ò³ÈÄ¥»Ò¤Ë»ý¤Ä¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¥Ç¥£¥ì¥¯¥È¥ê\fImydir\fR¤Ë\fIa\&.jar\fR¤È\fIb\&.JA\fRR¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁÇ\fIfoo/*\fR¤Ï\fIA\&.jar:b\&.JAR\fR¤ËŸ³«¤µ¤ì¤Þ¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Î½çÈÖ¤Ï̤»ØÄê¤È¤Ê¤ê¤Þ¤¹¡£Èóɽ¼¨¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤à¡¢»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤¬¥ê¥¹¥È¤Ë´Þ¤Þ¤ì¤Þ¤¹¡£*¤«¤é¤Ê¤ë¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥¨¥ó¥È¥ê¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ËŸ³«¤µ¤ì¤Þ¤¹¡£\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤âƱÍͤËŸ³«¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÎŸ³«¤Ï¡¢Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î³«»ÏÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹¡£Java¥×¥í¥°¥é¥à¤Ï¡¢System\&.getenv(\fI"CLASSPATH"\fR)¤Î¸Æ¤Ó½Ð¤·¤Ë¤è¤Ã¤Æ¤Ê¤É¡¢´Ä¶­¤òÌ䤤¹ç¤»¤ë¾ì¹ç¤ò½ü¤­¡¢Å¸³«¤µ¤ì¤Æ¤¤¤Ê¤¤¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»²¾È¤·¤Þ¤»¤ó¡£ ++*¤Î¥Ù¡¼¥¹Ì¾¤ò´Þ¤à¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁǤϡ¢\fB\&.jar\fR¤Þ¤¿¤Ï\fB\&.JAR\fR¤ò³ÈÄ¥»Ò¤Ë»ý¤Ä¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¥Ç¥£¥ì¥¯¥È¥ê\fBmydir\fR¤Ë\fBa\&.jar\fR¤È\fBb\&.JA\fRR¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁÇ\fBfoo/*\fR¤Ï\fBA\&.jar:b\&.JAR\fR¤ËŸ³«¤µ¤ì¤Þ¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Î½çÈÖ¤Ï̤»ØÄê¤È¤Ê¤ê¤Þ¤¹¡£Èóɽ¼¨¤Î¥Õ¥¡¥¤¥ë¤ò´Þ¤à¡¢»ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤¬¥ê¥¹¥È¤Ë´Þ¤Þ¤ì¤Þ¤¹¡£*¤«¤é¤Ê¤ë¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥¨¥ó¥È¥ê¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ËŸ³«¤µ¤ì¤Þ¤¹¡£\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤âƱÍͤËŸ³«¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÎŸ³«¤Ï¡¢Java Virtual Machine (JVM)¤Î³«»ÏÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹¡£Java¥×¥í¥°¥é¥à¤Ï¡¢System\&.getenv(\fB"CLASSPATH"\fR)¤Î¸Æ¤Ó½Ð¤·¤Ë¤è¤Ã¤Æ¤Ê¤É¡¢´Ä¶­¤òÌ䤤¹ç¤»¤ë¾ì¹ç¤ò½ü¤­¡¢Å¸³«¤µ¤ì¤Æ¤¤¤Ê¤¤¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»²¾È¤·¤Þ¤»¤ó¡£ + .RE + .PP + \-subpackages \fIpackage1:package2:\&.\&.\&.\fR + .RS 4 +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËºÆµ¢Åª¤Ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¿·¤·¤¤¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤òÄɲ乤ëºÝ¤ËÊØÍø¤Ç¤¹¡£¿·¤·¤¤¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤¬¼«Æ°Åª¤ËÁȤ߹þ¤Þ¤ì¤ë¤«¤é¤Ç¤¹¡£³Æpackage°ú¿ô¤Ï¡¢Ç¤°Õ¤ÎºÇ¾å°Ì¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸(\fIjava\fR¤Ê¤É)¤Þ¤¿¤Ï´°Á´½¤¾þ¥Ñ¥Ã¥±¡¼¥¸(\fIjavax\&.swing\fR¤Ê¤É)¤Ë¤Ê¤ê¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£°ú¿ô¤Ï¡¢¤¹¤Ù¤Æ¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¡¢¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¸¡º÷¾ì½ê¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fI\-sourcepath\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Ë¸ºß¤¹¤ë¤¬¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Ê¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò½èÍý¤·¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fIjava\fR¤ª¤è¤Ó\fIjavax\&.swing\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤È¤³¤ì¤é¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Á´Éô¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤«¤é»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËºÆµ¢Åª¤Ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë¿·¤·¤¤¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤òÄɲ乤ëºÝ¤ËÊØÍø¤Ç¤¹¡£¿·¤·¤¤¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤¬¼«Æ°Åª¤ËÁȤ߹þ¤Þ¤ì¤ë¤«¤é¤Ç¤¹¡£³Æpackage°ú¿ô¤Ï¡¢Ç¤°Õ¤ÎºÇ¾å°Ì¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸(\fBjava\fR¤Ê¤É)¤Þ¤¿¤Ï´°Á´½¤¾þ¥Ñ¥Ã¥±¡¼¥¸(\fBjavax\&.swing\fR¤Ê¤É)¤Ë¤Ê¤ê¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤á¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£°ú¿ô¤Ï¡¢¤¹¤Ù¤Æ¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¡¢¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¸¡º÷¾ì½ê¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fB\-sourcepath\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼Æâ¤Ë¸ºß¤¹¤ë¤¬¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Ê¤¤¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò½èÍý¤·¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fBjava\fR¤ª¤è¤Ó\fBjavax\&.swing\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤È¤³¤ì¤é¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸Á´Éô¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d docs \-sourcepath /home/user/src \-subpackages java:javax\&.swing ++\fBjavadoc \-d docs \-sourcepath /home/user/src \-subpackages java:javax\&.swing \fR ++ + .fi + .if n \{\ + .RE +@@ -2538,16 +2626,17 @@ + .PP + \-exclude \fIpackagename1:packagename2:\&.\&.\&.\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò\fI\-subpackages\fR¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿¥ê¥¹¥È¤«¤é̵¾ò·ï¤Ë½ü³°¤·¤Þ¤¹¡£²áµî¤Þ¤¿¤Ï¾­Íè¤Î\fI\-subpackages\fR¥ª¥×¥·¥ç¥ó¤Î»ØÄê¤Ë¤è¤Ã¤ÆÁȤ߹þ¤Þ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¤â½ü³°¤ÎÂоݤȤʤê¤Þ¤¹¡£ +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIjava\&.io\fR¡¢\fIjava\&.util\fR¡¢\fIjava\&.math\fR¤Ê¤É¤ÏÁȤ߹þ¤Þ¤ì¤Þ¤¹¤¬¡¢\fIjava\&.net\fR¤È\fIjava\&.lang\fR¤ò¥ë¡¼¥È¤Ë»ý¤Ä¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤Þ¤¹¡£\fIjava\&.lang\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ç¤¢¤ë\fIjava\&.lang\&.ref\fR¤¬½ü³°¤µ¤ì¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ++»ØÄꤵ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤È¤½¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò\fB\-subpackages\fR¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤¿¥ê¥¹¥È¤«¤é̵¾ò·ï¤Ë½ü³°¤·¤Þ¤¹¡£²áµî¤Þ¤¿¤Ï¾­Íè¤Î\fB\-subpackages\fR¥ª¥×¥·¥ç¥ó¤Î»ØÄê¤Ë¤è¤Ã¤ÆÁȤ߹þ¤Þ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸¤â½ü³°¤ÎÂоݤȤʤê¤Þ¤¹¡£ ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBjava\&.io\fR¡¢\fBjava\&.util\fR¡¢\fBjava\&.math\fR¤Ê¤É¤ÏÁȤ߹þ¤Þ¤ì¤Þ¤¹¤¬¡¢\fBjava\&.net\fR¤È\fBjava\&.lang\fR¤ò¥ë¡¼¥È¤Ë»ý¤Ä¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤Þ¤¹¡£\fBjava\&.lang\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ç¤¢¤ë\fBjava\&.lang\&.ref\fR¤¬½ü³°¤µ¤ì¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /home/user/src \-subpackages java \-exclude +- java\&.net:java\&.lang ++\fBjavadoc \-sourcepath /home/user/src \-subpackages java \-exclude \fR ++\fB java\&.net:java\&.lang\fR ++ + .fi + .if n \{\ + .RE +@@ -2556,30 +2645,30 @@ + .PP + \-bootclasspath \fIclasspathlist\fR + .RS 4 +-¥Ö¡¼¥È¡¦¥¯¥é¥¹¤¬Â¸ºß¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¡¦¥¯¥é¥¹¤È¤Ï¡¢Ä̾Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥¯¥é¥¹¤Î¤³¤È¤Ç¤¹¡£\fIbootclasspath\fR¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òõ¤¹¤È¤­¤Ë»ÈÍѤ¹¤ë¸¡º÷¥Ñ¥¹¤Î°ìÉô¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢¥¯¥é¥¹¤Î¸¡½ÐÊýË¡ ++¥Ö¡¼¥È¡¦¥¯¥é¥¹¤¬Â¸ºß¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¡¦¥¯¥é¥¹¤È¤Ï¡¢Ä̾Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥¯¥é¥¹¤Î¤³¤È¤Ç¤¹¡£\fBbootclasspath\fR¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òõ¤¹¤È¤­¤Ë»ÈÍѤ¹¤ë¸¡º÷¥Ñ¥¹¤Î°ìÉô¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢¥¯¥é¥¹¤Î¸¡½ÐÊýË¡ + (http://docs\&.oracle\&.com/javase/8/docs/technotes/tools/findingclasses\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fIclasspathlist\fR¥Ñ¥é¥á¡¼¥¿Æâ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥»¥ß¥³¥í¥ó(;)¤Ç¶èÀÚ¤ë(Windows¤Î¾ì¹ç)¤«¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹(Oracle Solaris¤Î¾ì¹ç)¡£ ++\fBclasspathlist\fR¥Ñ¥é¥á¡¼¥¿Æâ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥»¥ß¥³¥í¥ó(;)¤Ç¶èÀÚ¤ë(Windows¤Î¾ì¹ç)¤«¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹(Oracle Solaris¤Î¾ì¹ç)¡£ + .RE + .PP + \-extdirs \fIdirist\fR + .RS 4 +-³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤¬Â¸ºß¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤È¤Ï¡¢Java³ÈÄ¥µ¡Ç½µ¡¹½¤ò»ÈÍѤ¹¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¤¹¡£\fIextdirs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òõ¤¹¤È¤­¤Ë»ÈÍѤ¹¤ë¸¡º÷¥Ñ¥¹¤Î°ìÉô¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fIdirlist\fRÆâ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥»¥ß¥³¥í¥ó(;)¤Ç¶èÀÚ¤ë(Windows¤Î¾ì¹ç)¤«¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹(Oracle Solaris¤Î¾ì¹ç)¡£ ++³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤¬Â¸ºß¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¥¯¥é¥¹¤È¤Ï¡¢Java³ÈÄ¥µ¡Ç½µ¡¹½¤ò»ÈÍѤ¹¤ë¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Ç¤¹¡£\fBextdirs\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òõ¤¹¤È¤­¤Ë»ÈÍѤ¹¤ë¸¡º÷¥Ñ¥¹¤Î°ìÉô¤Ç¤¹¡£¾ÜºÙ¤Ï¡¢\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fBdirlist\fRÆâ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢¥»¥ß¥³¥í¥ó(;)¤Ç¶èÀÚ¤ë(Windows¤Î¾ì¹ç)¤«¡¢¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹(Oracle Solaris¤Î¾ì¹ç)¡£ + .RE + .PP + \-verbose + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹ÔÃæ¤Ë¾ÜºÙ¤Ê¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£\fIverbose\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É»þ¡¢¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®»þ(¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë1¤Ä¤Î¥á¥Ã¥»¡¼¥¸)¡¢¤ª¤è¤Ó¥½¡¼¥È»þ¤Ë¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£verbose¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢³ÆJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î²òÀϤËÍפ·¤¿»þ´Ö(¥ß¥êÉÃñ°Ì)¤ò¼¨¤¹ÄɲäΥá¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹ÔÃæ¤Ë¾ÜºÙ¤Ê¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£\fBverbose\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥í¡¼¥É»þ¡¢¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®»þ(¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë1¤Ä¤Î¥á¥Ã¥»¡¼¥¸)¡¢¤ª¤è¤Ó¥½¡¼¥È»þ¤Ë¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£verbose¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢³ÆJava¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î²òÀϤËÍפ·¤¿»þ´Ö(¥ß¥êÉÃñ°Ì)¤ò¼¨¤¹ÄɲäΥá¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-quiet + .RS 4 +-¥á¥Ã¥»¡¼¥¸¤òÍÞÀ©¤·¡¢·Ù¹ð¤È¥¨¥é¡¼¤Î¤ß¤¬É½¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¡¢¤³¤ì¤é¤ò³Îǧ¤·¤ä¤¹¤¯¤·¤Þ¤¹¡£\fIversion\fRʸ»úÎó¤âÍ޻ߤ·¤Þ¤¹¡£ ++¥á¥Ã¥»¡¼¥¸¤òÍÞÀ©¤·¡¢·Ù¹ð¤È¥¨¥é¡¼¤Î¤ß¤¬É½¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¡¢¤³¤ì¤é¤ò³Îǧ¤·¤ä¤¹¤¯¤·¤Þ¤¹¡£\fBversion\fRʸ»úÎó¤âÍ޻ߤ·¤Þ¤¹¡£ + .RE + .PP + \-breakiterator + .RS 4 +-±Ñ¸ì¤Î¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î¼çÀâÌÀ¤ÎºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ëºÝ¤Ë¡¢\fIjava\&.text\&.BreakIterator\fR¤Î¹ñºÝ²½¤µ¤ì¤¿Ê¸¶­³¦¤ò»ÈÍѤ·¤Þ¤¹¡£Â¾¤Î¤¹¤Ù¤Æ¤Î¥í¥±¡¼¥ë¤Ï¡¢±Ñ¸ì¸À¸ì¤È¤¤¤¦¥í¥±¡¼¥ë¸ÇÍ­¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤Ï¤Ê¤¯¡¢¤¹¤Ç¤Ë\fIBreakIterator\fR¥¯¥é¥¹¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ºÇ½é¤Îʸ¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î¥µ¥Þ¥ê¡¼¤Ë¥³¥Ô¡¼¤µ¤ì¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Îº÷°ú¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£JDK 1\&.2°Ê¹ß¡¢\fIBreakIterator\fR¥¯¥é¥¹¤Ï¡¢±Ñ¸ì¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¸À¸ì¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ë¤¿¤á¤Ë¡¢¤¹¤Ç¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fI\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢1\&.2°Ê¹ß¤Ç¤Ï±Ñʸ°Ê³°¤Ë¤Ï¸ú²Ì¤¬¤¢¤ê¤Þ¤»¤ó¡£±Ñʸ¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÆȼ«¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥¢¥ë¥´¥ê¥º¥à¤¬¤¢¤ê¤Þ¤¹¡£ ++±Ñ¸ì¤Î¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î¼çÀâÌÀ¤ÎºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ëºÝ¤Ë¡¢\fBjava\&.text\&.BreakIterator\fR¤Î¹ñºÝ²½¤µ¤ì¤¿Ê¸¶­³¦¤ò»ÈÍѤ·¤Þ¤¹¡£Â¾¤Î¤¹¤Ù¤Æ¤Î¥í¥±¡¼¥ë¤Ï¡¢±Ñ¸ì¸À¸ì¤È¤¤¤¦¥í¥±¡¼¥ë¸ÇÍ­¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤Ï¤Ê¤¯¡¢¤¹¤Ç¤Ë\fBBreakIterator\fR¥¯¥é¥¹¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£ºÇ½é¤Îʸ¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¤Þ¤¿¤Ï¥á¥ó¥Ð¡¼¤Î¥µ¥Þ¥ê¡¼¤Ë¥³¥Ô¡¼¤µ¤ì¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Îº÷°ú¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£JDK 1\&.2°Ê¹ß¡¢\fBBreakIterator\fR¥¯¥é¥¹¤Ï¡¢±Ñ¸ì¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¸À¸ì¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ë¤¿¤á¤Ë¡¢¤¹¤Ç¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fB\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢1\&.2°Ê¹ß¤Ç¤Ï±Ñʸ°Ê³°¤Ë¤Ï¸ú²Ì¤¬¤¢¤ê¤Þ¤»¤ó¡£±Ñʸ¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÆȼ«¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥¢¥ë¥´¥ê¥º¥à¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2589,7 +2678,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-±Ñʸ¤Î¥Ç¥Õ¥©¥ë¥È¤Îʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¡£¶õÇòʸ»ú¤Þ¤¿¤ÏHTML¥Ö¥í¥Ã¥¯¡¦¥¿¥°(\fI<P>\fR¤Ê¤É)¤¬Â³¤¯¥Ô¥ê¥ª¥É¤ÇÄä»ß¤·¤Þ¤¹¡£ ++±Ñʸ¤Î¥Ç¥Õ¥©¥ë¥È¤Îʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¡£¶õÇòʸ»ú¤Þ¤¿¤ÏHTML¥Ö¥í¥Ã¥¯¡¦¥¿¥°(\fB<P>\fR¤Ê¤É)¤¬Â³¤¯¥Ô¥ê¥ª¥É¤ÇÄä»ß¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2600,45 +2689,46 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-breakiteratorʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¡£¼¡¤Î¸ì¤¬Âçʸ»ú¤Ç»Ï¤Þ¤ë¾ì¹ç¡¢¶õÇòʸ»ú¤¬Â³¤¯¥Ô¥ê¥ª¥É¡¢µ¿ÌäÉä¡¢¤Þ¤¿¤Ï´¶Ã²Éä¤ÇÄä»ß¤·¤Þ¤¹¡£¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤Ï¡ÖThe serial no\&. is valid¡×¤Ê¤É¡¢¤Û¤È¤ó¤É¤Î¾Êάɽµ­¤¬½èÍý¤µ¤ì¤Þ¤¹¤¬¡¢¡ÖMr\&. Smith¡×¤Ï½èÍý¤µ¤ì¤Þ¤»¤ó¡£\fI\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢HTML¥¿¥°¤ä¡¢¿ô»ú¤Þ¤¿¤Ïµ­¹æ¤Ç»Ï¤Þ¤ëʸ¤Ç¤ÏÄä»ß¤·¤Þ¤»¤ó¡£HTML¥¿¥°¤ËËä¤á¹þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ç¤â¡¢¡Ö\&.\&./filename¡×¤ÎºÇ¸å¤Î¥Ô¥ê¥ª¥É¤ÇÄä»ß¤·¤Þ¤¹¡£ +-.RE +-.sp +-Java SE 1\&.5¤Ç¤Ï\fI\-breakiterator\fR·Ù¹ð¥á¥Ã¥»¡¼¥¸¤¬ºï½ü¤µ¤ì¡¢¥Ç¥Õ¥©¥ë¥È¤Îʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¤ÏÊѹ¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤òÊѹ¹¤»¤º¡¢SE 1\&.4\&.x¤Ç¤Î\fI\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Î·Ù¹ð¤ò½üµî¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ç¤â¡¢²¿¤â¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£Java SE 1\&.5\&.0¤«¤é¤Ï·Ù¹ð¤Ï¾ÃÌǤ·¤Æ¤¤¤Þ¤¹¡£ ++breakiteratorʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¡£¼¡¤Î¸ì¤¬Âçʸ»ú¤Ç»Ï¤Þ¤ë¾ì¹ç¡¢¶õÇòʸ»ú¤¬Â³¤¯¥Ô¥ê¥ª¥É¡¢µ¿ÌäÉä¡¢¤Þ¤¿¤Ï´¶Ã²Éä¤ÇÄä»ß¤·¤Þ¤¹¡£¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤Ï¡ÖThe serial no\&. is valid¡×¤Ê¤É¡¢¤Û¤È¤ó¤É¤Î¾Êάɽµ­¤¬½èÍý¤µ¤ì¤Þ¤¹¤¬¡¢¡ÖMr\&. Smith¡×¤Ï½èÍý¤µ¤ì¤Þ¤»¤ó¡£\fB\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢HTML¥¿¥°¤ä¡¢¿ô»ú¤Þ¤¿¤Ïµ­¹æ¤Ç»Ï¤Þ¤ëʸ¤Ç¤ÏÄä»ß¤·¤Þ¤»¤ó¡£HTML¥¿¥°¤ËËä¤á¹þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ç¤â¡¢¡Ö\&.\&./filename¡×¤ÎºÇ¸å¤Î¥Ô¥ê¥ª¥É¤ÇÄä»ß¤·¤Þ¤¹¡£ ++.RE ++.sp ++Java SE 1\&.5¤Ç¤Ï\fB\-breakiterator\fR·Ù¹ð¥á¥Ã¥»¡¼¥¸¤¬ºï½ü¤µ¤ì¡¢¥Ç¥Õ¥©¥ë¥È¤Îʸ¶èÀڤꥢ¥ë¥´¥ê¥º¥à¤ÏÊѹ¹¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤òÊѹ¹¤»¤º¡¢SE 1\&.4\&.x¤Ç¤Î\fB\-breakiterator\fR¥ª¥×¥·¥ç¥ó¤Î·Ù¹ð¤ò½üµî¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ç¤â¡¢²¿¤â¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£Java SE 1\&.5\&.0¤«¤é¤Ï·Ù¹ð¤Ï¾ÃÌǤ·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-locale \fIlanguage_country_variant\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥í¥±¡¼¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î°ú¿ô¤Ï¡¢\fIj\fR\fIava\&.util\&.Locale\fR¥É¥­¥å¥á¥ó¥È¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢\fIen_US\fR +-(±Ñ¸ì¡¢Êƹñ)¤Þ¤¿¤Ï\fIen_US_WIN\fR ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥í¥±¡¼¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î°ú¿ô¤Ï¡¢\fBj\fR\fBava\&.util\&.Locale\fR¥É¥­¥å¥á¥ó¥È¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢\fBen_US\fR ++(±Ñ¸ì¡¢Êƹñ)¤Þ¤¿¤Ï\fBen_US_WIN\fR + (Windows¥Ð¥ê¥¢¥ó¥È)¤Ê¤É¤Î¥í¥±¡¼¥ë¤Î̾Á°¤Ç¤¹¡£ + .sp + \fBÃí°Õ:\fR +-\fI\-locale\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¡¢¤Þ¤¿¤Ï¤½¤Î¾¤ÎǤ°Õ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤è¤êÁ°(º¸Â¦)¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤·¤Ê¤¤¤È¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤¬±Ñ¸ì¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Î¤ß¡¢»ØÄꤹ¤ë½ç½ø¤Ë°Í¸¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-¥í¥±¡¼¥ë¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥í¥±¡¼¥ë¤Î¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÁªÂò¤µ¤ì¤Æ¡¢¥á¥Ã¥»¡¼¥¸(¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¡¢¥ê¥¹¥È¤Èɽ¤Î¸«½Ð¤·¡¢¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤ÎÌܼ¡¡¢stylesheet\&.css¤Î¥³¥á¥ó¥È¤Ê¤É¤Îʸ»úÎó)¤Î¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ë¥½¡¼¥È¤µ¤ì¤ë¥ê¥¹¥È¤Î¥½¡¼¥È½ç¡¢¤ª¤è¤ÓºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ë¤¿¤á¤Îʸ¤Î¶èÀÚ¤êʸ»ú¤â¡¢»ØÄꤷ¤¿¥í¥±¡¼¥ë¤Ë¤è¤Ã¤Æ·è¤Þ¤ê¤Þ¤¹¡£\fI\-locale\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ç»ØÄꤵ¤ì¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È¤Î¥í¥±¡¼¥ë¤ò·èÄꤹ¤ë¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++\fB\-locale\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¡¢¤Þ¤¿¤Ï¤½¤Î¾¤ÎǤ°Õ¤Î¥É¥Ã¥¯¥ì¥Ã¥È¤¬Ä󶡤¹¤ë¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤è¤êÁ°(º¸Â¦)¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤¦¤·¤Ê¤¤¤È¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤¬±Ñ¸ì¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Î¤ß¡¢»ØÄꤹ¤ë½ç½ø¤Ë°Í¸¤·¤Þ¤¹¡£É¸½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¥í¥±¡¼¥ë¤ò»ØÄꤹ¤ë¤È¡¢»ØÄꤷ¤¿¥í¥±¡¼¥ë¤Î¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÁªÂò¤µ¤ì¤Æ¡¢¥á¥Ã¥»¡¼¥¸(¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¡¢¥ê¥¹¥È¤Èɽ¤Î¸«½Ð¤·¡¢¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ë¤ÎÌܼ¡¡¢stylesheet\&.css¤Î¥³¥á¥ó¥È¤Ê¤É¤Îʸ»úÎó)¤Î¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤Þ¤¿¡¢¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ë¥½¡¼¥È¤µ¤ì¤ë¥ê¥¹¥È¤Î¥½¡¼¥È½ç¡¢¤ª¤è¤ÓºÇ½é¤Îʸ¤Î½ª¤ï¤ê¤òȽÃǤ¹¤ë¤¿¤á¤Îʸ¤Î¶èÀÚ¤êʸ»ú¤â¡¢»ØÄꤷ¤¿¥í¥±¡¼¥ë¤Ë¤è¤Ã¤Æ·è¤Þ¤ê¤Þ¤¹¡£\fB\-locale\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Ç»ØÄꤵ¤ì¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Î¥Æ¥­¥¹¥È¤Î¥í¥±¡¼¥ë¤ò·èÄꤹ¤ë¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .RE + .PP + \-encoding + .RS 4 +-¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°(\fIEUCJIS/SJIS\fR¤Ê¤É)¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥Ð¡¼¥¿¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°(\fBEUCJIS/SJIS\fR¤Ê¤É)¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥Ð¡¼¥¿¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-J\fIflag\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëJava Runtime Environment (JRE)¤Ë¡¢\fIflag\fR¤òľÀÜÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤ò½èÍý¤¹¤ë¤¿¤á¤Ë¥·¥¹¥Æ¥à¤Ç32MB¤Î¥á¥â¥ê¡¼¤ò³ÎÊݤ·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-Xmx\fR¥ª¥×¥·¥ç¥ó¤ò¼¡¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤·¤Þ¤¹¡£\fIjavadoc \-J\-Xmx32m \-J\-Xms32m com\&.mypackage\fR¡£\fI\-Xms\fR¤Ï¾Êά²Äǽ¤Ç¡¢¤³¤ì¤Ï½é´ü¥á¥â¥ê¡¼¤Î¥µ¥¤¥º¤òÀßÄꤹ¤ë¤Î¤ß¤Î¥ª¥×¥·¥ç¥ó¤Ç¡¢É¬Íפʥá¥â¥ê¡¼¤ÎºÇ¾®Î̤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ +-.sp +-\fIJ\fR¤È\fIflag\fR¤Î´Ö¤Ë¶õÇòʸ»ú¤Ï¤¢¤ê¤Þ¤»¤ó¡£ +-.sp +-»ÈÍѤ·¤Æ¤¤¤ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò³Îǧ¤¹¤ë¤Ë¤Ï\fI\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë¤Ïɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥Ð¡¼¥¸¥ç¥óÈֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£Javadoc¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëJava Runtime Environment (JRE)¤Ë¡¢\fBflag\fR¤òľÀÜÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢À¸À®¥É¥­¥å¥á¥ó¥È¤ò½èÍý¤¹¤ë¤¿¤á¤Ë¥·¥¹¥Æ¥à¤Ç32MB¤Î¥á¥â¥ê¡¼¤ò³ÎÊݤ·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-Xmx\fR¥ª¥×¥·¥ç¥ó¤ò¼¡¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤·¤Þ¤¹¡£\fBjavadoc \-J\-Xmx32m \-J\-Xms32m com\&.mypackage\fR¡£\fB\-Xms\fR¤Ï¾Êά²Äǽ¤Ç¡¢¤³¤ì¤Ï½é´ü¥á¥â¥ê¡¼¤Î¥µ¥¤¥º¤òÀßÄꤹ¤ë¤Î¤ß¤Î¥ª¥×¥·¥ç¥ó¤Ç¡¢É¬Íפʥá¥â¥ê¡¼¤ÎºÇ¾®Î̤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ ++.sp ++\fBJ\fR¤È\fBflag\fR¤Î´Ö¤Ë¶õÇòʸ»ú¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++.sp ++»ÈÍѤ·¤Æ¤¤¤ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò³Îǧ¤¹¤ë¤Ë¤Ï\fB\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë¤Ïɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥Ð¡¼¥¸¥ç¥óÈֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£Javadoc¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-J\-version +-java version "1\&.7\&.0_09" +-Java(TM) SE Runtime Environment (build 1\&.7\&.0_09\-b05) +-Java HotSpot(TM) 64\-Bit Server VM (build 23\&.5\-b02, mixed mode) ++\fBjavadoc \-J\-version\fR ++\fBjava version "1\&.7\&.0_09"\fR ++\fBJava(TM) SE Runtime Environment (build 1\&.7\&.0_09\-b05)\fR ++\fBJava HotSpot(TM) 64\-Bit Server VM (build 23\&.5\-b02, mixed mode)\fR ++ + .fi + .if n \{\ + .RE +@@ -2648,24 +2738,24 @@ + .PP + \-d \fIdirectory\fR + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬À¸À®¤µ¤ì¤¿HTML¥Õ¥¡¥¤¥ë¤òÊݸ¤¹¤ëÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-d\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤µ¤ì¤Þ¤¹¡£\fIdirectory\fR¤ÎÃͤˤϡ¢ÀäÂХǥ£¥ì¥¯¥È¥ê¡¢¤Þ¤¿¤Ï¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХǥ£¥ì¥¯¥È¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Java SE 1\&.4¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤ÈÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤¬¼«Æ°Åª¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤ÎÎã¤Ç¤Ï¡¢\fIcom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢¤½¤Î·ë²Ì¤¬\fI/user/doc/ \fR¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤µ¤ì¤Þ¤¹¡£\fIjavadoc \-d \fR\fI/user/doc/ \fR\fIcom\&.mypackage\fR ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬À¸À®¤µ¤ì¤¿HTML¥Õ¥¡¥¤¥ë¤òÊݸ¤¹¤ëÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-d\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤µ¤ì¤Þ¤¹¡£\fBdirectory\fR¤ÎÃͤˤϡ¢ÀäÂХǥ£¥ì¥¯¥È¥ê¡¢¤Þ¤¿¤Ï¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХǥ£¥ì¥¯¥È¥ê¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Java SE 1\&.4¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤ÈÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤¬¼«Æ°Åª¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¼¡¤ÎÎã¤Ç¤Ï¡¢\fBcom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢¤½¤Î·ë²Ì¤¬/user/doc/ ¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤µ¤ì¤Þ¤¹¡£\fBjavadoc \-d \fR\fB/user/doc/ \fR\fBcom\&.mypackage\fR + .RE + .PP + \-use + .RS 4 +-¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤Ä¤Î»ÈÍÑ¥Ú¡¼¥¸¤òÁȤ߹þ¤ß¤Þ¤¹¡£¤³¤Î¥Ú¡¼¥¸¤Ë¤Ï¡¢¤½¤ÎÆÃÄê¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤ÎAPI¤ò»ÈÍѤ·¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤¬µ­½Ò¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹C¤òÎã¤Ë¤È¤ë¤È¡¢¥¯¥é¥¹C¤ò»ÈÍѤ·¤Æ¤¤¤ë¤â¤Î¤È¤·¤Æ¤Ï¡¢C¤Î¥µ¥Ö¥¯¥é¥¹¡¢C¤È¤·¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤ë¥Õ¥£¡¼¥ë¥É¡¢C¤òÊÖ¤¹¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó·¿C¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¥á¥½¥Ã¥É¤È¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIString\fR·¿ÍѤλÈÍÑ¥Ú¡¼¥¸¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£\fIjava\&.awt\&.Font\fR¥¯¥é¥¹¤Î\fIgetName\fR¥á¥½¥Ã¥É¤Ï\fIString\fR·¿¤òÌ᤹¤Î¤Ç¡¢\fIgetName\fR¥á¥½¥Ã¥É¤Ï\fIString\fR¤ò»ÈÍѤ·¡¢\fIgetName\fR¥á¥½¥Ã¥É¤¬\fIString\fRÍѤλÈÍÑ¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¼ÂÁõ¤Ç¤Ï¤Ê¤¯API¤Î»ÈÍѤΤߤò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£¥á¥½¥Ã¥É¤¬¤½¤Î¼ÂÁõ¤Ç\fIString\fR¤ò»ÈÍѤ¹¤ë¤¬¡¢°ú¿ô¤È¤·¤Æʸ»úÎó¤ò¼è¤é¤Ê¤¤¡¢¤Þ¤¿¤Ïʸ»úÎó¤òÊÖ¤µ¤Ê¤¤¾ì¹ç¡¢¤½¤ì¤Ï\fIString\fR¤Î»ÈÍѤȤϤߤʤµ¤ì¤Þ¤»¤ó¡£À¸À®¤µ¤ì¤¿»ÈÍÑ¥Ú¡¼¥¸¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ë°ÜÆ°¤·¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î\fB¥ê¥ó¥¯¤Î»ÈÍÑ\fR¤ò¥¯¥ê¥Ã¥¯¤·¤Þ¤¹¡£ ++¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥¯¥é¥¹¤ª¤è¤Ó¥Ñ¥Ã¥±¡¼¥¸¤´¤È¤Ë1¤Ä¤Î»ÈÍÑ¥Ú¡¼¥¸¤òÁȤ߹þ¤ß¤Þ¤¹¡£¤³¤Î¥Ú¡¼¥¸¤Ë¤Ï¡¢¤½¤ÎÆÃÄê¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤ÎAPI¤ò»ÈÍѤ·¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¡¢¥¯¥é¥¹¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤¬µ­½Ò¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹C¤òÎã¤Ë¤È¤ë¤È¡¢¥¯¥é¥¹C¤ò»ÈÍѤ·¤Æ¤¤¤ë¤â¤Î¤È¤·¤Æ¤Ï¡¢C¤Î¥µ¥Ö¥¯¥é¥¹¡¢C¤È¤·¤ÆÀë¸À¤µ¤ì¤Æ¤¤¤ë¥Õ¥£¡¼¥ë¥É¡¢C¤òÊÖ¤¹¥á¥½¥Ã¥É¡¢¤ª¤è¤Ó·¿C¤Î¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¥á¥½¥Ã¥É¤È¥³¥ó¥¹¥È¥é¥¯¥¿¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBString\fR·¿ÍѤλÈÍÑ¥Ú¡¼¥¸¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£\fBjava\&.awt\&.Font\fR¥¯¥é¥¹¤Î\fBgetName\fR¥á¥½¥Ã¥É¤Ï\fBString\fR·¿¤òÌ᤹¤Î¤Ç¡¢\fBgetName\fR¥á¥½¥Ã¥É¤Ï\fBString\fR¤ò»ÈÍѤ·¡¢\fBgetName\fR¥á¥½¥Ã¥É¤¬\fBString\fRÍѤλÈÍÑ¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¼ÂÁõ¤Ç¤Ï¤Ê¤¯API¤Î»ÈÍѤΤߤò¥É¥­¥å¥á¥ó¥È²½¤·¤Þ¤¹¡£¥á¥½¥Ã¥É¤¬¤½¤Î¼ÂÁõ¤Ç\fBString\fR¤ò»ÈÍѤ¹¤ë¤¬¡¢°ú¿ô¤È¤·¤Æʸ»úÎó¤ò¼è¤é¤Ê¤¤¡¢¤Þ¤¿¤Ïʸ»úÎó¤òÊÖ¤µ¤Ê¤¤¾ì¹ç¡¢¤½¤ì¤Ï\fBString\fR¤Î»ÈÍѤȤϤߤʤµ¤ì¤Þ¤»¤ó¡£À¸À®¤µ¤ì¤¿»ÈÍÑ¥Ú¡¼¥¸¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ë°ÜÆ°¤·¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î\fB¥ê¥ó¥¯¤Î»ÈÍÑ\fR¤ò¥¯¥ê¥Ã¥¯¤·¤Þ¤¹¡£ + .RE + .PP + \-version + .RS 4 +-À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢@version¤Î¥Æ¥­¥¹¥È¤òÁȤ߹þ¤ß¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¾Êά¤µ¤ì¤Þ¤¹¡£»ÈÍѤ·¤Æ¤¤¤ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò³Îǧ¤¹¤ë¤Ë¤Ï\fI\-J\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢@version¤Î¥Æ¥­¥¹¥È¤òÁȤ߹þ¤ß¤Þ¤¹¡£¤³¤Î¥Æ¥­¥¹¥È¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¾Êά¤µ¤ì¤Þ¤¹¡£»ÈÍѤ·¤Æ¤¤¤ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥Ð¡¼¥¸¥ç¥ó¤ò³Îǧ¤¹¤ë¤Ë¤Ï\fB\-J\-version\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-author + .RS 4 +-À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢\fI@author\fR¤Î¥Æ¥­¥¹¥È¤òÁȤ߹þ¤ß¤Þ¤¹¡£ ++À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¡¢\fB@author\fR¤Î¥Æ¥­¥¹¥È¤òÁȤ߹þ¤ß¤Þ¤¹¡£ + .RE + .PP + \-splitindex +@@ -2675,27 +2765,27 @@ + .PP + \-windowtitle \fItitle\fR + .RS 4 +-HTML¤Î\fI<title>\fR¥¿¥°¤ËÇÛÃÖ¤¹¤ë¥¿¥¤¥È¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fItitle\fR¥¿¥°¤Ë»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤Ï¡¢¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë¤ä¡¢¤³¤Î¥Ú¡¼¥¸¤ËÂФ·¤ÆºîÀ®¤µ¤ì¤¿¥Ö¥é¥¦¥¶¤Î¥Ö¥Ã¥¯¥Þ¡¼¥¯(¤ªµ¤¤ËÆþ¤ê)¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¿¥¤¥È¥ë¤Ë¤ÏHTML¥¿¥°¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¥¿¥¤¥È¥ë¤ËHTML¥¿¥°¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤È¡¢¥Ö¥é¥¦¥¶¤¬¥¿¥°¤òÀµ¤·¤¯²ò¼á¤Ç¤­¤Þ¤»¤ó¡£\fItitle\fR¥¿¥°Æâ¤ÎÆâÉô¤ÎÆó½Å°úÍÑÉä¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Æ¥Þ¡¼¥¯¤·¤Þ¤¹¡£\fI\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë¡¢\fI\-doctitle\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjavadoc \-windowtitle "Java SE Platform" com\&.mypackage\fR¤Ç¤¹¡£ ++HTML¤Î\fB<title>\fR¥¿¥°¤ËÇÛÃÖ¤¹¤ë¥¿¥¤¥È¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fBtitle\fR¥¿¥°¤Ë»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤Ï¡¢¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë¤ä¡¢¤³¤Î¥Ú¡¼¥¸¤ËÂФ·¤ÆºîÀ®¤µ¤ì¤¿¥Ö¥é¥¦¥¶¤Î¥Ö¥Ã¥¯¥Þ¡¼¥¯(¤ªµ¤¤ËÆþ¤ê)¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¿¥¤¥È¥ë¤Ë¤ÏHTML¥¿¥°¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¥¿¥¤¥È¥ë¤ËHTML¥¿¥°¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤È¡¢¥Ö¥é¥¦¥¶¤¬¥¿¥°¤òÀµ¤·¤¯²ò¼á¤Ç¤­¤Þ¤»¤ó¡£\fBtitle\fR¥¿¥°Æâ¤ÎÆâÉô¤ÎÆó½Å°úÍÑÉä¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Æ¥Þ¡¼¥¯¤·¤Þ¤¹¡£\fB\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë¡¢\fB\-doctitle\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjavadoc \-windowtitle "Java SE Platform" com\&.mypackage\fR¤Ç¤¹¡£ + .RE + .PP + \-doctitle \fItitle\fR + .RS 4 +-³µÍ×¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎºÇ¾åÉô¤Î¶á¤¯¤ËÇÛÃÖ¤¹¤ë¥¿¥¤¥È¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fItitle\fR¥¿¥°¤Ë»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤ÏÃæ±û·¤¨¤Ë¤Ê¤ê¡¢¥ì¥Ù¥ë1¤Î¸«½Ð¤·¤È¤·¤Æ¡¢¾åÉô¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¤¹¤°²¼¤ËÃÖ¤«¤ì¤Þ¤¹¡£\fItitle\fR¥¿¥°¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢¥¿¥¤¥È¥ë¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fItitle\fR¥¿¥°¤ÎÆâÉô¤Ç°úÍÑÉä¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjavadoc \-header "<b>Java Platform </b><br>v1\&.4" com\&.mypackage\fR¤Ç¤¹¡£ ++³µÍ×¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎºÇ¾åÉô¤Î¶á¤¯¤ËÇÛÃÖ¤¹¤ë¥¿¥¤¥È¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fBtitle\fR¥¿¥°¤Ë»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤ÏÃæ±û·¤¨¤Ë¤Ê¤ê¡¢¥ì¥Ù¥ë1¤Î¸«½Ð¤·¤È¤·¤Æ¡¢¾åÉô¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¤¹¤°²¼¤ËÃÖ¤«¤ì¤Þ¤¹¡£\fBtitle\fR¥¿¥°¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢¥¿¥¤¥È¥ë¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBtitle\fR¥¿¥°¤ÎÆâÉô¤Ç°úÍÑÉä¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjavadoc \-header "<b>Java Platform </b><br>v1\&.4" com\&.mypackage\&.\fR¤È¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-title \fItitle\fR + .RS 4 +-¤¹¤Ç¤Ë¸ºß¤·¤Þ¤»¤ó¡£Javadoc 1\&.2¤Î¥Ù¡¼¥¿ÈǤˤ·¤«Â¸ºß¤·¤Æ¤¤¤Þ¤»¤ó¤Ç¤·¤¿¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-doctitle\fR¤È¤¤¤¦Ì¾Á°¤ËÊѹ¹¤µ¤ì¤Þ¤·¤¿¡£Ì¾Á°¤òÊѹ¹¤·¤¿Íýͳ¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤¬¡¢¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë¤Ç¤Ï¤Ê¤¯¥É¥­¥å¥á¥ó¥È¤Î¥¿¥¤¥È¥ë¤òÄêµÁ¤¹¤ë¤³¤È¤òÌÀ³Î¤Ë¤¹¤ë¤¿¤á¤Ç¤¹¡£ ++¤¹¤Ç¤Ë¸ºß¤·¤Þ¤»¤ó¡£Javadoc 1\&.2¤Î¥Ù¡¼¥¿ÈǤˤ·¤«Â¸ºß¤·¤Æ¤¤¤Þ¤»¤ó¤Ç¤·¤¿¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-doctitle\fR¤È¤¤¤¦Ì¾Á°¤ËÊѹ¹¤µ¤ì¤Þ¤·¤¿¡£Ì¾Á°¤òÊѹ¹¤·¤¿Íýͳ¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤¬¡¢¥¦¥£¥ó¥É¥¦¤Î¥¿¥¤¥È¥ë¤Ç¤Ï¤Ê¤¯¥É¥­¥å¥á¥ó¥È¤Î¥¿¥¤¥È¥ë¤òÄêµÁ¤¹¤ë¤³¤È¤òÌÀ³Î¤Ë¤¹¤ë¤¿¤á¤Ç¤¹¡£ + .RE + .PP + \-header \fIheader\fR + .RS 4 +-³Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ¾åÉô¤ËÇÛÃÖ¤¹¤ë¥Ø¥Ã¥À¡¼¡¦¥Æ¥­¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Ï¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î±¦¾å¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£\fIheader\fR¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢\fIheader\fR¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ø¥Ã¥À¡¼ÆâÉô¤Î°úÍÑÉä¤Ë¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjavadoc \-header "<b>Java Platform </b><br>v1\&.4" com\&.mypackage\fR¤Ç¤¹¡£ ++³Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ¾åÉô¤ËÇÛÃÖ¤¹¤ë¥Ø¥Ã¥À¡¼¡¦¥Æ¥­¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Ï¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î±¦¾å¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£\fBheader\fR¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢\fBheader\fR¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ø¥Ã¥À¡¼ÆâÉô¤Î°úÍÑÉä¤Ë¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjavadoc \-header "<b>Java Platform </b><br>v1\&.4" com\&.mypackage\&.\fR¤È¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-footer \fIfooter\fR + .RS 4 +-³Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ²¼Éô¤ËÇÛÃÖ¤¹¤ë¥Õ¥Ã¥¿¡¼¡¦¥Æ¥­¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fIfooter\fR¤ÎÃͤϡ¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î±¦²¼¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£\fIfooter\fR¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢\fIfooter\fR¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Õ¥Ã¥¿¡¼ÆâÉô¤Î°úÍÑÉä¤Ë¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Þ¤¹¡£ ++³Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ²¼Éô¤ËÇÛÃÖ¤¹¤ë¥Õ¥Ã¥¿¡¼¡¦¥Æ¥­¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fIfooter\fR¤ÎÃͤϡ¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î±¦²¼¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£\fBfooter\fR¤Ë¤ÏHTML¥¿¥°¤ª¤è¤Ó¶õÇòʸ»ú¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¡¢\fBfooter\fR¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Õ¥Ã¥¿¡¼ÆâÉô¤Î°úÍÑÉä¤Ë¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-top +@@ -2710,25 +2800,28 @@ + .PP + \-link \fIextdocURL\fR + .RS 4 +-´û¸¤ÎJavadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô»²¾È¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£\fIextdocURL\fR°ú¿ô¤Ï¡¢¥ê¥ó¥¯Àè¤È¤·¤Æ»ØÄꤹ¤ë¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô¥É¥­¥å¥á¥ó¥È¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÀäÂÐURL¤Þ¤¿¤ÏÁêÂÐURL¤Ç¤¹¡£»ØÄꤷ¤¿\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ç¡¢Ê£¿ô¤Î\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆÊ£¿ô¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ +-.sp +-¤³¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ëpackage\-list¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹)¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢package\-list¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÆɤ߼è¤Ã¤¿¸å¡¢¤½¤ÎURL¤Ç¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¡¢\fIextdocURL\fR¤ÎÃͤ¬¡¢ºîÀ®¤µ¤ì¤¿\fI<A HREF>\fR¥ê¥ó¥¯Æâ¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fIextdocURL\fR¤Ï¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤ÎURL¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIextdocURL\fR¤ËÀäÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Î¥É¥­¥å¥á¥ó¥È¤òǤ°Õ¤ÎWeb¥µ¥¤¥È¾å¤Î¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤Ç¤­¤Þ¤¹¡£ÁêÂаÌÃ֤إê¥ó¥¯¤¹¤ë¤Î¤ß¤Î¾ì¹ç¤ÏÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤǤ­¤Þ¤¹¡£ÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢ÅϤ¹Ãͤϰ¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¡¢¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(\fI\-d\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄê)¡£ÀäÂÐ¥ê¥ó¥¯¤ò»ØÄꤹ¤ë¾ì¹ç¡¢Ä̾HTTP¥ê¥ó¥¯¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤À¤·¡¢Web¥µ¡¼¥Ð¡¼¤ò»ý¤¿¤Ê¤¤¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤Ë¥ê¥ó¥¯¤¹¤ë¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥ê¥ó¥¯¤ò»ÈÍѤǤ­¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ë¥¢¥¯¥»¥¹¤¹¤ëÁ´°÷¤¬Æ±¤¸¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤ò¶¦Í­¤¹¤ë¾ì¹ç¤Ë¤Î¤ß¥Õ¥¡¥¤¥ë¡¦¥ê¥ó¥¯¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Î¾ì¹ç¤â¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¤â¡¢URL¤¬ÀäÂФޤ¿¤ÏÁêÂФΤ¤¤º¤ì¤Ç¤â¡¢¤Þ¤¿\fIh\fR\fIttp:\fR¤Þ¤¿¤Ï\fIf\fR\fIile:\fR¤Î¤¤¤º¤ì¤Ç¤â¡¢URL¥á¥â: Uniform Resource Locators ++´û¸¤ÎJavadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô»²¾È¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£\fIextdocURL\fR°ú¿ô¤Ï¡¢¥ê¥ó¥¯Àè¤È¤·¤Æ»ØÄꤹ¤ë¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô¥É¥­¥å¥á¥ó¥È¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÀäÂÐURL¤Þ¤¿¤ÏÁêÂÐURL¤Ç¤¹¡£»ØÄꤷ¤¿\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ç¡¢Ê£¿ô¤Î\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆÊ£¿ô¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++.sp ++¤³¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ëpackage\-list¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹)¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢package\-list¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÆɤ߼è¤Ã¤¿¸å¡¢¤½¤ÎURL¤Ç¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¡¢\fBextdocURL\fR¤ÎÃͤ¬¡¢ºîÀ®¤µ¤ì¤¿\fB<A HREF>\fR¥ê¥ó¥¯Æâ¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fBextdocURL\fR¤Ï¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤ÎURL¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIextdocURL\fR¤ËÀäÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Î¥É¥­¥å¥á¥ó¥È¤òǤ°Õ¤ÎWeb¥µ¥¤¥È¾å¤Î¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤Ç¤­¤Þ¤¹¡£ÁêÂаÌÃ֤إê¥ó¥¯¤¹¤ë¤Î¤ß¤Î¾ì¹ç¤ÏÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤǤ­¤Þ¤¹¡£ÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢ÅϤ¹Ãͤϰ¸Àè¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¡¢¥ê¥ó¥¯¤µ¤ì¤Æ¤¤¤ë¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(\fB\-d\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄê)¡£ÀäÂÐ¥ê¥ó¥¯¤ò»ØÄꤹ¤ë¾ì¹ç¡¢Ä̾HTTP¥ê¥ó¥¯¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤À¤·¡¢Web¥µ¡¼¥Ð¡¼¤ò»ý¤¿¤Ê¤¤¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤Ë¥ê¥ó¥¯¤¹¤ë¾ì¹ç¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥ê¥ó¥¯¤ò»ÈÍѤǤ­¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ë¥¢¥¯¥»¥¹¤¹¤ëÁ´°÷¤¬Æ±¤¸¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤ò¶¦Í­¤¹¤ë¾ì¹ç¤Ë¤Î¤ß¥Õ¥¡¥¤¥ë¡¦¥ê¥ó¥¯¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Î¾ì¹ç¤â¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ç¤â¡¢URL¤¬ÀäÂФޤ¿¤ÏÁêÂФΤ¤¤º¤ì¤Ç¤â¡¢¤Þ¤¿\fBh\fR\fBttp:\fR¤Þ¤¿¤Ï\fBf\fR\fBile:\fR¤Î¤¤¤º¤ì¤Ç¤â¡¢URL¥á¥â: Uniform Resource Locators + (http://www\&.ietf\&.org/rfc/rfc1738\&.txt)¤Ë»ØÄꤵ¤ì¤Æ¤¤¤ë¤È¤ª¤ê¡¢¶èÀÚ¤êʸ»ú¤È¤·¤Æ¥¹¥é¥Ã¥·¥å¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-link http://<host>/<directory>/<directory>/\&.\&.\&./<name> +-\-link file://<host>/<directory>/<directory>/\&.\&.\&./<name> +-\-link <directory>/<directory>/\&.\&.\&./<name> ++\fB\-link http://<host>/<directory>/<directory>/\&.\&.\&./<name>\fR ++\fB\-link file://<host>/<directory>/<directory>/\&.\&.\&./<name>\fR ++\fB\-link <directory>/<directory>/\&.\&.\&./<name>\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE +-\-linkoffline¤ª¤è¤Ó\-link¥ª¥×¥·¥ç¥ó¤Î°ã¤¤.PP +-¼¡¤Î¾ì¹ç¤Ë¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.PP ++\-linkoffline¤ª¤è¤Ó\-link¥ª¥×¥·¥ç¥ó¤Î°ã¤¤ ++.PP ++¼¡¤Î¾ì¹ç¤Ë¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2752,47 +2845,59 @@ + ³°ÉôAPI¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐURL¤ò»ÈÍѤ¹¤ë¾ì¹ç(¤½¤ÎURL¤ËÀܳ¤·¡¢Æɼè¤ê¤ò¹Ô¤¦¤³¤È¤¬¥·¥§¥ë¤Ë¤è¤Ã¤Æµö²Ä¤µ¤ì¤Æ¤¤¤ë¾ì¹ç)¡£ + .RE + .PP +-³°ÉôAPI¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐURL¤ò»ÈÍѤ¹¤ë¾ì¹ç(¤½¤ÎURL¤ËÀܳ¤·¡¢Æɼè¤ê¤ò¹Ô¤¦¤³¤È¤¬¥·¥§¥ë¤Ë¤è¤Ã¤Æµö²Ä¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç)¤Ï\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¾õ¶·¤Ï¡¢¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤ÎÆ⦤«¤é¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤Î³°Â¦¤Ë¤¢¤ë¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤·¤è¤¦¤È¤¹¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£ +-.PP +-\fBExample 1\fR, ³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐ¥ê¥ó¥¯ +-.RS 4 +-http://docs\&.oracle\&.com/javase/8/docs/api/index\&.html¤Ë¼¨¤¹¤è¤¦¤Ê¡¢\fIjava\&.lang\fR¡¢\fIjava\&.io\fR¤ª¤è¤Ó¤½¤Î¾¤ÎJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤¹¤ë¾ì¹ç¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹ ++³°ÉôAPI¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐURL¤ò»ÈÍѤ¹¤ë¾ì¹ç(¤½¤ÎURL¤ËÀܳ¤·¡¢Æɼè¤ê¤ò¹Ô¤¦¤³¤È¤¬¥·¥§¥ë¤Ë¤è¤Ã¤Æµö²Ä¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç)¤Ï\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¾õ¶·¤Ï¡¢¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤ÎÆ⦤«¤é¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤Î³°Â¦¤Ë¤¢¤ë¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤·¤è¤¦¤È¤¹¤ë¾ì¹ç¤ËȯÀ¸¤·¤Þ¤¹¡£ ++.PP ++\fBÎã 1\fR ++.br ++³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐ¥ê¥ó¥¯ ++.RS 4 ++http://docs\&.oracle\&.com/javase/8/docs/api/index\&.html¤Ë¼¨¤¹¤è¤¦¤Ê¡¢\fBjava\&.lang\fR¡¢\fBjava\&.io\fR¤ª¤è¤Ó¤½¤Î¾¤ÎJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤¹¤ë¾ì¹ç¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-link http://docs\&.oracle\&.com/javase/8/docs/api/ com\&.mypackage ++\fBjavadoc \-link http://docs\&.oracle\&.com/javase/8/docs/api/ com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢Java SE¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥ê¥ó¥¯»ý¤Ä\fIcom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¥¯¥é¥¹\fItrees\fRÆâ¤Î\fIObject\fR¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fI\-sourcepath\fR¤ä\fI\-d\fR¤Ê¤É¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ +-.RE +-.PP +-\fBExample 2\fR, ³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÁêÂÐ¥ê¥ó¥¯ +-.RS 4 +-¤³¤ÎÎã¤Ç¤Ï¡¢2¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ê¡¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤òÊ£¿ô²ó¼Â¹Ô¤·¤¿·ë²ÌÀ¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£¤µ¤é¤Ë¡¢¤³¤ì¤é¤Î¥É¥­¥å¥á¥ó¥È¤ÏÁêÂХѥ¹¤Çʬ³ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢API¤Ç¤¢¤ë\fIcom\&.apipackage\fR¤È¡¢SPI(¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹)¤Ç¤¢¤ëc\fIom\&.spipackage\fR¤Ç¤¹¡£¥É¥­¥å¥á¥ó¥È¤Î³ÊǼÀè¤Ï¡¢docs/api/com/apipackage¤Èdocs/spi/com/spipackage¤Ç¤¹¡£API¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤Ï¤¹¤Ç¤ËÀ¸À®¤µ¤ì¤Æ¤¤¤Æ¡¢docs¤¬¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¢¤ë¾ì¹ç¡¢API¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤ò»ý¤ÄSPI¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fIjavadoc \-d \&./spi \-link \&.\&./api com\&.spipackage\fR +-.sp +-\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢°¸Àè¥Ç¥£¥ì¥¯¥È¥ê(docs/spi)¤«¤é¤ÎÁêÂХѥ¹¤Ç¤¹¡£ +-.RE +-Ãí°Õ.PP +-\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥³¡¼¥É¤«¤é¤Ï»²¾È¤µ¤ì¤Æ¤¤¤Æ¤â¡¢º£²ó¤Î\fIjavadoc\fR¤Î¼Â¹Ô¤Ç¤Ï¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¥ê¥ó¥¯¤«¤éÍ­¸ú¤Ê¥Ú¡¼¥¸¤Ë°ÜÆ°¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¢¤½¤ì¤é¤ÎHTML¥Ú¡¼¥¸¤¬¤¢¤ë¾ì½ê¤òÄ´¤Ù¡¢¤½¤Î¾ì½ê¤ò\fIextdocURL\fR¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥µ¡¼¥É¥Ñ¡¼¥Æ¥£¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤¬java\&.*¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó(http://docs\&.oracle\&.com)¤Ø¥ê¥ó¥¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¡¢¸½ºß¤Î¼Â¹Ô¤ÇÀ¸À®¤·¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤ÎAPI¤Ø¤Î¥ê¥ó¥¯¤Î¤ß¤òºîÀ®¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤·¤Þ¤¹¡£\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï³°Éô»²¾È¤Î¤¿¤á¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤»¤ó¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¤Î¤«¤É¤¦¤«¡¢¤Þ¤¿¤Ï¤É¤³¤Ë¸ºß¤¹¤ë¤Î¤«¤¬¤ï¤«¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤ÎÊ£¿ô¤Î¾ì½ê¤Ë¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤â¤¦1¤Ä¤ÎÍÑÅӤϡ¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤Î´Ö¤Ë¥¯¥í¥¹¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤³¤È¤Ç¤¹¡£°ìÊý¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤ËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢Â¾Êý¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤ËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤òºÆÅټ¹Ԥ¹¤ë¤È¡¢Î¾¥»¥Ã¥È´Ö¤ËÁÐÊý¸þ¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ +-¥¯¥é¥¹¤Î»²¾ÈÊýË¡.PP +-ɽ¼¨¤µ¤ì¤ë³°Éô»²¾È¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤Î¾ì¹ç(¤ª¤è¤Ó¤½¤Î¥Æ¥­¥¹¥È¡¦¥é¥Ù¥ë¤À¤±¤Ç¤Ï¤Ê¤¯)¡¢¥¯¥é¥¹¤Ï¼¡¤ÎÊýË¡¤Ç»²¾È¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥á¥½¥Ã¥É¤ÎËÜÂΤǥ¯¥é¥¹¤ò»²¾È¤¹¤ë¤Î¤ß¤Ç¤Ï½½Ê¬¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fIimport\fRʸ¡¢Àë¸À¤Î¤¤¤º¤ì¤«¤Ç»²¾È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤Ë¡¢¥¯¥é¥¹\fIjava\&.io\&.File\fR¤ò»²¾È¤¹¤ëÊýË¡¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£ +-.PP +-¤¹¤Ù¤Æ¤Î¥¿¥¤¥×¤Îimportʸ¤Î¾ì¹ç¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ë¤è¤ë¥¤¥ó¥Ý¡¼¥È¡¢Ì¾Á°¤Ë¤è¤ëÌÀ¼¨Åª¤Ê¥¤¥ó¥Ý¡¼¥È¡¢¤Þ¤¿¤Ï\fIjava\&.lang\&.*\fR¤ËÂФ¹¤ë¼«Æ°¥¤¥ó¥Ý¡¼¥È¡£ +-.PP +-Java SE 1\&.3\&.\fIn\fR¤ª¤è¤Ó1\&.2\&.\fIn\fR¤Ç¤Ï¡¢Ì¾Á°¤Ë¤è¤ëÌÀ¼¨Åª¤Ê¥¤¥ó¥Ý¡¼¥È¤Î¤ßµ¡Ç½¤·¤Þ¤¹¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ë¤è¤ë\fIimport\fRʸ¤â¡¢\fIimport java\&.lang\&.*\fR¤Î¼«Æ°¥¤¥ó¥Ý¡¼¥È¤âµ¡Ç½¤·¤Þ¤»¤ó¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢Java SE¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥ê¥ó¥¯»ý¤Ä\fBcom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¥¯¥é¥¹\fBtrees\fRÆâ¤Î\fBObject\fR¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fB\-sourcepath\fR¤ä\fB\-d\fR¤Ê¤É¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ ++.RE ++.PP ++\fBÎã 2\fR ++.br ++³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÁêÂÐ¥ê¥ó¥¯ ++.RS 4 ++¤³¤ÎÎã¤Ç¤Ï¡¢2¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ê¡¢¤½¤Î¥É¥­¥å¥á¥ó¥È¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤òÊ£¿ô²ó¼Â¹Ô¤·¤¿·ë²ÌÀ¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¹¡£¤µ¤é¤Ë¡¢¤³¤ì¤é¤Î¥É¥­¥å¥á¥ó¥È¤ÏÁêÂХѥ¹¤Çʬ³ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢API¤Ç¤¢¤ë\fBcom\&.apipackage\fR¤È¡¢SPI(¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹)¤Ç¤¢¤ëc\fBom\&.spipackage\fR¤Ç¤¹¡£¥É¥­¥å¥á¥ó¥È¤Î³ÊǼÀè¤Ï¡¢docs/api/com/apipackage¤Èdocs/spi/com/spipackage¤Ç¤¹¡£API¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤Ï¤¹¤Ç¤ËÀ¸À®¤µ¤ì¤Æ¤¤¤Æ¡¢docs¤¬¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¢¤ë¾ì¹ç¡¢API¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤ò»ý¤ÄSPI¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fBjavadoc \-d \&./spi \-link \&.\&./api com\&.spipackage\fR ++.sp ++\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢°¸Àè¥Ç¥£¥ì¥¯¥È¥ê(docs/spi)¤«¤é¤ÎÁêÂХѥ¹¤Ç¤¹¡£ ++.RE ++.PP ++Ãí°Õ ++.PP ++\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥³¡¼¥É¤«¤é¤Ï»²¾È¤µ¤ì¤Æ¤¤¤Æ¤â¡¢º£²ó¤Î\fBjavadoc\fR¤Î¼Â¹Ô¤Ç¤Ï¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤Ê¤¤¥¯¥é¥¹¤Ë¥ê¥ó¥¯¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¥ê¥ó¥¯¤«¤éÍ­¸ú¤Ê¥Ú¡¼¥¸¤Ë°ÜÆ°¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¢¤½¤ì¤é¤ÎHTML¥Ú¡¼¥¸¤¬¤¢¤ë¾ì½ê¤òÄ´¤Ù¡¢¤½¤Î¾ì½ê¤ò\fBextdocURL\fR¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥µ¡¼¥É¥Ñ¡¼¥Æ¥£¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤¬java\&.*¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó( ++http://docs\&.oracle\&.com)¤Ø¥ê¥ó¥¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¡¢¸½ºß¤Î¼Â¹Ô¤ÇÀ¸À®¤·¤Æ¤¤¤ë¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤ÎAPI¤Ø¤Î¥ê¥ó¥¯¤Î¤ß¤òºîÀ®¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤·¤Þ¤¹¡£\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï³°Éô»²¾È¤Î¤¿¤á¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤»¤ó¡£¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¤¬Â¸ºß¤¹¤ë¤Î¤«¤É¤¦¤«¡¢¤Þ¤¿¤Ï¤É¤³¤Ë¸ºß¤¹¤ë¤Î¤«¤¬¤ï¤«¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢À¸À®¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥óÆâ¤ÎÊ£¿ô¤Î¾ì½ê¤Ë¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤â¤¦1¤Ä¤ÎÍÑÅӤϡ¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤Î´Ö¤Ë¥¯¥í¥¹¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤³¤È¤Ç¤¹¡£°ìÊý¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤ËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢Â¾Êý¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥»¥Ã¥È¤ËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤òºÆÅټ¹Ԥ¹¤ë¤È¡¢Î¾¥»¥Ã¥È´Ö¤ËÁÐÊý¸þ¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++.PP ++¥¯¥é¥¹¤Î»²¾ÈÊýË¡ ++.PP ++ɽ¼¨¤µ¤ì¤ë³°Éô»²¾È¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤Î¾ì¹ç(¤ª¤è¤Ó¤½¤Î¥Æ¥­¥¹¥È¡¦¥é¥Ù¥ë¤À¤±¤Ç¤Ï¤Ê¤¯)¡¢¥¯¥é¥¹¤Ï¼¡¤ÎÊýË¡¤Ç»²¾È¤µ¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥á¥½¥Ã¥É¤ÎËÜÂΤǥ¯¥é¥¹¤ò»²¾È¤¹¤ë¤Î¤ß¤Ç¤Ï½½Ê¬¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fBimport\fRʸ¡¢Àë¸À¤Î¤¤¤º¤ì¤«¤Ç»²¾È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤Ë¡¢¥¯¥é¥¹\fBjava\&.io\&.File\fR¤ò»²¾È¤¹¤ëÊýË¡¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£ ++.PP ++¤¹¤Ù¤Æ¤Î¥¿¥¤¥×¤Îimportʸ¤Î¾ì¹ç¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ë¤è¤ë¥¤¥ó¥Ý¡¼¥È¡¢Ì¾Á°¤Ë¤è¤ëÌÀ¼¨Åª¤Ê¥¤¥ó¥Ý¡¼¥È¡¢¤Þ¤¿¤Ï\fBjava\&.lang\&.*\fR¤ËÂФ¹¤ë¼«Æ°¥¤¥ó¥Ý¡¼¥È¡£ ++.PP ++Java SE 1\&.3\&.\fIn\fR¤ª¤è¤Ó1\&.2\&.\fIn\fR¤Ç¤Ï¡¢Ì¾Á°¤Ë¤è¤ëÌÀ¼¨Åª¤Ê¥¤¥ó¥Ý¡¼¥È¤Î¤ßµ¡Ç½¤·¤Þ¤¹¡£¥ï¥¤¥ë¥É¥«¡¼¥É¤Ë¤è¤ë\fBimport\fRʸ¤â¡¢\fBimport java\&.lang\&.*\fR¤Î¼«Æ°¥¤¥ó¥Ý¡¼¥È¤âµ¡Ç½¤·¤Þ¤»¤ó¡£ + .PP + Àë¸À¤Î¾ì¹ç: +-\fIvoid mymethod(File f) {}\fR ++\fBvoid mymethod(File f) {}\fR + .PP + »²¾È¤Ï¡¢¥á¥½¥Ã¥É¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥Õ¥£¡¼¥ë¥É¡¢¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÌá¤ê·¿¤Þ¤¿¤Ï¥Ñ¥é¥á¡¼¥¿¡¦¥¿¥¤¥×¡¢¤¢¤ë¤¤¤Ï¼ÂÁõ¡¢³ÈÄ¥¤Þ¤¿¤Ï¥¹¥í¡¼Ê¸¤Ë¤¢¤ê¤Þ¤¹¡£ + .PP +-½ÅÍפʷë²Ì¤È¤·¤Æ¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤â¡¢¤³¤ÎÀ©¸Â¤Î¤¿¤á¤Ë¸í¤Ã¤Æɽ¼¨¤µ¤ì¤Ê¤¤¥ê¥ó¥¯¤¬Â¿¿ôȯÀ¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¥Æ¥­¥¹¥È¤Ï¥Ï¥¤¥Ñ¡¼¥Æ¥­¥¹¥È¡¦¥ê¥ó¥¯¤¬ÉÕ¤±¤é¤ì¤º¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¥ê¥ó¥¯¤¬É½¼¨¤¹¤ë·Ù¹ð¤«¤é¡¢¤³¤ì¤é¤Î¥ê¥ó¥¯¤òǧ¼±¤Ç¤­¤Þ¤¹¡£¥¯¥é¥¹¤òÀµ¤·¤¯»²¾È¤·¡¢¤½¤ì¤Ë¤è¤Ã¤Æ¥ê¥ó¥¯¤òÄɲ乤뤿¤á¤ÎºÇ¤â´Êñ¤ÊÊýË¡¤Ï¤½¤Î¥¯¥é¥¹¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤Ç¤¹¡£ +-¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È.PP +-\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ëpackage\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤¬¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Ë»ØÄꤷ¤¿URL¤Ë¸ºß¤·¤Æ¤¤¤ë¤³¤È¤¬É¬ÍפǤ¹¡£package\-list¥Õ¥¡¥¤¥ë¤Ï¡¢¤½¤Î¾ì½ê¤Ë¤¢¤ë¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤Î¥ê¥¹¥È¤¬Æþ¤Ã¤¿Ã±½ã¤Ê¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£Á°½Ò¤ÎÎã¤Ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤷ¤¿URL¤Çpackage\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÆɤ߼è¤Ã¤Æ¡¢¤½¤ÎURL¤Ç¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£ ++½ÅÍפʷë²Ì¤È¤·¤Æ¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤â¡¢¤³¤ÎÀ©¸Â¤Î¤¿¤á¤Ë¸í¤Ã¤Æɽ¼¨¤µ¤ì¤Ê¤¤¥ê¥ó¥¯¤¬Â¿¿ôȯÀ¸¤¹¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¥Æ¥­¥¹¥È¤Ï¥Ï¥¤¥Ñ¡¼¥Æ¥­¥¹¥È¡¦¥ê¥ó¥¯¤¬ÉÕ¤±¤é¤ì¤º¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¥ê¥ó¥¯¤¬É½¼¨¤¹¤ë·Ù¹ð¤«¤é¡¢¤³¤ì¤é¤Î¥ê¥ó¥¯¤òǧ¼±¤Ç¤­¤Þ¤¹¡£¥¯¥é¥¹¤òÀµ¤·¤¯»²¾È¤·¡¢¤½¤ì¤Ë¤è¤Ã¤Æ¥ê¥ó¥¯¤òÄɲ乤뤿¤á¤ÎºÇ¤â´Êñ¤ÊÊýË¡¤Ï¤½¤Î¥¯¥é¥¹¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤Ç¤¹¡£ ++.PP ++¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È ++.PP ++\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ëpackage\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤¬¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Ë»ØÄꤷ¤¿URL¤Ë¸ºß¤·¤Æ¤¤¤ë¤³¤È¤¬É¬ÍפǤ¹¡£package\-list¥Õ¥¡¥¤¥ë¤Ï¡¢¤½¤Î¾ì½ê¤Ë¤¢¤ë¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤Î¥ê¥¹¥È¤¬Æþ¤Ã¤¿Ã±½ã¤Ê¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£Á°½Ò¤ÎÎã¤Ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤷ¤¿URL¤Çpackage\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤·¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÆɤ߼è¤Ã¤Æ¡¢¤½¤ÎURL¤Ç¤³¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤·¤Þ¤¹¡£ + .PP + ¤¿¤È¤¨¤Ð¡¢Java SE API¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤Ï + http://docs\&.oracle\&.com/javase/8/docs/api/package\-list¤Ë¤¢¤ê¤Þ¤¹¡£ +@@ -2803,33 +2908,38 @@ + .RS 4 + .\} + .nf +-java\&.applet +-java\&.awt +-java\&.awt\&.color +-java\&.awt\&.datatransfer +-java\&.awt\&.dnd +-java\&.awt\&.event +-java\&.awt\&.font +-and so on \&.\&.\&.\&. ++\fBjava\&.applet\fR ++\fBjava\&.awt\fR ++\fBjava\&.awt\&.color\fR ++\fBjava\&.awt\&.datatransfer\fR ++\fBjava\&.awt\&.dnd\fR ++\fBjava\&.awt\&.event\fR ++\fBjava\&.awt\&.font\fR ++\fBand so on \&.\&.\&.\&.\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fIjavadoc\fR¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢³°Éô»²¾È¥¯¥é¥¹¤Ë°¤¹¤ë̾Á°¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î̾Á°¤ò¥ê¥ó¥¯¤Ê¤·¤Ç½ÐÎϤ·¤Þ¤¹¡£°ìÊý¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿\fIextdocURL\fR¤Î¾ì½ê¤Ë¤¢¤ëpackage\-list¥Õ¥¡¥¤¥ë¤Ç¤½¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¸¡º÷¤·¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬¸«¤Ä¤«¤ë¤È¡¢\fIextdocURL\fR¤¬Ì¾Á°¤ÎÁ°¤ËÉղ䵤ì¤Þ¤¹¡£ +-.PP +-¤¹¤Ù¤Æ¤Î¥ê¥ó¥¯¤¬Àµ¤·¤¯µ¡Ç½¤¹¤ë¤¿¤á¤Ë¤Ï¡¢³°Éô»²¾È¤Î¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È¤¬¡¢»ØÄꤷ¤¿URL¤Ë¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿package\-list¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Î¤ß¤ò¥Á¥§¥Ã¥¯¤·¡¢¤³¤ì¤é¤Î¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Ï¥Á¥§¥Ã¥¯¤·¤Þ¤»¤ó¡£ +-Ê£¿ô¤Î¥ê¥ó¥¯.PP +-Ê£¿ô¤Î\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢Ç¤°Õ¤Î¿ô¤Î³°ÉôÀ¸À®¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£Javadoc 1\&.2¤Ë¤Ï¡¢Ê£¿ô¤Î\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Ê¤¤¤È¤¤¤¦´ûÃΤÎÉÔ¶ñ¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤ÏJavadoc 1\&.2\&.2¤Ç½¤Àµ¤µ¤ì¤Þ¤·¤¿¡£¥ê¥ó¥¯¤¹¤ë³°Éô¥É¥­¥å¥á¥ó¥È¤´¤È¤Ë¡¢¼¡¤Î¤è¤¦¤ËÊÌ¡¹¤Î¥ê¥ó¥¯¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fIjavadoc \-link extdocURL1 \-link extdocURL2 \&.\&.\&. \-link extdocURLn com\&.mypackage\fR +-\fIextdocURL1\fR¡¢\fIextdocURL2\fR¡¢\&.\fI\&.\&. extdocURLn\fR¤Ï¡¢¤½¤ì¤¾¤ì³°Éô¥É¥­¥å¥á¥ó¥È¤Î¥ë¡¼¥È¤ò»Ø¤·¡¢³Æ¥ë¡¼¥È¤Ë¤Ï¡¢package\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤¬Æþ¤Ã¤Æ¤¤¤Þ¤¹¡£ +-¥¯¥í¥¹¥ê¥ó¥¯.PP +-°ÊÁ°¤ËºîÀ®¤µ¤ì¤¿Ê£¿ô¤Î¥É¥­¥å¥á¥ó¥È¤ò¥¯¥í¥¹¥ê¥ó¥¯¤¹¤ë¾ì¹ç¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¤¬É¬Íפˤʤ뤳¤È¤¬¤¢¤ê¤Þ¤¹¡£¤É¤Î¥É¥­¥å¥á¥ó¥È¤Ë¤Ä¤¤¤Æ¤âpackage\-list¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥È¤ËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë»þÅÀ¤Ç¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤Îpackage\-list¤Ï¤Þ¤À¸ºß¤·¤Æ¤¤¤Þ¤»¤ó¡£¤·¤¿¤¬¤Ã¤Æ¡¢³°Éô¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤òÀ¸À®¤·¤¿¸å¤Ç¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Ê¤ª¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ +-.PP +-¤³¤Î¾ì¹ç¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥ÈÀ¸À®¤ÎÌÜŪ¤Ï¡¢package\-list¤òºîÀ®¤¹¤ë¤³¤È¤Ç¤¹(¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÇÄ°®¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¼êÆ°¤ÇºîÀ®¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó)¡£¼¡¤Ë¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤È¤½¤Î³°Éô¥ê¥ó¥¯¤òÀ¸À®¤·¤Þ¤¹¡£É¬Íפʳ°Éô¤Îpackage\-list¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤«¤é·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fBjavadoc\fR¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢³°Éô»²¾È¥¯¥é¥¹¤Ë°¤¹¤ë̾Á°¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î̾Á°¤ò¥ê¥ó¥¯¤Ê¤·¤Ç½ÐÎϤ·¤Þ¤¹¡£°ìÊý¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿\fIextdocURL\fR¤Î¾ì½ê¤Ë¤¢¤ëpackage\-list¥Õ¥¡¥¤¥ë¤Ç¤½¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¸¡º÷¤·¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬¸«¤Ä¤«¤ë¤È¡¢\fIextdocURL\fR¤¬Ì¾Á°¤ÎÁ°¤ËÉղ䵤ì¤Þ¤¹¡£ ++.PP ++¤¹¤Ù¤Æ¤Î¥ê¥ó¥¯¤¬Àµ¤·¤¯µ¡Ç½¤¹¤ë¤¿¤á¤Ë¤Ï¡¢³°Éô»²¾È¤Î¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È¤¬¡¢»ØÄꤷ¤¿URL¤Ë¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿package\-list¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Î¤ß¤ò¥Á¥§¥Ã¥¯¤·¡¢¤³¤ì¤é¤Î¥Ú¡¼¥¸¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Ï¥Á¥§¥Ã¥¯¤·¤Þ¤»¤ó¡£ ++.PP ++Ê£¿ô¤Î¥ê¥ó¥¯ ++.PP ++Ê£¿ô¤Î\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢Ç¤°Õ¤Î¿ô¤Î³°ÉôÀ¸À®¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤Ç¤­¤Þ¤¹¡£Javadoc 1\&.2¤Ë¤Ï¡¢Ê£¿ô¤Î\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Ê¤¤¤È¤¤¤¦´ûÃΤÎbug¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤ÏJavadoc 1\&.2\&.2¤Ç½¤Àµ¤µ¤ì¤Þ¤·¤¿¡£¥ê¥ó¥¯¤¹¤ë³°Éô¥É¥­¥å¥á¥ó¥È¤´¤È¤Ë¡¢¼¡¤Î¤è¤¦¤ËÊÌ¡¹¤Î¥ê¥ó¥¯¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fBjavadoc \-link extdocURL1 \-link extdocURL2 \&.\&.\&. \-link extdocURLn com\&.mypackage\fR ++\fIextdocURL1\fR¡¢\fIextdocURL2\fR¡¢\&.\fB\&.\&. extdocURLn\fR¤Ï¡¢¤½¤ì¤¾¤ì³°Éô¥É¥­¥å¥á¥ó¥È¤Î¥ë¡¼¥È¤ò»Ø¤·¡¢³Æ¥ë¡¼¥È¤Ë¤Ï¡¢package\-list¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤¬Æþ¤Ã¤Æ¤¤¤Þ¤¹¡£ ++.PP ++¥¯¥í¥¹¥ê¥ó¥¯ ++.PP ++°ÊÁ°¤ËºîÀ®¤µ¤ì¤¿Ê£¿ô¤Î¥É¥­¥å¥á¥ó¥È¤ò¥¯¥í¥¹¥ê¥ó¥¯¤¹¤ë¾ì¹ç¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¤¬É¬Íפˤʤ뤳¤È¤¬¤¢¤ê¤Þ¤¹¡£¤É¤Î¥É¥­¥å¥á¥ó¥È¤Ë¤Ä¤¤¤Æ¤âpackage\-list¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥È¤ËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë»þÅÀ¤Ç¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤Îpackage\-list¤Ï¤Þ¤À¸ºß¤·¤Æ¤¤¤Þ¤»¤ó¡£¤·¤¿¤¬¤Ã¤Æ¡¢³°Éô¥ê¥ó¥¯¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤òÀ¸À®¤·¤¿¸å¤Ç¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Ê¤ª¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++¤³¤Î¾ì¹ç¡¢ºÇ½é¤Î¥É¥­¥å¥á¥ó¥ÈÀ¸À®¤ÎÌÜŪ¤Ï¡¢package\-list¤òºîÀ®¤¹¤ë¤³¤È¤Ç¤¹(¥Ñ¥Ã¥±¡¼¥¸Ì¾¤òÇÄ°®¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¼êÆ°¤ÇºîÀ®¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó)¡£¼¡¤Ë¡¢2ÈÖÌܤΥɥ­¥å¥á¥ó¥È¤È¤½¤Î³°Éô¥ê¥ó¥¯¤òÀ¸À®¤·¤Þ¤¹¡£É¬Íפʳ°Éô¤Îpackage\-list¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤«¤é·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .PP + \-linkoffline \fIextdocURL packagelistLoc\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Î¥Ð¥ê¥¨¡¼¥·¥ç¥ó¤Ç¤¹¡£Î¾Êý¤È¤â¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô»²¾È¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬WebÀܳ¤ò»ÈÍѤ·¤Æ¥É¥­¥å¥á¥ó¥È¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤È¤­¡¢Web¾å¤Î¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤¹¤ë¤Ë¤Ï¡¢\fI\-link\fRo\fIffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£³°Éô¥É¥­¥å¥á¥ó¥È¤Îpackage\-list¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤È¤­¡¢¤Þ¤¿¤Ï¤³¤Î¥Õ¥¡¥¤¥ë¤¬\fIextdocURL\fR¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Ë¤Ï¸ºß¤»¤º¡¢\fIpackageListLoc\fR¤Ç»ØÄê¤Ç¤­¤ëÊ̤ξì½ê(Ä̾ï¥í¡¼¥«¥ë)¤Ë¸ºß¤¹¤ë¤È¤­¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fIextdocURL\fR¤ËWorld Wide Web¾å¤Ç¤·¤«¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®»þ¤Ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬Web¤ËÀܳ¤¹¤ëɬÍפ¬¤¢¤ë¤È¤¤¤¦À©Ì󤬤ʤ¯¤Ê¤ê¤Þ¤¹¡£¤â¤¦1¤Ä¤ÎÍÑÅӤϡ¢¥É¥­¥å¥á¥ó¥È¤ò¹¹¿·¤¹¤ë¤¿¤á¤Î²óÈòºö¤È¤·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥ÈÁ´ÂΤËÂФ·¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢Êѹ¹¤·¤¿°ìÉô¤Î¥Ñ¥Ã¥±¡¼¥¸¤ËÂФ·¤Æ¤Î¤ß\fIjavadoc\fR¥³¥Þ¥ó¥É¤òºÆÅټ¹Ԥ·¤Æ¡¢¹¹¿·¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢¥ª¥ê¥¸¥Ê¥ë¤Î¥»¥Ã¥È¤ËÁÞÆþ¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Ï°ú¿ô¤ò2¤Ä¼è¤ê¤Þ¤¹¡£Âè1°ú¿ô¤Ï\fI<a href>\fR¥ê¥ó¥¯¤ËÁȤ߹þ¤Þ¤ì¤ëʸ»úÎó¤ò»ØÄꤷ¡¢Âè2°ú¿ô¤Ïpackage\-list¤Î¸¡º÷¾ì½ê¤ò\fI\-linkoffline\fR¤ËÅÁ¤¨¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Î¥Ð¥ê¥¨¡¼¥·¥ç¥ó¤Ç¤¹¡£Î¾Êý¤È¤â¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô»²¾È¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯¤òºîÀ®¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬WebÀܳ¤ò»ÈÍѤ·¤Æ¥É¥­¥å¥á¥ó¥È¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤È¤­¡¢Web¾å¤Î¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤¹¤ë¤Ë¤Ï¡¢\fB\-link\fRo\fBffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£³°Éô¥É¥­¥å¥á¥ó¥È¤Îpackage\-list¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤È¤­¡¢¤Þ¤¿¤Ï¤³¤Î¥Õ¥¡¥¤¥ë¤¬\fBextdocURL\fR¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Ë¤Ï¸ºß¤»¤º¡¢\fBpackageListLoc\fR¤Ç»ØÄê¤Ç¤­¤ëÊ̤ξì½ê(Ä̾ï¥í¡¼¥«¥ë)¤Ë¸ºß¤¹¤ë¤È¤­¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fBextdocURL\fR¤ËWorld Wide Web¾å¤Ç¤·¤«¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤ê¡¢¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®»þ¤Ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬Web¤ËÀܳ¤¹¤ëɬÍפ¬¤¢¤ë¤È¤¤¤¦À©Ì󤬤ʤ¯¤Ê¤ê¤Þ¤¹¡£¤â¤¦1¤Ä¤ÎÍÑÅӤϡ¢¥É¥­¥å¥á¥ó¥È¤ò¹¹¿·¤¹¤ë¤¿¤á¤Î²óÈòºö¤È¤·¤Æ»ÈÍѤ¹¤ë¤³¤È¤Ç¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¥»¥Ã¥ÈÁ´ÂΤËÂФ·¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¸å¡¢Êѹ¹¤·¤¿°ìÉô¤Î¥Ñ¥Ã¥±¡¼¥¸¤ËÂФ·¤Æ¤Î¤ß\fBjavadoc\fR¥³¥Þ¥ó¥É¤òºÆÅټ¹Ԥ·¤Æ¡¢¹¹¿·¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢¥ª¥ê¥¸¥Ê¥ë¤Î¥»¥Ã¥È¤ËÁÞÆþ¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Ï°ú¿ô¤ò2¤Ä¼è¤ê¤Þ¤¹¡£Âè1°ú¿ô¤Ï\fB<a href>\fR¥ê¥ó¥¯¤ËÁȤ߹þ¤Þ¤ì¤ëʸ»úÎó¤ò»ØÄꤷ¡¢Âè2°ú¿ô¤Ïpackage\-list¤Î¸¡º÷¾ì½ê¤ò\fB\-linkoffline\fR¤ËÅÁ¤¨¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2839,7 +2949,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIextdocURL\fR¤ÎÃͤϡ¢¥ê¥ó¥¯Àè¤È¤·¤Æ»ØÄꤹ¤ë¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô¥É¥­¥å¥á¥ó¥È¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÀäÂÐURL¤Þ¤¿¤ÏÁêÂÐURL¤Ç¤¹¡£ÁêÂÐURL¤Î¾ì¹ç¡¢Ãͤϡ¢À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê(\fI\-d\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄê)¤«¤é¥ê¥ó¥¯Àè¤È¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¤Ø¤ÎÁêÂХѥ¹¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤Î\fIextdocURL\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBextdocURL\fR¤ÎÃͤϡ¢¥ê¥ó¥¯Àè¤È¤·¤Æ»ØÄꤹ¤ë¡¢Javadoc¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿³°Éô¥É¥­¥å¥á¥ó¥È¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤ÎÀäÂÐURL¤Þ¤¿¤ÏÁêÂÐURL¤Ç¤¹¡£ÁêÂÐURL¤Î¾ì¹ç¡¢Ãͤϡ¢À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê(\fB\-d\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄê)¤«¤é¥ê¥ó¥¯Àè¤È¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¤Ø¤ÎÁêÂХѥ¹¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤Î\fIextdocURL\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -2850,14 +2960,16 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackagelistLoc\fR¤ÎÃͤϡ¢³°Éô¥É¥­¥å¥á¥ó¥È¤Îpackage\-list¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Î¥Ñ¥¹¤Þ¤¿¤ÏURL¤Ç¤¹¡£¤³¤ì¤Ï¡¢URL (http:¤Þ¤¿¤Ïfile:)¤Ç¤â¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£¤Þ¤¿¡¢ÀäÂХѥ¹¤ÈÁêÂХѥ¹¤Î¤É¤Á¤é¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ÁêÂХѥ¹¤Î¾ì¹ç¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤µ¤ì¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤È¤·¤Æ»ØÄꤷ¤Þ¤¹¡£package\-list¥Õ¥¡¥¤¥ë̾¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ +-.sp +-»ØÄꤷ¤¿\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ç¡¢Ê£¿ô¤Î\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Javadoc 1\&.2\&.2¤è¤êÁ°¤Ç¤Ï¡¢\fI\-linkfile\fR¥ª¥×¥·¥ç¥ó¤Ï1²ó¤·¤«»ØÄê¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£ +-.RE +-.RE +-³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐ¥ê¥ó¥¯.PP +-http://docs\&.oracle\&.com/javase/8/docs/api/index\&.html¤Ë¼¨¤¹¤è¤¦¤Ê¡¢\fIjava\&.lang\fR¡¢ +-\fIjava\&.io\fR¤ª¤è¤Ó¤½¤Î¾¤ÎJava SE¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBpackagelistLoc\fR¤ÎÃͤϡ¢³°Éô¥É¥­¥å¥á¥ó¥È¤Îpackage\-list¥Õ¥¡¥¤¥ë¤ò´Þ¤à¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Î¥Ñ¥¹¤Þ¤¿¤ÏURL¤Ç¤¹¡£¤³¤ì¤Ï¡¢URL (http:¤Þ¤¿¤Ïfile:)¤Ç¤â¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£¤Þ¤¿¡¢ÀäÂХѥ¹¤ÈÁêÂХѥ¹¤Î¤É¤Á¤é¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£ÁêÂХѥ¹¤Î¾ì¹ç¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤µ¤ì¤ë¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹¤È¤·¤Æ»ØÄꤷ¤Þ¤¹¡£package\-list¥Õ¥¡¥¤¥ë̾¤ò´Þ¤á¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++.sp ++»ØÄꤷ¤¿\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô¤Ç¡¢Ê£¿ô¤Î\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Javadoc 1\&.2\&.2¤è¤êÁ°¤Ç¤Ï¡¢\fB\-linkfile\fR¥ª¥×¥·¥ç¥ó¤Ï1²ó¤·¤«»ØÄê¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£ ++.RE ++.RE ++.PP ++³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÀäÂÐ¥ê¥ó¥¯ ++.PP ++http://docs\&.oracle\&.com/javase/8/docs/api/index\&.html¤Ë¼¨¤¹¤è¤¦¤Ê¡¢\fBjava\&.lang\fR¡¢ ++\fBjava\&.io\fR¤ª¤è¤Ó¤½¤Î¾¤ÎJava SE¥Ñ¥Ã¥±¡¼¥¸¤Ë¥ê¥ó¥¯¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ + .PP + ¤¿¤À¤·¡¢¥·¥§¥ë¤Ë¤ÏWeb¥¢¥¯¥»¥¹¸¢¤¬¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ + .sp +@@ -2880,78 +2992,91 @@ + .sp -1 + .IP " 2." 4.2 + .\} +-¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥«¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤·¡¢¤³¤Î¥í¡¼¥«¥ë¡¦¥³¥Ô¡¼¤òÂè2°ú¿ô\fIpackagelistLoc\fR¤Ç»ØÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¥«¥ì¥ó¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê(\&.)¤ËÊݸ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.RE +-.PP +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Java SE¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¤ò»ý¤Äc\fIom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¥¯¥é¥¹\fItrees\fRÆâ¤Î\fIObject\fR¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fI\-sourcepath\fR¤Ê¤É¡¢Â¾¤ÎɬÍפʥª¥×¥·¥ç¥ó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ ++¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥«¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊݸ¤·¡¢¤³¤Î¥í¡¼¥«¥ë¡¦¥³¥Ô¡¼¤òÂè2°ú¿ô\fBpackagelistLoc\fR¤Ç»ØÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ï¥«¥ì¥ó¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê(\&.)¤ËÊݸ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢Java SE¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¤ò»ý¤Äc\fBom\&.mypackage\fR¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¥É¥­¥å¥á¥ó¥È¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð¥¯¥é¥¹\fBtrees\fRÆâ¤Î\fBObject\fR¥¯¥é¥¹¤Ø¤Î¥ê¥ó¥¯¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fB\-sourcepath\fR¤Ê¤É¡¢Â¾¤ÎɬÍפʥª¥×¥·¥ç¥ó¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-linkoffline http://docs\&.oracle\&.com/javase/8/docs/api/ \&. com\&.mypackage ++\fBjavadoc \-linkoffline http://docs\&.oracle\&.com/javase/8/docs/api/ \&. com\&.mypackage \fR ++ + .fi + .if n \{\ + .RE + .\} +-³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÁêÂÐ¥ê¥ó¥¯.PP +-\fI\-linkoffline\fR¤òÁêÂХѥ¹¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¤³¤È¤Ï¤¢¤Þ¤ê¤¢¤ê¤Þ¤»¤ó¡£Íýͳ¤Ïñ½ã¤Ç¡¢Ä̾ï¤Ï\fI\-link\fR¤Ç´Ö¤Ë¹ç¤¦¤«¤é¤Ç¤¹¡£\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢Ä̾package\-list¥Õ¥¡¥¤¥ë¤Ï¥í¡¼¥«¥ë¤Ç¡¢ÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¥ê¥ó¥¯Àè¤Î¥Õ¥¡¥¤¥ë¤â¥í¡¼¥«¥ë¤Ê¤Î¤Ç¡¢Ä̾ï¤Ï\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Î2¤Ä¤Î°ú¿ô¤Ë¡¢°Û¤Ê¤ë¥Ñ¥¹¤ò»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£2¤Ä¤Î°ú¿ô¤¬Æ±°ì¤Î¾ì¹ç¡¢\fI\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£ +-package\-list¥Õ¥¡¥¤¥ë¤Î¼êÆ°¤Ç¤ÎºîÀ®.PP +-package\-list¥Õ¥¡¥¤¥ë¤¬¤Þ¤À¸ºß¤·¤Ê¤¯¤Æ¤â¡¢¥É¥­¥å¥á¥ó¥È¤Î¥ê¥ó¥¯Àè¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤ò¼êÆ°¤ÇºîÀ®¤·¡¢\fIpackagelistLoc\fR¤Ç¤½¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIcom\&.apipackage\fR¤¬ºÇ½é¤ËÀ¸À®¤µ¤ì¤¿»þÅÀ¤Ç\fIcom\&.spipackage\fR¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤¬Â¸ºß¤·¤Ê¤¤¤È¤¤¤¦Á°½Ð¤Î¥±¡¼¥¹¤¬°ìÎã¤È¤·¤Æµó¤²¤é¤ì¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¤ï¤«¤Ã¤Æ¤¤¤ë¤â¤Î¤Î¡¢¤Þ¤À¸ø³«¤µ¤ì¤Æ¤¤¤Ê¤¤¡¢¿·¤·¤¤³°Éô¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤¹¤ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¤Þ¤¿¡¢package\-list¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤¤Javadoc 1\&.0¤Þ¤¿¤Ï1\&.1¤ÇÀ¸À®¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸ÍѤËpackage\-list¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¾ì¹ç¤Ë¤â¡¢¤³¤ÎÊýË¡¤¬»ÈÍѤǤ­¤Þ¤¹¡£Æ±Íͤˡ¢2¤Ä¤Î´ë¶È¤¬Ì¤¸ø³«¤Îpackage\-list¥Õ¥¡¥¤¥ë¤ò¶¦Í­¤Ç¤­¤ë¤¿¤á¡¢¥¯¥í¥¹¥ê¥ó¥¯¤òÀßÄꤷ¤¿¥É¥­¥å¥á¥ó¥È¤òƱ»þ¤Ë¥ê¥ê¡¼¥¹¤¹¤ë¤³¤È¤â²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ +-Ê£¿ô¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯.PP +-»²¾ÈÀè¤ÎÀ¸À®¥É¥­¥å¥á¥ó¥È¤´¤È¤Ë1²ó¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++.PP ++³°Éô¥É¥­¥å¥á¥ó¥È¤Ø¤ÎÁêÂÐ¥ê¥ó¥¯ ++.PP ++\fB\-linkoffline\fR¤òÁêÂХѥ¹¤È¤È¤â¤Ë»ÈÍѤ¹¤ë¤³¤È¤Ï¤¢¤Þ¤ê¤¢¤ê¤Þ¤»¤ó¡£Íýͳ¤Ïñ½ã¤Ç¡¢Ä̾ï¤Ï\fB\-link\fR¤Ç´Ö¤Ë¹ç¤¦¤«¤é¤Ç¤¹¡£\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢Ä̾package\-list¥Õ¥¡¥¤¥ë¤Ï¥í¡¼¥«¥ë¤Ç¡¢ÁêÂÐ¥ê¥ó¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¥ê¥ó¥¯Àè¤Î¥Õ¥¡¥¤¥ë¤â¥í¡¼¥«¥ë¤Ê¤Î¤Ç¡¢Ä̾ï¤Ï\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤Î2¤Ä¤Î°ú¿ô¤Ë¡¢°Û¤Ê¤ë¥Ñ¥¹¤ò»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£2¤Ä¤Î°ú¿ô¤¬Æ±°ì¤Î¾ì¹ç¡¢\fB\-link\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++.PP ++package\-list¥Õ¥¡¥¤¥ë¤Î¼êÆ°¤Ç¤ÎºîÀ® ++.PP ++package\-list¥Õ¥¡¥¤¥ë¤¬¤Þ¤À¸ºß¤·¤Ê¤¯¤Æ¤â¡¢¥É¥­¥å¥á¥ó¥È¤Î¥ê¥ó¥¯Àè¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥³¥Ô¡¼¤ò¼êÆ°¤ÇºîÀ®¤·¡¢\fBpackagelistLoc\fR¤Ç¤½¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBcom\&.apipackage\fR¤¬ºÇ½é¤ËÀ¸À®¤µ¤ì¤¿»þÅÀ¤Ç\fBcom\&.spipackage\fR¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ê¥¹¥È¤¬Â¸ºß¤·¤Ê¤¤¤È¤¤¤¦Á°½Ð¤Î¥±¡¼¥¹¤¬°ìÎã¤È¤·¤Æµó¤²¤é¤ì¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¤ï¤«¤Ã¤Æ¤¤¤ë¤â¤Î¤Î¡¢¤Þ¤À¸ø³«¤µ¤ì¤Æ¤¤¤Ê¤¤¡¢¿·¤·¤¤³°Éô¥É¥­¥å¥á¥ó¥È¤Ë¥ê¥ó¥¯¤¹¤ë¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¤Þ¤¿¡¢package\-list¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Ê¤¤Javadoc 1\&.0¤Þ¤¿¤Ï1\&.1¤ÇÀ¸À®¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸ÍѤËpackage\-list¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¾ì¹ç¤Ë¤â¡¢¤³¤ÎÊýË¡¤¬»ÈÍѤǤ­¤Þ¤¹¡£Æ±Íͤˡ¢2¤Ä¤Î´ë¶È¤¬Ì¤¸ø³«¤Îpackage\-list¥Õ¥¡¥¤¥ë¤ò¶¦Í­¤Ç¤­¤ë¤¿¤á¡¢¥¯¥í¥¹¥ê¥ó¥¯¤òÀßÄꤷ¤¿¥É¥­¥å¥á¥ó¥È¤òƱ»þ¤Ë¥ê¥ê¡¼¥¹¤¹¤ë¤³¤È¤â²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.PP ++Ê£¿ô¥É¥­¥å¥á¥ó¥È¤Ø¤Î¥ê¥ó¥¯ ++.PP ++»²¾ÈÀè¤ÎÀ¸À®¥É¥­¥å¥á¥ó¥È¤´¤È¤Ë1²ó¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-linkoffline extdocURL1 packagelistLoc1 \-linkoffline extdocURL2 +-packagelistLoc2 \&.\&.\&. ++\fBjavadoc \-linkoffline extdocURL1 packagelistLoc1 \-linkoffline extdocURL2\fR ++\fBpackagelistLoc2 \&.\&.\&.\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥É¥­¥å¥á¥ó¥È¤Î¹¹¿·.PP +-¥×¥í¥¸¥§¥¯¥È¤Ë²¿½½¤Þ¤¿¤Ï²¿É´¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤â¡¢\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Ä¥ê¡¼Á´ÂΤǤ¹¤Ç¤Ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¤³¤È¤¬¤¢¤ë¾ì¹ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤ï¤º¤«¤ÊÊѹ¹¤ò¿×®¤Ë²Ã¤¨¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î°ìÉô¤Ç\fIjavadoc\fR¥³¥Þ¥ó¥É¤òºÆ¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£2²óÌܤμ¹Ԥϡ¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òÊѹ¹¤·¡¢Àë¸À¤ÏÊѹ¹¤·¤Ê¤¤¾ì¹ç¤Ë¤Î¤ßÀµ¤·¤¯½èÍý¤µ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤ËÂФ·¤ÆÀë¸À¤òÄɲᢺï½ü¡¢¤Þ¤¿¤ÏÊѹ¹¤·¤¿¾ì¹ç¤Ï¡¢º÷°ú¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¡¢·Ñ¾µ¤µ¤ì¤ë¥á¥ó¥Ð¡¼¤Î¥ê¥¹¥È¡¢»ÈÍÑ¥Ú¡¼¥¸¤Ê¤É¤Î¾ì½ê¤Ç¡¢¥ê¥ó¥¯¤¬²õ¤ì¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ +-.PP +-¤Þ¤º¡¢¤³¤Î¿·¤·¤¤¾®µ¬ÌϤʼ¹ԤǻÈÍѤ¹¤ë¡¢¿·¤·¤¤À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê(update¤Ê¤É)¤òºîÀ®¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¸µ¤ÎÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤Ïhtml¤Ç¤¹¡£ºÇ¤âñ½ã¤ÊÎã¤Ç¤Ï¡¢html¥Ç¥£¥ì¥¯¥È¥ê¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¤Þ¤¹¡£\fI\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ÎÂè1°ú¿ô¤Ë¥«¥ì¥ó¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê(\&.)¤òÀßÄꤷ¡¢Âè2°ú¿ô¤Ëpackage\-list¤¬¸¡º÷¤µ¤ì¤ëhtml¤Ø¤ÎÁêÂХѥ¹¤òÀßÄꤷ¡¢¹¹¿·¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¤ß¤òÅϤ·¤Þ¤¹¡£ ++.PP ++¥É¥­¥å¥á¥ó¥È¤Î¹¹¿· ++.PP ++¥×¥í¥¸¥§¥¯¥È¤Ë²¿½½¤Þ¤¿¤Ï²¿É´¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¤â¡¢\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Ä¥ê¡¼Á´ÂΤǤ¹¤Ç¤Ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¤³¤È¤¬¤¢¤ë¾ì¹ç¡¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤ï¤º¤«¤ÊÊѹ¹¤ò¿×®¤Ë²Ã¤¨¡¢¥½¡¼¥¹¡¦¥Ä¥ê¡¼¤Î°ìÉô¤Ç\fBjavadoc\fR¥³¥Þ¥ó¥É¤òºÆ¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£2²óÌܤμ¹Ԥϡ¢¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤òÊѹ¹¤·¡¢Àë¸À¤ÏÊѹ¹¤·¤Ê¤¤¾ì¹ç¤Ë¤Î¤ßÀµ¤·¤¯½èÍý¤µ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¥½¡¼¥¹¡¦¥³¡¼¥É¤ËÂФ·¤ÆÀë¸À¤òÄɲᢺï½ü¡¢¤Þ¤¿¤ÏÊѹ¹¤·¤¿¾ì¹ç¤Ï¡¢º÷°ú¡¢¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¡¢·Ñ¾µ¤µ¤ì¤ë¥á¥ó¥Ð¡¼¤Î¥ê¥¹¥È¡¢»ÈÍÑ¥Ú¡¼¥¸¤Ê¤É¤Î¾ì½ê¤Ç¡¢¥ê¥ó¥¯¤¬²õ¤ì¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++¤Þ¤º¡¢¤³¤Î¿·¤·¤¤¾®µ¬ÌϤʼ¹ԤǻÈÍѤ¹¤ë¡¢¿·¤·¤¤À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê(update¤Ê¤É)¤òºîÀ®¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¸µ¤ÎÀ¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤Ïhtml¤Ç¤¹¡£ºÇ¤âñ½ã¤ÊÎã¤Ç¤Ï¡¢html¥Ç¥£¥ì¥¯¥È¥ê¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¤Þ¤¹¡£\fB\-linkoffline\fR¥ª¥×¥·¥ç¥ó¤ÎÂè1°ú¿ô¤Ë¥«¥ì¥ó¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê(\&.)¤òÀßÄꤷ¡¢Âè2°ú¿ô¤Ëpackage\-list¤¬¸¡º÷¤µ¤ì¤ëhtml¤Ø¤ÎÁêÂХѥ¹¤òÀßÄꤷ¡¢¹¹¿·¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¤ß¤òÅϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d update \-linkoffline \&. html com\&.mypackage ++\fBjavadoc \-d update \-linkoffline \&. html com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î½ªÎ»¸å¡¢update/com/packageÆâ¤ÎÀ¸À®¤µ¤ì¤¿¥¯¥é¥¹¤Î¥Ú¡¼¥¸¤ò¥³¥Ô¡¼¤·(³µÍפäº÷°ú¤Ï½ü¤¯)¡¢html/com/packageÆâ¤Î¸µ¤Î¥Õ¥¡¥¤¥ë¤Ë¾å½ñ¤­¤·¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î½ªÎ»¸å¡¢update/com/packageÆâ¤ÎÀ¸À®¤µ¤ì¤¿¥¯¥é¥¹¤Î¥Ú¡¼¥¸¤ò¥³¥Ô¡¼¤·(³µÍפäº÷°ú¤Ï½ü¤¯)¡¢html/com/packageÆâ¤Î¸µ¤Î¥Õ¥¡¥¤¥ë¤Ë¾å½ñ¤­¤·¤Þ¤¹¡£ + .PP + \-linksource + .RS 4 + ³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë(¹ÔÈÖ¹æÉÕ¤­)¤ÎHTML¥Ð¡¼¥¸¥ç¥ó¤òºîÀ®¤·¡¢É¸½àHTML¥É¥­¥å¥á¥ó¥È¤«¤é¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯¤òÄɲä·¤Þ¤¹¡£¥ê¥ó¥¯¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ë¥¯¥é¥¹¡¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¡¢¥Õ¥£¡¼¥ë¥É¤ËÂФ·¤ÆºîÀ®¤µ¤ì¤Þ¤¹¡£¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¡¢¤¿¤È¤¨¤Ð¥Ç¥Õ¥©¥ë¥È¡¦¥³¥ó¥¹¥È¥é¥¯¥¿¤äÀ¸À®¤µ¤ì¤¿¥¯¥é¥¹¤ËÂФ·¤Æ¤Ï¡¢¥ê¥ó¥¯¤ÏºîÀ®¤µ¤ì¤Þ¤»¤ó¡£ + .sp +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-public\fR¡¢\fI\-package\fR¡¢\fI\-protected\fR¤ª¤è¤Ó\fI\-private\fR¤Î³Æ¥ª¥×¥·¥ç¥ó¤È¤Ï´Ø·¸¤Ê¤¯¡¢Èó¸ø³«¤Î¥¯¥é¥¹¡¢¥Õ¥£¡¼¥ë¥É¡¢Èó¸ø³«¤Î¥á¥½¥Ã¥É¤ÎËÜÂΤò¤Ï¤¸¤á¤È¤¹¤ëÁȤ߹þ¤Þ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎÈó¸ø³«¼ÂÁõ¤Î¾ÜºÙ¤ò¸ø³«¤·¤Þ¤¹¡£\fI\-private\fR¥ª¥×¥·¥ç¥ó¤â¤¢¤ï¤»¤Æ»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢Èó¸ø³«¤Î¥¯¥é¥¹¤ä¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î°ìÉô¤Ë¤Ï¡¢¥ê¥ó¥¯¤ò²ð¤·¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ +-.sp +-³Æ¥ê¥ó¥¯¤Ï¡¢¤½¤ÎÀë¸ÀÆâ¤Î¼±ÊÌ»Ò̾¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIButton\fR¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ø¤Î¥ê¥ó¥¯¤Ï¡¢\fIButton\fR¤È¤¤¤¦¸ì¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-public\fR¡¢\fB\-package\fR¡¢\fB\-protected\fR¤ª¤è¤Ó\fB\-private\fR¤Î³Æ¥ª¥×¥·¥ç¥ó¤È¤Ï´Ø·¸¤Ê¤¯¡¢Èó¸ø³«¤Î¥¯¥é¥¹¡¢¥Õ¥£¡¼¥ë¥É¡¢Èó¸ø³«¤Î¥á¥½¥Ã¥É¤ÎËÜÂΤò¤Ï¤¸¤á¤È¤¹¤ëÁȤ߹þ¤Þ¤ì¤¿¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤ÎÈó¸ø³«¼ÂÁõ¤Î¾ÜºÙ¤ò¸ø³«¤·¤Þ¤¹¡£\fB\-private\fR¥ª¥×¥·¥ç¥ó¤â¤¢¤ï¤»¤Æ»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢Èó¸ø³«¤Î¥¯¥é¥¹¤ä¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î°ìÉô¤Ë¤Ï¡¢¥ê¥ó¥¯¤ò²ð¤·¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ++.sp ++³Æ¥ê¥ó¥¯¤Ï¡¢¤½¤ÎÀë¸ÀÆâ¤Î¼±ÊÌ»Ò̾¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBButton\fR¥¯¥é¥¹¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ø¤Î¥ê¥ó¥¯¤Ï¡¢\fBButton\fR¤È¤¤¤¦¸ì¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public class Button extends Component implements Accessible ++\fBpublic class Button extends Component implements Accessible\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIButton\fR¥¯¥é¥¹¤Î\fIgetLabel\fR¥á¥½¥Ã¥É¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ø¤Î¥ê¥ó¥¯¤Ï¡¢\fIgetLabel\fR¤È¤¤¤¦¸ì¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBButton\fR¥¯¥é¥¹¤Î\fBgetLabel\fR¥á¥½¥Ã¥É¤Î¥½¡¼¥¹¡¦¥³¡¼¥É¤Ø¤Î¥ê¥ó¥¯¤Ï¡¢\fBgetLabel\fR¤È¤¤¤¦¸ì¤Î¾å¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-public String getLabel() ++\fBpublic String getLabel()\fR ++ + .fi + .if n \{\ + .RE +@@ -2960,7 +3085,7 @@ + .PP + \-group groupheading \fIpackagepattern:packagepattern\fR + .RS 4 +-³µÍ×¥Ú¡¼¥¸¤ÎÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¡¢»ØÄꤷ¤¿¥°¥ë¡¼¥×¤Ëʬ¤±¤Æ¡¢¥°¥ë¡¼¥×¤´¤È¤Ëɽ¤òºîÀ®¤·¤Þ¤¹¡£³Æ¥°¥ë¡¼¥×¤Ï¡¢¤½¤ì¤¾¤ìÊ̤Î\fI\-group\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤Þ¤¹¡£¥°¥ë¡¼¥×¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿½ç½ø¤Ç¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢¥°¥ë¡¼¥×Æâ¤Ç¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£»ØÄꤷ¤¿\fI\-group\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢\fIpackagepattern\fR¼°¤Î¥ê¥¹¥È¤Ë°ìÃפ¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤¬¡¢¸«½Ð¤·¤È¤·¤Æ\fIgroupheading\fR¤ò»ý¤Ä1¤Ä¤Îɽ¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++³µÍ×¥Ú¡¼¥¸¤ÎÊ£¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¡¢»ØÄꤷ¤¿¥°¥ë¡¼¥×¤Ëʬ¤±¤Æ¡¢¥°¥ë¡¼¥×¤´¤È¤Ëɽ¤òºîÀ®¤·¤Þ¤¹¡£³Æ¥°¥ë¡¼¥×¤Ï¡¢¤½¤ì¤¾¤ìÊ̤Î\fB\-group\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤Þ¤¹¡£¥°¥ë¡¼¥×¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿½ç½ø¤Ç¥Ú¡¼¥¸¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¢¥°¥ë¡¼¥×Æâ¤Ç¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£»ØÄꤷ¤¿\fB\-group\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢\fBpackagepattern\fR¼°¤Î¥ê¥¹¥È¤Ë°ìÃפ¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤¬¡¢¸«½Ð¤·¤È¤·¤Æ\fIgroupheading\fR¤ò»ý¤Ä1¤Ä¤Îɽ¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -2970,7 +3095,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIgroupheading\fR¤Ë¤Ï¡¢Ç¤°Õ¤Î¥Æ¥­¥¹¥È¤ò»ØÄê¤Ç¤­¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤Ï¡¢¥°¥ë¡¼¥×¤Îɽ¸«½Ð¤·¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBgroupheading\fR¤Ë¤Ï¡¢Ç¤°Õ¤Î¥Æ¥­¥¹¥È¤ò»ØÄê¤Ç¤­¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤Ï¡¢¥°¥ë¡¼¥×¤Îɽ¸«½Ð¤·¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -2981,54 +3106,55 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIpackagepattern\fR¤ÎÃͤˤϡ¢Ç¤°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ÎÀèƬÉôʬ¤È¤½¤ì¤Ë³¤¯1¤Ä¤Î¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ÇǤ°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯¤Ï»ÈÍѤǤ­¤ëÍ£°ì¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤Ç¡¢Ç¤°Õ¤Îʸ»ú¤Ë°ìÃפ¹¤ë¡¢¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£1¤Ä¤Î¥°¥ë¡¼¥×¤Ë¤Ï¡¢¥³¥í¥ó(:)¤Ç¶èÀڤäÆÊ£¿ô¤Î¥Ñ¥¿¡¼¥ó¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Ñ¥¿¡¼¥ó¤Þ¤¿¤Ï¥Ñ¥¿¡¼¥ó¡¦¥ê¥¹¥È¤Ç¥¢¥¹¥¿¥ê¥¹¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥Ñ¥¿¡¼¥ó¡¦¥ê¥¹¥È¤Ï\fI"java\&.lang*:java\&.util"\fR¤Î¤è¤¦¤Ë°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.RE +-.sp +-\fI\-group\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¸«½Ð¤·\fIPackages\fR¤ª¤è¤ÓŬÀڤʾ®¸«½Ð¤·¤ò»ý¤Ä1¤Ä¤Î¥°¥ë¡¼¥×¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£¾®¸«½Ð¤·¤Ë¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸(¤¹¤Ù¤Æ¤Î¥°¥ë¡¼¥×)¤¬´Þ¤Þ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢»Ä¤ê¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡Ö¤½¤Î¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡×¤È¤¤¤¦¥µ¥Ö¸«½Ð¤·¤ò»ý¤ÄÆÈΩ¤·¤¿¥°¥ë¡¼¥×¤ËÆþ¤ì¤é¤ì¤Þ¤¹¡£ +-.sp +-¤¿¤È¤¨¤Ð¡¢¼¡¤Î\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢3¤Ä¤Î¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤¬\fI¡Ö¥³¥¢¡×\fR¡¢\fI¡Ö³ÈÄ¥¡×\fR¤ª¤è¤Ó\fI¡Ö¤½¤Î¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡×\fR¤Ëʬ¤±¤é¤ì¤Þ¤¹¡£\fIjava\&.lang*\fR¤Ç¤Ï¡¢ºÇ¸å¤Î¥É¥Ã¥È(\&.)¤ò»ØÄꤷ¤Æ¤¤¤Þ¤»¤ó¡£\fIjava\&.lang\&.*\fR¤Î¤è¤¦¤Ë¥É¥Ã¥È¤òÆþ¤ì¤ë¤È¡¢\fI java\&.lang\fR¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBpackagepattern\fR¤ÎÃͤˤϡ¢Ç¤°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ÎÀèƬÉôʬ¤È¤½¤ì¤Ë³¤¯1¤Ä¤Î¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ÇǤ°Õ¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯¤Ï»ÈÍѤǤ­¤ëÍ£°ì¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤Ç¡¢Ç¤°Õ¤Îʸ»ú¤Ë°ìÃפ¹¤ë¡¢¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£1¤Ä¤Î¥°¥ë¡¼¥×¤Ë¤Ï¡¢¥³¥í¥ó(:)¤Ç¶èÀڤäÆÊ£¿ô¤Î¥Ñ¥¿¡¼¥ó¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Ñ¥¿¡¼¥ó¤Þ¤¿¤Ï¥Ñ¥¿¡¼¥ó¡¦¥ê¥¹¥È¤Ç¥¢¥¹¥¿¥ê¥¹¥¯¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥Ñ¥¿¡¼¥ó¡¦¥ê¥¹¥È¤Ï\fB"java\&.lang*:java\&.util"\fR¤Î¤è¤¦¤Ë°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.RE ++.sp ++\fB\-group\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ï¡¢¸«½Ð¤·\fIPackages\fR¤ª¤è¤ÓŬÀڤʾ®¸«½Ð¤·¤ò»ý¤Ä1¤Ä¤Î¥°¥ë¡¼¥×¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£¾®¸«½Ð¤·¤Ë¤¹¤Ù¤Æ¤Î¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤ë¥Ñ¥Ã¥±¡¼¥¸(¤¹¤Ù¤Æ¤Î¥°¥ë¡¼¥×)¤¬´Þ¤Þ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¾ì¹ç¡¢»Ä¤ê¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡Ö¤½¤Î¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡×¤È¤¤¤¦¥µ¥Ö¸«½Ð¤·¤ò»ý¤ÄÆÈΩ¤·¤¿¥°¥ë¡¼¥×¤ËÆþ¤ì¤é¤ì¤Þ¤¹¡£ ++.sp ++¤¿¤È¤¨¤Ð¡¢¼¡¤Î\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢3¤Ä¤Î¥É¥­¥å¥á¥ó¥È²½¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤¬\fI¡Ö¥³¥¢¡×\fR¡¢\fI¡Ö³ÈÄ¥¡×\fR¤ª¤è¤Ó\fI¡Ö¤½¤Î¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡×\fR¤Ëʬ¤±¤é¤ì¤Þ¤¹¡£\fBjava\&.lang*\fR¤Ç¤Ï¡¢ºÇ¸å¤Î¥É¥Ã¥È(\&.)¤ò»ØÄꤷ¤Æ¤¤¤Þ¤»¤ó¡£\fBjava\&.lang\&.*\fR¤Î¤è¤¦¤Ë¥É¥Ã¥È¤òÆþ¤ì¤ë¤È¡¢\fB java\&.lang\fR¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-group "Core Packages" "java\&.lang*:java\&.util" +- \-group "Extension Packages" "javax\&.*" +- java\&.lang java\&.lang\&.reflect java\&.util javax\&.servlet java\&.new ++\fBjavadoc \-group "Core Packages" "java\&.lang*:java\&.util"\fR ++\fB \-group "Extension Packages" "javax\&.*"\fR ++\fB java\&.lang java\&.lang\&.reflect java\&.util javax\&.servlet java\&.new\fR ++ + .fi + .if n \{\ + .RE + .\} + \fB¥³¥¢¡¦¥Ñ¥Ã¥±¡¼¥¸\fR + .sp +-\fIjava\&.lang\fR +-.sp +-\fIjava\&.lang\&.reflect\fR +-.sp +-\fIjava\&.util\fR ++\fBjava\&.lang\fR ++.sp ++\fBjava\&.lang\&.reflect\fR ++.sp ++\fBjava\&.util\fR + .sp + \fB³ÈÄ¥µ¡Ç½¥Ñ¥Ã¥±¡¼¥¸\fR + .sp +-\fIjavax\&.servlet\fR ++\fBjavax\&.servlet\fR + .sp + \fBOther Packages\fR + .sp +-\fIjava\&.new\fR ++\fBjava\&.new\fR + .RE + .PP + \-nodeprecated + .RS 4 +-Èó¿ä¾©¤ÎAPI¤ò¥É¥­¥å¥á¥ó¥È¤ËÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢\fI\-nodeprecatedlist\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸¸ú²Ì¤¬¤¢¤ê¡¢¥É¥­¥å¥á¥ó¥È¤Î¾¤ÎÉôʬÁ´ÂΤǤ⡢Èó¿ä¾©¤ÎAPI¤¬À¸À®¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¡¼¥É¤òµ­½Ò¤·¤Æ¤¤¤ë¤È¤­¡¢Èó¿ä¾©¤Î¥³¡¼¥É¤Ë¤è¤Ã¤Æµ¤¤ò»¶¤é¤µ¤ì¤¿¤¯¤Ê¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ ++Èó¿ä¾©¤ÎAPI¤ò¥É¥­¥å¥á¥ó¥È¤ËÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢\fB\-nodeprecatedlist\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸¸ú²Ì¤¬¤¢¤ê¡¢¥É¥­¥å¥á¥ó¥È¤Î¾¤ÎÉôʬÁ´ÂΤǤ⡢Èó¿ä¾©¤ÎAPI¤¬À¸À®¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¡¼¥É¤òµ­½Ò¤·¤Æ¤¤¤ë¤È¤­¡¢Èó¿ä¾©¤Î¥³¡¼¥É¤Ë¤è¤Ã¤Æµ¤¤ò»¶¤é¤µ¤ì¤¿¤¯¤Ê¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ + .RE + .PP + \-nodeprecatedlist + .RS 4 +-Èó¿ä¾©¤ÎAPI¤Î¥ê¥¹¥È¤ò´Þ¤à¥Õ¥¡¥¤¥ë(deprecated\-list\&.html)¡¢¤ª¤è¤Ó¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¤½¤Î¥Ú¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¤¬À¸À®¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢°ú¤­Â³¤­¡¢¥É¥­¥å¥á¥ó¥È¤Î¾¤ÎÉôʬ¤Ç¤Ï¡¢Èó¿ä¾©¤ÎAPI¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Èó¿ä¾©¤ÎAPI¤¬¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë´Þ¤Þ¤ì¤Æ¤ª¤é¤º¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤ò¤¹¤Ã¤­¤ê¤È¸«¤»¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ ++Èó¿ä¾©¤ÎAPI¤Î¥ê¥¹¥È¤ò´Þ¤à¥Õ¥¡¥¤¥ë(deprecated\-list\&.html)¡¢¤ª¤è¤Ó¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¤½¤Î¥Ú¡¼¥¸¤Ø¤Î¥ê¥ó¥¯¤¬À¸À®¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢°ú¤­Â³¤­¡¢¥É¥­¥å¥á¥ó¥È¤Î¾¤ÎÉôʬ¤Ç¤Ï¡¢Èó¿ä¾©¤ÎAPI¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Èó¿ä¾©¤ÎAPI¤¬¥½¡¼¥¹¡¦¥³¡¼¥É¤Ë´Þ¤Þ¤ì¤Æ¤ª¤é¤º¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤ò¤¹¤Ã¤­¤ê¤È¸«¤»¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ + .RE + .PP + \-nosince + .RS 4 +-À¸À®¥É¥­¥å¥á¥ó¥È¤«¤é¡¢\fI@since\fR¥¿¥°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿\fI¡ÖƳÆþ¤µ¤ì¤¿¥Ð¡¼¥¸¥ç¥ó¡×\fR¥»¥¯¥·¥ç¥ó¤ò¾Êά¤·¤Þ¤¹¡£ ++À¸À®¥É¥­¥å¥á¥ó¥È¤«¤é¡¢\fB@since\fR¥¿¥°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿\fB¡ÖƳÆþ¤µ¤ì¤¿¥Ð¡¼¥¸¥ç¥ó¡×\fR¥»¥¯¥·¥ç¥ó¤ò¾Êά¤·¤Þ¤¹¡£ + .RE + .PP + \-notree +@@ -3048,18 +3174,19 @@ + .PP + \-nonavbar + .RS 4 +-Ä̾À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤ÎºÇ¾åÉô¤ÈºÇ²¼Éô¤Ëɽ¼¨¤µ¤ì¤ë¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¡¢¥Ø¥Ã¥À¡¼¡¢¤ª¤è¤Ó¥Õ¥Ã¥¿¡¼¤òÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fI\-nonavbar\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤Ë±Æ¶Á¤òÍ¿¤¨¤Þ¤»¤ó¡£\fI\-nonavbar\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢°õºþ¤¹¤ë¤¿¤á¤Ë¤Î¤ß¥Õ¥¡¥¤¥ë¤òPostScript¤äPDF¤ËÊÑ´¹¤¹¤ë¾ì¹ç¤Ê¤É¡¢ÆâÍƤΤߤ¬½ÅÍפǡ¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¤ÎɬÍפ¬¤Ê¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ ++Ä̾À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤ÎºÇ¾åÉô¤ÈºÇ²¼Éô¤Ëɽ¼¨¤µ¤ì¤ë¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¡¢¥Ø¥Ã¥À¡¼¡¢¤ª¤è¤Ó¥Õ¥Ã¥¿¡¼¤òÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£\fB\-nonavbar\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤Ë±Æ¶Á¤òÍ¿¤¨¤Þ¤»¤ó¡£\fB\-nonavbar\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢°õºþ¤¹¤ë¤¿¤á¤Ë¤Î¤ß¥Õ¥¡¥¤¥ë¤òPostScript¤äPDF¤ËÊÑ´¹¤¹¤ë¾ì¹ç¤Ê¤É¡¢ÆâÍƤΤߤ¬½ÅÍפǡ¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¤ÎɬÍפ¬¤Ê¤¤¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£ + .RE + .PP + \-helpfile \fIpath\efilename\fR + .RS 4 +-ºÇ¾åÉô¤ª¤è¤ÓºÇ²¼Éô¤Î¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¡Ö¥Ø¥ë¥×¡×¥ê¥ó¥¯¤Î¥ê¥ó¥¯Àè¤È¤Ê¤ëÂåÂإإë¥×¡¦¥Õ¥¡¥¤¥ëpath\efilename¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥ÉÆâ¤Ç¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ëhelp\-doc\&.html¤ò¼«Æ°ºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤Ë¤Ï¤É¤ó¤Ê̾Á°¤Ç¤â»ØÄê¤Ç¤­¡¢help\-doc\&.html¤Ë¸ÂÄꤵ¤ì¤Þ¤»¤ó¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼Æâ¤Î¥ê¥ó¥¯¤òɬÍפ˱þ¤¸¤ÆÄ´À°¤·¤Þ¤¹¡£ ++ºÇ¾åÉô¤ª¤è¤ÓºÇ²¼Éô¤Î¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼¤Î¡Ö¥Ø¥ë¥×¡×¥ê¥ó¥¯¤Î¥ê¥ó¥¯Àè¤È¤Ê¤ëÂåÂإإë¥×¡¦¥Õ¥¡¥¤¥ëpath\efilename¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥ÉÆâ¤Ç¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥Ø¥ë¥×¡¦¥Õ¥¡¥¤¥ëhelp\-doc\&.html¤ò¼«Æ°ºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤Ë¤Ï¤É¤ó¤Ê̾Á°¤Ç¤â»ØÄê¤Ç¤­¡¢help\-doc\&.html¤Ë¸ÂÄꤵ¤ì¤Þ¤»¤ó¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢¥Ê¥Ó¥²¡¼¥·¥ç¥ó¡¦¥Ð¡¼Æâ¤Î¥ê¥ó¥¯¤òɬÍפ˱þ¤¸¤ÆÄ´À°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-helpfile /home/user/myhelp\&.html java\&.awt\&. ++\fBjavadoc \-helpfile /home/user/myhelp\&.html java\&.awt\&.\fR ++ + .fi + .if n \{\ + .RE +@@ -3068,13 +3195,14 @@ + .PP + \-stylesheet \fIpath/filename \fR + .RS 4 +-ÂåÂØHTML¥¹¥¿¥¤¥ë¥·¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥ÉÆâ¤Ç¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥¹¥¿¥¤¥ë¥·¡¼¥È¡¦¥Õ¥¡¥¤¥ëstylesheet\&.css¤ò¼«Æ°ºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤Ë¤Ï¤É¤ó¤Ê̾Á°¤Ç¤â»ØÄê¤Ç¤­¡¢stylesheet\&.css¤Ë¸ÂÄꤵ¤ì¤Þ¤»¤ó¡£ ++ÂåÂØHTML¥¹¥¿¥¤¥ë¥·¡¼¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥ÉÆâ¤Ç¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥¹¥¿¥¤¥ë¥·¡¼¥È¡¦¥Õ¥¡¥¤¥ëstylesheet\&.css¤ò¼«Æ°ºîÀ®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤Ë¤Ï¤É¤ó¤Ê̾Á°¤Ç¤â»ØÄê¤Ç¤­¡¢stylesheet\&.css¤Ë¸ÂÄꤵ¤ì¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-stylesheet file /home/user/mystylesheet\&.css com\&.mypackage ++\fBjavadoc \-stylesheet file /home/user/mystylesheet\&.css com\&.mypackage\fR ++ + .fi + .if n \{\ + .RE +@@ -3083,7 +3211,7 @@ + .PP + \-serialwarn + .RS 4 +-\fI@serial\fR¥¿¥°¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Javadoc 1\&.2\&.2°Ê¹ß¤Ç¤Ï¡¢Ä¾Î󲽤ηٹð¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤È¤ÏµÕ¤ÎÆ°ºî¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢Ä¾Î󲽤ηٹð¤¬É½¼¨¤µ¤ì¤ë¤Î¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎľÎó²½²Äǽ¥Õ¥£¡¼¥ë¥É¤È\fIwriteExternal\fR¥á¥½¥Ã¥É¤òŬÀڤ˥ɥ­¥å¥á¥ó¥È²½¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£ ++\fB@serial\fR¥¿¥°¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë·Ù¹ð¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢Javadoc 1\&.2\&.2°Ê¹ß¤Ç¤Ï¡¢Ä¾Î󲽤ηٹð¤ÏÀ¸À®¤µ¤ì¤Þ¤»¤ó¡£°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤È¤ÏµÕ¤ÎÆ°ºî¤Ç¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢Ä¾Î󲽤ηٹð¤¬É½¼¨¤µ¤ì¤ë¤Î¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎľÎó²½²Äǽ¥Õ¥£¡¼¥ë¥É¤È\fBwriteExternal\fR¥á¥½¥Ã¥É¤òŬÀڤ˥ɥ­¥å¥á¥ó¥È²½¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£ + .RE + .PP + \-charset \fIname\fR +@@ -3091,18 +3219,19 @@ + ¤³¤Î¥É¥­¥å¥á¥ó¥ÈÍѤÎHTMLʸ»ú¥»¥Ã¥È¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î̾Á°¤Ï¡¢IANA Registry¤ÎCharacter Sets + (http://www\&.iana\&.org/assignments/character\-sets)¤Ë¼¨¤µ¤ì¤¿¡¢Í¥ÀèMIME̾¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢\fIjavadoc \-charset "iso\-8859\-1" mypackage\fR¤Ï¼¡¤Î¹Ô¤òÀ¸À®¤µ¤ì¤¿³Æ¥Ú¡¼¥¸¤Î¥Ø¥Ã¥À¡¼¤ËÁÞÆþ¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fBjavadoc \-charset "iso\-8859\-1" mypackage\fR¤Ï¼¡¤Î¹Ô¤òÀ¸À®¤µ¤ì¤¿³Æ¥Ú¡¼¥¸¤Î¥Ø¥Ã¥À¡¼¤ËÁÞÆþ¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-<META http\-equiv="Content\-Type" content="text/html; charset=ISO\-8859\-1"> ++\fB<META http\-equiv="Content\-Type" content="text/html; charset=ISO\-8859\-1">\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î\fIMETA\fR¥¿¥°¤Ï¡¢HTMLɸ½à(4197265¤ª¤è¤Ó4137321)¤ÎHTML Document Representation ++¤³¤Î\fBMETA\fR¥¿¥°¤Ï¡¢HTMLɸ½à(4197265¤ª¤è¤Ó4137321)¤ÎHTML Document Representation + (http://www\&.w3\&.org/TR/REC\-html40/charset\&.html#h\-5\&.2\&.2)¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + ¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +@@ -3113,22 +3242,23 @@ + À¸À®¤µ¤ì¤ëHTML¥Õ¥¡¥¤¥ë¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î̾Á°¤Ï¡¢IANA Registry¤ÎCharacter Sets + (http://www\&.iana\&.org/assignments/character\-sets)¤Ë¼¨¤µ¤ì¤¿¡¢Í¥ÀèMIME̾¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fI\-docencoding\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤·¡¢\fI\-encoding\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢À¸À®¤µ¤ì¤¿HTML¥Õ¥¡¥¤¥ë¤Î°Å¹æ²½¤Ï\fI\-encoding\fR¥ª¥×¥·¥ç¥ó¤ÇÆÃÄꤵ¤ì¤Þ¤¹¡£Îã: +-\fIjavadoc \-docencoding"iso\-8859\-1" mypackage\fR¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-docencoding\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤·¡¢\fB\-encoding\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢À¸À®¤µ¤ì¤¿HTML¥Õ¥¡¥¤¥ë¤Î°Å¹æ²½¤Ï\fB\-encoding\fR¥ª¥×¥·¥ç¥ó¤ÇÆÃÄꤵ¤ì¤Þ¤¹¡£Îã: ++\fBjavadoc \-docencoding "iso\-8859\-1" mypackage\fR¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-keywords + .RS 4 +-HTML¥­¡¼¥ï¡¼¥É<META>¥¿¥°¤ò¡¢¥¯¥é¥¹¤´¤È¤ËÀ¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ËÄɲä·¤Þ¤¹¡£¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢<META>¥¿¥°¤ò¸¡º÷¤¹¤ë¥µ¡¼¥Á¡¦¥¨¥ó¥¸¥ó¤¬¥Ú¡¼¥¸¤ò¸«¤Ä¤±¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÁ´ÂΤò¸¡º÷¤¹¤ë¸¡º÷¥¨¥ó¥¸¥ó¤Î¤Û¤È¤ó¤É¤Ï<META>¥¿¥°¤ò»²¾È¤·¤Þ¤»¤ó¡£¥Ú¡¼¥¸¤¬¸íÍѤ·¤Æ¤¤¤ë²ÄǽÀ­¤¬¤¢¤ë¤«¤é¤Ç¤¹¡£¼«¿È¤ÎWeb¥µ¥¤¥È¤Ø¤Î¸¡º÷¤òÀ©¸Â¤¹¤ë¡¢´ë¶È¤Ë¤è¤êÄ󶡤µ¤ì¤ë¸¡º÷¥¨¥ó¥¸¥ó¤Ï¡¢<META>¥¿¥°¤ò»²¾È¤¹¤ë¤³¤È¤Ç²¸·Ã¤ò¼õ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£<META>¥¿¥°¤Ë¤Ï¡¢¥¯¥é¥¹¤Î´°Á´½¤¾þ̾¤È¡¢¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥á¥½¥Ã¥É¤Î½¤¾þ¤µ¤ì¤Æ¤¤¤Ê¤¤Ì¾Á°¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢¥¯¥é¥¹Ì¾¤ÈƱ¤¸¤Ç¤¢¤ë¤¿¤á´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹\fIString\fR¤Ï¼¡¤Î¥­¡¼¥ï¡¼¥É¤Ç³«»Ï¤·¤Þ¤¹¡£ ++HTML¥­¡¼¥ï¡¼¥É<META>¥¿¥°¤ò¡¢¥¯¥é¥¹¤´¤È¤ËÀ¸À®¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤ËÄɲä·¤Þ¤¹¡£¤³¤ì¤é¤Î¥¿¥°¤Ï¡¢<META>¥¿¥°¤ò¸¡º÷¤¹¤ë¥µ¡¼¥Á¡¦¥¨¥ó¥¸¥ó¤¬¥Ú¡¼¥¸¤ò¸«¤Ä¤±¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈÁ´ÂΤò¸¡º÷¤¹¤ë¸¡º÷¥¨¥ó¥¸¥ó¤Î¤Û¤È¤ó¤É¤Ï<META>¥¿¥°¤ò»²¾È¤·¤Þ¤»¤ó¡£¥Ú¡¼¥¸¤¬¸íÍѤ·¤Æ¤¤¤ë²ÄǽÀ­¤¬¤¢¤ë¤«¤é¤Ç¤¹¡£¼«¿È¤ÎWeb¥µ¥¤¥È¤Ø¤Î¸¡º÷¤òÀ©¸Â¤¹¤ë¡¢´ë¶È¤Ë¤è¤êÄ󶡤µ¤ì¤ë¸¡º÷¥¨¥ó¥¸¥ó¤Ï¡¢<META>¥¿¥°¤ò»²¾È¤¹¤ë¤³¤È¤Ç²¸·Ã¤ò¼õ¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£<META>¥¿¥°¤Ë¤Ï¡¢¥¯¥é¥¹¤Î´°Á´½¤¾þ̾¤È¡¢¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥á¥½¥Ã¥É¤Î½¤¾þ¤µ¤ì¤Æ¤¤¤Ê¤¤Ì¾Á°¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¡¢¥¯¥é¥¹Ì¾¤ÈƱ¤¸¤Ç¤¢¤ë¤¿¤á´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¥¯¥é¥¹\fBString\fR¤Ï¼¡¤Î¥­¡¼¥ï¡¼¥É¤Ç³«»Ï¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-<META NAME="keywords" CONTENT="java\&.lang\&.String class"> +-<META NAME="keywords" CONTENT="CASE_INSENSITIVE_ORDER"> +-<META NAME="keywords" CONTENT="length()"> +-<META NAME="keywords" CONTENT="charAt()"> ++\fB<META NAME="keywords" CONTENT="java\&.lang\&.String class">\fR ++\fB<META NAME="keywords" CONTENT="CASE_INSENSITIVE_ORDER">\fR ++\fB<META NAME="keywords" CONTENT="length()">\fR ++\fB<META NAME="keywords" CONTENT="charAt()">\fR ++ + .fi + .if n \{\ + .RE +@@ -3137,105 +3267,108 @@ + .PP + \-tag \fItagname\fR:Xaoptcmf:"\fItaghead\fR" + .RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Î°ú¿ô¤ò1¤Ä¼è¤ëñ½ã¤Ê¥«¥¹¥¿¥à¡¦¥Ö¥í¥Ã¥¯¡¦¥¿¥°\fI@tagname\fR¤ò²ò¼á¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥¿¥°Ì¾¤Î¥¹¥Ú¥ë¥Á¥§¥Ã¥¯¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ç¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ë¸ºß¤¹¤ë¤¹¤Ù¤Æ¤Î¥«¥¹¥¿¥à¡¦¥¿¥°¤Ë¤Ä¤¤¤Æ¡¢\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤òÁȤ߹þ¤à¤³¤È¤¬½ÅÍפǤ¹¡£º£²ó¤Î¼Â¹Ô¤Ç¤Ï½ÐÎϤµ¤ì¤Ê¤¤¥¿¥°¤Ï¡¢\fIX\fR¤òÉÕ¤±¤Æ̵¸ú¤Ë¤·¤Þ¤¹¡£\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥¿¥°¤Î¸«½Ð¤·\fItaghead\fR¤òÂÀ»ú¤Ç½ÐÎϤ·¤Þ¤¹¡£¤½¤Î¼¡¤Î¹Ô¤Ë¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Î1¤Ä¤Î°ú¿ô¤Ç»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤¬Â³¤­¤Þ¤¹¡£¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤ÈƱÍÍ¡¢¤³¤Î°ú¿ô¤Î¥Æ¥­¥¹¥È¤Ë¤Ï¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤â²ò¼á¤µ¤ì¤Þ¤¹¡£½ÐÎϤϡ¢°ú¿ô¤ò1¤Ä¼è¤ëɸ½à¤Î¥¿¥°(\fI@return\fR¤ä\fI@author\fR¤Ê¤É)¤Î½ÐÎϤȤ褯»÷¤Æ¤¤¤Þ¤¹¡£\fItaghead\fR¤ÎÃͤò¾Êά¤¹¤ë¤È¡¢\fItagname\fR¤¬¸«½Ð¤·¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤Î°ú¿ô¤ò1¤Ä¼è¤ëñ½ã¤Ê¥«¥¹¥¿¥à¡¦¥Ö¥í¥Ã¥¯¡¦¥¿¥°\fB@tagname\fR¤ò²ò¼á¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¥¿¥°Ì¾¤Î¥¹¥Ú¥ë¥Á¥§¥Ã¥¯¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ç¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ë¸ºß¤¹¤ë¤¹¤Ù¤Æ¤Î¥«¥¹¥¿¥à¡¦¥¿¥°¤Ë¤Ä¤¤¤Æ¡¢\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤òÁȤ߹þ¤à¤³¤È¤¬½ÅÍפǤ¹¡£º£²ó¤Î¼Â¹Ô¤Ç¤Ï½ÐÎϤµ¤ì¤Ê¤¤¥¿¥°¤Ï¡¢\fBX\fR¤òÉÕ¤±¤Æ̵¸ú¤Ë¤·¤Þ¤¹¡£\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥¿¥°¤Î¸«½Ð¤·\fItaghead\fR¤òÂÀ»ú¤Ç½ÐÎϤ·¤Þ¤¹¡£¤½¤Î¼¡¤Î¹Ô¤Ë¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Î1¤Ä¤Î°ú¿ô¤Ç»ØÄꤷ¤¿¥Æ¥­¥¹¥È¤¬Â³¤­¤Þ¤¹¡£¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤ÈƱÍÍ¡¢¤³¤Î°ú¿ô¤Î¥Æ¥­¥¹¥È¤Ë¤Ï¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤â²ò¼á¤µ¤ì¤Þ¤¹¡£½ÐÎϤϡ¢°ú¿ô¤ò1¤Ä¼è¤ëɸ½à¤Î¥¿¥°(\fB@return\fR¤ä\fB@author\fR¤Ê¤É)¤Î½ÐÎϤȤ褯»÷¤Æ¤¤¤Þ¤¹¡£\fItaghead\fR¤ÎÃͤò¾Êά¤¹¤ë¤È¡¢\fBtagname\fR¤¬¸«½Ð¤·¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .sp + \fB¥¿¥°¤ÎÇÛÃÖ\fR: +-\fIXaoptcmf\fR°ú¿ô¤Ë¤è¤ê¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ç¥¿¥°¤òÇÛÃ֤Ǥ­¤ë¾ì½ê¤¬·è¤Þ¤ê¡¢¥¿¥°¤ò̵¸ú¤Ë¤Ç¤­¤ë¤«¤É¤¦¤«(\fIX\fR¤ò»ÈÍѤ·¤Æ)¤¬·è¤Þ¤ê¤Þ¤¹¡£¥¿¥°¤ÎÇÛÃÖ°ÌÃÖ¤òÀ©¸Â¤·¤Ê¤¤¾ì¹ç¤Ï\fIa\fR¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤ì°Ê³°¤Îʸ»ú¤ÎÁȹ礻¤â²Äǽ¤Ç¤¹¡£ +-.sp +-\fIX\fR ++\fBXaoptcmf\fR°ú¿ô¤Ë¤è¤ê¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ç¥¿¥°¤òÇÛÃ֤Ǥ­¤ë¾ì½ê¤¬·è¤Þ¤ê¡¢¥¿¥°¤ò̵¸ú¤Ë¤Ç¤­¤ë¤«¤É¤¦¤«(\fBX\fR¤ò»ÈÍѤ·¤Æ)¤¬·è¤Þ¤ê¤Þ¤¹¡£¥¿¥°¤ÎÇÛÃÖ°ÌÃÖ¤òÀ©¸Â¤·¤Ê¤¤¾ì¹ç¤Ï\fBa\fR¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤ì°Ê³°¤Îʸ»ú¤ÎÁȹ礻¤â²Äǽ¤Ç¤¹¡£ ++.sp ++\fBX\fR + (¥¿¥°¤Î̵¸ú²½) + .sp +-\fIa\fR ++\fBa\fR + (¤¹¤Ù¤Æ) + .sp +-\fIo\fR ++\fBo\fR + (³µÍ×) + .sp +-\fIp\fR ++\fBp\fR + (¥Ñ¥Ã¥±¡¼¥¸) + .sp +-\fIt\fR ++\fBt\fR + (¥¿¥¤¥×¡¢¤Ä¤Þ¤ê¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹) + .sp +-\fIc\fR ++\fBc\fR + (¥³¥ó¥¹¥È¥é¥¯¥¿) + .sp +-\fIm\fR ++\fBm\fR + (¥á¥½¥Ã¥É) + .sp +-\fIf\fR ++\fBf\fR + (¥Õ¥£¡¼¥ë¥É) + .sp +-\fB¥·¥ó¥°¥ë¡¦¥¿¥°¤ÎÎã\fR: ¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤ÎǤ°Õ¤Î°ÌÃ֤ǻÈÍѤǤ­¤ë¥¿¥°¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fI\-tag todo:a:"To Do:"\fR +-.sp +-\fI@todo\fR¥¿¥°¤ò¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤È¤Î¤ß»ÈÍѤ¹¤ë¾ì¹ç¡¢\fI\-tag todo:cmf:"To Do:"\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ +-.sp +-ºÇ¸å¤Î¥³¥í¥ó(:)¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¶èÀÚ¤êʸ»ú¤Ç¤Ï¤Ê¤¯¡¢¸«½Ð¤·¥Æ¥­¥¹¥È¤Î°ìÉô¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fI@todo\fR¥¿¥°¤ò´Þ¤à¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÍѤΤ¤¤º¤ì¤«¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@todo The documentation for this method needs work\fR¤Ç¤¹¡£ +-.sp +-\fB¥¿¥°Ì¾Æâ¤Î¥³¥í¥ó\fR: ¥¿¥°Ì¾Æâ¤Ç¥³¥í¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å¤ò»ÈÍѤ·¤Æ¥¨¥¹¥±¡¼¥×¤·¤Þ¤¹¡£¼¡¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢\fI\-tag ejb\e\e:bean:a:"EJB Bean:"\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fB¥·¥ó¥°¥ë¡¦¥¿¥°¤ÎÎã\fR: ¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤ÎǤ°Õ¤Î°ÌÃ֤ǻÈÍѤǤ­¤ë¥¿¥°¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fB\-tag todo:a:"To Do:"\fR ++.sp ++\fB@todo\fR¥¿¥°¤ò¥³¥ó¥¹¥È¥é¥¯¥¿¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Õ¥£¡¼¥ë¥É¤È¤Î¤ß»ÈÍѤ¹¤ë¾ì¹ç¡¢\fB\-tag todo:cmf:"To Do:"\fR¤ò»ÈÍѤ·¤Þ¤¹¡£ ++.sp ++ºÇ¸å¤Î¥³¥í¥ó(:)¤Ï¡¢¥Ñ¥é¥á¡¼¥¿¶èÀÚ¤êʸ»ú¤Ç¤Ï¤Ê¤¯¡¢¸«½Ð¤·¥Æ¥­¥¹¥È¤Î°ìÉô¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£\fB@todo\fR¥¿¥°¤ò´Þ¤à¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÍѤΤ¤¤º¤ì¤«¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@todo The documentation for this method needs work\fR¤Ç¤¹¡£ ++.sp ++\fB¥¿¥°Ì¾Æâ¤Î¥³¥í¥ó\fR: ¥¿¥°Ì¾Æâ¤Ç¥³¥í¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å¤ò»ÈÍѤ·¤Æ¥¨¥¹¥±¡¼¥×¤·¤Þ¤¹¡£¼¡¤Î¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤Ë¤Ï¡¢\fB\-tag ejb\e\e:bean:a:"EJB Bean:"\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-/** +- * @ejb:bean +- */ ++\fB/**\fR ++\fB * @ejb:bean\fR ++\fB */\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fB¥¿¥°Ì¾¤Î¥¹¥Ú¥ë¥Á¥§¥Ã¥¯\fR: °ìÉô¤Î³«È¯¼Ô¤¬É¬¤º¤·¤â½ÐÎϤ·¤Ê¤¤¥«¥¹¥¿¥à¡¦¥¿¥°¤ò¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤ËÇÛÃÖ¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Î¤¹¤Ù¤Æ¤Î¥¿¥°¤ò¥ê¥¹¥È¤·¡¢½ÐÎϤ¹¤ë¥¿¥°¤òÍ­¸ú¤Ë¤·¡¢½ÐÎϤ·¤Ê¤¤¥¿¥°¤ò̵¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIX\fR¤ò»ØÄꤹ¤ë¤È¥¿¥°¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¤È¡¢¥¿¥°¤ÏÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡½Ð¤·¤¿¥¿¥°¤¬ÆþÎϥߥ¹¤Ê¤É¤Ë¤è¤ëÉÔÌÀ¥¿¥°¤Ç¤¢¤ë¤«¤É¤¦¤«¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤«¤é·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¹¤Ç¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ëÃͤË\fIX\fR¤òÄɲäǤ­¤Þ¤¹¡£¤³¤¦¤·¤Æ¤ª¤±¤Ð¡¢\fIX\fR¤òºï½ü¤¹¤ë¤Î¤ß¤Ç¥¿¥°¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI@todo\fR¥¿¥°¤ò½ÐÎϤÇÍÞÀ©¤¹¤ë¾ì¹ç¡¢\fI\-tag todo:Xcmf:"To Do:"\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤µ¤é¤Ë´Êñ¤Ë¤¹¤ë¾ì¹ç¡¢\fI\-tag todo:X\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¹½Ê¸\fI\-tag todo:X\fR¤Ï¡¢\fI@todo\fR¥¿¥°¤¬¥¿¥°¥ì¥Ã¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Æ¤âµ¡Ç½¤·¤Þ¤¹¡£ ++\fB¥¿¥°Ì¾¤Î¥¹¥Ú¥ë¥Á¥§¥Ã¥¯\fR: °ìÉô¤Î³«È¯¼Ô¤¬É¬¤º¤·¤â½ÐÎϤ·¤Ê¤¤¥«¥¹¥¿¥à¡¦¥¿¥°¤ò¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤ËÇÛÃÖ¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Î¤¹¤Ù¤Æ¤Î¥¿¥°¤ò¥ê¥¹¥È¤·¡¢½ÐÎϤ¹¤ë¥¿¥°¤òÍ­¸ú¤Ë¤·¡¢½ÐÎϤ·¤Ê¤¤¥¿¥°¤ò̵¸ú¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBX\fR¤ò»ØÄꤹ¤ë¤È¥¿¥°¤Ï̵¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£»ØÄꤷ¤Ê¤¤¤È¡¢¥¿¥°¤ÏÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¸¡½Ð¤·¤¿¥¿¥°¤¬ÆþÎϥߥ¹¤Ê¤É¤Ë¤è¤ëÉÔÌÀ¥¿¥°¤Ç¤¢¤ë¤«¤É¤¦¤«¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤«¤é·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¹¤Ç¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ëÃͤË\fBX\fR¤òÄɲäǤ­¤Þ¤¹¡£¤³¤¦¤·¤Æ¤ª¤±¤Ð¡¢\fBX\fR¤òºï½ü¤¹¤ë¤Î¤ß¤Ç¥¿¥°¤òÍ­¸ú¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB@todo\fR¥¿¥°¤ò½ÐÎϤÇÍÞÀ©¤¹¤ë¾ì¹ç¡¢\fB\-tag todo:Xcmf:"To Do:"\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤µ¤é¤Ë´Êñ¤Ë¤¹¤ë¾ì¹ç¡¢\fB\-tag todo:X\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¹½Ê¸\fB\-tag todo:X\fR¤Ï¡¢\fB@todo\fR¥¿¥°¤¬¥¿¥°¥ì¥Ã¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Æ¤âµ¡Ç½¤·¤Þ¤¹¡£ + .sp + \fB¥¿¥°¤Î½ç½ø\fR: +-\fI\-ta\fR\fIg\fR¤ª¤è¤Ó\fI\-taglet\fR¥ª¥×¥·¥ç¥ó¤Î½ç½ø¤Ë¤è¤Ã¤Æ¡¢¥¿¥°¤Î½ÐÎϽ礬·è¤Þ¤ê¤Þ¤¹¡£¥«¥¹¥¿¥à¡¦¥¿¥°¤Èɸ½à¥¿¥°¤òÁȤ߹礻¤Æ»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£É¸½à¥¿¥°¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢½ç½ø¤ò·èÄꤹ¤ë¤¿¤á¤À¤±¤Î¥×¥ì¡¼¥¹¥Û¥ë¥À¤Ç¤¹¡£É¸½à¥¿¥°¤Î̾Á°¤Î¤ß¤ò¼è¤ê¤Þ¤¹¡£É¸½à¥¿¥°¤Î¾®¸«½Ð¤·¤ÏÊѹ¹¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤ò¼¡¤ÎÎã¤Ë¼¨¤·¤Þ¤¹¡£\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢\fI\-tagle\fR\fIt\fR¥ª¥×¥·¥ç¥ó¤Î°ÌÃ֤ˤè¤ê¡¢½ç½ø¤¬·è¤Þ¤ê¤Þ¤¹¡£¥¿¥°¤¬Î¾Êý¤È¤â¸ºß¤¹¤ë¾ì¹ç¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ÎºÇ¸å¤Ë¤¢¤ëÊý¤¬¤½¤Î½ç½ø¤ò·èÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥¿¥°¤ä¥¿¥°¥ì¥Ã¥È¤¬¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë»ØÄꤵ¤ì¤¿½çÈ֤˽èÍý¤µ¤ì¤ë¤¿¤á¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-taglet\fR¤ª¤è¤Ó\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤¬Ì¾Á°\fItodo\fRÃͤò»ý¤Ä¾ì¹ç¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ËºÇ¸å¤Ë»ØÄꤵ¤ì¤¿¤â¤Î¤¬½ç½ø¤ò·èÄꤷ¤Þ¤¹¡£ +-.sp +-\fB¥¿¥°¤Î´°Á´¥»¥Ã¥È¤ÎÎã\fR: ¤³¤ÎÎã¤Ç¤Ï¡¢½ÐÎϤÎParameters¤ÈThrows¤Î´Ö¤ËTo Do¤òÁÞÆþ¤·¤Þ¤¹¡£\fIX\fR¤ò»ÈÍѤ·¤Æ¡¢\fI@example\fR¥¿¥°¤¬¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Îº£²ó¤Î¼Â¹Ô¤Ç¤Ï½ÐÎϤµ¤ì¤Ê¤¤¥¿¥°¤Ç¤¢¤ë¤³¤È¤â»ØÄꤷ¤Þ¤¹¡£\fI@argfile\fR¥¿¥°¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¡¢°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤ÎÊÌ¡¹¤Î¹Ô¤Ë¥¿¥°¤òÇÛÃ֤Ǥ­¤Þ¤¹(¹Ô¤Î·Ñ³¤ò¼¨¤¹Ê¸»ú¤ÏÉÔÍ×)¡£ ++\fB\-ta\fR\fBg\fR¤ª¤è¤Ó\fB\-taglet\fR¥ª¥×¥·¥ç¥ó¤Î½ç½ø¤Ë¤è¤Ã¤Æ¡¢¥¿¥°¤Î½ÐÎϽ礬·è¤Þ¤ê¤Þ¤¹¡£¥«¥¹¥¿¥à¡¦¥¿¥°¤Èɸ½à¥¿¥°¤òÁȤ߹礻¤Æ»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£É¸½à¥¿¥°¤Î¥¿¥°¡¦¥ª¥×¥·¥ç¥ó¤Ï¡¢½ç½ø¤ò·èÄꤹ¤ë¤¿¤á¤À¤±¤Î¥×¥ì¡¼¥¹¥Û¥ë¥À¤Ç¤¹¡£É¸½à¥¿¥°¤Î̾Á°¤Î¤ß¤ò¼è¤ê¤Þ¤¹¡£É¸½à¥¿¥°¤Î¾®¸«½Ð¤·¤ÏÊѹ¹¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤ò¼¡¤ÎÎã¤Ë¼¨¤·¤Þ¤¹¡£\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢\fB\-tagle\fR\fBt\fR¥ª¥×¥·¥ç¥ó¤Î°ÌÃ֤ˤè¤ê¡¢½ç½ø¤¬·è¤Þ¤ê¤Þ¤¹¡£¥¿¥°¤¬Î¾Êý¤È¤â¸ºß¤¹¤ë¾ì¹ç¡¢¥³¥Þ¥ó¥É¹Ô¤ÎºÇ¸å¤Ë¤¢¤ëÊý¤¬¤½¤Î½ç½ø¤ò·èÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥¿¥°¤ä¥¿¥°¥ì¥Ã¥È¤¬¥³¥Þ¥ó¥É¹Ô¤Ë»ØÄꤵ¤ì¤¿½çÈ֤˽èÍý¤µ¤ì¤ë¤¿¤á¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-taglet\fR¤ª¤è¤Ó\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤¬Ì¾Á°\fBtodo\fRÃͤò»ý¤Ä¾ì¹ç¡¢¥³¥Þ¥ó¥É¹Ô¤ËºÇ¸å¤Ë»ØÄꤵ¤ì¤¿¤â¤Î¤¬½ç½ø¤ò·èÄꤷ¤Þ¤¹¡£ ++.sp ++\fB¥¿¥°¤Î´°Á´¥»¥Ã¥È¤ÎÎã\fR: ¤³¤ÎÎã¤Ç¤Ï¡¢½ÐÎϤÎParameters¤ÈThrows¤Î´Ö¤ËTo Do¤òÁÞÆþ¤·¤Þ¤¹¡£\fBX\fR¤ò»ÈÍѤ·¤Æ¡¢\fB@example\fR¥¿¥°¤¬¡¢¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Îº£²ó¤Î¼Â¹Ô¤Ç¤Ï½ÐÎϤµ¤ì¤Ê¤¤¥¿¥°¤Ç¤¢¤ë¤³¤È¤â»ØÄꤷ¤Þ¤¹¡£\fB@argfile\fR¥¿¥°¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¡¢°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤ÎÊÌ¡¹¤Î¹Ô¤Ë¥¿¥°¤òÇÛÃ֤Ǥ­¤Þ¤¹(¹Ô¤Î·Ñ³¤ò¼¨¤¹Ê¸»ú¤ÏÉÔÍ×)¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-tag param +-\-tag return +-\-tag todo:a:"To Do:" +-\-tag throws +-\-tag see +-\-tag example:X ++\fB\-tag param\fR ++\fB\-tag return\fR ++\fB\-tag todo:a:"To Do:"\fR ++\fB\-tag throws\fR ++\fB\-tag see\fR ++\fB\-tag example:X\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò²òÀϤ¹¤ëºÝ¤Ë¸¡º÷¤µ¤ì¤¿¥¿¥°¤Î¤¦¤Á¡¢É¸½à¥¿¥°¤Ç¤â¡¢\fI\-tag\fR¤ä\fI\-taglet\fR¥ª¥×¥·¥ç¥ó¤ÇÅϤµ¤ì¤¿¥¿¥°¤Ç¤â¤Ê¤¤¤â¤Î¤Ï¤¹¤Ù¤ÆÉÔÌÀ¥¿¥°¤È¤ß¤Ê¤µ¤ì¡¢·Ù¹ð¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ +-.sp +-ɸ½à¥¿¥°¤Ï¡¢ºÇ½é¡¢¥Ç¥Õ¥©¥ë¥È¤Î½ç½ø¤Ç¥ê¥¹¥ÈÆâ¤ËÆâÉôŪ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤½¤ì¤é¤Î¥¿¥°¤Ï¤³¤Î¥ê¥¹¥È¤ËÄɲ䵤ì¤Þ¤¹¡£É¸½à¥¿¥°¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î°ÌÃÖ¤«¤é°ÜÆ°¤µ¤ì¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢É¸½à¥¿¥°¤Î\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢¤½¤ì¤Ï¥Ç¥Õ¥©¥ë¥È¤Î°ÌÃÖ¤ËÇÛÃÖ¤µ¤ì¤¿¤Þ¤Þ¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.sp +-\fB¶¥¹ç¤Î²óÈò\fR: ¸ÇÍ­¤Î̾Á°¶õ´Ö¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤ë\fIcom\&.mycompany\&.todo\fR¤È¤¤¤¦Ì¾Á°¤Î¤è¤¦¤Ë¡¢¥É¥Ã¥È¤Ç¶èÀÚ¤é¤ì¤¿Ì¾Á°¤ò»ÈÍѤ·¤Þ¤¹¡£Oracle¤Ï¡¢º£¸å¤â̾Á°¤Ë¥É¥Ã¥È¤ò´Þ¤Þ¤Ê¤¤É¸½à¥¿¥°¤òºîÀ®¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤¬ºîÀ®¤·¤¿¥¿¥°¤Ï¡¢Oracle¤¬ÄêµÁ¤¹¤ëƱ¤¸Ì¾Á°¤Î¥¿¥°¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fI@todo\fR¤È¤¤¤¦Ì¾Á°¤Î¥¿¥°¤Þ¤¿¤Ï¥¿¥°¥ì¥Ã¥È¤ò¥æ¡¼¥¶¡¼¤¬ºîÀ®¤·¤¿¾ì¹ç¡¢¤½¤Î¸å¤ËOracle¤¬Æ±¤¸Ì¾Á°¤Îɸ½à¥¿¥°¤òºîÀ®¤·¤Æ¤â¡¢¤½¤Î¥¿¥°¤Þ¤¿¤Ï¥¿¥°¥ì¥Ã¥È¤Ï¾ï¤Ë¥æ¡¼¥¶¡¼¤¬ÄêµÁ¤·¤¿¤Î¤ÈƱ¤¸Æ°ºî¤òÊÝ»ý¤·¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥È¤ò²òÀϤ¹¤ëºÝ¤Ë¸¡º÷¤µ¤ì¤¿¥¿¥°¤Î¤¦¤Á¡¢É¸½à¥¿¥°¤Ç¤â¡¢\fB\-tag\fR¤ä\fB\-taglet\fR¥ª¥×¥·¥ç¥ó¤ÇÅϤµ¤ì¤¿¥¿¥°¤Ç¤â¤Ê¤¤¤â¤Î¤Ï¤¹¤Ù¤ÆÉÔÌÀ¥¿¥°¤È¤ß¤Ê¤µ¤ì¡¢·Ù¹ð¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ ++.sp ++ɸ½à¥¿¥°¤Ï¡¢ºÇ½é¡¢¥Ç¥Õ¥©¥ë¥È¤Î½ç½ø¤Ç¥ê¥¹¥ÈÆâ¤ËÆâÉôŪ¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤½¤ì¤é¤Î¥¿¥°¤Ï¤³¤Î¥ê¥¹¥È¤ËÄɲ䵤ì¤Þ¤¹¡£É¸½à¥¿¥°¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î°ÌÃÖ¤«¤é°ÜÆ°¤µ¤ì¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢É¸½à¥¿¥°¤Î\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢¤½¤ì¤Ï¥Ç¥Õ¥©¥ë¥È¤Î°ÌÃÖ¤ËÇÛÃÖ¤µ¤ì¤¿¤Þ¤Þ¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.sp ++\fB¶¥¹ç¤Î²óÈò\fR: ¸ÇÍ­¤Î̾Á°¶õ´Ö¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤ë\fBcom\&.mycompany\&.todo\fR¤È¤¤¤¦Ì¾Á°¤Î¤è¤¦¤Ë¡¢¥É¥Ã¥È¤Ç¶èÀÚ¤é¤ì¤¿Ì¾Á°¤ò»ÈÍѤ·¤Þ¤¹¡£Oracle¤Ï¡¢º£¸å¤â̾Á°¤Ë¥É¥Ã¥È¤ò´Þ¤Þ¤Ê¤¤É¸½à¥¿¥°¤òºîÀ®¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤¬ºîÀ®¤·¤¿¥¿¥°¤Ï¡¢Oracle¤¬ÄêµÁ¤¹¤ëƱ¤¸Ì¾Á°¤Î¥¿¥°¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£\fB@todo\fR¤È¤¤¤¦Ì¾Á°¤Î¥¿¥°¤Þ¤¿¤Ï¥¿¥°¥ì¥Ã¥È¤ò¥æ¡¼¥¶¡¼¤¬ºîÀ®¤·¤¿¾ì¹ç¡¢¤½¤Î¸å¤ËOracle¤¬Æ±¤¸Ì¾Á°¤Îɸ½à¥¿¥°¤òºîÀ®¤·¤Æ¤â¡¢¤½¤Î¥¿¥°¤Þ¤¿¤Ï¥¿¥°¥ì¥Ã¥È¤Ï¾ï¤Ë¥æ¡¼¥¶¡¼¤¬ÄêµÁ¤·¤¿¤Î¤ÈƱ¤¸Æ°ºî¤òÊÝ»ý¤·¤Þ¤¹¡£ + .sp + \fBÃí¼ávs\&. Javadoc¥¿¥°\fR: °ìÈ̤ˡ¢Äɲ乤ëɬÍפΤ¢¤ë¥Þ¡¼¥¯¥¢¥Ã¥×¤¬¡¢¥É¥­¥å¥á¥ó¥È¤Ë±Æ¶Á¤òÍ¿¤¨¤¿¤ê¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤·¤¿¤ê¤¹¤ë¤¿¤á¤Î¤â¤Î¤Ç¤¢¤ë¾ì¹ç¡¢¤½¤Î¥Þ¡¼¥¯¥¢¥Ã¥×¤ÏJavadoc¥¿¥°¤Ë¤·¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤ÏÃí¼á¤Ë¤·¤Þ¤¹¡£Javadoc¥Ä¡¼¥ë¤Ç¤ÎDoc¥³¥á¥ó¥È¤Îµ­½ÒÊýË¡¤Î¥«¥¹¥¿¥à¡¦¥¿¥°¤ÈÃí¼á¤Ë´Ø¤¹¤ë¹à + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137868\&.html#annotations)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-taglet\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¤è¤êÊ£»¨¤Ê¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤ä¥«¥¹¥¿¥à¡¦¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤âºîÀ®¤Ç¤­¤Þ¤¹¡£ ++\fB\-taglet\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¤è¤êÊ£»¨¤Ê¥Ö¥í¥Ã¥¯¡¦¥¿¥°¤ä¥«¥¹¥¿¥à¡¦¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤âºîÀ®¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-taglet \fIclass\fR + .RS 4 +-¤½¤Î¥¿¥°¤Î¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤òµ¯Æ°¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fIclass\fRÃͤδ°Á´½¤¾þ̾¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥¿¥°¥ì¥Ã¥È¤Ï¡¢¥«¥¹¥¿¥à¡¦¥¿¥°¤Î¥Æ¥­¥¹¥È°ú¿ô¤Î¿ô¤âÄêµÁ¤·¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ï¡¢¤³¤ì¤é¤Î°ú¿ô¤ò¼õ¤±ÉÕ¤±¡¢½èÍý¤·¡¢½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤ÎÎã¤ò»ÈÍѤ·¤¿Ë­É٤ʥɥ­¥å¥á¥ó¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥¿¥°¥ì¥Ã¥È¤Î³µÍ× ++¤½¤Î¥¿¥°¤Î¥É¥­¥å¥á¥ó¥È¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥É¥Ã¥¯¥ì¥Ã¥È¤òµ¯Æ°¤¹¤ë¤¿¤á¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fBclass\fRÃͤδ°Á´½¤¾þ̾¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥¿¥°¥ì¥Ã¥È¤Ï¡¢¥«¥¹¥¿¥à¡¦¥¿¥°¤Î¥Æ¥­¥¹¥È°ú¿ô¤Î¿ô¤âÄêµÁ¤·¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ï¡¢¤³¤ì¤é¤Î°ú¿ô¤ò¼õ¤±ÉÕ¤±¡¢½èÍý¤·¡¢½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤ÎÎã¤ò»ÈÍѤ·¤¿Ë­É٤ʥɥ­¥å¥á¥ó¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥¿¥°¥ì¥Ã¥È¤Î³µÍ× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/taglet/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¥¿¥°¥ì¥Ã¥È¤Ï¡¢¥Ö¥í¥Ã¥¯¥¿¥°¤Þ¤¿¤Ï¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ÇÊØÍø¤Ç¤¹¡£¥¿¥°¥ì¥Ã¥È¤ÏǤ°Õ¤Î¿ô¤Î°ú¿ô¤ò¤È¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¥Æ¥­¥¹¥È¤òÂÀ»ú¤Ë¤¹¤ë¡¢²Õ¾ò½ñ¤­¤òºîÀ®¤¹¤ë¡¢¥Æ¥­¥¹¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹¡¢¤½¤Î¾¤Î¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ê¤É¤Î¥«¥¹¥¿¥àÆ°ºî¤ò¼ÂÁõ¤Ç¤­¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ç»ØÄê¤Ç¤­¤ë¤Î¤Ï¡¢¥¿¥°¤ÎÇÛÃÖ¾ì½ê¤ÈÇÛÃÖ·Á¼°¤Î¤ß¤Ç¤¹¡£¤½¤Î¾¤Î¤¹¤Ù¤Æ¤Î·èÄê¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤Ë¤è¤Ã¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¤â¡¢Êñ´Þ¥¯¥é¥¹¤Î¥ê¥¹¥È¤«¤é¥¯¥é¥¹Ì¾¤òºï½ü¤¹¤ë¤Ê¤É¤Î½èÍý¤Ï¼Â¹Ô¤Ç¤­¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥¿¥°¤Î¥Æ¥­¥¹¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ·¤¿¤ê¡¢ÊÌ¤Î¥×¥í¥»¥¹¤ò¥È¥ê¥¬¡¼¤¹¤ë¤Ê¤É¤ÎÉûºîÍѤÏÆÀ¤é¤ì¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fI\-tagletpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤Ë¡¢À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤ÎParameters¤ÈThrows¤Î´Ö¤ËTo Do¥¿¥°¥ì¥Ã¥È¤òÁÞÆþ¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢\fI\-taglet\fR¥ª¥×¥·¥ç¥ó¤ò¤½¤Î\fI\-tag\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Æɤ߼è¤ê¤¬º¤Æñ¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++¥¿¥°¥ì¥Ã¥È¤Ï¡¢¥Ö¥í¥Ã¥¯¥¿¥°¤Þ¤¿¤Ï¥¤¥ó¥é¥¤¥ó¡¦¥¿¥°¤ÇÊØÍø¤Ç¤¹¡£¥¿¥°¥ì¥Ã¥È¤ÏǤ°Õ¤Î¿ô¤Î°ú¿ô¤ò¤È¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¥Æ¥­¥¹¥È¤òÂÀ»ú¤Ë¤¹¤ë¡¢²Õ¾ò½ñ¤­¤òºîÀ®¤¹¤ë¡¢¥Æ¥­¥¹¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹¡¢¤½¤Î¾¤Î¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ê¤É¤Î¥«¥¹¥¿¥àÆ°ºî¤ò¼ÂÁõ¤Ç¤­¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ç»ØÄê¤Ç¤­¤ë¤Î¤Ï¡¢¥¿¥°¤ÎÇÛÃÖ¾ì½ê¤ÈÇÛÃÖ·Á¼°¤Î¤ß¤Ç¤¹¡£¤½¤Î¾¤Î¤¹¤Ù¤Æ¤Î·èÄê¤Ï¡¢¥É¥Ã¥¯¥ì¥Ã¥È¤Ë¤è¤Ã¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤ò»ÈÍѤ·¤Æ¤â¡¢Êñ´Þ¥¯¥é¥¹¤Î¥ê¥¹¥È¤«¤é¥¯¥é¥¹Ì¾¤òºï½ü¤¹¤ë¤Ê¤É¤Î½èÍý¤Ï¼Â¹Ô¤Ç¤­¤Þ¤»¤ó¡£¤¿¤À¤·¡¢¥¿¥°¤Î¥Æ¥­¥¹¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ·¤¿¤ê¡¢ÊÌ¤Î¥×¥í¥»¥¹¤ò¥È¥ê¥¬¡¼¤¹¤ë¤Ê¤É¤ÎÉûºîÍѤÏÆÀ¤é¤ì¤Þ¤¹¡£¥¿¥°¥ì¥Ã¥È¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fB\-tagletpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤Ë¡¢À¸À®¤µ¤ì¤ë¥Ú¡¼¥¸¤ÎParameters¤ÈThrows¤Î´Ö¤ËTo Do¥¿¥°¥ì¥Ã¥È¤òÁÞÆþ¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢\fB\-taglet\fR¥ª¥×¥·¥ç¥ó¤ò¤½¤Î\fB\-tag\fR¥ª¥×¥·¥ç¥ó¤Î¤«¤ï¤ê¤Ë»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Æɤ߼è¤ê¤¬º¤Æñ¤Ë¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-taglet com\&.sun\&.tools\&.doclets\&.ToDoTaglet +-\-tagletpath /home/taglets +-\-tag return +-\-tag param +-\-tag todo +-\-tag throws +-\-tag see ++\fB\-taglet com\&.sun\&.tools\&.doclets\&.ToDoTaglet\fR ++\fB\-tagletpath /home/taglets \fR ++\fB\-tag return\fR ++\fB\-tag param\fR ++\fB\-tag todo\fR ++\fB\-tag throws\fR ++\fB\-tag see\fR ++ + .fi + .if n \{\ + .RE +@@ -3244,7 +3377,7 @@ + .PP + \-tagletpath \fItagletpathlist\fR + .RS 4 +-taglet¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¤¿¤á¤Î¸¡º÷¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fItagletpathlist\fR¤Ë¤Ï¡¢¥³¥í¥ó(:)¤Ç¶èÀڤäÆÊ£¿ô¤Î¥Ñ¥¹¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£ ++taglet¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¸¡º÷¤¹¤ë¤¿¤á¤Î¸¡º÷¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£\fBtagletpathlist\fR¤Ë¤Ï¡¢¥³¥í¥ó(:)¤Ç¶èÀڤäÆÊ£¿ô¤Î¥Ñ¥¹¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥¹°Ê²¼¤Î¤¹¤Ù¤Æ¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¸¡º÷¤·¤Þ¤¹¡£ + .RE + .PP + \-docfilesubdirs +@@ -3259,21 +3392,21 @@ + .PP + \-noqualifier all | \fIpackagename1\fR:\fIpackagename2\&.\&.\&.\fR + .RS 4 +-½ÐÎϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤«¤é½¤¾þ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¾Êά¤·¤Þ¤¹¡£\fI\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ï¡¢\fIall\fR(¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά)¡¢¤Þ¤¿¤Ï½¤¾þ»Ò¤È¤·¤Æºï½ü¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥í¥ó¶èÀÚ¤ê¥ê¥¹¥È(¥ï¥¤¥ë¥É¥«¡¼¥É¤â²Ä)¡¢¤Î¤¤¤º¤ì¤«¤È¤Ê¤ê¤Þ¤¹¡£¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹Ì¾¤¬É½¼¨¤µ¤ì¤ë°ÌÃÖ¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬ºï½ü¤µ¤ì¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά¤·¤Þ¤¹¡£\fI\-noqualifier all\fR +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIjava\&.lang\fR¤ª¤è¤Ó\fIjava\&.io\fR¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά¤·¤Þ¤¹: +-\fI\-noqualifier java\&.lang:java\&.io\fR¡£ +-.sp +-¼¡¤ÎÎã¤Ç¤Ï¡¢\fIjava\fR¤Ç»Ï¤Þ¤ë¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ª¤è¤Ó\fIcom\&.sun\fR¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¾Êά¤·¤Þ¤¹¤¬¡¢\fIjavax\fR¤Ï¾Êά¤·¤Þ¤»¤ó¡£\fI\-noqualifier java\&.*:com\&.sun\&.*\fR +-.sp +-¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤¬Á°½Ò¤ÎÆ°ºî¤Ë½¾¤Ã¤Æɽ¼¨¤µ¤ì¤ë¾ì¹ç¡¢Ì¾Á°¤ÏŬÀÚ¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î¥ë¡¼¥ë¤Ï¡¢\fI\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤ºÍ­¸ú¤Ç¤¹¡£ ++½ÐÎϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤«¤é½¤¾þ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ò¾Êά¤·¤Þ¤¹¡£\fB\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤Ï¡¢\fBall\fR(¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά)¡¢¤Þ¤¿¤Ï½¤¾þ»Ò¤È¤·¤Æºï½ü¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥í¥ó¶èÀÚ¤ê¥ê¥¹¥È(¥ï¥¤¥ë¥É¥«¡¼¥É¤â²Ä)¡¢¤Î¤¤¤º¤ì¤«¤È¤Ê¤ê¤Þ¤¹¡£¥¯¥é¥¹¤Þ¤¿¤Ï¥¤¥ó¥¿¥Õ¥§¡¼¥¹Ì¾¤¬É½¼¨¤µ¤ì¤ë°ÌÃÖ¤«¤é¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬ºï½ü¤µ¤ì¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά¤·¤Þ¤¹¡£\fB\-noqualifier all\fR ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBjava\&.lang\fR¤ª¤è¤Ó\fBjava\&.io\fR¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ò¾Êά¤·¤Þ¤¹: ++\fB\-noqualifier java\&.lang:java\&.io\fR¡£ ++.sp ++¼¡¤ÎÎã¤Ç¤Ï¡¢\fBjava\fR¤Ç»Ï¤Þ¤ë¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤ª¤è¤Ó\fBcom\&.sun\fR¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¾Êά¤·¤Þ¤¹¤¬¡¢\fBjavax\fR¤Ï¾Êά¤·¤Þ¤»¤ó¡£\fB\-noqualifier java\&.*:com\&.sun\&.*\fR ++.sp ++¥Ñ¥Ã¥±¡¼¥¸½¤¾þ»Ò¤¬Á°½Ò¤ÎÆ°ºî¤Ë½¾¤Ã¤Æɽ¼¨¤µ¤ì¤ë¾ì¹ç¡¢Ì¾Á°¤ÏŬÀÚ¤Ëû½Ì¤µ¤ì¤Þ¤¹¡£¡Ö̾Á°¤¬É½¼¨¤µ¤ì¤ëÊýË¡¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤Î¥ë¡¼¥ë¤Ï¡¢\fB\-noqualifier\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤«¤É¤¦¤«¤Ë¤«¤«¤ï¤é¤ºÍ­¸ú¤Ç¤¹¡£ + .RE + .PP + \-notimestamp + .RS 4 +-¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬ÍÞÀ©¤µ¤ì¤Þ¤¹¡£³Æ¥Ú¡¼¥¸¤ÎÀèƬ¶á¤¯¤Ë¤¢¤ë¡¢À¸À®¤µ¤ì¤¿HTMLÆâ¤ÎHTML¥³¥á¥ó¥È¤Ç¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬±£¤µ¤ì¤Þ¤¹¡£\fI\-notimestamp\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò2¤Ä¤Î¥½¡¼¥¹¡¦¥Ù¡¼¥¹¤Ç¼Â¹Ô¤·¡¢¤½¤ì¤é¤Î´Ö¤Îº¹Ê¬\fIdiff\fR¤ò¼èÆÀ¤¹¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ë¤è¤ë\fIdiff\fR¤ÎȯÀ¸¤òËɤ°¤«¤é¤Ç¤¹(¤½¤¦¤Ç¤Ê¤¤¤È¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤Ç\fIdiff\fR¤Ë¤Ê¤ê¤Þ¤¹)¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ë¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹Èֹ椬´Þ¤Þ¤ì¡¢¸½ºß¤Ç¤Ï¡¢\fI<!\-\- Generated by javadoc (build 1\&.5\&.0_01) on Thu Apr 02 14:04:52 IST 2009 \-\->\fR¤Î¤è¤¦¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬ÍÞÀ©¤µ¤ì¤Þ¤¹¡£³Æ¥Ú¡¼¥¸¤ÎÀèƬ¶á¤¯¤Ë¤¢¤ë¡¢À¸À®¤µ¤ì¤¿HTMLÆâ¤ÎHTML¥³¥á¥ó¥È¤Ç¥¿¥¤¥à¥¹¥¿¥ó¥×¤¬±£¤µ¤ì¤Þ¤¹¡£\fB\-notimestamp\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò2¤Ä¤Î¥½¡¼¥¹¡¦¥Ù¡¼¥¹¤Ç¼Â¹Ô¤·¡¢¤½¤ì¤é¤Î´Ö¤Îº¹Ê¬\fBdiff\fR¤ò¼èÆÀ¤¹¤ë¾ì¹ç¤ËÌòΩ¤Á¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ë¤è¤ë\fBdiff\fR¤ÎȯÀ¸¤òËɤ°¤«¤é¤Ç¤¹(¤½¤¦¤Ç¤Ê¤¤¤È¤¹¤Ù¤Æ¤Î¥Ú¡¼¥¸¤Ç\fBdiff\fR¤Ë¤Ê¤ê¤Þ¤¹)¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤Ë¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹Èֹ椬´Þ¤Þ¤ì¡¢¸½ºß¤Ç¤Ï¡¢\fB<!\-\- Generated by javadoc (build 1\&.5\&.0_01) on Thu Apr 02 14:04:52 IST 2009 \-\->\fR¤Î¤è¤¦¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-nocomment +@@ -3285,24 +3418,28 @@ + .RS 4 + ¥½¡¼¥¹Æâ¤Ç³Æ¥¿¥Ö¤¬»ÈÍѤ¹¤ë¶õÇòʸ»ú¤Î¿ô¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE +-.SH "¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¥Õ¥¡¥¤¥ë" +-.PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤òû¤¯¤·¤¿¤ê´Ê·é¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ËÂФ¹¤ë°ú¿ô(\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤¬Æþ¤Ã¤¿1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤³¤È¤òÍøÍѤ¹¤ì¤Ð¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¾å¤Ç¤â¡¢Ç¤°Õ¤ÎŤµ¤Î\fIjavadoc\fR¥³¥Þ¥ó¥É¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ +-.PP +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIjavac\fR¤Î¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò¼«Í³¤ËÁȤ߹礻¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ°ú¿ô¤Ï¡¢¥¹¥Ú¡¼¥¹¤Þ¤¿¤Ï²þ¹Ô¤Ç¶èÀÚ¤ê¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤ËËä¤á¹þ¤Þ¤ì¤¿¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾Á´ÂΤòÆó½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£ +-.PP +-°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ǤϤʤ¯¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ê¥¹¥È¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É(\fI*\fR)¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢*\&.java¤È¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤Æ¡¢¥Õ¥¡¥¤¥ë¤òºÆµ¢Åª¤Ë²ò¼á¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fI\-J\fR¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïµ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤Þ¤¹¤¬¡¢µ¯Æ°¥Ä¡¼¥ë¤Ç¤Ï°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ +-.PP +-\fIjavadoc\fR¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢³Æ°ú¿ô¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤Ë@ʸ»ú¤òÉÕ¤±¤ÆÅϤ·¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯(@)ʸ»ú¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ +-.PP +-\fBExample 1\fR, ñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë +-.RS 4 +-\fIargfile\fR¤È¤¤¤¦Ì¾Á°¤Î1¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¤¹¤Ù¤Æ¤Î\fIjavadoc\fR¥³¥Þ¥ó¥É°ú¿ô¤òÊÝ»ý¤Ç¤­¤Þ¤¹¡£\fIjavadoc @argfile\fR¼¡¤ÎÎã¤Ë¼¨¤¹¤è¤¦¤Ë¡¢¤³¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤ÏξÊý¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤ¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ +-.RE +-.PP +-\fBExample 2\fR, 2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë +-.RS 4 +-¼¡¤Î¤è¤¦¤Ë¡¢2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥óÍѤË1¤Ä¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾ÍѤË1¤Ä¤Ç¤¹¡£¼¡¤Î¥ê¥¹¥È¤Ç¤Ï¹Ô·Ñ³ʸ»ú¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤»¤ó¡£ ++.SH "¥³¥Þ¥ó¥É¹Ô°ú¿ô¥Õ¥¡¥¤¥ë" ++.PP ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤òû¤¯¤·¤¿¤ê´Ê·é¤Ë¤·¤¿¤ê¤¹¤ë¤¿¤á¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ËÂФ¹¤ë°ú¿ô(\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò½ü¤¯)¤¬Æþ¤Ã¤¿1¤Ä°Ê¾å¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤³¤È¤òÍøÍѤ¹¤ì¤Ð¡¢¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¾å¤Ç¤â¡¢Ç¤°Õ¤ÎŤµ¤Î\fBjavadoc\fR¥³¥Þ¥ó¥É¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++.PP ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBjavac\fR¤Î¥ª¥×¥·¥ç¥ó¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾¤ò¼«Í³¤ËÁȤ߹礻¤Æµ­½Ò¤Ç¤­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ°ú¿ô¤Ï¡¢¥¹¥Ú¡¼¥¹¤Þ¤¿¤Ï²þ¹Ô¤Ç¶èÀÚ¤ê¤Þ¤¹¡£¥Õ¥¡¥¤¥ë̾¤ËËä¤á¹þ¤Þ¤ì¤¿¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢¥Õ¥¡¥¤¥ë̾Á´ÂΤòÆó½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£ ++.PP ++°ú¿ô¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢°ú¿ô¥Õ¥¡¥¤¥ë¤Î°ÌÃ֤ǤϤʤ¯¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥ê¥¹¥È¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É(\fB*\fR)¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢*\&.java¤È¤Ï»ØÄê¤Ç¤­¤Þ¤»¤ó¡£¥¢¥Ã¥È¥Þ¡¼¥¯(@)¤ò»ÈÍѤ·¤Æ¡¢¥Õ¥¡¥¤¥ë¤òºÆµ¢Åª¤Ë²ò¼á¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fB\-J\fR¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïµ¯Æ°¥Ä¡¼¥ë¤ËÅϤµ¤ì¤Þ¤¹¤¬¡¢µ¯Æ°¥Ä¡¼¥ë¤Ç¤Ï°ú¿ô¥Õ¥¡¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ ++.PP ++\fBjavadoc\fR¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢³Æ°ú¿ô¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¤È¥Õ¥¡¥¤¥ë̾¤ÎÀèƬ¤Ë@ʸ»ú¤òÉÕ¤±¤ÆÅϤ·¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¢¥Ã¥È¥Þ¡¼¥¯(@)ʸ»ú¤Ç»Ï¤Þ¤ë°ú¿ô¤ò¸«¤Ä¤±¤ë¤È¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòŸ³«¤·¤Æ°ú¿ô¥ê¥¹¥È¤ËÁÞÆþ¤·¤Þ¤¹¡£ ++.PP ++\fBÎã 1\fR ++.br ++ñ°ì¤Î°ú¿ô¥Õ¥¡¥¤¥ë ++.RS 4 ++\fBargfile\fR¤È¤¤¤¦Ì¾Á°¤Î1¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¤¹¤Ù¤Æ¤Î\fBjavadoc\fR¥³¥Þ¥ó¥É°ú¿ô¤òÊÝ»ý¤Ç¤­¤Þ¤¹¡£\fBjavadoc @argfile\fR¼¡¤ÎÎã¤Ë¼¨¤¹¤è¤¦¤Ë¡¢¤³¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤Ë¤ÏξÊý¤Î¥Õ¥¡¥¤¥ë¤ÎÆâÍƤ¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++.RE ++.PP ++\fBÎã 2\fR ++.br ++2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë ++.RS 4 ++¼¡¤Î¤è¤¦¤Ë¡¢2¤Ä¤Î°ú¿ô¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥óÍѤË1¤Ä¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë̾ÍѤË1¤Ä¤Ç¤¹¡£¼¡¤Î¥ê¥¹¥È¤Ç¤Ï¹Ô·Ñ³ʸ»ú¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤»¤ó¡£ + .sp + ¼¡¤ÎÆâÍƤò´Þ¤à¡¢options¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£ + .sp +@@ -3310,16 +3447,17 @@ + .RS 4 + .\} + .nf +-\-d docs\-filelist +-\-use +-\-splitindex +-\-windowtitle \*(AqJava SE 7 API Specification\*(Aq +-\-doctitle \*(AqJava SE 7 API Specification\*(Aq +-\-header \*(Aq<b>Java(TM) SE 7</b>\*(Aq +-\-bottom \*(AqCopyright © 1993\-2011 Oracle and/or its affiliates\&. All rights reserved\&.\*(Aq +-\-group "Core Packages" "java\&.*" +-\-overview /java/pubs/ws/1\&.7\&.0/src/share/classes/overview\-core\&.html +-\-sourcepath /java/pubs/ws/1\&.7\&.0/src/share/classes ++\fB\-d docs\-filelist \fR ++\fB\-use \fR ++\fB\-splitindex\fR ++\fB\-windowtitle \*(AqJava SE 7 API Specification\*(Aq\fR ++\fB\-doctitle \*(AqJava SE 7 API Specification\*(Aq\fR ++\fB\-header \*(Aq<b>Java(TM) SE 7</b>\*(Aq\fR ++\fB\-bottom \*(AqCopyright © 1993\-2011 Oracle and/or its affiliates\&. All rights reserved\&.\*(Aq\fR ++\fB\-group "Core Packages" "java\&.*"\fR ++\fB\-overview /java/pubs/ws/1\&.7\&.0/src/share/classes/overview\-core\&.html\fR ++\fB\-sourcepath /java/pubs/ws/1\&.7\&.0/src/share/classes\fR ++ + .fi + .if n \{\ + .RE +@@ -3330,170 +3468,199 @@ + .RS 4 + .\} + .nf +-com\&.mypackage1 +-com\&.mypackage2 +-com\&.mypackage3 ++\fBcom\&.mypackage1\fR ++\fBcom\&.mypackage2\fR ++\fBcom\&.mypackage3\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î¤è¤¦¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¼¡¤Î¤è¤¦¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc @options @packages ++\fBjavadoc @options @packages\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, ¥Ñ¥¹¤ò»ÈÍѤ·¤¿°ú¿ô¥Õ¥¡¥¤¥ë +-.RS 4 +-°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢(\fIpath1\fR¤ä\fIpath2\fR¤Ç¤Ï¤Ê¤¯)¼¡¤Î¤è¤¦¤Ë¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£ ++\fBÎã 3\fR ++.br ++¥Ñ¥¹¤ò»ÈÍѤ·¤¿°ú¿ô¥Õ¥¡¥¤¥ë ++.RS 4 ++°ú¿ô¥Õ¥¡¥¤¥ë¤Ï¥Ñ¥¹¤ò»ØÄê¤Ç¤­¤Þ¤¹¤¬¡¢¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë̾¤Ï¡¢(\fBpath1\fR¤ä\fBpath2\fR¤Ç¤Ï¤Ê¤¯)¼¡¤Î¤è¤¦¤Ë¸½ºß¤Îºî¶È¥Ç¥£¥ì¥¯¥È¥ê¤ËÁêÂÐŪ¤È¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc @path1/options @path2/packages ++\fBjavadoc @path1/options @path2/packages\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 4\fR, ¥ª¥×¥·¥ç¥ó°ú¿ô +-.RS 4 +-¼¡¤Ë¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ë°ú¿ô¤ò°ú¿ô¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£Ä¹¤¤°ú¿ô¤ò»ØÄê¤Ç¤­¤ë¤Î¤Ç¡¢\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤Î¤è¤¦¤Ê¥Æ¥­¥¹¥È°ú¿ô¤ò´Þ¤à¡¢bottom¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ ++\fBÎã 4\fR ++.br ++¥ª¥×¥·¥ç¥ó°ú¿ô ++.RS 4 ++¼¡¤Ë¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤ËÂФ¹¤ë°ú¿ô¤ò°ú¿ô¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£Ä¹¤¤°ú¿ô¤ò»ØÄê¤Ç¤­¤ë¤Î¤Ç¡¢\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¼¡¤Î¤è¤¦¤Ê¥Æ¥­¥¹¥È°ú¿ô¤ò´Þ¤à¡¢bottom¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-<font size="\-1"> +- <a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/> +- Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&. <br/> +- Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&. +- Other names may be trademarks of their respective owners\&.</font> ++\fB<font size="\-1">\fR ++\fB <a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/>\fR ++\fB Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&. <br/>\fR ++\fB Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&.\fR ++\fB Other names may be trademarks of their respective owners\&.</font>\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼¡¤Î¤è¤¦¤Ë¼Â¹Ô¤·¤Þ¤¹¡£\fI javadoc \-bottom @bottom @packages\fR +-.sp +-\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤ò°ú¿ô¥Õ¥¡¥¤¥ë¤ÎºÇ½é¤Ë´Þ¤á¤Æ¡¢¼¡¤Î¤è¤¦¤Ë\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£\fIjavadoc @bottom @packages\fR ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼¡¤Î¤è¤¦¤Ë¼Â¹Ô¤·¤Þ¤¹¡£\fB javadoc \-bottom @bottom @packages\fR ++.sp ++\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤ò°ú¿ô¥Õ¥¡¥¤¥ë¤ÎºÇ½é¤Ë´Þ¤á¤Æ¡¢¼¡¤Î¤è¤¦¤Ë\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£\fBjavadoc @bottom @packages\fR + .RE + .SH "JAVADOC¥³¥Þ¥ó¥É¤Î¼Â¹Ô" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤Ï\fIjavadoc \-J\-version\fR¥ª¥×¥·¥ç¥ó¤ÇÆÃÄê¤Ç¤­¤Þ¤¹¡£½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë¤Ïɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ê¥ê¡¼¥¹Èֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£\fI\-quiet\fR¥ª¥×¥·¥ç¥ó¤Ç̵¸ú¤Ë¤Ç¤­¤Þ¤¹¡£ +-.PP +-Java¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥×¥í¥°¥é¥à¤«¤é\fIjavadoc\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¸ø³«¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fIcom\&.sun\&.tools\&.javadoc\&.Main\fR¤Ë¤¢¤ê¤Þ¤¹(¤Þ¤¿\fIjavadoc\fR¥³¥Þ¥ó¥É¤ÏºÆÆþ²Äǽ¤Ç¤¹)¡£¾ÜºÙ¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹ÈÖ¹æ¤Ï\fBjavadoc \-J\-version\fR¥ª¥×¥·¥ç¥ó¤ÇÆÃÄê¤Ç¤­¤Þ¤¹¡£½ÐÎÏ¥¹¥È¥ê¡¼¥à¤Ë¤Ïɸ½à¥É¥Ã¥¯¥ì¥Ã¥È¤Î¥ê¥ê¡¼¥¹Èֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£\fB\-quiet\fR¥ª¥×¥·¥ç¥ó¤Ç̵¸ú¤Ë¤Ç¤­¤Þ¤¹¡£ ++.PP ++Java¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥×¥í¥°¥é¥à¤«¤é\fBjavadoc\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¸ø³«¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï\fBcom\&.sun\&.tools\&.javadoc\&.Main\fR¤Ë¤¢¤ê¤Þ¤¹(¤Þ¤¿\fBjavadoc\fR¥³¥Þ¥ó¥É¤ÏºÆÆþ²Äǽ¤Ç¤¹)¡£¾ÜºÙ¤Ï¡¢É¸½à¥É¥Ã¥¯¥ì¥Ã¥È + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/standard\-doclet\&.html#runningprogrammatically)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-¼¡¤Î¼ê½ç¤Ç¤Ï¡¢É¸½àHTML¥É¥Ã¥¯¥ì¥Ã¥È¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤ò¸Æ¤Ó½Ð¤¹¤Ë¤Ï¡¢\fI\-doclet\fR¤ª¤è¤Ó\fI\-docletpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× ++¼¡¤Î¼ê½ç¤Ç¤Ï¡¢É¸½àHTML¥É¥Ã¥¯¥ì¥Ã¥È¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¥«¥¹¥¿¥à¡¦¥É¥Ã¥¯¥ì¥Ã¥È¤ò¸Æ¤Ó½Ð¤¹¤Ë¤Ï¡¢\fB\-doclet\fR¤ª¤è¤Ó\fB\-docletpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¥É¥Ã¥¯¥ì¥Ã¥È¤Î³µÍ× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/javadoc/doclet/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SS "´Êñ¤ÊÎã" + .PP +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤËÂФ·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤â¡¢¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¡¢¤½¤ì¤¾¤ì¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÂбþ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê̾¤ò»ý¤Á¤Þ¤¹¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤËÂФ·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤â¡¢¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£³Æ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¡¢¤½¤ì¤¾¤ì¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÂбþ¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê̾¤ò»ý¤Á¤Þ¤¹¡£ + .PP + ¼¡¤ÎÎã¤Ç¤Ï¡¢¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï/home/src/java/awt/*\&.java¤Ë¤¢¤ê¤Þ¤¹¡£À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤Ï/home/html¤Ç¤¹¡£ +-1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È²½.PP ++.PP ++1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥É¥­¥å¥á¥ó¥È²½ ++.PP + ¥Ñ¥Ã¥±¡¼¥¸¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Ë¤Ï¡¢¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¤ÈƱ¤¸Ì¾Á°¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë³ÊǼ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬(\fIjava\&.awt\&.color\fR¤Î¤è¤¦¤Ë¥É¥Ã¥È¤Ç¶èÀÚ¤é¤ì¤¿)Ê£¿ô¤Î¼±Ê̻Ҥ«¤é¹½À®¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¸å³¤Î³Æ¼±Ê̻Ҥ¬²¼°Ì¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(ava/awt/color¤Ê¤É)¤ËÂбþ¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ +-.PP +-1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¤¿¤á¤ÎÊ£¿ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢°Û¤Ê¤ë¾ì½ê¤Ë¤¢¤ë¤½¤Î¤è¤¦¤Ê2¤Ä¤Î¥Ç¥£¥ì¥¯¥È¥ê¡¦¥Ä¥ê¡¼¤Ëʬ¤±¤Æ³ÊǼ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤½¤Î¾ì¹ç¤Ï\fI\-sourcepath\fR¤Ë¤è¤Ã¤Æ¤½¤ÎξÊý¤Î¾ì½ê¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢src1/java/awt/color¤Èsrc2/java/awt/color¡£ +-.PP +-¥Ç¥£¥ì¥¯¥È¥ê¤ÎÊѹ¹(\fIcd\fR¥³¥Þ¥ó¥É¤ò»ÈÍÑ)¤Þ¤¿¤Ï\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¼¡¤ÎÎã¤ÇξÊý¤ÎÁªÂò»è¤ò¼¨¤·¤Þ¤¹¡£ +-.PP +-\fBExample 1\fR, 1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤«¤éºÆµ¢Åª¤Ë¼Â¹Ô +-.RS 4 +-¤³¤ÎÎã¤Ç¤Ï\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬Ç¤°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô¤Ç¤­¤ë¤è¤¦¤Ë¡¢\fI\-sourcepath\fR¤ò»ÈÍѤ·¡¢ºÆµ¢Åª½èÍý¤Î¤¿¤á¤Ë\fI\-subpackages\fR +-(1\&.4¤Î¿·¥ª¥×¥·¥ç¥ó)¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤ì¤Ï¡¢java¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¤¿¤É¤ê¤Þ¤¹¤¬¡¢\fIjava\&.net\fR¤È\fIjava\&.lang\fR¤ò¥ë¡¼¥È¤Ë»ý¤Ä¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤Þ¤¹¡£\fIjava\&.lang\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ç¤¢¤ë\fIjava\&.lang\&.ref\fR¤¬½ü³°¤µ¤ì¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤Þ¤¿¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤ò²¼Êý¤Ë¤¿¤É¤ë¤Ë¤Ï¡¢\fIjava:javax:org\&.xml\&.sax\fR¤Î¤è¤¦¤Ë¡¢¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò\fI\-subpackages\fR¤Î°ú¿ô¤ËÄɲä·¤Þ¤¹¡£ ++¥Ñ¥Ã¥±¡¼¥¸Ì¾¤¬(\fBjava\&.awt\&.color\fR¤Î¤è¤¦¤Ë¥É¥Ã¥È¤Ç¶èÀÚ¤é¤ì¤¿)Ê£¿ô¤Î¼±Ê̻Ҥ«¤é¹½À®¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¸å³¤Î³Æ¼±Ê̻Ҥ¬²¼°Ì¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(ava/awt/color¤Ê¤É)¤ËÂбþ¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++.PP ++1¤Ä¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î¤¿¤á¤ÎÊ£¿ô¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢°Û¤Ê¤ë¾ì½ê¤Ë¤¢¤ë¤½¤Î¤è¤¦¤Ê2¤Ä¤Î¥Ç¥£¥ì¥¯¥È¥ê¡¦¥Ä¥ê¡¼¤Ëʬ¤±¤Æ³ÊǼ¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤½¤Î¾ì¹ç¤Ï\fB\-sourcepath\fR¤Ë¤è¤Ã¤Æ¤½¤ÎξÊý¤Î¾ì½ê¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢src1/java/awt/color¤Èsrc2/java/awt/color¡£ ++.PP ++¥Ç¥£¥ì¥¯¥È¥ê¤ÎÊѹ¹(\fBcd\fR¥³¥Þ¥ó¥É¤ò»ÈÍÑ)¤Þ¤¿¤Ï\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¼¡¤ÎÎã¤ÇξÊý¤ÎÁªÂò»è¤ò¼¨¤·¤Þ¤¹¡£ ++.PP ++\fBÎã 1\fR ++.br ++1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤«¤éºÆµ¢Åª¤Ë¼Â¹Ô ++.RS 4 ++¤³¤ÎÎã¤Ç¤Ï\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬Ç¤°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô¤Ç¤­¤ë¤è¤¦¤Ë¡¢\fB\-sourcepath\fR¤ò»ÈÍѤ·¡¢ºÆµ¢Åª½èÍý¤Î¤¿¤á¤Ë\fB\-subpackages\fR ++(1\&.4¤Î¿·¥ª¥×¥·¥ç¥ó)¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤ì¤Ï¡¢java¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤ò¤¿¤É¤ê¤Þ¤¹¤¬¡¢\fBjava\&.net\fR¤È\fBjava\&.lang\fR¤ò¥ë¡¼¥È¤Ë»ý¤Ä¥Ñ¥Ã¥±¡¼¥¸¤Ï½ü³°¤µ¤ì¤Þ¤¹¡£\fBjava\&.lang\fR¤Î¥µ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Ç¤¢¤ë\fBjava\&.lang\&.ref\fR¤¬½ü³°¤µ¤ì¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤Þ¤¿¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤ò²¼Êý¤Ë¤¿¤É¤ë¤Ë¤Ï¡¢\fBjava:javax:org\&.xml\&.sax\fR¤Î¤è¤¦¤Ë¡¢¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò\fB\-subpackages\fR¤Î°ú¿ô¤ËÄɲä·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html \-sourcepath /home/src \-subpackages java \-exclude ++\fBjavadoc \-d /home/html \-sourcepath /home/src \-subpackages java \-exclude\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ¥ë¡¼¥È¤Ø¤Î°ÜÆ°¤ª¤è¤ÓÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤Î¼Â¹Ô +-.RS 4 +-´°Á´½¤¾þ¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¤Þ¤¹¡£¼¡¤Ë¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBÎã 2\fR ++.br ++¥ë¡¼¥È¤Ø¤Î°ÜÆ°¤ª¤è¤ÓÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤Î¼Â¹Ô ++.RS 4 ++´°Á´½¤¾þ¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤Ë°ÜÆ°¤·¤Þ¤¹¡£¼¡¤Ë¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-cd /home/src/ +-javadoc \-d /home/html java\&.awt java\&.awt\&.event ++\fBcd /home/src/\fR ++\fBjavadoc \-d /home/html java\&.awt java\&.awt\&.event\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤Þ¤¿¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤ò²¼Êý¤Ë¤¿¤É¤ë¤Ë¤Ï¡¢j\fIava:javax:org\&.xml\&.sax\fR¤Î¤è¤¦¤Ë¡¢¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò\fI\-subpackages\fR¤Î°ú¿ô¤ËÄɲä·¤Þ¤¹¡£ +-.RE +-.PP +-\fBExample 3\fR, 1¤Ä¤Î¥Ä¥ê¡¼¤ÎÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤ÎǤ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô +-.RS 4 +-¤³¤Î¾ì¹ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤¬¤É¤³¤«¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢ºÇ¾å°Ì¥Ñ¥Ã¥±¡¼¥¸¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Æ\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£ ++¤Þ¤¿¡¢Â¾¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥Ä¥ê¡¼¤ò²¼Êý¤Ë¤¿¤É¤ë¤Ë¤Ï¡¢j\fBava:javax:org\&.xml\&.sax\fR¤Î¤è¤¦¤Ë¡¢¤½¤ì¤é¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò\fB\-subpackages\fR¤Î°ú¿ô¤ËÄɲä·¤Þ¤¹¡£ ++.RE ++.PP ++\fBÎã 3\fR ++.br ++1¤Ä¤Î¥Ä¥ê¡¼¤ÎÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤ÎǤ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô ++.RS 4 ++¤³¤Î¾ì¹ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤¬¤É¤³¤«¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢ºÇ¾å°Ì¥Ñ¥Ã¥±¡¼¥¸¤Î¿Æ¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Æ\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html \-sourcepath /home/src java\&.awt java\&.awt\&.event ++\fBjavadoc \-d /home/html \-sourcepath /home/src java\&.awt java\&.awt\&.event\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 4\fR, Ê£¿ô¤Î¥Ä¥ê¡¼¤ÎÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤ÎǤ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô +-.RS 4 +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢³Æ¥Ä¥ê¡¼¤Î¥ë¡¼¥È¤Ø¤Î¥Ñ¥¹¤Î¥³¥í¥ó¶èÀÚ¤ê¥ê¥¹¥È¤ò»ØÄꤷ¤Æ\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¡¢1¤Ä¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î²¼¤Ë¸ºß¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¤¬¡¢¥½¡¼¥¹¡¦¥Ñ¥¹¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Î¤É¤³¤«¤Ç¸«¤Ä¤«¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBÎã 4\fR ++.br ++Ê£¿ô¤Î¥Ä¥ê¡¼¤ÎÌÀ¼¨Åª¤Ê¥Ñ¥Ã¥±¡¼¥¸¤ÎǤ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼Â¹Ô ++.RS 4 ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢³Æ¥Ä¥ê¡¼¤Î¥ë¡¼¥È¤Ø¤Î¥Ñ¥¹¤Î¥³¥í¥ó¶èÀÚ¤ê¥ê¥¹¥È¤ò»ØÄꤷ¤Æ\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î¤¹¤Ù¤Æ¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¡¢1¤Ä¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Î²¼¤Ë¸ºß¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¤¬¡¢¥½¡¼¥¹¡¦¥Ñ¥¹¤Ç»ØÄꤵ¤ì¤¿¾ì½ê¤Î¤É¤³¤«¤Ç¸«¤Ä¤«¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html \-sourcepath /home/src1:/home/src2 java\&.awt java\&.awt\&.event ++\fBjavadoc \-d /home/html \-sourcepath /home/src1:/home/src2 java\&.awt java\&.awt\&.event\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤¹¤Ù¤Æ¤Î¥±¡¼¥¹¤Çj\fIava\&.awt\fR¤ª¤è¤Ó\fIjava\&.awt\&.even\fRt¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î\fIpublic\fR¤ª¤è¤Ó\fIprotected\fR¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ä¤¤¤Æ¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢»ØÄꤵ¤ì¤¿À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤ËHTML¥Õ¥¡¥¤¥ë¤¬Êݸ¤µ¤ì¤Þ¤¹¡£2¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬À¸À®¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥É¥­¥å¥á¥ó¥È¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥ê¥¹¥È¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¡¢¤ª¤è¤Ó¥á¥¤¥ó¤Î¥¯¥é¥¹¡¦¥Ú¡¼¥¸¤È¤¤¤¦3¤Ä¤ÎHTML¥Õ¥ì¡¼¥à¤ò»ý¤Ä¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ +-.RE +-1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½.PP +-¤Þ¤¿¡¢1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ·¤Æ¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£\fIjavadoc\fR¤Ï¡¢¼¡¤Î2¤Ä¤ÎÊýË¡¤Î¤¤¤º¤ì¤«¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£1¤Ä¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤òÊѹ¹¤¹¤ëÊýË¡(\fIcd\fR¤ò»ÈÍÑ)¡¢¤â¤¦1¤Ä¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò´°Á´¤Ë»ØÄꤹ¤ëÊýË¡¤Ç¤¹¡£ÁêÂХѥ¹¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òµ¯ÅÀ¤È¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ¹¤È¤­¤Ï¡¢\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¹¤Î¥°¥ë¡¼¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ +-.PP +-\fBExample 1\fR, ¥½¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹ +-.RS 4 +-¥½¡¼¥¹¤òÊÝ»ý¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹¤·¤Þ¤¹¡£¼¡¤Ë¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ +-.sp +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIButton\fR¥¯¥é¥¹¤È\fICanvas\fR¥¯¥é¥¹¡¢¤ª¤è¤Ó̾Á°¤¬\fIGraphics\fR¤Ç»Ï¤Þ¤ë¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥É¥­¥å¥á¥ó¥È¤Ï¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¤È¥á¥¤¥ó¡¦¥Ú¡¼¥¸¤È¤¤¤¦2¤Ä¤Î¥Õ¥ì¡¼¥à¤ò»ý¤Ä¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¤¹¤Ù¤Æ¤Î¥±¡¼¥¹¤Çj\fBava\&.awt\fR¤ª¤è¤Ó\fBjava\&.awt\&.even\fRt¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î\fBpublic\fR¤ª¤è¤Ó\fBprotected\fR¥¯¥é¥¹¤È¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ä¤¤¤Æ¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢»ØÄꤵ¤ì¤¿À¸À®Àè¥Ç¥£¥ì¥¯¥È¥ê¤ËHTML¥Õ¥¡¥¤¥ë¤¬Êݸ¤µ¤ì¤Þ¤¹¡£2¤Ä°Ê¾å¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬À¸À®¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥É¥­¥å¥á¥ó¥È¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Î¥ê¥¹¥È¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¡¢¤ª¤è¤Ó¥á¥¤¥ó¤Î¥¯¥é¥¹¡¦¥Ú¡¼¥¸¤È¤¤¤¦3¤Ä¤ÎHTML¥Õ¥ì¡¼¥à¤ò»ý¤Ä¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.RE ++.PP ++1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½ ++.PP ++¤Þ¤¿¡¢1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ·¤Æ¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£\fBjavadoc\fR¤Ï¡¢¼¡¤Î2¤Ä¤ÎÊýË¡¤Î¤¤¤º¤ì¤«¤Ç¼Â¹Ô¤Ç¤­¤Þ¤¹¡£1¤Ä¤Ï¥Ç¥£¥ì¥¯¥È¥ê¤òÊѹ¹¤¹¤ëÊýË¡(\fBcd\fR¤ò»ÈÍÑ)¡¢¤â¤¦1¤Ä¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤Î¥Ñ¥¹¤ò´°Á´¤Ë»ØÄꤹ¤ëÊýË¡¤Ç¤¹¡£ÁêÂХѥ¹¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òµ¯ÅÀ¤È¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÅϤ¹¤È¤­¤Ï¡¢\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Î¤è¤¦¤Ê¥³¥Þ¥ó¥É¹Ô¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¹¤Î¥°¥ë¡¼¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++.PP ++\fBÎã 1\fR ++.br ++¥½¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹ ++.RS 4 ++¥½¡¼¥¹¤òÊÝ»ý¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹¤·¤Þ¤¹¡£¼¡¤Ë¡¢¥É¥­¥å¥á¥ó¥È²½¤¹¤ë1¤Ä°Ê¾å¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++.sp ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBButton\fR¥¯¥é¥¹¤È\fBCanvas\fR¥¯¥é¥¹¡¢¤ª¤è¤Ó̾Á°¤¬\fBGraphics\fR¤Ç»Ï¤Þ¤ë¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¡¢HTML·Á¼°¤Î¥É¥­¥å¥á¥ó¥È¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤¬\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¥É¥­¥å¥á¥ó¥È¤Ï¡¢¥¯¥é¥¹¤Î¥ê¥¹¥È¤È¥á¥¤¥ó¡¦¥Ú¡¼¥¸¤È¤¤¤¦2¤Ä¤Î¥Õ¥ì¡¼¥à¤ò»ý¤Ä¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-cd /home/src/java/awt +-javadoc \-d /home/html Button\&.java Canvas\&.java Graphics*\&.java ++\fBcd /home/src/java/awt\fR ++\fBjavadoc \-d /home/html Button\&.java Canvas\&.java Graphics*\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹ ++\fBÎã 2\fR ++.br ++¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÊѹ¹ + .RS 4 + ¤³¤ì¤Ï¡¢Æ±¤¸¥ë¡¼¥È¤«¤é¤ÎÊ̤Υµ¥Ö¥Ñ¥Ã¥±¡¼¥¸¤Î¸Ä¡¹¤Î¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£¥Ñ¥Ã¥±¡¼¥¸¤Î¥ë¡¼¥È¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë°Ü¤ê¡¢³Æ¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¡¢¥ë¡¼¥È¤«¤é¤Î¥Ñ¥¹¤È¤È¤â¤Ë»ØÄꤷ¤Þ¤¹¡£ + .sp +@@ -3501,143 +3668,157 @@ + .RS 4 + .\} + .nf +-cd /home/src/ +-javadoc \-d /home/html java/awt/Button\&.java java/applet/Applet\&.java ++\fBcd /home/src/\fR ++\fBjavadoc \-d /home/html java/awt/Button\&.java java/applet/Applet\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, Ǥ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥È²½ +-.RS 4 +-¤³¤Î¾ì¹ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤¬¤É¤³¤«¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤ÎÀäÂХѥ¹(¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹)¤ò»ØÄꤷ¤Æ\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBÎã 3\fR ++.br ++Ǥ°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤Î¥Õ¥¡¥¤¥ë¤Î¥É¥­¥å¥á¥ó¥È²½ ++.RS 4 ++¤³¤Î¾ì¹ç¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤¬¤É¤³¤«¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ø¤ÎÀäÂХѥ¹(¤Þ¤¿¤Ï¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¤ÎÁêÂХѥ¹)¤ò»ØÄꤷ¤Æ\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html /home/src/java/awt/Button\&.java +-/home/src/java/awt/Graphics*\&.java ++\fBjavadoc \-d /home/html /home/src/java/awt/Button\&.java\fR ++\fB/home/src/java/awt/Graphics*\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE +-¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½.PP +-¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤȸġ¹¤Î¥¯¥é¥¹¤òƱ»þ¤Ë»ØÄꤷ¤Æ¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¼¡¤Ë¡¢Á°½Ò¤Î2¤Ä¤ÎÎã¤òÁȤ߹礻¤¿Îã¤ò¼¨¤·¤Þ¤¹¡£\fI\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥Ñ¥¹¤ËÂФ·¤Æ¤Ï»ÈÍѤǤ­¤Þ¤¹¤¬¡¢¸Ä¡¹¤Î¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ËÂФ·¤Æ¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++.PP ++¥Ñ¥Ã¥±¡¼¥¸¤ª¤è¤Ó¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È²½ ++.PP ++¥Ñ¥Ã¥±¡¼¥¸Á´ÂΤȸġ¹¤Î¥¯¥é¥¹¤òƱ»þ¤Ë»ØÄꤷ¤Æ¥É¥­¥å¥á¥ó¥È²½¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¼¡¤Ë¡¢Á°½Ò¤Î2¤Ä¤ÎÎã¤òÁȤ߹礻¤¿Îã¤ò¼¨¤·¤Þ¤¹¡£\fB\-sourcepath\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸¤Ø¤Î¥Ñ¥¹¤ËÂФ·¤Æ¤Ï»ÈÍѤǤ­¤Þ¤¹¤¬¡¢¸Ä¡¹¤Î¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ËÂФ·¤Æ¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-d /home/html \-sourcepath /home/src java\&.awt +-/home/src/java/applet/Applet\&.java ++\fBjavadoc \-d /home/html \-sourcepath /home/src java\&.awt\fR ++\fB/home/src/java/applet/Applet\&.java\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¼ÂºÝ¤ÎÎã" + .PP +-¼¡¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤ª¤è¤Ó\fImakefile\fR¥Ð¡¼¥¸¥ç¥ó¤Î\fIjavadoc\fR¥³¥Þ¥ó¥É¤òJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥àAPI¤Ç¼Â¹Ô¤·¤Þ¤¹¡£Java SE 1\&.2¤ÇÌó1500¸Ä¤Îpublic¤ª¤è¤Óprotected¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢180MB¤Î¥á¥â¥ê¡¼¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Á¤é¤ÎÎã¤â¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤ÇÀäÂХѥ¹¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤¿¤á¡¢Ç¤°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤éƱ¤¸\fIjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤ÎÎã.PP +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ìÉô¤Î¥·¥§¥ë¤ËÂФ·¤ÆŤ¹¤®¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÀ©¸Â¤ò²óÈò¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤òµ­½Ò¤·¤Þ¤¹¡£ +-.PP +-¤³¤ÎÎã¤Ç¤Ï¡¢\fIpackages\fR¤Ï½èÍý¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à̾Á°¤Ç¡¢\fIjava\&.applet\fR +-\fIjava\&.lang\fR¤Ê¤É¤Ç¤¹¡£³Æ¥ª¥×¥·¥ç¥ó¤Î¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤Þ¤ì¤¿°ú¿ô¤ÎÆ⦤ˤϡ¢²þ¹Ôʸ»ú¤òÁÞÆþ¤Ç¤­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¤³¤ÎÎã¤ò¥³¥Ô¡¼¡¦¥¢¥ó¥É¡¦¥Ú¡¼¥¹¥È¤¹¤ë¾ì¹ç¤Ï¡¢\fI\-bottom\fR¥ª¥×¥·¥ç¥ó¤«¤é²þ¹Ôʸ»ú¤òºï½ü¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¹Ô¤ª¤è¤Ó\fBmakefile\fR¥Ð¡¼¥¸¥ç¥ó¤Î\fBjavadoc\fR¥³¥Þ¥ó¥É¤òJava¥×¥é¥Ã¥È¥Õ¥©¡¼¥àAPI¤Ç¼Â¹Ô¤·¤Þ¤¹¡£Java SE 1\&.2¤ÇÌó1500¸Ä¤Îpublic¤ª¤è¤Óprotected¥¯¥é¥¹¤Î¥É¥­¥å¥á¥ó¥È¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢180MB¤Î¥á¥â¥ê¡¼¤ò»ÈÍѤ·¤Þ¤¹¡£¤É¤Á¤é¤ÎÎã¤â¥ª¥×¥·¥ç¥ó¤Î°ú¿ô¤ÇÀäÂХѥ¹¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤¿¤á¡¢Ç¤°Õ¤Î¥Ç¥£¥ì¥¯¥È¥ê¤«¤éƱ¤¸\fBjavadoc\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ ++.PP ++¥³¥Þ¥ó¥É¹Ô¤ÎÎã ++.PP ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ìÉô¤Î¥·¥§¥ë¤ËÂФ·¤ÆŤ¹¤®¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÀ©¸Â¤ò²óÈò¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô°ú¿ô¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤òµ­½Ò¤·¤Þ¤¹¡£ ++.PP ++¤³¤ÎÎã¤Ç¤Ï¡¢\fBpackages\fR¤Ï½èÍý¤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à̾Á°¤Ç¡¢\fBjava\&.applet\fR ++\fBjava\&.lang\fR¤Ê¤É¤Ç¤¹¡£³Æ¥ª¥×¥·¥ç¥ó¤Î¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤Þ¤ì¤¿°ú¿ô¤ÎÆ⦤ˤϡ¢²þ¹Ôʸ»ú¤òÁÞÆþ¤Ç¤­¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢¤³¤ÎÎã¤ò¥³¥Ô¡¼¡¦¥¢¥ó¥É¡¦¥Ú¡¼¥¹¥È¤¹¤ë¾ì¹ç¤Ï¡¢\fB\-bottom\fR¥ª¥×¥·¥ç¥ó¤«¤é²þ¹Ôʸ»ú¤òºï½ü¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath /java/jdk/src/share/classes \e +-\-overview /java/jdk/src/share/classes/overview\&.html \e +-\-d /java/jdk/build/api \e +-\-use \e +-\-splitIndex \e +-\-windowtitle \*(AqJava Platform, Standard Edition 7 API Specification\*(Aq \e +-\-doctitle \*(AqJava Platform, Standard Edition 7 API Specification\*(Aq \e +-\-header \*(Aq<b>Java(TM) SE 7</b>\*(Aq \e +-\-bottom \*(Aq<font size="\-1"> +-<a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/> +-Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&.<br/> +-Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&. +-Other names may be trademarks of their respective owners\&.</font>\*(Aq \e +-\-group "Core Packages" "java\&.*:com\&.sun\&.java\&.*:org\&.omg\&.*" \e +-\-group "Extension Packages" "javax\&.*" \e +-\-J\-Xmx180m \e +-@packages ++\fBjavadoc \-sourcepath /java/jdk/src/share/classes \e\fR ++\fB\-overview /java/jdk/src/share/classes/overview\&.html \e\fR ++\fB\-d /java/jdk/build/api \e\fR ++\fB\-use \e\fR ++\fB\-splitIndex \e\fR ++\fB\-windowtitle \*(AqJava Platform, Standard Edition 7 API Specification\*(Aq \e\fR ++\fB\-doctitle \*(AqJava Platform, Standard Edition 7 API Specification\*(Aq \e\fR ++\fB\-header \*(Aq<b>Java(TM) SE 7</b>\*(Aq \e\fR ++\fB\-bottom \*(Aq<font size="\-1">\fR ++\fB<a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/>\fR ++\fBCopyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&.<br/>\fR ++\fBOracle is a registered trademark of Oracle Corporation and/or its affiliates\&.\fR ++\fBOther names may be trademarks of their respective owners\&.</font>\*(Aq \e\fR ++\fB\-group "Core Packages" "java\&.*:com\&.sun\&.java\&.*:org\&.omg\&.*" \e\fR ++\fB\-group "Extension Packages" "javax\&.*" \e\fR ++\fB\-J\-Xmx180m \e \fR ++\fB@packages\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹.PP ++.PP ++¥×¥í¥°¥é¥Þ¥Æ¥£¥Ã¥¯¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹ ++.PP + Javadoc Access API¤Ç¤Ï¡¢¿·¤·¤¤¥×¥í¥»¥¹¤ò¼Â¹Ô¤·¤Ê¤¯¤Æ¤â¡¢Javadoc¥Ä¡¼¥ë¤òJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤«¤éľÀܵ¯Æ°¤Ç¤­¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¼¡¤Îʸ¤Ï¥³¥Þ¥ó¥É\fIjavadoc \-d /home/html \-sourcepath /home/src \-subpackages java \-exclude java\&.net:java\&.lang com\&.example\fR¤ÈƱÅù¤Ç¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¼¡¤Îʸ¤Ï¥³¥Þ¥ó¥É\fBjavadoc \-d /home/html \-sourcepath /home/src \-subpackages java \-exclude java\&.net:java\&.lang com\&.example\fR¤ÈƱÅù¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-import javax\&.tools\&.DocumentationTool; +-import javax\&.tools\&.ToolProvider; +- +-public class JavaAccessSample{ +- public static void main(String[] args){ +- DocumentationTool javadoc = ToolProvider\&.getSystemDocumentationTool(); +- int rc = javadoc\&.run( null, null, null, +- "\-d", "/home/html", +- "\-sourcepath", "home/src", +- "\-subpackages", "java", +- "\-exclude", "java\&.net:java\&.lang", +- "com\&.example"); +- } +- } ++\fBimport javax\&.tools\&.DocumentationTool;\fR ++\fBimport javax\&.tools\&.ToolProvider;\fR ++ ++\fBpublic class JavaAccessSample{\fR ++\fB public static void main(String[] args){\fR ++\fB DocumentationTool javadoc = ToolProvider\&.getSystemDocumentationTool();\fR ++\fB int rc = javadoc\&.run( null, null, null,\fR ++\fB "\-d", "/home/html",\fR ++\fB "\-sourcepath", "home/src",\fR ++\fB "\-subpackages", "java",\fR ++\fB "\-exclude", "java\&.net:java\&.lang",\fR ++\fB "com\&.example");\fR ++\fB }\fR ++\fB }\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIrun\fR¥á¥½¥Ã¥É¤ÎºÇ½é¤Î3¤Ä¤Î°ú¿ô¤Ï¡¢ÆþÎÏ¡¢É¸½à½ÐÎÏ¡¢¤ª¤è¤Óɸ½à¥¨¥é¡¼¡¦¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤Þ¤¹¡£\fINull\fR¤Ï\fISystem\&.in\fR¡¢\fISystem\&.out\fR¤ª¤è¤Ó\fISystem\&.err\fR¤½¤ì¤¾¤ì¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤǤ¹¡£ ++\fBrun\fR¥á¥½¥Ã¥É¤ÎºÇ½é¤Î3¤Ä¤Î°ú¿ô¤Ï¡¢ÆþÎÏ¡¢É¸½à½ÐÎÏ¡¢¤ª¤è¤Óɸ½à¥¨¥é¡¼¡¦¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤Þ¤¹¡£\fBNull\fR¤Ï\fBSystem\&.in\fR¡¢\fBSystem\&.out\fR¤ª¤è¤Ó\fBSystem\&.err\fR¤½¤ì¤¾¤ì¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤǤ¹¡£ + .SS "makefile¤ÎÎã" + .PP + ¤³¤³¤Ç¤Ï¡¢GNU +-\fImakefile\fR¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fImakefile\fR¤Î°ú¿ô¤Ï¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£Windows +-\fImakefile\fR¤ÎÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc FAQ¤Î\fImakefiles\fR¤Ë´Ø¤¹¤ë¹à ++\fBmakefile\fR¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fBmakefile\fR¤Î°ú¿ô¤Ï¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤ß¤Þ¤¹¡£Windows ++\fBmakefile\fR¤ÎÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc FAQ¤Î\fBmakefiles\fR¤Î¥»¥¯¥·¥ç¥ó + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137483\&.html#makefiles)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-javadoc \-sourcepath $(SRCDIR) \e /* Sets path for source files */ +- \-overview $(SRCDIR)/overview\&.html \e /* Sets file for overview text */ +- \-d /java/jdk/build/api \e /* Sets destination directory */ +- \-use \e /* Adds "Use" files */ +- \-splitIndex \e /* Splits index A\-Z */ +- \-windowtitle $(WINDOWTITLE) \e /* Adds a window title */ +- \-doctitle $(DOCTITLE) \e /* Adds a doc title */ +- \-header $(HEADER) \e /* Adds running header text */ +- \-bottom $(BOTTOM) \e /* Adds text at bottom */ +- \-group $(GROUPCORE) \e /* 1st subhead on overview page */ +- \-group $(GROUPEXT) \e /* 2nd subhead on overview page */ +- \-J\-Xmx180m \e /* Sets memory to 180MB */ +- java\&.lang java\&.lang\&.reflect \e /* Sets packages to document */ +- java\&.util java\&.io java\&.net \e +- java\&.applet +- +-WINDOWTITLE = \*(AqJava(TM) SE 7 API Specification\*(Aq +-DOCTITLE = \*(AqJava(TM) Platform Standard Edition 7 API Specification\*(Aq +-HEADER = \*(Aq<b>Java(TM) SE 7</font>\*(Aq +-BOTTOM = \*(Aq<font size="\-1"> +- <a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/> +- Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&.<br/> +- Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&. +- Other names may be trademarks of their respective owners\&.</font>\*(Aq +-GROUPCORE = \*(Aq"Core Packages" "java\&.*:com\&.sun\&.java\&.*:org\&.omg\&.*"\*(Aq +-GROUPEXT = \*(Aq"Extension Packages" "javax\&.*"\*(Aq +-SRCDIR = \*(Aq/java/jdk/1\&.7\&.0/src/share/classes\*(Aq ++\fBjavadoc \-sourcepath $(SRCDIR) \e /* Sets path for source files */\fR ++\fB \-overview $(SRCDIR)/overview\&.html \e /* Sets file for overview text */\fR ++\fB \-d /java/jdk/build/api \e /* Sets destination directory */\fR ++\fB \-use \e /* Adds "Use" files */\fR ++\fB \-splitIndex \e /* Splits index A\-Z */\fR ++\fB \-windowtitle $(WINDOWTITLE) \e /* Adds a window title */\fR ++\fB \-doctitle $(DOCTITLE) \e /* Adds a doc title */\fR ++\fB \-header $(HEADER) \e /* Adds running header text */\fR ++\fB \-bottom $(BOTTOM) \e /* Adds text at bottom */\fR ++\fB \-group $(GROUPCORE) \e /* 1st subhead on overview page */\fR ++\fB \-group $(GROUPEXT) \e /* 2nd subhead on overview page */\fR ++\fB \-J\-Xmx180m \e /* Sets memory to 180MB */\fR ++\fB java\&.lang java\&.lang\&.reflect \e /* Sets packages to document */\fR ++\fB java\&.util java\&.io java\&.net \e\fR ++\fB java\&.applet\fR ++\fB \fR ++\fBWINDOWTITLE = \*(AqJava(TM) SE 7 API Specification\*(Aq\fR ++\fBDOCTITLE = \*(AqJava(TM) Platform Standard Edition 7 API Specification\*(Aq\fR ++\fBHEADER = \*(Aq<b>Java(TM) SE 7</font>\*(Aq\fR ++\fBBOTTOM = \*(Aq<font size="\-1">\fR ++\fB <a href="http://bugreport\&.sun\&.com/bugreport/">Submit a bug or feature</a><br/>\fR ++\fB Copyright © 1993, 2011, Oracle and/or its affiliates\&. All rights reserved\&.<br/>\fR ++\fB Oracle is a registered trademark of Oracle Corporation and/or its affiliates\&.\fR ++\fB Other names may be trademarks of their respective owners\&.</font>\*(Aq\fR ++\fBGROUPCORE = \*(Aq"Core Packages" "java\&.*:com\&.sun\&.java\&.*:org\&.omg\&.*"\*(Aq\fR ++\fBGROUPEXT = \*(Aq"Extension Packages" "javax\&.*"\*(Aq\fR ++\fBSRCDIR = \*(Aq/java/jdk/1\&.7\&.0/src/share/classes\*(Aq\fR ++ + .fi + .if n \{\ + .RE +@@ -3652,7 +3833,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¥É¥­¥å¥á¥ó¥È¡¦¥¿¥¤¥È¥ë¤¬¥¦¥£¥ó¥É¥¦¡¦¥¿¥¤¥È¥ë¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£\fI\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤Î¥Æ¥­¥¹¥È¤Ï¡¢\fI\-doctitle\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¤¬¡¢HTML¥¿¥°¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢HTML¥¿¥°¤¬¡¢¥¦¥£¥ó¥É¥¦¡¦¥¿¥¤¥È¥ëÆâ¤Ë¤½¤Î¤Þ¤Þ¤Î¥Æ¥­¥¹¥È¤È¤·¤Æɽ¼¨¤µ¤ì¤ë¤Î¤òËɤ°¤¿¤á¤Ç¤¹¡£ ++\fB\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¥É¥­¥å¥á¥ó¥È¡¦¥¿¥¤¥È¥ë¤¬¥¦¥£¥ó¥É¥¦¡¦¥¿¥¤¥È¥ë¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£\fB\-windowtitle\fR¥ª¥×¥·¥ç¥ó¤Î¥Æ¥­¥¹¥È¤Ï¡¢\fB\-doctitle\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¤¬¡¢HTML¥¿¥°¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢HTML¥¿¥°¤¬¡¢¥¦¥£¥ó¥É¥¦¡¦¥¿¥¤¥È¥ëÆâ¤Ë¤½¤Î¤Þ¤Þ¤Î¥Æ¥­¥¹¥È¤È¤·¤Æɽ¼¨¤µ¤ì¤ë¤Î¤òËɤ°¤¿¤á¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -3663,7 +3844,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-footer\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¥Ø¥Ã¥À¡¼¡¦¥Æ¥­¥¹¥È¤¬¥Õ¥Ã¥¿¡¼¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++\fB\-footer\fR¥ª¥×¥·¥ç¥ó¤ò¾Êά¤¹¤ë¤È¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¥Ø¥Ã¥À¡¼¡¦¥Æ¥­¥¹¥È¤¬¥Õ¥Ã¥¿¡¼¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -3674,7 +3855,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¤³¤ÎÎã¤Ç¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¤¬¡¢\fI\-classpath\fR¤È\fI\-link\fR¤â½ÅÍפʥª¥×¥·¥ç¥ó¤Ç¤¹¡£ ++¤³¤ÎÎã¤Ç¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¤¬¡¢\fB\-classpath\fR¤È\fB\-link\fR¤â½ÅÍפʥª¥×¥·¥ç¥ó¤Ç¤¹¡£ + .RE + .SH "°ìÈÌŪ¤Ê¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°" + .sp +@@ -3686,7 +3867,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIjavadoc\fR¥³¥Þ¥ó¥É¤ÏÍ­¸ú¤Ê¥¯¥é¥¹Ì¾¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤Î¤ß¤òÆɤ߼è¤ê¤Þ¤¹¡£\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòÀµ¤·¤¯Æɤ߼è¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥¯¥é¥¹Ì¾¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavadoc\fR¥³¥Þ¥ó¥É¤ÏÍ­¸ú¤Ê¥¯¥é¥¹Ì¾¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤Î¤ß¤òÆɤ߼è¤ê¤Þ¤¹¡£\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥Õ¥¡¥¤¥ë¤ÎÆâÍƤòÀµ¤·¤¯Æɤ߼è¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥¯¥é¥¹Ì¾¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î½èÍý¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -3697,25 +3878,25 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¶¦Ä̤ÎÉÔ¶ñ¹ç¤ª¤è¤Ó¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤Î¥Ò¥ó¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc FAQ ++°ìÈÌŪ¤Êbug¤ª¤è¤Ó¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤Î¥Ò¥ó¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢Javadoc FAQ + (http://www\&.oracle\&.com/technetwork/java/javase/documentation/index\-137483\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥¨¥é¡¼¤È·Ù¹ð" + .PP + ¥¨¥é¡¼¤ª¤è¤Ó·Ù¹ð¥á¥Ã¥»¡¼¥¸¤Ë¤Ï¡¢¥Õ¥¡¥¤¥ë̾¤ÈÀë¸À¹Ô(¥É¥­¥å¥á¥ó¥Æ¡¼¥·¥ç¥ó¡¦¥³¥á¥ó¥ÈÆâ¤ÎÆÃÄê¤Î¹Ô¤Ç¤Ï¤Ê¤¤)¤Î¹ÔÈֹ椬´Þ¤Þ¤ì¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢¥á¥Ã¥»¡¼¥¸\fI¡Ö¥¨¥é¡¼: Class1\&.java¤òÆɤ߹þ¤á¤Þ¤»¤ó¡×\fR¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬\fIClass1\&.jav\fR\fIa\fR¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥í¡¼¥É¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¥¯¥é¥¹Ì¾¤Ï¤½¤Î¥Ñ¥¹(ÀäÂФޤ¿¤ÏÁêÂÐ)¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥á¥Ã¥»¡¼¥¸\fB¡Ö¥¨¥é¡¼: Class1\&.java¤òÆɤ߹þ¤á¤Þ¤»¤ó¡×\fR¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬\fBClass1\&.jav\fR\fBa\fR¤ò¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥í¡¼¥É¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¥¯¥é¥¹Ì¾¤Ï¤½¤Î¥Ñ¥¹(ÀäÂФޤ¿¤ÏÁêÂÐ)¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£ + .SH "´Ä¶­" + .PP + CLASSPATH + .RS 4 +-\fICLASSPATH\fR¤Ï¡¢\fIjavadoc\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¸¡½Ð¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¤òÄ󶡤¹¤ë´Ä¶­ÊÑ¿ô¤Ç¤¹¡£¤³¤Î´Ä¶­ÊÑ¿ô¤Ï¡¢\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥»¥ß¥³¥í¥ó(Windows¤Î¾ì¹ç)¤Þ¤¿¤Ï¥³¥í¥ó(Oracle Solaris¤Î¾ì¹ç)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ ++\fBCLASSPATH\fR¤Ï¡¢\fBjavadoc\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¸¡½Ð¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¤òÄ󶡤¹¤ë´Ä¶­ÊÑ¿ô¤Ç¤¹¡£¤³¤Î´Ä¶­ÊÑ¿ô¤Ï¡¢\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¥ª¡¼¥Ð¡¼¥é¥¤¥É¤µ¤ì¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥»¥ß¥³¥í¥ó(Windows¤Î¾ì¹ç)¤Þ¤¿¤Ï¥³¥í¥ó(Oracle Solaris¤Î¾ì¹ç)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ + .sp + \fBWindows¤ÎÎã\fR: +-\fI\&.;C:\eclasses;C:\ehome\ejava\eclasses\fR ++\fB\&.;C:\eclasses;C:\ehome\ejava\eclasses\fR + .sp + \fBOracle Solaris¤ÎÎã\fR: +-\fI\&.:/home/classes:/usr/local/java/classes\fR ++\fB\&.:/home/classes:/usr/local/java/classes\fR + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/javah.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/javah.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: javah +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: javah ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "javah" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + javah \- Java¥¯¥é¥¹¤«¤éC¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjavah\fR [ \fIoptions\fR ] f\fIully\-qualified\-class\-name \&.\&.\&.\fR ++\fBjavah\fR [ \fIoptions\fR ] f\fIully\-qualified\-class\-name \&.\&.\&.\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIfully\-qualified\-class\-name\fR +@@ -73,76 +75,76 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjavah\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤ËɬÍפÊC¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ºîÀ®¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥½¡¼¥¹¡¦¥³¡¼¥É¤«¤é¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤ò»²¾È¤¹¤ë¤¿¤á¤ËC¥×¥í¥°¥é¥à¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£\fI\&.h\fR¥Õ¥¡¥¤¥ë¤Ï¡¢Âбþ¤¹¤ë¥¯¥é¥¹¤È°ìÃפ¹¤ëÇÛÃÖ¤ò»ý¤Ä\fIstruct\fRÄêµÁ¤ò´Þ¤ß¤Þ¤¹¡£\fIstruct\fR¤Î¥Õ¥£¡¼¥ë¥É¤Ï¡¢¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤ËÂбþ¤·¤Þ¤¹¡£ ++\fBjavah\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤ËɬÍפÊC¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ºîÀ®¤µ¤ì¤¿¥Ø¥Ã¥À¡¼¤È¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¡¦¥½¡¼¥¹¡¦¥³¡¼¥É¤«¤é¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤ò»²¾È¤¹¤ë¤¿¤á¤ËC¥×¥í¥°¥é¥à¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£\fB\&.h\fR¥Õ¥¡¥¤¥ë¤Ï¡¢Âбþ¤¹¤ë¥¯¥é¥¹¤È°ìÃפ¹¤ëÇÛÃÖ¤ò»ý¤Ä\fBstruct\fRÄêµÁ¤ò´Þ¤ß¤Þ¤¹¡£\fBstruct\fR¤Î¥Õ¥£¡¼¥ë¥É¤Ï¡¢¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤ËÂбþ¤·¤Þ¤¹¡£ + .PP +-¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤È¤½¤ÎÃæ¤ÇÀë¸À¤µ¤ì¤ë¹½Â¤ÂΤÎ̾Á°¤Ï¥¯¥é¥¹¤Î̾Á°¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£\fIjavah\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤ÎÃæ¤Ë¤¢¤ë¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë̾¤È¹½Â¤ÂÎ̾¤ÎξÊý¤ÎÀèƬ¤ËÉղ䵤ì¤Þ¤¹¡£²¼Àþ(_)¤¬Ì¾Á°¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤È¤½¤ÎÃæ¤ÇÀë¸À¤µ¤ì¤ë¹½Â¤ÂΤÎ̾Á°¤Ï¥¯¥é¥¹¤Î̾Á°¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£\fBjavah\fR¥³¥Þ¥ó¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹¤¬¥Ñ¥Ã¥±¡¼¥¸¤ÎÃæ¤Ë¤¢¤ë¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ï¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë̾¤È¹½Â¤ÂÎ̾¤ÎξÊý¤ÎÀèƬ¤ËÉղ䵤ì¤Þ¤¹¡£²¼Àþ(_)¤¬Ì¾Á°¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fIjavah\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¥ê¥¹¥È¤µ¤ì¤ë³Æ¥¯¥é¥¹¤Î¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òÃÖ¤­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢\fI\-stubs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£1¤Ä¤Î¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë¡¢¥ê¥¹¥È¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î·ë²Ì¤òÏ¢·ë¤¹¤ë¤Ë¤Ï¡¢\fI\-o\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fBjavah\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ë¥ê¥¹¥È¤µ¤ì¤ë³Æ¥¯¥é¥¹¤Î¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥Õ¥¡¥¤¥ë¤òÃÖ¤­¤Þ¤¹¡£¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¤Ë¤Ï¡¢\fB\-stubs\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£1¤Ä¤Î¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë¡¢¥ê¥¹¥È¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤Î·ë²Ì¤òÏ¢·ë¤¹¤ë¤Ë¤Ï¡¢\fB\-o\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-Java Native Interface (JNI)¤Ï¥Ø¥Ã¥À¡¼¾ðÊó¤Þ¤¿¤Ï¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤òɬÍפȤ·¤Þ¤»¤ó¡£\fIjavah\fR¥³¥Þ¥ó¥É¤Ï°ú¤­Â³¤­JNI·Á¼°¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É¤ËɬÍפʥͥ¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É´Ø¿ô¥×¥í¥È¥¿¥¤¥×¤ÎÀ¸À®¤Ë»ÈÍѤǤ­¤Þ¤¹¡£\fIjavah\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇJNI·Á¼°¤Î½ÐÎϤòÀ¸À®¤·¡¢¤½¤Î·ë²Ì¤ò\fI\&.h\fR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Þ¤¹¡£ ++Java Native Interface (JNI)¤Ï¥Ø¥Ã¥À¡¼¾ðÊó¤Þ¤¿¤Ï¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤òɬÍפȤ·¤Þ¤»¤ó¡£\fBjavah\fR¥³¥Þ¥ó¥É¤Ï°ú¤­Â³¤­JNI·Á¼°¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É¤ËɬÍפʥͥ¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥É´Ø¿ô¥×¥í¥È¥¿¥¤¥×¤ÎÀ¸À®¤Ë»ÈÍѤǤ­¤Þ¤¹¡£\fBjavah\fR¥³¥Þ¥ó¥É¤Ï¥Ç¥Õ¥©¥ë¥È¤ÇJNI·Á¼°¤Î½ÐÎϤòÀ¸À®¤·¡¢¤½¤Î·ë²Ì¤ò\fB\&.h\fR¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-o \fIoutputfile\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¥ê¥¹¥È¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤ËÂФ·¤Æ¡¢·ë²Ì¤Î¥Ø¥Ã¥À¡¼¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÏ¢·ë¤·¤Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Þ¤¹¡£\fI\-o\fR¤Þ¤¿¤Ï\fI\-d\fR¤Î¤É¤Á¤é¤«¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ë¥ê¥¹¥È¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤ËÂФ·¤Æ¡¢·ë²Ì¤Î¥Ø¥Ã¥À¡¼¤Þ¤¿¤Ï¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÏ¢·ë¤·¤Æ½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Þ¤¹¡£\fB\-o\fR¤Þ¤¿¤Ï\fB\-d\fR¤Î¤É¤Á¤é¤«¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-d \fIdirectory\fR + .RS 4 +-\fIjavah\fR¤¬¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤òÊݸ¤¹¤ë¡¢¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£\fI\-d\fR¤Þ¤¿¤Ï\fI\-o\fR¤Î¤É¤Á¤é¤«¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++\fBjavah\fR¤¬¥Ø¥Ã¥À¡¼¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥¹¥¿¥Ö¡¦¥Õ¥¡¥¤¥ë¤òÊݸ¤¹¤ë¡¢¥Ç¥£¥ì¥¯¥È¥ê¤òÀßÄꤷ¤Þ¤¹¡£\fB\-d\fR¤Þ¤¿¤Ï\fB\-o\fR¤Î¤É¤Á¤é¤«¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-stubs + .RS 4 +-\fIjavah\fR¥³¥Þ¥ó¥É¤¬¡¢Java¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Õ¥¡¥¤¥ë¤«¤éCÀë¸À¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBjavah\fR¥³¥Þ¥ó¥É¤¬¡¢Java¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Õ¥¡¥¤¥ë¤«¤éCÀë¸À¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP + \-verbose + .RS 4 +-¾ÜºÙ½ÐÎϤò»ØÄꤷ¡¢ºîÀ®¥Õ¥¡¥¤¥ë¤Î¾õÂ֤˴ؤ¹¤ë¥á¥Ã¥»¡¼¥¸¤ò¡¢\fIjavah\fR¥³¥Þ¥ó¥É¤¬\fIɸ½à½ÐÎÏ\fR¤Ë½ÐÎϤ·¤Þ¤¹¡£ ++¾ÜºÙ½ÐÎϤò»ØÄꤷ¡¢ºîÀ®¥Õ¥¡¥¤¥ë¤Î¾õÂ֤˴ؤ¹¤ë¥á¥Ã¥»¡¼¥¸¤ò¡¢\fBjavah\fR¥³¥Þ¥ó¥É¤¬\fBɸ½à½ÐÎÏ\fR¤Ë½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-help + .RS 4 +-\fIjavah\fR¤Î»ÈÍÑÊýË¡¤Ë¤Ä¤¤¤Æ¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjavah\fR¤Î»ÈÍÑÊýË¡¤Ë¤Ä¤¤¤Æ¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-version + .RS 4 +-\fIjavah\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjavah\fR¥³¥Þ¥ó¥É¤Î¥ê¥ê¡¼¥¹¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-jni + .RS 4 +-JNI·Á¼°¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥Éµ¡Ç½¥×¥í¥È¥¿¥¤¥×¤ò´Þ¤à½ÐÎÏ¥Õ¥¡¥¤¥ë¤ò¡¢\fIjavah\fR¥³¥Þ¥ó¥É¤¬ºîÀ®¤·¤Þ¤¹¡£¤³¤ì¤Ïɸ½à½ÐÎϤǤ¢¤ë¤¿¤á¡¢\fI\-jni\fR¤Î»ÈÍѤϥª¥×¥·¥ç¥ó¤Ç¤¹¡£ ++JNI·Á¼°¤Î¥Í¥¤¥Æ¥£¥Ö¡¦¥á¥½¥Ã¥Éµ¡Ç½¥×¥í¥È¥¿¥¤¥×¤ò´Þ¤à½ÐÎÏ¥Õ¥¡¥¤¥ë¤ò¡¢\fBjavah\fR¥³¥Þ¥ó¥É¤¬ºîÀ®¤·¤Þ¤¹¡£¤³¤ì¤Ïɸ½à½ÐÎϤǤ¢¤ë¤¿¤á¡¢\fB\-jni\fR¤Î»ÈÍѤϥª¥×¥·¥ç¥ó¤Ç¤¹¡£ + .RE + .PP + \-classpath \fIpath\fR + .RS 4 +-¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Ë\fIjavah\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Þ¤¿¤Ï\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤ÎÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ÏOracle Solaris¤Î¾ì¹ç¤Ï¥³¥í¥ó¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£¥Ñ¥¹¤Î°ìÈÌŪ¤Ê·Á¼°¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Ë\fBjavah\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Þ¤¿¤Ï\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤ÎÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ÏOracle Solaris¤Î¾ì¹ç¤Ï¥³¥í¥ó¤Ç¡¢Windows¤Î¾ì¹ç¤Ï¥»¥ß¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£¥Ñ¥¹¤Î°ìÈÌŪ¤Ê·Á¼°¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + \fBOracle Solaris\fR¤Î¾ì¹ç: + .sp + \&.:\fIyour\-path\fR + .sp + Îã: +-\fI\&.:/home/avh/classes:/usr/local/java/classes\fR ++\fB\&.:/home/avh/classes:/usr/local/java/classes\fR + .sp + \fBWindows\fR¤Î¾ì¹ç: + .sp + \&.;\fIyour\-path\fR + .sp + Îã: +-\fI\&.;C:\eusers\edac\eclasses;C:\etools\ejava\eclasses\fR ++\fB\&.;C:\eusers\edac\eclasses;C:\etools\ejava\eclasses\fR + .sp +-Êص¹¾å¡¢*¤Î¥Ù¡¼¥¹Ì¾¤ò´Þ¤à¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁǤϡ¢\fI\&.jar\fR¤Þ¤¿¤Ï\fI\&.JAR\fR¤ò³ÈÄ¥»Ò¤Ë»ý¤Ä¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ ++Êص¹¾å¡¢*¤Î¥Ù¡¼¥¹Ì¾¤ò´Þ¤à¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁǤϡ¢\fB\&.jar\fR¤Þ¤¿¤Ï\fB\&.JAR\fR¤ò³ÈÄ¥»Ò¤Ë»ý¤Ä¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤹ¤ë¤Î¤ÈƱÅù¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢¥Ç¥£¥ì¥¯¥È¥ê\fImydir\fR¤Ë\fIa\&.jar\fR¤È\fIb\&.JAR\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁÇ\fImydir/*\fR¤Ï\fIA\fR\fI\&.jar:b\&.JAR\fR¤ËŸ³«¤µ¤ì¤Þ¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Î½çÈÖ¤Ï̤»ØÄê¤È¤Ê¤ê¤Þ¤¹¡£¤³¤Î¥ê¥¹¥È¤Ë¤Ï¡¢±£¤·¥Õ¥¡¥¤¥ë¤â´Þ¤á¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Þ¤¹¡£*¤«¤é¤Ê¤ë¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥¨¥ó¥È¥ê¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ËŸ³«¤µ¤ì¤Þ¤¹¡£\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤â¡¢ÄêµÁ»þ¤Ë¤ÏƱÍͤËŸ³«¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÎŸ³«¤Ï¡¢Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î³«»ÏÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹¡£Java¥×¥í¥°¥é¥à¤Ï¡¢´Ä¶­¤òÌ䤤¹ç¤»¤ë¾ì¹ç¤ò½ü¤­¡¢Å¸³«¤µ¤ì¤Æ¤¤¤Ê¤¤¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»²¾È¤·¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fISystem\&.getenv("CLASSPATH")\fR¤ò¥³¡¼¥ë¤·¤ÆÌ䤤¹ç¤»¤ë¾ì¹ç¤Ç¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢¥Ç¥£¥ì¥¯¥È¥ê\fBmydir\fR¤Ë\fBa\&.jar\fR¤È\fBb\&.JAR\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥¯¥é¥¹¡¦¥Ñ¥¹Í×ÁÇ\fBmydir/*\fR¤Ï\fBA\fR\fB\&.jar:b\&.JAR\fR¤ËŸ³«¤µ¤ì¤Þ¤¹¤¬¡¢JAR¥Õ¥¡¥¤¥ë¤Î½çÈÖ¤Ï̤»ØÄê¤È¤Ê¤ê¤Þ¤¹¡£¤³¤Î¥ê¥¹¥È¤Ë¤Ï¡¢±£¤·¥Õ¥¡¥¤¥ë¤â´Þ¤á¡¢»ØÄꤵ¤ì¤¿¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤¬´Þ¤Þ¤ì¤Þ¤¹¡£*¤«¤é¤Ê¤ë¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥¨¥ó¥È¥ê¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤ÎJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ËŸ³«¤µ¤ì¤Þ¤¹¡£\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤â¡¢ÄêµÁ»þ¤Ë¤ÏƱÍͤËŸ³«¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Î¥ï¥¤¥ë¥É¥«¡¼¥É¤ÎŸ³«¤Ï¡¢Java Virtual Machine (JVM)¤Î³«»ÏÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹¡£Java¥×¥í¥°¥é¥à¤Ï¡¢´Ä¶­¤òÌ䤤¹ç¤»¤ë¾ì¹ç¤ò½ü¤­¡¢Å¸³«¤µ¤ì¤Æ¤¤¤Ê¤¤¥ï¥¤¥ë¥É¥«¡¼¥É¤ò»²¾È¤·¤Þ¤»¤ó¡£¤¿¤È¤¨¤Ð¡¢\fBSystem\&.getenv("CLASSPATH")\fR¤ò¥³¡¼¥ë¤·¤ÆÌ䤤¹ç¤»¤ë¾ì¹ç¤Ç¤¹¡£ + .RE + .PP + \-bootclasspath \fIpath\fR + .RS 4 +-¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fIjre\elib\ert\&.jar\fR¤ª¤è¤Ó¾¤Î¤¤¤¯¤Ä¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¡¢¥³¥¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£ ++¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fBjre\elib\ert\&.jar\fR¤ª¤è¤Ó¾¤Î¤¤¤¯¤Ä¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¡¢¥³¥¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£ + .RE + .PP + \-old +@@ -157,7 +159,7 @@ + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/javap.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/javap.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: javap +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,8 +21,16 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 +-.TH "javap" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" ++.\" Title: javap ++.\" Language: Japanese ++.\" Date: 2014ǯ8·î8Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 ++.TH "javap" "1" "2014ǯ8·î8Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff + .\" ----------------------------------------------------------------- +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + javap \- 1¤Ä°Ê¾å¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òµÕ¥¢¥»¥ó¥Ö¥ë¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjavap\fR [\fIoptions\fR] \fIclassfile\fR\&.\&.\&. ++\fBjavap\fR [\fIoptions\fR] \fIclassfile\fR\&.\&.\&. + .fi + .if n \{\ + .RE +@@ -64,21 +66,25 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclassfile\fR + .RS 4 +-Ãí¼á¤Î½èÍýÂоݤȤʤ롢¶õÇò¤Ç¶èÀڤä¿1¤Ä°Ê¾å¤Î¥¯¥é¥¹(DocFooter\&.class¤Ê¤É)¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Ç¸¡½Ð¤Ç¤­¤ë¥¯¥é¥¹¤ò¡¢¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤ÏURL(\fIfile:///home/user/myproject/src/DocFooter\&.class\fR¤Ê¤É)¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ ++Ãí¼á¤Î½èÍýÂоݤȤʤ롢¶õÇò¤Ç¶èÀڤä¿1¤Ä°Ê¾å¤Î¥¯¥é¥¹(DocFooter\&.class¤Ê¤É)¡£¥¯¥é¥¹¡¦¥Ñ¥¹¤Ç¸¡½Ð¤Ç¤­¤ë¥¯¥é¥¹¤ò¡¢¥Õ¥¡¥¤¥ë̾¤Þ¤¿¤ÏURL(\fBfile:///home/user/myproject/src/DocFooter\&.class\fR¤Ê¤É)¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjavap\fR¥³¥Þ¥ó¥É¤Ï¡¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òµÕ¥¢¥»¥ó¥Ö¥ë¤·¤Þ¤¹¡£¤½¤Î½ÐÎϤϻØÄꤹ¤ë¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê°Û¤Ê¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fIjavap\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¡¢ÅϤµ¤ì¤¿¥¯¥é¥¹¤Îprotected¤ª¤è¤Ópublic¤Î¥Õ¥£¡¼¥ë¥É¤È¥á¥½¥Ã¥É¤ò½ÐÎϤ·¤Þ¤¹¡£\fIjavap\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î½ÐÎϤò\fIɸ½à½ÐÎÏ\fR¤Ëɽ¼¨¤·¤Þ¤¹¡£ ++\fBjavap\fR¥³¥Þ¥ó¥É¤Ï¡¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òµÕ¥¢¥»¥ó¥Ö¥ë¤·¤Þ¤¹¡£¤½¤Î½ÐÎϤϻØÄꤹ¤ë¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê°Û¤Ê¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fBjavap\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¡¢ÅϤµ¤ì¤¿¥¯¥é¥¹¤Îprotected¤ª¤è¤Ópublic¤Î¥Õ¥£¡¼¥ë¥É¤È¥á¥½¥Ã¥É¤ò½ÐÎϤ·¤Þ¤¹¡£\fBjavap\fR¥³¥Þ¥ó¥É¤Ï¤½¤Î½ÐÎϤò\fBɸ½à½ÐÎÏ\fR¤Ëɽ¼¨¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\-help, \-\-help, \-? ++\-help ++.br ++\-\-help ++.br ++\-? + .RS 4 +-\fIjavap\fR¥³¥Þ¥ó¥É¤Ë¤Ä¤¤¤Æ¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjavap\fR¥³¥Þ¥ó¥É¤Ë¤Ä¤¤¤Æ¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-version +@@ -101,7 +107,9 @@ + protected¤ª¤è¤Ópublic¤Î¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤Î¤ß¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP +-\-private, \-p ++\-private ++.br ++\-p + .RS 4 + ¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤È¥á¥ó¥Ð¡¼¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE +@@ -114,8 +122,9 @@ + .RS 4 + .\} + .nf +-javap \-J\-version +-javap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName ++\fBjavap \-J\-version\fR ++\fBjavap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName\fR ++ + .fi + .if n \{\ + .RE +@@ -135,7 +144,7 @@ + .PP + \-constants + .RS 4 +-\fIstatic final\fRÄê¿ô¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBstatic final\fRÄê¿ô¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-c +@@ -150,135 +159,138 @@ + .PP + \-classpath \fIpath\fR + .RS 4 +-¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Ë\fIjavap\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Þ¤¿¤Ï\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤ÎÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ ++¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Ë\fBjavap\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Þ¤¿¤Ï\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤ÎÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ + .RE + .PP + \-bootclasspath \fIpath\fR + .RS 4 +-¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fIjre/lib/rt\&.jar\fR¤ª¤è¤Ó¾¤Î¤¤¤¯¤Ä¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¡¢¥³¥¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£ ++¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤ò¥í¡¼¥É¤¹¤ë¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥¯¥é¥¹¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fBjre/lib/rt\&.jar\fR¤ª¤è¤Ó¾¤Î¤¤¤¯¤Ä¤«¤ÎJAR¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¡¢¥³¥¢Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£ + .RE + .PP + \-extdir \fIdirs\fR + .RS 4 +-¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤¿³ÈÄ¥µ¡Ç½¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¤Î¥Ç¥Õ¥©¥ë¥È°ÌÃÖ¤Ï\fIjava\&.ext\&.dirs\fR¤Ç¤¹¡£ ++¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤¿³ÈÄ¥µ¡Ç½¤ò¸¡º÷¤¹¤ë¾ì½ê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£³ÈÄ¥µ¡Ç½¤Î¥Ç¥Õ¥©¥ë¥È°ÌÃÖ¤Ï\fBjava\&.ext\&.dirs\fR¤Ç¤¹¡£ + .RE + .SH "Îã" + .PP +-¼¡¤Î\fIDocFooter\fR¥¯¥é¥¹¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¼¡¤Î\fBDocFooter\fR¥¯¥é¥¹¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-import java\&.awt\&.*; +-import java\&.applet\&.*; ++\fBimport java\&.awt\&.*;\fR ++\fBimport java\&.applet\&.*;\fR ++\fB \fR ++\fBpublic class DocFooter extends Applet {\fR ++\fB String date;\fR ++\fB String email;\fR ++\fB \fR ++\fB public void init() {\fR ++\fB resize(500,100);\fR ++\fB date = getParameter("LAST_UPDATED");\fR ++\fB email = getParameter("EMAIL");\fR ++\fB }\fR ++\fB \fR ++\fB public void paint(Graphics g) {\fR ++\fB g\&.drawString(date + " by ",100, 15);\fR ++\fB g\&.drawString(email,290,15);\fR ++\fB }\fR ++\fB}\fR + +-public class DocFooter extends Applet { +- String date; +- String email; +- +- public void init() { +- resize(500,100); +- date = getParameter("LAST_UPDATED"); +- email = getParameter("EMAIL"); +- } +- +- public void paint(Graphics g) { +- g\&.drawString(date + " by ",100, 15); +- g\&.drawString(email,290,15); +- } +-} + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjavap DocFooter\&.class\fR¥³¥Þ¥ó¥É¤«¤é¤Î½ÐÎϤϼ¡¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBjavap DocFooter\&.class\fR¥³¥Þ¥ó¥É¤«¤é¤Î½ÐÎϤϼ¡¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Compiled from "DocFooter\&.java" +-public class DocFooter extends java\&.applet\&.Applet { +- java\&.lang\&.String date; +- java\&.lang\&.String email; +- public DocFooter(); +- public void init(); +- public void paint(java\&.awt\&.Graphics); +-} ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++\fB public DocFooter();\fR ++\fB public void init();\fR ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjavap \-c DocFooter\&.class\fR¥³¥Þ¥ó¥É¤«¤é¤Î½ÐÎϤϼ¡¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fBjavap \-c DocFooter\&.class\fR¥³¥Þ¥ó¥É¤«¤é¤Î½ÐÎϤϼ¡¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Compiled from "DocFooter\&.java" +-public class DocFooter extends java\&.applet\&.Applet { +- java\&.lang\&.String date; +- java\&.lang\&.String email; +- +- public DocFooter(); +- Code: +- 0: aload_0 +- 1: invokespecial #1 // Method +-java/applet/Applet\&."<init>":()V +- 4: return +- +- public void init(); +- Code: +- 0: aload_0 +- 1: sipush 500 +- 4: bipush 100 +- 6: invokevirtual #2 // Method resize:(II)V +- 9: aload_0 +- 10: aload_0 +- 11: ldc #3 // String LAST_UPDATED +- 13: invokevirtual #4 // Method +- getParameter:(Ljava/lang/String;)Ljava/lang/String; +- 16: putfield #5 // Field date:Ljava/lang/String; +- 19: aload_0 +- 20: aload_0 +- 21: ldc #6 // String EMAIL +- 23: invokevirtual #4 // Method +- getParameter:(Ljava/lang/String;)Ljava/lang/String; +- 26: putfield #7 // Field email:Ljava/lang/String; +- 29: return +- +- public void paint(java\&.awt\&.Graphics); +- Code: +- 0: aload_1 +- 1: new #8 // class java/lang/StringBuilder +- 4: dup +- 5: invokespecial #9 // Method +- java/lang/StringBuilder\&."<init>":()V +- 8: aload_0 +- 9: getfield #5 // Field date:Ljava/lang/String; +- 12: invokevirtual #10 // Method +- java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; +- 15: ldc #11 // String by +- 17: invokevirtual #10 // Method +- java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; +- 20: invokevirtual #12 // Method +- java/lang/StringBuilder\&.toString:()Ljava/lang/String; +- 23: bipush 100 +- 25: bipush 15 +- 27: invokevirtual #13 // Method +- java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V +- 30: aload_1 +- 31: aload_0 +- 32: getfield #7 // Field email:Ljava/lang/String; +- 35: sipush 290 +- 38: bipush 15 +- 40: invokevirtual #13 // Method +-java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V +- 43: return +-} ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++ ++\fB public DocFooter();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: invokespecial #1 // Method\fR ++\fBjava/applet/Applet\&."<init>":()V\fR ++\fB 4: return \fR ++ ++\fB public void init();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: sipush 500\fR ++\fB 4: bipush 100\fR ++\fB 6: invokevirtual #2 // Method resize:(II)V\fR ++\fB 9: aload_0 \fR ++\fB 10: aload_0 \fR ++\fB 11: ldc #3 // String LAST_UPDATED\fR ++\fB 13: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 16: putfield #5 // Field date:Ljava/lang/String;\fR ++\fB 19: aload_0 \fR ++\fB 20: aload_0 \fR ++\fB 21: ldc #6 // String EMAIL\fR ++\fB 23: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 26: putfield #7 // Field email:Ljava/lang/String;\fR ++\fB 29: return \fR ++ ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB Code:\fR ++\fB 0: aload_1 \fR ++\fB 1: new #8 // class java/lang/StringBuilder\fR ++\fB 4: dup \fR ++\fB 5: invokespecial #9 // Method\fR ++\fB java/lang/StringBuilder\&."<init>":()V\fR ++\fB 8: aload_0 \fR ++\fB 9: getfield #5 // Field date:Ljava/lang/String;\fR ++\fB 12: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 15: ldc #11 // String by \fR ++\fB 17: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 20: invokevirtual #12 // Method\fR ++\fB java/lang/StringBuilder\&.toString:()Ljava/lang/String;\fR ++\fB 23: bipush 100\fR ++\fB 25: bipush 15\fR ++\fB 27: invokevirtual #13 // Method\fR ++\fB java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 30: aload_1 \fR ++\fB 31: aload_0 \fR ++\fB 32: getfield #7 // Field email:Ljava/lang/String;\fR ++\fB 35: sipush 290\fR ++\fB 38: bipush 15\fR ++\fB 40: invokevirtual #13 // Method\fR ++\fBjava/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 43: return \fR ++\fB}\fR ++ + .fi + .if n \{\ + .RE +@@ -293,6 +305,17 @@ + .sp -1 + .IP \(bu 2.3 + .\} ++java(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javac(1) + .RE + .sp +@@ -304,7 +327,18 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-java(1) ++javadoc(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javah(1) + .RE + .sp + .RS 4 +@@ -326,18 +360,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-javah(1) +-.RE +-.sp +-.RS 4 +-.ie n \{\ +-\h'-04'\(bu\h'+03'\c +-.\} +-.el \{\ +-.sp -1 +-.IP \(bu 2.3 +-.\} +-javadoc(1) ++jdeps(1) + .RE + .br + 'pl 8.5i +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jcmd.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jcmd.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jcmd +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jcmd ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jcmd" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jcmd \- ¼Â¹ÔÃæ¤ÎJava²¾ÁÛ¥Þ¥·¥ó(JVM)¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++jcmd \- ¼Â¹ÔÃæ¤ÎJava Virtual Machine (JVM)¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjcmd\fR [\fI\-l\fR|\fI\-h\fR|\fI\-help\fR] ++\fBjcmd\fR [\fB\-l\fR|\fB\-h\fR|\fB\-help\fR] + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjcmd\fR \fIpid\fR|\fImain\-class\fR \fIPerfCounter\&.print\fR ++\fBjcmd\fR \fIpid\fR|\fImain\-class\fR \fBPerfCounter\&.print\fR + .fi + .if n \{\ + .RE +@@ -76,7 +78,7 @@ + .RS 4 + .\} + .nf +-\fIjcmd\fR \fIpid\fR|\fImain\-class\fR \fI\-f\fR \fIfilename\fR ++\fBjcmd\fR \fIpid\fR|\fImain\-class\fR \fB\-f\fR \fIfilename\fR + .fi + .if n \{\ + .RE +@@ -86,21 +88,21 @@ + .RS 4 + .\} + .nf +-\fIjcmd\fR \fIpid\fR|\fImain\-class\fR \fIcommand\fR[ \fIarguments\fR] ++\fBjcmd\fR \fIpid\fR|\fImain\-class\fR \fIcommand\fR[ \fIarguments\fR] + .fi + .if n \{\ + .RE + .\} + .SH "ÀâÌÀ" + .PP +-\fIjcmd\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¢JVM¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤ì¤ÏJVM¤¬²ÔƯ¤·¤Æ¤¤¤ë¤Î¤ÈƱ¤¸¥Þ¥·¥ó¤Ç»ÈÍѤ·¡¢JVM¤Îµ¯Æ°¤Ë»ÈÍѤ·¤¿¤â¤Î¤ÈƱ¤¸Í­¸ú¥æ¡¼¥¶¡¼¤ª¤è¤Ó¥°¥ë¡¼¥×¼±Ê̻Ҥò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBjcmd\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¢JVM¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤ì¤ÏJVM¤¬²ÔƯ¤·¤Æ¤¤¤ë¤Î¤ÈƱ¤¸¥Þ¥·¥ó¤Ç»ÈÍѤ·¡¢JVM¤Îµ¯Æ°¤Ë»ÈÍѤ·¤¿¤â¤Î¤ÈƱ¤¸Í­¸ú¥æ¡¼¥¶¡¼¤ª¤è¤Ó¥°¥ë¡¼¥×¼±Ê̻Ҥò»ý¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¥ê¥â¡¼¥È¡¦¥Þ¥·¥ó¤«¤é¡¢¤Þ¤¿¤ÏÊ̤μ±Ê̻ҤǿÇÃÇ¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢\fIcom\&.sun\&.management\&.DiagnosticCommandMBean\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ÈÍѤǤ­¤Þ¤¹¡£\fIDiagnosticCommandMBean\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ÜºÙ¤Ï¡¢http://download\&.java\&.net/jdk8/docs/jre/api/management/extension/com/sun/management/DiagnosticCommandMBean\&.html¤Ë¤¢¤ëAPI¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ê¥â¡¼¥È¡¦¥Þ¥·¥ó¤«¤é¡¢¤Þ¤¿¤ÏÊ̤μ±Ê̻ҤǿÇÃÇ¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢\fBcom\&.sun\&.management\&.DiagnosticCommandMBean\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ÈÍѤǤ­¤Þ¤¹¡£\fBDiagnosticCommandMBean\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/jre/api/management/extension/com/sun/management/DiagnosticCommandMBean\&.html¤Ë¤¢¤ëAPI¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIjcmd\fR¤ò°ú¿ô¤Ê¤·¤Þ¤¿¤Ï\fI\- l\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¼Â¹Ô¤·¤¿¾ì¹ç¤Ï¡¢¼Â¹ÔÃæ¤ÎJava¥×¥í¥»¥¹¼±Ê̻ҤΥꥹ¥È¤¬¡¢¥á¥¤¥ó¡¦¥¯¥é¥¹¤ª¤è¤Ó¥×¥í¥»¥¹¤Îµ¯Æ°¤Ë»ÈÍѤµ¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤È¤È¤â¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-h\fR¤Þ¤¿¤Ï\fI\-help\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ\fIjcmd\fR¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ä¡¼¥ë¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fBjcmd\fR¤ò°ú¿ô¤Ê¤·¤Þ¤¿¤Ï\fB\- l\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¼Â¹Ô¤·¤¿¾ì¹ç¤Ï¡¢¼Â¹ÔÃæ¤ÎJava¥×¥í¥»¥¹¼±Ê̻ҤΥꥹ¥È¤¬¡¢¥á¥¤¥ó¡¦¥¯¥é¥¹¤ª¤è¤Ó¥×¥í¥»¥¹¤Îµ¯Æ°¤Ë»ÈÍѤµ¤ì¤¿¥³¥Þ¥ó¥É¹Ô°ú¿ô¤È¤È¤â¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-h\fR¤Þ¤¿¤Ï\fB\-help\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ\fBjcmd\fR¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ä¡¼¥ë¤Î¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .PP +-¥×¥í¥»¥¹¼±ÊÌ»Ò(\fIpid\fR)¤Þ¤¿¤Ï¥á¥¤¥ó¡¦¥¯¥é¥¹(\fImain\-class\fR)¤òºÇ½é¤Î°ú¿ô¤È¤·¤Æ»ØÄꤷ¤¿¾ì¹ç¡¢\fIjcmd\fR¤Ï¡¢¼±Ê̻Ҥò»ØÄꤷ¤¿¾ì¹ç¤ÏJava¥×¥í¥»¥¹¤Ë¡¢¥á¥¤¥ó¡¦¥¯¥é¥¹¤Î̾Á°¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¤¹¤Ù¤Æ¤ÎJava¥×¥í¥»¥¹¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤¹¡£¥×¥í¥»¥¹¼±Ê̻ҤȤ·¤Æ\fI0\fR¤ò»ØÄꤷ¤Æ¡¢¤¹¤Ù¤Æ¤Î»ÈÍѲÄǽ¤ÊJava¥×¥í¥»¥¹¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤È¤·¤Æ¡¢¼¡¤Î¤¤¤º¤ì¤«¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥×¥í¥»¥¹¼±ÊÌ»Ò(\fIpid\fR)¤Þ¤¿¤Ï¥á¥¤¥ó¡¦¥¯¥é¥¹(\fImain\-class\fR)¤òºÇ½é¤Î°ú¿ô¤È¤·¤Æ»ØÄꤷ¤¿¾ì¹ç¡¢\fBjcmd\fR¤Ï¡¢¼±Ê̻Ҥò»ØÄꤷ¤¿¾ì¹ç¤ÏJava¥×¥í¥»¥¹¤Ë¡¢¥á¥¤¥ó¡¦¥¯¥é¥¹¤Î̾Á°¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¤¹¤Ù¤Æ¤ÎJava¥×¥í¥»¥¹¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤Þ¤¹¡£¥×¥í¥»¥¹¼±Ê̻ҤȤ·¤Æ\fB0\fR¤ò»ØÄꤷ¤Æ¡¢¤¹¤Ù¤Æ¤Î»ÈÍѲÄǽ¤ÊJava¥×¥í¥»¥¹¤Ë¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¿ÇÃÇ¥³¥Þ¥ó¥É¡¦¥ê¥¯¥¨¥¹¥È¤È¤·¤Æ¡¢¼¡¤Î¤¤¤º¤ì¤«¤ò»ÈÍѤ·¤Þ¤¹¡£ + .PP + Perfcounter\&.print + .RS 4 +@@ -109,15 +111,15 @@ + .PP + \-f \fIfilename\fR + .RS 4 +-¿ÇÃÇ¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¡¢»ØÄꤷ¤¿Java¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¡£\fI\-f\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î¤ß»ÈÍѤ·¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥³¥Þ¥ó¥É¤Ï¡¢1¹Ô¤Çµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Èֹ浭¹æ(\fI#\fR)¤Ç»Ï¤Þ¤ë¹Ô¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤«¡¢\fIstop\fR¥­¡¼¥ï¡¼¥É¤ò´Þ¤à¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Î½èÍý¤¬½ªÎ»¤·¤Þ¤¹¡£ ++¿ÇÃÇ¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¡¢»ØÄꤷ¤¿Java¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¥Õ¥¡¥¤¥ë¤Î̾Á°¡£\fB\-f\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î¤ß»ÈÍѤ·¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥³¥Þ¥ó¥É¤Ï¡¢1¹Ô¤Çµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Èֹ浭¹æ(\fB#\fR)¤Ç»Ï¤Þ¤ë¹Ô¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤«¡¢\fBstop\fR¥­¡¼¥ï¡¼¥É¤ò´Þ¤à¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Î½èÍý¤¬½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP + \fIcommand\fR [\fIarguments\fR] + .RS 4 +-»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¥³¥Þ¥ó¥É¡£»ØÄꤷ¤¿¥×¥í¥»¥¹¤Ç»ÈÍѤǤ­¤ë¿ÇÃÇ¥³¥Þ¥ó¥É¤Î¥ê¥¹¥È¤Ï¡¢¤³¤Î¥×¥í¥»¥¹¤ËÂФ·¤Æ\fIhelp\fR¥³¥Þ¥ó¥É¤òÁ÷¿®¤¹¤ì¤Ðɽ¼¨¤µ¤ì¤Þ¤¹¡£³Æ¿ÇÃÇ¥³¥Þ¥ó¥É¤ËÆȼ«¤Î°ú¿ô¥»¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¤ÎÀâÌÀ¡¢¹½Ê¸¤ª¤è¤Ó»ÈÍѲÄǽ¤Ê°ú¿ô¤Î¥ê¥¹¥È¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢\fIhelp\fR¥³¥Þ¥ó¥É¤Î°ú¿ô¤È¤·¤Æ¥³¥Þ¥ó¥É̾¤ò»ÈÍѤ·¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¤ËÁ÷¿®¤¹¤ë¥³¥Þ¥ó¥É¡£»ØÄꤷ¤¿¥×¥í¥»¥¹¤Ç»ÈÍѤǤ­¤ë¿ÇÃÇ¥³¥Þ¥ó¥É¤Î¥ê¥¹¥È¤Ï¡¢¤³¤Î¥×¥í¥»¥¹¤ËÂФ·¤Æ\fBhelp\fR¥³¥Þ¥ó¥É¤òÁ÷¿®¤¹¤ì¤Ðɽ¼¨¤µ¤ì¤Þ¤¹¡£³Æ¿ÇÃÇ¥³¥Þ¥ó¥É¤ËÆȼ«¤Î°ú¿ô¥»¥Ã¥È¤¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¤ÎÀâÌÀ¡¢¹½Ê¸¤ª¤è¤Ó»ÈÍѲÄǽ¤Ê°ú¿ô¤Î¥ê¥¹¥È¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢\fBhelp\fR¥³¥Þ¥ó¥É¤Î°ú¿ô¤È¤·¤Æ¥³¥Þ¥ó¥É̾¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR +-°ú¿ô¤Ë¥¹¥Ú¡¼¥¹¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°ì½Å°úÍÑÉä¤Þ¤¿¤ÏÆó½Å°úÍÑÉä(\fI\*(Aq\fR¤Þ¤¿¤Ï\fI"\fR)¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£²Ã¤¨¤Æ¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥·¥§¥ë¤¬°úÍÑÉä¤ò½èÍý¤·¤Ê¤¤¤è¤¦¤Ë¡¢¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\fI\e\fR)¤Ç°ì½Å°úÍÑÉä¤Þ¤¿¤ÏÆó½Å°úÍÑÉä¤ò¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¤³¤ì¤é¤Î°ú¿ô¤ò°ì½Å°úÍÑÉä¤Ç°Ï¤ó¤Ç¤«¤é¡¢Æó½Å°úÍÑÉä¤Ç°Ï¤à¤³¤È¤â¤Ç¤­¤Þ¤¹(¤Þ¤¿¤ÏÆó½Å°úÍÑÉä¤Ç°Ï¤ó¤Ç¤«¤é¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤à)¡£ ++°ú¿ô¤Ë¥¹¥Ú¡¼¥¹¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°ì½Å°úÍÑÉä¤Þ¤¿¤ÏÆó½Å°úÍÑÉä(\fB\*(Aq\fR¤Þ¤¿¤Ï\fB"\fR)¤Ç°Ï¤àɬÍפ¬¤¢¤ê¤Þ¤¹¡£²Ã¤¨¤Æ¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥·¥§¥ë¤¬°úÍÑÉä¤ò½èÍý¤·¤Ê¤¤¤è¤¦¤Ë¡¢¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\fB\e\fR)¤Ç°ì½Å°úÍÑÉä¤Þ¤¿¤ÏÆó½Å°úÍÑÉä¤ò¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¤³¤ì¤é¤Î°ú¿ô¤ò°ì½Å°úÍÑÉä¤Ç°Ï¤ó¤Ç¤«¤é¡¢Æó½Å°úÍÑÉä¤Ç°Ï¤à¤³¤È¤â¤Ç¤­¤Þ¤¹(¤Þ¤¿¤ÏÆó½Å°úÍÑÉä¤Ç°Ï¤ó¤Ç¤«¤é¡¢°ì½Å°úÍÑÉä¤Ç°Ï¤à)¡£ + .RE + .SH "¥ª¥×¥·¥ç¥ó" + .PP +@@ -125,17 +127,19 @@ + .PP + \-f \fIfilename\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤«¤é¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ºÇ½é¤Î°ú¿ô¤È¤·¤Æ¥×¥í¥»¥¹¼±Ê̻Ҥޤ¿¤Ï¥á¥¤¥ó¡¦¥¯¥é¥¹¤ò»ØÄꤹ¤ë¾ì¹ç¤Ë¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥³¥Þ¥ó¥É¤Ï¡¢1¹Ô¤Çµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Èֹ浭¹æ(\fI#\fR)¤Ç»Ï¤Þ¤ë¹Ô¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤«¡¢\fIstop\fR¥­¡¼¥ï¡¼¥É¤ò´Þ¤à¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Î½èÍý¤¬½ªÎ»¤·¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤«¤é¥³¥Þ¥ó¥É¤òÆɤ߼è¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ºÇ½é¤Î°ú¿ô¤È¤·¤Æ¥×¥í¥»¥¹¼±Ê̻Ҥޤ¿¤Ï¥á¥¤¥ó¡¦¥¯¥é¥¹¤ò»ØÄꤹ¤ë¾ì¹ç¤Ë¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£¥Õ¥¡¥¤¥ëÆâ¤Î³Æ¥³¥Þ¥ó¥É¤Ï¡¢1¹Ô¤Çµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Èֹ浭¹æ(\fB#\fR)¤Ç»Ï¤Þ¤ë¹Ô¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤«¡¢\fBstop\fR¥­¡¼¥ï¡¼¥É¤ò´Þ¤à¹Ô¤¬Æɤ߼è¤é¤ì¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤Î½èÍý¤¬½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP +-\-h, \-help ++\-h ++.br ++\-help + .RS 4 + ¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \-l + .RS 4 +-¼Â¹ÔÃæ¤ÎJava¥×¥í¥»¥¹¼±Ê̻ҤΥꥹ¥È¤ò¥á¥¤¥ó¡¦¥¯¥é¥¹¤ª¤è¤Ó¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£ ++¼Â¹ÔÃæ¤ÎJava¥×¥í¥»¥¹¼±Ê̻ҤΥꥹ¥È¤ò¥á¥¤¥ó¡¦¥¯¥é¥¹¤ª¤è¤Ó¥³¥Þ¥ó¥É¹Ô°ú¿ô¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jconsole.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jconsole.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jconsole +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jconsole ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jconsole" "1" "2013ǯ11·î21Æü" "JDK 8" "Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jconsole \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò´Æ»ë¤ª¤è¤Ó´ÉÍý¤¹¤ë¤¿¤á¤Î¥°¥é¥Õ¥£¥«¥ë¡¦¥³¥ó¥½¡¼¥ë¤ò³«»Ï¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++jconsole \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¥â¥Ë¥¿¡¼¤ª¤è¤Ó´ÉÍý¤¹¤ë¤¿¤á¤Î¥°¥é¥Õ¥£¥«¥ë¡¦¥³¥ó¥½¡¼¥ë¤ò³«»Ï¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjconsole\fR [ \fIoptions\fR ] [ connection \&.\&.\&. ] ++\fBjconsole\fR [ \fIoptions\fR ] [ connection \&.\&.\&. ] + .fi + .if n \{\ + .RE +@@ -64,24 +66,24 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + connection = \fIpid\fR | \fIhost\fR:\fIport\fR | \fIjmxURL\fR + .RS 4 +-\fIpid\fRÃÍ¤Ï¥í¡¼¥«¥ë¤ÎJava²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î¥×¥í¥»¥¹ID¤Ç¤¹¡£JVM¤Ï\fIjconsole\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¥æ¡¼¥¶¡¼ID¤ÈƱ¤¸¥æ¡¼¥¶¡¼ID¤Ç¼Â¹Ô¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIhost:port\fRÃͤÏJVM¤¬Æ°ºî¤·¤Æ¤¤¤ë¥Û¥¹¥È¡¦¥·¥¹¥Æ¥à¤Î̾Á°¤È¡¢JVM¤¬³«»Ï¤·¤¿¤È¤­¤Ë¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£\fIcom\&.sun\&.management\&.jmxremote\&.port\fR¤Ç»ØÄꤷ¤¿¥Ý¡¼¥ÈÈÖ¹æ¤Ç¤¹¡£\fIjmxUrl\fRÃͤϡ¢JMXServiceURL¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¡¢Àܳ¤µ¤ì¤ëJMX¥¨¡¼¥¸¥§¥ó¥È¤Î¥¢¥É¥ì¥¹¤Ç¤¹¡£ ++\fBpid\fRÃÍ¤Ï¥í¡¼¥«¥ë¤ÎJava Virtual Machine (JVM)¤Î¥×¥í¥»¥¹ID¤Ç¤¹¡£JVM¤Ï\fBjconsole\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¥æ¡¼¥¶¡¼ID¤ÈƱ¤¸¥æ¡¼¥¶¡¼ID¤Ç¼Â¹Ô¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBhost:port\fRÃͤÏJVM¤¬Æ°ºî¤·¤Æ¤¤¤ë¥Û¥¹¥È¡¦¥·¥¹¥Æ¥à¤Î̾Á°¤È¡¢JVM¤¬³«»Ï¤·¤¿¤È¤­¤Ë¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£\fBcom\&.sun\&.management\&.jmxremote\&.port\fR¤Ç»ØÄꤷ¤¿¥Ý¡¼¥ÈÈÖ¹æ¤Ç¤¹¡£\fBjmxUrl\fRÃͤϡ¢JMXServiceURL¤Çµ­½Ò¤µ¤ì¤Æ¤¤¤ë¡¢Àܳ¤µ¤ì¤ëJMX¥¨¡¼¥¸¥§¥ó¥È¤Î¥¢¥É¥ì¥¹¤Ç¤¹¡£ + .sp +-\fIconnection\fR¥Ñ¥é¥á¡¼¥¿¤Î¾ÜºÙ¤Ï¡¢JMX¥Æ¥¯¥Î¥í¥¸¤ò»ÈÍѤ·¤¿¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý ++\fBconnection\fR¥Ñ¥é¥á¡¼¥¿¤Î¾ÜºÙ¤Ï¡¢JMX¥Æ¥¯¥Î¥í¥¸¤ò»ÈÍѤ·¤¿¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/management/agent\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fIJMXServiceURL\fR¥¯¥é¥¹¤ÎÀâÌÀ( ++\fBJMXServiceURL\fR¥¯¥é¥¹¤ÎÀâÌÀ( + http://docs\&.oracle\&.com/javase/8/docs/api/javax/management/remote/JMXServiceURL\&.html)¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjconsole\fR¥³¥Þ¥ó¥É¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Þ¥·¥ó¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Þ¥·¥ó¾å¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤È²¾ÁÛ¥Þ¥·¥ó¤Î´Æ»ë¤È´ÉÍý¤ò¹Ô¤¦¥°¥é¥Õ¥£¥«¥ë¡¦¥³¥ó¥½¡¼¥ë¡¦¥Ä¡¼¥ë¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBjconsole\fR¥³¥Þ¥ó¥É¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Þ¥·¥ó¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Þ¥·¥ó¾å¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤È²¾ÁÛ¥Þ¥·¥ó¤ò¥â¥Ë¥¿¡¼¤ª¤è¤Ó´ÉÍý¤¹¤ë¥°¥é¥Õ¥£¥«¥ë¡¦¥³¥ó¥½¡¼¥ë¡¦¥Ä¡¼¥ë¤òµ¯Æ°¤·¤Þ¤¹¡£ + .PP +-Windows¾å¤Ç¤Ï¡¢\fIjconsole\fR¥³¥Þ¥ó¥É¤Ï¥³¥ó¥½¡¼¥ë¡¦¥¦¥£¥ó¥É¥¦¤È´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤¿¤À¤·¡¢\fIjconsole\fR¥³¥Þ¥ó¥É¤¬¼ºÇÔ¤¹¤ë¤È¡¢¥¨¥é¡¼¾ðÊó¤ò¼¨¤¹¥À¥¤¥¢¥í¥°¡¦¥Ü¥Ã¥¯¥¹¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++Windows¾å¤Ç¤Ï¡¢\fBjconsole\fR¥³¥Þ¥ó¥É¤Ï¥³¥ó¥½¡¼¥ë¡¦¥¦¥£¥ó¥É¥¦¤È´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤Þ¤»¤ó¡£¤¿¤À¤·¡¢\fBjconsole\fR¥³¥Þ¥ó¥É¤¬¼ºÇÔ¤¹¤ë¤È¡¢¥¨¥é¡¼¾ðÊó¤ò¼¨¤¹¥À¥¤¥¢¥í¥°¡¦¥Ü¥Ã¥¯¥¹¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-interval\fI=n\fR +@@ -91,12 +93,12 @@ + .PP + \-notile + .RS 4 +-ºÇ½é¤Ë¥¦¥£¥ó¥É¥¦¤ò¥¿¥¤¥ê¥ó¥°¤·¤Þ¤»¤ó(Ê£¿ôÀܳ¤Î¾ì¹ç)¡£ ++ºÇ½é¤Ï¥¦¥£¥ó¥É¥¦¤ò¥¿¥¤¥ëɽ¼¨¤·¤Þ¤»¤ó(Ê£¿ôÀܳ¤Î¾ì¹ç)¡£ + .RE + .PP + \-pluginpath \fIplugins\fR + .RS 4 +-\fIJConsole\fR¥×¥é¥°¥¤¥ó¤ò¸¡º÷¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fIplugins\fR¥Ñ¥¹¤Ë¤Ï\fIMETA\-INF/services/com\&.sun\&.tools\&.jconsole\&.JConsolePlugin\fR¤È¤¤¤¦Ì¾Á°¤Î¥×¥í¥Ð¥¤¥À¹½À®¥Õ¥¡¥¤¥ë¤ò´Þ¤ó¤Ç¤¤¤ëɬÍפ¬¤¢¤ê¡¢¤³¤ì¤Ë¤Ï¥×¥é¥°¥¤¥ó¤´¤È¤Ë1¹Ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤Î¹Ô¤Ï\fIcom\&.sun\&.tools\&.jconsole\&.JConsolePlugin\fR¥¯¥é¥¹¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Î´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBJConsole\fR¥×¥é¥°¥¤¥ó¤ò¸¡º÷¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£\fIplugins\fR¥Ñ¥¹¤Ë¤Ï\fBMETA\-INF/services/com\&.sun\&.tools\&.jconsole\&.JConsolePlugin\fR¤È¤¤¤¦Ì¾Á°¤Î¥×¥í¥Ð¥¤¥À¹½À®¥Õ¥¡¥¤¥ë¤ò´Þ¤ó¤Ç¤¤¤ëɬÍפ¬¤¢¤ê¡¢¤³¤ì¤Ë¤Ï¥×¥é¥°¥¤¥ó¤´¤È¤Ë1¹Ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤Î¹Ô¤Ï\fBcom\&.sun\&.tools\&.jconsole\&.JConsolePlugin\fR¥¯¥é¥¹¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Î´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-version +@@ -111,7 +113,7 @@ + .PP + \-J\fIflag\fR + .RS 4 +-\fIjconsole\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿JVM¤Ë\fIflag\fR¤òÅϤ·¤Þ¤¹¡£ ++\fBjconsole\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿JVM¤Ë\fBflag\fR¤òÅϤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +@@ -148,7 +150,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIJMXServiceURL\fR¥¯¥é¥¹¤ÎÀâÌÀ( ++\fBJMXServiceURL\fR¥¯¥é¥¹¤ÎÀâÌÀ( + http://docs\&.oracle\&.com/javase/8/docs/api/javax/management/remote/JMXServiceURL\&.html) + .RE + .br +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jdb.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jdb.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jdb +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jdb ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jdb" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jdb \- Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥×¥í¥°¥é¥à¤ÎÉÔ¶ñ¹ç¤ò¸¡½Ð¤ª¤è¤Ó½¤Àµ¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++jdb \- Java¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥×¥í¥°¥é¥à¤Îbug¤ò¸¡½Ð¤ª¤è¤Ó½¤Àµ¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjdb\fR [\fIoptions\fR] [\fIclassname\fR] [\fIarguments\fR] ++\fBjdb\fR [\fIoptions\fR] [\fIclassname\fR] [\fIarguments\fR] + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclass\fRname +@@ -74,67 +76,70 @@ + .PP + \fIarguments\fR + .RS 4 +-class¤Î\fImain()\fR¥á¥½¥Ã¥É¤ËÅϤ¹°ú¿ô¡£ ++class¤Î\fBmain()\fR¥á¥½¥Ã¥É¤ËÅϤ¹°ú¿ô¡£ + .RE + .SH "ÀâÌÀ" + .PP +-Java¥Ç¥Ð¥Ã¥¬(JDB)¤Ï¡¢Java¥¯¥é¥¹ÍѤδÊñ¤Ê¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ç¥Ð¥Ã¥¬¤Ç¤¹¡£\fIjdb\fR¥³¥Þ¥ó¥É¤È¤½¤Î¥ª¥×¥·¥ç¥ó¤ÏJDB¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢JDBA (Java Platform Debugger Architecture)¤ò»ë³ÐŪ¤Ë¼Â¹Ô¤·¡¢¥í¡¼¥«¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¤ÎJava²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î¸¡ºº¤È¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£Java Platform Debugger Architecture (JDBA) ++Java¥Ç¥Ð¥Ã¥¬(JDB)¤Ï¡¢Java¥¯¥é¥¹ÍѤδÊñ¤Ê¥³¥Þ¥ó¥É¹Ô¥Ç¥Ð¥Ã¥¬¤Ç¤¹¡£\fBjdb\fR¥³¥Þ¥ó¥É¤È¤½¤Î¥ª¥×¥·¥ç¥ó¤ÏJDB¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢JDBA (Java Platform Debugger Architecture)¤ò»ë³ÐŪ¤Ë¼Â¹Ô¤·¡¢¥í¡¼¥«¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¤ÎJava Virtual Machine (JVM)¤Î¸¡ºº¤È¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£Java Platform Debugger Architecture (JDBA) + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jpda/index\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "JDB¥»¥Ã¥·¥ç¥ó¤Î³«»Ï" + .PP +-JDB¥»¥Ã¥·¥ç¥ó¤ò³«»Ï¤¹¤ë¤Ë¤ÏÍÍ¡¹¤ÊÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ºÇ¤âÉÑÈˤ˻ÈÍѤµ¤ì¤ë¤Î¤Ï¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥¤¥ó¡¦¥¯¥é¥¹¤ò»ÈÍѤ·¤Æ¡¢JDB¤«¤é¿·¤·¤¤JVM¤òµ¯Æ°¤¹¤ëÊýË¡¤Ç¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¡¢\fIjava\fR¥³¥Þ¥ó¥É¤Î¤«¤ï¤ê¤Ë\fIjdb\fR¥³¥Þ¥ó¥É¤òÆþÎϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥¤¥ó¡¦¥¯¥é¥¹¤¬\fIMyClass\fR¤Î¾ì¹ç¤Ï¡¢JDB´Ä¶­¤Ç¥Ç¥Ð¥Ã¥°¤¹¤ë¤È¤­¤Ë¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++JDB¥»¥Ã¥·¥ç¥ó¤ò³«»Ï¤¹¤ë¤Ë¤ÏÍÍ¡¹¤ÊÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ºÇ¤âÉÑÈˤ˻ÈÍѤµ¤ì¤ë¤Î¤Ï¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥¤¥ó¡¦¥¯¥é¥¹¤ò»ÈÍѤ·¤Æ¡¢JDB¤«¤é¿·¤·¤¤JVM¤òµ¯Æ°¤¹¤ëÊýË¡¤Ç¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¡¢\fBjava\fR¥³¥Þ¥ó¥É¤Î¤«¤ï¤ê¤Ë\fBjdb\fR¥³¥Þ¥ó¥É¤òÆþÎϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥¤¥ó¡¦¥¯¥é¥¹¤¬\fBMyClass\fR¤Î¾ì¹ç¤Ï¡¢JDB´Ä¶­¤Ç¥Ç¥Ð¥Ã¥°¤¹¤ë¤È¤­¤Ë¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jdb MyClass ++\fBjdb MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÊýË¡¤Çµ¯Æ°¤¹¤ë¤È¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ2¤ÄÌܤÎJVM¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¼¡¤Ë¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤ò¥í¡¼¥É¤·¤Æ¡¢¥¯¥é¥¹¤ÎºÇ½é¤ÎÌ¿Îá¤ò¼Â¹Ô¤¹¤ëÁ°¤ËJVM¤òÄä»ß¤µ¤»¤Þ¤¹¡£ ++¤³¤ÎÊýË¡¤Çµ¯Æ°¤¹¤ë¤È¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ2¤ÄÌܤÎJVM¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¼¡¤Ë¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤ò¥í¡¼¥É¤·¤Æ¡¢¥¯¥é¥¹¤ÎºÇ½é¤ÎÌ¿Îá¤ò¼Â¹Ô¤¹¤ëÁ°¤ËJVM¤òÄä»ß¤µ¤»¤Þ¤¹¡£ + .PP +-\fIjdb\fR¥³¥Þ¥ó¥É¤Î¤â¤¦1¤Ä¤Î»ÈÍÑÊýË¡¤Ï¡¢¤¹¤Ç¤Ë¼Â¹ÔÃæ¤ÎJVM¤Ëjdb¤òÀܳ¤¹¤ë¤³¤È¤Ç¤¹¡£\fIjdb\fR¥³¥Þ¥ó¥É¤¬Àܳ¤¹¤ëVM¤ò¡¢¤½¤Î¼Â¹ÔÃæ¤Ëµ¯Æ°¤¹¤ë¤¿¤á¤Î¹½Ê¸¤ò¼¡¤Ë¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥¤¥ó¥×¥í¥»¥¹¡¦¥Ç¥Ð¥Ã¥°Íѥ饤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¡¢Àܳ¤Î¼ïÎà¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBjdb\fR¥³¥Þ¥ó¥É¤Î¤â¤¦1¤Ä¤Î»ÈÍÑÊýË¡¤Ï¡¢¤¹¤Ç¤Ë¼Â¹ÔÃæ¤ÎJVM¤Ëjdb¤òÀܳ¤¹¤ë¤³¤È¤Ç¤¹¡£\fBjdb\fR¥³¥Þ¥ó¥É¤¬Àܳ¤¹¤ëVM¤ò¡¢¤½¤Î¼Â¹ÔÃæ¤Ëµ¯Æ°¤¹¤ë¤¿¤á¤Î¹½Ê¸¤ò¼¡¤Ë¼¨¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥¤¥ó¥×¥í¥»¥¹¡¦¥Ç¥Ð¥Ã¥°Íѥ饤¥Ö¥é¥ê¤ò¥í¡¼¥É¤·¡¢Àܳ¤Î¼ïÎà¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java \-agentlib:jdwp=transport=dt_socket,server=y,suspend=n MyClass ++\fBjava \-agentlib:jdwp=transport=dt_socket,server=y,suspend=n MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤òJVM¤ËÀܳ¤Ç¤­¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤òJVM¤ËÀܳ¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jdb \-attach 8000 ++\fBjdb \-attach 8000\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤Î¾ì¹ç¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¿·¤·¤¤JVM¤òµ¯Æ°¤¹¤ë¤«¤ï¤ê¤Ë´û¸¤ÎJVM¤ËÀܳ¤µ¤ì¤ë¤¿¤á¡¢\fIjdb\fR¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë\fIMyClass\fR°ú¿ô¤Ï»ØÄꤷ¤Þ¤»¤ó¡£ ++¤³¤Î¾ì¹ç¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¿·¤·¤¤JVM¤òµ¯Æ°¤¹¤ë¤«¤ï¤ê¤Ë´û¸¤ÎJVM¤ËÀܳ¤µ¤ì¤ë¤¿¤á¡¢\fBjdb\fR¥³¥Þ¥ó¥É¹Ô¤Ë\fBMyClass\fR°ú¿ô¤Ï»ØÄꤷ¤Þ¤»¤ó¡£ + .PP +-¥Ç¥Ð¥Ã¥¬¤òJVM¤ËÀܳ¤¹¤ë¤Ë¤Ï¾¤Ë¤âÍÍ¡¹¤ÊÊýË¡¤¬¤¢¤ê¡¢¤¹¤Ù¤Æ\fIjdb\fR¥³¥Þ¥ó¥É¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Àܳ¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢Java Platform Debugger Architecture¤Î¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ç¥Ð¥Ã¥¬¤òJVM¤ËÀܳ¤¹¤ë¤Ë¤Ï¾¤Ë¤âÍÍ¡¹¤ÊÊýË¡¤¬¤¢¤ê¡¢¤¹¤Ù¤Æ\fBjdb\fR¥³¥Þ¥ó¥É¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Àܳ¥ª¥×¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢Java Platform Debugger Architecture¤Î¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SS "´ðËÜjdb¥³¥Þ¥ó¥É" + .PP +-´ðËÜŪ¤Ê\fIjdb\fR¥³¥Þ¥ó¥É¤Î°ìÍ÷¤ò¼¨¤·¤Þ¤¹¡£JDB¤¬¥µ¥Ý¡¼¥È¤¹¤ë¥³¥Þ¥ó¥É¤Ï¤³¤ì°Ê³°¤Ë¤â¤¢¤ê¡¢¤½¤ì¤é¤Ï\fI\-help\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æɽ¼¨¤Ç¤­¤Þ¤¹¡£ ++´ðËÜŪ¤Ê\fBjdb\fR¥³¥Þ¥ó¥É¤Î°ìÍ÷¤ò¼¨¤·¤Þ¤¹¡£JDB¤¬¥µ¥Ý¡¼¥È¤¹¤ë¥³¥Þ¥ó¥É¤Ï¤³¤ì°Ê³°¤Ë¤â¤¢¤ê¡¢¤½¤ì¤é¤Ï\fB\-help\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æɽ¼¨¤Ç¤­¤Þ¤¹¡£ + .PP + help¤Þ¤¿¤Ï? + .RS 4 +-\fIhelp\fR¤Þ¤¿¤Ï\fI?\fR¥³¥Þ¥ó¥É¤Ï¡¢Ç§¼±¤µ¤ì¤¿¥³¥Þ¥ó¥É¤Î¥ê¥¹¥È¤Ë´Ê·é¤ÊÀâÌÀ¤òÉÕ¤±¤Æɽ¼¨¤·¤Þ¤¹¡£ ++\fBhelp\fR¤Þ¤¿¤Ï\fB?\fR¥³¥Þ¥ó¥É¤Ï¡¢Ç§¼±¤µ¤ì¤¿¥³¥Þ¥ó¥É¤Î¥ê¥¹¥È¤Ë´Ê·é¤ÊÀâÌÀ¤òÉÕ¤±¤Æɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + run + .RS 4 +-JDB¤òµ¯Æ°¤·¤Æ¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤¿¤¢¤È¤Ë¡¢\fIrun\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤ò³«»Ï¤Ç¤­¤Þ¤¹¡£\fIrun\fR¥³¥Þ¥ó¥É¤Ï¡¢´û¸¤ÎVM¤ËÀܳ¤·¤Æ¤¤¤ë¾ì¹ç¤È¤Ï°Û¤Ê¤ê¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬\fIjdb\fR¤«¤éµ¯Æ°¤·¤¿¤È¤­¤Ë¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ ++JDB¤òµ¯Æ°¤·¤Æ¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤¿¤¢¤È¤Ë¡¢\fBrun\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¼Â¹Ô¤ò³«»Ï¤Ç¤­¤Þ¤¹¡£\fBrun\fR¥³¥Þ¥ó¥É¤Ï¡¢´û¸¤ÎVM¤ËÀܳ¤·¤Æ¤¤¤ë¾ì¹ç¤È¤Ï°Û¤Ê¤ê¡¢¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬\fBjdb\fR¤«¤éµ¯Æ°¤·¤¿¤È¤­¤Ë¤Î¤ß»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + cont +@@ -147,19 +152,20 @@ + Java¥ª¥Ö¥¸¥§¥¯¥È¤ª¤è¤Ó¥×¥ê¥ß¥Æ¥£¥ÖÃͤòɽ¼¨¤·¤Þ¤¹¡£¥×¥ê¥ß¥Æ¥£¥Ö·¿¤ÎÊÑ¿ô¤Þ¤¿¤Ï¥Õ¥£¡¼¥ë¥É¤Î¾ì¹ç¤Ë¤Ï¡¢¼ÂºÝ¤ÎÃͤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ì¹ç¤Ë¤Ï¡¢Ã»¤¤ÀâÌÀ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ÜºÙ¤ò¼èÆÀ¤¹¤ëÊýË¡¤òõ¤¹¤Ë¤Ï¡¢dump¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + \fBÃí°Õ:\fR +-¥í¡¼¥«¥ëÊÑ¿ô¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢´Þ¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤¬\fIjavac \-g\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥í¡¼¥«¥ëÊÑ¿ô¤òɽ¼¨¤¹¤ë¤Ë¤Ï¡¢´Þ¤ó¤Ç¤¤¤ë¥¯¥é¥¹¤¬\fBjavac \-g\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fIprint\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Ë¼¨¤¹¤è¤¦¤Ê¡¢¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò»ÈÍѤ·¤¿¤â¤Î¤Ê¤É¡¢Â¿¤¯¤Î´Êñ¤ÊJava¼°¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ ++\fBprint\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Ë¼¨¤¹¤è¤¦¤Ê¡¢¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò»ÈÍѤ·¤¿¤â¤Î¤Ê¤É¡¢Â¿¤¯¤Î´Êñ¤ÊJava¼°¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-print MyClass\&.myStaticField +-print myObj\&.myInstanceField +-print i + j + k (i, j, k are primities and either fields or local variables) +-print myObj\&.myMethod() (if myMethod returns a non\-null) +-print new java\&.lang\&.String("Hello")\&.length() ++\fBprint MyClass\&.myStaticField\fR ++\fBprint myObj\&.myInstanceField\fR ++\fBprint i + j + k (i, j, k are primities and either fields or local variables)\fR ++\fBprint myObj\&.myMethod() (if myMethod returns a non\-null)\fR ++\fBprint new java\&.lang\&.String("Hello")\&.length()\fR ++ + .fi + .if n \{\ + .RE +@@ -168,18 +174,19 @@ + .PP + dump + .RS 4 +-¥×¥ê¥ß¥Æ¥£¥ÖÃͤξì¹ç¡¢\fIdump\fR¥³¥Þ¥ó¥É¤Ï\fIprint\fR¥³¥Þ¥ó¥É¤ÈƱ°ì¤Ç¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ì¹ç¡¢\fIdump\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë³Æ¥Õ¥£¡¼¥ë¥É¤Î¸½ºß¤ÎÃͤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£static¥Õ¥£¡¼¥ë¥É¤Èinstance¥Õ¥£¡¼¥ë¥É¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fIdump\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fIprint\fR¥³¥Þ¥ó¥É¤ÈƱ¤¸¼°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£ ++¥×¥ê¥ß¥Æ¥£¥ÖÃͤξì¹ç¡¢\fBdump\fR¥³¥Þ¥ó¥É¤Ï\fBprint\fR¥³¥Þ¥ó¥É¤ÈƱ°ì¤Ç¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ì¹ç¡¢\fBdump\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥ÈÆâ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë³Æ¥Õ¥£¡¼¥ë¥É¤Î¸½ºß¤ÎÃͤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£static¥Õ¥£¡¼¥ë¥É¤Èinstance¥Õ¥£¡¼¥ë¥É¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fBdump\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fBprint\fR¥³¥Þ¥ó¥É¤ÈƱ¤¸¼°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + threads + .RS 4 +-¸½ºß¼Â¹ÔÃæ¤Î¥¹¥ì¥Ã¥É¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¥¹¥ì¥Ã¥É¤´¤È¤Ë¡¢Ì¾Á°¤È¸½ºß¤Î¾õÂÖ¡¢¤ª¤è¤Ó¾¤Î¥³¥Þ¥ó¥É¤Ë»ÈÍѤǤ­¤ë¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ï4¤Ç¤¢¤ê¡¢¥¹¥ì¥Ã¥É¤Ï\fIjava\&.lang\&.Thread\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¡¢¥¹¥ì¥Ã¥É¤Î̾Á°¤Ï\fImain\fR¤Ç¤¢¤ê¡¢¸½ºß¼Â¹ÔÃæ¤Ç¤¹¡£ ++¸½ºß¼Â¹ÔÃæ¤Î¥¹¥ì¥Ã¥É¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¥¹¥ì¥Ã¥É¤´¤È¤Ë¡¢Ì¾Á°¤È¸½ºß¤Î¾õÂÖ¡¢¤ª¤è¤Ó¾¤Î¥³¥Þ¥ó¥É¤Ë»ÈÍѤǤ­¤ë¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ï4¤Ç¤¢¤ê¡¢¥¹¥ì¥Ã¥É¤Ï\fBjava\&.lang\&.Thread\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¡¢¥¹¥ì¥Ã¥É¤Î̾Á°¤Ï\fBmain\fR¤Ç¤¢¤ê¡¢¸½ºß¼Â¹ÔÃæ¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-4\&. (java\&.lang\&.Thread)0x1 main running ++\fB4\&. (java\&.lang\&.Thread)0x1 main running\fR ++ + .fi + .if n \{\ + .RE +@@ -188,16 +195,16 @@ + .PP + thread + .RS 4 +-¸½ºß¤Î¥¹¥ì¥Ã¥É¤Ë¤¹¤ë¥¹¥ì¥Ã¥É¤òÁªÂò¤·¤Þ¤¹¡£Â¿¤¯¤Î\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¤ÎÀßÄê¤Ë´ð¤Å¤¤¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥¹¥ì¥Ã¥É¤Ï¡¢threads¥³¥Þ¥ó¥É¤ÇÀâÌÀ¤·¤¿¥¹¥ì¥Ã¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹¤È¤È¤â¤Ë»ØÄꤷ¤Þ¤¹¡£ ++¸½ºß¤Î¥¹¥ì¥Ã¥É¤Ë¤¹¤ë¥¹¥ì¥Ã¥É¤òÁªÂò¤·¤Þ¤¹¡£Â¿¤¯¤Î\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¤ÎÀßÄê¤Ë´ð¤Å¤¤¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥¹¥ì¥Ã¥É¤Ï¡¢threads¥³¥Þ¥ó¥É¤ÇÀâÌÀ¤·¤¿¥¹¥ì¥Ã¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹¤È¤È¤â¤Ë»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + where + .RS 4 +-°ú¿ô¤ò»ØÄꤷ¤Ê¤¤¤Ç\fIwhere\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤¬¥À¥ó¥×¤µ¤ì¤Þ¤¹¡£\fIwhere\fR +-\fIall\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë¤¢¤ë¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤ò¤¹¤Ù¤Æ¥À¥ó¥×¤·¤Þ¤¹¡£\fIwhere\fR +-\fIthreadindex\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤ò¥À¥ó¥×¤·¤Þ¤¹¡£ ++°ú¿ô¤ò»ØÄꤷ¤Ê¤¤¤Ç\fBwhere\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤¬¥À¥ó¥×¤µ¤ì¤Þ¤¹¡£\fBwhere\fR ++\fBall\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥ì¥Ã¥É¡¦¥°¥ë¡¼¥×¤Ë¤¢¤ë¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤ò¤¹¤Ù¤Æ¥À¥ó¥×¤·¤Þ¤¹¡£\fBwhere\fR ++\fBthreadindex\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¤ò¥À¥ó¥×¤·¤Þ¤¹¡£ + .sp +-¸½ºß¤Î¥¹¥ì¥Ã¥É¤¬(¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤«\fIsuspend\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ)ÃæÃǤ·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥í¡¼¥«¥ëÊÑ¿ô¤È¥Õ¥£¡¼¥ë¥É¤Ï\fIprint\fR¥³¥Þ¥ó¥É¤È\fIdump\fR¥³¥Þ¥ó¥É¤Çɽ¼¨¤Ç¤­¤Þ¤¹¡£\fIup\fR¥³¥Þ¥ó¥É¤È\fIdown\fR¥³¥Þ¥ó¥É¤Ç¡¢¤É¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤ò¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Ë¤¹¤ë¤«¤òÁª¤Ö¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¸½ºß¤Î¥¹¥ì¥Ã¥É¤¬(¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤«\fBsuspend\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ)ÃæÃǤ·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥í¡¼¥«¥ëÊÑ¿ô¤È¥Õ¥£¡¼¥ë¥É¤Ï\fBprint\fR¥³¥Þ¥ó¥É¤È\fBdump\fR¥³¥Þ¥ó¥É¤Çɽ¼¨¤Ç¤­¤Þ¤¹¡£\fBup\fR¥³¥Þ¥ó¥É¤È\fBdown\fR¥³¥Þ¥ó¥É¤Ç¡¢¤É¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤ò¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Ë¤¹¤ë¤«¤òÁª¤Ö¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .SS "¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È" + .PP +@@ -211,7 +218,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥³¥Þ¥ó¥É\fIstop at MyClass:22\fR¤Ï¡¢\fIMyClass\fR¤¬´Þ¤Þ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î22¹ÔÌܤκǽé¤ÎÌ¿Îá¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É\fBstop at MyClass:22\fR¤Ï¡¢\fBMyClass\fR¤¬´Þ¤Þ¤ì¤ë¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Î22¹ÔÌܤκǽé¤ÎÌ¿Îá¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -222,7 +229,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥³¥Þ¥ó¥É\fIstop in java\&.lang\&.String\&.length\fR¤Ï¡¢¥á¥½¥Ã¥É\fIjava\&.lang\&.String\&.length\fR¤ÎÀèƬ¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É\fBstop in java\&.lang\&.String\&.length\fR¤Ï¡¢¥á¥½¥Ã¥É\fBjava\&.lang\&.String\&.length\fR¤ÎÀèƬ¤Ë¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -233,26 +240,26 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥³¥Þ¥ó¥É\fIstop in MyClass\&.<clinit>\fR¤Ï¡¢\fI<clinit>\fR¤ò»ÈÍѤ·¤Æ\fIMyClass\fR¤ÎÀÅŪ½é´ü²½¥³¡¼¥É¤òÆÃÄꤷ¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É\fBstop in MyClass\&.<clinit>\fR¤Ï¡¢\fB<clinit>\fR¤ò»ÈÍѤ·¤Æ¡¢\fBMyClass\fR¤ÎÀÅŪ½é´ü²½¥³¡¼¥É¤òÆÃÄꤷ¤Þ¤¹¡£ + .RE + .PP +-¥á¥½¥Ã¥É¤¬¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢¥á¥½¥Ã¥É¤Î°ú¿ô¤Î·¿¤â»ØÄꤷ¤Æ¡¢¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤ËÂФ·¤ÆŬÀڤʥ᥽¥Ã¥É¤¬ÁªÂò¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIMyClass\&.myMethod(int,java\&.lang\&.String)\fR¤Þ¤¿¤Ï\fIMyClass\&.myMethod()\fR¤È»ØÄꤷ¤Þ¤¹¡£ ++¥á¥½¥Ã¥É¤¬¥ª¡¼¥Ð¡¼¥í¡¼¥É¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢¥á¥½¥Ã¥É¤Î°ú¿ô¤Î·¿¤â»ØÄꤷ¤Æ¡¢¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤ËÂФ·¤ÆŬÀڤʥ᥽¥Ã¥É¤¬ÁªÂò¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBMyClass\&.myMethod(int,java\&.lang\&.String)\fR¤Þ¤¿¤Ï\fBMyClass\&.myMethod()\fR¤È»ØÄꤷ¤Þ¤¹¡£ + .PP +-\fIclear\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIclear MyClass:45\fR¤Î¤è¤¦¤Ê¹½Ê¸¤ò»ÈÍѤ·¤Æ¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òºï½ü¤·¤Þ¤¹¡£\fIclear\fR¤ò»ÈÍѤ¹¤ë¤«¡¢°ú¿ô¤ò»ØÄꤷ¤Ê¤¤¤Ç\fIstop\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¸½ºßÀßÄꤵ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fIcont\fR¥³¥Þ¥ó¥É¤Ï¼Â¹Ô¤ò·Ñ³¤·¤Þ¤¹¡£ ++\fBclear\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBclear MyClass:45\fR¤Î¤è¤¦¤Ê¹½Ê¸¤ò»ÈÍѤ·¤Æ¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤òºï½ü¤·¤Þ¤¹¡£\fBclear\fR¤ò»ÈÍѤ¹¤ë¤«¡¢°ú¿ô¤ò»ØÄꤷ¤Ê¤¤¤Ç\fBstop\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¸½ºßÀßÄꤵ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fBcont\fR¥³¥Þ¥ó¥É¤Ï¼Â¹Ô¤ò·Ñ³¤·¤Þ¤¹¡£ + .SS "¥¹¥Æ¥Ã¥×¼Â¹Ô" + .PP +-\fIstep\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Þ¤¿¤Ï¸Æ¤Ó½Ð¤µ¤ì¤¿¥á¥½¥Ã¥ÉÆâ¤Ç¡¢¼¡¤Î¹Ô¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fInext\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Î¼¡¤Î¹Ô¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBstep\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Þ¤¿¤Ï¸Æ¤Ó½Ð¤µ¤ì¤¿¥á¥½¥Ã¥ÉÆâ¤Ç¡¢¼¡¤Î¹Ô¤ò¼Â¹Ô¤·¤Þ¤¹¡£\fBnext\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥¹¥¿¥Ã¥¯¡¦¥Õ¥ì¡¼¥à¤Î¼¡¤Î¹Ô¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .SS "Îã³°" + .PP +-¥¹¥í¡¼¤·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¤Î¸Æ½Ð¤·¥¹¥¿¥Ã¥¯¾å¤Î¤É¤³¤Ë¤â\fIcatch\fRʸ¤¬¤Ê¤¤¾ì¹ç¤ËÎã³°¤¬È¯À¸¤¹¤ë¤È¡¢JVM¤ÏÄ̾Îã³°¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Æ½ªÎ»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢JDB´Ä¶­¤Ç¼Â¹Ô¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°ãÈ¿¤Î¥¹¥í¡¼»þ¤ËJDB¤ËÀ©¸æ¤¬Ìá¤ê¤Þ¤¹¡£¼¡¤Ë¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÎã³°¤Î¸¶°ø¤ò¿ÇÃǤ·¤Þ¤¹¡£ ++¥¹¥í¡¼¤·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¤Î¸Æ½Ð¤·¥¹¥¿¥Ã¥¯¾å¤Î¤É¤³¤Ë¤â\fBcatch\fRʸ¤¬¤Ê¤¤¾ì¹ç¤ËÎã³°¤¬È¯À¸¤¹¤ë¤È¡¢JVM¤ÏÄ̾Îã³°¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Æ½ªÎ»¤·¤Þ¤¹¡£¤¿¤À¤·¡¢JDB´Ä¶­¤Ç¼Â¹Ô¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢°ãÈ¿¤Î¥¹¥í¡¼»þ¤ËJDB¤ËÀ©¸æ¤¬Ìá¤ê¤Þ¤¹¡£¼¡¤Ë¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÎã³°¤Î¸¶°ø¤ò¿ÇÃǤ·¤Þ¤¹¡£ + .PP +-¤¿¤È¤¨¤Ð¡¢\fIcatch java\&.io\&.FileNotFoundException\fR¤Þ¤¿¤Ï\fIcatch\fR +-\fImypackage\&.BigTroubleException\fR¤Î¤è¤¦¤Ë\fIcatch\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Ð¥Ã¥°¤µ¤ì¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢Â¾¤ÎÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤ËÄä»ß¤·¤Þ¤¹¡£Îã³°¤¬ÆÃÄê¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥µ¥Ö¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Î¾ì¹ç¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÏÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì½ê¤ÇÄä»ß¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢\fBcatch java\&.io\&.FileNotFoundException\fR¤Þ¤¿¤Ï\fBcatch\fR ++\fBmypackage\&.BigTroubleException\fR¤Î¤è¤¦¤Ë\fBcatch\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥Ç¥Ð¥Ã¥°¤µ¤ì¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢Â¾¤ÎÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤ËÄä»ß¤·¤Þ¤¹¡£Îã³°¤¬ÆÃÄê¤Î¥¯¥é¥¹¤Þ¤¿¤Ï¥µ¥Ö¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Î¾ì¹ç¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÏÎã³°¤¬¥¹¥í¡¼¤µ¤ì¤¿¾ì½ê¤ÇÄä»ß¤·¤Þ¤¹¡£ + .PP +-\fIignore\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢°ÊÁ°¤Î\fIcatch\fR¥³¥Þ¥ó¥É¤Î¸ú²Ì¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fIignore\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Ð¥Ã¥°¤µ¤ì¤ëJVM¤ÏÆÃÄê¤ÎÎã³°¤ò̵»ë¤»¤º¡¢¥Ç¥Ð¥Ã¥¬¤Î¤ß¤ò̵»ë¤·¤Þ¤¹¡£ ++\fBignore\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢°ÊÁ°¤Î\fBcatch\fR¥³¥Þ¥ó¥É¤Î¸ú²Ì¤¬Ìµ¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£\fBignore\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Ð¥Ã¥°¤µ¤ì¤ëJVM¤ÏÆÃÄê¤ÎÎã³°¤ò̵»ë¤»¤º¡¢¥Ç¥Ð¥Ã¥¬¤Î¤ß¤ò̵»ë¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjava\fR¥³¥Þ¥ó¥É¤Î¤«¤ï¤ê¤Ë\fIjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢\fI\-D\fR¡¢\fI\-classpath\fR¡¢\fI\-X\fR¤Ê¤É¡¢\fIjava\fR¥³¥Þ¥ó¥É¤ÈƱ¤¸¿ô¤Î¥ª¥×¥·¥ç¥ó¤ò¼õ¤±Æþ¤ì¤Þ¤¹¡£\fIjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¾¤Ë¼¡¤Î¥ê¥¹¥È¤Ë¤¢¤ë¥ª¥×¥·¥ç¥ó¤ò¼õ¤±Æþ¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fBjava\fR¥³¥Þ¥ó¥É¤Î¤«¤ï¤ê¤Ë\fBjdb\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢\fB\-D\fR¡¢\fB\-classpath\fR¡¢\fB\-X\fR¤Ê¤É¡¢\fBjava\fR¥³¥Þ¥ó¥É¤ÈƱ¤¸¿ô¤Î¥ª¥×¥·¥ç¥ó¤ò¼õ¤±Æþ¤ì¤Þ¤¹¡£\fBjdb\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¾¤Ë¼¡¤Î¥ê¥¹¥È¤Ë¤¢¤ë¥ª¥×¥·¥ç¥ó¤ò¼õ¤±Æþ¤ì¤Þ¤¹¡£ + .PP + ¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦JVM¤Ë¥Ç¥Ð¥Ã¥¬¤òÀܳ¤¹¤ë¤¿¤á¤ÎÂåÂص¡¹½¤òÄ󶡤¹¤ë¤¿¤á¤Ë¡¢¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤é¤ÎÀܳ¤ÎÂåÂؤ˴ؤ¹¤ë¾ÜºÙ¤Ê¥É¥­¥å¥á¥ó¥È¤Ï¡¢Java Platform Debugger Architecture (JPDA) + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jpda/index\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ +@@ -279,7 +286,7 @@ + .PP + \-launch + .RS 4 +-¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òJDB¤Îµ¯Æ°¸å¤¿¤À¤Á¤Ëµ¯Æ°¤·¤Þ¤¹¡£\fI\-launch\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fIrun\fR¥³¥Þ¥ó¥É¤¬É¬Íפʤ¯¤Ê¤ê¤Þ¤¹¡£¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢µ¯Æ°¸å¡¢½é´ü¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¯¥é¥¹¤¬¥í¡¼¥É¤µ¤ì¤ëľÁ°¤ËÄä»ß¤·¤Þ¤¹¡£¤½¤Î»þÅÀ¤Ç¡¢É¬Íפʥ֥졼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¡¢\fIcont\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¼Â¹Ô¤ò·Ñ³¤Ç¤­¤Þ¤¹¡£ ++¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òJDB¤Îµ¯Æ°¸å¤¿¤À¤Á¤Ëµ¯Æ°¤·¤Þ¤¹¡£\fB\-launch\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢\fBrun\fR¥³¥Þ¥ó¥É¤¬É¬Íפʤ¯¤Ê¤ê¤Þ¤¹¡£¥Ç¥Ð¥Ã¥°¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢µ¯Æ°¸å¡¢½é´ü¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¯¥é¥¹¤¬¥í¡¼¥É¤µ¤ì¤ëľÁ°¤ËÄä»ß¤·¤Þ¤¹¡£¤½¤Î»þÅÀ¤Ç¡¢É¬Íפʥ֥졼¥¯¥Ý¥¤¥ó¥È¤òÀßÄꤷ¡¢\fBcont\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¼Â¹Ô¤ò·Ñ³¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-listconnectors +@@ -294,7 +301,7 @@ + .PP + \-dbgtrace [\fIflags\fR] + .RS 4 +-\fIjdb\fR¥³¥Þ¥ó¥É¤Î¥Ç¥Ð¥Ã¥°¤Î¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjdb\fR¥³¥Þ¥ó¥É¤Î¥Ç¥Ð¥Ã¥°¤Î¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-tclient +@@ -309,7 +316,7 @@ + .PP + \-J\fIoption\fR + .RS 4 +-JVM¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++JVM¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥Ç¥Ð¥Ã¥°ÂÐ¾Ý¤Î¥×¥í¥»¥¹¤ËžÁ÷¤µ¤ì¤ë¥ª¥×¥·¥ç¥ó" + .PP +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jdeps.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jdeps.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jdeps +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jdeps ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jdeps" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jdeps \- Java¥¯¥é¥¹°Í¸À­¥¢¥Ê¥é¥¤¥¶¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjdeps\fR [\fIoptions\fR] \fIclasses\fR \&.\&.\&. ++\fBjdeps\fR [\fIoptions\fR] \fIclasses\fR \&.\&.\&. + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclasses\fR +@@ -73,20 +75,24 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjdeps\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥Ã¥±¡¼¥¸¥ì¥Ù¥ë¤Þ¤¿¤Ï¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸À­¤ò¼¨¤·¤Þ¤¹¡£ÆþÎÏ¥¯¥é¥¹¤Ë¤Ï¡¢\fI\&.class\fR¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹Ì¾¡¢¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òʬÀϤ¹¤ë¤¿¤á¤Î´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê½ÐÎϤ¬·èÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjdeps\fR¤Ï¥·¥¹¥Æ¥à½ÐÎϤ˰͸´Ø·¸¤ò½ÐÎϤ·¤Þ¤¹¡£DOT¸À¸ì¤Ç°Í¸´Ø·¸¤òÀ¸À®¤Ç¤­¤Þ¤¹(\fI\-dotoutput\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È)¡£ ++\fBjdeps\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¥Ñ¥Ã¥±¡¼¥¸¥ì¥Ù¥ë¤Þ¤¿¤Ï¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸À­¤ò¼¨¤·¤Þ¤¹¡£ÆþÎÏ¥¯¥é¥¹¤Ë¤Ï¡¢\fB\&.class\fR¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹Ì¾¡¢¥Ç¥£¥ì¥¯¥È¥ê¡¢JAR¥Õ¥¡¥¤¥ë¡¢¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òʬÀϤ¹¤ë¤¿¤á¤Î´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê½ÐÎϤ¬·èÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjdeps\fR¤Ï¥·¥¹¥Æ¥à½ÐÎϤ˰͸´Ø·¸¤ò½ÐÎϤ·¤Þ¤¹¡£DOT¸À¸ì¤Ç°Í¸´Ø·¸¤òÀ¸À®¤Ç¤­¤Þ¤¹(\fB\-dotoutput\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È)¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-dotoutput <\fIdir\fR> + .RS 4 +-DOT¥Õ¥¡¥¤¥ë½ÐÎϤΰ¸Àè¥Ç¥£¥ì¥¯¥È¥ê¡£»ØÄꤷ¤¿¾ì¹ç¤Ï\fIjdeps\fR¤Ï<\fIarchive\-file\-name\fR>\&.dot¤È¤¤¤¦Ì¾Á°¤ÎʬÀϺѤߥ¢¡¼¥«¥¤¥Ö¤´¤È¤Ë°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ë1¤Ä¤Îdot¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¡¢¥¢¡¼¥«¥¤¥Ö´Ö¤Î°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ësummary\&.dot¤È¤¤¤¦Ì¾Á°¤Î¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤âÀ¸À®¤·¤Þ¤¹¡£ ++DOT¥Õ¥¡¥¤¥ë½ÐÎϤΰ¸Àè¥Ç¥£¥ì¥¯¥È¥ê¡£»ØÄꤷ¤¿¾ì¹ç¡¢\fBjdeps\fR¤Ï<\fIarchive\-file\-name\fR>\&.dot¤È¤¤¤¦Ì¾Á°¤ÎʬÀϺѥ¢¡¼¥«¥¤¥Ö¤´¤È¤Ë°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ë1¤Ä¤Îdot¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¡¢¥¢¡¼¥«¥¤¥Ö´Ö¤Î°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ësummary\&.dot¤È¤¤¤¦Ì¾Á°¤Î¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤âÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP +-\-s, \-summary ++\-s ++.br ++\-summary + .RS 4 + °Í¸´Ø·¸¤Î¥µ¥Þ¥ê¡¼¤Î¤ß¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-v, \-verbose ++\-v ++.br ++\-verbose + .RS 4 + ¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸´Ø·¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE +@@ -101,46 +107,56 @@ + Ʊ¤¸¥¢¡¼¥«¥¤¥ÖÆâ¤Î°Í¸´Ø·¸¤ò½ü¤­¡¢¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸´Ø·¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-cp <\fIpath\fR>, \-classpath <\fIpath\fR> ++\-cp <\fIpath\fR> ++.br ++\-classpath <\fIpath\fR> + .RS 4 + ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¸¡º÷¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + Setting the Class Path ¤â»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\-p <\fIpkg name\fR>, \-package <\fIpkg name\fR> ++\-p <\fIpkg name\fR> ++.br ++\-package <\fIpkg name\fR> + .RS 4 +-»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤ËÂФ·¤Æ¤³¤Î¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄê¤Ç¤­¤Þ¤¹¡£\fI\-p\fR¥ª¥×¥·¥ç¥ó¤È\fI\-e\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ++»ØÄꤷ¤¿¥Ñ¥Ã¥±¡¼¥¸¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£°Û¤Ê¤ë¥Ñ¥Ã¥±¡¼¥¸¤ËÂФ·¤Æ¤³¤Î¥ª¥×¥·¥ç¥ó¤òÊ£¿ô²ó»ØÄê¤Ç¤­¤Þ¤¹¡£\fB\-p\fR¥ª¥×¥·¥ç¥ó¤È\fB\-e\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP +-\-e <\fIregex\fR>, \-regex <\fIregex\fR> ++\-e <\fIregex\fR> ++.br ++\-regex <\fIregex\fR> + .RS 4 +-»ØÄꤷ¤¿Àµµ¬É½¸½¥Ñ¥¿¡¼¥ó¤È°ìÃפ¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£\fI\-p\fR¥ª¥×¥·¥ç¥ó¤È\fI\-e\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ++»ØÄꤷ¤¿Àµµ¬É½¸½¥Ñ¥¿¡¼¥ó¤È°ìÃפ¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£\fB\-p\fR¥ª¥×¥·¥ç¥ó¤È\fB\-e\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP + \-include <\fIregex\fR> + .RS 4 +-ʬÀϤò¥Ñ¥¿¡¼¥ó¤Ë°ìÃפ¹¤ë¥¯¥é¥¹¤ËÀ©¸Â¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Ê¬ÀϤ¹¤ë¥¯¥é¥¹¤Î¥ê¥¹¥È¤ò¥Õ¥£¥ë¥¿¤·¤Þ¤¹¡£°Í¸´Ø·¸¤Ë¥Ñ¥¿¡¼¥ó¤òŬÍѤ¹¤ë\fI\-p\fR¤ª¤è¤Ó\fI\-e\fR¤È¤È¤â¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ ++ʬÀϤò¥Ñ¥¿¡¼¥ó¤Ë°ìÃפ¹¤ë¥¯¥é¥¹¤ËÀ©¸Â¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Ê¬ÀϤ¹¤ë¥¯¥é¥¹¤Î¥ê¥¹¥È¤ò¥Õ¥£¥ë¥¿¤·¤Þ¤¹¡£°Í¸´Ø·¸¤Ë¥Ñ¥¿¡¼¥ó¤òŬÍѤ¹¤ë\fB\-p\fR¤ª¤è¤Ó\fB\-e\fR¤È¤È¤â¤Ë»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-jdkinternals + .RS 4 +-JDK¤ÎÆâÉôAPI¤Î¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fI\-include\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤òʬÀϤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-p\fR¥ª¥×¥·¥ç¥ó¡¢\fI\-e\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fI\-s\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤǤ­¤Þ¤»¤ó¡£ ++JDK¤ÎÆâÉôAPI¤Î¥¯¥é¥¹¥ì¥Ù¥ë¤Î°Í¸´Ø·¸¤ò¸¡½Ð¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fB\-include\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤¿¤¹¤Ù¤Æ¤Î¥¯¥é¥¹¤òʬÀϤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-p\fR¥ª¥×¥·¥ç¥ó¡¢\fB\-e\fR¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó\fB\-s\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤǤ­¤Þ¤»¤ó¡£ + .sp + \fB·Ù¹ð\fR: JDK¤ÎÆâÉôAPI¤Ï¡¢º£¸å¤Î¥ê¥ê¡¼¥¹¤Ç¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\-P, \-profile ++\-P ++.br ++\-profile + .RS 4 + ¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¥×¥í¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥Õ¥¡¥¤¥ë¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-apionly + .RS 4 +-¥Õ¥£¡¼¥ë¥É¡¦¥¿¥¤¥×¡¢¥á¥½¥Ã¥É¡¦¥Ñ¥é¥á¡¼¥¿¡¦¥¿¥¤¥×¡¢Ìá¤ê¥¿¥¤¥×¡¢¥Á¥§¥Ã¥¯¤µ¤ì¤¿Îã³°¥¿¥¤¥×¤ò´Þ¤à¥Ñ¥Ö¥ê¥Ã¥¯¡¦¥¯¥é¥¹¤Î\fIpublic\fR¤ª¤è¤Ó\fIprotected\fR¥á¥ó¥Ð¡¼¤Î½ð̾¤«¤é¤Î°Í¸´Ø·¸¤Ê¤É¡¢Ê¬ÀϤòAPI¤ËÀ©¸Â¤·¤Þ¤¹¡£ ++¥Õ¥£¡¼¥ë¥É¡¦¥¿¥¤¥×¡¢¥á¥½¥Ã¥É¡¦¥Ñ¥é¥á¡¼¥¿¡¦¥¿¥¤¥×¡¢Ìá¤ê¥¿¥¤¥×¡¢¥Á¥§¥Ã¥¯¤µ¤ì¤¿Îã³°¥¿¥¤¥×¤ò´Þ¤à¥Ñ¥Ö¥ê¥Ã¥¯¡¦¥¯¥é¥¹¤Î\fBpublic\fR¤ª¤è¤Ó\fBprotected\fR¥á¥ó¥Ð¡¼¤Î½ð̾¤«¤é¤Î°Í¸´Ø·¸¤Ê¤É¡¢Ê¬ÀϤòAPI¤ËÀ©¸Â¤·¤Þ¤¹¡£ + .RE + .PP +-\-R, \-recursive ++\-R ++.br ++\-recursive + .RS 4 + ¤¹¤Ù¤Æ¤Î°Í¸´Ø·¸¤òºÆµ¢Åª¤ËÁöºº¤·¤Þ¤¹¡£ + .RE +@@ -150,9 +166,13 @@ + ¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-h, \-?, \-help ++\-h ++.br ++\-? ++.br ++\-help + .RS 4 +-\fIjdeps\fR¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjdeps\fR¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .SH "Îã" + .PP +@@ -162,24 +182,25 @@ + .RS 4 + .\} + .nf +-$ jdeps demo/jfc/Notepad/Notepad\&.jar ++\fB$ jdeps demo/jfc/Notepad/Notepad\&.jar\fR ++\fB \fR ++\fBdemo/jfc/Notepad/Notepad\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB <unnamed> (Notepad\&.jar)\fR ++\fB \-> java\&.awt \fR ++\fB \-> java\&.awt\&.event \fR ++\fB \-> java\&.beans \fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.net \fR ++\fB \-> java\&.util \fR ++\fB \-> java\&.util\&.logging \fR ++\fB \-> javax\&.swing \fR ++\fB \-> javax\&.swing\&.border \fR ++\fB \-> javax\&.swing\&.event \fR ++\fB \-> javax\&.swing\&.text \fR ++\fB \-> javax\&.swing\&.tree \fR ++\fB \-> javax\&.swing\&.undo \fR + +-demo/jfc/Notepad/Notepad\&.jar \-> /usr/java/jre/lib/rt\&.jar +- <unnamed> (Notepad\&.jar) +- \-> java\&.awt +- \-> java\&.awt\&.event +- \-> java\&.beans +- \-> java\&.io +- \-> java\&.lang +- \-> java\&.net +- \-> java\&.util +- \-> java\&.util\&.logging +- \-> javax\&.swing +- \-> javax\&.swing\&.border +- \-> javax\&.swing\&.event +- \-> javax\&.swing\&.text +- \-> javax\&.swing\&.tree +- \-> javax\&.swing\&.undo + .fi + .if n \{\ + .RE +@@ -191,115 +212,119 @@ + .RS 4 + .\} + .nf +-$ jdeps \-profile demo/jfc/Notepad/Notepad\&.jar +-demo/jfc/Notepad/Notepad\&.jar \-> /usr/java/jre/lib/rt\&.jar (Full JRE) +- <unnamed> (Notepad\&.jar) +- \-> java\&.awt Full JRE +- \-> java\&.awt\&.event Full JRE +- \-> java\&.beans Full JRE +- \-> java\&.io compact1 +- \-> java\&.lang compact1 +- \-> java\&.net compact1 +- \-> java\&.util compact1 +- \-> java\&.util\&.logging compact1 +- \-> javax\&.swing Full JRE +- \-> javax\&.swing\&.border Full JRE +- \-> javax\&.swing\&.event Full JRE +- \-> javax\&.swing\&.text Full JRE +- \-> javax\&.swing\&.tree Full JRE +- \-> javax\&.swing\&.undo Full JRE ++\fB$ jdeps \-profile demo/jfc/Notepad/Notepad\&.jar \fR ++\fBdemo/jfc/Notepad/Notepad\&.jar \-> /usr/java/jre/lib/rt\&.jar (Full JRE)\fR ++\fB <unnamed> (Notepad\&.jar)\fR ++\fB \-> java\&.awt Full JRE\fR ++\fB \-> java\&.awt\&.event Full JRE\fR ++\fB \-> java\&.beans Full JRE\fR ++\fB \-> java\&.io compact1\fR ++\fB \-> java\&.lang compact1\fR ++\fB \-> java\&.net compact1\fR ++\fB \-> java\&.util compact1\fR ++\fB \-> java\&.util\&.logging compact1\fR ++\fB \-> javax\&.swing Full JRE\fR ++\fB \-> javax\&.swing\&.border Full JRE\fR ++\fB \-> javax\&.swing\&.event Full JRE\fR ++\fB \-> javax\&.swing\&.text Full JRE\fR ++\fB \-> javax\&.swing\&.tree Full JRE\fR ++\fB \-> javax\&.swing\&.undo Full JRE\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-tools\&.jar¥Õ¥¡¥¤¥ëÆâ¤Î\fIcom\&.sun\&.tools\&.jdeps\&.Main\fR¥¯¥é¥¹¤Ê¤É¡¢ÆÃÄê¤Î¥¯¥é¥¹¥Ñ¥¹Æâ¤ÎÆÃÄê¤Î¥¯¥é¥¹¤ÎľÀܰ͸´Ø·¸¤ÎʬÀÏ¡£ ++tools\&.jar¥Õ¥¡¥¤¥ëÆâ¤Î\fBcom\&.sun\&.tools\&.jdeps\&.Main\fR¥¯¥é¥¹¤Ê¤É¡¢ÆÃÄê¤Î¥¯¥é¥¹¥Ñ¥¹Æâ¤ÎÆÃÄê¤Î¥¯¥é¥¹¤ÎľÀܰ͸´Ø·¸¤ÎʬÀÏ¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-$ jdeps \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main +-lib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar +- com\&.sun\&.tools\&.jdeps (tools\&.jar) +- \-> java\&.io +- \-> java\&.lang ++\fB$ jdeps \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main\fR ++\fBlib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB com\&.sun\&.tools\&.jdeps (tools\&.jar)\fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fI\-verbose:class\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¹¥ì¥Ù¥ë°Í¸´Ø·¸¤ò¸¡º÷¤¹¤ë¤«\fI\-v\fR¤Þ¤¿¤Ï\fI\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆƱ¤¸JAR¥Õ¥¡¥¤¥ë¤«¤é¤Î°Í¸´Ø·¸¤ò´Þ¤á¤Þ¤¹¡£ ++\fB\-verbose:class\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¹¥ì¥Ù¥ë°Í¸´Ø·¸¤ò¸¡º÷¤¹¤ë¤«\fB\-v\fR¤Þ¤¿¤Ï\fB\-verbose\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆƱ¤¸JAR¥Õ¥¡¥¤¥ë¤«¤é¤Î°Í¸´Ø·¸¤ò´Þ¤á¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-$ jdeps \-verbose:class \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main ++\fB$ jdeps \-verbose:class \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main\fR ++\fB \fR ++\fBlib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB com\&.sun\&.tools\&.jdeps\&.Main (tools\&.jar)\fR ++\fB \-> java\&.io\&.PrintWriter \fR ++\fB \-> java\&.lang\&.Exception \fR ++\fB \-> java\&.lang\&.Object \fR ++\fB \-> java\&.lang\&.String \fR ++\fB \-> java\&.lang\&.System \fR + +-lib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar +- com\&.sun\&.tools\&.jdeps\&.Main (tools\&.jar) +- \-> java\&.io\&.PrintWriter +- \-> java\&.lang\&.Exception +- \-> java\&.lang\&.Object +- \-> java\&.lang\&.String +- \-> java\&.lang\&.System + .fi + .if n \{\ + .RE + .\} + .PP +-\fI\-R\fR¤Þ¤¿¤Ï\fI\-recursive\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fIcom\&.sun\&.tools\&.jdeps\&.Main\fR¥¯¥é¥¹¤Î¿ä°ÜŪ¤Ê°Í¸´Ø·¸¤òʬÀϤ·¤Þ¤¹¡£ ++\fB\-R\fR¤Þ¤¿¤Ï\fB\-recursive\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fBcom\&.sun\&.tools\&.jdeps\&.Main\fR¥¯¥é¥¹¤Î¿ä°ÜŪ¤Ê°Í¸´Ø·¸¤òʬÀϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-$ jdeps \-R \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main +-lib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar +- com\&.sun\&.tools\&.classfile (tools\&.jar) +- \-> java\&.io +- \-> java\&.lang +- \-> java\&.lang\&.reflect +- \-> java\&.nio\&.charset +- \-> java\&.nio\&.file +- \-> java\&.util +- \-> java\&.util\&.regex +- com\&.sun\&.tools\&.jdeps (tools\&.jar) +- \-> java\&.io +- \-> java\&.lang +- \-> java\&.nio\&.file +- \-> java\&.nio\&.file\&.attribute +- \-> java\&.text +- \-> java\&.util +- \-> java\&.util\&.jar +- \-> java\&.util\&.regex +- \-> java\&.util\&.zip +-/usr/java/jre/lib/jce\&.jar \-> /usr/java/jre/lib/rt\&.jar +- javax\&.crypto (jce\&.jar) +- \-> java\&.io +- \-> java\&.lang +- \-> java\&.lang\&.reflect +- \-> java\&.net +- \-> java\&.nio +- \-> java\&.security +- \-> java\&.security\&.cert +- \-> java\&.security\&.spec +- \-> java\&.util +- \-> java\&.util\&.concurrent +- \-> java\&.util\&.jar +- \-> java\&.util\&.regex +- \-> java\&.util\&.zip +- \-> javax\&.security\&.auth +- \-> sun\&.security\&.jca JDK internal API (rt\&.jar) +- \-> sun\&.security\&.util JDK internal API (rt\&.jar) +- javax\&.crypto\&.spec (jce\&.jar) +- \-> java\&.lang +- \-> java\&.security\&.spec +- \-> java\&.util +-/usr/java/jre/lib/rt\&.jar \-> /usr/java/jre/lib/jce\&.jar +- java\&.security (rt\&.jar) +- \-> javax\&.crypto ++\fB$ jdeps \-R \-cp lib/tools\&.jar com\&.sun\&.tools\&.jdeps\&.Main\fR ++\fBlib/tools\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB com\&.sun\&.tools\&.classfile (tools\&.jar)\fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.lang\&.reflect \fR ++\fB \-> java\&.nio\&.charset \fR ++\fB \-> java\&.nio\&.file \fR ++\fB \-> java\&.util \fR ++\fB \-> java\&.util\&.regex \fR ++\fB com\&.sun\&.tools\&.jdeps (tools\&.jar)\fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.nio\&.file \fR ++\fB \-> java\&.nio\&.file\&.attribute \fR ++\fB \-> java\&.text \fR ++\fB \-> java\&.util \fR ++\fB \-> java\&.util\&.jar \fR ++\fB \-> java\&.util\&.regex \fR ++\fB \-> java\&.util\&.zip \fR ++\fB/usr/java/jre/lib/jce\&.jar \-> /usr/java/jre/lib/rt\&.jar\fR ++\fB javax\&.crypto (jce\&.jar)\fR ++\fB \-> java\&.io \fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.lang\&.reflect \fR ++\fB \-> java\&.net \fR ++\fB \-> java\&.nio \fR ++\fB \-> java\&.security \fR ++\fB \-> java\&.security\&.cert \fR ++\fB \-> java\&.security\&.spec \fR ++\fB \-> java\&.util \fR ++\fB \-> java\&.util\&.concurrent \fR ++\fB \-> java\&.util\&.jar \fR ++\fB \-> java\&.util\&.regex \fR ++\fB \-> java\&.util\&.zip \fR ++\fB \-> javax\&.security\&.auth \fR ++\fB \-> sun\&.security\&.jca JDK internal API (rt\&.jar)\fR ++\fB \-> sun\&.security\&.util JDK internal API (rt\&.jar)\fR ++\fB javax\&.crypto\&.spec (jce\&.jar)\fR ++\fB \-> java\&.lang \fR ++\fB \-> java\&.security\&.spec \fR ++\fB \-> java\&.util \fR ++\fB/usr/java/jre/lib/rt\&.jar \-> /usr/java/jre/lib/jce\&.jar\fR ++\fB java\&.security (rt\&.jar)\fR ++\fB \-> javax\&.crypto\fR ++ + .fi + .if n \{\ + .RE +@@ -311,41 +336,43 @@ + .RS 4 + .\} + .nf +-$ jdeps \-dotoutput dot demo/jfc/Notepad/Notepad\&.jar ++\fB$ jdeps \-dotoutput dot demo/jfc/Notepad/Notepad\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIjdeps\fR¤Ï¡¢\fI\-dotoutput\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿dot¥Ç¥£¥ì¥¯¥È¥ê¤Ë<\fIfilename\fR>\&.dot¤È¤¤¤¦Ì¾Á°¤Îdot¥Õ¥¡¥¤¥ë¤òÆÃÄê¤ÎJAR¥Õ¥¡¥¤¥ë¤´¤È¤ËºîÀ®¤·¡¢JAR¥Õ¥¡¥¤¥ë´Ö¤Î°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ësummary\&.dot¤È¤¤¤¦Ì¾Á°¤Î¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤âºîÀ®¤·¤Þ¤¹ ++\fBjdeps\fR¤Ï¡¢\fB\-dotoutput\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿dot¥Ç¥£¥ì¥¯¥È¥ê¤Ë<\fIfilename\fR>\&.dot¤È¤¤¤¦Ì¾Á°¤Îdot¥Õ¥¡¥¤¥ë¤òÆÃÄê¤ÎJAR¥Õ¥¡¥¤¥ë¤´¤È¤ËºîÀ®¤·¡¢JAR¥Õ¥¡¥¤¥ë´Ö¤Î°Í¸´Ø·¸¤ò¥ê¥¹¥È¤¹¤ësummary\&.dot¤È¤¤¤¦Ì¾Á°¤Î¥µ¥Þ¥ê¡¼¡¦¥Õ¥¡¥¤¥ë¤âºîÀ®¤·¤Þ¤¹ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-$ cat dot/Notepad\&.jar\&.dot +-digraph "Notepad\&.jar" { +- // Path: demo/jfc/Notepad/Notepad\&.jar +- "<unnamed>" \-> "java\&.awt"; +- "<unnamed>" \-> "java\&.awt\&.event"; +- "<unnamed>" \-> "java\&.beans"; +- "<unnamed>" \-> "java\&.io"; +- "<unnamed>" \-> "java\&.lang"; +- "<unnamed>" \-> "java\&.net"; +- "<unnamed>" \-> "java\&.util"; +- "<unnamed>" \-> "java\&.util\&.logging"; +- "<unnamed>" \-> "javax\&.swing"; +- "<unnamed>" \-> "javax\&.swing\&.border"; +- "<unnamed>" \-> "javax\&.swing\&.event"; +- "<unnamed>" \-> "javax\&.swing\&.text"; +- "<unnamed>" \-> "javax\&.swing\&.tree"; +- "<unnamed>" \-> "javax\&.swing\&.undo"; +-} ++\fB$ cat dot/Notepad\&.jar\&.dot \fR ++\fBdigraph "Notepad\&.jar" {\fR ++\fB // Path: demo/jfc/Notepad/Notepad\&.jar\fR ++\fB "<unnamed>" \-> "java\&.awt";\fR ++\fB "<unnamed>" \-> "java\&.awt\&.event";\fR ++\fB "<unnamed>" \-> "java\&.beans";\fR ++\fB "<unnamed>" \-> "java\&.io";\fR ++\fB "<unnamed>" \-> "java\&.lang";\fR ++\fB "<unnamed>" \-> "java\&.net";\fR ++\fB "<unnamed>" \-> "java\&.util";\fR ++\fB "<unnamed>" \-> "java\&.util\&.logging";\fR ++\fB "<unnamed>" \-> "javax\&.swing";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.border";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.event";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.text";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.tree";\fR ++\fB "<unnamed>" \-> "javax\&.swing\&.undo";\fR ++\fB}\fR ++\fB \fR ++\fB$ cat dot/summary\&.dot\fR ++\fBdigraph "summary" {\fR ++\fB "Notepad\&.jar" \-> "rt\&.jar";\fR ++\fB}\fR + +-$ cat dot/summary\&.dot +-digraph "summary" { +- "Notepad\&.jar" \-> "rt\&.jar"; +-} + .fi + .if n \{\ + .RE +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jhat.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jhat.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jhat +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jhat ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jhat" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jhat \- Java¥Ò¡¼¥×¤òʬÀϤ·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjhat\fR [ \fIoptions\fR ] \fIheap\-dump\-file\fR ++\fBjhat\fR [ \fIoptions\fR ] \fIheap\-dump\-file\fR + .fi + .if n \{\ + .RE +@@ -64,16 +66,16 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIheap\-dump\-file\fR + .RS 4 +-¥Ö¥é¥¦¥ºÂоݤȤʤëJava¥Ð¥¤¥Ê¥ê¡¦¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¡£Ê£¿ô¤Î¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò´Þ¤à¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¡¢\fImyfile\&.hprof#3\fR¤Î¤è¤¦¤Ë¥Õ¥¡¥¤¥ë̾¤Î¸å¤Ë\fI#<number>\fR¤òÉղ乤뤳¤È¤Ç¡¢¥Õ¥¡¥¤¥ëÆâ¤ÎÆÃÄê¤Î¥À¥ó¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¥Ö¥é¥¦¥ºÂоݤȤʤëJava¥Ð¥¤¥Ê¥ê¡¦¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¡£Ê£¿ô¤Î¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò´Þ¤à¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤Î¾ì¹ç¡¢\fBmyfile\&.hprof#3\fR¤Î¤è¤¦¤Ë¥Õ¥¡¥¤¥ë̾¤Î¸å¤Ë\fB#<number>\fR¤òÉղ乤뤳¤È¤Ç¡¢¥Õ¥¡¥¤¥ëÆâ¤ÎÆÃÄê¤Î¥À¥ó¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjhat\fR¥³¥Þ¥ó¥É¤ÏJava¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤ò²òÀϤ·¡¢Web¥µ¡¼¥Ð¡¼¤ò³«»Ï¤·¤Þ¤¹¡£\fIjhat\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¤ªµ¤¤ËÆþ¤ê¤Î¥Ö¥é¥¦¥¶¤Ç¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò»²¾È¤Ç¤­¤Þ¤¹¡£\fIjhat\fR¥³¥Þ¥ó¥É¤Ï¡¢´ûÃΤΥ¯¥é¥¹\fIMyClass\fR¤Î¤¹¤Ù¤Æ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òɽ¼¨¤¹¤ë¤Ê¤É¤Î»öÁ°À߷׺ѤÎÌä¹ç¤»¤äObject Query Language (OQL)¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×¤ÎÌä¹ç¤»¤ò½ü¤­¡¢OQL¤ÏSQL¤Ë»÷¤Æ¤¤¤Þ¤¹¡£OQL¤Î¥Ø¥ë¥×¤Ë¤Ï¡¢\fIjhat\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æɽ¼¨¤µ¤ì¤ëOQL¥Ø¥ë¥×¡¦¥Ú¡¼¥¸¤«¤é¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢OQL¤Î¥Ø¥ë¥×¤Ïhttp://localhost:7000/oqlhelp/¤ÇÍøÍѲÄǽ¤Ç¤¹¡£ ++\fBjhat\fR¥³¥Þ¥ó¥É¤ÏJava¥Ò¡¼¥×¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤ò²òÀϤ·¡¢Web¥µ¡¼¥Ð¡¼¤ò³«»Ï¤·¤Þ¤¹¡£\fBjhat\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¤ªµ¤¤ËÆþ¤ê¤Î¥Ö¥é¥¦¥¶¤Ç¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò»²¾È¤Ç¤­¤Þ¤¹¡£\fBjhat\fR¥³¥Þ¥ó¥É¤Ï¡¢´ûÃΤΥ¯¥é¥¹\fBMyClass\fR¤Î¤¹¤Ù¤Æ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òɽ¼¨¤¹¤ë¤Ê¤É¤Î»öÁ°À߷׺ѤÎÌä¹ç¤»¤äObject Query Language (OQL)¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×¤ÎÌä¹ç¤»¤ò½ü¤­¡¢OQL¤ÏSQL¤Ë»÷¤Æ¤¤¤Þ¤¹¡£OQL¤Î¥Ø¥ë¥×¤Ë¤Ï¡¢\fBjhat\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æɽ¼¨¤µ¤ì¤ëOQL¥Ø¥ë¥×¡¦¥Ú¡¼¥¸¤«¤é¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢OQL¤Î¥Ø¥ë¥×¤Ïhttp://localhost:7000/oqlhelp/¤ÇÍøÍѲÄǽ¤Ç¤¹¡£ + .PP + Java¤Î¥Ò¡¼¥×¡¦¥À¥ó¥×¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤¤¤¯¤Ä¤«¤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +@@ -85,7 +87,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIjmap \-dump\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¼Â¹Ô»þ¤Ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£jmap(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjmap \-dump\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¼Â¹Ô»þ¤Ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£jmap(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp + .RS 4 +@@ -96,7 +98,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIjconsole\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ\fIHotSpotDiagnosticMXBean\fR·Ðͳ¤Ç¼Â¹Ô»þ¤Ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£jconsole(1)¤ª¤è¤Ó\fIHotSpotDiagnosticMXBean\fR¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÀâÌÀ( ++\fBjconsole\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ\fBHotSpotDiagnosticMXBean\fR·Ðͳ¤Ç¼Â¹Ô»þ¤Ë¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò¼èÆÀ¤·¤Þ¤¹¡£jconsole(1)¤ª¤è¤Ó\fBHotSpotDiagnosticMXBean\fR¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÀâÌÀ( + http://docs\&.oracle\&.com/javase/8/docs/jre/api/management/extension/com/sun/management/HotSpotDiagnosticMXBean\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .sp +@@ -108,8 +110,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥Ò¡¼¥×¡¦¥À¥ó¥×¤Ï¡¢\fI\-XX:+HeapDumpOnOutOfMemoryError\fR +-Java²¾ÁÛ¥Þ¥·¥ó(JVM)¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢\fIOutOfMemoryError\fR¤¬¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤ËÀ¸À®¤µ¤ì¤Þ¤¹¡£ ++¥Ò¡¼¥×¡¦¥À¥ó¥×¤Ï¡¢\fB\-XX:+HeapDumpOnOutOfMemoryError\fR ++Java Virtual Machine (JVM)¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢\fBOutOfMemoryError\fR¤¬¥¹¥í¡¼¤µ¤ì¤¿¤È¤­¤ËÀ¸À®¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -120,29 +122,29 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIhprof\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£HPROF: Heap/CPU¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥Ä¡¼¥ë ++\fBhprof\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£HPROF: Heap/CPU¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥Ä¡¼¥ë + (http://docs\&.oracle\&.com/javase/8/docs/technotes/samples/hprof\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-stack false|true + .RS 4 +-¥ª¥Ö¥¸¥§¥¯¥È³äÅö¸Æ½Ð¤·¥¹¥¿¥Ã¥¯¤ÎÄÉÀפò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×Æâ¤Ç³äÅö¥µ¥¤¥È¾ðÊ󤬻ÈÍѤǤ­¤Ê¤¤¾ì¹ç¡¢¤³¤Î¥Õ¥é¥°¤ò\fIfalse\fR¤ËÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fItrue\fR¤Ç¤¹¡£ ++¥ª¥Ö¥¸¥§¥¯¥È³äÅö¸Æ½Ð¤·¥¹¥¿¥Ã¥¯¤ÎÄÉÀפò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×Æâ¤Ç³äÅö¥µ¥¤¥È¾ðÊ󤬻ÈÍѤǤ­¤Ê¤¤¾ì¹ç¡¢¤³¤Î¥Õ¥é¥°¤ò\fBfalse\fR¤ËÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fBtrue\fR¤Ç¤¹¡£ + .RE + .PP + \-refs false|true + .RS 4 +-¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤ÎÄÉÀפò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fItrue\fR¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Ò¡¼¥×Æâ¤Î¤¹¤Ù¤Æ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤Ä¤¤¤Æ¡¢¥Ð¥Ã¥¯¥Ý¥¤¥ó¥¿(»ØÄꤵ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Ý¥¤¥ó¥È¤·¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¡£»²¾È¼Ô¤Þ¤¿¤Ï¼õ¿®»²¾È¤È¤â¸Æ¤Ð¤ì¤ë)¤¬·×»»¤µ¤ì¤Þ¤¹¡£ ++¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤ÎÄÉÀפò̵¸ú¤Ë¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fBtrue\fR¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Ò¡¼¥×Æâ¤Î¤¹¤Ù¤Æ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤Ä¤¤¤Æ¡¢¥Ð¥Ã¥¯¥Ý¥¤¥ó¥¿(»ØÄꤵ¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Ý¥¤¥ó¥È¤·¤Æ¤¤¤ë¥ª¥Ö¥¸¥§¥¯¥È¡£»²¾È¼Ô¤Þ¤¿¤Ï¼õ¿®»²¾È¤È¤â¸Æ¤Ð¤ì¤ë)¤¬·×»»¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-port \fIport\-number\fR + .RS 4 +-\fIjhat\fR¤ÎHTTP¥µ¡¼¥Ð¡¼¤Î¥Ý¡¼¥È¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï7000¤Ç¤¹¡£ ++\fBjhat\fR¤ÎHTTP¥µ¡¼¥Ð¡¼¤Î¥Ý¡¼¥È¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï7000¤Ç¤¹¡£ + .RE + .PP + \-exclude \fIexclude\-file\fR + .RS 4 +-Åþã²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤ÎÌä¹ç¤»¤«¤é½ü³°¤¹¤ëɬÍפ¬¤¢¤ë¥Ç¡¼¥¿¡¦¥á¥ó¥Ð¡¼¤Î°ìÍ÷¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ë\fIjava\&.lang\&.String\&.value\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢ÆÃÄê¤Î¥ª¥Ö¥¸¥§¥¯¥È\fIo\fR¤«¤éÅþã²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¥ê¥¹¥È¤ò·×»»¤¹¤ëºÝ¤Ë¡¢\fIjava\&.lang\&.String\&.value\fR¥Õ¥£¡¼¥ë¥É¤Ë´ØÏ¢¤¹¤ë»²¾È¥Ñ¥¹¤¬¹Í褵¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£ ++Åþã²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤ÎÌä¹ç¤»¤«¤é½ü³°¤¹¤ëɬÍפ¬¤¢¤ë¥Ç¡¼¥¿¡¦¥á¥ó¥Ð¡¼¤Î°ìÍ÷¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Ë\fBjava\&.lang\&.String\&.value\fR¤¬´Þ¤Þ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢ÆÃÄê¤Î¥ª¥Ö¥¸¥§¥¯¥È\fBo\fR¤«¤éÅþã²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¥ê¥¹¥È¤ò·×»»¤¹¤ëºÝ¤Ë¡¢\fBjava\&.lang\&.String\&.value\fR¥Õ¥£¡¼¥ë¥É¤Ë´ØÏ¢¤¹¤ë»²¾È¥Ñ¥¹¤¬¹Í褵¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-baseline \fIexclude\-file\fR +@@ -172,7 +174,7 @@ + .PP + \-J\fIflag\fR + .RS 4 +-\fIjhat\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava²¾ÁÛ¥Þ¥·¥ó¤Ë\fIflag\fR¤òÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢512M¥Ð¥¤¥È¤ÎºÇÂç¥Ò¡¼¥×¡¦¥µ¥¤¥º¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fI\-J\-Xmx512m\fR¤È¤·¤Þ¤¹¡£ ++\fBjhat\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava Virtual Machine¤Ë\fBflag\fR¤òÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢512M¥Ð¥¤¥È¤ÎºÇÂç¥Ò¡¼¥×¡¦¥µ¥¤¥º¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fB\-J\-Xmx512m\fR¤È¤·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jinfo.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jinfo.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jinfo +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jinfo ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jinfo" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jinfo \- ¹½À®¾ðÊó¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjinfo\fR [ \fIoption\fR ] \fIpid\fR ++\fBjinfo\fR [ \fIoption\fR ] \fIpid\fR + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjinfo\fR [ \fIoption \fR] \fIexecutable core\fR ++\fBjinfo\fR [ \fIoption \fR] \fIexecutable core\fR + .fi + .if n \{\ + .RE +@@ -76,7 +78,7 @@ + .RS 4 + .\} + .nf +-\fIjinfo\fR [ \fIoption \fR] \fI[ servier\-id ] remote\-hostname\-or\-IP\fR ++\fBjinfo\fR [ \fIoption \fR] \fI[ servier\-id ] remote\-hostname\-or\-IP\fR + .fi + .if n \{\ + .RE +@@ -84,7 +86,7 @@ + .PP + \fI¥ª¥×¥·¥ç¥ó\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIpid\fR +@@ -104,7 +106,7 @@ + .PP + \fIremote\-hostname\-or\-IP\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fI¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fIIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fB¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fBIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIserver\-id\fR +@@ -113,35 +115,35 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjinfo\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ÎJava¹½À®¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£¹½À®¾ðÊó¤Ë¤Ï¡¢Java¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤ÈJava²¾ÁÛ¥Þ¥·¥ó(JVM)¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJVM¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fI\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fIjinfo\fR +-\fI\-J\-d64 \-sysprops pid\fR¡£ ++\fBjinfo\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ÎJava¹½À®¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£¹½À®¾ðÊó¤Ë¤Ï¡¢Java¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤ÈJava Virtual Machine (JVM)¤Î¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJVM¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fB\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fBjinfo\fR ++\fB\-J\-d64 \-sysprops pid\fR¡£ + .PP +-¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fIdbgeng\&.dll\fR¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fIPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fIset PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR¤Ç¤¹¡£ ++¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fBdbgeng\&.dll\fR¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fBPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fBset PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR¤Ç¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + no\-option + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤ò¡¢¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£Ì¾¤ÈÃͤΥڥ¢¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤ò¡¢¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£Ì¾¤ÈÃͤΥڥ¢¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-flag \fIname\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤Î̾Á°¤ÈÃͤò½ÐÎϤ·¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤Î̾Á°¤ÈÃͤò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-flag \fI[+|\-]name\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥Ö¡¼¥ë·¿¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤òÍ­¸ú¤Þ¤¿¤Ï̵¸ú¤Ë¤·¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥Ö¡¼¥ë·¿¤Î¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤òÍ­¸ú¤Þ¤¿¤Ï̵¸ú¤Ë¤·¤Þ¤¹¡£ + .RE + .PP + \-flag \fIname=value\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤ò»ØÄꤵ¤ì¤¿ÃͤËÀßÄꤷ¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤ò»ØÄꤵ¤ì¤¿ÃͤËÀßÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-flags + .RS 4 +-JVM¤ËÅϤµ¤ì¤ë¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Õ¥é¥°¤ò½ÐÎϤ·¤Þ¤¹¡£ ++JVM¤ËÅϤµ¤ì¤ë¥³¥Þ¥ó¥É¹Ô¥Õ¥é¥°¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-sysprops +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jjs.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jjs.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jjs +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ´ðËܥġ¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jjs ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ´ðËܥġ¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jjs" "1" "2013ǯ11·î21Æü" "JDK 8" "´ðËܥġ¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jjs \- Nashorn¥¨¥ó¥¸¥ó¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjjs\fR [\fIoptions\fR] [\fIscript\-files\fR] [\-\- \fIarguments\fR] ++\fB\fBjjs\fR\fR\fB [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIscript\-files\fR\fR\fB] [\-\- \fR\fB\fIarguments\fR\fR\fB]\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¶õÇòʸ»ú¤Ç¶èÀÚ¤é¤ì¤¿¡¢\fIjjs\fR¥³¥Þ¥ó¥É¤Î1¤Ä°Ê¾å¤Î¥ª¥×¥·¥ç¥ó¡£¾ÜºÙ¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¶õÇòʸ»ú¤Ç¶èÀÚ¤é¤ì¤¿¡¢\fBjjs\fR¥³¥Þ¥ó¥É¤Î1¤Ä°Ê¾å¤Î¥ª¥×¥·¥ç¥ó¡£¾ÜºÙ¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIscript\-files\fR +@@ -74,53 +76,61 @@ + .PP + \fIarguments\fR + .RS 4 +-Æó½Å¥Ï¥¤¥Õ¥ó¡¦¥Þ¡¼¥«¡¼(\fI\-\-\fR)¤Î¸å¤Î¤¹¤Ù¤Æ¤ÎÃͤ¬¡¢°ú¿ô¤È¤·¤Æ¥¹¥¯¥ê¥×¥È¤Þ¤¿¤ÏÂÐÏ÷¿¥·¥§¥ë¤ËÅϤµ¤ì¤Þ¤¹¡£¤³¤ì¤é¤ÎÃͤˤÏ\fIarguments\fR¥×¥í¥Ñ¥Æ¥£¤ò»ÈÍѤ·¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹(Example 3¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£ ++Æó½Å¥Ï¥¤¥Õ¥ó¡¦¥Þ¡¼¥«¡¼(\fB\-\-\fR)¤Î¸å¤Î¤¹¤Ù¤Æ¤ÎÃͤ¬¡¢°ú¿ô¤È¤·¤Æ¥¹¥¯¥ê¥×¥È¤Þ¤¿¤ÏÂÐÏ÷¿¥·¥§¥ë¤ËÅϤµ¤ì¤Þ¤¹¡£¤³¤ì¤é¤ÎÃͤˤÏ\fBarguments\fR¥×¥í¥Ñ¥Æ¥£¤ò»ÈÍѤ·¤Æ¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹(Example 3¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤)¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjjs\fR¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ä¡¼¥ë¤ò»ÈÍѤ·¤ÆNashorn¥¨¥ó¥¸¥ó¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ·¤Æ¡¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤ò²ò¼á¤·¤¿¤ê¡¢ÂÐÏ÷¿¥·¥§¥ë¤ò¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBjjs\fR¥³¥Þ¥ó¥É¹Ô¥Ä¡¼¥ë¤ò»ÈÍѤ·¤ÆNashorn¥¨¥ó¥¸¥ó¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ·¤Æ¡¢1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤ò²ò¼á¤·¤¿¤ê¡¢ÂÐÏ÷¿¥·¥§¥ë¤ò¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjjs\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤Ï¥¹¥¯¥ê¥×¥È¤¬Nashorn¤Ë¤è¤Ã¤Æ²ò¼á¤µ¤ì¤ë¾ò·ï¤òÀ©¸æ¤·¤Þ¤¹¡£ ++\fBjjs\fR¥³¥Þ¥ó¥É¤Î¥ª¥×¥·¥ç¥ó¤Ï¥¹¥¯¥ê¥×¥È¤¬Nashorn¤Ë¤è¤Ã¤Æ²ò¼á¤µ¤ì¤ë¾ò·ï¤òÀ©¸æ¤·¤Þ¤¹¡£ + .PP +-\-ccs=\fIsize\fR, \-\-class\-cache\-size=\fIsize\fR ++\-ccs=\fIsize\fR ++.br ++\-\-class\-cache\-size=\fIsize\fR + .RS 4 +-¥¯¥é¥¹¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤ò¥Ð¥¤¥Èñ°Ì¤ÇÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È(KB)¤ò¼¨¤¹¤¿¤á¤Ë\fIk\fR¤Þ¤¿¤Ï\fIK\fR¤Îʸ»ú¤òÄɲä·¡¢¥á¥¬¥Ð¥¤¥È(MB)¤ò¼¨¤¹¤¿¤á¤Ë\fIm\fR¤Þ¤¿¤Ï\fIM\fR¤Îʸ»ú¤òÄɲä·¡¢¥®¥¬¥Ð¥¤¥È(GB)¤ò¼¨¤¹¤¿¤á¤Ë\fIg\fR¤Þ¤¿¤Ï\fIG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¹¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤Ï50¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤Ï¡¢1024¥Ð¥¤¥È(1 KB)¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤ò¥Ð¥¤¥Èñ°Ì¤ÇÀßÄꤷ¤Þ¤¹¡£¥­¥í¥Ð¥¤¥È(KB)¤ò¼¨¤¹¤¿¤á¤Ë\fBk\fR¤Þ¤¿¤Ï\fBK\fR¤Îʸ»ú¤òÄɲä·¡¢¥á¥¬¥Ð¥¤¥È(MB)¤ò¼¨¤¹¤¿¤á¤Ë\fBm\fR¤Þ¤¿¤Ï\fBM\fR¤Îʸ»ú¤òÄɲä·¡¢¥®¥¬¥Ð¥¤¥È(GB)¤ò¼¨¤¹¤¿¤á¤Ë\fBg\fR¤Þ¤¿¤Ï\fBG\fR¤òÄɲä·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¯¥é¥¹¡¦¥­¥ã¥Ã¥·¥å¡¦¥µ¥¤¥º¤Ï50¥Ð¥¤¥È¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤Ï¡¢1024¥Ð¥¤¥È(1 KB)¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-css=100 +-\-css=1k ++\fB\-css=100\fR ++\fB\-css=1k\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-co, \-\-compile\-only ++\-co ++.br ++\-\-compile\-only + .RS 4 + ¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô¤»¤º¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .RE + .PP +-\-cp \fIpath\fR, \-\-classpath \fIpath\fR ++\-cp \fIpath\fR ++.br ++\-\-classpath \fIpath\fR + .RS 4 + ¥µ¥Ý¡¼¥È¤¹¤ë¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£Ê£¿ô¤Î¥Ñ¥¹¤òÀßÄꤹ¤ë¤Ë¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«¤êÊÖ¤¹¤«¡¢¤Þ¤¿¤Ï³Æ¥Ñ¥¹¤ò¥³¥í¥ó(:)¤Ç¶èÀÚ¤ê¤Þ¤¹¡£ + .RE + .PP + \-D\fIname\fR=\fIvalue\fR + .RS 4 +-¥×¥í¥Ñ¥Æ¥£Ì¾¤ËÃͤò³ä¤êÅö¤Æ¤ë¤³¤È¤Ç¡¢¥¹¥¯¥ê¥×¥È¤ËÅϤ¹¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤷ¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¡¢ÂÐÏ÷¿¥â¡¼¥É¤ÇNashorn¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢\fImyValue\fR¤ò\fImyKey\fR¤È¤¤¤¦Ì¾Á°¤Î¥×¥í¥Ñ¥Æ¥£¤Ë³ä¤êÅö¤Æ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++¥×¥í¥Ñ¥Æ¥£Ì¾¤ËÃͤò³ä¤êÅö¤Æ¤ë¤³¤È¤Ç¡¢¥¹¥¯¥ê¥×¥È¤ËÅϤ¹¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤òÀßÄꤷ¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¡¢ÂÐÏ÷¿¥â¡¼¥É¤ÇNashorn¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢\fBmyValue\fR¤ò\fBmyKey\fR¤È¤¤¤¦Ì¾Á°¤Î¥×¥í¥Ñ¥Æ¥£¤Ë³ä¤êÅö¤Æ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +->> \fBjjs \-DmyKey=myValue\fR +-jjs> \fBjava\&.lang\&.System\&.getProperty("myKey")\fR +-myValue +-jjs> ++\fB>> \fR\fB\fBjjs \-DmyKey=myValue\fR\fR ++\fBjjs> \fR\fB\fBjava\&.lang\&.System\&.getProperty("myKey")\fR\fR ++\fBmyValue\fR ++\fBjjs>\fR ++ + .fi + .if n \{\ + .RE +@@ -128,14 +138,16 @@ + ¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«¤êÊÖ¤·»ÈÍѤ¹¤ë¤È¡¢Ê£¿ô¤Î¥×¥í¥Ñ¥Æ¥£¤òÀßÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP +-\-d=\fIpath\fR, \-\-dump\-debug\-dir=\fIpath\fR ++\-d=\fIpath\fR ++.br ++\-\-dump\-debug\-dir=\fIpath\fR + .RS 4 + ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò¥À¥ó¥×¤¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Ø¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-\-debug\-lines + .RS 4 +-¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¹ÔÈÖ¹æɽ¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fI\-\-debug\-lines=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¹ÔÈÖ¹æɽ¤òÀ¸À®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fB\-\-debug\-lines=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-\-debug\-locals +@@ -143,14 +155,16 @@ + ¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¥í¡¼¥«¥ëÊÑ¿ô¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP +-\-doe, \-\-dump\-on\-error ++\-doe ++.br ++\-\-dump\-on\-error + .RS 4 + ¥¨¥é¡¼¤¬È¯À¸¤·¤¿¤È¤­¤Ë¡¢¥Õ¥ë¡¦¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢´Êñ¤Ê¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤Î¤ß¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \-\-early\-lvalue\-error + .RS 4 +-̵¸ú¤Êº¸ÊÕÃͼ°¤¬Áá´ü¥¨¥é¡¼¤È¤·¤Æ(¤Ä¤Þ¤ê¡¢¥³¡¼¥É¤¬²òÀϤµ¤ì¤ë¤È¤­¤Ë)Êó¹ð¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fI\-\-early\-lvalue\-error=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£Ìµ¸ú¤Ê¾ì¹ç¡¢Ìµ¸ú¤Êº¸ÊÕÃͼ°¤Ï¥³¡¼¥É¤¬¼Â¹Ô¤µ¤ì¤ë¤Þ¤ÇÊó¹ð¤µ¤ì¤Þ¤»¤ó¡£ ++̵¸ú¤Êº¸ÊÕÃͼ°¤¬Áá´ü¥¨¥é¡¼¤È¤·¤Æ(¤Ä¤Þ¤ê¡¢¥³¡¼¥É¤¬²òÀϤµ¤ì¤ë¤È¤­¤Ë)Êó¹ð¤µ¤ì¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fB\-\-early\-lvalue\-error=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£Ìµ¸ú¤Ê¾ì¹ç¡¢Ìµ¸ú¤Êº¸ÊÕÃͼ°¤Ï¥³¡¼¥É¤¬¼Â¹Ô¤µ¤ì¤ë¤Þ¤ÇÊó¹ð¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .PP + \-\-empty\-statements +@@ -158,7 +172,9 @@ + ¶õ¤Îʸ¤òJava¤ÎÃê¾Ý¹½Ê¸¥Ä¥ê¡¼¤ËÊݸ¤·¤Þ¤¹¡£ + .RE + .PP +-\-fv, \-\-fullversion ++\-fv ++.br ++\-\-fullversion + .RS 4 + ´°Á´¤ÊNashorn¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE +@@ -178,28 +194,31 @@ + ¥¹¥¯¥ê¥×¥È¤òJavaFX¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤È¤·¤Æµ¯Æ°¤·¤Þ¤¹¡£ + .RE + .PP +-\-h, \-help ++\-h ++.br ++\-help + .RS 4 + ¥ª¥×¥·¥ç¥ó¤Î¥ê¥¹¥È¤È¤½¤ÎÀâÌÀ¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-»ØÄꤷ¤¿\fIjava\fRµ¯Æ°¥ª¥×¥·¥ç¥ó¤òJVM¤ËÅϤ·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¡¢ÂÐÏ÷¿¥â¡¼¥É¤ÇNashorn¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢JVM¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëºÇÂç¥á¥â¥ê¡¼¤ò4 GB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ ++»ØÄꤷ¤¿\fBjava\fRµ¯Æ°¥ª¥×¥·¥ç¥ó¤òJVM¤ËÅϤ·¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¡¢ÂÐÏ÷¿¥â¡¼¥É¤ÇNashorn¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢JVM¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëºÇÂç¥á¥â¥ê¡¼¤ò4 GB¤ËÀßÄꤹ¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +->> \fBjjs \-J\-Xmx4g\fR +-jjs> \fBjava\&.lang\&.Runtime\&.getRuntime()\&.maxMemory()\fR +-3817799680 +-jjs> ++\fB>> \fR\fB\fBjjs \-J\-Xmx4g\fR\fR ++\fBjjs> \fR\fB\fBjava\&.lang\&.Runtime\&.getRuntime()\&.maxMemory()\fR\fR ++\fB3817799680\fR ++\fBjjs>\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«¤êÊÖ¤·»ÈÍѤ¹¤ë¤È¡¢Ê£¿ô¤Î\fIjava\fR¥³¥Þ¥ó¥É¡¦¥ª¥×¥·¥ç¥ó¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«¤êÊÖ¤·»ÈÍѤ¹¤ë¤È¡¢Ê£¿ô¤Î\fBjava\fR¥³¥Þ¥ó¥É¡¦¥ª¥×¥·¥ç¥ó¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-\-lazy\-compilation +@@ -209,7 +228,7 @@ + .PP + \-\-loader\-per\-compile + .RS 4 +-¥³¥ó¥Ñ¥¤¥ë¤´¤È¤Ë¿·¤·¤¤¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤òºîÀ®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fI\-\-loader\-per\-compile=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥ë¤´¤È¤Ë¿·¤·¤¤¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤òºîÀ®¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Ìµ¸ú¤Ë¤¹¤ë¤Ë¤Ï\fB\-\-loader\-per\-compile=false\fR¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-\-log=\fIsubsystem\fR:\fIlevel\fR +@@ -220,7 +239,8 @@ + .RS 4 + .\} + .nf +-\-\-log=fields:finest,codegen:info ++\fB\-\-log=fields:finest,codegen:info\fR ++ + .fi + .if n \{\ + .RE +@@ -259,7 +279,7 @@ + .PP + \-\-print\-no\-newline + .RS 4 +-¤½¤Î¾¤Î\fI\-\-print*\fR¥ª¥×¥·¥ç¥ó¤Ç¶¯À©Åª¤Ë1¹Ô¤Ç½ÐÎϤ·¤Þ¤¹¡£ ++¤½¤Î¾¤Î\fB\-\-print*\fR¥ª¥×¥·¥ç¥ó¤Ç¶¯À©Åª¤Ë1¹Ô¤Ç½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-\-print\-parse +@@ -272,7 +292,9 @@ + µ­¹æɽ¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-pcs, \-\-profile\-callsites ++\-pcs ++.br ++\-\-profile\-callsites + .RS 4 + ¸Æ¤Ó½Ð¤·¥µ¥¤¥È¤Î¥×¥í¥Õ¥¡¥¤¥ë¡¦¥Ç¡¼¥¿¤ò¥À¥ó¥×¤·¤Þ¤¹¡£ + .RE +@@ -284,12 +306,12 @@ + .PP + \-\-stderr=\fIfilename\fR|\fIstream\fR|\fItty\fR + .RS 4 +-ɸ½à¥¨¥é¡¼¡¦¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¥¹¥È¥ê¡¼¥à(¤¿¤È¤¨¤Ð\fIstdout\fR)¤Ë¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥ÈüËö¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£ ++ɸ½à¥¨¥é¡¼¡¦¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¥¹¥È¥ê¡¼¥à(¤¿¤È¤¨¤Ð\fBstdout\fR)¤Ë¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥ÈüËö¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£ + .RE + .PP + \-\-stdout=\fIfilename\fR|\fIstream\fR|\fItty\fR + .RS 4 +-ɸ½à½ÐÎÏ¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¥¹¥È¥ê¡¼¥à(¤¿¤È¤¨¤Ð\fIstderr\fR)¤Ë¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥ÈüËö¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£ ++ɸ½à½ÐÎÏ¥¹¥È¥ê¡¼¥à¤ò»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¥¹¥È¥ê¡¼¥à(¤¿¤È¤¨¤Ð\fBstderr\fR)¤Ë¡¢¤Þ¤¿¤Ï¥Æ¥­¥¹¥ÈüËö¤Ë¥ê¥À¥¤¥ì¥¯¥È¤·¤Þ¤¹¡£ + .RE + .PP + \-strict +@@ -297,12 +319,16 @@ + ɸ½à(ECMAScript Edition 5\&.1)¤Ø¤Î½àµò¤ò¶¯²½¤¹¤ëstrict¥â¡¼¥É¤òÍ­¸ú¤Ë¤·¡¢¤³¤ì¤Ë¤è¤ê¶¦Ä̤Υ³¡¼¥Ç¥£¥ó¥°¡¦¥¨¥é¡¼¤ò´Êñ¤Ë¸¡½Ð¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP +-\-t=\fIzone\fR, \-timezone=\fIzone\fR ++\-t=\fIzone\fR ++.br ++\-timezone=\fIzone\fR + .RS 4 +-¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô¤ËÂФ·»ØÄꤷ¤¿¥¿¥¤¥à¥¾¡¼¥ó¤òÀßÄꤷ¤Þ¤¹¡£OS¤ÇÀßÄꤵ¤ì¤¿¥¿¥¤¥à¥¾¡¼¥ó¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¡¢\fIDate\fR¥ª¥Ö¥¸¥§¥¯¥È¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô¤ËÂФ·»ØÄꤷ¤¿¥¿¥¤¥à¡¦¥¾¡¼¥ó¤òÀßÄꤷ¤Þ¤¹¡£OS¤ÇÀßÄꤵ¤ì¤¿¥¿¥¤¥à¡¦¥¾¡¼¥ó¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¡¢\fBDate\fR¥ª¥Ö¥¸¥§¥¯¥È¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-tcs=\fIparameter\fR, \-\-trace\-callsites=\fIparameter\fR ++\-tcs=\fIparameter\fR ++.br ++\-\-trace\-callsites=\fIparameter\fR + .RS 4 + ¸Æ½Ð¤·¥µ¥¤¥È¤Î¥È¥ì¡¼¥¹¤Î¥â¡¼¥É¤òÍ­¸ú¤Ë¤·¤Þ¤¹¡£»ÈÍѲÄǽ¤Ê¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .PP +@@ -327,60 +353,71 @@ + ¥Ð¥¤¥È¥³¡¼¥É¤ò¼Â¹Ô¤¹¤ëÁ°¤Ë¸¡¾Ú¤·¤Þ¤¹¡£ + .RE + .PP +-\-v, \-version ++\-v ++.br ++\-version + .RS 4 + Nashorn¥Ð¡¼¥¸¥ç¥óʸ»úÎó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-xhelp + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Î³ÈÄ¥¥Ø¥ë¥×¤ò½ÐÎϤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Î³ÈÄ¥¥Ø¥ë¥×¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .SH "Îã" + .PP +-\fBExample 1\fR, Nashorn¤ò»ÈÍѤ·¤¿¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô ++\fBÎã 1\fR ++.br ++Nashorn¤ò»ÈÍѤ·¤¿¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jjs script\&.js ++\fBjjs script\&.js\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 2\fR, ÂÐÏ÷¿¥â¡¼¥É¤Ç¤ÎNashorn¤Î¼Â¹Ô ++\fBÎã 2\fR ++.br ++ÂÐÏ÷¿¥â¡¼¥É¤Ç¤ÎNashorn¤Î¼Â¹Ô + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +->> \fBjjs\fR +-jjs> \fBprintln("Hello, World!")\fR +-Hello, World! +-jjs> \fBquit()\fR +->> ++\fB>> \fR\fB\fBjjs\fR\fR ++\fBjjs> \fR\fB\fBprintln("Hello, World!")\fR\fR ++\fBHello, World!\fR ++\fBjjs> \fR\fB\fBquit()\fR\fR ++\fB>>\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\fBExample 3\fR, Nashorn¤Ø¤Î°ú¿ô¤ÎÅϤ· ++\fBÎã 3\fR ++.br ++Nashorn¤Ø¤Î°ú¿ô¤ÎÅϤ· + .RS 4 + .sp + .if n \{\ + .RS 4 + .\} + .nf +->> \fBjjs \-\- a b c\fR +-jjs> \fBarguments\&.join(", ")\fR +-a, b, c +-jjs> ++\fB>> \fR\fB\fBjjs \-\- a b c\fR\fR ++\fBjjs> \fR\fB\fBarguments\&.join(", ")\fR\fR ++\fBa, b, c\fR ++\fBjjs>\fR ++ + .fi + .if n \{\ + .RE +@@ -388,7 +425,7 @@ + .RE + .SH "´ØÏ¢¹àÌÜ" + .PP +-\fIjrunscript\fR ++\fBjrunscript\fR + .br + 'pl 8.5i + 'bp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jmap.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jmap.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jmap +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jmap ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jmap" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jmap \- ¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î¡¢¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥á¥â¥ê¡¼¡¦¥Þ¥Ã¥×¤Þ¤¿¤Ï¥Ò¡¼¥×¡¦¥á¥â¥ê¡¼¤Î¾ÜºÙ¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjmap\fR [ \fIoptions\fR ] \fIpid\fR ++\fBjmap\fR [ \fIoptions\fR ] \fIpid\fR + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjmap\fR [ \fIoptions\fR ] \fIexecutable\fR \fIcore\fR ++\fBjmap\fR [ \fIoptions\fR ] \fIexecutable\fR \fIcore\fR + .fi + .if n \{\ + .RE +@@ -76,7 +78,7 @@ + .RS 4 + .\} + .nf +-\fIjmap\fR [ \fIoptions\fR ] [ \fIpid\fR ] \fIserver\-id\fR@ ] \fIremote\-hostname\-or\-IP\fR ++\fBjmap\fR [ \fIoptions\fR ] [ \fIpid\fR ] \fIserver\-id\fR@ ] \fIremote\-hostname\-or\-IP\fR + .fi + .if n \{\ + .RE +@@ -84,7 +86,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIpid\fR +@@ -104,7 +106,7 @@ + .PP + \fIremote\-hostname\-or\-IP\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fI¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fIIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fB¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fBIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIserver\-id\fR +@@ -113,22 +115,22 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjmap\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î¡¢¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥á¥â¥ê¡¼¡¦¥Þ¥Ã¥×¤Þ¤¿¤Ï¥Ò¡¼¥×¡¦¥á¥â¥ê¡¼¤Î¾ÜºÙ¤ò½ÐÎϤ·¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJava²¾ÁÛ¥Þ¥·¥ó(JVM)¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fI\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fIjmap\fR +-\fI\-J\-d64 \-heap pid\fR¡£ ++\fBjmap\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤ä¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î¡¢¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥á¥â¥ê¡¼¡¦¥Þ¥Ã¥×¤Þ¤¿¤Ï¥Ò¡¼¥×¡¦¥á¥â¥ê¡¼¤Î¾ÜºÙ¤ò½ÐÎϤ·¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJava Virtual Machine (JVM)¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fB\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fBjmap\fR ++\fB\-J\-d64 \-heap pid\fR¡£ + .PP + \fBÃí°Õ:\fR +-¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fIdbgeng\&.dll\fR¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fIPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ë\fIjvm\&.dll\fR¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fIset PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR¡£ ++¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fBdbgeng\&.dll\fR¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fBPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ë\fBjvm\&.dll\fR¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fBset PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-<¥ª¥×¥·¥ç¥ó¤Ê¤·> ++<no option> + .RS 4 +-¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¡¢\fIjmap\fR¥³¥Þ¥ó¥É¤Ï¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Þ¥Ã¥Ô¥ó¥°¤ò½ÐÎϤ·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈJVM¤Ë¥í¡¼¥É¤µ¤ì¤¿¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¤´¤È¤Ë¡¢³«»Ï¥¢¥É¥ì¥¹¡¢¥Þ¥Ã¥Ô¥ó¥°¤Î¥µ¥¤¥º¤ª¤è¤Ó¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Õ¥ë¥Ñ¥¹¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤³¤ÎÆ°ºî¤Ï¡¢Oracle Solaris +-\fIpmap\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÈÎà»÷¤·¤Æ¤¤¤Þ¤¹¡£ ++¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¡¢\fBjmap\fR¥³¥Þ¥ó¥É¤Ï¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Þ¥Ã¥Ô¥ó¥°¤ò½ÐÎϤ·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈJVM¤Ë¥í¡¼¥É¤µ¤ì¤¿¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¤´¤È¤Ë¡¢³«»Ï¥¢¥É¥ì¥¹¡¢¥Þ¥Ã¥Ô¥ó¥°¤Î¥µ¥¤¥º¤ª¤è¤Ó¶¦ÍÑ¥ª¥Ö¥¸¥§¥¯¥È¡¦¥Õ¥¡¥¤¥ë¤Î¥Õ¥ë¥Ñ¥¹¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤³¤ÎÆ°ºî¤Ï¡¢Oracle Solaris ++\fBpmap\fR¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÈÎà»÷¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-dump:[live,] format=b, file=\fIfilename\fR + .RS 4 +-Java¥Ò¡¼¥×¤ò\fIhprof\fR¥Ð¥¤¥Ê¥ê·Á¼°¤Ç\fIfilename\fR¤Ë¥À¥ó¥×¤·¤Þ¤¹¡£\fIlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¤¬¡¢»ØÄꤷ¤¿¾ì¹ç¡¢¥Ò¡¼¥×Æâ¤Î¥¢¥¯¥Æ¥£¥Ö¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¤ß¤¬¥À¥ó¥×¤µ¤ì¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢jhat(1)¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÀ¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¤Þ¤¹¡£ ++Java¥Ò¡¼¥×¤ò\fBhprof\fR¥Ð¥¤¥Ê¥ê·Á¼°¤Ç\fBfilename\fR¤Ë¥À¥ó¥×¤·¤Þ¤¹¡£\fBlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¤¬¡¢»ØÄꤷ¤¿¾ì¹ç¡¢¥Ò¡¼¥×Æâ¤Î¥¢¥¯¥Æ¥£¥Ö¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¤ß¤¬¥À¥ó¥×¤µ¤ì¤Þ¤¹¡£¥Ò¡¼¥×¡¦¥À¥ó¥×¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢jhat(1)¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÀ¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤òÆɤ߼è¤ê¤Þ¤¹¡£ + .RE + .PP + \-finalizerinfo +@@ -143,7 +145,7 @@ + .PP + \-histo[:live] + .RS 4 +-¥Ò¡¼¥×¤Î¥Ò¥¹¥È¥°¥é¥à¤ò½ÐÎϤ·¤Þ¤¹¡£Java¥¯¥é¥¹¤´¤È¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¡¢¥Ð¥¤¥Èñ°Ì¤Ç¤Î¥á¥â¥ê¡¼¡¦¥µ¥¤¥º¡¢¤ª¤è¤Ó´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£JVM¤ÎÆâÉô¥¯¥é¥¹Ì¾¤Ï¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ÎÀÜƬ¼­¤òÉÕ¤±¤Æ½ÐÎϤµ¤ì¤Þ¤¹¡£\fIlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¤ß¤¬¥«¥¦¥ó¥È¤µ¤ì¤Þ¤¹¡£ ++¥Ò¡¼¥×¤Î¥Ò¥¹¥È¥°¥é¥à¤ò½ÐÎϤ·¤Þ¤¹¡£Java¥¯¥é¥¹¤´¤È¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¡¢¥Ð¥¤¥Èñ°Ì¤Ç¤Î¥á¥â¥ê¡¼¡¦¥µ¥¤¥º¡¢¤ª¤è¤Ó´°Á´½¤¾þ¥¯¥é¥¹Ì¾¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£JVM¤ÎÆâÉô¥¯¥é¥¹Ì¾¤Ï¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ÎÀÜƬ¼­¤òÉÕ¤±¤Æ½ÐÎϤµ¤ì¤Þ¤¹¡£\fBlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Î¤ß¤¬¥«¥¦¥ó¥È¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-clstats +@@ -153,7 +155,7 @@ + .PP + \-F + .RS 4 +-¶¯À©¤·¤Þ¤¹¡£PID¤¬±þÅú¤·¤Ê¤¤¤È¤­¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fIjmap \-dump\fR¤Þ¤¿¤Ï\fIjmap \-histo\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢\fIlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£ ++¶¯À©¤·¤Þ¤¹¡£PID¤¬±þÅú¤·¤Ê¤¤¤È¤­¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fBjmap \-dump\fR¤Þ¤¿¤Ï\fBjmap \-histo\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢\fBlive\fR¥µ¥Ö¥ª¥×¥·¥ç¥ó¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .PP + \-h +@@ -168,7 +170,7 @@ + .PP + \-J\fIflag\fR + .RS 4 +-\fIjmap\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava²¾ÁÛ¥Þ¥·¥ó¤Ë\fIflag\fR¤òÅϤ·¤Þ¤¹¡£ ++\fBjmap\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava Virtual Machine¤Ë\fBflag\fR¤òÅϤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jps.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jps.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jps +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jps ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jps" "1" "2013ǯ11·î21Æü" "JDK 8" "¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jps \- ¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¾å¤Ç·×¬¤µ¤ì¤¿Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjps\fR [ \fIoptions\fR ] [ \fIhostid\fR ] ++\fBjps\fR [ \fIoptions\fR ] [ \fIhostid\fR ] + .fi + .if n \{\ + .RE +@@ -64,41 +66,41 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIhostid\fR + .RS 4 +-¥×¥í¥»¥¹¡¦¥ì¥Ý¡¼¥È¤òÀ¸À®¤¹¤ë¥Û¥¹¥È¤Î¼±Ê̻ҡ£\fIhostid\fR¤Ë¤Ï¡¢ÄÌ¿®¥×¥í¥È¥³¥ë¡¢¥Ý¡¼¥ÈÈֹ桢¼ÂÁõ¤Ë¸ÇÍ­¤Ê¾¤Î¥Ç¡¼¥¿¤ò»ØÄꤷ¤¿¥ª¥×¥·¥ç¥ó¡¦¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Û¥¹¥È¼±Ê̻Ҥò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥×¥í¥»¥¹¡¦¥ì¥Ý¡¼¥È¤òÀ¸À®¤¹¤ë¥Û¥¹¥È¤Î¼±Ê̻ҡ£\fBhostid\fR¤Ë¤Ï¡¢ÄÌ¿®¥×¥í¥È¥³¥ë¡¢¥Ý¡¼¥ÈÈֹ桢¼ÂÁõ¤Ë¸ÇÍ­¤Ê¾¤Î¥Ç¡¼¥¿¤ò»ØÄꤷ¤¿¥ª¥×¥·¥ç¥ó¡¦¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Û¥¹¥È¼±Ê̻Ҥò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¾å¤Ç·×¬¤µ¤ì¤¿Java HotSpot VM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤Ç¤­¤ë¥ì¥Ý¡¼¥È¾ðÊó¤Ï¡¢¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤¿JVM¤Ë´Ø¤¹¤ë¤â¤Î¤Ë¸ÂÄꤵ¤ì¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¾å¤Ç·×¬¤µ¤ì¤¿Java HotSpot VM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤Ç¤­¤ë¥ì¥Ý¡¼¥È¾ðÊó¤Ï¡¢¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤¿JVM¤Ë´Ø¤¹¤ë¤â¤Î¤Ë¸ÂÄꤵ¤ì¤Þ¤¹¡£ + .PP +-\fIhostid\fR¤ò»ØÄꤻ¤º¤Ë\fIjps\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ç·×¬¤µ¤ì¤¿JVM¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£\fIhostid\fR¤ò»ØÄꤷ¤Æµ¯Æ°¤·¤¿¾ì¹ç¡¢»ØÄꤵ¤ì¤¿¥×¥í¥È¥³¥ë¤È¥Ý¡¼¥È¤ò»ÈÍѤ·¤Æ¡¢»ØÄꤵ¤ì¤¿¥Û¥¹¥È¾å¤ÎJVM¤ò¸¡º÷¤·¤Þ¤¹¡£\fIjstatd\fR¥×¥í¥»¥¹¤¬¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤵ¤ì¤Þ¤¹¡£ ++\fBhostid\fR¤ò»ØÄꤻ¤º¤Ë\fBjps\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¾ì¹ç¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ç·×¬¤µ¤ì¤¿JVM¤¬¸¡º÷¤µ¤ì¤Þ¤¹¡£\fBhostid\fR¤ò»ØÄꤷ¤Æµ¯Æ°¤·¤¿¾ì¹ç¡¢»ØÄꤵ¤ì¤¿¥×¥í¥È¥³¥ë¤È¥Ý¡¼¥È¤ò»ÈÍѤ·¤Æ¡¢»ØÄꤵ¤ì¤¿¥Û¥¹¥È¾å¤ÎJVM¤ò¸¡º÷¤·¤Þ¤¹¡£\fBjstatd\fR¥×¥í¥»¥¹¤¬¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤵ¤ì¤Þ¤¹¡£ + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤Ç·×¬¤µ¤ì¤¿³ÆJVM¤Ë¤Ä¤¤¤Æ¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҡ¢¤Ä¤Þ¤ê\fIlvmid\fR¤ò¥ì¥Ý¡¼¥È¤·¤Þ¤¹¡£\fIlvmid\fR¤Ï¡¢°ìÈÌŪ¤Ë¤ÏJVM¥×¥í¥»¥¹¤ËÂФ¹¤ë¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥×¥í¥»¥¹¼±Ê̻ҤǤ¹¤¬¡¢É¬¤º¤·¤â¤½¤¦¤Ç¤¢¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fIjps\fR¤Ë¤è¤Ã¤Æ¡¢³ÆJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fIlvmid\fR¤¬°ìÍ÷ɽ¼¨¤µ¤ì¡¢¤½¤ì¤¾¤ì¤Ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤¬´Êñ¤Ê·Á¼°¤Ç¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î´Êñ¤Ê·Á¼°¤Î¥¯¥é¥¹Ì¾¤ÈJAR¥Õ¥¡¥¤¥ë̾¤Ç¤Ï¡¢¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸¾ðÊó¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¾ðÊ󤬾Êά¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤Ç·×¬¤µ¤ì¤¿³ÆJVM¤Ë¤Ä¤¤¤Æ¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҡ¢¤Ä¤Þ¤ê\fBlvmid\fR¤ò¥ì¥Ý¡¼¥È¤·¤Þ¤¹¡£\fBlvmid\fR¤Ï¡¢°ìÈÌŪ¤Ë¤ÏJVM¥×¥í¥»¥¹¤ËÂФ¹¤ë¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥×¥í¥»¥¹¼±Ê̻ҤǤ¹¤¬¡¢É¬¤º¤·¤â¤½¤¦¤Ç¤¢¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢\fBjps\fR¤Ë¤è¤Ã¤Æ¡¢³ÆJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fBlvmid\fR¤¬°ìÍ÷ɽ¼¨¤µ¤ì¡¢¤½¤ì¤¾¤ì¤Ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤¬´Êñ¤Ê·Á¼°¤Ç¼¨¤µ¤ì¤Þ¤¹¡£¤³¤Î´Êñ¤Ê·Á¼°¤Î¥¯¥é¥¹Ì¾¤ÈJAR¥Õ¥¡¥¤¥ë̾¤Ç¤Ï¡¢¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸¾ðÊó¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë¡¦¥Ñ¥¹¾ðÊ󤬾Êά¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æmain¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤È°ú¿ô¤ò¸¡º÷¤·¤Þ¤¹¡£Æȼ«¤Îµ¯Æ°¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¥¿¡¼¥²¥Ã¥ÈJVM¤òµ¯Æ°¤·¤¿¾ì¹ç¤Ï¡¢\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤È°ú¿ô¤ÏÍøÍѤǤ­¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fIjps\fR¥³¥Þ¥ó¥É¤Ï¡¢\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤È°ú¿ô¤ËÂФ·¤Æ¡¢Ê¸»úÎó\fIUnknown\fR¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Ï¡¢Javaµ¯Æ°¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æmain¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤È°ú¿ô¤ò¸¡º÷¤·¤Þ¤¹¡£Æȼ«¤Îµ¯Æ°¥Ä¡¼¥ë¤ò»ÈÍѤ·¤Æ¥¿¡¼¥²¥Ã¥ÈJVM¤òµ¯Æ°¤·¤¿¾ì¹ç¤Ï¡¢\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤È°ú¿ô¤ÏÍøÍѤǤ­¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fBjps\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤È°ú¿ô¤ËÂФ·¤Æ¡¢Ê¸»úÎó\fBUnknown\fR¤ò½ÐÎϤ·¤Þ¤¹¡£ + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¤ëJVM¤Î¥ê¥¹¥È¤Ï¡¢¤³¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¥×¥ê¥ó¥·¥Ñ¥ë¤ËÍ¿¤¨¤é¤ì¤¿¥¢¥¯¥»¥¹¸¢¤Ë´ð¤Å¤­¡¢À©¸Â¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥àÆȼ«¤Î¥¢¥¯¥»¥¹À©¸æµ¡¹½¤Ë¤è¤ë·èÄê¤Ë´ð¤Å¤¤¤Æ¡¢¥×¥ê¥ó¥·¥Ñ¥ë¤Ë¥¢¥¯¥»¥¹¸¢¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤ëJVM¤Î¤ß¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¤ëJVM¤Î¥ê¥¹¥È¤Ï¡¢¤³¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¥×¥ê¥ó¥·¥Ñ¥ë¤ËÍ¿¤¨¤é¤ì¤¿¥¢¥¯¥»¥¹¸¢¤Ë´ð¤Å¤­¡¢À©¸Â¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥àÆȼ«¤Î¥¢¥¯¥»¥¹À©¸æµ¡¹½¤Ë¤è¤ë·èÄê¤Ë´ð¤Å¤¤¤Æ¡¢¥×¥ê¥ó¥·¥Ñ¥ë¤Ë¥¢¥¯¥»¥¹¸¢¤¬Í¿¤¨¤é¤ì¤Æ¤¤¤ëJVM¤Î¤ß¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥³¥Þ¥ó¥É¤Î½ÐÎϤòÊѹ¹¤¹¤ë¥ª¥×¥·¥ç¥ó¤¬Â¿¿ô¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¾­Íè¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Êѹ¹¤Þ¤¿¤ÏÇѻߤµ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥³¥Þ¥ó¥É¤Î½ÐÎϤòÊѹ¹¤¹¤ë¥ª¥×¥·¥ç¥ó¤¬Â¿¿ô¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¾­Íè¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Êѹ¹¤Þ¤¿¤ÏÇѻߤµ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .PP + \-q + .RS 4 +-¥¯¥é¥¹Ì¾¡¢JAR¥Õ¥¡¥¤¥ë̾¡¢¤ª¤è¤Ó\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤¿°ú¿ô¤Î½ÐÎϤòÍÞÀ©¤·¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҤΰìÍ÷¤Î¤ß¤òÀ¸À®¤·¤Þ¤¹¡£ ++¥¯¥é¥¹Ì¾¡¢JAR¥Õ¥¡¥¤¥ë̾¡¢¤ª¤è¤Ó\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤¿°ú¿ô¤Î½ÐÎϤòÍÞÀ©¤·¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҤΰìÍ÷¤Î¤ß¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP + \-m + .RS 4 +-\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î½ÐÎϤϡ¢ÁȤ߹þ¤Þ¤ì¤Æ¤¤¤ëJVM¤ËÂФ·¤Æ\fInull\fR¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¡£ ++\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î½ÐÎϤϡ¢ÁȤ߹þ¤Þ¤ì¤Æ¤¤¤ëJVM¤ËÂФ·¤Æ\fBnull\fR¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-l + .RS 4 +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fImain\fR¥¯¥é¥¹¤Î¥Õ¥ë¡¦¥Ñ¥Ã¥±¡¼¥¸Ì¾¡¢¤Þ¤¿¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Õ¥ë¥Ñ¥¹Ì¾¤ò½ÐÎϤ·¤Þ¤¹¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fBmain\fR¥¯¥é¥¹¤Î¥Õ¥ë¡¦¥Ñ¥Ã¥±¡¼¥¸Ì¾¡¢¤Þ¤¿¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎJAR¥Õ¥¡¥¤¥ë¤Ø¤Î¥Õ¥ë¥Ñ¥¹Ì¾¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-v +@@ -111,19 +113,20 @@ + ¥¯¥é¥¹Ì¾¡¢JAR¥Õ¥¡¥¤¥ë̾¡¢¤ª¤è¤Ómai¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤¿°ú¿ô¤Î½ÐÎϤòÍÞÀ©¤·¡¢¥í¡¼¥«¥ëVM¼±Ê̻ҤΰìÍ÷¤Î¤ß¤òÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP +-\-J\fIoption\fR ++\-J\fBoption\fR + .RS 4 +-JVM¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë\fI¥ª¥×¥·¥ç¥ó\fR¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++JVM¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë\fB¥ª¥×¥·¥ç¥ó\fR¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥Û¥¹¥È¼±ÊÌ»Ò" + .PP +-¥Û¥¹¥È¼±Ê̻ҡ¢¤Ä¤Þ¤ê\fIhostid\fR¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¹¡£\fIhostid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ ++¥Û¥¹¥È¼±Ê̻ҡ¢¤Ä¤Þ¤ê\fBhostid\fR¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤ò¼¨¤¹Ê¸»úÎó¤Ç¤¹¡£\fBhostid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-[protocol:][[//]hostname][:port][/servername] ++\fB[protocol:][[//]hostname][:port][/servername]\fR ++ + .fi + .if n \{\ + .RE +@@ -131,45 +134,46 @@ + .PP + \fIprotocol\fR + .RS 4 +-ÄÌ¿®¥×¥í¥È¥³¥ë¤Ç¤¹¡£\fIprotocol\fR¤¬¾Êά¤µ¤ì¡¢\fIhostname\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥È¥³¥ë¤¬¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£¥×¥í¥È¥³¥ë¤¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥È¥³¥ë¤Ï\fIrmi\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ÄÌ¿®¥×¥í¥È¥³¥ë¤Ç¤¹¡£\fBprotocol\fR¤¬¾Êά¤µ¤ì¡¢\fBhostname\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥È¥³¥ë¤¬¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£¥×¥í¥È¥³¥ë¤¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥È¥³¥ë¤Ï\fBrmi\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + hostname + .RS 4 +-¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¤ò¼¨¤¹¥Û¥¹¥È̾¤Þ¤¿¤ÏIP¥¢¥É¥ì¥¹¤Ç¤¹¡£\fIhostname\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¤Ï¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¤ò¼¨¤¹¥Û¥¹¥È̾¤Þ¤¿¤ÏIP¥¢¥É¥ì¥¹¤Ç¤¹¡£\fBhostname\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥Û¥¹¥È¤Ï¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + port + .RS 4 +-¥ê¥â¡¼¥È¡¦¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ë¤¿¤á¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¤¹¡£\fIhostname\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fIprotocol\fR¥Ñ¥é¥á¡¼¥¿¤¬¡¢ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤ò»ØÄꤷ¤Æ¤¤¤ë¾ì¹ç¡¢\fIport\fR¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fIport\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î +-\fIrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢\fIport\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Îrmiregistry¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¼¨¤·¤Þ¤¹¡£\fIport\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fIprotocol\fR¥Ñ¥é¥á¡¼¥¿¤¬\fIrmi\fR¤ò¼¨¤·¤Æ¤¤¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(1099)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥ê¥â¡¼¥È¡¦¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ë¤¿¤á¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¤¹¡£\fBhostname\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fBprotocol\fR¥Ñ¥é¥á¡¼¥¿¤¬¡¢ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤ò»ØÄꤷ¤Æ¤¤¤ë¾ì¹ç¡¢\fBport\fR¥Ñ¥é¥á¡¼¥¿¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fBport\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î ++\fBrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢\fBport\fR¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Îrmiregistry¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¼¨¤·¤Þ¤¹¡£\fBport\fR¥Ñ¥é¥á¡¼¥¿¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢\fBprotocol\fR¥Ñ¥é¥á¡¼¥¿¤¬\fBrmi\fR¤ò¼¨¤·¤Æ¤¤¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(1099)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .RE + .PP + servername + .RS 4 +-¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fIrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤ÎRMI¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤ò¼¨¤¹Ê¸»úÎó¤Ë¤Ê¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fIjstatd\fR¥³¥Þ¥ó¥É¤Î\fI\-n\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fBrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Ñ¥é¥á¡¼¥¿¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤ÎRMI¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤ò¼¨¤¹Ê¸»úÎó¤Ë¤Ê¤ê¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fBjstatd\fR¥³¥Þ¥ó¥É¤Î\fB\-n\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "½ÐÎÏ¥Õ¥©¡¼¥Þ¥Ã¥È" + .PP +-\fIjps\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤϡ¢¼¡¤Î¥Ñ¥¿¡¼¥ó¤Ë½¾¤¤¤Þ¤¹¡£ ++\fBjps\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤϡ¢¼¡¤Î¥Ñ¥¿¡¼¥ó¤Ë½¾¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ] ++\fBlvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤¹¤Ù¤Æ¤Î½ÐÎϥȡ¼¥¯¥ó¤Ï¶õÇòʸ»ú¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£\fIarg\fRÃͤÎÃæ¤Ç¶õÇò¤ò»ÈÍѤ¹¤ë¤È¡¢¼ÂºÝ¤ÎÄê°ÌÃ֥ѥé¥á¡¼¥¿¤Ë°ú¿ô¤ò¥Þ¥Ã¥Ô¥ó¥°¤·¤è¤¦¤È¤¹¤ë¤È¤­¤Ë¡¢¤¢¤¤¤Þ¤¤¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¤¹¤Ù¤Æ¤Î½ÐÎϥȡ¼¥¯¥ó¤Ï¶õÇòʸ»ú¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£\fBarg\fRÃͤÎÃæ¤Ç¶õÇò¤ò»ÈÍѤ¹¤ë¤È¡¢¼ÂºÝ¤ÎÄê°ÌÃ֥ѥé¥á¡¼¥¿¤Ë°ú¿ô¤ò¥Þ¥Ã¥Ô¥ó¥°¤·¤è¤¦¤È¤¹¤ë¤È¤­¤Ë¡¢¤¢¤¤¤Þ¤¤¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤³¤Î·Á¼°¤ÏÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¡¢\fIjps\fR¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤ÏºîÀ®¤·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£\fIjps\fR½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤òºîÀ®¤¹¤ë¤È¡¢¤³¤Î¥Ä¡¼¥ë¤Î¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¡¢ºîÀ®¤·¤¿¥¹¥¯¥ê¥×¥È¤ÎÊѹ¹¤¬É¬Íפˤʤë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ++¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤³¤Î·Á¼°¤ÏÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¡¢\fBjps\fR¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤ÏºîÀ®¤·¤Ê¤¤¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£\fBjps\fR½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤òºîÀ®¤¹¤ë¤È¡¢¤³¤Î¥Ä¡¼¥ë¤Î¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¡¢ºîÀ®¤·¤¿¥¹¥¯¥ê¥×¥È¤ÎÊѹ¹¤¬É¬Íפˤʤë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .SH "Îã" + .PP +-¤³¤Î¹à¤Ç¤Ï¡¢\fIjps\fR¥³¥Þ¥ó¥É¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£ ++¤³¤Î¹à¤Ç¤Ï¡¢\fBjps\fR¥³¥Þ¥ó¥É¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£ + .PP + ¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤¹¤ë¾ì¹ç: + .sp +@@ -177,38 +181,41 @@ + .RS 4 + .\} + .nf +-jps +-18027 Java2Demo\&.JAR +-18032 jps +-18005 jstat ++\fBjps\fR ++\fB18027 Java2Demo\&.JAR\fR ++\fB18032 jps\fR ++\fB18005 jstat\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fIjstat\fR¥µ¡¼¥Ð¡¼¤È¡¢¤½¤ÎÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤Þ¤¿¤ÏÊ̤γ°Éôrmiregistry¥×¥í¥»¥¹¤Î¤¤¤º¤ì¤«¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Ø¤ÎÍ­¸ú¤Ê¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤âÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÎã¤Ë¤Ï¡¢\fI\-l\fR¥ª¥×¥·¥ç¥ó¤â´Þ¤Þ¤ì¡¢¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤ò¾ÜºÙ¤Ê·Á¼°¤Ç½ÐÎϤ·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢\fBjstat\fR¥µ¡¼¥Ð¡¼¤È¡¢¤½¤ÎÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤Þ¤¿¤ÏÊ̤γ°Éôrmiregistry¥×¥í¥»¥¹¤Î¤¤¤º¤ì¤«¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Ø¤ÎÍ­¸ú¤Ê¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤âÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÎã¤Ë¤Ï¡¢\fB\-l\fR¥ª¥×¥·¥ç¥ó¤â´Þ¤Þ¤ì¡¢¥¯¥é¥¹Ì¾¤Þ¤¿¤ÏJAR¥Õ¥¡¥¤¥ë̾¤ò¾ÜºÙ¤Ê·Á¼°¤Ç½ÐÎϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jps \-l remote\&.domain +-3002 /opt/jdk1\&.7\&.0/demo/jfc/Java2D/Java2Demo\&.JAR +-2857 sun\&.tools\&.jstatd\&.jstatd ++\fBjps \-l remote\&.domain\fR ++\fB3002 /opt/jdk1\&.7\&.0/demo/jfc/Java2D/Java2Demo\&.JAR\fR ++\fB2857 sun\&.tools\&.jstatd\&.jstatd\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢RMI¥ì¥¸¥¹¥È¥ê¤Ë¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤Ê¤¤¥Ý¡¼¥È¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤¬¥Ý¡¼¥È2002¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fIjstatd\fR¥µ¡¼¥Ð¡¼¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢\fI\-m\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢°ìÍ÷ɽ¼¨¤µ¤ì¤¿¤½¤ì¤¾¤ì¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fImain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¤òÁȤ߹þ¤ó¤Ç¤¤¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢RMI¥ì¥¸¥¹¥È¥ê¤Ë¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤Ê¤¤¥Ý¡¼¥È¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç·×¬¤µ¤ì¤¿JVM¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤¬¥Ý¡¼¥È2002¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fBjstatd\fR¥µ¡¼¥Ð¡¼¤¬¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢\fB\-m\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢°ìÍ÷ɽ¼¨¤µ¤ì¤¿¤½¤ì¤¾¤ì¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î\fBmain\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤ë°ú¿ô¤òÁȤ߹þ¤ó¤Ç¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jps \-m remote\&.domain:2002 +-3002 /opt/jdk1\&.7\&.0/demo/jfc/Java2D/Java2Demo\&.JAR +-3102 sun\&.tools\&.jstatd\&.jstatd \-p 2002 ++\fBjps \-m remote\&.domain:2002\fR ++\fB3002 /opt/jdk1\&.7\&.0/demo/jfc/Java2D/Java2Demo\&.JAR\fR ++\fB3102 sun\&.tools\&.jstatd\&.jstatd \-p 2002\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jrunscript.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jrunscript.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jrunscript +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥¹¥¯¥ê¥×¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jrunscript ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥¹¥¯¥ê¥×¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jrunscript" "1" "2013ǯ11·î21Æü" "JDK 8" "¥¹¥¯¥ê¥×¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jrunscript \- ÂÐÏ÷¿¥â¡¼¥É¤È¥Ð¥Ã¥Á¡¦¥â¡¼¥É¤ò¥µ¥Ý¡¼¥È¤¹¤ë¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¹¥¯¥ê¥×¥È¡¦¥·¥§¥ë¤ò¼Â¹Ô¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ++.SH "̾Á°" ++jrunscript \- ÂÐÏ÷¿¥â¡¼¥É¤È¥Ð¥Ã¥Á¡¦¥â¡¼¥É¤ò¥µ¥Ý¡¼¥È¤¹¤ë¥³¥Þ¥ó¥É¹Ô¥¹¥¯¥ê¥×¥È¡¦¥·¥§¥ë¤ò¼Â¹Ô¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjrunscript\fR [\fIoptions\fR] [\fIarguments\fR] ++\fBjrunscript\fR [\fIoptions\fR] [\fIarguments\fR] + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIarguments\fR +@@ -73,7 +75,7 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjrunscript\fR¥³¥Þ¥ó¥É¤Ï¡¢¸À¸ì¤Ë°Í¸¤·¤Ê¤¤¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¹¥¯¥ê¥×¥È¡¦¥·¥§¥ë¤Ç¤¹¡£\fIjrunscript\fR¤Ï¡¢ÂÐÏ÷¿(read\-eval\-print)¥â¡¼¥É¤È¥Ð¥Ã¥Á(\fI\-f\fR¥ª¥×¥·¥ç¥ó)¡¦¥â¡¼¥É¤ÎξÊý¤Î¥¹¥¯¥ê¥×¥È¼Â¹Ô¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î»ÈÍѸÀ¸ì¤ÏJavaScript¤Ç¤¹¤¬¡¢\fI\-l\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ì¤Ð¾¤Î¸À¸ì¤â»ØÄê¤Ç¤­¤Þ¤¹¡£\fIjrunscript\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¤È¥¹¥¯¥ê¥×¥È¸À¸ì¤È¤ÎÄÌ¿®¤ò»ÈÍѤ·¤ÆõµáŪ¤Ê¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ ++\fBjrunscript\fR¥³¥Þ¥ó¥É¤Ï¡¢¸À¸ì¤Ë°Í¸¤·¤Ê¤¤¥³¥Þ¥ó¥É¹Ô¥¹¥¯¥ê¥×¥È¡¦¥·¥§¥ë¤Ç¤¹¡£\fBjrunscript\fR¤Ï¡¢ÂÐÏ÷¿(read\-eval\-print)¥â¡¼¥É¤È¥Ð¥Ã¥Á(\fB\-f\fR¥ª¥×¥·¥ç¥ó)¡¦¥â¡¼¥É¤ÎξÊý¤Î¥¹¥¯¥ê¥×¥È¼Â¹Ô¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î»ÈÍѸÀ¸ì¤ÏJavaScript¤Ç¤¹¤¬¡¢\fB\-l\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ì¤Ð¾¤Î¸À¸ì¤â»ØÄê¤Ç¤­¤Þ¤¹¡£\fBjrunscript\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¤È¥¹¥¯¥ê¥×¥È¸À¸ì¤È¤ÎÄÌ¿®¤ò»ÈÍѤ·¤ÆõµáŪ¤Ê¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-classpath \fIpath\fR +@@ -83,8 +85,8 @@ + .PP + \-cp \fIpath\fR + .RS 4 +-\fI\-classpath\fR +-\fIpath\fR¤ÈƱ¤¸¤Ç¤¹¡£ ++\fB\-classpath\fR ++\fBpath\fR¤ÈƱ¤¸¤Ç¤¹¡£ + .RE + .PP + \-D\fIname\fR=\fIvalue\fR +@@ -94,17 +96,17 @@ + .PP + \-J\fIflag\fR + .RS 4 +-\fIflag\fR¤ò¡¢\fIjrunscript\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëJava²¾ÁÛ¥Þ¥·¥ó¤ËľÀÜÅϤ·¤Þ¤¹¡£ ++\fBflag\fR¤ò¡¢\fBjrunscript\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëJava Virtual Machine¤ËľÀÜÅϤ·¤Þ¤¹¡£ + .RE + .PP + \-I \fIlanguage\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥¹¥¯¥ê¥×¥È¸À¸ì¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏJavaScript¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£Â¾¤Î¥¹¥¯¥ê¥×¥È¸À¸ì¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fI\-cp\fR¤Þ¤¿¤Ï\fI\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Âбþ¤¹¤ë¥¹¥¯¥ê¥×¥È¡¦¥¨¥ó¥¸¥ó¤ÎJAR¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥¹¥¯¥ê¥×¥È¸À¸ì¤ò»ÈÍѤ·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏJavaScript¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£Â¾¤Î¥¹¥¯¥ê¥×¥È¸À¸ì¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fB\-cp\fR¤Þ¤¿¤Ï\fB\-classpath\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Âбþ¤¹¤ë¥¹¥¯¥ê¥×¥È¡¦¥¨¥ó¥¸¥ó¤ÎJAR¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-e \fIscript\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥¹¥¯¥ê¥×¥È¤òɾ²Á¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¤¹¤Ù¤Æ¤¬»ØÄꤵ¤ì¤¿1¹Ô¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥¹¥¯¥ê¥×¥È¤òɾ²Á¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ì¤Ð¡¢¥³¥Þ¥ó¥É¹Ô¤Ë¤¹¤Ù¤Æ¤¬»ØÄꤵ¤ì¤¿1¹Ô¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \-encoding \fIencoding\fR +@@ -138,7 +140,7 @@ + .RE + .SH "°ú¿ô" + .PP +-arguments¤¬Â¸ºß¤·¤Æ¤¤¤Æ¡¢¤«¤Ä\fI\-e\fR¡¢\fI\-f\fR¤Î¤¤¤º¤ì¤Î¥ª¥×¥·¥ç¥ó¤â»ÈÍѤµ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢ºÇ½é¤Î°ú¿ô¤¬¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤È¤Ê¤ê¡¢Â¾¤Î°ú¿ô¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£arguments¤È¡¢\fI\-e\fR¤Þ¤¿¤Ï\fI\-f\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤¹¤Ù¤Æ¤Îarguments¤¬¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£arguments¡¢\fI\-e\fR¡¢\fI\-f\fR¤¬¤É¤ì¤â¸ºß¤·¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢ÂÐÏ÷¿¥â¡¼¥É¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥¹¥¯¥ê¥×¥È¤«¤é¥¹¥¯¥ê¥×¥È°ú¿ô¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fIarguments\fR¤È¤¤¤¦Ì¾Á°¤Î\fIString\fRÇÛÎ󷿤Υ¨¥ó¥¸¥óÊÑ¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£ ++arguments¤¬Â¸ºß¤·¤Æ¤¤¤Æ¡¢¤«¤Ä\fB\-e\fR¡¢\fB\-f\fR¤Î¤¤¤º¤ì¤Î¥ª¥×¥·¥ç¥ó¤â»ÈÍѤµ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢ºÇ½é¤Î°ú¿ô¤¬¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤È¤Ê¤ê¡¢Â¾¤Î°ú¿ô¤¬Â¸ºß¤¹¤ë¾ì¹ç¤Ï¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£arguments¤È¡¢\fB\-e\fR¤Þ¤¿¤Ï\fB\-f\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤¹¤Ù¤Æ¤Îarguments¤¬¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£arguments¡¢\fB\-e\fR¡¢\fB\-f\fR¤¬¤É¤ì¤â¸ºß¤·¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢ÂÐÏ÷¿¥â¡¼¥É¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥¹¥¯¥ê¥×¥È¤«¤é¥¹¥¯¥ê¥×¥È°ú¿ô¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢\fBarguments\fR¤È¤¤¤¦Ì¾Á°¤Î\fBString\fRÇÛÎ󷿤Υ¨¥ó¥¸¥óÊÑ¿ô¤ò»ÈÍѤ·¤Þ¤¹¡£ + .SH "Îã" + .SS "¥¤¥ó¥é¥¤¥ó¡¦¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô" + .sp +@@ -146,8 +148,9 @@ + .RS 4 + .\} + .nf +-jrunscript \-e "print(\*(Aqhello world\*(Aq)" +-jrunscript \-e "cat(\*(Aqhttp://www\&.example\&.com\*(Aq)" ++\fBjrunscript \-e "print(\*(Aqhello world\*(Aq)"\fR ++\fBjrunscript \-e "cat(\*(Aqhttp://www\&.example\&.com\*(Aq)"\fR ++ + .fi + .if n \{\ + .RE +@@ -158,7 +161,8 @@ + .RS 4 + .\} + .nf +-jrunscript \-l js \-f test\&.js ++\fBjrunscript \-l js \-f test\&.js\fR ++ + .fi + .if n \{\ + .RE +@@ -169,38 +173,41 @@ + .RS 4 + .\} + .nf +-jrunscript +-js> print(\*(AqHello World\en\*(Aq); +-Hello World +-js> 34 + 55 +-89\&.0 +-js> t = new java\&.lang\&.Thread(function() { print(\*(AqHello World\en\*(Aq); }) +-Thread[Thread\-0,5,main] +-js> t\&.start() +-js> Hello World ++\fBjrunscript\fR ++\fBjs> print(\*(AqHello World\en\*(Aq);\fR ++\fBHello World\fR ++\fBjs> 34 + 55\fR ++\fB89\&.0\fR ++\fBjs> t = new java\&.lang\&.Thread(function() { print(\*(AqHello World\en\*(Aq); })\fR ++\fBThread[Thread\-0,5,main]\fR ++\fBjs> t\&.start()\fR ++\fBjs> Hello World\fR ++\fB \fR ++\fBjs>\fR + +-js> + .fi + .if n \{\ + .RE + .\} + .SS "¥¹¥¯¥ê¥×¥È°ú¿ô¤ò»ØÄꤷ¤¿¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤Î¼Â¹Ô" + .PP +-test\&.js¥Õ¥¡¥¤¥ë¤Ï¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£\fIarg1\fR¡¢\fIarg2\fR¤ª¤è¤Ó\fIarg3\fR¤Î³Æ°ú¿ô¤¬¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£¥¹¥¯¥ê¥×¥È¤ÏargumentsÇÛÎó¤ò»ÈÍѤ·¤Æ¤³¤ì¤é¤Î°ú¿ô¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£ ++test\&.js¥Õ¥¡¥¤¥ë¤Ï¥¹¥¯¥ê¥×¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¤¹¡£\fBarg1\fR¡¢\fBarg2\fR¤ª¤è¤Ó\fBarg3\fR¤Î³Æ°ú¿ô¤¬¥¹¥¯¥ê¥×¥È¤ËÅϤµ¤ì¤Þ¤¹¡£¥¹¥¯¥ê¥×¥È¤ÏargumentsÇÛÎó¤ò»ÈÍѤ·¤Æ¤³¤ì¤é¤Î°ú¿ô¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jrunscript test\&.js arg1 arg2 arg3 ++\fBjrunscript test\&.js arg1 arg2 arg3\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "´ØÏ¢¹àÌÜ" + .PP +-JavaScript¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼ÄêµÁ¥¹¥¯¥ê¥×¥È¤òɾ²Á¤¹¤ëÁ°¤Ë¡¢\fIjrunscript\fR¥³¥Þ¥ó¥É¤Ï¤¤¤¯¤Ä¤«¤ÎÁȹþ¤ß´Ø¿ô¤äÁȹþ¤ß¥ª¥Ö¥¸¥§¥¯¥È¤ò½é´ü²½¤·¤Þ¤¹¡£¤³¤ì¤é¤ÎJavaScript¤ÎÁȹþ¤ß¤Ë¤Ä¤¤¤Æ¤Ï¡¢http://code\&.google\&.com/p/jsdoc\-toolkit/¤Ë¤¢¤ë +-JsDoc\-Toolkit¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++JavaScript¤ò»ÈÍѤ·¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼ÄêµÁ¥¹¥¯¥ê¥×¥È¤òɾ²Á¤¹¤ëÁ°¤Ë¡¢\fBjrunscript\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÆÃÄê¤ÎÁȹþ¤ß´Ø¿ô¤ª¤è¤Ó¥ª¥Ö¥¸¥§¥¯¥È¤¬½é´ü²½¤µ¤ì¤Þ¤¹(¤³¤ì¤é¤Ë¤Ä¤¤¤Æ¤Ï¡¢¼¡¤Îjrunscript JavaScriptÁȹþ¤ß¤ÎAPI»ÅÍͤ˵­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹)¡£ ++.PP ++http://docs\&.oracle\&.com/javase/7/docs/technotes/tools/share/jsdocs/overview\-summary\&.html + .br + 'pl 8.5i + 'bp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jsadebugd.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jsadebugd.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jsadebugd +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jsadebugd ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jsadebugd" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jsadebugd \- Java¥×¥í¥»¥¹¤Þ¤¿¤Ï¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤ËÀܳ¤·¡¢¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤È¤·¤Æµ¡Ç½¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjsadebugd\fR \fIpid\fR [ \fIserver\-id\fR ] ++\fBjsadebugd\fR \fIpid\fR [ \fIserver\-id\fR ] + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjsadebugd\fR \fIexecutable\fR \fIcore\fR [ \fIserver\-id\fR ] ++\fBjsadebugd\fR \fIexecutable\fR \fIcore\fR [ \fIserver\-id\fR ] + .fi + .if n \{\ + .RE +@@ -93,23 +95,24 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjsadebugd\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥×¥í¥»¥¹¤Þ¤¿¤Ï¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤ËÀܳ¤·¡¢¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤È¤·¤Æµ¡Ç½¤·¤Þ¤¹¡£\fIjstack\fR¡¢\fIjmap\fR¤ª¤è¤Ó\fIjinfo\fR¤Ê¤É¤Î¥ê¥â¡¼¥È¡¦¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢Java Remote Method Invocation (RMI)¤ò»ÈÍѤ·¤Æ¤¤¤ë¥µ¡¼¥Ð¡¼¤ËÀܳ¤Ç¤­¤Þ¤¹¡£\fIjsadebugd\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ëÁ°¤Ë¡¢\fIrmiregistry\fR¥³¥Þ¥ó¥É¤ÇRMI¥ì¥¸¥¹¥È¥ê¤ò¼¡¤Î¤è¤¦¤Ëµ¯Æ°¤·¤Þ¤¹¡£\fI$JAVA_HOME\fR¤ÏJDK¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£ ++\fBjsadebugd\fR¥³¥Þ¥ó¥É¤Ï¡¢Java¥×¥í¥»¥¹¤Þ¤¿¤Ï¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤ËÀܳ¤·¡¢¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤È¤·¤Æµ¡Ç½¤·¤Þ¤¹¡£\fBjstack\fR¡¢\fBjmap\fR¤ª¤è¤Ó\fBjinfo\fR¤Ê¤É¤Î¥ê¥â¡¼¥È¡¦¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢Java Remote Method Invocation(RMI)¤ò»ÈÍѤ·¤Æ¤¤¤ë¥µ¡¼¥Ð¡¼¤ËÀܳ¤Ç¤­¤Þ¤¹¡£\fBjsadebugd\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ëÁ°¤Ë¡¢\fBrmiregistry\fR¥³¥Þ¥ó¥É¤ÇRMI¥ì¥¸¥¹¥È¥ê¤ò¼¡¤Î¤è¤¦¤Ëµ¯Æ°¤·¤Þ¤¹¡£\fI$JAVA_HOME\fR¤ÏJDK¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmiregistry \-J\-Xbootclasspath/p:$JAVA_HOME/lib/sajdi\&.jar ++\fBrmiregistry \-J\-Xbootclasspath/p:$JAVA_HOME/lib/sajdi\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-RMI¥ì¥¸¥¹¥È¥ê¤¬µ¯Æ°¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fIjsadebugd\fR¥³¥Þ¥ó¥É¤ÏRMI¥ì¥¸¥¹¥È¥ê¤òɸ½à(1099)¥Ý¡¼¥È¤ÇÆâÉô¤Çµ¯Æ°¤·¤Þ¤¹¡£¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Ï¡¢\fISIGINT\fR¤òÁ÷¿®¤¹¤ë¤³¤È¤Ë¤è¤êÄä»ß¤Ç¤­¤Þ¤¹¡£SIGINT¤òÁ÷¿®¤¹¤ë¤Ë¤Ï¡¢\fB[Ctrl] + [C]\fR¤ò²¡¤·¤Þ¤¹¡£ ++RMI¥ì¥¸¥¹¥È¥ê¤¬µ¯Æ°¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢\fBjsadebugd\fR¥³¥Þ¥ó¥É¤ÏRMI¥ì¥¸¥¹¥È¥ê¤òɸ½à(1099)¥Ý¡¼¥È¤ÇÆâÉô¤Çµ¯Æ°¤·¤Þ¤¹¡£¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Ï¡¢\fBSIGINT\fR¤òÁ÷¿®¤¹¤ë¤³¤È¤Ë¤è¤êÄä»ß¤Ç¤­¤Þ¤¹¡£SIGINT¤òÁ÷¿®¤¹¤ë¤Ë¤Ï¡¢\fB[Ctrl] + [C]\fR¤ò²¡¤·¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fIdbgeng\&.dll\fR¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fIPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£Îã: +-\fIs\fR\fIet PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR ++¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£\fBdbgeng\&.dll\fR¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£\fBPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£Îã: ++\fBs\fR\fBet PATH=%JDK_HOME%\ejre\ebin\eclient;%PATH%\fR + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jstack.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jstack.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jstack +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jstack ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jstack" "1" "2013ǯ11·î21Æü" "JDK 8" "¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jstack \- Java¥×¥í¥»¥¹¡¢¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ËÂФ¹¤ëJava¥¹¥ì¥Ã¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjstack\fR [ \fIoptions\fR ] \fIpid\fR ++\fBjstack\fR [ \fIoptions\fR ] \fIpid\fR + .fi + .if n \{\ + .RE +@@ -66,7 +68,7 @@ + .RS 4 + .\} + .nf +-\fIjstack\fR [ \fIoptions\fR ] \fIexecutable\fR \fIcore\fR ++\fBjstack\fR [ \fIoptions\fR ] \fIexecutable\fR \fIcore\fR + .fi + .if n \{\ + .RE +@@ -76,7 +78,7 @@ + .RS 4 + .\} + .nf +-\fIjstack\fR [ \fIoptions\fR ] [ \fIserver\-id\fR@ ] \fIremote\-hostname\-or\-IP\fR ++\fBjstack\fR [ \fIoptions\fR ] [ \fIserver\-id\fR@ ] \fIremote\-hostname\-or\-IP\fR + .fi + .if n \{\ + .RE +@@ -84,7 +86,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIpid\fR +@@ -104,7 +106,7 @@ + .PP + \fIremote\-hostname\-or\-IP\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fI¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fIIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Î\fB¥Û¥¹¥È̾\fR¤Þ¤¿¤Ï\fBIP\fR¥¢¥É¥ì¥¹¡£jsadebugd(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIserver\-id\fR +@@ -113,17 +115,18 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjstack\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¡¢¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ËÂФ¹¤ëJava¥¹¥ì¥Ã¥É¤ÎJava¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Þ¤¹¡£Java¥Õ¥ì¡¼¥à¤´¤È¤Ë¡¢¥Õ¥ë¥¯¥é¥¹Ì¾¡¢¥á¥½¥Ã¥É̾¡¢¥Ð¥¤¥È¥³¡¼¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹(bci)¡¢¤ª¤è¤Ó¹ÔÈÖ¹æ(ÍøÍѲÄǽ¤Ê¾ì¹ç)¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-m\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢\fIjstack\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¹¥ì¥Ã¥É¤ÎJava¥Õ¥ì¡¼¥à¤È¥Í¥¤¥Æ¥£¥Ö¡¦¥Õ¥ì¡¼¥à¤ÎξÊý¤ò¡¢¥×¥í¥°¥é¥à¡¦¥«¥¦¥ó¥¿(PC)¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£¥Í¥¤¥Æ¥£¥Ö¡¦¥Õ¥ì¡¼¥à¤´¤È¤Ë¡¢PC¤ËºÇ¤â¶á¤¤¥Í¥¤¥Æ¥£¥Ö¡¦¥·¥ó¥Ü¥ë(ÍøÍѲÄǽ¤Ê¾ì¹ç)¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£C++ʬ²ò̾¤Ïʬ²ò²ò½ü¤µ¤ì¤Þ¤»¤ó¡£C++̾¤òʬ²ò²ò½ü¤¹¤ë¤Ë¤Ï¡¢¤³¤Î¥³¥Þ¥ó¥É¤Î½ÐÎϤò\fIc++filt\fR¤Ë¥Ñ¥¤¥×¤·¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJava²¾ÁÛ¥Þ¥·¥ó¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fI\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(Îã: +-\fIjstack \-J\-d64 \-m pid\fR)¡£ ++\fBjstack\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿Java¥×¥í¥»¥¹¡¢¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤ËÂФ¹¤ëJava¥¹¥ì¥Ã¥É¤ÎJava¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤ò½ÐÎϤ·¤Þ¤¹¡£Java¥Õ¥ì¡¼¥à¤´¤È¤Ë¡¢¥Õ¥ë¥¯¥é¥¹Ì¾¡¢¥á¥½¥Ã¥É̾¡¢¥Ð¥¤¥È¥³¡¼¥É¡¦¥¤¥ó¥Ç¥Ã¥¯¥¹(bci)¡¢¤ª¤è¤Ó¹ÔÈÖ¹æ(ÍøÍѲÄǽ¤Ê¾ì¹ç)¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-m\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢\fBjstack\fR¥³¥Þ¥ó¥É¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¹¥ì¥Ã¥É¤ÎJava¥Õ¥ì¡¼¥à¤È¥Í¥¤¥Æ¥£¥Ö¡¦¥Õ¥ì¡¼¥à¤ÎξÊý¤ò¡¢¥×¥í¥°¥é¥à¡¦¥«¥¦¥ó¥¿(PC)¤È¤È¤â¤Ë½ÐÎϤ·¤Þ¤¹¡£¥Í¥¤¥Æ¥£¥Ö¡¦¥Õ¥ì¡¼¥à¤´¤È¤Ë¡¢PC¤ËºÇ¤â¶á¤¤¥Í¥¤¥Æ¥£¥Ö¡¦¥·¥ó¥Ü¥ë(ÍøÍѲÄǽ¤Ê¾ì¹ç)¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£C++ʬ²ò̾¤Ïʬ²ò²ò½ü¤µ¤ì¤Þ¤»¤ó¡£C++̾¤òʬ²ò²ò½ü¤¹¤ë¤Ë¤Ï¡¢¤³¤Î¥³¥Þ¥ó¥É¤Î½ÐÎϤò\fBc++filt\fR¤Ë¥Ñ¥¤¥×¤·¤Þ¤¹¡£»ØÄꤵ¤ì¤¿¥×¥í¥»¥¹¤¬64¥Ó¥Ã¥ÈJava Virtual Machine¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fB\-J\-d64\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(Îã: ++\fBjstack \-J\-d64 \-m pid\fR)¡£ + .PP + \fBÃí°Õ\fR +-¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£dbgeng\&.dll¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fIPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ ++¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¥µ¥Ý¡¼¥ÈÂоݳ°¤Ç¤¢¤ê¡¢¾­Íè¤ÎJDK¤Î¥ê¥ê¡¼¥¹¤Ç¤ÏÍøÍѤǤ­¤Ê¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£dbgeng\&.dll¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Æ¤¤¤Ê¤¤Windows¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Debugging Tools For Windows¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Ê¤¤¤È¤³¤ì¤é¤Î¥Ä¡¼¥ë¤¬Àµ¾ï¤ËÆ°ºî¤·¤Þ¤»¤ó¡£¤Þ¤¿¡¢\fBPATH\fR´Ä¶­ÊÑ¿ô¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥×¥í¥»¥¹¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ëjvm\&.dll¤Î¾ì½ê¡¢¤Þ¤¿¤Ï¥¯¥é¥Ã¥·¥å¡¦¥À¥ó¥×¡¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤¿¾ì½ê¤¬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-set PATH=<jdk>\ejre\ebin\eclient;%PATH% ++\fBset PATH=<jdk>\ejre\ebin\eclient;%PATH%\fR ++ + .fi + .if n \{\ + .RE +@@ -132,15 +135,15 @@ + .PP + \-F + .RS 4 +-\fIjstack\fR +-[\fI\-l\fR] +-\fIpid\fR¤¬±þÅú¤·¤Ê¤¤¾ì¹ç¤Ë¥¹¥¿¥Ã¥¯¡¦¥À¥ó¥×¤ò¶¯À©¤·¤Þ¤¹¡£ ++\fBjstack\fR ++[\fB\-l\fR] ++\fBpid\fR¤¬±þÅú¤·¤Ê¤¤¾ì¹ç¤Ë¥¹¥¿¥Ã¥¯¡¦¥À¥ó¥×¤ò¶¯À©¤·¤Þ¤¹¡£ + .RE + .PP + \-l + .RS 4 +-Ĺ·Á¼°¤Î¥ê¥¹¥È¡£½êÍ­\fIjava\&.util\&.concurrent\fR¤Î½êÍ­¤Ç¤­¤ë¥·¥ó¥¯¥í¥Ê¥¤¥¶¤Î°ìÍ÷¤Ê¤É¡¢¥í¥Ã¥¯¤Ë¤Ä¤¤¤Æ¤ÎÄɲþðÊó¤ò°õºþ¤·¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/api/java/util/concurrent/locks/AbstractOwnableSynchronizer\&.html¤Ë¤¢¤ë +-\fIAbstractOwnableSynchronizer\fR¥¯¥é¥¹µ­½Ò¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ ++Ĺ·Á¼°¤Î¥ê¥¹¥È¡£½êÍ­\fBjava\&.util\&.concurrent\fR¤Î½êÍ­¤Ç¤­¤ë¥·¥ó¥¯¥í¥Ê¥¤¥¶¤Î°ìÍ÷¤Ê¤É¡¢¥í¥Ã¥¯¤Ë¤Ä¤¤¤Æ¤ÎÄɲþðÊó¤ò°õºþ¤·¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/api/java/util/concurrent/locks/AbstractOwnableSynchronizer\&.html¤Ë¤¢¤ë ++\fBAbstractOwnableSynchronizer\fR¥¯¥é¥¹µ­½Ò¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + \-m +@@ -157,9 +160,9 @@ + .RS 4 + ¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .RE +-.SH "´ûÃΤÎÉÔ¶ñ¹ç" ++.SH "´ûÃΤÎBUG" + .PP +-º®¹ç¥â¡¼¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤Ç¤Ï¡¢\fI\-m\fR¥ª¥×¥·¥ç¥ó¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Ç¤Ïµ¡Ç½¤·¤Þ¤»¤ó¡£ ++º®¹ç¥â¡¼¥É¤Î¥¹¥¿¥Ã¥¯¡¦¥È¥ì¡¼¥¹¤Ç¤Ï¡¢\fB\-m\fR¥ª¥×¥·¥ç¥ó¤Ï¥ê¥â¡¼¥È¡¦¥Ç¥Ð¥Ã¥°¡¦¥µ¡¼¥Ð¡¼¤Ç¤Ïµ¡Ç½¤·¤Þ¤»¤ó¡£ + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jstat.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jstat.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jstat +-.\" Language: English +-.\" Date: 2011ǯ5·î10Æü +-.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jstat ++.\" Language: Japanese ++.\" Date: 2011ǯ5·î10Æü ++.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jstat" "1" "2011ǯ5·î10Æü" "JDK 8" "¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jstat \- Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤ÎÅý·×¤ò´Æ»ë¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ++.SH "̾Á°" ++jstat \- Java Virtual Machine (JVM)¤ÎÅý·×¤ò¥â¥Ë¥¿¡¼¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjstat\fR [ \fIgeneralOption\fR | \fIoutputOptions vmid\fR [ \fIinterval\fR[s|ms] [ \fIcount \fR] ] ++\fBjstat\fR [ \fIgeneralOption\fR | \fIoutputOptions vmid\fR [ \fIinterval\fR[s|ms] [ \fIcount \fR] ] + .fi + .if n \{\ + .RE +@@ -64,12 +66,12 @@ + .PP + \fIgeneralOption\fR + .RS 4 +-ñÆȤǻÈÍѤ¹¤ë°ìÈÌŪ¤Ê¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Ç¤¹(\fI\-help\fR¤Þ¤¿¤Ï\fI\-options\fR)¡£°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ñÆȤǻÈÍѤ¹¤ë°ìÈÌŪ¤Ê¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Ç¤¹(\fB\-help\fR¤Þ¤¿¤Ï\fB\-options\fR)¡£°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIoutputOptions\fR + .RS 4 +-ñ°ì¤Î\fIstatOption\fR¤È\fI\-t\fR¡¢\fI\-h\fR¤ª¤è¤Ó\fI\-J\fR¤Î¤¤¤º¤ì¤«¤Î¥ª¥×¥·¥ç¥ó¤Ç¹½À®¤µ¤ì¤ë1¤Ä°Ê¾å¤Î½ÐÎÏ¥ª¥×¥·¥ç¥ó¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ñ°ì¤Î\fBstatOption\fR¤È\fB\-t\fR¡¢\fB\-h\fR¤ª¤è¤Ó\fB\-J\fR¤Î¤¤¤º¤ì¤«¤Î¥ª¥×¥·¥ç¥ó¤Ç¹½À®¤µ¤ì¤ë1¤Ä°Ê¾å¤Î½ÐÎÏ¥ª¥×¥·¥ç¥ó¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIvmid\fR +@@ -80,35 +82,37 @@ + .RS 4 + .\} + .nf +-[protocol:][//]lvmid[@hostname[:port]/servername] ++\fB[protocol:][//]lvmid[@hostname[:port]/servername]\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIvmid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£\fIvmid\fRʸ»úÎó¤Ï¡¢¥í¡¼¥«¥ëJVM¤òɽ¤¹Ã±½ã¤ÊÀ°¿ô¤«¤é¡¢ÄÌ¿®¥×¥í¥È¥³¥ë¡¢¥Ý¡¼¥ÈÈֹ桢¤ª¤è¤Ó¾¤Î¼ÂÁõ¸ÇÍ­¤ÎÃͤò¼¨¤¹Ê£»¨¤Ê¹½Â¤¤Þ¤Ç¡¢ÍÍ¡¹¤Ë°Û¤Ê¤ê¤Þ¤¹¡£²¾ÁÛ¥Þ¥·¥ó¼±Ê̻Ҥò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBvmid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£\fBvmid\fRʸ»úÎó¤Ï¡¢¥í¡¼¥«¥ëJVM¤òɽ¤¹Ã±½ã¤ÊÀ°¿ô¤«¤é¡¢ÄÌ¿®¥×¥í¥È¥³¥ë¡¢¥Ý¡¼¥ÈÈֹ桢¤ª¤è¤Ó¾¤Î¼ÂÁõ¸ÇÍ­¤ÎÃͤò¼¨¤¹Ê£»¨¤Ê¹½Â¤¤Þ¤Ç¡¢ÍÍ¡¹¤Ë°Û¤Ê¤ê¤Þ¤¹¡£²¾ÁÛ¥Þ¥·¥ó¼±Ê̻Ҥò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIinterval\fR [s|ms] + .RS 4 +-ÉÃ(s)¤Þ¤¿¤Ï¥ß¥êÉÃ(ms)¤Î¤¦¤Á»ØÄꤷ¤¿Ã±°Ì¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Îñ°Ì¤Ï¥ß¥êÉäǤ¹¡£Àµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤¿¾ì¹ç¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤Ï³Æ´Ö³Ö¤Ç½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£ ++ÉÃ(s)¤Þ¤¿¤Ï¥ß¥êÉÃ(ms)¤Î¤¦¤Á»ØÄꤷ¤¿Ã±°Ì¤Ç¤Î¥µ¥ó¥×¥ê¥ó¥°´Ö³Ö¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Îñ°Ì¤Ï¥ß¥êÉäǤ¹¡£Àµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£»ØÄꤷ¤¿¾ì¹ç¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤Ï³Æ´Ö³Ö¤Ç½ÐÎϤòÀ¸À®¤·¤Þ¤¹¡£ + .RE + .PP + \fIcount\fR + .RS 4 +-ɽ¼¨¤¹¤ë¥µ¥ó¥×¥ë¿ô¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ̵¸Â¤Ç¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢¤Þ¤¿¤Ï\fIjstat\fR¥³¥Þ¥ó¥É¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤ÏÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÃͤϡ¢Àµ¤ÎÀ°¿ô¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++ɽ¼¨¤¹¤ë¥µ¥ó¥×¥ë¿ô¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ̵¸Â¤Ç¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢¤Þ¤¿¤Ï\fBjstat\fR¥³¥Þ¥ó¥É¤¬½ªÎ»¤¹¤ë¤Þ¤Ç¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤ÏÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£¤³¤ÎÃͤϡ¢Àµ¤ÎÀ°¿ô¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjstat\fR¥³¥Þ¥ó¥É¤Ï¡¢ÀßÃÖ¤µ¤ì¤Æ¤¤¤ëJava HotSpot VM¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹Åý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈJVM¤Ï¡¢²¾ÁÛ¥Þ¥·¥ó¼±Ê̻Ҥޤ¿¤Ï\fIvmid\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¼±Ê̤µ¤ì¤Þ¤¹¡£ ++\fBjstat\fR¥³¥Þ¥ó¥É¤Ï¡¢ÀßÃÖ¤µ¤ì¤Æ¤¤¤ëJava HotSpot VM¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹Åý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈJVM¤Ï¡¢²¾ÁÛ¥Þ¥·¥ó¼±Ê̻Ҥޤ¿¤Ï\fBvmid\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¼±Ê̤µ¤ì¤Þ¤¹¡£ + .SH "²¾ÁÛ¥Þ¥·¥ó¼±ÊÌ»Ò" + .PP +-\fIvmid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ ++\fBvmid\fRʸ»úÎó¤Î¹½Ê¸¤Ï¡¢URI¤Î¹½Ê¸¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-[protocol:][//]lvmid[@hostname[:port]/servername] ++\fB[protocol:][//]lvmid[@hostname[:port]/servername]\fR ++ + .fi + .if n \{\ + .RE +@@ -116,12 +120,12 @@ + .PP + \fIprotocol\fR + .RS 4 +-ÄÌ¿®¥×¥í¥È¥³¥ë¤Ç¤¹¡£\fIprotocol\fRÃͤ¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥È¥³¥ë¤¬¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£\fIprotocol\fRÃͤ¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥È¥³¥ë¤Ï\fIrmi\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ÄÌ¿®¥×¥í¥È¥³¥ë¤Ç¤¹¡£\fIprotocol\fRÃͤ¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥×¥í¥È¥³¥ë¤¬¡¢¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Ë¤Ê¤ê¤Þ¤¹¡£\fIprotocol\fRÃͤ¬¾Êά¤µ¤ì¡¢¥Û¥¹¥È̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥È¥³¥ë¤Ï\fBrmi\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \fIlvmid\fR + .RS 4 +-¥¿¡¼¥²¥Ã¥ÈJVM¤Î¥í¡¼¥«¥ë²¾ÁÛ¥Þ¥·¥ó¼±Ê̻ҤǤ¹¡£\fIlvmid\fR¤Ï¡¢¥·¥¹¥Æ¥à¾å¤ÎJVM¤ò°ì°Õ¤Ë¼±Ê̤¹¤ë¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎÃͤǤ¹¡£\fIlvmid\fR¤Ï¡¢²¾ÁÛ¥Þ¥·¥ó¼±Ê̻ҤÎÍ£°ì¤Îɬ¿ÜÍ×ÁǤǤ¹¡£\fIlvmid\fR¤Ï¡¢°ìÈÌŪ¤Ë¤Ï¥¿¡¼¥²¥Ã¥ÈJVM¥×¥í¥»¥¹¤ËÂФ¹¤ë¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥×¥í¥»¥¹¼±Ê̻ҤǤ¹¤¬¡¢É¬¤º¤·¤â¤½¤¦¤Ç¤¢¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£\fIjps\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fIlvmid\fR¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢UNIX¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï\fIps\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢Windows¤Ç¤ÏWindows¥¿¥¹¥¯¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»ÈÍѤ·¤Æ¡¢\fIlvmid\fR¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£ ++¥¿¡¼¥²¥Ã¥ÈJVM¤Î¥í¡¼¥«¥ë²¾ÁÛ¥Þ¥·¥ó¼±Ê̻ҤǤ¹¡£\fBlvmid\fR¤Ï¡¢¥·¥¹¥Æ¥à¾å¤ÎJVM¤ò°ì°Õ¤Ë¼±Ê̤¹¤ë¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¸ÇÍ­¤ÎÃͤǤ¹¡£\fBlvmid\fR¤Ï¡¢²¾ÁÛ¥Þ¥·¥ó¼±Ê̻ҤÎÍ£°ì¤Îɬ¿ÜÍ×ÁǤǤ¹¡£\fBlvmid\fR¤Ï¡¢°ìÈÌŪ¤Ë¤Ï¥¿¡¼¥²¥Ã¥ÈJVM¥×¥í¥»¥¹¤ËÂФ¹¤ë¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥×¥í¥»¥¹¼±Ê̻ҤǤ¹¤¬¡¢É¬¤º¤·¤â¤½¤¦¤Ç¤¢¤ë¤È¤Ï¸Â¤ê¤Þ¤»¤ó¡£\fBjps\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢\fBlvmid\fR¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢Solaris¡¢Linux¤ª¤è¤ÓOS X¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Ç¤Ï\fBps\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢Windows¤Ç¤ÏWindows¥¿¥¹¥¯¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»ÈÍѤ·¤Æ¡¢\fBlvmid\fR¤òÆÃÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + \fIhostname\fR +@@ -131,16 +135,16 @@ + .PP + \fIport\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ë¤¿¤á¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¤¹¡£\fIhostname\fRÃͤ¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤¬\fIprotocol\fRÃͤ˻ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIport\fRÃͤÏ̵»ë¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fIport\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î\fIrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¥Ý¡¼¥ÈÃͤϡ¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Îrmiregistry¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¼¨¤·¤Þ¤¹¡£\fIport\fRÃͤ¬¾Êά¤µ¤ì¡¢\fIprotocol\fRÃͤÇ\fIrmi\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(1099)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++¥ê¥â¡¼¥È¡¦¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ë¤¿¤á¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¤¹¡£\fIhostname\fRÃͤ¬¾Êά¤µ¤ì¤Æ¤¤¤ë¤«¡¢ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤¬\fIprotocol\fRÃͤ˻ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIport\fRÃͤÏ̵»ë¤µ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fBport\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î\fBrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¥Ý¡¼¥ÈÃͤϡ¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Îrmiregistry¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¼¨¤·¤Þ¤¹¡£\fIport\fRÃͤ¬¾Êά¤µ¤ì¡¢\fIprotocol\fRÃͤÇ\fBrmi\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(1099)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \fIservername\fR + .RS 4 +-\fIservername\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fIrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤ì¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤ÎRMI¥ê¥½¡¼¥¹¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤òɽ¤·¤Þ¤¹¡£ ++\fBservername\fR¥Ñ¥é¥á¡¼¥¿¤Î°·¤¤¤Ï¡¢¼ÂÁõ¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£ºÇŬ²½¤µ¤ì¤¿¥í¡¼¥«¥ë¡¦¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤Î¥Õ¥£¡¼¥ë¥É¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£\fBrmi\fR¥×¥í¥È¥³¥ë¤Î¾ì¹ç¡¢¤³¤ì¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤ÎRMI¥ê¥½¡¼¥¹¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤òɽ¤·¤Þ¤¹¡£ + .RE + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\fIjstat\fR¥³¥Þ¥ó¥É¤Ï¡¢°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤È½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Î2¤Ä¤Î¥¿¥¤¥×¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤Ï´Êñ¤Ê»ÈÍÑΨ¤ª¤è¤Ó¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Þ¤¹¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¡¢Åý·×¥Ç¡¼¥¿½ÐÎϤÎÆâÍƤȷÁ¼°¤¬·è¤Þ¤ê¤Þ¤¹¡£ ++\fBjstat\fR¥³¥Þ¥ó¥É¤Ï¡¢°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤È½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Î2¤Ä¤Î¥¿¥¤¥×¤Î¥ª¥×¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤Ï´Êñ¤Ê»ÈÍÑΨ¤ª¤è¤Ó¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Þ¤¹¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¡¢Åý·×¥Ç¡¼¥¿½ÐÎϤÎÆâÍƤȷÁ¼°¤¬·è¤Þ¤ê¤Þ¤¹¡£ + .PP + ¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤È¤½¤Îµ¡Ç½¤Ï¡¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤ÇÊѹ¹¤Þ¤¿¤ÏÇѻߤµ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ + .SS "°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó" +@@ -158,44 +162,44 @@ + .RE + .SS "½ÐÎÏ¥ª¥×¥·¥ç¥ó" + .PP +-°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ë¡¢½ÐÎÏ¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤÎÆâÍƤȷÁ¼°¤ò·èÄꤷ¡¢Ã±°ì¤Î\fIstatOption\fR¤È¤¤¤º¤ì¤«¤Î½ÐÎÏ¥ª¥×¥·¥ç¥ó(\fI\-h\fR¡¢\fI\-t\fR¤ª¤è¤Ó\fI\-J\fR)¤Ç¹½À®¤µ¤ì¤Þ¤¹¡£\fIstatOption\fR¤ÏºÇ½é¤Ëµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¤Ë¡¢½ÐÎÏ¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£½ÐÎÏ¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤÎÆâÍƤȷÁ¼°¤ò·èÄꤷ¡¢Ã±°ì¤Î\fBstatOption\fR¤È¤¤¤º¤ì¤«¤Î½ÐÎÏ¥ª¥×¥·¥ç¥ó(\fB\-h\fR¡¢\fB\-t\fR¤ª¤è¤Ó\fB\-J\fR)¤Ç¹½À®¤µ¤ì¤Þ¤¹¡£\fBstatOption\fR¤ÏºÇ½é¤Ëµ­½Ò¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-½ÐÎϤϡ¢³ÆÎ󤬶õÇò¤Ç¶èÀÚ¤é¤ì¤¿É½¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¥¿¥¤¥È¥ë¤ò´Þ¤à¥Ø¥Ã¥À¡¼¹Ô¤Ë¤è¤Ã¤Æ¡¢³ÆÎó¤Î°ÕÌ£¤¬¤ï¤«¤ê¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Îɽ¼¨ÉÑÅÙ¤òÀßÄꤹ¤ë¤Ë¤Ï¡¢\fI\-h\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Îó¤Î¥Ø¥Ã¥À¡¼Ì¾¤Ï¡¢ÍÍ¡¹¤Ê¥ª¥×¥·¥ç¥ó´Ö¤Ç°ì´ÓÀ­¤¬Êݤ¿¤ì¤Æ¤¤¤Þ¤¹¡£°ìÈ̤ˡ¢2¤Ä¤Î¥ª¥×¥·¥ç¥ó¤ÇƱ¤¸Ì¾Á°¤ÎÎ󤬻ÈÍѤµ¤ì¤Æ¤¤¤ì¤Ð¡¢2¤Ä¤ÎÎó¤Î¥Ç¡¼¥¿¡¦¥½¡¼¥¹¤ÏƱ¤¸¤Ç¤¹¡£ ++½ÐÎϤϡ¢³ÆÎ󤬶õÇò¤Ç¶èÀÚ¤é¤ì¤¿É½¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£¥¿¥¤¥È¥ë¤ò´Þ¤à¥Ø¥Ã¥À¡¼¹Ô¤Ë¤è¤Ã¤Æ¡¢³ÆÎó¤Î°ÕÌ£¤¬¤ï¤«¤ê¤Þ¤¹¡£¥Ø¥Ã¥À¡¼¤Îɽ¼¨ÉÑÅÙ¤òÀßÄꤹ¤ë¤Ë¤Ï¡¢\fB\-h\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£Îó¤Î¥Ø¥Ã¥À¡¼Ì¾¤Ï¡¢ÍÍ¡¹¤Ê¥ª¥×¥·¥ç¥ó´Ö¤Ç°ì´ÓÀ­¤¬Êݤ¿¤ì¤Æ¤¤¤Þ¤¹¡£°ìÈ̤ˡ¢2¤Ä¤Î¥ª¥×¥·¥ç¥ó¤ÇƱ¤¸Ì¾Á°¤ÎÎ󤬻ÈÍѤµ¤ì¤Æ¤¤¤ì¤Ð¡¢2¤Ä¤ÎÎó¤Î¥Ç¡¼¥¿¡¦¥½¡¼¥¹¤ÏƱ¤¸¤Ç¤¹¡£ + .PP +-\fI\-t\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢Timestamp¤È¤¤¤¦¥é¥Ù¥ë¤ÎÉÕ¤¤¤¿¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÎ󤬡¢½ÐÎϤκǽé¤ÎÎó¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£TimestampÎó¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤Îµ¯Æ°¤«¤é¤Î·Ð²á»þ´Ö¤¬¡¢ÉÃñ°Ì¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÀºÅ٤ϡ¢ÍÍ¡¹¤ÊÍ×°ø¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¡¢ÂçÎ̤ÎÉé²Ù¤Î¤«¤«¤Ã¤¿¥·¥¹¥Æ¥à¤Ç¤Î¥¹¥ì¥Ã¥É¡¦¥¹¥±¥¸¥å¡¼¥ë¤ÎÃÙ±ä¤Ë¤è¤êÊÑÆ°¤·¤Þ¤¹¡£ ++\fB\-t\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢Timestamp¤È¤¤¤¦¥é¥Ù¥ë¤ÎÉÕ¤¤¤¿¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÎ󤬡¢½ÐÎϤκǽé¤ÎÎó¤È¤·¤Æɽ¼¨¤µ¤ì¤Þ¤¹¡£TimestampÎó¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤Îµ¯Æ°¤«¤é¤Î·Ð²á»þ´Ö¤¬¡¢ÉÃñ°Ì¤Çɽ¼¨¤µ¤ì¤Þ¤¹¡£¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÀºÅ٤ϡ¢ÍÍ¡¹¤ÊÍ×°ø¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¡¢ÂçÎ̤ÎÉé²Ù¤Î¤«¤«¤Ã¤¿¥·¥¹¥Æ¥à¤Ç¤Î¥¹¥ì¥Ã¥É¡¦¥¹¥±¥¸¥å¡¼¥ë¤ÎÃÙ±ä¤Ë¤è¤êÊÑÆ°¤·¤Þ¤¹¡£ + .PP +-interval¤ª¤è¤Ócount¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤¬¤½¤Î½ÐÎϤòɽ¼¨¤¹¤ëÉÑÅ٤Ȳó¿ô¤ò¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£ ++interval¤ª¤è¤Ócount¥Ñ¥é¥á¡¼¥¿¤ò»ÈÍѤ·¤Æ¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤¬¤½¤Î½ÐÎϤòɽ¼¨¤¹¤ëÉÑÅ٤Ȳó¿ô¤ò¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤³¤Î·Á¼°¤ÏÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤ÏºîÀ®¤·¤Ê¤Ç¤¯¤À¤µ¤¤¡£\fIjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤òºîÀ®¤¹¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥Ä¡¼¥ë¤Î¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¡¢¤½¤Î¥¹¥¯¥ê¥×¥È¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ë¤³¤È¤Ëα°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¤³¤Î·Á¼°¤ÏÊѹ¹¤µ¤ì¤ë²ÄǽÀ­¤¬¤¢¤ë¤¿¤á¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤ÏºîÀ®¤·¤Ê¤Ç¤¯¤À¤µ¤¤¡£\fBjstat\fR¥³¥Þ¥ó¥É¤Î½ÐÎϤò²òÀϤ¹¤ë¥¹¥¯¥ê¥×¥È¤òºîÀ®¤¹¤ë¾ì¹ç¤Ï¡¢¤³¤Î¥Ä¡¼¥ë¤Î¾­Íè¤Î¥ê¥ê¡¼¥¹¤Ç¡¢¤½¤Î¥¹¥¯¥ê¥×¥È¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ë¤³¤È¤Ëα°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP + \-\fIstatOption\fR + .RS 4 +-\fIjstat\fR¥³¥Þ¥ó¥É¤¬É½¼¨¤¹¤ëÅý·×¥Ç¡¼¥¿¾ðÊó¤ò»ØÄꤷ¤Þ¤¹¡£¼¡¤Ë¡¢ÍøÍѲÄǽ¤Ê¥ª¥×¥·¥ç¥ó¤Î°ìÍ÷¤ò¼¨¤·¤Þ¤¹¡£ÆÃÄê¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥¤¥ó¥¹¥È¡¼¥ë¤Î¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤Î\fI\-options\fR¤ò»ÈÍѤ·¤Þ¤¹¡£Stat¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó½ÐÎϤò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjstat\fR¥³¥Þ¥ó¥É¤¬É½¼¨¤¹¤ëÅý·×¥Ç¡¼¥¿¾ðÊó¤ò»ØÄꤷ¤Þ¤¹¡£¼¡¤Ë¡¢ÍøÍѲÄǽ¤Ê¥ª¥×¥·¥ç¥ó¤Î°ìÍ÷¤ò¼¨¤·¤Þ¤¹¡£ÆÃÄê¤Î¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¡¦¥¤¥ó¥¹¥È¡¼¥ë¤Î¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢°ìÈÌŪ¤Ê¥ª¥×¥·¥ç¥ó¤Î\fB\-options\fR¤ò»ÈÍѤ·¤Þ¤¹¡£Stat¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó½ÐÎϤò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fIclass\fR: ¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBclass\fR: ¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIcompiler\fR: Java HotSpot VM Just\-in\-Time¥³¥ó¥Ñ¥¤¥é¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBcompiler\fR: Java HotSpot VM Just\-in\-Time¥³¥ó¥Ñ¥¤¥é¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgc\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥È¤µ¤ì¤¿¥Ò¡¼¥×¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgc\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥È¤µ¤ì¤¿¥Ò¡¼¥×¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgccapacity\fR: À¤Â头¤È¤ÎÍÆÎ̤ÈÂбþ¤¹¤ëÎΰè¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgccapacity\fR: À¤Â头¤È¤ÎÍÆÎ̤ÈÂбþ¤¹¤ëÎΰè¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgccause\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼(\fI\-gcutil\fR¤ÈƱ¤¸)¤È¡¢Ä¾Á°¤ª¤è¤Ó¸½ºß(ŬÍѲÄǽ¤Ê¾ì¹ç)¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¸¶°ø¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgccause\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼(\fB\-gcutil\fR¤ÈƱ¤¸)¤È¡¢Ä¾Á°¤ª¤è¤Ó¸½ºß(ŬÍѲÄǽ¤Ê¾ì¹ç)¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¸¶°ø¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcnew\fR: NewÀ¤Âå¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcnew\fR: NewÀ¤Âå¤ÎÆ°ºî¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcnewcapacity\fR: NewÀ¤Âå¤Î¥µ¥¤¥º¤ÈÂбþ¤¹¤ëÎΰè¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcnewcapacity\fR: NewÀ¤Âå¤Î¥µ¥¤¥º¤ÈÂбþ¤¹¤ëÎΰè¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcold\fR: OldÀ¤Âå¤ÎÆ°ºî¤È¥á¥¿¥¹¥Ú¡¼¥¹¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcold\fR: OldÀ¤Âå¤ÎÆ°ºî¤È¥á¥¿¥¹¥Ú¡¼¥¹¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcoldcapacity\fR: OldÀ¤Âå¤Î¥µ¥¤¥º¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcoldcapacity\fR: OldÀ¤Âå¤Î¥µ¥¤¥º¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcmetacapacity\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î¥µ¥¤¥º¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcmetacapacity\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î¥µ¥¤¥º¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIgcutil\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¥µ¥Þ¥ê¡¼¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBgcutil\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¥µ¥Þ¥ê¡¼¤Ë´Ø¤¹¤ëÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp +-\fIprintcompilation\fR: Java HotSpot VM¥³¥ó¥Ñ¥¤¥ë¡¦¥á¥½¥Ã¥É¤ÎÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBprintcompilation\fR: Java HotSpot VM¥³¥ó¥Ñ¥¤¥ë¡¦¥á¥½¥Ã¥É¤ÎÅý·×¥Ç¡¼¥¿¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-h \fIn\fR +@@ -210,150 +214,150 @@ + .PP + \-J\fIjavaOption\fR + .RS 4 +-\fIjavaOption\fR¤òJava¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤ËÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î´°Á´¤Ê¥ê¥¹¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBjavaOption\fR¤òJava¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤ËÅϤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î´°Á´¤Ê¥ê¥¹¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SS "Stat¥ª¥×¥·¥ç¥ó¤ª¤è¤Ó½ÐÎÏ" + .PP +-¼¡¤Î¾ðÊó¤Ï¡¢\fIjstat\fR¥³¥Þ¥ó¥É¤¬³Æ\fIstatOption\fR¤Ë¤Ä¤¤¤Æ½ÐÎϤ¹¤ëÎó¤ò¤Þ¤È¤á¤¿¤â¤Î¤Ç¤¹¡£ ++¼¡¤Î¾ðÊó¤Ï¡¢\fBjstat\fR¥³¥Þ¥ó¥É¤¬³Æ\fIstatOption\fR¤Ë¤Ä¤¤¤Æ½ÐÎϤ¹¤ëÎó¤ò¤Þ¤È¤á¤¿¤â¤Î¤Ç¤¹¡£ + .PP + \-class \fIoption\fR + .RS 4 + ¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fILoaded\fR: ¥í¡¼¥É¤µ¤ì¤¿¥¯¥é¥¹¤Î¿ô¡£ ++\fBLoaded\fR: ¥í¡¼¥É¤µ¤ì¤¿¥¯¥é¥¹¤Î¿ô¡£ + .sp +-\fIBytes\fR: ¥í¡¼¥É¤µ¤ì¤¿KB¤Î¿ô¡£ ++\fBBytes\fR: ¥í¡¼¥É¤µ¤ì¤¿KB¤Î¿ô¡£ + .sp +-\fIUnloaded\fR: ¥¢¥ó¥í¡¼¥É¤µ¤ì¤¿¥¯¥é¥¹¤Î¿ô¡£ ++\fBUnloaded\fR: ¥¢¥ó¥í¡¼¥É¤µ¤ì¤¿¥¯¥é¥¹¤Î¿ô¡£ + .sp +-\fIBytes\fR: ¥¢¥ó¥í¡¼¥É¤µ¤ì¤¿KB¤Î¿ô¡£ ++\fBBytes\fR: ¥¢¥ó¥í¡¼¥É¤µ¤ì¤¿KB¤Î¿ô¡£ + .sp +-\fITime\fR: ¥¯¥é¥¹¤Î¥í¡¼¥É¤ä¥¢¥ó¥í¡¼¥É½èÍý¤ËÍפ·¤¿»þ´Ö¡£ ++\fBTime\fR: ¥¯¥é¥¹¤Î¥í¡¼¥É¤ä¥¢¥ó¥í¡¼¥É½èÍý¤ËÍפ·¤¿»þ´Ö¡£ + .RE + .PP + \-compiler \fIoption\fR + .RS 4 + Java HotSpot VM Just\-in\-Time¥³¥ó¥Ñ¥¤¥é¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fICompiled\fR: ¼Â¹Ô¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ ++\fBCompiled\fR: ¼Â¹Ô¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ + .sp +-\fIFailed\fR: ¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ ++\fBFailed\fR: ¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ + .sp +-\fIInvalid\fR: ̵¸ú¤Ë¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ ++\fBInvalid\fR: ̵¸ú¤Ë¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ + .sp +-\fITime\fR: ¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¼Â¹Ô¤ËÍפ·¤¿»þ´Ö¡£ ++\fBTime\fR: ¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¼Â¹Ô¤ËÍפ·¤¿»þ´Ö¡£ + .sp +-\fIFailedType\fR: ºÇ¸å¤Ë¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¤¥×¡£ ++\fBFailedType\fR: ºÇ¸å¤Ë¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¤¥×¡£ + .sp +-\fIFailedMethod\fR: ºÇ¸å¤Ë¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¤Î¥¯¥é¥¹Ì¾¤È¥á¥½¥Ã¥É¡£ ++\fBFailedMethod\fR: ºÇ¸å¤Ë¼ºÇÔ¤·¤¿¥³¥ó¥Ñ¥¤¥ë¤Î¥¯¥é¥¹Ì¾¤È¥á¥½¥Ã¥É¡£ + .RE + .PP + \-gc \fIoption\fR + .RS 4 + ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥È¤µ¤ì¤¿¥Ò¡¼¥×¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS0U\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(KB)¡£ ++\fBS0U\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIS1U\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(KB)¡£ ++\fBS1U\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIEU\fR: EdenÎΰè¤Î»ÈÍÑΨ(KB)¡£ ++\fBEU\fR: EdenÎΰè¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOU\fR: OldÎΰè¤Î»ÈÍÑΨ(KB)¡£ ++\fBOU\fR: OldÎΰè¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ ++\fBMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIMU\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(KB)¡£ ++\fBMU\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¿ô¡£ + .sp +-\fIYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-gccapacity \fIoption\fR + .RS 4 + ¥á¥â¥ê¡¼¡¦¥×¡¼¥ëÀ¤Â太¤è¤ÓÎΰèÍÆÎÌ¡£ + .sp +-\fINGCMN\fR: NewÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBNGCMN\fR: NewÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fINGCMX\fR: NewÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBNGCMX\fR: NewÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fINGC\fR: NewÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBNGC\fR: NewÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOGCMN\fR: OldÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBOGCMN\fR: OldÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fIOGCMX\fR: OldÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBOGCMX\fR: OldÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIOGC\fR: OldÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOGC\fR: OldÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIMCMN\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBMCMN\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fIMCMX\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBMCMX\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ ++\fBMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .RE + .PP + \-gccause \fIoption\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-gcutil\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼¤òɽ¼¨¤·¤Þ¤¹¤¬¡¢ºÇ¸å¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤È(ŬÍѲÄǽ¤Ê¾ì¹ç¤Ï)¸½ºß¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¸¶°ø¤¬´Þ¤Þ¤ì¤Þ¤¹¡£\fI\-gcutil\fR¤Ç°ìÍ÷ɽ¼¨¤µ¤ì¤ëÎó¤Î¤Û¤«¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¼¡¤ÎÎó¤¬Äɲ䵤ì¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-gcutil\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼¤òɽ¼¨¤·¤Þ¤¹¤¬¡¢ºÇ¸å¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤È(ŬÍѲÄǽ¤Ê¾ì¹ç¤Ï)¸½ºß¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤Î¸¶°ø¤¬´Þ¤Þ¤ì¤Þ¤¹¡£\fB\-gcutil\fR¤Ç°ìÍ÷ɽ¼¨¤µ¤ì¤ëÎó¤Î¤Û¤«¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¼¡¤ÎÎó¤¬Äɲ䵤ì¤Þ¤¹¡£ + .sp + ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¦¥¤¥Ù¥ó¥È¤ò´Þ¤à¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fILGCC\fR: ºÇ¸å¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¸¶°ø¡£ ++\fBLGCC\fR: ºÇ¸å¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¸¶°ø¡£ + .sp +-\fIGCC\fR: ¸½ºß¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¸¶°ø¡£ ++\fBGCC\fR: ¸½ºß¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¸¶°ø¡£ + .RE + .PP + \-gcnew \fIoption\fR + .RS 4 + NewÀ¤Âå¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS0U\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(KB)¡£ ++\fBS0U\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIS1U\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(KB)¡£ ++\fBS1U\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fITT\fR: ÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ¡£ ++\fBTT\fR: ÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ¡£ + .sp +-\fIMTT\fR: ºÇÂçÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ¡£ ++\fBMTT\fR: ºÇÂçÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ¡£ + .sp +-\fIDSS\fR: ŬÀÚ¤ÊSurvivor¥µ¥¤¥º(KB)¡£ ++\fBDSS\fR: ŬÀÚ¤ÊSurvivor¥µ¥¤¥º(KB)¡£ + .sp +-\fIEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIEU\fR: EdenÎΰè¤Î»ÈÍÑΨ(KB)¡£ ++\fBEU\fR: EdenÎΰè¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .RE + .PP + \-gcnewcapacity \fIoption\fR +@@ -362,132 +366,132 @@ + .sp + NGCMN: NewÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fINGCMX\fR: NewÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBNGCMX\fR: NewÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fINGC\fR: NewÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBNGC\fR: NewÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS0CMX\fR: SurvivorÎΰè0¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBS0CMX\fR: SurvivorÎΰè0¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS0C\fR: SurvivorÎΰè0¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIS1CMX\fR: SurvivorÎΰè1¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBS1CMX\fR: SurvivorÎΰè1¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBS1C\fR: SurvivorÎΰè1¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIECMX\fR: EdenÎΰè¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBECMX\fR: EdenÎΰè¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBEC\fR: EdenÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .RE + .PP + \-gcold \fIoption\fR + .RS 4 + Old¤ª¤è¤ÓPermanentÀ¤Âå¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ ++\fBMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIMU\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(KB)¡£ ++\fBMU\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOU\fR: OldÎΰè¤Î»ÈÍÑΨ(KB)¡£ ++\fBOU\fR: OldÎΰè¤Î»ÈÍÑΨ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-gcoldcapacity \fIoption\fR + .RS 4 + OldÀ¤Âå¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIOGCMN\fR: OldÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBOGCMN\fR: OldÀ¤Âå¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fIOGCMX\fR: OldÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBOGCMX\fR: OldÀ¤Âå¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIOGC\fR: OldÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOGC\fR: OldÀ¤Âå¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ ++\fBOC\fR: OldÎΰè¤Î¸½ºß¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-gcmetacapacity \fIoption\fR + .RS 4 + PermanentÀ¤Âå¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fIMCMN\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ ++\fBMCMN\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇ¾®ÍÆÎÌ(KB)¡£ + .sp +-\fIMCMX\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇÂçÍÆÎÌ(KB)¡£ ++\fBMCMX\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎºÇÂçÍÆÎÌ(KB)¡£ + .sp +-\fIMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ ++\fBMC\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤ÎÍÆÎÌ(KB)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-gcutil \fIoption\fR + .RS 4 + ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÅý·×¥Ç¡¼¥¿¤Î¥µ¥Þ¥ê¡¼ + .sp +-\fIS0\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBS0\fR: SurvivorÎΰè0¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIS1\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBS1\fR: SurvivorÎΰè1¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIE\fR: EdenÎΰè¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBE\fR: EdenÎΰè¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIO\fR: OldÎΰè¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBO\fR: OldÎΰè¤Î»ÈÍÑΨ(¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIM\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(Îΰè¤Î¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ ++\fBM\fR: ¥á¥¿¥¹¥Ú¡¼¥¹¤Î»ÈÍÑΨ(Îΰè¤Î¸½ºß¤ÎÍÆÎ̤ËÂФ¹¤ë¥Ñ¡¼¥»¥ó¥Æ¡¼¥¸)¡£ + .sp +-\fIYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBYGC\fR: ¼ã¤¤À¤Âå¤ÎGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBYGCT\fR: ¼ã¤¤À¤Âå¤Î¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ ++\fBFGC\fR: ¥Õ¥ëGC¥¤¥Ù¥ó¥È¿ô¡£ + .sp +-\fIFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ ++\fBFGCT\fR: ¥Õ¥ë¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó»þ´Ö¡£ + .sp +-\fIGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ ++\fBGCT\fR: ¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥óÁí»þ´Ö¡£ + .RE + .PP + \-printcompilation \fIoption\fR + .RS 4 + Java HotSpot VM¥³¥ó¥Ñ¥¤¥ë¡¦¥á¥½¥Ã¥É¤ÎÅý·×¥Ç¡¼¥¿¡£ + .sp +-\fICompiled\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ ++\fBCompiled\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Ç¼Â¹Ô¤µ¤ì¤¿¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¹¥¯¤Î¿ô¡£ + .sp +-\fISize\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¥Ð¥¤¥È¡¦¥³¡¼¥É¤Î¥Ð¥¤¥È¿ô¡£ ++\fBSize\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¥Ð¥¤¥È¡¦¥³¡¼¥É¤Î¥Ð¥¤¥È¿ô¡£ + .sp +-\fIType\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¤¥×¡£ ++\fBType\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤Î¥³¥ó¥Ñ¥¤¥ë¡¦¥¿¥¤¥×¡£ + .sp +-\fIMethod\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤òÆÃÄꤹ¤ë¥¯¥é¥¹Ì¾¤È¥á¥½¥Ã¥É̾¡£¥¯¥é¥¹Ì¾¤Ç¤Ï¡¢Ì¾Á°¶õ´Ö¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ¡¢¥É¥Ã¥È(\&.)¤Î¤«¤ï¤ê¤Ë¥¹¥é¥Ã¥·¥å(/)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥á¥½¥Ã¥É̾¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹Æâ¤Î¥á¥½¥Ã¥É¤Ç¤¹¡£¤³¤ì¤é¤Î2¤Ä¤Î¥Õ¥£¡¼¥ë¥É¤Î·Á¼°¤Ï¡¢HotSpot +-\fI\-XX:+PrintComplation\fR¥ª¥×¥·¥ç¥ó¤ÈÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ ++\fBMethod\fR: ºÇ¶á¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥á¥½¥Ã¥É¤òÆÃÄꤹ¤ë¥¯¥é¥¹Ì¾¤È¥á¥½¥Ã¥É̾¡£¥¯¥é¥¹Ì¾¤Ç¤Ï¡¢Ì¾Á°¶õ´Ö¤Î¶èÀÚ¤êʸ»ú¤È¤·¤Æ¡¢¥É¥Ã¥È(\&.)¤Î¤«¤ï¤ê¤Ë¥¹¥é¥Ã¥·¥å(/)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£¥á¥½¥Ã¥É̾¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹Æâ¤Î¥á¥½¥Ã¥É¤Ç¤¹¡£¤³¤ì¤é¤Î2¤Ä¤Î¥Õ¥£¡¼¥ë¥É¤Î·Á¼°¤Ï¡¢HotSpot ++\fB\-XX:+PrintCompilation\fR¥ª¥×¥·¥ç¥ó¤ÈÂбþ¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .SH "Îã" + .PP + ¤³¤Î¹à¤Ç¤Ï¡¢21891¤Î\fIlvmid\fR¤ò»ý¤Ä¥í¡¼¥«¥ëJVM¤ò¥â¥Ë¥¿¥ê¥ó¥°¤¹¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£ + .SS "gcutil¥ª¥×¥·¥ç¥ó" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢lvmid 21891¤ËÀܳ¤·¤Æ¡¢250¥ß¥êÉôֳ֤Ç7¤Ä¤Î¥µ¥ó¥×¥ë¤ò¼èÆÀ¤·¡¢\-\fIgcutil\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î»ØÄê¤Ë½¾¤Ã¤Æ½ÐÎϤòɽ¼¨¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢lvmid 21891¤ËÀܳ¤·¤Æ¡¢250¥ß¥êÉôֳ֤Ç7¤Ä¤Î¥µ¥ó¥×¥ë¤ò¼èÆÀ¤·¡¢\-\fBgcutil\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î»ØÄê¤Ë½¾¤Ã¤Æ½ÐÎϤòɽ¼¨¤·¤Þ¤¹¡£ + .PP + ¤³¤ÎÎã¤Î½ÐÎϤϡ¢¼ã¤¤À¤Âå¤Î¥³¥ì¥¯¥·¥ç¥ó¤¬3ÈÖÌܤÈ4ÈÖÌܤΥµ¥ó¥×¥ë´Ö¤Ç¹Ô¤ï¤ì¤¿¤³¤È¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£¥³¥ì¥¯¥·¥ç¥ó¤Ë¤Ï0\&.001É䫤«¤Ã¤Æ¤ª¤ê¡¢¥ª¥Ö¥¸¥§¥¯¥È¤¬EdenÎΰè(E)¤«¤éOldÎΰè(O)¤Ë¾º³Ê¤·¤¿¤¿¤á¡¢OldÎΰè¤Î»ÈÍÑΨ¤Ï9\&.49%¤«¤é9\&.51%¤ËÁý²Ã¤·¤Æ¤¤¤Þ¤¹¡£SurvivorÎΰè¤Ï¡¢¥³¥ì¥¯¥·¥ç¥óÁ°¤Ï12\&.44%¤¬»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤·¤¿¤¬¡¢¥³¥ì¥¯¥·¥ç¥ó¸å¤Î»ÈÍѤÏ7\&.74%¤Î¤ß¤Ç¤¹¡£ + .sp +@@ -495,22 +499,23 @@ + .RS 4 + .\} + .nf +-jstat \-gcutil 21891 250 7 +- S0 S1 E O M YGC YGCT FGC FGCT GCT +-0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 +-0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124 ++\fBjstat \-gcutil 21891 250 7\fR ++\fB S0 S1 E O M YGC YGCT FGC FGCT GCT\fR ++\fB0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.49 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++\fB0\&.00 99\&.74 13\&.80 7\&.86 95\&.82 3 0\&.124 0 0\&.000 0\&.124\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "Îó¥Ø¥Ã¥À¡¼Ê¸»úÎó¤Î·«ÊÖ¤·" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢lvmid 21891¤ËÀܳ¤·¤Æ¡¢250¥ß¥êÉôֳ֤ǥµ¥ó¥×¥ë¤ò¼èÆÀ¤·¡¢\fI\-gcutil\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î»ØÄê¤Ë½¾¤Ã¤Æ½ÐÎϤòɽ¼¨¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fI\-h3\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ç¡¼¥¿¤¬3¹Ôɽ¼¨¤µ¤ì¤ë¤´¤È¤ËÎó¥Ø¥Ã¥À¡¼¤ò½ÐÎϤ·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢lvmid 21891¤ËÀܳ¤·¤Æ¡¢250¥ß¥êÉôֳ֤ǥµ¥ó¥×¥ë¤ò¼èÆÀ¤·¡¢\fB\-gcutil\fR¥ª¥×¥·¥ç¥ó¤Ç¤Î»ØÄê¤Ë½¾¤Ã¤Æ½ÐÎϤòɽ¼¨¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fB\-h3\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¥Ç¡¼¥¿¤¬3¹Ôɽ¼¨¤µ¤ì¤ë¤´¤È¤ËÎó¥Ø¥Ã¥À¡¼¤ò½ÐÎϤ·¤Þ¤¹¡£ + .PP + ¤³¤ÎÎã¤Ç¤Ï¡¢¥Ø¥Ã¥À¡¼Ê¸»úÎó¤Î·«ÊÖ¤·¤¬É½¼¨¤µ¤ì¤Æ¤¤¤ë¤Û¤«¡¢2ÈÖÌܤÈ3ÈÖÌܤΥµ¥ó¥×¥ë´Ö¤ÇYoung GC¤¬¹Ô¤ï¤ì¤¿¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£¤³¤Î·Ñ³»þ´Ö¤Ï0\&.001ÉäǤ·¤¿¡£¤³¤Î¥³¥ì¥¯¥·¥ç¥ó¤Ç¤Ï¡¢SurvivorÎΰè0¤Î»ÈÍÑΨ(S0U)¤¬Å¬ÀÚ¤ÊSurvivor¥µ¥¤¥º(DSS)¤òĶ²á¤¹¤ë¤³¤È¤Ë¤Ê¤ë¥¢¥¯¥Æ¥£¥Ö¡¦¥Ç¡¼¥¿¤¬¸¡½Ð¤µ¤ì¤Þ¤·¤¿¡£¤³¤Î·ë²Ì¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¢OldÀ¤Âå(¤³¤Î½ÐÎϤˤÏÈóɽ¼¨)¤Ø¾º³Ê¤µ¤ì¡¢ÅÂƲÆþ¤ê¤·¤­¤¤ÃÍ(TT)¤¬¡¢31¤«¤é2¤Ø¹ß³Ê¤µ¤ì¤Þ¤·¤¿¡£ + .PP +@@ -520,51 +525,54 @@ + .RS 4 + .\} + .nf +-jstat \-gcnew \-h3 21891 250 +- S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT +- 64\&.0 64\&.0 0\&.0 31\&.7 31 31 32\&.0 512\&.0 178\&.6 249 0\&.203 +- 64\&.0 64\&.0 0\&.0 31\&.7 31 31 32\&.0 512\&.0 355\&.5 249 0\&.203 +- 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 21\&.9 250 0\&.204 +- S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT +- 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 245\&.9 250 0\&.204 +- 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 421\&.1 250 0\&.204 +- 64\&.0 64\&.0 0\&.0 19\&.0 31 31 32\&.0 512\&.0 84\&.4 251 0\&.204 +- S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT +- 64\&.0 64\&.0 0\&.0 19\&.0 31 31 32\&.0 512\&.0 306\&.7 251 0\&.204 ++\fBjstat \-gcnew \-h3 21891 250\fR ++\fB S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT\fR ++\fB 64\&.0 64\&.0 0\&.0 31\&.7 31 31 32\&.0 512\&.0 178\&.6 249 0\&.203\fR ++\fB 64\&.0 64\&.0 0\&.0 31\&.7 31 31 32\&.0 512\&.0 355\&.5 249 0\&.203\fR ++\fB 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 21\&.9 250 0\&.204\fR ++\fB S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT\fR ++\fB 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 245\&.9 250 0\&.204\fR ++\fB 64\&.0 64\&.0 35\&.4 0\&.0 2 31 32\&.0 512\&.0 421\&.1 250 0\&.204\fR ++\fB 64\&.0 64\&.0 0\&.0 19\&.0 31 31 32\&.0 512\&.0 84\&.4 251 0\&.204\fR ++\fB S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT\fR ++\fB 64\&.0 64\&.0 0\&.0 19\&.0 31 31 32\&.0 512\&.0 306\&.7 251 0\&.204\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥µ¥ó¥×¥ë¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤ÎÁÞÆþ" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢lvmid21891¤ØÀܳ¤·¡¢250¥ß¥êÉôֳ֤Ç3¤Ä¤Î¥µ¥ó¥×¥ë¤ò¼èÆÀ¤·¤Æ¤¤¤Þ¤¹¡£\fI\-t\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢ºÇ½é¤ÎÎó¤Ë¥µ¥ó¥×¥ë¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤òɽ¼¨¤·¤Æ¤¤¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢lvmid21891¤ØÀܳ¤·¡¢250¥ß¥êÉôֳ֤Ç3¤Ä¤Î¥µ¥ó¥×¥ë¤ò¼èÆÀ¤·¤Æ¤¤¤Þ¤¹¡£\fB\-t\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢ºÇ½é¤ÎÎó¤Ë¥µ¥ó¥×¥ë¤´¤È¤Î¥¿¥¤¥à¥¹¥¿¥ó¥×¤òɽ¼¨¤·¤Æ¤¤¤Þ¤¹¡£ + .PP +-TimestampÎó¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤Îµ¯Æ°»þ¤«¤é¤Î·Ð²á»þ´Ö¤¬¡¢ÉÃñ°Ì¤Ç¥ì¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fI\-gcoldcapacity\fR½ÐÎϤǤϡ¢³äÅö¥ê¥¯¥¨¥¹¥È¤Þ¤¿¤Ï¾º³Ê¥ê¥¯¥¨¥¹¥È¤¢¤ë¤¤¤Ï¤½¤ÎξÊý¤òËþ¤¿¤¹¤¿¤á¤Ë¥Ò¡¼¥×¤¬³ÈÄ¥¤¹¤ë¤¿¤Ó¤Ë¡¢OldÀ¤Âå¤ÎÍÆÎÌ(OGC)¤ÈOldÎΰè¤ÎÍÆÎÌ(OC)¤È¤¬Áý²Ã¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£81ÈÖÌܤΥե롦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(FGC)¤Î¸å¡¢OldÀ¤Âå¤ÎÍÆÎÌ(OGC)¤Ï11,696 KB¤«¤é13820 KB¤ËÁý²Ã¤·¤Þ¤·¤¿¡£¤³¤ÎÀ¤Âå(¤ª¤è¤ÓÎΰè)¤ÎºÇÂçÍÆÎ̤ϡ¢60,544 KB (OGCMX)¤Ê¤Î¤Ç¡¢¤Þ¤À³ÈÄ¥¤Ç¤­¤ë;͵¤¬»Ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++TimestampÎó¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤Îµ¯Æ°»þ¤«¤é¤Î·Ð²á»þ´Ö¤¬¡¢ÉÃñ°Ì¤Ç¥ì¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fB\-gcoldcapacity\fR½ÐÎϤǤϡ¢³äÅö¥ê¥¯¥¨¥¹¥È¤Þ¤¿¤Ï¾º³Ê¥ê¥¯¥¨¥¹¥È¤¢¤ë¤¤¤Ï¤½¤ÎξÊý¤òËþ¤¿¤¹¤¿¤á¤Ë¥Ò¡¼¥×¤¬³ÈÄ¥¤¹¤ë¤¿¤Ó¤Ë¡¢OldÀ¤Âå¤ÎÍÆÎÌ(OGC)¤ÈOldÎΰè¤ÎÍÆÎÌ(OC)¤È¤¬Áý²Ã¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£81ÈÖÌܤΥե롦¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó(FGC)¤Î¸å¡¢OldÀ¤Âå¤ÎÍÆÎÌ(OGC)¤Ï11,696 KB¤«¤é13820 KB¤ËÁý²Ã¤·¤Þ¤·¤¿¡£¤³¤ÎÀ¤Âå(¤ª¤è¤ÓÎΰè)¤ÎºÇÂçÍÆÎ̤ϡ¢60,544 KB (OGCMX)¤Ê¤Î¤Ç¡¢¤Þ¤À³ÈÄ¥¤Ç¤­¤ë;͵¤¬»Ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Timestamp OGCMN OGCMX OGC OC YGC FGC FGCT GCT +- 150\&.1 1408\&.0 60544\&.0 11696\&.0 11696\&.0 194 80 2\&.874 3\&.799 +- 150\&.4 1408\&.0 60544\&.0 13820\&.0 13820\&.0 194 81 2\&.938 3\&.863 +- 150\&.7 1408\&.0 60544\&.0 13820\&.0 13820\&.0 194 81 2\&.938 3\&.863 ++\fBTimestamp OGCMN OGCMX OGC OC YGC FGC FGCT GCT\fR ++\fB 150\&.1 1408\&.0 60544\&.0 11696\&.0 11696\&.0 194 80 2\&.874 3\&.799\fR ++\fB 150\&.4 1408\&.0 60544\&.0 13820\&.0 13820\&.0 194 81 2\&.938 3\&.863\fR ++\fB 150\&.7 1408\&.0 60544\&.0 13820\&.0 13820\&.0 194 81 2\&.938 3\&.863\fR ++ + .fi + .if n \{\ + .RE + .\} +-.SS "¥ê¥â¡¼¥ÈJVM¤Î¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Î´Æ»ë" ++.SS "¥ê¥â¡¼¥ÈJVM¤Î¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Î¥â¥Ë¥¿¡¼" + .PP +-¤³¤ÎÎã¤Ï¡¢\fI\-gcutil\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢remote\&.domain¤È¤¤¤¦¥·¥¹¥Æ¥à¾å¤Îlvmid 40496¤ËÀܳ¤·¡¢¥µ¥ó¥×¥ë¤òÉÃñ°Ì¤Ç̵´ü¸Â¤Ë¼èÆÀ¤·¤Æ¤¤¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ï¡¢\fB\-gcutil\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢remote\&.domain¤È¤¤¤¦¥·¥¹¥Æ¥à¾å¤Îlvmid 40496¤ËÀܳ¤·¡¢¥µ¥ó¥×¥ë¤òÉÃñ°Ì¤Ç̵´ü¸Â¤Ë¼èÆÀ¤·¤Æ¤¤¤Þ¤¹¡£ + .PP +-lvmid¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Î̾Á°¤È·ë¹ç¤µ¤ì¤Æ¡¢\fI40496@remote\&.domain\fR¤Î\fIvmid\fR¤ò¹½À®¤·¤Æ¤¤¤Þ¤¹¡£·ë²Ì¤È¤·¤Æ¡¢¤³¤Îvmid¤Ï¡¢\fIrmi\fR¥×¥í¥È¥³¥ë¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Î¥Ç¥Õ¥©¥ë¥È¤Î\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤·¤Þ¤¹¡£\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢rmiregistry¤ò»ÈÍѤ·¤Æ¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fIremote\&.domain\fR¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ ++lvmid¤Ï¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¤Î̾Á°¤È·ë¹ç¤µ¤ì¤Æ¡¢\fB40496@remote\&.domain\fR¤Î\fIvmid\fR¤ò¹½À®¤·¤Æ¤¤¤Þ¤¹¡£·ë²Ì¤È¤·¤Æ¡¢¤³¤Îvmid¤Ï¡¢\fBrmi\fR¥×¥í¥È¥³¥ë¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥Û¥¹¥È¾å¤Î¥Ç¥Õ¥©¥ë¥È¤Î\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ÈÄÌ¿®¤·¤Þ¤¹¡£\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢rmiregistry¤ò»ÈÍѤ·¤Æ¡¢¥Ç¥Õ¥©¥ë¥È¤Îrmiregistry¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fBremote\&.domain\fR¤ËÇÛÃÖ¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstat \-gcutil 40496@remote\&.domain 1000 +-\fI\&.\&.\&. output omitted\fR ++\fBjstat \-gcutil 40496@remote\&.domain 1000\fR ++\fB\fI\&.\&.\&. output omitted\fR\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jstatd.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jstatd.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jstatd +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jstatd ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jstatd" "1" "2013ǯ11·î21Æü" "JDK 8" "¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + jstatd \- Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤ò¥â¥Ë¥¿¡¼¤·¡¢¥ê¥â¡¼¥È¡¦¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë¤¬JVM¤ËÀܳ¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï»î¸³Åª¤Ê¤â¤Î¤Ç¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIjstatd\fR [ \fIoptions\fR ] ++\fBjstatd\fR [ \fIoptions\fR ] + .fi + .if n \{\ + .RE +@@ -64,156 +66,164 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIjstatd\fR¥³¥Þ¥ó¥É¤Ï¡¢·×¬¤µ¤ì¤¿Java HotSpot VM¤ÎºîÀ®¤È½ªÎ»¤ò¥â¥Ë¥¿¡¼¤·¡¢¥í¡¼¥«¥ë¡¦¥·¥¹¥Æ¥à¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëJVM¤Ë¡¢¥ê¥â¡¼¥È¡¦¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë¤¬Àܳ¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤¹¤ëRMI¥µ¡¼¥Ð¡¼¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤¹¡£ ++\fBjstatd\fR¥³¥Þ¥ó¥É¤Ï¡¢·×¬¤µ¤ì¤¿Java HotSpot VM¤ÎºîÀ®¤È½ªÎ»¤ò¥â¥Ë¥¿¡¼¤·¡¢¥í¡¼¥«¥ë¡¦¥·¥¹¥Æ¥à¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëJVM¤Ë¡¢¥ê¥â¡¼¥È¡¦¥â¥Ë¥¿¥ê¥ó¥°¡¦¥Ä¡¼¥ë¤¬Àܳ¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤¹¤ëRMI¥µ¡¼¥Ð¡¼¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤¹¡£ + .PP +-\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ç¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤ËRMI¥ì¥¸¥¹¥È¥ê¤¬É¬Íפˤʤê¤Þ¤¹¡£\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¡¢¤Þ¤¿¤Ï\fI\-p\fR +-\fIport\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿¥Ý¡¼¥È¤Ç¡¢RMI¥ì¥¸¥¹¥È¥ê¤ËÀܳ¤·¤è¤¦¤È¤·¤Þ¤¹¡£RMI¥ì¥¸¥¹¥È¥ê¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢\fI\-p\fR +-\fIport\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Ý¡¼¥È¡¢¤Þ¤¿¤Ï\fI\-p\fR +-\fIport\fR¥ª¥×¥·¥ç¥ó¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥ÈRMI¥ì¥¸¥¹¥È¥ê¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fIjstatd\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥óÆâ¤Ë¡¢1¤Ä¤ÎRMI¥ì¥¸¥¹¥È¥ê¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤ÎºîÀ®¤Ï¡¢\fI\-nr\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤ÆÃæ»ß¤Ç¤­¤Þ¤¹¡£ ++\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ç¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤ËRMI¥ì¥¸¥¹¥È¥ê¤¬É¬Íפˤʤê¤Þ¤¹¡£\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È¤Ç¡¢¤Þ¤¿¤Ï\fB\-p\fR ++\fBport\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿¥Ý¡¼¥È¤Ç¡¢RMI¥ì¥¸¥¹¥È¥ê¤ËÀܳ¤·¤è¤¦¤È¤·¤Þ¤¹¡£RMI¥ì¥¸¥¹¥È¥ê¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢\fB\-p\fR ++\fBport\fR¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Ý¡¼¥È¡¢¤Þ¤¿¤Ï\fB\-p\fR ++\fBport\fR¥ª¥×¥·¥ç¥ó¤¬¾Êά¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥ÈRMI¥ì¥¸¥¹¥È¥ê¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤¿\fBjstatd\fR¥¢¥×¥ê¥±¡¼¥·¥ç¥óÆâ¤Ë¡¢1¤Ä¤ÎRMI¥ì¥¸¥¹¥È¥ê¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤ÎºîÀ®¤Ï¡¢\fB\-nr\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤ÆÃæ»ß¤Ç¤­¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-nr + .RS 4 +-´û¸¤ÎRMI¥ì¥¸¥¹¥È¥ê¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢\fIjstatd\fR¥×¥í¥»¥¹Æâ¤ËÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤òºîÀ®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£ ++´û¸¤ÎRMI¥ì¥¸¥¹¥È¥ê¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¡¢\fBjstatd\fR¥×¥í¥»¥¹Æâ¤ËÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤òºîÀ®¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .RE + .PP + \-p \fIport\fR + .RS 4 +-RMI¥ì¥¸¥¹¥È¥ê¤¬¤¢¤ë¤ÈͽÁÛ¤µ¤ì¤ë¥Ý¡¼¥ÈÈÖ¹æ¤Ç¤¹¡£¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¤Ï¡¢\fI\-nr\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤±¤ì¤ÐºîÀ®¤µ¤ì¤Þ¤¹¡£ ++RMI¥ì¥¸¥¹¥È¥ê¤¬¤¢¤ë¤ÈͽÁÛ¤µ¤ì¤ë¥Ý¡¼¥ÈÈÖ¹æ¤Ç¤¹¡£¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¤Ï¡¢\fB\-nr\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤±¤ì¤ÐºîÀ®¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-n \fIrminame\fR + .RS 4 +-RMI¥ì¥¸¥¹¥È¥ê¤Ë¤ª¤¤¤Æ¡¢¥ê¥â¡¼¥ÈRMI¥ª¥Ö¥¸¥§¥¯¥È¤¬¥Ð¥¤¥ó¥É¤µ¤ì¤ë̾Á°¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È̾¤Ï\fIJStatRemoteHost\fR¤Ç¤¹¡£Ê£¿ô¤Î\fIjstatd\fR¥µ¡¼¥Ð¡¼¤¬Æ±¤¸¥Û¥¹¥È¾å¤Çµ¯Æ°¤·¤Æ¤¤¤ë¾ì¹ç¡¢³Æ¥µ¡¼¥Ð¡¼¤Î¥¨¥¯¥¹¥Ý¡¼¥È¤·¤¿RMI¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢°ì°Õ¤Î̾Á°¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥â¥Ë¥¿¥ê¥ó¥°¡¦¥¯¥é¥¤¥¢¥ó¥È¤Î\fIhostid\fR¤ª¤è¤Ó\fIvmid\fRʸ»úÎó¤Ë¡¢¤½¤Î°ì°Õ¤Î¥µ¡¼¥Ð¡¼Ì¾¤ò´Þ¤á¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++RMI¥ì¥¸¥¹¥È¥ê¤Ë¤ª¤¤¤Æ¡¢¥ê¥â¡¼¥ÈRMI¥ª¥Ö¥¸¥§¥¯¥È¤¬¥Ð¥¤¥ó¥É¤µ¤ì¤ë̾Á°¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È̾¤Ï\fBJStatRemoteHost\fR¤Ç¤¹¡£Ê£¿ô¤Î\fBjstatd\fR¥µ¡¼¥Ð¡¼¤¬Æ±¤¸¥Û¥¹¥È¾å¤Çµ¯Æ°¤·¤Æ¤¤¤ë¾ì¹ç¡¢³Æ¥µ¡¼¥Ð¡¼¤Î¥¨¥¯¥¹¥Ý¡¼¥È¤·¤¿RMI¥ª¥Ö¥¸¥§¥¯¥È¤Î̾Á°¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢°ì°Õ¤Î̾Á°¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥â¥Ë¥¿¥ê¥ó¥°¡¦¥¯¥é¥¤¥¢¥ó¥È¤Î\fBhostid\fR¤ª¤è¤Ó\fBvmid\fRʸ»úÎó¤Ë¡¢¤½¤Î°ì°Õ¤Î¥µ¡¼¥Ð¡¼Ì¾¤ò´Þ¤á¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-JVM¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë\fI¥ª¥×¥·¥ç¥ó\fR¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++JVM¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë\fB¥ª¥×¥·¥ç¥ó\fR¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥»¥­¥å¥ê¥Æ¥£" + .PP +-\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢Å¬Àڤʥͥ¤¥Æ¥£¥Ö¡¦¥¢¥¯¥»¥¹¸¢¤ò»ý¤ÄJVM¤Î¤ß¤ò´Æ»ë¤Ç¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fIjstatd\fR¥×¥í¥»¥¹¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤ÈƱ¤¸¥æ¡¼¥¶¡¼»ñ³Ê¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£UNIX¥Ù¡¼¥¹¤Î¥·¥¹¥Æ¥à¤Ë¤ª¤±¤ëroot¥æ¡¼¥¶¡¼¤Ê¤É¤Î°ìÉô¤Î¥æ¡¼¥¶¡¼»ñ³Ê¤Ï¡¢¥·¥¹¥Æ¥à¾å¤ÎǤ°Õ¤ÎJVM¤Ë¤è¤Ã¤Æ¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤¿¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ø¤Î¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê»ñ³Ê¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë\fIjstatd\fR¥×¥í¥»¥¹¤Ï¡¢¥·¥¹¥Æ¥à¾å¤Î¤¹¤Ù¤Æ¤ÎJVM¤ò´Æ»ë¤Ç¤­¤Þ¤¹¤¬¡¢¥»¥­¥å¥ê¥Æ¥£¾å¤ÎÊ̤ÎÌäÂ꤬µ¯¤³¤ê¤Þ¤¹¡£ ++\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢Å¬Àڤʥͥ¤¥Æ¥£¥Ö¡¦¥¢¥¯¥»¥¹¸¢¤ò»ý¤ÄJVM¤Î¤ß¤ò¥â¥Ë¥¿¡¼¤Ç¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢\fBjstatd\fR¥×¥í¥»¥¹¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈJVM¤ÈƱ¤¸¥æ¡¼¥¶¡¼»ñ³Ê¾ÚÌÀ¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Solaris¡¢Linux¤ª¤è¤ÓOS X¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Ë¤ª¤±¤ëroot¥æ¡¼¥¶¡¼¤Ê¤É¤Î°ìÉô¤Î¥æ¡¼¥¶¡¼»ñ³Ê¾ÚÌÀ¤Ï¡¢¥·¥¹¥Æ¥à¾å¤ÎǤ°Õ¤ÎJVM¤Ë¤è¤Ã¤Æ¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤¿¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Ø¤Î¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê»ñ³Ê¾ÚÌÀ¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë\fBjstatd\fR¥×¥í¥»¥¹¤Ï¡¢¥·¥¹¥Æ¥à¾å¤Î¤¹¤Ù¤Æ¤ÎJVM¤ò¥â¥Ë¥¿¡¼¤Ç¤­¤Þ¤¹¤¬¡¢¥»¥­¥å¥ê¥Æ¥£¾å¤ÎÊ̤ÎÌäÂ꤬µ¯¤³¤ê¤Þ¤¹¡£ + .PP +-\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ë¤Ï¡¢¥ê¥â¡¼¥È¡¦¥¯¥é¥¤¥¢¥ó¥È¤Îǧ¾Úµ¡Ç½¤¬¤¢¤ê¤Þ¤»¤ó¡£¤½¤Î¤¿¤á¡¢\fIjstatd\fR¥µ¡¼¥Ð¡¼¡¦¥×¥í¥»¥¹¤ò¼Â¹Ô¤¹¤ë¤È¡¢\fIjstatd\fR¥×¥í¥»¥¹¤¬¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ä¤¹¤Ù¤Æ¤ÎJVM¤Ë¤è¤ë¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Î¥¨¥¯¥¹¥Ý¡¼¥È¤ò¡¢¥Í¥Ã¥È¥ï¡¼¥¯¾å¤Î¤¹¤Ù¤Æ¤Î¥æ¡¼¥¶¡¼¤Ë¸ø³«¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î̵ËÉÈ÷¤Ê¾õÂ֤ϡ¢´Ä¶­¤Ë¤è¤Ã¤Æ¤Ï˾¤Þ¤·¤¯¤Ê¤¤¾ì¹ç¤¬¤¢¤ë¤Î¤Ç¡¢Æä˼²ÔƯ´Ä¶­¤Þ¤¿¤Ï°ÂÁ´¤Ç¤Ê¤¤¥Í¥Ã¥È¥ï¡¼¥¯¤Ç¤Ï¡¢\fIjstatd\fR¥×¥í¥»¥¹¤òµ¯Æ°¤¹¤ëÁ°¤Ë¡¢¥í¡¼¥«¥ë¡¦¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¤ò¸¡Æ¤¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ë¤Ï¡¢¥ê¥â¡¼¥È¡¦¥¯¥é¥¤¥¢¥ó¥È¤Îǧ¾Úµ¡Ç½¤¬¤¢¤ê¤Þ¤»¤ó¡£¤½¤Î¤¿¤á¡¢\fBjstatd\fR¥µ¡¼¥Ð¡¼¡¦¥×¥í¥»¥¹¤ò¼Â¹Ô¤¹¤ë¤È¡¢\fBjstatd\fR¥×¥í¥»¥¹¤¬¥¢¥¯¥»¥¹¸¢¤ò»ý¤Ä¤¹¤Ù¤Æ¤ÎJVM¤Ë¤è¤ë¥¤¥ó¥¹¥È¥¥¥ë¥á¥ó¥Æ¡¼¥·¥ç¥ó¤Î¥¨¥¯¥¹¥Ý¡¼¥È¤ò¡¢¥Í¥Ã¥È¥ï¡¼¥¯¾å¤Î¤¹¤Ù¤Æ¤Î¥æ¡¼¥¶¡¼¤Ë¸ø³«¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤Î̵ËÉÈ÷¤Ê¾õÂ֤ϡ¢´Ä¶­¤Ë¤è¤Ã¤Æ¤Ï˾¤Þ¤·¤¯¤Ê¤¤¾ì¹ç¤¬¤¢¤ë¤Î¤Ç¡¢ÆäËËÜÈִĶ­¤Þ¤¿¤Ï¥»¥­¥å¥¢¤Ç¤Ê¤¤¥Í¥Ã¥È¥ï¡¼¥¯¤Ç¤Ï¡¢\fBjstatd\fR¥×¥í¥»¥¹¤òµ¯Æ°¤¹¤ëÁ°¤Ë¡¢¥í¡¼¥«¥ë¡¦¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¤ò¸¡Æ¤¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-\fIjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢Â¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢\fIRMISecurityPolicy\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/PolicyFiles\&.html¤Ë¤¢¤ë ++\fBjstatd\fR¥µ¡¼¥Ð¡¼¤Ï¡¢Â¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢\fBRMISecurityPolicy\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/PolicyFiles\&.html¤Ë¤¢¤ë + ¡Ö¥Ç¥Õ¥©¥ë¥È¤ÎPolicy¤Î¼ÂÁõ¤È¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Î¹½Ê¸¡×¤Ë½àµò¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹ + .PP +-¼¡¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£Îã³°¤òȯÀ¸¤»¤º¤Ë\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Ý¥ê¥·¡¼¤Ï¡¢¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥Ù¡¼¥¹¤Ø¤Î¤¢¤é¤æ¤ë¥¢¥¯¥»¥¹¸¢¤òǧ¤á¤ë¥Ý¥ê¥·¡¼¤è¤ê¤â¼«Í³ÅÙ¤¬Ä㤤¤Ç¤¹¤¬¡¢\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤ËºÇÄã¸ÂɬÍפʥ¢¥¯¥»¥¹¸¢¤Î¤ß¤òǧ¤á¤ë¥Ý¥ê¥·¡¼¤è¤ê¤â¼«Í³ÅÙ¤¬¹â¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ++¼¡¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£Îã³°¤òȯÀ¸¤»¤º¤Ë\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Ý¥ê¥·¡¼¤Ï¡¢¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥Ù¡¼¥¹¤Ø¤Î¤¢¤é¤æ¤ë¥¢¥¯¥»¥¹¸¢¤òǧ¤á¤ë¥Ý¥ê¥·¡¼¤è¤ê¤â¼«Í³ÅÙ¤¬Ä㤤¤Ç¤¹¤¬¡¢\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¤¿¤á¤ËºÇÄã¸ÂɬÍפʥ¢¥¯¥»¥¹¸¢¤Î¤ß¤òǧ¤á¤ë¥Ý¥ê¥·¡¼¤è¤ê¤â¼«Í³ÅÙ¤¬¹â¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-grant codebase "file:${java\&.home}/\&.\&./lib/tools\&.jar" { +- permission java\&.security\&.AllPermission; +-}; ++\fBgrant codebase "file:${java\&.home}/\&.\&./lib/tools\&.jar" { \fR ++\fB permission java\&.security\&.AllPermission;\fR ++\fB};\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤Î¥Ý¥ê¥·¡¼ÀßÄê¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤³¤Î¥Æ¥­¥¹¥È¤ò\fIjstatd\&.all\&.policy\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤Ë¥³¥Ô¡¼¤·¡¢¼¡¤Î¤è¤¦¤Ë\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤³¤Î¥Ý¥ê¥·¡¼ÀßÄê¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¤³¤Î¥Æ¥­¥¹¥È¤ò\fBjstatd\&.all\&.policy\fR¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤Ë¥³¥Ô¡¼¤·¡¢¼¡¤Î¤è¤¦¤Ë\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstatd \-J\-Djava\&.security\&.policy=jstatd\&.all\&.policy ++\fBjstatd \-J\-Djava\&.security\&.policy=jstatd\&.all\&.policy\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤è¤ê¸·¤·¤¤¥»¥­¥å¥ê¥Æ¥£¤ò¼Â»Ü¤¹¤ë¥µ¥¤¥È¤Î¾ì¹ç¡¢¥«¥¹¥¿¥à¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢ÆÃÄê¤Î¿®Íê¤Ç¤­¤ë¥Û¥¹¥È¤Þ¤¿¤Ï¥Í¥Ã¥È¥ï¡¼¥¯¤Ë¥¢¥¯¥»¥¹¤òÀ©¸Â¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î¤è¤¦¤ÊÊýË¡¤Ï¡¢IP¥¢¥É¥ì¥¹¤ÎÅðÄ°¹¶·â¤ò¼õ¤±¤ä¤¹¤¯¤Ê¤ê¤Þ¤¹¡£¥»¥­¥å¥ê¥Æ¥£¤ÎÌäÂê¤Ë¤Ä¤¤¤Æ¡¢¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç¤âÂнè¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¡¢\fIjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤»¤º¤Ë¡¢\fIjstat\fR¤È\fIjps\fR¥Ä¡¼¥ë¤ò¥í¡¼¥«¥ë¤Ç»ÈÍѤ¹¤ë¤³¤È¤¬ºÇ¤â°ÂÁ´¤ÊÊýË¡¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¤è¤ê¸·¤·¤¤¥»¥­¥å¥ê¥Æ¥£¤ò¼Â»Ü¤¹¤ë¥µ¥¤¥È¤Î¾ì¹ç¡¢¥«¥¹¥¿¥à¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢ÆÃÄê¤Î¿®Íê¤Ç¤­¤ë¥Û¥¹¥È¤Þ¤¿¤Ï¥Í¥Ã¥È¥ï¡¼¥¯¤Ë¥¢¥¯¥»¥¹¤òÀ©¸Â¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î¤è¤¦¤ÊÊýË¡¤Ï¡¢IP¥¢¥É¥ì¥¹¤ÎÅðÄ°¹¶·â¤ò¼õ¤±¤ä¤¹¤¯¤Ê¤ê¤Þ¤¹¡£¥»¥­¥å¥ê¥Æ¥£¤ÎÌäÂê¤Ë¤Ä¤¤¤Æ¡¢¥«¥¹¥¿¥Þ¥¤¥º¤·¤¿¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç¤âÂнè¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¡¢\fBjstatd\fR¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤»¤º¤Ë¡¢\fBjstat\fR¤È\fBjps\fR¥Ä¡¼¥ë¤ò¥í¡¼¥«¥ë¤Ç»ÈÍѤ¹¤ë¤³¤È¤¬ºÇ¤â°ÂÁ´¤ÊÊýË¡¤Ë¤Ê¤ê¤Þ¤¹¡£ + .SH "¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹" + .PP +-\fIjstatd\fR¥×¥í¥»¥¹¤¬¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢Æȼ«¤Ë³«È¯¤·¤¿¤â¤Î¤Ç¤¢¤êÊѹ¹¤µ¤ì¤ëͽÄê¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤ª¤è¤Ó³«È¯¼Ô¤Ï¡¢¤³¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ø¤Î½ñ¹þ¤ß¤ò¹Ô¤ï¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ ++\fBjstatd\fR¥×¥í¥»¥¹¤¬¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢Æȼ«¤Ë³«È¯¤·¤¿¤â¤Î¤Ç¤¢¤êÊѹ¹¤µ¤ì¤ëͽÄê¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤ª¤è¤Ó³«È¯¼Ô¤Ï¡¢¤³¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ø¤Î½ñ¹þ¤ß¤ò¹Ô¤ï¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£ + .SH "Îã" + .PP +-¼¡¤Ë¡¢\fIjstatd\fR¥³¥Þ¥ó¥É¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fIjstatd\fR¥¹¥¯¥ê¥×¥È¤Ë¤è¤Ã¤Æ¡¢¥µ¡¼¥Ð¡¼¤Ï¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼«Æ°Åª¤Ëµ¯Æ°¤·¤Þ¤¹¡£ ++¼¡¤Ë¡¢\fBjstatd\fR¥³¥Þ¥ó¥É¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£\fBjstatd\fR¥¹¥¯¥ê¥×¥È¤Ë¤è¤Ã¤Æ¡¢¥µ¡¼¥Ð¡¼¤Ï¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼«Æ°Åª¤Ëµ¯Æ°¤·¤Þ¤¹¡£ + .SS "ÆâÉôRMI¥ì¥¸¥¹¥È¥ê" + .PP +-¤³¤ÎÎã¤Ï¡¢ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤¿¥Û¥¹¥È¤Ë¤è¤ë\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤Îµ¯Æ°¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎRMI¥ì¥¸¥¹¥È¥ê¡¦¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ë¤Ï¡¢Â¾¤Î¥µ¡¼¥Ð¡¼¤Ï¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤Ê¤¤¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ï¡¢ÆâÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤¿\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤Îµ¯Æ°ÊýË¡¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎRMI¥ì¥¸¥¹¥È¥ê¡¦¥Ý¡¼¥È(¥Ý¡¼¥È1099)¤Ë¤Ï¡¢Â¾¤Î¥µ¡¼¥Ð¡¼¤Ï¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤Ê¤¤¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "³°ÉôRMI¥ì¥¸¥¹¥È¥ê" + .PP +-¤³¤ÎÎã¤Ï¡¢³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤¿\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤Îµ¯Æ°¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ï¡¢³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤¿\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤Îµ¯Æ°¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmiregistry& +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy ++\fBrmiregistry&\fR ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢¥Ý¡¼¥È2020¤Î³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤Æ\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥Ý¡¼¥È2020¤Î³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤Æ\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jrmiregistry 2020& +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy \-p 2020 ++\fBjrmiregistry 2020&\fR ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy \-p 2020\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢¥Ý¡¼¥È2020¤Î³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤Æ¡¢\fIAlternateJstatdServerName\fR¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ë\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥Ý¡¼¥È2020¤Î³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤ò»ÈÍѤ·¤Æ¡¢\fBAlternateJstatdServerName\fR¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ë\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmiregistry 2020& +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy \-p 2020 +- \-n AlternateJstatdServerName ++\fBrmiregistry 2020&\fR ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy \-p 2020\fR ++\fB \-n AlternateJstatdServerName\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥¤¥ó¥×¥í¥»¥¹RMI¥ì¥¸¥¹¥È¥ê¤ÎºîÀ®¤ÎÄä»ß" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤¬¤Ê¤¤¾ì¹ç¤ËºîÀ®¤·¤Ê¤¤\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢RMI¥ì¥¸¥¹¥È¥ê¤¬¤¹¤Ç¤Ë¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£RMI¥ì¥¸¥¹¥È¥ê¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢³°ÉôRMI¥ì¥¸¥¹¥È¥ê¤¬¤Ê¤¤¾ì¹ç¤ËºîÀ®¤·¤Ê¤¤\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢RMI¥ì¥¸¥¹¥È¥ê¤¬¤¹¤Ç¤Ë¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤ÈÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£RMI¥ì¥¸¥¹¥È¥ê¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy \-nr ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy \-nr\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "RMI¥í¥®¥ó¥°¤ÎÍ­¸ú²½" + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢RMI¥í¥®¥ó¥°µ¡Ç½¤òÍ­¸ú²½¤·¤Æ\fIjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤Þ¤¿¤Ï¥µ¡¼¥Ð¡¼³èÆ°¤Î¥â¥Ë¥¿¥ê¥ó¥°¤ËÌòΩ¤Á¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢RMI¥í¥®¥ó¥°µ¡Ç½¤òÍ­¸ú²½¤·¤Æ\fBjstatd\fR¥»¥Ã¥·¥ç¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£¤³¤ÎÊýË¡¤Ï¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤Þ¤¿¤Ï¥µ¡¼¥Ð¡¼³èÆ°¤Î¥â¥Ë¥¿¥ê¥ó¥°¤ËÌòΩ¤Á¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-jstatd \-J\-Djava\&.security\&.policy=all\&.policy +- \-J\-Djava\&.rmi\&.server\&.logCalls=true ++\fBjstatd \-J\-Djava\&.security\&.policy=all\&.policy\fR ++\fB \-J\-Djava\&.rmi\&.server\&.logCalls=true\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/solaris/doc/sun/man/man1/ja/jvisualvm.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/jvisualvm.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: jvisualvm +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: jvisualvm ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó¥°¤ª¤è¤Ó´ÉÍý¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "jvisualvm" "1" "2013ǯ11·î21Æü" "JDK 8" "Java¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¡¢¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¢¥â¥Ë¥¿¥ê¥ó" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-jvisualvm \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò»ë³ÐŪ¤Ë´Æ»ë¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥È¤ª¤è¤Ó¥×¥í¥Õ¥¡¥¤¥ë¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++jvisualvm \- Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò»ë³ÐŪ¤Ë¥â¥Ë¥¿¡¼¤·¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤È¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤ò¹Ô¤¤¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIjvisualvm\fR [ \fIoptions\fR ] ++\fBjvisualvm\fR [ \fIoptions\fR ] + .fi + .if n \{\ + .RE +@@ -64,15 +66,15 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-Java VisualVM¤Ï¡¢»ØÄꤵ¤ì¤¿Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤ÇJava¥Æ¥¯¥Î¥í¥¸¡¦¥Ù¡¼¥¹¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó(Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó)¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤­¤Ë¡¢¤½¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë´Ø¤¹¤ë¾ÜºÙ¤Ê¾ðÊó¤òÄ󶡤¹¤ëľ´¶Åª¤Ê¥°¥é¥Õ¥£¥«¥ë¡¦¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£Java VisualVM¤È¤¤¤¦Ì¾Á°¤Ï¡¢Java VisualVM¤¬JVM¥½¥Õ¥È¥¦¥§¥¢¤Ë´Ø¤¹¤ë¾ðÊó¤ò»ë³ÐŪ¤ËÄ󶡤¹¤ë¤È¤¤¤¦»ö¼Â¤ËͳÍ褷¤Æ¤¤¤Þ¤¹¡£ ++Java VisualVM¤Ï¡¢»ØÄꤵ¤ì¤¿Java Virtual Machine (JVM)¤ÇJava¥Æ¥¯¥Î¥í¥¸¡¦¥Ù¡¼¥¹¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó(Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó)¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤­¤Ë¡¢¤½¤ÎJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë´Ø¤¹¤ë¾ÜºÙ¤Ê¾ðÊó¤òÄ󶡤¹¤ëľ´¶Åª¤Ê¥°¥é¥Õ¥£¥«¥ë¡¦¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£Java VisualVM¤È¤¤¤¦Ì¾Á°¤Ï¡¢Java VisualVM¤¬JVM¥½¥Õ¥È¥¦¥§¥¢¤Ë´Ø¤¹¤ë¾ðÊó¤ò»ë³ÐŪ¤ËÄ󶡤¹¤ë¤È¤¤¤¦»ö¼Â¤ËͳÍ褷¤Æ¤¤¤Þ¤¹¡£ + .PP +-Java VisualVM¤Ï¡¢¤¤¤¯¤Ä¤«¤Î¥â¥Ë¥¿¥ê¥ó¥°¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ª¤è¤Ó¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò1¤Ä¤Î¥Ä¡¼¥ë¤ËÅý¹ç¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¹¥¿¥ó¥É¥¢¥í¥ó¡¦¥Ä¡¼¥ë\fIjmap\fR¡¢\fIjinfo\fR¡¢\fIjstat\fR¤ª¤è¤Ó\fIjstack\fR¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ëµ¡Ç½¤Î¤Û¤È¤ó¤É¤¬¡¢Java VisualVM¤ËÁȤ߹þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fIjconsole\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë°ìÉô¤Îµ¡Ç½¤Ê¤É¡¢Â¾¤Îµ¡Ç½¤Ï¥ª¥×¥·¥ç¥ó¤Î¥×¥é¥°¥¤¥ó¤È¤·¤ÆÄɲäǤ­¤Þ¤¹¡£ ++Java VisualVM¤Ï¡¢¤¤¤¯¤Ä¤«¤Î¥â¥Ë¥¿¥ê¥ó¥°¡¢¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ª¤è¤Ó¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò1¤Ä¤Î¥Ä¡¼¥ë¤ËÅý¹ç¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¥¹¥¿¥ó¥É¥¢¥í¥ó¡¦¥Ä¡¼¥ë\fBjmap\fR¡¢\fBjinfo\fR¡¢\fBjstat\fR¤ª¤è¤Ó\fBjstack\fR¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ëµ¡Ç½¤Î¤Û¤È¤ó¤É¤¬¡¢Java VisualVM¤ËÁȤ߹þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fBjconsole\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë°ìÉô¤Îµ¡Ç½¤Ê¤É¡¢Â¾¤Îµ¡Ç½¤Ï¥ª¥×¥·¥ç¥ó¤Î¥×¥é¥°¥¤¥ó¤È¤·¤ÆÄɲäǤ­¤Þ¤¹¡£ + .PP +-Java VisualVM¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î³«È¯¼Ô¤¬¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ò¹Ô¤Ã¤¿¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò´Æ»ë¤ª¤è¤Ó²þÁ±¤·¤¿¤ê¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£Java VisualVM¤ò»ÈÍѤ¹¤ë¤È¡¢³«È¯¼Ô¤Ï¥Ò¡¼¥×¡¦¥À¥ó¥×¤ÎÀ¸À®¤ª¤è¤Ó²òÀÏ¡¢¥á¥â¥ê¡¼¡¦¥ê¡¼¥¯¤ÎÆÃÄê¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¼Â¹Ô¤ª¤è¤Ó´Æ»ë¡¢¤ª¤è¤Ó¥á¥â¥ê¡¼¤ÈCPU¤Î´Ê°×¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤Î¼Â¹Ô¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£¥×¥é¥°¥¤¥ó¤ÇJava VisualVM¤Îµ¡Ç½¤ò³ÈÄ¥¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIjconsole\fR¥³¥Þ¥ó¥É¤Î¤Û¤È¤ó¤É¤Îµ¡Ç½¤Ï¡¢¡ÖMBean¡×¥¿¥Ö¤ª¤è¤ÓJConsole Plug\-in Wrapper¥×¥é¥°¥¤¥ó¤ò²ð¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£É¸½à¤ÎJava VisualVM¥×¥é¥°¥¤¥ó¤Î¥«¥¿¥í¥°¤«¤éÁªÂò¤¹¤ë¤Ë¤Ï¡¢Java VisualVM¥á¥Ë¥å¡¼¤Î\fB¡Ö¥Ä¡¼¥ë¡×\fR¡¢\fB¡Ö¥×¥é¥°¥¤¥ó¡×\fR¤òÁªÂò¤·¤Þ¤¹¡£ ++Java VisualVM¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î³«È¯¼Ô¤¬¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥È¥é¥Ö¥ë¥·¥å¡¼¥Æ¥£¥ó¥°¤ò¹Ô¤Ã¤¿¤ê¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¥â¥Ë¥¿¡¼¤ª¤è¤Ó²þÁ±¤·¤¿¤ê¤¹¤ë¤Î¤ËÌòΩ¤Á¤Þ¤¹¡£Java VisualVM¤ò»ÈÍѤ¹¤ë¤È¡¢³«È¯¼Ô¤Ï¥Ò¡¼¥×¡¦¥À¥ó¥×¤ÎÀ¸À®¤ª¤è¤Ó²òÀÏ¡¢¥á¥â¥ê¡¼¡¦¥ê¡¼¥¯¤ÎÆÃÄê¡¢¥¬¥Ù¡¼¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¤Î¼Â¹Ô¤ª¤è¤Ó¥â¥Ë¥¿¡¼¡¢¤ª¤è¤Ó¥á¥â¥ê¡¼¤ÈCPU¤Î´Ê°×¥×¥í¥Õ¥¡¥¤¥ê¥ó¥°¤Î¼Â¹Ô¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£¥×¥é¥°¥¤¥ó¤ÇJava VisualVM¤Îµ¡Ç½¤ò³ÈÄ¥¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBjconsole\fR¥³¥Þ¥ó¥É¤Î¤Û¤È¤ó¤É¤Îµ¡Ç½¤Ï¡¢¡ÖMBean¡×¥¿¥Ö¤ª¤è¤ÓJConsole Plug\-in Wrapper¥×¥é¥°¥¤¥ó¤ò²ð¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£É¸½à¤ÎJava VisualVM¥×¥é¥°¥¤¥ó¤Î¥«¥¿¥í¥°¤«¤éÁªÂò¤¹¤ë¤Ë¤Ï¡¢Java VisualVM¥á¥Ë¥å¡¼¤Î\fB¡Ö¥Ä¡¼¥ë¡×\fR¡¢\fB¡Ö¥×¥é¥°¥¤¥ó¡×\fR¤òÁªÂò¤·¤Þ¤¹¡£ + .PP + Java VisualVM¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp +@@ -80,7 +82,8 @@ + .RS 4 + .\} + .nf +-% jvisualvm <options> ++\fB% jvisualvm <options>\fR ++ + .fi + .if n \{\ + .RE +@@ -91,7 +94,7 @@ + .PP + \-J\fIjvm_option\fR + .RS 4 +-¤³¤Î\fIjvm_option\fR¤òJVM¥½¥Õ¥È¥¦¥§¥¢¤ËÅϤ·¤Þ¤¹¡£ ++¤³¤Î\fBjvm_option\fR¤òJVM¥½¥Õ¥È¥¦¥§¥¢¤ËÅϤ·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/keytool.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/keytool.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: keytool +-.\" Language: English +-.\" Date: 2013ǯ8·î6Æü +-.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: keytool ++.\" Language: Japanese ++.\" Date: 2013ǯ8·î6Æü ++.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "keytool" "1" "2013ǯ8·î6Æü" "JDK 8" "¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + keytool \- °Å¹æ²½¸°¡¢X\&.509¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ª¤è¤Ó¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò´Þ¤à¥­¡¼¥¹¥È¥¢(¥Ç¡¼¥¿¥Ù¡¼¥¹)¤ò´ÉÍý¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIkeytool\fR [\fIcommands\fR] ++\fBkeytool\fR [\fIcommands\fR] + .fi + .if n \{\ + .RE +@@ -332,13 +334,13 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¸°¤È¾ÚÌÀ½ñ¤ò´ÉÍý¤¹¤ë¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ç¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥æ¡¼¥¶¡¼¤Ï¼«Ê¬¤Î¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤ª¤è¤Ó´ØÏ¢¤¹¤ë¾ÚÌÀ½ñ¤ò´ÉÍý¤·¡¢¥Ç¥¸¥¿¥ë½ð̾¤ò»ÈÍѤ·¤¿¼«¸Êǧ¾Ú(¾¤Î¥æ¡¼¥¶¡¼¤Þ¤¿¤Ï¥µ¡¼¥Ó¥¹¤ËÂФ·¤Æ¼«Ê¬¼«¿È¤òǧ¾Ú¤¹¤ë¤³¤È)¤ä¡¢¥Ç¡¼¥¿¤ÎÀ°¹çÀ­¤È¾ÚÌÀ½ñ¤Ë´Ø¤¹¤ë¥µ¡¼¥Ó¥¹¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÄÌ¿®¤·¤Æ¤¤¤ë¥Ô¥¢¤Î¸ø³«¸°¤ò¥­¥ã¥Ã¥·¥å¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹(¾ÚÌÀ½ñ¤Î¥Õ¥©¡¼¥à¤Ç)¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¸°¤È¾ÚÌÀ½ñ¤ò´ÉÍý¤¹¤ë¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ç¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥æ¡¼¥¶¡¼¤Ï¼«Ê¬¤Î¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤ª¤è¤Ó´ØÏ¢¤¹¤ë¾ÚÌÀ½ñ¤ò´ÉÍý¤·¡¢¥Ç¥¸¥¿¥ë½ð̾¤ò»ÈÍѤ·¤¿¼«¸Êǧ¾Ú(¾¤Î¥æ¡¼¥¶¡¼¤Þ¤¿¤Ï¥µ¡¼¥Ó¥¹¤ËÂФ·¤Æ¼«Ê¬¼«¿È¤òǧ¾Ú¤¹¤ë¤³¤È)¤ä¡¢¥Ç¡¼¥¿¤ÎÀ°¹çÀ­¤È¾ÚÌÀ½ñ¤Ë´Ø¤¹¤ë¥µ¡¼¥Ó¥¹¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÄÌ¿®¤·¤Æ¤¤¤ë¥Ô¥¢¤Î¸ø³«¸°¤ò¥­¥ã¥Ã¥·¥å¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹(¾ÚÌÀ½ñ¤Î¥Õ¥©¡¼¥à¤Ç)¡£ + .PP + ¾ÚÌÀ½ñ¤È¤Ï¡¢¤¢¤ë¥¨¥ó¥Æ¥£¥Æ¥£(¿Íʪ¡¢²ñ¼Ò¤Ê¤É)¤«¤é¤Î¥Ç¥¸¥¿¥ë½ð̾ÉÕ¤­¤Îʸ½ñ¤Î¤³¤È¤Ç¤¹¡£¾ÚÌÀ½ñ¤Ë¤Ï¡¢Â¾¤Î¤¢¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸ø³«¸°(¤ª¤è¤Ó¤½¤Î¾¤Î¾ðÊó)¤¬ÆÃÊ̤ÊÃͤò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬½ñ¤«¤ì¤Æ¤¤¤Þ¤¹¡£(¾ÚÌÀ½ñ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£)¥Ç¡¼¥¿¤Ë¥Ç¥¸¥¿¥ë½ð̾¤¬ÉÕ¤¤¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¥Ç¥¸¥¿¥ë½ð̾¤ò¸¡¾Ú¤¹¤ë¤³¤È¤Ç¡¢¥Ç¡¼¥¿¤ÎÀ°¹çÀ­¤ª¤è¤Ó¥Ç¡¼¥¿¤¬ËÜʪ¤Ç¤¢¤ë¤³¤È¤ò¥Á¥§¥Ã¥¯¤Ç¤­¤Þ¤¹¡£¥Ç¡¼¥¿¤ÎÀ°¹çÀ­¤È¤Ï¡¢¥Ç¡¼¥¿¤¬Êѹ¹¤µ¤ì¤¿¤ê¡¢²þÊѤµ¤ì¤¿¤ê¤·¤Æ¤¤¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤Þ¤¿¡¢¥Ç¡¼¥¿¤¬ËÜʪ¤Ç¤¢¤ë¤È¤Ï¡¢¤½¤Î¥Ç¡¼¥¿¤¬¡¢¥Ç¡¼¥¿¤òºîÀ®¤·¤Æ½ð̾¤·¤¿¤È¾Î¤¹¤ë¿Íʪ¤«¤éÅϤµ¤ì¤¿¥Ç¡¼¥¿¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ + .PP +-¤Þ¤¿¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢ÂоΰŹ沽/Éü¹æ²½(DES)¤Ç»ÈÍѤµ¤ì¤ëÈëÌ©¸°¤ª¤è¤Ó¥Ñ¥¹¥Õ¥ì¡¼¥º¤ò´ÉÍý¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++¤Þ¤¿¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢ÂоΰŹ沽/Éü¹æ²½(DES)¤Ç»ÈÍѤµ¤ì¤ëÈëÌ©¸°¤ª¤è¤Ó¥Ñ¥¹¥Õ¥ì¡¼¥º¤ò´ÉÍý¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¸°¤È¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¸°¤È¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥³¥Þ¥ó¥É¤È¥ª¥×¥·¥ç¥ó¤Ë´Ø¤¹¤ëÃí°Õ" + .PP + ÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤È¤½¤ÎÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +@@ -384,7 +386,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥ª¥×¥·¥ç¥ó¤ò°Ï¤àÃ楫¥Ã¥³¤Ï¡¢¤½¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤ¬»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£Ã楫¥Ã¥³¤Ï¡¢\fI\-v\fR¡¢\fI\-rfc\fR¤ª¤è¤Ó\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò°Ï¤à¤¿¤á¤Ë¤â»ÈÍѤµ¤ì¤Þ¤¹¤¬¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤵ¤ì¤¿¾ì¹ç¤Ë¤Î¤ß°ÕÌ£¤ò»ý¤Á¤Þ¤¹¡£»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç°Ê³°¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤϤ¢¤ê¤Þ¤»¤ó¡£ ++¥ª¥×¥·¥ç¥ó¤ò°Ï¤àÃ楫¥Ã¥³¤Ï¡¢¤½¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤ¬»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£Ã楫¥Ã¥³¤Ï¡¢\fB\-v\fR¡¢\fB\-rfc\fR¤ª¤è¤Ó\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò°Ï¤à¤¿¤á¤Ë¤â»ÈÍѤµ¤ì¤Þ¤¹¤¬¡¢¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤵ¤ì¤¿¾ì¹ç¤Ë¤Î¤ß°ÕÌ£¤ò»ý¤Á¤Þ¤¹¡£»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç°Ê³°¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤϤ¢¤ê¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -395,7 +397,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥ª¥×¥·¥ç¥ó¤ò°Ï¤à³Ñ¥«¥Ã¥³¤Ï¡¢¤½¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢ÃͤÎÆþÎϤòµá¤á¤é¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fI\-keypass\fR¥ª¥×¥·¥ç¥ó¤Î¾ì¹ç¡¢¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤¬¤Þ¤º¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ÈÍѤ·¤ÆÈó¸ø³«/ÈëÌ©¸°¤ÎÉü¸µ¤ò»î¤ß¤Þ¤¹¡£¤³¤Î»î¤ß¤¬¼ºÇÔ¤·¤¿¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê¡¢Èó¸ø³«/ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥ª¥×¥·¥ç¥ó¤ò°Ï¤à³Ñ¥«¥Ã¥³¤Ï¡¢¤½¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ë¡¢ÃͤÎÆþÎϤòµá¤á¤é¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£\fB\-keypass\fR¥ª¥×¥·¥ç¥ó¤Î¾ì¹ç¡¢¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤¬¤Þ¤º¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ÈÍѤ·¤ÆÈó¸ø³«/ÈëÌ©¸°¤ÎÉü¸µ¤ò»î¤ß¤Þ¤¹¡£¤³¤Î»î¤ß¤¬¼ºÇÔ¤·¤¿¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ë¤è¤ê¡¢Èó¸ø³«/ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -406,12 +408,12 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¥¤¥¿¥ê¥Ã¥¯ÂΤιàÌܤμºݤÎÃÍ(¥ª¥×¥·¥ç¥ó¤ÎÃÍ)¤Ï¡¢»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-printcert\fR¥³¥Þ¥ó¥É¤Î·Á¼°¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ ++¥¤¥¿¥ê¥Ã¥¯ÂΤιàÌܤμºݤÎÃÍ(¥ª¥×¥·¥ç¥ó¤ÎÃÍ)¤Ï¡¢»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-printcert\fR¥³¥Þ¥ó¥É¤Î·Á¼°¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp +-\fIkeytool \-printcert {\-file cert_file} {\-v}\fR ++\fBkeytool \-printcert {\-file cert_file} {\-v}\fR + .sp +-\fI\-printcert\fR¥³¥Þ¥ó¥É¤ò»ØÄꤹ¤ë¾ì¹ç¤Ï¡¢\fIcert_file\fR¤ò¼ÂºÝ¤Î¥Õ¥¡¥¤¥ë̾¤ÇÃÖ¤­´¹¤¨¤Þ¤¹¡£Îã: +-\fIkeytool \-printcert \-file VScert\&.cer\fR ++\fB\-printcert\fR¥³¥Þ¥ó¥É¤ò»ØÄꤹ¤ë¾ì¹ç¤Ï¡¢\fBcert_file\fR¤ò¼ÂºÝ¤Î¥Õ¥¡¥¤¥ë̾¤ÇÃÖ¤­´¹¤¨¤Þ¤¹¡£Îã: ++\fBkeytool \-printcert \-file VScert\&.cer\fR + .RE + .sp + .RS 4 +@@ -433,7 +435,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-help\fR¥ª¥×¥·¥ç¥ó¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIkeytool \-help\fR¤ÈƱ¤¸¤Ç¤¹¡£ ++\fB\-help\fR¥ª¥×¥·¥ç¥ó¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBkeytool \-help\fR¤ÈƱ¤¸¤Ç¤¹¡£ + .RE + .SH "¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃÍ" + .PP +@@ -443,38 +445,39 @@ + .RS 4 + .\} + .nf +-\-alias "mykey" ++\fB\-alias "mykey"\fR ++\fB \fR ++\fB\-keyalg\fR ++\fB "DSA" (when using \-genkeypair)\fR ++\fB "DES" (when using \-genseckey)\fR ++\fB \fR ++\fB\-keysize\fR ++\fB 2048 (when using \-genkeypair and \-keyalg is "RSA")\fR ++\fB 1024 (when using \-genkeypair and \-keyalg is "DSA")\fR ++\fB 256 (when using \-genkeypair and \-keyalg is "EC")\fR ++\fB 56 (when using \-genseckey and \-keyalg is "DES")\fR ++\fB 168 (when using \-genseckey and \-keyalg is "DESede")\fR ++\fB \fR ++\fB\-validity 90\fR ++\fB \fR ++\fB\-keystore <the file named \&.keystore in the user\*(Aqs home directory>\fR ++\fB \fR ++\fB\-storetype <the value of the "keystore\&.type" property in the\fR ++\fB security properties file, which is returned by the static\fR ++\fB getDefaultType method in java\&.security\&.KeyStore>\fR ++\fB \fR ++\fB\-file\fR ++\fB stdin (if reading)\fR ++\fB stdout (if writing)\fR ++\fB \fR ++\fB\-protected false\fR + +-\-keyalg +- "DSA" (when using \-genkeypair) +- "DES" (when using \-genseckey) +- +-\-keysize +- 2048 (when using \-genkeypair and \-keyalg is "RSA") +- 1024 (when using \-genkeypair and \-keyalg is "DSA") +- 256 (when using \-genkeypair and \-keyalg is "EC") +- 56 (when using \-genseckey and \-keyalg is "DES") +- 168 (when using \-genseckey and \-keyalg is "DESede") +- +-\-validity 90 +- +-\-keystore <the file named \&.keystore in the user\*(Aqs home directory> +- +-\-storetype <the value of the "keystore\&.type" property in the +- security properties file, which is returned by the static +- getDefaultType method in java\&.security\&.KeyStore> +- +-\-file +- stdin (if reading) +- stdout (if writing) +- +-\-protected false + .fi + .if n \{\ + .RE + .\} + .PP +-¸ø³«/ÈëÌ©¸°¥Ú¥¢¤ÎÀ¸À®¤Ë¤ª¤¤¤Æ¡¢½ð̾¥¢¥ë¥´¥ê¥º¥à(\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó)¤Ï¡¢´ð¤Ë¤Ê¤ëÈëÌ©¸°¤Î¥¢¥ë¥´¥ê¥º¥à¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£ ++¸ø³«/ÈëÌ©¸°¥Ú¥¢¤ÎÀ¸À®¤Ë¤ª¤¤¤Æ¡¢½ð̾¥¢¥ë¥´¥ê¥º¥à(\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó)¤Ï¡¢´ð¤Ë¤Ê¤ëÈëÌ©¸°¤Î¥¢¥ë¥´¥ê¥º¥à¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -484,7 +487,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬DSA¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA1withDSA¤Ë¤Ê¤ê¤Þ¤¹¡£ ++´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬DSA¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA1withDSA¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -495,7 +498,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬RSA¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA256withRSA¤Ë¤Ê¤ê¤Þ¤¹¡£ ++´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬RSA¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA256withRSA¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -506,16 +509,16 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬EC¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA256withECDSA¤Ë¤Ê¤ê¤Þ¤¹¡£ ++´ð¤Ë¤Ê¤ëÈëÌ©¸°¤¬EC¥¿¥¤¥×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-sigalg\fR¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤÏSHA256withECDSA¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP +-\fI\-keyalg\fR¤ª¤è¤Ó\fI\-sigalg\fR°ú¿ô¤Î´°Á´¤Ê¥ê¥¹¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢ ++\fB\-keyalg\fR¤ª¤è¤Ó\fB\-sigalg\fR°ú¿ô¤Î´°Á´¤Ê¥ê¥¹¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢ + http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec\&.html#AppA¤Î¡ÖJava Cryptography Architecture (JCA) Reference Guide¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "°ìÈÌ¥ª¥×¥·¥ç¥ó" + .PP +-\fI\-v\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fI\-help\fR¥³¥Þ¥ó¥É¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ÈÍѤǤ­¤Þ¤¹¡£\fI\-v\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¾éĹ¥â¡¼¥É¤Ç¼Â¹Ô¤µ¤ì¡¢¾ÜºÙ¤Ê¾ðÊ󤬽ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-v\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢\fB\-help\fR¥³¥Þ¥ó¥É¤ò½ü¤¯¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ÈÍѤǤ­¤Þ¤¹¡£\fB\-v\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¤Ï¾éĹ¥â¡¼¥É¤Ç¼Â¹Ô¤µ¤ì¡¢¾ÜºÙ¤Ê¾ðÊ󤬽ÐÎϤµ¤ì¤Þ¤¹¡£ + .PP +-Ǥ°Õ¤Î¥³¥Þ¥ó¥É¤Ç»ØÄê¤Ç¤­¤ë\fI\-Jjavaoption\fR°ú¿ô¤â¤¢¤ê¤Þ¤¹¡£\fI\-Jjavaoption\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢»ØÄꤵ¤ì¤¿\fIjavaoption\fRʸ»úÎó¤¬Java¥¤¥ó¥¿¥×¥ê¥¿¤ËľÀÜÅϤµ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤòÄ´À°¤¹¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£»ØÄê¤Ç¤­¤ë¥¤¥ó¥¿¥×¥ê¥¿¡¦¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjava \-h\fR¤Þ¤¿¤Ï\fIjava \-X\fR¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£ ++Ǥ°Õ¤Î¥³¥Þ¥ó¥É¤Ç»ØÄê¤Ç¤­¤ë\fB\-Jjavaoption\fR°ú¿ô¤â¤¢¤ê¤Þ¤¹¡£\fB\-Jjavaoption\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢»ØÄꤵ¤ì¤¿\fBjavaoption\fRʸ»úÎó¤¬Java¥¤¥ó¥¿¥×¥ê¥¿¤ËľÀÜÅϤµ¤ì¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤Ï¡¢¶õÇò¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¼Â¹Ô´Ä¶­¤Þ¤¿¤Ï¥á¥â¥ê¡¼»ÈÍѤòÄ´À°¤¹¤ë¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£»ØÄê¤Ç¤­¤ë¥¤¥ó¥¿¥×¥ê¥¿¡¦¥ª¥×¥·¥ç¥ó¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ç\fBjava \-h\fR¤Þ¤¿¤Ï\fBjava \-X\fR¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£ + .PP + ¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥­¡¼¥¹¥È¥¢¤ËÂФ¹¤ëÁàºî¤ò¹Ô¤¦¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£ + .PP +@@ -528,18 +531,18 @@ + .RS 4 + ¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-ÆÃÄê¤Î\fIkeytool\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë¡¢JKS +-\fIstoretype\fR¤¬»ÈÍѤµ¤ì¡¢¤«¤Ä¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¿·¤·¤¤¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIkeytool \-genkeypair\fR¤Î¸Æ½Ð¤·»þ¤Ë\fI\-keystore\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fI\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢¤½¤³¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£Æ±Íͤˡ¢\fI\-keystore ks_file\fR¤È¤¤¤¦¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤â¤½¤Îks_file¤¬Â¸ºß¤·¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£JKS +-\fIstoretype\fR¤Î¾ÜºÙ¤Ï¡¢\fI¤Î\fRKeyStore¤Î¼ÂÁõ¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾¤Ë´Ø¤¹¤ë¹à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ÆÃÄê¤Î\fBkeytool\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëºÝ¤Ë¡¢JKS ++\fBstoretype\fR¤¬»ÈÍѤµ¤ì¡¢¤«¤Ä¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¿·¤·¤¤¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBkeytool \-genkeypair\fR¤Î¸Æ½Ð¤·»þ¤Ë\fB\-keystore\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fB\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤¬¥æ¡¼¥¶¡¼¤Î¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¢¤½¤³¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£Æ±Íͤˡ¢\fB\-keystore ks_file\fR¤È¤¤¤¦¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤â¤½¤Îks_file¤¬Â¸ºß¤·¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£JKS ++\fBstoretype\fR¤Î¾ÜºÙ¤Ï¡¢\fI¤Î\fRKeyStore¤Î¼ÂÁõ¥­¡¼¥¹¥È¥¢¤ÎÊÌ̾¤Ë´Ø¤¹¤ë¹à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-keystore\fR¥ª¥×¥·¥ç¥ó¤«¤é¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¡¢\fIKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£URL¤È¤·¤Æ\fINONE\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢null¤Î¥¹¥È¥ê¡¼¥à¤¬\fIKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£\fINONE\fR¤Ï¡¢KeyStore¤¬¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ë»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¡¦¥Ç¥Ð¥¤¥¹¾å¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ê¤É¤Ç¤¹¡£ ++\fB\-keystore\fR¥ª¥×¥·¥ç¥ó¤«¤é¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¡¢\fBKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£URL¤È¤·¤Æ\fBNONE\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢null¤Î¥¹¥È¥ê¡¼¥à¤¬\fBKeyStore\&.load\fR¥á¥½¥Ã¥É¤ËÅϤµ¤ì¤Þ¤¹¡£\fBNONE\fR¤Ï¡¢KeyStore¤¬¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Ç¤Ï¤Ê¤¤¾ì¹ç¤Ë»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢¥Ï¡¼¥É¥¦¥§¥¢¡¦¥È¡¼¥¯¥ó¡¦¥Ç¥Ð¥¤¥¹¾å¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ê¤É¤Ç¤¹¡£ + .RE + .PP + \-storepass[:\fIenv\fR| :\fIfile\fR] argument + .RS 4 + ¥­¡¼¥¹¥È¥¢¤ÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-½¤¾þ»Ò\fIenv\fR¤Þ¤¿¤Ï\fIfile\fR¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fIargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ÎÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ ++½¤¾þ»Ò\fBenv\fR¤Þ¤¿¤Ï\fBfile\fR¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÃͤÏ\fBargument\fR¤Ë¤Ê¤ê¤Þ¤¹¡£¤³¤ÎÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼èÆÀ¤µ¤ì¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -549,8 +552,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIenv\fR: +-\fIargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBenv\fR: ++\fBargument\fR¤È¤¤¤¦Ì¾Á°¤Î´Ä¶­ÊÑ¿ô¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -561,13 +564,13 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIfile\fR: argument¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ ++\fBfile\fR: argument¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤«¤é¥Ñ¥¹¥ï¡¼¥É¤ò¼èÆÀ¤·¤Þ¤¹¡£ + .RE + .sp + \fBÃí°Õ:\fR +-\fI\-keypass\fR¡¢\fI\-srckeypass\fR¡¢\-\fIdestkeypass\fR¡¢\fI\-srcstorepass\fR¡¢\fI\-deststorepass\fR¤Ê¤É¤Î¥Ñ¥¹¥ï¡¼¥É¤òɬÍפȤ¹¤ë¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¡¢\fIenv\fR¤ª¤è¤Ó\fIfile\fR½¤¾þ»Ò¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¡¦¥ª¥×¥·¥ç¥ó¤È½¤¾þ»Ò¤Ï¡¢É¬¤º¥³¥í¥ó(:)¤Ç¶èÀڤäƤ¯¤À¤µ¤¤¡£ ++\fB\-keypass\fR¡¢\fB\-srckeypass\fR¡¢\-\fBdestkeypass\fR¡¢\fB\-srcstorepass\fR¡¢\fB\-deststorepass\fR¤Ê¤É¤Î¥Ñ¥¹¥ï¡¼¥É¤òɬÍפȤ¹¤ë¤½¤Î¾¤Î¥ª¥×¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¡¢\fIenv\fR¤ª¤è¤Ó\fIfile\fR½¤¾þ»Ò¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¡¦¥ª¥×¥·¥ç¥ó¤È½¤¾þ»Ò¤Ï¡¢É¬¤º¥³¥í¥ó(:)¤Ç¶èÀڤäƤ¯¤À¤µ¤¤¡£ + .sp +-¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤ÎÆâÍƤ˥¢¥¯¥»¥¹¤¹¤ë¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¼ï¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤ÎÆâÍƤ˥¢¥¯¥»¥¹¤¹¤ë¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¼ï¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-storepass\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp + ¥­¡¼¥¹¥È¥¢¤«¤é¾ðÊó¤ò¼èÆÀ¤¹¤ë¾ì¹ç¡¢¥Ñ¥¹¥ï¡¼¥É¤Ï¾Êά²Äǽ¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¼èÆÀ¤·¤¿¾ðÊó¤ÎÀ°¹çÀ­¤ò¸¡¾Ú¤Ç¤­¤º¡¢·Ù¹ð¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .RE +@@ -584,75 +587,74 @@ + .PP + \-providerArg \fIprovider_arg\fR + .RS 4 +-\fI\-providerClass\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤµ¤ì¡¢\fIprovider_class_name\fR¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¥ª¥×¥·¥ç¥ó¤Îʸ»úÎóÆþÎÏ°ú¿ô¤òɽ¤·¤Þ¤¹¡£ ++\fB\-providerClass\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤµ¤ì¡¢\fBprovider_class_name\fR¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤Î¥ª¥×¥·¥ç¥ó¤Îʸ»úÎóÆþÎÏ°ú¿ô¤òɽ¤·¤Þ¤¹¡£ + .RE + .PP + \-protected + .RS 4 +-\fItrue\fR¤Þ¤¿¤Ï\fIfalse\fR¤Î¤¤¤º¤ì¤«¡£¥Ñ¥¹¥ï¡¼¥É¤òÀìÍÑPIN¥ê¡¼¥À¡¼¤Ê¤É¤ÎÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹·Ðͳ¤Ç»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤ÎÃͤò\fItrue\fR¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI\-importkeystore\fR¥³¥Þ¥ó¥É¤Ë¤Ï2¤Ä¤Î¥­¡¼¥¹¥È¥¢¤¬´ØÏ¢¤·¤Æ¤¤¤ë¤¿¤á¡¢¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢¤È°¸À襭¡¼¥¹¥È¥¢¤Ë¤½¤ì¤¾¤ì¼¡¤Î2¤Ä¤Î¥ª¥×¥·¥ç¥ó¡¢\fI\-srcprotected\fR¤È\-\fIdestprotected\fR¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fBtrue\fR¤Þ¤¿¤Ï\fBfalse\fR¤Î¤¤¤º¤ì¤«¡£¥Ñ¥¹¥ï¡¼¥É¤òÀìÍÑPIN¥ê¡¼¥À¡¼¤Ê¤É¤ÎÊݸ¤ì¤¿Ç§¾Ú¥Ñ¥¹·Ðͳ¤Ç»ØÄꤹ¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢¤³¤ÎÃͤò\fBtrue\fR¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-importkeystore\fR¥³¥Þ¥ó¥É¤Ë¤Ï2¤Ä¤Î¥­¡¼¥¹¥È¥¢¤¬´ØÏ¢¤·¤Æ¤¤¤ë¤¿¤á¡¢¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢¤È°¸À襭¡¼¥¹¥È¥¢¤Ë¤½¤ì¤¾¤ì¼¡¤Î2¤Ä¤Î¥ª¥×¥·¥ç¥ó¡¢\fB\-srcprotected\fR¤È\-\fBdestprotected\fR¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + \-ext \fI{name{:critical} {=value}}\fR + .RS 4 +-X\&.509¾ÚÌÀ½ñ¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fI\-genkeypair\fR¤ª¤è¤Ó\fI\-gencert\fR¤Ç»ÈÍѤ·¤Æ¡¢À¸À®¤µ¤ì¤ë¾ÚÌÀ½ñ¤Þ¤¿¤Ï\fI\-certreq\fR¤Ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤òËä¤á¹þ¤ß¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤Ç¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÊ£¿ô²ó»ØÄê¤Ç¤­¤Þ¤¹¡£\fIname\fR°ú¿ô¤Ë¤Ï¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó̾(̾Á°ÉÕ¤­¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò»²¾È)¤Þ¤¿¤ÏǤ°Õ¤ÎOIDÈÖ¹æ¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIvalue\fR°ú¿ô¤Ï¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î°ú¿ô¤ò»Ø¤·¤Þ¤¹¡£\fIvalue\fR¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤޤ¿¤Ï¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬°ú¿ô¤òɬÍפȤ·¤Ê¤¤¤³¤È¤ò¼¨¤·¤Þ¤¹¡£\fI:critical\fR½¤¾þ»Ò¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î\fIisCritical\fR°À­¤Ï\fItrue\fR¤Ç¡¢»ØÄꤵ¤ì¤Ê¤¤¾ì¹ç¤Ï\fIfalse\fR¤Ç¤¹¡£\fI:critical\fR¤Î¤«¤ï¤ê¤Ë\fI:c\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++X\&.509¾ÚÌÀ½ñ¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fB\-genkeypair\fR¤ª¤è¤Ó\fB\-gencert\fR¤Ç»ÈÍѤ·¤Æ¡¢À¸À®¤µ¤ì¤ë¾ÚÌÀ½ñ¤Þ¤¿¤Ï\fB\-certreq\fR¤Ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤òËä¤á¹þ¤ß¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤Ç¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÊ£¿ô²ó»ØÄê¤Ç¤­¤Þ¤¹¡£\fBname\fR°ú¿ô¤Ë¤Ï¡¢¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó̾(̾Á°ÉÕ¤­¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò»²¾È)¤Þ¤¿¤ÏǤ°Õ¤ÎOIDÈÖ¹æ¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBvalue\fR°ú¿ô¤Ï¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î°ú¿ô¤ò»Ø¤·¤Þ¤¹¡£\fIvalue\fR¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤޤ¿¤Ï¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬°ú¿ô¤òɬÍפȤ·¤Ê¤¤¤³¤È¤ò¼¨¤·¤Þ¤¹¡£\fB:critical\fR½¤¾þ»Ò¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î\fBisCritical\fR°À­¤Ï\fBtrue\fR¤Ç¡¢»ØÄꤵ¤ì¤Ê¤¤¾ì¹ç¤Ï\fBfalse\fR¤Ç¤¹¡£\fB:critical\fR¤Î¤«¤ï¤ê¤Ë\fB:c\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .SH "̾Á°ÉÕ¤­¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó" + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î̾Á°¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£Ì¾Á°¤ÎÂç/¾®Ê¸»ú¤Ï¶èÊ̤µ¤ì¤Þ¤»¤ó¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î̾Á°¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£Ì¾Á°¤ÎÂç/¾®Ê¸»ú¤Ï¶èÊ̤µ¤ì¤Þ¤»¤ó¡£ + .PP + BC¤Þ¤¿¤ÏBasicContraints + .RS 4 +-\fBÃÍ\fR: ´°Á´¤Ê·Á¼°¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹: +-\fIca:{true|false}[,pathlen:<len>]\fR¤Þ¤¿¤Ï\fI<len>\fR(¤³¤ì¤Ï¡¢\fIca:true,pathlen:<len>\fR¤Îû½Ì·Á¤Ç¤¹)¡£<\fIlen\fR>¤ò¾Êά¤¹¤ë¤È¡¢\fIca:true\fR¤Î°ÕÌ£¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBÃÍ\fR: ´°Á´¤Ê·Á¼°¤Ï¡¢\fBca:{true|false}[,pathlen:<len>]\fR¤Þ¤¿¤Ï\fB<len>\fR(\fBca:true,pathlen:<len>\fR¤Îû½Ì·Á)¤Ç¤¹¡£<\fBlen\fR>¤ò¾Êά¤¹¤ë¤È¡¢\fBca:true\fR¤Î°ÕÌ£¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + KU¤Þ¤¿¤ÏKeyUsage + .RS 4 + \fBÃÍ\fR: +-\fIusage\fR(\fIusage\fR)*¡¢\fIusage\fR¤Ë¤Ï\fIdigitalSignature\fR¡¢\fInonRepudiation\fR +-(contentCommitment)¡¢\fIkeyEncipherment\fR¡¢\fIdataEncipherment\fR¡¢\fIkeyAgreement\fR¡¢\fIkeyCertSign\fR¡¢\fIcRLSign\fR¡¢\fIencipherOnly\fR¡¢\fIdecipherOnly\fR¤Î¤¤¤º¤ì¤«¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIusage\fR°ú¿ô¤Ï¡¢ÉÔÌÀ³Î¤Ë¤Ê¤é¤Ê¤¤¤«¤®¤ê¡¢ºÇ½é¤Î¿ôʸ»ú(\fIdigitalSignature\fR¤Î¾ì¹ç¤Ï\fIdig\fR)¤Þ¤¿¤Ï¥­¥ã¥á¥ë¥±¡¼¥¹¡¦¥¹¥¿¥¤¥ë(\fIdigitalSignature\fR¤Î¾ì¹ç¤Ï\fIdS\fR¡¢\fIcRLSign\fR¤Î¾ì¹ç¤Ï\fIcRLS\fR)¤Ç¾Êάɽµ­¤Ç¤­¤Þ¤¹¡£\fIusage\fRÃͤϡ¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ ++\fBusage\fR(\fBusage\fR)*¡¢\fIusage\fR¤Ë¤Ï\fBdigitalSignature\fR¡¢\fBnonRepudiation\fR ++(contentCommitment)¡¢\fBkeyEncipherment\fR¡¢\fBdataEncipherment\fR¡¢\fBkeyAgreement\fR¡¢\fBkeyCertSign\fR¡¢\fBcRLSign\fR¡¢\fBencipherOnly\fR¡¢\fBdecipherOnly\fR¤Î¤¤¤º¤ì¤«¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIusage\fR°ú¿ô¤Ï¡¢ÉÔÌÀ³Î¤Ë¤Ê¤é¤Ê¤¤¤«¤®¤ê¡¢ºÇ½é¤Î¿ôʸ»ú(\fBdigitalSignature\fR¤Î¾ì¹ç¤Ï\fBdig\fR)¤Þ¤¿¤Ï¥­¥ã¥á¥ë¥±¡¼¥¹¡¦¥¹¥¿¥¤¥ë(\fBdigitalSignature\fR¤Î¾ì¹ç¤Ï\fBdS\fR¡¢\fBcRLSign\fR¤Î¾ì¹ç¤Ï\fBcRLS\fR)¤Ç¾Êάɽµ­¤Ç¤­¤Þ¤¹¡£\fBusage\fRÃͤϡ¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ + .RE + .PP + EKU¤Þ¤¿¤ÏExtendedKeyUsage + .RS 4 + \fBÃÍ\fR: +-\fIusage\fR(\fIusage\fR)*¡¢\fIusage\fR¤Ë¤Ï\fIanyExtendedKeyUsage\fR¡¢\fIserverAuth\fR¡¢\fIclientAuth\fR¡¢\fIcodeSigning\fR¡¢\fIemailProtection\fR¡¢\fItimeStamping\fR¡¢\fIOCSPSigning\fR¤Þ¤¿¤ÏǤ°Õ¤Î\fIOIDʸ»úÎó\fR¤Î¤¤¤º¤ì¤«¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIusage\fR°ú¿ô¤Ï¡¢ÉÔÌÀ³Î¤Ë¤Ê¤é¤Ê¤¤¤«¤®¤ê¡¢ºÇ½é¤Î¿ôʸ»ú¤Þ¤¿¤Ï¥­¥ã¥á¥ë¥±¡¼¥¹¡¦¥¹¥¿¥¤¥ë¤Ç¾Êάɽµ­¤Ç¤­¤Þ¤¹¡£\fIusage\fRÃͤϡ¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ ++\fBusage\fR(\fBusage\fR)*¡¢\fIusage\fR¤Ë¤Ï\fBanyExtendedKeyUsage\fR¡¢\fBserverAuth\fR¡¢\fBclientAuth\fR¡¢\fBcodeSigning\fR¡¢\fBemailProtection\fR¡¢\fBtimeStamping\fR¡¢\fBOCSPSigning\fR¤Þ¤¿¤ÏǤ°Õ¤Î\fIOIDʸ»úÎó\fR¤Î¤¤¤º¤ì¤«¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIusage\fR°ú¿ô¤Ï¡¢ÉÔÌÀ³Î¤Ë¤Ê¤é¤Ê¤¤¤«¤®¤ê¡¢ºÇ½é¤Î¿ôʸ»ú¤Þ¤¿¤Ï¥­¥ã¥á¥ë¥±¡¼¥¹¡¦¥¹¥¿¥¤¥ë¤Ç¾Êάɽµ­¤Ç¤­¤Þ¤¹¡£\fBusage\fRÃͤϡ¢Âçʸ»ú¤È¾®Ê¸»ú¤¬¶èÊ̤µ¤ì¤Þ¤¹¡£ + .RE + .PP + SAN¤Þ¤¿¤ÏSubjectAlternativeName + .RS 4 + \fBÃÍ\fR: +-\fItype\fR:\fIvalue\fR +-(t\fIype:value\fR)*¡¢\fItype\fR¤Ë¤Ï\fIEMAIL\fR¡¢\fIURI\fR¡¢\fIDNS\fR¡¢\fIIP\fR¤Þ¤¿¤Ï\fIOID\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIvalue\fR°ú¿ô¤Ï¡¢\fItype\fR¤Îʸ»úÎó·Á¼°¤ÎÃͤǤ¹¡£ ++\fBtype\fR:\fBvalue\fR ++(t\fBype:value\fR)*¡¢\fBtype\fR¤Ë¤Ï\fBEMAIL\fR¡¢\fBURI\fR¡¢\fBDNS\fR¡¢\fBIP\fR¤Þ¤¿¤Ï\fBOID\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBvalue\fR°ú¿ô¤Ï¡¢\fBtype\fR¤Îʸ»úÎó·Á¼°¤ÎÃͤǤ¹¡£ + .RE + .PP + IAN¤Þ¤¿¤ÏIssuerAlternativeName + .RS 4 + \fBÃÍ\fR: +-\fISubjectAlternativeName\fR¤ÈƱ¤¸¤Ç¤¹¡£ ++\fBSubjectAlternativeName\fR¤ÈƱ¤¸¤Ç¤¹¡£ + .RE + .PP + SIA¤Þ¤¿¤ÏSubjectInfoAccess + .RS 4 + \fBÃÍ\fR: +-\fImethod\fR:\fIlocation\-type\fR:\fIlocation\-value\fR +-(\fImethod:location\-type\fR:\fIlocation\-value\fR)*¡¢\fImethod\fR¤Ë¤Ï\fItimeStamping\fR¡¢\fIcaRepository\fR¤Þ¤¿¤ÏǤ°Õ¤ÎOID¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIlocation\-type\fR¤ª¤è¤Ó\fIlocation\-value\fR°ú¿ô¤Ë¤Ï¡¢\fISubjectAlternativeName\fR¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëǤ°Õ¤Î\fItype\fR:\fIvalue\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBmethod\fR:\fBlocation\-type\fR:\fBlocation\-value\fR ++(\fBmethod:location\-type\fR:\fBlocation\-value\fR)*¡¢\fBmethod\fR¤Ë¤Ï\fBtimeStamping\fR¡¢\fBcaRepository\fR¤Þ¤¿¤ÏǤ°Õ¤ÎOID¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fBlocation\-type\fR¤ª¤è¤Ó\fBlocation\-value\fR°ú¿ô¤Ë¤Ï¡¢\fBSubjectAlternativeName\fR¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤ëǤ°Õ¤Î\fBtype\fR:\fBvalue\fR¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + AIA¤Þ¤¿¤ÏAuthorityInfoAccess + .RS 4 + \fBÃÍ\fR: +-\fISubjectInfoAccess\fR¤ÈƱ¤¸¤Ç¤¹¡£\fImethod\fR°ú¿ô¤Ë¤Ï¡¢\fIocsp\fR¡¢\fIcaIssuers\fR¤Þ¤¿¤ÏǤ°Õ¤ÎOID¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBSubjectInfoAccess\fR¤ÈƱ¤¸¤Ç¤¹¡£\fBmethod\fR°ú¿ô¤Ë¤Ï¡¢\fBocsp\fR¡¢\fBcaIssuers\fR¤Þ¤¿¤ÏǤ°Õ¤ÎOID¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP +-\fIname\fR¤¬OID¤Î¾ì¹ç¡¢OCTET STRING¥¿¥¤¥×¤ÈŤµ¤Î¥Ð¥¤¥È¤ò½ü³°¤·¤¿¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢ÃͤÏ\fIextnValue\fR¤Î16¿Ê¥À¥ó¥×¤ÎDER¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç¤¹¡£HEXʸ»úÎó¤Ç¤Ï¡¢É¸½à¤Î16¿Ê¿ô(0\-9¡¢a\-f¡¢A\-F)°Ê³°¤Îʸ»ú¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢01:02:03:04¤È01020304¤ÎξÊý¤È¤âƱ°ì¤ÎÃͤȤ·¤Æ¼õ¤±ÉÕ¤±¤é¤ì¤Þ¤¹¡£Ãͤ¬¤Ê¤¤¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ÎÃÍ¥Õ¥£¡¼¥ë¥É¤Ï¶õ¤Ë¤Ê¤ê¤Þ¤¹¡£ ++\fBname\fR¤¬OID¤Î¾ì¹ç¡¢OCTET STRING¥¿¥¤¥×¤ÈŤµ¤Î¥Ð¥¤¥È¤ò½ü³°¤·¤¿¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢ÃͤÏ\fBextnValue\fR¤Î16¿Ê¥À¥ó¥×¤ÎDER¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç¤¹¡£HEXʸ»úÎó¤Ç¤Ï¡¢É¸½à¤Î16¿Ê¿ô(0\-9¡¢a\-f¡¢A\-F)°Ê³°¤Îʸ»ú¤Ï̵»ë¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢01:02:03:04¤È01020304¤ÎξÊý¤È¤âƱ°ì¤ÎÃͤȤ·¤Æ¼õ¤±ÉÕ¤±¤é¤ì¤Þ¤¹¡£Ãͤ¬¤Ê¤¤¾ì¹ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ÎÃÍ¥Õ¥£¡¼¥ë¥É¤Ï¶õ¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP +-\fI\-gencert\fR¤Ç¤Î¤ß»ÈÍѤ¹¤ë\fIhonored\fR¤È¤¤¤¦ÆÃÊ̤Ê̾Á°¤Ï¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤Ë´Þ¤Þ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤òÍ¥À褹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î̾Á°¤ÎÃͤϡ¢\fIall\fR(¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬Í¥À褵¤ì¤ë)¡¢\fIname{:[critical|non\-critical]}\fR(̾Á°ÉÕ¤­¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬Í¥À褵¤ì¤ë¤¬¡¢Ê̤Î\fIisCritical\fR°À­¤ò»ÈÍѤ¹¤ë)¡¢¤ª¤è¤Ó\fI\-name\fR(\fIall\fR¤È¤È¤â¤Ë»ÈÍѤ·¡¢Îã³°¤ò¼¨¤¹)¤Î¥«¥ó¥Þ¶èÀÚ¤ê¥ê¥¹¥È¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ÏÍ¥À褵¤ì¤Þ¤»¤ó¡£ ++\fB\-gencert\fR¤Ç¤Î¤ß»ÈÍѤ¹¤ë\fBhonored\fR¤È¤¤¤¦ÆÃÊ̤Ê̾Á°¤Ï¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤Ë´Þ¤Þ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤òÍ¥À褹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£¤³¤Î̾Á°¤ÎÃͤϡ¢\fBall\fR(¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¤¹¤Ù¤Æ¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬Í¥À褵¤ì¤ë)¡¢\fBname{:[critical|non\-critical]}\fR(̾Á°ÉÕ¤­¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬Í¥À褵¤ì¤ë¤¬¡¢Ê̤Î\fBisCritical\fR°À­¤ò»ÈÍѤ¹¤ë)¡¢¤ª¤è¤Ó\fB\-name\fR(\fBall\fR¤È¤È¤â¤Ë»ÈÍѤ·¡¢Îã³°¤ò¼¨¤¹)¤Î¥«¥ó¥Þ¶èÀÚ¤ê¥ê¥¹¥È¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥ê¥¯¥¨¥¹¥È¤µ¤ì¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ÏÍ¥À褵¤ì¤Þ¤»¤ó¡£ + .PP +-\fI\-ext honored\fR¥ª¥×¥·¥ç¥ó¤Ë²Ã¤¨¡¢Ê̤Î̾Á°¤Î¡¢¤Þ¤¿¤ÏOID +-\fI\-ext\fR¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢¤³¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬¡¢¤¹¤Ç¤ËÍ¥À褵¤ì¤Æ¤¤¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ËÄɲ䵤ì¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î̾Á°(¤Þ¤¿¤ÏOID)¤òÍ¥À褵¤ì¤ëÃͤǤâ»ÈÍѤ·¤¿¾ì¹ç¤Ï¡¢¤½¤ÎÃͤȽÅÍ×À­¤¬¥ê¥¯¥¨¥¹¥È¤Ë´Þ¤Þ¤ì¤ë¤â¤Î¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ ++\fB\-ext honored\fR¥ª¥×¥·¥ç¥ó¤Ë²Ã¤¨¡¢Ê̤Î̾Á°¤Î¡¢¤Þ¤¿¤ÏOID ++\fB\-ext\fR¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢¤³¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬¡¢¤¹¤Ç¤ËÍ¥À褵¤ì¤Æ¤¤¤ë¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ËÄɲ䵤ì¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤Î̾Á°(¤Þ¤¿¤ÏOID)¤òÍ¥À褵¤ì¤ëÃͤǤâ»ÈÍѤ·¤¿¾ì¹ç¤Ï¡¢¤½¤ÎÃͤȽÅÍ×À­¤¬¥ê¥¯¥¨¥¹¥È¤Ë´Þ¤Þ¤ì¤ë¤â¤Î¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£ + .PP +-\fIsubjectKeyIdentifier\fR¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ï¾ï¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¼«¸Ê½ð̾¤Ç¤Ê¤¤¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢\fIauthorityKeyIdentifier\fR¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBsubjectKeyIdentifier\fR¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ï¾ï¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¼«¸Ê½ð̾¤Ç¤Ê¤¤¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢\fBauthorityKeyIdentifier\fR¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR + ¥æ¡¼¥¶¡¼¤Ï¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó(¤ª¤è¤Ó¾ÚÌÀ½ñ¤Î¾¤Î¥Õ¥£¡¼¥ë¥É)¤ÎÁȹ礻¤Ë¤è¤Ã¤Æ¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥È¤Îɸ½à¤Ë½àµò¤·¤Ê¤¤¾ì¹ç¤¬¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¾ÚÌÀ½ñ¤Î½àµò¤Ë´Ø¤¹¤ë·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +@@ -660,57 +662,60 @@ + .PP + \-gencert + .RS 4 +-\fI{\-rfc} {\-infile infile} {\-outfile outfile} {\-alias alias} {\-sigalg sigalg} {\-dname dname} {\-startdate startdate {\-ext ext}* {\-validity valDays} [\-keypass keypass] {\-keystore keystore} [\-storepass storepass] {\-storetype storetype} {\-providername provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-rfc} {\-infile infile} {\-outfile outfile} {\-alias alias} {\-sigalg sigalg} {\-dname dname} {\-startdate startdate {\-ext ext}* {\-validity valDays} [\-keypass keypass] {\-keystore keystore} [\-storepass storepass] {\-storetype storetype} {\-providername provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¡¦¥Õ¥¡¥¤¥ë(\fIkeytool\fR +-\fI\-certreq\fR¥³¥Þ¥ó¥É¤ÇºîÀ®²Äǽ)¤ËÂФ¹¤ë¥ì¥¹¥Ý¥ó¥¹¤È¤·¤Æ¾ÚÌÀ½ñ¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fIinfile\fR¤«¤é(¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É¸½àÆþÎϤ«¤é)¥ê¥¯¥¨¥¹¥È¤òÆɤ߹þ¤ß¡¢ÊÌ̾¤ÎÈëÌ©¸°¤ò»ÈÍѤ·¤Æ¤½¤Î¥ê¥¯¥¨¥¹¥È¤Ë½ð̾¤·¤Æ¡¢X\&.509¾ÚÌÀ½ñ¤ò\fIoutfile\fR¤Ë(¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É¸½à½ÐÎϤË)½ÐÎϤ·¤Þ¤¹¡£\fI\-rfc\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢½ÐÎÏ·Á¼°¤ÏBASE64Éä¹æ²½¤ÎPEM¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¥Ð¥¤¥Ê¥êDER¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ ++¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¡¦¥Õ¥¡¥¤¥ë(\fBkeytool\fR ++\fB\-certreq\fR¥³¥Þ¥ó¥É¤ÇºîÀ®²Äǽ)¤ËÂФ¹¤ë¥ì¥¹¥Ý¥ó¥¹¤È¤·¤Æ¾ÚÌÀ½ñ¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fIinfile\fR¤«¤é(¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É¸½àÆþÎϤ«¤é)¥ê¥¯¥¨¥¹¥È¤òÆɤ߹þ¤ß¡¢ÊÌ̾¤ÎÈëÌ©¸°¤ò»ÈÍѤ·¤Æ¤½¤Î¥ê¥¯¥¨¥¹¥È¤Ë½ð̾¤·¤Æ¡¢X\&.509¾ÚÌÀ½ñ¤ò\fIoutfile\fR¤Ë(¾Êά¤·¤¿¾ì¹ç¤Ï¡¢É¸½à½ÐÎϤË)½ÐÎϤ·¤Þ¤¹¡£\fB\-rfc\fR¤ò»ØÄꤷ¤¿¾ì¹ç¡¢½ÐÎÏ·Á¼°¤ÏBASE64Éä¹æ²½¤ÎPEM¤Ë¤Ê¤ê¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¥Ð¥¤¥Ê¥êDER¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp +-\fIsigalg\fRÃͤˤϡ¢¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£\fIstartdate\fR°ú¿ô¤Ï¡¢¾ÚÌÀ½ñ¤ÎÍ­¸ú³«»ÏÆü»þ¤Ç¤¹¡£\fIvalDays\fR°ú¿ô¤Ï¡¢¾ÚÌÀ½ñ¤ÎÍ­¸úÆü¿ô¤ò¼¨¤·¤Þ¤¹¡£ ++\fBsigalg\fRÃͤˤϡ¢¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£\fBstartdate\fR°ú¿ô¤Ï¡¢¾ÚÌÀ½ñ¤ÎÍ­¸ú³«»ÏÆü»þ¤Ç¤¹¡£\fBvalDays\fR°ú¿ô¤Ï¡¢¾ÚÌÀ½ñ¤ÎÍ­¸úÆü¿ô¤ò¼¨¤·¤Þ¤¹¡£ + .sp +-\fIdname\fR¤ò»ØÄꤹ¤ë¤È¡¢À¸À®¤µ¤ì¤ë¾ÚÌÀ½ñ¤Î¼çÂΤȤ·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤«¤é¤Î̾Á°¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++\fBdname\fR¤ò»ØÄꤹ¤ë¤È¡¢À¸À®¤µ¤ì¤ë¾ÚÌÀ½ñ¤Î¼çÂΤȤ·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤«¤é¤Î̾Á°¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp +-\fIext\fRÃͤϡ¢¾ÚÌÀ½ñ¤ËËä¤á¹þ¤Þ¤ì¤ëX\&.509¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£\fI\-ext\fR¤Î¹½Ê¸¤Ë¤Ä¤¤¤Æ¤Ï¡¢°ìÈÌ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBext\fRÃͤϡ¢¾ÚÌÀ½ñ¤ËËä¤á¹þ¤Þ¤ì¤ëX\&.509¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ò¼¨¤·¤Þ¤¹¡£\fB\-ext\fR¤Î¹½Ê¸¤Ë¤Ä¤¤¤Æ¤Ï¡¢°ìÈÌ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-\fI\-gencert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢\fIe1\fR¤È¤¤¤¦¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤Ï¡¢3¤Ä¤Î¾ÚÌÀ½ñ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fB\-gencert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òºîÀ®¤Ç¤­¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢\fBe1\fR¤È¤¤¤¦¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤Ï¡¢3¤Ä¤Î¾ÚÌÀ½ñ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fIca\fR¡¢\fIca1\fR¡¢\fIca2\fR¤ª¤è¤Ó\fIe1\fR¤Î4¤Ä¤Î¸°¥Ú¥¢¤òºîÀ®¤·¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢\fBca\fR¡¢\fBca1\fR¡¢\fBca2\fR¤ª¤è¤Ó\fBe1\fR¤Î4¤Ä¤Î¸°¥Ú¥¢¤òºîÀ®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-alias ca \-dname CN=CA \-genkeypair +-keytool \-alias ca1 \-dname CN=CA \-genkeypair +-keytool \-alias ca2 \-dname CN=CA \-genkeypair +-keytool \-alias e1 \-dname CN=E1 \-genkeypair ++\fBkeytool \-alias ca \-dname CN=CA \-genkeypair\fR ++\fBkeytool \-alias ca1 \-dname CN=CA \-genkeypair\fR ++\fBkeytool \-alias ca2 \-dname CN=CA \-genkeypair\fR ++\fBkeytool \-alias e1 \-dname CN=E1 \-genkeypair\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î2¤Ä¤Î¥³¥Þ¥ó¥É¤Ï¡¢½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òºîÀ®¤·¤Þ¤¹¡£\fIca\fR¤Ï\fIca1\fR¤Ë½ð̾¤·¡¢\fIca1\fR¤Ï\fIca2\fR¤Ë½ð̾¤·¤Þ¤¹¡£¤¹¤Ù¤Æ¼«¸Êȯ¹Ô¤Ç¤¹¡£ ++¼¡¤Î2¤Ä¤Î¥³¥Þ¥ó¥É¤Ï¡¢½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òºîÀ®¤·¤Þ¤¹¡£\fBca\fR¤Ï\fBca1\fR¤Ë½ð̾¤·¡¢\fBca1\fR¤Ï\fBca2\fR¤Ë½ð̾¤·¤Þ¤¹¡£¤¹¤Ù¤Æ¼«¸Êȯ¹Ô¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-alias ca1 \-certreq | +- keytool \-alias ca \-gencert \-ext san=dns:ca1 | +- keytool \-alias ca1 \-importcert +- +-keytool \-alias ca2 \-certreq | +- $KT \-alias ca1 \-gencert \-ext san=dns:ca2 | +- $KT \-alias ca2 \-importcert ++\fBkeytool \-alias ca1 \-certreq |\fR ++\fB keytool \-alias ca \-gencert \-ext san=dns:ca1 |\fR ++\fB keytool \-alias ca1 \-importcert\fR ++ ++\fBkeytool \-alias ca2 \-certreq |\fR ++\fB $KT \-alias ca1 \-gencert \-ext san=dns:ca2 |\fR ++\fB $KT \-alias ca2 \-importcert\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢¾ÚÌÀ½ñ\fIe1\fR¤òºîÀ®¤·¤Æ¥Õ¥¡¥¤¥ë\fIe1\&.cert\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Ï\fIca2\fR¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢\fIe1\fR¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤Ï\fIca\fR¡¢\fIca1\fR¤ª¤è¤Ó\fIca2\fR¤¬´Þ¤Þ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢¾ÚÌÀ½ñ\fBe1\fR¤òºîÀ®¤·¤Æ¥Õ¥¡¥¤¥ë\fBe1\&.cert\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Ï\fBca2\fR¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤Þ¤¹¡£¤½¤Î·ë²Ì¡¢\fBe1\fR¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤Ï\fBca\fR¡¢\fBca1\fR¤ª¤è¤Ó\fBca2\fR¤¬´Þ¤Þ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-alias e1 \-certreq | keytool \-alias ca2 \-gencert > e1\&.cert ++\fBkeytool \-alias e1 \-certreq | keytool \-alias ca2 \-gencert > e1\&.cert\fR ++ + .fi + .if n \{\ + .RE +@@ -719,154 +724,155 @@ + .PP + \-genkeypair + .RS 4 +-\fI{\-alias alias} {\-keyalg keyalg} {\-keysize keysize} {\-sigalg sigalg} [\-dname dname] [\-keypass keypass] {\-startdate value} {\-ext ext}* {\-validity valDays} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} {\-keyalg keyalg} {\-keysize keysize} {\-sigalg sigalg} [\-dname dname] [\-keypass keypass] {\-startdate value} {\-ext ext}* {\-validity valDays} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp + ¸°¤Î¥Ú¥¢(¸ø³«¸°¤ª¤è¤Ó´ØÏ¢¤¹¤ëÈëÌ©¸°)¤òÀ¸À®¤·¤Þ¤¹¡£¸ø³«¸°¤ÏX\&.509 v3¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤µ¤ì¤Þ¤¹¡£¾ÚÌÀ½ñ¤Ï¡¢Ã±°ì¤ÎÍ×ÁǤò»ý¤Ä¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤È¤·¤Æ³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÈÈëÌ©¸°¤Ï¡¢alias¤ÇÆÃÄꤵ¤ì¤ë¿·¤·¤¤¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fIkeyalg\fRÃͤϸ°¥Ú¥¢¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò¡¢\fIkeysize\fRÃͤÏÀ¸À®¤¹¤ë³Æ¸°¤Î¥µ¥¤¥º¤ò¡¢¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£\fIsigalg\fRÃͤϡ¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ï\fIkeyalg\fRÃͤȸߴ¹À­¤¬¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBkeyalg\fRÃͤϸ°¥Ú¥¢¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò¡¢\fBkeysize\fRÃͤÏÀ¸À®¤¹¤ë³Æ¸°¤Î¥µ¥¤¥º¤ò¡¢¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£\fBsigalg\fRÃͤϡ¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ï\fBkeyalg\fRÃͤȸߴ¹À­¤¬¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fIdname\fRÃͤˤϡ¢\fIalias\fRÃͤ˴ØÏ¢ÉÕ¤±¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Îissuer¥Õ¥£¡¼¥ë¥É¤Èsubject¥Õ¥£¡¼¥ë¥É¤È¤·¤Æ»ÈÍѤ¹¤ëX\&.500¼±ÊÌ̾¤ò»ØÄꤷ¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¼±ÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¼±ÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++\fBdname\fRÃͤˤϡ¢\fBalias\fRÃͤ˴ØÏ¢ÉÕ¤±¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Îissuer¥Õ¥£¡¼¥ë¥É¤Èsubject¥Õ¥£¡¼¥ë¥É¤È¤·¤Æ»ÈÍѤ¹¤ëX\&.500¼±ÊÌ̾¤ò»ØÄꤷ¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç¼±ÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¼±ÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp +-\fIkeypass\fRÃͤˤϡ¢À¸À®¤µ¤ì¤ë¸°¤Î¥Ú¥¢¤Î¤¦¤Á¡¢ÈëÌ©¸°¤òÊݸ¤ë¤Î¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢\fI[Return]¥­¡¼\fR¤ò²¡¤¹¤È¡¢¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fIkeypass\fRÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBkeypass\fRÃͤˤϡ¢À¸À®¤µ¤ì¤ë¸°¤Î¥Ú¥¢¤Î¤¦¤Á¡¢ÈëÌ©¸°¤òÊݸ¤ë¤Î¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fBkeypass\fRÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-\fIstartdate\fRÃͤˤϡ¢¾ÚÌÀ½ñ¤Îȯ¹Ô»þ¹ï¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢X\&.509¾ÚÌÀ½ñ¤Î¡ÖValidity¡×¥Õ¥£¡¼¥ë¥É¤Î¡ÖNot Before¡×ÃͤȤâ¸Æ¤Ð¤ì¤Þ¤¹¡£ ++\fBstartdate\fRÃͤˤϡ¢¾ÚÌÀ½ñ¤Îȯ¹Ô»þ¹ï¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤ì¤Ï¡¢X\&.509¾ÚÌÀ½ñ¤Î¡ÖValidity¡×¥Õ¥£¡¼¥ë¥É¤Î¡ÖNot Before¡×ÃͤȤâ¸Æ¤Ð¤ì¤Þ¤¹¡£ + .sp + ¥ª¥×¥·¥ç¥ó¤ÎÃͤϡ¢¼¡¤Î2¤Ä¤Î·Á¼°¤Î¤¤¤º¤ì¤«¤ÇÀßÄê¤Ç¤­¤Þ¤¹¡£ + .sp +-\fI([+\-]nnn[ymdHMS])+\fR ++\fB([+\-]nnn[ymdHMS])+\fR + .sp +-\fI[yyyy/mm/dd] [HH:MM:SS]\fR ++\fB[yyyy/mm/dd] [HH:MM:SS]\fR + .sp +-ºÇ½é¤Î·Á¼°¤Ç¤Ï¡¢È¯¹Ô»þ¹ï¤Ï¡¢»ØÄꤵ¤ì¤ëÃͤÎʬ¡¢¸½ºß¤Î»þ¹ï¤«¤é°Ü¤ê¤Þ¤¹¡£»ØÄꤵ¤ì¤ëÃͤϡ¢°ìÏ¢¤Î²¼°Ì¤ÎÃͤòÏ¢·ë¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£²¼°Ì¤Î³ÆÃͤǡ¢¥×¥é¥¹µ­¹æ(¡Ö+¡×)¤Ï»þ´Ö¤¬¿Ê¤à¤³¤È¤ò¡¢¥Þ¥¤¥Ê¥¹µ­¹æ(¡Ö\-¡×)¤Ï»þ´Ö¤¬Ìá¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£°Ü¤ë»þ´Ö¤Ï\fInnn\fR¤Ç¡¢Ã±°Ì¤Ïǯ¡¢·î¡¢Æü¡¢»þ´Ö¡¢Ê¬¤Þ¤¿¤ÏÉäǤ¹(¤½¤ì¤¾¤ì¡¢1ʸ»ú¤Î\fIy\fR¡¢\fIm\fR¡¢\fId\fR¡¢\fIH\fR¡¢\fIM\fR¤Þ¤¿¤Ï\fIS\fR¡×¤Ç¼¨¤µ¤ì¤Æ¤¤¤Þ¤¹)¡£²¼°Ì¤Î³ÆÃͤÇ\fIjava\&.util\&.GregorianCalendar\&.add(int field, int amount)\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢È¯¹Ô»þ¹ï¤ÎÄɲäÎÃͤ¬º¸¤«¤é±¦¤Ø·×»»¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢»ØÄꤹ¤ë¤È¡¢È¯¹Ô»þ¹ï¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ºÇ½é¤Î·Á¼°¤Ç¤Ï¡¢È¯¹Ô»þ¹ï¤Ï¡¢»ØÄꤵ¤ì¤ëÃͤÎʬ¡¢¸½ºß¤Î»þ¹ï¤«¤é°Ü¤ê¤Þ¤¹¡£»ØÄꤵ¤ì¤ëÃͤϡ¢°ìÏ¢¤Î²¼°Ì¤ÎÃͤòÏ¢·ë¤·¤¿¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£²¼°Ì¤Î³ÆÃͤǡ¢¥×¥é¥¹µ­¹æ(¡Ö+¡×)¤Ï»þ´Ö¤¬¿Ê¤à¤³¤È¤ò¡¢¥Þ¥¤¥Ê¥¹µ­¹æ(¡Ö\-¡×)¤Ï»þ´Ö¤¬Ìá¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£°Ü¤ë»þ´Ö¤Ï\fBnnn\fR¤Ç¡¢Ã±°Ì¤Ïǯ¡¢·î¡¢Æü¡¢»þ´Ö¡¢Ê¬¤Þ¤¿¤ÏÉäǤ¹(¤½¤ì¤¾¤ì¡¢1ʸ»ú¤Î\fBy\fR¡¢\fBm\fR¡¢\fBd\fR¡¢\fBH\fR¡¢\fBM\fR¤Þ¤¿¤Ï\fBS\fR¡×¤Ç¼¨¤µ¤ì¤Æ¤¤¤Þ¤¹)¡£²¼°Ì¤Î³ÆÃͤÇ\fBjava\&.util\&.GregorianCalendar\&.add(int field, int amount)\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢È¯¹Ô»þ¹ï¤ÎÄɲäÎÃͤ¬º¸¤«¤é±¦¤Ø·×»»¤µ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢»ØÄꤹ¤ë¤È¡¢È¯¹Ô»þ¹ï¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-Calendar c = new GregorianCalendar(); +-c\&.add(Calendar\&.YEAR, \-1); +-c\&.add(Calendar\&.MONTH, 1); +-c\&.add(Calendar\&.DATE, \-1); +-return c\&.getTime() ++\fBCalendar c = new GregorianCalendar();\fR ++\fBc\&.add(Calendar\&.YEAR, \-1);\fR ++\fBc\&.add(Calendar\&.MONTH, 1);\fR ++\fBc\&.add(Calendar\&.DATE, \-1);\fR ++\fBreturn c\&.getTime()\fR ++ + .fi + .if n \{\ + .RE + .\} +-2ÈÖÌܤηÁ¼°¤Ç¤Ï¡¢¥æ¡¼¥¶¡¼¤Ï¡¢Ç¯/·î/Æü¤È»þ´Ö:ʬ:ÉäÎ2¤Ä¤ÎÉôʬ¤Ç¸·Ì©¤Ê³«»Ï»þ¹ï¤òÀßÄꤷ¤Þ¤¹(Ãϸµ¤Î»þ´ÖÂÓ¤ò»ÈÍÑ)¡£¥æ¡¼¥¶¡¼¤Ï¡¢1¤Ä¤ÎÉôʬ¤Î¤ß¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤â¤¦1¤Ä¤ÎÉôʬ¤Ï¸½ºß¤ÎÆüÉÕ(¤Þ¤¿¤Ï»þ¹ï)¤ÈƱ¤¸¤Ë¤Ê¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢·Á¼°¤ÎÄêµÁ¤Ë¼¨¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢·å¿ô¤ò¸·Ì©¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(û¤¤¾ì¹ç¤Ï0¤ÇËä¤á¤Þ¤¹)¡£ÆüÉդȻþ¹ï¤ÎξÊý¤¬»ØÄꤵ¤ì¤¿¾õÂ֤ǡ¢2¤Ä¤ÎÉôʬ¤Î´Ö¤Ë¶õÇòʸ»ú¤¬1¤Ä(1¤Ä¤Î¤ß)¤¢¤ê¤Þ¤¹¡£»þ´Ö¤Ï¾ï¤Ë24»þ´Ö·Á¼°¤Ç»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£ ++2ÈÖÌܤηÁ¼°¤Ç¤Ï¡¢¥æ¡¼¥¶¡¼¤Ï¡¢Ç¯/·î/Æü¤È»þ´Ö:ʬ:ÉäÎ2¤Ä¤ÎÉôʬ¤«¤é¤Ê¤ëÀµ³Î¤Êȯ¹Ô»þ¹ï¤òÀßÄꤷ¤Þ¤¹(¥í¡¼¥«¥ë¤Î¥¿¥¤¥à¡¦¥¾¡¼¥ó¤ò»ÈÍÑ)¡£¥æ¡¼¥¶¡¼¤Ï¡¢1¤Ä¤ÎÉôʬ¤Î¤ß¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤â¤¦1¤Ä¤ÎÉôʬ¤Ï¸½ºß¤ÎÆüÉÕ(¤Þ¤¿¤Ï»þ¹ï)¤ÈƱ¤¸¤Ë¤Ê¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢·Á¼°¤ÎÄêµÁ¤Ë¼¨¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢·å¿ô¤ò¸·Ì©¤Ë»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(û¤¤¾ì¹ç¤Ï0¤ÇËä¤á¤Þ¤¹)¡£ÆüÉդȻþ¹ï¤ÎξÊý¤¬»ØÄꤵ¤ì¤¿¾õÂ֤ǡ¢2¤Ä¤ÎÉôʬ¤Î´Ö¤Ë¶õÇòʸ»ú¤¬1¤Ä(1¤Ä¤Î¤ß)¤¢¤ê¤Þ¤¹¡£»þ´Ö¤Ï¾ï¤Ë24»þ´Ö·Á¼°¤Ç»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£ + .sp + ¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤È¡¢³«»ÏÆüÉդϸ½ºß¤Î»þ¹ï¤Ë¤Ê¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤Ï¡¢ºÇÂç¤Ç1²ó»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp +-\fIvalDays\fR¤ÎÃͤˤϡ¢¾ÚÌÀ½ñ¤ÎÍ­¸úÆü¿ô¤ò»ØÄꤷ¤Þ¤¹(\fI\-startdate\fR¤Ç»ØÄꤵ¤ì¤¿ÆüÉÕ¡¢¤Þ¤¿¤Ï\fI\-startdate\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¸½ºß¤ÎÆüÉÕ¤«¤é»Ï¤Þ¤ê¤Þ¤¹)¡£ ++\fBvalDays\fR¤ÎÃͤˤϡ¢¾ÚÌÀ½ñ¤ÎÍ­¸úÆü¿ô¤ò»ØÄꤷ¤Þ¤¹(\fB\-startdate\fR¤Ç»ØÄꤵ¤ì¤¿ÆüÉÕ¡¢¤Þ¤¿¤Ï\fB\-startdate\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¸½ºß¤ÎÆüÉÕ¤«¤é»Ï¤Þ¤ê¤Þ¤¹)¡£ + .sp +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fI\-genkey\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fI\-genkeypair\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fB\-genkey\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fB\-genkeypair\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ + .RE + .PP + \-genseckey + .RS 4 +-\fI\-genseckey {\-alias alias} {\-keyalg keyalg} {\-keysize keysize} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB\-genseckey {\-alias alias} {\-keyalg keyalg} {\-keysize keysize} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-ÈëÌ©¸°¤òÀ¸À®¤·¡¢¤½¤ì¤ò¿·¤·¤¤\fIKeyStore\&.SecretKeyEntry\fR(\fIalias\fR¤ÇÆÃÄꤵ¤ì¤ë)Æâ¤Ë³ÊǼ¤·¤Þ¤¹¡£ ++ÈëÌ©¸°¤òÀ¸À®¤·¡¢¤½¤ì¤ò¿·¤·¤¤\fBKeyStore\&.SecretKeyEntry\fR(\fBalias\fR¤ÇÆÃÄꤵ¤ì¤ë)Æâ¤Ë³ÊǼ¤·¤Þ¤¹¡£ + .sp +-\fIkeyalg\fRÃͤϸ°¥Ú¥¢¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò¡¢\fIkeysize\fRÃͤÏÀ¸À®¤¹¤ë³Æ¸°¤Î¥µ¥¤¥º¤ò¡¢¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£\fIkeypass\fRÃͤϡ¢ÈëÌ©¸°¤òÊݸ¤ë¥Ñ¥¹¥ï¡¼¥É¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢\fIkeystore\fR¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fIkeypass\fRÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBkeyalg\fRÃͤϸ°¥Ú¥¢¤ÎÀ¸À®¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò¡¢\fBkeysize\fRÃͤÏÀ¸À®¤¹¤ë³Æ¸°¤Î¥µ¥¤¥º¤ò¡¢¤½¤ì¤¾¤ì»ØÄꤷ¤Þ¤¹¡£\fBkeypass\fRÃͤϡ¢ÈëÌ©¸°¤òÊݸ¤ë¥Ñ¥¹¥ï¡¼¥É¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢\fBkeystore\fR¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fBkeypass\fRÃͤϡ¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-importcert + .RS 4 +-\fI\-importcert {\-alias alias} {\-file cert_file} [\-keypass keypass] {\-noprompt} {\-trustcacerts} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB\-importcert {\-alias alias} {\-file cert_file} [\-keypass keypass] {\-noprompt} {\-trustcacerts} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-¥Õ¥¡¥¤¥ë\fIcert_file\fR¤«¤é¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó(¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¾ì¹ç¤Ï¡¢PKCS#7·Á¼°¤Î±þÅú¤Þ¤¿¤Ï°ìÏ¢¤ÎX\&.509¾ÚÌÀ½ñ¤ÇÄ󶡤µ¤ì¤ë¤â¤Î)¤òÆɤ߹þ¤ß¡¢\fIalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë\fIkeystore\fR¥¨¥ó¥È¥ê¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIstdin\fR¤«¤é¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÆɤ߹þ¤ß¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ë\fBcert_file\fR¤«¤é¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó(¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¾ì¹ç¤Ï¡¢PKCS#7·Á¼°¤Î±þÅú¤Þ¤¿¤Ï°ìÏ¢¤ÎX\&.509¾ÚÌÀ½ñ¤ÇÄ󶡤µ¤ì¤ë¤â¤Î)¤òÆɤ߹þ¤ß¡¢\fBalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë\fBkeystore\fR¥¨¥ó¥È¥ê¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBstdin\fR¤«¤é¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÆɤ߹þ¤ß¤Þ¤¹¡£ + .sp +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢X\&.509 v1¡¢v2¡¢v3¤Î¾ÚÌÀ½ñ¡¢¤ª¤è¤ÓPKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¤«¤é¹½À®¤µ¤ì¤Æ¤¤¤ëPKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Ï¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½Êý¼°¡¢¤Þ¤¿¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°(Base64Éä¹æ²½¤È¤â¸Æ¤Ð¤ì¤ë)¤Î¤É¤Á¤é¤«¤ÇÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÉä¹æ²½Êý¼°¤Î¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï\fI\-\fR\fI\-\-\-\-BEGIN\fR¤Ç»Ï¤Þ¤ëʸ»úÎó¤Ç³«»Ï¤µ¤ì¡¢\fI\-\-\-\-\-END\fR¤Ç»Ï¤Þ¤ëʸ»úÎó¤Ç½ªÎ»¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢X\&.509 v1¡¢v2¡¢v3¤Î¾ÚÌÀ½ñ¡¢¤ª¤è¤ÓPKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¤«¤é¹½À®¤µ¤ì¤Æ¤¤¤ëPKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È¤¹¤ë¥Ç¡¼¥¿¤Ï¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½Êý¼°¡¢¤Þ¤¿¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°(Base64Éä¹æ²½¤È¤â¸Æ¤Ð¤ì¤ë)¤Î¤É¤Á¤é¤«¤ÇÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ÎÉä¹æ²½Êý¼°¤Î¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï\fB\-\fR\fB\-\-\-\-BEGIN\fR¤Ç»Ï¤Þ¤ëʸ»úÎó¤Ç³«»Ï¤µ¤ì¡¢\fB\-\-\-\-\-END\fR¤Ç»Ï¤Þ¤ëʸ»úÎó¤Ç½ªÎ»¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¾ÚÌÀ½ñ¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤ËÄɲ乤뤿¤á¡¢¤ª¤è¤Óǧ¾Ú¶É(CA)¤Ë¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤¿·ë²Ì¤È¤·¤ÆCA¤«¤é¼õ¿®¤·¤¿¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤¿¤á(¥³¥Þ¥ó¥É¤Î\fI\-certreq\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È)¤È¤¤¤¦2¤Ä¤ÎÍýͳ¤Ç¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£ ++¾ÚÌÀ½ñ¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤ËÄɲ乤뤿¤á¡¢¤ª¤è¤Óǧ¾Ú¶É(CA)¤Ë¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤òÁ÷¿®¤·¤¿·ë²Ì¤È¤·¤ÆCA¤«¤é¼õ¿®¤·¤¿¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤¿¤á(\fB¤Î\fR\-certreq¥³¥Þ¥ó¥É¥ª¥×¥·¥ç¥ó¤ò»²¾È)¤È¤¤¤¦2¤Ä¤ÎÍýͳ¤Ç¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .sp +-¤É¤Á¤é¤Î¥¿¥¤¥×¤Î¥¤¥ó¥Ý¡¼¥È¤ò¹Ô¤¦¤«¤Ï¡¢\fI\-alias\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤè¤Ã¤Æ»ØÄꤷ¤Þ¤¹¡£ÊÌ̾¤¬¥­¡¼¡¦¥¨¥ó¥È¥ê¤ò¥Ý¥¤¥ó¥È¤·¤Ê¤¤¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤¬¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¥¨¥ó¥È¥ê¤òÄɲ䷤褦¤È¤·¤Æ¤¤¤ë¤â¤Î¤È¤ß¤Ê¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢ÊÌ̾¤¬¥­¡¼¥¹¥È¥¢Æâ¤Ë¸ºß¤·¤Æ¤¤¤Ê¤¤¤³¤È¤¬É¬ÍפǤ¹¡£ÊÌ̾¤¬¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎÊÌ̾¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Î¤Ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¥¨¥é¡¼¤ò½ÐÎϤ·¡¢¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È¤ò¹Ô¤¤¤Þ¤»¤ó¡£ÊÌ̾¤¬¥­¡¼¡¦¥¨¥ó¥È¥ê¤ò¥Ý¥¤¥ó¥È¤¹¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤¬¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤â¤Î¤È¤ß¤Ê¤·¤Þ¤¹¡£ ++¤É¤Á¤é¤Î¥¿¥¤¥×¤Î¥¤¥ó¥Ý¡¼¥È¤ò¹Ô¤¦¤«¤Ï¡¢\fB\-alias\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤˤè¤Ã¤Æ»ØÄꤷ¤Þ¤¹¡£ÊÌ̾¤¬¥­¡¼¡¦¥¨¥ó¥È¥ê¤ò¥Ý¥¤¥ó¥È¤·¤Ê¤¤¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤¬¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¥¨¥ó¥È¥ê¤òÄɲ䷤褦¤È¤·¤Æ¤¤¤ë¤â¤Î¤È¤ß¤Ê¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢ÊÌ̾¤¬¥­¡¼¥¹¥È¥¢Æâ¤Ë¸ºß¤·¤Æ¤¤¤Ê¤¤¤³¤È¤¬É¬ÍפǤ¹¡£ÊÌ̾¤¬¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ÎÊÌ̾¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤¬¤¹¤Ç¤Ë¸ºß¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Î¤Ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¥¨¥é¡¼¤ò½ÐÎϤ·¡¢¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È¤ò¹Ô¤¤¤Þ¤»¤ó¡£ÊÌ̾¤¬¥­¡¼¡¦¥¨¥ó¥È¥ê¤ò¥Ý¥¤¥ó¥È¤¹¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤¬¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤â¤Î¤È¤ß¤Ê¤·¤Þ¤¹¡£ + .RE + .PP + \-importpassword + .RS 4 +-\fI{\-alias alias} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-¥Ñ¥¹¥Õ¥ì¡¼¥º¤ò¥¤¥ó¥Ý¡¼¥È¤·¡¢\fIalias\fR¤Ç¼±Ê̤µ¤ì¤ë¿·µ¬\fIKeyStore\&.SecretKeyEntry\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Ñ¥¹¥Õ¥ì¡¼¥º¤Ï¡¢É¸½àÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò²ð¤·¤ÆÄ󶡤Ǥ­¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥æ¡¼¥¶¡¼¤Ë¤½¤Î¥×¥í¥ó¥×¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fIkeypass\fR¤Ï¡¢¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¥Ñ¥¹¥Õ¥ì¡¼¥º¤ÎÊݸî¤Ë»ÈÍѤµ¤ì¤ë¥Ñ¥¹¥ï¡¼¥É¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢\fIkeystore\fR¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fIkeypass\fR¤Ï¡¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥Ñ¥¹¥Õ¥ì¡¼¥º¤ò¥¤¥ó¥Ý¡¼¥È¤·¡¢\fBalias\fR¤Ç¼±Ê̤µ¤ì¤ë¿·µ¬\fBKeyStore\&.SecretKeyEntry\fR¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Ñ¥¹¥Õ¥ì¡¼¥º¤Ï¡¢É¸½àÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò²ð¤·¤ÆÄ󶡤Ǥ­¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥æ¡¼¥¶¡¼¤Ë¤½¤Î¥×¥í¥ó¥×¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fBkeypass\fR¤Ï¡¢¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¥Ñ¥¹¥Õ¥ì¡¼¥º¤ÎÊݸî¤Ë»ÈÍѤµ¤ì¤ë¥Ñ¥¹¥ï¡¼¥É¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¤È¤­¡¢[Return]¥­¡¼¤ò²¡¤¹¤È¡¢\fBkeystore\fR¤Î¥Ñ¥¹¥ï¡¼¥É¤ÈƱ¤¸¥Ñ¥¹¥ï¡¼¥É¤¬¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fBkeypass\fR¤Ï¡¢6ʸ»ú°Ê¾å¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-importkeystore + .RS 4 +-\fI{\-srcstoretype srcstoretype} {\-deststoretype deststoretype} [\-srcstorepass srcstorepass] [\-deststorepass deststorepass] {\-srcprotected} {\-destprotected} {\-srcalias srcalias {\-destalias destalias} [\-srckeypass srckeypass] } [\-destkeypass destkeypass] {\-noprompt} {\-srcProviderName src_provider_name} {\-destProviderName dest_provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-srcstoretype srcstoretype} {\-deststoretype deststoretype} [\-srcstorepass srcstorepass] [\-deststorepass deststorepass] {\-srcprotected} {\-destprotected} {\-srcalias srcalias {\-destalias destalias} [\-srckeypass srckeypass] } [\-destkeypass destkeypass] {\-noprompt} {\-srcProviderName src_provider_name} {\-destProviderName dest_provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp + ¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢¤«¤é¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ø¡¢Ã±°ì¤Î¥¨¥ó¥È¥ê¤Þ¤¿¤Ï¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤ò¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£ + .sp +-\fI\-srcalias\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¤½¤ÎÊÌ̾¤ÇÆÃÄꤵ¤ì¤ëñ°ì¤Î¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£\fIdestalias\fR·Ðͳ¤Ç¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fIsrcalias\fR¤¬¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¥½¡¼¥¹¤Î¥¨¥ó¥È¥ê¤¬¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fIsrckeypass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤¬²óÉü¤µ¤ì¤Þ¤¹¡£\fIsrckeypass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï\fIsrcstorepass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤ò²óÉü¤·¤è¤¦¤È¤·¤Þ¤¹¡£\fIsrcstorepass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¤«Àµ¤·¤¯¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥È¤Î¥¨¥ó¥È¥ê¤Ï\fIdestkeypass\fR¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£\fIdestkeypass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤Ï¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤Î¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤Û¤È¤ó¤É¤Î¥µ¡¼¥É¡¦¥Ñ¡¼¥Æ¥£¡¦¥Ä¡¼¥ë¤Ç¤Ï¡¢PKCS #12¥­¡¼¥¹¥È¥¢¤Ç\fIstorepass\fR¤È\fIkeypass\fR¤¬Æ±¤¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥Ä¡¼¥ë¤ÎPKCS #12¥­¡¼¥¹¥È¥¢¤òºîÀ®¤¹¤ë¾ì¹ç¤Ï¡¢¾ï¤Ë\fI\-destkeypass\fR¤È\fI\-deststorepass\fR¤¬Æ±¤¸¤Ë¤Ê¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ ++\fB\-srcalias\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¤½¤ÎÊÌ̾¤ÇÆÃÄꤵ¤ì¤ëñ°ì¤Î¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£\fBdestalias\fR·Ðͳ¤Ç¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fBsrcalias\fR¤¬¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¥½¡¼¥¹¤Î¥¨¥ó¥È¥ê¤¬¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fBsrckeypass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤¬²óÉü¤µ¤ì¤Þ¤¹¡£\fIsrckeypass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï\fBsrcstorepass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤ò²óÉü¤·¤è¤¦¤È¤·¤Þ¤¹¡£\fBsrcstorepass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¤«Àµ¤·¤¯¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥È¤Î¥¨¥ó¥È¥ê¤Ï\fBdestkeypass\fR¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£\fBdestkeypass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤Ï¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤Î¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤Û¤È¤ó¤É¤Î¥µ¡¼¥É¡¦¥Ñ¡¼¥Æ¥£¡¦¥Ä¡¼¥ë¤Ç¤Ï¡¢PKCS #12¥­¡¼¥¹¥È¥¢¤Ç\fBstorepass\fR¤È\fBkeypass\fR¤¬Æ±¤¸¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤é¤Î¥Ä¡¼¥ë¤ÎPKCS #12¥­¡¼¥¹¥È¥¢¤òºîÀ®¤¹¤ë¾ì¹ç¤Ï¡¢¾ï¤Ë\fB\-destkeypass\fR¤È\fB\-deststorepass\fR¤¬Æ±¤¸¤Ë¤Ê¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ + .sp +-\fI\-srcalias\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£³Æ¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤ÏÂбþ¤¹¤ë¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤ÎÊÌ̾¤Î²¼¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¥½¡¼¥¹¤Î¥¨¥ó¥È¥ê¤¬¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fIsrcstorepass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤¬²óÉü¤µ¤ì¤Þ¤¹¡£\fIsrcstorepass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¤«Àµ¤·¤¯¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¤¢¤ë¥¨¥ó¥È¥ê¡¦¥¿¥¤¥×¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤ä¡¢¤¢¤ë¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤¹¤ëºÝ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¤½¤Î¥¨¥ó¥È¥ê¤ò¥¹¥­¥Ã¥×¤·¤Æ½èÍý¤ò³¹Ô¤¹¤ë¤«¡¢¤¢¤ë¤¤¤Ï½èÍý¤òÃæÃǤ¹¤ë¤«¤ÎÁªÂò¤òµá¤á¤é¤ì¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤Ï¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤Î¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£ ++\fB\-srcalias\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£³Æ¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤ÏÂбþ¤¹¤ë¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤ÎÊÌ̾¤Î²¼¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¥½¡¼¥¹¤Î¥¨¥ó¥È¥ê¤¬¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fBsrcstorepass\fR¤ò»ÈÍѤ·¤Æ¤½¤Î¥¨¥ó¥È¥ê¤¬²óÉü¤µ¤ì¤Þ¤¹¡£\fBsrcstorepass\fR¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¤«Àµ¤·¤¯¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¤¢¤ë¥¨¥ó¥È¥ê¡¦¥¿¥¤¥×¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤ä¡¢¤¢¤ë¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤¹¤ëºÝ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¤½¤Î¥¨¥ó¥È¥ê¤ò¥¹¥­¥Ã¥×¤·¤Æ½èÍý¤ò³¹Ô¤¹¤ë¤«¡¢¤Þ¤¿¤ÏÃæ»ß¤¹¤ë¤«¤ÎÁªÂò¤òµá¤á¤é¤ì¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥È¡¦¥¨¥ó¥È¥ê¤Ï¥½¡¼¥¹¡¦¥¨¥ó¥È¥ê¤Î¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£ + .sp + ¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤¬¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Ë¤¹¤Ç¤Ë¸ºß¤·¤Æ¤¤¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¡¢¤½¤Î¥¨¥ó¥È¥ê¤ò¾å½ñ¤­¤¹¤ë¤«¡¢¤¢¤ë¤¤¤Ï°Û¤Ê¤ëÊÌ̾¤Î²¼¤Ç¿·¤·¤¤¥¨¥ó¥È¥ê¤òºîÀ®¤¹¤ë¤«¤ÎÁªÂò¤òµá¤á¤é¤ì¤Þ¤¹¡£ + .sp + +-\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¿·¤·¤¤¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤»¤ó¡£´û¸¤Î¥¨¥ó¥È¥ê¤¬¤½¤Î¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤Ç¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Ê¤¤¥¨¥ó¥È¥ê¤Ï¥¹¥­¥Ã¥×¤µ¤ì¡¢·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤Ï¿·¤·¤¤¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤»¤ó¡£´û¸¤Î¥¨¥ó¥È¥ê¤¬¤½¤Î¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤Ç¾å½ñ¤­¤µ¤ì¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Ê¤¤¥¨¥ó¥È¥ê¤Ï¥¹¥­¥Ã¥×¤µ¤ì¡¢·Ù¹ð¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .RE + .PP + \-printcertreq + .RS 4 +-\fI{\-file file}\fR ++\fB{\-file file}\fR + .sp +-PKCS#10·Á¼°¤Î¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤ÎÆâÍƤò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥ê¥¯¥¨¥¹¥È¤Ï¡¢\fIkeytool\fR +-\fI\-certreq\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Õ¥¡¥¤¥ë¤«¤é¥ê¥¯¥¨¥¹¥È¤òÆɤ߼è¤ê¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¡¢¥ê¥¯¥¨¥¹¥È¤Ïɸ½àÆþÎϤ«¤éÆɤ߼è¤é¤ì¤Þ¤¹¡£ ++PKCS#10·Á¼°¤Î¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤ÎÆâÍƤò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥ê¥¯¥¨¥¹¥È¤Ï¡¢\fBkeytool\fR ++\fB\-certreq\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Õ¥¡¥¤¥ë¤«¤é¥ê¥¯¥¨¥¹¥È¤òÆɤ߼è¤ê¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¡¢¥ê¥¯¥¨¥¹¥È¤Ïɸ½àÆþÎϤ«¤éÆɤ߼è¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-certreq + .RS 4 +-\fI{\-alias alias} {\-dname dname} {\-sigalg sigalg} {\-file certreq_file} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} {\-dname dname} {\-sigalg sigalg} {\-file certreq_file} [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp + PKCS#10·Á¼°¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È(CSR)¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + CSR¤Ï¡¢¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤ËÁ÷¿®¤¹¤ë¤³¤È¤òÌÜŪ¤È¤·¤¿¤â¤Î¤Ç¤¹¡£CA¤Ï¡¢¾ÚÌÀ½ñÍ×µá¼Ô¤ò(Ä̾ï¤Ï¥ª¥Õ¥é¥¤¥ó¤Ç)ǧ¾Ú¤·¡¢¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÁ÷¤êÊÖ¤·¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î´û¸¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó(ºÇ½é¤Ï1¤Ä¤Î¼«¸Ê½ð̾¾ÚÌÀ½ñ¤«¤é¹½À®¤µ¤ì¤ë)¤ËÃÖ¤­´¹¤¨¤Æ»ÈÍѤ·¤Þ¤¹¡£ + .sp +-alias¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤Ï¡¢PKCS#10¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤òºîÀ®¤¹¤ë¤Î¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ÈëÌ©¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢Àµ¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIkeypass\fR¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£\fIdname\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤½¤ì¤¬CSR¤Ç¼çÂΤȤ·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿X\&.500¼±ÊÌ̾¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ ++alias¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤Ï¡¢PKCS#10¾ÚÌÀ½ñ¥ê¥¯¥¨¥¹¥È¤òºîÀ®¤¹¤ë¤Î¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ÈëÌ©¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢Àµ¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Ç\fBkeypass\fR¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£\fBdname\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤½¤ì¤¬CSR¤Ç¼çÂΤȤ·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢ÊÌ̾¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿X\&.500¼±ÊÌ̾¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£ + .sp +-\fIsigalg\fRÃͤˤϡ¢CSR¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBsigalg\fRÃͤˤϡ¢CSR¤Ë½ð̾¤òÉÕ¤±¤ë¤È¤­¤Ë»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp +-CSR¤Ï¡¢¥Õ¥¡¥¤¥ëcertreq_file¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIstdout\fR¤ËCSR¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++CSR¤Ï¡¢¥Õ¥¡¥¤¥ëcertreq_file¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBstdout\fR¤ËCSR¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp +-CA¤«¤é¤Î¥ì¥¹¥Ý¥ó¥¹¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢\fIimportcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++CA¤«¤é¤Î¥ì¥¹¥Ý¥ó¥¹¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢\fBimportcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + \-exportcert + .RS 4 +-\fI{\-alias alias} {\-file cert_file} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-rfc} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} {\-file cert_file} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-rfc} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-\fIalias\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤«¤éÆɤ߹þ¤ß¡¢¥Õ¥¡¥¤¥ëcert_file¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIstdout\fR¤Ë¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fIalias\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤«¤éÆɤ߹þ¤ß¡¢¥Õ¥¡¥¤¥ëcert_file¤Ë³ÊǼ¤·¤Þ¤¹¡£¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBstdout\fR¤Ë¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¾ÚÌÀ½ñ¤Ï¥Ð¥¤¥Ê¥êÉä¹æ²½¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Î½ÐÎϤϥ¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¾ÚÌÀ½ñ¤Ï¥Ð¥¤¥Ê¥êÉä¹æ²½¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Î½ÐÎϤϥ¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Þ¤¹¡£ + .sp +-\fIalias\fR¤¬¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ë¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fIalias\fR¤Ï¡¢´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»ý¤Ä¸°¥¨¥ó¥È¥ê¤ò»²¾È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Ï¡¢\fIalias\fR¤Ë¤è¤Ã¤Æɽ¤µ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ç¤¹¡£ ++\fBalias\fR¤¬¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ë¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢\fBalias\fR¤Ï¡¢´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»ý¤Ä¸°¥¨¥ó¥È¥ê¤ò»²¾È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£¤³¤Î¾ÚÌÀ½ñ¤Ï¡¢\fBalias\fR¤Ë¤è¤Ã¤Æɽ¤µ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ç¤¹¡£ + .sp +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fI\-export\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fI\-exportcert\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fB\-export\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fB\-exportcert\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ + .RE + .PP + \-list + .RS 4 +-\fI{\-alias alias} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v | \-rfc} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v | \-rfc} {\-protected} {\-Jjavaoption}\fR + .sp +-\fIalias\fR¤ÇÆÃÄꤵ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÆâÍƤò\fIstdout\fR¤Ë½ÐÎϤ·¤Þ¤¹¡£\fIalias\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥­¡¼¥¹¥È¥¢Á´ÂΤÎÆâÍƤ¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++\fBalias\fR¤ÇÆÃÄꤵ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ÎÆâÍƤò\fBstdout\fR¤Ë½ÐÎϤ·¤Þ¤¹¡£\fBalias\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥­¡¼¥¹¥È¥¢Á´ÂΤÎÆâÍƤ¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .sp + ¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¾ÚÌÀ½ñ¤ÎSHA1¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤·¤Þ¤¹¡£ +-\fI\-v\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢½êÍ­¼Ô¡¢È¯¹Ô¼Ô¡¢¥·¥ê¥¢¥ëÈֹ桢³ÈÄ¥µ¡Ç½¤Ê¤É¤ÎÉÕ²ÃŪ¤Ê¾ðÊó¤È¤È¤â¤Ë¡¢¿Í´Ö¤¬Æɤळ¤È¤Î¤Ç¤­¤ë·Á¼°¤Ç¾ÚÌÀ½ñ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ç¾ÚÌÀ½ñ¤ÎÆâÍƤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fB\-v\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢½êÍ­¼Ô¡¢È¯¹Ô¼Ô¡¢¥·¥ê¥¢¥ëÈֹ桢³ÈÄ¥µ¡Ç½¤Ê¤É¤ÎÉÕ²ÃŪ¤Ê¾ðÊó¤È¤È¤â¤Ë¡¢¿Í´Ö¤¬Æɤळ¤È¤Î¤Ç¤­¤ë·Á¼°¤Ç¾ÚÌÀ½ñ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ç¾ÚÌÀ½ñ¤ÎÆâÍƤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp +-\fI\-v\fR¥ª¥×¥·¥ç¥ó¤È\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ++\fB\-v\fR¥ª¥×¥·¥ç¥ó¤È\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP + \-printcert + .RS 4 +-\fI{\-file cert_file | \-sslserver host[:port]} {\-jarfile JAR_file {\-rfc} {\-v} {\-Jjavaoption}\fR ++\fB{\-file cert_file | \-sslserver host[:port]} {\-jarfile JAR_file {\-rfc} {\-v} {\-Jjavaoption}\fR + .sp +-¥Õ¥¡¥¤¥ëcert_file¡¢host:port¤Ë¤¢¤ëSSL¥µ¡¼¥Ð¡¼¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë\fIJAR_file\fR(\fI\-jarfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê)¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤ß¡¢¿Í´Ö¤¬Æɤळ¤È¤Î¤Ç¤­¤ë·Á¼°¤Ç¾ÚÌÀ½ñ¤ÎÆâÍƤòɽ¼¨¤·¤Þ¤¹¡£¥Ý¡¼¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢É¸½à¤ÎHTTPS¥Ý¡¼¥È443¤¬ÁÛÄꤵ¤ì¤Þ¤¹¡£\fI\-sslserver\fR¤ª¤è¤Ó\-file¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤³¤ì¤ËÈ¿¤¹¤ë¾ì¹ç¡¢¥¨¥é¡¼¤¬Êó¹ð¤µ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIstdin\fR¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤ß¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ëcert_file¡¢host:port¤Ë¤¢¤ëSSL¥µ¡¼¥Ð¡¼¡¢¤Þ¤¿¤Ï½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë\fBJAR_file\fR(\fB\-jarfile\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄê)¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤ß¡¢¿Í´Ö¤¬Æɤळ¤È¤Î¤Ç¤­¤ë·Á¼°¤Ç¾ÚÌÀ½ñ¤ÎÆâÍƤòɽ¼¨¤·¤Þ¤¹¡£¥Ý¡¼¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢É¸½à¤ÎHTTPS¥Ý¡¼¥È443¤¬ÁÛÄꤵ¤ì¤Þ¤¹¡£\fB\-sslserver\fR¤ª¤è¤Ó\-file¥ª¥×¥·¥ç¥ó¤òƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤½¤ì°Ê³°¤Î¾ì¹ç¡¢¥¨¥é¡¼¤¬Êó¹ð¤µ¤ì¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBstdin\fR¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤ß¤Þ¤¹¡£ + .sp +-\fI\-rfc\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½É¸½à¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢PEM¥â¡¼¥É¤Ç¾ÚÌÀ½ñ¤ò½ÐÎϤ·¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-rfc\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½É¸½à¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢PEM¥â¡¼¥É¤Ç¾ÚÌÀ½ñ¤ò½ÐÎϤ·¤Þ¤¹¡£¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +-¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï\fIstdin\fR¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤à¾ì¹ç¡¢¤½¤Î¾ÚÌÀ½ñ¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½É¸½à¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½Êý¼°¤Þ¤¿¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Çɽ¼¨¤Ç¤­¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ë¤Þ¤¿¤Ï\fBstdin\fR¤«¤é¾ÚÌÀ½ñ¤òÆɤ߹þ¤à¾ì¹ç¡¢¤½¤Î¾ÚÌÀ½ñ¤Ï¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½É¸½à¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½Êý¼°¤Þ¤¿¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Çɽ¼¨¤Ç¤­¤Þ¤¹¡£ + .sp +-SSL¥µ¡¼¥Ð¡¼¤¬¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤ÎÇظå¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢\fI\-J\-Dhttps\&.proxyHost=proxyhost\fR¤ª¤è¤Ó\fI\-J\-Dhttps\&.proxyPort=proxyport\fR¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Æ¡¢¥×¥í¥­¥·¡¦¥È¥ó¥Í¥ê¥ó¥°¤ò»ÈÍѤǤ­¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide\&.html¤Î ++SSL¥µ¡¼¥Ð¡¼¤¬¥Õ¥¡¥¤¥¢¥¦¥©¡¼¥ë¤ÎÇظå¤Ë¤¢¤ë¾ì¹ç¤Ï¡¢\fB\-J\-Dhttps\&.proxyHost=proxyhost\fR¤ª¤è¤Ó\fB\-J\-Dhttps\&.proxyPort=proxyport\fR¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Æ¡¢¥×¥í¥­¥·¡¦¥È¥ó¥Í¥ê¥ó¥°¤ò»ÈÍѤǤ­¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide\&.html¤Î + ¡ÖJava Secure Socket Extension (JSSE) Reference Guide¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp + \fBÃí°Õ:\fR +@@ -875,9 +881,9 @@ + .PP + \-printcrl + .RS 4 +-\fI\-file crl_ {\-v}\fR ++\fB\-file crl_ {\-v}\fR + .sp +-¥Õ¥¡¥¤¥ë\fIcrl_\fR¤«¤é¾ÚÌÀ½ñ¼º¸ú¥ê¥¹¥È(CRL)¤òÆɤ߹þ¤ß¤Þ¤¹¡£CRL¤Ï¡¢È¯¹Ô¤·¤¿CA¤Ë¤è¤Ã¤Æ¼º¸ú¤µ¤ì¤¿¥Ç¥¸¥¿¥ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ç¤¹¡£CA¤Ï¡¢\fIcrl_\fR¤òÀ¸À®¤·¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ë\fBcrl_\fR¤«¤é¾ÚÌÀ½ñ¼º¸ú¥ê¥¹¥È(CRL)¤òÆɤ߹þ¤ß¤Þ¤¹¡£CRL¤Ï¡¢È¯¹Ô¤·¤¿CA¤Ë¤è¤Ã¤Æ¼º¸ú¤µ¤ì¤¿¥Ç¥¸¥¿¥ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ç¤¹¡£CA¤Ï¡¢\fBcrl_\fR¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR + ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥­¡¼¥¹¥È¥¢¤È¤Ï´Ø·¸¤Ê¤¯»ÈÍѤǤ­¤Þ¤¹¡£ +@@ -885,34 +891,34 @@ + .PP + \-storepasswd + .RS 4 +-\fI[\-new new_storepass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-Jjavaoption}\fR ++\fB[\-new new_storepass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-Jjavaoption}\fR + .sp +-¥­¡¼¥¹¥È¥¢¤ÎÆâÍƤÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤òÊѹ¹¤·¤Þ¤¹¡£\fInew_storepass\fR¤Ë¤Ï¡¢¿·¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£new_storepass¤Ï¡¢6ʸ»ú°Ê¾å¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤ÎÆâÍƤÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤ¹¤ë¥Ñ¥¹¥ï¡¼¥É¤òÊѹ¹¤·¤Þ¤¹¡£\fBnew_storepass\fR¤Ë¤Ï¡¢¿·¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Þ¤¹¡£new_storepass¤Ï¡¢6ʸ»ú°Ê¾å¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-keypasswd + .RS 4 +-\fI{\-alias alias} [\-keypass old_keypass] [\-new new_keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-Jjavaoption}\fR ++\fB{\-alias alias} [\-keypass old_keypass] [\-new new_keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-Jjavaoption}\fR + .sp +-\fIalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ëÈó¸ø³«/ÈëÌ©¸°¤òÊݸ¤ë¤¿¤á¤Î¥Ñ¥¹¥ï¡¼¥É¤ò¡¢\fIold_keypass\fR¤«¤é\fInew_keypass\fR¤ËÊѹ¹¤·¤Þ¤¹¡£new_keypass¤Ï¡¢6ʸ»ú°Ê¾å¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ëÈó¸ø³«/ÈëÌ©¸°¤òÊݸ¤ë¤¿¤á¤Î¥Ñ¥¹¥ï¡¼¥É¤ò¡¢\fBold_keypass\fR¤«¤é\fBnew_keypass\fR¤ËÊѹ¹¤·¤Þ¤¹¡£new_keypass¤Ï¡¢6ʸ»ú°Ê¾å¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-keypass\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-keypass\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .sp +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-new\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¿·¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-new\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¿·¤·¤¤¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-delete + .RS 4 +-\fI[\-alias alias] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB[\-alias alias] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-\fIalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¨¥ó¥È¥ê¤ò¥­¡¼¥¹¥È¥¢¤«¤éºï½ü¤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤ÇÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢ÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++\fBalias\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¨¥ó¥È¥ê¤ò¥­¡¼¥¹¥È¥¢¤«¤éºï½ü¤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤ÇÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢ÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-changealias + .RS 4 +-\fI{\-alias alias} [\-destalias destalias] [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR ++\fB{\-alias alias} [\-destalias destalias] [\-keypass keypass] {\-storetype storetype} {\-keystore keystore} [\-storepass storepass] {\-providerName provider_name} {\-providerClass provider_class_name {\-providerArg provider_arg}} {\-v} {\-protected} {\-Jjavaoption}\fR + .sp +-»ØÄꤵ¤ì¤¿\fIalias\fR¤«¤é¿·¤·¤¤ÊÌ̾\fIdestalias\fR¤Ø¡¢´û¸¤Î¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ò°ÜÆ°¤·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¸µ¤Î¥¨¥ó¥È¥ê¤¬¥¨¥ó¥È¥ê¡¦¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fI\-keypass\fR¥ª¥×¥·¥ç¥ó¤Ç¤½¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¸°¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fIstorepass\fR(»ØÄꤵ¤ì¤¿¾ì¹ç)¤¬¤Þ¤º»î¤ß¤é¤ì¤Þ¤¹¡£¤½¤Î»î¤ß¤¬¼ºÇÔ¤¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿\fBalias\fR¤«¤é¿·¤·¤¤ÊÌ̾\fBdestalias\fR¤Ø¡¢´û¸¤Î¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤ò°ÜÆ°¤·¤Þ¤¹¡£¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¸µ¤Î¥¨¥ó¥È¥ê¤¬¥¨¥ó¥È¥ê¡¦¥Ñ¥¹¥ï¡¼¥É¤ÇÊݸ¤ì¤Æ¤¤¤¿¾ì¹ç¡¢\fB\-keypass\fR¥ª¥×¥·¥ç¥ó¤Ç¤½¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¸°¥Ñ¥¹¥ï¡¼¥É¤¬»ØÄꤵ¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¡¢\fBstorepass\fR(»ØÄꤵ¤ì¤¿¾ì¹ç)¤¬¤Þ¤º»î¤ß¤é¤ì¤Þ¤¹¡£¤½¤Î»î¤ß¤¬¼ºÇÔ¤¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Ï¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-help +@@ -920,7 +926,7 @@ + ´ðËÜŪ¤Ê¥³¥Þ¥ó¥É¤È¤½¤Î¥ª¥×¥·¥ç¥ó¤Î°ìÍ÷¤òɽ¼¨¤·¤Þ¤¹¡£ + .sp + ÆÃÄê¤Î¥³¥Þ¥ó¥É¤Î¾ÜºÙ¤ò»²¾È¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Æ¤¯¤À¤µ¤¤: +-\fIkeytool \-command_name \-help\fR¡£\fIcommand_name\fR¤Ï¥³¥Þ¥ó¥É¤Î̾Á°¤Ç¤¹¡£ ++\fBkeytool \-command_name \-help\fR¡£\fBcommand_name\fR¤Ï¥³¥Þ¥ó¥É¤Î̾Á°¤Ç¤¹¡£ + .RE + .SH "Îã" + .PP +@@ -933,18 +939,19 @@ + .RS 4 + .\} + .nf +-keytool \-genkeypair \-dname "cn=Mark Jones, ou=Java, o=Oracle, c=US" +- \-alias business \-keypass <new password for private key> +- \-keystore /working/mykeystore +- \-storepass <new password for keystore> \-validity 180 ++\fBkeytool \-genkeypair \-dname "cn=Mark Jones, ou=Java, o=Oracle, c=US"\fR ++\fB \-alias business \-keypass <new password for private key>\fR ++\fB \-keystore /working/mykeystore\fR ++\fB \-storepass <new password for keystore> \-validity 180\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥³¥Þ¥ó¥É¤Ï¡¢working¥Ç¥£¥ì¥¯¥È¥ê¤Ë\fImykeystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤òºîÀ®¤·(¥­¡¼¥¹¥È¥¢¤Ï¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤¤¤È²¾Äê)¡¢ºîÀ®¤·¤¿¥­¡¼¥¹¥È¥¢¤Ë¡¢\fI<new password for keystore>\fR¤Ç»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥É¤ò³ä¤êÅö¤Æ¤Þ¤¹¡£À¸À®¤¹¤ë¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤ËÂбþ¤¹¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¡Ö¼±ÊÌ̾¡×¤Ï¡¢Ä̾Τ¬Mark Jones¡¢ÁÈ¿¥Ã±°Ì¤¬Java¡¢ÁÈ¿¥¤¬Oracle¡¢2ʸ»ú¤Î¹ñÈֹ椬US¤Ç¤¹¡£¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥µ¥¤¥º¤Ï¤É¤Á¤é¤â1024¥Ó¥Ã¥È¤Ç¡¢¸°¤ÎºîÀ®¤Ë¤Ï¥Ç¥Õ¥©¥ë¥È¤ÎDSA¸°À¸À®¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¤Ï¡¢working¥Ç¥£¥ì¥¯¥È¥ê¤Ë\fBmykeystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤òºîÀ®¤·(¥­¡¼¥¹¥È¥¢¤Ï¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤¤¤È²¾Äê)¡¢ºîÀ®¤·¤¿¥­¡¼¥¹¥È¥¢¤Ë¡¢\fB<new password for keystore>\fR¤Ç»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥É¤ò³ä¤êÅö¤Æ¤Þ¤¹¡£À¸À®¤¹¤ë¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤ËÂбþ¤¹¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Î¡Ö¼±ÊÌ̾¡×¤Ï¡¢Ä̾Τ¬Mark Jones¡¢ÁÈ¿¥Ã±°Ì¤¬Java¡¢ÁÈ¿¥¤¬Oracle¡¢2ʸ»ú¤Î¹ñÈֹ椬US¤Ç¤¹¡£¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥µ¥¤¥º¤Ï¤É¤Á¤é¤â1024¥Ó¥Ã¥È¤Ç¡¢¸°¤ÎºîÀ®¤Ë¤Ï¥Ç¥Õ¥©¥ë¥È¤ÎDSA¸°À¸À®¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤Þ¤¹¡£ + .PP +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎSHA1withDSA½ð̾¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤Æ¡¢¸ø³«¸°¤È¼±ÊÌ̾¾ðÊó¤ò´Þ¤à¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü´Ö¤Ï180Æü¤Ç¤¹¡£¾ÚÌÀ½ñ¤Ï¡¢ÊÌ̾\fIbusiness\fR¤ÇÆÃÄꤵ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥êÆâ¤ÎÈëÌ©¸°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Þ¤¹¡£ÈëÌ©¸°¤Ë¤Ï¡¢\fI<new password for private key>\fR¤Ç»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥É¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎSHA1withDSA½ð̾¥¢¥ë¥´¥ê¥º¥à¤ò»ÈÍѤ·¤Æ¡¢¸ø³«¸°¤È¼±ÊÌ̾¾ðÊó¤ò´Þ¤à¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¤ÎÍ­¸ú´ü´Ö¤Ï180Æü¤Ç¤¹¡£¾ÚÌÀ½ñ¤Ï¡¢ÊÌ̾\fBbusiness\fR¤ÇÆÃÄꤵ¤ì¤ë¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥êÆâ¤ÎÈëÌ©¸°¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Þ¤¹¡£ÈëÌ©¸°¤Ë¤Ï¡¢\fB<new password for private key>\fR¤Ç»ØÄꤷ¤¿¥Ñ¥¹¥ï¡¼¥É¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ + .PP + ¥ª¥×¥·¥ç¥ó¤Î¥Ç¥Õ¥©¥ë¥ÈÃͤò»ÈÍѤ¹¤ë¾ì¹ç¡¢¥³¥Þ¥ó¥É¤ÏÂçÉý¤Ëû¤¯¤Ê¤ê¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤò»ý¤Ä¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð¥Ç¥Õ¥©¥ë¥ÈÃͤ¬»ÈÍѤµ¤ì¤Þ¤¹¡£É¬¿ÜÃͤÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£»ÈÍѲÄǽ¤ÊÃͤϼ¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp +@@ -952,15 +959,16 @@ + .RS 4 + .\} + .nf +-keytool \-genkeypair ++\fBkeytool \-genkeypair\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤Î¾ì¹ç¤Ï¡¢\fImykey\fR¤È¤¤¤¦ÊÌ̾¤Ç¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤¬ºîÀ®¤µ¤ì¡¢¿·¤·¤¯À¸À®¤µ¤ì¤¿¸°¤Î¥Ú¥¢¡¢¤ª¤è¤Ó90Æü´ÖÍ­¸ú¤Ê¾ÚÌÀ½ñ¤¬¤³¤Î¥¨¥ó¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¨¥ó¥È¥ê¤Ï¡¢¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î\fI\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤ËÃÖ¤«¤ì¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¡¢¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¼±ÊÌ̾¾ðÊó¡¢¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ª¤è¤ÓÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¤³¤Î¾ì¹ç¤Ï¡¢\fBmykey\fR¤È¤¤¤¦ÊÌ̾¤Ç¥­¡¼¥¹¥È¥¢¡¦¥¨¥ó¥È¥ê¤¬ºîÀ®¤µ¤ì¡¢¿·¤·¤¯À¸À®¤µ¤ì¤¿¸°¤Î¥Ú¥¢¡¢¤ª¤è¤Ó90Æü´ÖÍ­¸ú¤Ê¾ÚÌÀ½ñ¤¬¤³¤Î¥¨¥ó¥È¥ê¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¨¥ó¥È¥ê¤Ï¡¢¥Û¡¼¥à¡¦¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î\fB\&.keystore\fR¤È¤¤¤¦Ì¾Á°¤Î¥­¡¼¥¹¥È¥¢¤ËÃÖ¤«¤ì¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Ï¡¢¤Þ¤À¸ºß¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤ËºîÀ®¤µ¤ì¤Þ¤¹¡£¼±ÊÌ̾¾ðÊó¡¢¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤ª¤è¤ÓÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .PP +-°Ê¹ß¤Ç¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤Ç\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¤â¤Î¤È¤·¤ÆÎã¤ò¼¨¤·¤Þ¤¹¡£¾ðÊó¤ÎÆþÎϤòµá¤á¤é¤ì¤¿¾ì¹ç¤Ï¡¢ºÇ½é¤Ë¼¨¤·¤¿\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤ÎÃͤòÆþÎϤ·¤¿¤â¤Î¤È¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¼±ÊÌ̾¤Ë¤Ï\fIcn=Mark Jones\fR¡¢\fIou=Java\fR¡¢\fIo=Oracle\fR¡¢\fIc=US\fR¤È»ØÄꤷ¤Þ¤¹¡£ ++°Ê¹ß¤Ç¤Ï¡¢¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤Ç\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¤â¤Î¤È¤·¤ÆÎã¤ò¼¨¤·¤Þ¤¹¡£¾ðÊó¤ÎÆþÎϤòµá¤á¤é¤ì¤¿¾ì¹ç¤Ï¡¢ºÇ½é¤Ë¼¨¤·¤¿\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤ÎÃͤòÆþÎϤ·¤¿¤â¤Î¤È¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¼±ÊÌ̾¤Ë¤Ï\fBcn=Mark Jones\fR¡¢\fBou=Java\fR¡¢\fBo=Oracle\fR¡¢\fBc=US\fR¤È»ØÄꤷ¤Þ¤¹¡£ + .SS "CA¤«¤é¤Î½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤Î¥ê¥¯¥¨¥¹¥È" + .PP + ¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òºîÀ®¤¹¤ë¸°¤Î¥Ú¥¢¤ÎÀ¸À®¡£¾ÚÌÀ½ñ¤Ë¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤Î½ð̾¤¬ÉÕ¤¤¤Æ¤¤¤ì¤Ð¡¢Â¾¤Î¥æ¡¼¥¶¡¼¤«¤é¾ÚÌÀ½ñ¤¬¿®Íꤵ¤ì¤ë²ÄǽÀ­¤â¹â¤¯¤Ê¤ê¤Þ¤¹¡£CA¤Î½ð̾¤ò¼èÆÀ¤¹¤ë¤Ë¤Ï¡¢¤Þ¤º¡¢¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È(CSR)¤òÀ¸À®¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ +@@ -969,18 +977,19 @@ + .RS 4 + .\} + .nf +-keytool \-certreq \-file MarkJ\&.csr ++\fBkeytool \-certreq \-file MarkJ\&.csr\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-CSR(¥Ç¥Õ¥©¥ë¥ÈÊÌ̾\fImykey\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤ÎCSR)¤¬ºîÀ®¤µ¤ì¡¢MarkJ\&.csr¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ËÃÖ¤«¤ì¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤òCA (VeriSign¤Ê¤É)¤ËÄó½Ð¤·¤Þ¤¹¡£CA¤ÏÍ×µá¼Ô¤ò(Ä̾ï¤Ï¥ª¥Õ¥é¥¤¥ó¤Ç)ǧ¾Ú¤·¡¢Í×µá¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿½ð̾ÉÕ¤­¤Î¾ÚÌÀ½ñ¤òÁ÷¤êÊÖ¤·¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢CA¤¬¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òÊÖ¤¹¤³¤È¤â¤¢¤ê¤Þ¤¹¡£¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤Ç¤Ï¡¢³Æ¾ÚÌÀ½ñ¤¬¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î½ð̾¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹¡£ ++CSR(¥Ç¥Õ¥©¥ë¥ÈÊÌ̾\fBmykey\fR¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤ÎCSR)¤¬ºîÀ®¤µ¤ì¡¢MarkJ\&.csr¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ËÃÖ¤«¤ì¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤òCA (VeriSign¤Ê¤É)¤ËÄó½Ð¤·¤Þ¤¹¡£CA¤ÏÍ×µá¼Ô¤ò(Ä̾ï¤Ï¥ª¥Õ¥é¥¤¥ó¤Ç)ǧ¾Ú¤·¡¢Í×µá¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿½ð̾ÉÕ¤­¤Î¾ÚÌÀ½ñ¤òÁ÷¤êÊÖ¤·¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢CA¤¬¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òÊÖ¤¹¤³¤È¤â¤¢¤ê¤Þ¤¹¡£¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤Ç¤Ï¡¢³Æ¾ÚÌÀ½ñ¤¬¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î½ð̾¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹¡£ + .SS "CA¤«¤é¤Î¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È" + .PP + ºîÀ®¤·¤¿¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ï¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤Ï¡¢³Æ¾ÚÌÀ½ñ¤¬¡¢¡Ö¥ë¡¼¥È¡×CA¤òµ¯ÅÀ¤È¤¹¤ë¥Á¥§¡¼¥óÆâ¤Î¼¡¤Î¾ÚÌÀ½ñ¤Î½ð̾¼Ô¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹¡£ + .PP +-CA¤«¤é¤Î¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢¥­¡¼¥¹¥È¥¢¤«¡¢\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë1¤Ä°Ê¾å¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤¬¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI¤Î\fR\-importcert¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++CA¤«¤é¤Î¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢¥­¡¼¥¹¥È¥¢¤«¡¢\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Ë1¤Ä°Ê¾å¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤¬¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥³¥Þ¥ó¥É¤Î\fB\-importcert\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .RS 4 + .ie n \{\ +@@ -1004,9 +1013,9 @@ + ¾ÚÌÀ½ñ±þÅú¤¬Ã±°ì¤Î¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢È¯¹ÔCA(½ð̾¤·¤¿)¤Î¾ÚÌÀ½ñ¤¬É¬ÍפǤ¹¡£¤½¤Î¾ÚÌÀ½ñ¤¬¼«¸Ê½ð̾¤Ç¤Ê¤¤¾ì¹ç¤Ï¡¢¤½¤Î½ð̾¼Ô¤Î¾ÚÌÀ½ñ¤¬É¬ÍפǤ¢¤ê¡¢¤³¤Î¤è¤¦¤Ë¤·¤Æ¼«¸Ê½ð̾¥ë¡¼¥È¾ÚÌÀ½ñ¤¬É¬Íפˤʤê¤Þ¤¹¡£ + .RE + .PP +-\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¤¤¤¯¤Ä¤«¤ÎVeriSign¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò´Þ¤ó¤À¾õÂ֤ǽв٤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢VeriSign¤Î¾ÚÌÀ½ñ¤ò¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ëɬÍפ¬¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢Â¾¤ÎCA¤ËÂФ·¤Æ½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤ò¥ê¥¯¥¨¥¹¥È¤·¤Æ¤¤¤Æ¡¢¤³¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤¬¡¢\fIcacerts\fR¤Ë¤Þ¤ÀÄɲ䵤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ëCA¤«¤é¤Î¾ÚÌÀ½ñ¤ò¡¢¡Ö¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¡×¤È¤·¤Æ¥¤¥ó¥Ý¡¼¥È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¤¤¤¯¤Ä¤«¤ÎVeriSign¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò´Þ¤ó¤À¾õÂ֤ǽв٤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢VeriSign¤Î¾ÚÌÀ½ñ¤ò¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ëɬÍפ¬¤Ê¤¤¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤À¤·¡¢Â¾¤ÎCA¤ËÂФ·¤Æ½ð̾ÉÕ¤­¾ÚÌÀ½ñ¤ò¥ê¥¯¥¨¥¹¥È¤·¤Æ¤¤¤Æ¡¢¤³¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤¬¡¢\fBcacerts\fR¤Ë¤Þ¤ÀÄɲ䵤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ëCA¤«¤é¤Î¾ÚÌÀ½ñ¤ò¡¢¡Ö¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¡×¤È¤·¤Æ¥¤¥ó¥Ý¡¼¥È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-Ä̾CA¤«¤é¤Î¾ÚÌÀ½ñ¤Ï¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¡¢¤Þ¤¿¤Ï¾¤ÎCA¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¾ÚÌÀ½ñ¤Ç¤¹(¸å¼Ô¤Î¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ë¾¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤¬É¬Í×)¡£ABC, Inc\&.,¤¬CA¤Ç¡¢ABC¤«¤é¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¤¢¤ëA\fIBCCA\&.cer\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ò¼èÆÀ¤·¤¿¤È¤·¤Þ¤¹(¤³¤Î¾ÚÌÀ½ñ¤ÏCA¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹)¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤º¡¢\fIkeytool \-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤Ê¤·¤Î\fIkeytool \-importcert\fR¥³¥Þ¥ó¥É¤Ç¤½¤ì¤òɽ¼¨¤·¡¢É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬´üÂÔ¤µ¤ì¤ë¤â¤Î¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¤òÁ÷¿®¤·¤¿¿Íʪ¤ËÏ¢Íí¤·¡¢¤³¤Î¿Íʪ¤¬Ä󼨤·¤¿(¤Þ¤¿¤Ï°ÂÁ´¤Ê¸ø³«¸°¤Î¥ê¥Ý¥¸¥È¥ê¤Ë¤è¤Ã¤ÆÄ󼨤µ¤ì¤ë)¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¾å¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬°ìÃפ¹¤ì¤Ð¡¢Á÷¿®ÅÓÃæ¤Ç¾¤Î²¿¼Ô¤«(¹¶·â¼Ô¤Ê¤É)¤Ë¤è¤ë¾ÚÌÀ½ñ¤Î¤¹¤êÂؤ¨¤¬¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£Á÷¿®ÅÓÃæ¤Ç¤³¤Î¼ï¤Î¹¶·â¤¬¹Ô¤ï¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥Á¥§¥Ã¥¯¤ò¹Ô¤ï¤º¤Ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¡¢¹¶·â¼Ô¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¤â¤Î¤ò¿®Íꤹ¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ++Ä̾CA¤«¤é¤Î¾ÚÌÀ½ñ¤Ï¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¡¢¤Þ¤¿¤Ï¾¤ÎCA¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¾ÚÌÀ½ñ¤Ç¤¹(¸å¼Ô¤Î¾ì¹ç¤Ï¡¢³ºÅö¤¹¤ë¾¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤¬É¬Í×)¡£ABC, Inc\&.,¤¬CA¤Ç¡¢ABC¤«¤é¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¤¢¤ëA\fBBCCA\&.cer\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤ò¼èÆÀ¤·¤¿¤È¤·¤Þ¤¹(¤³¤Î¾ÚÌÀ½ñ¤ÏCA¤Î¸ø³«¸°¤òǧ¾Ú¤·¤Þ¤¹)¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤º¡¢\fBkeytool \-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤Ê¤·¤Î\fBkeytool \-importcert\fR¥³¥Þ¥ó¥É¤Ç¤½¤ì¤òɽ¼¨¤·¡¢É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬´üÂÔ¤µ¤ì¤ë¤â¤Î¤È°ìÃפ¹¤ë¤«¤É¤¦¤«¤ò³Îǧ¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¤òÁ÷¿®¤·¤¿¿Íʪ¤ËÏ¢Íí¤·¡¢¤³¤Î¿Íʪ¤¬Ä󼨤·¤¿(¤Þ¤¿¤Ï¥»¥­¥å¥¢¤Ê¸ø³«¸°¤Î¥ê¥Ý¥¸¥È¥ê¤Ë¤è¤Ã¤ÆÄ󼨤µ¤ì¤ë)¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¾å¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬°ìÃפ¹¤ì¤Ð¡¢Á÷¿®ÅÓÃæ¤Ç¾¤Î²¿¼Ô¤«(¹¶·â¼Ô¤Ê¤É)¤Ë¤è¤ë¾ÚÌÀ½ñ¤Î¤¹¤êÂؤ¨¤¬¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£Á÷¿®ÅÓÃæ¤Ç¤³¤Î¼ï¤Î¹¶·â¤¬¹Ô¤ï¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥Á¥§¥Ã¥¯¤ò¹Ô¤ï¤º¤Ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¡¢¹¶·â¼Ô¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¤â¤Î¤ò¿®Íꤹ¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP + ¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤È¿®Íꤹ¤ë¾ì¹ç¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¥­¡¼¥¹¥È¥¢¤ËÄɲäǤ­¤Þ¤¹¡£ + .sp +@@ -1014,16 +1023,17 @@ + .RS 4 + .\} + .nf +-keytool \-importcert \-alias abc \-file ABCCA\&.cer ++\fBkeytool \-importcert \-alias abc \-file ABCCA\&.cer\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-ABCCA\&.cer¥Õ¥¡¥¤¥ë¤Î¥Ç¡¼¥¿¤ò´Þ¤à¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¨¥ó¥È¥ê¤¬¥­¡¼¥¹¥È¥¢Æâ¤ËºîÀ®¤µ¤ì¡¢³ºÅö¤¹¤ë¥¨¥ó¥È¥ê¤Ë\fIabc\fR¤È¤¤¤¦ÊÌ̾¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ ++ABCCA\&.cer¥Õ¥¡¥¤¥ë¤Î¥Ç¡¼¥¿¤ò´Þ¤à¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¨¥ó¥È¥ê¤¬¥­¡¼¥¹¥È¥¢Æâ¤ËºîÀ®¤µ¤ì¡¢³ºÅö¤¹¤ë¥¨¥ó¥È¥ê¤Ë\fBabc\fR¤È¤¤¤¦ÊÌ̾¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ + .SS "CA¤«¤é¤Î¾ÚÌÀ½ñ±þÅú¤Î¥¤¥ó¥Ý¡¼¥È" + .PP +-¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤ÎÄó½ÐÀè¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤·¤¿¸å¤Ï(¤Þ¤¿¤ÏƱ¼ï¤Î¾ÚÌÀ½ñ¤¬¤¹¤Ç¤Ëcacerts¥Õ¥¡¥¤¥ëÆâ¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ï)¡¢¾ÚÌÀ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤·¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤ò¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Á¥§¡¼¥ó¤Ï¡¢CA¤Î±þÅú¤¬¥Á¥§¡¼¥ó¤Î¾ì¹ç¤Ë¡¢¥ê¥¯¥¨¥¹¥È¤ËÂФ¹¤ë¥ì¥¹¥Ý¥ó¥¹¤È¤·¤ÆCA¤«¤éÁ÷¤êÊÖ¤µ¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤¹¡£¤Þ¤¿¡¢CA¤Î±þÅú¤¬Ã±°ì¤Î¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢¤³¤Î¾ÚÌÀ±þÅú¤È¡¢¥¤¥ó¥Ý¡¼¥ÈÀè¤Î¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fIcacerts\fR¥­¡¼¥¹¥È¥¢¥Õ¥¡¥¤¥ëÆâ¤Ë¤¹¤Ç¤Ë¸ºß¤¹¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤ò»ÈÍѤ·¤Æ¹½ÃÛ¤·¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤¹¡£ ++¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤ÎÄó½ÐÀè¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤·¤¿¸å¤Ï(¤Þ¤¿¤ÏƱ¼ï¤Î¾ÚÌÀ½ñ¤¬¤¹¤Ç¤Ëcacerts¥Õ¥¡¥¤¥ëÆâ¤Ë¸ºß¤·¤Æ¤¤¤ë¾ì¹ç¤Ï)¡¢¾ÚÌÀ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤·¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤ò¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¥Á¥§¡¼¥ó¤Ï¡¢CA¤Î±þÅú¤¬¥Á¥§¡¼¥ó¤Î¾ì¹ç¤Ë¡¢¥ê¥¯¥¨¥¹¥È¤ËÂФ¹¤ë¥ì¥¹¥Ý¥ó¥¹¤È¤·¤ÆCA¤«¤éÁ÷¤êÊÖ¤µ¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤¹¡£¤Þ¤¿¡¢CA¤Î±þÅú¤¬Ã±°ì¤Î¾ÚÌÀ½ñ¤Î¾ì¹ç¤Ï¡¢¤³¤Î¾ÚÌÀ±þÅú¤È¡¢¥¤¥ó¥Ý¡¼¥ÈÀè¤Î¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fBcacerts\fR¥­¡¼¥¹¥È¥¢¥Õ¥¡¥¤¥ëÆâ¤Ë¤¹¤Ç¤Ë¸ºß¤¹¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤ò»ÈÍѤ·¤Æ¹½ÃÛ¤·¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ç¤¹¡£ + .PP + ¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È¤òVeriSign¤ËÁ÷¿®¤¹¤ë¾ì¹ç¡¢Á÷¤êÊÖ¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î̾Á°¤¬VSMarkJ\&.cer¤À¤È¤¹¤ë¤È¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Æ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£ + .sp +@@ -1031,31 +1041,33 @@ + .RS 4 + .\} + .nf +-keytool \-importcert \-trustcacerts \-file VSMarkJ\&.cer ++\fBkeytool \-importcert \-trustcacerts \-file VSMarkJ\&.cer\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Î¥¨¥¯¥¹¥Ý¡¼¥È" + .PP +-\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJava Archive (JAR)¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¥¯¥é¥¤¥¢¥ó¥È¤Ï½ð̾¤òǧ¾Ú¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¤¬½ð̾¤òǧ¾Ú¤¹¤ëÊýË¡¤Î1¤Ä¤Ë¡¢¤Þ¤º¼«Ê¬¤Î¸ø³«¸°¤Î¾ÚÌÀ½ñ¤ò¿®Íê¤Ç¤­¤ë¥¨¥ó¥È¥ê¤È¤·¤Æ¥¯¥é¥¤¥¢¥ó¥È¤Î¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ëÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆJava Archive (JAR)¥Õ¥¡¥¤¥ë¤Ë½ð̾¤¹¤ë¾ì¹ç¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¥¯¥é¥¤¥¢¥ó¥È¤Ï½ð̾¤òǧ¾Ú¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¤¬½ð̾¤òǧ¾Ú¤¹¤ëÊýË¡¤Î1¤Ä¤Ë¡¢¤Þ¤º¼«Ê¬¤Î¸ø³«¸°¤Î¾ÚÌÀ½ñ¤ò¿®Íê¤Ç¤­¤ë¥¨¥ó¥È¥ê¤È¤·¤Æ¥¯¥é¥¤¥¢¥ó¥È¤Î¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ëÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ + .PP +-¤½¤Î¤¿¤á¤Ë¤Ï¡¢¾ÚÌÀ½ñ¤ò¥¨¥¯¥¹¥Ý¡¼¥È¤·¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤ËÄ󶡤·¤Þ¤¹¡£Îã¤È¤·¤Æ¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢MJ\&.cer¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ë¾ÚÌÀ½ñ¤ò¥³¥Ô¡¼¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¨¥ó¥È¥ê¤ËÊÌ̾\fImykey\fR¤¬¤¢¤ë¤È²¾Äꤷ¤Æ¤¤¤Þ¤¹¡£ ++¤½¤Î¤¿¤á¤Ë¤Ï¡¢¾ÚÌÀ½ñ¤ò¥¨¥¯¥¹¥Ý¡¼¥È¤·¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤ËÄ󶡤·¤Þ¤¹¡£Îã¤È¤·¤Æ¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢MJ\&.cer¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ë¾ÚÌÀ½ñ¤ò¥³¥Ô¡¼¤Ç¤­¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¨¥ó¥È¥ê¤ËÊÌ̾\fBmykey\fR¤¬¤¢¤ë¤È²¾Äꤷ¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-exportcert \-alias mykey \-file MJ\&.cer ++\fBkeytool \-exportcert \-alias mykey \-file MJ\&.cer\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¾ÚÌÀ½ñ¤È½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤òÆþ¼ê¤·¤¿¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢\fIjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ½ð̾¤òǧ¾Ú¤Ç¤­¤Þ¤¹¡£ ++¾ÚÌÀ½ñ¤È½ð̾ÉÕ¤­JAR¥Õ¥¡¥¤¥ë¤òÆþ¼ê¤·¤¿¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢\fBjarsigner\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ½ð̾¤òǧ¾Ú¤Ç¤­¤Þ¤¹¡£ + .SS "¥­¡¼¥¹¥È¥¢¤Î¥¤¥ó¥Ý¡¼¥È" + .PP +-¥³¥Þ¥ó¥É\fIimportkeystore\fR¤ò»ÈÍѤ¹¤ì¤Ð¡¢¤¢¤ë¥­¡¼¥¹¥È¥¢¤ÎÁ´ÂΤòÊ̤Υ­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢¸°¤ä¾ÚÌÀ½ñ¤È¤¤¤Ã¤¿¥½¡¼¥¹¥­¡¼¥¹¥È¥¢Æâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤¬¡¢Ã±°ì¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¥¿¡¼¥²¥Ã¥È¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢Æâ¤Ë´Þ¤Þ¤ì¤ë¥¨¥ó¥È¥ê¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È»þ¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¿·¤·¤¤¥¨¥ó¥È¥ê¤Ï¤¹¤Ù¤Æ¡¢¸µ¤ÈƱ¤¸ÊÌ̾¤ª¤è¤Ó(ÈëÌ©¸°¤äÈëÌ©¸°¤Î¾ì¹ç¤Ï)ÊݸîÍѥѥ¹¥ï¡¼¥É¤ò»ý¤Á¤Þ¤¹¡£¥½¡¼¥¹¥­¡¼¥¹¥È¥¢Æâ¤ÎÈó¸ø³«/ÈëÌ©¸°¤ò¥ê¥«¥Ð¥ê¤Ç¤­¤Ê¤¤¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤Ë¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢ÊÌ̾¤Î½ÅÊ£¤ò¸¡½Ð¤¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Ë¿·¤·¤¤ÊÌ̾¤ÎÆþÎϤòµá¤á¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢¿·¤·¤¤ÊÌ̾¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ã±½ã¤Ë´û¸¤ÎÊÌ̾¤Î¾å½ñ¤­¤ò\fIkeytool\fR¥³¥Þ¥ó¥É¤Ëµö²Ä¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É\fBimportkeystore\fR¤ò»ÈÍѤ¹¤ì¤Ð¡¢¤¢¤ë¥­¡¼¥¹¥È¥¢¤ÎÁ´ÂΤòÊ̤Υ­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£¤³¤ì¤Ï¡¢¸°¤ä¾ÚÌÀ½ñ¤È¤¤¤Ã¤¿¥½¡¼¥¹¥­¡¼¥¹¥È¥¢Æâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤¬¡¢Ã±°ì¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¥¿¡¼¥²¥Ã¥È¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢Æâ¤Ë´Þ¤Þ¤ì¤ë¥¨¥ó¥È¥ê¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥¤¥ó¥Ý¡¼¥È»þ¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢Æâ¤Î¿·¤·¤¤¥¨¥ó¥È¥ê¤Ï¤¹¤Ù¤Æ¡¢¸µ¤ÈƱ¤¸ÊÌ̾¤ª¤è¤Ó(ÈëÌ©¸°¤äÈëÌ©¸°¤Î¾ì¹ç¤Ï)ÊݸîÍѥѥ¹¥ï¡¼¥É¤ò»ý¤Á¤Þ¤¹¡£¥½¡¼¥¹¥­¡¼¥¹¥È¥¢Æâ¤ÎÈó¸ø³«/ÈëÌ©¸°¤ò¥ê¥«¥Ð¥ê¤Ç¤­¤Ê¤¤¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¥æ¡¼¥¶¡¼¤Ë¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢ÊÌ̾¤Î½ÅÊ£¤ò¸¡½Ð¤¹¤ë¤È¡¢¥æ¡¼¥¶¡¼¤Ë¿·¤·¤¤ÊÌ̾¤ÎÆþÎϤòµá¤á¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢¿·¤·¤¤ÊÌ̾¤ò»ØÄꤹ¤ë¤³¤È¤â¡¢Ã±½ã¤Ë´û¸¤ÎÊÌ̾¤Î¾å½ñ¤­¤ò\fBkeytool\fR¥³¥Þ¥ó¥É¤Ëµö²Ä¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .PP + ¤¿¤È¤¨¤Ð¡¢Ä̾ï¤ÎJKS¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢key\&.jksÆâ¤Î¥¨¥ó¥È¥ê¤òPKCS#11¥¿¥¤¥×¤Î¥Ï¡¼¥É¥¦¥§¥¢¡¦¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢Æâ¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp +@@ -1063,59 +1075,62 @@ + .RS 4 + .\} + .nf +-keytool \-importkeystore +- \-srckeystore key\&.jks \-destkeystore NONE +- \-srcstoretype JKS \-deststoretype PKCS11 +- \-srcstorepass <src keystore password> +- \-deststorepass <destination keystore pwd> ++\fBkeytool \-importkeystore\fR ++\fB \-srckeystore key\&.jks \-destkeystore NONE\fR ++\fB \-srcstoretype JKS \-deststoretype PKCS11\fR ++\fB \-srcstorepass <src keystore password>\fR ++\fB \-deststorepass <destination keystore pwd>\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤Þ¤¿¡¢\fIimportkeystore\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢¤¢¤ë¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Îñ°ì¤Î¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢Á°Îã¤Î¥ª¥×¥·¥ç¥ó¤Ë²Ã¤¨¤Æ¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ëÊÌ̾¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI\-srcalias\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¾ì¹ç¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤â¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é»ØÄê¤Ç¤­¤ë¤Û¤«¡¢ÈëÌ©/ÈëÌ©¸°¤ÎÊݸîÍѥѥ¹¥ï¡¼¥É¤ä¥¿¡¼¥²¥Ã¥ÈÊݸîÍѥѥ¹¥ï¡¼¥É¤â»ØÄê¤Ç¤­¤Þ¤¹¡£¤½¤ÎÊýË¡¤ò¼¨¤¹¥³¥Þ¥ó¥É¤ò¼¡¤Ë¼¨¤·¤Þ¤¹¡£ ++¤Þ¤¿¡¢\fBimportkeystore\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢¤¢¤ë¥½¡¼¥¹¡¦¥­¡¼¥¹¥È¥¢Æâ¤Îñ°ì¤Î¥¨¥ó¥È¥ê¤ò¥¿¡¼¥²¥Ã¥È¡¦¥­¡¼¥¹¥È¥¢¤Ë¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢Á°Îã¤Î¥ª¥×¥·¥ç¥ó¤Ë²Ã¤¨¤Æ¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ëÊÌ̾¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-srcalias\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¾ì¹ç¤Ë¤Ï¡¢¥¿¡¼¥²¥Ã¥ÈÊÌ̾¤â¥³¥Þ¥ó¥É¹Ô¤«¤é»ØÄê¤Ç¤­¤ë¤Û¤«¡¢ÈëÌ©/ÈëÌ©¸°¤ÎÊݸîÍѥѥ¹¥ï¡¼¥É¤ä¥¿¡¼¥²¥Ã¥ÈÊݸîÍѥѥ¹¥ï¡¼¥É¤â»ØÄê¤Ç¤­¤Þ¤¹¡£¤½¤ÎÊýË¡¤ò¼¨¤¹¥³¥Þ¥ó¥É¤ò¼¡¤Ë¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-importkeystore +- \-srckeystore key\&.jks \-destkeystore NONE +- \-srcstoretype JKS \-deststoretype PKCS11 +- \-srcstorepass <src keystore password> +- \-deststorepass <destination keystore pwd> +- \-srcalias myprivatekey \-destalias myoldprivatekey +- \-srckeypass <source entry password> +- \-destkeypass <destination entry password> +- \-noprompt ++\fBkeytool \-importkeystore\fR ++\fB \-srckeystore key\&.jks \-destkeystore NONE\fR ++\fB \-srcstoretype JKS \-deststoretype PKCS11\fR ++\fB \-srcstorepass <src keystore password>\fR ++\fB \-deststorepass <destination keystore pwd>\fR ++\fB \-srcalias myprivatekey \-destalias myoldprivatekey\fR ++\fB \-srckeypass <source entry password>\fR ++\fB \-destkeypass <destination entry password>\fR ++\fB \-noprompt\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "SSL¥µ¡¼¥Ð¡¼¤Î¾ÚÌÀ½ñ¤ÎÀ¸À®" + .PP +-¼¡¤Ë¡¢3¤Ä¤Î¥¨¥ó¥Æ¥£¥Æ¥£¡¢¤Ä¤Þ¤ê¥ë¡¼¥ÈCA(\fIroot\fR)¡¢Ãæ´ÖCA(\fIca\fR)¤ª¤è¤ÓSSL¥µ¡¼¥Ð¡¼(\fIserver\fR)ÍѤθ°¥Ú¥¢¤È¾ÚÌÀ½ñ¤òÀ¸À®¤¹¤ë\fIkeytool\fR¥³¥Þ¥ó¥É¤ò¼¨¤·¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¾ÚÌÀ½ñ¤òƱ¤¸¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÎÎã¤Ç¤Ï¡¢RSA¤¬¿ä¾©¤µ¤ì¤ë¸°¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹¡£ ++¼¡¤Ë¡¢3¤Ä¤Î¥¨¥ó¥Æ¥£¥Æ¥£¡¢¤Ä¤Þ¤ê¥ë¡¼¥ÈCA(\fBroot\fR)¡¢Ãæ´ÖCA(\fBca\fR)¤ª¤è¤ÓSSL¥µ¡¼¥Ð¡¼(\fBserver\fR)ÍѤθ°¥Ú¥¢¤È¾ÚÌÀ½ñ¤òÀ¸À®¤¹¤ë\fBkeytool\fR¥³¥Þ¥ó¥É¤ò¼¨¤·¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¾ÚÌÀ½ñ¤òƱ¤¸¥­¡¼¥¹¥È¥¢¤Ë³ÊǼ¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÎÎã¤Ç¤Ï¡¢RSA¤¬¿ä¾©¤µ¤ì¤ë¸°¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-genkeypair \-keystore root\&.jks \-alias root \-ext bc:c +-keytool \-genkeypair \-keystore ca\&.jks \-alias ca \-ext bc:c +-keytool \-genkeypair \-keystore server\&.jks \-alias server ++\fBkeytool \-genkeypair \-keystore root\&.jks \-alias root \-ext bc:c\fR ++\fBkeytool \-genkeypair \-keystore ca\&.jks \-alias ca \-ext bc:c\fR ++\fBkeytool \-genkeypair \-keystore server\&.jks \-alias server\fR ++\fB \fR ++\fBkeytool \-keystore root\&.jks \-alias root \-exportcert \-rfc > root\&.pem\fR ++\fB \fR ++\fBkeytool \-storepass <storepass> \-keystore ca\&.jks \-certreq \-alias ca |\fR ++\fB keytool \-storepass <storepass> \-keystore root\&.jks\fR ++\fB \-gencert \-alias root \-ext BC=0 \-rfc > ca\&.pem\fR ++\fBkeytool \-keystore ca\&.jks \-importcert \-alias ca \-file ca\&.pem\fR ++\fB \fR ++\fBkeytool \-storepass <storepass> \-keystore server\&.jks \-certreq \-alias server |\fR ++\fB keytool \-storepass <storepass> \-keystore ca\&.jks \-gencert \-alias ca\fR ++\fB \-ext ku:c=dig,kE \-rfc > server\&.pem\fR ++\fBcat root\&.pem ca\&.pem server\&.pem |\fR ++\fB keytool \-keystore server\&.jks \-importcert \-alias server\fR + +-keytool \-keystore root\&.jks \-alias root \-exportcert \-rfc > root\&.pem +- +-keytool \-storepass <storepass> \-keystore ca\&.jks \-certreq \-alias ca | +- keytool \-storepass <storepass> \-keystore root\&.jks +- \-gencert \-alias root \-ext BC=0 \-rfc > ca\&.pem +-keytool \-keystore ca\&.jks \-importcert \-alias ca \-file ca\&.pem +- +-keytool \-storepass <storepass> \-keystore server\&.jks \-certreq \-alias server | +- keytool \-storepass <storepass> \-keystore ca\&.jks \-gencert \-alias ca +- \-ext ku:c=dig,kE \-rfc > server\&.pem +-cat root\&.pem ca\&.pem server\&.pem | +- keytool \-keystore server\&.jks \-importcert \-alias server + .fi + .if n \{\ + .RE +@@ -1129,10 +1144,10 @@ + .PP + ¥­¡¼¥¹¥È¥¢¤Î¥¨¥ó¥È¥ê + .RS 4 +-¥­¡¼¥¹¥È¥¢¤Ë¤Ï°Û¤Ê¤ë¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤ÇºÇ¤âŬÍÑÈϰϤι­¤¤¥¨¥ó¥È¥ê¡¦¥¿¥¤¥×¤Ï¡¢¼¡¤Î2¤Ä¤Ç¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Ë¤Ï°Û¤Ê¤ë¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤ÇºÇ¤âŬÍÑÈϰϤι­¤¤¥¨¥ó¥È¥ê¡¦¥¿¥¤¥×¤Ï¡¢¼¡¤Î2¤Ä¤Ç¤¹¡£ + .sp + \fB¸°¤Î¥¨¥ó¥È¥ê\fR +-\- ³Æ¥¨¥ó¥È¥ê¤Ï¡¢Èó¾ï¤Ë½ÅÍפʰŹ沽¤Î¸°¤Î¾ðÊó¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ï¡¢µö²Ä¤·¤Æ¤¤¤Ê¤¤¥¢¥¯¥»¥¹¤òËɤ°¤¿¤á¤Ë¡¢Êݸ¤ì¤¿·Á¤Ç³ÊǼ¤µ¤ì¤Þ¤¹¡£°ìÈ̤ˡ¢¤³¤Î¼ï¤Î¥¨¥ó¥È¥ê¤È¤·¤Æ³ÊǼ¤µ¤ì¤ë¸°¤Ï¡¢ÈëÌ©¸°¤«¡¢Âбþ¤¹¤ë¸ø³«¸°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òȼ¤¦ÈëÌ©¸°¤Ç¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤¬¤³¤ÎξÊý¤Î¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¤ò½èÍý¤Ç¤­¤ë¤Î¤ËÂФ·¡¢\fIjarsigner\fR¥Ä¡¼¥ë¤Ï¸å¼Ô¤Î¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¡¢¤Ä¤Þ¤êÈëÌ©¸°¤È¤½¤ì¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¤ß¤ò½èÍý¤·¤Þ¤¹¡£ ++\- ³Æ¥¨¥ó¥È¥ê¤Ï¡¢Èó¾ï¤Ë½ÅÍפʰŹ沽¤Î¸°¤Î¾ðÊó¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ï¡¢µö²Ä¤·¤Æ¤¤¤Ê¤¤¥¢¥¯¥»¥¹¤òËɤ°¤¿¤á¤Ë¡¢Êݸ¤ì¤¿·Á¤Ç³ÊǼ¤µ¤ì¤Þ¤¹¡£°ìÈ̤ˡ¢¤³¤Î¼ï¤Î¥¨¥ó¥È¥ê¤È¤·¤Æ³ÊǼ¤µ¤ì¤ë¸°¤Ï¡¢ÈëÌ©¸°¤«¡¢Âбþ¤¹¤ë¸ø³«¸°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òȼ¤¦ÈëÌ©¸°¤Ç¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤¬¤³¤ÎξÊý¤Î¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¤ò½èÍý¤Ç¤­¤ë¤Î¤ËÂФ·¡¢\fBjarsigner\fR¥Ä¡¼¥ë¤Ï¸å¼Ô¤Î¥¿¥¤¥×¤Î¥¨¥ó¥È¥ê¡¢¤Ä¤Þ¤êÈëÌ©¸°¤È¤½¤ì¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¤ß¤ò½èÍý¤·¤Þ¤¹¡£ + .sp + \fB¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¨¥ó¥È¥ê\fR: ³Æ¥¨¥ó¥È¥ê¤Ï¡¢Âè»°¼Ô¤«¤é¤Î¸ø³«¸°¾ÚÌÀ½ñ¤ò1¤Ä´Þ¤ó¤Ç¤¤¤Þ¤¹¡£¤³¤Î¥¨¥ó¥È¥ê¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¸Æ¤Ð¤ì¤Þ¤¹¡£¤½¤ì¤Ï¡¢¾ÚÌÀ½ñÆâ¤Î¸ø³«¸°¤¬¡¢¾ÚÌÀ½ñ¤ÎSubject(½êÍ­¼Ô)¤Ë¤è¤Ã¤ÆÆÃÄꤵ¤ì¤ë¥¢¥¤¥Ç¥ó¥Æ¥£¥Æ¥£¤ËͳÍ褹¤ë¤â¤Î¤Ç¤¢¤ë¤³¤È¤ò¡¢¥­¡¼¥¹¥È¥¢¤Î½êÍ­¼Ô¤¬¿®Íꤹ¤ë¤«¤é¤Ç¤¹¡£¾ÚÌÀ½ñ¤Îȯ¹Ô¼Ô¤Ï¡¢¾ÚÌÀ½ñ¤Ë½ð̾¤òÉÕ¤±¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¤½¤ÎÆâÍƤòÊݾڤ·¤Þ¤¹¡£ + .RE +@@ -1141,81 +1156,86 @@ + .RS 4 + ¥­¡¼¥¹¥È¥¢¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê(¸°¤ª¤è¤Ó¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¥¨¥ó¥È¥ê)¤Ï¡¢°ì°Õ¤ÎÊÌ̾¤ò²ð¤·¤Æ¥¢¥¯¥»¥¹¤µ¤ì¤Þ¤¹¡£ + .sp +-ÊÌ̾¤ò»ØÄꤹ¤ë¤Î¤Ï¡¢\fI\-genseckey\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÈëÌ©¸°¤òÀ¸À®¤·¤¿¤ê¡¢\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¸°¥Ú¥¢(¸ø³«¸°¤ÈÈëÌ©¸°)¤òÀ¸À®¤·¤¿¤ê¡¢\fI\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤ËÄɲ乤ë¤Ê¤É¡¢ÆÃÄê¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤ò¥­¡¼¥¹¥È¥¢¤ËÄɲ乤ë¾ì¹ç¤Ç¤¹¡£¤³¤ì°Ê¸å¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¥¨¥ó¥Æ¥£¥Æ¥£¤ò»²¾È¤¹¤ë¾ì¹ç¤Ï¡¢¤³¤Î¤È¤­¤Ë»ØÄꤷ¤¿ÊÌ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++ÊÌ̾¤ò»ØÄꤹ¤ë¤Î¤Ï¡¢\fB\-genseckey\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤ÆÈëÌ©¸°¤òÀ¸À®¤·¤¿¤ê¡¢\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¸°¥Ú¥¢(¸ø³«¸°¤ÈÈëÌ©¸°)¤òÀ¸À®¤·¤¿¤ê¡¢\fB\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ¤Þ¤¿¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤ËÄɲ乤ë¤Ê¤É¡¢ÆÃÄê¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤ò¥­¡¼¥¹¥È¥¢¤ËÄɲ乤ë¾ì¹ç¤Ç¤¹¡£¤³¤ì°Ê¸å¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¥¨¥ó¥Æ¥£¥Æ¥£¤ò»²¾È¤¹¤ë¾ì¹ç¤Ï¡¢¤³¤Î¤È¤­¤Ë»ØÄꤷ¤¿ÊÌ̾¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¤¿¤È¤¨¤Ð¡¢\fIduke\fR¤È¤¤¤¦ÊÌ̾¤ò»ÈÍѤ·¤Æ¿·¤·¤¤¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤òÀ¸À®¤·¡¢¸ø³«¸°¤ò¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤¹¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¤¿¤È¤¨¤Ð¡¢\fBduke\fR¤È¤¤¤¦ÊÌ̾¤ò»ÈÍѤ·¤Æ¿·¤·¤¤¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤òÀ¸À®¤·¡¢¸ø³«¸°¤ò¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤¹¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-genkeypair \-alias duke \-keypass dukekeypasswd ++\fBkeytool \-genkeypair \-alias duke \-keypass dukekeypasswd\fR ++ + .fi + .if n \{\ + .RE + .\} +-¤³¤ÎÎã¤Ç¤Ï¡¢½é´ü¥Ñ¥¹¥ï¡¼¥É¤È¤·¤Æ\fIdukekeypasswd\fR¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹¡£°Ê¸å¡¢ÊÌ̾\fIduke\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ë¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ï¡¢¤³¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬Íפˤʤê¤Þ¤¹¡£Duke¤ÎÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ò¤¢¤È¤«¤éÊѹ¹¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢½é´ü¥Ñ¥¹¥ï¡¼¥É¤È¤·¤Æ\fBdukekeypasswd\fR¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹¡£°Ê¸å¡¢ÊÌ̾\fBduke\fR¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿ÈëÌ©¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ë¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ï¡¢¤³¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬Íפˤʤê¤Þ¤¹¡£Duke¤ÎÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ò¤¢¤È¤«¤éÊѹ¹¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-keypasswd \-alias duke \-keypass dukekeypasswd \-new newpass ++\fBkeytool \-keypasswd \-alias duke \-keypass dukekeypasswd \-new newpass\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥Ñ¥¹¥ï¡¼¥É¤¬¡¢\fIdukekeypasswd\fR¤«¤é\fInewpass\fR¤ËÊѹ¹¤µ¤ì¤Þ¤¹¡£¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¡¢¤Þ¤¿¤Ï°ÂÁ´¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¥·¥¹¥Æ¥à¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£É¬Íפʥѥ¹¥ï¡¼¥É¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥Ñ¥¹¥ï¡¼¥É¤¬¡¢\fBdukekeypasswd\fR¤«¤é\fBnewpass\fR¤ËÊѹ¹¤µ¤ì¤Þ¤¹¡£¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¡¢¤Þ¤¿¤Ï°ÂÁ´¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¥·¥¹¥Æ¥à¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£É¬Íפʥѥ¹¥ï¡¼¥É¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ + .RS 4 +-\fIjava\&.security\fR¥Ñ¥Ã¥±¡¼¥¸¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë\fIKeyStore\fR¥¯¥é¥¹¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¾ðÊó¤Ø¤Î¥¢¥¯¥»¥¹¤ª¤è¤Ó¾ðÊó¤ÎÊѹ¹¤ò¹Ô¤¦¤¿¤á¤Î¡¢ÌÀ³Î¤ËÄêµÁ¤µ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¸ÇÄê¼ÂÁõ¤È¤·¤Æ¤Ï¡¢¤½¤ì¤¾¤ì¤¬ÆÃÄê¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤òÂоݤȤ¹¤ëÊ£¿ô¤Î°Û¤Ê¤ë¼ÂÁõ¤¬Â¸ºß²Äǽ¤Ç¤¹¡£ ++\fBjava\&.security\fR¥Ñ¥Ã¥±¡¼¥¸¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë\fBKeyStore\fR¥¯¥é¥¹¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¾ðÊó¤Ø¤Î¥¢¥¯¥»¥¹¤ª¤è¤Ó¾ðÊó¤ÎÊѹ¹¤ò¹Ô¤¦¤¿¤á¤Î¡¢ÌÀ³Î¤ËÄêµÁ¤µ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¸ÇÄê¼ÂÁõ¤È¤·¤Æ¤Ï¡¢¤½¤ì¤¾¤ì¤¬ÆÃÄê¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤òÂоݤȤ¹¤ëÊ£¿ô¤Î°Û¤Ê¤ë¼ÂÁõ¤¬Â¸ºß²Äǽ¤Ç¤¹¡£ + .sp +-¸½ºß¡¢\fIkeytool\fR¤È\fIjarsigner\fR¤Î2¤Ä¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ä¡¼¥ë¤È¡¢Policy Tool¤È¤¤¤¦Ì¾Á°¤ÎGUI¥Ù¡¼¥¹¤Î¥Ä¡¼¥ë¤¬¡¢¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£\fIKeyStore\fR¥¯¥é¥¹¤Ï\fIpublic\fR¤Ç¤¢¤ë¤¿¤á¡¢¥æ¡¼¥¶¡¼¤ÏKeyStore¤ò»ÈÍѤ·¤¿Â¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤âºîÀ®¤Ç¤­¤Þ¤¹¡£ ++¸½ºß¡¢\fBkeytool\fR¤È\fBjarsigner\fR¤Î2¤Ä¤Î¥³¥Þ¥ó¥É¹Ô¥Ä¡¼¥ë¤È¡¢Policy Tool¤È¤¤¤¦Ì¾Á°¤ÎGUI¥Ù¡¼¥¹¤Î¥Ä¡¼¥ë¤¬¡¢¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£\fBKeyStore\fR¥¯¥é¥¹¤Ï\fBpublic\fR¤Ç¤¢¤ë¤¿¤á¡¢¥æ¡¼¥¶¡¼¤ÏKeyStore¤ò»ÈÍѤ·¤¿Â¾¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤âºîÀ®¤Ç¤­¤Þ¤¹¡£ + .sp + ¥­¡¼¥¹¥È¥¢¤Ë¤Ï¡¢Oracle¤¬Ä󶡤¹¤ëÁȹþ¤ß¤Î¥Ç¥Õ¥©¥ë¥È¤Î¼ÂÁõ¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤Ï¡¢JKS¤È¤¤¤¦Ì¾Á°¤ÎÆȼ«¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×(·Á¼°)¤òÍøÍѤ¹¤ë¤â¤Î¤Ç¡¢¥­¡¼¥¹¥È¥¢¤ò¥Õ¥¡¥¤¥ë¤È¤·¤Æ¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤Î¼ÂÁõ¤Ç¤Ï¡¢¸Ä¡¹¤ÎÈëÌ©¸°¤Ï¸ÄÊ̤Υѥ¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¡¢¥­¡¼¥¹¥È¥¢Á´ÂΤÎÀ°¹çÀ­¤â(ÈëÌ©¸°¤È¤ÏÊ̤Î)¥Ñ¥¹¥ï¡¼¥É¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Þ¤¹¡£ + .sp +-¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ï¡¢¥×¥í¥Ð¥¤¥À¥Ù¡¼¥¹¤Ç¤¹¡£¶ñÂÎŪ¤Ë¤Ï¡¢\fIKeyStore\fR¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹(SPI)¤Ë´ð¤Å¤¤¤Æ¼ÂÁõ¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢Âбþ¤¹¤ë\fIKeystoreSpi\fRÃê¾Ý¥¯¥é¥¹(¤³¤ì¤â\fIjava\&.security\fR¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹)¤¬¤¢¤ê¡¢¤³¤Î¥¯¥é¥¹¤¬¡¢¥×¥í¥Ð¥¤¥À¤¬¼ÂÁõ¤¹¤ëɬÍפΤ¢¤ëService Provider Interface¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢\fI¥×¥í¥Ð¥¤¥À\fR¤È¤Ï¡¢Java Security API¤Ë¤è¤Ã¤Æ¥¢¥¯¥»¥¹²Äǽ¤Ê¥µ¡¼¥Ó¥¹¤Î¥µ¥Ö¥»¥Ã¥È¤ËÂФ·¡¢¤½¤Î¸ÇÄê¼ÂÁõ¤òÄ󶡤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î½¸¹ç¤Î¤³¤È¤Ç¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¤Ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider\&.html¤Ë¤¢¤ë +-Java°Å¹æ²½¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥×¥í¥Ð¥¤¥À¤Î¼ÂÁõÊýË¡¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¥×¥í¥Ð¥¤¥À¤ò¼ÂÁõ¤·¡¢\fIKeystoreSpi\fR¥µ¥Ö¥¯¥é¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ï¡¢¥×¥í¥Ð¥¤¥À¥Ù¡¼¥¹¤Ç¤¹¡£¶ñÂÎŪ¤Ë¤Ï¡¢\fBKeyStore\fR¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬¥µ¡¼¥Ó¥¹¡¦¥×¥í¥Ð¥¤¥À¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹(SPI)¤Ë´ð¤Å¤¤¤Æ¼ÂÁõ¤µ¤ì¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢Âбþ¤¹¤ë\fBKeystoreSpi\fRÃê¾Ý¥¯¥é¥¹(¤³¤ì¤â\fBjava\&.security\fR¥Ñ¥Ã¥±¡¼¥¸¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹)¤¬¤¢¤ê¡¢¤³¤Î¥¯¥é¥¹¤¬¡¢¥×¥í¥Ð¥¤¥À¤¬¼ÂÁõ¤¹¤ëɬÍפΤ¢¤ëService Provider Interface¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤³¤Ç¡¢\fI¥×¥í¥Ð¥¤¥À\fR¤È¤Ï¡¢Java Security API¤Ë¤è¤Ã¤Æ¥¢¥¯¥»¥¹²Äǽ¤Ê¥µ¡¼¥Ó¥¹¤Î¥µ¥Ö¥»¥Ã¥È¤ËÂФ·¡¢¤½¤Î¸ÇÄê¼ÂÁõ¤òÄ󶡤¹¤ë¥Ñ¥Ã¥±¡¼¥¸¤Þ¤¿¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Î½¸¹ç¤Î¤³¤È¤Ç¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¤Ë¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider\&.html¤Ë¤¢¤ë ++Java°Å¹æ²½¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤Î¥×¥í¥Ð¥¤¥À¤Î¼ÂÁõÊýË¡¤ÇÀâÌÀ¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¥×¥í¥Ð¥¤¥À¤ò¼ÂÁõ¤·¡¢\fBKeystoreSpi\fR¥µ¥Ö¥¯¥é¥¹¤Î¼ÂÁõ¤òÄ󶡤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢\fIKeyStore\fR¥¯¥é¥¹¤¬Ä󶡤¹¤ë\fIgetInstance\fR¥Õ¥¡¥¯¥È¥ê¡¦¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢ÍÍ¡¹¤Ê¥×¥í¥Ð¥¤¥À¤«¤é°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÁªÂò¤Ç¤­¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Ï¡¢¥­¡¼¥¹¥È¥¢¾ðÊó¤Î³ÊǼ·Á¼°¤È¥Ç¡¼¥¿·Á¼°¤òÄêµÁ¤¹¤ë¤È¤È¤â¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÈó¸ø³«/ÈëÌ©¸°¤È¥­¡¼¥¹¥È¥¢¤ÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à¤òÄêµÁ¤·¤Þ¤¹¡£°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ë¤Ï¡¢¸ß´¹À­¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ++¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢\fBKeyStore\fR¥¯¥é¥¹¤¬Ä󶡤¹¤ë\fBgetInstance\fR¥Õ¥¡¥¯¥È¥ê¡¦¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢ÍÍ¡¹¤Ê¥×¥í¥Ð¥¤¥À¤«¤é°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÁªÂò¤Ç¤­¤Þ¤¹¡£¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Ï¡¢¥­¡¼¥¹¥È¥¢¾ðÊó¤Î³ÊǼ·Á¼°¤È¥Ç¡¼¥¿·Á¼°¤òÄêµÁ¤¹¤ë¤È¤È¤â¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤ÎÈó¸ø³«/ÈëÌ©¸°¤È¥­¡¼¥¹¥È¥¢¤ÎÀ°¹çÀ­¤òÊݸ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤ë¥¢¥ë¥´¥ê¥º¥à¤òÄêµÁ¤·¤Þ¤¹¡£°Û¤Ê¤ë¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ë¤Ï¡¢¸ß´¹À­¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + .sp +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¼ÂÁõ¤ÇÆ°ºî¤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¡¦¥é¥¤¥ó¤ÇÅϤµ¤ì¤¿¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò¥Õ¥¡¥¤¥ë̾¤È¤·¤Æ°·¤Ã¤Æ¡¢\fIFileInputStream\fR¤ËÊÑ´¹¤·¡¢¤³¤³¤«¤é¥­¡¼¥¹¥È¥¢¾ðÊó¤ò¥í¡¼¥É¤·¤Þ¤¹¡£\fIjarsigner\fR¤ª¤è¤Ó\fIpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢URL¤Ç»ØÄê¤Ç¤­¤ëǤ°Õ¤Î¾ì½ê¤«¤é¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¥Ù¡¼¥¹¤Î¥­¡¼¥¹¥È¥¢¼ÂÁõ¤ÇÆ°ºî¤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤ÇÅϤµ¤ì¤¿¥­¡¼¥¹¥È¥¢¤Î¾ì½ê¤ò¥Õ¥¡¥¤¥ë̾¤È¤·¤Æ°·¤Ã¤Æ¡¢\fBFileInputStream\fR¤ËÊÑ´¹¤·¡¢¤³¤³¤«¤é¥­¡¼¥¹¥È¥¢¾ðÊó¤ò¥í¡¼¥É¤·¤Þ¤¹¡£\fBjarsigner\fR¤ª¤è¤Ó\fBpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢URL¤Ç»ØÄê¤Ç¤­¤ëǤ°Õ¤Î¾ì½ê¤«¤é¥­¡¼¥¹¥È¥¢¤òÆɤ߼è¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-\fIkeytool\fR¤È\fIjarsigner\fR¤Î¾ì¹ç¡¢\fI\-storetype\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Policy Tool¤Î¾ì¹ç¤Ï¡¢¡Ö¥­¡¼¥¹¥È¥¢¡×¥á¥Ë¥å¡¼¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fBkeytool\fR¤È\fBjarsigner\fR¤Î¾ì¹ç¡¢\fB\-storetype\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥³¥Þ¥ó¥É¹Ô¤Ç¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£Policy Tool¤Î¾ì¹ç¤Ï¡¢¡Ö¥­¡¼¥¹¥È¥¢¡×¥á¥Ë¥å¡¼¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp +-¥æ¡¼¥¶¡¼¤¬¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤵ¤ì¤¿\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ˴ð¤Å¤¤¤Æ¡¢¥Ä¡¼¥ë¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤¬ÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ï\fIjava\&.security\fR¤È¸Æ¤Ð¤ì¡¢Windows¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fIjava\&.home\elib\esecurity\fR¡¢Oracle Solaris¤Ç¤Ï\fIjava\&.home/lib/security\fR¤Ë¤¢¤ê¤Þ¤¹¡£\fIjava\&.home\fR¤Ï¡¢¼Â¹Ô»þ´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£\fIjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢SDK¤Þ¤¿¤ÏJava Runtime Environment (JRE)¤ÎºÇ¾å°Ì¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£ ++¥æ¡¼¥¶¡¼¤¬¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤òÌÀ¼¨Åª¤Ë»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤵ¤ì¤¿\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ˴ð¤Å¤¤¤Æ¡¢¥Ä¡¼¥ë¤Ë¤è¤Ã¤Æ¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤¬ÁªÂò¤µ¤ì¤Þ¤¹¡£¤³¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤Ï\fBjava\&.security\fR¤È¸Æ¤Ð¤ì¡¢Windows¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fBjava\&.home\elib\esecurity\fR¡¢Oracle Solaris¤Ç¤Ï\fBjava\&.home/lib/security\fR¤Ë¤¢¤ê¤Þ¤¹¡£\fBjava\&.home\fR¤Ï¡¢¼Â¹Ô»þ´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ç¤¹¡£\fBjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Ï¡¢SDK¤Þ¤¿¤ÏJava Runtime Environment (JRE)¤ÎºÇ¾å°Ì¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£ + .sp +-³Æ¥Ä¡¼¥ë¤Ï¡¢\fIkeystore\&.type\fR¤ÎÃͤò¼èÆÀ¤·¡¢¤³¤ÎÃͤǻØÄꤵ¤ì¤¿¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¡¢¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥Ð¥¤¥À¤òÄ´¤Ù¤Þ¤¹¡£¤½¤Î¥×¥í¥Ð¥¤¥À¤«¤é¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Þ¤¹¡£\fIKeyStore\fR¥¯¥é¥¹¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëstatic¥á¥½¥Ã¥É\fIgetDefaultType\fR¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¥¢¥×¥ì¥Ã¥È¤«¤é\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×(\fIkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤Ç»ØÄꤵ¤ì¤¿¥¿¥¤¥×)¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ ++³Æ¥Ä¡¼¥ë¤Ï¡¢\fBkeystore\&.type\fR¤ÎÃͤò¼èÆÀ¤·¡¢¤³¤ÎÃͤǻØÄꤵ¤ì¤¿¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¥×¥í¥Ð¥¤¥À¤¬¸«¤Ä¤«¤ë¤Þ¤Ç¡¢¸½ºß¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥Ð¥¤¥À¤òÄ´¤Ù¤Þ¤¹¡£¤½¤Î¥×¥í¥Ð¥¤¥À¤«¤é¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ·¤Þ¤¹¡£\fBKeyStore\fR¥¯¥é¥¹¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëstatic¥á¥½¥Ã¥É\fBgetDefaultType\fR¤ò»ÈÍѤ¹¤ë¤È¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¥¢¥×¥ì¥Ã¥È¤«¤é\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×(\fBkeystore\&.type\fR¥×¥í¥Ñ¥Æ¥£¤Ç»ØÄꤵ¤ì¤¿¥¿¥¤¥×)¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-KeyStore keyStore = KeyStore\&.getInstance(KeyStore\&.getDefaultType()); ++\fBKeyStore keyStore = KeyStore\&.getInstance(KeyStore\&.getDefaultType());\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï\fIjks\fR¤Ç¡¢¤³¤ì¤ÏOracle¤¬Ä󶡤¹¤ëÆȼ«¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ç¤¹¡£¤³¤ì¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¼¡¤Î¹Ô¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Î¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ï\fBjks\fR¤Ç¡¢¤³¤ì¤ÏOracle¤¬Ä󶡤¹¤ëÆȼ«¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤Ç¤¹¡£¤³¤ì¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¼¡¤Î¹Ô¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keystore\&.type=jks ++\fBkeystore\&.type=jks\fR ++ + .fi + .if n \{\ + .RE + .\} +-³Æ¥Ä¡¼¥ë¤Ç¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¾å¤Î¹Ô¤òÊѹ¹¤·¤ÆÊ̤Υ­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIpkcs12\fR¤È¸Æ¤Ð¤ì¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¡¦¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ë¾ì¹ç¡¢¹Ô¤ò¼¡¤Î¤è¤¦¤ËÊѹ¹¤·¤Þ¤¹¡£ ++³Æ¥Ä¡¼¥ë¤Ç¥Ç¥Õ¥©¥ë¥È°Ê³°¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤ò»ÈÍѤ¹¤ë¤Ë¤Ï¡¢¾å¤Î¹Ô¤òÊѹ¹¤·¤ÆÊ̤Υ­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBpkcs12\fR¤È¸Æ¤Ð¤ì¤ë¥­¡¼¥¹¥È¥¢¤Î¥¿¥¤¥×¤Î¥­¡¼¥¹¥È¥¢¤Î¼ÂÁõ¤òÄ󶡤¹¤ë¥×¥í¥Ð¥¤¥À¡¦¥Ñ¥Ã¥±¡¼¥¸¤¬¤¢¤ë¾ì¹ç¡¢¹Ô¤ò¼¡¤Î¤è¤¦¤ËÊѹ¹¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keystore\&.type=pkcs12 ++\fBkeystore\&.type=pkcs12\fR ++ + .fi + .if n \{\ + .RE +@@ -1242,9 +1262,9 @@ + .sp + ¸ø³«¸°°Å¹æ²½¤Ç¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¸ø³«¸°¤Ë¥¢¥¯¥»¥¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£Â絬ÌϤʥͥåȥ¥¯´Ä¶­¤Ç¤Ï¡¢¸ß¤¤¤ËÄÌ¿®¤·¤Æ¤¤¤ë¥¨¥ó¥Æ¥£¥Æ¥£´Ö¤Ç°ÊÁ°¤Î´Ø·¸¤¬°ú³¤­³ÎΩ¤µ¤ì¤Æ¤¤¤ë¤È²¾Äꤷ¤¿¤ê¡¢»ÈÍѤµ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¸ø³«¸°¤ò¼ý¤á¤¿¿®Íê¤Ç¤­¤ë¥ê¥Ý¥¸¥È¥ê¤¬Â¸ºß¤¹¤ë¤È²¾Äꤷ¤¿¤ê¤¹¤ë¤³¤È¤ÏÉÔ²Äǽ¤Ç¤¹¡£¤³¤Î¤è¤¦¤Ê¸ø³«¸°¤ÎÇÛÉۤ˴ؤ¹¤ëÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¤Ë¾ÚÌÀ½ñ¤¬¹Í°Æ¤µ¤ì¤Þ¤·¤¿¡£¸½ºß¤Ç¤Ï¡¢¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤¬¿®Íê¤Ç¤­¤ëÂè»°¼Ô¤È¤·¤Æµ¡Ç½¤·¤Þ¤¹¡£CA¤Ï¡¢Â¾¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Î¾ÚÌÀ½ñ¤Ë½ð̾¤¹¤ë(ȯ¹Ô¤¹¤ë)¹Ô°Ù¤ò¡¢¿®Íꤷ¤ÆǤ¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥Æ¥£¥Æ¥£(´ë¶È¤Ê¤É)¤Ç¤¹¡£CA¤ÏˡΧ¾å¤Î·ÀÌó¤Ë¹´Â«¤µ¤ì¤ë¤Î¤Ç¡¢Í­¸ú¤«¤Ä¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¤ß¤òºîÀ®¤¹¤ë¤â¤Î¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£VeriSign¡¢Thawte¡¢Entrust¤ò¤Ï¤¸¤á¡¢Â¿¤¯¤Î¸øŪ¤Ê¾ÚÌÀ½ñȯ¹Ô¶É¤¬Â¸ºß¤·¤Þ¤¹¡£ + .sp +-Microsoft¤Îǧ¾Ú¥µ¡¼¥Ð¡¼¡¢Entrust¤ÎCAÀ½Éʤʤɤò½ê°ÁÈ¿¥Æâ¤ÇÍøÍѤ¹¤ì¤Ð¡¢Æȼ«¤Î¾ÚÌÀ½ñȯ¹Ô¶É¤ò±¿±Ä¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÚÌÀ½ñ¤Îɽ¼¨¡¢¥¤¥ó¥Ý¡¼¥È¤ª¤è¤Ó¥¨¥¯¥¹¥Ý¡¼¥È¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++Microsoft¤Îǧ¾Ú¥µ¡¼¥Ð¡¼¡¢Entrust¤ÎCAÀ½Éʤʤɤò½ê°ÁÈ¿¥Æâ¤ÇÍøÍѤ¹¤ì¤Ð¡¢Æȼ«¤Î¾ÚÌÀ½ñȯ¹Ô¶É¤ò±¿±Ä¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¾ÚÌÀ½ñ¤Îɽ¼¨¡¢¥¤¥ó¥Ý¡¼¥È¤ª¤è¤Ó¥¨¥¯¥¹¥Ý¡¼¥È¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤òÀ¸À®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .sp +-¸½ºß¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤ÏX\&.509¾ÚÌÀ½ñ¤òÂоݤˤ·¤Æ¤¤¤Þ¤¹¡£ ++¸½ºß¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤ÏX\&.509¾ÚÌÀ½ñ¤òÂоݤˤ·¤Æ¤¤¤Þ¤¹¡£ + .RE + .PP + X\&.509¾ÚÌÀ½ñ +@@ -1253,13 +1273,13 @@ + .sp + ¤¹¤Ù¤Æ¤ÎX\&.509¾ÚÌÀ½ñ¤Ï¡¢½ð̾¤Î¾¤Ë¼¡¤Î¥Ç¡¼¥¿¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹¡£ + .sp +-\fB¥Ð¡¼¥¸¥ç¥ó\fR: ¾ÚÌÀ½ñ¤ËŬÍѤµ¤ì¤ëX\&.509µ¬³Ê¤Î¥Ð¡¼¥¸¥ç¥ó¤òÆÃÄꤷ¤Þ¤¹¡£¾ÚÌÀ½ñ¤Ë»ØÄê¤Ç¤­¤ë¾ðÊó¤Ï¡¢¥Ð¡¼¥¸¥ç¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£º£¤Î¤È¤³¤í¡¢3¤Ä¤Î¥Ð¡¼¥¸¥ç¥ó¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢v1¡¢v2¡¢v3¤Î¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤ª¤è¤Ó¥¨¥¯¥¹¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£v3¤Î¾ÚÌÀ½ñ¤òÀ¸À®¤·¤Þ¤¹¡£ ++\fB¥Ð¡¼¥¸¥ç¥ó\fR: ¾ÚÌÀ½ñ¤ËŬÍѤµ¤ì¤ëX\&.509µ¬³Ê¤Î¥Ð¡¼¥¸¥ç¥ó¤òÆÃÄꤷ¤Þ¤¹¡£¾ÚÌÀ½ñ¤Ë»ØÄê¤Ç¤­¤ë¾ðÊó¤Ï¡¢¥Ð¡¼¥¸¥ç¥ó¤Ë¤è¤Ã¤Æ°Û¤Ê¤ê¤Þ¤¹¡£º£¤Î¤È¤³¤í¡¢3¤Ä¤Î¥Ð¡¼¥¸¥ç¥ó¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢v1¡¢v2¡¢v3¤Î¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤ª¤è¤Ó¥¨¥¯¥¹¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£v3¤Î¾ÚÌÀ½ñ¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + X\&.509 Version 1¤Ï¡¢1988ǯ¤«¤éÍøÍѤµ¤ì¤Æ¹­¤¯ÉáµÚ¤·¤Æ¤ª¤ê¡¢ºÇ¤â°ìÈÌŪ¤Ç¤¹¡£ + .sp + X\&.509 Version 2¤Ç¤Ï¡¢Subject¤äȯ¹Ô¼Ô¤Î̾Á°¤ò¤¢¤È¤ÇºÆÍøÍѤǤ­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë¡¢Subject¤Èȯ¹Ô¼Ô¤Î°ì°Õ¼±Ê̻ҤγµÇ°¤¬Æ³Æþ¤µ¤ì¤Þ¤·¤¿¡£¤Û¤È¤ó¤É¤Î¾ÚÌÀ½ñ¥×¥í¥Õ¥¡¥¤¥ëʸ½ñ¤Ç¤Ï¡¢Ì¾Á°¤òºÆ»ÈÍѤ·¤Ê¤¤¤³¤È¤È¡¢¾ÚÌÀ½ñ¤Ç°ì°Õ¤Î¼±Ê̻Ҥò»ÈÍѤ·¤Ê¤¤¤³¤È¤¬¡¢¶¯¤¯¿ä¾©¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Version 2¤Î¾ÚÌÀ½ñ¤Ï¡¢¹­¤¯¤Ï»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + .sp +-X\&.509 Version 3¤ÏºÇ¤â¿·¤·¤¤(1996ǯ)µ¬³Ê¤Ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î³µÇ°¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ïï¤Ç¤âÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¾ÚÌÀ½ñ¤Ë´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°ìÈÌŪ¤Ê¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤È¤·¤Æ¤Ï¡¢KeyUsage(\fI½ð̾ÀìÍÑ\fR¤Ê¤É¡¢¸°¤Î»ÈÍѤòÆÃÄê¤ÎÌÜŪ¤ËÀ©¸Â¤¹¤ë)¡¢AlternativeNames(DNS̾¡¢ÅŻҥ᡼¥ë¡¦¥¢¥É¥ì¥¹¡¢IP¥¢¥É¥ì¥¹¤Ê¤É¡¢Â¾¤Î¥¢¥¤¥Ç¥ó¥Æ¥£¥Æ¥£¤ò¸ø³«¸°¤Ë´ØÏ¢ÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤ë)¤Ê¤É¤¬¤¢¤ê¤Þ¤¹¡£¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤Ï¡¢critical¤È¤¤¤¦¥Þ¡¼¥¯¤òÉÕ¤±¤Æ¡¢¤½¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î¥Á¥§¥Ã¥¯¤È»ÈÍѤòµÁ̳¤Å¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢critical¤È¥Þ¡¼¥¯¤µ¤ì¡¢\fIkeyCertSign\fR¤¬ÀßÄꤵ¤ì¤¿KeyUsage¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬¾ÚÌÀ½ñ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤³¤Î¾ÚÌÀ½ñ¤òSSLÄÌ¿®Ãæ¤ËÄ󼨤¹¤ë¤È¡¢¾ÚÌÀ½ñ¤¬µñÈݤµ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¾ÚÌÀ½ñ¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¡¢´ØÏ¢¤¹¤ëÈëÌ©¸°¤¬¾ÚÌÀ½ñ¤Î½ð̾ÀìÍѤȤ·¤Æ»ØÄꤵ¤ì¤Æ¤ª¤ê¡¢SSL¤Ç¤Ï»ÈÍѤǤ­¤Ê¤¤¤¿¤á¤Ç¤¹¡£ ++X\&.509 Version 3¤ÏºÇ¤â¿·¤·¤¤(1996ǯ)µ¬³Ê¤Ç¡¢¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î³µÇ°¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ïï¤Ç¤âÄêµÁ¤¹¤ë¤³¤È¤¬¤Ç¤­¡¢¾ÚÌÀ½ñ¤Ë´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£°ìÈÌŪ¤Ê¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤È¤·¤Æ¤Ï¡¢KeyUsage(\fB½ð̾ÀìÍÑ\fR¤Ê¤É¡¢¸°¤Î»ÈÍѤòÆÃÄê¤ÎÌÜŪ¤ËÀ©¸Â¤¹¤ë)¡¢AlternativeNames(DNS̾¡¢ÅŻҥ᡼¥ë¡¦¥¢¥É¥ì¥¹¡¢IP¥¢¥É¥ì¥¹¤Ê¤É¡¢Â¾¤Î¥¢¥¤¥Ç¥ó¥Æ¥£¥Æ¥£¤ò¸ø³«¸°¤Ë´ØÏ¢ÉÕ¤±¤ë¤³¤È¤¬¤Ç¤­¤ë)¤Ê¤É¤¬¤¢¤ê¤Þ¤¹¡£¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤Ï¡¢critical¤È¤¤¤¦¥Þ¡¼¥¯¤òÉÕ¤±¤Æ¡¢¤½¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Î¥Á¥§¥Ã¥¯¤È»ÈÍѤòµÁ̳¤Å¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢critical¤È¥Þ¡¼¥¯¤µ¤ì¡¢\fBkeyCertSign\fR¤¬ÀßÄꤵ¤ì¤¿KeyUsage¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤¬¾ÚÌÀ½ñ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¤³¤Î¾ÚÌÀ½ñ¤òSSLÄÌ¿®Ãæ¤ËÄ󼨤¹¤ë¤È¡¢¾ÚÌÀ½ñ¤¬µñÈݤµ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¾ÚÌÀ½ñ¤Î¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤Ë¤è¤Ã¤Æ¡¢´ØÏ¢¤¹¤ëÈëÌ©¸°¤¬¾ÚÌÀ½ñ¤Î½ð̾ÀìÍѤȤ·¤Æ»ØÄꤵ¤ì¤Æ¤ª¤ê¡¢SSL¤Ç¤Ï»ÈÍѤǤ­¤Ê¤¤¤¿¤á¤Ç¤¹¡£ + .sp + \fB¥·¥ê¥¢¥ëÈÖ¹æ\fR: ¾ÚÌÀ½ñ¤òºîÀ®¤·¤¿¥¨¥ó¥Æ¥£¥Æ¥£¤Ï¡¢¤½¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤¬È¯¹Ô¤¹¤ë¾¤Î¾ÚÌÀ½ñ¤È¶èÊ̤¹¤ë¤¿¤á¤Ë¡¢¾ÚÌÀ½ñ¤Ë¥·¥ê¥¢¥ëÈÖ¹æ¤ò³ä¤êÅö¤Æ¤Þ¤¹¡£¤³¤Î¾ðÊó¤Ï¡¢ÍÍ¡¹¤ÊÊýË¡¤Ç»ÈÍѤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬¼è¤ê¾Ã¤µ¤ì¤ë¤È¡¢¥·¥ê¥¢¥ëÈֹ椬¾ÚÌÀ½ñ¼º¸ú¥ê¥¹¥È(CRL)¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£ + .sp +@@ -1275,7 +1295,8 @@ + .RS 4 + .\} + .nf +-CN=Java Duke, OU=Java Software Division, O=Oracle Corporation, C=US ++\fBCN=Java Duke, OU=Java Software Division, O=Oracle Corporation, C=US\fR ++ + .fi + .if n \{\ + .RE +@@ -1287,51 +1308,52 @@ + .PP + ¾ÚÌÀ½ñ¥Á¥§¡¼¥ó + .RS 4 +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÈëÌ©¸°¤ª¤è¤Ó´ØÏ¢¤¹¤ë¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò´Þ¤à¥­¡¼¥¹¥È¥¢¤Î¸°¥¨¥ó¥È¥ê¤òºîÀ®¤·¡¢´ÉÍý¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥¨¥ó¥È¥ê¤Ç¤Ï¡¢ÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤Ï¡¢¥Á¥§¡¼¥ó¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢ÈëÌ©¸°¤ª¤è¤Ó´ØÏ¢¤¹¤ë¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò´Þ¤à¥­¡¼¥¹¥È¥¢¤Î¸°¥¨¥ó¥È¥ê¤òºîÀ®¤·¡¢´ÉÍý¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤Î¤è¤¦¤Ê¥¨¥ó¥È¥ê¤Ç¤Ï¡¢ÈëÌ©¸°¤ËÂбþ¤¹¤ë¸ø³«¸°¤Ï¡¢¥Á¥§¡¼¥ó¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ + .sp +-¸°¤ò½é¤á¤ÆºîÀ®¤¹¤ë¤È¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤È¤¤¤¦1¤Ä¤ÎÍ×ÁǤΤߤò´Þ¤à¥Á¥§¡¼¥ó¤¬³«»Ï¤µ¤ì¤Þ¤¹¡£\fI¤Î\fR\-genkeypair¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ïȯ¹Ô¼Ô(½ð̾¼Ô)¤¬¼çÂΤÈƱ¤¸¤Ç¤¹¡£¼çÂΤϡ¢¤½¤Î¸ø³«¸°¤¬¾ÚÌÀ½ñ¤Ë¤è¤Ã¤Æǧ¾Ú¤µ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Ç¤¹¡£\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤·¤Æ¿·¤·¤¤¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤òºîÀ®¤¹¤ë¤È¡¢¸ø³«¸°¤Ï¾ï¤Ë¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤µ¤ì¤Þ¤¹¡£ ++¸°¤ò½é¤á¤ÆºîÀ®¤¹¤ë¤È¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤È¤¤¤¦1¤Ä¤ÎÍ×ÁǤΤߤò´Þ¤à¥Á¥§¡¼¥ó¤¬³«»Ï¤µ¤ì¤Þ¤¹¡£¥³¥Þ¥ó¥É¤Î\fB\-genkeypair\fR¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ïȯ¹Ô¼Ô(½ð̾¼Ô)¤¬¼çÂΤÈƱ¤¸¤Ç¤¹¡£¼çÂΤϡ¢¤½¤Î¸ø³«¸°¤¬¾ÚÌÀ½ñ¤Ë¤è¤Ã¤Æǧ¾Ú¤µ¤ì¤ë¥¨¥ó¥Æ¥£¥Æ¥£¤Ç¤¹¡£\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤·¤Æ¿·¤·¤¤¸ø³«¸°¤ÈÈëÌ©¸°¤Î¥Ú¥¢¤òºîÀ®¤¹¤ë¤È¡¢¸ø³«¸°¤Ï¾ï¤Ë¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¥é¥Ã¥×¤µ¤ì¤Þ¤¹¡£ + .sp +-¤³¤Î¸å¡¢¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È(CSR)¤¬\fI\-certreq\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¤Æ¡¢CSR¤¬¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤ËÁ÷¿®¤µ¤ì¤ë¤È¡¢CA¤«¤é¤Î¥ì¥¹¥Ý¥ó¥¹¤¬\fI\-importcert\fR¤Ç¥¤¥ó¥Ý¡¼¥È¤µ¤ì¡¢¸µ¤Î¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤è¤Ã¤ÆÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£¥³¥Þ¥ó¥É¤Î\fI\-certreq\fR¤ª¤è¤Ó\fI\-importcert\fR¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¥Á¥§¡¼¥ó¤ÎºÇ¸å¤Ë¤¢¤ë¤Î¤Ï¡¢Subject¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿CA¤¬È¯¹Ô¤·¤¿¾ÚÌÀ½ñ(±þÅú)¤Ç¤¹¡£¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î¾ÚÌÀ½ñ¤Ï¡¢CA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ç¤¹¡£ ++¤³¤Î¸å¡¢¾ÚÌÀ½ñ½ð̾¥ê¥¯¥¨¥¹¥È(CSR)¤¬\fB\-certreq\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¤Æ¡¢CSR¤¬¾ÚÌÀ½ñȯ¹Ô¶É(CA)¤ËÁ÷¿®¤µ¤ì¤ë¤È¡¢CA¤«¤é¤Î¥ì¥¹¥Ý¥ó¥¹¤¬\fB\-importcert\fR¤Ç¥¤¥ó¥Ý¡¼¥È¤µ¤ì¡¢¸µ¤Î¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ï¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Ë¤è¤Ã¤ÆÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£\fB¤Î\fR\-certreq\fB¤ª¤è¤Ó\fR\-importcert¥³¥Þ¥ó¥É¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¥Á¥§¡¼¥ó¤ÎºÇ¸å¤Ë¤¢¤ë¤Î¤Ï¡¢Subject¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿CA¤¬È¯¹Ô¤·¤¿¾ÚÌÀ½ñ(±þÅú)¤Ç¤¹¡£¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î¾ÚÌÀ½ñ¤Ï¡¢CA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ç¤¹¡£ + .sp + CA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ï¡¢Â¿¤¯¤Î¾ì¹ç¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ(¤Ä¤Þ¤êCA¤¬¼«¿È¤Î¸ø³«¸°¤òǧ¾Ú¤·¤¿¾ÚÌÀ½ñ)¤Ç¤¢¤ê¡¢¤³¤ì¤Ï¥Á¥§¡¼¥ó¤ÎºÇ½é¤Î¾ÚÌÀ½ñ¤Ë¤Ê¤ê¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢CA¤¬¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤òÊÖ¤¹¤³¤È¤â¤¢¤ê¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ¸å¤Î¾ÚÌÀ½ñ(CA¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¡¢¸°¥¨¥ó¥È¥ê¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ)¤ËÊѤï¤ê¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î¾ÚÌÀ½ñ¤Ï¡¢CSR¤ÎÁ÷¿®Àè¤ÎCA¤È¤ÏÊ̤ÎCA¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¡¢CSR¤ÎÁ÷¿®Àè¤ÎCA¤Î¸ø³«¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ë¤Ê¤ê¤Þ¤¹¡£¥Á¥§¡¼¥óÆâ¤Î¤½¤ÎÁ°¤Î¾ÚÌÀ½ñ¤Ï¡¢¼¡¤ÎCA¤Î¸°¤òǧ¾Ú¤¹¤ë¾ÚÌÀ½ñ¤Ë¤Ê¤ê¤Þ¤¹¡£°Ê²¼Æ±Íͤˡ¢¼«¸Ê½ð̾¤µ¤ì¤¿¡Ö¥ë¡¼¥È¡×¾ÚÌÀ½ñ¤Ë㤹¤ë¤Þ¤Ç¥Á¥§¡¼¥ó¤¬Â³¤­¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥Á¥§¡¼¥óÆâ¤Î(ºÇ½é¤Î¾ÚÌÀ½ñ°Ê¸å¤Î)³Æ¾ÚÌÀ½ñ¤Ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤Î¼¡¤Î¾ÚÌÀ½ñ¤Î½ð̾¼Ô¤Î¸ø³«¸°¤¬Ç§¾Ú¤µ¤ì¤Æ¤¤¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .sp + ¿¤¯¤ÎCA¤Ï¡¢¥Á¥§¡¼¥ó¤ò¥µ¥Ý¡¼¥È¤»¤º¤Ëȯ¹ÔºÑ¤Î¾ÚÌÀ½ñ¤Î¤ß¤òÊÖ¤·¤Þ¤¹¡£Æäˡ¢Ãæ´Ö¤ÎCA¤¬Â¸ºß¤·¤Ê¤¤¥Õ¥é¥Ã¥È¤Ê³¬Áع½Â¤¤Î¾ì¹ç¤Ï¡¢¤½¤Î·¹¸þ¤¬¸²Ãø¤Ç¤¹¡£¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ï¡¢¥­¡¼¥¹¥È¥¢¤Ë¤¹¤Ç¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¾ðÊ󤫤顢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò³ÎΩ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp +-Ê̤αþÅú·Á¼°(PKCS#7¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë·Á¼°)¤Ç¤Ï¡¢È¯¹ÔºÑ¾ÚÌÀ½ñ¤Ë²Ã¤¨¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¥µ¥Ý¡¼¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤É¤Á¤é¤Î±þÅú·Á¼°¤â°·¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++Ê̤αþÅú·Á¼°(PKCS#7¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë·Á¼°)¤Ç¤Ï¡¢È¯¹ÔºÑ¾ÚÌÀ½ñ¤Ë²Ã¤¨¡¢¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Î¥µ¥Ý¡¼¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤É¤Á¤é¤Î±þÅú·Á¼°¤â°·¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-¥È¥Ã¥×¥ì¥Ù¥ë(¥ë¡¼¥È)CA¤Î¾ÚÌÀ½ñ¤Ï¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¤¹¡£¤¿¤À¤·¡¢¥ë¡¼¥È¤Î¸ø³«¸°¤Ø¤Î¿®Íê¤Ï¡¢¥ë¡¼¥È¾ÚÌÀ½ñ¼«ÂΤ«¤é¤Ç¤Ï¤Ê¤¯¡¢¿·Ê¹¤Ê¤É¾¤Î¥½¡¼¥¹¤«¤é¼èÆÀ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢VeriSign¥ë¡¼¥ÈCA¤Ê¤É¤Î¼±ÊÌ̾¤ò»ÈÍѤ·¤Æ¡¢Ã¯¤Ç¤â¼«¸Ê½ð̾·¿¾ÚÌÀ½ñ¤òÀ¸À®¤Ç¤­¤ë¤¿¤á¤Ç¤¹¡£¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤Ï¹­¤¯ÃΤé¤ì¤Æ¤¤¤Þ¤¹¡£¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤ò¾ÚÌÀ½ñ¤Ë³ÊǼ¤¹¤ëÍýͳ¤Ï¡¢¾ÚÌÀ½ñ¤È¤¤¤¦·Á¼°¤Ë¤¹¤ë¤³¤È¤Ç¿¤¯¤Î¥Ä¡¼¥ë¤«¤éÍøÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ë¤«¤é¤Ë¤¹¤®¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢¾ÚÌÀ½ñ¤Ï¡¢¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤ò±¿¤Ö¡ÖÇÞÂΡפȤ·¤ÆÍøÍѤµ¤ì¤ë¤Î¤ß¤Ç¤¹¡£¥ë¡¼¥ÈCA¤Î¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤ËÄɲ乤ë¤È¤­¤Ï¡¢\fI\-printcert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¤½¤ÎÁ°¤Ë¾ÚÌÀ½ñ¤ÎÆâÍƤòɽ¼¨¤·¡¢É½¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¿·Ê¹¤ä¥ë¡¼¥ÈCA¤ÎWeb¥Ú¡¼¥¸¤Ê¤É¤«¤éÆþ¼ê¤·¤¿´ûÃΤΥե£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥È¥Ã¥×¥ì¥Ù¥ë(¥ë¡¼¥È)CA¤Î¾ÚÌÀ½ñ¤Ï¡¢¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ç¤¹¡£¤¿¤À¤·¡¢¥ë¡¼¥È¤Î¸ø³«¸°¤Ø¤Î¿®Íê¤Ï¡¢¥ë¡¼¥È¾ÚÌÀ½ñ¼«ÂΤ«¤é¤Ç¤Ï¤Ê¤¯¡¢¿·Ê¹¤Ê¤É¾¤Î¥½¡¼¥¹¤«¤é¼èÆÀ¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢VeriSign¥ë¡¼¥ÈCA¤Ê¤É¤Î¼±ÊÌ̾¤ò»ÈÍѤ·¤Æ¡¢Ã¯¤Ç¤â¼«¸Ê½ð̾·¿¾ÚÌÀ½ñ¤òÀ¸À®¤Ç¤­¤ë¤¿¤á¤Ç¤¹¡£¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤Ï¹­¤¯ÃΤé¤ì¤Æ¤¤¤Þ¤¹¡£¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤ò¾ÚÌÀ½ñ¤Ë³ÊǼ¤¹¤ëÍýͳ¤Ï¡¢¾ÚÌÀ½ñ¤È¤¤¤¦·Á¼°¤Ë¤¹¤ë¤³¤È¤Ç¿¤¯¤Î¥Ä¡¼¥ë¤«¤éÍøÍѤǤ­¤ë¤è¤¦¤Ë¤Ê¤ë¤«¤é¤Ë¤¹¤®¤Þ¤»¤ó¡£¤Ä¤Þ¤ê¡¢¾ÚÌÀ½ñ¤Ï¡¢¥ë¡¼¥ÈCA¤Î¸ø³«¸°¤ò±¿¤Ö¡ÖÇÞÂΡפȤ·¤ÆÍøÍѤµ¤ì¤ë¤Î¤ß¤Ç¤¹¡£¥ë¡¼¥ÈCA¤Î¾ÚÌÀ½ñ¤ò¥­¡¼¥¹¥È¥¢¤ËÄɲ乤ë¤È¤­¤Ï¡¢\fB\-printcert\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢¤½¤ÎÁ°¤Ë¾ÚÌÀ½ñ¤ÎÆâÍƤòɽ¼¨¤·¡¢É½¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¿·Ê¹¤ä¥ë¡¼¥ÈCA¤ÎWeb¥Ú¡¼¥¸¤Ê¤É¤«¤éÆþ¼ê¤·¤¿´ûÃΤΥե£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + cacerts¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë + .RS 4 +-\fIcacerts\fR¤È¤¤¤¦Ì¾Á°¤Î¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë¤Ï¡¢Windows¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fIjava\&.home\elib\esecurity\fR¡¢Oracle Solaris¤Ç¤Ï\fIjava\&.home/lib/security\fR¤ËÃÖ¤«¤ì¤Æ¤¤¤Þ¤¹¡£\fIjava\&.home\fR¤Ï¡¢¼Â¹Ô´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê(SDK¤Î\fIjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤ÏJRE¤ÎºÇ¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê)¤Ç¤¹¡£ ++\fBcacerts\fR¤È¤¤¤¦Ì¾Á°¤Î¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë¤Ï¡¢Windows¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥×¥í¥Ñ¥Æ¥£¡¦¥Ç¥£¥ì¥¯¥È¥ê\fBjava\&.home\elib\esecurity\fR¡¢Oracle Solaris¤Ç¤Ï\fBjava\&.home/lib/security\fR¤ËÃÖ¤«¤ì¤Æ¤¤¤Þ¤¹¡£\fBjava\&.home\fR¤Ï¡¢¼Â¹Ô´Ä¶­¤Î¥Ç¥£¥ì¥¯¥È¥ê(SDK¤Î\fBjre\fR¥Ç¥£¥ì¥¯¥È¥ê¤Þ¤¿¤ÏJRE¤ÎºÇ¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê)¤Ç¤¹¡£ + .sp +-\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Ï¡¢CA¤Î¾ÚÌÀ½ñ¤ò´Þ¤à¡¢¥·¥¹¥Æ¥àÁ´ÂΤΥ­¡¼¥¹¥È¥¢¤Ç¤¹¡£¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¡¢¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ë\fIjks\fR¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤Î¹½À®¤È´ÉÍý¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥»¥Ã¥È¤ò´Þ¤ó¤À¾õÂ֤ǽв٤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¾ÚÌÀ½ñ¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Ï¡¢CA¤Î¾ÚÌÀ½ñ¤ò´Þ¤à¡¢¥·¥¹¥Æ¥àÁ´ÂΤΥ­¡¼¥¹¥È¥¢¤Ç¤¹¡£¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¡¢¥­¡¼¥¹¥È¥¢¡¦¥¿¥¤¥×¤Ë\fBjks\fR¤ò»ØÄꤹ¤ë¤³¤È¤Ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¤³¤Î¥Õ¥¡¥¤¥ë¤Î¹½À®¤È´ÉÍý¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥»¥Ã¥È¤ò´Þ¤ó¤À¾õÂ֤ǽв٤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¾ÚÌÀ½ñ¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-keytool \-list \-keystore java\&.home/lib/security/cacerts ++\fBkeytool \-list \-keystore java\&.home/lib/security/cacerts\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Î½é´ü¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢\fIchangeit\fR¤Ç¤¹¡£¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¡¢SDK¤Î¥¤¥ó¥¹¥È¡¼¥ë¸å¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¥ï¡¼¥É¤È¥Ç¥Õ¥©¥ë¥È¡¦¥¢¥¯¥»¥¹¸¢¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Î½é´ü¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢\fBchangeit\fR¤Ç¤¹¡£¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¡¢SDK¤Î¥¤¥ó¥¹¥È¡¼¥ë¸å¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¹¥ï¡¼¥É¤È¥Ç¥Õ¥©¥ë¥È¡¦¥¢¥¯¥»¥¹¸¢¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR +-\fIcacerts\fR¥Õ¥¡¥¤¥ë¤ò³Îǧ¤¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£\fIcacerts\fR¥Õ¥¡¥¤¥ëÆâ¤ÎCA¤Ï¡¢½ð̾¤ª¤è¤Ó¾¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ø¤Î¾ÚÌÀ½ñȯ¹Ô¤Î¤¿¤á¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤È¤·¤Æ¿®Íꤵ¤ì¤ë¤¿¤á¡¢\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Î´ÉÍý¤Ï¿µ½Å¤Ë¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¿®Íꤹ¤ëCA¤Î¾ÚÌÀ½ñ¤Î¤ß¤¬´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢¼«¿È¤ÎÀÕǤ¤Ë¤ª¤¤¤Æ¡¢\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤Æ¤¤¤ë¿®Íê¤Ç¤­¤ë¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò¸¡¾Ú¤·¡¢¿®ÍêÀ­¤Ë´Ø¤¹¤ëÆȼ«¤Î·èÄê¤ò¹Ô¤¤¤Þ¤¹¡£ ++\fBcacerts\fR¥Õ¥¡¥¤¥ë¤ò³Îǧ¤¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£\fBcacerts\fR¥Õ¥¡¥¤¥ëÆâ¤ÎCA¤Ï¡¢½ð̾¤ª¤è¤Ó¾¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤Ø¤Î¾ÚÌÀ½ñȯ¹Ô¤Î¤¿¤á¤Î¥¨¥ó¥Æ¥£¥Æ¥£¤È¤·¤Æ¿®Íꤵ¤ì¤ë¤¿¤á¡¢\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Î´ÉÍý¤Ï¿µ½Å¤Ë¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¿®Íꤹ¤ëCA¤Î¾ÚÌÀ½ñ¤Î¤ß¤¬´Þ¤Þ¤ì¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢¼«¿È¤ÎÀÕǤ¤Ë¤ª¤¤¤Æ¡¢\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Ë¥Ð¥ó¥É¥ë¤µ¤ì¤Æ¤¤¤ë¿®Íê¤Ç¤­¤ë¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò¸¡¾Ú¤·¡¢¿®ÍêÀ­¤Ë´Ø¤¹¤ëÆȼ«¤Î·èÄê¤ò¹Ô¤¤¤Þ¤¹¡£ + .sp +-¿®Íê¤Ç¤­¤Ê¤¤CA¾ÚÌÀ½ñ¤ò\fIcacerts\fR¥Õ¥¡¥¤¥ë¤«¤éºï½ü¤¹¤ë¤Ë¤Ï¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Î\fIdelete\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fIcacerts\fR¥Õ¥¡¥¤¥ë¤ÏJRE¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤òÊÔ½¸¤¹¤ë¥¢¥¯¥»¥¹¸¢¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à´ÉÍý¼Ô¤ËÏ¢Íí¤·¤Æ¤¯¤À¤µ¤¤ ++¿®Íê¤Ç¤­¤Ê¤¤CA¾ÚÌÀ½ñ¤ò\fBcacerts\fR¥Õ¥¡¥¤¥ë¤«¤éºï½ü¤¹¤ë¤Ë¤Ï¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Î\fBdelete\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£\fBcacerts\fR¥Õ¥¡¥¤¥ë¤ÏJRE¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£¤³¤Î¥Õ¥¡¥¤¥ë¤òÊÔ½¸¤¹¤ë¥¢¥¯¥»¥¹¸¢¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥·¥¹¥Æ¥à´ÉÍý¼Ô¤ËÏ¢Íí¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + ¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421¾ÚÌÀ½ñÉä¹æ²½µ¬³Ê + .RS 4 + ¿¤¯¤Î¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï¡¢¥Ð¥¤¥Ê¥êÉä¹æ²½¤Ç¤Ï¤Ê¤¯¡¢¥¤¥ó¥¿¡¼¥Í¥Ã¥ÈRFC 1421µ¬³Ê¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë½ÐÎϲÄǽÉä¹æ²½Êý¼°¤ò»ÈÍѤ·¤Æ³ÊǼ¤µ¤ì¤Þ¤¹¡£Base 64Éä¹æ²½¤È¤â¸Æ¤Ð¤ì¤ë¤³¤Î¾ÚÌÀ½ñ·Á¼°¤Ç¤Ï¡¢ÅŻҥ᡼¥ë¤ä¤½¤Î¾¤Îµ¡¹½¤òÄ̤¸¤Æ¡¢Â¾¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¾ÚÌÀ½ñ¤òÍưפ˥¨¥¯¥¹¥Ý¡¼¥È¤Ç¤­¤Þ¤¹¡£ + .sp +-\fI\-importcert\fR¤È\fI\-printcert\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤Î·Á¼°¤Î¾ÚÌÀ½ñ¤È¥Ð¥¤¥Ê¥êÉä¹æ²½¤Î¾ÚÌÀ½ñ¤òÆɤ߹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fI\-exportcert\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¥Ð¥¤¥Ê¥êÉä¹æ²½¤Î¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Î¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-importcert\fR¤È\fB\-printcert\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤Î·Á¼°¤Î¾ÚÌÀ½ñ¤È¥Ð¥¤¥Ê¥êÉä¹æ²½¤Î¾ÚÌÀ½ñ¤òÆɤ߹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\fB\-exportcert\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¥Ð¥¤¥Ê¥êÉä¹æ²½¤Î¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£¤¿¤À¤·¡¢\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Î¾ÚÌÀ½ñ¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp +-\fI\-list\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¾ÚÌÀ½ñ¤ÎSHA1¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-v\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï¿Í¤¬Íý²ò¤Ç¤­¤ë·Á¼°¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£\fI\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£ ++\fB\-list\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¾ÚÌÀ½ñ¤ÎSHA1¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-v\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï¿Í¤¬Íý²ò¤Ç¤­¤ë·Á¼°¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£\fB\-rfc\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¾ÚÌÀ½ñ¤Ï½ÐÎϲÄǽÉä¹æ²½Êý¼°¤Ç½ÐÎϤµ¤ì¤Þ¤¹¡£ + .sp + ½ÐÎϲÄǽÉä¹æ²½Êý¼°¤ÇÉä¹æ²½¤µ¤ì¤¿¾ÚÌÀ½ñ¤Ï¡¢¼¡¤Î¥Æ¥­¥¹¥È¤Ç»Ï¤Þ¤ê¡¢¼¡¤Î¥Æ¥­¥¹¥È¤Ç½ªÎ»¤·¤Þ¤¹¡£ + .sp +@@ -1339,11 +1361,12 @@ + .RS 4 + .\} + .nf +-\-\-\-\-\-BEGIN CERTIFICATE\-\-\-\-\- +- +-encoded certificate goes here\&. +- +-\-\-\-\-\-END CERTIFICATE\-\-\-\-\- ++\fB\-\-\-\-\-BEGIN CERTIFICATE\-\-\-\-\-\fR ++ ++\fBencoded certificate goes here\&. \fR ++ ++\fB\-\-\-\-\-END CERTIFICATE\-\-\-\-\-\fR ++ + .fi + .if n \{\ + .RE +@@ -1352,7 +1375,7 @@ + .PP + X\&.500¼±ÊÌ̾ + .RS 4 +-X\&.500¼±ÊÌ̾¤Ï¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤òÆÃÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢X\&.509¾ÚÌÀ½ñ¤Î\fIsubject\fR¥Õ¥£¡¼¥ë¥É¤È\fIissuer\fR(½ð̾¼Ô)¥Õ¥£¡¼¥ë¥É¤Ç»ØÄꤵ¤ì¤ë̾Á°¤Ï¡¢X\&.500¼±ÊÌ̾¤Ç¤¹¡£\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥µ¥Ö¥Ñ¡¼¥È¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ ++X\&.500¼±ÊÌ̾¤Ï¡¢¥¨¥ó¥Æ¥£¥Æ¥£¤òÆÃÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢X\&.509¾ÚÌÀ½ñ¤Î\fBsubject\fR¥Õ¥£¡¼¥ë¥É¤È\fBissuer\fR(½ð̾¼Ô)¥Õ¥£¡¼¥ë¥É¤Ç»ØÄꤵ¤ì¤ë̾Á°¤Ï¡¢X\&.500¼±ÊÌ̾¤Ç¤¹¡£\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤Î¥µ¥Ö¥Ñ¡¼¥È¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£ + .sp + \fBcommonName\fR: Susan Jones¤Ê¤É¡¢¿Í¤ÎÄ̾Ρ£ + .sp +@@ -1364,13 +1387,14 @@ + .sp + \fBcountry\fR: 2ʸ»ú¤Î¹ñ¥³¡¼¥É¡£CH¤Ê¤É¡£ + .sp +-¼±ÊÌ̾ʸ»úÎó¤ò\fI\-dname\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤȤ·¤Æ»ØÄꤹ¤ë¾ì¹ç(¤¿¤È¤¨¤Ð\fI\-genkeypair\fR¥³¥Þ¥ó¥É¤Ë)¡¢Ê¸»úÎó¤Ï¼¡¤Î·Á¼°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¼±ÊÌ̾ʸ»úÎó¤ò\fB\-dname\fR¥ª¥×¥·¥ç¥ó¤ÎÃͤȤ·¤Æ»ØÄꤹ¤ë¾ì¹ç(¤¿¤È¤¨¤Ð\fB\-genkeypair\fR¥³¥Þ¥ó¥É¤Ë)¡¢Ê¸»úÎó¤Ï¼¡¤Î·Á¼°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-CN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode ++\fBCN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode\fR ++ + .fi + .if n \{\ + .RE +@@ -1381,12 +1405,13 @@ + .RS 4 + .\} + .nf +-CN=commonName +-OU=organizationUnit +-O=organizationName +-L=localityName +-S=stateName +-C=country ++\fBCN=commonName\fR ++\fBOU=organizationUnit\fR ++\fBO=organizationName\fR ++\fBL=localityName\fR ++\fBS=stateName\fR ++\fBC=country\fR ++ + .fi + .if n \{\ + .RE +@@ -1397,7 +1422,8 @@ + .RS 4 + .\} + .nf +-CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino, S=California, C=US ++\fBCN=Mark Smith, OU=Java, O=Oracle, L=Cupertino, S=California, C=US\fR ++ + .fi + .if n \{\ + .RE +@@ -1408,8 +1434,9 @@ + .RS 4 + .\} + .nf +-keytool \-genkeypair \-dname "CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino, +-S=California, C=US" \-alias mark ++\fBkeytool \-genkeypair \-dname "CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino,\fR ++\fBS=California, C=US" \-alias mark\fR ++ + .fi + .if n \{\ + .RE +@@ -1422,66 +1449,73 @@ + .RS 4 + .\} + .nf +-CN=Steve Meier, OU=Java, O=Oracle, C=US ++\fBCN=Steve Meier, OU=Java, O=Oracle, C=US\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼±ÊÌ̾ʸ»úÎó¤ÎÃͤ˥«¥ó¥Þ¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Çʸ»úÎó¤ò»ØÄꤹ¤ë¤È¤­¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¥«¥ó¥Þ¤ò¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥åʸ»ú(\e)¤Ç¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¼±ÊÌ̾ʸ»úÎó¤ÎÃͤ˥«¥ó¥Þ¤¬´Þ¤Þ¤ì¤ë¾ì¹ç¤Ë¡¢¥³¥Þ¥ó¥É¹Ô¤Çʸ»úÎó¤ò»ØÄꤹ¤ë¤È¤­¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤Ë¥«¥ó¥Þ¤ò¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥åʸ»ú(\e)¤Ç¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-cn=Peter Schuster, ou=Java\e, Product Development, o=Oracle, c=US ++\fBcn=Peter Schuster, ou=Java\e, Product Development, o=Oracle, c=US\fR ++ + .fi + .if n \{\ + .RE + .\} +-¼±ÊÌ̾ʸ»úÎó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¼±ÊÌ̾¤òɬÍפȤ¹¤ë¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¼±ÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢³Æ¥µ¥Ö¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¥«¥ó¥Þ¤ò¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\e)¤Ç¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ ++¼±ÊÌ̾ʸ»úÎó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¼±ÊÌ̾¤òɬÍפȤ¹¤ë¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥³¥Þ¥ó¥É¹Ô¤Ç¼±ÊÌ̾¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢³Æ¥µ¥Ö¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¥«¥ó¥Þ¤ò¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å(\e)¤Ç¥¨¥¹¥±¡¼¥×¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£ + .RE + .SH "·Ù¹ð" + .SS "¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È·Ù¹ð" + .PP + \fB½ÅÍ×\fR: ¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ëÁ°¤Ë¡¢¾ÚÌÀ½ñ¤ÎÆâÍƤò¿µ½Å¤ËÄ´¤Ù¤Æ¤¯¤À¤µ¤¤¡£ +-Windows¤ÎÎã:.PP +-¤Þ¤º¡¢\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fI\-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fI\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¾ÚÌÀ½ñ¤òɽ¼¨¤·¤Þ¤¹¡£É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬¡¢´üÂÔ¤µ¤ì¤ë¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬Á÷¤é¤ì¤Æ¤­¤Æ¡¢¤³¤Î¾ÚÌÀ½ñ¤ò\fI\etmp\ecert\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¤³¤Î¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fI\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ ++.PP ++Windows¤ÎÎã: ++.PP ++¤Þ¤º¡¢\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fB\-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fB\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¾ÚÌÀ½ñ¤òɽ¼¨¤·¤Þ¤¹¡£É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬¡¢´üÂÔ¤µ¤ì¤ë¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¾ÚÌÀ½ñ¤¬Á÷¤é¤ì¤Æ¤­¤Æ¡¢¤³¤Î¾ÚÌÀ½ñ¤ò\fB\etmp\ecert\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¤³¤Î¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fB\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- keytool \-printcert \-file \etmp\ecert +- Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll +- Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll +- Serial Number: 59092b34 +- Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997 +- Certificate Fingerprints: +- MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F +- SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE +- SHA256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90: +- 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4 ++\fB keytool \-printcert \-file \etmp\ecert\fR ++\fB Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll\fR ++\fB Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll\fR ++\fB Serial Number: 59092b34\fR ++\fB Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997\fR ++\fB Certificate Fingerprints:\fR ++\fB MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F\fR ++\fB SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE\fR ++\fB SHA256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90:\fR ++\fB 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4\fR + .fi + .if n \{\ + .RE + .\} +-Oracle Solaris¤ÎÎã:.PP +-¤Þ¤º¡¢\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fI\-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fI\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¾ÚÌÀ½ñ¤òɽ¼¨¤·¤Þ¤¹¡£É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬¡¢´üÂÔ¤µ¤ì¤ë¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤¢¤ë¥æ¡¼¥¶¡¼¤«¤é¾ÚÌÀ½ñ¤¬Á÷¤é¤ì¤Æ¤­¤Æ¡¢¤³¤Î¾ÚÌÀ½ñ¤ò\fI/tmp/cert\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¤³¤Î¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fI\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ ++.PP ++Oracle Solaris¤ÎÎã: ++.PP ++¤Þ¤º¡¢\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fB\-printcert\fR¥³¥Þ¥ó¥É¤Þ¤¿¤Ï\fB\-importcert\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¾ÚÌÀ½ñ¤òɽ¼¨¤·¤Þ¤¹¡£É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬¡¢´üÂÔ¤µ¤ì¤ë¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È°ìÃפ¹¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¤¢¤ë¥æ¡¼¥¶¡¼¤«¤é¾ÚÌÀ½ñ¤¬Á÷¤é¤ì¤Æ¤­¤Æ¡¢¤³¤Î¾ÚÌÀ½ñ¤ò\fB/tmp/cert\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤·¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¤³¤Î¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fB\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Æ¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤òɽ¼¨¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- keytool \-printcert \-file /tmp/cert +- Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll +- Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll +- Serial Number: 59092b34 +- Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997 +- Certificate Fingerprints: +- MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F +- SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE +- SHA256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90: +- 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4 ++\fB keytool \-printcert \-file /tmp/cert\fR ++\fB Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll\fR ++\fB Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll\fR ++\fB Serial Number: 59092b34\fR ++\fB Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997\fR ++\fB Certificate Fingerprints:\fR ++\fB MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F\fR ++\fB SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE\fR ++\fB SHA256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90:\fR ++\fB 17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4\fR ++ + .fi + .if n \{\ + .RE +@@ -1490,27 +1524,27 @@ + ¼¡¤Ë¡¢¾ÚÌÀ½ñ¤òÁ÷¿®¤·¤¿¿Íʪ¤ËÏ¢Íí¤·¡¢¤³¤Î¿Íʪ¤¬Ä󼨤·¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢¾å¤Î¥³¥Þ¥ó¥É¤Çɽ¼¨¤µ¤ì¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤¬°ìÃפ¹¤ì¤Ð¡¢Á÷¿®ÅÓÃæ¤Ç¾¤Î²¿¼Ô¤«(¹¶·â¼Ô¤Ê¤É)¤Ë¤è¤ë¾ÚÌÀ½ñ¤Î¤¹¤êÂؤ¨¤¬¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤ò³Îǧ¤Ç¤­¤Þ¤¹¡£Á÷¿®ÅÓÃæ¤Ç¤³¤Î¼ï¤Î¹¶·â¤¬¹Ô¤ï¤ì¤Æ¤¤¤¿¾ì¹ç¡¢¥Á¥§¥Ã¥¯¤ò¹Ô¤ï¤º¤Ë¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¡¢¹¶·â¼Ô¤Ë¤è¤Ã¤Æ½ð̾¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¤â¤Î(¹¶·âŪ°Õ¿Þ¤ò»ý¤Ä¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤ò´Þ¤ó¤ÀJAR¥Õ¥¡¥¤¥ë¤Ê¤É)¤ò¿®Íꤹ¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ + .PP + \fBÃí°Õ:\fR +-¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ëÁ°¤Ë\fI\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¥­¡¼¥¹¥È¥¢Æâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fI\-importcert\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¾ÚÌÀ½ñ¤Î¾ðÊó¤¬É½¼¨¤µ¤ì¡¢³Îǧ¤òµá¤á¤ë¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤ë¤¿¤á¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤Ï¥¤¥ó¥Ý¡¼¥ÈÁàºî¤òÄä»ß¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤ì¤ò¼Â¹Ô¤Ç¤­¤ë¤Î¤Ï¡¢\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fI\-importcert\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤È¤ÎÂÐÏäϹԤï¤ì¤Þ¤»¤ó¡£ ++¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ëÁ°¤Ë\fB\-printcert\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¥­¡¼¥¹¥È¥¢Æâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥ê¥¹¥È¤Ë¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢\fB\-importcert\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¾ÚÌÀ½ñ¤Î¾ðÊó¤¬É½¼¨¤µ¤ì¡¢³Îǧ¤òµá¤á¤ë¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤ë¤¿¤á¤Ç¤¹¡£¥æ¡¼¥¶¡¼¤Ï¥¤¥ó¥Ý¡¼¥ÈÁàºî¤òÄä»ß¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤ì¤ò¼Â¹Ô¤Ç¤­¤ë¤Î¤Ï¡¢\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤻ¤º¤Ë\fB\-importcert\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¾ì¹ç¤Î¤ß¤Ç¤¹¡£\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤È¤ÎÂÐÏäϹԤï¤ì¤Þ¤»¤ó¡£ + .SS "¥Ñ¥¹¥ï¡¼¥É·Ù¹ð" + .PP +-¥­¡¼¥¹¥È¥¢¤ËÂФ¹¤ëÁàºî¤ò¹Ô¤¦¤Û¤È¤ó¤É¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹¡£¤Þ¤¿¡¢°ìÉô¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Èó¸ø³«/ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬Íפˤʤ뤳¤È¤¬¤¢¤ê¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤Ï¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄê¤Ç¤­¤Þ¤¹(\fI\-storepass\fR¥ª¥×¥·¥ç¥ó¤È\fI\-keypass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍÑ)¡£¤¿¤À¤·¡¢¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¡¢¤Þ¤¿¤Ï°ÂÁ´¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¥·¥¹¥Æ¥à¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£É¬Íפʥѥ¹¥ï¡¼¥É¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¥­¡¼¥¹¥È¥¢¤ËÂФ¹¤ëÁàºî¤ò¹Ô¤¦¤Û¤È¤ó¤É¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬ÍפǤ¹¡£¤Þ¤¿¡¢°ìÉô¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢Èó¸ø³«/ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬É¬Íפˤʤ뤳¤È¤¬¤¢¤ê¤Þ¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤Ï¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄê¤Ç¤­¤Þ¤¹(\fB\-storepass\fR¥ª¥×¥·¥ç¥ó¤È\fB\-keypass\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍÑ)¡£¤¿¤À¤·¡¢¥Æ¥¹¥È¤òÌÜŪ¤È¤¹¤ë¾ì¹ç¡¢¤Þ¤¿¤Ï°ÂÁ´¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¥·¥¹¥Æ¥à¤Ç¼Â¹Ô¤¹¤ë¾ì¹ç°Ê³°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤ä¥¹¥¯¥ê¥×¥È¤Ç¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£É¬Íפʥѥ¹¥ï¡¼¥É¤Î¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï¡¢¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .SS "¾ÚÌÀ½ñ¤Î½àµò¤Ë´Ø¤¹¤ë·Ù¹ð" + .PP + ¥¤¥ó¥¿¡¼¥Í¥Ã¥Èɸ½àRFC 5280¤Ç¤Ï¡¢X\&.509¾ÚÌÀ½ñ¤Î½àµò¤Ë´Ø¤¹¤ë¥×¥í¥Õ¥¡¥¤¥ë¤¬ÄêµÁ¤µ¤ì¤Æ¤ª¤ê¡¢¾ÚÌÀ½ñ¤Î¥Õ¥£¡¼¥ë¥É¤ª¤è¤Ó¥¨¥¯¥¹¥Æ¥ó¥·¥ç¥ó¤ËÍ­¸ú¤ÊÃͤª¤è¤ÓÃͤÎÁȹ礻¤¬µ­ºÜ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£É¸½à¤Ë¤Ä¤¤¤Æ¤Ï¡¢ + http://tools\&.ietf\&.org/rfc/rfc5280\&.txt¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤ì¤é¤Î¥ë¡¼¥ë¤¹¤Ù¤Æ¤¬Å¬ÍѤµ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢É¸½à¤Ë½àµò¤·¤Ê¤¤¾ÚÌÀ½ñ¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£É¸½à¤Ë½àµò¤·¤Ê¤¤¾ÚÌÀ½ñ¤Ï¡¢JRE¤ä¾¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÇµñÈݤµ¤ì¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢\fI\-dname\fR¤ä\fI\-ext\fR¤Ê¤É¤ÇŬÀµ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤³¤ì¤é¤Î¥ë¡¼¥ë¤¹¤Ù¤Æ¤¬Å¬ÍѤµ¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢É¸½à¤Ë½àµò¤·¤Ê¤¤¾ÚÌÀ½ñ¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£É¸½à¤Ë½àµò¤·¤Ê¤¤¾ÚÌÀ½ñ¤Ï¡¢JRE¤ä¾¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÇµñÈݤµ¤ì¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤Ï¡¢\fB\-dname\fR¤ä\fB\-ext\fR¤Ê¤É¤ÇŬÀµ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "Ãí°Õ" + .SS "¿·¤·¤¤¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È" + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤Ë¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤Ë¤¹¤Ç¤Ë¸ºß¤¹¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤«¤é(¥ë¡¼¥ÈCA¤Î)¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¤Î¥Á¥§¡¼¥ó¤Î¹½ÃÛ¤ò»î¤ß¤Þ¤¹¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢¤Ë¾ÚÌÀ½ñ¤òÄɲ乤ëÁ°¤Ë¡¢¥­¡¼¥¹¥È¥¢Æâ¤Ë¤¹¤Ç¤Ë¸ºß¤¹¤ë¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤«¤é(¥ë¡¼¥ÈCA¤Î)¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¤Î¥Á¥§¡¼¥ó¤Î¹½ÃÛ¤ò»î¤ß¤Þ¤¹¡£ + .PP +-\fI\-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢ÄɲäξÚÌÀ½ñ¤Ï¿®Íê¤Ç¤­¤ë¤¹¤Ê¤ï¤Á\fIcacerts\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤ë¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ ++\fB\-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¡¢ÄɲäξÚÌÀ½ñ¤Ï¿®Íê¤Ç¤­¤ë¤¹¤Ê¤ï¤Á\fBcacerts\fR¤È¤¤¤¦Ì¾Á°¤Î¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤ë¾ÚÌÀ½ñ¤Î¥Á¥§¡¼¥ó¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ + .PP +-\fIkeytool\fR¥³¥Þ¥ó¥É¤¬¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤«¤é¼«¸Ê½ð̾¾ÚÌÀ½ñ(¥­¡¼¥¹¥È¥¢¤Þ¤¿¤Ï\fIcacerts\fR¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¼«¸Ê½ð̾¾ÚÌÀ½ñ)¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¤Î¥Ñ¥¹¤Î¹½Ãۤ˼ºÇÔ¤·¤¿¾ì¹ç¤Ï¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤Î¾ðÊó¤òɽ¼¨¤·¡¢¥æ¡¼¥¶¡¼¤Ë³Îǧ¤òµá¤á¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢Â¾¤Î¤Ê¤ó¤é¤«¤Î(¿®Íê¤Ç¤­¤ë)¾ðÊó¸»(¾ÚÌÀ½ñ¤Î½êÍ­¼Ô¤Ê¤É)¤«¤éÆþ¼ê¤·¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò¿µ½Å¤Ë³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¥¤¥ó¥Ý¡¼¥ÈÁàºî¤Ï¡¢¾ÚÌÀ½ñ¤ò³Îǧ¤¹¤ë»þÅÀ¤ÇÃæ»ß¤Ç¤­¤Þ¤¹¡£\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤È¤ÎÂÐÏäϹԤï¤ì¤Þ¤»¤ó¡£ ++\fBkeytool\fR¥³¥Þ¥ó¥É¤¬¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤«¤é¼«¸Ê½ð̾¾ÚÌÀ½ñ(¥­¡¼¥¹¥È¥¢¤Þ¤¿¤Ï\fBcacerts\fR¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¼«¸Ê½ð̾¾ÚÌÀ½ñ)¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¤Î¥Ñ¥¹¤Î¹½Ãۤ˼ºÇÔ¤·¤¿¾ì¹ç¤Ï¡¢¥¤¥ó¥Ý¡¼¥È¤¹¤ë¾ÚÌÀ½ñ¤Î¾ðÊó¤òɽ¼¨¤·¡¢¥æ¡¼¥¶¡¼¤Ë³Îǧ¤òµá¤á¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¡¢É½¼¨¤µ¤ì¤¿¾ÚÌÀ½ñ¤Î¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¡¢Â¾¤Î¤Ê¤ó¤é¤«¤Î(¿®Íê¤Ç¤­¤ë)¾ðÊó¸»(¾ÚÌÀ½ñ¤Î½êÍ­¼Ô¤Ê¤É)¤«¤éÆþ¼ê¤·¤¿¥Õ¥£¥ó¥¬¡¼¥×¥ê¥ó¥È¤È¤òÈæ³Ó¤·¤Þ¤¹¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤È¤·¤Æ¾ÚÌÀ½ñ¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¾ÚÌÀ½ñ¤¬Í­¸ú¤Ç¤¢¤ë¤³¤È¤ò¿µ½Å¤Ë³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤Î¥¤¥ó¥Ý¡¼¥È·Ù¹ð¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¥¤¥ó¥Ý¡¼¥ÈÁàºî¤Ï¡¢¾ÚÌÀ½ñ¤ò³Îǧ¤¹¤ë»þÅÀ¤ÇÃæ»ß¤Ç¤­¤Þ¤¹¡£\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢¥æ¡¼¥¶¡¼¤È¤ÎÂÐÏäϹԤï¤ì¤Þ¤»¤ó¡£ + .SS "¾ÚÌÀ½ñ±þÅú¤Î¥¤¥ó¥Ý¡¼¥È" + .PP +-¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¡¢¤ª¤è¤Ó(\fI\-trustcacert\fR\fIs\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï)\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ç¹½À®¤µ¤ì¤¿¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ±þÅú¤¬¸¡ºº¤µ¤ì¤Þ¤¹¡£cacerts¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¾ÚÌÀ½ñ±þÅú¤ò¥¤¥ó¥Ý¡¼¥È¤¹¤ë¤È¤­¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¡¢¤ª¤è¤Ó(\fB\-trustcacert\fR\fBs\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï)\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ë¤Ç¹½À®¤µ¤ì¤¿¾ÚÌÀ½ñ¤ò»ÈÍѤ·¤Æ¾ÚÌÀ½ñ±þÅú¤¬¸¡ºº¤µ¤ì¤Þ¤¹¡£cacerts¾ÚÌÀ½ñ¥Õ¥¡¥¤¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP + ¾ÚÌÀ½ñ±þÅú¤¬¿®Íê¤Ç¤­¤ë¤«¤É¤¦¤«¤ò·èÄꤹ¤ëÊýË¡¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp +@@ -1522,7 +1556,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¾ÚÌÀ½ñ±þÅú¤¬Ã±°ì¤ÎX\&.509¾ÚÌÀ½ñ¤Ç¤¢¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¾ÚÌÀ½ñ±þÅú¤«¤é(¥ë¡¼¥ÈCA¤Î)¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¥Á¥§¡¼¥ó¤Î³ÎΩ¤ò»î¤ß¤Þ¤¹¡£¾ÚÌÀ½ñ±þÅú¤È¡¢¾ÚÌÀ½ñ±þÅú¤Îǧ¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤Î³¬Áع½Â¤¤Ï¡¢alias¤Î¿·¤·¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò·ÁÀ®¤·¤Þ¤¹¡£¿®Íê¥Á¥§¡¼¥ó¤¬³ÎΩ¤µ¤ì¤Ê¤¤¾ì¹ç¡¢¾ÚÌÀ½ñ±þÅú¤Ï¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¾ÚÌÀ½ñ¤ò½ÐÎϤ»¤º¡¢¥æ¡¼¥¶¡¼¤Ë¸¡¾Ú¤òµá¤á¤ë¥×¥í¥ó¥×¥È¤òɽ¼¨¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤¬¾ÚÌÀ½ñ±þÅú¤Î¿®ÍêÀ­¤òȽÃǤ¹¤ë¤Î¤ÏÈó¾ï¤ËÆñ¤·¤¤¤¿¤á¤Ç¤¹¡£ ++¾ÚÌÀ½ñ±þÅú¤¬Ã±°ì¤ÎX\&.509¾ÚÌÀ½ñ¤Ç¤¢¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¾ÚÌÀ½ñ±þÅú¤«¤é(¥ë¡¼¥ÈCA¤Î)¼«¸Ê½ð̾¾ÚÌÀ½ñ¤Ë»ê¤ë¤Þ¤Ç¤Î¿®Íê¥Á¥§¡¼¥ó¤Î³ÎΩ¤ò»î¤ß¤Þ¤¹¡£¾ÚÌÀ½ñ±þÅú¤È¡¢¾ÚÌÀ½ñ±þÅú¤Îǧ¾Ú¤Ë»ÈÍѤµ¤ì¤ë¾ÚÌÀ½ñ¤Î³¬Áع½Â¤¤Ï¡¢alias¤Î¿·¤·¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ò·ÁÀ®¤·¤Þ¤¹¡£¿®Íê¥Á¥§¡¼¥ó¤¬³ÎΩ¤µ¤ì¤Ê¤¤¾ì¹ç¡¢¾ÚÌÀ½ñ±þÅú¤Ï¥¤¥ó¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£¤³¤Î¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¾ÚÌÀ½ñ¤ò½ÐÎϤ»¤º¡¢¥æ¡¼¥¶¡¼¤Ë¸¡¾Ú¤òµá¤á¤ë¥×¥í¥ó¥×¥È¤òɽ¼¨¤·¤Þ¤¹¡£¥æ¡¼¥¶¡¼¤¬¾ÚÌÀ½ñ±þÅú¤Î¿®ÍêÀ­¤òȽÃǤ¹¤ë¤Î¤ÏÈó¾ï¤ËÆñ¤·¤¤¤¿¤á¤Ç¤¹¡£ + .RE + .sp + .RS 4 +@@ -1533,12 +1567,12 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¾ÚÌÀ½ñ±þÅú¤¬PKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Þ¤¿¤Ï°ìÏ¢¤ÎX\&.509¾ÚÌÀ½ñ¤Ç¤¢¤ë¾ì¹ç¡¢¥Á¥§¡¼¥ó¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¾ÚÌÀ½ñ¤¬ºÇ½é¤Ë¡¢0°Ê¾å¤ÎCA¾ÚÌÀ½ñ¤¬¤½¤Î¼¡¤Ë¤¯¤ë¤è¤¦¤Ëʤ٤é¤ì¤Þ¤¹¡£¥Á¥§¡¼¥ó¤¬¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Ç½ª¤ï¤ê¡¢\fI \-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¾ÚÌÀ½ñ¤È¡¢¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¿®Íê¤Ç¤­¤ë¤¹¤Ù¤Æ¤Î¾ÚÌÀ½ñ¤ò¾È¹ç¤·¤è¤¦¤È¤·¤Þ¤¹¡£¥Á¥§¡¼¥ó¤¬¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Ç½ª¤ï¤Ã¤Æ¤ª¤é¤º¡¢\fI\-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fIkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fIcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤«¤é¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò¸«¤Ä¤±¤Æ¤½¤ì¤ò¥Á¥§¡¼¥ó¤ÎËöÈø¤ËÄɲ䷤褦¤È¤·¤Þ¤¹¡£¤½¤Î¾ÚÌÀ½ñ¤¬¸«¤Ä¤«¤é¤º¡¢\fI\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ¸å¤Î¾ÚÌÀ½ñ¤Î¾ðÊ󤬽ÐÎϤµ¤ì¡¢¥æ¡¼¥¶¡¼¤Ï³Îǧ¤òµá¤á¤é¤ì¤Þ¤¹¡£ ++¾ÚÌÀ½ñ±þÅú¤¬PKCS#7·Á¼°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤Þ¤¿¤Ï°ìÏ¢¤ÎX\&.509¾ÚÌÀ½ñ¤Ç¤¢¤ë¾ì¹ç¡¢¥Á¥§¡¼¥ó¤Ï¡¢¥æ¡¼¥¶¡¼¤Î¾ÚÌÀ½ñ¤¬ºÇ½é¤Ë¡¢0°Ê¾å¤ÎCA¾ÚÌÀ½ñ¤¬¤½¤Î¼¡¤Ë¤¯¤ë¤è¤¦¤Ëʤ٤é¤ì¤Þ¤¹¡£¥Á¥§¡¼¥ó¤¬¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Ç½ª¤ï¤ê¡¢\fB \-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¤½¤Î¾ÚÌÀ½ñ¤È¡¢¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¿®Íê¤Ç¤­¤ë¤¹¤Ù¤Æ¤Î¾ÚÌÀ½ñ¤ò¾È¹ç¤·¤è¤¦¤È¤·¤Þ¤¹¡£¥Á¥§¡¼¥ó¤¬¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤Ç½ª¤ï¤Ã¤Æ¤ª¤é¤º¡¢\fB\-trustcacerts\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢\fBkeytool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥­¡¼¥¹¥È¥¢Æâ¤Þ¤¿¤Ï\fBcacerts\fR¥­¡¼¥¹¥È¥¢¡¦¥Õ¥¡¥¤¥ëÆâ¤Î¿®Íê¤Ç¤­¤ë¾ÚÌÀ½ñ¤«¤é¼«¸Ê½ð̾¤Î¥ë¡¼¥ÈCA¾ÚÌÀ½ñ¤ò¸«¤Ä¤±¤Æ¤½¤ì¤ò¥Á¥§¡¼¥ó¤ÎËöÈø¤ËÄɲ䷤褦¤È¤·¤Þ¤¹¡£¤½¤Î¾ÚÌÀ½ñ¤¬¸«¤Ä¤«¤é¤º¡¢\fB\-noprompt\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥Á¥§¡¼¥óÆâ¤ÎºÇ¸å¤Î¾ÚÌÀ½ñ¤Î¾ðÊ󤬽ÐÎϤµ¤ì¡¢¥æ¡¼¥¶¡¼¤Ï³Îǧ¤òµá¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP +-¾ÚÌÀ½ñ±þÅúÆâ¤Î¸ø³«¸°¤¬\fIalias\fR¤Ç¤¹¤Ç¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¥æ¡¼¥¶¡¼¤Î¸ø³«¸°¤Ë°ìÃפ·¤¿¾ì¹ç¡¢¸Å¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬±þÅúÆâ¤Î¿·¤·¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£°ÊÁ°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÍ­¸ú¤Ê\fIkeypass\fR¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ï¡¢¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤òÊݸ¤ë¤¿¤á¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ ++¾ÚÌÀ½ñ±þÅúÆâ¤Î¸ø³«¸°¤¬\fBalias\fR¤Ç¤¹¤Ç¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¥æ¡¼¥¶¡¼¤Î¸ø³«¸°¤Ë°ìÃפ·¤¿¾ì¹ç¡¢¸Å¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤¬±þÅúÆâ¤Î¿·¤·¤¤¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤¹¡£°ÊÁ°¤Î¾ÚÌÀ½ñ¥Á¥§¡¼¥ó¤òÍ­¸ú¤Ê\fBkeypass\fR¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ï¡¢¥¨¥ó¥È¥ê¤ÎÈëÌ©¸°¤òÊݸ¤ë¤¿¤á¤Î¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤¿¾ì¹ç¤Î¤ß¤Ç¤¹¡£¥Ñ¥¹¥ï¡¼¥É¤ò»ØÄꤷ¤Æ¤ª¤é¤º¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤¬¥­¡¼¥¹¥È¥¢¤Î¥Ñ¥¹¥ï¡¼¥É¤È°Û¤Ê¤ë¾ì¹ç¤Ï¡¢ÈëÌ©¸°¤Î¥Ñ¥¹¥ï¡¼¥É¤ÎÆþÎϤòµá¤á¤é¤ì¤Þ¤¹¡£ + .PP +-¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fI\-import\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fI\-importcert\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï\fB\-import\fR¤È¤¤¤¦Ì¾Á°¤Ç¤·¤¿¡£¤³¤Î¥ê¥ê¡¼¥¹¤Ç¤Ï¡¢°ú¤­Â³¤­¸Å¤¤Ì¾Á°¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£º£¸å¤Ï¡¢¿·¤·¤¤Ì¾Á°\fB\-importcert\fR¤¬Í¥À褵¤ì¤Þ¤¹¡£ + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/solaris/doc/sun/man/man1/ja/native2ascii.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/native2ascii.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: native2ascii +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¹ñºÝ²½¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: native2ascii ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¹ñºÝ²½¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "native2ascii" "1" "2013ǯ11·î21Æü" "JDK 8" "¹ñºÝ²½¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + native2ascii \- ¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ëǤ°Õ¤Îʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Îʸ»ú¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤ò¡¢ASCII¤ª¤è¤ÓUnicode¤Ç¥¨¥¹¥±¡¼¥×¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Æ(¤Þ¤¿¤Ï¤½¤ÎµÕ)¡¢¥í¡¼¥«¥é¥¤¥º²Äǽ¤Ê¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òºîÀ®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fInative2ascii\fR [ \fIinputfile\fR ] [ \fIoutputfile\fR ] ++\fBnative2ascii\fR [ \fIinputfile\fR ] [ \fIoutputfile\fR ] + .fi + .if n \{\ + .RE +@@ -73,9 +75,9 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fInative2ascii\fR¥³¥Þ¥ó¥É¤Ï¡¢ASCII¥­¥ã¥é¥¯¥¿¡¦¥»¥Ã¥È¤Ë´Þ¤Þ¤ì¤Ê¤¤¤¹¤Ù¤Æ¤Îʸ»ú¤ËUnicode¥¨¥¹¥±¡¼¥×(\fI\eu\fR\fIxxxx\fR)ɽµ­Ë¡¤ò»ÈÍѤ·¤Æ¡¢Java Runtime Environment (JRE)¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢ASCII¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Þ¤¹¡£¤³¤Î¥×¥í¥»¥¹¤Ï¡¢ISO\-8859\-1ʸ»ú¥»¥Ã¥È¤Ë´Þ¤Þ¤ì¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤ÇɬÍפǤ¹¡£¤³¤Î¥Ä¡¼¥ë¤Ï¡¢¤½¤ÎµÕ¤ÎÊÑ´¹¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ ++\fBnative2ascii\fR¥³¥Þ¥ó¥É¤Ï¡¢ASCIIʸ»ú¥»¥Ã¥È¤Ë´Þ¤Þ¤ì¤Ê¤¤¤¹¤Ù¤Æ¤Îʸ»ú¤ËUnicode¥¨¥¹¥±¡¼¥×(\fB\eu\fR\fIxxxx\fR)ɽµ­Ë¡¤ò»ÈÍѤ·¤Æ¡¢Java Runtime Environment (JRE)¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¡¢ASCII¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Þ¤¹¡£¤³¤Î¥×¥í¥»¥¹¤Ï¡¢ISO\-8859\-1ʸ»ú¥»¥Ã¥È¤Ë´Þ¤Þ¤ì¤Ê¤¤Ê¸»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¥×¥í¥Ñ¥Æ¥£¡¦¥Õ¥¡¥¤¥ë¤ÇɬÍפǤ¹¡£¤³¤Î¥Ä¡¼¥ë¤Ï¡¢¤½¤ÎµÕ¤ÎÊÑ´¹¤ò¼Â¹Ô¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£ + .PP +-\fIoutputfile\fRÃͤò¾Êά¤·¤¿¾ì¹ç¡¢É¸½à½ÐÎϤ˽ÐÎϤµ¤ì¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fIinputfile\fRÃͤò¾Êά¤·¤¿¾ì¹ç¡¢É¸½àÆþÎϤ«¤éÆþÎϤµ¤ì¤Þ¤¹¡£ ++\fBoutputfile\fRÃͤò¾Êά¤·¤¿¾ì¹ç¡¢É¸½à½ÐÎϤ˽ÐÎϤµ¤ì¤Þ¤¹¡£¤µ¤é¤Ë¡¢\fBinputfile\fRÃͤò¾Êά¤·¤¿¾ì¹ç¡¢É¸½àÆþÎϤ«¤éÆþÎϤµ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-reverse +@@ -85,13 +87,13 @@ + .PP + \-encoding \fIencoding_name\fR + .RS 4 +-ÊÑ´¹½èÍý¤Ç»ÈÍѤ¹¤ëʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°(\fIjava\&.nio\&.charset\&.Charset\&.defaultCharset\fR¥á¥½¥Ã¥É¤ÇÄêµÁ¤µ¤ì¤¿)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fIencoding_name\fRʸ»úÎó¤Ï¡¢JRE¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ëʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/intl/encoding\&.doc\&.html¤Ë¤¢¤ë ++ÊÑ´¹½èÍý¤Ç»ÈÍѤ¹¤ëʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°(\fBjava\&.nio\&.charset\&.Charset\&.defaultCharset\fR¥á¥½¥Ã¥É¤ÇÄêµÁ¤µ¤ì¤¿)¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£\fBencoding_name\fRʸ»úÎó¤Ï¡¢JRE¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ëʸ»ú¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Î̾Á°¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/intl/encoding\&.doc\&.html¤Ë¤¢¤ë + ¡Ö¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó(JVM)¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine (JVM)¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .br + 'pl 8.5i +--- ./jdk/src/solaris/doc/sun/man/man1/ja/orbd.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/orbd.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: orbd +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: orbd ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "orbd" "1" "2013ǯ11·î21Æü" "JDK 8" "Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + orbd \- CORBA´Ä¶­¤Î¥µ¡¼¥Ð¡¼¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¯¥é¥¤¥¢¥ó¥È¤«¤é¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤»¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIorbd\fR [ \fIoptions\fR ] ++\fBorbd\fR [ \fIoptions\fR ] + .fi + .if n \{\ + .RE +@@ -64,11 +66,11 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIorbd\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢CORBA´Ä¶­¤Î¥µ¡¼¥Ð¡¼¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¯¥é¥¤¥¢¥ó¥È¤«¤éÆ©²áŪ¤Ë¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£orbd¥Ä¡¼¥ë¤Ë´Þ¤Þ¤ì¤ë¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¤¥¢¥ó¥È¤ÏCORBA´Ä¶­¤Ç¥µ¡¼¥Ð¡¼¾å¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤òÆ©²áŪ¤Ë¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£±Ê³¥µ¡¼¥Ð¡¼¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤òȯ¹Ô¤¹¤ëºÝ¡¢¥µ¡¼¥Ð¡¼¤Î¥Ý¡¼¥ÈÈÖ¹æ¤Î¤«¤ï¤ê¤ËORBD¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ë´Þ¤á¤Þ¤¹¡£±Ê³¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ËORBD¥Ý¡¼¥ÈÈÖ¹æ¤ò´Þ¤á¤ë¤³¤È¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÍøÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ ++\fBorbd\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢CORBA´Ä¶­¤Î¥µ¡¼¥Ð¡¼¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¯¥é¥¤¥¢¥ó¥È¤«¤éÆ©²áŪ¤Ë¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£orbd¥Ä¡¼¥ë¤Ë´Þ¤Þ¤ì¤ë¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»ÈÍѤ¹¤ë¤È¡¢¥¯¥é¥¤¥¢¥ó¥È¤ÏCORBA´Ä¶­¤Ç¥µ¡¼¥Ð¡¼¾å¤Ë¤¢¤ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È¤òÆ©²áŪ¤Ë¸¡º÷¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£±Ê³¥µ¡¼¥Ð¡¼¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ë±Ê³¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤òȯ¹Ô¤¹¤ëºÝ¡¢¥µ¡¼¥Ð¡¼¤Î¥Ý¡¼¥ÈÈÖ¹æ¤Î¤«¤ï¤ê¤ËORBD¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ë´Þ¤á¤Þ¤¹¡£±Ê³¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ËORBD¥Ý¡¼¥ÈÈÖ¹æ¤ò´Þ¤á¤ë¤³¤È¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÍøÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -92,14 +94,14 @@ + ¥¯¥é¥¤¥¢¥ó¥È¤Ï°ìÅ٤Τߥ͡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò¥ë¥Ã¥¯¥¢¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¤¬¡¢¤½¤Î¸å¤Ï¥µ¡¼¥Ð¡¼¤Î¥é¥¤¥Õ¡¦¥µ¥¤¥¯¥ë¤Ë¤è¤ëÊѹ¹¤È¤Ï̵´Ø·¸¤Ë¤³¤Î»²¾È¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .RE + .PP +-ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢\fIservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£servertool¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¡¢±Ê³¥µ¡¼¥Ð¡¼¤ÎÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¤ª¤è¤ÓÄä»ß¤ò¹Ô¤¦¤¿¤á¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Î¾ÜºÙ¤Ï¡¢¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤Ë¤Ï¡¢\fBservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£servertool¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¡¢±Ê³¥µ¡¼¥Ð¡¼¤ÎÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¤ª¤è¤ÓÄä»ß¤ò¹Ô¤¦¤¿¤á¤Î¥³¥Þ¥ó¥É¹Ô¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Î¾ÜºÙ¤Ï¡¢¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIorbd\fR¤òµ¯Æ°¤¹¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤âµ¯Æ°¤µ¤ì¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ÜºÙ¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤ÈÄä»ß¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBorbd\fR¤òµ¯Æ°¤¹¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤âµ¯Æ°¤µ¤ì¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ÜºÙ¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤ÈÄä»ß¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-ORBInitialPort \fInameserverport\fR + .RS 4 +-ɬ¿Ü¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤ò»ØÄꤷ¤Þ¤¹¡£\fIorbd\fR¤Ï¡¢µ¯Æ°¤µ¤ì¤ë¤È¡¢¤³¤Î¥Ý¡¼¥È¾å¤ÇÃå¿®¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤·¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤Ç¤Ï¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¾ì¹ç¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++ɬ¿Ü¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤ò»ØÄꤷ¤Þ¤¹¡£\fBorbd\fR¤Ï¡¢µ¯Æ°¤µ¤ì¤ë¤È¡¢¤³¤Î¥Ý¡¼¥È¾å¤ÇÃå¿®¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤·¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤Ç¤Ï¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¾ì¹ç¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .RE + .SS "ɬ¿Ü¤Ç¤Ê¤¤¥ª¥×¥·¥ç¥ó" + .PP +@@ -110,22 +112,22 @@ + .PP + \-defaultdb \fIdirectory\fR + .RS 4 +-ORBD±Ê³³ÊǼ¥Ç¥£¥ì¥¯¥È¥ê\fIorb\&.db\fR¤¬ºîÀ®¤µ¤ì¤ë¥Ù¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\fI\&./orb\&.db\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ ++ORBD±Ê³³ÊǼ¥Ç¥£¥ì¥¯¥È¥ê\fBorb\&.db\fR¤¬ºîÀ®¤µ¤ì¤ë¥Ù¡¼¥¹¡¦¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤÏ\fB\&./orb\&.db\fR¤Ë¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-serverPollingTime \fImilliseconds\fR + .RS 4 +-\fIservertool\fR¤ò»ÈÍѤ·¤ÆÅÐÏ¿¤µ¤ì¤¿±Ê³¥µ¡¼¥Ð¡¼¤Î¥Ø¥ë¥¹¾õÂÖ¤òORBD¤¬¥Á¥§¥Ã¥¯¤¹¤ë´Ö³Ö¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ1000¥ß¥êÉäǤ¹¡£\fImilliseconds\fR¤Ë»ØÄꤹ¤ëÃͤϡ¢Í­¸ú¤ÊÀµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBservertool\fR¤ò»ÈÍѤ·¤ÆÅÐÏ¿¤µ¤ì¤¿±Ê³¥µ¡¼¥Ð¡¼¤Î¥Ø¥ë¥¹¾õÂÖ¤òORBD¤¬¥Á¥§¥Ã¥¯¤¹¤ë´Ö³Ö¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ1000¥ß¥êÉäǤ¹¡£\fBmilliseconds\fR¤Ë»ØÄꤹ¤ëÃͤϡ¢Í­¸ú¤ÊÀµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-serverStartupDelay milliseconds + .RS 4 +-\fIservertool\fR¤ò»ÈÍѤ·¤ÆÅÐÏ¿¤µ¤ì¤¿±Ê³¥µ¡¼¥Ð¡¼¤òºÆµ¯Æ°¤·¤Æ¤«¤é¡¢°ÌÃÖžÁ÷¤ÎÎã³°¤òÁ÷¿®¤¹¤ë¤Þ¤Ç¤ÎORBD¤ÎÂÔµ¡»þ´Ö¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ1000¥ß¥êÉäǤ¹¡£\fImilliseconds\fR¤Ë»ØÄꤹ¤ëÃͤϡ¢Í­¸ú¤ÊÀµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBservertool\fR¤ò»ÈÍѤ·¤ÆÅÐÏ¿¤µ¤ì¤¿±Ê³¥µ¡¼¥Ð¡¼¤òºÆµ¯Æ°¤·¤Æ¤«¤é¡¢°ÌÃÖžÁ÷¤ÎÎã³°¤òÁ÷¿®¤¹¤ë¤Þ¤Ç¤ÎORBD¤ÎÂÔµ¡»þ´Ö¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥ÈÃͤÏ1000¥ß¥êÉäǤ¹¡£\fBmilliseconds\fR¤Ë»ØÄꤹ¤ëÃͤϡ¢Í­¸ú¤ÊÀµ¤ÎÀ°¿ô¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SS "¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤ÈÄä»ß" + .PP +@@ -135,17 +137,18 @@ + .PP + ±Ê³¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ËÂФ·¤Æ±Ê³À­¤òÄ󶡤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢¤³¤Î¾ðÊó¤Ï¡¢¥µ¡¼¥Ó¥¹¤ÎÄä»ß¤äµ¯Æ°¸å¤Ë¤â°Ý»ý¤µ¤ì¡¢¥µ¡¼¥Ó¥¹¤Ë¾ã³²¤¬È¯À¸¤·¤¿¾ì¹ç¤Ç¤â²óÉü¤Ç¤­¤Þ¤¹¡£ORBD¤òºÆµ¯Æ°¤¹¤ë¤È¡¢±Ê³¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î¥°¥é¥Õ¤òÉü¸µ¤·¡¢¤¹¤Ù¤Æ¤Î¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤Î̾Á°¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬¤½¤Î¤Þ¤Þ(±Ê³Ū¤Ë)ÊÝ»ý¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£ + .PP +-²¼°Ì¸ß´¹À­¤Î¤¿¤á¡¢µì¥ê¥ê¡¼¥¹¤ÎJDK¤ËƱº­¤µ¤ì¤Æ¤¤¤¿°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹\fItnameserv\fR¤¬¡¢º£²ó¤Î¥ê¥ê¡¼¥¹¤ÎJava SE¤Ë¤âƱº­¤µ¤ì¤Æ¤¤¤Þ¤¹¡£°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ç¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Î¼Â¹ÔÃæ¤Ë¤Î¤ß¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤¬ÊÝ»ý¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ó¥¹¤¬ÃæÃǤµ¤ì¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¡¦¥°¥é¥Õ¤Ï¼º¤ï¤ì¤Þ¤¹¡£ ++¸åÊý¸ß´¹À­¤Î¤¿¤á¡¢µì¥ê¥ê¡¼¥¹¤ÎJDK¤ËƱº­¤µ¤ì¤Æ¤¤¤¿°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹\fBtnameserv\fR¤¬¡¢º£²ó¤Î¥ê¥ê¡¼¥¹¤ÎJava SE¤Ë¤âƱº­¤µ¤ì¤Æ¤¤¤Þ¤¹¡£°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ç¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Î¼Â¹ÔÃæ¤Ë¤Î¤ß¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤¬ÊÝ»ý¤µ¤ì¤Þ¤¹¡£¥µ¡¼¥Ó¥¹¤¬ÃæÃǤµ¤ì¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¡¦¥°¥é¥Õ¤Ï¼º¤ï¤ì¤Þ¤¹¡£ + .PP +-\fI\-ORBInitialPort\fR°ú¿ô¤Ï¡¢\fIorbd\fR¤Îɬ¿Ü¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤Ç¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤òÀßÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¼¡¤Î¼ê½ç¤Ç¤Ï¡¢Java IDL Object Request Broker DaemonÍѤ˥ݡ¼¥È1050¤ò»ÈÍѤǤ­¤ë¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£É¬ÍפǤ¢¤ì¤ÐÊ̤Υݡ¼¥È¤ËÊѹ¹¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-ORBInitialPort\fR°ú¿ô¤Ï¡¢\fBorbd\fR¤Îɬ¿Ü¤Î¥³¥Þ¥ó¥É¹Ô°ú¿ô¤Ç¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤òÀßÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£¼¡¤Î¼ê½ç¤Ç¤Ï¡¢Java IDL Object Request Broker DaemonÍѤ˥ݡ¼¥È1050¤ò»ÈÍѤǤ­¤ë¤³¤È¤òÁ°Äó¤È¤·¤Æ¤¤¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£É¬ÍפǤ¢¤ì¤ÐÊ̤Υݡ¼¥È¤ËÊѹ¹¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-UNIX¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç\fIorbd\fR¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹¡£ ++Solaris¡¢Linux¤Þ¤¿¤ÏOS X¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤«¤é\fBorbd\fR¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-orbd \-ORBInitialPort 1050& ++\fBorbd \-ORBInitialPort 1050&\fR ++ + .fi + .if n \{\ + .RE +@@ -157,7 +160,8 @@ + .RS 4 + .\} + .nf +-start orbd \-ORBInitialPort 1050 ++\fBstart orbd \-ORBInitialPort 1050\fR ++ + .fi + .if n \{\ + .RE +@@ -169,85 +173,89 @@ + .RS 4 + .\} + .nf +-Properties props = new Properties(); +-props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050"); +-props\&.put("org\&.omg\&.CORBA\&.ORBInitialHost", "MyHost"); +-ORB orb = ORB\&.init(args, props); ++\fBProperties props = new Properties();\fR ++\fBprops\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050");\fR ++\fBprops\&.put("org\&.omg\&.CORBA\&.ORBInitialHost", "MyHost");\fR ++\fBORB orb = ORB\&.init(args, props);\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Û¥¹¥È\fIMyHost\fR¤Î¥Ý¡¼¥È1050¾å¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£Ê̤ÎÊýË¡¤È¤·¤Æ¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é¥µ¡¼¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¤¥¢¥ó¥È¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥Ý¡¼¥ÈÈÖ¹æ¤Þ¤¿¤Ï¥Þ¥·¥ó̾¤¢¤ë¤¤¤Ï¤½¤ÎξÊý¤ò»ØÄꤹ¤ëÊýË¡¤â¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fIHelloApplication\fR¤òµ¯Æ°¤Ç¤­¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Û¥¹¥È\fBMyHost\fR¤Î¥Ý¡¼¥È1050¾å¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£Ê̤ÎÊýË¡¤È¤·¤Æ¡¢¥³¥Þ¥ó¥É¹Ô¤«¤é¥µ¡¼¥Ð¡¼¤Þ¤¿¤Ï¥¯¥é¥¤¥¢¥ó¥È¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤È¤­¤Ë¡¢¥Ý¡¼¥ÈÈÖ¹æ¤Þ¤¿¤Ï¥Þ¥·¥ó̾¤¢¤ë¤¤¤Ï¤½¤ÎξÊý¤ò»ØÄꤹ¤ëÊýË¡¤â¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fBHelloApplication\fR¤òµ¯Æ°¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java HelloApplication \-ORBInitialPort 1050 \-ORBInitialHost MyHost ++\fBjava HelloApplication \-ORBInitialPort 1050 \-ORBInitialHost MyHost\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÄä»ß¤¹¤ë¤Ë¤Ï¡¢Å¬Àڤʥª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢Oracle Solaris¾å¤Ç\fIpkill\fR +-\fIorbd\fR¤ò¼Â¹Ô¤·¤¿¤ê¡¢\fIorbd\fR¤¬Æ°ºîÃæ¤ÎDOS¥¦¥£¥ó¥É¥¦¤Ç\fB[Ctrl]+[C]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ì¹ç¤Ï¡¢¥µ¡¼¥Ó¥¹¤¬½ªÎ»¤µ¤ì¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ËÅÐÏ¿¤µ¤ì¤¿Ì¾Á°¤¬¾Ãµî¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢ÌÀ¼¨Åª¤ËÄä»ß¤µ¤ì¤ë¤Þ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ ++¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÄä»ß¤¹¤ë¤Ë¤Ï¡¢Å¬Àڤʥª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¡¦¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢Oracle Solaris¾å¤Ç\fBpkill\fR ++\fBorbd\fR¤ò¼Â¹Ô¤·¤¿¤ê¡¢\fBorbd\fR¤¬Æ°ºîÃæ¤ÎDOS¥¦¥£¥ó¥É¥¦¤Ç\fB[Ctrl]+[C]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ì¹ç¤Ï¡¢¥µ¡¼¥Ó¥¹¤¬½ªÎ»¤µ¤ì¤ë¤È¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ËÅÐÏ¿¤µ¤ì¤¿Ì¾Á°¤¬¾Ãµî¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢ÌÀ¼¨Åª¤ËÄä»ß¤µ¤ì¤ë¤Þ¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ + .PP + ORBD¤ËÉÕ°¤¹¤ë¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Î¾ÜºÙ¤Ï¡¢ + http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/jidlNaming\&.html¤Î¡ÖNaming Service¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SH "¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã" + .PP +-ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Ë¥¢¥¯¥»¥¹¤·¤Æ¡¢±Ê³¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢\fIservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£servertool¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¡¢±Ê³¥µ¡¼¥Ð¡¼¤ÎÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¤ª¤è¤ÓÄä»ß¤ò¹Ô¤¦¤¿¤á¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£\fIservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ë¾ì¹ç¤Ï¡¢\fIorbd\fR¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì½ê¤ÈƱ¤¸¥Ý¡¼¥È¤È¥Û¥¹¥È¤Çµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤ò°Û¤Ê¤ë¥Ý¡¼¥È¤Ç¼Â¹Ô¤¹¤ë¤È¡¢¥í¡¼¥«¥ë¡¦¥³¥ó¥Æ¥­¥¹¥ÈÍѤ˥ǡ¼¥¿¥Ù¡¼¥¹¤ËÊݸ¤µ¤ì¤Æ¤¤¤ë¾ðÊó¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¥µ¡¼¥Ó¥¹¤¬Àµ¤·¤¯Æ°ºî¤·¤Þ¤»¤ó¡£ ++ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤Ë¥¢¥¯¥»¥¹¤·¤Æ¡¢±Ê³¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢\fBservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£servertool¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¡¢±Ê³¥µ¡¼¥Ð¡¼¤ÎÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¤ª¤è¤ÓÄä»ß¤ò¹Ô¤¦¤¿¤á¤Î¥³¥Þ¥ó¥É¹Ô¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¤¹¡£\fBservertool\fR¤ò»ÈÍѤ·¤Æ¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤¹¤ë¾ì¹ç¤Ï¡¢\fBorbd\fR¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì½ê¤ÈƱ¤¸¥Ý¡¼¥È¤È¥Û¥¹¥È¤Çµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤ò°Û¤Ê¤ë¥Ý¡¼¥È¤Ç¼Â¹Ô¤¹¤ë¤È¡¢¥í¡¼¥«¥ë¡¦¥³¥ó¥Æ¥­¥¹¥ÈÍѤ˥ǡ¼¥¿¥Ù¡¼¥¹¤ËÊݸ¤µ¤ì¤Æ¤¤¤ë¾ðÊó¤¬Ìµ¸ú¤Ë¤Ê¤ê¡¢¥µ¡¼¥Ó¥¹¤¬Àµ¤·¤¯Æ°ºî¤·¤Þ¤»¤ó¡£ + .PP + http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/jidlExample\&.html¤Î + ¡ÖJava IDL: The "Hello World" Example¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-¤³¤ÎÎã¤Ç¤Ï¡¢¥Á¥å¡¼¥È¥ê¥¢¥ë¤Î¼ê½ç¤Ë½¾¤Ã¤Æ\fIidlj\fR¥³¥ó¥Ñ¥¤¥é¤È\fIjavac\fR¥³¥ó¥Ñ¥¤¥é¤ò¼Â¹Ô¤·¤Þ¤¹¡£ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¼ê½ç¤Ë½¾¤Ã¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Ç¤Ï¡¢¥Á¥å¡¼¥È¥ê¥¢¥ë¤Î¼ê½ç¤Ë½¾¤Ã¤Æ\fBidlj\fR¥³¥ó¥Ñ¥¤¥é¤È\fBjavac\fR¥³¥ó¥Ñ¥¤¥é¤ò¼Â¹Ô¤·¤Þ¤¹¡£ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¼¡¤Î¼ê½ç¤Ë½¾¤Ã¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .PP +-\fIorbd\fR¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBorbd\fR¤òµ¯Æ°¤·¤Þ¤¹¡£ + .PP +-UNIX¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹: +-\fIorbd \-ORBInitialPort 1050\fR¡£ ++Solaris¡¢Linux¤Þ¤¿¤ÏOS X¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç¡¢¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹: ++\fBorbd \-ORBInitialPort 1050\fR + .PP + MS\-DOS¥·¥¹¥Æ¥à¡¦¥×¥í¥ó¥×¥È(Windows)¤Ç¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹: +-\fIs\fR\fItart orbd \-ORBInitialPort 105\fR\fI0\fR ++\fBs\fR\fBtart orbd \-ORBInitialPort 105\fR\fB0\fR + .PP +-¥Ý¡¼¥È1050¤Ï¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¥Ý¡¼¥È¤Ç¤¹¡£\fI\-ORBInitialPort\fR¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤Ç¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++¥Ý¡¼¥È1050¤Ï¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤¹¤ë¥Ý¡¼¥È¤Ç¤¹¡£\fB\-ORBInitialPort\fR¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¥³¥Þ¥ó¥É¹Ô°ú¿ô¤Ç¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤ò»ÈÍѤ¹¤ë¾ì¹ç¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .PP +-\fIservertool\fR¤òµ¯Æ°¤·¤Þ¤¹: +-\fIservertool \-ORBInitialPort 1050\fR¡£ ++\fBservertool\fR¤òµ¯Æ°¤·¤Þ¤¹: ++\fBservertool \-ORBInitialPort 1050\fR¡£ + .PP +-Á°²ó¤Î¼ê½ç¤È¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fIorbd\fR)¤Î¥Ý¡¼¥È¤¬Æ±¤¸¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð\fI\-ORBInitialPort 1050\&.\fR¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£\fIservertool\fR¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤ÈƱ¤¸¥Ý¡¼¥È¾å¤Çµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++Á°²ó¤Î¼ê½ç¤È¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fBorbd\fR)¤Î¥Ý¡¼¥È¤¬Æ±¤¸¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤·¤Þ¤¹¡£¤¿¤È¤¨¤Ð\fB\-ORBInitialPort 1050\&.\fR¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£\fBservertool\fR¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤ÈƱ¤¸¥Ý¡¼¥È¾å¤Çµ¯Æ°¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .PP +-\fIservertool\fR¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¡¢\fIservertool\fR¥×¥í¥ó¥×¥È¤«¤é\fIHello\fR¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¹Ô¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ç¡¢\fBservertool\fR¥×¥í¥ó¥×¥È¤«¤é\fBHello\fR¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-servertool > register \-server HelloServer \-classpath \&. \-applicationName +- HelloServerApName ++\fBservertool > register \-server HelloServer \-classpath \&. \-applicationName\fR ++\fB HelloServerApName\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIservertool\fR¤Ë¤è¤Ã¤Æ¥µ¡¼¥Ð¡¼¤¬ÅÐÏ¿¤µ¤ì¤Æ¡¢\fIHelloServerApName\fR¤È¤¤¤¦Ì¾Á°¤¬¥µ¡¼¥Ð¡¼¤Ë³ä¤êÅö¤Æ¤é¤ì¡¢ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥µ¡¼¥Ð¡¼°ìÍ÷¤È¤È¤â¤Ë¥µ¡¼¥Ð¡¼ID¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£Â¾¤ÎüËö¥¦¥£¥ó¥É¥¦¤Þ¤¿¤Ï¥×¥í¥ó¥×¥È¤«¤é¥¯¥é¥¤¥¢¥ó¥È¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ++\fBservertool\fR¤Ë¤è¤Ã¤Æ¥µ¡¼¥Ð¡¼¤¬ÅÐÏ¿¤µ¤ì¤Æ¡¢\fBHelloServerApName\fR¤È¤¤¤¦Ì¾Á°¤¬¥µ¡¼¥Ð¡¼¤Ë³ä¤êÅö¤Æ¤é¤ì¡¢ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¥µ¡¼¥Ð¡¼°ìÍ÷¤È¤È¤â¤Ë¥µ¡¼¥Ð¡¼ID¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£Â¾¤ÎüËö¥¦¥£¥ó¥É¥¦¤Þ¤¿¤Ï¥×¥í¥ó¥×¥È¤«¤é¥¯¥é¥¤¥¢¥ó¥È¡¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java HelloClient \-ORBInitialPort 1050 \-ORBInitialHost localhost ++\fBjava HelloClient \-ORBInitialPort 1050 \-ORBInitialHost localhost\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Î\fI\-ORBInitialHost localhost\fR¤Ï¾Êά¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬\fIHello\fR¥¯¥é¥¤¥¢¥ó¥È¤È¤·¤ÆƱ°ì¥Û¥¹¥È¾å¤ÇÆ°ºî¤·¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬Ê̤Υۥ¹¥È¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\-\fIORBInitialHost nameserverhost\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆIDL¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Û¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£Á°¤Î¼ê½ç¤Ç¹Ô¤ï¤ì¤¿¤È¤ª¤ê¤Ë¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fIorbd\fR)¥Ý¡¼¥È¤ò»ØÄꤷ¤Þ¤¹(Îã: +-\fI\-ORBInitialPort 1050\fR)¡£ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ÎÁàºî¤¬½ªÎ»¤·¤¿¤é¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fIorbd\fR)¤È\fIservertool\fR¤òÄä»ß¤¹¤ë¤«½ªÎ»¤·¤Æ¤¯¤À¤µ¤¤¡£MS\-DOS¥×¥í¥ó¥×¥È¤Ç\fIorbd\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¥¦¥£¥ó¥É¥¦¤òÁªÂò¤·¤Æ\fB[Ctrl]+[C]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£ ++¤³¤ÎÎã¤Î\fB\-ORBInitialHost localhost\fR¤Ï¾Êά¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬\fBHello\fR¥¯¥é¥¤¥¢¥ó¥È¤È¤·¤ÆƱ°ì¥Û¥¹¥È¾å¤ÇÆ°ºî¤·¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬Ê̤Υۥ¹¥È¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\-\fBORBInitialHost nameserverhost\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤ÆIDL¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Û¥¹¥È¤ò»ØÄꤷ¤Þ¤¹¡£Á°¤Î¼ê½ç¤Ç¹Ô¤ï¤ì¤¿¤È¤ª¤ê¤Ë¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fBorbd\fR)¥Ý¡¼¥È¤ò»ØÄꤷ¤Þ¤¹(Îã: ++\fB\-ORBInitialPort 1050\fR)¡£ORBD¤Î¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ÎÁàºî¤¬½ªÎ»¤·¤¿¤é¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼(\fBorbd\fR)¤È\fBservertool\fR¤òÄä»ß¤¹¤ë¤«½ªÎ»¤·¤Æ¤¯¤À¤µ¤¤¡£MS\-DOS¥×¥í¥ó¥×¥È¤Ç\fBorbd\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢¥µ¡¼¥Ð¡¼¤ò¼Â¹Ô¤·¤Æ¤¤¤ë¥¦¥£¥ó¥É¥¦¤òÁªÂò¤·¤Æ\fB[Ctrl]+[C]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£ + .PP +-Oracle Solaris¤«¤é\fIorbd\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢¥×¥í¥»¥¹¤ò¸¡º÷¤·¤Æ¡¢\fIkill\fR¥³¥Þ¥ó¥É¤Ç½ªÎ»¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤òÌÀ¼¨Åª¤ËÄä»ß¤¹¤ë¤Þ¤Ç¤Ï¡¢¸Æ½Ð¤·ÂÔµ¡¾õÂÖ¤¬Â³¤­¤Þ¤¹¡£\fIservertool\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢\fBquit\fR¤ÈÆþÎϤ·¤Æ¥­¡¼¥Ü¡¼¥É¤Î\fB[Enter]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£ ++Oracle Solaris¤«¤é\fBorbd\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢¥×¥í¥»¥¹¤ò¸¡º÷¤·¤Æ¡¢\fBkill\fR¥³¥Þ¥ó¥É¤Ç½ªÎ»¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤òÌÀ¼¨Åª¤ËÄä»ß¤¹¤ë¤Þ¤Ç¤Ï¡¢¸Æ½Ð¤·ÂÔµ¡¾õÂÖ¤¬Â³¤­¤Þ¤¹¡£\fBservertool\fR¤ò¥·¥ã¥Ã¥È¥À¥¦¥ó¤¹¤ë¤Ë¤Ï¡¢\fBquit\fR¤ÈÆþÎϤ·¤Æ¥­¡¼¥Ü¡¼¥É¤Î\fB[Enter]\fR¥­¡¼¤ò²¡¤·¤Þ¤¹¡£ + .SH "´ØÏ¢¹àÌÜ" + .sp + .RS 4 +--- ./jdk/src/solaris/doc/sun/man/man1/ja/pack200.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/pack200.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: pack200 +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: pack200 ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "pack200" "1" "2013ǯ11·î21Æü" "JDK 8" "Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + pack200 \- Web¥Ç¥×¥í¥¤¥á¥ó¥È¤Î¤¿¤á¤ËJAR¥Õ¥¡¥¤¥ë¤òpack200°µ½Ì¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,17 +58,17 @@ + .RS 4 + .\} + .nf +-\fIpack200\fR [\fIoptions\fR] \fIoutput\-file\fR \fIJAR\-file\fR ++\fBpack200\fR [\fIoptions\fR] \fIoutput\-file\fR \fIJAR\-file\fR + .fi + .if n \{\ + .RE + .\} + .PP +-¥ª¥×¥·¥ç¥ó¤ÏǤ°Õ¤Î½ç½ø¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Þ¤¿¤Ïproperties¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤¿ºÇ¸å¤Î¥ª¥×¥·¥ç¥ó¤¬¡¢¤½¤ì°ÊÁ°¤Ë»ØÄꤵ¤ì¤¿¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤è¤êÍ¥À褵¤ì¤Þ¤¹¡£ ++¥ª¥×¥·¥ç¥ó¤ÏǤ°Õ¤Î½ç½ø¤Ç»ØÄê¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¤Þ¤¿¤Ïproperties¥Õ¥¡¥¤¥ë¤Ë»ØÄꤵ¤ì¤¿ºÇ¸å¤Î¥ª¥×¥·¥ç¥ó¤¬¡¢¤½¤ì°ÊÁ°¤Ë»ØÄꤵ¤ì¤¿¤¹¤Ù¤Æ¤Î¥ª¥×¥·¥ç¥ó¤è¤êÍ¥À褵¤ì¤Þ¤¹¡£ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIoutput\-file\fR +@@ -80,31 +82,35 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢Java gzip¥³¥ó¥×¥ì¥Ã¥µ¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤òpack200°µ½Ì¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤¹¡£pack200¥Õ¥¡¥¤¥ë¤Ï¹â°µ½Ì¤Î¥Õ¥¡¥¤¥ë¤Ç¡¢Ä¾ÀÜ¥Ç¥×¥í¥¤¤Ç¤­¡¢ÂÓ°èÉý¤ÎÀáÌó¤ä¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤Îû½Ì¤¬²Äǽ¤Ç¤¹¡£ ++\fBpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢Java gzip¥³¥ó¥×¥ì¥Ã¥µ¤ò»ÈÍѤ·¤ÆJAR¥Õ¥¡¥¤¥ë¤òpack200°µ½Ì¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤¹¤ëJava¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤¹¡£pack200¥Õ¥¡¥¤¥ë¤Ï¹â°µ½Ì¤Î¥Õ¥¡¥¤¥ë¤Ç¡¢Ä¾ÀÜ¥Ç¥×¥í¥¤¤Ç¤­¡¢ÂÓ°èÉý¤ÎÀáÌó¤ä¥À¥¦¥ó¥í¡¼¥É»þ´Ö¤Îû½Ì¤¬²Äǽ¤Ç¤¹¡£ + .PP +-\fIpack200\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢°µ½Ì¥¨¥ó¥¸¥ó¤ÎÀßÄê¤äÈùÄ´À°¤ò¹Ô¤¦¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£°ìÈÌŪ¤Ê»ÈÍÑÊýË¡¤ò¼¡¤ÎÎã¤Ë¼¨¤·¤Þ¤¹¡£\fImyarchive\&.pack\&.gz\fR¤¬¥Ç¥Õ¥©¥ë¥È¤Î\fIpack200\fR¥³¥Þ¥ó¥ÉÀßÄê¤ÇºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBpack200\fR¥³¥Þ¥ó¥É¤Ë¤Ï¡¢°µ½Ì¥¨¥ó¥¸¥ó¤ÎÀßÄê¤äÈùÄ´À°¤ò¹Ô¤¦¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£°ìÈÌŪ¤Ê»ÈÍÑÊýË¡¤ò¼¡¤ÎÎã¤Ë¼¨¤·¤Þ¤¹¡£\fBmyarchive\&.pack\&.gz\fR¤¬¥Ç¥Õ¥©¥ë¥È¤Î\fBpack200\fR¥³¥Þ¥ó¥ÉÀßÄê¤ÇºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-pack200 myarchive\&.pack\&.gz myarchive\&.jar ++\fBpack200 myarchive\&.pack\&.gz myarchive\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "¥ª¥×¥·¥ç¥ó" + .PP +-\-r, \-\-repack ++\-r ++.br ++\-\-repack + .RS 4 +-JAR¥Õ¥¡¥¤¥ë¤ò¥Ñ¥Ã¥¯¤·¤¿¸å¥¢¥ó¥Ñ¥Ã¥¯¤·¤Æ¡¢JAR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ï\fIjarsigner\fR(1)¥Ä¡¼¥ë¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢myarchive\&.jar¥Õ¥¡¥¤¥ë¤ò¥Ñ¥Ã¥¯¤·¤¿¸å¡¢¥¢¥ó¥Ñ¥Ã¥¯¤·¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ë¤ò¥Ñ¥Ã¥¯¤·¤¿¸å¥¢¥ó¥Ñ¥Ã¥¯¤·¤Æ¡¢JAR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ï\fBjarsigner\fR(1)¥Ä¡¼¥ë¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢myarchive\&.jar¥Õ¥¡¥¤¥ë¤ò¥Ñ¥Ã¥¯¤·¤¿¸å¡¢¥¢¥ó¥Ñ¥Ã¥¯¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-pack200 \-\-repack myarchive\-packer\&.jar myarchive\&.jar +-pack200 \-\-repack myarchive\&.jar ++\fBpack200 \-\-repack myarchive\-packer\&.jar myarchive\&.jar\fR ++\fBpack200 \-\-repack myarchive\&.jar\fR ++ + .fi + .if n \{\ + .RE +@@ -112,24 +118,29 @@ + ¼¡¤ÎÎã¤Ç¤Ï¡¢ÆþÎÏ¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë¤Î½ç½ø¤òÊÝ»ý¤·¤Þ¤¹¡£ + .RE + .PP +-\-g, \-\-no\-gzip ++\-g ++.br ++\-\-no\-gzip + .RS 4 +-\fIpack200\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¤­¤Ï¡¢Å¬Àڤʰµ½Ì¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Âбþ¤¹¤ë°µ½Ì²ò½ü¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBpack200\fR¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¤­¤Ï¡¢Å¬Àڤʰµ½Ì¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥¿¡¼¥²¥Ã¥È¡¦¥·¥¹¥Æ¥à¤Ç¤Ï¡¢Âбþ¤¹¤ë°µ½Ì²ò½ü¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-pack200 \-\-no\-gzip myarchive\&.pack myarchive\&.jar ++\fBpack200 \-\-no\-gzip myarchive\&.pack myarchive\&.jar\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-G, \-\-strip\-debug ++\-G ++.br ++\-\-strip\-debug + .RS 4 +-½ÐÎϤ«¤é¥Ç¥Ð¥Ã¥°Â°À­¤òºï½ü¤·¤Þ¤¹¡£¤³¤ì¤Ë¤Ï¡¢\fISourceFile\fR¡¢\fILineNumberTable\fR¡¢\fILocalVariableTable\fR¡¢\fILocalVariableTypeTable\fR¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î°À­¤òºï½ü¤¹¤ì¤Ð¡¢¥À¥¦¥ó¥í¡¼¥É¤È¥¤¥ó¥¹¥È¡¼¥ë¤Î¥µ¥¤¥º¤Ï¾®¤µ¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¥Ç¥Ð¥Ã¥¬¤Îµ¡Ç½¤ÏÀ©¸Â¤µ¤ì¤Þ¤¹¡£ ++½ÐÎϤ«¤é¥Ç¥Ð¥Ã¥°Â°À­¤òºï½ü¤·¤Þ¤¹¡£¤³¤ì¤Ë¤Ï¡¢\fBSourceFile\fR¡¢\fBLineNumberTable\fR¡¢\fBLocalVariableTable\fR¡¢\fBLocalVariableTypeTable\fR¤¬´Þ¤Þ¤ì¤Þ¤¹¡£¤³¤ì¤é¤Î°À­¤òºï½ü¤¹¤ì¤Ð¡¢¥À¥¦¥ó¥í¡¼¥É¤È¥¤¥ó¥¹¥È¡¼¥ë¤Î¥µ¥¤¥º¤Ï¾®¤µ¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¥Ç¥Ð¥Ã¥¬¤Îµ¡Ç½¤ÏÀ©¸Â¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-\-keep\-file\-order +@@ -137,15 +148,19 @@ + ÆþÎÏ¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥¡¥¤¥ë¤Î½ç½ø¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤¹¡£ + .RE + .PP +-\-O, \-\-no\-keep\-file\-order ++\-O ++.br ++\-\-no\-keep\-file\-order + .RS 4 + ¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢¤¹¤Ù¤Æ¤ÎÍ×ÁǤòʤÙÂؤ¨¤ÆÁ÷¿®¤·¤Þ¤¹¡£¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢JAR¥Ç¥£¥ì¥¯¥È¥ê̾¤òºï½ü¤·¤Æ¥À¥¦¥ó¥í¡¼¥É¡¦¥µ¥¤¥º¤òºï¸º¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ê¤É¡¢ÆÃÄê¤ÎJAR¥Õ¥¡¥¤¥ë¤ÎºÇŬ²½µ¡Ç½¤¬Àµ¾ï¤ËÆ°ºî¤·¤Ê¤¯¤Ê¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\-S\fIvalue\fR, \-\-segment\-limit=\fIvalue\fR ++\-S\fIvalue\fR ++.br ++\-\-segment\-limit=\fIvalue\fR + .RS 4 + ¤³¤ÎÃͤϡ¢³Æ¥¢¡¼¥«¥¤¥Ö¡¦¥»¥°¥á¥ó¥È¤ÎͽÁÛ¥¿¡¼¥²¥Ã¥È¡¦¥µ¥¤¥º\fIN\fR +-(¥Ð¥¤¥Èñ°Ì)¤Ç¤¹¡£Ã±°ì¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎɬÍ×¥µ¥¤¥º¤¬\fIN\fR¥Ð¥¤¥È¤òĶ¤¨¤ë¤È¡¢ÆÈΩ¤·¤¿¥»¥°¥á¥ó¥È¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£Æüì¤Ê¥±¡¼¥¹¤È¤·¤Æ¡¢Ãͤ¬\fI\-1\fR¤Î¾ì¹ç¤Ï¡¢¤¹¤Ù¤Æ¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ò´Þ¤àÂ礭¤Êñ°ì¤Î¥»¥°¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢Ãͤ¬0¤Î¾ì¹ç¤Ï¡¢¥¯¥é¥¹¤´¤È¤Ë¥»¥°¥á¥ó¥È¤¬1¤Ä¤º¤ÄÀ¸À®¤µ¤ì¤Þ¤¹¡£¥¢¡¼¥«¥¤¥Ö¡¦¥»¥°¥á¥ó¥È¤¬Â礭¤¯¤Ê¤ë¤È¡¢ÃÇÊÒ²½¤¬¾¯¤Ê¤¯¤Ê¤ê°µ½ÌΨ¤¬¹â¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¤½¤Î½èÍý¤Ë¤Ï¿¤¯¤Î¥á¥â¥ê¡¼¤¬É¬ÍפǤ¹¡£ ++(¥Ð¥¤¥Èñ°Ì)¤Ç¤¹¡£Ã±°ì¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎɬÍ×¥µ¥¤¥º¤¬\fIN\fR¥Ð¥¤¥È¤òĶ¤¨¤ë¤È¡¢ÆÈΩ¤·¤¿¥»¥°¥á¥ó¥È¤¬³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£Æüì¤Ê¥±¡¼¥¹¤È¤·¤Æ¡¢Ãͤ¬\fB\-1\fR¤Î¾ì¹ç¤Ï¡¢¤¹¤Ù¤Æ¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ò´Þ¤àÂ礭¤Êñ°ì¤Î¥»¥°¥á¥ó¥È¤¬À¸À®¤µ¤ì¡¢Ãͤ¬0¤Î¾ì¹ç¤Ï¡¢¥¯¥é¥¹¤´¤È¤Ë¥»¥°¥á¥ó¥È¤¬1¤Ä¤º¤ÄÀ¸À®¤µ¤ì¤Þ¤¹¡£¥¢¡¼¥«¥¤¥Ö¡¦¥»¥°¥á¥ó¥È¤¬Â礭¤¯¤Ê¤ë¤È¡¢ÃÇÊÒ²½¤¬¾¯¤Ê¤¯¤Ê¤ê°µ½ÌΨ¤¬¹â¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¤½¤Î½èÍý¤Ë¤Ï¿¤¯¤Î¥á¥â¥ê¡¼¤¬É¬ÍפǤ¹¡£ + .sp + ³Æ¥»¥°¥á¥ó¥È¤Î¥µ¥¤¥º¤Ï¡¢¥»¥°¥á¥ó¥È¤ËÊÑ´¹¤µ¤ì¤ë¤½¤ì¤¾¤ì¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥µ¥¤¥º¤Î¤Û¤«¡¢¤½¤Î̾Á°¤È¾¤ÎÁ÷¿®¤µ¤ì¤ë¥×¥í¥Ñ¥Æ¥£¤Î¥µ¥¤¥º¤ò·×»»¤·¤Æ¿ä¬¤µ¤ì¤Þ¤¹¡£ + .sp +@@ -154,136 +169,169 @@ + ¤³¤ÎÀ©¸Â¤¬²Ý¤µ¤ì¤Æ¤¤¤Ê¤¤10 MB¤ÎJAR¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ÏÄ̾Ìó10%¾®¤µ¤¯¥Ñ¥Ã¥¯¤µ¤ì¤Þ¤¹¡£¤·¤«¤·¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ç¤è¤êÂ礭¤ÊJava¥Ò¡¼¥×(¥»¥°¥á¥ó¥È¤ÎÀ©¸Â¤ÎÌó10ÇÜ)¤òɬÍפȤ¹¤ë¾ì¹ç¤â¤¢¤ê¤Þ¤¹¡£ + .RE + .PP +-\-E\fIvalue\fR, \-\-effort=\fIvalue\fR ++\-E\fIvalue\fR ++.br ++\-\-effort=\fIvalue\fR + .RS 4 +-ñ°ì¤Î10¿Ê¿ôÃͤò»ØÄꤷ¤¿¾ì¹ç¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢»ØÄꤵ¤ì¤¿°µ½ÌΨ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò°µ½Ì¤·¤Þ¤¹¡£¥ì¥Ù¥ë1¤Î¾ì¹ç¤Ï¡¢Èæ³ÓŪû¤¤°µ½Ì»þ´Ö¤Ç¿¾¯Â礭¤á¤Î¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¤¬¡¢¥ì¥Ù¥ë9¤Î¾ì¹ç¤Ï¡¢Èó¾ï¤ËŤ¤»þ´Ö¤¬¤«¤«¤ë¤â¤Î¤Î¡¢¤è¤ê°µ½ÌΨ¤Î¹â¤¤¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£Æüì¤ÊÃÍ0¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢\fIpack200\fR¥³¥Þ¥ó¥É¤Ï¸µ¤ÎJAR¥Õ¥¡¥¤¥ë¤ò°µ½Ì¤Ê¤·¤ÇľÀÜ¥³¥Ô¡¼¤·¤Þ¤¹¡£JSR 200ɸ½à¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î²òÅà¥×¥í¥°¥é¥à¤¬¡¢¤³¤ÎÆÃÊ̤ʾì¹ç¤ò¥¢¡¼¥«¥¤¥ÖÁ´ÂΤΥѥ¹¥¹¥ë¡¼¤È²ò¼á¤¹¤ë¤è¤¦¤Ëµ¬Äꤷ¤Æ¤¤¤Þ¤¹¡£ ++ñ°ì¤Î10¿Ê¿ôÃͤò»ØÄꤷ¤¿¾ì¹ç¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢»ØÄꤵ¤ì¤¿°µ½ÌΨ¤Ç¥¢¡¼¥«¥¤¥Ö¤ò°µ½Ì¤·¤Þ¤¹¡£¥ì¥Ù¥ë1¤Î¾ì¹ç¤Ï¡¢Èæ³ÓŪû¤¤°µ½Ì»þ´Ö¤Ç¿¾¯Â礭¤á¤Î¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¤¬¡¢¥ì¥Ù¥ë9¤Î¾ì¹ç¤Ï¡¢Èó¾ï¤ËŤ¤»þ´Ö¤¬¤«¤«¤ë¤â¤Î¤Î¡¢¤è¤ê°µ½ÌΨ¤Î¹â¤¤¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£Æüì¤ÊÃÍ0¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢\fBpack200\fR¥³¥Þ¥ó¥É¤Ï¸µ¤ÎJAR¥Õ¥¡¥¤¥ë¤ò°µ½Ì¤Ê¤·¤ÇľÀÜ¥³¥Ô¡¼¤·¤Þ¤¹¡£JSR 200ɸ½à¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î²òÅà¥×¥í¥°¥é¥à¤¬¡¢¤³¤ÎÆÃÊ̤ʾì¹ç¤ò¥¢¡¼¥«¥¤¥ÖÁ´ÂΤΥѥ¹¥¹¥ë¡¼¤È²ò¼á¤¹¤ë¤è¤¦¤Ëµ¬Äꤷ¤Æ¤¤¤Þ¤¹¡£ + .sp + ¥Ç¥Õ¥©¥ë¥È¤Ï5¤Ç¤¹¡£¤³¤Î¾ì¹ç¡¢É¸½àŪ¤Ê»þ´Ö¤ÇŬÀڤʰµ½Ì¤¬¹Ô¤ï¤ì¤Þ¤¹¡£ + .RE + .PP +-\-H\fIvalue\fR, \-\-deflate\-hint=\fIvalue\fR ++\-H\fIvalue\fR ++.br ++\-\-deflate\-hint=\fIvalue\fR + .RS 4 +-ÆþÎϾðÊó¤òÊݸ¤¹¤ë¤È¤¤¤¦¥Ç¥Õ¥©¥ë¥ÈÃͤò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£Å¾Á÷¤µ¤ì¤ë¥¢¡¼¥«¥¤¥Ö¤Î¥µ¥¤¥º¤ÏÂ礭¤¯¤Ê¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£»ØÄê²Äǽ¤ÊÃͤϡ¢\fItrue\fR¡¢\fIfalse\fR¤Þ¤¿¤Ï\fIkeep\fR¤Ç¤¹¡£ ++ÆþÎϾðÊó¤òÊݸ¤¹¤ë¤È¤¤¤¦¥Ç¥Õ¥©¥ë¥ÈÃͤò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£Å¾Á÷¤µ¤ì¤ë¥¢¡¼¥«¥¤¥Ö¤Î¥µ¥¤¥º¤ÏÂ礭¤¯¤Ê¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£»ØÄê²Äǽ¤ÊÃͤϡ¢\fBtrue\fR¡¢\fBfalse\fR¤Þ¤¿¤Ï\fBkeep\fR¤Ç¤¹¡£ + .sp +-\fIvalue\fR¤¬\fItrue\fR¤Þ¤¿¤Ïfalse¤Î¾ì¹ç¡¢\fIpacker200\fR¥³¥Þ¥ó¥É¤Ï»ØÄê¤Ë½¾¤Ã¤Æ¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤ò½ÐÎÏ¥¢¡¼¥«¥¤¥Ö¤ËÀßÄꤷ¤Þ¤¹¡£¥¢¡¼¥«¥¤¥ÖÍ×ÁǤθġ¹¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤ÏžÁ÷¤µ¤ì¤Þ¤»¤ó¡£ ++\fBvalue\fR¤¬\fBtrue\fR¤Þ¤¿¤Ïfalse¤Î¾ì¹ç¡¢\fBpacker200\fR¥³¥Þ¥ó¥É¤Ï»ØÄê¤Ë½¾¤Ã¤Æ¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤ò½ÐÎÏ¥¢¡¼¥«¥¤¥Ö¤ËÀßÄꤷ¤Þ¤¹¡£¥¢¡¼¥«¥¤¥ÖÍ×ÁǤθġ¹¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤ÏžÁ÷¤µ¤ì¤Þ¤»¤ó¡£ + .sp +-\fIkeep\fRÃͤϡ¢ÆþÎÏJAR¤Ç³Îǧ¤µ¤ì¤¿¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£ ++\fBkeep\fRÃͤϡ¢ÆþÎÏJAR¤Ç³Îǧ¤µ¤ì¤¿¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥Ò¥ó¥È¤òÊÝ»ý¤·¤Þ¤¹¡£¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£ + .RE + .PP +-\-m\fIvalue\fR, \-\-modification\-time=\fIvalue\fR ++\-m\fIvalue\fR ++.br ++\-\-modification\-time=\fIvalue\fR + .RS 4 +-»ØÄê²Äǽ¤ÊÃͤÏ\fIlatest\fR¤È\fIkeep\fR¤Ç¤¹¡£ ++»ØÄê²Äǽ¤ÊÃͤÏ\fBlatest\fR¤È\fBkeep\fR¤Ç¤¹¡£ + .sp + Ãͤ¬ºÇ¿·¤Î¾ì¹ç¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢¸µ¤Î¥¢¡¼¥«¥¤¥Ö¤Î»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Î¤¦¤Á¤ÎºÇ½ª¹¹¿·»þ¹ï¤«¡¢¤½¤Î¥»¥°¥á¥ó¥È¤Î»ÈÍѲÄǽ¤Ê¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤ÎºÇ½ª¹¹¿·»þ¹ï¤òÆÃÄꤷ¤è¤¦¤È¤·¤Þ¤¹¡£¤³¤Îñ°ì¤ÎÃͤϥ»¥°¥á¥ó¥È¤Î°ìÉô¤È¤·¤ÆžÁ÷¤µ¤ì¡¢³Æ¥»¥°¥á¥ó¥È¤ÎÁ´¥¨¥ó¥È¥ê¤ËŬÍѤµ¤ì¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¤¹¤Ù¤Æ¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥Õ¥¡¥¤¥ë¤Ëñ°ì¤ÎÆüÉÕ¤¬ÀßÄꤵ¤ì¤ë¤È¤¤¤¦ÌäÂê¤Ï¤¢¤ê¤Þ¤¹¤¬¡¢¥¢¡¼¥«¥¤¥Ö¤ÎžÁ÷¥µ¥¤¥º¤ò¾¯¤·¾®¤µ¤¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-Ãͤ¬\fIkeep\fR¤Î¾ì¹ç¡¢ÆþÎÏJAR¤Ç³Îǧ¤µ¤ì¤¿Êѹ¹»þ´Ö¤¬ÊÝ»ý¤µ¤ì¤Þ¤¹¡£¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£ ++Ãͤ¬\fBkeep\fR¤Î¾ì¹ç¡¢ÆþÎÏJAR¤Ç³Îǧ¤µ¤ì¤¿Êѹ¹»þ´Ö¤¬ÊÝ»ý¤µ¤ì¤Þ¤¹¡£¤³¤ì¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£ + .RE + .PP +-\-P\fIfile\fR, \-\-pass\-file=\fIfile\fR ++\-P\fIfile\fR ++.br ++\-\-pass\-file=\fIfile\fR + .RS 4 +-¥Õ¥¡¥¤¥ë¤ò°µ½Ì¤»¤º¡¢¥Ð¥¤¥Èñ°Ì¤ÇžÁ÷¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«ÊÖ¤·»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥·¥¹¥Æ¥à¡¦¥Õ¥¡¥¤¥ë¡¦¥»¥Ñ¥ì¡¼¥¿¤¬JAR¥Õ¥¡¥¤¥ë¡¦¥»¥Ñ¥ì¡¼¥¿¤Î¥¹¥é¥Ã¥·¥å(/)¤ËÃÖ¤­´¹¤¨¤é¤ì¤ëÅÀ¤ò½ü¤­¡¢¥Ñ¥¹Ì¾¤ÎÊÑ´¹¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£·ë²Ì¤È¤·¤ÆÆÀ¤é¤ì¤ë¥Õ¥¡¥¤¥ë̾¤Ï¡¢Ê¸»úÎó¤È¤·¤ÆÀµ³Î¤ËJAR¥Õ¥¡¥¤¥ë¤Ç¤Î½Ð¸½¤È°ìÃפ·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIfile\fR¤Ë¥Ç¥£¥ì¥¯¥È¥ê̾¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤¬Å¾Á÷¤µ¤ì¤Þ¤¹¡£ ++¥Õ¥¡¥¤¥ë¤ò°µ½Ì¤»¤º¡¢¥Ð¥¤¥Èñ°Ì¤ÇžÁ÷¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò·«ÊÖ¤·»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¥·¥¹¥Æ¥à¡¦¥Õ¥¡¥¤¥ë¡¦¥»¥Ñ¥ì¡¼¥¿¤¬JAR¥Õ¥¡¥¤¥ë¡¦¥»¥Ñ¥ì¡¼¥¿¤Î¥¹¥é¥Ã¥·¥å(/)¤ËÃÖ¤­´¹¤¨¤é¤ì¤ëÅÀ¤ò½ü¤­¡¢¥Ñ¥¹Ì¾¤ÎÊÑ´¹¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó¡£·ë²Ì¤È¤·¤ÆÆÀ¤é¤ì¤ë¥Õ¥¡¥¤¥ë̾¤Ï¡¢Ê¸»úÎó¤È¤·¤ÆÀµ³Î¤ËJAR¥Õ¥¡¥¤¥ë¤Ç¤Î½Ð¸½¤È°ìÃפ·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBfile\fR¤Ë¥Ç¥£¥ì¥¯¥È¥ê̾¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤¬Å¾Á÷¤µ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-U\fIaction\fR, \-\-unknown\-attribute=\fIaction\fR ++\-U\fIaction\fR ++.br ++\-\-unknown\-attribute=\fIaction\fR + .RS 4 +-¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢ÉÔÌÀ¤Ê°À­¤ò´Þ¤à¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¡¢»ØÄꤷ¤¿\fIaction\fR¤Ë¤è¤Ã¤ÆÅϤµ¤ì¤Þ¤¹¡£¥¢¥¯¥·¥ç¥ó¤È¤·¤Æ»ØÄê²Äǽ¤ÊÃͤϡ¢\fIerror\fR¡¢\fIstrip\fR¤Þ¤¿¤Ï\fIpass\fR¤Ç¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢ÉÔÌÀ¤Ê°À­¤ò´Þ¤à¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤¬¡¢»ØÄꤷ¤¿\fBaction\fR¤Ë¤è¤Ã¤ÆÅϤµ¤ì¤Þ¤¹¡£¥¢¥¯¥·¥ç¥ó¤È¤·¤Æ»ØÄê²Äǽ¤ÊÃͤϡ¢\fBerror\fR¡¢\fBstrip\fR¤Þ¤¿¤Ï\fBpass\fR¤Ç¤¹¡£ + .sp +-Ãͤ¬\fIerror\fR¤Î¾ì¹ç¡¢\fIpack200\fR¥³¥Þ¥ó¥ÉÁàºîÁ´ÂΤ¬¼ºÇÔ¤·¤ÆŬÀÚ¤ÊÀâÌÀ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++Ãͤ¬\fBerror\fR¤Î¾ì¹ç¡¢\fBpack200\fR¥³¥Þ¥ó¥ÉÁàºîÁ´ÂΤ¬¼ºÇÔ¤·¤ÆŬÀÚ¤ÊÀâÌÀ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .sp +-Ãͤ¬\fIstrip\fR¤Î¾ì¹ç¡¢Â°À­¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£Java²¾ÁÛ¥Þ¥·¥ó(JVM)ɬ¿Ü°À­¤òºï½ü¤¹¤ë¤È¡¢¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Î¾ã³²¤¬È¯À¸¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ++Ãͤ¬\fBstrip\fR¤Î¾ì¹ç¡¢Â°À­¤Ïºï½ü¤µ¤ì¤Þ¤¹¡£Java Virtual Machine (JVM)ɬ¿Ü°À­¤òºï½ü¤¹¤ë¤È¡¢¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Î¾ã³²¤¬È¯À¸¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ + .sp +-Ãͤ¬\fIpass\fR¤Î¾ì¹ç¡¢¥¯¥é¥¹Á´ÂΤ¬1¤Ä¤Î¥ê¥½¡¼¥¹¤È¤·¤ÆžÁ÷¤µ¤ì¤Þ¤¹¡£ ++Ãͤ¬\fBpass\fR¤Î¾ì¹ç¡¢¥¯¥é¥¹Á´ÂΤ¬1¤Ä¤Î¥ê¥½¡¼¥¹¤È¤·¤ÆžÁ÷¤µ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-C\fIattribute\-name\fR=\fIlayout\fR, \-\-class\-attribute=\fIattribute\-name\fR=\fIaction\fR ++\-C\fIattribute\-name\fR=\fIlayout\fR ++.br ++\-\-class\-attribute=\fIattribute\-name\fR=\fIaction\fR + .RS 4 + ¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\-F\fIattribute\-name\fR=\fIlayout\fR, \-\-field\-attribute=\fIattribute\-name\fR=\fIaction\fR ++\-F\fIattribute\-name\fR=\fIlayout\fR ++.br ++\-\-field\-attribute=\fIattribute\-name\fR=\fIaction\fR + .RS 4 + ¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\-M\fIattribute\-name\fR=\fIlayout\fR, \-\-method\-attribute=\fIattribute\-name\fR=\fIaction\fR ++\-M\fIattribute\-name\fR=\fIlayout\fR ++.br ++\-\-method\-attribute=\fIattribute\-name\fR=\fIaction\fR + .RS 4 + ¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\-D\fIattribute\-name\fR=\fIlayout\fR, \-\-code\-attribute=\fIattribute\-name\fR=\fIaction\fR ++\-D\fIattribute\-name\fR=\fIlayout\fR ++.br ++\-\-code\-attribute=\fIattribute\-name\fR=\fIaction\fR + .RS 4 +-Á°½Ò¤Î4¤Ä¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥¯¥é¥¹¡¦¥¨¥ó¥Æ¥£¥Æ¥£¤Ë\fIclass\-attribute\fR¡¢\fIfield\-attribute\fR¡¢\fImethod\-attribute\fR¤ª¤è¤Ó\fIcode\-attribute\fR¤Ê¤É¤Î°À­¤Î¥ì¥¤¥¢¥¦¥È¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIattribute\-name\fR¤Ë¤Ï¡¢¤³¤ì¤«¤é¥ì¥¤¥¢¥¦¥È¤Þ¤¿¤Ï¥¢¥¯¥·¥ç¥ó¤òÄêµÁ¤¹¤ë°À­¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£\fIaction\fR¤È¤·¤Æ»ØÄê²Äǽ¤ÊÃͤϡ¢\fIsome\-layout\-string\fR¡¢\fIerror\fR¡¢\fIstrip\fR¡¢\fIpass\fR¤Ç¤¹¡£ ++Á°½Ò¤Î4¤Ä¤Î¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥¯¥é¥¹¡¦¥¨¥ó¥Æ¥£¥Æ¥£¤Ë\fBclass\-attribute\fR¡¢\fBfield\-attribute\fR¡¢\fBmethod\-attribute\fR¤ª¤è¤Ó\fBcode\-attribute\fR¤Ê¤É¤Î°À­¤Î¥ì¥¤¥¢¥¦¥È¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£\fIattribute\-name\fR¤Ë¤Ï¡¢¤³¤ì¤«¤é¥ì¥¤¥¢¥¦¥È¤Þ¤¿¤Ï¥¢¥¯¥·¥ç¥ó¤òÄêµÁ¤¹¤ë°À­¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£\fIaction\fR¤È¤·¤Æ»ØÄê²Äǽ¤ÊÃͤϡ¢\fBsome\-layout\-string\fR¡¢\fBerror\fR¡¢\fBstrip\fR¡¢\fBpass\fR¤Ç¤¹¡£ + .sp +-\fIsome\-layout\-string\fR: ¥ì¥¤¥¢¥¦¥È¸À¸ì¤ÏJSR 200»ÅÍͤÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Îã: +-\fI\-\-class\-attribute=SourceFile=RUH\fR¡£ ++\fBsome\-layout\-string\fR: ¥ì¥¤¥¢¥¦¥È¸À¸ì¤ÏJSR 200»ÅÍͤÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£Îã: ++\fB\-\-class\-attribute=SourceFile=RUH\fR¡£ + .sp +-Ãͤ¬\fIerror\fR¤Î¾ì¹ç¡¢\fIpack200\fRÁàºî¤¬¼ºÇÔ¤·¤ÆÀâÌÀ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++Ãͤ¬\fBerror\fR¤Î¾ì¹ç¡¢\fBpack200\fRÁàºî¤¬¼ºÇÔ¤·¤ÆÀâÌÀ¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .sp +-Ãͤ¬\fIstrip\fR¤Î¾ì¹ç¡¢Â°À­¤¬½ÐÎϤ«¤éºï½ü¤µ¤ì¤Þ¤¹¡£VMɬ¿Ü°À­¤òºï½ü¤¹¤ë¤È¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Î¾ã³²¤¬È¯À¸¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-\-class\-attribute=CompilationID=pass\fR¤È¤¤¤¦¤³¤Î°À­¤ò´Þ¤à¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òžÁ÷¤·¤Þ¤¹¡£¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢¤½¤Î¾¤Î¥¢¥¯¥·¥ç¥ó¤ò¹Ô¤¤¤Þ¤»¤ó¡£ ++Ãͤ¬\fBstrip\fR¤Î¾ì¹ç¡¢Â°À­¤¬½ÐÎϤ«¤éºï½ü¤µ¤ì¤Þ¤¹¡£VMɬ¿Ü°À­¤òºï½ü¤¹¤ë¤È¥¯¥é¥¹¡¦¥í¡¼¥À¡¼¤Î¾ã³²¤¬È¯À¸¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-\-class\-attribute=CompilationID=pass\fR¤È¤¤¤¦¤³¤Î°À­¤ò´Þ¤à¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òžÁ÷¤·¤Þ¤¹¡£¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤Ï¡¢¤½¤Î¾¤Î¥¢¥¯¥·¥ç¥ó¤ò¹Ô¤¤¤Þ¤»¤ó¡£ + .sp +-Ãͤ¬\fIpass\fR¤Î¾ì¹ç¡¢¥¯¥é¥¹Á´ÂΤ¬1¤Ä¤Î¥ê¥½¡¼¥¹¤È¤·¤ÆžÁ÷¤µ¤ì¤Þ¤¹¡£ ++Ãͤ¬\fBpass\fR¤Î¾ì¹ç¡¢¥¯¥é¥¹Á´ÂΤ¬1¤Ä¤Î¥ê¥½¡¼¥¹¤È¤·¤ÆžÁ÷¤µ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-f \fIpack\&.properties\fR, \-\-config\-file=\fIpack\&.properties\fR ++\-f \fIpack\&.properties\fR ++.br ++\-\-config\-file=\fIpack\&.properties\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤ò½é´ü²½¤¹¤ë¤¿¤á¤ÎJava¥×¥í¥Ñ¥Æ¥£¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¹½À®¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô¤Ë¡¢¥Ñ¥Ã¥¯¡¦¥Ä¡¼¥ë¤ò½é´ü²½¤¹¤ë¤¿¤á¤ÎJava¥×¥í¥Ñ¥Æ¥£¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¹½À®¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-pack200 \-f pack\&.properties myarchive\&.pack\&.gz myarchive\&.jar +-more pack\&.properties +-# Generic properties for the packer\&. +-modification\&.time=latest +-deflate\&.hint=false +-keep\&.file\&.order=false +-# This option will cause the files bearing new attributes to +-# be reported as an error rather than passed uncompressed\&. +-unknown\&.attribute=error +-# Change the segment limit to be unlimited\&. +-segment\&.limit=\-1 ++\fBpack200 \-f pack\&.properties myarchive\&.pack\&.gz myarchive\&.jar\fR ++\fBmore pack\&.properties\fR ++\fB# Generic properties for the packer\&.\fR ++\fBmodification\&.time=latest\fR ++\fBdeflate\&.hint=false\fR ++\fBkeep\&.file\&.order=false\fR ++\fB# This option will cause the files bearing new attributes to\fR ++\fB# be reported as an error rather than passed uncompressed\&.\fR ++\fBunknown\&.attribute=error\fR ++\fB# Change the segment limit to be unlimited\&.\fR ++\fBsegment\&.limit=\-1\fR ++ + .fi + .if n \{\ + .RE + .\} + .RE + .PP +-\-v, \-\-verbose ++\-v ++.br ++\-\-verbose + .RS 4 + ºÇ¾®¸Â¤Î¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤òÊ£¿ô»ØÄꤹ¤ë¤È¡¢¤è¤êŤ¤¥á¥Ã¥»¡¼¥¸¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .RE + .PP +-\-q, \-\-quiet ++\-q ++.br ++\-\-quiet + .RS 4 + ¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤»¤º¤ËÆ°ºî¤¹¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP +-\-l\fIfilename\fR, \-\-log\-file=\fIfilename\fR ++\-l\fIfilename\fR ++.br ++\-\-log\-file=\fIfilename\fR + .RS 4 + ½ÐÎÏ¥á¥Ã¥»¡¼¥¸¤Î¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP +-\-?, \-h, \-\-help ++\-? ++.br ++\-h ++.br ++\-\-help + .RS 4 + ¤³¤Î¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP +-\-V, \-\-version ++\-V ++.br ++\-\-version + .RS 4 + ¤³¤Î¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-»ØÄꤵ¤ì¤¿¥ª¥×¥·¥ç¥ó¤òJava²¾ÁÛ¥Þ¥·¥ó¤ËÅϤ·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢java(1)¥³¥Þ¥ó¥É¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ++»ØÄꤵ¤ì¤¿¥ª¥×¥·¥ç¥ó¤òJava Virtual Machine¤ËÅϤ·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢java(1)¥³¥Þ¥ó¥É¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .SH "½ªÎ»¥¹¥Æ¡¼¥¿¥¹" + .PP + ¼¡¤Î½ªÎ»Ãͤ¬ÊÖ¤µ¤ì¤Þ¤¹: Àµ¾ï½ªÎ»¤Î¾ì¹ç¤Ï0¡¢¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ï0¤è¤êÂ礭¤¤ÃÍ¡£ + .SH "Ãí°Õ" + .PP +-¤³¤Î¥³¥Þ¥ó¥É¤È\fIpack\fR(1)¤òº®Æ±¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\fIpack\fR¤ª¤è¤Ó\fIpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢ÊÌ¡¹¤ÎÀ½ÉʤǤ¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤È\fBpack\fR(1)¤òº®Æ±¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£\fBpack\fR¤ª¤è¤Ó\fBpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢ÊÌ¡¹¤ÎÀ½ÉʤǤ¹¡£ + .PP + JDK¤ËÉÕ°¤¹¤ëJava SE API»ÅÍͤȤÎÁê°ã¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢»ÅÍͤòÍ¥À褷¤Æ¤¯¤À¤µ¤¤¡£ + .SH "´ØÏ¢¹àÌÜ" +--- ./jdk/src/solaris/doc/sun/man/man1/ja/policytool.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/policytool.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: policytool +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: policytool ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: ¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "policytool" "1" "2013ǯ11·î21Æü" "JDK 8" "¥»¥­¥å¥ê¥Æ¥£¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + policytool \- ¥æ¡¼¥Æ¥£¥ê¥Æ¥£GUI·Ðͳ¤Ç¼èÆÀ¤·¤¿¥æ¡¼¥¶¡¼ÆþÎϤ˴ð¤Å¤¤¤Æ¡¢¥×¥ì¡¼¥ó¡¦¥Æ¥­¥¹¥È¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߽ñ¤­¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIpolicytool\fR [ \fI\-file\fR ] [ \fIfilename\fR ] ++\fBpolicytool\fR [ \fB\-file\fR ] [ \fIfilename\fR ] + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \-file + .RS 4 +-¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¤è¤¦¤Ë\fIpolicytool\fR¤Ë»Ø¼¨¤·¤Þ¤¹¡£ ++¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¤è¤¦¤Ë\fBpolicytool\fR¤Ë»Ø¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \fIfilename\fR +@@ -80,32 +82,34 @@ + .RS 4 + .\} + .nf +-policytool ++\fBpolicytool\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIpolicytool\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹: ++\fBpolicytool\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤ò¥í¡¼¥É¤·¤Þ¤¹: + .sp + .if n \{\ + .RS 4 + .\} + .nf +-policytool\-file mypolicyfile ++\fBpolicytool\-file mypolicyfile\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "ÀâÌÀ" + .PP +-\fIpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢´ÉÍý¼Ô¤ÎGUI¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¥í¡¼¥«¥ë¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò´ÉÍý¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ï\fI\&.policy\fR³ÈÄ¥»Ò¤ò»ý¤Ä¥×¥ì¡¼¥ó¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¡¢¥É¥á¥¤¥óÊ̤˥ê¥â¡¼¥È¡¦¥ê¥¯¥¨¥¹¥¿¤ò¸¢¸Â¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥Þ¥Ã¥×¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/PolicyFiles\&.html¤Ë¤¢¤ë ++\fBpolicytool\fR¥³¥Þ¥ó¥É¤Ï¡¢´ÉÍý¼Ô¤ÎGUI¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤ì¤Ë¤è¤ê¡¢¥·¥¹¥Æ¥à´ÉÍý¼Ô¤Ï¥í¡¼¥«¥ë¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò´ÉÍý¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ï\fB\&.policy\fR³ÈÄ¥»Ò¤ò»ý¤Ä¥×¥ì¡¼¥ó¥Æ¥­¥¹¥È¡¦¥Õ¥¡¥¤¥ë¤Ç¡¢¥É¥á¥¤¥óÊ̤˥ê¥â¡¼¥È¡¦¥ê¥¯¥¨¥¹¥¿¤ò¸¢¸Â¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥Þ¥Ã¥×¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/security/PolicyFiles\&.html¤Ë¤¢¤ë + ¡ÖDefault Policy Implementation and Policy File Syntax¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-file + .RS 4 +-¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¤è¤¦¤Ë\fIpolicytool\fR¤Ë»Ø¼¨¤·¤Þ¤¹¡£ ++¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤à¤è¤¦¤Ë\fBpolicytool\fR¤Ë»Ø¼¨¤·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/rmic.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/rmic.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: rmic +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: rmic ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "rmic" "1" "2013ǯ11·î21Æü" "JDK 8" "Remote Method Invocation (RMI)" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + rmic \- Java Remote Method Protocol (JRMP)¤Þ¤¿¤ÏInternet Inter\-Orb protocol (IIOP)¤ò»ÈÍѤ¹¤ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¹¥¿¥Ö¡¢¥¹¥±¥ë¥È¥ó¤ª¤è¤ÓTie¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£Object Management Group (OMG)¥¤¥ó¥¿¥Õ¥§¡¼¥¹ÄêµÁ¸À¸ì(IDL)¤âÀ¸À®¤·¤Þ¤¹ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIrmic\fR [ \fIoptions\fR ] \fIpackage\-qualified\-class\-names\fR ++\fBrmic\fR [ \fIoptions\fR ] \fIpackage\-qualified\-class\-names\fR + .fi + .if n \{\ + .RE +@@ -64,26 +66,27 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦\fI¥ª¥×¥·¥ç¥ó\fR¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô\fB¥ª¥×¥·¥ç¥ó\fR¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIpackage\-qualified\-class\-names\fR + .RS 4 + ¥Ñ¥Ã¥±¡¼¥¸¤ò´Þ¤à¥¯¥é¥¹Ì¾¡£Îã: +-\fIjava\&.awt\&.Color\fR¡£ ++\fBjava\&.awt\&.Color\fR¡£ + .RE + .SH "ÀâÌÀ" + .PP + \fBÈó¿ä¾©¤Ë´Ø¤¹¤ëÃí°Õ:\fR +-Java Remote Method Protocol (JRMP)¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¤ÎÀÅŪ¤ÊÀ¸À®¤Î¥µ¥Ý¡¼¥È¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£Æ°Åª¤ËÀ¸À®¤µ¤ì¤ëJRMP¥¹¥¿¥Ö¤ò¤«¤ï¤ê¤Ë»ÈÍѤ·¤Æ¡¢JRMP¥Ù¡¼¥¹¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤³¤Î¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍ×À­¤ò¤Ê¤¯¤¹¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fIjava\&.rmi\&.server\&.UnicastRemoteObject\fR»ÅÍÍ(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/server/UnicastRemoteObject\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Remote Method Protocol (JRMP)¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¤ÎÀÅŪ¤ÊÀ¸À®¤Î¥µ¥Ý¡¼¥È¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£Æ°Åª¤ËÀ¸À®¤µ¤ì¤ëJRMP¥¹¥¿¥Ö¤ò¤«¤ï¤ê¤Ë»ÈÍѤ·¤Æ¡¢JRMP¥Ù¡¼¥¹¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤³¤Î¥Ä¡¼¥ë¤ò»ÈÍѤ¹¤ëɬÍ×À­¤ò¤Ê¤¯¤¹¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\fBjava\&.rmi\&.server\&.UnicastRemoteObject\fR»ÅÍÍ(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/server/UnicastRemoteObject\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIrmic\fR¥³¥ó¥Ñ¥¤¥é¤Ï¡¢Java Remote Method Protocol (JRMP)¤È¥¹¥¿¥Ö¤ª¤è¤ÓTie¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë(IIOP¥×¥í¥È¥³¥ë)¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¼ÂÁõ¥¯¥é¥¹¤Ç¤¢¤ë¤³¤ì¤é¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥¯¥é¥¹¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤¿¤È¤­¤ËÀ¸À®¤µ¤ì¤Þ¤¹¡£¥ê¥â¡¼¥È¼ÂÁõ¥¯¥é¥¹¤Ï¡¢\fIjava\&.rmi\&.Remote\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£\fIrmic\fR¥³¥Þ¥ó¥É¤Ç¤Î¥¯¥é¥¹Ì¾¤Ï¡¢¤½¤Î¥¯¥é¥¹¤¬\fIjavac\fR¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥ë¤¬À®¸ù¤·¤Æ¤¤¤Æ¡¢¤«¤Ä´°Á´½¤¾þ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Ë¼¨¤¹¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾\fIHelloImpl\fR¤Ç\fIrmic\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢hello¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ÎÉÕ¤¤¤¿)¤Ë\fIHelloImpl_Stub\&.class \fR¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBrmic\fR¥³¥ó¥Ñ¥¤¥é¤Ï¡¢Java Remote Method Protocol (JRMP)¤È¥¹¥¿¥Ö¤ª¤è¤ÓTie¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë(IIOP¥×¥í¥È¥³¥ë)¤ò»ÈÍѤ·¤Æ¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¼ÂÁõ¥¯¥é¥¹¤Ç¤¢¤ë¤³¤ì¤é¤Î¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Ï¡¢Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥¯¥é¥¹¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤¿¤È¤­¤ËÀ¸À®¤µ¤ì¤Þ¤¹¡£¥ê¥â¡¼¥È¼ÂÁõ¥¯¥é¥¹¤Ï¡¢\fBjava\&.rmi\&.Remote\fR¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò¼ÂÁõ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£\fBrmic\fR¥³¥Þ¥ó¥É¤Ç¤Î¥¯¥é¥¹Ì¾¤Ï¡¢¤½¤Î¥¯¥é¥¹¤¬\fBjavac\fR¥³¥Þ¥ó¥É¤Ç¥³¥ó¥Ñ¥¤¥ë¤¬À®¸ù¤·¤Æ¤¤¤Æ¡¢¤«¤Ä´°Á´½¤¾þ¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ç¤¢¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Ë¼¨¤¹¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë̾\fBHelloImpl\fR¤Ç\fBrmic\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢hello¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸¤Î̾Á°¤ÎÉÕ¤¤¤¿)¤Ë\fBHelloImpl_Stub\&.class \fR¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmic hello\&.HelloImpl ++\fBrmic hello\&.HelloImpl\fR ++ + .fi + .if n \{\ + .RE +@@ -95,9 +98,9 @@ + .PP + ¥¹¥¿¥Ö¤È¤Ï¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¯¥é¥¤¥¢¥ó¥È¦¤Ç¤ÎÂåÍý¤Ç¤¹¡£¥¹¥¿¥Ö¤Ï¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥á¥½¥Ã¥É¸Æ½Ð¤·¤ò¡¢¼Âʪ¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¾ïÃ󤹤륵¡¼¥Ð¡¼¤ÈÄÌ¿®¤¹¤ëÌò³ä¤ò»ý¤Á¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î»²¾È¤Ï¡¢¼ÂºÝ¤Ï¥í¡¼¥«¥ë¡¦¥¹¥¿¥Ö¤Ø¤Î»²¾È¤È¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥Ç¥Õ¥©¥ë¥È¤Ç\fIrmic\fR¥³¥Þ¥ó¥É¤Ï¡¢1\&.2 JRMP¥¹¥¿¥Ö¡¦¥×¥í¥È¥³¥ë¡¦¥Ð¡¼¥¸¥ç¥ó¤Î¤ß¤ò»ÈÍѤ¹¤ë¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fI\-v1\&.2\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸Æ°ºî¤Ç¤¹¡£¥ê¥ê¡¼¥¹5\&.0°ÊÁ°¤Ç¤Ï\fI\-vcompat\fR¥ª¥×¥·¥ç¥ó¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤·¤¿¡£IIOP¥×¥í¥È¥³¥ëÍѤΥ¹¥¿¥Ö¤ª¤è¤ÓTie¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¤Ë¤Ï\fI\-iiop\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç\fBrmic\fR¥³¥Þ¥ó¥É¤Ï¡¢1\&.2 JRMP¥¹¥¿¥Ö¡¦¥×¥í¥È¥³¥ë¡¦¥Ð¡¼¥¸¥ç¥ó¤Î¤ß¤ò»ÈÍѤ¹¤ë¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤ì¤Ï¡¢\fB\-v1\&.2\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸Æ°ºî¤Ç¤¹¡£¥ê¥ê¡¼¥¹5\&.0°ÊÁ°¤Ç¤Ï\fB\-vcompat\fR¥ª¥×¥·¥ç¥ó¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤·¤¿¡£IIOP¥×¥í¥È¥³¥ëÍѤΥ¹¥¿¥Ö¤ª¤è¤ÓTie¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¤Ë¤Ï\fB\-iiop\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-¥¹¥¿¥Ö¤Ï¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¤ß¤ò¼ÂÁõ¤·¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¼ÂÁõ¤¹¤ë¥í¡¼¥«¥ë¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¼ÂÁõ¤·¤Æ¤¤¤Þ¤»¤ó¡£JRMP¥¹¥¿¥Ö¤Ï¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¼ÂÁõ¤¹¤ë¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÈƱ¤¸¤â¤Î¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢¥­¥ã¥¹¥È¤ä·¿¥Á¥§¥Ã¥¯¤ËJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÁȤ߹þ¤Þ¤ì¤¿±é»»»Ò¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£IIOP¤Î¾ì¹ç¤Ï¡¢\fIPortableRemoteObject\&.narrow\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¥¹¥¿¥Ö¤Ï¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Î¤ß¤ò¼ÂÁõ¤·¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¼ÂÁõ¤¹¤ë¥í¡¼¥«¥ë¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¼ÂÁõ¤·¤Æ¤¤¤Þ¤»¤ó¡£JRMP¥¹¥¿¥Ö¤Ï¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤¬¼ÂÁõ¤¹¤ë¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÈƱ¤¸¤â¤Î¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¥¯¥é¥¤¥¢¥ó¥È¤Ï¡¢¥­¥ã¥¹¥È¤ä·¿¥Á¥§¥Ã¥¯¤ËJava¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÁȤ߹þ¤Þ¤ì¤¿±é»»»Ò¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£IIOP¤Î¾ì¹ç¤Ï¡¢\fBPortableRemoteObject\&.narrow\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-bootclasspath \fIpath\fR +@@ -107,8 +110,8 @@ + .PP + \-classpath path + .RS 4 +-\fIrmic\fR¥³¥Þ¥ó¥É¤¬¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ä\fICLASSPATH\fR´Ä¶­ÊÑ¿ôÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥³¥í¥ó¤Çʬ³ä¤·¤Þ¤¹¡£¥Ñ¥¹¤Î°ìÈÌŪ¤Ê·Á¼°¤Ï\fI\&.;<your_path>\fR¤Ç¤¹¡£Îã: +-\fI\&.;/usr/local/java/classes\fR ++\fBrmic\fR¥³¥Þ¥ó¥É¤¬¥¯¥é¥¹¤òõ¤¹¤¿¤á¤Î¥Ñ¥¹¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ä\fBCLASSPATH\fR´Ä¶­ÊÑ¿ôÀßÄê¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥³¥í¥ó¤Çʬ³ä¤·¤Þ¤¹¡£¥Ñ¥¹¤Î°ìÈÌŪ¤Ê·Á¼°¤Ï\fB\&.;<your_path>\fR¤Ç¤¹¡£Îã: ++\fB\&.;/usr/local/java/classes\fR + .RE + .PP + \-d \fIdirectory\fR +@@ -119,12 +122,13 @@ + .RS 4 + .\} + .nf +-rmic \-d /java/classes exampleclass\&.MyClass ++\fBrmic \-d /java/classes exampleclass\&.MyClass\fR ++ + .fi + .if n \{\ + .RE + .\} +-\fI\-d\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ï\fI\-d\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¤ÈƱ¤¸¤Ç¤¹¡£¥¿¡¼¥²¥Ã¥È¡¦¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸³¬Áؤ¬¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢stub/tie/skeleton¥Õ¥¡¥¤¥ë¤¬³ÊǼ¤µ¤ì¤Þ¤¹¡£°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Î\fIrmic\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fI\-d\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸³¬ÁؤϺîÀ®¤µ¤ì¤º¡¢½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ï¤¹¤Ù¤Æ¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËľÀܳÊǼ¤µ¤ì¤Æ¤¤¤Þ¤·¤¿¡£ ++\fB\-d\fR¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ï\fB\-d\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¤ÈƱ¤¸¤Ç¤¹¡£¥¿¡¼¥²¥Ã¥È¡¦¥¯¥é¥¹¤Î¥Ñ¥Ã¥±¡¼¥¸³¬Áؤ¬¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËºîÀ®¤µ¤ì¡¢stub/tie/skeleton¥Õ¥¡¥¤¥ë¤¬³ÊǼ¤µ¤ì¤Þ¤¹¡£°ÊÁ°¤Î¥ê¥ê¡¼¥¹¤Î\fBrmic\fR¥³¥Þ¥ó¥É¤Ç¤Ï¡¢\fB\-d\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ñ¥Ã¥±¡¼¥¸³¬ÁؤϺîÀ®¤µ¤ì¤º¡¢½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ï¤¹¤Ù¤Æ¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ËľÀܳÊǼ¤µ¤ì¤Æ¤¤¤Þ¤·¤¿¡£ + .RE + .PP + \-extdirs \fIpath\fR +@@ -139,10 +143,10 @@ + .PP + \-idl + .RS 4 +-\fIrmic\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹¤ª¤è¤Ó»²¾È¤µ¤ì¤¿¥¯¥é¥¹¤ÎOMG IDL¤¬À¸À®¤µ¤ì¤Þ¤¹¡£IDL¤Ç¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë°Í¸¤»¤º¤Ë¡¢Àë¸À¤¹¤ë¤À¤±¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤ÎAPI¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£IDL¤Ï¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Ç¡¼¥¿¤Î»ÅÍͤȤ·¤Æ»ÈÍѤ·¤Þ¤¹¡£CORBA¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÄ󶡤¹¤ëǤ°Õ¤Î¸À¸ì¤Ç¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Ç¡¼¥¿¤ÎºîÀ®¤ª¤è¤Ó¸Æ½Ð¤·¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¸À¸ì¤Ë¤Ï¡¢Java¤ª¤è¤ÓC++¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/mapping/jidlMapping\&.html¤Î ++\fBrmic\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢»ØÄꤷ¤¿¥¯¥é¥¹¤ª¤è¤Ó»²¾È¤µ¤ì¤¿¥¯¥é¥¹¤ÎOMG IDL¤¬À¸À®¤µ¤ì¤Þ¤¹¡£IDL¤Ç¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë°Í¸¤»¤º¤Ë¡¢Àë¸À¤¹¤ë¤À¤±¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤ÎAPI¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£IDL¤Ï¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Ç¡¼¥¿¤Î»ÅÍͤȤ·¤Æ»ÈÍѤ·¤Þ¤¹¡£CORBA¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤òÄ󶡤¹¤ëǤ°Õ¤Î¸À¸ì¤Ç¡¢¥á¥½¥Ã¥É¤ª¤è¤Ó¥Ç¡¼¥¿¤ÎºîÀ®¤ª¤è¤Ó¸Æ½Ð¤·¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¸À¸ì¤Ë¤Ï¡¢Java¤ª¤è¤ÓC++¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/mapping/jidlMapping\&.html¤Î + ¡ÖJava IDL: IDL to Java Language Mapping¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .sp +-\fI\-idl\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï¡¢Â¾¤Î¥ª¥×¥·¥ç¥ó¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fB\-idl\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï¡¢Â¾¤Î¥ª¥×¥·¥ç¥ó¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -152,7 +156,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´û¸¤Î¥¹¥¿¥Ö/Tie/IDL¤¬ÆþÎÏ¥¯¥é¥¹¤è¤ê¤â¿·¤·¤¤¾ì¹ç¤Ç¤â¡¢\fI\-always\fR¤Þ¤¿¤Ï\fI\-alwaysgenerate\fR¥ª¥×¥·¥ç¥ó¤ÏºÆÀ¸À®¤ò¶¯À©¤·¤Þ¤¹¡£ ++´û¸¤Î¥¹¥¿¥Ö/Tie/IDL¤¬ÆþÎÏ¥¯¥é¥¹¤è¤ê¤â¿·¤·¤¤¾ì¹ç¤Ç¤â¡¢\fB\-always\fR¤Þ¤¿¤Ï\fB\-alwaysgenerate\fR¥ª¥×¥·¥ç¥ó¤ÏºÆÀ¸À®¤ò¶¯À©¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -163,7 +167,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-factory\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢À¸À®¤µ¤ì¤¿IDL¤Ç\fIfactory\fR¥­¡¼¥ï¡¼¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fB\-factory\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢À¸À®¤µ¤ì¤¿IDL¤Ç\fBfactory\fR¥­¡¼¥ï¡¼¥É¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -174,15 +178,10 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-The +-\fI\-idlModule\fR +-from J\fIavaPackage[\&.class]\fR +-\fItoIDLModule\fR +-specifies +-\fIIDLEntity\fR +-package mapping, for example: +-\fI\-idlModule\fR +-\fImy\&.module my::real::idlmod\fR\&. ++J\fBavaPackage[\&.class]\fR ++\fBtoIDLModule\fR¤Î\fB\-idlModule\fR¤Ï\fBIDLEntity\fR¥Ñ¥Ã¥±¡¼¥¸¡¦¥Þ¥Ã¥Ô¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£Îã: ++\fB\-idlModule\fR ++\fBmy\&.module my::real::idlmod\fR + .RE + .sp + .RS 4 +@@ -193,27 +192,25 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-idlFile\fR +-\fIfromJavaPackage[\&.class] toIDLFile\fR +-specifies +-\fIIDLEntity\fR +-file mapping, for example: +-\fI\-idlFile test\&.pkg\&.X TEST16\&.idl\fR\&. ++\fB\-idlFile\fR ++\fBfromJavaPackage[\&.class] toIDLFile\fR¤Ï\fBIDLEntity\fR¥Õ¥¡¥¤¥ë¡¦¥Þ¥Ã¥Ô¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£Îã: ++\fB\-idlFile test\&.pkg\&.X TEST16\&.idl\fR + .RE + .RE + .PP + \-iiop + .RS 4 +-\fIrmic\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢JRMP¤Î¥¹¥¿¥Ö¤È¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¤Î¤«¤ï¤ê¤Ë¡¢IIOP¤Î¥¹¥¿¥Ö¤ÈTie¥¯¥é¥¹¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤Ï¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¡¼¥«¥ë¡¦¥×¥í¥­¥·¤Ç¡¢¥¯¥é¥¤¥¢¥ó¥È¤«¤é¥µ¡¼¥Ð¡¼¤Ë¸Æ½Ð¤·¤òÁ÷¿®¤¹¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£³Æ¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ï¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤¬É¬ÍפǤ¹¡£¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤Ë¤è¤Ã¤Æ¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬¼ÂÁõ¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¤Ç¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ò»²¾È¤¹¤ë¤È¤­¤Ï¡¢¥¹¥¿¥Ö¤ò»²¾È¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¥¿¥¤¡¦¥¯¥é¥¹¤Ï¡¢¥µ¡¼¥Ð¡¼Â¦¤ÇÃå¸Æ¤ò½èÍý¤·¡¢¤½¤Î¸Æ½Ð¤·¤òŬÀڤʼÂÁõ¥¯¥é¥¹¤Ë¥Ç¥£¥¹¥Ñ¥Ã¥Á¤¹¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£³Æ¼ÂÁõ¥¯¥é¥¹¤Ë¤Ï¡¢¥¿¥¤¡¦¥¯¥é¥¹¤¬É¬ÍפǤ¹¡£ ++\fBrmic\fR¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢JRMP¤Î¥¹¥¿¥Ö¤È¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¤Î¤«¤ï¤ê¤Ë¡¢IIOP¤Î¥¹¥¿¥Ö¤ÈTie¥¯¥é¥¹¤¬À¸À®¤µ¤ì¤Þ¤¹¡£¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤Ï¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¡¼¥«¥ë¡¦¥×¥í¥­¥·¤Ç¡¢¥¯¥é¥¤¥¢¥ó¥È¤«¤é¥µ¡¼¥Ð¡¼¤Ë¸Æ½Ð¤·¤òÁ÷¿®¤¹¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£³Æ¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ï¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤¬É¬ÍפǤ¹¡£¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤Ë¤è¤Ã¤Æ¥ê¥â¡¼¥È¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬¼ÂÁõ¤µ¤ì¤Þ¤¹¡£¥¯¥é¥¤¥¢¥ó¥È¤Ç¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ò»²¾È¤¹¤ë¤È¤­¤Ï¡¢¥¹¥¿¥Ö¤ò»²¾È¤¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£¥¿¥¤¡¦¥¯¥é¥¹¤Ï¡¢¥µ¡¼¥Ð¡¼Â¦¤ÇÃå¸Æ¤ò½èÍý¤·¡¢¤½¤Î¸Æ½Ð¤·¤òŬÀڤʼÂÁõ¥¯¥é¥¹¤Ë¥Ç¥£¥¹¥Ñ¥Ã¥Á¤¹¤ë¤È¤­¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£³Æ¼ÂÁõ¥¯¥é¥¹¤Ë¤Ï¡¢¥¿¥¤¡¦¥¯¥é¥¹¤¬É¬ÍפǤ¹¡£ + .sp +-\fI\-iiop\fR¤ò»ÈÍѤ·¤Æ\fIrmic\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¼¡¤Î̿̾µ¬Â§¤Ë½àµò¤·¤¿¥¹¥¿¥Ö¤ÈTie¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ++\fB\-iiop\fR¤ò»ÈÍѤ·¤Æ\fBrmic\fR¥³¥Þ¥ó¥É¤ò¸Æ¤Ó½Ð¤¹¤È¡¢¼¡¤Î̿̾µ¬Â§¤Ë½àµò¤·¤¿¥¹¥¿¥Ö¤ÈTie¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-_<implementationName>_stub\&.class +-_<interfaceName>_tie\&.class ++\fB_<implementationName>_stub\&.class\fR ++\fB_<interfaceName>_tie\&.class\fR ++ + .fi + .if n \{\ + .RE +@@ -227,7 +224,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-iiop\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï¡¢Â¾¤Î¥ª¥×¥·¥ç¥ó¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ ++\fB\-iiop\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤­¤Ë¤Ï¡¢Â¾¤Î¥ª¥×¥·¥ç¥ó¤â»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -238,7 +235,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-´û¸¤Î¥¹¥¿¥Ö/Tie/IDL¤¬ÆþÎÏ¥¯¥é¥¹¤è¤ê¤â¿·¤·¤¤¾ì¹ç¤Ç¤â¡¢\fI\-always\fR¤Þ¤¿¤Ï\fI\-alwaysgenerate\fR¥ª¥×¥·¥ç¥ó¤ÏºÆÀ¸À®¤ò¶¯À©¤·¤Þ¤¹¡£ ++´û¸¤Î¥¹¥¿¥Ö/Tie/IDL¤¬ÆþÎÏ¥¯¥é¥¹¤è¤ê¤â¿·¤·¤¤¾ì¹ç¤Ç¤â¡¢\fB\-always\fR¤Þ¤¿¤Ï\fB\-alwaysgenerate\fR¥ª¥×¥·¥ç¥ó¤ÏºÆÀ¸À®¤ò¶¯À©¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -249,7 +246,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-nolocalstubs\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢Æ±¤¸¥×¥í¥»¥¹¤Î¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ËºÇŬ²½¤µ¤ì¤¿¥¹¥¿¥Ö¤ÏºîÀ®¤µ¤ì¤Þ¤»¤ó¡£ ++\fB\-nolocalstubs\fR¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢Æ±¤¸¥×¥í¥»¥¹¤Î¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ËºÇŬ²½¤µ¤ì¤¿¥¹¥¿¥Ö¤ÏºîÀ®¤µ¤ì¤Þ¤»¤ó¡£ + .RE + .sp + .RS 4 +@@ -260,7 +257,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-idl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fI\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢Á÷¿®¤µ¤ì¤ëIDL¤Ë\fIvaluetype\fR¥á¥½¥Ã¥É¤ª¤è¤Ó½é´ü²½»Ò¤òÄɲäǤ­¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤ª¤è¤Ó½é´ü²½»Ò¤Ï¡¢valuetype¤Î¾ì¹ç¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£\fI\-idl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë\fI\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤êÀ¸À®¤µ¤ì¤Þ¤¹¡£ ++\fB\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-idl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fB\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢Á÷¿®¤µ¤ì¤ëIDL¤Ë\fBvaluetype\fR¥á¥½¥Ã¥É¤ª¤è¤Ó½é´ü²½»Ò¤òÄɲäǤ­¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¤³¤Î¥á¥½¥Ã¥É¤ª¤è¤Ó½é´ü²½»Ò¤Ï¡¢valuetype¤Î¾ì¹ç¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£\fB\-idl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë\fB\-noValueMethods\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤êÀ¸À®¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -271,23 +268,23 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-poa\fR¥ª¥×¥·¥ç¥ó¤Ï·Ñ¾µ¤ò\fIorg\&.omg\&.CORBA_2_3\&.portable\&.ObjectImpl\fR¤«¤é\fIorg\&.omg\&.PortableServer\&.Servant\fR¤ËÊѹ¹¤·¤Þ¤¹¡£¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤Î\fIPortableServer\fR¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¤Î\fIServant\fR·¿¤òÄêµÁ¤·¤Þ¤¹¡£Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢\fIServant\fR·¿¤ÏJava¤Î\fIorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤Ë¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤ÎPOA¥µ¡¼¥Ð¥ó¥È¼ÂÁõ¤Î¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤È¤·¤Æµ¡Ç½¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¸Æ¤Ó½Ð¤¹¤³¤È¤Î¤Ç¤­¤ë¤¤¤¯¤Ä¤«¤Î¥á¥½¥Ã¥É¡¢¤ª¤è¤ÓPOA¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¡¢¥µ¡¼¥Ð¥ó¥È¤ÎÆ°ºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë¥æ¡¼¥¶¡¼¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤ë¥á¥½¥Ã¥É¤òÄ󶡤·¤Þ¤¹¡£OMG IDL to Java Language Mapping Specification¡¢CORBA V 2\&.3\&.1 ptc/00\-01\-08\&.pdf¤Ë½àµò¤·¤Æ¤¤¤Þ¤¹¡£ ++\fB\-poa\fR¥ª¥×¥·¥ç¥ó¤Ï·Ñ¾µ¤ò\fBorg\&.omg\&.CORBA_2_3\&.portable\&.ObjectImpl\fR¤«¤é\fBorg\&.omg\&.PortableServer\&.Servant\fR¤ËÊѹ¹¤·¤Þ¤¹¡£¥Ý¡¼¥¿¥Ö¥ë¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥¢¥À¥×¥¿(POA)¤Î\fBPortableServer\fR¥â¥¸¥å¡¼¥ë¤Ï¡¢¥Í¥¤¥Æ¥£¥Ö¤Î\fBServant\fR·¿¤òÄêµÁ¤·¤Þ¤¹¡£Java¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¢\fBServant\fR·¿¤ÏJava¤Î\fBorg\&.omg\&.PortableServer\&.Servant\fR¥¯¥é¥¹¤Ë¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹¡£¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤ÎPOA¥µ¡¼¥Ð¥ó¥È¼ÂÁõ¤Î¥Ù¡¼¥¹¡¦¥¯¥é¥¹¤È¤·¤Æµ¡Ç½¤·¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥×¥í¥°¥é¥Þ¤¬¸Æ¤Ó½Ð¤¹¤³¤È¤Î¤Ç¤­¤ë¤¤¤¯¤Ä¤«¤Î¥á¥½¥Ã¥É¡¢¤ª¤è¤ÓPOA¤Ë¤è¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¡¢¥µ¡¼¥Ð¥ó¥È¤ÎÆ°ºî¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë¥æ¡¼¥¶¡¼¤¬¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤­¤ë¥á¥½¥Ã¥É¤òÄ󶡤·¤Þ¤¹¡£OMG IDL to Java Language Mapping Specification¡¢CORBA V 2\&.3\&.1 ptc/00\-01\-08\&.pdf¤Ë½àµò¤·¤Æ¤¤¤Þ¤¹¡£ + .RE + .RE + .PP + \-J + .RS 4 +-Java¥³¥Þ¥ó¥É¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢\fI\-J\fR¥ª¥×¥·¥ç¥ó¤Ï\fI\-J\fR¤Î¸å¤í¤Ë³¤¯°ú¿ô¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤ËÅϤ·¤Þ¤¹(\fI\-J\fR¤È°ú¿ô¤Î´Ö¤Ë¥¹¥Ú¡¼¥¹¤ÏÆþ¤ì¤Þ¤»¤ó)¡£ ++Java¥³¥Þ¥ó¥É¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢\fB\-J\fR¥ª¥×¥·¥ç¥ó¤Ï\fB\-J\fR¤Î¸å¤í¤Ë³¤¯°ú¿ô¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤ËÅϤ·¤Þ¤¹(\fB\-J\fR¤È°ú¿ô¤Î´Ö¤Ë¥¹¥Ú¡¼¥¹¤ÏÆþ¤ì¤Þ¤»¤ó)¡£ + .RE + .PP + \-keep or \-keepgenerated + .RS 4 +-¥¹¥¿¥Ö¡¢¥¹¥±¥ë¥È¥ó¡¢¤Þ¤¿¤ÏTie¥¯¥é¥¹¤Î¤¿¤á¤ËÀ¸À®¤µ¤ì¤¿\fI\&.java\fR¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÊÝ»ý¤·¡¢\fI\&.class\fR¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë½ñ¤­¹þ¤ß¤Þ¤¹¡£ ++¥¹¥¿¥Ö¡¢¥¹¥±¥ë¥È¥ó¡¢¤Þ¤¿¤ÏTie¥¯¥é¥¹¤Î¤¿¤á¤ËÀ¸À®¤µ¤ì¤¿\fB\&.java\fR¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÊÝ»ý¤·¡¢\fB\&.class\fR¥Õ¥¡¥¤¥ë¤ÈƱ¤¸¥Ç¥£¥ì¥¯¥È¥ê¤Ë½ñ¤­¹þ¤ß¤Þ¤¹¡£ + .RE + .PP + \-nowarn + .RS 4 +-·Ù¹ð¤ò¥ª¥Õ¤Ë¤·¤Þ¤¹¡£\fI\-nowarn\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¡£¥³¥ó¥Ñ¥¤¥é¤Ï·Ù¹ð¤òɽ¼¨¤·¤Þ¤»¤ó¡£ ++·Ù¹ð¤ò¥ª¥Õ¤Ë¤·¤Þ¤¹¡£\fB\-nowarn\fR¥ª¥×¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¾ì¹ç¡£¥³¥ó¥Ñ¥¤¥é¤Ï·Ù¹ð¤òɽ¼¨¤·¤Þ¤»¤ó¡£ + .RE + .PP + \-nowrite +@@ -307,7 +304,7 @@ + .PP + \-v1\&.1 (Èó¿ä¾©) + .RS 4 +-1\&.1 JRMP¥¹¥¿¥Ö¡¦¥×¥í¥È¥³¥ë¡¦¥Ð¡¼¥¸¥ç¥ó¤Î¤ß¤Î¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£\fI\-v1\&.1\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢JDK 1\&.1¤«¤é\fIrmic\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¡¢¥¢¥Ã¥×¥°¥ì¡¼¥É¤Ç¤­¤Ê¤¤(¤µ¤é¤Ë¥À¥¤¥Ê¥ß¥Ã¥¯¡¦¥¯¥é¥¹¡¦¥í¡¼¥Ç¥£¥ó¥°¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤)¡¢´û¸¤ÎÀÅŪ¥Ç¥×¥í¥¤¤µ¤ì¤¿¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤ËÂФ·¡¢Ä¾Î󲽸ߴ¹À­¤Î¤¢¤ë¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£Ãí°Õ:¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++1\&.1 JRMP¥¹¥¿¥Ö¡¦¥×¥í¥È¥³¥ë¡¦¥Ð¡¼¥¸¥ç¥ó¤Î¤ß¤Î¥¹¥¿¥Ö¤ª¤è¤Ó¥¹¥±¥ë¥È¥ó¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£\fB\-v1\&.1\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¤Î¤Ï¡¢JDK 1\&.1¤«¤é\fBrmic\fR¥³¥Þ¥ó¥É¤ÇÀ¸À®¤µ¤ì¡¢¥¢¥Ã¥×¥°¥ì¡¼¥É¤Ç¤­¤Ê¤¤(¤µ¤é¤Ë¥À¥¤¥Ê¥ß¥Ã¥¯¡¦¥¯¥é¥¹¡¦¥í¡¼¥Ç¥£¥ó¥°¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤)¡¢´û¸¤ÎÀÅŪ¥Ç¥×¥í¥¤¤µ¤ì¤¿¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤ËÂФ·¡¢Ä¾Î󲽸ߴ¹À­¤Î¤¢¤ë¥¹¥¿¥Ö¡¦¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¾ì¹ç¤Î¤ß¤Ç¤¹¡£Ãí°Õ:¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÈó¿ä¾©¤Ë¤Ê¤ê¤Þ¤·¤¿¡£ÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-v1\&.2 (Èó¿ä¾©) +@@ -319,7 +316,7 @@ + CLASSPATH + .RS 4 + ¥æ¡¼¥¶¡¼ÄêµÁ¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ò¥·¥¹¥Æ¥à¤Ë»ØÄꤷ¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£Îã: +-\fI\&.:/usr/local/java/classes\fR ++\fB\&.:/usr/local/java/classes\fR + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/rmid.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/rmid.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: rmid +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: rmid ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "rmid" "1" "2013ǯ11·î21Æü" "JDK 8" "Remote Method Invocation (RMI)" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-rmid \- µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤¹¤ë¤È¡¢¥ª¥Ö¥¸¥§¥¯¥È¤òJava²¾ÁÛ¥Þ¥·¥ó(VM)¤ËÅÐÏ¿¤·¤Æ¥¢¥¯¥Æ¥£¥Ö²½¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ++.SH "̾Á°" ++rmid \- µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤¹¤ë¤È¡¢¥ª¥Ö¥¸¥§¥¯¥È¤òJava Virtual Machine(VM)¤ËÅÐÏ¿¤·¤Æ¥¢¥¯¥Æ¥£¥Ö²½¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIrmid\fR [\fIoptions\fR] ++\fBrmid\fR [\fIoptions\fR] + .fi + .if n \{\ + .RE +@@ -64,48 +66,50 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤·¤Þ¤¹¡£µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤·¤Æ¤«¤é¤Ç¤Ê¤¤¤È¡¢¥¢¥¯¥Æ¥£¥Ö²½²Äǽ¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥¯¥Æ¥£¥Ö²½¥·¥¹¥Æ¥à¤ËÅÐÏ¿¤·¤¿¤ê¡¢JVMÆâ¤Ç¥¢¥¯¥Æ¥£¥Ö²½¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£¥¢¥¯¥Æ¥£¥Ö²½²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ¹¤ë¥×¥í¥°¥é¥à¤ÎºîÀ®ÊýË¡¤Î¾ÜºÙ¤Ï¡¢\fI¥¢¥¯¥Æ¥£¥Ö²½¤Î»ÈÍÑ\fR¤Ë´Ø¤¹¤ë¥Á¥å¡¼¥È¥ê¥¢¥ë(http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/rmi/activation/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ ++\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤·¤Þ¤¹¡£µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤ò³«»Ï¤·¤Æ¤«¤é¤Ç¤Ê¤¤¤È¡¢¥¢¥¯¥Æ¥£¥Ö²½²Äǽ¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥¯¥Æ¥£¥Ö²½¥·¥¹¥Æ¥à¤ËÅÐÏ¿¤·¤¿¤ê¡¢JVMÆâ¤Ç¥¢¥¯¥Æ¥£¥Ö²½¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£¥¢¥¯¥Æ¥£¥Ö²½²Äǽ¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ¹¤ë¥×¥í¥°¥é¥à¤ÎºîÀ®ÊýË¡¤Î¾ÜºÙ¤Ï¡¢\fI¥¢¥¯¥Æ¥£¥Ö²½¤Î»ÈÍÑ\fR¤Ë´Ø¤¹¤ë¥Á¥å¡¼¥È¥ê¥¢¥ë(http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/rmi/activation/overview\&.html)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-\fIrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢¼¡¤Î¤è¤¦¤Ë¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Æ¡¢¥Ç¡¼¥â¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢¼¡¤Î¤è¤¦¤Ë¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Æ¡¢¥Ç¡¼¥â¥ó¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-J\-Djava\&.security\&.policy=rmid\&.policy ++\fBrmid \-J\-Djava\&.security\&.policy=rmid\&.policy\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIrmid\fR¥³¥Þ¥ó¥É¤ÎOracle¤Î¼ÂÁõ¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬µ¯Æ°¥°¥ë¡¼¥×ÍѤËJVM¤òµ¯Æ°¤¹¤ë¤¿¤á¤Ë³Æ\fIActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤǤ­¤ë¤«¤É¤¦¤«¤ò¸¡¾Ú¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ç¤¹Æäˡ¢\fIActivationGroupDesc\fR¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÅϤµ¤ì¤ë\fICommandEnvironment\fR¤äǤ°Õ¤Î¥×¥í¥Ñ¥Æ¥£¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÃæ¤ÇÌÀ¼¨Åª¤Ëµö²Ä¤¹¤ë¤³¤È¤¬É¬Íפˤʤê¤Þ¤·¤¿¡£\fIsun\&.rmi\&.activation\&.execPolicy\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢µ¯Æ°¥°¥ë¡¼¥×ÍѤËJVM¤òµ¯Æ°¤¹¤ë¤¿¤á¤Ë\fIActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤǤ­¤ë¤«¤É¤¦¤«¤òȽÃǤ¹¤ë¤È¤­¤Ë\fIrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ý¥ê¥·¡¼¤ò·èÄꤷ¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\-J\-Dsun\&.rmi\&.activation\&.execPolicy=policy¥ª¥×¥·¥ç¥ó¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤ÎOracle¤Î¼ÂÁõ¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬µ¯Æ°¥°¥ë¡¼¥×ÍѤËJVM¤òµ¯Æ°¤¹¤ë¤¿¤á¤Ë³Æ\fBActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤǤ­¤ë¤«¤É¤¦¤«¤ò¸¡¾Ú¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ç¤¹Æäˡ¢\fBActivationGroupDesc\fR¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÅϤµ¤ì¤ë\fBCommandEnvironment\fR¤äǤ°Õ¤Î¥×¥í¥Ñ¥Æ¥£¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Î¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÃæ¤ÇÌÀ¼¨Åª¤Ëµö²Ä¤¹¤ë¤³¤È¤¬É¬Íפˤʤê¤Þ¤·¤¿¡£\fBsun\&.rmi\&.activation\&.execPolicy\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢µ¯Æ°¥°¥ë¡¼¥×ÍѤËJVM¤òµ¯Æ°¤¹¤ë¤¿¤á¤Ë\fBActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤǤ­¤ë¤«¤É¤¦¤«¤òȽÃǤ¹¤ë¤È¤­¤Ë\fBrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥Ý¥ê¥·¡¼¤ò·èÄꤷ¤Þ¤¹¡£¾ÜºÙ¤Ï¡¢\-J\-Dsun\&.rmi\&.activation\&.execPolicy=policy¥ª¥×¥·¥ç¥ó¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È1098¤Ç¥¢¥¯¥Æ¥£¥Ù¡¼¥¿¤ÈÆâÉô¥ì¥¸¥¹¥È¥ê¤¬µ¯Æ°¤µ¤ì¡¢\fIActivationSystem\fR¤¬¤³¤ÎÆâÉô¥ì¥¸¥¹¥È¥êÆâ¤Î̾Á°\fIjava\&.rmi\&.activation\&.ActivationSystem\fR¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤È¡¢¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È1098¤Ç¥¢¥¯¥Æ¥£¥Ù¡¼¥¿¤ÈÆâÉô¥ì¥¸¥¹¥È¥ê¤¬µ¯Æ°¤µ¤ì¡¢\fBActivationSystem\fR¤¬¤³¤ÎÆâÉô¥ì¥¸¥¹¥È¥êÆâ¤Î̾Á°\fBjava\&.rmi\&.activation\&.ActivationSystem\fR¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Þ¤¹¡£ + .PP +-¥ì¥¸¥¹¥È¥ê¤Ë¾¤Î¥Ý¡¼¥È¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë\fI\-port\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥ì¥¸¥¹¥È¥ê¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È1099¤Ç¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤È¥ì¥¸¥¹¥È¥ê¤òµ¯Æ°¤·¤Þ¤¹¡£ ++¥ì¥¸¥¹¥È¥ê¤Ë¾¤Î¥Ý¡¼¥È¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë\fB\-port\fR¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥ì¥¸¥¹¥È¥ê¤Î¥Ç¥Õ¥©¥ë¥È¡¦¥Ý¡¼¥È1099¤Ç¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤È¥ì¥¸¥¹¥È¥ê¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-J\-Djava\&.security\&.policy=rmid\&.policy \-port 1099 ++\fBrmid \-J\-Djava\&.security\&.policy=rmid\&.policy \-port 1099\fR ++ + .fi + .if n \{\ + .RE + .\} + .SH "ɬÍפ˱þ¤¸¤ÆRMID¤ò³«»Ï" + .PP +-\fIrmid\fR¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é³«»Ï¤¹¤ë¤Ë¤Ï¡¢\fIinetd\fR +-(Oracle Solaris¤Î¾ì¹ç)¡¢¤Þ¤¿¤Ï\fIxinetd\fR +-(Linux¤Î¾ì¹ç)¤ò¹½À®¤·¤Æ\fIrmid\fR¤òɬÍפ˱þ¤¸¤Æ³«»Ï¤¹¤ëÊýË¡¤â¤¢¤ê¤Þ¤¹¡£ ++\fBrmid\fR¤ò¥³¥Þ¥ó¥É¹Ô¤«¤é³«»Ï¤¹¤ë¤Ë¤Ï¡¢\fBinetd\fR ++(Oracle Solaris¤Î¾ì¹ç)¡¢¤Þ¤¿¤Ï\fBxinetd\fR ++(Linux¤Î¾ì¹ç)¤ò¹½À®¤·¤Æ\fBrmid\fR¤òɬÍפ˱þ¤¸¤Æ³«»Ï¤¹¤ëÊýË¡¤â¤¢¤ê¤Þ¤¹¡£ + .PP +-RMID¤ò³«»Ï¤¹¤ë¤È¡¢\fISystem\&.inheritedChannel\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë(\fIinetd\fR/\fIxinetd\fR¤«¤é·Ñ¾µ)¤ò¼èÆÀ¤·¤è¤¦¤È¤·¤Þ¤¹¡£·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë¤¬null¤Ç¤¢¤ë¤«¡¢\fIjava\&.nio\&.channels\&.ServerSocketChannel\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¤Ê¤«¤Ã¤¿¾ì¹ç¡¢RMID¤Ï¤½¤Î¥Á¥ã¥ó¥Í¥ë¤Ï\fIinetd\fR/\fIxinetd\fR¤Ë¤è¤Ã¤Æµ¯Æ°¤µ¤ì¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¤ÈȽÃǤ·¡¢Á°½Ò¤Î¤è¤¦¤Ëµ¯Æ°¤·¤Þ¤¹¡£ ++RMID¤ò³«»Ï¤¹¤ë¤È¡¢\fBSystem\&.inheritedChannel\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë(\fBinetd\fR/\fBxinetd\fR¤«¤é·Ñ¾µ)¤ò¼èÆÀ¤·¤è¤¦¤È¤·¤Þ¤¹¡£·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë¤¬null¤Ç¤¢¤ë¤«¡¢\fBjava\&.nio\&.channels\&.ServerSocketChannel\fR¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¤Ê¤«¤Ã¤¿¾ì¹ç¡¢RMID¤Ï¤½¤Î¥Á¥ã¥ó¥Í¥ë¤Ï\fBinetd\fR/\fBxinetd\fR¤Ë¤è¤Ã¤Æµ¯Æ°¤µ¤ì¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¤ÈȽÃǤ·¡¢Á°½Ò¤Î¤è¤¦¤Ëµ¯Æ°¤·¤Þ¤¹¡£ + .PP +-·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë¤¬\fIServerSocketChannel\fR¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢RMID¤Ï¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¢¤Ä¤Þ¤ê\fIjava\&.rmi\&.activation\&.ActivationSystem\fR¤¬¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ë¥ì¥¸¥¹¥È¥ê¤È\fIjava\&.rmi\&.activation\&.Activator\fR¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë¥ê¥¯¥¨¥¹¥È¤ò¼õ¿®¤¹¤ë¥µ¡¼¥Ð¡¼¡¦¥½¥±¥Ã¥È¤È¤·¤Æ¡¢\fIServerSocketChannel\fR¤«¤é¼èÆÀ¤·¤¿\fIjava\&.net\&.ServerSocket\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢RMID¤ÎÆ°ºî¤Ï¡¢¼¡¤Î¤³¤È¤ò½ü¤¤¤Æ¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤éµ¯Æ°¤·¤¿¾ì¹ç¤ÈƱ¤¸¤Ç¤¹¡£ ++·Ñ¾µ¤µ¤ì¤¿¥Á¥ã¥ó¥Í¥ë¤¬\fBServerSocketChannel\fR¥¤¥ó¥¹¥¿¥ó¥¹¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢RMID¤Ï¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¢¤Ä¤Þ¤ê\fBjava\&.rmi\&.activation\&.ActivationSystem\fR¤¬¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ë¥ì¥¸¥¹¥È¥ê¤È\fBjava\&.rmi\&.activation\&.Activator\fR¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë¥ê¥¯¥¨¥¹¥È¤ò¼õ¿®¤¹¤ë¥µ¡¼¥Ð¡¼¡¦¥½¥±¥Ã¥È¤È¤·¤Æ¡¢\fBServerSocketChannel\fR¤«¤é¼èÆÀ¤·¤¿\fBjava\&.net\&.ServerSocket\fR¤ò»ÈÍѤ·¤Þ¤¹¡£¤³¤Î¥â¡¼¥É¤Ç¤Ï¡¢RMID¤ÎÆ°ºî¤Ï¡¢¼¡¤Î¤³¤È¤ò½ü¤¤¤Æ¡¢¥³¥Þ¥ó¥É¹Ô¤«¤éµ¯Æ°¤·¤¿¾ì¹ç¤ÈƱ¤¸¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -115,7 +119,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fISystem\&.err\fR¤ËÂФ¹¤ë½ÐÎϤϡ¢¥Õ¥¡¥¤¥ë¤Ë¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤ë¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï\fIjava\&.io\&.tmpdir\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç»ØÄꤵ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê(Ä̾ï¤Ï\fI/var/tmp\fR¤Þ¤¿¤Ï\fI/tmp\fR)¤Ë¤¢¤ë¡£¥Õ¥¡¥¤¥ë̾¤ÎÀÜƬ¼­¤Ï\fIrmid\-err\fR¤Ç¡¢ÀÜÈø¼­¤Ï\fItmp\fR¤Ç¤¢¤ë¡£ ++\fBSystem\&.err\fR¤ËÂФ¹¤ë½ÐÎϤϡ¢¥Õ¥¡¥¤¥ë¤Ë¥ê¥À¥¤¥ì¥¯¥È¤µ¤ì¤ë¡£¤³¤Î¥Õ¥¡¥¤¥ë¤Ï\fBjava\&.io\&.tmpdir\fR¥·¥¹¥Æ¥à¡¦¥×¥í¥Ñ¥Æ¥£¤Ç»ØÄꤵ¤ì¤ë¥Ç¥£¥ì¥¯¥È¥ê(Ä̾ï¤Ï\fB/var/tmp\fR¤Þ¤¿¤Ï\fB/tmp\fR)¤Ë¤¢¤ë¡£¥Õ¥¡¥¤¥ë̾¤ÎÀÜƬ¼­¤Ï\fBrmid\-err\fR¤Ç¡¢ÀÜÈø¼­¤Ï\fBtmp\fR¤Ç¤¢¤ë¡£ + .RE + .sp + .RS 4 +@@ -126,7 +130,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-port\fR¥ª¥×¥·¥ç¥ó¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢RMID¤Ï¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Æ½ªÎ»¤·¤Þ¤¹¡£ ++\fB\-port\fR¥ª¥×¥·¥ç¥ó¤Ï»ÈÍѤǤ­¤Þ¤»¤ó¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢RMID¤Ï¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Æ½ªÎ»¤·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -137,34 +141,36 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI\-log\fR¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢RMID¤Ï¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Æ½ªÎ»¤·¤Þ¤¹¡£ ++\fB\-log\fR¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢RMID¤Ï¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤Æ½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP +-ɬÍפ˱þ¤¸¤Æ¥µ¡¼¥Ó¥¹¤ò³«»Ï¤¹¤ë¤è¤¦¤Ë¹½À®¤¹¤ëÊýË¡¤Î¾ÜºÙ¤Ï¡¢\fIinetd\fR +-(Oracle Solaris¤Î¾ì¹ç)¡¢¤Þ¤¿¤Ï\fIxinetd\fR ++ɬÍפ˱þ¤¸¤Æ¥µ¡¼¥Ó¥¹¤ò³«»Ï¤¹¤ë¤è¤¦¤Ë¹½À®¤¹¤ëÊýË¡¤Î¾ÜºÙ¤Ï¡¢\fBinetd\fR ++(Oracle Solaris¤Î¾ì¹ç)¡¢¤Þ¤¿¤Ï\fBxinetd\fR + (Linux)¤Î¥Þ¥Ë¥å¥¢¥ë¡¦¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-C\fI¥ª¥×¥·¥ç¥ó\fR + .RS 4 +-\fIrmid\fR¥³¥Þ¥ó¥É¤Î»Ò¥×¥í¥»¥¹(µ¯Æ°¥°¥ë¡¼¥×)¤¬ºîÀ®¤µ¤ì¤¿¤È¤­¤Ë¡¢¤½¤ì¤¾¤ì¤Î»Ò¥×¥í¥»¥¹¤Ë¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤ë¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤹ¤ë¤È¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë³Æ²¾ÁÛ¥Þ¥·¥ó¤Ë¥×¥í¥Ñ¥Æ¥£¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤Î»Ò¥×¥í¥»¥¹(µ¯Æ°¥°¥ë¡¼¥×)¤¬ºîÀ®¤µ¤ì¤¿¤È¤­¤Ë¡¢¤½¤ì¤¾¤ì¤Î»Ò¥×¥í¥»¥¹¤Ë¥³¥Þ¥ó¥É¹Ô°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤ë¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¤è¤¦¤Ë»ØÄꤹ¤ë¤È¡¢µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë³Æ²¾ÁÛ¥Þ¥·¥ó¤Ë¥×¥í¥Ñ¥Æ¥£¤òÅϤ¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-C\-Dsome\&.property=value ++\fBrmid \-C\-Dsome\&.property=value\fR ++ + .fi + .if n \{\ + .RE + .\} +-¥³¥Þ¥ó¥É¥é¥¤¥ó°ú¿ô¤ò»Ò¥×¥í¥»¥¹¤ËÅϤ¹µ¡Ç½¤Ï¡¢¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î»ÒJVM¤Çserver\-call¥í¥®¥ó¥°¤¬²Äǽ¤Ç¤¹¡£ ++¥³¥Þ¥ó¥É¹Ô°ú¿ô¤ò»Ò¥×¥í¥»¥¹¤ËÅϤ¹µ¡Ç½¤Ï¡¢¥Ç¥Ð¥Ã¥°¤ò¹Ô¤¦¾ì¹ç¤ËÊØÍø¤Ç¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¥Þ¥ó¥É¤Ç¤Ï¡¢¤¹¤Ù¤Æ¤Î»ÒJVM¤Çserver\-call¥í¥®¥ó¥°¤¬²Äǽ¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-C\-Djava\&.rmi\&.server\&.logCalls=true ++\fBrmid \-C\-Djava\&.rmi\&.server\&.logCalls=true\fR ++ + .fi + .if n \{\ + .RE +@@ -173,13 +179,14 @@ + .PP + \-J\fIoption\fR + .RS 4 +-RMID¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava¥¤¥ó¥¿¥×¥ê¥¿¤ËÅϤ¹¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬\fIrmid\&.policy\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë»ØÄꤹ¤ë¤Ë¤Ï¡¢\fIrmid\fR¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fI\-J\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fIjava\&.security\&.policy\fR¥×¥í¥Ñ¥Æ¥£¤òÄêµÁ¤·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ ++RMID¤ò¼Â¹Ô¤·¤Æ¤¤¤ëJava¥¤¥ó¥¿¥×¥ê¥¿¤ËÅϤ¹¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬\fBrmid\&.policy\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë»ØÄꤹ¤ë¤Ë¤Ï¡¢\fBrmid\fR¤Î¥³¥Þ¥ó¥É¹Ô¤Ç\fB\-J\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢\fBjava\&.security\&.policy\fR¥×¥í¥Ñ¥Æ¥£¤òÄêµÁ¤·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmid \-J\-Djava\&.security\&.policy\-rmid\&.policy ++\fBrmid \-J\-Djava\&.security\&.policy\-rmid\&.policy\fR ++ + .fi + .if n \{\ + .RE +@@ -188,7 +195,7 @@ + .PP + \-J\-Dsun\&.rmi\&.activation\&.execPolicy=\fIpolicy\fR + .RS 4 +-µ¯Æ°¥°¥ë¡¼¥×¤¬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ëJVM¤Îµ¯Æ°¤Ë»ÈÍѤ¹¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤¿¤á¤Ë¡¢RMID¤¬ºÎÍѤ¹¤ë¥Ý¥ê¥·¡¼¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java RMIµ¯Æ°¥Ç¡¼¥â¥ó¤ÎOracle¤Î¼ÂÁõ¤Î¤ß¤Ë¸ºß¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¤³¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢·ë²Ì¤Ï\fI\-J\-Dsun\&.rmi\&.activation\&.execPolicy=default\fR¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£\fIpolicy\fR¤Ë»ØÄê²Äǽ¤ÊÃͤϡ¢\fIdefault\fR¡¢\fIpolicyClassName\fR¤Þ¤¿¤Ï\fInone\fR¤Ç¤¹¡£ ++µ¯Æ°¥°¥ë¡¼¥×¤¬¼Â¹Ô¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ëJVM¤Îµ¯Æ°¤Ë»ÈÍѤ¹¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤¿¤á¤Ë¡¢RMID¤¬ºÎÍѤ¹¤ë¥Ý¥ê¥·¡¼¤ò»ØÄꤷ¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢Java RMIµ¯Æ°¥Ç¡¼¥â¥ó¤ÎOracle¤Î¼ÂÁõ¤Î¤ß¤Ë¸ºß¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¥³¥Þ¥ó¥É¹Ô¤Ë¤³¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢·ë²Ì¤Ï\fB\-J\-Dsun\&.rmi\&.activation\&.execPolicy=default\fR¤ò»ØÄꤷ¤¿¾ì¹ç¤ÈƱ¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£\fBpolicy\fR¤Ë»ØÄê²Äǽ¤ÊÃͤϡ¢\fBdefault\fR¡¢\fBpolicyClassName\fR¤Þ¤¿¤Ï\fBnone\fR¤Ç¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -200,65 +207,66 @@ + .\} + ¥Ç¥Õ¥©¥ë¥È + .sp +-\fIdefault\fR¤Þ¤¿¤Ï̤»ØÄêÃͤÎ\fIexecPolicy\fR¤Î¾ì¹ç¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤Ç¤­¤ë¤Î¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¡¢¼Â¹Ô¤¹¤ë¸¢¸Â¤¬\fIrmid\fR¤ËÍ¿¤¨¤é¤ì¤Æ¤¤¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Î¤ß¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¼Â¹Ô¥Ý¥ê¥·¡¼¤Ç»ÈÍѤǤ­¤ë¤Î¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îµ¯Æ°¥°¥ë¡¼¥×¼ÂÁõ¤Î¤ß¤Ç¤¹¡£ ++\fBdefault\fR¤Þ¤¿¤Ï̤»ØÄêÃͤÎ\fBexecPolicy\fR¤Î¾ì¹ç¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤Ç¤­¤ë¤Î¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¡¢¼Â¹Ô¤¹¤ë¸¢¸Â¤¬\fBrmid\fR¤ËÍ¿¤¨¤é¤ì¤Æ¤¤¤ë¥³¥Þ¥ó¥É¤ª¤è¤Ó¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Î¤ß¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Î¼Â¹Ô¥Ý¥ê¥·¡¼¤Ç»ÈÍѤǤ­¤ë¤Î¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Îµ¯Æ°¥°¥ë¡¼¥×¼ÂÁõ¤Î¤ß¤Ç¤¹¡£ + .sp +-\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×ÍѤÎJVM¤òµ¯Æ°¤¹¤ë¤È¤­¤Ë¡¢¤½¤Î¥°¥ë¡¼¥×¤Ë¤Ä¤¤¤ÆÅÐÏ¿¤µ¤ì¤¿µ¯Æ°¥°¥ë¡¼¥×µ­½Ò»Ò¤Ç¤¢¤ë\fIActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤ·¤Þ¤¹¡£¥°¥ë¡¼¥×µ­½Ò»Ò¤Ï¡¢\fIActivationGroupDesc\&.CommandEnvironment\fR¤ò»ØÄꤷ¤Þ¤¹(¾Êά²Äǽ)¡£¤³¤ì¤Ë¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¥³¥Þ¥ó¥É¤È¡¢¤½¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤ËÄɲäǤ­¤ë¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ï\fIjava\&.home\fR¤Ë¤¢¤ë\fIjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£¥°¥ë¡¼¥×µ­½Ò»Ò¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¥ª¥×¥·¥ç¥ó¤È¤·¤ÆÄɲ䵤ì¤ë¥×¥í¥Ñ¥Æ¥£¡¦¥ª¡¼¥Ð¡¼¥é¥¤¥É¤â´Þ¤Þ¤ì¤Þ¤¹(\fI\-D<property>=<value>\fR¤È¤·¤ÆÄêµÁ¤µ¤ì¤Þ¤¹)¡£\fIcom\&.sun\&.rmi\&.rmid\&.ExecPermission\fR¸¢¸Â¤Ï\fIrmid\fR¥³¥Þ¥ó¥É¤Ë¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Ë¥°¥ë¡¼¥×µ­½Ò»Ò¤Î\fICommandEnvironment\fR¤Ç»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òÉÕÍ¿¤·¤Þ¤¹¡£\fIcom\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR¸¢¸Â¤Ïµ¯Æ°¥°¥ë¡¼¥×¤Î³«»Ï»þ¤Ë¡¢¥°¥ë¡¼¥×µ­½Ò»Ò¤Ç¥×¥í¥Ñ¥Æ¥£¡¦¥ª¡¼¥Ð¡¼¥é¥¤¥É¤È¤·¤Æ¡¢¤Þ¤¿¤Ï\fICommandEnvironment\fR¤Ç¥ª¥×¥·¥ç¥ó¤È¤·¤Æ»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Þ¤¹¡£\fIrmid\fR¥³¥Þ¥ó¥É¤ËÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òÉÕÍ¿¤¹¤ë¾ì¹ç¡¢¸¢¸Â\fIExecPermission\fR¤ª¤è¤Ó\fIExecOptionPermission\fR¤ò¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥½¡¼¥¹¤ËÉÕÍ¿¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×ÍѤÎJVM¤òµ¯Æ°¤¹¤ë¤È¤­¤Ë¡¢¤½¤Î¥°¥ë¡¼¥×¤Ë¤Ä¤¤¤ÆÅÐÏ¿¤µ¤ì¤¿µ¯Æ°¥°¥ë¡¼¥×µ­½Ò»Ò¤Ç¤¢¤ë\fBActivationGroupDesc\fRÆâ¤Î¾ðÊó¤ò»ÈÍѤ·¤Þ¤¹¡£¥°¥ë¡¼¥×µ­½Ò»Ò¤Ï¡¢\fBActivationGroupDesc\&.CommandEnvironment\fR¤ò»ØÄꤷ¤Þ¤¹(¾Êά²Äǽ)¡£¤³¤ì¤Ë¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¥³¥Þ¥ó¥É¤È¡¢¤½¤Î¥³¥Þ¥ó¥É¹Ô¤ËÄɲäǤ­¤ë¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ï\fBjava\&.home\fR¤Ë¤¢¤ë\fBjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£¥°¥ë¡¼¥×µ­½Ò»Ò¤Ë¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¤Ë¥ª¥×¥·¥ç¥ó¤È¤·¤ÆÄɲ䵤ì¤ë¥×¥í¥Ñ¥Æ¥£¡¦¥ª¡¼¥Ð¡¼¥é¥¤¥É¤â´Þ¤Þ¤ì¤Þ¤¹(\fB\-D<property>=<value>\fR¤È¤·¤ÆÄêµÁ¤µ¤ì¤Þ¤¹)¡£\fBcom\&.sun\&.rmi\&.rmid\&.ExecPermission\fR¸¢¸Â¤Ï\fBrmid\fR¥³¥Þ¥ó¥É¤Ë¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Ë¥°¥ë¡¼¥×µ­½Ò»Ò¤Î\fBCommandEnvironment\fR¤Ç»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òÉÕÍ¿¤·¤Þ¤¹¡£\fBcom\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR¸¢¸Â¤Ïµ¯Æ°¥°¥ë¡¼¥×¤Î³«»Ï»þ¤Ë¡¢¥°¥ë¡¼¥×µ­½Ò»Ò¤Ç¥×¥í¥Ñ¥Æ¥£¡¦¥ª¡¼¥Ð¡¼¥é¥¤¥É¤È¤·¤Æ¡¢¤Þ¤¿¤Ï\fBCommandEnvironment\fR¤Ç¥ª¥×¥·¥ç¥ó¤È¤·¤Æ»ØÄꤵ¤ì¤¿¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Þ¤¹¡£\fBrmid\fR¥³¥Þ¥ó¥É¤ËÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òÉÕÍ¿¤¹¤ë¾ì¹ç¡¢¸¢¸Â\fBExecPermission\fR¤ª¤è¤Ó\fBExecOptionPermission\fR¤ò¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥½¡¼¥¹¤ËÉÕÍ¿¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + \fBExecPermission\fR + .sp +-\fIExecPermission\fR¥¯¥é¥¹¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Ë\fIrmid\fR¥³¥Þ¥ó¥É¤¬ÆÃÄê¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òɽ¤·¤Þ¤¹¡£ ++\fBExecPermission\fR¥¯¥é¥¹¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Ë\fBrmid\fR¥³¥Þ¥ó¥É¤¬ÆÃÄê¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òɽ¤·¤Þ¤¹¡£ + .sp + \fB¹½Ê¸\fR: +-\fIExecPermission\fR¤Î̾Á°¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ë¼Â¹Ô¤òµö²Ä¤¹¤ë¥³¥Þ¥ó¥É¤Î¥Ñ¥¹Ì¾¤Ç¤¹¡£¥¹¥é¥Ã¥·¥å(/)¤ª¤è¤Ó¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ç½ª¤ï¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£¥¹¥é¥Ã¥·¥å¤Ï¥Õ¥¡¥¤¥ë¶èÀÚ¤êʸ»ú\fIFile\&.separatorChar\fR¤Ç¤¹¡£¥¹¥é¥Ã¥·¥å(/)¤ª¤è¤Ó¥Þ¥¤¥Ê¥¹Éä¹æ(\-)¤Ç½ª¤ï¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤È¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(ºÆµ¢Åª¤Ë)¤ò¼¨¤·¤Þ¤¹¡£¥Ñ¥¹Ì¾¤ËÆÃÊ̤ʥȡ¼¥¯¥ó\fI<<ALL FILES>>\fR¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢Ç¤°Õ¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£ ++\fBExecPermission\fR¤Î̾Á°¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ë¼Â¹Ô¤òµö²Ä¤¹¤ë¥³¥Þ¥ó¥É¤Î¥Ñ¥¹Ì¾¤Ç¤¹¡£¥¹¥é¥Ã¥·¥å(/)¤ª¤è¤Ó¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ç½ª¤ï¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£¥¹¥é¥Ã¥·¥å¤Ï¥Õ¥¡¥¤¥ë¶èÀÚ¤êʸ»ú\fBFile\&.separatorChar\fR¤Ç¤¹¡£¥¹¥é¥Ã¥·¥å(/)¤ª¤è¤Ó¥Þ¥¤¥Ê¥¹Éä¹æ(\-)¤Ç½ª¤ï¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤½¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤È¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê(ºÆµ¢Åª¤Ë)¤ò¼¨¤·¤Þ¤¹¡£Æüì¤Ê¥È¡¼¥¯¥ó\fB<<ALL FILES>>\fR¤Ç¹½À®¤µ¤ì¤ë¥Ñ¥¹Ì¾¤Ï¡¢¤É¤Î¥Õ¥¡¥¤¥ë¤È¤â°ìÃפ·¤Þ¤¹¡£ + .sp + ¥Ñ¥¹Ì¾¤Ë¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£¥Ñ¥¹Ì¾¤Ë¥Þ¥¤¥Ê¥¹Éä¹æ(\-)¤ò»ØÄꤷ¤¿¾ì¹ç¤Ï¡¢¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥êÆâ¤Î¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤ª¤è¤Ó(ºÆµ¢Åª¤Ë)¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥¡¥¤¥ë¤È¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ò¼¨¤·¤Þ¤¹¡£ + .sp + \fBExecOptionPermission\fR + .sp +-\fIExecOptionPermission\fR¥¯¥é¥¹¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤È¤­¤Ë\fIrmid\fR¥³¥Þ¥ó¥É¤ÇÆÃÄê¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¸¢¸Â¤òɽ¤·¤Þ¤¹¡£\fIExecOptionPermission\fR¤Î̾Á°¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ÎÃͤǤ¹¡£ ++\fBExecOptionPermission\fR¥¯¥é¥¹¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤È¤­¤Ë\fBrmid\fR¥³¥Þ¥ó¥É¤ÇÆÃÄê¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤǤ­¤ë¸¢¸Â¤òɽ¤·¤Þ¤¹¡£\fBExecOptionPermission\fR¤Î̾Á°¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ÎÃͤǤ¹¡£ + .sp + \fB¹½Ê¸\fR: ¥ª¥×¥·¥ç¥ó¤Ç¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É¤¬¸ÂÄêŪ¤Ë¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯¤Ï¡¢¥ï¥¤¥ë¥É¥«¡¼¥É¡¦¥Þ¥Ã¥Á¤òɽ¤·¤Þ¤¹¡£¥¢¥¹¥¿¥ê¥¹¥¯(*)¤Ï¡¢¥ª¥×¥·¥ç¥ó̾¤½¤Î¤â¤Î¤È¤·¤Æ»ÈÍѤǤ­¤Þ¤¹¡£¤Ä¤Þ¤ê¡¢Ç¤°Õ¤Î¥ª¥×¥·¥ç¥ó¤òɽ¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤Þ¤¿¡¢¥ª¥×¥·¥ç¥ó̾¤ÎËöÈø¤Ë»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤¿¤À¤·¡¢¥É¥Ã¥È(\&.)¤«Åù¹æ(=)¤Îľ¸å¤Ë¥¢¥¹¥¿¥ê¥¹¥¯(*)¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + Îã: +-\fI*\fR¤ä\fI\-Dmydir\&.*\fR¤ä\fI\-Da\&.b\&.c=*\fR¤ÏÍ­¸ú¤Ç¤¹¤¬¡¢\fI*mydir\fR¤ä\fI\-Da*b\fR¤ä\fIab*\fR¤Ï̵¸ú¤Ç¤¹¡£ ++\fB*\fR¤ä\fB\-Dmydir\&.*\fR¤ä\fB\-Da\&.b\&.c=*\fR¤ÏÍ­¸ú¤Ç¤¹¤¬¡¢\fB*mydir\fR¤ä\fB\-Da*b\fR¤ä\fBab*\fR¤Ï̵¸ú¤Ç¤¹¡£ + .sp + \fBrmid¤Î¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë\fR + .sp +-\fIrmid\fR¥³¥Þ¥ó¥É¤ËÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òµö²Ä¤¹¤ë¾ì¹ç¤Ï¡¢¸¢¸Â\fIExecPermission\fR¤ª¤è¤Ó\fIExecOptionPermission\fR¤ò¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥½¡¼¥¹¤ËÉÕÍ¿¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(ÈÆÍÑŪ¤Ë)¡£¤³¤ì¤é¤Î¸¢¸Â¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤Î¤Ï\fIrmid\fR¥³¥Þ¥ó¥É¤Î¤ß¤Ê¤Î¤Ç¡¢¤³¤ì¤é¤Î¸¢¸Â¤òÈÆÍÑŪ¤ËÉÕÍ¿¤·¤Æ¤â°ÂÁ´¤Ç¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤ËÍÍ¡¹¤Ê¥³¥Þ¥ó¥É¤ª¤è¤Ó¥ª¥×¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¸¢¸Â¤òµö²Ä¤¹¤ë¾ì¹ç¤Ï¡¢¸¢¸Â\fBExecPermission\fR¤ª¤è¤Ó\fBExecOptionPermission\fR¤ò¤¹¤Ù¤Æ¤Î¥³¡¼¥É¡¦¥½¡¼¥¹¤ËÉÕÍ¿¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹(ÈÆÍÑŪ¤Ë)¡£¤³¤ì¤é¤Î¸¢¸Â¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤Î¤Ï\fBrmid\fR¥³¥Þ¥ó¥É¤Î¤ß¤Ê¤Î¤Ç¡¢¤³¤ì¤é¤Î¸¢¸Â¤òÈÆÍÑŪ¤ËÉÕÍ¿¤·¤Æ¤â°ÂÁ´¤Ç¤¹¡£ + .sp +-\fIrmid\fR¥³¥Þ¥ó¥É¤Ë³Æ¼ï¤Î¼Â¹Ô¸¢¸Â¤òÉÕÍ¿¤¹¤ë¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÎã¤ò¡¢¼¡¤Ë¼¨¤·¤Þ¤¹¡£ ++\fBrmid\fR¥³¥Þ¥ó¥É¤Ë³Æ¼ï¤Î¼Â¹Ô¸¢¸Â¤òÉÕÍ¿¤¹¤ë¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ÎÎã¤ò¡¢¼¡¤Ë¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-grant { +- permission com\&.sun\&.rmi\&.rmid\&.ExecPermission +- "/files/apps/java/jdk1\&.7\&.0/solaris/bin/java"; ++\fBgrant {\fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecPermission\fR ++\fB "/files/apps/java/jdk1\&.7\&.0/solaris/bin/java";\fR ++\fB \fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecPermission\fR ++\fB "/files/apps/rmidcmds/*";\fR ++\fB \fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR ++\fB "\-Djava\&.security\&.policy=/files/policies/group\&.policy";\fR ++\fB \fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR ++\fB "\-Djava\&.security\&.debug=*";\fR ++\fB \fR ++\fB permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission\fR ++\fB "\-Dsun\&.rmi\&.*";\fR ++\fB};\fR + +- permission com\&.sun\&.rmi\&.rmid\&.ExecPermission +- "/files/apps/rmidcmds/*"; +- +- permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission +- "\-Djava\&.security\&.policy=/files/policies/group\&.policy"; +- +- permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission +- "\-Djava\&.security\&.debug=*"; +- +- permission com\&.sun\&.rmi\&.rmid\&.ExecOptionPermission +- "\-Dsun\&.rmi\&.*"; +-}; + .fi + .if n \{\ + .RE + .\} +-ºÇ½é¤ËÉÕÍ¿¤µ¤ì¤Æ¤¤¤ë¸¢¸Â¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¡¢¥Ñ¥¹Ì¾¤Ë¤è¤êÌÀ¼¨Åª¤Ë»ØÄꤵ¤ì¤ë\fIjava\fR¥³¥Þ¥ó¥É¤Î1\&.7\&.0¥ê¥ê¡¼¥¹¤Î¼Â¹Ô¤òµö²Ä¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIjava\&.home\fR¤Ë¤¢¤ë¥Ð¡¼¥¸¥ç¥ó¤Î\fIjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£\fIrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¤Î¤ÈƱ¤¸¥Ð¡¼¥¸¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¤¿¤á¡¢¤½¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£2ÈÖÌܤθ¢¸Â¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢¥Ç¥£¥ì¥¯¥È¥ê\fI/files/apps/rmidcmds\fRÆâ¤ÎǤ°Õ¤Î¥³¥Þ¥ó¥É¤Î¼Â¹Ô¸¢¸Â¤òµö²Ä¤·¤Þ¤¹¡£ ++ºÇ½é¤ËÉÕÍ¿¤µ¤ì¤Æ¤¤¤ë¸¢¸Â¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¡¢¥Ñ¥¹Ì¾¤Ë¤è¤êÌÀ¼¨Åª¤Ë»ØÄꤵ¤ì¤ë\fBjava\fR¥³¥Þ¥ó¥É¤Î1\&.7\&.0¥ê¥ê¡¼¥¹¤Î¼Â¹Ô¤òµö²Ä¤·¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBjava\&.home\fR¤Ë¤¢¤ë¥Ð¡¼¥¸¥ç¥ó¤Î\fBjava\fR¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Þ¤¹¡£\fBrmid\fR¥³¥Þ¥ó¥É¤¬»ÈÍѤ¹¤ë¤Î¤ÈƱ¤¸¥Ð¡¼¥¸¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¤¿¤á¡¢¤½¤Î¥³¥Þ¥ó¥É¤Ï¡¢¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤Ç»ØÄꤹ¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£2ÈÖÌܤθ¢¸Â¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢¥Ç¥£¥ì¥¯¥È¥ê\fB/files/apps/rmidcmds\fRÆâ¤ÎǤ°Õ¤Î¥³¥Þ¥ó¥É¤Î¼Â¹Ô¸¢¸Â¤òµö²Ä¤·¤Þ¤¹¡£ + .sp +-3ÈÖÌܤËÉÕÍ¿¤µ¤ì¤Æ¤¤¤ë¸¢¸Â\fIExecOptionPermission\fR¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò\fI/files/policies/group\&.policy\fR¤È¤·¤ÆÄêµÁ¤·¤Æ¤¤¤ëµ¯Æ°¥°¥ë¡¼¥×¤Î³«»Ï¤òµö²Ä¤·¤Þ¤¹¡£¼¡¤Î¸¢¸Â¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤¬\fIjava\&.security\&.debug property\fR¤ò»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£ºÇ¸å¤Î¸¢¸Â¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤¬\fIsun\&.rmi property\fR̾¤Î³¬ÁØÆâ¤ÎǤ°Õ¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£ ++3ÈÖÌܤËÉÕÍ¿¤µ¤ì¤Æ¤¤¤ë¸¢¸Â\fBExecOptionPermission\fR¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤ËÂФ·¤Æ¡¢¥»¥­¥å¥ê¥Æ¥£¡¦¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò\fB/files/policies/group\&.policy\fR¤È¤·¤ÆÄêµÁ¤·¤Æ¤¤¤ëµ¯Æ°¥°¥ë¡¼¥×¤Î³«»Ï¤òµö²Ä¤·¤Þ¤¹¡£¼¡¤Î¸¢¸Â¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤¬\fBjava\&.security\&.debug property\fR¤ò»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£ºÇ¸å¤Î¸¢¸Â¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤¬\fBsun\&.rmi property\fR̾¤Î³¬ÁØÆâ¤ÎǤ°Õ¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ÈÍѤ¹¤ë¤³¤È¤òµö²Ä¤·¤Æ¤¤¤Þ¤¹¡£ + .sp +-¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Æ\fIrmid\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢\fIrmid\fR¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç\fIjava\&.security\&.policy\fR¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ ++¥Ý¥ê¥·¡¼¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Æ\fBrmid\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢\fBrmid\fR¤Î¥³¥Þ¥ó¥É¹Ô¤Ç\fBjava\&.security\&.policy\fR¥×¥í¥Ñ¥Æ¥£¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ + .sp +-\fIrmid \-J\-Djava\&.security\&.policy=rmid\&.policy\fR\&. ++\fBrmid \-J\-Djava\&.security\&.policy=rmid\&.policy\fR\&. + .RE + .sp + .RS 4 +@@ -271,21 +279,22 @@ + .\} + <policyClassName> + .sp +-¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤Ï½½Ê¬¤Ê½ÀÆðÀ­¤¬ÆÀ¤é¤ì¤Ê¤¤¾ì¹ç¡¢´ÉÍý¼Ô¤Ï¡¢\fIrmid\fR¤Îµ¯Æ°»þ¤Ë¡¢\fIcheckExecCommand\fR¥á¥½¥Ã¥É¤¬½ê°¤¹¤ë¥¯¥é¥¹¤Î̾Á°¤ò»ØÄꤷ¤Æ¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤Ï½½Ê¬¤Ê½ÀÆðÀ­¤¬ÆÀ¤é¤ì¤Ê¤¤¾ì¹ç¡¢´ÉÍý¼Ô¤Ï¡¢\fBrmid\fR¤Îµ¯Æ°»þ¤Ë¡¢\fBcheckExecCommand\fR¥á¥½¥Ã¥É¤¬½ê°¤¹¤ë¥¯¥é¥¹¤Î̾Á°¤ò»ØÄꤷ¤Æ¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤¬¼Â¹Ô¤¹¤ë¥³¥Þ¥ó¥É¤ò¥Á¥§¥Ã¥¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + .sp +-\fIpolicyClassName\fR¤Ë¤Ï¡¢°ú¿ô¤Ê¤·¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤ò»ý¤Á¡¢¼¡¤Î¤è¤¦¤Ê\fIcheckExecCommand\fR¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ëpublic¥¯¥é¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBpolicyClassName\fR¤Ë¤Ï¡¢°ú¿ô¤Ê¤·¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤ò»ý¤Á¡¢¼¡¤Î¤è¤¦¤Ê\fBcheckExecCommand\fR¥á¥½¥Ã¥É¤ò¼ÂÁõ¤·¤Æ¤¤¤ëpublic¥¯¥é¥¹¤ò»ØÄꤷ¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- public void checkExecCommand(ActivationGroupDesc desc, String[] command) +- throws SecurityException; ++\fB public void checkExecCommand(ActivationGroupDesc desc, String[] command)\fR ++\fB throws SecurityException;\fR ++ + .fi + .if n \{\ + .RE + .\} +-µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ëÁ°¤Ë¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ý¥ê¥·¡¼¤Î\fIcheckExecCommand\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤Î¤È¤­¡¢µ¯Æ°¥°¥ë¡¼¥×¤Îµ­½Ò»Ò¤È¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Î´°Á´¤Ê¥³¥Þ¥ó¥É¤ò´Þ¤àÇÛÎó¤ò¤½¤Î¥á¥½¥Ã¥É¤ËÅϤ·¤Þ¤¹¡£\fIcheckExecCommand\fR¤¬\fISecurityException\fR¤ò¥¹¥í¡¼¤¹¤ë¤È¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¤½¤Îµ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤»¤º¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Îµ¯Æ°¤ò»î¹Ô¤·¤Æ¤¤¤ë¸Æ½Ð¤·Â¦¤Ë¤Ï\fIActivationException\fR¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ ++µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ëÁ°¤Ë¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢¥Ý¥ê¥·¡¼¤Î\fBcheckExecCommand\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£¤³¤Î¤È¤­¡¢µ¯Æ°¥°¥ë¡¼¥×¤Îµ­½Ò»Ò¤È¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¤¿¤á¤Î´°Á´¤Ê¥³¥Þ¥ó¥É¤ò´Þ¤àÇÛÎó¤ò¤½¤Î¥á¥½¥Ã¥É¤ËÅϤ·¤Þ¤¹¡£\fBcheckExecCommand\fR¤¬\fBSecurityException\fR¤ò¥¹¥í¡¼¤¹¤ë¤È¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¤½¤Îµ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤»¤º¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Îµ¯Æ°¤ò»î¹Ô¤·¤Æ¤¤¤ë¸Æ½Ð¤·Â¦¤Ë¤Ï\fBActivationException\fR¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -298,28 +307,29 @@ + .\} + none + .sp +-\fIsun\&.rmi\&.activation\&.execPolicy\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬\fInone\fR¤Î¾ì¹ç¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¥³¥Þ¥ó¥É¤ò¤Þ¤Ã¤¿¤¯¸¡¾Ú¤·¤Þ¤»¤ó¡£ ++\fBsun\&.rmi\&.activation\&.execPolicy\fR¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬\fBnone\fR¤Î¾ì¹ç¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤Ï¡¢µ¯Æ°¥°¥ë¡¼¥×¤ò³«»Ï¤¹¤ë¥³¥Þ¥ó¥É¤ò¤Þ¤Ã¤¿¤¯¸¡¾Ú¤·¤Þ¤»¤ó¡£ + .RE + .RE + .PP + \-log \fIdir\fR + .RS 4 +-µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤¬¥Ç¡¼¥¿¥Ù¡¼¥¹¤ª¤è¤Ó´ØÏ¢¾ðÊó¤ò½ñ¤­¹þ¤à¤Î¤Ë»ÈÍѤ¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fIrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ë¡¢log¤È¤¤¤¦¥í¥°¡¦¥Ç¥£¥ì¥¯¥È¥ê¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ ++µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤¬¥Ç¡¼¥¿¥Ù¡¼¥¹¤ª¤è¤Ó´ØÏ¢¾ðÊó¤ò½ñ¤­¹þ¤à¤Î¤Ë»ÈÍѤ¹¤ë¥Ç¥£¥ì¥¯¥È¥ê¤Î̾Á°¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢\fBrmid\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ë¡¢log¤È¤¤¤¦¥í¥°¡¦¥Ç¥£¥ì¥¯¥È¥ê¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-port \fIport\fR + .RS 4 +-¥ì¥¸¥¹¥È¥ê¤¬»ÈÍѤ¹¤ë¥Ý¡¼¥È¤ò»ØÄꤷ¤Þ¤¹¡£µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤Ï¡¢¤³¤Î¥ì¥¸¥¹¥È¥ê¤ÎÃæ¤Ç¡¢\fIjava\&.rmi\&.activation\&.ActivationSystem\fR¤È¤¤¤¦Ì¾Á°¤Ç\fIActivationSystem\fR¤ò¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£¥í¡¼¥«¥ë¡¦¥Þ¥·¥ó¾å¤Î\fIActivationSystem\fR¤Ï¡¢¼¡¤Î¤è¤¦¤Ë\fINaming\&.lookup\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤Ã¤Æ¼èÆÀ¤Ç¤­¤Þ¤¹¡£ ++¥ì¥¸¥¹¥È¥ê¤¬»ÈÍѤ¹¤ë¥Ý¡¼¥È¤ò»ØÄꤷ¤Þ¤¹¡£µ¯Æ°¥·¥¹¥Æ¥à¡¦¥Ç¡¼¥â¥ó¤Ï¡¢¤³¤Î¥ì¥¸¥¹¥È¥ê¤ÎÃæ¤Ç¡¢\fBjava\&.rmi\&.activation\&.ActivationSystem\fR¤È¤¤¤¦Ì¾Á°¤Ç\fBActivationSystem\fR¤ò¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£¥í¡¼¥«¥ë¡¦¥Þ¥·¥ó¾å¤Î\fBActivationSystem\fR¤Ï¡¢¼¡¤Î¤è¤¦¤Ë\fBNaming\&.lookup\fR¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤Ã¤Æ¼èÆÀ¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-import java\&.rmi\&.*; +- import java\&.rmi\&.activation\&.*; ++\fBimport java\&.rmi\&.*; \fR ++\fB import java\&.rmi\&.activation\&.*;\fR ++\fB \fR ++\fB ActivationSystem system; system = (ActivationSystem)\fR ++\fB Naming\&.lookup("//:port/java\&.rmi\&.activation\&.ActivationSystem");\fR + +- ActivationSystem system; system = (ActivationSystem) +- Naming\&.lookup("//:port/java\&.rmi\&.activation\&.ActivationSystem"); + .fi + .if n \{\ + .RE +@@ -328,14 +338,14 @@ + .PP + \-stop + .RS 4 +-\fI\-port\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿¥Ý¡¼¥È¤Î¡¢¸½ºß¤Î\fIrmid\fR¥³¥Þ¥ó¥É¤Î¸Æ½Ð¤·¤òÄä»ß¤·¤Þ¤¹¡£¥Ý¡¼¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ý¡¼¥È1098¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë\fIrmid\fR¤Î¸Æ½Ð¤·¤òÄä»ß¤·¤Þ¤¹¡£ ++\fB\-port\fR¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤¿¥Ý¡¼¥È¤Î¡¢¸½ºß¤Î\fBrmid\fR¥³¥Þ¥ó¥É¤Î¸Æ½Ð¤·¤òÄä»ß¤·¤Þ¤¹¡£¥Ý¡¼¥È¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¥Ý¡¼¥È1098¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë\fBrmid\fR¤Î¸Æ½Ð¤·¤òÄä»ß¤·¤Þ¤¹¡£ + .RE + .SH "´Ä¶­ÊÑ¿ô" + .PP + CLASSPATH + .RS 4 + ¥æ¡¼¥¶¡¼ÄêµÁ¥¯¥é¥¹¤Ø¤Î¥Ñ¥¹¤ò¥·¥¹¥Æ¥à¤Ë»ØÄꤷ¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤Ï¥³¥í¥ó¤Ç¶èÀÚ¤é¤ì¤Þ¤¹¡£Îã: +-\fI\&.:/usr/local/java/classes\fR ++\fB\&.:/usr/local/java/classes\fR + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/rmiregistry.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/rmiregistry.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: rmiregistry +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: rmiregistry ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "rmiregistry" "1" "2013ǯ11·î21Æü" "JDK 8" "Remote Method Invocation (RMI)" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + rmiregistry \- ¸½ºß¤Î¥Û¥¹¥È¤Î»ØÄꤷ¤¿¥Ý¡¼¥È¾å¤Ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤ò³«»Ï¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIrmiregistry\fR [ \fIport\fR ] ++\fBrmiregistry\fR [ \fIport\fR ] + .fi + .if n \{\ + .RE +@@ -64,17 +66,18 @@ + .PP + \fIport\fR + .RS 4 +-¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤ò³«»Ï¤¹¤ë¸½ºß¤Î¥Û¥¹¥È¾å¤Î\fIport\fR¤Î¿ô¡£ ++¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤ò³«»Ï¤¹¤ë¸½ºß¤Î¥Û¥¹¥È¾å¤Î\fBport\fR¤Î¿ô¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIrmiregistry\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥Û¥¹¥È¤Î»ØÄꤷ¤¿¥Ý¡¼¥È¾å¤Ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤òºîÀ®¤·¡¢³«»Ï¤·¤Þ¤¹¡£port¤Î»ØÄê¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥ì¥¸¥¹¥È¥ê¤Ï¥Ý¡¼¥È1099¤Ç³«»Ï¤·¤Þ¤¹¡£\fIrmiregistry\fR¥³¥Þ¥ó¥É¤Ë¡¢½ÐÎϵ¡Ç½¤Ï¤¢¤ê¤Þ¤»¤ó¡£Ä̾¤³¤ì¤Ï¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ ++\fBrmiregistry\fR¥³¥Þ¥ó¥É¤Ï¡¢¸½ºß¤Î¥Û¥¹¥È¤Î»ØÄꤷ¤¿¥Ý¡¼¥È¾å¤Ë¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¡¦¥ì¥¸¥¹¥È¥ê¤òºîÀ®¤·¡¢³«»Ï¤·¤Þ¤¹¡£port¤Î»ØÄê¤ò¾Êά¤·¤¿¾ì¹ç¡¢¥ì¥¸¥¹¥È¥ê¤Ï¥Ý¡¼¥È1099¤Ç³«»Ï¤·¤Þ¤¹¡£\fBrmiregistry\fR¥³¥Þ¥ó¥É¤Ë¡¢½ÐÎϵ¡Ç½¤Ï¤¢¤ê¤Þ¤»¤ó¡£Ä̾¤³¤ì¤Ï¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-rmiregistry & ++\fBrmiregistry &\fR ++ + .fi + .if n \{\ + .RE +@@ -84,14 +87,14 @@ + .PP + ¥ì¥¸¥¹¥È¥ê¤Ï¡¢°ìÈÌŪ¤Ë¡¢ºÇ½é¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î°ÌÃÖ¤ò»ØÄꤷ¤Þ¤¹¡£¤½¤³¤Ç¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¥á¥½¥Ã¥É¤ò¸Æ¤Ó½Ð¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¤½¤Î¸å¡¢¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó»ØÄê¤Î¥µ¥Ý¡¼¥È¤òÄ󶡤·¡¢Â¾¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òõ¤·¤Þ¤¹¡£ + .PP +-\fIjava\&.rmi\&.registry\&.LocateRegistry\fR¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¡¢¤Þ¤¿¤Ï¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤È¥Ý¡¼¥È¤ÇÆ°ºî¤¹¤ë¥ì¥¸¥¹¥È¥ê¤ò¼èÆÀ¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ ++\fBjava\&.rmi\&.registry\&.LocateRegistry\fR¥¯¥é¥¹¤Î¥á¥½¥Ã¥É¤Ï¡¢¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¡¢¤Þ¤¿¤Ï¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤È¥Ý¡¼¥È¤ÇÆ°ºî¤¹¤ë¥ì¥¸¥¹¥È¥ê¤ò¼èÆÀ¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ + .PP +-\fIjava\&.rmi\&.Naming\fR¥¯¥é¥¹¤ÎURL¥Ù¡¼¥¹¡¦¥á¥½¥Ã¥É¤Ï¥ì¥¸¥¹¥È¥ê¤ËÂФ·¤ÆÁàºî¤ò¼Â¹Ô¤·¡¢Ç¤°Õ¤Î¥Û¥¹¥È¤ª¤è¤Ó¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ç¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¸¡º÷¤Ë»ÈÍѤǤ­¤Þ¤¹¡£Ã±½ã̾(ʸ»úÎó)¤ò¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥Ð¥¤¥ó¥É¤·¡¢¿·¤·¤¤Ì¾Á°¤ò¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ËºÆ¥Ð¥¤¥ó¥É¤·(¸Å¤¤¥Ð¥¤¥ó¥É¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É)¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥ó¥Ð¥¤¥ó¥É¤·¡¢¥ì¥¸¥¹¥È¥ê¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ëURL¤ò¥ê¥¹¥Èɽ¼¨¤·¤Þ¤¹¡£ ++\fBjava\&.rmi\&.Naming\fR¥¯¥é¥¹¤ÎURL¥Ù¡¼¥¹¡¦¥á¥½¥Ã¥É¤Ï¥ì¥¸¥¹¥È¥ê¤ËÂФ·¤ÆÁàºî¤ò¼Â¹Ô¤·¡¢Ç¤°Õ¤Î¥Û¥¹¥È¤ª¤è¤Ó¥í¡¼¥«¥ë¡¦¥Û¥¹¥È¤Ç¤Î¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Î¸¡º÷¤Ë»ÈÍѤǤ­¤Þ¤¹¡£Ã±½ã̾(ʸ»úÎó)¤ò¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥Ð¥¤¥ó¥É¤·¡¢¿·¤·¤¤Ì¾Á°¤ò¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ËºÆ¥Ð¥¤¥ó¥É¤·(¸Å¤¤¥Ð¥¤¥ó¥É¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É)¡¢¥ê¥â¡¼¥È¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¢¥ó¥Ð¥¤¥ó¥É¤·¡¢¥ì¥¸¥¹¥È¥ê¤Ë¥Ð¥¤¥ó¥É¤µ¤ì¤Æ¤¤¤ëURL¤ò¥ê¥¹¥Èɽ¼¨¤·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-J + .RS 4 +-Java¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢\fI\-J\fR¤Î¸å¤í¤Ë³¤¯¥ª¥×¥·¥ç¥ó¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤Ë°ú¤­ÅϤ·¤Þ¤¹(\fI\-J\fR¤È¥ª¥×¥·¥ç¥ó¤Î´Ö¤Ë¥¹¥Ú¡¼¥¹¤ÏÆþ¤ì¤Þ¤»¤ó)¡£ ++Java¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢\fB\-J\fR¤Î¸å¤í¤Ë³¤¯¥ª¥×¥·¥ç¥ó¤òJava¥¤¥ó¥¿¥×¥ê¥¿¤Ë°ú¤­ÅϤ·¤Þ¤¹(\fB\-J\fR¤È¥ª¥×¥·¥ç¥ó¤Î´Ö¤Ë¥¹¥Ú¡¼¥¹¤ÏÆþ¤ì¤Þ¤»¤ó)¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +@@ -114,7 +117,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI¡Öjava\&.rmi\&.registry\&.LocateRegistry¡×\fR(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/registry/LocateRegistry\&.html) ++\fB¡Öjava\&.rmi\&.registry\&.LocateRegistry¡×\fR(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/registry/LocateRegistry\&.html) + .RE + .sp + .RS 4 +@@ -125,7 +128,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fI¡Öjava\&.rmi\&.Naming class description¡×\fR(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/Naming\&.html) ++\fB¡Öjava\&.rmi\&.Naming class description¡×\fR(http://docs\&.oracle\&.com/javase/8/docs/api/java/rmi/Naming\&.html) + .RE + .br + 'pl 8.5i +--- ./jdk/src/solaris/doc/sun/man/man1/ja/schemagen.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/schemagen.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: schemagen +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: schemagen ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "schemagen" "1" "2013ǯ11·î21Æü" "JDK 8" "Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + schemagen \- Java¥¯¥é¥¹Æâ¤Ç»²¾È¤µ¤ì¤Æ¤¤¤ë¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤´¤È¤Ë¥¹¥­¡¼¥Þ¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIschemagen\fR [ \fIoptions\fR ] \fIjava\-files\fR ++\fBschemagen\fR [ \fIoptions\fR ] \fIjava\-files\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIjava\-files\fR +@@ -76,40 +78,41 @@ + ¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤Ï¡¢Java¥¯¥é¥¹Æâ¤Ç»²¾È¤µ¤ì¤Æ¤¤¤ë¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤´¤È¤Ë1¤Ä¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£¸½ºß¡¢À¸À®¤µ¤ì¤ë¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ÏÀ©¸æ¤Ç¤­¤Þ¤»¤ó¡£¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë̾¤òÀ©¸æ¤¹¤ë¾ì¹ç¤Ï¡¢http://jaxb\&.java\&.net/nonav/2\&.2\&.3u1/docs/schemagenTask\&.html¤Ë¤¢¤ë + ¡ÖUsing SchemaGen with Ant¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Îbin¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ëŬÀÚ¤Ê\fIschemagen\fR¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤Æ¡¢¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤òµ¯Æ°¤·¤Þ¤¹¡£¸½ºß¤Î¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¤¤º¤ì¤â½èÍý¤Ç¤­¤Þ¤¹¡£ ++¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Îbin¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ëŬÀÚ¤Ê\fBschemagen\fR¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤Æ¡¢¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤òµ¯Æ°¤·¤Þ¤¹¡£¸½ºß¤Î¥¹¥­¡¼¥Þ¡¦¥¸¥§¥Í¥ì¡¼¥¿¤Ï¡¢Java¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤È¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤Î¤¤¤º¤ì¤â½èÍý¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-schemagen\&.sh Foo\&.java Bar\&.java \&.\&.\&. +-Note: Writing schema1\&.xsd ++\fBschemagen\&.sh Foo\&.java Bar\&.java \&.\&.\&.\fR ++\fBNote: Writing schema1\&.xsd\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-java¥Õ¥¡¥¤¥ë¤¬Â¾¤Î¥¯¥é¥¹¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ì¤é¤Î¥¯¥é¥¹¤Ë¥·¥¹¥Æ¥à\fICLASSPATH\fR´Ä¶­ÊÑ¿ô¤Ç¥¢¥¯¥»¥¹¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ\fIschemagen\fR¥³¥Þ¥ó¥É¡¦¥é¥¤¥ó¤Ç»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£»²¾È¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¡¢¤Þ¤¿¤Ï»²¾È¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¹¥­¡¼¥Þ¤ÎÀ¸À®»þ¤Ë¥¨¥é¡¼¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ++java¥Õ¥¡¥¤¥ë¤¬Â¾¤Î¥¯¥é¥¹¤ò»²¾È¤·¤Æ¤¤¤ë¾ì¹ç¡¢¤½¤ì¤é¤Î¥¯¥é¥¹¤Ë¥·¥¹¥Æ¥à\fBCLASSPATH\fR´Ä¶­ÊÑ¿ô¤Ç¥¢¥¯¥»¥¹¤Ç¤­¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¤Ï¡¢¥¯¥é¥¹¡¦¥Ñ¥¹¡¦¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ\fBschemagen\fR¥³¥Þ¥ó¥É¹Ô¤Ç»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£»²¾È¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¡¢¤Þ¤¿¤Ï»²¾È¤µ¤ì¤ë¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¹¥­¡¼¥Þ¤ÎÀ¸À®»þ¤Ë¥¨¥é¡¼¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-d \fIpath\fR + .RS 4 +-\fIschemagen\fR¥³¥Þ¥ó¥É¤¬¥×¥í¥»¥Ã¥µÀ¸À®¤ª¤è¤Ó\fIjavac\fRÀ¸À®¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ ++\fBschemagen\fR¥³¥Þ¥ó¥É¤¬¥×¥í¥»¥Ã¥µÀ¸À®¤ª¤è¤Ó\fBjavac\fRÀ¸À®¥¯¥é¥¹¡¦¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ + .RE + .PP + \-cp \fIpath\fR + .RS 4 +-\fIschemagen\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼»ØÄê¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ ++\fBschemagen\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼»ØÄê¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ + .RE + .PP + \-classpath \fIpath\fR + .RS 4 +-\fIschemagen\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼»ØÄê¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ ++\fBschemagen\fR¥³¥Þ¥ó¥É¤¬¥æ¡¼¥¶¡¼»ØÄê¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¡£ + .RE + .PP + \-encoding \fIencoding\fR + .RS 4 +-\fIapt\fR¤Þ¤¿¤Ï\fIjavac\fR¥³¥Þ¥ó¥É¤Î¸Æ½Ð¤·¤Ë»ÈÍѤ¹¤ë¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£ ++\fBapt\fR¤Þ¤¿¤Ï\fBjavac\fR¥³¥Þ¥ó¥É¤Î¸Æ½Ð¤·¤Ë»ÈÍѤ¹¤ë¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-episode \fIfile\fR +--- ./jdk/src/solaris/doc/sun/man/man1/ja/serialver.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/serialver.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: serialver +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: serialver ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Remote Method Invocation (RMI)¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "serialver" "1" "2013ǯ11·î21Æü" "JDK 8" "Remote Method Invocation (RMI)" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + serialver \- »ØÄꤷ¤¿¥¯¥é¥¹¤Î¥·¥ê¥¢¥ë¡¦¥Ð¡¼¥¸¥ç¥óUID¤òÌᤷ¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIserialver\fR [ \fIoptions\fR ] [ \fIclassnames\fR ] ++\fBserialver\fR [ \fIoptions\fR ] [ \fIclassnames\fR ] + .fi + .if n \{\ + .RE +@@ -64,16 +66,16 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIclassnames\fR + .RS 4 +-\fIserialVersionUID\fR¤òÌ᤹¥¯¥é¥¹¤Ç¤¹¡£ ++\fBserialVersionUID\fR¤òÌ᤹¥¯¥é¥¹¤Ç¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-\fIserialver\fR¥³¥Þ¥ó¥É¤Ï¡¢1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î\fIserialVersionUID\fR¤ò¡¢Å¸³«¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Ø¥³¥Ô¡¼¤¹¤ë¤Î¤ËŬ¤·¤¿·Á¼°¤ÇÊÖ¤·¤Þ¤¹¡£°ú¿ô¤Ê¤·¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¾ì¹ç¡¢\fIserialver\fR¥³¥Þ¥ó¥É¤Ï»ÈÍÑΨ¹Ô¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBserialver\fR¥³¥Þ¥ó¥É¤Ï¡¢1¤Ä°Ê¾å¤Î¥¯¥é¥¹¤Î\fBserialVersionUID\fR¤ò¡¢Å¸³«¤·¤Æ¤¤¤ë¥¯¥é¥¹¤Ø¥³¥Ô¡¼¤¹¤ë¤Î¤ËŬ¤·¤¿·Á¼°¤ÇÊÖ¤·¤Þ¤¹¡£°ú¿ô¤Ê¤·¤Ç¸Æ¤Ó½Ð¤µ¤ì¤¿¾ì¹ç¡¢\fBserialver\fR¥³¥Þ¥ó¥É¤Ï»ÈÍÑΨ¹Ô¤ò½ÐÎϤ·¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-classpath \fIpath\-files\fR +@@ -83,22 +85,23 @@ + .PP + \-show + .RS 4 +-´Êñ¤Ê¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òɽ¼¨¤·¤Þ¤¹¡£´°Á´»ØÄê¤Î¥¯¥é¥¹Ì¾¤òÆþÎϤ·¤Æ¡¢Enter¥­¡¼¤«¡Öɽ¼¨¡×¥Ü¥¿¥ó¤ò²¡¤·¡¢\fIserialVersionUID\fR¤òɽ¼¨¤·¤Þ¤¹¡£ ++´Êñ¤Ê¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òɽ¼¨¤·¤Þ¤¹¡£´°Á´»ØÄê¤Î¥¯¥é¥¹Ì¾¤òÆþÎϤ·¤Æ¡¢Enter¥­¡¼¤«¡Öɽ¼¨¡×¥Ü¥¿¥ó¤ò²¡¤·¡¢\fBserialVersionUID\fR¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£option¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "Ãí°Õ" + .PP +-\fIserialver\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤ò¤½¤Î²¾ÁÛ¥Þ¥·¥óÆâ¤ËÆɤ߹þ¤ó¤Ç½é´ü²½¤·¤Þ¤¹¤¬¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤ÎÀßÄê¤Ï¹Ô¤¤¤Þ¤»¤ó¡£¿®Íê¤Ç¤­¤Ê¤¤¥¯¥é¥¹¤È¤È¤â¤Ë\fIserialver\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤òÀßÄê¤Ç¤­¤Þ¤¹¡£ ++\fBserialver\fR¥³¥Þ¥ó¥É¤Ï¡¢»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤ò¤½¤Î²¾ÁÛ¥Þ¥·¥óÆâ¤ËÆɤ߹þ¤ó¤Ç½é´ü²½¤·¤Þ¤¹¤¬¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤ÎÀßÄê¤Ï¹Ô¤¤¤Þ¤»¤ó¡£¿®Íê¤Ç¤­¤Ê¤¤¥¯¥é¥¹¤È¤È¤â¤Ë\fBserialver\fR¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢¼¡¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¥»¥­¥å¥ê¥Æ¥£¡¦¥Þ¥Í¡¼¥¸¥ã¤òÀßÄê¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\-J\-Djava\&.security\&.manager ++\fB\-J\-Djava\&.security\&.manager\fR ++ + .fi + .if n \{\ + .RE +@@ -110,7 +113,8 @@ + .RS 4 + .\} + .nf +-\-J\-Djava\&.security\&.policy=<policy file> ++\fB\-J\-Djava\&.security\&.policy=<policy file>\fR ++ + .fi + .if n \{\ + .RE +@@ -137,7 +141,7 @@ + .IP \(bu 2.3 + .\} + http://docs\&.oracle\&.com/javase/8/docs/api/java/io/ObjectStreamClass\&.html¤Ë¤¢¤ë +-\fIjava\&.io\&.ObjectStream\fR¥¯¥é¥¹µ­½Ò ++\fBjava\&.io\&.ObjectStream\fR¥¯¥é¥¹µ­½Ò + .RE + .br + 'pl 8.5i +--- ./jdk/src/solaris/doc/sun/man/man1/ja/servertool.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/servertool.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: servertool +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: servertool ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "servertool" "1" "2013ǯ11·î21Æü" "JDK 8" "Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + servertool \- ³«È¯¼Ô¤¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¡¢Ää»ß¤¹¤ë¤¿¤á¤Î»È¤¤¤ä¤¹¤¤¥æ¡¼¥¶¡¼¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIservertool\fR \-ORBInitialPort \fInameserverport\fR [ \fIoptions\fR ] [ \fIcommands \fR] ++\fBservertool\fR \-ORBInitialPort \fInameserverport\fR [ \fIoptions\fR ] [ \fIcommands \fR] + .fi + .if n \{\ + .RE +@@ -64,35 +66,35 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + commands + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥³¥Þ¥ó¥É¡£¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥³¥Þ¥ó¥É¡£¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +-\fIservertool\fR\fIservertool >\fR\fIservertool >\fR ++\fBservertool\fR\fBservertool >\fR\fBservertool >\fR + .SH "ÀâÌÀ" + .PP +-\fIservertool\fR¥³¥Þ¥ó¥É¤Ï¡¢³«È¯¼Ô¤¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¡¢Ää»ß¤¹¤ë¤¿¤á¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥µ¡¼¥Ð¡¼¤Ë´Ø¤¹¤ëÍÍ¡¹¤ÊÅý·×¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¤Ï¡¢³«È¯¼Ô¤¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¡¢ÅÐÏ¿²ò½ü¡¢µ¯Æ°¡¢Ää»ß¤¹¤ë¤¿¤á¤Î¥³¥Þ¥ó¥É¹Ô¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄ󶡤·¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¤È¡¢¥µ¡¼¥Ð¡¼¤Ë´Ø¤¹¤ëÍÍ¡¹¤ÊÅý·×¾ðÊó¤ò¼èÆÀ¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-ORBInitialHost \fInameserverhost\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¤Ç¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¡¢Ãå¿®¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤¹¤ë¥Û¥¹¥È¡¦¥Þ¥·¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fInameserverhost\fRÃͤϡ¢\fIorb\fR¤¬¼Â¹Ô¤µ¤ì¡¢¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤·¤Æ¤¤¤ë¥Ý¡¼¥È¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢Ãͤϥǥե©¥ë¥È¤Ç\fIlocalhost\fR¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fIorbd\fR¤È\fIservertool\fR¤¬°Û¤Ê¤ë¥Þ¥·¥ó¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fIorbd\fR¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Û¥¹¥È¤Î̾Á°¤Þ¤¿¤ÏIP¥¢¥É¥ì¥¹¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤Ïɬ¿Ü¤Ç¤¹¡£¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¡¢Ãå¿®¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤¹¤ë¥Û¥¹¥È¡¦¥Þ¥·¥ó¤ò»ØÄꤷ¤Þ¤¹¡£\fBnameserverhost\fRÃͤϡ¢\fBorb\fR¤¬¼Â¹Ô¤µ¤ì¡¢¥ê¥¯¥¨¥¹¥È¤ò¥ê¥¹¥Ë¥ó¥°¤·¤Æ¤¤¤ë¥Ý¡¼¥È¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢Ãͤϥǥե©¥ë¥È¤Ç\fBlocalhost\fR¤ËÀßÄꤵ¤ì¤Þ¤¹¡£\fBorbd\fR¤È\fBservertool\fR¤¬°Û¤Ê¤ë¥Þ¥·¥ó¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fBorbd\fR¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Û¥¹¥È¤Î̾Á°¤Þ¤¿¤ÏIP¥¢¥É¥ì¥¹¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ + .sp + \fBÃí°Õ:\fR +-Oracle Solaris¤Ç¤Ï¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¾å¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fInameserverport\fRÃͤˤϡ¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ ++Oracle Solaris¤Ç¤Ï¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¾å¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¤Ë¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBnameserverport\fRÃͤˤϡ¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥³¥Þ¥ó¥É" + .PP +-\fIservertool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¤Þ¤¿¤Ï»ÈÍѤ»¤º¤Ëµ¯Æ°¤Ç¤­¤Þ¤¹¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¤Ï¡¢¥³¥Þ¥ó¥É¹Ô¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¤Æ¡¢¤Þ¤¿¤Ï»ÈÍѤ»¤º¤Ëµ¯Æ°¤Ç¤­¤Þ¤¹¡£ + .sp + .RS 4 + .ie n \{\ +@@ -102,8 +104,8 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIservertool\fR¤Îµ¯Æ°»þ¤Ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ä¡¼¥ë¤Ë¥³¥Þ¥ó¥ÉÆþÎϤòµá¤á¤ë\fIservertool\fR¥×¥í¥ó¥×¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹: +-\fIservertool >\fR¡£ ++\fBservertool\fR¤Îµ¯Æ°»þ¤Ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¡¢¥³¥Þ¥ó¥É¹Ô¥Ä¡¼¥ë¤Ë¥³¥Þ¥ó¥ÉÆþÎϤòµá¤á¤ë\fBservertool\fR¥×¥í¥ó¥×¥È¤¬É½¼¨¤µ¤ì¤Þ¤¹: ++\fBservertool >\fR¡£ + .RE + .sp + .RS 4 +@@ -114,23 +116,23 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-\fIservertool\fR¤Îµ¯Æ°»þ¤Ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Java IDL Server Tool¤¬µ¯Æ°¤·¤Æ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢½ªÎ»¤·¤Þ¤¹¡£ ++\fBservertool\fR¤Îµ¯Æ°»þ¤Ë¥³¥Þ¥ó¥É¤ò»ØÄꤷ¤¿¾ì¹ç¡¢Java IDL Server Tool¤¬µ¯Æ°¤·¤Æ¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¡¢½ªÎ»¤·¤Þ¤¹¡£ + .RE + .PP + register \-server \fIserver\-class\-name\fR \-classpath \fIclasspath\-to\-server\fR [ \-applicationName \fIapplication\-name\fR \-args \fIargs\-to\-server\fR \-vmargs \fIflags\-for\-JVM\fR ] + .RS 4 +-Object Request Broker Daemon (ORBD)¤Ë¿·µ¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬Ì¤ÅÐÏ¿¤Î¾ì¹ç¡¢ÅÐÏ¿¤·¤Æ¥¢¥¯¥Æ¥£¥Ö²½¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fI\-server\fR¥ª¥×¥·¥ç¥ó¤Ç¼±Ê̤µ¤ì¤ë¥µ¡¼¥Ð¡¼¤Î\fI¥á¥¤¥ó\fR¡¦¥¯¥é¥¹Æâ¤Ç¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤Ï¡¢\fIpublic static void install(org\&.omg\&.CORBA\&.ORB)\fR¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ê¡¢³«È¯¼Ô¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¡¦¥¹¥­¡¼¥Þ¤ÎºîÀ®¤Ê¤ÉÆȼ«¤Î¥µ¡¼¥Ð¡¼¡¦¥¤¥ó¥¹¥È¡¼¥ëÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++Object Request Broker Daemon (ORBD)¤Ë¿·µ¬±Ê³¥µ¡¼¥Ð¡¼¤òÅÐÏ¿¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬Ì¤ÅÐÏ¿¤Î¾ì¹ç¡¢ÅÐÏ¿¤·¤Æ¥¢¥¯¥Æ¥£¥Ö²½¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fB\-server\fR¥ª¥×¥·¥ç¥ó¤Ç¼±Ê̤µ¤ì¤ë¥µ¡¼¥Ð¡¼¤Î\fB¥á¥¤¥ó\fR¡¦¥¯¥é¥¹Æâ¤Ç¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£¤³¤Î¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤Ï¡¢\fBpublic static void install(org\&.omg\&.CORBA\&.ORB)\fR¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ê¡¢³«È¯¼Ô¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¡¦¥¹¥­¡¼¥Þ¤ÎºîÀ®¤Ê¤ÉÆȼ«¤Î¥µ¡¼¥Ð¡¼¡¦¥¤¥ó¥¹¥È¡¼¥ëÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + unregister \-serverid \fIserver\-id\fR | \-applicationName \fIapplication\-name\fR + .RS 4 +-¥µ¡¼¥Ð¡¼ID¤Þ¤¿¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó̾¤Ç¡¢¥µ¡¼¥Ð¡¼¤òORBD¤«¤éÅÐÏ¿²ò½ü¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fI\-server\fR¥ª¥×¥·¥ç¥ó¤Ç¼±Ê̤µ¤ì¤ë¥µ¡¼¥Ð¡¼¤Î\fI¥á¥¤¥ó\fR¡¦¥¯¥é¥¹Æâ¤Ç¥¢¥ó¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£ +-\fIuninstall\fR¥á¥½¥Ã¥É¤Ï¡¢\fIpublic static void uninstall(org\&.omg\&.CORBA\&.ORB)\fR¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fIuninstall\fR¥á¥½¥Ã¥É¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ê¡¢³«È¯¼Ô¤Ï\fIinstall\fR¥á¥½¥Ã¥É¤ÎÆ°ºî¤Î¼è¾Ã¤Ê¤É¡¢Æȼ«¤Î¥µ¡¼¥Ð¡¼¡¦¥¢¥ó¥¤¥ó¥¹¥È¡¼¥ëÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ ++¥µ¡¼¥Ð¡¼ID¤Þ¤¿¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó̾¤Ç¡¢¥µ¡¼¥Ð¡¼¤òORBD¤«¤éÅÐÏ¿²ò½ü¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Ë¤è¤Ã¤Æ¡¢\fB\-server\fR¥ª¥×¥·¥ç¥ó¤Ç¼±Ê̤µ¤ì¤ë¥µ¡¼¥Ð¡¼¤Î\fB¥á¥¤¥ó\fR¡¦¥¯¥é¥¹Æâ¤Ç¥¢¥ó¥¤¥ó¥¹¥È¡¼¥ë¡¦¥á¥½¥Ã¥É¤¬¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£ ++\fBuninstall\fR¥á¥½¥Ã¥É¤Ï¡¢\fBpublic static void uninstall(org\&.omg\&.CORBA\&.ORB)\fR¤Ë¤Ê¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£\fBuninstall\fR¥á¥½¥Ã¥É¤Ï¥ª¥×¥·¥ç¥ó¤Ç¤¢¤ê¡¢³«È¯¼Ô¤Ï\fBinstall\fR¥á¥½¥Ã¥É¤ÎÆ°ºî¤Î¼è¾Ã¤Ê¤É¡¢Æȼ«¤Î¥µ¡¼¥Ð¡¼¡¦¥¢¥ó¥¤¥ó¥¹¥È¡¼¥ëÆ°ºî¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ + .RE + .PP + getserverid \-applicationName \fIapplication\-name\fR + .RS 4 +-\fIapplication\-name\fRÃͤËÂбþ¤¹¤ë¥µ¡¼¥Ð¡¼ID¤òÊÖ¤·¤Þ¤¹¡£ ++\fBapplication\-name\fRÃͤËÂбþ¤¹¤ë¥µ¡¼¥Ð¡¼ID¤òÊÖ¤·¤Þ¤¹¡£ + .RE + .PP + list +@@ -150,22 +152,22 @@ + .PP + locate \-serverid \fIserver\-id\fR | \-applicationName \fIapplication\-name\fR [ \-endpointType \fIendpointType\fR ] + .RS 4 +-ÅÐÏ¿¤µ¤ì¤¿¥µ¡¼¥Ð¡¼¤ÇºîÀ®¤·¤¿¤¹¤Ù¤Æ¤ÎORB¤ÎÆÃÄê¤Î¥¿¥¤¥×¤Ë¤Ä¤¤¤Æ¥¨¥ó¥É¥Ý¥¤¥ó¥È(¥Ý¡¼¥È)¤ò¸¡½Ð¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£\fIendpointType\fRÃͤ¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥µ¡¼¥Ð¡¼¤ÎORB¤´¤È¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ëplain¥¿¥¤¥×¤Þ¤¿¤Ïnon\-protected¥¿¥¤¥×¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£ ++ÅÐÏ¿¤µ¤ì¤¿¥µ¡¼¥Ð¡¼¤ÇºîÀ®¤·¤¿¤¹¤Ù¤Æ¤ÎORB¤ÎÆÃÄê¤Î¥¿¥¤¥×¤Ë¤Ä¤¤¤Æ¥¨¥ó¥É¥Ý¥¤¥ó¥È(¥Ý¡¼¥È)¤ò¸¡½Ð¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£\fBendpointType\fRÃͤ¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥µ¡¼¥Ð¡¼¤ÎORB¤´¤È¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ëplain¥¿¥¤¥×¤Þ¤¿¤Ïnon\-protected¥¿¥¤¥×¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¤¬ÊÖ¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + locateperorb \-serverid \fIserver\-id\fR | \-applicationName \fIapplication\-name\fR [ \-orbid \fIORB\-name\fR ] + .RS 4 +-ÅÐÏ¿¤µ¤ì¤¿¥µ¡¼¥Ð¡¼¤ÎÆÃÄê¤ÎObject Request Broker (ORB)¤ÇÅÐÏ¿¤µ¤ì¤¿¥¨¥ó¥É¥Ý¥¤¥ó¥È(¥Ý¡¼¥È)¤ò¸¡½Ð¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£\fIorbid\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤÎ\fI""\fR¤¬\fIorbid\fR¤Ë³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ORB¤¬¶õʸ»úÎó¤Î\fIorbid\fR¤ÇºîÀ®¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ÅÐÏ¿¤·¤¿¥Ý¡¼¥È¤¬¤¹¤Ù¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£ ++ÅÐÏ¿¤µ¤ì¤¿¥µ¡¼¥Ð¡¼¤ÎÆÃÄê¤ÎObject Request Broker (ORB)¤ÇÅÐÏ¿¤µ¤ì¤¿¥¨¥ó¥É¥Ý¥¤¥ó¥È(¥Ý¡¼¥È)¤ò¸¡½Ð¤·¤Þ¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£\fBorbid\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥ÈÃͤÎ\fB""\fR¤¬\fBorbid\fR¤Ë³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£ORB¤¬¶õʸ»úÎó¤Î\fBorbid\fR¤ÇºîÀ®¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ÅÐÏ¿¤·¤¿¥Ý¡¼¥È¤¬¤¹¤Ù¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + orblist \-serverid \fIserver\-id\fR | \-applicationName \fIapplication\-name\fR + .RS 4 +-¥µ¡¼¥Ð¡¼¾å¤ËÄêµÁ¤µ¤ì¤¿ORB¤Î\fIORBId\fR¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£\fIORBId\fR¤Ï¥µ¡¼¥Ð¡¼¤ÇºîÀ®¤µ¤ì¤¿ORB¤Îʸ»úÎó̾¤Ç¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£ ++¥µ¡¼¥Ð¡¼¾å¤ËÄêµÁ¤µ¤ì¤¿ORB¤Î\fBORBId\fR¤ò°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£\fBORBId\fR¤Ï¥µ¡¼¥Ð¡¼¤ÇºîÀ®¤µ¤ì¤¿ORB¤Îʸ»úÎó̾¤Ç¤¹¡£¥µ¡¼¥Ð¡¼¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥Æ¥£¥Ö²½¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + shutdown \-serverid \fIserver\-id\fR | \-applicationName application\-name + .RS 4 +-ORBD¤ËÅÐÏ¿¤µ¤ì¤¿¥¢¥¯¥Æ¥£¥Ö¤Ê¥µ¡¼¥Ð¡¼¤òÄä»ß¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Î¼Â¹ÔÃæ¤Ë¡¢\fI\-serverid\fR¥Ñ¥é¥á¡¼¥¿¤Þ¤¿¤Ï\fI\-applicationName\fR¥Ñ¥é¥á¡¼¥¿¤Ç»ØÄꤵ¤ì¤¿¥¯¥é¥¹Æâ¤ËÄêµÁ¤µ¤ì¤¿\fIshutdown\fR¥á¥½¥Ã¥É¤â¸Æ¤Ó½Ð¤µ¤ì¤Æ¥µ¡¼¥Ð¡¼¡¦¥×¥í¥»¥¹¤òÄä»ß¤·¤Þ¤¹¡£ ++ORBD¤ËÅÐÏ¿¤µ¤ì¤¿¥¢¥¯¥Æ¥£¥Ö¤Ê¥µ¡¼¥Ð¡¼¤òÄä»ß¤·¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤Î¼Â¹ÔÃæ¤Ë¡¢\fB\-serverid\fR¥Ñ¥é¥á¡¼¥¿¤Þ¤¿¤Ï\fB\-applicationName\fR¥Ñ¥é¥á¡¼¥¿¤Ç»ØÄꤵ¤ì¤¿¥¯¥é¥¹Æâ¤ËÄêµÁ¤µ¤ì¤¿\fBshutdown\fR¥á¥½¥Ã¥É¤â¸Æ¤Ó½Ð¤µ¤ì¤Æ¥µ¡¼¥Ð¡¼¡¦¥×¥í¥»¥¹¤òÄä»ß¤·¤Þ¤¹¡£ + .RE + .PP + startup \-serverid \fIserver\-id\fR | \-applicationName application\-name +@@ -175,12 +177,12 @@ + .PP + help + .RS 4 +-\fIservertool\fR¥³¥Þ¥ó¥É¤ò²ð¤·¤Æ¥µ¡¼¥Ð¡¼¤¬ÍøÍѤǤ­¤ë¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤ò¥ê¥¹¥È¤·¤Þ¤¹¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¤ò²ð¤·¤Æ¥µ¡¼¥Ð¡¼¤¬ÍøÍѤǤ­¤ë¤¹¤Ù¤Æ¤Î¥³¥Þ¥ó¥É¤ò¥ê¥¹¥È¤·¤Þ¤¹¡£ + .RE + .PP + quit + .RS 4 +-\fIservertool\fR¥³¥Þ¥ó¥É¤ò½ªÎ»¤·¤Þ¤¹¡£ ++\fBservertool\fR¥³¥Þ¥ó¥É¤ò½ªÎ»¤·¤Þ¤¹¡£ + .RE + .SH "´ØÏ¢¹àÌÜ" + .sp +--- ./jdk/src/solaris/doc/sun/man/man1/ja/tnameserv.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/tnameserv.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: tnameserv +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: tnameserv ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "tnameserv" "1" "2013ǯ11·î21Æü" "JDK 8" "Java IDL¤ª¤è¤ÓRMI-IIOP¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + tnameserv \- ¥¤¥ó¥¿¥Õ¥§¡¼¥¹ÄêµÁ¸À¸ì(IDL)¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fItnameserve\fR \fI\-ORBInitialPort\fR [ \fInameserverport\fR ] ++\fBtnameserve\fR \fB\-ORBInitialPort\fR [ \fInameserverport\fR ] + .fi + .if n \{\ + .RE +@@ -64,16 +66,16 @@ + .PP + \-ORBInitialPort \fInameserverport\fR + .RS 4 +-¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤¬ORB¤Î\fIresolve_initial_references\fR¥á¥½¥Ã¥É¤È\fIlist_initial_references\fR¥á¥½¥Ã¥É¤Î¼ÂÁõ¤Ë»ÈÍѤ¹¤ë¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥×¥í¥È¥³¥ë¤ò¥ê¥¹¥Ë¥ó¥°¤¹¤ë½é´ü¥Ý¡¼¥È¤Ç¤¹¡£ ++¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤¬ORB¤Î\fBresolve_initial_references\fR¥á¥½¥Ã¥É¤È\fBlist_initial_references\fR¥á¥½¥Ã¥É¤Î¼ÂÁõ¤Ë»ÈÍѤ¹¤ë¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥×¥í¥È¥³¥ë¤ò¥ê¥¹¥Ë¥ó¥°¤¹¤ë½é´ü¥Ý¡¼¥È¤Ç¤¹¡£ + .RE + .SH "ÀâÌÀ" + .PP +-Java IDL¤Ë¤Ï¡¢Object Request Broker Daemon (ORBD)¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ORBD¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥µ¡¼¥Ó¥¹¡¢°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¡¢±Ê³¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ª¤è¤Ó¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò´Þ¤à¥Ç¡¼¥â¥ó¡¦¥×¥í¥»¥¹¤Ç¤¹¡£Java IDL¤Î¤¹¤Ù¤Æ¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ç¤ÏORBD¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¤¬¡¢°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ò»ÈÍѤ¹¤ëÎã¤Ç¤Ï¡¢\fIorbd\fR¤Î¤«¤ï¤ê¤Ë\fItnameserv\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++Java IDL¤Ë¤Ï¡¢Object Request Broker Daemon (ORBD)¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ORBD¤Ï¡¢¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥µ¡¼¥Ó¥¹¡¢°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¡¢±Ê³¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ª¤è¤Ó¥µ¡¼¥Ð¡¼¡¦¥Þ¥Í¡¼¥¸¥ã¤ò´Þ¤à¥Ç¡¼¥â¥ó¡¦¥×¥í¥»¥¹¤Ç¤¹¡£Java IDL¤Î¤¹¤Ù¤Æ¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ç¤ÏORBD¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¤¬¡¢°ì»þ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ò»ÈÍѤ¹¤ëÎã¤Ç¤Ï¡¢\fBorbd\fR¤Î¤«¤ï¤ê¤Ë\fBtnameserv\fR¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .PP +-http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/jidlNaming\&.html¤Ë¤¢¤ë +-orbd(1)¤Þ¤¿¤Ï¡ÖNaming Service¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++orbd(1)http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/jidlNaming\&.html ++¤Ë¤¢¤ë¤Þ¤¿¤Ï¡ÖNaming Service¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-CORBA¤ÎCOS (Common Object Services)¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤¬¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥Ç¥£¥ì¥¯¥È¥ê¹½Â¤¤òÄ󶡤·¤Æ¤¤¤ë¤Î¤ÈƱ¤¸¤è¤¦¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ËÂФ·¤Æ¥Ä¥ê¡¼¹½Â¤¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òÄ󶡤·¤Þ¤¹¡£Java IDL¤Î°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ç¤¢¤ë\fItnameserv\fR¤Ï¡¢COS¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Î»ÅÍͤòñ½ã¤Ê·Á¤Ç¼ÂÁõ¤·¤¿¤â¤Î¤Ç¤¹¡£ ++CORBA¤ÎCOS (Common Object Services)¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤¬¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ¥Ç¥£¥ì¥¯¥È¥ê¹½Â¤¤òÄ󶡤·¤Æ¤¤¤ë¤Î¤ÈƱ¤¸¤è¤¦¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ËÂФ·¤Æ¥Ä¥ê¡¼¹½Â¤¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òÄ󶡤·¤Þ¤¹¡£Java IDL¤Î°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ç¤¢¤ë\fBtnameserv\fR¤Ï¡¢COS¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Î»ÅÍͤòñ½ã¤Ê·Á¤Ç¼ÂÁõ¤·¤¿¤â¤Î¤Ç¤¹¡£ + .PP + ¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ï¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Ë̾Á°¤Ç³ÊǼ¤µ¤ì¡¢¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤È̾Á°¤Î¥Ú¥¢¤Ï¡¢¤½¤ì¤¾¤ì¥Í¡¼¥à¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤È¸Æ¤Ð¤ì¤Þ¤¹¡£¥Í¡¼¥à¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ËÁȤ߹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Ï¥Í¡¼¥à¡¦¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ç¤¢¤ê¡¢¥Õ¥¡¥¤¥ë¡¦¥·¥¹¥Æ¥à¤Î¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤ÈƱ¤¸ÊÔÀ®µ¡Ç½¤ò»ý¤Á¤Þ¤¹¡£¤¹¤Ù¤Æ¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î²¼¤Ë³ÊǼ¤µ¤ì¤Þ¤¹¡£½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Ï¡¢¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤ÎÍ£°ì¤Î±Ê³¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ç¤¹¡£Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¡¦¥×¥í¥»¥¹¤òÄä»ß¤·¤ÆºÆµ¯Æ°¤¹¤ë¤È¡¢»Ä¤ê¤Î¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Ï¼º¤ï¤ì¤Þ¤¹¡£ + .PP +@@ -81,28 +83,30 @@ + .SS "¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°" + .PP + Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Þ¤¿¤Ï¥¢¥×¥ì¥Ã¥È¤è¤êÁ°¤Ëµ¯Æ°¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£Java IDLÀ½Éʤò¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ë¤È¡¢Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òµ¯Æ°¤¹¤ë¥¹¥¯¥ê¥×¥È(Oracle Solaris: +-\fItnameserv\fR)¤Þ¤¿¤Ï¼Â¹Ô²Äǽ¥Õ¥¡¥¤¥ë(Windows: +-\fItnameserv\&.exe\fR)¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤ÇÆ°ºî¤¹¤ë¤è¤¦¤Ë¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤òµ¯Æ°¤·¤Æ¤¯¤À¤µ¤¤¡£ ++\fBtnameserv\fR)¤Þ¤¿¤Ï¼Â¹Ô²Äǽ¥Õ¥¡¥¤¥ë(Windows: ++\fBtnameserv\&.exe\fR)¤¬ºîÀ®¤µ¤ì¤Þ¤¹¡£¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤ÇÆ°ºî¤¹¤ë¤è¤¦¤Ë¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤òµ¯Æ°¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-Æä˻ØÄꤷ¤Ê¤¤¾ì¹ç¡¢Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢ORB¤Î\fIresolve_initial_references\fR¥á¥½¥Ã¥É¤È\fIlist_initial_references methods\fR¥á¥½¥Ã¥É¤Î¼ÂÁõ¤Ë»ÈÍѤ¹¤ë¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥×¥í¥È¥³¥ë¤ËÂФ·¤Æ¥Ý¡¼¥È900¤Ç¥ê¥¹¥Ë¥ó¥°¤·¤Þ¤¹¡£ ++Æä˻ØÄꤷ¤Ê¤¤¾ì¹ç¡¢Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Ï¡¢ORB¤Î\fBresolve_initial_references\fR¥á¥½¥Ã¥É¤È\fBlist_initial_references methods\fR¥á¥½¥Ã¥É¤Î¼ÂÁõ¤Ë»ÈÍѤ¹¤ë¥Ö¡¼¥È¥¹¥È¥é¥Ã¥×¡¦¥×¥í¥È¥³¥ë¤ËÂФ·¤Æ¥Ý¡¼¥È900¤Ç¥ê¥¹¥Ë¥ó¥°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-tnameserv \-ORBInitialPort nameserverport& ++\fBtnameserv \-ORBInitialPort nameserverport&\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¡¦¥Ý¡¼¥È¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¥Ý¡¼¥È900¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤Î¼Â¹Ô»þ¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¾ì¹ç¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£1050¤Î¤è¤¦¤ËÊ̤Υݡ¼¥È¤ò»ØÄꤷ¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢UNIX¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹¡£ ++¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¡¦¥Ý¡¼¥È¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¥Ý¡¼¥È900¤¬»ÈÍѤµ¤ì¤Þ¤¹¡£Oracle Solaris¥½¥Õ¥È¥¦¥§¥¢¤Î¼Â¹Ô»þ¡¢1024¤è¤ê¾®¤µ¤¤¥Ý¡¼¥È¤Ç¥×¥í¥»¥¹¤ò³«»Ï¤¹¤ë¾ì¹ç¤Ï¡¢root¥æ¡¼¥¶¡¼¤Ë¤Ê¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¤¿¤á¡¢1024°Ê¾å¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò»ÈÍѤ¹¤ë¤³¤È¤ò¤ªÁ¦¤á¤·¤Þ¤¹¡£1050¤Î¤è¤¦¤ËÊ̤Υݡ¼¥È¤ò»ØÄꤷ¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò¥Ð¥Ã¥¯¥°¥é¥¦¥ó¥É¤Ç¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢Solaris¡¢Linux¤Þ¤¿¤ÏOS X¥³¥Þ¥ó¥É¡¦¥·¥§¥ë¤Ç¼¡¤Î¤è¤¦¤ËÆþÎϤ·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-tnameserv \-ORBInitialPort 1050& ++\fBtnameserv \-ORBInitialPort 1050&\fR ++ + .fi + .if n \{\ + .RE +@@ -114,69 +118,73 @@ + .RS 4 + .\} + .nf +-start tnameserv \-ORBInitialPort 1050 ++\fBstart tnameserv \-ORBInitialPort 1050\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤Î¥¯¥é¥¤¥¢¥ó¥È¤Ë¤Ï¡¢¿·¤·¤¤¥Ý¡¼¥ÈÈÖ¹æ¤òÃΤ餻¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤ò¹Ô¤¦¤Ë¤Ï¡¢ORB¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®»þ¤Ë\fIorg\&.omg\&.CORBA\&.ORBInitialPort\fR¥×¥í¥Ñ¥Æ¥£¤Ë¿·¤·¤¤¥Ý¡¼¥ÈÈÖ¹æ¤òÀßÄꤷ¤Þ¤¹¡£ ++¥Í¡¼¥à¡¦¥µ¡¼¥Ð¡¼¤Î¥¯¥é¥¤¥¢¥ó¥È¤Ë¤Ï¡¢¿·¤·¤¤¥Ý¡¼¥ÈÈÖ¹æ¤òÃΤ餻¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤ì¤ò¹Ô¤¦¤Ë¤Ï¡¢ORB¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®»þ¤Ë\fBorg\&.omg\&.CORBA\&.ORBInitialPort\fR¥×¥í¥Ñ¥Æ¥£¤Ë¿·¤·¤¤¥Ý¡¼¥ÈÈÖ¹æ¤òÀßÄꤷ¤Þ¤¹¡£ + .SS "°Û¤Ê¤ë¥Û¥¹¥È¾å¤Ç¤Î¥µ¡¼¥Ð¡¼¤È¥¯¥é¥¤¥¢¥ó¥È¤Î¼Â¹Ô" + .PP + Java IDL¤ÈRMI\-IIOP¤Î¤Û¤È¤ó¤É¤Î¥Á¥å¡¼¥È¥ê¥¢¥ë¤Ç¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¡¢¥µ¡¼¥Ð¡¼¤ª¤è¤Ó¥¯¥é¥¤¥¢¥ó¥È¤Ï¤¹¤Ù¤Æ³«È¯ÍѤΥޥ·¥ó¾å¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¼ÂºÝ¤Ë¥Ç¥×¥í¥¤¥á¥ó¥È¤¹¤ë¾ì¹ç¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ò¡¢¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤È¤Ï°Û¤Ê¤ë¥Û¥¹¥È¡¦¥Þ¥·¥ó¾å¤Ç¼Â¹Ô¤¹¤ë¤³¤È¤¬Â¿¤¯¤Ê¤ê¤Þ¤¹¡£ + .PP +-¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤¬¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò¸«¤Ä¤±¤ë¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤¬¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤È¥Û¥¹¥È¤òǧ¼±¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤Î¤¿¤á¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤Î¥Õ¥¡¥¤¥ëÆâ¤Î\fIorg\&.omg\&.CORBA\&.ORBInitialPort\fR¥×¥í¥Ñ¥Æ¥£¤È\fIorg\&.omg\&.CORBA\&.ORBInitialHost\fR¥×¥í¥Ñ¥Æ¥£¤ò¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤È¥Þ¥·¥ó¤Î̾Á°¤ËÀßÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ï¡¢¡ÖGetting Started Using RMI\-IIOP¡× ++¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤¬¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ò¸«¤Ä¤±¤ë¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤¬¡¢¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤È¥Û¥¹¥È¤òǧ¼±¤·¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤Î¤¿¤á¤Ë¤Ï¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤Î¥Õ¥¡¥¤¥ëÆâ¤Î\fBorg\&.omg\&.CORBA\&.ORBInitialPort\fR¥×¥í¥Ñ¥Æ¥£¤È\fBorg\&.omg\&.CORBA\&.ORBInitialHost\fR¥×¥í¥Ñ¥Æ¥£¤ò¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤¬¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¥Ý¡¼¥È¤ÎÈÖ¹æ¤È¥Þ¥·¥ó¤Î̾Á°¤ËÀßÄꤷ¤Þ¤¹¡£¤³¤ÎÎã¤Ï¡¢¡ÖGetting Started Using RMI\-IIOP¡× + (http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/rmi\-iiop/rmiiiopexample\&.html)¤Ë¼¨¤µ¤ì¤Æ¤¤¤Þ¤¹ + .PP +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó\fI\-ORBInitialPort nameserverport#\fR¤È\fI\-ORBInitialHost nameserverhostname\fR¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ËÂФ·¤Æ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òõ¤¹¾ì½ê¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤³¤ì¤ò¹Ô¤¦ÊýË¡¤Î1¤Ä¤ÎÎã¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/tutorial/jidl2machines\&.html¤Î¡ÖJava IDL: The Hello World Example on Two Machines¡× ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó\fB\-ORBInitialPort nameserverport#\fR¤È\fB\-ORBInitialHost nameserverhostname\fR¤ò»ÈÍѤ·¤Æ¡¢¥¯¥é¥¤¥¢¥ó¥È¤È¥µ¡¼¥Ð¡¼¤ËÂФ·¤Æ¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òõ¤¹¾ì½ê¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤³¤ì¤ò¹Ô¤¦ÊýË¡¤Î1¤Ä¤ÎÎã¤Ï¡¢http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/tutorial/jidl2machines\&.html¤Î¡ÖJava IDL: The Hello World Example on Two Machines¡× + ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .PP +-¤¿¤È¤¨¤Ð¡¢°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹\fItnameserv\fR¤¬¡¢¥Û¥¹¥È\fInameserverhost\fR¤Î¥Ý¡¼¥È1050¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤¬¥Û¥¹¥È\fIclienthost\fR¾å¤Ç¼Â¹Ô¤µ¤ì¡¢¥µ¡¼¥Ð¡¼¤Ï¥Û¥¹¥È\fIserverhost\fR¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£ ++¤¿¤È¤¨¤Ð¡¢°ì»þ¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹\fBtnameserv\fR¤¬¡¢¥Û¥¹¥È\fBnameserverhost\fR¤Î¥Ý¡¼¥È1050¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£¤µ¤é¤Ë¡¢¥¯¥é¥¤¥¢¥ó¥È¤¬¥Û¥¹¥È\fBclienthost\fR¾å¤Ç¼Â¹Ô¤µ¤ì¡¢¥µ¡¼¥Ð¡¼¤Ï¥Û¥¹¥È\fBserverhost\fR¾å¤Ç¼Â¹Ô¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Þ¤¹¡£ + .PP +-¥Û¥¹¥È\fInameserverhost\fR¾å¤Ç\fItnameserv\fR¤òµ¯Æ°¤·¤Þ¤¹¡£ ++¥Û¥¹¥È\fBnameserverhost\fR¾å¤Ç\fBtnameserv\fR¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-tnameserv \-ORBInitialPort 1050 ++\fBtnameserv \-ORBInitialPort 1050\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIserverhost\fR¾å¤Ç¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBserverhost\fR¾å¤Ç¥µ¡¼¥Ð¡¼¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java Server \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost ++\fBjava Server \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP + +-\fIclienthost\fR¾å¤Ç¥¯¥é¥¤¥¢¥ó¥È¤òµ¯Æ°¤·¤Þ¤¹¡£ ++\fBclienthost\fR¾å¤Ç¥¯¥é¥¤¥¢¥ó¥È¤òµ¯Æ°¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-java Client \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost ++\fBjava Client \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost\fR ++ + .fi + .if n \{\ + .RE + .\} + .SS "¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤ÎÄä»ß" + .PP +-Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÄä»ß¤¹¤ë¤Ë¤Ï¡¢Unix¤Î¾ì¹ç¤Ï¡¢\fIkill\fR¤Ê¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¡¢Windows¤Î¾ì¹ç¤Ï¡¢\fI[Ctrl]+[C]\fR¥­¡¼¤ò»ÈÍѤ·¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÌÀ¼¨Åª¤ËÄä»ß¤¹¤ë¤Þ¤Ç¤Ï¡¢¸Æ½Ð¤·ÂÔµ¡¾õÂÖ¤¬Â³¤­¤Þ¤¹¡£¥µ¡¼¥Ó¥¹¤ò½ªÎ»¤µ¤»¤ë¤È¡¢Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë̾Á°¤Ï¼º¤ï¤ì¤Þ¤¹¡£ ++Java IDL¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÄä»ß¤¹¤ë¤Ë¤Ï¡¢Solaris¡¢Linux¤Þ¤¿¤ÏOS X¤Î¾ì¹ç¤Ï¡¢\fBkill\fR¤Ê¤É¤Î¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°¡¦¥·¥¹¥Æ¥à¤Î¥³¥Þ¥ó¥É¤ò»ÈÍѤ·¡¢Windows¤Î¾ì¹ç¤Ï¡¢\fB[Ctrl]+[C]\fR¥­¡¼¤ò»ÈÍѤ·¤Þ¤¹¡£¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤òÌÀ¼¨Åª¤ËÄä»ß¤¹¤ë¤Þ¤Ç¤Ï¡¢¸Æ½Ð¤·ÂÔµ¡¾õÂÖ¤¬Â³¤­¤Þ¤¹¡£¥µ¡¼¥Ó¥¹¤ò½ªÎ»¤µ¤»¤ë¤È¡¢Java IDL¥Í¡¼¥à¡¦¥µ¡¼¥Ó¥¹¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë̾Á°¤Ï¼º¤ï¤ì¤Þ¤¹¡£ + .SH "¥ª¥×¥·¥ç¥ó" + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ë\fIoption\fR¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ë\fBoption\fR¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "Îã" + .SS "¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Ø¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ÎÄɲÃ" +@@ -187,115 +195,122 @@ + .RS 4 + .\} + .nf +-Initial Naming Context +- plans +- Personal +- calendar +- schedule ++\fBInitial Naming Context\fR ++\fB plans\fR ++\fB Personal\fR ++\fB calendar\fR ++\fB schedule\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¤³¤ÎÎã¤Ç¡¢\fIplans\fR¤Ï¥ª¥Ö¥¸¥§¥¯¥È»²¾È¡¢\fIPersonal\fR¤Ï\fIcalendar\fR¤È\fIschedule\fR¤Î2¤Ä¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò´Þ¤à¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Ç¤¹¡£ ++¤³¤ÎÎã¤Ç¡¢\fBplans\fR¤Ï¥ª¥Ö¥¸¥§¥¯¥È»²¾È¡¢\fBPersonal\fR¤Ï\fBcalendar\fR¤È\fBschedule\fR¤Î2¤Ä¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò´Þ¤à¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Ç¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-import java\&.util\&.Properties; +-import org\&.omg\&.CORBA\&.*; +-import org\&.omg\&.CosNaming\&.*; ++\fBimport java\&.util\&.Properties;\fR ++\fBimport org\&.omg\&.CORBA\&.*;\fR ++\fBimport org\&.omg\&.CosNaming\&.*;\fR ++\fB \fR ++\fBpublic class NameClient {\fR + +-public class NameClient { +- +- public static void main(String args[]) { +- +- try { ++\fB public static void main(String args[]) {\fR ++ ++\fB try {\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤Ç¡¢\fInameserver\fR¤Ï¥Ý¡¼¥È1050¤Çµ¯Æ°¤µ¤ì¤Þ¤·¤¿¡£¼¡¤Î¥³¡¼¥É¤Ç¡¢¤³¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥¯¥é¥¤¥¢¥ó¥È¡¦¥·¥¹¥Æ¥à¤ËÃΤ餻¤Þ¤¹¡£ ++¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤Ç¡¢\fBnameserver\fR¤Ï¥Ý¡¼¥È1050¤Çµ¯Æ°¤µ¤ì¤Þ¤·¤¿¡£¼¡¤Î¥³¡¼¥É¤Ç¡¢¤³¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥¯¥é¥¤¥¢¥ó¥È¡¦¥·¥¹¥Æ¥à¤ËÃΤ餻¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- Properties props = new Properties(); +- props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050"); +- ORB orb = ORB\&.init(args, props); ++\fB Properties props = new Properties();\fR ++\fB props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050");\fR ++\fB ORB orb = ORB\&.init(args, props);\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ò¼èÆÀ¤·¡¢¤½¤ì¤ò\fIctx\fR¤ËÂåÆþ¤·¤Þ¤¹¡£2¹ÔÌܤǤϡ¢\fIctx\fR¤ò¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È\fIobjref\fR¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¤³¤Îobjref¤Ë¤Ï¡¢¤¢¤È¤ÇÍÍ¡¹¤Ê̾Á°¤ò³ä¤êÅö¤Æ¤Æ¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤ËÄɲä·¤Þ¤¹¡£ ++¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ò¼èÆÀ¤·¡¢¤½¤ì¤ò\fBctx\fR¤ËÂåÆþ¤·¤Þ¤¹¡£2¹ÔÌܤǤϡ¢\fBctx\fR¤ò¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È\fBobjref\fR¤Ë¥³¥Ô¡¼¤·¤Þ¤¹¡£¤³¤Îobjref¤Ë¤Ï¡¢¤¢¤È¤ÇÍÍ¡¹¤Ê̾Á°¤ò³ä¤êÅö¤Æ¤Æ¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤ËÄɲä·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- NamingContext ctx = +- NamingContextHelper\&.narrow( +- orb\&.resolve_initial_references("NameService")); +- NamingContext objref = ctx; ++\fB NamingContext ctx =\fR ++\fB NamingContextHelper\&.narrow(\fR ++\fB orb\&.resolve_initial_references("NameService"));\fR ++\fB NamingContext objref = ctx;\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢\fItext\fR¥¿¥¤¥×¤Î̾Á°\fIplans\fR¤òºîÀ®¤·¡¢¤½¤ì¤ò¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£¤½¤Î¸å¡¢\fIrebind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î²¼¤Ë\fIplans\fR¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£\fIrebind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢\fIbind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤¿¾ì¹ç¤ËȯÀ¸¤¹¤ëÎã³°¤òȯÀ¸¤µ¤»¤º¤Ë¡¢¤³¤Î¥×¥í¥°¥é¥à¤ò²¿Å٤ⷫÊÖ¤·¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ ++¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢\fBtext\fR¥¿¥¤¥×¤Î̾Á°\fBplans\fR¤òºîÀ®¤·¡¢¤½¤ì¤ò¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£¤½¤Î¸å¡¢\fBrebind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤Æ½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î²¼¤Ë\fBplans\fR¤òÄɲ䷤Ƥ¤¤Þ¤¹¡£\fBrebind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ¹¤ì¤Ð¡¢\fBbind\fR¥á¥½¥Ã¥É¤ò»ÈÍѤ·¤¿¾ì¹ç¤ËȯÀ¸¤¹¤ëÎã³°¤òȯÀ¸¤µ¤»¤º¤Ë¡¢¤³¤Î¥×¥í¥°¥é¥à¤ò²¿Å٤ⷫÊÖ¤·¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- NameComponent nc1 = new NameComponent("plans", "text"); +- NameComponent[] name1 = {nc1}; +- ctx\&.rebind(name1, objref); +- System\&.out\&.println("plans rebind successful!"); ++\fB NameComponent nc1 = new NameComponent("plans", "text");\fR ++\fB NameComponent[] name1 = {nc1};\fR ++\fB ctx\&.rebind(name1, objref);\fR ++\fB System\&.out\&.println("plans rebind successful!");\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢\fIdirectory\fR¥¿¥¤¥×¤Î\fIPersonal\fR¤È¤¤¤¦¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤òºîÀ®¤·¤Þ¤¹¡£¤½¤Î·ë²ÌÆÀ¤é¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È»²¾È\fIctx2\fR¤ò\fIname\fR¤Ë¥Ð¥¤¥ó¥É¤·¡¢½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ËÄɲä·¤Þ¤¹¡£ ++¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢\fBdirectory\fR¥¿¥¤¥×¤Î\fBPersonal\fR¤È¤¤¤¦¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤òºîÀ®¤·¤Þ¤¹¡£¤½¤Î·ë²ÌÆÀ¤é¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È»²¾È\fBctx2\fR¤ò\fBname\fR¤Ë¥Ð¥¤¥ó¥É¤·¡¢½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤ËÄɲä·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- NameComponent nc2 = new NameComponent("Personal", "directory"); +- NameComponent[] name2 = {nc2}; +- NamingContext ctx2 = ctx\&.bind_new_context(name2); +- System\&.out\&.println("new naming context added\&.\&."); ++\fB NameComponent nc2 = new NameComponent("Personal", "directory");\fR ++\fB NameComponent[] name2 = {nc2};\fR ++\fB NamingContext ctx2 = ctx\&.bind_new_context(name2);\fR ++\fB System\&.out\&.println("new naming context added\&.\&.");\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-»Ä¤ê¤Î¥³¡¼¥É¤Ç¤Ï¡¢¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò\fIschedule\fR¤È\fIcalendar\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È\fIPersonal\fR(\fIctx2\fR)¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£ ++»Ä¤ê¤Î¥³¡¼¥É¤Ç¤Ï¡¢¥À¥ß¡¼¤Î¥ª¥Ö¥¸¥§¥¯¥È»²¾È¤ò\fBschedule\fR¤È\fBcalendar\fR¤È¤¤¤¦Ì¾Á°¤Ç¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È\fBPersonal\fR(\fBctx2\fR)¤Ë¥Ð¥¤¥ó¥É¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- NameComponent nc3 = new NameComponent("schedule", "text"); +- NameComponent[] name3 = {nc3}; +- ctx2\&.rebind(name3, objref); +- System\&.out\&.println("schedule rebind successful!"); ++\fB NameComponent nc3 = new NameComponent("schedule", "text");\fR ++\fB NameComponent[] name3 = {nc3};\fR ++\fB ctx2\&.rebind(name3, objref);\fR ++\fB System\&.out\&.println("schedule rebind successful!");\fR ++\fB \fR ++\fB NameComponent nc4 = new NameComponent("calender", "text");\fR ++\fB NameComponent[] name4 = {nc4};\fR ++\fB ctx2\&.rebind(name4, objref);\fR ++\fB System\&.out\&.println("calender rebind successful!");\fR ++\fB } catch (Exception e) {\fR ++\fB e\&.printStackTrace(System\&.err);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR + +- NameComponent nc4 = new NameComponent("calender", "text"); +- NameComponent[] name4 = {nc4}; +- ctx2\&.rebind(name4, objref); +- System\&.out\&.println("calender rebind successful!"); +- } catch (Exception e) { +- e\&.printStackTrace(System\&.err); +- } +- } +-} + .fi + .if n \{\ + .RE +@@ -308,29 +323,31 @@ + .RS 4 + .\} + .nf +-import java\&.util\&.Properties; +-import org\&.omg\&.CORBA\&.*; +-import org\&.omg\&.CosNaming\&.*; ++\fBimport java\&.util\&.Properties;\fR ++\fBimport org\&.omg\&.CORBA\&.*;\fR ++\fBimport org\&.omg\&.CosNaming\&.*;\fR ++\fB \fR ++\fBpublic class NameClientList {\fR + +-public class NameClientList { +- +- public static void main(String args[]) { +- +- try { ++\fB public static void main(String args[]) {\fR ++ ++\fB try {\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤Ç¡¢\fInameserver\fR¤Ï¥Ý¡¼¥È1050¤Çµ¯Æ°¤µ¤ì¤Þ¤·¤¿¡£¼¡¤Î¥³¡¼¥É¤Ç¡¢¤³¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥¯¥é¥¤¥¢¥ó¥È¡¦¥·¥¹¥Æ¥à¤ËÃΤ餻¤Þ¤¹¡£ ++¥Í¡¼¥ß¥ó¥°¡¦¥µ¡¼¥Ó¥¹¤Îµ¯Æ°¤Ç¡¢\fBnameserver\fR¤Ï¥Ý¡¼¥È1050¤Çµ¯Æ°¤µ¤ì¤Þ¤·¤¿¡£¼¡¤Î¥³¡¼¥É¤Ç¡¢¤³¤Î¥Ý¡¼¥ÈÈÖ¹æ¤ò¥¯¥é¥¤¥¢¥ó¥È¡¦¥·¥¹¥Æ¥à¤ËÃΤ餻¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- Properties props = new Properties(); +- props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050"); +- ORB orb = ORB\&.init(args, props); ++\fB Properties props = new Properties();\fR ++\fB props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050");\fR ++\fB ORB orb = ORB\&.init(args, props);\fR ++ + .fi + .if n \{\ + .RE +@@ -342,36 +359,39 @@ + .RS 4 + .\} + .nf +- NamingContext nc = +- NamingContextHelper\&.narrow( +- orb\&.resolve_initial_references("NameService")); ++\fB NamingContext nc =\fR ++\fB NamingContextHelper\&.narrow(\fR ++\fB orb\&.resolve_initial_references("NameService"));\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-\fIlist\fR¥á¥½¥Ã¥É¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò¥ê¥¹¥È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢ºÇÂç1000¸Ä¤Þ¤Ç¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤«¤é\fIBindingListHolder\fR¤ËÊÖ¤µ¤ì¤Þ¤¹¡£»Ä¤ê¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fIBindingIteratorHolder\fR¤ËÊÖ¤µ¤ì¤Þ¤¹¡£ ++\fBlist\fR¥á¥½¥Ã¥É¤Ï¡¢¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ò¥ê¥¹¥È¤·¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢ºÇÂç1000¸Ä¤Þ¤Ç¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬½é´ü¥Í¡¼¥ß¥ó¥°¡¦¥³¥ó¥Æ¥­¥¹¥È¤«¤é\fBBindingListHolder\fR¤ËÊÖ¤µ¤ì¤Þ¤¹¡£»Ä¤ê¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤Ï¡¢\fBBindingIteratorHolder\fR¤ËÊÖ¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- BindingListHolder bl = new BindingListHolder(); +- BindingIteratorHolder blIt= new BindingIteratorHolder(); +- nc\&.list(1000, bl, blIt); ++\fB BindingListHolder bl = new BindingListHolder();\fR ++\fB BindingIteratorHolder blIt= new BindingIteratorHolder();\fR ++\fB nc\&.list(1000, bl, blIt);\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢ÊÖ¤µ¤ì¤¿\fIBindingListHolder\fR¤«¤é¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ÎÇÛÎó¤ò¼èÆÀ¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥í¥°¥é¥à¤¬½ªÎ»¤·¤Þ¤¹¡£ ++¼¡¤Î¥³¡¼¥É¤Ç¤Ï¡¢ÊÖ¤µ¤ì¤¿\fBBindingListHolder\fR¤«¤é¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤ÎÇÛÎó¤ò¼èÆÀ¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¤¬¤Ê¤¤¾ì¹ç¤Ï¡¢¥×¥í¥°¥é¥à¤¬½ªÎ»¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +- Binding bindings[] = bl\&.value; +- if (bindings\&.length == 0) return; ++\fB Binding bindings[] = bl\&.value;\fR ++\fB if (bindings\&.length == 0) return;\fR ++ + .fi + .if n \{\ + .RE +@@ -383,27 +403,28 @@ + .RS 4 + .\} + .nf +- for (int i=0; i < bindings\&.length; i++) { ++\fB for (int i=0; i < bindings\&.length; i++) {\fR ++\fB \fR ++\fB // get the object reference for each binding\fR ++\fB org\&.omg\&.CORBA\&.Object obj = nc\&.resolve(bindings[i]\&.binding_name);\fR ++\fB String objStr = orb\&.object_to_string(obj);\fR ++\fB int lastIx = bindings[i]\&.binding_name\&.length\-1;\fR ++\fB \fR ++\fB // check to see if this is a naming context\fR ++\fB if (bindings[i]\&.binding_type == BindingType\&.ncontext) {\fR ++\fB System\&.out\&.println("Context: " +\fR ++\fB bindings[i]\&.binding_name[lastIx]\&.id);\fR ++\fB } else {\fR ++\fB System\&.out\&.println("Object: " +\fR ++\fB bindings[i]\&.binding_name[lastIx]\&.id);\fR ++\fB }\fR ++\fB }\fR ++\fB } catch (Exception e) {\fR ++\fB e\&.printStackTrace(System\&.err)\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR + +- // get the object reference for each binding +- org\&.omg\&.CORBA\&.Object obj = nc\&.resolve(bindings[i]\&.binding_name); +- String objStr = orb\&.object_to_string(obj); +- int lastIx = bindings[i]\&.binding_name\&.length\-1; +- +- // check to see if this is a naming context +- if (bindings[i]\&.binding_type == BindingType\&.ncontext) { +- System\&.out\&.println("Context: " + +- bindings[i]\&.binding_name[lastIx]\&.id); +- } else { +- System\&.out\&.println("Object: " + +- bindings[i]\&.binding_name[lastIx]\&.id); +- } +- } +- } catch (Exception e) { +- e\&.printStackTrace(System\&.err) +- } +- } +-} + .fi + .if n \{\ + .RE +--- ./jdk/src/solaris/doc/sun/man/man1/ja/unpack200.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/unpack200.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: unpack200 +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: unpack200 ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "unpack200" "1" "2013ǯ11·î21Æü" "JDK 8" "Java¥Ç¥×¥í¥¤¥á¥ó¥È¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,15 +50,15 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" +-unpack200 \- pack200(1)¤ÇºîÀ®¤µ¤ì¤¿¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ò¡¢Web¥Ç¥×¥í¥¤¥á¥ó¥È¤Î¤¿¤á¤ËJAR¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Þ¤¹¡£ ++.SH "̾Á°" ++unpack200 \- \fBpack200\fR(1)¤ÇºîÀ®¤µ¤ì¤¿¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤ò¡¢Web¥Ç¥×¥í¥¤¥á¥ó¥È¤Î¤¿¤á¤ËJAR¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp + .if n \{\ + .RS 4 + .\} + .nf +-\fIunpack200\fR [ \fIoptions\fR ] input\-file \fIJAR\-file\fR ++\fBunpack200\fR [ \fIoptions\fR ] input\-file \fIJAR\-file\fR + .fi + .if n \{\ + .RE +@@ -64,12 +66,12 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIinput\-file\fR + .RS 4 +-ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î̾Á°¡£pack200 gzip¥Õ¥¡¥¤¥ë¤«pack200¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fIpack200\fR(1)¤ÇºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹(¼ê´Ö¤Ï\fI0\fR¤Ç¤¹)¡£¤³¤Î¾ì¹ç¡¢ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÏPack2000¥Þ¡¼¥«¡¼¤Ç½ÐÎÏJAR¥Õ¥¡¥¤¥ë¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ++ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î̾Á°¡£pack200 gzip¥Õ¥¡¥¤¥ë¤«pack200¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢\fBpack200\fR(1)¤ÇºîÀ®¤µ¤ì¤¿JAR¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹(¼ê´Ö¤Ï\fB0\fR¤Ç¤¹)¡£¤³¤Î¾ì¹ç¡¢ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎÆâÍƤÏPack2000¥Þ¡¼¥«¡¼¤Ç½ÐÎÏJAR¥Õ¥¡¥¤¥ë¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \fIJAR\-file\fR +@@ -78,13 +80,14 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIunpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢\fIpack200\fR\fI(1)\fR¤ÇºîÀ®¤µ¤ì¤¿¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤òJAR¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤¹¤ë¥Í¥¤¥Æ¥£¥Ö¼ÂÁõ¤Ç¤¹¡£°ìÈÌŪ¤Ê»ÈÍÑÊýË¡¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î\fIunpack200\fR¥³¥Þ¥ó¥ÉÀßÄê¤Ç¡¢\fImyarchive\&.jar\fR¥Õ¥¡¥¤¥ë¤¬\fImyarchive\&.pack\&.gz\fR¤«¤éºîÀ®¤µ¤ì¤Þ¤¹¡£ ++\fBunpack200\fR¥³¥Þ¥ó¥É¤Ï¡¢\fBpack200\fR\fB(1)\fR¤ÇºîÀ®¤µ¤ì¤¿¥Ñ¥Ã¥¯¡¦¥Õ¥¡¥¤¥ë¤òJAR¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤¹¤ë¥Í¥¤¥Æ¥£¥Ö¼ÂÁõ¤Ç¤¹¡£°ìÈÌŪ¤Ê»ÈÍÑÊýË¡¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤Î\fBunpack200\fR¥³¥Þ¥ó¥ÉÀßÄê¤Ç¡¢\fBmyarchive\&.jar\fR¥Õ¥¡¥¤¥ë¤¬\fBmyarchive\&.pack\&.gz\fR¤«¤éºîÀ®¤µ¤ì¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-unpack200 myarchive\&.pack\&.gz myarchive\&.jar ++\fBunpack200 myarchive\&.pack\&.gz myarchive\&.jar\fR ++ + .fi + .if n \{\ + .RE +@@ -93,7 +96,7 @@ + .PP + \-Hvalue \-\-deflate\-hint=\fIvalue\fR + .RS 4 +-JAR¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Ë\fItrue\fR¡¢\fIfalse\fR¤Þ¤¿¤Ï\fIkeep\fR¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¡¦¥â¡¼¥É¤Ï\fIkeep\fR¤Ç¤¹¡£Ãͤ¬\fItrue\fR¤Þ¤¿¤Ï\fIfalse\fR¾ì¹ç¡¢\fI\-\-deflate=hint\fR¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¡¢½ÐÎÏJAR¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥â¡¼¥É¤¬ÀßÄꤵ¤ì¤Þ¤¹¡£ ++JAR¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Ë\fBtrue\fR¡¢\fBfalse\fR¤Þ¤¿¤Ï\fBkeep\fR¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¤òÀßÄꤷ¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¡¦¥â¡¼¥É¤Ï\fBkeep\fR¤Ç¤¹¡£Ãͤ¬\fBtrue\fR¤Þ¤¿¤Ï\fBfalse\fR¾ì¹ç¡¢\fB\-\-deflate=hint\fR¥ª¥×¥·¥ç¥ó¤Ï¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤ò¥ª¡¼¥Ð¡¼¥é¥¤¥É¤·¤Æ¡¢½ÐÎÏJAR¥Õ¥¡¥¤¥ëÆâ¤Î¤¹¤Ù¤Æ¤Î¥¨¥ó¥È¥ê¤Î¥Ç¥Õ¥ì¡¼¥·¥ç¥ó¡¦¥â¡¼¥É¤¬ÀßÄꤵ¤ì¤Þ¤¹¡£ + .RE + .PP + \-r \-\-remove\-pack\-file +@@ -118,21 +121,21 @@ + .PP + \-? \-h \-\-help + .RS 4 +-\fIunpack200\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBunpack200\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-V \-\-version + .RS 4 +-\fIunpack200\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ ++\fBunpack200\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤ò½ÐÎϤ·¤Þ¤¹¡£ + .RE + .PP + \-J\fIoption\fR + .RS 4 +-Java²¾ÁÛ¥Þ¥·¥ó¤Ëoption¤òÅϤ·¤Þ¤¹¡£\fIoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fI\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++Java Virtual Machine¤Ëoption¤òÅϤ·¤Þ¤¹¡£\fBoption\fR¤Ë¤Ï¡¢Java¥¢¥×¥ê¥±¡¼¥·¥ç¥óµ¯Æ°¥Ä¡¼¥ë¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¡¦¥Ú¡¼¥¸¤Ëµ­ºÜ¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤ò1¤Ä»ØÄꤷ¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢\fB\-J\-Xms48m\fR¤È»ØÄꤹ¤ë¤È¡¢¥¹¥¿¡¼¥È¥¢¥Ã¥×¡¦¥á¥â¥ê¡¼¤Ï48MB¤ËÀßÄꤵ¤ì¤Þ¤¹¡£java(1)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "Ãí°Õ" + .PP +-¤³¤Î¥³¥Þ¥ó¥É¤È\fIunpack\fR¥³¥Þ¥ó¥É¤òº®Æ±¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÏÊÌÀ½ÉʤǤ¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¤È\fBunpack\fR¥³¥Þ¥ó¥É¤òº®Æ±¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÏÊÌÀ½ÉʤǤ¹¡£ + .PP + JDK¤ËÉÕ°¤¹¤ëJava SE API»ÅÍͤȤÎÁê°ã¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¤Ë¤Ï¡¢»ÅÍͤòÍ¥À褷¤Æ¤¯¤À¤µ¤¤¡£ + .SH "½ªÎ»¥¹¥Æ¡¼¥¿¥¹" +@@ -181,8 +184,9 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-¡ÖPack200 and Compression¡× +-(http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/deployment/deployment\-guide/pack200\&.html) ++¡ÖCompression Formats for Network Deployment¡× ++ ++http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jweb/networking/compression_formats\&.html + .RE + .sp + .RS 4 +--- ./jdk/src/solaris/doc/sun/man/man1/ja/wsgen.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/wsgen.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: wsgen +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: wsgen ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "wsgen" "1" "2013ǯ11·î21Æü" "JDK 8" "Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + wsgen \- Web¥µ¡¼¥Ó¥¹¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¼ÂÁõ(SEI)¥¯¥é¥¹¤òÆɼè¤ê¡¢Web¥µ¡¼¥Ó¥¹¤Î¥Ç¥×¥í¥¤¥á¥ó¥È¤È¸Æ½Ð¤·¤ËɬÍפʤ¹¤Ù¤Æ¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIwsgen\fR [ \fIoptions\fR ] \fISEI\fR ++\fBwsgen\fR [ \fIoptions\fR ] \fISEI\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fISEI\fR +@@ -73,18 +75,19 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIwsgen\fR¥³¥Þ¥ó¥É¤Ï¡¢JAX\-WS Web¥µ¡¼¥Ó¥¹¤Ç»ÈÍѤµ¤ì¤ëJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥Ä¡¼¥ë¤Ï¡¢Web¥µ¡¼¥Ó¥¹¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¡¦¥¯¥é¥¹¤òÆɼè¤ê¡¢Web¥µ¡¼¥Ó¥¹¤Î¥Ç¥×¥í¥¤¥á¥ó¥È¤È¸Æ½Ð¤·¤ËɬÍפʤ¹¤Ù¤Æ¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£JAXWS 2\&.1\&.1 RI¤Ç¤Ï\fIwsgen\fR ++\fBwsgen\fR¥³¥Þ¥ó¥É¤Ï¡¢JAX\-WS Web¥µ¡¼¥Ó¥¹¤Ç»ÈÍѤµ¤ì¤ëJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤Î¥Ä¡¼¥ë¤Ï¡¢Web¥µ¡¼¥Ó¥¹¤Î¥¨¥ó¥É¥Ý¥¤¥ó¥È¡¦¥¯¥é¥¹¤òÆɼè¤ê¡¢Web¥µ¡¼¥Ó¥¹¤Î¥Ç¥×¥í¥¤¥á¥ó¥È¤È¸Æ½Ð¤·¤ËɬÍפʤ¹¤Ù¤Æ¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£JAXWS 2\&.1\&.1 RI¤Ç¤Ï\fBwsgen\fR + Ant¥¿¥¹¥¯¤âÄ󶡤µ¤ì¤Þ¤¹¡£ + http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/wsgenant\&.html¤ÎJAX\-WS (wsgen)¥Ú¡¼¥¸¤ÎTools¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .PP +-\fIwsgen\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ ++\fBwsgen\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-export JAXWS_HOME=/pathto/jaxws\-ri +-$JAXWS_HOME/bin/wsgen\&.sh \-help ++\fBexport JAXWS_HOME=/pathto/jaxws\-ri\fR ++\fB$JAXWS_HOME/bin/wsgen\&.sh \-help\fR ++ + .fi + .if n \{\ + .RE +@@ -113,7 +116,7 @@ + .PP + \-help + .RS 4 +-\fIwsgen\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBwsgen\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-keep +@@ -123,7 +126,7 @@ + .PP + \-r \fIdirectory\fR + .RS 4 +-¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fI\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢WSDL¤Ê¤ÉÀ¸À®¤µ¤ì¤¿¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£ ++¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\fB\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë»ÈÍѤ·¤Æ¡¢WSDL¤Ê¤ÉÀ¸À®¤µ¤ì¤¿¥ê¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤òÇÛÃÖ¤¹¤ë¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-s \fIdirectory\fR +@@ -145,41 +148,43 @@ + .RS 4 + ¥¨¥ó¥É¥Ý¥¤¥ó¥È¤ò¥Ç¥×¥í¥¤¤¹¤ëÁ°¤Ë³Îǧ¤¹¤ëWSDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¥ª¥×¥·¥ç¥ó¡¦¥³¥Þ¥ó¥É¡£WSDL¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥µ¡¼¥Ó¥¹¤ò¸Æ¤Ó½Ð¤¹ÊýË¡¡¢¥Ñ¥é¥á¡¼¥¿¤ËɬÍפÊÃÍ¡¢ÊÖ¤µ¤ì¤ë¥Ç¡¼¥¿¹½Â¤¤Ë¤Ä¤¤¤Æ¤Î¥³¥ó¥Ô¥å¡¼¥¿¤ÇÆɼè¤ê²Äǽ¤Êµ­½Ò¤¬´Þ¤Þ¤ì¤Þ¤¹¡£ + .sp +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fIwsgen\fR¥³¥Þ¥ó¥É¤ÏWSDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤»¤ó¡£\fIprotocol\fRÃͤϾÊά²Äǽ¤Ç¤¢¤ê¡¢WSDL¥Ð¥¤¥ó¥Ç¥£¥ó¥°(\fIwsdl:binding\fR)¤Ç»ÈÍѤ¹¤ë¥×¥í¥È¥³¥ë¤ò»ØÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£Í­¸ú¤Ê¥×¥í¥È¥³¥ë¤Ï¡¢\fIsoap1\&.1\fR¤È\fIXsoap1\&.2\fR¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fIsoap1\&.1\fR¤Ç¤¹¡£\fIXsoap1\&.2\fR¥×¥í¥È¥³¥ë¤Ïɸ½à¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢\fI\-extension\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\fBwsgen\fR¥³¥Þ¥ó¥É¤ÏWSDL¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤»¤ó¡£\fBprotocol\fRÃͤϾÊά²Äǽ¤Ç¤¢¤ê¡¢WSDL¥Ð¥¤¥ó¥Ç¥£¥ó¥°(\fBwsdl:binding\fR)¤Ç»ÈÍѤ¹¤ë¥×¥í¥È¥³¥ë¤ò»ØÄꤹ¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£Í­¸ú¤Ê¥×¥í¥È¥³¥ë¤Ï¡¢\fBsoap1\&.1\fR¤È\fBXsoap1\&.2\fR¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ï\fBsoap1\&.1\fR¤Ç¤¹¡£\fBXsoap1\&.2\fR¥×¥í¥È¥³¥ë¤Ïɸ½à¤Ç¤Ï¤Ê¤¤¤¿¤á¡¢\fB\-extension\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѲÄǽ¤Ç¤¹¡£ + .RE + .PP + \-servicename \fIname\fR + .RS 4 +-\fI\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѤ·¤Æ¡¢WSDL¤ÇÀ¸À®¤µ¤ì¤ëÆÃÄê¤ÎWSDL¥µ¡¼¥Ó¥¹(\fIwsdl:service\fR)̾¤ò»ØÄꤷ¤Þ¤¹¡£Îã: +-\fI\-servicename "{http://mynamespace/}MyService"\fR¡£ ++\fB\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѤ·¤Æ¡¢WSDL¤ÇÀ¸À®¤µ¤ì¤ëÆÃÄê¤ÎWSDL¥µ¡¼¥Ó¥¹(\fBwsdl:service\fR)̾¤ò»ØÄꤷ¤Þ¤¹¡£Îã: ++\fB\-servicename "{http://mynamespace/}MyService"\fR¡£ + .RE + .PP + \-portname \fIname\fR + .RS 4 +-\fI\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѤ·¤Æ¡¢WSDL¤ÇÀ¸À®¤µ¤ì¤ëÆÃÄê¤ÎWSDL¥Ý¡¼¥È(\fIwsdl:port\fR)̾¤ò»ØÄꤷ¤Þ¤¹¡£Îã: +-\fI\-portname "{http://mynamespace/}MyPort"\fR¡£ ++\fB\-wsdl\fR¥ª¥×¥·¥ç¥ó¤È¤È¤â¤Ë¤Î¤ß»ÈÍѤ·¤Æ¡¢WSDL¤ÇÀ¸À®¤µ¤ì¤ëÆÃÄê¤ÎWSDL¥Ý¡¼¥È(\fBwsdl:port\fR)̾¤ò»ØÄꤷ¤Þ¤¹¡£Îã: ++\fB\-portname "{http://mynamespace/}MyPort"\fR¡£ + .RE + .SH "Îã" + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢Stock¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë\fI@WebService\fRÃí¼á¤ò»ý¤Ä\fIStockService\fR¤Î¥é¥Ã¥Ñ¡¼¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢Stock¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë\fB@WebService\fRÃí¼á¤ò»ý¤Ä\fBStockService\fR¤Î¥é¥Ã¥Ñ¡¼¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-wsgen \-d stock \-cp myclasspath stock\&.StockService ++\fBwsgen \-d stock \-cp myclasspath stock\&.StockService\fR ++ + .fi + .if n \{\ + .RE + .\} + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢SOAP 1\&.1 WSDL¤ª¤è¤Ó\fI@WebService\fRÃí¼á¤ò»ý¤Ä\fIstock\&.StockService\fR¥¯¥é¥¹¤Î¥¹¥­¡¼¥Þ¤òÀ¸À®¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢SOAP 1\&.1 WSDL¤ª¤è¤Ó\fB@WebService\fRÃí¼á¤ò»ý¤Ä\fBstock\&.StockService\fR¥¯¥é¥¹¤Î¥¹¥­¡¼¥Þ¤òÀ¸À®¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-wsgen \-wsdl \-d stock \-cp myclasspath stock\&.StockService ++\fBwsgen \-wsdl \-d stock \-cp myclasspath stock\&.StockService\fR ++ + .fi + .if n \{\ + .RE +@@ -191,7 +196,8 @@ + .RS 4 + .\} + .nf +-wsgen \-wsdl:Xsoap1\&.2 \-d stock \-cp myclasspath stock\&.StockService ++\fBwsgen \-wsdl:Xsoap1\&.2 \-d stock \-cp myclasspath stock\&.StockService \fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/solaris/doc/sun/man/man1/ja/wsimport.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/wsimport.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: wsimport +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: wsimport ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "wsimport" "1" "2013ǯ11·î21Æü" "JDK 8" "Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + wsimport \- Web¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥¢¡¼¥«¥¤¥Ö(WAR)¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸¤Ç¤­¤ëJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Æ¡¢Ant¥¿¥¹¥¯¤ò»ØÄꤷ¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIwsimport\fR [ \fIoptions\fR ] \fIwsdl\fR ++\fBwsimport\fR [ \fIoptions\fR ] \fIwsdl\fR + .fi + .if n \{\ + .RE +@@ -64,7 +66,7 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \fIwsdl\fR +@@ -73,7 +75,7 @@ + .RE + .SH "ÀâÌÀ" + .PP +-\fIwsimport\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤ÎJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï¡¢¥Ç¥×¥í¥¤¤¹¤ëWSDL¤ª¤è¤Ó¥¹¥­¡¼¥Þ¡¦¥É¥­¥å¥á¥ó¥È¤ª¤è¤Ó¥¨¥ó¥É¥Ý¥¤¥ó¥È¼ÂÁõ¤È¤È¤â¤Ë¡¢WAR¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸¤Ç¤­¤Þ¤¹¡£\fIwsimport\fR¥³¥Þ¥ó¥É¤Ç¤Ï\fIwsimport\fR ++\fBwsimport\fR¥³¥Þ¥ó¥É¤Ï¡¢¼¡¤ÎJAX\-WS¥Ý¡¼¥¿¥Ö¥ë¡¦¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¤Þ¤¹¡£¤³¤ì¤é¤Î¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤Ï¡¢¥Ç¥×¥í¥¤¤¹¤ëWSDL¤ª¤è¤Ó¥¹¥­¡¼¥Þ¡¦¥É¥­¥å¥á¥ó¥È¤ª¤è¤Ó¥¨¥ó¥É¥Ý¥¤¥ó¥È¼ÂÁõ¤È¤È¤â¤Ë¡¢WAR¥Õ¥¡¥¤¥ë¤Ë¥Ñ¥Ã¥±¡¼¥¸¤Ç¤­¤Þ¤¹¡£\fBwsimport\fR¥³¥Þ¥ó¥É¤Ç¤Ï\fBwsimport\fR + Ant¥¿¥¹¥¯¤âÄ󶡤µ¤ì¤Þ¤¹¡£ + http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/wsimportant\&.html¤ÎWsimport Ant Task¥Ú¡¼¥¸¤ÎTools¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +@@ -107,7 +109,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-Îã³°¥¯¥é¥¹¤Ï\fIwsdl:fault\fR¤«¤é¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹(¸ºß¤¹¤ë¾ì¹ç) ++Îã³°¥¯¥é¥¹¤Ï\fBwsdl:fault\fR¤«¤é¥Þ¥Ã¥×¤µ¤ì¤Þ¤¹(¸ºß¤¹¤ë¾ì¹ç) + .RE + .sp + .RS 4 +@@ -118,7 +120,7 @@ + .sp -1 + .IP \(bu 2.3 + .\} +-ÈóƱ´ü¥ì¥¹¥Ý¥ó¥¹Bean¤Ï¥ì¥¹¥Ý¥ó¥¹\fIwsdl:message\fR¤«¤éÇÉÀ¸¤·¤Þ¤¹(¸ºß¤¹¤ë¾ì¹ç) ++ÈóƱ´ü¥ì¥¹¥Ý¥ó¥¹Bean¤Ï¥ì¥¹¥Ý¥ó¥¹\fBwsdl:message\fR¤«¤éÇÉÀ¸¤·¤Þ¤¹(¸ºß¤¹¤ë¾ì¹ç) + .RE + .sp + .RS 4 +@@ -132,7 +134,7 @@ + JAXB¤¬À¸À®¤¹¤ëÃÍ¥¿¥¤¥×(¥¹¥­¡¼¥Þ¤Î¥¿¥¤¥×¤«¤é¥Þ¥Ã¥×¤µ¤ì¤¿Java¥¯¥é¥¹) + .RE + .PP +-\fIwsgen\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ ++\fBwsgen\fR¥³¥Þ¥ó¥É¤òµ¯Æ°¤¹¤ë¤Ë¤Ï¡¢¼¡¤ò¹Ô¤¤¤Þ¤¹¡£ + .PP + \fBOracle Solaris/Linux\fR: + .sp +@@ -140,7 +142,8 @@ + .RS 4 + .\} + .nf +-/bin/wsimport\&.sh \-help ++\fB/bin/wsimport\&.sh \-help\fR ++ + .fi + .if n \{\ + .RE +@@ -152,7 +155,8 @@ + .RS 4 + .\} + .nf +-\ebin\ewsimport\&.bat \-help ++\fB\ebin\ewsimport\&.bat \-help\fR ++ + .fi + .if n \{\ + .RE +@@ -166,18 +170,18 @@ + .PP + \-b \fIpath\fR + .RS 4 +-³°ÉôJAX\-WS¤Þ¤¿¤ÏJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-b\fR¥ª¥×¥·¥ç¥ó¤ÇÊ£¿ô¤ÎJAX\-WS¤ª¤è¤ÓJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¡¢Bean̾¤Ê¤É¤ò¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£JAX\-WS¤ª¤è¤ÓJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢ ++³°ÉôJAX\-WS¤Þ¤¿¤ÏJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-b\fR¥ª¥×¥·¥ç¥ó¤ÇÊ£¿ô¤ÎJAX\-WS¤ª¤è¤ÓJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¡¢Bean̾¤Ê¤É¤ò¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£JAX\-WS¤ª¤è¤ÓJAXB¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢ + http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/wsimportant\&.html¤ÎWSDL Customization¤ÎUsers Guide¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .RE + .PP + \-B \fIjaxbOption\fR + .RS 4 +-JAXB¥¹¥­¡¼¥Þ¡¦¥³¥ó¥Ñ¥¤¥é¤Ë\fIjaxbOption\fR¥ª¥×¥·¥ç¥ó¤òÅϤ·¤Þ¤¹¡£ ++JAXB¥¹¥­¡¼¥Þ¡¦¥³¥ó¥Ñ¥¤¥é¤Ë\fBjaxbOption\fR¥ª¥×¥·¥ç¥ó¤òÅϤ·¤Þ¤¹¡£ + .RE + .PP + \-catalog + .RS 4 +-³°Éô¥¨¥ó¥Æ¥£¥Æ¥£»²¾È¤ò²ò·è¤¹¤ë¥«¥¿¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fI\-catalog\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢TR9401¡¢XCatalog¡¢OASIS XML Catalog¤Î³Æ·Á¼°¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/catalog\-support\&.html¤Î ++³°Éô¥¨¥ó¥Æ¥£¥Æ¥£»²¾È¤ò²ò·è¤¹¤ë¥«¥¿¥í¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£\fB\-catalog\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢TR9401¡¢XCatalog¡¢OASIS XML Catalog¤Î³Æ·Á¼°¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹¡£http://jax\-ws\&.java\&.net/nonav/2\&.1\&.1/docs/catalog\-support\&.html¤Î + Catalog Support¥Ú¡¼¥¸¤ÎUsers Guide¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP +@@ -188,7 +192,7 @@ + .PP + \-help + .RS 4 +-\fIwsimport\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£ ++\fBwsimport\fR¥³¥Þ¥ó¥É¤Ë´Ø¤¹¤ë¥Ø¥ë¥×¡¦¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£ + .RE + .PP + \-httpproxy: \fIhost\fR:\fIport\fR +@@ -223,7 +227,7 @@ + .PP + \-wsdllocation \fIlocation\fR + .RS 4 +-\fI@WebServiceClient\&.wsdlLocation\fR¤ÎÃͤò»ØÄꤷ¤Þ¤¹¡£ ++\fB@WebServiceClient\&.wsdlLocation\fR¤ÎÃͤò»ØÄꤷ¤Þ¤¹¡£ + .RE + .PP + \-target +@@ -233,11 +237,11 @@ + .PP + \-quiet + .RS 4 +-\fIwsimport\fR¥³¥Þ¥ó¥É½ÐÎϤòÍÞÀ©¤·¤Þ¤¹¡£ ++\fBwsimport\fR¥³¥Þ¥ó¥É½ÐÎϤòÍÞÀ©¤·¤Þ¤¹¡£ + .RE + .PP +-\fI\-b\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î\fIJAX\-WS\fR¤ª¤è¤Ó\fIJAXB\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤äBean̾¤Ê¤É¡¢ÍÍ¡¹¤Ê¤â¤Î¤ò¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£\fIJAX\-WS\fR¤ª¤è¤Ó\fIJAXB\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢ +-https://jax\-ws\&.dev\&.java\&.net/nonav/2\&.1\&.1/docs/customizations\&.html¤ÎJAXB¥¿¥Ö¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ ++\fB\-b\fR¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¡¢Ê£¿ô¤Î\fBJAX\-WS\fR¤ª¤è¤Ó\fBJAXB\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤äBean̾¤Ê¤É¡¢ÍÍ¡¹¤Ê¤â¤Î¤ò¥«¥¹¥¿¥Þ¥¤¥º¤Ç¤­¤Þ¤¹¡£\fBJAX\-WS\fR¤ª¤è¤Ó\fBJAXB\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¾ÜºÙ¤Ï¡¢ ++https://jax\-ws\&.java\&.net/nonav/2\&.1\&.2/docs/customizations\&.html¤Î¥«¥¹¥¿¥Þ¥¤¥º¡¦¥É¥­¥å¥á¥ó¥È¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SH "Èóɸ½à¥ª¥×¥·¥ç¥ó" + .PP + \-XadditionalHeaders +@@ -249,7 +253,7 @@ + .RS 4 + ǧ¾Ú¾ðÊó¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ëWSDL URI¤Ç¤¹¡£¤³¤ÎURI¤Î·Á¼°¤Ï¼¡¤Î¤È¤ª¤ê¤Ç¤¹¡£ + .sp +-http://\fIuser\-name\fR:\fIpassword\fR@\fIhost\-name\fR/\fIweb\-service\-name\fR>?wsdl ++http://\fIuser\-name\fR:\fBpassword\fR@\fIhost\-name\fR/\fIweb\-service\-name\fR>?wsdl\&. + .RE + .PP + \-Xdebug +@@ -268,13 +272,14 @@ + .RE + .SH "Îã" + .PP +-¼¡¤ÎÎã¤Ç¤Ï¡¢Java¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¡¢\fIhttp://stockquote\&.example\&.com/quote?wsdl\fR¤ò¥¤¥ó¥Ý¡¼¥È¤·¤Æ¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¼¡¤ÎÎã¤Ç¤Ï¡¢Java¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤òÀ¸À®¤·¡¢\fBhttp://stockquote\&.example\&.com/quote?wsdl\fR¤ò¥¤¥ó¥Ý¡¼¥È¤·¤Æ¥¢¡¼¥Æ¥£¥Õ¥¡¥¯¥È¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .sp + .if n \{\ + .RS 4 + .\} + .nf +-wsimport \-p stockquote http://stockquote\&.example\&.com/quote?wsdl ++\fBwsimport \-p stockquote http://stockquote\&.example\&.com/quote?wsdl\fR ++ + .fi + .if n \{\ + .RE +--- ./jdk/src/solaris/doc/sun/man/man1/ja/xjc.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/ja/xjc.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,11 +1,5 @@ + '\" t +-.\" Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. +-.\" Title: xjc +-.\" Language: English +-.\" Date: 2013ǯ11·î21Æü +-.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë +-.\" Software: JDK 8 +-.\" Arch: ÈÆÍÑ ++.\" Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + .\" + .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + .\" +@@ -27,7 +21,15 @@ + .\" or visit www.oracle.com if you need additional information or have any + .\" questions. + .\" +-.pl 99999 ++.\" Title: xjc ++.\" Language: Japanese ++.\" Date: 2013ǯ11·î21Æü ++.\" SectDesc: Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë ++.\" Software: JDK 8 ++.\" Arch: ÈÆÍÑ ++.\" Part Number: E54734-01 ++.\" ++.if n .pl 99999 + .TH "xjc" "1" "2013ǯ11·î21Æü" "JDK 8" "Java Web¥µ¡¼¥Ó¥¹¡¦¥Ä¡¼¥ë" + .\" ----------------------------------------------------------------- + .\" * Define some portability stuff +@@ -48,7 +50,7 @@ + .\" ----------------------------------------------------------------- + .\" * MAIN CONTENT STARTS HERE * + .\" ----------------------------------------------------------------- +-.SH "NAME" ++.SH "̾Á°" + xjc \- XML¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò´°Á´Ãí¼áÉÕ¤­¤ÎJava¥¯¥é¥¹¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .SH "³µÍ×" + .sp +@@ -56,7 +58,7 @@ + .RS 4 + .\} + .nf +-\fIxjc\fR [ \fIoptions\fR ] \fIschema\fR \fIfile/URL/dir/jar\fR \&.\&.\&. [\fI\-b\fR \fIbindinfo\fR ] \&.\&.\&. ++\fBxjc\fR [ \fIoptions\fR ] \fBschema\fR \fIfile/URL/dir/jar\fR \&.\&.\&. [\fB\-b\fR \fIbindinfo\fR ] \&.\&.\&. + .fi + .if n \{\ + .RE +@@ -64,12 +66,12 @@ + .PP + \fIoptions\fR + .RS 4 +-¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ++¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¡£¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + schema \fIfile/URL/dir/jar \&.\&.\&.\fR + .RS 4 +-XML¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤Î¾ì½ê¡£\fIdir\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£\fIjar\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fI/META\-INF/sun\-jaxb\&.episode\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£ ++XML¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤Î¾ì½ê¡£\fBdir\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£\fBjar\fR¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fB/META\-INF/sun\-jaxb\&.episode\fR¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-b \fIbindinfo\fR +@@ -78,7 +80,7 @@ + .RE + .SH "ÀâÌÀ" + .PP +-¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Îbin¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ëŬÀÚ¤Ê\fIxjc\fR¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤Æ¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤òµ¯Æ°¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤ò¼Â¹Ô¤¹¤ëAnt¥¿¥¹¥¯¤â¤¢¤ê¤Þ¤¹¡£http://jaxb\&.java\&.net/nonav/2\&.1\&.3/docs/xjcTask\&.html¤Î ++¥×¥é¥Ã¥È¥Õ¥©¡¼¥à¤Îbin¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ëŬÀÚ¤Ê\fBxjc\fR¥·¥§¥ë¡¦¥¹¥¯¥ê¥×¥È¤ò»ÈÍѤ·¤Æ¡¢¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤òµ¯Æ°¤·¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤ò¼Â¹Ô¤¹¤ëAnt¥¿¥¹¥¯¤â¤¢¤ê¤Þ¤¹¡£http://jaxb\&.java\&.net/nonav/2\&.1\&.3/docs/xjcTask\&.html¤Î + Using the XJC with Ant¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤ + .SH "¥ª¥×¥·¥ç¥ó" + .sp +@@ -111,13 +113,13 @@ + .PP + \-extension + .RS 4 +-¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢XJC¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤Ï¡¢JAXB»ÅÍͤÎCompatibility¤Î¾Ï¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¥ë¡¼¥ë¤ò¸·Ì©¤Ë¶¯À©¤·¤Þ¤¹¡£ÉÕÏ¿E\&.2¤Ë¤Ï¡¢JAXB v1\&.0¤Ç´°Á´¤Ë¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤°ìÏ¢¤ÎW3C XML¥¹¥­¡¼¥Þµ¡Ç½¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢¤³¤Î¥¹¥¤¥Ã¥Á¤ÇÍ­¸ú¤Ë¤Ê¤ë\fI\-extension\fR¥â¡¼¥É¤Ç¤½¤ì¤é¤Îµ¡Ç½¤¬»ÈÍѤǤ­¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥Ç¥Õ¥©¥ë¥È¤Î¸·Ì©¤Ê¥â¡¼¥É¤Ç¤Ï¡¢»ÅÍͤËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥«¥¹¥¿¥Þ¥¤¥º¤Î¤ß¤¬»ÈÍѤǤ­¤Þ¤¹¡£\fI\-extension\fR¥¹¥¤¥Ã¥Á¤ò»ØÄꤹ¤ì¤Ð¡¢JAXB Vendor Extension¤ò»ÈÍѤǤ­¤Þ¤¹¡£ ++¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢XJC¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¤Ï¡¢JAXB»ÅÍͤÎCompatibility¤Î¾Ï¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¥ë¡¼¥ë¤ò¸·Ì©¤Ë¶¯À©¤·¤Þ¤¹¡£ÉÕÏ¿E\&.2¤Ë¤Ï¡¢JAXB v1\&.0¤Ç´°Á´¤Ë¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Ê¤¤°ìÏ¢¤ÎW3C XML¥¹¥­¡¼¥Þµ¡Ç½¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¢¤³¤Î¥¹¥¤¥Ã¥Á¤ÇÍ­¸ú¤Ë¤Ê¤ë\fB\-extension\fR¥â¡¼¥É¤Ç¤½¤ì¤é¤Îµ¡Ç½¤¬»ÈÍѤǤ­¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤Þ¤¿¡¢¥Ç¥Õ¥©¥ë¥È¤Î¸·Ì©¤Ê¥â¡¼¥É¤Ç¤Ï¡¢»ÅÍͤËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥«¥¹¥¿¥Þ¥¤¥º¤Î¤ß¤¬»ÈÍѤǤ­¤Þ¤¹¡£\fB\-extension\fR¥¹¥¤¥Ã¥Á¤ò»ØÄꤹ¤ì¤Ð¡¢JAXB Vendor Extension¤ò»ÈÍѤǤ­¤Þ¤¹¡£ + .RE + .PP + \-b \fIfile\fR + .RS 4 +-½èÍý¤¹¤ë³°Éô¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò1¤Ä¤Þ¤¿¤ÏÊ£¿ô»ØÄꤷ¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë\fI\-b\fR¥¹¥¤¥Ã¥Á¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£³°Éô¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¹½Ê¸¤Ï½ÀÆð¤Ç¤¹¡£Ê£¿ô¤Î¥¹¥­¡¼¥Þ¤Î¥«¥¹¥¿¥Þ¥¤¥º¤¬´Þ¤Þ¤ì¤ë1¤Ä¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤¿¤ê¡¢¤½¤ì¤é¤Î¥«¥¹¥¿¥Þ¥¤¥º¤òÊ£¿ô¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤·¤¿¤ê¤Ç¤­¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fIxjc schema1\&.xsd schema2\&.xsd schema3\&.xsd \-b bindings123\&.xjb\fR +-\fIxjc schema1\&.xsd schema2\&.xsd schema3\&.xsd \-b bindings1\&.xjb \-b bindings2\&.xjb \-b bindings3\&.xjb\fR¤Þ¤¿¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ë¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤È¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë½çÈÖ¤ÏǤ°Õ¤Ç¤¹¡£ ++½èÍý¤¹¤ë³°Éô¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò1¤Ä¤Þ¤¿¤ÏÊ£¿ô»ØÄꤷ¤Þ¤¹¡£¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤´¤È¤Ë\fB\-b\fR¥¹¥¤¥Ã¥Á¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£³°Éô¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Î¹½Ê¸¤Ï½ÀÆð¤Ç¤¹¡£Ê£¿ô¤Î¥¹¥­¡¼¥Þ¤Î¥«¥¹¥¿¥Þ¥¤¥º¤¬´Þ¤Þ¤ì¤ë1¤Ä¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤¿¤ê¡¢¤½¤ì¤é¤Î¥«¥¹¥¿¥Þ¥¤¥º¤òÊ£¿ô¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤Ëʬ³ä¤·¤¿¤ê¤Ç¤­¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£\fBxjc schema1\&.xsd schema2\&.xsd schema3\&.xsd \-b bindings123\&.xjb\fR ++\fBxjc schema1\&.xsd schema2\&.xsd schema3\&.xsd \-b bindings1\&.xjb \-b bindings2\&.xjb \-b bindings3\&.xjb\fR¤Þ¤¿¡¢¥³¥Þ¥ó¥É¹Ô¤Ë¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤È¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤹ¤ë½çÈÖ¤ÏǤ°Õ¤Ç¤¹¡£ + .RE + .PP + \-d \fIdir\fR +@@ -127,17 +129,17 @@ + .PP + \-p \fIpkg\fR + .RS 4 +-¤³¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥ª¥×¥·¥ç¥ó¤Ç¥¿¡¼¥²¥Ã¥È¡¦¥Ñ¥Ã¥±¡¼¥¸¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¤½¤Î»ØÄêÆâÍƤϡ¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÂФ¹¤ë¤¹¤Ù¤Æ¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥«¥¹¥¿¥Þ¥¤¥º¤ä¡¢»ÅÍͤǵ¬Äꤵ¤ì¤Æ¤¤¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¥¢¥ë¥´¥ê¥º¥à¤è¤ê¤âÍ¥À褵¤ì¤Þ¤¹¡£ ++¤³¤Î¥³¥Þ¥ó¥É¹Ô¥ª¥×¥·¥ç¥ó¤Ç¥¿¡¼¥²¥Ã¥È¡¦¥Ñ¥Ã¥±¡¼¥¸¤ò»ØÄꤷ¤¿¾ì¹ç¡¢¥Ñ¥Ã¥±¡¼¥¸Ì¾¤ËÂФ¹¤ë¤¹¤Ù¤Æ¤Î¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥«¥¹¥¿¥Þ¥¤¥º¤ä¡¢»ÅÍͤǵ¬Äꤵ¤ì¤Æ¤¤¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥Ñ¥Ã¥±¡¼¥¸Ì¾¥¢¥ë¥´¥ê¥º¥à¤è¤ê¤âÍ¥À褵¤ì¤Þ¤¹¡£ + .RE + .PP + \-httpproxy \fIproxy\fR + .RS 4 +-\fI[user[:password]@]proxyHost[:proxyPort]\fR·Á¼°¤ÇHTTP¤Þ¤¿¤ÏHTTPS¥×¥í¥­¥·¤ò»ØÄꤷ¤Þ¤¹¡£¸Å¤¤\fI\-host\fR¤ª¤è¤Ó\fI\-port\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢²¼°Ì¸ß´¹À­¤Î¤¿¤á¤Ë°ú¤­Â³¤­RI¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¤¬¡¢Èó¿ä¾©¤È¤Ê¤ê¤Þ¤·¤¿¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢top¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾¤Î¥æ¡¼¥¶¡¼¤¬É½¼¨¤Ç¤­¤ë°ú¿ô¤Ç¤¹¡£¥»¥­¥å¥ê¥Æ¥£¤ò¹â¤á¤ë¤Ë¤Ï¡¢\fI\-httpproxyfile\fR¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ ++\fI[user[:password]@]proxyHost[:proxyPort]\fR·Á¼°¤ÇHTTP¤Þ¤¿¤ÏHTTPS¥×¥í¥­¥·¤ò»ØÄꤷ¤Þ¤¹¡£¸Å¤¤\fB\-host\fR¤ª¤è¤Ó\fB\-port\fR¥ª¥×¥·¥ç¥ó¤Ï¡¢¸åÊý¸ß´¹À­¤Î¤¿¤á¤Ë°ú¤­Â³¤­RI¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¤¬¡¢Èó¿ä¾©¤È¤Ê¤ê¤Þ¤·¤¿¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤵ¤ì¤¿¥Ñ¥¹¥ï¡¼¥É¤Ï¡¢top¥³¥Þ¥ó¥É¤ò»ÈÍѤ¹¤ë¾¤Î¥æ¡¼¥¶¡¼¤¬É½¼¨¤Ç¤­¤ë°ú¿ô¤Ç¤¹¡£¥»¥­¥å¥ê¥Æ¥£¤ò¹â¤á¤ë¤Ë¤Ï¡¢\fB\-httpproxyfile\fR¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .PP + \-httpproxyfile file + .RS 4 +-¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢HTTP¤Þ¤¿¤ÏHTTPS¥×¥í¥­¥·¤ò»ØÄꤷ¤Þ¤¹¡£·Á¼°¤Ï\fI\-httpproxy\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¤¬¡¢¤³¤Î¥Õ¥¡¥¤¥ëÆâ¤Ë»ØÄꤵ¤ì¤¿¥Ñ¥¹¥ï¡¼¥É¤ò¾¤Î¥æ¡¼¥¶¡¼¤¬É½¼¨¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ++¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ·¤Æ¡¢HTTP¤Þ¤¿¤ÏHTTPS¥×¥í¥­¥·¤ò»ØÄꤷ¤Þ¤¹¡£·Á¼°¤Ï\fB\-httpproxy\fR¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¤¬¡¢¤³¤Î¥Õ¥¡¥¤¥ëÆâ¤Ë»ØÄꤵ¤ì¤¿¥Ñ¥¹¥ï¡¼¥É¤ò¾¤Î¥æ¡¼¥¶¡¼¤¬É½¼¨¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + .RE + .PP + \-classpath arg +@@ -158,12 +160,12 @@ + .PP + \-npa + .RS 4 +-\fI**/package\-info\&.java\fR¤Ø¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ì¥Ù¥ë¤ÎÃí¼á¤ÎÀ¸À®¤òÍÞÀ©¤·¤Þ¤¹¡£¤³¤Î¥¹¥¤¥Ã¥Á¤ò»ÈÍѤ·¤ÆÀ¸À®¤¹¤ë¥³¡¼¥É¤Ç¤Ï¡¢¤³¤ì¤é¤ÎÃí¼á¤¬Â¾¤ÎÀ¸À®ºÑ¥¯¥é¥¹¤ËÆâÉô²½¤µ¤ì¤Þ¤¹¡£ ++\fB**/package\-info\&.java\fR¤Ø¤Î¥Ñ¥Ã¥±¡¼¥¸¡¦¥ì¥Ù¥ë¤ÎÃí¼á¤ÎÀ¸À®¤òÍÞÀ©¤·¤Þ¤¹¡£¤³¤Î¥¹¥¤¥Ã¥Á¤ò»ÈÍѤ·¤ÆÀ¸À®¤¹¤ë¥³¡¼¥É¤Ç¤Ï¡¢¤³¤ì¤é¤ÎÃí¼á¤¬Â¾¤ÎÀ¸À®ºÑ¥¯¥é¥¹¤ËÆâÉô²½¤µ¤ì¤Þ¤¹¡£ + .RE + .PP + \-no\-header + .RS 4 +-¿¾¯¤Î¥á¥â¤È¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤à¥Õ¥¡¥¤¥ë¡¦¥Ø¥Ã¥À¡¼¡¦¥³¥á¥ó¥È¤ÎÀ¸À®¤òÍÞÀ©¤·¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ¹¤ë¤È¡¢À¸À®¤µ¤ì¤¿¥³¡¼¥É¤È\fIdiff\fR¥³¥Þ¥ó¥É¤È¤Î¸ß´¹À­¤¬¤è¤ê¶¯¤¯¤Ê¤ê¤Þ¤¹¡£ ++¿¾¯¤Î¥á¥â¤È¥¿¥¤¥à¥¹¥¿¥ó¥×¤ò´Þ¤à¥Õ¥¡¥¤¥ë¡¦¥Ø¥Ã¥À¡¼¡¦¥³¥á¥ó¥È¤ÎÀ¸À®¤òÍÞÀ©¤·¤Þ¤¹¡£¤³¤ì¤ò»ÈÍѤ¹¤ë¤È¡¢À¸À®¤µ¤ì¤¿¥³¡¼¥É¤È\fBdiff\fR¥³¥Þ¥ó¥É¤È¤Î¸ß´¹À­¤¬¤è¤ê¶¯¤¯¤Ê¤ê¤Þ¤¹¡£ + .RE + .PP + \-target 2\&.0 +@@ -218,7 +220,7 @@ + .PP + \fIschema file/URL/dir\fR + .RS 4 +-¥³¥ó¥Ñ¥¤¥ëÂоݤȤʤë1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ë¾ì¹ç¡¢\fIxjc\fR¥³¥Þ¥ó¥É¤Ï¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò¥¹¥­¥ã¥ó¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ ++¥³¥ó¥Ñ¥¤¥ëÂоݤȤʤë1¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò»ØÄꤷ¤Þ¤¹¡£¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤹ¤ë¾ì¹ç¡¢\fBxjc\fR¥³¥Þ¥ó¥É¤Ï¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¡¦¥Õ¥¡¥¤¥ë¤ò¥¹¥­¥ã¥ó¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤·¤Þ¤¹¡£ + .RE + .SS "Èóɸ½à¥ª¥×¥·¥ç¥ó" + .PP +@@ -229,12 +231,12 @@ + .PP + \-Xsync\-methods + .RS 4 +-À¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¡¦¥·¥°¥Ë¥Á¥ã¤Ë\fIsynchronized\fR¥­¡¼¥ï¡¼¥É¤¬´Þ¤á¤é¤ì¤Þ¤¹¡£ ++À¸À®¤µ¤ì¤¿¤¹¤Ù¤Æ¤Î¥á¥½¥Ã¥É¡¦¥·¥°¥Ë¥Á¥ã¤Ë\fBsynchronized\fR¥­¡¼¥ï¡¼¥É¤¬´Þ¤á¤é¤ì¤Þ¤¹¡£ + .RE + .PP + \-mark\-generated + .RS 4 +-À¸À®¤µ¤ì¤¿¥³¡¼¥É¤ËÃí¼á\fI@javax\&.annotation\&.Generated\fR¤òÉÕ¤±¤Þ¤¹¡£ ++À¸À®¤µ¤ì¤¿¥³¡¼¥É¤ËÃí¼á\fB@javax\&.annotation\&.Generated\fR¤òÉÕ¤±¤Þ¤¹¡£ + .RE + .PP + \-episode file +@@ -245,21 +247,21 @@ + .PP + \-host & \-port + .RS 4 +-¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï\fI\-httpproxy\fR¥ª¥×¥·¥ç¥ó¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤·¤¿¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢²¼°Ì¸ß´¹À­¤ò³ÎÊݤ¹¤ë¤¿¤á¤Ë¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¤¬¡¢¥É¥­¥å¥á¥ó¥È¤Ë¤Ïµ­ºÜ¤µ¤ì¤º¡¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤Çºï½ü¤µ¤ì¤ë²ÄǽÀ­¤â¤¢¤ê¤Þ¤¹¡£ ++¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï\fB\-httpproxy\fR¥ª¥×¥·¥ç¥ó¤ÇÃÖ¤­´¹¤¨¤é¤ì¤Þ¤·¤¿¡£¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¸åÊý¸ß´¹À­¤ò³ÎÊݤ¹¤ë¤¿¤á¤Ë¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤¹¤¬¡¢¥É¥­¥å¥á¥ó¥È¤Ë¤Ïµ­ºÜ¤µ¤ì¤º¡¢¾­Íè¤Î¥ê¥ê¡¼¥¹¤Çºï½ü¤µ¤ì¤ë²ÄǽÀ­¤â¤¢¤ê¤Þ¤¹¡£ + .RE + .PP + \-use\-runtime + .RS 4 +-JAXB 2\&.0»ÅÍͤǤϡ¢°Ü¿¢À­¤Î¤¢¤ë¥é¥ó¥¿¥¤¥à´Ä¶­¤¬ÄêµÁ¤µ¤ì¤¿¤¿¤á¡¢JAXB RI¤¬\fI**/impl/runtime \fR¥Ñ¥Ã¥±¡¼¥¸¤òÀ¸À®¤¹¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿¡£¤³¤Î¤¿¤á¡¢¤³¤Î¥¹¥¤¥Ã¥Á¤ÏÉÔÍפȤʤꡢºï½ü¤µ¤ì¤Þ¤·¤¿¡£ ++JAXB 2\&.0»ÅÍͤǤϡ¢°Ü¿¢À­¤Î¤¢¤ë¥é¥ó¥¿¥¤¥à´Ä¶­¤¬ÄêµÁ¤µ¤ì¤¿¤¿¤á¡¢JAXB RI¤¬\fB**/impl/runtime \fR¥Ñ¥Ã¥±¡¼¥¸¤òÀ¸À®¤¹¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤·¤¿¡£¤³¤Î¤¿¤á¡¢¤³¤Î¥¹¥¤¥Ã¥Á¤ÏÉÔÍפȤʤꡢºï½ü¤µ¤ì¤Þ¤·¤¿¡£ + .RE + .PP + \-source + .RS 4 +-\fI\-source\fR¸ß´¹À­¥¹¥¤¥Ã¥Á¤Ï¡¢JAXB 2\&.0¤ÎºÇ½é¤ÎEarly AccessÈǤÇƳÆþ¤µ¤ì¤Þ¤·¤¿¡£¤³¤Î¥¹¥¤¥Ã¥Á¤ÏJAXB 2\&.0¤Îº£¸å¤Î¥ê¥ê¡¼¥¹¤«¤éºï½ü¤µ¤ì¤Þ¤¹¡£1\&.0\&.x¥³¡¼¥É¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢1\&.0\&.x¥³¡¼¥É¡¦¥Ù¡¼¥¹¤Î¥¤¥ó¥¹¥È¡¼¥ë¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ ++\fB\-source\fR¸ß´¹À­¥¹¥¤¥Ã¥Á¤Ï¡¢JAXB 2\&.0¤ÎºÇ½é¤ÎEarly AccessÈǤÇƳÆþ¤µ¤ì¤Þ¤·¤¿¡£¤³¤Î¥¹¥¤¥Ã¥Á¤ÏJAXB 2\&.0¤Îº£¸å¤Î¥ê¥ê¡¼¥¹¤«¤éºï½ü¤µ¤ì¤Þ¤¹¡£1\&.0\&.x¥³¡¼¥É¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢1\&.0\&.x¥³¡¼¥É¡¦¥Ù¡¼¥¹¤Î¥¤¥ó¥¹¥È¡¼¥ë¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£ + .RE + .SH "¥³¥ó¥Ñ¥¤¥é¤ÎÀ©¸Â" + .PP +-Ä̾ï¤Ï¡¢´ØÏ¢¤¹¤ë¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¤ò¡¢Æ±¤¸¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¡¦¥¹¥¤¥Ã¥Á¤ò»ØÄꤷ¤Æ1¤Ä¤Îñ°Ì¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Î¤¬ºÇ¤â°ÂÁ´¤Ç¤¹¡£\fIxjc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¤Ï¡¢¼¡¤ÎÀ©¸Â¥ê¥¹¥È¤Ëα°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÎÌäÂê¤Î¤Û¤È¤ó¤É¤Ï¡¢\fIxjc\fR¥³¥Þ¥ó¥É¤ò²¿ÅÙ¤«¸Æ¤Ó½Ð¤·¤ÆÊ£¿ô¤Î¥¹¥­¡¼¥Þ¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¤Ë¤Î¤ßÅö¤Æ¤Ï¤Þ¤ê¤Þ¤¹¡£ ++Ä̾ï¤Ï¡¢´ØÏ¢¤¹¤ë¤¹¤Ù¤Æ¤Î¥¹¥­¡¼¥Þ¤ò¡¢Æ±¤¸¥Ð¥¤¥ó¥Ç¥£¥ó¥°¡¦¥³¥ó¥Ñ¥¤¥é¡¦¥¹¥¤¥Ã¥Á¤ò»ØÄꤷ¤Æ1¤Ä¤Îñ°Ì¤È¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Î¤¬ºÇ¤â°ÂÁ´¤Ç¤¹¡£\fBxjc\fR¥³¥Þ¥ó¥É¤Î¼Â¹Ô»þ¤Ë¤Ï¡¢¼¡¤ÎÀ©¸Â¥ê¥¹¥È¤Ëα°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤é¤ÎÌäÂê¤Î¤Û¤È¤ó¤É¤Ï¡¢\fBxjc\fR¥³¥Þ¥ó¥É¤ò²¿ÅÙ¤«¸Æ¤Ó½Ð¤·¤ÆÊ£¿ô¤Î¥¹¥­¡¼¥Þ¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¤Ë¤Î¤ßÅö¤Æ¤Ï¤Þ¤ê¤Þ¤¹¡£ + .PP + Ê£¿ô¤Î¥¹¥­¡¼¥Þ¤òƱ»þ¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¾ì¹ç¤Ï¡¢¥¿¡¼¥²¥Ã¥È¤ÎJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Ë¼¡¤ÎÍ¥Àè½ç°Ì¤Î¥ë¡¼¥ë¤¬Å¬ÍѤµ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ + .sp +@@ -271,7 +273,7 @@ + .sp -1 + .IP " 1." 4.2 + .\} +-\fI\-p\fR¥ª¥×¥·¥ç¥ó¤¬ºÇ¤âÍ¥À褵¤ì¤Þ¤¹¡£ ++\fB\-p\fR¥ª¥×¥·¥ç¥ó¤¬ºÇ¤âÍ¥À褵¤ì¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -293,7 +295,7 @@ + .sp -1 + .IP " 3." 4.2 + .\} +-\fItargetNamespace\fR¤¬Àë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fIt\fR\fIargetNamespace\fR¤ò»ÅÍͤÇÄêµÁ¤µ¤ì¤Æ¤¤¤ëJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¥¢¥ë¥´¥ê¥º¥à¤ËŬÍѤ·¤Þ¤¹¡£ ++\fBtargetNamespace\fR¤¬Àë¸À¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢\fBt\fR\fBargetNamespace\fR¤ò»ÅÍͤÇÄêµÁ¤µ¤ì¤Æ¤¤¤ëJava¥Ñ¥Ã¥±¡¼¥¸Ì¾¤Î¥¢¥ë¥´¥ê¥º¥à¤ËŬÍѤ·¤Þ¤¹¡£ + .RE + .sp + .RS 4 +@@ -304,7 +306,7 @@ + .sp -1 + .IP " 4." 4.2 + .\} +-\fItargetNamespace\fR¤¬Àë¸À¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fIgenerated\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤ò»ÈÍѤ·¤Þ¤¹¡£ ++\fBtargetNamespace\fR¤¬Àë¸À¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢\fBgenerated\fR¤È¤¤¤¦Ì¾Á°¤Î¥Ï¡¼¥É¥³¡¼¥É¤µ¤ì¤¿¥Ñ¥Ã¥±¡¼¥¸¤ò»ÈÍѤ·¤Þ¤¹¡£ + .RE + .PP + 1¤Ä¤Î¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤¬Ê£¿ô¤Î\fIjaxb:schemaBindings\fR¤ò»ý¤Ä¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤¿¤á¡¢°Û¤Ê¤ëJava¥Ñ¥Ã¥±¡¼¥¸¤Ë¥³¥ó¥Ñ¥¤¥é¤µ¤ì¤ëƱ°ì¥¿¡¼¥²¥Ã¥È¡¦¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤¬2¤Ä¤Î¥¹¥­¡¼¥Þ¤ò»ý¤Ä¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ +--- ./jdk/src/solaris/doc/sun/man/man1/java.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/java.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,2001 +1,3461 @@ + '\" t +-.\" Copyright (c) 1994, 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. +-.\" +-.\" Arch: generic +-.\" Software: JDK 8 +-.\" Date: 21 November 2013 +-.\" SectDesc: Basic Tools +-.\" Title: java.1 ++.\" Copyright (c) 1994, 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. ++.\" ++.\" Title: java ++.\" Language: English ++.\" Date: 08 August 2014 ++.\" SectDesc: Basic Tools ++.\" Software: JDK 8 ++.\" Arch: generic ++.\" Part Number: E38207-03 + .\" + .if n .pl 99999 +-.TH java 1 "21 November 2013" "JDK 8" "Basic Tools" +-.\" ----------------------------------------------------------------- +-.\" * Define some portability stuff +-.\" ----------------------------------------------------------------- +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.\" http://bugs.debian.org/507673 +-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" ----------------------------------------------------------------- +-.\" * set default formatting +-.\" ----------------------------------------------------------------- +-.\" disable hyphenation +-.nh +-.\" disable justification (adjust text to left margin only) +-.ad l +-.\" ----------------------------------------------------------------- +-.\" * MAIN CONTENT STARTS HERE * +-.\" ----------------------------------------------------------------- +- +-.SH NAME ++.TH "java" "1" "08 August 2014" "JDK 8" "Basic Tools" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" + java \- Launches a Java application\&. +-.SH SYNOPSIS +-.sp +-.nf +- ++.SH "SYNOPSIS" ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjava\fR [\fIoptions\fR] \fIclassname\fR [\fIargs\fR] +-.fi +-.nf +- ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjava\fR [\fIoptions\fR] \fB\-jar\fR \fIfilename\fR [\fIargs\fR] +-.fi +-.sp +-.TP ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + \fIoptions\fR +-Command-line options separated by spaces\&. See Options\&. +-.TP ++.RS 4 ++Command\-line options separated by spaces\&. See Options\&. ++.RE ++.PP + \fIclassname\fR ++.RS 4 + The name of the class to be launched\&. +-.TP ++.RE ++.PP + \fIfilename\fR +-The name of the Java Archive (JAR) file to be called\&. Used only with the \f3-jar\fR option\&. +-.TP ++.RS 4 ++The name of the Java Archive (JAR) file to be called\&. Used only with the ++\fB\-jar\fR ++option\&. ++.RE ++.PP + \fIargs\fR +-The arguments passed to the \f3main()\fR method separated by spaces\&. +-.SH DESCRIPTION +-The \f3java\fR command starts a Java application\&. It does this by starting the Java Runtime Environment (JRE), loading the specified class, and calling that class\&'s \f3main()\fR method\&. The method must be declared \fIpublic\fR and \fIstatic\fR, it must not return any value, and it must accept a \f3String\fR array as a parameter\&. The method declaration has the following form: +-.sp +-.nf +-\f3public static void main(String[] args)\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The \f3java\fR command can be used to launch a JavaFX application by loading a class that either has a \f3main()\fR method or that extends \f3javafx\&.application\&.Application\fR\&. In the latter case, the launcher constructs an instance of the \f3Application\fR class, calls its \f3init()\fR method, and then calls the \f3start(javafx\&.stage\&.Stage)\fR method\&. ++.RS 4 ++The arguments passed to the ++\fBmain()\fR ++method separated by spaces\&. ++.RE ++.SH "DESCRIPTION" + .PP +-By default, the first argument that is not an option of the \f3java\fR command is the fully qualified name of the class to be called\&. If the \f3-jar\fR option is specified, its argument is the name of the JAR file containing class and resource files for the application\&. The startup class must be indicated by the \f3Main-Class\fR manifest header in its source code\&. ++The ++\fBjava\fR ++command starts a Java application\&. It does this by starting the Java Runtime Environment (JRE), loading the specified class, and calling that class\*(Aqs ++\fBmain()\fR ++method\&. The method must be declared ++\fIpublic\fR ++and ++\fIstatic\fR, it must not return any value, and it must accept a ++\fBString\fR ++array as a parameter\&. The method declaration has the following form: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic static void main(String[] args)\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The ++\fBjava\fR ++command can be used to launch a JavaFX application by loading a class that either has a ++\fBmain()\fR ++method or that extends ++\fBjavafx\&.application\&.Application\fR\&. In the latter case, the launcher constructs an instance of the ++\fBApplication\fR ++class, calls its ++\fBinit()\fR ++method, and then calls the ++\fBstart(javafx\&.stage\&.Stage)\fR ++method\&. ++.PP ++By default, the first argument that is not an option of the ++\fBjava\fR ++command is the fully qualified name of the class to be called\&. If the ++\fB\-jar\fR ++option is specified, its argument is the name of the JAR file containing class and resource files for the application\&. The startup class must be indicated by the ++\fBMain\-Class\fR ++manifest header in its source code\&. + .PP + The JRE searches for the startup class (and other classes used by the application) in three sets of locations: the bootstrap class path, the installed extensions, and the user\(cqs class path\&. + .PP +-Arguments after the class file name or the JAR file name are passed to the \f3main()\fR method\&. +-.SH OPTIONS +-The \f3java\fR command supports a wide range of options that can be divided into the following categories: +-.TP 0.2i +-\(bu ++Arguments after the class file name or the JAR file name are passed to the ++\fBmain()\fR ++method\&. ++.SH "OPTIONS" ++.PP ++The ++\fBjava\fR ++command supports a wide range of options that can be divided into the following categories: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Standard Options +-.TP 0.2i +-\(bu +-Non-Standard Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Non\-Standard Options ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced Runtime Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced JIT Compiler Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced Serviceability Options +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Advanced Garbage Collection Options ++.RE + .PP + Standard options are guaranteed to be supported by all implementations of the Java Virtual Machine (JVM)\&. They are used for common actions, such as checking the version of the JRE, setting the class path, enabling verbose output, and so on\&. + .PP +-Non-standard options are general purpose options that are specific to the Java HotSpot Virtual Machine, so they are not guaranteed to be supported by all JVM implementations, and are subject to change\&. These options start with \f3-X\fR\&. ++Non\-standard options are general purpose options that are specific to the Java HotSpot Virtual Machine, so they are not guaranteed to be supported by all JVM implementations, and are subject to change\&. These options start with ++\fB\-X\fR\&. + .PP +-Advanced options are not recommended for casual use\&. These are developer options used for tuning specific areas of the Java HotSpot Virtual Machine operation that often have specific system requirements and may require privileged access to system configuration parameters\&. They are also not guaranteed to be supported by all JVM implementations, and are subject to change\&. Advanced options start with \f3-XX\fR\&. ++Advanced options are not recommended for casual use\&. These are developer options used for tuning specific areas of the Java HotSpot Virtual Machine operation that often have specific system requirements and may require privileged access to system configuration parameters\&. They are also not guaranteed to be supported by all JVM implementations, and are subject to change\&. Advanced options start with ++\fB\-XX\fR\&. + .PP + To keep track of the options that were deprecated or removed in the latest release, there is a section named Deprecated and Removed Options at the end of the document\&. + .PP +-Boolean options are used to either enable a feature that is disabled by default or disable a feature that is enabled by default\&. Such options do not require a parameter\&. Boolean \f3-XX\fR options are enabled using the plus sign (\f3-XX:+\fR\fIOptionName\fR) and disabled using the minus sign (\f3-XX:-\fR\fIOptionName\fR)\&. ++Boolean options are used to either enable a feature that is disabled by default or disable a feature that is enabled by default\&. Such options do not require a parameter\&. Boolean ++\fB\-XX\fR ++options are enabled using the plus sign (\fB\-XX:+\fR\fIOptionName\fR) and disabled using the minus sign (\fB\-XX:\-\fR\fIOptionName\fR)\&. + .PP +-For options that require an argument, the argument may be separated from the option name by a space, a colon (:), or an equal sign (=), or the argument may directly follow the option (the exact syntax differs for each option)\&. If you are expected to specify the size in bytes, you can use no suffix, or use the suffix \f3k\fR or \f3K\fR for kilobytes (KB), \f3m\fR or \f3M\fR for megabytes (MB), \f3g\fR or \f3G\fR for gigabytes (GB)\&. For example, to set the size to 8 GB, you can specify either \f38g\fR, \f38192m\fR, \f38388608k\fR, or \f38589934592\fR as the argument\&. If you are expected to specify the percentage, use a number from 0 to 1 (for example, specify \f30\&.25\fR for 25%)\&. +-.SS STANDARD\ OPTIONS ++For options that require an argument, the argument may be separated from the option name by a space, a colon (:), or an equal sign (=), or the argument may directly follow the option (the exact syntax differs for each option)\&. If you are expected to specify the size in bytes, you can use no suffix, or use the suffix ++\fBk\fR ++or ++\fBK\fR ++for kilobytes (KB), ++\fBm\fR ++or ++\fBM\fR ++for megabytes (MB), ++\fBg\fR ++or ++\fBG\fR ++for gigabytes (GB)\&. For example, to set the size to 8 GB, you can specify either ++\fB8g\fR, ++\fB8192m\fR, ++\fB8388608k\fR, or ++\fB8589934592\fR ++as the argument\&. If you are expected to specify the percentage, use a number from 0 to 1 (for example, specify ++\fB0\&.25\fR ++for 25%)\&. ++.SS "Standard Options" ++.PP + These are the most commonly used options that are supported by all implementations of the JVM\&. +-.TP +--agentlib:\fIlibname\fR[=\fIoptions\fR] ++.PP ++\-agentlib:\fIlibname\fR[=\fIoptions\fR] ++.RS 4 ++Loads the specified native agent library\&. After the library name, a comma\-separated list of options specific to the library can be used\&. ++.sp ++If the option ++\fB\-agentlib:foo\fR ++is specified, then the JVM attempts to load the library named ++\fBlibfoo\&.so\fR ++in the location specified by the ++\fBLD_LIBRARY_PATH\fR ++system variable (on OS X this variable is ++\fBDYLD_LIBRARY_PATH\fR)\&. ++.sp ++The following example shows how to load the heap profiling tool (HPROF) library and get sample CPU information every 20 ms, with a stack depth of 3: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-agentlib:hprof=cpu=samples,interval=20,depth=3\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example shows how to load the Java Debug Wire Protocol (JDWP) library and listen for the socket connection on port 8000, suspending the JVM before the main class loads: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-agentlib:jdwp=transport=dt_socket,server=y,address=8000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++For more information about the native agent libraries, refer to the following: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++The ++\fBjava\&.lang\&.instrument\fR ++package description at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Agent Command Line Options in the JVM Tools Interface guide at http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting ++.RE ++.RE ++.PP ++\-agentpath:\fIpathname\fR[=\fIoptions\fR] ++.RS 4 ++Loads the native agent library specified by the absolute path name\&. This option is equivalent to ++\fB\-agentlib\fR ++but uses the full path and file name of the library\&. ++.RE ++.PP ++\-client ++.RS 4 ++Selects the Java HotSpot Client VM\&. The 64\-bit version of the Java SE Development Kit (JDK) currently ignores this option and instead uses the Server JVM\&. ++.sp ++For default JVM selection, see Server\-Class Machine Detection at ++ ++http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server\-class\&.html ++.RE ++.PP ++\-D\fIproperty\fR=\fIvalue\fR ++.RS 4 ++Sets a system property value\&. The ++\fIproperty\fR ++variable is a string with no spaces that represents the name of the property\&. The ++\fIvalue\fR ++variable is a string that represents the value of the property\&. If ++\fIvalue\fR ++is a string with spaces, then enclose it in quotation marks (for example ++\fB\-Dfoo="foo bar"\fR)\&. ++.RE ++.PP ++\-d32 ++.RS 4 ++Runs the application in a 32\-bit environment\&. If a 32\-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32\-bit environment unless a 64\-bit system is used\&. ++.RE ++.PP ++\-d64 ++.RS 4 ++Runs the application in a 64\-bit environment\&. If a 64\-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32\-bit environment unless a 64\-bit system is used\&. ++.sp ++Currently only the Java HotSpot Server VM supports 64\-bit operation, and the ++\fB\-server\fR ++option is implicit with the use of ++\fB\-d64\fR\&. The ++\fB\-client\fR ++option is ignored with the use of ++\fB\-d64\fR\&. This is subject to change in a future release\&. ++.RE ++.PP ++\-disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] + .br +-Loads the specified native agent library\&. After the library name, a comma-separated list of options specific to the library can be used\&. ++\-da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.RS 4 ++Disables assertions\&. By default, assertions are disabled in all packages and classes\&. ++.sp ++With no arguments, ++\fB\-disableassertions\fR ++(\fB\-da\fR) disables assertions in all packages and classes\&. With the ++\fIpackagename\fR ++argument ending in ++\fB\&.\&.\&.\fR, the switch disables assertions in the specified package and any subpackages\&. If the argument is simply ++\fB\&.\&.\&.\fR, then the switch disables assertions in the unnamed package in the current working directory\&. With the ++\fIclassname\fR ++argument, the switch disables assertions in the specified class\&. ++.sp ++The ++\fB\-disableassertions\fR ++(\fB\-da\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to disable assertions in all classes except for system classes\&. The ++\fB\-disablesystemassertions\fR ++option enables you to disable assertions in all system classes\&. ++.sp ++To explicitly enable assertions in specific packages or classes, use the ++\fB\-enableassertions\fR ++(\fB\-ea\fR) option\&. Both options can be used at the same time\&. For example, to run the ++\fBMyClass\fR ++application with assertions enabled in package ++\fBcom\&.wombat\&.fruitbat\fR ++(and any subpackages) but disabled in class ++\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-disablesystemassertions ++.br ++\-dsa ++.RS 4 ++Disables assertions in all system classes\&. ++.RE ++.PP ++\-enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.br ++\-ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] ++.RS 4 ++Enables assertions\&. By default, assertions are disabled in all packages and classes\&. ++.sp ++With no arguments, ++\fB\-enableassertions\fR ++(\fB\-ea\fR) enables assertions in all packages and classes\&. With the ++\fIpackagename\fR ++argument ending in ++\fB\&.\&.\&.\fR, the switch enables assertions in the specified package and any subpackages\&. If the argument is simply ++\fB\&.\&.\&.\fR, then the switch enables assertions in the unnamed package in the current working directory\&. With the ++\fIclassname\fR ++argument, the switch enables assertions in the specified class\&. ++.sp ++The ++\fB\-enableassertions\fR ++(\fB\-ea\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to enable assertions in all classes except for system classes\&. The ++\fB\-enablesystemassertions\fR ++option provides a separate switch to enable assertions in all system classes\&. ++.sp ++To explicitly disable assertions in specific packages or classes, use the ++\fB\-disableassertions\fR ++(\fB\-da\fR) option\&. If a single command contains multiple instances of these switches, then they are processed in order before loading any classes\&. For example, to run the ++\fBMyClass\fR ++application with assertions enabled only in package ++\fBcom\&.wombat\&.fruitbat\fR ++(and any subpackages) but disabled in class ++\fBcom\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-enablesystemassertions ++.br ++\-esa ++.RS 4 ++Enables assertions in all system classes\&. ++.RE ++.PP ++\-help ++.br ++\-? ++.RS 4 ++Displays usage information for the ++\fBjava\fR ++command without actually running the JVM\&. ++.RE ++.PP ++\-jar \fIfilename\fR ++.RS 4 ++Executes a program encapsulated in a JAR file\&. The ++\fIfilename\fR ++argument is the name of a JAR file with a manifest that contains a line in the form ++\fBMain\-Class:\fR\fIclassname\fR ++that defines the class with the ++\fBpublic static void main(String[] args)\fR ++method that serves as your application\*(Aqs starting point\&. ++.sp ++When you use the ++\fB\-jar\fR ++option, the specified JAR file is the source of all user classes, and other class path settings are ignored\&. ++.sp ++For more information about JAR files, see the following resources: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++jar(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++The Java Archive (JAR) Files guide at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jar/index\&.html ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Lesson: Packaging Programs in JAR Files at + +-If the option \f3-agentlib:foo\fR is specified, then the JVM attempts to load the library named \f3libfoo\&.so\fR in the location specified by the \f3LD_LIBRARY_PATH\fR system variable (on OS X this variable is \f3DYLD_LIBRARY_PATH\fR)\&. ++http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html ++.RE ++.RE ++.PP ++\-javaagent:\fIjarpath\fR[=\fIoptions\fR] ++.RS 4 ++Loads the specified Java programming language agent\&. For more information about instrumenting Java applications, see the ++\fBjava\&.lang\&.instrument\fR ++package description in the Java API documentation at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package\-summary\&.html ++.RE ++.PP ++\-jre\-restrict\-search ++.RS 4 ++Includes user\-private JREs in the version search\&. ++.RE ++.PP ++\-no\-jre\-restrict\-search ++.RS 4 ++Excludes user\-private JREs from the version search\&. ++.RE ++.PP ++\-server ++.RS 4 ++Selects the Java HotSpot Server VM\&. The 64\-bit version of the JDK supports only the Server VM, so in that case the option is implicit\&. ++.sp ++For default JVM selection, see Server\-Class Machine Detection at + +-The following example shows how to load the heap profiling tool (HPROF) library and get sample CPU information every 20 ms, with a stack depth of 3: +-.sp +-.nf +-\f3\-agentlib:hprof=cpu=samples,interval=20,depth=3\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following example shows how to load the Java Debug Wire Protocol (JDWP) library and listen for the socket connection on port 8000, suspending the JVM before the main class loads: +-.sp +-.nf +-\f3\-agentlib:jdwp=transport=dt_socket,server=y,address=8000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-For more information about the native agent libraries, refer to the following: +-.RS +-.TP 0.2i +-\(bu +-The \f3java\&.lang\&.instrument\fR package description at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package-summary\&.html +-.TP 0.2i +-\(bu +-Agent Command Line Options in the JVM Tools Interface guide at http://docs\&.oracle\&.com/javase/8/docs/platform/jvmti/jvmti\&.html#starting +-.RE +- +-.TP +--agentpath:\fIpathname\fR[=\fIoptions\fR] +-.br +-Loads the native agent library specified by the absolute path name\&. This option is equivalent to \f3-agentlib\fR but uses the full path and file name of the library\&. +-.TP +--client +-.br +-Selects the Java HotSpot Client VM\&. The 64-bit version of the Java SE Development Kit (JDK) currently ignores this option and instead uses the Server JVM\&. +- +-For default JVM selection, see Server-Class Machine Detection at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server-class\&.html +-.TP +--D\fIproperty\fR=\fIvalue\fR +-.br +-Sets a system property value\&. The \fIproperty\fR variable is a string with no spaces that represents the name of the property\&. The \fIvalue\fR variable is a string that represents the value of the property\&. If \fIvalue\fR is a string with spaces, then enclose it in quotation marks (for example \f3-Dfoo="foo bar"\fR)\&. +-.TP +--d32 +-.br +-Runs the application in a 32-bit environment\&. If a 32-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32-bit environment unless a 64-bit system is used\&. +-.TP +--d64 +-.br +-Runs the application in a 64-bit environment\&. If a 64-bit environment is not installed or is not supported, then an error will be reported\&. By default, the application is run in a 32-bit environment unless a 64-bit system is used\&. +- +-Currently only the Java HotSpot Server VM supports 64-bit operation, and the \f3-server\fR option is implicit with the use of \f3-d64\fR\&. The \f3-client\fR option is ignored with the use of \f3-d64\fR\&. This is subject to change in a future release\&. +-.TP ++http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server\-class\&.html ++.RE ++.PP ++\-showversion ++.RS 4 ++Displays version information and continues execution of the application\&. This option is equivalent to the ++\fB\-version\fR ++option except that the latter instructs the JVM to exit after displaying version information\&. ++.RE ++.PP ++\-splash:\fIimgname\fR ++.RS 4 ++Shows the splash screen with the image specified by ++\fIimgname\fR\&. For example, to show the ++\fBsplash\&.gif\fR ++file from the ++\fBimages\fR ++directory when starting your application, use the following option: ++.sp ++.if n \{\ ++.RS 4 ++.\} + .nf +--disableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], -da[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] +-.br ++\fB\-splash:images/splash\&.gif\fR ++ + .fi +-Disables assertions\&. By default, assertions are disabled in all packages and classes\&. +- +-With no arguments, \f3-disableassertions\fR (\f3-da\fR) disables assertions in all packages and classes\&. With the \fIpackagename\fR argument ending in \f3\&.\&.\&.\fR, the switch disables assertions in the specified package and any subpackages\&. If the argument is simply \f3\&.\&.\&.\fR, then the switch disables assertions in the unnamed package in the current working directory\&. With the \fIclassname\fR argument\f3\fR, the switch disables assertions in the specified class\&. +- +-The \f3-disableassertions\fR (\f3-da\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to disable assertions in all classes except for system classes\&. The \f3-disablesystemassertions\fR option enables you to disable assertions in all system classes\&. +- +-To explicitly enable assertions in specific packages or classes, use the \f3-enableassertions\fR (\f3-ea\fR) option\&. Both options can be used at the same time\&. For example, to run the \f3MyClass\fR application with assertions enabled in package \f3com\&.wombat\&.fruitbat\fR (and any subpackages) but disabled in class \f3com\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: +-.sp +-.nf +-\f3java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--disablesystemassertions, -dsa +-.br +-Disables assertions in all system classes\&. +-.TP ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-verbose:class ++.RS 4 ++Displays information about each loaded class\&. ++.RE ++.PP ++\-verbose:gc ++.RS 4 ++Displays information about each garbage collection (GC) event\&. ++.RE ++.PP ++\-verbose:jni ++.RS 4 ++Displays information about the use of native methods and other Java Native Interface (JNI) activity\&. ++.RE ++.PP ++\-version ++.RS 4 ++Displays version information and then exits\&. This option is equivalent to the ++\fB\-showversion\fR ++option except that the latter does not instruct the JVM to exit after displaying version information\&. ++.RE ++.PP ++\-version:\fIrelease\fR ++.RS 4 ++Specifies the release version to be used for running the application\&. If the version of the ++\fBjava\fR ++command called does not meet this specification and an appropriate implementation is found on the system, then the appropriate implementation will be used\&. ++.sp ++The ++\fIrelease\fR ++argument specifies either the exact version string, or a list of version strings and ranges separated by spaces\&. A ++\fIversion string\fR ++is the developer designation of the version number in the following form: ++\fB1\&.\fR\fIx\fR\fB\&.0_\fR\fIu\fR ++(where ++\fIx\fR ++is the major version number, and ++\fIu\fR ++is the update version number)\&. A ++\fIversion range\fR ++is made up of a version string followed by a plus sign (\fB+\fR) to designate this version or later, or a part of a version string followed by an asterisk (\fB*\fR) to designate any version string with a matching prefix\&. Version strings and ranges can be combined using a space for a logical ++\fIOR\fR ++combination, or an ampersand (\fB&\fR) for a logical ++\fIAND\fR ++combination of two version strings/ranges\&. For example, if running the class or JAR file requires either JRE 6u13 (1\&.6\&.0_13), or any JRE 6 starting from 6u10 (1\&.6\&.0_10), specify the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} + .nf +--enableassertions[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR], -ea[:[\fIpackagename\fR]\&.\&.\&.|:\fIclassname\fR] +-.br ++\fB\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+"\fR ++ + .fi +-Enables assertions\&. By default, assertions are disabled in all packages and classes\&. +- +-With no arguments, \f3-enableassertions\fR (\f3-ea\fR) enables assertions in all packages and classes\&. With the \fIpackagename\fR argument ending in \f3\&.\&.\&.\fR, the switch enables assertions in the specified package and any subpackages\&. If the argument is simply \f3\&.\&.\&.\fR, then the switch enables assertions in the unnamed package in the current working directory\&. With the \fIclassname\fR argument\f3\fR, the switch enables assertions in the specified class\&. +- +-The \f3-enableassertions\fR (\f3-ea\fR) option applies to all class loaders and to system classes (which do not have a class loader)\&. There is one exception to this rule: if the option is provided with no arguments, then it does not apply to system classes\&. This makes it easy to enable assertions in all classes except for system classes\&. The \f3-enablesystemassertions\fR option provides a separate switch to enable assertions in all system classes\&. +- +-To explicitly disable assertions in specific packages or classes, use the \f3-disableassertions\fR (\f3-da\fR) option\&. If a single command contains multiple instances of these switches, then they are processed in order before loading any classes\&. For example, to run the \f3MyClass\fR application with assertions enabled only in package \f3com\&.wombat\&.fruitbat\fR (and any subpackages) but disabled in class \f3com\&.wombat\&.fruitbat\&.Brickbat\fR, use the following command: +-.sp +-.nf +-\f3java \-ea:com\&.wombat\&.fruitbat\&.\&.\&. \-da:com\&.wombat\&.fruitbat\&.Brickbat MyClass\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--enablesystemassertions, -esa +-.br +-Enables assertions in all system classes\&. +-.TP +--help, -? +-.br +-Displays usage information for the \f3java\fR command without actually running the JVM\&. +-.TP +--jar \fIfilename\fR +-.br +-Executes a program encapsulated in a JAR file\&. The \fIfilename\fR argument is the name of a JAR file with a manifest that contains a line in the form \f3Main-Class:\fR\fIclassname\fR that defines the class with the \f3public static void main(String[] args)\fR method that serves as your application\&'s starting point\&. +- +-When you use the \f3-jar\fR option, the specified JAR file is the source of all user classes, and other class path settings are ignored\&. +- +-For more information about JAR files, see the following resources: +-.RS +-.TP 0.2i +-\(bu +-jar(1) +-.TP 0.2i +-\(bu +-The Java Archive (JAR) Files guide at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/jar/index\&.html +-.TP 0.2i +-\(bu +-Lesson: Packaging Programs in JAR Files at http://docs\&.oracle\&.com/javase/tutorial/deployment/jar/index\&.html +-.RE +- +-.TP +--javaagent:\fIjarpath\fR[=\fIoptions\fR] +-.br +-Loads the specified Java programming language agent\&. For more information about instrumenting Java applications, see the \f3java\&.lang\&.instrument\fR package description in the Java API documentation at http://docs\&.oracle\&.com/javase/8/docs/api/java/lang/instrument/package-summary\&.html +-.TP +--jre-restrict-search +-.br +-Includes user-private JREs in the version search\&. +-.TP +--no-jre-restrict-search +-.br +-Excludes user-private JREs from the version search\&. +-.TP +--server +-.br +-Selects the Java HotSpot Server VM\&. The 64-bit version of the JDK supports only the Server VM, so in that case the option is implicit\&. +- +-For default JVM selection, see Server-Class Machine Detection at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/server-class\&.html +-.TP +--showversion +-.br +-Displays version information and continues execution of the application\&. This option is equivalent to the \f3-version\fR option except that the latter instructs the JVM to exit after displaying version information\&. +-.TP +--splash:\fIimgname\fR +-.br +-Shows the splash screen with the image specified by \fIimgname\fR\&. For example, to show the \f3splash\&.gif\fR file from the \f3images\fR directory when starting your application, use the following option: +-.sp +-.nf +-\f3\-splash:images/splash\&.gif\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--verbose:class +-.br +-Displays information about each loaded class\&. +-.TP +--verbose:gc +-.br +-Displays information about each garbage collection (GC) event\&. +-.TP +--verbose:jni +-.br +-Displays information about the use of native methods and other Java Native Interface (JNI) activity\&. +-.TP +--version +-.br +-Displays version information and then exits\&. This option is equivalent to the \f3-showversion\fR option except that the latter does not instruct the JVM to exit after displaying version information\&. +-.TP +--version:\fIrelease\fR +-.br +-Specifies the release version to be used for running the application\&. If the version of the \f3java\fR command called does not meet this specification and an appropriate implementation is found on the system, then the appropriate implementation will be used\&. +- +-The \fIrelease\fR argument specifies either the exact version string, or a list of version strings and ranges separated by spaces\&. A \fIversion string\fR is the developer designation of the version number in the following form: \f31\&.\fR\fIx\fR\f3\&.0_\fR\fIu\fR (where \fIx\fR is the major version number, and \fIu\fR is the update version number)\&. A \fIversion range\fR is made up of a version string followed by a plus sign (\f3+\fR) to designate this version or later, or a part of a version string followed by an asterisk (\f3*\fR) to designate any version string with a matching prefix\&. Version strings and ranges can be combined using a space for a logical \fIOR\fR combination, or an ampersand (\f3&\fR) for a logical \fIAND\fR combination of two version strings/ranges\&. For example, if running the class or JAR file requires either JRE 6u13 (1\&.6\&.0_13), or any JRE 6 starting from 6u10 (1\&.6\&.0_10), specify the following: +-.sp +-.nf +-\f3\-version:"1\&.6\&.0_13 1\&.6* & 1\&.6\&.0_10+"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Quotation marks are necessary only if there are spaces in the \fIrelease\fR parameter\&. +- ++.if n \{\ ++.RE ++.\} ++Quotation marks are necessary only if there are spaces in the ++\fIrelease\fR ++parameter\&. ++.sp + For JAR files, the preference is to specify version requirements in the JAR file manifest rather than on the command line\&. +-.SS NON-STANDARD\ OPTIONS ++.RE ++.SS "Non\-Standard Options" ++.PP + These options are general purpose options that are specific to the Java HotSpot Virtual Machine\&. +-.TP +--X +-.br +-Displays help for all available \f3-X\fR options\&. +-.TP +--Xbatch +-.br +-Disables background compilation\&. By default, the JVM compiles the method as a background task, running the method in interpreter mode until the background compilation is finished\&. The \f3-Xbatch\fR flag disables background compilation so that compilation of all methods proceeds as a foreground task until completed\&. +- +-This option is equivalent to \f3-XX:-BackgroundCompilation\fR\&. +-.TP +--Xbootclasspath:\fIpath\fR +-.br ++.PP ++\-X ++.RS 4 ++Displays help for all available ++\fB\-X\fR ++options\&. ++.RE ++.PP ++\-Xbatch ++.RS 4 ++Disables background compilation\&. By default, the JVM compiles the method as a background task, running the method in interpreter mode until the background compilation is finished\&. The ++\fB\-Xbatch\fR ++flag disables background compilation so that compilation of all methods proceeds as a foreground task until completed\&. ++.sp ++This option is equivalent to ++\fB\-XX:\-BackgroundCompilation\fR\&. ++.RE ++.PP ++\-Xbootclasspath:\fIpath\fR ++.RS 4 + Specifies a list of directories, JAR files, and ZIP archives separated by colons (:) to search for boot class files\&. These are used in place of the boot class files included in the JDK\&. +- +-\fI\fRDo not deploy applications that use this option to override a class in \f3rt\&.jar\fR, because this violates the JRE binary code license\&. +-.TP +--Xbootclasspath/a:\fIpath\fR +-.br ++.sp ++Do not deploy applications that use this option to override a class in ++\fBrt\&.jar\fR, because this violates the JRE binary code license\&. ++.RE ++.PP ++\-Xbootclasspath/a:\fIpath\fR ++.RS 4 + Specifies a list of directories, JAR files, and ZIP archives separated by colons (:) to append to the end of the default bootstrap class path\&. +- +-Do not deploy applications that use this option to override a class in \f3rt\&.jar\fR, because this violates the JRE binary code license\&. +-.TP +--Xbootclasspath/p:\fIpath\fR +-.br ++.sp ++Do not deploy applications that use this option to override a class in ++\fBrt\&.jar\fR, because this violates the JRE binary code license\&. ++.RE ++.PP ++\-Xbootclasspath/p:\fIpath\fR ++.RS 4 + Specifies a list of directories, JAR files, and ZIP archives separated by colons (:) to prepend to the front of the default bootstrap class path\&. +- +-Do not deploy applications that use this option to override a class in \f3rt\&.jar\fR, because this violates the JRE binary code license\&. +-.TP +--Xboundthreads +-.br +-Binds user-level threads to kernel threads\&. +-.TP +--Xcheck:jni +-.br ++.sp ++Do not deploy applications that use this option to override a class in ++\fBrt\&.jar\fR, because this violates the JRE binary code license\&. ++.RE ++.PP ++\-Xcheck:jni ++.RS 4 + Performs additional checks for Java Native Interface (JNI) functions\&. Specifically, it validates the parameters passed to the JNI function and the runtime environment data before processing the JNI request\&. Any invalid data encountered indicates a problem in the native code, and the JVM will terminate with an irrecoverable error in such cases\&. Expect a performance degradation when this option is used\&. +-.TP +--Xcomp +-.br +-Forces compilation of methods on first invocation\&. By default, the Client VM (\f3-client\fR) performs 1,000 interpreted method invocations and the Server VM (\f3-server\fR) performs 10,000 interpreted method invocations to gather information for efficient compilation\&. Specifying the \f3-Xcomp\fR option disables interpreted method invocations to increase compilation performance at the expense of efficiency\&. +- +-You can also change the number of interpreted method invocations before compilation using the \f3-XX:CompileThreshold\fR option\&. +-.TP +--Xdebug +-.br ++.RE ++.PP ++\-Xcomp ++.RS 4 ++Forces compilation of methods on first invocation\&. By default, the Client VM (\fB\-client\fR) performs 1,000 interpreted method invocations and the Server VM (\fB\-server\fR) performs 10,000 interpreted method invocations to gather information for efficient compilation\&. Specifying the ++\fB\-Xcomp\fR ++option disables interpreted method invocations to increase compilation performance at the expense of efficiency\&. ++.sp ++You can also change the number of interpreted method invocations before compilation using the ++\fB\-XX:CompileThreshold\fR ++option\&. ++.RE ++.PP ++\-Xdebug ++.RS 4 + Does nothing\&. Provided for backward compatibility\&. +-.TP +--Xdiag +-.br ++.RE ++.PP ++\-Xdiag ++.RS 4 + Shows additional diagnostic messages\&. +-.TP +--Xfuture +-.br +-Enables strict class-file format checks that enforce close conformance to the class-file format specification\&. Developers are encouraged to use this flag when developing new code because the stricter checks will become the default in future releases\&. +-.TP +--Xint +-.br +-Runs the application in interpreted-only mode\&. Compilation to native code is disabled, and all bytecode is executed by the interpreter\&. The performance benefits offered by the just in time (JIT) compiler are not present in this mode\&. +-.TP +--Xinternalversion +-.br +-Displays more detailed JVM version information than the \f3-version\fR option, and then exits\&. +-.TP +--Xloggc:\fIfilename\fR +-.br +-Sets the file to which verbose GC events information should be redirected for logging\&. The information written to this file is similar to the output of \f3-verbose:gc\fR with the time elapsed since the first GC event preceding each logged event\&. The \f3-Xloggc\fR option overrides \f3-verbose:gc\fR if both are given with the same \f3java\fR command\&. +- ++.RE ++.PP ++\-Xfuture ++.RS 4 ++Enables strict class\-file format checks that enforce close conformance to the class\-file format specification\&. Developers are encouraged to use this flag when developing new code because the stricter checks will become the default in future releases\&. ++.RE ++.PP ++\-Xint ++.RS 4 ++Runs the application in interpreted\-only mode\&. Compilation to native code is disabled, and all bytecode is executed by the interpreter\&. The performance benefits offered by the just in time (JIT) compiler are not present in this mode\&. ++.RE ++.PP ++\-Xinternalversion ++.RS 4 ++Displays more detailed JVM version information than the ++\fB\-version\fR ++option, and then exits\&. ++.RE ++.PP ++\-Xloggc:\fIfilename\fR ++.RS 4 ++Sets the file to which verbose GC events information should be redirected for logging\&. The information written to this file is similar to the output of ++\fB\-verbose:gc\fR ++with the time elapsed since the first GC event preceding each logged event\&. The ++\fB\-Xloggc\fR ++option overrides ++\fB\-verbose:gc\fR ++if both are given with the same ++\fBjava\fR ++command\&. ++.sp + Example: +-.sp +-.nf +-\f3\-Xloggc:garbage\-collection\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--Xmaxjitcodesize=\fIsize\fR +-.br +-Specifies the maximum code cache size (in bytes) for JIT-compiled code\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the value is set to 48 MB: +-.sp +-.nf +-\f3\-Xmaxjitcodesize=48m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-This option is equivalent to \f3-XX:ReservedCodeCacheSize\fR\&. +-.TP +--Xmixed +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xloggc:garbage\-collection\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-Xmaxjitcodesize=\fIsize\fR ++.RS 4 ++Specifies the maximum code cache size (in bytes) for JIT\-compiled code\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the value is set to 48 MB: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xmaxjitcodesize=48m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This option is equivalent to ++\fB\-XX:ReservedCodeCacheSize\fR\&. ++.RE ++.PP ++\-Xmixed ++.RS 4 + Executes all bytecode by the interpreter except for hot methods, which are compiled to native code\&. +-.TP +--Xmn\fIsize\fR +-.br +-Sets the initial and maximum size (in bytes) of the heap for the young generation (nursery)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. +- ++.RE ++.PP ++\-Xmn\fIsize\fR ++.RS 4 ++Sets the initial and maximum size (in bytes) of the heap for the young generation (nursery)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. ++.sp + The young generation region of the heap is used for new objects\&. GC is performed in this region more often than in other regions\&. If the size for the young generation is too small, then a lot of minor garbage collections will be performed\&. If the size is too large, then only full garbage collections will be performed, which can take a long time to complete\&. Oracle recommends that you keep the size for the young generation between a half and a quarter of the overall heap size\&. +- ++.sp + The following examples show how to set the initial and maximum size of young generation to 256 MB using various units: +-.sp +-.nf +-\f3\-Xmn256m\fP +-.fi +-.nf +-\f3\-Xmn262144k\fP +-.fi +-.nf +-\f3\-Xmn268435456\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Instead of the \f3-Xmn\fR option to set both the initial and maximum size of the heap for the young generation, you can use \f3-XX:NewSize\fR to set the initial size and \f3-XX:MaxNewSize\fR to set the maximum size\&. +-.TP +--Xms\fIsize\fR +-.br +-Sets the initial size (in bytes) of the heap\&. This value must be a multiple of 1024 and greater than 1 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xmn256m\fR ++\fB\-Xmn262144k\fR ++\fB\-Xmn268435456\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Instead of the ++\fB\-Xmn\fR ++option to set both the initial and maximum size of the heap for the young generation, you can use ++\fB\-XX:NewSize\fR ++to set the initial size and ++\fB\-XX:MaxNewSize\fR ++to set the maximum size\&. ++.RE ++.PP ++\-Xms\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of the heap\&. This value must be a multiple of 1024 and greater than 1 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. ++.sp + The following examples show how to set the size of allocated memory to 6 MB using various units: +-.sp +-.nf +-\f3\-Xms6291456\fP +-.fi +-.nf +-\f3\-Xms6144k\fP +-.fi +-.nf +-\f3\-Xms6m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If you do not set this option, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The initial size of the heap for the young generation can be set using the \f3-Xmn\fR option or the \f3-XX:NewSize\fR option\&. +-.TP +--Xmx\fIsize\fR +-.br +-Specifies the maximum size (in bytes) of the memory allocation pool in bytes\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, \f3-Xms\fR and \f3-Xmx\fR are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc-ergonomics\&.html +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xms6291456\fR ++\fB\-Xms6144k\fR ++\fB\-Xms6m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you do not set this option, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The initial size of the heap for the young generation can be set using the ++\fB\-Xmn\fR ++option or the ++\fB\-XX:NewSize\fR ++option\&. ++.RE ++.PP ++\-Xmx\fIsize\fR ++.RS 4 ++Specifies the maximum size (in bytes) of the memory allocation pool in bytes\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, ++\fB\-Xms\fR ++and ++\fB\-Xmx\fR ++are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html ++.sp + The following examples show how to set the maximum allowed size of allocated memory to 80 MB using various units: +-.sp +-.nf +-\f3\-Xmx83886080\fP +-.fi +-.nf +-\f3\-Xmx81920k\fP +-.fi +-.nf +-\f3\-Xmx80m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The \f3-Xmx\fR option is equivalent to \f3-XX:MaxHeapSize\fR\&. +-.TP +--Xnoclassgc +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xmx83886080\fR ++\fB\-Xmx81920k\fR ++\fB\-Xmx80m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The ++\fB\-Xmx\fR ++option is equivalent to ++\fB\-XX:MaxHeapSize\fR\&. ++.RE ++.PP ++\-Xnoclassgc ++.RS 4 + Disables garbage collection (GC) of classes\&. This can save some GC time, which shortens interruptions during the application run\&. +- +-When you specify \f3-Xnoclassgc\fR at startup, the class objects in the application will be left untouched during GC and will always be considered live\&. This can result in more memory being permanently occupied which, if not used carefully, will throw an out of memory exception\&. +-.TP +--Xprof +-.br ++.sp ++When you specify ++\fB\-Xnoclassgc\fR ++at startup, the class objects in the application will be left untouched during GC and will always be considered live\&. This can result in more memory being permanently occupied which, if not used carefully, will throw an out of memory exception\&. ++.RE ++.PP ++\-Xprof ++.RS 4 + Profiles the running program and sends profiling data to standard output\&. This option is provided as a utility that is useful in program development and is not intended to be used in production systems\&. +-.TP +--Xrs +-.br ++.RE ++.PP ++\-Xrs ++.RS 4 + Reduces the use of operating system signals by the JVM\&. +- ++.sp + Shutdown hooks enable orderly shutdown of a Java application by running user cleanup code (such as closing database connections) at shutdown, even if the JVM terminates abruptly\&. +- +-The JVM catches signals to implement shutdown hooks for unexpected termination\&. The JVM uses \f3SIGHUP\fR, \f3SIGINT\fR, and \f3SIGTERM\fR to initiate the running of shutdown hooks\&. +- +-The JVM uses a similar mechanism to implement the feature of dumping thread stacks for debugging purposes\&. The JVM uses \f3SIGQUIT\fR to perform thread dumps\&. +- +-Applications embedding the JVM frequently need to trap signals such as \f3SIGINT\fR or \f3SIGTERM\fR, which can lead to interference with the JVM signal handlers\&. The \f3-Xrs\fR option is available to address this issue\&. When \f3-Xrs\fR is used, the signal masks for \f3SIGINT\fR, \f3SIGTERM\fR, \f3SIGHUP\fR, and \f3SIGQUIT\fR are not changed by the JVM, and signal handlers for these signals are not installed\&. +- +-There are two consequences of specifying \f3-Xrs\fR: +-.RS +-.TP 0.2i +-\(bu +-\f3SIGQUIT\fR thread dumps are not available\&. +-.TP 0.2i +-\(bu +-User code is responsible for causing shutdown hooks to run, for example, by calling \f3System\&.exit()\fR when the JVM is to be terminated\&. +-.RE +- +-.TP +--Xshare:\fImode\fR +-.br +-Sets the class data sharing mode\&. Possible \fImode\fR arguments for this option include the following: +-.RS +-.TP ++.sp ++The JVM catches signals to implement shutdown hooks for unexpected termination\&. The JVM uses ++\fBSIGHUP\fR, ++\fBSIGINT\fR, and ++\fBSIGTERM\fR ++to initiate the running of shutdown hooks\&. ++.sp ++The JVM uses a similar mechanism to implement the feature of dumping thread stacks for debugging purposes\&. The JVM uses ++\fBSIGQUIT\fR ++to perform thread dumps\&. ++.sp ++Applications embedding the JVM frequently need to trap signals such as ++\fBSIGINT\fR ++or ++\fBSIGTERM\fR, which can lead to interference with the JVM signal handlers\&. The ++\fB\-Xrs\fR ++option is available to address this issue\&. When ++\fB\-Xrs\fR ++is used, the signal masks for ++\fBSIGINT\fR, ++\fBSIGTERM\fR, ++\fBSIGHUP\fR, and ++\fBSIGQUIT\fR ++are not changed by the JVM, and signal handlers for these signals are not installed\&. ++.sp ++There are two consequences of specifying ++\fB\-Xrs\fR: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fBSIGQUIT\fR ++thread dumps are not available\&. ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++User code is responsible for causing shutdown hooks to run, for example, by calling ++\fBSystem\&.exit()\fR ++when the JVM is to be terminated\&. ++.RE ++.RE ++.PP ++\-Xshare:\fImode\fR ++.RS 4 ++Sets the class data sharing mode\&. Possible ++\fImode\fR ++arguments for this option include the following: ++.PP + auto +-Use shared class data if possible\&. This is the default value for Java HotSpot 32-Bit Client VM\&. +-.TP ++.RS 4 ++Use shared class data if possible\&. This is the default value for Java HotSpot 32\-Bit Client VM\&. ++.RE ++.PP + on ++.RS 4 + Require the use of class data sharing\&. Print an error message and exit if class data sharing cannot be used\&. +-.TP ++.RE ++.PP + off +-Do not use shared class data\&. This is the default value for Java HotSpot 32-Bit Server VM, Java HotSpot 64-Bit Client VM, and Java HotSpot 64-Bit Server VM\&. +-.TP ++.RS 4 ++Do not use shared class data\&. This is the default value for Java HotSpot 32\-Bit Server VM, Java HotSpot 64\-Bit Client VM, and Java HotSpot 64\-Bit Server VM\&. ++.RE ++.PP + dump ++.RS 4 + Manually generate the class data sharing archive\&. +-.RE +- +-.TP +--XshowSettings:\fIcategory\fR +-.br +-Shows settings and continues\&. Possible \fIcategory\fR arguments for this option include the following: +-.RS +-.TP ++.RE ++.RE ++.PP ++\-XshowSettings:\fIcategory\fR ++.RS 4 ++Shows settings and continues\&. Possible ++\fIcategory\fR ++arguments for this option include the following: ++.PP + all ++.RS 4 + Shows all categories of settings\&. This is the default value\&. +-.TP ++.RE ++.PP + locale ++.RS 4 + Shows settings related to locale\&. +-.TP ++.RE ++.PP + properties ++.RS 4 + Shows settings related to system properties\&. +-.TP ++.RE ++.PP + vm ++.RS 4 + Shows the settings of the JVM\&. +-.RE +- +-.TP +--Xss\fIsize\fR +-.br +-Sets the thread stack size (in bytes)\&. Append the letter \f3k\fR or \f3K\fR to indicate KB, \f3m\fR or \f3M\fR to indicate MB, \f3g\fR or \f3G\fR to indicate GB\&. The default value depends on the platform: +-.RS +-.TP 0.2i +-\(bu +-Linux/ARM (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-OS X (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu ++.RE ++.RE ++.PP ++\-Xss\fIsize\fR ++.RS 4 ++Sets the thread stack size (in bytes)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate KB, ++\fBm\fR ++or ++\fBM\fR ++to indicate MB, ++\fBg\fR ++or ++\fBG\fR ++to indicate GB\&. The default value depends on the platform: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/ARM (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++OS X (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Windows: depends on virtual memory + .RE +-.RS ++.sp + The following examples set the thread stack size to 1024 KB in different units: +-.sp +-.nf +-\f3\-Xss1m\fP +-.fi +-.nf +-\f3\-Xss1024k\fP +-.fi +-.nf +-\f3\-Xss1048576\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-This option is equivalent to \f3-XX:ThreadStackSize\fR\&. +- +-.RE +-.TP +--Xusealtsigs +-.br +-Use alternative signals instead of \f3SIGUSR1\fR and \f3SIGUSR2\fR for JVM internal signals\&. This option is equivalent to \f3-XX:+UseAltSigs\fR\&. +-.TP +--Xverify:\fImode\fR +-.br +-Sets the mode of the bytecode verifier\&. Bytecode verification helps to troubleshoot some problems, but it also adds overhead to the running application\&. Possible \fImode\fR arguments for this option include the following: +-.RS +-.TP ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xss1m\fR ++\fB\-Xss1024k\fR ++\fB\-Xss1048576\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This option is equivalent to ++\fB\-XX:ThreadStackSize\fR\&. ++.RE ++.PP ++\-Xusealtsigs ++.RS 4 ++Use alternative signals instead of ++\fBSIGUSR1\fR ++and ++\fBSIGUSR2\fR ++for JVM internal signals\&. This option is equivalent to ++\fB\-XX:+UseAltSigs\fR\&. ++.RE ++.PP ++\-Xverify:\fImode\fR ++.RS 4 ++Sets the mode of the bytecode verifier\&. Bytecode verification helps to troubleshoot some problems, but it also adds overhead to the running application\&. Possible ++\fImode\fR ++arguments for this option include the following: ++.PP + none ++.RS 4 + Do not verify the bytecode\&. This reduces startup time and also reduces the protection provided by Java\&. +-.TP ++.RE ++.PP + remote +-Verify only those classes that are loaded remotely over the network\&. This is the default behavior if you do not specify the \f3-Xverify\fR option\&. +-.TP ++.RS 4 ++Verify only those classes that are loaded remotely over the network\&. This is the default behavior if you do not specify the ++\fB\-Xverify\fR ++option\&. ++.RE ++.PP + all ++.RS 4 + Verify all classes\&. +-.RE +- +-.SS ADVANCED\ RUNTIME\ OPTIONS ++.RE ++.RE ++.SS "Advanced Runtime Options" ++.PP + These options control the runtime behavior of the Java HotSpot VM\&. +-.TP +--XX:+DisableAttachMechanism +-.br +-Enables the option that disables the mechanism that lets tools attach to the JVM\&. By default, this option is disabled, meaning that the attach mechanism is enabled and you can use tools such as \f3jcmd\fR, \f3jstack\fR, \f3jmap\fR, and \f3jinfo\fR\&. +-.TP +--XX:ErrorFile=\fIfilename\fR +-.br +-Specifies the path and file name to which error data is written when an irrecoverable error occurs\&. By default, this file is created in the current working directory and named \f3hs_err_pid\fR\fIpid\fR\f3\&.log\fR where \fIpid\fR is the identifier of the process that caused the error\&. The following example shows how to set the default log file (note that the identifier of the process is specified as \f3%p\fR): +-.sp +-.nf +-\f3\-XX:ErrorFile=\&./hs_err_pid%p\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following example shows how to set the error log to \f3/var/log/java/java_error\&.log\fR: +-.sp +-.nf +-\f3\-XX:ErrorFile=/var/log/java/java_error\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If the file cannot be created in the specified directory (due to insufficient space, permission problem, or another issue), then the file is created in the temporary directory for the operating system\&. The temporary directory is \f3/tmp\fR\&. +-.TP +--XX:LargePageSizeInBytes=\fIsize\fR +-.br +-Sets the maximum size (in bytes) for large pages used for Java heap\&. The \fIsize\fR argument must be a power of 2 (2, 4, 8, 16, \&.\&.\&.)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for large pages automatically\&. +- ++.PP ++\-XX:+DisableAttachMechanism ++.RS 4 ++Enables the option that disables the mechanism that lets tools attach to the JVM\&. By default, this option is disabled, meaning that the attach mechanism is enabled and you can use tools such as ++\fBjcmd\fR, ++\fBjstack\fR, ++\fBjmap\fR, and ++\fBjinfo\fR\&. ++.RE ++.PP ++\-XX:ErrorFile=\fIfilename\fR ++.RS 4 ++Specifies the path and file name to which error data is written when an irrecoverable error occurs\&. By default, this file is created in the current working directory and named ++\fBhs_err_pid\fR\fIpid\fR\fB\&.log\fR ++where ++\fIpid\fR ++is the identifier of the process that caused the error\&. The following example shows how to set the default log file (note that the identifier of the process is specified as ++\fB%p\fR): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ErrorFile=\&./hs_err_pid%p\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example shows how to set the error log to ++\fB/var/log/java/java_error\&.log\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ErrorFile=/var/log/java/java_error\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If the file cannot be created in the specified directory (due to insufficient space, permission problem, or another issue), then the file is created in the temporary directory for the operating system\&. The temporary directory is ++\fB/tmp\fR\&. ++.RE ++.PP ++\-XX:+FailOverToOldVerifier ++.RS 4 ++Enables automatic failover to the old verifier when the new type checker fails\&. By default, this option is disabled and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. ++.RE ++.PP ++\-XX:LargePageSizeInBytes=\fIsize\fR ++.RS 4 ++Sets the maximum size (in bytes) for large pages used for Java heap\&. The ++\fIsize\fR ++argument must be a power of 2 (2, 4, 8, 16, \&.\&.\&.)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for large pages automatically\&. ++.sp + The following example illustrates how to set the large page size to 4 megabytes (MB): +-.sp +-.nf +-\f3\-XX:LargePageSizeInBytes=4m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxDirectMemorySize=\fIsize\fR +-.br +-Sets the maximum total size (in bytes) of the New I/O (the \f3java\&.nio\fR package) direct-buffer allocations\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for NIO direct-buffer allocations automatically\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:LargePageSizeInBytes=4m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxDirectMemorySize=\fIsize\fR ++.RS 4 ++Sets the maximum total size (in bytes) of the New I/O (the ++\fBjava\&.nio\fR ++package) direct\-buffer allocations\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the size is set to 0, meaning that the JVM chooses the size for NIO direct\-buffer allocations automatically\&. ++.sp + The following examples illustrate how to set the NIO size to 1024 KB in different units: +-.sp +-.nf +-\f3\-XX:MaxDirectMemorySize=1m\fP +-.fi +-.nf +-\f3\-XX:MaxDirectMemorySize=1024k\fP +-.fi +-.nf +-\f3\-XX:MaxDirectMemorySize=1048576\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:NativeMemoryTracking=\fImode\fR +-.br +-Specifies the mode for tracking JVM native memory usage\&. Possible \fImode\fR arguments for this option include the following: +-.RS +-.TP ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxDirectMemorySize=1m\fR ++\fB\-XX:MaxDirectMemorySize=1024k\fR ++\fB\-XX:MaxDirectMemorySize=1048576\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:NativeMemoryTracking=\fImode\fR ++.RS 4 ++Specifies the mode for tracking JVM native memory usage\&. Possible ++\fImode\fR ++arguments for this option include the following: ++.PP + off +-Do not track JVM native memory usage\&. This is the default behavior if you do not specify the \f3-XX:NativeMemoryTracking\fR option\&. +-.TP ++.RS 4 ++Do not track JVM native memory usage\&. This is the default behavior if you do not specify the ++\fB\-XX:NativeMemoryTracking\fR ++option\&. ++.RE ++.PP + summary ++.RS 4 + Only track memory usage by JVM subsystems, such as Java heap, class, code, and thread\&. +-.TP ++.RE ++.PP + detail +-In addition to tracking memory usage by JVM subsystems, track memory usage by individual \f3CallSite\fR, individual virtual memory region and its committed regions\&. +-.RE +- +-.TP +--XX:OnError=\fIstring\fR +-.br +-Sets a custom command or a series of semicolon-separated commands to run when an irrecoverable error occurs\&. If the string contains spaces, then it must be enclosed in quotation marks\&. +- +-\fI\fRThe following example shows how the \f3-XX:OnError\fR option can be used to run the \f3gcore\fR command to create the core image, and the debugger is started to attach to the process in case of an irrecoverable error (the \f3%p\fR designates the current process): +-.sp +-.nf +-\f3\-XX:OnError="gcore %p;dbx \- %p"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:OnOutOfMemoryError=\fIstring\fR +-.br +-Sets a custom command or a series of semicolon-separated commands to run when an \f3OutOfMemoryError\fR exception is first thrown\&. If the string contains spaces, then it must be enclosed in quotation marks\&. For an example of a command string, see the description of the \f3-XX:OnError\fR option\&. +-.TP +--XX:+PrintCommandLineFlags +-.br ++.RS 4 ++In addition to tracking memory usage by JVM subsystems, track memory usage by individual ++\fBCallSite\fR, individual virtual memory region and its committed regions\&. ++.RE ++.RE ++.PP ++\-XX:OnError=\fIstring\fR ++.RS 4 ++Sets a custom command or a series of semicolon\-separated commands to run when an irrecoverable error occurs\&. If the string contains spaces, then it must be enclosed in quotation marks\&. ++.sp ++The following example shows how the ++\fB\-XX:OnError\fR ++option can be used to run the ++\fBgcore\fR ++command to create the core image, and the debugger is started to attach to the process in case of an irrecoverable error (the ++\fB%p\fR ++designates the current process): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:OnError="gcore %p;dbx \- %p"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:OnOutOfMemoryError=\fIstring\fR ++.RS 4 ++Sets a custom command or a series of semicolon\-separated commands to run when an ++\fBOutOfMemoryError\fR ++exception is first thrown\&. If the string contains spaces, then it must be enclosed in quotation marks\&. For an example of a command string, see the description of the ++\fB\-XX:OnError\fR ++option\&. ++.RE ++.PP ++\-XX:+PrintCommandLineFlags ++.RS 4 + Enables printing of ergonomically selected JVM flags that appeared on the command line\&. It can be useful to know the ergonomic values set by the JVM, such as the heap space size and the selected garbage collector\&. By default, this option is disabled and flags are not printed\&. +-.TP +--XX:+PrintNMTStatistics +-.br +-Enables printing of collected native memory tracking data at JVM exit when native memory tracking is enabled (see \f3-XX:NativeMemoryTracking\fR)\&. By default, this option is disabled and native memory tracking data is not printed\&. +-.TP +--XX:+ShowMessageBoxOnError +-.br ++.RE ++.PP ++\-XX:+PrintNMTStatistics ++.RS 4 ++Enables printing of collected native memory tracking data at JVM exit when native memory tracking is enabled (see ++\fB\-XX:NativeMemoryTracking\fR)\&. By default, this option is disabled and native memory tracking data is not printed\&. ++.RE ++.PP ++\-XX:+RelaxAccessControlCheck ++.RS 4 ++Decreases the amount of access control checks in the verifier\&. By default, this option is disabled, and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. ++.RE ++.PP ++\-XX:+ShowMessageBoxOnError ++.RS 4 + Enables displaying of a dialog box when the JVM experiences an irrecoverable error\&. This prevents the JVM from exiting and keeps the process active so that you can attach a debugger to it to investigate the cause of the error\&. By default, this option is disabled\&. +-.TP +--XX:ThreadStackSize=\fIsize\fR +-.br +-Sets the thread stack size (in bytes)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value depends on the platform: +-.RS +-.TP 0.2i +-\(bu +-Linux/ARM (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Linux/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-OS X (64-bit): 1024 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/i386 (32-bit): 320 KB +-.TP 0.2i +-\(bu +-Oracle Solaris/x64 (64-bit): 1024 KB +-.TP 0.2i +-\(bu ++.RE ++.PP ++\-XX:ThreadStackSize=\fIsize\fR ++.RS 4 ++Sets the thread stack size (in bytes)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value depends on the platform: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/ARM (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Linux/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++OS X (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/i386 (32\-bit): 320 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Oracle Solaris/x64 (64\-bit): 1024 KB ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + Windows: depends on virtual memory + .RE +-.RS ++.sp + The following examples show how to set the thread stack size to 1024 KB in different units: +-.sp +-.nf +-\f3\-XX:ThreadStackSize=1m\fP +-.fi +-.nf +-\f3\-XX:ThreadStackSize=1024k\fP +-.fi +-.nf +-\f3\-XX:ThreadStackSize=1048576\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-This option is equivalent to \f3-Xss\fR\&. +- +-.RE +-.TP +--XX:+TraceClassLoading +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ThreadStackSize=1m\fR ++\fB\-XX:ThreadStackSize=1024k\fR ++\fB\-XX:ThreadStackSize=1048576\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This option is equivalent to ++\fB\-Xss\fR\&. ++.RE ++.PP ++\-XX:+TraceClassLoading ++.RS 4 + Enables tracing of classes as they are loaded\&. By default, this option is disabled and classes are not traced\&. +-.TP +--XX:+TraceClassLoadingPreorder +-.br ++.RE ++.PP ++\-XX:+TraceClassLoadingPreorder ++.RS 4 + Enables tracing of all loaded classes in the order in which they are referenced\&. By default, this option is disabled and classes are not traced\&. +-.TP +--XX:+TraceClassResolution +-.br ++.RE ++.PP ++\-XX:+TraceClassResolution ++.RS 4 + Enables tracing of constant pool resolutions\&. By default, this option is disabled and constant pool resolutions are not traced\&. +-.TP +--XX:+TraceClassUnloading +-.br ++.RE ++.PP ++\-XX:+TraceClassUnloading ++.RS 4 + Enables tracing of classes as they are unloaded\&. By default, this option is disabled and classes are not traced\&. +-.TP +--XX:+TraceLoaderConstraints +-.br +-Enables tracing of the loader constraints recording\&. By default, this option is disabled and loader constraints recoding is not traced\&. +-.TP +--XX:+UseAltSigs +-.br +-Enables the use of alternative signals instead of \f3SIGUSR1\fR and \f3SIGUSR2\fR for JVM internal signals\&. By default, this option is disabled and alternative signals are not used\&. This option is equivalent to \f3-Xusealtsigs\fR\&. +-.TP +--XX:+UseBiasedLocking +-.br +-Enables the use of biased locking\&. Some applications with significant amounts of uncontended synchronization may attain significant speedups with this flag enabled, whereas applications with certain patterns of locking may see slowdowns\&. For more information about the biased locking technique, see the example in Java Tuning White Paper at http://www\&.oracle\&.com/technetwork/java/tuning-139912\&.html#section4\&.2\&.5 +- +-By default, this option is disabled and biased locking is not used\&. +-.TP +--XX:+UseCompressedOops +-.br +-Enables the use of compressed pointers\&. When this option is enabled, object references are represented as 32-bit offsets instead of 64-bit pointers, which typically increases performance when running the application with Java heap sizes less than 32 GB\&. This option works only for 64-bit JVMs\&. +- +-By default, this option is disabled and compressed pointers are not used\&. +-.TP +--XX:+UseLargePages +-.br +-Enables the use of large page memory\&. This option is enabled by default\&. To disable the use of large page memory, specify \f3-XX:-UseLargePages\fR\&. +- +-For more information, see Java Support for Large Memory Pages at http://www\&.oracle\&.com/technetwork/java/javase/tech/largememory-jsp-137182\&.html +-.TP +--XX:+UseMembar +-.br +-Enables issuing of membars on thread state transitions\&. This option is disabled by default on all platforms except Power PC and ARM servers, where it is enabled\&. To disable issuing of membars on thread state transitions for Power PC and ARM, specify \f3-XX:-UseMembar\fR\&. +-.TP +--XX:+UsePerfData +-.br +-Enables the \f3perfdata\fR feature\&. This option is enabled by default to allow JVM monitoring and performance testing\&. Disabling it suppresses the creation of the \f3hsperfdata_userid\fR directories\&. To disable the \f3perfdata\fR feature, specify \f3-XX:-UsePerfData\fR\&. +-.TP +--XX:+AllowUserSignalHandlers +-.br ++.RE ++.PP ++\-XX:+TraceLoaderConstraints ++.RS 4 ++Enables tracing of the loader constraints recording\&. By default, this option is disabled and loader constraints recording is not traced\&. ++.RE ++.PP ++\-XX:+UseAltSigs ++.RS 4 ++Enables the use of alternative signals instead of ++\fBSIGUSR1\fR ++and ++\fBSIGUSR2\fR ++for JVM internal signals\&. By default, this option is disabled and alternative signals are not used\&. This option is equivalent to ++\fB\-Xusealtsigs\fR\&. ++.RE ++.PP ++\-XX:\-UseBiasedLocking ++.RS 4 ++Disables the use of biased locking\&. Some applications with significant amounts of uncontended synchronization may attain significant speedups with this flag enabled, whereas applications with certain patterns of locking may see slowdowns\&. For more information about the biased locking technique, see the example in Java Tuning White Paper at http://www\&.oracle\&.com/technetwork/java/tuning\-139912\&.html#section4\&.2\&.5 ++.sp ++By default, this option is enabled\&. ++.RE ++.PP ++\-XX:\-UseCompressedOops ++.RS 4 ++Disables the use of compressed pointers\&. By default, this option is enabled, and compressed pointers are used when Java heap sizes are less than 32 GB\&. When this option is enabled, object references are represented as 32\-bit offsets instead of 64\-bit pointers, which typically increases performance when running the application with Java heap sizes less than 32 GB\&. This option works only for 64\-bit JVMs\&. ++.RE ++.PP ++\-XX:\-UseLargePages ++.RS 4 ++Disables the use of large page memory\&. This option is enabled by default\&. ++.sp ++For more information, see Java Support for Large Memory Pages at http://www\&.oracle\&.com/technetwork/java/javase/tech/largememory\-jsp\-137182\&.html ++.RE ++.PP ++\-XX:+UseMembar ++.RS 4 ++Enables issuing of membars on thread state transitions\&. This option is disabled by default on all platforms except ARM servers, where it is enabled\&. (It is recommended that you do not disable this option on ARM servers\&.) ++.RE ++.PP ++\-XX:+UsePerfData ++.RS 4 ++Enables the ++\fBperfdata\fR ++feature\&. This option is enabled by default to allow JVM monitoring and performance testing\&. Disabling it suppresses the creation of the ++\fBhsperfdata_userid\fR ++directories\&. To disable the ++\fBperfdata\fR ++feature, specify ++\fB\-XX:\-UsePerfData\fR\&. ++.RE ++.PP ++\-XX:+AllowUserSignalHandlers ++.RS 4 + Enables installation of signal handlers by the application\&. By default, this option is disabled and the application is not allowed to install signal handlers\&. +-.SS ADVANCED\ JIT\ COMPILER\ OPTIONS +-These options control the dynamic just-in-time (JIT) compilation performed by the Java HotSpot VM\&. +-.TP +--XX:+AggressiveOpts +-.br ++.RE ++.SS "Advanced JIT Compiler Options" ++.PP ++These options control the dynamic just\-in\-time (JIT) compilation performed by the Java HotSpot VM\&. ++.PP ++\-XX:+AggressiveOpts ++.RS 4 + Enables the use of aggressive performance optimization features, which are expected to become default in upcoming releases\&. By default, this option is disabled and experimental performance features are not used\&. +-.TP +--XX:AllocateInstancePrefetchLines=\fIlines\fR +-.br ++.RE ++.PP ++\-XX:AllocateInstancePrefetchLines=\fIlines\fR ++.RS 4 + Sets the number of lines to prefetch ahead of the instance allocation pointer\&. By default, the number of lines to prefetch is set to 1: +-.sp +-.nf +-\f3\-XX:AllocateInstancePrefetchLines=1\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchInstr=\fIinstruction\fR +-.br +-Sets the prefetch instruction to prefetch ahead of the allocation pointer\&. Possible values are from 0 to 3\&. The actual instructions behind the values depend on the platform\&. By default, the prefetch instruction is set to 0: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchInstr=0\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchStepSize=\fIsize\fR +-.br +-Sets the step size (in bytes) for sequential prefetch instructions\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the step size is set to 16 bytes: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchStepSize=16\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+BackgroundCompilation +-.br +-Enables background compilation\&. This option is enabled by default\&. To disable background compilation, specify \f3-XX:-BackgroundCompilation\fR (this is equivalent to specifying \f3-Xbatch\fR)\&. +-.TP +--XX:CICompilerCount=\fIthreads\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocateInstancePrefetchLines=1\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchDistance=\fIsize\fR ++.RS 4 ++Sets the size (in bytes) of the prefetch distance for object allocation\&. Memory about to be written with the value of new objects is prefetched up to this distance starting from the address of the last allocated object\&. Each Java thread has its own allocation point\&. ++.sp ++Negative values denote that prefetch distance is chosen based on the platform\&. Positive values are bytes to prefetch\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is set to \-1\&. ++.sp ++The following example shows how to set the prefetch distance to 1024 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchDistance=1024\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchInstr=\fIinstruction\fR ++.RS 4 ++Sets the prefetch instruction to prefetch ahead of the allocation pointer\&. Only the Java HotSpot Server VM supports this option\&. Possible values are from 0 to 3\&. The actual instructions behind the values depend on the platform\&. By default, the prefetch instruction is set to 0: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchInstr=0\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchLines=\fIlines\fR ++.RS 4 ++Sets the number of cache lines to load after the last object allocation by using the prefetch instructions generated in compiled code\&. The default value is 1 if the last allocated object was an instance, and 3 if it was an array\&. ++.sp ++The following example shows how to set the number of loaded cache lines to 5: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchLines=5\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchStepSize=\fIsize\fR ++.RS 4 ++Sets the step size (in bytes) for sequential prefetch instructions\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the step size is set to 16 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:AllocatePrefetchStepSize=16\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:AllocatePrefetchStyle=\fIstyle\fR ++.RS 4 ++Sets the generated code style for prefetch instructions\&. The ++\fIstyle\fR ++argument is an integer from 0 to 3: ++.PP ++0 ++.RS 4 ++Do not generate prefetch instructions\&. ++.RE ++.PP ++1 ++.RS 4 ++Execute prefetch instructions after each allocation\&. This is the default parameter\&. ++.RE ++.PP ++2 ++.RS 4 ++Use the thread\-local allocation block (TLAB) watermark pointer to determine when prefetch instructions are executed\&. ++.RE ++.PP ++3 ++.RS 4 ++Use BIS instruction on SPARC for allocation prefetch\&. ++.RE ++.sp ++Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+BackgroundCompilation ++.RS 4 ++Enables background compilation\&. This option is enabled by default\&. To disable background compilation, specify ++\fB\-XX:\-BackgroundCompilation\fR ++(this is equivalent to specifying ++\fB\-Xbatch\fR)\&. ++.RE ++.PP ++\-XX:CICompilerCount=\fIthreads\fR ++.RS 4 + Sets the number of compiler threads to use for compilation\&. By default, the number of threads is set to 2 for the server JVM, to 1 for the client JVM, and it scales to the number of cores if tiered compilation is used\&. The following example shows how to set the number of threads to 2: +-.sp +-.nf +-\f3\-XX:CICompilerCount=2\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CodeCacheMinimumFreeSpace=\fIsize\fR +-.br +-Sets the minimum free space (in bytes) required for compilation\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. When less than the minimum free space remains, compiling stops\&. By default, this option is set to 500 KB\&. The following example shows how to set the minimum free space to 1024 MB: +-.sp +-.nf +-\f3\-XX:CodeCacheMinimumFreeSpace=1024m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] +-.br +-Specifies a command to perform on a method\&. For example, to exclude the \f3indexOf()\fR method of the \f3String\fR class from being compiled, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand=exclude,java/lang/String\&.indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Note that the full class name is specified, including all packages and subpackages separated by a slash (\f3/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the \f3-XX:+PrintCompilation\fR and \f3-XX:+LogCompilation\fR options: +-.sp +-.nf +-\f3\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If the method is specified without the signature, the command will be applied to all methods with the specified name\&. However, you can also specify the signature of the method in the class file format\&. In this case, you should enclose the arguments in quotation marks, because otherwise the shell treats the semicolon as command end\&. For example, if you want to exclude only the \f3indexOf(String)\fR method of the \f3String\fR class from being compiled, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand="exclude,java/lang/String\&.indexOf,(Ljava/lang/String;)I"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-You can also use the asterisk (*) as a wildcard for class and method names\&. For example, to exclude all \f3indexOf()\fR methods in all classes from being compiled, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand=exclude,*\&.indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The commas and periods are aliases for spaces, making it easier to pass compiler commands through a shell\&. You can pass arguments to \f3-XX:CompileCommand\fR using spaces as separators by enclosing the argument in quotation marks: +-.sp +-.nf +-\f3\-XX:CompileCommand="exclude java/lang/String indexOf"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Note that after parsing the commands passed on the command line using the \f3-XX:CompileCommand\fR options, the JIT compiler then reads commands from the \f3\&.hotspot_compiler\fR file\&. You can add commands to this file or specify a different file using the \f3-XX:CompileCommandFile\fR option\&. +- +-To add several commands, either specify the \f3-XX:CompileCommand\fR option multiple times, or separate each argument with the newline separator (\f3\en\fR)\&. The following commands are available: +-.RS +-.TP ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CICompilerCount=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CodeCacheMinimumFreeSpace=\fIsize\fR ++.RS 4 ++Sets the minimum free space (in bytes) required for compilation\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. When less than the minimum free space remains, compiling stops\&. By default, this option is set to 500 KB\&. The following example shows how to set the minimum free space to 1024 MB: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CodeCacheMinimumFreeSpace=1024m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileCommand=\fIcommand\fR,\fImethod\fR[,\fIoption\fR] ++.RS 4 ++Specifies a command to perform on a method\&. For example, to exclude the ++\fBindexOf()\fR ++method of the ++\fBString\fR ++class from being compiled, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Note that the full class name is specified, including all packages and subpackages separated by a slash (\fB/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the ++\fB\-XX:+PrintCompilation\fR ++and ++\fB\-XX:+LogCompilation\fR ++options: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,java\&.lang\&.String::indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If the method is specified without the signature, the command will be applied to all methods with the specified name\&. However, you can also specify the signature of the method in the class file format\&. In this case, you should enclose the arguments in quotation marks, because otherwise the shell treats the semicolon as command end\&. For example, if you want to exclude only the ++\fBindexOf(String)\fR ++method of the ++\fBString\fR ++class from being compiled, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude,java/lang/String\&.indexOf,(Ljava/lang/String;)I"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++You can also use the asterisk (*) as a wildcard for class and method names\&. For example, to exclude all ++\fBindexOf()\fR ++methods in all classes from being compiled, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=exclude,*\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The commas and periods are aliases for spaces, making it easier to pass compiler commands through a shell\&. You can pass arguments to ++\fB\-XX:CompileCommand\fR ++using spaces as separators by enclosing the argument in quotation marks: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand="exclude java/lang/String indexOf"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Note that after parsing the commands passed on the command line using the ++\fB\-XX:CompileCommand\fR ++options, the JIT compiler then reads commands from the ++\fB\&.hotspot_compiler\fR ++file\&. You can add commands to this file or specify a different file using the ++\fB\-XX:CompileCommandFile\fR ++option\&. ++.sp ++To add several commands, either specify the ++\fB\-XX:CompileCommand\fR ++option multiple times, or separate each argument with the newline separator (\fB\en\fR)\&. The following commands are available: ++.PP + break ++.RS 4 + Set a breakpoint when debugging the JVM to stop at the beginning of compilation of the specified method\&. +-.TP ++.RE ++.PP + compileonly +-Exclude all methods from compilation except for the specified method\&. As an alternative, you can use the \f3-XX:CompileOnly\fR option, which allows to specify several methods\&. +-.TP ++.RS 4 ++Exclude all methods from compilation except for the specified method\&. As an alternative, you can use the ++\fB\-XX:CompileOnly\fR ++option, which allows to specify several methods\&. ++.RE ++.PP + dontinline ++.RS 4 + Prevent inlining of the specified method\&. +-.TP ++.RE ++.PP + exclude ++.RS 4 + Exclude the specified method from compilation\&. +-.TP ++.RE ++.PP + help +-Print a help message for the \f3-XX:CompileCommand\fR option\&. +-.TP ++.RS 4 ++Print a help message for the ++\fB\-XX:CompileCommand\fR ++option\&. ++.RE ++.PP + inline ++.RS 4 + Attempt to inline the specified method\&. +-.TP ++.RE ++.PP + log +-Exclude compilation logging (with the \f3-XX:+LogCompilation\fR option) for all methods except for the specified method\&. By default, logging is performed for all compiled methods\&. +-.TP ++.RS 4 ++Exclude compilation logging (with the ++\fB\-XX:+LogCompilation\fR ++option) for all methods except for the specified method\&. By default, logging is performed for all compiled methods\&. ++.RE ++.PP + option +-This command can be used to pass a JIT compilation option to the specified method in place of the last argument (\fIoption\fR)\&. The compilation option is set at the end, after the method name\&. For example, to enable the \f3BlockLayoutByFrequency\fR option for the \f3append()\fR method of the \f3StringBuffer\fR class, use the following: +-.sp +-.nf +-\f3\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.RS 4 ++This command can be used to pass a JIT compilation option to the specified method in place of the last argument (\fIoption\fR)\&. The compilation option is set at the end, after the method name\&. For example, to enable the ++\fBBlockLayoutByFrequency\fR ++option for the ++\fBappend()\fR ++method of the ++\fBStringBuffer\fR ++class, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileCommand=option,java/lang/StringBuffer\&.append,BlockLayoutByFrequency\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + You can specify multiple compilation options, separated by commas or spaces\&. +-.TP ++.RE ++.PP + print ++.RS 4 + Print generated assembler code after compilation of the specified method\&. +-.TP ++.RE ++.PP + quiet +-Do not print the compile commands\&. By default, the commands that you specify with the -\f3XX:CompileCommand\fR option are printed; for example, if you exclude from compilation the \f3indexOf()\fR method of the \f3String\fR class, then the following will be printed to standard output: +-.sp +-.nf +-\f3CompilerOracle: exclude java/lang/String\&.indexOf\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-You can suppress this by specifying the \f3-XX:CompileCommand=quiet\fR option before other \f3-XX:CompileCommand\fR options\&. +-.RE +- +-.TP +--XX:CompileCommandFile=\fIfilename\fR +-.br +-Sets the file from which JIT compiler commands are read\&. By default, the \f3\&.hotspot_compiler\fR file is used to store commands performed by the JIT compiler\&. +- +-Each line in the command file represents a command, a class name, and a method name for which the command is used\&. For example, this line prints assembly code for the \f3toString()\fR method of the \f3String\fR class: +-.sp +-.nf +-\f3print java/lang/String toString\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-For more information about specifying the commands for the JIT compiler to perform on methods, see the \f3-XX:CompileCommand\fR option\&. +-.TP +--XX:CompileOnly=\fImethods\fR +-.br +-Sets the list of methods (separated by commas) to which compilation should be restricted\&. Only the specified methods will be compiled\&. Specify each method with the full class name (including the packages and subpackages)\&. For example, to compile only the \f3length()\fR method of the \f3String\fR class and the \f3size()\fR method of the \f3List\fR class, use the following: +-.sp +-.nf +-\f3\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Note that the full class name is specified, including all packages and subpackages separated by a slash (\f3/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the \f3-XX:+PrintCompilation\fR and \f3-XX:+LogCompilation\fR options: +-.sp +-.nf +-\f3\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.RS 4 ++Do not print the compile commands\&. By default, the commands that you specify with the \-\fBXX:CompileCommand\fR ++option are printed; for example, if you exclude from compilation the ++\fBindexOf()\fR ++method of the ++\fBString\fR ++class, then the following will be printed to standard output: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompilerOracle: exclude java/lang/String\&.indexOf\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++You can suppress this by specifying the ++\fB\-XX:CompileCommand=quiet\fR ++option before other ++\fB\-XX:CompileCommand\fR ++options\&. ++.RE ++.RE ++.PP ++\-XX:CompileCommandFile=\fIfilename\fR ++.RS 4 ++Sets the file from which JIT compiler commands are read\&. By default, the ++\fB\&.hotspot_compiler\fR ++file is used to store commands performed by the JIT compiler\&. ++.sp ++Each line in the command file represents a command, a class name, and a method name for which the command is used\&. For example, this line prints assembly code for the ++\fBtoString()\fR ++method of the ++\fBString\fR ++class: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBprint java/lang/String toString\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++For more information about specifying the commands for the JIT compiler to perform on methods, see the ++\fB\-XX:CompileCommand\fR ++option\&. ++.RE ++.PP ++\-XX:CompileOnly=\fImethods\fR ++.RS 4 ++Sets the list of methods (separated by commas) to which compilation should be restricted\&. Only the specified methods will be compiled\&. Specify each method with the full class name (including the packages and subpackages)\&. For example, to compile only the ++\fBlength()\fR ++method of the ++\fBString\fR ++class and the ++\fBsize()\fR ++method of the ++\fBList\fR ++class, use the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\&.length,java/util/List\&.size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Note that the full class name is specified, including all packages and subpackages separated by a slash (\fB/\fR)\&. For easier cut and paste operations, it is also possible to use the method name format produced by the ++\fB\-XX:+PrintCompilation\fR ++and ++\fB\-XX:+LogCompilation\fR ++options: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java\&.lang\&.String::length,java\&.util\&.List::size\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + Although wildcards are not supported, you can specify only the class or package name to compile all methods in that class or package, as well as specify just the method to compile methods with this name in any class: +-.sp +-.nf +-\f3\-XX:CompileOnly=java/lang/String\fP +-.fi +-.nf +-\f3\-XX:CompileOnly=java/lang\fP +-.fi +-.nf +-\f3\-XX:CompileOnly=\&.length\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CompileThreshold=\fIinvocations\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileOnly=java/lang/String\fR ++\fB\-XX:CompileOnly=java/lang\fR ++\fB\-XX:CompileOnly=\&.length\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CompileThreshold=\fIinvocations\fR ++.RS 4 + Sets the number of interpreted method invocations before compilation\&. By default, in the server JVM, the JIT compiler performs 10,000 interpreted method invocations to gather information for efficient compilation\&. For the client JVM, the default setting is 1,500 invocations\&. The following example shows how to set the number of interpreted method invocations to 5,000: +-.sp +-.nf +-\f3\-XX:CompileThreshold=5000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-You can completely disable interpretation of Java methods before compilation by specifying the \f3-Xcomp\fR option\&. +-.TP +--XX:+DoEscapeAnalysis +-.br +-Enables the use of escape analysis\&. This option is enabled by default\&. To disable the use of escape analysis, specify \f3-XX:-DoEscapeAnalysis\fR\&. +-.TP +--XX:+FailOverToOldVerifier +-.br +-Enables automatic failover to the old verifier when the new type checker fails\&. By default, this option is disabled and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. +-.TP +--XX:InitialCodeCacheSize=\fIsize\fR +-.br +-Sets the initial code cache size (in bytes)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is set to 500 KB\&. The following example shows how to set the initial code cache size to 32 KB: +-.sp +-.nf +-\f3\-XX:InitialCodeCacheSize=32k\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+Inline +-.br +-Enables method inlining\&. This option is enabled by default to increase performance\&. To disable method inlining, specify \f3-XX:-Inline\fR\&. +-.TP +--XX:InlineSmallCode=\fIsize\fR +-.br +-Sets the maximum code size (in bytes) for compiled methods that should be inlined\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. Only compiled methods with the size smaller than the specified size will be inlined\&. By default, the maximum code size is set to 1000 bytes: +-.sp +-.nf +-\f3\-XX:InlineSmallCode=1000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+LogCompilation +-.br +-Enables logging of compilation activity to a file named \f3hotspot\&.log\fR in the current working directory\&. You can specify a different log file path and name using the \f3-XX:LogFile\fR option\&. +- +-By default, this option is disabled and compilation activity is not logged\&. The \f3-XX:+LogCompilation\fR option has to be used together with the \f3-XX:UnlockDiagnosticVMOptions\fR option that unlocks diagnostic JVM options\&. +- +-You can enable verbose diagnostic output with a message printed to the console every time a method is compiled by using the \f3-XX:+PrintCompilation\fR option\&. +-.TP +--XX:MaxInlineSize=\fIsize\fR +-.br +-Sets the maximum bytecode size (in bytes) of a method to be inlined\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the maximum bytecode size is set to 35 bytes: +-.sp +-.nf +-\f3\-XX:MaxInlineSize=35\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxNodeLimit=\fInodes\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CompileThreshold=5000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++You can completely disable interpretation of Java methods before compilation by specifying the ++\fB\-Xcomp\fR ++option\&. ++.RE ++.PP ++\-XX:+DoEscapeAnalysis ++.RS 4 ++Enables the use of escape analysis\&. This option is enabled by default\&. To disable the use of escape analysis, specify ++\fB\-XX:\-DoEscapeAnalysis\fR\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:InitialCodeCacheSize=\fIsize\fR ++.RS 4 ++Sets the initial code cache size (in bytes)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is set to 500 KB\&. The following example shows how to set the initial code cache size to 32 KB: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialCodeCacheSize=32k\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+Inline ++.RS 4 ++Enables method inlining\&. This option is enabled by default to increase performance\&. To disable method inlining, specify ++\fB\-XX:\-Inline\fR\&. ++.RE ++.PP ++\-XX:InlineSmallCode=\fIsize\fR ++.RS 4 ++Sets the maximum code size (in bytes) for compiled methods that should be inlined\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. Only compiled methods with the size smaller than the specified size will be inlined\&. By default, the maximum code size is set to 1000 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InlineSmallCode=1000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+LogCompilation ++.RS 4 ++Enables logging of compilation activity to a file named ++\fBhotspot\&.log\fR ++in the current working directory\&. You can specify a different log file path and name using the ++\fB\-XX:LogFile\fR ++option\&. ++.sp ++By default, this option is disabled and compilation activity is not logged\&. The ++\fB\-XX:+LogCompilation\fR ++option has to be used together with the ++\fB\-XX:UnlockDiagnosticVMOptions\fR ++option that unlocks diagnostic JVM options\&. ++.sp ++You can enable verbose diagnostic output with a message printed to the console every time a method is compiled by using the ++\fB\-XX:+PrintCompilation\fR ++option\&. ++.RE ++.PP ++\-XX:MaxInlineSize=\fIsize\fR ++.RS 4 ++Sets the maximum bytecode size (in bytes) of a method to be inlined\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the maximum bytecode size is set to 35 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxInlineSize=35\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxNodeLimit=\fInodes\fR ++.RS 4 + Sets the maximum number of nodes to be used during single method compilation\&. By default, the maximum number of nodes is set to 65,000: +-.sp +-.nf +-\f3\-XX:MaxNodeLimit=65000\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxTrivialSize=\fIsize\fR +-.br +-Sets the maximum bytecode size (in bytes) of a trivial method to be inlined\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. By default, the maximum bytecode size of a trivial method is set to 6 bytes: +-.sp +-.nf +-\f3\-XX:MaxTrivialSize=6\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+OptimizeStringConcat +-.br +-Enables the optimization of \f3String\fR concatenation operations\&. This option is enabled by default\&. To disable the optimization of \f3String\fR concatenation operations, specify \f3-XX:-OptimizeStringConcat\fR\&. +-.TP +--XX:+PrintAssembly +-.br +-Enables printing of assembly code for bytecoded and native methods by using the external \f3disassembler\&.so\fR library\&. This enables you to see the generated code, which may help you to diagnose performance issues\&. +- +-By default, this option is disabled and assembly code is not printed\&. The \f3-XX:+PrintAssembly\fR option has to be used together with the \f3-XX:UnlockDiagnosticVMOptions\fR option that unlocks diagnostic JVM options\&. +-.TP +--XX:+PrintCompilation +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxNodeLimit=65000\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxTrivialSize=\fIsize\fR ++.RS 4 ++Sets the maximum bytecode size (in bytes) of a trivial method to be inlined\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. By default, the maximum bytecode size of a trivial method is set to 6 bytes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxTrivialSize=6\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+OptimizeStringConcat ++.RS 4 ++Enables the optimization of ++\fBString\fR ++concatenation operations\&. This option is enabled by default\&. To disable the optimization of ++\fBString\fR ++concatenation operations, specify ++\fB\-XX:\-OptimizeStringConcat\fR\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+PrintAssembly ++.RS 4 ++Enables printing of assembly code for bytecoded and native methods by using the external ++\fBdisassembler\&.so\fR ++library\&. This enables you to see the generated code, which may help you to diagnose performance issues\&. ++.sp ++By default, this option is disabled and assembly code is not printed\&. The ++\fB\-XX:+PrintAssembly\fR ++option has to be used together with the ++\fB\-XX:UnlockDiagnosticVMOptions\fR ++option that unlocks diagnostic JVM options\&. ++.RE ++.PP ++\-XX:+PrintCompilation ++.RS 4 + Enables verbose diagnostic output from the JVM by printing a message to the console every time a method is compiled\&. This enables you to see which methods actually get compiled\&. By default, this option is disabled and diagnostic output is not printed\&. +- +-You can also log compilation activity to a file by using the \f3-XX:+LogCompilation\fR option\&. +-.TP +--XX:+PrintInlining +-.br ++.sp ++You can also log compilation activity to a file by using the ++\fB\-XX:+LogCompilation\fR ++option\&. ++.RE ++.PP ++\-XX:+PrintInlining ++.RS 4 + Enables printing of inlining decisions\&. This enables you to see which methods are getting inlined\&. +- +-By default, this option is disabled and inlining information is not printed\&. The \f3-XX:+PrintInlining\fR option has to be used together with the \f3-XX:+UnlockDiagnosticVMOptions\fR option that unlocks diagnostic JVM options\&. +-.TP +--XX:+RelaxAccessControlCheck +-.br +-Decreases the amount of access control checks in the verifier\&. By default, this option is disabled, and it is ignored (that is, treated as disabled) for classes with a recent bytecode version\&. You can enable it for classes with older versions of the bytecode\&. +-.TP +--XX:ReservedCodeCacheSize=\fIsize\fR +-.br +-Sets the maximum code cache size (in bytes) for JIT-compiled code\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. This option is equivalent to \f3-Xmaxjitcodesize\fR\&. +-.TP +--XX:+TieredCompilation +-.br +-Enables the use of tiered compilation\&. By default, this option is disabled and tiered compilation is not used\&. +-.TP +--XX:+UseCodeCacheFlushing +-.br +-Enables flushing of the code cache before shutting down the compiler\&. This option is enabled by default\&. To disable flushing of the code cache before shutting down the compiler, specify \f3-XX:-UseCodeCacheFlushing\fR\&. +-.TP +--XX:+UseCondCardMark +-.br +-Enables checking of whether the card is already marked before updating the card table\&. This option is disabled by default and should only be used on machines with multiple sockets, where it will increase performance of Java applications that rely heavily on concurrent operations\&. +-.TP +--XX:+UseSuperWord +-.br +-Enables the transformation of scalar operations into superword operations\&. This option is enabled by default\&. To disable the transformation of scalar operations into superword operations, specify \f3-XX:-UseSuperWord\fR\&. +-.SS ADVANCED\ SERVICEABILITY\ OPTIONS ++.sp ++By default, this option is disabled and inlining information is not printed\&. The ++\fB\-XX:+PrintInlining\fR ++option has to be used together with the ++\fB\-XX:+UnlockDiagnosticVMOptions\fR ++option that unlocks diagnostic JVM options\&. ++.RE ++.PP ++\-XX:ReservedCodeCacheSize=\fIsize\fR ++.RS 4 ++Sets the maximum code cache size (in bytes) for JIT\-compiled code\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. This option is equivalent to ++\fB\-Xmaxjitcodesize\fR\&. ++.RE ++.PP ++\-XX:+TieredCompilation ++.RS 4 ++Enables the use of tiered compilation\&. By default, this option is enabled\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+UseAES ++.RS 4 ++Enables hardware\-based AES intrinsics for Intel, AMD, and SPARC hardware\&. Intel Westmere (2010 and newer), AMD Bulldozer (2011 and newer), and SPARC (T4 and newer) are the supported hardware\&. UseAES is used in conjunction with UseAESIntrinsics\&. ++.RE ++.PP ++\-XX:+UseAESIntrinsics ++.RS 4 ++UseAES and UseAESIntrinsics flags are enabled by default and are supported only for Java HotSpot Server VM 32\-bit and 64\-bit\&. To disable hardware\-based AES intrinsics, specify ++\fB\-XX:\-UseAES \-XX:\-UseAESIntrinsics\fR\&. For example, to enable hardware AES, use the following flags: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:+UseAES \-XX:+UseAESIntrinsics\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++To support UseAES and UseAESIntrinsics flags for 32\-bit and 64\-bit use ++\fB\-server\fR ++option to choose Java HotSpot Server VM\&. These flags are not supported on Client VM\&. ++.RE ++.PP ++\-XX:+UseCodeCacheFlushing ++.RS 4 ++Enables flushing of the code cache before shutting down the compiler\&. This option is enabled by default\&. To disable flushing of the code cache before shutting down the compiler, specify ++\fB\-XX:\-UseCodeCacheFlushing\fR\&. ++.RE ++.PP ++\-XX:+UseCondCardMark ++.RS 4 ++Enables checking of whether the card is already marked before updating the card table\&. This option is disabled by default and should only be used on machines with multiple sockets, where it will increase performance of Java applications that rely heavily on concurrent operations\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.PP ++\-XX:+UseSuperWord ++.RS 4 ++Enables the transformation of scalar operations into superword operations\&. This option is enabled by default\&. To disable the transformation of scalar operations into superword operations, specify ++\fB\-XX:\-UseSuperWord\fR\&. Only the Java HotSpot Server VM supports this option\&. ++.RE ++.SS "Experimental JIT Compiler Options" ++.PP ++The options related to the Restricted Transactional Memory (RTM) locking feature in this section are experimental and are not officially supported in Java SE 8u20; you must enable the ++\fB\-XX:+UnlockExperimentalVMOptions\fR ++option to use them\&. These options are only available for the Java HotSpot Server VM on x86 CPUs that support Transactional Synchronization Extensions (TSX)\&. ++.PP ++\-XX:RTMAbortRatio=\fIabort_ratio\fR ++.RS 4 ++The RTM abort ratio is specified as a percentage (%) of all executed RTM transactions\&. If a number of aborted transactions becomes greater than this ratio, then the compiled code will be deoptimized\&. This ratio is used when the ++\fB\-XX:+UseRTMDeopt\fR ++option is enabled\&. The default value of this option is 50\&. This means that the compiled code will be deoptimized if 50% of all transactions are aborted\&. ++.RE ++.PP ++\-XX:RTMRetryCount=\fInumber_of_retries\fR ++.RS 4 ++RTM locking code will be retried, when it is aborted or busy, the number of times specified by this option before falling back to the normal locking mechanism\&. The default value for this option is 5\&. The ++\fB\-XX:UseRTMLocking\fR ++option must be enabled\&. ++.RE ++.PP ++\-XX:+UseRTMDeopt ++.RS 4 ++Auto\-tunes RTM locking depending on the abort ratio\&. This ratio is specified by ++\fB\-XX:RTMAbortRatio\fR ++option\&. If the number of aborted transactions exceeds the abort ratio, then the method containing the lock will be deoptimized and recompiled with all locks as normal locks\&. This option is disabled by default\&. The ++\fB\-XX:UseRTMLocking\fR ++option must be enabled\&. ++.RE ++.PP ++\-XX:+UseRTMLocking ++.RS 4 ++Generate Restricted Transactional Memory (RTM) locking code for all inflated locks, with the normal locking mechanism as the fallback handler\&. This option is disabled by default\&. ++.sp ++RTM is part of Intel\*(Aqs Transactional Synchronization Extensions (TSX), which is an x86 instruction set extension and facilitates the creation of multithreaded applications\&. RTM introduces the new instructions ++\fBXBEGIN\fR, ++\fBXABORT\fR, ++\fBXEND\fR, and ++\fBXTEST\fR\&. The ++\fBXBEGIN\fR ++and ++\fBXEND\fR ++instructions enclose a set of instructions to run as a transaction\&. If no conflict is found when running the transaction, the memory and register modifications are committed together at the ++\fBXEND\fR ++instruction\&. The ++\fBXABORT\fR ++instruction can be used to explicitly abort a transaction and the ++\fBXEND\fR ++instruction to check if a set of instructions are being run in a transaction\&. ++.sp ++A lock on a transaction is inflated when another thread tries to access the same transaction, thereby blocking the thread that did not originally request access to the transaction\&. RTM requires that a fallback set of operations be specified in case a transaction aborts or fails\&. An RTM lock is a lock that has been delegated to the TSX\*(Aqs system\&. ++.sp ++RTM improves performance for highly contended locks with low conflict in a critical region (which is code that must not be accessed by more than one thread concurrently)\&. RTM also improves the performance of coarse\-grain locking, which typically does not perform well in multithreaded applications\&. (Coarse\-grain locking is the strategy of holding locks for long periods to minimize the overhead of taking and releasing locks, while fine\-grained locking is the strategy of trying to achieve maximum parallelism by locking only when necessary and unlocking as soon as possible\&.) Also, for lightly contended locks that are used by different threads, RTM can reduce false cache line sharing, also known as cache line ping\-pong\&. This occurs when multiple threads from different processors are accessing different resources, but the resources share the same cache line\&. As a result, the processors repeatedly invalidate the cache lines of other processors, which forces them to read from main memory instead of their cache\&. ++.RE ++.SS "Advanced Serviceability Options" ++.PP + These options provide the ability to gather system information and perform extensive debugging\&. +-.TP +--XX:+ExtendedDTraceProbes +-.br +-Enables additional \f3dtrace\fR tool probes that impact the performance\&. By default, this option is disabled and \f3dtrace\fR performs only standard probes\&. +-.TP +--XX:+HeapDumpOnOutOfMemory +-.br +-Enables the dumping of the Java heap to a file in the current directory by using the heap profiler (HPROF) when a \f3java\&.lang\&.OutOfMemoryError\fR exception is thrown\&. You can explicitly set the heap dump file path and name using the \f3-XX:HeapDumpPath\fR option\&. By default, this option is disabled and the heap is not dumped when an \f3OutOfMemoryError\fR exception is thrown\&. +-.TP +--XX:HeapDumpPath=\fIpath\fR +-.br +-Sets the path and file name for writing the heap dump provided by the heap profiler (HPROF) when the \f3-XX:+HeapDumpOnOutOfMemoryError\fR option is set\&. By default, the file is created in the current working directory, and it is named \f3java_pid\fR\fIpid\fR\f3\&.hprof\fR where \fIpid\fR is the identifier of the process that caused the error\&. The following example shows how to set the default file explicitly (\f3%p\fR represents the current process identificator): +-.sp +-.nf +-\f3\-XX:HeapDumpPath=\&./java_pid%p\&.hprof\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\fI\fRThe following example shows how to set the heap dump file to \f3/var/log/java/java_heapdump\&.hprof\fR: +-.sp +-.nf +-\f3\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:LogFile=\fIpath\fR +-.br +-Sets the path and file name where log data is written\&. By default, the file is created in the current working directory, and it is named \f3hotspot\&.log\fR\&. +- +-\fI\fRThe following example shows how to set the log file to \f3/var/log/java/hotspot\&.log\fR: +-.sp +-.nf +-\f3\-XX:LogFile=/var/log/java/hotspot\&.log\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+PrintClassHistogram +-.br +-\fI\fREnables printing of a class instance histogram after a \f3Control+C\fR event (\f3SIGTERM\fR)\&. By default, this option is disabled\&. +- +-Setting this option is equivalent to running the \f3jmap -histo\fR command, or the \f3jcmd\fR\fIpid\fR\f3GC\&.class_histogram\fR command, where \fIpid\fR is the current Java process identifier\&. +-.TP +--XX:+PrintConcurrentLocks +- +- +-Enables printing of j\f3ava\&.util\&.concurrent\fR locks after a \f3Control+C\fR event (\f3SIGTERM\fR)\&. By default, this option is disabled\&. +- +-Setting this option is equivalent to running the \f3jstack -l\fR command or the \f3jcmd\fR\fIpid\fR\f3Thread\&.print -l\fR command, where \fIpid\fR is the current Java process identifier\&. +-.TP +--XX:+UnlockDiagnosticVMOptions +-.br ++.PP ++\-XX:+ExtendedDTraceProbes ++.RS 4 ++Enables additional ++\fBdtrace\fR ++tool probes that impact the performance\&. By default, this option is disabled and ++\fBdtrace\fR ++performs only standard probes\&. ++.RE ++.PP ++\-XX:+HeapDumpOnOutOfMemory ++.RS 4 ++Enables the dumping of the Java heap to a file in the current directory by using the heap profiler (HPROF) when a ++\fBjava\&.lang\&.OutOfMemoryError\fR ++exception is thrown\&. You can explicitly set the heap dump file path and name using the ++\fB\-XX:HeapDumpPath\fR ++option\&. By default, this option is disabled and the heap is not dumped when an ++\fBOutOfMemoryError\fR ++exception is thrown\&. ++.RE ++.PP ++\-XX:HeapDumpPath=\fIpath\fR ++.RS 4 ++Sets the path and file name for writing the heap dump provided by the heap profiler (HPROF) when the ++\fB\-XX:+HeapDumpOnOutOfMemoryError\fR ++option is set\&. By default, the file is created in the current working directory, and it is named ++\fBjava_pid\fR\fIpid\fR\fB\&.hprof\fR ++where ++\fIpid\fR ++is the identifier of the process that caused the error\&. The following example shows how to set the default file explicitly (\fB%p\fR ++represents the current process identificator): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=\&./java_pid%p\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example shows how to set the heap dump file to ++\fB/var/log/java/java_heapdump\&.hprof\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:HeapDumpPath=/var/log/java/java_heapdump\&.hprof\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:LogFile=\fIpath\fR ++.RS 4 ++Sets the path and file name where log data is written\&. By default, the file is created in the current working directory, and it is named ++\fBhotspot\&.log\fR\&. ++.sp ++The following example shows how to set the log file to ++\fB/var/log/java/hotspot\&.log\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:LogFile=/var/log/java/hotspot\&.log\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+PrintClassHistogram ++.RS 4 ++Enables printing of a class instance histogram after a ++\fBControl+C\fR ++event (\fBSIGTERM\fR)\&. By default, this option is disabled\&. ++.sp ++Setting this option is equivalent to running the ++\fBjmap \-histo\fR ++command, or the ++\fBjcmd \fR\fIpid\fR\fB GC\&.class_histogram\fR ++command, where ++\fIpid\fR ++is the current Java process identifier\&. ++.RE ++.PP ++\-XX:+PrintConcurrentLocks ++.RS 4 ++Enables printing of j locks after a event\&. By default, this option is disabled\&. ++.sp ++Enables printing of j\fBava\&.util\&.concurrent\fR ++locks after a ++\fBControl+C\fR ++event (\fBSIGTERM\fR)\&. By default, this option is disabled\&. ++.sp ++Setting this option is equivalent to running the ++\fBjstack \-l\fR ++command or the ++\fBjcmd \fR\fIpid\fR\fB Thread\&.print \-l\fR ++command, where ++\fIpid\fR ++is the current Java process identifier\&. ++.RE ++.PP ++\-XX:+UnlockDiagnosticVMOptions ++.RS 4 + Unlocks the options intended for diagnosing the JVM\&. By default, this option is disabled and diagnostic options are not available\&. +-.SS ADVANCED\ GARBAGE\ COLLECTION\ OPTIONS ++.RE ++.SS "Advanced Garbage Collection Options" ++.PP + These options control how garbage collection (GC) is performed by the Java HotSpot VM\&. +-.TP +--XX:+AggressiveHeap +-.br +-Enables Java heap optimization\&. This sets various parameters to be optimal for long-running jobs with intensive memory allocation, based on the configuration of the computer (RAM and CPU)\&. By default, the option is disabled and the heap is not optimized\&. +-.TP +--XX:AllocatePrefetchDistance=\fIsize\fR +-.br +-Sets the size (in bytes) of the prefetch distance for object allocation\&. Memory about to be written with the value of new objects is prefetched up to this distance starting from the address of the last allocated object\&. Each Java thread has its own allocation point\&. +- +-Negative values denote that prefetch distance is chosen based on the platform\&. Positive values are bytes to prefetch\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is set to -1\&. +- +-The following example shows how to set the prefetch distance to 1024 bytes: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchDistance=1024\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchLines=\fIlines\fR +-.br +-Sets the number of cache lines to load after the last object allocation by using the prefetch instructions generated in compiled code\&. The default value is 1 if the last allocated object was an instance, and 3 if it was an array\&. +- +-The following example shows how to set the number of loaded cache lines to 5: +-.sp +-.nf +-\f3\-XX:AllocatePrefetchLines=5\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:AllocatePrefetchStyle=\fIstyle\fR +-.br +-Sets the generated code style for prefetch instructions\&. The \fIstyle\fR argument is an integer from 0 to 3: +-.RS +-.TP +-0 +-Do not generate prefetch instructions\&. +-.TP +-1 +-Execute prefetch instructions after each allocation\&. This is the default parameter\&. +-.TP +-2 +-Use the thread-local allocation block (TLAB) watermark pointer to determine when prefetch instructions are executed\&. +-.TP +-3 +-Use BIS instruction on SPARC for allocation prefetch\&. +-.RE +- +-.TP +--XX:+AlwaysPreTouch +-.br +-Enables touching of every page on the Java heap during JVM initialization\&. This gets all pages into the memory before entering the \f3main()\fR method\&. The option can be used in testing to simulate a long-running system with all virtual memory mapped to physical memory\&. By default, this option is disabled and all pages are committed as JVM heap space fills\&. +-.TP +--XX:+CMSClassUnloadingEnabled +-.br +-Enables class unloading when using the concurrent mark-sweep (CMS) garbage collector\&. This option is enabled by default\&. To disable class unloading for the CMS garbage collector, specify \f3-XX:-CMSClassUnloadingEnabled\fR\&. +-.TP +--XX:CMSExpAvgFactor=\fIpercent\fR +-.br ++.PP ++\-XX:+AggressiveHeap ++.RS 4 ++Enables Java heap optimization\&. This sets various parameters to be optimal for long\-running jobs with intensive memory allocation, based on the configuration of the computer (RAM and CPU)\&. By default, the option is disabled and the heap is not optimized\&. ++.RE ++.PP ++\-XX:+AlwaysPreTouch ++.RS 4 ++Enables touching of every page on the Java heap during JVM initialization\&. This gets all pages into the memory before entering the ++\fBmain()\fR ++method\&. The option can be used in testing to simulate a long\-running system with all virtual memory mapped to physical memory\&. By default, this option is disabled and all pages are committed as JVM heap space fills\&. ++.RE ++.PP ++\-XX:+CMSClassUnloadingEnabled ++.RS 4 ++Enables class unloading when using the concurrent mark\-sweep (CMS) garbage collector\&. This option is enabled by default\&. To disable class unloading for the CMS garbage collector, specify ++\fB\-XX:\-CMSClassUnloadingEnabled\fR\&. ++.RE ++.PP ++\-XX:CMSExpAvgFactor=\fIpercent\fR ++.RS 4 + Sets the percentage of time (0 to 100) used to weight the current sample when computing exponential averages for the concurrent collection statistics\&. By default, the exponential averages factor is set to 25%\&. The following example shows how to set the factor to 15%: +-.sp +-.nf +-\f3\-XX:CMSExpAvgFactor=15\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:CMSInitiatingOccupancyFraction=\fIpercent\fR +-.br +-Sets the percentage of the old generation occupancy (0 to 100) at which to start a CMS collection cycle\&. The default value is set to -1\&. Any negative value (including the default) implies that \f3-XX:CMSTriggerRatio\fR is used to define the value of the initiating occupancy fraction\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CMSExpAvgFactor=15\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:CMSInitiatingOccupancyFraction=\fIpercent\fR ++.RS 4 ++Sets the percentage of the old generation occupancy (0 to 100) at which to start a CMS collection cycle\&. The default value is set to \-1\&. Any negative value (including the default) implies that ++\fB\-XX:CMSTriggerRatio\fR ++is used to define the value of the initiating occupancy fraction\&. ++.sp + The following example shows how to set the occupancy fraction to 20%: +-.sp +-.nf +-\f3\-XX:CMSInitiatingOccupancyFraction=20\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+CMSScavengeBeforeRemark +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CMSInitiatingOccupancyFraction=20\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+CMSScavengeBeforeRemark ++.RS 4 + Enables scavenging attempts before the CMS remark step\&. By default, this option is disabled\&. +-.TP +--XX:CMSTriggerRatio=\fIpercent\fR +-.br +-Sets the percentage (0 to 100) of the value specified by \f3-XX:MinHeapFreeRatio\fR that is allocated before a CMS collection cycle commences\&. The default value is set to 80%\&. +- ++.RE ++.PP ++\-XX:CMSTriggerRatio=\fIpercent\fR ++.RS 4 ++Sets the percentage (0 to 100) of the value specified by ++\fB\-XX:MinHeapFreeRatio\fR ++that is allocated before a CMS collection cycle commences\&. The default value is set to 80%\&. ++.sp + The following example shows how to set the occupancy fraction to 75%: +-.sp +-.nf +-\f3\-XX:CMSTriggerRatio=75\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:ConcGCThreads=\fIthreads\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:CMSTriggerRatio=75\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:ConcGCThreads=\fIthreads\fR ++.RS 4 + Sets the number of threads used for concurrent GC\&. The default value depends on the number of CPUs available to the JVM\&. +- ++.sp + For example, to set the number of threads for concurrent GC to 2, specify the following option: +-.sp +-.nf +-\f3\-XX:ConcGCThreads=2\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+DisableExplicitGC +-.br +-Enables the option that disables processing of calls to \f3System\&.gc()\fR\&. This option is disabled by default, meaning that calls to \f3System\&.gc()\fR are processed\&. If processing of calls to \f3System\&.gc()\fR is disabled, the JVM still performs GC when necessary\&. +-.TP +--XX:+ExplicitGCInvokesConcurrent +-.br +-Enables invoking of concurrent GC by using the \f3System\&.gc()\fR request\&. This option is disabled by default and can be enabled only together with the \f3-XX:+UseConcMarkSweepGC\fR option\&. +-.TP +--XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses +-.br +-Enables invoking of concurrent GC by using the \f3System\&.gc()\fR request and unloading of classes during the concurrent GC cycle\&. This option is disabled by default and can be enabled only together with the \f3-XX:+UseConcMarkSweepGC\fR option\&. +-.TP +--XX:G1HeapRegionSize=\fIsize\fR +-.br +-Sets the size of the regions into which the Java heap is subdivided when using the garbage-first (G1) collector\&. The value can be between 1 MB and 32 MB\&. The default region size is determined ergonomically based on the heap size\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ConcGCThreads=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+DisableExplicitGC ++.RS 4 ++Enables the option that disables processing of calls to ++\fBSystem\&.gc()\fR\&. This option is disabled by default, meaning that calls to ++\fBSystem\&.gc()\fR ++are processed\&. If processing of calls to ++\fBSystem\&.gc()\fR ++is disabled, the JVM still performs GC when necessary\&. ++.RE ++.PP ++\-XX:+ExplicitGCInvokesConcurrent ++.RS 4 ++Enables invoking of concurrent GC by using the ++\fBSystem\&.gc()\fR ++request\&. This option is disabled by default and can be enabled only together with the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option\&. ++.RE ++.PP ++\-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses ++.RS 4 ++Enables invoking of concurrent GC by using the ++\fBSystem\&.gc()\fR ++request and unloading of classes during the concurrent GC cycle\&. This option is disabled by default and can be enabled only together with the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option\&. ++.RE ++.PP ++\-XX:G1HeapRegionSize=\fIsize\fR ++.RS 4 ++Sets the size of the regions into which the Java heap is subdivided when using the garbage\-first (G1) collector\&. The value can be between 1 MB and 32 MB\&. The default region size is determined ergonomically based on the heap size\&. ++.sp + The following example shows how to set the size of the subdivisions to 16 MB: +-.sp +-.nf +-\f3\-XX:G1HeapRegionSize=16m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+G1PrintHeapRegions +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:G1HeapRegionSize=16m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+G1PrintHeapRegions ++.RS 4 + Enables the printing of information about which regions are allocated and which are reclaimed by the G1 collector\&. By default, this option is disabled\&. +-.TP +--XX:G1ReservePercent=\fIpercent\fR +-.br ++.RE ++.PP ++\-XX:G1ReservePercent=\fIpercent\fR ++.RS 4 + Sets the percentage of the heap (0 to 50) that is reserved as a false ceiling to reduce the possibility of promotion failure for the G1 collector\&. By default, this option is set to 10%\&. +- ++.sp + The following example shows how to set the reserved heap to 20%: +-.sp +-.nf +-\f3\-XX:G1ReservePercent=20\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:InitialHeapSize=\fIsize\fR +-.br +-Sets the initial size (in bytes) of the memory allocation pool\&. This value must be either 0, or a multiple of 1024 and greater than 1 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc-ergonomics\&.html +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:G1ReservePercent=20\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:InitialHeapSize=\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of the memory allocation pool\&. This value must be either 0, or a multiple of 1024 and greater than 1 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html ++.sp + The following examples show how to set the size of allocated memory to 6 MB using various units: +-.sp +-.nf +-\f3\-XX:InitialHeapSize=6291456\fP +-.fi +-.nf +-\f3\-XX:InitialHeapSize=6144k\fP +-.fi +-.nf +-\f3\-XX:InitialHeapSize=6m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If you set this option to 0, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The size of the heap for the young generation can be set using the \f3-XX:NewSize\fR option\&. +-.TP +--XX:InitialSurvivorRatio=\fIratio\fR +-.br +-Sets the initial survivor space ratio used by the throughput garbage collector (which is enabled by the \f3-XX:+UseParallelGC\fR and/or -\f3XX:+UseParallelOldGC\fR options)\&. Adaptive sizing is enabled by default with the throughput garbage collector by using the \f3-XX:+UseParallelGC\fR and \f3-XX:+UseParallelOldGC\fR options, and survivor space is resized according to the application behavior, starting with the initial value\&. If adaptive sizing is disabled (using the \f3-XX:-UseAdaptiveSizePolicy\fR option), then the \f3-XX:SurvivorRatio\fR option should be used to set the size of the survivor space for the entire execution of the application\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialHeapSize=6291456\fR ++\fB\-XX:InitialHeapSize=6144k\fR ++\fB\-XX:InitialHeapSize=6m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you set this option to 0, then the initial size will be set as the sum of the sizes allocated for the old generation and the young generation\&. The size of the heap for the young generation can be set using the ++\fB\-XX:NewSize\fR ++option\&. ++.RE ++.PP ++\-XX:InitialSurvivorRatio=\fIratio\fR ++.RS 4 ++Sets the initial survivor space ratio used by the throughput garbage collector (which is enabled by the ++\fB\-XX:+UseParallelGC\fR ++and/or \-\fBXX:+UseParallelOldGC\fR ++options)\&. Adaptive sizing is enabled by default with the throughput garbage collector by using the ++\fB\-XX:+UseParallelGC\fR ++and ++\fB\-XX:+UseParallelOldGC\fR ++options, and survivor space is resized according to the application behavior, starting with the initial value\&. If adaptive sizing is disabled (using the ++\fB\-XX:\-UseAdaptiveSizePolicy\fR ++option), then the ++\fB\-XX:SurvivorRatio\fR ++option should be used to set the size of the survivor space for the entire execution of the application\&. ++.sp + The following formula can be used to calculate the initial size of survivor space (S) based on the size of the young generation (Y), and the initial survivor space ratio (R): +-.sp +-.nf +-\f3S=Y/(R+2)\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBS=Y/(R+2)\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + The 2 in the equation denotes two survivor spaces\&. The larger the value specified as the initial survivor space ratio, the smaller the initial survivor space size\&. +- ++.sp + By default, the initial survivor space ratio is set to 8\&. If the default value for the young generation space size is used (2 MB), the initial size of the survivor space will be 0\&.2 MB\&. +- ++.sp + The following example shows how to set the initial survivor space ratio to 4: +-.sp +-.nf +-\f3\-XX:InitialSurvivorRatio=4\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:InitiatingHeapOccupancyPercent=\fIpercent\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitialSurvivorRatio=4\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:InitiatingHeapOccupancyPercent=\fIpercent\fR ++.RS 4 + Sets the percentage of the heap occupancy (0 to 100) at which to start a concurrent GC cycle\&. It is used by garbage collectors that trigger a concurrent GC cycle based on the occupancy of the entire heap, not just one of the generations (for example, the G1 garbage collector)\&. +- ++.sp + By default, the initiating value is set to 45%\&. A value of 0 implies nonstop GC cycles\&. The following example shows how to set the initiating heap occupancy to 75%: +-.sp +-.nf +-\f3\-XX:InitiatingHeapOccupancyPercent=75\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxGCPauseMillis=\fItime\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:InitiatingHeapOccupancyPercent=75\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxGCPauseMillis=\fItime\fR ++.RS 4 + Sets a target for the maximum GC pause time (in milliseconds)\&. This is a soft goal, and the JVM will make its best effort to achieve it\&. By default, there is no maximum pause time value\&. +- ++.sp + The following example shows how to set the maximum target pause time to 500 ms: +-.sp +-.nf +-\f3\-XX:MaxGCPauseMillis=500\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxHeapSize=\fIsize\fR +-.br +-Sets the maximum size (in byes) of the memory allocation pool\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, \f3-XX:InitialHeapSize\fR and \f3-XX:MaxHeapSize\fR are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc-ergonomics\&.html +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxGCPauseMillis=500\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxHeapSize=\fIsize\fR ++.RS 4 ++Sets the maximum size (in byes) of the memory allocation pool\&. This value must be a multiple of 1024 and greater than 2 MB\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. The default value is chosen at runtime based on system configuration\&. For server deployments, ++\fB\-XX:InitialHeapSize\fR ++and ++\fB\-XX:MaxHeapSize\fR ++are often set to the same value\&. For more information, see Garbage Collector Ergonomics at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/vm/gc\-ergonomics\&.html ++.sp + The following examples show how to set the maximum allowed size of allocated memory to 80 MB using various units: +-.sp +-.nf +-\f3\-XX:MaxHeapSize=83886080\fP +-.fi +-.nf +-\f3\-XX:MaxHeapSize=81920k\fP +-.fi +-.nf +-\f3\-XX:MaxHeapSize=80m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxHeapSize=83886080\fR ++\fB\-XX:MaxHeapSize=81920k\fR ++\fB\-XX:MaxHeapSize=80m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + On Oracle Solaris 7 and Oracle Solaris 8 SPARC platforms, the upper limit for this value is approximately 4,000 MB minus overhead amounts\&. On Oracle Solaris 2\&.6 and x86 platforms, the upper limit is approximately 2,000 MB minus overhead amounts\&. On Linux platforms, the upper limit is approximately 2,000 MB minus overhead amounts\&. +- +-The \f3-XX:MaxHeapSize\fR option is equivalent to \f3-Xmx\fR\&. +-.TP +--XX:MaxHeapFreeRatio=\fIpercent\fR +-.br ++.sp ++The ++\fB\-XX:MaxHeapSize\fR ++option is equivalent to ++\fB\-Xmx\fR\&. ++.RE ++.PP ++\-XX:MaxHeapFreeRatio=\fIpercent\fR ++.RS 4 + Sets the maximum allowed percentage of free heap space (0 to 100) after a GC event\&. If free heap space expands above this value, then the heap will be shrunk\&. By default, this value is set to 70%\&. +- ++.sp + The following example shows how to set the maximum free heap ratio to 75%: +-.sp +-.nf +-\f3\-XX:MaxHeapFreeRatio=75\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxMetaspaceSize=\fIsize\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxHeapFreeRatio=75\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxMetaspaceSize=\fIsize\fR ++.RS 4 + Sets the maximum amount of native memory that can be allocated for class metadata\&. By default, the size is not limited\&. The amount of metadata for an application depends on the application itself, other running applications, and the amount of memory available on the system\&. +- ++.sp + The following example shows how to set the maximum class metadata size to 256 MB: +-.sp +-.nf +-\f3\-XX:MaxMetaspaceSize=256m\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MaxNewSize=\fIsize\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxMetaspaceSize=256m\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MaxNewSize=\fIsize\fR ++.RS 4 + Sets the maximum size (in bytes) of the heap for the young generation (nursery)\&. The default value is set ergonomically\&. +-.TP +--XX:MaxTenuringThreshold=\fIthreshold\fR +-.br ++.RE ++.PP ++\-XX:MaxTenuringThreshold=\fIthreshold\fR ++.RS 4 + Sets the maximum tenuring threshold for use in adaptive GC sizing\&. The largest value is 15\&. The default value is 15 for the parallel (throughput) collector, and 6 for the CMS collector\&. +- ++.sp + The following example shows how to set the maximum tenuring threshold to 10: +-.sp +-.nf +-\f3\-XX:MaxTenuringThreshold=10\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:MetaspaceSize=\fIsize\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MaxTenuringThreshold=10\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:MetaspaceSize=\fIsize\fR ++.RS 4 + Sets the size of the allocated class metadata space that will trigger a garbage collection the first time it is exceeded\&. This threshold for a garbage collection is increased or decreased depending on the amount of metadata used\&. The default size depends on the platform\&. +-.TP +--XX:MinHeapFreeRatio=\fIpercent\fR +-.br ++.RE ++.PP ++\-XX:MinHeapFreeRatio=\fIpercent\fR ++.RS 4 + Sets the minimum allowed percentage of free heap space (0 to 100) after a GC event\&. If free heap space falls below this value, then the heap will be expanded\&. By default, this value is set to 40%\&. +- ++.sp + The following example shows how to set the minimum free heap ratio to 25%: +-.sp +-.nf +-\f3\-XX:MinHeapFreeRatio=25\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:NewRatio=\fIratio\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:MinHeapFreeRatio=25\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:NewRatio=\fIratio\fR ++.RS 4 + Sets the ratio between young and old generation sizes\&. By default, this option is set to 2\&. The following example shows how to set the young/old ratio to 1: +-.sp +-.nf +-\f3\-XX:NewRatio=1\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:NewSize=\fIsize\fR +-.br +-Sets the initial size (in bytes) of the heap for the young generation (nursery)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:NewRatio=1\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:NewSize=\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of the heap for the young generation (nursery)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. ++.sp + The young generation region of the heap is used for new objects\&. GC is performed in this region more often than in other regions\&. If the size for the young generation is too low, then a large number of minor GCs will be performed\&. If the size is too high, then only full GCs will be performed, which can take a long time to complete\&. Oracle recommends that you keep the size for the young generation between a half and a quarter of the overall heap size\&. +- ++.sp + The following examples show how to set the initial size of young generation to 256 MB using various units: +-.sp +-.nf +-\f3\-XX:NewSize=256m\fP +-.fi +-.nf +-\f3\-XX:NewSize=262144k\fP +-.fi +-.nf +-\f3\-XX:NewSize=268435456\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The \f3-XX:NewSize\fR option is equivalent to \f3-Xmn\fR\&. +-.TP +--XX:ParallelGCThreads=\fIthreads\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:NewSize=256m\fR ++\fB\-XX:NewSize=262144k\fR ++\fB\-XX:NewSize=268435456\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The ++\fB\-XX:NewSize\fR ++option is equivalent to ++\fB\-Xmn\fR\&. ++.RE ++.PP ++\-XX:ParallelGCThreads=\fIthreads\fR ++.RS 4 + Sets the number of threads used for parallel garbage collection in the young and old generations\&. The default value depends on the number of CPUs available to the JVM\&. +- ++.sp + For example, to set the number of threads for parallel GC to 2, specify the following option: +-.sp +-.nf +-\f3\-XX:ParallelGCThreads=2\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+ParallelRefProcEnabled +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:ParallelGCThreads=2\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+ParallelRefProcEnabled ++.RS 4 + Enables parallel reference processing\&. By default, this option is disabled\&. +-.TP +--XX:+PrintAdaptiveSizePolicy +-.br ++.RE ++.PP ++\-XX:+PrintAdaptiveSizePolicy ++.RS 4 + Enables printing of information about adaptive generation sizing\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGC +-.br ++.RE ++.PP ++\-XX:+PrintGC ++.RS 4 + Enables printing of messages at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCApplicationConcurrentTime +-.br ++.RE ++.PP ++\-XX:+PrintGCApplicationConcurrentTime ++.RS 4 + Enables printing of how much time elapsed since the last pause (for example, a GC pause)\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCApplicationStoppedTime +-.br ++.RE ++.PP ++\-XX:+PrintGCApplicationStoppedTime ++.RS 4 + Enables printing of how much time the pause (for example, a GC pause) lasted\&. By default, this option is disabled\&. +-.TP +--XX+PrintGCDateStamp +-.br ++.RE ++.PP ++\-XX:+PrintGCDateStamps ++.RS 4 + Enables printing of a date stamp at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCDetails +-.br ++.RE ++.PP ++\-XX:+PrintGCDetails ++.RS 4 + Enables printing of detailed messages at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCTaskTimeStamps +-.br ++.RE ++.PP ++\-XX:+PrintGCTaskTimeStamps ++.RS 4 + Enables printing of time stamps for every individual GC worker thread task\&. By default, this option is disabled\&. +-.TP +--XX:+PrintGCTimeStamp +-.br ++.RE ++.PP ++\-XX:+PrintGCTimeStamps ++.RS 4 + Enables printing of time stamps at every GC\&. By default, this option is disabled\&. +-.TP +--XX:+PrintTenuringDistribution +-.br ++.RE ++.PP ++\-XX:+PrintStringDeduplicationStatistics ++.RS 4 ++Prints detailed deduplication statistics\&. By default, this option is disabled\&. See the ++\fB\-XX:+UseStringDeduplication\fR ++option\&. ++.RE ++.PP ++\-XX:+PrintTenuringDistribution ++.RS 4 + Enables printing of tenuring age information\&. The following is an example of the output: +-.sp +-.nf +-\f3Desired survivor size 48286924 bytes, new threshold 10 (max 10)\fP +-.fi +-.nf +-\f3\- age 1: 28992024 bytes, 28992024 total\fP +-.fi +-.nf +-\f3\- age 2: 1366864 bytes, 30358888 total\fP +-.fi +-.nf +-\f3\- age 3: 1425912 bytes, 31784800 total\fP +-.fi +-.nf +-\f3\&.\&.\&.\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBDesired survivor size 48286924 bytes, new threshold 10 (max 10)\fR ++\fB\- age 1: 28992024 bytes, 28992024 total\fR ++\fB\- age 2: 1366864 bytes, 30358888 total\fR ++\fB\- age 3: 1425912 bytes, 31784800 total\fR ++\fB\&.\&.\&.\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + Age 1 objects are the youngest survivors (they were created after the previous scavenge, survived the latest scavenge, and moved from eden to survivor space)\&. Age 2 objects have survived two scavenges (during the second scavenge they were copied from one survivor space to the next)\&. And so on\&. +- ++.sp + In the preceding example, 28 992 024 bytes survived one scavenge and were copied from eden to survivor space, 1 366 864 bytes are occupied by age 2 objects, etc\&. The third value in each row is the cumulative size of objects of age n or less\&. +- ++.sp + By default, this option is disabled\&. +-.TP +--XX:+ScavengeBeforeFullGC +-.br +-Enables GC of the young generation before each full GC\&. This option is enabled by default\&. Oracle recommends that you \fIdo not\fR disable it, because scavenging the young generation before a full GC can reduce the number of objects reachable from the old generation space into the young generation space\&. To disable GC of the young generation before each full GC, specify \f3-XX:-ScavengeBeforeFullGC\fR\&. +-.TP +--XX:SoftRefLRUPolicyMSPerMB=\fItime\fR +-.br +-Sets the amount of time (in milliseconds) a softly reachable object is kept active on the heap after the last time it was referenced\&. The default value is one second of lifetime per free megabyte in the heap\&. The \f3-XX:SoftRefLRUPolicyMSPerMB\fR option accepts integer values representing milliseconds per one megabyte of the current heap size (for Java HotSpot Client VM) or the maximum possible heap size (for Java HotSpot Server VM)\&. This difference means that the Client VM tends to flush soft references rather than grow the heap, whereas the Server VM tends to grow the heap rather than flush soft references\&. In the latter case, the value of the \f3-Xmx\fR option has a significant effect on how quickly soft references are garbage collected\&. +- ++.RE ++.PP ++\-XX:+ScavengeBeforeFullGC ++.RS 4 ++Enables GC of the young generation before each full GC\&. This option is enabled by default\&. Oracle recommends that you ++\fIdo not\fR ++disable it, because scavenging the young generation before a full GC can reduce the number of objects reachable from the old generation space into the young generation space\&. To disable GC of the young generation before each full GC, specify ++\fB\-XX:\-ScavengeBeforeFullGC\fR\&. ++.RE ++.PP ++\-XX:SoftRefLRUPolicyMSPerMB=\fItime\fR ++.RS 4 ++Sets the amount of time (in milliseconds) a softly reachable object is kept active on the heap after the last time it was referenced\&. The default value is one second of lifetime per free megabyte in the heap\&. The ++\fB\-XX:SoftRefLRUPolicyMSPerMB\fR ++option accepts integer values representing milliseconds per one megabyte of the current heap size (for Java HotSpot Client VM) or the maximum possible heap size (for Java HotSpot Server VM)\&. This difference means that the Client VM tends to flush soft references rather than grow the heap, whereas the Server VM tends to grow the heap rather than flush soft references\&. In the latter case, the value of the ++\fB\-Xmx\fR ++option has a significant effect on how quickly soft references are garbage collected\&. ++.sp + The following example shows how to set the value to 2\&.5 seconds: +-.sp +-.nf +-\f3\-XX:SoftRefLRUPolicyMSPerMB=2500\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:SurvivorRatio=\fIratio\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:SoftRefLRUPolicyMSPerMB=2500\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:StringDeduplicationAgeThreshold=\fIthreshold\fR ++.RS 4 ++\fBString\fR ++objects reaching the specified age are considered candidates for deduplication\&. An object\*(Aqs age is a measure of how many times it has survived garbage collection\&. This is sometimes referred to as tenuring; see the ++\fB\-XX:+PrintTenuringDistribution\fR ++option\&. Note that ++\fBString\fR ++objects that are promoted to an old heap region before this age has been reached are always considered candidates for deduplication\&. The default value for this option is ++\fB3\fR\&. See the ++\fB\-XX:+UseStringDeduplication\fR ++option\&. ++.RE ++.PP ++\-XX:SurvivorRatio=\fIratio\fR ++.RS 4 + Sets the ratio between eden space size and survivor space size\&. By default, this option is set to 8\&. The following example shows how to set the eden/survivor space ratio to 4: +-.sp +-.nf +-\f3\-XX:SurvivorRatio=4\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:TargetSurvivorRatio=\fIpercent\fR +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:SurvivorRatio=4\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:TargetSurvivorRatio=\fIpercent\fR ++.RS 4 + Sets the desired percentage of survivor space (0 to 100) used after young garbage collection\&. By default, this option is set to 50%\&. +- ++.sp + The following example shows how to set the target survivor space ratio to 30%: +-.sp +-.nf +-\f3\-XX:TargetSurvivorRatio=30\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:TLABSize=\fIsize\fR +-.br +-Sets the initial size (in bytes) of a thread-local allocation buffer (TLAB)\&. Append the letter \f3k\fR or \f3K\fR to indicate kilobytes, \f3m\fR or \f3M\fR to indicate megabytes, \f3g\fR or \f3G\fR to indicate gigabytes\&. If this option is set to 0, then the JVM chooses the initial size automatically\&. +- ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:TargetSurvivorRatio=30\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:TLABSize=\fIsize\fR ++.RS 4 ++Sets the initial size (in bytes) of a thread\-local allocation buffer (TLAB)\&. Append the letter ++\fBk\fR ++or ++\fBK\fR ++to indicate kilobytes, ++\fBm\fR ++or ++\fBM\fR ++to indicate megabytes, ++\fBg\fR ++or ++\fBG\fR ++to indicate gigabytes\&. If this option is set to 0, then the JVM chooses the initial size automatically\&. ++.sp + The following example shows how to set the initial TLAB size to 512 KB: +-.sp +-.nf +-\f3\-XX:TLABSize=512k\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--XX:+UseAdaptiveSizePolicy +-.br +-Enables the use of adaptive generation sizing\&. This option is enabled by default\&. To disable adaptive generation sizing, specify \f3-XX:-UseAdaptiveSizePolicy\fR and set the size of the memory allocation pool explicitly (see the \f3-XX:SurvivorRatio\fR option)\&. +-.TP +--XX:+UseCMSInitiatingOccupancyOnly +-.br ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-XX:TLABSize=512k\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-XX:+UseAdaptiveSizePolicy ++.RS 4 ++Enables the use of adaptive generation sizing\&. This option is enabled by default\&. To disable adaptive generation sizing, specify ++\fB\-XX:\-UseAdaptiveSizePolicy\fR ++and set the size of the memory allocation pool explicitly (see the ++\fB\-XX:SurvivorRatio\fR ++option)\&. ++.RE ++.PP ++\-XX:+UseCMSInitiatingOccupancyOnly ++.RS 4 + Enables the use of the occupancy value as the only criterion for initiating the CMS collector\&. By default, this option is disabled and other criteria may be used\&. +-.TP +--XX:+UseConcMarkSweepGC +-.br +-Enables the use of the CMS garbage collector for the old generation\&. Oracle recommends that you use the CMS garbage collector when application latency requirements cannot be met by the throughput (\f3-XX:+UseParallelGC\fR) garbage collector\&. The G1 garbage collector (\f3-XX:+UseG1GC\fR) is another alternative\&. +- +-By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. When this option is enabled, the \f3-XX:+UseParNewGC\fR option is automatically set and you should not disable it, because the following combination of options has been deprecated in JDK 8: \f3-XX:+UseConcMarkSweepGC -XX:-UseParNewGC\fR\&. +-.TP +--XX:+UseG1GC +-.br +-Enables the use of the G1 garbage collector\&. It is a server-style garbage collector, targeted for multiprocessor machines with a large amount of RAM\&. It meets GC pause time goals with high probability, while maintaining good throughput\&. The G1 collector is recommended for applications requiring large heaps (sizes of around 6 GB or larger) with limited GC latency requirements (stable and predictable pause time below 0\&.5 seconds)\&. +- ++.RE ++.PP ++\-XX:+UseConcMarkSweepGC ++.RS 4 ++Enables the use of the CMS garbage collector for the old generation\&. Oracle recommends that you use the CMS garbage collector when application latency requirements cannot be met by the throughput (\fB\-XX:+UseParallelGC\fR) garbage collector\&. The G1 garbage collector (\fB\-XX:+UseG1GC\fR) is another alternative\&. ++.sp ++By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. When this option is enabled, the ++\fB\-XX:+UseParNewGC\fR ++option is automatically set and you should not disable it, because the following combination of options has been deprecated in JDK 8: ++\fB\-XX:+UseConcMarkSweepGC \-XX:\-UseParNewGC\fR\&. ++.RE ++.PP ++\-XX:+UseG1GC ++.RS 4 ++Enables the use of the garbage\-first (G1) garbage collector\&. It is a server\-style garbage collector, targeted for multiprocessor machines with a large amount of RAM\&. It meets GC pause time goals with high probability, while maintaining good throughput\&. The G1 collector is recommended for applications requiring large heaps (sizes of around 6 GB or larger) with limited GC latency requirements (stable and predictable pause time below 0\&.5 seconds)\&. ++.sp + By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. +-.TP +--XX:+UseGCOverheadLimit +-.br +-Enables the use of a policy that limits the proportion of time spent by the JVM on GC before an \f3OutOfMemoryError\fR exception is thrown\&. This option is enabled, by default and the parallel GC will throw an \f3OutOfMemoryError\fR if more than 98% of the total time is spent on garbage collection and less than 2% of the heap is recovered\&. When the heap is small, this feature can be used to prevent applications from running for long periods of time with little or no progress\&. To disable this option, specify \f3-XX:-UseGCOverheadLimit\fR\&. +-.TP +--XX:+UseNUMA +-.br +-Enables performance optimization of an application on a machine with nonuniform memory architecture (NUMA) by increasing the application\&'s use of lower latency memory\&. By default, this option is disabled and no optimization for NUMA is made\&. The option is only available when the parallel garbage collector is used (\f3-XX:+UseParallelGC\fR)\&. +-.TP +--XX:+UseParallelGC +-.br ++.RE ++.PP ++\-XX:+UseGCOverheadLimit ++.RS 4 ++Enables the use of a policy that limits the proportion of time spent by the JVM on GC before an ++\fBOutOfMemoryError\fR ++exception is thrown\&. This option is enabled, by default and the parallel GC will throw an ++\fBOutOfMemoryError\fR ++if more than 98% of the total time is spent on garbage collection and less than 2% of the heap is recovered\&. When the heap is small, this feature can be used to prevent applications from running for long periods of time with little or no progress\&. To disable this option, specify ++\fB\-XX:\-UseGCOverheadLimit\fR\&. ++.RE ++.PP ++\-XX:+UseNUMA ++.RS 4 ++Enables performance optimization of an application on a machine with nonuniform memory architecture (NUMA) by increasing the application\*(Aqs use of lower latency memory\&. By default, this option is disabled and no optimization for NUMA is made\&. The option is only available when the parallel garbage collector is used (\fB\-XX:+UseParallelGC\fR)\&. ++.RE ++.PP ++\-XX:+UseParallelGC ++.RS 4 + Enables the use of the parallel scavenge garbage collector (also known as the throughput collector) to improve the performance of your application by leveraging multiple processors\&. +- +-By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. If it is enabled, then the \f3-XX:+UseParallelOldGC\fR option is automatically enabled, unless you explicitly disable it\&. +-.TP +--XX:+UseParallelOldGC +-.br +-Enables the use of the parallel garbage collector for full GCs\&. By default, this option is disabled\&. Enabling it automatically enables the \f3-XX:+UseParallelGC\fR option\&. +-.TP +--XX:+UseParNewGC +-.br +-Enables the use of parallel threads for collection in the young generation\&. By default, this option is disabled\&. It is automatically enabled when you set the \f3-XX:+UseConcMarkSweepGC\fR option\&. Using the \f3-XX:+UseParNewGC\fR option without the \f3-XX:+UseConcMarkSweepGC\fR option was deprecated in JDK 8\&. +-.TP +--XX:+UseSerialGC +-.br ++.sp ++By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. If it is enabled, then the ++\fB\-XX:+UseParallelOldGC\fR ++option is automatically enabled, unless you explicitly disable it\&. ++.RE ++.PP ++\-XX:+UseParallelOldGC ++.RS 4 ++Enables the use of the parallel garbage collector for full GCs\&. By default, this option is disabled\&. Enabling it automatically enables the ++\fB\-XX:+UseParallelGC\fR ++option\&. ++.RE ++.PP ++\-XX:+UseParNewGC ++.RS 4 ++Enables the use of parallel threads for collection in the young generation\&. By default, this option is disabled\&. It is automatically enabled when you set the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option\&. Using the ++\fB\-XX:+UseParNewGC\fR ++option without the ++\fB\-XX:+UseConcMarkSweepGC\fR ++option was deprecated in JDK 8\&. ++.RE ++.PP ++\-XX:+UseSerialGC ++.RS 4 + Enables the use of the serial garbage collector\&. This is generally the best choice for small and simple applications that do not require any special functionality from garbage collection\&. By default, this option is disabled and the collector is chosen automatically based on the configuration of the machine and type of the JVM\&. +-.TP +--XX:+UseTLAB +-.br +-Enables the use of thread-local allocation blocks (TLABs) in the young generation space\&. This option is enabled by default\&. To disable the use of TLABs, specify \f3-XX:-UseTLAB\fR\&. +-.SS DEPRECATED\ AND\ REMOVED\ OPTIONS ++.RE ++.PP ++\-XX:+UseStringDeduplication ++.RS 4 ++Enables string deduplication\&. By default, this option is disabled\&. To use this option, you must enable the garbage\-first (G1) garbage collector\&. See the ++\fB\-XX:+UseG1GC\fR ++option\&. ++.sp ++\fIString deduplication\fR ++reduces the memory footprint of ++\fBString\fR ++objects on the Java heap by taking advantage of the fact that many ++\fBString\fR ++objects are identical\&. Instead of each ++\fBString\fR ++object pointing to its own character array, identical ++\fBString\fR ++objects can point to and share the same character array\&. ++.RE ++.PP ++\-XX:+UseTLAB ++.RS 4 ++Enables the use of thread\-local allocation blocks (TLABs) in the young generation space\&. This option is enabled by default\&. To disable the use of TLABs, specify ++\fB\-XX:\-UseTLAB\fR\&. ++.RE ++.SS "Deprecated and Removed Options" ++.PP + These options were included in the previous release, but have since been considered unnecessary\&. +-.TP +--Xincgc +-.br ++.PP ++\-Xincgc ++.RS 4 + Enables incremental garbage collection\&. This option was deprecated in JDK 8 with no replacement\&. +-.TP +--Xrun\fIlibname\fR +-.br +-Loads the specified debugging/profiling library\&. This option was superseded by the \f3-agentlib\fR option\&. +-.TP +--XX:CMSIncrementalDutyCycle=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) between minor collections that the concurrent collector is allowed to run\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:CMSIncrementalDutyCycleMin=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) between minor collections that is the lower bound for the duty cycle when \f3-XX:+CMSIncrementalPacing\fR is enabled\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:+CMSIncrementalMode +-.br +-Enables the incremental mode for the CMS collector\&. This option was deprecated in JDK 8 with no replacement, along with other options that start with \f3CMSIncremental\fR\&. +-.TP +--XX:CMSIncrementalOffset=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) by which the incremental mode duty cycle is shifted to the right within the period between minor collections\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:+CMSIncrementalPacing +-.br +-Enables automatic adjustment of the incremental mode duty cycle based on statistics collected while the JVM is running\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:CMSIncrementalSafetyFactor=\fIpercent\fR +-.br +-Sets the percentage of time (0 to 100) used to add conservatism when computing the duty cycle\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the \f3-XX:+CMSIncrementalMode\fR option\&. +-.TP +--XX:CMSInitiatingPermOccupancyFraction=\fIpercent\fR +-.br ++.RE ++.PP ++\-Xrun\fIlibname\fR ++.RS 4 ++Loads the specified debugging/profiling library\&. This option was superseded by the ++\fB\-agentlib\fR ++option\&. ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycle=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) between minor collections that the concurrent collector is allowed to run\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:CMSIncrementalDutyCycleMin=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) between minor collections that is the lower bound for the duty cycle when ++\fB\-XX:+CMSIncrementalPacing\fR ++is enabled\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:+CMSIncrementalMode ++.RS 4 ++Enables the incremental mode for the CMS collector\&. This option was deprecated in JDK 8 with no replacement, along with other options that start with ++\fBCMSIncremental\fR\&. ++.RE ++.PP ++\-XX:CMSIncrementalOffset=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) by which the incremental mode duty cycle is shifted to the right within the period between minor collections\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:+CMSIncrementalPacing ++.RS 4 ++Enables automatic adjustment of the incremental mode duty cycle based on statistics collected while the JVM is running\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:CMSIncrementalSafetyFactor=\fIpercent\fR ++.RS 4 ++Sets the percentage of time (0 to 100) used to add conservatism when computing the duty cycle\&. This option was deprecated in JDK 8 with no replacement, following the deprecation of the ++\fB\-XX:+CMSIncrementalMode\fR ++option\&. ++.RE ++.PP ++\-XX:CMSInitiatingPermOccupancyFraction=\fIpercent\fR ++.RS 4 + Sets the percentage of the permanent generation occupancy (0 to 100) at which to start a GC\&. This option was deprecated in JDK 8 with no replacement\&. +-.TP +--XX:MaxPermSize=\fIsize\fR +-.br +-Sets the maximum permanent generation space size (in bytes)\&. This option was deprecated in JDK 8, and superseded by the \f3-XX:MaxMetaspaceSize\fR option\&. +-.TP +--XX:PermSize=\fIsize\fR +-.br +-Sets the space (in bytes) allocated to the permanent generation that triggers a garbage collection if it is exceeded\&. This option was deprecated un JDK 8, and superseded by the \f3-XX:MetaspaceSize\fR option\&. +-.TP +--XX:+UseSplitVerifier +-.br ++.RE ++.PP ++\-XX:MaxPermSize=\fIsize\fR ++.RS 4 ++Sets the maximum permanent generation space size (in bytes)\&. This option was deprecated in JDK 8, and superseded by the ++\fB\-XX:MaxMetaspaceSize\fR ++option\&. ++.RE ++.PP ++\-XX:PermSize=\fIsize\fR ++.RS 4 ++Sets the space (in bytes) allocated to the permanent generation that triggers a garbage collection if it is exceeded\&. This option was deprecated un JDK 8, and superseded by the ++\fB\-XX:MetaspaceSize\fR ++option\&. ++.RE ++.PP ++\-XX:+UseSplitVerifier ++.RS 4 + Enables splitting of the verification process\&. By default, this option was enabled in the previous releases, and verification was split into two phases: type referencing (performed by the compiler) and type checking (performed by the JVM runtime)\&. This option was deprecated in JDK 8, and verification is now split by default without a way to disable it\&. +-.TP +--XX:+UseStringCache +-.br ++.RE ++.PP ++\-XX:+UseStringCache ++.RS 4 + Enables caching of commonly allocated strings\&. This option was removed from JDK 8 with no replacement\&. +-.SH PERFORMANCE\ TUNING\ EXAMPLES ++.RE ++.SH "PERFORMANCE TUNING EXAMPLES" ++.PP + The following examples show how to use experimental tuning flags to either optimize throughput or to provide lower response time\&. + .PP +-\f3Example 1 Tuning for Higher Throughput\fR +-.sp +-.nf +-\f3java \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 2 Tuning for Lower Response Time\fR +-.sp +-.nf +-\f3java \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-.SH EXIT\ STATUS +-The following exit values are typically returned by the launcher when the launcher is called with the wrong arguments, serious errors, or exceptions thrown by the JVM\&. However, a Java application may choose to return any value by using the API call \f3System\&.exit(exitValue)\fR\&. The values are: +-.TP 0.2i +-\(bu +-\f30\fR: Successful completion +-.TP 0.2i +-\(bu +-\f3>0\fR: An error occurred +-.SH SEE\ ALSO +-.TP 0.2i +-\(bu ++\fBExample 1\fR ++.br ++Tuning for Higher Throughput ++.RS 4 ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-d64 \-server \-XX:+AggressiveOpts \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\fBExample 2\fR ++.br ++Tuning for Lower Response Time ++.RS 4 ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-d64 \-XX:+UseG1GC \-Xms26g Xmx26g \-XX:MaxGCPauseMillis=500 \-XX:+PrintGCTimeStamp\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.SH "EXIT STATUS" ++.PP ++The following exit values are typically returned by the launcher when the launcher is called with the wrong arguments, serious errors, or exceptions thrown by the JVM\&. However, a Java application may choose to return any value by using the API call ++\fBSystem\&.exit(exitValue)\fR\&. The values are: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fB0\fR: Successful completion ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++\fB>0\fR: An error occurred ++.RE ++.SH "SEE ALSO" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javac(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jdb(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javah(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jar(1) +-.RE +-.br +-'pl 8.5i +-'bp ++.RE ++.br ++'pl 8.5i ++'bp +--- ./jdk/src/solaris/doc/sun/man/man1/javac.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/javac.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,1364 +1,2116 @@ + '\" t +-.\" Copyright (c) 1994, 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. +-.\" +-.\" Arch: generic +-.\" Software: JDK 8 +-.\" Date: 21 November 2013 +-.\" SectDesc: Basic Tools +-.\" Title: javac.1 ++.\" Copyright (c) 1994, 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. ++.\" ++.\" Title: javac ++.\" Language: English ++.\" Date: 8 August 2014 ++.\" SectDesc: Basic Tools ++.\" Software: JDK 8 ++.\" Arch: generic ++.\" Part Number: E38207-03 + .\" + .if n .pl 99999 +-.TH javac 1 "21 November 2013" "JDK 8" "Basic Tools" +-.\" ----------------------------------------------------------------- +-.\" * Define some portability stuff +-.\" ----------------------------------------------------------------- +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.\" http://bugs.debian.org/507673 +-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" ----------------------------------------------------------------- +-.\" * set default formatting +-.\" ----------------------------------------------------------------- +-.\" disable hyphenation +-.nh +-.\" disable justification (adjust text to left margin only) +-.ad l +-.\" ----------------------------------------------------------------- +-.\" * MAIN CONTENT STARTS HERE * +-.\" ----------------------------------------------------------------- +- +-.SH NAME ++.TH "javac" "1" "8 August 2014" "JDK 8" "Basic Tools" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" + javac \- Reads Java class and interface definitions and compiles them into bytecode and class files\&. +-.SH SYNOPSIS +-.sp +-.nf +- ++.SH "SYNOPSIS" ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjavac\fR [ \fIoptions\fR ] [ \fIsourcefiles\fR ] [ \fIclasses\fR] [ \fI@argfiles\fR ] +-.fi +-.sp ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + Arguments can be in any order: +-.TP ++.PP + \fIoptions\fR +-Command-line options\&. See Options\&. +-.TP ++.RS 4 ++Command\-line options\&. See Options\&. ++.RE ++.PP + \fIsourcefiles\fR +-One or more source files to be compiled (such as \f3MyClass\&.java\fR)\&. +-.TP ++.RS 4 ++One or more source files to be compiled (such as ++\fBMyClass\&.java\fR)\&. ++.RE ++.PP + \fIclasses\fR +-One or more classes to be processed for annotations (such as \f3MyPackage\&.MyClass\fR)\&. +-.TP ++.RS 4 ++One or more classes to be processed for annotations (such as ++\fBMyPackage\&.MyClass\fR)\&. ++.RE ++.PP + \fI@argfiles\fR +-One or more files that list options and source files\&. The \f3-J\fR options are not allowed in these files\&. See Command-Line Argument Files\&. +-.SH DESCRIPTION +-The \f3javac\fR command reads class and interface definitions, written in the Java programming language, and compiles them into bytecode class files\&. The \f3javac\fR command can also process annotations in Java source files and classes\&. ++.RS 4 ++One or more files that list options and source files\&. The ++\fB\-J\fR ++options are not allowed in these files\&. See Command\-Line Argument Files\&. ++.RE ++.SH "DESCRIPTION" + .PP +-There are two ways to pass source code file names to \f3javac\fR\&. +-.TP 0.2i +-\(bu ++The ++\fBjavac\fR ++command reads class and interface definitions, written in the Java programming language, and compiles them into bytecode class files\&. The ++\fBjavac\fR ++command can also process annotations in Java source files and classes\&. ++.PP ++There are two ways to pass source code file names to ++\fBjavac\fR\&. ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + For a small number of source files, list the file names on the command line\&. +-.TP 0.2i +-\(bu +-For a large number of source files, list the file names in a file that is separated by blanks or line breaks\&. Use the list file name preceded by an at sign (@) with the \f3javac\fR command\&. ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++For a large number of source files, list the file names in a file that is separated by blanks or line breaks\&. Use the list file name preceded by an at sign (@) with the ++\fBjavac\fR ++command\&. ++.RE + .PP +-Source code file names must have \&.java suffixes, class file names must have \&.class suffixes, and both source and class files must have root names that identify the class\&. For example, a class called \f3MyClass\fR would be written in a source file called \f3MyClass\&.java\fR and compiled into a bytecode class file called \f3MyClass\&.class\fR\&. ++Source code file names must have \&.java suffixes, class file names must have \&.class suffixes, and both source and class files must have root names that identify the class\&. For example, a class called ++\fBMyClass\fR ++would be written in a source file called ++\fBMyClass\&.java\fR ++and compiled into a bytecode class file called ++\fBMyClass\&.class\fR\&. + .PP +-Inner class definitions produce additional class files\&. These class files have names that combine the inner and outer class names, such as \f3MyClass$MyInnerClass\&.class\fR\&. ++Inner class definitions produce additional class files\&. These class files have names that combine the inner and outer class names, such as ++\fBMyClass$MyInnerClass\&.class\fR\&. + .PP +-Arrange source files in a directory tree that reflects their package tree\&. For example, if all of your source files are in \f3/workspace\fR, then put the source code for \f3com\&.mysoft\&.mypack\&.MyClass\fR in \f3/workspace/com/mysoft/mypack/MyClass\&.java\fR\&. ++Arrange source files in a directory tree that reflects their package tree\&. For example, if all of your source files are in ++\fB/workspace\fR, then put the source code for ++\fBcom\&.mysoft\&.mypack\&.MyClass\fR ++in ++\fB/workspace/com/mysoft/mypack/MyClass\&.java\fR\&. + .PP +-By default, the compiler puts each class file in the same directory as its source file\&. You can specify a separate destination directory with the \f3-d\fR option\&. +-.SH OPTIONS +-The compiler has a set of standard options that are supported on the current development environment\&. An additional set of nonstandard options are specific to the current virtual machine and compiler implementations and are subject to change in the future\&. Nonstandard options begin with the \f3-X\fR option\&. +-.TP 0.2i +-\(bu +-See also Cross-Compilation Options +-.TP 0.2i +-\(bu ++By default, the compiler puts each class file in the same directory as its source file\&. You can specify a separate destination directory with the ++\fB\-d\fR ++option\&. ++.SH "OPTIONS" ++.PP ++The compiler has a set of standard options that are supported on the current development environment\&. An additional set of nonstandard options are specific to the current virtual machine and compiler implementations and are subject to change in the future\&. Nonstandard options begin with the ++\fB\-X\fR ++option\&. ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++See also Cross\-Compilation Options ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + See also Nonstandard Options +-.SS STANDARD\ OPTIONS +-.TP +--A\fIkey\fR[\fI=value\fR] ++.RE ++.SS "Standard Options" ++.PP ++\-A\fIkey\fR[\fI=value\fR] ++.RS 4 ++Specifies options to pass to annotation processors\&. These options are not interpreted by ++\fBjavac\fR ++directly, but are made available for use by individual processors\&. The ++\fBkey\fR ++value should be one or more identifiers separated by a dot (\&.)\&. ++.RE ++.PP ++\-cp \fIpath\fR or \-classpath \fIpath\fR ++.RS 4 ++Specifies where to find user class files, and (optionally) annotation processors and source files\&. This class path overrides the user class path in the ++\fBCLASSPATH\fR ++environment variable\&. If neither ++\fBCLASSPATH\fR, ++\fB\-cp\fR ++nor ++\fB\-classpath\fR ++is specified, then the user ++\fIclass path\fR ++is the current directory\&. See Setting the Class Path \&. ++.sp ++If the ++\fB\-sourcepath\fR ++option is not specified, then the user class path is also searched for source files\&. ++.sp ++If the ++\fB\-processorpath\fR ++option is not specified, then the class path is also searched for annotation processors\&. ++.RE ++.PP ++\-Djava\&.ext\&.dirs=\fIdirectories\fR ++.RS 4 ++Overrides the location of installed extensions\&. ++.RE ++.PP ++\-Djava\&.endorsed\&.dirs=\fIdirectories\fR ++.RS 4 ++Overrides the location of the endorsed standards path\&. ++.RE ++.PP ++\-d \fIdirectory\fR ++.RS 4 ++Sets the destination directory for class files\&. The directory must already exist because ++\fBjavac\fR ++does not create it\&. If a class is part of a package, then ++\fBjavac\fR ++puts the class file in a subdirectory that reflects the package name and creates directories as needed\&. ++.sp ++If you specify ++\fB\-d\fR ++\fB/home/myclasses\fR ++and the class is called ++\fBcom\&.mypackage\&.MyClass\fR, then the class file is ++\fB/home/myclasses/com/mypackage/MyClass\&.class\fR\&. ++.sp ++If the ++\fI\-d\fR ++option is not specified, then ++\fBjavac\fR ++puts each class file in the same directory as the source file from which it was generated\&. ++.sp ++\fBNote:\fR ++The directory specified by the ++\fI\-d\fR ++option is not automatically added to your user class path\&. ++.RE ++.PP ++\-deprecation ++.RS 4 ++Shows a description of each use or override of a deprecated member or class\&. Without the ++\fB\-deprecation\fR ++option, ++\fBjavac\fR ++shows a summary of the source files that use or override deprecated members or classes\&. The ++\fB\-deprecation\fR ++option is shorthand for ++\fB\-Xlint:deprecation\fR\&. ++.RE ++.PP ++\-encoding \fIencoding\fR ++.RS 4 ++Sets the source file encoding name, such as EUC\-JP and UTF\-8\&. If the ++\fB\-encoding\fR ++option is not specified, then the platform default converter is used\&. ++.RE ++.PP ++\-endorseddirs \fIdirectories\fR ++.RS 4 ++Overrides the location of the endorsed standards path\&. ++.RE ++.PP ++\-extdirs \fIdirectories\fR ++.RS 4 ++Overrides the location of the ++\fBext\fR ++directory\&. The directories variable is a colon\-separated list of directories\&. Each JAR file in the specified directories is searched for class files\&. All JAR files found become part of the class path\&. ++.sp ++If you are cross\-compiling (compiling classes against bootstrap and extension classes of a different Java platform implementation), then this option specifies the directories that contain the extension classes\&. See Cross\-Compilation Options for more information\&. ++.RE ++.PP ++\-g ++.RS 4 ++Generates all debugging information, including local variables\&. By default, only line number and source file information is generated\&. ++.RE ++.PP ++\-g:none ++.RS 4 ++Does not generate any debugging information\&. ++.RE ++.PP ++\-g:[\fIkeyword list\fR] ++.RS 4 ++Generates only some kinds of debugging information, specified by a comma separated list of keywords\&. Valid keywords are: ++.PP ++source ++.RS 4 ++Source file debugging information\&. ++.RE ++.PP ++lines ++.RS 4 ++Line number debugging information\&. ++.RE ++.PP ++vars ++.RS 4 ++Local variable debugging information\&. ++.RE ++.RE ++.PP ++\-help ++.RS 4 ++Prints a synopsis of standard options\&. ++.RE ++.PP ++\-implicit:[\fIclass, none\fR] ++.RS 4 ++Controls the generation of class files for implicitly loaded source files\&. To automatically generate class files, use ++\fB\-implicit:class\fR\&. To suppress class file generation, use ++\fB\-implicit:none\fR\&. If this option is not specified, then the default is to automatically generate class files\&. In this case, the compiler issues a warning if any such class files are generated when also doing annotation processing\&. The warning is not issued when the ++\fB\-implicit\fR ++option is set explicitly\&. See Searching for Types\&. ++.RE ++.PP ++\-J\fIoption\fR ++.RS 4 ++Passes ++\fBoption\fR ++to the Java Virtual Machine (JVM), where option is one of the options described on the reference page for the Java launcher\&. For example, ++\fB\-J\-Xms48m\fR ++sets the startup memory to 48 MB\&. See ++java(1)\&. ++.sp ++\fBNote:\fR ++The ++\fICLASSPATH\fR, ++\fB\-classpath\fR, ++\fB\-bootclasspath\fR, and ++\fB\-extdirs\fR ++options do not specify the classes used to run ++\fBjavac\fR\&. Trying to customize the compiler implementation with these options and variables is risky and often does not accomplish what you want\&. If you must customize the complier implementation, then use the ++\fB\-J\fR ++option to pass options through to the underlying Java launcher\&. ++.RE ++.PP ++\-nowarn ++.RS 4 ++Disables warning messages\&. This option operates the same as the ++\fB\-Xlint:none\fR ++option\&. ++.RE ++.PP ++\-parameters ++.RS 4 ++Stores formal parameter names of constructors and methods in the generated class file so that the method ++\fBjava\&.lang\&.reflect\&.Executable\&.getParameters\fR ++from the Reflection API can retrieve them\&. ++.RE ++.PP ++\-proc: [\fInone\fR, \fIonly\fR] ++.RS 4 ++Controls whether annotation processing and compilation are done\&. ++\fB\-proc:none\fR ++means that compilation takes place without annotation processing\&. ++\fB\-proc:only\fR ++means that only annotation processing is done, without any subsequent compilation\&. ++.RE ++.PP ++\-processor \fIclass1\fR [,\fIclass2\fR,\fIclass3\fR\&.\&.\&.] ++.RS 4 ++Names of the annotation processors to run\&. This bypasses the default discovery process\&. ++.RE ++.PP ++\-processorpath \fIpath\fR ++.RS 4 ++Specifies where to find annotation processors\&. If this option is not used, then the class path is searched for processors\&. ++.RE ++.PP ++\-s \fIdir\fR ++.RS 4 ++Specifies the directory where to place the generated source files\&. The directory must already exist because ++\fBjavac\fR ++does not create it\&. If a class is part of a package, then the compiler puts the source file in a subdirectory that reflects the package name and creates directories as needed\&. ++.sp ++If you specify ++\fB\-s /home/mysrc\fR ++and the class is called ++\fBcom\&.mypackage\&.MyClass\fR, then the source file is put in ++\fB/home/mysrc/com/mypackage/MyClass\&.java\fR\&. ++.RE ++.PP ++\-source \fIrelease\fR ++.RS 4 ++Specifies the version of source code accepted\&. The following values for ++\fBrelease\fR ++are allowed: ++.PP ++1\&.3 ++.RS 4 ++The compiler does not support assertions, generics, or other language features introduced after Java SE 1\&.3\&. ++.RE ++.PP ++1\&.4 ++.RS 4 ++The compiler accepts code containing assertions, which were introduced in Java SE 1\&.4\&. ++.RE ++.PP ++1\&.5 ++.RS 4 ++The compiler accepts code containing generics and other language features introduced in Java SE 5\&. ++.RE ++.PP ++5 ++.RS 4 ++Synonym for 1\&.5\&. ++.RE ++.PP ++1\&.6 ++.RS 4 ++No language changes were introduced in Java SE 6\&. However, encoding errors in source files are now reported as errors instead of warnings as in earlier releases of Java Platform, Standard Edition\&. ++.RE ++.PP ++6 ++.RS 4 ++Synonym for 1\&.6\&. ++.RE ++.PP ++1\&.7 ++.RS 4 ++The compiler accepts code with features introduced in Java SE 7\&. ++.RE ++.PP ++7 ++.RS 4 ++Synonym for 1\&.7\&. ++.RE ++.PP ++1\&.8 ++.RS 4 ++This is the default value\&. The compiler accepts code with features introduced in Java SE 8\&. ++.RE ++.PP ++8 ++.RS 4 ++Synonym for 1\&.8\&. ++.RE ++.RE ++.PP ++\-sourcepath \fIsourcepath\fR ++.RS 4 ++Specifies the source code path to search for class or interface definitions\&. As with the user class path, source path entries are separated by colons (:) on Oracle Solaris and semicolons on Windows and can be directories, JAR archives, or ZIP archives\&. If packages are used, then the local path name within the directory or archive must reflect the package name\&. ++.sp ++\fBNote:\fR ++Classes found through the class path might be recompiled when their source files are also found\&. See Searching for Types\&. ++.RE ++.PP ++\-verbose ++.RS 4 ++Uses verbose output, which includes information about each class loaded and each source file compiled\&. ++.RE ++.PP ++\-version ++.RS 4 ++Prints release information\&. ++.RE ++.PP ++\-werror ++.RS 4 ++Terminates compilation when warnings occur\&. ++.RE ++.PP ++\-X ++.RS 4 ++Displays information about nonstandard options and exits\&. ++.RE ++.SS "Cross\-Compilation Options" ++.PP ++By default, classes are compiled against the bootstrap and extension classes of the platform that ++\fBjavac\fR ++shipped with\&. But ++\fBjavac\fR ++also supports cross\-compiling, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation\&. It is important to use the ++\fB\-bootclasspath\fR ++and ++\fB\-extdirs\fR ++options when cross\-compiling\&. ++.PP ++\-target \fIversion\fR ++.RS 4 ++Generates class files that target a specified release of the virtual machine\&. Class files will run on the specified target and on later releases, but not on earlier releases of the JVM\&. Valid targets are 1\&.1, 1\&.2, 1\&.3, 1\&.4, 1\&.5 (also 5), 1\&.6 (also 6), 1\&.7 (also 7), and 1\&.8 (also 8)\&. ++.sp ++The default for the ++\fB\-target\fR ++option depends on the value of the ++\fB\-source\fR ++option: ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is not specified, then the value of the ++\fB\-target\fR ++option is 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.2, then the value of the ++\fB\-target\fR ++option is 1\&.4 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.3, then the value of the ++\fB\-target\fR ++option is 1\&.4 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.5, then the value of the ++\fB\-target\fR ++option is 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.6, then the value of the ++\fB\-target\fR ++is option 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++If the ++\fB\-source\fR ++option is 1\&.7, then the value of the ++\fB\-target\fR ++is option 1\&.8 ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++For all other values of the ++\fB\-source\fR ++option, the value of the ++\fB\-target\fR ++option is the value of the ++\fB\-source\fR ++option\&. ++.RE ++.RE ++.PP ++\-bootclasspath \fIbootclasspath\fR ++.RS 4 ++Cross\-compiles against the specified set of boot classes\&. As with the user class path, boot class path entries are separated by colons (:) and can be directories, JAR archives, or ZIP archives\&. ++.RE ++.SS "Compact Profile Option" ++.PP ++Beginning with JDK 8, the ++\fBjavac\fR ++compiler supports compact profiles\&. With compact profiles, applications that do not require the entire Java platform can be deployed and run with a smaller footprint\&. The compact profiles feature could be used to shorten the download time for applications from app stores\&. This feature makes for more compact deployment of Java applications that bundle the JRE\&. This feature is also useful in small devices\&. ++.PP ++The supported profile values are ++\fBcompact1\fR, ++\fBcompact2\fR, and ++\fBcompact3\fR\&. These are additive layers\&. Each higher\-numbered compact profile contains all of the APIs in profiles with smaller number names\&. ++.PP ++\-profile ++.RS 4 ++When using compact profiles, this option specifies the profile name when compiling\&. For example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-profile compact1 Hello\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++javac does not compile source code that uses any Java SE APIs that is not in the specified profile\&. Here is an example of the error message that results from attempting to compile such source code: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBcd jdk1\&.8\&.0/bin\fR ++\fB\&./javac \-profile compact1 Paint\&.java\fR ++\fBPaint\&.java:5: error: Applet is not available in profile \*(Aqcompact1\*(Aq\fR ++\fBimport java\&.applet\&.Applet;\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++In this example, you can correct the error by modifying the source to not use the ++\fBApplet\fR ++class\&. You could also correct the error by compiling without the \-profile option\&. Then the compilation would be run against the full set of Java SE APIs\&. (None of the compact profiles include the ++\fBApplet\fR ++class\&.) ++.sp ++An alternative way to compile with compact profiles is to use the ++\fB\-bootclasspath\fR ++option to specify a path to an ++\fBrt\&.jar\fR ++file that specifies a profile\*(Aqs image\&. Using the ++\fB\-profile\fR ++option instead does not require a profile image to be present on the system at compile time\&. This is useful when cross\-compiling\&. ++.RE ++.SS "Nonstandard Options" ++.PP ++\-Xbootclasspath/p:\fIpath\fR ++.RS 4 ++Adds a suffix to the bootstrap class path\&. ++.RE ++.PP ++\-Xbootclasspath/a:\fIpath\fR ++.RS 4 ++Adds a prefix to the bootstrap class path\&. ++.RE ++.PP ++\-Xbootclasspath/:\fIpath\fR ++.RS 4 ++Overrides the location of the bootstrap class files\&. ++.RE ++.PP ++\-Xdoclint:[\-]\fIgroup\fR [\fI/access\fR] ++.RS 4 ++Enables or disables specific groups of checks, where ++\fIgroup\fR ++is one of the following values: ++\fBaccessibility\fR, ++\fBsyntax\fR, ++\fBreference\fR, ++\fBhtml\fR ++or ++\fBmissing\fR\&. For more information about these groups of checks see the ++\fB\-Xdoclint\fR ++option of the ++\fBjavadoc\fR ++command\&. The ++\fB\-Xdoclint\fR ++option is disabled by default in the ++\fBjavac\fR ++command\&. ++.sp ++The variable ++\fIaccess\fR ++specifies the minimum visibility level of classes and members that the ++\fB\-Xdoclint\fR ++option checks\&. It can have one of the following values (in order of most to least visible) : ++\fBpublic\fR, ++\fBprotected\fR, ++\fBpackage\fR ++and ++\fBprivate\fR\&. For example, the following option checks classes and members (with all groups of checks) that have the access level protected and higher (which includes protected, package and public): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xdoclint:all/protected\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following option enables all groups of checks for all access levels, except it will not check for HTML errors for classes and members that have access level package and higher (which includes package and public): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-Xdoclint:all,\-html/package\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\-Xdoclint:none ++.RS 4 ++Disables all groups of checks\&. ++.RE ++.PP ++\-Xdoclint:all[\fI/access\fR] ++.RS 4 ++Enables all groups of checks\&. ++.RE ++.PP ++\-Xlint ++.RS 4 ++Enables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. ++.RE ++.PP ++\-Xlint:all ++.RS 4 ++Enables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. ++.RE ++.PP ++\-Xlint:none ++.RS 4 ++Disables all warnings\&. ++.RE ++.PP ++\-Xlint:\fIname\fR ++.RS 4 ++Disables warning name\&. See Enable or Disable Warnings with the \-Xlint Option for a list of warnings you can disable with this option\&. ++.RE ++.PP ++\-Xlint:\fI\-name\fR ++.RS 4 ++Disables warning name\&. See Enable or Disable Warnings with the \-Xlint Option with the ++\fB\-Xlint\fR ++option to get a list of warnings that you can disable with this option\&. ++.RE ++.PP ++\-Xmaxerrs \fInumber\fR ++.RS 4 ++Sets the maximum number of errors to print\&. ++.RE ++.PP ++\-Xmaxwarns \fInumber\fR ++.RS 4 ++Sets the maximum number of warnings to print\&. ++.RE ++.PP ++\-Xstdout \fIfilename\fR ++.RS 4 ++Sends compiler messages to the named file\&. By default, compiler messages go to ++\fBSystem\&.err\fR\&. ++.RE ++.PP ++\-Xprefer:[\fInewer,source\fR] ++.RS 4 ++Specifies which file to read when both a source file and class file are found for a type\&. (See Searching for Types)\&. If the ++\fB\-Xprefer:newer\fR ++option is used, then it reads the newer of the source or class file for a type (default)\&. If the ++\fB\-Xprefer:source\fR ++option is used, then it reads the source file\&. Use \-\fBXprefer:source\fR ++when you want to be sure that any annotation processors can access annotations declared with a retention policy of ++\fBSOURCE\fR\&. ++.RE ++.PP ++\-Xpkginfo:[\fIalways\fR,\fIlegacy\fR,\fInonempty\fR] ++.RS 4 ++Control whether javac generates ++\fBpackage\-info\&.class\fR ++files from package\-info\&.java files\&. Possible mode arguments for this option include the following\&. ++.PP ++always ++.RS 4 ++Always generate a ++\fBpackage\-info\&.class\fR ++file for every ++\fBpackage\-info\&.java\fR ++file\&. This option may be useful if you use a build system such as Ant, which checks that each ++\fB\&.java\fR ++file has a corresponding ++\fB\&.class\fR ++file\&. ++.RE ++.PP ++legacy ++.RS 4 ++Generate a ++\fBpackage\-info\&.class\fR ++file only if package\-info\&.java contains annotations\&. Don\*(Aqt generate a ++\fBpackage\-info\&.class\fR ++file if package\-info\&.java only contains comments\&. ++.sp ++\fBNote:\fR ++A ++\fBpackage\-info\&.class\fR ++file might be generated but be empty if all the annotations in the package\-info\&.java file have ++\fBRetentionPolicy\&.SOURCE\fR\&. ++.RE ++.PP ++nonempty ++.RS 4 ++Generate a ++\fBpackage\-info\&.class\fR ++file only if package\-info\&.java contains annotations with ++\fBRetentionPolicy\&.CLASS\fR ++or ++\fBRetentionPolicy\&.RUNTIME\fR\&. ++.RE ++.RE ++.PP ++\-Xprint ++.RS 4 ++Prints a textual representation of specified types for debugging purposes\&. Perform neither annotation processing nor compilation\&. The format of the output could change\&. ++.RE ++.PP ++\-XprintProcessorInfo ++.RS 4 ++Prints information about which annotations a processor is asked to process\&. ++.RE ++.PP ++\-XprintRounds ++.RS 4 ++Prints information about initial and subsequent annotation processing rounds\&. ++.RE ++.SH "ENABLE OR DISABLE WARNINGS WITH THE -XLINT OPTION" ++.PP ++Enable warning ++\fIname\fR ++with the ++\fB\-Xlint:name\fR ++option, where ++\fBname\fR ++is one of the following warning names\&. Note that you can disable a warning with the ++\fB\-Xlint:\-name:\fR ++option\&. ++.PP ++cast ++.RS 4 ++Warns about unnecessary and redundant casts, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBString s = (String) "Hello!"\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++classfile ++.RS 4 ++Warns about issues related to class file contents\&. ++.RE ++.PP ++deprecation ++.RS 4 ++Warns about the use of deprecated items, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava\&.util\&.Date myDate = new java\&.util\&.Date();\fR ++\fBint currentDay = myDate\&.getDay();\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The method ++\fBjava\&.util\&.Date\&.getDay\fR ++has been deprecated since JDK 1\&.1 ++.RE ++.PP ++dep\-ann ++.RS 4 ++Warns about items that are documented with an ++\fB@deprecated\fR ++Javadoc comment, but do not have a ++\fB@Deprecated\fR ++annotation, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB/**\fR ++\fB * @deprecated As of Java SE 7, replaced by {@link #newMethod()}\fR ++\fB */\fR ++\fBpublic static void deprecatedMethood() { }\fR ++\fBpublic static void newMethod() { }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++divzero ++.RS 4 ++Warns about division by the constant integer 0, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBint divideByZero = 42 / 0;\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++empty ++.RS 4 ++Warns about empty statements after ++\fBif \fRstatements, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBclass E {\fR ++\fB void m() {\fR ++\fB if (true) ;\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++fallthrough ++.RS 4 ++Checks the switch blocks for fall\-through cases and provides a warning message for any that are found\&. Fall\-through cases are cases in a switch block, other than the last case in the block, whose code does not include a break statement, allowing code execution to fall through from that case to the next case\&. For example, the code following the case 1 label in this switch block does not end with a break statement: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBswitch (x) {\fR ++\fBcase 1:\fR ++\fB System\&.out\&.println("1");\fR ++\fB // No break statement here\&.\fR ++\fBcase 2:\fR ++\fB System\&.out\&.println("2");\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If the ++\fB\-Xlint:fallthrough\fR ++option was used when compiling this code, then the compiler emits a warning about possible fall\-through into case, with the line number of the case in question\&. ++.RE ++.PP ++finally ++.RS 4 ++Warns about ++\fBfinally\fR ++clauses that cannot complete normally, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic static int m() {\fR ++\fB try {\fR ++\fB throw new NullPointerException();\fR ++\fB } catch (NullPointerException(); {\fR ++\fB System\&.err\&.println("Caught NullPointerException\&.");\fR ++\fB return 1;\fR ++\fB } finally {\fR ++\fB return 0;\fR ++\fB }\fR ++\fB }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates a warning for the ++\fBfinally\fR ++block in this example\&. When the ++\fBint\fR ++method is called, it returns a value of 0\&. A ++\fBfinally\fR ++block executes when the ++\fBtry\fR ++block exits\&. In this example, when control is transferred to the ++\fBcatch\fR ++block, the ++\fBint\fR ++method exits\&. However, the ++\fBfinally\fR ++block must execute, so it is executed, even though control was transferred outside the method\&. ++.RE ++.PP ++options ++.RS 4 ++Warns about issues that related to the use of command\-line options\&. See Cross\-Compilation Options\&. ++.RE ++.PP ++overrides ++.RS 4 ++Warns about issues regarding method overrides\&. For example, consider the following two classes: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic class ClassWithVarargsMethod {\fR ++\fB void varargsMethod(String\&.\&.\&. s) { }\fR ++\fB}\fR ++ ++\fBpublic class ClassWithOverridingMethod extends ClassWithVarargsMethod {\fR ++\fB @Override\fR ++\fB void varargsMethod(String[] s) { }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates a warning similar to the following:\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [override] varargsMethod(String[]) in ClassWithOverridingMethod \fR ++\fBoverrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding\fR ++\fBmethod is missing \*(Aq\&.\&.\&.\*(Aq\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++When the compiler encounters a ++\fBvarargs\fR ++method, it translates the ++\fBvarargs\fR ++formal parameter into an array\&. In the method ++\fBClassWithVarargsMethod\&.varargsMethod\fR, the compiler translates the ++\fBvarargs\fR ++formal parameter ++\fBString\&.\&.\&. s\fR ++to the formal parameter ++\fBString[] s\fR, an array, which matches the formal parameter of the method ++\fBClassWithOverridingMethod\&.varargsMethod\fR\&. Consequently, this example compiles\&. ++.RE ++.PP ++path ++.RS 4 ++Warns about invalid path elements and nonexistent path directories on the command line (with regard to the class path, the source path, and other paths)\&. Such warnings cannot be suppressed with the ++\fB@SuppressWarnings\fR ++annotation, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-Xlint:path \-classpath /nonexistentpath Example\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++processing ++.RS 4 ++Warn about issues regarding annotation processing\&. The compiler generates this warning when you have a class that has an annotation, and you use an annotation processor that cannot handle that type of exception\&. For example, the following is a simple annotation processor: ++.sp ++\fBSource file AnnocProc\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBimport java\&.util\&.*;\fR ++\fBimport javax\&.annotation\&.processing\&.*;\fR ++\fBimport javax\&.lang\&.model\&.*;\fR ++\fBimport\&.javaz\&.lang\&.model\&.element\&.*;\fR ++ ++\fB@SupportedAnnotationTypes("NotAnno")\fR ++\fBpublic class AnnoProc extends AbstractProcessor {\fR ++\fB public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv){\fR ++\fB return true;\fR ++\fB }\fR ++ ++\fB public SourceVersion getSupportedSourceVersion() {\fR ++\fB return SourceVersion\&.latest();\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fBSource file AnnosWithoutProcessors\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB@interface Anno { }\fR ++\fB \fR ++\fB@Anno\fR ++\fBclass AnnosWithoutProcessors { }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following commands compile the annotation processor ++\fBAnnoProc\fR, then run this annotation processor against the source file ++\fBAnnosWithoutProcessors\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac AnnoProc\&.java\fR ++\fBjavac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++When the compiler runs the annotation processor against the source file ++\fBAnnosWithoutProcessors\&.java\fR, it generates the following warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [processing] No processor claimed any of these annotations: Anno\fR ++\fB \fR ++.fi ++.if n \{\ ++.RE ++.\} ++To resolve this issue, you can rename the annotation defined and used in the class ++\fBAnnosWithoutProcessors\fR ++from ++\fBAnno\fR ++to ++\fBNotAnno\fR\&. ++.RE ++.PP ++rawtypes ++.RS 4 ++Warns about unchecked operations on raw types\&. The following statement generates a ++\fBrawtypes\fR ++warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBvoid countElements(List l) { \&.\&.\&. }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The following example does not generate a ++\fBrawtypes\fR ++warning ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBvoid countElements(List<?> l) { \&.\&.\&. }\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fBList\fR ++is a raw type\&. However, ++\fBList<?>\fR ++is an unbounded wildcard parameterized type\&. Because ++\fBList\fR ++is a parameterized interface, always specify its type argument\&. In this example, the ++\fBList\fR ++formal argument is specified with an unbounded wildcard (\fB?\fR) as its formal type parameter, which means that the ++\fBcountElements\fR ++method can accept any instantiation of the ++\fBList\fR ++interface\&. ++.RE ++.PP ++Serial ++.RS 4 ++Warns about missing ++\fBserialVersionUID\fR ++definitions on serializable classes, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic class PersistentTime implements Serializable\fR ++\fB{\fR ++\fB private Date time;\fR ++\fB \fR ++\fB public PersistentTime() {\fR ++\fB time = Calendar\&.getInstance()\&.getTime();\fR ++\fB }\fR ++\fB \fR ++\fB public Date getTime() {\fR ++\fB return time;\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates the following warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [serial] serializable class PersistentTime has no definition of\fR ++\fBserialVersionUID\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If a serializable class does not explicitly declare a field named ++\fBserialVersionUID\fR, then the serialization runtime environment calculates a default ++\fBserialVersionUID\fR ++value for that class based on various aspects of the class, as described in the Java Object Serialization Specification\&. However, it is strongly recommended that all serializable classes explicitly declare ++\fBserialVersionUID\fR ++values because the default process of computing ++\fBserialVersionUID\fR ++vales is highly sensitive to class details that can vary depending on compiler implementations, and as a result, might cause an unexpected ++\fBInvalidClassExceptions\fR ++during deserialization\&. To guarantee a consistent ++\fBserialVersionUID\fR ++value across different Java compiler implementations, a serializable class must declare an explicit ++\fBserialVersionUID\fR ++value\&. ++.RE ++.PP ++static ++.RS 4 ++Warns about issues relating to the use of statics, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBclass XLintStatic {\fR ++\fB static void m1() { }\fR ++\fB void m2() { this\&.m1(); }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The compiler generates the following warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [static] static method should be qualified by type name, \fR ++\fBXLintStatic, instead of by an expression\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++To resolve this issue, you can call the ++\fBstatic\fR ++method ++\fBm1\fR ++as follows: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBXLintStatic\&.m1();\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Alternately, you can remove the ++\fBstatic\fR ++keyword from the declaration of the method ++\fBm1\fR\&. ++.RE ++.PP ++try ++.RS 4 ++Warns about issues relating to use of ++\fBtry\fR ++blocks, including try\-with\-resources statements\&. For example, a warning is generated for the following statement because the resource ++\fBac\fR ++declared in the ++\fBtry\fR ++block is not used: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBtry ( AutoCloseable ac = getResource() ) { // do nothing}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++unchecked ++.RS 4 ++Gives more detail for unchecked conversion warnings that are mandated by the Java Language Specification, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBList l = new ArrayList<Number>();\fR ++\fBList<String> ls = l; // unchecked warning\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++During type erasure, the types ++\fBArrayList<Number>\fR ++and ++\fBList<String>\fR ++become ++\fBArrayList\fR ++and ++\fBList\fR, respectively\&. ++.sp ++The ++\fBls\fR ++command has the parameterized type ++\fBList<String>\fR\&. When the ++\fBList\fR ++referenced by ++\fBl\fR ++is assigned to ++\fBls\fR, the compiler generates an unchecked warning\&. At compile time, the compiler and JVM cannot determine whether ++\fBl\fR ++refers to a ++\fBList<String>\fR ++type\&. In this case, ++\fBl\fR ++does not refer to a ++\fBList<String>\fR ++type\&. As a result, heap pollution occurs\&. ++.sp ++A heap pollution situation occurs when the ++\fBList\fR ++object ++\fBl\fR, whose static type is ++\fBList<Number>\fR, is assigned to another ++\fBList\fR ++object, ++\fBls\fR, that has a different static type, ++\fBList<String>\fR\&. However, the compiler still allows this assignment\&. It must allow this assignment to preserve backward compatibility with releases of Java SE that do not support generics\&. Because of type erasure, ++\fBList<Number>\fR ++and ++\fBList<String>\fR ++both become ++\fBList\fR\&. Consequently, the compiler allows the assignment of the object ++\fBl\fR\fB,\fR ++which has a raw type of ++\fBList\fR, to the object ++\fBls\fR\&. ++.RE ++.PP ++varargs ++.RS 4 ++Warns about unsafe usages of variable arguments (\fBvarargs\fR) methods, in particular, those that contain non\-reifiable arguments, for example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic class ArrayBuilder {\fR ++\fB public static <T> void addToList (List<T> listArg, T\&.\&.\&. elements) {\fR ++\fB for (T x : elements) {\fR ++\fB listArg\&.add(x);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++\fBNote:\fR ++A non\-reifiable type is a type whose type information is not fully available at runtime\&. ++.sp ++The compiler generates the following warning for the definition of the method ++\fBArrayBuilder\&.addToList\fR ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBwarning: [varargs] Possible heap pollution from parameterized vararg type T\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++When the compiler encounters a varargs method, it translates the ++\fBvarargs\fR ++formal parameter into an array\&. However, the Java programming language does not permit the creation of arrays of parameterized types\&. In the method ++\fBArrayBuilder\&.addToList\fR, the compiler translates the ++\fBvarargs\fR ++formal parameter ++\fBT\&.\&.\&.\fR ++elements to the formal parameter ++\fBT[]\fR ++elements, an array\&. However, because of type erasure, the compiler converts the ++\fBvarargs\fR ++formal parameter to ++\fBObject[]\fR ++elements\&. Consequently, there is a possibility of heap pollution\&. ++.RE ++.SH "COMMAND-LINE ARGUMENT FILES" ++.PP ++To shorten or simplify the ++\fBjavac\fR ++command, you can specify one or more files that contain arguments to the ++\fBjavac\fR ++command (except ++\fB\-J\fR ++options)\&. This enables you to create ++\fBjavac\fR ++commands of any length on any operating system\&. ++.PP ++An argument file can include ++\fBjavac\fR ++options and source file names in any combination\&. The arguments within a file can be separated by spaces or new line characters\&. If a file name contains embedded spaces, then put the whole file name in double quotation marks\&. ++.PP ++File Names within an argument file are relative to the current directory, not the location of the argument file\&. Wild cards (*) are not allowed in these lists (such as for specifying ++\fB*\&.java\fR)\&. Use of the at sign (@) to recursively interpret files is not supported\&. The ++\fB\-J\fR ++options are not supported because they are passed to the launcher, which does not support argument files\&. ++.PP ++When executing the ++\fBjavac\fR ++command, pass in the path and name of each argument file with the at sign (@) leading character\&. When the ++\fBjavac\fR ++command encounters an argument beginning with the at sign (@), it expands the contents of that file into the argument list\&. ++.PP ++\fBExample 1\fR + .br +-Specifies options to pass to annotation processors\&. These options are not interpreted by \f3javac\fR directly, but are made available for use by individual processors\&. The \f3key\fR value should be one or more identifiers separated by a dot (\&.)\&. +-.TP +--cp \fIpath\fR or -classpath \fIpath\fR ++Single Argument File ++.RS 4 ++You could use a single argument file named ++\fBargfile\fR ++to hold all ++\fBjavac\fR ++arguments: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac @argfile\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++This argument file could contain the contents of both files shown in Example 2 ++.RE ++.PP ++\fBExample 2\fR + .br +-Specifies where to find user class files, and (optionally) annotation processors and source files\&. This class path overrides the user class path in the \f3CLASSPATH\fR environment variable\&. If neither \f3CLASSPATH\fR, \f3-cp\fR nor \f3-classpath\fR is specified, then the user \fIclass path\fR is the current directory\&. See Setting the Class Path\&. +- +-If the \f3-sourcepath\fR option is not specified, then the user class path is also searched for source files\&. +- +-If the \f3-processorpath\fR option is not specified, then the class path is also searched for annotation processors\&. +-.TP +--Djava\&.ext\&.dirs=\fIdirectories\fR ++Two Argument Files ++.RS 4 ++You can create two argument files: one for the ++\fBjavac\fR ++options and the other for the source file names\&. Note that the following lists have no line\-continuation characters\&. ++.sp ++Create a file named options that contains the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-d classes\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-g\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB\-sourcepath /java/pubs/ws/1\&.3/src/share/classes\fR ++.fi ++.if n \{\ ++.RE ++.\} ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Create a file named classes that contains the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBMyClass1\&.java\fR ++\fBMyClass2\&.java\fR ++\fBMyClass3\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Then, run the ++\fBjavac\fR ++command as follows: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac @options @classes\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.PP ++\fBExample 3\fR + .br +-Overrides the location of installed extensions\&. +-.TP +--Djava\&.endorsed\&.dirs=\fIdirectories\fR +-.br +-Overrides the location of the endorsed standards path\&. +-.TP +--d \fIdirectory\fR +-.br +-Sets the destination directory for class files\&. The directory must already exist because \f3javac\fR does not create it\&. If a class is part of a package, then \f3javac\fR puts the class file in a subdirectory that reflects the package name and creates directories as needed\&. +- +-If you specify \f3-d\fR\f3/home/myclasses\fR and the class is called \f3com\&.mypackage\&.MyClass\fR, then the class file is \f3/home/myclasses/com/mypackage/MyClass\&.class\fR\&. +- +-If the \fI-d\fR option is not specified, then \f3javac\fR puts each class file in the same directory as the source file from which it was generated\&. +- +-\fINote:\fR The directory specified by the \fI-d\fR option is not automatically added to your user class path\&. +-.TP +--deprecation +-.br +-Shows a description of each use or override of a deprecated member or class\&. Without the \f3-deprecation\fR option, \f3javac\fR shows a summary of the source files that use or override deprecated members or classes\&. The \f3-deprecation\fR option is shorthand for \f3-Xlint:deprecation\fR\&. +-.TP +--encoding \fIencoding\fR +-.br +-Sets the source file encoding name, such as EUC-JP and UTF-8\&. If the \f3-encoding\fR option is not specified, then the platform default converter is used\&. +-.TP +--endorseddirs \fIdirectories\fR +-.br +-Overrides the location of the endorsed standards path\&. +-.TP +--extdirs \fIdirectories\fR +-.br +-Overrides the location of the \f3ext\fR directory\&. The directories variable is a colon-separated list of directories\&. Each JAR file in the specified directories is searched for class files\&. All JAR files found become part of the class path\&. +- +-If you are cross-compiling (compiling classes against bootstrap and extension classes of a different Java platform implementation), then this option specifies the directories that contain the extension classes\&. See Cross-Compilation Options for more information\&. +-.TP +--g +-.br +-Generates all debugging information, including local variables\&. By default, only line number and source file information is generated\&. +-.TP +--g:none +-.br +-Does not generate any debugging information\&. +-.TP +--g:[\fIkeyword list\fR] +-.br +-Generates only some kinds of debugging information, specified by a comma separated list of keywords\&. Valid keywords are: +-.RS +-.TP +-source +-Source file debugging information\&. +-.TP +-lines +-Line number debugging information\&. +-.TP +-vars +-Local variable debugging information\&. +-.RE +- +-.TP +--help +-.br +-Prints a synopsis of standard options\&. +-.TP +--implicit:[\fIclass, none\fR] +-.br +-Controls the generation of class files for implicitly loaded source files\&. To automatically generate class files, use \f3-implicit:class\fR\&. To suppress class file generation, use \f3-implicit:none\fR\&. If this option is not specified, then the default is to automatically generate class files\&. In this case, the compiler issues a warning if any such class files are generated when also doing annotation processing\&. The warning is not issued when the \f3-implicit\fR option is set explicitly\&. See Searching for Types\&. +-.TP +--J\fIoption\fR +-.br +-Passes \f3option\fR to the Java Virtual Machine (JVM), where option is one of the options described on the reference page for the Java launcher\&. For example, \f3-J-Xms48m\fR sets the startup memory to 48 MB\&. See java(1)\&. +- +-\fINote:\fR The \fICLASSPATH\fR, \f3-classpath\fR, \f3-bootclasspath\fR, and \f3-extdirs\fR options do not specify the classes used to run \f3javac\fR\&. Trying to customize the compiler implementation with these options and variables is risky and often does not accomplish what you want\&. If you must customize the complier implementation, then use the \f3-J\fR option to pass options through to the underlying \f3\fRJava launcher\&. +-.TP +--nowarn +-.br +-Disables warning messages\&. This option operates the same as the \f3-Xlint:none\fR option\&. +-.TP +--parameters +-.br +-Stores formal parameter names of constructors and methods in the generated class file so that the method \f3java\&.lang\&.reflect\&.Executable\&.getParameters\fR from the Reflection API can retrieve them\&. +-.TP +--proc: [\fInone\fR, \fIonly\fR] +-.br +-Controls whether annotation processing and compilation are done\&. \f3-proc:none\fR means that compilation takes place without annotation processing\&. \f3-proc:only\fR means that only annotation processing is done, without any subsequent compilation\&. +-.TP +--processor \fIclass1\fR [,\fIclass2\fR,\fIclass3\fR\&.\&.\&.] +-.br +-Names of the annotation processors to run\&. This bypasses the default discovery process\&. +-.TP +--processorpath \fIpath\fR +-.br +-Specifies where to find annotation processors\&. If this option is not used, then the class path is searched for processors\&. +-.TP +--s \fIdir\fR +-.br +-Specifies the directory where to place the generated source files\&. The directory must already exist because \f3javac\fR does not create it\&. If a class is part of a package, then the compiler puts the source file in a subdirectory that reflects the package name and creates directories as needed\&. +- +-If you specify \f3-s /home/mysrc\fR and the class is called \f3com\&.mypackage\&.MyClass\fR, then the source file is put in \f3/home/mysrc/com/mypackage/MyClass\&.java\fR\&. +-.TP +--source \fIrelease\fR +-.br +-Specifies the version of source code accepted\&. The following values for \f3release\fR are allowed: +-.RS +-.TP +-1\&.3 +-The compiler does not support assertions, generics, or other language features introduced after Java SE 1\&.3\&. +-.TP +-1\&.4 +-The compiler accepts code containing assertions, which were introduced in Java SE 1\&.4\&. +-.TP +-1\&.5 +-The compiler accepts code containing generics and other language features introduced in Java SE 5\&. +-.TP +-5 +-Synonym for 1\&.5\&. +-.TP +-1\&.6 +-No language changes were introduced in Java SE 6\&. However, encoding errors in source files are now reported as errors instead of warnings as in earlier releases of Java Platform, Standard Edition\&. +-.TP +-6 +-Synonym for 1\&.6\&. +-.TP +-1\&.7 +-This is the default value\&. The compiler accepts code with features introduced in Java SE 7\&. +-.TP +-7 +-Synonym for 1\&.7\&. +-.RE +- +-.TP +--sourcepath \fIsourcepath\fR +-.br +-Specifies the source code path to search for class or interface definitions\&. As with the user class path, source path entries are separated by colons (:) on Oracle Solaris and semicolons on Windows and can be directories, JAR archives, or ZIP archives\&. If packages are used, then the local path name within the directory or archive must reflect the package name\&. +- +-\fINote:\fR Classes found through the class path might be recompiled when their source files are also found\&. See Searching for Types\&. +-.TP +--verbose +-.br +-Uses verbose output, which includes information about each class loaded and each source file compiled\&. +-.TP +--version +-.br +-Prints release information\&. +-.TP +--werror +-.br +-Terminates compilation when warnings occur\&. +-.TP +--X +-.br +-Displays information about nonstandard options and exits\&. +-.SS CROSS-COMPILATION\ OPTIONS +-By default, classes are compiled against the bootstrap and extension classes of the platform that \f3javac\fR shipped with\&. But \f3javac\fR also supports cross-compiling, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation\&. It is important to use the \f3-bootclasspath\fR and \f3-extdirs\fR options when cross-compiling\&. +-.TP +--target \fIversion\fR +-.br +-Generates class files that target a specified release of the virtual machine\&. Class files will run on the specified target and on later releases, but not on earlier releases of the JVM\&. Valid targets are 1\&.1, 1\&.2, 1\&.3, 1\&.4, 1\&.5 (also 5), 1\&.6 (also 6), and 1\&.7 (also 7)\&. +- +-The default for the \f3-target\fR option depends on the value of the \f3-source\fR option: +-.RS +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is not specified, then the value of the \f3-target\fR option is 1\&.7 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.2, then the value of the \f3-target\fR option is 1\&.4 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.3, then the value of the \f3-target\fR option is 1\&.4 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.5, then the value of the \f3-target\fR option is 1\&.7 +-.TP 0.2i +-\(bu +-If the \f3-source\fR option is 1\&.6, then the value of the \f3-target\fR is option 1\&.7 +-.TP 0.2i +-\(bu +-For all other values of the \f3-source\fR option, the value of the \f3-target\fR option is the value of the \f3-source\fR option\&. +-.RE +- +-.TP +--bootclasspath \fIbootclasspath\fR +-.br +-Cross-compiles against the specified set of boot classes\&. As with the user class path, boot class path entries are separated by colons (:) and can be directories, JAR archives, or ZIP archives\&. +-.SS COMPACT\ PROFILE\ OPTION +-Beginning with JDK 8, the \f3javac\fR compiler supports compact profiles\&. With compact profiles, applications that do not require the entire Java platform can be deployed and run with a smaller footprint\&. The compact profiles feature could be used to shorten the download time for applications from app stores\&. This feature makes for more compact deployment of Java applications that bundle the JRE\&. This feature is also useful in small devices\&. ++Argument Files with Paths ++.RS 4 ++The argument files can have paths, but any file names inside the files are relative to the current working directory (not ++\fBpath1\fR ++or ++\fBpath2\fR): ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac @path1/options @path2/classes\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.SH "ANNOTATION PROCESSING" + .PP +-The supported profile values are \f3compact1\fR, \f3compact2\fR, and \f3compact3\fR\&. These are additive layers\&. Each higher-numbered compact profile contains all of the APIs in profiles with smaller number names\&. +-.TP +--profile +-.br +-When using compact profiles, this option specifies the profile name when compiling\&. For example: +-.sp +-.nf +-\f3javac \-profile compact1 Hello\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-javac does not compile source code that uses any Java SE APIs that is not in the specified profile\&. Here is an example of the error message that results from attempting to compile such source code: +-.sp +-.nf +-\f3cd jdk1\&.8\&.0/bin\fP +-.fi +-.nf +-\f3\&./javac \-profile compact1 Paint\&.java\fP +-.fi +-.nf +-\f3Paint\&.java:5: error: Applet is not available in profile \&'compact1\&'\fP +-.fi +-.nf +-\f3import java\&.applet\&.Applet;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-In this example, you can correct the error by modifying the source to not use the \f3Applet\fR class\&. You could also correct the error by compiling without the -profile option\&. Then the compilation would be run against the full set of Java SE APIs\&. (None of the compact profiles include the \f3Applet\fR class\&.) +- +-An alternative way to compile with compact profiles is to use the \f3-bootclasspath\fR option to specify a path to an \f3rt\&.jar\fR file that specifies a profile\&'s image\&. Using the \f3-profile\fR option instead does not require a profile image to be present on the system at compile time\&. This is useful when cross-compiling\&. +-.SS NONSTANDARD\ OPTIONS +-.TP +--Xbootclasspath/p:\fIpath\fR +-.br +-Adds a suffix to the bootstrap class path\&. +-.TP +--Xbootclasspath/a:\fIpath\fR +-.br +-Adds a prefix to the bootstrap class path\&. +-.TP +--Xbootclasspath/:\fIpath\fR +-.br +-Overrides the location of the bootstrap class files\&. +-.TP +--Xdoclint:[-]\fIgroup\fR [\fI/access\fR] +-.br +-Enables or disables specific groups of checks, where \fIgroup\fR is one of the following values: \f3accessibility\fR, \f3syntax\fR, \f3reference\fR, \f3html\fR or \f3missing\fR\&. For more information about these groups of checks see the \f3-Xdoclint\fR option of the \f3javadoc\fR command\&. The \f3-Xdoclint\fR option is disabled by default in the \f3javac\fR command\&. +- +-The variable \fIaccess\fR specifies the minimum visibility level of classes and members that the \f3-Xdoclint\fR option checks\&. It can have one of the following values (in order of most to least visible) : \f3public\fR, \f3protected\fR, \f3package\fR and \f3private\fR\&. For example, the following option checks classes and members (with all groups of checks) that have the access level protected and higher (which includes protected, package and public): +-.sp +-.nf +-\f3\-Xdoclint:all/protected\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following option enables all groups of checks for all access levels, except it will not check for HTML errors for classes and members that have access level package and higher (which includes package and public): +-.sp +-.nf +-\f3\-Xdoclint:all,\-html/package\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +--Xdoclint:none +-.br +-Disables all groups of checks\&. +-.TP +--Xdoclint:all[\fI/access\fR] +-.br +-Enables all groups of checks\&. +-.TP +--Xlint +-.br +-\fI\fREnables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. +-.TP +--Xlint:all +-.br +-\fI\fREnables all recommended warnings\&. In this release, enabling all available warnings is recommended\&. +-.TP +--Xlint:none +-.br +-Disables all warnings\&. +-.TP +--Xlint:\fIname\fR +-.br +-Disables warning name\&. See Enable or Disable Warnings with the -Xlint Option for a list of warnings you can disable with this option\&. +-.TP +--Xlint:\fI-name\fR +-.br +-Disables warning name\&. See Enable or Disable Warnings with the -Xlint Option with the \f3-Xlint\fR option to get a list of warnings that you can disable with this option\&. +-.TP +--Xmaxerrs \fInumber\fR +-.br +-Sets the maximum number of errors to print\&. +-.TP +--Xmaxwarns \fInumber\fR +-.br +-Sets the maximum number of warnings to print\&. +-.TP +--Xstdout \fIfilename\fR +-.br +-Sends compiler messages to the named file\&. By default, compiler messages go to \f3System\&.err\fR\&. +-.TP +--Xprefer:[\fInewer,source\fR] +-.br +-Specifies which file to read when both a source file and class file are found for a type\&. (See Searching for Types)\&. If the \f3-Xprefer:newer\fR option is used, then it reads the newer of the source or class file for a type (default)\&. If the \f3-Xprefer:source\fR option is used, then it reads the source file\&. Use -\f3Xprefer:source\fR when you want to be sure that any annotation processors can access annotations declared with a retention policy of \f3SOURCE\fR\&. +-.TP +--Xpkginfo:[\fIalways\fR,\fIlegacy\fR,\fInonempty\fR] +-.br +-Control whether javac generates \f3package-info\&.class\fR files from package-info\&.java files\&. Possible mode arguments for this option include the following\&. +-.RS +-.TP +-always +-Always generate a \f3package-info\&.class\fR file for every \f3package-info\&.java\fR file\&. This option may be useful if you use a build system such as Ant, which checks that each \f3\&.java\fR file has a corresponding \f3\&.class\fR file\&. +-.TP +-legacy +-Generate a \f3package-info\&.class\fR file only if package-info\&.java contains annotations\&. Don\&'t generate a \f3package-info\&.class\fR file if package-info\&.java only contains comments\&. +- +-\fINote:\fR A \f3package-info\&.class\fR file might be generated but be empty if all the annotations in the package-info\&.java file have \f3RetentionPolicy\&.SOURCE\fR\&. +-.TP +-nonempty +-Generate a \f3package-info\&.class\fR file only if package-info\&.java contains annotations with \f3RetentionPolicy\&.CLASS\fR or \f3RetentionPolicy\&.RUNTIME\fR\&. +-.RE +- +-.TP +--Xprint +-.br +-Prints a textual representation of specified types for debugging purposes\&. Perform neither annotation processing nor compilation\&. The format of the output could change\&. +-.TP +--XprintProcessorInfo +-.br +-Prints information about which annotations a processor is asked to process\&. +-.TP +--XprintRounds +-.br +-Prints information about initial and subsequent annotation processing rounds\&. +-.SH ENABLE\ OR\ DISABLE\ WARNINGS\ WITH\ THE\ -XLINT\ OPTION +-Enable warning \fIname\fR with the \f3-Xlint:name\fR option, where \f3name\fR is one of the following warning names\&. Note that you can disable a warning with the \f3-Xlint:-name:\fR option\&. +-.TP +-cast +-Warns about unnecessary and redundant casts, for example: +-.sp +-.nf +-\f3String s = (String) "Hello!"\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-classfile +-Warns about issues related to class file contents\&. +-.TP +-deprecation +-Warns about the use of deprecated items, for example: +-.sp +-.nf +-\f3java\&.util\&.Date myDate = new java\&.util\&.Date();\fP +-.fi +-.nf +-\f3int currentDay = myDate\&.getDay();\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The method \f3java\&.util\&.Date\&.getDay\fR has been deprecated since JDK 1\&.1 +-.TP +-dep-ann +-Warns about items that are documented with an \f3@deprecated\fR Javadoc comment, but do not have a \f3@Deprecated\fR annotation, for example: +-.sp +-.nf +-\f3/**\fP +-.fi +-.nf +-\f3 * @deprecated As of Java SE 7, replaced by {@link #newMethod()}\fP +-.fi +-.nf +-\f3 */\fP +-.fi +-.nf +-\f3public static void deprecatedMethood() { }\fP +-.fi +-.nf +-\f3public static void newMethod() { }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-divzero +-Warns about division by the constant integer 0, for example: +-.sp +-.nf +-\f3int divideByZero = 42 / 0;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-empty +-Warns about empty statements after \f3if\fRstatements, for example: +-.sp +-.nf +-\f3class E {\fP +-.fi +-.nf +-\f3 void m() {\fP +-.fi +-.nf +-\f3 if (true) ;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-fallthrough +-Checks the switch blocks for fall-through cases and provides a warning message for any that are found\&. Fall-through cases are cases in a switch block, other than the last case in the block, whose code does not include a break statement, allowing code execution to fall through from that case to the next case\&. For example, the code following the case 1 label in this switch block does not end with a break statement: +-.sp +-.nf +-\f3switch (x) {\fP +-.fi +-.nf +-\f3case 1:\fP +-.fi +-.nf +-\f3 System\&.out\&.println("1");\fP +-.fi +-.nf +-\f3 // No break statement here\&.\fP +-.fi +-.nf +-\f3case 2:\fP +-.fi +-.nf +-\f3 System\&.out\&.println("2");\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If the \f3-Xlint:fallthrough\fR option was used when compiling this code, then the compiler emits a warning about possible fall-through into case, with the line number of the case in question\&. +-.TP +-finally +-Warns about \f3finally\fR clauses that cannot complete normally, for example: +-.sp +-.nf +-\f3public static int m() {\fP +-.fi +-.nf +-\f3 try {\fP +-.fi +-.nf +-\f3 throw new NullPointerException();\fP +-.fi +-.nf +-\f3 } catch (NullPointerException(); {\fP +-.fi +-.nf +-\f3 System\&.err\&.println("Caught NullPointerException\&.");\fP +-.fi +-.nf +-\f3 return 1;\fP +-.fi +-.nf +-\f3 } finally {\fP +-.fi +-.nf +-\f3 return 0;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates a warning for the \f3finally\fR block in this example\&. When the \f3int\fR method is called, it returns a value of 0\&. A \f3finally\fR block executes when the \f3try\fR block exits\&. In this example, when control is transferred to the \f3catch\fR block, the \f3int\fR method exits\&. However, the \f3finally\fR block must execute, so it is executed, even though control was transferred outside the method\&. +-.TP +-options +-Warns about issues that related to the use of command-line options\&. See Cross-Compilation Options\&. +-.TP +-overrides +-Warns about issues regarding method overrides\&. For example, consider the following two classes: +-.sp +-.nf +-\f3public class ClassWithVarargsMethod {\fP +-.fi +-.nf +-\f3 void varargsMethod(String\&.\&.\&. s) { }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3public class ClassWithOverridingMethod extends ClassWithVarargsMethod {\fP +-.fi +-.nf +-\f3 @Override\fP +-.fi +-.nf +-\f3 void varargsMethod(String[] s) { }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates a warning similar to the following:\&. +-.sp +-.nf +-\f3warning: [override] varargsMethod(String[]) in ClassWithOverridingMethod \fP +-.fi +-.nf +-\f3overrides varargsMethod(String\&.\&.\&.) in ClassWithVarargsMethod; overriding\fP +-.fi +-.nf +-\f3method is missing \&'\&.\&.\&.\&'\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-When the compiler encounters a \f3varargs\fR method, it translates the \f3varargs\fR formal parameter into an array\&. In the method \f3ClassWithVarargsMethod\&.varargsMethod\fR, the compiler translates the \f3varargs\fR formal parameter \f3String\&.\&.\&. s\fR to the formal parameter \f3String[] s\fR, an array, which matches the formal parameter of the method \f3ClassWithOverridingMethod\&.varargsMethod\fR\&. Consequently, this example compiles\&. +-.TP +-path +-Warns about invalid path elements and nonexistent path directories on the command line (with regard to the class path, the source path, and other paths)\&. Such warnings cannot be suppressed with the \f3@SuppressWarnings\fR annotation, for example: +-.sp +-.nf +-\f3javac \-Xlint:path \-classpath /nonexistentpath Example\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-processing +-Warn about issues regarding annotation processing\&. The compiler generates this warning when you have a class that has an annotation, and you use an annotation processor that cannot handle that type of exception\&. For example, the following is a simple annotation processor: +- +-\fISource file AnnocProc\&.java\fR: +-.sp +-.nf +-\f3import java\&.util\&.*;\fP +-.fi +-.nf +-\f3import javax\&.annotation\&.processing\&.*;\fP +-.fi +-.nf +-\f3import javax\&.lang\&.model\&.*;\fP +-.fi +-.nf +-\f3import\&.javaz\&.lang\&.model\&.element\&.*;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3@SupportedAnnotationTypes("NotAnno")\fP +-.fi +-.nf +-\f3public class AnnoProc extends AbstractProcessor {\fP +-.fi +-.nf +-\f3 public boolean process(Set<? extends TypeElement> elems, RoundEnvironment renv){\fP +-.fi +-.nf +-\f3 return true;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public SourceVersion getSupportedSourceVersion() {\fP +-.fi +-.nf +-\f3 return SourceVersion\&.latest();\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\fISource file AnnosWithoutProcessors\&.java\fR: +-.sp +-.nf +-\f3@interface Anno { }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3@Anno\fP +-.fi +-.nf +-\f3class AnnosWithoutProcessors { }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following commands compile the annotation processor \f3AnnoProc\fR, then run this annotation processor against the source file \f3AnnosWithoutProcessors\&.java\fR: +-.sp +-.nf +-\f3javac AnnoProc\&.java\fP +-.fi +-.nf +-\f3javac \-cp \&. \-Xlint:processing \-processor AnnoProc \-proc:only AnnosWithoutProcessors\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-When the compiler runs the annotation processor against the source file \f3AnnosWithoutProcessors\&.java\fR, it generates the following warning: +-.sp +-.nf +-\f3warning: [processing] No processor claimed any of these annotations: Anno\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-To resolve this issue, you can rename the annotation defined and used in the class \f3AnnosWithoutProcessors\fR from \f3Anno\fR to \f3NotAnno\fR\&. +-.TP +-rawtypes +-Warns about unchecked operations on raw types\&. The following statement generates a \f3rawtypes\fR warning: +-.sp +-.nf +-\f3void countElements(List l) { \&.\&.\&. }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The following example does not generate a \f3rawtypes\fR warning +-.sp +-.nf +-\f3void countElements(List<?> l) { \&.\&.\&. }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\f3List\fR is a raw type\&. However, \f3List<?>\fR is an unbounded wildcard parameterized type\&. Because \f3List\fR is a parameterized interface, always specify its type argument\&. In this example, the \f3List\fR formal argument is specified with an unbounded wildcard (\f3?\fR) as its formal type parameter, which means that the \f3countElements\fR method can accept any instantiation of the \f3List\fR interface\&. +-.TP +-Serial +-Warns about missing \f3serialVersionUID\fR definitions on serializable classes, for example: +-.sp +-.nf +-\f3public class PersistentTime implements Serializable\fP +-.fi +-.nf +-\f3{\fP +-.fi +-.nf +-\f3 private Date time;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public PersistentTime() {\fP +-.fi +-.nf +-\f3 time = Calendar\&.getInstance()\&.getTime();\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public Date getTime() {\fP +-.fi +-.nf +-\f3 return time;\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates the following warning: +-.sp +-.nf +-\f3warning: [serial] serializable class PersistentTime has no definition of\fP +-.fi +-.nf +-\f3serialVersionUID\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-If a serializable class does not explicitly declare a field named \f3serialVersionUID\fR, then the serialization runtime environment calculates a default \f3serialVersionUID\fR value for that class based on various aspects of the class, as described in the Java Object Serialization Specification\&. However, it is strongly recommended that all serializable classes explicitly declare \f3serialVersionUID\fR values because the default process of computing \f3serialVersionUID\fR vales is highly sensitive to class details that can vary depending on compiler implementations, and as a result, might cause an unexpected \f3InvalidClassExceptions\fR during deserialization\&. To guarantee a consistent \f3serialVersionUID\fR value across different Java compiler implementations, a serializable class must declare an explicit \f3serialVersionUID\fR value\&. +-.TP +-static +-Warns about issues relating to the use of statics, for example: +-.sp +-.nf +-\f3class XLintStatic {\fP +-.fi +-.nf +-\f3 static void m1() { }\fP +-.fi +-.nf +-\f3 void m2() { this\&.m1(); }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-The compiler generates the following warning: +-.sp +-.nf +-\f3warning: [static] static method should be qualified by type name, \fP +-.fi +-.nf +-\f3XLintStatic, instead of by an expression\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-To resolve this issue, you can call the \f3static\fR method \f3m1\fR as follows: +-.sp +-.nf +-\f3XLintStatic\&.m1();\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-Alternately, you can remove the \f3static\fR keyword from the declaration of the method \f3m1\fR\&. +-.TP +-try +-Warns about issues relating to use of \f3try\fR blocks, including try-with-resources statements\&. For example, a warning is generated for the following statement because the resource \f3ac\fR declared in the \f3try\fR block is not used: +-.sp +-.nf +-\f3try ( AutoCloseable ac = getResource() ) { // do nothing}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +-.TP +-unchecked +-Gives more detail for unchecked conversion warnings that are mandated by the Java Language Specification, for example: +-.sp +-.nf +-\f3List l = new ArrayList<Number>();\fP +-.fi +-.nf +-\f3List<String> ls = l; // unchecked warning\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-During type erasure, the types \f3ArrayList<Number>\fR and \f3List<String>\fR become \f3ArrayList\fR and \f3List\fR, respectively\&. +- +-The \f3ls\fR command has the parameterized type \f3List<String>\fR\&. When the \f3List\fR referenced by \f3l\fR is assigned to \f3ls\fR, the compiler generates an unchecked warning\&. At compile time, the compiler and JVM cannot determine whether \f3l\fR refers to a \f3List<String>\fR type\&. In this case, \f3l\fR does not refer to a \f3List<String>\fR type\&. As a result, heap pollution occurs\&. +- +-A heap pollution situation occurs when the \f3List\fR object \f3l\fR, whose static type is \f3List<Number>\fR, is assigned to another \f3List\fR object, \f3ls\fR, that has a different static type, \f3List<String>\fR\&. However, the compiler still allows this assignment\&. It must allow this assignment to preserve backward compatibility with releases of Java SE that do not support generics\&. Because of type erasure, \f3List<Number>\fR and \f3List<String>\fR both become \f3List\fR\&. Consequently, the compiler allows the assignment of the object \f3l\fR\f3,\fR which has a raw type of \f3List\fR, to the object \f3ls\fR\&. +-.TP +-varargs +-Warns about unsafe usages of variable arguments (\f3varargs\fR) methods, in particular, those that contain non-reifiable arguments, for example: +-.sp +-.nf +-\f3public class ArrayBuilder {\fP +-.fi +-.nf +-\f3 public static <T> void addToList (List<T> listArg, T\&.\&.\&. elements) {\fP +-.fi +-.nf +-\f3 for (T x : elements) {\fP +-.fi +-.nf +-\f3 listArg\&.add(x);\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-\fINote:\fR A non-reifiable type is a type whose type information is not fully available at runtime\&. +- +-The compiler generates the following warning for the definition of the method \f3ArrayBuilder\&.addToList\fR +-.sp +-.nf +-\f3warning: [varargs] Possible heap pollution from parameterized vararg type T\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-When the compiler encounters a varargs method, it translates the \f3varargs\fR formal parameter into an array\&. However, the Java programming language does not permit the creation of arrays of parameterized types\&. In the method \f3ArrayBuilder\&.addToList\fR, the compiler translates the \f3varargs\fR formal parameter \f3T\&.\&.\&.\fR elements to the formal parameter \f3T[]\fR elements, an array\&. However, because of type erasure, the compiler converts the \f3varargs\fR formal parameter to \f3Object[]\fR elements\&. Consequently, there is a possibility of heap pollution\&. +-.SH COMMAND-LINE\ ARGUMENT\ FILES +-To shorten or simplify the \f3javac\fR command, you can specify one or more files that contain arguments to the \f3javac\fR command (except \f3-J\fR options)\&. This enables you to create \f3javac\fR commands of any length on any operating system\&. ++The ++\fBjavac\fR ++command provides direct support for annotation processing, superseding the need for the separate annotation processing command, ++\fBapt\fR\&. + .PP +-An argument file can include \f3javac\fR options and source file names in any combination\&. The arguments within a file can be separated by spaces or new line characters\&. If a file name contains embedded spaces, then put the whole file name in double quotation marks\&. ++The API for annotation processors is defined in the ++\fBjavax\&.annotation\&.processing\fR ++and j\fBavax\&.lang\&.model\fR ++packages and subpackages\&. ++.SS "How Annotation Processing Works" + .PP +-File Names within an argument file are relative to the current directory, not the location of the argument file\&. Wild cards (*) are not allowed in these lists (such as for specifying \f3*\&.java\fR)\&. Use of the at sign (@) to recursively interpret files is not supported\&. The \f3-J\fR options are not supported because they are passed to the launcher, which does not support argument files\&. +-.PP +-When executing the \f3javac\fR command, pass in the path and name of each argument file with the at sign (@) leading character\&. When the \f3javac\fR command encounters an argument beginning with the at sign (@), it expands the contents of that file into the argument list\&. +-.PP +-\f3Example 1 Single Argument File\fR +-.PP +-You could use a single argument file named \f3argfile\fR to hold all \f3javac\fR arguments: +-.sp +-.nf +-\f3javac @argfile\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-This argument file could contain the contents of both files shown in Example 2 +-.PP +-\f3Example 2 Two Argument Files\fR +-.PP +-You can create two argument files: one for the \f3javac\fR options and the other for the source file names\&. Note that the following lists have no line-continuation characters\&. +-.PP +-Create a file named options that contains the following: +-.sp +-.nf +-\f3\-d classes\fP +-.fi +-.nf +-\f3\-g\fP +-.fi +-.nf +-\f3\-sourcepath /java/pubs/ws/1\&.3/src/share/classes\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Create a file named classes that contains the following: +-.sp +-.nf +-\f3MyClass1\&.java\fP +-.fi +-.nf +-\f3MyClass2\&.java\fP +-.fi +-.nf +-\f3MyClass3\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Then, run the \f3javac\fR command as follows: +-.sp +-.nf +-\f3javac @options @classes\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 3 Argument Files with Paths\fR +-.PP +-The argument files can have paths, but any file names inside the files are relative to the current working directory (not \f3path1\fR or \f3path2\fR): +-.sp +-.nf +-\f3javac @path1/options @path2/classes\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-.SH ANNOTATION\ PROCESSING +-The \f3javac\fR command provides direct support for annotation processing, superseding the need for the separate annotation processing command, \f3apt\fR\&. +-.PP +-The API for annotation processors is defined in the \f3javax\&.annotation\&.processing\fR and j\f3avax\&.lang\&.model\fR packages and subpackages\&. +-.SS HOW\ ANNOTATION\ PROCESSING\ WORKS +-Unless annotation processing is disabled with the \f3-proc:none\fR option, the compiler searches for any annotation processors that are available\&. The search path can be specified with the \f3-processorpath\fR option\&. If no path is specified, then the user class path is used\&. Processors are located by means of service provider-configuration files named \f3META-INF/services/javax\&.annotation\&.processing\fR\&.Processor on the search path\&. Such files should contain the names of any annotation processors to be used, listed one per line\&. Alternatively, processors can be specified explicitly, using the \f3-processor\fR option\&. ++Unless annotation processing is disabled with the ++\fB\-proc:none\fR ++option, the compiler searches for any annotation processors that are available\&. The search path can be specified with the ++\fB\-processorpath\fR ++option\&. If no path is specified, then the user class path is used\&. Processors are located by means of service provider\-configuration files named ++\fBMETA\-INF/services/javax\&.annotation\&.processing\fR\&.Processor on the search path\&. Such files should contain the names of any annotation processors to be used, listed one per line\&. Alternatively, processors can be specified explicitly, using the ++\fB\-processor\fR ++option\&. + .PP + After scanning the source files and classes on the command line to determine what annotations are present, the compiler queries the processors to determine what annotations they process\&. When a match is found, the processor is called\&. A processor can claim the annotations it processes, in which case no further attempt is made to find any processors for those annotations\&. After all of the annotations are claimed, the compiler does not search for additional processors\&. + .PP + If any processors generate new source files, then another round of annotation processing occurs: Any newly generated source files are scanned, and the annotations processed as before\&. Any processors called on previous rounds are also called on all subsequent rounds\&. This continues until no new source files are generated\&. + .PP +-After a round occurs where no new source files are generated, the annotation processors are called one last time, to give them a chance to complete any remaining work\&. Finally, unless the \f3-proc:only\fR option is used, the compiler compiles the original and all generated source files\&. +-.SS IMPLICITLY\ LOADED\ SOURCE\ FILES +-To compile a set of source files, the compiler might need to implicitly load additional source files\&. See Searching for Types\&. Such files are currently not subject to annotation processing\&. By default, the compiler gives a warning when annotation processing occurred and any implicitly loaded source files are compiled\&. The \f3-implicit\fR option provides a way to suppress the warning\&. +-.SH SEARCHING\ FOR\ TYPES ++After a round occurs where no new source files are generated, the annotation processors are called one last time, to give them a chance to complete any remaining work\&. Finally, unless the ++\fB\-proc:only\fR ++option is used, the compiler compiles the original and all generated source files\&. ++.SS "Implicitly Loaded Source Files" ++.PP ++To compile a set of source files, the compiler might need to implicitly load additional source files\&. See Searching for Types\&. Such files are currently not subject to annotation processing\&. By default, the compiler gives a warning when annotation processing occurred and any implicitly loaded source files are compiled\&. The ++\fB\-implicit\fR ++option provides a way to suppress the warning\&. ++.SH "SEARCHING FOR TYPES" ++.PP + To compile a source file, the compiler often needs information about a type, but the type definition is not in the source files specified on the command line\&. The compiler needs type information for every class or interface used, extended, or implemented in the source file\&. This includes classes and interfaces not explicitly mentioned in the source file, but that provide information through inheritance\&. + .PP +-For example, when you create a subclass \f3java\&.applet\&.Applet\fR, you are also using the ancestor classes of \f3Applet\fR: \f3java\&.awt\&.Panel\fR, \f3java\&.awt\&.Container\fR, \f3java\&.awt\&.Component\fR, and \f3java\&.lang\&.Object\fR\&. ++For example, when you create a subclass ++\fBjava\&.applet\&.Applet\fR, you are also using the ancestor classes of ++\fBApplet\fR: ++\fBjava\&.awt\&.Panel\fR, ++\fBjava\&.awt\&.Container\fR, ++\fBjava\&.awt\&.Component\fR, and ++\fBjava\&.lang\&.Object\fR\&. + .PP +-When the compiler needs type information, it searches for a source file or class file that defines the type\&. The compiler searches for class files first in the bootstrap and extension classes, then in the user class path (which by default is the current directory)\&. The user class path is defined by setting the \f3CLASSPATH\fR environment variable or by using the \f3-classpath\fR option\&. ++When the compiler needs type information, it searches for a source file or class file that defines the type\&. The compiler searches for class files first in the bootstrap and extension classes, then in the user class path (which by default is the current directory)\&. The user class path is defined by setting the ++\fBCLASSPATH\fR ++environment variable or by using the ++\fB\-classpath\fR ++option\&. + .PP +-If you set the \f3-sourcepath\fR option, then the compiler searches the indicated path for source files\&. Otherwise, the compiler searches the user class path for both class files and source files\&. ++If you set the ++\fB\-sourcepath\fR ++option, then the compiler searches the indicated path for source files\&. Otherwise, the compiler searches the user class path for both class files and source files\&. + .PP +-You can specify different bootstrap or extension classes with the \f3-bootclasspath\fR and the \f3-extdirs\fR options\&. See Cross-Compilation Options\&. ++You can specify different bootstrap or extension classes with the ++\fB\-bootclasspath\fR ++and the ++\fB\-extdirs\fR ++options\&. See Cross\-Compilation Options\&. + .PP +-A successful type search may produce a class file, a source file, or both\&. If both are found, then you can use the \f3-Xprefer\fR option to instruct the compiler which to use\&. If \f3newer\fR is specified, then the compiler uses the newer of the two files\&. If \f3source\fR is specified, the compiler uses the source file\&. The default is \f3newer\fR\&. ++A successful type search may produce a class file, a source file, or both\&. If both are found, then you can use the ++\fB\-Xprefer\fR ++option to instruct the compiler which to use\&. If ++\fBnewer\fR ++is specified, then the compiler uses the newer of the two files\&. If ++\fBsource\fR ++is specified, the compiler uses the source file\&. The default is ++\fBnewer\fR\&. + .PP +-If a type search finds a source file for a required type, either by itself, or as a result of the setting for the \f3-Xprefer\fR option, then the compiler reads the source file to get the information it needs\&. By default the compiler also compiles the source file\&. You can use the \f3-implicit\fR option to specify the behavior\&. If \f3none\fR is specified, then no class files are generated for the source file\&. If \f3class\fR is specified, then class files are generated for the source file\&. ++If a type search finds a source file for a required type, either by itself, or as a result of the setting for the ++\fB\-Xprefer\fR ++option, then the compiler reads the source file to get the information it needs\&. By default the compiler also compiles the source file\&. You can use the ++\fB\-implicit\fR ++option to specify the behavior\&. If ++\fBnone\fR ++is specified, then no class files are generated for the source file\&. If ++\fBclass\fR ++is specified, then class files are generated for the source file\&. + .PP +-The compiler might not discover the need for some type information until after annotation processing completes\&. When the type information is found in a source file and no \f3-implicit\fR option is specified, the compiler gives a warning that the file is being compiled without being subject to annotation processing\&. To disable the warning, either specify the file on the command line (so that it will be subject to annotation processing) or use the \f3-implicit\fR option to specify whether or not class files should be generated for such source files\&. +-.SH PROGRAMMATIC\ INTERFACE +-The \f3javac\fR command supports the new Java Compiler API defined by the classes and interfaces in the \f3javax\&.tools\fR package\&. +-.SS EXAMPLE +-To compile as though providing command-line arguments, use the following syntax: +-.sp +-.nf +-\f3JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fP +-.fi +-.nf +-\f3JavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The example writes diagnostics to the standard output stream and returns the exit code that \f3javac\fR would give when called from the command line\&. ++The compiler might not discover the need for some type information until after annotation processing completes\&. When the type information is found in a source file and no ++\fB\-implicit\fR ++option is specified, the compiler gives a warning that the file is being compiled without being subject to annotation processing\&. To disable the warning, either specify the file on the command line (so that it will be subject to annotation processing) or use the ++\fB\-implicit\fR ++option to specify whether or not class files should be generated for such source files\&. ++.SH "PROGRAMMATIC INTERFACE" + .PP +-You can use other methods in the \f3javax\&.tools\&.JavaCompiler\fR interface to handle diagnostics, control where files are read from and written to, and more\&. +-.SS OLD\ INTERFACE +-\fINote:\fR This API is retained for backward compatibility only\&. All new code should use the newer Java Compiler API\&. ++The ++\fBjavac\fR ++command supports the new Java Compiler API defined by the classes and interfaces in the ++\fBjavax\&.tools\fR ++package\&. ++.SS "Example" + .PP +-The \f3com\&.sun\&.tools\&.javac\&.Main\fR class provides two static methods to call the compiler from a program: +-.sp +-.nf +-\f3public static int compile(String[] args);\fP +-.fi +-.nf +-\f3public static int compile(String[] args, PrintWriter out);\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The \f3args\fR parameter represents any of the command-line arguments that would typically be passed to the compiler\&. ++To compile as though providing command\-line arguments, use the following syntax: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBJavaCompiler javac = ToolProvider\&.getSystemJavaCompiler();\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + .PP +-The \f3out\fR parameter indicates where the compiler diagnostic output is directed\&. ++The example writes diagnostics to the standard output stream and returns the exit code that ++\fBjavac\fR ++would give when called from the command line\&. + .PP +-The \f3return\fR value is equivalent to the \f3exit\fR value from \f3javac\fR\&. ++You can use other methods in the ++\fBjavax\&.tools\&.JavaCompiler\fR ++interface to handle diagnostics, control where files are read from and written to, and more\&. ++.SS "Old Interface" + .PP +-\fINote:\fR All other classes and methods found in a package with names that start with \f3com\&.sun\&.tools\&.javac\fR (subpackages of \f3com\&.sun\&.tools\&.javac\fR) are strictly internal and subject to change at any time\&. +-.SH EXAMPLES +-\f3Example 1 Compile a Simple Program\fR ++\fBNote:\fR ++This API is retained for backward compatibility only\&. All new code should use the newer Java Compiler API\&. + .PP +-This example shows how to compile the \f3Hello\&.java\fR source file in the greetings directory\&. The class defined in \f3Hello\&.java\fR is called \f3greetings\&.Hello\fR\&. The greetings directory is the package directory both for the source file and the class file and is underneath the current directory\&. This makes it possible to use the default user class path\&. It also makes it unnecessary to specify a separate destination directory with the \f3-d\fR option\&. ++The ++\fBcom\&.sun\&.tools\&.javac\&.Main\fR ++class provides two static methods to call the compiler from a program: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpublic static int compile(String[] args);\fR ++\fBpublic static int compile(String[] args, PrintWriter out);\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + .PP +-The source code in \f3Hello\&.java\fR: +-.sp +-.nf +-\f3package greetings;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3public class Hello {\fP +-.fi +-.nf +-\f3 public static void main(String[] args) {\fP +-.fi +-.nf +-\f3 for (int i=0; i < args\&.length; i++) {\fP +-.fi +-.nf +-\f3 System\&.out\&.println("Hello " + args[i]);\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp ++The ++\fBargs\fR ++parameter represents any of the command\-line arguments that would typically be passed to the compiler\&. ++.PP ++The ++\fBout\fR ++parameter indicates where the compiler diagnostic output is directed\&. ++.PP ++The ++\fBreturn\fR ++value is equivalent to the ++\fBexit\fR ++value from ++\fBjavac\fR\&. ++.PP ++\fBNote:\fR ++All other classes and methods found in a package with names that start with ++\fBcom\&.sun\&.tools\&.javac\fR ++(subpackages of ++\fBcom\&.sun\&.tools\&.javac\fR) are strictly internal and subject to change at any time\&. ++.SH "EXAMPLES" ++.PP ++\fBExample 1\fR ++.br ++Compile a Simple Program ++.RS 4 ++This example shows how to compile the ++\fBHello\&.java\fR ++source file in the greetings directory\&. The class defined in ++\fBHello\&.java\fR ++is called ++\fBgreetings\&.Hello\fR\&. The greetings directory is the package directory both for the source file and the class file and is underneath the current directory\&. This makes it possible to use the default user class path\&. It also makes it unnecessary to specify a separate destination directory with the ++\fB\-d\fR ++option\&. ++.sp ++The source code in ++\fBHello\&.java\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpackage greetings;\fR ++\fB \fR ++\fBpublic class Hello {\fR ++\fB public static void main(String[] args) {\fR ++\fB for (int i=0; i < args\&.length; i++) {\fR ++\fB System\&.out\&.println("Hello " + args[i]);\fR ++\fB }\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} + Compile greetings\&.Hello: +-.sp +-.nf +-\f3javac greetings/Hello\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Run \f3greetings\&.Hello\fR: +-.sp +-.nf +-\f3java greetings\&.Hello World Universe Everyone\fP +-.fi +-.nf +-\f3Hello World\fP +-.fi +-.nf +-\f3Hello Universe\fP +-.fi +-.nf +-\f3Hello Everyone\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 2 Compile Multiple Source Files\fR ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac greetings/Hello\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Run ++\fBgreetings\&.Hello\fR: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava greetings\&.Hello World Universe Everyone\fR ++\fBHello World\fR ++\fBHello Universe\fR ++\fBHello Everyone\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE + .PP +-This example compiles the \f3Aloha\&.java\fR, \f3GutenTag\&.java\fR, \f3Hello\&.java\fR, and \f3Hi\&.java\fR source files in the \f3greetings\fR package\&. +-.sp +-.nf +-\f3% javac greetings/*\&.java\fP +-.fi +-.nf +-\f3% ls greetings\fP +-.fi +-.nf +-\f3Aloha\&.class GutenTag\&.class Hello\&.class Hi\&.class\fP +-.fi +-.nf +-\f3Aloha\&.java GutenTag\&.java Hello\&.java Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 3 Specify a User Class Path\fR ++\fBExample 2\fR ++.br ++Compile Multiple Source Files ++.RS 4 ++This example compiles the ++\fBAloha\&.java\fR, ++\fBGutenTag\&.java\fR, ++\fBHello\&.java\fR, and ++\fBHi\&.java\fR ++source files in the ++\fBgreetings\fR ++package\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fB% javac greetings/*\&.java\fR ++\fB% ls greetings\fR ++\fBAloha\&.class GutenTag\&.class Hello\&.class Hi\&.class\fR ++\fBAloha\&.java GutenTag\&.java Hello\&.java Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE + .PP ++\fBExample 3\fR ++.br ++Specify a User Class Path ++.RS 4 + After changing one of the source files in the previous example, recompile it: +-.sp +-.nf +-\f3pwd\fP +-.fi +-.nf +-\f3/examples\fP +-.fi +-.nf +-\f3javac greetings/Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-Because \f3greetings\&.Hi\fR refers to other classes in the \f3greetings\fR package, the compiler needs to find these other classes\&. The previous example works because the default user class path is the directory that contains the package directory\&. If you want to recompile this file without concern for which directory you are in, then add the examples directory to the user class path by setting \f3CLASSPATH\fR\&. This example uses the \f3-classpath\fR option\&. +-.sp +-.nf +-\f3javac \-classpath /examples /examples/greetings/Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-If you change \f3greetings\&.Hi\fR to use a banner utility, then that utility also needs to be accessible through the user class path\&. +-.sp +-.nf +-\f3javac \-classpath /examples:/lib/Banners\&.jar \e\fP +-.fi +-.nf +-\f3 /examples/greetings/Hi\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-To execute a class in the \f3greetings\fR package, the program needs access to the \f3greetings\fR package, and to the classes that the \f3greetings\fR classes use\&. +-.sp +-.nf +-\f3java \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-\f3Example 4 Separate Source Files and Class Files\fR ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBpwd\fR ++\fB/examples\fR ++\fBjavac greetings/Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++Because ++\fBgreetings\&.Hi\fR ++refers to other classes in the ++\fBgreetings\fR ++package, the compiler needs to find these other classes\&. The previous example works because the default user class path is the directory that contains the package directory\&. If you want to recompile this file without concern for which directory you are in, then add the examples directory to the user class path by setting ++\fBCLASSPATH\fR\&. This example uses the ++\fB\-classpath\fR ++option\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-classpath /examples /examples/greetings/Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you change ++\fBgreetings\&.Hi\fR ++to use a banner utility, then that utility also needs to be accessible through the user class path\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-classpath /examples:/lib/Banners\&.jar \e\fR ++\fB /examples/greetings/Hi\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++To execute a class in the ++\fBgreetings\fR ++package, the program needs access to the ++\fBgreetings\fR ++package, and to the classes that the ++\fBgreetings\fR ++classes use\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjava \-classpath /examples:/lib/Banners\&.jar greetings\&.Hi\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.RE + .PP +-The following example uses \f3javac\fR to compile code that runs on JVM 1\&.6\&. +-.sp +-.nf +-\f3javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e \fP +-.fi +-.nf +-\f3\-extdirs "" OldCode\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The \f3-source 1\&.6\fR option specifies that release 1\&.6 (or 6) of the Java programming language be used to compile \f3OldCode\&.java\fR\&. The option \f3-target 1\&.6\fR option ensures that the generated class files are compatible with JVM 1\&.6\&. Note that in most cases, the value of the \f3-target\fR option is the value of the \f3-source\fR option; in this example, you can omit the \f3-target\fR option\&. ++\fBExample 4\fR ++.br ++Separate Source Files and Class Files ++.RS 4 ++The following example uses ++\fBjavac\fR ++to compile code that runs on JVM 1\&.7\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e \fR ++\fB\-extdirs "" OldCode\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The ++\fB\-source 1\&.7\fR ++option specifies that release 1\&.7 (or 7) of the Java programming language be used to compile ++\fBOldCode\&.java\fR\&. The option ++\fB\-target 1\&.7\fR ++option ensures that the generated class files are compatible with JVM 1\&.7\&. Note that in most cases, the value of the ++\fB\-target\fR ++option is the value of the ++\fB\-source\fR ++option; in this example, you can omit the ++\fB\-target\fR ++option\&. ++.sp ++You must specify the ++\fB\-bootclasspath\fR ++option to specify the correct version of the bootstrap classes (the ++\fBrt\&.jar\fR ++library)\&. If not, then the compiler generates a warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \fR ++\fB\-source 1\&.7\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules (in this example, it uses version 1\&.7 of the Java programming language) combined with the new bootstrap classes, which can result in class files that do not work on the older platform (in this case, Java SE 7) because reference to nonexistent methods can get included\&. ++.RE + .PP +-You must specify the \f3-bootclasspath\fR option to specify the correct version of the bootstrap classes (the \f3rt\&.jar\fR library)\&. If not, then the compiler generates a warning: +-.sp +-.nf +-\f3javac \-source 1\&.6 OldCode\&.java\fP +-.fi +-.nf +-\f3warning: [options] bootstrap class path not set in conjunction with \fP +-.fi +-.nf +-\f3\-source 1\&.6\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules (in this example, it uses version 1\&.6 of the Java programming language) combined with the new bootstrap classes, which can result in class files that do not work on the older platform (in this case, Java SE 6) because reference to nonexistent methods can get included\&. +-.PP +-\f3Example 5 Cross Compile\fR +-.PP +-This example uses \f3javac\fR to compile code that runs on JVM 1\&.6\&. +-.sp +-.nf +-\f3javac \-source 1\&.6 \-target 1\&.6 \-bootclasspath jdk1\&.6\&.0/lib/rt\&.jar \e\fP +-.fi +-.nf +-\f3 \-extdirs "" OldCode\&.java\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The\f3-source 1\&.6\fR option specifies that release 1\&.6 (or 6) of the Java programming language to be used to compile OldCode\&.java\&. The \f3-target 1\&.6\fR option ensures that the generated class files are compatible with JVM 1\&.6\&. In most cases, the value of the \f3-target\fR is the value of \f3-source\fR\&. In this example, the \f3-target\fR option is omitted\&. +-.PP +-You must specify the \f3-bootclasspath\fR option to specify the correct version of the bootstrap classes (the \f3rt\&.jar\fR library)\&. If not, then the compiler generates a warning: +-.sp +-.nf +-\f3javac \-source 1\&.6 OldCode\&.java\fP +-.fi +-.nf +-\f3warning: [options] bootstrap class path not set in conjunction with \-source 1\&.6\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules combined with the new bootstrap classes\&. This combination can result in class files that do not work on the older platform (in this case, Java SE 6) because reference to nonexistent methods can get included\&. In this example, the compiler uses release 1\&.6 of the Java programming language\&. +-.SH SEE\ ALSO +-.TP 0.2i +-\(bu ++\fBExample 5\fR ++.br ++Cross Compile ++.RS 4 ++This example uses ++\fBjavac\fR ++to compile code that runs on JVM 1\&.7\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 \-target 1\&.7 \-bootclasspath jdk1\&.7\&.0/lib/rt\&.jar \e\fR ++\fB \-extdirs "" OldCode\&.java\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++The\fB \-source 1\&.7\fR ++option specifies that release 1\&.7 (or 7) of the Java programming language to be used to compile OldCode\&.java\&. The ++\fB\-target 1\&.7\fR ++option ensures that the generated class files are compatible with JVM 1\&.7\&. In most cases, the value of the ++\fB\-target\fR ++is the value of ++\fB\-source\fR\&. In this example, the ++\fB\-target\fR ++option is omitted\&. ++.sp ++You must specify the ++\fB\-bootclasspath\fR ++option to specify the correct version of the bootstrap classes (the ++\fBrt\&.jar\fR ++library)\&. If not, then the compiler generates a warning: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavac \-source 1\&.7 OldCode\&.java\fR ++\fBwarning: [options] bootstrap class path not set in conjunction with \-source 1\&.7\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++If you do not specify the correct version of bootstrap classes, then the compiler uses the old language rules combined with the new bootstrap classes\&. This combination can result in class files that do not work on the older platform (in this case, Java SE 7) because reference to nonexistent methods can get included\&. In this example, the compiler uses release 1\&.7 of the Java programming language\&. ++.RE ++.SH "SEE ALSO" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + java(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jdb(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javah(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + javadoc(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jar(1) +-.TP 0.2i +-\(bu ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} + jdb(1) +-.RE +-.br +-'pl 8.5i +-'bp ++.RE ++.br ++'pl 8.5i ++'bp +--- ./jdk/src/solaris/doc/sun/man/man1/javap.1 Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/doc/sun/man/man1/javap.1 Wed Jul 30 18:42:59 2014 +0100 +@@ -1,443 +1,392 @@ + '\" t +-.\" Copyright (c) 1994, 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. +-.\" +-.\" Arch: generic +-.\" Software: JDK 8 +-.\" Date: 21 November 2013 +-.\" SectDesc: Basic Tools +-.\" Title: javap.1 ++.\" Copyright (c) 1994, 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. ++.\" ++.\" Title: javap ++.\" Language: English ++.\" Date: 8 August 2014 ++.\" SectDesc: Basic Tools ++.\" Software: JDK 8 ++.\" Arch: generic ++.\" Part Number: E38207-03 + .\" + .if n .pl 99999 +-.TH javap 1 "21 November 2013" "JDK 8" "Basic Tools" +-.\" ----------------------------------------------------------------- +-.\" * Define some portability stuff +-.\" ----------------------------------------------------------------- +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.\" http://bugs.debian.org/507673 +-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-.ie \n(.g .ds Aq \(aq +-.el .ds Aq ' +-.\" ----------------------------------------------------------------- +-.\" * set default formatting +-.\" ----------------------------------------------------------------- +-.\" disable hyphenation +-.nh +-.\" disable justification (adjust text to left margin only) +-.ad l +-.\" ----------------------------------------------------------------- +-.\" * MAIN CONTENT STARTS HERE * +-.\" ----------------------------------------------------------------- +- +-.SH NAME ++.TH "javap" "1" "8 August 2014" "JDK 8" "Basic Tools" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" + javap \- Disassembles one or more class files\&. +-.SH SYNOPSIS +-.sp +-.nf +- ++.SH "SYNOPSIS" ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf + \fBjavap\fR [\fIoptions\fR] \fIclassfile\fR\&.\&.\&. +-.fi +-.sp +-.TP ++.fi ++.if n \{\ ++.RE ++.\} ++.PP + \fIoptions\fR +-The command-line options\&. See Options\&. +-.TP ++.RS 4 ++The command\-line options\&. See Options\&. ++.RE ++.PP + \fIclassfile\fR +-One or more classes separated by spaces to be processed for annotations such as DocFooter\&.class\&. You can specify a class that can be found in the class path, by its file name or with a URL such as \f3file:///home/user/myproject/src/DocFooter\&.class\fR\&. +-.SH DESCRIPTION +-The \f3javap\fR command disassembles one or more class files\&. The output depends on the options used\&. When no options are used, then the \f3javap\fR command prints the package, protected and public fields, and methods of the classes passed to it\&. The \f3javap\fR command prints its output to \f3stdout\fR\&. +-.SH OPTIONS +-.TP +--help, --help, -? ++.RS 4 ++One or more classes separated by spaces to be processed for annotations such as DocFooter\&.class\&. You can specify a class that can be found in the class path, by its file name or with a URL such as ++\fBfile:///home/user/myproject/src/DocFooter\&.class\fR\&. ++.RE ++.SH "DESCRIPTION" ++.PP ++The ++\fBjavap\fR ++command disassembles one or more class files\&. The output depends on the options used\&. When no options are used, then the ++\fBjavap\fR ++command prints the package, protected and public fields, and methods of the classes passed to it\&. The ++\fBjavap\fR ++command prints its output to ++\fBstdout\fR\&. ++.SH "OPTIONS" ++.PP ++\-help + .br +-Prints a help message for the \f3javap\fR command\&. +-.TP +--version ++\-\-help + .br ++\-? ++.RS 4 ++Prints a help message for the ++\fBjavap\fR ++command\&. ++.RE ++.PP ++\-version ++.RS 4 + Prints release information\&. +-.TP +--l ++.RE ++.PP ++\-l ++.RS 4 ++Prints line and local variable tables\&. ++.RE ++.PP ++\-public ++.RS 4 ++Shows only public classes and members\&. ++.RE ++.PP ++\-protected ++.RS 4 ++Shows only protected and public classes and members\&. ++.RE ++.PP ++\-private + .br +-Prints line and local variable tables\&. +-.TP +--public ++\-p ++.RS 4 ++Shows all classes and members\&. ++.RE ++.PP ++\-J\fIoption\fR ++.RS 4 ++Passes the specified option to the JVM\&. For example: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBjavap \-J\-version\fR ++\fBjavap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++For more information about JVM options, see the command documentation\&. ++.RE ++.PP ++\-s ++.RS 4 ++Prints internal type signatures\&. ++.RE ++.PP ++\-sysinfo ++.RS 4 ++Shows system information (path, size, date, MD5 hash) of the class being processed\&. ++.RE ++.PP ++\-constants ++.RS 4 ++Shows ++\fBstatic final\fR ++constants\&. ++.RE ++.PP ++\-c ++.RS 4 ++Prints disassembled code, for example, the instructions that comprise the Java bytecodes, for each of the methods in the class\&. ++.RE ++.PP ++\-verbose ++.RS 4 ++Prints stack size, number of locals and arguments for methods\&. ++.RE ++.PP ++\-classpath \fIpath\fR ++.RS 4 ++Specifies the path the ++\fBjavap\fR ++command uses to look up classes\&. Overrides the default or the ++\fBCLASSPATH\fR ++environment variable when it is set\&. ++.RE ++.PP ++\-bootclasspath \fIpath\fR ++.RS 4 ++Specifies the path from which to load bootstrap classes\&. By default, the bootstrap classes are the classes that implement the core Java platform located in ++\fBjre/lib/rt\&.jar\fR ++and several other JAR files\&. ++.RE ++.PP ++\-extdir \fIdirs\fR ++.RS 4 ++Overrides the location at which installed extensions are searched for\&. The default location for extensions is the value of ++\fBjava\&.ext\&.dirs\fR\&. ++.RE ++.SH "EXAMPLE" ++.PP ++Compile the following ++\fBDocFooter\fR ++class: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBimport java\&.awt\&.*;\fR ++\fBimport java\&.applet\&.*;\fR ++\fB \fR ++\fBpublic class DocFooter extends Applet {\fR ++\fB String date;\fR ++\fB String email;\fR ++\fB \fR ++\fB public void init() {\fR ++\fB resize(500,100);\fR ++\fB date = getParameter("LAST_UPDATED");\fR ++\fB email = getParameter("EMAIL");\fR ++\fB }\fR ++\fB \fR ++\fB public void paint(Graphics g) {\fR ++\fB g\&.drawString(date + " by ",100, 15);\fR ++\fB g\&.drawString(email,290,15);\fR ++\fB }\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The output from the ++\fBjavap DocFooter\&.class\fR ++command yields the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++\fB public DocFooter();\fR ++\fB public void init();\fR ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.PP ++The output from ++\fBjavap \-c DocFooter\&.class\fR ++command yields the following: ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++\fBCompiled from "DocFooter\&.java"\fR ++\fBpublic class DocFooter extends java\&.applet\&.Applet {\fR ++\fB java\&.lang\&.String date;\fR ++\fB java\&.lang\&.String email;\fR ++ ++\fB public DocFooter();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: invokespecial #1 // Method\fR ++\fBjava/applet/Applet\&."<init>":()V\fR ++\fB 4: return \fR ++ ++\fB public void init();\fR ++\fB Code:\fR ++\fB 0: aload_0 \fR ++\fB 1: sipush 500\fR ++\fB 4: bipush 100\fR ++\fB 6: invokevirtual #2 // Method resize:(II)V\fR ++\fB 9: aload_0 \fR ++\fB 10: aload_0 \fR ++\fB 11: ldc #3 // String LAST_UPDATED\fR ++\fB 13: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 16: putfield #5 // Field date:Ljava/lang/String;\fR ++\fB 19: aload_0 \fR ++\fB 20: aload_0 \fR ++\fB 21: ldc #6 // String EMAIL\fR ++\fB 23: invokevirtual #4 // Method\fR ++\fB getParameter:(Ljava/lang/String;)Ljava/lang/String;\fR ++\fB 26: putfield #7 // Field email:Ljava/lang/String;\fR ++\fB 29: return \fR ++ ++\fB public void paint(java\&.awt\&.Graphics);\fR ++\fB Code:\fR ++\fB 0: aload_1 \fR ++\fB 1: new #8 // class java/lang/StringBuilder\fR ++\fB 4: dup \fR ++\fB 5: invokespecial #9 // Method\fR ++\fB java/lang/StringBuilder\&."<init>":()V\fR ++\fB 8: aload_0 \fR ++\fB 9: getfield #5 // Field date:Ljava/lang/String;\fR ++\fB 12: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 15: ldc #11 // String by \fR ++\fB 17: invokevirtual #10 // Method\fR ++\fB java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fR ++\fB 20: invokevirtual #12 // Method\fR ++\fB java/lang/StringBuilder\&.toString:()Ljava/lang/String;\fR ++\fB 23: bipush 100\fR ++\fB 25: bipush 15\fR ++\fB 27: invokevirtual #13 // Method\fR ++\fB java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 30: aload_1 \fR ++\fB 31: aload_0 \fR ++\fB 32: getfield #7 // Field email:Ljava/lang/String;\fR ++\fB 35: sipush 290\fR ++\fB 38: bipush 15\fR ++\fB 40: invokevirtual #13 // Method\fR ++\fBjava/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fR ++\fB 43: return \fR ++\fB}\fR ++ ++.fi ++.if n \{\ ++.RE ++.\} ++.SH "SEE ALSO" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++java(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javac(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javadoc(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++javah(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++jdb(1) ++.RE ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++jdeps(1) ++.RE + .br +-Shows only public classes and members\&. +-.TP +--protected +-.br +-Shows only protected and public classes and members\&. +-.TP +--private, -p +-.br +-Shows all classes and members\&. +-.TP +--J\fIoption\fR +-.br +-Passes the specified option to the JVM\&. For example: +-.sp +-.nf +-\f3javap \-J\-version\fP +-.fi +-.nf +-\f3javap \-J\-Djava\&.security\&.manager \-J\-Djava\&.security\&.policy=MyPolicy MyClassName\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +- +- +-For more information about JVM options, see the \f3java(1)\fR command documentation\&. +-.TP +--s +-.br +-Prints internal type signatures\&. +-.TP +--sysinfo +-.br +-Shows system information (path, size, date, MD5 hash) of the class being processed\&. +-.TP +--constants +-.br +-Shows \f3static final\fR constants\&. +-.TP +--c +-.br +-Prints disassembled code, for example, the instructions that comprise the Java bytecodes, for each of the methods in the class\&. +-.TP +--verbose +-.br +-Prints stack size, number of locals and arguments for methods\&. +-.TP +--classpath \fIpath\fR +-.br +-Specifies the path the \f3javap\fR command uses to look up classes\&. Overrides the default or the \f3CLASSPATH\fR environment variable when it is set\&. +-.TP +--bootclasspath \fIpath\fR +-.br +-Specifies the path from which to load bootstrap classes\&. By default, the bootstrap classes are the classes that implement the core Java platform located in \f3jre/lib/rt\&.jar\fR and several other JAR files\&. +-.TP +--extdir \fIdirs\fR +-.br +-Overrides the location at which installed extensions are searched for\&. The default location for extensions is the value of \f3java\&.ext\&.dirs\fR\&. +-.SH EXAMPLE +-Compile the following \f3DocFooter\fR class: +-.sp +-.nf +-\f3import java\&.awt\&.*;\fP +-.fi +-.nf +-\f3import java\&.applet\&.*;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3public class DocFooter extends Applet {\fP +-.fi +-.nf +-\f3 String date;\fP +-.fi +-.nf +-\f3 String email;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void init() {\fP +-.fi +-.nf +-\f3 resize(500,100);\fP +-.fi +-.nf +-\f3 date = getParameter("LAST_UPDATED");\fP +-.fi +-.nf +-\f3 email = getParameter("EMAIL");\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void paint(Graphics g) {\fP +-.fi +-.nf +-\f3 g\&.drawString(date + " by ",100, 15);\fP +-.fi +-.nf +-\f3 g\&.drawString(email,290,15);\fP +-.fi +-.nf +-\f3 }\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The output from the \f3javap DocFooter\&.class\fR command yields the following: +-.sp +-.nf +-\f3Compiled from "DocFooter\&.java"\fP +-.fi +-.nf +-\f3public class DocFooter extends java\&.applet\&.Applet {\fP +-.fi +-.nf +-\f3 java\&.lang\&.String date;\fP +-.fi +-.nf +-\f3 java\&.lang\&.String email;\fP +-.fi +-.nf +-\f3 public DocFooter();\fP +-.fi +-.nf +-\f3 public void init();\fP +-.fi +-.nf +-\f3 public void paint(java\&.awt\&.Graphics);\fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-The output from \f3javap -c DocFooter\&.class\fR command yields the following: +-.sp +-.nf +-\f3Compiled from "DocFooter\&.java"\fP +-.fi +-.nf +-\f3public class DocFooter extends java\&.applet\&.Applet {\fP +-.fi +-.nf +-\f3 java\&.lang\&.String date;\fP +-.fi +-.nf +-\f3 java\&.lang\&.String email;\fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public DocFooter();\fP +-.fi +-.nf +-\f3 Code:\fP +-.fi +-.nf +-\f3 0: aload_0 \fP +-.fi +-.nf +-\f3 1: invokespecial #1 // Method\fP +-.fi +-.nf +-\f3java/applet/Applet\&."<init>":()V\fP +-.fi +-.nf +-\f3 4: return \fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void init();\fP +-.fi +-.nf +-\f3 Code:\fP +-.fi +-.nf +-\f3 0: aload_0 \fP +-.fi +-.nf +-\f3 1: sipush 500\fP +-.fi +-.nf +-\f3 4: bipush 100\fP +-.fi +-.nf +-\f3 6: invokevirtual #2 // Method resize:(II)V\fP +-.fi +-.nf +-\f3 9: aload_0 \fP +-.fi +-.nf +-\f3 10: aload_0 \fP +-.fi +-.nf +-\f3 11: ldc #3 // String LAST_UPDATED\fP +-.fi +-.nf +-\f3 13: invokevirtual #4 // Method\fP +-.fi +-.nf +-\f3 getParameter:(Ljava/lang/String;)Ljava/lang/String;\fP +-.fi +-.nf +-\f3 16: putfield #5 // Field date:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 19: aload_0 \fP +-.fi +-.nf +-\f3 20: aload_0 \fP +-.fi +-.nf +-\f3 21: ldc #6 // String EMAIL\fP +-.fi +-.nf +-\f3 23: invokevirtual #4 // Method\fP +-.fi +-.nf +-\f3 getParameter:(Ljava/lang/String;)Ljava/lang/String;\fP +-.fi +-.nf +-\f3 26: putfield #7 // Field email:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 29: return \fP +-.fi +-.nf +-\f3\fP +-.fi +-.nf +-\f3 public void paint(java\&.awt\&.Graphics);\fP +-.fi +-.nf +-\f3 Code:\fP +-.fi +-.nf +-\f3 0: aload_1 \fP +-.fi +-.nf +-\f3 1: new #8 // class java/lang/StringBuilder\fP +-.fi +-.nf +-\f3 4: dup \fP +-.fi +-.nf +-\f3 5: invokespecial #9 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&."<init>":()V\fP +-.fi +-.nf +-\f3 8: aload_0 \fP +-.fi +-.nf +-\f3 9: getfield #5 // Field date:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 12: invokevirtual #10 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fP +-.fi +-.nf +-\f3 15: ldc #11 // String by \fP +-.fi +-.nf +-\f3 17: invokevirtual #10 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;\fP +-.fi +-.nf +-\f3 20: invokevirtual #12 // Method\fP +-.fi +-.nf +-\f3 java/lang/StringBuilder\&.toString:()Ljava/lang/String;\fP +-.fi +-.nf +-\f3 23: bipush 100\fP +-.fi +-.nf +-\f3 25: bipush 15\fP +-.fi +-.nf +-\f3 27: invokevirtual #13 // Method\fP +-.fi +-.nf +-\f3 java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fP +-.fi +-.nf +-\f3 30: aload_1 \fP +-.fi +-.nf +-\f3 31: aload_0 \fP +-.fi +-.nf +-\f3 32: getfield #7 // Field email:Ljava/lang/String;\fP +-.fi +-.nf +-\f3 35: sipush 290\fP +-.fi +-.nf +-\f3 38: bipush 15\fP +-.fi +-.nf +-\f3 40: invokevirtual #13 // Method\fP +-.fi +-.nf +-\f3java/awt/Graphics\&.drawString:(Ljava/lang/String;II)V\fP +-.fi +-.nf +-\f3 43: return \fP +-.fi +-.nf +-\f3}\fP +-.fi +-.nf +-\f3\fP +-.fi +-.sp +-.SH SEE\ ALSO +-.TP 0.2i +-\(bu +-javac(1) +-.TP 0.2i +-\(bu +-java(1) +-.TP 0.2i +-\(bu +-jdb(1) +-.TP 0.2i +-\(bu +-javah(1) +-.TP 0.2i +-\(bu +-javadoc(1) +-.RE +-.br +-'pl 8.5i +-'bp ++'pl 8.5i ++'bp +--- ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_BsdOS_ALSA_MidiUtils.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_BsdOS_ALSA_MidiUtils.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -229,8 +229,9 @@ + desc->deviceID = deviceID; + + buffer[0]=' '; buffer[1]='['; ++ // buffer[300] is enough to store the actual device string w/o overrun + getDeviceStringFromDeviceID(&buffer[2], deviceID, usePlugHw, ALSA_RAWMIDI); +- strcat(buffer, "]"); ++ strncat(buffer, "]", sizeof(buffer) - strlen(buffer) - 1); + strncpy(desc->name, + (cardinfo != NULL) + ? snd_ctl_card_info_get_id(cardinfo) +--- ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_BsdOS_ALSA_PCMUtils.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_BsdOS_ALSA_PCMUtils.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -184,8 +184,9 @@ + 1 : snd_pcm_info_get_subdevices_count(pcminfo); + *desc->deviceID = deviceID; + buffer[0]=' '; buffer[1]='['; ++ // buffer[300] is enough to store the actual device string w/o overrun + getDeviceStringFromDeviceID(&buffer[2], deviceID, usePlugHw, ALSA_PCM); +- strcat(buffer, "]"); ++ strncat(buffer, "]", sizeof(buffer) - strlen(buffer) - 1); + strncpy(desc->name, + (cardinfo != NULL) + ? snd_ctl_card_info_get_id(cardinfo) +--- ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_MidiUtils.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_MidiUtils.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2010, 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 +@@ -229,8 +229,9 @@ + desc->deviceID = deviceID; + + buffer[0]=' '; buffer[1]='['; ++ // buffer[300] is enough to store the actual device string w/o overrun + getDeviceStringFromDeviceID(&buffer[2], deviceID, usePlugHw, ALSA_RAWMIDI); +- strcat(buffer, "]"); ++ strncat(buffer, "]", sizeof(buffer) - strlen(buffer) - 1); + strncpy(desc->name, + (cardinfo != NULL) + ? snd_ctl_card_info_get_id(cardinfo) +--- ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCMUtils.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_LinuxOS_ALSA_PCMUtils.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2007, 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 +@@ -184,8 +184,9 @@ + 1 : snd_pcm_info_get_subdevices_count(pcminfo); + *desc->deviceID = deviceID; + buffer[0]=' '; buffer[1]='['; ++ // buffer[300] is enough to store the actual device string w/o overrun + getDeviceStringFromDeviceID(&buffer[2], deviceID, usePlugHw, ALSA_PCM); +- strcat(buffer, "]"); ++ strncat(buffer, "]", sizeof(buffer) - strlen(buffer) - 1); + strncpy(desc->name, + (cardinfo != NULL) + ? snd_ctl_card_info_get_id(cardinfo) +--- ./jdk/src/solaris/native/common/jdk_util_md.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/common/jdk_util_md.h Wed Jul 30 18:42:59 2014 +0100 +@@ -39,6 +39,10 @@ + #include <math.h> + #define ISNANF(f) isnanf(f) + #define ISNAND(d) isnan(d) ++#elif defined(_AIX) ++#include <math.h> ++#define ISNANF(f) _isnanf(f) ++#define ISNAND(d) _isnan(d) + #else + #error "missing platform-specific definition here" + #endif +--- ./jdk/src/solaris/native/java/io/io_util_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/java/io/io_util_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -35,7 +35,7 @@ + #include <sys/filio.h> + #endif + +-#if defined(__linux__) || defined(_ALLBSD_SOURCE) ++#if defined(__linux__) || defined(_ALLBSD_SOURCE) || defined(_AIX) + #include <sys/ioctl.h> + #endif + +--- ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -44,7 +44,7 @@ + #include <signal.h> + #include <string.h> + +-#if defined(__solaris__) || defined(_ALLBSD_SOURCE) ++#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX) + #include <spawn.h> + #endif + +@@ -455,7 +455,7 @@ + return resultPid; + } + +-#if defined(__solaris__) || defined(_ALLBSD_SOURCE) ++#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX) + static pid_t + spawnChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) { + pid_t resultPid; +@@ -551,7 +551,7 @@ + return vforkChild(c); + case MODE_FORK: + return forkChild(c); +-#if defined(__solaris__) || defined(_ALLBSD_SOURCE) ++#if defined(__solaris__) || defined(_ALLBSD_SOURCE) || defined(_AIX) + case MODE_POSIX_SPAWN: + return spawnChild(env, process, c, helperpath); + #endif +--- ./jdk/src/solaris/native/java/lang/childproc.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/java/lang/childproc.c Wed Jul 30 18:42:59 2014 +0100 +@@ -66,6 +66,9 @@ + #define FD_DIR "/dev/fd" + #define dirent64 dirent + #define readdir64 readdir ++#elif defined(_AIX) ++/* AIX does not understand '/proc/self' - it requires the real process ID */ ++#define FD_DIR aix_fd_dir + #else + #define FD_DIR "/proc/self/fd" + #endif +@@ -87,6 +90,12 @@ + close(from_fd); /* for possible use by opendir() */ + close(from_fd + 1); /* another one for good luck */ + ++#if defined(_AIX) ++ /* AIX does not understand '/proc/self' - it requires the real process ID */ ++ char aix_fd_dir[32]; /* the pid has at most 19 digits */ ++ snprintf(aix_fd_dir, 32, "/proc/%d/fd", getpid()); ++#endif ++ + if ((dp = opendir(FD_DIR)) == NULL) + return 0; + +--- ./jdk/src/solaris/native/java/net/ExtendedOptionsImpl.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/solaris/native/java/net/ExtendedOptionsImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,335 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++#include <jni.h> ++#include <string.h> ++ ++#include "net_util.h" ++#include "jdk_net_SocketFlow.h" ++ ++static jclass sf_status_class; /* Status enum type */ ++ ++static jfieldID sf_status; ++static jfieldID sf_priority; ++static jfieldID sf_bandwidth; ++ ++static jfieldID sf_fd_fdID; /* FileDescriptor.fd */ ++ ++/* References to the literal enum values */ ++ ++static jobject sfs_NOSTATUS; ++static jobject sfs_OK; ++static jobject sfs_NOPERMISSION; ++static jobject sfs_NOTCONNECTED; ++static jobject sfs_NOTSUPPORTED; ++static jobject sfs_ALREADYCREATED; ++static jobject sfs_INPROGRESS; ++static jobject sfs_OTHER; ++ ++static jobject getEnumField(JNIEnv *env, char *name); ++static void setStatus(JNIEnv *env, jobject obj, int errval); ++ ++/* OS specific code is implemented in these three functions */ ++ ++static jboolean flowSupported0() ; ++ ++/* ++ * Class: sun_net_ExtendedOptionsImpl ++ * Method: init ++ * Signature: ()V ++ */ ++JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_init ++ (JNIEnv *env, jclass UNUSED) { ++ ++ static int initialized = 0; ++ jclass c; ++ ++ /* Global class references */ ++ ++ if (initialized) { ++ return; ++ } ++ ++ c = (*env)->FindClass(env, "jdk/net/SocketFlow$Status"); ++ CHECK_NULL(c); ++ sf_status_class = (*env)->NewGlobalRef(env, c); ++ CHECK_NULL(sf_status_class); ++ ++ /* int "fd" field of java.io.FileDescriptor */ ++ ++ c = (*env)->FindClass(env, "java/io/FileDescriptor"); ++ CHECK_NULL(c); ++ sf_fd_fdID = (*env)->GetFieldID(env, c, "fd", "I"); ++ CHECK_NULL(sf_fd_fdID); ++ ++ ++ /* SocketFlow fields */ ++ ++ c = (*env)->FindClass(env, "jdk/net/SocketFlow"); ++ ++ /* status */ ++ ++ sf_status = (*env)->GetFieldID(env, c, "status", ++ "Ljdk/net/SocketFlow$Status;"); ++ CHECK_NULL(sf_status); ++ ++ /* priority */ ++ ++ sf_priority = (*env)->GetFieldID(env, c, "priority", "I"); ++ CHECK_NULL(sf_priority); ++ ++ /* bandwidth */ ++ ++ sf_bandwidth = (*env)->GetFieldID(env, c, "bandwidth", "J"); ++ CHECK_NULL(sf_bandwidth); ++ ++ /* Initialize the static enum values */ ++ ++ sfs_NOSTATUS = getEnumField(env, "NO_STATUS"); ++ CHECK_NULL(sfs_NOSTATUS); ++ sfs_OK = getEnumField(env, "OK"); ++ CHECK_NULL(sfs_OK); ++ sfs_NOPERMISSION = getEnumField(env, "NO_PERMISSION"); ++ CHECK_NULL(sfs_NOPERMISSION); ++ sfs_NOTCONNECTED = getEnumField(env, "NOT_CONNECTED"); ++ CHECK_NULL(sfs_NOTCONNECTED); ++ sfs_NOTSUPPORTED = getEnumField(env, "NOT_SUPPORTED"); ++ CHECK_NULL(sfs_NOTSUPPORTED); ++ sfs_ALREADYCREATED = getEnumField(env, "ALREADY_CREATED"); ++ CHECK_NULL(sfs_ALREADYCREATED); ++ sfs_INPROGRESS = getEnumField(env, "IN_PROGRESS"); ++ CHECK_NULL(sfs_INPROGRESS); ++ sfs_OTHER = getEnumField(env, "OTHER"); ++ CHECK_NULL(sfs_OTHER); ++ initialized = JNI_TRUE; ++} ++ ++static jobject getEnumField(JNIEnv *env, char *name) { ++ jobject f; ++ jfieldID fID = (*env)->GetStaticFieldID(env, sf_status_class, name, ++ "Ljdk/net/SocketFlow$Status;"); ++ CHECK_NULL_RETURN(fID, NULL); ++ ++ f = (*env)->GetStaticObjectField(env, sf_status_class, fID); ++ CHECK_NULL_RETURN(f, NULL); ++ f = (*env)->NewGlobalRef(env, f); ++ CHECK_NULL_RETURN(f, NULL); ++ return f; ++} ++ ++/* ++ * Retrieve the int file-descriptor from a public socket type object. ++ * Gets impl, then the FileDescriptor from the impl, and then the fd ++ * from that. ++ */ ++static int getFD(JNIEnv *env, jobject fileDesc) { ++ return (*env)->GetIntField(env, fileDesc, sf_fd_fdID); ++} ++ ++/** ++ * Sets the status field of a SocketFlow to one of the ++ * canned enum values ++ */ ++static void setStatus (JNIEnv *env, jobject obj, int errval) { ++ switch (errval) { ++ case 0: /* OK */ ++ (*env)->SetObjectField(env, obj, sf_status, sfs_OK); ++ break; ++ case EPERM: ++ (*env)->SetObjectField(env, obj, sf_status, sfs_NOPERMISSION); ++ break; ++ case ENOTCONN: ++ (*env)->SetObjectField(env, obj, sf_status, sfs_NOTCONNECTED); ++ break; ++ case EOPNOTSUPP: ++ (*env)->SetObjectField(env, obj, sf_status, sfs_NOTSUPPORTED); ++ break; ++ case EALREADY: ++ (*env)->SetObjectField(env, obj, sf_status, sfs_ALREADYCREATED); ++ break; ++ case EINPROGRESS: ++ (*env)->SetObjectField(env, obj, sf_status, sfs_INPROGRESS); ++ break; ++ default: ++ (*env)->SetObjectField(env, obj, sf_status, sfs_OTHER); ++ break; ++ } ++} ++ ++#ifdef __solaris__ ++ ++/* ++ * Class: sun_net_ExtendedOptionsImpl ++ * Method: setFlowOption ++ * Signature: (Ljava/io/FileDescriptor;Ljdk/net/SocketFlow;)V ++ */ ++JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_setFlowOption ++ (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) { ++ int fd = getFD(env, fileDesc); ++ ++ if (fd < 0) { ++ NET_ERROR(env, JNU_JAVANETPKG "SocketException", "socket closed"); ++ return; ++ } else { ++ sock_flow_props_t props; ++ jlong bandwidth; ++ int rv; ++ ++ jint priority = (*env)->GetIntField(env, flow, sf_priority); ++ memset(&props, 0, sizeof(props)); ++ props.sfp_version = SOCK_FLOW_PROP_VERSION1; ++ ++ if (priority != jdk_net_SocketFlow_UNSET) { ++ props.sfp_mask |= SFP_PRIORITY; ++ props.sfp_priority = priority; ++ } ++ bandwidth = (*env)->GetLongField(env, flow, sf_bandwidth); ++ if (bandwidth > -1) { ++ props.sfp_mask |= SFP_MAXBW; ++ props.sfp_maxbw = (uint64_t) bandwidth; ++ } ++ rv = setsockopt(fd, SOL_SOCKET, SO_FLOW_SLA, &props, sizeof(props)); ++ if (rv < 0) { ++ 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"); ++ } ++ return; ++ } ++ setStatus(env, flow, props.sfp_status); ++ } ++} ++ ++/* ++ * Class: sun_net_ExtendedOptionsImpl ++ * Method: getFlowOption ++ * Signature: (Ljava/io/FileDescriptor;Ljdk/net/SocketFlow;)V ++ */ ++JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_getFlowOption ++ (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) { ++ int fd = getFD(env, fileDesc); ++ ++ if (fd < 0) { ++ NET_ERROR(env, JNU_JAVANETPKG "SocketException", "socket closed"); ++ return; ++ } else { ++ sock_flow_props_t props; ++ int status; ++ socklen_t sz = sizeof(props); ++ ++ int rv = getsockopt(fd, SOL_SOCKET, SO_FLOW_SLA, &props, &sz); ++ if (rv < 0) { ++ 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"); ++ } ++ return; ++ } ++ /* first check status to see if flow exists */ ++ status = props.sfp_status; ++ setStatus(env, flow, status); ++ if (status == 0) { /* OK */ ++ /* can set the other fields now */ ++ if (props.sfp_mask & SFP_PRIORITY) { ++ (*env)->SetIntField(env, flow, sf_priority, props.sfp_priority); ++ } ++ if (props.sfp_mask & SFP_MAXBW) { ++ (*env)->SetLongField(env, flow, sf_bandwidth, ++ (jlong)props.sfp_maxbw); ++ } ++ } ++ } ++} ++ ++static jboolean flowsupported; ++static jboolean flowsupported_set = JNI_FALSE; ++ ++static jboolean flowSupported0() { ++ /* Do a simple dummy call, and try to figure out from that */ ++ sock_flow_props_t props; ++ int rv, s; ++ if (flowsupported_set) { ++ return flowsupported; ++ } ++ s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); ++ if (s < 0) { ++ flowsupported = JNI_FALSE; ++ flowsupported_set = JNI_TRUE; ++ return JNI_FALSE; ++ } ++ memset(&props, 0, sizeof(props)); ++ props.sfp_version = SOCK_FLOW_PROP_VERSION1; ++ props.sfp_mask |= SFP_PRIORITY; ++ props.sfp_priority = SFP_PRIO_NORMAL; ++ rv = setsockopt(s, SOL_SOCKET, SO_FLOW_SLA, &props, sizeof(props)); ++ if (rv != 0 && errno == ENOPROTOOPT) { ++ rv = JNI_FALSE; ++ } else { ++ rv = JNI_TRUE; ++ } ++ close(s); ++ flowsupported = rv; ++ flowsupported_set = JNI_TRUE; ++ return flowsupported; ++} ++ ++#else /* __solaris__ */ ++ ++/* Non Solaris. Functionality is not supported. So, throw UnsupportedOpExc */ ++ ++JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_setFlowOption ++ (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) { ++ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ++ "unsupported socket option"); ++} ++ ++JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_getFlowOption ++ (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) { ++ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ++ "unsupported socket option"); ++} ++ ++static jboolean flowSupported0() { ++ return JNI_FALSE; ++} ++ ++#endif /* __solaris__ */ ++ ++JNIEXPORT jboolean JNICALL Java_sun_net_ExtendedOptionsImpl_flowSupported ++ (JNIEnv *env, jclass UNUSED) { ++ return flowSupported0(); ++} +--- ./jdk/src/solaris/native/java/net/NetworkInterface.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/NetworkInterface.c Wed Jul 30 18:42:59 2014 +0100 +@@ -52,6 +52,13 @@ + #include <stdio.h> + #endif + ++#if defined(_AIX) ++#include <sys/ioctl.h> ++#include <netinet/in6_var.h> ++#include <sys/ndd_var.h> ++#include <sys/kinfo.h> ++#endif ++ + #ifdef __linux__ + #define _PATH_PROCNET_IFINET6 "/proc/net/if_inet6" + #endif +@@ -243,7 +250,11 @@ + } + + name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); +- ++ if (name_utf == NULL) { ++ if (!(*env)->ExceptionCheck(env)) ++ JNU_ThrowOutOfMemoryError(env, NULL); ++ return NULL; ++ } + /* + * Search the list of interface based on name + */ +@@ -511,7 +522,11 @@ + const char* name_utf; + + name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); +- ++ if (name_utf == NULL) { ++ if (!(*env)->ExceptionCheck(env)) ++ JNU_ThrowOutOfMemoryError(env, NULL); ++ return NULL; ++ } + if ((sock =openSocketWithFallback(env, name_utf)) < 0) { + (*env)->ReleaseStringUTFChars(env, name, name_utf); + return JNI_FALSE; +@@ -558,6 +573,11 @@ + const char* name_utf; + + name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); ++ if (name_utf == NULL) { ++ if (!(*env)->ExceptionCheck(env)) ++ JNU_ThrowOutOfMemoryError(env, NULL); ++ return ret; ++ } + + if ((sock =openSocketWithFallback(env, name_utf)) < 0) { + (*env)->ReleaseStringUTFChars(env, name, name_utf); +@@ -581,7 +601,11 @@ + int flags = 0; + + name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); +- ++ if (name_utf == NULL) { ++ if (!(*env)->ExceptionCheck(env)) ++ JNU_ThrowOutOfMemoryError(env, NULL); ++ return -1; ++ } + if ((sock = openSocketWithFallback(env, name_utf)) < 0) { + (*env)->ReleaseStringUTFChars(env, name, name_utf); + return -1; +@@ -625,10 +649,9 @@ + * Create a NetworkInterface object and populate it + */ + netifObj = (*env)->NewObject(env, ni_class, ni_ctrID); ++ CHECK_NULL_RETURN(netifObj, NULL); + name = (*env)->NewStringUTF(env, ifs->name); +- if (netifObj == NULL || name == NULL) { +- return NULL; +- } ++ CHECK_NULL_RETURN(name, NULL); + (*env)->SetObjectField(env, netifObj, ni_nameID, name); + (*env)->SetObjectField(env, netifObj, ni_descID, name); + (*env)->SetIntField(env, netifObj, ni_indexID, ifs->index); +@@ -667,6 +690,8 @@ + iaObj = (*env)->NewObject(env, ni_ia4cls, ni_ia4ctrID); + if (iaObj) { + setInetAddress_addr(env, iaObj, htonl(((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr)); ++ } else { ++ return NULL; + } + ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); + if (ibObj) { +@@ -677,10 +702,14 @@ + if (ia2Obj) { + setInetAddress_addr(env, ia2Obj, htonl(((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr)); + (*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj); ++ } else { ++ return NULL; + } + } + (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask); + (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj); ++ } else { ++ return NULL; + } + } + +@@ -700,20 +729,20 @@ + setInet6Address_scopeid(env, iaObj, scope); + setInet6Address_scopeifname(env, iaObj, netifObj); + } ++ } else { ++ return NULL; + } + ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID); + if (ibObj) { + (*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj); + (*env)->SetShortField(env, ibObj, ni_ib4maskID, addrP->mask); + (*env)->SetObjectArrayElement(env, bindArr, bind_index++, ibObj); ++ } else { ++ return NULL; + } + } + #endif + +- if (iaObj == NULL) { +- return NULL; +- } +- + (*env)->SetObjectArrayElement(env, addrArr, addr_index++, iaObj); + addrP = addrP->next; + } +@@ -905,9 +934,14 @@ + // Deal with broadcast addr & subnet mask + struct sockaddr * brdcast_to = (struct sockaddr *) ((char *) addrP + sizeof(netaddr) + addr_size); + addrP->brdcast = getBroadcast(env, sock, name, brdcast_to ); +- +- if ((mask = getSubnet(env, sock, name)) != -1) ++ if ((*env)->ExceptionCheck(env) == JNI_TRUE) { ++ return ifs; ++ } ++ if ((mask = getSubnet(env, sock, name)) != -1) { + addrP->mask = mask; ++ } else if((*env)->ExceptionCheck(env)) { ++ return ifs; ++ } + } + + /** +@@ -1041,8 +1075,8 @@ + } + + +-/** Linux **/ +-#ifdef __linux__ ++/** Linux, AIX **/ ++#if defined(__linux__) || defined(_AIX) + /* Open socket for further ioct calls, try v4 socket first and + * if it falls return v6 socket + */ +@@ -1080,11 +1114,13 @@ + static netif *enumIPv4Interfaces(JNIEnv *env, int sock, netif *ifs) { + struct ifconf ifc; + struct ifreq *ifreqP; +- char *buf; ++ char *buf = NULL; + int numifs; + unsigned i; ++ int siocgifconfRequest = SIOCGIFCONF; + + ++#if defined(__linux__) + /* need to do a dummy SIOCGIFCONF to determine the buffer size. + * SIOCGIFCOUNT doesn't work + */ +@@ -1093,11 +1129,21 @@ + NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed"); + return ifs; + } ++#elif defined(_AIX) ++ ifc.ifc_buf = NULL; ++ if (ioctl(sock, SIOCGSIZIFCONF, &(ifc.ifc_len)) < 0) { ++ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGSIZIFCONF failed"); ++ return ifs; ++ } ++#endif /* __linux__ */ + + CHECKED_MALLOC3(buf,char *, ifc.ifc_len); + + ifc.ifc_buf = buf; +- if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) { ++#if defined(_AIX) ++ siocgifconfRequest = CSIOCGIFCONF; ++#endif ++ if (ioctl(sock, siocgifconfRequest, (char *)&ifc) < 0) { + NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "ioctl SIOCGIFCONF failed"); + (void) free(buf); + return ifs; +@@ -1108,6 +1154,9 @@ + */ + ifreqP = ifc.ifc_req; + for (i=0; i<ifc.ifc_len/sizeof (struct ifreq); i++, ifreqP++) { ++#if defined(_AIX) ++ if (ifreqP->ifr_addr.sa_family != AF_INET) continue; ++#endif + /* + * Add to the list + */ +@@ -1135,7 +1184,7 @@ + * Enumerates and returns all IPv6 interfaces on Linux + */ + +-#ifdef AF_INET6 ++#if defined(AF_INET6) && defined(__linux__) + static netif *enumIPv6Interfaces(JNIEnv *env, int sock, netif *ifs) { + FILE *f; + char addr6[40], devname[21]; +@@ -1179,11 +1228,108 @@ + #endif + + ++/* ++ * Enumerates and returns all IPv6 interfaces on AIX ++ */ ++ ++#if defined(AF_INET6) && defined(_AIX) ++static netif *enumIPv6Interfaces(JNIEnv *env, int sock, netif *ifs) { ++ struct ifconf ifc; ++ struct ifreq *ifreqP; ++ char *buf; ++ int numifs; ++ unsigned i; ++ unsigned bufsize; ++ char *cp, *cplimit; ++ ++ /* use SIOCGSIZIFCONF to get size for SIOCGIFCONF */ ++ ++ ifc.ifc_buf = NULL; ++ if (ioctl(sock, SIOCGSIZIFCONF, &(ifc.ifc_len)) < 0) { ++ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", ++ "ioctl SIOCGSIZIFCONF failed"); ++ return ifs; ++ } ++ bufsize = ifc.ifc_len; ++ ++ buf = (char *)malloc(bufsize); ++ if (!buf) { ++ JNU_ThrowOutOfMemoryError(env, "Network interface native buffer allocation failed"); ++ return ifs; ++ } ++ ifc.ifc_len = bufsize; ++ ifc.ifc_buf = buf; ++ if (ioctl(sock, SIOCGIFCONF, (char *)&ifc) < 0) { ++ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", ++ "ioctl CSIOCGIFCONF failed"); ++ free(buf); ++ return ifs; ++ } ++ ++ /* ++ * Iterate through each interface ++ */ ++ ifreqP = ifc.ifc_req; ++ cp = (char *)ifc.ifc_req; ++ cplimit = cp + ifc.ifc_len; ++ ++ for ( ; cp < cplimit; cp += (sizeof(ifreqP->ifr_name) + MAX((ifreqP->ifr_addr).sa_len, sizeof(ifreqP->ifr_addr)))) { ++ ifreqP = (struct ifreq *)cp; ++ struct ifreq if2; ++ ++ memset((char *)&if2, 0, sizeof(if2)); ++ strcpy(if2.ifr_name, ifreqP->ifr_name); ++ ++ /* ++ * Skip interface that aren't UP ++ */ ++ if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2) >= 0) { ++ if (!(if2.ifr_flags & IFF_UP)) { ++ continue; ++ } ++ } ++ ++ if (ifreqP->ifr_addr.sa_family != AF_INET6) ++ continue; ++ ++ if (ioctl(sock, SIOCGIFSITE6, (char *)&if2) >= 0) { ++ struct sockaddr_in6 *s6= (struct sockaddr_in6 *)&(ifreqP->ifr_addr); ++ s6->sin6_scope_id = if2.ifr_site6; ++ } ++ ++ /* ++ * Add to the list ++ */ ++ ifs = addif(env, sock, ifreqP->ifr_name, ifs, ++ (struct sockaddr *)&(ifreqP->ifr_addr), ++ AF_INET6, 0); ++ ++ /* ++ * If an exception occurred then free the list ++ */ ++ if ((*env)->ExceptionOccurred(env)) { ++ free(buf); ++ freeif(ifs); ++ return NULL; ++ } ++ } ++ ++ /* ++ * Free socket and buffer ++ */ ++ free(buf); ++ return ifs; ++} ++#endif ++ ++ + static int getIndex(int sock, const char *name){ + /* + * Try to get the interface index +- * (Not supported on Solaris 2.6 or 7) + */ ++#if defined(_AIX) ++ return if_nametoindex(name); ++#else + struct ifreq if2; + strcpy(if2.ifr_name, name); + +@@ -1192,6 +1338,7 @@ + } + + return if2.ifr_ifindex; ++#endif + } + + /** +@@ -1258,6 +1405,47 @@ + * MAC address. Returns -1 if there is no hardware address on that interface. + */ + static int getMacAddress(JNIEnv *env, int sock, const char* ifname, const struct in_addr* addr, unsigned char *buf) { ++#if defined (_AIX) ++ int size; ++ struct kinfo_ndd *nddp; ++ void *end; ++ ++ size = getkerninfo(KINFO_NDD, 0, 0, 0); ++ if (size == 0) { ++ return -1; ++ } ++ ++ if (size < 0) { ++ perror("getkerninfo 1"); ++ return -1; ++ } ++ ++ nddp = (struct kinfo_ndd *)malloc(size); ++ ++ if (!nddp) { ++ JNU_ThrowOutOfMemoryError(env, "Network interface getMacAddress native buffer allocation failed"); ++ return -1; ++ } ++ ++ if (getkerninfo(KINFO_NDD, nddp, &size, 0) < 0) { ++ perror("getkerninfo 2"); ++ return -1; ++ } ++ ++ end = (void *)nddp + size; ++ while ((void *)nddp < end) { ++ if (!strcmp(nddp->ndd_alias, ifname) || ++ !strcmp(nddp->ndd_name, ifname)) { ++ bcopy(nddp->ndd_addr, buf, 6); ++ return 6; ++ } else { ++ nddp++; ++ } ++ } ++ ++ return -1; ++ ++#elif defined(__linux__) + static struct ifreq ifr; + int i; + +@@ -1279,6 +1467,7 @@ + } + + return -1; ++#endif + } + + static int getMTU(JNIEnv *env, int sock, const char *ifname) { +--- ./jdk/src/solaris/native/java/net/PlainSocketImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/PlainSocketImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -964,7 +964,7 @@ + } + + if (NET_SetSockOpt(fd, level, optname, (const void *)&optval, optlen) < 0) { +-#ifdef __solaris__ ++#if defined(__solaris__) || defined(_AIX) + if (errno == EINVAL) { + // On Solaris setsockopt will set errno to EINVAL if the socket + // is closed. The default error message is then confusing +--- ./jdk/src/solaris/native/java/net/net_util_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/net_util_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -737,14 +737,23 @@ + return 0; + } + +-void initLocalAddrTable () { ++void platformInit () { + initLoopbackRoutes(); + initLocalIfs(); + } + ++#elif defined(_AIX) ++ ++/* Initialize stubs for blocking I/O workarounds (see src/solaris/native/java/net/linux_close.c) */ ++extern void aix_close_init(); ++ ++void platformInit () { ++ aix_close_init(); ++} ++ + #else + +-void initLocalAddrTable () {} ++void platformInit () {} + + #endif + +@@ -1271,6 +1280,7 @@ + NET_SetSockOpt(int fd, int level, int opt, const void *arg, + int len) + { ++ + #ifndef IPTOS_TOS_MASK + #define IPTOS_TOS_MASK 0x1e + #endif +@@ -1291,9 +1301,6 @@ + #else + static long maxsockbuf = -1; + #endif +- +- int addopt; +- struct linger *ling; + #endif + + /* +@@ -1386,6 +1393,29 @@ + } + #endif + ++#ifdef _AIX ++ if (level == SOL_SOCKET) { ++ if (opt == SO_SNDBUF || opt == SO_RCVBUF) { ++ /* ++ * Just try to set the requested size. If it fails we will leave the ++ * socket option as is. Setting the buffer size means only a hint in ++ * the jse2/java software layer, see javadoc. In the previous ++ * solution the buffer has always been truncated to a length of ++ * 0x100000 Byte, even if the technical limit has not been reached. ++ * This kind of absolute truncation was unexpected in the jck tests. ++ */ ++ int ret = setsockopt(fd, level, opt, arg, len); ++ if ((ret == 0) || (ret == -1 && errno == ENOBUFS)) { ++ // Accept failure because of insufficient buffer memory resources. ++ return 0; ++ } else { ++ // Deliver all other kinds of errors. ++ return ret; ++ } ++ } ++ } ++#endif ++ + /* + * On Linux the receive buffer is used for both socket + * structures and the the packet payload. The implication +@@ -1442,10 +1472,12 @@ + + } + } ++#endif + ++#if defined(_ALLBSD_SOURCE) || defined(_AIX) + /* + * On Solaris, SO_REUSEADDR will allow multiple datagram +- * sockets to bind to the same port. The network jck tests ++ * sockets to bind to the same port. The network jck tests check + * for this "feature", so we need to emulate it by turning on + * SO_REUSEPORT as well for that combination. + */ +@@ -1459,11 +1491,9 @@ + } + + if (sotype == SOCK_DGRAM) { +- addopt = SO_REUSEPORT; +- setsockopt(fd, level, addopt, arg, len); ++ setsockopt(fd, level, SO_REUSEPORT, arg, len); + } + } +- + #endif + + return setsockopt(fd, level, opt, arg, len); +@@ -1633,7 +1663,7 @@ + if (timeout <= 0) { + return read_rv > 0 ? 0 : -1; + } +- newTime = prevTime; ++ prevTime = newTime; + + if (read_rv > 0) { + break; +--- ./jdk/src/solaris/native/java/net/net_util_md.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/net_util_md.h Wed Jul 30 18:42:59 2014 +0100 +@@ -37,7 +37,17 @@ + #endif + + +-#if defined(__linux__) || defined(MACOSX) ++/* ++ AIX needs a workaround for I/O cancellation, see: ++ http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/close.htm ++ ... ++ The close subroutine is blocked until all subroutines which use the file ++ descriptor return to usr space. For example, when a thread is calling close ++ and another thread is calling select with the same file descriptor, the ++ close subroutine does not return until the select call returns. ++ ... ++*/ ++#if defined(__linux__) || defined(MACOSX) || defined (_AIX) + extern int NET_Timeout(int s, long timeout); + extern int NET_Read(int s, void* buf, size_t len); + extern int NET_RecvFrom(int s, void *buf, int len, unsigned int flags, +@@ -83,7 +93,46 @@ + + #ifdef __solaris__ + extern int net_getParam(char *driver, char *param); +-#endif ++ ++#ifndef SO_FLOW_SLA ++#define SO_FLOW_SLA 0x1018 ++ ++#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 ++#pragma pack(4) ++ #endif ++ ++/* ++ * Used with the setsockopt(SO_FLOW_SLA, ...) call to set ++ * per socket service level properties. ++ * When the application uses per-socket API, we will enforce the properties ++ * on both outbound and inbound packets. ++ * ++ * For now, only priority and maxbw are supported in SOCK_FLOW_PROP_VERSION1. ++ */ ++typedef struct sock_flow_props_s { ++ int sfp_version; ++ uint32_t sfp_mask; ++ int sfp_priority; /* flow priority */ ++ uint64_t sfp_maxbw; /* bandwidth limit in bps */ ++ int sfp_status; /* flow create status for getsockopt */ ++} sock_flow_props_t; ++ ++#define SOCK_FLOW_PROP_VERSION1 1 ++ ++/* bit mask values for sfp_mask */ ++#define SFP_MAXBW 0x00000001 /* Flow Bandwidth Limit */ ++#define SFP_PRIORITY 0x00000008 /* Flow priority */ ++ ++/* possible values for sfp_priority */ ++#define SFP_PRIO_NORMAL 1 ++#define SFP_PRIO_HIGH 2 ++ ++#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 ++#pragma pack() ++#endif /* _LONG_LONG_ALIGNMENT */ ++ ++#endif /* SO_FLOW_SLA */ ++#endif /* __solaris__ */ + + /* needed from libsocket on Solaris 8 */ + +--- ./jdk/src/solaris/native/java/util/FileSystemPreferences.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/java/util/FileSystemPreferences.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -38,12 +38,14 @@ + JNIEXPORT jint JNICALL + Java_java_util_prefs_FileSystemPreferences_chmod(JNIEnv *env, + jclass thisclass, jstring java_fname, jint permission) { +- const char *fname = JNU_GetStringPlatformChars(env, java_fname, JNI_FALSE); +- int result; +- result = chmod(fname, permission); +- if (result != 0) +- result = errno; +- JNU_ReleaseStringPlatformChars(env, java_fname, fname); ++ const char *fname = JNU_GetStringPlatformChars(env, java_fname, NULL); ++ int result = -1; ++ if (fname) { ++ result = chmod(fname, permission); ++ if (result != 0) ++ result = errno; ++ JNU_ReleaseStringPlatformChars(env, java_fname, fname); ++ } + return (jint) result; + } + +@@ -61,13 +63,16 @@ + JNIEXPORT jintArray JNICALL + Java_java_util_prefs_FileSystemPreferences_lockFile0(JNIEnv *env, + jclass thisclass, jstring java_fname, jint permission, jboolean shared) { +- const char *fname = JNU_GetStringPlatformChars(env, java_fname, JNI_FALSE); ++ const char *fname = JNU_GetStringPlatformChars(env, java_fname, NULL); + int fd, rc; + int result[2]; +- jintArray javaResult; ++ jintArray javaResult = NULL; + int old_umask; + FLOCK fl; + ++ if (!fname) ++ return javaResult; ++ + fl.l_whence = SEEK_SET; + fl.l_len = 0; + fl.l_start = 0; +@@ -104,7 +109,8 @@ + } + JNU_ReleaseStringPlatformChars(env, java_fname, fname); + javaResult = (*env)->NewIntArray(env,2); +- (*env)->SetIntArrayRegion(env, javaResult, 0, 2, result); ++ if (javaResult) ++ (*env)->SetIntArrayRegion(env, javaResult, 0, 2, result); + return javaResult; + } + +--- ./jdk/src/solaris/native/java/util/TimeZone_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/java/util/TimeZone_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -56,6 +56,9 @@ + static const char *ZONEINFO_DIR = "/usr/share/zoneinfo"; + static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime"; + #else ++#ifdef _AIX ++static const char *ETC_ENVIRONMENT_FILE = "/etc/environment"; ++#endif + static const char *SYS_INIT_FILE = "/etc/default/init"; + static const char *ZONEINFO_DIR = "/usr/share/lib/zoneinfo"; + static const char *DEFAULT_ZONEINFO_FILE = "/usr/share/lib/zoneinfo/localtime"; +@@ -123,7 +126,7 @@ + return NULL; + } + +-#if defined(__linux__) || defined(MACOSX) || (defined(__solaris__) \ ++#if defined(_AIX) || defined(__linux__) || defined(MACOSX) || (defined(__solaris__) \ + && (defined(_POSIX_PTHREAD_SEMANTICS) || defined(_LP64))) + while (readdir_r(dirp, entry, &dp) == 0 && dp != NULL) { + #else +@@ -615,6 +618,35 @@ + #endif /*__solaris__*/ + #endif /*__linux__*/ + ++#ifdef _AIX ++static char * ++getPlatformTimeZoneID() ++{ ++ FILE *fp; ++ char *tz = NULL; ++ char *tz_key = "TZ="; ++ char line[256]; ++ size_t tz_key_len = strlen(tz_key); ++ ++ if ((fp = fopen(ETC_ENVIRONMENT_FILE, "r")) != NULL) { ++ while (fgets(line, sizeof(line), fp) != NULL) { ++ char *p = strchr(line, '\n'); ++ if (p != NULL) { ++ *p = '\0'; ++ } ++ if (0 == strncmp(line, tz_key, tz_key_len)) { ++ tz = strdup(line + tz_key_len); ++ break; ++ } ++ } ++ (void) fclose(fp); ++ } ++ ++ return tz; ++} ++static char *mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz); ++#endif ++ + /* + * findJavaTZ_md() maps platform time zone ID to Java time zone ID + * using <java_home>/lib/tzmappings. If the TZ value is not found, it +@@ -635,7 +667,7 @@ + #if defined(__linux__) || defined(_ALLBSD_SOURCE) + if (tz == NULL) { + #else +-#ifdef __solaris__ ++#if defined (__solaris__) || defined(_AIX) + if (tz == NULL || *tz == '\0') { + #endif + #endif +@@ -670,9 +702,19 @@ + if (freetz != NULL) { + free((void *) freetz); + } ++ ++#ifdef _AIX ++ freetz = mapPlatformToJavaTimezone(java_home_dir, javatz); ++ if (javatz != NULL) { ++ free((void *) javatz); ++ } ++ javatz = freetz; ++#endif + } ++ + return javatz; + } ++ + /** + * Returns a GMT-offset-based zone ID. (e.g., "GMT-08:00") + */ +@@ -739,3 +781,101 @@ + return strdup(buf); + } + #endif /* MACOSX */ ++ ++#ifdef _AIX ++static char * ++mapPlatformToJavaTimezone(const char *java_home_dir, const char *tz) { ++ FILE *tzmapf; ++ char mapfilename[PATH_MAX+1]; ++ char line[256]; ++ int linecount = 0; ++ char temp[100], *temp_tz; ++ char *javatz = NULL; ++ char *str_tmp = NULL; ++ size_t temp_tz_len = 0; ++ ++ /* On AIX, the TZ environment variable may end with a comma ++ * followed by modifier fields. These are ignored here. ++ */ ++ strncpy(temp, tz, 100); ++ temp_tz = strtok_r(temp, ",", &str_tmp); ++ ++ if(temp_tz == NULL) ++ goto tzerr; ++ ++ temp_tz_len = strlen(temp_tz); ++ ++ if (strlen(java_home_dir) >= (PATH_MAX - 15)) { ++ jio_fprintf(stderr, "java.home longer than maximum path length \n"); ++ goto tzerr; ++ } ++ ++ strncpy(mapfilename, java_home_dir, PATH_MAX); ++ strcat(mapfilename, "/lib/tzmappings"); ++ ++ if ((tzmapf = fopen(mapfilename, "r")) == NULL) { ++ jio_fprintf(stderr, "can't open %s\n", mapfilename); ++ goto tzerr; ++ } ++ ++ while (fgets(line, sizeof(line), tzmapf) != NULL) { ++ char *p = line; ++ char *sol = line; ++ char *java; ++ int result; ++ ++ linecount++; ++ /* ++ * Skip comments and blank lines ++ */ ++ if (*p == '#' || *p == '\n') { ++ continue; ++ } ++ ++ /* ++ * Get the first field, platform zone ID ++ */ ++ while (*p != '\0' && *p != '\t') { ++ p++; ++ } ++ if (*p == '\0') { ++ /* mapping table is broken! */ ++ jio_fprintf(stderr, "tzmappings: Illegal format at near line %d.\n", linecount); ++ break; ++ } ++ ++ *p++ = '\0'; ++ if ((result = strncmp(temp_tz, sol, temp_tz_len)) == 0) { ++ /* ++ * If this is the current platform zone ID, ++ * take the Java time zone ID (2nd field). ++ */ ++ java = p; ++ while (*p != '\0' && *p != '\n') { ++ p++; ++ } ++ ++ if (*p == '\0') { ++ /* mapping table is broken! */ ++ jio_fprintf(stderr, "tzmappings: Illegal format at line %d.\n", linecount); ++ break; ++ } ++ ++ *p = '\0'; ++ javatz = strdup(java); ++ break; ++ } else if (result < 0) { ++ break; ++ } ++ } ++ (void) fclose(tzmapf); ++ ++tzerr: ++ if (javatz == NULL) { ++ return getGMTOffsetID(); ++ } ++ ++ return javatz; ++} ++#endif ++ +--- ./jdk/src/solaris/native/sun/awt/CUPSfuncs.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/CUPSfuncs.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -213,6 +213,8 @@ + + name = (*env)->GetStringUTFChars(env, printer, NULL); + if (name == NULL) { ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not create printer name"); + return NULL; + } + +@@ -220,12 +222,10 @@ + // unlink() must be caled to remove the file when finished using it. + filename = j2d_cupsGetPPD(name); + (*env)->ReleaseStringUTFChars(env, printer, name); ++ CHECK_NULL_RETURN(filename, NULL); + + cls = (*env)->FindClass(env, "java/lang/String"); +- +- if (filename == NULL) { +- return NULL; +- } ++ CHECK_NULL_RETURN(cls, NULL); + + if ((ppd = j2d_ppdOpenFile(filename)) == NULL) { + unlink(filename); +@@ -249,6 +249,7 @@ + unlink(filename); + j2d_ppdClose(ppd); + DPRINTF("CUPSfuncs::bad alloc new array\n", "") ++ (*env)->ExceptionClear(env); + JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); + return NULL; + } +@@ -323,6 +324,11 @@ + ppd_size_t *size; + + const char *name = (*env)->GetStringUTFChars(env, printer, NULL); ++ if (name == NULL) { ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not create printer name"); ++ return NULL; ++ } + const char *filename; + int i; + jobjectArray sizeArray = NULL; +@@ -332,9 +338,7 @@ + // unlink() must be called to remove the file after using it. + filename = j2d_cupsGetPPD(name); + (*env)->ReleaseStringUTFChars(env, printer, name); +- if (filename == NULL) { +- return NULL; +- } ++ CHECK_NULL_RETURN(filename, NULL); + if ((ppd = j2d_ppdOpenFile(filename)) == NULL) { + unlink(filename); + DPRINTF("unable to open PPD %s\n", filename) +@@ -350,11 +354,19 @@ + unlink(filename); + j2d_ppdClose(ppd); + DPRINTF("CUPSfuncs::bad alloc new float array\n", "") ++ (*env)->ExceptionClear(env); + JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); + return NULL; + } + + dims = (*env)->GetFloatArrayElements(env, sizeArray, NULL); ++ if (dims == NULL) { ++ unlink(filename); ++ j2d_ppdClose(ppd); ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not create printer name"); ++ return NULL; ++ } + for (i = 0; i<option->num_choices; i++) { + choice = (option->choices)+i; + size = j2d_ppdPageSize(ppd, choice->choice); +--- ./jdk/src/solaris/native/sun/awt/X11Color.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/X11Color.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -892,11 +892,10 @@ + jmethodID mid; + + clazz = (*env)->FindClass(env,"java/awt/color/ColorSpace"); ++ CHECK_NULL_RETURN(clazz, NULL); + mid = (*env)->GetStaticMethodID(env, clazz, "getInstance", + "(I)Ljava/awt/color/ColorSpace;"); +- if (mid == NULL) { +- return NULL; +- } ++ CHECK_NULL_RETURN(mid, NULL); + + /* SECURITY: This is safe, because static methods cannot + * be overridden, and this method does not invoke +@@ -919,6 +918,11 @@ + (aData->awt_depth >= 15)) + { + clazz = (*env)->FindClass(env,"java/awt/image/DirectColorModel"); ++ if (clazz == NULL) { ++ (*env)->PopLocalFrame(env, 0); ++ return NULL; ++ } ++ + if (!aData->isTranslucencySupported) { + + mid = (*env)->GetMethodID(env,clazz,"<init>","(IIIII)V"); +@@ -1005,6 +1009,10 @@ + } + + clazz = (*env)->FindClass(env,"java/awt/image/ComponentColorModel"); ++ if (clazz == NULL) { ++ (*env)->PopLocalFrame(env, 0); ++ return NULL; ++ } + + mid = (*env)->GetMethodID(env,clazz,"<init>", + "(Ljava/awt/color/ColorSpace;[IZZII)V"); +@@ -1253,6 +1261,7 @@ + if (!JNU_IsNull(env,this)) + { + SYSCLR_class = (*env)->FindClass(env, "java/awt/SystemColor"); ++ CHECK_NULL_RETURN(SYSCLR_class, 0); + + if ((*env)->IsInstanceOf(env, this, SYSCLR_class)) { + /* SECURITY: This is safe, because there is no way +@@ -1264,6 +1273,7 @@ + ,this + ,"getRGB" + ,"()I").i; ++ JNU_CHECK_EXCEPTION_RETURN(env, 0); + } else { + col = (int)(*env)->GetIntField(env,this,colorValueID); + } +@@ -1370,6 +1380,8 @@ + AWT_UNLOCK (); + } + sysColors = (*env)->FindClass (env, "java/awt/SystemColor"); ++ CHECK_NULL(sysColors); ++ + if (lock) { + AWT_LOCK (); + } +@@ -1377,6 +1389,13 @@ + "systemColors", + "[I"); + ++ if (colorID == NULL) { ++ if (lock) { ++ AWT_UNLOCK(); ++ } ++ return; ++ } ++ + colors = (jintArray) (*env)->GetStaticObjectField + (env, sysColors, colorID); + +--- ./jdk/src/solaris/native/sun/awt/awt.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -77,8 +77,22 @@ + + #define AWT_LOCK_IMPL() \ + (*env)->CallStaticVoidMethod(env, tkClass, awtLockMID) ++ + #define AWT_NOFLUSH_UNLOCK_IMPL() \ +- (*env)->CallStaticVoidMethod(env, tkClass, awtUnlockMID) ++ do { \ ++ jthrowable pendingException; \ ++ if ((pendingException = (*env)->ExceptionOccurred(env)) != NULL) { \ ++ (*env)->ExceptionClear(env); \ ++ } \ ++ (*env)->CallStaticVoidMethod(env, tkClass, awtUnlockMID); \ ++ if (pendingException) { \ ++ if ((*env)->ExceptionCheck(env)) { \ ++ (*env)->ExceptionDescribe(env); \ ++ (*env)->ExceptionClear(env); \ ++ } \ ++ (*env)->Throw(env, pendingException); \ ++ } \ ++ } while (0) + #define AWT_WAIT_IMPL(tm) \ + (*env)->CallStaticVoidMethod(env, tkClass, awtWaitMID, (jlong)(tm)) + #define AWT_NOTIFY_IMPL() \ +--- ./jdk/src/solaris/native/sun/awt/awt_AWTEvent.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_AWTEvent.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2011, 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 +@@ -49,22 +49,22 @@ + JNIEXPORT void JNICALL + Java_java_awt_AWTEvent_initIDs(JNIEnv *env, jclass cls) + { +- awtEventIDs.bdata = (*env)->GetFieldID(env, cls, "bdata", "[B"); +- awtEventIDs.consumed = (*env)->GetFieldID(env, cls, "consumed", "Z"); +- awtEventIDs.id = (*env)->GetFieldID(env, cls, "id", "I"); ++ CHECK_NULL(awtEventIDs.bdata = (*env)->GetFieldID(env, cls, "bdata", "[B")); ++ CHECK_NULL(awtEventIDs.consumed = (*env)->GetFieldID(env, cls, "consumed", "Z")); ++ CHECK_NULL(awtEventIDs.id = (*env)->GetFieldID(env, cls, "id", "I")); + } + + JNIEXPORT void JNICALL + Java_java_awt_event_InputEvent_initIDs(JNIEnv *env, jclass cls) + { +- inputEventIDs.modifiers = (*env)->GetFieldID(env, cls, "modifiers", "I"); ++ CHECK_NULL(inputEventIDs.modifiers = (*env)->GetFieldID(env, cls, "modifiers", "I")); + } + + JNIEXPORT void JNICALL + Java_java_awt_event_KeyEvent_initIDs(JNIEnv *env, jclass cls) + { +- keyEventIDs.keyCode = (*env)->GetFieldID(env, cls, "keyCode", "I"); +- keyEventIDs.keyChar = (*env)->GetFieldID(env, cls, "keyChar", "C"); ++ CHECK_NULL(keyEventIDs.keyCode = (*env)->GetFieldID(env, cls, "keyCode", "I")); ++ CHECK_NULL(keyEventIDs.keyChar = (*env)->GetFieldID(env, cls, "keyChar", "C")); + } + + JNIEXPORT void JNICALL +--- ./jdk/src/solaris/native/sun/awt/awt_DrawingSurface.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_DrawingSurface.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -78,6 +78,8 @@ + + /* Make sure the target is a java.awt.Component */ + componentClass = (*env)->FindClass(env, "java/awt/Component"); ++ CHECK_NULL_RETURN(componentClass, (jint)JAWT_LOCK_ERROR); ++ + if (!(*env)->IsInstanceOf(env, target, componentClass)) { + #ifdef DEBUG + fprintf(stderr, "Target is not a component\n"); +@@ -126,6 +128,8 @@ + + /* Make sure the target is a java.awt.Component */ + componentClass = (*env)->FindClass(env, "java/awt/Component"); ++ CHECK_NULL_RETURN(componentClass, (int32_t) 0); ++ + if (!(*env)->IsInstanceOf(env, target, componentClass)) { + #ifdef DEBUG + fprintf(stderr, "DrawingSurface target must be a component\n"); +@@ -195,6 +199,8 @@ + + /* Make sure the target is a java.awt.Component */ + componentClass = (*env)->FindClass(env, "java/awt/Component"); ++ CHECK_NULL_RETURN(componentClass, NULL); ++ + if (!(*env)->IsInstanceOf(env, target, componentClass)) { + #ifdef DEBUG + fprintf(stderr, "DrawingSurface target must be a component\n"); +@@ -292,6 +298,8 @@ + + /* Make sure the target component is a java.awt.Component */ + componentClass = (*env)->FindClass(env, "java/awt/Component"); ++ CHECK_NULL_RETURN(componentClass, NULL); ++ + if (!(*env)->IsInstanceOf(env, target, componentClass)) { + #ifdef DEBUG + fprintf(stderr, +@@ -354,6 +362,10 @@ + if (window != None) { + peer = JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", + "windowToXWindow", "(J)Lsun/awt/X11/XBaseWindow;", (jlong)window).l; ++ if ((*env)->ExceptionCheck(env)) { ++ AWT_UNLOCK(); ++ return (jobject)NULL; ++ } + } + if ((peer != NULL) && + (JNU_IsInstanceOfByName(env, peer, "sun/awt/X11/XWindow") == 1)) { +@@ -361,6 +373,7 @@ + } + + if (target == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowNullPointerException(env, "NullPointerException"); + AWT_UNLOCK(); + return (jobject)NULL; +--- ./jdk/src/solaris/native/sun/awt/awt_Font.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_Font.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -86,14 +86,13 @@ + #ifndef HEADLESS + /** We call "NoClientCode" methods because they won't invoke client + code on the privileged toolkit thread **/ +- fontIDs.pData = (*env)->GetFieldID(env, cls, "pData", "J"); +- fontIDs.style = (*env)->GetFieldID(env, cls, "style", "I"); +- fontIDs.size = (*env)->GetFieldID(env, cls, "size", "I"); +- fontIDs.getPeer = (*env)->GetMethodID(env, cls, "getPeer_NoClientCode", +- "()Ljava/awt/peer/FontPeer;"); +- fontIDs.getFamily = +- (*env)->GetMethodID(env, cls, "getFamily_NoClientCode", +- "()Ljava/lang/String;"); ++ CHECK_NULL(fontIDs.pData = (*env)->GetFieldID(env, cls, "pData", "J")); ++ CHECK_NULL(fontIDs.style = (*env)->GetFieldID(env, cls, "style", "I")); ++ CHECK_NULL(fontIDs.size = (*env)->GetFieldID(env, cls, "size", "I")); ++ CHECK_NULL(fontIDs.getPeer = (*env)->GetMethodID(env, cls, "getPeer_NoClientCode", ++ "()Ljava/awt/peer/FontPeer;")); ++ CHECK_NULL(fontIDs.getFamily = (*env)->GetMethodID(env, cls, "getFamily_NoClientCode", ++ "()Ljava/lang/String;")); + #endif /* !HEADLESS */ + } + +@@ -120,12 +119,10 @@ + (JNIEnv *env, jclass cls) + { + #ifndef HEADLESS +- fontDescriptorIDs.nativeName = +- (*env)->GetFieldID(env, cls, "nativeName", +- "Ljava/lang/String;"); +- fontDescriptorIDs.charsetName = +- (*env)->GetFieldID(env, cls, "charsetName", +- "Ljava/lang/String;"); ++ CHECK_NULL(fontDescriptorIDs.nativeName = ++ (*env)->GetFieldID(env, cls, "nativeName", "Ljava/lang/String;")); ++ CHECK_NULL(fontDescriptorIDs.charsetName = ++ (*env)->GetFieldID(env, cls, "charsetName", "Ljava/lang/String;")); + #endif /* !HEADLESS */ + } + +@@ -144,20 +141,18 @@ + (JNIEnv *env, jclass cls) + { + #ifndef HEADLESS +- platformFontIDs.componentFonts = +- (*env)->GetFieldID(env, cls, "componentFonts", +- "[Lsun/awt/FontDescriptor;"); +- platformFontIDs.fontConfig = +- (*env)->GetFieldID(env,cls, "fontConfig", +- "Lsun/awt/FontConfiguration;"); +- +- platformFontIDs.makeConvertedMultiFontString = +- (*env)->GetMethodID(env, cls, "makeConvertedMultiFontString", +- "(Ljava/lang/String;)[Ljava/lang/Object;"); +- +- platformFontIDs.makeConvertedMultiFontChars = +- (*env)->GetMethodID(env, cls, "makeConvertedMultiFontChars", +- "([CII)[Ljava/lang/Object;"); ++ CHECK_NULL(platformFontIDs.componentFonts = ++ (*env)->GetFieldID(env, cls, "componentFonts", ++ "[Lsun/awt/FontDescriptor;")); ++ CHECK_NULL(platformFontIDs.fontConfig = ++ (*env)->GetFieldID(env,cls, "fontConfig", ++ "Lsun/awt/FontConfiguration;")); ++ CHECK_NULL(platformFontIDs.makeConvertedMultiFontString = ++ (*env)->GetMethodID(env, cls, "makeConvertedMultiFontString", ++ "(Ljava/lang/String;)[Ljava/lang/Object;")); ++ CHECK_NULL(platformFontIDs.makeConvertedMultiFontChars = ++ (*env)->GetMethodID(env, cls, "makeConvertedMultiFontChars", ++ "([CII)[Ljava/lang/Object;")); + #endif /* !HEADLESS */ + } + +@@ -385,6 +380,11 @@ + return 0; + } + cname = (char *) JNU_GetStringPlatformChars(env, name, NULL); ++ if (cname == NULL) { ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not create font name"); ++ return 0; ++ } + + /* additional default font names */ + if (strcmp(cname, "serif") == 0) { +@@ -448,6 +448,8 @@ + } + + if (!JNU_IsNull(env, font) && awtJNI_IsMultiFont(env, font)) { ++ JNU_CHECK_EXCEPTION_RETURN(env, NULL); ++ + struct FontData *fdata = NULL; + int32_t i, size; + char *fontsetname = NULL; +@@ -513,6 +515,11 @@ + + fdata->flist[i].charset_name = (char *) + JNU_GetStringPlatformChars(env, charsetName, NULL); ++ if (fdata->flist[i].charset_name == NULL) { ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not create charset name"); ++ return NULL; ++ } + + /* We are done with the objects. */ + (*env)->DeleteLocalRef(env, fontDescriptor); +@@ -540,6 +547,19 @@ + fdata->xfont = fdata->flist[i].xfont; + fdata->flist[i].index_length = 1; + } else { ++ /* Free any already allocated storage and fonts */ ++ int j = i; ++ for (j = 0; j <= i; j++) { ++ free((void *)fdata->flist[j].xlfd); ++ JNU_ReleaseStringPlatformChars(env, NULL, ++ fdata->flist[j].charset_name); ++ if (fdata->flist[j].load) { ++ XFreeFont(awt_display, fdata->flist[j].xfont); ++ } ++ } ++ free((void *)fdata->flist); ++ free((void *)fdata); ++ + if (errmsg != NULL) { + *errmsg = "java/lang" "NullPointerException"; + } +--- ./jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -152,8 +152,11 @@ + x11GraphicsConfigIDs.screen = NULL; + + x11GraphicsConfigIDs.aData = (*env)->GetFieldID (env, cls, "aData", "J"); ++ CHECK_NULL(x11GraphicsConfigIDs.aData); + x11GraphicsConfigIDs.bitsPerPixel = (*env)->GetFieldID (env, cls, "bitsPerPixel", "I"); ++ CHECK_NULL(x11GraphicsConfigIDs.bitsPerPixel); + x11GraphicsConfigIDs.screen = (*env)->GetFieldID (env, cls, "screen", "Lsun/awt/X11GraphicsDevice;"); ++ CHECK_NULL(x11GraphicsConfigIDs.screen); + + if (x11GraphicsConfigIDs.aData == NULL || + x11GraphicsConfigIDs.bitsPerPixel == NULL || +@@ -1346,7 +1349,6 @@ + + /* Make Color Model object for this GraphicsConfiguration */ + colorModel = awtJNI_GetColorModel (env, adata); +- + AWT_UNLOCK (); + + return colorModel; +@@ -1374,6 +1376,7 @@ + JNU_GetLongFieldAsPtr(env, this, x11GraphicsConfigIDs.aData); + + clazz = (*env)->FindClass(env, "java/awt/Rectangle"); ++ CHECK_NULL_RETURN(clazz, NULL); + mid = (*env)->GetMethodID(env, clazz, "<init>", "(IIII)V"); + if (mid != NULL) { + if (usingXinerama) { +@@ -1543,7 +1546,7 @@ + clazz = (*env)->GetObjectClass(env, this); + midAddVisual = (*env)->GetMethodID(env, clazz, "addDoubleBufferVisual", + "(I)V"); +- ++ CHECK_NULL(midAddVisual); + AWT_LOCK(); + rootWindow = RootWindow(awt_display, xinawareScreen); + visScreenInfo = XdbeGetVisualInfo(awt_display, &rootWindow, &n); +@@ -1739,6 +1742,7 @@ + jint validRefreshRate = refreshRate; + + displayModeClass = (*env)->FindClass(env, "java/awt/DisplayMode"); ++ CHECK_NULL_RETURN(displayModeClass, NULL); + if (JNU_IsNull(env, displayModeClass)) { + JNU_ThrowInternalError(env, + "Could not get display mode class"); +@@ -1746,6 +1750,7 @@ + } + + cid = (*env)->GetMethodID(env, displayModeClass, "<init>", "(IIII)V"); ++ CHECK_NULL_RETURN(cid, NULL); + if (cid == NULL) { + JNU_ThrowInternalError(env, + "Could not get display mode constructor"); +@@ -1779,6 +1784,7 @@ + } + mid = (*env)->GetMethodID(env, arrayListClass, "add", + "(Ljava/lang/Object;)Z"); ++ CHECK_NULL(mid); + if (mid == NULL) { + JNU_ThrowInternalError(env, + "Could not get method java.util.ArrayList.add()"); +@@ -1955,6 +1961,9 @@ + size.height, + BIT_DEPTH_MULTI, + rates[j]); ++ if ((*env)->ExceptionCheck(env)) { ++ break; ++ } + } + } + } +--- ./jdk/src/solaris/native/sun/awt/awt_InputMethod.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_InputMethod.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -319,6 +319,7 @@ + JNU_CallMethodByName(env, NULL, pX11IMData->x11inputmethod, + "flushText", + "()V"); ++ JNU_CHECK_EXCEPTION_RETURN(env, NULL); + /* IMPORTANT: + The order of the following calls is critical since "imInstance" may + point to the global reference itself, if "freeX11InputMethodData" is called +@@ -1120,6 +1121,9 @@ + if (text->string.multi_byte != NULL) { + if (pre_draw->text->encoding_is_wchar == False) { + javastr = JNU_NewStringPlatform(env, (const char *)text->string.multi_byte); ++ if (javastr == NULL) { ++ goto finally; ++ } + } else { + char *mbstr = wcstombsdmp(text->string.wide_char, text->length); + if (mbstr == NULL) { +@@ -1127,6 +1131,9 @@ + } + javastr = JNU_NewStringPlatform(env, (const char *)mbstr); + free(mbstr); ++ if (javastr == NULL) { ++ goto finally; ++ } + } + } + if (text->feedback != NULL) { +@@ -1135,6 +1142,7 @@ + + style = (*env)->NewIntArray(env, text->length); + if (JNU_IsNull(env, style)) { ++ (*env)->ExceptionClear(env); + THROW_OUT_OF_MEMORY_ERROR(); + goto finally; + } +@@ -1395,14 +1403,17 @@ + pX11IMData->lookup_buf = 0; + pX11IMData->lookup_buf_len = 0; + +- if (createXIC(env, pX11IMData, (Window)window) +- == False) { ++ if (createXIC(env, pX11IMData, (Window)window) == False) { + destroyX11InputMethodData((JNIEnv *) NULL, pX11IMData); + pX11IMData = (X11InputMethodData *) NULL; ++ if ((*env)->ExceptionCheck(env)) { ++ goto finally; ++ } + } + + setX11InputMethodData(env, this, pX11IMData); + ++finally: + AWT_UNLOCK(); + return (pX11IMData != NULL); + } +--- ./jdk/src/solaris/native/sun/awt/awt_Insets.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_Insets.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2001, 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 +@@ -34,8 +34,8 @@ + JNIEXPORT void JNICALL + Java_java_awt_Insets_initIDs(JNIEnv *env, jclass cls) + { +- insetsIDs.top = (*env)->GetFieldID(env, cls, "top", "I"); +- insetsIDs.bottom = (*env)->GetFieldID(env, cls, "bottom", "I"); +- insetsIDs.left = (*env)->GetFieldID(env, cls, "left", "I"); +- insetsIDs.right = (*env)->GetFieldID(env, cls, "right", "I"); ++ CHECK_NULL(insetsIDs.top = (*env)->GetFieldID(env, cls, "top", "I")); ++ CHECK_NULL(insetsIDs.bottom = (*env)->GetFieldID(env, cls, "bottom", "I")); ++ CHECK_NULL(insetsIDs.left = (*env)->GetFieldID(env, cls, "left", "I")); ++ CHECK_NULL(insetsIDs.right = (*env)->GetFieldID(env, cls, "right", "I")); + } +--- ./jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Wed Jul 30 18:42:59 2014 +0100 +@@ -37,6 +37,10 @@ + + #include "awt_Plugin.h" + ++#ifdef AIX ++#include "porting_aix.h" /* For the 'dladdr' function. */ ++#endif ++ + #ifdef DEBUG + #define VERBOSE_AWT_DEBUG + #endif +@@ -73,11 +77,16 @@ + return isHeadless; + } + ++#define CHECK_EXCEPTION_FATAL(env, message) \ ++ if ((*env)->ExceptionCheck(env)) { \ ++ (*env)->ExceptionClear(env); \ ++ (*env)->FatalError(env, message); \ ++ } ++ + /* + * Pathnames to the various awt toolkits + */ + +- + #ifdef MACOSX + #define LWAWT_PATH "/libawt_lwawt.dylib" + #define DEFAULT_PATH LWAWT_PATH +@@ -121,6 +130,8 @@ + */ + + fmProp = (*env)->NewStringUTF(env, "sun.font.fontmanager"); ++ CHECK_EXCEPTION_FATAL(env, "Could not allocate font manager property"); ++ + #ifdef MACOSX + fmanager = (*env)->NewStringUTF(env, "sun.font.CFontManager"); + tk = LWAWT_PATH; +@@ -128,10 +139,13 @@ + fmanager = (*env)->NewStringUTF(env, "sun.awt.X11FontManager"); + tk = XAWT_PATH; + #endif ++ CHECK_EXCEPTION_FATAL(env, "Could not allocate font manager name"); ++ + if (fmanager && fmProp) { + JNU_CallStaticMethodByName(env, NULL, "java/lang/System", "setProperty", + "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", + fmProp, fmanager); ++ CHECK_EXCEPTION_FATAL(env, "Could not allocate set properties"); + } + + #ifndef MACOSX +@@ -150,9 +164,11 @@ + (*env)->DeleteLocalRef(env, fmanager); + } + ++ jstring jbuf = JNU_NewStringPlatform(env, buf); ++ CHECK_EXCEPTION_FATAL(env, "Could not allocate library name"); + JNU_CallStaticMethodByName(env, NULL, "java/lang/System", "load", + "(Ljava/lang/String;)V", +- JNU_NewStringPlatform(env, buf)); ++ jbuf); + + awtHandle = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL); + +--- ./jdk/src/solaris/native/sun/awt/awt_Robot.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_Robot.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -175,10 +175,13 @@ + + num_buttons = numberOfButtons; + tmp = (*env)->GetIntArrayElements(env, buttonDownMasks, JNI_FALSE); ++ CHECK_NULL(tmp); ++ + masks = (jint *)SAFE_SIZE_ARRAY_ALLOC(malloc, sizeof(jint), num_buttons); + if (masks == (jint *) NULL) { ++ (*env)->ExceptionClear(env); ++ (*env)->ReleaseIntArrayElements(env, buttonDownMasks, tmp, 0); + JNU_ThrowOutOfMemoryError((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2), NULL); +- (*env)->ReleaseIntArrayElements(env, buttonDownMasks, tmp, 0); + return; + } + for (i = 0; i < num_buttons; i++) { +--- ./jdk/src/solaris/native/sun/awt/awt_UNIXToolkit.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_UNIXToolkit.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2004, 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 +@@ -98,6 +98,7 @@ + (*env)->GetObjectClass(env, this)); + icon_upcall_method = (*env)->GetMethodID(env, this_class, + "loadIconCallback", "([BIIIIIZ)V"); ++ CHECK_NULL_RETURN(icon_upcall_method, JNI_FALSE); + } + + if (pixbuf != NULL) +@@ -112,6 +113,8 @@ + + /* Copy the data array into a Java structure so we can pass it back. */ + jbyteArray data = (*env)->NewByteArray(env, (row_stride * height)); ++ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); ++ + (*env)->SetByteArrayRegion(env, data, 0, (row_stride * height), + (jbyte *)pixbuf_data); + +--- ./jdk/src/solaris/native/sun/awt/awt_util.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_util.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -62,7 +62,7 @@ + #define MIN(a,b) ((a) < (b) ? (a) : (b)) + #endif + +-void ++jboolean + awtJNI_ThreadYield(JNIEnv *env) { + + static jclass threadClass = NULL; +@@ -76,6 +76,7 @@ + Boolean err = FALSE; + if (threadClass == NULL) { + jclass tc = (*env)->FindClass(env, "java/lang/Thread"); ++ CHECK_NULL_RETURN(tc, JNI_FALSE); + threadClass = (*env)->NewGlobalRef(env, tc); + (*env)->DeleteLocalRef(env, tc); + if (threadClass != NULL) { +@@ -91,10 +92,11 @@ + err = TRUE; + } + if (err) { +- return; ++ return JNI_FALSE; + } + } /* threadClass == NULL*/ + + (*env)->CallStaticVoidMethod(env, threadClass, yieldMethodID); + DASSERT(!((*env)->ExceptionOccurred(env))); ++ return JNI_TRUE; + } /* awtJNI_ThreadYield() */ +--- ./jdk/src/solaris/native/sun/awt/awt_util.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_util.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1995, 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 +@@ -78,7 +78,7 @@ + int32_t echoC; + }; + +-extern void awtJNI_ThreadYield(JNIEnv *env); ++extern jboolean awtJNI_ThreadYield(JNIEnv *env); + + /* + * Functions for accessing fields by name and signature +--- ./jdk/src/solaris/native/sun/awt/fontpath.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/fontpath.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -64,7 +64,7 @@ + + #define MAXFDIRS 512 /* Max number of directories that contain fonts */ + +-#if !defined(__linux__) ++#if defined(__solaris__) + /* + * This can be set in the makefile to "/usr/X11" if so desired. + */ +@@ -114,7 +114,7 @@ + NULL, /* terminates the list */ + }; + +-#else /* __linux */ ++#elif defined( __linux__) + /* All the known interesting locations we have discovered on + * various flavors of Linux + */ +@@ -134,6 +134,12 @@ + "/usr/share/fonts/default/Type1", /* RH 9.0 */ + NULL, /* terminates the list */ + }; ++#elif defined(_AIX) ++static char *fullAixFontPath[] = { ++ "/usr/lpp/X11/lib/X11/fonts/Type1", /* from X11.fnt.iso_T1 */ ++ "/usr/lpp/X11/lib/X11/fonts/TrueType", /* from X11.fnt.ucs.ttf */ ++ NULL, /* terminates the list */ ++}; + #endif + + static char **getFontConfigLocations(); +@@ -155,17 +161,22 @@ + + if (! isLocalSet) { + jclass geCls = (*env)->FindClass(env, "java/awt/GraphicsEnvironment"); ++ CHECK_NULL_RETURN(geCls, JNI_FALSE); + jmethodID getLocalGE = (*env)->GetStaticMethodID(env, geCls, + "getLocalGraphicsEnvironment", + "()Ljava/awt/GraphicsEnvironment;"); ++ CHECK_NULL_RETURN(getLocalGE, JNI_FALSE); + jobject ge = (*env)->CallStaticObjectMethod(env, geCls, getLocalGE); ++ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); + + jclass sgeCls = (*env)->FindClass(env, + "sun/java2d/SunGraphicsEnvironment"); ++ CHECK_NULL_RETURN(sgeCls, JNI_FALSE); + if ((*env)->IsInstanceOf(env, ge, sgeCls)) { + jmethodID isDisplayLocal = (*env)->GetMethodID(env, sgeCls, + "isDisplayLocal", + "()Z"); ++ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE); + isLocal = (*env)->CallBooleanMethod(env, ge, isDisplayLocal); + } else { + isLocal = True; +@@ -497,10 +508,11 @@ + + #if defined(__linux__) + knowndirs = fullLinuxFontPath; +-#else /* IF SOLARIS */ ++#elif defined(__solaris__) + knowndirs = fullSolarisFontPath; ++#elif defined(_AIX) ++ knowndirs = fullAixFontPath; + #endif +- + /* REMIND: this code requires to be executed when the GraphicsEnvironment + * is already initialised. That is always true, but if it were not so, + * this code could throw an exception and the fontpath would fail to +@@ -592,6 +604,25 @@ + } + } + #endif ++ ++#if defined(_AIX) ++ /* On AIX, fontconfig is not a standard package supported by IBM. ++ * instead it has to be installed from the "AIX Toolbox for Linux Applications" ++ * site http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/alpha.html ++ * and will be installed under /opt/freeware/lib/libfontconfig.a. ++ * Notice that the archive contains the real 32- and 64-bit shared libraries. ++ * We first try to load 'libfontconfig.so' from the default library path in the ++ * case the user has installed a private version of the library and if that ++ * doesn't succeed, we try the version from /opt/freeware/lib/libfontconfig.a ++ */ ++ libfontconfig = dlopen("libfontconfig.so", RTLD_LOCAL|RTLD_LAZY); ++ if (libfontconfig == NULL) { ++ libfontconfig = dlopen("/opt/freeware/lib/libfontconfig.a(libfontconfig.so.1)", RTLD_MEMBER|RTLD_LOCAL|RTLD_LAZY); ++ if (libfontconfig == NULL) { ++ return NULL; ++ } ++ } ++#else + /* 64 bit sparc should pick up the right version from the lib path. + * New features may be added to libfontconfig, this is expected to + * be compatible with old features, but we may need to start +@@ -606,6 +637,7 @@ + return NULL; + } + } ++#endif + + /* Version 1.0 of libfontconfig crashes if HOME isn't defined in + * the environment. This should generally never happen, but we can't +@@ -978,50 +1010,38 @@ + jmethodID fcFontCons; + char* debugMinGlyphsStr = getenv("J2D_DEBUG_MIN_GLYPHS"); + ++ CHECK_NULL(fcInfoObj); ++ CHECK_NULL(fcCompFontArray); ++ + jclass fcInfoClass = + (*env)->FindClass(env, "sun/font/FontConfigManager$FontConfigInfo"); ++ CHECK_NULL(fcInfoClass); + jclass fcCompFontClass = + (*env)->FindClass(env, "sun/font/FontConfigManager$FcCompFont"); ++ CHECK_NULL(fcCompFontClass); + jclass fcFontClass = + (*env)->FindClass(env, "sun/font/FontConfigManager$FontConfigFont"); ++ CHECK_NULL(fcFontClass); + +- if (fcInfoObj == NULL || fcCompFontArray == NULL || fcInfoClass == NULL || +- fcCompFontClass == NULL || fcFontClass == NULL) { +- return; +- } + +- fcVersionID = (*env)->GetFieldID(env, fcInfoClass, "fcVersion", "I"); +- +- fcCacheDirsID = (*env)->GetFieldID(env, fcInfoClass, "cacheDirs", +- "[Ljava/lang/String;"); +- +- fcNameID = (*env)->GetFieldID(env, fcCompFontClass, +- "fcName", "Ljava/lang/String;"); +- fcFirstFontID = +- (*env)->GetFieldID(env, fcCompFontClass, "firstFont", +- "Lsun/font/FontConfigManager$FontConfigFont;"); +- +- fcAllFontsID = +- (*env)->GetFieldID(env, fcCompFontClass, "allFonts", +- "[Lsun/font/FontConfigManager$FontConfigFont;"); +- +- fcFontCons = (*env)->GetMethodID(env, fcFontClass, "<init>", "()V"); +- +- familyNameID = (*env)->GetFieldID(env, fcFontClass, +- "familyName", "Ljava/lang/String;"); +- styleNameID = (*env)->GetFieldID(env, fcFontClass, +- "styleStr", "Ljava/lang/String;"); +- fullNameID = (*env)->GetFieldID(env, fcFontClass, +- "fullName", "Ljava/lang/String;"); +- fontFileID = (*env)->GetFieldID(env, fcFontClass, +- "fontFile", "Ljava/lang/String;"); +- +- if (fcVersionID == NULL || fcCacheDirsID == NULL || fcNameID == NULL || +- fcFirstFontID == NULL || fcAllFontsID == NULL || fcFontCons == NULL || +- familyNameID == NULL || styleNameID == NULL || fullNameID == NULL || +- fontFileID == NULL) { +- return; +- } ++ CHECK_NULL(fcVersionID = (*env)->GetFieldID(env, fcInfoClass, "fcVersion", "I")); ++ CHECK_NULL(fcCacheDirsID = (*env)->GetFieldID(env, fcInfoClass, "cacheDirs", ++ "[Ljava/lang/String;")); ++ CHECK_NULL(fcNameID = (*env)->GetFieldID(env, fcCompFontClass, ++ "fcName", "Ljava/lang/String;")); ++ CHECK_NULL(fcFirstFontID = (*env)->GetFieldID(env, fcCompFontClass, "firstFont", ++ "Lsun/font/FontConfigManager$FontConfigFont;")); ++ CHECK_NULL(fcAllFontsID = (*env)->GetFieldID(env, fcCompFontClass, "allFonts", ++ "[Lsun/font/FontConfigManager$FontConfigFont;")); ++ CHECK_NULL(fcFontCons = (*env)->GetMethodID(env, fcFontClass, "<init>", "()V")); ++ CHECK_NULL(familyNameID = (*env)->GetFieldID(env, fcFontClass, ++ "familyName", "Ljava/lang/String;")); ++ CHECK_NULL(styleNameID = (*env)->GetFieldID(env, fcFontClass, ++ "styleStr", "Ljava/lang/String;")); ++ CHECK_NULL(fullNameID = (*env)->GetFieldID(env, fcFontClass, ++ "fullName", "Ljava/lang/String;")); ++ CHECK_NULL(fontFileID = (*env)->GetFieldID(env, fcFontClass, ++ "fontFile", "Ljava/lang/String;")); + + if ((libfontconfig = openFontConfig()) == NULL) { + return; +@@ -1102,6 +1122,8 @@ + if (cacheDirs != NULL) { + while ((cnt < max) && (cacheDir = (*FcStrListNext)(cacheDirs))) { + jstr = (*env)->NewStringUTF(env, (const char*)cacheDir); ++ JNU_CHECK_EXCEPTION(env); ++ + (*env)->SetObjectArrayElement(env, cacheDirArray, cnt++, jstr); + } + (*FcStrListDone)(cacheDirs); +@@ -1109,6 +1131,11 @@ + } + + locale = (*env)->GetStringUTFChars(env, localeStr, 0); ++ if (locale == NULL) { ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not create locale"); ++ return; ++ } + + arrlen = (*env)->GetArrayLength(env, fcCompFontArray); + for (i=0; i<arrlen; i++) { +@@ -1203,7 +1230,7 @@ + */ + if (fontformat != NULL + && (strcmp((char*)fontformat, "TrueType") != 0) +-#ifdef __linux__ ++#if defined(__linux__) || defined(_AIX) + && (strcmp((char*)fontformat, "Type 1") != 0) + #endif + ) { +--- ./jdk/src/solaris/native/sun/awt/gtk2_interface.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/gtk2_interface.c Wed Jul 30 18:42:59 2014 +0100 +@@ -32,6 +32,7 @@ + #include "java_awt_Transparency.h" + #include "jvm_md.h" + #include "sizecalc.h" ++#include <jni_util.h> + + #define GTK2_LIB_VERSIONED VERSIONED_JNI_LIB_NAME("gtk-x11-2.0", "0") + #define GTK2_LIB JNI_LIB_NAME("gtk-x11-2.0") +@@ -456,13 +457,19 @@ + const gchar * const * schemes = NULL; + + jclass cls_action = (*env)->FindClass(env, "java/awt/Desktop$Action"); ++ CHECK_NULL(cls_action); + jclass cls_xDesktopPeer = (*env)->FindClass(env, "sun/awt/X11/XDesktopPeer"); ++ CHECK_NULL(cls_xDesktopPeer); + jfieldID fld_supportedActions = (*env)->GetStaticFieldID(env, cls_xDesktopPeer, "supportedActions", "Ljava/util/List;"); ++ CHECK_NULL(fld_supportedActions); + jobject supportedActions = (*env)->GetStaticObjectField(env, cls_xDesktopPeer, fld_supportedActions); + + jclass cls_arrayList = (*env)->FindClass(env, "java/util/ArrayList"); ++ CHECK_NULL(cls_arrayList); + jmethodID mid_arrayListAdd = (*env)->GetMethodID(env, cls_arrayList, "add", "(Ljava/lang/Object;)Z"); ++ CHECK_NULL(mid_arrayListAdd); + jmethodID mid_arrayListClear = (*env)->GetMethodID(env, cls_arrayList, "clear", "()V"); ++ CHECK_NULL(mid_arrayListClear); + + (*env)->CallVoidMethod(env, supportedActions, mid_arrayListClear); + +@@ -531,9 +538,7 @@ + fprintf(stderr, "dlsym(gtk_show_uri) returned NULL\n"); + #endif /* INTERNAL_BUILD */ + } else { +-#ifdef __solaris__ + update_supported_actions(env); +-#endif + success = TRUE; + } + } +--- ./jdk/src/solaris/native/sun/awt/initIDs.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/initIDs.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, 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 +@@ -47,9 +47,6 @@ + (JNIEnv *env, jclass clazz) + { + colorValueID = (*env)->GetFieldID(env, clazz, "value", "I"); +- +- if(colorValueID == NULL) +- JNU_ThrowNullPointerException (env, "Can't get java/awt/Color.value fieldID"); + } + + JNIEXPORT void JNICALL +--- ./jdk/src/solaris/native/sun/awt/multi_font.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/multi_font.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -74,7 +74,7 @@ + jobject temp = NULL; + jboolean validRet = JNI_FALSE; + +- if ((*env)->EnsureLocalCapacity(env, 2) < 0) ++ if ((*env)->EnsureLocalCapacity(env, 2) < 0 || (*env)->ExceptionCheck(env)) + goto done; + + peer = (*env)->CallObjectMethod(env,font,fontIDs.getPeer); +@@ -162,7 +162,7 @@ + + font = JNU_CallMethodByName(env, NULL, this, "getFont_NoClientCode", + "()Ljava/awt/Font;").l; +- if (JNU_IsNull(env, font)) { ++ if (JNU_IsNull(env, font) || (*env)->ExceptionCheck(env)) { + return JNI_FALSE; + } + +@@ -318,6 +318,10 @@ + } + + fdata = awtJNI_GetFontData(env, font, &err); ++ if ((*env)->ExceptionCheck(env)) { ++ (*env)->DeleteLocalRef(env, dataArray); ++ return 0; ++ } + + stringCount = (*env)->GetArrayLength(env, dataArray); + +@@ -336,6 +340,11 @@ + } + + j = awtJNI_GetFontDescriptorNumber(env, font, fontDescriptor); ++ if ((*env)->ExceptionCheck(env)) { ++ (*env)->DeleteLocalRef(env, fontDescriptor); ++ (*env)->DeleteLocalRef(env, data); ++ break; ++ } + + if (fdata->flist[j].load == 0) { + xf = loadFont(awt_display, +@@ -356,6 +365,14 @@ + + stringData = + (unsigned char *)(*env)->GetPrimitiveArrayCritical(env, data,NULL); ++ if (stringData == NULL) { ++ (*env)->DeleteLocalRef(env, fontDescriptor); ++ (*env)->DeleteLocalRef(env, data); ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not get string data"); ++ break; ++ } ++ + length = (stringData[0] << 24) | (stringData[1] << 16) | + (stringData[2] << 8) | stringData[3]; + offsetStringData = (char *)(stringData + (4 * sizeof(char))); +--- ./jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,3 +1,28 @@ ++/* ++ * Copyright (c) 2010, 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 <jni.h> + #include <stdio.h> + #include <jni_util.h> +@@ -20,10 +45,12 @@ + filenameFilterCallbackMethodID = (*env)->GetMethodID(env, cx, + "filenameFilterCallback", "(Ljava/lang/String;)Z"); + DASSERT(filenameFilterCallbackMethodID != NULL); ++ CHECK_NULL(filenameFilterCallbackMethodID); + + setFileInternalMethodID = (*env)->GetMethodID(env, cx, + "setFileInternal", "(Ljava/lang/String;[Ljava/lang/String;)V"); + DASSERT(setFileInternalMethodID != NULL); ++ CHECK_NULL(setFileInternalMethodID); + + widgetFieldID = (*env)->GetFieldID(env, cx, "widget", "J"); + DASSERT(widgetFieldID != NULL); +@@ -38,6 +65,7 @@ + env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2); + + filename = (*env)->NewStringUTF(env, filter_info->filename); ++ JNU_CHECK_EXCEPTION_RETURN(env, FALSE); + + return (*env)->CallBooleanMethod(env, obj, filenameFilterCallbackMethodID, + filename); +@@ -148,13 +176,14 @@ + + stringCls = (*env)->FindClass(env, "java/lang/String"); + if (stringCls == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowInternalError(env, "Could not get java.lang.String class"); + return NULL; + } + +- array = (*env)->NewObjectArray(env, fp_gtk_g_slist_length(list), stringCls, +- NULL); ++ array = (*env)->NewObjectArray(env, fp_gtk_g_slist_length(list), stringCls, NULL); + if (array == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowInternalError(env, "Could not instantiate array files array"); + return NULL; + } +@@ -164,7 +193,9 @@ + entry = (char*) iterator->data; + entry = strrchr(entry, '/') + 1; + str = (*env)->NewStringUTF(env, entry); +- (*env)->SetObjectArrayElement(env, array, i, str); ++ if (str && !(*env)->ExceptionCheck(env)) { ++ (*env)->SetObjectArrayElement(env, array, i, str); ++ } + i++; + } + +@@ -190,13 +221,14 @@ + + stringCls = (*env)->FindClass(env, "java/lang/String"); + if (stringCls == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowInternalError(env, "Could not get java.lang.String class"); + return NULL; + } + +- array = (*env)->NewObjectArray(env, fp_gtk_g_slist_length(list), stringCls, +- NULL); ++ array = (*env)->NewObjectArray(env, fp_gtk_g_slist_length(list), stringCls, NULL); + if (array == NULL) { ++ (*env)->ExceptionClear(env); + JNU_ThrowInternalError(env, "Could not instantiate array files array"); + return NULL; + } +@@ -211,7 +243,9 @@ + } + + str = (*env)->NewStringUTF(env, entry); +- (*env)->SetObjectArrayElement(env, array, i, str); ++ if (str && !(*env)->ExceptionCheck(env)) { ++ (*env)->SetObjectArrayElement(env, array, i, str); ++ } + i++; + } + +@@ -243,16 +277,17 @@ + if (full_path_names) { + //This is a hack for use with "Recent Folders" in gtk where each + //file could have its own directory. ++ jfilenames = toPathAndFilenamesArray(env, filenames); + jcurrent_folder = (*env)->NewStringUTF(env, "/"); +- jfilenames = toPathAndFilenamesArray(env, filenames); + } else { ++ jfilenames = toFilenamesArray(env, filenames); + jcurrent_folder = (*env)->NewStringUTF(env, current_folder); +- jfilenames = toFilenamesArray(env, filenames); + } +- (*env)->CallVoidMethod(env, obj, setFileInternalMethodID, jcurrent_folder, +- jfilenames); ++ if (!(*env)->ExceptionCheck(env)) { ++ (*env)->CallVoidMethod(env, obj, setFileInternalMethodID, ++ jcurrent_folder, jfilenames); ++ } + fp_g_free(current_folder); +- + quit(env, (jobject)obj, TRUE); + } + +@@ -271,11 +306,17 @@ + + if (jvm == NULL) { + (*env)->GetJavaVM(env, &jvm); ++ JNU_CHECK_EXCEPTION(env); + } + + fp_gdk_threads_enter(); + + const char *title = jtitle == NULL? "": (*env)->GetStringUTFChars(env, jtitle, 0); ++ if (title == NULL) { ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not get title"); ++ return; ++ } + + if (mode == java_awt_FileDialog_SAVE) { + /* Save action */ +@@ -303,6 +344,11 @@ + /* Set the directory */ + if (jdir != NULL) { + const char *dir = (*env)->GetStringUTFChars(env, jdir, 0); ++ if (dir == NULL) { ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not get dir"); ++ return; ++ } + fp_gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir); + (*env)->ReleaseStringUTFChars(env, jdir, dir); + } +@@ -310,6 +356,11 @@ + /* Set the filename */ + if (jfile != NULL) { + const char *filename = (*env)->GetStringUTFChars(env, jfile, 0); ++ if (filename == NULL) { ++ (*env)->ExceptionClear(env); ++ JNU_ThrowOutOfMemoryError(env, "Could not get filename"); ++ return; ++ } + if (mode == java_awt_FileDialog_SAVE) { + fp_gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename); + } else { +--- ./jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h Thu Jan 01 00:00:00 1970 +0000 +@@ -1,55 +0,0 @@ +-/* DO NOT EDIT THIS FILE - it is machine generated */ +-#include <jni.h> +-/* Header for class sun_awt_X11_GtkFileDialogPeer */ +- +-#ifndef _Included_sun_awt_X11_GtkFileDialogPeer +-#define _Included_sun_awt_X11_GtkFileDialogPeer +-#ifdef __cplusplus +-extern "C" +-{ +-#endif +- +-/* +- * Class: sun_awt_X11_GtkFileDialogPeer +- * Method: initIDs +- * Signature: ()V +- */ +-JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs +-(JNIEnv *, jclass); +- +-/* +- * Class: sun_awt_X11_GtkFileDialogPeer +- * Method: run +- * Signature: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/io/FilenameFilter;ZII)V +- */ +-JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_run +-(JNIEnv *, jobject, jstring, jint, jstring, jstring, jobject, jboolean, jint, jint); +- +-/* +- * Class: sun_awt_X11_GtkFileDialogPeer +- * Method: quit +- * Signature: ()V +- */ +-JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_quit +-(JNIEnv *, jobject); +- +-/* +- * Class: sun_awt_X11_GtkFileDialogPeer +- * Method: toFront +- * Signature: ()V +- */ +-JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_toFront +-(JNIEnv *, jobject); +- +-/* +- * Class: sun_awt_X11_GtkFileDialogPeer +- * Method: setBounds +- * Signature: (IIIII)V +- */ +-JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_setBounds +-(JNIEnv * env, jobject jpeer, jint x, jint y, jint width, jint height, jint op); +- +-#ifdef __cplusplus +-} +-#endif +-#endif +--- ./jdk/src/solaris/native/sun/java2d/x11/X11SurfaceData.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/java2d/x11/X11SurfaceData.c Wed Jul 30 18:42:59 2014 +0100 +@@ -56,8 +56,8 @@ + int x, y; + } X11RIPrivate; + +-#define MAX(a,b) ((a) > (b) ? (a) : (b)) +-#define MIN(a,b) ((a) < (b) ? (a) : (b)) ++#define XSD_MAX(a,b) ((a) > (b) ? (a) : (b)) ++#define XSD_MIN(a,b) ((a) < (b) ? (a) : (b)) + + static LockFunc X11SD_Lock; + static GetRasInfoFunc X11SD_GetRasInfo; +@@ -1090,10 +1090,10 @@ + x2 = x1 + DisplayWidth(awt_display, xsdo->configData->awt_visInfo.screen); + y2 = y1 + DisplayHeight(awt_display, xsdo->configData->awt_visInfo.screen); + +- x1 = MAX(bounds->x1, x1); +- y1 = MAX(bounds->y1, y1); +- x2 = MIN(bounds->x2, x2); +- y2 = MIN(bounds->y2, y2); ++ x1 = XSD_MAX(bounds->x1, x1); ++ y1 = XSD_MAX(bounds->y1, y1); ++ x2 = XSD_MIN(bounds->x2, x2); ++ y2 = XSD_MIN(bounds->y2, y2); + if ((x1 >= x2) || (y1 >= y2)) { + return FALSE; + } +--- ./jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/java2d/x11/XRBackendNative.c Wed Jul 30 18:42:59 2014 +0100 +@@ -72,8 +72,8 @@ + + #include <dlfcn.h> + +-#ifdef __solaris__ +-/* Solaris 10 will not have these symbols at runtime */ ++#if defined(__solaris__) || defined(_AIX) ++/* Solaris 10 and AIX will not have these symbols at runtime */ + + typedef Picture (*XRenderCreateLinearGradientFuncType) + (Display *dpy, +@@ -147,7 +147,7 @@ + return JNI_FALSE; + } + +-#ifdef __solaris__ ++#if defined(__solaris__) || defined(_AIX) + xrenderlib = dlopen("libXrender.so",RTLD_GLOBAL|RTLD_LAZY); + if (xrenderlib != NULL) { + +--- ./jdk/src/solaris/native/sun/management/OperatingSystemImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/management/OperatingSystemImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -41,7 +41,7 @@ + #include <sys/proc_info.h> + #include <libproc.h> + #endif +-#else ++#elif !defined(_AIX) + #include <sys/swap.h> + #endif + #include <sys/resource.h> +@@ -57,9 +57,13 @@ + #include <stdlib.h> + #include <unistd.h> + ++#if defined(_AIX) ++#include <libperfstat.h> ++#endif ++ + static jlong page_size = 0; + +-#if defined(_ALLBSD_SOURCE) ++#if defined(_ALLBSD_SOURCE) || defined(_AIX) + #define MB (1024UL * 1024UL) + #else + +@@ -326,6 +330,12 @@ + */ + // throw_internal_error(env, "unimplemented in FreeBSD") + return (128 * MB); ++#elif defined(_AIX) ++ perfstat_memory_total_t memory_info; ++ if (-1 != perfstat_memory_total(NULL, &memory_info, sizeof(perfstat_memory_total_t), 1)) { ++ return (jlong)(memory_info.real_free * 4L * 1024L); ++ } ++ return -1; + #else // solaris / linux + jlong num_avail_physical_pages = sysconf(_SC_AVPHYS_PAGES); + return (num_avail_physical_pages * page_size); +@@ -349,6 +359,12 @@ + return -1; + } + return result; ++#elif defined(_AIX) ++ perfstat_memory_total_t memory_info; ++ if (-1 != perfstat_memory_total(NULL, &memory_info, sizeof(perfstat_memory_total_t), 1)) { ++ return (jlong)(memory_info.real_total * 4L * 1024L); ++ } ++ return -1; + #else // solaris / linux + jlong num_physical_pages = sysconf(_SC_PHYS_PAGES); + return (num_physical_pages * page_size); +@@ -417,7 +433,16 @@ + struct dirent* dentp; + jlong fds = 0; + +- dirp = opendir("/proc/self/fd"); ++#if defined(_AIX) ++/* AIX does not understand '/proc/self' - it requires the real process ID */ ++#define FD_DIR aix_fd_dir ++ char aix_fd_dir[32]; /* the pid has at most 19 digits */ ++ snprintf(aix_fd_dir, 32, "/proc/%d/fd", getpid()); ++#else ++#define FD_DIR "/proc/self/fd" ++#endif ++ ++ dirp = opendir(FD_DIR); + if (dirp == NULL) { + throw_internal_error(env, "Unable to open directory /proc/self/fd"); + return -1; +--- ./jdk/src/solaris/native/sun/nio/ch/DatagramChannelImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/ch/DatagramChannelImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -81,7 +81,7 @@ + rv = connect(fd, 0, 0); + #endif + +-#if defined(__linux__) || defined(_ALLBSD_SOURCE) ++#if defined(__linux__) || defined(_ALLBSD_SOURCE) || defined(_AIX) + { + int len; + SOCKADDR sa; +@@ -115,6 +115,14 @@ + if (rv < 0 && errno == EADDRNOTAVAIL) + rv = errno = 0; + #endif ++#if defined(_AIX) ++ /* See W. Richard Stevens, "UNIX Network Programming, Volume 1", p. 254: ++ * 'Setting the address family to AF_UNSPEC might return EAFNOSUPPORT ++ * but that is acceptable. ++ */ ++ if (rv < 0 && errno == EAFNOSUPPORT) ++ rv = errno = 0; ++#endif + } + #endif + +--- ./jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -39,6 +39,8 @@ + + #if defined(__linux__) || defined(__solaris__) + #include <sys/sendfile.h> ++#elif defined(_AIX) ++#include <sys/socket.h> + #elif defined(_ALLBSD_SOURCE) + #include <sys/types.h> + #include <sys/socket.h> +@@ -207,9 +209,7 @@ + + numBytes = count; + +-#ifdef __APPLE__ + result = sendfile(srcFD, dstFD, position, &numBytes, NULL, 0); +-#endif + + if (numBytes > 0) + return numBytes; +@@ -228,7 +228,48 @@ + } + + return result; ++ ++#elif defined(_AIX) ++ jlong max = (jlong)java_lang_Integer_MAX_VALUE; ++ struct sf_parms sf_iobuf; ++ jlong result; ++ ++ if (position > max) ++ return IOS_UNSUPPORTED_CASE; ++ ++ if (count > max) ++ count = max; ++ ++ memset(&sf_iobuf, 0, sizeof(sf_iobuf)); ++ sf_iobuf.file_descriptor = srcFD; ++ sf_iobuf.file_offset = (off_t)position; ++ sf_iobuf.file_bytes = count; ++ ++ result = send_file(&dstFD, &sf_iobuf, SF_SYNC_CACHE); ++ ++ /* AIX send_file() will return 0 when this operation complete successfully, ++ * return 1 when partial bytes transfered and return -1 when an error has ++ * Occured. ++ */ ++ if (result == -1) { ++ if (errno == EWOULDBLOCK) ++ return IOS_UNAVAILABLE; ++ if ((errno == EINVAL) && ((ssize_t)count >= 0)) ++ return IOS_UNSUPPORTED_CASE; ++ if (errno == EINTR) ++ return IOS_INTERRUPTED; ++ if (errno == ENOTSOCK) ++ return IOS_UNSUPPORTED; ++ JNU_ThrowIOExceptionWithLastError(env, "Transfer failed"); ++ return IOS_THROWN; ++ } ++ ++ if (sf_iobuf.bytes_sent > 0) ++ return (jlong)sf_iobuf.bytes_sent; ++ ++ return IOS_UNSUPPORTED_CASE; + #else + return IOS_UNSUPPORTED_CASE; + #endif + } ++ +--- ./jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -147,6 +147,19 @@ + if (md == JNI_FALSE) { + result = fdatasync(fd); + } else { ++#ifdef _AIX ++ /* On AIX, calling fsync on a file descriptor that is opened only for ++ * reading results in an error ("EBADF: The FileDescriptor parameter is ++ * not a valid file descriptor open for writing."). ++ * However, at this point it is not possibly anymore to read the ++ * 'writable' attribute of the corresponding file channel so we have to ++ * use 'fcntl'. ++ */ ++ int getfl = fcntl(fd, F_GETFL); ++ if (getfl >= 0 && (getfl & O_ACCMODE) == O_RDONLY) { ++ return 0; ++ } ++#endif + result = fsync(fd); + } + return handle(env, result, "Force failed"); +--- ./jdk/src/solaris/native/sun/nio/ch/IOUtil.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/ch/IOUtil.c Wed Jul 30 18:42:59 2014 +0100 +@@ -145,7 +145,6 @@ + return (jint)iov_max; + } + +- + /* Declared in nio_util.h for use elsewhere in NIO */ + + jint +--- ./jdk/src/solaris/native/sun/nio/ch/NativeThread.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/ch/NativeThread.c Wed Jul 30 18:42:59 2014 +0100 +@@ -32,27 +32,32 @@ + #include "sun_nio_ch_NativeThread.h" + #include "nio_util.h" + +- + #ifdef __linux__ +-#include <pthread.h> +-#include <sys/signal.h> +- +-/* Also defined in src/solaris/native/java/net/linux_close.c */ +-#define INTERRUPT_SIGNAL (__SIGRTMAX - 2) ++ #include <pthread.h> ++ #include <sys/signal.h> ++ /* Also defined in net/linux_close.c */ ++ #define INTERRUPT_SIGNAL (__SIGRTMAX - 2) ++#elif __solaris__ ++ #include <thread.h> ++ #include <signal.h> ++ #define INTERRUPT_SIGNAL (SIGRTMAX - 2) ++#elif _ALLBSD_SOURCE ++ #include <pthread.h> ++ #include <signal.h> ++ /* Also defined in net/bsd_close.c */ ++ #define INTERRUPT_SIGNAL SIGIO ++#else ++ #error "missing platform-specific definition here" ++#endif + + static void + nullHandler(int sig) + { + } + +-#endif +- +- + JNIEXPORT void JNICALL + Java_sun_nio_ch_NativeThread_init(JNIEnv *env, jclass cl) + { +-#ifdef __linux__ +- + /* Install the null handler for INTERRUPT_SIGNAL. This might overwrite the + * handler previously installed by java/net/linux_close.c, but that's okay + * since neither handler actually does anything. We install our own +@@ -67,25 +72,27 @@ + sigemptyset(&sa.sa_mask); + if (sigaction(INTERRUPT_SIGNAL, &sa, &osa) < 0) + JNU_ThrowIOExceptionWithLastError(env, "sigaction"); +- +-#endif + } + + JNIEXPORT jlong JNICALL + Java_sun_nio_ch_NativeThread_current(JNIEnv *env, jclass cl) + { +-#ifdef __linux__ +- return (long)pthread_self(); ++#ifdef __solaris__ ++ return (jlong)thr_self(); + #else +- return -1; ++ return (jlong)pthread_self(); + #endif + } + + JNIEXPORT void JNICALL + Java_sun_nio_ch_NativeThread_signal(JNIEnv *env, jclass cl, jlong thread) + { +-#ifdef __linux__ +- if (pthread_kill((pthread_t)thread, INTERRUPT_SIGNAL)) ++ int ret; ++#ifdef __solaris__ ++ ret = thr_kill((thread_t)thread, INTERRUPT_SIGNAL); ++#else ++ ret = pthread_kill((pthread_t)thread, INTERRUPT_SIGNAL); ++#endif ++ if (ret != 0) + JNU_ThrowIOExceptionWithLastError(env, "Thread signal failed"); +-#endif + } +--- ./jdk/src/solaris/native/sun/nio/ch/Net.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/ch/Net.c Wed Jul 30 18:42:59 2014 +0100 +@@ -23,6 +23,7 @@ + * questions. + */ + ++#include <sys/poll.h> + #include <sys/types.h> + #include <sys/socket.h> + #include <string.h> +@@ -40,6 +41,9 @@ + #include "nio.h" + #include "sun_nio_ch_PollArrayWrapper.h" + ++#ifdef _AIX ++#include <sys/utsname.h> ++#endif + + /** + * IP_MULTICAST_ALL supported since 2.6.31 but may not be available at +@@ -51,24 +55,46 @@ + #endif + #endif + +-#ifdef _ALLBSD_SOURCE ++#if defined(_ALLBSD_SOURCE) || defined(_AIX) + + #ifndef IP_BLOCK_SOURCE + ++#if defined(_AIX) ++ ++#define IP_BLOCK_SOURCE 58 /* Block data from a given source to a given group */ ++#define IP_UNBLOCK_SOURCE 59 /* Unblock data from a given source to a given group */ ++#define IP_ADD_SOURCE_MEMBERSHIP 60 /* Join a source-specific group */ ++#define IP_DROP_SOURCE_MEMBERSHIP 61 /* Leave a source-specific group */ ++ ++#else ++ + #define IP_ADD_SOURCE_MEMBERSHIP 70 /* join a source-specific group */ + #define IP_DROP_SOURCE_MEMBERSHIP 71 /* drop a single source */ + #define IP_BLOCK_SOURCE 72 /* block a source */ + #define IP_UNBLOCK_SOURCE 73 /* unblock a source */ + ++#endif /* _AIX */ ++ + #endif /* IP_BLOCK_SOURCE */ + + #ifndef MCAST_BLOCK_SOURCE + ++#if defined(_AIX) ++ ++#define MCAST_BLOCK_SOURCE 64 ++#define MCAST_UNBLOCK_SOURCE 65 ++#define MCAST_JOIN_SOURCE_GROUP 66 ++#define MCAST_LEAVE_SOURCE_GROUP 67 ++ ++#else ++ + #define MCAST_JOIN_SOURCE_GROUP 82 /* join a source-specific group */ + #define MCAST_LEAVE_SOURCE_GROUP 83 /* leave a single source */ + #define MCAST_BLOCK_SOURCE 84 /* block a source */ + #define MCAST_UNBLOCK_SOURCE 85 /* unblock a source */ + ++#endif /* _AIX */ ++ + #endif /* MCAST_BLOCK_SOURCE */ + + #ifndef IPV6_ADD_MEMBERSHIP +@@ -78,12 +104,24 @@ + + #endif /* IPV6_ADD_MEMBERSHIP */ + ++#if defined(_AIX) ++ ++struct my_ip_mreq_source { ++ struct in_addr imr_multiaddr; ++ struct in_addr imr_sourceaddr; ++ struct in_addr imr_interface; ++}; ++ ++#else ++ + struct my_ip_mreq_source { + struct in_addr imr_multiaddr; + struct in_addr imr_interface; + struct in_addr imr_sourceaddr; + }; + ++#endif /* _AIX */ ++ + struct my_group_source_req { + uint32_t gsr_interface; /* interface index */ + struct sockaddr_storage gsr_group; /* group address */ +@@ -123,6 +161,36 @@ + } + #endif + ++#ifdef _AIX ++ ++/* ++ * Checks whether or not "socket extensions for multicast source filters" is supported. ++ * Returns JNI_TRUE if it is supported, JNI_FALSE otherwise ++ */ ++static jboolean isSourceFilterSupported(){ ++ static jboolean alreadyChecked = JNI_FALSE; ++ static jboolean result = JNI_TRUE; ++ if (alreadyChecked != JNI_TRUE){ ++ struct utsname uts; ++ memset(&uts, 0, sizeof(uts)); ++ strcpy(uts.sysname, "?"); ++ const int utsRes = uname(&uts); ++ int major = -1; ++ int minor = -1; ++ major = atoi(uts.version); ++ minor = atoi(uts.release); ++ if (strcmp(uts.sysname, "AIX") == 0) { ++ if (major < 6 || (major == 6 && minor < 1)) {// unsupported on aix < 6.1 ++ result = JNI_FALSE; ++ } ++ } ++ alreadyChecked = JNI_TRUE; ++ } ++ return result; ++} ++ ++#endif /* _AIX */ ++ + JNIEXPORT void JNICALL + Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz) + { +@@ -143,7 +211,7 @@ + JNIEXPORT jboolean JNICALL + Java_sun_nio_ch_Net_canIPv6SocketJoinIPv4Group0(JNIEnv* env, jclass cl) + { +-#ifdef MACOSX ++#if defined(MACOSX) || defined(_AIX) + /* for now IPv6 sockets cannot join IPv4 multicast groups */ + return JNI_FALSE; + #else +@@ -475,6 +543,14 @@ + /* no IPv4 include-mode filtering for now */ + return IOS_UNAVAILABLE; + #else ++ ++#ifdef _AIX ++ /* check AIX for support of source filtering */ ++ if (isSourceFilterSupported() != JNI_TRUE){ ++ return IOS_UNAVAILABLE; ++ } ++#endif ++ + mreq_source.imr_multiaddr.s_addr = htonl(group); + mreq_source.imr_sourceaddr.s_addr = htonl(source); + mreq_source.imr_interface.s_addr = htonl(interf); +@@ -486,7 +562,7 @@ + + n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt, optval, optlen); + if (n < 0) { +- if (join && (errno == ENOPROTOOPT)) ++ if (join && (errno == ENOPROTOOPT || errno == EOPNOTSUPP)) + return IOS_UNAVAILABLE; + handleSocketError(env, errno); + } +@@ -505,6 +581,13 @@ + int n; + int opt = (block) ? IP_BLOCK_SOURCE : IP_UNBLOCK_SOURCE; + ++#ifdef _AIX ++ /* check AIX for support of source filtering */ ++ if (isSourceFilterSupported() != JNI_TRUE){ ++ return IOS_UNAVAILABLE; ++ } ++#endif ++ + mreq_source.imr_multiaddr.s_addr = htonl(group); + mreq_source.imr_sourceaddr.s_addr = htonl(source); + mreq_source.imr_interface.s_addr = htonl(interf); +@@ -512,7 +595,7 @@ + n = setsockopt(fdval(env,fdo), IPPROTO_IP, opt, + (void*)&mreq_source, sizeof(mreq_source)); + if (n < 0) { +- if (block && (errno == ENOPROTOOPT)) ++ if (block && (errno == ENOPROTOOPT || errno == EOPNOTSUPP)) + return IOS_UNAVAILABLE; + handleSocketError(env, errno); + } +@@ -550,7 +633,7 @@ + + n = setsockopt(fdval(env,fdo), IPPROTO_IPV6, opt, optval, optlen); + if (n < 0) { +- if (join && (errno == ENOPROTOOPT)) ++ if (join && (errno == ENOPROTOOPT || errno == EOPNOTSUPP)) + return IOS_UNAVAILABLE; + handleSocketError(env, errno); + } +@@ -579,7 +662,7 @@ + n = setsockopt(fdval(env,fdo), IPPROTO_IPV6, opt, + (void*)&req, sizeof(req)); + if (n < 0) { +- if (block && (errno == ENOPROTOOPT)) ++ if (block && (errno == ENOPROTOOPT || errno == EOPNOTSUPP)) + return IOS_UNAVAILABLE; + handleSocketError(env, errno); + } +@@ -679,6 +762,42 @@ + } + } + ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollinValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLIN; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_polloutValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLOUT; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollerrValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLERR; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollhupValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLHUP; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollnvalValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLNVAL; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollconnValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLOUT; ++} ++ + + /* Declared in nio_util.h */ + +--- ./jdk/src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -38,8 +38,7 @@ + #include "sun_nio_ch_sctp_ResultContainer.h" + #include "sun_nio_ch_sctp_PeerAddrChange.h" + +-/* sizeof(union sctp_notification */ +-#define NOTIFICATION_BUFFER_SIZE 280 ++static int SCTP_NOTIFICATION_SIZE = sizeof(union sctp_notification); + + #define MESSAGE_IMPL_CLASS "sun/nio/ch/sctp/MessageInfoImpl" + #define RESULT_CONTAINER_CLASS "sun/nio/ch/sctp/ResultContainer" +@@ -460,20 +459,47 @@ + if (msg->msg_flags & MSG_NOTIFICATION) { + char *bufp = (char*)addr; + union sctp_notification *snp; ++ jboolean allocated = JNI_FALSE; + +- if (!(msg->msg_flags & MSG_EOR) && length < NOTIFICATION_BUFFER_SIZE) { +- char buf[NOTIFICATION_BUFFER_SIZE]; ++ if (rv > SCTP_NOTIFICATION_SIZE) { ++ JNU_ThrowInternalError(env, "should not reach here"); ++ return -1; ++ } ++ ++ if (!(msg->msg_flags & MSG_EOR) && length < SCTP_NOTIFICATION_SIZE) { ++ char* newBuf; + int rvSAVE = rv; +- memcpy(buf, addr, rv); +- iov->iov_base = buf + rv; +- iov->iov_len = NOTIFICATION_BUFFER_SIZE - rv; ++ ++ if ((newBuf = malloc(SCTP_NOTIFICATION_SIZE)) == NULL) { ++ JNU_ThrowOutOfMemoryError(env, "Out of native heap space."); ++ return -1; ++ } ++ allocated = JNI_TRUE; ++ ++ memcpy(newBuf, addr, rv); ++ iov->iov_base = newBuf + rv; ++ iov->iov_len = SCTP_NOTIFICATION_SIZE - rv; + if ((rv = recvmsg(fd, msg, flags)) < 0) { + handleSocketError(env, errno); + return 0; + } +- bufp = buf; ++ bufp = newBuf; + rv += rvSAVE; + } ++#ifdef __sparc ++ else if ((intptr_t)addr & 0x3) { ++ /* the given buffer is not 4 byte aligned */ ++ char* newBuf; ++ if ((newBuf = malloc(SCTP_NOTIFICATION_SIZE)) == NULL) { ++ JNU_ThrowOutOfMemoryError(env, "Out of native heap space."); ++ return -1; ++ } ++ allocated = JNI_TRUE; ++ ++ memcpy(newBuf, addr, rv); ++ bufp = newBuf; ++ } ++#endif + snp = (union sctp_notification *) bufp; + if (handleNotification(env, fd, resultContainerObj, snp, rv, + (msg->msg_flags & MSG_EOR), +@@ -481,9 +507,16 @@ + /* We have received a notification that is of interest to + to the Java API. The appropriate notification will be + set in the result container. */ ++ if (allocated == JNI_TRUE) { ++ free(bufp); ++ } + return 0; + } + ++ if (allocated == JNI_TRUE) { ++ free(bufp); ++ } ++ + // set iov back to addr, and reset msg_controllen + iov->iov_base = addr; + iov->iov_len = length; +--- ./jdk/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c Wed Jul 30 18:42:59 2014 +0100 +@@ -42,7 +42,7 @@ + #include <strings.h> + #endif + +-#ifdef __linux__ ++#if defined(__linux__) || defined(_AIX) + #include <string.h> + #endif + +@@ -294,7 +294,13 @@ + jsize len; + jbyteArray bytes; + ++#ifdef _AIX ++ /* strerror() is not thread-safe on AIX so we have to use strerror_r() */ ++ char buffer[256]; ++ msg = (strerror_r((int)error, buffer, 256) == 0) ? buffer : "Error while calling strerror_r"; ++#else + msg = strerror((int)error); ++#endif + len = strlen(msg); + bytes = (*env)->NewByteArray(env, len); + if (bytes != NULL) { +@@ -674,6 +680,15 @@ + /* EINTR not listed as a possible error */ + /* TDB: reentrant version probably not required here */ + res = readdir64_r(dirp, ptr, &result); ++ ++#ifdef _AIX ++ /* On AIX, readdir_r() returns EBADF (i.e. '9') and sets 'result' to NULL for the */ ++ /* directory stream end. Otherwise, 'errno' will contain the error code. */ ++ if (res != 0) { ++ res = (result == NULL && res == EBADF) ? 0 : errno; ++ } ++#endif ++ + if (res != 0) { + throwUnixException(env, res); + return NULL; +@@ -877,6 +892,18 @@ + if (err == -1) { + throwUnixException(env, errno); + } else { ++#ifdef _AIX ++ /* AIX returns ULONG_MAX in buf.f_blocks for the /proc file system. */ ++ /* This is too big for a Java signed long and fools various tests. */ ++ if (buf.f_blocks == ULONG_MAX) { ++ buf.f_blocks = 0; ++ } ++ /* The number of free or available blocks can never exceed the total number of blocks */ ++ if (buf.f_blocks == 0) { ++ buf.f_bfree = 0; ++ buf.f_bavail = 0; ++ } ++#endif + (*env)->SetLongField(env, attrs, attrs_f_frsize, long_to_jlong(buf.f_frsize)); + (*env)->SetLongField(env, attrs, attrs_f_blocks, long_to_jlong(buf.f_blocks)); + (*env)->SetLongField(env, attrs, attrs_f_bfree, long_to_jlong(buf.f_bfree)); +--- ./jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2012, 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 +@@ -49,8 +49,16 @@ + (JNIEnv *env, jclass thisClass, jstring jLibName) + { + const char *libName = (*env)->GetStringUTFChars(env, jLibName, NULL); ++ if (libName == NULL) { ++ return 0L; ++ } ++ + // look up existing handle only, do not load ++#if defined(AIX) ++ void *hModule = dlopen(libName, RTLD_LAZY); ++#else + void *hModule = dlopen(libName, RTLD_NOLOAD); ++#endif + dprintf2("-handle for %s: %u\n", libName, hModule); + (*env)->ReleaseStringUTFChars(env, jLibName, libName); + return ptr_to_jlong(hModule); +@@ -61,6 +69,9 @@ + { + void *hModule; + const char *libName = (*env)->GetStringUTFChars(env, jLibName, NULL); ++ if (libName == NULL) { ++ return 0L; ++ } + + dprintf1("-lib %s\n", libName); + hModule = dlopen(libName, RTLD_LAZY); +--- ./jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + */ + + /* Copyright (c) 2002 Graz University of Technology. All rights reserved. +@@ -88,6 +88,9 @@ + const char *getFunctionListStr; + + const char *libraryNameStr = (*env)->GetStringUTFChars(env, jPkcs11ModulePath, 0); ++ if (libraryNameStr == NULL) { ++ return; ++ } + TRACE1("DEBUG: connect to PKCS#11 module: %s ... ", libraryNameStr); + + +@@ -123,6 +126,9 @@ + // with the old JAR file jGetFunctionList is null, temporarily check for that + if (jGetFunctionList != NULL) { + getFunctionListStr = (*env)->GetStringUTFChars(env, jGetFunctionList, 0); ++ if (getFunctionListStr == NULL) { ++ return; ++ } + C_GetFunctionList = (CK_C_GetFunctionList) dlsym(hModule, getFunctionListStr); + (*env)->ReleaseStringUTFChars(env, jGetFunctionList, getFunctionListStr); + } +--- ./jdk/src/solaris/native/sun/security/smartcardio/MUSCLE/pcsclite.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/security/smartcardio/MUSCLE/pcsclite.h Wed Jul 30 18:42:59 2014 +0100 +@@ -62,6 +62,8 @@ + + #define MAX_ATR_SIZE 33 /* Maximum ATR size */ + ++#ifndef __APPLE__ ++ + typedef struct + { + const char *szReader; +@@ -73,9 +75,6 @@ + } + SCARD_READERSTATE_A; + +-typedef SCARD_READERSTATE_A SCARD_READERSTATE, *PSCARD_READERSTATE_A, +- *LPSCARD_READERSTATE_A; +- + typedef struct _SCARD_IO_REQUEST + { + unsigned long dwProtocol; /* Protocol identifier */ +@@ -83,6 +82,33 @@ + } + SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST; + ++#else // __APPLE__ ++ ++#pragma pack(1) ++typedef struct ++{ ++ const char *szReader; ++ void *pvUserData; ++ uint32_t dwCurrentState; ++ uint32_t dwEventState; ++ uint32_t cbAtr; ++ unsigned char rgbAtr[MAX_ATR_SIZE]; ++} ++SCARD_READERSTATE_A; ++ ++typedef struct _SCARD_IO_REQUEST ++{ ++ uint32_t dwProtocol; /* Protocol identifier */ ++ uint32_t cbPciLength; /* Protocol Control Inf Length */ ++} ++SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST; ++#pragma pack() ++ ++#endif // __APPLE__ ++ ++typedef SCARD_READERSTATE_A SCARD_READERSTATE, *PSCARD_READERSTATE_A, ++ *LPSCARD_READERSTATE_A; ++ + typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST; + + extern SCARD_IO_REQUEST g_rgSCardT0Pci, g_rgSCardT1Pci, +--- ./jdk/src/solaris/native/sun/security/smartcardio/pcsc_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/security/smartcardio/pcsc_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -89,6 +89,10 @@ + JNIEXPORT void JNICALL Java_sun_security_smartcardio_PlatformPCSC_initialize + (JNIEnv *env, jclass thisClass, jstring jLibName) { + const char *libName = (*env)->GetStringUTFChars(env, jLibName, NULL); ++ if (libName == NULL) { ++ throwNullPointerException(env, "PCSC library name is null"); ++ return; ++ } + hModule = dlopen(libName, RTLD_LAZY); + (*env)->ReleaseStringUTFChars(env, jLibName, libName); + +@@ -97,13 +101,44 @@ + return; + } + scardEstablishContext = (FPTR_SCardEstablishContext)findFunction(env, hModule, "SCardEstablishContext"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardConnect = (FPTR_SCardConnect) findFunction(env, hModule, "SCardConnect"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardDisconnect = (FPTR_SCardDisconnect) findFunction(env, hModule, "SCardDisconnect"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardStatus = (FPTR_SCardStatus) findFunction(env, hModule, "SCardStatus"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardGetStatusChange = (FPTR_SCardGetStatusChange) findFunction(env, hModule, "SCardGetStatusChange"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardTransmit = (FPTR_SCardTransmit) findFunction(env, hModule, "SCardTransmit"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardListReaders = (FPTR_SCardListReaders) findFunction(env, hModule, "SCardListReaders"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardBeginTransaction = (FPTR_SCardBeginTransaction)findFunction(env, hModule, "SCardBeginTransaction"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } + scardEndTransaction = (FPTR_SCardEndTransaction) findFunction(env, hModule, "SCardEndTransaction"); ++ if ((*env)->ExceptionCheck(env)) { ++ return; ++ } ++#ifndef __APPLE__ + scardControl = (FPTR_SCardControl) findFunction(env, hModule, "SCardControl"); ++#else ++ scardControl = (FPTR_SCardControl) findFunction(env, hModule, "SCardControl132"); ++#endif // __APPLE__ + } +--- ./jdk/src/solaris/native/sun/xawt/XToolkit.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/xawt/XToolkit.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -40,6 +40,7 @@ + #include "awt_Component.h" + #include "awt_MenuComponent.h" + #include "awt_Font.h" ++#include "awt_util.h" + + #include "sun_awt_X11_XToolkit.h" + #include "java_awt_SystemColor.h" +@@ -76,6 +77,8 @@ + #ifndef HEADLESS + + extern Display* awt_init_Display(JNIEnv *env, jobject this); ++extern void freeNativeStringArray(char **array, long length); ++extern char** stringArrayToNative(JNIEnv *env, jobjectArray array, jsize * ret_length); + + struct XFontPeerIDs xFontPeerIDs; + +@@ -103,9 +106,11 @@ + (JNIEnv *env, jclass clazz) + { + jfieldID fid = (*env)->GetStaticFieldID(env, clazz, "numLockMask", "I"); ++ CHECK_NULL(fid); + awt_NumLockMask = (*env)->GetStaticIntField(env, clazz, fid); + DTRACE_PRINTLN1("awt_NumLockMask = %u", awt_NumLockMask); + fid = (*env)->GetStaticFieldID(env, clazz, "modLockIsShiftLock", "I"); ++ CHECK_NULL(fid); + awt_ModLockIsShiftLock = (*env)->GetStaticIntField(env, clazz, fid) != 0 ? True : False; + } + +@@ -173,21 +178,31 @@ + + + componentIDs.x = (*env)->GetFieldID(env, cls, "x", "I"); ++ CHECK_NULL(componentIDs.x); + componentIDs.y = (*env)->GetFieldID(env, cls, "y", "I"); ++ CHECK_NULL(componentIDs.y); + componentIDs.width = (*env)->GetFieldID(env, cls, "width", "I"); ++ CHECK_NULL(componentIDs.width); + componentIDs.height = (*env)->GetFieldID(env, cls, "height", "I"); ++ CHECK_NULL(componentIDs.height); + componentIDs.isPacked = (*env)->GetFieldID(env, cls, "isPacked", "Z"); ++ CHECK_NULL(componentIDs.isPacked); + componentIDs.peer = + (*env)->GetFieldID(env, cls, "peer", "Ljava/awt/peer/ComponentPeer;"); ++ CHECK_NULL(componentIDs.peer); + componentIDs.background = + (*env)->GetFieldID(env, cls, "background", "Ljava/awt/Color;"); ++ CHECK_NULL(componentIDs.background); + componentIDs.foreground = + (*env)->GetFieldID(env, cls, "foreground", "Ljava/awt/Color;"); ++ CHECK_NULL(componentIDs.foreground); + componentIDs.graphicsConfig = + (*env)->GetFieldID(env, cls, "graphicsConfig", + "Ljava/awt/GraphicsConfiguration;"); ++ CHECK_NULL(componentIDs.graphicsConfig); + componentIDs.name = + (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;"); ++ CHECK_NULL(componentIDs.name); + + /* Use _NoClientCode() methods for trusted methods, so that we + * know that we are not invoking client code on trusted threads +@@ -195,19 +210,20 @@ + componentIDs.getParent = + (*env)->GetMethodID(env, cls, "getParent_NoClientCode", + "()Ljava/awt/Container;"); ++ CHECK_NULL(componentIDs.getParent); + + componentIDs.getLocationOnScreen = + (*env)->GetMethodID(env, cls, "getLocationOnScreen_NoTreeLock", + "()Ljava/awt/Point;"); ++ CHECK_NULL(componentIDs.getLocationOnScreen); + + keyclass = (*env)->FindClass(env, "java/awt/event/KeyEvent"); +- if (JNU_IsNull(env, keyclass)) { +- return; +- } ++ CHECK_NULL(keyclass); + + componentIDs.isProxyActive = + (*env)->GetFieldID(env, keyclass, "isProxyActive", + "Z"); ++ CHECK_NULL(componentIDs.isProxyActive); + + componentIDs.appContext = + (*env)->GetFieldID(env, cls, "appContext", +@@ -339,7 +355,7 @@ + static void waitForEvents(JNIEnv *, jlong); + static void awt_pipe_init(); + static void processOneEvent(XtInputMask iMask); +-static void performPoll(JNIEnv *, jlong); ++static Boolean performPoll(JNIEnv *, jlong); + static void wakeUp(); + static void update_poll_timeout(int timeout_control); + static uint32_t get_poll_timeout(jlong nextTaskTime); +@@ -608,11 +624,13 @@ + */ + void + waitForEvents(JNIEnv *env, jlong nextTaskTime) { +- performPoll(env, nextTaskTime); +- if ((awt_next_flush_time > 0) && (awtJNI_TimeMillis() >= awt_next_flush_time)) { +- XFlush(awt_display); +- awt_last_flush_time = awt_next_flush_time; +- awt_next_flush_time = 0LL; ++ if (performPoll(env, nextTaskTime) ++ && (awt_next_flush_time > 0) ++ && (awtJNI_TimeMillis() >= awt_next_flush_time)) { ++ ++ XFlush(awt_display); ++ awt_last_flush_time = awt_next_flush_time; ++ awt_next_flush_time = 0LL; + } + } /* waitForEvents() */ + +@@ -646,7 +664,7 @@ + * + * The fdAWTPipe will be empty when this returns. + */ +-static void ++static Boolean + performPoll(JNIEnv *env, jlong nextTaskTime) { + static Bool pollFdsInited = False; + static char read_buf[AWT_POLL_BUFSIZE + 1]; /* dummy buf to empty pipe */ +@@ -673,7 +691,9 @@ + /* ACTUALLY DO THE POLL() */ + if (timeout == 0) { + // be sure other threads get a chance +- awtJNI_ThreadYield(env); ++ if (!awtJNI_ThreadYield(env)) { ++ return FALSE; ++ } + } + + if (tracing) poll_sleep_time = awtJNI_TimeMillis(); +@@ -701,7 +721,7 @@ + update_poll_timeout(TIMEOUT_EVENTS); + PRINT2("performPoll(): TIMEOUT_EVENTS curPollTimeout = %ld \n", curPollTimeout); + } +- return; ++ return TRUE; + + } /* performPoll() */ + +@@ -856,23 +876,25 @@ + xawt_root_window = get_xawt_root_shell(env); + + if ( xawt_root_window == None ) { ++ AWT_UNLOCK(); + JNU_ThrowNullPointerException(env, "AWT root shell is unrealized"); +- AWT_UNLOCK(); + return; + } + + command = (char *) JNU_GetStringPlatformChars(env, jcommand, NULL); +- c[0] = (char *)command; +- status = XmbTextListToTextProperty(awt_display, c, 1, +- XStdICCTextStyle, &text_prop); ++ if (command != NULL) { ++ c[0] = (char *)command; ++ status = XmbTextListToTextProperty(awt_display, c, 1, ++ XStdICCTextStyle, &text_prop); + +- if (status == Success || status > 0) { +- XSetTextProperty(awt_display, xawt_root_window, +- &text_prop, XA_WM_COMMAND); +- if (text_prop.value != NULL) +- XFree(text_prop.value); ++ if (status == Success || status > 0) { ++ XSetTextProperty(awt_display, xawt_root_window, ++ &text_prop, XA_WM_COMMAND); ++ if (text_prop.value != NULL) ++ XFree(text_prop.value); ++ } ++ JNU_ReleaseStringPlatformChars(env, jcommand, command); + } +- JNU_ReleaseStringPlatformChars(env, jcommand, command); + AWT_UNLOCK(); + } + +@@ -886,96 +908,56 @@ + * name. It's not! It's just a plain function. + */ + JNIEXPORT void JNICALL +-Java_sun_awt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jargv) ++Java_sun_awt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jarray) + { +- static const char empty[] = ""; +- +- int argc; +- const char **cargv; ++ jsize length; ++ char ** array; + XTextProperty text_prop; + int status; +- int i; + Window xawt_root_window; + + AWT_LOCK(); + xawt_root_window = get_xawt_root_shell(env); + + if (xawt_root_window == None) { ++ AWT_UNLOCK(); + JNU_ThrowNullPointerException(env, "AWT root shell is unrealized"); +- AWT_UNLOCK(); + return; + } + +- argc = (int)(*env)->GetArrayLength(env, jargv); +- if (argc == 0) { +- AWT_UNLOCK(); +- return; ++ array = stringArrayToNative(env, jarray, &length); ++ ++ if (array != NULL) { ++ status = XmbTextListToTextProperty(awt_display, array, length, ++ XStdICCTextStyle, &text_prop); ++ if (status < 0) { ++ switch (status) { ++ case XNoMemory: ++ JNU_ThrowOutOfMemoryError(env, ++ "XmbTextListToTextProperty: XNoMemory"); ++ break; ++ case XLocaleNotSupported: ++ JNU_ThrowInternalError(env, ++ "XmbTextListToTextProperty: XLocaleNotSupported"); ++ break; ++ case XConverterNotFound: ++ JNU_ThrowNullPointerException(env, ++ "XmbTextListToTextProperty: XConverterNotFound"); ++ break; ++ default: ++ JNU_ThrowInternalError(env, ++ "XmbTextListToTextProperty: unknown error"); ++ } ++ } else { ++ XSetTextProperty(awt_display, xawt_root_window, ++ &text_prop, XA_WM_COMMAND); ++ } ++ ++ if (text_prop.value != NULL) ++ XFree(text_prop.value); ++ ++ freeNativeStringArray(array, length); + } +- +- /* array of C strings */ +- cargv = (const char **)calloc(argc, sizeof(char *)); +- if (cargv == NULL) { +- JNU_ThrowOutOfMemoryError(env, "Unable to allocate cargv"); +- AWT_UNLOCK(); +- return; +- } +- +- /* fill C array with platform chars of java strings */ +- for (i = 0; i < argc; ++i) { +- jstring js; +- const char *cs; +- +- cs = NULL; +- js = (*env)->GetObjectArrayElement(env, jargv, i); +- if (js != NULL) { +- cs = JNU_GetStringPlatformChars(env, js, NULL); +- } +- if (cs == NULL) { +- cs = empty; +- } +- cargv[i] = cs; +- (*env)->DeleteLocalRef(env, js); +- } +- +- /* grr, X prototype doesn't declare cargv as const, thought it really is */ +- status = XmbTextListToTextProperty(awt_display, (char **)cargv, argc, +- XStdICCTextStyle, &text_prop); +- if (status < 0) { +- switch (status) { +- case XNoMemory: +- JNU_ThrowOutOfMemoryError(env, +- "XmbTextListToTextProperty: XNoMemory"); +- break; +- case XLocaleNotSupported: +- JNU_ThrowInternalError(env, +- "XmbTextListToTextProperty: XLocaleNotSupported"); +- break; +- case XConverterNotFound: +- JNU_ThrowNullPointerException(env, +- "XmbTextListToTextProperty: XConverterNotFound"); +- break; +- default: +- JNU_ThrowInternalError(env, +- "XmbTextListToTextProperty: unknown error"); +- } +- } else { +- +- XSetTextProperty(awt_display, xawt_root_window, +- &text_prop, XA_WM_COMMAND); +- } +- +- for (i = 0; i < argc; ++i) { +- jstring js; +- +- if (cargv[i] == empty) +- continue; +- +- js = (*env)->GetObjectArrayElement(env, jargv, i); +- JNU_ReleaseStringPlatformChars(env, js, cargv[i]); +- (*env)->DeleteLocalRef(env, js); +- } +- if (text_prop.value != NULL) +- XFree(text_prop.value); + AWT_UNLOCK(); + } + +--- ./jdk/src/solaris/native/sun/xawt/XWindow.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/xawt/XWindow.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2012, 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 +@@ -1242,9 +1242,13 @@ + { + char *ptr = NULL; + windowID = (*env)->GetFieldID(env, clazz, "window", "J"); ++ CHECK_NULL(windowID); + targetID = (*env)->GetFieldID(env, clazz, "target", "Ljava/awt/Component;"); ++ CHECK_NULL(targetID); + graphicsConfigID = (*env)->GetFieldID(env, clazz, "graphicsConfig", "Lsun/awt/X11GraphicsConfig;"); ++ CHECK_NULL(graphicsConfigID); + drawStateID = (*env)->GetFieldID(env, clazz, "drawState", "I"); ++ CHECK_NULL(drawStateID); + ptr = getenv("_AWT_USE_TYPE4_PATCH"); + if( ptr != NULL && ptr[0] != 0 ) { + if( strncmp("true", ptr, 4) == 0 ) { +--- ./jdk/src/solaris/native/sun/xawt/XlibWrapper.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/xawt/XlibWrapper.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -48,6 +48,7 @@ + #include "utility/rect.h" + + #include <X11/XKBlib.h> ++ + #if defined(DEBUG) || defined(INTERNAL_BUILD) + static jmethodID lockIsHeldMID = NULL; + +@@ -59,17 +60,94 @@ + lockIsHeldMID = + (*env)->GetStaticMethodID(env, tkClass, + "isAWTLockHeldByCurrentThread", "()Z"); ++ if (lockIsHeldMID == NULL) return; + } + if (!(*env)->CallStaticBooleanMethod(env, tkClass, lockIsHeldMID)) { + JNU_ThrowInternalError(env, "Current thread does not hold AWT_LOCK!"); + } + } + +-#define AWT_CHECK_HAVE_LOCK() CheckHaveAWTLock(env) ++#define AWT_CHECK_HAVE_LOCK() \ ++ do { \ ++ CheckHaveAWTLock(env); \ ++ if ((*env)->ExceptionCheck(env)) { \ ++ return; \ ++ } \ ++ } while (0); \ ++ ++#define AWT_CHECK_HAVE_LOCK_RETURN(ret) \ ++ do { \ ++ CheckHaveAWTLock(env); \ ++ if ((*env)->ExceptionCheck(env)) { \ ++ return (ret); \ ++ } \ ++ } while (0); \ ++ + #else + #define AWT_CHECK_HAVE_LOCK() ++#define AWT_CHECK_HAVE_LOCK_RETURN(ret) + #endif + ++void freeNativeStringArray(char **array, jsize length) { ++ int i; ++ if (array == NULL) { ++ return; ++ } ++ for (i = 0; i < length; i++) { ++ free(array[i]); ++ } ++ free(array); ++} ++ ++char** stringArrayToNative(JNIEnv *env, jobjectArray array, jsize * ret_length) { ++ Bool err = FALSE; ++ char ** strings; ++ int index, str_index = 0; ++ jsize length = (*env)->GetArrayLength(env, array); ++ ++ if (length == 0) { ++ return NULL; ++ } ++ ++ strings = (char**) calloc(length, sizeof (char*)); ++ ++ if (strings == NULL) { ++ JNU_ThrowOutOfMemoryError(env, ""); ++ return NULL; ++ } ++ ++ for (index = 0; index < length; index++) { ++ jstring str = (*env)->GetObjectArrayElement(env, array, index); ++ if (str != NULL) { ++ const char * str_char = JNU_GetStringPlatformChars(env, str, NULL); ++ if (str_char != NULL) { ++ char * dup_str = strdup(str_char); ++ if (dup_str != NULL) { ++ strings[str_index++] = dup_str; ++ } else { ++ JNU_ThrowOutOfMemoryError(env, ""); ++ err = TRUE; ++ } ++ JNU_ReleaseStringPlatformChars(env, str, str_char); ++ } else { ++ err = TRUE; ++ } ++ (*env)->DeleteLocalRef(env, str); ++ if (err) { ++ break; ++ } ++ } ++ } ++ ++ if (err) { ++ freeNativeStringArray(strings, str_index); ++ strings = NULL; ++ str_index = -1; ++ } ++ *ret_length = str_index; ++ ++ return strings; ++} + + /* + * Class: XlibWrapper +@@ -81,7 +159,7 @@ + (JNIEnv *env, jclass clazz, jlong display_name) + { + Display *dp; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + dp = XOpenDisplay((char *) jlong_to_ptr(display_name)); + + return ptr_to_jlong(dp); +@@ -97,7 +175,7 @@ + JNIEXPORT jlong JNICALL + Java_sun_awt_X11_XlibWrapper_XDisplayString(JNIEnv *env, jclass clazz, + jlong display) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ptr_to_jlong(XDisplayString((Display*) jlong_to_ptr(display))); + } + +@@ -115,7 +193,7 @@ + */ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DefaultScreen (JNIEnv *env, jclass clazz, jlong display) { + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong) DefaultScreen((Display *) jlong_to_ptr(display)); + } + +@@ -125,7 +203,7 @@ + * Signature: (JJ)J + */ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_ScreenOfDisplay(JNIEnv *env, jclass clazz, jlong display, jlong screen_number) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ptr_to_jlong(ScreenOfDisplay((Display *) jlong_to_ptr(display), + screen_number)); + } +@@ -136,7 +214,7 @@ + * Signature: (J)I + */ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_DoesBackingStore(JNIEnv *env, jclass clazz, jlong screen) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jint) DoesBackingStore((Screen*) jlong_to_ptr(screen)); + } + +@@ -148,7 +226,7 @@ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidth + (JNIEnv *env, jclass clazz, jlong display, jlong screen) { + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong) DisplayWidth((Display *) jlong_to_ptr(display),screen); + + } +@@ -160,7 +238,7 @@ + */ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidthMM + (JNIEnv *env, jclass clazz, jlong display, jlong screen) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong) DisplayWidthMM((Display *) jlong_to_ptr(display),screen); + } + +@@ -172,7 +250,7 @@ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeight + (JNIEnv *env, jclass clazz, jlong display, jlong screen) { + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong) DisplayHeight((Display *) jlong_to_ptr(display),screen); + } + /* +@@ -182,7 +260,7 @@ + */ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeightMM + (JNIEnv *env, jclass clazz, jlong display, jlong screen) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong) DisplayHeightMM((Display *) jlong_to_ptr(display),screen); + } + +@@ -193,7 +271,7 @@ + */ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_RootWindow + (JNIEnv *env , jclass clazz, jlong display, jlong screen_number) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong) RootWindow((Display *) jlong_to_ptr(display), screen_number); + } + +@@ -203,7 +281,7 @@ + */ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_ScreenCount + (JNIEnv *env , jclass clazz, jlong display) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ScreenCount((Display *) jlong_to_ptr(display)); + } + +@@ -218,7 +296,7 @@ + jint x, jint y, jint w, jint h , jint border_width, jint depth, + jlong wclass, jlong visual, jlong valuemask, jlong attributes) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XCreateWindow((Display *) jlong_to_ptr(display),(Window) window, x, y, w, h, + border_width, depth, wclass, (Visual *) jlong_to_ptr(visual), + valuemask, (XSetWindowAttributes *) jlong_to_ptr(attributes)); +@@ -360,7 +438,7 @@ + + Window focusOwner; + int revert_to; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + XGetInputFocus( (Display *)jlong_to_ptr(display), &focusOwner, &revert_to); + return focusOwner; + } +@@ -383,7 +461,7 @@ + jint owner_events, jint event_mask, jint pointer_mode, + jint keyboard_mode, jlong confine_to, jlong cursor, jlong time) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XGrabPointer( (Display *)jlong_to_ptr(display), (Window) window, + (Bool) owner_events, (unsigned int) event_mask, (int) pointer_mode, + (int) keyboard_mode, (Window) confine_to, (Cursor) cursor, (Time) time); +@@ -401,7 +479,7 @@ + jint owner_events, jint pointer_mode, + jint keyboard_mode, jlong time) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XGrabKeyboard( (Display *)jlong_to_ptr(display), (Window) window, + (Bool) owner_events, (int) pointer_mode, + (int) keyboard_mode, (Time) time); +@@ -474,7 +552,7 @@ + (JNIEnv *env, jclass clazz, jlong display, jlong opcode_rtrn, jlong event_rtrn, + jlong error_rtrn, jlong major_in_out, jlong minor_in_out) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + return XkbQueryExtension( (Display *) jlong_to_ptr(display), + (int *) jlong_to_ptr(opcode_rtrn), + (int *) jlong_to_ptr(event_rtrn), +@@ -485,7 +563,7 @@ + JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion + (JNIEnv *env, jclass clazz, jlong lib_major_in_out, jlong lib_minor_in_out) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + *((int *)jlong_to_ptr(lib_major_in_out)) = XkbMajorVersion; + *((int *)jlong_to_ptr(lib_minor_in_out)) = XkbMinorVersion; + return XkbLibraryVersion((int *)jlong_to_ptr(lib_major_in_out), (int *)jlong_to_ptr(lib_minor_in_out)); +@@ -494,7 +572,7 @@ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetMap + (JNIEnv *env, jclass clazz, jlong display, jlong which, jlong device_spec) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong) XkbGetMap( (Display *) jlong_to_ptr(display), + (unsigned int) which, + (unsigned int) device_spec); +@@ -502,7 +580,7 @@ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap + (JNIEnv *env, jclass clazz, jlong display, jlong which, jlong xkb) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong) XkbGetUpdatedMap( (Display *) jlong_to_ptr(display), + (unsigned int) which, + (XkbDescPtr) jlong_to_ptr(xkb)); +@@ -516,6 +594,7 @@ + JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode + (JNIEnv *env, jclass clazz, jlong xkb, jint keycode, jlong mods, jlong mods_rtrn, jlong keysym_rtrn) + { ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + Bool b; + b = XkbTranslateKeyCode((XkbDescPtr)xkb, (unsigned int)keycode, (unsigned int)mods, + (unsigned int *)jlong_to_ptr(mods_rtrn), +@@ -578,7 +657,7 @@ + JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XFilterEvent + (JNIEnv *env, jclass clazz, jlong ptr, jlong window) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + return (jboolean) XFilterEvent((XEvent *) jlong_to_ptr(ptr), (Window) window); + } + +@@ -590,7 +669,7 @@ + JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XSupportsLocale + (JNIEnv *env, jclass clazz) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + return (jboolean)XSupportsLocale(); + } + +@@ -607,9 +686,10 @@ + + if (!JNU_IsNull(env, jstr)) { + modifier_list = (char *)JNU_GetStringPlatformChars(env, jstr, NULL); ++ CHECK_NULL_RETURN(modifier_list, NULL); + } + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(NULL); + if (modifier_list) { + ret = XSetLocaleModifiers(modifier_list); + JNU_ReleaseStringPlatformChars(env, jstr, (const char *) modifier_list); +@@ -722,7 +802,7 @@ + jlong src_x, jlong src_y, jlong dest_x_return, jlong dest_y_return, + jlong child_return) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XTranslateCoordinates( (Display *) jlong_to_ptr(display), src_w, dest_w, + src_x, src_y, + (int *) jlong_to_ptr(dest_x_return), +@@ -733,7 +813,7 @@ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XEventsQueued + (JNIEnv *env, jclass clazz, jlong display, jint mode) { + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XEventsQueued((Display *) jlong_to_ptr(display), mode); + + } +@@ -758,6 +838,7 @@ + #else + cname = (char *) JNU_GetStringPlatformChars(env, jstr, NULL); + #endif ++ CHECK_NULL(cname); + } else { + cname = ""; + } +@@ -814,8 +895,9 @@ + jlong type, jint format, jint mode, jstring value) + { + jboolean iscopy; ++ AWT_CHECK_HAVE_LOCK(); + const char * chars = JNU_GetStringPlatformChars(env, value, &iscopy); +- AWT_CHECK_HAVE_LOCK(); ++ CHECK_NULL(chars); + XChangeProperty((Display*)jlong_to_ptr(display), window, (Atom)property, + (Atom)type, format, mode, (unsigned char*)chars, strlen(chars)); + if (iscopy) { +@@ -833,7 +915,7 @@ + jlong long_length, jlong delete, jlong req_type, jlong actual_type, + jlong actual_format, jlong nitems_ptr, jlong bytes_after, jlong data_ptr) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XGetWindowProperty((Display*) jlong_to_ptr(display), window, property, long_offset, long_length, + delete, (Atom) req_type, (Atom*) jlong_to_ptr(actual_type), + (int *) jlong_to_ptr(actual_format), (unsigned long *) jlong_to_ptr(nitems_ptr), +@@ -857,23 +939,22 @@ + unsigned long nitems; + unsigned long bytes_after; + unsigned char * string; +- jstring res; +- AWT_CHECK_HAVE_LOCK(); ++ jstring res = NULL; ++ AWT_CHECK_HAVE_LOCK_RETURN(NULL); + status = XGetWindowProperty((Display*)jlong_to_ptr(display), window, + atom, 0, 0xFFFF, False, XA_STRING, + &actual_type, &actual_format, &nitems, &bytes_after, + &string); ++ + if (status != Success || string == NULL) { +- return NULL; ++ return NULL; + } + +- if (actual_type != XA_STRING || actual_format != 8) { ++ if (actual_type == XA_STRING && actual_format == 8) { ++ res = JNU_NewStringPlatform(env,(char*) string); ++ } + XFree(string); +- return NULL; +- } +- +- // Memory leak??? +- return JNU_NewStringPlatform(env,(char*) string); ++ return res; + } + + /* +@@ -887,13 +968,15 @@ + char *cname; + unsigned long atom; + ++ AWT_CHECK_HAVE_LOCK_RETURN(0); ++ + if (!JNU_IsNull(env, jstr)) { + cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL); ++ CHECK_NULL_RETURN(cname, 0); + } else { + cname = ""; + } + +- AWT_CHECK_HAVE_LOCK(); + atom = XInternAtom((Display *) jlong_to_ptr(display), cname, ife); + + if (!JNU_IsNull(env, jstr)) { +@@ -906,7 +989,7 @@ + + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XCreateFontCursor + (JNIEnv *env, jclass clazz, jlong display, jint shape) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XCreateFontCursor((Display *) jlong_to_ptr(display), (int) shape); + } + +@@ -919,7 +1002,7 @@ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreatePixmapCursor + (JNIEnv *env , jclass clazz, jlong display, jlong source, jlong mask, jlong fore, jlong back, jint x , jint y) { + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong) XCreatePixmapCursor((Display *) jlong_to_ptr(display), (Pixmap) source, (Pixmap) mask, + (XColor *) jlong_to_ptr(fore), (XColor *) jlong_to_ptr(back), x, y); + } +@@ -935,7 +1018,7 @@ + + Status status; + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + status = XQueryBestCursor((Display *) jlong_to_ptr(display), (Drawable) drawable, width,height, + (unsigned int *) jlong_to_ptr(width_return), (unsigned int *) jlong_to_ptr(height_return)); + +@@ -966,15 +1049,14 @@ + + Bool b; + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + b = XQueryPointer((Display *) jlong_to_ptr(display), + (Window) w, (Window *) jlong_to_ptr(root_return), (Window *) jlong_to_ptr(child_return), + (int *) jlong_to_ptr(root_x_return), (int *) jlong_to_ptr(root_y_return), + (int *) jlong_to_ptr(win_x_return), (int *) jlong_to_ptr(win_y_return), + (unsigned int *) jlong_to_ptr(mask_return)); +- if (b == True) return JNI_TRUE; +- else return JNI_FALSE; + ++ return b ? JNI_TRUE : JNI_FALSE; + } + + /* +@@ -1042,7 +1124,7 @@ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetPointerMapping + (JNIEnv *env, jclass clazz, jlong display, jlong map, jint buttonNumber) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XGetPointerMapping((Display*)jlong_to_ptr(display), (unsigned char*) jlong_to_ptr(map), buttonNumber); + } + +@@ -1061,31 +1143,26 @@ + if (!JNU_IsNull(env, program)) { + c_program = (char *)JNU_GetStringPlatformChars(env, program, NULL); + } ++ CHECK_NULL_RETURN(c_program, NULL); ++ + if (!JNU_IsNull(env, option)) { + c_option = (char *)JNU_GetStringPlatformChars(env, option, NULL); + } + +- if (c_program == NULL || c_option == NULL) { +- if (!JNU_IsNull(env, program)) { +- JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program); +- } +- if (!JNU_IsNull(env, option)) { +- JNU_ReleaseStringPlatformChars(env, option, (const char *) c_option); +- } ++ if (c_option == NULL) { ++ JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program); + return NULL; + } +- AWT_CHECK_HAVE_LOCK(); ++ ++ AWT_CHECK_HAVE_LOCK_RETURN(NULL); + c_res = XGetDefault((Display*)jlong_to_ptr(display), c_program, c_option); ++ // The strings returned by XGetDefault() are owned by Xlib and ++ // should not be modified or freed by the client. + +- if (!JNU_IsNull(env, program)) { +- JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program); +- } +- if (!JNU_IsNull(env, option)) { +- JNU_ReleaseStringPlatformChars(env, option, (const char *) c_option); +- } ++ JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program); ++ JNU_ReleaseStringPlatformChars(env, option, (const char *) c_option); + + if (c_res != NULL) { +- // Memory leak??? + return JNU_NewStringPlatform(env, c_res); + } else { + return NULL; +@@ -1103,7 +1180,7 @@ + { + XWindowAttributes attrs; + memset(&attrs, 0, sizeof(attrs)); +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + XGetWindowAttributes((Display *) jlong_to_ptr(display), window, &attrs); + return ptr_to_jlong(attrs.screen); + } +@@ -1116,7 +1193,7 @@ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XScreenNumberOfScreen + (JNIEnv *env, jclass clazz, jlong screen) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(-1); + if(jlong_to_ptr(screen) == NULL) { + return -1; + } +@@ -1131,7 +1208,7 @@ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XIconifyWindow + (JNIEnv *env, jclass clazz, jlong display, jlong window, jlong screenNumber) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XIconifyWindow((Display*) jlong_to_ptr(display), window, screenNumber); + } + +@@ -1158,10 +1235,9 @@ + unsigned char * str = (unsigned char*) jlong_to_ptr(str_ptr); + long length = strlen((char*)str); + jbyteArray res = (*env)->NewByteArray(env, length); +- void * storage = malloc(length+1); +- memcpy(storage, str, length+1); ++ CHECK_NULL_RETURN(res, NULL); + (*env)->SetByteArrayRegion(env, res, 0, length, +- (const signed char*) storage); ++ (const signed char*) str); + return res; + } + +@@ -1174,7 +1250,7 @@ + JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_ServerVendor + (JNIEnv *env, jclass clazz, jlong display) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(NULL); + return JNU_NewStringPlatform(env, ServerVendor((Display*)jlong_to_ptr(display))); + } + /* +@@ -1185,7 +1261,7 @@ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_VendorRelease + (JNIEnv *env, jclass clazz, jlong display) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return VendorRelease((Display*)jlong_to_ptr(display)); + } + /* +@@ -1203,7 +1279,7 @@ + // second, in which place in the keysymarray is XK_KP_7 + // using XKeycodeToKeysym. + int kc7; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + kc7 = XKeysymToKeycode((Display*)jlong_to_ptr(display), XK_KP_7); + if( !kc7 ) { + // keycode is not defined. Why, it's a reduced keyboard perhaps: +@@ -1226,7 +1302,7 @@ + (JNIEnv *env, jclass clazz, jlong display) + { + int xx; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + xx = XKeysymToKeycode((Display*)jlong_to_ptr(display), SunXK_F37); + return (!xx) ? JNI_FALSE : JNI_TRUE; + } +@@ -1242,7 +1318,7 @@ + int32_t i; + int32_t kanaCount = 0; + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + + // There's no direct way to determine whether the keyboard has + // a kana lock key. From available keyboard mapping tables, it looks +@@ -1289,8 +1365,10 @@ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler + (JNIEnv *env, jclass clazz) + { +- (*env)->GetJavaVM(env, &jvm); +- AWT_CHECK_HAVE_LOCK(); ++ if ((*env)->GetJavaVM(env, &jvm) < 0) { ++ return 0; ++ } ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ptr_to_jlong(XSetErrorHandler(ToolkitErrorHandler)); + } + +@@ -1350,28 +1428,14 @@ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XInternAtoms + (JNIEnv *env, jclass clazz, jlong display, jobjectArray names_arr, jboolean only_if_exists, jlong atoms) + { +- int length = (*env)->GetArrayLength(env, names_arr); +- char ** names = (char**)malloc(length*sizeof(char*)); +- jboolean copy; +- int index, name_index = 0; +- int status; +- +- AWT_CHECK_HAVE_LOCK(); +- +- for (index = 0; index < length; index++) { +- jstring str = (*env)->GetObjectArrayElement(env, names_arr, index); +- if (!JNU_IsNull(env, str)) { +- const char * str_char = JNU_GetStringPlatformChars(env, str, NULL); +- names[name_index++] = strdup(str_char); +- JNU_ReleaseStringPlatformChars(env, str, str_char); +- (*env)->DeleteLocalRef(env, str); +- } ++ int status = 0; ++ AWT_CHECK_HAVE_LOCK_RETURN(0); ++ jsize length; ++ char** names = stringArrayToNative(env, names_arr, &length); ++ if (names) { ++ status = XInternAtoms((Display*)jlong_to_ptr(display), names, length, only_if_exists, (Atom*) jlong_to_ptr(atoms)); ++ freeNativeStringArray(names, length); + } +- status = XInternAtoms((Display*)jlong_to_ptr(display), names, name_index, only_if_exists, (Atom*) jlong_to_ptr(atoms)); +- for (index = 0; index < length; index++) { +- free(names[index]); +- } +- free(names); + return status; + } + +@@ -1386,7 +1450,7 @@ + (JNIEnv *env, jclass clazz, jlong display, jlong window, jlong attr_ptr) + { + jint status; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + memset((XWindowAttributes*) jlong_to_ptr(attr_ptr), 0, sizeof(XWindowAttributes)); + status = XGetWindowAttributes((Display*)jlong_to_ptr(display), window, (XWindowAttributes*) jlong_to_ptr(attr_ptr)); + return status; +@@ -1404,7 +1468,7 @@ + jlong border_width_return, jlong depth_return) + { + jint status; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + status = XGetGeometry((Display *)jlong_to_ptr(display), + (Drawable)drawable, (Window *)jlong_to_ptr(root_return), + (int *)jlong_to_ptr(x_return), (int *)jlong_to_ptr(y_return), +@@ -1423,7 +1487,7 @@ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWMNormalHints + (JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints, jlong supplied_return) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XGetWMNormalHints((Display*) jlong_to_ptr(display), + window, + (XSizeHints*) jlong_to_ptr(hints), +@@ -1462,7 +1526,7 @@ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XSendEvent + (JNIEnv *env, jclass clazz, jlong display, jlong window, jboolean propagate, jlong event_mask, jlong event) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XSendEvent((Display*) jlong_to_ptr(display), + window, + propagate==JNI_TRUE?True:False, +@@ -1479,7 +1543,7 @@ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XQueryTree + (JNIEnv *env, jclass clazz, jlong display, jlong window, jlong root_return, jlong parent_return, jlong children_return, jlong nchildren_return) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XQueryTree((Display*) jlong_to_ptr(display), + window, + (Window *) jlong_to_ptr(root_return), +@@ -1524,7 +1588,7 @@ + (JNIEnv *env, jclass clazz, jlong display, jlong vinfo_mask, jlong vinfo_template, + jlong nitems_return) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ptr_to_jlong(XGetVisualInfo((Display*) jlong_to_ptr(display), + (long) vinfo_mask, + (XVisualInfo*) jlong_to_ptr(vinfo_template), +@@ -1534,7 +1598,7 @@ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XAllocSizeHints + (JNIEnv *env, jclass clazz) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ptr_to_jlong(XAllocSizeHints()); + } + +@@ -1560,7 +1624,7 @@ + (JNIEnv *env, jclass clazz, jlong display , jlong colormap, jlong xcolor) { + + Status status; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + status = XAllocColor((Display *) jlong_to_ptr(display), (Colormap) colormap, (XColor *) jlong_to_ptr(xcolor)); + + if (status == 0) return JNI_FALSE; +@@ -1575,7 +1639,7 @@ + */ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreateBitmapFromData + (JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong data, jint width, jint height) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + + return (jlong) XCreateBitmapFromData((Display *) jlong_to_ptr(display), (Drawable) drawable, + (char *) jlong_to_ptr(data), width, height); +@@ -1640,7 +1704,7 @@ + JNIEXPORT jlong JNICALL + Java_sun_awt_X11_XlibWrapper_XGetSelectionOwner(JNIEnv *env, jclass clazz, + jlong display, jlong selection) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return (jlong)XGetSelectionOwner((Display*)jlong_to_ptr(display), selection); + } + +@@ -1655,7 +1719,7 @@ + { + jstring string = NULL; + char* name; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(NULL); + name = (char*) XGetAtomName((Display*)jlong_to_ptr(display), atom); + + if (name == NULL) { +@@ -1679,21 +1743,21 @@ + JNIEXPORT jlong JNICALL + Java_sun_awt_X11_XlibWrapper_XMaxRequestSize(JNIEnv *env, jclass clazz, + jlong display) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XMaxRequestSize((Display*) jlong_to_ptr(display)); + } + + JNIEXPORT jlong JNICALL + Java_sun_awt_X11_XlibWrapper_XAllocWMHints(JNIEnv *env, jclass clazz) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ptr_to_jlong(XAllocWMHints()); + } + + JNIEXPORT jlong JNICALL + Java_sun_awt_X11_XlibWrapper_XCreatePixmap(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jint width, jint height, jint depth) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XCreatePixmap((Display*)jlong_to_ptr(display), (Drawable)drawable, width, height, depth); + } + JNIEXPORT jlong JNICALL +@@ -1702,7 +1766,7 @@ + jint depth, jint format, jint offset, jlong data, jint width, + jint height, jint bitmap_pad, jint bytes_per_line) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ptr_to_jlong(XCreateImage((Display*) jlong_to_ptr(display), (Visual*) jlong_to_ptr(visual_ptr), + depth, format, offset, (char*) jlong_to_ptr(data), + width, height, bitmap_pad, bytes_per_line)); +@@ -1712,7 +1776,7 @@ + (JNIEnv *env, jclass clazz, jlong display, jlong drawable, + jlong valuemask, jlong values) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ptr_to_jlong(XCreateGC((Display*) jlong_to_ptr(display), (Drawable)drawable, valuemask, (XGCValues*) jlong_to_ptr(values))); + } + +@@ -1762,7 +1826,7 @@ + XIconSize** psize = (XIconSize**) jlong_to_ptr(ret_sizes); + int * pcount = (int *) jlong_to_ptr(ret_count); + Status res; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + res = XGetIconSizes((Display*) jlong_to_ptr(display), (Window)window, psize, pcount); + return res; + } +@@ -1771,7 +1835,7 @@ + (JNIEnv *env, jclass clazz, jlong display, jlong major_version_return, + jlong minor_version_return) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XdbeQueryExtension((Display*) jlong_to_ptr(display), (int *) jlong_to_ptr(major_version_return), + (int *) jlong_to_ptr(minor_version_return)); + } +@@ -1784,11 +1848,12 @@ + Boolean bu; + if (!JNU_IsNull(env, jstr)) { + cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL); ++ CHECK_NULL_RETURN(cname, JNI_FALSE); + } else { + cname = ""; + } + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + bu = XQueryExtension((Display*) jlong_to_ptr(display), cname, (int *) jlong_to_ptr(mop_return), + (int *) jlong_to_ptr(feve_return), (int *) jlong_to_ptr(err_return)); + if (!JNU_IsNull(env, jstr)) { +@@ -1800,7 +1865,7 @@ + JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKeypadKey + (JNIEnv *env, jclass clazz, jlong keysym) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + if(IsKeypadKey(keysym)) { + return JNI_TRUE; + } +@@ -1810,7 +1875,7 @@ + JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XdbeAllocateBackBufferName + (JNIEnv *env, jclass clazz, jlong display, jlong window, jint swap_action) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XdbeAllocateBackBufferName((Display*) jlong_to_ptr(display), (Window) window, + (XdbeSwapAction) swap_action); + } +@@ -1818,28 +1883,28 @@ + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeDeallocateBackBufferName + (JNIEnv *env, jclass clazz, jlong display, jlong buffer) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XdbeDeallocateBackBufferName((Display*) jlong_to_ptr(display), (XdbeBackBuffer) buffer); + } + + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeBeginIdiom + (JNIEnv *env, jclass clazz, jlong display) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XdbeBeginIdiom((Display*) jlong_to_ptr(display)); + } + + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeEndIdiom + (JNIEnv *env, jclass clazz, jlong display) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XdbeEndIdiom((Display*) jlong_to_ptr(display)); + } + + JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeSwapBuffers + (JNIEnv *env, jclass clazz, jlong display, jlong swap_info, jint num_windows) + { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XdbeSwapBuffers((Display*) jlong_to_ptr(display), (XdbeSwapInfo *) jlong_to_ptr(swap_info), num_windows); + } + JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XQueryKeymap +@@ -1854,7 +1919,7 @@ + Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym(JNIEnv *env, jclass clazz, + jlong display, jint keycode, + jint index) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (int)index); + } + +@@ -1862,7 +1927,7 @@ + Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup(JNIEnv *env, jclass clazz, + jlong display) { + XkbStateRec sr; +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + memset(&sr, 0, sizeof(XkbStateRec)); + XkbGetState((Display*) jlong_to_ptr(display), XkbUseCoreKbd, &sr); + // printf("-------------------------------------VVVV\n"); +@@ -1887,21 +1952,21 @@ + Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym(JNIEnv *env, jclass clazz, + jlong display, jint keycode, + jint group, jint level) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XkbKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (unsigned int)group, (unsigned int)level); + } + + JNIEXPORT jint JNICALL + Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode(JNIEnv *env, jclass clazz, + jlong display, jlong keysym) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return XKeysymToKeycode((Display*) jlong_to_ptr(display), (KeySym)keysym); + } + + JNIEXPORT jlong JNICALL + Java_sun_awt_X11_XlibWrapper_XGetModifierMapping(JNIEnv *env, jclass clazz, + jlong display) { +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(0); + return ptr_to_jlong(XGetModifierMapping((Display*) jlong_to_ptr(display))); + } + +@@ -1958,7 +2023,7 @@ + jlong display, jlong ptr) { + uint32_t timeout = 1; + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + exitSecondaryLoop = False; + while (!exitSecondaryLoop) { + if (XCheckIfEvent((Display*) jlong_to_ptr(display), (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, NULL)) { +@@ -1996,7 +2061,7 @@ + static jclass stringClass = NULL; + jclass stringClassLocal = NULL; + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(NULL); + + if (JNU_IsNull(env, stringClass)) { + stringClassLocal = (*env)->FindClass(env, "java/lang/String"); +@@ -2148,7 +2213,7 @@ + { + jboolean status; + +- AWT_CHECK_HAVE_LOCK(); ++ AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); + + status = XShapeQueryExtension((Display *)jlong_to_ptr(display), + (int *)jlong_to_ptr(event_base_return), (int *)jlong_to_ptr(error_base_return)); +--- ./jdk/src/solaris/native/sun/xawt/awt_Desktop.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/solaris/native/sun/xawt/awt_Desktop.c Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,6 +23,7 @@ + * questions. + */ + ++#include "jni_util.h" + #include "gtk2_interface.h" + #include "gnome_interface.h" + +@@ -65,6 +66,12 @@ + const gchar* url_c; + + url_c = (char*)(*env)->GetByteArrayElements(env, url_j, NULL); ++ if (url_c == NULL) { ++ if (!(*env)->ExceptionCheck(env)) { ++ JNU_ThrowOutOfMemoryError(env, 0); ++ } ++ return JNI_FALSE; ++ } + + if (gtk_has_been_loaded) { + fp_gdk_threads_enter(); +--- ./jdk/src/windows/bin/java_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/bin/java_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 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 +@@ -179,7 +179,7 @@ + int wanted = running; + + char** argv = *pargv; +- for (i = 0; i < *pargc ; i++) { ++ for (i = 1; i < *pargc ; i++) { + if (JLI_StrCmp(argv[i], "-J-d64") == 0 || JLI_StrCmp(argv[i], "-d64") == 0) { + wanted = 64; + continue; +@@ -188,6 +188,11 @@ + wanted = 32; + continue; + } ++ ++ if (IsJavaArgs() && argv[i][0] != '-') ++ continue; ++ if (argv[i][0] != '-') ++ break; + } + if (running != wanted) { + JLI_ReportErrorMessage(JRE_ERROR2, wanted); +--- ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Wed Jul 30 18:42:59 2014 +0100 +@@ -55,13 +55,7 @@ + + static { + // Load library here +- AccessController.doPrivileged( +- new java.security.PrivilegedAction<Void>() { +- public Void run() { +- System.loadLibrary("awt"); +- return null; +- } +- }); ++ sun.awt.windows.WToolkit.loadLibraries(); + } + + public ShellFolder createShellFolder(File file) throws FileNotFoundException { +--- ./jdk/src/windows/classes/sun/awt/windows/ThemeReader.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/ThemeReader.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2004, 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 +@@ -25,11 +25,15 @@ + + package sun.awt.windows; + +-import java.awt.*; +-import java.util.*; +-import java.util.concurrent.locks.*; +-import java.beans.*; +-import javax.swing.SwingUtilities; ++import java.awt.Color; ++import java.awt.Dimension; ++import java.awt.Insets; ++import java.awt.Point; ++import java.util.HashMap; ++import java.util.Map; ++import java.util.concurrent.locks.Lock; ++import java.util.concurrent.locks.ReadWriteLock; ++import java.util.concurrent.locks.ReentrantReadWriteLock; + + /* !!!! WARNING !!!! + * This class has to be in sync with +@@ -45,9 +49,9 @@ + * @author Bino George + * @author Igor Kushnirskiy + */ +-public class ThemeReader { +- private static final HashMap<String, Long> widgetToTheme = +- new HashMap<String, Long>(); ++public final class ThemeReader { ++ ++ private static final Map<String, Long> widgetToTheme = new HashMap<>(); + + // lock for the cache + // reading should be done with readLock +@@ -64,7 +68,7 @@ + valid = false; + } + +- public native static boolean isThemed(); ++ public static native boolean isThemed(); + + // this should be called only with writeLock held + private static Long getThemeImpl(String widget) { +@@ -121,8 +125,9 @@ + return theme; + } + +- public native static void paintBackground(int[] buffer, long theme, int part, int state, +- int x, int y, int w, int h, int stride); ++ private static native void paintBackground(int[] buffer, long theme, ++ int part, int state, int x, ++ int y, int w, int h, int stride); + + public static void paintBackground(int[] buffer, String widget, + int part, int state, int x, int y, int w, int h, int stride) { +@@ -134,8 +139,8 @@ + } + } + +- public native static Insets getThemeMargins(long theme, int part, int state, +- int marginType); ++ private static native Insets getThemeMargins(long theme, int part, ++ int state, int marginType); + + public static Insets getThemeMargins(String widget, int part, int state, int marginType) { + readLock.lock(); +@@ -146,7 +151,7 @@ + } + } + +- private native static boolean isThemePartDefined(long theme, int part, int state); ++ private static native boolean isThemePartDefined(long theme, int part, int state); + + public static boolean isThemePartDefined(String widget, int part, int state) { + readLock.lock(); +@@ -157,8 +162,8 @@ + } + } + +- public native static Color getColor(long theme, int part, int state, +- int property); ++ private static native Color getColor(long theme, int part, int state, ++ int property); + + public static Color getColor(String widget, int part, int state, int property) { + readLock.lock(); +@@ -169,8 +174,8 @@ + } + } + +- public native static int getInt(long theme, int part, int state, +- int property); ++ private static native int getInt(long theme, int part, int state, ++ int property); + + public static int getInt(String widget, int part, int state, int property) { + readLock.lock(); +@@ -181,8 +186,8 @@ + } + } + +- public native static int getEnum(long theme, int part, int state, +- int property); ++ private static native int getEnum(long theme, int part, int state, ++ int property); + + public static int getEnum(String widget, int part, int state, int property) { + readLock.lock(); +@@ -193,8 +198,8 @@ + } + } + +- public native static boolean getBoolean(long theme, int part, int state, +- int property); ++ private static native boolean getBoolean(long theme, int part, int state, ++ int property); + + public static boolean getBoolean(String widget, int part, int state, + int property) { +@@ -206,7 +211,7 @@ + } + } + +- public native static boolean getSysBoolean(long theme, int property); ++ private static native boolean getSysBoolean(long theme, int property); + + public static boolean getSysBoolean(String widget, int property) { + readLock.lock(); +@@ -217,8 +222,8 @@ + } + } + +- public native static Point getPoint(long theme, int part, int state, +- int property); ++ private static native Point getPoint(long theme, int part, int state, ++ int property); + + public static Point getPoint(String widget, int part, int state, int property) { + readLock.lock(); +@@ -229,8 +234,8 @@ + } + } + +- public native static Dimension getPosition(long theme, int part, int state, +- int property); ++ private static native Dimension getPosition(long theme, int part, int state, ++ int property); + + public static Dimension getPosition(String widget, int part, int state, + int property) { +@@ -242,7 +247,8 @@ + } + } + +- public native static Dimension getPartSize(long theme, int part, int state); ++ private static native Dimension getPartSize(long theme, int part, ++ int state); + + public static Dimension getPartSize(String widget, int part, int state) { + readLock.lock(); +@@ -253,14 +259,15 @@ + } + } + +- public native static long openTheme(String widget); ++ private static native long openTheme(String widget); + +- public native static void closeTheme(long theme); ++ private static native void closeTheme(long theme); + +- public native static void setWindowTheme(String subAppName); ++ private static native void setWindowTheme(String subAppName); + +- private native static long getThemeTransitionDuration(long theme, int part, ++ private static native long getThemeTransitionDuration(long theme, int part, + int stateFrom, int stateTo, int propId); ++ + public static long getThemeTransitionDuration(String widget, int part, + int stateFrom, int stateTo, int propId) { + readLock.lock(); +@@ -271,10 +278,12 @@ + readLock.unlock(); + } + } +- public native static boolean isGetThemeTransitionDurationDefined(); + +- private native static Insets getThemeBackgroundContentMargins(long theme, ++ public static native boolean isGetThemeTransitionDurationDefined(); ++ ++ private static native Insets getThemeBackgroundContentMargins(long theme, + int part, int state, int boundingWidth, int boundingHeight); ++ + public static Insets getThemeBackgroundContentMargins(String widget, + int part, int state, int boundingWidth, int boundingHeight) { + readLock.lock(); +--- ./jdk/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -33,7 +33,6 @@ + import java.awt.image.BufferedImage; + import java.awt.image.DataBufferInt; + import java.awt.image.VolatileImage; +-import java.lang.ref.WeakReference; + import java.security.AccessController; + import sun.awt.image.BufImgSurfaceData; + import sun.java2d.DestSurfaceProvider; +@@ -46,7 +45,6 @@ + import sun.security.action.GetPropertyAction; + + import static java.awt.image.VolatileImage.*; +-import static java.awt.Transparency.*; + import static sun.java2d.pipe.hw.AccelSurface.*; + import static sun.java2d.pipe.hw.ContextCapabilities.*; + +@@ -59,7 +57,7 @@ + * Note: this class does not attempt to be thread safe, it is expected to be + * called from a single thread (EDT). + */ +-public abstract class TranslucentWindowPainter { ++abstract class TranslucentWindowPainter { + + protected Window window; + protected WWindowPeer peer; +@@ -231,6 +229,7 @@ + return (viBB != null ? !viBB.contentsLost() : true); + } + ++ @Override + public void flush() { + if (backBuffer != null) { + backBuffer.flush(); +@@ -313,6 +312,7 @@ + try { + BufferedContext.validateContext(as); + rq.flushAndInvokeNow(new Runnable() { ++ @Override + public void run() { + long psdops = as.getNativeOps(); + arr[0] = updateWindowAccel(psdops, w, h); +--- ./jdk/src/windows/classes/sun/awt/windows/WBufferStrategy.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WBufferStrategy.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -34,8 +34,9 @@ + * the back buffer associated with a Component. If that + * Component has a BufferStrategy with >1 buffer, then the + * Image subclass associated with that buffer will be returned. ++ * Note: the class is used by the JAWT3d. + */ +-public class WBufferStrategy { ++public final class WBufferStrategy { + + private static native void initIDs(Class <?> componentClass); + +--- ./jdk/src/windows/classes/sun/awt/windows/WButtonPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WButtonPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -37,6 +37,7 @@ + + // ComponentPeer overrides + ++ @Override + public Dimension getMinimumSize() { + FontMetrics fm = getFontMetrics(((Button)target).getFont()); + String label = ((Button)target).getLabel(); +@@ -46,12 +47,14 @@ + return new Dimension(fm.stringWidth(label) + 14, + fm.getHeight() + 8); + } ++ @Override + public boolean isFocusable() { + return true; + } + + // ButtonPeer implementation + ++ @Override + public native void setLabel(String label); + + // Toolkit & peer internals +@@ -60,6 +63,7 @@ + super(target); + } + ++ @Override + native void create(WComponentPeer peer); + + // native callbacks +@@ -70,6 +74,7 @@ + // Fixed 5064013: the InvocationEvent time should be equals + // the time of the ActionEvent + WToolkit.executeOnEventHandlerThread(target, new Runnable() { ++ @Override + public void run() { + postEvent(new ActionEvent(target, ActionEvent.ACTION_PERFORMED, + ((Button)target).getActionCommand(), +@@ -79,6 +84,7 @@ + } + + ++ @Override + public boolean shouldClearRectBeforePaint() { + return false; + } +@@ -88,6 +94,7 @@ + */ + private static native void initIDs(); + ++ @Override + public boolean handleJavaKeyEvent(KeyEvent e) { + switch (e.getID()) { + case KeyEvent.KEY_RELEASED: +--- ./jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WCanvasPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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,12 +24,16 @@ + */ + package sun.awt.windows; + +-import java.awt.*; +-import java.awt.peer.*; +-import java.lang.ref.WeakReference; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.GraphicsConfiguration; ++import java.awt.peer.CanvasPeer; ++ ++import sun.awt.PaintEventDispatcher; + import sun.awt.SunToolkit; +-import sun.awt.Win32GraphicsDevice; +-import sun.awt.PaintEventDispatcher; + + class WCanvasPeer extends WComponentPeer implements CanvasPeer { + +@@ -41,8 +45,10 @@ + super(target); + } + ++ @Override + native void create(WComponentPeer parent); + ++ @Override + void initialize() { + eraseBackground = !SunToolkit.getSunAwtNoerasebackground(); + boolean eraseBackgroundOnResize = SunToolkit.getSunAwtErasebackgroundonresize(); +@@ -60,6 +66,7 @@ + } + } + ++ @Override + public void paint(Graphics g) { + Dimension d = ((Component)target).getSize(); + if (g instanceof Graphics2D || +@@ -75,6 +82,7 @@ + super.paint(g); + } + ++ @Override + public boolean shouldClearRectBeforePaint() { + return eraseBackground; + } +@@ -99,6 +107,7 @@ + private native void setNativeBackgroundErase(boolean doErase, + boolean doEraseOnResize); + ++ @Override + public GraphicsConfiguration getAppropriateGraphicsConfiguration( + GraphicsConfiguration gc) + { +--- ./jdk/src/windows/classes/sun/awt/windows/WCheckboxMenuItemPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WCheckboxMenuItemPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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,14 +24,16 @@ + */ + package sun.awt.windows; + +-import java.awt.*; +-import java.awt.peer.*; ++import java.awt.CheckboxMenuItem; + import java.awt.event.ItemEvent; ++import java.awt.peer.CheckboxMenuItemPeer; + +-class WCheckboxMenuItemPeer extends WMenuItemPeer implements CheckboxMenuItemPeer { ++final class WCheckboxMenuItemPeer extends WMenuItemPeer ++ implements CheckboxMenuItemPeer { + + // CheckboxMenuItemPeer implementation + ++ @Override + public native void setState(boolean t); + + // Toolkit & peer internals +@@ -46,6 +48,7 @@ + public void handleAction(final boolean state) { + final CheckboxMenuItem target = (CheckboxMenuItem)this.target; + WToolkit.executeOnEventHandlerThread(target, new Runnable() { ++ @Override + public void run() { + target.setState(state); + postEvent(new ItemEvent(target, ItemEvent.ITEM_STATE_CHANGED, +--- ./jdk/src/windows/classes/sun/awt/windows/WCheckboxPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WCheckboxPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -32,12 +32,16 @@ + + // CheckboxPeer implementation + ++ @Override + public native void setState(boolean state); ++ @Override + public native void setCheckboxGroup(CheckboxGroup g); ++ @Override + public native void setLabel(String label); + + private static native int getCheckMarkSize(); + ++ @Override + public Dimension getMinimumSize() { + String lbl = ((Checkbox)target).getLabel(); + int marksize = getCheckMarkSize(); +@@ -54,6 +58,7 @@ + Math.max(fm.getHeight() + 8, marksize)); + } + ++ @Override + public boolean isFocusable() { + return true; + } +@@ -64,8 +69,10 @@ + super(target); + } + ++ @Override + native void create(WComponentPeer parent); + ++ @Override + void initialize() { + Checkbox t = (Checkbox)target; + setState(t.getState()); +@@ -79,6 +86,7 @@ + super.initialize(); + } + ++ @Override + public boolean shouldClearRectBeforePaint() { + return false; + } +@@ -88,6 +96,7 @@ + void handleAction(final boolean state) { + final Checkbox cb = (Checkbox)this.target; + WToolkit.executeOnEventHandlerThread(cb, new Runnable() { ++ @Override + public void run() { + CheckboxGroup chg = cb.getCheckboxGroup(); + if ((chg != null) && (cb == chg.getSelectedCheckbox()) && cb.getState()) { +--- ./jdk/src/windows/classes/sun/awt/windows/WChoicePeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WChoicePeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -36,6 +36,7 @@ + + // WComponentPeer overrides + ++ @Override + public Dimension getMinimumSize() { + FontMetrics fm = getFontMetrics(((Choice)target).getFont()); + Choice c = (Choice)target; +@@ -45,23 +46,29 @@ + } + return new Dimension(28 + w, Math.max(fm.getHeight() + 6, 15)); + } ++ @Override + public boolean isFocusable() { + return true; + } + + // ChoicePeer implementation + ++ @Override + public native void select(int index); + ++ @Override + public void add(String item, int index) { + addItem(item, index); + } + ++ @Override + public boolean shouldClearRectBeforePaint() { + return false; + } + ++ @Override + public native void removeAll(); ++ @Override + public native void remove(int index); + + /** +@@ -72,6 +79,7 @@ + } + public native void addItems(String[] items, int index); + ++ @Override + public synchronized native void reshape(int x, int y, int width, int height); + + private WindowListener windowListener; +@@ -82,8 +90,10 @@ + super(target); + } + ++ @Override + native void create(WComponentPeer parent); + ++ @Override + @SuppressWarnings("deprecation") + void initialize() { + Choice opt = (Choice)target; +@@ -104,9 +114,11 @@ + WWindowPeer wpeer = (WWindowPeer)parentWindow.getPeer(); + if (wpeer != null) { + windowListener = new WindowAdapter() { ++ @Override + public void windowIconified(WindowEvent e) { + closeList(); + } ++ @Override + public void windowClosing(WindowEvent e) { + closeList(); + } +@@ -117,6 +129,7 @@ + super.initialize(); + } + ++ @Override + @SuppressWarnings("deprecation") + protected void disposeImpl() { + // TODO: we should somehow reset the listener when the choice +@@ -136,6 +149,7 @@ + void handleAction(final int index) { + final Choice c = (Choice)target; + WToolkit.executeOnEventHandlerThread(c, new Runnable() { ++ @Override + public void run() { + c.select(index); + postEvent(new ItemEvent(c, ItemEvent.ITEM_STATE_CHANGED, +--- ./jdk/src/windows/classes/sun/awt/windows/WClipboard.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WClipboard.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -28,14 +28,11 @@ + import java.awt.datatransfer.DataFlavor; + import java.awt.datatransfer.Transferable; + import java.awt.datatransfer.UnsupportedFlavorException; +- + import java.io.IOException; +- +-import java.util.Iterator; + import java.util.Map; + ++import sun.awt.datatransfer.DataTransferer; + import sun.awt.datatransfer.SunClipboard; +-import sun.awt.datatransfer.DataTransferer; + + + /** +@@ -50,18 +47,20 @@ + * + * @since JDK1.1 + */ +-public class WClipboard extends SunClipboard { ++final class WClipboard extends SunClipboard { + + private boolean isClipboardViewerRegistered; + +- public WClipboard() { ++ WClipboard() { + super("System"); + } + ++ @Override + public long getID() { + return 0; + } + ++ @Override + protected void setContentsNative(Transferable contents) { + // Don't use delayed Clipboard rendering for the Transferable's data. + // If we did that, we would call Transferable.getTransferData on +@@ -106,6 +105,7 @@ + * Currently delayed data rendering is not used for the Windows clipboard, + * so there is no native context to clear. + */ ++ @Override + protected void clearNativeContext() {} + + /** +@@ -114,11 +114,13 @@ + * + * @throws IllegalStateException if the clipboard has not been opened + */ ++ @Override + public native void openClipboard(SunClipboard newOwner) throws IllegalStateException; + /** + * Call the Win32 CloseClipboard function if we have clipboard ownership, + * does nothing if we have not ownership. + */ ++ @Override + public native void closeClipboard(); + /** + * Call the Win32 SetClipboardData function. +@@ -130,9 +132,12 @@ + init(); + } + ++ @Override + protected native long[] getClipboardFormats(); ++ @Override + protected native byte[] getClipboardData(long format) throws IOException; + ++ @Override + protected void registerClipboardViewerChecked() { + if (!isClipboardViewerRegistered) { + registerClipboardViewer(); +@@ -147,6 +152,7 @@ + * until the toolkit window disposing since MSDN suggests removing + * the window from the clipboard viewer chain just before it is destroyed. + */ ++ @Override + protected void unregisterClipboardViewerChecked() {} + + /** +@@ -174,6 +180,7 @@ + * + * @since 1.5 + */ ++ @Override + protected Transferable createLocaleTransferable(long[] formats) throws IOException { + boolean found = false; + for (int i = 0; i < formats.length; i++) { +@@ -196,12 +203,15 @@ + final byte[] localeDataFinal = localeData; + + return new Transferable() { ++ @Override + public DataFlavor[] getTransferDataFlavors() { + return new DataFlavor[] { DataTransferer.javaTextEncodingFlavor }; + } ++ @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + return flavor.equals(DataTransferer.javaTextEncodingFlavor); + } ++ @Override + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { + if (isDataFlavorSupported(flavor)) { + return localeDataFinal; +@@ -210,5 +220,4 @@ + } + }; + } +- + } +--- ./jdk/src/windows/classes/sun/awt/windows/WColor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WColor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,7 +29,7 @@ + /* + * This helper class maps Windows system colors to AWT Color objects. + */ +-class WColor { ++final class WColor { + + static final int WINDOW_BKGND = 1; // COLOR_WINDOW + static final int WINDOW_TEXT = 2; // COLOR_WINDOWTEXT +--- ./jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -93,7 +93,9 @@ + private Color background; + private Font font; + ++ @Override + public native boolean isObscured(); ++ @Override + public boolean canDetermineObscurity() { return true; } + + // DropTarget support +@@ -101,19 +103,21 @@ + int nDropTargets; + long nativeDropTargetContext; // native pointer + +- public synchronized native void pShow(); +- public synchronized native void hide(); +- public synchronized native void enable(); +- public synchronized native void disable(); ++ private synchronized native void pShow(); ++ synchronized native void hide(); ++ synchronized native void enable(); ++ synchronized native void disable(); + + public long getHWnd() { + return hwnd; + } + + /* New 1.1 API */ ++ @Override + public native Point getLocationOnScreen(); + + /* New 1.1 API */ ++ @Override + public void setVisible(boolean b) { + if (b) { + show(); +@@ -130,6 +134,7 @@ + } + + /* New 1.1 API */ ++ @Override + public void setEnabled(boolean b) { + if (b) { + enable(); +@@ -143,6 +148,7 @@ + private native void reshapeNoCheck(int x, int y, int width, int height); + + /* New 1.1 API */ ++ @Override + public void setBounds(int x, int y, int width, int height, int op) { + // Should set paintPending before reahape to prevent + // thread race between paint events +@@ -185,6 +191,7 @@ + final Container cont = (Container)target; + + WToolkit.executeOnEventHandlerThread(cont, new Runnable() { ++ @Override + public void run() { + // Discarding old paint events doesn't seem to be necessary. + cont.invalidate(); +@@ -228,6 +235,7 @@ + + native synchronized void updateWindow(); + ++ @Override + public void paint(Graphics g) { + ((Component)target).paint(g); + } +@@ -239,6 +247,7 @@ + private native int[] createPrintedPixels(int srcX, int srcY, + int srcW, int srcH, + int alpha); ++ @Override + public void print(Graphics g) { + + Component comp = (Component)target; +@@ -275,6 +284,7 @@ + comp.print(g); + } + ++ @Override + public void coalescePaintEvent(PaintEvent e) { + Rectangle r = e.getUpdateRect(); + if (!(e instanceof IgnorePaintEvent)) { +@@ -319,6 +329,7 @@ + + native void nativeHandleEvent(AWTEvent e); + ++ @Override + @SuppressWarnings("fallthrough") + public void handleEvent(AWTEvent e) { + int id = e.getID(); +@@ -367,21 +378,25 @@ + + native void setFocus(boolean doSetFocus); + ++ @Override + public Dimension getMinimumSize() { + return ((Component)target).getSize(); + } + ++ @Override + public Dimension getPreferredSize() { + return getMinimumSize(); + } + + // Do nothing for heavyweight implementation ++ @Override + public void layout() {} + + public Rectangle getBounds() { + return ((Component)target).getBounds(); + } + ++ @Override + public boolean isFocusable() { + return false; + } +@@ -390,6 +405,7 @@ + * Return the GraphicsConfiguration associated with this peer, either + * the locally stored winGraphicsConfig, or that of the target Component. + */ ++ @Override + public GraphicsConfiguration getGraphicsConfiguration() { + if (winGraphicsConfig != null) { + return winGraphicsConfig; +@@ -481,6 +497,7 @@ + + public void replaceSurfaceDataLater() { + Runnable r = new Runnable() { ++ @Override + public void run() { + // Shouldn't do anything if object is disposed in meanwhile + // No need for sync as disposeAction in Window is performed +@@ -501,6 +518,7 @@ + } + } + ++ @Override + public boolean updateGraphicsData(GraphicsConfiguration gc) { + winGraphicsConfig = (Win32GraphicsConfig)gc; + try { +@@ -512,6 +530,7 @@ + } + + //This will return null for Components not yet added to a Container ++ @Override + public ColorModel getColorModel() { + GraphicsConfiguration gc = getGraphicsConfiguration(); + if (gc != null) { +@@ -549,6 +568,7 @@ + // fallback default font object + final static Font defaultFont = new Font(Font.DIALOG, Font.PLAIN, 12); + ++ @Override + @SuppressWarnings("deprecation") + public Graphics getGraphics() { + if (isDisposed()) { +@@ -601,11 +621,13 @@ + } + return null; + } ++ @Override + public FontMetrics getFontMetrics(Font font) { + return WFontMetrics.getFontMetrics(font); + } + + private synchronized native void _dispose(); ++ @Override + protected void disposeImpl() { + SurfaceData oldData = surfaceData; + surfaceData = null; +@@ -618,17 +640,20 @@ + + public void disposeLater() { + postEvent(new InvocationEvent(target, new Runnable() { ++ @Override + public void run() { + dispose(); + } + })); + } + ++ @Override + public synchronized void setForeground(Color c) { + foreground = c; + _setForeground(c.getRGB()); + } + ++ @Override + public synchronized void setBackground(Color c) { + background = c; + _setBackground(c.getRGB()); +@@ -644,19 +669,22 @@ + return background; + } + +- public native void _setForeground(int rgb); +- public native void _setBackground(int rgb); ++ private native void _setForeground(int rgb); ++ private native void _setBackground(int rgb); + ++ @Override + public synchronized void setFont(Font f) { + font = f; + _setFont(f); + } +- public synchronized native void _setFont(Font f); ++ synchronized native void _setFont(Font f); ++ @Override + public void updateCursorImmediately() { + WGlobalCursorManager.getCursorManager().updateCursorImmediately(); + } + + // TODO: consider moving it to KeyboardFocusManagerPeerImpl ++ @Override + @SuppressWarnings("deprecation") + public boolean requestFocus(Component lightweightChild, boolean temporary, + boolean focusedWindowChangeAllowed, long time, +@@ -720,24 +748,29 @@ + return false; + } + ++ @Override + public Image createImage(ImageProducer producer) { + return new ToolkitImage(producer); + } + ++ @Override + public Image createImage(int width, int height) { + Win32GraphicsConfig gc = + (Win32GraphicsConfig)getGraphicsConfiguration(); + return gc.createAcceleratedImage((Component)target, width, height); + } + ++ @Override + public VolatileImage createVolatileImage(int width, int height) { + return new SunVolatileImage((Component)target, width, height); + } + ++ @Override + public boolean prepareImage(Image img, int w, int h, ImageObserver o) { + return Toolkit.getDefaultToolkit().prepareImage(img, w, h, o); + } + ++ @Override + public int checkImage(Image img, int w, int h, ImageObserver o) { + return Toolkit.getDefaultToolkit().checkImage(img, w, h, o); + } +@@ -891,6 +924,7 @@ + * register a DropTarget with this native peer + */ + ++ @Override + public synchronized void addDropTarget(DropTarget dt) { + if (nDropTargets == 0) { + nativeDropTargetContext = addNativeDropTarget(); +@@ -902,6 +936,7 @@ + * unregister a DropTarget with this native peer + */ + ++ @Override + public synchronized void removeDropTarget(DropTarget dt) { + nDropTargets--; + if (nDropTargets == 0) { +@@ -924,6 +959,7 @@ + native void removeNativeDropTarget(); + native boolean nativeHandlesWheelScrolling(); + ++ @Override + public boolean handlesWheelScrolling() { + // should this be cached? + return nativeHandlesWheelScrolling(); +@@ -1001,6 +1037,7 @@ + /** + * @see java.awt.peer.ComponentPeer#reparent + */ ++ @Override + public void reparent(ContainerPeer newNativeParent) { + pSetParent(newNativeParent); + } +@@ -1008,6 +1045,7 @@ + /** + * @see java.awt.peer.ComponentPeer#isReparentSupported + */ ++ @Override + public boolean isReparentSupported() { + return true; + } +@@ -1081,6 +1119,7 @@ + * Applies the shape to the native component window. + * @since 1.7 + */ ++ @Override + @SuppressWarnings("deprecation") + public void applyShape(Region shape) { + if (shapeLog.isLoggable(PlatformLogger.Level.FINER)) { +@@ -1101,6 +1140,7 @@ + * Lowers this component at the bottom of the above component. If the above parameter + * is null then the method places this component at the top of the Z-order. + */ ++ @Override + public void setZOrder(ComponentPeer above) { + long aboveHWND = (above != null) ? ((WComponentPeer)above).getHWnd() : 0; + +--- ./jdk/src/windows/classes/sun/awt/windows/WCustomCursor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WCustomCursor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2003, 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 +@@ -38,13 +38,14 @@ + * @see Component#setCursor + * @author ThomasBall + */ +-public class WCustomCursor extends CustomCursor { ++final class WCustomCursor extends CustomCursor { + +- public WCustomCursor(Image cursor, Point hotSpot, String name) ++ WCustomCursor(Image cursor, Point hotSpot, String name) + throws IndexOutOfBoundsException { + super(cursor, hotSpot, name); + } + ++ @Override + protected void createNativeCursor(Image im, int[] pixels, int w, int h, + int xHotSpot, int yHotSpot) { + BufferedImage bimage = new BufferedImage(w, h, +--- ./jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -51,7 +51,6 @@ + + import java.io.BufferedInputStream; + import java.io.BufferedReader; +-import java.io.ByteArrayInputStream; + import java.io.InputStream; + import java.io.InputStreamReader; + import java.io.IOException; +@@ -85,7 +84,7 @@ + * + * @since 1.3.1 + */ +-public class WDataTransferer extends DataTransferer { ++final class WDataTransferer extends DataTransferer { + private static final String[] predefinedClipboardNames = { + "", + "TEXT", +@@ -159,17 +158,14 @@ + + private static WDataTransferer transferer; + +- public static WDataTransferer getInstanceImpl() { ++ static synchronized WDataTransferer getInstanceImpl() { + if (transferer == null) { +- synchronized (WDataTransferer.class) { +- if (transferer == null) { +- transferer = new WDataTransferer(); +- } +- } ++ transferer = new WDataTransferer(); + } + return transferer; + } + ++ @Override + public SortedMap <Long, DataFlavor> getFormatsForFlavors( + DataFlavor[] flavors, FlavorTable map) + { +@@ -183,10 +179,12 @@ + return retval; + } + ++ @Override + public String getDefaultUnicodeEncoding() { + return "utf-16le"; + } + ++ @Override + public byte[] translateTransferable(Transferable contents, + DataFlavor flavor, + long format) throws IOException +@@ -224,6 +222,7 @@ + } + + // The stream is closed as a closable object ++ @Override + public Object translateStream(InputStream str, + DataFlavor flavor, long format, + Transferable localeTransferable) +@@ -239,6 +238,7 @@ + + } + ++ @Override + public Object translateBytes(byte[] bytes, DataFlavor flavor, long format, + Transferable localeTransferable) throws IOException + { +@@ -286,14 +286,17 @@ + + } + ++ @Override + public boolean isLocaleDependentTextFormat(long format) { + return format == CF_TEXT || format == CFSTR_INETURL; + } + ++ @Override + public boolean isFileFormat(long format) { + return format == CF_HDROP || format == CF_FILEGROUPDESCRIPTORA || format == CF_FILEGROUPDESCRIPTORW; + } + ++ @Override + protected Long getFormatForNativeAsLong(String str) { + Long format = predefinedClipboardNameMap.get(str); + if (format == null) { +@@ -302,6 +305,7 @@ + return format; + } + ++ @Override + protected String getNativeForFormat(long format) { + return (format < predefinedClipboardNames.length) + ? predefinedClipboardNames[(int)format] +@@ -311,6 +315,7 @@ + private final ToolkitThreadBlockedHandler handler = + new WToolkitThreadBlockedHandler(); + ++ @Override + public ToolkitThreadBlockedHandler getToolkitThreadBlockedHandler() { + return handler; + } +@@ -327,12 +332,14 @@ + */ + private static native String getClipboardFormatName(long format); + ++ @Override + public boolean isImageFormat(long format) { + return format == CF_DIB || format == CF_ENHMETAFILE || + format == CF_METAFILEPICT || format == CF_PNG || + format == CF_JFIF; + } + ++ @Override + protected byte[] imageToPlatformBytes(Image image, long format) + throws IOException { + String mimeType = null; +@@ -406,6 +413,7 @@ + + private static final byte [] UNICODE_NULL_TERMINATOR = new byte [] {0,0}; + ++ @Override + protected ByteArrayOutputStream convertFileListToBytes(ArrayList<String> fileList) + throws IOException + { +@@ -443,6 +451,7 @@ + * Translates either a byte array or an input stream which contain + * platform-specific image data in the given format into an Image. + */ ++ @Override + protected Image platformImageBytesToImage(byte[] bytes, long format) + throws IOException { + String mimeType = null; +@@ -482,12 +491,14 @@ + long format) + throws IOException; + ++ @Override + protected native String[] dragQueryFile(byte[] bytes); + } + + final class WToolkitThreadBlockedHandler extends Mutex + implements ToolkitThreadBlockedHandler { + ++ @Override + public void enter() { + if (!isOwned()) { + throw new IllegalMonitorStateException(); +@@ -497,6 +508,7 @@ + lock(); + } + ++ @Override + public void exit() { + if (!isOwned()) { + throw new IllegalMonitorStateException(); +@@ -880,6 +892,7 @@ + descriptionParsed = true; + } + ++ @Override + public synchronized int read() throws IOException { + if( closed ){ + throw new IOException("Stream closed"); +@@ -900,6 +913,7 @@ + return retval; + } + ++ @Override + public synchronized void close() throws IOException { + if( !closed ){ + closed = true; +--- ./jdk/src/windows/classes/sun/awt/windows/WDefaultFontCharset.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WDefaultFontCharset.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,7 +27,7 @@ + import java.nio.charset.*; + import sun.awt.AWTCharset; + +-public class WDefaultFontCharset extends AWTCharset ++final class WDefaultFontCharset extends AWTCharset + { + static { + initIDs(); +@@ -36,22 +36,24 @@ + // Name for Windows FontSet. + private String fontName; + +- public WDefaultFontCharset(String name){ ++ WDefaultFontCharset(String name){ + super("WDefaultFontCharset", Charset.forName("windows-1252")); + fontName = name; + } + ++ @Override + public CharsetEncoder newEncoder() { + return new Encoder(); + } + + private class Encoder extends AWTCharset.Encoder { ++ @Override + public boolean canEncode(char c){ + return canConvert(c); + } + } + +- public synchronized native boolean canConvert(char ch); ++ private synchronized native boolean canConvert(char ch); + + /** + * Initialize JNI field and method IDs +--- ./jdk/src/windows/classes/sun/awt/windows/WDesktopPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WDesktopPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -39,33 +39,39 @@ + * + * @see DesktopPeer + */ +-public class WDesktopPeer implements DesktopPeer { ++final class WDesktopPeer implements DesktopPeer { + /* Contants for the operation verbs */ + private static String ACTION_OPEN_VERB = "open"; + private static String ACTION_EDIT_VERB = "edit"; + private static String ACTION_PRINT_VERB = "print"; + ++ @Override + public boolean isSupported(Action action) { + // OPEN, EDIT, PRINT, MAIL, BROWSE all supported on windows. + return true; + } + ++ @Override + public void open(File file) throws IOException { + this.ShellExecute(file, ACTION_OPEN_VERB); + } + ++ @Override + public void edit(File file) throws IOException { + this.ShellExecute(file, ACTION_EDIT_VERB); + } + ++ @Override + public void print(File file) throws IOException { + this.ShellExecute(file, ACTION_PRINT_VERB); + } + ++ @Override + public void mail(URI uri) throws IOException { + this.ShellExecute(uri, ACTION_OPEN_VERB); + } + ++ @Override + public void browse(URI uri) throws IOException { + this.ShellExecute(uri, ACTION_OPEN_VERB); + } +--- ./jdk/src/windows/classes/sun/awt/windows/WDesktopProperties.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WDesktopProperties.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -52,7 +52,7 @@ + * like the Windows Pluggable Look-and-Feel can better adapt + * itself when running on a Windows platform. + */ +-class WDesktopProperties { ++final class WDesktopProperties { + private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.windows.WDesktopProperties"); + private static final String PREFIX = "win."; + private static final String FILE_PREFIX = "awt.file."; +@@ -210,6 +210,7 @@ + this.winEventName = winEventName; + } + ++ @Override + public void run() { + WDesktopProperties.this.playWindowsSound(winEventName); + } +--- ./jdk/src/windows/classes/sun/awt/windows/WDialogPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WDialogPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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,14 +24,13 @@ + */ + package sun.awt.windows; + +-import java.util.*; + import java.awt.*; + import java.awt.peer.*; + + import sun.awt.*; + import sun.awt.im.*; + +-class WDialogPeer extends WWindowPeer implements DialogPeer { ++final class WDialogPeer extends WWindowPeer implements DialogPeer { + // Toolkit & peer internals + + // Platform default background for dialogs. Gets set on target if +@@ -54,6 +53,7 @@ + } + + native void createAwtDialog(WComponentPeer parent); ++ @Override + void create(WComponentPeer parent) { + preCreate(parent); + createAwtDialog(parent); +@@ -62,6 +62,7 @@ + native void showModal(); + native void endModal(); + ++ @Override + void initialize() { + Dialog target = (Dialog)this.target; + // Need to set target's background to default _before_ a call +@@ -78,6 +79,7 @@ + setResizable(target.isResizable()); + } + ++ @Override + protected void realShow() { + Dialog dlg = (Dialog)target; + if (dlg.getModalityType() != Dialog.ModalityType.MODELESS) { +@@ -87,8 +89,9 @@ + } + } + ++ @Override + @SuppressWarnings("deprecation") +- public void hide() { ++ void hide() { + Dialog dlg = (Dialog)target; + if (dlg.getModalityType() != Dialog.ModalityType.MODELESS) { + endModal(); +@@ -97,6 +100,7 @@ + } + } + ++ @Override + public void blockWindows(java.util.List<Window> toBlock) { + for (Window w : toBlock) { + WWindowPeer wp = (WWindowPeer)AWTAccessor.getComponentAccessor().getPeer(w); +@@ -106,6 +110,7 @@ + } + } + ++ @Override + public Dimension getMinimumSize() { + if (((Dialog)target).isUndecorated()) { + return super.getMinimumSize(); +@@ -119,6 +124,7 @@ + return ((Dialog)target).isUndecorated(); + } + ++ @Override + public void reshape(int x, int y, int width, int height) { + if (((Dialog)target).isUndecorated()) { + super.reshape(x, y, width, height); +--- ./jdk/src/windows/classes/sun/awt/windows/WDropTargetContextPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WDropTargetContextPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2007, 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 +@@ -79,6 +79,7 @@ + return new WDropTargetContextPeerIStream(istream); + } + ++ @Override + protected Object getNativeData(long format) { + return getData(getNativeDragContext(), format); + } +@@ -87,14 +88,17 @@ + * signal drop complete + */ + ++ @Override + protected void doDropDone(boolean success, int dropAction, + boolean isLocal) { + dropDone(getNativeDragContext(), success, dropAction); + } + ++ @Override + protected void eventPosted(final SunDropTargetEvent e) { + if (e.getID() != SunDropTargetEvent.MOUSE_DROPPED) { + Runnable runnable = new Runnable() { ++ @Override + public void run() { + e.getDispatcher().unregisterAllEvents(); + } +@@ -124,7 +128,7 @@ + * package private class to handle file transfers + */ + +-class WDropTargetContextPeerFileStream extends FileInputStream { ++final class WDropTargetContextPeerFileStream extends FileInputStream { + + /** + * construct file input stream +@@ -142,6 +146,7 @@ + * close + */ + ++ @Override + public void close() throws IOException { + if (stgmedium != 0) { + super.close(); +@@ -167,7 +172,7 @@ + * Package private class to access IStream objects + */ + +-class WDropTargetContextPeerIStream extends InputStream { ++final class WDropTargetContextPeerIStream extends InputStream { + + /** + * construct a WDropTargetContextPeerIStream wrapper +@@ -185,6 +190,7 @@ + * @return bytes available + */ + ++ @Override + public int available() throws IOException { + if (istream == 0) throw new IOException("No IStream"); + return Available(istream); +@@ -196,6 +202,7 @@ + * read + */ + ++ @Override + public int read() throws IOException { + if (istream == 0) throw new IOException("No IStream"); + return Read(istream); +@@ -207,6 +214,7 @@ + * read into buffer + */ + ++ @Override + public int read(byte[] b, int off, int len) throws IOException { + if (istream == 0) throw new IOException("No IStream"); + return ReadBytes(istream, b, off, len); +@@ -218,6 +226,7 @@ + * close + */ + ++ @Override + public void close() throws IOException { + if (istream != 0) { + super.close(); +--- ./jdk/src/windows/classes/sun/awt/windows/WEmbeddedFrame.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WEmbeddedFrame.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -203,11 +203,11 @@ + } + + +- protected native boolean isPrinterDC(long hdc); ++ private native boolean isPrinterDC(long hdc); + +- protected native void printBand(long hdc, byte[] data, int offset, +- int sx, int sy, int swidth, int sheight, +- int dx, int dy, int dwidth, int dheight); ++ private native void printBand(long hdc, byte[] data, int offset, int sx, ++ int sy, int swidth, int sheight, int dx, ++ int dy, int dwidth, int dheight); + + /** + * Initialize JNI field IDs +--- ./jdk/src/windows/classes/sun/awt/windows/WEmbeddedFramePeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WEmbeddedFramePeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -38,12 +38,15 @@ + super(target); + } + ++ @Override + native void create(WComponentPeer parent); + + // suppress printing of an embedded frame. ++ @Override + public void print(Graphics g) {} + + // supress calling native setMinSize() ++ @Override + public void updateMinimumSize() {} + + @Override +@@ -59,10 +62,12 @@ + ((EmbeddedFrame)target).notifyModalBlocked(blocker, false); + } + ++ @Override + public void setBoundsPrivate(int x, int y, int width, int height) { + setBounds(x, y, width, height, SET_BOUNDS | NO_EMBEDDED_CHECK); + } + ++ @Override + public native Rectangle getBoundsPrivate(); + + @Override +--- ./jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -34,11 +34,10 @@ + import java.util.ResourceBundle; + import java.util.MissingResourceException; + import java.util.Vector; +-import sun.awt.AppContext; + import sun.awt.CausedFocusEvent; + import sun.awt.AWTAccessor; + +-public class WFileDialogPeer extends WWindowPeer implements FileDialogPeer { ++final class WFileDialogPeer extends WWindowPeer implements FileDialogPeer { + + static { + initIDs(); +@@ -47,11 +46,12 @@ + private WComponentPeer parent; + private FilenameFilter fileFilter; + +- private Vector<WWindowPeer> blockedWindows = new Vector<WWindowPeer>(); ++ private Vector<WWindowPeer> blockedWindows = new Vector<>(); + + //Needed to fix 4152317 + private static native void setFilterString(String allFilter); + ++ @Override + public void setFilenameFilter(FilenameFilter filter) { + this.fileFilter = filter; + } +@@ -70,19 +70,23 @@ + super(target); + } + ++ @Override + void create(WComponentPeer parent) { + this.parent = parent; + } + + // don't use checkCreation() from WComponentPeer to avoid hwnd check ++ @Override + protected void checkCreation() { + } + ++ @Override + void initialize() { + setFilenameFilter(((FileDialog) target).getFilenameFilter()); + } + + private native void _dispose(); ++ @Override + protected void disposeImpl() { + WToolkit.targetDisposedPeer(target, this); + _dispose(); +@@ -91,15 +95,18 @@ + private native void _show(); + private native void _hide(); + ++ @Override + public void show() { + new Thread(new Runnable() { ++ @Override + public void run() { + _show(); + } + }).start(); + } + +- public void hide() { ++ @Override ++ void hide() { + _hide(); + } + +@@ -169,6 +176,7 @@ + fileDialogAccessor.setFiles(fileDialog, jFiles); + + WToolkit.executeOnEventHandlerThread(fileDialog, new Runnable() { ++ @Override + public void run() { + fileDialog.setVisible(false); + } +@@ -185,6 +193,7 @@ + AWTAccessor.getFileDialogAccessor().setDirectory(fileDialog, null); + + WToolkit.executeOnEventHandlerThread(fileDialog, new Runnable() { ++ @Override + public void run() { + fileDialog.setVisible(false); + } +@@ -195,6 +204,7 @@ + static { + String filterString = AccessController.doPrivileged( + new PrivilegedAction<String>() { ++ @Override + public String run() { + try { + ResourceBundle rb = ResourceBundle.getBundle("sun.awt.windows.awtLocalization"); +@@ -224,6 +234,7 @@ + } + } + ++ @Override + public void blockWindows(java.util.List<Window> toBlock) { + for (Window w : toBlock) { + WWindowPeer wp = (WWindowPeer)AWTAccessor.getComponentAccessor().getPeer(w); +@@ -233,31 +244,47 @@ + } + } + ++ @Override + public native void toFront(); ++ @Override + public native void toBack(); + + // unused methods. Overridden to disable this functionality as + // it requires HWND which is not available for FileDialog ++ @Override + public void updateAlwaysOnTopState() {} ++ @Override + public void setDirectory(String dir) {} ++ @Override + public void setFile(String file) {} ++ @Override + public void setTitle(String title) {} + ++ @Override + public void setResizable(boolean resizable) {} +- public void enable() {} +- public void disable() {} ++ @Override ++ void enable() {} ++ @Override ++ void disable() {} ++ @Override + public void reshape(int x, int y, int width, int height) {} + public boolean handleEvent(Event e) { return false; } ++ @Override + public void setForeground(Color c) {} ++ @Override + public void setBackground(Color c) {} ++ @Override + public void setFont(Font f) {} ++ @Override + public void updateMinimumSize() {} ++ @Override + public void updateIconImages() {} + public boolean requestFocus(boolean temporary, + boolean focusedWindowChangeAllowed) { + return false; + } + ++ @Override + public boolean requestFocus + (Component lightweightChild, boolean temporary, + boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause) +@@ -265,13 +292,20 @@ + return false; + } + ++ @Override + void start() {} ++ @Override + public void beginValidate() {} ++ @Override + public void endValidate() {} + void invalidate(int x, int y, int width, int height) {} ++ @Override + public void addDropTarget(DropTarget dt) {} ++ @Override + public void removeDropTarget(DropTarget dt) {} ++ @Override + public void updateFocusableWindowState() {} ++ @Override + public void setZOrder(ComponentPeer above) {} + + /** +@@ -280,8 +314,11 @@ + private static native void initIDs(); + + // The effects are not supported for system dialogs. ++ @Override + public void applyShape(sun.java2d.pipe.Region shape) {} ++ @Override + public void setOpacity(float opacity) {} ++ @Override + public void setOpaque(boolean isOpaque) {} + public void updateWindow(java.awt.image.BufferedImage backBuffer) {} + +--- ./jdk/src/windows/classes/sun/awt/windows/WFontConfiguration.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WFontConfiguration.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,12 +29,10 @@ + import java.util.Hashtable; + import sun.awt.FontDescriptor; + import sun.awt.FontConfiguration; +-import sun.font.FontManager; + import sun.font.SunFontManager; +-import sun.java2d.SunGraphicsEnvironment; + import java.nio.charset.*; + +-public class WFontConfiguration extends FontConfiguration { ++public final class WFontConfiguration extends FontConfiguration { + + // whether compatibility fallbacks for TimesRoman and Co. are used + private boolean useCompatibilityFallbacks; +@@ -52,6 +50,7 @@ + useCompatibilityFallbacks = "windows-1252".equals(encoding); + } + ++ @Override + protected void initReorderMap() { + if (encoding.equalsIgnoreCase("windows-31j")) { + localeMap = new Hashtable(); +@@ -81,6 +80,7 @@ + // reorderMap.put("windows-1252", "alphabetic"); + } + ++ @Override + protected void setOsNameAndVersion(){ + super.setOsNameAndVersion(); + if (osName.startsWith("Windows")){ +@@ -103,6 +103,7 @@ + } + + // overrides FontConfiguration.getFallbackFamilyName ++ @Override + public String getFallbackFamilyName(String fontName, String defaultFallback) { + // maintain compatibility with old font.properties files, where + // default file had aliases for timesroman & Co, while others didn't. +@@ -115,6 +116,7 @@ + return defaultFallback; + } + ++ @Override + protected String makeAWTFontName(String platformFontName, String characterSubsetName) { + String windowsCharset = (String) subsetCharsetMap.get(characterSubsetName); + if (windowsCharset == null) { +@@ -123,6 +125,7 @@ + return platformFontName + "," + windowsCharset; + } + ++ @Override + protected String getEncoding(String awtFontName, String characterSubsetName) { + String encoding = (String) subsetEncodingMap.get(characterSubsetName); + if (encoding == null) { +@@ -131,15 +134,18 @@ + return encoding; + } + ++ @Override + protected Charset getDefaultFontCharset(String fontName) { + return new WDefaultFontCharset(fontName); + } + ++ @Override + public String getFaceNameFromComponentFontName(String componentFontName) { + // for Windows, the platform name is the face name + return componentFontName; + } + ++ @Override + protected String getFileNameFromComponentFontName(String componentFontName) { + return getFileNameFromPlatformName(componentFontName); + } +--- ./jdk/src/windows/classes/sun/awt/windows/WFontMetrics.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WFontMetrics.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 1997, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -33,7 +33,7 @@ + * + * @author Jim Graham + */ +-class WFontMetrics extends FontMetrics { ++final class WFontMetrics extends FontMetrics { + + static { + initIDs(); +@@ -117,6 +117,7 @@ + /** + * Get leading + */ ++ @Override + public int getLeading() { + return leading; + } +@@ -124,6 +125,7 @@ + /** + * Get ascent. + */ ++ @Override + public int getAscent() { + return ascent; + } +@@ -131,6 +133,7 @@ + /** + * Get descent + */ ++ @Override + public int getDescent() { + return descent; + } +@@ -138,6 +141,7 @@ + /** + * Get height + */ ++ @Override + public int getHeight() { + return height; + } +@@ -145,6 +149,7 @@ + /** + * Get maxAscent + */ ++ @Override + public int getMaxAscent() { + return maxAscent; + } +@@ -152,6 +157,7 @@ + /** + * Get maxDescent + */ ++ @Override + public int getMaxDescent() { + return maxDescent; + } +@@ -159,6 +165,7 @@ + /** + * Get maxAdvance + */ ++ @Override + public int getMaxAdvance() { + return maxAdvance; + } +@@ -166,21 +173,25 @@ + /** + * Return the width of the specified string in this Font. + */ ++ @Override + public native int stringWidth(String str); + + /** + * Return the width of the specified char[] in this Font. + */ ++ @Override + public native int charsWidth(char data[], int off, int len); + + /** + * Return the width of the specified byte[] in this Font. + */ ++ @Override + public native int bytesWidth(byte data[], int off, int len); + + /** + * Get the widths of the first 256 characters in the font. + */ ++ @Override + public int[] getWidths() { + return widths; + } +--- ./jdk/src/windows/classes/sun/awt/windows/WFontPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WFontPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2007, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,7 +27,7 @@ + + import sun.awt.PlatformFont; + +-public class WFontPeer extends PlatformFont { ++final class WFontPeer extends PlatformFont { + + private String textComponentFontName; + +@@ -38,6 +38,7 @@ + } + } + ++ @Override + protected char getMissingGlyphCharacter() { + return '\u2751'; + } +--- ./jdk/src/windows/classes/sun/awt/windows/WFramePeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WFramePeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -41,7 +41,9 @@ + private static native void initIDs(); + + // FramePeer implementation ++ @Override + public native void setState(int state); ++ @Override + public native int getState(); + + // sync target and peer +@@ -62,6 +64,7 @@ + new GetPropertyAction( + "sun.awt.keepWorkingSetOnMinimize"))); + ++ @Override + public void setMaximizedBounds(Rectangle b) { + if (b == null) { + clearMaximizedBounds(); +@@ -123,6 +126,7 @@ + return ((Frame)target).isUndecorated(); + } + ++ @Override + public void reshape(int x, int y, int width, int height) { + if (((Frame)target).isUndecorated()) { + super.reshape(x, y, width, height); +@@ -131,6 +135,7 @@ + } + } + ++ @Override + public Dimension getMinimumSize() { + Dimension d = new Dimension(); + if (!((Frame)target).isUndecorated()) { +@@ -145,6 +150,7 @@ + // Note: Because this method calls resize(), which may be overridden + // by client code, this method must not be executed on the toolkit + // thread. ++ @Override + public void setMenuBar(MenuBar mb) { + WMenuBarPeer mbPeer = (WMenuBarPeer) WToolkit.targetToPeer(mb); + setMenuBar0(mbPeer); +@@ -170,11 +176,13 @@ + } + + native void createAwtFrame(WComponentPeer parent); ++ @Override + void create(WComponentPeer parent) { + preCreate(parent); + createAwtFrame(parent); + } + ++ @Override + void initialize() { + super.initialize(); + +@@ -194,14 +202,17 @@ + InputMethodManager.getInstance().notifyChangeRequest((Component)target); + } + ++ @Override + public void setBoundsPrivate(int x, int y, int width, int height) { + setBounds(x, y, width, height, SET_BOUNDS); + } ++ @Override + public Rectangle getBoundsPrivate() { + return getBounds(); + } + + // TODO: implement it in peers. WLightweightFramePeer may implement lw version. ++ @Override + public void emulateActivation(boolean activate) { + synthesizeWmActivate(activate); + } +--- ./jdk/src/windows/classes/sun/awt/windows/WGlobalCursorManager.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WGlobalCursorManager.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -28,7 +28,7 @@ + import java.awt.*; + import sun.awt.GlobalCursorManager; + +-public final class WGlobalCursorManager extends GlobalCursorManager { ++final class WGlobalCursorManager extends GlobalCursorManager { + private static WGlobalCursorManager manager; + + public static GlobalCursorManager getCursorManager() { +@@ -46,12 +46,16 @@ + WGlobalCursorManager.getCursorManager().updateCursorLater(heavy); + } + ++ @Override + protected native void setCursor(Component comp, Cursor cursor, boolean u); ++ @Override + protected native void getCursorPos(Point p); + /* + * two native methods to call corresponding methods in Container and + * Component + */ ++ @Override + protected native Component findHeavyweightUnderCursor(boolean useCache); ++ @Override + protected native Point getLocationOnScreen(Component com); + } +--- ./jdk/src/windows/classes/sun/awt/windows/WInputMethod.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WInputMethod.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -42,7 +42,7 @@ + import java.util.Map; + import sun.awt.im.InputMethodAdapter; + +-public class WInputMethod extends InputMethodAdapter ++final class WInputMethod extends InputMethodAdapter + { + /** + * The input method context, which is used to dispatch input method +@@ -127,6 +127,7 @@ + } + } + ++ @Override + protected void finalize() throws Throwable + { + // Release the resources used by the native input context. +@@ -137,10 +138,12 @@ + super.finalize(); + } + ++ @Override + public synchronized void setInputMethodContext(InputMethodContext context) { + inputContext = context; + } + ++ @Override + public final void dispose() { + // Due to a memory management problem in Windows 98, we should retain + // the native input context until this object is finalized. So do +@@ -152,10 +155,12 @@ + * + * @see java.awt.im.spi.InputMethod#getControlObject + */ ++ @Override + public Object getControlObject() { + return null; + } + ++ @Override + public boolean setLocale(Locale lang) { + return setLocale(lang, false); + } +@@ -178,6 +183,7 @@ + return false; + } + ++ @Override + public Locale getLocale() { + if (isActive) { + currentLocale = getNativeLocale(); +@@ -193,6 +199,7 @@ + * + * @see java.awt.im.spi.InputMethod#setCharacterSubsets + */ ++ @Override + public void setCharacterSubsets(Subset[] subsets) { + if (subsets == null){ + setConversionStatus(context, cmode); +@@ -266,6 +273,7 @@ + } + } + ++ @Override + public void dispatchEvent(AWTEvent e) { + if (e instanceof ComponentEvent) { + Component comp = ((ComponentEvent) e).getComponent(); +@@ -281,6 +289,7 @@ + } + } + ++ @Override + public void activate() { + boolean isAc = haveActiveClient(); + +@@ -317,6 +326,7 @@ + + } + ++ @Override + public void deactivate(boolean isTemporary) + { + // Sync currentLocale with the Windows keyboard layout which might be changed +@@ -336,6 +346,7 @@ + * Explicitly disable the native IME. Native IME is not disabled when + * deactivate is called. + */ ++ @Override + public void disableInputMethod() { + if (lastFocussedComponentPeer != null) { + disableNativeIME(lastFocussedComponentPeer); +@@ -348,6 +359,7 @@ + * Returns a string with information about the windows input method, + * or null. + */ ++ @Override + public String getNativeInputMethodInfo() { + return getNativeIMMDescription(); + } +@@ -358,6 +370,7 @@ + * Calling stopListening to give other input method the keybaord input + * focus. + */ ++ @Override + protected void stopListening() { + // Since the native input method is not disabled when deactivate is + // called, we need to call disableInputMethod to explicitly turn off the +@@ -366,6 +379,7 @@ + } + + // implements sun.awt.im.InputMethodAdapter.setAWTFocussedComponent ++ @Override + protected void setAWTFocussedComponent(Component component) { + if (component == null) { + return; +@@ -386,6 +400,7 @@ + } + + // implements java.awt.im.spi.InputMethod.hideWindows ++ @Override + public void hideWindows() { + if (awtFocussedComponentPeer != null) { + /* Hide the native status window including the Windows language +@@ -401,6 +416,7 @@ + /** + * @see java.awt.im.spi.InputMethod#removeNotify + */ ++ @Override + public void removeNotify() { + endCompositionNative(context, DISCARD_INPUT); + awtFocussedComponent = null; +@@ -427,10 +443,12 @@ + } + + // see sun.awt.im.InputMethodAdapter.supportsBelowTheSpot ++ @Override + protected boolean supportsBelowTheSpot() { + return true; + } + ++ @Override + public void endComposition() + { + //right now the native endCompositionNative() just cancel +@@ -442,6 +460,7 @@ + /** + * @see java.awt.im.spi.InputMethod#setCompositionEnabled(boolean) + */ ++ @Override + public void setCompositionEnabled(boolean enable) { + setOpenStatus(context, enable); + } +@@ -449,6 +468,7 @@ + /** + * @see java.awt.im.spi.InputMethod#isCompositionEnabled + */ ++ @Override + public boolean isCompositionEnabled() { + return getOpenStatus(context); + } +@@ -557,6 +577,7 @@ + // AWT Event thread. Otherwise, a potential deadlock + // could happen. + Runnable r = new Runnable() { ++ @Override + public void run() { + int x = 0; + int y = 0; +--- ./jdk/src/windows/classes/sun/awt/windows/WInputMethodDescriptor.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WInputMethodDescriptor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2007, 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 +@@ -40,11 +40,12 @@ + * @since JDK1.3 + */ + +-class WInputMethodDescriptor implements InputMethodDescriptor { ++final class WInputMethodDescriptor implements InputMethodDescriptor { + + /** + * @see java.awt.im.spi.InputMethodDescriptor#getAvailableLocales + */ ++ @Override + public Locale[] getAvailableLocales() { + // returns a copy of internal list for public API + Locale[] locales = getAvailableLocalesInternal(); +@@ -60,6 +61,7 @@ + /** + * @see java.awt.im.spi.InputMethodDescriptor#hasDynamicLocaleList + */ ++ @Override + public boolean hasDynamicLocaleList() { + return true; + } +@@ -67,6 +69,7 @@ + /** + * @see java.awt.im.spi.InputMethodDescriptor#getInputMethodDisplayName + */ ++ @Override + public synchronized String getInputMethodDisplayName(Locale inputLocale, Locale displayLanguage) { + // We ignore the input locale. + // When displaying for the default locale, rely on the localized AWT properties; +@@ -81,6 +84,7 @@ + /** + * @see java.awt.im.spi.InputMethodDescriptor#getInputMethodIcon + */ ++ @Override + public Image getInputMethodIcon(Locale inputLocale) { + return null; + } +@@ -88,6 +92,7 @@ + /** + * @see java.awt.im.spi.InputMethodDescriptor#createInputMethod + */ ++ @Override + public InputMethod createInputMethod() throws Exception { + return new WInputMethod(); + } +--- ./jdk/src/windows/classes/sun/awt/windows/WKeyboardFocusManagerPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WKeyboardFocusManagerPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -31,7 +31,7 @@ + import sun.awt.KeyboardFocusManagerPeerImpl; + import sun.awt.CausedFocusEvent; + +-class WKeyboardFocusManagerPeer extends KeyboardFocusManagerPeerImpl { ++final class WKeyboardFocusManagerPeer extends KeyboardFocusManagerPeerImpl { + static native void setNativeFocusOwner(ComponentPeer peer); + static native Component getNativeFocusOwner(); + static native Window getNativeFocusedWindow(); +--- ./jdk/src/windows/classes/sun/awt/windows/WListPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WListPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -31,12 +31,14 @@ + + final class WListPeer extends WComponentPeer implements ListPeer { + ++ @Override + public boolean isFocusable() { + return true; + } + + // ListPeer implementation + ++ @Override + public int[] getSelectedIndexes() { + List l = (List)target; + int len = l.countItems(); +@@ -53,26 +55,31 @@ + } + + /* New method name for 1.1 */ ++ @Override + public void add(String item, int index) { + addItem(item, index); + } + + /* New method name for 1.1 */ ++ @Override + public void removeAll() { + clear(); + } + + /* New method name for 1.1 */ ++ @Override + public void setMultipleMode (boolean b) { + setMultipleSelections(b); + } + + /* New method name for 1.1 */ ++ @Override + public Dimension getPreferredSize(int rows) { + return preferredSize(rows); + } + + /* New method name for 1.1 */ ++ @Override + public Dimension getMinimumSize(int rows) { + return minimumSize(rows); + } +@@ -83,13 +90,17 @@ + } + native void addItems(String[] items, int index, int width); + ++ @Override + public native void delItems(int start, int end); + public void clear() { + List l = (List)target; + delItems(0, l.countItems()); + } ++ @Override + public native void select(int index); ++ @Override + public native void deselect(int index); ++ @Override + public native void makeVisible(int index); + public native void setMultipleSelections(boolean v); + public native int getMaxWidth(); +@@ -114,8 +125,10 @@ + super(target); + } + ++ @Override + native void create(WComponentPeer parent); + ++ @Override + void initialize() { + List li = (List)target; + +@@ -169,6 +182,7 @@ + super.initialize(); + } + ++ @Override + public boolean shouldClearRectBeforePaint() { + return false; + } +@@ -178,7 +192,8 @@ + /*public*/ native boolean isSelected(int index); + + // update the fontmetrics when the font changes +- public synchronized void _setFont(Font f) ++ @Override ++ synchronized void _setFont(Font f) + { + super._setFont( f ); + fm = getFontMetrics( ((List)target).getFont() ); +@@ -190,6 +205,7 @@ + void handleAction(final int index, final long when, final int modifiers) { + final List l = (List)target; + WToolkit.executeOnEventHandlerThread(l, new Runnable() { ++ @Override + public void run() { + l.select(index); + postEvent(new ActionEvent(target, ActionEvent.ACTION_PERFORMED, +@@ -201,6 +217,7 @@ + void handleListChanged(final int index) { + final List l = (List)target; + WToolkit.executeOnEventHandlerThread(l, new Runnable() { ++ @Override + public void run() { + postEvent(new ItemEvent(l, ItemEvent.ITEM_STATE_CHANGED, + Integer.valueOf(index), +--- ./jdk/src/windows/classes/sun/awt/windows/WMenuBarPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WMenuBarPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2004, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,13 +27,16 @@ + import java.awt.*; + import java.awt.peer.*; + +-class WMenuBarPeer extends WMenuPeer implements MenuBarPeer { ++final class WMenuBarPeer extends WMenuPeer implements MenuBarPeer { + + // MenuBarPeer implementation + ++ @Override + public native void addMenu(Menu m); ++ @Override + public native void delMenu(int index); + ++ @Override + public void addHelpMenu(Menu m) { + addMenu(m); + } +--- ./jdk/src/windows/classes/sun/awt/windows/WMenuPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WMenuPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -31,10 +31,13 @@ + + // MenuPeer implementation + ++ @Override + public native void addSeparator(); ++ @Override + public void addItem(MenuItem item) { + WMenuItemPeer itemPeer = (WMenuItemPeer) WToolkit.targetToPeer(item); + } ++ @Override + public native void delItem(int index); + + // Toolkit & peer internals +--- ./jdk/src/windows/classes/sun/awt/windows/WMouseDragGestureRecognizer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WMouseDragGestureRecognizer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -25,19 +25,14 @@ + + package sun.awt.windows; + +-import java.awt.Toolkit; + import java.awt.Component; +- + import java.awt.Point; + import java.awt.dnd.DnDConstants; ++import java.awt.dnd.DragGestureListener; + import java.awt.dnd.DragSource; + import java.awt.dnd.MouseDragGestureRecognizer; +-import java.awt.dnd.DragGestureListener; +- + import java.awt.event.InputEvent; + import java.awt.event.MouseEvent; +-import java.awt.event.MouseListener; +-import java.awt.event.MouseMotionListener; + + import sun.awt.dnd.SunDragSourceContextPeer; + +@@ -54,7 +49,7 @@ + * @see java.awt.dnd.DragSource + */ + +-class WMouseDragGestureRecognizer extends MouseDragGestureRecognizer { ++final class WMouseDragGestureRecognizer extends MouseDragGestureRecognizer { + + private static final long serialVersionUID = -3527844310018033570L; + +@@ -140,6 +135,7 @@ + * Invoked when the mouse has been clicked on a component. + */ + ++ @Override + public void mouseClicked(MouseEvent e) { + // do nothing + } +@@ -148,6 +144,7 @@ + * Invoked when a mouse button has been pressed on a component. + */ + ++ @Override + public void mousePressed(MouseEvent e) { + events.clear(); + +@@ -165,6 +162,7 @@ + * Invoked when a mouse button has been released on a component. + */ + ++ @Override + public void mouseReleased(MouseEvent e) { + events.clear(); + } +@@ -173,6 +171,7 @@ + * Invoked when the mouse enters a component. + */ + ++ @Override + public void mouseEntered(MouseEvent e) { + events.clear(); + } +@@ -181,6 +180,7 @@ + * Invoked when the mouse exits a component. + */ + ++ @Override + public void mouseExited(MouseEvent e) { + + if (!events.isEmpty()) { // gesture pending +@@ -196,6 +196,7 @@ + * Invoked when a mouse button is pressed on a component. + */ + ++ @Override + public void mouseDragged(MouseEvent e) { + if (!events.isEmpty()) { // gesture pending + int dop = mapDragOperationFromModifiers(e); +@@ -225,6 +226,7 @@ + * (with no buttons no down). + */ + ++ @Override + public void mouseMoved(MouseEvent e) { + // do nothing + } +--- ./jdk/src/windows/classes/sun/awt/windows/WPageDialog.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WPageDialog.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2011, 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 +@@ -34,7 +34,7 @@ + import java.awt.print.PageFormat; + import java.awt.print.Printable; + +-public class WPageDialog extends WPrintDialog { ++final class WPageDialog extends WPrintDialog { + static { + initIDs(); + } +@@ -55,6 +55,7 @@ + this.painter = painter; + } + ++ @Override + @SuppressWarnings("deprecation") + public void addNotify() { + synchronized(getTreeLock()) { +--- ./jdk/src/windows/classes/sun/awt/windows/WPageDialogPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WPageDialogPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2011, 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 +@@ -25,7 +25,7 @@ + + package sun.awt.windows; + +-public class WPageDialogPeer extends WPrintDialogPeer { ++final class WPageDialogPeer extends WPrintDialogPeer { + + WPageDialogPeer(WPageDialog target) { + super(target); +@@ -37,8 +37,10 @@ + */ + private native boolean _show(); + ++ @Override + public void show() { + new Thread(new Runnable() { ++ @Override + public void run() { + // Call pageSetup even with no printer installed, this + // will display Windows error dialog and return false. +--- ./jdk/src/windows/classes/sun/awt/windows/WPanelPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WPanelPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,14 +27,13 @@ + import java.awt.*; + import java.awt.peer.*; + +-import java.util.Vector; +- + import sun.awt.SunGraphicsCallback; + + class WPanelPeer extends WCanvasPeer implements PanelPeer { + + // ComponentPeer overrides + ++ @Override + public void paint(Graphics g) { + super.paint(g); + SunGraphicsCallback.PaintHeavyweightComponentsCallback.getInstance(). +@@ -42,6 +41,7 @@ + SunGraphicsCallback.LIGHTWEIGHTS | + SunGraphicsCallback.HEAVYWEIGHTS); + } ++ @Override + public void print(Graphics g) { + super.print(g); + SunGraphicsCallback.PrintHeavyweightComponentsCallback.getInstance(). +@@ -52,6 +52,7 @@ + + // ContainerPeer (via PanelPeer) implementation + ++ @Override + public Insets getInsets() { + return insets_; + } +@@ -73,6 +74,7 @@ + super(target); + } + ++ @Override + void initialize() { + super.initialize(); + insets_ = new Insets(0,0,0,0); +--- ./jdk/src/windows/classes/sun/awt/windows/WPathGraphics.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WPathGraphics.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -74,7 +74,7 @@ + import sun.print.PathGraphics; + import sun.print.ProxyGraphics2D; + +-class WPathGraphics extends PathGraphics { ++final class WPathGraphics extends PathGraphics { + + /** + * For a drawing application the initial user space +@@ -896,6 +896,7 @@ + * @param handlingTransparency if being recursively called to + * print opaque region of transparent image + */ ++ @Override + protected boolean drawImageToPlatform(Image image, AffineTransform xform, + Color bgcolor, + int srcX, int srcY, +@@ -1335,6 +1336,7 @@ + * Have the printing application redraw everything that falls + * within the page bounds defined by <code>region</code>. + */ ++ @Override + public void redrawRegion(Rectangle2D region, double scaleX, double scaleY, + Shape savedClip, AffineTransform savedTransform) + throws PrinterException { +@@ -1434,6 +1436,7 @@ + * with the specified color. + * The path is provided in device coordinates. + */ ++ @Override + protected void deviceFill(PathIterator pathIter, Color color) { + + WPrinterJob wPrinterJob = (WPrinterJob) getPrinterJob(); +@@ -1448,6 +1451,7 @@ + * path defined by <code>pathIter</code> + * The path is provided in device coordinates. + */ ++ @Override + protected void deviceClip(PathIterator pathIter) { + + WPrinterJob wPrinterJob = (WPrinterJob) getPrinterJob(); +@@ -1459,6 +1463,7 @@ + /** + * Draw the bounding rectangle using transformed coordinates. + */ ++ @Override + protected void deviceFrameRect(int x, int y, int width, int height, + Color color) { + +@@ -1548,6 +1553,7 @@ + * GDI fillRect function. + * Boundaries are determined by the given coordinates. + */ ++ @Override + protected void deviceFillRect(int x, int y, int width, int height, + Color color) { + /* +@@ -1584,6 +1590,7 @@ + * Draw a line using a pen created using the specified color + * and current stroke properties. + */ ++ @Override + protected void deviceDrawLine(int xBegin, int yBegin, int xEnd, int yEnd, + Color color) { + Stroke stroke = getStroke(); +--- ./jdk/src/windows/classes/sun/awt/windows/WPopupMenuPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WPopupMenuPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,12 +29,12 @@ + + import sun.awt.AWTAccessor; + +-public class WPopupMenuPeer extends WMenuPeer implements PopupMenuPeer { ++final class WPopupMenuPeer extends WMenuPeer implements PopupMenuPeer { + // We can't use target.getParent() for TrayIcon popup + // because this method should return null for the TrayIcon + // popup regardless of that whether it has parent or not. + +- public WPopupMenuPeer(PopupMenu target) { ++ WPopupMenuPeer(PopupMenu target) { + this.target = target; + MenuContainer parent = null; + +@@ -67,7 +67,7 @@ + } + } + +- native void createMenu(WComponentPeer parent); ++ private native void createMenu(WComponentPeer parent); + + public void show(Event e) { + Component origin = (Component)e.target; +@@ -106,5 +106,5 @@ + _show(e); + } + +- public native void _show(Event e); ++ private native void _show(Event e); + } +--- ./jdk/src/windows/classes/sun/awt/windows/WPrintDialog.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WPrintDialog.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,7 +30,9 @@ + + import java.awt.print.PrinterJob; + +-public class WPrintDialog extends Dialog { ++import sun.awt.AWTAccessor; ++ ++class WPrintDialog extends Dialog { + static { + initIDs(); + } +@@ -38,21 +40,23 @@ + protected PrintJob job; + protected PrinterJob pjob; + +- public WPrintDialog(Frame parent, PrinterJob control) { ++ WPrintDialog(Frame parent, PrinterJob control) { + super(parent, true); + this.pjob = control; + setLayout(null); + } + +- public WPrintDialog(Dialog parent, PrinterJob control) { ++ WPrintDialog(Dialog parent, PrinterJob control) { + super(parent, "", true); + this.pjob = control; + setLayout(null); + } + +- // Use native code to circumvent access restrictions on Component.peer +- protected native void setPeer(ComponentPeer peer); ++ final void setPeer(final ComponentPeer p){ ++ AWTAccessor.getComponentAccessor().setPeer(this, p); ++ } + ++ @Override + @SuppressWarnings("deprecation") + public void addNotify() { + synchronized(getTreeLock()) { +@@ -72,11 +76,11 @@ + + private boolean retval = false; + +- public void setRetVal(boolean ret) { ++ final void setRetVal(boolean ret) { + retval = ret; + } + +- public boolean getRetVal() { ++ final boolean getRetVal() { + return retval; + } + +--- ./jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WPrintDialogPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,11 +30,10 @@ + import java.awt.peer.ComponentPeer; + import java.awt.dnd.DropTarget; + import java.util.Vector; +-import sun.awt.AppContext; + import sun.awt.CausedFocusEvent; + import sun.awt.AWTAccessor; + +-public class WPrintDialogPeer extends WWindowPeer implements DialogPeer { ++class WPrintDialogPeer extends WWindowPeer implements DialogPeer { + + static { + initIDs(); +@@ -42,29 +41,34 @@ + + private WComponentPeer parent; + +- private Vector<WWindowPeer> blockedWindows = new Vector<WWindowPeer>(); ++ private Vector<WWindowPeer> blockedWindows = new Vector<>(); + + WPrintDialogPeer(WPrintDialog target) { + super(target); + } + ++ @Override + void create(WComponentPeer parent) { + this.parent = parent; + } + + // fix for CR 6178323: + // don't use checkCreation() from WComponentPeer to avoid hwnd check ++ @Override + protected void checkCreation() { + } + ++ @Override + protected void disposeImpl() { + WToolkit.targetDisposedPeer(target, this); + } + + private native boolean _show(); + ++ @Override + public void show() { + new Thread(new Runnable() { ++ @Override + public void run() { + try { + ((WPrintDialog)target).setRetVal(_show()); +@@ -102,6 +106,7 @@ + } + } + ++ @Override + public void blockWindows(java.util.List<Window> toBlock) { + for (Window w : toBlock) { + WWindowPeer wp = (WWindowPeer)AWTAccessor.getComponentAccessor().getPeer(w); +@@ -111,28 +116,43 @@ + } + } + ++ @Override + public native void toFront(); ++ @Override + public native void toBack(); + + // unused methods. Overridden to disable this functionality as + // it requires HWND which is not available for FileDialog ++ @Override + void initialize() {} ++ @Override + public void updateAlwaysOnTopState() {} ++ @Override + public void setResizable(boolean resizable) {} +- public void hide() {} +- public void enable() {} +- public void disable() {} ++ @Override ++ void hide() {} ++ @Override ++ void enable() {} ++ @Override ++ void disable() {} ++ @Override + public void reshape(int x, int y, int width, int height) {} + public boolean handleEvent(Event e) { return false; } ++ @Override + public void setForeground(Color c) {} ++ @Override + public void setBackground(Color c) {} ++ @Override + public void setFont(Font f) {} ++ @Override + public void updateMinimumSize() {} ++ @Override + public void updateIconImages() {} + public boolean requestFocus(boolean temporary, boolean focusedWindowChangeAllowed) { + return false; + } + ++ @Override + public boolean requestFocus + (Component lightweightChild, boolean temporary, + boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause) +@@ -141,13 +161,20 @@ + return false; + } + ++ @Override + public void updateFocusableWindowState() {} ++ @Override + void start() {} ++ @Override + public void beginValidate() {} ++ @Override + public void endValidate() {} + void invalidate(int x, int y, int width, int height) {} ++ @Override + public void addDropTarget(DropTarget dt) {} ++ @Override + public void removeDropTarget(DropTarget dt) {} ++ @Override + public void setZOrder(ComponentPeer above) {} + + /** +@@ -156,8 +183,11 @@ + private static native void initIDs(); + + // The effects are not supported for system dialogs. ++ @Override + public void applyShape(sun.java2d.pipe.Region shape) {} ++ @Override + public void setOpacity(float opacity) {} ++ @Override + public void setOpaque(boolean isOpaque) {} + public void updateWindow(java.awt.image.BufferedImage backBuffer) {} + +--- ./jdk/src/windows/classes/sun/awt/windows/WPrinterJob.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WPrinterJob.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -57,26 +57,19 @@ + import java.awt.print.PrinterException; + import javax.print.PrintService; + +-import java.io.IOException; + import java.io.File; + +-import java.util.Hashtable; +-import java.util.Properties; + import java.util.MissingResourceException; + import java.util.ResourceBundle; + +-import sun.awt.Win32GraphicsEnvironment; +- + import sun.print.PeekGraphics; + import sun.print.PeekMetrics; + +-import java.net.URL; + import java.net.URI; + import java.net.URISyntaxException; + + import javax.print.PrintServiceLookup; + import javax.print.attribute.PrintRequestAttributeSet; +-import javax.print.attribute.HashPrintServiceAttributeSet; + import javax.print.attribute.HashPrintRequestAttributeSet; + import javax.print.attribute.Attribute; + import javax.print.attribute.standard.Sides; +@@ -84,7 +77,6 @@ + import javax.print.attribute.standard.PrintQuality; + import javax.print.attribute.standard.PrinterResolution; + import javax.print.attribute.standard.SheetCollate; +-import javax.print.attribute.IntegerSyntax; + import javax.print.attribute.standard.Copies; + import javax.print.attribute.standard.Destination; + import javax.print.attribute.standard.OrientationRequested; +@@ -92,17 +84,13 @@ + import javax.print.attribute.standard.MediaSizeName; + import javax.print.attribute.standard.MediaSize; + import javax.print.attribute.standard.MediaTray; +-import javax.print.attribute.standard.PrinterName; +-import javax.print.attribute.standard.JobMediaSheetsSupported; + import javax.print.attribute.standard.PageRanges; +-import javax.print.attribute.Size2DSyntax; + + import sun.awt.Win32FontManager; + + import sun.print.RasterPrinterJob; + import sun.print.SunAlternateMedia; + import sun.print.SunPageSelection; +-import sun.print.SunMinMaxPage; + import sun.print.Win32MediaTray; + import sun.print.Win32PrintService; + import sun.print.Win32PrintServiceLookup; +@@ -121,7 +109,8 @@ + * + * @author Richard Blanchard + */ +-public class WPrinterJob extends RasterPrinterJob implements DisposerTarget { ++public final class WPrinterJob extends RasterPrinterJob ++ implements DisposerTarget { + + /* Class Constants */ + +@@ -290,6 +279,7 @@ + private long mPrintHDevMode; + private long mPrintHDevNames; + ++ @Override + public void dispose() { + WPrinterJob.deleteDC(mPrintDC, mPrintHDevMode, mPrintHDevNames); + } +@@ -402,6 +392,7 @@ + */ + private Object disposerReferent = new Object(); + ++ @Override + public Object getDisposerReferent() { + return disposerReferent; + } +@@ -430,6 +421,7 @@ + * @see java.awt.GraphicsEnvironment#isHeadless + * @since JDK1.2 + */ ++ @Override + public PageFormat pageDialog(PageFormat page) throws HeadlessException { + if (GraphicsEnvironment.isHeadless()) { + throw new HeadlessException(); +@@ -570,6 +562,7 @@ + * returns true. + * @see java.awt.GraphicsEnvironment#isHeadless + */ ++ @Override + public boolean printDialog() throws HeadlessException { + + if (GraphicsEnvironment.isHeadless()) { +@@ -603,6 +596,7 @@ + * @throws PrinterException if the specified service does not support + * 2D printing. + */ ++ @Override + public void setPrintService(PrintService service) + throws PrinterException { + super.setPrintService(service); +@@ -628,6 +622,7 @@ + } + } + ++ @Override + public PrintService getPrintService() { + if (myService == null) { + String printerName = getNativePrintService(); +@@ -681,6 +676,7 @@ + * In the event that the user changes the printer using the + dialog, then it is up to GDI to report back all changed values. + */ ++ @Override + protected void setAttributes(PrintRequestAttributeSet attributes) + throws PrinterException { + +@@ -750,6 +746,7 @@ + * Note: PageFormat.getPaper() returns a clone and getDefaultPage() + * gets that clone so it won't overwrite the original paper. + */ ++ @Override + public PageFormat defaultPage(PageFormat page) { + PageFormat newPage = (PageFormat)page.clone(); + getDefaultPage(newPage); +@@ -759,6 +756,7 @@ + /** + * validate the paper size against the current printer. + */ ++ @Override + protected native void validatePaper(Paper origPaper, Paper newPaper ); + + /** +@@ -774,6 +772,7 @@ + * causes the print job to be rasterized. + */ + ++ @Override + protected Graphics2D createPathGraphics(PeekGraphics peekGraphics, + PrinterJob printerJob, + Printable painter, +@@ -810,6 +809,7 @@ + } + + ++ @Override + protected double getXRes() { + if (mAttXRes != 0) { + return mAttXRes; +@@ -818,6 +818,7 @@ + } + } + ++ @Override + protected double getYRes() { + if (mAttYRes != 0) { + return mAttYRes; +@@ -826,26 +827,32 @@ + } + } + ++ @Override + protected double getPhysicalPrintableX(Paper p) { + return mPrintPhysX; + } + ++ @Override + protected double getPhysicalPrintableY(Paper p) { + return mPrintPhysY; + } + ++ @Override + protected double getPhysicalPrintableWidth(Paper p) { + return mPrintWidth; + } + ++ @Override + protected double getPhysicalPrintableHeight(Paper p) { + return mPrintHeight; + } + ++ @Override + protected double getPhysicalPageWidth(Paper p) { + return mPageWidth; + } + ++ @Override + protected double getPhysicalPageHeight(Paper p) { + return mPageHeight; + } +@@ -857,6 +864,7 @@ + * collation requests - which can only originate from the print dialog. + * REMIND: check if this can be deleted already. + */ ++ @Override + protected boolean isCollated() { + return userRequestedCollation; + } +@@ -869,6 +877,7 @@ + * book need only be printed once and the copies + * will be collated and made in the printer. + */ ++ @Override + protected int getCollatedCopies() { + debug_println("driverDoesMultipleCopies="+driverDoesMultipleCopies + +" driverDoesCollation="+driverDoesCollation); +@@ -891,6 +900,7 @@ + * iterate over the number of copies, this method always returns + * 1. + */ ++ @Override + protected int getNoncollatedCopies() { + if (driverDoesMultipleCopies || super.isCollated()) { + return 1; +@@ -1128,6 +1138,7 @@ + /** + * Remove control characters. + */ ++ @Override + protected String removeControlChars(String str) { + return super.removeControlChars(str); + } +@@ -1267,6 +1278,7 @@ + /** + * Begin a new page. + */ ++ @Override + protected void startPage(PageFormat format, Printable painter, + int index, boolean paperChanged) { + +@@ -1283,6 +1295,7 @@ + /** + * End a page. + */ ++ @Override + protected void endPage(PageFormat format, Printable painter, + int index) { + +@@ -1302,6 +1315,7 @@ + /** + * Set the number of copies to be printed. + */ ++ @Override + public void setCopies(int copies) { + super.setCopies(copies); + defaultCopies = false; +@@ -1315,7 +1329,7 @@ + /** + * Set copies in device. + */ +- public native void setNativeCopies(int copies); ++ private native void setNativeCopies(int copies); + + /** + * Displays the print dialog and records the user's settings +@@ -1328,6 +1342,7 @@ + /* Make sure printer DC is intialised and that info about the printer + * is reflected back up to Java code + */ ++ @Override + protected native void initPrinter(); + + /** +@@ -1343,6 +1358,7 @@ + */ + private native boolean _startDoc(String dest, String jobName) + throws PrinterException; ++ @Override + protected void startDoc() throws PrinterException { + if (!_startDoc(mDestination, getJobName())) { + cancel(); +@@ -1353,12 +1369,14 @@ + * Call Window's EndDoc routine to end a + * print job. + */ ++ @Override + protected native void endDoc(); + + /** + * Call Window's AbortDoc routine to abort a + * print job. + */ ++ @Override + protected native void abortDoc(); + + /** +@@ -1386,6 +1404,7 @@ + * page. The width and height of the band is + * specified by the caller. + */ ++ @Override + protected native void printBand(byte[] data, int x, int y, + int width, int height); + +@@ -2204,6 +2223,7 @@ + } + } + ++ @Override + public void actionPerformed(ActionEvent event) { + setVisible(false); + dispose(); +--- ./jdk/src/windows/classes/sun/awt/windows/WRobotPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WRobotPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -28,7 +28,7 @@ + import java.awt.*; + import java.awt.peer.RobotPeer; + +-class WRobotPeer extends WObjectPeer implements RobotPeer ++final class WRobotPeer extends WObjectPeer implements RobotPeer + { + WRobotPeer() { + create(); +@@ -39,27 +39,36 @@ + + private synchronized native void _dispose(); + ++ @Override + protected void disposeImpl() { + _dispose(); + } + + public native void create(); + public native void mouseMoveImpl(int x, int y); ++ @Override + public void mouseMove(int x, int y) { + mouseMoveImpl(x, y); + } ++ @Override + public native void mousePress(int buttons); ++ @Override + public native void mouseRelease(int buttons); ++ @Override + public native void mouseWheel(int wheelAmt); + ++ @Override + public native void keyPress( int keycode ); ++ @Override + public native void keyRelease( int keycode ); + ++ @Override + public int getRGBPixel(int x, int y) { + // See 7002846: that's ineffective, but works correctly with non-opaque windows + return getRGBPixels(new Rectangle(x, y, 1, 1))[0]; + } + ++ @Override + public int [] getRGBPixels(Rectangle bounds) { + int pixelArray[] = new int[bounds.width*bounds.height]; + getRGBPixels(bounds.x, bounds.y, bounds.width, bounds.height, pixelArray); +--- ./jdk/src/windows/classes/sun/awt/windows/WScrollPanePeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WScrollPanePeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -33,7 +33,7 @@ + + import sun.util.logging.PlatformLogger; + +-class WScrollPanePeer extends WPanelPeer implements ScrollPanePeer { ++final class WScrollPanePeer extends WPanelPeer implements ScrollPanePeer { + + private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.windows.WScrollPanePeer"); + +@@ -47,6 +47,7 @@ + } + + static native void initIDs(); ++ @Override + native void create(WComponentPeer parent); + native int getOffset(int orient); + +@@ -56,6 +57,7 @@ + scrollbarHeight = _getHScrollbarHeight(); + } + ++ @Override + void initialize() { + super.initialize(); + setInsets(); +@@ -63,22 +65,27 @@ + setScrollPosition(-i.left,-i.top); + } + ++ @Override + public void setUnitIncrement(Adjustable adj, int p) { + // The unitIncrement is grabbed from the target as needed. + } + ++ @Override + public Insets insets() { + return getInsets(); + } + private native void setInsets(); + ++ @Override + public native synchronized void setScrollPosition(int x, int y); + ++ @Override + public int getHScrollbarHeight() { + return scrollbarHeight; + } + private native int _getHScrollbarHeight(); + ++ @Override + public int getVScrollbarWidth() { + return scrollbarWidth; + } +@@ -96,6 +103,7 @@ + * the actual windows may not have changed yet, so the size + * information from the java-level is passed down and used. + */ ++ @Override + public void childResized(int width, int height) { + ScrollPane sp = (ScrollPane)target; + Dimension vs = sp.getSize(); +@@ -112,6 +120,7 @@ + * of adjustables, whether it was modified externally or from the + * native scrollbars themselves. + */ ++ @Override + public void setValue(Adjustable adj, int v) { + Component c = getScrollChild(); + if (c == null) { +@@ -160,6 +169,7 @@ + super(source, runnable, 0L); + } + ++ @Override + public PeerEvent coalesceEvents(PeerEvent newEvent) { + if (log.isLoggable(PlatformLogger.Level.FINEST)) { + log.finest("ScrollEvent coalesced: " + newEvent); +@@ -187,6 +197,7 @@ + this.isAdjusting = isAdjusting; + } + ++ @Override + public void run() { + if (getScrollChild() == null) { + return; +--- ./jdk/src/windows/classes/sun/awt/windows/WSystemTrayPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WSystemTrayPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,11 +30,12 @@ + import java.awt.Toolkit; + import java.awt.peer.SystemTrayPeer; + +-public class WSystemTrayPeer extends WObjectPeer implements SystemTrayPeer { ++final class WSystemTrayPeer extends WObjectPeer implements SystemTrayPeer { + WSystemTrayPeer(SystemTray target) { + this.target = target; + } + ++ @Override + public Dimension getTrayIconSize() { + return new Dimension(WTrayIconPeer.TRAY_ICON_WIDTH, WTrayIconPeer.TRAY_ICON_HEIGHT); + } +@@ -43,6 +44,7 @@ + return ((WToolkit)Toolkit.getDefaultToolkit()).isTraySupported(); + } + ++ @Override + protected void disposeImpl() { + } + } +--- ./jdk/src/windows/classes/sun/awt/windows/WTextAreaPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WTextAreaPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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,6 +53,7 @@ + public Dimension getPreferredSize(int rows, int cols) { + return getMinimumSize(rows, cols); + } ++ + @Override + public Dimension getMinimumSize(int rows, int cols) { + FontMetrics fm = getFontMetrics(((TextArea)target).getFont()); +--- ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Wed Jul 30 18:42:59 2014 +0100 +@@ -43,6 +43,7 @@ + import sun.misc.ThreadGroupUtils; + import sun.awt.Win32GraphicsDevice; + import sun.awt.Win32GraphicsEnvironment; ++import sun.awt.datatransfer.DataTransferer; + import sun.java2d.d3d.D3DRenderQueue; + import sun.java2d.opengl.OGLRenderQueue; + +@@ -68,7 +69,7 @@ + import sun.util.logging.PlatformLogger; + import sun.security.util.SecurityConstants; + +-public class WToolkit extends SunToolkit implements Runnable { ++public final class WToolkit extends SunToolkit implements Runnable { + + private static final PlatformLogger log = PlatformLogger.getLogger("sun.awt.windows.WToolkit"); + +@@ -99,6 +100,7 @@ + if (!loaded) { + java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction<Void>() { ++ @Override + public Void run() { + System.loadLibrary("awt"); + return null; +@@ -122,6 +124,7 @@ + AccessController.doPrivileged( + new PrivilegedAction <Void> () + { ++ @Override + public Void run() { + String browserProp = System.getProperty("browser"); + if (browserProp != null && browserProp.equals("sun.plugin")) { +@@ -212,9 +215,8 @@ + */ + public native void embeddedEventLoopIdleProcessing(); + +- public static final String DATA_TRANSFERER_CLASS_NAME = "sun.awt.windows.WDataTransferer"; +- + static class ToolkitDisposer implements sun.java2d.DisposerRecord { ++ @Override + public void dispose() { + WToolkit.postDispose(); + } +@@ -260,8 +262,6 @@ + // swallow the exception + } + +- SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME); +- + // Enabled "live resizing" by default. It remains controlled + // by the native system though. + setDynamicLayout(true); +@@ -281,6 +281,7 @@ + }); + } + ++ @Override + public void run() { + AccessController.doPrivileged((PrivilegedAction<Void>) () -> { + Thread.currentThread().setContextClassLoader(null); +@@ -329,85 +330,98 @@ + * WARNING: startSecondaryEventLoop must only be called from the "AWT- + * Windows" thread. + */ +- public static native void startSecondaryEventLoop(); +- public static native void quitSecondaryEventLoop(); ++ static native void startSecondaryEventLoop(); ++ static native void quitSecondaryEventLoop(); + + /* + * Create peer objects. + */ + ++ @Override + public ButtonPeer createButton(Button target) { + ButtonPeer peer = new WButtonPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public TextFieldPeer createTextField(TextField target) { + TextFieldPeer peer = new WTextFieldPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public LabelPeer createLabel(Label target) { + LabelPeer peer = new WLabelPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public ListPeer createList(List target) { + ListPeer peer = new WListPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public CheckboxPeer createCheckbox(Checkbox target) { + CheckboxPeer peer = new WCheckboxPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public ScrollbarPeer createScrollbar(Scrollbar target) { + ScrollbarPeer peer = new WScrollbarPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public ScrollPanePeer createScrollPane(ScrollPane target) { + ScrollPanePeer peer = new WScrollPanePeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public TextAreaPeer createTextArea(TextArea target) { + TextAreaPeer peer = new WTextAreaPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public ChoicePeer createChoice(Choice target) { + ChoicePeer peer = new WChoicePeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public FramePeer createFrame(Frame target) { + FramePeer peer = new WFramePeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public FramePeer createLightweightFrame(LightweightFrame target) { + FramePeer peer = new WLightweightFramePeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public CanvasPeer createCanvas(Canvas target) { + CanvasPeer peer = new WCanvasPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + @SuppressWarnings("deprecation") + public void disableBackgroundErase(Canvas canvas) { + WCanvasPeer peer = (WCanvasPeer)canvas.getPeer(); +@@ -417,60 +431,70 @@ + peer.disableBackgroundErase(); + } + ++ @Override + public PanelPeer createPanel(Panel target) { + PanelPeer peer = new WPanelPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public WindowPeer createWindow(Window target) { + WindowPeer peer = new WWindowPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public DialogPeer createDialog(Dialog target) { + DialogPeer peer = new WDialogPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public FileDialogPeer createFileDialog(FileDialog target) { + FileDialogPeer peer = new WFileDialogPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public MenuBarPeer createMenuBar(MenuBar target) { + MenuBarPeer peer = new WMenuBarPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public MenuPeer createMenu(Menu target) { + MenuPeer peer = new WMenuPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public PopupMenuPeer createPopupMenu(PopupMenu target) { + PopupMenuPeer peer = new WPopupMenuPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public MenuItemPeer createMenuItem(MenuItem target) { + MenuItemPeer peer = new WMenuItemPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public CheckboxMenuItemPeer createCheckboxMenuItem(CheckboxMenuItem target) { + CheckboxMenuItemPeer peer = new WCheckboxMenuItemPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public RobotPeer createRobot(Robot target, GraphicsDevice screen) { + // (target is unused for now) + // Robot's don't need to go in the peer map since +@@ -496,28 +520,38 @@ + return peer; + } + ++ @Override + public TrayIconPeer createTrayIcon(TrayIcon target) { + WTrayIconPeer peer = new WTrayIconPeer(target); + targetCreatedPeer(target, peer); + return peer; + } + ++ @Override + public SystemTrayPeer createSystemTray(SystemTray target) { + return new WSystemTrayPeer(target); + } + ++ @Override + public boolean isTraySupported() { + return true; + } + ++ @Override ++ public DataTransferer getDataTransferer() { ++ return WDataTransferer.getInstanceImpl(); ++ } ++ ++ @Override + public KeyboardFocusManagerPeer getKeyboardFocusManagerPeer() + throws HeadlessException + { + return WKeyboardFocusManagerPeer.getInstance(); + } + +- protected native void setDynamicLayoutNative(boolean b); ++ private native void setDynamicLayoutNative(boolean b); + ++ @Override + public void setDynamicLayout(boolean b) { + if (b == dynamicLayoutSetting) { + return; +@@ -527,6 +561,7 @@ + setDynamicLayoutNative(b); + } + ++ @Override + protected boolean isDynamicLayoutSet() { + return dynamicLayoutSetting; + } +@@ -535,8 +570,9 @@ + * Called from lazilyLoadDynamicLayoutSupportedProperty because + * Windows doesn't always send WM_SETTINGCHANGE when it should. + */ +- protected native boolean isDynamicLayoutSupportedNative(); ++ private native boolean isDynamicLayoutSupportedNative(); + ++ @Override + public boolean isDynamicLayoutActive() { + return (isDynamicLayoutSet() && isDynamicLayoutSupported()); + } +@@ -568,25 +604,31 @@ + return config.getColorModel(); + } + ++ @Override + public ColorModel getColorModel() { + return getStaticColorModel(); + } + ++ @Override + public Insets getScreenInsets(GraphicsConfiguration gc) + { + return getScreenInsets(((Win32GraphicsDevice) gc.getDevice()).getScreen()); + } + ++ @Override + public int getScreenResolution() { + Win32GraphicsEnvironment ge = (Win32GraphicsEnvironment) + GraphicsEnvironment.getLocalGraphicsEnvironment(); + return ge.getXResolution(); + } ++ @Override + protected native int getScreenWidth(); ++ @Override + protected native int getScreenHeight(); +- protected native Insets getScreenInsets(int screen); ++ private native Insets getScreenInsets(int screen); + + ++ @Override + public FontMetrics getFontMetrics(Font font) { + // This is an unsupported hack, but left in for a customer. + // Do not remove. +@@ -598,6 +640,7 @@ + return super.getFontMetrics(font); + } + ++ @Override + public FontPeer getFontPeer(String name, int style) { + FontPeer retval = null; + String lcName = name.toLowerCase(); +@@ -621,6 +664,7 @@ + + private native void nativeSync(); + ++ @Override + public void sync() { + // flush the GDI/DD buffers + nativeSync(); +@@ -630,11 +674,13 @@ + D3DRenderQueue.sync(); + } + ++ @Override + public PrintJob getPrintJob(Frame frame, String doctitle, + Properties props) { + return getPrintJob(frame, doctitle, null, null); + } + ++ @Override + public PrintJob getPrintJob(Frame frame, String doctitle, + JobAttributes jobAttributes, + PageAttributes pageAttributes) +@@ -653,8 +699,10 @@ + return printJob; + } + ++ @Override + public native void beep(); + ++ @Override + public boolean getLockingKeyState(int key) { + if (! (key == KeyEvent.VK_CAPS_LOCK || key == KeyEvent.VK_NUM_LOCK || + key == KeyEvent.VK_SCROLL_LOCK || key == KeyEvent.VK_KANA_LOCK)) { +@@ -663,8 +711,9 @@ + return getLockingKeyStateNative(key); + } + +- public native boolean getLockingKeyStateNative(int key); ++ private native boolean getLockingKeyStateNative(int key); + ++ @Override + public void setLockingKeyState(int key, boolean on) { + if (! (key == KeyEvent.VK_CAPS_LOCK || key == KeyEvent.VK_NUM_LOCK || + key == KeyEvent.VK_SCROLL_LOCK || key == KeyEvent.VK_KANA_LOCK)) { +@@ -673,8 +722,9 @@ + setLockingKeyStateNative(key, on); + } + +- public native void setLockingKeyStateNative(int key, boolean on); ++ private native void setLockingKeyStateNative(int key, boolean on); + ++ @Override + public Clipboard getSystemClipboard() { + SecurityManager security = System.getSecurityManager(); + if (security != null) { +@@ -688,6 +738,7 @@ + return clipboard; + } + ++ @Override + protected native void loadSystemColors(int[] systemColors); + + public static final Object targetToPeer(Object target) { +@@ -701,6 +752,7 @@ + /** + * Returns a new input method adapter descriptor for native input methods. + */ ++ @Override + public InputMethodDescriptor getInputMethodAdapterDescriptor() { + return new WInputMethodDescriptor(); + } +@@ -708,6 +760,7 @@ + /** + * Returns a style map for the input method highlight. + */ ++ @Override + public Map<java.awt.font.TextAttribute,?> mapInputMethodHighlight( + InputMethodHighlight highlight) + { +@@ -718,6 +771,7 @@ + * Returns whether enableInputMethods should be set to true for peered + * TextComponent instances on this platform. + */ ++ @Override + public boolean enableInputMethodsForTextComponent() { + return true; + } +@@ -725,6 +779,7 @@ + /** + * Returns the default keyboard locale of the underlying operating system + */ ++ @Override + public Locale getDefaultKeyboardLocale() { + Locale locale = WInputMethod.getNativeLocale(); + +@@ -738,6 +793,7 @@ + /** + * Returns a new custom cursor. + */ ++ @Override + public Cursor createCustomCursor(Image cursor, Point hotSpot, String name) + throws IndexOutOfBoundsException { + return new WCustomCursor(cursor, hotSpot, name); +@@ -746,11 +802,13 @@ + /** + * Returns the supported cursor size (Win32 only has one). + */ ++ @Override + public Dimension getBestCursorSize(int preferredWidth, int preferredHeight) { + return new Dimension(WCustomCursor.getCursorWidth(), + WCustomCursor.getCursorHeight()); + } + ++ @Override + public native int getMaximumCursorColors(); + + static void paletteChanged() { +@@ -766,6 +824,7 @@ + */ + static public void displayChanged() { + EventQueue.invokeLater(new Runnable() { ++ @Override + public void run() { + ((Win32GraphicsEnvironment)GraphicsEnvironment + .getLocalGraphicsEnvironment()) +@@ -778,10 +837,12 @@ + * create the peer for a DragSourceContext + */ + ++ @Override + public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException { + return WDragSourceContextPeer.createDragSourceContextPeer(dge); + } + ++ @Override + public <T extends DragGestureRecognizer> T + createDragGestureRecognizer(Class<T> abstractRecognizerClass, + DragSource ds, Component c, int srcActions, +@@ -802,6 +863,7 @@ + private static final String awtPrefix = "awt."; + private static final String dndPrefix = "DnD."; + ++ @Override + protected Object lazilyLoadDesktopProperty(String name) { + if (name.startsWith(prefix)) { + String cursorName = name.substring(prefix.length(), name.length()) + postfix; +@@ -895,6 +957,7 @@ + } + } + ++ @Override + public synchronized void addPropertyChangeListener(String name, PropertyChangeListener pcl) { + if (name == null) { + // See JavaDoc for the Toolkit.addPropertyChangeListener() method +@@ -930,6 +993,7 @@ + * This returns the value for the desktop property "awt.font.desktophints" + * This requires that the Windows properties have already been gathered. + */ ++ @Override + protected synchronized RenderingHints getDesktopAAHints() { + if (wprops == null) { + return null; +@@ -938,6 +1002,7 @@ + } + } + ++ @Override + public boolean isModalityTypeSupported(Dialog.ModalityType modalityType) { + return (modalityType == null) || + (modalityType == Dialog.ModalityType.MODELESS) || +@@ -946,6 +1011,7 @@ + (modalityType == Dialog.ModalityType.TOOLKIT_MODAL); + } + ++ @Override + public boolean isModalExclusionTypeSupported(Dialog.ModalExclusionType exclusionType) { + return (exclusionType == null) || + (exclusionType == Dialog.ModalExclusionType.NO_EXCLUDE) || +@@ -985,6 +1051,7 @@ + return !Win32GraphicsEnvironment.isDWMCompositionEnabled(); + } + ++ @Override + @SuppressWarnings("deprecation") + public void grab(Window w) { + if (w.getPeer() != null) { +@@ -992,6 +1059,7 @@ + } + } + ++ @Override + @SuppressWarnings("deprecation") + public void ungrab(Window w) { + if (w.getPeer() != null) { +@@ -999,17 +1067,21 @@ + } + } + ++ @Override + public native boolean syncNativeQueue(final long timeout); ++ @Override + public boolean isDesktopSupported() { + return true; + } + ++ @Override + public DesktopPeer createDesktopPeer(Desktop target) { + return new WDesktopPeer(); + } + +- public static native void setExtraMouseButtonsEnabledNative(boolean enable); ++ private static native void setExtraMouseButtonsEnabledNative(boolean enable); + ++ @Override + public boolean areExtraMouseButtonsEnabled() throws HeadlessException { + return areExtraMouseButtonsEnabled; + } +--- ./jdk/src/windows/classes/sun/awt/windows/WTrayIconPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WTrayIconPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -36,9 +36,8 @@ + import java.awt.image.*; + import sun.awt.SunToolkit; + import sun.awt.image.IntegerComponentRaster; +-import sun.awt.windows.WPopupMenuPeer; + +-public class WTrayIconPeer extends WObjectPeer implements TrayIconPeer { ++final class WTrayIconPeer extends WObjectPeer implements TrayIconPeer { + final static int TRAY_ICON_WIDTH = 16; + final static int TRAY_ICON_HEIGHT = 16; + final static int TRAY_ICON_MASK_SIZE = (TRAY_ICON_WIDTH * TRAY_ICON_HEIGHT) / 8; +@@ -48,6 +47,7 @@ + Frame popupParent = new Frame("PopupMessageWindow"); + PopupMenu popup; + ++ @Override + protected void disposeImpl() { + if (popupParent != null) { + popupParent.dispose(); +@@ -64,6 +64,7 @@ + updateImage(); + } + ++ @Override + public void updateImage() { + Image image = ((TrayIcon)target).getImage(); + if (image != null) { +@@ -71,13 +72,16 @@ + } + } + ++ @Override + public native void setToolTip(String tooltip); + ++ @Override + public synchronized void showPopupMenu(final int x, final int y) { + if (isDisposed()) + return; + + SunToolkit.executeOnEventHandlerThread(target, new Runnable() { ++ @Override + public void run() { + PopupMenu newPopup = ((TrayIcon)target).getPopupMenu(); + if (popup != newPopup) { +@@ -96,6 +100,7 @@ + }); + } + ++ @Override + public void displayMessage(String caption, String text, String messageType) { + // The situation when both caption and text are null is processed in the shared code. + if (caption == null) { +@@ -185,6 +190,7 @@ + native void _displayMessage(String caption, String text, String messageType); + + class IconObserver implements ImageObserver { ++ @Override + public boolean imageUpdate(Image image, int flags, int x, int y, int width, int height) { + if (image != ((TrayIcon)target).getImage() || // if the image has been changed + isDisposed()) +--- ./jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -90,6 +90,7 @@ + } + + // WComponentPeer overrides ++ @Override + @SuppressWarnings("unchecked") + protected void disposeImpl() { + AppContext appContext = SunToolkit.targetToAppContext(target); +@@ -118,24 +119,30 @@ + + // WindowPeer implementation + ++ @Override + public void toFront() { + updateFocusableWindowState(); + _toFront(); + } +- native void _toFront(); ++ private native void _toFront(); ++ ++ @Override + public native void toBack(); + +- public native void setAlwaysOnTopNative(boolean value); ++ private native void setAlwaysOnTopNative(boolean value); ++ + public void setAlwaysOnTop(boolean value) { + if ((value && ((Window)target).isVisible()) || !value) { + setAlwaysOnTopNative(value); + } + } + ++ @Override + public void updateAlwaysOnTopState() { + setAlwaysOnTop(((Window)target).isAlwaysOnTop()); + } + ++ @Override + public void updateFocusableWindowState() { + setFocusableWindow(((Window)target).isFocusableWindow()); + } +@@ -150,12 +157,13 @@ + } + _setTitle(title); + } +- native void _setTitle(String title); ++ private native void _setTitle(String title); + + public void setResizable(boolean resizable) { + _setResizable(resizable); + } +- public native void _setResizable(boolean resizable); ++ ++ private native void _setResizable(boolean resizable); + + // Toolkit & peer internals + +@@ -163,6 +171,7 @@ + super(target); + } + ++ @Override + void initialize() { + super.initialize(); + +@@ -210,6 +219,7 @@ + windowType = ((Window)target).getType(); + } + ++ @Override + void create(WComponentPeer parent) { + preCreate(parent); + createAwtWindow(parent); +@@ -226,6 +236,7 @@ + super.show(); + } + ++ @Override + public void show() { + updateFocusableWindowState(); + +@@ -289,7 +300,7 @@ + } + return requestWindowFocus(cause == CausedFocusEvent.Cause.MOUSE_EVENT); + } +- public native boolean requestWindowFocus(boolean isMouseEventCause); ++ private native boolean requestWindowFocus(boolean isMouseEventCause); + + public boolean focusAllowedFor() { + Window window = (Window)this.target; +@@ -305,7 +316,8 @@ + return true; + } + +- public void hide() { ++ @Override ++ void hide() { + WindowListener listener = windowListener; + if (listener != null) { + // We're not getting WINDOW_CLOSING from the native code when hiding +@@ -316,6 +328,7 @@ + } + + // WARNING: it's called on the Toolkit thread! ++ @Override + void preprocessPostEvent(AWTEvent event) { + if (event instanceof WindowEvent) { + WindowListener listener = windowListener; +@@ -340,6 +353,7 @@ + windowListener = AWTEventMulticaster.remove(windowListener, l); + } + ++ @Override + public void updateMinimumSize() { + Dimension minimumSize = null; + if (((Component)target).isMinimumSizeSet()) { +@@ -356,6 +370,7 @@ + } + } + ++ @Override + public void updateIconImages() { + java.util.List<Image> imageList = ((Window)target).getIconImages(); + if (imageList == null || imageList.size() == 0) { +@@ -393,6 +408,7 @@ + return modalBlocker != null; + } + ++ @Override + @SuppressWarnings("deprecation") + public void setModalBlocked(Dialog dialog, boolean blocked) { + synchronized (((Component)getTarget()).getTreeLock()) // State lock should always be after awtLock +@@ -434,8 +450,8 @@ + * active window is always at the end. + */ + @SuppressWarnings("unchecked") +- public static long[] getActiveWindowHandles() { +- AppContext appContext = AppContext.getAppContext(); ++ public static long[] getActiveWindowHandles(Component target) { ++ AppContext appContext = SunToolkit.targetToAppContext(target); + if (appContext == null) return null; + synchronized (appContext) { + List<WWindowPeer> l = (List<WWindowPeer>)appContext.get(ACTIVE_WINDOWS_KEY); +@@ -460,6 +476,7 @@ + void draggedToNewScreen() { + SunToolkit.executeOnEventHandlerThread((Component)target,new Runnable() + { ++ @Override + public void run() { + displayChanged(); + } +@@ -520,6 +537,7 @@ + * reflects the current display depth information, which has + * just changed). + */ ++ @Override + public void displayChanged() { + updateGC(); + } +@@ -528,6 +546,7 @@ + * Part of the DisplayChangedListener interface: components + * do not need to react to this event + */ ++ @Override + public void paletteChanged() { + } + +@@ -566,6 +585,7 @@ + private volatile int sysW = 0; + private volatile int sysH = 0; + ++ @Override + public native void repositionSecurityWarning(); + + @Override +@@ -621,6 +641,7 @@ + private native void setOpacity(int iOpacity); + private float opacity = 1.0f; + ++ @Override + public void setOpacity(float opacity) { + if (!((SunToolkit)((Window)target).getToolkit()). + isWindowOpacitySupported()) +@@ -664,6 +685,7 @@ + + private native void setOpaqueImpl(boolean isOpaque); + ++ @Override + public void setOpaque(boolean isOpaque) { + synchronized (getStateLock()) { + if (this.isOpaque == isOpaque) { +@@ -721,8 +743,9 @@ + } + } + +- public native void updateWindowImpl(int[] data, int width, int height); ++ native void updateWindowImpl(int[] data, int width, int height); + ++ @Override + public void updateWindow() { + updateWindow(false); + } +@@ -771,6 +794,7 @@ + * unregisters ActiveWindowListener listener. + */ + private static class GuiDisposedListener implements PropertyChangeListener { ++ @Override + public void propertyChange(PropertyChangeEvent e) { + boolean isDisposed = (Boolean)e.getNewValue(); + if (isDisposed != true) { +@@ -796,6 +820,7 @@ + */ + @SuppressWarnings( value = {"deprecation", "unchecked"}) + private static class ActiveWindowListener implements PropertyChangeListener { ++ @Override + public void propertyChange(PropertyChangeEvent e) { + Window w = (Window)e.getNewValue(); + if (w == null) { +--- ./jdk/src/windows/classes/sun/awt/windows/WingDings.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/awt/windows/WingDings.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,11 +29,12 @@ + import java.nio.CharBuffer; + import java.nio.charset.*; + +-public class WingDings extends Charset { ++public final class WingDings extends Charset { + public WingDings () { + super("WingDings", null); + } + ++ @Override + public CharsetEncoder newEncoder() { + return new Encoder(this); + } +@@ -41,10 +42,12 @@ + /* Seems like supporting a decoder is required, but we aren't going + * to be publically exposing this class, so no need to waste work + */ ++ @Override + public CharsetDecoder newDecoder() { + throw new Error("Decoder isn't implemented for WingDings Charset"); + } + ++ @Override + public boolean contains(Charset cs) { + return cs instanceof WingDings; + } +@@ -54,6 +57,7 @@ + super(cs, 1.0f, 1.0f); + } + ++ @Override + public boolean canEncode(char c) { + if(c >= 0x2701 && c <= 0x27be){ + if (table[c - 0x2700] != 0x00) +@@ -64,6 +68,7 @@ + return false; + } + ++ @Override + protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) { + char[] sa = src.array(); + int sp = src.arrayOffset() + src.position(); +@@ -156,6 +161,7 @@ + }; + + /* The default implementation creates a decoder and we don't have one */ ++ @Override + public boolean isLegalReplacement(byte[] repl) { + return true; + } +--- ./jdk/src/windows/classes/sun/nio/ch/PollArrayWrapper.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/nio/ch/PollArrayWrapper.java Wed Jul 30 18:42:59 2014 +0100 +@@ -53,15 +53,6 @@ + + static short SIZE_POLLFD = 8; // sizeof pollfd struct + +- // events masks +- @Native static final short POLLIN = AbstractPollArrayWrapper.POLLIN; +- @Native static final short POLLOUT = AbstractPollArrayWrapper.POLLOUT; +- @Native static final short POLLERR = AbstractPollArrayWrapper.POLLERR; +- @Native static final short POLLHUP = AbstractPollArrayWrapper.POLLHUP; +- @Native static final short POLLNVAL = AbstractPollArrayWrapper.POLLNVAL; +- @Native static final short POLLREMOVE = AbstractPollArrayWrapper.POLLREMOVE; +- @Native static final short POLLCONN = 0x0002; +- + private int size; // Size of the pollArray + + PollArrayWrapper(int newSize) { +@@ -119,6 +110,6 @@ + // Adds Windows wakeup socket at a given index. + void addWakeupSocket(int fdVal, int index) { + putDescriptor(index, fdVal); +- putEventOps(index, POLLIN); ++ putEventOps(index, Net.POLLIN); + } + } +--- ./jdk/src/windows/classes/sun/nio/ch/SinkChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/nio/ch/SinkChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -78,17 +78,16 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) ++ if ((ops & Net.POLLNVAL) != 0) + throw new Error("POLLNVAL detected"); + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLOUT) != 0) && ++ if (((ops & Net.POLLOUT) != 0) && + ((intOps & SelectionKey.OP_WRITE) != 0)) + newOps |= SelectionKey.OP_WRITE; + +@@ -106,7 +105,7 @@ + + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + if ((ops & SelectionKey.OP_WRITE) != 0) +- ops = PollArrayWrapper.POLLOUT; ++ ops = Net.POLLOUT; + sk.selector.putEventOps(sk, ops); + } + +--- ./jdk/src/windows/classes/sun/nio/ch/SourceChannelImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/nio/ch/SourceChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -77,17 +77,16 @@ + int oldOps = sk.nioReadyOps(); + int newOps = initialOps; + +- if ((ops & PollArrayWrapper.POLLNVAL) != 0) ++ if ((ops & Net.POLLNVAL) != 0) + throw new Error("POLLNVAL detected"); + +- if ((ops & (PollArrayWrapper.POLLERR +- | PollArrayWrapper.POLLHUP)) != 0) { ++ if ((ops & (Net.POLLERR | Net.POLLHUP)) != 0) { + newOps = intOps; + sk.nioReadyOps(newOps); + return (newOps & ~oldOps) != 0; + } + +- if (((ops & PollArrayWrapper.POLLIN) != 0) && ++ if (((ops & Net.POLLIN) != 0) && + ((intOps & SelectionKey.OP_READ) != 0)) + newOps |= SelectionKey.OP_READ; + +@@ -105,7 +104,7 @@ + + public void translateAndSetInterestOps(int ops, SelectionKeyImpl sk) { + if ((ops & SelectionKey.OP_READ) != 0) +- ops = PollArrayWrapper.POLLIN; ++ ops = Net.POLLIN; + sk.selector.putEventOps(sk, ops); + } + +--- ./jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java Wed Jul 30 18:42:59 2014 +0100 +@@ -313,16 +313,16 @@ + private int processSelectedKeys(long updateCount) { + int numKeysUpdated = 0; + numKeysUpdated += processFDSet(updateCount, readFds, +- PollArrayWrapper.POLLIN, ++ Net.POLLIN, + false); + numKeysUpdated += processFDSet(updateCount, writeFds, +- PollArrayWrapper.POLLCONN | +- PollArrayWrapper.POLLOUT, ++ Net.POLLCONN | ++ Net.POLLOUT, + false); + numKeysUpdated += processFDSet(updateCount, exceptFds, +- PollArrayWrapper.POLLIN | +- PollArrayWrapper.POLLCONN | +- PollArrayWrapper.POLLOUT, ++ Net.POLLIN | ++ Net.POLLCONN | ++ Net.POLLOUT, + true); + return numKeysUpdated; + } +--- ./jdk/src/windows/classes/sun/nio/fs/WindowsChannelFactory.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/nio/fs/WindowsChannelFactory.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,19 +25,22 @@ + + package sun.nio.fs; + +-import java.nio.file.*; +-import java.nio.channels.*; + import java.io.FileDescriptor; + import java.io.IOException; +-import java.util.*; ++import java.nio.channels.AsynchronousFileChannel; ++import java.nio.channels.FileChannel; ++import java.nio.file.LinkOption; ++import java.nio.file.OpenOption; ++import java.nio.file.StandardOpenOption; ++import java.util.Set; + + import com.sun.nio.file.ExtendedOpenOption; + ++import sun.misc.JavaIOFileDescriptorAccess; ++import sun.misc.SharedSecrets; + import sun.nio.ch.FileChannelImpl; + import sun.nio.ch.ThreadPool; + import sun.nio.ch.WindowsAsynchronousFileChannelImpl; +-import sun.misc.SharedSecrets; +-import sun.misc.JavaIOFileDescriptorAccess; + + import static sun.nio.fs.WindowsNativeDispatcher.*; + import static sun.nio.fs.WindowsConstants.*; +@@ -157,7 +160,7 @@ + throw new IllegalArgumentException("APPEND + TRUNCATE_EXISTING not allowed"); + + FileDescriptor fdObj = open(pathForWindows, pathToCheck, flags, pSecurityDescriptor); +- return FileChannelImpl.open(fdObj, flags.read, flags.write, flags.append, null); ++ return FileChannelImpl.open(fdObj, pathForWindows, flags.read, flags.write, flags.append, null); + } + + /** +--- ./jdk/src/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java Wed Jul 30 18:42:59 2014 +0100 +@@ -493,6 +493,14 @@ + try { + CreateDirectory(dir.getPathForWin32Calls(), sd.address()); + } catch (WindowsException x) { ++ // convert ERROR_ACCESS_DENIED to FileAlreadyExistsException if we can ++ // verify that the directory exists ++ if (x.lastError() == ERROR_ACCESS_DENIED) { ++ try { ++ if (WindowsFileAttributes.get(dir, false).isDirectory()) ++ throw new FileAlreadyExistsException(dir.toString()); ++ } catch (WindowsException ignore) { } ++ } + x.rethrowAsIOException(dir); + } finally { + sd.release(); +--- ./jdk/src/windows/classes/sun/security/mscapi/RSACipher.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/classes/sun/security/mscapi/RSACipher.java Wed Jul 30 18:42:59 2014 +0100 +@@ -35,6 +35,8 @@ + import javax.crypto.spec.*; + + import sun.security.rsa.RSAKeyFactory; ++import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; ++import sun.security.util.KeyUtil; + + /** + * RSA cipher implementation using the Microsoft Crypto API. +@@ -92,9 +94,16 @@ + + // the public key, if we were initialized using a public key + private sun.security.mscapi.Key publicKey; ++ + // the private key, if we were initialized using a private key + private sun.security.mscapi.Key privateKey; + ++ // cipher parameter for TLS RSA premaster secret ++ private AlgorithmParameterSpec spec = null; ++ ++ // the source of randomness ++ private SecureRandom random; ++ + public RSACipher() { + paddingType = PAD_PKCS1; + } +@@ -155,8 +164,12 @@ + throws InvalidKeyException, InvalidAlgorithmParameterException { + + if (params != null) { +- throw new InvalidAlgorithmParameterException +- ("Parameters not supported"); ++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) { ++ throw new InvalidAlgorithmParameterException( ++ "Parameters not supported"); ++ } ++ spec = params; ++ this.random = random; // for TLS RSA premaster secret + } + init(opmode, key); + } +@@ -356,39 +369,47 @@ + } + + // see JCE spec +- protected java.security.Key engineUnwrap(byte[] wrappedKey, String algorithm, ++ protected java.security.Key engineUnwrap(byte[] wrappedKey, ++ String algorithm, + int type) throws InvalidKeyException, NoSuchAlgorithmException { + + if (wrappedKey.length > buffer.length) { + throw new InvalidKeyException("Key is too long for unwrapping"); + } ++ ++ boolean isTlsRsaPremasterSecret = ++ algorithm.equals("TlsRsaPremasterSecret"); ++ Exception failover = null; ++ byte[] encoded = null; ++ + update(wrappedKey, 0, wrappedKey.length); +- + try { +- byte[] encoding = doFinal(); +- +- switch (type) { +- case Cipher.PUBLIC_KEY: +- return constructPublicKey(encoding, algorithm); +- +- case Cipher.PRIVATE_KEY: +- return constructPrivateKey(encoding, algorithm); +- +- case Cipher.SECRET_KEY: +- return constructSecretKey(encoding, algorithm); +- +- default: +- throw new InvalidKeyException("Unknown key type " + type); ++ encoded = doFinal(); ++ } catch (BadPaddingException e) { ++ if (isTlsRsaPremasterSecret) { ++ failover = e; ++ } else { ++ throw new InvalidKeyException("Unwrapping failed", e); + } +- +- } catch (BadPaddingException e) { +- // should not occur +- throw new InvalidKeyException("Unwrapping failed", e); +- + } catch (IllegalBlockSizeException e) { + // should not occur, handled with length check above + throw new InvalidKeyException("Unwrapping failed", e); + } ++ ++ if (isTlsRsaPremasterSecret) { ++ if (!(spec instanceof TlsRsaPremasterSecretParameterSpec)) { ++ throw new IllegalStateException( ++ "No TlsRsaPremasterSecretParameterSpec specified"); ++ } ++ ++ // polish the TLS premaster secret ++ encoded = KeyUtil.checkTlsPreMasterSecretKey( ++ ((TlsRsaPremasterSecretParameterSpec)spec).getClientVersion(), ++ ((TlsRsaPremasterSecretParameterSpec)spec).getServerVersion(), ++ random, encoded, (failover != null)); ++ } ++ ++ return constructKey(encoded, algorithm, type); + } + + // see JCE spec +@@ -452,6 +473,22 @@ + return new SecretKeySpec(encodedKey, encodedKeyAlgorithm); + } + ++ private static Key constructKey(byte[] encodedKey, ++ String encodedKeyAlgorithm, ++ int keyType) throws InvalidKeyException, NoSuchAlgorithmException { ++ ++ switch (keyType) { ++ case Cipher.PUBLIC_KEY: ++ return constructPublicKey(encodedKey, encodedKeyAlgorithm); ++ case Cipher.PRIVATE_KEY: ++ return constructPrivateKey(encodedKey, encodedKeyAlgorithm); ++ case Cipher.SECRET_KEY: ++ return constructSecretKey(encodedKey, encodedKeyAlgorithm); ++ default: ++ throw new InvalidKeyException("Unknown key type " + keyType); ++ } ++ } ++ + /* + * Encrypt/decrypt a data buffer using Microsoft Crypto API with HCRYPTKEY. + * It expects and returns ciphertext data in big-endian form. +--- ./jdk/src/windows/lib/tzmappings Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/lib/tzmappings Wed Jul 30 18:42:59 2014 +0100 +@@ -137,8 +137,8 @@ + Central Standard Time:36,37::America/Chicago: + Eastern:38,39::America/New_York: + Eastern Standard Time:38,39::America/New_York: +-E. Europe:4,5:BY:Europe/Minsk: +-E. Europe Standard Time:4,5:BY:Europe/Minsk: ++E. Europe:4,5::EET: ++E. Europe Standard Time:4,5::EET: + Egypt:4,68::Africa/Cairo: + Egypt Standard Time:4,68::Africa/Cairo: + South Africa:4,69::Africa/Harare: +@@ -192,5 +192,6 @@ + Kaliningrad Standard Time:925,925:RU:Europe/Kaliningrad: + Turkey Standard Time:926,926::Asia/Istanbul: + Bahia Standard Time:927,927::America/Bahia: +-Western Brazilian Standard Time:928,928:BR:America/Rio_Branco: +-Armenian Standard Time:929,929:AM:Asia/Yerevan: ++Libya Standard Time:928,928:LY:Africa/Tripoli: ++Western Brazilian Standard Time:929,929:BR:America/Rio_Branco: ++Armenian Standard Time:930,930:AM:Asia/Yerevan: +--- ./jdk/src/windows/native/java/io/WinNTFileSystem_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/java/io/WinNTFileSystem_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -83,7 +83,7 @@ + * Retrieves the fully resolved (final) path for the given path or NULL + * if the function fails. + */ +-static WCHAR* getFinalPath(const WCHAR *path) ++static WCHAR* getFinalPath(JNIEnv *env, const WCHAR *path) + { + HANDLE h; + WCHAR *result; +@@ -119,6 +119,7 @@ + len = (*GetFinalPathNameByHandle_func)(h, result, len, 0); + } else { + len = 0; ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); + } + } + +@@ -139,6 +140,7 @@ + /* copy result without prefix into new buffer */ + WCHAR *tmp = (WCHAR*)malloc(resultLen * sizeof(WCHAR)); + if (tmp == NULL) { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); + len = 0; + } else { + WCHAR *p = result; +@@ -162,6 +164,8 @@ + free(result); + result = NULL; + } ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); + } + + error = GetLastError(); +@@ -255,6 +259,8 @@ + rv = (*env)->NewString(env, cp, (jsize)wcslen(cp)); + } + free(cp); ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); + } + } else + if (wcanonicalize(path, canonicalPath, MAX_PATH_LENGTH) >= 0) { +@@ -287,6 +293,8 @@ + rv = (*env)->NewString(env, cp, (jsize)wcslen(cp)); + } + free(cp); ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); + } + } else + if (wcanonicalizeWithPrefix(canonicalPrefix, +@@ -434,7 +442,7 @@ + if ((a != INVALID_FILE_ATTRIBUTES) && + ((a & FILE_ATTRIBUTE_REPARSE_POINT) != 0)) + { +- WCHAR *fp = getFinalPath(pathbuf); ++ WCHAR *fp = getFinalPath(env, pathbuf); + if (fp == NULL) { + a = INVALID_FILE_ATTRIBUTES; + } else { +@@ -624,6 +632,7 @@ + if (search_path == 0) { + free (pathbuf); + errno = ENOMEM; ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation faiuled"); + return NULL; + } + wcscpy(search_path, pathbuf); +@@ -801,7 +810,7 @@ + if ((a != INVALID_FILE_ATTRIBUTES) && + ((a & FILE_ATTRIBUTE_REPARSE_POINT) != 0)) + { +- WCHAR *fp = getFinalPath(pathbuf); ++ WCHAR *fp = getFinalPath(env, pathbuf); + if (fp == NULL) { + a = INVALID_FILE_ATTRIBUTES; + } else { +--- ./jdk/src/windows/native/java/io/io_util_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/java/io/io_util_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -161,10 +161,17 @@ + { + if (pathlen > max_path - 1) { + pathbuf = prefixAbpath(ps, pathlen, pathlen); ++ if (pathbuf == NULL) { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ return NULL; ++ } + } else { + pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR)); + if (pathbuf != 0) { + wcscpy(pathbuf, ps); ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ return NULL; + } + } + } else { +@@ -184,10 +191,17 @@ + int dirlen = currentDirLength(ps, pathlen); + if (dirlen + pathlen + 1 > max_path - 1) { + pathbuf = prefixAbpath(ps, pathlen, dirlen + pathlen); ++ if (pathbuf == NULL) { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ return NULL; ++ } + } else { + pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR)); + if (pathbuf != 0) { + wcscpy(pathbuf, ps); ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ return NULL; + } + } + } +@@ -196,15 +210,24 @@ + + if (pathlen == 0) { + if (throwFNFE == JNI_TRUE) { +- throwFileNotFoundException(env, path); ++ if (!(*env)->ExceptionCheck(env)) { ++ throwFileNotFoundException(env, path); ++ } + return NULL; + } else { + pathbuf = (WCHAR*)malloc(sizeof(WCHAR)); +- pathbuf[0] = L'\0'; ++ if (pathbuf != NULL) { ++ pathbuf[0] = L'\0'; ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ return NULL; ++ } + } + } + if (pathbuf == 0) { +- JNU_ThrowOutOfMemoryError(env, 0); ++ if (!(*env)->ExceptionCheck(env)) { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ } + return NULL; + } + return pathbuf; +--- ./jdk/src/windows/native/java/lang/ProcessEnvironment_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/java/lang/ProcessEnvironment_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 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 +@@ -32,10 +32,17 @@ + environmentBlock9x(JNIEnv *env) + { + int i; +- jmethodID String_init_ID = +- (*env)->GetMethodID(env, JNU_ClassString(env), "<init>", "([B)V"); ++ jmethodID String_init_ID; + jbyteArray bytes; +- jbyte *blockA = (jbyte *) GetEnvironmentStringsA(); ++ jbyte *blockA; ++ jclass string_class; ++ ++ string_class= JNU_ClassString(env); ++ CHECK_NULL_RETURN(string_class, NULL); ++ String_init_ID = ++ (*env)->GetMethodID(env, string_class, "<init>", "([B)V"); ++ CHECK_NULL_RETURN(String_init_ID, NULL); ++ blockA = (jbyte *) GetEnvironmentStringsA(); + if (blockA == NULL) { + /* Both GetEnvironmentStringsW and GetEnvironmentStringsA + * failed. Out of memory is our best guess. */ +@@ -49,10 +56,13 @@ + while (blockA[i++]) + ; + +- if ((bytes = (*env)->NewByteArray(env, i)) == NULL) return NULL; ++ if ((bytes = (*env)->NewByteArray(env, i)) == NULL) { ++ FreeEnvironmentStringsA(blockA); ++ return NULL; ++ } + (*env)->SetByteArrayRegion(env, bytes, 0, i, blockA); + FreeEnvironmentStringsA(blockA); +- return (*env)->NewObject(env, JNU_ClassString(env), ++ return (*env)->NewObject(env, string_class, + String_init_ID, bytes); + } + +--- ./jdk/src/windows/native/java/lang/ProcessImpl_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/java/lang/ProcessImpl_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -359,24 +359,28 @@ + const jchar *penvBlock = (envBlock != NULL) + ? (*env)->GetStringChars(env, envBlock, NULL) + : NULL; +- const jchar *pdir = (dir != NULL) +- ? (*env)->GetStringChars(env, dir, NULL) +- : NULL; +- jlong *handles = (*env)->GetLongArrayElements(env, stdHandles, NULL); +- if (handles != NULL) { +- ret = processCreate( +- env, +- pcmd, +- penvBlock, +- pdir, +- handles, +- redirectErrorStream); +- (*env)->ReleaseLongArrayElements(env, stdHandles, handles, 0); ++ if (!(*env)->ExceptionCheck(env)) { ++ const jchar *pdir = (dir != NULL) ++ ? (*env)->GetStringChars(env, dir, NULL) ++ : NULL; ++ if (!(*env)->ExceptionCheck(env)) { ++ jlong *handles = (*env)->GetLongArrayElements(env, stdHandles, NULL); ++ if (handles != NULL) { ++ ret = processCreate( ++ env, ++ pcmd, ++ penvBlock, ++ pdir, ++ handles, ++ redirectErrorStream); ++ (*env)->ReleaseLongArrayElements(env, stdHandles, handles, 0); ++ } ++ if (pdir != NULL) ++ (*env)->ReleaseStringChars(env, dir, pdir); ++ } ++ if (penvBlock != NULL) ++ (*env)->ReleaseStringChars(env, envBlock, penvBlock); + } +- if (pdir != NULL) +- (*env)->ReleaseStringChars(env, dir, pdir); +- if (penvBlock != NULL) +- (*env)->ReleaseStringChars(env, envBlock, penvBlock); + (*env)->ReleaseStringChars(env, cmd, pcmd); + } + } +@@ -448,7 +452,7 @@ + JNIEXPORT jboolean JNICALL + Java_java_lang_ProcessImpl_closeHandle(JNIEnv *env, jclass ignored, jlong handle) + { +- return CloseHandle((HANDLE) handle); ++ return (jboolean) CloseHandle((HANDLE) handle); + } + + /** +--- ./jdk/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -376,15 +376,19 @@ + if (packetAddress == NULL) { + packetAddress = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, + &port); +- /* stuff the new Inetaddress into the packet */ +- (*env)->SetObjectField(env, dpObj, dp_addressID, packetAddress); ++ if (packetAddress != NULL) { ++ /* stuff the new Inetaddress into the packet */ ++ (*env)->SetObjectField(env, dpObj, dp_addressID, packetAddress); ++ } + } + +- /* populate the packet */ +- (*env)->SetByteArrayRegion(env, packetBuffer, packetBufferOffset, rv, ++ if (!(*env)->ExceptionCheck(env)) { ++ /* populate the packet */ ++ (*env)->SetByteArrayRegion(env, packetBuffer, packetBufferOffset, rv, + (jbyte *)fullPacket); +- (*env)->SetIntField(env, dpObj, dp_portID, port); +- (*env)->SetIntField(env, dpObj, dp_lengthID, rv); ++ (*env)->SetIntField(env, dpObj, dp_portID, port); ++ (*env)->SetIntField(env, dpObj, dp_lengthID, rv); ++ } + } + + if (packetBufferLen > MAX_BUFFER_LEN) { +--- ./jdk/src/windows/native/java/net/ExtendedOptionsImpl.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/windows/native/java/net/ExtendedOptionsImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,62 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++#include <jni.h> ++#include <string.h> ++ ++#include "net_util.h" ++ ++/* ++ * Class: sun_net_ExtendedOptionsImpl ++ * Method: init ++ * Signature: ()V ++ */ ++JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_init ++ (JNIEnv *env, jclass UNUSED) ++{ ++} ++ ++/* Non Solaris. Functionality is not supported. So, throw UnsupportedOpExc */ ++ ++JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_setFlowOption ++ (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) { ++ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ++ "unsupported socket option"); ++} ++ ++JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_getFlowOption ++ (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) { ++ JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", ++ "unsupported socket option"); ++} ++ ++static jboolean flowSupported0() { ++ return JNI_FALSE; ++} ++ ++JNIEXPORT jboolean JNICALL Java_sun_net_ExtendedOptionsImpl_flowSupported ++ (JNIEnv *env, jclass UNUSED) { ++ return JNI_FALSE; ++} +--- ./jdk/src/windows/native/java/net/NetworkInterface.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/java/net/NetworkInterface.c Wed Jul 30 18:42:59 2014 +0100 +@@ -567,16 +567,16 @@ + * Create a NetworkInterface object and populate it + */ + netifObj = (*env)->NewObject(env, ni_class, ni_ctor); ++ CHECK_NULL_RETURN(netifObj, NULL); + name = (*env)->NewStringUTF(env, ifs->name); ++ CHECK_NULL_RETURN(name, NULL); + if (ifs->dNameIsUnicode) { + displayName = (*env)->NewString(env, (PWCHAR)ifs->displayName, + (jsize)wcslen ((PWCHAR)ifs->displayName)); + } else { + displayName = (*env)->NewStringUTF(env, ifs->displayName); + } +- if (netifObj == NULL || name == NULL || displayName == NULL) { +- return NULL; +- } ++ CHECK_NULL_RETURN(displayName, NULL); + (*env)->SetObjectField(env, netifObj, ni_nameID, name); + (*env)->SetObjectField(env, netifObj, ni_displayNameID, displayName); + (*env)->SetIntField(env, netifObj, ni_indexID, ifs->index); +@@ -706,24 +706,29 @@ + + /* get the name as a C string */ + name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); ++ if (name_utf != NULL) { + +- /* Search by name */ +- curr = ifList; +- while (curr != NULL) { +- if (strcmp(name_utf, curr->name) == 0) { +- break; ++ /* Search by name */ ++ curr = ifList; ++ while (curr != NULL) { ++ if (strcmp(name_utf, curr->name) == 0) { ++ break; ++ } ++ curr = curr->next; + } +- curr = curr->next; ++ ++ /* if found create a NetworkInterface */ ++ if (curr != NULL) {; ++ netifObj = createNetworkInterface(env, curr, -1, NULL); ++ } ++ ++ /* release the UTF string */ ++ (*env)->ReleaseStringUTFChars(env, name, name_utf); ++ } else { ++ if (!(*env)->ExceptionCheck(env)) ++ JNU_ThrowOutOfMemoryError(env, NULL); + } + +- /* if found create a NetworkInterface */ +- if (curr != NULL) {; +- netifObj = createNetworkInterface(env, curr, -1, NULL); +- } +- +- /* release the UTF string */ +- (*env)->ReleaseStringUTFChars(env, name, name_utf); +- + /* release the interface list */ + free_netif(ifList); + +--- ./jdk/src/windows/native/java/net/net_util_md.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/java/net/net_util_md.c Wed Jul 30 18:42:59 2014 +0100 +@@ -125,8 +125,8 @@ + return TRUE; + } + +-void initLocalAddrTable () {} +-void parseExclusiveBindProperty (JNIEnv *env) {} ++void platformInit() {} ++void parseExclusiveBindProperty(JNIEnv *env) {} + + /* + * Since winsock doesn't have the equivalent of strerror(errno) +--- ./jdk/src/windows/native/java/util/WindowsPreferences.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/java/util/WindowsPreferences.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2002, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -24,8 +24,10 @@ + */ + + #include <stdlib.h> +-#include <jni.h> + #include <windows.h> ++#include "jni.h" ++#include "jni_util.h" ++#include "jvm.h" + #ifdef __cplusplus + extern "C" { + #endif +@@ -37,12 +39,15 @@ + int errorCode=-1; + jintArray result; + str = (*env)->GetByteArrayElements(env, lpSubKey, NULL); ++ CHECK_NULL_RETURN(str, NULL); + errorCode = RegOpenKeyEx((HKEY)hKey, str, 0, securityMask, &handle); + (*env)->ReleaseByteArrayElements(env, lpSubKey, str, 0); + tmp[0]= (int) handle; + tmp[1]= errorCode; + result = (*env)->NewIntArray(env,2); +- (*env)->SetIntArrayRegion(env, result, 0, 2, tmp); ++ if (result != NULL) { ++ (*env)->SetIntArrayRegion(env, result, 0, 2, tmp); ++ } + return result; + } + +@@ -58,8 +63,9 @@ + int tmp[3]; + DWORD lpdwDisposition; + int errorCode; +- jintArray result; ++ jintArray result = NULL; + str = (*env)->GetByteArrayElements(env, lpSubKey, NULL); ++ CHECK_NULL_RETURN(str, NULL); + errorCode = RegCreateKeyEx((HKEY)hKey, str, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_READ, + NULL, &handle, &lpdwDisposition); +@@ -68,7 +74,9 @@ + tmp[1]= errorCode; + tmp[2]= lpdwDisposition; + result = (*env)->NewIntArray(env,3); +- (*env)->SetIntArrayRegion(env, result, 0, 3, tmp); ++ if (result != NULL) { ++ (*env)->SetIntArrayRegion(env, result, 0, 3, tmp); ++ } + return result; + } + +@@ -77,6 +85,7 @@ + char* str; + int result; + str = (*env)->GetByteArrayElements(env, lpSubKey, NULL); ++ CHECK_NULL_RETURN(str, -1); + result = RegDeleteKey((HKEY)hKey, str); + (*env)->ReleaseByteArrayElements(env, lpSubKey, str, 0); + return result; +@@ -96,6 +105,7 @@ + DWORD valueType; + DWORD valueSize; + valueNameStr = (*env)->GetByteArrayElements(env, valueName, NULL); ++ CHECK_NULL_RETURN(valueNameStr, NULL); + if (RegQueryValueEx((HKEY)hKey, valueNameStr, NULL, &valueType, NULL, + &valueSize) != ERROR_SUCCESS) { + (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); +@@ -104,18 +114,26 @@ + + buffer = (char*)malloc(valueSize); + +- if (RegQueryValueEx((HKEY)hKey, valueNameStr, NULL, &valueType, buffer, +- &valueSize) != ERROR_SUCCESS) { +- free(buffer); ++ if (buffer != NULL) { ++ if (RegQueryValueEx((HKEY)hKey, valueNameStr, NULL, &valueType, buffer, ++ &valueSize) != ERROR_SUCCESS) { ++ free(buffer); ++ (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); ++ return NULL; ++ } ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); + (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); +- return NULL; ++ return NULL; + } + + if (valueType == REG_SZ) { +- result = (*env)->NewByteArray(env, valueSize); +- (*env)->SetByteArrayRegion(env, result, 0, valueSize, buffer); ++ result = (*env)->NewByteArray(env, valueSize); ++ if (result != NULL) { ++ (*env)->SetByteArrayRegion(env, result, 0, valueSize, buffer); ++ } + } else { +- result = NULL; ++ result = NULL; + } + free(buffer); + (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); +@@ -135,7 +153,9 @@ + if ((valueName == NULL)||(data == NULL)) {return -1;} + size = (*env)->GetArrayLength(env, data); + dataStr = (*env)->GetByteArrayElements(env, data, NULL); ++ CHECK_NULL_RETURN(dataStr, -1); + valueNameStr = (*env)->GetByteArrayElements(env, valueName, NULL); ++ CHECK_NULL_RETURN(valueNameStr, -1); + error_code = RegSetValueEx((HKEY)hKey, valueNameStr, 0, + REG_SZ, dataStr, size); + (*env)->ReleaseByteArrayElements(env, data, dataStr, 0); +@@ -149,6 +169,7 @@ + int error_code = -1; + if (valueName == NULL) {return -1;} + valueNameStr = (*env)->GetByteArrayElements(env, valueName, NULL); ++ CHECK_NULL_RETURN(valueNameStr, -1); + error_code = RegDeleteValue((HKEY)hKey, valueNameStr); + (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); + return error_code; +@@ -156,7 +177,7 @@ + + JNIEXPORT jintArray JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegQueryInfoKey + (JNIEnv* env, jclass this_class, jint hKey) { +- jintArray result; ++ jintArray result = NULL; + int tmp[5]; + int valuesNumber = -1; + int maxValueNameLength = -1; +@@ -173,7 +194,9 @@ + tmp[3]= maxSubKeyLength; + tmp[4]= maxValueNameLength; + result = (*env)->NewIntArray(env,5); +- (*env)->SetIntArrayRegion(env, result, 0, 5, tmp); ++ if (result != NULL) { ++ (*env)->SetIntArrayRegion(env, result, 0, 5, tmp); ++ } + return result; + } + +@@ -183,13 +206,19 @@ + jbyteArray result; + char* buffer = NULL; + buffer = (char*)malloc(maxKeyLength); ++ if (buffer == NULL) { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ return NULL; ++ } + if (RegEnumKeyEx((HKEY) hKey, subKeyIndex, buffer, &size, NULL, NULL, + NULL, NULL) != ERROR_SUCCESS){ + free(buffer); + return NULL; + } + result = (*env)->NewByteArray(env, size + 1); +- (*env)->SetByteArrayRegion(env, result, 0, size + 1, buffer); ++ if (result != NULL) { ++ (*env)->SetByteArrayRegion(env, result, 0, size + 1, buffer); ++ } + free(buffer); + return result; + } +@@ -201,6 +230,10 @@ + char* buffer = NULL; + int error_code; + buffer = (char*)malloc(maxValueNameLength); ++ if (buffer == NULL) { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ return NULL; ++ } + error_code = RegEnumValue((HKEY) hKey, valueIndex, buffer, + &size, NULL, NULL, NULL, NULL); + if (error_code!= ERROR_SUCCESS){ +@@ -208,7 +241,9 @@ + return NULL; + } + result = (*env)->NewByteArray(env, size + 1); +- (*env)->SetByteArrayRegion(env, result, 0, size + 1, buffer); ++ if (result != NULL) { ++ (*env)->SetByteArrayRegion(env, result, 0, size + 1, buffer); ++ } + free(buffer); + return result; + } +--- ./jdk/src/windows/native/sun/font/fontpath.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/font/fontpath.c Wed Jul 30 18:42:59 2014 +0100 +@@ -152,6 +152,10 @@ + /* printf("FULL=%s\n",lpelfe->elfFullName);fflush(stdout); */ + + fullname = JNU_NewStringPlatform(env, lpelfe->elfFullName); ++ if (fullname == NULL) { ++ (*env)->ExceptionClear(env); ++ return 1; ++ } + fullnameLC = (*env)->CallObjectMethod(env, fullname, + fmi->toLowerCaseMID, fmi->locale); + (*env)->CallBooleanMethod(env, fmi->list, fmi->addMID, fullname); +@@ -242,6 +246,10 @@ + + fullname = (*env)->NewString(env, lpelfe->elfFullName, + (jsize)wcslen((LPWSTR)lpelfe->elfFullName)); ++ if (fullname == NULL) { ++ (*env)->ExceptionClear(env); ++ return 1; ++ } + fullnameLC = (*env)->CallObjectMethod(env, fullname, + fmi->toLowerCaseMID, fmi->locale); + (*env)->CallBooleanMethod(env, fmi->list, fmi->addMID, fullname); +@@ -287,6 +295,10 @@ + return 1; + } + fmi->family = JNU_NewStringPlatform(env,lpelfe->elfLogFont.lfFaceName); ++ if (fmi->family == NULL) { ++ (*env)->ExceptionClear(env); ++ return 1; ++ } + familyLC = (*env)->CallObjectMethod(env, fmi->family, + fmi->toLowerCaseMID, fmi->locale); + /* check if already seen this family with a different charset */ +@@ -296,7 +308,10 @@ + } + fmi->list = (*env)->NewObject(env, + fmi->arrayListClass, fmi->arrayListCtr, 4); +- ++ if (fmi->list == NULL) { ++ (*env)->ExceptionClear(env); ++ return 1; ++ } + (*env)->CallObjectMethod(env, fmi->familyToFontListMap, + fmi->putMID, familyLC, fmi->list); + +@@ -343,6 +358,10 @@ + } + slen = wcslen(lpelfe->elfLogFont.lfFaceName); + fmi->family = (*env)->NewString(env,lpelfe->elfLogFont.lfFaceName, (jsize)slen); ++ if (fmi->family == NULL) { ++ (*env)->ExceptionClear(env); ++ return 1; ++ } + familyLC = (*env)->CallObjectMethod(env, fmi->family, + fmi->toLowerCaseMID, fmi->locale); + /* check if already seen this family with a different charset */ +@@ -352,7 +371,10 @@ + } + fmi->list = (*env)->NewObject(env, + fmi->arrayListClass, fmi->arrayListCtr, 4); +- ++ if (fmi->list == NULL) { ++ (*env)->ExceptionClear(env); ++ return 1; ++ } + (*env)->CallObjectMethod(env, fmi->familyToFontListMap, + fmi->putMID, familyLC, fmi->list); + +@@ -447,6 +469,10 @@ + JNIEnv *env = fmi->env; + size_t dslen = strlen(data); + jstring fileStr = JNU_NewStringPlatform(env, data); ++ if (fileStr == NULL) { ++ (*env)->ExceptionClear(env); ++ return; ++ } + + /* TTC or ttc means it may be a collection. Need to parse out + * multiple font face names separated by " & " +@@ -467,6 +493,10 @@ + ptr1 = ptr2+3; + } + fontStr = JNU_NewStringPlatform(env, ptr1); ++ if (fontStr == NULL) { ++ (*env)->ExceptionClear(env); ++ return; ++ } + fontStr = (*env)->CallObjectMethod(env, fontStr, + fmi->toLowerCaseMID, + fmi->locale); +@@ -481,6 +511,10 @@ + } + } else { + fontStr = JNU_NewStringPlatform(env, name); ++ if (fontStr == NULL) { ++ (*env)->ExceptionClear(env); ++ return; ++ } + fontStr = (*env)->CallObjectMethod(env, fontStr, + fmi->toLowerCaseMID, fmi->locale); + (*env)->CallObjectMethod(env, fontToFileMap, fmi->putMID, +@@ -496,6 +530,10 @@ + JNIEnv *env = fmi->env; + size_t dslen = wcslen(data); + jstring fileStr = (*env)->NewString(env, data, (jsize)dslen); ++ if (fileStr == NULL) { ++ (*env)->ExceptionClear(env); ++ return; ++ } + + /* TTC or ttc means it may be a collection. Need to parse out + * multiple font face names separated by " & " +@@ -517,6 +555,10 @@ + ptr1 = ptr2+3; + } + fontStr = (*env)->NewString(env, ptr1, (jsize)wcslen(ptr1)); ++ if (fontStr == NULL) { ++ (*env)->ExceptionClear(env); ++ return; ++ } + fontStr = (*env)->CallObjectMethod(env, fontStr, + fmi->toLowerCaseMID, + fmi->locale); +@@ -531,6 +573,10 @@ + } + } else { + fontStr = (*env)->NewString(env, name, (jsize)wcslen(name)); ++ if (fontStr == NULL) { ++ (*env)->ExceptionClear(env); ++ return; ++ } + fontStr = (*env)->CallObjectMethod(env, fontStr, + fmi->toLowerCaseMID, fmi->locale); + (*env)->CallObjectMethod(env, fontToFileMap, fmi->putMID, +--- ./jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/java2d/d3d/D3DSurfaceData.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -33,9 +33,16 @@ + #include "awt_BitmapUtil.h" + #include "D3DRenderQueue.h" + ++ + // REMIND: move to awt_Component.h + extern "C" HWND AwtComponent_GetHWnd(JNIEnv *env, jlong pData); + ++/* This looks weird. but since some AWT headers need to be included, ++ * we end up with AWT's alloc.h macro definition of ExceptionOccurred. ++ * The reasons for that re-defintion do not apply to this code, so undef it. ++ */ ++#undef ExceptionOccurred ++ + /** + * Initializes nativeWidth/Height fields of the SurfaceData object with + * dimensions on the native surface. +@@ -55,7 +62,9 @@ + } + + JNU_SetFieldByName(env, NULL, sdObject, "nativeWidth", "I", width); ++ if (!(env->ExceptionOccurred())) { + JNU_SetFieldByName(env, NULL, sdObject, "nativeHeight", "I", height); ++ } + + env->DeleteLocalRef(sdObject); + } +--- ./jdk/src/windows/native/sun/java2d/windows/GDIRenderer.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/java2d/windows/GDIRenderer.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -23,6 +23,7 @@ + * questions. + */ + ++#include "jni_util.h" + #include "awt.h" + #include "sun_java2d_windows_GDIRenderer.h" + #include "java_awt_geom_PathIterator.h" +@@ -387,13 +388,20 @@ + return; + } + +- POINT tmpPts[POLYTEMPSIZE], *pPoints; ++ POINT tmpPts[POLYTEMPSIZE], *pPoints = NULL; ++ + jint *xpoints = (jint *) env->GetPrimitiveArrayCritical(xpointsarray, NULL); +- jint *ypoints = (jint *) env->GetPrimitiveArrayCritical(ypointsarray, NULL); +- pPoints = TransformPoly(xpoints, ypoints, transx, transy, +- tmpPts, &npoints, isclosed, TRUE); +- env->ReleasePrimitiveArrayCritical(xpointsarray, xpoints, JNI_ABORT); +- env->ReleasePrimitiveArrayCritical(ypointsarray, ypoints, JNI_ABORT); ++ ++ if (xpoints != NULL) { ++ jint *ypoints = (jint *) env->GetPrimitiveArrayCritical(ypointsarray, NULL); ++ if (ypoints != NULL) { ++ pPoints = TransformPoly(xpoints, ypoints, transx, transy, ++ tmpPts, &npoints, isclosed, TRUE); ++ env->ReleasePrimitiveArrayCritical(ypointsarray, ypoints, JNI_ABORT); ++ } ++ env->ReleasePrimitiveArrayCritical(xpointsarray, xpoints, JNI_ABORT); ++ } ++ + if (pPoints == NULL) { + return; + } +@@ -654,13 +662,19 @@ + return; + } + +- POINT tmpPts[POLYTEMPSIZE], *pPoints; ++ POINT tmpPts[POLYTEMPSIZE], *pPoints = NULL; ++ + jint *xpoints = (jint *) env->GetPrimitiveArrayCritical(xpointsarray, NULL); +- jint *ypoints = (jint *) env->GetPrimitiveArrayCritical(ypointsarray, NULL); +- pPoints = TransformPoly(xpoints, ypoints, transx, transy, +- tmpPts, &npoints, FALSE, FALSE); +- env->ReleasePrimitiveArrayCritical(xpointsarray, xpoints, JNI_ABORT); +- env->ReleasePrimitiveArrayCritical(ypointsarray, ypoints, JNI_ABORT); ++ if (xpoints != NULL) { ++ jint *ypoints = (jint *) env->GetPrimitiveArrayCritical(ypointsarray, NULL); ++ if (ypoints != NULL) { ++ pPoints = TransformPoly(xpoints, ypoints, transx, transy, ++ tmpPts, &npoints, FALSE, FALSE); ++ env->ReleasePrimitiveArrayCritical(ypointsarray, xpoints, JNI_ABORT); ++ } ++ env->ReleasePrimitiveArrayCritical(xpointsarray, xpoints, JNI_ABORT); ++ } ++ + if (pPoints == NULL) { + return; + } +@@ -720,13 +734,26 @@ + if (hdc == NULL) { + return; + } ++ ++ jbyte *types = (jbyte *) env->GetPrimitiveArrayCritical(typesarray, ++ NULL); ++ if (types == NULL) { ++ wsdo->ReleaseDC(env, wsdo, hdc); ++ return; ++ } ++ ++ jfloat *coords = (jfloat *) env->GetPrimitiveArrayCritical(coordsarray, ++ NULL); ++ if (coords == NULL) { ++ env->ReleasePrimitiveArrayCritical(typesarray, types, JNI_ABORT); ++ wsdo->ReleaseDC(env, wsdo, hdc); ++ return; ++ } ++ + ::SetPolyFillMode(hdc, (rule == java_awt_geom_PathIterator_WIND_NON_ZERO + ? WINDING : ALTERNATE)); + ::BeginPath(hdc); +- jbyte *types = (jbyte *) env->GetPrimitiveArrayCritical(typesarray, +- NULL); +- jfloat *coords = (jfloat *) env->GetPrimitiveArrayCritical(coordsarray, +- NULL); ++ + int index = 0; + BOOL ok = TRUE; + BOOL isempty = TRUE; +--- ./jdk/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -354,17 +354,26 @@ + initThreadInfoIndex(); + + xorCompClass = (jclass)env->NewGlobalRef(XORComp); ++ if (env->ExceptionCheck()) { ++ return; ++ } + + tc = env->FindClass("java/lang/Thread"); + DASSERT(tc != NULL); ++ CHECK_NULL(tc); ++ + threadClass = (jclass)env->NewGlobalRef(tc); + DASSERT(threadClass != NULL); ++ CHECK_NULL(threadClass); ++ + currentThreadMethodID = + env->GetStaticMethodID(threadClass, + "currentThread", "()Ljava/lang/Thread;"); + DASSERT(currentThreadMethodID != NULL); + } + ++#undef ExceptionOccurred ++ + /* + * Class: sun_java2d_windows_GDIWindowSurfaceData + * Method: initOps +@@ -394,6 +403,9 @@ + wsdo->invalid = JNI_FALSE; + wsdo->lockType = WIN32SD_LOCK_UNLOCKED; + wsdo->peer = env->NewWeakGlobalRef(peer); ++ if (env->ExceptionOccurred()) { ++ return; ++ } + wsdo->depth = depth; + wsdo->pixelMasks[0] = redMask; + wsdo->pixelMasks[1] = greenMask; +@@ -997,7 +1009,7 @@ + + ThreadGraphicsInfo *info = GetThreadGraphicsInfo(env, wsdo); + GDIWinSD_InitDC(env, wsdo, info, type, patrop, clip, comp, color); +- return info->hDC; ++ return env->ExceptionCheck() ? (HDC)NULL : info->hDC; + } + + JNIEXPORT void JNICALL +@@ -1056,8 +1068,14 @@ + int topInset = wsdo->insets.top; + Region_StartIteration(env, &clipInfo); + jint numrects = Region_CountIterationRects(&clipInfo); +- RGNDATA *lpRgnData = (RGNDATA *) SAFE_SIZE_STRUCT_ALLOC(safe_Malloc, ++ RGNDATA *lpRgnData; ++ try { ++ lpRgnData = (RGNDATA *) SAFE_SIZE_STRUCT_ALLOC(safe_Malloc, + sizeof(RGNDATAHEADER), numrects, sizeof(RECT)); ++ } catch (std::bad_alloc&) { ++ JNU_ThrowOutOfMemoryError(env, "Initialization of surface region data failed."); ++ return; ++ } + const DWORD nCount = sizeof(RGNDATAHEADER) + numrects * sizeof(RECT); + lpRgnData->rdh.dwSize = sizeof(RGNDATAHEADER); + lpRgnData->rdh.iType = RDH_RECTANGLES; +@@ -1086,6 +1104,9 @@ + env->DeleteWeakGlobalRef(info->clip); + } + info->clip = env->NewWeakGlobalRef(clip); ++ if (env->ExceptionCheck()) { ++ return; ++ } + } + + // init composite +--- ./jdk/src/windows/native/sun/java2d/windows/WindowsFlags.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/java2d/windows/WindowsFlags.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2010, 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,12 +47,15 @@ + { + wFlagsClassID = (jclass)env->NewGlobalRef(wFlagsClass); + d3dEnabledID = env->GetStaticFieldID(wFlagsClass, "d3dEnabled", "Z"); ++ CHECK_NULL(d3dEnabledID); + d3dSetID = env->GetStaticFieldID(wFlagsClass, "d3dSet", "Z"); ++ CHECK_NULL(d3dSetID); + } + + BOOL GetStaticBoolean(JNIEnv *env, jclass wfClass, const char *fieldName) + { + jfieldID fieldID = env->GetStaticFieldID(wfClass, fieldName, "Z"); ++ CHECK_NULL_RETURN(fieldID, FALSE); + return env->GetStaticBooleanField(wfClass, fieldID); + } + +@@ -60,6 +63,7 @@ + const char *signature) + { + jfieldID fieldID = env->GetStaticFieldID(wfClass, fieldName, signature); ++ CHECK_NULL_RETURN(fieldID, NULL); + return env->GetStaticObjectField(wfClass, fieldID); + } + +@@ -90,15 +94,17 @@ + forceD3DUsage = d3dSet; + g_offscreenSharing = GetStaticBoolean(env, wFlagsClass, + "offscreenSharingEnabled"); ++ JNU_CHECK_EXCEPTION(env); + accelReset = GetStaticBoolean(env, wFlagsClass, "accelReset"); ++ JNU_CHECK_EXCEPTION(env); + checkRegistry = GetStaticBoolean(env, wFlagsClass, "checkRegistry"); ++ JNU_CHECK_EXCEPTION(env); + disableRegistry = GetStaticBoolean(env, wFlagsClass, "disableRegistry"); +- jstring javaVersionString = (jstring)GetStaticObject(env, wFlagsClass, +- "javaVersion", +- "Ljava/lang/String;"); ++ JNU_CHECK_EXCEPTION(env); + + setHighDPIAware = + (IS_WINVISTA && GetStaticBoolean(env, wFlagsClass, "setHighDPIAware")); ++ JNU_CHECK_EXCEPTION(env); + + J2dTraceLn(J2D_TRACE_INFO, "WindowsFlags (native):"); + J2dTraceLn1(J2D_TRACE_INFO, " d3dEnabled = %s", +@@ -166,6 +172,7 @@ + jclass wFlagsClass) + { + SetIDs(env, wFlagsClass); ++ JNU_CHECK_EXCEPTION(env); + GetFlagValues(env, wFlagsClass); + } + +--- ./jdk/src/windows/native/sun/net/dns/ResolverConfigurationImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/net/dns/ResolverConfigurationImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -39,6 +39,7 @@ + #define STS_NO_CONFIG 0x0 /* no configuration found */ + #define STS_SL_FOUND 0x1 /* search list found */ + #define STS_NS_FOUND 0x2 /* name servers found */ ++#define STS_ERROR -1 /* error return lodConfig failed memory allccation failure*/ + + #define IS_SL_FOUND(sts) (sts & STS_SL_FOUND) + #define IS_NS_FOUND(sts) (sts & STS_NS_FOUND) +@@ -123,14 +124,14 @@ + size = sizeof(IP_ADAPTER_INFO); + adapterP = (IP_ADAPTER_INFO *)malloc(size); + if (adapterP == NULL) { +- return -1; ++ return STS_ERROR; + } + ret = GetAdaptersInfo(adapterP, &size); + if (ret == ERROR_BUFFER_OVERFLOW) { + IP_ADAPTER_INFO *newAdapterP = (IP_ADAPTER_INFO *)realloc(adapterP, size); + if (newAdapterP == NULL) { + free(adapterP); +- return -1; ++ return STS_ERROR; + } + adapterP = newAdapterP; + +@@ -239,6 +240,7 @@ + { + searchlistID = (*env)->GetStaticFieldID(env, cls, "os_searchlist", + "Ljava/lang/String;"); ++ CHECK_NULL(searchlistID); + nameserversID = (*env)->GetStaticFieldID(env, cls, "os_nameservers", + "Ljava/lang/String;"); + } +@@ -258,16 +260,21 @@ + searchlist[0] = '\0'; + nameservers[0] = '\0'; + +- loadConfig(searchlist, nameservers); ++ if (loadConfig(searchlist, nameservers) != STS_ERROR) { + +- /* +- * Populate static fields in sun.net.DefaultResolverConfiguration +- */ +- obj = (*env)->NewStringUTF(env, searchlist); +- (*env)->SetStaticObjectField(env, cls, searchlistID, obj); ++ /* ++ * Populate static fields in sun.net.DefaultResolverConfiguration ++ */ ++ obj = (*env)->NewStringUTF(env, searchlist); ++ CHECK_NULL(obj); ++ (*env)->SetStaticObjectField(env, cls, searchlistID, obj); + +- obj = (*env)->NewStringUTF(env, nameservers); +- (*env)->SetStaticObjectField(env, cls, nameserversID, obj); ++ obj = (*env)->NewStringUTF(env, nameservers); ++ CHECK_NULL(obj); ++ (*env)->SetStaticObjectField(env, cls, nameserversID, obj); ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ } + } + + +--- ./jdk/src/windows/native/sun/net/www/protocol/http/ntlm/NTLMAuthSequence.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/net/www/protocol/http/ntlm/NTLMAuthSequence.c Wed Jul 30 18:42:59 2014 +0100 +@@ -53,7 +53,9 @@ + (JNIEnv *env, jclass authseq_clazz, jclass status_clazz) + { + ntlm_ctxHandleID = (*env)->GetFieldID(env, authseq_clazz, "ctxHandle", "J"); ++ CHECK_NULL(ntlm_ctxHandleID); + ntlm_crdHandleID = (*env)->GetFieldID(env, authseq_clazz, "crdHandle", "J"); ++ CHECK_NULL(ntlm_crdHandleID); + status_seqCompleteID = (*env)->GetFieldID(env, status_clazz, "sequenceComplete", "Z"); + } + +@@ -100,6 +102,16 @@ + } + } + pCred = (CredHandle *)malloc(sizeof (CredHandle)); ++ if (pCred == NULL) { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ if (pUser != NULL) ++ JNU_ReleaseStringPlatformChars(env, user, pUser); ++ if (pPassword != NULL) ++ JNU_ReleaseStringPlatformChars(env, password, pPassword); ++ if (pDomain != NULL) ++ JNU_ReleaseStringPlatformChars(env, domain, pDomain); ++ return NULL; ++ } + + if ( ((pUser != NULL) || (pPassword != NULL)) || (pDomain != NULL)) { + pAuthId = &AuthId; +@@ -177,7 +189,12 @@ + pCtx = (CtxtHandle *) (*env)->GetLongField (env, this, ntlm_ctxHandleID); + if (pCtx == 0) { /* first call */ + newContext = (CtxtHandle *)malloc(sizeof(CtxtHandle)); +- (*env)->SetLongField (env, this, ntlm_ctxHandleID, (jlong)newContext); ++ if (newContext != NULL) { ++ (*env)->SetLongField (env, this, ntlm_ctxHandleID, (jlong)newContext); ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); ++ return NULL; ++ } + } else { + newContext = pCtx; + } +@@ -198,6 +215,7 @@ + if (lastToken != 0) + { + pInput = (VOID *)(*env)->GetByteArrayElements(env, lastToken, &isCopy); ++ CHECK_NULL_RETURN(pInput, NULL); + inputLen = (*env)->GetArrayLength(env, lastToken); + + InBuffDesc.ulVersion = 0; +@@ -240,8 +258,10 @@ + + if ( OutSecBuff.cbBuffer > 0 ) { + jbyteArray ret = (*env)->NewByteArray(env, OutSecBuff.cbBuffer); +- (*env)->SetByteArrayRegion(env, ret, 0, OutSecBuff.cbBuffer, +- OutSecBuff.pvBuffer); ++ if (ret != NULL) { ++ (*env)->SetByteArrayRegion(env, ret, 0, OutSecBuff.cbBuffer, ++ OutSecBuff.pvBuffer); ++ } + if (lastToken != 0) // 2nd stage + endSequence (pCred, pCtx, env, status); + result = ret; +--- ./jdk/src/windows/native/sun/nio/ch/Net.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/nio/ch/Net.c Wed Jul 30 18:42:59 2014 +0100 +@@ -554,11 +554,11 @@ + FD_ZERO(&rd); + FD_ZERO(&wr); + FD_ZERO(&ex); +- if (events & sun_nio_ch_PollArrayWrapper_POLLIN) { ++ if (events & POLLIN) { + FD_SET(fd, &rd); + } +- if (events & sun_nio_ch_PollArrayWrapper_POLLOUT || +- events & sun_nio_ch_PollArrayWrapper_POLLCONN) { ++ if (events & POLLOUT || ++ events & POLLCONN) { + FD_SET(fd, &wr); + } + FD_SET(fd, &ex); +@@ -572,14 +572,50 @@ + } else if (rv >= 0) { + rv = 0; + if (FD_ISSET(fd, &rd)) { +- rv |= sun_nio_ch_PollArrayWrapper_POLLIN; ++ rv |= POLLIN; + } + if (FD_ISSET(fd, &wr)) { +- rv |= sun_nio_ch_PollArrayWrapper_POLLOUT; ++ rv |= POLLOUT; + } + if (FD_ISSET(fd, &ex)) { +- rv |= sun_nio_ch_PollArrayWrapper_POLLERR; ++ rv |= POLLERR; + } + } + return rv; + } ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollinValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLIN; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_polloutValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLOUT; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollerrValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLERR; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollhupValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLHUP; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollnvalValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLNVAL; ++} ++ ++JNIEXPORT jshort JNICALL ++Java_sun_nio_ch_Net_pollconnValue(JNIEnv *env, jclass this) ++{ ++ return (jshort)POLLCONN; ++} +--- ./jdk/src/windows/native/sun/nio/ch/WindowsSelectorImpl.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/nio/ch/WindowsSelectorImpl.c Wed Jul 30 18:42:59 2014 +0100 +@@ -33,13 +33,15 @@ + #define FD_SETSIZE 1024 + + #include <stdlib.h> ++#include <winsock2.h> ++ + #include "jvm.h" + #include "jni.h" + #include "jni_util.h" + #include "sun_nio_ch_WindowsSelectorImpl.h" + #include "sun_nio_ch_PollArrayWrapper.h" +-#include "winsock2.h" + ++#include "nio_util.h" /* Needed for POLL* constants (includes "winsock2.h") */ + + typedef struct { + jint fd; +@@ -79,12 +81,11 @@ + + /* Set FD_SET structures required for select */ + for (i = 0; i < numfds; i++) { +- if (fds[i].events & sun_nio_ch_PollArrayWrapper_POLLIN) { ++ if (fds[i].events & POLLIN) { + readfds.fd_array[read_count] = fds[i].fd; + read_count++; + } +- if (fds[i].events & (sun_nio_ch_PollArrayWrapper_POLLOUT | +- sun_nio_ch_PollArrayWrapper_POLLCONN)) ++ if (fds[i].events & (POLLOUT | POLLCONN)) + { + writefds.fd_array[write_count] = fds[i].fd; + write_count++; +@@ -110,12 +111,11 @@ + /* prepare select structures for the i-th socket */ + errreadfds.fd_count = 0; + errwritefds.fd_count = 0; +- if (fds[i].events & sun_nio_ch_PollArrayWrapper_POLLIN) { ++ if (fds[i].events & POLLIN) { + errreadfds.fd_array[0] = fds[i].fd; + errreadfds.fd_count = 1; + } +- if (fds[i].events & (sun_nio_ch_PollArrayWrapper_POLLOUT | +- sun_nio_ch_PollArrayWrapper_POLLCONN)) ++ if (fds[i].events & (POLLOUT | POLLCONN)) + { + errwritefds.fd_array[0] = fds[i].fd; + errwritefds.fd_count = 1; +--- ./jdk/src/windows/native/sun/nio/ch/nio_util.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/nio/ch/nio_util.h Wed Jul 30 18:42:59 2014 +0100 +@@ -23,6 +23,8 @@ + * questions. + */ + ++#include <winsock2.h> ++ + #include "jni.h" + + /** +@@ -55,3 +57,19 @@ + }; + + #endif ++ ++#ifndef POLLIN ++ /* WSAPoll()/WSAPOLLFD and the corresponding constants are only defined */ ++ /* in Windows Vista / Windows Server 2008 and later. If we are on an */ ++ /* older release we just use the Solaris constants as this was previously */ ++ /* done in PollArrayWrapper.java. */ ++ #define POLLIN 0x0001 ++ #define POLLOUT 0x0004 ++ #define POLLERR 0x0008 ++ #define POLLHUP 0x0010 ++ #define POLLNVAL 0x0020 ++ #define POLLCONN 0x0002 ++#else ++ /* POLLCONN must not equal any of the other constants (see winsock2.h). */ ++ #define POLLCONN 0x2000 ++#endif +--- ./jdk/src/windows/native/sun/nio/fs/WindowsNativeDispatcher.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/nio/fs/WindowsNativeDispatcher.c Wed Jul 30 18:42:59 2014 +0100 +@@ -1118,11 +1118,13 @@ + JNU_ThrowInternalError(env, "GetFullPathNameW failed"); + } + free(lpBuf); ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failure"); + } + } ++ } else { ++ throwWindowsException(env, GetLastError()); + } +- if (len == 0) +- throwWindowsException(env, GetLastError()); + + return rv; + } +@@ -1157,13 +1159,13 @@ + JNU_ThrowInternalError(env, "GetFinalPathNameByHandleW failed"); + } + free(lpBuf); ++ } else { ++ JNU_ThrowOutOfMemoryError(env, "native memory allocation failure"); + } + } ++ } else { ++ throwWindowsException(env, GetLastError()); + } +- +- if (len == 0) +- throwWindowsException(env, GetLastError()); +- + return rv; + } + +--- ./jdk/src/windows/native/sun/security/krb5/NativeCreds.c Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/security/krb5/NativeCreds.c Wed Jul 30 18:42:59 2014 +0100 +@@ -388,7 +388,7 @@ + jobject ticketFlags, startTime, endTime, krbCreds = NULL; + jobject authTime, renewTillTime, hostAddresses = NULL; + KERB_EXTERNAL_TICKET *msticket; +- int found_in_cache = 0; ++ int found = 0; + FILETIME Now, EndTime, LocalEndTime; + + int i, netypes; +@@ -476,7 +476,7 @@ + if (CompareFileTime(&Now, &LocalEndTime) < 0) { + for (i=0; i<netypes; i++) { + if (etypes[i] == msticket->SessionKey.KeyType) { +- found_in_cache = 1; ++ found = 1; + if (native_debug) { + printf("LSA: Valid etype found: %d\n", etypes[i]); + } +@@ -486,7 +486,7 @@ + } + } + +- if (!found_in_cache) { ++ if (!found) { + if (native_debug) { + printf("LSA: MS TGT in cache is invalid/not supported; request new ticket\n"); + } +@@ -529,6 +529,14 @@ + + // got the native MS Kerberos TGT + msticket = &(pTicketResponse->Ticket); ++ ++ if (msticket->SessionKey.KeyType != etypes[i]) { ++ if (native_debug) { ++ printf("LSA: Response etype is %d for %d. Retry.\n", msticket->SessionKey.KeyType, etypes[i]); ++ } ++ continue; ++ } ++ found = 1; + break; + } + } +@@ -583,6 +591,10 @@ + } KERB_CRYPTO_KEY, *PKERB_CRYPTO_KEY; + + */ ++ if (!found) { ++ break; ++ } ++ + // Build a com.sun.security.krb5.Ticket + ticket = BuildTicket(env, msticket->EncodedTicket, + msticket->EncodedTicketSize); +--- ./jdk/src/windows/native/sun/windows/MouseInfo.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/MouseInfo.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2005, 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 +@@ -95,7 +95,9 @@ + env->DeleteLocalRef(pointClassLocal); + } + xID = env->GetFieldID(pointClass, "x", "I"); ++ CHECK_NULL_RETURN(xID, (jint)0); + yID = env->GetFieldID(pointClass, "y", "I"); ++ CHECK_NULL_RETURN(yID, (jint)0); + env->SetIntField(point, xID, pt.x); + env->SetIntField(point, yID, pt.y); + +--- ./jdk/src/windows/native/sun/windows/ShellFolder2.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/ShellFolder2.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -219,10 +219,15 @@ + return; + } + MID_pIShellFolder = env->GetMethodID(cls, "setIShellFolder", "(J)V"); ++ CHECK_NULL(MID_pIShellFolder); + FID_pIShellIcon = env->GetFieldID(cls, "pIShellIcon", "J"); ++ CHECK_NULL(FID_pIShellIcon); + MID_relativePIDL = env->GetMethodID(cls, "setRelativePIDL", "(J)V"); ++ CHECK_NULL(MID_relativePIDL); + FID_displayName = env->GetFieldID(cls, "displayName", "Ljava/lang/String;"); ++ CHECK_NULL(FID_displayName); + FID_folderType = env->GetFieldID(cls, "folderType", "Ljava/lang/String;"); ++ CHECK_NULL(FID_folderType); + } + + +@@ -719,8 +724,9 @@ + // Get relative PIDL for name + LPITEMIDLIST pIDL; + int nLength = env->GetStringLength(jname); ++ const jchar* strPath = env->GetStringChars(jname, NULL); ++ JNU_CHECK_EXCEPTION_RETURN(env, 0); + jchar* wszPath = new jchar[nLength + 1]; +- const jchar* strPath = env->GetStringChars(jname, NULL); + wcsncpy(reinterpret_cast<LPWSTR>(wszPath), reinterpret_cast<LPCWSTR>(strPath), nLength); + wszPath[nLength] = 0; + HRESULT res = pIShellFolder->ParseDisplayName(NULL, NULL, +@@ -811,6 +817,7 @@ + HICON hIcon = NULL; + SHFILEINFO fileInfo; + LPCTSTR pathStr = JNU_GetStringPlatformChars(env, absolutePath, NULL); ++ JNU_CHECK_EXCEPTION_RETURN(env, 0); + if (fn_SHGetFileInfo(pathStr, 0L, &fileInfo, sizeof(fileInfo), + SHGFI_ICON | (getLargeIcon ? 0 : SHGFI_SMALLICON)) != 0) { + hIcon = fileInfo.hIcon; +@@ -954,9 +961,11 @@ + ReleaseDC(NULL, dc); + // Create java array + iconBits = env->NewIntArray(nBits); ++ if (!(env->ExceptionCheck())) { + // Copy values to java array + env->SetIntArrayRegion(iconBits, 0, nBits, colorBits); + } ++ } + // Fix 4745575 GDI Resource Leak + // MSDN + // GetIconInfo creates bitmaps for the hbmMask and hbmColor members of ICONINFO. +@@ -1028,6 +1037,7 @@ + jint cxDesired, jint cyDesired, jboolean useVGAColors) + { + const char *pLibName = env->GetStringUTFChars(libName, NULL); ++ JNU_CHECK_EXCEPTION_RETURN(env, 0); + HINSTANCE libHandle = (HINSTANCE)JDK_LoadSystemLibrary(pLibName); + if (libHandle != NULL) { + UINT fuLoad = (useVGAColors && !IS_WINXP) ? LR_VGACOLOR : 0; +@@ -1046,8 +1056,11 @@ + jclass *pClass, jmethodID *pConstructor, + SHELLDETAILS *psd, ULONG visible) + { ++ jstring str = jstringFromSTRRET(pEnv, NULL, &(psd->str)); ++ JNU_CHECK_EXCEPTION_RETURN(pEnv, NULL); ++ + return pEnv->NewObject(*pClass, *pConstructor, +- jstringFromSTRRET(pEnv, NULL, &(psd->str)), ++ str, + (jint)(psd->cxChar * 6), // TODO: is 6 OK for converting chars to pixels? + (jint)psd->fmt, (jboolean) visible); + } +@@ -1115,6 +1128,10 @@ + jobject column = CreateColumnInfo(env, + &columnClass, &columnConstructor, + &sd, csFlags & SHCOLSTATE_ONBYDEFAULT); ++ if(!column){ ++ pIShellFolder2->Release(); ++ return NULL; ++ } + env->SetObjectArrayElement(columns, (jsize) colNum, column); + } + } +@@ -1155,6 +1172,10 @@ + jobject column = CreateColumnInfo(env, + &columnClass, &columnConstructor, + &sd, 1); ++ if(!column){ ++ pIShellDetails->Release(); ++ return NULL; ++ } + env->SetObjectArrayElement(columns, (jsize) colNum++, column); + } + } +--- ./jdk/src/windows/native/sun/windows/ThemeReader.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/ThemeReader.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -233,7 +233,7 @@ + Themed = InitThemes(); + TryLoadingThemeLib = TRUE; + } +- return Themed; ++ return JNI_IS_TRUE(Themed); + } + + +@@ -271,6 +271,10 @@ + (JNIEnv *env, jclass klass, jstring widget) { + + LPCTSTR str = (LPCTSTR) JNU_GetStringPlatformChars(env, widget, NULL); ++ if (str == NULL) { ++ JNU_ThrowOutOfMemoryError(env, 0); ++ return 0; ++ } + // We need to open the Theme on a Window that will stick around. + // The best one for that purpose is the Toolkit window. + HTHEME htheme = OpenThemeData(AwtToolkit::GetInstance().GetHWnd(), str); +@@ -485,6 +489,7 @@ + + if (insetsClassID == NULL) { + jclass insetsClassIDLocal = env->FindClass("java/awt/Insets"); ++ CHECK_NULL_RETURN(insetsClassIDLocal, NULL); + insetsClassID = (jclass)env->NewGlobalRef(insetsClassIDLocal); + env->DeleteLocalRef(insetsClassIDLocal); + } +@@ -533,7 +538,7 @@ + JNIEXPORT jboolean JNICALL Java_sun_awt_windows_ThemeReader_isThemePartDefined + (JNIEnv *env, jclass klass, jlong theme, jint part, jint state) { + HTHEME hTheme = (HTHEME) theme; +- return IsThemePartDefined(hTheme, part, state); ++ return JNI_IS_TRUE(IsThemePartDefined(hTheme, part, state)); + } + + /* +@@ -562,12 +567,14 @@ + + if (colorClassID == NULL) { + jclass colorClassIDLocal = env->FindClass("java/awt/Color"); ++ CHECK_NULL_RETURN(colorClassIDLocal, NULL); + colorClassID = (jclass)env->NewGlobalRef(colorClassIDLocal); + env->DeleteLocalRef(colorClassIDLocal); + } + + if (colorMID == NULL) { + colorMID = env->GetMethodID(colorClassID, "<init>", "(III)V"); ++ CHECK_NULL_RETURN(colorMID, NULL); + } + jobject colorObj = env->NewObject(colorClassID, + colorMID, GetRValue(color), GetGValue(color),GetBValue(color)); +@@ -628,7 +635,7 @@ + HRESULT hres = GetThemeBool(hTheme, part, state, prop, &retVal); + assert_result(hres, env); + } +- return retVal; ++ return JNI_IS_TRUE(retVal); + } + + /* +@@ -640,15 +647,11 @@ + (JNIEnv *env, jclass klass, jlong theme, jint prop) { + HTHEME hTheme = (HTHEME)theme; + if (hTheme != NULL) { +- return GetThemeSysBool(hTheme, prop); ++ return JNI_IS_TRUE(GetThemeSysBool(hTheme, prop)); + } +- return FALSE; ++ return JNI_FALSE; + } + +- +- +- +- + /* + * Class: sun_awt_windows_ThemeReader + * Method: getPoint +@@ -673,12 +676,14 @@ + + if (pointClassID == NULL) { + jclass pointClassIDLocal = env->FindClass("java/awt/Point"); ++ CHECK_NULL_RETURN(pointClassIDLocal, NULL); + pointClassID = (jclass)env->NewGlobalRef(pointClassIDLocal); + env->DeleteLocalRef(pointClassIDLocal); + } + + if (pointMID == NULL) { + pointMID = env->GetMethodID(pointClassID, "<init>", "(II)V"); ++ CHECK_NULL_RETURN(pointMID, NULL); + } + jobject pointObj = env->NewObject(pointClassID, pointMID, point.x, point.y); + +@@ -720,11 +725,13 @@ + static jclass dimClassID = NULL; + if (dimClassID == NULL) { + jclass dimClassIDLocal = env->FindClass("java/awt/Dimension"); ++ CHECK_NULL_RETURN(dimClassIDLocal, NULL); + dimClassID = (jclass)env->NewGlobalRef(dimClassIDLocal); + env->DeleteLocalRef(dimClassIDLocal); + } + if (dimMID == NULL) { + dimMID = env->GetMethodID(dimClassID, "<init>", "(II)V"); ++ CHECK_NULL_RETURN(dimMID, NULL); + } + jobject dimObj = env->NewObject(dimClassID, dimMID, point.x, point.y); + +@@ -755,11 +762,13 @@ + static jclass dimClassID = NULL; + if (dimClassID == NULL) { + jclass dimClassIDLocal = env->FindClass("java/awt/Dimension"); ++ CHECK_NULL_RETURN(dimClassIDLocal, NULL); + dimClassID = (jclass)env->NewGlobalRef(dimClassIDLocal); + env->DeleteLocalRef(dimClassIDLocal); + } + if (dimMID == NULL) { + dimMID = env->GetMethodID(dimClassID, "<init>", "(II)V"); ++ CHECK_NULL_RETURN(dimMID, NULL); + } + jobject dimObj = env->NewObject(dimClassID, dimMID, size.cx, size.cy); + if (safe_ExceptionOccurred(env)) { +--- ./jdk/src/windows/native/sun/windows/WPrinterJob.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/WPrinterJob.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -130,6 +130,9 @@ + + jstring utf_str; + jclass clazz = env->FindClass("java/lang/String"); ++ if (clazz == NULL) { ++ return NULL; ++ } + jobjectArray nameArray; + + try { +@@ -240,6 +243,9 @@ + + LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, + printer, NULL); ++ if (printerName == NULL) { ++ return NULL; ++ } + + jfloatArray printableArray = NULL; + +@@ -262,7 +268,7 @@ + if (pDevMode != NULL) { + ::GlobalFree(pDevMode); + } +- ++ DeleteDC(pdc); + ::ClosePrinter(hPrinter); + JNU_ReleaseStringPlatformChars(env, printer, printerName); + return printableArray; +@@ -283,25 +289,21 @@ + int resy = GetDeviceCaps(pdc, LOGPIXELSY); + + printableArray=env->NewFloatArray(4); +- if (printableArray == NULL) { +- throw std::bad_alloc(); ++ if (printableArray != NULL) { ++ jfloat *iPrintables = ++ env->GetFloatArrayElements(printableArray, NULL); ++ if (iPrintables != NULL) { ++ iPrintables[0] = (float)left/resx; ++ iPrintables[1] = (float)top/resy; ++ iPrintables[2] = (float)width/resx; ++ iPrintables[3] = (float)height/resy; ++ env->ReleaseFloatArrayElements(printableArray, iPrintables, 0); ++ } + } +- jboolean isCopy; +- jfloat *iPrintables = env->GetFloatArrayElements(printableArray, +- &isCopy), +- *savePrintables = iPrintables; +- +- iPrintables[0] = (float)left/resx; +- iPrintables[1] = (float)top/resy; +- iPrintables[2] = (float)width/resx; +- iPrintables[3] = (float)height/resy; +- +- env->ReleaseFloatArrayElements(printableArray, savePrintables, 0); +- + GlobalFree(pDevMode); ++ DeleteDC(pdc); + } + +- DeleteDC(pdc); + JNU_ReleaseStringPlatformChars(env, printer, printerName); + + return printableArray; +@@ -309,6 +311,60 @@ + CATCH_BAD_ALLOC_RET(NULL); + } + ++jintArray getIDs(JNIEnv *env, jstring printer, jstring port, int dm_id) ++{ ++ ++ LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); ++ LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); ++ ++ if (printerName == NULL || printerPort == NULL) { ++ if (printerName != NULL) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ } ++ if (printerPort != NULL) { ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ } ++ return NULL; ++ } ++ ++ SAVE_CONTROLWORD ++ int numIDs = ::DeviceCapabilities(printerName, printerPort, dm_id, ++ NULL, NULL); ++ RESTORE_CONTROLWORD ++ ++ jintArray idArray = NULL; ++ if (numIDs > 0) { ++ idArray = env->NewIntArray(numIDs); ++ if (idArray != NULL) { ++ jint *jpcIndices = env->GetIntArrayElements(idArray, NULL); ++ if (jpcIndices != NULL) { ++ jint *saveFormats = jpcIndices; ++ LPTSTR buf = NULL; ++ try { ++ buf = (LPTSTR)new char[numIDs * sizeof(WORD)]; ++ } catch (std::bad_alloc&) { ++ buf = NULL; ++ } ++ if (buf != NULL) { ++ if (::DeviceCapabilities(printerName, printerPort, ++ dm_id, buf, NULL) != -1) { ++ WORD *id = (WORD *)buf; ++ for (int i = 0; i < numIDs; i++, id++) { ++ jpcIndices[i] = *id; ++ } ++ } ++ RESTORE_CONTROLWORD ++ delete[] buf; ++ } ++ env->ReleaseIntArrayElements(idArray, saveFormats, 0); ++ } ++ } ++ } ++ ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ return idArray; ++} + + JNIEXPORT jintArray JNICALL + Java_sun_print_Win32PrintService_getAllMediaIDs(JNIEnv *env, +@@ -316,45 +372,7 @@ + jstring printer, + jstring port) + { +- TRY; +- +- LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); +- LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); +- jintArray mediasizeArray = NULL; +- +- SAVE_CONTROLWORD +- int numSizes = ::DeviceCapabilities(printerName, printerPort, +- DC_PAPERS, NULL, NULL); +- RESTORE_CONTROLWORD +- +- if (numSizes > 0) { +- +- mediasizeArray = env->NewIntArray(numSizes); +- if (mediasizeArray == NULL) { +- throw std::bad_alloc(); +- } +- +- jboolean isCopy; +- jint *jpcIndices = env->GetIntArrayElements(mediasizeArray, +- &isCopy), *saveFormats = jpcIndices; +- LPTSTR papersBuf = (LPTSTR)new char[numSizes * sizeof(WORD)]; +- if (::DeviceCapabilities(printerName, printerPort, +- DC_PAPERS, papersBuf, NULL) != -1) { +- RESTORE_CONTROLWORD +- WORD *pDmPaperSize = (WORD *)papersBuf; +- for (int i = 0; i < numSizes; i++, pDmPaperSize++) { +- jpcIndices[i] = *pDmPaperSize; +- } +- } +- delete[] papersBuf; +- env->ReleaseIntArrayElements(mediasizeArray, saveFormats, 0); +- } +- +- JNU_ReleaseStringPlatformChars(env, printer, printerName); +- JNU_ReleaseStringPlatformChars(env, port, printerPort); +- return mediasizeArray; +- +- CATCH_BAD_ALLOC_RET(NULL); ++ return getIDs(env, printer, port, DC_PAPERS); + } + + +@@ -364,47 +382,7 @@ + jstring printer, + jstring port) + { +- TRY; +- +- LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, +- printer, NULL); +- LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); +- +- jintArray mediaTrayArray = NULL; +- +- SAVE_CONTROLWORD +- int nBins = ::DeviceCapabilities(printerName, printerPort, +- DC_BINS, NULL, NULL) ; +- RESTORE_CONTROLWORD +- if (nBins > 0) { +- mediaTrayArray = env->NewIntArray(nBins); +- if (mediaTrayArray == NULL) { +- throw std::bad_alloc(); +- } +- +- jboolean isCopy; +- jint *jpcIndices = env->GetIntArrayElements(mediaTrayArray, +- &isCopy), *saveFormats = jpcIndices; +- +- LPTSTR buf = (LPTSTR)new char[nBins * sizeof(WORD)]; +- +- if (::DeviceCapabilities(printerName, printerPort, +- DC_BINS, buf, NULL) != -1) { +- RESTORE_CONTROLWORD +- WORD *pBins = (WORD *)buf; +- for (int i = 0; i < nBins; i++) { +- jpcIndices[i] = *(pBins+i); +- } +- } +- delete[] buf; +- env->ReleaseIntArrayElements(mediaTrayArray, saveFormats, 0); +- } +- +- JNU_ReleaseStringPlatformChars(env, printer, printerName); +- JNU_ReleaseStringPlatformChars(env, port, printerPort); +- return mediaTrayArray; +- +- CATCH_BAD_ALLOC_RET(NULL); ++ return getIDs(env, printer, port, DC_BINS); + } + + +@@ -414,100 +392,139 @@ + jstring printer, + jstring port) + { +- TRY; +- +- LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, +- printer, NULL); ++ LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); + LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); + +- jintArray mediaArray = NULL; ++ if (printerName == NULL || printerPort == NULL) { ++ if (printerName != NULL) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ } ++ if (printerPort != NULL) { ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ } ++ return NULL; ++ } + + SAVE_CONTROLWORD +- int nPapers = ::DeviceCapabilities(printerName, printerPort, +- DC_PAPERSIZE, NULL, NULL) ; ++ int nPapers = ::DeviceCapabilities(printerName, printerPort, DC_PAPERSIZE, ++ NULL, NULL) ; + RESTORE_CONTROLWORD ++ ++ jintArray mediaArray = NULL; ++ jint *saveFormats = NULL; ++ + if (nPapers > 0) { +- mediaArray = env->NewIntArray(nPapers*2); +- if (mediaArray == NULL) { +- throw std::bad_alloc(); +- } +- +- jboolean isCopy; +- jint *jpcIndices = env->GetIntArrayElements(mediaArray, +- &isCopy), *saveFormats = jpcIndices; +- +- LPTSTR buf = (LPTSTR)new char[nPapers * sizeof(POINT)]; // array of POINTs +- +- if (::DeviceCapabilities(printerName, printerPort, +- DC_PAPERSIZE, buf, NULL) != -1) { +- +- POINT *pDim = (POINT *)buf; +- for (int i = 0; i < nPapers; i++) { +- jpcIndices[i*2] = (pDim+i)->x; +- jpcIndices[i*2+1] = (pDim+i)->y; ++ mediaArray = env->NewIntArray(nPapers*2); ++ if (mediaArray != NULL) { ++ jint *jpcIndices = env->GetIntArrayElements(mediaArray, NULL); ++ if (jpcIndices != NULL) { ++ saveFormats = jpcIndices; ++ LPTSTR buf = NULL; ++ try { ++ buf = (LPTSTR)new char[nPapers * sizeof(POINT)]; ++ } catch (std::bad_alloc&) { ++ buf = NULL; ++ } ++ if (buf != NULL) { ++ if (::DeviceCapabilities(printerName, printerPort, ++ DC_PAPERSIZE, buf, NULL) != -1) { ++ POINT *pDim = (POINT *)buf; ++ for (int i = 0; i < nPapers; i++) { ++ jpcIndices[i*2] = (pDim+i)->x; ++ jpcIndices[i*2+1] = (pDim+i)->y; ++ } ++ } ++ RESTORE_CONTROLWORD ++ delete[] buf; ++ } ++ env->ReleaseIntArrayElements(mediaArray, saveFormats, 0); ++ saveFormats = NULL; ++ } + } +- } +- RESTORE_CONTROLWORD +- delete[] buf; +- env->ReleaseIntArrayElements(mediaArray, saveFormats, 0); + } + + JNU_ReleaseStringPlatformChars(env, printer, printerName); + JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ if (mediaArray != NULL && saveFormats != NULL) { ++ env->ReleaseIntArrayElements(mediaArray, saveFormats, 0); ++ } + return mediaArray; + +- CATCH_BAD_ALLOC_RET(NULL); + } + + + jobjectArray getAllDCNames(JNIEnv *env, jobject peer, jstring printer, + jstring port, unsigned int dc_id, unsigned int buf_len) + { +- TRY; + +- LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, +- printer, NULL); ++ LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); + LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); + ++ if (printerName == NULL || printerPort == NULL) { ++ if (printerName != NULL) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ } ++ if (printerPort != NULL) { ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ } ++ return NULL; ++ } ++ + jstring utf_str; +- jclass cls = env->FindClass("java/lang/String"); +- jobjectArray names= NULL; ++ jobjectArray names = NULL; + LPTSTR buf = NULL; + SAVE_CONTROLWORD + int cReturned = ::DeviceCapabilities(printerName, printerPort, + dc_id, NULL, NULL); + RESTORE_CONTROLWORD ++ if (cReturned <= 0) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ return NULL; ++ } ++ ++ try { ++ buf = (LPTSTR)new char[cReturned * buf_len * sizeof(TCHAR)]; ++ } catch (std::bad_alloc&) { ++ buf = NULL; ++ } ++ if (buf == NULL) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); ++ return NULL; ++ } ++ ++ cReturned = ::DeviceCapabilities(printerName, printerPort, ++ dc_id, buf, NULL); ++ RESTORE_CONTROLWORD ++ ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ + if (cReturned > 0) { +- +- buf = (LPTSTR)new char[cReturned * buf_len * sizeof(TCHAR)]; +- if (buf == NULL) { +- throw std::bad_alloc(); +- } +- +- cReturned = ::DeviceCapabilities(printerName, printerPort, +- dc_id, buf, NULL); +- RESTORE_CONTROLWORD +- +- if (cReturned > 0) { +- names = env->NewObjectArray(cReturned, cls, NULL); +- if (names == NULL) { +- throw std::bad_alloc(); ++ jclass cls = env->FindClass("java/lang/String"); ++ if (cls != NULL) { ++ names = env->NewObjectArray(cReturned, cls, NULL); ++ } ++ if (names == NULL || cls == NULL) { ++ delete buf; ++ return names; + } + + for (int i = 0; i < cReturned; i++) { +- utf_str = JNU_NewStringPlatform(env, buf+(buf_len*i)); +- if (utf_str == NULL) { +- throw std::bad_alloc(); ++ utf_str = JNU_NewStringPlatform(env, buf+(buf_len*i)); ++ if (utf_str == NULL) { ++ delete buf; ++ return names; ++ } ++ env->SetObjectArrayElement(names, i, utf_str); ++ env->DeleteLocalRef(utf_str); + } +- env->SetObjectArrayElement(names, i, utf_str); +- env->DeleteLocalRef(utf_str); +- } + } + delete[] buf; +- } +- return names; ++ return names; + +- CATCH_BAD_ALLOC_RET(NULL); + } + + +@@ -540,6 +557,16 @@ + LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); + LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); + ++ if (printerName == NULL || printerPort == NULL) { ++ if (printerName != NULL) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ } ++ if (printerPort != NULL) { ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ } ++ return 1; ++ } ++ + SAVE_CONTROLWORD + int numCopies = ::DeviceCapabilities(printerName, printerPort, + DC_COPIES, NULL, NULL); +@@ -573,48 +600,58 @@ + jstring printer, + jstring port) + { +- TRY; +- + LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); + LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); + +- jintArray resolutionArray = NULL; ++ if (printerName == NULL || printerPort == NULL) { ++ if (printerName != NULL) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ } ++ if (printerPort != NULL) { ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ } ++ return NULL; ++ } + + SAVE_CONTROLWORD + int nResolutions = ::DeviceCapabilities(printerName, printerPort, + DC_ENUMRESOLUTIONS, NULL, NULL); + RESTORE_CONTROLWORD ++ ++ jintArray resolutionArray = NULL; + if (nResolutions > 0) { + resolutionArray = env->NewIntArray(nResolutions*2); +- if (resolutionArray == NULL) { +- throw std::bad_alloc(); ++ if (resolutionArray != NULL) { ++ jint *jpcIndices = env->GetIntArrayElements(resolutionArray, NULL); ++ if (jpcIndices != NULL) { ++ jint *saveFormats = jpcIndices; ++ LPTSTR resBuf = NULL; ++ try { ++ resBuf = (LPTSTR)new char[nResolutions * sizeof(LONG) * 2]; ++ } catch (std::bad_alloc&) { ++ resBuf = NULL; ++ } ++ if (resBuf != NULL) { ++ if (::DeviceCapabilities(printerName, printerPort, ++ DC_ENUMRESOLUTIONS, resBuf, ++ NULL) != -1) { ++ LONG *pResolution = (LONG *)resBuf; ++ for (int i = 0; i < nResolutions; i++) { ++ jpcIndices[i*2] = *pResolution++; ++ jpcIndices[i*2+1] = *pResolution++; ++ } ++ } ++ RESTORE_CONTROLWORD ++ delete[] resBuf; ++ } ++ env->ReleaseIntArrayElements(resolutionArray, saveFormats, 0); ++ } + } +- +- jboolean isCopy; +- jint *jpcIndices = env->GetIntArrayElements(resolutionArray, +- &isCopy), *saveFormats = jpcIndices; +- +- LPTSTR resBuf = (LPTSTR)new char[nResolutions * sizeof(LONG) * 2]; // pairs of long +- +- if (::DeviceCapabilities(printerName, printerPort, +- DC_ENUMRESOLUTIONS, resBuf, NULL) != -1) { +- +- LONG *pResolution = (LONG *)resBuf; +- for (int i = 0; i < nResolutions; i++) { +- jpcIndices[i*2] = *pResolution++; +- jpcIndices[i*2+1] = *pResolution++; +- } +- } +- RESTORE_CONTROLWORD +- delete[] resBuf; +- env->ReleaseIntArrayElements(resolutionArray, saveFormats, 0); + } + + JNU_ReleaseStringPlatformChars(env, printer, printerName); + JNU_ReleaseStringPlatformChars(env, printer, printerPort); + return resolutionArray; +- +- CATCH_BAD_ALLOC_RET(NULL); + } + + +@@ -672,6 +709,7 @@ + } catch (std::bad_alloc&) { + delete [] buffer; + JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); ++ return NULL; + } + + if (printerPort == NULL) { +@@ -692,6 +730,17 @@ + { + LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); + LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); ++ ++ if (printerName == NULL || printerPort == NULL) { ++ if (printerName != NULL) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ } ++ if (printerPort != NULL) { ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ } ++ return NULL; ++ } ++ + // 0x1000 is a flag to indicate that getCapabilities has already been called. + // 0x0001 is a flag for color support and supported is the default. + jint ret = 0x1001; +@@ -761,28 +810,41 @@ + HANDLE hPrinter; + LPDEVMODE pDevMode = NULL; + +- TRY; +- + LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); + LPTSTR printerPort = (LPTSTR)JNU_GetStringPlatformChars(env, port, NULL); + +- jintArray defaultArray = env->NewIntArray(NDEFAULT); +- if (defaultArray == NULL) { +- throw std::bad_alloc(); ++ if (printerName == NULL || printerPort == NULL) { ++ if (printerName != NULL) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ } ++ if (printerPort != NULL) { ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ } ++ return NULL; + } + +- jboolean isCopy; +- jint *defIndices = env->GetIntArrayElements(defaultArray, +- &isCopy), *saveFormats = defIndices; ++ jint* defIndices = NULL; ++ jintArray defaultArray = env->NewIntArray(NDEFAULT); ++ if (defaultArray != NULL) { ++ defIndices = env->GetIntArrayElements(defaultArray, NULL); ++ } ++ if (defIndices == NULL) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); ++ return NULL; ++ } + +- for (int i=0; i<NDEFAULT; i++) { +- defIndices[i]=GETDEFAULT_ERROR; ++ jint *saveFormats = defIndices; ++ ++ for (int i=0; i < NDEFAULT; i++) { ++ defIndices[i] = GETDEFAULT_ERROR; + } + + /* Start by opening the printer */ + if (!::OpenPrinter(printerName, &hPrinter, NULL)) { + env->ReleaseIntArrayElements(defaultArray, saveFormats, 0); + JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); + return defaultArray; + } + +@@ -794,6 +856,7 @@ + ::ClosePrinter(hPrinter); + env->ReleaseIntArrayElements(defaultArray, saveFormats, 0); + JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ JNU_ReleaseStringPlatformChars(env, port, printerPort); + return defaultArray; + } + +@@ -863,7 +926,6 @@ + defIndices[8] = pDevMode->dmColor; + } + +- + GlobalFree(pDevMode); + ::ClosePrinter(hPrinter); + +@@ -873,8 +935,6 @@ + JNU_ReleaseStringPlatformChars(env, port, printerPort); + + return defaultArray; +- +- CATCH_BAD_ALLOC_RET(NULL); + } + + +@@ -891,6 +951,9 @@ + int ret=0; + + LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); ++ if (printerName == NULL) { ++ return -1; ++ } + + // Start by opening the printer + if (!::OpenPrinter(printerName, &hPrinter, NULL)) { +@@ -959,13 +1022,15 @@ + jclass myClass = env->GetObjectClass(self); + jfieldID fieldId = env->GetFieldID(myClass, fieldName, "J"); + DASSERT(fieldId != 0); +- + return fieldId; + } + + + static inline HANDLE getHPrinter(JNIEnv *env, jobject self) { + jfieldID fieldId = getIdOfLongField(env, self, HPRINTER_STR); ++ if (fieldId == (jfieldID)0) { ++ return (HANDLE)NULL; ++ } + return (HANDLE)(env->GetLongField(self, fieldId)); + } + +@@ -979,6 +1044,9 @@ + HANDLE hPrinter; + DOC_INFO_1 DocInfo; + LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); ++ if (printerName == NULL) { ++ return false; ++ } + DASSERT(jobname != NULL); + LPTSTR lpJobName = (LPTSTR)JNU_GetStringPlatformChars(env, jobname, NULL); + LPTSTR jname = _tcsdup(lpJobName); +@@ -1016,8 +1084,12 @@ + + // store handle + jfieldID fieldId = getIdOfLongField(env, peer, HPRINTER_STR); +- env->SetLongField(peer, fieldId, reinterpret_cast<jlong>(hPrinter)); +- return true; ++ if (fieldId == (jfieldID)0) { ++ return false; ++ } else { ++ env->SetLongField(peer, fieldId, reinterpret_cast<jlong>(hPrinter)); ++ return true; ++ } + } + + +@@ -1039,6 +1111,9 @@ + + try { + data=(jbyte *)env->GetPrimitiveArrayCritical(dataArray, 0); ++ if (data == NULL) { ++ return false; ++ } + + // Send the data to the printer. + if( ! ::WritePrinter(hPrinter, data, count,(LPDWORD)&dwBytesWritten)) { +--- ./jdk/src/windows/native/sun/windows/awt.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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,8 +47,11 @@ + class AwtObject; + typedef AwtObject* PDATA; + ++#define JNI_IS_TRUE(obj) ((obj) ? JNI_TRUE : JNI_FALSE) ++ + #define JNI_CHECK_NULL_GOTO(obj, msg, where) { \ + if (obj == NULL) { \ ++ env->ExceptionClear(); \ + JNU_ThrowNullPointerException(env, msg); \ + goto where; \ + } \ +@@ -65,6 +68,7 @@ + + #define JNI_CHECK_NULL_RETURN(obj, msg) { \ + if (obj == NULL) { \ ++ env->ExceptionClear(); \ + JNU_ThrowNullPointerException(env, msg); \ + return; \ + } \ +@@ -91,6 +95,7 @@ + + #define JNI_CHECK_NULL_RETURN_NULL(obj, msg) { \ + if (obj == NULL) { \ ++ env->ExceptionClear(); \ + JNU_ThrowNullPointerException(env, msg); \ + return 0; \ + } \ +@@ -98,6 +103,7 @@ + + #define JNI_CHECK_NULL_RETURN_VAL(obj, msg, val) { \ + if (obj == NULL) { \ ++ env->ExceptionClear(); \ + JNU_ThrowNullPointerException(env, msg); \ + return val; \ + } \ +@@ -124,6 +130,7 @@ + #define THROW_NULL_PDATA_IF_NOT_DESTROYED(peer) { \ + jboolean destroyed = JNI_GET_DESTROYED(peer); \ + if (destroyed != JNI_TRUE) { \ ++ env->ExceptionClear(); \ + JNU_ThrowNullPointerException(env, "null pData"); \ + } \ + } +--- ./jdk/src/windows/native/sun/windows/awt_AWTEvent.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_AWTEvent.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -71,12 +71,16 @@ + TRY; + + AwtAWTEvent::bdataID = env->GetFieldID(cls, "bdata", "[B"); ++ DASSERT(AwtAWTEvent::bdataID != NULL); ++ CHECK_NULL(AwtAWTEvent::bdataID); ++ + AwtAWTEvent::idID = env->GetFieldID(cls, "id", "I"); ++ DASSERT(AwtAWTEvent::idID != NULL); ++ CHECK_NULL(AwtAWTEvent::idID); ++ + AwtAWTEvent::consumedID = env->GetFieldID(cls, "consumed", "Z"); +- +- DASSERT(AwtAWTEvent::bdataID != NULL); +- DASSERT(AwtAWTEvent::idID != NULL); + DASSERT(AwtAWTEvent::consumedID != NULL); ++ CHECK_NULL(AwtAWTEvent::consumedID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_Canvas.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Canvas.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -63,6 +63,10 @@ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + jobject target = NULL; ++ jobject graphicsConfig = NULL; ++ jclass canvasClass = NULL; ++ jclass win32cls = NULL; ++ + AwtCanvas *canvas = NULL; + + try { +@@ -100,16 +104,24 @@ + // Set the pixel format of the HWND if a GraphicsConfiguration + // was provided to the Canvas constructor. + +- jclass canvasClass = env->FindClass("java/awt/Canvas"); ++ canvasClass = env->FindClass("java/awt/Canvas"); ++ DASSERT(canvasClass != NULL); ++ if (!canvasClass) { ++ throw std::bad_alloc(); ++ } ++ + if ( env->IsInstanceOf( target, canvasClass ) ) { + + // Get GraphicsConfig from our target +- jobject graphicsConfig = env->GetObjectField(target, ++ graphicsConfig = env->GetObjectField(target, + AwtComponent::graphicsConfigID); + if (graphicsConfig != NULL) { + +- jclass win32cls = env->FindClass("sun/awt/Win32GraphicsConfig"); ++ win32cls = env->FindClass("sun/awt/Win32GraphicsConfig"); + DASSERT (win32cls != NULL); ++ if (!win32cls) { ++ throw std::bad_alloc(); ++ } + + if ( env->IsInstanceOf( graphicsConfig, win32cls ) ) { + // Get the visual ID member from our GC +@@ -131,8 +143,7 @@ + env->ExceptionClear(); + env->ThrowNew(excCls, + "\nUnable to set Pixel format on Canvas"); +- env->DeleteLocalRef(target); +- return canvas; ++ env->DeleteLocalRef(excCls); + } + } + } +@@ -141,11 +152,20 @@ + } + } catch (...) { + env->DeleteLocalRef(target); ++ env->DeleteLocalRef(graphicsConfig); ++ env->DeleteLocalRef(canvasClass); ++ env->DeleteLocalRef(win32cls); ++ ++ env->DeleteGlobalRef(self); ++ env->DeleteGlobalRef(hParent); + throw; + } + + done: + env->DeleteLocalRef(target); ++ env->DeleteLocalRef(graphicsConfig); ++ env->DeleteLocalRef(canvasClass); ++ env->DeleteLocalRef(win32cls); + return canvas; + CATCH_BAD_ALLOC_RET(0); + } +--- ./jdk/src/windows/native/sun/windows/awt_Checkbox.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Checkbox.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -558,13 +558,15 @@ + + AwtCheckbox::labelID = + env->GetFieldID(cls, "label", "Ljava/lang/String;"); ++ DASSERT(AwtCheckbox::labelID != NULL); ++ CHECK_NULL(AwtCheckbox::labelID); ++ + AwtCheckbox::groupID = + env->GetFieldID(cls, "group", "Ljava/awt/CheckboxGroup;"); +- AwtCheckbox::stateID = +- env->GetFieldID(cls, "state", "Z"); ++ DASSERT(AwtCheckbox::groupID != NULL); ++ CHECK_NULL(AwtCheckbox::groupID); + +- DASSERT(AwtCheckbox::labelID != NULL); +- DASSERT(AwtCheckbox::groupID != NULL); ++ AwtCheckbox::stateID = env->GetFieldID(cls, "state", "Z"); + DASSERT(AwtCheckbox::stateID != NULL); + + CATCH_BAD_ALLOC; +--- ./jdk/src/windows/native/sun/windows/awt_Choice.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Choice.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -157,6 +157,7 @@ + "preferredSize", + "()Ljava/awt/Dimension;").l; + DASSERT(!safe_ExceptionOccurred(env)); ++ if (env->ExceptionCheck()) goto done; + + if (dimension != NULL && width == 0) { + width = env->GetIntField(dimension, AwtDimension::widthID); +@@ -337,9 +338,8 @@ + "preferredSize", + "()Ljava/awt/Dimension;").l; + DASSERT(!safe_ExceptionOccurred(env)); +- if (dimension == NULL) { +- return NULL; +- } ++ CHECK_NULL_RETURN(dimension, NULL); ++ + /* This size is window size of choice and it's too big for each + * drop down item height. + */ +@@ -605,7 +605,8 @@ + for (i = 0; i < itemCount; i++) + { + jstring item = (jstring)env->GetObjectArrayElement(items, i); +- JNI_CHECK_NULL_GOTO(item, "null item", next_elem); ++ if (env->ExceptionCheck()) goto done; ++ if (item == NULL) goto next_elem; + c->SendMessage(CB_INSERTSTRING, index + i, JavaStringBuffer(env, item)); + env->DeleteLocalRef(item); + next_elem: +--- ./jdk/src/windows/native/sun/windows/awt_Component.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Component.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -467,6 +467,7 @@ + jclass win32GCCls = env->FindClass("sun/awt/Win32GraphicsConfig"); + DASSERT(win32GCCls != NULL); + DASSERT(env->IsInstanceOf(compGC, win32GCCls)); ++ CHECK_NULL(win32GCCls); + env->SetObjectField(peer, AwtComponent::peerGCID, compGC); + } + } +@@ -530,10 +531,15 @@ + if (dw == ERROR_OUTOFMEMORY) + { + jstring errorMsg = JNU_NewStringPlatform(env, L"too many window handles"); +- createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError", ++ if (errorMsg == NULL || env->ExceptionCheck()) { ++ env->ExceptionClear(); ++ createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError", "()V"); ++ } else { ++ createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError", + "(Ljava/lang/String;)V", + errorMsg); +- env->DeleteLocalRef(errorMsg); ++ env->DeleteLocalRef(errorMsg); ++ } + } + else + { +@@ -542,14 +548,18 @@ + NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&buf, 0, NULL); + jstring s = JNU_NewStringPlatform(env, buf); +- createError = JNU_NewObjectByName(env, "java/lang/InternalError", +- "(Ljava/lang/String;)V", s); ++ if (s == NULL || env->ExceptionCheck()) { ++ env->ExceptionClear(); ++ createError = JNU_NewObjectByName(env, "java/lang/InternalError", "()V"); ++ } else { ++ createError = JNU_NewObjectByName(env, "java/lang/InternalError", ++ "(Ljava/lang/String;)V", s); ++ env->DeleteLocalRef(s); ++ } + LocalFree(buf); +- env->DeleteLocalRef(s); + } +- env->SetObjectField(peer, AwtObject::createErrorID, createError); +- if (createError != NULL) +- { ++ if (createError != NULL) { ++ env->SetObjectField(peer, AwtObject::createErrorID, createError); + env->DeleteLocalRef(createError); + } + env->DeleteLocalRef(target); +@@ -3311,10 +3321,7 @@ + if( extKeyCodesCls == NULL) { + jclass extKeyCodesClsLocal = env->FindClass("sun/awt/ExtendedKeyCodes"); + DASSERT(extKeyCodesClsLocal); +- if (extKeyCodesClsLocal == NULL) { +- /* exception already thrown */ +- return; +- } ++ CHECK_NULL(extKeyCodesClsLocal); + extKeyCodesCls = (jclass)env->NewGlobalRef(extKeyCodesClsLocal); + env->DeleteLocalRef(extKeyCodesClsLocal); + } +@@ -3323,6 +3330,7 @@ + getExtendedKeyCodeForChar = + env->GetStaticMethodID(extKeyCodesCls, "getExtendedKeyCodeForChar", "(I)I"); + DASSERT(getExtendedKeyCodeForChar); ++ CHECK_NULL(getExtendedKeyCodeForChar); + } + jint extJKC; //extended Java key code + +@@ -3942,11 +3950,19 @@ + if (cClause && rgClauseBoundary && rgClauseReading) { + // convert clause boundary offset array to java array + clauseBoundary = env->NewIntArray(cClause+1); ++ DASSERT(clauseBoundary); ++ CHECK_NULL(clauseBoundary); + env->SetIntArrayRegion(clauseBoundary, 0, cClause+1, (jint *)rgClauseBoundary); + DASSERT(!safe_ExceptionOccurred(env)); + + // convert clause reading string array to java array +- clauseReading = env->NewObjectArray(cClause, JNU_ClassString(env), NULL); ++ jclass stringCls = JNU_ClassString(env); ++ DASSERT(stringCls); ++ CHECK_NULL(stringCls); ++ clauseReading = env->NewObjectArray(cClause, stringCls, NULL); ++ env->DeleteLocalRef(stringCls); ++ DASSERT(clauseReading); ++ CHECK_NULL(clauseReading); + for (int i=0; i<cClause; i++) env->SetObjectArrayElement(clauseReading, i, rgClauseReading[i]); + DASSERT(!safe_ExceptionOccurred(env)); + } +@@ -3965,11 +3981,15 @@ + if (cAttrBlock && rgAttrBoundary && rgAttrValue) { + // convert attribute boundary offset array to java array + attrBoundary = env->NewIntArray(cAttrBlock+1); ++ DASSERT(attrBoundary); ++ CHECK_NULL(attrBoundary); + env->SetIntArrayRegion(attrBoundary, 0, cAttrBlock+1, (jint *)rgAttrBoundary); + DASSERT(!safe_ExceptionOccurred(env)); + + // convert attribute value byte array to java array + attrValue = env->NewByteArray(cAttrBlock); ++ DASSERT(attrValue); ++ CHECK_NULL(attrValue); + env->SetByteArrayRegion(attrValue, 0, cAttrBlock, (jbyte *)rgAttrValue); + DASSERT(!safe_ExceptionOccurred(env)); + } +@@ -3980,10 +4000,7 @@ + if (wInputMethodCls == NULL) { + jclass wInputMethodClsLocal = env->FindClass("sun/awt/windows/WInputMethod"); + DASSERT(wInputMethodClsLocal); +- if (wInputMethodClsLocal == NULL) { +- /* exception already thrown */ +- return; +- } ++ CHECK_NULL(wInputMethodClsLocal); + wInputMethodCls = (jclass)env->NewGlobalRef(wInputMethodClsLocal); + env->DeleteLocalRef(wInputMethodClsLocal); + } +@@ -3994,6 +4011,7 @@ + sendIMEventMid = env->GetMethodID(wInputMethodCls, "sendInputMethodEvent", + "(IJLjava/lang/String;[I[Ljava/lang/String;[I[BIII)V"); + DASSERT(sendIMEventMid); ++ CHECK_NULL(sendIMEventMid); + } + + // call m_InputMethod.sendInputMethod() +@@ -4019,10 +4037,7 @@ + if (wInputMethodCls == NULL) { + jclass wInputMethodClsLocal = env->FindClass("sun/awt/windows/WInputMethod"); + DASSERT(wInputMethodClsLocal); +- if (wInputMethodClsLocal == NULL) { +- /* exception already thrown */ +- return; +- } ++ CHECK_NULL(wInputMethodClsLocal); + wInputMethodCls = (jclass)env->NewGlobalRef(wInputMethodClsLocal); + env->DeleteLocalRef(wInputMethodClsLocal); + } +@@ -4030,10 +4045,10 @@ + // get method ID of sendInputMethodEvent() (run only once) + static jmethodID inqCandPosMid = 0; + if (inqCandPosMid == 0) { +- inqCandPosMid = env->GetMethodID(wInputMethodCls, "inquireCandidatePosition", +- "()V"); ++ inqCandPosMid = env->GetMethodID(wInputMethodCls, "inquireCandidatePosition", "()V"); + DASSERT(!safe_ExceptionOccurred(env)); + DASSERT(inqCandPosMid); ++ CHECK_NULL(inqCandPosMid); + } + + // call m_InputMethod.sendInputMethod() +@@ -4315,6 +4330,11 @@ + if ((int) (drawInfo.itemID) >= 0) { + jobject font = GET_FONT(target, peer); + jstring text = GetItemString(env, target, drawInfo.itemID); ++ if (env->ExceptionCheck()) { ++ env->DeleteLocalRef(font); ++ env->DeleteLocalRef(target); ++ return; ++ } + SIZE size = AwtFont::getMFStringSize(hDC, font, text); + AwtFont::drawMFString(hDC, font, text, + (GetRTL()) ? rect.right - size.cx - 1 +@@ -4774,6 +4794,7 @@ + keyEventConst = env->GetMethodID(keyEventCls, "<init>", + "(Ljava/awt/Component;IJIICI)V"); + DASSERT(keyEventConst); ++ CHECK_NULL(keyEventConst); + } + if (env->EnsureLocalCapacity(2) < 0) { + return; +@@ -4785,6 +4806,10 @@ + if (safe_ExceptionOccurred(env)) env->ExceptionDescribe(); + DASSERT(!safe_ExceptionOccurred(env)); + DASSERT(keyEvent != NULL); ++ if (keyEvent == NULL) { ++ env->DeleteLocalRef(target); ++ return; ++ } + env->SetLongField(keyEvent, AwtKeyEvent::rawCodeID, nativeCode); + if( nativeCode && nativeCode < 256 ) { + env->SetLongField(keyEvent, AwtKeyEvent::primaryLevelUnicodeID, (jlong)(dynPrimaryKeymap[nativeCode].unicode)); +@@ -4868,10 +4893,7 @@ + if (mouseEventCls == NULL) { + jclass mouseEventClsLocal = + env->FindClass("java/awt/event/MouseEvent"); +- if (!mouseEventClsLocal) { +- /* exception already thrown */ +- return; +- } ++ CHECK_NULL(mouseEventClsLocal); + mouseEventCls = (jclass)env->NewGlobalRef(mouseEventClsLocal); + env->DeleteLocalRef(mouseEventClsLocal); + } +@@ -4884,6 +4906,7 @@ + env->GetMethodID(mouseEventCls, "<init>", + "(Ljava/awt/Component;IJIIIIIIZI)V"); + DASSERT(mouseEventConst); ++ CHECK_NULL(mouseEventConst); + } + if (env->EnsureLocalCapacity(2) < 0) { + return; +@@ -4896,7 +4919,7 @@ + target, + id, when, modifiers, + x+insets.left, y+insets.top, +- xAbs, yAbs, ++ xAbs, yAbs, + clickCount, popupTrigger, button); + + if (safe_ExceptionOccurred(env)) { +@@ -4905,6 +4928,7 @@ + } + + DASSERT(mouseEvent != NULL); ++ CHECK_NULL(mouseEvent); + if (pMsg != 0) { + AwtAWTEvent::saveMSG(env, pMsg, mouseEvent); + } +@@ -4933,10 +4957,7 @@ + if (mouseWheelEventCls == NULL) { + jclass mouseWheelEventClsLocal = + env->FindClass("java/awt/event/MouseWheelEvent"); +- if (!mouseWheelEventClsLocal) { +- /* exception already thrown */ +- return; +- } ++ CHECK_NULL(mouseWheelEventClsLocal); + mouseWheelEventCls = (jclass)env->NewGlobalRef(mouseWheelEventClsLocal); + env->DeleteLocalRef(mouseWheelEventClsLocal); + } +@@ -4949,6 +4970,7 @@ + env->GetMethodID(mouseWheelEventCls, "<init>", + "(Ljava/awt/Component;IJIIIIIIZIIID)V"); + DASSERT(mouseWheelEventConst); ++ CHECK_NULL(mouseWheelEventConst); + } + if (env->EnsureLocalCapacity(2) < 0) { + return; +@@ -4965,11 +4987,14 @@ + clickCount, popupTrigger, + scrollType, scrollAmount, + roundedWheelRotation, preciseWheelRotation); +- if (safe_ExceptionOccurred(env)) { ++ ++ DASSERT(mouseWheelEvent != NULL); ++ if (mouseWheelEvent == NULL || safe_ExceptionOccurred(env)) { + env->ExceptionDescribe(); + env->ExceptionClear(); +- } +- DASSERT(mouseWheelEvent != NULL); ++ env->DeleteLocalRef(target); ++ return; ++ } + if (pMsg != NULL) { + AwtAWTEvent::saveMSG(env, pMsg, mouseWheelEvent); + } +@@ -4994,10 +5019,7 @@ + jclass focusEventClsLocal + = env->FindClass("java/awt/event/FocusEvent"); + DASSERT(focusEventClsLocal); +- if (focusEventClsLocal == NULL) { +- /* exception already thrown */ +- return; +- } ++ CHECK_NULL(focusEventClsLocal); + focusEventCls = (jclass)env->NewGlobalRef(focusEventClsLocal); + env->DeleteLocalRef(focusEventClsLocal); + } +@@ -5008,6 +5030,7 @@ + env->GetMethodID(focusEventCls, "<init>", + "(Ljava/awt/Component;IZLjava/awt/Component;)V"); + DASSERT(focusEventConst); ++ CHECK_NULL(focusEventConst); + } + + static jclass sequencedEventCls; +@@ -5015,10 +5038,7 @@ + jclass sequencedEventClsLocal = + env->FindClass("java/awt/SequencedEvent"); + DASSERT(sequencedEventClsLocal); +- if (sequencedEventClsLocal == NULL) { +- /* exception already thrown */ +- return; +- } ++ CHECK_NULL(sequencedEventClsLocal); + sequencedEventCls = + (jclass)env->NewGlobalRef(sequencedEventClsLocal); + env->DeleteLocalRef(sequencedEventClsLocal); +@@ -5029,6 +5049,8 @@ + sequencedEventConst = + env->GetMethodID(sequencedEventCls, "<init>", + "(Ljava/awt/AWTEvent;)V"); ++ DASSERT(sequencedEventConst); ++ CHECK_NULL(sequencedEventConst); + } + + if (env->EnsureLocalCapacity(3) < 0) { +@@ -5051,6 +5073,7 @@ + env->DeleteLocalRef(jOpposite); jOpposite = NULL; + } + env->DeleteLocalRef(target); target = NULL; ++ CHECK_NULL(focusEvent); + + jobject sequencedEvent = env->NewObject(sequencedEventCls, + sequencedEventConst, +@@ -5058,7 +5081,7 @@ + DASSERT(!safe_ExceptionOccurred(env)); + DASSERT(sequencedEvent != NULL); + env->DeleteLocalRef(focusEvent); focusEvent = NULL; +- ++ CHECK_NULL(sequencedEvent); + SendEvent(sequencedEvent); + + env->DeleteLocalRef(sequencedEvent); +@@ -5229,7 +5252,7 @@ + "getWheelRotation", + "()I").i; + DASSERT(!safe_ExceptionOccurred(env)); +- //DASSERT(wheelAmt); ++ JNU_CHECK_EXCEPTION(env); + DTRACE_PRINTLN1("wheelAmt = %i\n", wheelAmt); + + // convert Java wheel amount value to Win32 +@@ -6091,7 +6114,7 @@ + c = (AwtComponent *)pData; + if (::IsWindow(c->GetHWnd())) + { +- result = (jboolean)c->InheritsNativeMouseWheelBehavior(); ++ result = JNI_IS_TRUE(c->InheritsNativeMouseWheelBehavior()); + } + ret: + env->DeleteGlobalRef(self); +@@ -6308,10 +6331,12 @@ + { + TRY; + jclass inputEventClazz = env->FindClass("java/awt/event/InputEvent"); ++ CHECK_NULL(inputEventClazz); + jmethodID getButtonDownMasksID = env->GetStaticMethodID(inputEventClazz, "getButtonDownMasks", "()[I"); ++ CHECK_NULL(getButtonDownMasksID); + jintArray obj = (jintArray)env->CallStaticObjectMethod(inputEventClazz, getButtonDownMasksID); + jint * tmp = env->GetIntArrayElements(obj, JNI_FALSE); +- ++ CHECK_NULL(tmp); + jsize len = env->GetArrayLength(obj); + AwtComponent::masks = SAFE_SIZE_NEW_ARRAY(jint, len); + for (int i = 0; i < len; i++) { +@@ -6324,68 +6349,112 @@ + jclass peerCls = env->FindClass("sun/awt/windows/WComponentPeer"); + + DASSERT(peerCls); ++ CHECK_NULL(peerCls); + + /* field ids */ + AwtComponent::peerID = + env->GetFieldID(cls, "peer", "Ljava/awt/peer/ComponentPeer;"); ++ DASSERT(AwtComponent::peerID); ++ CHECK_NULL(AwtComponent::peerID); ++ + AwtComponent::xID = env->GetFieldID(cls, "x", "I"); ++ DASSERT(AwtComponent::xID); ++ CHECK_NULL(AwtComponent::xID); ++ + AwtComponent::yID = env->GetFieldID(cls, "y", "I"); ++ DASSERT(AwtComponent::yID); ++ CHECK_NULL(AwtComponent::yID); ++ + AwtComponent::heightID = env->GetFieldID(cls, "height", "I"); ++ DASSERT(AwtComponent::heightID); ++ CHECK_NULL(AwtComponent::heightID); ++ + AwtComponent::widthID = env->GetFieldID(cls, "width", "I"); ++ DASSERT(AwtComponent::widthID); ++ CHECK_NULL(AwtComponent::widthID); ++ + AwtComponent::visibleID = env->GetFieldID(cls, "visible", "Z"); ++ DASSERT(AwtComponent::visibleID); ++ CHECK_NULL(AwtComponent::visibleID); ++ + AwtComponent::backgroundID = + env->GetFieldID(cls, "background", "Ljava/awt/Color;"); ++ DASSERT(AwtComponent::backgroundID); ++ CHECK_NULL(AwtComponent::backgroundID); ++ + AwtComponent::foregroundID = + env->GetFieldID(cls, "foreground", "Ljava/awt/Color;"); ++ DASSERT(AwtComponent::foregroundID); ++ CHECK_NULL(AwtComponent::foregroundID); ++ + AwtComponent::enabledID = env->GetFieldID(cls, "enabled", "Z"); ++ DASSERT(AwtComponent::enabledID); ++ CHECK_NULL(AwtComponent::enabledID); ++ + AwtComponent::parentID = env->GetFieldID(cls, "parent", "Ljava/awt/Container;"); ++ DASSERT(AwtComponent::parentID); ++ CHECK_NULL(AwtComponent::parentID); ++ + AwtComponent::graphicsConfigID = + env->GetFieldID(cls, "graphicsConfig", "Ljava/awt/GraphicsConfiguration;"); ++ DASSERT(AwtComponent::graphicsConfigID); ++ CHECK_NULL(AwtComponent::graphicsConfigID); ++ + AwtComponent::focusableID = env->GetFieldID(cls, "focusable", "Z"); ++ DASSERT(AwtComponent::focusableID); ++ CHECK_NULL(AwtComponent::focusableID); + + AwtComponent::appContextID = env->GetFieldID(cls, "appContext", + "Lsun/awt/AppContext;"); ++ DASSERT(AwtComponent::appContextID); ++ CHECK_NULL(AwtComponent::appContextID); + + AwtComponent::peerGCID = env->GetFieldID(peerCls, "winGraphicsConfig", + "Lsun/awt/Win32GraphicsConfig;"); ++ DASSERT(AwtComponent::peerGCID); ++ CHECK_NULL(AwtComponent::peerGCID); + + AwtComponent::hwndID = env->GetFieldID(peerCls, "hwnd", "J"); ++ DASSERT(AwtComponent::hwndID); ++ CHECK_NULL(AwtComponent::hwndID); + + AwtComponent::cursorID = env->GetFieldID(cls, "cursor", "Ljava/awt/Cursor;"); ++ DASSERT(AwtComponent::cursorID); ++ CHECK_NULL(AwtComponent::cursorID); + + /* method ids */ + AwtComponent::getFontMID = + env->GetMethodID(cls, "getFont_NoClientCode", "()Ljava/awt/Font;"); ++ DASSERT(AwtComponent::getFontMID); ++ CHECK_NULL(AwtComponent::getFontMID); ++ + AwtComponent::getToolkitMID = + env->GetMethodID(cls, "getToolkitImpl", "()Ljava/awt/Toolkit;"); ++ DASSERT(AwtComponent::getToolkitMID); ++ CHECK_NULL(AwtComponent::getToolkitMID); ++ + AwtComponent::isEnabledMID = env->GetMethodID(cls, "isEnabledImpl", "()Z"); ++ DASSERT(AwtComponent::isEnabledMID); ++ CHECK_NULL(AwtComponent::isEnabledMID); ++ + AwtComponent::getLocationOnScreenMID = + env->GetMethodID(cls, "getLocationOnScreen_NoTreeLock", "()Ljava/awt/Point;"); ++ DASSERT(AwtComponent::getLocationOnScreenMID); ++ CHECK_NULL(AwtComponent::getLocationOnScreenMID); ++ + AwtComponent::replaceSurfaceDataMID = + env->GetMethodID(peerCls, "replaceSurfaceData", "()V"); ++ DASSERT(AwtComponent::replaceSurfaceDataMID); ++ CHECK_NULL(AwtComponent::replaceSurfaceDataMID); ++ + AwtComponent::replaceSurfaceDataLaterMID = + env->GetMethodID(peerCls, "replaceSurfaceDataLater", "()V"); ++ DASSERT(AwtComponent::replaceSurfaceDataLaterMID); ++ CHECK_NULL(AwtComponent::replaceSurfaceDataLaterMID); ++ + AwtComponent::disposeLaterMID = env->GetMethodID(peerCls, "disposeLater", "()V"); +- +- DASSERT(AwtComponent::xID); +- DASSERT(AwtComponent::yID); +- DASSERT(AwtComponent::heightID); +- DASSERT(AwtComponent::widthID); +- DASSERT(AwtComponent::visibleID); +- DASSERT(AwtComponent::backgroundID); +- DASSERT(AwtComponent::foregroundID); +- DASSERT(AwtComponent::enabledID); +- DASSERT(AwtComponent::parentID); +- DASSERT(AwtComponent::hwndID); +- +- DASSERT(AwtComponent::getFontMID); +- DASSERT(AwtComponent::getToolkitMID); +- DASSERT(AwtComponent::isEnabledMID); +- DASSERT(AwtComponent::getLocationOnScreenMID); +- DASSERT(AwtComponent::replaceSurfaceDataMID); +- DASSERT(AwtComponent::replaceSurfaceDataLaterMID); + DASSERT(AwtComponent::disposeLaterMID); +- ++ CHECK_NULL(AwtComponent::disposeLaterMID); + + CATCH_BAD_ALLOC; + } +@@ -6861,9 +6930,9 @@ + { + TRY; + +- return (jboolean)AwtToolkit::GetInstance().SyncCall( ++ return JNI_IS_TRUE(AwtToolkit::GetInstance().SyncCall( + (void *(*)(void *))AwtComponent::_NativeHandlesWheelScrolling, +- env->NewGlobalRef(self)); ++ env->NewGlobalRef(self))); + // global ref is deleted in _NativeHandlesWheelScrolling + + CATCH_BAD_ALLOC_RET(NULL); +@@ -6882,9 +6951,9 @@ + + jobject selfGlobalRef = env->NewGlobalRef(self); + +- return (jboolean)AwtToolkit::GetInstance().SyncCall( ++ return JNI_IS_TRUE(AwtToolkit::GetInstance().SyncCall( + (void*(*)(void*))AwtComponent::_IsObscured, +- (void *)selfGlobalRef); ++ (void *)selfGlobalRef)); + // selfGlobalRef is deleted in _IsObscured + + CATCH_BAD_ALLOC_RET(NULL); +--- ./jdk/src/windows/native/sun/windows/awt_Cursor.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Cursor.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -209,42 +209,53 @@ + return; + } + jobject jcomp = comp->GetTarget(env); ++ try { ++ //4372119:Disappearing of busy cursor on JDK 1.3 ++ HWND captureWnd = GetCapture(); ++ if ( !AwtComponent::isMenuLoopActive() && ++ (captureWnd==NULL || captureWnd==comp->GetHWnd())) ++ { ++ if (IsWindow(AwtWindow::GetModalBlocker( ++ AwtComponent::GetTopLevelParentForWindow( ++ comp->GetHWnd())))) ++ { ++ static HCURSOR hArrowCursor = LoadCursor(NULL, IDC_ARROW); ++ SetCursor(hArrowCursor); ++ } else { ++ HCURSOR cur = comp->getCursorCache(); ++ if (cur == NULL) { ++ cur = GetCursor(env , comp); ++ } ++ if (cur != NULL) { ++ ::SetCursor(cur); ++ } else { ++ safe_ExceptionOccurred(env); ++ } + +- //4372119:Disappearing of busy cursor on JDK 1.3 +- HWND captureWnd = GetCapture(); +- if ( !AwtComponent::isMenuLoopActive() && +- (captureWnd==NULL || captureWnd==comp->GetHWnd())) +- { +- if (IsWindow(AwtWindow::GetModalBlocker( +- AwtComponent::GetTopLevelParentForWindow( +- comp->GetHWnd())))) +- { +- static HCURSOR hArrowCursor = LoadCursor(NULL, IDC_ARROW); +- SetCursor(hArrowCursor); +- } else { +- HCURSOR cur = comp->getCursorCache(); +- if (cur == NULL) { +- cur = GetCursor(env , comp); ++ if (AwtCursor::updateCursorID == NULL) { ++ jclass cls = ++ env->FindClass("sun/awt/windows/WGlobalCursorManager"); ++ if(cls != NULL){ ++ AwtCursor::globalCursorManagerClass = ++ (jclass)env->NewGlobalRef(cls); ++ AwtCursor::updateCursorID = ++ env->GetStaticMethodID(cls, "nativeUpdateCursor", ++ "(Ljava/awt/Component;)V"); ++ env->DeleteLocalRef(cls); ++ DASSERT(AwtCursor::globalCursorManagerClass != NULL); ++ DASSERT(AwtCursor::updateCursorID != NULL); ++ } ++ } ++ if (AwtCursor::updateCursorID != NULL ++ && AwtCursor::globalCursorManagerClass != NULL) { ++ env->CallStaticVoidMethod(AwtCursor::globalCursorManagerClass, ++ AwtCursor::updateCursorID, jcomp); ++ } + } +- if (cur != NULL) { +- ::SetCursor(cur); +- } +- +- if (AwtCursor::updateCursorID == NULL) { +- jclass cls = +- env->FindClass("sun/awt/windows/WGlobalCursorManager"); +- AwtCursor::globalCursorManagerClass = +- (jclass)env->NewGlobalRef(cls); +- AwtCursor::updateCursorID = +- env->GetStaticMethodID(cls, "nativeUpdateCursor", +- "(Ljava/awt/Component;)V"); +- DASSERT(AwtCursor::globalCursorManagerClass != NULL); +- DASSERT(AwtCursor::updateCursorID != NULL); +- } +- +- env->CallStaticVoidMethod(AwtCursor::globalCursorManagerClass, +- AwtCursor::updateCursorID, jcomp); + } ++ } catch (...) { ++ env->DeleteLocalRef(jcomp); ++ throw; + } + env->DeleteLocalRef(jcomp); + } +@@ -294,15 +305,22 @@ + TRY; + + AwtCursor::mSetPDataID = env->GetMethodID(cls, "setPData", "(J)V"); ++ DASSERT(AwtCursor::mSetPDataID != NULL); ++ CHECK_NULL(AwtCursor::mSetPDataID); + AwtCursor::pDataID = env->GetFieldID(cls, "pData", "J"); ++ DASSERT(AwtCursor::pDataID != NULL); ++ CHECK_NULL(AwtCursor::pDataID); + AwtCursor::typeID = env->GetFieldID(cls, "type", "I"); +- DASSERT(AwtCursor::pDataID != NULL); + DASSERT(AwtCursor::typeID != NULL); ++ CHECK_NULL(AwtCursor::typeID); + + cls = env->FindClass("java/awt/Point"); ++ CHECK_NULL(cls); ++ + AwtCursor::pointXID = env->GetFieldID(cls, "x", "I"); ++ DASSERT(AwtCursor::pointXID != NULL); ++ CHECK_NULL(AwtCursor::pointXID); + AwtCursor::pointYID = env->GetFieldID(cls, "y", "I"); +- DASSERT(AwtCursor::pointXID != NULL); + DASSERT(AwtCursor::pointYID != NULL); + + AwtCursor::updateCursorID = NULL; +--- ./jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_DataTransferer.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -274,6 +274,9 @@ + + jclass str_clazz = env->FindClass("java/lang/String"); + DASSERT(str_clazz != NULL); ++ if (str_clazz == NULL) { ++ throw std::bad_alloc(); ++ } + jobjectArray filenames = env->NewObjectArray(nFilenames, str_clazz, + NULL); + if (filenames == NULL) { +@@ -827,6 +830,7 @@ + TRY; + + LPCTSTR cStr = JNU_GetStringPlatformChars(env, str, NULL); ++ CHECK_NULL_RETURN(cStr, 0); + jlong value = ::RegisterClipboardFormat(cStr); + JNU_ReleaseStringPlatformChars(env, str, cStr); + +--- ./jdk/src/windows/native/sun/windows/awt_Desktop.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Desktop.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,6 +23,7 @@ + * questions. + */ + ++#include "jni_util.h" + #include "awt.h" + #include <jni.h> + #include <shellapi.h> +@@ -41,7 +42,12 @@ + (JNIEnv *env, jclass cls, jstring fileOrUri_j, jstring verb_j) + { + LPCWSTR fileOrUri_c = JNU_GetStringPlatformChars(env, fileOrUri_j, JNI_FALSE); ++ CHECK_NULL_RETURN(fileOrUri_c, NULL); + LPCWSTR verb_c = JNU_GetStringPlatformChars(env, verb_j, JNI_FALSE); ++ if (verb_c == NULL) { ++ JNU_ReleaseStringPlatformChars(env, fileOrUri_j, fileOrUri_c); ++ return NULL; ++ } + + // 6457572: ShellExecute possibly changes FPU control word - saving it here + unsigned oldcontrol87 = _control87(0, 0); +--- ./jdk/src/windows/native/sun/windows/awt_DesktopProperties.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_DesktopProperties.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -83,13 +83,19 @@ + HDC dc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); + + if (dc != NULL) { +- SetFontProperty(dc, ANSI_FIXED_FONT, TEXT("win.ansiFixed.font")); +- SetFontProperty(dc, ANSI_VAR_FONT, TEXT("win.ansiVar.font")); +- SetFontProperty(dc, DEVICE_DEFAULT_FONT, TEXT("win.deviceDefault.font")); +- SetFontProperty(dc, DEFAULT_GUI_FONT, TEXT("win.defaultGUI.font")); +- SetFontProperty(dc, OEM_FIXED_FONT, TEXT("win.oemFixed.font")); +- SetFontProperty(dc, SYSTEM_FONT, TEXT("win.system.font")); +- SetFontProperty(dc, SYSTEM_FIXED_FONT, TEXT("win.systemFixed.font")); ++ try { ++ SetFontProperty(dc, ANSI_FIXED_FONT, TEXT("win.ansiFixed.font")); ++ SetFontProperty(dc, ANSI_VAR_FONT, TEXT("win.ansiVar.font")); ++ SetFontProperty(dc, DEVICE_DEFAULT_FONT, TEXT("win.deviceDefault.font")); ++ SetFontProperty(dc, DEFAULT_GUI_FONT, TEXT("win.defaultGUI.font")); ++ SetFontProperty(dc, OEM_FIXED_FONT, TEXT("win.oemFixed.font")); ++ SetFontProperty(dc, SYSTEM_FONT, TEXT("win.system.font")); ++ SetFontProperty(dc, SYSTEM_FIXED_FONT, TEXT("win.systemFixed.font")); ++ } ++ catch (std::bad_alloc&) { ++ DeleteDC(dc); ++ throw; ++ } + DeleteDC(dc); + } + } +@@ -206,24 +212,35 @@ + LPTSTR value; + + value = getXPStylePropFromReg(TEXT("ThemeActive")); +- SetBooleanProperty(TEXT("win.xpstyle.themeActive"), (value != NULL && *value == _T('1'))); +- if (value != NULL) { +- free(value); ++ try { ++ SetBooleanProperty(TEXT("win.xpstyle.themeActive"), (value != NULL && *value == _T('1'))); ++ if (value != NULL) { ++ free(value); ++ value = NULL; ++ } ++ value = getXPStylePropFromReg(TEXT("DllName")); ++ if (value != NULL) { ++ SetStringProperty(TEXT("win.xpstyle.dllName"), value); ++ free(value); ++ value = NULL; ++ } ++ value = getXPStylePropFromReg(TEXT("SizeName")); ++ if (value != NULL) { ++ SetStringProperty(TEXT("win.xpstyle.sizeName"), value); ++ free(value); ++ value = NULL; ++ } ++ value = getXPStylePropFromReg(TEXT("ColorName")); ++ if (value != NULL) { ++ SetStringProperty(TEXT("win.xpstyle.colorName"), value); ++ free(value); ++ } + } +- value = getXPStylePropFromReg(TEXT("DllName")); +- if (value != NULL) { +- SetStringProperty(TEXT("win.xpstyle.dllName"), value); +- free(value); +- } +- value = getXPStylePropFromReg(TEXT("SizeName")); +- if (value != NULL) { +- SetStringProperty(TEXT("win.xpstyle.sizeName"), value); +- free(value); +- } +- value = getXPStylePropFromReg(TEXT("ColorName")); +- if (value != NULL) { +- SetStringProperty(TEXT("win.xpstyle.colorName"), value); +- free(value); ++ catch (std::bad_alloc&) { ++ if (value != NULL) { ++ free(value); ++ } ++ throw; + } + } + +@@ -564,27 +581,37 @@ + // Shell Icon BPP - only honored on platforms before XP + value = getWindowsPropFromReg(TEXT("Control Panel\\Desktop\\WindowMetrics"), + TEXT("Shell Icon BPP"), &valueType); +- if (value != NULL) { +- if (valueType == REG_SZ) { +- SetStringProperty(TEXT("win.icon.shellIconBPP"), value); ++ ++ try { ++ if (value != NULL) { ++ if (valueType == REG_SZ) { ++ SetStringProperty(TEXT("win.icon.shellIconBPP"), value); ++ } ++ free(value); ++ value = NULL; + } +- free(value); ++ ++ ++ // The following registry settings control the file chooser places bar ++ // under the Windows L&F. These settings are not present by default, but ++ // can be enabled using the TweakUI tool from Microsoft. For more info, ++ // see http://msdn.microsoft.com/msdnmag/issues/1100/Registry/ ++ ++ // NoPlacesBar is a REG_DWORD, with values 0 or 1 ++ value = getWindowsPropFromReg(TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\comdlg32"), ++ TEXT("NoPlacesBar"), &valueType); ++ if (value != NULL) { ++ if (valueType == REG_DWORD) { ++ SetBooleanProperty(TEXT("win.comdlg.noPlacesBar"), (BOOL)((int)*value != 0)); ++ } ++ free(value); ++ } + } +- +- +- // The following registry settings control the file chooser places bar +- // under the Windows L&F. These settings are not present by default, but +- // can be enabled using the TweakUI tool from Microsoft. For more info, +- // see http://msdn.microsoft.com/msdnmag/issues/1100/Registry/ +- +- // NoPlacesBar is a REG_DWORD, with values 0 or 1 +- value = getWindowsPropFromReg(TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\comdlg32"), +- TEXT("NoPlacesBar"), &valueType); +- if (value != NULL) { +- if (valueType == REG_DWORD) { +- SetBooleanProperty(TEXT("win.comdlg.noPlacesBar"), (BOOL)((int)*value != 0)); ++ catch (std::bad_alloc&) { ++ if (value != NULL) { ++ free(value); + } +- free(value); ++ throw; + } + + LPTSTR valueName = TEXT("PlaceN"); +@@ -592,7 +619,15 @@ + lstrcpy(valueNameBuf, valueName); + + LPTSTR propKey = TEXT("win.comdlg.placesBarPlaceN"); +- LPTSTR propKeyBuf = (LPTSTR)SAFE_SIZE_ARRAY_ALLOC(safe_Malloc, (lstrlen(propKey) + 1), sizeof(TCHAR)); ++ ++ LPTSTR propKeyBuf; ++ try { ++ propKeyBuf = (LPTSTR)SAFE_SIZE_ARRAY_ALLOC(safe_Malloc, (lstrlen(propKey) + 1), sizeof(TCHAR)); ++ } ++ catch (std::bad_alloc&) { ++ free(valueNameBuf); ++ throw; ++ } + lstrcpy(propKeyBuf, propKey); + + int i = 0; +@@ -601,20 +636,31 @@ + propKeyBuf[25] = valueNameBuf[5]; + + LPTSTR key = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\comdlg32\\PlacesBar"); +- if ((value = getWindowsPropFromReg(key, valueNameBuf, &valueType)) != NULL) { +- if (valueType == REG_DWORD) { +- // Value is a CSIDL +- SetIntegerProperty(propKeyBuf, (int)*value); +- } else { +- // Value is a path +- SetStringProperty(propKeyBuf, value); ++ try { ++ value = NULL; ++ if ((value = getWindowsPropFromReg(key, valueNameBuf, &valueType)) != NULL) { ++ if (valueType == REG_DWORD) { ++ // Value is a CSIDL ++ SetIntegerProperty(propKeyBuf, (int)*value); ++ } else { ++ // Value is a path ++ SetStringProperty(propKeyBuf, value); ++ } ++ free(value); + } +- free(value); ++ } ++ catch (std::bad_alloc&) { ++ if (value != NULL) { ++ free(value); ++ } ++ free(propKeyBuf); ++ free(valueNameBuf); ++ throw; + } + } while (value != NULL); + ++ free(propKeyBuf); + free(valueNameBuf); +- free(propKeyBuf); + } + + void AwtDesktopProperties::GetSoundEvents() { +@@ -656,14 +702,26 @@ + + void AwtDesktopProperties::SetStringProperty(LPCTSTR propName, LPTSTR value) { + jstring key = JNU_NewStringPlatform(GetEnv(), propName); ++ if (key == NULL) { ++ throw std::bad_alloc(); ++ } ++ jstring jValue = JNU_NewStringPlatform(GetEnv(), value); ++ if (jValue == NULL) { ++ GetEnv()->DeleteLocalRef(key); ++ throw std::bad_alloc(); ++ } + GetEnv()->CallVoidMethod(self, + AwtDesktopProperties::setStringPropertyID, +- key, JNU_NewStringPlatform(GetEnv(), value)); ++ key, jValue); ++ GetEnv()->DeleteLocalRef(jValue); + GetEnv()->DeleteLocalRef(key); + } + + void AwtDesktopProperties::SetIntegerProperty(LPCTSTR propName, int value) { + jstring key = JNU_NewStringPlatform(GetEnv(), propName); ++ if (key == NULL) { ++ throw std::bad_alloc(); ++ } + GetEnv()->CallVoidMethod(self, + AwtDesktopProperties::setIntegerPropertyID, + key, (jint)value); +@@ -672,6 +730,9 @@ + + void AwtDesktopProperties::SetBooleanProperty(LPCTSTR propName, BOOL value) { + jstring key = JNU_NewStringPlatform(GetEnv(), propName); ++ if (key == NULL) { ++ throw std::bad_alloc(); ++ } + GetEnv()->CallVoidMethod(self, + AwtDesktopProperties::setBooleanPropertyID, + key, value ? JNI_TRUE : JNI_FALSE); +@@ -680,6 +741,9 @@ + + void AwtDesktopProperties::SetColorProperty(LPCTSTR propName, DWORD value) { + jstring key = JNU_NewStringPlatform(GetEnv(), propName); ++ if (key == NULL) { ++ throw std::bad_alloc(); ++ } + GetEnv()->CallVoidMethod(self, + AwtDesktopProperties::setColorPropertyID, + key, GetRValue(value), GetGValue(value), +@@ -720,6 +784,11 @@ + else { + fontName = JNU_NewStringPlatform(GetEnv(), face); + } ++ if (fontName == NULL) { ++ delete[] face; ++ throw std::bad_alloc(); ++ } ++ + jint pointSize = metrics.tmHeight - + metrics.tmInternalLeading; + jint style = java_awt_Font_PLAIN; +@@ -732,11 +801,16 @@ + } + + jstring key = JNU_NewStringPlatform(GetEnv(), propName); ++ if (key == NULL) { ++ GetEnv()->DeleteLocalRef(fontName); ++ delete[] face; ++ throw std::bad_alloc(); ++ } + GetEnv()->CallVoidMethod(self, + AwtDesktopProperties::setFontPropertyID, + key, fontName, style, pointSize); ++ GetEnv()->DeleteLocalRef(key); + GetEnv()->DeleteLocalRef(fontName); +- GetEnv()->DeleteLocalRef(key); + } + } + delete[] face; +@@ -750,7 +824,9 @@ + jint style; + + fontName = JNU_NewStringPlatform(GetEnv(), font.lfFaceName); +- ++ if (fontName == NULL) { ++ throw std::bad_alloc(); ++ } + #if 0 + HDC hdc; + int pixelsPerInch = GetDeviceCaps(hdc, LOGPIXELSY); +@@ -773,22 +849,31 @@ + } + + jstring key = JNU_NewStringPlatform(GetEnv(), propName); ++ if (key == NULL) { ++ GetEnv()->DeleteLocalRef(fontName); ++ throw std::bad_alloc(); ++ } + GetEnv()->CallVoidMethod(self, AwtDesktopProperties::setFontPropertyID, + key, fontName, style, pointSize); +- ++ GetEnv()->DeleteLocalRef(key); + GetEnv()->DeleteLocalRef(fontName); +- GetEnv()->DeleteLocalRef(key); + } + + void AwtDesktopProperties::SetSoundProperty(LPCTSTR propName, LPCTSTR winEventName) { + jstring key = JNU_NewStringPlatform(GetEnv(), propName); ++ if (key == NULL) { ++ throw std::bad_alloc(); ++ } + jstring event = JNU_NewStringPlatform(GetEnv(), winEventName); ++ if (event == NULL) { ++ GetEnv()->DeleteLocalRef(key); ++ throw std::bad_alloc(); ++ } + GetEnv()->CallVoidMethod(self, + AwtDesktopProperties::setSoundPropertyID, + key, event); +- ++ GetEnv()->DeleteLocalRef(event); + GetEnv()->DeleteLocalRef(key); +- GetEnv()->DeleteLocalRef(event); + } + + void AwtDesktopProperties::PlayWindowsSound(LPCTSTR event) { +@@ -814,24 +899,37 @@ + + AwtDesktopProperties::pDataID = env->GetFieldID(cls, "pData", "J"); + DASSERT(AwtDesktopProperties::pDataID != 0); ++ CHECK_NULL(AwtDesktopProperties::pDataID); + +- AwtDesktopProperties::setBooleanPropertyID = env->GetMethodID(cls, "setBooleanProperty", "(Ljava/lang/String;Z)V"); ++ AwtDesktopProperties::setBooleanPropertyID = ++ env->GetMethodID(cls, "setBooleanProperty", "(Ljava/lang/String;Z)V"); + DASSERT(AwtDesktopProperties::setBooleanPropertyID != 0); ++ CHECK_NULL(AwtDesktopProperties::setBooleanPropertyID); + +- AwtDesktopProperties::setIntegerPropertyID = env->GetMethodID(cls, "setIntegerProperty", "(Ljava/lang/String;I)V"); ++ AwtDesktopProperties::setIntegerPropertyID = ++ env->GetMethodID(cls, "setIntegerProperty", "(Ljava/lang/String;I)V"); + DASSERT(AwtDesktopProperties::setIntegerPropertyID != 0); ++ CHECK_NULL(AwtDesktopProperties::setIntegerPropertyID); + +- AwtDesktopProperties::setStringPropertyID = env->GetMethodID(cls, "setStringProperty", "(Ljava/lang/String;Ljava/lang/String;)V"); ++ AwtDesktopProperties::setStringPropertyID = ++ env->GetMethodID(cls, "setStringProperty", "(Ljava/lang/String;Ljava/lang/String;)V"); + DASSERT(AwtDesktopProperties::setStringPropertyID != 0); ++ CHECK_NULL(AwtDesktopProperties::setStringPropertyID); + +- AwtDesktopProperties::setColorPropertyID = env->GetMethodID(cls, "setColorProperty", "(Ljava/lang/String;III)V"); ++ AwtDesktopProperties::setColorPropertyID = ++ env->GetMethodID(cls, "setColorProperty", "(Ljava/lang/String;III)V"); + DASSERT(AwtDesktopProperties::setColorPropertyID != 0); ++ CHECK_NULL(AwtDesktopProperties::setColorPropertyID); + +- AwtDesktopProperties::setFontPropertyID = env->GetMethodID(cls, "setFontProperty", "(Ljava/lang/String;Ljava/lang/String;II)V"); ++ AwtDesktopProperties::setFontPropertyID = ++ env->GetMethodID(cls, "setFontProperty", "(Ljava/lang/String;Ljava/lang/String;II)V"); + DASSERT(AwtDesktopProperties::setFontPropertyID != 0); ++ CHECK_NULL(AwtDesktopProperties::setFontPropertyID); + +- AwtDesktopProperties::setSoundPropertyID = env->GetMethodID(cls, "setSoundProperty", "(Ljava/lang/String;Ljava/lang/String;)V"); ++ AwtDesktopProperties::setSoundPropertyID = ++ env->GetMethodID(cls, "setSoundProperty", "(Ljava/lang/String;Ljava/lang/String;)V"); + DASSERT(AwtDesktopProperties::setSoundPropertyID != 0); ++ CHECK_NULL(AwtDesktopProperties::setSoundPropertyID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_Dialog.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Dialog.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -23,6 +23,7 @@ + * questions. + */ + ++#include "jni_util.h" + #include "awt_Toolkit.h" + #include "awt_Dialog.h" + #include "awt_Window.h" +@@ -457,18 +458,26 @@ + { + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + +- jclass wwindowPeerCls = env->FindClass("sun/awt/windows/WWindowPeer"); +- jmethodID getActiveWindowsMID = env->GetStaticMethodID(wwindowPeerCls, +- "getActiveWindowHandles", "()[J"); +- DASSERT(getActiveWindowsMID != NULL); +- jlongArray windows = (jlongArray)(env->CallStaticObjectMethod(wwindowPeerCls, +- getActiveWindowsMID)); ++ jboolean exc; ++ jlongArray windows = (jlongArray) JNU_CallStaticMethodByName ++ (env, ++ &exc, ++ "sun/awt/windows/WWindowPeer", ++ "getActiveWindowHandles", ++ "(Ljava/awt/Component;)[J", ++ dialogTarget).l; ++ if (exc == JNI_TRUE) { ++ throw std::bad_alloc(); ++ } + if (windows == NULL) { + return; + } + + jboolean isCopy; + jlong *ws = env->GetLongArrayElements(windows, &isCopy); ++ if (ws == NULL) { ++ throw std::bad_alloc(); ++ } + int windowsCount = env->GetArrayLength(windows); + for (int i = windowsCount - 1; i >= 0; i--) { + HWND w = (HWND)ws[i]; +@@ -744,11 +753,13 @@ + /* java.awt.Dialog fields and methods */ + AwtDialog::titleID + = env->GetFieldID(cls, "title", "Ljava/lang/String;"); ++ DASSERT(AwtDialog::titleID != NULL); ++ CHECK_NULL(AwtDialog::titleID); ++ + AwtDialog::undecoratedID + = env->GetFieldID(cls,"undecorated","Z"); +- + DASSERT(AwtDialog::undecoratedID != NULL); +- DASSERT(AwtDialog::titleID != NULL); ++ CHECK_NULL(AwtDialog::undecoratedID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_Dimension.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Dimension.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 1999, 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 +@@ -44,9 +44,10 @@ + TRY; + + AwtDimension::widthID = env->GetFieldID(cls, "width", "I"); ++ DASSERT(AwtDimension::widthID != NULL); ++ CHECK_NULL(AwtDimension::widthID); ++ + AwtDimension::heightID = env->GetFieldID(cls, "height", "I"); +- +- DASSERT(AwtDimension::widthID != NULL); + DASSERT(AwtDimension::heightID != NULL); + + CATCH_BAD_ALLOC; +--- ./jdk/src/windows/native/sun/windows/awt_DnDDS.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_DnDDS.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -643,6 +643,7 @@ + m_lastmods == modifiers) {//cannot move before cursor change + call_dSCmouseMoved(env, m_peer, + m_actions, modifiers, dragPoint.x, dragPoint.y); ++ JNU_CHECK_EXCEPTION_RETURN(env, E_UNEXPECTED); + m_dragPoint = dragPoint; + } + +@@ -977,6 +978,10 @@ + if ((matchedFormatEtc.tymed & TYMED_ISTREAM) != 0) { + jboolean isCopy; + jbyte *bBytes = env->GetByteArrayElements(bytes, &isCopy); ++ if (bBytes == NULL) { ++ env->PopLocalFrame(NULL); ++ return E_UNEXPECTED; ++ } + + ULONG act; + HRESULT res = pmedium->pstm->Write((const void *)bBytes, (ULONG)nBytes, +--- ./jdk/src/windows/native/sun/windows/awt_DnDDT.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_DnDDT.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -603,6 +603,10 @@ + jobject local = JNU_NewStringPlatform( + env, + pmedium->lpszFileName); ++ if (env->ExceptionCheck()) { ++ hr = E_OUTOFMEMORY; ++ break; ++ } + jstring fileName = (jstring)env->NewGlobalRef(local); + env->DeleteLocalRef(local); + +@@ -1220,8 +1224,6 @@ + + /*****************************************************************************/ + +-jclass WDTCPIStreamWrapper::javaIOExceptionClazz = (jclass)NULL; +- + /** + * construct a wrapper + */ +@@ -1233,16 +1235,6 @@ + m_istream = stgmedium->pstm; + m_istream->AddRef(); + m_mutex = ::CreateMutex(NULL, FALSE, NULL); +- +- if (javaIOExceptionClazz == (jclass)NULL) { +- javaIOExceptionClazz = env->FindClass("java/io/IOException"); +- +- if (JNU_IsNull(env, javaIOExceptionClazz)) { +- env->ThrowNew(env->FindClass("java/lang/ClassNotFoundException"), +- "Cant find java/io/IOException" +- ); +- } +- } + } + + /** +@@ -1291,12 +1283,12 @@ + JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + if (m_istream->Stat(&m_statstg, STATFLAG_NONAME) != S_OK) { +- env->ThrowNew(javaIOExceptionClazz, "IStream::Stat() failed"); ++ JNU_ThrowIOException(env, "IStream::Stat() failed"); + return 0; + } + + if (m_statstg.cbSize.QuadPart > 0x7ffffffL) { +- env->ThrowNew(javaIOExceptionClazz, "IStream::Stat() cbSize > 0x7ffffff"); ++ JNU_ThrowIOException(env, "IStream::Stat() cbSize > 0x7ffffff"); + return 0; + } + +@@ -1349,7 +1341,7 @@ + return (jint)(actual == 0 ? -1 : b); + + default: +- env->ThrowNew(javaIOExceptionClazz, "IStream::Read failed"); ++ JNU_ThrowIOException(env, "IStream::Read failed"); + } + return (jint)-1; + } +@@ -1394,6 +1386,7 @@ + ULONG actual = 0; + jbyte* local = env->GetByteArrayElements(buf, &isCopy); + HRESULT res; ++ CHECK_NULL_RETURN(local, (jint)-1); + + switch (res = m_istream->Read((void *)(local + off), (ULONG)len, &actual)) { + case S_FALSE: +@@ -1406,7 +1399,7 @@ + + default: + env->ReleaseByteArrayElements(buf, local, JNI_ABORT); +- env->ThrowNew(javaIOExceptionClazz, "IStream::Read failed"); ++ JNU_ThrowIOException(env, "IStream::Read failed"); + } + + return (jint)-1; +--- ./jdk/src/windows/native/sun/windows/awt_Event.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Event.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 1999, 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 +@@ -45,12 +45,16 @@ + TRY; + + AwtEvent::targetID = env->GetFieldID(cls, "target", "Ljava/lang/Object;"); ++ DASSERT(AwtEvent::targetID != NULL); ++ CHECK_NULL(AwtEvent::targetID); ++ + AwtEvent::xID = env->GetFieldID(cls, "x", "I"); ++ DASSERT(AwtEvent::xID != NULL); ++ CHECK_NULL(AwtEvent::xID); ++ + AwtEvent::yID = env->GetFieldID(cls, "y", "I"); +- +- DASSERT(AwtEvent::targetID != NULL); +- DASSERT(AwtEvent::xID != NULL); + DASSERT(AwtEvent::yID != NULL); ++ CHECK_NULL(AwtEvent::yID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_FileDialog.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_FileDialog.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -180,6 +180,9 @@ + return TRUE; + } + jstring strPath = JNU_NewStringPlatform(env, szPath); ++ if (strPath == NULL) { ++ throw std::bad_alloc(); ++ } + // Call FilenameFilter.accept with path and filename + UINT uRes = (env->CallBooleanMethod(peer, + AwtFileDialog::checkFilenameFilterMID, strPath) == JNI_TRUE); +@@ -269,6 +272,9 @@ + + if (title == NULL || env->GetStringLength(title)==0) { + title = JNU_NewStringPlatform(env, L" "); ++ if (title == NULL) { ++ throw std::bad_alloc(); ++ } + } + + JavaStringBuffer titleBuffer(env, title); +@@ -376,6 +382,9 @@ + ? (jint)GetBufferLength(ofn.lpstrFile, ofn.nMaxFile) + : (jint)_tcslen(ofn.lpstrFile); + jcharArray jnames = env->NewCharArray(length); ++ if (jnames == NULL) { ++ throw std::bad_alloc(); ++ } + env->SetCharArrayRegion(jnames, 0, length, (jchar*)ofn.lpstrFile); + + env->CallVoidMethod(peer, AwtFileDialog::handleSelectedMID, jnames); +@@ -500,38 +509,55 @@ + + AwtFileDialog::parentID = + env->GetFieldID(cls, "parent", "Lsun/awt/windows/WComponentPeer;"); ++ DASSERT(AwtFileDialog::parentID != NULL); ++ CHECK_NULL(AwtFileDialog::parentID); ++ + AwtFileDialog::fileFilterID = + env->GetFieldID(cls, "fileFilter", "Ljava/io/FilenameFilter;"); +- AwtFileDialog::setHWndMID = +- env->GetMethodID(cls, "setHWnd", "(J)V"); ++ DASSERT(AwtFileDialog::fileFilterID != NULL); ++ CHECK_NULL(AwtFileDialog::fileFilterID); ++ ++ AwtFileDialog::setHWndMID = env->GetMethodID(cls, "setHWnd", "(J)V"); ++ DASSERT(AwtFileDialog::setHWndMID != NULL); ++ CHECK_NULL(AwtFileDialog::setHWndMID); ++ + AwtFileDialog::handleSelectedMID = + env->GetMethodID(cls, "handleSelected", "([C)V"); ++ DASSERT(AwtFileDialog::handleSelectedMID != NULL); ++ CHECK_NULL(AwtFileDialog::handleSelectedMID); ++ + AwtFileDialog::handleCancelMID = + env->GetMethodID(cls, "handleCancel", "()V"); ++ DASSERT(AwtFileDialog::handleCancelMID != NULL); ++ CHECK_NULL(AwtFileDialog::handleCancelMID); ++ + AwtFileDialog::checkFilenameFilterMID = + env->GetMethodID(cls, "checkFilenameFilter", "(Ljava/lang/String;)Z"); ++ DASSERT(AwtFileDialog::checkFilenameFilterMID != NULL); ++ CHECK_NULL(AwtFileDialog::checkFilenameFilterMID); ++ + AwtFileDialog::isMultipleModeMID = env->GetMethodID(cls, "isMultipleMode", "()Z"); ++ DASSERT(AwtFileDialog::isMultipleModeMID != NULL); ++ CHECK_NULL(AwtFileDialog::isMultipleModeMID); + + /* java.awt.FileDialog fields */ + cls = env->FindClass("java/awt/FileDialog"); +- if (cls == NULL) { +- return; +- } ++ CHECK_NULL(cls); ++ + AwtFileDialog::modeID = env->GetFieldID(cls, "mode", "I"); ++ DASSERT(AwtFileDialog::modeID != NULL); ++ CHECK_NULL(AwtFileDialog::modeID); ++ + AwtFileDialog::dirID = env->GetFieldID(cls, "dir", "Ljava/lang/String;"); ++ DASSERT(AwtFileDialog::dirID != NULL); ++ CHECK_NULL(AwtFileDialog::dirID); ++ + AwtFileDialog::fileID = env->GetFieldID(cls, "file", "Ljava/lang/String;"); ++ DASSERT(AwtFileDialog::fileID != NULL); ++ CHECK_NULL(AwtFileDialog::fileID); ++ + AwtFileDialog::filterID = + env->GetFieldID(cls, "filter", "Ljava/io/FilenameFilter;"); +- +- DASSERT(AwtFileDialog::parentID != NULL); +- DASSERT(AwtFileDialog::setHWndMID != NULL); +- DASSERT(AwtFileDialog::handleSelectedMID != NULL); +- DASSERT(AwtFileDialog::handleCancelMID != NULL); +- DASSERT(AwtFileDialog::isMultipleModeMID != NULL); +- +- DASSERT(AwtFileDialog::modeID != NULL); +- DASSERT(AwtFileDialog::dirID != NULL); +- DASSERT(AwtFileDialog::fileID != NULL); + DASSERT(AwtFileDialog::filterID != NULL); + + CATCH_BAD_ALLOC; +--- ./jdk/src/windows/native/sun/windows/awt_Font.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Font.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -49,9 +49,12 @@ + if (obj == NULL) { + return JNI_FALSE; + } +- if (env->EnsureLocalCapacity(2)) ++ if (env->EnsureLocalCapacity(2)) { ++ env->ExceptionClear(); + return JNI_FALSE; ++ } + jobject peer = env->CallObjectMethod(obj, AwtFont::peerMID); ++ env->ExceptionClear(); + if (peer == NULL) { + return JNI_FALSE; + } +@@ -66,10 +69,12 @@ + { + DASSERT(font != NULL); + if (env->EnsureLocalCapacity(2)) { ++ env->ExceptionClear(); + return NULL; + } + jobject peer = env->CallObjectMethod(font, AwtFont::peerMID); + DASSERT(peer != NULL); ++ if (peer == NULL) return NULL; + jstring textComponentFontName = + (jstring) env->GetObjectField(peer, AwtFont::textComponentFontNameID); + env->DeleteLocalRef(peer); +@@ -191,6 +196,9 @@ + } + + awtFont = Create(env, font, angle, awScale); ++ if (awtFont == NULL) { ++ return NULL; ++ } + + env->SetLongField(font, AwtFont::pDataID, + reinterpret_cast<jlong>(awtFont)); +@@ -272,6 +280,9 @@ + if (cfnum > 0) { + // Ask peer class for the text component font name + jstring jTextComponentFontName = GetTextComponentFontName(env, font); ++ if (jTextComponentFontName == NULL) { ++ return NULL; ++ } + LPCWSTR textComponentFontName = JNU_GetStringPlatformChars(env, jTextComponentFontName, NULL); + + awtFont->m_textInput = -1; +@@ -285,6 +296,9 @@ + AwtFont::nativeNameID); + wName = JNU_GetStringPlatformChars(env, nativeName, NULL); + DASSERT(wName); ++ if (wName == NULL) { ++ wName = L"Arial"; ++ } + + //On NT platforms, if the font is not Symbol or Dingbats + //use "W" version of Win32 APIs directly, info the FontDescription +@@ -321,7 +335,12 @@ + // Instantiation for English version. + jstring fontName = (jstring)env->GetObjectField(font, + AwtFont::nameID); ++ if (fontName != NULL) { + wName = JNU_GetStringPlatformChars(env, fontName, NULL); ++ } ++ if (wName == NULL) { ++ wName = L"Arial"; ++ } + + WCHAR* wEName; + if (!wcscmp(wName, L"Helvetica") || !wcscmp(wName, L"SansSerif")) { +@@ -647,6 +666,9 @@ + //"useUnicode" field might not be initialized correctly (font in Menu Component, + //for example"). + AwtFont* awtFont = AwtFont::GetFont(env, font); ++ if (awtFont == NULL) { ++ return size; ++ } + + if (IsMultiFont(env, font)) { + jobject peer = env->CallObjectMethod(font, AwtFont::peerMID); +@@ -668,6 +690,9 @@ + if (arrayLength == 0) { + int length = env->GetStringLength(str); + LPCWSTR strW = JNU_GetStringPlatformChars(env, str, NULL); ++ if (strW == NULL) { ++ return size; ++ } + VERIFY(::SelectObject(hDC, awtFont->GetHFont())); + if (AwtComponent::GetRTLReadingOrder()){ + VERIFY(!draw || ::ExtTextOut(hDC, x, y, ETO_RTLREADING, NULL, +@@ -692,6 +717,9 @@ + } + + int fdIndex = getFontDescriptorNumber(env, font, fontDescriptor); ++ if (env->ExceptionCheck()) { ++ return size; //fdIndex==0 return could be exception or not. ++ } + VERIFY(::SelectObject(hDC, awtFont->GetHFont(fdIndex))); + + /* +@@ -705,10 +733,14 @@ + * extend buflen and bad things will happen. + */ + unsigned char* buffer = NULL; +- jboolean unicodeUsed = env->GetBooleanField(fontDescriptor, AwtFont::useUnicodeID); ++ jboolean unicodeUsed = ++ env->GetBooleanField(fontDescriptor, AwtFont::useUnicodeID); + try { + buffer = (unsigned char *) + env->GetPrimitiveArrayCritical(convertedBytes, 0); ++ if (buffer == NULL) { ++ return size; ++ } + int buflen = (buffer[0] << 24) | (buffer[1] << 16) | + (buffer[2] << 8) | buffer[3]; + +@@ -816,8 +848,11 @@ + jchar *strp = new jchar[len]; + env->GetCharArrayRegion(str, off, len, strp); + jstring jstr = env->NewString(strp, len); +- jint result = Java_sun_awt_windows_WFontMetrics_stringWidth(env, self, ++ jint result = 0; ++ if (jstr != NULL) { ++ result = Java_sun_awt_windows_WFontMetrics_stringWidth(env, self, + jstr); ++ } + delete [] strp; + return result; + +@@ -850,13 +885,25 @@ + try { + jintArray array = (jintArray)env->GetObjectField(self, + AwtFont::widthsID); ++ if (array == NULL) { ++ JNU_ThrowNullPointerException(env, "Can't access widths array."); ++ return NULL; ++ } + pStrBody = (char *)env->GetPrimitiveArrayCritical(str, 0); ++ if (pStrBody == NULL) { ++ JNU_ThrowNullPointerException(env, "Can't access str bytes."); ++ return NULL; ++ } + char *pStr = pStrBody + off; + + jint *widths = NULL; + try { + widths = (jint *)env->GetPrimitiveArrayCritical(array, 0); +- ++ if (widths == NULL) { ++ env->ReleasePrimitiveArrayCritical(str, pStrBody, 0); ++ JNU_ThrowNullPointerException(env, "Can't access widths."); ++ return NULL; ++ } + for (; len; len--) { + result += widths[*pStr++]; + } +@@ -915,29 +962,15 @@ + JNIEXPORT void JNICALL + Java_sun_awt_windows_WFontMetrics_initIDs(JNIEnv *env, jclass cls) + { +- TRY; +- +- AwtFont::widthsID = env->GetFieldID(cls, "widths", "[I"); +- AwtFont::ascentID = env->GetFieldID(cls, "ascent", "I"); +- AwtFont::descentID = env->GetFieldID(cls, "descent", "I"); +- AwtFont::leadingID = env->GetFieldID(cls, "leading", "I"); +- AwtFont::heightID = env->GetFieldID(cls, "height", "I"); +- AwtFont::maxAscentID = env->GetFieldID(cls, "maxAscent", "I"); +- AwtFont::maxDescentID = env->GetFieldID(cls, "maxDescent", "I"); +- AwtFont::maxHeightID = env->GetFieldID(cls, "maxHeight", "I"); ++ CHECK_NULL(AwtFont::widthsID = env->GetFieldID(cls, "widths", "[I")); ++ CHECK_NULL(AwtFont::ascentID = env->GetFieldID(cls, "ascent", "I")); ++ CHECK_NULL(AwtFont::descentID = env->GetFieldID(cls, "descent", "I")); ++ CHECK_NULL(AwtFont::leadingID = env->GetFieldID(cls, "leading", "I")); ++ CHECK_NULL(AwtFont::heightID = env->GetFieldID(cls, "height", "I")); ++ CHECK_NULL(AwtFont::maxAscentID = env->GetFieldID(cls, "maxAscent", "I")); ++ CHECK_NULL(AwtFont::maxDescentID = env->GetFieldID(cls, "maxDescent", "I")); ++ CHECK_NULL(AwtFont::maxHeightID = env->GetFieldID(cls, "maxHeight", "I")); + AwtFont::maxAdvanceID = env->GetFieldID(cls, "maxAdvance", "I"); +- +- DASSERT(AwtFont::widthsID != NULL); +- DASSERT(AwtFont::ascentID != NULL); +- DASSERT(AwtFont::descentID != NULL); +- DASSERT(AwtFont::leadingID != NULL); +- DASSERT(AwtFont::heightID != NULL); +- DASSERT(AwtFont::maxAscentID != NULL); +- DASSERT(AwtFont::maxDescentID != NULL); +- DASSERT(AwtFont::maxHeightID != NULL); +- DASSERT(AwtFont::maxAdvanceID != NULL); +- +- CATCH_BAD_ALLOC; + } + + } /* extern "C" */ +@@ -952,28 +985,16 @@ + JNIEXPORT void JNICALL + Java_java_awt_Font_initIDs(JNIEnv *env, jclass cls) + { +- TRY; +- +- AwtFont::peerMID = env->GetMethodID(cls, "getPeer", +- "()Ljava/awt/peer/FontPeer;"); +- AwtFont::pDataID = env->GetFieldID(cls, "pData", "J"); +- AwtFont::nameID = env->GetFieldID(cls, "name", "Ljava/lang/String;"); +- AwtFont::sizeID = env->GetFieldID(cls, "size", "I"); +- AwtFont::styleID = env->GetFieldID(cls, "style", "I"); +- ++ CHECK_NULL(AwtFont::peerMID = env->GetMethodID(cls, "getPeer", ++ "()Ljava/awt/peer/FontPeer;")); ++ CHECK_NULL(AwtFont::pDataID = env->GetFieldID(cls, "pData", "J")); ++ CHECK_NULL(AwtFont::nameID = ++ env->GetFieldID(cls, "name", "Ljava/lang/String;")); ++ CHECK_NULL(AwtFont::sizeID = env->GetFieldID(cls, "size", "I")); ++ CHECK_NULL(AwtFont::styleID = env->GetFieldID(cls, "style", "I")); + AwtFont::getFontMID = + env->GetStaticMethodID(cls, "getFont", + "(Ljava/lang/String;)Ljava/awt/Font;"); +- +- DASSERT(AwtFont::peerMID != NULL); +- DASSERT(AwtFont::pDataID != NULL); +- DASSERT(AwtFont::nameID != NULL); +- DASSERT(AwtFont::sizeID != NULL); +- DASSERT(AwtFont::styleID != NULL); +- +- DASSERT(AwtFont::getFontMID != NULL); +- +- CATCH_BAD_ALLOC; + } + + } /* extern "C" */ +@@ -988,15 +1009,9 @@ + JNIEXPORT void JNICALL + Java_java_awt_FontMetrics_initIDs(JNIEnv *env, jclass cls) + { +- TRY; +- +- AwtFont::fontID = env->GetFieldID(cls, "font", "Ljava/awt/Font;"); ++ CHECK_NULL(AwtFont::fontID = ++ env->GetFieldID(cls, "font", "Ljava/awt/Font;")); + AwtFont::getHeightMID = env->GetMethodID(cls, "getHeight", "()I"); +- +- DASSERT(AwtFont::fontID); +- DASSERT(AwtFont::getHeightMID); +- +- CATCH_BAD_ALLOC; + } + + } /* extern "C" */ +@@ -1010,16 +1025,10 @@ + JNIEXPORT void JNICALL + Java_sun_awt_FontDescriptor_initIDs(JNIEnv *env, jclass cls) + { +- TRY; +- +- AwtFont::nativeNameID = env->GetFieldID(cls, "nativeName", +- "Ljava/lang/String;"); ++ CHECK_NULL(AwtFont::nativeNameID = ++ env->GetFieldID(cls, "nativeName", "Ljava/lang/String;")); + AwtFont::useUnicodeID = env->GetFieldID(cls, "useUnicode", "Z"); + +- DASSERT(AwtFont::nativeNameID != NULL); +- DASSERT(AwtFont::useUnicodeID != NULL); +- +- CATCH_BAD_ALLOC; + } + + } /* extern "C" */ +@@ -1034,20 +1043,13 @@ + JNIEXPORT void JNICALL + Java_sun_awt_PlatformFont_initIDs(JNIEnv *env, jclass cls) + { +- TRY; +- +- AwtFont::fontConfigID = env->GetFieldID(cls, "fontConfig", "Lsun/awt/FontConfiguration;"); +- AwtFont::componentFontsID = +- env->GetFieldID(cls, "componentFonts", "[Lsun/awt/FontDescriptor;"); ++ CHECK_NULL(AwtFont::fontConfigID = ++ env->GetFieldID(cls, "fontConfig", "Lsun/awt/FontConfiguration;")); ++ CHECK_NULL(AwtFont::componentFontsID = ++ env->GetFieldID(cls, "componentFonts", "[Lsun/awt/FontDescriptor;")); + AwtFont::makeConvertedMultiFontStringMID = + env->GetMethodID(cls, "makeConvertedMultiFontString", + "(Ljava/lang/String;)[Ljava/lang/Object;"); +- +- DASSERT(AwtFont::makeConvertedMultiFontStringMID != NULL); +- DASSERT(AwtFont::componentFontsID != NULL); +- DASSERT(AwtFont::fontConfigID != NULL); +- +- CATCH_BAD_ALLOC; + } + + } /* extern "C" */ +@@ -1862,8 +1864,10 @@ + static CCombinedSegTableManager tableManager; + + jstring fontName = (jstring)env->GetObjectField(self, AwtFont::fontNameID); +- DASSERT(fontName != NULL); ++ DASSERT(fontName != NULL); // leave in for debug mode. ++ CHECK_NULL_RETURN(fontName, FALSE); // in production, just return + LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL); ++ CHECK_NULL_RETURN(fontNameW, FALSE); + CCombinedSegTable* pTable = tableManager.GetTable(fontNameW); + JNU_ReleaseStringPlatformChars(env, fontName, fontNameW); + return (pTable->In((USHORT) ch) ? JNI_TRUE : JNI_FALSE); +--- ./jdk/src/windows/native/sun/windows/awt_Frame.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Frame.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -173,8 +173,11 @@ + BOOL isEmbeddedInstance = FALSE; + BOOL isEmbedded = FALSE; + cls = env->FindClass("sun/awt/EmbeddedFrame"); ++ + if (cls) { + isEmbeddedInstance = env->IsInstanceOf(target, cls); ++ } else { ++ throw std::bad_alloc(); + } + INT_PTR handle; + if (isEmbeddedInstance) { +@@ -189,6 +192,8 @@ + cls = env->FindClass("sun/awt/LightweightFrame"); + if (cls) { + isLightweight = env->IsInstanceOf(target, cls); ++ } else { ++ throw std::bad_alloc(); + } + frame->m_isLightweight = isLightweight; + +@@ -260,7 +265,11 @@ + + // for input method windows, use minimal decorations + inputMethodWindowCls = env->FindClass("sun/awt/im/InputMethodWindow"); +- if ((inputMethodWindowCls != NULL) && env->IsInstanceOf(target, inputMethodWindowCls)) { ++ if (inputMethodWindowCls == NULL) { ++ throw std::bad_alloc(); ++ } ++ ++ if (env->IsInstanceOf(target, inputMethodWindowCls)) { + //for below-the-spot composition window, use no decoration + if (env->GetBooleanField(target, AwtFrame::undecoratedID) == JNI_TRUE){ + exStyle = 0; +@@ -1611,9 +1620,10 @@ + TRY; + + AwtFrame::setExtendedStateMID = env->GetMethodID(cls, "setExtendedState", "(I)V"); ++ DASSERT(AwtFrame::setExtendedStateMID); ++ CHECK_NULL(AwtFrame::setExtendedStateMID); ++ + AwtFrame::getExtendedStateMID = env->GetMethodID(cls, "getExtendedState", "()I"); +- +- DASSERT(AwtFrame::setExtendedStateMID); + DASSERT(AwtFrame::getExtendedStateMID); + + CATCH_BAD_ALLOC; +@@ -1787,35 +1797,6 @@ + + + /************************************************************************ +- * EmbeddedFrame native methods +- */ +- +-extern "C" { +- +-/* +- * Class: sun_awt_EmbeddedFrame +- * Method: setPeer +- * Signature: (Ljava/awt/peer/ComponentPeer;)V +- */ +-JNIEXPORT void JNICALL +-Java_sun_awt_EmbeddedFrame_setPeer(JNIEnv *env, jobject self, jobject lpeer) +-{ +- TRY; +- +- jclass cls; +- jfieldID fid; +- +- cls = env->GetObjectClass(self); +- fid = env->GetFieldID(cls, "peer", "Ljava/awt/peer/ComponentPeer;"); +- env->SetObjectField(self, fid, lpeer); +- +- CATCH_BAD_ALLOC; +-} +- +-} /* extern "C" */ +- +- +-/************************************************************************ + * WEmbeddedFrame native methods + */ + +@@ -1833,6 +1814,7 @@ + + AwtFrame::handleID = env->GetFieldID(cls, "handle", "J"); + DASSERT(AwtFrame::handleID != NULL); ++ CHECK_NULL(AwtFrame::handleID); + + AwtFrame::activateEmbeddingTopLevelMID = env->GetMethodID(cls, "activateEmbeddingTopLevel", "()V"); + DASSERT(AwtFrame::activateEmbeddingTopLevelMID != NULL); +--- ./jdk/src/windows/native/sun/windows/awt_InputMethod.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_InputMethod.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -320,13 +320,18 @@ + // current language ID (returned from 'getJavaIDFromLangID') is in + // ASCII encoding, so we use 'GetStringUTFChars' to retrieve requested + // language ID from the 'localeString' object. +- const char * current = getJavaIDFromLangID(AwtComponent::GetInputLanguage()); + jboolean isCopy; + const char * requested = env->GetStringUTFChars(localeString, &isCopy); +- if ((current != NULL) && (strcmp(current, requested) == 0)) { +- env->ReleaseStringUTFChars(localeString, requested); ++ CHECK_NULL_RETURN(requested, JNI_FALSE); ++ ++ const char * current = getJavaIDFromLangID(AwtComponent::GetInputLanguage()); ++ if (current != NULL) { ++ if (strcmp(current, requested) == 0) { ++ env->ReleaseStringUTFChars(localeString, requested); ++ free((void *)current); ++ return JNI_TRUE; ++ } + free((void *)current); +- return JNI_TRUE; + } + + // get list of available HKLs. Adding the user's preferred layout on top of the layout +@@ -334,7 +339,10 @@ + // looking up suitable layout. + int layoutCount = ::GetKeyboardLayoutList(0, NULL) + 1; // +1 for user's preferred HKL + HKL FAR * hKLList = (HKL FAR *)SAFE_SIZE_ARRAY_ALLOC(safe_Malloc, sizeof(HKL), layoutCount); +- DASSERT(!safe_ExceptionOccurred(env)); ++ if (hKLList == NULL) { ++ env->ReleaseStringUTFChars(localeString, requested); ++ return JNI_FALSE; ++ } + ::GetKeyboardLayoutList(layoutCount - 1, &(hKLList[1])); + hKLList[0] = getDefaultKeyboardLayout(); // put user's preferred layout on top of the list + +@@ -342,20 +350,23 @@ + jboolean retValue = JNI_FALSE; + for (int i = 0; i < layoutCount; i++) { + const char * supported = getJavaIDFromLangID(LOWORD(hKLList[i])); +- if ((supported != NULL) && (strcmp(supported, requested) == 0)) { +- // use special message to call ActivateKeyboardLayout() in main thread. +- if (AwtToolkit::GetInstance().SendMessage(WM_AWT_ACTIVATEKEYBOARDLAYOUT, (WPARAM)onActivate, (LPARAM)hKLList[i])) { +- //also need to change the same keyboard layout for the Java AWT-EventQueue thread +- AwtToolkit::activateKeyboardLayout(hKLList[i]); +- retValue = JNI_TRUE; ++ if (supported != NULL) { ++ if (strcmp(supported, requested) == 0) { ++ // use special message to call ActivateKeyboardLayout() in main thread. ++ if (AwtToolkit::GetInstance().SendMessage(WM_AWT_ACTIVATEKEYBOARDLAYOUT, (WPARAM)onActivate, (LPARAM)hKLList[i])) { ++ //also need to change the same keyboard layout for the Java AWT-EventQueue thread ++ AwtToolkit::activateKeyboardLayout(hKLList[i]); ++ retValue = JNI_TRUE; ++ } ++ free((void *)supported); ++ break; + } +- break; ++ free((void *)supported); + } + } + + env->ReleaseStringUTFChars(localeString, requested); + free(hKLList); +- free((void *)current); + return retValue; + + CATCH_BAD_ALLOC_RET(JNI_FALSE); +@@ -443,9 +454,9 @@ + TRY; + + // get list of available HKLs +- int layoutCount = ::GetKeyboardLayoutList(0, NULL); ++ const int layoutCount = ::GetKeyboardLayoutList(0, NULL); + HKL FAR * hKLList = (HKL FAR *)SAFE_SIZE_ARRAY_ALLOC(safe_Malloc, sizeof(HKL), layoutCount); +- DASSERT(!safe_ExceptionOccurred(env)); ++ CHECK_NULL_RETURN(hKLList, NULL); + ::GetKeyboardLayoutList(layoutCount, hKLList); + + // get list of Java locale names while getting rid of duplicates +@@ -453,8 +464,13 @@ + int destIndex = 0; + int javaLocaleNameCount = 0; + int current = 0; ++ + const char ** javaLocaleNames = (const char **)SAFE_SIZE_ARRAY_ALLOC(safe_Malloc, sizeof(char *), layoutCount); +- DASSERT(!safe_ExceptionOccurred(env)); ++ if (javaLocaleNames == NULL) { ++ free(hKLList); ++ return NULL; ++ } ++ + for (; srcIndex < layoutCount; srcIndex++) { + const char * srcLocaleName = getJavaIDFromLangID(LOWORD(hKLList[srcIndex])); + +@@ -477,18 +493,33 @@ + } + } + ++ jobjectArray locales = NULL; + // convert it to an array of Java locale objects + jclass localeClass = env->FindClass("java/util/Locale"); +- jobjectArray locales = env->NewObjectArray(javaLocaleNameCount, localeClass, NULL); ++ if (localeClass != NULL) { ++ locales = env->NewObjectArray(javaLocaleNameCount, localeClass, NULL); ++ if (locales != NULL) { ++ ++ for (current = 0; current < javaLocaleNameCount; current++) { ++ jobject obj = CreateLocaleObject(env, javaLocaleNames[current]); ++ if (env->ExceptionCheck()) { ++ env->DeleteLocalRef(locales); ++ locales = NULL; ++ break; ++ } ++ env->SetObjectArrayElement(locales, ++ current, ++ obj); ++ } ++ ++ } ++ env->DeleteLocalRef(localeClass); ++ } ++ + for (current = 0; current < javaLocaleNameCount; current++) { +- env->SetObjectArrayElement(locales, +- current, +- CreateLocaleObject(env, javaLocaleNames[current])); + free((void *)javaLocaleNames[current]); + } +- DASSERT(!safe_ExceptionOccurred(env)); + +- env->DeleteLocalRef(localeClass); + free(hKLList); + free(javaLocaleNames); + return locales; +@@ -542,6 +573,7 @@ + + // create Locale object + jobject langtagObj = env->NewStringUTF(name); ++ CHECK_NULL_RETURN(langtagObj, NULL); + jobject localeObj = JNU_CallStaticMethodByName(env, + NULL, + "java/util/Locale", +--- ./jdk/src/windows/native/sun/windows/awt_InputTextInfor.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_InputTextInfor.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -132,6 +132,7 @@ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + if (m_cStrW > 0) { + m_jtext = MakeJavaString(env, m_lpStrW, m_cStrW); ++ JNU_CHECK_EXCEPTION_RETURN(env, -1); + } + + // Merge the string if necessary +@@ -251,6 +252,13 @@ + } else { + readingClauseW[cls] = MakeJavaString(env, lpHWStrW, cHWStrW); + } ++ if (env->ExceptionCheck()) { ++ lpBndClauseW = NULL; ++ lpReadingClauseW = NULL; ++ delete [] bndClauseW; ++ delete [] readingClauseW; ++ return 0; ++ } + } + else { + readingClauseW[cls] = NULL; +--- ./jdk/src/windows/native/sun/windows/awt_Insets.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Insets.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -46,14 +46,20 @@ + TRY; + + AwtInsets::leftID = env->GetFieldID(cls, "left", "I"); ++ DASSERT(AwtInsets::leftID != NULL); ++ CHECK_NULL(AwtInsets::leftID); ++ + AwtInsets::rightID = env->GetFieldID(cls, "right", "I"); ++ DASSERT(AwtInsets::rightID != NULL); ++ CHECK_NULL(AwtInsets::rightID); ++ + AwtInsets::topID = env->GetFieldID(cls, "top", "I"); ++ DASSERT(AwtInsets::topID != NULL); ++ CHECK_NULL(AwtInsets::topID); ++ + AwtInsets::bottomID = env->GetFieldID(cls, "bottom", "I"); +- +- DASSERT(AwtInsets::leftID != NULL); +- DASSERT(AwtInsets::rightID != NULL); +- DASSERT(AwtInsets::topID != NULL); + DASSERT(AwtInsets::bottomID != NULL); ++ CHECK_NULL(AwtInsets::bottomID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_KeyEvent.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_KeyEvent.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2009, 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 +@@ -48,19 +48,28 @@ + TRY; + + AwtKeyEvent::keyCodeID = env->GetFieldID(cls, "keyCode", "I"); ++ DASSERT(AwtKeyEvent::keyCodeID != NULL); ++ CHECK_NULL(AwtKeyEvent::keyCodeID); ++ + AwtKeyEvent::keyCharID = env->GetFieldID(cls, "keyChar", "C"); ++ DASSERT(AwtKeyEvent::keyCharID != NULL); ++ CHECK_NULL(AwtKeyEvent::keyCharID); ++ + AwtKeyEvent::rawCodeID = env->GetFieldID(cls, "rawCode", "J"); ++ DASSERT(AwtKeyEvent::rawCodeID != NULL); ++ CHECK_NULL(AwtKeyEvent::rawCodeID); ++ + AwtKeyEvent::primaryLevelUnicodeID = env->GetFieldID(cls, "primaryLevelUnicode", "J"); ++ DASSERT(AwtKeyEvent::primaryLevelUnicodeID != NULL); ++ CHECK_NULL(AwtKeyEvent::primaryLevelUnicodeID); ++ + AwtKeyEvent::scancodeID = env->GetFieldID(cls, "scancode", "J"); ++ DASSERT(AwtKeyEvent::scancodeID != NULL); ++ CHECK_NULL(AwtKeyEvent::scancodeID); ++ + AwtKeyEvent::extendedKeyCodeID = env->GetFieldID(cls, "extendedKeyCode", "J"); +- +- +- DASSERT(AwtKeyEvent::keyCodeID != NULL); +- DASSERT(AwtKeyEvent::keyCharID != NULL); +- DASSERT(AwtKeyEvent::rawCodeID != NULL); +- DASSERT(AwtKeyEvent::primaryLevelUnicodeID != NULL); +- DASSERT(AwtKeyEvent::scancodeID != NULL); + DASSERT(AwtKeyEvent::extendedKeyCodeID != NULL); ++ CHECK_NULL(AwtKeyEvent::extendedKeyCodeID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_Label.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Label.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -319,10 +319,12 @@ + + /* init field ids */ + AwtLabel::textID = env->GetFieldID(cls, "text", "Ljava/lang/String;"); ++ DASSERT(AwtLabel::textID != NULL); ++ CHECK_NULL(AwtLabel::textID); ++ + AwtLabel::alignmentID = env->GetFieldID(cls, "alignment", "I"); +- +- DASSERT(AwtLabel::textID != NULL); + DASSERT(AwtLabel::alignmentID != NULL); ++ CHECK_NULL(AwtLabel::alignmentID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_List.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_List.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -219,7 +219,7 @@ + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + /* Copy current box's contents to string array */ +- int nCount = GetCount(); ++ const int nCount = GetCount(); + LPTSTR * strings = new LPTSTR[nCount]; + int i; + +@@ -614,7 +614,8 @@ + { + LPTSTR itemPtr = NULL; + jstring item = (jstring)env->GetObjectArrayElement(items, i); +- JNI_CHECK_NULL_GOTO(item, "null item", next_item); ++ if (env->ExceptionCheck()) goto ret; ++ if (item == NULL) goto next_item; + itemPtr = (LPTSTR)JNU_GetStringPlatformChars(env, item, 0); + if (itemPtr == NULL) + { +@@ -1017,8 +1018,8 @@ + ses->list = env->NewGlobalRef(self); + ses->index = index; + +- return (jboolean)AwtToolkit::GetInstance().SyncCall( +- (void *(*)(void *))AwtList::_IsSelected, ses); ++ return JNI_IS_TRUE(AwtToolkit::GetInstance().SyncCall( ++ (void *(*)(void *))AwtList::_IsSelected, ses)); + // global ref and ses are deleted in _IsSelected + + CATCH_BAD_ALLOC_RET(FALSE); +--- ./jdk/src/windows/native/sun/windows/awt_Menu.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Menu.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -351,10 +351,11 @@ + TRY; + + AwtMenu::countItemsMID = env->GetMethodID(cls, "countItemsImpl", "()I"); ++ DASSERT(AwtMenu::countItemsMID != NULL); ++ CHECK_NULL(AwtMenu::countItemsMID); ++ + AwtMenu::getItemMID = env->GetMethodID(cls, "getItemImpl", + "(I)Ljava/awt/MenuItem;"); +- +- DASSERT(AwtMenu::countItemsMID != NULL); + DASSERT(AwtMenu::getItemMID != NULL); + + CATCH_BAD_ALLOC; +--- ./jdk/src/windows/native/sun/windows/awt_MenuBar.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_MenuBar.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -268,9 +268,11 @@ + TRY; + + AwtMenuBar::getMenuCountMID = env->GetMethodID(cls, "getMenuCountImpl", "()I"); ++ DASSERT(AwtMenuBar::getMenuCountMID != NULL); ++ CHECK_NULL(AwtMenuBar::getMenuCountMID); ++ + AwtMenuBar::getMenuMID = env->GetMethodID(cls, "getMenuImpl", + "(I)Ljava/awt/Menu;"); +- DASSERT(AwtMenuBar::getMenuCountMID != NULL); + DASSERT(AwtMenuBar::getMenuMID != NULL); + + CATCH_BAD_ALLOC; +--- ./jdk/src/windows/native/sun/windows/awt_MenuItem.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_MenuItem.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -152,6 +152,9 @@ + if (dw == ERROR_OUTOFMEMORY) + { + jstring errorMsg = JNU_NewStringPlatform(env, L"too many menu handles"); ++ if (errorMsg == NULL) { ++ throw std::bad_alloc(); ++ } + createError = JNU_NewObjectByName(env, "java/lang/OutOfMemoryError", + "(Ljava/lang/String;)V", + errorMsg); +@@ -164,16 +167,19 @@ + NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&buf, 0, NULL); + jstring s = JNU_NewStringPlatform(env, buf); ++ if (s == NULL) { ++ throw std::bad_alloc(); ++ } + createError = JNU_NewObjectByName(env, "java/lang/InternalError", + "(Ljava/lang/String;)V", s); + LocalFree(buf); + env->DeleteLocalRef(s); + } ++ if (createError == NULL) { ++ throw std::bad_alloc(); ++ } + env->SetObjectField(self, AwtObject::createErrorID, createError); +- if (createError != NULL) +- { +- env->DeleteLocalRef(createError); +- } ++ env->DeleteLocalRef(createError); + return FALSE; + } + return TRUE; +@@ -238,12 +244,18 @@ + jobject self = GetPeer(env); + jobject target = env->GetObjectField(self, AwtObject::targetID); + jobject font = JNU_CallMethodByName(env, 0, target, "getFont_NoClientCode", "()Ljava/awt/Font;").l; ++ env->DeleteLocalRef(target); ++ if (env->ExceptionCheck()) { ++ throw std::bad_alloc(); ++ } + + if (font == NULL) { + font = env->NewLocalRef(GetDefaultFont(env)); ++ if (env->ExceptionCheck()) { ++ throw std::bad_alloc(); ++ } + } + +- env->DeleteLocalRef(target); + return font; + } + +@@ -251,13 +263,22 @@ + AwtMenuItem::GetDefaultFont(JNIEnv *env) { + if (AwtMenuItem::systemFont == NULL) { + jclass cls = env->FindClass("sun/awt/windows/WMenuItemPeer"); +- DASSERT(cls != NULL); ++ if (cls == NULL) { ++ throw std::bad_alloc(); ++ } + + AwtMenuItem::systemFont = + env->CallStaticObjectMethod(cls, AwtMenuItem::getDefaultFontMID); +- DASSERT(AwtMenuItem::systemFont); ++ if (env->ExceptionCheck()) { ++ env->DeleteLocalRef(cls); ++ throw std::bad_alloc(); ++ } + + AwtMenuItem::systemFont = env->NewGlobalRef(AwtMenuItem::systemFont); ++ if (systemFont == NULL) { ++ env->DeleteLocalRef(cls); ++ throw std::bad_alloc(); ++ } + } + return AwtMenuItem::systemFont; + } +@@ -284,8 +305,19 @@ + DWORD crBack,crText; + HBRUSH hbrBack; + +- jobject font = GetFont(env); ++ jobject font; ++ try { ++ font = GetFont(env); ++ } catch (std::bad_alloc&) { ++ env->DeleteLocalRef(target); ++ throw; ++ } ++ + jstring text = GetJavaString(env); ++ if (env->ExceptionCheck()) { ++ env->DeleteLocalRef(target); ++ throw std::bad_alloc(); ++ } + size = AwtFont::getMFStringSize(hDC, font, text); + + /* 4700350: If the font size is taller than the menubar, change to the +@@ -294,7 +326,13 @@ + */ + if (IsTopMenu() && size.cy > ::GetSystemMetrics(SM_CYMENU)) { + env->DeleteLocalRef(font); +- font = env->NewLocalRef(GetDefaultFont(env)); ++ try { ++ font = env->NewLocalRef(GetDefaultFont(env)); ++ } catch (std::bad_alloc&) { ++ env->DeleteLocalRef(target); ++ env->DeleteLocalRef(text); ++ throw; ++ } + size = AwtFont::getMFStringSize(hDC, font, text); + } + +@@ -452,6 +490,10 @@ + /* font is a java.awt.Font */ + jobject font = GetFont(env); + jstring text = GetJavaString(env); ++ if (env->ExceptionCheck()) { ++ env->DeleteLocalRef(font); ++ throw std::bad_alloc(); ++ } + SIZE size = AwtFont::getMFStringSize(hDC, font, text); + + /* 4700350: If the font size is taller than the menubar, change to the +@@ -459,7 +501,14 @@ + * client area. -bchristi + */ + if (IsTopMenu() && size.cy > ::GetSystemMetrics(SM_CYMENU)) { +- jobject defFont = GetDefaultFont(env); ++ jobject defFont; ++ try { ++ defFont = GetDefaultFont(env); ++ } catch (std::bad_alloc&) { ++ env->DeleteLocalRef(text); ++ env->DeleteLocalRef(font); ++ throw; ++ } + env->DeleteLocalRef(font); + font = env->NewLocalRef(defFont); + size = AwtFont::getMFStringSize(hDC, font, text); +@@ -468,13 +517,31 @@ + jstring fontName = + (jstring)JNU_CallMethodByName(env, 0,font, "getName", + "()Ljava/lang/String;").l; ++ if (env->ExceptionCheck()) { ++ env->DeleteLocalRef(text); ++ env->DeleteLocalRef(font); ++ throw std::bad_alloc(); ++ } ++ + /* fontMetrics is a Hsun_awt_windows_WFontMetrics */ + jobject fontMetrics = GetFontMetrics(env, font); +- ++ if (env->ExceptionCheck()) { ++ env->DeleteLocalRef(text); ++ env->DeleteLocalRef(font); ++ env->DeleteLocalRef(fontName); ++ throw std::bad_alloc(); ++ } + + // int height = env->GetIntField(fontMetrics, AwtFont::heightID); + int height = (jint)JNU_CallMethodByName(env, 0, fontMetrics, "getHeight", + "()I").i; ++ if (env->ExceptionCheck()) { ++ env->DeleteLocalRef(text); ++ env->DeleteLocalRef(font); ++ env->DeleteLocalRef(fontName); ++ env->DeleteLocalRef(fontMetrics); ++ throw std::bad_alloc(); ++ } + + measureInfo.itemHeight = height; + measureInfo.itemHeight += measureInfo.itemHeight/3; +@@ -520,10 +587,14 @@ + if (env->PushLocalFrame(2) < 0) + return NULL; + jclass cls = env->FindClass("java/awt/Toolkit"); ++ CHECK_NULL_RETURN(cls, NULL); + jobject toolkitLocal = + env->CallStaticObjectMethod(cls, AwtToolkit::getDefaultToolkitMID); ++ env->DeleteLocalRef(cls); ++ CHECK_NULL_RETURN(toolkitLocal, NULL); + toolkit = env->NewGlobalRef(toolkitLocal); +- DASSERT(!safe_ExceptionOccurred(env)); ++ env->DeleteLocalRef(toolkitLocal); ++ CHECK_NULL_RETURN(toolkit, NULL); + env->PopLocalFrame(0); + } + /* +@@ -739,6 +810,10 @@ + { + empty = JNU_NewStringPlatform(env, TEXT("")); + } ++ if (env->ExceptionCheck()) { ++ badAlloc = 1; ++ goto ret; ++ } + LPCTSTR labelPtr; + if (empty != NULL) + { +@@ -846,10 +921,9 @@ + TRY; + + AwtMenuItem::fontID = env->GetFieldID(cls, "font", "Ljava/awt/Font;"); ++ CHECK_NULL(AwtMenuItem::fontID); + AwtMenuItem::appContextID = env->GetFieldID(cls, "appContext", "Lsun/awt/AppContext;"); + +- DASSERT(AwtMenuItem::fontID != NULL); +- + CATCH_BAD_ALLOC; + } + +@@ -868,11 +942,9 @@ + TRY; + + AwtMenuItem::labelID = env->GetFieldID(cls, "label", "Ljava/lang/String;"); ++ CHECK_NULL(AwtMenuItem::labelID); + AwtMenuItem::enabledID = env->GetFieldID(cls, "enabled", "Z"); + +- DASSERT(AwtMenuItem::labelID != NULL); +- DASSERT(AwtMenuItem::enabledID != NULL); +- + CATCH_BAD_ALLOC; + } + +@@ -892,8 +964,6 @@ + + AwtMenuItem::stateID = env->GetFieldID(cls, "state", "Z"); + +- DASSERT(AwtMenuItem::stateID != NULL); +- + CATCH_BAD_ALLOC; + } + +@@ -917,15 +987,13 @@ + TRY; + + AwtMenuItem::isCheckboxID = env->GetFieldID(cls, "isCheckbox", "Z"); ++ CHECK_NULL(AwtMenuItem::isCheckboxID); + AwtMenuItem::shortcutLabelID = env->GetFieldID(cls, "shortcutLabel", + "Ljava/lang/String;"); ++ CHECK_NULL(AwtMenuItem::shortcutLabelID); + AwtMenuItem::getDefaultFontMID = + env->GetStaticMethodID(cls, "getDefaultFont", "()Ljava/awt/Font;"); + +- DASSERT(AwtMenuItem::isCheckboxID != NULL); +- DASSERT(AwtMenuItem::shortcutLabelID != NULL); +- DASSERT(AwtMenuItem::getDefaultFontMID != NULL); +- + CATCH_BAD_ALLOC; + } + +--- ./jdk/src/windows/native/sun/windows/awt_MouseEvent.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_MouseEvent.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2001, 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 +@@ -45,12 +45,16 @@ + TRY; + + AwtMouseEvent::xID = env->GetFieldID(cls, "x", "I"); ++ DASSERT(AwtMouseEvent::xID != NULL); ++ CHECK_NULL(AwtMouseEvent::xID); ++ + AwtMouseEvent::yID = env->GetFieldID(cls, "y", "I"); ++ DASSERT(AwtMouseEvent::yID != NULL); ++ CHECK_NULL(AwtMouseEvent::yID); ++ + AwtMouseEvent::buttonID = env->GetFieldID(cls, "button", "I"); +- +- DASSERT(AwtMouseEvent::xID != NULL); +- DASSERT(AwtMouseEvent::yID != NULL); + DASSERT(AwtMouseEvent::buttonID != NULL); ++ CHECK_NULL(AwtMouseEvent::buttonID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_Object.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Object.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -232,22 +232,31 @@ + TRY; + + AwtObject::wObjectPeerClass = (jclass)env->NewGlobalRef(cls); ++ DASSERT(AwtObject::wObjectPeerClass != NULL); ++ CHECK_NULL(AwtObject::wObjectPeerClass); ++ + AwtObject::pDataID = env->GetFieldID(cls, "pData", "J"); ++ DASSERT(AwtObject::pDataID != NULL); ++ CHECK_NULL(AwtObject::pDataID); ++ + AwtObject::destroyedID = env->GetFieldID(cls, "destroyed", "Z"); ++ DASSERT(AwtObject::destroyedID != NULL); ++ CHECK_NULL(AwtObject::destroyedID); ++ + AwtObject::targetID = env->GetFieldID(cls, "target", + "Ljava/lang/Object;"); ++ DASSERT(AwtObject::targetID != NULL); ++ CHECK_NULL(AwtObject::targetID); + + AwtObject::getPeerForTargetMID = + env->GetStaticMethodID(cls, "getPeerForTarget", + "(Ljava/lang/Object;)Lsun/awt/windows/WObjectPeer;"); ++ DASSERT(AwtObject::getPeerForTargetMID != NULL); ++ CHECK_NULL(AwtObject::getPeerForTargetMID); + + AwtObject::createErrorID = env->GetFieldID(cls, "createError", "Ljava/lang/Error;"); +- +- DASSERT(AwtObject::pDataID != NULL); +- DASSERT(AwtObject::destroyedID != NULL); +- DASSERT(AwtObject::targetID != NULL); +- DASSERT(AwtObject::getPeerForTargetMID != NULL); + DASSERT(AwtObject::createErrorID != NULL); ++ CHECK_NULL(AwtObject::createErrorID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_PopupMenu.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_PopupMenu.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -114,7 +114,6 @@ + * as the event's target. + */ + if (env->EnsureLocalCapacity(2) < 0) { +- env->DeleteGlobalRef(event); + return; + } + jobject origin = (env)->GetObjectField(event, AwtEvent::targetID); +@@ -155,7 +154,6 @@ + done: + env->DeleteLocalRef(origin); + env->DeleteLocalRef(peerOrigin); +- env->DeleteGlobalRef(event); + } + + void AwtPopupMenu::_Show(void *param) +@@ -164,29 +162,21 @@ + + static jclass popupMenuCls; + if (popupMenuCls == NULL) { +- jclass popupMenuClsLocal = +- env->FindClass("java/awt/PopupMenu"); +- if (!popupMenuClsLocal) { +- /* exception already thrown */ +- ShowStruct *ss = (ShowStruct*)param; +- if (ss->self != NULL) { +- env->DeleteGlobalRef(ss->self); +- } +- delete ss; +- return; ++ jclass popupMenuClsLocal = env->FindClass("java/awt/PopupMenu"); ++ if (popupMenuClsLocal != NULL) { ++ popupMenuCls = (jclass)env->NewGlobalRef(popupMenuClsLocal); ++ env->DeleteLocalRef(popupMenuClsLocal); + } +- popupMenuCls = (jclass)env->NewGlobalRef(popupMenuClsLocal); +- env->DeleteLocalRef(popupMenuClsLocal); + } + + static jfieldID isTrayIconPopupID; +- if (isTrayIconPopupID == NULL) { ++ if (popupMenuCls != NULL && isTrayIconPopupID == NULL) { + isTrayIconPopupID = env->GetFieldID(popupMenuCls, "isTrayIconPopup", "Z"); + DASSERT(isTrayIconPopupID); + } + + ShowStruct *ss = (ShowStruct*)param; +- if (ss->self != NULL) { ++ if (ss->self != NULL && isTrayIconPopupID != NULL) { + PDATA pData = JNI_GET_PDATA(ss->self); + if (pData) { + AwtPopupMenu *p = (AwtPopupMenu *)pData; +@@ -195,9 +185,17 @@ + env->DeleteLocalRef(target); + p->Show(env, ss->event, isTrayIconPopup); + } ++ } ++ if (ss->self != NULL) { + env->DeleteGlobalRef(ss->self); + } ++ if (ss->event != NULL) { ++ env->DeleteGlobalRef(ss->event); ++ } + delete ss; ++ if (isTrayIconPopupID == NULL) { ++ throw std::bad_alloc(); ++ } + } + + void AwtPopupMenu::AddItem(AwtMenuItem *item) +@@ -303,7 +301,7 @@ + + // fix for 6268046: invoke the function without CriticalSection's synchronization + AwtToolkit::GetInstance().InvokeFunction(AwtPopupMenu::_Show, ss); +- // global ref is deleted in _Show() and ss is deleted in Show() ++ // global ref and ss are deleted in _Show() + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_PrintControl.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_PrintControl.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -233,107 +233,166 @@ + TRY; + + jclass cls = env->FindClass("sun/awt/windows/WPrinterJob"); ++ CHECK_NULL(cls); + + AwtPrintControl::dialogOwnerPeerID = + env->GetFieldID(cls, "dialogOwnerPeer", "Ljava/awt/peer/ComponentPeer;"); ++ DASSERT(AwtPrintControl::dialogOwnerPeerID != NULL); ++ CHECK_NULL(AwtPrintControl::dialogOwnerPeerID); ++ + AwtPrintControl::getPrintDCID = env->GetMethodID(cls, "getPrintDC", "()J"); ++ DASSERT(AwtPrintControl::getPrintDCID != NULL); ++ CHECK_NULL(AwtPrintControl::getPrintDCID); ++ + AwtPrintControl::setPrintDCID = + env->GetMethodID(cls, "setPrintDC", "(J)V"); ++ DASSERT(AwtPrintControl::setPrintDCID != NULL); ++ CHECK_NULL(AwtPrintControl::setPrintDCID); ++ + AwtPrintControl::getDevmodeID = env->GetMethodID(cls, "getDevMode", "()J"); ++ DASSERT(AwtPrintControl::getDevmodeID != NULL); ++ CHECK_NULL(AwtPrintControl::getDevmodeID); ++ + AwtPrintControl::setDevmodeID = + env->GetMethodID(cls, "setDevMode", "(J)V"); ++ DASSERT(AwtPrintControl::setDevmodeID != NULL); ++ CHECK_NULL(AwtPrintControl::setDevmodeID); ++ + AwtPrintControl::getDevnamesID = + env->GetMethodID(cls, "getDevNames", "()J"); ++ DASSERT(AwtPrintControl::getDevnamesID != NULL); ++ CHECK_NULL(AwtPrintControl::getDevnamesID); ++ + AwtPrintControl::setDevnamesID = + env->GetMethodID(cls, "setDevNames", "(J)V"); ++ DASSERT(AwtPrintControl::setDevnamesID != NULL); ++ CHECK_NULL(AwtPrintControl::setDevnamesID); ++ + AwtPrintControl::driverDoesMultipleCopiesID = + env->GetFieldID(cls, "driverDoesMultipleCopies", "Z"); ++ DASSERT(AwtPrintControl::driverDoesMultipleCopiesID != NULL); ++ CHECK_NULL(AwtPrintControl::driverDoesMultipleCopiesID); ++ + AwtPrintControl::driverDoesCollationID = + env->GetFieldID(cls, "driverDoesCollation", "Z"); ++ DASSERT(AwtPrintControl::driverDoesCollationID != NULL); ++ CHECK_NULL(AwtPrintControl::driverDoesCollationID); ++ + AwtPrintControl::getCopiesID = + env->GetMethodID(cls, "getCopiesAttrib", "()I"); ++ DASSERT(AwtPrintControl::getCopiesID != NULL); ++ CHECK_NULL(AwtPrintControl::getCopiesID); ++ + AwtPrintControl::getCollateID = + env->GetMethodID(cls, "getCollateAttrib","()I"); ++ DASSERT(AwtPrintControl::getCollateID != NULL); ++ CHECK_NULL(AwtPrintControl::getCollateID); ++ + AwtPrintControl::getOrientID = + env->GetMethodID(cls, "getOrientAttrib", "()I"); ++ DASSERT(AwtPrintControl::getOrientID != NULL); ++ CHECK_NULL(AwtPrintControl::getOrientID); ++ + AwtPrintControl::getFromPageID = + env->GetMethodID(cls, "getFromPageAttrib", "()I"); ++ DASSERT(AwtPrintControl::getFromPageID != NULL); ++ CHECK_NULL(AwtPrintControl::getFromPageID); ++ + AwtPrintControl::getToPageID = + env->GetMethodID(cls, "getToPageAttrib", "()I"); ++ DASSERT(AwtPrintControl::getToPageID != NULL); ++ CHECK_NULL(AwtPrintControl::getToPageID); ++ + AwtPrintControl::getMinPageID = + env->GetMethodID(cls, "getMinPageAttrib", "()I"); ++ DASSERT(AwtPrintControl::getMinPageID != NULL); ++ CHECK_NULL(AwtPrintControl::getMinPageID); ++ + AwtPrintControl::getMaxPageID = + env->GetMethodID(cls, "getMaxPageAttrib", "()I"); ++ DASSERT(AwtPrintControl::getMaxPageID != NULL); ++ CHECK_NULL(AwtPrintControl::getMaxPageID); ++ + AwtPrintControl::getDestID = + env->GetMethodID(cls, "getDestAttrib", "()Z"); ++ DASSERT(AwtPrintControl::getDestID != NULL); ++ CHECK_NULL(AwtPrintControl::getDestID); ++ + AwtPrintControl::getQualityID = + env->GetMethodID(cls, "getQualityAttrib", "()I"); ++ DASSERT(AwtPrintControl::getQualityID != NULL); ++ CHECK_NULL(AwtPrintControl::getQualityID); ++ + AwtPrintControl::getColorID = + env->GetMethodID(cls, "getColorAttrib", "()I"); ++ DASSERT(AwtPrintControl::getColorID != NULL); ++ CHECK_NULL(AwtPrintControl::getColorID); ++ + AwtPrintControl::getSidesID = + env->GetMethodID(cls, "getSidesAttrib", "()I"); ++ DASSERT(AwtPrintControl::getSidesID != NULL); ++ CHECK_NULL(AwtPrintControl::getSidesID); ++ + AwtPrintControl::getPrinterID = + env->GetMethodID(cls, "getPrinterAttrib", "()Ljava/lang/String;"); ++ DASSERT(AwtPrintControl::getPrinterID != NULL); ++ CHECK_NULL(AwtPrintControl::getPrinterID); ++ + AwtPrintControl::getWin32MediaID = + env->GetMethodID(cls, "getWin32MediaAttrib", "()[I"); ++ DASSERT(AwtPrintControl::getWin32MediaID != NULL); ++ CHECK_NULL(AwtPrintControl::getWin32MediaID); ++ + AwtPrintControl::setWin32MediaID = + env->GetMethodID(cls, "setWin32MediaAttrib", "(III)V"); ++ DASSERT(AwtPrintControl::setWin32MediaID != NULL); ++ CHECK_NULL(AwtPrintControl::setWin32MediaID); ++ + AwtPrintControl::getWin32MediaTrayID = + env->GetMethodID(cls, "getMediaTrayAttrib", "()I"); ++ DASSERT(AwtPrintControl::getWin32MediaTrayID != NULL); ++ CHECK_NULL(AwtPrintControl::getWin32MediaTrayID); ++ + AwtPrintControl::setWin32MediaTrayID = + env->GetMethodID(cls, "setMediaTrayAttrib", "(I)V"); ++ DASSERT(AwtPrintControl::setWin32MediaTrayID != NULL); ++ CHECK_NULL(AwtPrintControl::setWin32MediaTrayID); ++ + AwtPrintControl::getSelectID = + env->GetMethodID(cls, "getSelectAttrib", "()I"); ++ DASSERT(AwtPrintControl::getSelectID != NULL); ++ CHECK_NULL(AwtPrintControl::getSelectID); ++ + AwtPrintControl::getPrintToFileEnabledID = + env->GetMethodID(cls, "getPrintToFileEnabled", "()Z"); ++ DASSERT(AwtPrintControl::getPrintToFileEnabledID != NULL); ++ CHECK_NULL(AwtPrintControl::getPrintToFileEnabledID); + + AwtPrintControl::setNativeAttID = + env->GetMethodID(cls, "setNativeAttributes", "(III)V"); ++ DASSERT(AwtPrintControl::setNativeAttID != NULL); ++ CHECK_NULL(AwtPrintControl::setNativeAttID); + + AwtPrintControl::setRangeCopiesID = + env->GetMethodID(cls, "setRangeCopiesAttribute", "(IIZI)V"); ++ DASSERT(AwtPrintControl::setRangeCopiesID != NULL); ++ CHECK_NULL(AwtPrintControl::setRangeCopiesID); ++ + AwtPrintControl::setResID = + env->GetMethodID(cls, "setResolutionDPI", "(II)V"); ++ DASSERT(AwtPrintControl::setResID != NULL); ++ CHECK_NULL(AwtPrintControl::setResID); + + AwtPrintControl::setPrinterID = + env->GetMethodID(cls, "setPrinterNameAttrib", "(Ljava/lang/String;)V"); ++ DASSERT(AwtPrintControl::setPrinterID != NULL); ++ CHECK_NULL(AwtPrintControl::setPrinterID); + + AwtPrintControl::setJobAttributesID = + env->GetMethodID(cls, "setJobAttributes", + "(Ljavax/print/attribute/PrintRequestAttributeSet;IISSSSSSS)V"); +- +- DASSERT(AwtPrintControl::driverDoesMultipleCopiesID != NULL); +- DASSERT(AwtPrintControl::getPrintDCID != NULL); +- DASSERT(AwtPrintControl::setPrintDCID != NULL); +- DASSERT(AwtPrintControl::getDevmodeID != NULL); +- DASSERT(AwtPrintControl::setDevmodeID != NULL); +- DASSERT(AwtPrintControl::getDevnamesID != NULL); +- DASSERT(AwtPrintControl::setDevnamesID != NULL); +- DASSERT(AwtPrintControl::driverDoesCollationID != NULL); +- DASSERT(AwtPrintControl::getWin32MediaID != NULL); +- DASSERT(AwtPrintControl::setWin32MediaID != NULL); +- DASSERT(AwtPrintControl::getWin32MediaTrayID != NULL); +- DASSERT(AwtPrintControl::setWin32MediaTrayID != NULL); +- DASSERT(AwtPrintControl::setRangeCopiesID != NULL); +- DASSERT(AwtPrintControl::setResID != NULL); +- DASSERT(AwtPrintControl::setNativeAttID != NULL); +- DASSERT(AwtPrintControl::dialogOwnerPeerID != NULL); +- DASSERT(AwtPrintControl::getCopiesID != NULL); +- DASSERT(AwtPrintControl::getOrientID != NULL); +- DASSERT(AwtPrintControl::getPrinterID != NULL); +- DASSERT(AwtPrintControl::getCollateID != NULL); +- DASSERT(AwtPrintControl::getFromPageID != NULL); +- DASSERT(AwtPrintControl::getToPageID != NULL); +- DASSERT(AwtPrintControl::getMinPageID != NULL); +- DASSERT(AwtPrintControl::getMaxPageID != NULL); +- DASSERT(AwtPrintControl::getDestID != NULL); +- DASSERT(AwtPrintControl::getQualityID != NULL); +- DASSERT(AwtPrintControl::getColorID != NULL); +- DASSERT(AwtPrintControl::getSidesID != NULL); +- DASSERT(AwtPrintControl::getSelectID != NULL); +- DASSERT(AwtPrintControl::getPrintToFileEnabledID != NULL); + DASSERT(AwtPrintControl::setJobAttributesID != NULL); +- ++ CHECK_NULL(AwtPrintControl::setJobAttributesID); + + CATCH_BAD_ALLOC; + } +@@ -606,6 +665,10 @@ + + LPTSTR getName = (LPTSTR)JNU_GetStringPlatformChars(env, + printerName, NULL); ++ if (getName == NULL) { ++ env->DeleteLocalRef(printerName); ++ throw std::bad_alloc(); ++ } + + BOOL samePrinter = FALSE; + +@@ -652,6 +715,7 @@ + if (portName != NULL) { + free(portName); + } ++ env->DeleteLocalRef(printerName); + return FALSE; + } + +@@ -664,11 +728,13 @@ + if (portName != NULL) { + free(portName); + } ++ env->DeleteLocalRef(printerName); + return FALSE; + } + + delete [] buffer; + } ++ env->DeleteLocalRef(printerName); + // PrintDlg may change the values of hDevMode and hDevNames so we + // re-initialize our saved handles. + AwtPrintControl::setPrintHDMode(env, printCtrl, NULL); +--- ./jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_PrintDialog.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -166,28 +166,19 @@ + } + + JNIEXPORT void JNICALL +-Java_sun_awt_windows_WPrintDialog_setPeer(JNIEnv *env, jobject target, +- jobject peer) +-{ +- TRY; +- +- env->SetObjectField(target, AwtComponent::peerID, peer); +- +- CATCH_BAD_ALLOC; +-} +- +-JNIEXPORT void JNICALL + Java_sun_awt_windows_WPrintDialogPeer_initIDs(JNIEnv *env, jclass cls) + { + TRY; + + AwtPrintDialog::parentID = + env->GetFieldID(cls, "parent", "Lsun/awt/windows/WComponentPeer;"); ++ DASSERT(AwtPrintDialog::parentID != NULL); ++ CHECK_NULL(AwtPrintDialog::parentID); ++ + AwtPrintDialog::setHWndMID = + env->GetMethodID(cls, "setHWnd", "(J)V"); +- +- DASSERT(AwtPrintDialog::parentID != NULL); + DASSERT(AwtPrintDialog::setHWndMID != NULL); ++ CHECK_NULL(AwtPrintDialog::setHWndMID); + + CATCH_BAD_ALLOC; + } +@@ -202,11 +193,24 @@ + // as peer object is used later on another thread, create a global ref + jobject peerGlobalRef = env->NewGlobalRef(peer); + DASSERT(peerGlobalRef != NULL); ++ CHECK_NULL_RETURN(peerGlobalRef, 0); + jobject target = env->GetObjectField(peerGlobalRef, AwtObject::targetID); + DASSERT(target != NULL); ++ if (target == NULL) { ++ env->DeleteGlobalRef(peerGlobalRef); ++ return 0; ++ } + jobject parent = env->GetObjectField(peerGlobalRef, AwtPrintDialog::parentID); + jobject control = env->GetObjectField(target, AwtPrintDialog::controlID); + DASSERT(control != NULL); ++ if (control == NULL) { ++ env->DeleteGlobalRef(peerGlobalRef); ++ env->DeleteLocalRef(target); ++ if (parent != NULL) { ++ env->DeleteLocalRef(parent); ++ } ++ return 0; ++ } + + AwtComponent *awtParent = (parent != NULL) ? (AwtComponent *)JNI_GET_PDATA(parent) : NULL; + HWND hwndOwner = awtParent ? awtParent->GetHWnd() : NULL; +@@ -215,7 +219,18 @@ + memset(&pd, 0, sizeof(PRINTDLG)); + pd.lStructSize = sizeof(PRINTDLG); + pd.lCustData = (LPARAM)peerGlobalRef; +- BOOL ret = AwtPrintControl::InitPrintDialog(env, control, pd); ++ BOOL ret; ++ try { ++ ret = AwtPrintControl::InitPrintDialog(env, control, pd); ++ } catch (std::bad_alloc&) { ++ env->DeleteGlobalRef(peerGlobalRef); ++ env->DeleteLocalRef(target); ++ if (parent != NULL) { ++ env->DeleteLocalRef(parent); ++ } ++ env->DeleteLocalRef(control); ++ throw; ++ } + if (!ret) { + /* Couldn't use the printer, or spooler isn't running + * Call Page dialog with ' PD_RETURNDEFAULT' so it doesn't try +--- ./jdk/src/windows/native/sun/windows/awt_PrintJob.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_PrintJob.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -281,21 +281,15 @@ + static long convertFromPoints(double value, int units); + static double convertToPoints(long value, int units); + void setCapabilities(JNIEnv *env, jobject self, HDC printDC); +-static inline WORD getPrintPaperSize(JNIEnv *env, jobject self); +-static inline void setPrintPaperSize(JNIEnv *env, jobject self, WORD sz); +-static jint getIntField(JNIEnv *env, jobject self, const char *fieldName); +-static jlong getLongField(JNIEnv *env, jobject self, const char *fieldName); +-static void setIntField(JNIEnv *env, jobject self, +- const char *fieldName, jint value); +-static void setLongField(JNIEnv *env, jobject self, +- const char *fieldName, jlong value); +-static jfieldID getIdOfIntField(JNIEnv *env, jobject self, ++static inline WORD getPrintPaperSize(JNIEnv *env, jboolean* err, jobject self); ++static inline jboolean setPrintPaperSize(JNIEnv *env, jobject self, WORD sz); ++static jint getIntField(JNIEnv *env, jboolean* err, jobject self, const char *fieldName); ++static jboolean setIntField(JNIEnv *env, jobject self, ++ const char *fieldName, jint value); ++static jboolean getBooleanField(JNIEnv *env, jboolean* err, jobject self, + const char *fieldName); +-static jfieldID getIdOfLongField(JNIEnv *env, jobject self, +- const char *fieldName); +-static void setBooleanField(JNIEnv *env, jobject self, ++static jboolean setBooleanField(JNIEnv *env, jobject self, + const char *fieldName, jboolean value); +- + static jbyte *findNonWhite(jbyte *image, long sy, long width, long height, + long scanLineStride, long *numLinesP); + static jbyte *findWhite(jbyte *image, long sy, long width, long height, +@@ -577,7 +571,8 @@ + * If both are null, then there is no default printer. + */ + if ((setup.hDevMode == NULL) && (setup.hDevNames == NULL)) { +- return JNI_FALSE; ++ doIt = JNI_FALSE; ++ goto done; + } + } else { + int measure = PSD_INTHOUSANDTHSOFINCHES; +@@ -602,8 +597,11 @@ + * into the Windows setup structure so that the format can + * be displayed in the dialog. + */ +- pageFormatToSetup(env, self, page, &setup, +- AwtPrintControl::getPrintDC(env, self)); ++ pageFormatToSetup(env, self, page, &setup, AwtPrintControl::getPrintDC(env, self)); ++ if (env->ExceptionCheck()) { ++ doIt = JNI_FALSE; ++ goto done; ++ } + + setup.lpfnPageSetupHook = reinterpret_cast<LPPAGESETUPHOOK>(pageDlgHook); + setup.Flags = PSD_ENABLEPAGESETUPHOOK | PSD_MARGINS; +@@ -614,7 +612,10 @@ + if (ret) { + + jobject paper = getPaper(env, page); +- ++ if (paper == NULL) { ++ doIt = JNI_FALSE; ++ goto done; ++ } + int units = setup.Flags & PSD_INTHOUSANDTHSOFINCHES ? + MM_HIENGLISH : + MM_HIMETRIC; +@@ -653,19 +654,33 @@ + * and place them into a Paper instance. + */ + setPaperValues(env, paper, &paperSize, &margins, units); +- +- /* Put the updated Paper instance and the orientation into ++ if (env->ExceptionCheck()) { ++ doIt = JNI_FALSE; ++ goto done; ++ } ++ /* ++ * Put the updated Paper instance and the orientation into + * the PageFormat. + */ + setPaper(env, page, paper); +- ++ if (env->ExceptionCheck()) { ++ doIt = JNI_FALSE; ++ goto done; ++ } + setPageFormatOrientation(env, page, orientation); +- ++ if (env->ExceptionCheck()) { ++ doIt = JNI_FALSE; ++ goto done; ++ } + if (setup.hDevMode != NULL) { + DEVMODE *devmode = (DEVMODE *)::GlobalLock(setup.hDevMode); + if (devmode != NULL) { + if (devmode->dmFields & DM_PAPERSIZE) { +- setPrintPaperSize(env, self, devmode->dmPaperSize); ++ jboolean err = setPrintPaperSize(env, self, devmode->dmPaperSize); ++ if (err) { ++ doIt = JNI_FALSE; ++ goto done; ++ } + } + } + ::GlobalUnlock(setup.hDevMode); +@@ -673,8 +688,6 @@ + doIt = JNI_TRUE; + } + +- DASSERT(env->GetLongField(peer, AwtComponent::hwndID) == 0L); +- + AwtDialog::CheckUninstallModalHook(); + + AwtDialog::ModalActivateNextWindow(NULL, target, peer); +@@ -689,6 +702,7 @@ + AwtPrintControl::setPrintHDName(env, self, setup.hDevNames); + } + ++done: + env->DeleteGlobalRef(peerGlobalRef); + if (target != NULL) { + env->DeleteLocalRef(target); +@@ -826,8 +840,14 @@ + margins.bottom = convertFromPoints(72, units);; + + jobject paper = getPaper(env, page); ++ if (paper == NULL) { ++ goto done; ++ } ++ + setPaperValues(env, paper, &paperSize, &margins, units); ++ if (env->ExceptionCheck()) goto done; + setPaper(env, page, paper); ++ if (env->ExceptionCheck()) goto done; + + if ((pDevMode->dmFields & DM_ORIENTATION) && + (pDevMode->dmOrientation == DMORIENT_LANDSCAPE)) { +@@ -837,8 +857,10 @@ + } + + } else { +- setBooleanField(env, self, NO_DEFAULTPRINTER_STR, (jint)JNI_TRUE); ++ setBooleanField(env, self, NO_DEFAULTPRINTER_STR, (jint)JNI_TRUE); + } ++ ++done: + ::GlobalFree(pDevMode); + + free ((LPTSTR) printerName); +@@ -890,9 +912,7 @@ + } + } + +- if (printDC == NULL) { +- return; +- } ++ JNI_CHECK_NULL_GOTO(printDC, "Invalid printDC", done); + + /* We try to mitigate the effects of floating point rounding errors + * by only setting a value if it would differ from the value in the +@@ -903,7 +923,9 @@ + const double epsilon = 0.10; + + jdouble paperWidth, paperHeight; +- WORD dmPaperSize = getPrintPaperSize(env, self); ++ jboolean err; ++ WORD dmPaperSize = getPrintPaperSize(env, &err, self); ++ if (err) goto done; + + double ix, iy, iw, ih, pw, ph; + +@@ -911,17 +933,24 @@ + jmethodID getID; + + jclass paperClass = env->GetObjectClass(origPaper); ++ JNI_CHECK_NULL_GOTO(paperClass, "paper class not found", done); + getID = env->GetMethodID(paperClass, GETWIDTH_STR, GETWIDTH_SIG); ++ JNI_CHECK_NULL_GOTO(getID, "no getWidth method", done); + pw = env->CallDoubleMethod(origPaper, getID); + getID = env->GetMethodID(paperClass, GETHEIGHT_STR, GETHEIGHT_SIG); ++ JNI_CHECK_NULL_GOTO(getID, "no getHeight method", done); + ph = env->CallDoubleMethod(origPaper, getID); + getID = env->GetMethodID(paperClass, GETIMG_X_STR, GETIMG_X_SIG); ++ JNI_CHECK_NULL_GOTO(getID, "no getX method", done); + ix = env->CallDoubleMethod(origPaper, getID); + getID = env->GetMethodID(paperClass, GETIMG_Y_STR, GETIMG_Y_SIG); ++ JNI_CHECK_NULL_GOTO(getID, "no getY method", done); + iy = env->CallDoubleMethod(origPaper, getID); + getID = env->GetMethodID(paperClass, GETIMG_W_STR, GETIMG_W_SIG); ++ JNI_CHECK_NULL_GOTO(getID, "no getW method", done); + iw = env->CallDoubleMethod(origPaper, getID); + getID = env->GetMethodID(paperClass, GETIMG_H_STR, GETIMG_H_SIG); ++ JNI_CHECK_NULL_GOTO(getID, "no getH method", done); + ih = env->CallDoubleMethod(origPaper, getID); + + matchPaperSize(printDC, hDevMode, hDevNames, pw, ph, +@@ -1014,12 +1043,16 @@ + + jmethodID setSizeID = env->GetMethodID(paperClass, + SETSIZE_STR, SETSIZE_SIG); ++ JNI_CHECK_NULL_GOTO(setSizeID, "no setSize method", done); ++ + jmethodID setImageableID = env->GetMethodID(paperClass, + SETIMAGEABLE_STR, SETIMAGEABLE_SIG); ++ JNI_CHECK_NULL_GOTO(setImageableID, "no setImageable method", done); + + env->CallVoidMethod(newPaper, setSizeID, paperWidth, paperHeight); + env->CallVoidMethod(newPaper, setImageableID, ix, iy, iw, ih); + ++done: + /* Free any resources allocated */ + if (privateDC == TRUE) { + if (printDC != NULL) { +@@ -1066,6 +1099,7 @@ + JNIEXPORT void JNICALL + Java_sun_awt_windows_WPrinterJob_initPrinter(JNIEnv *env, jobject self) { + TRY; ++ jboolean err; + + initPrinter(env, self); + +@@ -1089,17 +1123,19 @@ + ::GlobalUnlock(devnames); + + if (devLandRotation == 270) { +- setBooleanField(env, self, LANDSCAPE_270_STR, JNI_TRUE); ++ err = setBooleanField(env, self, LANDSCAPE_270_STR, JNI_TRUE); + } else { +- setBooleanField(env, self, LANDSCAPE_270_STR, JNI_FALSE); ++ err = setBooleanField(env, self, LANDSCAPE_270_STR, JNI_FALSE); + } ++ if (err) return; + } + + if (dmFields & DM_COLLATE) { +- setBooleanField(env, self, DRIVER_COLLATE_STR, JNI_TRUE); ++ err = setBooleanField(env, self, DRIVER_COLLATE_STR, JNI_TRUE); + } else { +- setBooleanField(env, self, DRIVER_COLLATE_STR, JNI_FALSE); ++ err = setBooleanField(env, self, DRIVER_COLLATE_STR, JNI_FALSE); + } ++ if (err) return; + + if (dmFields & DM_COPIES) { + setBooleanField(env, self, DRIVER_COPIES_STR, JNI_TRUE); +@@ -1110,39 +1146,54 @@ + } + + +-static bool setPrintReqAttribute(JNIEnv *env, jobject self, DEVMODE* devmode) { ++/* ++ * returns 0 if print capabilities has been changed ++ * 1 if print capabilities has not been changed ++ * -1 in case of error ++ */ ++static int setPrintReqAttribute(JNIEnv *env, jobject self, DEVMODE* devmode) { + + /* The xRes/yRes fields are only initialised if there is a resolution + * attribute. Otherwise they both will be zero, in which case default + * resolution should be fine. Consider calling getXRes()/getResY() + * rather than accessing the fields directly + */ +- int xRes=getIntField(env, self, ATTXRES_STR); +- int yRes=getIntField(env, self, ATTYRES_STR); +- int quality=getIntField(env, self, ATTQUALITY_STR); +- int printColor = getIntField(env, self, ATTCHROMATICITY_STR); +- int sides = getIntField(env, self, ATTSIDES_STR); +- int collate = getIntField(env, self, ATTCOLLATE_STR); ++ jboolean err; ++ int xRes=getIntField(env, &err, self, ATTXRES_STR); ++ if (err) return -1; ++ int yRes=getIntField(env, &err, self, ATTYRES_STR); ++ if (err) return -1; ++ int quality=getIntField(env, &err, self, ATTQUALITY_STR); ++ if (err) return -1; ++ int printColor = getIntField(env, &err, self, ATTCHROMATICITY_STR); ++ if (err) return -1; ++ int sides = getIntField(env, &err, self, ATTSIDES_STR); ++ if (err) return -1; ++ int collate = getIntField(env, &err, self, ATTCOLLATE_STR); ++ if (err) return -1; + int copies = 1; +- jclass myClass = env->GetObjectClass(self); + // There may be cases when driver reports it cannot handle + // multiple copies although it actually can . So this modification + // handles that, to make sure that we report copies = 1 because + // we already emulated multiple copies. +- jfieldID fieldId = env->GetFieldID(myClass, DRIVER_COPIES_STR, "Z"); +- if (env->GetBooleanField(self, fieldId)) { +- copies = getIntField(env, self, ATTCOPIES_STR); ++ jboolean driverHandlesCopies = getBooleanField(env, &err, self, DRIVER_COPIES_STR); ++ if (err) return -1; ++ if (driverHandlesCopies) { ++ copies = getIntField(env, &err, self, ATTCOPIES_STR); ++ if (err) return -1; + } // else "driverDoesMultipleCopies" is false, copies should be 1 (default) +- int mediatray = getIntField(env, self, ATTMEDIATRAY_STR); +- int mediaszname = getIntField(env, self, ATTMEDIASZNAME_STR); +- bool ret = true; ++ int mediatray = getIntField(env, &err, self, ATTMEDIATRAY_STR); ++ if (err) return -1; ++ int mediaszname = getIntField(env, &err, self, ATTMEDIASZNAME_STR); ++ if (err) return -1; ++ int ret = 1; + + if (quality && quality < 0) { + if (quality != devmode->dmPrintQuality) { + devmode->dmPrintQuality = quality; + devmode->dmFields |= DM_PRINTQUALITY; +- // ret of "false" means that setCapabilities needs to be called +- ret = false; ++ // ret of 0 means that setCapabilities needs to be called ++ ret = 0; + } + } else { + /* If we didn't set quality, maybe we have resolution settings. */ +@@ -1256,7 +1307,7 @@ + if (port != NULL && isFilePort(port)) { + LPTSTR defPort = GetPrinterPort(env, printer); + if (!isFilePort(defPort)) { // not a FILE: port by default +- int len = wcslen(defPort); ++ size_t len = wcslen(defPort); + if (len > 0 && port[len-1] == L':') { // is a device port + dest = defPort; + } else { +@@ -1291,12 +1342,19 @@ + LPTSTR destination = NULL; + if (dest != NULL) { + destination = (LPTSTR)JNU_GetStringPlatformChars(env, dest, NULL); ++ CHECK_NULL_RETURN(destination, JNI_FALSE); + } else { + destination = VerifyDestination(env, self); + } + LPTSTR docname = NULL; + if (jobname != NULL) { + LPTSTR tmp = (LPTSTR)JNU_GetStringPlatformChars(env, jobname, NULL); ++ if (tmp == NULL) { ++ if (dest != NULL) { ++ JNU_ReleaseStringPlatformChars(env, dest, destination); ++ } ++ return JNI_FALSE; ++ } + docname = _tcsdup(tmp); + JNU_ReleaseStringPlatformChars(env, jobname, tmp); + } else { +@@ -1317,23 +1375,33 @@ + HGLOBAL hDevMode = AwtPrintControl::getPrintHDMode(env, self); + if (printDC != NULL && hDevMode != NULL) { + DEVMODE *devmode = (DEVMODE *)::GlobalLock(hDevMode); ++ bool success = true; + if (devmode != NULL) { + devmode->dmFields |= DM_ORIENTATION; + devmode->dmOrientation = DMORIENT_PORTRAIT; + /* set attribute values into devmode */ +- bool ret = setPrintReqAttribute(env, self, devmode); ++ int ret = setPrintReqAttribute(env, self, devmode); + ::ResetDC(printDC, devmode); + RESTORE_CONTROLWORD + +- if (!ret) { ++ if (ret == 0) { + /* + Need to read in updated device capabilities because + print quality has been changed. + */ + setCapabilities(env, self, printDC); ++ if (env->ExceptionCheck()) success = false; ++ } else if (ret < 0) { ++ success = false; + } + } + ::GlobalUnlock(hDevMode); ++ if (!success) { ++ if (dest != NULL) { ++ JNU_ReleaseStringPlatformChars(env, dest, destination); ++ } ++ return JNI_FALSE; ++ } + } + + if (printDC){ +@@ -1358,13 +1426,13 @@ + } else { + err = 0; + } +- if (dest != NULL) { +- JNU_ReleaseStringPlatformChars(env, dest, destination); +- } + } + else { +- jclass printerException = env->FindClass(PRINTEREXCEPTION_STR); +- env->ThrowNew(printerException, "No printer found."); ++ JNU_ThrowByName(env, PRINTEREXCEPTION_STR, "No printer found."); ++ } ++ ++ if (dest != NULL) { ++ JNU_ReleaseStringPlatformChars(env, dest, destination); + } + + if (err && err != ERROR_CANCELLED) { +@@ -1481,7 +1549,9 @@ + LONG retval = 0; + HGLOBAL hDevMode = AwtPrintControl::getPrintHDMode(env, self); + HGLOBAL hDevNames = AwtPrintControl::getPrintHDName(env, self); +- WORD dmPaperSize = getPrintPaperSize(env, self); ++ jboolean err; ++ WORD dmPaperSize = getPrintPaperSize(env, &err, self); ++ if (err) return; + SAVE_CONTROLWORD + // Unless the PageFormat has been changed, do not set the paper + // size for a new page. Doing so is unnecessary, perhaps expensive, +@@ -1492,7 +1562,9 @@ + RectDouble paperSize; + RectDouble margins; + jobject paper = getPaper(env, format); ++ CHECK_NULL(paper); + getPaperValues(env, paper, &paperSize, &margins); ++ JNU_CHECK_EXCEPTION(env); + double paperWidth, paperHeight; + matchPaperSize(printDC, hDevMode, hDevNames, + paperSize.width, paperSize.height, +@@ -1656,6 +1728,7 @@ + jbyte *image = NULL; + try { + image = (jbyte *)env->GetPrimitiveArrayCritical(imageArray, 0); ++ CHECK_NULL(image); + struct { + BITMAPINFOHEADER bmiHeader; + DWORD* bmiColors; +@@ -2194,6 +2267,7 @@ + memset(&matchedLogFont, 0, sizeof(matchedLogFont)); + + LPCWSTR fontNameW = JNU_GetStringPlatformChars(env, fontName, NULL); ++ CHECK_NULL_RETURN(fontNameW, JNI_FALSE); + + /* Describe the GDI fonts we want enumerated. We + * simply supply the java font name and let GDI +@@ -2383,6 +2457,7 @@ + { + SIZE size; + LPCWSTR wText = JNU_GetStringPlatformChars(env, text, NULL); ++ CHECK_NULL_RETURN(wText, 0); + size_t strLen = wcslen(wText); + BOOL ok = GetTextExtentPoint32((HDC)printDC, wText, (int)strLen, &size); + JNU_ReleaseStringPlatformChars(env, text, wText); +@@ -2438,6 +2513,7 @@ + long posY = ROUND_TO_LONG(y); + int flags = (glyphCodes !=0) ? ETO_GLYPH_INDEX : 0; + LPCWSTR wText = JNU_GetStringPlatformChars(env, text, NULL); ++ CHECK_NULL(wText); + + int *advances = NULL, *xadvances = NULL, *xyadvances = NULL; + BOOL useYAdvances = FALSE; +@@ -2841,10 +2917,12 @@ + numCols = MAXCOLS; /* don't write past end of struct */ + } + bmiCols = (BYTE*)env->GetPrimitiveArrayCritical(bmiColorsArray, 0); ++ CHECK_NULL(bmiCols); + memcpy(&(bmi.bmiColors[0]), bmiCols, (numCols*4)); + env->ReleasePrimitiveArrayCritical(bmiColorsArray, bmiCols, 0); + } + imageBits = (jint *)env->GetPrimitiveArrayCritical(image, 0); ++ CHECK_NULL(imageBits); + + // Workaround for drivers/apps that do not support top-down. + // Because we don't know if they support or not, +@@ -2900,6 +2978,7 @@ + try { + long scanLineStride = J2DRasterBPP * width; + image = (jbyte *)env->GetPrimitiveArrayCritical(imageArray, 0); ++ CHECK_NULL(image); + jbyte *startImage; + jbyte *endImage = NULL; + long startY = 0; +@@ -3132,6 +3211,9 @@ + */ + int maxCopies = 1; + int nCopies = getCopies(env, printerJob); ++ if (nCopies < 0) { ++ return NULL; ++ } + SAVE_CONTROLWORD + if (pd.hDevNames != NULL) { + DEVNAMES *devnames = (DEVNAMES *)::GlobalLock(pd.hDevNames); +@@ -3176,11 +3258,14 @@ + AwtPrintControl::setPrintHDName(env, printerJob, pd.hDevNames); + } + +- setBooleanField(env, printerJob, DRIVER_COPIES_STR, +- (devWillDoCopies ? JNI_TRUE : JNI_FALSE)); +- setBooleanField(env, printerJob, DRIVER_COLLATE_STR, JNI_FALSE); +- setBooleanField(env, printerJob, USER_COLLATE_STR, JNI_FALSE); +- ++ jboolean err; ++ err = setBooleanField(env, printerJob, DRIVER_COPIES_STR, ++ (devWillDoCopies ? JNI_TRUE : JNI_FALSE)); ++ if (err) return NULL; ++ err = setBooleanField(env, printerJob, DRIVER_COLLATE_STR, JNI_FALSE); ++ if (err) return NULL; ++ err = setBooleanField(env, printerJob, USER_COLLATE_STR, JNI_FALSE); ++ if (err) return NULL; + } + + return printDC; +@@ -3200,6 +3285,7 @@ + /* Move the orientation from PageFormat to Windows. + */ + jint orient = getPageFormatOrientation(env, page); ++ if (orient < 0) return; + int gdiOrientation = (orient == PAGEFORMAT_PORTRAIT) ? + DMORIENT_PORTRAIT : DMORIENT_LANDSCAPE; + setOrientationInDevMode(setup->hDevMode, orient == PAGEFORMAT_PORTRAIT); +@@ -3208,7 +3294,9 @@ + ? MM_HIENGLISH + : MM_HIMETRIC; + jobject paper = getPaper(env, page); ++ CHECK_NULL(paper); + getPaperValues(env, paper, &paperSize, &margins); ++ JNU_CHECK_EXCEPTION(env); + // Setting the paper size appears to be a futile exercise, as its not one + // of the values you can initialise - its an out-only arg. Margins are OK. + // set it into the DEVMODE if there is one .. +@@ -3218,7 +3306,9 @@ + if (setup->hDevMode != NULL) { + + double paperWidth, paperHeight; +- WORD dmPaperSize = getPrintPaperSize(env, job); ++ jboolean err; ++ WORD dmPaperSize = getPrintPaperSize(env, &err, job); ++ if (err) return; + matchPaperSize(hDC, setup->hDevMode, setup->hDevNames, + paperSize.width, paperSize.height, + &paperWidth, &paperHeight, &dmPaperSize); +@@ -3444,6 +3534,7 @@ + jclass printerJobClass = env->GetObjectClass(printerJob); + jmethodID getCopiesID = env->GetMethodID(printerJobClass, GETCOPIES_STR, + GETCOPIES_SIG); ++ CHECK_NULL_RETURN(getCopiesID, -1); + jint copies = env->CallIntMethod(printerJob, getCopiesID); + + return copies; +@@ -3462,6 +3553,7 @@ + jclass pageClass = env->GetObjectClass(page); + jmethodID getPaperID = env->GetMethodID(pageClass, GETPAPER_STR, + GETPAPER_SIG); ++ CHECK_NULL_RETURN(getPaperID, NULL); + + return env->CallObjectMethod(page, getPaperID); + } +@@ -3479,12 +3571,14 @@ + jclass pageClass = env->GetObjectClass(page); + jmethodID setPaperID = env->GetMethodID(pageClass, SETPAPER_STR, + SETPAPER_SIG); ++ CHECK_NULL(setPaperID); + env->CallVoidMethod(page, setPaperID, paper); + } + + /** + * Return the integer ID for the orientation in the PageFormat. + * Caution: this is the Java spec ID, not the GDI ID. ++ * In case of error returns -1 + */ + static jint getPageFormatOrientation(JNIEnv *env, jobject page) { + // Because this function may call client Java code, +@@ -3494,6 +3588,7 @@ + jclass pageClass = env->GetObjectClass(page); + jmethodID getOrientID = env->GetMethodID(pageClass, GETORIENT_STR, + GETORIENT_SIG); ++ CHECK_NULL_RETURN(getOrientID, -1); + return env->CallIntMethod(page, getOrientID); + } + +@@ -3506,6 +3601,7 @@ + jclass pageClass = env->GetObjectClass(page); + jmethodID setOrientID = env->GetMethodID(pageClass, SETORIENT_STR, + SETORIENT_SIG); ++ CHECK_NULL(setOrientID); + env->CallVoidMethod(page, setOrientID, orientation); + } + +@@ -3527,24 +3623,29 @@ + jclass paperClass = env->GetObjectClass(paper); + + getID = env->GetMethodID(paperClass, GETWIDTH_STR, GETWIDTH_SIG); ++ CHECK_NULL(getID); + paperSize->width = env->CallDoubleMethod(paper, getID); + + getID = env->GetMethodID(paperClass, GETHEIGHT_STR, GETHEIGHT_SIG); ++ CHECK_NULL(getID); + paperSize->height = env->CallDoubleMethod(paper, getID); + + getID = env->GetMethodID(paperClass, GETIMG_X_STR, GETIMG_X_SIG); ++ CHECK_NULL(getID); + margins->x = env->CallDoubleMethod(paper, getID); + if (margins-> x < 0 ) { + margins-> x = 0; + } + + getID = env->GetMethodID(paperClass, GETIMG_Y_STR, GETIMG_Y_SIG); ++ CHECK_NULL(getID); + margins->y = env->CallDoubleMethod(paper, getID); + if (margins-> y < 0 ) { + margins-> y = 0; + } + + getID = env->GetMethodID(paperClass, GETIMG_W_STR, GETIMG_W_SIG); ++ CHECK_NULL(getID); + if (widthAsMargin) { + margins->width = paperSize->width - margins->x + - env->CallDoubleMethod(paper, getID); +@@ -3557,6 +3658,7 @@ + } + + getID = env->GetMethodID(paperClass, GETIMG_H_STR, GETIMG_H_SIG); ++ CHECK_NULL(getID); + if (widthAsMargin) { + margins->height = paperSize->height - margins->y + - env->CallDoubleMethod(paper, getID); +@@ -3567,7 +3669,6 @@ + if (margins->height < 0) { + margins->height = 0; + } +- + } + + /** +@@ -3587,8 +3688,10 @@ + jclass paperClass = env->GetObjectClass(paper); + jmethodID setSizeID = env->GetMethodID(paperClass, + SETSIZE_STR, SETSIZE_SIG); ++ CHECK_NULL(setSizeID); + jmethodID setImageableID = env->GetMethodID(paperClass, + SETIMAGEABLE_STR, SETIMAGEABLE_SIG); ++ CHECK_NULL(setImageableID); + + /* Set the physical size of the paper. + */ +@@ -3608,7 +3711,6 @@ + jdouble width = convertToPoints(intWidth, units); + jdouble height = convertToPoints(intHeight, units); + env->CallVoidMethod(paper, setImageableID, x, y, width, height); +- + } + + /** +@@ -3682,13 +3784,16 @@ + */ + void setCapabilities(JNIEnv *env, jobject self, HDC printDC) { + ++ jboolean err; + // width of page in pixels + jint pageWid = GetDeviceCaps(printDC, PHYSICALWIDTH); +- setIntField(env, self, PAGEW_STR, pageWid); ++ err = setIntField(env, self, PAGEW_STR, pageWid); ++ if (err) return; + + // height of page in pixels + jint pageHgt = GetDeviceCaps(printDC, PHYSICALHEIGHT); +- setIntField(env, self, PAGEH_STR, pageHgt); ++ err = setIntField(env, self, PAGEH_STR, pageHgt); ++ if (err) return; + + // x scaling factor of printer + jint xsf = GetDeviceCaps(printDC, SCALINGFACTORX); +@@ -3716,111 +3821,67 @@ + + // pixels per inch in x direction + jint xRes = GetDeviceCaps(printDC, LOGPIXELSX); +- setIntField(env, self, XRES_STR, xRes); ++ err = setIntField(env, self, XRES_STR, xRes); ++ if (err) return; + + // pixels per inch in y direction + jint yRes = GetDeviceCaps(printDC, LOGPIXELSY); +- setIntField(env, self, YRES_STR, yRes); ++ err = setIntField(env, self, YRES_STR, yRes); + + // x coord of printable area in pixels + jint xOrg = GetDeviceCaps(printDC, PHYSICALOFFSETX); +- setIntField(env, self, PHYSX_STR, xOrg); ++ err = setIntField(env, self, PHYSX_STR, xOrg); ++ if (err) return; + + // y coord of printable area in pixels + jint yOrg = GetDeviceCaps(printDC, PHYSICALOFFSETY); +- setIntField(env, self, PHYSY_STR, yOrg); ++ err = setIntField(env, self, PHYSY_STR, yOrg); ++ if (err) return; + + // width of printable area in pixels + jint printWid = GetDeviceCaps(printDC, HORZRES); +- setIntField(env, self, PHYSW_STR, printWid); ++ err = setIntField(env, self, PHYSW_STR, printWid); ++ if (err) return; + + // height of printable area in pixels + jint printHgt = GetDeviceCaps(printDC, VERTRES); + setIntField(env, self, PHYSH_STR, printHgt); +- + } + +- +-static inline WORD getPrintPaperSize(JNIEnv *env, jobject self) { +- return (WORD)getIntField(env, self, PRINTPAPERSIZE_STR); ++static inline WORD getPrintPaperSize(JNIEnv *env, jboolean* err, jobject self) { ++ return (WORD)getIntField(env, err, self, PRINTPAPERSIZE_STR); + } + +-static inline void setPrintPaperSize(JNIEnv *env, jobject self, WORD sz) { +- setIntField(env, self, PRINTPAPERSIZE_STR, (jint)sz); ++static inline jboolean setPrintPaperSize(JNIEnv *env, jobject self, WORD sz) { ++ return setIntField(env, self, PRINTPAPERSIZE_STR, (jint)sz); + } + + /** + * Return the java int value of the field 'fieldName' in the + * java instance 'self'. + */ +-static jint getIntField(JNIEnv *env, jobject self, const char *fieldName) { +- jfieldID fieldId = getIdOfIntField(env, self, fieldName); +- return env->GetIntField(self, fieldId); +-} +- +-/** +- * Return the java long value of the field 'fieldName' in the +- * java instance 'self'. +- */ +-static jlong getLongField(JNIEnv *env, jobject self, const char *fieldName) { +- jfieldID fieldId = getIdOfLongField(env, self, fieldName); +- return env->GetLongField(self, fieldId); ++static jint getIntField(JNIEnv *env, jboolean* err, jobject self, const char *fieldName) { ++ return JNU_GetFieldByName(env, err, self, fieldName, "I").i; + } + + /** + * Set the int field named 'fieldName' of the java instance + * 'self' to the value 'value'. + */ +-static void setIntField(JNIEnv *env, jobject self, const char *fieldName, +- jint value) { +- jfieldID fieldId = getIdOfIntField(env, self, fieldName); +- env->SetIntField(self, fieldId, value); ++static jboolean setIntField(JNIEnv *env, jobject self, const char *fieldName, jint value) { ++ jboolean err; ++ JNU_SetFieldByName(env, &err, self, fieldName, "I", value); ++ return err; + } + +-/** +- * Set the long field named 'fieldName' of the java instance +- * 'self' to the value 'value'. +- */ +-static void setLongField(JNIEnv *env, jobject self, const char *fieldName, +- jlong value) { +- jfieldID fieldId = getIdOfLongField(env, self, fieldName); +- env->SetLongField(self, fieldId, value); ++static jboolean getBooleanField(JNIEnv *env, jboolean* err, jobject self, const char *fieldName) { ++ return JNU_GetFieldByName(env, err, self, fieldName, "Z").z; + } + +-/** +- * Return the field id of the java instance 'self' of the +- * java int field named 'fieldName'. +- */ +-static jfieldID getIdOfIntField(JNIEnv *env, jobject self, +- const char *fieldName) { +- jclass myClass = env->GetObjectClass(self); +- jfieldID fieldId = env->GetFieldID(myClass, fieldName, kJavaIntStr); +- DASSERT(fieldId != 0); +- +- return fieldId; +- +-} +- +-/** +- * Return the field id of the java instance 'self' of the +- * java long field named 'fieldName'. +- */ +-static jfieldID getIdOfLongField(JNIEnv *env, jobject self, +- const char *fieldName) { +- jclass myClass = env->GetObjectClass(self); +- jfieldID fieldId = env->GetFieldID(myClass, fieldName, kJavaLongStr); +- DASSERT(fieldId != 0); +- +- return fieldId; +- +-} +- +-static void setBooleanField(JNIEnv *env, jobject self, const char *fieldName, +- jboolean value) { +- jclass myClass = env->GetObjectClass(self); +- jfieldID fieldId = env->GetFieldID(myClass, fieldName, "Z"); +- DASSERT(fieldId != 0); +- env->SetBooleanField(self, fieldId, value); ++static jboolean setBooleanField(JNIEnv *env, jobject self, const char *fieldName, jboolean value) { ++ jboolean err; ++ JNU_SetFieldByName(env, &err, self, fieldName, "Z", value); ++ return err; + } + + /** +@@ -3830,8 +3891,6 @@ + static void throwPrinterException(JNIEnv *env, DWORD err) { + char errStr[256]; + TCHAR t_errStr[256]; +- jclass printerException = env->FindClass(PRINTEREXCEPTION_STR); +- + errStr[0] = '\0'; + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, +@@ -3843,7 +3902,7 @@ + + WideCharToMultiByte(CP_UTF8, 0, t_errStr, -1, + errStr, sizeof(errStr), NULL, NULL); +- env->ThrowNew(printerException, errStr); ++ JNU_ThrowByName(env, PRINTEREXCEPTION_STR, errStr); + } + + +@@ -4176,8 +4235,9 @@ + jstring printer) + { + TRY; +- LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, +- printer, NULL); ++ LPTSTR printerName = (LPTSTR)JNU_GetStringPlatformChars(env, printer, NULL); ++ CHECK_NULL(printerName); ++ + HDC hDC = AwtPrintControl::getPrintDC(env, name); + if (hDC != NULL) { + DeletePrintDC(hDC); +@@ -4188,8 +4248,7 @@ + hDC = ::CreateDC(TEXT("WINSPOOL"), printerName, NULL, NULL); + RESTORE_CONTROLWORD + if (hDC == NULL) { +- jclass printerException = env->FindClass(PRINTEREXCEPTION_STR); +- env->ThrowNew(printerException, "Invalid name of PrintService."); ++ JNU_ThrowByName(env, PRINTEREXCEPTION_STR, "Invalid name of PrintService."); + JNU_ReleaseStringPlatformChars(env, printer, printerName); + return; + } +@@ -4223,11 +4282,19 @@ + + if (devmode != NULL) { + if (devmode->dmFields & DM_COPIES) { +- setBooleanField(env, name, DRIVER_COPIES_STR, JNI_TRUE); ++ jboolean err = setBooleanField(env, name, DRIVER_COPIES_STR, JNI_TRUE); ++ if (err) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ return; ++ } + } + + if (devmode->dmFields & DM_COLLATE) { +- setBooleanField(env, name, DRIVER_COLLATE_STR, JNI_TRUE); ++ jboolean err = setBooleanField(env, name, DRIVER_COLLATE_STR, JNI_TRUE); ++ if (err) { ++ JNU_ReleaseStringPlatformChars(env, printer, printerName); ++ return; ++ } + } + + ::GlobalUnlock(hDevMode); +@@ -4237,7 +4304,6 @@ + + JNU_ReleaseStringPlatformChars(env, printer, printerName); + CATCH_BAD_ALLOC; +- + } + + +@@ -4299,14 +4365,15 @@ + { + TRY; + +- AwtPrintDialog::controlID = +- env->GetFieldID(cls, "pjob", "Ljava/awt/print/PrinterJob;"); ++ AwtPrintDialog::controlID = env->GetFieldID(cls, "pjob", "Ljava/awt/print/PrinterJob;"); ++ DASSERT(AwtPrintDialog::controlID != NULL); ++ CHECK_NULL(AwtPrintDialog::controlID); ++ + jclass printDialogPeerClass = env->FindClass("sun/awt/windows/WPrintDialogPeer"); +- AwtPrintDialog::setHWndMID = +- env->GetMethodID(printDialogPeerClass, "setHWnd", "(J)V"); +- +- DASSERT(AwtPrintDialog::controlID != NULL); ++ CHECK_NULL(printDialogPeerClass); ++ AwtPrintDialog::setHWndMID = env->GetMethodID(printDialogPeerClass, "setHWnd", "(J)V"); + DASSERT(AwtPrintDialog::setHWndMID != NULL); ++ CHECK_NULL(AwtPrintDialog::setHWndMID); + + AwtPrintControl::initIDs(env, cls); + CATCH_BAD_ALLOC; +--- ./jdk/src/windows/native/sun/windows/awt_Rectangle.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Rectangle.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -46,14 +46,20 @@ + TRY; + + AwtRectangle::xID = env->GetFieldID(cls, "x", "I"); ++ DASSERT(AwtRectangle::xID != NULL); ++ CHECK_NULL(AwtRectangle::xID); ++ + AwtRectangle::yID = env->GetFieldID(cls, "y", "I"); ++ DASSERT(AwtRectangle::yID != NULL); ++ CHECK_NULL(AwtRectangle::yID); ++ + AwtRectangle::widthID = env->GetFieldID(cls, "width", "I"); ++ DASSERT(AwtRectangle::widthID != NULL); ++ CHECK_NULL(AwtRectangle::widthID); ++ + AwtRectangle::heightID = env->GetFieldID(cls, "height", "I"); +- +- DASSERT(AwtRectangle::xID != NULL); +- DASSERT(AwtRectangle::yID != NULL); +- DASSERT(AwtRectangle::widthID != NULL); + DASSERT(AwtRectangle::heightID != NULL); ++ CHECK_NULL(AwtRectangle::heightID); + + CATCH_BAD_ALLOC; + } +--- ./jdk/src/windows/native/sun/windows/awt_Robot.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Robot.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -35,6 +35,7 @@ + { + JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + m_peerObject = env->NewWeakGlobalRef(peer); ++ JNU_CHECK_EXCEPTION(env); + JNI_SET_PDATA(peer, this); + } + +--- ./jdk/src/windows/native/sun/windows/awt_ScrollPane.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_ScrollPane.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -600,12 +600,16 @@ + + AwtScrollPane::scrollbarDisplayPolicyID = + env->GetFieldID(cls, "scrollbarDisplayPolicy", "I"); ++ DASSERT(AwtScrollPane::scrollbarDisplayPolicyID != NULL); ++ CHECK_NULL(AwtScrollPane::scrollbarDisplayPolicyID); ++ + AwtScrollPane::hAdjustableID = + env->GetFieldID(cls, "hAdjustable", "Ljava/awt/ScrollPaneAdjustable;"); ++ DASSERT(AwtScrollPane::hAdjustableID != NULL); ++ CHECK_NULL(AwtScrollPane::hAdjustableID); ++ + AwtScrollPane::vAdjustableID = + env->GetFieldID(cls, "vAdjustable", "Ljava/awt/ScrollPaneAdjustable;"); +- DASSERT(AwtScrollPane::scrollbarDisplayPolicyID != NULL); +- DASSERT(AwtScrollPane::hAdjustableID != NULL); + DASSERT(AwtScrollPane::vAdjustableID != NULL); + + CATCH_BAD_ALLOC; +@@ -631,10 +635,11 @@ + TRY; + + AwtScrollPane::unitIncrementID = env->GetFieldID(cls,"unitIncrement", "I"); ++ DASSERT(AwtScrollPane::unitIncrementID != NULL); ++ CHECK_NULL(AwtScrollPane::unitIncrementID); ++ + AwtScrollPane::blockIncrementID = + env->GetFieldID(cls,"blockIncrement", "I"); +- +- DASSERT(AwtScrollPane::unitIncrementID != NULL); + DASSERT(AwtScrollPane::blockIncrementID != NULL); + + CATCH_BAD_ALLOC; +--- ./jdk/src/windows/native/sun/windows/awt_Scrollbar.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Scrollbar.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -488,11 +488,14 @@ + TRY; + + AwtScrollbar::lineIncrementID = env->GetFieldID(cls, "lineIncrement", "I"); ++ DASSERT(AwtScrollbar::lineIncrementID != NULL); ++ CHECK_NULL(AwtScrollbar::lineIncrementID); ++ + AwtScrollbar::pageIncrementID = env->GetFieldID(cls, "pageIncrement", "I"); ++ DASSERT(AwtScrollbar::pageIncrementID != NULL); ++ CHECK_NULL(AwtScrollbar::pageIncrementID); ++ + AwtScrollbar::orientationID = env->GetFieldID(cls, "orientation", "I"); +- +- DASSERT(AwtScrollbar::lineIncrementID != NULL); +- DASSERT(AwtScrollbar::pageIncrementID != NULL); + DASSERT(AwtScrollbar::orientationID != NULL); + + CATCH_BAD_ALLOC; +--- ./jdk/src/windows/native/sun/windows/awt_TextComponent.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_TextComponent.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -852,9 +852,10 @@ + TRY; + + jclass textComponentClassID = env->FindClass("java/awt/TextComponent"); ++ CHECK_NULL(textComponentClassID); ++ + AwtTextComponent::canAccessClipboardMID = +- env->GetMethodID(textComponentClassID, +- "canAccessClipboard", "()Z"); ++ env->GetMethodID(textComponentClassID, "canAccessClipboard", "()Z"); + env->DeleteLocalRef(textComponentClassID); + + DASSERT(AwtTextComponent::canAccessClipboardMID != NULL); +--- ./jdk/src/windows/native/sun/windows/awt_TextField.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_TextField.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -200,7 +200,10 @@ + si.cbSize = sizeof(si); + si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; + ++ SendMessage(EM_SHOWSCROLLBAR, SB_HORZ, TRUE); + VERIFY(::GetScrollInfo(GetHWnd(), SB_HORZ, &si)); ++ SendMessage(EM_SHOWSCROLLBAR, SB_HORZ, FALSE); ++ + if (bScrollLeft == TRUE) { + si.nPos = si.nPos - si.nPage / 2; + si.nPos = max(si.nMin, si.nPos); +--- ./jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -172,35 +172,22 @@ + + if (awtAutoShutdownClass == NULL) { + jclass awtAutoShutdownClassLocal = env->FindClass("sun/awt/AWTAutoShutdown"); +- if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { +- env->ExceptionDescribe(); +- env->ExceptionClear(); +- } + DASSERT(awtAutoShutdownClassLocal != NULL); +- if (awtAutoShutdownClassLocal == NULL) { +- return; +- } ++ if (!awtAutoShutdownClassLocal) throw std::bad_alloc(); + + awtAutoShutdownClass = (jclass)env->NewGlobalRef(awtAutoShutdownClassLocal); + env->DeleteLocalRef(awtAutoShutdownClassLocal); ++ if (!awtAutoShutdownClass) throw std::bad_alloc(); + + notifyBusyMethodID = env->GetStaticMethodID(awtAutoShutdownClass, + "notifyToolkitThreadBusy", "()V"); +- if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { +- env->ExceptionDescribe(); +- env->ExceptionClear(); +- } ++ DASSERT(notifyBusyMethodID != NULL); ++ if (!notifyBusyMethodID) throw std::bad_alloc(); ++ + notifyFreeMethodID = env->GetStaticMethodID(awtAutoShutdownClass, + "notifyToolkitThreadFree", "()V"); +- if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { +- env->ExceptionDescribe(); +- env->ExceptionClear(); +- } +- DASSERT(notifyBusyMethodID != NULL); + DASSERT(notifyFreeMethodID != NULL); +- if (notifyBusyMethodID == NULL || notifyFreeMethodID == NULL) { +- return; +- } ++ if (!notifyFreeMethodID) throw std::bad_alloc(); + } /* awtAutoShutdownClass == NULL*/ + + if (busy) { +@@ -779,9 +766,11 @@ + + jclass systemColorClass = env->FindClass("java/awt/SystemColor"); + DASSERT(systemColorClass); ++ if (!systemColorClass) throw std::bad_alloc(); + + jmethodID mid = env->GetStaticMethodID(systemColorClass, "updateSystemColors", "()V"); + DASSERT(mid); ++ if (!mid) throw std::bad_alloc(); + + env->CallStaticVoidMethod(systemColorClass, mid); + +@@ -1041,6 +1030,8 @@ + + // Notify Java side - call WToolkit.displayChanged() + jclass clazz = env->FindClass("sun/awt/windows/WToolkit"); ++ DASSERT(clazz != NULL); ++ if (!clazz) throw std::bad_alloc(); + env->CallStaticVoidMethod(clazz, AwtToolkit::displayChangeMID); + + GetInstance().m_displayChanged = TRUE; +@@ -2053,15 +2044,20 @@ + + AwtToolkit::getDefaultToolkitMID = + env->GetStaticMethodID(cls,"getDefaultToolkit","()Ljava/awt/Toolkit;"); ++ DASSERT(AwtToolkit::getDefaultToolkitMID != NULL); ++ CHECK_NULL(AwtToolkit::getDefaultToolkitMID); ++ + AwtToolkit::getFontMetricsMID = +- env->GetMethodID(cls, "getFontMetrics", +- "(Ljava/awt/Font;)Ljava/awt/FontMetrics;"); +- AwtToolkit::insetsMID = +- env->GetMethodID(env->FindClass("java/awt/Insets"), "<init>", "(IIII)V"); +- +- DASSERT(AwtToolkit::getDefaultToolkitMID != NULL); ++ env->GetMethodID(cls, "getFontMetrics", "(Ljava/awt/Font;)Ljava/awt/FontMetrics;"); + DASSERT(AwtToolkit::getFontMetricsMID != NULL); +- DASSERT(AwtToolkit::insetsMID != NULL); ++ CHECK_NULL(AwtToolkit::getFontMetricsMID); ++ ++ jclass insetsClass = env->FindClass("java/awt/Insets"); ++ DASSERT(insetsClass != NULL); ++ CHECK_NULL(insetsClass); ++ AwtToolkit::insetsMID = env->GetMethodID(insetsClass, "<init>", "(IIII)V"); ++ DASSERT(AwtToolkit::insetsMID != NULL); ++ CHECK_NULL(AwtToolkit::insetsMID); + + CATCH_BAD_ALLOC; + } +@@ -2088,10 +2084,12 @@ + AwtToolkit::windowsSettingChangeMID = + env->GetMethodID(cls, "windowsSettingChange", "()V"); + DASSERT(AwtToolkit::windowsSettingChangeMID != 0); ++ CHECK_NULL(AwtToolkit::windowsSettingChangeMID); + + AwtToolkit::displayChangeMID = + env->GetStaticMethodID(cls, "displayChanged", "()V"); + DASSERT(AwtToolkit::displayChangeMID != 0); ++ CHECK_NULL(AwtToolkit::displayChangeMID); + + // Set various global IDs needed by JAWT code. Note: these + // variables cannot be set by JAWT code directly due to +@@ -2102,24 +2100,37 @@ + // negligible penalty. + jclass sDataClassLocal = env->FindClass("sun/java2d/SurfaceData"); + DASSERT(sDataClassLocal != 0); ++ CHECK_NULL(sDataClassLocal); ++ + jclass vImgClassLocal = env->FindClass("sun/awt/image/SunVolatileImage"); + DASSERT(vImgClassLocal != 0); ++ CHECK_NULL(vImgClassLocal); ++ + jclass vSMgrClassLocal = + env->FindClass("sun/awt/image/VolatileSurfaceManager"); + DASSERT(vSMgrClassLocal != 0); ++ CHECK_NULL(vSMgrClassLocal); ++ + jclass componentClassLocal = env->FindClass("java/awt/Component"); + DASSERT(componentClassLocal != 0); ++ CHECK_NULL(componentClassLocal); ++ + jawtSMgrID = env->GetFieldID(vImgClassLocal, "volSurfaceManager", + "Lsun/awt/image/VolatileSurfaceManager;"); + DASSERT(jawtSMgrID != 0); ++ CHECK_NULL(jawtSMgrID); ++ + jawtSDataID = env->GetFieldID(vSMgrClassLocal, "sdCurrent", + "Lsun/java2d/SurfaceData;"); + DASSERT(jawtSDataID != 0); ++ CHECK_NULL(jawtSDataID); ++ + jawtPDataID = env->GetFieldID(sDataClassLocal, "pData", "J"); + DASSERT(jawtPDataID != 0); +- ++ CHECK_NULL(jawtPDataID); + // Save these classes in global references for later use + jawtVImgClass = (jclass)env->NewGlobalRef(vImgClassLocal); ++ CHECK_NULL(jawtVImgClass); + jawtComponentClass = (jclass)env->NewGlobalRef(componentClassLocal); + + CATCH_BAD_ALLOC; +@@ -2380,7 +2391,11 @@ + TRY; + + if (AwtToolkit::GetScreenInsets(screen, &rect)) { +- insets = env->NewObject(env->FindClass("java/awt/Insets"), ++ jclass insetsClass = env->FindClass("java/awt/Insets"); ++ DASSERT(insetsClass != NULL); ++ CHECK_NULL_RETURN(insetsClass, NULL); ++ ++ insets = env->NewObject(insetsClass, + AwtToolkit::insetsMID, + rect.top, + rect.left, +--- ./jdk/src/windows/native/sun/windows/awt_Toolkit.h Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Toolkit.h Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -80,7 +80,7 @@ + int result = m_env->PushLocalFrame(size); + if (result < 0) { + DASSERT(FALSE); +- JNU_ThrowOutOfMemoryError(m_env, "Can't allocate localRefs"); ++ throw std::bad_alloc(); + } + } + INLINE ~JNILocalFrame() { m_env->PopLocalFrame(NULL); } +--- ./jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -503,6 +503,7 @@ + env->GetMethodID(mouseEventCls, "<init>", + "(Ljava/awt/Component;IJIIIIIIZI)V"); + DASSERT(mouseEventConst); ++ CHECK_NULL(mouseEventConst); + } + if (env->EnsureLocalCapacity(2) < 0) { + return; +@@ -556,6 +557,7 @@ + env->GetMethodID(actionEventCls, "<init>", + "(Ljava/lang/Object;ILjava/lang/String;JI)V"); + DASSERT(actionEventConst); ++ CHECK_NULL(actionEventConst); + } + if (env->EnsureLocalCapacity(2) < 0) { + return; +@@ -736,6 +738,7 @@ + } + + tooltipStr = JNU_GetStringPlatformChars(env, jtooltip, (jboolean *)NULL); ++ if (env->ExceptionCheck()) goto ret; + trayIcon->SetToolTip(tooltipStr); + JNU_ReleaseStringPlatformChars(env, jtooltip, tooltipStr); + ret: +@@ -855,9 +858,18 @@ + trayIcon = (AwtTrayIcon *)pData; + + captionStr = JNU_GetStringPlatformChars(env, jcaption, (jboolean *)NULL); ++ if (env->ExceptionCheck()) goto ret; + textStr = JNU_GetStringPlatformChars(env, jtext, (jboolean *)NULL); ++ if (env->ExceptionCheck()) { ++ JNU_ReleaseStringPlatformChars(env, jcaption, captionStr); ++ goto ret; ++ } + msgTypeStr = JNU_GetStringPlatformChars(env, jmsgType, (jboolean *)NULL); +- ++ if (env->ExceptionCheck()) { ++ JNU_ReleaseStringPlatformChars(env, jcaption, captionStr); ++ JNU_ReleaseStringPlatformChars(env, jtext, textStr); ++ goto ret; ++ } + trayIcon->DisplayMessage(captionStr, textStr, msgTypeStr); + + JNU_ReleaseStringPlatformChars(env, jcaption, captionStr); +@@ -889,10 +901,12 @@ + + /* init field ids */ + AwtTrayIcon::idID = env->GetFieldID(cls, "id", "I"); ++ DASSERT(AwtTrayIcon::idID != NULL); ++ CHECK_NULL(AwtTrayIcon::idID); ++ + AwtTrayIcon::actionCommandID = env->GetFieldID(cls, "actionCommand", "Ljava/lang/String;"); +- +- DASSERT(AwtTrayIcon::idID != NULL); + DASSERT(AwtTrayIcon::actionCommandID != NULL); ++ CHECK_NULL( AwtTrayIcon::actionCommandID); + + CATCH_BAD_ALLOC; + } +@@ -981,8 +995,11 @@ + jint *intRasterDataPtr = NULL; + HBITMAP hColor = NULL; + try { +- intRasterDataPtr = +- (jint *)env->GetPrimitiveArrayCritical(intRasterData, 0); ++ intRasterDataPtr = (jint *)env->GetPrimitiveArrayCritical(intRasterData, 0); ++ if (intRasterDataPtr == NULL) { ++ ::DeleteObject(hMask); ++ return; ++ } + hColor = AwtTrayIcon::CreateBMP(NULL, (int *)intRasterDataPtr, nSS, nW, nH); + } catch (...) { + if (intRasterDataPtr != NULL) { +--- ./jdk/src/windows/native/sun/windows/awt_Win32GraphicsConfig.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Win32GraphicsConfig.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -91,6 +91,7 @@ + jobject bounds = NULL; + + clazz = env->FindClass("java/awt/Rectangle"); ++ CHECK_NULL_RETURN(clazz, NULL); + mid = env->GetMethodID(clazz, "<init>", "(IIII)V"); + if (mid != 0) { + RECT rRW = {0, 0, 0, 0}; +--- ./jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -328,16 +328,13 @@ + jintArray bitsArray; + + clazz1 = env->FindClass("java/awt/color/ColorSpace"); ++ CHECK_NULL_RETURN(clazz1, NULL); + mid = env->GetStaticMethodID(clazz1, "getInstance", + "(I)Ljava/awt/color/ColorSpace;"); +- if (mid == 0) { +- return NULL; +- } ++ CHECK_NULL_RETURN(mid, NULL); + cspace = env->CallStaticObjectMethod(clazz1, mid, + java_awt_color_ColorSpace_CS_GRAY); +- if (cspace == 0) { +- return NULL; +- } ++ CHECK_NULL_RETURN(cspace, NULL); + + bits[0] = 8; + bitsArray = env->NewIntArray(1); +@@ -348,13 +345,10 @@ + } + + clazz = env->FindClass("java/awt/image/ComponentColorModel"); +- ++ CHECK_NULL_RETURN(clazz, NULL); + mid = env->GetMethodID(clazz,"<init>", + "(Ljava/awt/color/ColorSpace;[IZZII)V"); +- +- if (mid == 0) { +- return NULL; +- } ++ CHECK_NULL_RETURN(mid, NULL); + + awt_colormodel = env->NewObject(clazz, mid, + cspace, +@@ -370,12 +364,11 @@ + jbyte vbits[256/8]; + jobject validBits = NULL; + ++ CHECK_NULL_RETURN(hRGB, NULL); + /* Create the LUT from the color map */ + try { + rgb = (unsigned int *) env->GetPrimitiveArrayCritical(hRGB, 0); +- if (rgb == NULL) { +- return NULL; +- } ++ CHECK_NULL_RETURN(rgb, NULL); + rgbP = rgb; + if (!palette) { + palette = new AwtPalette(this); +@@ -439,10 +432,12 @@ + // Construct a new color model + if (!allvalid) { + jbyteArray bArray = env->NewByteArray(sizeof(vbits)); ++ CHECK_NULL_RETURN(bArray, NULL); + env->SetByteArrayRegion(bArray, 0, sizeof(vbits), vbits); + validBits = JNU_NewObjectByName(env, + "java/math/BigInteger", + "([B)V", bArray); ++ JNU_CHECK_EXCEPTION_RETURN(env, NULL); + } + awt_colormodel = + JNU_NewObjectByName(env, +@@ -500,19 +495,22 @@ + jintArray cacheArray = (jintArray)env->GetObjectField(colorModel, + AwtWin32GraphicsDevice::indexCMcacheID); + if (!rgbArray || !cacheArray) { +- JNU_ThrowInternalError(env, +- "rgb or lookupcache array of IndexColorModel null"); ++ JNU_ThrowInternalError(env, "rgb or lookupcache array of IndexColorModel null"); + return; + } + int rgbLength = env->GetArrayLength(rgbArray); + int cacheLength = env->GetArrayLength(cacheArray); +- jint *cmEntries = (jint *)env->GetPrimitiveArrayCritical(rgbArray, +- &isCopy); +- jint *cache = (jint *)env->GetPrimitiveArrayCritical(cacheArray, +- &isCopy); +- if (!cmEntries || !cache) { +- JNU_ThrowInternalError(env, +- "Problem retrieving rgb or cache critical array"); ++ jint *cmEntries = (jint *)env->GetPrimitiveArrayCritical(rgbArray, &isCopy); ++ if (!cmEntries) { ++ env->ExceptionClear(); ++ JNU_ThrowInternalError(env, "Problem retrieving rgb critical array"); ++ return; ++ } ++ jint *cache = (jint *)env->GetPrimitiveArrayCritical(cacheArray, &isCopy); ++ if (!cache) { ++ env->ExceptionClear(); ++ env->ReleasePrimitiveArrayCritical(rgbArray, cmEntries, JNI_ABORT); ++ JNU_ThrowInternalError(env, "Problem retrieving cache critical array"); + return; + } + // Set the new rgb values +@@ -839,31 +837,36 @@ + /* class ids */ + AwtWin32GraphicsDevice::indexCMClass = + (jclass)env->NewGlobalRef(env->FindClass("java/awt/image/IndexColorModel")); ++ DASSERT(AwtWin32GraphicsDevice::indexCMClass); ++ CHECK_NULL(AwtWin32GraphicsDevice::indexCMClass); ++ + AwtWin32GraphicsDevice::wToolkitClass = + (jclass)env->NewGlobalRef(env->FindClass("sun/awt/windows/WToolkit")); +- +- DASSERT(AwtWin32GraphicsDevice::indexCMClass); + DASSERT(AwtWin32GraphicsDevice::wToolkitClass); ++ CHECK_NULL(AwtWin32GraphicsDevice::wToolkitClass); + + /* field ids */ + AwtWin32GraphicsDevice::dynamicColorModelID = env->GetFieldID(cls, + "dynamicColorModel", "Ljava/awt/image/ColorModel;"); ++ DASSERT(AwtWin32GraphicsDevice::dynamicColorModelID); ++ CHECK_NULL(AwtWin32GraphicsDevice::dynamicColorModelID); ++ + AwtWin32GraphicsDevice::indexCMrgbID = + env->GetFieldID(AwtWin32GraphicsDevice::indexCMClass, "rgb", "[I"); ++ DASSERT(AwtWin32GraphicsDevice::indexCMrgbID); ++ CHECK_NULL(AwtWin32GraphicsDevice::indexCMrgbID); ++ + AwtWin32GraphicsDevice::indexCMcacheID = + env->GetFieldID(AwtWin32GraphicsDevice::indexCMClass, + "lookupcache", "[I"); ++ DASSERT(AwtWin32GraphicsDevice::indexCMcacheID); ++ CHECK_NULL(AwtWin32GraphicsDevice::indexCMcacheID); + + /* method ids */ + AwtWin32GraphicsDevice::paletteChangedMID = env->GetStaticMethodID( + AwtWin32GraphicsDevice::wToolkitClass, "paletteChanged", "()V"); +- +- +- DASSERT(AwtWin32GraphicsDevice::dynamicColorModelID); +- DASSERT(AwtWin32GraphicsDevice::indexCMrgbID); +- DASSERT(AwtWin32GraphicsDevice::indexCMcacheID); +- + DASSERT(AwtWin32GraphicsDevice::paletteChangedMID); ++ CHECK_NULL(AwtWin32GraphicsDevice::paletteChangedMID); + + // Only want to call this once per session + make_uns_ordered_dither_array(img_oda_alpha, 256); +@@ -1069,16 +1072,15 @@ + + jclass displayModeClass = env->FindClass("java/awt/DisplayMode"); + if (JNU_IsNull(env, displayModeClass)) { +- JNU_ThrowInternalError(env, +- "Could not get display mode class"); ++ env->ExceptionClear(); ++ JNU_ThrowInternalError(env, "Could not get display mode class"); + return NULL; + } + +- jmethodID cid = env->GetMethodID(displayModeClass, "<init>", +- "(IIII)V"); ++ jmethodID cid = env->GetMethodID(displayModeClass, "<init>", "(IIII)V"); + if (cid == NULL) { +- JNU_ThrowInternalError(env, +- "Could not get display mode constructor"); ++ env->ExceptionClear(); ++ JNU_ThrowInternalError(env, "Could not get display mode constructor"); + return NULL; + } + +@@ -1224,6 +1226,7 @@ + jmethodID mid = env->GetMethodID(arrayListClass, "add", + "(Ljava/lang/Object;)Z"); + if (mid == NULL) { ++ env->ExceptionClear(); + JNU_ThrowInternalError(env, + "Could not get method java.util.ArrayList.add()"); + return; +@@ -1264,6 +1267,7 @@ + if (dm.dmBitsPerPel >= 8) { + addDisplayMode(env, arrayList, dm.dmPelsWidth, dm.dmPelsHeight, + dm.dmBitsPerPel, dm.dmDisplayFrequency); ++ JNU_CHECK_EXCEPTION(env); + } + } + +--- ./jdk/src/windows/native/sun/windows/awt_Window.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Window.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -483,6 +483,8 @@ + env->DeleteLocalRef(target); + + InitType(env, peer); ++ JNU_CHECK_EXCEPTION(env); ++ + TweakStyle(windowStyle, windowExStyle); + + AwtCanvas::CreateHWnd(env, title, +@@ -684,15 +686,27 @@ + + if (point2DClassID == NULL) { + jclass point2DClassIDLocal = env->FindClass("java/awt/geom/Point2D"); ++ if (point2DClassIDLocal == NULL) { ++ env->DeleteLocalRef(point2D); ++ return; ++ } + point2DClassID = (jclass)env->NewGlobalRef(point2DClassIDLocal); + env->DeleteLocalRef(point2DClassIDLocal); + } + + if (point2DGetXMID == NULL) { + point2DGetXMID = env->GetMethodID(point2DClassID, "getX", "()D"); ++ if (point2DGetXMID == NULL) { ++ env->DeleteLocalRef(point2D); ++ return; ++ } + } + if (point2DGetYMID == NULL) { + point2DGetYMID = env->GetMethodID(point2DClassID, "getY", "()D"); ++ if (point2DGetYMID == NULL) { ++ env->DeleteLocalRef(point2D); ++ return; ++ } + } + + +@@ -1071,6 +1085,7 @@ + if (JNU_IsInstanceOfByName(env, target, "javax/swing/Popup$HeavyWeightWindow") > 0) { + window->m_isRetainingHierarchyZOrder = TRUE; + } ++ if (env->ExceptionCheck()) goto done; + DWORD style = WS_CLIPCHILDREN | WS_POPUP; + DWORD exStyle = WS_EX_NOACTIVATE; + if (GetRTL()) { +@@ -1378,6 +1393,10 @@ + ((AwtFrame*)this)->GetMenuBar()) { + m_insets.top += ::GetSystemMetrics(SM_CYMENU); + } ++ if (env->ExceptionCheck()) { ++ env->DeleteLocalRef(target); ++ return FALSE; ++ } + m_insets.bottom += extraBottomInsets; + env->DeleteLocalRef(target); + } +@@ -1445,14 +1464,13 @@ + classEvent = (jclass)env->NewGlobalRef(classEvent); + } + env->PopLocalFrame(0); ++ CHECK_NULL(classEvent); + } + static jmethodID eventInitMID = NULL; + if (eventInitMID == NULL) { + eventInitMID = env->GetMethodID(classEvent, "<init>", + "(Ljava/awt/Component;I)V"); +- if (eventInitMID == NULL) { +- return; +- } ++ CHECK_NULL(eventInitMID); + } + if (env->EnsureLocalCapacity(2) < 0) { + return; +@@ -1462,6 +1480,10 @@ + target, eventId); + DASSERT(!safe_ExceptionOccurred(env)); + DASSERT(event != NULL); ++ if (event == NULL) { ++ env->DeleteLocalRef(target); ++ return; ++ } + SendEvent(event); + + env->DeleteLocalRef(target); +@@ -1503,10 +1525,7 @@ + jclass sequencedEventClsLocal + = env->FindClass("java/awt/SequencedEvent"); + DASSERT(sequencedEventClsLocal); +- if (sequencedEventClsLocal == NULL) { +- /* exception already thrown */ +- return; +- } ++ CHECK_NULL(sequencedEventClsLocal); + sequencedEventCls = + (jclass)env->NewGlobalRef(sequencedEventClsLocal); + env->DeleteLocalRef(sequencedEventClsLocal); +@@ -1517,6 +1536,7 @@ + sequencedEventConst = + env->GetMethodID(sequencedEventCls, "<init>", + "(Ljava/awt/AWTEvent;)V"); ++ CHECK_NULL(sequencedEventConst); + } + + if (env->EnsureLocalCapacity(3) < 0) { +@@ -1539,6 +1559,7 @@ + env->DeleteLocalRef(jOpposite); jOpposite = NULL; + } + env->DeleteLocalRef(target); target = NULL; ++ CHECK_NULL(event); + + if (id == java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS || + id == java_awt_event_WindowEvent_WINDOW_LOST_FOCUS) +@@ -2024,10 +2045,15 @@ + + jclass peerCls = env->GetObjectClass(m_peerObject); + DASSERT(peerCls); ++ CHECK_NULL(peerCls); + + jmethodID draggedID = env->GetMethodID(peerCls, "draggedToNewScreen", + "()V"); + DASSERT(draggedID); ++ if (draggedID == NULL) { ++ env->DeleteLocalRef(peerCls); ++ return; ++ } + + env->CallVoidMethod(m_peerObject, draggedID); + m_screenNum = curScrn; +@@ -2505,6 +2531,7 @@ + } + m_hIconSm = NULL; + m_hIcon = CreateIconFromRaster(env, iconRaster, w, h); ++ JNU_CHECK_EXCEPTION(env); + m_hIconSm = CreateIconFromRaster(env, smallIconRaster, smw, smh); + + m_iconInherited = (m_hIcon == NULL); +@@ -3057,22 +3084,23 @@ + { + TRY; + +- AwtWindow::warningStringID = +- env->GetFieldID(cls, "warningString", "Ljava/lang/String;"); +- AwtWindow::locationByPlatformID = +- env->GetFieldID(cls, "locationByPlatform", "Z"); +- AwtWindow::securityWarningWidthID = +- env->GetFieldID(cls, "securityWarningWidth", "I"); +- AwtWindow::securityWarningHeightID = +- env->GetFieldID(cls, "securityWarningHeight", "I"); +- AwtWindow::getWarningStringMID = +- env->GetMethodID(cls, "getWarningString", "()Ljava/lang/String;"); +- AwtWindow::autoRequestFocusID = +- env->GetFieldID(cls, "autoRequestFocus", "Z"); +- AwtWindow::calculateSecurityWarningPositionMID = +- env->GetMethodID(cls, "calculateSecurityWarningPosition", "(DDDD)Ljava/awt/geom/Point2D;"); ++ CHECK_NULL(AwtWindow::warningStringID = ++ env->GetFieldID(cls, "warningString", "Ljava/lang/String;")); ++ CHECK_NULL(AwtWindow::locationByPlatformID = ++ env->GetFieldID(cls, "locationByPlatform", "Z")); ++ CHECK_NULL(AwtWindow::securityWarningWidthID = ++ env->GetFieldID(cls, "securityWarningWidth", "I")); ++ CHECK_NULL(AwtWindow::securityWarningHeightID = ++ env->GetFieldID(cls, "securityWarningHeight", "I")); ++ CHECK_NULL(AwtWindow::getWarningStringMID = ++ env->GetMethodID(cls, "getWarningString", "()Ljava/lang/String;")); ++ CHECK_NULL(AwtWindow::autoRequestFocusID = ++ env->GetFieldID(cls, "autoRequestFocus", "Z")); ++ CHECK_NULL(AwtWindow::calculateSecurityWarningPositionMID = ++ env->GetMethodID(cls, "calculateSecurityWarningPosition", "(DDDD)Ljava/awt/geom/Point2D;")); + + jclass windowTypeClass = env->FindClass("java/awt/Window$Type"); ++ CHECK_NULL(windowTypeClass); + AwtWindow::windowTypeNameMID = + env->GetMethodID(windowTypeClass, "name", "()Ljava/lang/String;"); + env->DeleteLocalRef(windowTypeClass); +@@ -3099,10 +3127,10 @@ + { + TRY; + +- AwtWindow::sysXID = env->GetFieldID(cls, "sysX", "I"); +- AwtWindow::sysYID = env->GetFieldID(cls, "sysY", "I"); +- AwtWindow::sysWID = env->GetFieldID(cls, "sysW", "I"); +- AwtWindow::sysHID = env->GetFieldID(cls, "sysH", "I"); ++ CHECK_NULL(AwtWindow::sysXID = env->GetFieldID(cls, "sysX", "I")); ++ CHECK_NULL(AwtWindow::sysYID = env->GetFieldID(cls, "sysY", "I")); ++ CHECK_NULL(AwtWindow::sysWID = env->GetFieldID(cls, "sysW", "I")); ++ CHECK_NULL(AwtWindow::sysHID = env->GetFieldID(cls, "sysH", "I")); + + AwtWindow::windowTypeID = env->GetFieldID(cls, "windowType", + "Ljava/awt/Window$Type;"); +--- ./jdk/src/windows/native/sun/windows/awt_new.cpp Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_new.cpp Wed Jul 30 18:42:59 2014 +0100 +@@ -149,7 +149,7 @@ + handle_bad_alloc(void) { + if (jvm != NULL) { + JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); +- if (env != NULL) { ++ if (env != NULL && !env->ExceptionCheck()) { + JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); + } + } +@@ -163,18 +163,13 @@ + safe_ExceptionOccurred(JNIEnv *env) throw (std::bad_alloc) { + jthrowable xcp = env->ExceptionOccurred(); + if (xcp != NULL) { +- env->ExceptionClear(); // if we don't do this, FindClass will fail +- +- jclass outofmem = env->FindClass("java/lang/OutOfMemoryError"); +- DASSERT(outofmem != NULL); +- jboolean isOutofmem = env->IsInstanceOf(xcp, outofmem); +- +- env->DeleteLocalRef(outofmem); +- +- if (isOutofmem) { ++ env->ExceptionClear(); // if we don't do this, isInstanceOf will fail ++ jint isOutofmem = JNU_IsInstanceOfByName(env, xcp, "java/lang/OutOfMemoryError"); ++ if (isOutofmem > 0) { + env->DeleteLocalRef(xcp); + throw std::bad_alloc(); + } else { ++ env->ExceptionClear(); + // rethrow exception + env->Throw(xcp); + return xcp; +--- ./jdk/test/ProblemList.txt Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/ProblemList.txt Wed Jul 30 18:42:59 2014 +0100 +@@ -1,6 +1,6 @@ + ########################################################################### + # +-# Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -41,11 +41,11 @@ + # + # List items are testnames followed by labels, all MUST BE commented + # as to why they are here and use a label: +-# generic-all Problems on all platforms +-# generic-ARCH Where ARCH is one of: sparc, sparcv9, x64, i586, etc. +-# OSNAME-all Where OSNAME is one of: solaris, linux, windows, macosx +-# OSNAME-ARCH Specific on to one OSNAME and ARCH, e.g. solaris-amd64 +-# OSNAME-REV Specific on to one OSNAME and REV, e.g. solaris-5.8 ++# generic-all Problems on all platforms ++# generic-ARCH Where ARCH is one of: sparc, sparcv9, x64, i586, etc. ++# OSNAME-all Where OSNAME is one of: solaris, linux, windows, macosx, aix ++# OSNAME-ARCH Specific on to one OSNAME and ARCH, e.g. solaris-amd64 ++# OSNAME-REV Specific on to one OSNAME and REV, e.g. solaris-5.8 + # + # More than one label is allowed but must be on the same line. + # +@@ -120,9 +120,6 @@ + + # jdk_lang + +-# 8029415 +-java/lang/reflect/Method/invoke/TestPrivateInterfaceMethodReflect.java generic-all +- + ############################################################################ + + # jdk_management +@@ -134,6 +131,11 @@ + + # jdk_jmx + ++# 8030957 ++com/sun/management/OperatingSystemMXBean/GetProcessCpuLoad.java aix-all ++com/sun/management/OperatingSystemMXBean/GetSystemCpuLoad.java aix-all ++javax/management/MBeanServer/OldMBeanServerTest.java aix-all ++ + ############################################################################ + + # jdk_math +@@ -183,11 +185,6 @@ + # 6963118 + java/nio/channels/Selector/Wakeup.java windows-all + +-# 7133499, 7133497 +-java/nio/channels/AsyncCloseAndInterrupt.java macosx-all +-java/nio/channels/AsynchronousFileChannel/Lock.java macosx-all +-java/nio/channels/FileChannel/Transfer.java macosx-all +- + # 7141822 + java/nio/channels/DatagramChannel/ChangingAddress.java macosx-all + +@@ -234,15 +231,6 @@ + java/security/KeyPairGenerator/SolarisShortDSA.java solaris-all + sun/security/tools/keytool/standard.sh solaris-all + +-# 8000439: NPG: REGRESSION : sun/security/krb5/auto/MaxRetries.java fails with timeout +-sun/security/krb5/auto/MaxRetries.java solaris-sparcv9 +- +-# 8006690: sun/security/krb5/auto/BadKdc1.java fails intermittently +-sun/security/krb5/auto/BadKdc1.java solaris-sparcv9 +-sun/security/krb5/auto/BadKdc2.java solaris-sparcv9 +-sun/security/krb5/auto/BadKdc3.java solaris-sparcv9 +-sun/security/krb5/auto/BadKdc4.java solaris-sparcv9 +- + ############################################################################ + + # jdk_sound +@@ -263,9 +251,6 @@ + + # jdk_tools + +-# 7132203 +-sun/jvmstat/monitor/MonitoredVm/CR6672135.java generic-all +- + # 8028474 + sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.sh generic-all + +@@ -280,12 +265,6 @@ + + # jdk_jdi + +-# Filed 6952105 +-com/sun/jdi/SuspendThreadTest.java generic-all +- +-# Filed 6653793 +-com/sun/jdi/RedefineCrossEvent.java generic-all +- + ############################################################################ + + # jdk_util +--- ./jdk/test/TEST.groups Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/TEST.groups Wed Jul 30 18:42:59 2014 +0100 +@@ -103,7 +103,8 @@ + java/net \ + com/sun/net \ + com/oracle/net \ +- sun/net ++ sun/net \ ++ jdk/net + + jdk_time = \ + java/time +--- ./jdk/test/com/sun/corba/5036554/TestCorbaBug.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/corba/5036554/TestCorbaBug.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -48,7 +48,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/com/sun/corba/cachedSocket/7056731.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/corba/cachedSocket/7056731.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -31,7 +31,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/com/sun/crypto/provider/TLS/TestPremaster.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/crypto/provider/TLS/TestPremaster.java Wed Jul 30 18:42:59 2014 +0100 +@@ -33,6 +33,7 @@ + + import javax.crypto.KeyGenerator; + import javax.crypto.SecretKey; ++import java.util.Formatter; + + import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; + +@@ -52,27 +53,51 @@ + System.out.println("OK: " + e); + } + +- test(kg, 3, 0); +- test(kg, 3, 1); +- test(kg, 3, 2); +- test(kg, 4, 0); ++ int[] protocolVersions = {0x0300, 0x0301, 0x0302, 0x0400}; ++ for (int clientVersion : protocolVersions) { ++ for (int serverVersion : protocolVersions) { ++ test(kg, clientVersion, serverVersion); ++ if (serverVersion >= clientVersion) { ++ break; ++ } ++ } ++ } + + System.out.println("Done."); + } + +- private static void test(KeyGenerator kg, int major, int minor) +- throws Exception { ++ private static void test(KeyGenerator kg, ++ int clientVersion, int serverVersion) throws Exception { + +- kg.init(new TlsRsaPremasterSecretParameterSpec(major, minor)); ++ System.out.printf( ++ "Testing RSA pre-master secret key generation between " + ++ "client (0x%04X) and server(0x%04X)%n", ++ clientVersion, serverVersion); ++ kg.init(new TlsRsaPremasterSecretParameterSpec( ++ clientVersion, serverVersion)); ++ + SecretKey key = kg.generateKey(); + byte[] encoded = key.getEncoded(); +- if (encoded.length != 48) { +- throw new Exception("length: " + encoded.length); +- } +- if ((encoded[0] != major) || (encoded[1] != minor)) { +- throw new Exception("version mismatch: " + encoded[0] + +- "." + encoded[1]); +- } +- System.out.println("OK: " + major + "." + minor); ++ if (encoded != null) { // raw key material may be not extractable ++ if (encoded.length != 48) { ++ throw new Exception("length: " + encoded.length); ++ } ++ int v = versionOf(encoded[0], encoded[1]); ++ if (clientVersion != v) { ++ if (serverVersion != v || clientVersion >= 0x0302) { ++ throw new Exception(String.format( ++ "version mismatch: (0x%04X) rather than (0x%04X) " + ++ "is used in pre-master secret", v, clientVersion)); ++ } ++ System.out.printf("Use compatible version (0x%04X)%n", v); ++ } ++ System.out.println("Passed, version matches!"); ++ } else { ++ System.out.println("Raw key material is not extractable"); ++ } ++ } ++ ++ private static int versionOf(int major, int minor) { ++ return ((major & 0xFF) << 8) | (minor & 0xFF); + } + } +--- ./jdk/test/com/sun/jarsigner/DefaultMethod.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/jarsigner/DefaultMethod.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,78 @@ ++/* ++ * 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 8039358 ++ * @summary com.sun.jarsigner.ContentSignerParameters.getTSAPolicyID() should be default ++ * @compile DefaultMethod.java ++ */ ++ ++import com.sun.jarsigner.ContentSignerParameters; ++ ++import java.net.URI; ++import java.security.cert.X509Certificate; ++import java.util.zip.ZipFile; ++ ++public class DefaultMethod implements ContentSignerParameters { ++ ++ @Override ++ public String[] getCommandLine() { ++ return new String[0]; ++ } ++ ++ @Override ++ public URI getTimestampingAuthority() { ++ return null; ++ } ++ ++ @Override ++ public X509Certificate getTimestampingAuthorityCertificate() { ++ return null; ++ } ++ ++ @Override ++ public byte[] getSignature() { ++ return new byte[0]; ++ } ++ ++ @Override ++ public String getSignatureAlgorithm() { ++ return null; ++ } ++ ++ @Override ++ public X509Certificate[] getSignerCertificateChain() { ++ return new X509Certificate[0]; ++ } ++ ++ @Override ++ public byte[] getContent() { ++ return new byte[0]; ++ } ++ ++ @Override ++ public ZipFile getSource() { ++ return null; ++ } ++} +--- ./jdk/test/com/sun/java/swing/plaf/windows/8016551/bug8016551.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/java/swing/plaf/windows/8016551/bug8016551.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,7 +25,7 @@ + * @bug 8016551 + * @summary JMenuItem in WindowsLookAndFeel can't paint default icons + * @author Leonid Romanov +- * @run main bug8016551 ++ * @run main/othervm bug8016551 + */ + + import javax.swing.*; +--- ./jdk/test/com/sun/jdi/BadHandshakeTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/jdi/BadHandshakeTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -26,7 +26,7 @@ + * @summary Check that a bad handshake doesn't cause a debuggee to abort + * @library /lib/testlibrary + * +- * @build VMConnection BadHandshakeTest Exit0 ++ * @build jdk.testlibrary.* VMConnection BadHandshakeTest Exit0 + * @run main BadHandshakeTest + * + */ +@@ -85,7 +85,7 @@ + success.set(line.contains("Listening for transport dt_socket at address:")); + return true; + }, +- 1500, ++ Integer.MAX_VALUE, + TimeUnit.MILLISECONDS + ); + +--- ./jdk/test/com/sun/jdi/ExclusiveBind.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/jdi/ExclusiveBind.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -25,57 +25,27 @@ + * @bug 4531526 + * @summary Test that more than one debuggee cannot bind to same port + * at the same time. ++ * @library /lib/testlibrary + * +- * @build VMConnection ExclusiveBind HelloWorld ++ * @build jdk.testlibrary.* VMConnection ExclusiveBind HelloWorld + * @run main ExclusiveBind + */ +-import java.io.InputStream; +-import java.io.IOException; +-import java.io.File; + import java.net.ServerSocket; + import com.sun.jdi.Bootstrap; + import com.sun.jdi.VirtualMachine; + import com.sun.jdi.connect.Connector; + import com.sun.jdi.connect.AttachingConnector; ++ ++import java.util.ArrayList; + import java.util.Map; + import java.util.List; + import java.util.Iterator; ++import java.util.concurrent.TimeUnit; ++ ++import jdk.testlibrary.ProcessTools; ++import jdk.testlibrary.Utils; + + public class ExclusiveBind { +- +- /* +- * Helper class to direct process output to the parent +- * System.out +- */ +- static class IOHandler implements Runnable { +- InputStream in; +- +- IOHandler(InputStream in) { +- this.in = in; +- } +- +- static void handle(InputStream in) { +- IOHandler handler = new IOHandler(in); +- Thread thr = new Thread(handler); +- thr.setDaemon(true); +- thr.start(); +- } +- +- public void run() { +- try { +- byte b[] = new byte[100]; +- for (;;) { +- int n = in.read(b); +- if (n < 0) return; +- for (int i=0; i<n; i++) { +- System.out.print((char)b[i]); +- } +- } +- } catch (IOException ioe) { } +- } +- +- } +- + /* + * Find a connector by name + */ +@@ -95,25 +65,23 @@ + * Launch (in server mode) a debuggee with the given address and + * suspend mode. + */ +- private static Process launch(String address, boolean suspend, String class_name) throws IOException { +- String exe = System.getProperty("java.home") + File.separator + "bin" + +- File.separator + "java"; +- String cmd = exe + " " + VMConnection.getDebuggeeVMOptions() + +- " -agentlib:jdwp=transport=dt_socket,server=y,suspend="; ++ private static ProcessBuilder prepareLauncher(String address, boolean suspend, String class_name) throws Exception { ++ List<String> args = new ArrayList<>(); ++ for(String dbgOption : VMConnection.getDebuggeeVMOptions().split(" ")) { ++ args.add(dbgOption); ++ } ++ String lib = "-agentlib:jdwp=transport=dt_socket,server=y,suspend="; + if (suspend) { +- cmd += "y"; ++ lib += "y"; + } else { +- cmd += "n"; ++ lib += "n"; + } +- cmd += ",address=" + address + " " + class_name; ++ lib += ",address=" + address; + +- System.out.println("Starting: " + cmd); ++ args.add(lib); ++ args.add(class_name); + +- Process p = Runtime.getRuntime().exec(cmd); +- IOHandler.handle(p.getInputStream()); +- IOHandler.handle(p.getErrorStream()); +- +- return p; ++ return ProcessTools.createJavaProcessBuilder(args.toArray(new String[args.size()])); + } + + /* +@@ -132,16 +100,21 @@ + String address = String.valueOf(port); + + // launch the first debuggee +- Process process1 = launch(address, true, "HelloWorld"); +- +- // give first debuggee time to suspend +- Thread.currentThread().sleep(5000); ++ ProcessBuilder process1 = prepareLauncher(address, true, "HelloWorld"); ++ // start the debuggee and wait for the "ready" message ++ Process p = ProcessTools.startProcess( ++ "process1", ++ process1, ++ line -> line.equals("Listening for transport dt_socket at address: " + address), ++ Math.round(5000 * Utils.TIMEOUT_FACTOR), ++ TimeUnit.MILLISECONDS ++ ); + + // launch a second debuggee with the same address +- Process process2 = launch(address, false, "HelloWorld"); ++ ProcessBuilder process2 = prepareLauncher(address, false, "HelloWorld"); + + // get exit status from second debuggee +- int exitCode = process2.waitFor(); ++ int exitCode = ProcessTools.startProcess("process2", process2).waitFor(); + + // clean-up - attach to first debuggee and resume it + AttachingConnector conn = (AttachingConnector)findConnector("com.sun.jdi.SocketAttach"); +--- ./jdk/test/com/sun/jdi/ImmutableResourceTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/jdi/ImmutableResourceTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -56,7 +56,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PATHSEP=":" + ;; + +--- ./jdk/test/com/sun/jdi/JITDebug.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/jdi/JITDebug.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -63,7 +63,7 @@ + OS=`uname -s` + export TRANSPORT_METHOD + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PATHSEP=":" + TRANSPORT_METHOD=dt_socket + ;; +--- ./jdk/test/com/sun/jdi/PrivateTransportTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/jdi/PrivateTransportTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -102,7 +102,7 @@ + is_windows=false + is_cygwin=false + case `uname -s` in +- SunOS|Linux) ++ SunOS|Linux|AIX) + xx=`find ${jreloc}/lib -name libdt_socket.so` + libloc=`dirname ${xx}` + ;; +@@ -161,13 +161,23 @@ + echo cp ${libloc}/libdt_socket.so ${fullpath} + cp ${libloc}/libdt_socket.so ${fullpath} + # make sure we can find libraries in current directory +- if [ "${LD_LIBRARY_PATH}" = "" ] ; then +- LD_LIBRARY_PATH=${libdir} ++ if [ "$os" = "AIX" ] ; then ++ if [ "${LIBPATH}" = "" ] ; then ++ LIBPATH=${libdir} ++ else ++ LIBPATH=${LIBPATH}:${libdir} ++ fi ++ export LIBPATH ++ echo LIBPATH=${LIBPATH} + else +- LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${libdir} ++ if [ "${LD_LIBRARY_PATH}" = "" ] ; then ++ LD_LIBRARY_PATH=${libdir} ++ else ++ LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${libdir} ++ fi ++ export LD_LIBRARY_PATH ++ echo LD_LIBRARY_PATH=${LD_LIBRARY_PATH} + fi +- export LD_LIBRARY_PATH +- echo LD_LIBRARY_PATH=${LD_LIBRARY_PATH} + else + echo "cannot find dt_socket in ${libloc} for ${private_transport}" + fail "cannot find dt_socket in ${libloc} for ${private_transport}" +--- ./jdk/test/com/sun/jdi/ShellScaffold.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/jdi/ShellScaffold.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -199,6 +199,8 @@ + if [ "$osname" = SunOS ] ; then + # Solaris and OpenSolaris use pgrep and not ps in psCmd + findPidCmd="$psCmd" ++ elif [ "$osname" = AIX ] ; then ++ findPidCmd="$psCmd" + else + # Never use plain 'ps', which requires a "controlling terminal" + # and will fail with a "ps: no controlling terminal" error. +@@ -293,7 +295,7 @@ + psCmd=ps + jstack=jstack.exe + ;; +- SunOS | Linux | Darwin) ++ SunOS | Linux | Darwin | AIX) + transport=dt_socket + address= + devnull=/dev/null +--- ./jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -45,7 +45,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + ;; + Windows* | CYGWIN*) +--- ./jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 2012, 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 +@@ -64,11 +64,12 @@ + env.put(Context.SECURITY_PRINCIPAL, "user"); + env.put(Context.SECURITY_CREDENTIALS, "password"); + +- env.put("com.sun.jndi.ldap.connect.timeout", "10"); +- env.put("com.sun.jndi.ldap.read.timeout", "3000"); +- + InitialContext ctx = null; + try { ++ new LdapTimeoutTest().deadServerNoTimeout(env); ++ ++ env.put("com.sun.jndi.ldap.connect.timeout", "10"); ++ env.put("com.sun.jndi.ldap.read.timeout", "3000"); + new LdapTimeoutTest().ldapReadTimeoutTest(env, false); + new LdapTimeoutTest().ldapReadTimeoutTest(env, true); + new LdapTimeoutTest().simpleAuthConnectTest(env); +@@ -84,7 +85,7 @@ + void ldapReadTimeoutTest(Hashtable env, boolean ssl) { + InitialContext ctx = null; + if (ssl) env.put(Context.SECURITY_PROTOCOL, "ssl"); +- ScheduledFuture killer = killSwitch(); ++ ScheduledFuture killer = killSwitch(5000); + long start = System.nanoTime(); + try { + ctx = new InitialDirContext(env); +@@ -112,7 +113,7 @@ + + void simpleAuthConnectTest(Hashtable env) { + InitialContext ctx = null; +- ScheduledFuture killer = killSwitch(); ++ ScheduledFuture killer = killSwitch(5000); + long start = System.nanoTime(); + try { + ctx = new InitialDirContext(env); +@@ -139,6 +140,32 @@ + } + } + ++ void deadServerNoTimeout(Hashtable env) { ++ InitialContext ctx = null; ++ ScheduledFuture killer = killSwitch(30000); ++ long start = System.nanoTime(); ++ try { ++ ctx = new InitialDirContext(env); ++ SearchControls scl = new SearchControls(); ++ scl.setSearchScope(SearchControls.SUBTREE_SCOPE); ++ NamingEnumeration<SearchResult> answer = ((InitialDirContext)ctx) ++ .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl); ++ // shouldn't reach here ++ fail(); ++ } catch (NamingException e) { ++ long end = System.nanoTime(); ++ if (TimeUnit.NANOSECONDS.toMillis(end - start) < 14000) { ++ System.err.println("fail: timeout should be at least 15 seconds, actual time: " ++ + TimeUnit.NANOSECONDS.toMillis(end - start)); ++ fail(); ++ } else { ++ pass(); ++ } ++ } finally { ++ if (!shutItDown(killer, ctx)) fail(); ++ } ++ } ++ + boolean shutItDown(ScheduledFuture killer, InitialContext ctx) { + killer.cancel(true); + try { +@@ -149,15 +176,15 @@ + } + } + +- ScheduledFuture killSwitch() { ++ ScheduledFuture killSwitch(int ms) { + final Thread current = Thread.currentThread(); + return LdapTimeoutTest.pool.schedule(new Callable<Void>() { + public Void call() throws Exception { + System.err.println("Fail: killSwitch()"); +- current.interrupt(); ++ System.exit(0); + return null; + } +- }, 5000, TimeUnit.MILLISECONDS); ++ }, ms, TimeUnit.MILLISECONDS); + } + + static class Server extends Thread { +--- ./jdk/test/com/sun/nio/sctp/SctpChannel/ReceiveIntoDirect.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/nio/sctp/SctpChannel/ReceiveIntoDirect.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,276 @@ ++/* ++ * 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 8034181 ++ * @summary SIGBUS in SctpChannelImpl receive ++ * @author chegar ++ */ ++ ++import java.net.InetSocketAddress; ++import java.net.SocketAddress; ++import java.io.IOException; ++import java.nio.ByteBuffer; ++import com.sun.nio.sctp.AbstractNotificationHandler; ++import com.sun.nio.sctp.AssociationChangeNotification; ++import com.sun.nio.sctp.AssociationChangeNotification.AssocChangeEvent; ++import com.sun.nio.sctp.HandlerResult; ++import com.sun.nio.sctp.MessageInfo; ++import com.sun.nio.sctp.Notification; ++import com.sun.nio.sctp.PeerAddressChangeNotification; ++import com.sun.nio.sctp.SctpChannel; ++import com.sun.nio.sctp.SctpServerChannel; ++import com.sun.nio.sctp.ShutdownNotification; ++import static java.lang.System.out; ++import static java.lang.System.err; ++import static java.nio.charset.StandardCharsets.US_ASCII; ++ ++public class ReceiveIntoDirect { ++ /* suitably small message to NOT overrun small buffers */ ++ final byte[] msgBytes = "Hello".getBytes(US_ASCII); ++ ++ /* number of client connections/combinations (accepted by the server) */ ++ final int NUM_CONNECTIONS = 75; ++ ++ void test(String[] args) throws IOException { ++ SocketAddress address = null; ++ Server server; ++ ++ if (!Util.isSCTPSupported()) { ++ out.println("SCTP protocol is not supported"); ++ out.println("Test cannot be run"); ++ return; ++ } ++ ++ if (args.length == 2) { ++ /* requested to connecct to a specific address */ ++ try { ++ int port = Integer.valueOf(args[1]); ++ address = new InetSocketAddress(args[0], port); ++ } catch (NumberFormatException nfe) { ++ err.println(nfe); ++ } ++ } else { ++ /* start server on local machine, default */ ++ server = new Server(); ++ server.start(); ++ address = server.address(); ++ debug("Server started and listening on " + address); ++ } ++ ++ /* many combinations with varing buffer sizes, and offsets */ ++ runWithManyOffsets(address, 20); ++ runWithManyOffsets(address, 49); ++ runWithManyOffsets(address, 50); ++ runWithManyOffsets(address, 51); ++ runWithManyOffsets(address, 1024); ++ } ++ ++ void runWithManyOffsets(SocketAddress addr, int bufferSize) ++ throws IOException ++ { ++ doTest(addr, bufferSize, 1); ++ doTest(addr, bufferSize, 2); ++ doTest(addr, bufferSize, 3); ++ doTest(addr, bufferSize, 4); ++ doTest(addr, bufferSize, 5); ++ doTest(addr, bufferSize, 6); ++ doTest(addr, bufferSize, 7); ++ doTest(addr, bufferSize, 8); ++ doTest(addr, bufferSize, 9); ++ doTest(addr, bufferSize, 10); ++ doTest(addr, bufferSize, 11); ++ doTest(addr, bufferSize, 12); ++ doTest(addr, bufferSize, 13); ++ doTest(addr, bufferSize, 14); ++ doTest(addr, bufferSize, 15); ++ } ++ ++ void doTest(SocketAddress peerAddress, int bufferSize, int bufferOffset) ++ throws IOException ++ { ++ debug("\n\nTesting with bufferSize " + bufferSize + " and offset " + bufferOffset); ++ assert bufferOffset + msgBytes.length <= bufferSize : ++ "buffer offset + message length greater than buffer size "; ++ ++ ByteBuffer buffer = ByteBuffer.allocateDirect(bufferSize); ++ MessageInfo info; ++ ++ try (SctpChannel channel = SctpChannel.open()) { ++ channel.connect(peerAddress); ++ ++ ReceiveNotificationHandler handler = ++ new ReceiveNotificationHandler(); ++ ++ /* TEST 1: Assoc/peer change notif into direct buffer with offest */ ++ do { ++ debug("Test 1: Assoc/peer change with offset " + bufferOffset); ++ buffer.position(bufferOffset); ++ info = channel.receive(buffer, null, handler); ++ if (info == null) { ++ fail("unexpected null from receive"); ++ return; ++ } ++ } while (!info.isComplete()); ++ ++ buffer.flip().position(bufferOffset); ++ check(handler.receivedCommUp(), "SCTP_COMM_UP not received"); ++ check(info != null, "info is null"); ++ check(info.address() != null, "address is null"); ++ check(info.association() != null, "association is null"); ++ check(info.isComplete(), "message is not complete"); ++ check(info.isUnordered() != true, ++ "message should not be unordered"); ++ check(info.streamNumber() >= 0, "invalid stream number"); ++ check(info.bytes() == msgBytes.length, ++ "bytes received not equal to message length"); ++ check(info.bytes() == buffer.remaining(), "bytes != remaining"); ++ check(Util.compare(buffer, msgBytes), ++ "received message not the same as sent message"); ++ ++ /* TEST 2: shutdown notification with offset */ ++ debug("Test 2: shutdown notif with offset " + bufferOffset); ++ buffer.clear().position(bufferOffset); ++ while ((info = channel.receive(buffer, null, handler )) != null && ++ info.bytes() != -1 ); ++ } ++ } ++ ++ class Server implements Runnable ++ { ++ private final InetSocketAddress serverAddr; ++ private final SctpServerChannel ssc; ++ ++ public Server() throws IOException { ++ ssc = SctpServerChannel.open().bind(null); ++ java.util.Set<SocketAddress> addrs = ssc.getAllLocalAddresses(); ++ if (addrs.isEmpty()) ++ debug("addrs should not be empty"); ++ ++ serverAddr = (InetSocketAddress) addrs.iterator().next(); ++ } ++ ++ public void start() { ++ (new Thread(this, "Server-" + serverAddr.getPort())).start(); ++ } ++ ++ public InetSocketAddress address() { ++ return serverAddr; ++ } ++ ++ @Override ++ public void run() { ++ try { ++ for (int i=0; i<NUM_CONNECTIONS; i++) { ++ SctpChannel sc = ssc.accept(); ++ ++ /* send a small message */ ++ MessageInfo info = MessageInfo.createOutgoing(null, 0); ++ ByteBuffer buf = ByteBuffer.allocateDirect(Util.SMALL_BUFFER); ++ buf.put(msgBytes); ++ buf.flip(); ++ ++ debug("sending small message: " + buf); ++ sc.send(buf, info); ++ ++ sc.shutdown(); ++ sc.close(); ++ } ++ } catch (IOException x) { ++ unexpected(x); ++ } finally { ++ try { ssc.close(); } ++ catch (IOException x) { unexpected(x); } ++ } ++ } ++ } ++ ++ class ReceiveNotificationHandler extends AbstractNotificationHandler<Object> ++ { ++ boolean receivedCommUp; // false ++ ++ public ReceiveNotificationHandler() { } ++ ++ public boolean receivedCommUp() { ++ return receivedCommUp; ++ } ++ ++ @Override ++ public HandlerResult handleNotification( ++ Notification notification, Object attachment) { ++ fail("Unknown notification type"); ++ return HandlerResult.CONTINUE; ++ } ++ ++ @Override ++ public HandlerResult handleNotification( ++ AssociationChangeNotification notification, Object attachment) { ++ AssocChangeEvent event = notification.event(); ++ debug("AssociationChangeNotification"); ++ debug(" Association: " + notification.association()); ++ debug(" Event: " + event); ++ ++ if (event.equals(AssocChangeEvent.COMM_UP)) ++ receivedCommUp = true; ++ ++ return HandlerResult.CONTINUE; ++ } ++ ++ @Override ++ public HandlerResult handleNotification( ++ PeerAddressChangeNotification pacn, Object unused) ++ { ++ debug("PeerAddressChangeNotification: " + pacn); ++ return HandlerResult.CONTINUE; ++ } ++ ++ @Override ++ public HandlerResult handleNotification( ++ ShutdownNotification notification, Object attachment) { ++ debug("ShutdownNotification"); ++ debug(" Association: " + notification.association()); ++ return HandlerResult.CONTINUE; ++ } ++ } ++ //--------------------- Infrastructure --------------------------- ++ boolean debug = true; ++ volatile int passed = 0, failed = 0; ++ void pass() {passed++;} ++ void fail() {failed++; Thread.dumpStack();} ++ void fail(String msg) {System.err.println(msg); fail();} ++ void unexpected(Throwable t) {failed++; t.printStackTrace();} ++ void check(boolean cond) {if (cond) pass(); else fail();} ++ void check(boolean cond, String failMessage) {if (cond) pass(); else fail(failMessage);} ++ void debug(String message) {if(debug) { ++ System.out.println(Thread.currentThread() + " " + message); } } ++ public static void main(String[] args) throws Throwable { ++ Class<?> k = new Object(){}.getClass().getEnclosingClass(); ++ try {k.getMethod("instanceMain",String[].class) ++ .invoke( k.newInstance(), (Object) args);} ++ catch (Throwable e) {throw e.getCause();}} ++ public void instanceMain(String[] args) throws Throwable { ++ try {test(args);} catch (Throwable t) {unexpected(t);} ++ System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); ++ if (failed > 0) throw new AssertionError("Some tests failed");} ++ ++} +--- ./jdk/test/com/sun/tools/attach/BasicTests.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/BasicTests.java Wed Jul 30 18:42:59 2014 +0100 +@@ -38,7 +38,7 @@ + * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 + * @summary Basic unit tests for the VM attach mechanism. + * @library /lib/testlibrary +- * @run build Agent BadAgent RedefineAgent Application Shutdown RedefineDummy ++ * @build jdk.testlibrary.* Agent BadAgent RedefineAgent Application Shutdown RedefineDummy RunnerUtil + * @run main BasicTests + * + * This test will perform a number of basic attach tests. +@@ -238,19 +238,17 @@ + // Test 6 - list method should list the target VM + System.out.println(" - Test: VirtualMachine.list"); + List<VirtualMachineDescriptor> l = VirtualMachine.list(); +- if (!l.isEmpty()) { +- boolean found = false; +- for (VirtualMachineDescriptor vmd: l) { +- if (vmd.id().equals(pid)) { +- found = true; +- break; +- } ++ boolean found = false; ++ for (VirtualMachineDescriptor vmd: l) { ++ if (vmd.id().equals(pid)) { ++ found = true; ++ break; + } +- if (found) { +- System.out.println(" - " + pid + " found."); +- } else { +- throw new RuntimeException(pid + " not found in VM list"); +- } ++ } ++ if (found) { ++ System.out.println(" - " + pid + " found."); ++ } else { ++ throw new RuntimeException(pid + " not found in VM list"); + } + + // test 7 - basic hashCode/equals tests +--- ./jdk/test/com/sun/tools/attach/PermissionTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/PermissionTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -34,7 +34,7 @@ + * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 + * @summary Basic unit tests for the VM attach mechanism. + * @library /lib/testlibrary +- * @run build Application Shutdown ++ * @build jdk.testlibrary.* Application Shutdown + * @run main PermissionTest + * + * Unit test for Attach API - +--- ./jdk/test/com/sun/tools/attach/ProviderTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/ProviderTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -33,7 +33,7 @@ + * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 + * @summary Basic unit tests for the VM attach mechanism. + * @library /lib/testlibrary +- * @run build SimpleProvider ++ * @build jdk.testlibrary.* SimpleProvider + * @run main ProviderTest + * + * The test will attach and detach to/from the running Application. +--- ./jdk/test/com/sun/tools/attach/RunnerUtil.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/RunnerUtil.java Wed Jul 30 18:42:59 2014 +0100 +@@ -24,12 +24,11 @@ + import java.io.IOException; + import java.io.File; + import java.nio.file.Files; +-import java.nio.file.Path; + import java.util.Arrays; + import java.util.regex.Pattern; + import java.util.regex.Matcher; ++ + import jdk.testlibrary.OutputAnalyzer; +-import jdk.testlibrary.JDKToolLauncher; + import jdk.testlibrary.ProcessTools; + import jdk.testlibrary.Utils; + import jdk.testlibrary.ProcessThread; +@@ -39,6 +38,7 @@ + * (Test runner = class that launch a test) + */ + public class RunnerUtil { ++ + /** + * The Application process must be run concurrently with our tests since + * the tests will attach to the Application. +@@ -49,16 +49,31 @@ + * + * The Application will write its pid and shutdownPort in the given outFile. + */ +- public static ProcessThread startApplication(String outFile) throws Throwable { ++ public static ProcessThread startApplication(String outFile, String... additionalOpts) throws Throwable { + String classpath = System.getProperty("test.class.path", "."); +- String[] args = Utils.addTestJavaOpts( +- "-Dattach.test=true", "-classpath", classpath, "Application", outFile); ++ String[] myArgs = concat(additionalOpts, new String [] { "-Dattach.test=true", "-classpath", classpath, "Application", outFile }); ++ String[] args = Utils.addTestJavaOpts(myArgs); + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args); + ProcessThread pt = new ProcessThread("runApplication", pb); + pt.start(); + return pt; + } + ++ public static String[] concat(String[] a, String[] b) { ++ if (a == null) { ++ return b; ++ } ++ if (b == null) { ++ return a; ++ } ++ int aLen = a.length; ++ int bLen = b.length; ++ String[] c = new String[aLen + bLen]; ++ System.arraycopy(a, 0, c, 0, aLen); ++ System.arraycopy(b, 0, c, aLen, bLen); ++ return c; ++ } ++ + /** + * Will stop the running Application. + * First tries to shutdown nicely by connecting to the shut down port. +--- ./jdk/test/com/sun/tools/attach/TempDirTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/com/sun/tools/attach/TempDirTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,169 @@ ++/* ++ * 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 com.sun.tools.attach.*; ++ ++import java.nio.file.Files; ++import java.nio.file.Path; ++import java.util.Properties; ++import java.util.List; ++import java.io.File; ++ ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.ProcessTools; ++import jdk.testlibrary.ProcessThread; ++ ++/* ++ * @test ++ * @bug 8033104 ++ * @summary Test to make sure attach and jvmstat works correctly when java.io.tmpdir is set ++ * @library /lib/testlibrary ++ * @run build Application Shutdown RunnerUtil ++ * @run main/timeout=10 TempDirTest ++ */ ++ ++public class TempDirTest { ++ ++ public static void main(String args[]) throws Throwable { ++ ++ Path clientTmpDir = Files.createTempDirectory("TempDirTest-client"); ++ clientTmpDir.toFile().deleteOnExit(); ++ Path targetTmpDir = Files.createTempDirectory("TempDirTest-target"); ++ targetTmpDir.toFile().deleteOnExit(); ++ ++ // run the test with all possible combinations of setting java.io.tmpdir ++ runExperiment(null, null); ++ runExperiment(clientTmpDir, null); ++ runExperiment(clientTmpDir, targetTmpDir); ++ runExperiment(null, targetTmpDir); ++ ++ } ++ ++ private static int counter = 0; ++ ++ /* ++ * The actual test is in the nested class TestMain. ++ * The responsibility of this class is to: ++ * 1. Start the Application class in a separate process. ++ * 2. Find the pid and shutdown port of the running Application. ++ * 3. Launches the tests in nested class TestMain that will attach to the Application. ++ * 4. Shut down the Application. ++ */ ++ public static void runExperiment(Path clientTmpDir, Path targetTmpDir) throws Throwable { ++ ++ System.out.print("### Running tests with overridden tmpdir for"); ++ System.out.print(" client: " + (clientTmpDir == null ? "no" : "yes")); ++ System.out.print(" target: " + (targetTmpDir == null ? "no" : "yes")); ++ System.out.println(" ###"); ++ ++ final String pidFile = "TempDirTest.Application.pid-" + counter++; ++ ProcessThread processThread = null; ++ RunnerUtil.ProcessInfo info = null; ++ try { ++ String[] tmpDirArg = null; ++ if (targetTmpDir != null) { ++ tmpDirArg = new String[] {"-Djava.io.tmpdir=" + targetTmpDir}; ++ } ++ processThread = RunnerUtil.startApplication(pidFile, tmpDirArg); ++ info = RunnerUtil.readProcessInfo(pidFile); ++ launchTests(info.pid, clientTmpDir); ++ } catch (Throwable t) { ++ System.out.println("TempDirTest got unexpected exception: " + t); ++ t.printStackTrace(); ++ throw t; ++ } finally { ++ // Make sure the Application process is stopped. ++ RunnerUtil.stopApplication(info.shutdownPort, processThread); ++ } ++ } ++ ++ /** ++ * Runs the actual tests in nested class TestMain. ++ * The reason for running the tests in a separate process ++ * is that we need to modify the class path and ++ * the -Djava.io.tmpdir property. ++ */ ++ private static void launchTests(int pid, Path clientTmpDir) throws Throwable { ++ final String sep = File.separator; ++ ++ // Need to add jdk/lib/tools.jar to classpath. ++ String classpath = ++ System.getProperty("test.class.path", "") + File.pathSeparator + ++ System.getProperty("test.jdk", ".") + sep + "lib" + sep + "tools.jar"; ++ ++ String[] tmpDirArg = null; ++ if (clientTmpDir != null) { ++ tmpDirArg = new String [] {"-Djava.io.tmpdir=" + clientTmpDir}; ++ } ++ ++ // Arguments : [-Djava.io.tmpdir=] -classpath cp TempDirTest$TestMain pid ++ String[] args = RunnerUtil.concat( ++ tmpDirArg, ++ new String[] { ++ "-classpath", ++ classpath, ++ "TempDirTest$TestMain", ++ Integer.toString(pid) }); ++ OutputAnalyzer output = ProcessTools.executeTestJvm(args); ++ output.shouldHaveExitValue(0); ++ } ++ ++ /** ++ * This is the actual test. It will attach to the running Application ++ * and perform a number of basic attach tests. ++ */ ++ public static class TestMain { ++ public static void main(String args[]) throws Exception { ++ String pid = args[0]; ++ ++ // Test 1 - list method should list the target VM ++ System.out.println(" - Test: VirtualMachine.list"); ++ List<VirtualMachineDescriptor> l = VirtualMachine.list(); ++ boolean found = false; ++ for (VirtualMachineDescriptor vmd: l) { ++ if (vmd.id().equals(pid)) { ++ found = true; ++ break; ++ } ++ } ++ if (found) { ++ System.out.println(" - " + pid + " found."); ++ } else { ++ throw new RuntimeException(pid + " not found in VM list"); ++ } ++ ++ // Test 2 - try to attach and verify connection ++ ++ System.out.println(" - Attaching to application ..."); ++ VirtualMachine vm = VirtualMachine.attach(pid); ++ ++ System.out.println(" - Test: system properties in target VM"); ++ Properties props = vm.getSystemProperties(); ++ String value = props.getProperty("attach.test"); ++ if (value == null || !value.equals("true")) { ++ throw new RuntimeException("attach.test property not set"); ++ } ++ System.out.println(" - attach.test property set as expected"); ++ } ++ } ++} +--- ./jdk/test/com/sun/tools/attach/java.policy.allow Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/java.policy.allow Wed Jul 30 18:42:59 2014 +0100 +@@ -13,7 +13,6 @@ + permission java.lang.RuntimePermission "accessClassInPackage.sun.jvmstat.monitor"; + permission java.lang.RuntimePermission "loadLibrary.attach"; + permission java.util.PropertyPermission "sun.jvmstat.*", "read"; +- permission java.util.PropertyPermission "java.io.tmpdir", "read"; + + /* to read configuration file in META-INF/services, and write/delete .attach_pid<pid> */ + permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete"; +--- ./jdk/test/com/sun/tools/attach/java.policy.deny Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/com/sun/tools/attach/java.policy.deny Wed Jul 30 18:42:59 2014 +0100 +@@ -11,7 +11,6 @@ + permission java.lang.RuntimePermission "accessClassInPackage.sun.tools.attach"; + permission java.lang.RuntimePermission "loadLibrary.attach"; + permission java.util.PropertyPermission "sun.jvmstat.*", "read"; +- permission java.util.PropertyPermission "java.io.tmpdir", "read"; + + /* to read configuration file in META-INF/services, and write/delete .attach_pid<pid> */ + permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete"; +--- ./jdk/test/java/awt/Choice/ChoiceLocationTest/ChoiceLocationTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Choice/ChoiceLocationTest/ChoiceLocationTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,96 @@ ++/* ++ * 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 7159566 ++ @summary The choice positioned in the top of applet when clicking the choice. ++ @author Petr Pchelko ++ @library ../../regtesthelpers ++ @build Util ++ @run main ChoiceLocationTest ++ */ ++ ++import java.awt.*; ++import javax.swing.*; ++import java.awt.event.InputEvent; ++import java.util.stream.Stream; ++ ++import test.java.awt.regtesthelpers.Util; ++ ++public class ChoiceLocationTest { ++ ++ private static final int FRAME_LOCATION = 100; ++ private static final int FRAME_SIZE = 400; ++ private static final int CLICK_STEP = 5; ++ ++ private static String[] choiceItems = new String[] { ++ "test item 1", ++ "test item 2", ++ "test item 3" ++ }; ++ ++ private static volatile Frame frame; ++ private static volatile Choice choice; ++ ++ public static void main(String[] args) throws Exception { ++ try { ++ SwingUtilities.invokeAndWait(ChoiceLocationTest::initAndShowUI); ++ Robot r = new Robot(); ++ r.waitForIdle(); ++ r.delay(100); ++ ++ Util.clickOnComp(choice, r); ++ ++ choice.addItemListener(event -> {throw new RuntimeException("Failed: the choice popup is in the wrong place");}); ++ ++ // Test: click in several places on the top of the frame an ensure there' no choice there ++ Point locOnScreen = frame.getLocationOnScreen(); ++ int x = locOnScreen.x + FRAME_SIZE / 2; ++ for (int y = locOnScreen.y + frame.getInsets().top + 10; y < locOnScreen.y + FRAME_SIZE / 3 ; y += CLICK_STEP) { ++ r.mouseMove(x, y); ++ r.waitForIdle(); ++ r.mousePress(InputEvent.BUTTON1_MASK); ++ r.mouseRelease(InputEvent.BUTTON1_MASK); ++ r.waitForIdle(); ++ r.delay(100); ++ } ++ } finally { ++ if (frame != null) { ++ frame.dispose(); ++ } ++ } ++ ++ } ++ ++ private static void initAndShowUI() { ++ frame = new Frame("Test frame"); ++ choice = new Choice(); ++ Stream.of(choiceItems).forEach(choice::add); ++ frame.add(choice); ++ frame.setBounds(FRAME_LOCATION, FRAME_LOCATION, FRAME_SIZE, FRAME_SIZE); ++ frame.setVisible(true); ++ } ++ ++ ++} +--- ./jdk/test/java/awt/Choice/RemoveAllShrinkTest/RemoveAllShrinkTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Choice/RemoveAllShrinkTest/RemoveAllShrinkTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,85 @@ ++/* ++ * 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 4851798 8041896 ++ @summary Tests Choice List shrinks after removeAll ++ @run main RemoveAllShrinkTest ++*/ ++ ++import java.awt.*; ++import java.awt.event.*; ++ ++ ++public class RemoveAllShrinkTest { ++ ++ public static void main(String[] args) { ++ Frame f = new Frame(); ++ Choice choice = new Choice(); ++ ++ for (int i = 0; i < 10; ++i) { ++ choice.addItem("Item " + i); ++ } ++ ++ f.add(choice, BorderLayout.NORTH); ++ Panel panel = new Panel(); ++ panel.setBackground(Color.RED); ++ f.add(panel); ++ ++ f.setSize(200, 200); ++ f.setVisible(true); ++ f.toFront(); ++ ++ choice.removeAll(); ++ ++ try { ++ Robot robot = new Robot(); ++ robot.setAutoWaitForIdle(true); ++ robot.setAutoDelay(50); ++ ++ robot.waitForIdle(); ++ Thread.sleep(200); ++ ++ Point pt = choice.getLocationOnScreen(); ++ robot.mouseMove(pt.x + choice.getWidth() - choice.getHeight() / 2, ++ pt.y + choice.getHeight() / 2); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ ++ Thread.sleep(400); ++ ++ Point pt1 = panel.getLocationOnScreen(); ++ ++ Color color = robot.getPixelColor(pt1.x + panel.getWidth() / 2, ++ pt1.y + panel.getHeight() / 2); ++ ++ if (!color.equals(Color.RED)) { ++ throw new RuntimeException("RemoveAllShrinkTest failed. " + color); ++ } ++ } catch (Exception e) { ++ throw new RuntimeException("The test was not completed.\n\n" + e); ++ } ++ } ++} ++ +--- ./jdk/test/java/awt/Cursor/MultiResolutionCursorTest/MultiResolutionCursorTest.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Cursor/MultiResolutionCursorTest/MultiResolutionCursorTest.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,32 @@ ++<!-- ++ Copyright (c) 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. ++--> ++ ++<html> ++ <head> ++ <title>High resolution custom cursor test, bug ID 8028212 ++ ++ ++ ++

    See the dialog box (usually in upper left corner) for instructions

    ++ ++ +\ No newline at end of file +--- ./jdk/test/java/awt/Cursor/MultiResolutionCursorTest/MultiResolutionCursorTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Cursor/MultiResolutionCursorTest/MultiResolutionCursorTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,266 @@ ++/* ++ * Copyright (c) 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. ++ */ ++import java.awt.BorderLayout; ++import java.awt.Color; ++import java.awt.Cursor; ++import java.awt.Dialog; ++import java.awt.Frame; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.Image; ++import java.awt.Label; ++import java.awt.Point; ++import java.awt.TextArea; ++import java.awt.Toolkit; ++import java.awt.image.BufferedImage; ++import java.util.LinkedList; ++import java.util.List; ++import javax.swing.JApplet; ++import sun.awt.OSInfo; ++import sun.awt.image.MultiResolutionImage; ++ ++/** ++ * @test ++ * @bug 8028212 ++ * @summary [macosx] Custom Cursor HiDPI support ++ * @author Alexander Scherbatiy ++ * @run applet/manual=yesno MultiResolutionCursorTest.html ++ */ ++public class MultiResolutionCursorTest extends JApplet { ++ //Declare things used in the test, like buttons and labels here ++ ++ static final int sizes[] = {16, 32, 128}; ++ static final Color colors[] = {Color.WHITE, Color.RED, Color.GREEN, Color.BLUE}; ++ ++ public void init() { ++ //Create instructions for the user here, as well as set up ++ // the environment -- set the layout manager, add buttons, ++ // etc. ++ this.setLayout(new BorderLayout()); ++ ++ if (OSInfo.getOSType().equals(OSInfo.OSType.MACOSX)) { ++ String[] instructions = { ++ "Verify that high resolution custom cursor is used" ++ + " on HiDPI displays.", ++ "1) Run the test on Retina display or enable the Quartz Debug" ++ + " and select the screen resolution with (HiDPI) label", ++ "2) Move the cursor to the Test Frame", ++ "3) Check that cursor has red, green or blue color", ++ "If so, press PASS, else press FAIL." ++ }; ++ Sysout.createDialogWithInstructions(instructions); ++ ++ } else { ++ String[] instructions = { ++ "This test is not applicable to the current platform. Press PASS." ++ }; ++ Sysout.createDialogWithInstructions(instructions); ++ } ++ }//End init() ++ ++ public void start() { ++ //Get things going. Request focus, set size, et cetera ++ setSize(200, 200); ++ setVisible(true); ++ validate(); ++ ++ final Image image = new MultiResolutionCursor(); ++ ++ int center = sizes[0] / 2; ++ Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor( ++ image, new Point(center, center), "multi-resolution cursor"); ++ ++ Frame frame = new Frame("Test Frame"); ++ frame.setSize(300, 300); ++ frame.setLocation(300, 50); ++ frame.add(new Label("Move cursor here")); ++ frame.setCursor(cursor); ++ frame.setVisible(true); ++ }// start() ++ ++ ++ static class MultiResolutionCursor extends BufferedImage implements MultiResolutionImage { ++ ++ List highResolutionImages; ++ ++ public MultiResolutionCursor() { ++ super(sizes[0], sizes[0], BufferedImage.TYPE_INT_RGB); ++ ++ draw(getGraphics(), 0); ++ highResolutionImages = new LinkedList<>(); ++ highResolutionImages.add(this); ++ ++ for (int i = 1; i < sizes.length; i++) { ++ BufferedImage highResolutionImage = ++ new BufferedImage(sizes[i], sizes[i], BufferedImage.TYPE_INT_RGB); ++ draw(highResolutionImage.getGraphics(), i); ++ highResolutionImages.add(highResolutionImage); ++ } ++ } ++ ++ @Override ++ public Image getResolutionVariant(int width, int height) { ++ ++ for (int i = 0; i < sizes.length; i++) { ++ Image image = highResolutionImages.get(i); ++ int w = image.getWidth(null); ++ int h = image.getHeight(null); ++ ++ if (width <= w && height <= h) { ++ return image; ++ } ++ } ++ ++ return highResolutionImages.get(highResolutionImages.size() - 1); ++ } ++ ++ void draw(Graphics graphics, int index) { ++ Graphics2D g2 = (Graphics2D) graphics; ++ Color color = colors[index]; ++ g2.setColor(color); ++ g2.fillRect(0, 0, sizes[index], sizes[index]); ++ } ++ ++ @Override ++ public List getResolutionVariants() { ++ return highResolutionImages; ++ } ++ } ++}// class BlockedWindowTest ++ ++/* Place other classes related to the test after this line */ ++/** ++ * ************************************************** ++ * Standard Test Machinery DO NOT modify anything below -- it's a standard chunk ++ * of code whose purpose is to make user interaction uniform, and thereby make ++ * it simpler to read and understand someone else's test. ++ * ************************************************** ++ */ ++/** ++ * This is part of the standard test machinery. It creates a dialog (with the ++ * instructions), and is the interface for sending text messages to the user. To ++ * print the instructions, send an array of strings to Sysout.createDialog ++ * WithInstructions method. Put one line of instructions per array entry. To ++ * display a message for the tester to see, simply call Sysout.println with the ++ * string to be displayed. This mimics System.out.println but works within the ++ * test harness as well as standalone. ++ */ ++class Sysout { ++ ++ private static TestDialog dialog; ++ ++ public static void createDialogWithInstructions(String[] instructions) { ++ dialog = new TestDialog(new Frame(), "Instructions"); ++ dialog.printInstructions(instructions); ++ dialog.setVisible(true); ++ println("Any messages for the tester will display here."); ++ } ++ ++ public static void createDialog() { ++ dialog = new TestDialog(new Frame(), "Instructions"); ++ String[] defInstr = {"Instructions will appear here. ", ""}; ++ dialog.printInstructions(defInstr); ++ dialog.setVisible(true); ++ println("Any messages for the tester will display here."); ++ } ++ ++ public static void printInstructions(String[] instructions) { ++ dialog.printInstructions(instructions); ++ } ++ ++ public static void println(String messageIn) { ++ dialog.displayMessage(messageIn); ++ } ++}// Sysout class ++ ++/** ++ * This is part of the standard test machinery. It provides a place for the test ++ * instructions to be displayed, and a place for interactive messages to the ++ * user to be displayed. To have the test instructions displayed, see Sysout. To ++ * have a message to the user be displayed, see Sysout. Do not call anything in ++ * this dialog directly. ++ */ ++class TestDialog extends Dialog { ++ ++ TextArea instructionsText; ++ TextArea messageText; ++ int maxStringLength = 80; ++ ++ //DO NOT call this directly, go through Sysout ++ public TestDialog(Frame frame, String name) { ++ super(frame, name); ++ int scrollBoth = TextArea.SCROLLBARS_BOTH; ++ instructionsText = new TextArea("", 15, maxStringLength, scrollBoth); ++ add("North", instructionsText); ++ ++ messageText = new TextArea("", 5, maxStringLength, scrollBoth); ++ add("Center", messageText); ++ ++ pack(); ++ ++ setVisible(true); ++ }// TestDialog() ++ ++ //DO NOT call this directly, go through Sysout ++ public void printInstructions(String[] instructions) { ++ //Clear out any current instructions ++ instructionsText.setText(""); ++ ++ //Go down array of instruction strings ++ ++ String printStr, remainingStr; ++ for (int i = 0; i < instructions.length; i++) { ++ //chop up each into pieces maxSringLength long ++ remainingStr = instructions[ i]; ++ while (remainingStr.length() > 0) { ++ //if longer than max then chop off first max chars to print ++ if (remainingStr.length() >= maxStringLength) { ++ //Try to chop on a word boundary ++ int posOfSpace = remainingStr.lastIndexOf(' ', maxStringLength - 1); ++ ++ if (posOfSpace <= 0) { ++ posOfSpace = maxStringLength - 1; ++ } ++ ++ printStr = remainingStr.substring(0, posOfSpace + 1); ++ remainingStr = remainingStr.substring(posOfSpace + 1); ++ } //else just print ++ else { ++ printStr = remainingStr; ++ remainingStr = ""; ++ } ++ ++ instructionsText.append(printStr + "\n"); ++ ++ }// while ++ ++ }// for ++ ++ }//printInstructions() ++ ++ //DO NOT call this directly, go through Sysout ++ public void displayMessage(String messageIn) { ++ messageText.append(messageIn + "\n"); ++ System.out.println(messageIn); ++ } ++}// Te +\ No newline at end of file +--- ./jdk/test/java/awt/Dialog/CloseDialog/CloseDialogTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Dialog/CloseDialog/CloseDialogTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,116 @@ ++/* ++ * 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.awt.Dialog; ++import java.awt.Frame; ++import java.io.*; ++import javax.swing.*; ++import sun.awt.SunToolkit; ++import java.util.concurrent.atomic.AtomicReference; ++ ++/** ++ * @test ++ * @bug 8043705 ++ * @summary Can't exit color chooser dialog when running as an applet ++ * @run main CloseDialogTest ++ */ ++public class CloseDialogTest { ++ ++ private static volatile Frame frame; ++ private static volatile Dialog dialog; ++ private static volatile InputStream testErrorStream; ++ private static final PrintStream systemErrStream = System.err; ++ private static final AtomicReference caughtException ++ = new AtomicReference<>(); ++ ++ public static void main(String[] args) throws Exception { ++ ++ // redirect System err ++ PipedOutputStream errorOutputStream = new PipedOutputStream(); ++ testErrorStream = new PipedInputStream(errorOutputStream); ++ System.setErr(new PrintStream(errorOutputStream)); ++ ++ ThreadGroup swingTG = new ThreadGroup(getRootThreadGroup(), "SwingTG"); ++ try { ++ new Thread(swingTG, () -> { ++ SunToolkit.createNewAppContext(); ++ SwingUtilities.invokeLater(() -> { ++ frame = new Frame(); ++ frame.setSize(300, 300); ++ frame.setVisible(true); ++ ++ dialog = new Dialog(frame); ++ dialog.setSize(200, 200); ++ dialog.setModal(true); ++ dialog.setVisible(true); ++ }); ++ }).start(); ++ ++ Thread.sleep(400); ++ ++ Thread disposeThread = new Thread(swingTG, () -> ++ SwingUtilities.invokeLater(() -> { ++ try { ++ while (dialog == null || !dialog.isVisible()) { ++ Thread.sleep(100); ++ } ++ dialog.setVisible(false); ++ dialog.dispose(); ++ frame.dispose(); ++ } catch (Exception e) { ++ caughtException.set(e); ++ } ++ })); ++ disposeThread.start(); ++ disposeThread.join(); ++ Thread.sleep(500); ++ ++ // read System err ++ final char[] buffer = new char[2048]; ++ System.err.print("END"); ++ System.setErr(systemErrStream); ++ try (Reader in = new InputStreamReader(testErrorStream, "UTF-8")) { ++ int size = in.read(buffer, 0, buffer.length); ++ String errorString = new String(buffer, 0, size); ++ if (!errorString.startsWith("END")) { ++ System.err.println(errorString. ++ substring(0, errorString.length() - 4)); ++ throw new RuntimeException("Error output is not empty!"); ++ } ++ } ++ } finally { ++ if (caughtException.get() != null) { ++ throw new RuntimeException("Failed. Caught exception!", ++ caughtException.get()); ++ } ++ } ++ } ++ ++ private static ThreadGroup getRootThreadGroup() { ++ ThreadGroup threadGroup = Thread.currentThread().getThreadGroup(); ++ while (threadGroup.getParent() != null) { ++ threadGroup = threadGroup.getParent(); ++ } ++ return threadGroup; ++ } ++} +--- ./jdk/test/java/awt/EventDispatchThread/EDTShutdownTest/EDTShutdownTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/EventDispatchThread/EDTShutdownTest/EDTShutdownTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,100 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ @test ++ @bug 8031694 ++ @summary [macosx] TwentyThousandTest test intermittently hangs ++ @author Oleg Pekhovskiy ++ @run main EDTShutdownTest ++ */ ++ ++import java.awt.EventQueue; ++import java.awt.Toolkit; ++import java.lang.reflect.InvocationTargetException; ++import java.lang.reflect.Method; ++import sun.awt.AWTAccessor; ++ ++public class EDTShutdownTest { ++ ++ private static boolean passed = false; ++ ++ public static void main(String[] args) { ++ // Force EDT start with InvocationEvent ++ EventQueue.invokeLater(() -> { ++ // EventQueue is empty now ++ EventQueue queue = Toolkit.getDefaultToolkit() ++ .getSystemEventQueue(); ++ Thread thread = AWTAccessor.getEventQueueAccessor() ++ .getDispatchThread(queue); ++ try { ++ /* ++ * Clear EventDispatchThread.doDispatch flag to break message ++ * loop in EventDispatchThread.pumpEventsForFilter() ++ */ ++ Method stopDispatching = thread.getClass() ++ .getDeclaredMethod("stopDispatching", null); ++ stopDispatching.setAccessible(true); ++ stopDispatching.invoke(thread, null); ++ ++ /* ++ * Post another InvocationEvent that must be handled by another ++ * instance of EDT ++ */ ++ EventQueue.invokeLater(() -> { ++ passed = true; ++ }); ++ } ++ catch (InvocationTargetException | NoSuchMethodException ++ | IllegalAccessException e) { ++ } ++ }); ++ ++ // Wait for EDT shutdown ++ EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue(); ++ Thread thread = AWTAccessor.getEventQueueAccessor() ++ .getDispatchThread(queue); ++ try { ++ thread.join(); ++ ++ /* ++ * Wait for another EDT instance to handle the InvocationEvent ++ * and shutdown ++ */ ++ thread = AWTAccessor.getEventQueueAccessor() ++ .getDispatchThread(queue); ++ if (thread != null) { ++ thread.join(); ++ } ++ } ++ catch (InterruptedException e) { ++ } ++ ++ if (passed) { ++ System.out.println("Test PASSED!"); ++ } ++ else { ++ throw new RuntimeException("Test FAILED!"); ++ } ++ } ++} +--- ./jdk/test/java/awt/FileDialog/FileDialogForPackages/FileDialogForPackages.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/FileDialog/FileDialogForPackages/FileDialogForPackages.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,45 @@ ++ ++ ++ ++ ++ ++ FileDialogForPackages ++ ++ ++ ++

    FileDialogForPackages
    Bug ID: 8026869

    ++ ++

    See the dialog box (usually in upper left corner) for instructions

    ++ ++ ++ ++ +--- ./jdk/test/java/awt/FileDialog/FileDialogForPackages/FileDialogForPackages.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/FileDialog/FileDialogForPackages/FileDialogForPackages.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,84 @@ ++/* ++ * 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 sun.awt.OSInfo; ++import test.java.awt.regtesthelpers.Sysout; ++ ++import java.applet.Applet; ++import java.awt.Button; ++import java.awt.FileDialog; ++import java.awt.Frame; ++import java.awt.GridLayout; ++import java.awt.event.ActionEvent; ++import java.awt.event.ActionListener; ++ ++public class FileDialogForPackages extends Applet implements ActionListener { ++ private static final String APPLICATIONS_FOLDER = "/Applications"; ++ ++ private volatile Button showBtn; ++ private volatile FileDialog fd; ++ ++ @Override ++ public void init() { ++ if (OSInfo.getOSType() != OSInfo.OSType.MACOSX) { ++ Sysout.createDialogWithInstructions(new String[]{ ++ "Press PASS, this test is for MacOS X only."}); ++ return; ++ } ++ ++ System.setProperty("apple.awt.use-file-dialog-packages", "true"); ++ ++ setLayout(new GridLayout(1, 1)); ++ ++ fd = new FileDialog(new Frame(), "Open"); ++ fd.setDirectory(APPLICATIONS_FOLDER); ++ ++ showBtn = new Button("Show File Dialog"); ++ showBtn.addActionListener(this); ++ add(showBtn); ++ String[] instructions = { ++ "1) Click on 'Show File Dialog' button. A file dialog will come up.", ++ "2) Navigate to the Applications folder if not already there", ++ "3) Check that the application bundles can be selected and can not be navigated", ++ "4) If it's true then the test passed, otherwise it failed."}; ++ Sysout.createDialogWithInstructions(instructions); ++ } ++ ++ @Override ++ public void start() { ++ setSize(200, 200); ++ show(); ++ } ++ ++ @Override ++ public void actionPerformed(ActionEvent e) { ++ if (e.getSource() == showBtn) { ++ fd.setVisible(true); ++ String output = fd.getFile(); ++ if (output != null) { ++ Sysout.println(output + " is selected"); ++ } ++ } ++ } ++} +--- ./jdk/test/java/awt/FileDialog/SaveFileNameOverrideTest/SaveFileNameOverrideTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/FileDialog/SaveFileNameOverrideTest/SaveFileNameOverrideTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,7 +23,7 @@ + + /* + test +- @bug 6998877 ++ @bug 6998877 8022531 + @summary After double-click on the folder names, FileNameOverrideTest FAILED + @author Sergey.Bylokhov@oracle.com area=awt.filedialog + @library ../../regtesthelpers +@@ -59,7 +59,8 @@ + + String[] instructions = { + "1) Click on 'Show File Dialog' button. A file dialog will come up.", +- "2) Double-click on '" + clickDirName + "' and click OK.", ++ "2) Double-click on '" + clickDirName + "' and click a confirmation", ++ " button, it can be 'OK', 'Save' or any other platform-dependent name.", + "3) See result of the test below" + }; + +--- ./jdk/test/java/awt/Frame/ExceptionOnSetExtendedStateTest/ExceptionOnSetExtendedStateTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Frame/ExceptionOnSetExtendedStateTest/ExceptionOnSetExtendedStateTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,103 @@ ++/* ++ * 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 8032078 ++ @summary Frame.setExtendedState throws RuntimeException, if ++ windowState=ICONIFIED|MAXIMIZED_BOTH, on OS X ++ @author Anton Litvinov ++*/ ++ ++import java.awt.*; ++ ++import sun.awt.SunToolkit; ++ ++public class ExceptionOnSetExtendedStateTest { ++ private static final int[] frameStates = { Frame.NORMAL, Frame.ICONIFIED, Frame.MAXIMIZED_BOTH }; ++ private static final SunToolkit toolkit = (SunToolkit)Toolkit.getDefaultToolkit(); ++ ++ private static boolean validatePlatform() { ++ String osName = System.getProperty("os.name"); ++ if (osName == null) { ++ throw new RuntimeException("Name of the current OS could not be retrieved."); ++ } ++ return osName.startsWith("Mac"); ++ } ++ ++ private static void testStateChange(int oldState, int newState, boolean decoratedFrame) { ++ System.out.println(String.format( ++ "testStateChange: oldState='%d', newState='%d', decoratedFrame='%b'", ++ oldState, newState, decoratedFrame)); ++ ++ Frame frame = new Frame("ExceptionOnSetExtendedStateTest"); ++ frame.setSize(200, 200); ++ frame.setUndecorated(!decoratedFrame); ++ frame.setVisible(true); ++ toolkit.realSync(); ++ ++ frame.setExtendedState(oldState); ++ sleep(1000); ++ frame.setExtendedState(newState); ++ ++ boolean stateWasNotChanged = true; ++ int currentState = 0; ++ for (int i = 0; (i < 3) && stateWasNotChanged; i++) { ++ sleep(1000); ++ currentState = frame.getExtendedState(); ++ if ((currentState == newState) || ++ (((newState & Frame.ICONIFIED) != 0) && ((currentState & Frame.ICONIFIED) != 0))) { ++ stateWasNotChanged = false; ++ } ++ } ++ frame.dispose(); ++ ++ if (stateWasNotChanged) { ++ throw new RuntimeException(String.format( ++ "Frame state was not changed. currentState='%d'", currentState)); ++ } ++ } ++ ++ private static void sleep(int millis) { ++ try { ++ Thread.sleep(millis); ++ } catch (Exception e) { ++ e.printStackTrace(); ++ } ++ } ++ ++ public static void main(String[] args) { ++ if (!validatePlatform()) { ++ System.out.println("This test is only for OS X."); ++ return; ++ } ++ ++ // Verify that changing states of decorated/undecorated frame to/from supported states ++ // and the state bit mask ICONIFIED | MAXIMIZED_BOTH does not raise RuntimeException. ++ for (int i = 0; i < frameStates.length; i++) { ++ testStateChange(frameStates[i], Frame.ICONIFIED | Frame.MAXIMIZED_BOTH, true); ++ testStateChange(frameStates[i], Frame.ICONIFIED | Frame.MAXIMIZED_BOTH, false); ++ testStateChange(Frame.ICONIFIED | Frame.MAXIMIZED_BOTH, frameStates[i], true); ++ testStateChange(Frame.ICONIFIED | Frame.MAXIMIZED_BOTH, frameStates[i], false); ++ } ++ } ++} +--- ./jdk/test/java/awt/Frame/SlideNotResizableTest/SlideNotResizableTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Frame/SlideNotResizableTest/SlideNotResizableTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,69 @@ ++/* ++ * 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 sun.awt.SunToolkit; ++ ++import java.awt.*; ++import java.awt.Dimension; ++import java.awt.Point; ++import java.awt.event.InputEvent; ++ ++/** ++ * @test ++ * @bug 8032595 ++ * @summary setResizable(false) makes a frame slide down ++ * @author Petr Pchelko ++ */ ++ ++public class SlideNotResizableTest { ++ ++ private static volatile boolean passed = false; ++ private static final Dimension FRAME_SIZE = new Dimension(100, 100); ++ private static final Point FRAME_LOCATION = new Point(200, 200); ++ ++ public static void main(String[] args) throws Throwable { ++ Frame aFrame = null; ++ try { ++ aFrame = new Frame(); ++ aFrame.setSize(FRAME_SIZE); ++ aFrame.setLocation(FRAME_LOCATION); ++ aFrame.setResizable(false); ++ aFrame.setVisible(true); ++ ++ sync(); ++ ++ if (!aFrame.getLocation().equals(FRAME_LOCATION)) { ++ throw new RuntimeException("FAILED: Wrong frame position"); ++ } ++ } finally { ++ if (aFrame != null) { ++ aFrame.dispose(); ++ } ++ } ++ } ++ ++ private static void sync() throws InterruptedException { ++ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); ++ Thread.sleep(1000); ++ } ++} +--- ./jdk/test/java/awt/FullScreen/AltTabCrashTest/AltTabCrashTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/FullScreen/AltTabCrashTest/AltTabCrashTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,480 @@ ++/* ++ * 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 ++ * 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 6275887 6429971 6459792 ++ @summary Test that we don't crash when alt+tabbing in and out of ++ fullscreen app ++ @author Dmitri.Trembovetski@sun.com: area=FullScreen ++ @run main/othervm/timeout=100 AltTabCrashTest -auto -changedm ++ @run main/othervm/timeout=100 -Dsun.java2d.d3d=True AltTabCrashTest -auto -changedm ++ @run main/othervm/timeout=100 -Dsun.java2d.d3d=True AltTabCrashTest -auto -usebs -changedm ++ @run main/othervm/timeout=100 -Dsun.java2d.opengl=True AltTabCrashTest -auto ++*/ ++ ++import java.awt.AWTException; ++import java.awt.Color; ++import java.awt.DisplayMode; ++import java.awt.Frame; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.GraphicsDevice; ++import java.awt.GraphicsEnvironment; ++import java.awt.Image; ++import java.awt.RenderingHints; ++import java.awt.Robot; ++import java.awt.event.KeyAdapter; ++import java.awt.event.KeyEvent; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++import java.awt.image.BufferStrategy; ++import java.awt.image.BufferedImage; ++import java.awt.image.VolatileImage; ++import java.util.Random; ++import java.util.Vector; ++ ++/** ++ * Note that the alt+tabbing in and out part will most likely only work ++ * on Windows, and only if there are no interventions. ++ */ ++ ++public class AltTabCrashTest extends Frame { ++ public static int width; ++ public static int height; ++ public static volatile boolean autoMode; ++ public static boolean useBS; ++ public static final int NUM_OF_BALLS = 70; ++ // number of times to alt+tab in and out of the app ++ public static int altTabs = 5; ++ private final Vector balls = new Vector<>(); ++ GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment() ++ .getDefaultScreenDevice(); ++ VolatileImage vimg = null; ++ BufferStrategy bufferStrategy = null; ++ volatile boolean timeToQuit = false; ++ static final Object lock = new Object(); ++ ++ enum SpriteType { ++ OVALS, VIMAGES, BIMAGES, AAOVALS, TEXT ++ } ++ ++ private static boolean changeDM = false; ++ private static SpriteType spriteType; ++ static Random rnd = new Random(); ++ ++ public AltTabCrashTest( ) { ++ addKeyListener(new KeyAdapter() { ++ public void keyPressed(KeyEvent e) { ++ if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { ++ timeToQuit = true; ++ } ++ } ++ }); ++ setIgnoreRepaint(true); ++ addMouseListener(new MouseHandler()); ++ for (int i = 0; i < NUM_OF_BALLS; i++) { ++ int x = 50 + rnd.nextInt(550), y = 50 + rnd.nextInt(400); ++ ++ balls.addElement(createRandomBall(y, x)); ++ } ++ setUndecorated(true); ++ gd.setFullScreenWindow(this); ++ GraphicsDevice gd = getGraphicsConfiguration().getDevice(); ++ if (gd.isDisplayChangeSupported() && changeDM) { ++ DisplayMode dm = findDisplayMode(); ++ if (dm != null) { ++ try { ++ gd.setDisplayMode(dm); ++ } catch (IllegalArgumentException iae) { ++ System.err.println("Error setting display mode"); ++ } ++ } ++ } ++ if (useBS) { ++ createBufferStrategy(2); ++ bufferStrategy = getBufferStrategy(); ++ } else { ++ Graphics2D g = (Graphics2D) getGraphics(); ++ render(g); ++ g.dispose(); ++ } ++ Thread t = new BallThread(); ++ t.start(); ++ if (autoMode) { ++ Thread tt = new AltTabberThread(); ++ tt.start(); ++ synchronized (lock) { ++ while (!timeToQuit) { ++ try { ++ lock.wait(200); ++ } catch (InterruptedException ex) { ++ ex.printStackTrace(); ++ } ++ } ++ } ++ t = null; ++ dispose(); ++ } ++ } ++ ++ private Ball createRandomBall(final int y, final int x) { ++ Ball b; ++ SpriteType type; ++ ++ if (spriteType == null) { ++ int index = rnd.nextInt(SpriteType.values().length); ++ type = SpriteType.values()[index]; ++ } else { ++ type = spriteType; ++ } ++ switch (type) { ++ case VIMAGES: b = new VISpriteBall(x, y); break; ++ case AAOVALS: b = new AAOvalBall(x, y); break; ++ case BIMAGES: b = new BISpriteBall(x, y); break; ++ case TEXT: b = new TextBall(x,y, "Text Sprite!"); break; ++ default: b = new Ball(x, y); break; ++ } ++ return b; ++ } ++ ++ private class MouseHandler extends MouseAdapter { ++ public void mousePressed(MouseEvent e) { ++ synchronized (balls) { ++ balls.addElement(createRandomBall(e.getX(), e.getY())); ++ } ++ } ++ } ++ ++ private class AltTabberThread extends Thread { ++ Robot robot; ++ ++ void pressAltTab() { ++ robot.keyPress(KeyEvent.VK_ALT); ++ robot.keyPress(KeyEvent.VK_TAB); ++ robot.keyRelease(KeyEvent.VK_TAB); ++ robot.keyRelease(KeyEvent.VK_ALT); ++ } ++ void pressShiftAltTab() { ++ robot.keyPress(KeyEvent.VK_SHIFT); ++ pressAltTab(); ++ robot.keyRelease(KeyEvent.VK_SHIFT); ++ } ++ public void run() { ++ try { ++ robot = new Robot(); ++ robot.setAutoDelay(200); ++ } catch (AWTException e) { ++ throw new RuntimeException("Can't create robot"); ++ } ++ boolean out = true; ++ while (altTabs-- > 0 && !timeToQuit) { ++ System.err.println("Alt+tabber Iteration: "+altTabs); ++ try { Thread.sleep(2500); } catch (InterruptedException ex) {} ++ ++ if (out) { ++ System.err.println("Issuing alt+tab"); ++ pressAltTab(); ++ } else { ++ System.err.println("Issuing shift "); ++ pressShiftAltTab(); ++ } ++ out = !out; ++ } ++ System.err.println("Alt+tabber finished."); ++ synchronized (lock) { ++ timeToQuit = true; ++ lock.notify(); ++ } ++ } ++ } ++ ++ private class BallThread extends Thread { ++ public void run() { ++ while (!timeToQuit) { ++ if (useBS) { ++ renderToBS(); ++ bufferStrategy.show(); ++ } else { ++ Graphics g = AltTabCrashTest.this.getGraphics(); ++ render(g); ++ g.dispose(); ++ } ++ } ++ gd.setFullScreenWindow(null); ++ AltTabCrashTest.this.dispose(); ++ } ++ } ++ ++ static class Ball { ++ ++ int x, y; // current location ++ int dx, dy; // motion delta ++ int diameter = 40; ++ Color color = Color.red; ++ ++ public Ball() { ++ } ++ ++ public Ball(int x, int y) { ++ this.x = x; ++ this.y = y; ++ dx = x % 20 + 1; ++ dy = y % 20 + 1; ++ color = new Color(rnd.nextInt(0x00ffffff)); ++ } ++ ++ public void move() { ++ if (x < 10 || x >= AltTabCrashTest.width - 20) ++ dx = -dx; ++ if (y < 10 || y > AltTabCrashTest.height - 20) ++ dy = -dy; ++ x += dx; ++ y += dy; ++ } ++ ++ public void paint(Graphics g, Color c) { ++ if (c == null) { ++ g.setColor(color); ++ } else { ++ g.setColor(c); ++ } ++ g.fillOval(x, y, diameter, diameter); ++ } ++ ++ } ++ ++ static class TextBall extends Ball { ++ String text; ++ public TextBall(int x, int y, String text) { ++ super(x, y); ++ this.text = text; ++ } ++ ++ public void paint(Graphics g, Color c) { ++ if (c == null) { ++ g.setColor(color); ++ } else { ++ g.setColor(c); ++ } ++ g.drawString(text, x, y); ++ } ++ } ++ ++ static class AAOvalBall extends Ball { ++ public AAOvalBall(int x, int y) { ++ super(x, y); ++ } ++ public void paint(Graphics g, Color c) { ++ if (c == null) { ++ Graphics2D g2d = (Graphics2D)g.create(); ++ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, ++ RenderingHints.VALUE_ANTIALIAS_ON); ++ g2d.setColor(color); ++ g2d.fillOval(x, y, diameter, diameter); ++ } else { ++ g.setColor(c); ++ g.fillOval(x-2, y-2, diameter+4, diameter+4); ++ } ++ } ++ } ++ ++ static abstract class SpriteBall extends Ball { ++ Image image; ++ public SpriteBall(int x, int y) { ++ super(x, y); ++ image = createSprite(); ++ Graphics g = image.getGraphics(); ++ g.setColor(color); ++ g.fillRect(0, 0, image.getWidth(null), image.getHeight(null)); ++ } ++ public void paint(Graphics g, Color c) { ++ if (c != null) { ++ g.setColor(c); ++ g.fillRect(x, y, image.getWidth(null), image.getHeight(null)); ++ } else do { ++ validateSprite(); ++ g.drawImage(image, x, y, null); ++ } while (renderingIncomplete()); ++ } ++ public abstract Image createSprite(); ++ public void validateSprite() {} ++ public boolean renderingIncomplete() { return false; } ++ } ++ class VISpriteBall extends SpriteBall { ++ ++ public VISpriteBall(int x, int y) { ++ super(x, y); ++ } ++ public boolean renderingIncomplete() { ++ return ((VolatileImage)image).contentsLost(); ++ } ++ ++ public Image createSprite() { ++ return gd.getDefaultConfiguration(). ++ createCompatibleVolatileImage(20, 20); ++ } ++ public void validateSprite() { ++ int result = ++ ((VolatileImage)image).validate(getGraphicsConfiguration()); ++ if (result == VolatileImage.IMAGE_INCOMPATIBLE) { ++ image = createSprite(); ++ result = VolatileImage.IMAGE_RESTORED; ++ } ++ if (result == VolatileImage.IMAGE_RESTORED) { ++ Graphics g = image.getGraphics(); ++ g.setColor(color); ++ g.fillRect(0, 0, image.getWidth(null), image.getHeight(null)); ++ } ++ } ++ } ++ class BISpriteBall extends SpriteBall { ++ public BISpriteBall(int x, int y) { ++ super(x, y); ++ } ++ public Image createSprite() { ++ return new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB); ++ } ++ } ++ ++ ++ public void renderOffscreen() { ++ Graphics2D g2d = (Graphics2D) vimg.getGraphics(); ++ synchronized (balls) { ++ for (Ball b : balls) { ++ b.paint(g2d, getBackground()); ++ b.move(); ++ b.paint(g2d, null); ++ } ++ } ++ g2d.dispose(); ++ } ++ ++ public void renderToBS() { ++ width = getWidth(); ++ height = getHeight(); ++ ++ do { ++ Graphics2D g2d = (Graphics2D)bufferStrategy.getDrawGraphics(); ++ ++ g2d.clearRect(0, 0, width, height); ++ synchronized (balls) { ++ for (Ball b : balls) { ++ b.move(); ++ b.paint(g2d, null); ++ } ++ } ++ g2d.dispose(); ++ } while (bufferStrategy.contentsLost() || ++ bufferStrategy.contentsRestored()); ++ } ++ ++ public void render(Graphics g) { ++ do { ++ height = getBounds().height; ++ width = getBounds().width; ++ if (vimg == null) { ++ vimg = createVolatileImage(width, height); ++ renderOffscreen(); ++ } ++ int returnCode = vimg.validate(getGraphicsConfiguration()); ++ if (returnCode == VolatileImage.IMAGE_RESTORED) { ++ renderOffscreen(); ++ } else if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE) { ++ vimg = getGraphicsConfiguration(). ++ createCompatibleVolatileImage(width, height); ++ renderOffscreen(); ++ } else if (returnCode == VolatileImage.IMAGE_OK) { ++ renderOffscreen(); ++ } ++ g.drawImage(vimg, 0, 0, this); ++ } while (vimg.contentsLost()); ++ } ++ ++ public static void main(String args[]) { ++ for (String arg : args) { ++ if (arg.equalsIgnoreCase("-auto")) { ++ autoMode = true; ++ System.err.println("Running in automatic mode using Robot"); ++ } else if (arg.equalsIgnoreCase("-usebs")) { ++ useBS = true; ++ System.err.println("Using BufferStrategy instead of VI"); ++ } else if (arg.equalsIgnoreCase("-changedm")) { ++ changeDM= true; ++ System.err.println("The test will change display mode"); ++ } else if (arg.equalsIgnoreCase("-vi")) { ++ spriteType = SpriteType.VIMAGES; ++ } else if (arg.equalsIgnoreCase("-bi")) { ++ spriteType = SpriteType.BIMAGES; ++ } else if (arg.equalsIgnoreCase("-ov")) { ++ spriteType = SpriteType.OVALS; ++ } else if (arg.equalsIgnoreCase("-aaov")) { ++ spriteType = SpriteType.AAOVALS; ++ } else if (arg.equalsIgnoreCase("-tx")) { ++ spriteType = SpriteType.TEXT; ++ } else { ++ System.err.println("Usage: AltTabCrashTest [-usebs][-auto]" + ++ "[-changedm][-vi|-bi|-ov|-aaov|-tx]"); ++ System.err.println(" -usebs: use BufferStrategy instead of VI"); ++ System.err.println(" -auto: automatically alt+tab in and out" + ++ " of the application "); ++ System.err.println(" -changedm: change display mode"); ++ System.err.println(" -(vi|bi|ov|tx|aaov) : use only VI, BI, " + ++ "text or [AA] [draw]Oval sprites"); ++ System.exit(0); ++ } ++ } ++ if (spriteType != null) { ++ System.err.println("The test will only use "+spriteType+" sprites."); ++ } ++ new AltTabCrashTest(); ++ } ++ ++ private DisplayMode findDisplayMode() { ++ GraphicsDevice gd = getGraphicsConfiguration().getDevice(); ++ DisplayMode dms[] = gd.getDisplayModes(); ++ DisplayMode currentDM = gd.getDisplayMode(); ++ for (DisplayMode dm : dms) { ++ if (dm.getBitDepth() > 8 && ++ dm.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI && ++ dm.getBitDepth() != currentDM.getBitDepth() && ++ dm.getWidth() == currentDM.getWidth() && ++ dm.getHeight() == currentDM.getHeight()) ++ { ++ // found a mode which has the same dimensions but different ++ // depth ++ return dm; ++ } ++ if (dm.getBitDepth() == DisplayMode.BIT_DEPTH_MULTI && ++ (dm.getWidth() != currentDM.getWidth() || ++ dm.getHeight() != currentDM.getHeight())) ++ { ++ // found a mode which has the same depth but different ++ // dimensions ++ return dm; ++ } ++ } ++ ++ return null; ++ } ++} +--- ./jdk/test/java/awt/Graphics2D/ScaledCopyArea/ScaledCopyArea.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Graphics2D/ScaledCopyArea/ScaledCopyArea.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.awt.Color; ++import java.awt.Graphics2D; ++import java.awt.image.BufferedImage; ++ ++/** ++ * @test ++ * @bug 8029455 ++ * @summary Tests that copyarea on offscreen images works as expected when ++ * scaled transform is set ++ * @run main ScaledCopyArea ++ */ ++public final class ScaledCopyArea { ++ ++ public static void main(final String[] args) { ++ final BufferedImage bi = new BufferedImage(100, 300, ++ BufferedImage.TYPE_INT_RGB); ++ final Graphics2D g = bi.createGraphics(); ++ g.scale(2, 2); ++ g.setColor(Color.RED); ++ g.fillRect(0, 0, 100, 300); ++ g.setColor(Color.GREEN); ++ g.fillRect(0, 100, 100, 100); ++ g.copyArea(0, 100, 100, 100, 0, -100); ++ g.dispose(); ++ for (int x = 0; x < 100; ++x) { ++ for (int y = 0; y < 100; ++y) { ++ final int actual = bi.getRGB(x, y); ++ final int exp = Color.GREEN.getRGB(); ++ if (actual != exp) { ++ System.err.println("Expected:" + Integer.toHexString(exp)); ++ System.err.println("Actual:" + Integer.toHexString(actual)); ++ throw new RuntimeException("Test " + "failed"); ++ } ++ } ++ } ++ } ++} +--- ./jdk/test/java/awt/List/ListPeer/R2303044ListSelection.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/List/ListPeer/R2303044ListSelection.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,65 @@ ++/* ++ * 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 ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import sun.awt.SunToolkit; ++ ++import java.awt.Frame; ++import java.awt.HeadlessException; ++import java.awt.List; ++import java.awt.Toolkit; ++ ++/** ++ * @test ++ * @summary rdar://problem/2303044 List selection not set when peer is created ++ * @summary com.apple.junit.java.awt.List; ++ * @run main R2303044ListSelection ++ */ ++public final class R2303044ListSelection { ++ ++ public static final String ITEM_NAME = "myItem"; ++ ++ public static void main(final String[] args) throws HeadlessException { ++ final Frame frame = new Frame("Test Frame"); ++ final List list = new List(); ++ frame.setSize(300, 200); ++ list.add(ITEM_NAME); ++ list.select(0); ++ frame.add(list); ++ frame.validate(); ++ frame.setVisible(true); ++ sleep(); ++ if (!ITEM_NAME.equals(list.getSelectedItem())) { ++ throw new RuntimeException("List item not selected item."); ++ } ++ list.removeAll(); ++ frame.dispose(); ++ } ++ ++ private static void sleep() { ++ try { ++ ((SunToolkit) Toolkit.getDefaultToolkit()).realSync(); ++ Thread.sleep(1000); ++ } catch (final InterruptedException ignored) { ++ } ++ } ++} +--- ./jdk/test/java/awt/Mouse/MouseComboBoxTest/MouseComboBoxTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Mouse/MouseComboBoxTest/MouseComboBoxTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,138 @@ ++/* ++ * 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 8032872 ++ * @summary Tests JComboBox selection via the mouse ++ * @author Dmitry Markov ++ */ ++import sun.awt.SunToolkit; ++ ++import javax.swing.*; ++import javax.swing.plaf.basic.BasicComboPopup; ++import javax.swing.plaf.basic.ComboPopup; ++import javax.swing.plaf.metal.MetalComboBoxUI; ++import javax.swing.plaf.metal.MetalLookAndFeel; ++import java.awt.*; ++import java.awt.event.InputEvent; ++import java.awt.event.KeyEvent; ++ ++public class MouseComboBoxTest { ++ private static final String[] items = {"One", "Two", "Three", "Four", "Five"}; ++ ++ private static SunToolkit toolkit = null; ++ private static Robot robot = null; ++ private static JFrame frame = null; ++ private static JComboBox comboBox = null; ++ private static MyComboBoxUI comboBoxUI = null; ++ ++ public static void main(String[] args) throws Exception { ++ toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ robot = new Robot(); ++ robot.setAutoDelay(50); ++ ++ UIManager.setLookAndFeel(new MetalLookAndFeel()); ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ createAndShowGUI(); ++ } ++ }); ++ toolkit.realSync(); ++ ++ for (int i = 0; i < items.length; i++) { ++ // Open popup ++ robot.keyPress(KeyEvent.VK_DOWN); ++ robot.keyRelease(KeyEvent.VK_DOWN); ++ toolkit.realSync(); ++ ++ Point point = getItemPointToClick(i); ++ robot.mouseMove(point.x, point.y); ++ robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); ++ robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); ++ toolkit.realSync(); ++ ++ if (i != getSelectedIndex()) { ++ throw new RuntimeException("Test Failed! Incorrect value of selected index = " + getSelectedIndex() + ++ ", expected value = " + i); ++ } ++ } ++ } ++ ++ private static Point getItemPointToClick(final int item) throws Exception { ++ final Point[] result = new Point[1]; ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ BasicComboPopup popup = (BasicComboPopup)comboBoxUI.getComboPopup(); ++ Point point = popup.getLocationOnScreen(); ++ Dimension size = popup.getSize(); ++ ++ int step = size.height / items.length; ++ point.x += size.width / 2; ++ point.y += step / 2 + step * item; ++ result[0] = point; ++ } ++ }); ++ return result[0]; ++ } ++ ++ private static int getSelectedIndex() throws Exception { ++ final int[] result = new int[1]; ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ result[0] = comboBox.getSelectedIndex(); ++ } ++ }); ++ return result[0]; ++ } ++ ++ private static void createAndShowGUI() { ++ frame = new JFrame("MouseComboBoxTest"); ++ ++ comboBox = new JComboBox(items); ++ comboBox.setEditable(true); ++ comboBoxUI = new MyComboBoxUI(); ++ comboBox.setUI(comboBoxUI); ++ ++ frame.pack(); ++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ frame.setVisible(true); ++ ++ JWindow window = new JWindow(frame); ++ window.add(comboBox); ++ window.pack(); ++ window.setVisible(true); ++ } ++ ++ private static class MyComboBoxUI extends MetalComboBoxUI { ++ public ComboPopup getComboPopup() { ++ return popup; ++ } ++ } ++} ++ +--- ./jdk/test/java/awt/Multiscreen/MouseEventTest/MouseEventTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Multiscreen/MouseEventTest/MouseEventTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,99 @@ ++/* ++ * 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 8017472 ++ @summary MouseEvent has wrong coordinates when using multiple monitors ++ @run main MouseEventTest ++ */ ++ ++import sun.awt.SunToolkit; ++ ++import java.awt.*; ++import java.awt.event.MouseAdapter; ++import java.awt.event.MouseEvent; ++ ++public class MouseEventTest { ++ static volatile boolean crossed = false; ++ ++ static void sleep() throws InterruptedException { ++ ((SunToolkit) Toolkit.getDefaultToolkit()).realSync(); ++ Thread.sleep(500); ++ } ++ ++ public static void main(String[] args) throws AWTException, InterruptedException { ++ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); ++ GraphicsDevice[] gds = ge.getScreenDevices(); ++ if (gds.length < 2) { ++ System.out.println("It's a multiscreen test... skipping!"); ++ return; ++ } ++ ++ for (int i = 0; i < gds.length; ++i) { ++ GraphicsDevice gd = gds[i]; ++ GraphicsConfiguration gc = gd.getDefaultConfiguration(); ++ Rectangle screen = gc.getBounds(); ++ Robot robot = new Robot(gd); ++ robot.setAutoDelay(100); ++ ++ ++ Frame frame = new Frame(gc); ++ frame.setUndecorated(true); ++ frame.setSize(200, 200); ++ frame.setLocation(screen.x + 200, screen.y + 200); ++ frame.setBackground(Color.YELLOW); ++ frame.setVisible(true); ++ sleep(); ++ ++ Point loc = frame.getLocationOnScreen(); ++ Dimension size = frame.getSize(); ++ final Point point = new Point( ++ loc.x + size.width / 2, ++ loc.y + size.height / 2); ++ ++ crossed = false; ++ ++ frame.addMouseMotionListener(new MouseAdapter() { ++ @Override ++ public void mouseMoved(MouseEvent e) { ++ if (point.equals(e.getLocationOnScreen())) { ++ crossed = true; ++ } ++ } ++ }); ++ ++ robot.mouseMove(point.x - 1, point.y - 1); ++ robot.mouseMove(point.x, point.y); ++ ++ sleep(); ++ frame.dispose(); ++ ++ if (!crossed) { ++ throw new RuntimeException("An expected mouse motion event was not received on the screen #" + i); ++ } ++ } ++ ++ System.out.println("Test PASSED!"); ++ } ++} +--- ./jdk/test/java/awt/Multiscreen/MultiScreenLocationTest/MultiScreenLocationTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Multiscreen/MultiScreenLocationTest/MultiScreenLocationTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,110 @@ ++/* ++ * 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 8013116 ++ @summary Robot moves mouse to point which differs from set in mouseMove on ++ Unity shell ++ @author Oleg Pekhovskiy ++ @library ../../regtesthelpers ++ @build Util ++ @run main MultiScreenLocationTest ++ */ ++ ++import java.awt.AWTException; ++import java.awt.Color; ++import java.awt.Frame; ++import java.awt.GraphicsConfiguration; ++import java.awt.GraphicsDevice; ++import java.awt.GraphicsEnvironment; ++import java.awt.MouseInfo; ++import java.awt.Point; ++import java.awt.Rectangle; ++import java.awt.Robot; ++import java.awt.image.BufferedImage; ++import test.java.awt.regtesthelpers.Util; ++ ++public class MultiScreenLocationTest { ++ private static final Point mouseOffset = new Point(150, 150); ++ private static final Point frameOffset = new Point(100, 100); ++ private static final Color color = Color.YELLOW; ++ ++ private static String getErrorText(final String name, int screen) ++ { ++ return name + " test failed on Screen #" + screen + "!"; ++ } ++ ++ public static void main(String[] args) throws AWTException ++ { ++ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); ++ GraphicsDevice[] gds = ge.getScreenDevices(); ++ if (gds.length < 2) { ++ System.out.println("It's a multiscreen test... skipping!"); ++ return; ++ } ++ ++ for (int i = 0; i < gds.length; ++i) { ++ GraphicsDevice gd = gds[i]; ++ GraphicsConfiguration gc = gd.getDefaultConfiguration(); ++ Rectangle screen = gc.getBounds(); ++ Robot robot = new Robot(gd); ++ ++ // check Robot.mouseMove() ++ robot.mouseMove(screen.x + mouseOffset.x, screen.y + mouseOffset.y); ++ Point mouse = MouseInfo.getPointerInfo().getLocation(); ++ Point point = screen.getLocation(); ++ point.translate(mouseOffset.x, mouseOffset.y); ++ if (!point.equals(mouse)) { ++ throw new RuntimeException(getErrorText("Robot.mouseMove", i)); ++ } ++ ++ // check Robot.getPixelColor() ++ Frame frame = new Frame(gc); ++ frame.setUndecorated(true); ++ frame.setSize(100, 100); ++ frame.setLocation(screen.x + frameOffset.x, screen.y + frameOffset.y); ++ frame.setBackground(color); ++ frame.setVisible(true); ++ robot.waitForIdle(); ++ Rectangle bounds = frame.getBounds(); ++ if (!Util.testBoundsColor(bounds, color, 5, 1000, robot)) { ++ throw new RuntimeException(getErrorText("Robot.getPixelColor", i)); ++ } ++ ++ // check Robot.createScreenCapture() ++ BufferedImage image = robot.createScreenCapture(bounds); ++ int rgb = color.getRGB(); ++ if (image.getRGB(0, 0) != rgb ++ || image.getRGB(image.getWidth() - 1, 0) != rgb ++ || image.getRGB(image.getWidth() - 1, image.getHeight() - 1) != rgb ++ || image.getRGB(0, image.getHeight() - 1) != rgb) { ++ throw new RuntimeException( ++ getErrorText("Robot.createScreenCapture", i)); ++ } ++ frame.dispose(); ++ } ++ ++ System.out.println("Test PASSED!"); ++ } ++} +--- ./jdk/test/java/awt/Paint/PaintNativeOnUpdate.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Paint/PaintNativeOnUpdate.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,98 @@ ++/* ++ * 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.awt.AWTException; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Frame; ++import java.awt.Graphics; ++import java.awt.Label; ++import java.awt.Point; ++import java.awt.Robot; ++import java.awt.Toolkit; ++ ++import sun.awt.SunToolkit; ++ ++/** ++ * @test ++ * @bug 7157680 ++ * @author Sergey Bylokhov ++ */ ++public final class PaintNativeOnUpdate extends Label { ++ ++ private boolean fullUpdate = true; ++ ++ public static void main(final String[] args) throws AWTException { ++ final Frame frame = new Frame(); ++ final Component label = new PaintNativeOnUpdate(); ++ frame.setBackground(Color.RED); ++ frame.add(label); ++ frame.setSize(300, 300); ++ frame.setUndecorated(true); ++ frame.setLocationRelativeTo(null); ++ frame.setVisible(true); ++ sleep(); ++ label.repaint();// first paint ++ sleep(); ++ label.repaint();// incremental paint ++ sleep(); ++ ++ Robot robot = new Robot(); ++ robot.setAutoDelay(50); ++ Point point = label.getLocationOnScreen(); ++ Color color = robot.getPixelColor(point.x + label.getWidth() / 2, ++ point.y + label.getHeight() / 2); ++ if (!color.equals(Color.GREEN)) { ++ System.err.println("Expected color = " + Color.GREEN); ++ System.err.println("Actual color = " + color); ++ throw new RuntimeException(); ++ } ++ frame.dispose(); ++ } ++ ++ @Override ++ public void update(final Graphics g) { ++ if (fullUpdate) { ++ //full paint ++ g.setColor(Color.GREEN); ++ g.fillRect(0, 0, getWidth(), getHeight()); ++ fullUpdate = false; ++ } else { ++ // Do nothing ++ // incremental paint ++ } ++ } ++ ++ @Override ++ public void paint(final Graphics g) { ++ // Do nothing ++ } ++ ++ private static void sleep() { ++ try { ++ ((SunToolkit) (Toolkit.getDefaultToolkit())).realSync(); ++ Thread.sleep(1000); ++ } catch (InterruptedException ignored) { ++ } ++ } ++} +--- ./jdk/test/java/awt/Paint/bug8024864.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/Paint/bug8024864.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -22,7 +22,7 @@ + */ + + /* @test +- * @bug 8024864 ++ * @bug 8024864 8031422 + * @summary [macosx] Problems with rendering of controls + * @author Petr Pchelko + * @library ../regtesthelpers +@@ -65,7 +65,7 @@ + Util.waitForIdle(r); + + Dimension frameSize = frame.getSize(); +- Point loc = new Point(frameSize.width - 5, frameSize.height - 5); ++ Point loc = new Point(frameSize.width - 15, frameSize.height - 15); + SwingUtilities.convertPointToScreen(loc, frame); + Color c = r.getPixelColor(loc.x, loc.y); + +--- ./jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,140 @@ ++/* ++* Copyright (c) 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. ++*/ ++ ++import sun.awt.OSInfo; ++ ++import java.awt.*; ++import java.awt.Robot; ++import java.awt.event.InputEvent; ++import java.lang.InterruptedException; ++import java.lang.System; ++import java.lang.Thread; ++import java.lang.reflect.Method; ++import java.lang.reflect.Proxy; ++import javax.swing.*; ++ ++/* ++ * @test ++ * @bug 8024185 ++ * @summary Native Mac OS X full screen does not work after showing the splash ++ * @library ../ ++ * @build GenerateTestImage ++ * @run main GenerateTestImage ++ * @author Petr Pchelko area=awt.event ++ * @run main/othervm -splash:test.png FullScreenAfterSplash ++ */ ++public class FullScreenAfterSplash { ++ ++ private static JFrame frame; ++ ++ private static volatile boolean windowEnteringFullScreen = false; ++ private static volatile boolean windowEnteredFullScreen = false; ++ ++ public static void main(String[] args) throws Exception { ++ ++ if (OSInfo.getOSType() != OSInfo.OSType.MACOSX) { ++ System.out.println("The test is applicable only to Mac OS X. Passed"); ++ return; ++ } ++ try { ++ //Move the mouse out, because it could interfere with the test. ++ Robot r = new Robot(); ++ r.mouseMove(0, 0); ++ sleep(); ++ ++ SwingUtilities.invokeAndWait(FullScreenAfterSplash::createAndShowGUI); ++ sleep(); ++ ++ Point fullScreenButtonPos = frame.getLocation(); ++ fullScreenButtonPos.translate(frame.getWidth() - 10, 10); ++ r.mouseMove(fullScreenButtonPos.x, fullScreenButtonPos.y); ++ ++ //Cant use waitForIdle for full screen transition. ++ int waitCount = 0; ++ while (!windowEnteringFullScreen) { ++ r.mousePress(InputEvent.BUTTON1_MASK); ++ r.mouseRelease(InputEvent.BUTTON1_MASK); ++ Thread.sleep(100); ++ if (waitCount++ > 10) { ++ System.err.println("Can't enter full screen mode. Failed."); ++ System.exit(1); ++ } ++ } ++ ++ waitCount = 0; ++ while (!windowEnteredFullScreen) { ++ Thread.sleep(100); ++ if (waitCount++ > 10) { ++ System.err.println("Can't enter full screen mode. Failed."); ++ System.exit(1); ++ } ++ } ++ } finally { ++ if (frame != null) { ++ frame.dispose(); ++ } ++ } ++ } ++ ++ private static void createAndShowGUI() { ++ frame = new JFrame(" Fullscreen OSX Bug "); ++ frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); ++ enableFullScreen(frame); ++ frame.setBounds(100, 100, 100, 100); ++ frame.pack(); ++ frame.setVisible(true); ++ } ++ ++ /* ++ * Use reflection to make a test compilable on not Mac OS X ++ */ ++ private static void enableFullScreen(Window window) { ++ try { ++ Class fullScreenUtilities = Class.forName("com.apple.eawt.FullScreenUtilities"); ++ Method setWindowCanFullScreen = fullScreenUtilities.getMethod("setWindowCanFullScreen", Window.class, boolean.class); ++ setWindowCanFullScreen.invoke(fullScreenUtilities, window, true); ++ Class fullScreenListener = Class.forName("com.apple.eawt.FullScreenListener"); ++ Object listenerObject = Proxy.newProxyInstance(fullScreenListener.getClassLoader(), new Class[]{fullScreenListener}, (proxy, method, args) -> { ++ switch (method.getName()) { ++ case "windowEnteringFullScreen": ++ windowEnteringFullScreen = true; ++ break; ++ case "windowEnteredFullScreen": ++ windowEnteredFullScreen = true; ++ break; ++ } ++ return null; ++ }); ++ Method addFullScreenListener = fullScreenUtilities.getMethod("addFullScreenListenerTo", Window.class, fullScreenListener); ++ addFullScreenListener.invoke(fullScreenUtilities, window, listenerObject); ++ } catch (Exception e) { ++ throw new RuntimeException("FullScreen utilities not available", e); ++ } ++ } ++ ++ private static void sleep() { ++ try { ++ Thread.sleep(500); ++ } catch (InterruptedException ignored) { } ++ } ++} +--- ./jdk/test/java/awt/SplashScreen/GenerateTestImage.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/SplashScreen/GenerateTestImage.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,49 @@ ++/* ++* Copyright (c) 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. ++*/ ++ ++import javax.imageio.ImageIO; ++import java.awt.*; ++import java.awt.image.BufferedImage; ++import java.io.File; ++import java.io.FileOutputStream; ++ ++/** ++ * A utility to generate a test image for the SplashScreen test ++ */ ++public class GenerateTestImage { ++ private static final int IMAGE_SIZE = 20; ++ ++ public static void main(String[] args) throws Exception { ++ String path = System.getProperty("test.classes") + File.separator + "test.png"; ++ ++ BufferedImage image = new BufferedImage(IMAGE_SIZE, IMAGE_SIZE, BufferedImage.TYPE_INT_ARGB); ++ Graphics2D graphics2D = image.createGraphics(); ++ graphics2D.setColor(Color.red); ++ graphics2D.fillOval(0, 0, IMAGE_SIZE, IMAGE_SIZE); ++ graphics2D.dispose();; ++ ++ try(FileOutputStream fos = new FileOutputStream(path)) { ++ ImageIO.write(image, "png", fos); ++ } ++ } ++} +--- ./jdk/test/java/awt/TextArea/SelectionVisible/SelectionVisible.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/TextArea/SelectionVisible/SelectionVisible.java Wed Jul 30 18:42:59 2014 +0100 +@@ -31,32 +31,32 @@ + + public final class SelectionVisible extends Applet { + +- TextArea tf; ++ private TextArea ta; + + @Override + public void init() { +- tf = new TextArea(3, 20); +- tf.setText("0123456789"); +- tf.select(0, 6); ++ ta = new TextArea(4, 20); ++ ta.setText("01234\n56789"); ++ ta.select(3, 9); + +- final TextArea ta = new TextArea("INSTRUCTIONS:\n" +- + "The text 012345 should be selected in the TextArea.\n" ++ final TextArea instruction = new TextArea("INSTRUCTIONS:\n" ++ + "The text 34567 should be selected in the TextArea.\n" + + "If this is what you observe, then the test passes.\n" + + "Otherwise, the test fails.", 40, 5, + TextArea.SCROLLBARS_NONE); +- ta.setEditable(false); +- ta.setPreferredSize(new Dimension(300, 70)); ++ instruction.setEditable(false); ++ instruction.setPreferredSize(new Dimension(300, 70)); + final Panel panel = new Panel(); + panel.setLayout(new FlowLayout()); +- panel.add(tf); ++ panel.add(ta); + setLayout(new BorderLayout()); +- add(ta, BorderLayout.CENTER); ++ add(instruction, BorderLayout.CENTER); + add(panel, BorderLayout.PAGE_END); + } + + @Override + public void start() { + setVisible(true); +- tf.requestFocus(); ++ ta.requestFocus(); + } + } +--- ./jdk/test/java/awt/TextField/SelectionInvisibleTest/SelectionInvisibleTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/TextField/SelectionInvisibleTest/SelectionInvisibleTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,85 @@ ++/* ++ * 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.awt.FlowLayout; ++import java.awt.Frame; ++import java.awt.Panel; ++import java.awt.Point; ++import java.awt.Robot; ++import java.awt.TextField; ++import java.awt.Toolkit; ++import java.awt.event.InputEvent; ++import sun.awt.SunToolkit; ++ ++/** ++ * @test ++ * @bug 8036110 ++ * @author Alexander Scherbatiy ++ * @summary In TextField can only select text visible or to the left ++ * @run main SelectionInvisibleTest ++ */ ++ ++public class SelectionInvisibleTest { ++ ++ private static final String TEXT = "One Two Three Four Five Six Seven Eight Nine "; ++ private static final String LAST_WORD = "Ten"; ++ ++ public static void main(String[] args) throws Exception { ++ ++ Frame frame = new Frame(); ++ frame.setSize(300, 200); ++ TextField textField = new TextField(TEXT + LAST_WORD, 30); ++ Panel panel = new Panel(new FlowLayout()); ++ panel.add(textField); ++ frame.add(panel); ++ frame.setVisible(true); ++ ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ toolkit.realSync(); ++ ++ Robot robot = new Robot(); ++ robot.setAutoDelay(50); ++ ++ Point point = textField.getLocationOnScreen(); ++ int x = point.x + textField.getWidth() / 2; ++ int y = point.y + textField.getHeight() / 2; ++ robot.mouseMove(x, y); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ toolkit.realSync(); ++ ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ int N = 10; ++ int dx = textField.getWidth() / N; ++ for (int i = 0; i < N; i++) { ++ x += dx; ++ robot.mouseMove(x, y); ++ } ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ toolkit.realSync(); ++ ++ if (!textField.getSelectedText().endsWith(LAST_WORD)) { ++ throw new RuntimeException("Last word is not selected!"); ++ } ++ } ++} +--- ./jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -102,6 +102,14 @@ + TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}` + ;; + ++ AIX ) ++ VAR="A different value for AIX" ++ DEFAULT_JDK=/ ++ FILESEP="/" ++ PATHSEP=":" ++ TMP="/tmp" ++ ;; ++ + # catch all other OSs + * ) + echo "Unrecognized system! $OS" +--- ./jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -1,7 +1,7 @@ + #!/bin/ksh -p + + # +-# Copyright (c) 2012, 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 +@@ -25,7 +25,7 @@ + + # + # @test +-# @bug 6282388 ++# @bug 6282388 8030640 + # @summary Tests that AWT use correct toolkit to be wrapped into HeadlessToolkit + # @author artem.ananiev@sun.com: area=awt.headless + # @compile TestWrapped.java +@@ -59,30 +59,14 @@ + # Checking for proper OS + OS=`uname -s` + case "$OS" in +- SunOS ) +- VAR="One value for Sun" +- DEFAULT_JDK=/usr/local/java/jdk1.2/solaris ++ SunOS | Linux | Darwin | CYGWIN* ) + FILESEP="/" + ;; +- +- Linux ) +- VAR="A different value for Linux" +- DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386 +- FILESEP="/" +- ;; +- +- Windows* | CYGWIN* ) +- VAR="A different value for Win32" +- DEFAULT_JDK=/usr/local/java/jdk1.2/win32 ++ ++ Windows* ) + FILESEP="\\" + ;; + +- Darwin) +- VAR="Lets not forget about Mac" +- DEFAULT_JDK=$(/usr/libexec/java_home) +- FILESEP="/" +- ;; +- + # catch all other OSs + * ) + echo "Unrecognized system! $OS" +@@ -113,8 +97,7 @@ + # THIS IS THE JDK BEING TESTED. + if [ -n "$1" ] ; + then TESTJAVA=$1 +- else echo "no JDK specified on command line so using default!" +- TESTJAVA=$DEFAULT_JDK ++ else fail "no JDK specified on command line!" + fi + TESTSRC=. + TESTCLASSES=. +--- ./jdk/test/java/awt/TrayIcon/AddPopupAfterShowTest/AddPopupAfterShowTest.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/TrayIcon/AddPopupAfterShowTest/AddPopupAfterShowTest.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,45 @@ ++ ++ ++ ++ ++ ++ AddPopupAfterShowTest ++ ++ ++ ++

    AddPopupAfterShowTest
    Bug ID: 8007220

    ++ ++

    See the dialog box (usually in upper left corner) for instructions

    ++ ++ ++ ++ +--- ./jdk/test/java/awt/TrayIcon/AddPopupAfterShowTest/AddPopupAfterShowTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/TrayIcon/AddPopupAfterShowTest/AddPopupAfterShowTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,106 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++ ++import test.java.awt.regtesthelpers.Sysout; ++ ++import java.applet.Applet; ++import java.awt.*; ++import java.awt.image.BufferedImage; ++ ++public class AddPopupAfterShowTest extends Applet { ++ @Override ++ public void init() { ++ if (!SystemTray.isSupported()) { ++ Sysout.createDialogWithInstructions(new String[]{ ++ "Press PASS, the System Tray is not supported"}); ++ return; ++ } ++ ++ ++ String[] instructions = { ++ "1) The red circle icon was added to the system tray.", ++ "2) Check that a popup menu is opened when the icon is clicked.", ++ "3) If true the test is passed, otherwise failed."}; ++ Sysout.createDialogWithInstructions(instructions); ++ } ++ ++ @Override ++ public void start() { ++ setSize(200, 200); ++ show(); ++ ++ createSystemTrayIcon(); ++ } ++ ++ private static void createSystemTrayIcon() { ++ final TrayIcon trayIcon = new TrayIcon(createTrayIconImage()); ++ trayIcon.setImageAutoSize(true); ++ ++ try { ++ // Add tray icon to system tray *before* adding popup menu to demonstrate buggy behaviour ++ SystemTray.getSystemTray().add(trayIcon); ++ trayIcon.setPopupMenu(createTrayIconPopupMenu()); ++ } catch (final AWTException awte) { ++ awte.printStackTrace(); ++ } ++ } ++ ++ private static Image createTrayIconImage() { ++ /** ++ * Create a small image of a red circle to use as the icon for the tray icon ++ */ ++ int trayIconImageSize = 32; ++ final BufferedImage trayImage = new BufferedImage(trayIconImageSize, trayIconImageSize, BufferedImage.TYPE_INT_ARGB); ++ final Graphics2D trayImageGraphics = (Graphics2D) trayImage.getGraphics(); ++ ++ trayImageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); ++ ++ trayImageGraphics.setColor(new Color(255, 255, 255, 0)); ++ trayImageGraphics.fillRect(0, 0, trayImage.getWidth(), trayImage.getHeight()); ++ ++ trayImageGraphics.setColor(Color.red); ++ ++ int trayIconImageInset = 4; ++ trayImageGraphics.fillOval(trayIconImageInset, ++ trayIconImageInset, ++ trayImage.getWidth() - 2 * trayIconImageInset, ++ trayImage.getHeight() - 2 * trayIconImageInset); ++ ++ trayImageGraphics.setColor(Color.darkGray); ++ ++ trayImageGraphics.drawOval(trayIconImageInset, ++ trayIconImageInset, ++ trayImage.getWidth() - 2 * trayIconImageInset, ++ trayImage.getHeight() - 2 * trayIconImageInset); ++ ++ return trayImage; ++ } ++ ++ private static PopupMenu createTrayIconPopupMenu() { ++ final PopupMenu trayIconPopupMenu = new PopupMenu(); ++ final MenuItem popupMenuItem = new MenuItem("TEST PASSED!"); ++ trayIconPopupMenu.add(popupMenuItem); ++ return trayIconPopupMenu; ++ } ++} +--- ./jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,149 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ @test ++ @bug 8007220 ++ @summary Reference to the popup leaks after the TrayIcon is removed ++ @author Petr Pchelko ++ @run main/othervm -Xmx50m PopupMenuLeakTest ++ */ ++ ++import java.awt.*; ++import javax.swing.SwingUtilities; ++import sun.awt.SunToolkit; ++ ++import java.awt.image.BufferedImage; ++import java.lang.ref.WeakReference; ++import java.util.ArrayList; ++import java.util.concurrent.atomic.AtomicReference; ++ ++public class PopupMenuLeakTest { ++ ++ static final AtomicReference> iconWeakReference = new AtomicReference<>(); ++ static final AtomicReference> popupWeakReference = new AtomicReference<>(); ++ ++ public static void main(String[] args) throws Exception { ++ SwingUtilities.invokeAndWait(PopupMenuLeakTest::createSystemTrayIcon); ++ sleep(); ++ // To make the test automatic we explicitly call addNotify on a popup to create the peer ++ SwingUtilities.invokeAndWait(PopupMenuLeakTest::addNotifyPopup); ++ sleep(); ++ SwingUtilities.invokeAndWait(PopupMenuLeakTest::removeIcon); ++ sleep(); ++ assertCollected(popupWeakReference.get(), "Failed, reference to popup not collected"); ++ assertCollected(iconWeakReference.get(), "Failed, reference to tray icon not collected"); ++ } ++ ++ private static void addNotifyPopup() { ++ PopupMenu menu = popupWeakReference.get().get(); ++ if (menu == null) { ++ throw new RuntimeException("Failed: popup collected too early"); ++ } ++ menu.addNotify(); ++ } ++ ++ private static void removeIcon() { ++ TrayIcon icon = iconWeakReference.get().get(); ++ if (icon == null) { ++ throw new RuntimeException("Failed: TrayIcon collected too early"); ++ } ++ SystemTray.getSystemTray().remove(icon); ++ } ++ ++ private static void assertCollected(WeakReference reference, String message) { ++ java.util.List bytes = new ArrayList<>(); ++ for (int i = 0; i < 5; i ++) { ++ try { ++ while (true) { ++ bytes.add(new byte[1024]); ++ } ++ } catch (OutOfMemoryError err) { ++ bytes = new ArrayList<>(); ++ } ++ } ++ if (reference.get() != null) { ++ throw new RuntimeException(message); ++ } ++ } ++ ++ private static void createSystemTrayIcon() { ++ final TrayIcon trayIcon = new TrayIcon(createTrayIconImage()); ++ trayIcon.setImageAutoSize(true); ++ ++ try { ++ // Add tray icon to system tray *before* adding popup menu to demonstrate buggy behaviour ++ trayIcon.setPopupMenu(createTrayIconPopupMenu()); ++ SystemTray.getSystemTray().add(trayIcon); ++ iconWeakReference.set(new WeakReference<>(trayIcon)); ++ popupWeakReference.set(new WeakReference<>(trayIcon.getPopupMenu())); ++ } catch (final AWTException awte) { ++ awte.printStackTrace(); ++ } ++ } ++ ++ private static Image createTrayIconImage() { ++ /** ++ * Create a small image of a red circle to use as the icon for the tray icon ++ */ ++ int trayIconImageSize = 32; ++ final BufferedImage trayImage = new BufferedImage(trayIconImageSize, trayIconImageSize, BufferedImage.TYPE_INT_ARGB); ++ final Graphics2D trayImageGraphics = (Graphics2D) trayImage.getGraphics(); ++ ++ trayImageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); ++ ++ trayImageGraphics.setColor(new Color(255, 255, 255, 0)); ++ trayImageGraphics.fillRect(0, 0, trayImage.getWidth(), trayImage.getHeight()); ++ ++ trayImageGraphics.setColor(Color.red); ++ ++ int trayIconImageInset = 4; ++ trayImageGraphics.fillOval(trayIconImageInset, ++ trayIconImageInset, ++ trayImage.getWidth() - 2 * trayIconImageInset, ++ trayImage.getHeight() - 2 * trayIconImageInset); ++ ++ trayImageGraphics.setColor(Color.darkGray); ++ ++ trayImageGraphics.drawOval(trayIconImageInset, ++ trayIconImageInset, ++ trayImage.getWidth() - 2 * trayIconImageInset, ++ trayImage.getHeight() - 2 * trayIconImageInset); ++ ++ return trayImage; ++ } ++ ++ private static PopupMenu createTrayIconPopupMenu() { ++ final PopupMenu trayIconPopupMenu = new PopupMenu(); ++ final MenuItem popupMenuItem = new MenuItem("TEST!"); ++ trayIconPopupMenu.add(popupMenuItem); ++ return trayIconPopupMenu; ++ } ++ ++ private static void sleep() { ++ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); ++ try { ++ Thread.sleep(100); ++ } catch (InterruptedException ignored) { } ++ } ++} +--- ./jdk/test/java/awt/Window/AlwaysOnTop/TestAlwaysOnTopBeforeShow.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Window/AlwaysOnTop/TestAlwaysOnTopBeforeShow.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,472 @@ ++/* ++ * 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 6236247 ++@summary Test that setting of always-on-top flags before showing window works ++@author dom@sparc.spb.su: area=awt.toplevel ++@run main TestAlwaysOnTopBeforeShow ++*/ ++ ++/** ++ * TestAlwaysOnTopBeforeShow.java ++ * ++ * summary: Test that always-on-top works in the following situations: ++ * - when set on a window before showing ++ * - when set on a child dialog ++ * - that it doesn't generate focus event when set on an invisible window ++ */ ++ ++import java.awt.*; ++import java.awt.event.*; ++import java.util.concurrent.atomic.AtomicBoolean; ++import sun.awt.SunToolkit; ++ ++ ++//*** global search and replace TestAlwaysOnTopBeforeShow with name of the test *** ++ ++public class TestAlwaysOnTopBeforeShow ++{ ++ ++ //*** test-writer defined static variables go here *** ++ ++ private static AtomicBoolean focused = new AtomicBoolean(); ++ private static AtomicBoolean pressed = new AtomicBoolean(); ++ private static volatile Object pressedTarget; ++ private static void init() ++ { ++ //*** Create instructions for the user here *** ++ ++ Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { ++ public void eventDispatched(AWTEvent e) { ++ if (e.getID() == MouseEvent.MOUSE_PRESSED) { ++ synchronized(pressed) { ++ pressed.set(true); ++ pressedTarget = e.getSource(); ++ pressed.notifyAll(); ++ } ++ } ++ } ++ }, AWTEvent.MOUSE_EVENT_MASK); ++ ++ Frame f = new Frame("always-on-top"); ++ f.setBounds(0, 0, 200, 200); ++ f.addFocusListener(new FocusAdapter() { ++ public void focusGained(FocusEvent e) { ++ synchronized(focused) { ++ focused.set(true); ++ focused.notifyAll(); ++ } ++ } ++ }); ++ ++ f.setAlwaysOnTop(true); ++ ++ waitForIdle(1000); ++ if (focused.get()) { ++ throw new RuntimeException("Always-on-top generated focus event"); ++ } ++ ++ f.setVisible(true); ++ ++ waitFocused(f, focused); ++ focused.set(false); ++ ++ Frame f2 = new Frame("auxilary"); ++ f2.setBounds(100, 0, 200, 100); ++ f2.setVisible(true); ++ f2.toFront(); ++ waitForIdle(1000); ++ ++ Point location = f.getLocationOnScreen(); ++ Dimension size = f.getSize(); ++ checkOnTop(f, f2, location.x + size.width / 2, location.y + size.height / 2); ++ ++ Dialog d = new Dialog(f, "Always-on-top"); ++ d.pack(); ++ d.setBounds(0, 0, 100, 100); ++ ++ waitForIdle(1000); ++ checkOnTop(f, f2, location.x + size.width / 2, location.y + size.height / 2); ++ waitForIdle(1000); ++ ++ focused.set(false); ++ f.setVisible(false); ++ f.setAlwaysOnTop(false); ++ waitForIdle(1000); ++ if (focused.get()) { ++ throw new RuntimeException("Always-on-top generated focus event"); ++ } ++ ++ TestAlwaysOnTopBeforeShow.pass(); ++ ++ }//End init() ++ ++ private static void waitForIdle(int mls) { ++ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); ++ try { ++ Thread.sleep(mls); ++ } catch (InterruptedException e) { ++ e.printStackTrace(); ++ } ++ } ++ ++ static void waitFocused(Window w, AtomicBoolean b) { ++ try { ++ synchronized(b) { ++ if (w.isFocusOwner()) { ++ return; ++ } ++ b.wait(3000); ++ } ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ if (!w.isFocusOwner()) { ++ throw new RuntimeException("Can't make " + w + " focus owner"); ++ } ++ } ++ ++ static void checkOnTop(Window ontop, Window under, int x, int y) { ++ under.toFront(); ++ try { ++ Robot robot = new Robot(); ++ robot.mouseMove(x, y); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ synchronized(pressed) { ++ if (pressed.get()) { ++ if (pressedTarget != ontop) { ++ throw new RuntimeException("Pressed at wrong location: " + pressedTarget); ++ } ++ } else { ++ pressed.wait(5000); ++ } ++ } ++ if (!pressed.get() || pressedTarget != ontop) { ++ throw new RuntimeException("Pressed at wrong location: " + pressedTarget); ++ } ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++ ++ /***************************************************** ++ * Standard Test Machinery Section ++ * DO NOT modify anything in this section -- it's a ++ * standard chunk of code which has all of the ++ * synchronisation necessary for the test harness. ++ * By keeping it the same in all tests, it is easier ++ * to read and understand someone else's test, as ++ * well as insuring that all tests behave correctly ++ * with the test harness. ++ * There is a section following this for test- ++ * classes ++ ******************************************************/ ++ private static boolean theTestPassed = false; ++ private static boolean testGeneratedInterrupt = false; ++ private static String failureMessage = ""; ++ ++ private static Thread mainThread = null; ++ ++ private static int sleepTime = 300000; ++ ++ // Not sure about what happens if multiple of this test are ++ // instantiated in the same VM. Being static (and using ++ // static vars), it aint gonna work. Not worrying about ++ // it for now. ++ public static void main( String args[] ) throws InterruptedException ++ { ++ mainThread = Thread.currentThread(); ++ try ++ { ++ init(); ++ } ++ catch( TestPassedException e ) ++ { ++ //The test passed, so just return from main and harness will ++ // interepret this return as a pass ++ return; ++ } ++ //At this point, neither test pass nor test fail has been ++ // called -- either would have thrown an exception and ended the ++ // test, so we know we have multiple threads. ++ ++ //Test involves other threads, so sleep and wait for them to ++ // called pass() or fail() ++ try ++ { ++ Thread.sleep( sleepTime ); ++ //Timed out, so fail the test ++ throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); ++ } ++ catch (InterruptedException e) ++ { ++ //The test harness may have interrupted the test. If so, rethrow the exception ++ // so that the harness gets it and deals with it. ++ if( ! testGeneratedInterrupt ) throw e; ++ ++ //reset flag in case hit this code more than once for some reason (just safety) ++ testGeneratedInterrupt = false; ++ ++ if ( theTestPassed == false ) ++ { ++ throw new RuntimeException( failureMessage ); ++ } ++ } ++ ++ }//main ++ ++ public static synchronized void setTimeoutTo( int seconds ) ++ { ++ sleepTime = seconds * 1000; ++ } ++ ++ public static synchronized void pass() ++ { ++ Sysout.println( "The test passed." ); ++ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); ++ //first check if this is executing in main thread ++ if ( mainThread == Thread.currentThread() ) ++ { ++ //Still in the main thread, so set the flag just for kicks, ++ // and throw a test passed exception which will be caught ++ // and end the test. ++ theTestPassed = true; ++ throw new TestPassedException(); ++ } ++ theTestPassed = true; ++ testGeneratedInterrupt = true; ++ mainThread.interrupt(); ++ }//pass() ++ ++ public static synchronized void fail() ++ { ++ //test writer didn't specify why test failed, so give generic ++ fail( "it just plain failed! :-)" ); ++ } ++ ++ public static synchronized void fail( String whyFailed ) ++ { ++ Sysout.println( "The test failed: " + whyFailed ); ++ Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); ++ //check if this called from main thread ++ if ( mainThread == Thread.currentThread() ) ++ { ++ //If main thread, fail now 'cause not sleeping ++ throw new RuntimeException( whyFailed ); ++ } ++ theTestPassed = false; ++ testGeneratedInterrupt = true; ++ failureMessage = whyFailed; ++ mainThread.interrupt(); ++ }//fail() ++ ++}// class TestAlwaysOnTopBeforeShow ++ ++//This exception is used to exit from any level of call nesting ++// when it's determined that the test has passed, and immediately ++// end the test. ++class TestPassedException extends RuntimeException ++{ ++} ++ ++//*********** End Standard Test Machinery Section ********** ++ ++ ++//************ Begin classes defined for the test **************** ++ ++// if want to make listeners, here is the recommended place for them, then instantiate ++// them in init() ++ ++/* Example of a class which may be written as part of a test ++class NewClass implements anInterface ++ { ++ static int newVar = 0; ++ ++ public void eventDispatched(AWTEvent e) ++ { ++ //Counting events to see if we get enough ++ eventCount++; ++ ++ if( eventCount == 20 ) ++ { ++ //got enough events, so pass ++ ++ TestAlwaysOnTopBeforeShow.pass(); ++ } ++ else if( tries == 20 ) ++ { ++ //tried too many times without getting enough events so fail ++ ++ TestAlwaysOnTopBeforeShow.fail(); ++ } ++ ++ }// eventDispatched() ++ ++ }// NewClass class ++ ++*/ ++ ++ ++//************** End classes defined for the test ******************* ++ ++ ++ ++ ++/**************************************************** ++ Standard Test Machinery ++ DO NOT modify anything below -- it's a standard ++ chunk of code whose purpose is to make user ++ interaction uniform, and thereby make it simpler ++ to read and understand someone else's test. ++ ****************************************************/ ++ ++/** ++ This is part of the standard test machinery. ++ It creates a dialog (with the instructions), and is the interface ++ for sending text messages to the user. ++ To print the instructions, send an array of strings to Sysout.createDialog ++ WithInstructions method. Put one line of instructions per array entry. ++ To display a message for the tester to see, simply call Sysout.println ++ with the string to be displayed. ++ This mimics System.out.println but works within the test harness as well ++ as standalone. ++ */ ++ ++class Sysout ++{ ++ private static TestDialog dialog; ++ ++ public static void createDialogWithInstructions( String[] instructions ) ++ { ++ dialog = new TestDialog( new Frame(), "Instructions" ); ++ dialog.printInstructions( instructions ); ++ dialog.setVisible(true); ++ println( "Any messages for the tester will display here." ); ++ } ++ ++ public static void createDialog( ) ++ { ++ dialog = new TestDialog( new Frame(), "Instructions" ); ++ String[] defInstr = { "Instructions will appear here. ", "" } ; ++ dialog.printInstructions( defInstr ); ++ dialog.setVisible(true); ++ println( "Any messages for the tester will display here." ); ++ } ++ ++ ++ public static void printInstructions( String[] instructions ) ++ { ++ dialog.printInstructions( instructions ); ++ } ++ ++ ++ public static void println( String messageIn ) ++ { ++ System.out.println(messageIn); ++ } ++ ++}// Sysout class ++ ++/** ++ This is part of the standard test machinery. It provides a place for the ++ test instructions to be displayed, and a place for interactive messages ++ to the user to be displayed. ++ To have the test instructions displayed, see Sysout. ++ To have a message to the user be displayed, see Sysout. ++ Do not call anything in this dialog directly. ++ */ ++class TestDialog extends Dialog ++{ ++ ++ TextArea instructionsText; ++ TextArea messageText; ++ int maxStringLength = 80; ++ ++ //DO NOT call this directly, go through Sysout ++ public TestDialog( Frame frame, String name ) ++ { ++ super( frame, name ); ++ int scrollBoth = TextArea.SCROLLBARS_BOTH; ++ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); ++ add( "North", instructionsText ); ++ ++ messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); ++ add("Center", messageText); ++ ++ pack(); ++ ++ setVisible(true); ++ }// TestDialog() ++ ++ //DO NOT call this directly, go through Sysout ++ public void printInstructions( String[] instructions ) ++ { ++ //Clear out any current instructions ++ instructionsText.setText( "" ); ++ ++ //Go down array of instruction strings ++ ++ String printStr, remainingStr; ++ for( int i=0; i < instructions.length; i++ ) ++ { ++ //chop up each into pieces maxSringLength long ++ remainingStr = instructions[ i ]; ++ while( remainingStr.length() > 0 ) ++ { ++ //if longer than max then chop off first max chars to print ++ if( remainingStr.length() >= maxStringLength ) ++ { ++ //Try to chop on a word boundary ++ int posOfSpace = remainingStr. ++ lastIndexOf( ' ', maxStringLength - 1 ); ++ ++ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; ++ ++ printStr = remainingStr.substring( 0, posOfSpace + 1 ); ++ remainingStr = remainingStr.substring( posOfSpace + 1 ); ++ } ++ //else just print ++ else ++ { ++ printStr = remainingStr; ++ remainingStr = ""; ++ } ++ ++ instructionsText.append( printStr + "\n" ); ++ ++ }// while ++ ++ }// for ++ ++ }//printInstructions() ++ ++ //DO NOT call this directly, go through Sysout ++ public void displayMessage( String messageIn ) ++ { ++ messageText.append( messageIn + "\n" ); ++ System.out.println(messageIn); ++ } ++ ++}// TestDialog class +--- ./jdk/test/java/awt/Window/Grab/GrabTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/Window/Grab/GrabTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -38,7 +38,10 @@ + public class GrabTest { + private static Frame f; + private static Frame f1; ++ private static Frame frame; + private static Window w; ++ private static Window window1; ++ private static Window window2; + private static Button b; + + private static Robot robot; +@@ -96,6 +99,15 @@ + f.setVisible(true); + w.setVisible(true); + ++ frame = new Frame(); ++ window1 = new Window(frame); ++ window1.setBounds(0, 0, 100, 100); ++ window1.setBackground(Color.blue); ++ ++ window2 = new Window(window1); ++ window2.setBounds(0, 0, 50, 50); ++ window2.setBackground(Color.green); ++ + tk = (sun.awt.SunToolkit)Toolkit.getDefaultToolkit(); + + try { +@@ -194,6 +206,24 @@ + passed = false; + System.err.println("Failure: [7] Window disposal didn't cause ungrab"); + } ++ ungrabbed = false; ++ ++ ++ // 8. Check that mouse click on subwindow does not cause ungrab ++ frame.setVisible(true); ++ window1.setVisible(true); ++ window2.setVisible(true); ++ Util.waitForIdle(robot); ++ ++ tk.grab(window1); ++ ++ Util.clickOnComp(window2, robot); ++ Util.waitForIdle(robot); ++ ++ if (ungrabbed) { ++ passed = false; ++ System.err.println("Failure: [8] Press on the subwindow caused ungrab"); ++ } + + if (passed) { + System.out.println("Test passed."); +--- ./jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -135,6 +135,14 @@ + TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}` + ;; + ++ AIX ) ++ VAR="A different value for AIX" ++ DEFAULT_JDK=/ ++ FILESEP="/" ++ PATHSEP=":" ++ TMP="/tmp" ++ ;; ++ + # catch all other OSs + * ) + echo "Unrecognized system! $OS" +--- ./jdk/test/java/awt/datatransfer/DataFlavor/EqualsHashCodeSymmetryTest/EqualsHashCodeSymmetryTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/datatransfer/DataFlavor/EqualsHashCodeSymmetryTest/EqualsHashCodeSymmetryTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,88 @@ ++/* ++ * 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.awt.datatransfer.DataFlavor; ++ ++/** ++ * @test ++ * @bug 8038999 ++ * @summary DataFlavor.equals is not symmetric ++ * @author Petr Pchelko ++ */ ++public class EqualsHashCodeSymmetryTest { ++ ++ private static final DataFlavor[] dataFlavors = { ++ DataFlavor.stringFlavor, ++ DataFlavor.imageFlavor, ++ DataFlavor.javaFileListFlavor, ++ DataFlavor.allHtmlFlavor, ++ DataFlavor.selectionHtmlFlavor, ++ DataFlavor.fragmentHtmlFlavor, ++ createFlavor("text/html; class=java.lang.String"), ++ new DataFlavor(String.class, "My test flavor number 1"), ++ new DataFlavor(String.class, "My test flavor number 2"), ++ new DataFlavor(StringBuilder.class, "My test flavor number 1") ++ }; ++ ++ public static void main(String[] args) { ++ testEqualsSymmetry(); ++ testEqualsHashCodeConsistency(); ++ testSimpleCollision(); ++ } ++ ++ private static void testEqualsSymmetry() { ++ for (DataFlavor flavor1 : dataFlavors) { ++ for (DataFlavor flavor2 : dataFlavors) { ++ if (flavor1.equals(flavor2) != flavor2.equals(flavor1)) { ++ throw new RuntimeException( ++ String.format("Equals is not symmetric for %s and %s", flavor1, flavor2)); ++ } ++ } ++ } ++ } ++ ++ private static void testEqualsHashCodeConsistency() { ++ for (DataFlavor flavor1 : dataFlavors) { ++ for (DataFlavor flavor2 : dataFlavors) { ++ if ((flavor1.equals(flavor2) && flavor1.hashCode() != flavor2.hashCode())) { ++ throw new RuntimeException( ++ String.format("Equals and hash code not consistent for %s and %s", flavor1, flavor2)); ++ } ++ } ++ } ++ } ++ ++ private static void testSimpleCollision() { ++ if (createFlavor("text/html; class=java.lang.String").hashCode() == DataFlavor.allHtmlFlavor.hashCode()) { ++ throw new RuntimeException("HashCode collision because the document parameter is not used"); ++ } ++ } ++ ++ private static DataFlavor createFlavor(String mime) { ++ try { ++ return new DataFlavor(mime); ++ } catch (ClassNotFoundException e) { ++ throw new RuntimeException(e); ++ } ++ } ++} +--- ./jdk/test/java/awt/dnd/AcceptDropMultipleTimes/AcceptDropMultipleTimes.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/AcceptDropMultipleTimes/AcceptDropMultipleTimes.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,103 @@ ++/* ++ * 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 8029979 ++ * @summary Checks if acceptDrop() can be called several times ++ * @library ../../regtesthelpers ++ * @build Util ++ * @compile AcceptDropMultipleTimes.java ++ * @run main/othervm AcceptDropMultipleTimes ++ * @author anthony.petrov@oracle.com ++ */ ++ ++import test.java.awt.regtesthelpers.Util; ++ ++import javax.swing.*; ++import java.awt.*; ++import java.awt.datatransfer.*; ++import java.awt.dnd.*; ++import java.awt.event.InputEvent; ++ ++public class AcceptDropMultipleTimes { ++ ++ private static final int FRAME_SIZE = 100; ++ private static final int FRAME_LOCATION = 100; ++ ++ private static volatile Frame f; ++ ++ private static void initAndShowUI() { ++ f = new Frame("Test frame"); ++ f.setBounds(FRAME_LOCATION, FRAME_LOCATION, FRAME_SIZE, FRAME_SIZE); ++ ++ final DraggablePanel dragSource = new DraggablePanel(); ++ dragSource.setBackground(Color.yellow); ++ DropTarget dt = new DropTarget(dragSource, new DropTargetAdapter() { ++ @Override public void drop(DropTargetDropEvent dtde) { ++ // The first call always succeeds ++ dtde.acceptDrop(DnDConstants.ACTION_COPY); ++ ++ // The second call should succeed if the fix works ++ dtde.acceptDrop(DnDConstants.ACTION_MOVE); ++ ++ dtde.dropComplete(true); ++ } ++ }); ++ dragSource.setDropTarget(dt); ++ f.add(dragSource); ++ ++ f.setVisible(true); ++ } ++ ++ public static void main(String[] args) throws Throwable { ++ try { ++ ++ SwingUtilities.invokeAndWait(() -> initAndShowUI()); ++ ++ Robot r = new Robot(); ++ Util.waitForIdle(r); ++ Util.drag(r, ++ new Point(FRAME_LOCATION + FRAME_SIZE / 3, FRAME_LOCATION + FRAME_SIZE / 3), ++ new Point(FRAME_LOCATION + FRAME_SIZE / 3 * 2, FRAME_LOCATION + FRAME_SIZE / 3 * 2), ++ InputEvent.BUTTON1_MASK); ++ Util.waitForIdle(r); ++ } finally { ++ if (f != null) { ++ f.dispose(); ++ } ++ } ++ } ++ ++ private static class DraggablePanel extends Panel implements DragGestureListener { ++ ++ public DraggablePanel() { ++ (new DragSource()).createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY, this); ++ } ++ ++ @Override ++ public void dragGestureRecognized(DragGestureEvent dge) { ++ dge.startDrag(Cursor.getDefaultCursor(), new StringSelection("test")); ++ } ++ } ++} +--- ./jdk/test/java/awt/dnd/BadSerializaionTest/BadSerializationTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/BadSerializaionTest/BadSerializationTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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. ++ */ ++ ++/** ++ * @test ++ * @bug 8030050 ++ * @summary Validate fields on DnD class deserialization ++ * @author petr.pchelko@oracle.com ++ */ ++ ++import java.io.File; ++import java.io.FileInputStream; ++import java.io.IOException; ++import java.io.InvalidObjectException; ++import java.io.ObjectInputStream; ++import java.util.stream.Stream; ++ ++public class BadSerializationTest { ++ ++ private static final String[] badSerialized = new String[] { ++ "badAction", ++ "noEvents", ++ "nullComponent", ++ "nullDragSource", ++ "nullOrigin" ++ }; ++ ++ private static final String goodSerialized = "good"; ++ ++ public static void main(String[] args) throws Exception { ++ String testSrc = System.getProperty("test.src") + File.separator; ++ testReadObject(testSrc + goodSerialized, false); ++ Stream.of(badSerialized).forEach(file -> testReadObject(testSrc + file, true)); ++ } ++ ++ private static void testReadObject(String filename, boolean expectException) { ++ Exception exceptionCaught = null; ++ try (FileInputStream fileInputStream = new FileInputStream(filename); ++ ObjectInputStream ois = new ObjectInputStream(fileInputStream)) { ++ ois.readObject(); ++ } catch (InvalidObjectException e) { ++ exceptionCaught = e; ++ } catch (IOException e) { ++ throw new RuntimeException("FAILED: IOException", e); ++ } catch (ClassNotFoundException e) { ++ throw new RuntimeException("FAILED: ClassNotFoundException", e); ++ } ++ if (exceptionCaught != null && !expectException) { ++ throw new RuntimeException("FAILED: UnexpectedException", exceptionCaught); ++ } ++ if (exceptionCaught == null && expectException) { ++ throw new RuntimeException("FAILED: Invalid object was created with no exception"); ++ } ++ } ++} +Binary file test/java/awt/dnd/BadSerializaionTest/badAction has changed +Binary file test/java/awt/dnd/BadSerializaionTest/good has changed +Binary file test/java/awt/dnd/BadSerializaionTest/noEvents has changed +Binary file test/java/awt/dnd/BadSerializaionTest/nullComponent has changed +Binary file test/java/awt/dnd/BadSerializaionTest/nullDragSource has changed +Binary file test/java/awt/dnd/BadSerializaionTest/nullOrigin has changed +--- ./jdk/test/java/awt/dnd/Button2DragTest/Button2DragTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/dnd/Button2DragTest/Button2DragTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 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 +@@ -112,6 +112,7 @@ + Util.drag(robot, startPoint, endPoint, InputEvent.BUTTON2_MASK); + + Util.waitForIdle(robot); ++ robot.delay(500); + + if (dropSuccess) { + System.err.println("test passed"); +--- ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/DragInterceptorAppletTest.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/DragInterceptorAppletTest.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,48 @@ ++ ++ ++ ++ ++ ++ Unsigned applet can retrieve the dragged information before drop action occurs ++ ++ ++ ++

    DragInterceptorAppletTest
    Bug ID: 6887703

    ++ ++

    This is an AUTOMATIC test, simply wait for completion

    ++ ++ ++ ++ +--- ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/DragInterceptorAppletTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/DragInterceptorAppletTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,154 @@ ++/* ++ * Copyright (c) 2007, 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 6887703 ++ @summary Unsigned applet can retrieve the dragged information before drop action occurs ++ @author : area=dnd ++ @run applet DragInterceptorAppletTest.html ++*/ ++ ++/** ++ * DragInterceptorAppletTest.java ++ * ++ * summary: Unsigned applet can retrieve the dragged information before drop action occurs ++ */ ++ ++import static java.lang.Thread.sleep; ++ ++import test.java.awt.regtesthelpers.process.ProcessCommunicator; ++import test.java.awt.regtesthelpers.process.ProcessResults; ++import test.java.awt.regtesthelpers.Util; ++import java.applet.Applet; ++import java.awt.*; ++import java.awt.event.InputEvent; ++ ++public class DragInterceptorAppletTest extends Applet { ++ ++ public void init() { ++ setLayout(new BorderLayout()); ++ }//End init() ++ ++ public void start() { ++ ++ SourceFrame sourceFrame = new SourceFrame(); ++ ++ Util.waitForIdle(null); ++ ++ String [] args = new String [] { ++ String.valueOf(sourceFrame.getNextLocationX()), ++ String.valueOf(sourceFrame.getNextLocationY()), ++ String.valueOf(sourceFrame.getDragSourcePointX()), ++ String.valueOf(sourceFrame.getDragSourcePointY()), ++ }; ++ String classpath = System.getProperty("java.class.path"); ++ ProcessResults processResults = ++ ProcessCommunicator.executeChildProcess(this.getClass(),classpath,args); ++ ++ verifyTestResults(processResults); ++ ++ }// start() ++ ++ private static void verifyTestResults(ProcessResults processResults) { ++ ++ switch (processResults.getExitValue()) { ++ case InterprocessMessages.DATA_WAS_INTERCEPTED_AND_EXCEPTION_HANDLER_WAS_NOT_TRIGGERED: ++ processResults.printProcessErrorOutput(System.err); ++ throw new RuntimeException("TEST IS FAILED: Target applet can intercept data " + ++ "without a clipboard permission and an exception handler was not triggered."); ++ //Unreachable... ++ ++ case InterprocessMessages.DATA_WAS_INTERCEPTED: ++ processResults.printProcessErrorOutput(System.err); ++ throw new RuntimeException("TEST IS FAILED: Target applet can intercept data " + ++ "without a clipboard permission"); ++ //Unreachable... ++ ++ case InterprocessMessages.EXCEPTION_HANDLER_WAS_NOT_TRIGGERED: ++ processResults.printProcessErrorOutput(System.err); ++ throw new RuntimeException("TEST IS FAILED: An exception handler was not triggered."); ++ //Unreachable... ++ ++ } ++ ++ // The child process throws an exception. do not look at the stderr. ++ processResults.verifyStdErr(System.err); ++ processResults.verifyProcessExitValue(System.err); ++ processResults.printProcessStandartOutput(System.out); ++ } ++ ++ //We cannot make an instance of the applet without the default constructor ++ public DragInterceptorAppletTest() { ++ super(); ++ } ++ ++ //We need in this constructor to pass frame position between JVMs ++ public DragInterceptorAppletTest(Point targetFrameLocation, Point dragSourcePoint) ++ throws InterruptedException ++ { ++ DragInterceptorFrame targetFrame = new DragInterceptorFrame(targetFrameLocation); ++ ++ Util.waitForIdle(null); ++ ++ final Robot robot = Util.createRobot(); ++ ++ robot.mouseMove((int)dragSourcePoint.getX(),(int)dragSourcePoint.getY()); ++ sleep(100); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ sleep(100); ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ sleep(100); ++ ++ Util.drag(robot, dragSourcePoint, targetFrame.getDropTargetPoint(), ++ InputEvent.BUTTON1_MASK); ++ ++ sleep(2000); ++ ProcessCommunicator.destroyProcess(); ++ } ++ ++ enum InterprocessArguments { ++ TARGET_FRAME_X_POSITION_ARGUMENT, ++ TARGET_FRAME_Y_POSITION_ARGUMENT, ++ DRAG_SOURCE_POINT_X_ARGUMENT, ++ DRAG_SOURCE_POINT_Y_ARGUMENT; ++ ++ int extract (String [] args) { ++ return Integer.parseInt(args[this.ordinal()]); ++ } ++ } ++ ++ public static void main (String [] args) { ++ Point dragSourcePoint = new Point(InterprocessArguments.DRAG_SOURCE_POINT_X_ARGUMENT.extract(args), ++ InterprocessArguments.DRAG_SOURCE_POINT_Y_ARGUMENT.extract(args)); ++ Point targetFrameLocation = new Point(InterprocessArguments.TARGET_FRAME_X_POSITION_ARGUMENT.extract(args), ++ InterprocessArguments.TARGET_FRAME_Y_POSITION_ARGUMENT.extract(args)); ++ try { ++ new DragInterceptorAppletTest(targetFrameLocation, dragSourcePoint); ++ } catch (InterruptedException e) { ++ e.printStackTrace(); ++ throw new RuntimeException(e); ++ } ++ } ++ ++}// class DragInterceptorAppletTest +--- ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/DragInterceptorFrame.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/DragInterceptorFrame.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,128 @@ ++/* ++ * Copyright (c) 2007, 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.awt.*; ++import java.awt.datatransfer.DataFlavor; ++import java.awt.datatransfer.UnsupportedFlavorException; ++import java.awt.event.WindowAdapter; ++import java.awt.event.WindowEvent; ++import java.awt.dnd.*; ++import java.io.IOException; ++import java.security.Permission; ++import java.security.AccessControlException; ++ ++class DragInterceptorFrame extends Frame implements DropTargetListener { ++ ++ private static int exitMessage = InterprocessMessages.TEST_PASSED; ++ private static boolean dataIsAccessible = false; ++ private static boolean exceptionHasBeenThrown = false; ++ ++ DragInterceptorFrame(Point location) { ++ System.setSecurityManager(new ClipboardDefender()); ++ initGUI(location); ++ setDropTarget(new DropTarget(this, DnDConstants.ACTION_COPY, ++ this)); ++ } ++ ++ private void initGUI(Point location) { ++ this.setLocation(location); ++ this.addWindowListener(new WindowAdapter() { ++ public void windowClosing(WindowEvent e) { ++ DragInterceptorFrame.this.dispose(); ++ } ++ }); ++ setSize (200, 200); ++ this.setVisible(true); ++ } ++ ++ public void dragEnter(DropTargetDragEvent dtde) { ++ // We want to set the exception handler on EDT ++ Thread.currentThread().setUncaughtExceptionHandler ( ++ new Thread.UncaughtExceptionHandler() { ++ public void uncaughtException(Thread t, Throwable e) { ++ exceptionHasBeenThrown = true; ++ } ++ } ++ ); ++ examineTransferable(dtde); ++ } ++ ++ public void dragOver(DropTargetDragEvent dtde) { ++ examineTransferable(dtde); ++ } ++ ++ public void dropActionChanged(DropTargetDragEvent dtde) { ++ examineTransferable(dtde); ++ } ++ ++ public void dragExit(DropTargetEvent dte) {} ++ ++ public void drop(DropTargetDropEvent dtde) { ++ ++ if (dataIsAccessible && !exceptionHasBeenThrown) { ++ exitMessage = InterprocessMessages.DATA_WAS_INTERCEPTED_AND_EXCEPTION_HANDLER_WAS_NOT_TRIGGERED; ++ } else if (dataIsAccessible) { ++ exitMessage = InterprocessMessages.DATA_WAS_INTERCEPTED; ++ } else if (!exceptionHasBeenThrown) { ++ exitMessage = InterprocessMessages.EXCEPTION_HANDLER_WAS_NOT_TRIGGERED; ++ } ++ ++ // This returns the diagnostic code from the child VM ++ System.exit(exitMessage); ++ } ++ ++ Point getDropTargetPoint() { ++ return new Point((int)getLocationOnScreen().getX()+(getWidth()/2), ++ (int)getLocationOnScreen().getY()+(getHeight()/2)); ++ } ++ ++ private void examineTransferable(DropTargetDragEvent dtde) { ++ if (dtde.getCurrentDataFlavorsAsList().contains(DataFlavor.stringFlavor)) { ++ dtde.acceptDrag(DnDConstants.ACTION_COPY); ++ try{ ++ if (null != dtde.getTransferable().getTransferData(DataFlavor.stringFlavor)) { ++ dataIsAccessible = true; ++ } ++ } catch (IOException e) { ++ e.printStackTrace(); ++ exitMessage = InterprocessMessages.UNEXPECTED_IO_EXCEPTION; ++ } catch (UnsupportedFlavorException e) { ++ e.printStackTrace(); ++ exitMessage = InterprocessMessages.UNEXPECTED_UNSUPPORTED_FLAVOR_EXCEPTION; ++ } ++ } ++ } ++ ++ static class ClipboardDefender extends SecurityManager { ++ public void checkPermission(Permission p) { ++ if (p instanceof java.awt.AWTPermission && ++ p.getName().equals("accessClipboard")) { ++ throw new AccessControlException("access denied "); ++ } ++ } ++ } ++ ++ public static void main(String[] args) { ++ new DragInterceptorFrame(new Point(200,200)); ++ } ++} +--- ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/InterprocessMessages.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/InterprocessMessages.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,32 @@ ++/* ++ * Copyright (c) 2007, 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. ++ */ ++ ++public interface InterprocessMessages { ++ final static int TEST_PASSED = 0; ++ final static int DATA_WAS_INTERCEPTED = 212; ++ final static int EXCEPTION_HANDLER_WAS_NOT_TRIGGERED = 213; ++ final static int DATA_WAS_INTERCEPTED_AND_EXCEPTION_HANDLER_WAS_NOT_TRIGGERED = 214; ++ ++ final static int UNEXPECTED_IO_EXCEPTION = 400; ++ final static int UNEXPECTED_UNSUPPORTED_FLAVOR_EXCEPTION = 401; ++} +--- ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/SourceFrame.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/DragInterceptorAppletTest/SourceFrame.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,68 @@ ++/* ++ * Copyright (c) 2007, 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 test.java.awt.regtesthelpers.Util; ++ ++import java.awt.*; ++import java.awt.datatransfer.StringSelection; ++import java.awt.dnd.DragGestureListener; ++import java.awt.dnd.DragSource; ++import java.awt.dnd.DnDConstants; ++import java.awt.dnd.DragGestureEvent; ++ ++class SourceFrame extends Frame implements DragGestureListener { ++ ++ SourceFrame() { ++ super("Source File List Frame"); ++ initGUI(); ++ new DragSource().createDefaultDragGestureRecognizer(this, ++ DnDConstants.ACTION_COPY,this); ++ } ++ ++ private void initGUI() { ++ this.addWindowListener(Util.getClosingWindowAdapter()); ++ this.setLocation(300,250); ++ this.setSize(200,200); ++ this.setVisible(true); ++ } ++ ++ int getNextLocationX() { ++ return getX()+getWidth(); ++ } ++ ++ int getNextLocationY() { ++ return getY(); ++ } ++ ++ int getDragSourcePointX() { ++ return (int)getLocationOnScreen().getX()+(getWidth()/2); ++ } ++ ++ int getDragSourcePointY() { ++ return (int)getLocationOnScreen().getY()+ (getHeight()/2); ++ } ++ ++ public void dragGestureRecognized(DragGestureEvent dge) { ++ dge.startDrag(null, new StringSelection("A TEXT")); ++ } ++} +--- ./jdk/test/java/awt/dnd/DragSourceListenerSerializationTest/DragSourceListenerSerializationTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/DragSourceListenerSerializationTest/DragSourceListenerSerializationTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,157 @@ ++/* ++ * 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 4422345 8039083 ++ @summary tests serialization of DragSourceListeners ++ @author das@sparc.spb.su area=dnd ++ @library ../../../../lib/testlibrary ++ @build jdk.testlibrary.Asserts ++ @run main/othervm DragSourceListenerSerializationTest ++*/ ++ ++import java.awt.Button; ++import java.awt.Component; ++import java.awt.Cursor; ++import java.awt.Point; ++import java.awt.Toolkit; ++import java.awt.datatransfer.StringSelection; ++import java.awt.dnd.DnDConstants; ++import java.awt.dnd.DragGestureEvent; ++import java.awt.dnd.DragGestureRecognizer; ++import java.awt.dnd.DragSource; ++import java.awt.dnd.DragSourceAdapter; ++import java.awt.dnd.DragSourceContext; ++import java.awt.dnd.DragSourceListener; ++import java.awt.dnd.DragSourceMotionListener; ++import java.awt.event.InputEvent; ++import java.awt.event.MouseEvent; ++import java.io.ByteArrayInputStream; ++import java.io.ByteArrayOutputStream; ++import java.io.ObjectInputStream; ++import java.io.ObjectOutputStream; ++import java.io.Serializable; ++import java.util.Arrays; ++import java.util.TooManyListenersException; ++import java.util.stream.Collectors; ++import java.util.stream.Stream; ++ ++import static jdk.testlibrary.Asserts.assertEquals; ++ ++public class DragSourceListenerSerializationTest { ++ public static void main(String[] args) throws Exception { ++ DragSource ds = new DragSource(); ++ TestDragSourceAdapter dsa1 = new TestDragSourceAdapter(1); ++ TestDragSourceAdapter dsa2 = new TestDragSourceAdapter(2); ++ Component c = new Button(); ++ DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer(c, ++ DnDConstants.ACTION_COPY, ++ e -> e.startDrag(null, null)); ++ MouseEvent me = new MouseEvent(c, MouseEvent.MOUSE_PRESSED, 0, ++ InputEvent.CTRL_MASK, 100, 100, 0, false); ++ DragGestureEvent dge = new DragGestureEvent(dgr, DnDConstants.ACTION_COPY, ++ new Point(100, 100), ++ Arrays.asList(me)); ++ DragSourceContext dsc = new DragSourceContext( ++ Toolkit.getDefaultToolkit().createDragSourceContextPeer(dge), ++ dge, ++ new Cursor(Cursor.HAND_CURSOR), ++ null, null, new StringSelection("TEXT"), null); ++ ++ ds.addDragSourceListener(dsa1); ++ ds.addDragSourceListener(dsa2); ++ ds.addDragSourceListener(dsa2); ++ ds.addDragSourceMotionListener(dsa1); ++ ds.addDragSourceMotionListener(dsa1); ++ ds.addDragSourceMotionListener(dsa2); ++ dsc.addDragSourceListener(dsa2); ++ ++ byte[] serialized; ++ try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ++ ObjectOutputStream oos = new ObjectOutputStream(bos)) { ++ oos.writeObject(dsc); ++ serialized = bos.toByteArray(); ++ } ++ ++ DragSourceContext dsc_copy; ++ try (ByteArrayInputStream bis = new ByteArrayInputStream(serialized); ++ ObjectInputStream ois = new ObjectInputStream(bis)) { ++ dsc_copy = (DragSourceContext) ois.readObject(); ++ } ++ ++ try { ++ dsc_copy.addDragSourceListener(dsa1); ++ throw new RuntimeException("Test failed. Listener addition succeeded"); ++ } catch (TooManyListenersException ignored) { ++ } ++ ++ try { ++ dsc_copy.addDragSourceListener(dsa2); ++ throw new RuntimeException("Test failed. Listener addition succeeded"); ++ } catch (TooManyListenersException ignored) { ++ } ++ ++ try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ++ ObjectOutputStream oos = new ObjectOutputStream(bos)) { ++ oos.writeObject(ds); ++ serialized = bos.toByteArray(); ++ } ++ ++ DragSource ds_copy; ++ try (ByteArrayInputStream bis = new ByteArrayInputStream(serialized); ++ ObjectInputStream ois = new ObjectInputStream(bis)) { ++ ds_copy = (DragSource) ois.readObject(); ++ } ++ ++ DragSourceListener[] dsls = ds_copy.getDragSourceListeners(); ++ assertEquals(3, dsls.length, "DragSourceListeners number"); ++ assertEquals(1, Stream.of(dsls).filter(dsa1::equals).collect(Collectors.counting()).intValue()); ++ assertEquals(2, Stream.of(dsls).filter(dsa2::equals).collect(Collectors.counting()).intValue()); ++ ++ DragSourceMotionListener[] dsmls = ds_copy.getDragSourceMotionListeners(); ++ assertEquals(3, dsmls.length, "DragSourceMotionListeners number"); ++ assertEquals(2, Stream.of(dsmls).filter(dsa1::equals).collect(Collectors.counting()).intValue()); ++ assertEquals(1, Stream.of(dsmls).filter(dsa2::equals).collect(Collectors.counting()).intValue()); ++ } ++} ++ ++class TestDragSourceAdapter extends DragSourceAdapter implements Serializable { ++ final int id; ++ ++ TestDragSourceAdapter(int id) { ++ this.id = id; ++ } ++ ++ public int getId() { ++ return id; ++ } ++ ++ public boolean equals(Object obj) { ++ if (obj instanceof TestDragSourceAdapter) { ++ TestDragSourceAdapter tdsa = (TestDragSourceAdapter) obj; ++ return tdsa.getId() == getId(); ++ } ++ return false; ++ } ++} +--- ./jdk/test/java/awt/dnd/InterJVMGetDropSuccessTest/InterJVMGetDropSuccessTest.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/InterJVMGetDropSuccessTest/InterJVMGetDropSuccessTest.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,43 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

    InterJVMGetDropSuccessTest
    Bug ID: 4658741

    ++ ++

    This is an AUTOMATIC test, simply wait for completion

    ++ ++ ++ ++ +--- ./jdk/test/java/awt/dnd/InterJVMGetDropSuccessTest/InterJVMGetDropSuccessTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/InterJVMGetDropSuccessTest/InterJVMGetDropSuccessTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,499 @@ ++/* ++ * 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 4658741 ++ @summary verifies that getDropSuccess() returns correct value for inter-JVM DnD ++ @author das@sparc.spb.su area=dnd ++ @run applet InterJVMGetDropSuccessTest.html ++*/ ++ ++// Note there is no @ in front of test above. This is so that the ++// harness will not mistake this file as a test file. It should ++// only see the html file as a test file. (the harness runs all ++// valid test files, so it would run this test twice if this file ++// were valid as well as the html file.) ++// Also, note the area= after Your Name in the author tag. Here, you ++// should put which functional area the test falls in. See the ++// AWT-core home page -> test areas and/or -> AWT team for a list of ++// areas. ++// Note also the 'InterJVMGetDropSuccessTest.html' in the run tag. This should ++// be changed to the name of the test. ++ ++ ++/** ++ * InterJVMGetDropSuccessTest.java ++ * ++ * summary: verifies that getDropSuccess() returns correct value for inter-JVM DnD ++ */ ++ ++import java.applet.Applet; ++import java.awt.*; ++import java.awt.datatransfer.*; ++import java.awt.dnd.*; ++import java.awt.event.*; ++import java.io.*; ++import javax.swing.*; ++ ++ ++//Automated tests should run as applet tests if possible because they ++// get their environments cleaned up, including AWT threads, any ++// test created threads, and any system resources used by the test ++// such as file descriptors. (This is normally not a problem as ++// main tests usually run in a separate VM, however on some platforms ++// such as the Mac, separate VMs are not possible and non-applet ++// tests will cause problems). Also, you don't have to worry about ++// synchronisation stuff in Applet tests they way you do in main ++// tests... ++ ++ ++public class InterJVMGetDropSuccessTest extends Applet { ++ ++ private int returnCode = Util.CODE_NOT_RETURNED; ++ private boolean successCodes[] = { true, false }; ++ private int dropCount = 0; ++ ++ final Frame frame = new Frame("Target Frame"); ++ ++ final DropTargetListener dropTargetListener = new DropTargetAdapter() { ++ public void drop(DropTargetDropEvent dtde) { ++ dtde.acceptDrop(DnDConstants.ACTION_COPY); ++ dtde.dropComplete(successCodes[dropCount]); ++ dropCount++; ++ } ++ }; ++ final DropTarget dropTarget = new DropTarget(frame, dropTargetListener); ++ ++ public void init() { ++ //Create instructions for the user here, as well as set up ++ // the environment -- set the layout manager, add buttons, ++ // etc. ++ ++ String[] instructions = ++ { ++ "This is an AUTOMATIC test", ++ "simply wait until it is done" ++ }; ++ Sysout.createDialog( ); ++ Sysout.printInstructions( instructions ); ++ ++ frame.setTitle("Test frame"); ++ frame.setBounds(100, 100, 150, 150); ++ } // init() ++ ++ public void start() { ++ ++ frame.setVisible(true); ++ ++ try { ++ Thread.sleep(Util.FRAME_ACTIVATION_TIMEOUT); ++ ++ Point p = frame.getLocationOnScreen(); ++ Dimension d = frame.getSize(); ++ ++ String javaPath = System.getProperty("java.home", ""); ++ String command = javaPath + File.separator + "bin" + ++ File.separator + "java -cp " + System.getProperty("test.classes", ".") + ++ " Child " + ++ p.x + " " + p.y + " " + d.width + " " + d.height; ++ ++ Process process = Runtime.getRuntime().exec(command); ++ returnCode = process.waitFor(); ++ ++ InputStream errorStream = process.getErrorStream(); ++ int count = errorStream.available(); ++ if (count > 0) { ++ byte[] b = new byte[count]; ++ errorStream.read(b); ++ System.err.println("========= Child VM System.err ========"); ++ System.err.print(new String(b)); ++ System.err.println("======================================"); ++ } ++ ++ InputStream outputStream = process.getInputStream(); ++ count = outputStream.available(); ++ if (count > 0) { ++ byte[] b = new byte[count]; ++ outputStream.read(b); ++ System.err.println("========= Child VM System.out ========"); ++ System.err.print(new String(b)); ++ System.err.println("======================================"); ++ } ++ } catch (Throwable e) { ++ e.printStackTrace(); ++ throw new RuntimeException(e); ++ } ++ switch (returnCode) { ++ case Util.CODE_NOT_RETURNED: ++ throw new RuntimeException("Child VM: failed to start"); ++ case Util.CODE_FAILURE: ++ throw new RuntimeException("Child VM: abnormal termination"); ++ default: ++ if (dropCount == 2) { ++ int expectedRetCode = 0; ++ if (successCodes[0]) { ++ expectedRetCode |= Util.CODE_FIRST_SUCCESS; ++ } ++ if (successCodes[1]) { ++ expectedRetCode |= Util.CODE_SECOND_SUCCESS; ++ } ++ if (expectedRetCode != returnCode) { ++ throw new RuntimeException("The test failed. Expected:" + ++ expectedRetCode + ". Returned:" + ++ returnCode); ++ } ++ } ++ break; ++ } ++ } // start() ++} // class InterJVMGetDropSuccessTest ++ ++final class Util implements AWTEventListener { ++ public static final int CODE_NOT_RETURNED = -1; ++ public static final int CODE_FIRST_SUCCESS = 0x2; ++ public static final int CODE_SECOND_SUCCESS = 0x2; ++ public static final int CODE_FAILURE = 0x1; ++ ++ public static final int FRAME_ACTIVATION_TIMEOUT = 3000; ++ ++ static final Object SYNC_LOCK = new Object(); ++ static final int MOUSE_RELEASE_TIMEOUT = 1000; ++ ++ static final Util theInstance = new Util(); ++ ++ static { ++ Toolkit.getDefaultToolkit().addAWTEventListener(theInstance, AWTEvent.MOUSE_EVENT_MASK); ++ } ++ ++ public static Point getCenterLocationOnScreen(Component c) { ++ Point p = c.getLocationOnScreen(); ++ Dimension d = c.getSize(); ++ p.translate(d.width / 2, d.height / 2); ++ return p; ++ } ++ ++ public static int sign(int n) { ++ return n < 0 ? -1 : n == 0 ? 0 : 1; ++ } ++ ++ private Component clickedComponent = null; ++ ++ private void reset() { ++ clickedComponent = null; ++ } ++ ++ public void eventDispatched(AWTEvent e) { ++ if (e.getID() == MouseEvent.MOUSE_RELEASED) { ++ clickedComponent = (Component)e.getSource(); ++ synchronized (SYNC_LOCK) { ++ SYNC_LOCK.notifyAll(); ++ } ++ } ++ } ++ ++ public static boolean pointInComponent(Robot robot, Point p, Component comp) ++ throws InterruptedException { ++ return theInstance.pointInComponentImpl(robot, p, comp); ++ } ++ ++ private boolean pointInComponentImpl(Robot robot, Point p, Component comp) ++ throws InterruptedException { ++ robot.waitForIdle(); ++ reset(); ++ robot.mouseMove(p.x, p.y); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ synchronized (SYNC_LOCK) { ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ SYNC_LOCK.wait(MOUSE_RELEASE_TIMEOUT); ++ } ++ ++ Component c = clickedComponent; ++ ++ while (c != null && c != comp) { ++ c = c.getParent(); ++ } ++ ++ return c == comp; ++ } ++} ++ ++class Child { ++ static class DragSourceDropListener extends DragSourceAdapter { ++ private boolean finished = false; ++ private boolean dropSuccess = false; ++ ++ public void reset() { ++ finished = false; ++ dropSuccess = false; ++ } ++ ++ public boolean isDropFinished() { ++ return finished; ++ } ++ ++ public boolean getDropSuccess() { ++ return dropSuccess; ++ } ++ ++ public void dragDropEnd(DragSourceDropEvent dsde) { ++ finished = true; ++ dropSuccess = dsde.getDropSuccess(); ++ synchronized (Util.SYNC_LOCK) { ++ Util.SYNC_LOCK.notifyAll(); ++ } ++ } ++ } ++ ++ final Frame frame = new Frame("Source Frame"); ++ final DragSource dragSource = DragSource.getDefaultDragSource(); ++ final DragSourceDropListener dragSourceListener = new DragSourceDropListener(); ++ final Transferable transferable = new StringSelection("TEXT"); ++ final DragGestureListener dragGestureListener = new DragGestureListener() { ++ public void dragGestureRecognized(DragGestureEvent dge) { ++ dge.startDrag(null, transferable, dragSourceListener); ++ } ++ }; ++ final DragGestureRecognizer dragGestureRecognizer = ++ dragSource.createDefaultDragGestureRecognizer(frame, DnDConstants.ACTION_COPY, ++ dragGestureListener); ++ ++ public static void main(String[] args) { ++ Child child = new Child(); ++ child.run(args); ++ } ++ ++ public void run(String[] args) { ++ try { ++ if (args.length != 4) { ++ throw new RuntimeException("Incorrect command line arguments."); ++ } ++ ++ int x = Integer.parseInt(args[0]); ++ int y = Integer.parseInt(args[1]); ++ int w = Integer.parseInt(args[2]); ++ int h = Integer.parseInt(args[3]); ++ ++ frame.setBounds(300, 200, 150, 150); ++ frame.setVisible(true); ++ ++ Thread.sleep(Util.FRAME_ACTIVATION_TIMEOUT); ++ ++ Point sourcePoint = Util.getCenterLocationOnScreen(frame); ++ ++ Point targetPoint = new Point(x + w / 2, y + h / 2); ++ ++ Robot robot = new Robot(); ++ robot.mouseMove(sourcePoint.x, sourcePoint.y); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ for (Point p = new Point(sourcePoint); !p.equals(targetPoint); ++ p.translate(Util.sign(targetPoint.x - p.x), ++ Util.sign(targetPoint.y - p.y))) { ++ robot.mouseMove(p.x, p.y); ++ Thread.sleep(50); ++ } ++ ++ synchronized (Util.SYNC_LOCK) { ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ Util.SYNC_LOCK.wait(Util.FRAME_ACTIVATION_TIMEOUT); ++ } ++ ++ if (!dragSourceListener.isDropFinished()) { ++ throw new RuntimeException("Drop not finished"); ++ } ++ ++ boolean success1 = dragSourceListener.getDropSuccess(); ++ ++ dragSourceListener.reset(); ++ robot.mouseMove(sourcePoint.x, sourcePoint.y); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ for (Point p = new Point(sourcePoint); !p.equals(targetPoint); ++ p.translate(Util.sign(targetPoint.x - p.x), ++ Util.sign(targetPoint.y - p.y))) { ++ robot.mouseMove(p.x, p.y); ++ Thread.sleep(50); ++ } ++ ++ synchronized (Util.SYNC_LOCK) { ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ Util.SYNC_LOCK.wait(Util.FRAME_ACTIVATION_TIMEOUT); ++ } ++ ++ if (!dragSourceListener.isDropFinished()) { ++ throw new RuntimeException("Drop not finished"); ++ } ++ ++ boolean success2 = dragSourceListener.getDropSuccess(); ++ int retCode = 0; ++ ++ if (success1) { ++ retCode |= Util.CODE_FIRST_SUCCESS; ++ } ++ if (success2) { ++ retCode |= Util.CODE_SECOND_SUCCESS; ++ } ++ // This returns the diagnostic code from the child VM ++ System.exit(retCode); ++ } catch (Throwable e) { ++ e.printStackTrace(); ++ // This returns the diagnostic code from the child VM ++ System.exit(Util.CODE_FAILURE); ++ } ++ } // run() ++} // class child ++ ++/**************************************************** ++ Standard Test Machinery ++ DO NOT modify anything below -- it's a standard ++ chunk of code whose purpose is to make user ++ interaction uniform, and thereby make it simpler ++ to read and understand someone else's test. ++ ****************************************************/ ++ ++/** ++ This is part of the standard test machinery. ++ It creates a dialog (with the instructions), and is the interface ++ for sending text messages to the user. ++ To print the instructions, send an array of strings to Sysout.createDialog ++ WithInstructions method. Put one line of instructions per array entry. ++ To display a message for the tester to see, simply call Sysout.println ++ with the string to be displayed. ++ This mimics System.out.println but works within the test harness as well ++ as standalone. ++ */ ++ ++class Sysout ++ { ++ private static TestDialog dialog; ++ ++ public static void createDialogWithInstructions( String[] instructions ) ++ { ++ dialog = new TestDialog( new Frame(), "Instructions" ); ++ dialog.printInstructions( instructions ); ++ dialog.show(); ++ println( "Any messages for the tester will display here." ); ++ } ++ ++ public static void createDialog( ) ++ { ++ dialog = new TestDialog( new Frame(), "Instructions" ); ++ String[] defInstr = { "Instructions will appear here. ", "" } ; ++ dialog.printInstructions( defInstr ); ++ dialog.show(); ++ println( "Any messages for the tester will display here." ); ++ } ++ ++ ++ public static void printInstructions( String[] instructions ) ++ { ++ dialog.printInstructions( instructions ); ++ } ++ ++ ++ public static void println( String messageIn ) ++ { ++ dialog.displayMessage( messageIn ); ++ } ++ ++ }// Sysout class ++ ++/** ++ This is part of the standard test machinery. It provides a place for the ++ test instructions to be displayed, and a place for interactive messages ++ to the user to be displayed. ++ To have the test instructions displayed, see Sysout. ++ To have a message to the user be displayed, see Sysout. ++ Do not call anything in this dialog directly. ++ */ ++class TestDialog extends Dialog ++ { ++ ++ TextArea instructionsText; ++ TextArea messageText; ++ int maxStringLength = 80; ++ ++ //DO NOT call this directly, go through Sysout ++ public TestDialog( Frame frame, String name ) ++ { ++ super( frame, name ); ++ int scrollBoth = TextArea.SCROLLBARS_BOTH; ++ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); ++ add( "North", instructionsText ); ++ ++ messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); ++ add("South", messageText); ++ ++ pack(); ++ ++ show(); ++ }// TestDialog() ++ ++ //DO NOT call this directly, go through Sysout ++ public void printInstructions( String[] instructions ) ++ { ++ //Clear out any current instructions ++ instructionsText.setText( "" ); ++ ++ //Go down array of instruction strings ++ ++ String printStr, remainingStr; ++ for( int i=0; i < instructions.length; i++ ) ++ { ++ //chop up each into pieces maxSringLength long ++ remainingStr = instructions[ i ]; ++ while( remainingStr.length() > 0 ) ++ { ++ //if longer than max then chop off first max chars to print ++ if( remainingStr.length() >= maxStringLength ) ++ { ++ //Try to chop on a word boundary ++ int posOfSpace = remainingStr. ++ lastIndexOf( ' ', maxStringLength - 1 ); ++ ++ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; ++ ++ printStr = remainingStr.substring( 0, posOfSpace + 1 ); ++ remainingStr = remainingStr.substring( posOfSpace + 1 ); ++ } ++ //else just print ++ else ++ { ++ printStr = remainingStr; ++ remainingStr = ""; ++ } ++ ++ instructionsText.append( printStr + "\n" ); ++ ++ }// while ++ ++ }// for ++ ++ }//printInstructions() ++ ++ //DO NOT call this directly, go through Sysout ++ public void displayMessage( String messageIn ) ++ { ++ messageText.append( messageIn + "\n" ); ++ } ++ ++ }// TestDialog class +--- ./jdk/test/java/awt/dnd/NoFormatsCrashTest/NoFormatsCrashTest.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/NoFormatsCrashTest/NoFormatsCrashTest.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,45 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

    NoFormatsCrashTest
    Bug ID: 4870762

    ++ ++

    This is an AUTOMATIC test, simply wait for completion

    ++ ++ ++ ++ ++ +--- ./jdk/test/java/awt/dnd/NoFormatsCrashTest/NoFormatsCrashTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/NoFormatsCrashTest/NoFormatsCrashTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,488 @@ ++/* ++ * 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 4870762 ++ @summary tests that a drop target JVM doesn't crash if the source doesn't export ++ data in native formats. ++ @author das@sparc.spb.su area=dnd ++ @compile NoFormatsCrashTest.java ++ @run applet NoFormatsCrashTest.html ++*/ ++ ++// Note there is no @ in front of test above. This is so that the ++// harness will not mistake this file as a test file. It should ++// only see the html file as a test file. (the harness runs all ++// valid test files, so it would run this test twice if this file ++// were valid as well as the html file.) ++// Also, note the area= after Your Name in the author tag. Here, you ++// should put which functional area the test falls in. See the ++// AWT-core home page -> test areas and/or -> AWT team for a list of ++// areas. ++// Note also the 'NoFormatsCrashTest.html' in the run tag. This should ++// be changed to the name of the test. ++ ++ ++/** ++ * NoFormatsCrashTest.java ++ * ++ * summary: tests that a drop target JVM doesn't crash if the source doesn't export ++ * data in native formats. ++ */ ++ ++import java.applet.Applet; ++import java.awt.*; ++import java.awt.datatransfer.*; ++import java.awt.dnd.*; ++import java.awt.event.*; ++import java.io.*; ++ ++ ++//Automated tests should run as applet tests if possible because they ++// get their environments cleaned up, including AWT threads, any ++// test created threads, and any system resources used by the test ++// such as file descriptors. (This is normally not a problem as ++// main tests usually run in a separate VM, however on some platforms ++// such as the Mac, separate VMs are not possible and non-applet ++// tests will cause problems). Also, you don't have to worry about ++// synchronisation stuff in Applet tests they way you do in main ++// tests... ++ ++ ++public class NoFormatsCrashTest extends Applet { ++ ++ final Frame frame = new Frame(); ++ private volatile Process process; ++ ++ static final int FRAME_ACTIVATION_TIMEOUT = 2000; ++ ++ public static void main(String[] args) { ++ NoFormatsCrashTest test = new NoFormatsCrashTest(); ++ test.run(args); ++ } ++ ++ public void run(String[] args) { ++ try { ++ if (args.length != 4) { ++ throw new RuntimeException("Incorrect command line arguments."); ++ } ++ ++ int x = Integer.parseInt(args[0]); ++ int y = Integer.parseInt(args[1]); ++ int w = Integer.parseInt(args[2]); ++ int h = Integer.parseInt(args[3]); ++ ++ Panel panel = new DragSourcePanel(); ++ ++ frame.setTitle("Drag source frame"); ++ frame.setLocation(500, 200); ++ frame.add(panel); ++ frame.pack(); ++ frame.setVisible(true); ++ ++ Thread.sleep(FRAME_ACTIVATION_TIMEOUT); ++ ++ Point sourcePoint = panel.getLocationOnScreen(); ++ Dimension d = panel.getSize(); ++ sourcePoint.translate(d.width / 2, d.height / 2); ++ ++ Point targetPoint = new Point(x + w / 2, y + h / 2); ++ ++ Robot robot = new Robot(); ++ robot.mouseMove(sourcePoint.x, sourcePoint.y); ++ robot.keyPress(KeyEvent.VK_CONTROL); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ for (; !sourcePoint.equals(targetPoint); ++ sourcePoint.translate(sign(targetPoint.x - sourcePoint.x), ++ sign(targetPoint.y - sourcePoint.y))) { ++ robot.mouseMove(sourcePoint.x, sourcePoint.y); ++ Thread.sleep(50); ++ } ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ robot.keyRelease(KeyEvent.VK_CONTROL); ++ ++ Thread.sleep(FRAME_ACTIVATION_TIMEOUT); ++ ++ if (process.isAlive()) { ++ process.destroy(); ++ } ++ } catch (Throwable e) { ++ e.printStackTrace(); ++ throw new RuntimeException(e); ++ } ++ } // run() ++ ++ public void init() { ++ //Create instructions for the user here, as well as set up ++ // the environment -- set the layout manager, add buttons, ++ // etc. ++ ++ String[] instructions = ++ { ++ "This is an AUTOMATIC test", ++ "simply wait until it is done" ++ }; ++ Sysout.createDialog( ); ++ Sysout.printInstructions( instructions ); ++ ++ frame.setTitle("Drop target frame"); ++ frame.setLocation(200, 200); ++ ++ } // init() ++ ++ public void start() { ++ DropTargetPanel panel = new DropTargetPanel(); ++ frame.add(panel); ++ frame.pack(); ++ frame.setVisible(true); ++ ++ try { ++ Thread.sleep(FRAME_ACTIVATION_TIMEOUT); ++ ++ Point p = frame.getLocationOnScreen(); ++ Dimension d = frame.getSize(); ++ ++ String javaPath = System.getProperty("java.home", ""); ++ String command = javaPath + File.separator + "bin" + ++ File.separator + "java -cp " + System.getProperty("test.classes", ".") + ++ " NoFormatsCrashTest " + ++ p.x + " " + p.y + " " + d.width + " " + d.height; ++ ++ process = Runtime.getRuntime().exec(command); ++ ProcessResults pres = ProcessResults.doWaitFor(process); ++ System.err.println("Child VM return code: " + pres.exitValue); ++ ++ if (pres.stderr != null && pres.stderr.length() > 0) { ++ System.err.println("========= Child VM System.err ========"); ++ System.err.print(pres.stderr); ++ System.err.println("======================================"); ++ } ++ ++ if (pres.stdout != null && pres.stdout.length() > 0) { ++ System.err.println("========= Child VM System.out ========"); ++ System.err.print(pres.stdout); ++ System.err.println("======================================"); ++ } ++ ++ } catch (Throwable e) { ++ e.printStackTrace(); ++ throw new RuntimeException(e); ++ } ++ ++ if (panel.isTestFailed()) { ++ throw new RuntimeException(); ++ } ++ } // start() ++ ++ public static int sign(int n) { ++ return n < 0 ? -1 : n > 0 ? 1 : 0; ++ } ++} // class NoFormatsCrashTest ++ ++class TestTransferable implements Transferable { ++ ++ public static DataFlavor dataFlavor = null; ++ static final Object data = new Object(); ++ ++ static { ++ DataFlavor df = null; ++ try { ++ df = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ++ "; class=java.lang.Object"); ++ } catch (ClassNotFoundException e) { ++ throw new ExceptionInInitializerError(e); ++ } ++ dataFlavor = df; ++ } ++ ++ public DataFlavor[] getTransferDataFlavors() { ++ return new DataFlavor[] { dataFlavor }; ++ } ++ ++ public boolean isDataFlavorSupported(DataFlavor df) { ++ return dataFlavor.equals(df); ++ } ++ ++ public Object getTransferData(DataFlavor df) ++ throws UnsupportedFlavorException, IOException { ++ if (!isDataFlavorSupported(df)) { ++ throw new UnsupportedFlavorException(df); ++ } ++ return data; ++ } ++} ++ ++class DragSourcePanel extends Panel { ++ public DragSourcePanel() { ++ final Transferable t = new TestTransferable(); ++ final DragSourceListener dsl = new DragSourceAdapter() { ++ public void dragDropEnd(DragSourceDropEvent dtde) { ++ try { ++ Thread.sleep(100); ++ } catch (InterruptedException e) { ++ e.printStackTrace(); ++ } ++ // This finishes child VM ++ System.exit(0); ++ } ++ }; ++ final DragGestureListener dgl = new DragGestureListener() { ++ public void dragGestureRecognized(DragGestureEvent dge) { ++ dge.startDrag(null, t, dsl); ++ } ++ }; ++ final DragSource ds = DragSource.getDefaultDragSource(); ++ final DragGestureRecognizer dgr = ++ ds.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY, ++ dgl); ++ } ++ ++ public Dimension getPreferredSize() { ++ return new Dimension(100, 100); ++ } ++} ++ ++class DropTargetPanel extends Panel { ++ private boolean testFailed = false; ++ public DropTargetPanel() { ++ final DropTargetListener dtl = new DropTargetAdapter() { ++ public void dragOver(DropTargetDragEvent dtde) { ++ try { ++ dtde.getCurrentDataFlavorsAsList(); ++ } catch (Exception e) { ++ testFailed = true; ++ e.printStackTrace(); ++ } ++ } ++ public void drop(DropTargetDropEvent dtde) { ++ dtde.rejectDrop(); ++ } ++ }; ++ final DropTarget dt = new DropTarget(this, dtl); ++ } ++ ++ public boolean isTestFailed() { ++ return testFailed; ++ } ++ ++ public Dimension getPreferredSize() { ++ return new Dimension(100, 100); ++ } ++} ++ ++class ProcessResults { ++ public int exitValue; ++ public String stdout; ++ public String stderr; ++ ++ public ProcessResults() { ++ exitValue = -1; ++ stdout = ""; ++ stderr = ""; ++ } ++ ++ /** ++ * Method to perform a "wait" for a process and return its exit value. ++ * This is a workaround for Process.waitFor() never returning. ++ */ ++ public static ProcessResults doWaitFor(Process p) { ++ ProcessResults pres = new ProcessResults(); ++ ++ InputStream in = null; ++ InputStream err = null; ++ ++ try { ++ in = p.getInputStream(); ++ err = p.getErrorStream(); ++ ++ boolean finished = false; ++ ++ while (!finished) { ++ try { ++ while (in.available() > 0) { ++ pres.stdout += (char)in.read(); ++ } ++ while (err.available() > 0) { ++ pres.stderr += (char)err.read(); ++ } ++ // Ask the process for its exitValue. If the process ++ // is not finished, an IllegalThreadStateException ++ // is thrown. If it is finished, we fall through and ++ // the variable finished is set to true. ++ pres.exitValue = p.exitValue(); ++ finished = true; ++ } ++ catch (IllegalThreadStateException e) { ++ // Process is not finished yet; ++ // Sleep a little to save on CPU cycles ++ Thread.currentThread().sleep(500); ++ } ++ } ++ if (in != null) in.close(); ++ if (err != null) err.close(); ++ } ++ catch (Throwable e) { ++ System.err.println("doWaitFor(): unexpected exception"); ++ e.printStackTrace(); ++ throw new RuntimeException(e); ++ } ++ return pres; ++ } ++} ++ ++/**************************************************** ++ Standard Test Machinery ++ DO NOT modify anything below -- it's a standard ++ chunk of code whose purpose is to make user ++ interaction uniform, and thereby make it simpler ++ to read and understand someone else's test. ++ ****************************************************/ ++ ++/** ++ This is part of the standard test machinery. ++ It creates a dialog (with the instructions), and is the interface ++ for sending text messages to the user. ++ To print the instructions, send an array of strings to Sysout.createDialog ++ WithInstructions method. Put one line of instructions per array entry. ++ To display a message for the tester to see, simply call Sysout.println ++ with the string to be displayed. ++ This mimics System.out.println but works within the test harness as well ++ as standalone. ++ */ ++ ++class Sysout ++ { ++ private static TestDialog dialog; ++ ++ public static void createDialogWithInstructions( String[] instructions ) ++ { ++ dialog = new TestDialog( new Frame(), "Instructions" ); ++ dialog.printInstructions( instructions ); ++ dialog.show(); ++ println( "Any messages for the tester will display here." ); ++ } ++ ++ public static void createDialog( ) ++ { ++ dialog = new TestDialog( new Frame(), "Instructions" ); ++ String[] defInstr = { "Instructions will appear here. ", "" } ; ++ dialog.printInstructions( defInstr ); ++ dialog.show(); ++ println( "Any messages for the tester will display here." ); ++ } ++ ++ ++ public static void printInstructions( String[] instructions ) ++ { ++ dialog.printInstructions( instructions ); ++ } ++ ++ ++ public static void println( String messageIn ) ++ { ++ dialog.displayMessage( messageIn ); ++ } ++ ++ }// Sysout class ++ ++/** ++ This is part of the standard test machinery. It provides a place for the ++ test instructions to be displayed, and a place for interactive messages ++ to the user to be displayed. ++ To have the test instructions displayed, see Sysout. ++ To have a message to the user be displayed, see Sysout. ++ Do not call anything in this dialog directly. ++ */ ++class TestDialog extends Dialog ++ { ++ ++ TextArea instructionsText; ++ TextArea messageText; ++ int maxStringLength = 80; ++ ++ //DO NOT call this directly, go through Sysout ++ public TestDialog( Frame frame, String name ) ++ { ++ super( frame, name ); ++ int scrollBoth = TextArea.SCROLLBARS_BOTH; ++ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); ++ add( "North", instructionsText ); ++ ++ messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); ++ add("South", messageText); ++ ++ pack(); ++ ++ show(); ++ }// TestDialog() ++ ++ //DO NOT call this directly, go through Sysout ++ public void printInstructions( String[] instructions ) ++ { ++ //Clear out any current instructions ++ instructionsText.setText( "" ); ++ ++ //Go down array of instruction strings ++ ++ String printStr, remainingStr; ++ for( int i=0; i < instructions.length; i++ ) ++ { ++ //chop up each into pieces maxSringLength long ++ remainingStr = instructions[ i ]; ++ while( remainingStr.length() > 0 ) ++ { ++ //if longer than max then chop off first max chars to print ++ if( remainingStr.length() >= maxStringLength ) ++ { ++ //Try to chop on a word boundary ++ int posOfSpace = remainingStr. ++ lastIndexOf( ' ', maxStringLength - 1 ); ++ ++ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; ++ ++ printStr = remainingStr.substring( 0, posOfSpace + 1 ); ++ remainingStr = remainingStr.substring( posOfSpace + 1 ); ++ } ++ //else just print ++ else ++ { ++ printStr = remainingStr; ++ remainingStr = ""; ++ } ++ ++ instructionsText.append( printStr + "\n" ); ++ ++ }// while ++ ++ }// for ++ ++ }//printInstructions() ++ ++ //DO NOT call this directly, go through Sysout ++ public void displayMessage( String messageIn ) ++ { ++ messageText.append( messageIn + "\n" ); ++ } ++ ++ }// TestDialog class +--- ./jdk/test/java/awt/dnd/URLDragTest/URLDragTest.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/URLDragTest/URLDragTest.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,45 @@ ++ ++ ++ ++ ++ ++ DnD of URL across JVM ++ ++ ++ ++

    URLDragTest
    Bug ID: 8031964

    ++ ++

    This is an AUTOMATIC test, simply wait for completion

    ++ ++ ++ ++ +--- ./jdk/test/java/awt/dnd/URLDragTest/URLDragTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/dnd/URLDragTest/URLDragTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,88 @@ ++/* ++ * 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 8031964 ++ @summary Dragging images from the browser does not work ++ @author Petr Pchelko : area=dnd ++ @library ../../regtesthelpers ++ @build Sysout ++ @run applet/manual=yesno URLDragTest.html ++*/ ++ ++import test.java.awt.regtesthelpers.Sysout; ++ ++import java.applet.Applet; ++import java.awt.*; ++import java.awt.datatransfer.DataFlavor; ++import java.awt.dnd.DnDConstants; ++import java.awt.dnd.DropTarget; ++import java.awt.dnd.DropTargetAdapter; ++import java.awt.dnd.DropTargetDragEvent; ++import java.awt.dnd.DropTargetDropEvent; ++ ++public class URLDragTest extends Applet { ++ ++ ++ @Override ++ public void init() { ++ setBackground(Color.red); ++ setDropTarget(new DropTarget(this, ++ DnDConstants.ACTION_COPY, ++ new DropTargetAdapter() { ++ @Override ++ public void dragEnter(DropTargetDragEvent dtde) { ++ dtde.acceptDrag(DnDConstants.ACTION_COPY); ++ } ++ ++ @Override ++ public void dragOver(DropTargetDragEvent dtde) { ++ dtde.acceptDrag(DnDConstants.ACTION_COPY); ++ } ++ ++ @Override ++ public void drop(DropTargetDropEvent dtde) { ++ dtde.acceptDrop(DnDConstants.ACTION_COPY); ++ dtde.getCurrentDataFlavorsAsList() ++ .stream() ++ .map(DataFlavor::toString) ++ .forEach(Sysout::println); ++ } ++ })); ++ ++ String[] instructions = { ++ "1) Open the browser.", ++ "2) Drag any image from the browser page to the red square", ++ "3) When the image is dropped you should se the list of available DataFlavors", ++ "4) If you see application/x-java-url and text/uri-list flavors - test PASSED", ++ "5) Otherwise the test is FAILED"}; ++ Sysout.createDialogWithInstructions(instructions); ++ } ++ ++ @Override ++ public void start() { ++ setSize(200, 200); ++ setVisible(true); ++ } ++} +--- ./jdk/test/java/awt/event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/event/KeyEvent/SwallowKeyEvents/SwallowKeyEvents.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, 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 +@@ -23,7 +23,7 @@ + + /* + @test +- @bug 7154072 ++ @bug 7154072 7161320 + @summary Tests that key events with modifiers are not swallowed. + @author anton.tarasov: area=awt.focus + @library ../../../regtesthelpers +@@ -49,6 +49,11 @@ + static Robot r; + + public static void main(String[] args) { ++ if (sun.awt.OSInfo.getOSType() == sun.awt.OSInfo.OSType.WINDOWS) { ++ System.out.println("Skipped. Test not for MS Windows."); ++ return; ++ } ++ + f.add(t); + f.pack(); + f.setVisible(true); +--- ./jdk/test/java/awt/geom/Path2D/EmptyCapacity.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/geom/Path2D/EmptyCapacity.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,42 @@ ++/* ++ * 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.awt.geom.Path2D; ++ ++/** ++ * @test ++ * @bug 8042103 ++ * @summary Path2D.moveTo() should work if empty initial capacity was set. ++ * @author Sergey Bylokhov ++ */ ++public final class EmptyCapacity { ++ ++ public static void main(final String[] args) { ++ final Path2D path1 = new Path2D.Double(Path2D.WIND_EVEN_ODD, 0); ++ path1.moveTo(10, 10); ++ path1.lineTo(20, 20); ++ final Path2D path2 = new Path2D.Float(Path2D.WIND_EVEN_ODD, 0); ++ path2.moveTo(10, 10); ++ path2.lineTo(20, 20); ++ } ++} +--- ./jdk/test/java/awt/image/DrawImage/IncorrectAlphaSurface2SW.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/image/DrawImage/IncorrectAlphaSurface2SW.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,161 @@ ++/* ++ * 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.awt.AlphaComposite; ++import java.awt.Color; ++import java.awt.Graphics2D; ++import java.awt.GraphicsConfiguration; ++import java.awt.GraphicsEnvironment; ++import java.awt.Image; ++import java.awt.image.BufferedImage; ++import java.awt.image.VolatileImage; ++import java.io.File; ++import java.io.IOException; ++ ++import javax.imageio.ImageIO; ++ ++import static java.awt.Transparency.TRANSLUCENT; ++import static java.awt.image.BufferedImage.TYPE_4BYTE_ABGR; ++import static java.awt.image.BufferedImage.TYPE_4BYTE_ABGR_PRE; ++import static java.awt.image.BufferedImage.TYPE_INT_ARGB; ++import static java.awt.image.BufferedImage.TYPE_INT_ARGB_PRE; ++ ++/** ++ * @test ++ * @bug 8017626 ++ * @summary Tests drawing transparent volatile image to transparent BI. ++ * Results of the blit compatibleImage to transparent BI used for ++ * comparison. ++ * @author Sergey Bylokhov ++ */ ++public final class IncorrectAlphaSurface2SW { ++ ++ private static final int[] SCALES = {1, 2, 4, 8}; ++ private static final int[] SIZES = {1, 2, 3, 127, 128, 254, 255, 256}; ++ private static final int[] dstTypes = {TYPE_INT_ARGB, TYPE_INT_ARGB_PRE, ++ TYPE_4BYTE_ABGR, TYPE_4BYTE_ABGR_PRE}; ++ private static final int[] srcTypes = {TRANSLUCENT}; ++ ++ ++ public static void main(final String[] args) throws IOException { ++ GraphicsEnvironment ge = GraphicsEnvironment ++ .getLocalGraphicsEnvironment(); ++ GraphicsConfiguration gc = ge.getDefaultScreenDevice() ++ .getDefaultConfiguration(); ++ BufferedImage destVI; ++ BufferedImage destBI; ++ BufferedImage sourceBI; ++ VolatileImage sourceVI; ++ ++ for (final int s : SIZES) { ++ for (final int srcType : srcTypes) { ++ for (final int dstType : dstTypes) { ++ for (final int scale : SCALES) { ++ int sw = s * scale; ++ destVI = new BufferedImage(sw, sw, dstType); ++ destBI = new BufferedImage(sw, sw, dstType); ++ sourceBI = gc.createCompatibleImage(sw, sw, srcType); ++ sourceVI = gc.createCompatibleVolatileImage(s, s, srcType); ++ ++ // draw to dest BI using compatible image ++ fill(sourceBI, s); ++ Graphics2D big = destBI.createGraphics(); ++ big.setComposite(AlphaComposite.Src); ++ big.drawImage(sourceBI, 0, 0, sw, sw, null); ++ big.dispose(); ++ ++ // draw to dest BI using compatible image ++ fill(sourceVI, s); ++ drawVItoBI(gc, destVI, sourceVI); ++ ++ validate(destVI, destBI); ++ sourceVI.flush(); ++ } ++ } ++ } ++ } ++ System.out.println("Test PASSED"); ++ } ++ ++ private static void drawVItoBI(GraphicsConfiguration gc, ++ BufferedImage bi, VolatileImage vi) { ++ while (true) { ++ vi.validate(gc); ++ fill(vi, vi.getHeight()); ++ if (vi.validate(gc) != VolatileImage.IMAGE_OK) { ++ try { ++ Thread.sleep(100); ++ } catch (final InterruptedException ignored) { ++ } ++ continue; ++ } ++ ++ Graphics2D big = bi.createGraphics(); ++ big.setComposite(AlphaComposite.Src); ++ big.drawImage(vi, 0, 0, bi.getWidth(), bi.getHeight(), null); ++ big.dispose(); ++ ++ if (vi.contentsLost()) { ++ try { ++ Thread.sleep(100); ++ } catch (final InterruptedException ignored) { ++ } ++ continue; ++ } ++ break; ++ } ++ } ++ ++ private static void validate(BufferedImage bi, BufferedImage gold) ++ throws IOException { ++ for (int x = 0; x < bi.getWidth(); ++x) { ++ for (int y = 0; y < bi.getHeight(); ++y) { ++ if (gold.getRGB(x, y) != bi.getRGB(x, y)) { ++ System.err.println("Expected color = " + gold.getRGB(x, y)); ++ System.err.println("Actual color = " + bi.getRGB(x, y)); ++ ImageIO.write(gold, "png", new File("gold.png")); ++ ImageIO.write(bi, "png", new File("bi.png")); ++ throw new RuntimeException("Test failed."); ++ } ++ } ++ } ++ } ++ ++ /** ++ * Fills the whole image using different alpha for each row. ++ * ++ * @param image to fill ++ */ ++ private static void fill(final Image image, final int size) { ++ Graphics2D graphics = (Graphics2D) image.getGraphics(); ++ graphics.setComposite(AlphaComposite.Src); ++ graphics.setColor(Color.GREEN); ++ graphics.fillRect(0, 0, image.getWidth(null), image.getHeight(null)); ++ int row = image.getHeight(null) / size; ++ for (int i = 0; i < size; ++i) { ++ graphics.setColor(new Color(23, 127, 189, i)); ++ graphics.fillRect(0, i * row, image.getWidth(null), row); ++ } ++ graphics.dispose(); ++ } ++} +--- ./jdk/test/java/awt/image/DrawImage/IncorrectClipSurface2SW.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/image/DrawImage/IncorrectClipSurface2SW.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,166 @@ ++/* ++ * 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.awt.AlphaComposite; ++import java.awt.Color; ++import java.awt.Graphics2D; ++import java.awt.GraphicsConfiguration; ++import java.awt.GraphicsEnvironment; ++import java.awt.Image; ++import java.awt.Rectangle; ++import java.awt.Shape; ++import java.awt.geom.AffineTransform; ++import java.awt.geom.Ellipse2D; ++import java.awt.image.BufferedImage; ++import java.awt.image.VolatileImage; ++import java.io.File; ++import java.io.IOException; ++ ++import javax.imageio.ImageIO; ++ ++import static java.awt.geom.Rectangle2D.Double; ++ ++/** ++ * @test ++ * @bug 8041644 ++ * @summary Tests drawing volatile image to BI using different clip. ++ * Results of the blit compatibleImage to BI used for comparison. ++ * @author Sergey Bylokhov ++ * @run main/othervm -Dsun.java2d.d3d=false IncorrectClipSurface2SW ++ */ ++public final class IncorrectClipSurface2SW { ++ ++ private static int[] SCALES = {1, 2, 4}; ++ private static int[] SIZES = {127, 3, 2, 1}; ++ private static final Shape[] SHAPES = {new Rectangle(0, 0, 0, 0), ++ new Rectangle(0, 0, 1, 1), ++ new Rectangle(0, 1, 1, 1), ++ new Rectangle(1, 0, 1, 1), ++ new Rectangle(1, 1, 1, 1), ++ ++ new Ellipse2D.Double(0, 0, 1, 1), ++ new Ellipse2D.Double(0, 1, 1, 1), ++ new Ellipse2D.Double(1, 0, 1, 1), ++ new Ellipse2D.Double(1, 1, 1, 1), ++ new Ellipse2D.Double(.25, .25, .5, ++ .5), ++ ++ new Double(0, 0, 0.5, 0.5), ++ new Double(0, 0.5, 0.5, 0.5), ++ new Double(0.5, 0, 0.5, 0.5), ++ new Double(0.5, 0.5, 0.5, 0.5), ++ new Double(0.25, 0.25, 0.5, 0.5), ++ new Double(0, 0.25, 1, 0.5), ++ new Double(0.25, 0, 0.5, 1), ++ ++ new Double(.10, .10, .20, .20), ++ new Double(.75, .75, .20, .20), ++ new Double(.75, .10, .20, .20), ++ new Double(.10, .75, .20, .20),}; ++ ++ public static void main(final String[] args) throws IOException { ++ GraphicsEnvironment ge = GraphicsEnvironment ++ .getLocalGraphicsEnvironment(); ++ GraphicsConfiguration gc = ge.getDefaultScreenDevice() ++ .getDefaultConfiguration(); ++ AffineTransform at; ++ for (final int size : SIZES) { ++ for (final int scale : SCALES) { ++ final int sw = size * scale; ++ at = AffineTransform.getScaleInstance(sw, sw); ++ for (Shape clip : SHAPES) { ++ clip = at.createTransformedShape(clip); ++ for (Shape to : SHAPES) { ++ to = at.createTransformedShape(to); ++ // Prepare test images ++ VolatileImage vi = getVolatileImage(gc, size); ++ BufferedImage bi = getBufferedImage(sw); ++ // Prepare gold images ++ BufferedImage goldvi = getCompatibleImage(gc, size); ++ BufferedImage goldbi = getBufferedImage(sw); ++ draw(clip, to, vi, bi, scale); ++ draw(clip, to, goldvi, goldbi, scale); ++ validate(bi, goldbi); ++ } ++ } ++ } ++ } ++ } ++ ++ private static void draw(Shape clip, Shape to, Image vi, BufferedImage bi, ++ int scale) { ++ Graphics2D big = bi.createGraphics(); ++ big.setComposite(AlphaComposite.Src); ++ big.setClip(clip); ++ Rectangle toBounds = to.getBounds(); ++ int x1 = toBounds.x; ++ ++ int y1 = toBounds.y; ++ int x2 = x1 + toBounds.width; ++ int y2 = y1 + toBounds.height; ++ big.drawImage(vi, x1, y1, x2, y2, 0, 0, toBounds.width / scale, ++ toBounds.height / scale, null); ++ big.dispose(); ++ vi.flush(); ++ } ++ ++ private static BufferedImage getBufferedImage(int sw) { ++ BufferedImage bi = new BufferedImage(sw, sw, ++ BufferedImage.TYPE_INT_ARGB); ++ Graphics2D g2d = bi.createGraphics(); ++ g2d.setColor(Color.RED); ++ g2d.fillRect(0, 0, sw, sw); ++ return bi; ++ } ++ ++ private static VolatileImage getVolatileImage(GraphicsConfiguration gc, ++ int size) { ++ VolatileImage vi = gc.createCompatibleVolatileImage(size, size); ++ Graphics2D g2d = vi.createGraphics(); ++ g2d.setColor(Color.GREEN); ++ g2d.fillRect(0, 0, size, size); ++ return vi; ++ } ++ ++ private static BufferedImage getCompatibleImage(GraphicsConfiguration gc, ++ int size) { ++ BufferedImage image = gc.createCompatibleImage(size, size); ++ Graphics2D g2d = image.createGraphics(); ++ g2d.setColor(Color.GREEN); ++ g2d.fillRect(0, 0, size, size); ++ return image; ++ } ++ ++ private static void validate(BufferedImage bi, BufferedImage goldbi) ++ throws IOException { ++ for (int x = 0; x < bi.getWidth(); ++x) { ++ for (int y = 0; y < bi.getHeight(); ++y) { ++ if (goldbi.getRGB(x, y) != bi.getRGB(x, y)) { ++ ImageIO.write(bi, "png", new File("actual.png")); ++ ImageIO.write(goldbi, "png", new File("expected.png")); ++ throw new RuntimeException("Test failed."); ++ } ++ } ++ } ++ } ++} +--- ./jdk/test/java/awt/image/DrawImage/IncorrectDestinationOffset.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/image/DrawImage/IncorrectDestinationOffset.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,164 @@ ++/* ++ * 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.awt.AlphaComposite; ++import java.awt.Color; ++import java.awt.Graphics2D; ++import java.awt.GraphicsConfiguration; ++import java.awt.GraphicsEnvironment; ++import java.awt.image.BufferedImage; ++import java.awt.image.VolatileImage; ++import java.io.File; ++import java.io.IOException; ++ ++import javax.imageio.ImageIO; ++ ++/** ++ * @test ++ * @bug 8041129 ++ * @summary Destination offset should be correct in case of Surface->SW blit. ++ * Destination outside of the drawing area should be untouched. ++ * @author Sergey Bylokhov ++ */ ++public final class IncorrectDestinationOffset { ++ ++ private static final int SIZE = 128; ++ private static final double[] SCALES = {0.25, 0.5, 1, 1.5, 2.0, 4}; ++ ++ public static void main(final String[] args) throws IOException { ++ GraphicsEnvironment ge = GraphicsEnvironment ++ .getLocalGraphicsEnvironment(); ++ GraphicsConfiguration gc = ge.getDefaultScreenDevice() ++ .getDefaultConfiguration(); ++ VolatileImage vi = gc.createCompatibleVolatileImage(SIZE, SIZE); ++ BufferedImage bi = new BufferedImage(SIZE, SIZE, ++ BufferedImage.TYPE_INT_ARGB); ++ for (double scale : SCALES) { ++ while (true) { ++ // initialize Volatile Image ++ vi.validate(gc); ++ Graphics2D g2d = vi.createGraphics(); ++ g2d.setColor(Color.green); ++ g2d.fillRect(0, 0, SIZE, SIZE); ++ g2d.dispose(); ++ ++ if (vi.validate(gc) != VolatileImage.IMAGE_OK) { ++ try { ++ Thread.sleep(100); ++ } catch (InterruptedException ignored) { ++ } ++ continue; ++ } ++ // Draw the VolatileImage to BI with scale and offsets ++ Graphics2D g = bi.createGraphics(); ++ g.setComposite(AlphaComposite.Src); ++ g.setColor(Color.RED); ++ g.fillRect(0, 0, SIZE / 2, SIZE / 2); ++ g.setColor(Color.BLUE); ++ g.fillRect(SIZE / 2, 0, SIZE / 2, SIZE / 2); ++ g.setColor(Color.ORANGE); ++ g.fillRect(0, SIZE / 2, SIZE / 2, SIZE / 2); ++ g.setColor(Color.MAGENTA); ++ g.fillRect(SIZE / 2, SIZE / 2, SIZE / 2, SIZE / 2); ++ ++ int point2draw = (int) (100 * scale); ++ int size2draw = (int) (SIZE * scale); ++ g.drawImage(vi, point2draw, point2draw, size2draw, size2draw, ++ null); ++ g.dispose(); ++ ++ if (vi.contentsLost()) { ++ try { ++ Thread.sleep(100); ++ } catch (InterruptedException ignored) { ++ } ++ continue; ++ } ++ validate(bi, point2draw, size2draw); ++ break; ++ } ++ } ++ } ++ ++ private static void validate(BufferedImage bi, int point2draw, ++ int size2draw) ++ throws IOException { ++ for (int x = 0; x < SIZE; ++x) { ++ for (int y = 0; y < SIZE; ++y) { ++ if (isInsideGreenArea(point2draw, size2draw, x, y)) { ++ if (bi.getRGB(x, y) != Color.green.getRGB()) { ++ ImageIO.write(bi, "png", new File("image.png")); ++ throw new RuntimeException("Test failed."); ++ } ++ } else { ++ if (isRedArea(x, y)) { ++ if (bi.getRGB(x, y) != Color.red.getRGB()) { ++ ImageIO.write(bi, "png", new File("image.png")); ++ throw new RuntimeException("Test failed."); ++ } ++ } ++ if (isBlueArea(x, y)) { ++ if (bi.getRGB(x, y) != Color.blue.getRGB()) { ++ ImageIO.write(bi, "png", new File("image.png")); ++ throw new RuntimeException("Test failed."); ++ } ++ } ++ if (isOrangeArea(x, y)) { ++ if (bi.getRGB(x, y) != Color.orange.getRGB()) { ++ ImageIO.write(bi, "png", new File("image.png")); ++ throw new RuntimeException("Test failed."); ++ } ++ } ++ if (isMagentaArea(x, y)) { ++ if (bi.getRGB(x, y) != Color.magenta.getRGB()) { ++ ImageIO.write(bi, "png", new File("image.png")); ++ throw new RuntimeException("Test failed."); ++ } ++ } ++ } ++ } ++ } ++ } ++ ++ private static boolean isRedArea(int x, int y) { ++ return x < SIZE / 2 && y < SIZE / 2; ++ } ++ ++ private static boolean isBlueArea(int x, int y) { ++ return x >= SIZE / 2 && y < SIZE / 2; ++ } ++ ++ private static boolean isOrangeArea(int x, int y) { ++ return x < SIZE / 2 && y >= SIZE / 2; ++ } ++ ++ private static boolean isMagentaArea(int x, int y) { ++ return x >= SIZE / 2 && y >= SIZE / 2; ++ } ++ ++ private static boolean isInsideGreenArea(int point2draw, int size2draw, ++ int x, int y) { ++ return x >= point2draw && x < point2draw + size2draw && y >= ++ point2draw && y < point2draw + size2draw; ++ } ++} +--- ./jdk/test/java/awt/image/DrawImage/IncorrectSourceOffset.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/image/DrawImage/IncorrectSourceOffset.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,100 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.awt.AlphaComposite; ++import java.awt.Color; ++import java.awt.Graphics2D; ++import java.awt.GraphicsConfiguration; ++import java.awt.GraphicsEnvironment; ++import java.awt.Image; ++import java.awt.image.BufferedImage; ++import java.awt.image.VolatileImage; ++import java.io.File; ++import java.io.IOException; ++ ++import javax.imageio.ImageIO; ++ ++/** ++ * @test ++ * @bug 8041129 ++ * @summary Tests asymmetric source offsets. ++ * @author Sergey Bylokhov ++ */ ++public final class IncorrectSourceOffset { ++ ++ public static void main(final String[] args) throws IOException { ++ GraphicsEnvironment ge = GraphicsEnvironment ++ .getLocalGraphicsEnvironment(); ++ GraphicsConfiguration gc = ge.getDefaultScreenDevice() ++ .getDefaultConfiguration(); ++ VolatileImage vi = gc.createCompatibleVolatileImage(511, 255); ++ BufferedImage bi = new BufferedImage(511, 255, ++ BufferedImage.TYPE_INT_ARGB); ++ BufferedImage gold = new BufferedImage(511, 255, ++ BufferedImage.TYPE_INT_ARGB); ++ fill(gold); ++ while (true) { ++ vi.validate(gc); ++ fill(vi); ++ if (vi.validate(gc) != VolatileImage.IMAGE_OK) { ++ try { ++ Thread.sleep(100); ++ } catch (final InterruptedException ignored) { ++ } ++ continue; ++ } ++ ++ Graphics2D big = bi.createGraphics(); ++ big.drawImage(vi, 7, 11, 127, 111, 7, 11, 127, 111, null); ++ big.dispose(); ++ if (vi.contentsLost()) { ++ try { ++ Thread.sleep(100); ++ } catch (final InterruptedException ignored) { ++ } ++ continue; ++ } ++ break; ++ } ++ ++ for (int x = 7; x < 127; ++x) { ++ for (int y = 11; y < 111; ++y) { ++ if (gold.getRGB(x, y) != bi.getRGB(x, y)) { ++ ImageIO.write(gold, "png", new File("gold.png")); ++ ImageIO.write(bi, "png", new File("bi.png")); ++ throw new RuntimeException("Test failed."); ++ } ++ } ++ } ++ } ++ ++ private static void fill(Image image) { ++ Graphics2D graphics = (Graphics2D) image.getGraphics(); ++ graphics.setComposite(AlphaComposite.Src); ++ for (int i = 0; i < image.getHeight(null); ++i) { ++ graphics.setColor(new Color(i, 0, 0)); ++ graphics.fillRect(0, i, image.getWidth(null), 1); ++ } ++ graphics.dispose(); ++ } ++} +--- ./jdk/test/java/awt/image/ImageIconHang.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/image/ImageIconHang.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.awt.*; ++ ++/* ++ * @test ++ * @bug 8032788 ++ * @summary Checks that null filename argument is processed correctly ++ * ++ * @run main ImageIconHang ++ */ ++public class ImageIconHang { ++ public static void main(String[] args) throws Exception { ++ Image image = Toolkit.getDefaultToolkit().getImage((String) null); ++ MediaTracker mt = new MediaTracker(new Component() {}); ++ mt.addImage(image, 1); ++ mt.waitForID(1, 5000); ++ ++ int status = mt.statusID(1, false); ++ ++ System.out.println("Status: " + status); ++ ++ if (status != MediaTracker.ERRORED) { ++ throw new RuntimeException("MediaTracker.waitForID() hung."); ++ } ++ } ++} +--- ./jdk/test/java/awt/image/MultiResolutionImage/NSImageToMultiResolutionImageTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/image/MultiResolutionImage/NSImageToMultiResolutionImageTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,66 @@ ++/* ++ * 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.awt.Image; ++import java.awt.Toolkit; ++import sun.awt.OSInfo; ++import sun.awt.image.MultiResolutionImage; ++/* ++ * @test ++ * @bug 8033534 8035069 ++ * @summary [macosx] Get MultiResolution image from native system ++ * @author Alexander Scherbatiy ++ * @run main NSImageToMultiResolutionImageTest ++ */ ++ ++public class NSImageToMultiResolutionImageTest { ++ ++ public static void main(String[] args) throws Exception { ++ ++ if (OSInfo.getOSType() != OSInfo.OSType.MACOSX) { ++ return; ++ } ++ ++ String icon = "NSImage://NSApplicationIcon"; ++ final Image image = Toolkit.getDefaultToolkit().getImage(icon); ++ ++ if (!(image instanceof MultiResolutionImage)) { ++ throw new RuntimeException("Icon does not have resolution variants!"); ++ } ++ ++ MultiResolutionImage multiResolutionImage = (MultiResolutionImage) image; ++ ++ int width = 0; ++ int height = 0; ++ ++ for (Image resolutionVariant : multiResolutionImage.getResolutionVariants()) { ++ int rvWidth = resolutionVariant.getWidth(null); ++ int rvHeight = resolutionVariant.getHeight(null); ++ if (rvWidth < width || rvHeight < height) { ++ throw new RuntimeException("Resolution variants are not sorted!"); ++ } ++ width = rvWidth; ++ height = rvHeight; ++ } ++ } ++} +--- ./jdk/test/java/awt/image/MultiResolutionImageTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/image/MultiResolutionImageTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,620 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++import java.awt.Color; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.Image; ++import java.awt.Toolkit; ++import java.awt.image.BufferedImage; ++import java.io.File; ++import java.lang.reflect.Method; ++import java.net.URL; ++import javax.imageio.ImageIO; ++import sun.awt.OSInfo; ++import sun.awt.SunHints; ++import java.awt.MediaTracker; ++import java.awt.geom.AffineTransform; ++import java.awt.image.ImageObserver; ++import java.util.Arrays; ++import java.util.List; ++import javax.swing.JPanel; ++import sun.awt.SunToolkit; ++import sun.awt.image.MultiResolutionImage; ++ ++/** ++ * @test ++ * @bug 8011059 ++ * @author Alexander Scherbatiy ++ * @summary [macosx] Make JDK demos look perfect on retina displays ++ * @run main MultiResolutionImageTest CUSTOM ++ * @run main MultiResolutionImageTest TOOLKIT_PREPARE ++ * @run main MultiResolutionImageTest TOOLKIT_LOAD ++ * @run main MultiResolutionImageTest TOOLKIT ++ */ ++public class MultiResolutionImageTest { ++ ++ private static final int IMAGE_WIDTH = 300; ++ private static final int IMAGE_HEIGHT = 200; ++ private static final Color COLOR_1X = Color.GREEN; ++ private static final Color COLOR_2X = Color.BLUE; ++ private static final String IMAGE_NAME_1X = "image.png"; ++ private static final String IMAGE_NAME_2X = "image@2x.png"; ++ ++ public static void main(String[] args) throws Exception { ++ ++ System.out.println("args: " + args.length); ++ ++ if (args.length == 0) { ++ throw new RuntimeException("Not found a test"); ++ } ++ ++ String test = args[0]; ++ ++ System.out.println("TEST: " + test); ++ System.out.println("CHECK OS: " + checkOS()); ++ ++ if ("CUSTOM".equals(test)) { ++ testCustomMultiResolutionImage(); ++ } else if (checkOS()) { ++ switch (test) { ++ case "CUSTOM": ++ break; ++ case "TOOLKIT_PREPARE": ++ testToolkitMultiResolutionImagePrepare(); ++ break; ++ case "TOOLKIT_LOAD": ++ testToolkitMultiResolutionImageLoad(); ++ break; ++ case "TOOLKIT": ++ testToolkitMultiResolutionImage(); ++ testImageNameTo2xParsing(); ++ break; ++ default: ++ throw new RuntimeException("Unknown test: " + test); ++ } ++ } ++ } ++ ++ static boolean checkOS() { ++ return OSInfo.getOSType() == OSInfo.OSType.MACOSX; ++ } ++ ++ public static void testCustomMultiResolutionImage() { ++ testCustomMultiResolutionImage(false); ++ testCustomMultiResolutionImage(true); ++ } ++ ++ public static void testCustomMultiResolutionImage(boolean enableImageScaling) { ++ ++ Image image = new MultiResolutionBufferedImage(); ++ ++ // Same image size ++ BufferedImage bufferedImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, ++ BufferedImage.TYPE_INT_RGB); ++ Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics(); ++ setImageScalingHint(g2d, enableImageScaling); ++ g2d.drawImage(image, 0, 0, null); ++ checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false); ++ ++ // Twice image size ++ bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, ++ BufferedImage.TYPE_INT_RGB); ++ g2d = (Graphics2D) bufferedImage.getGraphics(); ++ setImageScalingHint(g2d, enableImageScaling); ++ g2d.drawImage(image, 0, 0, 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null); ++ checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling); ++ ++ // Scale 2x ++ bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); ++ g2d = (Graphics2D) bufferedImage.getGraphics(); ++ setImageScalingHint(g2d, enableImageScaling); ++ g2d.scale(2, 2); ++ g2d.drawImage(image, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null); ++ checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling); ++ ++ // Rotate ++ bufferedImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, ++ BufferedImage.TYPE_INT_RGB); ++ g2d = (Graphics2D) bufferedImage.getGraphics(); ++ setImageScalingHint(g2d, enableImageScaling); ++ g2d.drawImage(image, 0, 0, null); ++ g2d.rotate(Math.PI / 4); ++ checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false); ++ ++ // Scale 2x and Rotate ++ bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); ++ g2d = (Graphics2D) bufferedImage.getGraphics(); ++ setImageScalingHint(g2d, enableImageScaling); ++ g2d.scale(-2, 2); ++ g2d.rotate(-Math.PI / 10); ++ g2d.drawImage(image, -IMAGE_WIDTH, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null); ++ checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling); ++ ++ // General Transform ++ bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); ++ g2d = (Graphics2D) bufferedImage.getGraphics(); ++ setImageScalingHint(g2d, enableImageScaling); ++ float delta = 0.05f; ++ float cos = 1 - delta * delta / 2; ++ float sin = 1 + delta; ++ AffineTransform transform = new AffineTransform(2 * cos, 0.1, 0.3, -2 * sin, 10, -5); ++ g2d.setTransform(transform); ++ g2d.drawImage(image, 0, -IMAGE_HEIGHT, IMAGE_WIDTH, IMAGE_HEIGHT, null); ++ checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling); ++ ++ int D = 10; ++ // From Source to small Destination region ++ bufferedImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); ++ g2d = (Graphics2D) bufferedImage.getGraphics(); ++ setImageScalingHint(g2d, enableImageScaling); ++ g2d.drawImage(image, IMAGE_WIDTH / 2, IMAGE_HEIGHT / 2, IMAGE_WIDTH - D, IMAGE_HEIGHT - D, ++ D, D, IMAGE_WIDTH - D, IMAGE_HEIGHT - D, null); ++ checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false); ++ ++ // From Source to large Destination region ++ bufferedImage = new BufferedImage(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); ++ g2d = (Graphics2D) bufferedImage.getGraphics(); ++ setImageScalingHint(g2d, enableImageScaling); ++ g2d.drawImage(image, D, D, 2 * IMAGE_WIDTH - D, 2 * IMAGE_HEIGHT - D, ++ IMAGE_WIDTH / 2, IMAGE_HEIGHT / 2, IMAGE_WIDTH - D, IMAGE_HEIGHT - D, null); ++ checkColor(bufferedImage.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling); ++ } ++ ++ static class MultiResolutionBufferedImage extends BufferedImage ++ implements MultiResolutionImage { ++ ++ Image highResolutionImage; ++ ++ public MultiResolutionBufferedImage() { ++ super(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); ++ highResolutionImage = new BufferedImage( ++ 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); ++ draw(getGraphics(), 1); ++ draw(highResolutionImage.getGraphics(), 2); ++ } ++ ++ void draw(Graphics graphics, float resolution) { ++ Graphics2D g2 = (Graphics2D) graphics; ++ g2.scale(resolution, resolution); ++ g2.setColor((resolution == 1) ? COLOR_1X : COLOR_2X); ++ g2.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT); ++ } ++ ++ @Override ++ public Image getResolutionVariant(int width, int height) { ++ return ((width <= getWidth() && height <= getHeight())) ++ ? this : highResolutionImage; ++ } ++ ++ @Override ++ public List getResolutionVariants() { ++ return Arrays.asList(this, highResolutionImage); ++ } ++ } ++ ++ static void testToolkitMultiResolutionImagePrepare() throws Exception { ++ ++ generateImages(); ++ ++ File imageFile = new File(IMAGE_NAME_1X); ++ String fileName = imageFile.getAbsolutePath(); ++ ++ Image image = Toolkit.getDefaultToolkit().getImage(fileName); ++ ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ toolkit.prepareImage(image, IMAGE_WIDTH, IMAGE_HEIGHT, new LoadImageObserver(image)); ++ ++ testToolkitMultiResolutionImageLoad(image); ++ } ++ ++ static void testToolkitMultiResolutionImageLoad() throws Exception { ++ ++ generateImages(); ++ ++ File imageFile = new File(IMAGE_NAME_1X); ++ String fileName = imageFile.getAbsolutePath(); ++ Image image = Toolkit.getDefaultToolkit().getImage(fileName); ++ testToolkitMultiResolutionImageLoad(image); ++ } ++ ++ static void testToolkitMultiResolutionImageLoad(Image image) throws Exception { ++ ++ MediaTracker tracker = new MediaTracker(new JPanel()); ++ tracker.addImage(image, 0); ++ tracker.waitForID(0); ++ if (tracker.isErrorAny()) { ++ throw new RuntimeException("Error during image loading"); ++ } ++ tracker.removeImage(image, 0); ++ ++ testImageLoaded(image); ++ ++ int w = image.getWidth(null); ++ int h = image.getHeight(null); ++ ++ Image resolutionVariant = ((MultiResolutionImage) image) ++ .getResolutionVariant(2 * w, 2 * h); ++ ++ if (image == resolutionVariant) { ++ throw new RuntimeException("Resolution variant is not loaded"); ++ } ++ ++ testImageLoaded(resolutionVariant); ++ } ++ ++ static void testImageLoaded(Image image) { ++ ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ ++ int flags = toolkit.checkImage(image, IMAGE_WIDTH, IMAGE_WIDTH, new SilentImageObserver()); ++ if ((flags & (ImageObserver.FRAMEBITS | ImageObserver.ALLBITS)) == 0) { ++ throw new RuntimeException("Image is not loaded!"); ++ } ++ } ++ ++ static class SilentImageObserver implements ImageObserver { ++ ++ @Override ++ public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { ++ throw new RuntimeException("Observer should not be called!"); ++ } ++ } ++ ++ static class LoadImageObserver implements ImageObserver { ++ ++ Image image; ++ ++ public LoadImageObserver(Image image) { ++ this.image = image; ++ } ++ ++ @Override ++ public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { ++ ++ if (image != img) { ++ throw new RuntimeException("Original image is not passed to the observer"); ++ } ++ ++ if ((infoflags & ImageObserver.WIDTH) != 0) { ++ if (width != IMAGE_WIDTH) { ++ throw new RuntimeException("Original width is not passed to the observer"); ++ } ++ } ++ ++ if ((infoflags & ImageObserver.HEIGHT) != 0) { ++ if (height != IMAGE_HEIGHT) { ++ throw new RuntimeException("Original height is not passed to the observer"); ++ } ++ } ++ ++ return (infoflags & ALLBITS) == 0; ++ } ++ ++ } ++ ++ static void testToolkitMultiResolutionImage() throws Exception { ++ ++ generateImages(); ++ ++ File imageFile = new File(IMAGE_NAME_1X); ++ String fileName = imageFile.getAbsolutePath(); ++ URL url = imageFile.toURI().toURL(); ++ testToolkitMultiResolutionImageChache(fileName, url); ++ ++ Image image = Toolkit.getDefaultToolkit().getImage(fileName); ++ testToolkitImageObserver(image); ++ testToolkitMultiResolutionImage(image, false); ++ testToolkitMultiResolutionImage(image, true); ++ ++ image = Toolkit.getDefaultToolkit().getImage(url); ++ testToolkitImageObserver(image); ++ testToolkitMultiResolutionImage(image, false); ++ testToolkitMultiResolutionImage(image, true); ++ } ++ ++ static void testToolkitMultiResolutionImageChache(String fileName, URL url) { ++ ++ Image img1 = Toolkit.getDefaultToolkit().getImage(fileName); ++ if (!(img1 instanceof MultiResolutionImage)) { ++ throw new RuntimeException("Not a MultiResolutionImage"); ++ } ++ ++ Image img2 = Toolkit.getDefaultToolkit().getImage(fileName); ++ if (img1 != img2) { ++ throw new RuntimeException("Image is not cached"); ++ } ++ ++ img1 = Toolkit.getDefaultToolkit().getImage(url); ++ if (!(img1 instanceof MultiResolutionImage)) { ++ throw new RuntimeException("Not a MultiResolutionImage"); ++ } ++ ++ img2 = Toolkit.getDefaultToolkit().getImage(url); ++ if (img1 != img2) { ++ throw new RuntimeException("Image is not cached"); ++ } ++ } ++ ++ static void testToolkitMultiResolutionImage(Image image, boolean enableImageScaling) ++ throws Exception { ++ ++ MediaTracker tracker = new MediaTracker(new JPanel()); ++ tracker.addImage(image, 0); ++ tracker.waitForID(0); ++ if (tracker.isErrorAny()) { ++ throw new RuntimeException("Error during image loading"); ++ } ++ ++ final BufferedImage bufferedImage1x = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, ++ BufferedImage.TYPE_INT_RGB); ++ Graphics2D g1x = (Graphics2D) bufferedImage1x.getGraphics(); ++ setImageScalingHint(g1x, false); ++ g1x.drawImage(image, 0, 0, null); ++ checkColor(bufferedImage1x.getRGB(3 * IMAGE_WIDTH / 4, 3 * IMAGE_HEIGHT / 4), false); ++ ++ Image resolutionVariant = ((MultiResolutionImage) image). ++ getResolutionVariant(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT); ++ ++ if (resolutionVariant == null) { ++ throw new RuntimeException("Resolution variant is null"); ++ } ++ ++ MediaTracker tracker2x = new MediaTracker(new JPanel()); ++ tracker2x.addImage(resolutionVariant, 0); ++ tracker2x.waitForID(0); ++ if (tracker2x.isErrorAny()) { ++ throw new RuntimeException("Error during scalable image loading"); ++ } ++ ++ final BufferedImage bufferedImage2x = new BufferedImage(2 * IMAGE_WIDTH, ++ 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); ++ Graphics2D g2x = (Graphics2D) bufferedImage2x.getGraphics(); ++ setImageScalingHint(g2x, enableImageScaling); ++ g2x.drawImage(image, 0, 0, 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, null); ++ checkColor(bufferedImage2x.getRGB(3 * IMAGE_WIDTH / 2, 3 * IMAGE_HEIGHT / 2), enableImageScaling); ++ ++ if (!(image instanceof MultiResolutionImage)) { ++ throw new RuntimeException("Not a MultiResolutionImage"); ++ } ++ ++ MultiResolutionImage multiResolutionImage = (MultiResolutionImage) image; ++ ++ Image image1x = multiResolutionImage.getResolutionVariant(IMAGE_WIDTH, IMAGE_HEIGHT); ++ Image image2x = multiResolutionImage.getResolutionVariant(2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT); ++ ++ if (image1x.getWidth(null) * 2 != image2x.getWidth(null) ++ || image1x.getHeight(null) * 2 != image2x.getHeight(null)) { ++ throw new RuntimeException("Wrong resolution variant size"); ++ } ++ } ++ ++ static void testToolkitImageObserver(final Image image) { ++ ++ ImageObserver observer = new ImageObserver() { ++ ++ @Override ++ public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { ++ ++ if (img != image) { ++ throw new RuntimeException("Wrong image in observer"); ++ } ++ ++ if ((infoflags & (ImageObserver.ERROR | ImageObserver.ABORT)) != 0) { ++ throw new RuntimeException("Error during image loading"); ++ } ++ ++ return (infoflags & ImageObserver.ALLBITS) == 0; ++ ++ } ++ }; ++ ++ final BufferedImage bufferedImage2x = new BufferedImage(2 * IMAGE_WIDTH, ++ 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); ++ Graphics2D g2x = (Graphics2D) bufferedImage2x.getGraphics(); ++ setImageScalingHint(g2x, true); ++ ++ g2x.drawImage(image, 0, 0, 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, observer); ++ ++ } ++ ++ static void setImageScalingHint(Graphics2D g2d, boolean enableImageScaling) { ++ g2d.setRenderingHint(SunHints.KEY_RESOLUTION_VARIANT, enableImageScaling ++ ? SunHints.VALUE_RESOLUTION_VARIANT_ON ++ : SunHints.VALUE_RESOLUTION_VARIANT_OFF); ++ } ++ ++ static void checkColor(int rgb, boolean isImageScaled) { ++ ++ if (!isImageScaled && COLOR_1X.getRGB() != rgb) { ++ throw new RuntimeException("Wrong 1x color: " + new Color(rgb)); ++ } ++ ++ if (isImageScaled && COLOR_2X.getRGB() != rgb) { ++ throw new RuntimeException("Wrong 2x color" + new Color(rgb)); ++ } ++ } ++ ++ static void generateImages() throws Exception { ++ if (!new File(IMAGE_NAME_1X).exists()) { ++ generateImage(1); ++ } ++ ++ if (!new File(IMAGE_NAME_2X).exists()) { ++ generateImage(2); ++ } ++ } ++ ++ static void generateImage(int scale) throws Exception { ++ BufferedImage image = new BufferedImage(scale * IMAGE_WIDTH, scale * IMAGE_HEIGHT, ++ BufferedImage.TYPE_INT_RGB); ++ Graphics g = image.getGraphics(); ++ g.setColor(scale == 1 ? COLOR_1X : COLOR_2X); ++ g.fillRect(0, 0, scale * IMAGE_WIDTH, scale * IMAGE_HEIGHT); ++ File file = new File(scale == 1 ? IMAGE_NAME_1X : IMAGE_NAME_2X); ++ ImageIO.write(image, "png", file); ++ } ++ ++ static void testImageNameTo2xParsing() throws Exception { ++ ++ for (String[] testNames : TEST_FILE_NAMES) { ++ String testName = testNames[0]; ++ String goldenName = testNames[1]; ++ String resultName = getTestScaledImageName(testName); ++ ++ if (!isValidPath(testName) && resultName == null) { ++ continue; ++ } ++ ++ if (goldenName.equals(resultName)) { ++ continue; ++ } ++ ++ throw new RuntimeException("Test name " + testName ++ + ", result name: " + resultName); ++ } ++ ++ for (URL[] testURLs : TEST_URLS) { ++ URL testURL = testURLs[0]; ++ URL goldenURL = testURLs[1]; ++ URL resultURL = getTestScaledImageURL(testURL); ++ ++ if (!isValidPath(testURL.getPath()) && resultURL == null) { ++ continue; ++ } ++ ++ if (goldenURL.equals(resultURL)) { ++ continue; ++ } ++ ++ throw new RuntimeException("Test url: " + testURL ++ + ", result url: " + resultURL); ++ } ++ ++ } ++ ++ static URL getTestScaledImageURL(URL url) throws Exception { ++ Method method = getScalableImageMethod("getScaledImageURL", URL.class); ++ return (URL) method.invoke(null, url); ++ } ++ ++ static String getTestScaledImageName(String name) throws Exception { ++ Method method = getScalableImageMethod("getScaledImageName", String.class); ++ return (String) method.invoke(null, name); ++ } ++ ++ private static boolean isValidPath(String path) { ++ return !path.isEmpty() && !path.endsWith("/") && !path.endsWith(".") ++ && !path.contains("@2x"); ++ } ++ ++ private static Method getScalableImageMethod(String name, ++ Class... parameterTypes) throws Exception { ++ Toolkit toolkit = Toolkit.getDefaultToolkit(); ++ Method method = toolkit.getClass().getDeclaredMethod(name, parameterTypes); ++ method.setAccessible(true); ++ return method; ++ } ++ private static final String[][] TEST_FILE_NAMES; ++ private static final URL[][] TEST_URLS; ++ ++ static { ++ TEST_FILE_NAMES = new String[][]{ ++ {"", null}, ++ {".", null}, ++ {"..", null}, ++ {"/", null}, ++ {"/.", null}, ++ {"dir/", null}, ++ {"dir/.", null}, ++ {"aaa@2x.png", null}, ++ {"/dir/aaa@2x.png", null}, ++ {"image", "image@2x"}, ++ {"image.ext", "image@2x.ext"}, ++ {"image.aaa.ext", "image.aaa@2x.ext"}, ++ {"dir/image", "dir/image@2x"}, ++ {"dir/image.ext", "dir/image@2x.ext"}, ++ {"dir/image.aaa.ext", "dir/image.aaa@2x.ext"}, ++ {"dir/aaa.bbb/image", "dir/aaa.bbb/image@2x"}, ++ {"dir/aaa.bbb/image.ext", "dir/aaa.bbb/image@2x.ext"}, ++ {"dir/aaa.bbb/image.ccc.ext", "dir/aaa.bbb/image.ccc@2x.ext"}, ++ {"/dir/image", "/dir/image@2x"}, ++ {"/dir/image.ext", "/dir/image@2x.ext"}, ++ {"/dir/image.aaa.ext", "/dir/image.aaa@2x.ext"}, ++ {"/dir/aaa.bbb/image", "/dir/aaa.bbb/image@2x"}, ++ {"/dir/aaa.bbb/image.ext", "/dir/aaa.bbb/image@2x.ext"}, ++ {"/dir/aaa.bbb/image.ccc.ext", "/dir/aaa.bbb/image.ccc@2x.ext"} ++ }; ++ try { ++ TEST_URLS = new URL[][]{ ++ // file ++ {new URL("file:/aaa"), new URL("file:/aaa@2x")}, ++ {new URL("file:/aaa.ext"), new URL("file:/aaa@2x.ext")}, ++ {new URL("file:/aaa.bbb.ext"), new URL("file:/aaa.bbb@2x.ext")}, ++ {new URL("file:/ccc/aaa.bbb.ext"), ++ new URL("file:/ccc/aaa.bbb@2x.ext")}, ++ {new URL("file:/ccc.ddd/aaa.bbb.ext"), ++ new URL("file:/ccc.ddd/aaa.bbb@2x.ext")}, ++ {new URL("file:///~/image"), new URL("file:///~/image@2x")}, ++ {new URL("file:///~/image.ext"), ++ new URL("file:///~/image@2x.ext")}, ++ // http ++ {new URL("http://www.test.com"), null}, ++ {new URL("http://www.test.com/"), null}, ++ {new URL("http://www.test.com///"), null}, ++ {new URL("http://www.test.com/image"), ++ new URL("http://www.test.com/image@2x")}, ++ {new URL("http://www.test.com/image.ext"), ++ new URL("http://www.test.com/image@2x.ext")}, ++ {new URL("http://www.test.com/dir/image"), ++ new URL("http://www.test.com/dir/image@2x")}, ++ {new URL("http://www.test.com:80/dir/image.aaa.ext"), ++ new URL("http://www.test.com:80/dir/image.aaa@2x.ext")}, ++ {new URL("http://www.test.com:8080/dir/image.aaa.ext"), ++ new URL("http://www.test.com:8080/dir/image.aaa@2x.ext")}, ++ // jar ++ {new URL("jar:file:/dir/Java2D.jar!/image"), ++ new URL("jar:file:/dir/Java2D.jar!/image@2x")}, ++ {new URL("jar:file:/dir/Java2D.jar!/image.aaa.ext"), ++ new URL("jar:file:/dir/Java2D.jar!/image.aaa@2x.ext")}, ++ {new URL("jar:file:/dir/Java2D.jar!/images/image"), ++ new URL("jar:file:/dir/Java2D.jar!/images/image@2x")}, ++ {new URL("jar:file:/dir/Java2D.jar!/images/image.ext"), ++ new URL("jar:file:/dir/Java2D.jar!/images/image@2x.ext")}, ++ {new URL("jar:file:/aaa.bbb/Java2D.jar!/images/image.ext"), ++ new URL("jar:file:/aaa.bbb/Java2D.jar!/images/image@2x.ext")}, ++ {new URL("jar:file:/dir/Java2D.jar!/aaa.bbb/image.ext"), ++ new URL("jar:file:/dir/Java2D.jar!/aaa.bbb/image@2x.ext")},}; ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++ ++ static class PreloadedImageObserver implements ImageObserver { ++ ++ @Override ++ public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { ++ throw new RuntimeException("Image should be already preloaded"); ++ } ++ } ++} +--- ./jdk/test/java/awt/image/multiresolution/MultiResolutionToolkitImageTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/image/multiresolution/MultiResolutionToolkitImageTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,158 @@ ++/* ++ * 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.awt.Color; ++import java.awt.Graphics; ++import java.awt.Image; ++import java.awt.Toolkit; ++import java.awt.image.BufferedImage; ++import java.awt.image.ImageObserver; ++import static java.awt.image.ImageObserver.ALLBITS; ++import java.io.File; ++import javax.imageio.ImageIO; ++import sun.awt.OSInfo; ++import sun.awt.SunToolkit; ++import sun.awt.image.MultiResolutionToolkitImage; ++ ++/** ++ * @test ++ * @bug 8040291 ++ * @author Alexander Scherbatiy ++ * @summary [macosx] Http-Images are not fully loaded when using ImageIcon ++ * @run main MultiResolutionToolkitImageTest ++ */ ++public class MultiResolutionToolkitImageTest { ++ ++ private static final int IMAGE_WIDTH = 300; ++ private static final int IMAGE_HEIGHT = 200; ++ private static final Color COLOR_1X = Color.GREEN; ++ private static final Color COLOR_2X = Color.BLUE; ++ private static final String IMAGE_NAME_1X = "image.png"; ++ private static final String IMAGE_NAME_2X = "image@2x.png"; ++ private static final int WAIT_TIME = 400; ++ private static volatile boolean isImageLoaded = false; ++ private static volatile boolean isRVObserverCalled = false; ++ ++ public static void main(String[] args) throws Exception { ++ ++ if (!checkOS()) { ++ return; ++ } ++ generateImages(); ++ testToolkitMultiResolutionImageLoad(); ++ } ++ ++ static void testToolkitMultiResolutionImageLoad() throws Exception { ++ File imageFile = new File(IMAGE_NAME_1X); ++ String fileName = imageFile.getAbsolutePath(); ++ Image image = Toolkit.getDefaultToolkit().getImage(fileName); ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ toolkit.prepareImage(image, -1, -1, new LoadImageObserver()); ++ ++ final long time = WAIT_TIME + System.currentTimeMillis(); ++ while ((!isImageLoaded || !isRVObserverCalled) ++ && System.currentTimeMillis() < time) { ++ Thread.sleep(50); ++ } ++ ++ if(!isImageLoaded){ ++ throw new RuntimeException("Image is not loaded!"); ++ } ++ ++ if(!isRVObserverCalled){ ++ throw new RuntimeException("Resolution Variant observer is not called!"); ++ } ++ } ++ ++ static void generateImages() throws Exception { ++ if (!new File(IMAGE_NAME_1X).exists()) { ++ generateImage(1); ++ } ++ ++ if (!new File(IMAGE_NAME_2X).exists()) { ++ generateImage(2); ++ } ++ } ++ ++ static void generateImage(int scale) throws Exception { ++ BufferedImage image = new BufferedImage(scale * IMAGE_WIDTH, scale * IMAGE_HEIGHT, ++ BufferedImage.TYPE_INT_RGB); ++ Graphics g = image.getGraphics(); ++ g.setColor(scale == 1 ? COLOR_1X : COLOR_2X); ++ g.fillRect(0, 0, scale * IMAGE_WIDTH, scale * IMAGE_HEIGHT); ++ File file = new File(scale == 1 ? IMAGE_NAME_1X : IMAGE_NAME_2X); ++ ImageIO.write(image, "png", file); ++ } ++ ++ static boolean checkOS() { ++ return OSInfo.getOSType() == OSInfo.OSType.MACOSX; ++ } ++ ++ static class LoadImageObserver implements ImageObserver { ++ ++ @Override ++ public boolean imageUpdate(Image img, int infoflags, int x, int y, ++ int width, int height) { ++ ++ if (isRVObserver()) { ++ isRVObserverCalled = true; ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ Image resolutionVariant = getResolutionVariant(img); ++ int rvFlags = toolkit.checkImage(resolutionVariant, width, height, ++ new IdleImageObserver()); ++ if (rvFlags < infoflags) { ++ throw new RuntimeException("Info flags are greater than" ++ + " resolution varint info flags"); ++ } ++ } else if ((infoflags & ALLBITS) != 0) { ++ isImageLoaded = true; ++ } ++ ++ return (infoflags & ALLBITS) == 0; ++ } ++ } ++ ++ static boolean isRVObserver() { ++ Exception e = new Exception(); ++ ++ for (StackTraceElement elem : e.getStackTrace()) { ++ if (elem.getClassName().endsWith("MultiResolutionToolkitImage")) { ++ return true; ++ } ++ } ++ return false; ++ } ++ ++ static class IdleImageObserver implements ImageObserver { ++ ++ @Override ++ public boolean imageUpdate(Image img, int infoflags, int x, int y, ++ int width, int height) { ++ return false; ++ } ++ } ++ ++ static Image getResolutionVariant(Image image) { ++ return ((MultiResolutionToolkitImage) image).getResolutionVariant(); ++ } ++} +--- ./jdk/test/java/awt/regtesthelpers/Util.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/regtesthelpers/Util.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -51,6 +51,7 @@ + import java.awt.IllegalComponentStateException; + import java.awt.AWTException; + import java.awt.AWTEvent; ++import java.awt.Color; + + import java.awt.event.InputEvent; + import java.awt.event.WindowAdapter; +@@ -184,6 +185,57 @@ + } + } + ++ /** ++ * Tests whether screen pixel has the expected color performing several ++ * attempts. This method is useful for asynchronous window manager where ++ * it's impossible to determine when drawing actually takes place. ++ * ++ * @param x X position of pixel ++ * @param y Y position of pixel ++ * @param color expected color ++ * @param attempts number of attempts to undertake ++ * @param delay delay before each attempt ++ * @param robot a robot to use for retrieving pixel color ++ * @return true if pixel color matches the color expected, otherwise false ++ */ ++ public static boolean testPixelColor(int x, int y, final Color color, int attempts, int delay, final Robot robot) { ++ while (attempts-- > 0) { ++ robot.delay(delay); ++ Color screen = robot.getPixelColor(x, y); ++ if (screen.equals(color)) { ++ return true; ++ } ++ } ++ return false; ++ } ++ ++ /** ++ * Tests whether the area within boundaries has the expected color ++ * performing several attempts. This method is useful for asynchronous ++ * window manager where it's impossible to determine when drawing actually ++ * takes place. ++ * ++ * @param bounds position of area ++ * @param color expected color ++ * @param attempts number of attempts to undertake ++ * @param delay delay before each attempt ++ * @param robot a robot to use for retrieving pixel color ++ * @return true if area color matches the color expected, otherwise false ++ */ ++ public static boolean testBoundsColor(final Rectangle bounds, final Color color, int attempts, int delay, final Robot robot) { ++ int right = bounds.x + bounds.width - 1; ++ int bottom = bounds.y + bounds.height - 1; ++ while (attempts-- > 0) { ++ if (testPixelColor(bounds.x, bounds.y, color, 1, delay, robot) ++ && testPixelColor(right, bounds.y, color, 1, 0, robot) ++ && testPixelColor(right, bottom, color, 1, 0, robot) ++ && testPixelColor(bounds.x, bottom, color, 1, 0, robot)) { ++ return true; ++ } ++ } ++ return false; ++ } ++ + public static void waitForIdle(final Robot robot) { + // we do not use robot for now, use SunToolkit.realSync() instead + ((sun.awt.SunToolkit)Toolkit.getDefaultToolkit()).realSync(); +--- ./jdk/test/java/awt/regtesthelpers/process/ProcessCommunicator.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/awt/regtesthelpers/process/ProcessCommunicator.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2007, 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 +@@ -25,21 +25,22 @@ + + import java.io.*; + +-/** This class is created to solve interprocess communication problems. ++/** ++ * This class is created to solve interprocess communication problems. + * When you need to write a regression test which should verify inter jvm + * behavior such as DnD data transfer, Clipboard data transfer, focus + * transfer etc., you could use the next scenario: + * + * 1. Write an implementation for the parent JVM, using applet test. +- * 2. Write an implimentation for the child JVM or native application, using ++ * 2. Write an implementation for the child JVM or native application, using + * main() function. + * 3. Execute child process using ProcessCommunicator.executeChildProcess() + * method. +- * 4. You can decide whetherthe test is passed on the basis of ++ * 4. You can decide whether the test is passed on the basis of + * ProcessResults class data. + * +- * Note: The class is not thread safe. You should access its methods only from the same +- * thread. ++ * Note: The class is not thread safe. You should access its methods only from ++ * the same thread. + */ + + public class ProcessCommunicator { +@@ -48,31 +49,34 @@ + private static final String javaPath = javaHome + File.separator + "bin" + + File.separator + "java "; + private static String command = ""; ++ private static volatile Process process; + + private ProcessCommunicator() {} + +- /** The same as {#link #executeChildProcess(Class,String)} except +- * the {@code classPathArgument} parameter. The class path +- * parameter is for the debug purposes ++ /** ++ * The same as {#link #executeChildProcess(Class,String)} except ++ * the {@code classPathArgument} parameter. The class path ++ * parameter is for the debug purposes + * +- * @param classToExecute is passed to the child JVM +- * @param classPathArguments class path for the child JVM +- * @param args arguments that will be passed to the executed class +- * @return results of the executed {@code Process} ++ * @param classToExecute is passed to the child JVM ++ * @param classPathArguments class path for the child JVM ++ * @param args arguments that will be passed to the executed class ++ * @return results of the executed {@code Process} + */ + public static ProcessResults executeChildProcess(final Class classToExecute, + final String classPathArguments, final String [] args) + { + try { + String command = buildCommand(classToExecute, classPathArguments, args); +- Process process = Runtime.getRuntime().exec(command); ++ process = Runtime.getRuntime().exec(command); + return doWaitFor(process); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +- /** Executes child {code Process} ++ /** ++ * Executes child {code Process} + * + * @param classToExecute class to be executed as a child java process + * @param args args to be passed in to the child process +@@ -86,11 +90,11 @@ + + /** + * Waits for a process and return its results. +- * This is a workaround for Process.waitFor() never returning. ++ * This is a workaround for {@code Process.waitFor()} never returning. + * + * @return results of the executed {@code Process} + */ +- private static ProcessResults doWaitFor(final Process p) { ++ public static ProcessResults doWaitFor(final Process p) { + ProcessResults pres = new ProcessResults(); + + final InputStream in; +@@ -133,13 +137,14 @@ + return pres; + } + +- /** Builds command on the basis of the passed class name, +- * class path and arguments. ++ /** ++ * Builds command on the basis of the passed class name, ++ * class path and arguments. + * + * @param classToExecute with class will be executed in the new JVM + * @param classPathArguments java class path (only for test purposes) + * @param args arguments for the new application. This could be used +- * to pass some information from the parnent to child JVM. ++ * to pass some information from the parent to child JVM. + * @return command to execute the {@code Process} + */ + private static String buildCommand(final Class classToExecute, +@@ -162,11 +167,24 @@ + return command; + } + +- /** Could be used for the debug purposes. ++ /** ++ * Could be used for the debug purposes. + * +- * @return command that was build to execute the child process ++ * @return command that was build to execute the child process + */ + public static String getExecutionCommand () { + return command; + } ++ ++ /** ++ * Terminates the process created by {@code executeChildProcess} methods. ++ */ ++ public static void destroyProcess() { ++ if (process != null) { ++ if (process.isAlive()) { ++ process.destroy(); ++ } ++ process = null; ++ } ++ } + } +--- ./jdk/test/java/beans/Introspector/Test8039776.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/beans/Introspector/Test8039776.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,64 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.util.Set; ++import java.util.SortedSet; ++ ++import static java.beans.Introspector.getBeanInfo; ++ ++/* ++ * @test ++ * @bug 8039776 ++ * @summary Tests that Introspector does not throw NPE ++ * @author Sergey Malenkov ++ */ ++ ++public class Test8039776 { ++ public static void main(String[] args) throws Exception { ++ getBeanInfo(Base.class, Object.class); ++ getBeanInfo(Child.class, Base.class); ++ getBeanInfo(Child.class, Object.class); ++ } ++ ++ public static class Base { ++ private SortedSet value; ++ ++ public Set getValue() { ++ return this.value; ++ } ++ ++ public void setValue(SortedSet value) { ++ this.value = value; ++ } ++ } ++ ++ public static class Child extends Base { ++ public Set getValue() { ++ return super.getValue(); ++ } ++ ++ public void setValue(SortedSet items) { ++ super.setValue(items); ++ } ++ } ++} +--- ./jdk/test/java/beans/Introspector/Test8040656.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/beans/Introspector/Test8040656.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,311 @@ ++/* ++ * 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.beans.Introspector; ++import java.beans.MethodDescriptor; ++ ++/* ++ * @test ++ * @bug 8040656 ++ * @summary Tests that a normal method is preferred to a synthetic one ++ * @author Sergey Malenkov ++ */ ++ ++public class Test8040656 { ++ public static void main(String[] args) throws Exception { ++ test(String.class, C.class); ++ test(String.class, C1.class); ++ test(String.class, C2.class); ++ test(String.class, C3.class); ++ test(String.class, C4.class); ++ test(String.class, C5.class); ++ test(String.class, C6.class); ++ test(String.class, C7.class); ++ test(String.class, C8.class); ++ test(String.class, C9.class); ++ } ++ ++ private static void test(Class type, Class bean) throws Exception { ++ for (MethodDescriptor md : Introspector.getBeanInfo(bean).getMethodDescriptors()) { ++ if (md.getName().equals("getFoo")) { ++ if (type != md.getMethod().getReturnType()) { ++ throw new Error("unexpected type"); ++ } ++ } ++ } ++ } ++ ++ public interface A { ++ public Object getFoo(); ++ } ++ ++ public class C implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ } ++ ++ public class C1 implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ ++ public String getFoo1() { ++ return null; ++ } ++ } ++ ++ public class C2 implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ ++ public String getFoo1() { ++ return null; ++ } ++ ++ public String getFoo2() { ++ return null; ++ } ++ } ++ ++ public class C3 implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ ++ public String getFoo1() { ++ return null; ++ } ++ ++ public String getFoo2() { ++ return null; ++ } ++ ++ public String getFoo3() { ++ return null; ++ } ++ } ++ ++ public class C4 implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ ++ public String getFoo1() { ++ return null; ++ } ++ ++ public String getFoo2() { ++ return null; ++ } ++ ++ public String getFoo3() { ++ return null; ++ } ++ ++ public String getFoo4() { ++ return null; ++ } ++ } ++ ++ public class C5 implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ ++ public String getFoo1() { ++ return null; ++ } ++ ++ public String getFoo2() { ++ return null; ++ } ++ ++ public String getFoo3() { ++ return null; ++ } ++ ++ public String getFoo4() { ++ return null; ++ } ++ ++ public String getFoo5() { ++ return null; ++ } ++ } ++ ++ public class C6 implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ ++ public String getFoo1() { ++ return null; ++ } ++ ++ public String getFoo2() { ++ return null; ++ } ++ ++ public String getFoo3() { ++ return null; ++ } ++ ++ public String getFoo4() { ++ return null; ++ } ++ ++ public String getFoo5() { ++ return null; ++ } ++ ++ public String getFoo6() { ++ return null; ++ } ++ } ++ ++ public class C7 implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ ++ public String getFoo1() { ++ return null; ++ } ++ ++ public String getFoo2() { ++ return null; ++ } ++ ++ public String getFoo3() { ++ return null; ++ } ++ ++ public String getFoo4() { ++ return null; ++ } ++ ++ public String getFoo5() { ++ return null; ++ } ++ ++ public String getFoo6() { ++ return null; ++ } ++ ++ public String getFoo7() { ++ return null; ++ } ++ } ++ ++ public class C8 implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ ++ public String getFoo1() { ++ return null; ++ } ++ ++ public String getFoo2() { ++ return null; ++ } ++ ++ public String getFoo3() { ++ return null; ++ } ++ ++ public String getFoo4() { ++ return null; ++ } ++ ++ public String getFoo5() { ++ return null; ++ } ++ ++ public String getFoo6() { ++ return null; ++ } ++ ++ public String getFoo7() { ++ return null; ++ } ++ ++ public String getFoo8() { ++ return null; ++ } ++ } ++ ++ public class C9 implements A { ++ @Override ++ public String getFoo() { ++ return null; ++ } ++ ++ public String getFoo1() { ++ return null; ++ } ++ ++ public String getFoo2() { ++ return null; ++ } ++ ++ public String getFoo3() { ++ return null; ++ } ++ ++ public String getFoo4() { ++ return null; ++ } ++ ++ public String getFoo5() { ++ return null; ++ } ++ ++ public String getFoo6() { ++ return null; ++ } ++ ++ public String getFoo7() { ++ return null; ++ } ++ ++ public String getFoo8() { ++ return null; ++ } ++ ++ public String getFoo9() { ++ return null; ++ } ++ } ++} +--- ./jdk/test/java/beans/Introspector/TestCacheRecursion.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/beans/Introspector/TestCacheRecursion.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,83 @@ ++/* ++ * 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 com.sun.beans.util.Cache; ++ ++/* ++ * @test ++ * @bug 8039137 ++ * @summary Tests Cache recursion ++ * @author Sergey Malenkov ++ * @compile -XDignore.symbol.file TestCacheRecursion.java ++ * @run main TestCacheRecursion ++ */ ++ ++public class TestCacheRecursion { ++ private static boolean ERROR; ++ private static final Cache,Boolean> CACHE ++ = new Cache,Boolean>(Cache.Kind.WEAK, Cache.Kind.STRONG) { ++ @Override ++ public Boolean create(Class type) { ++ if (ERROR) { ++ throw new Error("not initialized"); ++ } ++ type = type.getSuperclass(); ++ return (type != null) && get(type); ++ } ++ }; ++ ++ public static void main(String[] args) { ++ CACHE.get(Z.class); ++ ERROR = true; ++ for (Class type = Z.class; type != null; type = type.getSuperclass()) { ++ CACHE.get(type); ++ } ++ } ++ ++ private class A {} ++ private class B extends A {} ++ private class C extends B {} ++ private class D extends C {} ++ private class E extends D {} ++ private class F extends E {} ++ private class G extends F {} ++ private class H extends G {} ++ private class I extends H {} ++ private class J extends I {} ++ private class K extends J {} ++ private class L extends K {} ++ private class M extends L {} ++ private class N extends M {} ++ private class O extends N {} ++ private class P extends O {} ++ private class Q extends P {} ++ private class R extends Q {} ++ private class S extends R {} ++ private class T extends S {} ++ private class U extends T {} ++ private class V extends U {} ++ private class W extends V {} ++ private class X extends W {} ++ private class Y extends X {} ++ private class Z extends Y {} ++} +--- ./jdk/test/java/io/BufferedInputStream/LargeCopyWithMark.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/io/BufferedInputStream/LargeCopyWithMark.java Wed Jul 30 18:42:59 2014 +0100 +@@ -26,6 +26,7 @@ + * @summary BufferedInputStream calculates negative array size with large + * streams and mark + * @library /lib/testlibrary ++ * @build jdk.testlibrary.* + * @run main/othervm LargeCopyWithMark + */ + +--- ./jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -45,7 +45,7 @@ + # Need to determine the classpath separator and filepath separator based on the + # operating system. + case "$OS" in +-SunOS | Linux | Darwin ) ++SunOS | Linux | Darwin | AIX ) + PS=":" ;; + Windows* | CYGWIN* ) + PS=";" ;; +--- ./jdk/test/java/io/Serializable/serialver/classpath/run.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/io/Serializable/serialver/classpath/run.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -47,7 +47,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" ;; + Windows* | CYGWIN* ) + PS=";" ;; +--- ./jdk/test/java/io/Serializable/serialver/nested/run.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/io/Serializable/serialver/nested/run.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -47,7 +47,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" ;; + Windows* | CYGWIN* ) + PS=";" ;; +--- ./jdk/test/java/io/Serializable/unresolvableObjectStreamClass/UnresolvableObjectStreamClass.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/io/Serializable/unresolvableObjectStreamClass/UnresolvableObjectStreamClass.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,68 @@ ++/* ++ * 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 8039396 ++ * @run main UnresolvableObjectStreamClass serialize ++ * @clean MySerializable ++ * @run main UnresolvableObjectStreamClass deserialize ++ * ++ * @summary NPE when writing a class descriptor object to a custom ++ * ObjectOutputStream ++ */ ++ ++import java.io.*; ++ ++public class UnresolvableObjectStreamClass { ++ public static void main(String[] args) throws Throwable { ++ if (args.length > 0 && args[0].equals("serialize")) { ++ try (FileOutputStream fos = new FileOutputStream("temp1.ser"); ++ ObjectOutputStream oos = new ObjectOutputStream(fos)) { ++ ObjectStreamClass osc = ++ ObjectStreamClass.lookup(MySerializable.class); ++ oos.writeObject(osc); ++ } ++ } else if (args.length > 0 && args[0].equals("deserialize")) { ++ try (FileInputStream fis = new FileInputStream("temp1.ser"); ++ ObjectInputStream ois = new ObjectInputStream(fis); ++ FileOutputStream fos = new FileOutputStream("temp2.ser"); ++ ObjectOutputStream oos = new ObjectOutputStream(fos) { ++ /*must be subclassed*/}) { ++ ObjectStreamClass osc = (ObjectStreamClass)ois.readObject(); ++ // serialize it again ++ try { ++ oos.writeObject(osc); ++ } catch (NullPointerException e) { ++ throw new RuntimeException("Failed to write" + ++ " unresolvable ObjectStreamClass", e); ++ } ++ } ++ } else { ++ throw new RuntimeException("The command line option must be" + ++ " one of: serialize or deserialize"); ++ } ++ } ++} ++ ++class MySerializable implements Serializable { ++} +--- ./jdk/test/java/lang/ClassLoader/Assert.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/ClassLoader/Assert.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -23,6 +23,21 @@ + + # + ++OS=`uname -s` ++case "$OS" in ++ SunOS | Linux | Darwin ) ++ FS="/" ++ CHMOD="${FS}bin${FS}chmod" ++ ;; ++ Windows* | CYGWIN* ) ++ CHMOD="chmod" ++ ;; ++ * ) ++ echo "Unrecognized system!" ++ exit 1; ++ ;; ++esac ++ + if [ "${TESTSRC}" = "" ] + then + echo "TESTSRC not set. Test cannot execute. Failed." +@@ -50,6 +65,7 @@ + cp ${TESTSRC}/Assert.java . + cp -R ${TESTSRC}/package1 . + cp -R ${TESTSRC}/package2 . ++${CHMOD} -R u+w * + + ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} Assert.java + +--- ./jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -58,6 +58,9 @@ + Darwin ) + FS="/" + ;; ++ AIX ) ++ FS="/" ++ ;; + Windows*) + FS="\\" + ;; +--- ./jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -63,6 +63,9 @@ + Darwin ) + FS="/" + ;; ++ AIX ) ++ FS="/" ++ ;; + Windows* | CYGWIN* ) + FS="\\" + ;; +--- ./jdk/test/java/lang/ProcessBuilder/Basic.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/ProcessBuilder/Basic.java Wed Jul 30 18:42:59 2014 +0100 +@@ -58,6 +58,9 @@ + /* used for Mac OS X only */ + static final String cfUserTextEncoding = System.getenv("__CF_USER_TEXT_ENCODING"); + ++ /* used for AIX only */ ++ static final String libpath = System.getenv("LIBPATH"); ++ + private static String commandOutput(Reader r) throws Throwable { + StringBuilder sb = new StringBuilder(); + int c; +@@ -75,7 +78,11 @@ + String output = commandOutput(r); + equal(p.waitFor(), 0); + equal(p.exitValue(), 0); +- return output; ++ // The debug/fastdebug versions of the VM may write some warnings to stdout ++ // (i.e. "Warning: Cannot open log file: hotspot.log" if the VM is started ++ // in a directory without write permissions). These warnings will confuse tests ++ // which match the entire output of the child process so better filter them out. ++ return output.replaceAll("Warning:.*\\n", ""); + } + + private static String commandOutput(ProcessBuilder pb) { +@@ -585,6 +592,12 @@ + System.getProperty("os.name").startsWith("Windows"); + } + ++ static class AIX { ++ public static boolean is() { return is; } ++ private static final boolean is = ++ System.getProperty("os.name").equals("AIX"); ++ } ++ + static class Unix { + public static boolean is() { return is; } + private static final boolean is = +@@ -638,7 +651,7 @@ + + private static boolean isEnglish(String envvar) { + String val = getenv(envvar); +- return (val == null) || val.matches("en.*"); ++ return (val == null) || val.matches("en.*") || val.matches("C"); + } + + /** Returns true if we can expect English OS error strings */ +@@ -713,6 +726,14 @@ + return cleanedVars.replace(javaMainClassStr,""); + } + ++ /* Only used for AIX -- ++ * AIX adds the variable AIXTHREAD_GUARDPAGES=0 to the environment. ++ * Remove it from the list of env variables ++ */ ++ private static String removeAixExpectedVars(String vars) { ++ return vars.replace("AIXTHREAD_GUARDPAGES=0,",""); ++ } ++ + private static String sortByLinesWindowsly(String text) { + String[] lines = text.split("\n"); + Arrays.sort(lines, new WindowsComparator()); +@@ -1161,13 +1182,20 @@ + ProcessBuilder pb = new ProcessBuilder(); + pb.environment().clear(); + String expected = Windows.is() ? "SystemRoot="+systemRoot+",": ""; ++ expected = AIX.is() ? "LIBPATH="+libpath+",": expected; + if (Windows.is()) { + pb.environment().put("SystemRoot", systemRoot); + } ++ if (AIX.is()) { ++ pb.environment().put("LIBPATH", libpath); ++ } + String result = getenvInChild(pb); + if (MacOSX.is()) { + result = removeMacExpectedVars(result); + } ++ if (AIX.is()) { ++ result = removeAixExpectedVars(result); ++ } + equal(result, expected); + } catch (Throwable t) { unexpected(t); } + +@@ -1682,10 +1710,14 @@ + } + Process p = Runtime.getRuntime().exec(cmdp, envp); + String expected = Windows.is() ? "=C:=\\,=ExitValue=3,SystemRoot="+systemRoot+"," : "=C:=\\,"; ++ expected = AIX.is() ? expected + "LIBPATH="+libpath+",": expected; + String commandOutput = commandOutput(p); + if (MacOSX.is()) { + commandOutput = removeMacExpectedVars(commandOutput); + } ++ if (AIX.is()) { ++ commandOutput = removeAixExpectedVars(commandOutput); ++ } + equal(commandOutput, expected); + if (Windows.is()) { + ProcessBuilder pb = new ProcessBuilder(childArgs); +@@ -1737,9 +1769,14 @@ + if (MacOSX.is()) { + commandOutput = removeMacExpectedVars(commandOutput); + } ++ if (AIX.is()) { ++ commandOutput = removeAixExpectedVars(commandOutput); ++ } + check(commandOutput.equals(Windows.is() + ? "LC_ALL=C,SystemRoot="+systemRoot+"," +- : "LC_ALL=C,"), ++ : AIX.is() ++ ? "LC_ALL=C,LIBPATH="+libpath+"," ++ : "LC_ALL=C,"), + "Incorrect handling of envstrings containing NULs"); + } catch (Throwable t) { unexpected(t); } + +@@ -2016,8 +2053,13 @@ + if (Unix.is() + && new File("/bin/bash").exists() + && new File("/bin/sleep").exists()) { +- final String[] cmd = { "/bin/bash", "-c", "(/bin/sleep 6666)" }; +- final String[] cmdkill = { "/bin/bash", "-c", "(/usr/bin/pkill -f \"sleep 6666\")" }; ++ // Notice that we only destroy the process created by us (i.e. ++ // our child) but not our grandchild (i.e. '/bin/sleep'). So ++ // pay attention that the grandchild doesn't run too long to ++ // avoid polluting the process space with useless processes. ++ // Running the grandchild for 60s should be more than enough. ++ final String[] cmd = { "/bin/bash", "-c", "(/bin/sleep 60)" }; ++ final String[] cmdkill = { "/bin/bash", "-c", "(/usr/bin/pkill -f \"sleep 60\")" }; + final ProcessBuilder pb = new ProcessBuilder(cmd); + final Process p = pb.start(); + final InputStream stdout = p.getInputStream(); +@@ -2039,13 +2081,27 @@ + reader.start(); + Thread.sleep(100); + p.destroy(); +- // Subprocess is now dead, but file descriptors remain open. + check(p.waitFor() != 0); + check(p.exitValue() != 0); ++ // Subprocess is now dead, but file descriptors remain open. ++ // Make sure the test will fail if we don't manage to close ++ // the open streams within 30 seconds. Notice that this time ++ // must be shorter than the sleep time of the grandchild. ++ Timer t = new Timer("test/java/lang/ProcessBuilder/Basic.java process reaper", true); ++ t.schedule(new TimerTask() { ++ public void run() { ++ fail("Subprocesses which create subprocesses of " + ++ "their own caused the parent to hang while " + ++ "waiting for file descriptors to be closed."); ++ System.exit(-1); ++ } ++ }, 30000); + stdout.close(); + stderr.close(); + stdin.close(); + new ProcessBuilder(cmdkill).start(); ++ // All streams successfully closed so we can cancel the timer. ++ t.cancel(); + //---------------------------------------------------------- + // There remain unsolved issues with asynchronous close. + // Here's a highly non-portable experiment to demonstrate: +@@ -2191,8 +2247,9 @@ + } + long end = System.nanoTime(); + // give waitFor(timeout) a wide berth (100ms) +- if ((end - start) > 100000000) +- fail("Test failed: waitFor took too long"); ++ // Old AIX machines my need a little longer. ++ if ((end - start) > 100000000L * (AIX.is() ? 4 : 1)) ++ fail("Test failed: waitFor took too long (" + (end - start) + "ns)"); + + p.destroy(); + p.waitFor(); +@@ -2219,7 +2276,7 @@ + + long end = System.nanoTime(); + if ((end - start) < 500000000) +- fail("Test failed: waitFor didn't take long enough"); ++ fail("Test failed: waitFor didn't take long enough (" + (end - start) + "ns)"); + + p.destroy(); + +@@ -2227,7 +2284,7 @@ + p.waitFor(1000, TimeUnit.MILLISECONDS); + end = System.nanoTime(); + if ((end - start) > 900000000) +- fail("Test failed: waitFor took too long on a dead process."); ++ fail("Test failed: waitFor took too long on a dead process. (" + (end - start) + "ns)"); + } catch (Throwable t) { unexpected(t); } + + //---------------------------------------------------------------- +--- ./jdk/test/java/lang/ProcessBuilder/CloseRace.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/ProcessBuilder/CloseRace.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,176 @@ ++/* ++ * Copyright (c) 2013, 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 8024521 ++ * @summary Closing ProcessPipeInputStream at the time the process exits is racy ++ * and leads to data corruption. Run this test manually (as ++ * an ordinary java program) with -Xmx8M to repro bug 8024521. ++ * @run main/othervm -Xmx8M -Dtest.duration=2 CloseRace ++ */ ++ ++import java.io.*; ++import java.util.ArrayList; ++import java.util.List; ++import java.util.Map; ++import java.util.concurrent.CountDownLatch; ++ ++public class CloseRace { ++ private static final String BIG_FILE = "bigfile"; ++ ++ private static final int[] procFDs = new int[6]; ++ ++ /** default value sufficient to repro bug 8024521. */ ++ private static final int testDurationSeconds ++ = Integer.getInteger("test.duration", 600); ++ ++ private static final CountDownLatch threadsStarted ++ = new CountDownLatch(2); ++ ++ static boolean fdInUse(int i) { ++ return new File("/proc/self/fd/" + i).exists(); ++ } ++ ++ static boolean[] procFDsInUse() { ++ boolean[] inUse = new boolean[procFDs.length]; ++ for (int i = 0; i < procFDs.length; i++) ++ inUse[i] = fdInUse(procFDs[i]); ++ return inUse; ++ } ++ ++ static int count(boolean[] bits) { ++ int count = 0; ++ for (int i = 0; i < bits.length; i++) ++ count += bits[i] ? 1 : 0; ++ return count; ++ } ++ ++ static void dumpAllStacks() { ++ System.err.println("Start of dump"); ++ final Map allStackTraces ++ = Thread.getAllStackTraces(); ++ for (Thread thread : allStackTraces.keySet()) { ++ System.err.println("Thread " + thread.getName()); ++ for (StackTraceElement element : allStackTraces.get(thread)) ++ System.err.println("\t" + element); ++ } ++ System.err.println("End of dump"); ++ } ++ ++ public static void main(String args[]) throws Exception { ++ if (!(new File("/proc/self/fd").isDirectory())) ++ return; ++ ++ // Catch Errors from process reaper ++ Thread.setDefaultUncaughtExceptionHandler ++ ((t, e) -> { e.printStackTrace(); System.exit(1); }); ++ ++ try (RandomAccessFile f = new RandomAccessFile(BIG_FILE, "rw")) { ++ f.setLength(Runtime.getRuntime().maxMemory()); // provoke OOME ++ } ++ ++ for (int i = 0, j = 0; j < procFDs.length; i++) ++ if (!fdInUse(i)) ++ procFDs[j++] = i; ++ ++ Thread[] threads = { ++ new Thread(new OpenLoop()), ++ new Thread(new ExecLoop()), ++ }; ++ for (Thread thread : threads) ++ thread.start(); ++ ++ threadsStarted.await(); ++ Thread.sleep(testDurationSeconds * 1000); ++ ++ for (Thread thread : threads) ++ thread.interrupt(); ++ for (Thread thread : threads) { ++ thread.join(10_000); ++ if (thread.isAlive()) { ++ dumpAllStacks(); ++ throw new Error("At least one child thread (" ++ + thread.getName() ++ + ") failed to finish gracefully"); ++ } ++ } ++ } ++ ++ static class OpenLoop implements Runnable { ++ public void run() { ++ threadsStarted.countDown(); ++ while (!Thread.interrupted()) { ++ try { ++ // wait for ExecLoop to finish creating process ++ do { ++ if (Thread.interrupted()) ++ return; ++ } while (count(procFDsInUse()) != 3); ++ List iss = new ArrayList<>(4); ++ ++ // eat up three "holes" (closed ends of pipe fd pairs) ++ for (int i = 0; i < 3; i++) ++ iss.add(new FileInputStream(BIG_FILE)); ++ do { ++ if (Thread.interrupted()) ++ return; ++ } while (count(procFDsInUse()) == procFDs.length); ++ // hopefully this will racily occupy empty fd slot ++ iss.add(new FileInputStream(BIG_FILE)); ++ Thread.sleep(1); // Widen race window ++ for (InputStream is : iss) ++ is.close(); ++ } catch (InterruptedException e) { ++ break; ++ } catch (Exception e) { ++ throw new Error(e); ++ } ++ } ++ } ++ } ++ ++ static class ExecLoop implements Runnable { ++ public void run() { ++ threadsStarted.countDown(); ++ ProcessBuilder builder = new ProcessBuilder("/bin/true"); ++ while (!Thread.interrupted()) { ++ try { ++ // wait for OpenLoop to finish ++ do { ++ if (Thread.interrupted()) ++ return; ++ } while (count(procFDsInUse()) > 0); ++ Process process = builder.start(); ++ InputStream is = process.getInputStream(); ++ process.waitFor(); ++ is.close(); ++ } catch (InterruptedException e) { ++ break; ++ } catch (Exception e) { ++ throw new Error(e); ++ } ++ } ++ } ++ } ++} +--- ./jdk/test/java/lang/ProcessBuilder/DestroyTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/ProcessBuilder/DestroyTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -154,6 +154,9 @@ + } else if (osName.equals("SunOS")) { + return new UnixTest( + File.createTempFile("ProcessTrap-", ".sh",null)); ++ } else if (osName.equals("AIX")) { ++ return new UnixTest( ++ File.createTempFile("ProcessTrap-", ".sh",null)); + } + return null; + } +--- ./jdk/test/java/lang/Runtime/exec/CloseRace.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/Runtime/exec/CloseRace.java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,146 +0,0 @@ +-/* +- * Copyright (c) 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. +- */ +- +-/** +- * @test +- * @bug 8024521 +- * @summary Closing ProcessPipeInputStream at the time the process exits is racy +- * and leads to the data corruption. +- * @library /lib/testlibrary +- * @run main/othervm/timeout=80 CloseRace +- */ +- +-/** +- * This test has a little chance to catch the race during the given default +- * time gap of 20 seconds. To increase the time gap, set the system property +- * CloseRaceTimeGap=N to the number of seconds. +- * Jtreg's timeoutFactor should also be set appropriately. +- * +- * For example, to run the test for 10 minutes: +- * > jtreg \ +- * -testjdk:$(PATH_TO_TESTED_JDK) \ +- * -timeoutFactor:10 \ +- * -DCloseRaceTimeGap=600 \ +- * $(PATH_TO_TESTED_JDK_SOURCE)/test/java/lang/Runtime/exec/CloseRace.java +- */ +- +-import java.io.*; +-import java.nio.file.Files; +-import java.nio.file.Path; +-import java.nio.file.Paths; +-import java.util.ArrayList; +-import java.util.Arrays; +-import java.util.LinkedList; +-import java.util.List; +-import jdk.testlibrary.OutputAnalyzer; +-import static jdk.testlibrary.ProcessTools.*; +- +-public class CloseRace { +- +- public static void main(String args[]) throws Exception { +- ProcessBuilder pb = createJavaProcessBuilder("-Xmx64M", "CloseRace$Child", +- System.getProperty("CloseRaceTimeGap", "20")); +- OutputAnalyzer oa = new OutputAnalyzer(pb.start()); +- oa.stderrShouldNotContain("java.lang.OutOfMemoryError"); +- } +- +- public static class Child { +- private static final String BIG_FILE = "bigfile"; +- private static final String SMALL_FILE = "smallfile"; +- private static int timeGap = 20; // seconds +- +- public static void main(String args[]) throws Exception { +- if (args.length > 0) { +- try { +- timeGap = Integer.parseUnsignedInt(args[0]); +- timeGap = Integer.max(timeGap, 10); +- timeGap = Integer.min(timeGap, 10 * 60 * 60); // no more than 10 hours +- } catch (NumberFormatException ignore) {} +- } +- try (RandomAccessFile f = new RandomAccessFile(BIG_FILE, "rw")) { +- f.setLength(1024 * 1024 * 1024); // 1 Gb, greater than max heap size +- } +- try (FileOutputStream fs = new FileOutputStream(SMALL_FILE); +- PrintStream ps = new PrintStream(fs)) { +- for (int i = 0; i < 128; ++i) +- ps.println("line of text"); +- } +- +- List threads = new LinkedList<>(); +- for (int i = 0; i < 99; ++i) { +- Thread t = new Thread (new OpenLoop()); +- t.start(); +- threads.add(t); +- } +- Thread t2 = new Thread (new ExecLoop()); +- t2.start(); +- threads.add(t2); +- +- Thread.sleep(timeGap); +- +- for (Thread t : threads) { +- t.interrupt(); +- t.join(); +- } +- } +- +- private static class OpenLoop implements Runnable { +- public void run() { +- final Path bigFilePath = Paths.get(BIG_FILE); +- while (!Thread.interrupted()) { +- try (InputStream in = Files.newInputStream(bigFilePath)) { +- // Widen the race window by sleeping 1ms +- Thread.sleep(1); +- } catch (InterruptedException e) { +- break; +- } catch (Exception e) { +- System.err.println(e); +- } +- } +- } +- } +- +- private static class ExecLoop implements Runnable { +- public void run() { +- List command = new ArrayList<>( +- Arrays.asList("/bin/cat", SMALL_FILE)); +- while (!Thread.interrupted()) { +- try { +- ProcessBuilder builder = new ProcessBuilder(command); +- final Process process = builder.start(); +- InputStream is = process.getInputStream(); +- InputStreamReader isr = new InputStreamReader(is); +- BufferedReader br = new BufferedReader(isr); +- while (br.readLine() != null) {} +- process.waitFor(); +- isr.close(); +- } catch (InterruptedException e) { +- break; +- } catch (Exception e) { +- System.err.println(e); +- } +- } +- } +- } +- } +-} +--- ./jdk/test/java/lang/String/ToLowerCase.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/String/ToLowerCase.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -23,7 +23,7 @@ + + /* + @test +- @bug 4217441 4533872 4900935 8020037 ++ @bug 4217441 4533872 4900935 8020037 8041791 + @summary toLowerCase should lower-case Greek Sigma correctly depending + on the context (final/non-final). Also it should handle + Locale specific (lt, tr, and az) lowercasings and supplementary +@@ -72,8 +72,10 @@ + // I-dot tests + test("\u0130", turkish, "i"); + test("\u0130", az, "i"); +- test("\u0130", lt, "i"); +- test("\u0130", Locale.US, "i"); ++ test("\u0130", lt, "\u0069\u0307"); ++ test("\u0130", Locale.US, "\u0069\u0307"); ++ test("\u0130", Locale.JAPAN, "\u0069\u0307"); ++ test("\u0130", Locale.ROOT, "\u0069\u0307"); + + // Remove dot_above in the sequence I + dot_above (Turkish and Azeri) + test("I\u0307", turkish, "i"); +--- ./jdk/test/java/lang/StringCoding/CheckEncodings.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/StringCoding/CheckEncodings.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -30,7 +30,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin) ;; ++ SunOS | Linux | Darwin | AIX ) ;; + Windows* | CYGWIN* ) + echo "Passed"; exit 0 ;; + * ) echo "Unrecognized system!" ; exit 1 ;; +--- ./jdk/test/java/lang/annotation/TypeVariableBounds.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/annotation/TypeVariableBounds.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,129 @@ ++/* ++ * 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 8038994 ++ * @summary Test that getAnnotatedBounds().getType() match getBounds() ++ * @run testng TypeVariableBounds ++ */ ++ ++import java.io.Serializable; ++import java.lang.annotation.*; ++import java.lang.reflect.*; ++import java.util.concurrent.Callable; ++import java.util.Arrays; ++import java.util.List; ++import java.util.Set; ++import org.testng.annotations.DataProvider; ++import org.testng.annotations.Test; ++ ++import static org.testng.Assert.*; ++ ++public class TypeVariableBounds { ++ @Test(dataProvider = "classData") ++ public void testClass(Class c) throws Exception { ++ assertNotEquals(c.getTypeParameters().length, 0); ++ ++ TypeVariable[] tv = c.getTypeParameters(); ++ ++ for(TypeVariable t : tv) ++ testTv(t); ++ ++ } ++ ++ @Test(dataProvider = "methodData") ++ public void testMethod(Classc) throws Exception { ++ Method m = c.getMethod("aMethod"); ++ TypeVariable[] tv = m.getTypeParameters(); ++ ++ for(TypeVariable t : tv) ++ testTv(t); ++ ++ } ++ ++ public void testTv(TypeVariable tv) { ++ Type[] t = tv.getBounds(); ++ AnnotatedType[] at = tv.getAnnotatedBounds(); ++ ++ assertEquals(t.length, at.length, Arrays.asList(t) + " and " + Arrays.asList(at) + " should be the same length"); ++ ++ for (int i = 0; i < t.length; i++) ++ assertSame(at[i].getType(), t[i], "T: " + t[i] + ", AT: " + at[i] + ", AT.getType(): " + at[i].getType() + "\n"); ++ } ++ ++ @DataProvider ++ public Object[][] classData() { return CLASS_TESTS; } ++ ++ @DataProvider ++ public Object[][] methodData() { return METHOD_TESTS; } ++ ++ public static final Object[][] CLASS_TESTS = { ++ { Case1.class, }, ++ { Case2.class, }, ++ { Case5.class, }, ++ { Case6.class, }, ++ }; ++ ++ public static final Object[][] METHOD_TESTS = { ++ { Case3.class, }, ++ { Case4.class, }, ++ { Case5.class, }, ++ { Case6.class, }, ++ }; ++ ++ // Class type var ++ public static class Case1 {} ++ public static class Case2 {} ++ ++ // Method type var ++ public static class Case3 { public void aMethod() {}} ++ public static class Case4 { public void aMethod() {}} ++ ++ // Both ++ public static class Case5 { ++ public ++ void aMethod() {}} ++ ++ public static class Case6 <@TA C6CT1, C6CT2 extends @TB Runnable> { ++ public <@TA C6MT1, ++ C6MT2 extends @TB AnnotatedElement, ++ C6MT3 extends @TB AnnotatedElement & @TB2 Type & Serializable, ++ C6MT4 extends @TB2 C6CT2> ++ void aMethod() {}} ++ ++ @Retention(RetentionPolicy.RUNTIME) ++ @Target(ElementType.TYPE_PARAMETER) ++ public @interface TA {} ++ ++ @Retention(RetentionPolicy.RUNTIME) ++ @Target(ElementType.TYPE_USE) ++ public @interface TB {} ++ ++ @Retention(RetentionPolicy.RUNTIME) ++ @Target(ElementType.TYPE_USE) ++ public @interface TB2 {} ++} +--- ./jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -48,7 +48,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/java/lang/annotation/typeAnnotations/TestExecutableGetAnnotatedType.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/annotation/typeAnnotations/TestExecutableGetAnnotatedType.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,277 @@ ++/* ++ * 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 8039916 ++ * @summary Test that a call to getType() on an AnnotatedType returned from an ++ * Executable.getAnnotated* returns the same type as the corresponding ++ * Executable.getGeneric* call. ++ * @run testng TestExecutableGetAnnotatedType ++ */ ++ ++import org.testng.annotations.DataProvider; ++import org.testng.annotations.Test; ++ ++import java.lang.annotation.*; ++import java.lang.reflect.*; ++import java.util.Arrays; ++import java.util.List; ++import java.util.stream.Collectors; ++import java.util.stream.Stream; ++ ++import static org.testng.Assert.*; ++ ++public class TestExecutableGetAnnotatedType { ++ @Test(dataProvider = "genericExecutableData") ++ public void testGenericMethodExceptions(Executable e) throws Exception { ++ testExceptions(e); ++ } ++ ++ @Test(dataProvider = "executableData") ++ public void testMethodExceptions(Executable e) throws Exception { ++ testExceptions(e); ++ } ++ ++ @Test(dataProvider = "genericExecutableData") ++ public void testGenericMethodParameterTypes(Executable e) throws Exception { ++ testMethodParameters(e); ++ } ++ ++ @Test(dataProvider = "executableData") ++ public void testMethodParameterTypes(Executable e) throws Exception { ++ testMethodParameters(e); ++ } ++ ++ @Test(dataProvider = "genericExecutableData") ++ public void testGenericParameterTypes(Executable e) throws Exception { ++ testParameters(e.getParameters()); ++ } ++ ++ @Test(dataProvider = "executableData") ++ public void testParameterTypes(Executable e) throws Exception { ++ testParameters(e.getParameters()); ++ } ++ ++ // should test constructors as well, see JDK-8044629 ++ @Test(dataProvider = "genericMethodData") ++ public void testGenericReceiverType(Executable e) throws Exception { ++ testReceiverType0(e); ++ } ++ ++ // should test constructors as well, see JDK-8044629 ++ @Test(dataProvider = "methodData") ++ public void testReceiverType(Executable e) throws Exception { ++ testReceiverType0(e); ++ } ++ ++ @Test(dataProvider = "genericMethodData") ++ public void testGenericMethodReturnType(Object o) throws Exception { ++ // testng gets confused if the param to this method has type Method ++ Method m = (Method)o; ++ testReturnType(m); ++ } ++ ++ @Test(dataProvider = "methodData") ++ public void testMethodReturnType(Object o) throws Exception { ++ // testng gets confused if the param to this method has type Method ++ Method m = (Method)o; ++ testReturnType(m); ++ } ++ ++ private void testExceptions(Executable e) { ++ Type[] ts = e.getGenericExceptionTypes(); ++ AnnotatedType[] ats = e.getAnnotatedExceptionTypes(); ++ assertEquals(ts.length, ats.length); ++ ++ for (int i = 0; i < ts.length; i++) { ++ Type t = ts[i]; ++ AnnotatedType at = ats[i]; ++ assertSame(at.getType(), t, e.toString() + ": T: " + t + ", AT: " + at + ", AT.getType(): " + at.getType() + "\n"); ++ } ++ } ++ ++ private void testMethodParameters(Executable e) { ++ Type[] ts = e.getGenericParameterTypes(); ++ AnnotatedType[] ats = e.getAnnotatedParameterTypes(); ++ assertEquals(ts.length, ats.length); ++ ++ for (int i = 0; i < ts.length; i++) { ++ Type t = ts[i]; ++ AnnotatedType at = ats[i]; ++ assertSame(at.getType(), t, e.toString() + ": T: " + t + ", AT: " + at + ", AT.getType(): " + at.getType() + "\n"); ++ } ++ } ++ ++ private void testParameters(Parameter[] params) { ++ for (Parameter p : params) { ++ Type t = p.getParameterizedType(); ++ AnnotatedType at = p.getAnnotatedType(); ++ assertSame(at.getType(), t, p.toString() + ": T: " + t + ", AT: " + at + ", AT.getType(): " + at.getType() + "\n"); ++ } ++ } ++ ++ private void testReceiverType0(Executable e) { ++ if (Modifier.isStatic(e.getModifiers())) ++ assertNull(e.getAnnotatedReceiverType()); ++ else ++ assertSame(e.getAnnotatedReceiverType().getType(), e.getDeclaringClass()); ++ } ++ ++ private void testReturnType(Method m) { ++ Type t = m.getGenericReturnType(); ++ AnnotatedType at = m.getAnnotatedReturnType(); ++ assertSame(at.getType(), t, m.toString() + ": T: " + t + ", AT: " + at + ", AT.getType(): " + at.getType() + "\n"); ++ } ++ ++ @DataProvider ++ public Object[][] methodData() throws Exception { ++ return filterData(Arrays.stream(Methods1.class.getMethods()), Methods1.class) ++ .toArray(new Object[0][0]); ++ } ++ ++ @DataProvider ++ public Object[][] genericMethodData() throws Exception { ++ return filterData(Arrays.stream(GenericMethods1.class.getMethods()), GenericMethods1.class) ++ .toArray(new Object[0][0]); ++ } ++ ++ @DataProvider ++ public Object[][] executableData() throws Exception { ++ @SuppressWarnings("raw") ++ List l = filterData(Arrays.stream(Methods1.class.getMethods()), Methods1.class); ++ l.addAll(filterData(Arrays.stream(Methods1.class.getConstructors()), Methods1.class)); ++ l.addAll(filterData(Arrays.stream(Ctors1.class.getConstructors()), Ctors1.class)); ++ return ((List)l).toArray(new Object[0][0]); ++ } ++ ++ @DataProvider ++ public Object[][] genericExecutableData() throws Exception { ++ @SuppressWarnings("raw") ++ List l = filterData(Arrays.stream(GenericMethods1.class.getMethods()), GenericMethods1.class); ++ l.addAll(filterData(Arrays.stream(GenericMethods1.class.getConstructors()), GenericMethods1.class)); ++ l.addAll(filterData(Arrays.stream(GenericCtors1.class.getConstructors()), GenericCtors1.class)); ++ return ((List)l).toArray(new Object[0][0]); ++ } ++ ++ private List filterData(Stream l, Class c) { ++ return l.filter(m -> (m.getDeclaringClass() == c)) // remove object methods ++ .map(m -> { Object[] o = new Object[1]; o[0] = m; return o; }) ++ .collect(Collectors.toList()); ++ } ++ ++ @Retention(RetentionPolicy.RUNTIME) ++ @Target(ElementType.TYPE_USE) ++ public @interface TA {} ++ ++ @Retention(RetentionPolicy.RUNTIME) ++ @Target(ElementType.TYPE_USE) ++ public @interface TB {} ++ ++ @Retention(RetentionPolicy.RUNTIME) ++ @Target(ElementType.TYPE_USE) ++ public @interface TC {} ++ ++ public static class Methods1 { ++ public static void m1() throws Error, RuntimeException {;} ++ public static long m2(int a, double b) throws Error, RuntimeException { return 0L; } ++ public static Object m3(String s, List l) throws Error, RuntimeException { return null; } ++ public static Object m4(String s, List l) { return null; } ++ public static Object m4(String s, List l, boolean ... b){ return null; } ++ ++ public static void m10() throws @TA Error, @TB @TC RuntimeException {;} ++ public static @TB long m20(@TC int a, @TA double b) throws @TA Error, @TB @TC RuntimeException { return 0L; } ++ public static @TC Object m30(@TA String s, @TB List l) throws @TA Error, @TB @TC RuntimeException { return null; } ++ public static @TA Object m40(@TB String s, @TC List<@TA String> l) { return null; } ++ public static @TA Object m40(@TB String s, @TC List<@TA String> l, @TB boolean ... b) { return null; } ++ ++ public Methods1(int a, double b) {} ++ public Methods1(String s, List l, boolean ... b) {} ++ public Methods1(@TC long a, @TA float b) {} ++ public Methods1(@TA int i, @TB String s, @TC List<@TA String> l, @TB boolean ... b) {} ++ } ++ ++ // test default ctor ++ public static class Ctors1 { ++ } ++ ++ public static class GenericMethods1 { ++ public E m1(E e, Object o) throws Error, RuntimeException { return null; } ++ public E m2(List e, int i) throws Error, RuntimeException { return null; } ++ public E m3(double d, List e) throws Error, RuntimeException { return null; } ++ public E m4(byte[] b, GenericMethods1 e) { return null; } ++ public E m5(GenericMethods1 e) { return null; } ++ public E m6(char c, E e) { return null; } ++ public E m7(char c, E e, byte ... b) { return null; } ++ ++ public static M n1(M e) { return null; } ++ public static M n2(List e) { return null; } ++ public static M n3(List e) throws Error, M { return null; } ++ public static M n4(GenericMethods1 e) throws Error, RuntimeException { return null; } ++ public static M n5(GenericMethods1 e) { return null; } ++ public static M n6(M e) { return null; } ++ ++ public E o1(E e) { return null; } ++ public E o2(List e) { return null; } ++ public E o3(GenericMethods1 this, List e) throws M, N { return null; } ++ public E o4(GenericMethods1 e) throws Error, RuntimeException { return null; } ++ public E o5(GenericMethods1 e) { return null; } ++ public E o6(E e) { return null; } ++ ++ ++ // with annotations ++ public @TA E m10(E e, @TC Object o) throws @TA Error, @TB @TC RuntimeException { return null; } ++ public @TB E m20(@TA List<@TA ? extends @TA List> e, @TC int i) throws @TA Error, @TB @TC RuntimeException { return null; } ++ public @TB E m30(@TC double d, List e) throws @TA Error, @TB @TC RuntimeException { return null; } ++ public <@TA E extends @TA List> @TA E m40(@TA byte @TB [] b, GenericMethods1<@TA ? extends E> e) { return null; } ++ public <@TB E extends @TB List> E m50(@TA GenericMethods1 e) { return null; } ++ public <@TB E extends @TA List & Cloneable> E m60(@TC char c, E e) { return null; } ++ public <@TB E extends @TA List & Cloneable> E m70(@TC char c, E e, @TA @TB byte ... b) { return null; } ++ ++ public static <@TA M> @TA M n10(M e) { return null; } ++ public static <@TA @TB @TC M> M n20(List<@TA ? extends List> e) { return null; } ++ @TA @TB @TC public static M n30(List<@TB M> e) throws @TA Error, @TB @TC M { return null; } ++ public static <@TC M extends Number> M n40(GenericMethods1 e) throws @TA Error, @TB @TC RuntimeException { return null; } ++ @TA public static M n50(GenericMethods1 e) { return null; } ++ public static <@TA M extends @TB List & @TC @TB Cloneable> M n60(M e) { return null; } ++ ++ public <@TC M> E o10(@TA E e) { return null; } ++ public @TA E o20(@TB List<@TB ? extends @TB List> e) { return null; } ++ @TC public @TB E o30(@TA @TB @TC GenericMethods1 this, List e) throws @TA M, @TB @TC N { return null; } ++ public <@TA M extends Number> E o40(GenericMethods1 e) throws @TA Error, @TB @TC RuntimeException { return null; } ++ public E o50(GenericMethods1<@TA ? super Number> e) { return null; } ++ public <@TA M extends @TB List & @TC Cloneable> E o60(@TA E e) { return null; } ++ ++ ++ // ctors ++ public GenericMethods1(List e, int i) throws Error, RuntimeException { } ++ public GenericMethods1(char c, E e, byte ... b) { } ++ @TC public GenericMethods1(List<@TC E> e) throws @TA M, @TB @TC N { } ++ public <@TA M extends @TB List & @TC Cloneable> GenericMethods1(@TA E e, @TB M m) throws @TA Exception { } ++ public <@TA M extends @TB List & @TC Cloneable> GenericMethods1(@TA E e, @TB M m, @TC byte ... b) throws Exception { } ++ } ++ ++ // test default ctor ++ public static class GenericCtors1 { ++ } ++} +--- ./jdk/test/java/lang/instrument/DaemonThread/DummyAgent.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/instrument/DaemonThread/DummyAgent.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,46 @@ ++/* ++ * Copyright 2014 Goldman Sachs. ++ * 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.lang.instrument.ClassFileTransformer; ++import java.lang.instrument.IllegalClassFormatException; ++import java.lang.instrument.Instrumentation; ++import java.security.ProtectionDomain; ++ ++public class DummyAgent implements ClassFileTransformer { ++ @Override ++ public byte[] transform(ClassLoader loader, String className, ++ Class classBeingRedefined, ProtectionDomain protectionDomain, ++ byte[] classfileBuffer) throws IllegalClassFormatException { ++ ++ /* The Daemon Thread bug is timing dependent and you want the transform method ++ * to return ASAP - so just return the buffer will be fine ++ */ ++ return classfileBuffer; ++ } ++ ++ public static void premain(String agentArgs, Instrumentation inst) { ++ inst.addTransformer(new DummyAgent(), false); ++ } ++ ++} +--- ./jdk/test/java/lang/instrument/DaemonThread/DummyClass.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/instrument/DaemonThread/DummyClass.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,27 @@ ++/* ++ * Copyright 2014 Goldman Sachs. ++ * 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. ++ */ ++ ++/* Just a dummy class for loading */ ++public class DummyClass { ++} +--- ./jdk/test/java/lang/instrument/DaemonThread/TestDaemonThread.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/instrument/DaemonThread/TestDaemonThread.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,72 @@ ++/* ++ * Copyright 2014 Goldman Sachs. ++ * 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 7142035 ++ * @summary Assert in java.lang.instrument agents during shutdown when classloading occurs after shutdown ++ * @library /lib/testlibrary ++ * ++ * @build jdk.testlibrary.* DummyAgent DummyClass TestDaemonThreadLauncher TestDaemonThread ++ * @run shell ../MakeJAR3.sh DummyAgent ++ * @run main TestDaemonThreadLauncher /timeout=240 ++ * ++ */ ++import java.io.File; ++import java.net.URL; ++import java.net.URLClassLoader; ++ ++public class TestDaemonThread implements Runnable{ ++ File classpath; ++ ++ public TestDaemonThread(File classpath) { ++ this.classpath = classpath; ++ } ++ ++ @Override ++ public void run() { ++ ++ ++ try { ++ URL u = this.getClass().getClassLoader().getResource("DummyClass.class"); ++ String path = u.getPath(); ++ String parent = u.getPath().substring(0, path.lastIndexOf('/')+1); ++ URL parentURL = new URL(u, parent); ++ System.out.println(parentURL); ++ /* Load lots of class by creating multiple classloaders */ ++ for(;;) { ++ ClassLoader cl = new URLClassLoader(new URL[] {parentURL}, null); ++ cl.loadClass("DummyClass"); ++ } ++ } catch (Exception e) { ++ e.printStackTrace(); ++ } ++ } ++ ++ public static void main(String[] args) throws Exception { ++ Thread t = new Thread(new TestDaemonThread(new File(args[0]))); ++ /* The important part of the bug is that a Daemon thread can continue to load classes after shutdown */ ++ t.setDaemon(true); ++ t.start(); ++ Thread.sleep(200); ++ } ++} +--- ./jdk/test/java/lang/instrument/DaemonThread/TestDaemonThreadLauncher.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/instrument/DaemonThread/TestDaemonThreadLauncher.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,44 @@ ++/* ++ * Copyright 2014 Goldman Sachs. ++ * 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 jdk.testlibrary.JDKToolLauncher; ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.ProcessTools; ++ ++import java.io.IOException; ++import java.nio.file.Path; ++ ++public class TestDaemonThreadLauncher { ++ ++ private static ProcessBuilder processBuilder = new ProcessBuilder(); ++ ++ public static void main(String args[]) throws Exception { ++ for(int i=0; i<50; i++) { ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-javaagent:DummyAgent.jar", "TestDaemonThread", "."); ++ OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); ++ analyzer.shouldNotContain("ASSERTION FAILED"); ++ } ++ } ++} +--- ./jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -30,7 +30,7 @@ + * @bug 6289149 + * @summary test when the agent's class is missing the premain() function. + * @library /lib/testlibrary +- * @run build DummyMain ++ * @build jdk.testlibrary.* DummyMain + * @run shell ../MakeJAR3.sh NoPremainAgent + * @run main NoPremainAgentTest + */ +--- ./jdk/test/java/lang/instrument/PremainClass/PremainClassTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/instrument/PremainClass/PremainClassTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -30,7 +30,7 @@ + * @bug 5055293 + * @summary Test non ascii characters in the Premain-Class attribute. + * @library /lib/testlibrary +- * @run build DummyMain ++ * @build jdk.testlibrary.* DummyMain + * @run main PremainClassTest + */ + public class PremainClassTest { +--- ./jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -30,7 +30,7 @@ + * @bug 6289149 + * @summary test when the agent's class has a zero arg premain() function. + * @library /lib/testlibrary +- * @run build DummyMain ++ * @build jdk.testlibrary.* DummyMain + * @run shell ../MakeJAR3.sh ZeroArgPremainAgent + * @run main ZeroArgPremainAgentTest + */ +--- ./jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -47,6 +47,10 @@ + PS=":" + FS="/" + ;; ++ AIX ) ++ PS=":" ++ FS="/" ++ ;; + Windows*) + PS=";" + OS="Windows" +--- ./jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,543 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package test.java.lang.invoke.MethodHandles; ++ ++import com.oracle.testlibrary.jsr292.Helper; ++import jdk.testlibrary.Asserts; ++ ++import java.lang.invoke.MethodHandle; ++import java.lang.invoke.MethodHandles; ++import java.lang.invoke.MethodType; ++import java.lang.reflect.Array; ++import java.util.*; ++import java.util.function.BiFunction; ++import java.util.function.Function; ++import java.util.function.Supplier; ++ ++/* @test ++ * @library /lib/testlibrary/jsr292 /lib/testlibrary/ ++ * @compile CatchExceptionTest.java ++ * @build jdk.testlibrary.* ++ * @run main/othervm -esa test.java.lang.invoke.MethodHandles.CatchExceptionTest ++ */ ++public class CatchExceptionTest { ++ private static final List> ARGS_CLASSES; ++ protected static final int MAX_ARITY = Helper.MAX_ARITY - 1; ++ static { ++ Class classes[] = { ++ Object.class, ++ long.class, ++ int.class, ++ byte.class, ++ Integer[].class, ++ double[].class, ++ String.class, ++ }; ++ List> list = new ArrayList<>(MAX_ARITY); ++ for (int i = 0; i < MAX_ARITY; ++i) { ++ list.add(classes[Helper.RNG.nextInt(classes.length)]); ++ } ++ ARGS_CLASSES = Collections.unmodifiableList(list); ++ } ++ ++ private final TestCase testCase; ++ private final int nargs; ++ private final int argsCount; ++ private final MethodHandle catcher; ++ private int dropped; ++ private MethodHandle thrower; ++ ++ ++ public CatchExceptionTest(TestCase testCase, final boolean isVararg, final int argsCount, ++ final int catchDrops) { ++ this.testCase = testCase; ++ this.dropped = catchDrops; ++ if (Helper.IS_VERBOSE) { ++ System.out.printf("CatchException::CatchException(%s, isVararg=%b " + ++ "argsCount=%d catchDrops=%d)%n", ++ testCase, isVararg, argsCount, catchDrops ++ ); ++ } ++ MethodHandle thrower = testCase.thrower; ++ int throwerLen = thrower.type().parameterCount(); ++ List> classes; ++ int extra = Math.max(0, argsCount - throwerLen); ++ classes = getThrowerParams(isVararg, extra); ++ this.argsCount = throwerLen + classes.size(); ++ thrower = Helper.addTrailingArgs(thrower, this.argsCount, classes); ++ if (isVararg && argsCount > throwerLen) { ++ MethodType mt = thrower.type(); ++ Class lastParam = mt.parameterType(mt.parameterCount() - 1); ++ thrower = thrower.asVarargsCollector(lastParam); ++ } ++ this.thrower = thrower; ++ this.dropped = Math.min(this.argsCount, catchDrops); ++ catcher = testCase.getCatcher(getCatcherParams()); ++ nargs = Math.max(2, this.argsCount); ++ } ++ ++ public static void main(String[] args) throws Throwable { ++ for (CatchExceptionTest test : TestFactory.MANDATORY_TEST_CASES) { ++ test.runTest(); ++ } ++ TestFactory factory = new TestFactory(); ++ CatchExceptionTest test; ++ while ((test = factory.nextTest()) != null ) { ++ test.runTest(); ++ } ++ } ++ ++ private List> getThrowerParams(boolean isVararg, int argsCount) { ++ boolean unmodifiable = true; ++ List> classes; ++ classes = ARGS_CLASSES.subList(0, ++ Math.min(argsCount, (MAX_ARITY / 2) - 1)); ++ int extra = 0; ++ if (argsCount >= MAX_ARITY / 2) { ++ classes = new ArrayList<>(classes); ++ unmodifiable = false; ++ extra = (int) classes.stream().filter(Helper::isDoubleCost).count(); ++ int i = classes.size(); ++ while (classes.size() + extra < argsCount) { ++ Class aClass = ARGS_CLASSES.get(i); ++ if (Helper.isDoubleCost(aClass)) { ++ ++extra; ++ if (classes.size() + extra >= argsCount) { ++ break; ++ } ++ } ++ classes.add(aClass); ++ } ++ } ++ if (isVararg && classes.size() > 0) { ++ if (unmodifiable) { ++ classes = new ArrayList<>(classes); ++ } ++ int last = classes.size() - 1; ++ Class aClass = classes.get(classes.size() - 1); ++ aClass = Array.newInstance(aClass, 2).getClass(); ++ classes.set(last, aClass); ++ } ++ return classes; ++ } ++ ++ ++ private List> getCatcherParams() { ++ int catchArgc = 1 + this.argsCount - dropped; ++ List> result = new ArrayList<>( ++ thrower.type().parameterList().subList(0, catchArgc - 1)); ++ // prepend throwable ++ result.add(0, testCase.throwableClass); ++ return result; ++ } ++ ++ private void runTest() { ++ Helper.clear(); ++ ++ Object[] args = Helper.randomArgs( ++ argsCount, thrower.type().parameterArray()); ++ Object arg0 = Helper.MISSING_ARG; ++ Object arg1 = testCase.thrown; ++ if (argsCount > 0) { ++ arg0 = args[0]; ++ } ++ if (argsCount > 1) { ++ args[1] = arg1; ++ } ++ Asserts.assertEQ(nargs, thrower.type().parameterCount()); ++ if (argsCount < nargs) { ++ Object[] appendArgs = {arg0, arg1}; ++ appendArgs = Arrays.copyOfRange(appendArgs, argsCount, nargs); ++ thrower = MethodHandles.insertArguments( ++ thrower, argsCount, appendArgs); ++ } ++ Asserts.assertEQ(argsCount, thrower.type().parameterCount()); ++ ++ MethodHandle target = MethodHandles.catchException( ++ testCase.filter(thrower), testCase.throwableClass, ++ testCase.filter(catcher)); ++ ++ Asserts.assertEQ(thrower.type(), target.type()); ++ Asserts.assertEQ(argsCount, target.type().parameterCount()); ++ ++ Object returned; ++ try { ++ returned = target.invokeWithArguments(args); ++ } catch (Throwable ex) { ++ testCase.assertCatch(ex); ++ returned = ex; ++ } ++ ++ testCase.assertReturn(returned, arg0, arg1, dropped, args); ++ } ++} ++ ++class TestFactory { ++ public static final List MANDATORY_TEST_CASES = new ArrayList<>(); ++ ++ private static final int MIN_TESTED_ARITY = 10; ++ ++ static { ++ for (int[] args : new int[][]{ ++ {0, 0}, ++ {MIN_TESTED_ARITY, 0}, ++ {MIN_TESTED_ARITY, MIN_TESTED_ARITY}, ++ {CatchExceptionTest.MAX_ARITY, 0}, ++ {CatchExceptionTest.MAX_ARITY, CatchExceptionTest.MAX_ARITY}, ++ }) { ++ MANDATORY_TEST_CASES.addAll(createTests(args[0], args[1])); ++ } ++ } ++ ++ private int count; ++ private int args; ++ private int dropArgs; ++ private int currentMaxDrops; ++ private int maxArgs; ++ private int maxDrops; ++ private int constructor; ++ private int constructorSize; ++ private boolean isVararg; ++ ++ public TestFactory() { ++ if (Helper.IS_THOROUGH) { ++ maxArgs = maxDrops = CatchExceptionTest.MAX_ARITY; ++ } else { ++ maxArgs = MIN_TESTED_ARITY ++ + Helper.RNG.nextInt(CatchExceptionTest.MAX_ARITY ++ - MIN_TESTED_ARITY) ++ + 1; ++ maxDrops = MIN_TESTED_ARITY ++ + Helper.RNG.nextInt(maxArgs - MIN_TESTED_ARITY) ++ + 1; ++ args = 1; ++ } ++ ++ if (Helper.IS_VERBOSE) { ++ System.out.printf("maxArgs = %d%nmaxDrops = %d%n", ++ maxArgs, maxDrops); ++ } ++ constructorSize = TestCase.CONSTRUCTORS.size(); ++ } ++ ++ private static List createTests(int argsCount, ++ int catchDrops) { ++ if (catchDrops > argsCount || argsCount < 0 || catchDrops < 0) { ++ throw new IllegalArgumentException("argsCount = " + argsCount ++ + ", catchDrops = " + catchDrops ++ ); ++ } ++ List result = new ArrayList<>( ++ TestCase.CONSTRUCTORS.size()); ++ for (Supplier constructor : TestCase.CONSTRUCTORS) { ++ result.add(new CatchExceptionTest(constructor.get(), ++ /* isVararg = */ true, ++ argsCount, ++ catchDrops)); ++ result.add(new CatchExceptionTest(constructor.get(), ++ /* isVararg = */ false, ++ argsCount, ++ catchDrops)); ++ } ++ return result; ++ } ++ ++ /** ++ * @return next test from test matrix: ++ * {varArgs, noVarArgs} x TestCase.rtypes x TestCase.THROWABLES x {1, .., maxArgs } x {1, .., maxDrops} ++ */ ++ public CatchExceptionTest nextTest() { ++ if (constructor < constructorSize) { ++ return createTest(); ++ } ++ constructor = 0; ++ count++; ++ if (!Helper.IS_THOROUGH && count > Helper.TEST_LIMIT) { ++ System.out.println("test limit is exceeded"); ++ return null; ++ } ++ if (dropArgs <= currentMaxDrops) { ++ if (dropArgs == 1) { ++ if (Helper.IS_THOROUGH || Helper.RNG.nextBoolean()) { ++ ++dropArgs; ++ return createTest(); ++ } else if (Helper.IS_VERBOSE) { ++ System.out.printf( ++ "argsCount=%d : \"drop\" scenarios are skipped%n", ++ args); ++ } ++ } else { ++ ++dropArgs; ++ return createTest(); ++ } ++ } ++ ++ if (args <= maxArgs) { ++ dropArgs = 1; ++ currentMaxDrops = Math.min(args, maxDrops); ++ ++args; ++ return createTest(); ++ } ++ return null; ++ } ++ ++ private CatchExceptionTest createTest() { ++ if (!Helper.IS_THOROUGH) { ++ return new CatchExceptionTest( ++ TestCase.CONSTRUCTORS.get(constructor++).get(), ++ Helper.RNG.nextBoolean(), args, dropArgs); ++ } else { ++ if (isVararg) { ++ isVararg = false; ++ return new CatchExceptionTest( ++ TestCase.CONSTRUCTORS.get(constructor++).get(), ++ isVararg, args, dropArgs); ++ } else { ++ isVararg = true; ++ return new CatchExceptionTest( ++ TestCase.CONSTRUCTORS.get(constructor).get(), ++ isVararg, args, dropArgs); ++ } ++ } ++ } ++} ++ ++class TestCase { ++ private static enum ThrowMode { ++ NOTHING, ++ CAUGHT, ++ UNCAUGHT, ++ ADAPTER ++ } ++ ++ @SuppressWarnings("unchecked") ++ public static final List> CONSTRUCTORS; ++ private static final MethodHandle FAKE_IDENTITY; ++ private static final MethodHandle THROW_OR_RETURN; ++ private static final MethodHandle CATCHER; ++ ++ static { ++ try { ++ MethodHandles.Lookup lookup = MethodHandles.lookup(); ++ THROW_OR_RETURN = lookup.findStatic( ++ TestCase.class, ++ "throwOrReturn", ++ MethodType.methodType(Object.class, Object.class, ++ Throwable.class) ++ ); ++ CATCHER = lookup.findStatic( ++ TestCase.class, ++ "catcher", ++ MethodType.methodType(Object.class, Object.class)); ++ FAKE_IDENTITY = lookup.findVirtual( ++ TestCase.class, "fakeIdentity", ++ MethodType.methodType(Object.class, Object.class)); ++ ++ } catch (NoSuchMethodException | IllegalAccessException e) { ++ throw new Error(e); ++ } ++ PartialConstructor[] constructors = { ++ create(Object.class, Object.class::cast), ++ create(String.class, Objects::toString), ++ create(int[].class, x -> new int[]{Objects.hashCode(x)}), ++ create(long.class, ++ x -> Objects.hashCode(x) & (-1L >>> 32)), ++ create(void.class, TestCase::noop)}; ++ Throwable[] throwables = { ++ new ClassCastException("testing"), ++ new java.io.IOException("testing"), ++ new LinkageError("testing")}; ++ List> list = new ArrayList<>(constructors.length * ++ throwables.length * ThrowMode.values().length); ++ //noinspection unchecked ++ for (PartialConstructor f : constructors) { ++ for (ThrowMode mode : ThrowMode.values()) { ++ for (Throwable t : throwables) { ++ list.add(f.apply(mode, t)); ++ } ++ } ++ } ++ CONSTRUCTORS = Collections.unmodifiableList(list); ++ } ++ ++ public final Class rtype; ++ public final ThrowMode throwMode; ++ public final Throwable thrown; ++ public final Class throwableClass; ++ /** ++ * MH which takes 2 args (Object,Throwable), 1st is the return value, ++ * 2nd is the exception which will be thrown, if it's supposed in current ++ * {@link #throwMode}. ++ */ ++ public final MethodHandle thrower; ++ private final Function cast; ++ protected MethodHandle filter; ++ private int fakeIdentityCount; ++ ++ private TestCase(Class rtype, Function cast, ++ ThrowMode throwMode, Throwable thrown) ++ throws NoSuchMethodException, IllegalAccessException { ++ this.cast = cast; ++ filter = MethodHandles.lookup().findVirtual( ++ Function.class, ++ "apply", ++ MethodType.methodType(Object.class, Object.class)) ++ .bindTo(cast); ++ this.rtype = rtype; ++ this.throwMode = throwMode; ++ this.throwableClass = thrown.getClass(); ++ switch (throwMode) { ++ case NOTHING: ++ this.thrown = null; ++ break; ++ case ADAPTER: ++ case UNCAUGHT: ++ this.thrown = new Error("do not catch this"); ++ break; ++ default: ++ this.thrown = thrown; ++ } ++ ++ MethodHandle throwOrReturn = THROW_OR_RETURN; ++ if (throwMode == ThrowMode.ADAPTER) { ++ MethodHandle fakeIdentity = FAKE_IDENTITY.bindTo(this); ++ for (int i = 0; i < 10; ++i) { ++ throwOrReturn = MethodHandles.filterReturnValue( ++ throwOrReturn, fakeIdentity); ++ } ++ } ++ thrower = throwOrReturn.asType(MethodType.genericMethodType(2)); ++ } ++ ++ private static Void noop(Object x) { ++ return null; ++ } ++ ++ private static PartialConstructor create( ++ Class rtype, Function cast) { ++ return (t, u) -> () -> { ++ try { ++ return new TestCase<>(rtype, cast, t, u); ++ } catch (NoSuchMethodException | IllegalAccessException e) { ++ throw new Error(e); ++ } ++ }; ++ } ++ ++ private static ++ Object throwOrReturn(Object normal, T exception) throws T { ++ if (exception != null) { ++ Helper.called("throwOrReturn/throw", normal, exception); ++ throw exception; ++ } ++ Helper.called("throwOrReturn/normal", normal, exception); ++ return normal; ++ } ++ ++ private static ++ Object catcher(Object o) { ++ Helper.called("catcher", o); ++ return o; ++ } ++ ++ public MethodHandle filter(MethodHandle target) { ++ return MethodHandles.filterReturnValue(target, filter); ++ } ++ ++ public MethodHandle getCatcher(List> classes) { ++ return MethodHandles.filterReturnValue(Helper.AS_LIST.asType( ++ MethodType.methodType(Object.class, classes)), ++ CATCHER ++ ); ++ } ++ ++ @Override ++ public String toString() { ++ return "TestCase{" + ++ "rtype=" + rtype + ++ ", throwMode=" + throwMode + ++ ", throwableClass=" + throwableClass + ++ '}'; ++ } ++ ++ public String callName() { ++ return "throwOrReturn/" + ++ (throwMode == ThrowMode.NOTHING ++ ? "normal" ++ : "throw"); ++ } ++ ++ public void assertReturn(Object returned, Object arg0, Object arg1, ++ int catchDrops, Object... args) { ++ int lag = 0; ++ if (throwMode == ThrowMode.CAUGHT) { ++ lag = 1; ++ } ++ Helper.assertCalled(lag, callName(), arg0, arg1); ++ ++ if (throwMode == ThrowMode.NOTHING) { ++ assertEQ(cast.apply(arg0), returned); ++ } else if (throwMode == ThrowMode.CAUGHT) { ++ List catchArgs = new ArrayList<>(Arrays.asList(args)); ++ // catcher receives an initial subsequence of target arguments: ++ catchArgs.subList(args.length - catchDrops, args.length).clear(); ++ // catcher also receives the exception, prepended: ++ catchArgs.add(0, thrown); ++ Helper.assertCalled("catcher", catchArgs); ++ assertEQ(cast.apply(catchArgs), returned); ++ } ++ Asserts.assertEQ(0, fakeIdentityCount); ++ } ++ ++ private void assertEQ(T t, Object returned) { ++ if (rtype.isArray()) { ++ Asserts.assertEQ(t.getClass(), returned.getClass()); ++ int n = Array.getLength(t); ++ Asserts.assertEQ(n, Array.getLength(returned)); ++ for (int i = 0; i < n; ++i) { ++ Asserts.assertEQ(Array.get(t, i), Array.get(returned, i)); ++ } ++ } else { ++ Asserts.assertEQ(t, returned); ++ } ++ } ++ ++ private Object fakeIdentity(Object x) { ++ System.out.println("should throw through this!"); ++ ++fakeIdentityCount; ++ return x; ++ } ++ ++ public void assertCatch(Throwable ex) { ++ try { ++ Asserts.assertSame(thrown, ex, ++ "must get the out-of-band exception"); ++ } catch (Throwable t) { ++ ex.printStackTrace(); ++ } ++ } ++ ++ public interface PartialConstructor ++ extends BiFunction> { ++ } ++} +--- ./jdk/test/java/lang/invoke/MethodHandles/TestCatchException.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/invoke/MethodHandles/TestCatchException.java Wed Jul 30 18:42:59 2014 +0100 +@@ -72,10 +72,99 @@ + assertEquals(x, 17); + } + ++ final static Object masterParam = new Object(); ++ final static Object[] masterTail = new Object[] { "str" }; ++ static Exception masterEx = new Exception(); ++ ++ public static Object m1(Object o1, Object o2, Object o3, Object o4, Object o5, ++ Object o6, Object o7, Object o8, Object... tail) { ++ assertEquals(masterParam, o1); ++ assertEquals(masterParam, o2); ++ assertEquals(masterParam, o3); ++ assertEquals(masterParam, o4); ++ assertEquals(masterParam, o5); ++ assertEquals(masterParam, o6); ++ assertEquals(masterParam, o7); ++ assertEquals(masterParam, o8); ++ assertEquals(masterTail, tail); ++ return tail; ++ } ++ ++ public static Object m2(Exception e, Object o1, Object o2, Object o3, Object o4, ++ Object o5, Object o6, Object o7, Object o8, Object... tail) { ++ assertEquals(masterEx, e); ++ assertEquals(masterParam, o1); ++ assertEquals(masterParam, o2); ++ assertEquals(masterParam, o3); ++ assertEquals(masterParam, o4); ++ assertEquals(masterParam, o5); ++ assertEquals(masterParam, o6); ++ assertEquals(masterParam, o7); ++ assertEquals(masterParam, o8); ++ assertEquals(masterTail, tail); ++ return tail; ++ } ++ ++ public static Object throwEx(Object o1, Object o2, Object o3, Object o4, Object o5, ++ Object o6, Object o7, Object o8, Object... tail) throws Exception { ++ assertEquals(masterParam, o1); ++ assertEquals(masterParam, o2); ++ assertEquals(masterParam, o3); ++ assertEquals(masterParam, o4); ++ assertEquals(masterParam, o5); ++ assertEquals(masterParam, o6); ++ assertEquals(masterParam, o7); ++ assertEquals(masterParam, o8); ++ assertEquals(masterTail, tail); ++ throw masterEx; ++ } ++ ++ @Test ++ public void testVarargsCollectorNoThrow() throws Throwable { ++ MethodType t1 = MethodType.methodType(Object.class, Object.class, Object.class, Object.class, Object.class, ++ Object.class, Object.class, Object.class, Object.class, Object[].class); ++ ++ MethodType t2 = t1.insertParameterTypes(0, Exception.class); ++ ++ MethodHandle target = LOOKUP.findStatic(TestCatchException.class, "m1", t1) ++ .asVarargsCollector(Object[].class); ++ MethodHandle catcher = LOOKUP.findStatic(TestCatchException.class, "m2", t2) ++ .asVarargsCollector(Object[].class); ++ MethodHandle gwc = MethodHandles.catchException(target, Exception.class, catcher); ++ ++ Object o = masterParam; ++ Object[] obj1 = masterTail; ++ ++ Object r2 = gwc.invokeExact(o, o, o, o, o, o, o, o, obj1); ++ assertEquals(r2, obj1); ++ } ++ ++ @Test ++ public void testVarargsCollectorThrow() throws Throwable { ++ MethodType t1 = MethodType.methodType(Object.class, Object.class, Object.class, Object.class, Object.class, ++ Object.class, Object.class, Object.class, Object.class, Object[].class); ++ ++ MethodType t2 = t1.insertParameterTypes(0, Exception.class); ++ ++ MethodHandle target = LOOKUP.findStatic(TestCatchException.class, "throwEx", t1) ++ .asVarargsCollector(Object[].class); ++ MethodHandle catcher = LOOKUP.findStatic(TestCatchException.class, "m2", t2) ++ .asVarargsCollector(Object[].class); ++ MethodHandle gwc = MethodHandles.catchException(target, Exception.class, catcher); ++ ++ Object o = masterParam; ++ Object[] obj1 = masterTail; ++ ++ Object r2 = gwc.invokeExact(o, o, o, o, o, o, o, o, obj1); ++ assertEquals(r2, obj1); ++ } ++ + public static void main(String[] args) throws Throwable { + TestCatchException test = new TestCatchException(); + test.testNoThrowPath(); + test.testThrowPath(); ++ test.testVarargsCollectorNoThrow(); ++ test.testVarargsCollectorThrow(); + System.out.println("TEST PASSED"); + } + } +--- ./jdk/test/java/lang/invoke/MethodHandlesTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/invoke/MethodHandlesTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -2406,108 +2406,6 @@ + } + + @Test +- public void testCatchException() throws Throwable { +- if (CAN_SKIP_WORKING) return; +- startTest("catchException"); +- for (int nargs = 0; nargs < 40; nargs++) { +- if (CAN_TEST_LIGHTLY && nargs > 11) break; +- for (int throwMode = 0; throwMode < THROW_MODE_LIMIT; throwMode++) { +- testCatchException(int.class, new ClassCastException("testing"), throwMode, nargs); +- if (CAN_TEST_LIGHTLY && nargs > 3) continue; +- testCatchException(void.class, new java.io.IOException("testing"), throwMode, nargs); +- testCatchException(String.class, new LinkageError("testing"), throwMode, nargs); +- } +- } +- } +- +- static final int THROW_NOTHING = 0, THROW_CAUGHT = 1, THROW_UNCAUGHT = 2, THROW_THROUGH_ADAPTER = 3, THROW_MODE_LIMIT = 4; +- +- void testCatchException(Class returnType, Throwable thrown, int throwMode, int nargs) throws Throwable { +- testCatchException(returnType, thrown, throwMode, nargs, 0); +- if (nargs <= 5 || nargs % 10 == 3) { +- for (int catchDrops = 1; catchDrops <= nargs; catchDrops++) +- testCatchException(returnType, thrown, throwMode, nargs, catchDrops); +- } +- } +- +- private static +- Object throwOrReturn(Object normal, T exception) throws T { +- if (exception != null) { +- called("throwOrReturn/throw", normal, exception); +- throw exception; +- } +- called("throwOrReturn/normal", normal, exception); +- return normal; +- } +- private int fakeIdentityCount; +- private Object fakeIdentity(Object x) { +- System.out.println("should throw through this!"); +- fakeIdentityCount++; +- return x; +- } +- +- void testCatchException(Class returnType, Throwable thrown, int throwMode, int nargs, int catchDrops) throws Throwable { +- countTest(); +- if (verbosity >= 3) +- System.out.println("catchException rt="+returnType+" throw="+throwMode+" nargs="+nargs+" drops="+catchDrops); +- Class exType = thrown.getClass(); +- if (throwMode > THROW_CAUGHT) thrown = new UnsupportedOperationException("do not catch this"); +- MethodHandle throwOrReturn +- = PRIVATE.findStatic(MethodHandlesTest.class, "throwOrReturn", +- MethodType.methodType(Object.class, Object.class, Throwable.class)); +- if (throwMode == THROW_THROUGH_ADAPTER) { +- MethodHandle fakeIdentity +- = PRIVATE.findVirtual(MethodHandlesTest.class, "fakeIdentity", +- MethodType.methodType(Object.class, Object.class)).bindTo(this); +- for (int i = 0; i < 10; i++) +- throwOrReturn = MethodHandles.filterReturnValue(throwOrReturn, fakeIdentity); +- } +- int nargs1 = Math.max(2, nargs); +- MethodHandle thrower = throwOrReturn.asType(MethodType.genericMethodType(2)); +- thrower = addTrailingArgs(thrower, nargs, Object.class); +- int catchArgc = 1 + nargs - catchDrops; +- MethodHandle catcher = varargsList(catchArgc).asType(MethodType.genericMethodType(catchArgc)); +- Object[] args = randomArgs(nargs, Object.class); +- Object arg0 = MISSING_ARG; +- Object arg1 = (throwMode == THROW_NOTHING) ? (Throwable) null : thrown; +- if (nargs > 0) arg0 = args[0]; +- if (nargs > 1) args[1] = arg1; +- assertEquals(nargs1, thrower.type().parameterCount()); +- if (nargs < nargs1) { +- Object[] appendArgs = { arg0, arg1 }; +- appendArgs = Arrays.copyOfRange(appendArgs, nargs, nargs1); +- thrower = MethodHandles.insertArguments(thrower, nargs, appendArgs); +- } +- assertEquals(nargs, thrower.type().parameterCount()); +- MethodHandle target = MethodHandles.catchException(thrower, exType, catcher); +- assertEquals(thrower.type(), target.type()); +- assertEquals(nargs, target.type().parameterCount()); +- //System.out.println("catching with "+target+" : "+throwOrReturn); +- Object returned; +- try { +- returned = target.invokeWithArguments(args); +- } catch (Throwable ex) { +- assertSame("must get the out-of-band exception", thrown, ex); +- if (throwMode <= THROW_CAUGHT) +- assertEquals(THROW_UNCAUGHT, throwMode); +- returned = ex; +- } +- assertCalled("throwOrReturn/"+(throwMode == THROW_NOTHING ? "normal" : "throw"), arg0, arg1); +- //System.out.println("return from "+target+" : "+returned); +- if (throwMode == THROW_NOTHING) { +- assertSame(arg0, returned); +- } else if (throwMode == THROW_CAUGHT) { +- List catchArgs = new ArrayList<>(Arrays.asList(args)); +- // catcher receives an initial subsequence of target arguments: +- catchArgs.subList(nargs - catchDrops, nargs).clear(); +- // catcher also receives the exception, prepended: +- catchArgs.add(0, thrown); +- assertEquals(catchArgs, returned); +- } +- assertEquals(0, fakeIdentityCount); +- } +- +- @Test + public void testThrowException() throws Throwable { + if (CAN_SKIP_WORKING) return; + startTest("throwException"); +--- ./jdk/test/java/lang/invoke/VMAnonymousClass.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/invoke/VMAnonymousClass.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()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); ++ } ++ } ++} +--- ./jdk/test/java/lang/invoke/lookup/SpecialStatic.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/invoke/lookup/SpecialStatic.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,194 @@ ++/* ++ * 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 8032400 ++ * @summary JSR292: invokeSpecial: InternalError attempting to lookup a method ++ * @compile -XDignore.symbol.file SpecialStatic.java ++ * @run junit test.java.lang.invoke.lookup.SpecialStatic ++ */ ++package test.java.lang.invoke.lookup; ++ ++import java.lang.invoke.MethodHandle; ++import java.lang.invoke.MethodHandles; ++import java.lang.invoke.MethodType; ++import jdk.internal.org.objectweb.asm.*; ++import org.junit.Test; ++import static jdk.internal.org.objectweb.asm.Opcodes.*; ++import static org.junit.Assert.*; ++ ++/** ++ * Test case: ++ * class T1 { int m() { return 1; }} ++ * class T2 extends T1 { static int m() { return 2; }} ++ * class T3 extends T2 { int m() { return 3; }} ++ * ++ * T3::test { invokespecial T1.m() T3 } ==> T1::m ++ */ ++public class SpecialStatic { ++ static class CustomClassLoader extends ClassLoader { ++ public Class loadClass(String name) throws ClassNotFoundException { ++ if (findLoadedClass(name) != null) { ++ return findLoadedClass(name); ++ } ++ ++ if ("T1".equals(name)) { ++ byte[] classFile = dumpT1(); ++ return defineClass("T1", classFile, 0, classFile.length); ++ } ++ if ("T2".equals(name)) { ++ byte[] classFile = dumpT2(); ++ return defineClass("T2", classFile, 0, classFile.length); ++ } ++ if ("T3".equals(name)) { ++ byte[] classFile = dumpT3(); ++ return defineClass("T3", classFile, 0, classFile.length); ++ } ++ ++ return super.loadClass(name); ++ } ++ } ++ ++ private static ClassLoader cl = new CustomClassLoader(); ++ private static Class t1, t3; ++ static { ++ try { ++ t1 = cl.loadClass("T1"); ++ t3 = cl.loadClass("T3"); ++ } catch (ClassNotFoundException e) { ++ throw new Error(e); ++ } ++ } ++ ++ public static void main(String[] args) throws Throwable { ++ SpecialStatic test = new SpecialStatic(); ++ test.testConstant(); ++ test.testFindSpecial(); ++ } ++ ++ @Test ++ public void testConstant() throws Throwable { ++ MethodHandle mh = (MethodHandle)t3.getDeclaredMethod("getMethodHandle").invoke(null); ++ int result = (int)mh.invoke(t3.newInstance()); ++ assertEquals(result, 1); // T1.m should be invoked. ++ } ++ ++ @Test ++ public void testFindSpecial() throws Throwable { ++ MethodHandles.Lookup lookup = (MethodHandles.Lookup)t3.getDeclaredMethod("getLookup").invoke(null); ++ MethodHandle mh = lookup.findSpecial(t1, "m", MethodType.methodType(int.class), t3); ++ int result = (int)mh.invoke(t3.newInstance()); ++ assertEquals(result, 1); // T1.m should be invoked. ++ } ++ ++ public static byte[] dumpT1() { ++ ClassWriter cw = new ClassWriter(0); ++ MethodVisitor mv; ++ ++ cw.visit(52, ACC_PUBLIC + ACC_SUPER, "T1", null, "java/lang/Object", null); ++ ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ mv = cw.visitMethod(ACC_PUBLIC, "m", "()I", null, null); ++ mv.visitCode(); ++ mv.visitIntInsn(BIPUSH, 1); ++ mv.visitInsn(IRETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ cw.visitEnd(); ++ return cw.toByteArray(); ++ } ++ ++ public static byte[] dumpT2() { ++ ClassWriter cw = new ClassWriter(0); ++ MethodVisitor mv; ++ ++ cw.visit(52, ACC_PUBLIC + ACC_SUPER, "T2", null, "T1", null); ++ ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "T1", "", "()V", false); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "m", "()I", null, null); ++ mv.visitCode(); ++ mv.visitIntInsn(BIPUSH, 2); ++ mv.visitInsn(IRETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ cw.visitEnd(); ++ return cw.toByteArray(); ++ } ++ ++ public static byte[] dumpT3() { ++ ClassWriter cw = new ClassWriter(0); ++ MethodVisitor mv; ++ ++ cw.visit(52, ACC_PUBLIC + ACC_SUPER, "T3", null, "T2", null); ++ ++ mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ++ mv.visitCode(); ++ mv.visitVarInsn(ALOAD, 0); ++ mv.visitMethodInsn(INVOKESPECIAL, "T2", "", "()V", false); ++ mv.visitInsn(RETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ mv = cw.visitMethod(ACC_PUBLIC, "m", "()I", null, null); ++ mv.visitCode(); ++ mv.visitIntInsn(BIPUSH, 3); ++ mv.visitInsn(IRETURN); ++ mv.visitMaxs(1, 1); ++ mv.visitEnd(); ++ ++ // getMethodHandle ++ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "getMethodHandle", "()Ljava/lang/invoke/MethodHandle;", null, null); ++ mv.visitCode(); ++ mv.visitLdcInsn(new Handle(H_INVOKESPECIAL, "T1", "m", "()I")); ++ mv.visitInsn(ARETURN); ++ mv.visitMaxs(1, 0); ++ mv.visitEnd(); ++ ++ // getLookup ++ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "getLookup", "()Ljava/lang/invoke/MethodHandles$Lookup;", null, null); ++ mv.visitCode(); ++ mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "lookup", "()Ljava/lang/invoke/MethodHandles$Lookup;", false); ++ mv.visitInsn(ARETURN); ++ mv.visitMaxs(1, 0); ++ mv.visitEnd(); ++ ++ cw.visitEnd(); ++ return cw.toByteArray(); ++ } ++} +--- ./jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java Wed Jul 30 18:42:59 2014 +0100 +@@ -30,11 +30,9 @@ + * + * @author Mandy Chung + * +- * @build CollectionUsageThreshold MemoryUtil +- * @run main/othervm/timeout=300 -XX:+PrintGCDetails -XX:+UseSerialGC CollectionUsageThreshold +- * @run main/othervm/timeout=300 -XX:+PrintGCDetails -XX:+UseParallelGC CollectionUsageThreshold +- * @run main/othervm/timeout=300 -XX:+PrintGCDetails -XX:+UseG1GC CollectionUsageThreshold +- * @run main/othervm/timeout=300 -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC CollectionUsageThreshold ++ * @library /lib/testlibrary/ ++ * @build CollectionUsageThreshold MemoryUtil RunUtil ++ * @run main/timeout=300 CollectionUsageThreshold + */ + + import java.util.*; +@@ -61,6 +59,20 @@ + // finishes checking the low memory notification result + private static final CyclicBarrier barrier = new CyclicBarrier(2); + ++ /** ++ * Run the test multiple times with different GC versions. ++ * First with default command line specified by the framework. ++ * Then with GC versions specified by the test. ++ */ ++ public static void main(String a[]) throws Throwable { ++ final String main = "CollectionUsageThreshold$TestMain"; ++ RunUtil.runTestKeepGcOpts(main); ++ RunUtil.runTestClearGcOpts(main, "-XX:+UseSerialGC"); ++ RunUtil.runTestClearGcOpts(main, "-XX:+UseParallelGC"); ++ RunUtil.runTestClearGcOpts(main, "-XX:+UseG1GC"); ++ RunUtil.runTestClearGcOpts(main, "-XX:+UseConcMarkSweepGC"); ++ } ++ + static class PoolRecord { + private final MemoryPoolMXBean pool; + private final AtomicInteger listenerInvoked = new AtomicInteger(0); +@@ -110,88 +122,90 @@ + } + } + +- public static void main(String args[]) throws Exception { +- if (args.length > 0 && args[0].equals("trace")) { +- trace = true; ++ private static class TestMain { ++ public static void main(String args[]) throws Exception { ++ if (args.length > 0 && args[0].equals("trace")) { ++ trace = true; ++ } ++ ++ List pools = getMemoryPoolMXBeans(); ++ List managers = getMemoryManagerMXBeans(); ++ ++ if (trace) { ++ MemoryUtil.printMemoryPools(pools); ++ MemoryUtil.printMemoryManagers(managers); ++ } ++ ++ // Find the Old generation which supports low memory detection ++ for (MemoryPoolMXBean p : pools) { ++ if (p.isUsageThresholdSupported() && p.isCollectionUsageThresholdSupported()) { ++ if (p.getName().toLowerCase().contains("perm")) { ++ // if we have a "perm gen" pool increase the number of expected ++ // memory pools by one. ++ numMemoryPools++; ++ } ++ PoolRecord pr = new PoolRecord(p); ++ result.put(p.getName(), pr); ++ if (result.size() == numMemoryPools) { ++ break; ++ } ++ } ++ } ++ if (result.size() != numMemoryPools) { ++ throw new RuntimeException("Unexpected number of selected pools"); ++ } ++ ++ try { ++ // This test creates a checker thread responsible for checking ++ // the low memory notifications. It blocks until a permit ++ // from the signals semaphore is available. ++ Checker checker = new Checker("Checker thread"); ++ checker.setDaemon(true); ++ checker.start(); ++ ++ for (PoolRecord pr : result.values()) { ++ pr.getPool().setCollectionUsageThreshold(THRESHOLD); ++ System.out.println("Collection usage threshold of " + ++ pr.getPool().getName() + " set to " + THRESHOLD); ++ } ++ ++ SensorListener listener = new SensorListener(); ++ NotificationEmitter emitter = (NotificationEmitter) mm; ++ emitter.addNotificationListener(listener, null, null); ++ ++ // The main thread invokes GC to trigger the VM to perform ++ // low memory detection and then waits until the checker thread ++ // finishes its work to check for a low-memory notification. ++ // ++ // At GC time, VM will issue low-memory notification and invoke ++ // the listener which will release a permit to the signals semaphore. ++ // When the checker thread acquires the permit and finishes ++ // checking the low-memory notification, it will also call ++ // barrier.await() to signal the main thread to resume its work. ++ for (int i = 0; i < NUM_GCS; i++) { ++ invokeGC(); ++ barrier.await(); ++ } ++ } finally { ++ // restore the default ++ for (PoolRecord pr : result.values()) { ++ pr.getPool().setCollectionUsageThreshold(0); ++ } ++ } ++ System.out.println(RunUtil.successMessage); + } + +- List pools = getMemoryPoolMXBeans(); +- List managers = getMemoryManagerMXBeans(); + +- if (trace) { +- MemoryUtil.printMemoryPools(pools); +- MemoryUtil.printMemoryManagers(managers); +- } ++ private static void invokeGC() { ++ System.out.println("Calling System.gc()"); ++ numGCs++; ++ mm.gc(); + +- // Find the Old generation which supports low memory detection +- for (MemoryPoolMXBean p : pools) { +- if (p.isUsageThresholdSupported() && p.isCollectionUsageThresholdSupported()) { +- if (p.getName().toLowerCase().contains("perm")) { +- // if we have a "perm gen" pool increase the number of expected +- // memory pools by one. +- numMemoryPools++; ++ if (trace) { ++ for (PoolRecord pr : result.values()) { ++ System.out.println("Usage after GC for: " + pr.getPool().getName()); ++ MemoryUtil.printMemoryUsage(pr.getPool().getUsage()); + } +- PoolRecord pr = new PoolRecord(p); +- result.put(p.getName(), pr); +- if (result.size() == numMemoryPools) { +- break; +- } +- } +- } +- if (result.size() != numMemoryPools) { +- throw new RuntimeException("Unexpected number of selected pools"); +- } +- +- try { +- // This test creates a checker thread responsible for checking +- // the low memory notifications. It blocks until a permit +- // from the signals semaphore is available. +- Checker checker = new Checker("Checker thread"); +- checker.setDaemon(true); +- checker.start(); +- +- for (PoolRecord pr : result.values()) { +- pr.getPool().setCollectionUsageThreshold(THRESHOLD); +- System.out.println("Collection usage threshold of " + +- pr.getPool().getName() + " set to " + THRESHOLD); +- } +- +- SensorListener listener = new SensorListener(); +- NotificationEmitter emitter = (NotificationEmitter) mm; +- emitter.addNotificationListener(listener, null, null); +- +- // The main thread invokes GC to trigger the VM to perform +- // low memory detection and then waits until the checker thread +- // finishes its work to check for a low-memory notification. +- // +- // At GC time, VM will issue low-memory notification and invoke +- // the listener which will release a permit to the signals semaphore. +- // When the checker thread acquires the permit and finishes +- // checking the low-memory notification, it will also call +- // barrier.await() to signal the main thread to resume its work. +- for (int i = 0; i < NUM_GCS; i++) { +- invokeGC(); +- barrier.await(); +- } +- } finally { +- // restore the default +- for (PoolRecord pr : result.values()) { +- pr.getPool().setCollectionUsageThreshold(0); +- } +- } +- System.out.println("Test passed."); +- } +- +- +- private static void invokeGC() { +- System.out.println("Calling System.gc()"); +- numGCs++; +- mm.gc(); +- +- if (trace) { +- for (PoolRecord pr : result.values()) { +- System.out.println("Usage after GC for: " + pr.getPool().getName()); +- MemoryUtil.printMemoryUsage(pr.getPool().getUsage()); + } + } + } +--- ./jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -30,19 +30,21 @@ + * + * @author Mandy Chung + * +- * @build LowMemoryTest MemoryUtil +- * @run main/othervm/timeout=600 LowMemoryTest ++ * @library /lib/testlibrary/ ++ * @build LowMemoryTest MemoryUtil RunUtil ++ * @run main/timeout=600 LowMemoryTest + */ + + import java.lang.management.*; + import java.util.*; ++import java.util.concurrent.Phaser; + import javax.management.*; + import javax.management.openmbean.CompositeData; + + public class LowMemoryTest { +- private static MemoryMXBean mm = ManagementFactory.getMemoryMXBean(); +- private static List pools = ManagementFactory.getMemoryPoolMXBeans(); +- private static List managers = ManagementFactory.getMemoryManagerMXBeans(); ++ private static final MemoryMXBean mm = ManagementFactory.getMemoryMXBean(); ++ private static final List pools = ManagementFactory.getMemoryPoolMXBeans(); ++ private static final Phaser phaser = new Phaser(2); + private static MemoryPoolMXBean mpool = null; + private static boolean trace = false; + private static boolean testFailed = false; +@@ -50,8 +52,23 @@ + private static final int NUM_CHUNKS = 2; + private static long chunkSize; + +- private static boolean listenerInvoked = false; ++ /** ++ * Run the test multiple times with different GC versions. ++ * First with default command line specified by the framework. ++ * Then with GC versions specified by the test. ++ */ ++ public static void main(String a[]) throws Throwable { ++ final String main = "LowMemoryTest$TestMain"; ++ RunUtil.runTestKeepGcOpts(main); ++ RunUtil.runTestClearGcOpts(main, "-XX:+UseSerialGC"); ++ RunUtil.runTestClearGcOpts(main, "-XX:+UseParallelGC"); ++ RunUtil.runTestClearGcOpts(main, "-XX:+UseG1GC"); ++ RunUtil.runTestClearGcOpts(main, "-XX:+UseConcMarkSweepGC"); ++ } ++ ++ private static volatile boolean listenerInvoked = false; + static class SensorListener implements NotificationListener { ++ @Override + public void handleNotification(Notification notif, Object handback) { + String type = notif.getType(); + if (type.equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED) || +@@ -69,8 +86,9 @@ + + static class TestListener implements NotificationListener { + private int triggers = 0; +- private long[] count = new long[NUM_TRIGGERS * 2]; +- private long[] usedMemory = new long[NUM_TRIGGERS * 2]; ++ private final long[] count = new long[NUM_TRIGGERS * 2]; ++ private final long[] usedMemory = new long[NUM_TRIGGERS * 2]; ++ @Override + public void handleNotification(Notification notif, Object handback) { + MemoryNotificationInfo minfo = MemoryNotificationInfo. + from((CompositeData) notif.getUserData()); +@@ -101,117 +119,97 @@ + } + + private static long newThreshold; +- public static void main(String args[]) throws Exception { +- if (args.length > 0 && args[0].equals("trace")) { +- trace = true; +- } + +- // Find the Old generation which supports low memory detection +- ListIterator iter = pools.listIterator(); +- while (iter.hasNext()) { +- MemoryPoolMXBean p = (MemoryPoolMXBean) iter.next(); +- if (p.getType() == MemoryType.HEAP && ++ private static class TestMain { ++ public static void main(String args[]) throws Exception { ++ if (args.length > 0 && args[0].equals("trace")) { ++ trace = true; ++ } ++ ++ // Find the Old generation which supports low memory detection ++ ListIterator iter = pools.listIterator(); ++ while (iter.hasNext()) { ++ MemoryPoolMXBean p = (MemoryPoolMXBean) iter.next(); ++ if (p.getType() == MemoryType.HEAP && + p.isUsageThresholdSupported()) { +- mpool = p; +- if (trace) { +- System.out.println("Selected memory pool for low memory " + +- "detection."); +- MemoryUtil.printMemoryPool(mpool); ++ mpool = p; ++ if (trace) { ++ System.out.println("Selected memory pool for low memory " + ++ "detection."); ++ MemoryUtil.printMemoryPool(mpool); ++ } ++ break; + } +- break; + } +- } + +- TestListener listener = new TestListener(); +- SensorListener l2 = new SensorListener(); +- NotificationEmitter emitter = (NotificationEmitter) mm; +- emitter.addNotificationListener(listener, null, null); +- emitter.addNotificationListener(l2, null, null); ++ TestListener listener = new TestListener(); ++ SensorListener l2 = new SensorListener(); ++ NotificationEmitter emitter = (NotificationEmitter) mm; ++ emitter.addNotificationListener(listener, null, null); ++ emitter.addNotificationListener(l2, null, null); + +- Thread allocator = new AllocatorThread(); +- Thread sweeper = new SweeperThread(); ++ Thread allocator = new AllocatorThread(); ++ Thread sweeper = new SweeperThread(); + +- // Now set threshold +- MemoryUsage mu = mpool.getUsage(); +- chunkSize = (mu.getMax() - mu.getUsed()) / 20; +- newThreshold = mu.getUsed() + (chunkSize * NUM_CHUNKS); ++ // Now set threshold ++ MemoryUsage mu = mpool.getUsage(); ++ chunkSize = (mu.getMax() - mu.getUsed()) / 20; ++ newThreshold = mu.getUsed() + (chunkSize * NUM_CHUNKS); + +- System.out.println("Setting threshold for " + mpool.getName() + +- " from " + mpool.getUsageThreshold() + " to " + newThreshold + +- ". Current used = " + mu.getUsed()); +- mpool.setUsageThreshold(newThreshold); ++ System.out.println("Setting threshold for " + mpool.getName() + ++ " from " + mpool.getUsageThreshold() + " to " + newThreshold + ++ ". Current used = " + mu.getUsed()); ++ mpool.setUsageThreshold(newThreshold); + +- if (mpool.getUsageThreshold() != newThreshold) { +- throw new RuntimeException("TEST FAILED: " + ++ if (mpool.getUsageThreshold() != newThreshold) { ++ throw new RuntimeException("TEST FAILED: " + + "Threshold for Memory pool " + mpool.getName() + + "is " + mpool.getUsageThreshold() + " but expected to be" + + newThreshold); ++ } ++ ++ ++ allocator.start(); ++ // Force Allocator start first ++ phaser.arriveAndAwaitAdvance(); ++ sweeper.start(); ++ ++ ++ try { ++ allocator.join(); ++ // Wait until AllocatorThread's done ++ phaser.arriveAndAwaitAdvance(); ++ sweeper.join(); ++ } catch (InterruptedException e) { ++ System.out.println("Unexpected exception:" + e); ++ testFailed = true; ++ } ++ ++ listener.checkResult(); ++ ++ if (testFailed) ++ throw new RuntimeException("TEST FAILED."); ++ ++ System.out.println(RunUtil.successMessage); ++ + } +- +- allocator.start(); +- sweeper.start(); +- +- try { +- allocator.join(); +- sweeper.join(); +- } catch (InterruptedException e) { +- e.printStackTrace(); +- System.out.println("Unexpected exception."); +- testFailed = true; +- } +- +- listener.checkResult(); +- +- if (testFailed) +- throw new RuntimeException("TEST FAILED."); +- +- System.out.println("Test passed."); +- + } + + private static void goSleep(long ms) { + try { + Thread.sleep(ms); + } catch (InterruptedException e) { +- e.printStackTrace(); +- System.out.println("Unexpected exception."); ++ System.out.println("Unexpected exception:" + e); + testFailed = true; + } + } + +- private static Object go = new Object(); +- private static boolean waiting = false; // No thread is waiting. +- +- // Synchronizes two thread. If no thread is waiting then wait +- // for notification from a different thread and if it is +- // is waiting then send notification. +- // In this test case this method is used to synchronize sweeper +- // thread and alocater thread to reach a particular point. +- private static void wait_or_notify() { +- synchronized (go) { +- if (waiting == false) { +- waiting = true; +- System.out.println(" Waiting "); +- try { +- go.wait(); +- } catch (InterruptedException e) { +- e.printStackTrace(); +- testFailed = true; +- } +- waiting = false; +- } else { +- System.out.println(" Notify "); +- go.notify(); +- } +- } +- } +- +- private static List objectPool = new ArrayList(); ++ private static final List objectPool = new ArrayList<>(); + static class AllocatorThread extends Thread { + public void doTask() { + int iterations = 0; + int numElements = (int) (chunkSize / 4); // minimal object size +- while (!listenerInvoked) { ++ while (!listenerInvoked || mpool.getUsage().getUsed() < mpool.getUsageThreshold()) { + iterations++; + if (trace) { + System.out.println(" Iteration " + iterations + +@@ -234,23 +232,25 @@ + goSleep(100); + } + } ++ @Override + public void run() { + for (int i = 1; i <= NUM_TRIGGERS; i++) { +- System.out.println("AllocatorThread is doing task " + i); ++ // Sync with SweeperThread's second phase. ++ phaser.arriveAndAwaitAdvance(); ++ System.out.println("AllocatorThread is doing task " + i + ++ " phase " + phaser.getPhase()); + doTask(); +- synchronized (sweep) { +- sweep.notify(); ++ // Sync with SweeperThread's first phase. ++ phaser.arriveAndAwaitAdvance(); ++ System.out.println("AllocatorThread done task " + i + ++ " phase " + phaser.getPhase()); ++ if (testFailed) { ++ return; + } +- // System.out.print(" Allocater Thread "); +- // If sweeper thread is waiting then send notify +- // else wait for notification from sweeper thread. +- wait_or_notify(); +- if (testFailed) return; + } + } + } + +- private static Object sweep = new Object(); + static class SweeperThread extends Thread { + private void doTask() { + for (; mpool.getUsage().getUsed() >= +@@ -261,28 +261,21 @@ + goSleep(100); + } + } ++ @Override + public void run() { + for (int i = 1; i <= NUM_TRIGGERS; i++) { +- synchronized (sweep) { +- while (!listenerInvoked) { +- try { +- sweep.wait(); +- } catch (InterruptedException e) { +- e.printStackTrace(); +- System.out.println("Unexpected exception."); +- testFailed = true; +- } +- } +- } +- System.out.println("SweepThread is doing task " + i); ++ // Sync with AllocatorThread's first phase. ++ phaser.arriveAndAwaitAdvance(); ++ System.out.println("SweepThread is doing task " + i + ++ " phase " + phaser.getPhase()); + doTask(); + + listenerInvoked = false; + +- // System.out.print(" Sweeper Thread "); +- // If Allocater thread is waiting wait send notify +- // else wait for notfication from allocater thread. +- wait_or_notify(); ++ // Sync with AllocatorThread's second phase. ++ phaser.arriveAndAwaitAdvance(); ++ System.out.println("SweepThread done task " + i + ++ " phase " + phaser.getPhase()); + if (testFailed) return; + } + } +--- ./jdk/test/java/lang/management/MemoryMXBean/LowMemoryTestConcMarkSweepGC.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/MemoryMXBean/LowMemoryTestConcMarkSweepGC.sh Thu Jan 01 00:00:00 1970 +0000 +@@ -1,52 +0,0 @@ +-# +-# Copyright (c) 2003, 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 4530538 +-# @summary Test LowMemoryTest with concurrent mark sweep GC +-# @author Mandy Chung +-# +-# @run build LowMemoryTest +-# @run shell/timeout=600 LowMemoryTestConcMarkSweepGC.sh +-# +- +-#Set appropriate jdk +- +-if [ ! -z "${TESTJAVA}" ] ; then +- jdk="$TESTJAVA" +-else +- echo "--Error: TESTJAVA must be defined as the pathname of a jdk to test." +- exit 1 +-fi +- +-runOne() +-{ +- echo "runOne $@" +- $TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES $@ || exit 2 +-} +- +-# Test LowMemoryTest with concurrent collector +-runOne -XX:+UseConcMarkSweepGC LowMemoryTest +- +-exit 0 +--- ./jdk/test/java/lang/management/MemoryMXBean/LowMemoryTestParallelGC.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/MemoryMXBean/LowMemoryTestParallelGC.sh Thu Jan 01 00:00:00 1970 +0000 +@@ -1,52 +0,0 @@ +-# +-# Copyright (c) 2003, 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 4530538 +-# @summary Test LowMemoryTest with parallel GC +-# @author Mandy Chung +-# +-# @run build LowMemoryTest +-# @run shell/timeout=600 LowMemoryTestParallelGC.sh +-# +- +-#Set appropriate jdk +- +-if [ ! -z "${TESTJAVA}" ] ; then +- jdk="$TESTJAVA" +-else +- echo "--Error: TESTJAVA must be defined as the pathname of a jdk to test." +- exit 1 +-fi +- +-runOne() +-{ +- echo "runOne $@" +- $TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES $@ || exit 2 +-} +- +-# Test LowMemoryTest with parallel scavenger collector +-runOne -XX:+UseParallelGC LowMemoryTest +- +-exit 0 +--- ./jdk/test/java/lang/management/MemoryMXBean/LowMemoryTestSerialGC.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/MemoryMXBean/LowMemoryTestSerialGC.sh Thu Jan 01 00:00:00 1970 +0000 +@@ -1,52 +0,0 @@ +-# +-# Copyright (c) 2003, 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 4530538 +-# @summary Test LowMemoryTest with Serial GC +-# @author Mandy Chung +-# +-# @run build LowMemoryTest +-# @run shell/timeout=600 LowMemoryTestSerialGC.sh +-# +- +-#Set appropriate jdk +- +-if [ ! -z "${TESTJAVA}" ] ; then +- jdk="$TESTJAVA" +-else +- echo "--Error: TESTJAVA must be defined as the pathname of a jdk to test." +- exit 1 +-fi +- +-runOne() +-{ +- echo "runOne $@" +- $TESTJAVA/bin/java ${TESTVMOPTS} -classpath $TESTCLASSES $@ || exit 2 +-} +- +-# Test LowMemoryTest with serial collector +-runOne -XX:+UseSerialGC LowMemoryTest +- +-exit 0 +--- ./jdk/test/java/lang/management/MemoryMXBean/MemoryManagement.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/MemoryMXBean/MemoryManagement.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2010, 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 +@@ -23,9 +23,9 @@ + + /* + * @test +- * @bug 4530538 ++ * @bug 4530538 6980984 + * @summary Basic unit test of memory management testing: +- * 1) setUsatgeThreshold() and getUsageThreshold() ++ * 1) setUsageThreshold() and getUsageThreshold() + * 2) test low memory detection on the old generation. + * + * @author Mandy Chung +@@ -40,16 +40,18 @@ + import javax.management.openmbean.CompositeData; + + public class MemoryManagement { +- private static MemoryMXBean mm = ManagementFactory.getMemoryMXBean(); +- private static List pools = ManagementFactory.getMemoryPoolMXBeans(); +- private static List managers = ManagementFactory.getMemoryManagerMXBeans(); +- private static MemoryPoolMXBean mpool = null; +- private static boolean trace = false; +- private static boolean testFailed = false; ++ private static final MemoryMXBean mm = ManagementFactory.getMemoryMXBean(); ++ private static final List pools = ++ Collections.synchronizedList(ManagementFactory.getMemoryPoolMXBeans()); ++ private static final List managers = ++ Collections.synchronizedList(ManagementFactory.getMemoryManagerMXBeans()); ++ private static volatile MemoryPoolMXBean mpool = null; ++ private static volatile boolean trace = false; ++ private static volatile boolean testFailed = false; + private static final int NUM_CHUNKS = 2; +- private static long chunkSize; ++ private static volatile long chunkSize; ++ private static volatile int listenerInvoked = 0; + +- private static int listenerInvoked = 0; + static class SensorListener implements NotificationListener { + public void handleNotification(Notification notif, Object handback) { + String type = notif.getType(); +@@ -101,7 +103,13 @@ + + // Now set threshold + MemoryUsage mu = mpool.getUsage(); +- chunkSize = (mu.getMax() - mu.getUsed()) / 20; ++ long max = mu.getMax(); ++ if (max != -1) { ++ chunkSize = (max - mu.getUsed()) / 20; ++ } else { // 6980984 ++ System.gc(); ++ chunkSize = Runtime.getRuntime().freeMemory()/20; ++ } + newThreshold = mu.getUsed() + (chunkSize * NUM_CHUNKS); + + System.out.println("Setting threshold for " + mpool.getName() + +--- ./jdk/test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java Wed Jul 30 18:42:59 2014 +0100 +@@ -32,11 +32,9 @@ + * @summary Basic Test for MemoryPool.resetPeakUsage() + * @author Mandy Chung + * +- * @build ResetPeakMemoryUsage MemoryUtil +- * @run main/othervm -XX:+PrintGCDetails -XX:+UseSerialGC -Xms256m -XX:MarkSweepAlwaysCompactCount=1 -Xmn8m ResetPeakMemoryUsage +- * @run main/othervm -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -Xms256m -Xmn8m ResetPeakMemoryUsage +- * @run main/othervm -XX:+PrintGCDetails -XX:+UseParallelGC -Xms256m -Xmn8m ResetPeakMemoryUsage +- * @run main/othervm -XX:+PrintGCDetails -XX:+UseG1GC -Xms256m -Xmn8m -XX:G1HeapRegionSize=1m ResetPeakMemoryUsage ++ * @library /lib/testlibrary/ ++ * @build ResetPeakMemoryUsage MemoryUtil RunUtil ++ * @run main ResetPeakMemoryUsage + */ + + import java.lang.management.*; +@@ -47,24 +45,42 @@ + // make public so that it can't be optimized away easily + public static Object[] obj; + +- public static void main(String[] argv) { +- List pools = ManagementFactory.getMemoryPoolMXBeans(); +- ListIterator iter = pools.listIterator(); +- boolean found = false; +- while (iter.hasNext()) { +- MemoryPoolMXBean p = (MemoryPoolMXBean) iter.next(); +- // only check heap pools that support usage threshold +- // this is typically only the old generation space +- // since the other spaces are expected to get filled up +- if (p.getType() == MemoryType.HEAP && +- p.isUsageThresholdSupported()) +- { +- found = true; +- testPool(p); ++ /** ++ * Run the test multiple times with different GC versions. ++ * First with default command line specified by the framework. ++ * Then with all GC versions specified by the test. ++ */ ++ public static void main(String a[]) throws Throwable { ++ final String main = "ResetPeakMemoryUsage$TestMain"; ++ final String ms = "-Xms256m"; ++ final String mn = "-Xmn8m"; ++ RunUtil.runTestClearGcOpts(main, ms, mn, "-XX:+UseConcMarkSweepGC"); ++ RunUtil.runTestClearGcOpts(main, ms, mn, "-XX:+UseParallelGC"); ++ RunUtil.runTestClearGcOpts(main, ms, mn, "-XX:+UseG1GC", "-XX:G1HeapRegionSize=1m"); ++ RunUtil.runTestClearGcOpts(main, ms, mn, "-XX:+UseSerialGC", ++ "-XX:MarkSweepAlwaysCompactCount=1"); ++ } ++ ++ private static class TestMain { ++ public static void main(String[] argv) { ++ List pools = ManagementFactory.getMemoryPoolMXBeans(); ++ ListIterator iter = pools.listIterator(); ++ boolean found = false; ++ while (iter.hasNext()) { ++ MemoryPoolMXBean p = (MemoryPoolMXBean) iter.next(); ++ // only check heap pools that support usage threshold ++ // this is typically only the old generation space ++ // since the other spaces are expected to get filled up ++ if (p.getType() == MemoryType.HEAP && ++ p.isUsageThresholdSupported()) ++ { ++ found = true; ++ testPool(p); ++ } + } +- } +- if (!found) { +- throw new RuntimeException("No heap pool found"); ++ if (!found) { ++ throw new RuntimeException("No heap pool found"); ++ } + } + } + +@@ -142,7 +158,7 @@ + formatSize("previous peak", peak2.getUsed())); + } + +- System.out.println("Test passed."); ++ System.out.println(RunUtil.successMessage); + } + + private static String INDENT = " "; +--- ./jdk/test/java/lang/management/MemoryMXBean/RunUtil.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/management/MemoryMXBean/RunUtil.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,84 @@ ++/* ++ * 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. ++ */ ++ ++/** ++ * Utility class for launching a test in a separate JVM. ++ */ ++ ++import java.util.List; ++import java.util.ArrayList; ++import java.util.Arrays; ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.Utils; ++import jdk.testlibrary.ProcessTools; ++import jdk.testlibrary.JDKToolFinder; ++ ++public class RunUtil { ++ ++ // Used to mark that the test has passed successfully. ++ public static final String successMessage = "Test passed."; ++ ++ public static void runTestClearGcOpts(String main, String... testOpts) throws Throwable { ++ runTest(main, true, testOpts); ++ } ++ ++ public static void runTestKeepGcOpts(String main, String... testOpts) throws Throwable { ++ runTest(main, false, testOpts); ++ } ++ ++ /** ++ * Runs a test in a separate JVM. ++ * command line like: ++ * {test_jdk}/bin/java {defaultopts} -cp {test.class.path} {testopts} main ++ * ++ * {defaultopts} are the default java options set by the framework. ++ * Default GC options in {defaultopts} may be removed. ++ * This is used when the test specifies its own GC options. ++ * ++ * @param main Name of the main class. ++ * @param clearGcOpts true if the default GC options should be removed. ++ * @param testOpts java options specified by the test. ++ */ ++ private static void runTest(String main, boolean clearGcOpts, String... testOpts) ++ throws Throwable { ++ List opts = new ArrayList<>(); ++ opts.add(JDKToolFinder.getJDKTool("java")); ++ opts.addAll(Arrays.asList(Utils.getTestJavaOpts())); ++ opts.add("-cp"); ++ opts.add(System.getProperty("test.class.path", "test.class.path")); ++ opts.add("-XX:+PrintGCDetails"); ++ ++ if (clearGcOpts) { ++ opts = Utils.removeGcOpts(opts); ++ } ++ opts.addAll(Arrays.asList(testOpts)); ++ opts.add(main); ++ ++ OutputAnalyzer output = ProcessTools.executeProcess(opts.toArray(new String[0])); ++ output.shouldHaveExitValue(0); ++ if (output.getStdout().indexOf(successMessage) < 0) { ++ throw new Exception("output missing '" + successMessage + "'"); ++ } ++ } ++ ++} +--- ./jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -61,7 +61,7 @@ + while true; do + echo "Run $i: TestSystemLoadAvg" + case `uname -s` in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + runOne GetSystemLoadAverage + ;; + * ) +--- ./jdk/test/java/lang/management/ThreadMXBean/Locks.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/ThreadMXBean/Locks.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,18 +27,19 @@ + * @summary Basic unit test of ThreadInfo.getLockName() + * and ThreadInfo.getLockOwnerName() + * @author Mandy Chung ++ * @author Jaroslav Bachorik + * +- * @build ThreadExecutionSynchronizer + * @run main/othervm Locks + */ + + import java.lang.management.*; ++import java.util.concurrent.Phaser; + + public class Locks { +- private static Object objA = new Object(); +- private static Object objB = new Object(); +- private static Object objC = new Object(); +- private static ThreadMXBean tm = ManagementFactory.getThreadMXBean(); ++ private static final Object objA = new Object(); ++ private static final Object objB = new Object(); ++ private static final Object objC = new Object(); ++ private static final ThreadMXBean tm = ManagementFactory.getThreadMXBean(); + + private static boolean testFailed = false; + +@@ -46,48 +47,62 @@ + if (lock == null) return null; + + return lock.getClass().getName() + '@' + +- Integer.toHexString(System.identityHashCode(lock)); ++ Integer.toHexString(System.identityHashCode(lock)); ++ } ++ ++ private static void assertNoLock(Thread t) { ++ long tid = t.getId(); ++ ThreadInfo info = tm.getThreadInfo(tid); ++ String result = info.getLockName(); ++ ++ if (result != null) { ++ throw new RuntimeException("Thread " + t.getName() + " is not supposed to hold any lock. " + ++ "Currently owning lock: " + result); ++ } + } + + private static void checkBlockedObject(Thread t, Object lock, Thread owner, + Thread.State expectedState) { +- ThreadInfo info = tm.getThreadInfo(t.getId()); ++ long tid = t.getId(); ++ ThreadInfo info = tm.getThreadInfo(tid); + String result = info.getLockName(); + String expectedLock = (lock != null ? getLockName(lock) : null); + String expectedOwner = (owner != null ? owner.getName() : null); + + if (lock != null) { +- if (expectedState ==Thread.State.BLOCKED) { ++ if (expectedState == Thread.State.BLOCKED) { + int retryCount=0; + while(info.getThreadState() != Thread.State.BLOCKED) { + if (retryCount++ > 500) { + throw new RuntimeException("Thread " + t.getName() + +- " is expected to block on " + expectedLock + +- " but got " + result + +- " Thread.State = " + info.getThreadState()); ++ " is expected to block on " + expectedLock + ++ " but got " + result + ++ " Thread.State = " + info.getThreadState()); + } + goSleep(100); ++ info = tm.getThreadInfo(tid); ++ result = info.getLockName(); + } + } + if (expectedState == Thread.State.WAITING && +- info.getThreadState() != Thread.State.WAITING) { ++ info.getThreadState() != Thread.State.WAITING) { + throw new RuntimeException("Thread " + t.getName() + +- " is expected to wait on " + expectedLock + +- " but got " + result + +- " Thread.State = " + info.getThreadState()); ++ " is expected to wait on " + expectedLock + ++ " but got " + result + ++ " Thread.State = " + info.getThreadState()); + } + } + + if ((result != null && !result.equals(expectedLock)) || +- (result == null && expectedLock != null)) { ++ (result == null && expectedLock != null)) { + throw new RuntimeException("Thread " + t.getName() + " is blocked on " + +- expectedLock + " but got " + result); ++ expectedLock + " but got " + result); + } + result = info.getLockOwnerName(); + if ((result != null && !result.equals(expectedOwner)) || +- (result == null && expectedOwner != null)) { ++ (result == null && expectedOwner != null)) { + throw new RuntimeException("Owner of " + lock + " should be " + +- expectedOwner + " but got " + result); ++ expectedOwner + " but got " + result); + } + } + +@@ -100,53 +115,49 @@ + } + } + +- static ThreadExecutionSynchronizer thrsync = new ThreadExecutionSynchronizer(); +- static ThreadExecutionSynchronizer thrsync1 = new ThreadExecutionSynchronizer(); ++ private static volatile int dummyCounter = 0; + + static class LockAThread extends Thread { +- public LockAThread() { ++ private final Phaser p; ++ public LockAThread(Phaser p) { + super("LockAThread"); ++ this.p = p; + } + public void run() { + synchronized(objA) { +- // stop here for LockBThread to hold objB +- thrsync.waitForSignal(); +- +- System.out.println("LockAThread about to block on objB"); +- synchronized(objB) {}; ++ // stop here for LockBThread to hold objB ++ System.out.println("LockAThread about to block on objB"); ++ p.arriveAndAwaitAdvance(); // Phase 1 (blocking) ++ synchronized(objB) { ++ dummyCounter++; ++ }; + } ++ p.arriveAndAwaitAdvance(); // Phase 2 (blocking) + System.out.println("LockAThread about to exit"); +- // The state could be anything. The expected state value +- // passed with this method is not verified. +- checkBlockedObject(this, null, null, Thread.State.TERMINATED); ++ // Make sure the current thread is not holding any lock ++ assertNoLock(this); + } + } + + static class LockBThread extends Thread { +- public LockBThread() { ++ private final Phaser p; ++ public LockBThread(Phaser p) { + super("LockBThread"); ++ this.p = p; + } + public void run() { + synchronized(objB) { +- // signal waiting LockAThread. +- thrsync.signal(); +- +- System.out.println("LockBThread about to block on objC"); +- // Signal main thread about to block on objC +- thrsync1.signal(); +- synchronized(objC) {}; ++ System.out.println("LockBThread about to block on objC"); ++ p.arriveAndAwaitAdvance(); // Phase 1 (blocking) ++ // Signal main thread about to block on objC ++ synchronized(objC) { ++ dummyCounter++; ++ }; + } ++ p.arriveAndAwaitAdvance(); // Phase 2 (blocking) + System.out.println("LockBThread about to exit"); +- // The state could be anything. The expected state value +- // passed with this method is not verified. +- checkBlockedObject(this, null, null, Thread.State.TERMINATED); +- } +- +- public void aboutToLockC() { +- // Stop here till LockBThread about to blocked +- // for lock objC. +- thrsync1.waitForSignal(); +- goSleep(500); ++ // Make sure the current thread is not holding any lock ++ assertNoLock(this); + } + } + +@@ -154,32 +165,36 @@ + private static Object ready = new Object(); + private static CheckerThread checker; + static class WaitingThread extends Thread { +- public WaitingThread() { ++ private final Phaser p; ++ public WaitingThread(Phaser p) { + super("WaitingThread"); ++ this.p = p; + } + public void run() { + synchronized(objC) { +- System.out.println("WaitingThread about to wait on objC"); +- try { +- // Signal checker thread, about to wait on objC. +- thrsync.signal(); +- objC.wait(); +- } catch (InterruptedException e) { +- e.printStackTrace(); +- testFailed = true; +- } ++ System.out.println("WaitingThread about to wait on objC"); ++ try { ++ // Signal checker thread, about to wait on objC. ++ p.arriveAndAwaitAdvance(); // Phase 1 (waiting) ++ objC.wait(); ++ } catch (InterruptedException e) { ++ e.printStackTrace(); ++ testFailed = true; ++ } + +- // block until CheckerThread finishes checking +- System.out.println("WaitingThread about to block on ready"); +- // signal checker thread that it is about acquire +- // object ready. +- thrsync.signal(); +- synchronized(ready) {}; ++ // block until CheckerThread finishes checking ++ System.out.println("WaitingThread about to block on ready"); ++ // signal checker thread that it is about acquire ++ // object ready. ++ p.arriveAndAwaitAdvance(); // Phase 2 (waiting) ++ synchronized(ready) { ++ dummyCounter++; ++ }; + } + synchronized(objC) { + try { + // signal checker thread, about to wait on objC +- thrsync.signal(); ++ p.arriveAndAwaitAdvance(); // Phase 3 (waiting) + objC.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); +@@ -190,21 +205,23 @@ + } + } + static class CheckerThread extends Thread { +- public CheckerThread() { ++ private final Phaser p; ++ public CheckerThread(Phaser p) { + super("CheckerThread"); ++ this.p = p; + } + + private void waitForState(Thread.State state) { +- thrsync.waitForSignal(); +- while (waiter.getState() != state) { +- goSleep(10); ++ p.arriveAndAwaitAdvance(); ++ while (!waiter.isInterrupted() && waiter.getState() != state) { ++ goSleep(10); + } + } + + public void run() { + synchronized (ready) { + // wait until WaitingThread about to wait for objC +- waitForState(Thread.State.WAITING); ++ waitForState(Thread.State.WAITING); // Phase 1 (waiting) + checkBlockedObject(waiter, objC, null, Thread.State.WAITING); + + synchronized (objC) { +@@ -213,13 +230,13 @@ + + // wait for waiter thread to about to enter + // synchronized object ready. +- waitForState(Thread.State.BLOCKED); ++ waitForState(Thread.State.BLOCKED); // Phase 2 (waiting) + checkBlockedObject(waiter, ready, this, Thread.State.BLOCKED); + } + + // wait for signal from waiting thread that it is about + // wait for objC. +- waitForState(Thread.State.WAITING); ++ waitForState(Thread.State.WAITING); // Phase 3 (waiting) + synchronized(objC) { + checkBlockedObject(waiter, objC, Thread.currentThread(), Thread.State.WAITING); + objC.notify(); +@@ -235,24 +252,24 @@ + LockAThread t1; + LockBThread t2; + ++ Phaser p = new Phaser(3); + synchronized(objC) { +- // The state could be anything. The expected state value +- // passed with this method is not verified. +- checkBlockedObject(mainThread, null, null, Thread.State.RUNNABLE); ++ // Make sure the main thread is not holding any lock ++ assertNoLock(mainThread); + + // Test deadlock case + // t1 holds lockA and attempts to lock B + // t2 holds lockB and attempts to lock C +- t1 = new LockAThread(); ++ ++ t1 = new LockAThread(p); + t1.start(); + +- t2 = new LockBThread(); ++ t2 = new LockBThread(p); + t2.start(); + +- t2.aboutToLockC(); +- ++ p.arriveAndAwaitAdvance(); // Phase 1 (blocking) ++ checkBlockedObject(t2, objC, mainThread, Thread.State.BLOCKED); + checkBlockedObject(t1, objB, t2, Thread.State.BLOCKED); +- checkBlockedObject(t2, objC, mainThread, Thread.State.BLOCKED); + + long[] expectedThreads = new long[3]; + expectedThreads[0] = t1.getId(); // blocked on lockB +@@ -260,13 +277,14 @@ + expectedThreads[2] = mainThread.getId(); // owner of lockC + findThreadsBlockedOn(objB, expectedThreads); + } +- goSleep(100); ++ p.arriveAndAwaitAdvance(); // Phase 2 (blocking) + ++ p = new Phaser(2); + // Test Object.wait() case +- waiter = new WaitingThread(); ++ waiter = new WaitingThread(p); + waiter.start(); + +- checker = new CheckerThread(); ++ checker = new CheckerThread(p); + checker.start(); + + try { +@@ -284,7 +302,7 @@ + } + + private static ThreadInfo findOwnerInfo(ThreadInfo[] infos, String lock) +- throws Exception { ++ throws Exception { + ThreadInfo ownerInfo = null; + for (int i = 0; i < infos.length; i++) { + String blockedLock = infos[i].getLockName(); +@@ -292,7 +310,7 @@ + long threadId = infos[i].getLockOwnerId(); + if (threadId == -1) { + throw new RuntimeException("TEST FAILED: " + +- lock + " expected to have owner"); ++ lock + " expected to have owner"); + } + for (int j = 0; j < infos.length; j++) { + if (infos[j].getThreadId() == threadId) { +@@ -305,7 +323,7 @@ + return ownerInfo; + } + private static void findThreadsBlockedOn(Object o, long[] expectedThreads) +- throws Exception { ++ throws Exception { + String lock = getLockName(o); + // Check with ThreadInfo with no stack trace (i.e. no safepoint) + ThreadInfo[] infos = tm.getThreadInfo(tm.getAllThreadIds()); +@@ -317,14 +335,14 @@ + } + + private static void doCheck(ThreadInfo[] infos, String lock, long[] expectedThreads) +- throws Exception { ++ throws Exception { + ThreadInfo ownerInfo = null; + // Find the thread who is blocking on lock + for (int i = 0; i < infos.length; i++) { + String blockedLock = infos[i].getLockName(); + if (lock.equals(blockedLock)) { + System.out.print(infos[i].getThreadName() + +- " blocked on " + blockedLock); ++ " blocked on " + blockedLock); + ownerInfo = infos[i]; + } + } +@@ -336,7 +354,7 @@ + ownerInfo = findOwnerInfo(infos, lock); + threads[count++] = ownerInfo.getThreadId(); + System.out.println(" Owner = " + ownerInfo.getThreadName() + +- " id = " + ownerInfo.getThreadId()); ++ " id = " + ownerInfo.getThreadId()); + lock = ownerInfo.getLockName(); + System.out.print(ownerInfo.getThreadName() + " Id = " + + ownerInfo.getThreadId() + +@@ -346,13 +364,13 @@ + + if (count != expectedThreads.length) { + throw new RuntimeException("TEST FAILED: " + +- "Expected chain of threads not matched; current count =" + count); ++ "Expected chain of threads not matched; current count =" + count); + } + for (int i = 0; i < count; i++) { + if (threads[i] != expectedThreads[i]) { + System.out.println("TEST FAILED: " + +- "Unexpected thread in the chain " + threads[i] + +- " expected to be " + expectedThreads[i]); ++ "Unexpected thread in the chain " + threads[i] + ++ " expected to be " + expectedThreads[i]); + } + } + } +--- ./jdk/test/java/lang/management/ThreadMXBean/SynchronizationStatistics.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/ThreadMXBean/SynchronizationStatistics.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -27,45 +27,28 @@ + * @summary Basic unit test of the synchronization statistics support: + * + * @author Mandy Chung ++ * @author Jaroslav Bachorik + * +- * @ignore 6309226 +- * @build Semaphore + * @run main/othervm SynchronizationStatistics + */ + + import java.lang.management.*; ++import java.util.concurrent.Phaser; + + public class SynchronizationStatistics { +- private static ThreadMXBean mbean = ManagementFactory.getThreadMXBean(); +- +- private static boolean blockedTimeCheck = +- mbean.isThreadContentionMonitoringSupported(); +- private static boolean trace = false; +- +- private static Object lockA = new Object(); +- private static Object lockB = new Object(); +- private static Object lockC = new Object(); +- private static Object lockD = new Object(); +- private static Object waiter = new Object(); +- private static volatile boolean testFailed = false; +- +- private static Object go = new Object(); +- +- private static void goSleep(long ms) { +- try { +- Thread.sleep(ms); +- } catch (InterruptedException e) { +- e.printStackTrace(); +- System.out.println("Unexpected exception."); +- testFailed = true; ++ private static class LockerThread extends Thread { ++ public LockerThread(Runnable r) { ++ super(r, "LockerThread"); + } + } + ++ private static final ThreadMXBean mbean = ManagementFactory.getThreadMXBean(); ++ ++ private static final boolean blockedTimeCheck = ++ mbean.isThreadContentionMonitoringSupported(); ++ ++ + public static void main(String args[]) throws Exception { +- if (args.length > 0 && args[0].equals("trace")) { +- trace = true; +- } +- + if (blockedTimeCheck) { + mbean.setThreadContentionMonitoringEnabled(true); + } +@@ -75,457 +58,317 @@ + "Thread Contention Monitoring is not enabled"); + } + +- Examiner examiner = new Examiner("Examiner"); +- BlockedThread blocked = new BlockedThread("BlockedThread"); +- examiner.setThread(blocked); +- +- // Start the threads and check them in Blocked and Waiting states +- examiner.start(); +- +- // wait until the examiner acquires all the locks and waiting +- // for the BlockedThread to start +- examiner.waitUntilWaiting(); +- +- System.out.println("Checking the thread state for the examiner thread " + +- "is waiting to begin."); +- +- // The Examiner should be waiting to be notified by the BlockedThread +- checkThreadState(examiner, Thread.State.WAITING); +- +- System.out.println("Now starting the blocked thread"); +- blocked.start(); +- +- try { +- examiner.join(); +- blocked.join(); +- } catch (InterruptedException e) { +- e.printStackTrace(); +- System.out.println("Unexpected exception."); +- testFailed = true; +- } +- +- if (testFailed) +- throw new RuntimeException("TEST FAILED."); ++ testBlockingOnSimpleMonitor(); ++ testBlockingOnNestedMonitor(); ++ testWaitingOnSimpleMonitor(); ++ testMultiWaitingOnSimpleMonitor(); ++ testWaitingOnNestedMonitor(); + + System.out.println("Test passed."); + } + +- private static String INDENT = " "; +- private static void printStack(Thread t, StackTraceElement[] stack) { +- System.out.println(INDENT + t + +- " stack: (length = " + stack.length + ")"); +- if (t != null) { +- for (int j = 0; j < stack.length; j++) { +- System.out.println(INDENT + stack[j]); +- } +- System.out.println(); ++ private static LockerThread newLockerThread(Runnable r) { ++ LockerThread t = new LockerThread(r); ++ t.setDaemon(true); ++ return t; ++ } ++ ++ private static void waitForThreadState(Thread t, Thread.State state) throws InterruptedException { ++ while (!t.isInterrupted() && t.getState() != state) { ++ Thread.sleep(3); + } + } + +- private static void checkThreadState(Thread thread, Thread.State s) +- throws Exception { ++ /** ++ * Tests that blocking on a single monitor properly increases the ++ * blocked count at least by 1. Also asserts that the correct lock name is provided. ++ */ ++ private static void testBlockingOnSimpleMonitor() throws Exception { ++ System.out.println("testBlockingOnSimpleMonitor"); ++ final Object lock1 = new Object(); ++ final Phaser p = new Phaser(2); ++ LockerThread lt = newLockerThread(new Runnable() { ++ @Override ++ public void run() { ++ p.arriveAndAwaitAdvance(); // phase[1] ++ synchronized(lock1) { ++ System.out.println("[LockerThread obtained Lock1]"); ++ p.arriveAndAwaitAdvance(); // phase[2] ++ } ++ p.arriveAndAwaitAdvance(); // phase[3] ++ } ++ }); + +- ThreadInfo ti = mbean.getThreadInfo(thread.getId()); +- if (ti.getThreadState() != s) { +- ThreadInfo info = mbean.getThreadInfo(thread.getId(), +- Integer.MAX_VALUE); +- System.out.println(INDENT + "TEST FAILED:"); +- printStack(thread, info.getStackTrace()); +- System.out.println(INDENT + "Thread state: " + info.getThreadState()); ++ lt.start(); ++ long tid = lt.getId(); ++ ThreadInfo ti = mbean.getThreadInfo(tid); ++ String lockName = null; ++ synchronized(lock1) { ++ p.arriveAndAwaitAdvance(); // phase[1] ++ waitForThreadState(lt, Thread.State.BLOCKED); ++ lockName = mbean.getThreadInfo(tid).getLockName(); ++ } + +- throw new RuntimeException("TEST FAILED: " + +- "Thread state for " + thread + " returns " + ti.getThreadState() + +- ". Expected to be " + s); ++ p.arriveAndAwaitAdvance(); // phase[2] ++ testBlocked(ti, mbean.getThreadInfo(tid), lockName, lock1); ++ p.arriveAndDeregister(); // phase[3] ++ ++ lt.join(); ++ ++ System.out.println("OK"); ++ } ++ ++ /** ++ * Tests that blocking on a nested monitor properly increases the ++ * blocked count at least by 1 - it is not affected by the nesting depth. ++ * Also asserts that the correct lock name is provided. ++ */ ++ private static void testBlockingOnNestedMonitor() throws Exception { ++ System.out.println("testBlockingOnNestedMonitor"); ++ final Object lock1 = new Object(); ++ final Object lock2 = new Object(); ++ ++ final Phaser p = new Phaser(2); ++ LockerThread lt = newLockerThread(new Runnable() { ++ @Override ++ public void run() { ++ p.arriveAndAwaitAdvance(); // phase[1] ++ synchronized(lock1) { ++ System.out.println("[LockerThread obtained Lock1]"); ++ p.arriveAndAwaitAdvance(); // phase[2] ++ p.arriveAndAwaitAdvance(); // phase[3] ++ synchronized(lock2) { ++ System.out.println("[LockerThread obtained Lock2]"); ++ p.arriveAndAwaitAdvance(); // phase[4] ++ } ++ p.arriveAndAwaitAdvance(); // phase[5] ++ } ++ } ++ }); ++ ++ lt.start(); ++ long tid = lt.getId(); ++ ThreadInfo ti = mbean.getThreadInfo(tid); ++ ThreadInfo ti1 = null; ++ String lockName = null; ++ synchronized(lock1) { ++ p.arriveAndAwaitAdvance(); // phase[1] ++ waitForThreadState(lt, Thread.State.BLOCKED); ++ lockName = mbean.getThreadInfo(tid).getLockName(); ++ } ++ p.arriveAndAwaitAdvance(); // phase[2] ++ ++ ti1 = mbean.getThreadInfo(tid); ++ testBlocked(ti, ti1, lockName, lock1); ++ ti = ti1; ++ ++ synchronized(lock2) { ++ p.arriveAndAwaitAdvance(); // phase [3] ++ waitForThreadState(lt, Thread.State.BLOCKED); ++ lockName = mbean.getThreadInfo(tid).getLockName(); ++ } ++ p.arriveAndAwaitAdvance(); // phase [4] ++ testBlocked(ti, mbean.getThreadInfo(tid), lockName, lock2); ++ p.arriveAndDeregister(); ++ ++ lt.join(); ++ ++ System.out.println("OK"); ++ } ++ ++ /** ++ * Tests that waiting on a single monitor properly increases the waited ++ * count by 1 and the waited time by a positive number. ++ */ ++ private static void testWaitingOnSimpleMonitor() throws Exception { ++ System.out.println("testWaitingOnSimpleMonitor"); ++ final Object lock1 = new Object(); ++ final Phaser p = new Phaser(2); ++ LockerThread lt = newLockerThread(new Runnable() { ++ @Override ++ public void run() { ++ p.arriveAndAwaitAdvance(); // phase[1] ++ synchronized(lock1) { ++ System.out.println("[LockerThread obtained Lock1]"); ++ try { ++ lock1.wait(300); ++ } catch (InterruptedException ex) { ++ // ignore ++ } ++ p.arriveAndAwaitAdvance(); // phase[2] ++ } ++ p.arriveAndAwaitAdvance(); // phase[3] ++ } ++ }); ++ ++ lt.start(); ++ ThreadInfo ti1 = mbean.getThreadInfo(lt.getId()); ++ synchronized(lock1) { ++ p.arriveAndAwaitAdvance(); // phase[1] ++ waitForThreadState(lt, Thread.State.BLOCKED); ++ } ++ p.arriveAndAwaitAdvance(); // phase[2] ++ ++ ThreadInfo ti2 = mbean.getThreadInfo(lt.getId()); ++ p.arriveAndDeregister(); // phase[3] ++ ++ lt.join(); ++ ++ testWaited(ti1, ti2, 1); ++ System.out.println("OK"); ++ } ++ ++ /** ++ * Tests that waiting multiple times on the same monitor subsequently ++ * increases the waited count by the number of subsequent calls and the ++ * waited time by a positive number. ++ */ ++ private static void testMultiWaitingOnSimpleMonitor() throws Exception { ++ System.out.println("testWaitingOnMultipleMonitors"); ++ final Object lock1 = new Object(); ++ ++ final Phaser p = new Phaser(2); ++ LockerThread lt = newLockerThread(new Runnable() { ++ @Override ++ public void run() { ++ p.arriveAndAwaitAdvance(); // phase[1] ++ synchronized(lock1) { ++ System.out.println("[LockerThread obtained Lock1]"); ++ for (int i = 0; i < 3; i++) { ++ try { ++ lock1.wait(300); ++ } catch (InterruptedException ex) { ++ // ignore ++ } ++ p.arriveAndAwaitAdvance(); // phase[2-4] ++ } ++ } ++ p.arriveAndAwaitAdvance(); // phase[5] ++ } ++ }); ++ ++ lt.start(); ++ ThreadInfo ti1 = mbean.getThreadInfo(lt.getId()); ++ synchronized(lock1) { ++ p.arriveAndAwaitAdvance(); //phase[1] ++ waitForThreadState(lt, Thread.State.BLOCKED); ++ } ++ int phase = p.getPhase(); ++ while ((p.arriveAndAwaitAdvance() - phase) < 3); // phase[2-4] ++ ++ ThreadInfo ti2 = mbean.getThreadInfo(lt.getId()); ++ p.arriveAndDeregister(); // phase[5] ++ ++ lt.join(); ++ testWaited(ti1, ti2, 3); ++ System.out.println("OK"); ++ } ++ ++ /** ++ * Tests that waiting on monitors places in nested synchronized blocks ++ * properly increases the waited count by the number of times the "lock.wait()" ++ * was invoked and the waited time by a positive number. ++ */ ++ private static void testWaitingOnNestedMonitor() throws Exception { ++ System.out.println("testWaitingOnNestedMonitor"); ++ final Object lock1 = new Object(); ++ final Object lock2 = new Object(); ++ final Object lock3 = new Object(); ++ ++ final Phaser p = new Phaser(2); ++ LockerThread lt = newLockerThread(new Runnable() { ++ @Override ++ public void run() { ++ p.arriveAndAwaitAdvance(); // phase[1] ++ synchronized(lock1) { ++ System.out.println("[LockerThread obtained Lock1]"); ++ try { ++ lock1.wait(300); ++ } catch (InterruptedException ex) { ++ // ignore ++ } ++ ++ p.arriveAndAwaitAdvance(); // phase[2] ++ synchronized(lock2) { ++ System.out.println("[LockerThread obtained Lock2]"); ++ try { ++ lock2.wait(300); ++ } catch (InterruptedException ex) { ++ // ignore ++ } ++ ++ p.arriveAndAwaitAdvance(); // phase[3] ++ synchronized(lock3) { ++ System.out.println("[LockerThread obtained Lock3]"); ++ try { ++ lock3.wait(300); ++ } catch (InterruptedException ex) { ++ // ignore ++ } ++ p.arriveAndAwaitAdvance(); // phase[4] ++ } ++ } ++ } ++ p.arriveAndAwaitAdvance(); // phase[5] ++ } ++ }); ++ ++ lt.start(); ++ ThreadInfo ti1 = mbean.getThreadInfo(lt.getId()); ++ synchronized(lock1) { ++ p.arriveAndAwaitAdvance(); // phase[1] ++ waitForThreadState(lt, Thread.State.BLOCKED); ++ } ++ ++ synchronized(lock2) { ++ p.arriveAndAwaitAdvance(); // phase[2] ++ waitForThreadState(lt, Thread.State.BLOCKED); ++ } ++ ++ synchronized(lock3) { ++ p.arriveAndAwaitAdvance(); // phase[3] ++ waitForThreadState(lt, Thread.State.BLOCKED); ++ } ++ ++ p.arriveAndAwaitAdvance(); // phase[4] ++ ThreadInfo ti2 = mbean.getThreadInfo(lt.getId()); ++ p.arriveAndDeregister(); // phase[5] ++ ++ lt.join(); ++ testWaited(ti1, ti2, 3); ++ System.out.println("OK"); ++ } ++ ++ private static void testWaited(ThreadInfo ti1, ThreadInfo ti2, int waited) throws Error { ++ long waitCntDiff = ti2.getWaitedCount() - ti1.getWaitedCount(); ++ long waitTimeDiff = ti2.getWaitedTime() - ti1.getWaitedTime(); ++ if (waitCntDiff < waited) { ++ throw new Error("Unexpected diff in waited count. Expecting at least " ++ + waited + " , got " + waitCntDiff); ++ } ++ if (waitTimeDiff <= 0) { ++ throw new Error("Unexpected diff in waited time. Expecting increasing " + ++ "value, got " + waitTimeDiff + "ms"); + } + } + +- private static void checkThreadState(Thread thread, +- Thread.State s1, Thread.State s2) +- throws Exception { +- +- ThreadInfo ti = mbean.getThreadInfo(thread.getId()); +- if (ti.getThreadState() != s1 && ti.getThreadState() != s2) { +- throw new RuntimeException("TEST FAILED: " + +- "Thread state for " + thread + " returns " + ti.getThreadState() + +- ". Expected to be " + s1 + " or " + s2); ++ private static void testBlocked(ThreadInfo ti1, ThreadInfo ti2, ++ String lockName, final Object lock) ++ throws Error { ++ long blkCntDiff = ti2.getBlockedCount() - ti1.getBlockedCount(); ++ long blkTimeDiff = ti2.getBlockedTime() - ti1.getBlockedTime(); ++ if (blkCntDiff < 1) { ++ throw new Error("Unexpected diff in blocked count. Expecting at least 1, " + ++ "got " + blkCntDiff); ++ } ++ if (blkTimeDiff < 0) { ++ throw new Error("Unexpected diff in blocked time. Expecting a positive " + ++ "number, got " + blkTimeDiff); ++ } ++ if (!lockName.equals(lock.toString())) { ++ throw new Error("Unexpected blocked monitor name. Expecting " + ++ lock.toString() + ", got " + ++ lockName); + } + } +- +- static class StatThread extends Thread { +- private long blockingBaseTime = 0; +- private long totalWaitTime = 0; +- private long totalBlockedEnterTime = 0; +- +- StatThread(String name) { +- super(name); +- } +- +- void addWaitTime(long ns) { +- totalWaitTime = totalWaitTime + ns; +- } +- void addBlockedEnterTime(long ns) { +- totalBlockedEnterTime = totalBlockedEnterTime + ns; +- } +- void setBlockingBaseTime(long time) { +- blockingBaseTime = time; +- } +- +- long totalBlockedTimeMs() { +- return totalBlockedEnterTime / 1000000; +- } +- +- long totalBlockedTimeMs(long now) { +- long t = totalBlockedEnterTime + (now - blockingBaseTime); +- return t / 1000000; +- } +- +- long totalWaitTimeMs() { +- return totalWaitTime / 1000000; +- } +- +- long totalWaitTimeMs(long now) { +- long t = totalWaitTime + (now - blockingBaseTime); +- return t / 1000000; +- } +- } +- +- static class BlockedThread extends StatThread { +- private Semaphore handshake = new Semaphore(); +- BlockedThread(String name) { +- super(name); +- } +- void waitUntilBlocked() { +- handshake.semaP(); +- +- // give a chance for the examiner thread to really wait +- goSleep(20); +- } +- +- void waitUntilWaiting() { +- waitUntilBlocked(); +- } +- +- boolean hasWaitersForBlocked() { +- return (handshake.getWaiterCount() > 0); +- } +- +- private void notifyWaiter() { +- // wait until the examiner waits on the semaphore +- while (handshake.getWaiterCount() == 0) { +- goSleep(20); +- } +- handshake.semaV(); +- } +- +- private void waitObj(long ms) { +- synchronized (waiter) { +- try { +- // notify examinerabout to wait on a monitor +- notifyWaiter(); +- +- long base = System.nanoTime(); +- setBlockingBaseTime(base); +- waiter.wait(ms); +- long now = System.nanoTime(); +- addWaitTime(now - base); +- } catch (Exception e) { +- e.printStackTrace(); +- System.out.println("Unexpected exception."); +- testFailed = true; +- } +- } +- } +- +- private void test() { +- // notify examiner about to block on lockA +- notifyWaiter(); +- +- long base = System.nanoTime(); +- setBlockingBaseTime(base); +- synchronized (lockA) { +- long now = System.nanoTime(); +- addBlockedEnterTime(now - base); +- +- A(); // Expected blocked count = 1 +- } +- E(); +- } +- private void A() { +- // notify examiner about to block on lockB +- notifyWaiter(); +- +- long base = System.nanoTime(); +- setBlockingBaseTime(base); +- synchronized (lockB) { +- long now = System.nanoTime(); +- addBlockedEnterTime(now - base); +- +- B(); // Expected blocked count = 2 +- } +- } +- private void B() { +- // notify examiner about to block on lockC +- notifyWaiter(); +- +- long base = System.nanoTime(); +- setBlockingBaseTime(base); +- synchronized (lockC) { +- long now = System.nanoTime(); +- addBlockedEnterTime(now - base); +- +- C(); // Expected blocked count = 3 +- } +- } +- private void C() { +- // notify examiner about to block on lockD +- notifyWaiter(); +- +- long base = System.nanoTime(); +- setBlockingBaseTime(base); +- synchronized (lockD) { +- long now = System.nanoTime(); +- addBlockedEnterTime(now - base); +- +- D(); // Expected blocked count = 4 +- } +- } +- private void D() { +- goSleep(50); +- } +- private void E() { +- final int WAIT = 1000; +- waitObj(WAIT); +- waitObj(WAIT); +- waitObj(WAIT); +- } +- +- public void run() { +- test(); +- } // run() +- } // BlockedThread +- +- static int blockedCount = 0; +- static int waitedCount = 0; +- static class Examiner extends StatThread { +- private BlockedThread blockedThread; +- private Semaphore semaphore = new Semaphore(); +- +- Examiner(String name) { +- super(name); +- } +- +- public void setThread(BlockedThread thread) { +- blockedThread = thread; +- } +- +- private void blockedTimeRangeCheck(StatThread t, +- long blockedTime, +- long nowNano) +- throws Exception { +- long expected = t.totalBlockedTimeMs(nowNano); +- +- // accept 5% range +- timeRangeCheck(blockedTime, expected, 5); +- } +- private void waitedTimeRangeCheck(StatThread t, +- long waitedTime, +- long nowNano) +- throws Exception { +- long expected = t.totalWaitTimeMs(nowNano); +- +- // accept 5% range +- timeRangeCheck(waitedTime, expected, 5); +- } +- +- private void timeRangeCheck(long time, long expected, int percent) +- throws Exception { +- +- double diff = expected - time; +- +- if (trace) { +- System.out.println(" Time = " + time + +- " expected = " + expected + +- ". Diff = " + diff); +- +- } +- // throw an exception if blockedTime and expectedTime +- // differs > percent% +- if (diff < 0) { +- diff = diff * -1; +- } +- +- long range = (expected * percent) / 100; +- // minimum range = 2 ms +- if (range < 2) { +- range = 2; +- } +- if (diff > range) { +- throw new RuntimeException("TEST FAILED: " + +- "Time returned = " + time + +- " expected = " + expected + ". Diff = " + diff); +- } +- } +- private void checkInfo(StatThread t, Thread.State s, Object lock, +- String lockName, int bcount, int wcount) +- throws Exception { +- +- String action = "ERROR"; +- if (s == Thread.State.WAITING || s == Thread.State.TIMED_WAITING) { +- action = "wait on "; +- } else if (s == Thread.State.BLOCKED) { +- action = "block on "; +- } +- System.out.println(t + " expected to " + action + lockName + +- " with blocked count = " + bcount + +- " and waited count = " + wcount); +- +- long now = System.nanoTime(); +- ThreadInfo info = mbean.getThreadInfo(t.getId()); +- if (info.getThreadState() != s) { +- printStack(t, info.getStackTrace()); +- throw new RuntimeException("TEST FAILED: " + +- "Thread state returned is " + info.getThreadState() + +- ". Expected to be " + s); +- } +- +- if (info.getLockName() == null || +- !info.getLockName().equals(lock.toString())) { +- throw new RuntimeException("TEST FAILED: " + +- "getLockName() returned " + info.getLockName() + +- ". Expected to be " + lockName + " - " + lock.toString()); +- } +- +- if (info.getBlockedCount() != bcount) { +- throw new RuntimeException("TEST FAILED: " + +- "Blocked Count returned is " + info.getBlockedCount() + +- ". Expected to be " + bcount); +- } +- if (info.getWaitedCount() != wcount) { +- throw new RuntimeException("TEST FAILED: " + +- "Waited Count returned is " + info.getWaitedCount() + +- ". Expected to be " + wcount); +- } +- +- String lockObj = info.getLockName(); +- if (lockObj == null || !lockObj.equals(lock.toString())) { +- throw new RuntimeException("TEST FAILED: " + +- "Object blocked on is " + lockObj + +- ". Expected to be " + lock.toString()); +- } +- +- if (!blockedTimeCheck) { +- return; +- } +- long blockedTime = info.getBlockedTime(); +- if (blockedTime < 0) { +- throw new RuntimeException("TEST FAILED: " + +- "Blocked time returned is negative = " + blockedTime); +- } +- +- if (s == Thread.State.BLOCKED) { +- blockedTimeRangeCheck(t, blockedTime, now); +- } else { +- timeRangeCheck(blockedTime, t.totalBlockedTimeMs(), 5); +- } +- +- long waitedTime = info.getWaitedTime(); +- if (waitedTime < 0) { +- throw new RuntimeException("TEST FAILED: " + +- "Waited time returned is negative = " + waitedTime); +- } +- if (s == Thread.State.WAITING || s == Thread.State.TIMED_WAITING) { +- waitedTimeRangeCheck(t, waitedTime, now); +- } else { +- timeRangeCheck(waitedTime, t.totalWaitTimeMs(), 5); +- } +- +- } +- +- private void examine() { +- try { +- synchronized (lockD) { +- synchronized (lockC) { +- synchronized (lockB) { +- synchronized (lockA) { +- // notify main thread to continue +- semaphore.semaV(); +- +- // wait until BlockedThread has started +- blockedThread.waitUntilBlocked(); +- +- blockedCount++; +- checkInfo(blockedThread, Thread.State.BLOCKED, +- lockA, "lockA", +- blockedCount, waitedCount); +- } +- +- // wait until BlockedThread to block on lockB +- blockedThread.waitUntilBlocked(); +- +- blockedCount++; +- checkInfo(blockedThread, Thread.State.BLOCKED, +- lockB, "lockB", +- blockedCount, waitedCount); +- } +- +- // wait until BlockedThread to block on lockC +- blockedThread.waitUntilBlocked(); +- +- blockedCount++; +- checkInfo(blockedThread, Thread.State.BLOCKED, +- lockC, "lockC", +- blockedCount, waitedCount); +- } +- // wait until BlockedThread to block on lockD +- blockedThread.waitUntilBlocked(); +- blockedCount++; +- +- checkInfo(blockedThread, Thread.State.BLOCKED, +- lockD, "lockD", +- blockedCount, waitedCount); +- } +- +- // wait until BlockedThread about to call E() +- // BlockedThread will wait on waiter for 3 times +- blockedThread.waitUntilWaiting(); +- +- waitedCount++; +- checkInfo(blockedThread, Thread.State.TIMED_WAITING, +- waiter, "waiter", blockedCount, waitedCount); +- +- blockedThread.waitUntilWaiting(); +- +- waitedCount++; +- checkInfo(blockedThread, Thread.State.TIMED_WAITING, +- waiter, "waiter", blockedCount, waitedCount); +- +- blockedThread.waitUntilWaiting(); +- +- waitedCount++; +- checkInfo(blockedThread, Thread.State.TIMED_WAITING, +- waiter, "waiter", blockedCount, waitedCount); +- +- } catch (Exception e) { +- e.printStackTrace(); +- System.out.println("Unexpected exception."); +- testFailed = true; +- } +- } +- +- public void run() { +- examine(); +- } // run() +- +- public void waitUntilWaiting() { +- semaphore.semaP(); +- +- // wait until the examiner is waiting for +- while (!blockedThread.hasWaitersForBlocked()) { +- goSleep(50); +- } +- // give a chance for the examiner thread to really wait +- goSleep(20); +- +- } +- } // Examiner + } +--- ./jdk/test/java/lang/management/ThreadMXBean/ThreadBlockedCount.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/ThreadMXBean/ThreadBlockedCount.java Wed Jul 30 18:42:59 2014 +0100 +@@ -26,177 +26,127 @@ + * @bug 4530538 + * @summary Basic unit test of ThreadInfo.getBlockedCount() + * @author Alexei Guibadoulline and Mandy Chung +- * +- * @build ThreadExecutionSynchronizer ++ * @author Jaroslav Bachorik + * @run main ThreadBlockedCount + */ + + import java.lang.management.*; ++import java.util.concurrent.Phaser; + + public class ThreadBlockedCount { +- final static long EXPECTED_BLOCKED_COUNT = 3; ++ final static long EXPECTED_BLOCKED_COUNT = 3; + final static int DEPTH = 10; +- private static ThreadMXBean mbean ++ private static final ThreadMXBean mbean + = ManagementFactory.getThreadMXBean(); + +- private static Object a = new Object(); +- private static Object b = new Object(); +- private static Object c = new Object(); +- private static boolean aNotified = false; +- private static boolean bNotified = false; +- private static boolean cNotified = false; +- private static Object blockedObj1 = new Object(); +- private static Object blockedObj2 = new Object(); +- private static Object blockedObj3 = new Object(); +- private static volatile boolean testFailed = false; ++ private static final Object a = new Object(); ++ private static final Object b = new Object(); ++ private static final Object c = new Object(); ++ ++ private static final Object blockedObj1 = new Object(); ++ private static final Object blockedObj2 = new Object(); ++ private static final Object blockedObj3 = new Object(); ++ private static volatile boolean testOk = true; + private static BlockingThread blocking; + private static BlockedThread blocked; +- private static ThreadExecutionSynchronizer thrsync; +- +- + + public static void main(String args[]) throws Exception { +- // Create the BlockingThread before BlockedThread +- // to make sure BlockingThread enter the lock before BlockedThread +- thrsync = new ThreadExecutionSynchronizer(); ++ // real run ++ runTest(); ++ if (!testOk) { ++ throw new RuntimeException("TEST FAILED."); ++ } ++ System.out.println("Test passed."); ++ } + +- blocking = new BlockingThread(); ++ private static void runTest() throws Exception { ++ final Phaser p = new Phaser(2); ++ ++ blocking = new BlockingThread(p); + blocking.start(); + +- blocked = new BlockedThread(); ++ blocked = new BlockedThread(p); + blocked.start(); + + try { + blocking.join(); +- blocked.join(); ++ ++ testOk = checkBlocked(); ++ p.arriveAndAwaitAdvance(); // #5 ++ + } catch (InterruptedException e) { + System.err.println("Unexpected exception."); + e.printStackTrace(System.err); + throw e; + } +- +- if (testFailed) { +- throw new RuntimeException("TEST FAILED."); +- } +- System.out.println("Test passed."); + } + + + static class BlockedThread extends Thread { +- // NOTE: We can't use a.wait() here because wait() call is counted +- // as blockedCount. Instead, we use a boolean flag and sleep. +- // ++ private final Phaser p; ++ ++ BlockedThread(Phaser p) { ++ super("BlockedThread"); ++ this.p = p; ++ } ++ + public void run() { +- // wait Blocking thread +- thrsync.signal(); ++ int accumulator = 0; ++ p.arriveAndAwaitAdvance(); // #1 + + // Enter lock a without blocking + synchronized (a) { +- // wait until BlockingThread holds blockedObj1 +- while (!aNotified) { +- try { +- Thread.sleep(50); +- } catch (InterruptedException e) { +- System.err.println("Unexpected exception."); +- e.printStackTrace(System.err); +- testFailed = true; +- break; +- } +- } +- +- // signal BlockingThread. +- thrsync.signal(); ++ p.arriveAndAwaitAdvance(); // #2 + + // Block to enter blockedObj1 + // blockedObj1 should be owned by BlockingThread + synchronized (blockedObj1) { +- System.out.println("BlockedThread entered lock blockedObj1."); ++ accumulator++; // filler + } + } + +- // signal BlockingThread. +- thrsync.signal(); +- + // Enter lock a without blocking + synchronized (b) { + // wait until BlockingThread holds blockedObj2 +- while (!bNotified) { +- try { +- Thread.sleep(50); +- } catch (InterruptedException e) { +- System.err.println("Unexpected exception."); +- e.printStackTrace(System.err); +- testFailed = true; +- break; +- } +- } +- +- // signal BlockingThread. +- thrsync.signal(); ++ p.arriveAndAwaitAdvance(); // #3 + + // Block to enter blockedObj2 + // blockedObj2 should be owned by BlockingThread + synchronized (blockedObj2) { +- System.out.println("BlockedThread entered lock blockedObj2."); ++ accumulator++; // filler + } + } + +- // signal BlockingThread. +- thrsync.signal(); +- + // Enter lock a without blocking + synchronized (c) { + // wait until BlockingThread holds blockedObj3 +- while (!cNotified) { +- try { +- Thread.sleep(50); +- } catch (InterruptedException e) { +- System.err.println("Unexpected exception."); +- e.printStackTrace(System.err); +- testFailed = true; +- break; +- } +- } +- +- // signal BlockingThread. +- thrsync.signal(); ++ p.arriveAndAwaitAdvance(); // #4 + + // Block to enter blockedObj3 + // blockedObj3 should be owned by BlockingThread + synchronized (blockedObj3) { +- System.out.println("BlockedThread entered lock blockedObj3."); ++ accumulator++; // filler + } + } + +- // wait for the thread stats to be updated for 10 seconds +- for (int i = 0; i < 100; i++) { +- if (getBlockedCount() == EXPECTED_BLOCKED_COUNT) { +- return; +- } +- try { +- Thread.sleep(100); +- } catch (InterruptedException e) { +- System.err.println("Unexpected exception."); +- e.printStackTrace(System.err); +- testFailed = true; +- return; +- } +- } +- long count = getBlockedCount(); +- if (count != EXPECTED_BLOCKED_COUNT) { +- System.err.println("TEST FAILED: Blocked thread has " + count + +- " blocked counts. Expected " + +- EXPECTED_BLOCKED_COUNT); +- testFailed = true; +- } ++ // wait for the main thread to check the blocked count ++ System.out.println("Acquired " + accumulator + " monitors"); ++ p.arriveAndAwaitAdvance(); // #5 ++ // ... and we can leave now + } // run() +- } // BlockingThread ++ } // BlockedThread + + static class BlockingThread extends Thread { +- private void waitForSignalToRelease() { ++ private final Phaser p; + ++ BlockingThread(Phaser p) { ++ super("BlockingThread"); ++ this.p = p; ++ } ++ ++ private void waitForBlocked() { + // wait for BlockedThread. +- thrsync.waitForSignal(); ++ p.arriveAndAwaitAdvance(); + + boolean threadBlocked = false; + while (!threadBlocked) { +@@ -206,7 +156,7 @@ + } catch (InterruptedException e) { + System.err.println("Unexpected exception."); + e.printStackTrace(System.err); +- testFailed = true; ++ testOk = false; + break; + } + ThreadInfo info = mbean.getThreadInfo(blocked.getId()); +@@ -215,44 +165,55 @@ + } + + public void run() { +- // wait for BlockedThread. +- thrsync.waitForSignal(); ++ p.arriveAndAwaitAdvance(); // #1 + + synchronized (blockedObj1) { + System.out.println("BlockingThread attempts to notify a"); +- aNotified = true; +- waitForSignalToRelease(); ++ waitForBlocked(); // #2 + } + +- // wait for BlockedThread. +- thrsync.waitForSignal(); +- + // block until BlockedThread is ready + synchronized (blockedObj2) { + System.out.println("BlockingThread attempts to notify b"); +- bNotified = true; +- waitForSignalToRelease(); ++ waitForBlocked(); // #3 + } + +- // wait for BlockedThread. +- thrsync.waitForSignal(); +- + // block until BlockedThread is ready + synchronized (blockedObj3) { + System.out.println("BlockingThread attempts to notify c"); +- cNotified = true; +- waitForSignalToRelease(); ++ waitForBlocked(); // #4 + } + + } // run() +- } // BlockedThread ++ } // BlockingThread + + private static long getBlockedCount() { + long count; + // Check the mbean now +- ThreadInfo ti = mbean.getThreadInfo(Thread.currentThread(). +- getId()); ++ ThreadInfo ti = mbean.getThreadInfo(blocked.getId()); + count = ti.getBlockedCount(); + return count; + } ++ ++ private static boolean checkBlocked() { ++ // wait for the thread stats to be updated for 10 seconds ++ long count = -1; ++ for (int i = 0; i < 100; i++) { ++ count = getBlockedCount(); ++ if (count >= EXPECTED_BLOCKED_COUNT) { ++ return true; ++ } ++ try { ++ Thread.sleep(100); ++ } catch (InterruptedException e) { ++ System.err.println("Unexpected exception."); ++ e.printStackTrace(System.err); ++ return false; ++ } ++ } ++ System.err.println("TEST FAILED: Blocked thread has " + count + ++ " blocked counts. Expected at least " + ++ EXPECTED_BLOCKED_COUNT); ++ return false; ++ } + } +--- ./jdk/test/java/lang/management/ThreadMXBean/ThreadExecutionSynchronizer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/lang/management/ThreadMXBean/ThreadExecutionSynchronizer.java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,85 +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. +- * +- * 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. +- */ +- +-/* +- * +- * @summary This class is used to synchronize execution of two threads. +- * @author Swamy Venkataramanappa +- */ +- +-import java.util.concurrent.Semaphore; +- +-public class ThreadExecutionSynchronizer { +- +- private volatile boolean waiting; +- private final Semaphore semaphore; +- +- public ThreadExecutionSynchronizer() { +- semaphore = new Semaphore(1); +- waiting = false; +- } +- +- // Synchronizes two threads execution points. +- // Basically any thread could get scheduled to run and +- // it is not possible to know which thread reaches expected +- // execution point. So whichever thread reaches a execution +- // point first wait for the second thread. When the second thread +- // reaches the expected execution point will wake up +- // the thread which is waiting here. +- void stopOrGo() { +- semaphore.acquireUninterruptibly(); // Thread can get blocked. +- if (!waiting) { +- waiting = true; +- // Wait for second thread to enter this method. +- while(!semaphore.hasQueuedThreads()) { +- try { +- Thread.sleep(20); +- } catch (InterruptedException xx) {} +- } +- semaphore.release(); +- } else { +- waiting = false; +- semaphore.release(); +- } +- } +- +- // Wrapper function just for code readability. +- void waitForSignal() { +- stopOrGo(); +- goSleep(50); +- } +- +- void signal() { +- stopOrGo(); +- goSleep(50); +- } +- +- private static void goSleep(long ms) { +- try { +- Thread.sleep(ms); +- } catch (InterruptedException e) { +- e.printStackTrace(); +- System.out.println("Unexpected exception."); +- } +- } +-} +--- ./jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/lang/reflect/DefaultMethodMembers/FilterNotMostSpecific.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,691 @@ ++/* ++ * 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 8029674 ++ * @summary Verify that the right interface methods are returned by ++ * Class.getMethod() and Class.getMethods() ++ * @run testng FilterNotMostSpecific ++ */ ++ ++import java.lang.reflect.*; ++import java.lang.annotation.*; ++ ++import java.util.Arrays; ++import java.util.List; ++import java.util.Map; ++import java.util.HashMap; ++import java.util.HashSet; ++import java.util.Set; ++import java.util.stream.Collectors; ++ ++import org.testng.annotations.DataProvider; ++import org.testng.annotations.Test; ++ ++import static org.testng.Assert.*; ++ ++public class FilterNotMostSpecific { ++ ++ @Test(dataProvider="getCases") ++ public void testGetMethod(Class iface) { ++ boolean match = false; ++ MethodDesc[] expectedMethods = iface.getAnnotationsByType(MethodDesc.class); ++ ++ for (MethodDesc expected : expectedMethods) { ++ if (expected.isGetMethodReturn()) { ++ try { ++ Method m = iface.getMethod(expected.name()); ++ if (!assertMatch(expected, m)) ++ fail(failMsg(expected, m, iface)); ++ else ++ match = true; ++ } catch (NoSuchMethodException e) { ++ fail("expected: " + toMethodString(expected), e); ++ } ++ } ++ } ++ assert(match); ++ } ++ ++ @Test(dataProvider="getCases") ++ public void testGetMethods(Class iface) { ++ List foundMethods = filterObjectMethods(iface.getMethods()); ++ MethodDesc[] expectedMethods = iface.getAnnotationsByType(MethodDesc.class); ++ Set used = new HashSet<>(); ++ ++ for (MethodDesc expected : expectedMethods) { ++ boolean found = false; ++ ++ for (Method m : foundMethods) { ++ if (used.contains(m)) ++ continue; ++ ++ if(expected.name().equals(m.getName()) && ++ expected.declaringClass() ==m.getDeclaringClass()) { ++ ++ found = true; ++ assertMatch(expected, m); ++ used.add(m); ++ break; ++ } ++ } ++ if (! found) ++ fail("On: "+ iface +"\nDid not find " + toMethodString(expected) + " among " + foundMethods); ++ } ++ assertEquals(foundMethods.size(), expectedMethods.length, ++ "\non: " + iface + ++ "\nexpected: " + toMethodStrings(expectedMethods) + ++ "\nfound: " + foundMethods + "\n"); ++ } ++ ++ private boolean assertMatch(MethodDesc expected, Method m) { ++ if (!expected.name().equals(m.getName())) ++ return false; ++ if (expected.declaringClass() != m.getDeclaringClass()) ++ return false; ++ ++ if (expected.kind() == MethodKind.ABSTRACT) ++ assertTrue(Modifier.isAbstract(m.getModifiers()), m + " should be ABSTRACT"); ++ else if (expected.kind() == MethodKind.CONCRETE) ++ assertTrue(!Modifier.isAbstract(m.getModifiers()) && !m.isDefault(), m + " should be CONCRETE"); ++ else if (expected.kind() == MethodKind.DEFAULT) ++ assertTrue(m.isDefault(), m + " should be DEFAULT"); ++ ++ return true; ++ } ++ ++ private String failMsg(MethodDesc expected, Method m, Class iface) { ++ return "\nOn interface: " + iface + ++ "\nexpected: " + toMethodString(expected) + ++ "\nfound: " + m; ++ } ++ ++ private static List filterObjectMethods(Method[] in) { ++ return Arrays.stream(in). ++ filter(m -> (m.getDeclaringClass() != java.lang.Object.class)). ++ collect(Collectors.toList()); ++ } ++ ++ private String toMethodString(MethodDesc m) { ++ return m.declaringClass().getSimpleName().toString() + "." + ++ m.name() + "()"; ++ } ++ ++ private List toMethodStrings(MethodDesc[] m) { ++ return Arrays.stream(m). ++ map(this::toMethodString) ++ .collect(Collectors.toList()); ++ } ++ ++ @Retention(RetentionPolicy.RUNTIME) ++ @Repeatable(MethodDescs.class) ++ public @interface MethodDesc { ++ String name(); ++ Class declaringClass(); ++ MethodKind kind() default MethodKind.ABSTRACT; ++ boolean isGetMethodReturn() default false; ++ } ++ ++ @Retention(RetentionPolicy.RUNTIME) ++ public @interface MethodDescs { ++ MethodDesc[] value(); ++ } ++ ++ public static enum MethodKind { ++ ABSTRACT, ++ CONCRETE, ++ DEFAULT, ++ } ++ // base interfaces ++ interface I { void nonDefault(); } ++ interface J extends I { void nonDefault(); } ++ ++ interface Jprim extends I {} ++ interface Jbis extends Jprim { void nonDefault(); } ++ ++ // interesting cases ++ ++ @MethodDesc(name="nonDefault", declaringClass=Jbis.class, ++ isGetMethodReturn=true) ++ interface P1 extends Jbis {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=Jbis.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=I.class) ++ interface P2 extends Jbis, Jprim {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=Jbis.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=I.class) ++ interface P3 extends Jbis, Jprim, I {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=I.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=J.class) ++ interface P4 extends I, J {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=J.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=I.class) ++ interface P5 extends J, I {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=J.class, ++ isGetMethodReturn=true) ++ interface K1 extends J {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=K1M.class, ++ isGetMethodReturn=true) ++ interface K1M extends J { void nonDefault(); } ++ ++ @MethodDesc(name="nonDefault", declaringClass=I.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=J.class) ++ interface K2 extends I, J {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=J.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=I.class) ++ interface K2O extends J, I {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=K2M.class, ++ isGetMethodReturn=true) ++ interface K2M extends J, I { void nonDefault(); } ++ ++ // base interfaces default methods ++ interface L { default void isDefault() {} void nonDefault(); } ++ interface M extends L { default void isDefault() {} void nonDefault(); } ++ ++ // test cases default methods ++ ++ @MethodDesc(name="nonDefault", declaringClass=M.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="isDefault", declaringClass=M.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ interface N1 extends M {} ++ ++ @MethodDesc(name="isDefault", declaringClass=N1D.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=M.class, ++ isGetMethodReturn=true) ++ interface N1D extends M { default void isDefault() {}} ++ ++ @MethodDesc(name="nonDefault", declaringClass=N1N.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="isDefault", declaringClass=M.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ interface N1N extends M { void nonDefault(); } ++ ++ @MethodDesc(name="isDefault", declaringClass=N1DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=N1DN.class, ++ isGetMethodReturn=true) ++ interface N1DN extends M { default void isDefault() {} void nonDefault(); } ++ ++ @MethodDesc(name="isDefault", declaringClass=M.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class, ++ isGetMethodReturn=true) ++ interface N2 extends M, L {} ++ ++ @MethodDesc(name="isDefault", declaringClass=M.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ interface N22 extends L, M {} ++ ++ @MethodDesc(name="isDefault", declaringClass=N2D.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class, ++ isGetMethodReturn=true) ++ interface N2D extends M, L { default void isDefault() {}} ++ ++ @MethodDesc(name="isDefault", declaringClass=M.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=N2N.class, ++ isGetMethodReturn=true) ++ interface N2N extends M, L { void nonDefault(); } ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class, ++ isGetMethodReturn=true) ++ interface N2DN extends M, L { default void isDefault() {} void nonDefault(); } ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ interface O1 extends L, M, N2DN {} ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ interface O2 extends M, N2DN, L {} ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class, ++ isGetMethodReturn=true) ++ interface O3 extends N2DN, L, M {} ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ abstract class C1 implements L, M, N2DN {} ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ abstract class C2 implements M, N2DN, L {} ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class, ++ isGetMethodReturn=true) ++ abstract class C3 implements N2DN, L, M {} ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=C4.class, ++ kind=MethodKind.CONCRETE, isGetMethodReturn=true) ++ class C4 implements L, M, N2DN { public void nonDefault() {} } ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=C5.class, ++ kind=MethodKind.CONCRETE, isGetMethodReturn=true) ++ class C5 implements M, N2DN, L { public void nonDefault() {} } ++ ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=C6.class, ++ kind=MethodKind.CONCRETE, isGetMethodReturn=true) ++ class C6 implements N2DN, L, M { public void nonDefault() {} } ++ ++ // reabstraction ++ ++ @MethodDesc(name="isDefault", declaringClass=R1.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ interface R1 extends L, M, N2DN { void isDefault(); } ++ ++ @MethodDesc(name="isDefault", declaringClass=R2.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ interface R2 extends M, N2DN, L { void isDefault(); } ++ ++ @MethodDesc(name="isDefault", declaringClass=R3.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class, ++ isGetMethodReturn=true) ++ interface R3 extends N2DN, L, M { void isDefault(); } ++ ++ // this one is strange but logical, getMethod finds N2DN first, which is ++ // default but not the most specific ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="isDefault", declaringClass=R1.class) ++ @MethodDesc(name="nonDefault", declaringClass=L.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ interface R4 extends L, M, N2DN, R1 {} ++ ++ // this one is strange but logical, getMethod finds N2DN first, which is ++ // default but not the most specific ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="isDefault", declaringClass=R2.class) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ interface R5 extends M, N2DN, R2, L {} ++ ++ // this one is strange but logical, getMethod finds N2DN first, which is ++ // default but not the most specific ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="isDefault", declaringClass=R3.class) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class, ++ isGetMethodReturn=true) ++ interface R6 extends N2DN, R3, L, M {} ++ ++ // the following three finds the "right" one ++ @MethodDesc(name="isDefault", declaringClass=R1.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT) ++ @MethodDesc(name="nonDefault", declaringClass=L.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ interface R7 extends L, M, R1, N2DN {} ++ ++ @MethodDesc(name="isDefault", declaringClass=R2.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class) ++ interface R8 extends M, R2, N2DN, L {} ++ ++ @MethodDesc(name="isDefault", declaringClass=R3.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="isDefault", declaringClass=N2DN.class, ++ kind=MethodKind.DEFAULT) ++ @MethodDesc(name="nonDefault", declaringClass=L.class) ++ @MethodDesc(name="nonDefault", declaringClass=M.class) ++ @MethodDesc(name="nonDefault", declaringClass=N2DN.class, ++ isGetMethodReturn=true) ++ interface R9 extends R3, N2DN, L, M {} ++ ++ // More reabstraction ++ interface Z1 { void z(); } ++ interface Z2 extends Z1 { default void z() {} } ++ ++ @MethodDesc(name="z", declaringClass=Z2.class, ++ isGetMethodReturn=true, kind=MethodKind.DEFAULT) ++ interface Z31 extends Z1, Z2 {} ++ ++ @MethodDesc(name="z", declaringClass=Z2.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ interface Z32 extends Z2, Z1 {} ++ ++ interface Z3 extends Z2, Z1 { void z(); } ++ ++ @MethodDesc(name="z", declaringClass=Z2.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="z", declaringClass=Z3.class) ++ interface Z41 extends Z1, Z2, Z3 { } ++ ++ @MethodDesc(name="z", declaringClass=Z2.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="z", declaringClass=Z3.class) ++ interface Z42 extends Z2, Z3, Z1 { } ++ ++ @MethodDesc(name="z", declaringClass=Z3.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="z", declaringClass=Z2.class, ++ kind=MethodKind.DEFAULT) ++ interface Z43 extends Z3, Z1, Z2 { } ++ ++ @MethodDesc(name="z", declaringClass=Z2.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="z", declaringClass=Z3.class) ++ abstract class ZC41 implements Z1, Z2, Z3 { } ++ ++ @MethodDesc(name="z", declaringClass=Z2.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="z", declaringClass=Z3.class) ++ abstract class ZC42 implements Z2, Z3, Z1 { } ++ ++ @MethodDesc(name="z", declaringClass=Z3.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="z", declaringClass=Z2.class, ++ kind=MethodKind.DEFAULT) ++ abstract class ZC43 implements Z3, Z1, Z2 { } ++ ++ // More reabstraction + concretization ++ interface X1 { default void x() {} } ++ interface X2 extends X1 { void x(); } ++ ++ @MethodDesc(name="x", declaringClass=X1.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ @MethodDesc(name="x", declaringClass=X2.class) ++ interface X31 extends X1, X2 {} ++ ++ @MethodDesc(name="x", declaringClass=X2.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="x", declaringClass=X1.class, ++ kind=MethodKind.DEFAULT) ++ interface X32 extends X2, X1 {} ++ ++ @MethodDesc(name="x", declaringClass=X3.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ interface X3 extends X2, X1 { default void x() {} } ++ ++ // order shouldn't matter here ++ @MethodDesc(name="x", declaringClass=X3.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ interface X41 extends X1, X2, X3 { } ++ ++ @MethodDesc(name="x", declaringClass=X3.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ interface X42 extends X2, X3, X1 { } ++ ++ @MethodDesc(name="x", declaringClass=X3.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ interface X43 extends X3, X1, X2 { } ++ ++ // order shouldn't matter here ++ @MethodDesc(name="x", declaringClass=X3.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ abstract class XC41 implements X1, X2, X3 { } ++ ++ @MethodDesc(name="x", declaringClass=X3.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ abstract class XC42 implements X2, X3, X1 { } ++ ++ @MethodDesc(name="x", declaringClass=X3.class, ++ kind=MethodKind.DEFAULT, isGetMethodReturn=true) ++ abstract class XC43 implements X3, X1, X2 { } ++ ++ interface K extends I, J { void nonDefault(); } ++ ++ @MethodDesc(name="nonDefault", declaringClass=I.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=J.class) ++ @MethodDesc(name="nonDefault", declaringClass=K.class) ++ abstract class ZZ1 implements I, J, K {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=I.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=J.class) ++ @MethodDesc(name="nonDefault", declaringClass=K.class) ++ abstract class ZZ2 extends ZZ1 implements K, I, J {} ++ ++ @MethodDesc(name="nonDefault", declaringClass=I.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="nonDefault", declaringClass=J.class) ++ @MethodDesc(name="nonDefault", declaringClass=K.class) ++ abstract class ZZ3 extends ZZ2 implements J, K, I {} ++ ++ // bridges ++ interface B1A { Object m(); } ++ interface B1B extends B1A { Map m(); } ++ ++ @MethodDesc(name="m", declaringClass=B1C.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="m", declaringClass=B1C.class, ++ kind=MethodKind.DEFAULT) ++ @MethodDesc(name="m", declaringClass=B1C.class, ++ kind=MethodKind.DEFAULT) ++ interface B1C extends B1B { HashMap m(); } ++ ++ @MethodDesc(name="m", declaringClass=B2.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="m", declaringClass=B2.class, ++ kind=MethodKind.DEFAULT) ++ @MethodDesc(name="m", declaringClass=B2.class, ++ kind=MethodKind.DEFAULT) ++ interface B2 extends B1C { HashMap m(); } ++ ++ @MethodDesc(name="m", declaringClass=B2.class, //HahsMap ++ isGetMethodReturn=true) ++ @MethodDesc(name="m", declaringClass=B2.class, //Map ++ kind=MethodKind.DEFAULT) ++ @MethodDesc(name="m", declaringClass=B2.class, //Object ++ kind=MethodKind.DEFAULT) ++ interface B3A extends B2, B1A {} ++ ++ // this one is funny since HashMap isn't a bridge thus not a default ++ @MethodDesc(name="m", declaringClass=B2.class, //HashMap ++ isGetMethodReturn=true) ++ @MethodDesc(name="m", declaringClass=B2.class, //Map ++ kind=MethodKind.DEFAULT) ++ @MethodDesc(name="m", declaringClass=B2.class, //Object ++ kind=MethodKind.DEFAULT) ++ @MethodDesc(name="m", declaringClass=B1C.class) //HashMap ++ interface B3B extends B2, B1C {} ++ ++ // same name different params type ++ interface A1 { void m(); void m(int i); void m(int i, int j); } ++ interface A2A extends A1 { void m(); void m(int i); void m(int i, int j); } ++ interface A2B extends A1 { void m(); void m(int i); default void m(int i, int j) {} } ++ ++ @MethodDesc(name="m", declaringClass=A1.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="m", declaringClass=A1.class) ++ @MethodDesc(name="m", declaringClass=A1.class) ++ @MethodDesc(name="m", declaringClass=A2A.class) ++ @MethodDesc(name="m", declaringClass=A2A.class) ++ @MethodDesc(name="m", declaringClass=A2A.class) ++ interface A3A extends A1, A2A {} ++ ++ @MethodDesc(name="m", declaringClass=A1.class, ++ isGetMethodReturn=true) ++ @MethodDesc(name="m", declaringClass=A1.class) ++ @MethodDesc(name="m", declaringClass=A2B.class) ++ @MethodDesc(name="m", declaringClass=A2B.class) ++ @MethodDesc(name="m", declaringClass=A2B.class, ++ kind=MethodKind.DEFAULT) ++ interface A3B extends A1, A2B {} ++ ++ @DataProvider ++ public Object[][] getCases() { return CASES; } ++ public static final Class[][] CASES = { ++ { K1.class }, ++ { K1M.class }, ++ { K2.class }, ++ { K2O.class }, ++ { K2M.class }, ++ ++ { N1.class }, ++ { N1D.class }, ++ { N1N.class }, ++ { N1DN.class }, ++ ++ { N2.class }, ++ { N22.class }, ++ { N2D.class }, ++ { N2N.class }, ++ { N2DN.class }, ++ ++ { P1.class }, ++ { P2.class }, ++ { P3.class }, ++ { P4.class }, ++ { P5.class }, ++ ++ { O1.class }, ++ { O2.class }, ++ { O3.class }, ++ ++ { C1.class }, ++ { C2.class }, ++ { C3.class }, ++ ++ { C4.class }, ++ { C5.class }, ++ { C6.class }, ++ ++ { R1.class }, ++ { R2.class }, ++ { R3.class }, ++ ++ { R4.class }, ++ { R5.class }, ++ { R6.class }, ++ ++ { R7.class }, ++ { R8.class }, ++ { R9.class }, ++ ++ { Z31.class }, ++ { Z32.class }, ++ ++ { Z41.class }, ++ { Z42.class }, ++ { Z43.class }, ++ ++ { ZC41.class }, ++ { ZC42.class }, ++ { ZC43.class }, ++ ++ { ZZ1.class }, ++ { ZZ2.class }, ++ { ZZ3.class }, ++ ++ { X3.class }, ++ { X31.class }, ++ { X32.class }, ++ ++ { X41.class }, ++ { X42.class }, ++ { X43.class }, ++ ++ { XC41.class }, ++ { XC42.class }, ++ { XC43.class }, ++ ++ { B1C.class }, ++ { B2.class }, ++ { B3A.class }, ++ { B3B.class }, ++ ++ { A3A.class }, ++ { A3B.class }, ++ }; ++} +--- ./jdk/test/java/net/Authenticator/B4933582.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/net/Authenticator/B4933582.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -26,7 +26,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/java/net/Authenticator/B8034170.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/net/Authenticator/B8034170.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,192 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.io.*; ++import java.net.*; ++import java.util.*; ++ ++/** ++ * @test ++ * @bug 8034170 ++ * @summary Digest authentication interop issue ++ * @run main/othervm B8034170 unquoted ++ * @run main/othervm -Dhttp.auth.digest.quoteParameters=true B8034170 quoted ++ */ ++ ++public class B8034170 { ++ ++ static boolean expectQuotes; ++ ++ static class BasicServer extends Thread { ++ ++ ServerSocket server; ++ ++ Socket s; ++ InputStream is; ++ OutputStream os; ++ ++ static final String realm = "wallyworld"; ++ ++ String reply1 = "HTTP/1.1 401 Unauthorized\r\n"+ ++ "WWW-Authenticate: Digest realm=\""+realm+"\", qop=\"auth\"" + ++ ", nonce=\"8989de95ea2402b64d73cecdb15da255\"" + ++ ", opaque=\"bbfb4c9ee92ddccc73521c3e6e841ba2\"\r\n\r\n"; ++ ++ String OKreply = "HTTP/1.1 200 OK\r\n"+ ++ "Date: Mon, 15 Jan 2001 12:18:21 GMT\r\n" + ++ "Server: Apache/1.3.14 (Unix)\r\n" + ++ "Connection: close\r\n" + ++ "Content-Type: text/plain; charset=iso-8859-1\r\n" + ++ "Content-Length: 10\r\n\r\n"; ++ ++ String ERRreply = "HTTP/1.1 500 Internal server error\r\n"+ ++ "Date: Mon, 15 Jan 2001 12:18:21 GMT\r\n" + ++ "Server: Apache/1.3.14 (Unix)\r\n" + ++ "Connection: close\r\n" + ++ "Content-Length: 0\r\n\r\n"; ++ ++ BasicServer (ServerSocket s) { ++ server = s; ++ } ++ ++ int readAll (Socket s, byte[] buf) throws IOException { ++ int pos = 0; ++ InputStream is = s.getInputStream (); ++ // wait two seconds for request, as client doesn't close ++ // the connection ++ s.setSoTimeout(2000); ++ try { ++ int n; ++ while ((n=is.read(buf, pos, buf.length-pos)) > 0) ++ pos +=n; ++ } catch (SocketTimeoutException x) { } ++ return pos; ++ } ++ ++ public void run () { ++ byte[] buf = new byte[5000]; ++ try { ++ System.out.println ("Server 1: accept"); ++ s = server.accept (); ++ System.out.println ("accepted"); ++ os = s.getOutputStream(); ++ os.write (reply1.getBytes()); ++ readAll (s, buf); ++ s.close (); ++ ++ System.out.println ("Server 2: accept"); ++ s = server.accept (); ++ System.out.println ("accepted"); ++ os = s.getOutputStream(); ++ int count = readAll (s, buf); ++ String reply = new String(buf, 0, count); ++ ++ boolean error; ++ ++ if (expectQuotes) { ++ error = false; ++ if (!reply.contains("qop=\"auth\"")) { ++ System.out.println ("Expecting quoted qop. Not found"); ++ error = true; ++ } ++ if (!reply.contains("algorithm=\"MD5\"")) { ++ System.out.println ("Expecting quoted algorithm. Not found"); ++ error = true; ++ } ++ } else { ++ error = false; ++ if (!reply.contains("qop=auth")) { ++ System.out.println ("Expecting unquoted qop. Not found"); ++ error = true; ++ } ++ if (!reply.contains("algorithm=MD5")) { ++ System.out.println ("Expecting unquoted algorithm. Not found"); ++ error = true; ++ } ++ } ++ if (error) { ++ os.write(ERRreply.getBytes()); ++ os.flush(); ++ s.close(); ++ } else { ++ os.write((OKreply+"HelloWorld").getBytes()); ++ os.flush(); ++ s.close(); ++ } ++ } ++ catch (Exception e) { ++ System.out.println (e); ++ } ++ finished (); ++ } ++ ++ public synchronized void finished () { ++ notifyAll(); ++ } ++ ++ } ++ ++ static class MyAuthenticator3 extends Authenticator { ++ PasswordAuthentication pw; ++ MyAuthenticator3 () { ++ super (); ++ pw = new PasswordAuthentication ("user", "passwordNotCheckedAnyway".toCharArray()); ++ } ++ ++ public PasswordAuthentication getPasswordAuthentication () ++ { ++ System.out.println ("Auth called"); ++ return pw; ++ } ++ } ++ ++ ++ static void read (InputStream is) throws IOException { ++ int c; ++ System.out.println ("reading"); ++ while ((c=is.read()) != -1) { ++ System.out.write (c); ++ } ++ System.out.println (""); ++ System.out.println ("finished reading"); ++ } ++ ++ public static void main (String args[]) throws Exception { ++ expectQuotes = args[0].equals("quoted"); ++ ++ MyAuthenticator3 auth = new MyAuthenticator3 (); ++ Authenticator.setDefault (auth); ++ ServerSocket ss = new ServerSocket (0); ++ int port = ss.getLocalPort (); ++ BasicServer server = new BasicServer (ss); ++ synchronized (server) { ++ server.start(); ++ System.out.println ("client 1"); ++ URL url = new URL ("http://localhost:"+port+"/d1/d2/d3/foo.html"); ++ URLConnection urlc = url.openConnection (); ++ InputStream is = urlc.getInputStream (); ++ read (is); ++ is.close (); ++ } ++ } ++} +--- ./jdk/test/java/net/DatagramSocket/Send12k.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/net/DatagramSocket/Send12k.java Wed Jul 30 18:42:59 2014 +0100 +@@ -53,7 +53,7 @@ + boolean sendOkay = true; + try { + s1.send(p1); +- } catch (SocketException e) { ++ } catch (IOException e) { + /* + * Prior to merlin a send of > 12k to loopback address + * would fail silently. +--- ./jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -27,7 +27,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Darwin ) ++ SunOS | Darwin | AIX ) + PATHSEP=":" + FILESEP="/" + ;; +--- ./jdk/test/java/net/Inet4Address/DummyNameService.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/net/Inet4Address/DummyNameService.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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. ++ */ ++ ++/* ++ * A simple name service which throws an exception when invoked ++ */ ++ ++import java.net.UnknownHostException; ++import java.net.InetAddress; ++import sun.net.spi.nameservice.*; ++import java.util.*; ++ ++public final class DummyNameService implements NameService { ++ ++ public DummyNameService() throws Exception { ++ } ++ ++ public InetAddress[] lookupAllHostAddr(String host) throws UnknownHostException { ++ throw new UnknownHostException("Dummy name service"); ++ } ++ ++ public String getHostByAddr(byte[] addr) throws UnknownHostException { ++ throw new UnknownHostException("Dummy name service"); ++ } ++} +--- ./jdk/test/java/net/Inet4Address/DummyNameServiceDescriptor.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/net/Inet4Address/DummyNameServiceDescriptor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,54 @@ ++/* ++ * 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. ++ */ ++ ++/* ++ * Descriptor for the dummy name service ++ */ ++ ++import sun.net.spi.nameservice.*; ++ ++public final class DummyNameServiceDescriptor implements NameServiceDescriptor { ++ ++ /** ++ * Create a new instance of the corresponding name service. ++ */ ++ public NameService createNameService() throws Exception { ++ return new DummyNameService(); ++ } ++ ++ /** ++ * Returns this service provider's name ++ * ++ */ ++ public String getProviderName() { ++ return "oracle"; ++ } ++ ++ /** ++ * Returns this name service type ++ * "dns" "nis" etc ++ */ ++ public String getType() { ++ return "dummy"; ++ } ++} +--- ./jdk/test/java/net/Inet4Address/META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/net/Inet4Address/META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,22 @@ ++# 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. ++ ++DummyNameServiceDescriptor # name service provider descriptor +--- ./jdk/test/java/net/Inet4Address/textToNumericFormat.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/net/Inet4Address/textToNumericFormat.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,8 +25,18 @@ + * @test + * @bug 4749938 + * @summary Bug in the parsing IPv4 literal addresses ++ * @compile -XDignore.symbol.file=true DummyNameService.java DummyNameServiceDescriptor.java ++ * @run main/othervm -Dsun.net.spi.nameservice.provider.1=dummy,oracle textToNumericFormat + */ + ++/** ++ * We use a dummy name service which throws UHE any time it is called. ++ * We do this because the "good" tests here should parse correctly ++ * without needing to call the name service, and the bad tests will ++ * not parse and then invoke the name service, where we expect ++ * the exception. ++ */ ++ + import java.net.InetAddress; + import java.net.UnknownHostException; + import java.util.*; +@@ -34,19 +44,25 @@ + public class textToNumericFormat { + + public static void main(String[] args) throws UnknownHostException { +- List goodList = new ArrayList(); +- List badList = new ArrayList(); ++ List goodList = new ArrayList<>(); ++ List badList = new ArrayList<>(); + String goodAddrs[] = { + "224.0.1.0", + "238.255.255.255", +- "239.255.255.255" }; ++ "239.255.255.255", ++ "239.255.65535", ++ "239.16777215", ++ "4294967295" }; + + String badAddrs[] = { + "238.255.255.2550", + "256.255.255.255", + "238.255.2550.255", + "238.2550.255.255", +- "2380.255.255.255"}; ++ "2380.255.255.255", ++ "239.255.65536", ++ "239.16777216", ++ "4294967296" }; + + for (int i=0; i policy + grant { +@@ -56,4 +56,7 @@ + }; + POLICY + +-${TESTJAVA}/bin/java -Djava.security.policy=file:./policy -Dsun.net.spi.nameservice.provider.1=simple,sun -cp ${TESTCLASSES}${PS}${TESTSRC} LookupTest -runtest ${port} ++${TESTJAVA}/bin/java ${TESTVMOPTS} \ ++ -Djava.security.policy=file:./policy \ ++ -Dsun.net.spi.nameservice.provider.1=simple,sun \ ++ -cp ${TESTCLASSPATH}${PS}${TESTSRC} LookupTest -runtest ${port} +--- ./jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -34,7 +34,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ;; ++ SunOS | Linux | Darwin | AIX ) ;; + # Skip locale test for Windows + Windows* | CYGWIN* ) + echo "Passed"; exit 0 ;; +--- ./jdk/test/java/nio/charset/spi/basic.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/nio/charset/spi/basic.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -48,7 +48,7 @@ + + DIR=`pwd` + case `uname` in +- SunOS | Linux | Darwin ) CPS=':' ;; ++ SunOS | Linux | Darwin | AIX ) CPS=':' ;; + Windows* ) CPS=';' ;; + CYGWIN* ) + DIR=`/usr/bin/cygpath -a -s -m $DIR` +@@ -81,7 +81,7 @@ + L="$1" + shift + s=`uname -s` +- if [ $s != Linux -a $s != SunOS -a $s != Darwin ]; then ++ if [ $s != Linux -a $s != SunOS -a $s != Darwin -a $s != AIX ]; then + echo "$L: Locales not supported on this system, skipping..." + exit 0 + fi +--- ./jdk/test/java/nio/file/Files/Misc.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/nio/file/Files/Misc.java Wed Jul 30 18:42:59 2014 +0100 +@@ -22,7 +22,7 @@ + */ + + /* @test +- * @bug 4313887 6838333 8005566 ++ * @bug 4313887 6838333 8005566 8032220 + * @summary Unit test for miscellenous methods in java.nio.file.Files + * @library .. + */ +@@ -76,6 +76,11 @@ + createDirectories(file.resolve("y")); + throw new RuntimeException("failure expected"); + } catch (IOException x) { } ++ ++ // the root directory always exists ++ Path root = Paths.get("/"); ++ Files.createDirectories(root); ++ Files.createDirectories(root.toAbsolutePath()); + } + + /** +--- ./jdk/test/java/nio/file/Files/SBC.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/nio/file/Files/SBC.java Wed Jul 30 18:42:59 2014 +0100 +@@ -235,7 +235,7 @@ + try { + Files.newByteChannel(link, READ, LinkOption.NOFOLLOW_LINKS); + throw new RuntimeException(); +- } catch (IOException x) { ++ } catch (IOException | UnsupportedOperationException x) { + } finally { + TestUtil.deleteUnchecked(link); + } +--- ./jdk/test/java/nio/file/Files/walkFileTree/find.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/nio/file/Files/walkFileTree/find.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -43,7 +43,14 @@ + echo "This test does not run on Windows" + exit 0 + ;; ++ AIX ) ++ CLASSPATH=${TESTCLASSES}:${TESTSRC} ++ # On AIX "find -follow" may core dump on recursive links without '-L' ++ # see: http://www-01.ibm.com/support/docview.wss?uid=isg1IV28143 ++ FIND_FOLLOW_OPT="-L" ++ ;; + * ) ++ FIND_FOLLOW_OPT= + CLASSPATH=${TESTCLASSES}:${TESTSRC} + ;; + esac +@@ -65,7 +72,7 @@ + # cycles (sym links to ancestor directories), other versions do + # not. For that reason we run PrintFileTree with the -printCycles + # option when the output without this option differs to find(1). +-find "$ROOT" -follow > out1 ++find $FIND_FOLLOW_OPT "$ROOT" -follow > out1 + $JAVA ${TESTVMOPTS} PrintFileTree -follow "$ROOT" > out2 + diff out1 out2 + if [ $? != 0 ]; +--- ./jdk/test/java/nio/file/Path/PathOps.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/nio/file/Path/PathOps.java Wed Jul 30 18:42:59 2014 +0100 +@@ -22,7 +22,7 @@ + */ + + /* @test +- * @bug 4313887 6838333 6925932 7006126 ++ * @bug 4313887 6838333 6925932 7006126 8037945 + * @summary Unit test for java.nio.file.Path path operations + */ + +@@ -899,6 +899,8 @@ + .normalize("foo"); + test("/foo") + .normalize("/foo"); ++ test("") ++ .normalize(""); + test(".") + .normalize(""); + test("..") +--- ./jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -33,7 +33,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + ;; + Windows* | CYGWIN* ) +--- ./jdk/test/java/rmi/registry/readTest/readTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/rmi/registry/readTest/readTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -34,14 +34,16 @@ + REGARGS="" + + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" ++ CHMOD="${FS}bin${FS}chmod" + FILEURL="file:" + ;; + Windows* ) + PS=";" + FS="\\" ++ CHMOD="chmod" + FILEURL="file:/" + if [ "$VER" -eq "5" ]; then + ARGS="-Djdk.net.ephemeralPortRange.low=1024 -Djdk.net.ephemeralPortRange.high=65000" +@@ -51,6 +53,7 @@ + CYGWIN* ) + PS=";" + FS="/" ++ CHMOD="chmod" + FILEURL="file:/" + if [ "$VER" -eq "5" ]; then + ARGS="-Djdk.net.ephemeralPortRange.low=1024 -Djdk.net.ephemeralPortRange.high=65000" +@@ -65,6 +68,7 @@ + + TEST_CLASSPATH=.$PS${TESTCLASSPATH:-$TESTCLASSES} + cp -r ${TESTSRC}${FS}* . ++${CHMOD} -R u+w * + ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} testPkg${FS}*java + ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -cp $TEST_CLASSPATH readTest.java + +--- ./jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -62,6 +62,10 @@ + PATHSEP=":" + FILESEP="/" + ;; ++ AIX ) ++ PATHSEP=":" ++ FILESEP="/" ++ ;; + CYGWIN* ) + PATHSEP=";" + FILESEP="/" +--- ./jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,6 +46,10 @@ + PATHSEP=":" + FILESEP="/" + ;; ++ AIX ) ++ PATHSEP=":" ++ FILESEP="/" ++ ;; + CYGWIN* ) + PATHSEP=";" + FILESEP="/" +--- ./jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -70,6 +70,10 @@ + PATHSEP=":" + FILESEP="/" + ;; ++ AIX ) ++ PATHSEP=":" ++ FILESEP="/" ++ ;; + Windows* ) + PATHSEP=";" + FILESEP="\\" +--- ./jdk/test/java/security/Security/signedfirst/Dyn.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/security/Security/signedfirst/Dyn.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -62,6 +62,10 @@ + PATHSEP=":" + FILESEP="/" + ;; ++ AIX ) ++ PATHSEP=":" ++ FILESEP="/" ++ ;; + CYGWIN* ) + PATHSEP=";" + FILESEP="/" +--- ./jdk/test/java/security/Security/signedfirst/Static.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/security/Security/signedfirst/Static.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -62,6 +62,10 @@ + PATHSEP=":" + FILESEP="/" + ;; ++ AIX ) ++ PATHSEP=":" ++ FILESEP="/" ++ ;; + CYGWIN* ) + PATHSEP=";" + FILESEP="/" +--- ./jdk/test/java/security/cert/CertPathBuilder/akiExt/AKISerialNumber.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/security/cert/CertPathBuilder/akiExt/AKISerialNumber.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 8025708 ++ * @summary make sure a PKIX CertPathBuilder can build a path when an ++ * intermediate CA certificate contains an AKI extension with a key ++ * identifier and no serial number and the end-entity certificate contains ++ * an AKI extension with both a key identifier and a serial number. ++ */ ++ ++import java.io.ByteArrayInputStream; ++import java.security.cert.*; ++import java.util.ArrayList; ++import java.util.Base64; ++import java.util.Collections; ++ ++public class AKISerialNumber { ++ ++ private static final String ROOT_CERT = ++ "MIICfTCCAeagAwIBAgIBATANBgkqhkiG9w0BAQUFADB3MQ0wCwYDVQQDEwRSb290\n" + ++ "MRYwFAYDVQQLEw1UZXN0IE9yZyBVbml0MREwDwYDVQQKEwhUZXN0IE9yZzEWMBQG\n" + ++ "A1UEBxMNVGVzdCBMb2NhbGl0eTEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czELMAkG\n" + ++ "A1UEBhMCVVMwHhcNMTQwMjAxMDUwMDAwWhcNMjQwMjAxMDUwMDAwWjB3MQ0wCwYD\n" + ++ "VQQDEwRSb290MRYwFAYDVQQLEw1UZXN0IE9yZyBVbml0MREwDwYDVQQKEwhUZXN0\n" + ++ "IE9yZzEWMBQGA1UEBxMNVGVzdCBMb2NhbGl0eTEWMBQGA1UECBMNTWFzc2FjaHVz\n" + ++ "ZXR0czELMAkGA1UEBhMCVVMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJvL\n" + ++ "cZu6Rzf9IrduEDjJxEFv5uBvUNMlIAph7NhfmFH9puPW3Ksci4a5yTCzxI9VeVf3\n" + ++ "oYZ/UrZdF+mNZmS23RUh71X5tjMO+xew196M1xNpCRLbjcZ6i4tNdZYkdRIe8ejN\n" + ++ "sbBoD7OAvPbQqTygeG4jYjK6ODofSrba3BndNoFxAgMBAAGjGTAXMBUGA1UdEwEB\n" + ++ "/wQLMAkBAf8CBH////8wDQYJKoZIhvcNAQEFBQADgYEATvCqn69pNHv0zLiZAXk7\n" + ++ "3AKwAoza0wa+1S2rVuZGfBWbV7CxmBHbgcDDbU7/I8pQVkCwOHNkVFnBgNpMuAvU\n" + ++ "aDyrHSNS/av5d1yk5WAuGX2B9mSwZdhnAvtz2fsV1q9NptdF54EkIiKtQQmTGnr9\n" + ++ "TID8CFEk/qje+AB272B1UJw=\n"; ++ ++ /** ++ * This certificate contains an AuthorityKeyIdentifier with only the ++ * keyIdentifier field filled in. ++ */ ++ private static final String INT_CERT_WITH_KEYID_AKI = ++ "MIICqTCCAhKgAwIBAgIBAjANBgkqhkiG9w0BAQUFADB3MQ0wCwYDVQQDEwRSb290\n" + ++ "MRYwFAYDVQQLEw1UZXN0IE9yZyBVbml0MREwDwYDVQQKEwhUZXN0IE9yZzEWMBQG\n" + ++ "A1UEBxMNVGVzdCBMb2NhbGl0eTEWMBQGA1UECBMNTWFzc2FjaHVzZXR0czELMAkG\n" + ++ "A1UEBhMCVVMwHhcNMTQwMjAxMDUwMDAwWhcNMjQwMjAxMDUwMDAwWjCBhDEaMBgG\n" + ++ "A1UEAxMRSW50ZXJtZWRpYXRlIENBIDIxFjAUBgNVBAsTDVRlc3QgT3JnIFVuaXQx\n" + ++ "ETAPBgNVBAoTCFRlc3QgT3JnMRYwFAYDVQQHEw1UZXN0IExvY2FsaXR5MRYwFAYD\n" + ++ "VQQIEw1NYXNzYWNodXNldHRzMQswCQYDVQQGEwJVUzCBnzANBgkqhkiG9w0BAQEF\n" + ++ "AAOBjQAwgYkCgYEAwKTZekCqb9F9T54s2IXjkQbmLIjQamMpkUlZNrpjjNq9CpTT\n" + ++ "POkfxv2UPwzTz3Ij4XFL/kJFBLm8NUOsS5xPJ62pGoZBPw9R0iMTsTce+Fpukqnr\n" + ++ "I+8jTRaAvr0tR3pqrE6uHKg7dWYN2SsWesDia/LHhwEN38yyWtSuTTLo4hcCAwEA\n" + ++ "AaM3MDUwHwYDVR0jBBgwFoAU6gZP1pO8v7+i8gsFf1gWTf/j3PkwEgYDVR0TAQH/\n" + ++ "BAgwBgEB/wIBADANBgkqhkiG9w0BAQUFAAOBgQAQxeQruav4AqQM4gmEfrHr5hOq\n" + ++ "mB2CNJ1ZqVfpDZ8GHijncKTpjNoXzzQtV23Ge+39JHOVBNWtk+aghB3iu6xGq7Qn\n" + ++ "HlBhg9meqHFqd3igDDD/jhABL2/bEo/M9rv6saYWDFZ8nCIEE6iTLTpRRko4W2Xb\n" + ++ "DyzMzMsO1kPNrJaxRg==\n"; ++ ++ /** ++ * This certificate contains an AuthorityKeyIdentifier with all 3 fields ++ * (keyIdentifier, authorityCertIssuer, and authorityCertSerialNumber) ++ * filled in. ++ */ ++ private static final String EE_CERT_WITH_FULL_AKI = ++ "MIIDLjCCApegAwIBAgIBAzANBgkqhkiG9w0BAQUFADCBhDEaMBgGA1UEAxMRSW50\n" + ++ "ZXJtZWRpYXRlIENBIDIxFjAUBgNVBAsTDVRlc3QgT3JnIFVuaXQxETAPBgNVBAoT\n" + ++ "CFRlc3QgT3JnMRYwFAYDVQQHEw1UZXN0IExvY2FsaXR5MRYwFAYDVQQIEw1NYXNz\n" + ++ "YWNodXNldHRzMQswCQYDVQQGEwJVUzAeFw0xNDAyMDEwNTAwMDBaFw0yNDAyMDEw\n" + ++ "NTAwMDBaMH0xEzARBgNVBAMTCkVuZCBFbnRpdHkxFjAUBgNVBAsTDVRlc3QgT3Jn\n" + ++ "IFVuaXQxETAPBgNVBAoTCFRlc3QgT3JnMRYwFAYDVQQHEw1UZXN0IExvY2FsaXR5\n" + ++ "MRYwFAYDVQQIEw1NYXNzYWNodXNldHRzMQswCQYDVQQGEwJVUzCBnzANBgkqhkiG\n" + ++ "9w0BAQEFAAOBjQAwgYkCgYEAqady46PdwlKHVP1iaP11CxVyL6cDlPjpwhHCcIUv\n" + ++ "nKHbzdamqmHebDcWVBNN/I0TLNCl3ga7n8KyygSN379fG7haU8SNjpy4IDAXM0/x\n" + ++ "mwTWNTbKfJEkSoiqx1WUy2JTzRUMhgYPguQNECPxBXAdQrthZ7wQosv6Ro2ySP9O\n" + ++ "YqsCAwEAAaOBtTCBsjCBoQYDVR0jBIGZMIGWgBQdeoKxTvlTgW2KgprD69vgHV4X\n" + ++ "kKF7pHkwdzENMAsGA1UEAxMEUm9vdDEWMBQGA1UECxMNVGVzdCBPcmcgVW5pdDER\n" + ++ "MA8GA1UEChMIVGVzdCBPcmcxFjAUBgNVBAcTDVRlc3QgTG9jYWxpdHkxFjAUBgNV\n" + ++ "BAgTDU1hc3NhY2h1c2V0dHMxCzAJBgNVBAYTAlVTggECMAwGA1UdEwEB/wQCMAAw\n" + ++ "DQYJKoZIhvcNAQEFBQADgYEAuG4mM1nLF7STQWwmceELZEl49ntapH/RVoekknmd\n" + ++ "aNzcL4XQf6BTl8KFUXuThHaukQnGIzFbSZV0hrpSQ5fTN2cSZgD4Fji+HuNURmmd\n" + ++ "+Kayl0piHyO1FSbrty0TFhlVNvzKXjmMp6Jdn42KyGOSCoROQcvUWN6xkV3Hvrei\n" + ++ "0ZE=\n"; ++ ++ private static Base64.Decoder b64Decoder = Base64.getMimeDecoder(); ++ private static CertificateFactory cf; ++ ++ public static void main(String[] args) throws Exception { ++ ++ cf = CertificateFactory.getInstance("X.509"); ++ ++ X509Certificate rootCert = getCertFromMimeEncoding(ROOT_CERT); ++ TrustAnchor anchor = new TrustAnchor(rootCert, null); ++ ++ X509Certificate eeCert = getCertFromMimeEncoding(EE_CERT_WITH_FULL_AKI); ++ X509Certificate intCert = getCertFromMimeEncoding(INT_CERT_WITH_KEYID_AKI); ++ ++ X509CertSelector sel = new X509CertSelector(); ++ sel.setCertificate(eeCert); ++ PKIXBuilderParameters params = new PKIXBuilderParameters ++ (Collections.singleton(anchor), sel); ++ params.setRevocationEnabled(false); ++ ++ ArrayList certs = new ArrayList<>(); ++ certs.add(intCert); ++ certs.add(eeCert); ++ CollectionCertStoreParameters ccsp = ++ new CollectionCertStoreParameters(certs); ++ CertStore cs = CertStore.getInstance("Collection", ccsp); ++ params.addCertStore(cs); ++ ++ CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX"); ++ CertPathBuilderResult res = cpb.build(params); ++ } ++ ++ private static X509Certificate getCertFromMimeEncoding(String encoded) ++ throws CertificateException ++ { ++ byte[] bytes = b64Decoder.decode(encoded); ++ ByteArrayInputStream stream = new ByteArrayInputStream(bytes); ++ return (X509Certificate)cf.generateCertificate(stream); ++ } ++} +--- ./jdk/test/java/time/tck/java/time/TCKLocalTime.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/time/tck/java/time/TCKLocalTime.java Wed Jul 30 18:42:59 2014 +0100 +@@ -88,11 +88,10 @@ + import static java.time.temporal.ChronoUnit.YEARS; + import static org.testng.Assert.assertEquals; + import static org.testng.Assert.assertNotNull; ++import static org.testng.Assert.assertSame; + import static org.testng.Assert.assertTrue; + import static org.testng.Assert.fail; + +-import java.io.ByteArrayOutputStream; +-import java.io.DataOutputStream; + import java.time.Clock; + import java.time.DateTimeException; + import java.time.Duration; +@@ -120,6 +119,7 @@ + import java.time.temporal.TemporalQuery; + import java.time.temporal.TemporalUnit; + import java.time.temporal.UnsupportedTemporalTypeException; ++import java.time.temporal.ValueRange; + import java.util.ArrayList; + import java.util.Arrays; + import java.util.EnumSet; +@@ -760,7 +760,7 @@ + } + + //----------------------------------------------------------------------- +- // with() ++ // with(TemporalAdjuster) + //----------------------------------------------------------------------- + @Test + public void test_with_adjustment() { +@@ -780,6 +780,331 @@ + } + + //----------------------------------------------------------------------- ++ // with(TemporalField, long) ++ //----------------------------------------------------------------------- ++ private long[] testPoints(long max) { ++ long[] points = new long[9]; ++ points[0] = 0; ++ points[1] = 1; ++ points[2] = 2; ++ points[3] = max / 7; ++ points[4] = (max / 7) * 2; ++ points[5] = (max / 2); ++ points[6] = (max / 7) * 6;; ++ points[7] = max - 2; ++ points[8] = max - 1; ++ return points; ++ } ++ ++ // Returns a {@code LocalTime} with the specified nano-of-second. ++ // The hour, minute and second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_nanoOfSecond() { ++ for (long i : testPoints(1_000_000_000L)) { ++ LocalTime test = TEST_12_30_40_987654321.with(NANO_OF_SECOND, i); ++ assertEquals(test.get(NANO_OF_SECOND), i); ++ assertEquals(test.get(HOUR_OF_DAY), TEST_12_30_40_987654321.get(HOUR_OF_DAY)); ++ assertEquals(test.get(MINUTE_OF_HOUR), TEST_12_30_40_987654321.get(MINUTE_OF_HOUR)); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified nano-of-day. ++ // This completely replaces the time and is equivalent to {@link #ofNanoOfDay(long)}. ++ @Test ++ public void test_with_longTemporalField_nanoOfDay() { ++ for (long i : testPoints(86_400_000_000_000L)) { ++ LocalTime test = TEST_12_30_40_987654321.with(NANO_OF_DAY, i); ++ assertEquals(test, LocalTime.ofNanoOfDay(i)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the nano-of-second replaced by the specified ++ // micro-of-second multiplied by 1,000. ++ // The hour, minute and second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_microOfSecond() { ++ for (long i : testPoints(1_000_000L)) { ++ LocalTime test = TEST_12_30_40_987654321.with(MICRO_OF_SECOND, i); ++ assertEquals(test.get(NANO_OF_SECOND), i * 1_000); ++ assertEquals(test.get(HOUR_OF_DAY), TEST_12_30_40_987654321.get(HOUR_OF_DAY)); ++ assertEquals(test.get(MINUTE_OF_HOUR), TEST_12_30_40_987654321.get(MINUTE_OF_HOUR)); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified micro-of-day. ++ // This completely replaces the time and is equivalent to using {@link #ofNanoOfDay(long)} ++ // with the micro-of-day multiplied by 1,000. ++ @Test ++ public void test_with_longTemporalField_microOfDay() { ++ for (long i : testPoints(86_400_000_000L)) { ++ LocalTime test = TEST_12_30_40_987654321.with(MICRO_OF_DAY, i); ++ assertEquals(test, LocalTime.ofNanoOfDay(i * 1000)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the nano-of-second replaced by the specified ++ // milli-of-second multiplied by 1,000,000. ++ // The hour, minute and second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_milliOfSecond() { ++ for (long i : testPoints(1_000L)) { ++ LocalTime test = TEST_12_30_40_987654321.with(MILLI_OF_SECOND, i); ++ assertEquals(test.get(NANO_OF_SECOND), i * 1_000_000); ++ assertEquals(test.get(HOUR_OF_DAY), TEST_12_30_40_987654321.get(HOUR_OF_DAY)); ++ assertEquals(test.get(MINUTE_OF_HOUR), TEST_12_30_40_987654321.get(MINUTE_OF_HOUR)); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified milli-of-day. ++ // This completely replaces the time and is equivalent to using {@link #ofNanoOfDay(long)} ++ // with the milli-of-day multiplied by 1,000,000. ++ @Test ++ public void test_with_longTemporalField_milliOfDay() { ++ for (long i : testPoints(86_400_000L)) { ++ LocalTime test = TEST_12_30_40_987654321.with(MILLI_OF_DAY, i); ++ assertEquals(test, LocalTime.ofNanoOfDay(i * 1_000_000)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified second-of-minute. ++ // The hour, minute and nano-of-second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_secondOfMinute() { ++ for (long i : testPoints(60L)) { ++ LocalTime test = TEST_12_30_40_987654321.with(SECOND_OF_MINUTE, i); ++ assertEquals(test.get(SECOND_OF_MINUTE), i); ++ assertEquals(test.get(HOUR_OF_DAY), TEST_12_30_40_987654321.get(HOUR_OF_DAY)); ++ assertEquals(test.get(MINUTE_OF_HOUR), TEST_12_30_40_987654321.get(MINUTE_OF_HOUR)); ++ assertEquals(test.get(NANO_OF_SECOND), TEST_12_30_40_987654321.get(NANO_OF_SECOND)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified second-of-day. ++ // The nano-of-second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_secondOfDay() { ++ for (long i : testPoints(24 * 60 * 60)) { ++ LocalTime test = TEST_12_30_40_987654321.with(SECOND_OF_DAY, i); ++ assertEquals(test.get(SECOND_OF_DAY), i); ++ assertEquals(test.get(NANO_OF_SECOND), TEST_12_30_40_987654321.get(NANO_OF_SECOND)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified minute-of-hour. ++ // The hour, second-of-minute and nano-of-second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_minuteOfHour() { ++ for (long i : testPoints(60)) { ++ LocalTime test = TEST_12_30_40_987654321.with(MINUTE_OF_HOUR, i); ++ assertEquals(test.get(MINUTE_OF_HOUR), i); ++ assertEquals(test.get(HOUR_OF_DAY), TEST_12_30_40_987654321.get(HOUR_OF_DAY)); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ assertEquals(test.get(NANO_OF_SECOND), TEST_12_30_40_987654321.get(NANO_OF_SECOND)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified minute-of-day. ++ // The second-of-minute and nano-of-second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_minuteOfDay() { ++ for (long i : testPoints(24 * 60)) { ++ LocalTime test = TEST_12_30_40_987654321.with(MINUTE_OF_DAY, i); ++ assertEquals(test.get(MINUTE_OF_DAY), i); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ assertEquals(test.get(NANO_OF_SECOND), TEST_12_30_40_987654321.get(NANO_OF_SECOND)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified hour-of-am-pm. ++ // The AM/PM, minute-of-hour, second-of-minute and nano-of-second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_hourOfAmPm() { ++ for (int i = 0; i < 12; i++) { ++ LocalTime test = TEST_12_30_40_987654321.with(HOUR_OF_AMPM, i); ++ assertEquals(test.get(HOUR_OF_AMPM), i); ++ assertEquals(test.get(AMPM_OF_DAY), TEST_12_30_40_987654321.get(AMPM_OF_DAY)); ++ assertEquals(test.get(MINUTE_OF_HOUR), TEST_12_30_40_987654321.get(MINUTE_OF_HOUR)); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ assertEquals(test.get(NANO_OF_SECOND), TEST_12_30_40_987654321.get(NANO_OF_SECOND)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified clock-hour-of-am-pm. ++ // The AM/PM, minute-of-hour, second-of-minute and nano-of-second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_clockHourOfAmPm() { ++ for (int i = 1; i <= 12; i++) { ++ LocalTime test = TEST_12_30_40_987654321.with(CLOCK_HOUR_OF_AMPM, i); ++ assertEquals(test.get(CLOCK_HOUR_OF_AMPM), i); ++ assertEquals(test.get(AMPM_OF_DAY), TEST_12_30_40_987654321.get(AMPM_OF_DAY)); ++ assertEquals(test.get(MINUTE_OF_HOUR), TEST_12_30_40_987654321.get(MINUTE_OF_HOUR)); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ assertEquals(test.get(NANO_OF_SECOND), TEST_12_30_40_987654321.get(NANO_OF_SECOND)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified hour-of-day. ++ // The minute-of-hour, second-of-minute and nano-of-second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_hourOfDay() { ++ for (int i = 0; i < 24; i++) { ++ LocalTime test = TEST_12_30_40_987654321.with(HOUR_OF_DAY, i); ++ assertEquals(test.get(HOUR_OF_DAY), i); ++ assertEquals(test.get(MINUTE_OF_HOUR), TEST_12_30_40_987654321.get(MINUTE_OF_HOUR)); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ assertEquals(test.get(NANO_OF_SECOND), TEST_12_30_40_987654321.get(NANO_OF_SECOND)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified clock-hour-of-day. ++ // The minute-of-hour, second-of-minute and nano-of-second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_clockHourOfDay() { ++ for (int i = 1; i <= 24; i++) { ++ LocalTime test = TEST_12_30_40_987654321.with(CLOCK_HOUR_OF_DAY, i); ++ assertEquals(test.get(CLOCK_HOUR_OF_DAY), i); ++ assertEquals(test.get(MINUTE_OF_HOUR), TEST_12_30_40_987654321.get(MINUTE_OF_HOUR)); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ assertEquals(test.get(NANO_OF_SECOND), TEST_12_30_40_987654321.get(NANO_OF_SECOND)); ++ } ++ } ++ ++ // Returns a {@code LocalTime} with the specified AM/PM. ++ // The hour-of-am-pm, minute-of-hour, second-of-minute and nano-of-second will be unchanged. ++ @Test ++ public void test_with_longTemporalField_amPmOfDay() { ++ for (int i = 0; i <= 1; i++) { ++ LocalTime test = TEST_12_30_40_987654321.with(AMPM_OF_DAY, i); ++ assertEquals(test.get(AMPM_OF_DAY), i); ++ assertEquals(test.get(HOUR_OF_AMPM), TEST_12_30_40_987654321.get(HOUR_OF_AMPM)); ++ assertEquals(test.get(MINUTE_OF_HOUR), TEST_12_30_40_987654321.get(MINUTE_OF_HOUR)); ++ assertEquals(test.get(SECOND_OF_MINUTE), TEST_12_30_40_987654321.get(SECOND_OF_MINUTE)); ++ assertEquals(test.get(NANO_OF_SECOND), TEST_12_30_40_987654321.get(NANO_OF_SECOND)); ++ } ++ } ++ ++ // The supported fields behave as follows... ++ // In all cases, if the new value is outside the valid range of values for the field ++ // then a {@code DateTimeException} will be thrown. ++ @DataProvider(name = "withTemporalField_outOfRange") ++ Object[][] data_withTemporalField_outOfRange() { ++ return new Object[][] { ++ {NANO_OF_SECOND, time(0, 0, 0, 0), NANO_OF_SECOND.range().getMinimum() - 1}, ++ {NANO_OF_SECOND, time(0, 0, 0, 0), NANO_OF_SECOND.range().getMaximum() + 1}, ++ ++ {NANO_OF_DAY, time(0, 0, 0, 0), NANO_OF_DAY.range().getMinimum() - 1}, ++ {NANO_OF_DAY, time(0, 0, 0, 0), NANO_OF_DAY.range().getMaximum() + 1}, ++ ++ {MICRO_OF_SECOND, time(0, 0, 0, 0), MICRO_OF_SECOND.range().getMinimum() - 1}, ++ {MICRO_OF_SECOND, time(0, 0, 0, 0), MICRO_OF_SECOND.range().getMaximum() + 1}, ++ ++ {MICRO_OF_DAY, time(0, 0, 0, 0), MICRO_OF_DAY.range().getMinimum() - 1}, ++ {MICRO_OF_DAY, time(0, 0, 0, 0), MICRO_OF_DAY.range().getMaximum() + 1}, ++ ++ {MILLI_OF_SECOND, time(0, 0, 0, 0), MILLI_OF_SECOND.range().getMinimum() - 1}, ++ {MILLI_OF_SECOND, time(0, 0, 0, 0), MILLI_OF_SECOND.range().getMaximum() + 1}, ++ ++ {MILLI_OF_DAY, time(0, 0, 0, 0), MILLI_OF_DAY.range().getMinimum() - 1}, ++ {MILLI_OF_DAY, time(0, 0, 0, 0), MILLI_OF_DAY.range().getMaximum() + 1}, ++ ++ {SECOND_OF_MINUTE, time(0, 0, 0, 0), SECOND_OF_MINUTE.range().getMinimum() - 1}, ++ {SECOND_OF_MINUTE, time(0, 0, 0, 0), SECOND_OF_MINUTE.range().getMaximum() + 1}, ++ ++ {SECOND_OF_DAY, time(0, 0, 0, 0), SECOND_OF_DAY.range().getMinimum() - 1}, ++ {SECOND_OF_DAY, time(0, 0, 0, 0), SECOND_OF_DAY.range().getMaximum() + 1}, ++ ++ {MINUTE_OF_HOUR, time(0, 0, 0, 0), MINUTE_OF_HOUR.range().getMinimum() - 1}, ++ {MINUTE_OF_HOUR, time(0, 0, 0, 0), MINUTE_OF_HOUR.range().getMaximum() + 1}, ++ ++ {MINUTE_OF_DAY, time(0, 0, 0, 0), MINUTE_OF_DAY.range().getMinimum() - 1}, ++ {MINUTE_OF_DAY, time(0, 0, 0, 0), MINUTE_OF_DAY.range().getMaximum() + 1}, ++ ++ {HOUR_OF_AMPM, time(0, 0, 0, 0), HOUR_OF_AMPM.range().getMinimum() - 1}, ++ {HOUR_OF_AMPM, time(0, 0, 0, 0), HOUR_OF_AMPM.range().getMaximum() + 1}, ++ ++ {CLOCK_HOUR_OF_AMPM, time(0, 0, 0, 0), CLOCK_HOUR_OF_AMPM.range().getMinimum() - 1}, ++ {CLOCK_HOUR_OF_AMPM, time(0, 0, 0, 0), CLOCK_HOUR_OF_AMPM.range().getMaximum() + 1}, ++ ++ {HOUR_OF_DAY, time(0, 0, 0, 0), HOUR_OF_DAY.range().getMinimum() - 1}, ++ {HOUR_OF_DAY, time(0, 0, 0, 0), HOUR_OF_DAY.range().getMaximum() + 1}, ++ ++ {CLOCK_HOUR_OF_DAY, time(0, 0, 0, 0), CLOCK_HOUR_OF_DAY.range().getMinimum() - 1}, ++ {CLOCK_HOUR_OF_DAY, time(0, 0, 0, 0), CLOCK_HOUR_OF_DAY.range().getMaximum() + 1}, ++ ++ {AMPM_OF_DAY, time(0, 0, 0, 0), AMPM_OF_DAY.range().getMinimum() - 1}, ++ {AMPM_OF_DAY, time(0, 0, 0, 0), AMPM_OF_DAY.range().getMaximum() + 1}, ++ }; ++ } ++ ++ @Test(dataProvider = "withTemporalField_outOfRange") ++ public void test_with_longTemporalField_invalid(TemporalField field, LocalTime base, long newValue) { ++ try { ++ base.with(field, newValue); ++ fail("Field should not be allowed " + field); ++ } catch (DateTimeException ex) { ++ // expected ++ } ++ } ++ ++ // All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}. ++ @Test(expectedExceptions=UnsupportedTemporalTypeException.class) ++ public void test_with_longTemporalField_otherChronoField() { ++ TEST_12_30_40_987654321.with(ChronoField.DAY_OF_MONTH, 1); ++ } ++ ++ // If the field is not a {@code ChronoField}, then the result of this method ++ // is obtained by invoking {@code TemporalField.adjustInto(Temporal, long)} ++ // passing {@code this} as the argument. ++ @Test ++ public void test_with_longTemporalField_notChronoField() { ++ final LocalTime result = LocalTime.of(12, 30); ++ final LocalTime base = LocalTime.of(15, 45); ++ TemporalField field = new TemporalField() { ++ public ValueRange rangeRefinedBy(TemporalAccessor temporal) { ++ throw new UnsupportedOperationException(); ++ } ++ public ValueRange range() { ++ return null; ++ } ++ public boolean isTimeBased() { ++ throw new UnsupportedOperationException(); ++ } ++ public boolean isSupportedBy(TemporalAccessor temporal) { ++ throw new UnsupportedOperationException(); ++ } ++ public boolean isDateBased() { ++ throw new UnsupportedOperationException(); ++ } ++ public TemporalUnit getRangeUnit() { ++ throw new UnsupportedOperationException(); ++ } ++ public long getFrom(TemporalAccessor temporal) { ++ throw new UnsupportedOperationException(); ++ } ++ public TemporalUnit getBaseUnit() { ++ throw new UnsupportedOperationException(); ++ } ++ public R adjustInto(R temporal, long newValue) { ++ assertEquals(temporal, base); ++ assertEquals(newValue, 12L); ++ @SuppressWarnings("unchecked") ++ R r = (R) result; ++ return r; ++ } ++ }; ++ LocalTime test = base.with(field, 12L); ++ assertSame(test, result); ++ } ++ ++ @Test(expectedExceptions=NullPointerException.class) ++ public void test_with_longTemporalField_null() { ++ TEST_12_30_40_987654321.with((TemporalField) null, 1); ++ } ++ ++ //----------------------------------------------------------------------- + // withHour() + //----------------------------------------------------------------------- + @Test +--- ./jdk/test/java/time/tck/java/time/format/TCKDateTimeFormatter.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/time/tck/java/time/format/TCKDateTimeFormatter.java Wed Jul 30 18:42:59 2014 +0100 +@@ -254,14 +254,20 @@ + assertEquals(parsed.isSupported(YEAR), false); // not in the list of resolverFields + } + +- @Test(expectedExceptions = NullPointerException.class) ++ @Test + public void test_resolverFields_Array_null() throws Exception { +- DateTimeFormatter.ISO_DATE.withResolverFields((TemporalField[]) null); ++ DateTimeFormatter f = DateTimeFormatter.ISO_DATE.withResolverFields(MONTH_OF_YEAR); ++ assertEquals(f.getResolverFields().size(), 1); ++ f = f.withResolverFields((TemporalField[]) null); ++ assertEquals(f.getResolverFields(), null); + } + +- @Test(expectedExceptions = NullPointerException.class) ++ @Test + public void test_resolverFields_Set_null() throws Exception { +- DateTimeFormatter.ISO_DATE.withResolverFields((Set) null); ++ DateTimeFormatter f = DateTimeFormatter.ISO_DATE.withResolverFields(MONTH_OF_YEAR); ++ assertEquals(f.getResolverFields().size(), 1); ++ f = f.withResolverFields((Set) null); ++ assertEquals(f.getResolverFields(), null); + } + + //----------------------------------------------------------------------- +--- ./jdk/test/java/time/tck/java/time/format/TCKDateTimeFormatterBuilder.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/time/tck/java/time/format/TCKDateTimeFormatterBuilder.java Wed Jul 30 18:42:59 2014 +0100 +@@ -60,11 +60,14 @@ + package tck.java.time.format; + + import static java.time.temporal.ChronoField.DAY_OF_MONTH; ++import static java.time.temporal.ChronoField.HOUR_OF_DAY; + import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; + import static java.time.temporal.ChronoField.MONTH_OF_YEAR; ++import static java.time.temporal.ChronoField.NANO_OF_SECOND; + import static java.time.temporal.ChronoField.YEAR; + import static org.testng.Assert.assertEquals; + ++import java.text.ParsePosition; + import java.time.LocalDate; + import java.time.YearMonth; + import java.time.ZoneOffset; +@@ -73,6 +76,7 @@ + import java.time.format.SignStyle; + import java.time.format.TextStyle; + import java.time.temporal.Temporal; ++import java.time.temporal.TemporalAccessor; + import java.util.HashMap; + import java.util.Locale; + import java.util.Map; +@@ -728,4 +732,150 @@ + return LocalDate.of(y, m, d); + } + ++ //----------------------------------------------------------------------- ++ @Test ++ public void test_adjacent_strict_firstFixedWidth() throws Exception { ++ // succeeds because both number elements are fixed width ++ DateTimeFormatter f = builder.appendValue(HOUR_OF_DAY, 2).appendValue(MINUTE_OF_HOUR, 2).appendLiteral('9').toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("12309", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 5); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 12L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 30L); ++ } ++ ++ @Test ++ public void test_adjacent_strict_firstVariableWidth_success() throws Exception { ++ // succeeds greedily parsing variable width, then fixed width, to non-numeric Z ++ DateTimeFormatter f = builder.appendValue(HOUR_OF_DAY).appendValue(MINUTE_OF_HOUR, 2).appendLiteral('Z').toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("12309Z", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 6); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 123L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 9L); ++ } ++ ++ @Test ++ public void test_adjacent_strict_firstVariableWidth_fails() throws Exception { ++ // fails because literal is a number and variable width parse greedily absorbs it ++ DateTimeFormatter f = builder.appendValue(HOUR_OF_DAY).appendValue(MINUTE_OF_HOUR, 2).appendLiteral('9').toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("12309", pp); ++ assertEquals(pp.getErrorIndex(), 5); ++ assertEquals(parsed, null); ++ } ++ ++ @Test ++ public void test_adjacent_lenient() throws Exception { ++ // succeeds because both number elements are fixed width even in lenient mode ++ DateTimeFormatter f = builder.parseLenient().appendValue(HOUR_OF_DAY, 2).appendValue(MINUTE_OF_HOUR, 2).appendLiteral('9').toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("12309", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 5); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 12L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 30L); ++ } ++ ++ @Test ++ public void test_adjacent_lenient_firstVariableWidth_success() throws Exception { ++ // succeeds greedily parsing variable width, then fixed width, to non-numeric Z ++ DateTimeFormatter f = builder.parseLenient().appendValue(HOUR_OF_DAY).appendValue(MINUTE_OF_HOUR, 2).appendLiteral('Z').toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("12309Z", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 6); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 123L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 9L); ++ } ++ ++ @Test ++ public void test_adjacent_lenient_firstVariableWidth_fails() throws Exception { ++ // fails because literal is a number and variable width parse greedily absorbs it ++ DateTimeFormatter f = builder.parseLenient().appendValue(HOUR_OF_DAY).appendValue(MINUTE_OF_HOUR, 2).appendLiteral('9').toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("12309", pp); ++ assertEquals(pp.getErrorIndex(), 5); ++ assertEquals(parsed, null); ++ } ++ ++ //----------------------------------------------------------------------- ++ @Test ++ public void test_adjacent_strict_fractionFollows() throws Exception { ++ // succeeds because hour/min are fixed width ++ DateTimeFormatter f = builder.appendValue(HOUR_OF_DAY, 2).appendValue(MINUTE_OF_HOUR, 2).appendFraction(NANO_OF_SECOND, 0, 3, false).toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("1230567", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 7); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 12L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 30L); ++ assertEquals(parsed.getLong(NANO_OF_SECOND), 567_000_000L); ++ } ++ ++ @Test ++ public void test_adjacent_strict_fractionFollows_2digit() throws Exception { ++ // succeeds because hour/min are fixed width ++ DateTimeFormatter f = builder.appendValue(HOUR_OF_DAY, 2).appendValue(MINUTE_OF_HOUR, 2).appendFraction(NANO_OF_SECOND, 0, 3, false).toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("123056", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 6); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 12L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 30L); ++ assertEquals(parsed.getLong(NANO_OF_SECOND), 560_000_000L); ++ } ++ ++ @Test ++ public void test_adjacent_strict_fractionFollows_0digit() throws Exception { ++ // succeeds because hour/min are fixed width ++ DateTimeFormatter f = builder.appendValue(HOUR_OF_DAY, 2).appendValue(MINUTE_OF_HOUR, 2).appendFraction(NANO_OF_SECOND, 0, 3, false).toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("1230", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 4); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 12L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 30L); ++ } ++ ++ @Test ++ public void test_adjacent_lenient_fractionFollows() throws Exception { ++ // succeeds because hour/min are fixed width ++ DateTimeFormatter f = builder.parseLenient().appendValue(HOUR_OF_DAY, 2).appendValue(MINUTE_OF_HOUR, 2).appendFraction(NANO_OF_SECOND, 3, 3, false).toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("1230567", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 7); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 12L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 30L); ++ assertEquals(parsed.getLong(NANO_OF_SECOND), 567_000_000L); ++ } ++ ++ @Test ++ public void test_adjacent_lenient_fractionFollows_2digit() throws Exception { ++ // succeeds because hour/min are fixed width ++ DateTimeFormatter f = builder.parseLenient().appendValue(HOUR_OF_DAY, 2).appendValue(MINUTE_OF_HOUR, 2).appendFraction(NANO_OF_SECOND, 3, 3, false).toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("123056", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 6); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 12L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 30L); ++ assertEquals(parsed.getLong(NANO_OF_SECOND), 560_000_000L); ++ } ++ ++ @Test ++ public void test_adjacent_lenient_fractionFollows_0digit() throws Exception { ++ // succeeds because hour/min are fixed width ++ DateTimeFormatter f = builder.parseLenient().appendValue(HOUR_OF_DAY, 2).appendValue(MINUTE_OF_HOUR, 2).appendFraction(NANO_OF_SECOND, 3, 3, false).toFormatter(Locale.UK); ++ ParsePosition pp = new ParsePosition(0); ++ TemporalAccessor parsed = f.parseUnresolved("1230", pp); ++ assertEquals(pp.getErrorIndex(), -1); ++ assertEquals(pp.getIndex(), 4); ++ assertEquals(parsed.getLong(HOUR_OF_DAY), 12L); ++ assertEquals(parsed.getLong(MINUTE_OF_HOUR), 30L); ++ } ++ + } +--- ./jdk/test/java/time/tck/java/time/format/TCKDateTimeParseResolver.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/time/tck/java/time/format/TCKDateTimeParseResolver.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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; +@@ -90,25 +91,28 @@ + import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; + import static java.time.temporal.ChronoField.YEAR; + import static java.time.temporal.ChronoField.YEAR_OF_ERA; +-import static java.time.temporal.ChronoUnit.DAYS; +-import static java.time.temporal.ChronoUnit.FOREVER; +-import static java.time.temporal.ChronoUnit.NANOS; + 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.Chronology; ++import java.time.chrono.ChronoLocalDate; ++import java.time.chrono.ChronoLocalDateTime; ++import java.time.chrono.ChronoZonedDateTime; ++import java.time.chrono.IsoChronology; ++import java.time.chrono.MinguoChronology; ++import java.time.chrono.MinguoDate; + import java.time.chrono.ThaiBuddhistChronology; + import java.time.format.DateTimeFormatter; + import java.time.format.DateTimeFormatterBuilder; + import java.time.format.DateTimeParseException; + import java.time.format.ResolverStyle; +-import java.time.temporal.ChronoUnit; + import java.time.temporal.IsoFields; + import java.time.temporal.Temporal; + import java.time.temporal.TemporalAccessor; +@@ -129,6 +133,9 @@ + // TODO: tests with weird TenporalField implementations + // TODO: tests with non-ISO chronologies + ++ private static final ZoneId EUROPE_ATHENS = ZoneId.of("Europe/Athens"); ++ private static final ZoneId EUROPE_PARIS = ZoneId.of("Europe/Paris"); ++ + //----------------------------------------------------------------------- + @DataProvider(name="resolveOneNoChange") + Object[][] data_resolveOneNoChange() { +@@ -886,205 +893,371 @@ + } + + //----------------------------------------------------------------------- ++ // SPEC: DateTimeFormatter.withChronology() + @Test +- public void test_fieldResolvesToLocalTime() { +- TemporalField field = new TemporalField() { +- @Override +- public TemporalUnit getBaseUnit() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public TemporalUnit getRangeUnit() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public ValueRange range() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isDateBased() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isTimeBased() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isSupportedBy(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public ValueRange rangeRefinedBy(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public long getFrom(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public R adjustInto(R temporal, long newValue) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public TemporalAccessor resolve( +- Map fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle) { +- return LocalTime.MIDNIGHT.plusNanos(fieldValues.remove(this)); +- } +- }; +- DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(field).toFormatter(); +- TemporalAccessor accessor = f.parse("1234567890"); +- assertEquals(accessor.query(TemporalQueries.localDate()), null); +- assertEquals(accessor.query(TemporalQueries.localTime()), LocalTime.of(0, 0, 1, 234_567_890)); ++ public void test_withChronology_noOverride() { ++ DateTimeFormatter f = new DateTimeFormatterBuilder().parseDefaulting(EPOCH_DAY, 2).toFormatter(); ++ TemporalAccessor accessor = f.parse(""); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(1970, 1, 3)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.chronology()), IsoChronology.INSTANCE); + } + + @Test +- public void test_fieldResolvesToChronoLocalDateTime() { +- TemporalField field = new TemporalField() { +- @Override +- public TemporalUnit getBaseUnit() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public TemporalUnit getRangeUnit() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public ValueRange range() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isDateBased() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isTimeBased() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isSupportedBy(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public ValueRange rangeRefinedBy(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public long getFrom(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public R adjustInto(R temporal, long newValue) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public TemporalAccessor resolve( +- Map fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle) { +- fieldValues.remove(this); +- return LocalDateTime.of(2010, 6, 30, 12, 30); +- } +- }; +- DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(field).toFormatter(); ++ public void test_withChronology_override() { ++ DateTimeFormatter f = new DateTimeFormatterBuilder().parseDefaulting(EPOCH_DAY, 2).toFormatter(); ++ f = f.withChronology(MinguoChronology.INSTANCE); ++ TemporalAccessor accessor = f.parse(""); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(1970, 1, 3)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.chronology()), MinguoChronology.INSTANCE); ++ } ++ ++ @Test ++ public void test_withChronology_parsedChronology_noOverride() { ++ DateTimeFormatter f = new DateTimeFormatterBuilder().parseDefaulting(EPOCH_DAY, 2).appendChronologyId().toFormatter(); ++ TemporalAccessor accessor = f.parse("ThaiBuddhist"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(1970, 1, 3)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.chronology()), ThaiBuddhistChronology.INSTANCE); ++ } ++ ++ @Test ++ public void test_withChronology_parsedChronology_override() { ++ DateTimeFormatter f = new DateTimeFormatterBuilder().parseDefaulting(EPOCH_DAY, 2).appendChronologyId().toFormatter(); ++ f = f.withChronology(MinguoChronology.INSTANCE); ++ TemporalAccessor accessor = f.parse("ThaiBuddhist"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(1970, 1, 3)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.chronology()), ThaiBuddhistChronology.INSTANCE); ++ } ++ ++ //----------------------------------------------------------------------- ++ // SPEC: DateTimeFormatter.withZone() ++ @Test ++ public void test_withZone_noOverride() { ++ DateTimeFormatter f = new DateTimeFormatterBuilder().parseDefaulting(EPOCH_DAY, 2).toFormatter(); ++ TemporalAccessor accessor = f.parse(""); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(1970, 1, 3)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.zoneId()), null); ++ } ++ ++ @Test ++ public void test_withZone_override() { ++ DateTimeFormatter f = new DateTimeFormatterBuilder().parseDefaulting(EPOCH_DAY, 2).toFormatter(); ++ f = f.withZone(EUROPE_ATHENS); ++ TemporalAccessor accessor = f.parse(""); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(1970, 1, 3)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.zoneId()), EUROPE_ATHENS); ++ } ++ ++ @Test ++ public void test_withZone_parsedZone_noOverride() { ++ DateTimeFormatter f = new DateTimeFormatterBuilder().parseDefaulting(EPOCH_DAY, 2).appendZoneId().toFormatter(); ++ TemporalAccessor accessor = f.parse("Europe/Paris"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(1970, 1, 3)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.zoneId()), EUROPE_PARIS); ++ } ++ ++ @Test ++ public void test_withZone_parsedZone_override() { ++ DateTimeFormatter f = new DateTimeFormatterBuilder().parseDefaulting(EPOCH_DAY, 2).appendZoneId().toFormatter(); ++ f = f.withZone(EUROPE_ATHENS); ++ TemporalAccessor accessor = f.parse("Europe/Paris"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(1970, 1, 3)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.zoneId()), EUROPE_PARIS); ++ } ++ ++ //----------------------------------------------------------------------- ++ @Test ++ public void test_fieldResolvesToLocalTime() { ++ LocalTime lt = LocalTime.of(12, 30, 40); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(lt)).toFormatter(); ++ TemporalAccessor accessor = f.parse("1234567890"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), null); ++ assertEquals(accessor.query(TemporalQueries.localTime()), lt); ++ } ++ ++ //------------------------------------------------------------------------- ++ @Test ++ public void test_fieldResolvesToChronoLocalDate_noOverrideChrono_matches() { ++ LocalDate ldt = LocalDate.of(2010, 6, 30); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(ldt)).toFormatter(); + TemporalAccessor accessor = f.parse("1234567890"); + assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(2010, 6, 30)); +- assertEquals(accessor.query(TemporalQueries.localTime()), LocalTime.of(12, 30)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.chronology()), IsoChronology.INSTANCE); ++ } ++ ++ @Test ++ public void test_fieldResolvesToChronoLocalDate_overrideChrono_matches() { ++ MinguoDate mdt = MinguoDate.of(100, 6, 30); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(mdt)).toFormatter(); ++ f = f.withChronology(MinguoChronology.INSTANCE); ++ TemporalAccessor accessor = f.parse("1234567890"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.from(mdt)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), null); ++ assertEquals(accessor.query(TemporalQueries.chronology()), MinguoChronology.INSTANCE); + } + + @Test(expectedExceptions = DateTimeParseException.class) +- public void test_fieldResolvesWrongChrono() { +- TemporalField field = new TemporalField() { +- @Override +- public TemporalUnit getBaseUnit() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public TemporalUnit getRangeUnit() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public ValueRange range() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isDateBased() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isTimeBased() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isSupportedBy(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public ValueRange rangeRefinedBy(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public long getFrom(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public R adjustInto(R temporal, long newValue) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public TemporalAccessor resolve( +- Map fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle) { +- return ThaiBuddhistChronology.INSTANCE.dateNow(); +- } +- }; +- DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(field).toFormatter(); ++ public void test_fieldResolvesToChronoLocalDate_noOverrideChrono_wrongChrono() { ++ ChronoLocalDate cld = ThaiBuddhistChronology.INSTANCE.dateNow(); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(cld)).toFormatter(); + f.parse("1234567890"); + } + + @Test(expectedExceptions = DateTimeParseException.class) +- public void test_fieldResolvesWrongZone() { +- TemporalField field = new TemporalField() { +- @Override +- public TemporalUnit getBaseUnit() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public TemporalUnit getRangeUnit() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public ValueRange range() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isDateBased() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isTimeBased() { +- throw new UnsupportedOperationException(); +- } +- @Override +- public boolean isSupportedBy(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public ValueRange rangeRefinedBy(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public long getFrom(TemporalAccessor temporal) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public R adjustInto(R temporal, long newValue) { +- throw new UnsupportedOperationException(); +- } +- @Override +- public TemporalAccessor resolve( +- Map fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle) { +- return ZonedDateTime.of(2010, 6, 30, 12, 30, 0, 0, ZoneId.of("Europe/Paris")); +- } +- }; +- DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(field).toFormatter().withZone(ZoneId.of("Europe/London")); ++ public void test_fieldResolvesToChronoLocalDate_overrideChrono_wrongChrono() { ++ ChronoLocalDate cld = ThaiBuddhistChronology.INSTANCE.dateNow(); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(cld)).toFormatter(); ++ f = f.withChronology(MinguoChronology.INSTANCE); + f.parse("1234567890"); + } + ++ //------------------------------------------------------------------------- ++ @Test ++ public void test_fieldResolvesToChronoLocalDateTime_noOverrideChrono_matches() { ++ LocalDateTime ldt = LocalDateTime.of(2010, 6, 30, 12, 30); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(ldt)).toFormatter(); ++ TemporalAccessor accessor = f.parse("1234567890"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(2010, 6, 30)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), LocalTime.of(12, 30)); ++ assertEquals(accessor.query(TemporalQueries.chronology()), IsoChronology.INSTANCE); ++ } ++ ++ @Test ++ public void test_fieldResolvesToChronoLocalDateTime_overrideChrono_matches() { ++ MinguoDate mdt = MinguoDate.of(100, 6, 30); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(mdt.atTime(LocalTime.NOON))).toFormatter(); ++ f = f.withChronology(MinguoChronology.INSTANCE); ++ TemporalAccessor accessor = f.parse("1234567890"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.from(mdt)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), LocalTime.NOON); ++ assertEquals(accessor.query(TemporalQueries.chronology()), MinguoChronology.INSTANCE); ++ } ++ ++ @Test(expectedExceptions = DateTimeParseException.class) ++ public void test_fieldResolvesToChronoLocalDateTime_noOverrideChrono_wrongChrono() { ++ ChronoLocalDateTime cldt = ThaiBuddhistChronology.INSTANCE.dateNow().atTime(LocalTime.NOON); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(cldt)).toFormatter(); ++ f.parse("1234567890"); ++ } ++ ++ @Test(expectedExceptions = DateTimeParseException.class) ++ public void test_fieldResolvesToChronoLocalDateTime_overrideChrono_wrongChrono() { ++ ChronoLocalDateTime cldt = ThaiBuddhistChronology.INSTANCE.dateNow().atTime(LocalTime.NOON); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(cldt)).toFormatter(); ++ f = f.withChronology(MinguoChronology.INSTANCE); ++ f.parse("1234567890"); ++ } ++ ++ //------------------------------------------------------------------------- ++ @Test ++ public void test_fieldResolvesToChronoZonedDateTime_noOverrideChrono_matches() { ++ ZonedDateTime zdt = ZonedDateTime.of(2010, 6, 30, 12, 30, 0, 0, EUROPE_PARIS); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(zdt)).toFormatter(); ++ TemporalAccessor accessor = f.parse("1234567890"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.of(2010, 6, 30)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), LocalTime.of(12, 30)); ++ assertEquals(accessor.query(TemporalQueries.chronology()), IsoChronology.INSTANCE); ++ assertEquals(accessor.query(TemporalQueries.zoneId()), EUROPE_PARIS); ++ } ++ ++ @Test ++ public void test_fieldResolvesToChronoZonedDateTime_overrideChrono_matches() { ++ MinguoDate mdt = MinguoDate.of(100, 6, 30); ++ ChronoZonedDateTime mzdt = mdt.atTime(LocalTime.NOON).atZone(EUROPE_PARIS); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(mzdt)).toFormatter(); ++ f = f.withChronology(MinguoChronology.INSTANCE); ++ TemporalAccessor accessor = f.parse("1234567890"); ++ assertEquals(accessor.query(TemporalQueries.localDate()), LocalDate.from(mdt)); ++ assertEquals(accessor.query(TemporalQueries.localTime()), LocalTime.NOON); ++ assertEquals(accessor.query(TemporalQueries.chronology()), MinguoChronology.INSTANCE); ++ assertEquals(accessor.query(TemporalQueries.zoneId()), EUROPE_PARIS); ++ } ++ ++ @Test(expectedExceptions = DateTimeParseException.class) ++ public void test_fieldResolvesToChronoZonedDateTime_noOverrideChrono_wrongChrono() { ++ ChronoZonedDateTime cldt = ThaiBuddhistChronology.INSTANCE.dateNow().atTime(LocalTime.NOON).atZone(EUROPE_PARIS); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(cldt)).toFormatter(); ++ f.parse("1234567890"); ++ } ++ ++ @Test(expectedExceptions = DateTimeParseException.class) ++ public void test_fieldResolvesToChronoZonedDateTime_overrideChrono_wrongChrono() { ++ ChronoZonedDateTime cldt = ThaiBuddhistChronology.INSTANCE.dateNow().atTime(LocalTime.NOON).atZone(EUROPE_PARIS); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(cldt)).toFormatter(); ++ f = f.withChronology(MinguoChronology.INSTANCE); ++ f.parse("1234567890"); ++ } ++ ++ @Test ++ public void test_fieldResolvesToChronoZonedDateTime_overrideZone_matches() { ++ ZonedDateTime zdt = ZonedDateTime.of(2010, 6, 30, 12, 30, 0, 0, EUROPE_PARIS); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(zdt)).toFormatter(); ++ f = f.withZone(EUROPE_PARIS); ++ assertEquals(f.parse("1234567890", ZonedDateTime::from), zdt); ++ } ++ ++ @Test(expectedExceptions = DateTimeParseException.class) ++ public void test_fieldResolvesToChronoZonedDateTime_overrideZone_wrongZone() { ++ ZonedDateTime zdt = ZonedDateTime.of(2010, 6, 30, 12, 30, 0, 0, EUROPE_PARIS); ++ DateTimeFormatter f = new DateTimeFormatterBuilder().appendValue(new ResolvingField(zdt)).toFormatter(); ++ f = f.withZone(ZoneId.of("Europe/London")); ++ f.parse("1234567890"); ++ } ++ ++ //------------------------------------------------------------------------- ++ private static class ResolvingField implements TemporalField { ++ private final TemporalAccessor resolvedValue; ++ ResolvingField(TemporalAccessor resolvedValue) { ++ this.resolvedValue = resolvedValue; ++ } ++ @Override ++ public TemporalUnit getBaseUnit() { ++ throw new UnsupportedOperationException(); ++ } ++ @Override ++ public TemporalUnit getRangeUnit() { ++ throw new UnsupportedOperationException(); ++ } ++ @Override ++ public ValueRange range() { ++ throw new UnsupportedOperationException(); ++ } ++ @Override ++ public boolean isDateBased() { ++ throw new UnsupportedOperationException(); ++ } ++ @Override ++ public boolean isTimeBased() { ++ throw new UnsupportedOperationException(); ++ } ++ @Override ++ public boolean isSupportedBy(TemporalAccessor temporal) { ++ throw new UnsupportedOperationException(); ++ } ++ @Override ++ public ValueRange rangeRefinedBy(TemporalAccessor temporal) { ++ throw new UnsupportedOperationException(); ++ } ++ @Override ++ public long getFrom(TemporalAccessor temporal) { ++ throw new UnsupportedOperationException(); ++ } ++ @Override ++ public R adjustInto(R temporal, long newValue) { ++ throw new UnsupportedOperationException(); ++ } ++ @Override ++ public TemporalAccessor resolve( ++ Map fieldValues, TemporalAccessor partialTemporal, ResolverStyle resolverStyle) { ++ fieldValues.remove(this); ++ return resolvedValue; ++ } ++ }; ++ ++ //------------------------------------------------------------------------- ++ // 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); ++ } ++ + } +--- ./jdk/test/java/time/test/java/time/format/TestDateTimeParsing.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/time/test/java/time/format/TestDateTimeParsing.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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); ++ } ++ ++} +--- ./jdk/test/java/time/test/java/time/format/TestReducedParser.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/time/test/java/time/format/TestReducedParser.java Wed Jul 30 18:42:59 2014 +0100 +@@ -356,7 +356,7 @@ + {"yyMMdd", "200703", STRICT, 0, 6, 2020, 7, 3}, + {"ddMMyy", "230714", LENIENT, 0, 6, 2014, 7, 23}, + {"ddMMyy", "230714", STRICT, 0, 6, 2014, 7, 23}, +- {"ddMMyy", "25062001", LENIENT, 0, 8, 2001, 20, 2506}, ++ {"ddMMyy", "25062001", LENIENT, 0, 8, 2001, 6, 25}, + {"ddMMyy", "25062001", STRICT, 0, 6, 2020, 6, 25}, + {"ddMMy", "27052002", LENIENT, 0, 8, 2002, 5, 27}, + {"ddMMy", "27052002", STRICT, 0, 8, 2002, 5, 27}, +--- ./jdk/test/java/time/test/java/time/temporal/TestIsoWeekFields.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/time/test/java/time/temporal/TestIsoWeekFields.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,280 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package test.java.time.temporal; ++ ++import static java.time.temporal.ChronoField.DAY_OF_WEEK; ++import static org.testng.Assert.assertEquals; ++ ++import java.time.LocalDate; ++import java.time.LocalTime; ++import java.time.MonthDay; ++import java.time.OffsetDateTime; ++import java.time.Year; ++import java.time.chrono.ThaiBuddhistDate; ++import java.time.temporal.ChronoUnit; ++import java.time.temporal.IsoFields; ++import java.time.temporal.TemporalField; ++import java.time.temporal.ValueRange; ++import java.time.temporal.WeekFields; ++ ++import org.testng.annotations.DataProvider; ++import org.testng.annotations.Test; ++ ++/** ++ * Test. ++ */ ++@Test ++public class TestIsoWeekFields { ++ ++ @DataProvider(name = "fields") ++ Object[][] data_Fields() { ++ return new Object[][] { ++ {IsoFields.WEEK_OF_WEEK_BASED_YEAR, IsoFields.WEEK_BASED_YEAR}, ++ {WeekFields.ISO.weekOfWeekBasedYear(), WeekFields.ISO.weekBasedYear()}, ++ }; ++ } ++ ++ //----------------------------------------------------------------------- ++ // WEEK_OF_WEEK_BASED_YEAR ++ //----------------------------------------------------------------------- ++ @Test(dataProvider = "fields") ++ public void test_WOWBY_basics(TemporalField weekField, TemporalField yearField) { ++ assertEquals(weekField.isDateBased(), true); ++ assertEquals(weekField.isTimeBased(), false); ++ assertEquals(weekField.getBaseUnit(), ChronoUnit.WEEKS); ++ assertEquals(weekField.getRangeUnit(), IsoFields.WEEK_BASED_YEARS); ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_WOWBY_isSupportedBy(TemporalField weekField, TemporalField yearField) { ++ assertEquals(weekField.isSupportedBy(LocalTime.NOON), false); ++ assertEquals(weekField.isSupportedBy(MonthDay.of(2, 1)), false); ++ assertEquals(weekField.isSupportedBy(LocalDate.MIN), true); ++ assertEquals(weekField.isSupportedBy(OffsetDateTime.MAX), true); ++ } ++ ++ @Test ++ public void test_WOWBY_isSupportedBy_fieldsDiffer() { ++ assertEquals(IsoFields.WEEK_OF_WEEK_BASED_YEAR.isSupportedBy(ThaiBuddhistDate.now()), false); ++ assertEquals(WeekFields.ISO.weekOfWeekBasedYear().isSupportedBy(ThaiBuddhistDate.now()), true); ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_WOWBY_range(TemporalField weekField, TemporalField yearField) { ++ assertEquals(weekField.range(), ValueRange.of(1, 52, 53)); ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_WOWBY_rangeRefinedBy(TemporalField weekField, TemporalField yearField) { ++ assertEquals(weekField.rangeRefinedBy(LocalDate.of(2012, 12, 31)), ValueRange.of(1, 52)); ++ assertEquals(weekField.rangeRefinedBy(LocalDate.of(2013, 12, 29)), ValueRange.of(1, 52)); ++ assertEquals(weekField.rangeRefinedBy(LocalDate.of(2013, 12, 30)), ValueRange.of(1, 52)); ++ assertEquals(weekField.rangeRefinedBy(LocalDate.of(2014, 12, 28)), ValueRange.of(1, 52)); ++ assertEquals(weekField.rangeRefinedBy(LocalDate.of(2014, 12, 29)), ValueRange.of(1, 53)); ++ assertEquals(weekField.rangeRefinedBy(LocalDate.of(2016, 1, 3)), ValueRange.of(1, 53)); ++ assertEquals(weekField.rangeRefinedBy(LocalDate.of(2016, 1, 4)), ValueRange.of(1, 52)); ++ } ++ ++ //----------------------------------------------------------------------- ++ // WEEK_BASED_YEAR ++ //----------------------------------------------------------------------- ++ @Test(dataProvider = "fields") ++ public void test_WBY_basics(TemporalField weekField, TemporalField yearField) { ++ assertEquals(yearField.isDateBased(), true); ++ assertEquals(yearField.isTimeBased(), false); ++ assertEquals(yearField.getBaseUnit(), IsoFields.WEEK_BASED_YEARS); ++ assertEquals(yearField.getRangeUnit(), ChronoUnit.FOREVER); ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_WBY_isSupportedBy(TemporalField weekField, TemporalField yearField) { ++ assertEquals(yearField.isSupportedBy(LocalTime.NOON), false); ++ assertEquals(yearField.isSupportedBy(MonthDay.of(2, 1)), false); ++ assertEquals(yearField.isSupportedBy(LocalDate.MIN), true); ++ assertEquals(yearField.isSupportedBy(OffsetDateTime.MAX), true); ++ } ++ ++ @Test ++ public void test_WBY_isSupportedBy_ISO() { ++ assertEquals(IsoFields.WEEK_BASED_YEAR.isSupportedBy(ThaiBuddhistDate.now()), false); ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_WBY_range(TemporalField weekField, TemporalField yearField) { ++ assertEquals(yearField.range(), ValueRange.of(Year.MIN_VALUE, Year.MAX_VALUE)); ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_WBY_rangeRefinedBy(TemporalField weekField, TemporalField yearField) { ++ assertEquals(yearField.rangeRefinedBy(LocalDate.of(2012, 12, 31)), ValueRange.of(Year.MIN_VALUE, Year.MAX_VALUE)); ++ } ++ ++ //----------------------------------------------------------------------- ++ @Test(dataProvider = "fields") ++ public void test_getFrom(TemporalField weekField, TemporalField yearField) { ++ // tests every day from 2011 to 2016 inclusive ++ LocalDate date = LocalDate.of(2011, 1, 3); ++ int wby = 2011; ++ int week = 1; ++ int dow = 1; ++ for (int i = 1; i <= ((52 + 52 + 52 + 52 + 53 + 52) * 7); i++) { ++ assertEquals(yearField.getFrom(date), wby); ++ assertEquals(weekField.getFrom(date), week); ++ assertEquals(DAY_OF_WEEK.getFrom(date), dow); ++ if (dow == 7) { ++ dow = 1; ++ week++; ++ } else { ++ dow++; ++ } ++ if (week > wbyLen(wby)) { ++ week = 1; ++ wby++; ++ } ++ date = date.plusDays(1); ++ } ++ assertEquals(yearField.getFrom(date), 2017); ++ assertEquals(weekField.getFrom(date), 1); ++ assertEquals(DAY_OF_WEEK.getFrom(date), 1); ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_adjustInto_dow(TemporalField weekField, TemporalField yearField) { ++ // tests every day from 2012 to 2016 inclusive ++ LocalDate date = LocalDate.of(2012, 1, 2); ++ int wby = 2012; ++ int week = 1; ++ int dow = 1; ++ for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) { ++ for (int j = 1; j <= 7; j++) { ++ LocalDate adjusted = DAY_OF_WEEK.adjustInto(date, j); ++ assertEquals(adjusted.get(DAY_OF_WEEK), j); ++ assertEquals(adjusted.get(weekField), week); ++ assertEquals(adjusted.get(yearField), wby); ++ } ++ if (dow == 7) { ++ dow = 1; ++ week++; ++ } else { ++ dow++; ++ } ++ if (week > wbyLen(wby)) { ++ week = 1; ++ wby++; ++ } ++ date = date.plusDays(1); ++ } ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_adjustInto_week(TemporalField weekField, TemporalField yearField) { ++ // tests every day from 2012 to 2016 inclusive ++ LocalDate date = LocalDate.of(2012, 1, 2); ++ int wby = 2012; ++ int week = 1; ++ int dow = 1; ++ for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) { ++ int weeksInYear = (wby == 2015 ? 53 : 52); ++ for (int j = 1; j <= weeksInYear; j++) { ++ LocalDate adjusted = weekField.adjustInto(date, j); ++ assertEquals(adjusted.get(weekField), j); ++ assertEquals(adjusted.get(DAY_OF_WEEK), dow); ++ assertEquals(adjusted.get(yearField), wby); ++ } ++ if (dow == 7) { ++ dow = 1; ++ week++; ++ } else { ++ dow++; ++ } ++ if (week > wbyLen(wby)) { ++ week = 1; ++ wby++; ++ } ++ date = date.plusDays(1); ++ } ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_adjustInto_wby(TemporalField weekField, TemporalField yearField) { ++ // tests every day from 2012 to 2016 inclusive ++ LocalDate date = LocalDate.of(2012, 1, 2); ++ int wby = 2012; ++ int week = 1; ++ int dow = 1; ++ for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) { ++ for (int j = 2004; j <= 2015; j++) { ++ LocalDate adjusted = yearField.adjustInto(date, j); ++ assertEquals(adjusted.get(yearField), j); ++ assertEquals(adjusted.get(DAY_OF_WEEK), dow); ++ assertEquals(adjusted.get(weekField), (week == 53 && wbyLen(j) == 52 ? 52 : week), "" + date + " " + adjusted); ++ } ++ if (dow == 7) { ++ dow = 1; ++ week++; ++ } else { ++ dow++; ++ } ++ if (week > wbyLen(wby)) { ++ week = 1; ++ wby++; ++ } ++ date = date.plusDays(1); ++ } ++ } ++ ++ @Test(dataProvider = "fields") ++ public void test_addTo_weekBasedYears(TemporalField weekField, TemporalField yearField) { ++ // tests every day from 2012 to 2016 inclusive ++ LocalDate date = LocalDate.of(2012, 1, 2); ++ int wby = 2012; ++ int week = 1; ++ int dow = 1; ++ for (int i = 1; i <= ((52 + 52 + 52 + 53 + 52) * 7); i++) { ++ for (int j = -5; j <= 5; j++) { ++ LocalDate adjusted = IsoFields.WEEK_BASED_YEARS.addTo(date, j); ++ assertEquals(adjusted.get(yearField), wby + j); ++ assertEquals(adjusted.get(DAY_OF_WEEK), dow); ++ assertEquals(adjusted.get(weekField), (week == 53 && wbyLen(wby + j) == 52 ? 52 : week), "" + date + " " + adjusted); ++ } ++ if (dow == 7) { ++ dow = 1; ++ week++; ++ } else { ++ dow++; ++ } ++ if (week > wbyLen(wby)) { ++ week = 1; ++ wby++; ++ } ++ date = date.plusDays(1); ++ } ++ } ++ ++ private int wbyLen(int wby) { ++ return (wby == 2004 || wby == 2009 || wby == 2015 || wby == 2020 ? 53 : 52); ++ } ++ ++} +--- ./jdk/test/java/util/Arrays/StreamAndSpliterator.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/util/Arrays/StreamAndSpliterator.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,148 @@ ++/* ++ * 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 8037857 ++ * @summary tests for stream and spliterator factory methods ++ * @run testng StreamAndSpliterator ++ */ ++ ++import org.testng.annotations.Test; ++ ++import java.util.Arrays; ++import java.util.Spliterators; ++ ++import static org.testng.Assert.assertNotNull; ++ ++public class StreamAndSpliterator { ++ @Test ++ public void testStreamNPEs() { ++ assertThrowsNPE(() -> Arrays.stream((int[]) null, 0, 0)); ++ assertThrowsNPE(() -> Arrays.stream((long[]) null, 0, 0)); ++ assertThrowsNPE(() -> Arrays.stream((double[]) null, 0, 0)); ++ assertThrowsNPE(() -> Arrays.stream((String[]) null, 0, 0)); ++ } ++ ++ @Test ++ public void testStreamAIOBEs() { ++ // origin > fence ++ assertThrowsAIOOB(() -> Arrays.stream(new int[]{}, 1, 0)); ++ assertThrowsAIOOB(() -> Arrays.stream(new long[]{}, 1, 0)); ++ assertThrowsAIOOB(() -> Arrays.stream(new double[]{}, 1, 0)); ++ assertThrowsAIOOB(() -> Arrays.stream(new String[]{}, 1, 0)); ++ ++ // bad origin ++ assertThrowsAIOOB(() -> Arrays.stream(new int[]{}, -1, 0)); ++ assertThrowsAIOOB(() -> Arrays.stream(new long[]{}, -1, 0)); ++ assertThrowsAIOOB(() -> Arrays.stream(new double[]{}, -1, 0)); ++ assertThrowsAIOOB(() -> Arrays.stream(new String[]{}, -1, 0)); ++ ++ // bad fence ++ assertThrowsAIOOB(() -> Arrays.stream(new int[]{}, 0, 1)); ++ assertThrowsAIOOB(() -> Arrays.stream(new long[]{}, 0, 1)); ++ assertThrowsAIOOB(() -> Arrays.stream(new double[]{}, 0, 1)); ++ assertThrowsAIOOB(() -> Arrays.stream(new String[]{}, 0, 1)); ++ } ++ ++ ++ @Test ++ public void testSpliteratorNPEs() { ++ assertThrowsNPE(() -> Arrays.spliterator((int[]) null, 0, 0)); ++ assertThrowsNPE(() -> Arrays.spliterator((long[]) null, 0, 0)); ++ assertThrowsNPE(() -> Arrays.spliterator((double[]) null, 0, 0)); ++ assertThrowsNPE(() -> Arrays.spliterator((String[]) null, 0, 0)); ++ } ++ ++ @Test ++ public void testSpliteratorAIOBEs() { ++ // origin > fence ++ assertThrowsAIOOB(() -> Arrays.spliterator(new int[]{}, 1, 0)); ++ assertThrowsAIOOB(() -> Arrays.spliterator(new long[]{}, 1, 0)); ++ assertThrowsAIOOB(() -> Arrays.spliterator(new double[]{}, 1, 0)); ++ assertThrowsAIOOB(() -> Arrays.spliterator(new String[]{}, 1, 0)); ++ ++ // bad origin ++ assertThrowsAIOOB(() -> Arrays.spliterator(new int[]{}, -1, 0)); ++ assertThrowsAIOOB(() -> Arrays.spliterator(new long[]{}, -1, 0)); ++ assertThrowsAIOOB(() -> Arrays.spliterator(new double[]{}, -1, 0)); ++ assertThrowsAIOOB(() -> Arrays.spliterator(new String[]{}, -1, 0)); ++ ++ // bad fence ++ assertThrowsAIOOB(() -> Arrays.spliterator(new int[]{}, 0, 1)); ++ assertThrowsAIOOB(() -> Arrays.spliterator(new long[]{}, 0, 1)); ++ assertThrowsAIOOB(() -> Arrays.spliterator(new double[]{}, 0, 1)); ++ assertThrowsAIOOB(() -> Arrays.spliterator(new String[]{}, 0, 1)); ++ } ++ ++ ++ @Test ++ public void testSpliteratorNPEsFromSpliterators() { ++ assertThrowsNPE(() -> Spliterators.spliterator((int[]) null, 0, 0, 0)); ++ assertThrowsNPE(() -> Spliterators.spliterator((long[]) null, 0, 0, 0)); ++ assertThrowsNPE(() -> Spliterators.spliterator((double[]) null, 0, 0, 0)); ++ assertThrowsNPE(() -> Spliterators.spliterator((String[]) null, 0, 0, 0)); ++ } ++ ++ @Test ++ public void testSpliteratorAIOBEsFromSpliterators() { ++ // origin > fence ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new int[]{}, 1, 0, 0)); ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new long[]{}, 1, 0, 0)); ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new double[]{}, 1, 0, 0)); ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new String[]{}, 1, 0, 0)); ++ ++ // bad origin ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new int[]{}, -1, 0, 0)); ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new long[]{}, -1, 0, 0)); ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new double[]{}, -1, 0, 0)); ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new String[]{}, -1, 0, 0)); ++ ++ // bad fence ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new int[]{}, 0, 1, 0)); ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new long[]{}, 0, 1, 0)); ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new double[]{}, 0, 1, 0)); ++ assertThrowsAIOOB(() -> Spliterators.spliterator(new String[]{}, 0, 1, 0)); ++ } ++ ++ void assertThrowsNPE(Runnable r) { ++ NullPointerException caught = null; ++ try { ++ r.run(); ++ } ++ catch (NullPointerException e) { ++ caught = e; ++ } ++ assertNotNull(caught, "NullPointerException not thrown"); ++ } ++ ++ void assertThrowsAIOOB(Runnable r) { ++ ArrayIndexOutOfBoundsException caught = null; ++ try { ++ r.run(); ++ } ++ catch (ArrayIndexOutOfBoundsException e) { ++ caught = e; ++ } ++ assertNotNull(caught, "ArrayIndexOutOfBoundsException not thrown"); ++ } ++} +--- ./jdk/test/java/util/Collection/CollectionDefaults.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/Collection/CollectionDefaults.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -21,6 +21,7 @@ + * questions. + */ + ++import java.util.Arrays; + import java.util.Collection; + import java.util.Collections; + import java.util.HashMap; +@@ -44,8 +45,8 @@ + import java.util.TreeSet; + import java.util.concurrent.ConcurrentHashMap; + import java.util.concurrent.ConcurrentSkipListMap; ++import java.util.function.Function; + import java.util.function.Predicate; +-import java.util.function.Supplier; + + /** + * @test +@@ -59,26 +60,25 @@ + public static final Predicate pEven = x -> 0 == x % 2; + public static final Predicate pOdd = x -> 1 == x % 2; + +- @SuppressWarnings("unchecked") +- private static final Supplier[] TEST_CLASSES = { +- // Collection +- ExtendsAbstractCollection::new, ++ private static final List, Collection>> TEST_SUPPLIERS = Arrays.asList( ++ // Collection ++ ExtendsAbstractCollection::new, + +- // Lists +- java.util.ArrayList::new, +- java.util.LinkedList::new, +- java.util.Vector::new, +- java.util.concurrent.CopyOnWriteArrayList::new, +- ExtendsAbstractList::new, ++ // Lists ++ java.util.ArrayList::new, ++ java.util.LinkedList::new, ++ java.util.Vector::new, ++ java.util.concurrent.CopyOnWriteArrayList::new, ++ ExtendsAbstractList::new, + +- // Sets +- java.util.HashSet::new, +- java.util.LinkedHashSet::new, +- java.util.TreeSet::new, +- java.util.concurrent.ConcurrentSkipListSet::new, +- java.util.concurrent.CopyOnWriteArraySet::new, +- ExtendsAbstractSet::new +- }; ++ // Sets ++ java.util.HashSet::new, ++ java.util.LinkedHashSet::new, ++ java.util.TreeSet::new, ++ java.util.concurrent.ConcurrentSkipListSet::new, ++ java.util.concurrent.CopyOnWriteArraySet::new, ++ ExtendsAbstractSet::new ++ ); + + private static final int SIZE = 100; + +@@ -94,7 +94,7 @@ + cases.add(new Object[] { new ExtendsAbstractSet<>() }); + + cases.add(new Object[] { Collections.newSetFromMap(new HashMap<>()) }); +- cases.add(new Object[] { Collections.newSetFromMap(new LinkedHashMap()) }); ++ cases.add(new Object[] { Collections.newSetFromMap(new LinkedHashMap<>()) }); + cases.add(new Object[] { Collections.newSetFromMap(new TreeMap<>()) }); + cases.add(new Object[] { Collections.newSetFromMap(new ConcurrentHashMap<>()) }); + cases.add(new Object[] { Collections.newSetFromMap(new ConcurrentSkipListMap<>()) }); +@@ -107,24 +107,23 @@ + } + + @Test(dataProvider = "setProvider") +- public void testProvidedWithNull(final Set set) throws Exception { ++ public void testProvidedWithNull(final Set set) { + try { + set.forEach(null); + fail("expected NPE not thrown"); +- } catch (NullPointerException expected) { +- ; // expected +- } ++ } catch (NullPointerException expected) { // expected ++ } + try { + set.removeIf(null); + fail("expected NPE not thrown"); +- } catch (NullPointerException expected) { +- ; // expected ++ } catch (NullPointerException expected) { // expected + } + } + + @Test +- public void testForEach() throws Exception { +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[]) TEST_CLASSES, SIZE); ++ public void testForEach() { ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(TEST_SUPPLIERS, SIZE); + + for (final CollectionSupplier.TestCase> test : supplier.get()) { + final Collection original = test.expected; +@@ -133,8 +132,7 @@ + try { + set.forEach(null); + fail("expected NPE not thrown"); +- } catch (NullPointerException expected) { +- ; // expected ++ } catch (NullPointerException expected) { // expected + } + if (set instanceof Set && !((set instanceof SortedSet) || (set instanceof LinkedHashSet))) { + CollectionAsserts.assertContentsUnordered(set, original, test.toString()); +@@ -155,8 +153,9 @@ + } + + @Test +- public void testRemoveIf() throws Exception { +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[]) TEST_CLASSES, SIZE); ++ public void testRemoveIf() { ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(TEST_SUPPLIERS, SIZE); + for (final CollectionSupplier.TestCase> test : supplier.get()) { + final Collection original = test.expected; + final Collection set = test.collection; +@@ -164,8 +163,7 @@ + try { + set.removeIf(null); + fail("expected NPE not thrown"); +- } catch (NullPointerException expected) { +- ; // expected ++ } catch (NullPointerException expected) { // expected + } + if (set instanceof Set && !((set instanceof SortedSet) || (set instanceof LinkedHashSet))) { + CollectionAsserts.assertContentsUnordered(set, original, test.toString()); +--- ./jdk/test/java/util/Collection/testlibrary/CollectionSupplier.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/Collection/testlibrary/CollectionSupplier.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -25,6 +25,7 @@ + import java.lang.Integer; + import java.lang.Iterable; + import java.lang.Override; ++import java.util.ArrayList; + import java.util.Arrays; + import java.util.LinkedList; + import java.util.List; +@@ -36,6 +37,7 @@ + + import java.util.Collection; + import java.util.Collections; ++import java.util.function.Function; + import java.util.function.Supplier; + + /** +@@ -44,20 +46,24 @@ + */ + public final class CollectionSupplier> implements Supplier>> { + +- private final Supplier[] classes; ++ private final List, C>> suppliers; + private final int size; + + /** + * A Collection test case. + */ + public static final class TestCase> { +- + /** + * The name of the test case. + */ + public final String name; + + /** ++ * The supplier of a collection ++ */ ++ public Function, C> supplier; ++ ++ /** + * Unmodifiable reference collection, useful for comparisons. + */ + public final List expected; +@@ -71,11 +77,11 @@ + * Create a Collection test case. + * + * @param name name of the test case +- * @param expected reference collection + * @param collection the modifiable test collection + */ +- public TestCase(String name, C collection) { ++ public TestCase(String name, Function, C> supplier, C collection) { + this.name = name; ++ this.supplier = supplier; + this.expected = Collections.unmodifiableList( + Arrays.asList(collection.toArray(new Integer[0]))); + this.collection = collection; +@@ -107,54 +113,52 @@ + } + + /** +- * Create a {@code Supplier} that creates instances of specified collection +- * classes of specified length. ++ * Create a {@code CollectionSupplier} that creates instances of specified ++ * collection suppliers of the specified size. + * +- * @param classNames class names that implement {@code Collection} ++ * @param suppliers the suppliers names that supply {@code Collection} ++ * instances + * @param size the desired size of each collection + */ +- public CollectionSupplier(Supplier[] classes, int size) { +- this.classes = Arrays.copyOf(classes, classes.length); ++ public CollectionSupplier(List, C>> suppliers, int size) { ++ this.suppliers = suppliers; + this.size = size; + } + + @Override + public Iterable> get() { + final Collection> cases = new LinkedList<>(); +- for (final Supplier type : classes) { ++ for (final Function, C> supplier : suppliers) + try { +- final Collection empty = type.get(); +- cases.add(new TestCase("empty", empty)); ++ cases.add(new TestCase<>("empty", supplier, supplier.apply(Collections.emptyList()))); + +- final Collection single = type.get(); +- single.add(42); +- cases.add(new TestCase("single", single)); ++ cases.add(new TestCase<>("single", supplier, supplier.apply(Arrays.asList(42)))); + +- final Collection regular = type.get(); ++ final Collection regular = new ArrayList<>(); + for (int i = 0; i < size; i++) { + regular.add(i); + } +- cases.add(new TestCase("regular", regular)); ++ cases.add(new TestCase<>("regular", supplier, supplier.apply(regular))); + +- final Collection reverse = type.get(); ++ final Collection reverse = new ArrayList<>(); + for (int i = size; i >= 0; i--) { + reverse.add(i); + } +- cases.add(new TestCase("reverse", reverse)); ++ cases.add(new TestCase<>("reverse", supplier, supplier.apply(reverse))); + +- final Collection odds = type.get(); ++ final Collection odds = new ArrayList<>(); + for (int i = 0; i < size; i++) { + odds.add((i * 2) + 1); + } +- cases.add(new TestCase("odds", odds)); ++ cases.add(new TestCase<>("odds", supplier, supplier.apply(odds))); + +- final Collection evens = type.get(); ++ final Collection evens = new ArrayList<>(); + for (int i = 0; i < size; i++) { + evens.add(i * 2); + } +- cases.add(new TestCase("evens", evens)); ++ cases.add(new TestCase<>("evens", supplier, supplier.apply(evens))); + +- final Collection fibonacci = type.get(); ++ final Collection fibonacci = new ArrayList<>(); + int prev2 = 0; + int prev1 = 1; + for (int i = 0; i < size; i++) { +@@ -166,58 +170,62 @@ + prev2 = prev1; + prev1 = n; + } +- cases.add(new TestCase("fibonacci", fibonacci)); ++ cases.add(new TestCase<>("fibonacci", supplier, supplier.apply(fibonacci))); + +- // variants where the size of the backing storage != reported size ++ ++ boolean isStructurallyModifiable = false; ++ try { ++ C t = supplier.apply(Collections.emptyList()); ++ t.add(1); ++ isStructurallyModifiable = true; ++ } catch (UnsupportedOperationException e) { } ++ ++ if (!isStructurallyModifiable) ++ continue; ++ ++ ++ // variants where the size of the backing storage != reported size + // created by removing half of the elements +- final Collection emptyWithSlack = type.get(); ++ final C emptyWithSlack = supplier.apply(Collections.emptyList()); + emptyWithSlack.add(42); + assertTrue(emptyWithSlack.remove(42)); +- cases.add(new TestCase("emptyWithSlack", emptyWithSlack)); ++ cases.add(new TestCase<>("emptyWithSlack", supplier, emptyWithSlack)); + +- final Collection singleWithSlack = type.get(); ++ final C singleWithSlack = supplier.apply(Collections.emptyList()); + singleWithSlack.add(42); + singleWithSlack.add(43); + assertTrue(singleWithSlack.remove(43)); +- cases.add(new TestCase("singleWithSlack", singleWithSlack)); ++ cases.add(new TestCase<>("singleWithSlack", supplier, singleWithSlack)); + +- final Collection regularWithSlack = type.get(); ++ final C regularWithSlack = supplier.apply(Collections.emptyList()); + for (int i = 0; i < (2 * size); i++) { + regularWithSlack.add(i); + } +- assertTrue(regularWithSlack.removeIf((x) -> { +- return x >= size; +- })); +- cases.add(new TestCase("regularWithSlack", regularWithSlack)); ++ assertTrue(regularWithSlack.removeIf(x -> x < size)); ++ cases.add(new TestCase<>("regularWithSlack", supplier, regularWithSlack)); + +- final Collection reverseWithSlack = type.get(); ++ final C reverseWithSlack = supplier.apply(Collections.emptyList()); + for (int i = 2 * size; i >= 0; i--) { + reverseWithSlack.add(i); + } +- assertTrue(reverseWithSlack.removeIf((x) -> { +- return x < size; +- })); +- cases.add(new TestCase("reverseWithSlack", reverseWithSlack)); ++ assertTrue(reverseWithSlack.removeIf(x -> x < size)); ++ cases.add(new TestCase<>("reverseWithSlack", supplier, reverseWithSlack)); + +- final Collection oddsWithSlack = type.get(); ++ final C oddsWithSlack = supplier.apply(Collections.emptyList()); + for (int i = 0; i < 2 * size; i++) { + oddsWithSlack.add((i * 2) + 1); + } +- assertTrue(oddsWithSlack.removeIf((x) -> { +- return x >= size; +- })); +- cases.add(new TestCase("oddsWithSlack", oddsWithSlack)); ++ assertTrue(oddsWithSlack.removeIf(x -> x >= size)); ++ cases.add(new TestCase<>("oddsWithSlack", supplier, oddsWithSlack)); + +- final Collection evensWithSlack = type.get(); ++ final C evensWithSlack = supplier.apply(Collections.emptyList()); + for (int i = 0; i < 2 * size; i++) { + evensWithSlack.add(i * 2); + } +- assertTrue(evensWithSlack.removeIf((x) -> { +- return x >= size; +- })); +- cases.add(new TestCase("evensWithSlack", evensWithSlack)); ++ assertTrue(evensWithSlack.removeIf(x -> x >= size)); ++ cases.add(new TestCase<>("evensWithSlack", supplier, evensWithSlack)); + +- final Collection fibonacciWithSlack = type.get(); ++ final C fibonacciWithSlack = supplier.apply(Collections.emptyList()); + prev2 = 0; + prev1 = 1; + for (int i = 0; i < size; i++) { +@@ -229,15 +237,12 @@ + prev2 = prev1; + prev1 = n; + } +- assertTrue(fibonacciWithSlack.removeIf((x) -> { +- return x < 20; +- })); +- cases.add(new TestCase("fibonacciWithSlack", +- fibonacciWithSlack)); +- } catch (Exception failed) { ++ assertTrue(fibonacciWithSlack.removeIf(x -> x < 20)); ++ cases.add(new TestCase<>("fibonacciWithSlack", supplier, fibonacciWithSlack)); ++ } ++ catch (Exception failed) { + throw new TestException(failed); + } +- } + + return cases; + } +--- ./jdk/test/java/util/Collections/CheckedListReplaceAll.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/util/Collections/CheckedListReplaceAll.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,61 @@ ++/* ++ * 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 8047795 8053938 ++ * @summary Ensure that replaceAll operator cannot add bad elements ++ * @author Mike Duigou ++ */ ++ ++import java.util.*; ++import java.util.function.UnaryOperator; ++ ++public class CheckedListReplaceAll { ++ public static void main(String[] args) { ++ List unwrapped = Arrays.asList(new Object[]{1, 2, 3}); ++ List wrapped = Collections.checkedList(unwrapped, Integer.class); ++ ++ UnaryOperator evil = e -> (((int) e) % 2 != 0) ? e : "evil"; ++ ++ try { ++ wrapped.replaceAll(evil); ++ System.out.printf("Bwahaha! I have defeated you! %s\n", wrapped); ++ throw new RuntimeException("String added to checked List"); ++ } catch (ClassCastException thwarted) { ++ thwarted.printStackTrace(System.out); ++ System.out.println("Curses! Foiled again!"); ++ } ++ ++ unwrapped = Arrays.asList(new Object[]{}); // Empty list ++ wrapped = Collections.checkedList(unwrapped, Integer.class); ++ try { ++ wrapped.replaceAll((UnaryOperator)null); ++ System.out.printf("Bwahaha! I have defeated you! %s\n", wrapped); ++ throw new RuntimeException("NPE not thrown when passed a null operator"); ++ } catch (NullPointerException thwarted) { ++ thwarted.printStackTrace(System.out); ++ System.out.println("Curses! Foiled again!"); ++ } ++ } ++} +--- ./jdk/test/java/util/Collections/CheckedMapReplaceAll.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/util/Collections/CheckedMapReplaceAll.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,54 @@ ++/* ++ * 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 8047795 ++ * @summary Ensure that replaceAll operator cannot add bad elements ++ * @author Mike Duigou ++ */ ++ ++import java.util.*; ++import java.util.function.BiFunction; ++ ++public class CheckedMapReplaceAll { ++ public static void main(String[] args) { ++ Map unwrapped = new HashMap<>(); ++ unwrapped.put(1, 1.0); ++ unwrapped.put(2, 2.0); ++ unwrapped.put(3, 3.0); ++ ++ Map wrapped = Collections.checkedMap(unwrapped, Integer.class, Double.class); ++ ++ BiFunction evil = (k, v) -> (((int)k) % 2 != 0) ? v : "evil"; ++ ++ try { ++ wrapped.replaceAll(evil); ++ System.out.printf("Bwahaha! I have defeated you! %s\n", wrapped); ++ throw new RuntimeException("String added to checked Map"); ++ } catch (ClassCastException thwarted) { ++ thwarted.printStackTrace(System.out); ++ System.out.println("Curses! Foiled again!"); ++ } ++ } ++} +--- ./jdk/test/java/util/Currency/PropertiesTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/Currency/PropertiesTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -52,7 +52,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/java/util/HashMap/PutNullKey.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/util/HashMap/PutNullKey.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,90 @@ ++/* ++ * 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 8046085 ++ * @summary Ensure that when trees are being used for collisions that null key ++ * insertion still works. ++ */ ++ ++import java.util.*; ++import java.util.stream.IntStream; ++ ++public class PutNullKey { ++ ++ // Initial capacity of map ++ // Should be >= the map capacity for treeifying, see HashMap/ConcurrentMap.MIN_TREEIFY_CAPACITY ++ static final int INITIAL_CAPACITY = 64; ++ ++ // Maximum size of map ++ // Should be > the treeify threshold, see HashMap/ConcurrentMap.TREEIFY_THRESHOLD ++ static final int SIZE = 256; ++ ++ // Load factor of map ++ // A value 1.0 will ensure that a new threshold == capacity ++ static final float LOAD_FACTOR = 1.0f; ++ ++ public static class CollidingHash implements Comparable { ++ ++ private final int value; ++ ++ public CollidingHash(int value) { ++ this.value = value; ++ } ++ ++ @Override ++ public int hashCode() { ++ // intentionally bad hashcode. Force into first bin. ++ return 0; ++ } ++ ++ @Override ++ public boolean equals(Object o) { ++ if (null == o) { ++ return false; ++ } ++ ++ if (o.getClass() != CollidingHash.class) { ++ return false; ++ } ++ ++ return value == ((CollidingHash) o).value; ++ } ++ ++ @Override ++ public int compareTo(CollidingHash o) { ++ return value - o.value; ++ } ++ } ++ ++ public static void main(String[] args) throws Exception { ++ Map m = new HashMap<>(INITIAL_CAPACITY, LOAD_FACTOR); ++ IntStream.range(0, SIZE) ++ .mapToObj(CollidingHash::new) ++ .forEach(e -> { m.put(e, e); }); ++ ++ // kaboom? ++ m.put(null, null); ++ } ++} +--- ./jdk/test/java/util/List/ListDefaults.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/List/ListDefaults.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,6 +23,7 @@ + + import java.util.ArrayList; + import java.util.Arrays; ++import java.util.Collection; + import java.util.Collections; + import java.util.Comparator; + import java.util.List; +@@ -43,31 +44,45 @@ + + import java.lang.reflect.Constructor; + import java.util.ConcurrentModificationException; ++import java.util.function.Consumer; ++import java.util.function.Function; + import java.util.function.Predicate; + import java.util.function.Supplier; + + /** + * @test + * @summary Unit tests for extension methods on List +- * @bug 8023367 ++ * @bug 8023367 8037106 + * @library ../Collection/testlibrary + * @build CollectionAsserts CollectionSupplier ExtendsAbstractList + * @run testng ListDefaults + */ + public class ListDefaults { + +- private static final Supplier[] LIST_CLASSES = { +- java.util.ArrayList::new, +- java.util.LinkedList::new, +- java.util.Vector::new, +- java.util.concurrent.CopyOnWriteArrayList::new, +- ExtendsAbstractList::new +- }; ++ // Suppliers of lists that can support structural modifications ++ private static final List> LIST_STRUCT_MOD_SUPPLIERS = Arrays.asList( ++ java.util.ArrayList::new, ++ java.util.LinkedList::new, ++ java.util.Vector::new, ++ java.util.concurrent.CopyOnWriteArrayList::new, ++ ExtendsAbstractList::new ++ ); + +- private static final Supplier[] LIST_CME_CLASSES = { +- java.util.ArrayList::new, +- java.util.Vector::new +- }; ++ // Suppliers of lists that can support in place modifications ++ private static final List> LIST_SUPPLIERS = Arrays.asList( ++ java.util.ArrayList::new, ++ java.util.LinkedList::new, ++ java.util.Vector::new, ++ java.util.concurrent.CopyOnWriteArrayList::new, ++ ExtendsAbstractList::new, ++ c -> Arrays.asList(c.toArray()) ++ ); ++ ++ // Suppliers of lists supporting CMEs ++ private static final List> LIST_CME_SUPPLIERS = Arrays.asList( ++ java.util.ArrayList::new, ++ java.util.Vector::new ++ ); + + private static final Predicate pEven = x -> 0 == x % 2; + private static final Predicate pOdd = x -> 1 == x % 2; +@@ -83,17 +98,13 @@ + private static final int SUBLIST_TO = SIZE - 5; + private static final int SUBLIST_SIZE = SUBLIST_TO - SUBLIST_FROM; + +- private static interface Callback { +- void call(List list); +- } +- + // call the callback for each recursive subList +- private void trimmedSubList(final List list, final Callback callback) { ++ private void trimmedSubList(final List list, final Consumer> callback) { + int size = list.size(); + if (size > 1) { + // trim 1 element from both ends + final List subList = list.subList(1, size - 1); +- callback.call(subList); ++ callback.accept(subList); + trimmedSubList(subList, callback); + } + } +@@ -107,17 +118,21 @@ + cases.add(new Object[] { new Vector<>() }); + cases.add(new Object[] { new Stack<>() }); + cases.add(new Object[] { new CopyOnWriteArrayList<>() }); ++ cases.add(new Object[] { Arrays.asList() }); + +- cases.add(new Object[] { new ArrayList(){{add(42);}} }); +- cases.add(new Object[] { new LinkedList(){{add(42);}} }); +- cases.add(new Object[] { new Vector(){{add(42);}} }); +- cases.add(new Object[] { new Stack(){{add(42);}} }); +- cases.add(new Object[] { new CopyOnWriteArrayList(){{add(42);}} }); ++ List l = Arrays.asList(42); ++ cases.add(new Object[] { new ArrayList<>(l) }); ++ cases.add(new Object[] { new LinkedList<>(l) }); ++ cases.add(new Object[] { new Vector<>(l) }); ++ Stack s = new Stack<>(); s.addAll(l); ++ cases.add(new Object[]{s}); ++ cases.add(new Object[] { new CopyOnWriteArrayList<>(l) }); ++ cases.add(new Object[] { l }); + return cases.toArray(new Object[0][cases.size()]); + } + + @Test(dataProvider = "listProvider") +- public void testProvidedWithNull(final List list) throws Exception { ++ public void testProvidedWithNull(final List list) { + try { + list.forEach(null); + fail("expected NPE not thrown"); +@@ -138,11 +153,12 @@ + } + + @Test +- public void testForEach() throws Exception { +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[])LIST_CLASSES, SIZE); ++ public void testForEach() { ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(LIST_SUPPLIERS, SIZE); + for (final CollectionSupplier.TestCase> test : supplier.get()) { +- final List original = ((List) test.expected); +- final List list = ((List) test.collection); ++ final List original = test.expected; ++ final List list = test.collection; + + try { + list.forEach(null); +@@ -165,23 +181,21 @@ + } + } + +- trimmedSubList(list, new Callback() { +- @Override +- public void call(final List list) { +- final List actual = new LinkedList<>(); +- list.forEach(actual::add); +- CollectionAsserts.assertContents(actual, list); +- } +- }); ++ trimmedSubList(list, l -> { ++ final List a = new LinkedList<>(); ++ l.forEach(a::add); ++ CollectionAsserts.assertContents(a, l); ++ }); + } + } + + @Test +- public void testRemoveIf() throws Exception { +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[])LIST_CLASSES, SIZE); ++ public void testRemoveIf() { ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(LIST_STRUCT_MOD_SUPPLIERS, SIZE); + for (final CollectionSupplier.TestCase> test : supplier.get()) { +- final List original = ((List) test.expected); +- final List list = ((List) test.collection); ++ final List original = test.expected; ++ final List list = test.collection; + + try { + list.removeIf(null); +@@ -195,9 +209,9 @@ + } + } + +- for (final CollectionSupplier.TestCase test : supplier.get()) { +- final List original = ((List) test.expected); +- final List list = ((List) test.collection); ++ for (final CollectionSupplier.TestCase> test : supplier.get()) { ++ final List original = test.expected; ++ final List list = test.collection; + list.removeIf(pOdd); + for (int i : list) { + assertTrue((i % 2) == 0); +@@ -211,9 +225,9 @@ + assertTrue(list.isEmpty()); + } + +- for (final CollectionSupplier.TestCase test : supplier.get()) { +- final List original = ((List) test.expected); +- final List list = ((List) test.collection); ++ for (final CollectionSupplier.TestCase> test : supplier.get()) { ++ final List original = test.expected; ++ final List list = test.collection; + final List listCopy = new ArrayList<>(list); + if (original.size() > SUBLIST_SIZE) { + final List subList = list.subList(SUBLIST_FROM, SUBLIST_TO); +@@ -237,22 +251,19 @@ + } + } + +- for (final CollectionSupplier.TestCase test : supplier.get()) { +- final List list = ((List) test.collection); +- trimmedSubList(list, new Callback() { +- @Override +- public void call(final List list) { +- final List copy = new ArrayList<>(list); +- list.removeIf(pOdd); +- for (int i : list) { +- assertTrue((i % 2) == 0); +- } +- for (int i : copy) { +- if (i % 2 == 0) { +- assertTrue(list.contains(i)); +- } else { +- assertFalse(list.contains(i)); +- } ++ for (final CollectionSupplier.TestCase> test : supplier.get()) { ++ final List list = test.collection; ++ trimmedSubList(list, l -> { ++ final List copy = new ArrayList<>(l); ++ l.removeIf(pOdd); ++ for (int i : l) { ++ assertTrue((i % 2) == 0); ++ } ++ for (int i : copy) { ++ if (i % 2 == 0) { ++ assertTrue(l.contains(i)); ++ } else { ++ assertFalse(l.contains(i)); + } + } + }); +@@ -267,12 +278,13 @@ + } + + @Test +- public void testReplaceAll() throws Exception { ++ public void testReplaceAll() { + final int scale = 3; +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[])LIST_CLASSES, SIZE); ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(LIST_SUPPLIERS, SIZE); + for (final CollectionSupplier.TestCase> test : supplier.get()) { +- final List original = ((List) test.expected); +- final List list = ((List) test.collection); ++ final List original = test.expected; ++ final List list = test.collection; + + try { + list.replaceAll(null); +@@ -281,7 +293,7 @@ + CollectionAsserts.assertContents(list, original); + + list.replaceAll(x -> scale * x); +- for (int i=0; i < original.size(); i++) { ++ for (int i = 0; i < original.size(); i++) { + assertTrue(list.get(i) == (scale * original.get(i)), "mismatch at index " + i); + } + +@@ -306,28 +318,26 @@ + } + } + +- for (final CollectionSupplier.TestCase test : supplier.get()) { +- final List list = ((List) test.collection); +- trimmedSubList(list, new Callback() { +- @Override +- public void call(final List list) { +- final List copy = new ArrayList<>(list); +- final int offset = 5; +- list.replaceAll(x -> offset + x); +- for (int i=0; i < copy.size(); i++) { +- assertTrue(list.get(i) == (offset + copy.get(i)), "mismatch at index " + i); +- } ++ for (final CollectionSupplier.TestCase> test : supplier.get()) { ++ final List list = test.collection; ++ trimmedSubList(list, l -> { ++ final List copy = new ArrayList<>(l); ++ final int offset = 5; ++ l.replaceAll(x -> offset + x); ++ for (int i = 0; i < copy.size(); i++) { ++ assertTrue(l.get(i) == (offset + copy.get(i)), "mismatch at index " + i); + } + }); + } + } + + @Test +- public void testSort() throws Exception { +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[])LIST_CLASSES, SIZE); ++ public void testSort() { ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(LIST_SUPPLIERS, SIZE); + for (final CollectionSupplier.TestCase> test : supplier.get()) { +- final List original = ((List) test.expected); +- final List list = ((List) test.collection); ++ final List original = test.expected; ++ final List list = test.collection; + CollectionSupplier.shuffle(list); + list.sort(Integer::compare); + CollectionAsserts.assertSorted(list, Integer::compare); +@@ -338,23 +348,23 @@ + + CollectionSupplier.shuffle(list); + list.sort(null); +- CollectionAsserts.assertSorted(list, Comparator.naturalOrder()); ++ CollectionAsserts.assertSorted(list, Comparator.naturalOrder()); + if (test.name.startsWith("reverse")) { + Collections.reverse(list); + } + CollectionAsserts.assertContents(list, original); + + CollectionSupplier.shuffle(list); +- list.sort(Comparator.naturalOrder()); +- CollectionAsserts.assertSorted(list, Comparator.naturalOrder()); ++ list.sort(Comparator.naturalOrder()); ++ CollectionAsserts.assertSorted(list, Comparator.naturalOrder()); + if (test.name.startsWith("reverse")) { + Collections.reverse(list); + } + CollectionAsserts.assertContents(list, original); + + CollectionSupplier.shuffle(list); +- list.sort(Comparator.reverseOrder()); +- CollectionAsserts.assertSorted(list, Comparator.reverseOrder()); ++ list.sort(Comparator.reverseOrder()); ++ CollectionAsserts.assertSorted(list, Comparator.reverseOrder()); + if (!test.name.startsWith("reverse")) { + Collections.reverse(list); + } +@@ -365,32 +375,35 @@ + CollectionAsserts.assertSorted(list, BIT_COUNT_COMPARATOR); + // check sort by verifying that bitCount increases and never drops + int minBitCount = 0; +- int bitCount = 0; + for (final Integer i : list) { +- bitCount = Integer.bitCount(i); ++ int bitCount = Integer.bitCount(i); + assertTrue(bitCount >= minBitCount); + minBitCount = bitCount; + } + ++ // Resuse the supplier to store AtomicInteger instead of Integer ++ // Hence the use of raw type and cast ++ List incomparablesData = new ArrayList<>(); ++ for (int i = 0; i < test.expected.size(); i++) { ++ incomparablesData.add(new AtomicInteger(i)); ++ } ++ Function f = test.supplier; + @SuppressWarnings("unchecked") +- final Constructor> defaultConstructor = ((Class>)test.collection.getClass()).getConstructor(); +- final List incomparables = (List) defaultConstructor.newInstance(); ++ List incomparables = (List) f.apply(incomparablesData); + +- for (int i=0; i < test.expected.size(); i++) { +- incomparables.add(new AtomicInteger(i)); +- } + CollectionSupplier.shuffle(incomparables); + incomparables.sort(ATOMIC_INTEGER_COMPARATOR); +- for (int i=0; i < test.expected.size(); i++) { ++ for (int i = 0; i < test.expected.size(); i++) { + assertEquals(i, incomparables.get(i).intValue()); + } + ++ + if (original.size() > SUBLIST_SIZE) { + final List copy = new ArrayList<>(list); + final List subList = list.subList(SUBLIST_FROM, SUBLIST_TO); + CollectionSupplier.shuffle(subList); +- subList.sort(Comparator.naturalOrder()); +- CollectionAsserts.assertSorted(subList, Comparator.naturalOrder()); ++ subList.sort(Comparator.naturalOrder()); ++ CollectionAsserts.assertSorted(subList, Comparator.naturalOrder()); + // verify that elements [0, from) remain unmodified + for (int i = 0; i < SUBLIST_FROM; i++) { + assertTrue(list.get(i) == copy.get(i), +@@ -404,25 +417,22 @@ + } + } + +- for (final CollectionSupplier.TestCase test : supplier.get()) { +- final List list = ((List) test.collection); +- trimmedSubList(list, new Callback() { +- @Override +- public void call(final List list) { +- final List copy = new ArrayList<>(list); +- CollectionSupplier.shuffle(list); +- list.sort(Comparator.naturalOrder()); +- CollectionAsserts.assertSorted(list, Comparator.naturalOrder()); +- } ++ for (final CollectionSupplier.TestCase> test : supplier.get()) { ++ final List list = test.collection; ++ trimmedSubList(list, l -> { ++ CollectionSupplier.shuffle(l); ++ l.sort(Comparator.naturalOrder()); ++ CollectionAsserts.assertSorted(l, Comparator.naturalOrder()); + }); + } + } + + @Test +- public void testForEachThrowsCME() throws Exception { +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[])LIST_CME_CLASSES, SIZE); ++ public void testForEachThrowsCME() { ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(LIST_CME_SUPPLIERS, SIZE); + for (final CollectionSupplier.TestCase> test : supplier.get()) { +- final List list = ((List) test.collection); ++ final List list = test.collection; + + if (list.size() <= 1) { + continue; +@@ -430,7 +440,7 @@ + boolean gotException = false; + try { + // bad predicate that modifies its list, should throw CME +- list.forEach((x) -> {list.add(x);}); ++ list.forEach(list::add); + } catch (ConcurrentModificationException cme) { + gotException = true; + } +@@ -441,11 +451,11 @@ + } + + @Test +- public void testRemoveIfThrowsCME() throws Exception { +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[])LIST_CME_CLASSES, SIZE); ++ public void testRemoveIfThrowsCME() { ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(LIST_CME_SUPPLIERS, SIZE); + for (final CollectionSupplier.TestCase> test : supplier.get()) { +- final List original = ((List) test.expected); +- final List list = ((List) test.collection); ++ final List list = test.collection; + + if (list.size() <= 1) { + continue; +@@ -453,7 +463,7 @@ + boolean gotException = false; + try { + // bad predicate that modifies its list, should throw CME +- list.removeIf((x) -> {return list.add(x);}); ++ list.removeIf(list::add); + } catch (ConcurrentModificationException cme) { + gotException = true; + } +@@ -464,10 +474,11 @@ + } + + @Test +- public void testReplaceAllThrowsCME() throws Exception { +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[])LIST_CME_CLASSES, SIZE); ++ public void testReplaceAllThrowsCME() { ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(LIST_CME_SUPPLIERS, SIZE); + for (final CollectionSupplier.TestCase> test : supplier.get()) { +- final List list = ((List) test.collection); ++ final List list = test.collection; + + if (list.size() <= 1) { + continue; +@@ -486,10 +497,11 @@ + } + + @Test +- public void testSortThrowsCME() throws Exception { +- final CollectionSupplier> supplier = new CollectionSupplier((Supplier>[])LIST_CME_CLASSES, SIZE); ++ public void testSortThrowsCME() { ++ @SuppressWarnings("unchecked") ++ final CollectionSupplier> supplier = new CollectionSupplier(LIST_CME_SUPPLIERS, SIZE); + for (final CollectionSupplier.TestCase> test : supplier.get()) { +- final List list = ((List) test.collection); ++ final List list = test.collection; + + if (list.size() <= 1) { + continue; +@@ -523,7 +535,7 @@ + } + + @Test(dataProvider = "shortIntListProvider") +- public void testRemoveIfFromSlice(final List list) throws Exception { ++ public void testRemoveIfFromSlice(final List list) { + final List sublist = list.subList(3, 6); + assertTrue(sublist.removeIf(x -> x == 4)); + CollectionAsserts.assertContents(list, SLICED_EXPECTED); +--- ./jdk/test/java/util/Locale/Bug7069824.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/Locale/Bug7069824.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. ++ * 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 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 7069824 ++ * @bug 7069824 8042360 + * @summary Verify implementation for Locale matching. + * @run main Bug7069824 + */ +@@ -91,6 +91,17 @@ + String range; + double weight; + ++ // Testcase for 8042360 ++ range = "en-Latn-1234567890"; ++ try { ++ lr = new LanguageRange(range); ++ error = true; ++ System.err.println(" IAE should be thrown for LanguageRange(" ++ + range + ")."); ++ } ++ catch (IllegalArgumentException ex) { ++ } ++ + range = null; + try { + lr = new LanguageRange(range); +--- ./jdk/test/java/util/Locale/LocaleCategory.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/Locale/LocaleCategory.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -52,7 +52,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | *BSD | Darwin ) ++ SunOS | Linux | *BSD | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/java/util/Locale/LocaleProviders.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/Locale/LocaleProviders.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -56,7 +56,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | *BSD | Darwin ) ++ SunOS | Linux | *BSD | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/java/util/PluggableLocale/ExecTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/PluggableLocale/ExecTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -62,7 +62,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/java/util/ResourceBundle/Bug6299235Test.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/ResourceBundle/Bug6299235Test.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -31,7 +31,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PATHSEP=":" + FILESEP="/" + ;; +--- ./jdk/test/java/util/ServiceLoader/basic.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/ServiceLoader/basic.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -43,7 +43,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Darwin ) ++ SunOS | Darwin | AIX ) + SEP=':' ;; + Linux ) + SEP=':' ;; +--- ./jdk/test/java/util/concurrent/CopyOnWriteArrayList/COWSubList.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/util/concurrent/CopyOnWriteArrayList/COWSubList.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8011645 ++ * @summary CopyOnWriteArrayList.COWSubList.subList does not validate range properly ++ */ ++import java.util.List; ++import java.util.concurrent.CopyOnWriteArrayList; ++ ++public class COWSubList { ++ public static void main(String[] args) { ++ List list = new CopyOnWriteArrayList<>(); ++ list.add("A"); ++ list.add("B"); ++ list.add("C"); ++ list.add("D"); ++ list.add("E"); ++ ++ expectThrow(() -> list.subList(-1, 5)); ++ expectThrow(() -> list.subList(0, 6)); ++ expectThrow(() -> list.subList(4, 3)); ++ expectThrow(() -> list.subList(0, 5).subList(-1, 5)); ++ expectThrow(() -> list.subList(0, 5).subList(0, 6)); ++ expectThrow(() -> list.subList(0, 5).subList(4, 3)); ++ } ++ ++ static void expectThrow(Runnable r) { ++ try { ++ r.run(); ++ throw new RuntimeException("Failed: expected IOOBE to be thrown"); ++ } catch (IndexOutOfBoundsException x) { ++ // ok, excpeted ++ } ++ } ++} ++ +--- ./jdk/test/java/util/logging/AnonLoggerWeakRefLeak.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/logging/AnonLoggerWeakRefLeak.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -83,9 +83,9 @@ + fi + + if [ "$status" != 0 ]; then +- echo "ERROR: 'jmap $jmap_option' is not supported so this test" +- echo "ERROR: cannot work reliably. Aborting!" +- exit 2 ++ echo "WARNING: 'jmap $jmap_option' is not supported on this platform" ++ echo "WARNING: so this test cannot work reliably. Aborting!" ++ exit 0 + fi + fi + +--- ./jdk/test/java/util/logging/Logger/setResourceBundle/TestSetResourceBundle.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/logging/Logger/setResourceBundle/TestSetResourceBundle.java Wed Jul 30 18:42:59 2014 +0100 +@@ -57,8 +57,8 @@ + * that was present in the last LogRecord instance published. + */ + static final class TestHandler extends Handler { +- ResourceBundle lastBundle = null; +- String lastBundleName = null; ++ volatile ResourceBundle lastBundle = null; ++ volatile String lastBundleName = null; + @Override + public void publish(LogRecord record) { + lastBundle = record.getResourceBundle(); +@@ -186,6 +186,8 @@ + + public static void test(String loggerName) throws Exception { + ++ System.out.println("Starting test for " + loggerName); ++ + final ResourceBundle bundle = ResourceBundle.getBundle(LIST_BUNDLE_NAME); + Logger foobar = Logger.getLogger(loggerName); + +@@ -235,16 +237,21 @@ + } + + // Create a child logger +- Logger foobaz = Logger.getLogger(loggerName + ".baz"); ++ final Logger foobaz = Logger.getLogger(loggerName + ".baz"); ++ ++ if (foobar != foobaz.getParent()) { ++ throw new RuntimeException("Unexpected parent: " + ++ foobaz.getParent() + " != " + foobar); ++ } + + // Check that the child logger does not have a bundle set locally + if (foobaz.getResourceBundle() != null) { + throw new RuntimeException("Unexpected bundle: " +- + foobar.getResourceBundle()); ++ + foobaz.getResourceBundle()); + } + if (foobaz.getResourceBundleName() != null) { + throw new RuntimeException("Unexpected bundle: " +- + foobar.getResourceBundleName()); ++ + foobaz.getResourceBundleName()); + } + + +@@ -258,39 +265,65 @@ + // checks that the message has been logged with the bundle + // inherited from the parent logger + if (!LIST_BUNDLE_NAME.equals(handler.lastBundleName)) { ++ debugLogger(foobaz, foobar, handler); + throw new RuntimeException("Unexpected bundle name: " + + handler.lastBundleName); + } + if (!bundle_fr.equals(handler.lastBundle)) { ++ debugLogger(foobaz, foobar, handler); + throw new RuntimeException("Unexpected bundle: " + + handler.lastBundle); + } + + // Check that we can get set a bundle on the child logger + // using Logger.getLogger. +- foobaz = Logger.getLogger(loggerName + ".baz", PROPERTY_BUNDLE_NAME); ++ final Logger foobaz2 = Logger.getLogger(loggerName + ".baz", PROPERTY_BUNDLE_NAME); ++ if (foobaz2 != foobaz) { ++ throw new RuntimeException("Unexpected logger: " + foobaz2 + " != " + foobaz); ++ } ++ if (foobar != foobaz.getParent()) { ++ throw new RuntimeException("Unexpected parent: " + ++ foobaz.getParent() + " != " + foobar); ++ } + + // check that the child logger has the correct bundle. + // it should no longer inherit it from its parent. +- if (!PROPERTY_BUNDLE_NAME.equals(foobaz.getResourceBundleName())) { ++ if (!PROPERTY_BUNDLE_NAME.equals(foobaz2.getResourceBundleName())) { + throw new RuntimeException("Unexpected bundle name: " +- + foobaz.getResourceBundleName()); ++ + foobaz2.getResourceBundleName()); + } +- if (!PROPERTY_BUNDLE_NAME.equals(foobaz.getResourceBundle().getBaseBundleName())) { ++ ++ if (!PROPERTY_BUNDLE_NAME.equals(foobaz2.getResourceBundle().getBaseBundleName())) { + throw new RuntimeException("Unexpected bundle name: " +- + foobaz.getResourceBundle().getBaseBundleName()); ++ + foobaz2.getResourceBundle().getBaseBundleName()); ++ } ++ ++ boolean found = false; ++ for (Handler h : foobaz2.getHandlers()) { ++ if (h == handler) { ++ found = true; ++ break; ++ } ++ } ++ ++ if (!found) { ++ throw new RuntimeException("Expected handler not found in: " + ++ foobaz2.getName() + "(" + foobaz2.getClass().getName()+")" ); + } + + // log a message on the child logger +- foobaz.severe("dummy"); ++ foobaz2.severe("dummy"); ++ + + // check that the last published log record has the appropriate + // bundle. + if (!PROPERTY_BUNDLE_NAME.equals(handler.lastBundleName)) { ++ debugLogger(foobaz2, foobar, handler); + throw new RuntimeException("Unexpected bundle name: " + + handler.lastBundleName); + } +- if (foobaz.getResourceBundle() != handler.lastBundle) { ++ if (foobaz2.getResourceBundle() != handler.lastBundle) { ++ debugLogger(foobaz2, foobar, handler); + throw new RuntimeException("Unexpected bundle: " + + handler.lastBundle); + } +@@ -298,7 +331,7 @@ + // try to set a bundle that has a different name, and checks that + // it fails in IAE. + try { +- foobaz.setResourceBundle(bundle_fr); ++ foobaz2.setResourceBundle(bundle_fr); + throw new RuntimeException("Expected exception not raised!"); + } catch (IllegalArgumentException x) { + System.out.println("Got expected exception: " + x); +@@ -333,10 +366,12 @@ + + // check that the log record had the correct bundle. + if (! PROPERTY_BUNDLE_NAME.equals(handler2.lastBundleName)) { ++ debugLogger(customLogger, foobar, handler2); + throw new RuntimeException("Unexpected bundle name: " + + handler2.lastBundleName); + } + if (! PROPERTY_BUNDLE_NAME.equals(customLogger.getResourceBundleName())) { ++ debugLogger(customLogger, foobar, handler2); + throw new RuntimeException("Unexpected bundle name: " + + customLogger.getResourceBundleName()); + } +@@ -356,6 +391,7 @@ + // because getResourceBundleName() is called on parent logger + // we will have handler2.lastBundleName = PROPERTY_BUNDLE_NAME + if (!PROPERTY_BUNDLE_NAME.equals(handler2.lastBundleName)) { ++ debugLogger(biebar, customLogger, handler2); + throw new RuntimeException("Unexpected bundle name: " + + handler2.lastBundleName); + } +@@ -363,13 +399,70 @@ + // we will have getBaseName(handler2.lastBundle) = PROPERTY_BUNDLE_NAME + // and not handler2.lastBundle = bundle_fr + if (handler2.lastBundle == null) { ++ debugLogger(biebar, customLogger, handler2); + throw new RuntimeException("Unexpected bundle: " + + handler2.lastBundle); + } + if (!PROPERTY_BUNDLE_NAME.equals(getBaseName(handler2.lastBundle))) { ++ debugLogger(biebar, customLogger, handler2); + throw new RuntimeException("Unexpected bundle name: " + + getBaseName(handler2.lastBundle)); + } ++ ++ // Just make sure that these loggers won't be eagerly GCed... ++ if (foobar == null || !loggerName.equals(foobar.getName())) { ++ throw new RuntimeException("foobar is null " ++ + "- or doesn't have the expected name: " + foobar); ++ } ++ if (foobaz == null || !foobaz.getName().startsWith(loggerName)) { ++ throw new RuntimeException("foobaz is null " ++ + "- or doesn't have the expected name: " + foobaz); ++ } ++ if (foobaz2 == null || !foobaz2.getName().startsWith(loggerName)) { ++ throw new RuntimeException("foobaz2 is null " ++ + "- or doesn't have the expected name: " + foobaz2); ++ } ++ if (!customLogger.getName().startsWith(loggerName)) { ++ throw new RuntimeException("customLogger " ++ + "doesn't have the expected name: " + customLogger); ++ } ++ if (!biebar.getName().startsWith(loggerName)) { ++ throw new RuntimeException("biebar " ++ + "doesn't have the expected name: " + biebar.getName()); ++ } ++ System.out.println("Test passed for " + loggerName); ++ } ++ ++ static void debugLogger(Logger logger, Logger expectedParent, TestHandler handler) { ++ final String logName = logger.getName(); ++ final String prefix = " " + logName; ++ System.err.println("Logger " + logName ++ + " logged with bundle name " + handler.lastBundleName ++ + " (" + handler.lastBundle + ")"); ++ System.err.println(prefix + ".getResourceBundleName() is " ++ + logger.getResourceBundleName()); ++ System.err.println(prefix + ".getResourceBundle() is " ++ + logger.getResourceBundle()); ++ final Logger parent = logger.getParent(); ++ final String pname = parent == null ? null : parent.getName(); ++ final String pclass = parent == null ? "" ++ : ("(" + parent.getClass().getName() + ")"); ++ final String presn = parent == null ? null ++ : parent.getResourceBundleName(); ++ final ResourceBundle pres = parent == null ? null ++ : parent.getResourceBundle(); ++ System.err.println(prefix + ".getParent() is " ++ + pname + (pname == null ? "" ++ : (" " + pclass + ": " + parent))); ++ System.err.println(" expected parent is :" + expectedParent); ++ System.err.println(prefix + ".parent.getResourceBundleName() is " ++ + presn); ++ System.err.println(prefix + ".parent.getResourceBundle() is " ++ + pres); ++ System.err.println(" expected parent getResourceBundleName() is " ++ + expectedParent.getResourceBundleName()); ++ System.err.println(" expected parent.getResourceBundle() is " ++ + expectedParent.getResourceBundle()); + } + + public static class SimplePolicy extends Policy { +--- ./jdk/test/java/util/logging/LoggerWeakRefLeak.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/logging/LoggerWeakRefLeak.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -83,9 +83,9 @@ + fi + + if [ "$status" != 0 ]; then +- echo "ERROR: 'jmap $jmap_option' is not supported so this test" +- echo "ERROR: cannot work reliably. Aborting!" +- exit 2 ++ echo "WARNING: 'jmap $jmap_option' is not supported on this platform" ++ echo "WARNING: so this test cannot work reliably. Aborting!" ++ exit 0 + fi + fi + +--- ./jdk/test/java/util/logging/ParentLoggersTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/logging/ParentLoggersTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -63,7 +63,9 @@ + static final String LOGGER_NAME_1 = PARENT_NAME_1 + ".myLogger"; + static final String LOGGER_NAME_2 = PARENT_NAME_2 + ".myBar.myLogger"; + +- static final List initialLoggerNames = new ArrayList(); ++ static final List initialLoggerNames = new ArrayList<>(); ++ static final List createdLoggers = new ArrayList<>(); ++ + public static void main(String args[]) throws Exception { + // cache the initial set of loggers before this test begins + // to add any loggers +@@ -74,7 +76,7 @@ + if (!defaultLoggers.contains(logger)) { + initialLoggerNames.add(logger); + } +- }; ++ } + + String tstSrc = System.getProperty(TST_SRC_PROP); + File fname = new File(tstSrc, LM_PROP_FNAME); +@@ -92,7 +94,7 @@ + } + + public static List getDefaultLoggerNames() { +- List expectedLoggerNames = new ArrayList(); ++ List expectedLoggerNames = new ArrayList<>(); + + // LogManager always creates two loggers: + expectedLoggerNames.add(""); // root logger: "" +@@ -106,56 +108,43 @@ + */ + public static boolean checkLoggers() { + String failMsg = "# checkLoggers: getLoggerNames() returned unexpected loggers"; +- Vector expectedLoggerNames = new Vector(getDefaultLoggerNames()); ++ List expectedLoggerNames = new ArrayList<>(getDefaultLoggerNames()); + + // Create the logger LOGGER_NAME_1 +- Logger.getLogger(LOGGER_NAME_1); +- expectedLoggerNames.addElement(PARENT_NAME_1); +- expectedLoggerNames.addElement(LOGGER_NAME_1); ++ createdLoggers.add(Logger.getLogger(LOGGER_NAME_1)); ++ expectedLoggerNames.add(PARENT_NAME_1); ++ expectedLoggerNames.add(LOGGER_NAME_1); + + // Create the logger LOGGER_NAME_2 +- Logger.getLogger(LOGGER_NAME_2); +- expectedLoggerNames.addElement(PARENT_NAME_2); +- expectedLoggerNames.addElement(LOGGER_NAME_2); ++ createdLoggers.add(Logger.getLogger(LOGGER_NAME_2)); ++ expectedLoggerNames.add(PARENT_NAME_2); ++ expectedLoggerNames.add(LOGGER_NAME_2); ++ + + Enumeration returnedLoggersEnum = logMgr.getLoggerNames(); +- Vector returnedLoggerNames = new Vector(0); ++ List returnedLoggerNames = new ArrayList<>(0); + while (returnedLoggersEnum.hasMoreElements()) { + String logger = returnedLoggersEnum.nextElement(); + if (!initialLoggerNames.contains(logger)) { + // filter out the loggers that have been added before this test runs +- returnedLoggerNames.addElement(logger); ++ returnedLoggerNames.add(logger); + } + +- }; +- ++ } ++ System.out.println(returnedLoggerNames); + return checkNames(expectedLoggerNames, returnedLoggerNames, failMsg); + } + + // Returns boolean values: PASSED or FAILED +- private static boolean checkNames(Vector expNames, +- Vector retNames, ++ private static boolean checkNames(List expNames, ++ List retNames, + String failMsg) { + boolean status = PASSED; + + if (expNames.size() != retNames.size()) { + status = FAILED; +- } else { +- boolean checked[] = new boolean[retNames.size()]; +- for (int i = 0; i < expNames.size(); i++) { +- int j = 0; +- for (; j < retNames.size(); j++) { +- if (!checked[j] && +- expNames.elementAt(i).equals(retNames.elementAt(j))) { +- checked[j] = true; +- break; +- } +- } +- if (j >= retNames.size()) { +- status = FAILED; +- break; +- } +- } ++ } else if (!new HashSet<>(expNames).equals(new HashSet<>(retNames))) { ++ status = FAILED; + } + if (!status) { + printFailMsg(expNames, retNames, failMsg); +@@ -163,25 +152,25 @@ + return status; + } + +- private static void printFailMsg(Vector expNames, +- Vector retNames, ++ private static void printFailMsg(List expNames, ++ List retNames, + String failMsg) { + out.println(); + out.println(failMsg); +- if (expNames.size() == 0) { ++ if (expNames.isEmpty()) { + out.println("# there are NO expected logger names"); + } else { + out.println("# expected logger names (" + expNames.size() + "):"); + for (int i = 0; i < expNames.size(); i++) { +- out.println(" expNames[" + i + "] = " + expNames.elementAt(i)); ++ out.println(" expNames[" + i + "] = " + expNames.get(i)); + } + } +- if (retNames.size() == 0) { ++ if (retNames.isEmpty()) { + out.println("# there are NO returned logger names"); + } else { + out.println("# returned logger names (" + retNames.size() + "):"); + for (int i = 0; i < retNames.size(); i++) { +- out.println(" retNames[" + i + "] = " + retNames.elementAt(i)); ++ out.println(" retNames[" + i + "] = " + retNames.get(i)); + } + } + } +--- ./jdk/test/java/util/logging/SimpleLogManager.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/logging/SimpleLogManager.java Wed Jul 30 18:42:59 2014 +0100 +@@ -98,16 +98,14 @@ + return false; + } + CustomLogger newLogger = new CustomLogger(logger); +- super.addLogger(newLogger); +- return true; ++ return super.addLogger(newLogger); + } + + public class CustomLogger extends Logger { ++ final Logger keepRef; // keep a strong reference to avoid GC. + CustomLogger(Logger logger) { + super(logger.getName(), logger.getResourceBundleName()); +- } +- CustomLogger(String name) { +- super(name, null); ++ keepRef = logger; + } + } + } +--- ./jdk/test/java/util/logging/TestGetLoggerNPE.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/util/logging/TestGetLoggerNPE.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,107 @@ ++/* ++ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++import java.io.PrintStream; ++import java.security.Permission; ++import java.security.Policy; ++import java.security.ProtectionDomain; ++import java.util.logging.LogManager; ++import java.util.logging.Logger; ++import sun.misc.JavaAWTAccess; ++import sun.misc.SharedSecrets; ++ ++/* ++ * @test ++ * @bug 8025512 ++ * ++ * @summary NPE with logging while launching webstart ++ * ++ * @build TestGetLoggerNPE ++ * @run main/othervm TestGetLoggerNPE getLogger ++ * @run main/othervm TestGetLoggerNPE getLogManager ++ */ ++public class TestGetLoggerNPE { ++ static volatile Throwable thrown = null; ++ public static void main(String[] args) throws Exception { ++ final String testCase = args.length == 0 ? "getLogger" : args[0]; ++ final JavaAWTAccessStub access = new JavaAWTAccessStub(); ++ SharedSecrets.setJavaAWTAccess(access); ++ final ThreadGroup tg = new ThreadGroup("TestGroup"); ++ Thread t = new Thread(tg, "test") { ++ public void run() { ++ try { ++ access.setContext(Context.ONE); ++ final PrintStream out = System.out; ++ System.setOut(null); ++ try { ++ if ("getLogger".equals(testCase)) { ++ Logger.getLogger("sun.plugin"); ++ } else { ++ LogManager.getLogManager(); ++ } ++ } finally { ++ System.setOut(out); ++ } ++ ++ System.out.println(Logger.global); ++ } catch (Throwable x) { ++ x.printStackTrace(); ++ thrown = x; ++ } ++ } ++ }; ++ Policy.setPolicy(new Policy() { ++ public boolean implies(ProtectionDomain domain, ++ Permission permission) { ++ return true; // all permissions ++ } ++ }); ++ System.setSecurityManager(new SecurityManager()); ++ t.start(); ++ t.join(); ++ if (thrown == null) { ++ System.out.println("PASSED: " + testCase); ++ } else { ++ System.err.println("FAILED: " + testCase); ++ throw new Error("Test failed: " + testCase + " - " + thrown, thrown); ++ } ++ ++ } ++ ++ static enum Context { ONE, TWO }; ++ ++ static final class JavaAWTAccessStub implements JavaAWTAccess { ++ private static final InheritableThreadLocal context = new InheritableThreadLocal<>(); ++ ++ ++ public void setContext(Context context) { ++ JavaAWTAccessStub.context.set(context); ++ } ++ ++ @Override ++ public Object getAppletContext() { ++ return context.get(); ++ } ++ ++ } ++ ++} +--- ./jdk/test/java/util/logging/TestLogConfigurationDeadLock.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/logging/TestLogConfigurationDeadLock.java Wed Jul 30 18:42:59 2014 +0100 +@@ -196,7 +196,8 @@ + if (ids.length == 1) { + throw new RuntimeException("Found 1 deadlocked thread: "+ids[0]); + } else if (ids.length > 0) { +- ThreadInfo[] infos = ManagementFactory.getThreadMXBean().getThreadInfo(ids); ++ ThreadInfo[] infos = ManagementFactory.getThreadMXBean() ++ .getThreadInfo(ids, Integer.MAX_VALUE); + System.err.println("Found "+ids.length+" deadlocked threads: "); + for (ThreadInfo inf : infos) { + System.err.println(inf.toString()); +--- ./jdk/test/java/util/logging/TestLogConfigurationDeadLockWithConf.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/util/logging/TestLogConfigurationDeadLockWithConf.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,340 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++import java.io.File; ++import java.io.PrintStream; ++import java.lang.management.ManagementFactory; ++import java.lang.management.ThreadInfo; ++import java.security.Permission; ++import java.security.Policy; ++import java.security.ProtectionDomain; ++import java.util.ArrayList; ++import java.util.Collections; ++import java.util.HashSet; ++import java.util.List; ++import java.util.Random; ++import java.util.Set; ++import java.util.concurrent.atomic.AtomicLong; ++import java.util.logging.Level; ++import java.util.logging.LogManager; ++import java.util.logging.Logger; ++ ++ ++/** ++ * @test ++ * @bug 8027670 8029281 ++ * @summary Deadlock in drainLoggerRefQueueBounded / readConfiguration ++ * caused by synchronization issues in Logger and LogManager. ++ * @run main/othervm TestLogConfigurationDeadLockWithConf ++ * @author danielfuchs ++ */ ++// This test is a best effort to try & detect issues. The test itself will run ++// for 8secs. This is usually sufficient to detect issues. ++// However to get a greater confidence it is recommended to run this test in a loop: ++// e.g. use something like: ++// $ while jtreg -jdk:$JDK -verbose:all \ ++// test/java/util/logging/TestLogConfigurationDeadLockWithConf.java ; \ ++// do echo Running test again ; done ++// and let it run for a few hours... ++// ++public class TestLogConfigurationDeadLockWithConf { ++ ++ static volatile Exception thrown = null; ++ static volatile boolean goOn = true; ++ ++ static final int READERS = 2; ++ static final int LOGGERS = 2; ++ static final long TIME = 4 * 1000; // 4 sec. ++ static final long STEP = 1 * 1000; // message every 1 sec. ++ static final int LCOUNT = 50; // 50 loggers created in a row... ++ static final AtomicLong nextLogger = new AtomicLong(0); ++ static final AtomicLong readCount = new AtomicLong(0); ++ static final AtomicLong checkCount = new AtomicLong(0); ++ ++ /** ++ * This test will run both with and without a security manager. ++ * ++ * The test starts a number of threads that will call ++ * LogManager.readConfiguration() concurrently (ReadConf), then starts ++ * a number of threads that will create new loggers concurrently ++ * (AddLogger), and then two additional threads: one (Stopper) that ++ * will stop the test after 4secs (TIME ms), and one DeadlockDetector ++ * that will attempt to detect deadlocks. ++ * If after 4secs no deadlock was detected and no exception was thrown ++ * then the test is considered a success and passes. ++ * ++ * This procedure is done twice: once without a security manager and once ++ * again with a security manager - which means the test takes ~8secs to ++ * run. ++ * ++ * Note that 8sec may not be enough to detect issues if there are some. ++ * This is a best effort test. ++ * ++ * @param args the command line arguments ++ * @throws java.lang.Exception if the test fails. ++ */ ++ public static void main(String[] args) throws Exception { ++ File config = new File(System.getProperty("test.src", "."), ++ "deadlockconf.properties"); ++ if (!config.canRead()) { ++ System.err.println("Can't read config file: test cannot execute."); ++ System.err.println("Please check your test environment: "); ++ System.err.println("\t -Dtest.src=" + System.getProperty("test.src", ".")); ++ System.err.println("\t config file is: " + config.getAbsolutePath()); ++ throw new RuntimeException("Can't read config file: " ++ + config.getAbsolutePath()); ++ } ++ ++ System.setProperty("java.util.logging.config.file", ++ config.getAbsolutePath()); ++ ++ // test without security ++ System.out.println("No security"); ++ test(); ++ ++ // test with security ++ System.out.println("\nWith security"); ++ Policy.setPolicy(new Policy() { ++ @Override ++ public boolean implies(ProtectionDomain domain, Permission permission) { ++ if (super.implies(domain, permission)) return true; ++ // System.out.println("Granting " + permission); ++ return true; // all permissions ++ } ++ }); ++ System.setSecurityManager(new SecurityManager()); ++ test(); ++ } ++ ++ static Random rand = new Random(System.currentTimeMillis()); ++ private static int getBarCount() { ++ return rand.nextInt(10); ++ } ++ ++ /** ++ * Starts all threads, wait 4secs, then stops all threads. ++ * @throws Exception if a deadlock was detected or an error occurred. ++ */ ++ public static void test() throws Exception { ++ goOn = true; ++ thrown = null; ++ long sNextLogger = nextLogger.get(); ++ long sReadCount = readCount.get(); ++ long sCheckCount = checkCount.get(); ++ List threads = new ArrayList<>(); ++ for (int i = 0; i deadlocked = Collections.synchronizedSet(new HashSet()); ++ ++ static List asList(long... ids) { ++ final List list = new ArrayList<>(ids.length); ++ for (long id : ids) { ++ list.add(id); ++ } ++ return list; ++ } ++ ++ @Override ++ public void run() { ++ while(goOn) { ++ try { ++ long[] ids = ManagementFactory.getThreadMXBean().findDeadlockedThreads(); ++ checkCount.incrementAndGet(); ++ ids = ids == null ? new long[0] : ids; ++ if (ids.length > 0) { ++ deadlocked.addAll(asList(ids)); ++ } ++ if (ids.length == 1) { ++ throw new RuntimeException("Found 1 deadlocked thread: "+ids[0]); ++ } else if (ids.length > 0) { ++ ThreadInfo[] infos = ManagementFactory.getThreadMXBean().getThreadInfo(ids, Integer.MAX_VALUE); ++ System.err.println("Found "+ids.length+" deadlocked threads: "); ++ for (ThreadInfo inf : infos) { ++ System.err.println(inf.toString()); ++ } ++ throw new RuntimeException("Found "+ids.length+" deadlocked threads"); ++ } ++ Thread.sleep(100); ++ } catch(InterruptedException | RuntimeException x) { ++ fail(x); ++ } ++ } ++ } ++ ++ } ++ ++ static final class Stopper extends Thread { ++ long start; ++ long time; ++ ++ static final Logger logger = Logger.getLogger("remaining"); ++ ++ Stopper(long time) { ++ start = System.currentTimeMillis(); ++ this.time = time; ++ } ++ ++ @Override ++ public void run() { ++ try { ++ long rest, previous; ++ previous = time; ++ while (goOn && (rest = start - System.currentTimeMillis() + time) > 0) { ++ if (previous == time || previous - rest >= STEP) { ++ logger.log(Level.INFO, ++ "{0}ms remaining...", String.valueOf(rest)); ++ previous = rest == time ? rest -1 : rest; ++ System.gc(); ++ } ++ if (goOn == false) break; ++ Thread.sleep(Math.min(rest, 100)); ++ } ++ System.out.println(System.currentTimeMillis() - start ++ + " ms elapsed ("+time+ " requested)"); ++ goOn = false; ++ } catch(InterruptedException | RuntimeException x) { ++ fail(x); ++ } ++ } ++ ++ } ++ ++ static void fail(Exception x) { ++ x.printStackTrace(); ++ if (thrown == null) { ++ thrown = x; ++ } ++ goOn = false; ++ } ++} +--- ./jdk/test/java/util/logging/TestLoggerBundleSync.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/logging/TestLoggerBundleSync.java Wed Jul 30 18:42:59 2014 +0100 +@@ -190,8 +190,10 @@ + final static class MyHandler extends Handler { + volatile ResourceBundle rb; + volatile String rbName; ++ volatile int count = 0; + @Override + public synchronized void publish(LogRecord record) { ++ count++; + rb = record.getResourceBundle(); + rbName = record.getResourceBundleName(); + } +@@ -227,23 +229,51 @@ + Logger ll = Logger.getLogger(l.getName()+".bie.bye"); + ResourceBundle hrb; + String hrbName; ++ if (handler.getLevel() != Level.FINEST) { ++ throw new RuntimeException("Handler level is not finest: " ++ + handler.getLevel()); ++ } ++ final int countBefore = handler.count; + ll.setLevel(Level.FINEST); + ll.addHandler(handler); + ll.fine("dummy"); + ll.removeHandler(handler); ++ final int countAfter = handler.count; ++ if (countBefore == countAfter) { ++ throw new RuntimeException("Handler not called for " ++ + ll.getName() + "("+ countAfter +")"); ++ } + hrb = handler.rb; + hrbName = handler.rbName; + if (name != null) { ++ // if name is not null, then it implies that it ++ // won't change, since setResourceBundle() cannot ++ // replace a non null name. ++ // Since we never set the resource bundle on 'll', ++ // then ll must inherit its resource bundle [name] ++ // from l - and therefor we should find it in ++ // handler.rb/handler.rbName + if (!name.equals(hrbName)) { + throw new RuntimeException("Unexpected bundle name: " +- +hrb.getBaseBundleName()); ++ +hrbName); + } ++ // here we know that hrbName is not null so hrb ++ // should not be null either. + if (!name.equals(hrb.getBaseBundleName())) { + throw new RuntimeException("Unexpected bundle name: " + +hrb.getBaseBundleName()); + } + } + ++ // Make sure to refer to 'l' explicitly in order to ++ // prevent eager garbage collecting before the end of ++ // the test (JDK-8030192) ++ if (!ll.getName().startsWith(l.getName())) { ++ throw new RuntimeException("Logger " + ll.getName() ++ + "does not start with expected prefix " ++ + l.getName()); ++ } ++ + getRBcount.incrementAndGet(); + if (!goOn) break; + Thread.sleep(1); +--- ./jdk/test/java/util/logging/deadlockconf.properties Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/util/logging/deadlockconf.properties Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,22 @@ ++# This file is used by TestLogConfigurationDeadLockWithConf ++handlers= java.util.logging.ConsoleHandler ++.level= INFO ++java.util.logging.ConsoleHandler.level = INFO ++java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter ++ ++ ++foo.bar0.level = INFO ++foo.bar1.level = INFO ++foo.bar2.level = INFO ++foo.bar3.level = INFO ++foo.bar4.level = INFO ++ ++# We leave foo.bar5 out so that we have at least ++# one logger whose parent won't be in the configuration ++# file ++#foo.bar5.level = INFO ++ ++foo.bar6.level = INFO ++foo.bar7.level = INFO ++foo.bar8.level = INFO ++foo.bar9.level = INFO +--- ./jdk/test/java/util/prefs/CheckUserPrefsStorage.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/prefs/CheckUserPrefsStorage.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -31,7 +31,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/SortedOpTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/stream/test/org/openjdk/tests/java/util/stream/SortedOpTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -26,6 +26,9 @@ + + import java.util.*; + import java.util.Spliterators; ++import java.util.concurrent.atomic.AtomicInteger; ++import java.util.function.BiFunction; ++import java.util.function.Consumer; + import java.util.function.Function; + import java.util.function.Supplier; + import java.util.stream.*; +@@ -122,24 +125,33 @@ + + @Test(groups = { "serialization-hostile" }) + public void testSequentialShortCircuitTerminal() { +- // The sorted op for sequential evaluation will buffer all elements when accepting +- // then at the end sort those elements and push those elements downstream ++ // The sorted op for sequential evaluation will buffer all elements when ++ // accepting then at the end sort those elements and push those elements ++ // downstream ++ // A peek operation is added in-between the sorted() and terminal ++ // operation that counts the number of calls to its consumer and ++ // asserts that the number of calls is at most the required quantity + + List l = Arrays.asList(5, 4, 3, 2, 1); + ++ Function> knownSize = i -> assertNCallsOnly( ++ l.stream().sorted(), Stream::peek, i); ++ Function> unknownSize = i -> assertNCallsOnly ++ (unknownSizeStream(l).sorted(), Stream::peek, i); ++ + // Find +- assertEquals(l.stream().sorted().findFirst(), Optional.of(1)); +- assertEquals(l.stream().sorted().findAny(), Optional.of(1)); +- assertEquals(unknownSizeStream(l).sorted().findFirst(), Optional.of(1)); +- assertEquals(unknownSizeStream(l).sorted().findAny(), Optional.of(1)); ++ assertEquals(knownSize.apply(1).findFirst(), Optional.of(1)); ++ assertEquals(knownSize.apply(1).findAny(), Optional.of(1)); ++ assertEquals(unknownSize.apply(1).findFirst(), Optional.of(1)); ++ assertEquals(unknownSize.apply(1).findAny(), Optional.of(1)); + + // Match +- assertEquals(l.stream().sorted().anyMatch(i -> i == 2), true); +- assertEquals(l.stream().sorted().noneMatch(i -> i == 2), false); +- assertEquals(l.stream().sorted().allMatch(i -> i == 2), false); +- assertEquals(unknownSizeStream(l).sorted().anyMatch(i -> i == 2), true); +- assertEquals(unknownSizeStream(l).sorted().noneMatch(i -> i == 2), false); +- assertEquals(unknownSizeStream(l).sorted().allMatch(i -> i == 2), false); ++ assertEquals(knownSize.apply(2).anyMatch(i -> i == 2), true); ++ assertEquals(knownSize.apply(2).noneMatch(i -> i == 2), false); ++ assertEquals(knownSize.apply(2).allMatch(i -> i == 2), false); ++ assertEquals(unknownSize.apply(2).anyMatch(i -> i == 2), true); ++ assertEquals(unknownSize.apply(2).noneMatch(i -> i == 2), false); ++ assertEquals(unknownSize.apply(2).allMatch(i -> i == 2), false); + } + + private Stream unknownSizeStream(List l) { +@@ -199,19 +211,24 @@ + public void testIntSequentialShortCircuitTerminal() { + int[] a = new int[]{5, 4, 3, 2, 1}; + ++ Function knownSize = i -> assertNCallsOnly( ++ Arrays.stream(a).sorted(), (s, c) -> s.peek(c::accept), i); ++ Function unknownSize = i -> assertNCallsOnly ++ (unknownSizeIntStream(a).sorted(), (s, c) -> s.peek(c::accept), i); ++ + // Find +- assertEquals(Arrays.stream(a).sorted().findFirst(), OptionalInt.of(1)); +- assertEquals(Arrays.stream(a).sorted().findAny(), OptionalInt.of(1)); +- assertEquals(unknownSizeIntStream(a).sorted().findFirst(), OptionalInt.of(1)); +- assertEquals(unknownSizeIntStream(a).sorted().findAny(), OptionalInt.of(1)); ++ assertEquals(knownSize.apply(1).findFirst(), OptionalInt.of(1)); ++ assertEquals(knownSize.apply(1).findAny(), OptionalInt.of(1)); ++ assertEquals(unknownSize.apply(1).findFirst(), OptionalInt.of(1)); ++ assertEquals(unknownSize.apply(1).findAny(), OptionalInt.of(1)); + + // Match +- assertEquals(Arrays.stream(a).sorted().anyMatch(i -> i == 2), true); +- assertEquals(Arrays.stream(a).sorted().noneMatch(i -> i == 2), false); +- assertEquals(Arrays.stream(a).sorted().allMatch(i -> i == 2), false); +- assertEquals(unknownSizeIntStream(a).sorted().anyMatch(i -> i == 2), true); +- assertEquals(unknownSizeIntStream(a).sorted().noneMatch(i -> i == 2), false); +- assertEquals(unknownSizeIntStream(a).sorted().allMatch(i -> i == 2), false); ++ assertEquals(knownSize.apply(2).anyMatch(i -> i == 2), true); ++ assertEquals(knownSize.apply(2).noneMatch(i -> i == 2), false); ++ assertEquals(knownSize.apply(2).allMatch(i -> i == 2), false); ++ assertEquals(unknownSize.apply(2).anyMatch(i -> i == 2), true); ++ assertEquals(unknownSize.apply(2).noneMatch(i -> i == 2), false); ++ assertEquals(unknownSize.apply(2).allMatch(i -> i == 2), false); + } + + private IntStream unknownSizeIntStream(int[] a) { +@@ -242,19 +259,24 @@ + public void testLongSequentialShortCircuitTerminal() { + long[] a = new long[]{5, 4, 3, 2, 1}; + ++ Function knownSize = i -> assertNCallsOnly( ++ Arrays.stream(a).sorted(), (s, c) -> s.peek(c::accept), i); ++ Function unknownSize = i -> assertNCallsOnly ++ (unknownSizeLongStream(a).sorted(), (s, c) -> s.peek(c::accept), i); ++ + // Find +- assertEquals(Arrays.stream(a).sorted().findFirst(), OptionalLong.of(1)); +- assertEquals(Arrays.stream(a).sorted().findAny(), OptionalLong.of(1)); +- assertEquals(unknownSizeLongStream(a).sorted().findFirst(), OptionalLong.of(1)); +- assertEquals(unknownSizeLongStream(a).sorted().findAny(), OptionalLong.of(1)); ++ assertEquals(knownSize.apply(1).findFirst(), OptionalLong.of(1)); ++ assertEquals(knownSize.apply(1).findAny(), OptionalLong.of(1)); ++ assertEquals(unknownSize.apply(1).findFirst(), OptionalLong.of(1)); ++ assertEquals(unknownSize.apply(1).findAny(), OptionalLong.of(1)); + + // Match +- assertEquals(Arrays.stream(a).sorted().anyMatch(i -> i == 2), true); +- assertEquals(Arrays.stream(a).sorted().noneMatch(i -> i == 2), false); +- assertEquals(Arrays.stream(a).sorted().allMatch(i -> i == 2), false); +- assertEquals(unknownSizeLongStream(a).sorted().anyMatch(i -> i == 2), true); +- assertEquals(unknownSizeLongStream(a).sorted().noneMatch(i -> i == 2), false); +- assertEquals(unknownSizeLongStream(a).sorted().allMatch(i -> i == 2), false); ++ assertEquals(knownSize.apply(2).anyMatch(i -> i == 2), true); ++ assertEquals(knownSize.apply(2).noneMatch(i -> i == 2), false); ++ assertEquals(knownSize.apply(2).allMatch(i -> i == 2), false); ++ assertEquals(unknownSize.apply(2).anyMatch(i -> i == 2), true); ++ assertEquals(unknownSize.apply(2).noneMatch(i -> i == 2), false); ++ assertEquals(unknownSize.apply(2).allMatch(i -> i == 2), false); + } + + private LongStream unknownSizeLongStream(long[] a) { +@@ -285,19 +307,24 @@ + public void testDoubleSequentialShortCircuitTerminal() { + double[] a = new double[]{5.0, 4.0, 3.0, 2.0, 1.0}; + ++ Function knownSize = i -> assertNCallsOnly( ++ Arrays.stream(a).sorted(), (s, c) -> s.peek(c::accept), i); ++ Function unknownSize = i -> assertNCallsOnly ++ (unknownSizeDoubleStream(a).sorted(), (s, c) -> s.peek(c::accept), i); ++ + // Find +- assertEquals(Arrays.stream(a).sorted().findFirst(), OptionalDouble.of(1)); +- assertEquals(Arrays.stream(a).sorted().findAny(), OptionalDouble.of(1)); +- assertEquals(unknownSizeDoubleStream(a).sorted().findFirst(), OptionalDouble.of(1)); +- assertEquals(unknownSizeDoubleStream(a).sorted().findAny(), OptionalDouble.of(1)); ++ assertEquals(knownSize.apply(1).findFirst(), OptionalDouble.of(1)); ++ assertEquals(knownSize.apply(1).findAny(), OptionalDouble.of(1)); ++ assertEquals(unknownSize.apply(1).findFirst(), OptionalDouble.of(1)); ++ assertEquals(unknownSize.apply(1).findAny(), OptionalDouble.of(1)); + + // Match +- assertEquals(Arrays.stream(a).sorted().anyMatch(i -> i == 2.0), true); +- assertEquals(Arrays.stream(a).sorted().noneMatch(i -> i == 2.0), false); +- assertEquals(Arrays.stream(a).sorted().allMatch(i -> i == 2.0), false); +- assertEquals(unknownSizeDoubleStream(a).sorted().anyMatch(i -> i == 2.0), true); +- assertEquals(unknownSizeDoubleStream(a).sorted().noneMatch(i -> i == 2.0), false); +- assertEquals(unknownSizeDoubleStream(a).sorted().allMatch(i -> i == 2.0), false); ++ assertEquals(knownSize.apply(2).anyMatch(i -> i == 2.0), true); ++ assertEquals(knownSize.apply(2).noneMatch(i -> i == 2.0), false); ++ assertEquals(knownSize.apply(2).allMatch(i -> i == 2.0), false); ++ assertEquals(unknownSize.apply(2).anyMatch(i -> i == 2.0), true); ++ assertEquals(unknownSize.apply(2).noneMatch(i -> i == 2.0), false); ++ assertEquals(unknownSize.apply(2).allMatch(i -> i == 2.0), false); + } + + private DoubleStream unknownSizeDoubleStream(double[] a) { +@@ -321,4 +348,14 @@ + assertSorted(result); + assertContentsUnordered(data, result); + } ++ ++ /** ++ * Interpose a consumer that asserts it is called at most N times. ++ */ ++ , R> S assertNCallsOnly(S s, BiFunction, S> pf, int n) { ++ AtomicInteger boxedInt = new AtomicInteger(); ++ return pf.apply(s, i -> { ++ assertFalse(boxedInt.incrementAndGet() > n, "Intermediate op called more than " + n + " time(s)"); ++ }); ++ } + } +--- ./jdk/test/java/util/zip/ZipFile/MultiThreadedReadTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/util/zip/ZipFile/MultiThreadedReadTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,92 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* @test ++ * @bug 8038491 ++ * @summary Crash in ZipFile.read() when ZipFileInputStream is shared between threads ++ * @library /lib/testlibrary ++ * @build jdk.testlibrary.* ++ * @run main MultiThreadedReadTest ++ */ ++ ++import java.io.File; ++import java.io.FileOutputStream; ++import java.io.InputStream; ++import java.nio.file.Paths; ++import java.util.Random; ++import java.util.zip.ZipEntry; ++import java.util.zip.ZipFile; ++import java.util.zip.ZipOutputStream; ++import jdk.testlibrary.FileUtils; ++ ++public class MultiThreadedReadTest extends Thread { ++ ++ private static final int NUM_THREADS = 10; ++ private static final String ZIPFILE_NAME = "large.zip"; ++ private static final String ZIPENTRY_NAME = "random.txt"; ++ private static InputStream is = null; ++ ++ public static void main(String args[]) throws Exception { ++ createZipFile(); ++ try (ZipFile zf = new ZipFile(new File(ZIPFILE_NAME))) { ++ is = zf.getInputStream(zf.getEntry(ZIPENTRY_NAME)); ++ Thread[] threadArray = new Thread[NUM_THREADS]; ++ for (int i = 0; i < threadArray.length; i++) { ++ threadArray[i] = new MultiThreadedReadTest(); ++ } ++ for (int i = 0; i < threadArray.length; i++) { ++ threadArray[i].start(); ++ } ++ for (int i = 0; i < threadArray.length; i++) { ++ threadArray[i].join(); ++ } ++ } finally { ++ FileUtils.deleteFileIfExistsWithRetry(Paths.get(ZIPFILE_NAME)); ++ } ++ } ++ ++ private static void createZipFile() throws Exception { ++ try (ZipOutputStream zos = ++ new ZipOutputStream(new FileOutputStream(ZIPFILE_NAME))) { ++ ++ zos.putNextEntry(new ZipEntry(ZIPENTRY_NAME)); ++ StringBuilder sb = new StringBuilder(); ++ Random rnd = new Random(); ++ for(int i = 0; i < 1000; i++) { ++ // append some random string for ZipEntry ++ sb.append(Long.toString(rnd.nextLong())); ++ } ++ byte[] b = sb.toString().getBytes(); ++ zos.write(b, 0, b.length); ++ } ++ } ++ ++ @Override ++ public void run() { ++ try { ++ while (is.read() != -1) { } ++ } catch (Exception e) { ++ // Swallow any Exceptions (which are expected) - we're only interested in the crash ++ } ++ } ++} +--- ./jdk/test/java/util/zip/ZipFile/ReadZip.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/java/util/zip/ZipFile/ReadZip.java Wed Jul 30 18:42:59 2014 +0100 +@@ -63,6 +63,8 @@ + Files.copy(Paths.get(System.getProperty("test.src", ""), "input.zip"), + newZip.toPath(), StandardCopyOption.REPLACE_EXISTING); + ++ newZip.setWritable(true); ++ + // pad some bytes + try (OutputStream os = Files.newOutputStream(newZip.toPath(), + StandardOpenOption.APPEND)) { +--- ./jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -56,7 +56,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -89,7 +89,7 @@ + FILESEP="/" + ;; + +- Linux | Darwin ) ++ Linux | Darwin | AIX ) + VAR="A different value for Linux" + DEFAULT_JDK=/none + #DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386 +--- ./jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatThreadTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatThreadTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -90,7 +90,7 @@ + FILESEP="/" + ;; + +- Linux | Darwin ) ++ Linux | Darwin | AIX ) + VAR="A different value for Linux" + DEFAULT_JDK=/none + #DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386 +--- ./jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -92,6 +92,14 @@ + TMP="/tmp" + ;; + ++ AIX ) ++ VAR="A different value for AIX" ++ DEFAULT_JDK=/ ++ FILESEP="/" ++ PATHSEP=":" ++ TMP="/tmp" ++ ;; ++ + Darwin ) + VAR="A different value for MacOSX" + DEFAULT_JDK=/usr +--- ./jdk/test/javax/management/monitor/StartStopTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/management/monitor/StartStopTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -27,8 +27,9 @@ + * @summary Test that tasks are cancelled properly when + * monitors are started and stopped in a loop. + * @author Luis-Miguel Alventosa ++ * @library /lib/testlibrary + * @run clean StartStopTest +- * @run build StartStopTest ++ * @run build jdk.testlibrary.* StartStopTest + * @run main/othervm/timeout=300 StartStopTest 1 + * @run main/othervm/timeout=300 StartStopTest 2 + * @run main/othervm/timeout=300 StartStopTest 3 +@@ -52,14 +53,15 @@ + import javax.management.monitor.MonitorNotification; + import javax.management.monitor.StringMonitor; + ++import jdk.testlibrary.Utils; ++ + public class StartStopTest { +- + static int maxPoolSize; + static final AtomicInteger counter = new AtomicInteger(); + + // MBean class + public class ObservedObject implements ObservedObjectMBean { +- public boolean called = false; ++ volatile public boolean called = false; + public Integer getInteger() { + task("Integer"); + return 0; +@@ -142,7 +144,7 @@ + for (int i = 0; i < nTasks; i++) + monitor[i].start(); + echo(">>> MONITORS started"); +- Thread.sleep(500); ++ doSleep(500); + echo(">>> Check FLAGS true"); + for (int i = 0; i < nTasks; i++) + if (!monitored[i].called) { +@@ -154,7 +156,7 @@ + for (int i = 0; i < nTasks; i++) + monitor[i].stop(); + echo(">>> MONITORS stopped"); +- Thread.sleep(500); ++ doSleep(500); + echo(">>> Set FLAGS to false"); + for (int i = 0; i < nTasks; i++) + monitored[i].called = false; +@@ -208,4 +210,8 @@ + echo(">>> Happy Bye, Bye!"); + } + } ++ ++ private static void doSleep(long ms) throws Exception { ++ Thread.sleep(Math.round(ms * Utils.TIMEOUT_FACTOR)); ++ } + } +--- ./jdk/test/javax/net/ssl/SSLEngine/IllegalRecordVersion.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/net/ssl/SSLEngine/IllegalRecordVersion.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,77 @@ ++/* ++ * 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 test case relies on updated static security property, no way to re-use ++// security property in samevm/agentvm mode. ++ ++/* ++ * @test ++ * @bug 8042449 ++ * @summary Issue for negative byte major record version ++ * ++ * @run main/othervm IllegalRecordVersion ++ */ ++ ++import javax.net.ssl.*; ++import javax.net.ssl.SSLEngineResult.*; ++import java.io.*; ++import java.security.*; ++import java.nio.*; ++ ++public class IllegalRecordVersion { ++ ++ public static void main(String args[]) throws Exception { ++ SSLContext context = SSLContext.getDefault(); ++ ++ SSLEngine cliEngine = context.createSSLEngine(); ++ cliEngine.setUseClientMode(true); ++ SSLEngine srvEngine = context.createSSLEngine(); ++ srvEngine.setUseClientMode(false); ++ ++ SSLSession session = cliEngine.getSession(); ++ int netBufferMax = session.getPacketBufferSize(); ++ int appBufferMax = session.getApplicationBufferSize(); ++ ++ ByteBuffer cliToSrv = ByteBuffer.allocateDirect(netBufferMax); ++ ByteBuffer srvIBuff = ByteBuffer.allocateDirect(appBufferMax + 50); ++ ByteBuffer cliOBuff = ByteBuffer.wrap("I'm client".getBytes()); ++ ++ ++ System.out.println("client hello (record version(0xa9, 0xa2))"); ++ SSLEngineResult cliRes = cliEngine.wrap(cliOBuff, cliToSrv); ++ System.out.println("Client wrap result: " + cliRes); ++ cliToSrv.flip(); ++ if (cliToSrv.limit() > 5) { ++ cliToSrv.put(1, (byte)0xa9); ++ cliToSrv.put(2, (byte)0xa2); ++ } ++ ++ try { ++ srvEngine.unwrap(cliToSrv, srvIBuff); ++ throw new Exception( ++ "Cannot catch the unsupported record version issue"); ++ } catch (SSLException e) { ++ // get the expected exception ++ } ++ } ++} +--- ./jdk/test/javax/print/PrintServiceLookup/CountPrintServices.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/print/PrintServiceLookup/CountPrintServices.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,68 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.io.BufferedReader; ++import java.io.InputStreamReader; ++import javax.print.PrintService; ++import javax.print.PrintServiceLookup; ++import javax.print.attribute.AttributeSet; ++import javax.print.attribute.HashAttributeSet; ++import javax.print.attribute.standard.PrinterName; ++ ++/* ++ * @test ++ * @bug 8032693 ++ * @summary Test that lpstat and JDK agree whether there are printers. ++ */ ++public class CountPrintServices { ++ ++ public static void main(String[] args) throws Exception { ++ String os = System.getProperty("os.name").toLowerCase(); ++ System.out.println("OS is " + os); ++ if (!os.equals("linux")) { ++ System.out.println("Linux specific test. No need to continue"); ++ return; ++ } ++ PrintService services[] = ++ PrintServiceLookup.lookupPrintServices(null, null); ++ if (services.length > 0) { ++ System.out.println("Services found. No need to test further."); ++ return; ++ } ++ String[] lpcmd = { "lpstat", "-a" }; ++ Process proc = Runtime.getRuntime().exec(lpcmd); ++ proc.waitFor(); ++ InputStreamReader ir = new InputStreamReader(proc.getInputStream()); ++ BufferedReader br = new BufferedReader(ir); ++ int count = 0; ++ String printer; ++ while ((printer = br.readLine()) != null) { ++ System.out.println("lpstat:: " + printer); ++ count++; ++ } ++ if (count > 0) { ++ throw new RuntimeException("Services exist, but not found by JDK."); ++ } ++ } ++} ++ +--- ./jdk/test/javax/script/CommonSetup.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/script/CommonSetup.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -36,7 +36,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/javax/security/auth/Subject/doAs/Test.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/security/auth/Subject/doAs/Test.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -48,6 +48,11 @@ + FS="/" + RM="/bin/rm -f" + ;; ++ AIX ) ++ PS=":" ++ FS="/" ++ RM="/bin/rm -f" ++ ;; + CYGWIN* ) + PS=";" + FS="/" +--- ./jdk/test/javax/swing/JButton/JButtonPaintNPE/JButtonPaintNPE.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JButton/JButtonPaintNPE/JButtonPaintNPE.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,77 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++ ++import java.awt.Graphics; ++import java.awt.Toolkit; ++import java.awt.image.BufferedImage; ++import java.lang.reflect.InvocationTargetException; ++ ++import javax.swing.JButton; ++import javax.swing.JFrame; ++import javax.swing.SwingUtilities; ++ ++import sun.awt.SunToolkit; ++ ++/** ++ * @test ++ * @bug 8009919 ++ * @author Sergey Bylokhov ++ */ ++public final class JButtonPaintNPE { ++ ++ private static JFrame frame; ++ ++ public static void main(final String[] args) ++ throws InvocationTargetException, InterruptedException { ++ SwingUtilities.invokeAndWait(() -> { ++ frame = new JFrame(); ++ frame.add(new JButton() { ++ @Override ++ protected void paintComponent(final Graphics g) { ++ Graphics gg = new BufferedImage(getWidth(), getHeight(), ++ BufferedImage.TYPE_INT_ARGB).createGraphics(); ++ super.paintComponent(gg); ++ gg.dispose(); ++ } ++ }); ++ frame.setSize(300, 300); ++ frame.setLocationRelativeTo(null); ++ frame.setVisible(true); ++ }); ++ sleep(); ++ SwingUtilities.invokeAndWait(() -> { ++ if (frame != null) { ++ frame.dispose(); ++ } ++ }); ++ } ++ ++ private static void sleep() { ++ try { ++ ((SunToolkit) Toolkit.getDefaultToolkit()).realSync(); ++ Thread.sleep(1000); ++ } catch (final InterruptedException ignored) { ++ } ++ } ++} +--- ./jdk/test/javax/swing/JCheckBox/8032667/bug8032667.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JCheckBox/8032667/bug8032667.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ ++Verify that scaled components are rendered smoothly to image. ++ ++1. Run the test. ++2. Check that Selected and Deselected JCheckBox icons are drawn smoothly. ++If so, press PASS, else press FAIL. ++ ++ ++ ++ ++ +--- ./jdk/test/javax/swing/JCheckBox/8032667/bug8032667.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JCheckBox/8032667/bug8032667.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,91 @@ ++/* ++ * 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.awt.BorderLayout; ++import java.awt.Canvas; ++import java.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.Image; ++import java.awt.image.BufferedImage; ++import javax.swing.JApplet; ++import javax.swing.JCheckBox; ++import javax.swing.JComponent; ++import javax.swing.SwingUtilities; ++ ++/* @test ++ * @bug 8032667 ++ * @summary [macosx] Components cannot be rendered in HiDPI to BufferedImage ++ * @run applet/manual=yesno bug8032667.html ++ */ ++public class bug8032667 extends JApplet { ++ ++ static final int scale = 2; ++ static final int width = 130; ++ static final int height = 50; ++ static final int scaledWidth = scale * width; ++ static final int scaledHeight = scale * height; ++ ++ @Override ++ public void init() { ++ SwingUtilities.invokeLater(new Runnable() { ++ ++ @Override ++ public void run() { ++ ++ final Image image1 = getImage(getCheckBox("Deselected", false)); ++ final Image image2 = getImage(getCheckBox("Selected", true)); ++ ++ Canvas canvas = new Canvas() { ++ ++ @Override ++ public void paint(Graphics g) { ++ super.paint(g); ++ g.drawImage(image1, 0, 0, scaledWidth, scaledHeight, this); ++ g.drawImage(image2, 0, scaledHeight + 5, ++ scaledWidth, scaledHeight, this); ++ } ++ }; ++ ++ getContentPane().add(canvas, BorderLayout.CENTER); ++ } ++ }); ++ } ++ ++ static JCheckBox getCheckBox(String text, boolean selected) { ++ JCheckBox checkBox = new JCheckBox(text); ++ checkBox.setSelected(selected); ++ checkBox.setSize(new Dimension(width, height)); ++ return checkBox; ++ } ++ ++ static Image getImage(JComponent component) { ++ final BufferedImage image = new BufferedImage( ++ scaledWidth, scaledHeight, BufferedImage.TYPE_INT_ARGB); ++ final Graphics g = image.getGraphics(); ++ ((Graphics2D) g).scale(scale, scale); ++ component.paint(g); ++ g.dispose(); ++ ++ return image; ++ } ++} +--- ./jdk/test/javax/swing/JCheckBox/8032667/bug8032667_image_diff.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JCheckBox/8032667/bug8032667_image_diff.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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.awt.Dimension; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.Image; ++import java.awt.image.BufferedImage; ++import javax.swing.JCheckBox; ++import javax.swing.JComponent; ++import javax.swing.SwingUtilities; ++import sun.awt.OSInfo; ++ ++/* @test ++ * @bug 8032667 ++ * @summary [macosx] Components cannot be rendered in HiDPI to BufferedImage ++ * @run main bug8032667_image_diff ++ */ ++public class bug8032667_image_diff { ++ ++ static final int IMAGE_WIDTH = 130; ++ static final int IMAGE_HEIGHT = 50; ++ ++ public static void main(String[] args) throws Exception { ++ ++ if(!OSInfo.OSType.MACOSX.equals(OSInfo.getOSType())){ ++ return; ++ } ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ ++ JCheckBox checkBox = new JCheckBox(); ++ checkBox.setSelected(true); ++ checkBox.setSize(new Dimension(IMAGE_WIDTH, IMAGE_HEIGHT)); ++ ++ final BufferedImage image1 = getHiDPIImage(checkBox); ++ final BufferedImage image2 = getScaledImage(checkBox); ++ ++ if(equal(image1, image2)){ ++ throw new RuntimeException("2x image equals to non smooth image"); ++ } ++ } ++ }); ++ } ++ ++ static boolean equal(BufferedImage image1, BufferedImage image2) { ++ ++ int w = image1.getWidth(); ++ int h = image1.getHeight(); ++ ++ if (w != image2.getWidth() || h != image2.getHeight()) { ++ return false; ++ } ++ ++ for (int i = 0; i < w; i++) { ++ for (int j = 0; j < h; j++) { ++ int color1 = image1.getRGB(i, j); ++ int color2 = image2.getRGB(i, j); ++ ++ if (color1 != color2) { ++ return false; ++ } ++ } ++ } ++ return true; ++ } ++ ++ static BufferedImage getHiDPIImage(JComponent component) { ++ return getImage(component, 2, IMAGE_WIDTH, IMAGE_HEIGHT); ++ } ++ ++ static BufferedImage getScaledImage(JComponent component) { ++ Image image1x = getImage(component, 1, IMAGE_WIDTH, IMAGE_HEIGHT); ++ final BufferedImage image2x = new BufferedImage( ++ 2 * IMAGE_WIDTH, 2 * IMAGE_HEIGHT, BufferedImage.TYPE_INT_ARGB); ++ final Graphics g = image2x.getGraphics(); ++ ((Graphics2D) g).scale(2, 2); ++ g.drawImage(image1x, 0, 0, null); ++ g.dispose(); ++ return image2x; ++ } ++ ++ static BufferedImage getImage(JComponent component, int scale, int width, int height) { ++ final BufferedImage image = new BufferedImage( ++ scale * width, scale * height, BufferedImage.TYPE_INT_ARGB); ++ final Graphics g = image.getGraphics(); ++ ((Graphics2D) g).scale(scale, scale); ++ component.paint(g); ++ g.dispose(); ++ return image; ++ } ++} +--- ./jdk/test/javax/swing/JComboBox/8019180/Test8019180.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JComboBox/8019180/Test8019180.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,68 @@ ++/* ++ * 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.concurrent.CountDownLatch; ++import javax.swing.JComboBox; ++import javax.swing.JFrame; ++import javax.swing.SwingUtilities; ++ ++/* ++ * @test ++ * @bug 8019180 ++ * @summary Tests that combobox works if it is used as action listener ++ * @author Sergey Malenkov ++ */ ++ ++public class Test8019180 implements Runnable { ++ private static final CountDownLatch LATCH = new CountDownLatch(1); ++ private static final String[] ITEMS = {"First", "Second", "Third", "Fourth"}; ++ ++ public static void main(String[] args) throws InterruptedException { ++ SwingUtilities.invokeLater(new Test8019180()); ++ LATCH.await(); ++ } ++ ++ private JComboBox test; ++ ++ @Override ++ public void run() { ++ if (this.test == null) { ++ this.test = new JComboBox<>(ITEMS); ++ this.test.addActionListener(this.test); ++ JFrame frame = new JFrame(); ++ frame.add(test); ++ frame.pack(); ++ frame.setVisible(true); ++ SwingUtilities.invokeLater(this); ++ } else { ++ int index = this.test.getSelectedIndex(); ++ this.test.setSelectedIndex(1 + index); ++ if (0 > this.test.getSelectedIndex()) { ++ System.err.println("ERROR: no selection"); ++ System.exit(8019180); ++ } ++ SwingUtilities.getWindowAncestor(this.test).dispose(); ++ LATCH.countDown(); ++ } ++ } ++} +--- ./jdk/test/javax/swing/JComboBox/8032878/bug8032878.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JComboBox/8032878/bug8032878.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,136 @@ ++/* ++ * 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 8032878 ++ * @summary Checks that JComboBox as JTable cell editor processes key events ++ * even where setSurrendersFocusOnKeystroke flag in JTable is false and ++ * that it does not lose the first key press where the flag is true. ++ * @library ../../regtesthelpers ++ * @build Util ++ * @author Alexey Ivanov ++ */ ++ ++import java.awt.*; ++import java.awt.event.KeyEvent; ++import javax.swing.*; ++import javax.swing.text.JTextComponent; ++ ++import sun.awt.SunToolkit; ++ ++public class bug8032878 implements Runnable { ++ private static final String ONE = "one"; ++ private static final String TWO = "two"; ++ private static final String THREE = "three"; ++ ++ private static final String EXPECTED = "one123"; ++ ++ private final Robot robot; ++ ++ private JFrame frame; ++ private JComboBox cb; ++ ++ private volatile boolean surrender; ++ private volatile String text; ++ ++ public static void main(String[] args) throws Exception { ++ final bug8032878 test = new bug8032878(); ++ ++ test.test(false); ++ test.test(true); ++ } ++ ++ public bug8032878() throws AWTException { ++ robot = new Robot(); ++ robot.setAutoDelay(100); ++ } ++ ++ private void setupUI() { ++ frame = new JFrame(); ++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ ++ JTable table = new JTable(new String[][] {{ONE}, {TWO}, {THREE}}, ++ new String[] { "#"}); ++ table.setSurrendersFocusOnKeystroke(surrender); ++ ++ cb = new JComboBox(new String[]{ONE, TWO, THREE}); ++ cb.setEditable(true); ++ DefaultCellEditor comboEditor = new DefaultCellEditor(cb); ++ comboEditor.setClickCountToStart(1); ++ table.getColumnModel().getColumn(0).setCellEditor(comboEditor); ++ frame.add(table); ++ ++ frame.pack(); ++ frame.setVisible(true); ++ } ++ ++ private void test(final boolean flag) throws Exception { ++ try { ++ surrender = flag; ++ SwingUtilities.invokeAndWait(this); ++ ++ runTest(); ++ checkResult(); ++ } finally { ++ if (frame != null) { ++ frame.dispose(); ++ } ++ } ++ } ++ ++ private void runTest() throws Exception { ++ realSync(); ++ // Select 'one' ++ Util.hitKeys(robot, KeyEvent.VK_TAB); ++ realSync(); ++ Util.hitKeys(robot, KeyEvent.VK_1); ++ Util.hitKeys(robot, KeyEvent.VK_2); ++ Util.hitKeys(robot, KeyEvent.VK_3); ++ Util.hitKeys(robot, KeyEvent.VK_ENTER); ++ realSync(); ++ } ++ ++ private void checkResult() throws Exception { ++ SwingUtilities.invokeAndWait(new Runnable() { ++ public void run() { ++ text = ((JTextComponent) cb.getEditor().getEditorComponent()).getText(); ++ } ++ }); ++ if (text.equals(EXPECTED)) { ++ System.out.println("Test with surrender = " + surrender + " passed"); ++ } else { ++ System.out.println("Test with surrender = " + surrender + " failed"); ++ throw new RuntimeException("Expected value in JComboBox editor '" + ++ EXPECTED + "' but found '" + text + "'."); ++ } ++ } ++ ++ private static void realSync() { ++ ((SunToolkit) (Toolkit.getDefaultToolkit())).realSync(); ++ } ++ ++ @Override ++ public void run() { ++ setupUI(); ++ } ++} +--- ./jdk/test/javax/swing/JComboBox/ConsumedEscTest/ConsumedEscTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JComboBox/ConsumedEscTest/ConsumedEscTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,88 @@ ++/* ++ * 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 javax.swing.*; ++import java.awt.event.ActionEvent; ++import java.awt.event.KeyEvent; ++import java.awt.Robot; ++import java.awt.Toolkit; ++import sun.awt.SunToolkit; ++ ++/* ++ @test ++ @bug 8031485 ++ @summary Combo box consuming escape and enter key events ++ @author Petr Pchelko ++ @run main ConsumedEscTest ++*/ ++public class ConsumedEscTest { ++ private static volatile JFrame frame; ++ private static volatile boolean passed = false; ++ ++ public static void main(String... args) throws Exception { ++ try { ++ SwingUtilities.invokeAndWait(() -> { ++ frame = new JFrame(); ++ JComboBox combo = new JComboBox<>(new String[]{"one", "two", "three"}); ++ JPanel panel = new JPanel(); ++ panel.add(combo); ++ combo.requestFocusInWindow(); ++ frame.setBounds(100, 150, 300, 100); ++ addAction(panel); ++ frame.add(panel); ++ frame.setVisible(true); ++ }); ++ ++ Robot robot = new Robot(); ++ robot.waitForIdle(); ++ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); ++ robot.keyPress(KeyEvent.VK_ESCAPE); ++ robot.waitForIdle(); ++ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); ++ robot.keyRelease(KeyEvent.VK_ESCAPE); ++ robot.waitForIdle(); ++ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); ++ if (!passed) { ++ throw new RuntimeException("FAILED: ESC was consumed by combo box"); ++ } ++ } finally { ++ if (frame != null) { ++ frame.dispose(); ++ } ++ } ++ } ++ ++ private static void addAction(JComponent comp) { ++ KeyStroke k = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); ++ Object actionKey = "cancel"; ++ comp.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(k, actionKey); ++ Action cancelAction = new AbstractAction() { ++ @Override ++ public void actionPerformed(ActionEvent ev) { ++ passed = true; ++ } ++ }; ++ comp.getActionMap().put(actionKey, cancelAction); ++ } ++ ++} +--- ./jdk/test/javax/swing/JDialog/WrongBackgroundColor/WrongBackgroundColor.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JDialog/WrongBackgroundColor/WrongBackgroundColor.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,62 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * 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.awt.Color; ++import java.lang.reflect.InvocationTargetException; ++ ++import javax.swing.JDialog; ++import javax.swing.JFrame; ++import javax.swing.SwingUtilities; ++import javax.swing.UIDefaults; ++import javax.swing.UIManager; ++import javax.swing.plaf.ColorUIResource; ++ ++/** ++ * @test ++ * @bug 8033786 ++ * @summary JDialog should update background color of the native peer. ++ * @author Sergey Bylokhov ++ */ ++public final class WrongBackgroundColor { ++ ++ public static void main(final String[] args) ++ throws InvocationTargetException, InterruptedException { ++ SwingUtilities.invokeAndWait(() -> { ++ UIDefaults ui = UIManager.getDefaults(); ++ ui.put("control", new ColorUIResource(54, 54, 54)); ++ final JDialog dialog = new JDialog(); ++ final JFrame frame = new JFrame(); ++ frame.pack(); ++ dialog.pack(); ++ final Color dialogBackground = dialog.getBackground(); ++ final Color frameBackground = frame.getBackground(); ++ frame.dispose(); ++ dialog.dispose(); ++ if (!dialogBackground.equals(frameBackground)) { ++ System.err.println("Expected:" + frameBackground); ++ System.err.println("Actual:" + dialogBackground); ++ throw new RuntimeException("Wrong background color"); ++ } ++ }); ++ } ++} +--- ./jdk/test/javax/swing/JFrame/HangNonVolatileBuffer/HangNonVolatileBuffer.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JFrame/HangNonVolatileBuffer/HangNonVolatileBuffer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,53 @@ ++/* ++ * 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.lang.reflect.InvocationTargetException; ++ ++import javax.swing.JFrame; ++import javax.swing.SwingUtilities; ++ ++/** ++ * @test ++ * @bug 8029455 ++ * @summary Swing should not hang if non-volatile image is used as a backbuffer. ++ * @run main/othervm -Dswing.volatileImageBufferEnabled=false HangNonVolatileBuffer ++ */ ++public final class HangNonVolatileBuffer { ++ ++ private static JFrame f; ++ ++ public static void main(final String[] args) ++ throws InvocationTargetException, InterruptedException { ++ SwingUtilities.invokeAndWait(() -> { ++ f = new JFrame("JFrame"); ++ f.setSize(300, 300); ++ f.setLocationRelativeTo(null); ++ f.setVisible(true); ++ }); ++ SwingUtilities.invokeAndWait(() -> { ++ // flush the EDT ++ }); ++ Thread.sleep(1000); ++ SwingUtilities.invokeAndWait(f::dispose); ++ } ++} +--- ./jdk/test/javax/swing/JMenuItem/8031573/bug8031573.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JMenuItem/8031573/bug8031573.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,40 @@ ++ ++ ++ ++ ++ ++Verify that high resolution system icons are used JCheckBoxMenuItem ++on HiDPI displays. ++ ++If the display does not support HiDPI mode press PASS. ++ ++1. Run the test on HiDPI Display. ++2. Press the Menu in the applet ++3. Check that the icon on the JCheckBoxMenuItem is smooth ++If so, press PASS, else press FAIL. ++ ++ ++ ++ ++ +--- ./jdk/test/javax/swing/JMenuItem/8031573/bug8031573.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JMenuItem/8031573/bug8031573.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++import java.awt.FlowLayout; ++import javax.swing.JApplet; ++import javax.swing.JCheckBoxMenuItem; ++import javax.swing.JMenu; ++import javax.swing.JMenuBar; ++import javax.swing.SwingUtilities; ++ ++/* @test ++ * @bug 8031573 ++ * @summary [macosx] Checkmarks of JCheckBoxMenuItems aren't rendered ++ * in high resolution on Retina ++ * @author Alexander Scherbatiy ++ * @run applet/manual=yesno bug8031573.html ++ */ ++public class bug8031573 extends JApplet { ++ ++ @Override ++ public void init() { ++ try { ++ SwingUtilities.invokeAndWait(new Runnable() { ++ ++ @Override ++ public void run() { ++ JMenuBar bar = new JMenuBar(); ++ JMenu menu = new JMenu("Menu"); ++ JCheckBoxMenuItem checkBoxMenuItem ++ = new JCheckBoxMenuItem("JCheckBoxMenuItem"); ++ checkBoxMenuItem.setSelected(true); ++ menu.add(checkBoxMenuItem); ++ bar.add(menu); ++ setJMenuBar(bar); ++ } ++ }); ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ } ++} +--- ./jdk/test/javax/swing/JOptionPane/8024926/bug8024926.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JOptionPane/8024926/bug8024926.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,32 @@ ++ ++ ++ ++ ++ High resolution icon test, bug ID 8024926 ++ ++ ++ ++

    See the dialog box (usually in upper left corner) for instructions

    ++ ++ +--- ./jdk/test/javax/swing/JOptionPane/8024926/bug8024926.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JOptionPane/8024926/bug8024926.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,209 @@ ++/* ++ * Copyright (c) 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. ++ */ ++import java.awt.BorderLayout; ++import java.awt.Dialog; ++import java.awt.EventQueue; ++import java.awt.Frame; ++import java.awt.TextArea; ++import javax.swing.JApplet; ++import javax.swing.JOptionPane; ++import sun.awt.OSInfo; ++ ++/** ++ * @test ++ * @bug 8024926 ++ * @summary [macosx] AquaIcon HiDPI support ++ * @author Alexander Scherbatiy ++ * @run applet/manual=yesno bug8024926.html ++ */ ++public class bug8024926 extends JApplet { ++ //Declare things used in the test, like buttons and labels here ++ ++ public void init() { ++ //Create instructions for the user here, as well as set up ++ // the environment -- set the layout manager, add buttons, ++ // etc. ++ this.setLayout(new BorderLayout()); ++ ++ ++ if (OSInfo.getOSType().equals(OSInfo.OSType.MACOSX)) { ++ String[] instructions = { ++ "Verify that high resolution system icons are used" ++ + " in JOptionPane on HiDPI displays.", ++ "1) Run the test on Retina display or enable the Quartz Debug" ++ + " and select the screen resolution with (HiDPI) label", ++ "2) Check that the error icon on the JOptionPane is smooth", ++ "If so, press PASS, else press FAIL." ++ }; ++ Sysout.createDialogWithInstructions(instructions); ++ ++ } else { ++ String[] instructions = { ++ "This test is not applicable to the current platform. Press PASS." ++ }; ++ Sysout.createDialogWithInstructions(instructions); ++ } ++ ++ ++ }//End init() ++ ++ public void start() { ++ //Get things going. Request focus, set size, et cetera ++ setSize(200, 200); ++ setVisible(true); ++ validate(); ++ EventQueue.invokeLater(new Runnable() { ++ ++ public void run() { ++ createAndShowGUI(); ++ } ++ }); ++ }// start() ++ ++ //The rest of this class is the actions which perform the test... ++ //Use Sysout.println to communicate with the user NOT System.out!! ++ //Sysout.println ("Something Happened!"); ++ private static void createAndShowGUI() { ++ JOptionPane.showMessageDialog(null, ++ "Icons should have high resolution.", ++ "High resolution icon test.", ++ JOptionPane.ERROR_MESSAGE); ++ } ++}// class BlockedWindowTest ++ ++/* Place other classes related to the test after this line */ ++/** ++ * ************************************************** ++ * Standard Test Machinery DO NOT modify anything below -- it's a standard chunk ++ * of code whose purpose is to make user interaction uniform, and thereby make ++ * it simpler to read and understand someone else's test. ++ * ************************************************** ++ */ ++/** ++ * This is part of the standard test machinery. It creates a dialog (with the ++ * instructions), and is the interface for sending text messages to the user. To ++ * print the instructions, send an array of strings to Sysout.createDialog ++ * WithInstructions method. Put one line of instructions per array entry. To ++ * display a message for the tester to see, simply call Sysout.println with the ++ * string to be displayed. This mimics System.out.println but works within the ++ * test harness as well as standalone. ++ */ ++class Sysout { ++ ++ private static TestDialog dialog; ++ ++ public static void createDialogWithInstructions(String[] instructions) { ++ dialog = new TestDialog(new Frame(), "Instructions"); ++ dialog.printInstructions(instructions); ++ dialog.setVisible(true); ++ println("Any messages for the tester will display here."); ++ } ++ ++ public static void createDialog() { ++ dialog = new TestDialog(new Frame(), "Instructions"); ++ String[] defInstr = {"Instructions will appear here. ", ""}; ++ dialog.printInstructions(defInstr); ++ dialog.setVisible(true); ++ println("Any messages for the tester will display here."); ++ } ++ ++ public static void printInstructions(String[] instructions) { ++ dialog.printInstructions(instructions); ++ } ++ ++ public static void println(String messageIn) { ++ dialog.displayMessage(messageIn); ++ } ++}// Sysout class ++ ++/** ++ * This is part of the standard test machinery. It provides a place for the test ++ * instructions to be displayed, and a place for interactive messages to the ++ * user to be displayed. To have the test instructions displayed, see Sysout. To ++ * have a message to the user be displayed, see Sysout. Do not call anything in ++ * this dialog directly. ++ */ ++class TestDialog extends Dialog { ++ ++ TextArea instructionsText; ++ TextArea messageText; ++ int maxStringLength = 80; ++ ++ //DO NOT call this directly, go through Sysout ++ public TestDialog(Frame frame, String name) { ++ super(frame, name); ++ int scrollBoth = TextArea.SCROLLBARS_BOTH; ++ instructionsText = new TextArea("", 15, maxStringLength, scrollBoth); ++ add("North", instructionsText); ++ ++ messageText = new TextArea("", 5, maxStringLength, scrollBoth); ++ add("Center", messageText); ++ ++ pack(); ++ ++ setVisible(true); ++ }// TestDialog() ++ ++ //DO NOT call this directly, go through Sysout ++ public void printInstructions(String[] instructions) { ++ //Clear out any current instructions ++ instructionsText.setText(""); ++ ++ //Go down array of instruction strings ++ ++ String printStr, remainingStr; ++ for (int i = 0; i < instructions.length; i++) { ++ //chop up each into pieces maxSringLength long ++ remainingStr = instructions[ i]; ++ while (remainingStr.length() > 0) { ++ //if longer than max then chop off first max chars to print ++ if (remainingStr.length() >= maxStringLength) { ++ //Try to chop on a word boundary ++ int posOfSpace = remainingStr.lastIndexOf(' ', maxStringLength - 1); ++ ++ if (posOfSpace <= 0) { ++ posOfSpace = maxStringLength - 1; ++ } ++ ++ printStr = remainingStr.substring(0, posOfSpace + 1); ++ remainingStr = remainingStr.substring(posOfSpace + 1); ++ } //else just print ++ else { ++ printStr = remainingStr; ++ remainingStr = ""; ++ } ++ ++ instructionsText.append(printStr + "\n"); ++ ++ }// while ++ ++ }// for ++ ++ }//printInstructions() ++ ++ //DO NOT call this directly, go through Sysout ++ public void displayMessage(String messageIn) { ++ messageText.append(messageIn + "\n"); ++ System.out.println(messageIn); ++ } ++}// TestDialog class +--- ./jdk/test/javax/swing/JPopupMenu/7154841/bug7154841.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JPopupMenu/7154841/bug7154841.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,121 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ @test ++ @bug 7154841 ++ @summary JPopupMenu is overlapped by a Dock on Mac OS X ++ @author Petr Pchelko ++ */ ++ ++import sun.awt.OSInfo; ++import sun.awt.SunToolkit; ++ ++import java.awt.*; ++import javax.swing.*; ++import java.awt.event.MouseEvent; ++import java.awt.event.MouseMotionAdapter; ++import java.util.concurrent.atomic.AtomicReference; ++ ++public class bug7154841 { ++ ++ private static final int STEP = 10; ++ ++ private static volatile boolean passed = false; ++ private static JFrame frame; ++ private static JPopupMenu popupMenu; ++ private static AtomicReference screenBounds = new AtomicReference<>(); ++ ++ private static void initAndShowUI() { ++ popupMenu = new JPopupMenu(); ++ for (int i = 0; i < 100; i++) { ++ JRadioButtonMenuItem item = new JRadioButtonMenuItem(" Test " + i); ++ item.addMouseMotionListener(new MouseMotionAdapter() { ++ @Override ++ public void mouseMoved(MouseEvent e) { ++ passed = true; ++ } ++ }); ++ popupMenu.add(item); ++ } ++ ++ frame = new JFrame(); ++ screenBounds.set(getScreenBounds()); ++ frame.setBounds(screenBounds.get()); ++ frame.setVisible(true); ++ } ++ ++ public static void main(String[] args) throws Exception { ++ if (OSInfo.getOSType() != OSInfo.OSType.MACOSX) { ++ return; // Test only for Mac OS X ++ } ++ ++ try { ++ Robot r = new Robot(); ++ r.setAutoDelay(100); ++ r.setAutoWaitForIdle(true); ++ r.mouseMove(0, 0); ++ ++ SwingUtilities.invokeAndWait(bug7154841::initAndShowUI); ++ ++ sleep(); ++ ++ SwingUtilities.invokeAndWait(() -> { ++ popupMenu.show(frame, frame.getX() + frame.getWidth() / 2, frame.getY() + frame.getHeight() / 2); ++ }); ++ ++ sleep(); ++ ++ int y = (int)screenBounds.get().getY() + (int)screenBounds.get().getHeight() - 10; ++ int center = (int)(screenBounds.get().getX() + screenBounds.get().getWidth() / 2); ++ for (int x = center - 10 * STEP; x < center + 10 * STEP; x += STEP) { ++ r.mouseMove(x, y); ++ } ++ ++ if (!passed) { ++ throw new RuntimeException("Failed: no mouse events on the popup menu"); ++ } ++ } finally { ++ SwingUtilities.invokeLater(() -> { ++ if (frame != null) { ++ frame.dispose(); ++ } ++ }); ++ } ++ } ++ ++ public static Rectangle getScreenBounds() { ++ return GraphicsEnvironment ++ .getLocalGraphicsEnvironment() ++ .getDefaultScreenDevice() ++ .getDefaultConfiguration() ++ .getBounds(); ++ } ++ ++ private static void sleep() { ++ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync(); ++ try { ++ Thread.sleep(200); ++ } catch (InterruptedException ignored) { } ++ } ++} +--- ./jdk/test/javax/swing/JScrollBar/8039464/Test8039464.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JScrollBar/8039464/Test8039464.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,32 @@ ++ ++ ++ ++ ++Choose the variable applet size and try to resize the applet. ++The test passes the thumb is painted correctly. ++ ++ ++ ++ ++ +--- ./jdk/test/javax/swing/JScrollBar/8039464/Test8039464.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JScrollBar/8039464/Test8039464.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,92 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.awt.Container; ++import java.awt.Dimension; ++import java.awt.GridBagConstraints; ++import java.awt.GridBagLayout; ++ ++import javax.swing.JApplet; ++import javax.swing.JFrame; ++import javax.swing.JLabel; ++import javax.swing.JScrollBar; ++import javax.swing.SwingUtilities; ++import javax.swing.UIManager; ++ ++/* ++ * @test ++ * @bug 8039464 ++ * @summary Tests enabling/disabling of titled border's caption ++ * @author Sergey Malenkov ++ * @run applet/manual=yesno Test8039464.html ++ */ ++ ++public class Test8039464 extends JApplet { ++ static { ++ try { ++ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); ++ } catch (Exception exception) { ++ throw new Error("unexpected", exception); ++ } ++ } ++ ++ @Override ++ public void init() { ++ init(this); ++ } ++ ++ private static void init(Container container) { ++ container.setLayout(new GridBagLayout()); ++ GridBagConstraints gbc = new GridBagConstraints(); ++ gbc.fill = GridBagConstraints.BOTH; ++ gbc.gridx = 0; ++ gbc.gridy = 1; ++ JLabel label = new JLabel(); ++ Dimension size = new Dimension(111, 0); ++ label.setPreferredSize(size); ++ label.setMinimumSize(size); ++ container.add(label, gbc); ++ gbc.gridx = 1; ++ gbc.weightx = 1; ++ container.add(new JScrollBar(JScrollBar.HORIZONTAL, 1, 111, 1, 1111), gbc); ++ gbc.gridx = 2; ++ gbc.gridy = 0; ++ gbc.weightx = 0; ++ gbc.weighty = 1; ++ container.add(new JScrollBar(JScrollBar.VERTICAL, 1, 111, 1, 1111), gbc); ++ } ++ ++ public static void main(String[] args) throws Exception { ++ SwingUtilities.invokeLater(new Runnable() { ++ @Override ++ public void run() { ++ JFrame frame = new JFrame("8039464"); ++ init(frame); ++ frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); ++ frame.pack(); ++ frame.setLocationRelativeTo(null); ++ frame.setVisible(true); ++ } ++ }); ++ } ++} +--- ./jdk/test/javax/swing/JSlider/6794831/bug6794831.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/swing/JSlider/6794831/bug6794831.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -31,18 +31,20 @@ + import javax.swing.*; + import javax.swing.plaf.basic.BasicSliderUI; + import java.awt.image.BufferedImage; ++import java.lang.reflect.InvocationTargetException; + import java.util.concurrent.CountDownLatch; + import java.util.concurrent.TimeUnit; + + public class bug6794831 { + private final CountDownLatch countDownLatch = new CountDownLatch(1); + +- public static void main(String args[]) throws InterruptedException { ++ public static void main(String args[]) ++ throws InterruptedException, InvocationTargetException { + new bug6794831().run(); + } + +- private void run() throws InterruptedException { +- SwingUtilities.invokeLater(new Runnable() { ++ private void run() throws InterruptedException, InvocationTargetException { ++ SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + for (UIManager.LookAndFeelInfo lookAndFeelInfo : UIManager.getInstalledLookAndFeels()) { + try { +--- ./jdk/test/javax/swing/JTabbedPane/8007563/Test8007563.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JTabbedPane/8007563/Test8007563.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,124 @@ ++/* ++ * 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.awt.Color; ++import java.awt.Point; ++import java.awt.Robot; ++import java.util.ArrayList; ++import java.util.concurrent.CountDownLatch; ++import javax.swing.JFrame; ++import javax.swing.JLabel; ++import javax.swing.JTabbedPane; ++ ++import static javax.swing.UIManager.*; ++import static javax.swing.SwingUtilities.*; ++ ++/* ++ * @test ++ * @bug 8007563 ++ * @summary Tests JTabbedPane background ++ * @author Sergey Malenkov ++ */ ++ ++public class Test8007563 implements Runnable { ++ private static final ArrayList LIST = new ArrayList<>(); ++ private static final LookAndFeelInfo[] INFO = getInstalledLookAndFeels(); ++ private static final CountDownLatch LATCH = new CountDownLatch(INFO.length); ++ private static Robot ROBOT; ++ ++ public static void main(String[] args) throws Exception { ++ ROBOT = new Robot(); ++ invokeLater(new Test8007563()); ++ LATCH.await(); ++ if (!LIST.isEmpty()) { ++ throw new Error(LIST.toString()); ++ } ++ } ++ ++ private static void addOpaqueError(boolean opaque) { ++ LIST.add(getLookAndFeel().getName() + " opaque=" + opaque); ++ } ++ ++ private static boolean updateLookAndFeel() { ++ int index = (int) LATCH.getCount() - 1; ++ if (index >= 0) { ++ try { ++ LookAndFeelInfo info = INFO[index]; ++ System.err.println("L&F: " + info.getName()); ++ setLookAndFeel(info.getClassName()); ++ return true; ++ } catch (Exception exception) { ++ exception.printStackTrace(); ++ } ++ } ++ return false; ++ } ++ ++ private JFrame frame; ++ private JTabbedPane pane; ++ ++ public void run() { ++ if (this.frame == null) { ++ if (!updateLookAndFeel()) { ++ return; ++ } ++ this.pane = new JTabbedPane(); ++ this.pane.setOpaque(false); ++ this.pane.setBackground(Color.RED); ++ for (int i = 0; i < 3; i++) { ++ this.pane.addTab("Tab " + i, new JLabel("Content area " + i)); ++ } ++ this.frame = new JFrame(getClass().getSimpleName()); ++ this.frame.getContentPane().setBackground(Color.BLUE); ++ this.frame.add(this.pane); ++ this.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); ++ this.frame.setSize(400, 200); ++ this.frame.setLocationRelativeTo(null); ++ this.frame.setVisible(true); ++ } else { ++ Point point = new Point(this.pane.getWidth() - 2, 2); ++ convertPointToScreen(point, this.pane); ++ Color actual = ROBOT.getPixelColor(point.x, point.y); ++ ++ boolean opaque = this.pane.isOpaque(); ++ Color expected = opaque ++ ? this.pane.getBackground() ++ : this.frame.getContentPane().getBackground(); ++ ++ if (!expected.equals(actual)){ ++ addOpaqueError(opaque); ++ } ++ if (!opaque) { ++ this.pane.setOpaque(true); ++ this.pane.repaint(); ++ } else { ++ this.frame.dispose(); ++ this.frame = null; ++ this.pane = null; ++ LATCH.countDown(); ++ } ++ ++ } ++ invokeLater(this); ++ } ++} +--- ./jdk/test/javax/swing/JTable/8031971/bug8031971.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JTable/8031971/bug8031971.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,88 @@ ++/* ++ * 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.Date; ++import java.util.Hashtable; ++import javax.swing.Icon; ++import javax.swing.ImageIcon; ++import javax.swing.JTable; ++import javax.swing.SwingUtilities; ++ ++/** ++ * @test ++ * @bug 8031971 8039750 ++ * @author Alexander Scherbatiy ++ * @summary Use only public methods in the SwingLazyValue ++ * @run main bug8031971 ++ */ ++public class bug8031971 { ++ ++ static Object[][] RENDERERS = { ++ {Object.class, "javax.swing.table.DefaultTableCellRenderer$UIResource"}, ++ {Number.class, "javax.swing.JTable$NumberRenderer"}, ++ {Float.class, "javax.swing.JTable$DoubleRenderer"}, ++ {Double.class, "javax.swing.JTable$DoubleRenderer"}, ++ {Date.class, "javax.swing.JTable$DateRenderer"}, ++ {Icon.class, "javax.swing.JTable$IconRenderer"}, ++ {ImageIcon.class, "javax.swing.JTable$IconRenderer"}, ++ {Boolean.class, "javax.swing.JTable$BooleanRenderer"} ++ }; ++ ++ static Object[][] EDITORS = { ++ {Object.class, "javax.swing.JTable$GenericEditor"}, ++ {Number.class, "javax.swing.JTable$NumberEditor"}, ++ {Boolean.class, "javax.swing.JTable$BooleanEditor"} ++ }; ++ ++ public static void main(String[] args) throws Exception { ++ ++ SwingUtilities.invokeAndWait(() -> { ++ ++ TestTable table = new TestTable(); ++ test(table.getDefaultRenderersByColumnClass(), RENDERERS); ++ test(table.getDefaultEditorsByColumnClass(), EDITORS); ++ }); ++ } ++ ++ static void test(Hashtable table, Object[][] values) { ++ for (int i = 0; i < values.length; i++) { ++ test(table.get(values[i][0]), (String) values[i][1]); ++ } ++ } ++ ++ static void test(Object obj, String className) { ++ if (!obj.getClass().getCanonicalName().equals(className.replace('$', '.'))) { ++ throw new RuntimeException("Wrong value!"); ++ } ++ } ++ ++ static class TestTable extends JTable { ++ ++ Hashtable getDefaultRenderersByColumnClass() { ++ return defaultRenderersByColumnClass; ++ } ++ ++ Hashtable getDefaultEditorsByColumnClass() { ++ return defaultEditorsByColumnClass; ++ } ++ } ++} +--- ./jdk/test/javax/swing/JTable/8032874/bug8032874.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JTable/8032874/bug8032874.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,145 @@ ++/* ++ * 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 8032874 ++ * @summary Test whether ArrayIndexOutOfBoundsException is thrown or not, ++ * once selected row is removed from JTable with Sorter and Filter ++ * @author Dmitry Markov ++ * @run main bug8032874 ++ */ ++ ++import java.awt.*; ++import java.util.ArrayList; ++import java.util.List; ++ ++import javax.swing.*; ++import javax.swing.table.AbstractTableModel; ++import javax.swing.table.TableRowSorter; ++ ++import sun.awt.SunToolkit; ++ ++public class bug8032874 { ++ private static final int ROW_COUNT = 5; ++ private static JTable table; ++ private static TestTableModel tableModel; ++ ++ public static void main(String args[]) throws Exception { ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ createAndShowUI(); ++ } ++ }); ++ toolkit.realSync(); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ table.getRowSorter().toggleSortOrder(0); ++ table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); ++ table.setRowSelectionInterval(1, 2); ++ } ++ }); ++ toolkit.realSync(); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ for (int i = 0; i < ROW_COUNT; i++) { ++ tableModel.remove(0); ++ table.getRowSorter().toggleSortOrder(0); ++ } ++ } ++ }); ++ } ++ ++ public static void createAndShowUI() { ++ try { ++ UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); ++ } catch (Exception e) { ++ throw new RuntimeException(e); ++ } ++ ++ JFrame frame = new JFrame("bug8032874"); ++ frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); ++ ++ JPanel panel = new JPanel(); ++ panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); ++ ++ tableModel = new TestTableModel(); ++ table = new JTable(tableModel); ++ table.setSurrendersFocusOnKeystroke(true); ++ ++ final TableRowSorter rowSorter = new TableRowSorter(tableModel); ++ rowSorter.setRowFilter(new RowFilter() { ++ @Override ++ public boolean include(Entry entry) { ++ return entry.getIdentifier() % 2 == 0; ++ } ++ }); ++ table.setRowSorter(rowSorter); ++ ++ JScrollPane jScrollPane = new JScrollPane(table); ++ panel.add(jScrollPane); ++ ++ frame.setContentPane(panel); ++ frame.setSize(new Dimension(800, 600)); ++ frame.setVisible(true); ++ } ++ ++ private static class TestTableModel extends AbstractTableModel { ++ private final List data; ++ ++ public TestTableModel() { ++ data = new ArrayList(); ++ ++ for (int i = 0; i < ROW_COUNT; i++) { ++ data.add(i); ++ } ++ } ++ ++ @Override ++ public int getRowCount() { ++ return data.size(); ++ } ++ ++ @Override ++ public int getColumnCount() { ++ return 1; ++ } ++ ++ @Override ++ public Object getValueAt(int rowIndex, int columnIndex) { ++ return data.get(rowIndex); ++ } ++ ++ public void remove(int row) { ++ data.remove(row); ++ fireTableRowsDeleted(row, row); ++ } ++ } ++} ++ +--- ./jdk/test/javax/swing/JTextField/8036819/bug8036819.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JTextField/8036819/bug8036819.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,132 @@ ++/* ++ * 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 ++ * @library ../../regtesthelpers ++ * @build Util ++ * @bug 8036819 ++ * @summary JAB: mnemonics not read for textboxes ++ * @author Vivi An ++ * @run main bug8036819 ++ */ ++ ++import javax.swing.*; ++import javax.swing.event.*; ++import java.awt.event.*; ++import java.awt.*; ++import sun.awt.SunToolkit; ++import javax.accessibility.*; ++ ++public class bug8036819 { ++ ++ public static volatile Boolean passed = false; ++ ++ public static void main(String args[]) throws Throwable { ++ SwingUtilities.invokeAndWait(new Runnable() { ++ public void run() { ++ createAndShowGUI(); ++ } ++ }); ++ ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ toolkit.realSync(); ++ ++ Robot robo = new Robot(); ++ robo.setAutoDelay(300); ++ ++ // Using mnemonic key to focus on the textfield ++ Util.hitMnemonics(robo, KeyEvent.VK_P); ++ toolkit.realSync(); ++ ++ if (!passed){ ++ throw new RuntimeException("Test failed."); ++ } ++ } ++ ++ private static void createAndShowGUI() { ++ JFrame mainFrame = new JFrame("bug 8036819"); ++ ++ JLabel usernameLabel = new JLabel("Username: "); ++ JTextField usernameField = new JTextField(20); ++ usernameLabel.setDisplayedMnemonic(KeyEvent.VK_U); ++ usernameLabel.setLabelFor(usernameField); ++ ++ JLabel pwdLabel = new JLabel("Password: "); ++ JTextField pwdField = new JTextField(20); ++ pwdLabel.setDisplayedMnemonic(KeyEvent.VK_P); ++ pwdLabel.setLabelFor(pwdField); ++ ++ pwdField.addKeyListener( ++ new KeyListener(){ ++ @Override ++ public void keyPressed(KeyEvent keyEvent) { ++ } ++ ++ @Override ++ public void keyTyped(KeyEvent keyEvent) { ++ } ++ ++ @Override ++ public void keyReleased(KeyEvent keyEvent){ ++ JComponent comp = (JComponent) pwdField; ++ AccessibleContext ac = comp.getAccessibleContext(); ++ AccessibleExtendedComponent aec = (AccessibleExtendedComponent)ac.getAccessibleComponent(); ++ AccessibleKeyBinding akb = aec.getAccessibleKeyBinding(); ++ if (akb != null){ ++ int count = akb.getAccessibleKeyBindingCount(); ++ if (count != 1){ ++ passed = false; ++ return; ++ } ++ ++ // there is 1 accessible key for the text field ++ System.out.println("Retrieved AccessibleKeyBinding for textfield " + count); ++ ++ // the key code is KeyEvent.VK_P ++ Object o = akb.getAccessibleKeyBinding(0); ++ if (o instanceof KeyStroke){ ++ javax.swing.KeyStroke key = (javax.swing.KeyStroke)o; ++ System.out.println("keystroke is " + key.getKeyCode()); ++ if (key.getKeyCode() == KeyEvent.VK_P) ++ passed = true; ++ } ++ } ++ } ++ } ++ ); ++ ++ mainFrame.getContentPane().add(usernameLabel); ++ mainFrame.getContentPane().add(usernameField); ++ mainFrame.getContentPane().add(pwdLabel); ++ mainFrame.getContentPane().add(pwdField); ++ ++ mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ mainFrame.setLayout(new FlowLayout(FlowLayout.LEFT)); ++ ++ mainFrame.setSize(200, 200); ++ mainFrame.setLocation(200, 200); ++ mainFrame.setVisible(true); ++ mainFrame.toFront(); ++ } ++ } +--- ./jdk/test/javax/swing/JTree/8038113/bug8038113.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JTree/8038113/bug8038113.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ ++Verify that scaled icons are rendered smoothly. ++ ++1. Run the test. ++2. Check that Collapsed and Expanded JTree icons are drawn smoothly. ++If so, press PASS, else press FAIL. ++ ++ ++ ++ ++ +--- ./jdk/test/javax/swing/JTree/8038113/bug8038113.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/JTree/8038113/bug8038113.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,82 @@ ++/* ++ * 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.awt.BasicStroke; ++import java.awt.BorderLayout; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import javax.swing.Icon; ++import javax.swing.JApplet; ++import javax.swing.JPanel; ++import javax.swing.JTree; ++import javax.swing.SwingUtilities; ++import javax.swing.plaf.basic.BasicTreeUI; ++ ++/* @test ++ * @bug 8038113 ++ * @summary [macosx] JTree icon is not rendered in high resolution on Retina ++ * @run applet/manual=yesno bug8038113.html ++ */ ++public class bug8038113 extends JApplet { ++ ++ @Override ++ public void init() { ++ SwingUtilities.invokeLater(new Runnable() { ++ ++ @Override ++ public void run() { ++ ++ final JTree tree = new JTree(); ++ final BasicTreeUI treeUI = (BasicTreeUI) tree.getUI(); ++ ++ final JPanel panel = new JPanel() { ++ ++ @Override ++ public void paint(Graphics g) { ++ super.paint(g); ++ Graphics2D g2 = (Graphics2D) g; ++ g2.setStroke(new BasicStroke(0.5f)); ++ g2.scale(2, 2); ++ ++ int x = 10; ++ int y = 10; ++ Icon collapsedIcon = treeUI.getCollapsedIcon(); ++ Icon expandeIcon = treeUI.getExpandedIcon(); ++ int w = collapsedIcon.getIconWidth(); ++ int h = collapsedIcon.getIconHeight(); ++ collapsedIcon.paintIcon(this, g, x, y); ++ g.drawRect(x, y, w, h); ++ ++ y += 10 + h; ++ w = expandeIcon.getIconWidth(); ++ h = expandeIcon.getIconHeight(); ++ expandeIcon.paintIcon(this, g, x, y); ++ g.drawRect(x, y, w, h); ++ ++ } ++ }; ++ getContentPane().setLayout(new BorderLayout()); ++ getContentPane().add(panel, BorderLayout.CENTER); ++ } ++ }); ++ } ++} +--- ./jdk/test/javax/swing/PopupFactory/8048506/bug8048506.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/PopupFactory/8048506/bug8048506.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,65 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8048506 ++ * @summary Tests that popup with null-owner does not throw NPE ++ * @author Dmitry Markov ++ */ ++ ++import javax.swing.*; ++import javax.swing.plaf.metal.MetalLookAndFeel; ++ ++public class bug8048506 { ++ ++ public static void main(String[] args) throws Exception { ++ UIManager.setLookAndFeel(new MetalLookAndFeel()); ++ ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ createAndShowGUI(); ++ } ++ }); ++ System.out.println("The test passed"); ++ } ++ ++ private static void createAndShowGUI() { ++ JFrame frame = new JFrame("bug8048506"); ++ frame.setSize(400, 400); ++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ++ frame.setVisible(true); ++ ++ PopupFactory factory = PopupFactory.getSharedInstance(); ++ ++ // Create and show popup with owner ++ Popup popup1 = factory.getPopup(frame, new JLabel("Popup with owner"), 100, 100); ++ popup1.show(); ++ ++ //Create and show popup without owner ++ Popup popup2 = factory.getPopup(null, new JLabel("Popup without owner"), 200, 200); ++ popup2.show(); ++ } ++} ++ +--- ./jdk/test/javax/swing/SwingUtilities/8032219/DrawRect.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/SwingUtilities/8032219/DrawRect.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,124 @@ ++/* ++ * 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 sun.swing.SwingUtilities2; ++ ++import java.awt.Color; ++import java.awt.Graphics2D; ++import java.awt.Rectangle; ++import java.awt.image.BufferedImage; ++import java.io.File; ++import java.io.IOException; ++ ++import javax.imageio.ImageIO; ++ ++/** ++ * @test ++ * @bug 8032219 ++ * @author Sergey Bylokhov ++ */ ++public final class DrawRect { ++ ++ private static final int size = 50; ++ ++ private static final Rectangle[] rects = { ++ new Rectangle(0, 0, 1, 1), ++ new Rectangle(0, 0, 1, 2), ++ new Rectangle(0, 0, 2, 1), ++ new Rectangle(10, 10, 10, 10), ++ new Rectangle(10, 10, -1, -1), ++ new Rectangle(-1, -1, 10, 10), ++ new Rectangle(-1, -1, -10, -10), ++ new Rectangle(0, 0, size, size), ++ }; ++ ++ private static final Rectangle[] vlines = {new Rectangle(0, 0, 0, 0), ++ new Rectangle(0, 0, 0, 1), ++ new Rectangle(0, 0, 0, -1), ++ new Rectangle(1, 1, 0, 1), ++ new Rectangle(1, 1, 0, -1), ++ new Rectangle(15, 15, 0, 10), ++ new Rectangle(15, 15, 0, -10), ++ }; ++ private static final Rectangle[] hlines = {new Rectangle(0, 0, 0, 0), ++ new Rectangle(0, 0, 1, 0), ++ new Rectangle(0, 0, -1, 0), ++ new Rectangle(1, 1, 1, 0), ++ new Rectangle(1, 1, -1, 0), ++ new Rectangle(15, 15, 10, 0), ++ new Rectangle(15, 15, -10, 0), ++ }; ++ ++ public static void main(final String[] args) throws IOException { ++ BufferedImage gold = new BufferedImage(size, size, ++ BufferedImage.TYPE_INT_ARGB); ++ Graphics2D g = gold.createGraphics(); ++ BufferedImage bi = new BufferedImage(size, size, ++ BufferedImage.TYPE_INT_ARGB); ++ Graphics2D g2d = bi.createGraphics(); ++ g2d.setColor(new Color(0, 250, 0, 100)); ++ g2d.setBackground(Color.BLACK); ++ g.setColor(new Color(0, 250, 0, 100)); ++ g.setBackground(Color.BLACK); ++ // Rectangle ++ for (final Rectangle r : rects) { ++ g.clearRect(0, 0, size, size); ++ g2d.clearRect(0, 0, size, size); ++ g.drawRect(r.x, r.y, r.width, r.height); ++ SwingUtilities2.drawRect(g2d, r.x, r.y, r.width, r.height); ++ test(gold, bi); ++ } ++ // Vertical Line ++ for (final Rectangle l : vlines) { ++ g.clearRect(0, 0, size, size); ++ g2d.clearRect(0, 0, size, size); ++ g.drawLine(l.x, l.y, l.x + l.width, l.y + l.height); ++ SwingUtilities2.drawVLine(g2d, l.x, l.y, l.y + l.height); ++ test(gold, bi); ++ } ++ // Horizontal Line ++ for (final Rectangle l : hlines) { ++ g.clearRect(0, 0, size, size); ++ g2d.clearRect(0, 0, size, size); ++ g.drawLine(l.x, l.y, l.x + l.width, l.y + l.height); ++ SwingUtilities2.drawHLine(g2d, l.x, l.x+l.width, l.y); ++ test(gold, bi); ++ } ++ ++ g.dispose(); ++ g2d.dispose(); ++ } ++ ++ private static void test(final BufferedImage gold, final BufferedImage bi) ++ throws IOException { ++ for (int x = 0; x < size; x++) { ++ for (int y = 0; y < size; y++) { ++ if (gold.getRGB(x, y) != bi.getRGB(x, y)) { ++ ImageIO.write(gold, "png", new File("gold.png")); ++ ImageIO.write(bi, "png", new File("image.png")); ++ throw new RuntimeException("wrong color"); ++ } ++ } ++ } ++ } ++} +\ No newline at end of file +--- ./jdk/test/javax/swing/border/Test4252164.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/swing/border/Test4252164.java Wed Jul 30 18:42:59 2014 +0100 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 4252164 ++ * @bug 4252164 8041917 + * @summary Tests rounded LineBorder for components + * @author Sergey Malenkov + * @run applet/manual=yesno Test4252164.html +--- ./jdk/test/javax/swing/plaf/metal/MetalLookAndFeel/Test8039750.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/plaf/metal/MetalLookAndFeel/Test8039750.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,76 @@ ++/* ++ * 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 javax.swing.UIDefaults; ++import javax.swing.border.CompoundBorder; ++import javax.swing.plaf.metal.MetalLookAndFeel; ++ ++/* ++ * @test ++ * @bug 8039750 ++ * @summary Tests MetalLazyValue removing ++ * @author Sergey Malenkov ++ */ ++public class Test8039750 { ++ public static void main(String[] args) { ++ UIDefaults table= new MetalLookAndFeel().getDefaults(); ++ test(table.get("ToolBar.rolloverBorder"), ++ "javax.swing.plaf.metal.MetalBorders$ButtonBorder", ++ "javax.swing.plaf.metal.MetalBorders$RolloverMarginBorder"); ++ test(table.get("ToolBar.nonrolloverBorder"), ++ "javax.swing.plaf.metal.MetalBorders$ButtonBorder", ++ "javax.swing.plaf.metal.MetalBorders$RolloverMarginBorder"); ++ test(table.get("RootPane.frameBorder"), ++ "javax.swing.plaf.metal.MetalBorders$FrameBorder"); ++ test(table.get("RootPane.plainDialogBorder"), ++ "javax.swing.plaf.metal.MetalBorders$DialogBorder"); ++ test(table.get("RootPane.informationDialogBorder"), ++ "javax.swing.plaf.metal.MetalBorders$DialogBorder"); ++ test(table.get("RootPane.errorDialogBorder"), ++ "javax.swing.plaf.metal.MetalBorders$ErrorDialogBorder"); ++ test(table.get("RootPane.colorChooserDialogBorder"), ++ "javax.swing.plaf.metal.MetalBorders$QuestionDialogBorder"); ++ test(table.get("RootPane.fileChooserDialogBorder"), ++ "javax.swing.plaf.metal.MetalBorders$QuestionDialogBorder"); ++ test(table.get("RootPane.questionDialogBorder"), ++ "javax.swing.plaf.metal.MetalBorders$QuestionDialogBorder"); ++ test(table.get("RootPane.warningDialogBorder"), ++ "javax.swing.plaf.metal.MetalBorders$WarningDialogBorder"); ++ } ++ ++ private static void test(Object value, String name) { ++ if (!value.getClass().getName().equals(name)) { ++ throw new Error(name); ++ } ++ } ++ ++ private static void test(Object value, String one, String two) { ++ if (value instanceof CompoundBorder) { ++ CompoundBorder border = (CompoundBorder) value; ++ test(border.getOutsideBorder(), one); ++ test(border.getInsideBorder(), two); ++ } else { ++ throw new Error("CompoundBorder"); ++ } ++ } ++} +--- ./jdk/test/javax/swing/plaf/nimbus/8041725/bug8041725.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/plaf/nimbus/8041725/bug8041725.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,82 @@ ++/* ++ * 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 8041725 ++ @summary JList selection colors are not UIResource instances in Nimbus L&F ++ @author Anton Litvinov ++*/ ++ ++import java.awt.*; ++import javax.swing.*; ++import javax.swing.plaf.*; ++import javax.swing.plaf.nimbus.*; ++ ++public class bug8041725 { ++ public static void main(String[] args) throws Exception { ++ UIManager.setLookAndFeel(new NimbusLookAndFeel()); ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ JFrame frame = new JFrame("bug8041725"); ++ frame.setSize(200, 200); ++ JList list = new JList(new String[]{"Item1", "Item2", "Item3"}); ++ frame.getContentPane().add(list); ++ frame.pack(); ++ frame.setVisible(true); ++ ++ System.err.println("Test #1: No items are selected, list is enabled."); ++ testSelectionColors(list); ++ ++ System.err.println("Test #2: No items are selected, list is disabled."); ++ list.setEnabled(false); ++ testSelectionColors(list); ++ ++ System.err.println("Test #3: One item is selected, list is disabled."); ++ list.setSelectedIndex(0); ++ testSelectionColors(list); ++ ++ System.err.println("Test #4: One item is selected, list is enabled."); ++ list.setEnabled(true); ++ testSelectionColors(list); ++ ++ frame.dispose(); ++ } ++ }); ++ } ++ ++ private static void testSelectionColors(JList list) { ++ Color selBackColor = list.getSelectionBackground(); ++ if (!(selBackColor instanceof UIResource)) { ++ throw new RuntimeException(String.format( ++ "JList.getSelectionBackground() returned instance of '%s' instead of UIResource.", ++ selBackColor.getClass())); ++ } ++ Color selForeColor = list.getSelectionForeground(); ++ if (!(selForeColor instanceof UIResource)) { ++ throw new RuntimeException(String.format( ++ "JList.getSelectionForeground() returned instance of '%s' instead of UIResource.", ++ selForeColor.getClass())); ++ } ++ } ++} +--- ./jdk/test/javax/swing/plaf/synth/Test8043627.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/plaf/synth/Test8043627.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import javax.swing.JButton; ++import javax.swing.plaf.synth.SynthButtonUI; ++ ++/* ++ * @test ++ * @bug 8043627 ++ * @summary Tests that SynthContext can be created with SecurityManager installed ++ * @author Sergey Malenkov ++ */ ++ ++public class Test8043627 { ++ public static void main(String[] args) { ++ System.setSecurityManager(new SecurityManager()); ++ new SynthButtonUI().getContext(new JButton()); ++ } ++} +--- ./jdk/test/javax/swing/text/GlyphView/4984669/bug4984669.html Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/text/GlyphView/4984669/bug4984669.html Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,30 @@ ++ ++ ++ ++ ++The four lines printed above in a bold typeface should all be underlined. ++It is a bug if any of these lines is underlined only partially. ++The very first line should not be underlined at all. ++ ++ +--- ./jdk/test/javax/swing/text/GlyphView/4984669/bug4984669.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/text/GlyphView/4984669/bug4984669.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,55 @@ ++/* ++ * 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 4984669 8002148 ++ @summary Tests HTML underlining ++ @author Peter Zhelezniakov ++ @run applet/manual=yesno bug4984669.html ++*/ ++import javax.swing.*; ++import javax.swing.text.*; ++ ++public class bug4984669 extends JApplet ++{ ++ public void init() { ++ JEditorPane pane = new JEditorPane(); ++ this.getContentPane().add(new JScrollPane(pane)); ++ pane.setEditorKit(new StyledEditorKit()); ++ ++ try { ++ pane.getDocument().insertString(0,"12 \n",null); ++ MutableAttributeSet attrs = new SimpleAttributeSet(); ++ ++ StyleConstants.setFontSize(attrs, 36); ++ StyleConstants.setBold(attrs, true); ++ StyleConstants.setUnderline(attrs, true); ++ pane.getDocument().insertString(6, "aa\n", attrs); ++ pane.getDocument().insertString(9, "bbb\n", attrs); ++ pane.getDocument().insertString(13, "cccc\n", attrs); ++ pane.getDocument().insertString(18, "ddddd\n", attrs); ++ } catch (Exception e) { ++ throw new Error("Failed: Unexpected Exception", e); ++ } ++ } ++} +--- ./jdk/test/javax/swing/text/StyledEditorKit/8016833/bug8016833.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/swing/text/StyledEditorKit/8016833/bug8016833.java Wed Jul 30 18:42:59 2014 +0100 +@@ -190,9 +190,9 @@ + // not too wide + assertTrue(out3.getWidth() * 0.8 < out2.getWidth()); + // not too low +- assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) < 3); ++ assertTrue(out3.getY() - (out1.getY() + out2.getHeight() - 1) < 4); + // not too high +- assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) > 0); ++ assertTrue(out3.getY() - (out1.getY() + out2.getHeight() - 1) > 0); + } + + void testStrikthrough() { +@@ -217,7 +217,7 @@ + // not too wide + assertTrue(out3.getWidth() * 0.8 < out2.getWidth()); + // not too low +- assertTrue(out3.getY() - (out1.getY() + out2.getHeight()) < 0); ++ assertTrue(out3.getY() - (out1.getY() + out2.getHeight() - 1) < 0); + // not too high + assertTrue(out3.getY() - out1.getY() > 1); + } +--- ./jdk/test/javax/swing/text/html/8034955/bug8034955.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/text/html/8034955/bug8034955.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,49 @@ ++/* ++ * 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 javax.swing.JFrame; ++import javax.swing.JLabel; ++import javax.swing.SwingUtilities; ++ ++/** ++ * @test ++ * @bug 8034955 ++ * @author Alexander Scherbatiy ++ * @summary JLabel/JToolTip throw ClassCastException for "a" ++ * @run main bug8034955 ++ */ ++public class bug8034955 { ++ ++ public static void main(String[] args) throws Exception { ++ SwingUtilities.invokeAndWait(new Runnable() { ++ ++ @Override ++ public void run() { ++ JFrame frame = new JFrame(); ++ frame.getContentPane().add(new JLabel("<html>a<title>")); ++ frame.pack(); ++ frame.setVisible(true); ++ } ++ }); ++ } ++} +--- ./jdk/test/javax/swing/text/html/parser/Parser/8028616/bug8028616.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/swing/text/html/parser/Parser/8028616/bug8028616.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,77 @@ ++/* ++ * 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 8028616 ++ * @summary Tests correct parsing of the text with leading slash (/) ++ * @author Dmitry Markov ++ */ ++ ++import javax.swing.text.html.HTMLDocument; ++import javax.swing.text.html.HTMLEditorKit; ++import java.io.StringReader; ++ ++public class bug8028616 { ++ private static final String text = "/ at start is bad"; ++ private static Object lock = new Object(); ++ private static boolean isCallbackInvoked = false; ++ private static Exception exception = null; ++ ++ public static void main(String[] args) throws Exception { ++ ParserCB cb = new ParserCB(); ++ HTMLEditorKit htmlKit = new HTMLEditorKit(); ++ HTMLDocument htmlDoc = (HTMLDocument) htmlKit.createDefaultDocument(); ++ ++ htmlDoc.getParser().parse(new StringReader(text), cb, true); ++ ++ synchronized (lock) { ++ if (!isCallbackInvoked) { ++ lock.wait(5000); ++ } ++ } ++ ++ if (!isCallbackInvoked) { ++ throw new RuntimeException("Test Failed: ParserCallback.handleText() is not invoked for text - " + text); ++ } ++ ++ if (exception != null) { ++ throw exception; ++ } ++ } ++ ++ private static class ParserCB extends HTMLEditorKit.ParserCallback { ++ @Override ++ public void handleText(char[] data, int pos) { ++ synchronized (lock) { ++ if (!text.equals(new String(data)) || pos != 0) { ++ exception = new RuntimeException( ++ "Test Failed: the data passed to ParserCallback.handleText() does not meet the expectation"); ++ } ++ isCallbackInvoked = true; ++ lock.notifyAll(); ++ } ++ } ++ } ++} ++ +--- ./jdk/test/javax/xml/jaxp/parsers/8027359/XML11EntityScannerTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/parsers/8027359/XML11EntityScannerTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,184 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/** ++ * @test ++ * @bug 8027359 ++ * @summary test that the XML11EntityScanner refreshes cache when it loads new data ++ * @run main XML11EntityScannerTest ++ */ ++ ++import java.io.*; ++import java.util.regex.Pattern; ++import javax.xml.parsers.DocumentBuilderFactory; ++import org.w3c.dom.*; ++ ++ ++/** ++ * XML11EntityScanner functions similarly as XMLEntityScanner in handling data ++ * cache ++ */ ++public class XML11EntityScannerTest { ++ static final String rawXML = ++ "<?xml version=\"1.1\" encoding=\"UTF-8\" standalone=\"no\"?>" ++ + "<WebOfTrustRC2 Version=\"4004\">" ++ + "<Identity Name=\"maggot\" PublishesTrustList=\"true\" Version=\"1\">" ++ + "<Context Name=\"Introduction\"/>" ++ + "<Context Name=\"FreetalkRC2\"/>" ++ + "<Property Name=\"IntroductionPuzzleCount\" Value=\"10\"/>" ++ + "<TrustList>" ++ + "<Trust Comment=\"\" Identity=\"USK@fdZ2In5mnLVG6RTc5hq9P~M1EG0WuH-itZ7mnQx2iuM,aUG-57VqxQLhQ4N1uNmH9kSI2syEfVFrVOIPAKTY2Yg,AQACAAE/WebOfTrustRC2/5\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@YwwRkHSo-xU8CvSFcLqlU2FFsQ3ztjr0X~xPXkX-klY,poB3tdcXrBU9naI0pyNVYp~zQmHaFkRRTj8xB8tuiPc,AQACAAE/WebOfTrustRC2/7\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@lsd~~79wrGvfb99FnAEY4VhJg2b5KFUloCOUff-Q2fk,71eV-F580euOtaCgim69Yw~2Rjh43DT49sl6zNamjk0,AQACAAE/WebOfTrustRC2/47\" Value=\"100\"/>" ++ + "<Trust Comment=\"Automatically assigned trust to a seed identity.\" Identity=\"USK@xyzElfFQnwBb4ZuSEh1aSNsbRjEGCTa-2rcjeW58A4E,TiYrXSCcoGETPf0TWLNthaimJEP1PW7nJ2tYXKxdC4s,AQACAAE/WebOfTrustRC2/456\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@pTtYoCsMO-~~2Grqya6Y7cf7nIU3VlL4168-c6EIwA8,QabBgrH1LYKKyBROnWz1r6iI8N7WFTt-mKD-0Qxsw1w,AQACAAE/WebOfTrustRC2/133\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@m~lDSvnetPNy77wsoxDZDUf7OkgX6ZAd7ob9orm3J4Y,SEX20g148KGJg3bsxvXNPNbUsVs1yQ5LfVUOGMh~1Q0,AQACAAE/WebOfTrustRC2/7\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@ss5yQit~bQL5easM68d4sImnPAxHNUbi99XtDMhpzgQ,CnpuD8dO29KvpkQyxtz1llAxHCB7yXfqrQLNRIELZow,AQACAAE/WebOfTrustRC2/2\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@krPcyGts~~wZTbABTAJ59nSplmum2~EkSD5IzinrFko,7YEbm-YEx1LFoZVHtGmIa5q0KbEjw48Rgwx2NqwrH~o,AQACAAE/WebOfTrustRC2/15\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@Usl-yNWc3VtuQWQ9srowZaWyfB6MiD9fzM5WexrlKE8,qMS83aGFsN~aFGajUmGrnbXvRIYZMd8N8IjnGmEvi-s,AQACAAE/WebOfTrustRC2/68\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@St0yKRdQJ3Lq17yoVt9h08bMfhqRhH1vtrcVVInoZVU,BaYM72qM3CYO1yzfVyO1UDUobL56CMbt9EQt3sEXabA,AQACAAE/WebOfTrustRC2/7\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@P8v4ZHUBPYGylYC-KHeWmeu5ZvB6RPYGgKcI5639Wz8,OM9PvjwMlt4L6jKRhqpvyblwpVMYumUgYFrAu3NxY~o,AQACAAE/WebOfTrustRC2/54\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@u2vn3Lh6Kte2-TgBSNKorbsKkuAt34ckoLmgx0ndXO0,4~q8q~3wIHjX9DT0yCNfQmr9oxmYrDZoQVLOdNg~yk0,AQACAAE/WebOfTrustRC2/2\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@MotrIucaZk37pJNS~HHpW5Vea3q0EZpfENPNGSjWh9s,RkFyDjl6-l7V-xYMWtGypmDYk-VehAU1LXmNYdIlHJs,AQACAAE/WebOfTrustRC2/108\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@KXAWN8DJxJ48XzZu7IBBpZ7SFc4n-OXqu4HhQC0V9Ww,DyklyACbgDCZyFpq-LeNqmuve7KWv-WDvJicd37ycn4,AQACAAE/WebOfTrustRC2/11\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@D6BZ1sSEmDMKNMPUN9I~7AalkkXockAdtbxONEN315w,0LiGUSSv4Ln4O7Xe4GQjpMEflNN7okKAH42Vlpv8d8s,AQACAAE/WebOfTrustRC2/56\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@sDehmSJoiaKYT455GIGHIVNKMs7KmiiwXXcCIcDhZ3o,upypWy-ze9Cz7WiCnbbJmoZOh7Xtveitftc5bE~p0Ug,AQACAAE/WebOfTrustRC2/6\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@GsTGXzIm9BTM5~KSZJknfTcPpJtlRs62aJtkNp05T5A,wuQcDjsdPQD9Fa21zWGB5GiiDlmf56vI9Niu5jl8eiM,AQACAAE/WebOfTrustRC2/31\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@eLFdT9VWP60iPNf8a3AkZrzgkcgje2n3Ca1yS8Tc5HU,5D0PISp19VkgzD4VSrRFTmo2CCvRoIuxlQzgMZBmj74,AQACAAE/WebOfTrustRC2/62\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@rz12UCXn-lG53i-6JswD98Kk9Zp0kt05gqIMNYc~9d0,42hoYZ5f~1fPuyvTOVYGJ~28MgYBSfoyzceR8-u1Z2I,AQACAAE/WebOfTrustRC2/126\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@5CYp3t28N5ZbPss9XhOkwUjD~T65q6-nc4aGwbV~-O0,CBfwMjYBiqKunzj3k6Ofpo9pyQsVFPz0OUWVzfd5a0c,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@dSSrRL9BY7JmTQD0dCpcIgVaLFF7pqU8EJzVUp1BYPA,EkTPkLrhEBQLPq-dRVPB1f2CAVdFGbXbUBlIww6re60,AQACAAE/WebOfTrustRC2/5\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@cw2rrCAcYTBjlO-I8DfEj-txttebZMG2LwuPGJV3Qlg,5ZcXLJW8G-R2SFqg4TEQX7IMs~e3Q4DjxUXGuHr9fxA,AQACAAE/WebOfTrustRC2/7\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@7zpRmhkkd5XcAUY6yUwp-53t7to3UN96w98~KQEwha0,30VpXev32s2mhmM5aBRJ---I0OlYbbN6~18j8rJ6qMU,AQACAAE/WebOfTrustRC2/8\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@YmCWYwlaSeE8o~8GawGYWeuPwsgVQtlBwlBkhGQFX04,H3DthY0MZXTe4rL0vsUOOMQDaj6UB9wK59yEwG8Q6No,AQACAAE/WebOfTrustRC2/13\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@aO9svsQEWmib~UyF1ihRUHA8i6uZprGy-tIS-Od9MMk,kwaMemPMVp-jcIRgGLAdF6PZimNE2cZFbvM6ShXAuZw,AQACAAE/WebOfTrustRC2/7\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@6J7FWPHwiCElTRXAO77tMGYAiLxerNF~5olAG0alQxQ,cz72iTz9FT~H57TgroVFv1eZlN5Ia5dhCtRa8bLh1KQ,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@kukYpNG56TNUnQzQe1RZvSYoqQ5B9lcoMZyDlh7xfO4,DNybejZVcWBAaByMRYYLZlgzUjQg28V8j6Zu1CtBc~g,AQACAAE/WebOfTrustRC2/27\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@a-tin0kMl1I~8xn5lkQDqYZRExKLzJITrxcNsr4T~fY,0VmnI67gAzIpdXlZFq~hYD8ikR5IEAg5QTwQv5Ifv5M,AQACAAE/WebOfTrustRC2/24\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@g~4XXw0hjp9TLocYZzunYWX6Don2AQhG-zplmzoCmY0,lyNjClSjRCrBZXVcmPKEAfvH01ySPgv1NWqL8wd11L8,AQACAAE/WebOfTrustRC2/115\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@UXgNMPe1YbVpXHOBXgMlcm9XcGY0G3gUtu43IO-YLLA,7EHSp20GHupg0rWrGPRY1g0TFJcRs-kubVtAcQRMxAc,AQACAAE/WebOfTrustRC2/69\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@lHrF2trsC9gyVeT2zpoL6IlZMz0aKlhN4xa2Ig70rmA,niASdKFC3nDfW6KMvzcv6VmRoHakE7GQAFpfz~2-v3Y,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@hp7IFNYSA97cHNAnHcreTJjQE5fF5sbsFlvbcZXaoxQ,O5h6cAcl5MvxuE2-xOkuvUP4JkT59NQNtaSmtuAS2Y8,AQACAAE/WebOfTrustRC2/16\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@QKPxALYrv6UyAGJs7tor8YlcikFzmy2msZ~42JMT~80,vx01piijkj0o3K8gzNaAOIIZ7NAtQVvPBxlRKtc4iP0,AQACAAE/WebOfTrustRC2/35\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@NmNfUNIr2WwIb9Ej1038Pk0M5gS1M0eHKvxdWqRUfTg,JUJYTsWuNQPOHK039Rczp6oPZDbfPdbO62gSaCuBXFQ,AQACAAE/WebOfTrustRC2/69\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@ONB7kRFo7mI0O3~QLRWlTbo1oB91XmGGS7KtSzz4XVI,yGiqMWRwR~i6ffAXOTBvrngHGC6nYOETUXj4L6Izj64,AQACAAE/WebOfTrustRC2/122\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@k-i0PmxoxO6Mahx8s850Rd7TEe0r4cnEohqC66aMDKw,IlTVYmQ9OSHjiu5pOLq4t-8r50SsVPNMlXn56zfpfDI,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@GtzvV-VHMGQILkpZ3O4CWBTWlhB423UUwpIlzRDgBLs,HUxBDT-Hhy6GqjBV24NRMjlK-o76YGMEgO~ZS6yighU,AQACAAE/WebOfTrustRC2/6\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@Ws0yzkcOYw6ax~kCtnzyX4MgLBHiQd5a6u9FMUmqLG4,zqNjNNGLz7HE4pdSPTovX2AwzGQWJ3-LI7YZt7aq3gg,AQACAAE/WebOfTrustRC2/30\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@6brkdrKlglWHnqMjWG6wrdLMWGPooc~7wQ7ID-PIsJk,X3RRBIdOQ5zthpkk8FjLL33LyoVVI4csJ1~g~sZ1msc,AQACAAE/WebOfTrustRC2/63\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@4DO0Yp1a3RZeAUAjeoPVu~GqpKhaX8RYqe~mwcWgjsM,klsqky963KI6uG3JqE1crihSeBbKBgkJHkIZ2xkWJ4A,AQACAAE/WebOfTrustRC2/36\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@axtoU6zHIkx3bicWK-hLNOj0br4xi0HW1qZ8H6CEv0U,SuPIncAHyYXmR9jQkTFUJd-QgGm0g9lW5ESUjzFOl~Q,AQACAAE/WebOfTrustRC2/8\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@BYsosP8TA22rSz1uA0KGbp6OVFZXhdgAlpH4R4hX9zE,o~qV5IzMR3m7ZOnnG5FPnDqpdffEpu7yOM7VEU9j6lQ,AQACAAE/WebOfTrustRC2/7\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@EilKmVin5cVL7b4FoEQ7ZoHS932O8OI880Qkd~tmzWs,8WK34lo95u~b60GLVczYU6EiRpY0LH7130~ASP9F6dU,AQACAAE/WebOfTrustRC2/75\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@xDYiCplSPLvFGC2dQjAC6eeaYVyQMtV-HmkpuKIJPgQ,CYKZcPacSNfB67IK10xlq7~bAqR-aOnZIA~yhHs2Hj0,AQACAAE/WebOfTrustRC2/71\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@DfCUA1sEJgiGzijEO0BWgeGjjHi28GGgv76H4rLujp8,1lnaOtPiXmvhpRZkBamZNF47uETNKIBgjSzElxcLhZc,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@F45FWNz9rs6TmafG~6n5Bg3Sr69YCHY9v01KTyK17lw,ikIvUS079Qw3aQknvdM8yKgr0XwjcqHgW0pWLu-1osA,AQACAAE/WebOfTrustRC2/13\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@VTDWbj9C5FUEXZBQRXmSsV1aEdOfsB9QHKzZ7-CnCh4,aDjtAVMuGPpCmw1rnCAj5myEnq9HYZeIzrfrhJO2JNw,AQACAAE/WebOfTrustRC2/52\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@dhYMUELq~HtJOweiV2JkGcoFS6hulHd9O~7a9LpGIxM,M-H3ySL8BdCctDUvwvbFNwHUyO1zghSNyotLqkKowi8,AQACAAE/WebOfTrustRC2/20\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@oRpTFVvCqp8qFWiZyCh2QhQ85eh3eP8C8G4YTFhm~rw,kyyeUPuksdt7omGFYFxoWPz3lu6e0q~G1HBx8wFztFc,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@RINL4YHPkTUGBWSoohAoO7Knzk89XSnqnQ6pUZkRY~w,OvIyTUUf4T2Tm46-em~A7zn1zBksIwe-hJP3KKdCe6s,AQACAAE/WebOfTrustRC2/4\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@sEZ-eWgUcQSj-To7lClNN6QNoKuvt0Cz3iTGKv63wQo,krEwvob7MhJ-pGvIk-RM8pVDPFSuXYTZw58oc2Lc49o,AQACAAE/WebOfTrustRC2/1\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@gNTVpdblFLSKMzUBEQM8YTfrO2fQQNIZeV7yJRTqYTQ,EKJhCmbQ5hpMU3cd-J91uneBF7CxTLPqffPs6DxoSMs,AQACAAE/WebOfTrustRC2/21\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@AV8Ubs8pbsMQ1F028a~pSJqtatznLjvhnwfSAtm1QKg,lUHPp~mgzV-pVoG9lYpceL6oOUtFRpvyQjGQdfx1GjY,AQACAAE/WebOfTrustRC2/41\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@xb3QGWdoUpeX9Fn1ZKeDwGN884c2XAMTpYLM9z4OIKo,aWNEDvjhhacFKAjiYJLaUnK1e7dQ9sCk-cnqkGZd7F8,AQACAAE/WebOfTrustRC2/9\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@MrxyFFM~n-kZ4kYvOOZodsvAA2vwp2XtAQJCrkEEU6s,tSHvx3u7uJN8ciaTqBIzt3lLmonM9mj6I7pz88MtBXc,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@-tpkd0enlFMTnjANRjzMKyfE3uyXU-WDX8VUqk3MXEg,J6h7edIdQCsiuc53qahzMzxsyNayXL~9IR0x5QoJVxk,AQACAAE/WebOfTrustRC2/15\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@gBQsXbnA9HX6wQB8x7DIEJT6e7lOxq5jGF353Po~p90,HjdyCLfG9r-zSBN6-AXwA1he9blIO2WEN9u7dMQ7H1w,AQACAAE/WebOfTrustRC2/13\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@ye~rQ4m~pu2Iu3O2TH-GOLBbSeKoQ~QR~vC6tJbKmDg,YSuI-J1nKZjGB2zmIa9Bh2Wtud~jzYBuR7OVhXYh7qM,AQACAAE/WebOfTrustRC2/99\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@HwgX8mU9A7bd2sCsM9And7fotpMGqfba9LzxZtOHHOU,10nYjjfKDH5RB3YvCCi5bpq4GPR-myd8ea7n8DRvx~c,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@qQArPJZuODDeM6C2ndbSczsFLWmLDm2SoaE-9F1hwQU,E3x6TbIvBj~6D9GrMUWSYgnNkLRg85BXXy5~mncoNEI,AQACAAE/WebOfTrustRC2/7\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@4hm9fo4IN0akORyJECttbEGZ~rPCPQ9KKAAH2AWMy8E,klvTyVp-GJznJq8Sln4W2GUfV6tVX2TI2sPCGBFU4tM,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@x7SDH5rL2-tGOaOKFFNMRrylCq94OfiZTWt4t3nwRHk,~E-kX9VqlANo4MeccvNlXDIjJ5xTWTEDNW-Qk04Ke6U,AQACAAE/WebOfTrustRC2/17\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@A9RAAKmky5yroigSupz6Bvrmc4q5FN1SXSrSXa6oRUg,s3RfurouqPnKmlGRkERao6jOJv9kcrVBBKAHqZVuQH4,AQACAAE/WebOfTrustRC2/1\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@yEstdNIW54-3~YA7QnYodpyWgPZStskrN9WXLHujUrE,j4PciAtpUHOjR2wmaaCKwiryJAi~exjETJ13UPGJLTg,AQACAAE/WebOfTrustRC2/58\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@NZSwPe8RJQOTSQ-~cAuxy97ieuX9reSft0cyD0vfbJg,99y8KOdRJmVLCWqryDzB8NdBrQGY7V9JDFtgCQBuGsU,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@Nq6iEvHP0B2VCszLCenQrfyJmkD0vas~00-9MoWgcTA,6dI2kB1z9mtjwITkhc9~V86QE5gM9CJBMjdpvRzKAoY,AQACAAE/WebOfTrustRC2/29\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@ZaNXnLCT7OQrwhp4I9V-rI1ZAV9WzegFj0HSaEJQ-Z4,i23K-dQupDenVE8O3xGv92vVanfDeyjLYWescevMbGg,AQACAAE/WebOfTrustRC2/14\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@53e9r9zEkJ0TRW~Tq8XIWjZ3WkL7Jv5Ez8LDhdwwzwM,7a0vL0OmWkHy3gC5Zs~MxB4k0QppwK4igrH6iuwls68,AQACAAE/WebOfTrustRC2/7\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@W1c~RYRC09xIHiHIucfV~Rj4J8uKAGrUeHmrH-q-U1c,niOrI75WMQ-Dtl9luIbKBmnvf6chkQEKvUvoKvSjhxI,AQACAAE/WebOfTrustRC2/4\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@G6zv74PaPcVZcf78lWp-e1TfrCSNZa1ZaPvmjm7DVzk,f4Ft3sLQ6cUEwpumpTMt5N17UORfZoXjGfmke5PJbdc,AQACAAE/WebOfTrustRC2/5\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@m5ILsPVAlcOY5D91J2iQu~PIntZb3L-B1VkONjEZs2k,592dl39JXIF1kpC4OMkw7ELOhdPrn~WXBsZln20pM7Q,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@iK69tf7gzQ53oZV60rF6ZSwwCfADMRsJeG2YmODdmJc,5czI5ZmWbWLDr2L9JdDmkt7qrr8fs55VDt3tXnrFw0E,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@bloE1LJ~qzSYUkU2nt7sB9kq060D4HTQC66pk5Q8NpA,DOOASUnp0kj6tOdhZJ-h5Tk7Ka50FSrUgsH7tCG1usU,AQACAAE/WebOfTrustRC2/58\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@0j-H~zKeP9mh6LEJUl4HSJYC-lQWstYRJeC~5E2F5~c,VbjnSixETRzKp80jYYXD-bqsTUWzxwcYmI9ZSWsBrik,AQACAAE/WebOfTrustRC2/13\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@~4ZW0eji3~hYAakiCI056soETGPf9O94GtoIpE2NGEg,GdtKsS~WeDlBS~OL1egxqZ4pr-iPXHjT2zcy8pjvEK4,AQACAAE/WebOfTrustRC2/88\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@YommlOi4fTYx9axhnl9iAi9BNHRvnM5XWjl21i0563k,5FswxS7hPf2erR8KkrBobG8R9bekaakeY1tM8DDNsjI,AQACAAE/WebOfTrustRC2/2\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@-ucM1bn8sICGRAemM8wZ~BVHgX3ZPUoutjZY64mBIcQ,Ko~kC54wZ-joCpfdc67Vds8LkAIxvTJGpMtfQSl4mAA,AQACAAE/WebOfTrustRC2/2\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@VwcZEhjtMuFcYIa8r0yksTs~FvMWB7swEz6tK67Vmsw,0blSLTQDms-WWbw1IBuKIoR2ZvSHpI21lMFeByQPuII,AQACAAE/WebOfTrustRC2/56\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@HAoXk-dW6~j5eLdAZCEjyKTVC974wkdl-4QqrPcbyzE,NlS05DkGK8QzL~EVUOfb~Jl1EZoVJTQBQBzA6N2qMn4,AQACAAE/WebOfTrustRC2/7\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@2PK-12eJFcVziT6eMpiUpOpTlmDNAoVOKZvA~8s7VSg,EaHdnKfKoWQDclX1mwcQeGr5jo1ijxyExYqL7Vsf-o8,AQACAAE/WebOfTrustRC2/33\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@8D3L5TDTyp5jnbT4imUWK12QC-B0iaSxFPOstMX2URg,ZtSShNkEVV8whaGQtIxiJ3FBroihw8YDyZrWvqncs0s,AQACAAE/WebOfTrustRC2/12\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@HKv7Hp94hFz8CKlINXCImq~XIBL9VfsPSgqfR0QIZFQ,vFM45qVvCajf3iqZm~ykZYwqM0KhaUSkU3RGaxJzHLI,AQACAAE/WebOfTrustRC2/4\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@NJu4xYtC3cgZo8s2xqmap3eh1dy60tFQFoxU8aeSnq8,fp~WLcrSSUKnr9wDDz-geb8FDwADCMCA9fjKt04Cyg8,AQACAAE/WebOfTrustRC2/4\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@IazjsmIK8VnIjDkq3-ecMEKHmi0dBT1QsNBq2mp2Fuo,uu24sWwNW~tjszdw19Mz18NBGx1MSADi03BHZnttwFo,AQACAAE/WebOfTrustRC2/8\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@IfxF-y7PNV97WUiHLqlIwXQyfVsHjI-Am4unZ0AK-Qk,Xm78gNC236A3wZ1RWBnft4oBGHU1R88Yt9AlphmtJPo,AQACAAE/WebOfTrustRC2/36\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@i1YvNnlMkd0i~0SiXiDHlGaxbtYd8ZqEUij~VzxyXmM,rxi19mph9KtHA6~gVGJ1rZ6kytff~kJDm6~NrA4YQaI,AQACAAE/WebOfTrustRC2/9\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@nXf5sbMSDqE~OkCQ~8JaMgPbj2LQJcuouvO56ADo28s,uEMqVaBzpA06TaC8A0cqKuv~lSfqZBiijasA3nlQ0Fc,AQACAAE/WebOfTrustRC2/8\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@Y8fLVylNs~pB6sdA5Dl1l6T~hXQrLNZLMgfDl5-E5Z0,n0zdN5XUa-D5Puf0L9wu~xQQmU~A5TpfqJ4RFHJLjLs,AQACAAE/WebOfTrustRC2/1\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@F0ixRao2hQlvTQDkN6rPcwLTG2nA6x0r8RrTQ0443IQ,LxN-gYvq4eWRuhjAgejmgNqYJdIw0q8IJ2XNwwVHhmQ,AQACAAE/WebOfTrustRC2/12\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@Pgk~nJzSVNAjFHh-qTovvm6muY08igdOCEWuyUrbFvk,NlwUDwfQlbXRjIaFAVljD5E1loXi31Xq6dG8YC7JOR0,AQACAAE/WebOfTrustRC2/5\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@m9gYemmVNXe32Ao6jeUgW8ttgGlMSIAW1608YZ19olE,LnEWPRzsPlPfq2~gIYQ5SVV-V2lthAx254dht9EZgyU,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@Pwiulr-xlPJelS5CO4~do78zZHTL5TNIChF5hpz8nkY,z77V~KhcKZRWLSWtVzaWO-dt~TzCCJFCHUDhHXI715M,AQACAAE/WebOfTrustRC2/8\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@OH3ZkrLAkMJbQTjVW3e9ioH04F7jpUVNMekiQAAvRjs,J6qOC05GoqRgST93M1V90HWxq9VK4PCKIpltkL8GAhg,AQACAAE/WebOfTrustRC2/5\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@nirNdzBgVyqMpnuT5UrmX~TU354qDIY7XAp04Kutysg,vpf1npG3nUARPSkFRx9xbVT~w1ELw0jQhdiXbxWcafg,AQACAAE/WebOfTrustRC2/1\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@ozK579KUDjjxkve1gKeV8IDd5qe0NPtxlFVV2-8iXrM,hlU82qnHi5ZnIfSD5~hr4wmUjNFJjQYted7FJWBj8z8,AQACAAE/WebOfTrustRC2/12\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@D6JSlrnlDDXfnGhijswHC5a4-EBuYNFhg2IyoFhzRRM,tCJy6EvZRhk-Og9CIkR3jfLD4VYxwOY5Wf991XMLdmE,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@Bn1Ozb4~Q639N~GvSXrbzZoVx9ziFfbkiKf1akXr9dQ,DrwwRjH~WrErR595BqxyDeisgcTLRZjCsQUBQSdnPLk,AQACAAE/WebOfTrustRC2/10\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@~aHztTNobVhKiaJ2eE-k6LLMy3qrRzL0zvk1UZp1xAU,xs3tuQsYRrTgxoU5qrayiwoOYEOLE6bTHvIKBQLIwco,AQACAAE/WebOfTrustRC2/3\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@jr3FrHPhtxP-IYQ-A12A3jjNNK4-KcHsUH8qNpBGHJ0,WK9IlZuG17JZ3YvaRUR-3uHf1YqkxxyGxkpkLW56ZTY,AQACAAE/WebOfTrustRC2/1\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@iBBjdbuuabx3v7iy-Pt3WZjWuixqo2-rzH~2kV4FkwE,Hll6SNQ~FXY5mrOY2W0GTfyNhJSlOrYutJmoXeSKseE,AQACAAE/WebOfTrustRC2/4\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@TKOVixP3xx6nA3-cgl2fksatQzxg4LlReoK0GFl7uAo,r~MCdO2rhGxBgRYv2EPuIE-tP7-0z6vuwbS04oyoAyI,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@bK9LQT2mqilUY4DxwmlKvKi5Jfwf4Brr~EQGa8RLIRU,Ni90~c4q-VNFrxFS7cDimQwCcRsqdScHoElWQgBpoT8,AQACAAE/WebOfTrustRC2/6\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@DYXv~V1jDo0XBhaiaGeRvy-~snqMbBiFR~R8TK8VBNg,4YYHZfVVYZmudSCOetDlNxnvbLy6IULV1SOgeC1zXmI,AQACAAE/WebOfTrustRC2/4\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@CSWvDlm9RM31O9NPpZomFvpTVM8cV0brixDXxpwnJ7A,4wfD~qxb5hFgCBN0JWgK6p11wUCpOHGOWhJ4i2FgFhY,AQACAAE/WebOfTrustRC2/0\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@sFsqYnIVQ9FwULsp3e-q0M46fRw2jVsLJYF9PUyHVME,aDhfrzYPt4O0BTuuRF3aCPTR0A~zr2rqHtPpJXeSqFU,AQACAAE/WebOfTrustRC2/4\" Value=\"100\"/>" ++ + "<Trust Comment=\"\" Identity=\"USK@1QwMtp0oc4jIh6DFUjec~U0O3ldWHrRmhh5OZd41MMo,GZ-QOMc4mAkHhG4LwJWU~-rl0zJIp90YcB5hn3M9tlg,AQACAAE/WebOfTrustRC2/4\" Value=\"100\"/>" ++ + "</TrustList>" ++ + "</Identity>" ++ + "</WebOfTrustRC2>"; ++ ++ /** ++ * main method. ++ * ++ * @param args Standard args. ++ */ ++ public static void main(String[] args) { ++ try { ++ final Document xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(rawXML.getBytes("UTF-8"))); ++ final Element identityElement = (Element) xmlDoc.getElementsByTagName("Identity").item(0); ++ final Element trustListElement = (Element) identityElement.getElementsByTagName("TrustList").item(0); ++ final NodeList trustList = trustListElement.getElementsByTagName("Trust"); ++ final Pattern keyPattern = Pattern.compile("USK@[%,~" + "*-_./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz" + "]+"); ++ for (int i = 0; i < trustList.getLength(); ++i) { ++ Element trustElement = (Element) trustList.item(i); ++ final String identity = trustElement.getAttribute("Identity"); ++ if (!keyPattern.matcher(identity).matches()) { ++ throw new RuntimeException("Parsing failure: Instead of USK URI I got: " + identity); ++ } ++ } ++ } catch (Exception ex) { ++ throw new RuntimeException(ex.getMessage()); ++ } ++ } ++ ++} +--- ./jdk/test/javax/xml/jaxp/parsers/8032909/XSLT.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/parsers/8032909/XSLT.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,54 @@ ++/* ++ * 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 8032909 ++ * @summary Test for XSLT string-length function with complementary chars ++ * @compile XSLT.java ++ * @run main/othervm XSLT a_utf16.xml a_utf16.xsl 1270 ++ * @run main/othervm XSLT a_utf8.xml a_utf8.xsl 130 ++ * @run main/othervm XSLT a_windows1252.xml a_windows1252.xsl 200 ++ */ ++ ++import java.io.ByteArrayOutputStream; ++import javax.xml.transform.stream.StreamResult; ++import javax.xml.transform.stream.StreamSource; ++import javax.xml.transform.Transformer; ++import javax.xml.transform.TransformerFactory; ++ ++public class XSLT { ++ public static void main(String[] args) throws Exception { ++ ++ ByteArrayOutputStream resStream = new ByteArrayOutputStream(); ++ TransformerFactory trf = TransformerFactory.newInstance(); ++ Transformer tr = trf.newTransformer(new StreamSource(System.getProperty("test.src", ".")+"/"+args[1])); ++ String res, expectedRes; ++ tr.transform( new StreamSource(System.getProperty("test.src", ".")+"/"+args[0]), new StreamResult(resStream)); ++ res = resStream.toString(); ++ System.out.println("Transformation completed. Result:"+res); ++ ++ if (!res.replaceAll("\\s","").equals(args[2])) ++ throw new RuntimeException("Incorrect transformation result. Expected:"+args[2]+" Observed:"+res); ++ } ++} +Binary file test/javax/xml/jaxp/parsers/8032909/a_utf16.xml has changed +Binary file test/javax/xml/jaxp/parsers/8032909/a_utf16.xsl has changed +--- ./jdk/test/javax/xml/jaxp/parsers/8032909/a_utf8.xml Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/parsers/8032909/a_utf8.xml Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,5 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<testxml> ++<Element>UTF-8_Element</Element> ++<Element2></Element2> ++</testxml> +--- ./jdk/test/javax/xml/jaxp/parsers/8032909/a_utf8.xsl Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/parsers/8032909/a_utf8.xsl Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,13 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ++ ++<xsl:output method="text" /> ++ ++<xsl:template match="Element"> ++<xsl:value-of select="string-length(.)"/> ++</xsl:template> ++<xsl:template match="Element2"> ++<xsl:value-of select="string-length(.)"/> ++</xsl:template> ++ ++</xsl:stylesheet> +--- ./jdk/test/javax/xml/jaxp/parsers/8032909/a_windows1252.xml Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/parsers/8032909/a_windows1252.xml Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,5 @@ ++<?xml version="1.0" encoding="windows-1252"?> ++<testxml> ++<Element>Windows-1252_Element</Element> ++<Element2></Element2> ++</testxml> +--- ./jdk/test/javax/xml/jaxp/parsers/8032909/a_windows1252.xsl Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/jaxp/parsers/8032909/a_windows1252.xsl Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,13 @@ ++<?xml version="1.0" encoding="windows-1252"?> ++<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ++ ++<xsl:output method="text" /> ++ ++<xsl:template match="Element"> ++<xsl:value-of select="string-length(.)"/> ++</xsl:template> ++<xsl:template match="Element2"> ++<xsl:value-of select="string-length(.)"/> ++</xsl:template> ++ ++</xsl:stylesheet> +--- ./jdk/test/javax/xml/jaxp/transform/8004476/TestBase.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/javax/xml/jaxp/transform/8004476/TestBase.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,7 +1,26 @@ + /* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +- * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. + */ ++ + import java.security.Policy; + + /** +--- ./jdk/test/javax/xml/ws/8033113/Organization_List.wsdl Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/8033113/Organization_List.wsdl Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,99 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<!-- ++ 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. ++--> ++<wsdl:definitions targetNamespace="urn:Organization_List" xmlns:s0="urn:Organization_List" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> ++ <wsdl:types> ++ <xsd:schema elementFormDefault="qualified" targetNamespace="urn:Organization_List"> ++ <xsd:element name="OpGetList" type="s0:GetListInputMap"/> ++ <xsd:complexType name="GetListInputMap"> ++ <xsd:sequence> ++ <xsd:element name="Qualification" type="xsd:string"/> ++ </xsd:sequence> ++ </xsd:complexType> ++ <xsd:element name="OpGetListResponse" type="s0:GetListOutputMap"/> ++ <xsd:complexType name="GetListOutputMap"> ++ <xsd:sequence> ++ <xsd:element maxOccurs="unbounded" name="getListValues"> ++ <xsd:complexType> ++ <xsd:sequence> ++ <xsd:element name="Organization_Name" type="xsd:string"/> ++ </xsd:sequence> ++ </xsd:complexType> ++ </xsd:element> ++ </xsd:sequence> ++ </xsd:complexType> ++ <xsd:element name="AuthenticationInfo" type="s0:AuthenticationInfo"/> ++ <xsd:complexType name="AuthenticationInfo"> ++ <xsd:sequence> ++ <xsd:element name="userName" type="xsd:string"/> ++ <xsd:element name="password" type="xsd:string"/> ++ <xsd:element minOccurs="0" name="authentication" type="xsd:string"/> ++ <xsd:element minOccurs="0" name="locale" type="xsd:string"/> ++ <xsd:element minOccurs="0" name="timeZone" type="xsd:string"/> ++ </xsd:sequence> ++ </xsd:complexType> ++ </xsd:schema> ++ </wsdl:types> ++ ++ <wsdl:message name="ARAuthenticate"> ++ <wsdl:part element="s0:AuthenticationInfo" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:message name="OpGetListSoapIn"> ++ <wsdl:part element="s0:OpGetList" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:message name="OpGetListSoapOut"> ++ <wsdl:part element="s0:OpGetListResponse" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:portType name="Organization_ListPortType"> ++ <wsdl:operation name="OpGetList"> ++ <wsdl:input message="s0:OpGetListSoapIn"/> ++ <wsdl:output message="s0:OpGetListSoapOut"/> ++ </wsdl:operation> ++ </wsdl:portType> ++ ++ <wsdl:binding name="Organization_ListSoapBinding" type="s0:Organization_ListPortType"> ++ <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> ++ <wsdl:operation name="OpGetList"> ++ <soap:operation soapAction="urn:Organization_List/OpGetList" style="document"/> ++ <wsdl:input> ++ <soap:header message="s0:ARAuthenticate" part="param" use="literal"> ++ </soap:header> ++ <soap:body use="literal"/> ++ </wsdl:input> ++ <wsdl:output> ++ <soap:body use="literal"/> ++ </wsdl:output> ++ </wsdl:operation> ++ </wsdl:binding> ++ ++ <wsdl:service name="Organization_ListService"> ++ <wsdl:port binding="s0:Organization_ListSoapBinding" name="Organization_ListSoap"> ++ <soap:address location="http://bogus:9080/URL"/> ++ </wsdl:port> ++ </wsdl:service> ++ ++</wsdl:definitions> ++ +--- ./jdk/test/javax/xml/ws/8033113/WsImportTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/8033113/WsImportTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,152 @@ ++/* ++ * 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 8033113 ++ * @summary wsimport fails on WSDL:header parameter name customization ++ * @run main/othervm WsImportTest ++ */ ++ ++import java.io.InputStreamReader; ++import java.io.IOException; ++import java.io.BufferedReader; ++import java.io.File; ++import java.nio.file.Files; ++import java.nio.file.FileVisitResult; ++import java.nio.file.Path; ++import java.nio.file.Paths; ++import java.nio.file.SimpleFileVisitor; ++import java.nio.file.attribute.BasicFileAttributes; ++ ++import static java.nio.file.FileVisitResult.*; ++ ++public class WsImportTest { ++ ++ public static void main(String[] args) throws IOException { ++ ++ String wsimport = getWsImport(); ++ String customization = getWSDLFilePath("customization.xml"); ++ String wsdl = getWSDLFilePath("Organization_List.wsdl"); ++ ++ try { ++ log("Importing wsdl: " + wsdl); ++ String[] wsargs = { ++ wsimport, ++ "-keep", ++ "-verbose", ++ "-extension", ++ "-XadditionalHeaders", ++ "-Xdebug", ++ "-b", ++ customization, ++ wsdl ++ }; ++ ++ ProcessBuilder pb = new ProcessBuilder(wsargs); ++ pb.redirectErrorStream(true); ++ Process p = pb.start(); ++ logOutput(p); ++ int result = p.waitFor(); ++ p.destroy(); ++ ++ if (result != 0) { ++ fail("WsImport failed. TEST FAILED."); ++ } else { ++ log("Test PASSED."); ++ } ++ ++ } catch (Exception e) { ++ e.printStackTrace(); ++ fail(e.getMessage()); ++ } finally { ++ deleteGeneratedFiles(); ++ } ++ } ++ ++ private static void fail(String message) { ++ throw new RuntimeException(message); ++ } ++ ++ private static void log(String msg) { ++ System.out.println(msg); ++ } ++ ++ private static void logOutput(Process p) throws IOException { ++ BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); ++ String s = r.readLine(); ++ while (s != null) { ++ log(s.trim()); ++ s = r.readLine(); ++ } ++ } ++ ++ private static void deleteGeneratedFiles() { ++ Path p = Paths.get("generated"); ++ if (Files.exists(p)) { ++ try { ++ Files.walkFileTree(p, new SimpleFileVisitor<Path>() { ++ @Override ++ public FileVisitResult visitFile(Path file, ++ BasicFileAttributes attrs) throws IOException { ++ ++ Files.delete(file); ++ return CONTINUE; ++ } ++ ++ @Override ++ public FileVisitResult postVisitDirectory(Path dir, ++ IOException exc) throws IOException { ++ ++ if (exc == null) { ++ Files.delete(dir); ++ return CONTINUE; ++ } else { ++ throw exc; ++ } ++ } ++ }); ++ } catch (IOException ioe) { ++ ioe.printStackTrace(); ++ } ++ } ++ } ++ ++ private static String getWSDLFilePath(String filename) { ++ String testSrc = System.getProperty("test.src"); ++ if (testSrc == null) testSrc = "."; ++ return Paths.get(testSrc).resolve(filename).toString(); ++ } ++ ++ private static String getWsImport() { ++ String javaHome = System.getProperty("java.home"); ++ if (javaHome.endsWith("jre")) { ++ javaHome = new File(javaHome).getParent(); ++ } ++ String wsimport = javaHome + File.separator + "bin" + File.separator + "wsimport"; ++ if (System.getProperty("os.name").startsWith("Windows")) { ++ wsimport = wsimport.concat(".exe"); ++ } ++ return wsimport; ++ } ++} +--- ./jdk/test/javax/xml/ws/8033113/customization.xml Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/8033113/customization.xml Wed Jul 30 18:42:59 2014 +0100 +@@ -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. ++--> ++<jaxws:bindings wsdlLocation="./Organization_List.wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> ++ <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> ++ <jaxws:bindings node="wsdl:definitions/wsdl:binding[@name='Organization_ListSoapBinding']/wsdl:operation[@name='OpGetList']"> ++ <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='ARAuthenticate']/wsdl:part[@name='param']" name="authParam"/> ++ <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='OpGetListSoapIn']/wsdl:part[@name='param']" name="inParam"/> ++ <jaxws:parameter part="wsdl:definitions/wsdl:message[@name='OpGetListSoapOut']/wsdl:part[@name='param']" name="outParam"/> ++ </jaxws:bindings> ++</jaxws:bindings> ++ ++<!--wsdl:message definitions from WSDL whose part names we are trying to override... ++ ++ <wsdl:message name="ARAuthenticate"> ++ <wsdl:part element="s0:AuthenticationInfo" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:message name="OpGetListSoapIn"> ++ <wsdl:part element="s0:OpGetList" name="param"/> ++ </wsdl:message> ++ ++ <wsdl:message name="OpGetListSoapOut"> ++ <wsdl:part element="s0:OpGetListResponse" name="param"/> ++ </wsdl:message> ++--> +--- ./jdk/test/javax/xml/ws/8043129/MailTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/8043129/MailTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,148 @@ ++/* ++ * 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 8043129 ++ * @summary JAF initialisation in SAAJ clashing with the one in javax.mail ++ * @author mkos ++ * @library javax.mail.jar ++ * @build MailTest ++ * @run main MailTest ++ */ ++ ++import javax.activation.CommandMap; ++import javax.activation.MailcapCommandMap; ++import javax.mail.BodyPart; ++import javax.mail.Message; ++import javax.mail.MessagingException; ++import javax.mail.Multipart; ++import javax.mail.Session; ++import javax.mail.internet.InternetAddress; ++import javax.mail.internet.MimeBodyPart; ++import javax.mail.internet.MimeMessage; ++import javax.mail.internet.MimeMultipart; ++import javax.xml.soap.AttachmentPart; ++import javax.xml.soap.MessageFactory; ++import javax.xml.soap.SOAPException; ++import javax.xml.soap.SOAPMessage; ++import java.io.ByteArrayOutputStream; ++import java.io.IOException; ++import java.util.Properties; ++ ++public class MailTest { ++ ++ String host = null; ++ String user = ""; ++ String password = null; ++ String from = null; ++ String to = null; ++ ++ public static void main(String[] args) { ++ MailTest t = new MailTest(); ++ ++ t.user = "somebody@somewhere.com"; ++ t.from = "somebody@somewhere.com"; ++ t.to = "somebody@somewhere.com"; ++ ++ t.user = "somebody@somewhere.com"; ++ t.password = "somepassword"; ++ t.host = "somehost"; ++ ++ t.sendMail(); //this works ++ ++ t.addSoapAttachement(); ++ t.sendMail(); //after addAttachmentPart to soapmessage it do not work ++ ++ // workaroundJAFSetup(); ++ // t.sendMail(); //after workaround works again ++ } ++ ++ void addSoapAttachement() { ++ try { ++ MessageFactory messageFactory = MessageFactory.newInstance(); ++ SOAPMessage message = messageFactory.createMessage(); ++ AttachmentPart a = message.createAttachmentPart(); ++ a.setContentType("binary/octet-stream"); ++ message.addAttachmentPart(a); ++ } catch (SOAPException e) { ++ e.printStackTrace(); ++ } ++ } ++ ++ void sendMail() { ++ ++ try { ++ Properties props = new Properties(); ++ props.put("mail.smtp.host", host); ++ props.put("mail.smtp.auth", "true"); ++ ++ Session session = Session.getInstance(props); ++ session.setDebug(true); ++ ++ // Define message ++ MimeMessage message = new MimeMessage(session); ++ message.setFrom(new InternetAddress(from)); ++ message.addRecipients(Message.RecipientType.TO, to); ++ message.setSubject("this is a multipart test"); ++ ++ Multipart multipart = new MimeMultipart(); ++ ++ BodyPart messageBodyPart1 = new MimeBodyPart(); ++ messageBodyPart1.setText("please send also this Content\n ciao!"); ++ multipart.addBodyPart(messageBodyPart1); ++ ++ BodyPart messageBodyPart2 = new MimeBodyPart(); ++ messageBodyPart2.setContent("<b>please</b> send also this Content <br>ciao!", "text/html; charset=UTF-8"); ++ multipart.addBodyPart(messageBodyPart2); ++ ++ message.setContent(multipart); ++ ++ /* ++ Transport tr = session.getTransport("smtp"); ++ tr.connect(host,user, password); ++ tr.sendMessage(message,InternetAddress.parse(to)); ++ tr.close(); ++ */ ++ ++ ByteArrayOutputStream baos = new ByteArrayOutputStream(); ++ message.writeTo(baos); ++ String output = baos.toString(); ++ System.out.println("output = " + output); ++ if (output.contains("also this Content")) { ++ System.out.println("Test PASSED."); ++ } else { ++ System.out.println("Test FAILED, missing content."); ++ throw new IllegalStateException("Test FAILED, missing content."); ++ } ++ } catch (MessagingException ignored) { ++ } catch (IOException ignored) { ++ } ++ } ++ ++ // this is how the error can be worked around ... ++ static void workaroundJAFSetup() { ++ MailcapCommandMap mailMap = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); ++ mailMap.addMailcap("multipart/mixed;;x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); ++ } ++} +Binary file test/javax/xml/ws/8043129/javax.mail.jar has changed +--- ./jdk/test/javax/xml/ws/ebcdic/WsImportTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/ebcdic/WsImportTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,145 @@ ++/* ++ * 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 8038307 ++ * @summary JAX-WS conformance tests fail when running JCK-devtools-8 suite against RI in EBCDIC emulation mode ++ * @run main/othervm WsImportTest ++ */ ++ ++import java.io.InputStreamReader; ++import java.io.IOException; ++import java.io.BufferedReader; ++import java.io.File; ++import java.nio.file.Files; ++import java.nio.file.FileVisitResult; ++import java.nio.file.Path; ++import java.nio.file.Paths; ++import java.nio.file.SimpleFileVisitor; ++import java.nio.file.attribute.BasicFileAttributes; ++import static java.nio.file.FileVisitResult.*; ++ ++public class WsImportTest { ++ ++ public static void main(String[] args) throws IOException { ++ ++ String wsimport = getWsImport(); ++ String wsdl = getWSDLFilePath("test-service.wsdl"); ++ ++ try { ++ log("Importing wsdl: " + wsdl); ++ String[] wsargs = { ++ wsimport, ++ "-p", ++ "generated", ++ "-J-Dfile.encoding=Cp037", ++ wsdl ++ }; ++ ++ ProcessBuilder pb = new ProcessBuilder(wsargs); ++ pb.redirectErrorStream(true); ++ Process p = pb.start(); ++ logOutput(p); ++ int result = p.waitFor(); ++ p.destroy(); ++ ++ if (result != 0) { ++ fail("WsImport failed. TEST FAILED."); ++ } else { ++ log("Test PASSED."); ++ } ++ ++ } catch (Exception e) { ++ e.printStackTrace(); ++ fail(e.getMessage()); ++ } finally { ++ deleteGeneratedFiles(); ++ } ++ } ++ ++ private static void fail(String message) { ++ throw new RuntimeException(message); ++ } ++ ++ private static void log(String msg) { ++ System.out.println(msg); ++ } ++ ++ private static void logOutput(Process p) throws IOException { ++ BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); ++ String s = r.readLine(); ++ while (s != null) { ++ log(s.trim()); ++ s = r.readLine(); ++ } ++ } ++ ++ private static void deleteGeneratedFiles() { ++ Path p = Paths.get("generated"); ++ if (Files.exists(p)) { ++ try { ++ Files.walkFileTree(p, new SimpleFileVisitor<Path>() { ++ @Override ++ public FileVisitResult visitFile(Path file, ++ BasicFileAttributes attrs) throws IOException { ++ ++ Files.delete(file); ++ return CONTINUE; ++ } ++ @Override ++ public FileVisitResult postVisitDirectory(Path dir, ++ IOException exc) throws IOException { ++ ++ if (exc == null) { ++ Files.delete(dir); ++ return CONTINUE; ++ } else { ++ throw exc; ++ } ++ } ++ }); ++ } catch (IOException ioe) { ++ ioe.printStackTrace(); ++ } ++ } ++ } ++ ++ private static String getWSDLFilePath(String filename) { ++ String testSrc = System.getProperty("test.src"); ++ if (testSrc == null) testSrc = "."; ++ return Paths.get(testSrc).resolve(filename).toString(); ++ } ++ ++ private static String getWsImport() { ++ String javaHome = System.getProperty("java.home"); ++ if (javaHome.endsWith("jre")) { ++ javaHome = new File(javaHome).getParent(); ++ } ++ String wsimport = javaHome + File.separator + "bin" + File.separator + "wsimport"; ++ if (System.getProperty("os.name").startsWith("Windows")) { ++ wsimport = wsimport.concat(".exe"); ++ } ++ return wsimport; ++ } ++} +--- ./jdk/test/javax/xml/ws/ebcdic/test-service.wsdl Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/javax/xml/ws/ebcdic/test-service.wsdl Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,67 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<!-- ++ 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. ++--> ++<definitions name="W2JDLAnnotations" ++ targetNamespace="http://w2jdlannotations.org/wsdl" ++ xmlns:tns="http://w2jdlannotations.org/wsdl" ++ xmlns="http://schemas.xmlsoap.org/wsdl/" ++ xmlns:xsd="http://www.w3.org/2001/XMLSchema" ++ xmlns:types="http://w2jdlannotations.org/types" ++ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"> ++ ++ <types> ++ <xsd:schema targetNamespace="http://w2jdlannotations.org/types" attributeFormDefault="qualified" ++ elementFormDefault="qualified"> ++ <xsd:element name="OneWayStringElement"> ++ <xsd:complexType> ++ <xsd:sequence> ++ <xsd:element name="argument" type="xsd:string"/> ++ </xsd:sequence> ++ </xsd:complexType> ++ </xsd:element> ++ </xsd:schema> ++ </types> ++ ++ <message name="oneway"> ++ <part name="varString" element="types:OneWayStringElement"/> ++ </message> ++ <portType name="W2JDLAnnotationsEndpoint"> ++ <operation name="onewayOperation"> ++ <input message="tns:oneway"/> ++ </operation> ++ </portType> ++ <binding name="W2JDLAnnotationsEndpointBinding" type="tns:W2JDLAnnotationsEndpoint"> ++ <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> ++ <operation name="onewayOperation"> ++ <soap:operation soapAction=""/> ++ <input> ++ <soap:body use="literal"/> ++ </input> ++ </operation> ++ </binding> ++ <service name="W2JDLAnnotations"> ++ <port name="W2JDLAnnotationsEndpointPort" binding="tns:W2JDLAnnotationsEndpointBinding"> ++ <soap:address location="http://foo:9999/bar"/> ++ </port> ++ </service> ++</definitions> +--- ./jdk/test/jdk/lambda/MethodReferenceTestCallerSensitive.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/jdk/lambda/MethodReferenceTestCallerSensitive.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -28,6 +28,8 @@ + + + /** ++ * @test ++ * @bug 8020816 + * @author Robert Field + */ + +--- ./jdk/test/jdk/net/Sockets/Test.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/jdk/net/Sockets/Test.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,173 @@ ++/* ++ * 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 8032808 ++ * @run main/othervm -Xcheck:jni Test ++ * @run main/othervm/policy=policy.fail -Xcheck:jni Test fail ++ * @run main/othervm/policy=policy.success -Xcheck:jni Test success ++ */ ++ ++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 { ++ ++ static boolean security; ++ static boolean success; ++ ++ interface Runner { ++ public void run() throws Exception; ++ } ++ ++ public static void main(String[] args) throws Exception { ++ ++ // quick check to see if supportedOptions() working before ++ // creating any sockets and libnet loaded ++ ++ Sockets.supportedOptions(Socket.class); ++ ++ security = System.getSecurityManager() != null; ++ success = security && args[0].equals("success"); ++ ++ // Main thing is to check for JNI problems ++ // Doesn't matter if current system does not support the option ++ // and currently setting the option with the loopback interface ++ // doesn't work either ++ ++ System.out.println ("Security Manager enabled: " + security); ++ if (security) { ++ System.out.println ("Success expected: " + success); ++ } ++ ++ final SocketFlow flowIn = SocketFlow.create() ++ .bandwidth(1000) ++ .priority(SocketFlow.HIGH_PRIORITY); ++ ++ ServerSocket ss = new ServerSocket(0); ++ int tcp_port = ss.getLocalPort(); ++ final InetAddress loop = InetAddress.getByName("127.0.0.1"); ++ final InetSocketAddress loopad = new InetSocketAddress(loop, tcp_port); ++ ++ DatagramSocket dg = new DatagramSocket(0); ++ final int udp_port = dg.getLocalPort(); ++ ++ // If option not available, end test ++ Set<SocketOption<?>> options = Sockets.supportedOptions( ++ DatagramSocket.class ++ ); ++ ++ 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)); ++ ++ // Do some standard options tests first. Since JDK 8 doesn't have java.net API ++ Sockets.setOption(s, StandardSocketOptions.SO_SNDBUF, 8000); ++ System.out.println ("Set SO_SNDBUF to 8000\ngetting returns: "); ++ System.out.println (Sockets.getOption(s, StandardSocketOptions.SO_SNDBUF)); ++ ++ Sockets.setOption(ss, StandardSocketOptions.SO_RCVBUF, 5000); ++ System.out.println ("Set SO_RCVBUF to 5000\ngetting returns: "); ++ System.out.println (Sockets.getOption(s, StandardSocketOptions.SO_RCVBUF)); ++ ++ try { ++ Sockets.setOption(ss, StandardSocketOptions.TCP_NODELAY, true); ++ throw new RuntimeException("TCP_NODELAY should not be supported for ServerSocket"); ++ } catch (UnsupportedOperationException e) {} ++ try { ++ Sockets.setOption(dg, StandardSocketOptions.IP_MULTICAST_LOOP, true); ++ throw new RuntimeException("IP_MULTICAST_LOOP should not be supported for DatagramSocket"); ++ } catch (UnsupportedOperationException e) {} ++ ++ MulticastSocket mc0 = new MulticastSocket(0); ++ Sockets.setOption(mc0, StandardSocketOptions.IP_MULTICAST_LOOP, true); ++ System.out.println ("Expect true: " + Sockets.getOption(mc0, StandardSocketOptions.IP_MULTICAST_LOOP)); ++ ++ // Now the specific tests for SO_FLOW_SLA ++ ++ doTest(()->{ ++ Sockets.setOption(s, ExtendedSocketOptions.SO_FLOW_SLA, flowIn); ++ }); ++ doTest(()->{ ++ Sockets.getOption(s, ExtendedSocketOptions.SO_FLOW_SLA); ++ }); ++ doTest(()->{ ++ sc.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn); ++ }); ++ doTest(()->{ ++ sc.getOption(ExtendedSocketOptions.SO_FLOW_SLA); ++ }); ++ doTest(()->{ ++ DatagramSocket dg1 = new DatagramSocket(0); ++ dg1.connect(loop, udp_port); ++ Sockets.setOption(dg1, ExtendedSocketOptions.SO_FLOW_SLA, flowIn); ++ }); ++ doTest(()->{ ++ DatagramChannel dg2 = DatagramChannel.open(); ++ dg2.bind(new InetSocketAddress(loop, 0)); ++ dg2.connect(new InetSocketAddress(loop, udp_port)); ++ dg2.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn); ++ }); ++ doTest(()->{ ++ MulticastSocket mc1 = new MulticastSocket(0); ++ mc1.connect(loop, udp_port); ++ Sockets.setOption(mc1, ExtendedSocketOptions.SO_FLOW_SLA, flowIn); ++ }); ++ doTest(()->{ ++ AsynchronousSocketChannel asc = AsynchronousSocketChannel.open(); ++ Future<Void> f = asc.connect(loopad); ++ f.get(); ++ asc.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn); ++ }); ++ } ++ ++ static void doTest(Runner func) throws Exception { ++ try { ++ func.run(); ++ if (security && !success) { ++ throw new RuntimeException("Test failed"); ++ } ++ } catch (SecurityException e) { ++ if (success) { ++ throw new RuntimeException("Test failed"); ++ } ++ } 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); ++ } ++ } ++} +--- ./jdk/test/jdk/net/Sockets/policy.fail Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/jdk/net/Sockets/policy.fail Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,4 @@ ++grant { ++ permission java.net.SocketPermission "127.0.0.1", "connect,accept" ; ++ permission java.net.SocketPermission "localhost", "listen" ; ++}; +--- ./jdk/test/jdk/net/Sockets/policy.success Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/jdk/net/Sockets/policy.success Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,6 @@ ++grant { ++ permission java.net.SocketPermission "127.0.0.1", "connect,accept" ; ++ permission java.net.SocketPermission "localhost", "listen" ; ++ permission jdk.net.NetworkPermission "setOption.SO_FLOW_SLA"; ++ permission jdk.net.NetworkPermission "getOption.SO_FLOW_SLA"; ++}; +--- ./jdk/test/lib/security/java.policy/Ext_AllPolicy.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/lib/security/java.policy/Ext_AllPolicy.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -53,7 +53,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/lib/testlibrary/jdk/testlibrary/Asserts.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/Asserts.java Wed Jul 30 18:42:59 2014 +0100 +@@ -23,6 +23,8 @@ + + package jdk.testlibrary; + ++import java.util.Objects; ++ + /** + * Asserts that can be used for verifying assumptions in tests. + * +@@ -171,6 +173,34 @@ + } + + /** ++ * Calls {@link #assertSame(java.lang.Object, java.lang.Object, java.lang.String)} with a default message. ++ * ++ * @param lhs The left hand side of the comparison. ++ * @param rhs The right hand side of the comparison. ++ * @see #assertSame(Object, Object, String) ++ */ ++ public static void assertSame(Object lhs, Object rhs) { ++ assertSame(lhs, rhs, null); ++ } ++ ++ /** ++ * Asserts that {@code lhs} is the same as {@code rhs}. ++ * ++ * @param lhs The left hand side of the comparison. ++ * @param rhs The right hand side of the comparison. ++ * @param msg A description of the assumption; {@code null} for a default message. ++ * @throws RuntimeException if the assertion is not true. ++ */ ++ public static void assertSame(Object lhs, Object rhs, String msg) { ++ if (lhs != rhs) { ++ msg = Objects.toString(msg, "assertSame") ++ + ": expected " + Objects.toString(lhs) ++ + " to equal " + Objects.toString(rhs); ++ throw new RuntimeException(msg); ++ } ++ } ++ ++ /** + * Shorthand for {@link #assertGreaterThanOrEqual(T, T)}. + * + * @see #assertGreaterThanOrEqual(T, T) +--- ./jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java Wed Jul 30 18:42:59 2014 +0100 +@@ -32,6 +32,7 @@ + import java.lang.reflect.Method; + import java.util.ArrayList; + import java.util.Collections; ++import java.util.concurrent.CountDownLatch; + import java.util.Map; + import java.util.concurrent.ExecutionException; + import java.util.concurrent.Future; +@@ -39,6 +40,7 @@ + import java.util.concurrent.TimeUnit; + import java.util.concurrent.TimeoutException; + import java.util.function.Predicate; ++import java.util.function.Consumer; + + import sun.management.VMManagement; + +@@ -70,9 +72,37 @@ + public static Process startProcess(String name, + ProcessBuilder processBuilder) + throws IOException { ++ return startProcess(name, processBuilder, null); ++ } ++ ++ /** ++ * <p>Starts a process from its builder.</p> ++ * <span>The default redirects of STDOUT and STDERR are started</span> ++ * <p>It is possible to monitor the in-streams via the provided {@code consumer} ++ * @param name The process name ++ * @param consumer {@linkplain Consumer} instance to process the in-streams ++ * @param processBuilder The process builder ++ * @return Returns the initialized process ++ * @throws IOException ++ */ ++ public static Process startProcess(String name, ++ ProcessBuilder processBuilder, ++ Consumer<String> consumer) ++ throws IOException { + Process p = null; + try { +- p = startProcess(name, processBuilder, null, -1, TimeUnit.NANOSECONDS); ++ p = startProcess( ++ name, ++ processBuilder, ++ line -> { ++ if (consumer != null) { ++ consumer.accept(line); ++ } ++ return false; ++ }, ++ -1, ++ TimeUnit.NANOSECONDS ++ ); + } catch (InterruptedException | TimeoutException e) { + // can't ever happen + } +@@ -111,25 +141,28 @@ + + stdout.addPump(new LineForwarder(name, System.out)); + stderr.addPump(new LineForwarder(name, System.err)); +- final Phaser phs = new Phaser(1); ++ CountDownLatch latch = new CountDownLatch(1); + if (linePredicate != null) { +- stdout.addPump(new StreamPumper.LinePump() { ++ StreamPumper.LinePump pump = new StreamPumper.LinePump() { + @Override + protected void processLine(String line) { +- if (linePredicate.test(line)) { +- if (phs.getRegisteredParties() > 0) { +- phs.arriveAndDeregister(); +- } ++ if (latch.getCount() > 0 && linePredicate.test(line)) { ++ latch.countDown(); + } + } +- }); ++ }; ++ stdout.addPump(pump); ++ stderr.addPump(pump); + } + Future<Void> stdoutTask = stdout.process(); + Future<Void> stderrTask = stderr.process(); + + try { + if (timeout > -1) { +- phs.awaitAdvanceInterruptibly(0, timeout, unit); ++ long realTimeout = Math.round(timeout * Utils.TIMEOUT_FACTOR); ++ if (!latch.await(realTimeout, unit)) { ++ throw new TimeoutException(); ++ } + } + } catch (TimeoutException | InterruptedException e) { + System.err.println("Failed to start a process (thread dump follows)"); +--- ./jdk/test/lib/testlibrary/jdk/testlibrary/Utils.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/Utils.java Wed Jul 30 18:42:59 2014 +0100 +@@ -57,6 +57,16 @@ + public static final String JAVA_OPTIONS = System.getProperty("test.java.opts", "").trim(); + + ++ /** ++ * Returns the value of 'test.timeout.factor' system property ++ * converted to {@code double}. ++ */ ++ public static final double TIMEOUT_FACTOR; ++ static { ++ String toFactor = System.getProperty("test.timeout.factor", "1.0"); ++ TIMEOUT_FACTOR = Double.parseDouble(toFactor); ++ } ++ + private Utils() { + // Private constructor to prevent class instantiation + } +@@ -108,6 +118,26 @@ + } + + /** ++ * Removes any options specifying which GC to use, for example "-XX:+UseG1GC". ++ * Removes any options matching: -XX:(+/-)Use*GC ++ * Used when a test need to set its own GC version. Then any ++ * GC specified by the framework must first be removed. ++ * @return A copy of given opts with all GC options removed. ++ */ ++ private static final Pattern useGcPattern = Pattern.compile("\\-XX\\:[\\+\\-]Use.+GC"); ++ public static List<String> removeGcOpts(List<String> opts) { ++ List<String> optsWithoutGC = new ArrayList<String>(); ++ for (String opt : opts) { ++ if (useGcPattern.matcher(opt).matches()) { ++ System.out.println("removeGcOpts: removed " + opt); ++ } else { ++ optsWithoutGC.add(opt); ++ } ++ } ++ return optsWithoutGC; ++ } ++ ++ /** + * Splits a string by white space. + * Works like String.split(), but returns an empty array + * if the string is null or empty. +--- ./jdk/test/lib/testlibrary/jsr292/com/oracle/testlibrary/jsr292/Helper.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/lib/testlibrary/jsr292/com/oracle/testlibrary/jsr292/Helper.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,276 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package com.oracle.testlibrary.jsr292; ++ ++import jdk.testlibrary.Asserts; ++ ++import java.lang.invoke.MethodHandle; ++import java.lang.invoke.MethodHandles; ++import java.lang.invoke.MethodType; ++import java.lang.reflect.Array; ++import java.util.*; ++ ++public class Helper { ++ /** Flag for verbose output, true if {@code -Dverbose} specified */ ++ public static final boolean IS_VERBOSE ++ = System.getProperty("verbose") != null; ++ /** ++ * Flag for thorough testing -- all test will be executed, ++ * true if {@code -Dthorough} specified. */ ++ public static final boolean IS_THOROUGH ++ = System.getProperty("thorough") != null; ++ /** Random number generator w/ initial seed equal to {@code -Dseed} */ ++ public static final Random RNG; ++ ++ static { ++ String str = System.getProperty("seed"); ++ long seed = str != null ? Long.parseLong(str) : new Random().nextLong(); ++ RNG = new Random(seed); ++ System.out.printf("-Dseed=%d%n", seed); ++ } ++ ++ public static final long TEST_LIMIT; ++ static { ++ String str = System.getProperty("testLimit"); ++ TEST_LIMIT = str != null ? Long.parseUnsignedLong(str) : 2_000L; ++ System.out.printf("-DtestLimit=%d%n", TEST_LIMIT); ++ } ++ ++ public static final int MAX_ARITY = 254; ++ public static final String MISSING_ARG = "missingArg"; ++ public static final String MISSING_ARG_2 = "missingArg#2"; ++ ++ private static final int ++ // first int value ++ ONE_MILLION = (1000 * 1000), ++ // scale factor to reach upper 32 bits ++ TEN_BILLION = (10 * 1000 * 1000 * 1000), ++ // <<1 makes space for sign bit; ++ INITIAL_ARG_VAL = ONE_MILLION << 1; ++ ++ public static final MethodHandle AS_LIST; ++ ++ static { ++ try { ++ AS_LIST = MethodHandles.lookup().findStatic( ++ Arrays.class, "asList", ++ MethodType.methodType(List.class, Object[].class)); ++ } catch (NoSuchMethodException | IllegalAccessException ex) { ++ throw new Error(ex); ++ } ++ } ++ ++ public static boolean isDoubleCost(Class<?> aClass) { ++ return aClass == double.class || aClass == long.class; ++ } ++ ++ private static List<List<Object>> calledLog = new ArrayList<>(); ++ private static long nextArgVal; ++ ++ public static void assertCalled(String name, Object... args) { ++ assertCalled(0, name, args); ++ } ++ ++ public static void assertCalled(int lag, String name, Object... args) { ++ Object expected = logEntry(name, args); ++ Object actual = getCalled(lag); ++ Asserts.assertEQ(expected, actual, "method call w/ lag = " + lag); ++ } ++ ++ public static Object called(String name, Object... args) { ++ List<Object> entry = logEntry(name, args); ++ calledLog.add(entry); ++ return entry; ++ } ++ ++ private static List<Object> logEntry(String name, Object... args) { ++ return Arrays.asList(name, Arrays.asList(args)); ++ } ++ ++ public static void clear() { ++ calledLog.clear(); ++ } ++ ++ public static List<Object> getCalled(int lag) { ++ int size = calledLog.size(); ++ return size <= lag ? null : calledLog.get(size - lag - 1); ++ } ++ ++ public static MethodHandle addTrailingArgs(MethodHandle target, int nargs, ++ List<Class<?>> classes) { ++ int targetLen = target.type().parameterCount(); ++ int extra = (nargs - targetLen); ++ if (extra <= 0) { ++ return target; ++ } ++ List<Class<?>> fakeArgs = new ArrayList<>(extra); ++ for (int i = 0; i < extra; ++i) { ++ fakeArgs.add(classes.get(i % classes.size())); ++ } ++ return MethodHandles.dropArguments(target, targetLen, fakeArgs); ++ } ++ ++ public static MethodHandle varargsList(int arity) { ++ return AS_LIST.asCollector(Object[].class, arity); ++ } ++ ++ private static long nextArg(boolean moreBits) { ++ long val = nextArgVal++; ++ long sign = -(val & 1); // alternate signs ++ val >>= 1; ++ if (moreBits) ++ // Guarantee some bits in the high word. ++ // In any case keep the decimal representation simple-looking, ++ // with lots of zeroes, so as not to make the printed decimal ++ // strings unnecessarily noisy. ++ { ++ val += (val % ONE_MILLION) * TEN_BILLION; ++ } ++ return val ^ sign; ++ } ++ ++ private static int nextArg() { ++ // Produce a 32-bit result something like ONE_MILLION+(smallint). ++ // Example: 1_000_042. ++ return (int) nextArg(false); ++ } ++ ++ private static long nextArg(Class<?> kind) { ++ if (kind == long.class || kind == Long.class || ++ kind == double.class || kind == Double.class) ++ // produce a 64-bit result something like ++ // ((TEN_BILLION+1) * (ONE_MILLION+(smallint))) ++ // Example: 10_000_420_001_000_042. ++ { ++ return nextArg(true); ++ } ++ return (long) nextArg(); ++ } ++ ++ private static Object randomArg(Class<?> param) { ++ Object wrap = castToWrapperOrNull(nextArg(param), param); ++ if (wrap != null) { ++ return wrap; ++ } ++ ++ if (param.isInterface()) { ++ for (Class<?> c : param.getClasses()) { ++ if (param.isAssignableFrom(c) && !c.isInterface()) { ++ param = c; ++ break; ++ } ++ } ++ } ++ if (param.isArray()) { ++ Class<?> ctype = param.getComponentType(); ++ Object arg = Array.newInstance(ctype, 2); ++ Array.set(arg, 0, randomArg(ctype)); ++ return arg; ++ } ++ if (param.isInterface() && param.isAssignableFrom(List.class)) { ++ return Arrays.asList("#" + nextArg()); ++ } ++ if (param.isInterface() || param.isAssignableFrom(String.class)) { ++ return "#" + nextArg(); ++ } ++ ++ try { ++ return param.newInstance(); ++ } catch (InstantiationException | IllegalAccessException ex) { ++ } ++ return null; // random class not Object, String, Integer, etc. ++ } ++ ++ public static Object[] randomArgs(Class<?>... params) { ++ Object[] args = new Object[params.length]; ++ for (int i = 0; i < args.length; i++) { ++ args[i] = randomArg(params[i]); ++ } ++ return args; ++ } ++ ++ public static Object[] randomArgs(int nargs, Class<?> param) { ++ Object[] args = new Object[nargs]; ++ for (int i = 0; i < args.length; i++) { ++ args[i] = randomArg(param); ++ } ++ return args; ++ } ++ ++ public static Object[] randomArgs(int nargs, Class<?>... params) { ++ Object[] args = new Object[nargs]; ++ for (int i = 0; i < args.length; i++) { ++ Class<?> param = params[i % params.length]; ++ args[i] = randomArg(param); ++ } ++ return args; ++ } ++ ++ public static Object[] randomArgs(List<Class<?>> params) { ++ return randomArgs(params.toArray(new Class<?>[params.size()])); ++ } ++ ++ private static Object castToWrapper(Object value, Class<?> dst) { ++ Object wrap = null; ++ if (value instanceof Number) { ++ wrap = castToWrapperOrNull(((Number) value).longValue(), dst); ++ } ++ if (value instanceof Character) { ++ wrap = castToWrapperOrNull((char) (Character) value, dst); ++ } ++ if (wrap != null) { ++ return wrap; ++ } ++ return dst.cast(value); ++ } ++ ++ @SuppressWarnings("cast") ++ // primitive cast to (long) is part of the pattern ++ private static Object castToWrapperOrNull(long value, Class<?> dst) { ++ if (dst == int.class || dst == Integer.class) { ++ return (int) (value); ++ } ++ if (dst == long.class || dst == Long.class) { ++ return (long) (value); ++ } ++ if (dst == char.class || dst == Character.class) { ++ return (char) (value); ++ } ++ if (dst == short.class || dst == Short.class) { ++ return (short) (value); ++ } ++ if (dst == float.class || dst == Float.class) { ++ return (float) (value); ++ } ++ if (dst == double.class || dst == Double.class) { ++ return (double) (value); ++ } ++ if (dst == byte.class || dst == Byte.class) { ++ return (byte) (value); ++ } ++ if (dst == boolean.class || dst == boolean.class) { ++ return ((value % 29) & 1) == 0; ++ } ++ return null; ++ } ++} +--- ./jdk/test/sun/awt/dnd/8024061/bug8024061.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/awt/dnd/8024061/bug8024061.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,357 @@ ++/* ++ * 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 8024061 ++ * @summary Checks that no exception is thrown if dragGestureRecognized ++ * takes a while to complete. ++ */ ++import sun.awt.OSInfo; ++import sun.awt.OSInfo.OSType; ++import sun.awt.SunToolkit; ++ ++import java.awt.*; ++import java.awt.datatransfer.DataFlavor; ++import java.awt.datatransfer.Transferable; ++import java.awt.datatransfer.UnsupportedFlavorException; ++import java.awt.dnd.DnDConstants; ++import java.awt.dnd.DragGestureEvent; ++import java.awt.dnd.DragGestureListener; ++import java.awt.dnd.DragSource; ++import java.awt.dnd.DragSourceDragEvent; ++import java.awt.dnd.DragSourceDropEvent; ++import java.awt.dnd.DragSourceEvent; ++import java.awt.dnd.DragSourceListener; ++import java.awt.dnd.DropTarget; ++import java.awt.dnd.DropTargetDragEvent; ++import java.awt.dnd.DropTargetDropEvent; ++import java.awt.dnd.DropTargetEvent; ++import java.awt.dnd.DropTargetListener; ++import java.awt.event.InputEvent; ++ ++import java.io.IOException; ++import java.lang.reflect.InvocationTargetException; ++import java.util.concurrent.CountDownLatch; ++import java.util.concurrent.TimeUnit; ++ ++import javax.swing.*; ++ ++/** ++ * If dragGestureRecognized() takes a while to complete and if user performs a drag quickly, ++ * an exception is thrown from DropTargetListener.dragEnter when it calls ++ * DropTargetDragEvent.getTransferable(). ++ * <p> ++ * This class introduces a delay in dragGestureRecognized() to cause the exception. ++ */ ++public class bug8024061 { ++ private static final DataFlavor DropObjectFlavor; ++ private static final int DELAY = 1000; ++ ++ private final DnDPanel panel1 = new DnDPanel(Color.yellow); ++ private final DnDPanel panel2 = new DnDPanel(Color.pink); ++ private final JFrame frame; ++ ++ private static final CountDownLatch lock = new CountDownLatch(1); ++ private static volatile Exception dragEnterException = null; ++ ++ static { ++ DataFlavor flavor = null; ++ try { ++ flavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType); ++ } catch (ClassNotFoundException e) { ++ e.printStackTrace(); ++ } ++ DropObjectFlavor = flavor; ++ } ++ ++ bug8024061() { ++ frame = new JFrame("DnDWithRobot"); ++ frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); ++ ++ Dimension d = new Dimension(100, 100); ++ ++ panel1.setPreferredSize(d); ++ panel2.setPreferredSize(d); ++ ++ Container content = frame.getContentPane(); ++ content.setLayout(new GridLayout(1, 2, 5, 5)); ++ content.add(panel1); ++ content.add(panel2); ++ ++ frame.pack(); ++ ++ DropObject drop = new DropObject(); ++ drop.place(panel1, new Point(10, 10)); ++ frame.setVisible(true); ++ } ++ ++ public static void main(String[] args) throws AWTException, InvocationTargetException, InterruptedException { ++ OSType type = OSInfo.getOSType(); ++ if (type != OSType.LINUX && type != OSType.SOLARIS) { ++ System.out.println("This test is for Linux and Solaris only... " + ++ "skipping!"); ++ return; ++ } ++ ++ final bug8024061[] dnd = {null}; ++ SwingUtilities.invokeAndWait(new Runnable() { ++ @Override ++ public void run() { ++ dnd[0] = new bug8024061(); ++ } ++ }); ++ final Robot robot = new Robot(); ++ robot.setAutoDelay(10); ++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); ++ toolkit.realSync(); ++ ++ JFrame frame = dnd[0].frame; ++ Point point = frame.getLocationOnScreen(); ++ Point here = new Point(point.x + 35, point.y + 45); ++ Point there = new Point(point.x + 120, point.y + 45); ++ here.x += 25; ++ robot.mouseMove(here.x, here.y); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ while (here.x < there.x) { ++ here.x += 20; ++ robot.mouseMove(here.x, here.y); ++ System.out.println("x = " + here.x); ++ } ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ toolkit.realSync(); ++ robot.mousePress(InputEvent.BUTTON1_MASK); ++ robot.mouseRelease(InputEvent.BUTTON1_MASK); ++ System.out.println("finished"); ++ ++ try { ++ if (lock.await(5, TimeUnit.SECONDS)) { ++ if (dragEnterException == null) { ++ System.out.println("Test passed."); ++ } else { ++ System.out.println("Test failed."); ++ dragEnterException.printStackTrace(); ++ throw new RuntimeException(dragEnterException); ++ } ++ } else { ++ System.out.println("Test failed. Timeout reached"); ++ throw new RuntimeException("Timed out waiting for dragEnter()"); ++ } ++ } finally { ++ frame.dispose(); ++ } ++ } ++ ++ class DropObject implements Transferable { ++ DnDPanel panel; ++ Color color = Color.CYAN; ++ int width = 50; ++ int height = 50; ++ int x; ++ int y; ++ ++ void draw(Graphics2D g) { ++ Color savedColor = g.getColor(); ++ g.setColor(color); ++ g.fillRect(x, y, width, height); ++ g.setColor(Color.lightGray); ++ g.drawRect(x, y, width, height); ++ g.setColor(savedColor); ++ } ++ ++ boolean contains(int x, int y) { ++ return (x > this.x && x < this.x + width) ++ && (y > this.y && y < this.y + height); ++ } ++ ++ @Override ++ public DataFlavor[] getTransferDataFlavors() { ++ return new DataFlavor[]{DropObjectFlavor}; ++ } ++ ++ void place(DnDPanel panel, Point location) { ++ if (panel != this.panel) { ++ x = location.x; ++ y = location.y; ++ if (this.panel != null) { ++ this.panel.setDropObject(null); ++ this.panel.repaint(); ++ } ++ this.panel = panel; ++ this.panel.setDropObject(this); ++ this.panel.repaint(); ++ } ++ } ++ ++ @Override ++ public boolean isDataFlavorSupported(DataFlavor flavor) { ++ return DropObjectFlavor.equals(flavor); ++ } ++ ++ @Override ++ public Object getTransferData(DataFlavor flavor) ++ throws UnsupportedFlavorException, IOException { ++ if (isDataFlavorSupported(flavor)) { ++ return this; ++ } else { ++ throw new UnsupportedFlavorException(flavor); ++ } ++ } ++ } ++ ++ class DnDPanel extends JPanel { ++ DropObject dropObject; ++ final DragSource dragSource; ++ final DropTarget dropTarget; ++ final Color color; ++ final DragGestureListener dgListener; ++ final DragSourceListener dsListener; ++ final DropTargetListener dtListener; ++ ++ DnDPanel(Color color) { ++ this.color = color; ++ this.dragSource = DragSource.getDefaultDragSource(); ++ dgListener = new DragGestureListener() { ++ @Override ++ public void dragGestureRecognized(DragGestureEvent dge) { ++ Point location = dge.getDragOrigin(); ++ if (dropObject != null && dropObject.contains(location.x, location.y)) { ++ dragSource.startDrag(dge, DragSource.DefaultCopyNoDrop, dropObject, dsListener); ++ try { ++ Thread.sleep(DELAY); ++ } catch (InterruptedException e) { ++ } ++ } ++ } ++ }; ++ ++ dsListener = new DragSourceListener() { ++ @Override ++ public void dragEnter(DragSourceDragEvent dsde) { ++ } ++ ++ @Override ++ public void dragOver(DragSourceDragEvent dsde) { ++ } ++ ++ @Override ++ public void dropActionChanged(DragSourceDragEvent dsde) { ++ } ++ ++ @Override ++ public void dragExit(DragSourceEvent dse) { ++ } ++ ++ @Override ++ public void dragDropEnd(DragSourceDropEvent dsde) { ++ } ++ }; ++ ++ dtListener = new DropTargetListener() { ++ @Override ++ public void dragEnter(DropTargetDragEvent dtde) { ++ if (dropObject != null) { ++ dtde.rejectDrag(); ++ return; ++ } ++ dtde.acceptDrag(DnDConstants.ACTION_MOVE); ++ try { ++ Transferable t = dtde.getTransferable(); ++ Object data = t.getTransferData(DropObjectFlavor); ++ if (data != null) { ++ throw new Exception("getTransferData returned non-null"); ++ } ++ } catch (Exception e) { ++ dragEnterException = e; ++ e.printStackTrace(); ++ } finally { ++ lock.countDown(); ++ } ++ } ++ ++ @Override ++ public void dragOver(DropTargetDragEvent dtde) { ++ if (dropObject != null) { ++ dtde.rejectDrag(); ++ return; ++ } ++ dtde.acceptDrag(DnDConstants.ACTION_MOVE); ++ } ++ ++ @Override ++ public void dropActionChanged(DropTargetDragEvent dtde) { ++ } ++ ++ @Override ++ public void dragExit(DropTargetEvent dte) { ++ } ++ ++ @Override ++ public void drop(DropTargetDropEvent dtde) { ++ if (dropObject != null) { ++ dtde.rejectDrop(); ++ return; ++ } ++ try { ++ dtde.acceptDrop(DnDConstants.ACTION_MOVE); ++ Transferable t = dtde.getTransferable(); ++ DropObject dropObject = (DropObject) t.getTransferData(DropObjectFlavor); ++ Point location = dtde.getLocation(); ++ dropObject.place(DnDPanel.this, location); ++ dtde.dropComplete(true); ++ } catch (Exception e) { ++ e.printStackTrace(); ++ } ++ ++ } ++ }; ++ ++ dragSource.createDefaultDragGestureRecognizer(this, ++ DnDConstants.ACTION_MOVE, dgListener); ++ ++ dropTarget = new DropTarget(this, DnDConstants.ACTION_MOVE, dtListener, true); ++ ++ } ++ ++ public void paintComponent(Graphics g) { ++ super.paintComponent(g); ++ Color savedColor = g.getColor(); ++ g.setColor(color); ++ g.fillRect(0, 0, getWidth(), getHeight()); ++ g.setColor(savedColor); ++ if (dropObject != null) { ++ dropObject.draw((Graphics2D) g); ++ } ++ } ++ ++ void setDropObject(DropObject dropObject) { ++ this.dropObject = dropObject; ++ } ++ ++ DropObject findDropObject(int x, int y) { ++ if (dropObject != null && dropObject.contains(x, y)) { ++ return dropObject; ++ } ++ return null; ++ } ++ } ++} +--- ./jdk/test/sun/awt/image/bug8038000.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/awt/image/bug8038000.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,153 @@ ++/* ++ * 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 8038000 ++ * ++ * @summary Verifies that we could create different type of Rasters with height 1 ++ * and strideline which exceeds raster width. ++ * Also checks that a set of RasterOp work correctly with such kind of Rasters. ++ * ++ * @run main bug8038000 ++ */ ++ ++import java.awt.*; ++import java.awt.color.ColorSpace; ++import java.awt.geom.AffineTransform; ++import java.awt.image.*; ++import java.util.Arrays; ++ ++public class bug8038000 { ++ ++ public static void main(String[] args) throws Exception { ++ new bug8038000().checkOps(); ++ ++ // No exceptions - Passed ++ } ++ ++ private void checkOps() throws Exception { ++ ++ RasterOp[] ops = new RasterOp[] { ++ new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_sRGB), ++ ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), null), ++ new AffineTransformOp(AffineTransform.getScaleInstance(1, 1.1), null) ++ }; ++ ++ ++ for (RasterOp op: ops) { ++ // Banded rasters ++ checkOp(Raster.createBandedRaster(DataBuffer.TYPE_BYTE, 10, 1, 10, ++ new int[] {0, 1, 2}, new int[]{2,1,0}, null), ++ Raster.createBandedRaster(DataBuffer.TYPE_BYTE, 10, 1, 1001, ++ new int[] {0, 1, 2}, new int[]{2,1,0}, null), op); ++ checkOp(Raster.createBandedRaster(DataBuffer.TYPE_USHORT, 10, 1, 10, ++ new int[] {0, 1, 2}, new int[]{2,1,0}, null), ++ Raster.createBandedRaster(DataBuffer.TYPE_USHORT, 10, 1, 1001, ++ new int[] {0, 1, 2}, new int[]{2,1,0}, null), op); ++ checkOp(Raster.createBandedRaster(DataBuffer.TYPE_INT, 10, 1, 10, ++ new int[] {0, 1, 2}, new int[]{2,1,0}, null), ++ Raster.createBandedRaster(DataBuffer.TYPE_INT, 10, 1, 1001, ++ new int[] {0, 1, 2}, new int[]{2,1,0}, null), op); ++ ++ // Interleaved rasters ++ checkOp(Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, ++ 10, 1, 30, 3, new int[]{0, 1, 2}, null), ++ Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, ++ 10, 1, 1001, 3, new int[]{0, 1, 2}, null), ++ op); ++ ++ checkOp(Raster.createInterleavedRaster(DataBuffer.TYPE_USHORT, ++ 10, 1, 30, 3, new int[]{0, 1, 2}, null), ++ Raster.createInterleavedRaster(DataBuffer.TYPE_USHORT, ++ 10, 1, 1001, 3, new int[]{0, 1, 2}, null), ++ op); ++ ++ // Packed rasters ++ checkOp(Raster.createPackedRaster(new DataBufferByte(10), 10, 1, 10, ++ new int[] {0x01, 0x02, 0x04}, null), ++ Raster.createPackedRaster(new DataBufferByte(10), 10, 1, 2000, ++ new int[] {0x01, 0x02, 0x04}, null), ++ op); ++ checkOp(Raster.createPackedRaster(new DataBufferInt(10), 10, 1, 10, ++ new int[] {0xff0000, 0x00ff00, 0x0000ff}, null), ++ Raster.createPackedRaster(new DataBufferInt(10), 10, 1, 20, ++ new int[] {0xff0000, 0x00ff00, 0x0000ff}, null), ++ op); ++ ++ } ++ } ++ ++ /** ++ * Takes two identical rasters (identical with the exception of scanline stride) ++ * fills their pixels with identical data, applies the RasterOp to both rasters ++ * and checks that the result is the same ++ */ ++ private void checkOp(WritableRaster wr1, WritableRaster wr2, RasterOp op) { ++ System.out.println("Checking " + op + " with rasters: \n " + wr1 + ++ "\n " + wr2); ++ try { ++ WritableRaster r1 = op.filter(fillRaster(wr1), null); ++ WritableRaster r2 = op.filter(fillRaster(wr2), null); ++ compareRasters(r1, r2); ++ } catch (ImagingOpException e) { ++ System.out.println(" Skip: Op is not supported: " + e); ++ } ++ } ++ ++ private WritableRaster fillRaster(WritableRaster wr) { ++ int c = 0; ++ for(int x = wr.getMinX(); x < wr.getMinX() + wr.getWidth(); x++) { ++ for(int y = wr.getMinY(); y < wr.getMinY() + wr.getHeight(); y++) { ++ for (int b = 0; b < wr.getNumBands(); b++) { ++ wr.setSample(x, y, b, c++); ++ } ++ } ++ } ++ return wr; ++ } ++ ++ private void compareRasters(Raster r1, Raster r2) { ++ Rectangle bounds = r1.getBounds(); ++ if (!bounds.equals(r2.getBounds())) { ++ throw new RuntimeException("Bounds differ."); ++ } ++ ++ if (r1.getNumBands() != r2.getNumBands()) { ++ throw new RuntimeException("Bands differ."); ++ } ++ ++ int[] b1 = new int[r1.getNumBands()]; ++ int[] b2 = new int[r1.getNumBands()]; ++ ++ for (int x = (int) bounds.getX(); x < bounds.getMaxX(); x++) { ++ for (int y = (int) bounds.getY(); y < bounds.getMaxY(); y++) { ++ r1.getPixel(x,y, b1); ++ r2.getPixel(x,y, b2); ++ if (!Arrays.equals(b1, b2)) { ++ throw new RuntimeException("Pixels differ."); ++ } ++ } ++ } ++ } ++} +--- ./jdk/test/sun/java2d/DrawCachedImageAndTransform.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/java2d/DrawCachedImageAndTransform.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,56 @@ ++/* ++ * 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.awt.Color; ++import java.awt.Graphics2D; ++import java.awt.GraphicsConfiguration; ++import java.awt.GraphicsEnvironment; ++import java.awt.image.BufferedImage; ++import java.awt.image.VolatileImage; ++ ++/** ++ * @test ++ * @bug 8039774 ++ * @summary Verifies that we get no exception, when we draw with scale ++ * BufferedImage to VolatileImage via intermediate texture. ++ * @author Sergey Bylokhov ++ * @run main/othervm -Dsun.java2d.accthreshold=0 DrawCachedImageAndTransform ++ */ ++public final class DrawCachedImageAndTransform { ++ ++ public static void main(String[] args) { ++ GraphicsEnvironment ge = GraphicsEnvironment ++ .getLocalGraphicsEnvironment(); ++ GraphicsConfiguration gc = ge.getDefaultScreenDevice() ++ .getDefaultConfiguration(); ++ VolatileImage vi = gc.createCompatibleVolatileImage(100, 100); ++ ++ Graphics2D g2d = vi.createGraphics(); ++ g2d.scale(2, 2); ++ BufferedImage img = new BufferedImage(50, 50, ++ BufferedImage.TYPE_INT_ARGB); ++ ++ g2d.drawImage(img, 10, 25, Color.blue, null); ++ g2d.dispose(); ++ } ++} +--- ./jdk/test/sun/java2d/DrawXORModeTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/java2d/DrawXORModeTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,110 @@ ++/* ++ * 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 8036022 ++ * @summary Test verifies that drawing shapes with XOR composite ++ * does not trigger an InternalError in GDI surface data. ++ * @run main/othervm -Dsun.java2d.d3d=True DrawXORModeTest ++ */ ++import java.awt.BasicStroke; ++import java.awt.Color; ++import java.awt.Component; ++import java.awt.Dimension; ++import java.awt.Frame; ++import java.awt.Graphics; ++import java.awt.Graphics2D; ++import java.awt.Stroke; ++import java.awt.geom.Line2D; ++import java.util.concurrent.CountDownLatch; ++ ++public class DrawXORModeTest extends Component { ++ ++ public static void main(String[] args) { ++ final DrawXORModeTest c = new DrawXORModeTest(); ++ ++ final Frame f = new Frame("XOR mode test"); ++ f.add(c); ++ f.pack(); ++ ++ f.setVisible(true); ++ ++ try { ++ c.checkResult(); ++ } finally { ++ f.dispose(); ++ } ++ } ++ ++ @Override ++ public void paint(Graphics g) { ++ if (g == null || !(g instanceof Graphics2D)) { ++ return; ++ } ++ g.setColor(Color.white); ++ g.setXORMode(Color.black); ++ Graphics2D dg = (Graphics2D) g; ++ Stroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, ++ BasicStroke.JOIN_MITER, ++ 10.0f, ++ new float[]{1.0f, 1.0f}, ++ 0.0f); ++ dg.setStroke(stroke); ++ try { ++ dg.draw(new Line2D.Float(10, 10, 20, 20)); ++ } catch (Throwable e) { ++ synchronized (this) { ++ theError = e; ++ } ++ } finally { ++ didDraw.countDown(); ++ } ++ } ++ ++ @Override ++ public Dimension getPreferredSize() { ++ return new Dimension(400, 100); ++ } ++ ++ public void checkResult() { ++ try { ++ didDraw.await(); ++ } catch (InterruptedException e) { ++ } ++ ++ synchronized (this) { ++ if (theError != null) { ++ System.out.println("Error: " + theError); ++ ++ throw new RuntimeException("Test FAILED."); ++ } ++ } ++ System.out.println("Test PASSED."); ++ ++ } ++ ++ private Throwable theError = null; ++ ++ private final CountDownLatch didDraw = new CountDownLatch(1); ++} +--- ./jdk/test/sun/management/jdp/JdpDefaultsTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jdp/JdpDefaultsTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -28,7 +28,7 @@ + * @test JdpDefaultsTest + * @summary Assert that we can read JDP packets from a multicast socket connection, on default IP and port. + * @library /lib/testlibrary +- * @build ClientConnection JdpTestUtil JdpTestCase JdpOnTestCase DynamicLauncher ++ * @build jdk.testlibrary.* ClientConnection JdpTestUtil JdpTestCase JdpOnTestCase DynamicLauncher + * @run main JdpDefaultsTest + */ + +--- ./jdk/test/sun/management/jdp/JdpOffTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jdp/JdpOffTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -29,7 +29,7 @@ + * @test JdpOffTest.java + * @summary Assert that no JDP packets are sent to the default address and port. + * @library /lib/testlibrary +- * @build ClientConnection JdpTestUtil JdpTestCase JdpOffTestCase DynamicLauncher ++ * @build jdk.testlibrary.* ClientConnection JdpTestUtil JdpTestCase JdpOffTestCase DynamicLauncher + * @run main JdpOffTest + */ + +--- ./jdk/test/sun/management/jdp/JdpSpecificAddressTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jdp/JdpSpecificAddressTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -28,7 +28,7 @@ + * @test JdpSpecificAddressTest + * @summary Assert that we can read JDP packets from a multicast socket connection, on specific IP and port. + * @library /lib/testlibrary +- * @build ClientConnection JdpTestUtil JdpTestCase JdpOnTestCase DynamicLauncher ++ * @build jdk.testlibrary.* ClientConnection JdpTestUtil JdpTestCase JdpOnTestCase DynamicLauncher + * @run main JdpSpecificAddressTest + */ + +--- ./jdk/test/sun/management/jmxremote/LocalRMIServerSocketFactoryTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jmxremote/LocalRMIServerSocketFactoryTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2008, 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 +@@ -44,6 +44,7 @@ + + private static final SynchronousQueue<Exception> queue = + new SynchronousQueue<Exception>(); ++ private static volatile boolean isRunning = true; + + static final class Result extends Exception { + +@@ -91,19 +92,23 @@ + Thread t = new Thread() { + + public void run() { +- while (true) { ++ while (isRunning) { + Exception error = Result.SUCCESS; + try { + System.err.println("Accepting: "); + final Socket ss = s.accept(); + System.err.println(ss.getInetAddress() + " accepted"); + } catch (Exception x) { +- x.printStackTrace(); ++ if (isRunning) { ++ x.printStackTrace(); ++ } + error = x; + } finally { + try { +- // wait for the client to get the exception. +- queue.put(error); ++ if (isRunning) { ++ // wait for the client to get the exception. ++ queue.put(error); ++ } + } catch (Exception x) { + // too bad! + System.err.println("Could't send result to client!"); +@@ -114,32 +119,38 @@ + } + } + }; +- t.setDaemon(true); +- t.start(); + +- System.err.println("new Socket((String)null, port)"); +- final Socket s1 = new Socket((String) null, port); +- checkError("new Socket((String)null, port)"); +- s1.close(); +- System.err.println("new Socket((String)null, port): PASSED"); ++ try { ++ t.start(); + +- System.err.println("new Socket(InetAddress.getByName(null), port)"); +- final Socket s2 = new Socket(InetAddress.getByName(null), port); +- checkError("new Socket(InetAddress.getByName(null), port)"); +- s2.close(); +- System.err.println("new Socket(InetAddress.getByName(null), port): PASSED"); ++ System.err.println("new Socket((String)null, port)"); ++ final Socket s1 = new Socket((String) null, port); ++ checkError("new Socket((String)null, port)"); ++ s1.close(); ++ System.err.println("new Socket((String)null, port): PASSED"); + +- System.err.println("new Socket(localhost, port)"); +- final Socket s3 = new Socket("localhost", port); +- checkError("new Socket(localhost, port)"); +- s3.close(); +- System.err.println("new Socket(localhost, port): PASSED"); ++ System.err.println("new Socket(InetAddress.getByName(null), port)"); ++ final Socket s2 = new Socket(InetAddress.getByName(null), port); ++ checkError("new Socket(InetAddress.getByName(null), port)"); ++ s2.close(); ++ System.err.println("new Socket(InetAddress.getByName(null), port): PASSED"); + +- System.err.println("new Socket(127.0.0.1, port)"); +- final Socket s4 = new Socket("127.0.0.1", port); +- checkError("new Socket(127.0.0.1, port)"); +- s4.close(); +- System.err.println("new Socket(127.0.0.1, port): PASSED"); ++ System.err.println("new Socket(localhost, port)"); ++ final Socket s3 = new Socket("localhost", port); ++ checkError("new Socket(localhost, port)"); ++ s3.close(); ++ System.err.println("new Socket(localhost, port): PASSED"); + ++ System.err.println("new Socket(127.0.0.1, port)"); ++ final Socket s4 = new Socket("127.0.0.1", port); ++ checkError("new Socket(127.0.0.1, port)"); ++ s4.close(); ++ System.err.println("new Socket(127.0.0.1, port): PASSED"); ++ } ++ finally { ++ isRunning = false; ++ s.close(); ++ t.join(); ++ } + } + } +--- ./jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -22,11 +22,13 @@ + */ + + import java.io.File; ++import java.io.IOException; + import java.nio.file.FileSystem; + import java.nio.file.FileSystems; + import java.nio.file.Files; + import java.nio.file.LinkOption; + import java.nio.file.Path; ++import java.nio.file.StandardCopyOption; + import java.nio.file.attribute.PosixFilePermission; + import java.util.HashSet; + import java.util.Set; +@@ -39,14 +41,14 @@ + * @test + * @bug 6434402 8004926 + * @library /lib/testlibrary +- * @build jdk.testlibrary.ProcessTools +- * @build TestManager TestApplication CustomLauncherTest ++ * @build jdk.testlibrary.* TestManager TestApplication CustomLauncherTest + * @run main/othervm CustomLauncherTest + * @author Jaroslav Bachorik + */ + public class CustomLauncherTest { + private static final String TEST_CLASSPATH = System.getProperty("test.class.path"); + private static final String TEST_JDK = System.getProperty("test.jdk"); ++ private static final String WORK_DIR = System.getProperty("user.dir"); + + private static final String TEST_SRC = System.getProperty("test.src"); + private static final String OSNAME = System.getProperty("os.name"); +@@ -88,35 +90,13 @@ + return; + } + +- String PLATFORM = ""; +- switch (OSNAME.toLowerCase()) { +- case "linux": { +- PLATFORM = "linux"; +- break; +- } +- case "sunos": { +- PLATFORM = "solaris"; +- break; +- } +- default: { +- System.out.println("Test not designed to run on this operating " + +- "system (" + OSNAME + "), skipping..."); +- return; +- } ++ if (getPlatform() == null) { ++ System.out.println("Test not designed to run on this operating " + ++ "system (" + OSNAME + "), skipping..."); ++ return; + } + +- String LAUNCHER = TEST_SRC + File.separator + PLATFORM + "-" + ARCH + +- File.separator + "launcher"; +- + final FileSystem FS = FileSystems.getDefault(); +- Path launcherPath = FS.getPath(LAUNCHER); +- +- final boolean hasLauncher = Files.isRegularFile(launcherPath, LinkOption.NOFOLLOW_LINKS)&& +- Files.isReadable(launcherPath); +- if (!hasLauncher) { +- System.out.println("Launcher [" + LAUNCHER + "] does not exist. Skipping the test."); +- return; +- } + + Path libjvmPath = findLibjvm(FS); + if (libjvmPath == null) { +@@ -125,23 +105,20 @@ + + Process serverPrc = null, clientPrc = null; + +- final Set<PosixFilePermission> launcherOrigPerms = +- Files.getPosixFilePermissions(launcherPath, LinkOption.NOFOLLOW_LINKS); + try { +- // It is impossible to store an executable file in the source control +- // We need to set the executable flag here +- if (!Files.isExecutable(launcherPath)) { +- Set<PosixFilePermission> perms = new HashSet<>(launcherOrigPerms); +- perms.add(PosixFilePermission.OWNER_EXECUTE); +- Files.setPosixFilePermissions(launcherPath, perms); +- } ++ String[] launcher = getLauncher(); + + System.out.println("Starting custom launcher:"); + System.out.println("========================="); +- System.out.println(" launcher : " + LAUNCHER); ++ System.out.println(" launcher : " + launcher[0]); + System.out.println(" libjvm : " + libjvmPath.toString()); + System.out.println(" classpath : " + TEST_CLASSPATH); +- ProcessBuilder server = new ProcessBuilder(LAUNCHER, libjvmPath.toString(), TEST_CLASSPATH, "TestApplication"); ++ ProcessBuilder server = new ProcessBuilder( ++ launcher[1], ++ libjvmPath.toString(), ++ TEST_CLASSPATH, ++ "TestApplication" ++ ); + + final AtomicReference<String> port = new AtomicReference<>(); + final AtomicReference<String> pid = new AtomicReference<>(); +@@ -198,8 +175,6 @@ + throw new Error("Test failed"); + } + } finally { +- // Let's restore the original launcher permissions +- Files.setPosixFilePermissions(launcherPath, launcherOrigPerms); + if (clientPrc != null) { + clientPrc.destroy(); + clientPrc.waitFor(); +@@ -240,4 +215,62 @@ + private static boolean isFileOk(Path path) { + return Files.isRegularFile(path) && Files.isReadable(path); + } ++ ++ private static String getPlatform() { ++ String platform = null; ++ switch (OSNAME.toLowerCase()) { ++ case "linux": { ++ platform = "linux"; ++ break; ++ } ++ case "sunos": { ++ platform = "solaris"; ++ break; ++ } ++ default: { ++ platform = null; ++ } ++ } ++ ++ return platform; ++ } ++ ++ private static String[] getLauncher() throws IOException { ++ String platform = getPlatform(); ++ if (platform == null) { ++ return null; ++ } ++ ++ String launcher = TEST_SRC + File.separator + platform + "-" + ARCH + ++ File.separator + "launcher"; ++ ++ final FileSystem FS = FileSystems.getDefault(); ++ Path launcherPath = FS.getPath(launcher); ++ ++ final boolean hasLauncher = Files.isRegularFile(launcherPath, LinkOption.NOFOLLOW_LINKS)&& ++ Files.isReadable(launcherPath); ++ if (!hasLauncher) { ++ System.out.println("Launcher [" + launcher + "] does not exist. Skipping the test."); ++ return null; ++ } ++ ++ // It is impossible to store an executable file in the source control ++ // We need to copy the launcher to the working directory ++ // and set the executable flag ++ Path localLauncherPath = FS.getPath(WORK_DIR, "launcher"); ++ Files.copy(launcherPath, localLauncherPath, ++ StandardCopyOption.REPLACE_EXISTING, ++ StandardCopyOption.COPY_ATTRIBUTES); ++ if (!Files.isExecutable(localLauncherPath)) { ++ Set<PosixFilePermission> perms = new HashSet<>( ++ Files.getPosixFilePermissions( ++ localLauncherPath, ++ LinkOption.NOFOLLOW_LINKS ++ ) ++ ); ++ perms.add(PosixFilePermission.OWNER_EXECUTE); ++ Files.setPosixFilePermissions(localLauncherPath, perms); ++ } ++ return new String[] {launcher, localLauncherPath.toAbsolutePath().toString()}; ++ } + } +--- ./jdk/test/sun/management/jmxremote/bootstrap/GeneratePropertyPassword.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jmxremote/bootstrap/GeneratePropertyPassword.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -42,7 +42,7 @@ + fi + + case $OS in +-SunOS | Linux | Darwin) ++SunOS | Linux | Darwin | AIX ) + PATHSEP=":" + FILESEP="/" + DFILESEP=$FILESEP +--- ./jdk/test/sun/management/jmxremote/bootstrap/LocalManagementTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jmxremote/bootstrap/LocalManagementTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -32,6 +32,7 @@ + import java.util.List; + import java.util.concurrent.TimeUnit; + import java.util.concurrent.atomic.AtomicReference; ++import jdk.testlibrary.ProcessTools; + + /** + * @test +@@ -41,13 +42,10 @@ + * without connection or username/password details. + * TestManager will attempt a connection to the address obtained from + * both agent properties and jvmstat buffer. +- * @build jdk.testlibrary.ProcessTools +- * @build TestManager TestApplication +- * @run main/othervm/timeout=300 LocalManagementTest ++ * @build jdk.testlibrary.* TestManager TestApplication ++ * @run main/othervm/timeout=300 -XX:+UsePerfData LocalManagementTest + */ + +-import jdk.testlibrary.ProcessTools; +- + public class LocalManagementTest { + private static final String TEST_CLASSPATH = System.getProperty("test.class.path"); + private static final String TEST_JDK = System.getProperty("test.jdk"); +@@ -240,4 +238,4 @@ + } + } + } +-} +\ No newline at end of file ++} +--- ./jdk/test/sun/management/jmxremote/startstop/JMXStartStopDoSomething.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jmxremote/startstop/JMXStartStopDoSomething.java Wed Jul 30 18:42:59 2014 +0100 +@@ -21,37 +21,20 @@ + * questions. + */ + +-import java.io.File; ++import java.io.IOException; ++import jdk.testlibrary.ProcessTools; + + public class JMXStartStopDoSomething { +- +- private static final String lockFileName = "JMXStartStop.lck"; +- +- public static void doSomething() { +- try { +- File lockFile = new File(lockFileName); +- lockFile.createNewFile(); +- +- while(lockFile.exists()) { +- long datetime = lockFile.lastModified(); +- long epoch = System.currentTimeMillis()/1000; +- +- // Don't allow test app to run more than an hour +- if (epoch - datetime > 3600) { +- System.err.println("Lock is too old. Aborting"); +- return; +- } +- Thread.sleep(500); +- } +- +- } catch (Throwable e) { +- System.err.println("Something bad happens:" +e); +- } ++ public static void doSomething() throws IOException{ ++ int r = System.in.read(); ++ System.out.println("read: " + r); + } + + public static void main(String args[]) throws Exception { +- System.err.println("main enter"); ++ System.out.println("pid:" + ProcessTools.getProcessId()); ++ System.out.println("main enter"); ++ System.out.flush(); + doSomething(); +- System.err.println("main exit"); ++ System.out.println("main exit"); + } + } +--- ./jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -22,45 +22,58 @@ + */ + + import java.io.File; +-import java.io.FileInputStream; +-import java.io.FilenameFilter; + import java.io.IOException; +-import java.io.InputStream; ++import java.lang.reflect.Method; ++import java.net.ConnectException; ++import java.net.ServerSocket; ++import java.rmi.NoSuchObjectException; + import java.rmi.registry.LocateRegistry; + import java.rmi.registry.Registry; + import java.util.ArrayList; + import java.util.Arrays; +-import java.util.Enumeration; + import java.util.HashMap; + import java.util.Iterator; ++import java.util.List; + import java.util.Map; +-import java.util.Properties; ++import java.util.Objects; + import java.util.Set; ++import java.util.concurrent.TimeUnit; ++import java.util.concurrent.TimeoutException; ++import java.util.concurrent.atomic.AtomicBoolean; ++import java.util.concurrent.atomic.AtomicReference; ++import java.util.function.Consumer; + + import javax.management.*; + import javax.management.remote.*; ++import javax.net.ssl.SSLHandshakeException; + +-import sun.management.AgentConfigurationError; +-import sun.management.jmxremote.ConnectorBootstrap; ++import jdk.testlibrary.ProcessTools; ++import jdk.testlibrary.JDKToolLauncher; + ++/** ++ * @test ++ * @bug 7110104 ++ * @library /lib/testlibrary ++ * @build jdk.testlibrary.* JMXStartStopTest JMXStartStopDoSomething ++ * @run main/othervm JMXStartStopTest ++ * @summary Makes sure that enabling/disabling the management agent through ++ * JCMD achieves the desired results ++ */ + public class JMXStartStopTest { ++ private static final String TEST_JDK = System.getProperty("test.jdk"); ++ private static final String TEST_SRC = System.getProperty("test.src"); + +- static boolean verbose = false; ++ private static final boolean verbose = false; + +- static void dbg_print(String msg){ ++ private static void dbg_print(String msg){ + if (verbose) { +- System.err.println("DBG: " +msg); ++ System.out.println("DBG: " +msg); + } + } + +- static void dbg_print(String msg, Throwable ex){ +- if (verbose) { +- System.err.println("DBG: " + msg + " " + ex.getMessage() ); +- ex.printStackTrace(System.err); +- } +- } +- +- public static int listMBeans(MBeanServerConnection server, ObjectName pattern, QueryExp query) ++ private static int listMBeans(MBeanServerConnection server, ++ ObjectName pattern, ++ QueryExp query) + throws Exception { + + Set names = server.queryNames(pattern,query); +@@ -72,10 +85,9 @@ + MBeanAttributeInfo[] attrs = info.getAttributes(); + if (attrs == null) + continue; +- +- for (int j=0; j<attrs.length; j++) { +- if (attrs[j].isReadable()) { +- Object o = server.getAttribute(name,attrs[j].getName()); ++ for (MBeanAttributeInfo attr : attrs) { ++ if (attr.isReadable()) { ++ Object o = server.getAttribute(name, attr.getName()); + } + } + } +@@ -83,11 +95,10 @@ + } + + +- public void run_local(String strPid) ++ private static void testConnectLocal(int pid) + throws Exception { + + String jmxUrlStr = null; +- int pid = Integer.parseInt(strPid); + + try { + jmxUrlStr = sun.management.ConnectorAddressLink.importFrom(pid); +@@ -106,8 +117,8 @@ + + int count = listMBeans(conn,pattern,null); + if (count == 0) +- throw new Exception("Expected at least one matching "+ "MBean for "+pattern); +- ++ throw new Exception("Expected at least one matching "+ ++ "MBean for "+pattern); + + } catch (IOException e) { + dbg_print("Cannot find process : " + pid); +@@ -115,20 +126,40 @@ + } + } + +- public void run(String args[]) throws Exception { ++ private static void testNoConnect(int port) throws Exception { ++ testNoConnect(port, 0); ++ } ++ ++ private static void testNoConnect(int port, int rmiPort) throws Exception { ++ try { ++ testConnect(port, rmiPort); ++ throw new Exception("Didn't expect the management agent running"); ++ } catch (Exception e) { ++ Throwable t = e; ++ while (t != null) { ++ if (t instanceof NoSuchObjectException || ++ t instanceof ConnectException || ++ t instanceof SSLHandshakeException) { ++ break; ++ } ++ t = t.getCause(); ++ } ++ if (t == null) { ++ throw new Exception("Unexpected exception", e); ++ } ++ } ++ } ++ ++ private static void testConnect(int port) throws Exception { ++ testConnect(port, 0); ++ } ++ ++ private static void testConnect(int port, int rmiPort) throws Exception { + + dbg_print("RmiRegistry lookup..."); + +- int port = 4567; +- if (args != null && args.length > 0) { +- port = Integer.parseInt(args[0]); +- } + dbg_print("Using port: " + port); + +- int rmiPort = 0; +- if (args != null && args.length > 1) { +- rmiPort = Integer.parseInt(args[1]); +- } + dbg_print("Using rmi port: " + rmiPort); + + Registry registry = LocateRegistry.getRegistry(port); +@@ -140,8 +171,13 @@ + } + + String jmxUrlStr = (rmiPort != 0) ? +- String.format("service:jmx:rmi://localhost:%d/jndi/rmi://localhost:%d/jmxrmi", rmiPort, port) : +- String.format("service:jmx:rmi:///jndi/rmi://localhost:%d/jmxrmi",port); ++ String.format( ++ "service:jmx:rmi://localhost:%d/jndi/rmi://localhost:%d/jmxrmi", ++ rmiPort, ++ port) : ++ String.format( ++ "service:jmx:rmi:///jndi/rmi://localhost:%d/jmxrmi", ++ port); + + JMXServiceURL url = new JMXServiceURL(jmxUrlStr); + Map m = new HashMap(); +@@ -153,29 +189,632 @@ + + int count = listMBeans(conn,pattern,null); + if (count == 0) +- throw new Exception("Expected at least one matching "+ "MBean for "+pattern); ++ throw new Exception("Expected at least one matching " + ++ "MBean for " + pattern); + } + ++ private static class Failure { ++ private final Throwable cause; ++ private final String msg; + +- public static void main(String args[]) { +- JMXStartStopTest manager = new JMXStartStopTest(); +- try { +- if (args!=null && args[0].equals("local")) { +- manager.run_local(args[1]); ++ public Failure(Throwable cause, String msg) { ++ this.cause = cause; ++ this.msg = msg; ++ } ++ ++ public Failure(String msg) { ++ this(null, msg); ++ } ++ ++ public Throwable getCause() { ++ return cause; ++ } ++ ++ public String getMsg() { ++ return msg; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hash = 7; ++ hash = 97 * hash + Objects.hashCode(this.cause); ++ hash = 97 * hash + Objects.hashCode(this.msg); ++ return hash; ++ } ++ ++ @Override ++ public boolean equals(Object obj) { ++ if (obj == null) { ++ return false; ++ } ++ if (getClass() != obj.getClass()) { ++ return false; ++ } ++ final Failure other = (Failure) obj; ++ if (!Objects.equals(this.cause, other.cause)) { ++ return false; ++ } ++ if (!Objects.equals(this.msg, other.msg)) { ++ return false; ++ } ++ return true; ++ } ++ ++ @Override ++ public String toString() { ++ if (cause != null) { ++ return msg + "\n" + cause; + } else { +- manager.run(args); ++ return msg; + } +- } catch (RuntimeException r) { +- dbg_print("No connection: ", r); +- System.out.print("NO_CONN"); +- System.exit(1); +- } catch (Throwable t) { +- dbg_print("No connection: ", t); +- System.out.print("NO_CONN"); +- System.exit(2); + } +- System.out.print("OK_CONN"); +- System.exit(0); + } + ++ private static List<Failure> failures = new ArrayList<>(); ++ ++ public static void main(String args[]) throws Exception { ++ for (Method m : JMXStartStopTest.class.getDeclaredMethods()) { ++ if (m.getName().startsWith("test_")) { ++ try { ++ m.invoke(null); ++ System.out.println("=== PASSED\n"); ++ } catch (Throwable e) { ++ failures.add(new Failure(e, m.getName() + " failed")); ++ } ++ } ++ } ++ ++ if (!failures.isEmpty()) { ++ for(Failure f : failures) { ++ System.err.println(f.getMsg()); ++ f.getCause().printStackTrace(System.err); ++ } ++ throw new Error(); ++ } ++ } ++ ++ /** ++ * Retrieves the PID of the test application using JCMD ++ * @return The PID of the test application ++ * @throws InterruptedException ++ * @throws IOException ++ */ ++ private static String getPID() throws InterruptedException, IOException { ++ final AtomicReference<String> pid = new AtomicReference<>(); ++ jcmd( ++ null, ++ line -> { ++ if (line.endsWith("JMXStartStopDoSomething")) { ++ pid.set(line.split(" ")[0]); ++ } ++ } ++ ); ++ return pid.get(); ++ } ++ ++ private static class Something { ++ private Process p; ++ private final ProcessBuilder pb; ++ private final String name; ++ private final AtomicBoolean started = new AtomicBoolean(false); ++ private volatile int pid = -1; ++ ++ public Something(ProcessBuilder pb, String name) { ++ this.pb = pb; ++ this.name = name; ++ } ++ ++ public synchronized void start() throws InterruptedException, IOException, TimeoutException { ++ if (started.compareAndSet(false, true)) { ++ try { ++ p = ProcessTools.startProcess( ++ "JMXStartStopDoSomething", ++ pb, ++ (line) -> { ++ if (line.toLowerCase().startsWith("pid:")) { ++ pid = Integer.parseInt(line.split("\\:")[1]); ++ } ++ return line.equals("main enter"); ++ }, ++ 5, ++ TimeUnit.SECONDS ++ ); ++ } catch (TimeoutException e) { ++ p.destroy(); ++ p.waitFor(); ++ throw e; ++ } ++ } ++ } ++ ++ public int getPid() { ++ return pid; ++ } ++ ++ public synchronized void stop() ++ throws IOException, InterruptedException { ++ if (started.compareAndSet(true, false)) { ++ p.getOutputStream().write(0); ++ p.getOutputStream().flush(); ++ int ec = p.waitFor(); ++ if (ec != 0) { ++ StringBuilder msg = new StringBuilder(); ++ msg.append("Test application '").append(name); ++ msg.append("' failed with exit code: "); ++ msg.append(ec); ++ ++ failures.add(new Failure(msg.toString())); ++ } ++ } ++ } ++ } ++ ++ /** ++ * Runs the test application "JMXStartStopDoSomething" ++ * @param name Test run name ++ * @param args Additional arguments ++ * @return Returns a {@linkplain Something} instance representing the run ++ * @throws IOException ++ * @throws InterruptedException ++ * @throws TimeoutException ++ */ ++ private static Something doSomething(String name, String ... args) ++ throws Exception { ++ List<String> pbArgs = new ArrayList<>(Arrays.asList( ++ "-cp", ++ System.getProperty("test.class.path") ++ )); ++ pbArgs.addAll(Arrays.asList(args)); ++ pbArgs.add("JMXStartStopDoSomething"); ++ ++ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( ++ pbArgs.toArray(new String[pbArgs.size()]) ++ ); ++ Something s = new Something(pb, name); ++ s.start(); ++ return s; ++ } ++ ++ /** ++ * Run the "jcmd" command ++ * ++ * @param command Command with parameters; space separated string ++ * @throws IOException ++ * @throws InterruptedException ++ */ ++ private static void jcmd(String ... command) throws IOException, InterruptedException { ++ if (command.length == 0) { ++ jcmd(null, (Consumer<String>)null); ++ } else { ++ jcmd(null, command); ++ } ++ } ++ ++ /** ++ * Run the "jcmd" command ++ * ++ * @param c {@linkplain Consumer} instance; may be null ++ * @param command Command with parameters; space separated string ++ * @throws IOException ++ * @throws InterruptedException ++ */ ++ private static void jcmd(Consumer<String> c, String ... command) throws IOException, InterruptedException { ++ jcmd("JMXStartStopDoSomething", c, command); ++ } ++ ++ /** ++ * Run the "jcmd" command ++ * @param target The target application name (or PID) ++ * @param c {@linkplain Consumer} instance; may be null ++ * @param command Command with parameters; space separated string ++ * @throws IOException ++ * @throws InterruptedException ++ */ ++ private static void jcmd(String target, final Consumer<String> c, String ... command) throws IOException, InterruptedException { ++ dbg_print("[jcmd] " + (command.length > 0 ? command[0] : "list")); ++ ++ JDKToolLauncher l = JDKToolLauncher.createUsingTestJDK("jcmd"); ++ l.addToolArg(target); ++ for(String cmd : command) { ++ l.addToolArg(cmd); ++ } ++ Process p = ProcessTools.startProcess( ++ "jcmd", ++ new ProcessBuilder(l.getCommand()), ++ c ++ ); ++ ++ p.waitFor(); ++ dbg_print("[jcmd] --------"); ++ } ++ ++ private static final String CMD_STOP = "ManagementAgent.stop"; ++ private static final String CMD_START= "ManagementAgent.start"; ++ private static final String CMD_START_LOCAL = "ManagementAgent.start_local"; ++ private static final int port1 = 50234; ++ private static final int port2 = 50235; ++ ++ private static void test_01() throws Exception { ++ // Run an app with JMX enabled stop it and ++ // restart on other port ++ ++ System.out.println("**** Test one ****"); ++ ++ Something s = doSomething( ++ "test_01", ++ "-Dcom.sun.management.jmxremote.port=" + port1, ++ "-Dcom.sun.management.jmxremote.authenticate=false", ++ "-Dcom.sun.management.jmxremote.ssl=false"); ++ ++ try { ++ testConnect(port1); ++ ++ jcmd(CMD_STOP); ++ testNoConnect(port1); ++ ++ jcmd(CMD_START, "jmxremote.port=" + port2); ++ testConnect(port2); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_02() throws Exception { ++ // Run an app without JMX enabled ++ // start JMX by jcmd ++ ++ System.out.println("**** Test two ****"); ++ ++ Something s = doSomething("test_02"); ++ try { ++ jcmd(CMD_START, ++ "jmxremote.port=" + port1, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false"); ++ ++ testConnect(port1); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_03() throws Exception { ++ // Run an app without JMX enabled ++ // start JMX by jcmd on one port than on other one ++ ++ System.out.println("**** Test three ****"); ++ ++ Something s = doSomething("test_03"); ++ try { ++ jcmd(CMD_START, ++ "jmxremote.port=" + port1, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false"); ++ ++ // Second agent shouldn't start ++ jcmd(CMD_START, ++ "jmxremote.port=" + port2, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false"); ++ ++ // First agent should connect ++ testConnect(port1); ++ ++ // Second agent should not connect ++ testNoConnect(port2); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_04() throws Exception { ++ // Run an app without JMX enabled ++ // start JMX by jcmd on one port, specify rmi port explicitly ++ ++ System.out.println("**** Test four ****"); ++ ++ Something s = doSomething("test_04"); ++ ++ try { ++ jcmd(CMD_START, ++ "jmxremote.port=" + port1, ++ "jmxremote.rmi.port=" + port2, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false"); ++ ++ testConnect(port1, port2); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_05() throws Exception { ++ // Run an app without JMX enabled, it will enable local server ++ // but should leave remote server disabled ++ ++ System.out.println("**** Test five ****"); ++ ++ Something s = doSomething("test_05"); ++ try { ++ jcmd(CMD_START_LOCAL); ++ ++ testNoConnect(port1); ++ testConnectLocal(s.getPid()); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_06() throws Exception { ++ // Run an app without JMX enabled ++ // start JMX by jcmd on one port, specify rmi port explicitly ++ // attempt to start it again ++ // 1) with the same port ++ // 2) with other port ++ // 3) attempt to stop it twice ++ // Check for valid messages in the output ++ ++ System.out.println("**** Test six ****"); ++ ++ Something s = doSomething("test_06"); ++ ++ try { ++ jcmd(CMD_START, ++ "jmxremote.port=" + port1, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false"); ++ ++ testConnect(port1, port2); ++ ++ final boolean[] checks = new boolean[3]; ++ jcmd( ++ line -> { ++ if (line.equals("java.lang.RuntimeException: Invalid agent state")) { ++ checks[0] = true; ++ } ++ }, ++ CMD_START, ++ "jmxremote.port=" + port1, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false"); ++ ++ jcmd( ++ line -> { ++ if (line.equals("java.lang.RuntimeException: Invalid agent state")) { ++ checks[1] = true; ++ } ++ }, ++ CMD_START, ++ "jmxremote.port=" + port2, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false"); ++ ++ jcmd(CMD_STOP); ++ jcmd(CMD_STOP); ++ ++ ServerSocket ss = new ServerSocket(0); ++ ++ jcmd( ++ line -> { ++ if (line.contains("Port already in use: " + ss.getLocalPort())) { ++ checks[2] = true; ++ } ++ }, ++ CMD_START, ++ "jmxremote.port=" + ss.getLocalPort(), ++ "jmxremote.rmi.port=" + port2, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false"); ++ if (!checks[0]) { ++ throw new Exception("Starting agent on port " + port1 + " should " + ++ "report an invalid agent state"); ++ } ++ if (!checks[1]) { ++ throw new Exception("Starting agent on poprt " + port2 + " should " + ++ "report an invalid agent state"); ++ } ++ if (!checks[2]) { ++ throw new Exception("Starting agent on port " + ss.getLocalPort() + " should " + ++ "report port in use"); ++ } ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_07() throws Exception { ++ // Run an app without JMX enabled, but with some properties set ++ // in command line. ++ // make sure these properties overridden corectly ++ ++ System.out.println("**** Test seven ****"); ++ ++ Something s = doSomething( ++ "test_07", ++ "-Dcom.sun.management.jmxremote.authenticate=false", ++ "-Dcom.sun.management.jmxremote.ssl=true"); ++ ++ try { ++ testNoConnect(port1); ++ jcmd( ++ CMD_START, ++ "jmxremote.port=" + port2, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false" ++ ); ++ testConnect(port2); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_08() throws Exception { ++ // Run an app with JMX enabled and with some properties set ++ // in command line. ++ // stop JMX agent and then start it again with different property values ++ // make sure these properties overridden corectly ++ ++ System.out.println("**** Test eight ****"); ++ ++ Something s = doSomething( ++ "test_08", ++ "-Dcom.sun.management.jmxremote.port=" + port1, ++ "-Dcom.sun.management.jmxremote.authenticate=false", ++ "-Dcom.sun.management.jmxremote.ssl=true"); ++ ++ try { ++ testNoConnect(port1); ++ ++ jcmd(CMD_STOP); ++ ++ testNoConnect(port1); ++ ++ jcmd( ++ CMD_START, ++ "jmxremote.port=" + port2, ++ "jmxremote.authenticate=false", ++ "jmxremote.ssl=false" ++ ); ++ ++ testConnect(port2); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_09() throws Exception { ++ // Run an app with JMX enabled and with some properties set ++ // in command line. ++ // stop JMX agent and then start it again with different property values ++ // specifing some property in management config file and some of them ++ // in command line ++ // make sure these properties overridden corectly ++ ++ System.out.println("**** Test nine ****"); ++ ++ Something s = doSomething("test_09", ++ "-Dcom.sun.management.config.file=" + ++ TEST_SRC + File.separator + "management_cl.properties", ++ "-Dcom.sun.management.jmxremote.authenticate=false" ++ ); ++ ++ try { ++ testNoConnect(port1); ++ ++ jcmd(CMD_STOP); ++ ++ testNoConnect(port1); ++ ++ jcmd(CMD_START, ++ "config.file=" + TEST_SRC + File.separator + ++ "management_jcmd.properties", ++ "jmxremote.authenticate=false", ++ "jmxremote.port=" + port2 ++ ); ++ ++ testConnect(port2); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_10() throws Exception { ++ // Run an app with JMX enabled and with some properties set ++ // in command line. ++ // stop JMX agent and then start it again with different property values ++ // stop JMX agent again and then start it without property value ++ // make sure these properties overridden corectly ++ ++ System.out.println("**** Test ten ****"); ++ ++ Something s = doSomething( ++ "test_10", ++ "-Dcom.sun.management.jmxremote.port=" + port1, ++ "-Dcom.sun.management.jmxremote.authenticate=false", ++ "-Dcom.sun.management.jmxremote.ssl=true"); ++ ++ try { ++ testNoConnect(port1); ++ ++ jcmd(CMD_STOP); ++ jcmd(CMD_START, ++ "jmxremote.ssl=false", ++ "jmxremote.port=" + port1 ++ ); ++ testConnect(port1); ++ ++ jcmd(CMD_STOP); ++ jcmd(CMD_START, ++ "jmxremote.port=" + port1 ++ ); ++ ++ testNoConnect(port1); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_11() throws Exception { ++ // Run an app with JMX enabled ++ // stop remote agent ++ // make sure local agent is not affected ++ ++ System.out.println("**** Test eleven ****"); ++ ++ Something s = doSomething( ++ "test_11", ++ "-Dcom.sun.management.jmxremote.port=" + port1, ++ "-Dcom.sun.management.jmxremote.authenticate=false", ++ "-Dcom.sun.management.jmxremote.ssl=false"); ++ try { ++ testConnect(port1); ++ jcmd(CMD_STOP); ++ testConnectLocal(s.getPid()); ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_12() throws Exception { ++ // Run an app with JMX disabled ++ // start local agent only ++ ++ System.out.println("**** Test twelve ****"); ++ ++ Something s = doSomething("test_12"); ++ ++ try { ++ testNoConnect(port1); ++ jcmd(CMD_START + "_local"); ++ ++ testConnectLocal(s.getPid()); ++ ++ } finally { ++ s.stop(); ++ } ++ } ++ ++ private static void test_13() throws Exception { ++ // Run an app with -javaagent make sure it works as expected - ++ // system properties are ignored ++ ++ System.out.println("**** Test thirteen ****"); ++ ++ String agent = TEST_JDK + "/jre/lib/management-agent.jar"; ++ if (!new File(agent).exists()) { ++ agent = TEST_JDK + "/lib/management-agent.jar"; ++ } ++ ++ Something s = doSomething("test_14", ++ "-javaagent:" + agent + "=com.sun.management.jmxremote.port=" + ++ port1 + ",com.sun.management.jmxremote.authenticate=false", ++ "-Dcom.sun.management.jmxremote.ssl=false" ++ ); ++ ++ try { ++ testNoConnect(port1); ++ } finally { ++ s.stop(); ++ } ++ } + } +--- ./jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.sh Thu Jan 01 00:00:00 1970 +0000 +@@ -1,579 +0,0 @@ +-#!/bin/sh +- +-# Copyright (c) 2011, 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. +-# +-# 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 7110104 +-# @build JMXStartStopTest JMXStartStopDoSomething +-# @run shell JMXStartStopTest.sh --jtreg --no-compile +-# @summary No word Failed expected in the test output +- +-_server=no +-_jtreg=no +-_compile=yes +-_testsuite="01,02,03,04,05,06,07,08,09,10,11,12,13" +-_port_one=50234 +-_port_two=50235 +- +- +-_testclasses=".classes" +-_testsrc=`pwd` +- +-_logname=".classes/output.txt" +-_lockFileName="JMXStartStop.lck" +- +-_compile(){ +- +- if [ ! -d ${_testclasses} ] +- then +- mkdir -p ${_testclasses} +- fi +- +- rm -f ${_testclasses}/JMXStartStopTest.class +- +- # Compile testcase +- ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d ${_testclasses} \ +- JMXStartStopDoSomething.java JMXStartStopTest.java +- +- if [ ! -f ${_testclasses}/JMXStartStopTest.class ] +- then +- echo "ERROR: Can't compile" +- exit -1 +- fi +-} +- +-_app_start(){ +- ${TESTJAVA}/bin/java ${TESTVMOPTS} $* -cp ${_testclasses} JMXStartStopDoSomething >> ${_logname} 2>&1 & +- +- x=0 +- while [ ! -f ${_lockFileName} ] +- do +- if [ $x -gt 20 ] +- then +- echo "ERROR: Test app not started" +- if [ "${_jtreg}" = "yes" ] +- then +- exit -1 +- fi +- fi +- +- echo "Waiting JMXStartStopDoSomething to start: $x" +- x=`expr $x + 1` +- sleep 1 +- done +-} +- +-_get_pid(){ +- ${COMPILEJAVA}/bin/jps ${TESTTOOLVMOPTS} | sed -n "/JMXStartStopDoSomething/s/ .*//p" +-} +- +-_app_stop(){ +- rm ${_lockFileName} +- +- # wait until VM is actually shuts down +- while true +- do +- npid=`_get_pid` +- if [ "${npid}" = "" ] +- then +- break +- fi +- sleep 1 +- done +-} +- +-_exit_on_jtreg(){ +- # Stop on first failed test under jtreg +- if [ "${_jtreg}" = "yes" ] +- then +- _app_stop +- exit -1 +- fi +-} +- +-_testme(){ +- ${TESTJAVA}/bin/java ${TESTVMOPTS} -cp ${_testclasses} JMXStartStopTest $* +-} +- +- +-_jcmd(){ +- ${TESTJAVA}/bin/jcmd ${TESTTOOLVMOPTS} JMXStartStopDoSomething $* > /dev/null 2>/dev/null +-} +- +-_echo(){ +- echo "$*" +- echo "$*" >> ${_logname} +-} +- +-# ============= TESTS ====================================== +- +-test_01(){ +-# Run an app with JMX enabled stop it and +-# restart on other port +- +- _echo "**** Test one ****" +- +- _app_start -Dcom.sun.management.jmxremote.port=$1 \ +- -Dcom.sun.management.jmxremote.authenticate=false \ +- -Dcom.sun.management.jmxremote.ssl=false +- +- res1=`_testme $1` +- +- _jcmd ManagementAgent.stop +- +- res2=`_testme $1` +- +- _jcmd ManagementAgent.start jmxremote.port=$2 +- +- res3=`_testme $2` +- +- if [ "${res1}" = "OK_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ] +- then +- _echo "Passed" +- else +- _echo "Failed r1(OK):${res1} r2(NO):${res2} r3(OK):${res3}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_02(){ +-# Run an app without JMX enabled +-# start JMX by jcmd +- +- _echo "**** Test two ****" +- _app_start +- +- _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false +- +- res1=`_testme $1` +- +- if [ "${res1}" = "OK_CONN" ] +- then +- _echo "Passed" +- else +- _echo "Failed r1(OK):${res1}" +- _exit_on_jtreg +- fi +- _app_stop +-} +- +-test_03(){ +-# Run an app without JMX enabled +-# start JMX by jcmd on one port than on other one +- +- _echo "**** Test three ****" +- _app_start +- +- _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false +- +-# Second agent shouldn't start +- _jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false +- +-# First agent should connect +- res1=`_testme $1` +- +- if [ "${res1}" = "OK_CONN" ] +- then +- _echo "Passed $1" +- else +- _echo "Failed r1(NO):${res1}" +- _exit_on_jtreg +- fi +- +-#Second agent shouldn't connect +- res1=`_testme $2` +- +- if [ "${res1}" = "NO_CONN" ] +- then +- _echo "Passed $2" +- else +- _echo "Failed r1(OK):${res1}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_04(){ +-# Run an app without JMX enabled +-# start JMX by jcmd on one port, specify rmi port explicitly +- +- _echo "**** Test four ****" +- _app_start +- +- _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.rmi.port=$2 jmxremote.authenticate=false jmxremote.ssl=false +- +-# First agent should connect +- res1=`_testme $1 $2` +- +- if [ "${res1}" = "OK_CONN" ] +- then +- _echo "Passed $1 $2" +- else +- _echo "Failed r1(NO):${res1}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_05(){ +-# Run an app without JMX enabled, it will enable local server +-# but should leave remote server disabled +- +- _echo "**** Test five ****" +- _app_start +- +- _jcmd ManagementAgent.start jmxremote=1 +- +- # First agent should connect +- res1=`_testme $1` +- +- if [ "${res1}" = "NO_CONN" ] +- then +- _echo "Passed $1 $2" +- else +- _echo "Failed r1(OK):${res1}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_06(){ +-# Run an app without JMX enabled +-# start JMX by jcmd on one port, specify rmi port explicitly +-# attempt to start it again +-# 1) with the same port +-# 2) with other port +-# 3) attempt to stop it twice +-# Check for valid messages in the output +- +- _echo "**** Test six ****" +- _app_start +- +- _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false +- +- # First agent should connect +- res1=`_testme $1 $2` +- +- if [ "${res1}" = "OK_CONN" ] +- then +- _echo "Passed $1 $2" +- else +- _echo "Failed r1(NO):${res1}" +- _exit_on_jtreg +- fi +- +- _jcmd ManagementAgent.start jmxremote.port=$1 jmxremote.authenticate=false jmxremote.ssl=false +- +- _jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false +- +- _jcmd ManagementAgent.stop +- +- _jcmd ManagementAgent.stop +- +- _jcmd ManagementAgent.start jmxremote.port=22 jmxremote.rmi.port=$2 jmxremote.authenticate=false jmxremote.ssl=false +- +- _app_stop +-} +- +-test_07(){ +-# Run an app without JMX enabled, but with some properties set +-# in command line. +-# make sure these properties overriden corectly +- +- _echo "**** Test seven ****" +- +- _app_start -Dcom.sun.management.jmxremote.authenticate=false \ +- -Dcom.sun.management.jmxremote.ssl=true +- +- res1=`_testme $1` +- +- _jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false +- +- res2=`_testme $2` +- +- if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" ] +- then +- echo "Passed" +- else +- _echo "Failed r1(NO):${res1} r2(OK):${res2}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_08(){ +-# Run an app with JMX enabled and with some properties set +-# in command line. +-# stop JMX agent and then start it again with different property values +-# make sure these properties overriden corectly +- +- _echo "**** Test eight ****" +- +- _app_start -Dcom.sun.management.jmxremote.port=$1 \ +- -Dcom.sun.management.jmxremote.authenticate=false \ +- -Dcom.sun.management.jmxremote.ssl=true +- +- res1=`_testme $1` +- +- _jcmd ManagementAgent.stop +- +- res2=`_testme $1` +- +- _jcmd ManagementAgent.start jmxremote.port=$2 jmxremote.authenticate=false jmxremote.ssl=false +- +- res3=`_testme $2` +- +- if [ "${res1}" = "NO_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ] +- then +- _echo "Passed" +- else +- _echo "Failed r1(NO):${res1} r2(NO):${res2} r3(OK):${res3}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_09(){ +-# Run an app with JMX enabled and with some properties set +-# in command line. +-# stop JMX agent and then start it again with different property values +-# specifing some property in management config file and some of them +-# in command line +-# make sure these properties overriden corectly +- +- _echo "**** Test nine ****" +- +- _app_start -Dcom.sun.management.config.file=${_testsrc}/management_cl.properties \ +- -Dcom.sun.management.jmxremote.authenticate=false +- +- res1=`_testme $1` +- +- _jcmd ManagementAgent.stop +- +- res2=`_testme $1` +- +- _jcmd ManagementAgent.start config.file=${_testsrc}/management_jcmd.properties \ +- jmxremote.authenticate=false jmxremote.port=$2 +- +- res3=`_testme $2` +- +- if [ "${res1}" = "NO_CONN" -a "${res2}" = "NO_CONN" -a "${res3}" = "OK_CONN" ] +- then +- _echo "Passed" +- else +- _echo "Failed r1(NO):${res1} r2(NO):${res2} r3(OK):${res3}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_10(){ +-# Run an app with JMX enabled and with some properties set +-# in command line. +-# stop JMX agent and then start it again with different property values +-# stop JMX agent again and then start it without property value +-# make sure these properties overriden corectly +- +- _echo "**** Test ten ****" +- +- _app_start -Dcom.sun.management.jmxremote.port=$1 \ +- -Dcom.sun.management.jmxremote.authenticate=false \ +- -Dcom.sun.management.jmxremote.ssl=true +- +- res1=`_testme $1` +- +- _jcmd ManagementAgent.stop +- _jcmd ManagementAgent.start jmxremote.ssl=false jmxremote.port=$1 +- +- +- res2=`_testme $1` +- +- _jcmd ManagementAgent.stop +- _jcmd ManagementAgent.start jmxremote.port=$1 +- +- res3=`_testme $1` +- +- if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" -a "${res3}" = "NO_CONN" ] +- then +- _echo "Passed" +- else +- _echo "Failed r1(NO):${res1} r2(OK):${res2} r3(NO):${res3}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_11(){ +-# Run an app with JMX enabled +-# stop remote agent +-# make sure local agent is not affected +- +- _echo "**** Test eleven ****" +- +- _app_start -Dcom.sun.management.jmxremote.port=$2 \ +- -Dcom.sun.management.jmxremote.authenticate=false \ +- -Dcom.sun.management.jmxremote.ssl=false +- +- res1=`_testme $2` +- +- _jcmd ManagementAgent.stop +- +- pid=`${COMPILEJAVA}/bin/jps ${TESTTOOLVMOPTS} | sed -n "/JMXStartStopDoSomething/s/ .*//p"` +- res2=`_testme local ${pid}` +- +- if [ "${res1}" = "OK_CONN" -a "${res2}" = "OK_CONN" ] +- then +- _echo "Passed" +- else +- _echo "Failed r1(OK):${res1} r2(OK):${res2}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_12(){ +-# Run an app with JMX disabled +-# start local agent only +- +- _echo "**** Test twelve ****" +- +- _app_start +- +- res1=`_testme $1` +- +- _jcmd ManagementAgent.start_local +- +- pid=`_get_pid` +- if [ "x${pid}" = "x" ] +- then +- res2="NO_CONN" +- else +- res2=`_testme local ${pid}` +- fi +- +- if [ "${res1}" = "NO_CONN" -a "${res2}" = "OK_CONN" ] +- then +- _echo "Passed" +- else +- _echo "Failed r1(NO):${res1} r2(OK):${res2}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-test_13(){ +-# Run an app with -javaagent make sure it works as expected - system properties are ignored +- +- _echo "**** Test thirteen ****" +- +- AGENT="${TESTJAVA}/jre/lib/management-agent.jar" +- if [ ! -f ${AGENT} ] +- then +- AGENT="${TESTJAVA}/lib/management-agent.jar" +- fi +- +- _app_start -javaagent:${AGENT}=com.sun.management.jmxremote.port=$1,com.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false +- +- res1=`_testme $1` +- +- if [ "${res1}" = "NO_CONN" ] +- then +- _echo "Passed" +- else +- _echo "Failed r1(NO):${res1}" +- _exit_on_jtreg +- fi +- +- _app_stop +-} +- +-# ============= MAIN ======================================= +- +-if [ "x${TESTJAVA}" = "x" ] +-then +- echo "TESTJAVA env have to be set" +- exit +-fi +- +-if [ ! -x "${TESTJAVA}/bin/jcmd" ] +-then +- echo "${TESTJAVA}/bin/jcmd" +- echo "Doesn't exist or not an executable" +- exit +-fi +- +- +-#------------------------------------------------------------------------------ +-# reading parameters +- +-for parm in "$@" +-do +- case $parm in +- --jtreg) _jtreg=yes ;; +- --no-compile) _compile=no ;; +- --testsuite=*) _testsuite=`_echo $parm | sed "s,^--.*=\(.*\),\1,"` ;; +- --port-one=*) _port_one=`_echo $parm | sed "s,^--.*=\(.*\),\1,"` ;; +- --port-two=*) _port_two=`_echo $parm | sed "s,^--.*=\(.*\),\1,"` ;; +- *) +- echo "Undefined parameter $parm. Try --help for help" +- exit +- ;; +- esac +-done +- +-if [ "${COMPILEJAVA}" = "" ] +-then +- COMPILEJAVA=${TESTJAVA} +-fi +- +-if [ ${_compile} = "yes" ] +-then +- _compile +-fi +- +-if [ ${_jtreg} = "yes" ] +-then +- _testclasses=${TESTCLASSES} +- _testsrc=${TESTSRC} +- _logname="JMXStartStopTest_output.txt" +-fi +- +-rm -f ${_logname} +- +-# Local mode tests +-for i in `echo ${_testsuite} | sed -e "s/,/ /g"` +-do +- test_${i} ${_port_one} ${_port_two} +-done +- +- +--- ./jdk/test/sun/net/ftp/MarkResetTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/net/ftp/MarkResetTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -28,7 +28,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/sun/net/www/http/HttpClient/B8025710.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/net/www/http/HttpClient/B8025710.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,409 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++import java.io.*; ++import java.net.*; ++import java.security.*; ++import java.security.cert.X509Certificate; ++import java.util.ArrayList; ++import java.util.concurrent.atomic.AtomicBoolean; ++import java.util.regex.Matcher; ++import java.util.regex.Pattern; ++import javax.net.ServerSocketFactory; ++import javax.net.SocketFactory; ++import javax.net.ssl.*; ++ ++/** ++ * @test ++ * @bug 8025710 ++ * @summary Proxied https connection reuse by HttpClient can send CONNECT to the server ++ */ ++public class B8025710 { ++ ++ private final static AtomicBoolean connectInServer = new AtomicBoolean(); ++ private static final String keystorefile = ++ System.getProperty("test.src", "./") ++ + "/../../../../../sun/security/ssl/etc/keystore"; ++ private static final String passphrase = "passphrase"; ++ ++ public static void main(String[] args) throws Exception { ++ new B8025710().runTest(); ++ ++ if (connectInServer.get()) ++ throw new RuntimeException("TEST FAILED: server got proxy header"); ++ else ++ System.out.println("TEST PASSED"); ++ } ++ ++ private void runTest() throws Exception { ++ ProxyServer proxyServer = new ProxyServer(); ++ HttpServer httpServer = new HttpServer(); ++ httpServer.start(); ++ proxyServer.start(); ++ ++ URL url = new URL("https", InetAddress.getLocalHost().getHostName(), ++ httpServer.getPort(), "/"); ++ ++ Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyServer.getAddress()); ++ ++ HttpsURLConnection.setDefaultSSLSocketFactory(createTestSSLSocketFactory()); ++ ++ // Make two connections. The bug occurs when the second request is made ++ for (int i = 0; i < 2; i++) { ++ System.out.println("Client: Requesting " + url.toExternalForm() ++ + " via " + proxy.toString() ++ + " (attempt " + (i + 1) + " of 2)"); ++ ++ HttpsURLConnection connection = ++ (HttpsURLConnection) url.openConnection(proxy); ++ ++ connection.setRequestMethod("POST"); ++ connection.setDoInput(true); ++ connection.setDoOutput(true); ++ connection.setRequestProperty("User-Agent", "Test/1.0"); ++ connection.getOutputStream().write("Hello, world!".getBytes("UTF-8")); ++ ++ if (connection.getResponseCode() != 200) { ++ System.err.println("Client: Unexpected response code " ++ + connection.getResponseCode()); ++ break; ++ } ++ ++ String response = readLine(connection.getInputStream()); ++ if (!"Hi!".equals(response)) { ++ System.err.println("Client: Unexpected response body: " ++ + response); ++ } ++ } ++ httpServer.close(); ++ proxyServer.close(); ++ httpServer.join(); ++ proxyServer.join(); ++ } ++ ++ class ProxyServer extends Thread implements Closeable { ++ ++ private final ServerSocket proxySocket; ++ private final Pattern connectLinePattern = ++ Pattern.compile("^CONNECT ([^: ]+):([0-9]+) HTTP/[0-9.]+$"); ++ private final String PROXY_RESPONSE = ++ "HTTP/1.0 200 Connection Established\r\n" ++ + "Proxy-Agent: TestProxy/1.0\r\n" ++ + "\r\n"; ++ ++ ProxyServer() throws Exception { ++ super("ProxyServer Thread"); ++ ++ // Create the http proxy server socket ++ proxySocket = ServerSocketFactory.getDefault().createServerSocket(); ++ proxySocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0)); ++ } ++ ++ public SocketAddress getAddress() { return proxySocket.getLocalSocketAddress(); } ++ ++ @Override ++ public void close() throws IOException { ++ proxySocket.close(); ++ } ++ ++ @Override ++ public void run() { ++ ArrayList<Thread> threads = new ArrayList<>(); ++ int connectionCount = 0; ++ try { ++ while (connectionCount++ < 2) { ++ final Socket clientSocket = proxySocket.accept(); ++ final int proxyConnectionCount = connectionCount; ++ System.out.println("Proxy: NEW CONNECTION " ++ + proxyConnectionCount); ++ ++ Thread t = new Thread("ProxySocket" + proxyConnectionCount) { ++ @Override ++ public void run() { ++ try { ++ String firstLine = ++ readHeader(clientSocket.getInputStream()); ++ ++ Matcher connectLineMatcher = ++ connectLinePattern.matcher(firstLine); ++ if (!connectLineMatcher.matches()) { ++ System.out.println("Proxy: Unexpected" ++ + " request to the proxy: " ++ + firstLine); ++ return; ++ } ++ ++ String host = connectLineMatcher.group(1); ++ String portStr = connectLineMatcher.group(2); ++ int port = Integer.parseInt(portStr); ++ ++ Socket serverSocket = SocketFactory.getDefault() ++ .createSocket(host, port); ++ ++ clientSocket.getOutputStream() ++ .write(PROXY_RESPONSE.getBytes("UTF-8")); ++ ++ ProxyTunnel copyToClient = ++ new ProxyTunnel(serverSocket, clientSocket); ++ ProxyTunnel copyToServer = ++ new ProxyTunnel(clientSocket, serverSocket); ++ ++ copyToClient.start(); ++ copyToServer.start(); ++ ++ copyToClient.join(); ++ // here copyToClient.close() would not provoke the ++ // bug ( since it would trigger the retry logic in ++ // HttpURLConnction.writeRequests ), so close only ++ // the output to get the connection in this state. ++ clientSocket.shutdownOutput(); ++ ++ try { ++ Thread.sleep(3000); ++ } catch (InterruptedException ignored) { } ++ ++ // now close all connections to finish the test ++ copyToServer.close(); ++ copyToClient.close(); ++ } catch (IOException | NumberFormatException ++ | InterruptedException e) { ++ e.printStackTrace(); ++ } ++ } ++ }; ++ threads.add(t); ++ t.start(); ++ } ++ for (Thread t: threads) ++ t.join(); ++ } catch (IOException | InterruptedException e) { ++ e.printStackTrace(); ++ } ++ } ++ } ++ ++ /** ++ * This inner class provides unidirectional data flow through the sockets ++ * by continuously copying bytes from the input socket onto the output ++ * socket, until both sockets are open and EOF has not been received. ++ */ ++ class ProxyTunnel extends Thread { ++ private final Socket sockIn; ++ private final Socket sockOut; ++ private final InputStream input; ++ private final OutputStream output; ++ ++ public ProxyTunnel(Socket sockIn, Socket sockOut) throws IOException { ++ super("ProxyTunnel"); ++ this.sockIn = sockIn; ++ this.sockOut = sockOut; ++ input = sockIn.getInputStream(); ++ output = sockOut.getOutputStream(); ++ } ++ ++ public void run() { ++ byte[] buf = new byte[8192]; ++ int bytesRead; ++ ++ try { ++ while ((bytesRead = input.read(buf)) >= 0) { ++ output.write(buf, 0, bytesRead); ++ output.flush(); ++ } ++ } catch (IOException ignored) { ++ close(); ++ } ++ } ++ ++ public void close() { ++ try { ++ if (!sockIn.isClosed()) ++ sockIn.close(); ++ if (!sockOut.isClosed()) ++ sockOut.close(); ++ } catch (IOException ignored) { } ++ } ++ } ++ ++ /** ++ * the server thread ++ */ ++ class HttpServer extends Thread implements Closeable { ++ ++ private final ServerSocket serverSocket; ++ private final SSLSocketFactory sslSocketFactory; ++ private final String serverResponse = ++ "HTTP/1.1 200 OK\r\n" ++ + "Content-Type: text/plain\r\n" ++ + "Content-Length: 3\r\n" ++ + "\r\n" ++ + "Hi!"; ++ private int connectionCount = 0; ++ ++ HttpServer() throws Exception { ++ super("HttpServer Thread"); ++ ++ KeyStore ks = KeyStore.getInstance("JKS"); ++ ks.load(new FileInputStream(keystorefile), passphrase.toCharArray()); ++ KeyManagerFactory factory = KeyManagerFactory.getInstance("SunX509"); ++ factory.init(ks, passphrase.toCharArray()); ++ SSLContext ctx = SSLContext.getInstance("TLS"); ++ ctx.init(factory.getKeyManagers(), null, null); ++ ++ sslSocketFactory = ctx.getSocketFactory(); ++ ++ // Create the server that the test wants to connect to via the proxy ++ serverSocket = ServerSocketFactory.getDefault().createServerSocket(); ++ serverSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0)); ++ } ++ ++ public int getPort() { return serverSocket.getLocalPort(); } ++ ++ @Override ++ public void close() throws IOException { serverSocket.close(); } ++ ++ @Override ++ public void run() { ++ try { ++ while (connectionCount++ < 2) { ++ Socket socket = serverSocket.accept(); ++ System.out.println("Server: NEW CONNECTION " ++ + connectionCount); ++ ++ SSLSocket sslSocket = (SSLSocket) sslSocketFactory ++ .createSocket(socket,null, getPort(), false); ++ sslSocket.setUseClientMode(false); ++ sslSocket.startHandshake(); ++ ++ String firstLine = readHeader(sslSocket.getInputStream()); ++ if (firstLine != null && firstLine.contains("CONNECT")) { ++ System.out.println("Server: BUG! HTTP CONNECT" ++ + " encountered: " + firstLine); ++ connectInServer.set(true); ++ } ++ ++ // write the success response, the request body is not read. ++ // close only output and keep input open. ++ OutputStream out = sslSocket.getOutputStream(); ++ out.write(serverResponse.getBytes("UTF-8")); ++ socket.shutdownOutput(); ++ } ++ } catch (IOException e) { ++ e.printStackTrace(); ++ } ++ } ++ } ++ ++ /** ++ * read the header and return only the first line. ++ * ++ * @param inputStream the stream to read from ++ * @return the first line of the stream ++ * @throws IOException if reading failed ++ */ ++ private static String readHeader(InputStream inputStream) ++ throws IOException { ++ String line; ++ String firstLine = null; ++ while ((line = readLine(inputStream)) != null && line.length() > 0) { ++ if (firstLine == null) { ++ firstLine = line; ++ } ++ } ++ ++ return firstLine; ++ } ++ ++ /** ++ * read a line from stream. ++ * ++ * @param inputStream the stream to read from ++ * @return the line ++ * @throws IOException if reading failed ++ */ ++ private static String readLine(InputStream inputStream) ++ throws IOException { ++ final StringBuilder line = new StringBuilder(); ++ int ch; ++ while ((ch = inputStream.read()) != -1) { ++ if (ch == '\r') { ++ continue; ++ } ++ ++ if (ch == '\n') { ++ break; ++ } ++ ++ line.append((char) ch); ++ } ++ ++ return line.toString(); ++ } ++ ++ private SSLSocketFactory createTestSSLSocketFactory() { ++ ++ HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { ++ @Override ++ public boolean verify(String hostname, SSLSession sslSession) { ++ // ignore the cert's CN; it's not important to this test ++ return true; ++ } ++ }); ++ ++ // Set up the socket factory to use a trust manager that trusts all ++ // certs, since trust validation isn't important to this test ++ final TrustManager[] trustAllCertChains = new TrustManager[] { ++ new X509TrustManager() { ++ @Override ++ public X509Certificate[] getAcceptedIssuers() { ++ return null; ++ } ++ ++ @Override ++ public void checkClientTrusted(X509Certificate[] certs, ++ String authType) { ++ } ++ ++ @Override ++ public void checkServerTrusted(X509Certificate[] certs, ++ String authType) { ++ } ++ } ++ }; ++ ++ final SSLContext sc; ++ try { ++ sc = SSLContext.getInstance("TLS"); ++ } catch (NoSuchAlgorithmException e) { ++ throw new RuntimeException(e); ++ } ++ ++ try { ++ sc.init(null, trustAllCertChains, new java.security.SecureRandom()); ++ } catch (KeyManagementException e) { ++ throw new RuntimeException(e); ++ } ++ ++ return sc.getSocketFactory(); ++ } ++} +--- ./jdk/test/sun/net/www/http/HttpClient/RetryPost.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/net/www/http/HttpClient/RetryPost.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -28,7 +28,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/sun/net/www/protocol/jar/B5105410.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/net/www/protocol/jar/B5105410.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -31,7 +31,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/sun/net/www/protocol/jar/jarbug/run.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/net/www/protocol/jar/jarbug/run.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -31,17 +31,20 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" ++ CHMOD="${FS}bin${FS}chmod" + ;; + Windows* ) + PS=";" + FS="\\" ++ CHMOD="chmod" + ;; + CYGWIN* ) + PS=";" + FS="/" ++ CHMOD="chmod" + # + # javac does not like /cygdrive produced by `pwd`. + # +@@ -59,6 +62,7 @@ + mkdir -p ${DEST}${FS}jar1 + cd ${TESTSRC}${FS}etc${FS}jar1 + cp -r . ${DEST}${FS}jar1 ++${CHMOD} -R u+w ${DEST}${FS}jar1 + ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d ${DEST}${FS}jar1 \ + ${TESTSRC}${FS}src${FS}jar1${FS}LoadResourceBundle.java + ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d ${DEST}${FS}jar1 \ +--- ./jdk/test/sun/nio/cs/TestUTF8.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/nio/cs/TestUTF8.java Wed Jul 30 18:42:59 2014 +0100 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 4486841 7040220 7096080 ++ * @bug 4486841 7040220 7096080 8039751 + * @summary Test UTF-8 charset + */ + +@@ -291,14 +291,18 @@ + {1, (byte)0xE0, (byte)0xC0, (byte)0xBF }, // invalid second byte + {2, (byte)0xE0, (byte)0xA0, (byte)0x7F }, // invalid third byte + {2, (byte)0xE0, (byte)0xA0, (byte)0xC0 }, // invalid third byte ++ {2, (byte)0xE1, (byte)0x80, (byte)0x42}, // invalid third byte ++ + {1, (byte)0xFF, (byte)0xFF, (byte)0xFF }, // all ones + {1, (byte)0xE0, (byte)0xC0, (byte)0x80 }, // invalid second byte + {1, (byte)0xE0, (byte)0x80, (byte)0xC0 }, // invalid first byte + {1, (byte)0xE0, (byte)0x41,}, // invalid second byte & 2 bytes ++ {1, (byte)0xE1, (byte)0x40,}, // invalid second byte & 2 bytes + {3, (byte)0xED, (byte)0xAE, (byte)0x80 }, // 3 bytes surrogate + {3, (byte)0xED, (byte)0xB0, (byte)0x80 }, // 3 bytes surrogate + + ++ + // Four-byte sequences + {1, (byte)0xF0, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded + {1, (byte)0xF0, (byte)0x80, (byte)0x81, (byte)0xBF }, // U+007F zero-padded +@@ -323,6 +327,32 @@ + {1, (byte)0xF4, (byte)0xC0, (byte)0x80, (byte)0xC0 }, // out-range 4-byte + {1, (byte)0xF5, (byte)0x80, (byte)0x80, (byte)0xC0 }, // out-range 4-byte + ++ // #8039751 ++ {1, (byte)0xF6, (byte)0x80, (byte)0x80, (byte)0x80 }, // out-range 1st byte ++ {1, (byte)0xF6, (byte)0x80, (byte)0x80, }, ++ {1, (byte)0xF6, (byte)0x80, }, ++ {1, (byte)0xF6, }, ++ {1, (byte)0xF5, (byte)0x80, (byte)0x80, (byte)0x80 }, // out-range 1st byte ++ {1, (byte)0xF5, (byte)0x80, (byte)0x80, }, ++ {1, (byte)0xF5, (byte)0x80, }, ++ {1, (byte)0xF5 }, ++ ++ {1, (byte)0xF4, (byte)0x90, (byte)0x80, (byte)0x80 }, // out-range 2nd byte ++ {1, (byte)0xF4, (byte)0x90, (byte)0x80 }, ++ {1, (byte)0xF4, (byte)0x90 }, ++ ++ {1, (byte)0xF4, (byte)0x7f, (byte)0x80, (byte)0x80 }, // out-range/ascii 2nd byte ++ {1, (byte)0xF4, (byte)0x7f, (byte)0x80 }, ++ {1, (byte)0xF4, (byte)0x7f }, ++ ++ {1, (byte)0xF0, (byte)0x80, (byte)0x80, (byte)0x80 }, // out-range 2nd byte ++ {1, (byte)0xF0, (byte)0x80, (byte)0x80 }, ++ {1, (byte)0xF0, (byte)0x80 }, ++ ++ {1, (byte)0xF0, (byte)0xc0, (byte)0x80, (byte)0x80 }, // out-range 2nd byte ++ {1, (byte)0xF0, (byte)0xc0, (byte)0x80 }, ++ {1, (byte)0xF0, (byte)0xc0 }, ++ + // Five-byte sequences + {1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80}, // invalid first byte + {1, (byte)0xF8, (byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80 }, // U+0000 zero-padded +@@ -553,7 +583,6 @@ + check4ByteSurrs("UTF-8"); + checkMalformed("UTF-8", malformed); + checkUnderOverflow("UTF-8"); +- + checkRoundtrip("CESU-8"); + check6ByteSurrs("CESU-8"); + checkMalformed("CESU-8", malformed_cesu8); +--- ./jdk/test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -28,6 +28,7 @@ + * @author Robert Field + * @library /lib/testlibrary + * @compile -XDignore.symbol.file ManyNewInstanceAnonTest.java ++ * @build jdk.testlibrary.* + * @run main ClassFileInstaller ManyNewInstanceAnonTest + * @run main/othervm -Xbootclasspath/a:. -Xverify:all ManyNewInstanceAnonTest + * @run main/othervm -Xbootclasspath/a:. -Xverify:all -Dsun.reflection.noInflation=true ManyNewInstanceAnonTest +--- ./jdk/test/sun/rmi/rmic/newrmic/equivalence/batch.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/rmi/rmic/newrmic/equivalence/batch.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -61,13 +61,13 @@ + + set -ex + +-${TESTJAVA}/bin/rmic -keep -nowrite -v1.1 -d $refv11dir -classpath "$@" +-${TESTJAVA}/bin/rmic -keep -nowrite -vcompat -d $refvcompatdir -classpath "$@" +-${TESTJAVA}/bin/rmic -keep -v1.2 -d $refv12dir -classpath "$@" ++${TESTJAVA}/bin/rmic -keep -nowrite -v1.1 -d $refv11dir -classpath "$@" ++${TESTJAVA}/bin/rmic -keep -nowrite -vcompat -d $refvcompatdir -classpath "$@" ++${TESTJAVA}/bin/rmic -keep -nowrite -v1.2 -d $refv12dir -classpath "$@" + +-${TESTJAVA}/bin/rmic -Xnew -nowrite -keep -v1.1 -d $newv11dir -classpath "$@" +-${TESTJAVA}/bin/rmic -Xnew -nowrite -keep -vcompat -d $newvcompatdir -classpath "$@" +-${TESTJAVA}/bin/rmic -Xnew -keep -v1.2 -d $newv12dir -classpath "$@" ++${TESTJAVA}/bin/rmic -Xnew -keep -nowrite -v1.1 -d $newv11dir -classpath "$@" ++${TESTJAVA}/bin/rmic -Xnew -keep -nowrite -vcompat -d $newvcompatdir -classpath "$@" ++${TESTJAVA}/bin/rmic -Xnew -keep -nowrite -v1.2 -d $newv12dir -classpath "$@" + + set +ex + +--- ./jdk/test/sun/security/krb5/auto/AddressesAndNameType.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/krb5/auto/AddressesAndNameType.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,85 @@ ++/* ++ * 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 4501327 4868379 8039132 ++ * @run main/othervm AddressesAndNameType 1 ++ * @run main/othervm AddressesAndNameType 2 ++ * @run main/othervm AddressesAndNameType 3 ++ * @summary noaddresses settings and server name type ++ */ ++ ++import java.net.InetAddress; ++import java.util.Set; ++import sun.security.krb5.Config; ++ ++import javax.security.auth.kerberos.KerberosPrincipal; ++import javax.security.auth.kerberos.KerberosTicket; ++ ++public class AddressesAndNameType { ++ ++ public static void main(String[] args) ++ throws Exception { ++ ++ OneKDC kdc = new OneKDC(null); ++ kdc.writeJAASConf(); ++ ++ String extraLine; ++ switch (args[0]) { ++ case "1": extraLine = "noaddresses = false"; break; ++ case "2": extraLine = "noaddresses = true"; break; ++ default: extraLine = ""; break; ++ } ++ ++ KDC.saveConfig(OneKDC.KRB5_CONF, kdc, ++ extraLine); ++ Config.refresh(); ++ ++ Context c = Context.fromUserPass(OneKDC.USER, OneKDC.PASS, false); ++ Set<KerberosTicket> tickets = ++ c.s().getPrivateCredentials(KerberosTicket.class); ++ ++ if (tickets.isEmpty()) throw new Exception(); ++ KerberosTicket ticket = tickets.iterator().next(); ++ InetAddress[] addresses = ticket.getClientAddresses(); ++ ++ switch (args[0]) { ++ case "1": ++ if (addresses == null || addresses.length == 0) { ++ throw new Exception("No addresses"); ++ } ++ if (ticket.getServer().getNameType() ++ != KerberosPrincipal.KRB_NT_SRV_INST) { ++ throw new Exception( ++ "Wrong type: " + ticket.getServer().getNameType()); ++ } ++ break; ++ default: ++ if (addresses != null && addresses.length != 0) { ++ throw new Exception("See addresses"); ++ } ++ break; ++ } ++ } ++} +--- ./jdk/test/sun/security/krb5/auto/BadKdc.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/krb5/auto/BadKdc.java Wed Jul 30 18:42:59 2014 +0100 +@@ -39,7 +39,29 @@ + // ^ kdc# ^ timeout + static final Pattern re = Pattern.compile( + ">>> KDCCommunication: kdc=kdc.rabbit.hole UDP:(\\d)...., " + +- "timeout=(\\d)000,"); ++ "timeout=(\\d+),"); ++ ++ // Ratio for timeout values of all timeout tests. Not final so that ++ // each test can choose their own. ++ static float ratio = 2f; ++ ++ static void setRatio(float ratio) { ++ BadKdc.ratio = ratio; ++ } ++ ++ static float getRatio() { ++ return ratio; ++ } ++ ++ // Gets real timeout value. This method is called when writing krb5.conf ++ static int toReal(int from) { ++ return (int)(from * ratio + .5); ++ } ++ ++ // De-ratio a millisecond value to second ++ static int toSymbolicSec(int from) { ++ return (int)(from / ratio / 1000f + 0.5); ++ } + + /* + * There are several cases this test fails: +@@ -101,7 +123,7 @@ + + fw.write("[libdefaults]\n" + + "default_realm = " + OneKDC.REALM + "\n" + +- "kdc_timeout = 2000\n"); ++ "kdc_timeout = " + toReal(2000) + "\n"); + fw.write("[realms]\n" + OneKDC.REALM + " = {\n" + + "kdc = " + OneKDC.KDCHOST + ":" + p1 + "\n" + + "kdc = " + OneKDC.KDCHOST + ":" + p2 + "\n" + +@@ -184,7 +206,8 @@ + Matcher m = re.matcher(line); + if (m.find()) { + System.out.println(line); +- sb.append(m.group(1)).append(m.group(2)); ++ sb.append(m.group(1)) ++ .append(toSymbolicSec(Integer.parseInt(m.group(2)))); + } + } + if (failed) sb.append('-'); +--- ./jdk/test/sun/security/krb5/auto/BadKdc1.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/krb5/auto/BadKdc1.java Wed Jul 30 18:42:59 2014 +0100 +@@ -28,14 +28,21 @@ + * @summary krb5 should not try to access unavailable kdc too often + */ + +-import java.io.*; + import java.security.Security; + + public class BadKdc1 { + + public static void main(String[] args) + throws Exception { +- Security.setProperty("krb5.kdc.bad.policy", "tryLess"); ++ ++ // 5 sec is default timeout for tryLess ++ if (BadKdc.getRatio() > 2.5) { ++ Security.setProperty("krb5.kdc.bad.policy", ++ "tryLess:1," + BadKdc.toReal(2000)); ++ } else { ++ Security.setProperty("krb5.kdc.bad.policy", "tryLess"); ++ } ++ + BadKdc.go( + "121212222222(32){1,2}1222(32){1,2}", // 1 2 + // The above line means try kdc1 for 2 seconds then kdc1 +--- ./jdk/test/sun/security/krb5/auto/BadKdc2.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/krb5/auto/BadKdc2.java Wed Jul 30 18:42:59 2014 +0100 +@@ -35,7 +35,12 @@ + + public static void main(String[] args) + throws Exception { +- Security.setProperty("krb5.kdc.bad.policy", "tryLess:2,1000"); ++ ++ // 1 sec is too short. ++ BadKdc.setRatio(3.0f); ++ ++ Security.setProperty( ++ "krb5.kdc.bad.policy", "tryLess:2," + BadKdc.toReal(1000)); + BadKdc.go( + "121212222222(32){1,2}11112121(32){1,2}", // 1 2 + "11112121(32){1,2}11112121(32){1,2}", // 1 2 +--- ./jdk/test/sun/security/krb5/auto/KDC.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/krb5/auto/KDC.java Wed Jul 30 18:42:59 2014 +0100 +@@ -141,6 +141,8 @@ + private BlockingQueue<Job> q = new ArrayBlockingQueue<>(100); + // Options + private Map<Option,Object> options = new HashMap<>(); ++ // Realm-specific krb5.conf settings ++ private List<String> conf = new ArrayList<>(); + + private Thread thread1, thread2, thread3; + DatagramSocket u1 = null; +@@ -243,7 +245,7 @@ + /** + * Sets an option + * @param key the option name +- * @param obj the value ++ * @param value the value + */ + public void setOption(Option key, Object value) { + if (value == null) { +@@ -373,6 +375,13 @@ + } + + /** ++ * Add realm-specific krb5.conf setting ++ */ ++ public void addConf(String s) { ++ conf.add(s); ++ } ++ ++ /** + * Writes a krb5.conf for one or more KDC that includes KDC locations for + * each realm and the default realm name. You can also add extra strings + * into the file. The method should be called like: +@@ -397,6 +406,7 @@ + * [realms] + * REALM.NAME = { + * kdc = host:port_number ++ * # realm-specific settings + * } + * </pre> + * +@@ -444,10 +454,10 @@ + } + } + sb.append("\n[realms]\n"); +- sb.append(realmLineForKDC(kdc)); ++ sb.append(kdc.realmLine()); + for (Object o: more) { + if (o instanceof KDC) { +- sb.append(realmLineForKDC((KDC)o)); ++ sb.append(((KDC)o).realmLine()); + } + } + FileOutputStream fos = new FileOutputStream(f); +@@ -1133,14 +1143,16 @@ + + /** + * Generates a line for a KDC to put inside [realms] of krb5.conf +- * @param kdc the KDC +- * @return REALM.NAME = { kdc = host:port } ++ * @return REALM.NAME = { kdc = host:port etc } + */ +- private static String realmLineForKDC(KDC kdc) { +- return String.format("%s = {\n kdc = %s:%d\n}\n", +- kdc.realm, +- kdc.kdc, +- kdc.port); ++ private String realmLine() { ++ StringBuilder sb = new StringBuilder(); ++ sb.append(realm).append(" = {\n kdc = ") ++ .append(kdc).append(':').append(port).append('\n'); ++ for (String s: conf) { ++ sb.append(" ").append(s).append('\n'); ++ } ++ return sb.append("}\n").toString(); + } + + /** +--- ./jdk/test/sun/security/krb5/auto/MaxRetries.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/krb5/auto/MaxRetries.java Wed Jul 30 18:42:59 2014 +0100 +@@ -60,7 +60,7 @@ + test1(5000, 2); // 2 2 + + // For tryLess +- Security.setProperty("krb5.kdc.bad.policy", "tryless"); ++ Security.setProperty("krb5.kdc.bad.policy", "tryless:1," + BadKdc.toReal(5000)); + rewriteMaxRetries(4); + test1(4000, 7); // 1 1 1 1 2 1 2 + test1(4000, 4); // 1 2 1 2 +@@ -94,7 +94,7 @@ + * @param count the expected total try + */ + private static void test1(int timeout, int count) throws Exception { +- String timeoutTag = "timeout=" + timeout; ++ String timeoutTag = "timeout=" + BadKdc.toReal(timeout); + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + PrintStream oldout = System.out; + System.setOut(new PrintStream(bo)); +@@ -192,12 +192,12 @@ + if (s.startsWith("[realms]")) { + // Reconfig global setting + fw.write("max_retries = 2\n"); +- fw.write("kdc_timeout = 5000\n"); ++ fw.write("kdc_timeout = " + BadKdc.toReal(5000) + "\n"); + } else if (s.trim().startsWith("kdc = ")) { + if (value != -1) { + // Reconfig for realm + fw.write(" max_retries = " + value + "\n"); +- fw.write(" kdc_timeout = " + (value*1000) + "\n"); ++ fw.write(" kdc_timeout = " + BadKdc.toReal(value*1000) + "\n"); + } + // Add a bad KDC as the first candidate + fw.write(" kdc = localhost:33333\n"); +--- ./jdk/test/sun/security/krb5/auto/TcpTimeout.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/krb5/auto/TcpTimeout.java Wed Jul 30 18:42:59 2014 +0100 +@@ -63,7 +63,7 @@ + "udp_preference_limit = 1\n" + + "max_retries = 2\n" + + "default_realm = " + OneKDC.REALM + "\n" + +- "kdc_timeout = 5000\n"); ++ "kdc_timeout = " + BadKdc.toReal(5000) + "\n"); + fw.write("[realms]\n" + OneKDC.REALM + " = {\n" + + "kdc = " + OneKDC.KDCHOST + ":" + p1 + "\n" + + "kdc = " + OneKDC.KDCHOST + ":" + p2 + "\n" + +--- ./jdk/test/sun/security/krb5/auto/UdpTcp.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/krb5/auto/UdpTcp.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,71 @@ ++/* ++ * 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 4966382 8039132 ++ * @run main/othervm UdpTcp UDP ++ * @run main/othervm UdpTcp TCP ++ * @summary udp or tcp ++ */ ++ ++import java.io.ByteArrayOutputStream; ++import java.io.PrintStream; ++import sun.security.krb5.Config; ++ ++public class UdpTcp { ++ ++ public static void main(String[] args) ++ throws Exception { ++ ++ System.setProperty("sun.security.krb5.debug", "true"); ++ ++ OneKDC kdc = new OneKDC(null); ++ kdc.writeJAASConf(); ++ ++ // Two styles of kdc_timeout setting. One global, one realm-specific. ++ if (args[0].equals("UDP")) { ++ KDC.saveConfig(OneKDC.KRB5_CONF, kdc, ++ "kdc_timeout = 10s"); ++ } else { ++ kdc.addConf("kdc_timeout = 10s"); ++ KDC.saveConfig(OneKDC.KRB5_CONF, kdc, ++ "udp_preference_limit = 1"); ++ } ++ Config.refresh(); ++ ++ ByteArrayOutputStream bo = new ByteArrayOutputStream(); ++ PrintStream oldout = System.out; ++ System.setOut(new PrintStream(bo)); ++ Context.fromUserPass(OneKDC.USER, OneKDC.PASS, false); ++ System.setOut(oldout); ++ ++ for (String line: new String(bo.toByteArray()).split("\n")) { ++ if (line.contains(">>> KDCCommunication")) { ++ if (!line.contains(args[0]) || !line.contains("timeout=10000")) { ++ throw new Exception("No " + args[0] + " in: " + line); ++ } ++ } ++ } ++ } ++} +--- ./jdk/test/sun/security/krb5/config/ExtraLines.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/krb5/config/ExtraLines.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,52 @@ ++/* ++ * 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 8036971 ++ * @compile -XDignore.symbol.file ExtraLines.java ++ * @run main/othervm ExtraLines ++ * @summary krb5.conf does not accept directive lines before the first section ++ */ ++ ++import sun.security.krb5.Config; ++import java.nio.file.*; ++import java.util.Objects; ++ ++public class ExtraLines { ++ public static void main(String[] args) throws Exception { ++ Path base = Paths.get("krb5.conf"); ++ Path include = Paths.get("included.conf"); ++ String baseConf = "include " + include.toAbsolutePath().toString() ++ + "\n[x]\na = b\n"; ++ String includeConf = "[y]\nc = d\n"; ++ Files.write(include, includeConf.getBytes()); ++ Files.write(base, baseConf.getBytes()); ++ ++ System.setProperty("java.security.krb5.conf", base.toString()); ++ Config.refresh(); ++ ++ if (!Objects.equals(Config.getInstance().get("x", "a"), "b")) { ++ throw new Exception("Failed"); ++ } ++ } ++} +--- ./jdk/test/sun/security/krb5/etype/UnsupportedKeyType.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/krb5/etype/UnsupportedKeyType.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,77 @@ ++/* ++ * 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 5006629 ++ * @summary Kerberos library should only select keys of types that it supports ++ */ ++ ++import javax.security.auth.kerberos.KerberosPrincipal; ++import javax.security.auth.kerberos.KeyTab; ++import java.io.File; ++import java.nio.file.Files; ++import java.nio.file.Paths; ++ ++public class UnsupportedKeyType { ++ ++ // Homemade keytab files: ++ // ++ // String KVNO Timestamp Principal (etype) ++ // -------- ---- -------------- ----------------------- ++ // camellia 4 4/3/14 9:58 AM u1@K1 (25:camellia128-cts-cmac) ++ // aes 5 4/3/14 9:58 AM u1@K1 (17:aes128-cts-hmac-sha1-96) ++ ++ static String aes = ++ "050200000027000100024b310002753100000001533cc04f0500110010e0eab6" + ++ "7f31608df2b2f8fffc6b21cc91"; ++ static String camellia = ++ "050200000027000100024b310002753100000001533cc03e0400190010d88678" + ++ "14e478b6b7d2d97375163b971e"; ++ ++ public static void main(String[] args) throws Exception { ++ ++ byte[] data = new byte[aes.length()/2]; ++ KerberosPrincipal kp = new KerberosPrincipal("u1@K1"); ++ ++ // aes128 ++ for (int i=0; i<data.length; i++) { ++ data[i] = Integer.valueOf( ++ aes.substring(2*i,2*i+2), 16).byteValue(); ++ } ++ Files.write(Paths.get("aes"), data); ++ if(KeyTab.getInstance(kp, new File("aes")).getKeys(kp).length == 0) { ++ throw new Exception("AES key not read"); ++ } ++ ++ // camellia128 ++ for (int i=0; i<data.length; i++) { ++ data[i] = Integer.valueOf( ++ camellia.substring(2*i,2*i+2), 16).byteValue(); ++ } ++ Files.write(Paths.get("camellia"), data); ++ if(KeyTab.getInstance(kp, new File("camellia")).getKeys(kp).length != 0) { ++ throw new Exception("Unknown key read"); ++ } ++ } ++} +--- ./jdk/test/sun/security/krb5/runNameEquals.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/krb5/runNameEquals.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -66,6 +66,10 @@ + fi + fi + ;; ++ AIX ) ++ PATHSEP=":" ++ FILESEP="/" ++ ;; + CYGWIN* ) + PATHSEP=";" + FILESEP="/" +--- ./jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2008, 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 +@@ -139,6 +139,13 @@ + } + + private static void doTest() throws Exception { ++ // Make sure both NSS libraries are the same version. ++ if (isNSS(provider) && ++ (getLibsoftokn3Version() != getLibnss3Version())) { ++ System.out.println("libsoftokn3 and libnss3 versions do not match. Aborting test..."); ++ return; ++ } ++ + if (ks == null) { + ks = KeyStore.getInstance(KS_TYPE, provider); + ks.load(null, tokenPwd); +--- ./jdk/test/sun/security/pkcs11/PKCS11Test.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/PKCS11Test.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -66,6 +66,11 @@ + // The other is "libnss3.so", listed as "nss3". + static String nss_library = "softokn3"; + ++ // NSS versions of each library. It is simplier to keep nss_version ++ // for quick checking for generic testing than many if-else statements. ++ static double softoken3_version = -1; ++ static double nss3_version = -1; ++ + static Provider getSunPKCS11(String config) throws Exception { + Class clazz = Class.forName("sun.security.pkcs11.SunPKCS11"); + Constructor cons = clazz.getConstructor(new Class[] {String.class}); +@@ -175,6 +180,10 @@ + } + + public static String getNSSLibDir() throws Exception { ++ return getNSSLibDir(nss_library); ++ } ++ ++ static String getNSSLibDir(String library) throws Exception { + Properties props = System.getProperties(); + String osName = props.getProperty("os.name"); + if (osName.startsWith("Win")) { +@@ -195,7 +204,7 @@ + String nssLibDir = null; + for (String dir : nssLibDirs) { + if (new File(dir).exists() && +- new File(dir + System.mapLibraryName(nss_library)).exists()) { ++ new File(dir + System.mapLibraryName(library)).exists()) { + nssLibDir = dir; + System.setProperty("pkcs11test.nss.libdir", nssLibDir); + break; +@@ -241,16 +250,37 @@ + return nss_ecc_status; + } + ++ public static double getLibsoftokn3Version() { ++ if (softoken3_version == -1) ++ return getNSSInfo("softokn3"); ++ return softoken3_version; ++ } ++ ++ public static double getLibnss3Version() { ++ if (nss3_version == -1) ++ return getNSSInfo("nss3"); ++ return nss3_version; ++ } ++ + /* Read the library to find out the verison */ + static void getNSSInfo() { ++ getNSSInfo(nss_library); ++ } ++ ++ static double getNSSInfo(String library) { + String nssHeader = "$Header: NSS"; + boolean found = false; + String s = null; + int i = 0; + String libfile = ""; + ++ if (library.compareTo("softokn3") == 0 && softoken3_version > -1) ++ return softoken3_version; ++ if (library.compareTo("nss3") == 0 && nss3_version > -1) ++ return nss3_version; ++ + try { +- libfile = getNSSLibDir() + System.mapLibraryName(nss_library); ++ libfile = getNSSLibDir() + System.mapLibraryName(library); + FileInputStream is = new FileInputStream(libfile); + byte[] data = new byte[1000]; + int read = 0; +@@ -284,9 +314,10 @@ + } + + if (!found) { +- System.out.println("NSS version not found, set to 0.0: "+libfile); ++ System.out.println("lib" + library + ++ " version not found, set to 0.0: " + libfile); + nss_version = 0.0; +- return; ++ return nss_version; + } + + // the index after whitespace after nssHeader +@@ -306,11 +337,12 @@ + try { + nss_version = Double.parseDouble(version); + } catch (NumberFormatException e) { +- System.out.println("Failed to parse NSS version. Set to 0.0"); ++ System.out.println("Failed to parse lib" + library + ++ " version. Set to 0.0"); + e.printStackTrace(); + } + +- System.out.print("NSS version = "+version+". "); ++ System.out.print("lib" + library + " version = "+version+". "); + + // Check for ECC + if (s.indexOf("Basic") > 0) { +@@ -319,7 +351,17 @@ + } else if (s.indexOf("Extended") > 0) { + nss_ecc_status = ECCState.Extended; + System.out.println("ECC Extended."); ++ } else { ++ System.out.println("ECC None."); + } ++ ++ if (library.compareTo("softokn3") == 0) { ++ softoken3_version = nss_version; ++ } else if (library.compareTo("nss3") == 0) { ++ nss3_version = nss_version; ++ } ++ ++ return nss_version; + } + + // Used to set the nss_library file to search for libsoftokn3.so +@@ -457,7 +499,7 @@ + osMap.put("SunOS-x86-32", new String[]{"/usr/lib/mps/"}); + osMap.put("SunOS-amd64-64", new String[]{"/usr/lib/mps/64/"}); + osMap.put("Linux-i386-32", new String[]{ +- "/usr/lib/i386-linux-gnu/", "/usr/lib/"}); ++ "/usr/lib/i386-linux-gnu/", "/usr/lib32/", "/usr/lib/"}); + osMap.put("Linux-amd64-64", new String[]{ + "/usr/lib/x86_64-linux-gnu/", "/usr/lib/x86_64-linux-gnu/nss/", + "/usr/lib64/"}); +--- ./jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -72,6 +72,12 @@ + CP="${FS}bin${FS}cp" + CHMOD="${FS}bin${FS}chmod" + ;; ++ AIX ) ++ FS="/" ++ PS=":" ++ CP="${FS}bin${FS}cp" ++ CHMOD="${FS}bin${FS}chmod" ++ ;; + Windows* ) + FS="\\" + PS=";" +--- ./jdk/test/sun/security/pkcs11/Provider/Login.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/Provider/Login.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -73,6 +73,12 @@ + CP="${FS}bin${FS}cp" + CHMOD="${FS}bin${FS}chmod" + ;; ++ AIX ) ++ FS="/" ++ PS=":" ++ CP="${FS}bin${FS}cp" ++ CHMOD="${FS}bin${FS}chmod" ++ ;; + Windows* ) + FS="\\" + PS=";" +--- ./jdk/test/sun/security/pkcs11/fips/CipherTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/fips/CipherTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -472,8 +472,21 @@ + return false; + } + ++ // No ECDH-capable certificate in key store. May restructure ++ // this in the future. ++ if (cipherSuite.contains("ECDHE_ECDSA") || ++ cipherSuite.contains("ECDH_ECDSA") || ++ cipherSuite.contains("ECDH_RSA")) { ++ System.out.println("Skipping unsupported test for " + ++ cipherSuite + " of " + protocol); ++ return false; ++ } ++ + // skip SSLv2Hello protocol +- if (protocol.equals("SSLv2Hello")) { ++ // ++ // skip TLSv1.2 protocol, we have not implement "SunTls12Prf" and ++ // SunTls12RsaPremasterSecret in SunPKCS11 provider ++ if (protocol.equals("SSLv2Hello") || protocol.equals("TLSv1.2")) { + System.out.println("Skipping unsupported test for " + + cipherSuite + " of " + protocol); + return false; +--- ./jdk/test/sun/security/pkcs11/fips/ClientJSSEServerJSSE.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/fips/ClientJSSEServerJSSE.java Wed Jul 30 18:42:59 2014 +0100 +@@ -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 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 6313675 6323647 ++ * @bug 6313675 6323647 8028192 + * @summary Verify that all ciphersuites work in FIPS mode + * @library .. + * @ignore JSSE supported cipher suites are changed with CR 6916074, +@@ -44,9 +44,13 @@ + return; + } + +- if ("sparc".equals(System.getProperty("os.arch")) == false) { +- // we have not updated other platforms with the proper NSS libraries yet +- System.out.println("Test currently works only on solaris-sparc, skipping"); ++ String arch = System.getProperty("os.arch"); ++ if (!("sparc".equals(arch) || "sparcv9".equals(arch))) { ++ // we have not updated other platforms with the proper NSS ++ // libraries yet ++ System.out.println( ++ "Test currently works only on solaris-sparc " + ++ "and solaris-sparcv9. Skipping on " + arch); + return; + } + +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.chk has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/freebl3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/libnspr4.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/libplc4.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/libplds4.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/nss3.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/nssckbi.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.chk has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/nssdbm3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/nssutil3.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.chk has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/softokn3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/sqlite3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-amd64/ssl3.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.chk has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/freebl3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/libnspr4.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/libplc4.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/libplds4.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/nss3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/nss3.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/nssckbi.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.chk has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/nssdbm3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/nssutil3.lib has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.chk has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/softokn3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/sqlite3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.dll has changed +Binary file test/sun/security/pkcs11/nss/lib/windows-i586/ssl3.lib has changed +--- ./jdk/test/sun/security/pkcs11/nss/src/MD5SUMS Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/nss/src/MD5SUMS Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1 +0,0 @@ +-1390c8a35c667e05e542 nss-3.13.1.tar.gz +--- ./jdk/test/sun/security/pkcs11/nss/src/SHA1SUMS Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/nss/src/SHA1SUMS Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1 +0,0 @@ +-d8e7ee9f9f1e0bfa2ea8b72d25727634fea130a6 nss-3.13.1.tar.gz +Binary file test/sun/security/pkcs11/nss/src/nss-3.13.1.tar.gz has changed +Binary file test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz has changed +--- ./jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz.sha256 Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/pkcs11/nss/src/nss-3.16_nspr-4.10_src.tar.gz.sha256 Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,1 @@ ++d2374795528f9cf36de07bf7c77d8c8414bb5b4da12ee7c78a57ec90d68e3706 nss-3.16_nspr-4.10_src.tar.gz +--- ./jdk/test/sun/security/pkcs11/tls/TestPremaster.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/tls/TestPremaster.java Wed Jul 30 18:42:59 2014 +0100 +@@ -34,6 +34,7 @@ + + import javax.crypto.KeyGenerator; + import javax.crypto.SecretKey; ++import java.util.Formatter; + + import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec; + +@@ -59,27 +60,51 @@ + System.out.println("OK: " + e); + } + +- test(kg, 3, 0); +- test(kg, 3, 1); +- test(kg, 3, 2); +- test(kg, 4, 0); ++ int[] protocolVersions = {0x0300, 0x0301, 0x0302, 0x0400}; ++ for (int clientVersion : protocolVersions) { ++ for (int serverVersion : protocolVersions) { ++ test(kg, clientVersion, serverVersion); ++ if (serverVersion >= clientVersion) { ++ break; ++ } ++ } ++ } + + System.out.println("Done."); + } + +- private static void test(KeyGenerator kg, int major, int minor) +- throws Exception { ++ private static void test(KeyGenerator kg, ++ int clientVersion, int serverVersion) throws Exception { + +- kg.init(new TlsRsaPremasterSecretParameterSpec(major, minor)); ++ System.out.printf( ++ "Testing RSA pre-master secret key generation between " + ++ "client (0x%04X) and server(0x%04X)%n", ++ clientVersion, serverVersion); ++ kg.init(new TlsRsaPremasterSecretParameterSpec( ++ clientVersion, serverVersion)); + SecretKey key = kg.generateKey(); + byte[] encoded = key.getEncoded(); +- if (encoded.length != 48) { +- throw new Exception("length: " + encoded.length); +- } +- if ((encoded[0] != major) || (encoded[1] != minor)) { +- throw new Exception("version mismatch: " + encoded[0] + +- "." + encoded[1]); +- } +- System.out.println("OK: " + major + "." + minor); ++ if (encoded != null) { // raw key material may be not extractable ++ if (encoded.length != 48) { ++ throw new Exception("length: " + encoded.length); ++ } ++ int v = versionOf(encoded[0], encoded[1]); ++ if (clientVersion != v) { ++ if (serverVersion != v || clientVersion >= 0x0302) { ++ throw new Exception(String.format( ++ "version mismatch: (0x%04X) rather than (0x%04X) " + ++ "is used in pre-master secret", v, clientVersion)); ++ } ++ System.out.printf("Use compatible version (0x%04X)%n", v); ++ } ++ System.out.println("Passed, version matches!"); ++ } else { ++ System.out.println("Raw key material is not extractable"); ++ } + } ++ ++ private static int versionOf(int major, int minor) { ++ return ((major & 0xFF) << 8) | (minor & 0xFF); ++ } ++ + } +--- ./jdk/test/sun/security/provider/KeyStore/DKSTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/provider/KeyStore/DKSTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -50,15 +50,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS ) +- PS=":" +- FS="/" +- ;; +- Linux ) +- PS=":" +- FS="/" +- ;; +- Darwin ) ++ SunOS | Linux | Darwin | AIX) + PS=":" + FS="/" + ;; +--- ./jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -63,6 +63,10 @@ + PS=":" + FS="/" + ;; ++ AIX ) ++ PS=":" ++ FS="/" ++ ;; + CYGWIN* ) + PS=";" + FS="/" +--- ./jdk/test/sun/security/provider/certpath/PKIXCertPathValidator/Validity.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/provider/certpath/PKIXCertPathValidator/Validity.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,134 @@ ++/* ++ * 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 8021804 ++ * @summary CertPath should validate even if the validity period of the ++ * root cert does not include the validity period of a subordinate ++ * cert. ++ */ ++ ++import java.io.ByteArrayInputStream; ++import java.security.cert.*; ++import java.util.ArrayList; ++import java.util.Date; ++import java.util.HashSet; ++import java.util.Set; ++ ++public class Validity { ++ ++ /* ++ * Subject: OU=TestOrg, CN=TestCA ++ * Issuer: OU=TestOrg, CN=TestCA ++ * Validity ++ * Not Before: Feb 26 21:33:55 2014 GMT ++ Not After : Feb 26 21:33:55 2024 GMT ++ * Version 1 ++ */ ++ static String CACertStr = ++ "-----BEGIN CERTIFICATE-----\n" + ++ "MIIBvTCCASYCCQCQRiTo4lBCFjANBgkqhkiG9w0BAQUFADAjMRAwDgYDVQQLDAdU\n" + ++ "ZXN0T3JnMQ8wDQYDVQQDDAZUZXN0Q0EwHhcNMTQwMjI2MjEzMzU1WhcNMjQwMjI2\n" + ++ "MjEzMzU1WjAjMRAwDgYDVQQLDAdUZXN0T3JnMQ8wDQYDVQQDDAZUZXN0Q0EwgZ8w\n" + ++ "DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOtKS4ZrsM3ansd61ZxitcrN0w184I+A\n" + ++ "z0kyrSP1eMtlam+cC2U91NpTz11FYV4XUfBhqqxaXW043AWTUer8pS90Pt4sCrUX\n" + ++ "COx1+QA1M3ZhbZ4sTM7XQ90JbGaBJ/sEza9mlQP7hQ2yQO/hATKbP6J5qvgG2sT2\n" + ++ "S2WYjEgwNwmFAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAQ/CXEpnx2WY4LJtv4jwE\n" + ++ "4jIVirur3pdzV5oBhPyqqHMsyhQBkukCfX7uD7L5wN1+xuM81DfANpIxlnUfybp5\n" + ++ "CpjcmktLpmyK4kJ6XnSd2blbLOIpsr9x6FqxPxpVDlyw/ySHYrIG/GZdsLHgmzGn\n" + ++ "B06jeYzH8OLf879VxAxSsPc=\n" + ++ "-----END CERTIFICATE-----"; ++ ++ /* ++ * Subject: OU=TestOrg, CN=TestEE0 ++ * Issuer: OU=TestOrg, CN=TestCA ++ * Validity ++ * Not Before: Feb 26 22:55:12 2014 GMT ++ * Not After : Feb 25 22:55:12 2025 GMT ++ * Version 1 ++ */ ++ static String EECertStr = ++ "-----BEGIN CERTIFICATE-----\n" + ++ "MIIBtjCCAR8CAQQwDQYJKoZIhvcNAQEFBQAwIzEQMA4GA1UECwwHVGVzdE9yZzEP\n" + ++ "MA0GA1UEAwwGVGVzdENBMB4XDTE0MDIyNjIyNTUxMloXDTI1MDIyNTIyNTUxMlow\n" + ++ "JDEQMA4GA1UECwwHVGVzdE9yZzEQMA4GA1UEAwwHVGVzdEVFMDCBnzANBgkqhkiG\n" + ++ "9w0BAQEFAAOBjQAwgYkCgYEAt8xz9W3ruCTHjSOtTX6cxsUZ0nRP6EavEfzgcOYh\n" + ++ "CXGA0gr+viSHq3c2vQBxiRny2hm5rLcqpPo+2OxZtw/ajxfyrV6d/r8YyQLBvyl3\n" + ++ "xdCZdOkG1DCM1oFAQDaSRt9wN5Zm5kyg7uMig5Y4L45fP9Yee4x6Xyh36qYbsR89\n" + ++ "rFMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQDZrPqSo08va1m9TOWOztTuWilGdjK/\n" + ++ "2Ed2WXg8utIpy6uAV+NaOYtHQ7ULQBVRNmwg9nKghbVbh+E/xpoihjl1x7OXass4\n" + ++ "TbwXA5GKFIFpNtDvATQ/QQZoCuCzw1FW/mH0Q7UEQ/9/iJdDad6ebkapeMwtj/8B\n" + ++ "s2IZV7s85CEOXw==\n" + ++ "-----END CERTIFICATE-----"; ++ ++ public static void main(String[] args) throws Exception { ++ ++ String[] certStrs = {EECertStr}; ++ String[] trustedCertStrs = {CACertStr}; ++ runTest(certStrs, trustedCertStrs); ++ ++ System.out.println("Test passed."); ++ } ++ ++ private static void runTest(String[] certStrs, ++ String[] trustedCertStrs) ++ throws Exception { ++ ++ CertificateFactory cf = CertificateFactory.getInstance("X509"); ++ ++ // Generate the CertPath from the certs named in certStrs ++ ArrayList<X509Certificate> certs = new ArrayList<>(); ++ for (String certStr : certStrs) { ++ certs.add(generateCert(certStr, cf)); ++ } ++ CertPath cp = cf.generateCertPath(certs); ++ ++ // Generate the set of Trust Anchors from the certs named in ++ // trustedCertStrs ++ Set<TrustAnchor> trustAnchors = new HashSet<>(); ++ for (String trustedCertStr : trustedCertStrs) { ++ TrustAnchor ta = new TrustAnchor(generateCert(trustedCertStr, cf), ++ null); ++ trustAnchors.add(ta); ++ } ++ PKIXParameters params = new PKIXParameters(trustAnchors); ++ params.setDate(new Date(114, 3, 1)); // 2014-03-01 ++ params.setRevocationEnabled(false); ++ ++ // Attempt to validate the CertPath. If no exception thrown, successful. ++ CertPathValidator cpv = CertPathValidator.getInstance("PKIX"); ++ cpv.validate(cp, params); ++ System.out.println("CertPath validation successful."); ++ } ++ ++ private static X509Certificate generateCert(String certStr, ++ CertificateFactory cf) ++ throws Exception { ++ ByteArrayInputStream stream ++ = new ByteArrayInputStream(certStr.getBytes()); ++ return (X509Certificate) cf.generateCertificate(stream); ++ ++ } ++} +--- ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/EngineArgs/DebugReportsOneExtraByte.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/EngineArgs/DebugReportsOneExtraByte.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -33,7 +33,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/SSLEngineBadBufferArrayAccess.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/SSLEngineBadBufferArrayAccess.java Wed Jul 30 18:42:59 2014 +0100 +@@ -148,14 +148,14 @@ + "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" }; + + for (String protocol : protocols) { +- log("Testing " + protocol); + /* + * Run the tests with direct and indirect buffers. + */ +- SSLEngineBadBufferArrayAccess test = +- new SSLEngineBadBufferArrayAccess(protocol); +- test.runTest(true); +- test.runTest(false); ++ log("Testing " + protocol + ":true"); ++ new SSLEngineBadBufferArrayAccess(protocol).runTest(true); ++ ++ log("Testing " + protocol + ":false"); ++ new SSLEngineBadBufferArrayAccess(protocol).runTest(false); + } + + System.out.println("Test Passed."); +--- ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,7 +46,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + FILESEP="/" + PATHSEP=":" + ;; +--- ./jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -32,7 +32,7 @@ + HOSTNAME=`uname -n` + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -32,7 +32,7 @@ + HOSTNAME=`uname -n` + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PS=":" + FS="/" + ;; +--- ./jdk/test/sun/security/tools/jarsigner/AlgOptions.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/AlgOptions.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,7 +46,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/jarsigner/PercentSign.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/PercentSign.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,7 +46,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/jarsigner/certpolicy.sh Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/security/tools/jarsigner/certpolicy.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -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 8036709 ++# @summary Java 7 jarsigner displays warning about cert policy tree ++# ++# @run shell certpolicy.sh ++# ++ ++if [ "${TESTJAVA}" = "" ] ; then ++ JAVAC_CMD=`which javac` ++ TESTJAVA=`dirname $JAVAC_CMD`/.. ++fi ++ ++KT="$TESTJAVA/bin/keytool $TESTTOOLVMOPTS \ ++ -keypass changeit -storepass changeit -keystore ks -keyalg rsa" ++JS="$TESTJAVA/bin/jarsigner $TESTTOOLVMOPTS -storepass changeit -keystore ks" ++JAR="$TESTJAVA/bin/jar $TESTTOOLVMOPTS" ++ ++rm ks 2> /dev/null ++$KT -genkeypair -alias ca -dname CN=CA -ext bc ++$KT -genkeypair -alias int -dname CN=Int ++$KT -genkeypair -alias ee -dname CN=EE ++ ++# CertificatePolicies [[PolicyId: [1.2.3]], [PolicyId: [1.2.4]]] ++# PolicyConstraints: [Require: 0; Inhibit: unspecified] ++$KT -certreq -alias int | \ ++ $KT -gencert -rfc -alias ca \ ++ -ext 2.5.29.32="30 0C 30 04 06 02 2A 03 30 04 06 02 2A 04" \ ++ -ext "2.5.29.36=30 03 80 01 00" -ext bc | \ ++ $KT -import -alias int ++ ++# CertificatePolicies [[PolicyId: [1.2.3]]] ++$KT -certreq -alias ee | \ ++ $KT -gencert -rfc -alias int \ ++ -ext 2.5.29.32="30 06 30 04 06 02 2A 03" | \ ++ $KT -import -alias ee ++ ++$KT -export -alias ee -rfc > cc ++$KT -export -alias int -rfc >> cc ++$KT -export -alias ca -rfc >> cc ++ ++$KT -delete -alias int ++ ++ERR='' ++$JAR cvf a.jar cc ++ ++# Make sure the certchain in the signed jar contains all 3 certs ++$JS -strict -certchain cc a.jar ee -debug || ERR="sign" ++$JS -strict -verify a.jar -debug || ERR="$ERR verify" ++ ++if [ "$ERR" = "" ]; then ++ echo "Success" ++ exit 0 ++else ++ echo "Failed: $ERR" ++ exit 1 ++fi ++ +--- ./jdk/test/sun/security/tools/jarsigner/diffend.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/diffend.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -41,7 +41,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/jarsigner/oldsig.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/oldsig.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -42,7 +42,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/keytool/AltProviderPath.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/AltProviderPath.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,7 +46,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -59,6 +59,10 @@ + PATHSEP=":" + FILESEP="/" + ;; ++ AIX ) ++ PATHSEP=":" ++ FILESEP="/" ++ ;; + CYGWIN* ) + PATHSEP=";" + FILESEP="/" +--- ./jdk/test/sun/security/tools/keytool/NoExtNPE.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/NoExtNPE.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -51,6 +51,10 @@ + Darwin ) + FILESEP="/" + ;; ++ AIX ) ++ PATHSEP=":" ++ FILESEP="/" ++ ;; + CYGWIN* ) + FILESEP="/" + ;; +--- ./jdk/test/sun/security/tools/keytool/SecretKeyKS.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/SecretKeyKS.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -45,7 +45,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/keytool/StandardAlgName.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/StandardAlgName.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,7 +46,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/keytool/StorePasswordsByShell.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/StorePasswordsByShell.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,15 +46,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS ) +- PATHSEP=":" +- FILESEP="/" +- ;; +- Linux ) +- PATHSEP=":" +- FILESEP="/" +- ;; +- Darwin ) ++ SunOS | Linux | Darwin | AIX) + PATHSEP=":" + FILESEP="/" + ;; +--- ./jdk/test/sun/security/tools/keytool/autotest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/autotest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -72,6 +72,8 @@ + Linux ) + if [ $B32 = true ]; then + LIBNAME=`find_one \ ++ "/usr/lib32/libsoftokn3.so" \ ++ "/usr/lib32/nss/libsoftokn3.so" \ + "/usr/lib/libsoftokn3.so" \ + "/usr/lib/i386-linux-gnu/nss/libsoftokn3.so" \ + "/usr/lib/nss/libsoftokn3.so"` +--- ./jdk/test/sun/security/tools/keytool/printssl.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/printssl.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -40,7 +40,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + FS="/" + ;; + CYGWIN* ) +--- ./jdk/test/sun/security/tools/keytool/resource.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/resource.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -43,7 +43,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + FS="/" + ;; +--- ./jdk/test/sun/security/tools/keytool/standard.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/standard.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -45,7 +45,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin | CYGWIN* ) ++ SunOS | Linux | Darwin | AIX | CYGWIN* ) + FS="/" + ;; + Windows_* ) +--- ./jdk/test/sun/security/tools/policytool/Alias.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/Alias.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -47,7 +47,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/policytool/ChangeUI.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/ChangeUI.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,7 +46,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/policytool/OpenPolicy.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/OpenPolicy.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,7 +46,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/policytool/SaveAs.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/SaveAs.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -47,7 +47,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/policytool/UpdatePermissions.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/UpdatePermissions.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -47,7 +47,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/policytool/UsePolicy.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/UsePolicy.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -46,7 +46,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +--- ./jdk/test/sun/security/tools/policytool/i18n.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/i18n.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -49,7 +49,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + NULL=/dev/null + PS=":" + FS="/" +@@ -77,7 +77,7 @@ + echo "Checking for $HOME/.java.policy" + + # 8015274 +-if [ -e $HOME/.java.policy ]; then ++if [ -f $HOME/.java.policy ]; then + echo "You have a .java.policy file in your HOME directory" + echo "The file must be removed before running this test" + exit 1 +--- ./jdk/test/sun/text/resources/Format/Bug8037343.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/sun/text/resources/Format/Bug8037343.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,71 @@ ++/* ++ * 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 8037343 ++ * @summary updating dateformat for es_DO ++ */ ++ ++import java.text.DateFormat; ++import java.util.Calendar; ++import java.util.Locale; ++ ++public class Bug8037343 ++{ ++ ++ public static void main(String[] arg) ++ { ++ final Locale esDO = new Locale("es", "DO"); ++ final String expectedShort = "31/03/12"; ++ final String expectedMedium = "31/03/2012"; ++ ++ int errors = 0; ++ DateFormat format; ++ String result; ++ ++ Calendar cal = Calendar.getInstance(esDO); ++ cal.set(Calendar.DAY_OF_MONTH, 31); ++ cal.set(Calendar.MONTH, Calendar.MARCH); ++ cal.set(Calendar.YEAR, 2012); ++ ++ format = DateFormat.getDateInstance(DateFormat.SHORT, esDO); ++ result = format.format(cal.getTime()); ++ if (!expectedShort.equals(result)) { ++ System.out.println(String.format("Short Date format for es_DO is not as expected. Expected: [%s] Actual: [%s]", expectedShort, result)); ++ errors++; ++ } ++ ++ format = DateFormat.getDateInstance(DateFormat.MEDIUM, esDO); ++ result = format.format(cal.getTime()); ++ if (!expectedMedium.equals(result)) { ++ System.out.println(String.format("Medium Date format for es_DO is not as expected. Expected: [%s] Actual: [%s]", expectedMedium, result)); ++ errors++; ++ } ++ ++ if (errors > 0) { ++ throw new RuntimeException(); ++ } ++ } ++ ++} +--- ./jdk/test/sun/text/resources/LocaleData Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/text/resources/LocaleData Wed Jul 30 18:42:59 2014 +0100 +@@ -431,10 +431,6 @@ + FormatData/es_CL/NumberPatterns/0=#,##0.###;-#,##0.### + # FormatData/es_CL/NumberPatterns/1=Ch$#,##0.00;Ch$-#,##0.00 # Changed; see bug 4122840 + FormatData/es_CL/NumberPatterns/2=#,##0% +-FormatData/es_CL/TimePatterns/0=hh:mm:ss a z +-FormatData/es_CL/TimePatterns/1=hh:mm:ss a z +-FormatData/es_CL/TimePatterns/2=hh:mm:ss a +-FormatData/es_CL/TimePatterns/3=hh:mm a + FormatData/es_CL/DatePatterns/0=EEEE d' de 'MMMM' de 'yyyy + FormatData/es_CL/DatePatterns/1=d' de 'MMMM' de 'yyyy + FormatData/es_CL/DatePatterns/2=dd-MM-yyyy +@@ -487,8 +483,8 @@ + FormatData/es_DO/TimePatterns/3=hh:mm a + FormatData/es_DO/DatePatterns/0=EEEE d' de 'MMMM' de 'yyyy + FormatData/es_DO/DatePatterns/1=d' de 'MMMM' de 'yyyy +-FormatData/es_DO/DatePatterns/2=MM/dd/yyyy +-FormatData/es_DO/DatePatterns/3=MM/dd/yy ++# FormatData/es_DO/DatePatterns/2=MM/dd/yyyy # Changed: see bug 8037343 ++# FormatData/es_DO/DatePatterns/3=MM/dd/yy # Changed: see bug 8037343 + FormatData/es_DO/DateTimePatterns/0={1} {0} + FormatData/es_DO/NumberElements/0=. + FormatData/es_DO/NumberElements/1=, +@@ -498,10 +494,6 @@ + FormatData/es_EC/NumberPatterns/2=#,##0% + #changed for 4945388 + CurrencyNames/es_EC/USD=$ +-FormatData/es_EC/TimePatterns/0=hh:mm:ss a z +-FormatData/es_EC/TimePatterns/1=hh:mm:ss a z +-FormatData/es_EC/TimePatterns/2=hh:mm:ss a +-FormatData/es_EC/TimePatterns/3=hh:mm a + FormatData/es_EC/DatePatterns/0=EEEE d' de 'MMMM' de 'yyyy + FormatData/es_EC/DatePatterns/1=d' de 'MMMM' de 'yyyy + FormatData/es_EC/DatePatterns/2=dd/MM/yyyy +@@ -7693,3 +7685,17 @@ + + # bug 8027695 + FormatData/sv_SE/NumberPatterns/2=#,##0 % ++ ++# bug 8017142 ++FormatData/es_CL/TimePatterns/0=HH:mm:ss zzzz ++FormatData/es_CL/TimePatterns/1=H:mm:ss z ++FormatData/es_CL/TimePatterns/2=H:mm:ss ++FormatData/es_CL/TimePatterns/3=H:mm ++FormatData/es_EC/TimePatterns/0=HH:mm:ss zzzz ++FormatData/es_EC/TimePatterns/1=H:mm:ss z ++FormatData/es_EC/TimePatterns/2=H:mm:ss ++FormatData/es_EC/TimePatterns/3=H:mm ++ ++# bug 8037343 ++FormatData/es_DO/DatePatterns/2=dd/MM/yyyy ++FormatData/es_DO/DatePatterns/3=dd/MM/yy +--- ./jdk/test/sun/text/resources/LocaleDataTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/text/resources/LocaleDataTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -36,6 +36,7 @@ + * 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495 + * 7003124 7085757 7028073 7171028 7189611 8000983 7195759 8004489 8006509 + * 7114053 7074882 7040556 8013836 8021121 6192407 6931564 8027695 7090826 ++ * 8017142 8037343 + * @summary Verify locale data + * + */ +--- ./jdk/test/sun/tools/common/CommonSetup.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/common/CommonSetup.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -48,6 +48,7 @@ + # isSolaris - true if OS is Solaris + # isWindows - true if OS is Windows + # isMacos - true if OS is Macos X ++# isAIX - true if OS is AIX + + + if [ -z "${TESTJAVA}" ]; then +@@ -83,6 +84,7 @@ + isUnknownOS=false + isWindows=false + isMacos=false ++isAIX=false + + OS=`uname -s` + +@@ -113,6 +115,10 @@ + OS="Solaris" + isSolaris=true + ;; ++ AIX ) ++ OS="AIX" ++ isAIX=true ++ ;; + Windows* ) + OS="Windows" + PATTERN_EOL='[]*$' +--- ./jdk/test/sun/tools/jconsole/ResourceCheckTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/jconsole/ResourceCheckTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -54,7 +54,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin) ++ SunOS | Linux | Darwin | AIX) + PATHSEP=":" + ;; + +--- ./jdk/test/sun/tools/jinfo/Basic.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/jinfo/Basic.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -45,7 +45,7 @@ + + runSA=true + +-if [ $isMacos = true ]; then ++if [ $isMacos = true -o $isAIX = true -o `uname -m` = ppc64 ]; then + runSA=false + fi + +--- ./jdk/test/sun/tools/jstatd/JstatdTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/jstatd/JstatdTest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -27,6 +27,7 @@ + import java.rmi.registry.LocateRegistry; + import java.rmi.registry.Registry; + import java.util.Arrays; ++import java.util.regex.Pattern; + + import static jdk.testlibrary.Asserts.*; + import jdk.testlibrary.JDKToolLauncher; +@@ -34,6 +35,7 @@ + import jdk.testlibrary.ProcessThread; + import jdk.testlibrary.TestThread; + import jdk.testlibrary.Utils; ++import jdk.testlibrary.ProcessTools; + + /** + * The base class for tests of jstatd. +@@ -93,8 +95,11 @@ + if (tool == "rmiregistry") { + processName = "registryimpl"; + } ++ ++ Pattern toolInJpsPattern = ++ Pattern.compile("^\\d+\\s{1}" + processName + "\\s{1}.*-dparent\\.pid\\." + ProcessTools.getProcessId() + ".*"); + for (String line : lines) { +- if (line.toLowerCase().matches("^\\d+\\s{1}" + processName + "$")) { ++ if (toolInJpsPattern.matcher(line.toLowerCase()).matches()) { + pid = line.split(" ")[0]; + count++; + } +@@ -167,6 +172,8 @@ + private OutputAnalyzer runJps() throws Exception { + JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jps"); + launcher.addVMArg("-XX:+UsePerfData"); ++ // Run jps with -v flag to obtain -Dparent.pid.<pid> ++ launcher.addToolArg("-v"); + launcher.addToolArg(getDestination()); + + String[] cmd = launcher.getCommand(); +@@ -286,7 +293,7 @@ + * jstatd -J-XX:+UsePerfData -J-Djava.security.policy=all.policy -n serverName + * jstatd -J-XX:+UsePerfData -J-Djava.security.policy=all.policy -p port -n serverName + */ +- private String[] getJstatdCmd() throws UnknownHostException { ++ private String[] getJstatdCmd() throws Exception { + JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jstatd"); + launcher.addVMArg("-XX:+UsePerfData"); + String testSrc = System.getProperty("test.src"); +@@ -294,6 +301,8 @@ + assertTrue(policy.exists() && policy.isFile(), + "Security policy " + policy.getAbsolutePath() + " does not exist or not a file"); + launcher.addVMArg("-Djava.security.policy=" + policy.getAbsolutePath()); ++ // -Dparent.pid.<pid> will help to identify jstad process started by this test ++ launcher.addVMArg("-Dparent.pid." + ProcessTools.getProcessId()); + if (port != null) { + launcher.addToolArg("-p"); + launcher.addToolArg(port); +--- ./jdk/test/sun/tools/jstatd/TestJstatdDefaults.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/jstatd/TestJstatdDefaults.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,7 +25,7 @@ + * @test + * @bug 4990825 + * @library /lib/testlibrary +- * @build JstatdTest JstatGCUtilParser ++ * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser + * @run main/timeout=60 TestJstatdDefaults + */ + public class TestJstatdDefaults { +--- ./jdk/test/sun/tools/jstatd/TestJstatdExternalRegistry.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/jstatd/TestJstatdExternalRegistry.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,7 +25,7 @@ + * @test + * @bug 4990825 7092186 + * @library /lib/testlibrary +- * @build JstatdTest JstatGCUtilParser ++ * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser + * @run main/timeout=60 TestJstatdExternalRegistry + */ + public class TestJstatdExternalRegistry { +--- ./jdk/test/sun/tools/jstatd/TestJstatdPort.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/jstatd/TestJstatdPort.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,7 +25,7 @@ + * @test + * @bug 4990825 + * @library /lib/testlibrary +- * @build JstatdTest JstatGCUtilParser ++ * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser + * @run main/timeout=60 TestJstatdPort + */ + public class TestJstatdPort { +--- ./jdk/test/sun/tools/jstatd/TestJstatdPortAndServer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/jstatd/TestJstatdPortAndServer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,7 +25,7 @@ + * @test + * @bug 4990825 + * @library /lib/testlibrary +- * @build JstatdTest JstatGCUtilParser ++ * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser + * @run main/timeout=60 TestJstatdPortAndServer + */ + public class TestJstatdPortAndServer { +--- ./jdk/test/sun/tools/jstatd/TestJstatdServer.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/jstatd/TestJstatdServer.java Wed Jul 30 18:42:59 2014 +0100 +@@ -25,7 +25,7 @@ + * @test + * @bug 4990825 + * @library /lib/testlibrary +- * @build JstatdTest JstatGCUtilParser ++ * @build jdk.testlibrary.* JstatdTest JstatGCUtilParser + * @run main/timeout=60 TestJstatdServer + */ + public class TestJstatdServer { +--- ./jdk/test/sun/tools/jstatd/TestJstatdUsage.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/jstatd/TestJstatdUsage.java Wed Jul 30 18:42:59 2014 +0100 +@@ -28,7 +28,7 @@ + * @test + * @bug 4990825 + * @library /lib/testlibrary +- * @build jdk.testlibrary.JDKToolLauncher jdk.testlibrary.OutputAnalyzer ++ * @build jdk.testlibrary.* + * @run main TestJstatdUsage + */ + public class TestJstatdUsage { +--- ./jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh Wed Jul 30 18:42:59 2014 +0100 +@@ -56,7 +56,7 @@ + + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin ) ++ SunOS | Linux | Darwin | AIX ) + PATHSEP=":" + ;; + +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=Central Summer Time (Northern Territory) +-ACT.generic.long=Central Time (Northern Territory) +-ACT.standard.long=Central Standard Time (Northern Territory) +-AET.daylight.long=Eastern Summer Time (New South Wales) +-AET.generic.long=Eastern Time (New South Wales) +-AET.standard.long=Eastern Standard Time (New South Wales) +-AGT.generic.long=Argentine Time +-ART.generic.long=Eastern European Time +-AST.generic.long=Alaska Time +-Africa/Abidjan.generic.long=Greenwich Mean Time +-Africa/Accra.generic.long=Ghana Mean Time +-Africa/Addis_Ababa.generic.long=Eastern Africa Time +-Africa/Algiers.generic.long=Central European Time +-Africa/Asmara.generic.long=Eastern Africa Time +-Africa/Asmera.generic.long=Eastern Africa Time +-Africa/Bamako.generic.long=Greenwich Mean Time +-Africa/Bangui.generic.long=Western African Time +-Africa/Banjul.generic.long=Greenwich Mean Time +-Africa/Bissau.generic.long=Greenwich Mean Time +-Africa/Blantyre.generic.long=Central Africa Time +-Africa/Brazzaville.generic.long=Western African Time +-Africa/Bujumbura.generic.long=Central Africa Time +-Africa/Cairo.generic.long=Eastern European Time +-Africa/Casablanca.generic.long=Western European Time +-Africa/Ceuta.generic.long=Central European Time +-Africa/Conakry.generic.long=Greenwich Mean Time +-Africa/Dakar.generic.long=Greenwich Mean Time +-Africa/Dar_es_Salaam.generic.long=Eastern Africa Time +-Africa/Djibouti.generic.long=Eastern Africa Time +-Africa/Douala.generic.long=Western African Time +-Africa/El_Aaiun.generic.long=Western European Time +-Africa/Freetown.generic.long=Sierra Leone Time +-Africa/Gaborone.generic.long=Central Africa Time +-Africa/Harare.generic.long=Central Africa Time +-Africa/Johannesburg.generic.long=South Africa Time +-Africa/Juba.generic.long=Eastern Africa Time +-Africa/Kampala.generic.long=Eastern Africa Time +-Africa/Khartoum.generic.long=Eastern Africa Time +-Africa/Kigali.generic.long=Central Africa Time +-Africa/Kinshasa.generic.long=Western African Time +-Africa/Lagos.generic.long=Western African Time +-Africa/Libreville.generic.long=Western African Time +-Africa/Lome.generic.long=Greenwich Mean Time +-Africa/Luanda.generic.long=Western African Time +-Africa/Lubumbashi.generic.long=Central Africa Time +-Africa/Lusaka.generic.long=Central Africa Time +-Africa/Malabo.generic.long=Western African Time +-Africa/Maputo.generic.long=Central Africa Time +-Africa/Maseru.generic.long=South Africa Time +-Africa/Mbabane.generic.long=South Africa Time +-Africa/Mogadishu.generic.long=Eastern Africa Time +-Africa/Monrovia.generic.long=Greenwich Mean Time +-Africa/Nairobi.generic.long=Eastern Africa Time +-Africa/Ndjamena.generic.long=Western African Time +-Africa/Niamey.generic.long=Western African Time +-Africa/Nouakchott.generic.long=Greenwich Mean Time +-Africa/Ouagadougou.generic.long=Greenwich Mean Time +-Africa/Porto-Novo.generic.long=Western African Time +-Africa/Sao_Tome.generic.long=Greenwich Mean Time +-Africa/Timbuktu.generic.long=Greenwich Mean Time +-Africa/Tripoli.generic.long=Eastern European Time +-Africa/Tunis.generic.long=Central European Time +-Africa/Windhoek.generic.long=Western African Time +-America/Adak.generic.long=Hawaii-Aleutian Time +-America/Anchorage.generic.long=Alaska Time +-America/Anguilla.generic.long=Atlantic Time +-America/Antigua.generic.long=Atlantic Time +-America/Araguaina.generic.long=Brasilia Time +-America/Argentina/Buenos_Aires.generic.long=Argentine Time +-America/Argentina/Catamarca.generic.long=Argentine Time +-America/Argentina/ComodRivadavia.generic.long=Argentine Time +-America/Argentina/Cordoba.generic.long=Argentine Time +-America/Argentina/Jujuy.generic.long=Argentine Time +-America/Argentina/La_Rioja.generic.long=Argentine Time +-America/Argentina/Mendoza.generic.long=Argentine Time +-America/Argentina/Rio_Gallegos.generic.long=Argentine Time +-America/Argentina/Salta.generic.long=Argentine Time +-America/Argentina/San_Juan.generic.long=Argentine Time +-America/Argentina/San_Luis.generic.long=Argentine Time +-America/Argentina/Tucuman.generic.long=Argentine Time +-America/Argentina/Ushuaia.generic.long=Argentine Time +-America/Aruba.generic.long=Atlantic Time +-America/Asuncion.generic.long=Paraguay Time +-America/Atikokan.generic.long=Eastern Time +-America/Atka.generic.long=Hawaii-Aleutian Time +-America/Bahia.generic.long=Brasilia Time +-America/Bahia_Banderas.generic.long=Central Time +-America/Barbados.generic.long=Atlantic Time +-America/Belem.generic.long=Brasilia Time +-America/Belize.generic.long=Central Time +-America/Blanc-Sablon.generic.long=Atlantic Time +-America/Boa_Vista.generic.long=Amazon Time +-America/Bogota.generic.long=Colombia Time +-America/Boise.generic.long=Mountain Time +-America/Buenos_Aires.generic.long=Argentine Time +-America/Cambridge_Bay.generic.long=Mountain Time +-America/Campo_Grande.generic.long=Amazon Time +-America/Cancun.generic.long=Central Time +-America/Caracas.generic.long=Venezuela Time +-America/Catamarca.generic.long=Argentine Time +-America/Cayenne.generic.long=French Guiana Time +-America/Cayman.generic.long=Eastern Time +-America/Chicago.generic.long=Central Time +-America/Chihuahua.generic.long=Mountain Time +-America/Coral_Harbour.generic.long=Eastern Time +-America/Cordoba.generic.long=Argentine Time +-America/Costa_Rica.generic.long=Central Time +-America/Creston.generic.long=Mountain Time +-America/Cuiaba.generic.long=Amazon Time +-America/Curacao.generic.long=Atlantic Time +-America/Danmarkshavn.generic.long=Greenwich Mean Time +-America/Dawson.generic.long=Pacific Time +-America/Dawson_Creek.generic.long=Mountain Time +-America/Denver.generic.long=Mountain Time +-America/Detroit.generic.long=Eastern Time +-America/Dominica.generic.long=Atlantic Time +-America/Edmonton.generic.long=Mountain Time +-America/Eirunepe.generic.long=Acre Time +-America/El_Salvador.generic.long=Central Time +-America/Ensenada.generic.long=Pacific Time +-America/Fort_Wayne.generic.long=Eastern Time +-America/Fortaleza.generic.long=Brasilia Time +-America/Glace_Bay.generic.long=Atlantic Time +-America/Godthab.generic.long=Western Greenland Time +-America/Goose_Bay.generic.long=Atlantic Time +-America/Grand_Turk.generic.long=Eastern Time +-America/Grenada.generic.long=Atlantic Time +-America/Guadeloupe.generic.long=Atlantic Time +-America/Guatemala.generic.long=Central Time +-America/Guayaquil.generic.long=Ecuador Time +-America/Guyana.generic.long=Guyana Time +-America/Halifax.generic.long=Atlantic Time +-America/Havana.generic.long=Cuba Time +-America/Hermosillo.generic.long=Mountain Time +-America/Indiana/Indianapolis.generic.long=Eastern Time +-America/Indiana/Knox.generic.long=Central Time +-America/Indiana/Marengo.generic.long=Eastern Time +-America/Indiana/Petersburg.generic.long=Eastern Time +-America/Indiana/Tell_City.generic.long=Central Time +-America/Indiana/Vevay.generic.long=Eastern Time +-America/Indiana/Vincennes.generic.long=Eastern Time +-America/Indiana/Winamac.generic.long=Eastern Time +-America/Indianapolis.generic.long=Eastern Time +-America/Inuvik.generic.long=Mountain Time +-America/Iqaluit.generic.long=Eastern Time +-America/Jamaica.generic.long=Eastern Time +-America/Jujuy.generic.long=Argentine Time +-America/Juneau.generic.long=Alaska Time +-America/Kentucky/Louisville.generic.long=Eastern Time +-America/Kentucky/Monticello.generic.long=Eastern Time +-America/Knox_IN.generic.long=Central Time +-America/Kralendijk.generic.long=Atlantic Time +-America/La_Paz.generic.long=Bolivia Time +-America/Lima.generic.long=Peru Time +-America/Los_Angeles.generic.long=Pacific Time +-America/Louisville.generic.long=Eastern Time +-America/Lower_Princes.generic.long=Atlantic Time +-America/Maceio.generic.long=Brasilia Time +-America/Managua.generic.long=Central Time +-America/Manaus.generic.long=Amazon Time +-America/Marigot.generic.long=Atlantic Time +-America/Martinique.generic.long=Atlantic Time +-America/Matamoros.generic.long=Central Time +-America/Mazatlan.generic.long=Mountain Time +-America/Mendoza.generic.long=Argentine Time +-America/Menominee.generic.long=Central Time +-America/Merida.generic.long=Central Time +-America/Metlakatla.daylight.long=Metlakatla Daylight Time +-America/Metlakatla.generic.long=Metlakatla Time +-America/Metlakatla.standard.long=Metlakatla Standard Time +-America/Mexico_City.generic.long=Central Time +-America/Miquelon.generic.long=Pierre & Miquelon Time +-America/Moncton.generic.long=Atlantic Time +-America/Monterrey.generic.long=Central Time +-America/Montevideo.generic.long=Uruguay Time +-America/Montreal.generic.long=Eastern Time +-America/Montserrat.generic.long=Atlantic Time +-America/Nassau.generic.long=Eastern Time +-America/New_York.generic.long=Eastern Time +-America/Nipigon.generic.long=Eastern Time +-America/Nome.generic.long=Alaska Time +-America/Noronha.generic.long=Fernando de Noronha Time +-America/North_Dakota/Beulah.generic.long=Central Time +-America/North_Dakota/Center.generic.long=Central Time +-America/North_Dakota/New_Salem.generic.long=Central Time +-America/Ojinaga.generic.long=Mountain Time +-America/Panama.generic.long=Eastern Time +-America/Pangnirtung.generic.long=Eastern Time +-America/Paramaribo.generic.long=Suriname Time +-America/Phoenix.generic.long=Mountain Time +-America/Port-au-Prince.generic.long=Eastern Time +-America/Port_of_Spain.generic.long=Atlantic Time +-America/Porto_Acre.generic.long=Acre Time +-America/Porto_Velho.generic.long=Amazon Time +-America/Puerto_Rico.generic.long=Atlantic Time +-America/Rainy_River.generic.long=Central Time +-America/Rankin_Inlet.generic.long=Central Time +-America/Recife.generic.long=Brasilia Time +-America/Regina.generic.long=Central Time +-America/Resolute.generic.long=Central Time +-America/Rio_Branco.generic.long=Acre Time +-America/Rosario.generic.long=Argentine Time +-America/Santa_Isabel.generic.long=Pacific Time +-America/Santarem.generic.long=Brasilia Time +-America/Santiago.generic.long=Chile Time +-America/Santo_Domingo.generic.long=Atlantic Time +-America/Sao_Paulo.generic.long=Brasilia Time +-America/Scoresbysund.generic.long=Eastern Greenland Time +-America/Shiprock.generic.long=Mountain Time +-America/Sitka.generic.long=Alaska Time +-America/St_Barthelemy.generic.long=Atlantic Time +-America/St_Johns.generic.long=Newfoundland Time +-America/St_Kitts.generic.long=Atlantic Time +-America/St_Lucia.generic.long=Atlantic Time +-America/St_Thomas.generic.long=Atlantic Time +-America/St_Vincent.generic.long=Atlantic Time +-America/Swift_Current.generic.long=Central Time +-America/Tegucigalpa.generic.long=Central Time +-America/Thule.generic.long=Atlantic Time +-America/Thunder_Bay.generic.long=Eastern Time +-America/Tijuana.generic.long=Pacific Time +-America/Toronto.generic.long=Eastern Time +-America/Tortola.generic.long=Atlantic Time +-America/Vancouver.generic.long=Pacific Time +-America/Virgin.generic.long=Atlantic Time +-America/Whitehorse.generic.long=Pacific Time +-America/Winnipeg.generic.long=Central Time +-America/Yakutat.generic.long=Alaska Time +-America/Yellowknife.generic.long=Mountain Time +-Antarctica/Casey.daylight.long=Western Summer Time (Australia) +-Antarctica/Casey.generic.long=Western Time (Australia) +-Antarctica/Casey.standard.long=Western Standard Time (Australia) +-Antarctica/Davis.generic.long=Davis Time +-Antarctica/DumontDUrville.generic.long=Dumont-d'Urville Time +-Antarctica/Macquarie.daylight.long=Macquarie Island Summer Time +-Antarctica/Macquarie.generic.long=Macquarie Island Time +-Antarctica/Macquarie.standard.long=Macquarie Island Time +-Antarctica/Mawson.generic.long=Mawson Time +-Antarctica/McMurdo.generic.long=New Zealand Time +-Antarctica/Palmer.generic.long=Chile Time +-Antarctica/Rothera.generic.long=Rothera Time +-Antarctica/South_Pole.generic.long=New Zealand Time +-Antarctica/Syowa.generic.long=Syowa Time +-Antarctica/Vostok.generic.long=Vostok Time +-Arctic/Longyearbyen.generic.long=Central European Time +-Asia/Aden.generic.long=Arabia Time +-Asia/Almaty.generic.long=Alma-Ata Time +-Asia/Amman.generic.long=Arabia Time +-Asia/Anadyr.generic.long=Anadyr Time +-Asia/Aqtau.generic.long=Aqtau Time +-Asia/Aqtobe.generic.long=Aqtobe Time +-Asia/Ashgabat.generic.long=Turkmenistan Time +-Asia/Ashkhabad.generic.long=Turkmenistan Time +-Asia/Baghdad.generic.long=Arabia Time +-Asia/Bahrain.generic.long=Arabia Time +-Asia/Baku.generic.long=Azerbaijan Time +-Asia/Bangkok.generic.long=Indochina Time +-Asia/Beirut.generic.long=Eastern European Time +-Asia/Bishkek.generic.long=Kirgizstan Time +-Asia/Brunei.generic.long=Brunei Time +-Asia/Calcutta.generic.long=India Time +-Asia/Choibalsan.generic.long=Choibalsan Time +-Asia/Chongqing.generic.long=China Time +-Asia/Chungking.generic.long=China Time +-Asia/Colombo.generic.long=India Time +-Asia/Dacca.generic.long=Bangladesh Time +-Asia/Damascus.generic.long=Eastern European Time +-Asia/Dhaka.generic.long=Bangladesh Time +-Asia/Dili.generic.long=Timor-Leste Time +-Asia/Dubai.generic.long=Gulf Time +-Asia/Dushanbe.generic.long=Tajikistan Time +-Asia/Gaza.generic.long=Eastern European Time +-Asia/Harbin.generic.long=China Time +-Asia/Hebron.generic.long=Eastern European Time +-Asia/Ho_Chi_Minh.generic.long=Indochina Time +-Asia/Hong_Kong.generic.long=Hong Kong Time +-Asia/Hovd.generic.long=Hovd Time +-Asia/Irkutsk.generic.long=Irkutsk Time +-Asia/Istanbul.generic.long=Eastern European Time +-Asia/Jakarta.generic.long=West Indonesia Time +-Asia/Jayapura.generic.long=East Indonesia Time +-Asia/Jerusalem.generic.long=Israel Time +-Asia/Kabul.generic.long=Afghanistan Time +-Asia/Kamchatka.generic.long=Petropavlovsk-Kamchatski Time +-Asia/Karachi.generic.long=Pakistan Time +-Asia/Kashgar.generic.long=China Time +-Asia/Kathmandu.generic.long=Nepal Time +-Asia/Katmandu.generic.long=Nepal Time +-Asia/Khandyga.daylight.long=Khandyga Summer Time +-Asia/Khandyga.generic.long=Khandyga Time +-Asia/Khandyga.standard.long=Khandyga Time +-Asia/Kolkata.generic.long=India Time +-Asia/Krasnoyarsk.generic.long=Krasnoyarsk Time +-Asia/Kuala_Lumpur.generic.long=Malaysia Time +-Asia/Kuching.generic.long=Malaysia Time +-Asia/Kuwait.generic.long=Arabia Time +-Asia/Macao.generic.long=China Time +-Asia/Macau.generic.long=China Time +-Asia/Magadan.generic.long=Magadan Time +-Asia/Makassar.generic.long=Central Indonesia Time +-Asia/Manila.generic.long=Philippines Time +-Asia/Muscat.generic.long=Gulf Time +-Asia/Nicosia.generic.long=Eastern European Time +-Asia/Novokuznetsk.generic.long=Novosibirsk Time +-Asia/Novosibirsk.generic.long=Novosibirsk Time +-Asia/Omsk.generic.long=Omsk Time +-Asia/Oral.generic.long=Oral Time +-Asia/Phnom_Penh.generic.long=Indochina Time +-Asia/Pontianak.generic.long=West Indonesia Time +-Asia/Pyongyang.generic.long=Korea Time +-Asia/Qatar.generic.long=Arabia Time +-Asia/Qyzylorda.generic.long=Qyzylorda Time +-Asia/Rangoon.generic.long=Myanmar Time +-Asia/Saigon.generic.long=Indochina Time +-Asia/Sakhalin.generic.long=Sakhalin Time +-Asia/Samarkand.generic.long=Uzbekistan Time +-Asia/Seoul.generic.long=Korea Time +-Asia/Shanghai.generic.long=China Time +-Asia/Singapore.generic.long=Singapore Time +-Asia/Taipei.generic.long=China Time +-Asia/Tashkent.generic.long=Uzbekistan Time +-Asia/Tbilisi.generic.long=Georgia Time +-Asia/Tehran.generic.long=Iran Time +-Asia/Tel_Aviv.generic.long=Israel Time +-Asia/Thimbu.generic.long=Bhutan Time +-Asia/Thimphu.generic.long=Bhutan Time +-Asia/Tokyo.generic.long=Japan Time +-Asia/Ujung_Pandang.generic.long=Central Indonesia Time +-Asia/Ulaanbaatar.generic.long=Ulaanbaatar Time +-Asia/Ulan_Bator.generic.long=Ulaanbaatar Time +-Asia/Urumqi.generic.long=China Time +-Asia/Ust-Nera.daylight.long=Ust-Nera Summer Time +-Asia/Ust-Nera.generic.long=Ust-Nera Time +-Asia/Ust-Nera.standard.long=Ust-Nera Time +-Asia/Vientiane.generic.long=Indochina Time +-Asia/Vladivostok.generic.long=Vladivostok Time +-Asia/Yakutsk.generic.long=Yakutsk Time +-Asia/Yekaterinburg.generic.long=Yekaterinburg Time +-Asia/Yerevan.generic.long=Armenia Time +-Atlantic/Azores.generic.long=Azores Time +-Atlantic/Bermuda.generic.long=Atlantic Time +-Atlantic/Canary.generic.long=Western European Time +-Atlantic/Cape_Verde.generic.long=Cape Verde Time +-Atlantic/Faeroe.generic.long=Western European Time +-Atlantic/Faroe.generic.long=Western European Time +-Atlantic/Jan_Mayen.generic.long=Central European Time +-Atlantic/Madeira.generic.long=Western European Time +-Atlantic/Reykjavik.generic.long=Greenwich Mean Time +-Atlantic/South_Georgia.generic.long=South Georgia Time +-Atlantic/St_Helena.generic.long=Greenwich Mean Time +-Atlantic/Stanley.generic.long=Falkland Is. Time +-Australia/ACT.daylight.long=Eastern Summer Time (New South Wales) +-Australia/ACT.generic.long=Eastern Time (New South Wales) +-Australia/ACT.standard.long=Eastern Standard Time (New South Wales) +-Australia/Adelaide.daylight.long=Central Summer Time (South Australia) +-Australia/Adelaide.generic.long=Central Time (South Australia) +-Australia/Adelaide.standard.long=Central Standard Time (South Australia) +-Australia/Brisbane.daylight.long=Eastern Summer Time (Queensland) +-Australia/Brisbane.generic.long=Eastern Time (Queensland) +-Australia/Brisbane.standard.long=Eastern Standard Time (Queensland) +-Australia/Broken_Hill.daylight.long=Central Summer Time (South Australia/New South Wales) +-Australia/Broken_Hill.generic.long=Central Time (South Australia/New South Wales) +-Australia/Broken_Hill.standard.long=Central Standard Time (South Australia/New South Wales) +-Australia/Canberra.daylight.long=Eastern Summer Time (New South Wales) +-Australia/Canberra.generic.long=Eastern Time (New South Wales) +-Australia/Canberra.standard.long=Eastern Standard Time (New South Wales) +-Australia/Currie.daylight.long=Eastern Summer Time (New South Wales) +-Australia/Currie.generic.long=Eastern Time (New South Wales) +-Australia/Currie.standard.long=Eastern Standard Time (New South Wales) +-Australia/Darwin.daylight.long=Central Summer Time (Northern Territory) +-Australia/Darwin.generic.long=Central Time (Northern Territory) +-Australia/Darwin.standard.long=Central Standard Time (Northern Territory) +-Australia/Eucla.daylight.long=Central Western Summer Time (Australia) +-Australia/Eucla.generic.long=Central Western Time (Australia) +-Australia/Eucla.standard.long=Central Western Standard Time (Australia) +-Australia/Hobart.daylight.long=Eastern Summer Time (Tasmania) +-Australia/Hobart.generic.long=Eastern Time (Tasmania) +-Australia/Hobart.standard.long=Eastern Standard Time (Tasmania) +-Australia/LHI.generic.long=Lord Howe Time +-Australia/Lindeman.daylight.long=Eastern Summer Time (Queensland) +-Australia/Lindeman.generic.long=Eastern Time (Queensland) +-Australia/Lindeman.standard.long=Eastern Standard Time (Queensland) +-Australia/Lord_Howe.generic.long=Lord Howe Time +-Australia/Melbourne.daylight.long=Eastern Summer Time (Victoria) +-Australia/Melbourne.generic.long=Eastern Time (Victoria) +-Australia/Melbourne.standard.long=Eastern Standard Time (Victoria) +-Australia/NSW.daylight.long=Eastern Summer Time (New South Wales) +-Australia/NSW.generic.long=Eastern Time (New South Wales) +-Australia/NSW.standard.long=Eastern Standard Time (New South Wales) +-Australia/North.daylight.long=Central Summer Time (Northern Territory) +-Australia/North.generic.long=Central Time (Northern Territory) +-Australia/North.standard.long=Central Standard Time (Northern Territory) +-Australia/Perth.daylight.long=Western Summer Time (Australia) +-Australia/Perth.generic.long=Western Time (Australia) +-Australia/Perth.standard.long=Western Standard Time (Australia) +-Australia/Queensland.daylight.long=Eastern Summer Time (Queensland) +-Australia/Queensland.generic.long=Eastern Time (Queensland) +-Australia/Queensland.standard.long=Eastern Standard Time (Queensland) +-Australia/South.daylight.long=Central Summer Time (South Australia) +-Australia/South.generic.long=Central Time (South Australia) +-Australia/South.standard.long=Central Standard Time (South Australia) +-Australia/Sydney.daylight.long=Eastern Summer Time (New South Wales) +-Australia/Sydney.generic.long=Eastern Time (New South Wales) +-Australia/Sydney.standard.long=Eastern Standard Time (New South Wales) +-Australia/Tasmania.daylight.long=Eastern Summer Time (Tasmania) +-Australia/Tasmania.generic.long=Eastern Time (Tasmania) +-Australia/Tasmania.standard.long=Eastern Standard Time (Tasmania) +-Australia/Victoria.daylight.long=Eastern Summer Time (Victoria) +-Australia/Victoria.generic.long=Eastern Time (Victoria) +-Australia/Victoria.standard.long=Eastern Standard Time (Victoria) +-Australia/West.daylight.long=Western Summer Time (Australia) +-Australia/West.generic.long=Western Time (Australia) +-Australia/West.standard.long=Western Standard Time (Australia) +-Australia/Yancowinna.daylight.long=Central Summer Time (South Australia/New South Wales) +-Australia/Yancowinna.generic.long=Central Time (South Australia/New South Wales) +-Australia/Yancowinna.standard.long=Central Standard Time (South Australia/New South Wales) +-BET.generic.long=Brasilia Time +-BST.generic.long=Bangladesh Time +-Brazil/Acre.generic.long=Acre Time +-Brazil/DeNoronha.generic.long=Fernando de Noronha Time +-Brazil/East.generic.long=Brasilia Time +-Brazil/West.generic.long=Amazon Time +-CAT.generic.long=Central Africa Time +-CET.generic.long=Central European Time +-CNT.generic.long=Newfoundland Time +-CST.generic.long=Central Time +-CST6CDT.generic.long=Central Time +-CTT.generic.long=China Time +-Canada/Atlantic.generic.long=Atlantic Time +-Canada/Central.generic.long=Central Time +-Canada/East-Saskatchewan.generic.long=Central Time +-Canada/Eastern.generic.long=Eastern Time +-Canada/Mountain.generic.long=Mountain Time +-Canada/Newfoundland.generic.long=Newfoundland Time +-Canada/Pacific.generic.long=Pacific Time +-Canada/Saskatchewan.generic.long=Central Time +-Canada/Yukon.generic.long=Pacific Time +-Chile/Continental.generic.long=Chile Time +-Chile/EasterIsland.generic.long=Easter Is. Time +-Cuba.generic.long=Cuba Time +-EAT.generic.long=Eastern Africa Time +-ECT.generic.long=Central European Time +-EET.generic.long=Eastern European Time +-EST.generic.long=Eastern Time +-EST5EDT.generic.long=Eastern Time +-Egypt.generic.long=Eastern European Time +-Eire.generic.long=Irish Time +-Etc/Greenwich.generic.long=Greenwich Mean Time +-Etc/UCT.generic.long=Coordinated Universal Time +-Etc/UTC.generic.long=Coordinated Universal Time +-Etc/Universal.generic.long=Coordinated Universal Time +-Etc/Zulu.generic.long=Coordinated Universal Time +-Europe/Amsterdam.generic.long=Central European Time +-Europe/Andorra.generic.long=Central European Time +-Europe/Athens.generic.long=Eastern European Time +-Europe/Belfast.generic.long=British Time +-Europe/Belgrade.generic.long=Central European Time +-Europe/Berlin.generic.long=Central European Time +-Europe/Bratislava.generic.long=Central European Time +-Europe/Brussels.generic.long=Central European Time +-Europe/Bucharest.generic.long=Eastern European Time +-Europe/Budapest.generic.long=Central European Time +-Europe/Busingen.generic.long=Central European Time +-Europe/Chisinau.generic.long=Eastern European Time +-Europe/Copenhagen.generic.long=Central European Time +-Europe/Dublin.generic.long=Irish Time +-Europe/Gibraltar.generic.long=Central European Time +-Europe/Guernsey.generic.long=British Time +-Europe/Helsinki.generic.long=Eastern European Time +-Europe/Isle_of_Man.generic.long=British Time +-Europe/Istanbul.generic.long=Eastern European Time +-Europe/Jersey.generic.long=British Time +-Europe/Kaliningrad.daylight.long=Further-eastern European Summer Time +-Europe/Kaliningrad.generic.long=Further-eastern European Time +-Europe/Kaliningrad.standard.long=Further-eastern European Time +-Europe/Kiev.generic.long=Eastern European Time +-Europe/Lisbon.generic.long=Western European Time +-Europe/Ljubljana.generic.long=Central European Time +-Europe/London.generic.long=British Time +-Europe/Luxembourg.generic.long=Central European Time +-Europe/Madrid.generic.long=Central European Time +-Europe/Malta.generic.long=Central European Time +-Europe/Mariehamn.generic.long=Eastern European Time +-Europe/Minsk.daylight.long=Further-eastern European Summer Time +-Europe/Minsk.generic.long=Further-eastern European Time +-Europe/Minsk.standard.long=Further-eastern European Time +-Europe/Monaco.generic.long=Central European Time +-Europe/Moscow.generic.long=Moscow Time +-Europe/Nicosia.generic.long=Eastern European Time +-Europe/Oslo.generic.long=Central European Time +-Europe/Paris.generic.long=Central European Time +-Europe/Podgorica.generic.long=Central European Time +-Europe/Prague.generic.long=Central European Time +-Europe/Riga.generic.long=Eastern European Time +-Europe/Rome.generic.long=Central European Time +-Europe/Samara.generic.long=Samara Time +-Europe/San_Marino.generic.long=Central European Time +-Europe/Sarajevo.generic.long=Central European Time +-Europe/Simferopol.generic.long=Eastern European Time +-Europe/Skopje.generic.long=Central European Time +-Europe/Sofia.generic.long=Eastern European Time +-Europe/Stockholm.generic.long=Central European Time +-Europe/Tallinn.generic.long=Eastern European Time +-Europe/Tirane.generic.long=Central European Time +-Europe/Tiraspol.generic.long=Eastern European Time +-Europe/Uzhgorod.generic.long=Eastern European Time +-Europe/Vaduz.generic.long=Central European Time +-Europe/Vatican.generic.long=Central European Time +-Europe/Vienna.generic.long=Central European Time +-Europe/Vilnius.generic.long=Eastern European Time +-Europe/Volgograd.generic.long=Volgograd Time +-Europe/Warsaw.generic.long=Central European Time +-Europe/Zagreb.generic.long=Central European Time +-Europe/Zaporozhye.generic.long=Eastern European Time +-Europe/Zurich.generic.long=Central European Time +-GB-Eire.generic.long=British Time +-GB.generic.long=British Time +-GMT.generic.long=Greenwich Mean Time +-Greenwich.generic.long=Greenwich Mean Time +-HST.generic.long=Hawaii Time +-Hongkong.generic.long=Hong Kong Time +-IET.generic.long=Eastern Time +-IST.generic.long=India Time +-Iceland.generic.long=Greenwich Mean Time +-Indian/Antananarivo.generic.long=Eastern Africa Time +-Indian/Chagos.generic.long=Indian Ocean Territory Time +-Indian/Christmas.generic.long=Christmas Island Time +-Indian/Cocos.generic.long=Cocos Islands Time +-Indian/Comoro.generic.long=Eastern Africa Time +-Indian/Kerguelen.generic.long=French Southern & Antarctic Lands Time +-Indian/Mahe.generic.long=Seychelles Time +-Indian/Maldives.generic.long=Maldives Time +-Indian/Mauritius.generic.long=Mauritius Time +-Indian/Mayotte.generic.long=Eastern Africa Time +-Indian/Reunion.generic.long=Reunion Time +-Iran.generic.long=Iran Time +-Israel.generic.long=Israel Time +-JST.generic.long=Japan Time +-Jamaica.generic.long=Eastern Time +-Japan.generic.long=Japan Time +-Kwajalein.generic.long=Marshall Islands Time +-Libya.generic.long=Eastern European Time +-MET.generic.long=Middle Europe Time +-MIT.generic.long=West Samoa Time +-MST.generic.long=Mountain Time +-MST7MDT.generic.long=Mountain Time +-Mexico/BajaNorte.generic.long=Pacific Time +-Mexico/BajaSur.generic.long=Mountain Time +-Mexico/General.generic.long=Central Time +-NET.generic.long=Armenia Time +-NST.generic.long=New Zealand Time +-NZ-CHAT.generic.long=Chatham Time +-NZ.generic.long=New Zealand Time +-Navajo.generic.long=Mountain Time +-PLT.generic.long=Pakistan Time +-PNT.generic.long=Mountain Time +-PRC.generic.long=China Time +-PRT.generic.long=Atlantic Time +-PST.generic.long=Pacific Time +-PST8PDT.generic.long=Pacific Time +-Pacific/Apia.generic.long=West Samoa Time +-Pacific/Auckland.generic.long=New Zealand Time +-Pacific/Chatham.generic.long=Chatham Time +-Pacific/Chuuk.daylight.long=Chuuk Summer Time +-Pacific/Chuuk.generic.long=Chuuk Time +-Pacific/Chuuk.standard.long=Chuuk Time +-Pacific/Easter.generic.long=Easter Is. Time +-Pacific/Efate.generic.long=Vanuatu Time +-Pacific/Enderbury.generic.long=Phoenix Is. Time +-Pacific/Fakaofo.generic.long=Tokelau Time +-Pacific/Fiji.generic.long=Fiji Time +-Pacific/Funafuti.generic.long=Tuvalu Time +-Pacific/Galapagos.generic.long=Galapagos Time +-Pacific/Gambier.generic.long=Gambier Time +-Pacific/Guadalcanal.generic.long=Solomon Is. Time +-Pacific/Guam.generic.long=Chamorro Time +-Pacific/Honolulu.generic.long=Hawaii Time +-Pacific/Johnston.generic.long=Hawaii Time +-Pacific/Kiritimati.generic.long=Line Is. Time +-Pacific/Kosrae.generic.long=Kosrae Time +-Pacific/Kwajalein.generic.long=Marshall Islands Time +-Pacific/Majuro.generic.long=Marshall Islands Time +-Pacific/Marquesas.generic.long=Marquesas Time +-Pacific/Midway.generic.long=Samoa Time +-Pacific/Nauru.generic.long=Nauru Time +-Pacific/Niue.generic.long=Niue Time +-Pacific/Norfolk.generic.long=Norfolk Time +-Pacific/Noumea.generic.long=New Caledonia Time +-Pacific/Pago_Pago.generic.long=Samoa Time +-Pacific/Palau.generic.long=Palau Time +-Pacific/Pitcairn.generic.long=Pitcairn Time +-Pacific/Pohnpei.daylight.long=Pohnpei Summer Time +-Pacific/Pohnpei.generic.long=Ponape Time +-Pacific/Pohnpei.standard.long=Pohnpei Time +-Pacific/Ponape.daylight.long=Pohnpei Summer Time +-Pacific/Ponape.generic.long=Ponape Time +-Pacific/Ponape.standard.long=Pohnpei Time +-Pacific/Port_Moresby.generic.long=Papua New Guinea Time +-Pacific/Rarotonga.generic.long=Cook Is. Time +-Pacific/Saipan.generic.long=Chamorro Time +-Pacific/Samoa.generic.long=Samoa Time +-Pacific/Tahiti.generic.long=Tahiti Time +-Pacific/Tarawa.generic.long=Gilbert Is. Time +-Pacific/Tongatapu.generic.long=Tonga Time +-Pacific/Truk.daylight.long=Chuuk Summer Time +-Pacific/Truk.generic.long=Chuuk Time +-Pacific/Truk.standard.long=Chuuk Time +-Pacific/Wake.generic.long=Wake Time +-Pacific/Wallis.generic.long=Wallis & Futuna Time +-Pacific/Yap.daylight.long=Chuuk Summer Time +-Pacific/Yap.generic.long=Chuuk Time +-Pacific/Yap.standard.long=Chuuk Time +-Poland.generic.long=Central European Time +-Portugal.generic.long=Western European Time +-ROK.generic.long=Korea Time +-SST.generic.long=Solomon Is. Time +-Singapore.generic.long=Singapore Time +-SystemV/AST4.generic.long=Atlantic Time +-SystemV/AST4ADT.generic.long=Atlantic Time +-SystemV/CST6.generic.long=Central Time +-SystemV/CST6CDT.generic.long=Central Time +-SystemV/EST5.generic.long=Eastern Time +-SystemV/EST5EDT.generic.long=Eastern Time +-SystemV/HST10.generic.long=Hawaii Time +-SystemV/MST7.generic.long=Mountain Time +-SystemV/MST7MDT.generic.long=Mountain Time +-SystemV/PST8.generic.long=Pacific Time +-SystemV/PST8PDT.generic.long=Pacific Time +-SystemV/YST9.generic.long=Alaska Time +-SystemV/YST9YDT.generic.long=Alaska Time +-Turkey.generic.long=Eastern European Time +-UCT.generic.long=Coordinated Universal Time +-US/Alaska.generic.long=Alaska Time +-US/Aleutian.generic.long=Hawaii-Aleutian Time +-US/Arizona.generic.long=Mountain Time +-US/Central.generic.long=Central Time +-US/East-Indiana.generic.long=Eastern Time +-US/Eastern.generic.long=Eastern Time +-US/Hawaii.generic.long=Hawaii Time +-US/Indiana-Starke.generic.long=Central Time +-US/Michigan.generic.long=Eastern Time +-US/Mountain.generic.long=Mountain Time +-US/Pacific-New.generic.long=Pacific Time +-US/Pacific.generic.long=Pacific Time +-US/Samoa.generic.long=Samoa Time +-UTC.generic.long=Coordinated Universal Time +-Universal.generic.long=Coordinated Universal Time +-VST.generic.long=Indochina Time +-W-SU.generic.long=Moscow Time +-WET.generic.long=Western European Time +-Zulu.generic.long=Coordinated Universal Time +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNamesTest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNamesTest.java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,186 +0,0 @@ +-/* +- * Copyright (c) 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. +- */ +- +-/** +- * @test +- * @bug 8025051 +- * @summary Test time zone names across all locales +- * @run main TimeZoneNamesTest +- */ +- +-import sun.util.locale.provider.TimeZoneNameUtility; +-import java.util.TimeZone; +-import java.util.Locale; +-import java.util.Properties; +-import java.io.IOException; +-import java.io.FileInputStream; +- +-public class TimeZoneNamesTest { +- // name type to test. Possible: long, short. +- static String requestedTestType = "long"; +- // test Standard/DST (false) or Generic (true) TZ names +- static boolean testGeneric = false; +- +- public static void testGenericTZName( Locale locale, String timezoneName, +- int nameType, String expectedName ) throws RuntimeException { +- if (testGeneric) { +- String genericName = TimeZoneNameUtility.retrieveGenericDisplayName(timezoneName, nameType, locale); +- //Check for equality +- if (!genericName.equals(expectedName)) +- throw new RuntimeException( "Time zone ("+timezoneName+") name is incorrect for locale \""+locale.getDisplayName() +- +"\" nameType: Generic"+"("+nameType+") Should be: " +expectedName+" Observed: "+genericName); +- } +- } +- +- public static void testTZName( Locale locale, String timezoneName, boolean isDaylight, +- int nameType, String expectedName ) throws RuntimeException { +- if (!testGeneric) { +- //Construct time zone objects +- TimeZone zone = TimeZone.getTimeZone(timezoneName); +- //Get name from JDK +- String name = zone.getDisplayName(isDaylight, nameType, locale); +- //Check for equality +- if (!name.equals(expectedName)) +- throw new RuntimeException( "Time zone ("+timezoneName+") name is incorrect for locale: \""+locale.getDisplayName() +- +"\" nameType:"+requestedTestType+" DST:"+isDaylight+" Should be: " +expectedName+" Observed: "+name); +- } +- } +- +- public static boolean testPropertyEntry( Locale locale, String entry, String value ) { +- boolean result = true; +- String[] params = entry.split("\\."); +- if (params.length != 3) { +- System.out.println("Incorrect property file entry="+entry+" "+params.length); +- result = false; +- } else { +- boolean isDaylight = true; +- int nameType = TimeZone.LONG; +- +- if (params[2].equals("short")) +- nameType = TimeZone.SHORT; +- +- if (params[1].equals("standard")) +- isDaylight = false; +- +- // Names with non-requested tz name type are ignored +- if (requestedTestType.equals(params[2])) { +- try { +- if (params[1].equals("generic")) +- testGenericTZName( locale, params[0], nameType, value ); +- else +- testTZName( locale, params[0], isDaylight, nameType, value ); +- } catch (RuntimeException e) { +- System.out.println( "Test FAILED: "+e ); +- result = false; +- } +- } +- } +- return result; +- } +- +- public static boolean testPropertyFile( String propFile, String shortName, Locale locale ) throws RuntimeException { +- boolean result = true; +- Properties property = new Properties(); +- try { +- property.load( new FileInputStream(propFile) ); +- } catch (IOException e) { +- throw new RuntimeException("Property file "+propFile+" is not found", e); +- } +- for (String key: property.stringPropertyNames()) { +- result &= testPropertyEntry(locale, key, property.getProperty(key) ); +- } +- return result; +- } +- +- // Locale to test, file with names data, test long/short names, test generic names (true/false) +- static Object[][] testTargets = { +- { Locale.ROOT,"TimeZoneNames.properties","long",false}, +- { Locale.ROOT,"TimeZoneNames_short.properties","short",false}, +- { Locale.ROOT,"TimeZoneNames.properties","long",true}, +- { Locale.ROOT,"TimeZoneNames_short.properties","short",true}, +- +- { new Locale("de"),"TimeZoneNames_de.properties","long",false}, +- { new Locale("de"),"TimeZoneNames_de_short.properties","short",false}, +- { new Locale("de"),"TimeZoneNames_de.properties","long",true}, +- { new Locale("de"),"TimeZoneNames_de_short.properties","short",true}, +- +- { new Locale("es"),"TimeZoneNames_es.properties","long",false}, +- { new Locale("es"),"TimeZoneNames_es_short.properties","short",false}, +- { new Locale("es"),"TimeZoneNames_es.properties","long",true}, +- { new Locale("es"),"TimeZoneNames_es_short.properties","short",true}, +- +- { new Locale("fr"),"TimeZoneNames_fr.properties","long",false}, +- { new Locale("fr"),"TimeZoneNames_fr_short.properties","short",false}, +- { new Locale("fr"),"TimeZoneNames_fr.properties","long",true}, +- { new Locale("fr"),"TimeZoneNames_fr_short.properties","short",true}, +- +- { new Locale("it"),"TimeZoneNames_it.properties","long",false}, +- { new Locale("it"),"TimeZoneNames_it_short.properties","short",false}, +- { new Locale("it"),"TimeZoneNames_it.properties","long",true}, +- { new Locale("it"),"TimeZoneNames_it_short.properties","short",true}, +- +- { new Locale("ja"),"TimeZoneNames_ja.properties","long",false}, +- { new Locale("ja"),"TimeZoneNames_ja_short.properties","short",false}, +- { new Locale("ja"),"TimeZoneNames_ja.properties","long",true}, +- { new Locale("ja"),"TimeZoneNames_ja_short.properties","short",true}, +- +- { new Locale("ko"),"TimeZoneNames_ko.properties","long",false}, +- { new Locale("ko"),"TimeZoneNames_ko_short.properties","short",false}, +- { new Locale("ko"),"TimeZoneNames_ko.properties","long",true}, +- { new Locale("ko"),"TimeZoneNames_ko_short.properties","short",true}, +- +- { new Locale("pt","BR"),"TimeZoneNames_pt_BR.properties","long",false}, +- { new Locale("pt","BR"),"TimeZoneNames_pt_BR_short.properties","short",false}, +- { new Locale("pt","BR"),"TimeZoneNames_pt_BR.properties","long",true}, +- { new Locale("pt","BR"),"TimeZoneNames_pt_BR_short.properties","short",true}, +- +- { new Locale("sv"),"TimeZoneNames_sv.properties","long",false}, +- { new Locale("sv"),"TimeZoneNames_sv_short.properties","short",false}, +- { new Locale("sv"),"TimeZoneNames_sv.properties","long",true}, +- { new Locale("sv"),"TimeZoneNames_sv_short.properties","short",true}, +- +- { new Locale("zh","CN"),"TimeZoneNames_zh_CN.properties","long",false}, +- { new Locale("zh","CN"),"TimeZoneNames_zh_CN_short.properties","short",false}, +- { new Locale("zh","CN"),"TimeZoneNames_zh_CN.properties","long",true}, +- { new Locale("zh","CN"),"TimeZoneNames_zh_CN_short.properties","short",true}, +- +- { new Locale("zh","TW"),"TimeZoneNames_zh_TW.properties","long",false}, +- { new Locale("zh","TW"),"TimeZoneNames_zh_TW_short.properties","short",false}, +- { new Locale("zh","TW"),"TimeZoneNames_zh_TW.properties","long",true}, +- { new Locale("zh","TW"),"TimeZoneNames_zh_TW_short.properties","short",true} +- }; +- +- public static void main(String[] args) { +- boolean result = true; +- +- for (Object [] test: testTargets) { +- Locale testLocale = (Locale) test[0]; +- String testFile = (String) test[1]; +- requestedTestType = (String) test[2]; +- testGeneric = (Boolean) test[3]; +- result &= testPropertyFile( System.getProperty("test.src",".")+"/"+testFile, testFile, testLocale); +- } +- if (!result) +- throw new RuntimeException("Some time zones has unexpected names. Please, check test output."); +- } +-} +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_de.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_de.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=Zentrale Sommerzeit (Northern Territory) +-ACT.generic.long=Zentrale Zeitzone (Northern Territory) +-ACT.standard.long=Zentrale Normalzeit (Northern Territory) +-AET.daylight.long=\u00D6stliche Sommerzeit (New South Wales) +-AET.generic.long=\u00D6stliche Zeitzone (New South Wales) +-AET.standard.long=\u00D6stliche Normalzeit (New South Wales) +-AGT.generic.long=Argentinische Zeit +-ART.generic.long=Osteurop\u00E4ische Zeit +-AST.generic.long=Zeitzone f\u00FCr Alaska +-Africa/Abidjan.generic.long=Greenwich Zeit +-Africa/Accra.generic.long=Ghanaische Normalzeit +-Africa/Addis_Ababa.generic.long=Ostafrikanische Zeit +-Africa/Algiers.generic.long=Mitteleurop\u00E4ische Zeit +-Africa/Asmara.generic.long=Ostafrikanische Zeit +-Africa/Asmera.generic.long=Ostafrikanische Zeit +-Africa/Bamako.generic.long=Greenwich Zeit +-Africa/Bangui.generic.long=Westafrikanische Zeit +-Africa/Banjul.generic.long=Greenwich Zeit +-Africa/Bissau.generic.long=Greenwich Zeit +-Africa/Blantyre.generic.long=Zentralafrikanische Zeit +-Africa/Brazzaville.generic.long=Westafrikanische Zeit +-Africa/Bujumbura.generic.long=Zentralafrikanische Zeit +-Africa/Cairo.generic.long=Osteurop\u00E4ische Zeit +-Africa/Casablanca.generic.long=Westeurop\u00E4ische Zeit +-Africa/Ceuta.generic.long=Mitteleurop\u00E4ische Zeit +-Africa/Conakry.generic.long=Greenwich Zeit +-Africa/Dakar.generic.long=Greenwich Zeit +-Africa/Dar_es_Salaam.generic.long=Ostafrikanische Zeit +-Africa/Djibouti.generic.long=Ostafrikanische Zeit +-Africa/Douala.generic.long=Westafrikanische Zeit +-Africa/El_Aaiun.generic.long=Westeurop\u00E4ische Zeit +-Africa/Freetown.generic.long=Sierra Leone Zeit +-Africa/Gaborone.generic.long=Zentralafrikanische Zeit +-Africa/Harare.generic.long=Zentralafrikanische Zeit +-Africa/Johannesburg.generic.long=Zeitzone f\u00FCr S\u00FCdafrika +-Africa/Juba.generic.long=Ostafrikanische Zeit +-Africa/Kampala.generic.long=Ostafrikanische Zeit +-Africa/Khartoum.generic.long=Ostafrikanische Zeit +-Africa/Kigali.generic.long=Zentralafrikanische Zeit +-Africa/Kinshasa.generic.long=Westafrikanische Zeit +-Africa/Lagos.generic.long=Westafrikanische Zeit +-Africa/Libreville.generic.long=Westafrikanische Zeit +-Africa/Lome.generic.long=Greenwich Zeit +-Africa/Luanda.generic.long=Westafrikanische Zeit +-Africa/Lubumbashi.generic.long=Zentralafrikanische Zeit +-Africa/Lusaka.generic.long=Zentralafrikanische Zeit +-Africa/Malabo.generic.long=Westafrikanische Zeit +-Africa/Maputo.generic.long=Zentralafrikanische Zeit +-Africa/Maseru.generic.long=Zeitzone f\u00FCr S\u00FCdafrika +-Africa/Mbabane.generic.long=Zeitzone f\u00FCr S\u00FCdafrika +-Africa/Mogadishu.generic.long=Ostafrikanische Zeit +-Africa/Monrovia.generic.long=Greenwich Zeit +-Africa/Nairobi.generic.long=Ostafrikanische Zeit +-Africa/Ndjamena.generic.long=Westafrikanische Zeit +-Africa/Niamey.generic.long=Westafrikanische Zeit +-Africa/Nouakchott.generic.long=Greenwich Zeit +-Africa/Ouagadougou.generic.long=Greenwich Zeit +-Africa/Porto-Novo.generic.long=Westafrikanische Zeit +-Africa/Sao_Tome.generic.long=Greenwich Zeit +-Africa/Timbuktu.generic.long=Greenwich Zeit +-Africa/Tripoli.generic.long=Osteurop\u00e4ische Zeit +-Africa/Tunis.generic.long=Mitteleurop\u00E4ische Zeit +-Africa/Windhoek.generic.long=Westafrikanische Zeit +-America/Adak.generic.long=Zeitzone f\u00FCr Hawaii und Al\u00EButen +-America/Anchorage.generic.long=Zeitzone f\u00FCr Alaska +-America/Anguilla.generic.long=Zeitzone Atlantik +-America/Antigua.generic.long=Zeitzone Atlantik +-America/Araguaina.generic.long=Brasilianische Zeit +-America/Argentina/Buenos_Aires.generic.long=Argentinische Zeit +-America/Argentina/Catamarca.generic.long=Argentinische Zeit +-America/Argentina/ComodRivadavia.generic.long=Argentinische Zeit +-America/Argentina/Cordoba.generic.long=Argentinische Zeit +-America/Argentina/Jujuy.generic.long=Argentinische Zeit +-America/Argentina/La_Rioja.generic.long=Argentinische Zeit +-America/Argentina/Mendoza.generic.long=Argentinische Zeit +-America/Argentina/Rio_Gallegos.generic.long=Argentinische Zeit +-America/Argentina/Salta.generic.long=Argentinische Zeit +-America/Argentina/San_Juan.generic.long=Argentinische Zeit +-America/Argentina/San_Luis.generic.long=Argentinische Zeit +-America/Argentina/Tucuman.generic.long=Argentinische Zeit +-America/Argentina/Ushuaia.generic.long=Argentinische Zeit +-America/Aruba.generic.long=Zeitzone Atlantik +-America/Asuncion.generic.long=Paraguay Zeit +-America/Atikokan.generic.long=\u00D6stliche Zeitzone +-America/Atka.generic.long=Zeitzone f\u00FCr Hawaii und Al\u00EButen +-America/Bahia.generic.long=Brasilianische Zeit +-America/Bahia_Banderas.generic.long=Zentrale Zeitzone +-America/Barbados.generic.long=Zeitzone Atlantik +-America/Belem.generic.long=Brasilianische Zeit +-America/Belize.generic.long=Zentrale Zeitzone +-America/Blanc-Sablon.generic.long=Zeitzone Atlantik +-America/Boa_Vista.generic.long=Amazonas Normalzeit +-America/Bogota.generic.long=Kolumbianische Zeit +-America/Boise.generic.long=Zeitzone Mountain +-America/Buenos_Aires.generic.long=Argentinische Zeit +-America/Cambridge_Bay.generic.long=Zeitzone Mountain +-America/Campo_Grande.generic.long=Amazonas Normalzeit +-America/Cancun.generic.long=Zentrale Zeitzone +-America/Caracas.generic.long=Venezuelanische Zeit +-America/Catamarca.generic.long=Argentinische Zeit +-America/Cayenne.generic.long=Franz\u00F6sisch-Guiana Zeit +-America/Cayman.generic.long=\u00D6stliche Zeitzone +-America/Chicago.generic.long=Zentrale Zeitzone +-America/Chihuahua.generic.long=Zeitzone Mountain +-America/Coral_Harbour.generic.long=\u00D6stliche Zeitzone +-America/Cordoba.generic.long=Argentinische Zeit +-America/Costa_Rica.generic.long=Zentrale Zeitzone +-America/Creston.generic.long=Zeitzone Mountain +-America/Cuiaba.generic.long=Amazonas Normalzeit +-America/Curacao.generic.long=Zeitzone Atlantik +-America/Danmarkshavn.generic.long=Greenwich Zeit +-America/Dawson.generic.long=Zeitzone Pazifik +-America/Dawson_Creek.generic.long=Zeitzone Mountain +-America/Denver.generic.long=Zeitzone Mountain +-America/Detroit.generic.long=\u00D6stliche Zeitzone +-America/Dominica.generic.long=Zeitzone Atlantik +-America/Edmonton.generic.long=Zeitzone Mountain +-America/Eirunepe.generic.long=Acre Normalzeit +-America/El_Salvador.generic.long=Zentrale Zeitzone +-America/Ensenada.generic.long=Zeitzone Pazifik +-America/Fort_Wayne.generic.long=\u00D6stliche Zeitzone +-America/Fortaleza.generic.long=Brasilianische Zeit +-America/Glace_Bay.generic.long=Zeitzone Atlantik +-America/Godthab.generic.long=Westgr\u00F6nl\u00E4ndische Zeit +-America/Goose_Bay.generic.long=Zeitzone Atlantik +-America/Grand_Turk.generic.long=\u00D6stliche Zeitzone +-America/Grenada.generic.long=Zeitzone Atlantik +-America/Guadeloupe.generic.long=Zeitzone Atlantik +-America/Guatemala.generic.long=Zentrale Zeitzone +-America/Guayaquil.generic.long=Ecuadorianische Zeit +-America/Guyana.generic.long=Guyanische Zeit +-America/Halifax.generic.long=Zeitzone Atlantik +-America/Havana.generic.long=Kubanische Normalzeit +-America/Hermosillo.generic.long=Zeitzone Mountain +-America/Indiana/Indianapolis.generic.long=\u00D6stliche Zeitzone +-America/Indiana/Knox.generic.long=Zentrale Zeitzone +-America/Indiana/Marengo.generic.long=\u00D6stliche Zeitzone +-America/Indiana/Petersburg.generic.long=\u00D6stliche Zeitzone +-America/Indiana/Tell_City.generic.long=Zentrale Zeitzone +-America/Indiana/Vevay.generic.long=\u00D6stliche Zeitzone +-America/Indiana/Vincennes.generic.long=\u00D6stliche Zeitzone +-America/Indiana/Winamac.generic.long=\u00D6stliche Zeitzone +-America/Indianapolis.generic.long=\u00D6stliche Zeitzone +-America/Inuvik.generic.long=Zeitzone Mountain +-America/Iqaluit.generic.long=\u00D6stliche Zeitzone +-America/Jamaica.generic.long=\u00D6stliche Zeitzone +-America/Jujuy.generic.long=Argentinische Zeit +-America/Juneau.generic.long=Zeitzone f\u00FCr Alaska +-America/Kentucky/Louisville.generic.long=\u00D6stliche Zeitzone +-America/Kentucky/Monticello.generic.long=\u00D6stliche Zeitzone +-America/Knox_IN.generic.long=Zentrale Zeitzone +-America/Kralendijk.generic.long=Zeitzone Atlantik +-America/La_Paz.generic.long=Bolivianische Zeit +-America/Lima.generic.long=Peruanische Zeit +-America/Los_Angeles.generic.long=Zeitzone Pazifik +-America/Louisville.generic.long=\u00D6stliche Zeitzone +-America/Lower_Princes.generic.long=Zeitzone Atlantik +-America/Maceio.generic.long=Brasilianische Zeit +-America/Managua.generic.long=Zentrale Zeitzone +-America/Manaus.generic.long=Amazonas Normalzeit +-America/Marigot.generic.long=Zeitzone Atlantik +-America/Martinique.generic.long=Zeitzone Atlantik +-America/Matamoros.generic.long=Zentrale Zeitzone +-America/Mazatlan.generic.long=Zeitzone Mountain +-America/Mendoza.generic.long=Argentinische Zeit +-America/Menominee.generic.long=Zentrale Zeitzone +-America/Merida.generic.long=Zentrale Zeitzone +-America/Metlakatla.daylight.long=Metlakatla Sommerzeit +-America/Metlakatla.generic.long=Metlakatla Normalzeit +-America/Metlakatla.standard.long=Metlakatla Normalzeit +-America/Mexico_City.generic.long=Zentrale Zeitzone +-America/Miquelon.generic.long=Zeitzone f\u00FCr St. Pierre und Miquelon +-America/Moncton.generic.long=Zeitzone Atlantik +-America/Monterrey.generic.long=Zentrale Zeitzone +-America/Montevideo.generic.long=Uruguayanische Zeit +-America/Montreal.generic.long=\u00D6stliche Zeitzone +-America/Montserrat.generic.long=Zeitzone Atlantik +-America/Nassau.generic.long=\u00D6stliche Zeitzone +-America/New_York.generic.long=\u00D6stliche Zeitzone +-America/Nipigon.generic.long=\u00D6stliche Zeitzone +-America/Nome.generic.long=Zeitzone f\u00FCr Alaska +-America/Noronha.generic.long=Fernando de Noronha Zeit +-America/North_Dakota/Beulah.generic.long=Zentrale Zeitzone +-America/North_Dakota/Center.generic.long=Zentrale Zeitzone +-America/North_Dakota/New_Salem.generic.long=Zentrale Zeitzone +-America/Ojinaga.generic.long=Zeitzone Mountain +-America/Panama.generic.long=\u00D6stliche Zeitzone +-America/Pangnirtung.generic.long=\u00D6stliche Zeitzone +-America/Paramaribo.generic.long=Suriname Zeit +-America/Phoenix.generic.long=Zeitzone Mountain +-America/Port-au-Prince.generic.long=\u00D6stliche Zeitzone +-America/Port_of_Spain.generic.long=Zeitzone Atlantik +-America/Porto_Acre.generic.long=Acre Normalzeit +-America/Porto_Velho.generic.long=Amazonas Normalzeit +-America/Puerto_Rico.generic.long=Zeitzone Atlantik +-America/Rainy_River.generic.long=Zentrale Zeitzone +-America/Rankin_Inlet.generic.long=Zentrale Zeitzone +-America/Recife.generic.long=Brasilianische Zeit +-America/Regina.generic.long=Zentrale Zeitzone +-America/Resolute.generic.long=Zentrale Zeitzone +-America/Rio_Branco.generic.long=Acre Normalzeit +-America/Rosario.generic.long=Argentinische Zeit +-America/Santa_Isabel.generic.long=Zeitzone Pazifik +-America/Santarem.generic.long=Brasilianische Zeit +-America/Santiago.generic.long=Chilenische Zeit +-America/Santo_Domingo.generic.long=Zeitzone Atlantik +-America/Sao_Paulo.generic.long=Brasilianische Zeit +-America/Scoresbysund.generic.long=Ostgr\u00F6nl\u00E4ndische Zeit +-America/Shiprock.generic.long=Zeitzone Mountain +-America/Sitka.generic.long=Zeitzone f\u00FCr Alaska +-America/St_Barthelemy.generic.long=Zeitzone Atlantik +-America/St_Johns.generic.long=Zeitzone f\u00FCr Neufundland +-America/St_Kitts.generic.long=Zeitzone Atlantik +-America/St_Lucia.generic.long=Zeitzone Atlantik +-America/St_Thomas.generic.long=Zeitzone Atlantik +-America/St_Vincent.generic.long=Zeitzone Atlantik +-America/Swift_Current.generic.long=Zentrale Zeitzone +-America/Tegucigalpa.generic.long=Zentrale Zeitzone +-America/Thule.generic.long=Zeitzone Atlantik +-America/Thunder_Bay.generic.long=\u00D6stliche Zeitzone +-America/Tijuana.generic.long=Zeitzone Pazifik +-America/Toronto.generic.long=\u00D6stliche Zeitzone +-America/Tortola.generic.long=Zeitzone Atlantik +-America/Vancouver.generic.long=Zeitzone Pazifik +-America/Virgin.generic.long=Zeitzone Atlantik +-America/Whitehorse.generic.long=Zeitzone Pazifik +-America/Winnipeg.generic.long=Zentrale Zeitzone +-America/Yakutat.generic.long=Zeitzone f\u00FCr Alaska +-America/Yellowknife.generic.long=Zeitzone Mountain +-Antarctica/Casey.daylight.long=Westliche Sommerzeit (Australien) +-Antarctica/Casey.generic.long=Westliche Zeitzone (Australien) +-Antarctica/Casey.standard.long=Westliche Normalzeit (Australien) +-Antarctica/Davis.generic.long=Davis Zeit +-Antarctica/DumontDUrville.generic.long=Dumont-d'Urville Zeit +-Antarctica/Macquarie.daylight.long=Macquarieinsel Sommerzeit +-Antarctica/Macquarie.generic.long=Macquarieinsel Zeit +-Antarctica/Macquarie.standard.long=Macquarieinsel Zeit +-Antarctica/Mawson.generic.long=Mawson Zeit +-Antarctica/McMurdo.generic.long=Zeitzone f\u00FCr Neuseeland +-Antarctica/Palmer.generic.long=Chilenische Zeit +-Antarctica/Rothera.generic.long=Rothera Zeit +-Antarctica/South_Pole.generic.long=Zeitzone f\u00FCr Neuseeland +-Antarctica/Syowa.generic.long=Syowa Zeit +-Antarctica/Vostok.generic.long=Vostok Zeit +-Arctic/Longyearbyen.generic.long=Mitteleurop\u00E4ische Zeit +-Asia/Aden.generic.long=Zeitzone f\u00FCr Arabische Halbinsel +-Asia/Almaty.generic.long=Alma Ata Zeit +-Asia/Amman.generic.long=Zeitzone f\u00fcr Arabische Halbinsel +-Asia/Anadyr.generic.long=Anadyr Zeit +-Asia/Aqtau.generic.long=Aqtau Zeit +-Asia/Aqtobe.generic.long=Aqtobe Zeit +-Asia/Ashgabat.generic.long=Turkmenische Zeit +-Asia/Ashkhabad.generic.long=Turkmenische Zeit +-Asia/Baghdad.generic.long=Zeitzone f\u00FCr Arabische Halbinsel +-Asia/Bahrain.generic.long=Zeitzone f\u00FCr Arabische Halbinsel +-Asia/Baku.generic.long=Aserbaidschanische Zeit +-Asia/Bangkok.generic.long=Indochina Zeit +-Asia/Beirut.generic.long=Osteurop\u00E4ische Zeit +-Asia/Bishkek.generic.long=Kirgisische Zeit +-Asia/Brunei.generic.long=Brunei Zeit +-Asia/Calcutta.generic.long=Zeitzone f\u00FCr Indien +-Asia/Choibalsan.generic.long=Choibalsan Zeit +-Asia/Chongqing.generic.long=Zeitzone f\u00FCr China +-Asia/Chungking.generic.long=Zeitzone f\u00FCr China +-Asia/Colombo.generic.long=Zeitzone f\u00FCr Indien +-Asia/Dacca.generic.long=Bangladesch Zeit +-Asia/Damascus.generic.long=Osteurop\u00E4ische Zeit +-Asia/Dhaka.generic.long=Bangladesch Zeit +-Asia/Dili.generic.long=Timor-Leste Normalzeit +-Asia/Dubai.generic.long=Zeitzone f\u00FCr Persischen Golf +-Asia/Dushanbe.generic.long=Tadschikische Zeit +-Asia/Gaza.generic.long=Osteurop\u00E4ische Zeit +-Asia/Harbin.generic.long=Zeitzone f\u00FCr China +-Asia/Hebron.generic.long=Osteurop\u00E4ische Zeit +-Asia/Ho_Chi_Minh.generic.long=Indochina Zeit +-Asia/Hong_Kong.generic.long=Hongkong Zeit +-Asia/Hovd.generic.long=Hovd Zeit +-Asia/Irkutsk.generic.long=Irkutsk Zeit +-Asia/Istanbul.generic.long=Osteurop\u00E4ische Zeit +-Asia/Jakarta.generic.long=Westindonesische Zeit +-Asia/Jayapura.generic.long=Ostindonesische Zeit +-Asia/Jerusalem.generic.long=Zeitzone f\u00FCr Israel +-Asia/Kabul.generic.long=Afghanistanische Zeit +-Asia/Kamchatka.generic.long=Petropawlowsk-Kamtschatkische Zeit +-Asia/Karachi.generic.long=Pakistanische Zeit +-Asia/Kashgar.generic.long=Zeitzone f\u00FCr China +-Asia/Kathmandu.generic.long=Nepalesische Zeit +-Asia/Katmandu.generic.long=Nepalesische Zeit +-Asia/Khandyga.daylight.long=Chandyga Sommerzeit +-Asia/Khandyga.generic.long=Chandyga Zeit +-Asia/Khandyga.standard.long=Chandyga Zeit +-Asia/Kolkata.generic.long=Zeitzone f\u00FCr Indien +-Asia/Krasnoyarsk.generic.long=Krasnojarsker Zeit +-Asia/Kuala_Lumpur.generic.long=Malaysische Zeit +-Asia/Kuching.generic.long=Malaysische Zeit +-Asia/Kuwait.generic.long=Zeitzone f\u00FCr Arabische Halbinsel +-Asia/Macao.generic.long=Zeitzone f\u00FCr China +-Asia/Macau.generic.long=Zeitzone f\u00FCr China +-Asia/Magadan.generic.long=Magadanische Zeit +-Asia/Makassar.generic.long=Zentralindonesische Zeit +-Asia/Manila.generic.long=Philippinische Zeit +-Asia/Muscat.generic.long=Zeitzone f\u00FCr Persischen Golf +-Asia/Nicosia.generic.long=Osteurop\u00E4ische Zeit +-Asia/Novokuznetsk.generic.long=Nowosibirsker Zeit +-Asia/Novosibirsk.generic.long=Nowosibirsker Zeit +-Asia/Omsk.generic.long=Omsk Zeit +-Asia/Oral.generic.long=Oral Zeit +-Asia/Phnom_Penh.generic.long=Indochina Zeit +-Asia/Pontianak.generic.long=Westindonesische Zeit +-Asia/Pyongyang.generic.long=Zeitzone f\u00FCr Korea +-Asia/Qatar.generic.long=Zeitzone f\u00FCr Arabische Halbinsel +-Asia/Qyzylorda.generic.long=Qyzylorda Zeit +-Asia/Rangoon.generic.long=Myanmar Zeit +-Asia/Saigon.generic.long=Indochina Zeit +-Asia/Sakhalin.generic.long=Sakhalin Zeit +-Asia/Samarkand.generic.long=Usbekistan Zeit +-Asia/Seoul.generic.long=Zeitzone f\u00FCr Korea +-Asia/Shanghai.generic.long=Zeitzone f\u00FCr China +-Asia/Singapore.generic.long=Singapur Zeit +-Asia/Taipei.generic.long=Zeitzone f\u00FCr China +-Asia/Tashkent.generic.long=Usbekistan Zeit +-Asia/Tbilisi.generic.long=Georgische Zeit +-Asia/Tehran.generic.long=Iranische Zeit +-Asia/Tel_Aviv.generic.long=Zeitzone f\u00FCr Israel +-Asia/Thimbu.generic.long=Bhutanische Zeit +-Asia/Thimphu.generic.long=Bhutanische Zeit +-Asia/Tokyo.generic.long=Zeitzone f\u00FCr Japan +-Asia/Ujung_Pandang.generic.long=Zentralindonesische Zeit +-Asia/Ulaanbaatar.generic.long=Ulaanbaatar Zeit +-Asia/Ulan_Bator.generic.long=Ulaanbaatar Zeit +-Asia/Urumqi.generic.long=Zeitzone f\u00FCr China +-Asia/Ust-Nera.daylight.long=Ust-Nera Sommerzeit +-Asia/Ust-Nera.generic.long=Ust-Nera Zeit +-Asia/Ust-Nera.standard.long=Ust-Nera Zeit +-Asia/Vientiane.generic.long=Indochina Zeit +-Asia/Vladivostok.generic.long=Wladiwostok Zeit +-Asia/Yakutsk.generic.long=Jakutsk Zeit +-Asia/Yekaterinburg.generic.long=Jekaterinburger Zeit +-Asia/Yerevan.generic.long=Armenische Zeit +-Atlantic/Azores.generic.long=Azoren Zeit +-Atlantic/Bermuda.generic.long=Zeitzone Atlantik +-Atlantic/Canary.generic.long=Westeurop\u00E4ische Zeit +-Atlantic/Cape_Verde.generic.long=Kap Verde Zeit +-Atlantic/Faeroe.generic.long=Westeurop\u00E4ische Zeit +-Atlantic/Faroe.generic.long=Westeurop\u00E4ische Zeit +-Atlantic/Jan_Mayen.generic.long=Mitteleurop\u00E4ische Zeit +-Atlantic/Madeira.generic.long=Westeurop\u00E4ische Zeit +-Atlantic/Reykjavik.generic.long=Greenwich Zeit +-Atlantic/South_Georgia.generic.long=Zeitzone f\u00FCr S\u00FCdgeorgien +-Atlantic/St_Helena.generic.long=Greenwich Zeit +-Atlantic/Stanley.generic.long=Falkland Inseln Zeit +-Australia/ACT.daylight.long=\u00D6stliche Sommerzeit (New South Wales) +-Australia/ACT.generic.long=\u00D6stliche Zeitzone (New South Wales) +-Australia/ACT.standard.long=\u00D6stliche Normalzeit (New South Wales) +-Australia/Adelaide.daylight.long=Zentrale Sommerzeit (S\u00FCdaustralien) +-Australia/Adelaide.generic.long=Zentrale Zeitzone (S\u00FCdaustralien) +-Australia/Adelaide.standard.long=Zentrale Normalzeit (S\u00FCdaustralien) +-Australia/Brisbane.daylight.long=\u00D6stliche Sommerzeit (Queensland) +-Australia/Brisbane.generic.long=\u00D6stliche Zeitzone (Queensland) +-Australia/Brisbane.standard.long=\u00D6stliche Normalzeit (Queensland) +-Australia/Broken_Hill.daylight.long=Zentrale Sommerzeit (S\u00FCdaustralien/New South Wales) +-Australia/Broken_Hill.generic.long=Zentrale Zeitzone (S\u00FCdaustralien/New South Wales) +-Australia/Broken_Hill.standard.long=Zentrale Normalzeit (S\u00FCdaustralien/New South Wales) +-Australia/Canberra.daylight.long=\u00D6stliche Sommerzeit (New South Wales) +-Australia/Canberra.generic.long=\u00D6stliche Zeitzone (New South Wales) +-Australia/Canberra.standard.long=\u00D6stliche Normalzeit (New South Wales) +-Australia/Currie.daylight.long=\u00D6stliche Sommerzeit (New South Wales) +-Australia/Currie.generic.long=\u00D6stliche Zeitzone (New South Wales) +-Australia/Currie.standard.long=\u00D6stliche Normalzeit (New South Wales) +-Australia/Darwin.daylight.long=Zentrale Sommerzeit (Northern Territory) +-Australia/Darwin.generic.long=Zentrale Zeitzone (Northern Territory) +-Australia/Darwin.standard.long=Zentrale Normalzeit (Northern Territory) +-Australia/Eucla.daylight.long=Zentral-Westliche Sommerzeit (Australien) +-Australia/Eucla.generic.long=Zentral-Westliche Normalzeit (Australien) +-Australia/Eucla.standard.long=Zentral-Westliche Normalzeit (Australien) +-Australia/Hobart.daylight.long=\u00D6stliche Sommerzeit (Tasmanien) +-Australia/Hobart.generic.long=\u00D6stliche Zeitzone (Tasmanien) +-Australia/Hobart.standard.long=\u00D6stliche Normalzeit (Tasmanien) +-Australia/LHI.generic.long=Lord-Howe Normalzeit +-Australia/Lindeman.daylight.long=\u00D6stliche Sommerzeit (Queensland) +-Australia/Lindeman.generic.long=\u00D6stliche Zeitzone (Queensland) +-Australia/Lindeman.standard.long=\u00D6stliche Normalzeit (Queensland) +-Australia/Lord_Howe.generic.long=Lord-Howe Normalzeit +-Australia/Melbourne.daylight.long=\u00D6stliche Sommerzeit (Victoria) +-Australia/Melbourne.generic.long=\u00D6stliche Zeitzone (Victoria) +-Australia/Melbourne.standard.long=\u00D6stliche Normalzeit (Victoria) +-Australia/NSW.daylight.long=\u00D6stliche Sommerzeit (New South Wales) +-Australia/NSW.generic.long=\u00D6stliche Zeitzone (New South Wales) +-Australia/NSW.standard.long=\u00D6stliche Normalzeit (New South Wales) +-Australia/North.daylight.long=Zentrale Sommerzeit (Northern Territory) +-Australia/North.generic.long=Zentrale Zeitzone (Northern Territory) +-Australia/North.standard.long=Zentrale Normalzeit (Northern Territory) +-Australia/Perth.daylight.long=Westliche Sommerzeit (Australien) +-Australia/Perth.generic.long=Westliche Zeitzone (Australien) +-Australia/Perth.standard.long=Westliche Normalzeit (Australien) +-Australia/Queensland.daylight.long=\u00D6stliche Sommerzeit (Queensland) +-Australia/Queensland.generic.long=\u00D6stliche Zeitzone (Queensland) +-Australia/Queensland.standard.long=\u00D6stliche Normalzeit (Queensland) +-Australia/South.daylight.long=Zentrale Sommerzeit (S\u00FCdaustralien) +-Australia/South.generic.long=Zentrale Zeitzone (S\u00FCdaustralien) +-Australia/South.standard.long=Zentrale Normalzeit (S\u00FCdaustralien) +-Australia/Sydney.daylight.long=\u00D6stliche Sommerzeit (New South Wales) +-Australia/Sydney.generic.long=\u00D6stliche Zeitzone (New South Wales) +-Australia/Sydney.standard.long=\u00D6stliche Normalzeit (New South Wales) +-Australia/Tasmania.daylight.long=\u00D6stliche Sommerzeit (Tasmanien) +-Australia/Tasmania.generic.long=\u00D6stliche Zeitzone (Tasmanien) +-Australia/Tasmania.standard.long=\u00D6stliche Normalzeit (Tasmanien) +-Australia/Victoria.daylight.long=\u00D6stliche Sommerzeit (Victoria) +-Australia/Victoria.generic.long=\u00D6stliche Zeitzone (Victoria) +-Australia/Victoria.standard.long=\u00D6stliche Normalzeit (Victoria) +-Australia/West.daylight.long=Westliche Sommerzeit (Australien) +-Australia/West.generic.long=Westliche Zeitzone (Australien) +-Australia/West.standard.long=Westliche Normalzeit (Australien) +-Australia/Yancowinna.daylight.long=Zentrale Sommerzeit (S\u00FCdaustralien/New South Wales) +-Australia/Yancowinna.generic.long=Zentrale Zeitzone (S\u00FCdaustralien/New South Wales) +-Australia/Yancowinna.standard.long=Zentrale Normalzeit (S\u00FCdaustralien/New South Wales) +-BET.generic.long=Brasilianische Zeit +-BST.generic.long=Bangladesch Zeit +-Brazil/Acre.generic.long=Acre Normalzeit +-Brazil/DeNoronha.generic.long=Fernando de Noronha Zeit +-Brazil/East.generic.long=Brasilianische Zeit +-Brazil/West.generic.long=Amazonas Normalzeit +-CAT.generic.long=Zentralafrikanische Zeit +-CET.generic.long=Mitteleurop\u00e4ische Zeit +-CNT.generic.long=Zeitzone f\u00FCr Neufundland +-CST.generic.long=Zentrale Zeitzone +-CST6CDT.generic.long=Zentrale Zeitzone +-CTT.generic.long=Zeitzone f\u00FCr China +-Canada/Atlantic.generic.long=Zeitzone Atlantik +-Canada/Central.generic.long=Zentrale Zeitzone +-Canada/East-Saskatchewan.generic.long=Zentrale Zeitzone +-Canada/Eastern.generic.long=\u00D6stliche Zeitzone +-Canada/Mountain.generic.long=Zeitzone Mountain +-Canada/Newfoundland.generic.long=Zeitzone f\u00FCr Neufundland +-Canada/Pacific.generic.long=Zeitzone Pazifik +-Canada/Saskatchewan.generic.long=Zentrale Zeitzone +-Canada/Yukon.generic.long=Zeitzone Pazifik +-Chile/Continental.generic.long=Chilenische Zeit +-Chile/EasterIsland.generic.long=Osterinseln Zeit +-Cuba.generic.long=Kubanische Normalzeit +-EAT.generic.long=Ostafrikanische Zeit +-ECT.generic.long=Mitteleurop\u00E4ische Zeit +-EET.generic.long=Osteurop\u00e4ische Zeit +-EST.generic.long=\u00d6stliche Zeitzone +-EST5EDT.generic.long=\u00d6stliche Zeitzone +-Egypt.generic.long=Osteurop\u00E4ische Zeit +-Eire.generic.long=Irische Zeit +-Etc/Greenwich.generic.long=Greenwich Zeit +-Etc/UCT.generic.long=Koordinierte Universalzeit +-Etc/UTC.generic.long=Koordinierte Universalzeit +-Etc/Universal.generic.long=Koordinierte Universalzeit +-Etc/Zulu.generic.long=Koordinierte Universalzeit +-Europe/Amsterdam.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Andorra.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Athens.generic.long=Osteurop\u00E4ische Zeit +-Europe/Belfast.generic.long=Britische Zeit +-Europe/Belgrade.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Berlin.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Bratislava.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Brussels.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Bucharest.generic.long=Osteurop\u00E4ische Zeit +-Europe/Budapest.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Busingen.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Chisinau.generic.long=Osteurop\u00E4ische Zeit +-Europe/Copenhagen.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Dublin.generic.long=Irische Zeit +-Europe/Gibraltar.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Guernsey.generic.long=Britische Zeit +-Europe/Helsinki.generic.long=Osteurop\u00E4ische Zeit +-Europe/Isle_of_Man.generic.long=Britische Zeit +-Europe/Istanbul.generic.long=Osteurop\u00E4ische Zeit +-Europe/Jersey.generic.long=Britische Zeit +-Europe/Kaliningrad.daylight.long=Kaliningrader Sommerzeit +-Europe/Kaliningrad.generic.long=Kaliningrader Zeit +-Europe/Kaliningrad.standard.long=Kaliningrader Zeit +-Europe/Kiev.generic.long=Osteurop\u00E4ische Zeit +-Europe/Lisbon.generic.long=Westeurop\u00E4ische Zeit +-Europe/Ljubljana.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/London.generic.long=Britische Zeit +-Europe/Luxembourg.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Madrid.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Malta.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Mariehamn.generic.long=Osteurop\u00E4ische Zeit +-Europe/Minsk.daylight.long=Kaliningrader Sommerzeit +-Europe/Minsk.generic.long=Kaliningrader Zeit +-Europe/Minsk.standard.long=Kaliningrader Zeit +-Europe/Monaco.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Moscow.generic.long=Zeitzone f\u00FCr Moskau +-Europe/Nicosia.generic.long=Osteurop\u00E4ische Zeit +-Europe/Oslo.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Paris.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Podgorica.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Prague.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Riga.generic.long=Osteurop\u00E4ische Zeit +-Europe/Rome.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Samara.generic.long=Samarische Zeit +-Europe/San_Marino.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Sarajevo.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Simferopol.generic.long=Osteurop\u00E4ische Zeit +-Europe/Skopje.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Sofia.generic.long=Osteurop\u00E4ische Zeit +-Europe/Stockholm.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Tallinn.generic.long=Osteurop\u00E4ische Zeit +-Europe/Tirane.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Tiraspol.generic.long=Osteurop\u00E4ische Zeit +-Europe/Uzhgorod.generic.long=Osteurop\u00E4ische Zeit +-Europe/Vaduz.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Vatican.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Vienna.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Vilnius.generic.long=Osteurop\u00E4ische Zeit +-Europe/Volgograd.generic.long=Wolgograder Zeit +-Europe/Warsaw.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Zagreb.generic.long=Mitteleurop\u00E4ische Zeit +-Europe/Zaporozhye.generic.long=Osteurop\u00E4ische Zeit +-Europe/Zurich.generic.long=Mitteleurop\u00E4ische Zeit +-GB-Eire.generic.long=Britische Zeit +-GB.generic.long=Britische Zeit +-GMT.generic.long=Greenwich Zeit +-Greenwich.generic.long=Greenwich Zeit +-HST.generic.long=Zeitzone f\u00fcr Hawaii +-Hongkong.generic.long=Hongkong Zeit +-IET.generic.long=\u00D6stliche Zeitzone +-IST.generic.long=Zeitzone f\u00FCr Indien +-Iceland.generic.long=Greenwich Zeit +-Indian/Antananarivo.generic.long=Ostafrikanische Zeit +-Indian/Chagos.generic.long=Indischer Ozean Territorium Zeit +-Indian/Christmas.generic.long=Weihnachtsinseln Zeit +-Indian/Cocos.generic.long=Kokos-Inseln Zeit +-Indian/Comoro.generic.long=Ostafrikanische Zeit +-Indian/Kerguelen.generic.long=Franz\u00F6sisch S\u00FCd- u. Antarktische Landzeit +-Indian/Mahe.generic.long=Seychellen Zeit +-Indian/Maldives.generic.long=Maledivische Zeit +-Indian/Mauritius.generic.long=Mauritius Zeit +-Indian/Mayotte.generic.long=Ostafrikanische Zeit +-Indian/Reunion.generic.long=R\u00E9union Zeit +-Iran.generic.long=Iranische Zeit +-Israel.generic.long=Zeitzone f\u00FCr Israel +-JST.generic.long=Zeitzone f\u00FCr Japan +-Jamaica.generic.long=\u00D6stliche Zeitzone +-Japan.generic.long=Zeitzone f\u00FCr Japan +-Kwajalein.generic.long=Marshallinseln Zeit +-Libya.generic.long=Osteurop\u00e4ische Zeit +-MET.generic.long=MET +-MIT.generic.long=West Samoa Zeit +-MST.generic.long=Zeitzone Mountain +-MST7MDT.generic.long=Zeitzone Mountain +-Mexico/BajaNorte.generic.long=Zeitzone Pazifik +-Mexico/BajaSur.generic.long=Zeitzone Mountain +-Mexico/General.generic.long=Zentrale Zeitzone +-NET.generic.long=Armenische Zeit +-NST.generic.long=Zeitzone f\u00FCr Neuseeland +-NZ-CHAT.generic.long=Zeitzone f\u00FCr Chatham-Inseln +-NZ.generic.long=Zeitzone f\u00FCr Neuseeland +-Navajo.generic.long=Zeitzone Mountain +-PLT.generic.long=Pakistanische Zeit +-PNT.generic.long=Zeitzone Mountain +-PRC.generic.long=Zeitzone f\u00FCr China +-PRT.generic.long=Zeitzone Atlantik +-PST.generic.long=Zeitzone Pazifik +-PST8PDT.generic.long=Zeitzone Pazifik +-Pacific/Apia.generic.long=West Samoa Zeit +-Pacific/Auckland.generic.long=Zeitzone f\u00FCr Neuseeland +-Pacific/Chatham.generic.long=Zeitzone f\u00FCr Chatham-Inseln +-Pacific/Chuuk.daylight.long=Chuuk Sommerzeit +-Pacific/Chuuk.generic.long=Chuuk Zeit +-Pacific/Chuuk.standard.long=Chuuk Zeit +-Pacific/Easter.generic.long=Osterinseln Zeit +-Pacific/Efate.generic.long=Vanuatu Zeit +-Pacific/Enderbury.generic.long=Phoenix Inseln Zeit +-Pacific/Fakaofo.generic.long=Tokelau Zeit +-Pacific/Fiji.generic.long=Fidschi Zeit +-Pacific/Funafuti.generic.long=Tuvalu Zeit +-Pacific/Galapagos.generic.long=Galapagos Zeit +-Pacific/Gambier.generic.long=Gambier Zeit +-Pacific/Guadalcanal.generic.long=Salomoninseln Zeit +-Pacific/Guam.generic.long=Zeitzone f\u00FCr die Marianen +-Pacific/Honolulu.generic.long=Zeitzone f\u00FCr Hawaii +-Pacific/Johnston.generic.long=Zeitzone f\u00FCr Hawaii +-Pacific/Kiritimati.generic.long=Line Inseln Zeit +-Pacific/Kosrae.generic.long=Kosrae Zeit +-Pacific/Kwajalein.generic.long=Marshallinseln Zeit +-Pacific/Majuro.generic.long=Marshallinseln Zeit +-Pacific/Marquesas.generic.long=Marquesas Zeit +-Pacific/Midway.generic.long=Zeitzone f\u00FCr Samoa +-Pacific/Nauru.generic.long=Nauru Zeit +-Pacific/Niue.generic.long=Niue Zeit +-Pacific/Norfolk.generic.long=Norfolk Zeit +-Pacific/Noumea.generic.long=Neukaledonische Zeit +-Pacific/Pago_Pago.generic.long=Zeitzone f\u00FCr Samoa +-Pacific/Palau.generic.long=Palau Zeit +-Pacific/Pitcairn.generic.long=Zeitzone f\u00FCr Pitcairn +-Pacific/Pohnpei.daylight.long=Pohnpei Sommerzeit +-Pacific/Pohnpei.generic.long=Pohnpei-Inseln Zeit +-Pacific/Pohnpei.standard.long=Pohnpei Zeit +-Pacific/Ponape.daylight.long=Pohnpei Sommerzeit +-Pacific/Ponape.generic.long=Pohnpei-Inseln Zeit +-Pacific/Ponape.standard.long=Pohnpei Zeit +-Pacific/Port_Moresby.generic.long=Papua-Neuguinea Zeit +-Pacific/Rarotonga.generic.long=Cook-Inseln Zeit +-Pacific/Saipan.generic.long=Zeitzone f\u00FCr die Marianen +-Pacific/Samoa.generic.long=Zeitzone f\u00FCr Samoa +-Pacific/Tahiti.generic.long=Tahiti Zeit +-Pacific/Tarawa.generic.long=Gilbert-Inseln Zeit +-Pacific/Tongatapu.generic.long=Tonga Zeit +-Pacific/Truk.daylight.long=Chuuk Sommerzeit +-Pacific/Truk.generic.long=Chuuk Zeit +-Pacific/Truk.standard.long=Chuuk Zeit +-Pacific/Wake.generic.long=Wake Zeit +-Pacific/Wallis.generic.long=Wallis u. Futuna Zeit +-Pacific/Yap.daylight.long=Chuuk Sommerzeit +-Pacific/Yap.generic.long=Chuuk Zeit +-Pacific/Yap.standard.long=Chuuk Zeit +-Poland.generic.long=Mitteleurop\u00E4ische Zeit +-Portugal.generic.long=Westeurop\u00E4ische Zeit +-ROK.generic.long=Zeitzone f\u00FCr Korea +-SST.generic.long=Salomoninseln Zeit +-Singapore.generic.long=Singapur Zeit +-SystemV/AST4.generic.long=Zeitzone Atlantik +-SystemV/AST4ADT.generic.long=Zeitzone Atlantik +-SystemV/CST6.generic.long=Zentrale Zeitzone +-SystemV/CST6CDT.generic.long=Zentrale Zeitzone +-SystemV/EST5.generic.long=\u00D6stliche Zeitzone +-SystemV/EST5EDT.generic.long=\u00D6stliche Zeitzone +-SystemV/HST10.generic.long=Zeitzone f\u00FCr Hawaii +-SystemV/MST7.generic.long=Zeitzone Mountain +-SystemV/MST7MDT.generic.long=Zeitzone Mountain +-SystemV/PST8.generic.long=Zeitzone Pazifik +-SystemV/PST8PDT.generic.long=Zeitzone Pazifik +-SystemV/YST9.generic.long=Zeitzone f\u00FCr Alaska +-SystemV/YST9YDT.generic.long=Zeitzone f\u00FCr Alaska +-Turkey.generic.long=Osteurop\u00E4ische Zeit +-UCT.generic.long=Koordinierte Universalzeit +-US/Alaska.generic.long=Zeitzone f\u00FCr Alaska +-US/Aleutian.generic.long=Zeitzone f\u00FCr Hawaii und Al\u00EButen +-US/Arizona.generic.long=Zeitzone Mountain +-US/Central.generic.long=Zentrale Zeitzone +-US/East-Indiana.generic.long=\u00D6stliche Zeitzone +-US/Eastern.generic.long=\u00D6stliche Zeitzone +-US/Hawaii.generic.long=Zeitzone f\u00FCr Hawaii +-US/Indiana-Starke.generic.long=Zentrale Zeitzone +-US/Michigan.generic.long=\u00D6stliche Zeitzone +-US/Mountain.generic.long=Zeitzone Mountain +-US/Pacific-New.generic.long=Zeitzone Pazifik +-US/Pacific.generic.long=Zeitzone Pazifik +-US/Samoa.generic.long=Zeitzone f\u00FCr Samoa +-UTC.generic.long=Koordinierte Universalzeit +-Universal.generic.long=Koordinierte Universalzeit +-VST.generic.long=Indochina Zeit +-W-SU.generic.long=Zeitzone f\u00FCr Moskau +-WET.generic.long=Westeurop\u00e4ische Zeit +-Zulu.generic.long=Koordinierte Universalzeit +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_de_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_de_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=MESZ +-Africa/Algiers.generic.short=MEZ +-Africa/Algiers.standard.short=MEZ +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=OESZ +-Africa/Cairo.generic.short=OEZ +-Africa/Cairo.standard.short=OEZ +-Africa/Casablanca.daylight.short=WESZ +-Africa/Casablanca.generic.short=WEZ +-Africa/Casablanca.standard.short=WEZ +-Africa/Ceuta.daylight.short=MESZ +-Africa/Ceuta.generic.short=MEZ +-Africa/Ceuta.standard.short=MEZ +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WESZ +-Africa/El_Aaiun.generic.short=WEZ +-Africa/El_Aaiun.standard.short=WEZ +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=OESZ +-Africa/Tripoli.generic.short=OEZ +-Africa/Tripoli.standard.short=OEZ +-Africa/Tunis.daylight.short=MESZ +-Africa/Tunis.generic.short=MEZ +-Africa/Tunis.standard.short=MEZ +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=MESZ +-Arctic/Longyearbyen.generic.short=MEZ +-Arctic/Longyearbyen.standard.short=MEZ +-ART.daylight.short=OESZ +-ART.generic.short=OEZ +-ART.standard.short=OEZ +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=OESZ +-Asia/Beirut.generic.short=OEZ +-Asia/Beirut.standard.short=OEZ +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=OESZ +-Asia/Damascus.generic.short=OEZ +-Asia/Damascus.standard.short=OEZ +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=OESZ +-Asia/Gaza.generic.short=OEZ +-Asia/Gaza.standard.short=OEZ +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=OESZ +-Asia/Hebron.generic.short=OEZ +-Asia/Hebron.standard.short=OEZ +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=OESZ +-Asia/Istanbul.generic.short=OEZ +-Asia/Istanbul.standard.short=OEZ +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=OESZ +-Asia/Nicosia.generic.short=OEZ +-Asia/Nicosia.standard.short=OEZ +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WESZ +-Atlantic/Canary.generic.short=WEZ +-Atlantic/Canary.standard.short=WEZ +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WESZ +-Atlantic/Faeroe.generic.short=WEZ +-Atlantic/Faeroe.standard.short=WEZ +-Atlantic/Faroe.daylight.short=WESZ +-Atlantic/Faroe.generic.short=WEZ +-Atlantic/Faroe.standard.short=WEZ +-Atlantic/Jan_Mayen.daylight.short=MESZ +-Atlantic/Jan_Mayen.generic.short=MEZ +-Atlantic/Jan_Mayen.standard.short=MEZ +-Atlantic/Madeira.daylight.short=WESZ +-Atlantic/Madeira.generic.short=WEZ +-Atlantic/Madeira.standard.short=WEZ +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=MESZ +-CET.generic.short=MEZ +-CET.standard.short=MEZ +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=MESZ +-ECT.generic.short=MEZ +-ECT.standard.short=MEZ +-EET.daylight.short=OESZ +-EET.generic.short=OEZ +-EET.standard.short=OEZ +-Egypt.daylight.short=OESZ +-Egypt.generic.short=OEZ +-Egypt.standard.short=OEZ +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=MESZ +-Europe/Amsterdam.generic.short=MEZ +-Europe/Amsterdam.standard.short=MEZ +-Europe/Andorra.daylight.short=MESZ +-Europe/Andorra.generic.short=MEZ +-Europe/Andorra.standard.short=MEZ +-Europe/Athens.daylight.short=OESZ +-Europe/Athens.generic.short=OEZ +-Europe/Athens.standard.short=OEZ +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=MESZ +-Europe/Belgrade.generic.short=MEZ +-Europe/Belgrade.standard.short=MEZ +-Europe/Berlin.daylight.short=MESZ +-Europe/Berlin.generic.short=MEZ +-Europe/Berlin.standard.short=MEZ +-Europe/Bratislava.daylight.short=MESZ +-Europe/Bratislava.generic.short=MEZ +-Europe/Bratislava.standard.short=MEZ +-Europe/Brussels.daylight.short=MESZ +-Europe/Brussels.generic.short=MEZ +-Europe/Brussels.standard.short=MEZ +-Europe/Bucharest.daylight.short=OESZ +-Europe/Bucharest.generic.short=OEZ +-Europe/Bucharest.standard.short=OEZ +-Europe/Budapest.daylight.short=MESZ +-Europe/Budapest.generic.short=MEZ +-Europe/Budapest.standard.short=MEZ +-Europe/Busingen.daylight.short=MESZ +-Europe/Busingen.generic.short=MEZ +-Europe/Busingen.standard.short=MEZ +-Europe/Chisinau.daylight.short=OESZ +-Europe/Chisinau.generic.short=OEZ +-Europe/Chisinau.standard.short=OEZ +-Europe/Copenhagen.daylight.short=MESZ +-Europe/Copenhagen.generic.short=MEZ +-Europe/Copenhagen.standard.short=MEZ +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=MESZ +-Europe/Gibraltar.generic.short=MEZ +-Europe/Gibraltar.standard.short=MEZ +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=OESZ +-Europe/Helsinki.generic.short=OEZ +-Europe/Helsinki.standard.short=OEZ +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=OESZ +-Europe/Istanbul.generic.short=OEZ +-Europe/Istanbul.standard.short=OEZ +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=OESZ +-Europe/Kiev.generic.short=OEZ +-Europe/Kiev.standard.short=OEZ +-Europe/Lisbon.daylight.short=WESZ +-Europe/Lisbon.generic.short=WEZ +-Europe/Lisbon.standard.short=WEZ +-Europe/Ljubljana.daylight.short=MESZ +-Europe/Ljubljana.generic.short=MEZ +-Europe/Ljubljana.standard.short=MEZ +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=MESZ +-Europe/Luxembourg.generic.short=MEZ +-Europe/Luxembourg.standard.short=MEZ +-Europe/Madrid.daylight.short=MESZ +-Europe/Madrid.generic.short=MEZ +-Europe/Madrid.standard.short=MEZ +-Europe/Malta.daylight.short=MESZ +-Europe/Malta.generic.short=MEZ +-Europe/Malta.standard.short=MEZ +-Europe/Mariehamn.daylight.short=OESZ +-Europe/Mariehamn.generic.short=OEZ +-Europe/Mariehamn.standard.short=OEZ +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=MESZ +-Europe/Monaco.generic.short=MEZ +-Europe/Monaco.standard.short=MEZ +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=OESZ +-Europe/Nicosia.generic.short=OEZ +-Europe/Nicosia.standard.short=OEZ +-Europe/Oslo.daylight.short=MESZ +-Europe/Oslo.generic.short=MEZ +-Europe/Oslo.standard.short=MEZ +-Europe/Paris.daylight.short=MESZ +-Europe/Paris.generic.short=MEZ +-Europe/Paris.standard.short=MEZ +-Europe/Podgorica.daylight.short=MESZ +-Europe/Podgorica.generic.short=MEZ +-Europe/Podgorica.standard.short=MEZ +-Europe/Prague.daylight.short=MESZ +-Europe/Prague.generic.short=MEZ +-Europe/Prague.standard.short=MEZ +-Europe/Riga.daylight.short=OESZ +-Europe/Riga.generic.short=OEZ +-Europe/Riga.standard.short=OEZ +-Europe/Rome.daylight.short=MESZ +-Europe/Rome.generic.short=MEZ +-Europe/Rome.standard.short=MEZ +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=MESZ +-Europe/San_Marino.generic.short=MEZ +-Europe/San_Marino.standard.short=MEZ +-Europe/Sarajevo.daylight.short=MESZ +-Europe/Sarajevo.generic.short=MEZ +-Europe/Sarajevo.standard.short=MEZ +-Europe/Simferopol.daylight.short=OESZ +-Europe/Simferopol.generic.short=OEZ +-Europe/Simferopol.standard.short=OEZ +-Europe/Skopje.daylight.short=MESZ +-Europe/Skopje.generic.short=MEZ +-Europe/Skopje.standard.short=MEZ +-Europe/Sofia.daylight.short=OESZ +-Europe/Sofia.generic.short=OEZ +-Europe/Sofia.standard.short=OEZ +-Europe/Stockholm.daylight.short=MESZ +-Europe/Stockholm.generic.short=MEZ +-Europe/Stockholm.standard.short=MEZ +-Europe/Tallinn.daylight.short=OESZ +-Europe/Tallinn.generic.short=OEZ +-Europe/Tallinn.standard.short=OEZ +-Europe/Tirane.daylight.short=MESZ +-Europe/Tirane.generic.short=MEZ +-Europe/Tirane.standard.short=MEZ +-Europe/Tiraspol.daylight.short=OESZ +-Europe/Tiraspol.generic.short=OEZ +-Europe/Tiraspol.standard.short=OEZ +-Europe/Uzhgorod.daylight.short=OESZ +-Europe/Uzhgorod.generic.short=OEZ +-Europe/Uzhgorod.standard.short=OEZ +-Europe/Vaduz.daylight.short=MESZ +-Europe/Vaduz.generic.short=MEZ +-Europe/Vaduz.standard.short=MEZ +-Europe/Vatican.daylight.short=MESZ +-Europe/Vatican.generic.short=MEZ +-Europe/Vatican.standard.short=MEZ +-Europe/Vienna.daylight.short=MESZ +-Europe/Vienna.generic.short=MEZ +-Europe/Vienna.standard.short=MEZ +-Europe/Vilnius.daylight.short=OESZ +-Europe/Vilnius.generic.short=OEZ +-Europe/Vilnius.standard.short=OEZ +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=MESZ +-Europe/Warsaw.generic.short=MEZ +-Europe/Warsaw.standard.short=MEZ +-Europe/Zagreb.daylight.short=MESZ +-Europe/Zagreb.generic.short=MEZ +-Europe/Zagreb.standard.short=MEZ +-Europe/Zaporozhye.daylight.short=OESZ +-Europe/Zaporozhye.generic.short=OEZ +-Europe/Zaporozhye.standard.short=OEZ +-Europe/Zurich.daylight.short=MESZ +-Europe/Zurich.generic.short=MEZ +-Europe/Zurich.standard.short=MEZ +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=OESZ +-Libya.generic.short=OEZ +-Libya.standard.short=OEZ +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=MESZ +-Poland.generic.short=MEZ +-Poland.standard.short=MEZ +-Portugal.daylight.short=WESZ +-Portugal.generic.short=WEZ +-Portugal.standard.short=WEZ +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=OESZ +-Turkey.generic.short=OEZ +-Turkey.standard.short=OEZ +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WESZ +-WET.generic.short=WEZ +-WET.standard.short=WEZ +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_es.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_es.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=Hora de verano Central (territorio del Norte) +-ACT.generic.long=Hora Central (Territorio Septentrional) +-ACT.standard.long=Hora est\u00E1ndar Central (territorio del Norte) +-AET.daylight.long=Hora de verano Oriental (Nueva Gales del Sur) +-AET.generic.long=Hora Oriental (Nueva Gales del Sur) +-AET.standard.long=Hora est\u00E1ndar Oriental (Nueva Gales del Sur) +-AGT.generic.long=Hora de Argentina +-ART.generic.long=Hora de Europa Oriental +-AST.generic.long=Hora de Alaska +-Africa/Abidjan.generic.long=Hora del Meridiano de Greenwich +-Africa/Accra.generic.long=Hora central de Ghana +-Africa/Addis_Ababa.generic.long=Hora de \u00C1frica Oriental +-Africa/Algiers.generic.long=Hora de Europa Central +-Africa/Asmara.generic.long=Hora de \u00C1frica Oriental +-Africa/Asmera.generic.long=Hora de \u00C1frica Oriental +-Africa/Bamako.generic.long=Hora del Meridiano de Greenwich +-Africa/Bangui.generic.long=Hora de \u00C1frica Occidental +-Africa/Banjul.generic.long=Hora del Meridiano de Greenwich +-Africa/Bissau.generic.long=Hora del Meridiano de Greenwich +-Africa/Blantyre.generic.long=Hora de \u00C1frica Central +-Africa/Brazzaville.generic.long=Hora de \u00C1frica Occidental +-Africa/Bujumbura.generic.long=Hora de \u00C1frica Central +-Africa/Cairo.generic.long=Hora de Europa Oriental +-Africa/Casablanca.generic.long=Hora de Europa Occidental +-Africa/Ceuta.generic.long=Hora de Europa Central +-Africa/Conakry.generic.long=Hora del Meridiano de Greenwich +-Africa/Dakar.generic.long=Hora del Meridiano de Greenwich +-Africa/Dar_es_Salaam.generic.long=Hora de \u00C1frica Oriental +-Africa/Djibouti.generic.long=Hora de \u00C1frica Oriental +-Africa/Douala.generic.long=Hora de \u00C1frica Occidental +-Africa/El_Aaiun.generic.long=Hora de Europa Occidental +-Africa/Freetown.generic.long=Horario de Sierra Leona +-Africa/Gaborone.generic.long=Hora de \u00C1frica Central +-Africa/Harare.generic.long=Hora de \u00C1frica Central +-Africa/Johannesburg.generic.long=Hora de Sud\u00E1frica +-Africa/Juba.generic.long=Hora de \u00C1frica Oriental +-Africa/Kampala.generic.long=Hora de \u00C1frica Oriental +-Africa/Khartoum.generic.long=Hora de \u00C1frica Oriental +-Africa/Kigali.generic.long=Hora de \u00C1frica Central +-Africa/Kinshasa.generic.long=Hora de \u00C1frica Occidental +-Africa/Lagos.generic.long=Hora de \u00C1frica Occidental +-Africa/Libreville.generic.long=Hora de \u00C1frica Occidental +-Africa/Lome.generic.long=Hora del Meridiano de Greenwich +-Africa/Luanda.generic.long=Hora de \u00C1frica Occidental +-Africa/Lubumbashi.generic.long=Hora de \u00C1frica Central +-Africa/Lusaka.generic.long=Hora de \u00C1frica Central +-Africa/Malabo.generic.long=Hora de \u00C1frica Occidental +-Africa/Maputo.generic.long=Hora de \u00C1frica Central +-Africa/Maseru.generic.long=Hora de Sud\u00E1frica +-Africa/Mbabane.generic.long=Hora de Sud\u00E1frica +-Africa/Mogadishu.generic.long=Hora de \u00C1frica Oriental +-Africa/Monrovia.generic.long=Hora del Meridiano de Greenwich +-Africa/Nairobi.generic.long=Hora de \u00C1frica Oriental +-Africa/Ndjamena.generic.long=Hora de \u00C1frica Occidental +-Africa/Niamey.generic.long=Hora de \u00C1frica Occidental +-Africa/Nouakchott.generic.long=Hora del Meridiano de Greenwich +-Africa/Ouagadougou.generic.long=Hora del Meridiano de Greenwich +-Africa/Porto-Novo.generic.long=Hora de \u00C1frica Occidental +-Africa/Sao_Tome.generic.long=Hora del Meridiano de Greenwich +-Africa/Timbuktu.generic.long=Hora del Meridiano de Greenwich +-Africa/Tripoli.generic.long=Hora de Europa Oriental +-Africa/Tunis.generic.long=Hora de Europa Central +-Africa/Windhoek.generic.long=Hora de \u00C1frica Occidental +-America/Adak.generic.long=Hora de Hawaii-Aleutian +-America/Anchorage.generic.long=Hora de Alaska +-America/Anguilla.generic.long=Hora del Atl\u00E1ntico +-America/Antigua.generic.long=Hora del Atl\u00E1ntico +-America/Araguaina.generic.long=Hora de Brasil +-America/Argentina/Buenos_Aires.generic.long=Hora de Argentina +-America/Argentina/Catamarca.generic.long=Hora de Argentina +-America/Argentina/ComodRivadavia.generic.long=Hora de Argentina +-America/Argentina/Cordoba.generic.long=Hora de Argentina +-America/Argentina/Jujuy.generic.long=Hora de Argentina +-America/Argentina/La_Rioja.generic.long=Hora de Argentina +-America/Argentina/Mendoza.generic.long=Hora de Argentina +-America/Argentina/Rio_Gallegos.generic.long=Hora de Argentina +-America/Argentina/Salta.generic.long=Hora de Argentina +-America/Argentina/San_Juan.generic.long=Hora de Argentina +-America/Argentina/San_Luis.generic.long=Hora de Argentina +-America/Argentina/Tucuman.generic.long=Hora de Argentina +-America/Argentina/Ushuaia.generic.long=Hora de Argentina +-America/Aruba.generic.long=Hora del Atl\u00E1ntico +-America/Asuncion.generic.long=Hora de Paraguay +-America/Atikokan.generic.long=Hora Oriental +-America/Atka.generic.long=Hora de Hawaii-Aleutian +-America/Bahia.generic.long=Hora de Brasil +-America/Bahia_Banderas.generic.long=Hora Central +-America/Barbados.generic.long=Hora del Atl\u00E1ntico +-America/Belem.generic.long=Hora de Brasil +-America/Belize.generic.long=Hora Central +-America/Blanc-Sablon.generic.long=Hora del Atl\u00E1ntico +-America/Boa_Vista.generic.long=Hora est\u00E1ndar de Amazonia +-America/Bogota.generic.long=Hora de Colombia +-America/Boise.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Buenos_Aires.generic.long=Hora de Argentina +-America/Cambridge_Bay.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Campo_Grande.generic.long=Hora est\u00E1ndar de Amazonia +-America/Cancun.generic.long=Hora Central +-America/Caracas.generic.long=Hora de Venezuela +-America/Catamarca.generic.long=Hora de Argentina +-America/Cayenne.generic.long=Hora de la Guayana Francesa +-America/Cayman.generic.long=Hora Oriental +-America/Chicago.generic.long=Hora Central +-America/Chihuahua.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Coral_Harbour.generic.long=Hora Oriental +-America/Cordoba.generic.long=Hora de Argentina +-America/Costa_Rica.generic.long=Hora Central +-America/Creston.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Cuiaba.generic.long=Hora est\u00E1ndar de Amazonia +-America/Curacao.generic.long=Hora del Atl\u00E1ntico +-America/Danmarkshavn.generic.long=Hora del Meridiano de Greenwich +-America/Dawson.generic.long=Hora del Pac\u00EDfico +-America/Dawson_Creek.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Denver.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Detroit.generic.long=Hora Oriental +-America/Dominica.generic.long=Hora del Atl\u00E1ntico +-America/Edmonton.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Eirunepe.generic.long=Hora de Acre +-America/El_Salvador.generic.long=Hora Central +-America/Ensenada.generic.long=Hora del Pac\u00EDfico +-America/Fort_Wayne.generic.long=Hora Oriental +-America/Fortaleza.generic.long=Hora de Brasil +-America/Glace_Bay.generic.long=Hora del Atl\u00E1ntico +-America/Godthab.generic.long=Hora de Groenlandia Occidental +-America/Goose_Bay.generic.long=Hora del Atl\u00E1ntico +-America/Grand_Turk.generic.long=Hora Oriental +-America/Grenada.generic.long=Hora del Atl\u00E1ntico +-America/Guadeloupe.generic.long=Hora del Atl\u00E1ntico +-America/Guatemala.generic.long=Hora Central +-America/Guayaquil.generic.long=Hora de Ecuador +-America/Guyana.generic.long=Hora de Guyana +-America/Halifax.generic.long=Hora del Atl\u00E1ntico +-America/Havana.generic.long=Hora de Cuba +-America/Hermosillo.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Indiana/Indianapolis.generic.long=Hora Oriental +-America/Indiana/Knox.generic.long=Hora Central +-America/Indiana/Marengo.generic.long=Hora Oriental +-America/Indiana/Petersburg.generic.long=Hora Oriental +-America/Indiana/Tell_City.generic.long=Hora Central +-America/Indiana/Vevay.generic.long=Hora Oriental +-America/Indiana/Vincennes.generic.long=Hora Oriental +-America/Indiana/Winamac.generic.long=Hora Oriental +-America/Indianapolis.generic.long=Hora Oriental +-America/Inuvik.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Iqaluit.generic.long=Hora Oriental +-America/Jamaica.generic.long=Hora Oriental +-America/Jujuy.generic.long=Hora de Argentina +-America/Juneau.generic.long=Hora de Alaska +-America/Kentucky/Louisville.generic.long=Hora Oriental +-America/Kentucky/Monticello.generic.long=Hora Oriental +-America/Knox_IN.generic.long=Hora Central +-America/Kralendijk.generic.long=Hora del Atl\u00E1ntico +-America/La_Paz.generic.long=Hora de Bolivia +-America/Lima.generic.long=Hora de Per\u00FA +-America/Los_Angeles.generic.long=Hora del Pac\u00EDfico +-America/Louisville.generic.long=Hora Oriental +-America/Lower_Princes.generic.long=Hora del Atl\u00E1ntico +-America/Maceio.generic.long=Hora de Brasil +-America/Managua.generic.long=Hora Central +-America/Manaus.generic.long=Hora est\u00E1ndar de Amazonia +-America/Marigot.generic.long=Hora del Atl\u00E1ntico +-America/Martinique.generic.long=Hora del Atl\u00E1ntico +-America/Matamoros.generic.long=Hora Central +-America/Mazatlan.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Mendoza.generic.long=Hora de Argentina +-America/Menominee.generic.long=Hora Central +-America/Merida.generic.long=Hora Central +-America/Metlakatla.daylight.long=Hora de verano de Metlakatla +-America/Metlakatla.generic.long=Metlakatla Time +-America/Metlakatla.standard.long=Hora de Metlakatla +-America/Mexico_City.generic.long=Hora Central +-America/Miquelon.generic.long=Hora de San Pedro y Miquel\u00F3n +-America/Moncton.generic.long=Hora del Atl\u00E1ntico +-America/Monterrey.generic.long=Hora Central +-America/Montevideo.generic.long=Hora de Uruguay +-America/Montreal.generic.long=Hora Oriental +-America/Montserrat.generic.long=Hora del Atl\u00E1ntico +-America/Nassau.generic.long=Hora Oriental +-America/New_York.generic.long=Hora Oriental +-America/Nipigon.generic.long=Hora Oriental +-America/Nome.generic.long=Hora de Alaska +-America/Noronha.generic.long=Hora de Fernando de Noronha +-America/North_Dakota/Beulah.generic.long=Hora Central +-America/North_Dakota/Center.generic.long=Hora Central +-America/North_Dakota/New_Salem.generic.long=Hora Central +-America/Ojinaga.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Panama.generic.long=Hora Oriental +-America/Pangnirtung.generic.long=Hora Oriental +-America/Paramaribo.generic.long=Hora de Surinam +-America/Phoenix.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Port-au-Prince.generic.long=Hora Oriental +-America/Port_of_Spain.generic.long=Hora del Atl\u00E1ntico +-America/Porto_Acre.generic.long=Hora de Acre +-America/Porto_Velho.generic.long=Hora est\u00E1ndar de Amazonia +-America/Puerto_Rico.generic.long=Hora del Atl\u00E1ntico +-America/Rainy_River.generic.long=Hora Central +-America/Rankin_Inlet.generic.long=Hora Central +-America/Recife.generic.long=Hora de Brasil +-America/Regina.generic.long=Hora Central +-America/Resolute.generic.long=Hora Central +-America/Rio_Branco.generic.long=Hora de Acre +-America/Rosario.generic.long=Hora de Argentina +-America/Santa_Isabel.generic.long=Hora del Pac\u00EDfico +-America/Santarem.generic.long=Hora de Brasil +-America/Santiago.generic.long=Hora de Chile +-America/Santo_Domingo.generic.long=Hora del Atl\u00E1ntico +-America/Sao_Paulo.generic.long=Hora de Brasil +-America/Scoresbysund.generic.long=Hora de Groenlandia Oriental +-America/Shiprock.generic.long=Hora de las Monta\u00F1as Rocosas +-America/Sitka.generic.long=Hora de Alaska +-America/St_Barthelemy.generic.long=Hora del Atl\u00E1ntico +-America/St_Johns.generic.long=Hora de Terranova +-America/St_Kitts.generic.long=Hora del Atl\u00E1ntico +-America/St_Lucia.generic.long=Hora del Atl\u00E1ntico +-America/St_Thomas.generic.long=Hora del Atl\u00E1ntico +-America/St_Vincent.generic.long=Hora del Atl\u00E1ntico +-America/Swift_Current.generic.long=Hora Central +-America/Tegucigalpa.generic.long=Hora Central +-America/Thule.generic.long=Hora del Atl\u00E1ntico +-America/Thunder_Bay.generic.long=Hora Oriental +-America/Tijuana.generic.long=Hora del Pac\u00EDfico +-America/Toronto.generic.long=Hora Oriental +-America/Tortola.generic.long=Hora del Atl\u00E1ntico +-America/Vancouver.generic.long=Hora del Pac\u00EDfico +-America/Virgin.generic.long=Hora del Atl\u00E1ntico +-America/Whitehorse.generic.long=Hora del Pac\u00EDfico +-America/Winnipeg.generic.long=Hora Central +-America/Yakutat.generic.long=Hora de Alaska +-America/Yellowknife.generic.long=Hora de las Monta\u00F1as Rocosas +-Antarctica/Casey.daylight.long=Hora de verano Occidental (Australia) +-Antarctica/Casey.generic.long=Hora Occidental (Australia) +-Antarctica/Casey.standard.long=Hora est\u00E1ndar Occidental (Australia) +-Antarctica/Davis.generic.long=Hora de Davis +-Antarctica/DumontDUrville.generic.long=Hora de Dumont-d'Urville +-Antarctica/Macquarie.daylight.long=Hora de verano de Isla Macquarie +-Antarctica/Macquarie.generic.long=Hora de Isla Macquarie +-Antarctica/Macquarie.standard.long=Hora de Isla Macquarie +-Antarctica/Mawson.generic.long=Hora de Mawson +-Antarctica/McMurdo.generic.long=Hora de Nueva Zelanda +-Antarctica/Palmer.generic.long=Hora de Chile +-Antarctica/Rothera.generic.long=Hora de Rothera +-Antarctica/South_Pole.generic.long=Hora de Nueva Zelanda +-Antarctica/Syowa.generic.long=Hora de Syowa +-Antarctica/Vostok.generic.long=Hora de Vostok +-Arctic/Longyearbyen.generic.long=Hora de Europa Central +-Asia/Aden.generic.long=Hora de Arabia +-Asia/Almaty.generic.long=Hora de Alma-Ata +-Asia/Amman.generic.long=Hora de Arabia +-Asia/Anadyr.generic.long=Hora de Anadyr +-Asia/Aqtau.generic.long=Hora de Aqtau +-Asia/Aqtobe.generic.long=Hora de Aqtobe +-Asia/Ashgabat.generic.long=Hora de Turkmenist\u00E1n +-Asia/Ashkhabad.generic.long=Hora de Turkmenist\u00E1n +-Asia/Baghdad.generic.long=Hora de Arabia +-Asia/Bahrain.generic.long=Hora de Arabia +-Asia/Baku.generic.long=Hora de Azerbaiy\u00E1n +-Asia/Bangkok.generic.long=Hora de Indochina +-Asia/Beirut.generic.long=Hora de Europa Oriental +-Asia/Bishkek.generic.long=Hora de Kirguizist\u00E1n +-Asia/Brunei.generic.long=Hora de Brunei +-Asia/Calcutta.generic.long=Hora de India +-Asia/Choibalsan.generic.long=Hora de Choibalsan +-Asia/Chongqing.generic.long=Hora de China +-Asia/Chungking.generic.long=Hora de China +-Asia/Colombo.generic.long=Hora de India +-Asia/Dacca.generic.long=Hora de Bangladesh +-Asia/Damascus.generic.long=Hora de Europa Oriental +-Asia/Dhaka.generic.long=Hora de Bangladesh +-Asia/Dili.generic.long=Hora de Timor Leste +-Asia/Dubai.generic.long=Hora del Golfo +-Asia/Dushanbe.generic.long=Hora de Tajikist\u00E1n +-Asia/Gaza.generic.long=Hora de Europa Oriental +-Asia/Harbin.generic.long=Hora de China +-Asia/Hebron.generic.long=Hora de Europa Oriental +-Asia/Ho_Chi_Minh.generic.long=Hora de Indochina +-Asia/Hong_Kong.generic.long=Hora de Hong Kong +-Asia/Hovd.generic.long=Hora de Hovd +-Asia/Irkutsk.generic.long=Hora de Irkutsk +-Asia/Istanbul.generic.long=Hora de Europa Oriental +-Asia/Jakarta.generic.long=Hora de Indonesia Occidental +-Asia/Jayapura.generic.long=Hora de Indonesia Oriental +-Asia/Jerusalem.generic.long=Hora de Israel +-Asia/Kabul.generic.long=Hora de Afganist\u00E1n +-Asia/Kamchatka.generic.long=Hora de Petropavlovsk-Kamchatski +-Asia/Karachi.generic.long=Hora de Pakist\u00E1n +-Asia/Kashgar.generic.long=Hora de China +-Asia/Kathmandu.generic.long=Hora de Nepal +-Asia/Katmandu.generic.long=Hora de Nepal +-Asia/Khandyga.daylight.long=Hora de verano de Khandyga +-Asia/Khandyga.generic.long=Hora de Khandyga +-Asia/Khandyga.standard.long=Hora de Khandyga +-Asia/Kolkata.generic.long=Hora de India +-Asia/Krasnoyarsk.generic.long=Hora de Krasnoyarsk +-Asia/Kuala_Lumpur.generic.long=Hora de Malasia +-Asia/Kuching.generic.long=Hora de Malasia +-Asia/Kuwait.generic.long=Hora de Arabia +-Asia/Macao.generic.long=Hora de China +-Asia/Macau.generic.long=Hora de China +-Asia/Magadan.generic.long=Hora de Magad\u00E1n +-Asia/Makassar.generic.long=Hora de Indonesia Central +-Asia/Manila.generic.long=Hora de Filipinas +-Asia/Muscat.generic.long=Hora del Golfo +-Asia/Nicosia.generic.long=Hora de Europa Oriental +-Asia/Novokuznetsk.generic.long=Hora de Novosibirsk +-Asia/Novosibirsk.generic.long=Hora de Novosibirsk +-Asia/Omsk.generic.long=Hora de Omsk +-Asia/Oral.generic.long=Hora de Uralsk +-Asia/Phnom_Penh.generic.long=Hora de Indochina +-Asia/Pontianak.generic.long=Hora de Indonesia Occidental +-Asia/Pyongyang.generic.long=Hora de Corea +-Asia/Qatar.generic.long=Hora de Arabia +-Asia/Qyzylorda.generic.long=Hora de Qyzylorda +-Asia/Rangoon.generic.long=Hora de Myanmar +-Asia/Saigon.generic.long=Hora de Indochina +-Asia/Sakhalin.generic.long=Hora de Sajalin +-Asia/Samarkand.generic.long=Hora de Uzbekist\u00E1n +-Asia/Seoul.generic.long=Hora de Corea +-Asia/Shanghai.generic.long=Hora de China +-Asia/Singapore.generic.long=Hora de Singapur +-Asia/Taipei.generic.long=Hora de China +-Asia/Tashkent.generic.long=Hora de Uzbekist\u00E1n +-Asia/Tbilisi.generic.long=Hora de Georgia +-Asia/Tehran.generic.long=Hora de Ir\u00E1n +-Asia/Tel_Aviv.generic.long=Hora de Israel +-Asia/Thimbu.generic.long=Hora de But\u00E1n +-Asia/Thimphu.generic.long=Hora de But\u00E1n +-Asia/Tokyo.generic.long=Hora de Jap\u00F3n +-Asia/Ujung_Pandang.generic.long=Hora de Indonesia Central +-Asia/Ulaanbaatar.generic.long=Hora de Ulan Bator +-Asia/Ulan_Bator.generic.long=Hora de Ulan Bator +-Asia/Urumqi.generic.long=Hora de China +-Asia/Ust-Nera.daylight.long=Hora de verano de Ust-Nera +-Asia/Ust-Nera.generic.long=Hora de Ust-Nera +-Asia/Ust-Nera.standard.long=Hora de Ust-Nera +-Asia/Vientiane.generic.long=Hora de Indochina +-Asia/Vladivostok.generic.long=Hora de Vladivostok +-Asia/Yakutsk.generic.long=Hora de Yakutsk +-Asia/Yekaterinburg.generic.long=Hora de Ekaterinburgo +-Asia/Yerevan.generic.long=Hora de Armenia +-Atlantic/Azores.generic.long=Hora de Azores +-Atlantic/Bermuda.generic.long=Hora del Atl\u00E1ntico +-Atlantic/Canary.generic.long=Hora de Europa Occidental +-Atlantic/Cape_Verde.generic.long=Hora de Cabo Verde +-Atlantic/Faeroe.generic.long=Hora de Europa Occidental +-Atlantic/Faroe.generic.long=Hora de Europa Occidental +-Atlantic/Jan_Mayen.generic.long=Hora de Europa Central +-Atlantic/Madeira.generic.long=Hora de Europa Occidental +-Atlantic/Reykjavik.generic.long=Hora del Meridiano de Greenwich +-Atlantic/South_Georgia.generic.long=Hora de Georgia del Sur +-Atlantic/St_Helena.generic.long=Hora del Meridiano de Greenwich +-Atlantic/Stanley.generic.long=Hora de las islas Malvinas +-Australia/ACT.daylight.long=Hora de verano Oriental (Nueva Gales del Sur) +-Australia/ACT.generic.long=Hora Oriental (Nueva Gales del Sur) +-Australia/ACT.standard.long=Hora est\u00E1ndar Oriental (Nueva Gales del Sur) +-Australia/Adelaide.daylight.long=Hora de verano Central (Sur de Australia) +-Australia/Adelaide.generic.long=Hora Central (Australia del Sur) +-Australia/Adelaide.standard.long=Hora est\u00E1ndar Central (Sur de Australia) +-Australia/Brisbane.daylight.long=Hora est\u00E1ndar de verano del Este (Queensland) +-Australia/Brisbane.generic.long=Hora Oriental (Queensland) +-Australia/Brisbane.standard.long=Hora est\u00E1ndar del Este (Queensland) +-Australia/Broken_Hill.daylight.long=Hora de verano Central (Sur de Australia/Nueva Gales del Sur) +-Australia/Broken_Hill.generic.long=Hora Central (Australia del Sur/Nueva Gales del Sur) +-Australia/Broken_Hill.standard.long=Hora est\u00E1ndar Central (Sur de Australia/Nueva Gales del Sur) +-Australia/Canberra.daylight.long=Hora de verano Oriental (Nueva Gales del Sur) +-Australia/Canberra.generic.long=Hora Oriental (Nueva Gales del Sur) +-Australia/Canberra.standard.long=Hora est\u00E1ndar Oriental (Nueva Gales del Sur) +-Australia/Currie.daylight.long=Hora de verano Oriental (Nueva Gales del Sur) +-Australia/Currie.generic.long=Hora Oriental (Nueva Gales del Sur) +-Australia/Currie.standard.long=Hora est\u00E1ndar Oriental (Nueva Gales del Sur) +-Australia/Darwin.daylight.long=Hora de verano Central (territorio del Norte) +-Australia/Darwin.generic.long=Hora Central (Territorio Septentrional) +-Australia/Darwin.standard.long=Hora est\u00E1ndar Central (territorio del Norte) +-Australia/Eucla.daylight.long=Hora est\u00E1ndar de verano de Australia Central y Occidental +-Australia/Eucla.generic.long=Hora de Australia Central y Occidental +-Australia/Eucla.standard.long=Hora est\u00E1ndar de Australia Central y Occidental +-Australia/Hobart.daylight.long=Hora de verano del Este (Tasmania) +-Australia/Hobart.generic.long=Hora Oriental (Tasmania) +-Australia/Hobart.standard.long=Hora est\u00E1ndar del Este (Tasmania) +-Australia/LHI.generic.long=Hora de Lord Howe +-Australia/Lindeman.daylight.long=Hora est\u00E1ndar de verano del Este (Queensland) +-Australia/Lindeman.generic.long=Hora Oriental (Queensland) +-Australia/Lindeman.standard.long=Hora est\u00E1ndar del Este (Queensland) +-Australia/Lord_Howe.generic.long=Hora de Lord Howe +-Australia/Melbourne.daylight.long=Hora de verano del Este (Victoria) +-Australia/Melbourne.generic.long=Hora Oriental (Victoria) +-Australia/Melbourne.standard.long=Hora est\u00E1ndar del Este (Victoria) +-Australia/NSW.daylight.long=Hora de verano Oriental (Nueva Gales del Sur) +-Australia/NSW.generic.long=Hora Oriental (Nueva Gales del Sur) +-Australia/NSW.standard.long=Hora est\u00E1ndar Oriental (Nueva Gales del Sur) +-Australia/North.daylight.long=Hora de verano Central (territorio del Norte) +-Australia/North.generic.long=Hora Central (Territorio Septentrional) +-Australia/North.standard.long=Hora est\u00E1ndar Central (territorio del Norte) +-Australia/Perth.daylight.long=Hora de verano Occidental (Australia) +-Australia/Perth.generic.long=Hora Occidental (Australia) +-Australia/Perth.standard.long=Hora est\u00E1ndar Occidental (Australia) +-Australia/Queensland.daylight.long=Hora est\u00E1ndar de verano del Este (Queensland) +-Australia/Queensland.generic.long=Hora Oriental (Queensland) +-Australia/Queensland.standard.long=Hora est\u00E1ndar del Este (Queensland) +-Australia/South.daylight.long=Hora de verano Central (Sur de Australia) +-Australia/South.generic.long=Hora Central (Australia del Sur) +-Australia/South.standard.long=Hora est\u00E1ndar Central (Sur de Australia) +-Australia/Sydney.daylight.long=Hora de verano Oriental (Nueva Gales del Sur) +-Australia/Sydney.generic.long=Hora Oriental (Nueva Gales del Sur) +-Australia/Sydney.standard.long=Hora est\u00E1ndar Oriental (Nueva Gales del Sur) +-Australia/Tasmania.daylight.long=Hora de verano del Este (Tasmania) +-Australia/Tasmania.generic.long=Hora Oriental (Tasmania) +-Australia/Tasmania.standard.long=Hora est\u00E1ndar del Este (Tasmania) +-Australia/Victoria.daylight.long=Hora de verano del Este (Victoria) +-Australia/Victoria.generic.long=Hora Oriental (Victoria) +-Australia/Victoria.standard.long=Hora est\u00E1ndar del Este (Victoria) +-Australia/West.daylight.long=Hora de verano Occidental (Australia) +-Australia/West.generic.long=Hora Occidental (Australia) +-Australia/West.standard.long=Hora est\u00E1ndar Occidental (Australia) +-Australia/Yancowinna.daylight.long=Hora de verano Central (Sur de Australia/Nueva Gales del Sur) +-Australia/Yancowinna.generic.long=Hora Central (Australia del Sur/Nueva Gales del Sur) +-Australia/Yancowinna.standard.long=Hora est\u00E1ndar Central (Sur de Australia/Nueva Gales del Sur) +-BET.generic.long=Hora de Brasil +-BST.generic.long=Hora de Bangladesh +-Brazil/Acre.generic.long=Hora de Acre +-Brazil/DeNoronha.generic.long=Hora de Fernando de Noronha +-Brazil/East.generic.long=Hora de Brasil +-Brazil/West.generic.long=Hora est\u00E1ndar de Amazonia +-CAT.generic.long=Hora de \u00C1frica Central +-CET.generic.long=Hora de Europa Central +-CNT.generic.long=Hora de Terranova +-CST.generic.long=Hora Central +-CST6CDT.generic.long=Hora Central +-CTT.generic.long=Hora de China +-Canada/Atlantic.generic.long=Hora del Atl\u00E1ntico +-Canada/Central.generic.long=Hora Central +-Canada/East-Saskatchewan.generic.long=Hora Central +-Canada/Eastern.generic.long=Hora Oriental +-Canada/Mountain.generic.long=Hora de las Monta\u00F1as Rocosas +-Canada/Newfoundland.generic.long=Hora de Terranova +-Canada/Pacific.generic.long=Hora del Pac\u00EDfico +-Canada/Saskatchewan.generic.long=Hora Central +-Canada/Yukon.generic.long=Hora del Pac\u00EDfico +-Chile/Continental.generic.long=Hora de Chile +-Chile/EasterIsland.generic.long=Hora de la Isla de Pascua +-Cuba.generic.long=Hora de Cuba +-EAT.generic.long=Hora de \u00C1frica Oriental +-ECT.generic.long=Hora de Europa Central +-EET.generic.long=Hora de Europa Oriental +-EST.generic.long=Hora Oriental +-EST5EDT.generic.long=Hora Oriental +-Egypt.generic.long=Hora de Europa Oriental +-Eire.generic.long=Hora de Irlanda +-Etc/Greenwich.generic.long=Hora del Meridiano de Greenwich +-Etc/UCT.generic.long=Hora Universal Coordinada +-Etc/UTC.generic.long=Hora Universal Coordinada +-Etc/Universal.generic.long=Hora Universal Coordinada +-Etc/Zulu.generic.long=Hora Universal Coordinada +-Europe/Amsterdam.generic.long=Hora de Europa Central +-Europe/Andorra.generic.long=Hora de Europa Central +-Europe/Athens.generic.long=Hora de Europa Oriental +-Europe/Belfast.generic.long=Hora de Gran Breta\u00F1a +-Europe/Belgrade.generic.long=Hora de Europa Central +-Europe/Berlin.generic.long=Hora de Europa Central +-Europe/Bratislava.generic.long=Hora de Europa Central +-Europe/Brussels.generic.long=Hora de Europa Central +-Europe/Bucharest.generic.long=Hora de Europa Oriental +-Europe/Budapest.generic.long=Hora de Europa Central +-Europe/Busingen.generic.long=Hora de Europa Central +-Europe/Chisinau.generic.long=Hora de Europa Oriental +-Europe/Copenhagen.generic.long=Hora de Europa Central +-Europe/Dublin.generic.long=Hora de Irlanda +-Europe/Gibraltar.generic.long=Hora de Europa Central +-Europe/Guernsey.generic.long=Hora de Gran Breta\u00F1a +-Europe/Helsinki.generic.long=Hora de Europa Oriental +-Europe/Isle_of_Man.generic.long=Hora de Gran Breta\u00F1a +-Europe/Istanbul.generic.long=Hora de Europa Oriental +-Europe/Jersey.generic.long=Hora de Gran Breta\u00F1a +-Europe/Kaliningrad.daylight.long=Hora de verano de Europa m\u00E1s Oriental +-Europe/Kaliningrad.generic.long=Hora de Europa m\u00E1s Oriental +-Europe/Kaliningrad.standard.long=Hora de Europa m\u00E1s Oriental +-Europe/Kiev.generic.long=Hora de Europa Oriental +-Europe/Lisbon.generic.long=Hora de Europa Occidental +-Europe/Ljubljana.generic.long=Hora de Europa Central +-Europe/London.generic.long=Hora de Gran Breta\u00F1a +-Europe/Luxembourg.generic.long=Hora de Europa Central +-Europe/Madrid.generic.long=Hora de Europa Central +-Europe/Malta.generic.long=Hora de Europa Central +-Europe/Mariehamn.generic.long=Hora de Europa Oriental +-Europe/Minsk.daylight.long=Hora de verano de Europa m\u00E1s Oriental +-Europe/Minsk.generic.long=Hora de Europa m\u00E1s Oriental +-Europe/Minsk.standard.long=Hora de Europa m\u00E1s Oriental +-Europe/Monaco.generic.long=Hora de Europa Central +-Europe/Moscow.generic.long=Hora de Mosc\u00FA +-Europe/Nicosia.generic.long=Hora de Europa Oriental +-Europe/Oslo.generic.long=Hora de Europa Central +-Europe/Paris.generic.long=Hora de Europa Central +-Europe/Podgorica.generic.long=Hora de Europa Central +-Europe/Prague.generic.long=Hora de Europa Central +-Europe/Riga.generic.long=Hora de Europa Oriental +-Europe/Rome.generic.long=Hora de Europa Central +-Europe/Samara.generic.long=Hora de Samara +-Europe/San_Marino.generic.long=Hora de Europa Central +-Europe/Sarajevo.generic.long=Hora de Europa Central +-Europe/Simferopol.generic.long=Hora de Europa Oriental +-Europe/Skopje.generic.long=Hora de Europa Central +-Europe/Sofia.generic.long=Hora de Europa Oriental +-Europe/Stockholm.generic.long=Hora de Europa Central +-Europe/Tallinn.generic.long=Hora de Europa Oriental +-Europe/Tirane.generic.long=Hora de Europa Central +-Europe/Tiraspol.generic.long=Hora de Europa Oriental +-Europe/Uzhgorod.generic.long=Hora de Europa Oriental +-Europe/Vaduz.generic.long=Hora de Europa Central +-Europe/Vatican.generic.long=Hora de Europa Central +-Europe/Vienna.generic.long=Hora de Europa Central +-Europe/Vilnius.generic.long=Hora de Europa Oriental +-Europe/Volgograd.generic.long=Hora de Volgogrado +-Europe/Warsaw.generic.long=Hora de Europa Central +-Europe/Zagreb.generic.long=Hora de Europa Central +-Europe/Zaporozhye.generic.long=Hora de Europa Oriental +-Europe/Zurich.generic.long=Hora de Europa Central +-GB-Eire.generic.long=Hora de Gran Breta\u00F1a +-GB.generic.long=Hora de Gran Breta\u00F1a +-GMT.generic.long=Hora del Meridiano de Greenwich +-Greenwich.generic.long=Hora del Meridiano de Greenwich +-HST.generic.long=Hora de Hawaii +-Hongkong.generic.long=Hora de Hong Kong +-IET.generic.long=Hora Oriental +-IST.generic.long=Hora de India +-Iceland.generic.long=Hora del Meridiano de Greenwich +-Indian/Antananarivo.generic.long=Hora de \u00C1frica Oriental +-Indian/Chagos.generic.long=Hora del Territorio del Oc\u00E9ano \u00CDndico +-Indian/Christmas.generic.long=Hora de la isla de Christmas +-Indian/Cocos.generic.long=Hora de las islas Cocos +-Indian/Comoro.generic.long=Hora de \u00C1frica Oriental +-Indian/Kerguelen.generic.long=Hora de los Territorios Franceses del Sur y de la Ant\u00E1rtida +-Indian/Mahe.generic.long=Hora de Seychelles +-Indian/Maldives.generic.long=Hora de Maldivas +-Indian/Mauritius.generic.long=Hora de Mauricio +-Indian/Mayotte.generic.long=Hora de \u00C1frica Oriental +-Indian/Reunion.generic.long=Hora de Reuni\u00F3n +-Iran.generic.long=Hora de Ir\u00E1n +-Israel.generic.long=Hora de Israel +-JST.generic.long=Hora de Jap\u00F3n +-Jamaica.generic.long=Hora Oriental +-Japan.generic.long=Hora de Jap\u00F3n +-Kwajalein.generic.long=Hora de Islas Marshall +-Libya.generic.long=Hora de Europa Oriental +-MET.generic.long=MET +-MIT.generic.long=Hora de Samoa Occidental +-MST.generic.long=Hora de las Monta\u00f1as Rocosas +-MST7MDT.generic.long=Hora de las Monta\u00f1as Rocosas +-Mexico/BajaNorte.generic.long=Hora del Pac\u00EDfico +-Mexico/BajaSur.generic.long=Hora de las Monta\u00F1as Rocosas +-Mexico/General.generic.long=Hora Central +-NET.generic.long=Hora de Armenia +-NST.generic.long=Hora de Nueva Zelanda +-NZ-CHAT.generic.long=Hora de Chatam +-NZ.generic.long=Hora de Nueva Zelanda +-Navajo.generic.long=Hora de las Monta\u00F1as Rocosas +-PLT.generic.long=Hora de Pakist\u00E1n +-PNT.generic.long=Hora de las Monta\u00F1as Rocosas +-PRC.generic.long=Hora de China +-PRT.generic.long=Hora del Atl\u00E1ntico +-PST.generic.long=Hora del Pac\u00EDfico +-PST8PDT.generic.long=Hora del Pac\u00edfico +-Pacific/Apia.generic.long=Hora de Samoa Occidental +-Pacific/Auckland.generic.long=Hora de Nueva Zelanda +-Pacific/Chatham.generic.long=Hora de Chatam +-Pacific/Chuuk.daylight.long=Hora de verano de Chuuk +-Pacific/Chuuk.generic.long=Hora de Chuuk +-Pacific/Chuuk.standard.long=Hora de Chuuk +-Pacific/Easter.generic.long=Hora de la Isla de Pascua +-Pacific/Efate.generic.long=Hora de Vanuatu +-Pacific/Enderbury.generic.long=Hora de la isla Phoenix +-Pacific/Fakaofo.generic.long=Hora de Tokelau +-Pacific/Fiji.generic.long=Hora de Fiji +-Pacific/Funafuti.generic.long=Hora de Tuvalu +-Pacific/Galapagos.generic.long=Hora de Gal\u00E1pagos +-Pacific/Gambier.generic.long=Hora de Gambier +-Pacific/Guadalcanal.generic.long=Hora de las Islas Solomon +-Pacific/Guam.generic.long=Hora de Chamorro +-Pacific/Honolulu.generic.long=Hora de Hawaii +-Pacific/Johnston.generic.long=Hora de Hawaii +-Pacific/Kiritimati.generic.long=Hora de las islas Line +-Pacific/Kosrae.generic.long=Hora de Kosrae +-Pacific/Kwajalein.generic.long=Hora de Islas Marshall +-Pacific/Majuro.generic.long=Hora de Islas Marshall +-Pacific/Marquesas.generic.long=Hora de Marquesas +-Pacific/Midway.generic.long=Hora de Samoa +-Pacific/Nauru.generic.long=Hora de Nauru +-Pacific/Niue.generic.long=Hora de Niue +-Pacific/Norfolk.generic.long=Hora de Norfolk +-Pacific/Noumea.generic.long=Hora de Nueva Caledonia +-Pacific/Pago_Pago.generic.long=Hora de Samoa +-Pacific/Palau.generic.long=Hora de Palau +-Pacific/Pitcairn.generic.long=Hora de Islas Pitcairn +-Pacific/Pohnpei.daylight.long=Hora de verano de Pohnpei +-Pacific/Pohnpei.generic.long=Hora de Pohnpei +-Pacific/Pohnpei.standard.long=Hora de Pohnpei +-Pacific/Ponape.daylight.long=Hora de verano de Pohnpei +-Pacific/Ponape.generic.long=Hora de Pohnpei +-Pacific/Ponape.standard.long=Hora de Pohnpei +-Pacific/Port_Moresby.generic.long=Hora de Pap\u00FAa-Nueva Guinea +-Pacific/Rarotonga.generic.long=Hora de las islas Cook +-Pacific/Saipan.generic.long=Hora de Chamorro +-Pacific/Samoa.generic.long=Hora de Samoa +-Pacific/Tahiti.generic.long=Hora de Tahit\u00ED +-Pacific/Tarawa.generic.long=Hora de las islas Gilbert +-Pacific/Tongatapu.generic.long=Hora de Tonga +-Pacific/Truk.daylight.long=Hora de verano de Chuuk +-Pacific/Truk.generic.long=Hora de Chuuk +-Pacific/Truk.standard.long=Hora de Chuuk +-Pacific/Wake.generic.long=Hora de Wake +-Pacific/Wallis.generic.long=Hora de Wallis y Futuna +-Pacific/Yap.daylight.long=Hora de verano de Chuuk +-Pacific/Yap.generic.long=Hora de Chuuk +-Pacific/Yap.standard.long=Hora de Chuuk +-Poland.generic.long=Hora de Europa Central +-Portugal.generic.long=Hora de Europa Occidental +-ROK.generic.long=Hora de Corea +-SST.generic.long=Hora de las Islas Solomon +-Singapore.generic.long=Hora de Singapur +-SystemV/AST4.generic.long=Hora del Atl\u00E1ntico +-SystemV/AST4ADT.generic.long=Hora del Atl\u00E1ntico +-SystemV/CST6.generic.long=Hora Central +-SystemV/CST6CDT.generic.long=Hora Central +-SystemV/EST5.generic.long=Hora Oriental +-SystemV/EST5EDT.generic.long=Hora Oriental +-SystemV/HST10.generic.long=Hora de Hawaii +-SystemV/MST7.generic.long=Hora de las Monta\u00F1as Rocosas +-SystemV/MST7MDT.generic.long=Hora de las Monta\u00F1as Rocosas +-SystemV/PST8.generic.long=Hora del Pac\u00EDfico +-SystemV/PST8PDT.generic.long=Hora del Pac\u00EDfico +-SystemV/YST9.generic.long=Hora de Alaska +-SystemV/YST9YDT.generic.long=Hora de Alaska +-Turkey.generic.long=Hora de Europa Oriental +-UCT.generic.long=Hora Universal Coordinada +-US/Alaska.generic.long=Hora de Alaska +-US/Aleutian.generic.long=Hora de Hawaii-Aleutian +-US/Arizona.generic.long=Hora de las Monta\u00F1as Rocosas +-US/Central.generic.long=Hora Central +-US/East-Indiana.generic.long=Hora Oriental +-US/Eastern.generic.long=Hora Oriental +-US/Hawaii.generic.long=Hora de Hawaii +-US/Indiana-Starke.generic.long=Hora Central +-US/Michigan.generic.long=Hora Oriental +-US/Mountain.generic.long=Hora de las Monta\u00F1as Rocosas +-US/Pacific-New.generic.long=Hora del Pac\u00EDfico +-US/Pacific.generic.long=Hora del Pac\u00EDfico +-US/Samoa.generic.long=Hora de Samoa +-UTC.generic.long=Hora Universal Coordinada +-Universal.generic.long=Hora Universal Coordinada +-VST.generic.long=Hora de Indochina +-W-SU.generic.long=Hora de Mosc\u00FA +-WET.generic.long=Hora de Europa Occidental +-Zulu.generic.long=Hora Universal Coordinada +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_es_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_es_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_fr.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_fr.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=Heure d'\u00E9t\u00E9 d'Australie centrale (Territoire du Nord) +-ACT.generic.long=Centre (Territoire du Nord) +-ACT.standard.long=Heure standard d'Australie centrale (Territoire du Nord) +-AET.daylight.long=Heure d'\u00E9t\u00E9 de l'Est (Nouvelle-Galles du Sud) +-AET.generic.long=C\u00F4te Est (Nouvelle-Galles du Sud) +-AET.standard.long=Heure normale de l'Est (Nouvelle-Galles du Sud) +-AGT.generic.long=Heure d'Argentine +-ART.generic.long=Heure d'Europe de l'Est +-AST.generic.long=Alaska +-Africa/Abidjan.generic.long=Heure de Greenwich +-Africa/Accra.generic.long=Heure du Ghana +-Africa/Addis_Ababa.generic.long=Heure d'Afrique de l'Est +-Africa/Algiers.generic.long=Heure d'Europe centrale +-Africa/Asmara.generic.long=Heure d'Afrique de l'Est +-Africa/Asmera.generic.long=Heure d'Afrique de l'Est +-Africa/Bamako.generic.long=Heure de Greenwich +-Africa/Bangui.generic.long=Heure d'Afrique de l'Ouest +-Africa/Banjul.generic.long=Heure de Greenwich +-Africa/Bissau.generic.long=Heure de Greenwich +-Africa/Blantyre.generic.long=Heure d'Afrique centrale +-Africa/Brazzaville.generic.long=Heure d'Afrique de l'Ouest +-Africa/Bujumbura.generic.long=Heure d'Afrique centrale +-Africa/Cairo.generic.long=Heure d'Europe de l'Est +-Africa/Casablanca.generic.long=Heure d'Europe de l'Ouest +-Africa/Ceuta.generic.long=Heure d'Europe centrale +-Africa/Conakry.generic.long=Heure de Greenwich +-Africa/Dakar.generic.long=Heure de Greenwich +-Africa/Dar_es_Salaam.generic.long=Heure d'Afrique de l'Est +-Africa/Djibouti.generic.long=Heure d'Afrique de l'Est +-Africa/Douala.generic.long=Heure d'Afrique de l'Ouest +-Africa/El_Aaiun.generic.long=Heure d'Europe de l'Ouest +-Africa/Freetown.generic.long=Heure de Sierra Leone +-Africa/Gaborone.generic.long=Heure d'Afrique centrale +-Africa/Harare.generic.long=Heure d'Afrique centrale +-Africa/Johannesburg.generic.long=Afrique du Sud +-Africa/Juba.generic.long=Heure d'Afrique de l'Est +-Africa/Kampala.generic.long=Heure d'Afrique de l'Est +-Africa/Khartoum.generic.long=Heure d'Afrique de l'Est +-Africa/Kigali.generic.long=Heure d'Afrique centrale +-Africa/Kinshasa.generic.long=Heure d'Afrique de l'Ouest +-Africa/Lagos.generic.long=Heure d'Afrique de l'Ouest +-Africa/Libreville.generic.long=Heure d'Afrique de l'Ouest +-Africa/Lome.generic.long=Heure de Greenwich +-Africa/Luanda.generic.long=Heure d'Afrique de l'Ouest +-Africa/Lubumbashi.generic.long=Heure d'Afrique centrale +-Africa/Lusaka.generic.long=Heure d'Afrique centrale +-Africa/Malabo.generic.long=Heure d'Afrique de l'Ouest +-Africa/Maputo.generic.long=Heure d'Afrique centrale +-Africa/Maseru.generic.long=Afrique du Sud +-Africa/Mbabane.generic.long=Afrique du Sud +-Africa/Mogadishu.generic.long=Heure d'Afrique de l'Est +-Africa/Monrovia.generic.long=Heure de Greenwich +-Africa/Nairobi.generic.long=Heure d'Afrique de l'Est +-Africa/Ndjamena.generic.long=Heure d'Afrique de l'Ouest +-Africa/Niamey.generic.long=Heure d'Afrique de l'Ouest +-Africa/Nouakchott.generic.long=Heure de Greenwich +-Africa/Ouagadougou.generic.long=Heure de Greenwich +-Africa/Porto-Novo.generic.long=Heure d'Afrique de l'Ouest +-Africa/Sao_Tome.generic.long=Heure de Greenwich +-Africa/Timbuktu.generic.long=Heure de Greenwich +-Africa/Tripoli.generic.long=Heure d'Europe de l'Est +-Africa/Tunis.generic.long=Heure d'Europe centrale +-Africa/Windhoek.generic.long=Heure d'Afrique de l'Ouest +-America/Adak.generic.long=Hawa\u00EF-Iles Al\u00E9outiennes +-America/Anchorage.generic.long=Alaska +-America/Anguilla.generic.long=Atlantique +-America/Antigua.generic.long=Atlantique +-America/Araguaina.generic.long=Heure du Br\u00E9sil +-America/Argentina/Buenos_Aires.generic.long=Heure d'Argentine +-America/Argentina/Catamarca.generic.long=Heure d'Argentine +-America/Argentina/ComodRivadavia.generic.long=Heure d'Argentine +-America/Argentina/Cordoba.generic.long=Heure d'Argentine +-America/Argentina/Jujuy.generic.long=Heure d'Argentine +-America/Argentina/La_Rioja.generic.long=Heure d'Argentine +-America/Argentina/Mendoza.generic.long=Heure d'Argentine +-America/Argentina/Rio_Gallegos.generic.long=Heure d'Argentine +-America/Argentina/Salta.generic.long=Heure d'Argentine +-America/Argentina/San_Juan.generic.long=Heure d'Argentine +-America/Argentina/San_Luis.generic.long=Heure d'Argentine +-America/Argentina/Tucuman.generic.long=Heure d'Argentine +-America/Argentina/Ushuaia.generic.long=Heure d'Argentine +-America/Aruba.generic.long=Atlantique +-America/Asuncion.generic.long=Heure du Paraguay +-America/Atikokan.generic.long=C\u00F4te Est +-America/Atka.generic.long=Hawa\u00EF-Iles Al\u00E9outiennes +-America/Bahia.generic.long=Heure du Br\u00E9sil +-America/Bahia_Banderas.generic.long=Centre +-America/Barbados.generic.long=Atlantique +-America/Belem.generic.long=Heure du Br\u00E9sil +-America/Belize.generic.long=Centre +-America/Blanc-Sablon.generic.long=Atlantique +-America/Boa_Vista.generic.long=Heure d'Amazonie +-America/Bogota.generic.long=Heure de Colombie +-America/Boise.generic.long=Rocheuses +-America/Buenos_Aires.generic.long=Heure d'Argentine +-America/Cambridge_Bay.generic.long=Rocheuses +-America/Campo_Grande.generic.long=Heure d'Amazonie +-America/Cancun.generic.long=Centre +-America/Caracas.generic.long=Heure du Venezuela +-America/Catamarca.generic.long=Heure d'Argentine +-America/Cayenne.generic.long=Heure de Guyane fran\u00E7aise +-America/Cayman.generic.long=C\u00F4te Est +-America/Chicago.generic.long=Centre +-America/Chihuahua.generic.long=Rocheuses +-America/Coral_Harbour.generic.long=C\u00F4te Est +-America/Cordoba.generic.long=Heure d'Argentine +-America/Costa_Rica.generic.long=Centre +-America/Creston.generic.long=Rocheuses +-America/Cuiaba.generic.long=Heure d'Amazonie +-America/Curacao.generic.long=Atlantique +-America/Danmarkshavn.generic.long=Heure de Greenwich +-America/Dawson.generic.long=Pacifique +-America/Dawson_Creek.generic.long=Rocheuses +-America/Denver.generic.long=Rocheuses +-America/Detroit.generic.long=C\u00F4te Est +-America/Dominica.generic.long=Atlantique +-America/Edmonton.generic.long=Rocheuses +-America/Eirunepe.generic.long=Heure de l'Acre +-America/El_Salvador.generic.long=Centre +-America/Ensenada.generic.long=Pacifique +-America/Fort_Wayne.generic.long=C\u00F4te Est +-America/Fortaleza.generic.long=Heure du Br\u00E9sil +-America/Glace_Bay.generic.long=Atlantique +-America/Godthab.generic.long=Heure du Groenland de l'Ouest +-America/Goose_Bay.generic.long=Atlantique +-America/Grand_Turk.generic.long=C\u00F4te Est +-America/Grenada.generic.long=Atlantique +-America/Guadeloupe.generic.long=Atlantique +-America/Guatemala.generic.long=Centre +-America/Guayaquil.generic.long=Heure de l'Equateur +-America/Guyana.generic.long=Heure de Guyana +-America/Halifax.generic.long=Atlantique +-America/Havana.generic.long=Heure de Cuba +-America/Hermosillo.generic.long=Rocheuses +-America/Indiana/Indianapolis.generic.long=C\u00F4te Est +-America/Indiana/Knox.generic.long=Centre +-America/Indiana/Marengo.generic.long=C\u00F4te Est +-America/Indiana/Petersburg.generic.long=C\u00F4te Est +-America/Indiana/Tell_City.generic.long=Centre +-America/Indiana/Vevay.generic.long=C\u00F4te Est +-America/Indiana/Vincennes.generic.long=C\u00F4te Est +-America/Indiana/Winamac.generic.long=C\u00F4te Est +-America/Indianapolis.generic.long=C\u00F4te Est +-America/Inuvik.generic.long=Rocheuses +-America/Iqaluit.generic.long=C\u00F4te Est +-America/Jamaica.generic.long=C\u00F4te Est +-America/Jujuy.generic.long=Heure d'Argentine +-America/Juneau.generic.long=Alaska +-America/Kentucky/Louisville.generic.long=C\u00F4te Est +-America/Kentucky/Monticello.generic.long=C\u00F4te Est +-America/Knox_IN.generic.long=Centre +-America/Kralendijk.generic.long=Atlantique +-America/La_Paz.generic.long=Heure de Bolivie +-America/Lima.generic.long=Heure du P\u00E9rou +-America/Los_Angeles.generic.long=Pacifique +-America/Louisville.generic.long=C\u00F4te Est +-America/Lower_Princes.generic.long=Atlantique +-America/Maceio.generic.long=Heure du Br\u00E9sil +-America/Managua.generic.long=Centre +-America/Manaus.generic.long=Heure d'Amazonie +-America/Marigot.generic.long=Atlantique +-America/Martinique.generic.long=Atlantique +-America/Matamoros.generic.long=Centre +-America/Mazatlan.generic.long=Rocheuses +-America/Mendoza.generic.long=Heure d'Argentine +-America/Menominee.generic.long=Centre +-America/Merida.generic.long=Centre +-America/Metlakatla.daylight.long=Heure avanc\u00E9e de Metlakatla +-America/Metlakatla.generic.long=Heure de Metlakatla +-America/Metlakatla.standard.long=Heure normale de Metlakatla +-America/Mexico_City.generic.long=Centre +-America/Miquelon.generic.long=Saint-Pierre-et-Miquelon +-America/Moncton.generic.long=Atlantique +-America/Monterrey.generic.long=Centre +-America/Montevideo.generic.long=Heure de l'Uruguay +-America/Montreal.generic.long=C\u00F4te Est +-America/Montserrat.generic.long=Atlantique +-America/Nassau.generic.long=C\u00F4te Est +-America/New_York.generic.long=C\u00F4te Est +-America/Nipigon.generic.long=C\u00F4te Est +-America/Nome.generic.long=Alaska +-America/Noronha.generic.long=Heure de Fernando de Noronha +-America/North_Dakota/Beulah.generic.long=Centre +-America/North_Dakota/Center.generic.long=Centre +-America/North_Dakota/New_Salem.generic.long=Centre +-America/Ojinaga.generic.long=Rocheuses +-America/Panama.generic.long=C\u00F4te Est +-America/Pangnirtung.generic.long=C\u00F4te Est +-America/Paramaribo.generic.long=Heure du Surinam +-America/Phoenix.generic.long=Rocheuses +-America/Port-au-Prince.generic.long=C\u00F4te Est +-America/Port_of_Spain.generic.long=Atlantique +-America/Porto_Acre.generic.long=Heure de l'Acre +-America/Porto_Velho.generic.long=Heure d'Amazonie +-America/Puerto_Rico.generic.long=Atlantique +-America/Rainy_River.generic.long=Centre +-America/Rankin_Inlet.generic.long=Centre +-America/Recife.generic.long=Heure du Br\u00E9sil +-America/Regina.generic.long=Centre +-America/Resolute.generic.long=Centre +-America/Rio_Branco.generic.long=Heure de l'Acre +-America/Rosario.generic.long=Heure d'Argentine +-America/Santa_Isabel.generic.long=Pacifique +-America/Santarem.generic.long=Heure du Br\u00E9sil +-America/Santiago.generic.long=Heure du Chili +-America/Santo_Domingo.generic.long=Atlantique +-America/Sao_Paulo.generic.long=Heure du Br\u00E9sil +-America/Scoresbysund.generic.long=Heure du Groenland de l'Est +-America/Shiprock.generic.long=Rocheuses +-America/Sitka.generic.long=Alaska +-America/St_Barthelemy.generic.long=Atlantique +-America/St_Johns.generic.long=Terre-Neuve +-America/St_Kitts.generic.long=Atlantique +-America/St_Lucia.generic.long=Atlantique +-America/St_Thomas.generic.long=Atlantique +-America/St_Vincent.generic.long=Atlantique +-America/Swift_Current.generic.long=Centre +-America/Tegucigalpa.generic.long=Centre +-America/Thule.generic.long=Atlantique +-America/Thunder_Bay.generic.long=C\u00F4te Est +-America/Tijuana.generic.long=Pacifique +-America/Toronto.generic.long=C\u00F4te Est +-America/Tortola.generic.long=Atlantique +-America/Vancouver.generic.long=Pacifique +-America/Virgin.generic.long=Atlantique +-America/Whitehorse.generic.long=Pacifique +-America/Winnipeg.generic.long=Centre +-America/Yakutat.generic.long=Alaska +-America/Yellowknife.generic.long=Rocheuses +-Antarctica/Casey.daylight.long=Heure d'\u00E9t\u00E9 de l'Ouest (Australie) +-Antarctica/Casey.generic.long=Ouest (Australie) +-Antarctica/Casey.standard.long=Heure normale de l'Ouest (Australie) +-Antarctica/Davis.generic.long=Heure de Davis +-Antarctica/DumontDUrville.generic.long=Heure de Dumont-d'Urville +-Antarctica/Macquarie.daylight.long=Heure d'\u00E9t\u00E9 de l'Ile Macquarie +-Antarctica/Macquarie.generic.long=Heure de l'Ile Macquarie +-Antarctica/Macquarie.standard.long=Heure de l'Ile Macquarie +-Antarctica/Mawson.generic.long=Heure de Mawson +-Antarctica/McMurdo.generic.long=Nouvelle-Z\u00E9lande +-Antarctica/Palmer.generic.long=Heure du Chili +-Antarctica/Rothera.generic.long=Heure de Rothera +-Antarctica/South_Pole.generic.long=Nouvelle-Z\u00E9lande +-Antarctica/Syowa.generic.long=Heure de Syowa +-Antarctica/Vostok.generic.long=Heure de Vostok +-Arctic/Longyearbyen.generic.long=Heure d'Europe centrale +-Asia/Aden.generic.long=Arabie +-Asia/Almaty.generic.long=Heure d'Alma-Ata +-Asia/Amman.generic.long=Arabie +-Asia/Anadyr.generic.long=Heure d'Anadyr +-Asia/Aqtau.generic.long=Heure d'Aqtau +-Asia/Aqtobe.generic.long=Heure d'Aqtobe +-Asia/Ashgabat.generic.long=Heure du Turkm\u00E9nistan +-Asia/Ashkhabad.generic.long=Heure du Turkm\u00E9nistan +-Asia/Baghdad.generic.long=Arabie +-Asia/Bahrain.generic.long=Arabie +-Asia/Baku.generic.long=Heure d'Azerba\u00EFdjan +-Asia/Bangkok.generic.long=Heure d'Indochine +-Asia/Beirut.generic.long=Heure d'Europe de l'Est +-Asia/Bishkek.generic.long=Heure du Kirghizistan +-Asia/Brunei.generic.long=Heure du Brunei +-Asia/Calcutta.generic.long=Inde +-Asia/Choibalsan.generic.long=Heure de Choibalsan +-Asia/Chongqing.generic.long=Chine +-Asia/Chungking.generic.long=Chine +-Asia/Colombo.generic.long=Inde +-Asia/Dacca.generic.long=Heure du Bangladesh +-Asia/Damascus.generic.long=Heure d'Europe de l'Est +-Asia/Dhaka.generic.long=Heure du Bangladesh +-Asia/Dili.generic.long=Heure de Timor-Leste +-Asia/Dubai.generic.long=Golfe +-Asia/Dushanbe.generic.long=Heure du Tadjikistan +-Asia/Gaza.generic.long=Heure d'Europe de l'Est +-Asia/Harbin.generic.long=Chine +-Asia/Hebron.generic.long=Heure d'Europe de l'Est +-Asia/Ho_Chi_Minh.generic.long=Heure d'Indochine +-Asia/Hong_Kong.generic.long=Heure de Hong-Kong +-Asia/Hovd.generic.long=Heure de Hovd +-Asia/Irkutsk.generic.long=Heure d'Irkutsk +-Asia/Istanbul.generic.long=Heure d'Europe de l'Est +-Asia/Jakarta.generic.long=Heure de l'Indon\u00E9sie occidentale +-Asia/Jayapura.generic.long=Heure d'Indon\u00E9sie orientale +-Asia/Jerusalem.generic.long=Isra\u00EBl +-Asia/Kabul.generic.long=Heure d'Afghanistan +-Asia/Kamchatka.generic.long=Heure de Petropavlovsk-Kamchatski +-Asia/Karachi.generic.long=Heure du Pakistan +-Asia/Kashgar.generic.long=Chine +-Asia/Kathmandu.generic.long=Heure du N\u00E9pal +-Asia/Katmandu.generic.long=Heure du N\u00E9pal +-Asia/Khandyga.daylight.long=Heure d'\u00E9t\u00E9 de Khandyga +-Asia/Khandyga.generic.long=Heure de Khandyga +-Asia/Khandyga.standard.long=Heure de Khandyga +-Asia/Kolkata.generic.long=Inde +-Asia/Krasnoyarsk.generic.long=Heure de Krasno\u00EFarsk +-Asia/Kuala_Lumpur.generic.long=Heure de Malaisie +-Asia/Kuching.generic.long=Heure de Malaisie +-Asia/Kuwait.generic.long=Arabie +-Asia/Macao.generic.long=Chine +-Asia/Macau.generic.long=Chine +-Asia/Magadan.generic.long=Heure de Magadan +-Asia/Makassar.generic.long=Heure d'Indon\u00E9sie centrale +-Asia/Manila.generic.long=Heure des Philippines +-Asia/Muscat.generic.long=Golfe +-Asia/Nicosia.generic.long=Heure d'Europe de l'Est +-Asia/Novokuznetsk.generic.long=Heure de Novossibirsk +-Asia/Novosibirsk.generic.long=Heure de Novossibirsk +-Asia/Omsk.generic.long=Heure d'Omsk +-Asia/Oral.generic.long=Heure d'Oral +-Asia/Phnom_Penh.generic.long=Heure d'Indochine +-Asia/Pontianak.generic.long=Heure de l'Indon\u00E9sie occidentale +-Asia/Pyongyang.generic.long=Cor\u00E9e +-Asia/Qatar.generic.long=Arabie +-Asia/Qyzylorda.generic.long=Heure de Kyzylorda +-Asia/Rangoon.generic.long=Heure de Myanmar +-Asia/Saigon.generic.long=Heure d'Indochine +-Asia/Sakhalin.generic.long=Heure de Sakhalin +-Asia/Samarkand.generic.long=Heure de l'Ouzb\u00E9kistan +-Asia/Seoul.generic.long=Cor\u00E9e +-Asia/Shanghai.generic.long=Chine +-Asia/Singapore.generic.long=Heure de Singapour +-Asia/Taipei.generic.long=Chine +-Asia/Tashkent.generic.long=Heure de l'Ouzb\u00E9kistan +-Asia/Tbilisi.generic.long=Heure de G\u00E9orgie +-Asia/Tehran.generic.long=Heure d'Iran +-Asia/Tel_Aviv.generic.long=Isra\u00EBl +-Asia/Thimbu.generic.long=Heure du Bhoutan +-Asia/Thimphu.generic.long=Heure du Bhoutan +-Asia/Tokyo.generic.long=Japon +-Asia/Ujung_Pandang.generic.long=Heure d'Indon\u00E9sie centrale +-Asia/Ulaanbaatar.generic.long=Heure de l'Ulaanbaatar +-Asia/Ulan_Bator.generic.long=Heure de l'Ulaanbaatar +-Asia/Urumqi.generic.long=Chine +-Asia/Ust-Nera.daylight.long=Heure d'\u00E9t\u00E9 d'Ust-Nera +-Asia/Ust-Nera.generic.long=Heure d'Ust-Nera +-Asia/Ust-Nera.standard.long=Heure d'Ust-Nera +-Asia/Vientiane.generic.long=Heure d'Indochine +-Asia/Vladivostok.generic.long=Heure de Vladivostok +-Asia/Yakutsk.generic.long=Heure du Iakoutsk +-Asia/Yekaterinburg.generic.long=Heure de Yekaterinburg +-Asia/Yerevan.generic.long=Heure d'Arm\u00E9nie +-Atlantic/Azores.generic.long=Heure des A\u00E7ores +-Atlantic/Bermuda.generic.long=Atlantique +-Atlantic/Canary.generic.long=Heure d'Europe de l'Ouest +-Atlantic/Cape_Verde.generic.long=Heure de Cap-Vert +-Atlantic/Faeroe.generic.long=Heure d'Europe de l'Ouest +-Atlantic/Faroe.generic.long=Heure d'Europe de l'Ouest +-Atlantic/Jan_Mayen.generic.long=Heure d'Europe centrale +-Atlantic/Madeira.generic.long=Heure d'Europe de l'Ouest +-Atlantic/Reykjavik.generic.long=Heure de Greenwich +-Atlantic/South_Georgia.generic.long=G\u00E9orgie du Sud +-Atlantic/St_Helena.generic.long=Heure de Greenwich +-Atlantic/Stanley.generic.long=Heure des \u00EEles Falkland +-Australia/ACT.daylight.long=Heure d'\u00E9t\u00E9 de l'Est (Nouvelle-Galles du Sud) +-Australia/ACT.generic.long=C\u00F4te Est (Nouvelle-Galles du Sud) +-Australia/ACT.standard.long=Heure normale de l'Est (Nouvelle-Galles du Sud) +-Australia/Adelaide.daylight.long=Heure d'\u00E9t\u00E9 d'Australie centrale (Australie du sud) +-Australia/Adelaide.generic.long=Centre (Australie-M\u00E9ridionale) +-Australia/Adelaide.standard.long=Heure standard d'Australie centrale (Australie du sud) +-Australia/Brisbane.daylight.long=Heure d'\u00E9t\u00E9 d'Australie orientale (Queensland) +-Australia/Brisbane.generic.long=C\u00F4te Est (Queensland) +-Australia/Brisbane.standard.long=Heure standard d'Australie orientale (Queensland) +-Australia/Broken_Hill.daylight.long=Heure d'\u00E9t\u00E9 d'Australie centrale (Australie du sud/Nouvelle-Galles du sud) +-Australia/Broken_Hill.generic.long=Centre (Australie-M\u00E9ridionale/Nouvelle-Galles du Sud) +-Australia/Broken_Hill.standard.long=Heure standard d'Australie centrale (Australie du sud/Nouvelle-Galles du sud) +-Australia/Canberra.daylight.long=Heure d'\u00E9t\u00E9 de l'Est (Nouvelle-Galles du Sud) +-Australia/Canberra.generic.long=C\u00F4te Est (Nouvelle-Galles du Sud) +-Australia/Canberra.standard.long=Heure normale de l'Est (Nouvelle-Galles du Sud) +-Australia/Currie.daylight.long=Heure d'\u00E9t\u00E9 de l'Est (Nouvelle-Galles du Sud) +-Australia/Currie.generic.long=C\u00F4te Est (Nouvelle-Galles du Sud) +-Australia/Currie.standard.long=Heure normale de l'Est (Nouvelle-Galles du Sud) +-Australia/Darwin.daylight.long=Heure d'\u00E9t\u00E9 d'Australie centrale (Territoire du Nord) +-Australia/Darwin.generic.long=Centre (Territoire du Nord) +-Australia/Darwin.standard.long=Heure standard d'Australie centrale (Territoire du Nord) +-Australia/Eucla.daylight.long=Heure d'\u00E9t\u00E9 de l'Australie occidentale (centre) +-Australia/Eucla.generic.long=Heure de l'Australie occidentale (centre) +-Australia/Eucla.standard.long=Heure standard de l'Australie occidentale (centre) +-Australia/Hobart.daylight.long=Heure d'\u00E9t\u00E9 d'Australie orientale (Tasmanie) +-Australia/Hobart.generic.long=C\u00F4te Est (Tasmanie) +-Australia/Hobart.standard.long=Heure standard d'Australie orientale (Tasmanie) +-Australia/LHI.generic.long=Heure de Lord Howe +-Australia/Lindeman.daylight.long=Heure d'\u00E9t\u00E9 d'Australie orientale (Queensland) +-Australia/Lindeman.generic.long=C\u00F4te Est (Queensland) +-Australia/Lindeman.standard.long=Heure standard d'Australie orientale (Queensland) +-Australia/Lord_Howe.generic.long=Heure de Lord Howe +-Australia/Melbourne.daylight.long=Heure d'\u00E9t\u00E9 d'Australie orientale (Victoria) +-Australia/Melbourne.generic.long=C\u00F4te Est (Victoria) +-Australia/Melbourne.standard.long=Heure standard d'Australie orientale (Victoria) +-Australia/NSW.daylight.long=Heure d'\u00E9t\u00E9 de l'Est (Nouvelle-Galles du Sud) +-Australia/NSW.generic.long=C\u00F4te Est (Nouvelle-Galles du Sud) +-Australia/NSW.standard.long=Heure normale de l'Est (Nouvelle-Galles du Sud) +-Australia/North.daylight.long=Heure d'\u00E9t\u00E9 d'Australie centrale (Territoire du Nord) +-Australia/North.generic.long=Centre (Territoire du Nord) +-Australia/North.standard.long=Heure standard d'Australie centrale (Territoire du Nord) +-Australia/Perth.daylight.long=Heure d'\u00E9t\u00E9 de l'Ouest (Australie) +-Australia/Perth.generic.long=Ouest (Australie) +-Australia/Perth.standard.long=Heure normale de l'Ouest (Australie) +-Australia/Queensland.daylight.long=Heure d'\u00E9t\u00E9 d'Australie orientale (Queensland) +-Australia/Queensland.generic.long=C\u00F4te Est (Queensland) +-Australia/Queensland.standard.long=Heure standard d'Australie orientale (Queensland) +-Australia/South.daylight.long=Heure d'\u00E9t\u00E9 d'Australie centrale (Australie du sud) +-Australia/South.generic.long=Centre (Australie-M\u00E9ridionale) +-Australia/South.standard.long=Heure standard d'Australie centrale (Australie du sud) +-Australia/Sydney.daylight.long=Heure d'\u00E9t\u00E9 de l'Est (Nouvelle-Galles du Sud) +-Australia/Sydney.generic.long=C\u00F4te Est (Nouvelle-Galles du Sud) +-Australia/Sydney.standard.long=Heure normale de l'Est (Nouvelle-Galles du Sud) +-Australia/Tasmania.daylight.long=Heure d'\u00E9t\u00E9 d'Australie orientale (Tasmanie) +-Australia/Tasmania.generic.long=C\u00F4te Est (Tasmanie) +-Australia/Tasmania.standard.long=Heure standard d'Australie orientale (Tasmanie) +-Australia/Victoria.daylight.long=Heure d'\u00E9t\u00E9 d'Australie orientale (Victoria) +-Australia/Victoria.generic.long=C\u00F4te Est (Victoria) +-Australia/Victoria.standard.long=Heure standard d'Australie orientale (Victoria) +-Australia/West.daylight.long=Heure d'\u00E9t\u00E9 de l'Ouest (Australie) +-Australia/West.generic.long=Ouest (Australie) +-Australia/West.standard.long=Heure normale de l'Ouest (Australie) +-Australia/Yancowinna.daylight.long=Heure d'\u00E9t\u00E9 d'Australie centrale (Australie du sud/Nouvelle-Galles du sud) +-Australia/Yancowinna.generic.long=Centre (Australie-M\u00E9ridionale/Nouvelle-Galles du Sud) +-Australia/Yancowinna.standard.long=Heure standard d'Australie centrale (Australie du sud/Nouvelle-Galles du sud) +-BET.generic.long=Heure du Br\u00E9sil +-BST.generic.long=Heure du Bangladesh +-Brazil/Acre.generic.long=Heure de l'Acre +-Brazil/DeNoronha.generic.long=Heure de Fernando de Noronha +-Brazil/East.generic.long=Heure du Br\u00E9sil +-Brazil/West.generic.long=Heure d'Amazonie +-CAT.generic.long=Heure d'Afrique centrale +-CET.generic.long=Heure d'Europe centrale +-CNT.generic.long=Terre-Neuve +-CST.generic.long=Centre +-CST6CDT.generic.long=Centre +-CTT.generic.long=Chine +-Canada/Atlantic.generic.long=Atlantique +-Canada/Central.generic.long=Centre +-Canada/East-Saskatchewan.generic.long=Centre +-Canada/Eastern.generic.long=C\u00F4te Est +-Canada/Mountain.generic.long=Rocheuses +-Canada/Newfoundland.generic.long=Terre-Neuve +-Canada/Pacific.generic.long=Pacifique +-Canada/Saskatchewan.generic.long=Centre +-Canada/Yukon.generic.long=Pacifique +-Chile/Continental.generic.long=Heure du Chili +-Chile/EasterIsland.generic.long=Heure de l'Ile de P\u00E2ques +-Cuba.generic.long=Heure de Cuba +-EAT.generic.long=Heure d'Afrique de l'Est +-ECT.generic.long=Heure d'Europe centrale +-EET.generic.long=Heure d'Europe de l'Est +-EST.generic.long=C\u00f4te Est +-EST5EDT.generic.long=C\u00f4te Est +-Egypt.generic.long=Heure d'Europe de l'Est +-Eire.generic.long=Heure irlandaise +-Etc/Greenwich.generic.long=Heure de Greenwich +-Etc/UCT.generic.long=Temps universel coordonn\u00E9 +-Etc/UTC.generic.long=Temps universel coordonn\u00E9 +-Etc/Universal.generic.long=Temps universel coordonn\u00E9 +-Etc/Zulu.generic.long=Temps universel coordonn\u00E9 +-Europe/Amsterdam.generic.long=Heure d'Europe centrale +-Europe/Andorra.generic.long=Heure d'Europe centrale +-Europe/Athens.generic.long=Heure d'Europe de l'Est +-Europe/Belfast.generic.long=Heure britannique +-Europe/Belgrade.generic.long=Heure d'Europe centrale +-Europe/Berlin.generic.long=Heure d'Europe centrale +-Europe/Bratislava.generic.long=Heure d'Europe centrale +-Europe/Brussels.generic.long=Heure d'Europe centrale +-Europe/Bucharest.generic.long=Heure d'Europe de l'Est +-Europe/Budapest.generic.long=Heure d'Europe centrale +-Europe/Busingen.generic.long=Heure d'Europe centrale +-Europe/Chisinau.generic.long=Heure d'Europe de l'Est +-Europe/Copenhagen.generic.long=Heure d'Europe centrale +-Europe/Dublin.generic.long=Heure irlandaise +-Europe/Gibraltar.generic.long=Heure d'Europe centrale +-Europe/Guernsey.generic.long=Heure britannique +-Europe/Helsinki.generic.long=Heure d'Europe de l'Est +-Europe/Isle_of_Man.generic.long=Heure britannique +-Europe/Istanbul.generic.long=Heure d'Europe de l'Est +-Europe/Jersey.generic.long=Heure britannique +-Europe/Kaliningrad.daylight.long=Heure d'\u00E9t\u00E9 d'Europe de l'Est UTC+3 +-Europe/Kaliningrad.generic.long=Heure d'Europe de l'Est UTC+3 +-Europe/Kaliningrad.standard.long=Heure d'Europe de l'Est UTC+3 +-Europe/Kiev.generic.long=Heure d'Europe de l'Est +-Europe/Lisbon.generic.long=Heure d'Europe de l'Ouest +-Europe/Ljubljana.generic.long=Heure d'Europe centrale +-Europe/London.generic.long=Heure britannique +-Europe/Luxembourg.generic.long=Heure d'Europe centrale +-Europe/Madrid.generic.long=Heure d'Europe centrale +-Europe/Malta.generic.long=Heure d'Europe centrale +-Europe/Mariehamn.generic.long=Heure d'Europe de l'Est +-Europe/Minsk.daylight.long=Heure d'\u00E9t\u00E9 d'Europe de l'Est UTC+3 +-Europe/Minsk.generic.long=Heure d'Europe de l'Est UTC+3 +-Europe/Minsk.standard.long=Heure d'Europe de l'Est UTC+3 +-Europe/Monaco.generic.long=Heure d'Europe centrale +-Europe/Moscow.generic.long=Moscou +-Europe/Nicosia.generic.long=Heure d'Europe de l'Est +-Europe/Oslo.generic.long=Heure d'Europe centrale +-Europe/Paris.generic.long=Heure d'Europe centrale +-Europe/Podgorica.generic.long=Heure d'Europe centrale +-Europe/Prague.generic.long=Heure d'Europe centrale +-Europe/Riga.generic.long=Heure d'Europe de l'Est +-Europe/Rome.generic.long=Heure d'Europe centrale +-Europe/Samara.generic.long=Heure de Samara +-Europe/San_Marino.generic.long=Heure d'Europe centrale +-Europe/Sarajevo.generic.long=Heure d'Europe centrale +-Europe/Simferopol.generic.long=Heure d'Europe de l'Est +-Europe/Skopje.generic.long=Heure d'Europe centrale +-Europe/Sofia.generic.long=Heure d'Europe de l'Est +-Europe/Stockholm.generic.long=Heure d'Europe centrale +-Europe/Tallinn.generic.long=Heure d'Europe de l'Est +-Europe/Tirane.generic.long=Heure d'Europe centrale +-Europe/Tiraspol.generic.long=Heure d'Europe de l'Est +-Europe/Uzhgorod.generic.long=Heure d'Europe de l'Est +-Europe/Vaduz.generic.long=Heure d'Europe centrale +-Europe/Vatican.generic.long=Heure d'Europe centrale +-Europe/Vienna.generic.long=Heure d'Europe centrale +-Europe/Vilnius.generic.long=Heure d'Europe de l'Est +-Europe/Volgograd.generic.long=Heure de Volgograd +-Europe/Warsaw.generic.long=Heure d'Europe centrale +-Europe/Zagreb.generic.long=Heure d'Europe centrale +-Europe/Zaporozhye.generic.long=Heure d'Europe de l'Est +-Europe/Zurich.generic.long=Heure d'Europe centrale +-GB-Eire.generic.long=Heure britannique +-GB.generic.long=Heure britannique +-GMT.generic.long=Heure de Greenwich +-Greenwich.generic.long=Heure de Greenwich +-HST.generic.long=Hawa\u00ef +-Hongkong.generic.long=Heure de Hong-Kong +-IET.generic.long=C\u00F4te Est +-IST.generic.long=Inde +-Iceland.generic.long=Heure de Greenwich +-Indian/Antananarivo.generic.long=Heure d'Afrique de l'Est +-Indian/Chagos.generic.long=Heure de l'oc\u00E9an Indien +-Indian/Christmas.generic.long=Heure de l'Ile Christmas +-Indian/Cocos.generic.long=Heure des Iles Cocos +-Indian/Comoro.generic.long=Heure d'Afrique de l'Est +-Indian/Kerguelen.generic.long=Heure des Terres australes antarctiques fran\u00E7aises +-Indian/Mahe.generic.long=Heure des Seychelles +-Indian/Maldives.generic.long=Heure des Maldives +-Indian/Mauritius.generic.long=Heure de Maurice +-Indian/Mayotte.generic.long=Heure d'Afrique de l'Est +-Indian/Reunion.generic.long=Heure de la R\u00E9union +-Iran.generic.long=Heure d'Iran +-Israel.generic.long=Isra\u00EBl +-JST.generic.long=Japon +-Jamaica.generic.long=C\u00F4te Est +-Japan.generic.long=Japon +-Kwajalein.generic.long=Heure des Iles Marshall +-Libya.generic.long=Heure d'Europe de l'Est +-MET.generic.long=MET +-MIT.generic.long=Heure des Samoas occidentales +-MST.generic.long=Rocheuses +-MST7MDT.generic.long=Rocheuses +-Mexico/BajaNorte.generic.long=Pacifique +-Mexico/BajaSur.generic.long=Rocheuses +-Mexico/General.generic.long=Centre +-NET.generic.long=Heure d'Arm\u00E9nie +-NST.generic.long=Nouvelle-Z\u00E9lande +-NZ-CHAT.generic.long=Chatham +-NZ.generic.long=Nouvelle-Z\u00E9lande +-Navajo.generic.long=Rocheuses +-PLT.generic.long=Heure du Pakistan +-PNT.generic.long=Rocheuses +-PRC.generic.long=Chine +-PRT.generic.long=Atlantique +-PST.generic.long=Pacifique +-PST8PDT.generic.long=Pacifique +-Pacific/Apia.generic.long=Heure des Samoas occidentales +-Pacific/Auckland.generic.long=Nouvelle-Z\u00E9lande +-Pacific/Chatham.generic.long=Chatham +-Pacific/Chuuk.daylight.long=Heure d'\u00E9t\u00E9 de Chuuk +-Pacific/Chuuk.generic.long=Heure de Chuuk +-Pacific/Chuuk.standard.long=Heure de Chuuk +-Pacific/Easter.generic.long=Heure de l'Ile de P\u00E2ques +-Pacific/Efate.generic.long=Heure du Vanuatu +-Pacific/Enderbury.generic.long=Heure de l'Ile de Phoenix +-Pacific/Fakaofo.generic.long=Heure de Tokelau +-Pacific/Fiji.generic.long=Heure de Fidji +-Pacific/Funafuti.generic.long=Heure de Tuvalu +-Pacific/Galapagos.generic.long=Heure des Galapagos +-Pacific/Gambier.generic.long=Heure de Gambi +-Pacific/Guadalcanal.generic.long=Heure des Iles Salomon +-Pacific/Guam.generic.long=Chamorro +-Pacific/Honolulu.generic.long=Hawa\u00EF +-Pacific/Johnston.generic.long=Hawa\u00EF +-Pacific/Kiritimati.generic.long=Heure de l'Ile de Line +-Pacific/Kosrae.generic.long=Heure de Kusaie +-Pacific/Kwajalein.generic.long=Heure des Iles Marshall +-Pacific/Majuro.generic.long=Heure des Iles Marshall +-Pacific/Marquesas.generic.long=Heure des Marquises +-Pacific/Midway.generic.long=Samoa +-Pacific/Nauru.generic.long=Heure de Nauru +-Pacific/Niue.generic.long=Heure de Niue +-Pacific/Norfolk.generic.long=Heure de Norfolk +-Pacific/Noumea.generic.long=Heure de Nouvelle-Cal\u00E9donie +-Pacific/Pago_Pago.generic.long=Samoa +-Pacific/Palau.generic.long=Heure de Palaos +-Pacific/Pitcairn.generic.long=Pitcairn +-Pacific/Pohnpei.daylight.long=Heure d'\u00E9t\u00E9 de Pohnpei +-Pacific/Pohnpei.generic.long=Ponape +-Pacific/Pohnpei.standard.long=Heure de Pohnpei +-Pacific/Ponape.daylight.long=Heure d'\u00E9t\u00E9 de Pohnpei +-Pacific/Ponape.generic.long=Ponape +-Pacific/Ponape.standard.long=Heure de Pohnpei +-Pacific/Port_Moresby.generic.long=Heure de Papouasie-Nouvelle-Guin\u00E9e +-Pacific/Rarotonga.generic.long=Heure des Iles Cook +-Pacific/Saipan.generic.long=Chamorro +-Pacific/Samoa.generic.long=Samoa +-Pacific/Tahiti.generic.long=Heure de Tahiti +-Pacific/Tarawa.generic.long=Heure de Kiribati +-Pacific/Tongatapu.generic.long=Heure de Tonga +-Pacific/Truk.daylight.long=Heure d'\u00E9t\u00E9 de Chuuk +-Pacific/Truk.generic.long=Heure de Chuuk +-Pacific/Truk.standard.long=Heure de Chuuk +-Pacific/Wake.generic.long=Heure de Wake +-Pacific/Wallis.generic.long=Heure de Wallis-et-Futuna +-Pacific/Yap.daylight.long=Heure d'\u00E9t\u00E9 de Chuuk +-Pacific/Yap.generic.long=Heure de Chuuk +-Pacific/Yap.standard.long=Heure de Chuuk +-Poland.generic.long=Heure d'Europe centrale +-Portugal.generic.long=Heure d'Europe de l'Ouest +-ROK.generic.long=Cor\u00E9e +-SST.generic.long=Heure des Iles Salomon +-Singapore.generic.long=Heure de Singapour +-SystemV/AST4.generic.long=Atlantique +-SystemV/AST4ADT.generic.long=Atlantique +-SystemV/CST6.generic.long=Centre +-SystemV/CST6CDT.generic.long=Centre +-SystemV/EST5.generic.long=C\u00F4te Est +-SystemV/EST5EDT.generic.long=C\u00F4te Est +-SystemV/HST10.generic.long=Hawa\u00EF +-SystemV/MST7.generic.long=Rocheuses +-SystemV/MST7MDT.generic.long=Rocheuses +-SystemV/PST8.generic.long=Pacifique +-SystemV/PST8PDT.generic.long=Pacifique +-SystemV/YST9.generic.long=Alaska +-SystemV/YST9YDT.generic.long=Alaska +-Turkey.generic.long=Heure d'Europe de l'Est +-UCT.generic.long=Temps universel coordonn\u00E9 +-US/Alaska.generic.long=Alaska +-US/Aleutian.generic.long=Hawa\u00EF-Iles Al\u00E9outiennes +-US/Arizona.generic.long=Rocheuses +-US/Central.generic.long=Centre +-US/East-Indiana.generic.long=C\u00F4te Est +-US/Eastern.generic.long=C\u00F4te Est +-US/Hawaii.generic.long=Hawa\u00EF +-US/Indiana-Starke.generic.long=Centre +-US/Michigan.generic.long=C\u00F4te Est +-US/Mountain.generic.long=Rocheuses +-US/Pacific-New.generic.long=Pacifique +-US/Pacific.generic.long=Pacifique +-US/Samoa.generic.long=Samoa +-UTC.generic.long=Temps universel coordonn\u00E9 +-Universal.generic.long=Temps universel coordonn\u00E9 +-VST.generic.long=Heure d'Indochine +-W-SU.generic.long=Moscou +-WET.generic.long=Heure d'Europe de l'Ouest +-Zulu.generic.long=Temps universel coordonn\u00E9 +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_fr_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_fr_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_it.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_it.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=Ora estiva centrale (Territori del Nord) +-ACT.generic.long=Ora fuso centrale (Territori del Nord) +-ACT.standard.long=Ora standard centrale (Territori del Nord) +-AET.daylight.long=Ora estiva dell'Australia orientale (Nuovo Galles del Sud) +-AET.generic.long=Ora fuso orientale (Nuovo Galles del Sud) +-AET.standard.long=Ora standard dell'Australia orientale (Nuovo Galles del Sud) +-AGT.generic.long=Ora dell'Argentina +-ART.generic.long=Ora dell'Europa orientale +-AST.generic.long=Ora Alaska +-Africa/Abidjan.generic.long=Ora media di Greenwich +-Africa/Accra.generic.long=Ora media del Ghana +-Africa/Addis_Ababa.generic.long=Ora dell'Africa orientale +-Africa/Algiers.generic.long=Ora dell'Europa centrale +-Africa/Asmara.generic.long=Ora dell'Africa orientale +-Africa/Asmera.generic.long=Ora dell'Africa orientale +-Africa/Bamako.generic.long=Ora media di Greenwich +-Africa/Bangui.generic.long=Ora dell'Africa occidentale +-Africa/Banjul.generic.long=Ora media di Greenwich +-Africa/Bissau.generic.long=Ora media di Greenwich +-Africa/Blantyre.generic.long=Ora dell'Africa centrale +-Africa/Brazzaville.generic.long=Ora dell'Africa occidentale +-Africa/Bujumbura.generic.long=Ora dell'Africa centrale +-Africa/Cairo.generic.long=Ora dell'Europa orientale +-Africa/Casablanca.generic.long=Ora dell'Europa occidentale +-Africa/Ceuta.generic.long=Ora dell'Europa centrale +-Africa/Conakry.generic.long=Ora media di Greenwich +-Africa/Dakar.generic.long=Ora media di Greenwich +-Africa/Dar_es_Salaam.generic.long=Ora dell'Africa orientale +-Africa/Djibouti.generic.long=Ora dell'Africa orientale +-Africa/Douala.generic.long=Ora dell'Africa occidentale +-Africa/El_Aaiun.generic.long=Ora dell'Europa occidentale +-Africa/Freetown.generic.long=Ora della Sierra Leone +-Africa/Gaborone.generic.long=Ora dell'Africa centrale +-Africa/Harare.generic.long=Ora dell'Africa centrale +-Africa/Johannesburg.generic.long=Ora Sudafrica +-Africa/Juba.generic.long=Ora dell'Africa orientale +-Africa/Kampala.generic.long=Ora dell'Africa orientale +-Africa/Khartoum.generic.long=Ora dell'Africa orientale +-Africa/Kigali.generic.long=Ora dell'Africa centrale +-Africa/Kinshasa.generic.long=Ora dell'Africa occidentale +-Africa/Lagos.generic.long=Ora dell'Africa occidentale +-Africa/Libreville.generic.long=Ora dell'Africa occidentale +-Africa/Lome.generic.long=Ora media di Greenwich +-Africa/Luanda.generic.long=Ora dell'Africa occidentale +-Africa/Lubumbashi.generic.long=Ora dell'Africa centrale +-Africa/Lusaka.generic.long=Ora dell'Africa centrale +-Africa/Malabo.generic.long=Ora dell'Africa occidentale +-Africa/Maputo.generic.long=Ora dell'Africa centrale +-Africa/Maseru.generic.long=Ora Sudafrica +-Africa/Mbabane.generic.long=Ora Sudafrica +-Africa/Mogadishu.generic.long=Ora dell'Africa orientale +-Africa/Monrovia.generic.long=Ora media di Greenwich +-Africa/Nairobi.generic.long=Ora dell'Africa orientale +-Africa/Ndjamena.generic.long=Ora dell'Africa occidentale +-Africa/Niamey.generic.long=Ora dell'Africa occidentale +-Africa/Nouakchott.generic.long=Ora media di Greenwich +-Africa/Ouagadougou.generic.long=Ora media di Greenwich +-Africa/Porto-Novo.generic.long=Ora dell'Africa occidentale +-Africa/Sao_Tome.generic.long=Ora media di Greenwich +-Africa/Timbuktu.generic.long=Ora media di Greenwich +-Africa/Tripoli.generic.long=Ora dell'Europa orientale +-Africa/Tunis.generic.long=Ora dell'Europa centrale +-Africa/Windhoek.generic.long=Ora dell'Africa occidentale +-America/Adak.generic.long=Ora Hawaii-Aleutine +-America/Anchorage.generic.long=Ora Alaska +-America/Anguilla.generic.long=Fuso dell'Atlantico +-America/Antigua.generic.long=Fuso dell'Atlantico +-America/Araguaina.generic.long=Ora di Brasilia +-America/Argentina/Buenos_Aires.generic.long=Ora dell'Argentina +-America/Argentina/Catamarca.generic.long=Ora dell'Argentina +-America/Argentina/ComodRivadavia.generic.long=Ora dell'Argentina +-America/Argentina/Cordoba.generic.long=Ora dell'Argentina +-America/Argentina/Jujuy.generic.long=Ora dell'Argentina +-America/Argentina/La_Rioja.generic.long=Ora dell'Argentina +-America/Argentina/Mendoza.generic.long=Ora dell'Argentina +-America/Argentina/Rio_Gallegos.generic.long=Ora dell'Argentina +-America/Argentina/Salta.generic.long=Ora dell'Argentina +-America/Argentina/San_Juan.generic.long=Ora dell'Argentina +-America/Argentina/San_Luis.generic.long=Ora dell'Argentina +-America/Argentina/Tucuman.generic.long=Ora dell'Argentina +-America/Argentina/Ushuaia.generic.long=Ora dell'Argentina +-America/Aruba.generic.long=Fuso dell'Atlantico +-America/Asuncion.generic.long=Ora del Paraguay +-America/Atikokan.generic.long=Fuso orientale +-America/Atka.generic.long=Ora Hawaii-Aleutine +-America/Bahia.generic.long=Ora di Brasilia +-America/Bahia_Banderas.generic.long=Ora fuso centrale +-America/Barbados.generic.long=Fuso dell'Atlantico +-America/Belem.generic.long=Ora di Brasilia +-America/Belize.generic.long=Ora fuso centrale +-America/Blanc-Sablon.generic.long=Fuso dell'Atlantico +-America/Boa_Vista.generic.long=Ora dell'Amazzonia +-America/Bogota.generic.long=Ora della Colombia +-America/Boise.generic.long=Ora fuso occidentale +-America/Buenos_Aires.generic.long=Ora dell'Argentina +-America/Cambridge_Bay.generic.long=Ora fuso occidentale +-America/Campo_Grande.generic.long=Ora dell'Amazzonia +-America/Cancun.generic.long=Ora fuso centrale +-America/Caracas.generic.long=Ora del Venezuela +-America/Catamarca.generic.long=Ora dell'Argentina +-America/Cayenne.generic.long=Ora della Guyana Francese +-America/Cayman.generic.long=Fuso orientale +-America/Chicago.generic.long=Ora fuso centrale +-America/Chihuahua.generic.long=Ora fuso occidentale +-America/Coral_Harbour.generic.long=Fuso orientale +-America/Cordoba.generic.long=Ora dell'Argentina +-America/Costa_Rica.generic.long=Ora fuso centrale +-America/Creston.generic.long=Ora fuso occidentale +-America/Cuiaba.generic.long=Ora dell'Amazzonia +-America/Curacao.generic.long=Fuso dell'Atlantico +-America/Danmarkshavn.generic.long=Ora media di Greenwich +-America/Dawson.generic.long=Fuso del Pacifico +-America/Dawson_Creek.generic.long=Ora fuso occidentale +-America/Denver.generic.long=Ora fuso occidentale +-America/Detroit.generic.long=Fuso orientale +-America/Dominica.generic.long=Fuso dell'Atlantico +-America/Edmonton.generic.long=Ora fuso occidentale +-America/Eirunepe.generic.long=Ora di Acre +-America/El_Salvador.generic.long=Ora fuso centrale +-America/Ensenada.generic.long=Fuso del Pacifico +-America/Fort_Wayne.generic.long=Fuso orientale +-America/Fortaleza.generic.long=Ora di Brasilia +-America/Glace_Bay.generic.long=Fuso dell'Atlantico +-America/Godthab.generic.long=Ora della Groenlandia occidentale +-America/Goose_Bay.generic.long=Fuso dell'Atlantico +-America/Grand_Turk.generic.long=Fuso orientale +-America/Grenada.generic.long=Fuso dell'Atlantico +-America/Guadeloupe.generic.long=Fuso dell'Atlantico +-America/Guatemala.generic.long=Ora fuso centrale +-America/Guayaquil.generic.long=Ora dell'Ecuador +-America/Guyana.generic.long=Ora della Guyana +-America/Halifax.generic.long=Fuso dell'Atlantico +-America/Havana.generic.long=Ora di Cuba +-America/Hermosillo.generic.long=Ora fuso occidentale +-America/Indiana/Indianapolis.generic.long=Fuso orientale +-America/Indiana/Knox.generic.long=Ora fuso centrale +-America/Indiana/Marengo.generic.long=Fuso orientale +-America/Indiana/Petersburg.generic.long=Fuso orientale +-America/Indiana/Tell_City.generic.long=Ora fuso centrale +-America/Indiana/Vevay.generic.long=Fuso orientale +-America/Indiana/Vincennes.generic.long=Fuso orientale +-America/Indiana/Winamac.generic.long=Fuso orientale +-America/Indianapolis.generic.long=Fuso orientale +-America/Inuvik.generic.long=Ora fuso occidentale +-America/Iqaluit.generic.long=Fuso orientale +-America/Jamaica.generic.long=Fuso orientale +-America/Jujuy.generic.long=Ora dell'Argentina +-America/Juneau.generic.long=Ora Alaska +-America/Kentucky/Louisville.generic.long=Fuso orientale +-America/Kentucky/Monticello.generic.long=Fuso orientale +-America/Knox_IN.generic.long=Ora fuso centrale +-America/Kralendijk.generic.long=Fuso dell'Atlantico +-America/La_Paz.generic.long=Ora della Bolivia +-America/Lima.generic.long=Ora del Per\u00F9 +-America/Los_Angeles.generic.long=Fuso del Pacifico +-America/Louisville.generic.long=Fuso orientale +-America/Lower_Princes.generic.long=Fuso dell'Atlantico +-America/Maceio.generic.long=Ora di Brasilia +-America/Managua.generic.long=Ora fuso centrale +-America/Manaus.generic.long=Ora dell'Amazzonia +-America/Marigot.generic.long=Fuso dell'Atlantico +-America/Martinique.generic.long=Fuso dell'Atlantico +-America/Matamoros.generic.long=Ora fuso centrale +-America/Mazatlan.generic.long=Ora fuso occidentale +-America/Mendoza.generic.long=Ora dell'Argentina +-America/Menominee.generic.long=Ora fuso centrale +-America/Merida.generic.long=Ora fuso centrale +-America/Metlakatla.daylight.long=Ora legale di Metlakatla +-America/Metlakatla.generic.long=Ora di Metlakatla +-America/Metlakatla.standard.long=Ora standard di Metlakatla +-America/Mexico_City.generic.long=Ora fuso centrale +-America/Miquelon.generic.long=Ora Saint-Pierre e Miquelon +-America/Moncton.generic.long=Fuso dell'Atlantico +-America/Monterrey.generic.long=Ora fuso centrale +-America/Montevideo.generic.long=Ora dell'Uruguay +-America/Montreal.generic.long=Fuso orientale +-America/Montserrat.generic.long=Fuso dell'Atlantico +-America/Nassau.generic.long=Fuso orientale +-America/New_York.generic.long=Fuso orientale +-America/Nipigon.generic.long=Fuso orientale +-America/Nome.generic.long=Ora Alaska +-America/Noronha.generic.long=Ora di Fernando de Noronha +-America/North_Dakota/Beulah.generic.long=Ora fuso centrale +-America/North_Dakota/Center.generic.long=Ora fuso centrale +-America/North_Dakota/New_Salem.generic.long=Ora fuso centrale +-America/Ojinaga.generic.long=Ora fuso occidentale +-America/Panama.generic.long=Fuso orientale +-America/Pangnirtung.generic.long=Fuso orientale +-America/Paramaribo.generic.long=Ora di Suriname +-America/Phoenix.generic.long=Ora fuso occidentale +-America/Port-au-Prince.generic.long=Fuso orientale +-America/Port_of_Spain.generic.long=Fuso dell'Atlantico +-America/Porto_Acre.generic.long=Ora di Acre +-America/Porto_Velho.generic.long=Ora dell'Amazzonia +-America/Puerto_Rico.generic.long=Fuso dell'Atlantico +-America/Rainy_River.generic.long=Ora fuso centrale +-America/Rankin_Inlet.generic.long=Ora fuso centrale +-America/Recife.generic.long=Ora di Brasilia +-America/Regina.generic.long=Ora fuso centrale +-America/Resolute.generic.long=Ora fuso centrale +-America/Rio_Branco.generic.long=Ora di Acre +-America/Rosario.generic.long=Ora dell'Argentina +-America/Santa_Isabel.generic.long=Fuso del Pacifico +-America/Santarem.generic.long=Ora di Brasilia +-America/Santiago.generic.long=Ora del Cile +-America/Santo_Domingo.generic.long=Fuso dell'Atlantico +-America/Sao_Paulo.generic.long=Ora di Brasilia +-America/Scoresbysund.generic.long=Ora della Groenlandia orientale +-America/Shiprock.generic.long=Ora fuso occidentale +-America/Sitka.generic.long=Ora Alaska +-America/St_Barthelemy.generic.long=Fuso dell'Atlantico +-America/St_Johns.generic.long=Ora Terranova +-America/St_Kitts.generic.long=Fuso dell'Atlantico +-America/St_Lucia.generic.long=Fuso dell'Atlantico +-America/St_Thomas.generic.long=Fuso dell'Atlantico +-America/St_Vincent.generic.long=Fuso dell'Atlantico +-America/Swift_Current.generic.long=Ora fuso centrale +-America/Tegucigalpa.generic.long=Ora fuso centrale +-America/Thule.generic.long=Fuso dell'Atlantico +-America/Thunder_Bay.generic.long=Fuso orientale +-America/Tijuana.generic.long=Fuso del Pacifico +-America/Toronto.generic.long=Fuso orientale +-America/Tortola.generic.long=Fuso dell'Atlantico +-America/Vancouver.generic.long=Fuso del Pacifico +-America/Virgin.generic.long=Fuso dell'Atlantico +-America/Whitehorse.generic.long=Fuso del Pacifico +-America/Winnipeg.generic.long=Ora fuso centrale +-America/Yakutat.generic.long=Ora Alaska +-America/Yellowknife.generic.long=Ora fuso occidentale +-Antarctica/Casey.daylight.long=Ora estiva dell'Australia occidentale +-Antarctica/Casey.generic.long=Ora Australia occidentale +-Antarctica/Casey.standard.long=Ora standard dell'Australia occidentale +-Antarctica/Davis.generic.long=Ora di Davis +-Antarctica/DumontDUrville.generic.long=Ora di Dumont-d'Urville +-Antarctica/Macquarie.daylight.long=Ora estiva dell'Isola Macquarie +-Antarctica/Macquarie.generic.long=Ora dell'Isola Macquarie +-Antarctica/Macquarie.standard.long=Ora dell'Isola Macquarie +-Antarctica/Mawson.generic.long=Ora di Mawson +-Antarctica/McMurdo.generic.long=Ora Nuova Zelanda +-Antarctica/Palmer.generic.long=Ora del Cile +-Antarctica/Rothera.generic.long=Ora di Rothera +-Antarctica/South_Pole.generic.long=Ora Nuova Zelanda +-Antarctica/Syowa.generic.long=Ora di Syowa +-Antarctica/Vostok.generic.long=Ora di Vostok +-Arctic/Longyearbyen.generic.long=Ora dell'Europa centrale +-Asia/Aden.generic.long=Ora Arabia Saudita +-Asia/Almaty.generic.long=Ora di Alma-Ata +-Asia/Amman.generic.long=Ora Arabia Saudita +-Asia/Anadyr.generic.long=Ora di Anadyr +-Asia/Aqtau.generic.long=Ora di Aqtau +-Asia/Aqtobe.generic.long=Ora di Aqtobe +-Asia/Ashgabat.generic.long=Ora del Turkmenistan +-Asia/Ashkhabad.generic.long=Ora del Turkmenistan +-Asia/Baghdad.generic.long=Ora Arabia Saudita +-Asia/Bahrain.generic.long=Ora Arabia Saudita +-Asia/Baku.generic.long=Ora dell'Azerbaigian +-Asia/Bangkok.generic.long=Ora dell'Indocina +-Asia/Beirut.generic.long=Ora dell'Europa orientale +-Asia/Bishkek.generic.long=Ora del Kirghizistan +-Asia/Brunei.generic.long=Ora del Brunei +-Asia/Calcutta.generic.long=Ora India +-Asia/Choibalsan.generic.long=Ora di Choibalsan +-Asia/Chongqing.generic.long=Ora Cina +-Asia/Chungking.generic.long=Ora Cina +-Asia/Colombo.generic.long=Ora India +-Asia/Dacca.generic.long=Ora del Bangladesh +-Asia/Damascus.generic.long=Ora dell'Europa orientale +-Asia/Dhaka.generic.long=Ora del Bangladesh +-Asia/Dili.generic.long=Ora di Timor Est +-Asia/Dubai.generic.long=Ora del golfo +-Asia/Dushanbe.generic.long=Ora del Tagikistan +-Asia/Gaza.generic.long=Ora dell'Europa orientale +-Asia/Harbin.generic.long=Ora Cina +-Asia/Hebron.generic.long=Ora dell'Europa orientale +-Asia/Ho_Chi_Minh.generic.long=Ora dell'Indocina +-Asia/Hong_Kong.generic.long=Ora di Hong Kong +-Asia/Hovd.generic.long=Ora di Hovd +-Asia/Irkutsk.generic.long=Ora di Irkutsk +-Asia/Istanbul.generic.long=Ora dell'Europa orientale +-Asia/Jakarta.generic.long=Ora dell'Indonesia occidentale +-Asia/Jayapura.generic.long=Ora dell'Indonesia orientale +-Asia/Jerusalem.generic.long=Ora Israele +-Asia/Kabul.generic.long=Ora dell'Afghanistan +-Asia/Kamchatka.generic.long=Ora di Petropavlovsk-Kamchatski +-Asia/Karachi.generic.long=Ora del Pakistan +-Asia/Kashgar.generic.long=Ora Cina +-Asia/Kathmandu.generic.long=Ora del Nepal +-Asia/Katmandu.generic.long=Ora del Nepal +-Asia/Khandyga.daylight.long=Ora estiva di Khandyga +-Asia/Khandyga.generic.long=Ora di Khandyga +-Asia/Khandyga.standard.long=Ora di Khandyga +-Asia/Kolkata.generic.long=Ora India +-Asia/Krasnoyarsk.generic.long=Ora di Krasnojarsk +-Asia/Kuala_Lumpur.generic.long=Ora della Malaysia +-Asia/Kuching.generic.long=Ora della Malaysia +-Asia/Kuwait.generic.long=Ora Arabia Saudita +-Asia/Macao.generic.long=Ora Cina +-Asia/Macau.generic.long=Ora Cina +-Asia/Magadan.generic.long=Ora di Magadan +-Asia/Makassar.generic.long=Ora dell'Indonesia centrale +-Asia/Manila.generic.long=Ora delle Filippine +-Asia/Muscat.generic.long=Ora del golfo +-Asia/Nicosia.generic.long=Ora dell'Europa orientale +-Asia/Novokuznetsk.generic.long=Ora di Novosibirsk +-Asia/Novosibirsk.generic.long=Ora di Novosibirsk +-Asia/Omsk.generic.long=Ora di Omsk +-Asia/Oral.generic.long=Ora di Oral +-Asia/Phnom_Penh.generic.long=Ora dell'Indocina +-Asia/Pontianak.generic.long=Ora dell'Indonesia occidentale +-Asia/Pyongyang.generic.long=Ora Corea +-Asia/Qatar.generic.long=Ora Arabia Saudita +-Asia/Qyzylorda.generic.long=Ora di Qyzylorda +-Asia/Rangoon.generic.long=Ora della Birmania/Myanmar +-Asia/Saigon.generic.long=Ora dell'Indocina +-Asia/Sakhalin.generic.long=Ora di Sakhalin +-Asia/Samarkand.generic.long=Ora dell'Uzbekistan +-Asia/Seoul.generic.long=Ora Corea +-Asia/Shanghai.generic.long=Ora Cina +-Asia/Singapore.generic.long=Ora di Singapore +-Asia/Taipei.generic.long=Ora Cina +-Asia/Tashkent.generic.long=Ora dell'Uzbekistan +-Asia/Tbilisi.generic.long=Ora della Georgia +-Asia/Tehran.generic.long=Ora Iran +-Asia/Tel_Aviv.generic.long=Ora Israele +-Asia/Thimbu.generic.long=Ora del Bhutan +-Asia/Thimphu.generic.long=Ora del Bhutan +-Asia/Tokyo.generic.long=Ora Giappone +-Asia/Ujung_Pandang.generic.long=Ora dell'Indonesia centrale +-Asia/Ulaanbaatar.generic.long=Ora di Ulaanbaatar +-Asia/Ulan_Bator.generic.long=Ora di Ulaanbaatar +-Asia/Urumqi.generic.long=Ora Cina +-Asia/Ust-Nera.daylight.long=Ora estiva di Ust-Nera +-Asia/Ust-Nera.generic.long=Ora di Ust-Nera +-Asia/Ust-Nera.standard.long=Ora di Ust-Nera +-Asia/Vientiane.generic.long=Ora dell'Indocina +-Asia/Vladivostok.generic.long=Ora di Vladivostok +-Asia/Yakutsk.generic.long=Ora di Yakutsk +-Asia/Yekaterinburg.generic.long=Ora di Ekaterinburg +-Asia/Yerevan.generic.long=Ora dell'Armenia +-Atlantic/Azores.generic.long=Ora delle Azzorre +-Atlantic/Bermuda.generic.long=Fuso dell'Atlantico +-Atlantic/Canary.generic.long=Ora dell'Europa occidentale +-Atlantic/Cape_Verde.generic.long=Ora di Capo Verde +-Atlantic/Faeroe.generic.long=Ora dell'Europa occidentale +-Atlantic/Faroe.generic.long=Ora dell'Europa occidentale +-Atlantic/Jan_Mayen.generic.long=Ora dell'Europa centrale +-Atlantic/Madeira.generic.long=Ora dell'Europa occidentale +-Atlantic/Reykjavik.generic.long=Ora media di Greenwich +-Atlantic/South_Georgia.generic.long=Ora Georgia del Sud +-Atlantic/St_Helena.generic.long=Ora media di Greenwich +-Atlantic/Stanley.generic.long=Ora delle Falkland +-Australia/ACT.daylight.long=Ora estiva dell'Australia orientale (Nuovo Galles del Sud) +-Australia/ACT.generic.long=Ora fuso orientale (Nuovo Galles del Sud) +-Australia/ACT.standard.long=Ora standard dell'Australia orientale (Nuovo Galles del Sud) +-Australia/Adelaide.daylight.long=Ora estiva centrale (Australia del Sud) +-Australia/Adelaide.generic.long=Ora fuso centrale (Australia del Sud) +-Australia/Adelaide.standard.long=Ora standard centrale (Australia del Sud) +-Australia/Brisbane.daylight.long=Ora estiva orientale (Queensland) +-Australia/Brisbane.generic.long=Ora fuso orientale (Queensland) +-Australia/Brisbane.standard.long=Ora standard orientale (Queensland) +-Australia/Broken_Hill.daylight.long=Ora estiva centrale (Australia del Sud/Nuovo Galles del Sud) +-Australia/Broken_Hill.generic.long=Ora fuso centrale (Australia del Sud/Nuovo Galles del Sud) +-Australia/Broken_Hill.standard.long=Ora standard centrale (Australia del Sud/Nuovo Galles del Sud) +-Australia/Canberra.daylight.long=Ora estiva dell'Australia orientale (Nuovo Galles del Sud) +-Australia/Canberra.generic.long=Ora fuso orientale (Nuovo Galles del Sud) +-Australia/Canberra.standard.long=Ora standard dell'Australia orientale (Nuovo Galles del Sud) +-Australia/Currie.daylight.long=Ora estiva dell'Australia orientale (Nuovo Galles del Sud) +-Australia/Currie.generic.long=Ora fuso orientale (Nuovo Galles del Sud) +-Australia/Currie.standard.long=Ora standard dell'Australia orientale (Nuovo Galles del Sud) +-Australia/Darwin.daylight.long=Ora estiva centrale (Territori del Nord) +-Australia/Darwin.generic.long=Ora fuso centrale (Territori del Nord) +-Australia/Darwin.standard.long=Ora standard centrale (Territori del Nord) +-Australia/Eucla.daylight.long=Ora estiva Australia centro-occidentale +-Australia/Eucla.generic.long=Ora Australia centro-occidentale +-Australia/Eucla.standard.long=Ora standard Australia centro-occidentale +-Australia/Hobart.daylight.long=Ora estiva orientale (Tasmania) +-Australia/Hobart.generic.long=Ora fuso orientale (Tasmania) +-Australia/Hobart.standard.long=Ora standard orientale (Tasmania) +-Australia/LHI.generic.long=Ora di Lord Howe +-Australia/Lindeman.daylight.long=Ora estiva orientale (Queensland) +-Australia/Lindeman.generic.long=Ora fuso orientale (Queensland) +-Australia/Lindeman.standard.long=Ora standard orientale (Queensland) +-Australia/Lord_Howe.generic.long=Ora di Lord Howe +-Australia/Melbourne.daylight.long=Ora estiva orientale (Victoria) +-Australia/Melbourne.generic.long=Ora fuso orientale (Victoria) +-Australia/Melbourne.standard.long=Ora standard orientale (Victoria) +-Australia/NSW.daylight.long=Ora estiva dell'Australia orientale (Nuovo Galles del Sud) +-Australia/NSW.generic.long=Ora fuso orientale (Nuovo Galles del Sud) +-Australia/NSW.standard.long=Ora standard dell'Australia orientale (Nuovo Galles del Sud) +-Australia/North.daylight.long=Ora estiva centrale (Territori del Nord) +-Australia/North.generic.long=Ora fuso centrale (Territori del Nord) +-Australia/North.standard.long=Ora standard centrale (Territori del Nord) +-Australia/Perth.daylight.long=Ora estiva dell'Australia occidentale +-Australia/Perth.generic.long=Ora Australia occidentale +-Australia/Perth.standard.long=Ora standard dell'Australia occidentale +-Australia/Queensland.daylight.long=Ora estiva orientale (Queensland) +-Australia/Queensland.generic.long=Ora fuso orientale (Queensland) +-Australia/Queensland.standard.long=Ora standard orientale (Queensland) +-Australia/South.daylight.long=Ora estiva centrale (Australia del Sud) +-Australia/South.generic.long=Ora fuso centrale (Australia del Sud) +-Australia/South.standard.long=Ora standard centrale (Australia del Sud) +-Australia/Sydney.daylight.long=Ora estiva dell'Australia orientale (Nuovo Galles del Sud) +-Australia/Sydney.generic.long=Ora fuso orientale (Nuovo Galles del Sud) +-Australia/Sydney.standard.long=Ora standard dell'Australia orientale (Nuovo Galles del Sud) +-Australia/Tasmania.daylight.long=Ora estiva orientale (Tasmania) +-Australia/Tasmania.generic.long=Ora fuso orientale (Tasmania) +-Australia/Tasmania.standard.long=Ora standard orientale (Tasmania) +-Australia/Victoria.daylight.long=Ora estiva orientale (Victoria) +-Australia/Victoria.generic.long=Ora fuso orientale (Victoria) +-Australia/Victoria.standard.long=Ora standard orientale (Victoria) +-Australia/West.daylight.long=Ora estiva dell'Australia occidentale +-Australia/West.generic.long=Ora Australia occidentale +-Australia/West.standard.long=Ora standard dell'Australia occidentale +-Australia/Yancowinna.daylight.long=Ora estiva centrale (Australia del Sud/Nuovo Galles del Sud) +-Australia/Yancowinna.generic.long=Ora fuso centrale (Australia del Sud/Nuovo Galles del Sud) +-Australia/Yancowinna.standard.long=Ora standard centrale (Australia del Sud/Nuovo Galles del Sud) +-BET.generic.long=Ora di Brasilia +-BST.generic.long=Ora del Bangladesh +-Brazil/Acre.generic.long=Ora di Acre +-Brazil/DeNoronha.generic.long=Ora di Fernando de Noronha +-Brazil/East.generic.long=Ora di Brasilia +-Brazil/West.generic.long=Ora dell'Amazzonia +-CAT.generic.long=Ora dell'Africa centrale +-CET.generic.long=Ora dell'Europa centrale +-CNT.generic.long=Ora Terranova +-CST.generic.long=Ora fuso centrale +-CST6CDT.generic.long=Ora fuso centrale +-CTT.generic.long=Ora Cina +-Canada/Atlantic.generic.long=Fuso dell'Atlantico +-Canada/Central.generic.long=Ora fuso centrale +-Canada/East-Saskatchewan.generic.long=Ora fuso centrale +-Canada/Eastern.generic.long=Fuso orientale +-Canada/Mountain.generic.long=Ora fuso occidentale +-Canada/Newfoundland.generic.long=Ora Terranova +-Canada/Pacific.generic.long=Fuso del Pacifico +-Canada/Saskatchewan.generic.long=Ora fuso centrale +-Canada/Yukon.generic.long=Fuso del Pacifico +-Chile/Continental.generic.long=Ora del Cile +-Chile/EasterIsland.generic.long=Ora dell'Isola di Pasqua +-Cuba.generic.long=Ora di Cuba +-EAT.generic.long=Ora dell'Africa orientale +-ECT.generic.long=Ora dell'Europa centrale +-EET.generic.long=Ora dell'Europa orientale +-EST.generic.long=Fuso orientale +-EST5EDT.generic.long=Fuso orientale +-Egypt.generic.long=Ora dell'Europa orientale +-Eire.generic.long=Ora irlandese +-Etc/Greenwich.generic.long=Ora media di Greenwich +-Etc/UCT.generic.long=Tempo universale coordinato +-Etc/UTC.generic.long=Tempo universale coordinato +-Etc/Universal.generic.long=Tempo universale coordinato +-Etc/Zulu.generic.long=Tempo universale coordinato +-Europe/Amsterdam.generic.long=Ora dell'Europa centrale +-Europe/Andorra.generic.long=Ora dell'Europa centrale +-Europe/Athens.generic.long=Ora dell'Europa orientale +-Europe/Belfast.generic.long=Ora britannica +-Europe/Belgrade.generic.long=Ora dell'Europa centrale +-Europe/Berlin.generic.long=Ora dell'Europa centrale +-Europe/Bratislava.generic.long=Ora dell'Europa centrale +-Europe/Brussels.generic.long=Ora dell'Europa centrale +-Europe/Bucharest.generic.long=Ora dell'Europa orientale +-Europe/Budapest.generic.long=Ora dell'Europa centrale +-Europe/Busingen.generic.long=Ora dell'Europa centrale +-Europe/Chisinau.generic.long=Ora dell'Europa orientale +-Europe/Copenhagen.generic.long=Ora dell'Europa centrale +-Europe/Dublin.generic.long=Ora irlandese +-Europe/Gibraltar.generic.long=Ora dell'Europa centrale +-Europe/Guernsey.generic.long=Ora britannica +-Europe/Helsinki.generic.long=Ora dell'Europa orientale +-Europe/Isle_of_Man.generic.long=Ora britannica +-Europe/Istanbul.generic.long=Ora dell'Europa orientale +-Europe/Jersey.generic.long=Ora britannica +-Europe/Kaliningrad.daylight.long=Ora estiva dei paesi europei pi\u00F9 orientali +-Europe/Kaliningrad.generic.long=Ora dei paesi europei pi\u00F9 orientali +-Europe/Kaliningrad.standard.long=Ora dei paesi europei pi\u00F9 orientali +-Europe/Kiev.generic.long=Ora dell'Europa orientale +-Europe/Lisbon.generic.long=Ora dell'Europa occidentale +-Europe/Ljubljana.generic.long=Ora dell'Europa centrale +-Europe/London.generic.long=Ora britannica +-Europe/Luxembourg.generic.long=Ora dell'Europa centrale +-Europe/Madrid.generic.long=Ora dell'Europa centrale +-Europe/Malta.generic.long=Ora dell'Europa centrale +-Europe/Mariehamn.generic.long=Ora dell'Europa orientale +-Europe/Minsk.daylight.long=Ora estiva dei paesi europei pi\u00F9 orientali +-Europe/Minsk.generic.long=Ora dei paesi europei pi\u00F9 orientali +-Europe/Minsk.standard.long=Ora dei paesi europei pi\u00F9 orientali +-Europe/Monaco.generic.long=Ora dell'Europa centrale +-Europe/Moscow.generic.long=Ora Mosca +-Europe/Nicosia.generic.long=Ora dell'Europa orientale +-Europe/Oslo.generic.long=Ora dell'Europa centrale +-Europe/Paris.generic.long=Ora dell'Europa centrale +-Europe/Podgorica.generic.long=Ora dell'Europa centrale +-Europe/Prague.generic.long=Ora dell'Europa centrale +-Europe/Riga.generic.long=Ora dell'Europa orientale +-Europe/Rome.generic.long=Ora dell'Europa centrale +-Europe/Samara.generic.long=Ora di Samara +-Europe/San_Marino.generic.long=Ora dell'Europa centrale +-Europe/Sarajevo.generic.long=Ora dell'Europa centrale +-Europe/Simferopol.generic.long=Ora dell'Europa orientale +-Europe/Skopje.generic.long=Ora dell'Europa centrale +-Europe/Sofia.generic.long=Ora dell'Europa orientale +-Europe/Stockholm.generic.long=Ora dell'Europa centrale +-Europe/Tallinn.generic.long=Ora dell'Europa orientale +-Europe/Tirane.generic.long=Ora dell'Europa centrale +-Europe/Tiraspol.generic.long=Ora dell'Europa orientale +-Europe/Uzhgorod.generic.long=Ora dell'Europa orientale +-Europe/Vaduz.generic.long=Ora dell'Europa centrale +-Europe/Vatican.generic.long=Ora dell'Europa centrale +-Europe/Vienna.generic.long=Ora dell'Europa centrale +-Europe/Vilnius.generic.long=Ora dell'Europa orientale +-Europe/Volgograd.generic.long=Ora di Volgograd +-Europe/Warsaw.generic.long=Ora dell'Europa centrale +-Europe/Zagreb.generic.long=Ora dell'Europa centrale +-Europe/Zaporozhye.generic.long=Ora dell'Europa orientale +-Europe/Zurich.generic.long=Ora dell'Europa centrale +-GB-Eire.generic.long=Ora britannica +-GB.generic.long=Ora britannica +-GMT.generic.long=Ora media di Greenwich +-Greenwich.generic.long=Ora media di Greenwich +-HST.generic.long=Ora Hawaii +-Hongkong.generic.long=Ora di Hong Kong +-IET.generic.long=Fuso orientale +-IST.generic.long=Ora India +-Iceland.generic.long=Ora media di Greenwich +-Indian/Antananarivo.generic.long=Ora dell'Africa orientale +-Indian/Chagos.generic.long=Ora del Territorio Britannico dell'Oceano Indiano +-Indian/Christmas.generic.long=Ora dell'Isola Christmas +-Indian/Cocos.generic.long=Ora delle Isole Cocos +-Indian/Comoro.generic.long=Ora dell'Africa orientale +-Indian/Kerguelen.generic.long=Ora delle Terre Australi e Antartiche Francesi +-Indian/Mahe.generic.long=Ora delle Seychelles +-Indian/Maldives.generic.long=Ora delle Maldive +-Indian/Mauritius.generic.long=Ora di Mauritius +-Indian/Mayotte.generic.long=Ora dell'Africa orientale +-Indian/Reunion.generic.long=Ora di Reunion +-Iran.generic.long=Ora Iran +-Israel.generic.long=Ora Israele +-JST.generic.long=Ora Giappone +-Jamaica.generic.long=Fuso orientale +-Japan.generic.long=Ora Giappone +-Kwajalein.generic.long=Ora delle Isole Marshall +-Libya.generic.long=Ora dell'Europa orientale +-MET.generic.long=MET +-MIT.generic.long=Ora di Samoa occidentale +-MST.generic.long=Ora fuso occidentale +-MST7MDT.generic.long=Ora fuso occidentale +-Mexico/BajaNorte.generic.long=Fuso del Pacifico +-Mexico/BajaSur.generic.long=Ora fuso occidentale +-Mexico/General.generic.long=Ora fuso centrale +-NET.generic.long=Ora dell'Armenia +-NST.generic.long=Ora Nuova Zelanda +-NZ-CHAT.generic.long=Ora Chatham +-NZ.generic.long=Ora Nuova Zelanda +-Navajo.generic.long=Ora fuso occidentale +-PLT.generic.long=Ora del Pakistan +-PNT.generic.long=Ora fuso occidentale +-PRC.generic.long=Ora Cina +-PRT.generic.long=Fuso dell'Atlantico +-PST.generic.long=Fuso del Pacifico +-PST8PDT.generic.long=Fuso del Pacifico +-Pacific/Apia.generic.long=Ora di Samoa occidentale +-Pacific/Auckland.generic.long=Ora Nuova Zelanda +-Pacific/Chatham.generic.long=Ora Chatham +-Pacific/Chuuk.daylight.long=Ora estiva di Chuuk +-Pacific/Chuuk.generic.long=Ora di Chuuk +-Pacific/Chuuk.standard.long=Ora di Chuuk +-Pacific/Easter.generic.long=Ora dell'Isola di Pasqua +-Pacific/Efate.generic.long=Ora di Vanuatu +-Pacific/Enderbury.generic.long=Ora delle Isole Phoenix +-Pacific/Fakaofo.generic.long=Ora di Tokelau +-Pacific/Fiji.generic.long=Ora di Figi +-Pacific/Funafuti.generic.long=Ora di Tuvalu +-Pacific/Galapagos.generic.long=Ora delle Galapagos +-Pacific/Gambier.generic.long=Ora di Gambier +-Pacific/Guadalcanal.generic.long=Ora delle Isole Salomone +-Pacific/Guam.generic.long=Ora Chamorro +-Pacific/Honolulu.generic.long=Ora Hawaii +-Pacific/Johnston.generic.long=Ora Hawaii +-Pacific/Kiritimati.generic.long=Ora delle Line Islands +-Pacific/Kosrae.generic.long=Ora di Kosrae +-Pacific/Kwajalein.generic.long=Ora delle Isole Marshall +-Pacific/Majuro.generic.long=Ora delle Isole Marshall +-Pacific/Marquesas.generic.long=Ora delle Isole Marchesi +-Pacific/Midway.generic.long=Ora Samoa +-Pacific/Nauru.generic.long=Ora di Nauru +-Pacific/Niue.generic.long=Ora di Niue +-Pacific/Norfolk.generic.long=Ora di Norfolk +-Pacific/Noumea.generic.long=Ora della Nuova Caledonia +-Pacific/Pago_Pago.generic.long=Ora Samoa +-Pacific/Palau.generic.long=Ora di Palau +-Pacific/Pitcairn.generic.long=Ora Pitcairn +-Pacific/Pohnpei.daylight.long=Ora estiva di Pohnpei +-Pacific/Pohnpei.generic.long=Ora Ponape +-Pacific/Pohnpei.standard.long=Ora di Pohnpei +-Pacific/Ponape.daylight.long=Ora estiva di Pohnpei +-Pacific/Ponape.generic.long=Ora Ponape +-Pacific/Ponape.standard.long=Ora di Pohnpei +-Pacific/Port_Moresby.generic.long=Ora di Papua Nuova Guinea +-Pacific/Rarotonga.generic.long=Ora delle Isole Cook +-Pacific/Saipan.generic.long=Ora Chamorro +-Pacific/Samoa.generic.long=Ora Samoa +-Pacific/Tahiti.generic.long=Ora di Tahiti +-Pacific/Tarawa.generic.long=Ora delle Isole Gilbert +-Pacific/Tongatapu.generic.long=Ora di Tonga +-Pacific/Truk.daylight.long=Ora estiva di Chuuk +-Pacific/Truk.generic.long=Ora di Chuuk +-Pacific/Truk.standard.long=Ora di Chuuk +-Pacific/Wake.generic.long=Ora di Wake +-Pacific/Wallis.generic.long=Ora di Wallis e Futuna +-Pacific/Yap.daylight.long=Ora estiva di Chuuk +-Pacific/Yap.generic.long=Ora di Chuuk +-Pacific/Yap.standard.long=Ora di Chuuk +-Poland.generic.long=Ora dell'Europa centrale +-Portugal.generic.long=Ora dell'Europa occidentale +-ROK.generic.long=Ora Corea +-SST.generic.long=Ora delle Isole Salomone +-Singapore.generic.long=Ora di Singapore +-SystemV/AST4.generic.long=Fuso dell'Atlantico +-SystemV/AST4ADT.generic.long=Fuso dell'Atlantico +-SystemV/CST6.generic.long=Ora fuso centrale +-SystemV/CST6CDT.generic.long=Ora fuso centrale +-SystemV/EST5.generic.long=Fuso orientale +-SystemV/EST5EDT.generic.long=Fuso orientale +-SystemV/HST10.generic.long=Ora Hawaii +-SystemV/MST7.generic.long=Ora fuso occidentale +-SystemV/MST7MDT.generic.long=Ora fuso occidentale +-SystemV/PST8.generic.long=Fuso del Pacifico +-SystemV/PST8PDT.generic.long=Fuso del Pacifico +-SystemV/YST9.generic.long=Ora Alaska +-SystemV/YST9YDT.generic.long=Ora Alaska +-Turkey.generic.long=Ora dell'Europa orientale +-UCT.generic.long=Tempo universale coordinato +-US/Alaska.generic.long=Ora Alaska +-US/Aleutian.generic.long=Ora Hawaii-Aleutine +-US/Arizona.generic.long=Ora fuso occidentale +-US/Central.generic.long=Ora fuso centrale +-US/East-Indiana.generic.long=Fuso orientale +-US/Eastern.generic.long=Fuso orientale +-US/Hawaii.generic.long=Ora Hawaii +-US/Indiana-Starke.generic.long=Ora fuso centrale +-US/Michigan.generic.long=Fuso orientale +-US/Mountain.generic.long=Ora fuso occidentale +-US/Pacific-New.generic.long=Fuso del Pacifico +-US/Pacific.generic.long=Fuso del Pacifico +-US/Samoa.generic.long=Ora Samoa +-UTC.generic.long=Tempo universale coordinato +-Universal.generic.long=Tempo universale coordinato +-VST.generic.long=Ora dell'Indocina +-W-SU.generic.long=Ora Mosca +-WET.generic.long=Ora dell'Europa occidentale +-Zulu.generic.long=Tempo universale coordinato +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_it_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_it_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_ja.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_ja.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=\u4E2D\u90E8\u590F\u6642\u9593(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC) +-ACT.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC) +-ACT.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC) +-AET.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-AET.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-AET.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-AGT.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-ART.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-AST.generic.long=\u30A2\u30E9\u30B9\u30AB\u6642\u9593 +-Africa/Abidjan.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Accra.generic.long=\u30AC\u30FC\u30CA\u6A19\u6E96\u6642 +-Africa/Addis_Ababa.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Algiers.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Africa/Asmara.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Asmera.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Bamako.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Bangui.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Banjul.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Bissau.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Blantyre.generic.long=\u4E2D\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Brazzaville.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Bujumbura.generic.long=\u4E2D\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Cairo.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Africa/Casablanca.generic.long=\u897F\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Africa/Ceuta.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Africa/Conakry.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Dakar.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Dar_es_Salaam.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Djibouti.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Douala.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/El_Aaiun.generic.long=\u897F\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Africa/Freetown.generic.long=\u30B7\u30A8\u30E9\u30EC\u30AA\u30CD\u6642\u9593 +-Africa/Gaborone.generic.long=\u4E2D\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Harare.generic.long=\u4E2D\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Johannesburg.generic.long=\u5357\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Juba.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Kampala.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Khartoum.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Kigali.generic.long=\u4E2D\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Kinshasa.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Lagos.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Libreville.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Lome.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Luanda.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Lubumbashi.generic.long=\u4E2D\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Lusaka.generic.long=\u4E2D\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Malabo.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Maputo.generic.long=\u4E2D\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Maseru.generic.long=\u5357\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Mbabane.generic.long=\u5357\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Mogadishu.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Monrovia.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Nairobi.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Ndjamena.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Niamey.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Nouakchott.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Ouagadougou.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Porto-Novo.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Africa/Sao_Tome.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Timbuktu.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Africa/Tripoli.generic.long=\u6771\u90e8\u30e8\u30fc\u30ed\u30c3\u30d1\u6642\u9593 +-Africa/Tunis.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Africa/Windhoek.generic.long=\u897F\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-America/Adak.generic.long=\u30CF\u30EF\u30A4\u30FB\u30A2\u30EA\u30E5\u30FC\u30B7\u30E3\u30F3\u6642\u9593 +-America/Anchorage.generic.long=\u30A2\u30E9\u30B9\u30AB\u6642\u9593 +-America/Anguilla.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Antigua.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Araguaina.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-America/Argentina/Buenos_Aires.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/Catamarca.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/ComodRivadavia.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/Cordoba.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/Jujuy.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/La_Rioja.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/Mendoza.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/Rio_Gallegos.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/Salta.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/San_Juan.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/San_Luis.generic.long=\u30a2\u30eb\u30bc\u30f3\u30c1\u30f3\u6642\u9593 +-America/Argentina/Tucuman.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Argentina/Ushuaia.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Aruba.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Asuncion.generic.long=\u30D1\u30E9\u30B0\u30A2\u30A4\u6642\u9593 +-America/Atikokan.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Atka.generic.long=\u30CF\u30EF\u30A4\u30FB\u30A2\u30EA\u30E5\u30FC\u30B7\u30E3\u30F3\u6642\u9593 +-America/Bahia.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-America/Bahia_Banderas.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Barbados.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Belem.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-America/Belize.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Blanc-Sablon.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Boa_Vista.generic.long=\u30A2\u30DE\u30BE\u30F3\u6642\u9593 +-America/Bogota.generic.long=\u30B3\u30ED\u30F3\u30D3\u30A2\u6642\u9593 +-America/Boise.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Buenos_Aires.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Cambridge_Bay.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Campo_Grande.generic.long=\u30A2\u30DE\u30BE\u30F3\u6642\u9593 +-America/Cancun.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Caracas.generic.long=\u30D9\u30CD\u30BA\u30A8\u30E9\u6642\u9593 +-America/Catamarca.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Cayenne.generic.long=\u30D5\u30E9\u30F3\u30B9\u9818\u30AE\u30A2\u30CA\u6642\u9593 +-America/Cayman.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Chicago.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Chihuahua.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Coral_Harbour.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Cordoba.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Costa_Rica.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Creston.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Cuiaba.generic.long=\u30A2\u30DE\u30BE\u30F3\u6642\u9593 +-America/Curacao.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Danmarkshavn.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-America/Dawson.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-America/Dawson_Creek.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Denver.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Detroit.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Dominica.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Edmonton.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Eirunepe.generic.long=\u30a2\u30af\u30ec\u6642\u9593 +-America/El_Salvador.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Ensenada.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-America/Fort_Wayne.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Fortaleza.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-America/Glace_Bay.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Godthab.generic.long=\u897F\u90E8\u30B0\u30EA\u30FC\u30F3\u30E9\u30F3\u30C9\u6642\u9593 +-America/Goose_Bay.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Grand_Turk.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Grenada.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Guadeloupe.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Guatemala.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Guayaquil.generic.long=\u30A8\u30AF\u30A2\u30C9\u30EB\u6642\u9593 +-America/Guyana.generic.long=\u30AC\u30A4\u30A2\u30CA\u6642\u9593 +-America/Halifax.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Havana.generic.long=\u30AD\u30E5\u30FC\u30D0\u6642\u9593 +-America/Hermosillo.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Indiana/Indianapolis.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Indiana/Knox.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Indiana/Marengo.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Indiana/Petersburg.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Indiana/Tell_City.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Indiana/Vevay.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Indiana/Vincennes.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Indiana/Winamac.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Indianapolis.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Inuvik.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Iqaluit.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Jamaica.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Jujuy.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Juneau.generic.long=\u30A2\u30E9\u30B9\u30AB\u6642\u9593 +-America/Kentucky/Louisville.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Kentucky/Monticello.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Knox_IN.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Kralendijk.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/La_Paz.generic.long=\u30DC\u30EA\u30D3\u30A2\u6642\u9593 +-America/Lima.generic.long=\u30DA\u30EB\u30FC\u6642\u9593 +-America/Los_Angeles.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-America/Louisville.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Lower_Princes.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Maceio.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-America/Managua.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Manaus.generic.long=\u30A2\u30DE\u30BE\u30F3\u6642\u9593 +-America/Marigot.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Martinique.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Matamoros.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Mazatlan.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Mendoza.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Menominee.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Merida.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Metlakatla.daylight.long=\u30E1\u30C8\u30E9\u30AB\u30C8\u30E9\u590F\u6642\u9593 +-America/Metlakatla.generic.long=\u30E1\u30C8\u30E9\u30AB\u30C8\u30E9\u6642\u9593 +-America/Metlakatla.standard.long=\u30E1\u30C8\u30E9\u30AB\u30C8\u30E9\u6A19\u6E96\u6642\u9593 +-America/Mexico_City.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Miquelon.generic.long=\u30D4\u30A8\u30FC\u30EB\u30FB\u30DF\u30AF\u30ED\u30F3\u6642\u9593 +-America/Moncton.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Monterrey.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Montevideo.generic.long=\u30A6\u30EB\u30B0\u30A2\u30A4\u6642\u9593 +-America/Montreal.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Montserrat.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Nassau.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/New_York.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Nipigon.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Nome.generic.long=\u30A2\u30E9\u30B9\u30AB\u6642\u9593 +-America/Noronha.generic.long=\u30D5\u30A7\u30EB\u30CA\u30F3\u30C9\u30FB\u30C7\u30FB\u30CE\u30ED\u30FC\u30CB\u30E3\u6642\u9593 +-America/North_Dakota/Beulah.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/North_Dakota/Center.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/North_Dakota/New_Salem.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Ojinaga.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Panama.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Pangnirtung.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Paramaribo.generic.long=\u30B9\u30EA\u30CA\u30E0\u6642\u9593 +-America/Phoenix.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Port-au-Prince.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Port_of_Spain.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Porto_Acre.generic.long=\u30a2\u30af\u30ec\u6642\u9593 +-America/Porto_Velho.generic.long=\u30A2\u30DE\u30BE\u30F3\u6642\u9593 +-America/Puerto_Rico.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Rainy_River.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Rankin_Inlet.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Recife.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-America/Regina.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Resolute.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Rio_Branco.generic.long=\u30a2\u30af\u30ec\u6642\u9593 +-America/Rosario.generic.long=\u30A2\u30EB\u30BC\u30F3\u30C1\u30F3\u6642\u9593 +-America/Santa_Isabel.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-America/Santarem.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-America/Santiago.generic.long=\u30C1\u30EA\u6642\u9593 +-America/Santo_Domingo.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Sao_Paulo.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-America/Scoresbysund.generic.long=\u6771\u90E8\u30B0\u30EA\u30FC\u30F3\u30E9\u30F3\u30C9\u6642\u9593 +-America/Shiprock.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-America/Sitka.generic.long=\u30A2\u30E9\u30B9\u30AB\u6642\u9593 +-America/St_Barthelemy.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/St_Johns.generic.long=\u30CB\u30E5\u30FC\u30D5\u30A1\u30F3\u30C9\u30E9\u30F3\u30C9\u6642\u9593 +-America/St_Kitts.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/St_Lucia.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/St_Thomas.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/St_Vincent.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Swift_Current.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Tegucigalpa.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Thule.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Thunder_Bay.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Tijuana.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-America/Toronto.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-America/Tortola.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Vancouver.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-America/Virgin.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-America/Whitehorse.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-America/Winnipeg.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-America/Yakutat.generic.long=\u30A2\u30E9\u30B9\u30AB\u6642\u9593 +-America/Yellowknife.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-Antarctica/Casey.daylight.long=\u897F\u90E8\u590F\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Antarctica/Casey.generic.long=\u897F\u90E8\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Antarctica/Casey.standard.long=\u897F\u90E8\u6A19\u6E96\u6642(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Antarctica/Davis.generic.long=\u30C7\u30FC\u30D3\u30B9\u6642\u9593 +-Antarctica/DumontDUrville.generic.long=\u30C7\u30E5\u30E2\u30F3\u30FB\u30C7\u30E5\u30EB\u30D3\u30EB\u6642\u9593 +-Antarctica/Macquarie.daylight.long=\u30DE\u30C3\u30B3\u30FC\u30EA\u30FC\u5CF6\u590F\u6642\u9593 +-Antarctica/Macquarie.generic.long=\u30DE\u30C3\u30B3\u30FC\u30EA\u30FC\u5CF6\u6642\u9593 +-Antarctica/Macquarie.standard.long=\u30DE\u30C3\u30B3\u30FC\u30EA\u30FC\u5CF6\u6642\u9593 +-Antarctica/Mawson.generic.long=\u30E2\u30FC\u30BD\u30F3\u6642\u9593 +-Antarctica/McMurdo.generic.long=\u30CB\u30E5\u30FC\u30B8\u30FC\u30E9\u30F3\u30C9\u6642\u9593 +-Antarctica/Palmer.generic.long=\u30C1\u30EA\u6642\u9593 +-Antarctica/Rothera.generic.long=\u30ED\u30BC\u30E9\u6642\u9593 +-Antarctica/South_Pole.generic.long=\u30CB\u30E5\u30FC\u30B8\u30FC\u30E9\u30F3\u30C9\u6642\u9593 +-Antarctica/Syowa.generic.long=\u662D\u548C\u57FA\u5730\u6642\u9593 +-Antarctica/Vostok.generic.long=\u30DC\u30B9\u30C8\u30FC\u30AF\u6642\u9593 +-Arctic/Longyearbyen.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Asia/Aden.generic.long=\u30A2\u30E9\u30D3\u30A2\u6642\u9593 +-Asia/Almaty.generic.long=\u30A2\u30EB\u30DE\u30A2\u30BF\u6642\u9593 +-Asia/Amman.generic.long=\u30a2\u30e9\u30d3\u30a2\u6642\u9593 +-Asia/Anadyr.generic.long=\u30A2\u30CA\u30C7\u30A3\u30EA\u6642\u9593 +-Asia/Aqtau.generic.long=\u30A2\u30AF\u30BF\u30A6\u6642\u9593 +-Asia/Aqtobe.generic.long=\u30A2\u30AF\u30C8\u30D9\u6642\u9593 +-Asia/Ashgabat.generic.long=\u30C8\u30EB\u30AF\u30E1\u30CB\u30B9\u30BF\u30F3\u6642\u9593 +-Asia/Ashkhabad.generic.long=\u30C8\u30EB\u30AF\u30E1\u30CB\u30B9\u30BF\u30F3\u6642\u9593 +-Asia/Baghdad.generic.long=\u30A2\u30E9\u30D3\u30A2\u6642\u9593 +-Asia/Bahrain.generic.long=\u30A2\u30E9\u30D3\u30A2\u6642\u9593 +-Asia/Baku.generic.long=\u30A2\u30BC\u30EB\u30D0\u30A4\u30B8\u30E3\u30F3\u6642\u9593 +-Asia/Bangkok.generic.long=\u30A4\u30F3\u30C9\u30B7\u30CA\u6642\u9593 +-Asia/Beirut.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Asia/Bishkek.generic.long=\u30AD\u30EB\u30AE\u30B9\u6642\u9593 +-Asia/Brunei.generic.long=\u30D6\u30EB\u30CD\u30A4\u6642\u9593 +-Asia/Calcutta.generic.long=\u30A4\u30F3\u30C9\u6642\u9593 +-Asia/Choibalsan.generic.long=\u30C1\u30E7\u30A4\u30D0\u30EB\u30B5\u30F3\u6642\u9593 +-Asia/Chongqing.generic.long=\u4E2D\u56FD\u6642\u9593 +-Asia/Chungking.generic.long=\u4E2D\u56FD\u6642\u9593 +-Asia/Colombo.generic.long=\u30A4\u30F3\u30C9\u6642\u9593 +-Asia/Dacca.generic.long=\u30D0\u30F3\u30B0\u30E9\u30C7\u30B7\u30E5\u6642\u9593 +-Asia/Damascus.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Asia/Dhaka.generic.long=\u30D0\u30F3\u30B0\u30E9\u30C7\u30B7\u30E5\u6642\u9593 +-Asia/Dili.generic.long=\u6771\u30C6\u30A3\u30E2\u30FC\u30EB\u6642\u9593 +-Asia/Dubai.generic.long=\u6E7E\u5CB8\u6642\u9593 +-Asia/Dushanbe.generic.long=\u30BF\u30B8\u30AD\u30B9\u30BF\u30F3\u6642\u9593 +-Asia/Gaza.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Asia/Harbin.generic.long=\u4E2D\u56FD\u6642\u9593 +-Asia/Hebron.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Asia/Ho_Chi_Minh.generic.long=\u30A4\u30F3\u30C9\u30B7\u30CA\u6642\u9593 +-Asia/Hong_Kong.generic.long=\u9999\u6E2F\u6642\u9593 +-Asia/Hovd.generic.long=\u30DB\u30D6\u30C9\u6642\u9593 +-Asia/Irkutsk.generic.long=\u30A4\u30EB\u30AF\u30FC\u30C4\u30AF\u6642\u9593 +-Asia/Istanbul.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Asia/Jakarta.generic.long=\u897F\u90E8\u30A4\u30F3\u30C9\u30CD\u30B7\u30A2\u6642\u9593 +-Asia/Jayapura.generic.long=\u6771\u90E8\u30A4\u30F3\u30C9\u30CD\u30B7\u30A2\u6642\u9593 +-Asia/Jerusalem.generic.long=\u30A4\u30B9\u30E9\u30A8\u30EB\u6642\u9593 +-Asia/Kabul.generic.long=\u30A2\u30D5\u30AC\u30CB\u30B9\u30BF\u30F3\u6642\u9593 +-Asia/Kamchatka.generic.long=\u30DA\u30C8\u30ED\u30D1\u30D6\u30ED\u30D5\u30B9\u30AF\u30FB\u30AB\u30E0\u30C1\u30E3\u30C4\u30AD\u30FC\u6642\u9593 +-Asia/Karachi.generic.long=\u30D1\u30AD\u30B9\u30BF\u30F3\u6642\u9593 +-Asia/Kashgar.generic.long=\u4E2D\u56FD\u6642\u9593 +-Asia/Kathmandu.generic.long=\u30CD\u30D1\u30FC\u30EB\u6642\u9593 +-Asia/Katmandu.generic.long=\u30CD\u30D1\u30FC\u30EB\u6642\u9593 +-Asia/Khandyga.daylight.long=\u30CF\u30F3\u30C9\u30A5\u30A4\u30AC\u590F\u6642\u9593 +-Asia/Khandyga.generic.long=\u30CF\u30F3\u30C9\u30A5\u30A4\u30AC\u6642\u9593 +-Asia/Khandyga.standard.long=\u30CF\u30F3\u30C9\u30A5\u30A4\u30AC\u6642\u9593 +-Asia/Kolkata.generic.long=\u30A4\u30F3\u30C9\u6642\u9593 +-Asia/Krasnoyarsk.generic.long=\u30AF\u30E9\u30B9\u30CE\u30E4\u30EB\u30B9\u30AF\u6642\u9593 +-Asia/Kuala_Lumpur.generic.long=\u30DE\u30EC\u30FC\u30B7\u30A2\u6642\u9593 +-Asia/Kuching.generic.long=\u30DE\u30EC\u30FC\u30B7\u30A2\u6642\u9593 +-Asia/Kuwait.generic.long=\u30A2\u30E9\u30D3\u30A2\u6642\u9593 +-Asia/Macao.generic.long=\u4E2D\u56FD\u6642\u9593 +-Asia/Macau.generic.long=\u4E2D\u56FD\u6642\u9593 +-Asia/Magadan.generic.long=\u30DE\u30AC\u30C0\u30F3\u6642\u9593 +-Asia/Makassar.generic.long=\u4E2D\u90E8\u30A4\u30F3\u30C9\u30CD\u30B7\u30A2\u6642\u9593 +-Asia/Manila.generic.long=\u30D5\u30A3\u30EA\u30D4\u30F3\u6642\u9593 +-Asia/Muscat.generic.long=\u6E7E\u5CB8\u6642\u9593 +-Asia/Nicosia.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Asia/Novokuznetsk.generic.long=\u30CE\u30F4\u30A9\u30B7\u30D3\u30EB\u30B9\u30AF\u6642\u9593 +-Asia/Novosibirsk.generic.long=\u30CE\u30F4\u30A9\u30B7\u30D3\u30EB\u30B9\u30AF\u6642\u9593 +-Asia/Omsk.generic.long=\u30AA\u30E0\u30B9\u30AF\u6642\u9593 +-Asia/Oral.generic.long=\u30AA\u30E9\u30EB\u6642\u9593 +-Asia/Phnom_Penh.generic.long=\u30A4\u30F3\u30C9\u30B7\u30CA\u6642\u9593 +-Asia/Pontianak.generic.long=\u897F\u90E8\u30A4\u30F3\u30C9\u30CD\u30B7\u30A2\u6642\u9593 +-Asia/Pyongyang.generic.long=\u97D3\u56FD\u6642\u9593 +-Asia/Qatar.generic.long=\u30A2\u30E9\u30D3\u30A2\u6642\u9593 +-Asia/Qyzylorda.generic.long=\u30AF\u30BA\u30ED\u30EB\u30C0\u6642\u9593 +-Asia/Rangoon.generic.long=\u30DF\u30E3\u30F3\u30DE\u30FC\u6642\u9593 +-Asia/Saigon.generic.long=\u30A4\u30F3\u30C9\u30B7\u30CA\u6642\u9593 +-Asia/Sakhalin.generic.long=\u30B5\u30CF\u30EA\u30F3\u6642\u9593 +-Asia/Samarkand.generic.long=\u30A6\u30BA\u30D9\u30AD\u30B9\u30BF\u30F3\u6642\u9593 +-Asia/Seoul.generic.long=\u97D3\u56FD\u6642\u9593 +-Asia/Shanghai.generic.long=\u4E2D\u56FD\u6642\u9593 +-Asia/Singapore.generic.long=\u30B7\u30F3\u30AC\u30DD\u30FC\u30EB\u6642\u9593 +-Asia/Taipei.generic.long=\u4E2D\u56FD\u6642\u9593 +-Asia/Tashkent.generic.long=\u30A6\u30BA\u30D9\u30AD\u30B9\u30BF\u30F3\u6642\u9593 +-Asia/Tbilisi.generic.long=\u30B0\u30EB\u30B8\u30A2\u6642\u9593 +-Asia/Tehran.generic.long=\u30A4\u30E9\u30F3\u6642\u9593 +-Asia/Tel_Aviv.generic.long=\u30A4\u30B9\u30E9\u30A8\u30EB\u6642\u9593 +-Asia/Thimbu.generic.long=\u30D6\u30FC\u30BF\u30F3\u6642\u9593 +-Asia/Thimphu.generic.long=\u30D6\u30FC\u30BF\u30F3\u6642\u9593 +-Asia/Tokyo.generic.long=\u65E5\u672C\u6642\u9593 +-Asia/Ujung_Pandang.generic.long=\u4E2D\u90E8\u30A4\u30F3\u30C9\u30CD\u30B7\u30A2\u6642\u9593 +-Asia/Ulaanbaatar.generic.long=\u30A6\u30E9\u30F3\u30D0\u30FC\u30C8\u30EB\u6642\u9593 +-Asia/Ulan_Bator.generic.long=\u30A6\u30E9\u30F3\u30D0\u30FC\u30C8\u30EB\u6642\u9593 +-Asia/Urumqi.generic.long=\u4E2D\u56FD\u6642\u9593 +-Asia/Ust-Nera.daylight.long=\u30A6\u30B9\u30C1\u30CD\u30E9\u590F\u6642\u9593 +-Asia/Ust-Nera.generic.long=\u30A6\u30B9\u30C1\u30CD\u30E9\u6642\u9593 +-Asia/Ust-Nera.standard.long=\u30A6\u30B9\u30C1\u30CD\u30E9\u6642\u9593 +-Asia/Vientiane.generic.long=\u30A4\u30F3\u30C9\u30B7\u30CA\u6642\u9593 +-Asia/Vladivostok.generic.long=\u30A6\u30E9\u30B8\u30AA\u30B9\u30C8\u30AF\u6642\u9593 +-Asia/Yakutsk.generic.long=\u30E4\u30AF\u30FC\u30C4\u30AF\u6642\u9593 +-Asia/Yekaterinburg.generic.long=\u30A8\u30AB\u30C6\u30EA\u30F3\u30D6\u30EB\u30AF\u6642\u9593 +-Asia/Yerevan.generic.long=\u30A2\u30EB\u30E1\u30CB\u30A2\u6642\u9593 +-Atlantic/Azores.generic.long=\u30A2\u30BE\u30EC\u30B9\u6642\u9593 +-Atlantic/Bermuda.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-Atlantic/Canary.generic.long=\u897F\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Atlantic/Cape_Verde.generic.long=\u30AB\u30FC\u30DC\u30D9\u30EB\u30C7\u6642\u9593 +-Atlantic/Faeroe.generic.long=\u897F\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Atlantic/Faroe.generic.long=\u897F\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Atlantic/Jan_Mayen.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Atlantic/Madeira.generic.long=\u897F\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Atlantic/Reykjavik.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Atlantic/South_Georgia.generic.long=\u5357\u30B8\u30E7\u30FC\u30B8\u30A2\u6642\u9593 +-Atlantic/St_Helena.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Atlantic/Stanley.generic.long=\u30D5\u30A9\u30FC\u30AF\u30E9\u30F3\u30C9\u8AF8\u5CF6\u6642\u9593 +-Australia/ACT.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/ACT.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/ACT.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Adelaide.daylight.long=\u4E2D\u90E8\u590F\u6642\u9593(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Adelaide.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Adelaide.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Brisbane.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9) +-Australia/Brisbane.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9) +-Australia/Brisbane.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9) +-Australia/Broken_Hill.daylight.long=\u4E2D\u90E8\u590F\u6642\u9593(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Broken_Hill.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Broken_Hill.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Canberra.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Canberra.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Canberra.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Currie.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Currie.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Currie.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Darwin.daylight.long=\u4E2D\u90E8\u590F\u6642\u9593(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC) +-Australia/Darwin.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC) +-Australia/Darwin.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC) +-Australia/Eucla.daylight.long=\u4E2D\u897F\u90E8\u590F\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Eucla.generic.long=\u4E2D\u897F\u90E8\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Eucla.standard.long=\u4E2D\u897F\u90E8\u6A19\u6E96\u6642(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Hobart.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30BF\u30B9\u30DE\u30CB\u30A2) +-Australia/Hobart.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30BF\u30B9\u30DE\u30CB\u30A2) +-Australia/Hobart.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30BF\u30B9\u30DE\u30CB\u30A2) +-Australia/LHI.generic.long=\u30ED\u30FC\u30C9\u30CF\u30A6\u6642\u9593 +-Australia/Lindeman.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9) +-Australia/Lindeman.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9) +-Australia/Lindeman.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9) +-Australia/Lord_Howe.generic.long=\u30ED\u30FC\u30C9\u30CF\u30A6\u6642\u9593 +-Australia/Melbourne.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30D3\u30AF\u30C8\u30EA\u30A2) +-Australia/Melbourne.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30D3\u30AF\u30C8\u30EA\u30A2) +-Australia/Melbourne.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30D3\u30AF\u30C8\u30EA\u30A2) +-Australia/NSW.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/NSW.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/NSW.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/North.daylight.long=\u4E2D\u90E8\u590F\u6642\u9593(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC) +-Australia/North.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC) +-Australia/North.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u30CE\u30FC\u30B6\u30F3\u30C6\u30EA\u30C8\u30EA\u30FC) +-Australia/Perth.daylight.long=\u897F\u90E8\u590F\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Perth.generic.long=\u897F\u90E8\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Perth.standard.long=\u897F\u90E8\u6A19\u6E96\u6642(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Queensland.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9) +-Australia/Queensland.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9) +-Australia/Queensland.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30AF\u30A4\u30FC\u30F3\u30BA\u30E9\u30F3\u30C9) +-Australia/South.daylight.long=\u4E2D\u90E8\u590F\u6642\u9593(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/South.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/South.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Sydney.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Sydney.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Sydney.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Tasmania.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30BF\u30B9\u30DE\u30CB\u30A2) +-Australia/Tasmania.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30BF\u30B9\u30DE\u30CB\u30A2) +-Australia/Tasmania.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30BF\u30B9\u30DE\u30CB\u30A2) +-Australia/Victoria.daylight.long=\u6771\u90E8\u590F\u6642\u9593(\u30D3\u30AF\u30C8\u30EA\u30A2) +-Australia/Victoria.generic.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30D3\u30AF\u30C8\u30EA\u30A2) +-Australia/Victoria.standard.long=\u6771\u90E8\u6A19\u6E96\u6642(\u30D3\u30AF\u30C8\u30EA\u30A2) +-Australia/West.daylight.long=\u897F\u90E8\u590F\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/West.generic.long=\u897F\u90E8\u6642\u9593(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/West.standard.long=\u897F\u90E8\u6A19\u6E96\u6642(\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2) +-Australia/Yancowinna.daylight.long=\u4E2D\u90E8\u590F\u6642\u9593(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Yancowinna.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-Australia/Yancowinna.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642(\u5357\u30AA\u30FC\u30B9\u30C8\u30E9\u30EA\u30A2/\u30CB\u30E5\u30FC\u30B5\u30A6\u30B9\u30A6\u30A7\u30FC\u30EB\u30BA) +-BET.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-BST.generic.long=\u30D0\u30F3\u30B0\u30E9\u30C7\u30B7\u30E5\u6642\u9593 +-Brazil/Acre.generic.long=\u30a2\u30af\u30ec\u6642\u9593 +-Brazil/DeNoronha.generic.long=\u30D5\u30A7\u30EB\u30CA\u30F3\u30C9\u30FB\u30C7\u30FB\u30CE\u30ED\u30FC\u30CB\u30E3\u6642\u9593 +-Brazil/East.generic.long=\u30D6\u30E9\u30B8\u30EA\u30A2\u6642\u9593 +-Brazil/West.generic.long=\u30A2\u30DE\u30BE\u30F3\u6642\u9593 +-CAT.generic.long=\u4E2D\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-CET.generic.long=\u4e2d\u90e8\u30e8\u30fc\u30ed\u30c3\u30d1\u6642\u9593 +-CNT.generic.long=\u30CB\u30E5\u30FC\u30D5\u30A1\u30F3\u30C9\u30E9\u30F3\u30C9\u6642\u9593 +-CST.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-CST6CDT.generic.long=\u4e2d\u90e8\u6a19\u6e96\u6642 +-CTT.generic.long=\u4E2D\u56FD\u6642\u9593 +-Canada/Atlantic.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-Canada/Central.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-Canada/East-Saskatchewan.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-Canada/Eastern.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-Canada/Mountain.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-Canada/Newfoundland.generic.long=\u30CB\u30E5\u30FC\u30D5\u30A1\u30F3\u30C9\u30E9\u30F3\u30C9\u6642\u9593 +-Canada/Pacific.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-Canada/Saskatchewan.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-Canada/Yukon.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-Chile/Continental.generic.long=\u30C1\u30EA\u6642\u9593 +-Chile/EasterIsland.generic.long=\u30A4\u30FC\u30B9\u30BF\u30FC\u5CF6\u6642\u9593 +-Cuba.generic.long=\u30AD\u30E5\u30FC\u30D0\u6642\u9593 +-EAT.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-ECT.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-EET.generic.long=\u6771\u90e8\u30e8\u30fc\u30ed\u30c3\u30d1\u6642\u9593 +-EST.generic.long=\u6771\u90e8\u6a19\u6e96\u6642 +-EST5EDT.generic.long=\u6771\u90e8\u6a19\u6e96\u6642 +-Egypt.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Eire.generic.long=\u30A2\u30A4\u30EB\u30E9\u30F3\u30C9\u6642\u9593 +-Etc/Greenwich.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Etc/UCT.generic.long=\u5354\u5B9A\u4E16\u754C\u6642 +-Etc/UTC.generic.long=\u5354\u5B9A\u4E16\u754C\u6642 +-Etc/Universal.generic.long=\u5354\u5B9A\u4E16\u754C\u6642 +-Etc/Zulu.generic.long=\u5354\u5B9A\u4E16\u754C\u6642 +-Europe/Amsterdam.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Andorra.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Athens.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Belfast.generic.long=\u30A4\u30AE\u30EA\u30B9\u6642\u9593 +-Europe/Belgrade.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Berlin.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Bratislava.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Brussels.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Bucharest.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Budapest.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Busingen.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Chisinau.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Copenhagen.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Dublin.generic.long=\u30A2\u30A4\u30EB\u30E9\u30F3\u30C9\u6642\u9593 +-Europe/Gibraltar.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Guernsey.generic.long=\u30A4\u30AE\u30EA\u30B9\u6642\u9593 +-Europe/Helsinki.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Isle_of_Man.generic.long=\u30A4\u30AE\u30EA\u30B9\u6642\u9593 +-Europe/Istanbul.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Jersey.generic.long=\u30A4\u30AE\u30EA\u30B9\u6642\u9593 +-Europe/Kaliningrad.daylight.long=\u6975\u6771\u30E8\u30FC\u30ED\u30C3\u30D1\u590F\u6642\u9593 +-Europe/Kaliningrad.generic.long=\u6975\u6771\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Kaliningrad.standard.long=\u6975\u6771\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Kiev.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Lisbon.generic.long=\u897F\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Ljubljana.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/London.generic.long=\u30A4\u30AE\u30EA\u30B9\u6642\u9593 +-Europe/Luxembourg.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Madrid.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Malta.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Mariehamn.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Minsk.daylight.long=\u6975\u6771\u30E8\u30FC\u30ED\u30C3\u30D1\u590F\u6642\u9593 +-Europe/Minsk.generic.long=\u6975\u6771\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Minsk.standard.long=\u6975\u6771\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Monaco.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Moscow.generic.long=\u30E2\u30B9\u30AF\u30EF\u6642\u9593 +-Europe/Nicosia.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Oslo.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Paris.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Podgorica.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Prague.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Riga.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Rome.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Samara.generic.long=\u30B5\u30DE\u30E9\u6642\u9593 +-Europe/San_Marino.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Sarajevo.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Simferopol.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Skopje.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Sofia.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Stockholm.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Tallinn.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Tirane.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Tiraspol.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Uzhgorod.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Vaduz.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Vatican.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Vienna.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Vilnius.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Volgograd.generic.long=\u30DC\u30EB\u30B4\u30B0\u30E9\u30FC\u30C9\u6642\u9593 +-Europe/Warsaw.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Zagreb.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Zaporozhye.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Europe/Zurich.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-GB-Eire.generic.long=\u30A4\u30AE\u30EA\u30B9\u6642\u9593 +-GB.generic.long=\u30A4\u30AE\u30EA\u30B9\u6642\u9593 +-GMT.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Greenwich.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-HST.generic.long=\u30cf\u30ef\u30a4\u6642\u9593 +-Hongkong.generic.long=\u9999\u6E2F\u6642\u9593 +-IET.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-IST.generic.long=\u30A4\u30F3\u30C9\u6642\u9593 +-Iceland.generic.long=\u30B0\u30EA\u30CB\u30C3\u30B8\u6A19\u6E96\u6642 +-Indian/Antananarivo.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Indian/Chagos.generic.long=\u30A4\u30F3\u30C9\u6D0B\u5730\u57DF\u6642\u9593 +-Indian/Christmas.generic.long=\u30AF\u30EA\u30B9\u30DE\u30B9\u5CF6\u6642\u9593 +-Indian/Cocos.generic.long=\u30B3\u30B3\u30B9\u8AF8\u5CF6\u6642\u9593 +-Indian/Comoro.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Indian/Kerguelen.generic.long=\u30D5\u30E9\u30F3\u30B9\u9818\u5357\u65B9\u304A\u3088\u3073\u5357\u6975\u5927\u9678\u6642\u9593 +-Indian/Mahe.generic.long=\u30BB\u30FC\u30B7\u30A7\u30EB\u6642\u9593 +-Indian/Maldives.generic.long=\u30E2\u30EB\u30B8\u30D6\u6642\u9593 +-Indian/Mauritius.generic.long=\u30E2\u30FC\u30EA\u30B7\u30E3\u30B9\u6642\u9593 +-Indian/Mayotte.generic.long=\u6771\u90E8\u30A2\u30D5\u30EA\u30AB\u6642\u9593 +-Indian/Reunion.generic.long=\u30EC\u30E6\u30CB\u30AA\u30F3\u6642\u9593 +-Iran.generic.long=\u30A4\u30E9\u30F3\u6642\u9593 +-Israel.generic.long=\u30A4\u30B9\u30E9\u30A8\u30EB\u6642\u9593 +-JST.generic.long=\u65E5\u672C\u6642\u9593 +-Jamaica.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-Japan.generic.long=\u65E5\u672C\u6642\u9593 +-Kwajalein.generic.long=\u30DE\u30FC\u30B7\u30E3\u30EB\u8AF8\u5CF6\u6642\u9593 +-Libya.generic.long=\u6771\u90e8\u30e8\u30fc\u30ed\u30c3\u30d1\u6642\u9593 +-MET.generic.long=MET +-MIT.generic.long=\u897F\u30B5\u30E2\u30A2\u6642\u9593 +-MST.generic.long=\u5c71\u5730\u6a19\u6e96\u6642 +-MST7MDT.generic.long=\u5c71\u5730\u6a19\u6e96\u6642 +-Mexico/BajaNorte.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-Mexico/BajaSur.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-Mexico/General.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-NET.generic.long=\u30A2\u30EB\u30E1\u30CB\u30A2\u6642\u9593 +-NST.generic.long=\u30CB\u30E5\u30FC\u30B8\u30FC\u30E9\u30F3\u30C9\u6642\u9593 +-NZ-CHAT.generic.long=\u30C1\u30E3\u30BF\u30E0\u6642\u9593 +-NZ.generic.long=\u30CB\u30E5\u30FC\u30B8\u30FC\u30E9\u30F3\u30C9\u6642\u9593 +-Navajo.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-PLT.generic.long=\u30D1\u30AD\u30B9\u30BF\u30F3\u6642\u9593 +-PNT.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-PRC.generic.long=\u4E2D\u56FD\u6642\u9593 +-PRT.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-PST.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-PST8PDT.generic.long=\u592a\u5e73\u6d0b\u6a19\u6e96\u6642 +-Pacific/Apia.generic.long=\u897F\u30B5\u30E2\u30A2\u6642\u9593 +-Pacific/Auckland.generic.long=\u30CB\u30E5\u30FC\u30B8\u30FC\u30E9\u30F3\u30C9\u6642\u9593 +-Pacific/Chatham.generic.long=\u30C1\u30E3\u30BF\u30E0\u6642\u9593 +-Pacific/Chuuk.daylight.long=Chuuk Time +-Pacific/Chuuk.generic.long=\u30C1\u30E5\u30FC\u30AF\u6642\u9593 +-Pacific/Chuuk.standard.long=\u30C1\u30E5\u30FC\u30AF\u6642\u9593 +-Pacific/Easter.generic.long=\u30A4\u30FC\u30B9\u30BF\u30FC\u5CF6\u6642\u9593 +-Pacific/Efate.generic.long=\u30D0\u30CC\u30A2\u30C4\u6642\u9593 +-Pacific/Enderbury.generic.long=\u30D5\u30A7\u30CB\u30C3\u30AF\u30B9\u8AF8\u5CF6\u6642\u9593 +-Pacific/Fakaofo.generic.long=\u30C8\u30B1\u30E9\u30A6\u6642\u9593 +-Pacific/Fiji.generic.long=\u30D5\u30A3\u30B8\u30FC\u6642\u9593 +-Pacific/Funafuti.generic.long=\u30C4\u30D0\u30EB\u6642\u9593 +-Pacific/Galapagos.generic.long=\u30AC\u30E9\u30D1\u30B4\u30B9\u6642\u9593 +-Pacific/Gambier.generic.long=\u30AC\u30F3\u30D3\u30A8\u6642\u9593 +-Pacific/Guadalcanal.generic.long=\u30BD\u30ED\u30E2\u30F3\u8AF8\u5CF6\u6642\u9593 +-Pacific/Guam.generic.long=\u30C1\u30E3\u30E2\u30ED\u6642\u9593 +-Pacific/Honolulu.generic.long=\u30CF\u30EF\u30A4\u6642\u9593 +-Pacific/Johnston.generic.long=\u30CF\u30EF\u30A4\u6642\u9593 +-Pacific/Kiritimati.generic.long=\u30E9\u30A4\u30F3\u8AF8\u5CF6\u6642\u9593 +-Pacific/Kosrae.generic.long=\u30B3\u30B9\u30E9\u30A8\u6642\u9593 +-Pacific/Kwajalein.generic.long=\u30DE\u30FC\u30B7\u30E3\u30EB\u8AF8\u5CF6\u6642\u9593 +-Pacific/Majuro.generic.long=\u30DE\u30FC\u30B7\u30E3\u30EB\u8AF8\u5CF6\u6642\u9593 +-Pacific/Marquesas.generic.long=\u30DE\u30EB\u30AD\u30FC\u30BA\u6642\u9593 +-Pacific/Midway.generic.long=\u30B5\u30E2\u30A2\u6642\u9593 +-Pacific/Nauru.generic.long=\u30CA\u30A6\u30EB\u6642\u9593 +-Pacific/Niue.generic.long=\u30CB\u30A6\u30A8\u6642\u9593 +-Pacific/Norfolk.generic.long=\u30CE\u30FC\u30D5\u30A9\u30FC\u30AF\u6642\u9593 +-Pacific/Noumea.generic.long=\u30CB\u30E5\u30FC\u30AB\u30EC\u30C9\u30CB\u30A2\u6642\u9593 +-Pacific/Pago_Pago.generic.long=\u30B5\u30E2\u30A2\u6642\u9593 +-Pacific/Palau.generic.long=\u30D1\u30E9\u30AA\u6642\u9593 +-Pacific/Pitcairn.generic.long=\u30D4\u30C8\u30B1\u30A2\u30F3\u6642\u9593 +-Pacific/Pohnpei.daylight.long=\u30DD\u30F3\u30DA\u30A4\u590F\u6642\u9593 +-Pacific/Pohnpei.generic.long=\u30DD\u30CA\u30DA\u6642\u9593 +-Pacific/Pohnpei.standard.long=\u30DD\u30F3\u30DA\u30A4\u6642\u9593 +-Pacific/Ponape.daylight.long=\u30DD\u30F3\u30DA\u30A4\u590F\u6642\u9593 +-Pacific/Ponape.generic.long=\u30DD\u30CA\u30DA\u6642\u9593 +-Pacific/Ponape.standard.long=\u30DD\u30F3\u30DA\u30A4\u6642\u9593 +-Pacific/Port_Moresby.generic.long=\u30D1\u30D7\u30A2\u30CB\u30E5\u30FC\u30AE\u30CB\u30A2\u6642\u9593 +-Pacific/Rarotonga.generic.long=\u30AF\u30C3\u30AF\u8AF8\u5CF6\u6642\u9593 +-Pacific/Saipan.generic.long=\u30C1\u30E3\u30E2\u30ED\u6642\u9593 +-Pacific/Samoa.generic.long=\u30B5\u30E2\u30A2\u6642\u9593 +-Pacific/Tahiti.generic.long=\u30BF\u30D2\u30C1\u6642\u9593 +-Pacific/Tarawa.generic.long=\u30AE\u30EB\u30D0\u30FC\u30C8\u8AF8\u5CF6\u6642\u9593 +-Pacific/Tongatapu.generic.long=\u30C8\u30F3\u30AC\u6642\u9593 +-Pacific/Truk.daylight.long=Chuuk Time +-Pacific/Truk.generic.long=\u30C1\u30E5\u30FC\u30AF\u6642\u9593 +-Pacific/Truk.standard.long=\u30C1\u30E5\u30FC\u30AF\u6642\u9593 +-Pacific/Wake.generic.long=\u30A6\u30A7\u30FC\u30AF\u6642\u9593 +-Pacific/Wallis.generic.long=\u30A6\u30A9\u30EA\u30B9\u30FB\u30D5\u30C4\u30CA\u6642\u9593 +-Pacific/Yap.daylight.long=Chuuk Time +-Pacific/Yap.generic.long=\u30C1\u30E5\u30FC\u30AF\u6642\u9593 +-Pacific/Yap.standard.long=\u30C1\u30E5\u30FC\u30AF\u6642\u9593 +-Poland.generic.long=\u4E2D\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-Portugal.generic.long=\u897F\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-ROK.generic.long=\u97D3\u56FD\u6642\u9593 +-SST.generic.long=\u30BD\u30ED\u30E2\u30F3\u8AF8\u5CF6\u6642\u9593 +-Singapore.generic.long=\u30B7\u30F3\u30AC\u30DD\u30FC\u30EB\u6642\u9593 +-SystemV/AST4.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-SystemV/AST4ADT.generic.long=\u5927\u897F\u6D0B\u6A19\u6E96\u6642 +-SystemV/CST6.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-SystemV/CST6CDT.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-SystemV/EST5.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-SystemV/EST5EDT.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-SystemV/HST10.generic.long=\u30CF\u30EF\u30A4\u6642\u9593 +-SystemV/MST7.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-SystemV/MST7MDT.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-SystemV/PST8.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-SystemV/PST8PDT.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-SystemV/YST9.generic.long=\u30A2\u30E9\u30B9\u30AB\u6642\u9593 +-SystemV/YST9YDT.generic.long=\u30A2\u30E9\u30B9\u30AB\u6642\u9593 +-Turkey.generic.long=\u6771\u90E8\u30E8\u30FC\u30ED\u30C3\u30D1\u6642\u9593 +-UCT.generic.long=\u5354\u5B9A\u4E16\u754C\u6642 +-US/Alaska.generic.long=\u30A2\u30E9\u30B9\u30AB\u6642\u9593 +-US/Aleutian.generic.long=\u30CF\u30EF\u30A4\u30FB\u30A2\u30EA\u30E5\u30FC\u30B7\u30E3\u30F3\u6642\u9593 +-US/Arizona.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-US/Central.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-US/East-Indiana.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-US/Eastern.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-US/Hawaii.generic.long=\u30CF\u30EF\u30A4\u6642\u9593 +-US/Indiana-Starke.generic.long=\u4E2D\u90E8\u6A19\u6E96\u6642 +-US/Michigan.generic.long=\u6771\u90E8\u6A19\u6E96\u6642 +-US/Mountain.generic.long=\u5C71\u5730\u6A19\u6E96\u6642 +-US/Pacific-New.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-US/Pacific.generic.long=\u592A\u5E73\u6D0B\u6A19\u6E96\u6642 +-US/Samoa.generic.long=\u30B5\u30E2\u30A2\u6642\u9593 +-UTC.generic.long=\u5354\u5B9A\u4E16\u754C\u6642 +-Universal.generic.long=\u5354\u5B9A\u4E16\u754C\u6642 +-VST.generic.long=\u30A4\u30F3\u30C9\u30B7\u30CA\u6642\u9593 +-W-SU.generic.long=\u30E2\u30B9\u30AF\u30EF\u6642\u9593 +-WET.generic.long=\u897f\u90e8\u30e8\u30fc\u30ed\u30c3\u30d1\u6642\u9593 +-Zulu.generic.long=\u5354\u5B9A\u4E16\u754C\u6642 +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_ja_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_ja_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_ko.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_ko.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uBD81\uBD80 \uC9C0\uC5ED) +-ACT.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uBD81\uBD80 \uC9C0\uC5ED) +-ACT.standard.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uBD81\uBD80 \uC9C0\uC5ED) +-AET.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-AET.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-AET.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-AGT.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-ART.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-AST.generic.long=\uC54C\uB798\uC2A4\uCE74 \uD45C\uC900\uC2DC +-Africa/Abidjan.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Accra.generic.long=\uAC00\uB098 \uD45C\uC900\uC2DC +-Africa/Addis_Ababa.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Algiers.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Africa/Asmara.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Asmera.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Bamako.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Bangui.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Banjul.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Bissau.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Blantyre.generic.long=\uC911\uC559 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Brazzaville.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Bujumbura.generic.long=\uC911\uC559 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Cairo.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Africa/Casablanca.generic.long=\uC11C\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Africa/Ceuta.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Africa/Conakry.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Dakar.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Dar_es_Salaam.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Djibouti.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Douala.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/El_Aaiun.generic.long=\uC11C\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Africa/Freetown.generic.long=\uC2DC\uC5D0\uB77C\uB9AC\uC628 \uD45C\uC900\uC2DC +-Africa/Gaborone.generic.long=\uC911\uC559 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Harare.generic.long=\uC911\uC559 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Johannesburg.generic.long=\uB0A8\uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Juba.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Kampala.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Khartoum.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Kigali.generic.long=\uC911\uC559 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Kinshasa.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Lagos.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Libreville.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Lome.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Luanda.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Lubumbashi.generic.long=\uC911\uC559 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Lusaka.generic.long=\uC911\uC559 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Malabo.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Maputo.generic.long=\uC911\uC559 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Maseru.generic.long=\uB0A8\uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Mbabane.generic.long=\uB0A8\uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Mogadishu.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Monrovia.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Nairobi.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Ndjamena.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Niamey.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Nouakchott.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Ouagadougou.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Porto-Novo.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Africa/Sao_Tome.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Timbuktu.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Africa/Tripoli.generic.long=\ub3d9\ubd80 \uc720\ub7fd \ud45c\uc900\uc2dc +-Africa/Tunis.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Africa/Windhoek.generic.long=\uC11C\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-America/Adak.generic.long=\uD558\uC640\uC774-\uC54C\uB8E8\uC0E8 \uD45C\uC900\uC2DC +-America/Anchorage.generic.long=\uC54C\uB798\uC2A4\uCE74 \uD45C\uC900\uC2DC +-America/Anguilla.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Antigua.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Araguaina.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-America/Argentina/Buenos_Aires.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/Catamarca.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/ComodRivadavia.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/Cordoba.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/Jujuy.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/La_Rioja.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/Mendoza.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/Rio_Gallegos.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/Salta.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/San_Juan.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/San_Luis.generic.long=\uc544\ub974\ud5e8\ud2f0\ub098 \ud45c\uc900\uc2dc +-America/Argentina/Tucuman.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Argentina/Ushuaia.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Aruba.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Asuncion.generic.long=\uD30C\uB77C\uACFC\uC774 \uD45C\uC900\uC2DC +-America/Atikokan.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Atka.generic.long=\uD558\uC640\uC774-\uC54C\uB8E8\uC0E8 \uD45C\uC900\uC2DC +-America/Bahia.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-America/Bahia_Banderas.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Barbados.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Belem.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-America/Belize.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Blanc-Sablon.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Boa_Vista.generic.long=\uC544\uB9C8\uC874 \uD45C\uC900\uC2DC +-America/Bogota.generic.long=\uCF5C\uB86C\uBE44\uC544 \uD45C\uC900\uC2DC +-America/Boise.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Buenos_Aires.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Cambridge_Bay.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Campo_Grande.generic.long=\uC544\uB9C8\uC874 \uD45C\uC900\uC2DC +-America/Cancun.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Caracas.generic.long=\uBCA0\uB124\uC218\uC5D8\uB77C \uD45C\uC900\uC2DC +-America/Catamarca.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Cayenne.generic.long=\uD504\uB791\uC2A4\uB839 \uAE30\uC544\uB098 \uD45C\uC900\uC2DC +-America/Cayman.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Chicago.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Chihuahua.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Coral_Harbour.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Cordoba.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Costa_Rica.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Creston.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Cuiaba.generic.long=\uC544\uB9C8\uC874 \uD45C\uC900\uC2DC +-America/Curacao.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Danmarkshavn.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-America/Dawson.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-America/Dawson_Creek.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Denver.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Detroit.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Dominica.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Edmonton.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Eirunepe.generic.long=\uc5d0\uc774\ucee4 \uc2dc\uac04 +-America/El_Salvador.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Ensenada.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-America/Fort_Wayne.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Fortaleza.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-America/Glace_Bay.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Godthab.generic.long=\uC11C\uBD80 \uADF8\uB9B0\uB780\uB4DC \uD45C\uC900\uC2DC +-America/Goose_Bay.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Grand_Turk.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Grenada.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Guadeloupe.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Guatemala.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Guayaquil.generic.long=\uC5D0\uCF70\uB3C4\uB974 \uD45C\uC900\uC2DC +-America/Guyana.generic.long=\uAC00\uC774\uC544\uB098 \uD45C\uC900\uC2DC +-America/Halifax.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Havana.generic.long=\uCFE0\uBC14 \uD45C\uC900\uC2DC +-America/Hermosillo.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Indiana/Indianapolis.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Indiana/Knox.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Indiana/Marengo.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Indiana/Petersburg.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Indiana/Tell_City.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Indiana/Vevay.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Indiana/Vincennes.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Indiana/Winamac.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Indianapolis.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Inuvik.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Iqaluit.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Jamaica.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Jujuy.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Juneau.generic.long=\uC54C\uB798\uC2A4\uCE74 \uD45C\uC900\uC2DC +-America/Kentucky/Louisville.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Kentucky/Monticello.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Knox_IN.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Kralendijk.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/La_Paz.generic.long=\uBCFC\uB9AC\uBE44\uC544 \uD45C\uC900\uC2DC +-America/Lima.generic.long=\uD398\uB8E8 \uD45C\uC900\uC2DC +-America/Los_Angeles.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-America/Louisville.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Lower_Princes.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Maceio.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-America/Managua.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Manaus.generic.long=\uC544\uB9C8\uC874 \uD45C\uC900\uC2DC +-America/Marigot.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Martinique.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Matamoros.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Mazatlan.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Mendoza.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Menominee.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Merida.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Metlakatla.daylight.long=\uBA54\uD2B8\uB77C\uCE74\uD2B8\uB77C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-America/Metlakatla.generic.long=\uBA54\uD2B8\uB77C\uCE74\uD2B8\uB77C \uD45C\uC900\uC2DC +-America/Metlakatla.standard.long=\uBA54\uD2B8\uB77C\uCE74\uD2B8\uB77C \uD45C\uC900\uC2DC +-America/Mexico_City.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Miquelon.generic.long=\uD53C\uC5D0\uB974 \uBBF8\uD074\uB871 \uD45C\uC900\uC2DC +-America/Moncton.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Monterrey.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Montevideo.generic.long=\uC6B0\uB8E8\uACFC\uC774 \uD45C\uC900\uC2DC +-America/Montreal.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Montserrat.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Nassau.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/New_York.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Nipigon.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Nome.generic.long=\uC54C\uB798\uC2A4\uCE74 \uD45C\uC900\uC2DC +-America/Noronha.generic.long=\uD398\uB974\uB09C\uB3C4 \uB4DC \uB178\uB85C\uD558 \uD45C\uC900\uC2DC +-America/North_Dakota/Beulah.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/North_Dakota/Center.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/North_Dakota/New_Salem.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Ojinaga.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Panama.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Pangnirtung.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Paramaribo.generic.long=\uC218\uB9AC\uB0A8 \uD45C\uC900\uC2DC +-America/Phoenix.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Port-au-Prince.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Port_of_Spain.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Porto_Acre.generic.long=\uc5d0\uc774\ucee4 \uc2dc\uac04 +-America/Porto_Velho.generic.long=\uC544\uB9C8\uC874 \uD45C\uC900\uC2DC +-America/Puerto_Rico.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Rainy_River.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Rankin_Inlet.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Recife.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-America/Regina.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Resolute.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Rio_Branco.generic.long=\uc5d0\uc774\ucee4 \uc2dc\uac04 +-America/Rosario.generic.long=\uC544\uB974\uD5E8\uD2F0\uB098 \uD45C\uC900\uC2DC +-America/Santa_Isabel.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-America/Santarem.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-America/Santiago.generic.long=\uCE60\uB808 \uD45C\uC900\uC2DC +-America/Santo_Domingo.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Sao_Paulo.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-America/Scoresbysund.generic.long=\uB3D9\uBD80 \uADF8\uB9B0\uB780\uB4DC \uD45C\uC900\uC2DC +-America/Shiprock.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-America/Sitka.generic.long=\uC54C\uB798\uC2A4\uCE74 \uD45C\uC900\uC2DC +-America/St_Barthelemy.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/St_Johns.generic.long=\uB274\uD380\uB4E4\uB79C\uB4DC \uD45C\uC900\uC2DC +-America/St_Kitts.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/St_Lucia.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/St_Thomas.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/St_Vincent.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Swift_Current.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Tegucigalpa.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Thule.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Thunder_Bay.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Tijuana.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-America/Toronto.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-America/Tortola.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Vancouver.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-America/Virgin.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-America/Whitehorse.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-America/Winnipeg.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-America/Yakutat.generic.long=\uC54C\uB798\uC2A4\uCE74 \uD45C\uC900\uC2DC +-America/Yellowknife.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-Antarctica/Casey.daylight.long=\uC11C\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Antarctica/Casey.generic.long=\uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Antarctica/Casey.standard.long=\uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Antarctica/Davis.generic.long=\uB370\uC774\uBE44\uC2A4 \uD45C\uC900\uC2DC +-Antarctica/DumontDUrville.generic.long=\uB450\uBAAC\uD2B8\uC6B0\uB974\uBE4C \uD45C\uC900\uC2DC +-Antarctica/Macquarie.daylight.long=\uB9E4\uCF70\uB9AC \uC12C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Antarctica/Macquarie.generic.long=\uB9E4\uCF70\uB9AC \uC12C \uD45C\uC900\uC2DC +-Antarctica/Macquarie.standard.long=\uB9E4\uCF70\uB9AC \uC12C \uD45C\uC900\uC2DC +-Antarctica/Mawson.generic.long=\uB9C8\uC2A8 \uD45C\uC900\uC2DC +-Antarctica/McMurdo.generic.long=\uB274\uC9C8\uB79C\uB4DC \uD45C\uC900\uC2DC +-Antarctica/Palmer.generic.long=\uCE60\uB808 \uD45C\uC900\uC2DC +-Antarctica/Rothera.generic.long=\uB85C\uB354\uB77C \uD45C\uC900\uC2DC +-Antarctica/South_Pole.generic.long=\uB274\uC9C8\uB79C\uB4DC \uD45C\uC900\uC2DC +-Antarctica/Syowa.generic.long=\uC1FC\uC640 \uD45C\uC900\uC2DC +-Antarctica/Vostok.generic.long=\uBCF4\uC2A4\uD1A1 \uD45C\uC900\uC2DC +-Arctic/Longyearbyen.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Asia/Aden.generic.long=\uC544\uB77C\uBE44\uC544 \uD45C\uC900\uC2DC +-Asia/Almaty.generic.long=\uC54C\uB9C8\uC544\uD0C0 \uD45C\uC900\uC2DC +-Asia/Amman.generic.long=\uc544\ub77c\ube44\uc544 \ud45c\uc900\uc2dc +-Asia/Anadyr.generic.long=\uC544\uB098\uB514\uB9AC \uD45C\uC900\uC2DC +-Asia/Aqtau.generic.long=\uC544\uD06C\uD0C0\uC6B0 \uD45C\uC900\uC2DC +-Asia/Aqtobe.generic.long=\uC544\uD06C\uD1A0\uBCA0 \uD45C\uC900\uC2DC +-Asia/Ashgabat.generic.long=\uD22C\uB974\uD06C\uBA54\uB2C8\uC2A4\uD0C4 \uD45C\uC900\uC2DC +-Asia/Ashkhabad.generic.long=\uD22C\uB974\uD06C\uBA54\uB2C8\uC2A4\uD0C4 \uD45C\uC900\uC2DC +-Asia/Baghdad.generic.long=\uC544\uB77C\uBE44\uC544 \uD45C\uC900\uC2DC +-Asia/Bahrain.generic.long=\uC544\uB77C\uBE44\uC544 \uD45C\uC900\uC2DC +-Asia/Baku.generic.long=\uC544\uC81C\uB974\uBC14\uC774\uC794 \uD45C\uC900\uC2DC +-Asia/Bangkok.generic.long=\uC778\uB3C4\uCC28\uC774\uB098 \uBC18\uB3C4 \uD45C\uC900\uC2DC +-Asia/Beirut.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Asia/Bishkek.generic.long=\uD0A4\uB974\uAE30\uC2A4\uC2A4\uD0C4 \uD45C\uC900\uC2DC +-Asia/Brunei.generic.long=\uBE0C\uB8E8\uB098\uC774 \uD45C\uC900\uC2DC +-Asia/Calcutta.generic.long=\uC778\uB3C4 \uD45C\uC900\uC2DC +-Asia/Choibalsan.generic.long=\uCD08\uC774\uBC1C\uC0B0 \uD45C\uC900\uC2DC +-Asia/Chongqing.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Asia/Chungking.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Asia/Colombo.generic.long=\uC778\uB3C4 \uD45C\uC900\uC2DC +-Asia/Dacca.generic.long=\uBC29\uAE00\uB77C\uB370\uC2DC \uD45C\uC900\uC2DC +-Asia/Damascus.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Asia/Dhaka.generic.long=\uBC29\uAE00\uB77C\uB370\uC2DC \uD45C\uC900\uC2DC +-Asia/Dili.generic.long=\uB3D9\uD2F0\uBAA8\uB974 \uD45C\uC900\uC2DC +-Asia/Dubai.generic.long=\uAC78\uD504\uB9CC \uD45C\uC900\uC2DC +-Asia/Dushanbe.generic.long=\uD0C0\uC9C0\uD0A4\uC2A4\uD0C4 \uD45C\uC900\uC2DC +-Asia/Gaza.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Asia/Harbin.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Asia/Hebron.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Asia/Ho_Chi_Minh.generic.long=\uC778\uB3C4\uCC28\uC774\uB098 \uBC18\uB3C4 \uD45C\uC900\uC2DC +-Asia/Hong_Kong.generic.long=\uD64D\uCF69 \uD45C\uC900\uC2DC +-Asia/Hovd.generic.long=\uD638\uBE0C\uB4DC \uD45C\uC900\uC2DC +-Asia/Irkutsk.generic.long=\uC774\uB974\uCFE0\uCE20\uD06C \uD45C\uC900\uC2DC +-Asia/Istanbul.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Asia/Jakarta.generic.long=\uC11C\uBD80 \uC778\uB3C4\uB124\uC2DC\uC544 \uD45C\uC900\uC2DC +-Asia/Jayapura.generic.long=\uB3D9\uBD80 \uC778\uB3C4\uB124\uC2DC\uC544 \uD45C\uC900\uC2DC +-Asia/Jerusalem.generic.long=\uC544\uC2A4\uB77C\uC5D8 \uD45C\uC900\uC2DC +-Asia/Kabul.generic.long=\uC544\uD504\uAC00\uB2C8\uC2A4\uD0C4 \uD45C\uC900\uC2DC +-Asia/Kamchatka.generic.long=\uD398\uD2B8\uB85C\uD30C\uBE0C\uB85C\uD504\uC2A4\uD06C-\uCE84\uCC28\uCE20\uD0A4 \uD45C\uC900\uC2DC +-Asia/Karachi.generic.long=\uD30C\uD0A4\uC2A4\uD0C4 \uD45C\uC900\uC2DC +-Asia/Kashgar.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Asia/Kathmandu.generic.long=\uB124\uD314 \uD45C\uC900\uC2DC +-Asia/Katmandu.generic.long=\uB124\uD314 \uD45C\uC900\uC2DC +-Asia/Khandyga.daylight.long=\uD55C\uB514\uAC00 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Asia/Khandyga.generic.long=\uD55C\uB514\uAC00 \uD45C\uC900\uC2DC +-Asia/Khandyga.standard.long=\uD55C\uB514\uAC00 \uD45C\uC900\uC2DC +-Asia/Kolkata.generic.long=\uC778\uB3C4 \uD45C\uC900\uC2DC +-Asia/Krasnoyarsk.generic.long=\uD06C\uB77C\uC2A4\uB178\uC57C\uB974\uC2A4\uD06C \uD45C\uC900\uC2DC +-Asia/Kuala_Lumpur.generic.long=\uB9D0\uB808\uC774\uC2DC\uC544 \uD45C\uC900\uC2DC +-Asia/Kuching.generic.long=\uB9D0\uB808\uC774\uC2DC\uC544 \uD45C\uC900\uC2DC +-Asia/Kuwait.generic.long=\uC544\uB77C\uBE44\uC544 \uD45C\uC900\uC2DC +-Asia/Macao.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Asia/Macau.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Asia/Magadan.generic.long=\uB9C8\uAC00\uB2E8 \uD45C\uC900\uC2DC +-Asia/Makassar.generic.long=\uC911\uBD80 \uC778\uB3C4\uB124\uC2DC\uC544 \uD45C\uC900\uC2DC +-Asia/Manila.generic.long=\uD544\uB9AC\uD540 \uD45C\uC900\uC2DC +-Asia/Muscat.generic.long=\uAC78\uD504\uB9CC \uD45C\uC900\uC2DC +-Asia/Nicosia.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Asia/Novokuznetsk.generic.long=\uB178\uBCF4\uC2DC\uBE44\uB974\uC2A4\uD06C \uD45C\uC900\uC2DC +-Asia/Novosibirsk.generic.long=\uB178\uBCF4\uC2DC\uBE44\uB974\uC2A4\uD06C \uD45C\uC900\uC2DC +-Asia/Omsk.generic.long=\uC634\uC2A4\uD06C \uD45C\uC900\uC2DC +-Asia/Oral.generic.long=\uC624\uB7F4 \uD45C\uC900\uC2DC +-Asia/Phnom_Penh.generic.long=\uC778\uB3C4\uCC28\uC774\uB098 \uBC18\uB3C4 \uD45C\uC900\uC2DC +-Asia/Pontianak.generic.long=\uC11C\uBD80 \uC778\uB3C4\uB124\uC2DC\uC544 \uD45C\uC900\uC2DC +-Asia/Pyongyang.generic.long=\uB300\uD55C\uBBFC\uAD6D \uD45C\uC900\uC2DC +-Asia/Qatar.generic.long=\uC544\uB77C\uBE44\uC544 \uD45C\uC900\uC2DC +-Asia/Qyzylorda.generic.long=\uD0A4\uC9C8\uB85C\uB974\uB2E4 \uD45C\uC900\uC2DC +-Asia/Rangoon.generic.long=\uBBF8\uC580\uB9C8 \uD45C\uC900\uC2DC +-Asia/Saigon.generic.long=\uC778\uB3C4\uCC28\uC774\uB098 \uBC18\uB3C4 \uD45C\uC900\uC2DC +-Asia/Sakhalin.generic.long=\uC0AC\uD560\uB9B0 \uD45C\uC900\uC2DC +-Asia/Samarkand.generic.long=\uC6B0\uC988\uBCA0\uD0A4\uC2A4\uD0C4 \uD45C\uC900\uC2DC +-Asia/Seoul.generic.long=\uB300\uD55C\uBBFC\uAD6D \uD45C\uC900\uC2DC +-Asia/Shanghai.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Asia/Singapore.generic.long=\uC2F1\uAC00\uD3EC\uB974 \uD45C\uC900\uC2DC +-Asia/Taipei.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Asia/Tashkent.generic.long=\uC6B0\uC988\uBCA0\uD0A4\uC2A4\uD0C4 \uD45C\uC900\uC2DC +-Asia/Tbilisi.generic.long=\uADF8\uB8E8\uC9C0\uC57C \uD45C\uC900\uC2DC +-Asia/Tehran.generic.long=\uC774\uB780 \uD45C\uC900\uC2DC +-Asia/Tel_Aviv.generic.long=\uC544\uC2A4\uB77C\uC5D8 \uD45C\uC900\uC2DC +-Asia/Thimbu.generic.long=\uBD80\uD0C4 \uD45C\uC900\uC2DC +-Asia/Thimphu.generic.long=\uBD80\uD0C4 \uD45C\uC900\uC2DC +-Asia/Tokyo.generic.long=\uC77C\uBCF8 \uD45C\uC900\uC2DC +-Asia/Ujung_Pandang.generic.long=\uC911\uBD80 \uC778\uB3C4\uB124\uC2DC\uC544 \uD45C\uC900\uC2DC +-Asia/Ulaanbaatar.generic.long=\uC6B8\uB780\uBC14\uD1A0\uB974 \uD45C\uC900\uC2DC +-Asia/Ulan_Bator.generic.long=\uC6B8\uB780\uBC14\uD1A0\uB974 \uD45C\uC900\uC2DC +-Asia/Urumqi.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Asia/Ust-Nera.daylight.long=\uC6B0\uC2A4\uD2F0\uB124\uB77C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Asia/Ust-Nera.generic.long=\uC6B0\uC2A4\uD2F0\uB124\uB77C \uD45C\uC900\uC2DC +-Asia/Ust-Nera.standard.long=\uC6B0\uC2A4\uD2F0\uB124\uB77C \uD45C\uC900\uC2DC +-Asia/Vientiane.generic.long=\uC778\uB3C4\uCC28\uC774\uB098 \uBC18\uB3C4 \uD45C\uC900\uC2DC +-Asia/Vladivostok.generic.long=\uBE14\uB77C\uB514\uBCF4\uC2A4\uD1A1 \uD45C\uC900\uC2DC +-Asia/Yakutsk.generic.long=\uC57C\uCFE0\uCE20\uD06C \uD45C\uC900\uC2DC +-Asia/Yekaterinburg.generic.long=\uC608\uCE74\uD14C\uB9B0\uBD80\uB974\uD06C \uD45C\uC900\uC2DC +-Asia/Yerevan.generic.long=\uC544\uB974\uBA54\uB2C8\uC544 \uD45C\uC900\uC2DC +-Atlantic/Azores.generic.long=\uC544\uC870\uB808\uC2A4 \uD45C\uC900\uC2DC +-Atlantic/Bermuda.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-Atlantic/Canary.generic.long=\uC11C\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Atlantic/Cape_Verde.generic.long=\uCF00\uC774\uD504\uBCA0\uB974\uB370 \uD45C\uC900\uC2DC +-Atlantic/Faeroe.generic.long=\uC11C\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Atlantic/Faroe.generic.long=\uC11C\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Atlantic/Jan_Mayen.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Atlantic/Madeira.generic.long=\uC11C\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Atlantic/Reykjavik.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Atlantic/South_Georgia.generic.long=\uC0AC\uC6B0\uC2A4\uC870\uC9C0\uC544 \uD45C\uC900\uC2DC +-Atlantic/St_Helena.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Atlantic/Stanley.generic.long=\uD3EC\uD074\uB79C\uB4DC \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Australia/ACT.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/ACT.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/ACT.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Adelaide.daylight.long=\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Adelaide.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Adelaide.standard.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Brisbane.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uD038\uC990\uB79C\uB4DC) +-Australia/Brisbane.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD038\uC990\uB79C\uB4DC) +-Australia/Brisbane.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD038\uC990\uB79C\uB4DC) +-Australia/Broken_Hill.daylight.long=\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Broken_Hill.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Broken_Hill.standard.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Canberra.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Canberra.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Canberra.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Currie.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Currie.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Currie.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Darwin.daylight.long=\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uBD81\uBD80 \uC9C0\uC5ED) +-Australia/Darwin.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uBD81\uBD80 \uC9C0\uC5ED) +-Australia/Darwin.standard.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uBD81\uBD80 \uC9C0\uC5ED) +-Australia/Eucla.daylight.long=\uC911\uC559 \uC11C\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Eucla.generic.long=\uC911\uC559 \uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Eucla.standard.long=\uC911\uC559 \uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Hobart.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544) +-Australia/Hobart.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544) +-Australia/Hobart.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544) +-Australia/LHI.generic.long=\uB85C\uB4DC\uD558\uC6B0 \uD45C\uC900\uC2DC +-Australia/Lindeman.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uD038\uC990\uB79C\uB4DC) +-Australia/Lindeman.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD038\uC990\uB79C\uB4DC) +-Australia/Lindeman.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD038\uC990\uB79C\uB4DC) +-Australia/Lord_Howe.generic.long=\uB85C\uB4DC\uD558\uC6B0 \uD45C\uC900\uC2DC +-Australia/Melbourne.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uBE45\uD1A0\uB9AC\uC544) +-Australia/Melbourne.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uBE45\uD1A0\uB9AC\uC544) +-Australia/Melbourne.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uBE45\uD1A0\uB9AC\uC544) +-Australia/NSW.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/NSW.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/NSW.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/North.daylight.long=\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uBD81\uBD80 \uC9C0\uC5ED) +-Australia/North.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uBD81\uBD80 \uC9C0\uC5ED) +-Australia/North.standard.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uBD81\uBD80 \uC9C0\uC5ED) +-Australia/Perth.daylight.long=\uC11C\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Perth.generic.long=\uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Perth.standard.long=\uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Queensland.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uD038\uC990\uB79C\uB4DC) +-Australia/Queensland.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD038\uC990\uB79C\uB4DC) +-Australia/Queensland.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD038\uC990\uB79C\uB4DC) +-Australia/South.daylight.long=\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/South.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/South.standard.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Sydney.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Sydney.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Sydney.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Tasmania.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544) +-Australia/Tasmania.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544) +-Australia/Tasmania.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uD0DC\uC988\uBA54\uC774\uB2C8\uC544) +-Australia/Victoria.daylight.long=\uB3D9\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uBE45\uD1A0\uB9AC\uC544) +-Australia/Victoria.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uBE45\uD1A0\uB9AC\uC544) +-Australia/Victoria.standard.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC(\uBE45\uD1A0\uB9AC\uC544) +-Australia/West.daylight.long=\uC11C\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/West.generic.long=\uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/West.standard.long=\uC11C\uBD80 \uD45C\uC900\uC2DC(\uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544) +-Australia/Yancowinna.daylight.long=\uC911\uBD80 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Yancowinna.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-Australia/Yancowinna.standard.long=\uC911\uBD80 \uD45C\uC900\uC2DC(\uB0A8\uBD80 \uC624\uC2A4\uD2B8\uB808\uC77C\uB9AC\uC544/\uB274\uC0AC\uC6B0\uC2A4\uC6E8\uC77C\uC988) +-BET.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-BST.generic.long=\uBC29\uAE00\uB77C\uB370\uC2DC \uD45C\uC900\uC2DC +-Brazil/Acre.generic.long=\uc5d0\uc774\ucee4 \uc2dc\uac04 +-Brazil/DeNoronha.generic.long=\uD398\uB974\uB09C\uB3C4 \uB4DC \uB178\uB85C\uD558 \uD45C\uC900\uC2DC +-Brazil/East.generic.long=\uBE0C\uB77C\uC9C8\uB9AC\uC544 \uD45C\uC900\uC2DC +-Brazil/West.generic.long=\uC544\uB9C8\uC874 \uD45C\uC900\uC2DC +-CAT.generic.long=\uC911\uC559 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-CET.generic.long=\uc911\uc559 \uc720\ub7fd \ud45c\uc900\uc2dc +-CNT.generic.long=\uB274\uD380\uB4E4\uB79C\uB4DC \uD45C\uC900\uC2DC +-CST.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-CST6CDT.generic.long=\uc911\ubd80 \ud45c\uc900\uc2dc +-CTT.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-Canada/Atlantic.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-Canada/Central.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-Canada/East-Saskatchewan.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-Canada/Eastern.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-Canada/Mountain.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-Canada/Newfoundland.generic.long=\uB274\uD380\uB4E4\uB79C\uB4DC \uD45C\uC900\uC2DC +-Canada/Pacific.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-Canada/Saskatchewan.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-Canada/Yukon.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-Chile/Continental.generic.long=\uCE60\uB808 \uD45C\uC900\uC2DC +-Chile/EasterIsland.generic.long=\uC774\uC2A4\uD130 \uC12C \uD45C\uC900\uC2DC +-Cuba.generic.long=\uCFE0\uBC14 \uD45C\uC900\uC2DC +-EAT.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-ECT.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-EET.generic.long=\ub3d9\ubd80 \uc720\ub7fd \ud45c\uc900\uc2dc +-EST.generic.long=\ub3d9\ubd80 \ud45c\uc900\uc2dc +-EST5EDT.generic.long=\ub3d9\ubd80 \ud45c\uc900\uc2dc +-Egypt.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Eire.generic.long=\uC544\uC77C\uB79C\uB4DC \uD45C\uC900\uC2DC +-Etc/Greenwich.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Etc/UCT.generic.long=\uC9C0\uC5ED \uD45C\uC900\uC2DC +-Etc/UTC.generic.long=\uC9C0\uC5ED \uD45C\uC900\uC2DC +-Etc/Universal.generic.long=\uC9C0\uC5ED \uD45C\uC900\uC2DC +-Etc/Zulu.generic.long=\uC9C0\uC5ED \uD45C\uC900\uC2DC +-Europe/Amsterdam.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Andorra.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Athens.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Belfast.generic.long=\uC601\uAD6D \uD45C\uC900\uC2DC +-Europe/Belgrade.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Berlin.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Bratislava.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Brussels.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Bucharest.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Budapest.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Busingen.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Chisinau.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Copenhagen.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Dublin.generic.long=\uC544\uC77C\uB79C\uB4DC \uD45C\uC900\uC2DC +-Europe/Gibraltar.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Guernsey.generic.long=\uC601\uAD6D \uD45C\uC900\uC2DC +-Europe/Helsinki.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Isle_of_Man.generic.long=\uC601\uAD6D \uD45C\uC900\uC2DC +-Europe/Istanbul.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Jersey.generic.long=\uC601\uAD6D \uD45C\uC900\uC2DC +-Europe/Kaliningrad.daylight.long=\uADF9\uB3D9 \uC720\uB7FD \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Europe/Kaliningrad.generic.long=\uADF9\uB3D9 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Kaliningrad.standard.long=\uADF9\uB3D9 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Kiev.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Lisbon.generic.long=\uC11C\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Ljubljana.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/London.generic.long=\uC601\uAD6D \uD45C\uC900\uC2DC +-Europe/Luxembourg.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Madrid.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Malta.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Mariehamn.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Minsk.daylight.long=\uADF9\uB3D9 \uC720\uB7FD \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Europe/Minsk.generic.long=\uADF9\uB3D9 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Minsk.standard.long=\uADF9\uB3D9 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Monaco.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Moscow.generic.long=\uBAA8\uC2A4\uD06C\uBC14 \uD45C\uC900\uC2DC +-Europe/Nicosia.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Oslo.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Paris.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Podgorica.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Prague.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Riga.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Rome.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Samara.generic.long=\uC0AC\uB9C8\uB77C \uD45C\uC900\uC2DC +-Europe/San_Marino.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Sarajevo.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Simferopol.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Skopje.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Sofia.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Stockholm.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Tallinn.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Tirane.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Tiraspol.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Uzhgorod.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Vaduz.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Vatican.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Vienna.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Vilnius.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Volgograd.generic.long=\uBCFC\uACE0\uADF8\uB77C\uB4DC \uD45C\uC900\uC2DC +-Europe/Warsaw.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Zagreb.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Zaporozhye.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-Europe/Zurich.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-GB-Eire.generic.long=\uC601\uAD6D \uD45C\uC900\uC2DC +-GB.generic.long=\uC601\uAD6D \uD45C\uC900\uC2DC +-GMT.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Greenwich.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-HST.generic.long=\ud558\uc640\uc774 \ud45c\uc900\uc2dc +-Hongkong.generic.long=\uD64D\uCF69 \uD45C\uC900\uC2DC +-IET.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-IST.generic.long=\uC778\uB3C4 \uD45C\uC900\uC2DC +-Iceland.generic.long=\uADF8\uB9AC\uB2C8\uCE58 \uD45C\uC900\uC2DC +-Indian/Antananarivo.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Indian/Chagos.generic.long=\uC778\uB3C4\uC591 \uC2DD\uBBFC\uC9C0 \uD45C\uC900\uC2DC +-Indian/Christmas.generic.long=\uD06C\uB9AC\uC2A4\uB9C8\uC2A4 \uC12C \uD45C\uC900\uC2DC +-Indian/Cocos.generic.long=\uCF54\uCF54\uC2A4 \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Indian/Comoro.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Indian/Kerguelen.generic.long=\uD504\uB791\uC2A4\uB839 \uB0A8\uBD80 \uBC0F \uB0A8\uADF9 \uB300\uB959 \uD45C\uC900\uC2DC +-Indian/Mahe.generic.long=\uC138\uC774\uC178 \uD45C\uC900\uC2DC +-Indian/Maldives.generic.long=\uBAB0\uB514\uBE0C \uD45C\uC900\uC2DC +-Indian/Mauritius.generic.long=\uBAA8\uB9AC\uC154\uC2A4 \uD45C\uC900\uC2DC +-Indian/Mayotte.generic.long=\uB3D9\uBD80 \uC544\uD504\uB9AC\uCE74 \uD45C\uC900\uC2DC +-Indian/Reunion.generic.long=\uB808\uC704\uB2C8\uC639 \uD45C\uC900\uC2DC +-Iran.generic.long=\uC774\uB780 \uD45C\uC900\uC2DC +-Israel.generic.long=\uC544\uC2A4\uB77C\uC5D8 \uD45C\uC900\uC2DC +-JST.generic.long=\uC77C\uBCF8 \uD45C\uC900\uC2DC +-Jamaica.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-Japan.generic.long=\uC77C\uBCF8 \uD45C\uC900\uC2DC +-Kwajalein.generic.long=\uB9C8\uC15C \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Libya.generic.long=\ub3d9\ubd80 \uc720\ub7fd \ud45c\uc900\uc2dc +-MET.generic.long=MET +-MIT.generic.long=\uC11C\uC0AC\uBAA8\uC544 \uD45C\uC900\uC2DC +-MST.generic.long=\uc0b0\uc9c0 \ud45c\uc900\uc2dc +-MST7MDT.generic.long=\uc0b0\uc9c0 \ud45c\uc900\uc2dc +-Mexico/BajaNorte.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-Mexico/BajaSur.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-Mexico/General.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-NET.generic.long=\uC544\uB974\uBA54\uB2C8\uC544 \uD45C\uC900\uC2DC +-NST.generic.long=\uB274\uC9C8\uB79C\uB4DC \uD45C\uC900\uC2DC +-NZ-CHAT.generic.long=\uCC44\uD140 \uD45C\uC900\uC2DC +-NZ.generic.long=\uB274\uC9C8\uB79C\uB4DC \uD45C\uC900\uC2DC +-Navajo.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-PLT.generic.long=\uD30C\uD0A4\uC2A4\uD0C4 \uD45C\uC900\uC2DC +-PNT.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-PRC.generic.long=\uC911\uAD6D \uD45C\uC900\uC2DC +-PRT.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-PST.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-PST8PDT.generic.long=\ud0dc\ud3c9\uc591 \ud45c\uc900\uc2dc +-Pacific/Apia.generic.long=\uC11C\uC0AC\uBAA8\uC544 \uD45C\uC900\uC2DC +-Pacific/Auckland.generic.long=\uB274\uC9C8\uB79C\uB4DC \uD45C\uC900\uC2DC +-Pacific/Chatham.generic.long=\uCC44\uD140 \uD45C\uC900\uC2DC +-Pacific/Chuuk.daylight.long=\uCD94\uD06C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Pacific/Chuuk.generic.long=\uCD94\uD06C \uD45C\uC900\uC2DC +-Pacific/Chuuk.standard.long=\uCD94\uD06C \uD45C\uC900\uC2DC +-Pacific/Easter.generic.long=\uC774\uC2A4\uD130 \uC12C \uD45C\uC900\uC2DC +-Pacific/Efate.generic.long=\uBC14\uB204\uC544\uD22C \uD45C\uC900\uC2DC +-Pacific/Enderbury.generic.long=\uD53C\uB2C9\uC2A4 \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Pacific/Fakaofo.generic.long=\uD1A0\uCF08\uB77C\uC6B0 \uD45C\uC900\uC2DC +-Pacific/Fiji.generic.long=\uD53C\uC9C0 \uD45C\uC900\uC2DC +-Pacific/Funafuti.generic.long=\uD22C\uBC1C\uB8E8 \uD45C\uC900\uC2DC +-Pacific/Galapagos.generic.long=\uAC08\uB77C\uD30C\uACE0\uC2A4 \uD45C\uC900\uC2DC +-Pacific/Gambier.generic.long=\uC7A0\uBE44\uC544 \uD45C\uC900\uC2DC +-Pacific/Guadalcanal.generic.long=\uC194\uB85C\uBAAC \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Pacific/Guam.generic.long=\uCC28\uBAA8\uB974 \uD45C\uC900\uC2DC +-Pacific/Honolulu.generic.long=\uD558\uC640\uC774 \uD45C\uC900\uC2DC +-Pacific/Johnston.generic.long=\uD558\uC640\uC774 \uD45C\uC900\uC2DC +-Pacific/Kiritimati.generic.long=\uB77C\uC778 \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Pacific/Kosrae.generic.long=\uCF54\uC2A4\uB808 \uD45C\uC900\uC2DC +-Pacific/Kwajalein.generic.long=\uB9C8\uC15C \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Pacific/Majuro.generic.long=\uB9C8\uC15C \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Pacific/Marquesas.generic.long=\uB9C8\uD0A4\uC800\uC2A4 \uD45C\uC900\uC2DC +-Pacific/Midway.generic.long=\uC0AC\uBAA8\uC544 \uD45C\uC900\uC2DC +-Pacific/Nauru.generic.long=\uB098\uC6B0\uB8E8 \uD45C\uC900\uC2DC +-Pacific/Niue.generic.long=\uB2C8\uC6B0\uC5D0 \uD45C\uC900\uC2DC +-Pacific/Norfolk.generic.long=\uB178\uD37D \uD45C\uC900\uC2DC +-Pacific/Noumea.generic.long=\uB274 \uCE7C\uB808\uB3C4\uB2C8\uC544 \uD45C\uC900\uC2DC +-Pacific/Pago_Pago.generic.long=\uC0AC\uBAA8\uC544 \uD45C\uC900\uC2DC +-Pacific/Palau.generic.long=\uD314\uB77C\uC6B0 \uD45C\uC900\uC2DC +-Pacific/Pitcairn.generic.long=\uD54F\uCF00\uC5B8 \uD45C\uC900\uC2DC +-Pacific/Pohnpei.daylight.long=\uD3F0\uD398\uC774 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Pacific/Pohnpei.generic.long=\uD3EC\uB098\uD398 \uD45C\uC900\uC2DC +-Pacific/Pohnpei.standard.long=\uD3F0\uD398\uC774 \uD45C\uC900\uC2DC +-Pacific/Ponape.daylight.long=\uD3F0\uD398\uC774 \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Pacific/Ponape.generic.long=\uD3EC\uB098\uD398 \uD45C\uC900\uC2DC +-Pacific/Ponape.standard.long=\uD3F0\uD398\uC774 \uD45C\uC900\uC2DC +-Pacific/Port_Moresby.generic.long=\uD30C\uD478\uC544 \uB274\uAE30\uB2C8\uC544 \uD45C\uC900\uC2DC +-Pacific/Rarotonga.generic.long=\uCFE1 \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Pacific/Saipan.generic.long=\uCC28\uBAA8\uB974 \uD45C\uC900\uC2DC +-Pacific/Samoa.generic.long=\uC0AC\uBAA8\uC544 \uD45C\uC900\uC2DC +-Pacific/Tahiti.generic.long=\uD0C0\uD788\uD2F0 \uD45C\uC900\uC2DC +-Pacific/Tarawa.generic.long=\uAE38\uBC84\uD2B8 \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Pacific/Tongatapu.generic.long=\uD1B5\uAC00 \uD45C\uC900\uC2DC +-Pacific/Truk.daylight.long=\uCD94\uD06C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Pacific/Truk.generic.long=\uCD94\uD06C \uD45C\uC900\uC2DC +-Pacific/Truk.standard.long=\uCD94\uD06C \uD45C\uC900\uC2DC +-Pacific/Wake.generic.long=\uC6E8\uC774\uD06C \uD45C\uC900\uC2DC +-Pacific/Wallis.generic.long=\uC6D4\uB9AC\uC2A4 \uD478\uD22C\uB098 \uD45C\uC900\uC2DC +-Pacific/Yap.daylight.long=\uCD94\uD06C \uC77C\uAD11 \uC808\uC57D \uC2DC\uAC04 +-Pacific/Yap.generic.long=\uCD94\uD06C \uD45C\uC900\uC2DC +-Pacific/Yap.standard.long=\uCD94\uD06C \uD45C\uC900\uC2DC +-Poland.generic.long=\uC911\uC559 \uC720\uB7FD \uD45C\uC900\uC2DC +-Portugal.generic.long=\uC11C\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-ROK.generic.long=\uB300\uD55C\uBBFC\uAD6D \uD45C\uC900\uC2DC +-SST.generic.long=\uC194\uB85C\uBAAC \uC81C\uB3C4 \uD45C\uC900\uC2DC +-Singapore.generic.long=\uC2F1\uAC00\uD3EC\uB974 \uD45C\uC900\uC2DC +-SystemV/AST4.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-SystemV/AST4ADT.generic.long=\uB300\uC11C\uC591 \uD45C\uC900\uC2DC +-SystemV/CST6.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-SystemV/CST6CDT.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-SystemV/EST5.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-SystemV/EST5EDT.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-SystemV/HST10.generic.long=\uD558\uC640\uC774 \uD45C\uC900\uC2DC +-SystemV/MST7.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-SystemV/MST7MDT.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-SystemV/PST8.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-SystemV/PST8PDT.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-SystemV/YST9.generic.long=\uC54C\uB798\uC2A4\uCE74 \uD45C\uC900\uC2DC +-SystemV/YST9YDT.generic.long=\uC54C\uB798\uC2A4\uCE74 \uD45C\uC900\uC2DC +-Turkey.generic.long=\uB3D9\uBD80 \uC720\uB7FD \uD45C\uC900\uC2DC +-UCT.generic.long=\uC9C0\uC5ED \uD45C\uC900\uC2DC +-US/Alaska.generic.long=\uC54C\uB798\uC2A4\uCE74 \uD45C\uC900\uC2DC +-US/Aleutian.generic.long=\uD558\uC640\uC774-\uC54C\uB8E8\uC0E8 \uD45C\uC900\uC2DC +-US/Arizona.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-US/Central.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-US/East-Indiana.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-US/Eastern.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-US/Hawaii.generic.long=\uD558\uC640\uC774 \uD45C\uC900\uC2DC +-US/Indiana-Starke.generic.long=\uC911\uBD80 \uD45C\uC900\uC2DC +-US/Michigan.generic.long=\uB3D9\uBD80 \uD45C\uC900\uC2DC +-US/Mountain.generic.long=\uC0B0\uC9C0 \uD45C\uC900\uC2DC +-US/Pacific-New.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-US/Pacific.generic.long=\uD0DC\uD3C9\uC591 \uD45C\uC900\uC2DC +-US/Samoa.generic.long=\uC0AC\uBAA8\uC544 \uD45C\uC900\uC2DC +-UTC.generic.long=\uC9C0\uC5ED \uD45C\uC900\uC2DC +-Universal.generic.long=\uC9C0\uC5ED \uD45C\uC900\uC2DC +-VST.generic.long=\uC778\uB3C4\uCC28\uC774\uB098 \uBC18\uB3C4 \uD45C\uC900\uC2DC +-W-SU.generic.long=\uBAA8\uC2A4\uD06C\uBC14 \uD45C\uC900\uC2DC +-WET.generic.long=\uc11c\ubd80 \uc720\ub7fd \ud45c\uc900\uc2dc +-Zulu.generic.long=\uC9C0\uC5ED \uD45C\uC900\uC2DC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_ko_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_ko_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_pt_BR.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_pt_BR.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Central (Territ\u00F3rio do Norte) +-ACT.generic.long=Hor\u00E1rio Central (Territ\u00F3rio do Norte) +-ACT.standard.long=Hor\u00E1rio-Padr\u00E3o Central (Territ\u00F3rio do Norte) +-AET.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Nova Gales do Sul) +-AET.generic.long=Hor\u00E1rio Oriental (Nova Gales do Sul) +-AET.standard.long=Hor\u00E1rio-Padr\u00E3o Oriental (Nova Gales do Sul) +-AGT.generic.long=Hor\u00E1rio da Argentina +-ART.generic.long=Hor\u00E1rio da Europa Oriental +-AST.generic.long=Hor\u00E1rio do Alasca +-Africa/Abidjan.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Accra.generic.long=Fuso Hor\u00E1rio do Meridiano de Gana +-Africa/Addis_Ababa.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Algiers.generic.long=Hor\u00E1rio da Europa Central +-Africa/Asmara.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Asmera.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Bamako.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Bangui.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Banjul.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Bissau.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Blantyre.generic.long=Hor\u00E1rio da \u00C1frica Central +-Africa/Brazzaville.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Bujumbura.generic.long=Hor\u00E1rio da \u00C1frica Central +-Africa/Cairo.generic.long=Hor\u00E1rio da Europa Oriental +-Africa/Casablanca.generic.long=Hor\u00E1rio da Europa Ocidental +-Africa/Ceuta.generic.long=Hor\u00E1rio da Europa Central +-Africa/Conakry.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Dakar.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Dar_es_Salaam.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Djibouti.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Douala.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/El_Aaiun.generic.long=Hor\u00E1rio da Europa Ocidental +-Africa/Freetown.generic.long=Hor\u00E1rio de Serra Leoa +-Africa/Gaborone.generic.long=Hor\u00E1rio da \u00C1frica Central +-Africa/Harare.generic.long=Hor\u00E1rio da \u00C1frica Central +-Africa/Johannesburg.generic.long=Hor\u00E1rio da \u00C1frica do Sul +-Africa/Juba.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Kampala.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Khartoum.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Kigali.generic.long=Hor\u00E1rio da \u00C1frica Central +-Africa/Kinshasa.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Lagos.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Libreville.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Lome.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Luanda.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Lubumbashi.generic.long=Hor\u00E1rio da \u00C1frica Central +-Africa/Lusaka.generic.long=Hor\u00E1rio da \u00C1frica Central +-Africa/Malabo.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Maputo.generic.long=Hor\u00E1rio da \u00C1frica Central +-Africa/Maseru.generic.long=Hor\u00E1rio da \u00C1frica do Sul +-Africa/Mbabane.generic.long=Hor\u00E1rio da \u00C1frica do Sul +-Africa/Mogadishu.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Monrovia.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Nairobi.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Africa/Ndjamena.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Niamey.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Nouakchott.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Ouagadougou.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Porto-Novo.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-Africa/Sao_Tome.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Timbuktu.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Africa/Tripoli.generic.long=Hor\u00e1rio da Europa Oriental +-Africa/Tunis.generic.long=Hor\u00E1rio da Europa Central +-Africa/Windhoek.generic.long=Hor\u00E1rio da \u00C1frica Ocidental +-America/Adak.generic.long=Hor\u00E1rio do Hava\u00ED-Aleutas +-America/Anchorage.generic.long=Hor\u00E1rio do Alasca +-America/Anguilla.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Antigua.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Araguaina.generic.long=Hor\u00E1rio de Bras\u00EDlia +-America/Argentina/Buenos_Aires.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/Catamarca.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/ComodRivadavia.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/Cordoba.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/Jujuy.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/La_Rioja.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/Mendoza.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/Rio_Gallegos.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/Salta.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/San_Juan.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/San_Luis.generic.long=Hor\u00e1rio da Argentina +-America/Argentina/Tucuman.generic.long=Hor\u00E1rio da Argentina +-America/Argentina/Ushuaia.generic.long=Hor\u00E1rio da Argentina +-America/Aruba.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Asuncion.generic.long=Hor\u00E1rio do Paraguai +-America/Atikokan.generic.long=Hor\u00E1rio do Leste +-America/Atka.generic.long=Hor\u00E1rio do Hava\u00ED-Aleutas +-America/Bahia.generic.long=Hor\u00E1rio de Bras\u00EDlia +-America/Bahia_Banderas.generic.long=Hor\u00E1rio Central +-America/Barbados.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Belem.generic.long=Hor\u00E1rio de Bras\u00EDlia +-America/Belize.generic.long=Hor\u00E1rio Central +-America/Blanc-Sablon.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Boa_Vista.generic.long=Hor\u00E1rio do Amazonas +-America/Bogota.generic.long=Hor\u00E1rio da Col\u00F4mbia +-America/Boise.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Buenos_Aires.generic.long=Hor\u00E1rio da Argentina +-America/Cambridge_Bay.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Campo_Grande.generic.long=Hor\u00E1rio do Amazonas +-America/Cancun.generic.long=Hor\u00E1rio Central +-America/Caracas.generic.long=Hor\u00E1rio da Venezuela +-America/Catamarca.generic.long=Hor\u00E1rio da Argentina +-America/Cayenne.generic.long=Hor\u00E1rio da Guiana Francesa +-America/Cayman.generic.long=Hor\u00E1rio do Leste +-America/Chicago.generic.long=Hor\u00E1rio Central +-America/Chihuahua.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Coral_Harbour.generic.long=Hor\u00E1rio do Leste +-America/Cordoba.generic.long=Hor\u00E1rio da Argentina +-America/Costa_Rica.generic.long=Hor\u00E1rio Central +-America/Creston.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Cuiaba.generic.long=Hor\u00E1rio do Amazonas +-America/Curacao.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Danmarkshavn.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-America/Dawson.generic.long=Hor\u00E1rio do Pac\u00EDfico +-America/Dawson_Creek.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Denver.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Detroit.generic.long=Hor\u00E1rio do Leste +-America/Dominica.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Edmonton.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Eirunepe.generic.long=Fuso hor\u00e1rio do Acre +-America/El_Salvador.generic.long=Hor\u00E1rio Central +-America/Ensenada.generic.long=Hor\u00E1rio do Pac\u00EDfico +-America/Fort_Wayne.generic.long=Hor\u00E1rio do Leste +-America/Fortaleza.generic.long=Hor\u00E1rio de Bras\u00EDlia +-America/Glace_Bay.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Godthab.generic.long=Hor\u00E1rio da Groenl\u00E2ndia Ocidental +-America/Goose_Bay.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Grand_Turk.generic.long=Hor\u00E1rio do Leste +-America/Grenada.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Guadeloupe.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Guatemala.generic.long=Hor\u00E1rio Central +-America/Guayaquil.generic.long=Hor\u00E1rio do Equador +-America/Guyana.generic.long=Hor\u00E1rios da Guiana +-America/Halifax.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Havana.generic.long=Hor\u00E1rio de Cuba +-America/Hermosillo.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Indiana/Indianapolis.generic.long=Hor\u00E1rio do Leste +-America/Indiana/Knox.generic.long=Hor\u00E1rio Central +-America/Indiana/Marengo.generic.long=Hor\u00E1rio do Leste +-America/Indiana/Petersburg.generic.long=Hor\u00E1rio do Leste +-America/Indiana/Tell_City.generic.long=Hor\u00E1rio Central +-America/Indiana/Vevay.generic.long=Hor\u00E1rio do Leste +-America/Indiana/Vincennes.generic.long=Hor\u00E1rio do Leste +-America/Indiana/Winamac.generic.long=Hor\u00E1rio do Leste +-America/Indianapolis.generic.long=Hor\u00E1rio do Leste +-America/Inuvik.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Iqaluit.generic.long=Hor\u00E1rio do Leste +-America/Jamaica.generic.long=Hor\u00E1rio do Leste +-America/Jujuy.generic.long=Hor\u00E1rio da Argentina +-America/Juneau.generic.long=Hor\u00E1rio do Alasca +-America/Kentucky/Louisville.generic.long=Hor\u00E1rio do Leste +-America/Kentucky/Monticello.generic.long=Hor\u00E1rio do Leste +-America/Knox_IN.generic.long=Hor\u00E1rio Central +-America/Kralendijk.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/La_Paz.generic.long=Hor\u00E1rio da Bol\u00EDvia +-America/Lima.generic.long=Hor\u00E1rio do Peru +-America/Los_Angeles.generic.long=Hor\u00E1rio do Pac\u00EDfico +-America/Louisville.generic.long=Hor\u00E1rio do Leste +-America/Lower_Princes.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Maceio.generic.long=Hor\u00E1rio de Bras\u00EDlia +-America/Managua.generic.long=Hor\u00E1rio Central +-America/Manaus.generic.long=Hor\u00E1rio do Amazonas +-America/Marigot.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Martinique.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Matamoros.generic.long=Hor\u00E1rio Central +-America/Mazatlan.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Mendoza.generic.long=Hor\u00E1rio da Argentina +-America/Menominee.generic.long=Hor\u00E1rio Central +-America/Merida.generic.long=Hor\u00E1rio Central +-America/Metlakatla.daylight.long=Hor\u00E1rio de Luz Natural de Metlakatla +-America/Metlakatla.generic.long=Hor\u00E1rio de Metlakatla +-America/Metlakatla.standard.long=Hor\u00E1rio Padr\u00E3o de Metlakatla +-America/Mexico_City.generic.long=Hor\u00E1rio Central +-America/Miquelon.generic.long=Hor\u00E1rio de Saint Pierre e Miquelon +-America/Moncton.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Monterrey.generic.long=Hor\u00E1rio Central +-America/Montevideo.generic.long=Hor\u00E1rio do Uruguai +-America/Montreal.generic.long=Hor\u00E1rio do Leste +-America/Montserrat.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Nassau.generic.long=Hor\u00E1rio do Leste +-America/New_York.generic.long=Hor\u00E1rio do Leste +-America/Nipigon.generic.long=Hor\u00E1rio do Leste +-America/Nome.generic.long=Hor\u00E1rio do Alasca +-America/Noronha.generic.long=Hor\u00E1rio de Fernando de Noronha +-America/North_Dakota/Beulah.generic.long=Hor\u00E1rio Central +-America/North_Dakota/Center.generic.long=Hor\u00E1rio Central +-America/North_Dakota/New_Salem.generic.long=Hor\u00E1rio Central +-America/Ojinaga.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Panama.generic.long=Hor\u00E1rio do Leste +-America/Pangnirtung.generic.long=Hor\u00E1rio do Leste +-America/Paramaribo.generic.long=Hor\u00E1rio do Suriname +-America/Phoenix.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Port-au-Prince.generic.long=Hor\u00E1rio do Leste +-America/Port_of_Spain.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Porto_Acre.generic.long=Fuso hor\u00e1rio do Acre +-America/Porto_Velho.generic.long=Hor\u00E1rio do Amazonas +-America/Puerto_Rico.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Rainy_River.generic.long=Hor\u00E1rio Central +-America/Rankin_Inlet.generic.long=Hor\u00E1rio Central +-America/Recife.generic.long=Hor\u00E1rio de Bras\u00EDlia +-America/Regina.generic.long=Hor\u00E1rio Central +-America/Resolute.generic.long=Hor\u00E1rio Central +-America/Rio_Branco.generic.long=Fuso hor\u00e1rio do Acre +-America/Rosario.generic.long=Hor\u00E1rio da Argentina +-America/Santa_Isabel.generic.long=Hor\u00E1rio do Pac\u00EDfico +-America/Santarem.generic.long=Hor\u00E1rio de Bras\u00EDlia +-America/Santiago.generic.long=Hor\u00E1rio do Chile +-America/Santo_Domingo.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Sao_Paulo.generic.long=Hor\u00E1rio de Bras\u00EDlia +-America/Scoresbysund.generic.long=Hor\u00E1rio da Groenl\u00E2ndia Oriental +-America/Shiprock.generic.long=Hor\u00E1rio das Montanhas Rochosas +-America/Sitka.generic.long=Hor\u00E1rio do Alasca +-America/St_Barthelemy.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/St_Johns.generic.long=Hor\u00E1rio de Terra Nova +-America/St_Kitts.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/St_Lucia.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/St_Thomas.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/St_Vincent.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Swift_Current.generic.long=Hor\u00E1rio Central +-America/Tegucigalpa.generic.long=Hor\u00E1rio Central +-America/Thule.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Thunder_Bay.generic.long=Hor\u00E1rio do Leste +-America/Tijuana.generic.long=Hor\u00E1rio do Pac\u00EDfico +-America/Toronto.generic.long=Hor\u00E1rio do Leste +-America/Tortola.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Vancouver.generic.long=Hor\u00E1rio do Pac\u00EDfico +-America/Virgin.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-America/Whitehorse.generic.long=Hor\u00E1rio do Pac\u00EDfico +-America/Winnipeg.generic.long=Hor\u00E1rio Central +-America/Yakutat.generic.long=Hor\u00E1rio do Alasca +-America/Yellowknife.generic.long=Hor\u00E1rio das Montanhas Rochosas +-Antarctica/Casey.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Ocidental (Austr\u00E1lia) +-Antarctica/Casey.generic.long=Hor\u00E1rio Ocidental (Austr\u00E1lia) +-Antarctica/Casey.standard.long=Hor\u00E1rio-Padr\u00E3o Ocidental (Austr\u00E1lia) +-Antarctica/Davis.generic.long=Hor\u00E1rio de Davis +-Antarctica/DumontDUrville.generic.long=Fuso Hor\u00E1rio de Dumont-d'Urville +-Antarctica/Macquarie.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o da Ilha de Macquarie +-Antarctica/Macquarie.generic.long=Fuso Hor\u00E1rio da Ilha de Macquarie +-Antarctica/Macquarie.standard.long=Fuso Hor\u00E1rio da Ilha de Macquarie +-Antarctica/Mawson.generic.long=Hor\u00E1rio de Mawson +-Antarctica/McMurdo.generic.long=Hor\u00E1rio da Nova Zel\u00E2ndia +-Antarctica/Palmer.generic.long=Hor\u00E1rio do Chile +-Antarctica/Rothera.generic.long=Hor\u00E1rio de Rothera +-Antarctica/South_Pole.generic.long=Hor\u00E1rio da Nova Zel\u00E2ndia +-Antarctica/Syowa.generic.long=Hor\u00E1rio de Syowa +-Antarctica/Vostok.generic.long=Hor\u00E1rio de Vostok +-Arctic/Longyearbyen.generic.long=Hor\u00E1rio da Europa Central +-Asia/Aden.generic.long=Hor\u00E1rio da Ar\u00E1bia +-Asia/Almaty.generic.long=Hor\u00E1rio de Alma-Ata +-Asia/Amman.generic.long=Hor\u00e1rio da Ar\u00e1bia +-Asia/Anadyr.generic.long=Hor\u00E1rio de Anadyr +-Asia/Aqtau.generic.long=Hor\u00E1rio de Aqtau +-Asia/Aqtobe.generic.long=Hor\u00E1rio de Aqtobe +-Asia/Ashgabat.generic.long=Hor\u00E1rio do Turcomenist\u00E3o +-Asia/Ashkhabad.generic.long=Hor\u00E1rio do Turcomenist\u00E3o +-Asia/Baghdad.generic.long=Hor\u00E1rio da Ar\u00E1bia +-Asia/Bahrain.generic.long=Hor\u00E1rio da Ar\u00E1bia +-Asia/Baku.generic.long=Hor\u00E1rio do Azerbaij\u00E3o +-Asia/Bangkok.generic.long=Hor\u00E1rio da Indochina +-Asia/Beirut.generic.long=Hor\u00E1rio da Europa Oriental +-Asia/Bishkek.generic.long=Hor\u00E1rio do Quirguist\u00E3o +-Asia/Brunei.generic.long=Hor\u00E1rio de Brunei +-Asia/Calcutta.generic.long=Hor\u00E1rio da \u00CDndia +-Asia/Choibalsan.generic.long=Hor\u00E1rio de Choibalsan +-Asia/Chongqing.generic.long=Hor\u00E1rio da China +-Asia/Chungking.generic.long=Hor\u00E1rio da China +-Asia/Colombo.generic.long=Hor\u00E1rio da \u00CDndia +-Asia/Dacca.generic.long=Hor\u00E1rio de Bangladesh +-Asia/Damascus.generic.long=Hor\u00E1rio da Europa Oriental +-Asia/Dhaka.generic.long=Hor\u00E1rio de Bangladesh +-Asia/Dili.generic.long=Hor\u00E1rio do Timor-Leste +-Asia/Dubai.generic.long=Hor\u00E1rio do Golfo +-Asia/Dushanbe.generic.long=Hor\u00E1rio do Tadjiquist\u00E3o +-Asia/Gaza.generic.long=Hor\u00E1rio da Europa Oriental +-Asia/Harbin.generic.long=Hor\u00E1rio da China +-Asia/Hebron.generic.long=Hor\u00E1rio da Europa Oriental +-Asia/Ho_Chi_Minh.generic.long=Hor\u00E1rio da Indochina +-Asia/Hong_Kong.generic.long=Hor\u00E1rio de Hong Kong +-Asia/Hovd.generic.long=Hor\u00E1rio de Hovd +-Asia/Irkutsk.generic.long=Hor\u00E1rio de Irkutsk +-Asia/Istanbul.generic.long=Hor\u00E1rio da Europa Oriental +-Asia/Jakarta.generic.long=Hor\u00E1rio da Indon\u00E9sia Ocidental +-Asia/Jayapura.generic.long=Hor\u00E1rio da Indon\u00E9sia Oriental +-Asia/Jerusalem.generic.long=Hor\u00E1rio de Israel +-Asia/Kabul.generic.long=Hor\u00E1rio do Afeganist\u00E3o +-Asia/Kamchatka.generic.long=Hor\u00E1rio de Petropavlovsk-Kamchatski +-Asia/Karachi.generic.long=Hor\u00E1rio do Paquist\u00E3o +-Asia/Kashgar.generic.long=Hor\u00E1rio da China +-Asia/Kathmandu.generic.long=Hor\u00E1rio do Nepal +-Asia/Katmandu.generic.long=Hor\u00E1rio do Nepal +-Asia/Khandyga.daylight.long=Hor\u00E1rio de Ver\u00E3o de Khandyga +-Asia/Khandyga.generic.long=Hor\u00E1rio de Khandyga +-Asia/Khandyga.standard.long=Hor\u00E1rio de Khandyga +-Asia/Kolkata.generic.long=Hor\u00E1rio da \u00CDndia +-Asia/Krasnoyarsk.generic.long=Hor\u00E1rio de Krasnoyarsk +-Asia/Kuala_Lumpur.generic.long=Hor\u00E1rio da Mal\u00E1sia +-Asia/Kuching.generic.long=Hor\u00E1rio da Mal\u00E1sia +-Asia/Kuwait.generic.long=Hor\u00E1rio da Ar\u00E1bia +-Asia/Macao.generic.long=Hor\u00E1rio da China +-Asia/Macau.generic.long=Hor\u00E1rio da China +-Asia/Magadan.generic.long=Hor\u00E1rio de Magadan +-Asia/Makassar.generic.long=Hor\u00E1rio da Indon\u00E9sia Central +-Asia/Manila.generic.long=Hor\u00E1rio das Filipinas +-Asia/Muscat.generic.long=Hor\u00E1rio do Golfo +-Asia/Nicosia.generic.long=Hor\u00E1rio da Europa Oriental +-Asia/Novokuznetsk.generic.long=Hor\u00E1rio de Novosibirsk +-Asia/Novosibirsk.generic.long=Hor\u00E1rio de Novosibirsk +-Asia/Omsk.generic.long=Hor\u00E1rio de Omsk +-Asia/Oral.generic.long=Hor\u00E1rio de Uralsk +-Asia/Phnom_Penh.generic.long=Hor\u00E1rio da Indochina +-Asia/Pontianak.generic.long=Hor\u00E1rio da Indon\u00E9sia Ocidental +-Asia/Pyongyang.generic.long=Hor\u00E1rio da Coreia +-Asia/Qatar.generic.long=Hor\u00E1rio da Ar\u00E1bia +-Asia/Qyzylorda.generic.long=Hor\u00E1rio de Qyzylorda +-Asia/Rangoon.generic.long=Hor\u00E1rio de Mianmar +-Asia/Saigon.generic.long=Hor\u00E1rio da Indochina +-Asia/Sakhalin.generic.long=Hor\u00E1rio de Sakhalin +-Asia/Samarkand.generic.long=Hor\u00E1rio do Uzbequist\u00E3o +-Asia/Seoul.generic.long=Hor\u00E1rio da Coreia +-Asia/Shanghai.generic.long=Hor\u00E1rio da China +-Asia/Singapore.generic.long=Hor\u00E1rio de Cingapura +-Asia/Taipei.generic.long=Hor\u00E1rio da China +-Asia/Tashkent.generic.long=Hor\u00E1rio do Uzbequist\u00E3o +-Asia/Tbilisi.generic.long=Hor\u00E1rio da Ge\u00F3rgia +-Asia/Tehran.generic.long=Hor\u00E1rio do Ir\u00E3 +-Asia/Tel_Aviv.generic.long=Hor\u00E1rio de Israel +-Asia/Thimbu.generic.long=Hor\u00E1rio do But\u00E3o +-Asia/Thimphu.generic.long=Hor\u00E1rio do But\u00E3o +-Asia/Tokyo.generic.long=Hor\u00E1rio do Jap\u00E3o +-Asia/Ujung_Pandang.generic.long=Hor\u00E1rio da Indon\u00E9sia Central +-Asia/Ulaanbaatar.generic.long=Hor\u00E1rio de Ulaanbaatar +-Asia/Ulan_Bator.generic.long=Hor\u00E1rio de Ulaanbaatar +-Asia/Urumqi.generic.long=Hor\u00E1rio da China +-Asia/Ust-Nera.daylight.long=Hor\u00E1rio de Ver\u00E3o de Ust-Nera +-Asia/Ust-Nera.generic.long=Hor\u00E1rio de Ust-Nera +-Asia/Ust-Nera.standard.long=Hor\u00E1rio de Ust-Nera +-Asia/Vientiane.generic.long=Hor\u00E1rio da Indochina +-Asia/Vladivostok.generic.long=Hor\u00E1rio de Vladivostok +-Asia/Yakutsk.generic.long=Hor\u00E1rio de Yakutsk +-Asia/Yekaterinburg.generic.long=Hor\u00E1rio de Yekaterinburg +-Asia/Yerevan.generic.long=Hor\u00E1rio da Arm\u00EAnia +-Atlantic/Azores.generic.long=Hor\u00E1rio de A\u00E7ores +-Atlantic/Bermuda.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-Atlantic/Canary.generic.long=Hor\u00E1rio da Europa Ocidental +-Atlantic/Cape_Verde.generic.long=Hor\u00E1rio de Cabo Verde +-Atlantic/Faeroe.generic.long=Hor\u00E1rio da Europa Ocidental +-Atlantic/Faroe.generic.long=Hor\u00E1rio da Europa Ocidental +-Atlantic/Jan_Mayen.generic.long=Hor\u00E1rio da Europa Central +-Atlantic/Madeira.generic.long=Hor\u00E1rio da Europa Ocidental +-Atlantic/Reykjavik.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Atlantic/South_Georgia.generic.long=Hor\u00E1rio da Ge\u00F3rgia do Sul +-Atlantic/St_Helena.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Atlantic/Stanley.generic.long=Hor\u00E1rio das Ilhas Malvinas +-Australia/ACT.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Nova Gales do Sul) +-Australia/ACT.generic.long=Hor\u00E1rio Oriental (Nova Gales do Sul) +-Australia/ACT.standard.long=Hor\u00E1rio-Padr\u00E3o Oriental (Nova Gales do Sul) +-Australia/Adelaide.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Central (Austr\u00E1lia do Sul) +-Australia/Adelaide.generic.long=Hor\u00E1rio Central (Austr\u00E1lia do Sul) +-Australia/Adelaide.standard.long=Hor\u00E1rio-Padr\u00E3o Central (Austr\u00E1lia do Sul) +-Australia/Brisbane.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Queensland) +-Australia/Brisbane.generic.long=Hor\u00E1rio do Leste (Queensland) +-Australia/Brisbane.standard.long=Hor\u00E1rio-Padr\u00E3o do Leste (Queensland) +-Australia/Broken_Hill.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Central (Austr\u00E1lia do Sul/Nova Gales do Sul) +-Australia/Broken_Hill.generic.long=Hor\u00E1rio Central (Austr\u00E1lia do Sul/Nova Gales do Sul) +-Australia/Broken_Hill.standard.long=Hor\u00E1rio-Padr\u00E3o Central (Austr\u00E1lia do Sul/Nova Gales do Sul) +-Australia/Canberra.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Nova Gales do Sul) +-Australia/Canberra.generic.long=Hor\u00E1rio Oriental (Nova Gales do Sul) +-Australia/Canberra.standard.long=Hor\u00E1rio-Padr\u00E3o Oriental (Nova Gales do Sul) +-Australia/Currie.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Nova Gales do Sul) +-Australia/Currie.generic.long=Hor\u00E1rio Oriental (Nova Gales do Sul) +-Australia/Currie.standard.long=Hor\u00E1rio-Padr\u00E3o Oriental (Nova Gales do Sul) +-Australia/Darwin.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Central (Territ\u00F3rio do Norte) +-Australia/Darwin.generic.long=Hor\u00E1rio Central (Territ\u00F3rio do Norte) +-Australia/Darwin.standard.long=Hor\u00E1rio-Padr\u00E3o Central (Territ\u00F3rio do Norte) +-Australia/Eucla.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Ocidental Central (Austr\u00E1lia) +-Australia/Eucla.generic.long=Hor\u00E1rio Ocidental Central (Austr\u00E1lia) +-Australia/Eucla.standard.long=Fuso Hor\u00E1rio Ocidental Central (Austr\u00E1lia) +-Australia/Hobart.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Tasm\u00E2nia) +-Australia/Hobart.generic.long=Hor\u00E1rio do Leste (Tasm\u00E2nia) +-Australia/Hobart.standard.long=Hor\u00E1rio-Padr\u00E3o do Leste (Tasm\u00E2nia) +-Australia/LHI.generic.long=Hor\u00E1rio de Lord Howe +-Australia/Lindeman.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Queensland) +-Australia/Lindeman.generic.long=Hor\u00E1rio do Leste (Queensland) +-Australia/Lindeman.standard.long=Hor\u00E1rio-Padr\u00E3o do Leste (Queensland) +-Australia/Lord_Howe.generic.long=Hor\u00E1rio de Lord Howe +-Australia/Melbourne.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Victoria) +-Australia/Melbourne.generic.long=Hor\u00E1rio do Leste (Victoria) +-Australia/Melbourne.standard.long=Hor\u00E1rio-Padr\u00E3o do Leste (Victoria) +-Australia/NSW.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Nova Gales do Sul) +-Australia/NSW.generic.long=Hor\u00E1rio Oriental (Nova Gales do Sul) +-Australia/NSW.standard.long=Hor\u00E1rio-Padr\u00E3o Oriental (Nova Gales do Sul) +-Australia/North.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Central (Territ\u00F3rio do Norte) +-Australia/North.generic.long=Hor\u00E1rio Central (Territ\u00F3rio do Norte) +-Australia/North.standard.long=Hor\u00E1rio-Padr\u00E3o Central (Territ\u00F3rio do Norte) +-Australia/Perth.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Ocidental (Austr\u00E1lia) +-Australia/Perth.generic.long=Hor\u00E1rio Ocidental (Austr\u00E1lia) +-Australia/Perth.standard.long=Hor\u00E1rio-Padr\u00E3o Ocidental (Austr\u00E1lia) +-Australia/Queensland.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Queensland) +-Australia/Queensland.generic.long=Hor\u00E1rio do Leste (Queensland) +-Australia/Queensland.standard.long=Hor\u00E1rio-Padr\u00E3o do Leste (Queensland) +-Australia/South.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Central (Austr\u00E1lia do Sul) +-Australia/South.generic.long=Hor\u00E1rio Central (Austr\u00E1lia do Sul) +-Australia/South.standard.long=Hor\u00E1rio-Padr\u00E3o Central (Austr\u00E1lia do Sul) +-Australia/Sydney.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Nova Gales do Sul) +-Australia/Sydney.generic.long=Hor\u00E1rio Oriental (Nova Gales do Sul) +-Australia/Sydney.standard.long=Hor\u00E1rio-Padr\u00E3o Oriental (Nova Gales do Sul) +-Australia/Tasmania.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Tasm\u00E2nia) +-Australia/Tasmania.generic.long=Hor\u00E1rio do Leste (Tasm\u00E2nia) +-Australia/Tasmania.standard.long=Hor\u00E1rio-Padr\u00E3o do Leste (Tasm\u00E2nia) +-Australia/Victoria.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Oriental (Victoria) +-Australia/Victoria.generic.long=Hor\u00E1rio do Leste (Victoria) +-Australia/Victoria.standard.long=Hor\u00E1rio-Padr\u00E3o do Leste (Victoria) +-Australia/West.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Ocidental (Austr\u00E1lia) +-Australia/West.generic.long=Hor\u00E1rio Ocidental (Austr\u00E1lia) +-Australia/West.standard.long=Hor\u00E1rio-Padr\u00E3o Ocidental (Austr\u00E1lia) +-Australia/Yancowinna.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o Central (Austr\u00E1lia do Sul/Nova Gales do Sul) +-Australia/Yancowinna.generic.long=Hor\u00E1rio Central (Austr\u00E1lia do Sul/Nova Gales do Sul) +-Australia/Yancowinna.standard.long=Hor\u00E1rio-Padr\u00E3o Central (Austr\u00E1lia do Sul/Nova Gales do Sul) +-BET.generic.long=Hor\u00E1rio de Bras\u00EDlia +-BST.generic.long=Hor\u00E1rio de Bangladesh +-Brazil/Acre.generic.long=Fuso hor\u00e1rio do Acre +-Brazil/DeNoronha.generic.long=Hor\u00E1rio de Fernando de Noronha +-Brazil/East.generic.long=Hor\u00E1rio de Bras\u00EDlia +-Brazil/West.generic.long=Hor\u00E1rio do Amazonas +-CAT.generic.long=Hor\u00E1rio da \u00C1frica Central +-CET.generic.long=Hor\u00e1rio da Europa Central +-CNT.generic.long=Hor\u00E1rio de Terra Nova +-CST.generic.long=Hor\u00E1rio Central +-CST6CDT.generic.long=Hor\u00e1rio Central +-CTT.generic.long=Hor\u00E1rio da China +-Canada/Atlantic.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-Canada/Central.generic.long=Hor\u00E1rio Central +-Canada/East-Saskatchewan.generic.long=Hor\u00E1rio Central +-Canada/Eastern.generic.long=Hor\u00E1rio do Leste +-Canada/Mountain.generic.long=Hor\u00E1rio das Montanhas Rochosas +-Canada/Newfoundland.generic.long=Hor\u00E1rio de Terra Nova +-Canada/Pacific.generic.long=Hor\u00E1rio do Pac\u00EDfico +-Canada/Saskatchewan.generic.long=Hor\u00E1rio Central +-Canada/Yukon.generic.long=Hor\u00E1rio do Pac\u00EDfico +-Chile/Continental.generic.long=Hor\u00E1rio do Chile +-Chile/EasterIsland.generic.long=Hor\u00E1rio da Ilha de P\u00E1scoa +-Cuba.generic.long=Hor\u00E1rio de Cuba +-EAT.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-ECT.generic.long=Hor\u00E1rio da Europa Central +-EET.generic.long=Hor\u00e1rio da Europa Oriental +-EST.generic.long=Hor\u00e1rio do Leste +-EST5EDT.generic.long=Hor\u00e1rio do Leste +-Egypt.generic.long=Hor\u00E1rio da Europa Oriental +-Eire.generic.long=Hor\u00E1rio da Rep\u00FAblica da Irlanda +-Etc/Greenwich.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Etc/UCT.generic.long=Hor\u00E1rio Universal Coordenado +-Etc/UTC.generic.long=Hor\u00E1rio Universal Coordenado +-Etc/Universal.generic.long=Hor\u00E1rio Universal Coordenado +-Etc/Zulu.generic.long=Hor\u00E1rio Universal Coordenado +-Europe/Amsterdam.generic.long=Hor\u00E1rio da Europa Central +-Europe/Andorra.generic.long=Hor\u00E1rio da Europa Central +-Europe/Athens.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Belfast.generic.long=Hor\u00E1rio do Reino Unido +-Europe/Belgrade.generic.long=Hor\u00E1rio da Europa Central +-Europe/Berlin.generic.long=Hor\u00E1rio da Europa Central +-Europe/Bratislava.generic.long=Hor\u00E1rio da Europa Central +-Europe/Brussels.generic.long=Hor\u00E1rio da Europa Central +-Europe/Bucharest.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Budapest.generic.long=Hor\u00E1rio da Europa Central +-Europe/Busingen.generic.long=Hor\u00E1rio da Europa Central +-Europe/Chisinau.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Copenhagen.generic.long=Hor\u00E1rio da Europa Central +-Europe/Dublin.generic.long=Hor\u00E1rio da Rep\u00FAblica da Irlanda +-Europe/Gibraltar.generic.long=Hor\u00E1rio da Europa Central +-Europe/Guernsey.generic.long=Hor\u00E1rio do Reino Unido +-Europe/Helsinki.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Isle_of_Man.generic.long=Hor\u00E1rio do Reino Unido +-Europe/Istanbul.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Jersey.generic.long=Hor\u00E1rio do Reino Unido +-Europe/Kaliningrad.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o do Extremo Leste Europeu +-Europe/Kaliningrad.generic.long=Hor\u00E1rio do Extremo Leste Europeu (FET) +-Europe/Kaliningrad.standard.long=Hor\u00E1rio do Extremo Leste Europeu (FET) +-Europe/Kiev.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Lisbon.generic.long=Hor\u00E1rio da Europa Ocidental +-Europe/Ljubljana.generic.long=Hor\u00E1rio da Europa Central +-Europe/London.generic.long=Hor\u00E1rio do Reino Unido +-Europe/Luxembourg.generic.long=Hor\u00E1rio da Europa Central +-Europe/Madrid.generic.long=Hor\u00E1rio da Europa Central +-Europe/Malta.generic.long=Hor\u00E1rio da Europa Central +-Europe/Mariehamn.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Minsk.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o do Extremo Leste Europeu +-Europe/Minsk.generic.long=Hor\u00E1rio do Extremo Leste Europeu (FET) +-Europe/Minsk.standard.long=Hor\u00E1rio do Extremo Leste Europeu (FET) +-Europe/Monaco.generic.long=Hor\u00E1rio da Europa Central +-Europe/Moscow.generic.long=Hor\u00E1rio de Moscou +-Europe/Nicosia.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Oslo.generic.long=Hor\u00E1rio da Europa Central +-Europe/Paris.generic.long=Hor\u00E1rio da Europa Central +-Europe/Podgorica.generic.long=Hor\u00E1rio da Europa Central +-Europe/Prague.generic.long=Hor\u00E1rio da Europa Central +-Europe/Riga.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Rome.generic.long=Hor\u00E1rio da Europa Central +-Europe/Samara.generic.long=Hor\u00E1rio de Samara +-Europe/San_Marino.generic.long=Hor\u00E1rio da Europa Central +-Europe/Sarajevo.generic.long=Hor\u00E1rio da Europa Central +-Europe/Simferopol.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Skopje.generic.long=Hor\u00E1rio da Europa Central +-Europe/Sofia.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Stockholm.generic.long=Hor\u00E1rio da Europa Central +-Europe/Tallinn.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Tirane.generic.long=Hor\u00E1rio da Europa Central +-Europe/Tiraspol.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Uzhgorod.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Vaduz.generic.long=Hor\u00E1rio da Europa Central +-Europe/Vatican.generic.long=Hor\u00E1rio da Europa Central +-Europe/Vienna.generic.long=Hor\u00E1rio da Europa Central +-Europe/Vilnius.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Volgograd.generic.long=Hor\u00E1rio de Volgogrado +-Europe/Warsaw.generic.long=Hor\u00E1rio da Europa Central +-Europe/Zagreb.generic.long=Hor\u00E1rio da Europa Central +-Europe/Zaporozhye.generic.long=Hor\u00E1rio da Europa Oriental +-Europe/Zurich.generic.long=Hor\u00E1rio da Europa Central +-GB-Eire.generic.long=Hor\u00E1rio do Reino Unido +-GB.generic.long=Hor\u00E1rio do Reino Unido +-GMT.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Greenwich.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-HST.generic.long=Hor\u00e1rio do Hava\u00ed +-Hongkong.generic.long=Hor\u00E1rio de Hong Kong +-IET.generic.long=Hor\u00E1rio do Leste +-IST.generic.long=Hor\u00E1rio da \u00CDndia +-Iceland.generic.long=Hor\u00E1rio M\u00E9dio de Greenwich +-Indian/Antananarivo.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Indian/Chagos.generic.long=Hor\u00E1rio do Territ\u00F3rio do Oceano \u00CDndico +-Indian/Christmas.generic.long=Hor\u00E1rio da Ilha Christmas +-Indian/Cocos.generic.long=Hor\u00E1rio das Ilhas Cocos +-Indian/Comoro.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Indian/Kerguelen.generic.long=Hor\u00E1rio do Territ\u00F3rio Franc\u00EAs no Sul da Ant\u00E1rtica +-Indian/Mahe.generic.long=Hor\u00E1rio de Seychelles +-Indian/Maldives.generic.long=Hor\u00E1rio das Maldivas +-Indian/Mauritius.generic.long=Hor\u00E1rio de Maur\u00EDcio +-Indian/Mayotte.generic.long=Hor\u00E1rio do Leste da \u00C1frica +-Indian/Reunion.generic.long=Hor\u00E1rio das Ilhas Reuni\u00E3o +-Iran.generic.long=Hor\u00E1rio do Ir\u00E3 +-Israel.generic.long=Hor\u00E1rio de Israel +-JST.generic.long=Hor\u00E1rio do Jap\u00E3o +-Jamaica.generic.long=Hor\u00E1rio do Leste +-Japan.generic.long=Hor\u00E1rio do Jap\u00E3o +-Kwajalein.generic.long=Hor\u00E1rio das Ilhas Marshall +-Libya.generic.long=Hor\u00e1rio da Europa Oriental +-MET.generic.long=MET +-MIT.generic.long=Fuso Hor\u00E1rio de Samoa Ocidental +-MST.generic.long=Hor\u00e1rio das Montanhas Rochosas +-MST7MDT.generic.long=Hor\u00e1rio das Montanhas Rochosas +-Mexico/BajaNorte.generic.long=Hor\u00E1rio do Pac\u00EDfico +-Mexico/BajaSur.generic.long=Hor\u00E1rio das Montanhas Rochosas +-Mexico/General.generic.long=Hor\u00E1rio Central +-NET.generic.long=Hor\u00E1rio da Arm\u00EAnia +-NST.generic.long=Hor\u00E1rio da Nova Zel\u00E2ndia +-NZ-CHAT.generic.long=Hor\u00E1rio de Chatham +-NZ.generic.long=Hor\u00E1rio da Nova Zel\u00E2ndia +-Navajo.generic.long=Hor\u00E1rio das Montanhas Rochosas +-PLT.generic.long=Hor\u00E1rio do Paquist\u00E3o +-PNT.generic.long=Hor\u00E1rio das Montanhas Rochosas +-PRC.generic.long=Hor\u00E1rio da China +-PRT.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-PST.generic.long=Hor\u00E1rio do Pac\u00EDfico +-PST8PDT.generic.long=Hor\u00e1rio do Pac\u00edfico +-Pacific/Apia.generic.long=Fuso Hor\u00E1rio de Samoa Ocidental +-Pacific/Auckland.generic.long=Hor\u00E1rio da Nova Zel\u00E2ndia +-Pacific/Chatham.generic.long=Hor\u00E1rio de Chatham +-Pacific/Chuuk.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o de Chuuk +-Pacific/Chuuk.generic.long=Fuso Hor\u00E1rio de Chuuk +-Pacific/Chuuk.standard.long=Fuso Hor\u00E1rio de Chuuk +-Pacific/Easter.generic.long=Hor\u00E1rio da Ilha de P\u00E1scoa +-Pacific/Efate.generic.long=Hor\u00E1rio de Vanuatu +-Pacific/Enderbury.generic.long=Hor\u00E1rio da Ilha Phoenix +-Pacific/Fakaofo.generic.long=Hor\u00E1rio de Toquelau +-Pacific/Fiji.generic.long=Hor\u00E1rio de Fiji +-Pacific/Funafuti.generic.long=Hor\u00E1rio de Tuvalu +-Pacific/Galapagos.generic.long=Hor\u00E1rio de Gal\u00E1pagos +-Pacific/Gambier.generic.long=Hor\u00E1rio de Gambier +-Pacific/Guadalcanal.generic.long=Hor\u00E1rio das Ilhas Salom\u00E3o +-Pacific/Guam.generic.long=Hor\u00E1rio de Chamorro +-Pacific/Honolulu.generic.long=Hor\u00E1rio do Hava\u00ED +-Pacific/Johnston.generic.long=Hor\u00E1rio do Hava\u00ED +-Pacific/Kiritimati.generic.long=Hor\u00E1rio das Ilhas Line +-Pacific/Kosrae.generic.long=Hor\u00E1rio de Kosrae +-Pacific/Kwajalein.generic.long=Hor\u00E1rio das Ilhas Marshall +-Pacific/Majuro.generic.long=Hor\u00E1rio das Ilhas Marshall +-Pacific/Marquesas.generic.long=Hor\u00E1rio das Ilhas Marquesas +-Pacific/Midway.generic.long=Hor\u00E1rio da Samoa +-Pacific/Nauru.generic.long=Hor\u00E1rio de Nauru +-Pacific/Niue.generic.long=Hor\u00E1rio de Niue +-Pacific/Norfolk.generic.long=Hor\u00E1rio de Norfolk +-Pacific/Noumea.generic.long=Hor\u00E1rio da Nova Caled\u00F4nia +-Pacific/Pago_Pago.generic.long=Hor\u00E1rio da Samoa +-Pacific/Palau.generic.long=Hor\u00E1rio de Palau +-Pacific/Pitcairn.generic.long=Hor\u00E1rio de Pitcairn +-Pacific/Pohnpei.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o de Pohnpei +-Pacific/Pohnpei.generic.long=Hor\u00E1rio de Ponape +-Pacific/Pohnpei.standard.long=Fuso Hor\u00E1rio de Pohnpei +-Pacific/Ponape.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o de Pohnpei +-Pacific/Ponape.generic.long=Hor\u00E1rio de Ponape +-Pacific/Ponape.standard.long=Fuso Hor\u00E1rio de Pohnpei +-Pacific/Port_Moresby.generic.long=Hor\u00E1rio de Papua-Nova Guin\u00E9 +-Pacific/Rarotonga.generic.long=Hor\u00E1rio das Ilhas Cook +-Pacific/Saipan.generic.long=Hor\u00E1rio de Chamorro +-Pacific/Samoa.generic.long=Hor\u00E1rio da Samoa +-Pacific/Tahiti.generic.long=Hor\u00E1rio do Tahiti +-Pacific/Tarawa.generic.long=Hor\u00E1rio das Ilhas Gilbert +-Pacific/Tongatapu.generic.long=Hor\u00E1rio de Tonga +-Pacific/Truk.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o de Chuuk +-Pacific/Truk.generic.long=Fuso Hor\u00E1rio de Chuuk +-Pacific/Truk.standard.long=Fuso Hor\u00E1rio de Chuuk +-Pacific/Wake.generic.long=Hor\u00E1rio de Wake +-Pacific/Wallis.generic.long=Hor\u00E1rio das Ilhas Wallis e Futuna +-Pacific/Yap.daylight.long=Fuso Hor\u00E1rio de Ver\u00E3o de Chuuk +-Pacific/Yap.generic.long=Fuso Hor\u00E1rio de Chuuk +-Pacific/Yap.standard.long=Fuso Hor\u00E1rio de Chuuk +-Poland.generic.long=Hor\u00E1rio da Europa Central +-Portugal.generic.long=Hor\u00E1rio da Europa Ocidental +-ROK.generic.long=Hor\u00E1rio da Coreia +-SST.generic.long=Hor\u00E1rio das Ilhas Salom\u00E3o +-Singapore.generic.long=Hor\u00E1rio de Cingapura +-SystemV/AST4.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-SystemV/AST4ADT.generic.long=Hor\u00E1rio do Atl\u00E2ntico +-SystemV/CST6.generic.long=Hor\u00E1rio Central +-SystemV/CST6CDT.generic.long=Hor\u00E1rio Central +-SystemV/EST5.generic.long=Hor\u00E1rio do Leste +-SystemV/EST5EDT.generic.long=Hor\u00E1rio do Leste +-SystemV/HST10.generic.long=Hor\u00E1rio do Hava\u00ED +-SystemV/MST7.generic.long=Hor\u00E1rio das Montanhas Rochosas +-SystemV/MST7MDT.generic.long=Hor\u00E1rio das Montanhas Rochosas +-SystemV/PST8.generic.long=Hor\u00E1rio do Pac\u00EDfico +-SystemV/PST8PDT.generic.long=Hor\u00E1rio do Pac\u00EDfico +-SystemV/YST9.generic.long=Hor\u00E1rio do Alasca +-SystemV/YST9YDT.generic.long=Hor\u00E1rio do Alasca +-Turkey.generic.long=Hor\u00E1rio da Europa Oriental +-UCT.generic.long=Hor\u00E1rio Universal Coordenado +-US/Alaska.generic.long=Hor\u00E1rio do Alasca +-US/Aleutian.generic.long=Hor\u00E1rio do Hava\u00ED-Aleutas +-US/Arizona.generic.long=Hor\u00E1rio das Montanhas Rochosas +-US/Central.generic.long=Hor\u00E1rio Central +-US/East-Indiana.generic.long=Hor\u00E1rio do Leste +-US/Eastern.generic.long=Hor\u00E1rio do Leste +-US/Hawaii.generic.long=Hor\u00E1rio do Hava\u00ED +-US/Indiana-Starke.generic.long=Hor\u00E1rio Central +-US/Michigan.generic.long=Hor\u00E1rio do Leste +-US/Mountain.generic.long=Hor\u00E1rio das Montanhas Rochosas +-US/Pacific-New.generic.long=Hor\u00E1rio do Pac\u00EDfico +-US/Pacific.generic.long=Hor\u00E1rio do Pac\u00EDfico +-US/Samoa.generic.long=Hor\u00E1rio da Samoa +-UTC.generic.long=Hor\u00E1rio Universal Coordenado +-Universal.generic.long=Hor\u00E1rio Universal Coordenado +-VST.generic.long=Hor\u00E1rio da Indochina +-W-SU.generic.long=Hor\u00E1rio de Moscou +-WET.generic.long=Hor\u00e1rio da Europa Ocidental +-Zulu.generic.long=Hor\u00E1rio Universal Coordenado +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_pt_BR_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_pt_BR_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_sv.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_sv.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=Central sommartid (Nordterritoriet) +-ACT.generic.long=Central tid (Nordterritoriet) +-ACT.standard.long=Central standardtid (Nordterritoriet) +-AET.daylight.long=\u00D6stlig sommartid (New South Wales) +-AET.generic.long=\u00D6stlig tid (New South Wales) +-AET.standard.long=\u00D6stlig standardtid (New South Wales) +-AGT.generic.long=Argentinsk tid +-ART.generic.long=\u00D6steuropeisk tid +-AST.generic.long=Alaskisk tid +-Africa/Abidjan.generic.long=Greenwichtid +-Africa/Accra.generic.long=Ghana, normaltid +-Africa/Addis_Ababa.generic.long=\u00D6stafrikansk tid +-Africa/Algiers.generic.long=Centraleuropeisk tid +-Africa/Asmara.generic.long=\u00D6stafrikansk tid +-Africa/Asmera.generic.long=\u00D6stafrikansk tid +-Africa/Bamako.generic.long=Greenwichtid +-Africa/Bangui.generic.long=V\u00E4stafrikansk tid +-Africa/Banjul.generic.long=Greenwichtid +-Africa/Bissau.generic.long=Greenwichtid +-Africa/Blantyre.generic.long=Centralafrikansk tid +-Africa/Brazzaville.generic.long=V\u00E4stafrikansk tid +-Africa/Bujumbura.generic.long=Centralafrikansk tid +-Africa/Cairo.generic.long=\u00D6steuropeisk tid +-Africa/Casablanca.generic.long=V\u00E4steuropeisk tid +-Africa/Ceuta.generic.long=Centraleuropeisk tid +-Africa/Conakry.generic.long=Greenwichtid +-Africa/Dakar.generic.long=Greenwichtid +-Africa/Dar_es_Salaam.generic.long=\u00D6stafrikansk tid +-Africa/Djibouti.generic.long=\u00D6stafrikansk tid +-Africa/Douala.generic.long=V\u00E4stafrikansk tid +-Africa/El_Aaiun.generic.long=V\u00E4steuropeisk tid +-Africa/Freetown.generic.long=Sierra Leone-tid +-Africa/Gaborone.generic.long=Centralafrikansk tid +-Africa/Harare.generic.long=Centralafrikansk tid +-Africa/Johannesburg.generic.long=Sydafrikansk tid +-Africa/Juba.generic.long=\u00D6stafrikansk tid +-Africa/Kampala.generic.long=\u00D6stafrikansk tid +-Africa/Khartoum.generic.long=\u00D6stafrikansk tid +-Africa/Kigali.generic.long=Centralafrikansk tid +-Africa/Kinshasa.generic.long=V\u00E4stafrikansk tid +-Africa/Lagos.generic.long=V\u00E4stafrikansk tid +-Africa/Libreville.generic.long=V\u00E4stafrikansk tid +-Africa/Lome.generic.long=Greenwichtid +-Africa/Luanda.generic.long=V\u00E4stafrikansk tid +-Africa/Lubumbashi.generic.long=Centralafrikansk tid +-Africa/Lusaka.generic.long=Centralafrikansk tid +-Africa/Malabo.generic.long=V\u00E4stafrikansk tid +-Africa/Maputo.generic.long=Centralafrikansk tid +-Africa/Maseru.generic.long=Sydafrikansk tid +-Africa/Mbabane.generic.long=Sydafrikansk tid +-Africa/Mogadishu.generic.long=\u00D6stafrikansk tid +-Africa/Monrovia.generic.long=Greenwichtid +-Africa/Nairobi.generic.long=\u00D6stafrikansk tid +-Africa/Ndjamena.generic.long=V\u00E4stafrikansk tid +-Africa/Niamey.generic.long=V\u00E4stafrikansk tid +-Africa/Nouakchott.generic.long=Greenwichtid +-Africa/Ouagadougou.generic.long=Greenwichtid +-Africa/Porto-Novo.generic.long=V\u00E4stafrikansk tid +-Africa/Sao_Tome.generic.long=Greenwichtid +-Africa/Timbuktu.generic.long=Greenwichtid +-Africa/Tripoli.generic.long=\u00d6steuropeisk tid +-Africa/Tunis.generic.long=Centraleuropeisk tid +-Africa/Windhoek.generic.long=V\u00E4stafrikansk tid +-America/Adak.generic.long=Hawaiiansk-aleutisk tid +-America/Anchorage.generic.long=Alaskisk tid +-America/Anguilla.generic.long=Atlantisk tid +-America/Antigua.generic.long=Atlantisk tid +-America/Araguaina.generic.long=Brasiliansk tid +-America/Argentina/Buenos_Aires.generic.long=Argentinsk tid +-America/Argentina/Catamarca.generic.long=Argentinsk tid +-America/Argentina/ComodRivadavia.generic.long=Argentinsk tid +-America/Argentina/Cordoba.generic.long=Argentinsk tid +-America/Argentina/Jujuy.generic.long=Argentinsk tid +-America/Argentina/La_Rioja.generic.long=Argentinsk tid +-America/Argentina/Mendoza.generic.long=Argentinsk tid +-America/Argentina/Rio_Gallegos.generic.long=Argentinsk tid +-America/Argentina/Salta.generic.long=Argentinsk tid +-America/Argentina/San_Juan.generic.long=Argentinsk tid +-America/Argentina/San_Luis.generic.long=Argentinsk tid +-America/Argentina/Tucuman.generic.long=Argentinsk tid +-America/Argentina/Ushuaia.generic.long=Argentinsk tid +-America/Aruba.generic.long=Atlantisk tid +-America/Asuncion.generic.long=Paraguayansk tid +-America/Atikokan.generic.long=\u00D6stlig tid +-America/Atka.generic.long=Hawaiiansk-aleutisk tid +-America/Bahia.generic.long=Brasiliansk tid +-America/Bahia_Banderas.generic.long=Central tid +-America/Barbados.generic.long=Atlantisk tid +-America/Belem.generic.long=Brasiliansk tid +-America/Belize.generic.long=Central tid +-America/Blanc-Sablon.generic.long=Atlantisk tid +-America/Boa_Vista.generic.long=Amazonas-tid +-America/Bogota.generic.long=Kolombiansk tid +-America/Boise.generic.long=Mountain-tid +-America/Buenos_Aires.generic.long=Argentinsk tid +-America/Cambridge_Bay.generic.long=Mountain-tid +-America/Campo_Grande.generic.long=Amazonas-tid +-America/Cancun.generic.long=Central tid +-America/Caracas.generic.long=Venezuelansk tid +-America/Catamarca.generic.long=Argentinsk tid +-America/Cayenne.generic.long=Franska Guyana-tid +-America/Cayman.generic.long=\u00D6stlig tid +-America/Chicago.generic.long=Central tid +-America/Chihuahua.generic.long=Mountain-tid +-America/Coral_Harbour.generic.long=\u00D6stlig tid +-America/Cordoba.generic.long=Argentinsk tid +-America/Costa_Rica.generic.long=Central tid +-America/Creston.generic.long=Mountain-tid +-America/Cuiaba.generic.long=Amazonas-tid +-America/Curacao.generic.long=Atlantisk tid +-America/Danmarkshavn.generic.long=Greenwichtid +-America/Dawson.generic.long=Stillahavet +-America/Dawson_Creek.generic.long=Mountain-tid +-America/Denver.generic.long=Mountain-tid +-America/Detroit.generic.long=\u00D6stlig tid +-America/Dominica.generic.long=Atlantisk tid +-America/Edmonton.generic.long=Mountain-tid +-America/Eirunepe.generic.long=Acre, normaltid +-America/El_Salvador.generic.long=Central tid +-America/Ensenada.generic.long=Stillahavet +-America/Fort_Wayne.generic.long=\u00D6stlig tid +-America/Fortaleza.generic.long=Brasiliansk tid +-America/Glace_Bay.generic.long=Atlantisk tid +-America/Godthab.generic.long=V\u00E4stgr\u00F6nl\u00E4ndsk tid +-America/Goose_Bay.generic.long=Atlantisk tid +-America/Grand_Turk.generic.long=\u00D6stlig tid +-America/Grenada.generic.long=Atlantisk tid +-America/Guadeloupe.generic.long=Atlantisk tid +-America/Guatemala.generic.long=Central tid +-America/Guayaquil.generic.long=Ecuadoriansk tid +-America/Guyana.generic.long=Guyansk tid +-America/Halifax.generic.long=Atlantisk tid +-America/Havana.generic.long=Kubansk tid +-America/Hermosillo.generic.long=Mountain-tid +-America/Indiana/Indianapolis.generic.long=\u00D6stlig tid +-America/Indiana/Knox.generic.long=Central tid +-America/Indiana/Marengo.generic.long=\u00D6stlig tid +-America/Indiana/Petersburg.generic.long=\u00D6stlig tid +-America/Indiana/Tell_City.generic.long=Central tid +-America/Indiana/Vevay.generic.long=\u00D6stlig tid +-America/Indiana/Vincennes.generic.long=\u00D6stlig tid +-America/Indiana/Winamac.generic.long=\u00D6stlig tid +-America/Indianapolis.generic.long=\u00D6stlig tid +-America/Inuvik.generic.long=Mountain-tid +-America/Iqaluit.generic.long=\u00D6stlig tid +-America/Jamaica.generic.long=\u00D6stlig tid +-America/Jujuy.generic.long=Argentinsk tid +-America/Juneau.generic.long=Alaskisk tid +-America/Kentucky/Louisville.generic.long=\u00D6stlig tid +-America/Kentucky/Monticello.generic.long=\u00D6stlig tid +-America/Knox_IN.generic.long=Central tid +-America/Kralendijk.generic.long=Atlantisk tid +-America/La_Paz.generic.long=Boliviansk tid +-America/Lima.generic.long=Peruansk tid +-America/Los_Angeles.generic.long=Stillahavet +-America/Louisville.generic.long=\u00D6stlig tid +-America/Lower_Princes.generic.long=Atlantisk tid +-America/Maceio.generic.long=Brasiliansk tid +-America/Managua.generic.long=Central tid +-America/Manaus.generic.long=Amazonas-tid +-America/Marigot.generic.long=Atlantisk tid +-America/Martinique.generic.long=Atlantisk tid +-America/Matamoros.generic.long=Central tid +-America/Mazatlan.generic.long=Mountain-tid +-America/Mendoza.generic.long=Argentinsk tid +-America/Menominee.generic.long=Central tid +-America/Merida.generic.long=Central tid +-America/Metlakatla.daylight.long=Metlakatla, sommartid +-America/Metlakatla.generic.long=Metlakatla-tid +-America/Metlakatla.standard.long=Metlakatla, normaltid +-America/Mexico_City.generic.long=Central tid +-America/Miquelon.generic.long=Saint-Pierre och Miquelons tid +-America/Moncton.generic.long=Atlantisk tid +-America/Monterrey.generic.long=Central tid +-America/Montevideo.generic.long=Uruguayansk tid +-America/Montreal.generic.long=\u00D6stlig tid +-America/Montserrat.generic.long=Atlantisk tid +-America/Nassau.generic.long=\u00D6stlig tid +-America/New_York.generic.long=\u00D6stlig tid +-America/Nipigon.generic.long=\u00D6stlig tid +-America/Nome.generic.long=Alaskisk tid +-America/Noronha.generic.long=Fernando de Noronha-tid +-America/North_Dakota/Beulah.generic.long=Central tid +-America/North_Dakota/Center.generic.long=Central tid +-America/North_Dakota/New_Salem.generic.long=Central tid +-America/Ojinaga.generic.long=Mountain-tid +-America/Panama.generic.long=\u00D6stlig tid +-America/Pangnirtung.generic.long=\u00D6stlig tid +-America/Paramaribo.generic.long=Surinamsk tid +-America/Phoenix.generic.long=Mountain-tid +-America/Port-au-Prince.generic.long=\u00D6stlig tid +-America/Port_of_Spain.generic.long=Atlantisk tid +-America/Porto_Acre.generic.long=Acre, normaltid +-America/Porto_Velho.generic.long=Amazonas-tid +-America/Puerto_Rico.generic.long=Atlantisk tid +-America/Rainy_River.generic.long=Central tid +-America/Rankin_Inlet.generic.long=Central tid +-America/Recife.generic.long=Brasiliansk tid +-America/Regina.generic.long=Central tid +-America/Resolute.generic.long=Central tid +-America/Rio_Branco.generic.long=Acre, normaltid +-America/Rosario.generic.long=Argentinsk tid +-America/Santa_Isabel.generic.long=Stillahavet +-America/Santarem.generic.long=Brasiliansk tid +-America/Santiago.generic.long=Chilensk tid +-America/Santo_Domingo.generic.long=Atlantisk tid +-America/Sao_Paulo.generic.long=Brasiliansk tid +-America/Scoresbysund.generic.long=\u00D6stgr\u00F6nl\u00E4ndsk tid +-America/Shiprock.generic.long=Mountain-tid +-America/Sitka.generic.long=Alaskisk tid +-America/St_Barthelemy.generic.long=Atlantisk tid +-America/St_Johns.generic.long=Newfoundl\u00E4ndsk tid +-America/St_Kitts.generic.long=Atlantisk tid +-America/St_Lucia.generic.long=Atlantisk tid +-America/St_Thomas.generic.long=Atlantisk tid +-America/St_Vincent.generic.long=Atlantisk tid +-America/Swift_Current.generic.long=Central tid +-America/Tegucigalpa.generic.long=Central tid +-America/Thule.generic.long=Atlantisk tid +-America/Thunder_Bay.generic.long=\u00D6stlig tid +-America/Tijuana.generic.long=Stillahavet +-America/Toronto.generic.long=\u00D6stlig tid +-America/Tortola.generic.long=Atlantisk tid +-America/Vancouver.generic.long=Stillahavet +-America/Virgin.generic.long=Atlantisk tid +-America/Whitehorse.generic.long=Stillahavet +-America/Winnipeg.generic.long=Central tid +-America/Yakutat.generic.long=Alaskisk tid +-America/Yellowknife.generic.long=Mountain-tid +-Antarctica/Casey.daylight.long=V\u00E4stlig sommartid (Australien) +-Antarctica/Casey.generic.long=V\u00E4stlig tid (Australien) +-Antarctica/Casey.standard.long=Western Standard Time (Australien) +-Antarctica/Davis.generic.long=Davis-tid +-Antarctica/DumontDUrville.generic.long=Dumont-d'Urville-tid +-Antarctica/Macquarie.daylight.long=Macquarie\u00F6n, sommartid +-Antarctica/Macquarie.generic.long=Macquarie\u00F6n, normaltid +-Antarctica/Macquarie.standard.long=Macquarie\u00F6n, normaltid +-Antarctica/Mawson.generic.long=Mawson-tid +-Antarctica/McMurdo.generic.long=Nyzeel\u00E4ndsk tid +-Antarctica/Palmer.generic.long=Chilensk tid +-Antarctica/Rothera.generic.long=Rothera-tid +-Antarctica/South_Pole.generic.long=Nyzeel\u00E4ndsk tid +-Antarctica/Syowa.generic.long=Syowa-tid +-Antarctica/Vostok.generic.long=Vostok-tid +-Arctic/Longyearbyen.generic.long=Centraleuropeisk tid +-Asia/Aden.generic.long=Arabisk tid +-Asia/Almaty.generic.long=Alma-Ata-tid +-Asia/Amman.generic.long=Arabisk tid +-Asia/Anadyr.generic.long=Anadyr-tid +-Asia/Aqtau.generic.long=Aqtau-tid +-Asia/Aqtobe.generic.long=Aqtobe-tid +-Asia/Ashgabat.generic.long=Turkmensk tid +-Asia/Ashkhabad.generic.long=Turkmensk tid +-Asia/Baghdad.generic.long=Arabisk tid +-Asia/Bahrain.generic.long=Arabisk tid +-Asia/Baku.generic.long=Azerbajdzjansk tid +-Asia/Bangkok.generic.long=Indokinesisk tid +-Asia/Beirut.generic.long=\u00D6steuropeisk tid +-Asia/Bishkek.generic.long=Kirgizisk tid +-Asia/Brunei.generic.long=Bruneisk tid +-Asia/Calcutta.generic.long=Indisk tid +-Asia/Choibalsan.generic.long=Choibalsan-tid +-Asia/Chongqing.generic.long=Kinesisk tid +-Asia/Chungking.generic.long=Kinesisk tid +-Asia/Colombo.generic.long=Indisk tid +-Asia/Dacca.generic.long=Bangladeshisk tid +-Asia/Damascus.generic.long=\u00D6steuropeisk tid +-Asia/Dhaka.generic.long=Bangladeshisk tid +-Asia/Dili.generic.long=\u00D6sttimor, normaltid +-Asia/Dubai.generic.long=Golfens tid +-Asia/Dushanbe.generic.long=Tadzjikisk tid +-Asia/Gaza.generic.long=\u00D6steuropeisk tid +-Asia/Harbin.generic.long=Kinesisk tid +-Asia/Hebron.generic.long=\u00D6steuropeisk tid +-Asia/Ho_Chi_Minh.generic.long=Indokinesisk tid +-Asia/Hong_Kong.generic.long=Hongkong-tid +-Asia/Hovd.generic.long=Hovd-tid +-Asia/Irkutsk.generic.long=Irkutsk-tid +-Asia/Istanbul.generic.long=\u00D6steuropeisk tid +-Asia/Jakarta.generic.long=V\u00E4stindonesisk tid +-Asia/Jayapura.generic.long=\u00D6stindonesisk tid +-Asia/Jerusalem.generic.long=Israelisk tid +-Asia/Kabul.generic.long=Afghansk tid +-Asia/Kamchatka.generic.long=Petropavlovsk-Kamtjatskij-tid +-Asia/Karachi.generic.long=Pakistansk tid +-Asia/Kashgar.generic.long=Kinesisk tid +-Asia/Kathmandu.generic.long=Nepalesisk tid +-Asia/Katmandu.generic.long=Nepalesisk tid +-Asia/Khandyga.daylight.long=Khandyga, sommartid +-Asia/Khandyga.generic.long=Khandyga, normaltid +-Asia/Khandyga.standard.long=Khandyga, normaltid +-Asia/Kolkata.generic.long=Indisk tid +-Asia/Krasnoyarsk.generic.long=Krasnojarsk-tid +-Asia/Kuala_Lumpur.generic.long=Malaysisk tid +-Asia/Kuching.generic.long=Malaysisk tid +-Asia/Kuwait.generic.long=Arabisk tid +-Asia/Macao.generic.long=Kinesisk tid +-Asia/Macau.generic.long=Kinesisk tid +-Asia/Magadan.generic.long=Magadan-tid +-Asia/Makassar.generic.long=Centralindonesisk tid +-Asia/Manila.generic.long=Filippinsk tid +-Asia/Muscat.generic.long=Golfens tid +-Asia/Nicosia.generic.long=\u00D6steuropeisk tid +-Asia/Novokuznetsk.generic.long=Sibirisk tid +-Asia/Novosibirsk.generic.long=Sibirisk tid +-Asia/Omsk.generic.long=Omsk-tid +-Asia/Oral.generic.long=Oral-tid +-Asia/Phnom_Penh.generic.long=Indokinesisk tid +-Asia/Pontianak.generic.long=V\u00E4stindonesisk tid +-Asia/Pyongyang.generic.long=Koreansk tid +-Asia/Qatar.generic.long=Arabisk tid +-Asia/Qyzylorda.generic.long=Qyzylorda-tid +-Asia/Rangoon.generic.long=Myanmar-tid +-Asia/Saigon.generic.long=Indokinesisk tid +-Asia/Sakhalin.generic.long=Sakhalin-tid +-Asia/Samarkand.generic.long=Uzbekisk tid +-Asia/Seoul.generic.long=Koreansk tid +-Asia/Shanghai.generic.long=Kinesisk tid +-Asia/Singapore.generic.long=Singapore-tid +-Asia/Taipei.generic.long=Kinesisk tid +-Asia/Tashkent.generic.long=Uzbekisk tid +-Asia/Tbilisi.generic.long=Georgisk tid +-Asia/Tehran.generic.long=Iransk tid +-Asia/Tel_Aviv.generic.long=Israelisk tid +-Asia/Thimbu.generic.long=Bhutanesisk tid +-Asia/Thimphu.generic.long=Bhutanesisk tid +-Asia/Tokyo.generic.long=Japansk tid +-Asia/Ujung_Pandang.generic.long=Centralindonesisk tid +-Asia/Ulaanbaatar.generic.long=Ulaanbaatar-tid +-Asia/Ulan_Bator.generic.long=Ulaanbaatar-tid +-Asia/Urumqi.generic.long=Kinesisk tid +-Asia/Ust-Nera.daylight.long=Ust-Nera, sommartid +-Asia/Ust-Nera.generic.long=Ust-Nera, normaltid +-Asia/Ust-Nera.standard.long=Ust-Nera, normaltid +-Asia/Vientiane.generic.long=Indokinesisk tid +-Asia/Vladivostok.generic.long=Vladivostok-tid +-Asia/Yakutsk.generic.long=Jakutsk-tid +-Asia/Yekaterinburg.generic.long=Jekaterinburg-tid +-Asia/Yerevan.generic.long=Armenisk tid +-Atlantic/Azores.generic.long=Azorerna-tid +-Atlantic/Bermuda.generic.long=Atlantisk tid +-Atlantic/Canary.generic.long=V\u00E4steuropeisk tid +-Atlantic/Cape_Verde.generic.long=Kap Verde-tid +-Atlantic/Faeroe.generic.long=V\u00E4steuropeisk tid +-Atlantic/Faroe.generic.long=V\u00E4steuropeisk tid +-Atlantic/Jan_Mayen.generic.long=Centraleuropeisk tid +-Atlantic/Madeira.generic.long=V\u00E4steuropeisk tid +-Atlantic/Reykjavik.generic.long=Greenwichtid +-Atlantic/South_Georgia.generic.long=Sydgeorgisk tid +-Atlantic/St_Helena.generic.long=Greenwichtid +-Atlantic/Stanley.generic.long=Falklands\u00F6arna-tid +-Australia/ACT.daylight.long=\u00D6stlig sommartid (New South Wales) +-Australia/ACT.generic.long=\u00D6stlig tid (New South Wales) +-Australia/ACT.standard.long=\u00D6stlig standardtid (New South Wales) +-Australia/Adelaide.daylight.long=Central sommartid (South Australia) +-Australia/Adelaide.generic.long=Central tid (Sydaustralien) +-Australia/Adelaide.standard.long=Central standardtid (Sydaustralien) +-Australia/Brisbane.daylight.long=\u00D6stlig sommartid (Queensland) +-Australia/Brisbane.generic.long=\u00D6stlig tid (Queensland) +-Australia/Brisbane.standard.long=\u00D6stlig standardtid (Queensland) +-Australia/Broken_Hill.daylight.long=Central sommartid (South Australia/New South Wales) +-Australia/Broken_Hill.generic.long=Central tid (Sydaustralien/New South Wales) +-Australia/Broken_Hill.standard.long=Central standardtid (Sydaustralien/New South Wales) +-Australia/Canberra.daylight.long=\u00D6stlig sommartid (New South Wales) +-Australia/Canberra.generic.long=\u00D6stlig tid (New South Wales) +-Australia/Canberra.standard.long=\u00D6stlig standardtid (New South Wales) +-Australia/Currie.daylight.long=\u00D6stlig sommartid (New South Wales) +-Australia/Currie.generic.long=\u00D6stlig tid (New South Wales) +-Australia/Currie.standard.long=\u00D6stlig standardtid (New South Wales) +-Australia/Darwin.daylight.long=Central sommartid (Nordterritoriet) +-Australia/Darwin.generic.long=Central tid (Nordterritoriet) +-Australia/Darwin.standard.long=Central standardtid (Nordterritoriet) +-Australia/Eucla.daylight.long=Central v\u00E4stlig sommartid (Australien) +-Australia/Eucla.generic.long=Central v\u00E4stlig tid (Australien) +-Australia/Eucla.standard.long=Central v\u00E4stlig normaltid (Australien) +-Australia/Hobart.daylight.long=\u00D6stlig sommartid (Tasmanien) +-Australia/Hobart.generic.long=\u00D6stlig tid (Tasmania) +-Australia/Hobart.standard.long=\u00D6stlig standardtid (Tasmania) +-Australia/LHI.generic.long=Lord Howe-tid +-Australia/Lindeman.daylight.long=\u00D6stlig sommartid (Queensland) +-Australia/Lindeman.generic.long=\u00D6stlig tid (Queensland) +-Australia/Lindeman.standard.long=\u00D6stlig standardtid (Queensland) +-Australia/Lord_Howe.generic.long=Lord Howe-tid +-Australia/Melbourne.daylight.long=\u00D6stlig sommartid (Victoria) +-Australia/Melbourne.generic.long=\u00D6stlig tid (Victoria) +-Australia/Melbourne.standard.long=\u00D6stlig standardtid (Victoria) +-Australia/NSW.daylight.long=\u00D6stlig sommartid (New South Wales) +-Australia/NSW.generic.long=\u00D6stlig tid (New South Wales) +-Australia/NSW.standard.long=\u00D6stlig standardtid (New South Wales) +-Australia/North.daylight.long=Central sommartid (Nordterritoriet) +-Australia/North.generic.long=Central tid (Nordterritoriet) +-Australia/North.standard.long=Central standardtid (Nordterritoriet) +-Australia/Perth.daylight.long=V\u00E4stlig sommartid (Australien) +-Australia/Perth.generic.long=V\u00E4stlig tid (Australien) +-Australia/Perth.standard.long=Western Standard Time (Australien) +-Australia/Queensland.daylight.long=\u00D6stlig sommartid (Queensland) +-Australia/Queensland.generic.long=\u00D6stlig tid (Queensland) +-Australia/Queensland.standard.long=\u00D6stlig standardtid (Queensland) +-Australia/South.daylight.long=Central sommartid (South Australia) +-Australia/South.generic.long=Central tid (Sydaustralien) +-Australia/South.standard.long=Central standardtid (Sydaustralien) +-Australia/Sydney.daylight.long=\u00D6stlig sommartid (New South Wales) +-Australia/Sydney.generic.long=\u00D6stlig tid (New South Wales) +-Australia/Sydney.standard.long=\u00D6stlig standardtid (New South Wales) +-Australia/Tasmania.daylight.long=\u00D6stlig sommartid (Tasmanien) +-Australia/Tasmania.generic.long=\u00D6stlig tid (Tasmania) +-Australia/Tasmania.standard.long=\u00D6stlig standardtid (Tasmania) +-Australia/Victoria.daylight.long=\u00D6stlig sommartid (Victoria) +-Australia/Victoria.generic.long=\u00D6stlig tid (Victoria) +-Australia/Victoria.standard.long=\u00D6stlig standardtid (Victoria) +-Australia/West.daylight.long=V\u00E4stlig sommartid (Australien) +-Australia/West.generic.long=V\u00E4stlig tid (Australien) +-Australia/West.standard.long=Western Standard Time (Australien) +-Australia/Yancowinna.daylight.long=Central sommartid (South Australia/New South Wales) +-Australia/Yancowinna.generic.long=Central tid (Sydaustralien/New South Wales) +-Australia/Yancowinna.standard.long=Central standardtid (Sydaustralien/New South Wales) +-BET.generic.long=Brasiliansk tid +-BST.generic.long=Bangladeshisk tid +-Brazil/Acre.generic.long=Acre, normaltid +-Brazil/DeNoronha.generic.long=Fernando de Noronha-tid +-Brazil/East.generic.long=Brasiliansk tid +-Brazil/West.generic.long=Amazonas-tid +-CAT.generic.long=Centralafrikansk tid +-CET.generic.long=Centraleuropeisk tid +-CNT.generic.long=Newfoundl\u00E4ndsk tid +-CST.generic.long=Central tid +-CST6CDT.generic.long=Central tid +-CTT.generic.long=Kinesisk tid +-Canada/Atlantic.generic.long=Atlantisk tid +-Canada/Central.generic.long=Central tid +-Canada/East-Saskatchewan.generic.long=Central tid +-Canada/Eastern.generic.long=\u00D6stlig tid +-Canada/Mountain.generic.long=Mountain-tid +-Canada/Newfoundland.generic.long=Newfoundl\u00E4ndsk tid +-Canada/Pacific.generic.long=Stillahavet +-Canada/Saskatchewan.generic.long=Central tid +-Canada/Yukon.generic.long=Stillahavet +-Chile/Continental.generic.long=Chilensk tid +-Chile/EasterIsland.generic.long=P\u00E5sk\u00F6n-tid +-Cuba.generic.long=Kubansk tid +-EAT.generic.long=\u00D6stafrikansk tid +-ECT.generic.long=Centraleuropeisk tid +-EET.generic.long=\u00d6steuropeisk tid +-EST.generic.long=\u00d6stlig tid +-EST5EDT.generic.long=\u00d6stlig tid +-Egypt.generic.long=\u00D6steuropeisk tid +-Eire.generic.long=Irl\u00E4ndsk tid +-Etc/Greenwich.generic.long=Greenwichtid +-Etc/UCT.generic.long=UTC (koordinerad v\u00E4rldstid) +-Etc/UTC.generic.long=UTC (koordinerad v\u00E4rldstid) +-Etc/Universal.generic.long=UTC (koordinerad v\u00E4rldstid) +-Etc/Zulu.generic.long=UTC (koordinerad v\u00E4rldstid) +-Europe/Amsterdam.generic.long=Centraleuropeisk tid +-Europe/Andorra.generic.long=Centraleuropeisk tid +-Europe/Athens.generic.long=\u00D6steuropeisk tid +-Europe/Belfast.generic.long=Brittisk tid +-Europe/Belgrade.generic.long=Centraleuropeisk tid +-Europe/Berlin.generic.long=Centraleuropeisk tid +-Europe/Bratislava.generic.long=Centraleuropeisk tid +-Europe/Brussels.generic.long=Centraleuropeisk tid +-Europe/Bucharest.generic.long=\u00D6steuropeisk tid +-Europe/Budapest.generic.long=Centraleuropeisk tid +-Europe/Busingen.generic.long=Centraleuropeisk tid +-Europe/Chisinau.generic.long=\u00D6steuropeisk tid +-Europe/Copenhagen.generic.long=Centraleuropeisk tid +-Europe/Dublin.generic.long=Irl\u00E4ndsk tid +-Europe/Gibraltar.generic.long=Centraleuropeisk tid +-Europe/Guernsey.generic.long=Brittisk tid +-Europe/Helsinki.generic.long=\u00D6steuropeisk tid +-Europe/Isle_of_Man.generic.long=Brittisk tid +-Europe/Istanbul.generic.long=\u00D6steuropeisk tid +-Europe/Jersey.generic.long=Brittisk tid +-Europe/Kaliningrad.daylight.long=\u00D6steuropeisk sommartid +-Europe/Kaliningrad.generic.long=Kaliningradtid +-Europe/Kaliningrad.standard.long=Kaliningradtid +-Europe/Kiev.generic.long=\u00D6steuropeisk tid +-Europe/Lisbon.generic.long=V\u00E4steuropeisk tid +-Europe/Ljubljana.generic.long=Centraleuropeisk tid +-Europe/London.generic.long=Brittisk tid +-Europe/Luxembourg.generic.long=Centraleuropeisk tid +-Europe/Madrid.generic.long=Centraleuropeisk tid +-Europe/Malta.generic.long=Centraleuropeisk tid +-Europe/Mariehamn.generic.long=\u00D6steuropeisk tid +-Europe/Minsk.daylight.long=\u00D6steuropeisk sommartid +-Europe/Minsk.generic.long=Kaliningradtid +-Europe/Minsk.standard.long=Kaliningradtid +-Europe/Monaco.generic.long=Centraleuropeisk tid +-Europe/Moscow.generic.long=Moskvas tid +-Europe/Nicosia.generic.long=\u00D6steuropeisk tid +-Europe/Oslo.generic.long=Centraleuropeisk tid +-Europe/Paris.generic.long=Centraleuropeisk tid +-Europe/Podgorica.generic.long=Centraleuropeisk tid +-Europe/Prague.generic.long=Centraleuropeisk tid +-Europe/Riga.generic.long=\u00D6steuropeisk tid +-Europe/Rome.generic.long=Centraleuropeisk tid +-Europe/Samara.generic.long=Samara-tid +-Europe/San_Marino.generic.long=Centraleuropeisk tid +-Europe/Sarajevo.generic.long=Centraleuropeisk tid +-Europe/Simferopol.generic.long=\u00D6steuropeisk tid +-Europe/Skopje.generic.long=Centraleuropeisk tid +-Europe/Sofia.generic.long=\u00D6steuropeisk tid +-Europe/Stockholm.generic.long=Centraleuropeisk tid +-Europe/Tallinn.generic.long=\u00D6steuropeisk tid +-Europe/Tirane.generic.long=Centraleuropeisk tid +-Europe/Tiraspol.generic.long=\u00D6steuropeisk tid +-Europe/Uzhgorod.generic.long=\u00D6steuropeisk tid +-Europe/Vaduz.generic.long=Centraleuropeisk tid +-Europe/Vatican.generic.long=Centraleuropeisk tid +-Europe/Vienna.generic.long=Centraleuropeisk tid +-Europe/Vilnius.generic.long=\u00D6steuropeisk tid +-Europe/Volgograd.generic.long=Volgograd, normaltid +-Europe/Warsaw.generic.long=Centraleuropeisk tid +-Europe/Zagreb.generic.long=Centraleuropeisk tid +-Europe/Zaporozhye.generic.long=\u00D6steuropeisk tid +-Europe/Zurich.generic.long=Centraleuropeisk tid +-GB-Eire.generic.long=Brittisk tid +-GB.generic.long=Brittisk tid +-GMT.generic.long=Greenwichtid +-Greenwich.generic.long=Greenwichtid +-HST.generic.long=Hawaiiansk tid +-Hongkong.generic.long=Hongkong-tid +-IET.generic.long=\u00D6stlig tid +-IST.generic.long=Indisk tid +-Iceland.generic.long=Greenwichtid +-Indian/Antananarivo.generic.long=\u00D6stafrikansk tid +-Indian/Chagos.generic.long=Indiska Ocean\u00F6arna-tid +-Indian/Christmas.generic.long=Jul\u00F6n-tid +-Indian/Cocos.generic.long=Kokos\u00F6arna-tid +-Indian/Comoro.generic.long=\u00D6stafrikansk tid +-Indian/Kerguelen.generic.long=Franska s\u00F6dra och antarktiska \u00F6arna-tid +-Indian/Mahe.generic.long=Seychellisk tid +-Indian/Maldives.generic.long=Maldivisk tid +-Indian/Mauritius.generic.long=Mauritiansk tid +-Indian/Mayotte.generic.long=\u00D6stafrikansk tid +-Indian/Reunion.generic.long=Reunion-tid +-Iran.generic.long=Iransk tid +-Israel.generic.long=Israelisk tid +-JST.generic.long=Japansk tid +-Jamaica.generic.long=\u00D6stlig tid +-Japan.generic.long=Japansk tid +-Kwajalein.generic.long=Marshall\u00F6arna-tid +-Libya.generic.long=\u00d6steuropeisk tid +-MET.generic.long=MET +-MIT.generic.long=V\u00E4stsamoansk tid +-MST.generic.long=Mountain-tid +-MST7MDT.generic.long=Mountain-tid +-Mexico/BajaNorte.generic.long=Stillahavet +-Mexico/BajaSur.generic.long=Mountain-tid +-Mexico/General.generic.long=Central tid +-NET.generic.long=Armenisk tid +-NST.generic.long=Nyzeel\u00E4ndsk tid +-NZ-CHAT.generic.long=Chathams tid +-NZ.generic.long=Nyzeel\u00E4ndsk tid +-Navajo.generic.long=Mountain-tid +-PLT.generic.long=Pakistansk tid +-PNT.generic.long=Mountain-tid +-PRC.generic.long=Kinesisk tid +-PRT.generic.long=Atlantisk tid +-PST.generic.long=Stillahavet +-PST8PDT.generic.long=Stillahavet +-Pacific/Apia.generic.long=V\u00E4stsamoansk tid +-Pacific/Auckland.generic.long=Nyzeel\u00E4ndsk tid +-Pacific/Chatham.generic.long=Chathams tid +-Pacific/Chuuk.daylight.long=Chuuk, sommartid +-Pacific/Chuuk.generic.long=Chuuk, normaltid +-Pacific/Chuuk.standard.long=Chuuk, normaltid +-Pacific/Easter.generic.long=P\u00E5sk\u00F6n-tid +-Pacific/Efate.generic.long=Vanuatu-tid +-Pacific/Enderbury.generic.long=Phoenix\u00F6arna-tid +-Pacific/Fakaofo.generic.long=Tokelau-tid +-Pacific/Fiji.generic.long=Fijiansk tid +-Pacific/Funafuti.generic.long=Tuvalu-tid +-Pacific/Galapagos.generic.long=Galapagos-tid +-Pacific/Gambier.generic.long=Gambier\u00F6arna-tid +-Pacific/Guadalcanal.generic.long=Salomon\u00F6arna-tid +-Pacific/Guam.generic.long=Chamorros tid +-Pacific/Honolulu.generic.long=Hawaiiansk tid +-Pacific/Johnston.generic.long=Hawaiiansk tid +-Pacific/Kiritimati.generic.long=Line Islands-tid +-Pacific/Kosrae.generic.long=Kosrae-tid +-Pacific/Kwajalein.generic.long=Marshall\u00F6arna-tid +-Pacific/Majuro.generic.long=Marshall\u00F6arna-tid +-Pacific/Marquesas.generic.long=Marquesas\u00F6arna-tid +-Pacific/Midway.generic.long=Samoansk tid +-Pacific/Nauru.generic.long=Nauruansk tid +-Pacific/Niue.generic.long=Niue-tid +-Pacific/Norfolk.generic.long=Norfolk-tid +-Pacific/Noumea.generic.long=Nya Kaledonien-tid +-Pacific/Pago_Pago.generic.long=Samoansk tid +-Pacific/Palau.generic.long=Palau-tid +-Pacific/Pitcairn.generic.long=Pitcairn-tid +-Pacific/Pohnpei.daylight.long=Pohnpei, sommartid +-Pacific/Pohnpei.generic.long=Ponape-tid +-Pacific/Pohnpei.standard.long=Pohnpei, normaltid +-Pacific/Ponape.daylight.long=Pohnpei, sommartid +-Pacific/Ponape.generic.long=Ponape-tid +-Pacific/Ponape.standard.long=Pohnpei, normaltid +-Pacific/Port_Moresby.generic.long=Papua Nya Guinea-tid +-Pacific/Rarotonga.generic.long=Cook\u00F6arna-tid +-Pacific/Saipan.generic.long=Chamorros tid +-Pacific/Samoa.generic.long=Samoansk tid +-Pacific/Tahiti.generic.long=Tahiti-tid +-Pacific/Tarawa.generic.long=Gilbert\u00F6arna-tid +-Pacific/Tongatapu.generic.long=Tonga-tid +-Pacific/Truk.daylight.long=Chuuk, sommartid +-Pacific/Truk.generic.long=Chuuk, normaltid +-Pacific/Truk.standard.long=Chuuk, normaltid +-Pacific/Wake.generic.long=Wake-tid +-Pacific/Wallis.generic.long=Wallis- och Futuna\u00F6arna-tid +-Pacific/Yap.daylight.long=Chuuk, sommartid +-Pacific/Yap.generic.long=Chuuk, normaltid +-Pacific/Yap.standard.long=Chuuk, normaltid +-Poland.generic.long=Centraleuropeisk tid +-Portugal.generic.long=V\u00E4steuropeisk tid +-ROK.generic.long=Koreansk tid +-SST.generic.long=Salomon\u00F6arna-tid +-Singapore.generic.long=Singapore-tid +-SystemV/AST4.generic.long=Atlantisk tid +-SystemV/AST4ADT.generic.long=Atlantisk tid +-SystemV/CST6.generic.long=Central tid +-SystemV/CST6CDT.generic.long=Central tid +-SystemV/EST5.generic.long=\u00D6stlig tid +-SystemV/EST5EDT.generic.long=\u00D6stlig tid +-SystemV/HST10.generic.long=Hawaiiansk tid +-SystemV/MST7.generic.long=Mountain-tid +-SystemV/MST7MDT.generic.long=Mountain-tid +-SystemV/PST8.generic.long=Stillahavet +-SystemV/PST8PDT.generic.long=Stillahavet +-SystemV/YST9.generic.long=Alaskisk tid +-SystemV/YST9YDT.generic.long=Alaskisk tid +-Turkey.generic.long=\u00D6steuropeisk tid +-UCT.generic.long=UTC (koordinerad v\u00E4rldstid) +-US/Alaska.generic.long=Alaskisk tid +-US/Aleutian.generic.long=Hawaiiansk-aleutisk tid +-US/Arizona.generic.long=Mountain-tid +-US/Central.generic.long=Central tid +-US/East-Indiana.generic.long=\u00D6stlig tid +-US/Eastern.generic.long=\u00D6stlig tid +-US/Hawaii.generic.long=Hawaiiansk tid +-US/Indiana-Starke.generic.long=Central tid +-US/Michigan.generic.long=\u00D6stlig tid +-US/Mountain.generic.long=Mountain-tid +-US/Pacific-New.generic.long=Stillahavet +-US/Pacific.generic.long=Stillahavet +-US/Samoa.generic.long=Samoansk tid +-UTC.generic.long=UTC (koordinerad v\u00E4rldstid) +-Universal.generic.long=UTC (koordinerad v\u00E4rldstid) +-VST.generic.long=Indokinesisk tid +-W-SU.generic.long=Moskvas tid +-WET.generic.long=V\u00e4steuropeisk tid +-Zulu.generic.long=UTC (koordinerad v\u00E4rldstid) +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_sv_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_sv_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_zh_CN.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_zh_CN.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5317\u9886\u5730) +-ACT.generic.long=\u4E2D\u90E8\u65F6\u95F4 (\u5317\u90E8\u5730\u533A) +-ACT.standard.long=\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5317\u9886\u5730) +-AET.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u65B0\u5357\u5A01\u5C14\u65AF) +-AET.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-AET.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-AGT.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-ART.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-AST.generic.long=\u963F\u62C9\u65AF\u52A0\u65F6\u95F4 +-Africa/Abidjan.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Accra.generic.long=\u52A0\u7EB3\u65F6\u95F4 +-Africa/Addis_Ababa.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Algiers.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Africa/Asmara.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Asmera.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Bamako.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Bangui.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Banjul.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Bissau.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Blantyre.generic.long=\u4E2D\u975E\u65F6\u95F4 +-Africa/Brazzaville.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Bujumbura.generic.long=\u4E2D\u975E\u65F6\u95F4 +-Africa/Cairo.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Africa/Casablanca.generic.long=\u897F\u6B27\u65F6\u95F4 +-Africa/Ceuta.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Africa/Conakry.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Dakar.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Dar_es_Salaam.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Djibouti.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Douala.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/El_Aaiun.generic.long=\u897F\u6B27\u65F6\u95F4 +-Africa/Freetown.generic.long=\u585E\u62C9\u91CC\u6602\u65F6\u95F4 +-Africa/Gaborone.generic.long=\u4E2D\u975E\u65F6\u95F4 +-Africa/Harare.generic.long=\u4E2D\u975E\u65F6\u95F4 +-Africa/Johannesburg.generic.long=\u5357\u975E\u65F6\u95F4 +-Africa/Juba.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Kampala.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Khartoum.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Kigali.generic.long=\u4E2D\u975E\u65F6\u95F4 +-Africa/Kinshasa.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Lagos.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Libreville.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Lome.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Luanda.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Lubumbashi.generic.long=\u4E2D\u975E\u65F6\u95F4 +-Africa/Lusaka.generic.long=\u4E2D\u975E\u65F6\u95F4 +-Africa/Malabo.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Maputo.generic.long=\u4E2D\u975E\u65F6\u95F4 +-Africa/Maseru.generic.long=\u5357\u975E\u65F6\u95F4 +-Africa/Mbabane.generic.long=\u5357\u975E\u65F6\u95F4 +-Africa/Mogadishu.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Monrovia.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Nairobi.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Africa/Ndjamena.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Niamey.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Nouakchott.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Ouagadougou.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Porto-Novo.generic.long=\u897F\u975E\u65F6\u95F4 +-Africa/Sao_Tome.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Timbuktu.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Africa/Tripoli.generic.long=\u4e1c\u6b27\u65f6\u95f4 +-Africa/Tunis.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Africa/Windhoek.generic.long=\u897F\u975E\u65F6\u95F4 +-America/Adak.generic.long=\u590F\u5A01\u5937-\u963F\u7559\u7533\u65F6\u95F4 +-America/Anchorage.generic.long=\u963F\u62C9\u65AF\u52A0\u65F6\u95F4 +-America/Anguilla.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Antigua.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Araguaina.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-America/Argentina/Buenos_Aires.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/Catamarca.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/ComodRivadavia.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/Cordoba.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/Jujuy.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/La_Rioja.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/Mendoza.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/Rio_Gallegos.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/Salta.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/San_Juan.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/San_Luis.generic.long=\u963f\u6839\u5ef7\u65f6\u95f4 +-America/Argentina/Tucuman.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Argentina/Ushuaia.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Aruba.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Asuncion.generic.long=\u5DF4\u62C9\u572D\u65F6\u95F4 +-America/Atikokan.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Atka.generic.long=\u590F\u5A01\u5937-\u963F\u7559\u7533\u65F6\u95F4 +-America/Bahia.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-America/Bahia_Banderas.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Barbados.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Belem.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-America/Belize.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Blanc-Sablon.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Boa_Vista.generic.long=\u4E9A\u9A6C\u900A\u65F6\u95F4 +-America/Bogota.generic.long=\u54E5\u4F26\u6BD4\u4E9A\u65F6\u95F4 +-America/Boise.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Buenos_Aires.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Cambridge_Bay.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Campo_Grande.generic.long=\u4E9A\u9A6C\u900A\u65F6\u95F4 +-America/Cancun.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Caracas.generic.long=\u59D4\u5185\u745E\u62C9\u65F6\u95F4 +-America/Catamarca.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Cayenne.generic.long=\u6CD5\u5C5E\u572D\u4E9A\u90A3\u65F6\u95F4 +-America/Cayman.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Chicago.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Chihuahua.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Coral_Harbour.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Cordoba.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Costa_Rica.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Creston.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Cuiaba.generic.long=\u4E9A\u9A6C\u900A\u65F6\u95F4 +-America/Curacao.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Danmarkshavn.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-America/Dawson.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-America/Dawson_Creek.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Denver.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Detroit.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Dominica.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Edmonton.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Eirunepe.generic.long=Acre \u65f6\u95f4 +-America/El_Salvador.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Ensenada.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-America/Fort_Wayne.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Fortaleza.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-America/Glace_Bay.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Godthab.generic.long=\u897F\u683C\u6797\u5170\u5C9B\u65F6\u95F4 +-America/Goose_Bay.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Grand_Turk.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Grenada.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Guadeloupe.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Guatemala.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Guayaquil.generic.long=\u5384\u74DC\u591A\u5C14\u65F6\u95F4 +-America/Guyana.generic.long=\u572D\u4E9A\u90A3\u65F6\u95F4 +-America/Halifax.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Havana.generic.long=\u53E4\u5DF4\u65F6\u95F4 +-America/Hermosillo.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Indiana/Indianapolis.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Indiana/Knox.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Indiana/Marengo.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Indiana/Petersburg.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Indiana/Tell_City.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Indiana/Vevay.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Indiana/Vincennes.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Indiana/Winamac.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Indianapolis.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Inuvik.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Iqaluit.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Jamaica.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Jujuy.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Juneau.generic.long=\u963F\u62C9\u65AF\u52A0\u65F6\u95F4 +-America/Kentucky/Louisville.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Kentucky/Monticello.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Knox_IN.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Kralendijk.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/La_Paz.generic.long=\u73BB\u5229\u7EF4\u4E9A\u65F6\u95F4 +-America/Lima.generic.long=\u79D8\u9C81\u65F6\u95F4 +-America/Los_Angeles.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-America/Louisville.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Lower_Princes.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Maceio.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-America/Managua.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Manaus.generic.long=\u4E9A\u9A6C\u900A\u65F6\u95F4 +-America/Marigot.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Martinique.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Matamoros.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Mazatlan.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Mendoza.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Menominee.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Merida.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Metlakatla.daylight.long=\u6885\u7279\u62C9\u5361\u7279\u62C9\u590F\u4EE4\u65F6 +-America/Metlakatla.generic.long=\u6885\u7279\u62C9\u5361\u7279\u62C9\u65F6\u95F4 +-America/Metlakatla.standard.long=\u6885\u7279\u62C9\u5361\u7279\u62C9\u6807\u51C6\u65F6\u95F4 +-America/Mexico_City.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Miquelon.generic.long=\u76AE\u57C3\u5C14\u548C\u5BC6\u514B\u9686\u5C9B\u65F6\u95F4 +-America/Moncton.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Monterrey.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Montevideo.generic.long=\u4E4C\u62C9\u572D\u65F6\u95F4 +-America/Montreal.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Montserrat.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Nassau.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/New_York.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Nipigon.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Nome.generic.long=\u963F\u62C9\u65AF\u52A0\u65F6\u95F4 +-America/Noronha.generic.long=\u8D39\u5C14\u5357\u591A\u5FB7\u8BFA\u7F57\u5C3C\u4E9A\u65F6\u95F4 +-America/North_Dakota/Beulah.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/North_Dakota/Center.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/North_Dakota/New_Salem.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Ojinaga.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Panama.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Pangnirtung.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Paramaribo.generic.long=\u82CF\u5229\u5357\u65F6\u95F4 +-America/Phoenix.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Port-au-Prince.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Port_of_Spain.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Porto_Acre.generic.long=Acre \u65f6\u95f4 +-America/Porto_Velho.generic.long=\u4E9A\u9A6C\u900A\u65F6\u95F4 +-America/Puerto_Rico.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Rainy_River.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Rankin_Inlet.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Recife.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-America/Regina.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Resolute.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Rio_Branco.generic.long=Acre \u65f6\u95f4 +-America/Rosario.generic.long=\u963F\u6839\u5EF7\u65F6\u95F4 +-America/Santa_Isabel.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-America/Santarem.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-America/Santiago.generic.long=\u667A\u5229\u65F6\u95F4 +-America/Santo_Domingo.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Sao_Paulo.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-America/Scoresbysund.generic.long=\u4E1C\u683C\u6797\u5C9B\u65F6\u95F4 +-America/Shiprock.generic.long=\u5C71\u5730\u65F6\u95F4 +-America/Sitka.generic.long=\u963F\u62C9\u65AF\u52A0\u65F6\u95F4 +-America/St_Barthelemy.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/St_Johns.generic.long=\u7EBD\u82AC\u5170\u65F6\u95F4 +-America/St_Kitts.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/St_Lucia.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/St_Thomas.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/St_Vincent.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Swift_Current.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Tegucigalpa.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Thule.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Thunder_Bay.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Tijuana.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-America/Toronto.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-America/Tortola.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Vancouver.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-America/Virgin.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-America/Whitehorse.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-America/Winnipeg.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-America/Yakutat.generic.long=\u963F\u62C9\u65AF\u52A0\u65F6\u95F4 +-America/Yellowknife.generic.long=\u5C71\u5730\u65F6\u95F4 +-Antarctica/Casey.daylight.long=\u897F\u90E8\u590F\u4EE4\u65F6 (\u6FB3\u5927\u5229\u4E9A) +-Antarctica/Casey.generic.long=\u897F\u90E8\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A) +-Antarctica/Casey.standard.long=\u897F\u90E8\u6807\u51C6\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A) +-Antarctica/Davis.generic.long=\u6234\u7EF4\u65AF\u65F6\u95F4 +-Antarctica/DumontDUrville.generic.long=Dumont-d'Urville \u65F6\u95F4 +-Antarctica/Macquarie.daylight.long=\u9EA6\u5938\u91CC\u5C9B\u590F\u4EE4\u65F6 +-Antarctica/Macquarie.generic.long=\u9EA6\u5938\u91CC\u5C9B\u65F6\u95F4 +-Antarctica/Macquarie.standard.long=\u9EA6\u5938\u91CC\u5C9B\u65F6\u95F4 +-Antarctica/Mawson.generic.long=\u83AB\u68EE\u65F6\u95F4 +-Antarctica/McMurdo.generic.long=\u65B0\u897F\u5170\u65F6\u95F4 +-Antarctica/Palmer.generic.long=\u667A\u5229\u65F6\u95F4 +-Antarctica/Rothera.generic.long=\u7F57\u745F\u62C9\u65F6\u95F4 +-Antarctica/South_Pole.generic.long=\u65B0\u897F\u5170\u65F6\u95F4 +-Antarctica/Syowa.generic.long=Syowa \u65F6\u95F4 +-Antarctica/Vostok.generic.long=\u83AB\u65AF\u6258\u514B\u65F6\u95F4 +-Arctic/Longyearbyen.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Asia/Aden.generic.long=\u963F\u62C9\u4F2F\u534A\u5C9B\u65F6\u95F4 +-Asia/Almaty.generic.long=Alma-Ata \u65F6\u95F4 +-Asia/Amman.generic.long=\u963f\u62c9\u4f2f\u534a\u5c9b\u65f6\u95f4 +-Asia/Anadyr.generic.long=\u963F\u90A3\u5E95\u6CB3\u65F6\u95F4 +-Asia/Aqtau.generic.long=Aqtau \u65F6\u95F4 +-Asia/Aqtobe.generic.long=Aqtobe \u65F6\u95F4 +-Asia/Ashgabat.generic.long=\u571F\u5E93\u66FC\u65F6\u95F4 +-Asia/Ashkhabad.generic.long=\u571F\u5E93\u66FC\u65F6\u95F4 +-Asia/Baghdad.generic.long=\u963F\u62C9\u4F2F\u534A\u5C9B\u65F6\u95F4 +-Asia/Bahrain.generic.long=\u963F\u62C9\u4F2F\u534A\u5C9B\u65F6\u95F4 +-Asia/Baku.generic.long=\u4E9A\u585E\u62DC\u7136\u65F6\u95F4 +-Asia/Bangkok.generic.long=\u5370\u5EA6\u652F\u90A3\u65F6\u95F4 +-Asia/Beirut.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Asia/Bishkek.generic.long=\u5409\u5C14\u5409\u65AF\u65AF\u5766\u65F6\u95F4 +-Asia/Brunei.generic.long=\u6587\u83B1\u65F6\u95F4 +-Asia/Calcutta.generic.long=\u5370\u5EA6\u65F6\u95F4 +-Asia/Choibalsan.generic.long=Choibalsan \u65F6\u95F4 +-Asia/Chongqing.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Asia/Chungking.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Asia/Colombo.generic.long=\u5370\u5EA6\u65F6\u95F4 +-Asia/Dacca.generic.long=\u5B5F\u52A0\u62C9\u65F6\u95F4 +-Asia/Damascus.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Asia/Dhaka.generic.long=\u5B5F\u52A0\u62C9\u65F6\u95F4 +-Asia/Dili.generic.long=\u4E1C\u5E1D\u6C76\u65F6\u95F4 +-Asia/Dubai.generic.long=\u6D77\u6E7E\u65F6\u95F4 +-Asia/Dushanbe.generic.long=\u5854\u5409\u514B\u65AF\u5766\u65F6\u95F4 +-Asia/Gaza.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Asia/Harbin.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Asia/Hebron.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Asia/Ho_Chi_Minh.generic.long=\u5370\u5EA6\u652F\u90A3\u65F6\u95F4 +-Asia/Hong_Kong.generic.long=\u9999\u6E2F\u65F6\u95F4 +-Asia/Hovd.generic.long=\u79D1\u5E03\u591A\u65F6\u95F4 +-Asia/Irkutsk.generic.long=\u4F0A\u5C14\u5E93\u6B21\u514B\u65F6\u95F4 +-Asia/Istanbul.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Asia/Jakarta.generic.long=\u897F\u5370\u5EA6\u5C3C\u897F\u4E9A\u65F6\u95F4 +-Asia/Jayapura.generic.long=\u4E1C\u5370\u5EA6\u5C3C\u897F\u4E9A\u65F6\u95F4 +-Asia/Jerusalem.generic.long=\u4EE5\u8272\u5217\u65F6\u95F4 +-Asia/Kabul.generic.long=\u963F\u5BCC\u6C57\u65F6\u95F4 +-Asia/Kamchatka.generic.long=\u5F7C\u5F97\u7F57\u5DF4\u752B\u6D1B\u592B\u65AF\u514B\u65F6\u95F4 +-Asia/Karachi.generic.long=\u5DF4\u57FA\u65AF\u5766\u65F6\u95F4 +-Asia/Kashgar.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Asia/Kathmandu.generic.long=\u5C3C\u6CCA\u5C14\u65F6\u95F4 +-Asia/Katmandu.generic.long=\u5C3C\u6CCA\u5C14\u65F6\u95F4 +-Asia/Khandyga.daylight.long=\u6C49\u5FB7\u52A0\u590F\u4EE4\u65F6 +-Asia/Khandyga.generic.long=\u6C49\u5FB7\u52A0\u65F6\u95F4 +-Asia/Khandyga.standard.long=\u6C49\u5FB7\u52A0\u65F6\u95F4 +-Asia/Kolkata.generic.long=\u5370\u5EA6\u65F6\u95F4 +-Asia/Krasnoyarsk.generic.long=\u514B\u62C9\u65AF\u8BFA\u4E9A\u5C14\u65AF\u514B\u65F6\u95F4 +-Asia/Kuala_Lumpur.generic.long=\u9A6C\u6765\u897F\u4E9A\u65F6\u95F4 +-Asia/Kuching.generic.long=\u9A6C\u6765\u897F\u4E9A\u65F6\u95F4 +-Asia/Kuwait.generic.long=\u963F\u62C9\u4F2F\u534A\u5C9B\u65F6\u95F4 +-Asia/Macao.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Asia/Macau.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Asia/Magadan.generic.long=Magadan \u65F6\u95F4 +-Asia/Makassar.generic.long=\u4E2D\u90E8\u5370\u5EA6\u5C3C\u897F\u4E9A\u65F6\u95F4 +-Asia/Manila.generic.long=\u83F2\u5F8B\u5BBE\u65F6\u95F4 +-Asia/Muscat.generic.long=\u6D77\u6E7E\u65F6\u95F4 +-Asia/Nicosia.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Asia/Novokuznetsk.generic.long=Novosibirsk \u65F6\u95F4 +-Asia/Novosibirsk.generic.long=Novosibirsk \u65F6\u95F4 +-Asia/Omsk.generic.long=\u9102\u6728\u65AF\u514B\u65F6\u95F4 +-Asia/Oral.generic.long=Oral \u65F6\u95F4 +-Asia/Phnom_Penh.generic.long=\u5370\u5EA6\u652F\u90A3\u65F6\u95F4 +-Asia/Pontianak.generic.long=\u897F\u5370\u5EA6\u5C3C\u897F\u4E9A\u65F6\u95F4 +-Asia/Pyongyang.generic.long=\u97E9\u56FD\u65F6\u95F4 +-Asia/Qatar.generic.long=\u963F\u62C9\u4F2F\u534A\u5C9B\u65F6\u95F4 +-Asia/Qyzylorda.generic.long=Qyzylorda \u65F6\u95F4 +-Asia/Rangoon.generic.long=\u7F05\u7538\u65F6\u95F4 +-Asia/Saigon.generic.long=\u5370\u5EA6\u652F\u90A3\u65F6\u95F4 +-Asia/Sakhalin.generic.long=\u5E93\u9875\u5C9B\u65F6\u95F4 +-Asia/Samarkand.generic.long=\u4E4C\u5179\u522B\u514B\u65AF\u5766\u65F6\u95F4 +-Asia/Seoul.generic.long=\u97E9\u56FD\u65F6\u95F4 +-Asia/Shanghai.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Asia/Singapore.generic.long=\u65B0\u52A0\u5761\u65F6\u95F4 +-Asia/Taipei.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Asia/Tashkent.generic.long=\u4E4C\u5179\u522B\u514B\u65AF\u5766\u65F6\u95F4 +-Asia/Tbilisi.generic.long=\u4E54\u6CBB\u4E9A\u65F6\u95F4 +-Asia/Tehran.generic.long=\u4F0A\u6717\u65F6\u95F4 +-Asia/Tel_Aviv.generic.long=\u4EE5\u8272\u5217\u65F6\u95F4 +-Asia/Thimbu.generic.long=\u4E0D\u4E39\u65F6\u95F4 +-Asia/Thimphu.generic.long=\u4E0D\u4E39\u65F6\u95F4 +-Asia/Tokyo.generic.long=\u65E5\u672C\u65F6\u95F4 +-Asia/Ujung_Pandang.generic.long=\u4E2D\u90E8\u5370\u5EA6\u5C3C\u897F\u4E9A\u65F6\u95F4 +-Asia/Ulaanbaatar.generic.long=\u5E93\u4F26\u65F6\u95F4 +-Asia/Ulan_Bator.generic.long=\u5E93\u4F26\u65F6\u95F4 +-Asia/Urumqi.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Asia/Ust-Nera.daylight.long=\u4E4C\u65AF\u5B63\u6D85\u62C9\u590F\u4EE4\u65F6 +-Asia/Ust-Nera.generic.long=\u4E4C\u65AF\u5B63\u6D85\u62C9\u65F6\u95F4 +-Asia/Ust-Nera.standard.long=\u4E4C\u65AF\u5B63\u6D85\u62C9\u65F6\u95F4 +-Asia/Vientiane.generic.long=\u5370\u5EA6\u652F\u90A3\u65F6\u95F4 +-Asia/Vladivostok.generic.long=\u6D77\u53C2\u5D34\u65F6\u95F4 +-Asia/Yakutsk.generic.long=\u4E9A\u5E93\u6B21\u514B\u65F6\u95F4 +-Asia/Yekaterinburg.generic.long=Yekaterinburg \u65F6\u95F4 +-Asia/Yerevan.generic.long=\u4E9A\u7F8E\u5C3C\u4E9A\u65F6\u95F4 +-Atlantic/Azores.generic.long=\u4E9A\u901F\u5C14\u7FA4\u5C9B\u65F6\u95F4 +-Atlantic/Bermuda.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-Atlantic/Canary.generic.long=\u897F\u6B27\u65F6\u95F4 +-Atlantic/Cape_Verde.generic.long=\u4F5B\u5FB7\u89D2\u65F6\u95F4 +-Atlantic/Faeroe.generic.long=\u897F\u6B27\u65F6\u95F4 +-Atlantic/Faroe.generic.long=\u897F\u6B27\u65F6\u95F4 +-Atlantic/Jan_Mayen.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Atlantic/Madeira.generic.long=\u897F\u6B27\u65F6\u95F4 +-Atlantic/Reykjavik.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Atlantic/South_Georgia.generic.long=\u5357\u4E54\u6CBB\u4E9A\u5C9B\u65F6\u95F4 +-Atlantic/St_Helena.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Atlantic/Stanley.generic.long=\u798F\u514B\u5170\u7FA4\u5C9B\u65F6\u95F4 +-Australia/ACT.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/ACT.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/ACT.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Adelaide.daylight.long=\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5357\u6FB3\u5927\u5229\u4E9A) +-Australia/Adelaide.generic.long=\u4E2D\u90E8\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A) +-Australia/Adelaide.standard.long=\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A) +-Australia/Brisbane.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u6606\u58EB\u5170) +-Australia/Brisbane.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u6606\u58EB\u5170) +-Australia/Brisbane.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u6606\u58EB\u5170) +-Australia/Broken_Hill.daylight.long=\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Broken_Hill.generic.long=\u4E2D\u90E8\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Broken_Hill.standard.long=\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Canberra.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Canberra.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Canberra.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Currie.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Currie.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Currie.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Darwin.daylight.long=\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5317\u9886\u5730) +-Australia/Darwin.generic.long=\u4E2D\u90E8\u65F6\u95F4 (\u5317\u90E8\u5730\u533A) +-Australia/Darwin.standard.long=\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5317\u9886\u5730) +-Australia/Eucla.daylight.long=\u4E2D\u897F\u90E8\u590F\u4EE4\u65F6 (\u6FB3\u5927\u5229\u4E9A) +-Australia/Eucla.generic.long=\u4E2D\u897F\u90E8\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A) +-Australia/Eucla.standard.long=\u4E2D\u897F\u90E8\u6807\u51C6\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A) +-Australia/Hobart.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u5854\u65AF\u9A6C\u5C3C\u4E9A) +-Australia/Hobart.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u5854\u65AF\u9A6C\u5C3C\u4E9A) +-Australia/Hobart.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u5854\u65AF\u9A6C\u5C3C\u4E9A) +-Australia/LHI.generic.long=\u8C6A\u516C\u65F6\u95F4 +-Australia/Lindeman.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u6606\u58EB\u5170) +-Australia/Lindeman.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u6606\u58EB\u5170) +-Australia/Lindeman.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u6606\u58EB\u5170) +-Australia/Lord_Howe.generic.long=\u8C6A\u516C\u65F6\u95F4 +-Australia/Melbourne.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u7EF4\u591A\u5229\u4E9A) +-Australia/Melbourne.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u7EF4\u591A\u5229\u4E9A) +-Australia/Melbourne.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u7EF4\u591A\u5229\u4E9A) +-Australia/NSW.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/NSW.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/NSW.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/North.daylight.long=\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5317\u9886\u5730) +-Australia/North.generic.long=\u4E2D\u90E8\u65F6\u95F4 (\u5317\u90E8\u5730\u533A) +-Australia/North.standard.long=\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5317\u9886\u5730) +-Australia/Perth.daylight.long=\u897F\u90E8\u590F\u4EE4\u65F6 (\u6FB3\u5927\u5229\u4E9A) +-Australia/Perth.generic.long=\u897F\u90E8\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A) +-Australia/Perth.standard.long=\u897F\u90E8\u6807\u51C6\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A) +-Australia/Queensland.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u6606\u58EB\u5170) +-Australia/Queensland.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u6606\u58EB\u5170) +-Australia/Queensland.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u6606\u58EB\u5170) +-Australia/South.daylight.long=\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5357\u6FB3\u5927\u5229\u4E9A) +-Australia/South.generic.long=\u4E2D\u90E8\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A) +-Australia/South.standard.long=\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A) +-Australia/Sydney.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Sydney.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Sydney.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Tasmania.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u5854\u65AF\u9A6C\u5C3C\u4E9A) +-Australia/Tasmania.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u5854\u65AF\u9A6C\u5C3C\u4E9A) +-Australia/Tasmania.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u5854\u65AF\u9A6C\u5C3C\u4E9A) +-Australia/Victoria.daylight.long=\u4E1C\u90E8\u590F\u4EE4\u65F6 (\u7EF4\u591A\u5229\u4E9A) +-Australia/Victoria.generic.long=\u4E1C\u90E8\u65F6\u95F4 (\u7EF4\u591A\u5229\u4E9A) +-Australia/Victoria.standard.long=\u4E1C\u90E8\u6807\u51C6\u65F6\u95F4 (\u7EF4\u591A\u5229\u4E9A) +-Australia/West.daylight.long=\u897F\u90E8\u590F\u4EE4\u65F6 (\u6FB3\u5927\u5229\u4E9A) +-Australia/West.generic.long=\u897F\u90E8\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A) +-Australia/West.standard.long=\u897F\u90E8\u6807\u51C6\u65F6\u95F4 (\u6FB3\u5927\u5229\u4E9A) +-Australia/Yancowinna.daylight.long=\u4E2D\u592E\u590F\u4EE4\u65F6 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Yancowinna.generic.long=\u4E2D\u90E8\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF) +-Australia/Yancowinna.standard.long=\u4E2D\u592E\u6807\u51C6\u65F6\u95F4 (\u5357\u6FB3\u5927\u5229\u4E9A/\u65B0\u5357\u5A01\u5C14\u65AF) +-BET.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-BST.generic.long=\u5B5F\u52A0\u62C9\u65F6\u95F4 +-Brazil/Acre.generic.long=Acre \u65f6\u95f4 +-Brazil/DeNoronha.generic.long=\u8D39\u5C14\u5357\u591A\u5FB7\u8BFA\u7F57\u5C3C\u4E9A\u65F6\u95F4 +-Brazil/East.generic.long=\u5DF4\u897F\u5229\u4E9A\u65F6\u95F4 +-Brazil/West.generic.long=\u4E9A\u9A6C\u900A\u65F6\u95F4 +-CAT.generic.long=\u4E2D\u975E\u65F6\u95F4 +-CET.generic.long=\u4e2d\u6b27\u65f6\u95f4 +-CNT.generic.long=\u7EBD\u82AC\u5170\u65F6\u95F4 +-CST.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-CST6CDT.generic.long=\u4e2d\u90e8\u65f6\u95f4 +-CTT.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-Canada/Atlantic.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-Canada/Central.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-Canada/East-Saskatchewan.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-Canada/Eastern.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-Canada/Mountain.generic.long=\u5C71\u5730\u65F6\u95F4 +-Canada/Newfoundland.generic.long=\u7EBD\u82AC\u5170\u65F6\u95F4 +-Canada/Pacific.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-Canada/Saskatchewan.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-Canada/Yukon.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-Chile/Continental.generic.long=\u667A\u5229\u65F6\u95F4 +-Chile/EasterIsland.generic.long=\u590D\u6D3B\u5C9B\u65F6\u95F4 +-Cuba.generic.long=\u53E4\u5DF4\u65F6\u95F4 +-EAT.generic.long=\u4E1C\u975E\u65F6\u95F4 +-ECT.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-EET.generic.long=\u4e1c\u6b27\u65f6\u95f4 +-EST.generic.long=\u4e1c\u90e8\u65f6\u95f4 +-EST5EDT.generic.long=\u4e1c\u90e8\u65f6\u95f4 +-Egypt.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Eire.generic.long=\u7231\u5C14\u5170\u65F6\u95F4 +-Etc/Greenwich.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Etc/UCT.generic.long=\u534F\u8C03\u4E16\u754C\u65F6\u95F4 +-Etc/UTC.generic.long=\u534F\u8C03\u4E16\u754C\u65F6\u95F4 +-Etc/Universal.generic.long=\u534F\u8C03\u4E16\u754C\u65F6\u95F4 +-Etc/Zulu.generic.long=\u534F\u8C03\u4E16\u754C\u65F6\u95F4 +-Europe/Amsterdam.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Andorra.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Athens.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Belfast.generic.long=\u82F1\u56FD\u65F6\u95F4 +-Europe/Belgrade.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Berlin.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Bratislava.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Brussels.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Bucharest.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Budapest.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Busingen.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Chisinau.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Copenhagen.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Dublin.generic.long=\u7231\u5C14\u5170\u65F6\u95F4 +-Europe/Gibraltar.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Guernsey.generic.long=\u82F1\u56FD\u65F6\u95F4 +-Europe/Helsinki.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Isle_of_Man.generic.long=\u82F1\u56FD\u65F6\u95F4 +-Europe/Istanbul.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Jersey.generic.long=\u82F1\u56FD\u65F6\u95F4 +-Europe/Kaliningrad.daylight.long=\u8FDC\u4E1C\u6B27\u590F\u4EE4\u65F6 +-Europe/Kaliningrad.generic.long=\u8FDC\u4E1C\u6B27\u65F6\u95F4 +-Europe/Kaliningrad.standard.long=\u8FDC\u4E1C\u6B27\u65F6\u95F4 +-Europe/Kiev.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Lisbon.generic.long=\u897F\u6B27\u65F6\u95F4 +-Europe/Ljubljana.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/London.generic.long=\u82F1\u56FD\u65F6\u95F4 +-Europe/Luxembourg.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Madrid.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Malta.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Mariehamn.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Minsk.daylight.long=\u8FDC\u4E1C\u6B27\u590F\u4EE4\u65F6 +-Europe/Minsk.generic.long=\u8FDC\u4E1C\u6B27\u65F6\u95F4 +-Europe/Minsk.standard.long=\u8FDC\u4E1C\u6B27\u65F6\u95F4 +-Europe/Monaco.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Moscow.generic.long=\u83AB\u65AF\u79D1\u65F6\u95F4 +-Europe/Nicosia.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Oslo.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Paris.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Podgorica.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Prague.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Riga.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Rome.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Samara.generic.long=\u6C99\u9A6C\u62C9\u65F6\u95F4 +-Europe/San_Marino.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Sarajevo.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Simferopol.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Skopje.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Sofia.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Stockholm.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Tallinn.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Tirane.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Tiraspol.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Uzhgorod.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Vaduz.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Vatican.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Vienna.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Vilnius.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Volgograd.generic.long=\u4F0F\u5C14\u52A0\u683C\u52D2\u65F6\u95F4 +-Europe/Warsaw.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Zagreb.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Europe/Zaporozhye.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-Europe/Zurich.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-GB-Eire.generic.long=\u82F1\u56FD\u65F6\u95F4 +-GB.generic.long=\u82F1\u56FD\u65F6\u95F4 +-GMT.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Greenwich.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-HST.generic.long=\u590f\u5a01\u5937\u65f6\u95f4 +-Hongkong.generic.long=\u9999\u6E2F\u65F6\u95F4 +-IET.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-IST.generic.long=\u5370\u5EA6\u65F6\u95F4 +-Iceland.generic.long=\u683C\u6797\u5A01\u6CBB\u65F6\u95F4 +-Indian/Antananarivo.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Indian/Chagos.generic.long=\u5370\u5EA6\u6D0B\u5730\u5E26\u65F6\u95F4 +-Indian/Christmas.generic.long=\u5723\u8BDE\u5C9B\u65F6\u95F4 +-Indian/Cocos.generic.long=\u53EF\u53EF\u65AF\u7FA4\u5C9B\u65F6\u95F4 +-Indian/Comoro.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Indian/Kerguelen.generic.long=\u6CD5\u5C5E\u5357\u6781\u65F6\u95F4 +-Indian/Mahe.generic.long=\u585E\u5E2D\u5C14\u7FA4\u5C9B\u65F6\u95F4 +-Indian/Maldives.generic.long=\u9A6C\u5C14\u4EE3\u592B\u65F6\u95F4 +-Indian/Mauritius.generic.long=\u6469\u91CC\u897F\u65AF\u65F6\u95F4 +-Indian/Mayotte.generic.long=\u4E1C\u975E\u65F6\u95F4 +-Indian/Reunion.generic.long=\u7559\u5C3C\u65FA\u5C9B\u65F6\u95F4 +-Iran.generic.long=\u4F0A\u6717\u65F6\u95F4 +-Israel.generic.long=\u4EE5\u8272\u5217\u65F6\u95F4 +-JST.generic.long=\u65E5\u672C\u65F6\u95F4 +-Jamaica.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-Japan.generic.long=\u65E5\u672C\u65F6\u95F4 +-Kwajalein.generic.long=\u9A6C\u7ECD\u5C14\u7FA4\u5C9B\u65F6\u95F4 +-Libya.generic.long=\u4e1c\u6b27\u65f6\u95f4 +-MET.generic.long=MET +-MIT.generic.long=\u897F\u8428\u6469\u4E9A\u65F6\u95F4 +-MST.generic.long=\u5c71\u5730\u65f6\u95f4 +-MST7MDT.generic.long=\u5c71\u5730\u65f6\u95f4 +-Mexico/BajaNorte.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-Mexico/BajaSur.generic.long=\u5C71\u5730\u65F6\u95F4 +-Mexico/General.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-NET.generic.long=\u4E9A\u7F8E\u5C3C\u4E9A\u65F6\u95F4 +-NST.generic.long=\u65B0\u897F\u5170\u65F6\u95F4 +-NZ-CHAT.generic.long=\u67E5\u5854\u59C6\u65F6\u95F4 +-NZ.generic.long=\u65B0\u897F\u5170\u65F6\u95F4 +-Navajo.generic.long=\u5C71\u5730\u65F6\u95F4 +-PLT.generic.long=\u5DF4\u57FA\u65AF\u5766\u65F6\u95F4 +-PNT.generic.long=\u5C71\u5730\u65F6\u95F4 +-PRC.generic.long=\u4E2D\u56FD\u65F6\u95F4 +-PRT.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-PST.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-PST8PDT.generic.long=\u592a\u5e73\u6d0b\u65f6\u95f4 +-Pacific/Apia.generic.long=\u897F\u8428\u6469\u4E9A\u65F6\u95F4 +-Pacific/Auckland.generic.long=\u65B0\u897F\u5170\u65F6\u95F4 +-Pacific/Chatham.generic.long=\u67E5\u5854\u59C6\u65F6\u95F4 +-Pacific/Chuuk.daylight.long=\u4E18\u514B\u590F\u4EE4\u65F6 +-Pacific/Chuuk.generic.long=\u4E18\u514B\u65F6\u95F4 +-Pacific/Chuuk.standard.long=\u4E18\u514B\u65F6\u95F4 +-Pacific/Easter.generic.long=\u590D\u6D3B\u5C9B\u65F6\u95F4 +-Pacific/Efate.generic.long=\u74E6\u5974\u963F\u56FE\u65F6\u95F4 +-Pacific/Enderbury.generic.long=\u83F2\u5C3C\u514B\u65AF\u7FA4\u5C9B\u65F6\u95F4 +-Pacific/Fakaofo.generic.long=\u6258\u514B\u52B3\u7FA4\u5C9B\u65F6\u95F4 +-Pacific/Fiji.generic.long=\u6590\u6D4E\u65F6\u95F4 +-Pacific/Funafuti.generic.long=\u5410\u9C81\u74E6\u65F6\u95F4 +-Pacific/Galapagos.generic.long=\u52A0\u62C9\u5DF4\u54E5\u65F6\u95F4 +-Pacific/Gambier.generic.long=\u5188\u6BD4\u4E9A\u65F6\u95F4 +-Pacific/Guadalcanal.generic.long=\u6240\u7F57\u95E8\u7FA4\u5C9B\u65F6\u95F4 +-Pacific/Guam.generic.long=\u67E5\u6469\u6D1B\u65F6\u95F4 +-Pacific/Honolulu.generic.long=\u590F\u5A01\u5937\u65F6\u95F4 +-Pacific/Johnston.generic.long=\u590F\u5A01\u5937\u65F6\u95F4 +-Pacific/Kiritimati.generic.long=Line \u5C9B\u65F6\u95F4 +-Pacific/Kosrae.generic.long=Kosrae \u65F6\u95F4 +-Pacific/Kwajalein.generic.long=\u9A6C\u7ECD\u5C14\u7FA4\u5C9B\u65F6\u95F4 +-Pacific/Majuro.generic.long=\u9A6C\u7ECD\u5C14\u7FA4\u5C9B\u65F6\u95F4 +-Pacific/Marquesas.generic.long=\u9A6C\u514B\u8428\u65AF\u65F6\u95F4 +-Pacific/Midway.generic.long=\u8428\u6469\u4E9A\u65F6\u95F4 +-Pacific/Nauru.generic.long=\u8BFA\u9C81\u65F6\u95F4 +-Pacific/Niue.generic.long=\u7EBD\u5A01\u5C9B\u65F6\u95F4 +-Pacific/Norfolk.generic.long=\u8BFA\u798F\u514B\u65F6\u95F4 +-Pacific/Noumea.generic.long=\u65B0\u52A0\u52D2\u591A\u5C3C\u4E9A\u65F6\u95F4 +-Pacific/Pago_Pago.generic.long=\u8428\u6469\u4E9A\u65F6\u95F4 +-Pacific/Palau.generic.long=\u5E1B\u7409\u65F6\u95F4 +-Pacific/Pitcairn.generic.long=\u76AE\u7279\u51EF\u6069\u65F6\u95F4 +-Pacific/Pohnpei.daylight.long=\u6CE2\u7EB3\u4F69\u590F\u4EE4\u65F6 +-Pacific/Pohnpei.generic.long=\u6CE2\u7EB3\u4F69\u65F6\u95F4 +-Pacific/Pohnpei.standard.long=\u6CE2\u7EB3\u4F69\u65F6\u95F4 +-Pacific/Ponape.daylight.long=\u6CE2\u7EB3\u4F69\u590F\u4EE4\u65F6 +-Pacific/Ponape.generic.long=\u6CE2\u7EB3\u4F69\u65F6\u95F4 +-Pacific/Ponape.standard.long=\u6CE2\u7EB3\u4F69\u65F6\u95F4 +-Pacific/Port_Moresby.generic.long=\u5DF4\u5E03\u4E9A\u65B0\u51E0\u5185\u4E9A\u65F6\u95F4 +-Pacific/Rarotonga.generic.long=\u5E93\u514B\u7FA4\u5C9B\u65F6\u95F4 +-Pacific/Saipan.generic.long=\u67E5\u6469\u6D1B\u65F6\u95F4 +-Pacific/Samoa.generic.long=\u8428\u6469\u4E9A\u65F6\u95F4 +-Pacific/Tahiti.generic.long=\u5927\u6EAA\u5730\u5C9B\u65F6\u95F4 +-Pacific/Tarawa.generic.long=\u5409\u4F2F\u7279\u7FA4\u5C9B\u65F6\u95F4 +-Pacific/Tongatapu.generic.long=\u4E1C\u52A0\u65F6\u95F4 +-Pacific/Truk.daylight.long=\u4E18\u514B\u590F\u4EE4\u65F6 +-Pacific/Truk.generic.long=\u4E18\u514B\u65F6\u95F4 +-Pacific/Truk.standard.long=\u4E18\u514B\u65F6\u95F4 +-Pacific/Wake.generic.long=\u5A01\u514B\u65F6\u95F4 +-Pacific/Wallis.generic.long=\u74E6\u5229\u65AF\u53CA\u798F\u675C\u7EB3\u7FA4\u5C9B\u65F6\u95F4 +-Pacific/Yap.daylight.long=\u4E18\u514B\u590F\u4EE4\u65F6 +-Pacific/Yap.generic.long=\u4E18\u514B\u65F6\u95F4 +-Pacific/Yap.standard.long=\u4E18\u514B\u65F6\u95F4 +-Poland.generic.long=\u4E2D\u6B27\u65F6\u95F4 +-Portugal.generic.long=\u897F\u6B27\u65F6\u95F4 +-ROK.generic.long=\u97E9\u56FD\u65F6\u95F4 +-SST.generic.long=\u6240\u7F57\u95E8\u7FA4\u5C9B\u65F6\u95F4 +-Singapore.generic.long=\u65B0\u52A0\u5761\u65F6\u95F4 +-SystemV/AST4.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-SystemV/AST4ADT.generic.long=\u5927\u897F\u6D0B\u65F6\u95F4 +-SystemV/CST6.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-SystemV/CST6CDT.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-SystemV/EST5.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-SystemV/EST5EDT.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-SystemV/HST10.generic.long=\u590F\u5A01\u5937\u65F6\u95F4 +-SystemV/MST7.generic.long=\u5C71\u5730\u65F6\u95F4 +-SystemV/MST7MDT.generic.long=\u5C71\u5730\u65F6\u95F4 +-SystemV/PST8.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-SystemV/PST8PDT.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-SystemV/YST9.generic.long=\u963F\u62C9\u65AF\u52A0\u65F6\u95F4 +-SystemV/YST9YDT.generic.long=\u963F\u62C9\u65AF\u52A0\u65F6\u95F4 +-Turkey.generic.long=\u4E1C\u6B27\u65F6\u95F4 +-UCT.generic.long=\u534F\u8C03\u4E16\u754C\u65F6\u95F4 +-US/Alaska.generic.long=\u963F\u62C9\u65AF\u52A0\u65F6\u95F4 +-US/Aleutian.generic.long=\u590F\u5A01\u5937-\u963F\u7559\u7533\u65F6\u95F4 +-US/Arizona.generic.long=\u5C71\u5730\u65F6\u95F4 +-US/Central.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-US/East-Indiana.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-US/Eastern.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-US/Hawaii.generic.long=\u590F\u5A01\u5937\u65F6\u95F4 +-US/Indiana-Starke.generic.long=\u4E2D\u90E8\u65F6\u95F4 +-US/Michigan.generic.long=\u4E1C\u90E8\u65F6\u95F4 +-US/Mountain.generic.long=\u5C71\u5730\u65F6\u95F4 +-US/Pacific-New.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-US/Pacific.generic.long=\u592A\u5E73\u6D0B\u65F6\u95F4 +-US/Samoa.generic.long=\u8428\u6469\u4E9A\u65F6\u95F4 +-UTC.generic.long=\u534F\u8C03\u4E16\u754C\u65F6\u95F4 +-Universal.generic.long=\u534F\u8C03\u4E16\u754C\u65F6\u95F4 +-VST.generic.long=\u5370\u5EA6\u652F\u90A3\u65F6\u95F4 +-W-SU.generic.long=\u83AB\u65AF\u79D1\u65F6\u95F4 +-WET.generic.long=\u897f\u6b27\u65f6\u95f4 +-Zulu.generic.long=\u534F\u8C03\u4E16\u754C\u65F6\u95F4 +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_zh_CN_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_zh_CN_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=CDT +-Asia/Taipei.generic.short=CT +-Asia/Taipei.standard.short=CST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_zh_TW.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_zh_TW.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,651 +0,0 @@ +-ACT.daylight.long=\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340) +-ACT.generic.long=\u6FB3\u5927\u5229\u4E9E\u4E2D\u90E8\u6642\u9593 (\u5317\u65B9\u5340\u57DF) +-ACT.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340) +-AET.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-AET.generic.long=\u6771\u90E8\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-AET.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-AGT.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-ART.generic.long=\u6771\u6B50\u6642\u9593 +-AST.generic.long=\u963F\u62C9\u65AF\u52A0\u6642\u9593 +-Africa/Abidjan.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Accra.generic.long=\u8FE6\u7D0D\u6642\u9593 +-Africa/Addis_Ababa.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Algiers.generic.long=\u4E2D\u6B50\u6642\u9593 +-Africa/Asmara.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Asmera.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Bamako.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Bangui.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Banjul.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Bissau.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Blantyre.generic.long=\u4E2D\u975E\u6642\u9593 +-Africa/Brazzaville.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Bujumbura.generic.long=\u4E2D\u975E\u6642\u9593 +-Africa/Cairo.generic.long=\u6771\u6B50\u6642\u9593 +-Africa/Casablanca.generic.long=\u897F\u6B50\u6642\u9593 +-Africa/Ceuta.generic.long=\u4E2D\u6B50\u6642\u9593 +-Africa/Conakry.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Dakar.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Dar_es_Salaam.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Djibouti.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Douala.generic.long=\u897F\u975E\u6642\u9593 +-Africa/El_Aaiun.generic.long=\u897F\u6B50\u6642\u9593 +-Africa/Freetown.generic.long=\u7345\u5B50\u5C71\u6642\u9593 +-Africa/Gaborone.generic.long=\u4E2D\u975E\u6642\u9593 +-Africa/Harare.generic.long=\u4E2D\u975E\u6642\u9593 +-Africa/Johannesburg.generic.long=\u5357\u975E\u6642\u9593 +-Africa/Juba.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Kampala.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Khartoum.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Kigali.generic.long=\u4E2D\u975E\u6642\u9593 +-Africa/Kinshasa.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Lagos.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Libreville.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Lome.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Luanda.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Lubumbashi.generic.long=\u4E2D\u975E\u6642\u9593 +-Africa/Lusaka.generic.long=\u4E2D\u975E\u6642\u9593 +-Africa/Malabo.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Maputo.generic.long=\u4E2D\u975E\u6642\u9593 +-Africa/Maseru.generic.long=\u5357\u975E\u6642\u9593 +-Africa/Mbabane.generic.long=\u5357\u975E\u6642\u9593 +-Africa/Mogadishu.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Monrovia.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Nairobi.generic.long=\u6771\u975E\u6642\u9593 +-Africa/Ndjamena.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Niamey.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Nouakchott.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Ouagadougou.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Porto-Novo.generic.long=\u897F\u975E\u6642\u9593 +-Africa/Sao_Tome.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Timbuktu.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Africa/Tripoli.generic.long=\u6771\u6b50\u6642\u9593 +-Africa/Tunis.generic.long=\u4E2D\u6B50\u6642\u9593 +-Africa/Windhoek.generic.long=\u897F\u975E\u6642\u9593 +-America/Adak.generic.long=\u590F\u5A01\u5937-\u963F\u7559\u7533\u6642\u9593 +-America/Anchorage.generic.long=\u963F\u62C9\u65AF\u52A0\u6642\u9593 +-America/Anguilla.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Antigua.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Araguaina.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-America/Argentina/Buenos_Aires.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/Catamarca.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/ComodRivadavia.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/Cordoba.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/Jujuy.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/La_Rioja.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/Mendoza.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/Rio_Gallegos.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/Salta.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/San_Juan.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/San_Luis.generic.long=\u963f\u6839\u5ef7\u6642\u9593 +-America/Argentina/Tucuman.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Argentina/Ushuaia.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Aruba.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Asuncion.generic.long=\u5DF4\u62C9\u572D\u6642\u9593 +-America/Atikokan.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Atka.generic.long=\u590F\u5A01\u5937-\u963F\u7559\u7533\u6642\u9593 +-America/Bahia.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-America/Bahia_Banderas.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Barbados.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Belem.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-America/Belize.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Blanc-Sablon.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Boa_Vista.generic.long=\u4E9E\u99AC\u905C\u6642\u9593 +-America/Bogota.generic.long=\u54E5\u502B\u6BD4\u4E9E\u6642\u9593 +-America/Boise.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Buenos_Aires.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Cambridge_Bay.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Campo_Grande.generic.long=\u4E9E\u99AC\u905C\u6642\u9593 +-America/Cancun.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Caracas.generic.long=\u59D4\u5167\u745E\u62C9\u6642\u9593 +-America/Catamarca.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Cayenne.generic.long=\u6CD5\u5C6C\u572D\u4E9E\u90A3\u6642\u9593 +-America/Cayman.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Chicago.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Chihuahua.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Coral_Harbour.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Cordoba.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Costa_Rica.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Creston.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Cuiaba.generic.long=\u4E9E\u99AC\u905C\u6642\u9593 +-America/Curacao.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Danmarkshavn.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-America/Dawson.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-America/Dawson_Creek.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Denver.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Detroit.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Dominica.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Edmonton.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Eirunepe.generic.long=Acre \u6642\u9593 +-America/El_Salvador.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Ensenada.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-America/Fort_Wayne.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Fortaleza.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-America/Glace_Bay.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Godthab.generic.long=\u897F\u683C\u9675\u862D\u6642\u9593 +-America/Goose_Bay.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Grand_Turk.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Grenada.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Guadeloupe.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Guatemala.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Guayaquil.generic.long=\u5384\u74DC\u591A\u723E\u6642\u9593 +-America/Guyana.generic.long=\u84CB\u4E9E\u90A3\u6642\u9593 +-America/Halifax.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Havana.generic.long=\u53E4\u5DF4\u6642\u9593 +-America/Hermosillo.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Indiana/Indianapolis.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Indiana/Knox.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Indiana/Marengo.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Indiana/Petersburg.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Indiana/Tell_City.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Indiana/Vevay.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Indiana/Vincennes.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Indiana/Winamac.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Indianapolis.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Inuvik.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Iqaluit.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Jamaica.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Jujuy.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Juneau.generic.long=\u963F\u62C9\u65AF\u52A0\u6642\u9593 +-America/Kentucky/Louisville.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Kentucky/Monticello.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Knox_IN.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Kralendijk.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/La_Paz.generic.long=\u73BB\u5229\u7DAD\u4E9E\u6642\u9593 +-America/Lima.generic.long=\u7955\u9B6F\u6642\u9593 +-America/Los_Angeles.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-America/Louisville.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Lower_Princes.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Maceio.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-America/Managua.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Manaus.generic.long=\u4E9E\u99AC\u905C\u6642\u9593 +-America/Marigot.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Martinique.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Matamoros.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Mazatlan.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Mendoza.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Menominee.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Merida.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Metlakatla.daylight.long=\u6885\u7279\u62C9\u5361\u7279\u62C9\u65E5\u5149\u7BC0\u7D04\u6642\u9593 +-America/Metlakatla.generic.long=\u6885\u7279\u62C9\u5361\u7279\u62C9\u6642\u9593 +-America/Metlakatla.standard.long=\u6885\u7279\u62C9\u5361\u7279\u62C9\u6A19\u6E96\u6642\u9593 +-America/Mexico_City.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Miquelon.generic.long=\u8056\u5F7C\u5FB7\u8207\u5BC6\u555F\u5D19\u6642\u9593 +-America/Moncton.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Monterrey.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Montevideo.generic.long=\u70CF\u62C9\u572D\u6642\u9593 +-America/Montreal.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Montserrat.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Nassau.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/New_York.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Nipigon.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Nome.generic.long=\u963F\u62C9\u65AF\u52A0\u6642\u9593 +-America/Noronha.generic.long=\u8CBB\u723E\u5357\u591A-\u8FEA\u8AFE\u7F85\u5C3C\u4E9E\u6642\u9593 +-America/North_Dakota/Beulah.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/North_Dakota/Center.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/North_Dakota/New_Salem.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Ojinaga.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Panama.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Pangnirtung.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Paramaribo.generic.long=\u8607\u5229\u5357\u6642\u9593 +-America/Phoenix.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Port-au-Prince.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Port_of_Spain.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Porto_Acre.generic.long=Acre \u6642\u9593 +-America/Porto_Velho.generic.long=\u4E9E\u99AC\u905C\u6642\u9593 +-America/Puerto_Rico.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Rainy_River.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Rankin_Inlet.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Recife.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-America/Regina.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Resolute.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Rio_Branco.generic.long=Acre \u6642\u9593 +-America/Rosario.generic.long=\u963F\u6839\u5EF7\u6642\u9593 +-America/Santa_Isabel.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-America/Santarem.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-America/Santiago.generic.long=\u667A\u5229\u6642\u9593 +-America/Santo_Domingo.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Sao_Paulo.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-America/Scoresbysund.generic.long=\u6771\u683C\u9675\u862D\u6642\u9593 +-America/Shiprock.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-America/Sitka.generic.long=\u963F\u62C9\u65AF\u52A0\u6642\u9593 +-America/St_Barthelemy.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/St_Johns.generic.long=\u7D10\u82AC\u862D\u6642\u9593 +-America/St_Kitts.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/St_Lucia.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/St_Thomas.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/St_Vincent.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Swift_Current.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Tegucigalpa.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Thule.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Thunder_Bay.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Tijuana.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-America/Toronto.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-America/Tortola.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Vancouver.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-America/Virgin.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-America/Whitehorse.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-America/Winnipeg.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-America/Yakutat.generic.long=\u963F\u62C9\u65AF\u52A0\u6642\u9593 +-America/Yellowknife.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-Antarctica/Casey.daylight.long=\u897F\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Antarctica/Casey.generic.long=\u897F\u90E8\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Antarctica/Casey.standard.long=\u897F\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Antarctica/Davis.generic.long=\u81FA\u7DAD\u65AF\u6642\u9593 +-Antarctica/DumontDUrville.generic.long=Dumont-d'Urville \u6642\u9593 +-Antarctica/Macquarie.daylight.long=\u9EA5\u5938\u5229\u5CF6\u590F\u4EE4\u6642\u9593 +-Antarctica/Macquarie.generic.long=\u9EA5\u5938\u5229\u5CF6\u6642\u9593 +-Antarctica/Macquarie.standard.long=\u9EA5\u5938\u5229\u5CF6\u6642\u9593 +-Antarctica/Mawson.generic.long=\u83AB\u68EE\u6642\u9593 +-Antarctica/McMurdo.generic.long=\u7D10\u897F\u862D\u6642\u9593 +-Antarctica/Palmer.generic.long=\u667A\u5229\u6642\u9593 +-Antarctica/Rothera.generic.long=\u7F85\u897F\u62C9\u6642\u9593 +-Antarctica/South_Pole.generic.long=\u7D10\u897F\u862D\u6642\u9593 +-Antarctica/Syowa.generic.long=\u5915\u6B50\u74E6 (Syowa) \u6642\u9593 +-Antarctica/Vostok.generic.long=\u4F5B\u65AF\u6258 (Vostok) \u6642\u9593 +-Arctic/Longyearbyen.generic.long=\u4E2D\u6B50\u6642\u9593 +-Asia/Aden.generic.long=\u963F\u62C9\u4F2F\u6642\u9593 +-Asia/Almaty.generic.long=\u963F\u62C9\u6728\u5716\u6642\u9593 +-Asia/Amman.generic.long=\u963f\u62c9\u4f2f\u6642\u9593 +-Asia/Anadyr.generic.long=\u963F\u90A3\u5E95\u6CB3\u6642\u9593 +-Asia/Aqtau.generic.long=\u963F\u514B\u5957\u6642\u9593 +-Asia/Aqtobe.generic.long=\u963F\u514B\u6258\u5225\u6642\u9593 +-Asia/Ashgabat.generic.long=\u571F\u5EAB\u66FC\u6642\u9593 +-Asia/Ashkhabad.generic.long=\u571F\u5EAB\u66FC\u6642\u9593 +-Asia/Baghdad.generic.long=\u963F\u62C9\u4F2F\u6642\u9593 +-Asia/Bahrain.generic.long=\u963F\u62C9\u4F2F\u6642\u9593 +-Asia/Baku.generic.long=\u4E9E\u585E\u62DC\u7136\u6642\u9593 +-Asia/Bangkok.generic.long=\u5370\u5EA6\u652F\u90A3\u6642\u9593 +-Asia/Beirut.generic.long=\u6771\u6B50\u6642\u9593 +-Asia/Bishkek.generic.long=\u5409\u723E\u5409\u65AF\u6642\u9593 +-Asia/Brunei.generic.long=\u6C76\u840A\u6642\u9593 +-Asia/Calcutta.generic.long=\u5370\u5EA6\u6642\u9593 +-Asia/Choibalsan.generic.long=\u5DE7\u5DF4\u5C71 (Choibalsan) \u6642\u9593 +-Asia/Chongqing.generic.long=\u4E2D\u570B\u6642\u9593 +-Asia/Chungking.generic.long=\u4E2D\u570B\u6642\u9593 +-Asia/Colombo.generic.long=\u5370\u5EA6\u6642\u9593 +-Asia/Dacca.generic.long=\u5B5F\u52A0\u62C9\u6642\u9593 +-Asia/Damascus.generic.long=\u6771\u6B50\u6642\u9593 +-Asia/Dhaka.generic.long=\u5B5F\u52A0\u62C9\u6642\u9593 +-Asia/Dili.generic.long=\u6771\u5E1D\u6C76\u6642\u9593 +-Asia/Dubai.generic.long=\u6CE2\u65AF\u7063\u6642\u9593 +-Asia/Dushanbe.generic.long=\u5854\u5409\u514B\u6642\u9593 +-Asia/Gaza.generic.long=\u6771\u6B50\u6642\u9593 +-Asia/Harbin.generic.long=\u4E2D\u570B\u6642\u9593 +-Asia/Hebron.generic.long=\u6771\u6B50\u6642\u9593 +-Asia/Ho_Chi_Minh.generic.long=\u5370\u5EA6\u652F\u90A3\u6642\u9593 +-Asia/Hong_Kong.generic.long=\u9999\u6E2F\u6642\u9593 +-Asia/Hovd.generic.long=\u4FAF\u5FB7 (Hovd) \u6642\u9593 +-Asia/Irkutsk.generic.long=\u4F0A\u723E\u5EAB\u6B21\u514B\u6642\u9593 +-Asia/Istanbul.generic.long=\u6771\u6B50\u6642\u9593 +-Asia/Jakarta.generic.long=\u897F\u5370\u5C3C\u6642\u9593 +-Asia/Jayapura.generic.long=\u6771\u5370\u5EA6\u5C3C\u897F\u4E9E\u6642\u9593 +-Asia/Jerusalem.generic.long=\u4EE5\u8272\u5217\u6642\u9593 +-Asia/Kabul.generic.long=\u963F\u5BCC\u6C57\u6642\u9593 +-Asia/Kamchatka.generic.long=Petropavlovsk-Kamchatski \u6642\u9593 +-Asia/Karachi.generic.long=\u5DF4\u57FA\u65AF\u5766\u6642\u9593 +-Asia/Kashgar.generic.long=\u4E2D\u570B\u6642\u9593 +-Asia/Kathmandu.generic.long=\u5C3C\u6CCA\u723E\u6642\u9593 +-Asia/Katmandu.generic.long=\u5C3C\u6CCA\u723E\u6642\u9593 +-Asia/Khandyga.daylight.long=\u6F22\u5730\u52A0 (Khandyga) \u590F\u4EE4\u6642\u9593 +-Asia/Khandyga.generic.long=\u6F22\u5730\u52A0 (Khandyga) \u6642\u9593 +-Asia/Khandyga.standard.long=\u6F22\u5730\u52A0 (Khandyga) \u6642\u9593 +-Asia/Kolkata.generic.long=\u5370\u5EA6\u6642\u9593 +-Asia/Krasnoyarsk.generic.long=\u514B\u62C9\u65AF\u8AFE\u4E9E\u723E\u65AF\u514B\u6642\u9593 +-Asia/Kuala_Lumpur.generic.long=\u99AC\u4F86\u897F\u4E9E\u6642\u9593 +-Asia/Kuching.generic.long=\u99AC\u4F86\u897F\u4E9E\u6642\u9593 +-Asia/Kuwait.generic.long=\u963F\u62C9\u4F2F\u6642\u9593 +-Asia/Macao.generic.long=\u4E2D\u570B\u6642\u9593 +-Asia/Macau.generic.long=\u4E2D\u570B\u6642\u9593 +-Asia/Magadan.generic.long=\u99AC\u52A0\u4E39\u6642\u9593 +-Asia/Makassar.generic.long=\u4E2D\u5370\u5EA6\u5C3C\u897F\u4E9E\u6642\u9593 +-Asia/Manila.generic.long=\u83F2\u5F8B\u8CD3\u6642\u9593 +-Asia/Muscat.generic.long=\u6CE2\u65AF\u7063\u6642\u9593 +-Asia/Nicosia.generic.long=\u6771\u6B50\u6642\u9593 +-Asia/Novokuznetsk.generic.long=\u65B0\u897F\u4F2F\u5229\u4E9E\u6642\u9593 +-Asia/Novosibirsk.generic.long=\u65B0\u897F\u4F2F\u5229\u4E9E\u6642\u9593 +-Asia/Omsk.generic.long=\u6B50\u59C6\u65AF\u514B (Omsk) \u6642\u9593 +-Asia/Oral.generic.long=\u6B50\u4F5B\u6642\u9593 +-Asia/Phnom_Penh.generic.long=\u5370\u5EA6\u652F\u90A3\u6642\u9593 +-Asia/Pontianak.generic.long=\u897F\u5370\u5C3C\u6642\u9593 +-Asia/Pyongyang.generic.long=\u97D3\u570B\u6642\u9593 +-Asia/Qatar.generic.long=\u963F\u62C9\u4F2F\u6642\u9593 +-Asia/Qyzylorda.generic.long=\u514B\u5B5C\u6D1B\u723E\u9054\u6642\u9593 +-Asia/Rangoon.generic.long=\u7DEC\u7538\u6642\u9593 +-Asia/Saigon.generic.long=\u5370\u5EA6\u652F\u90A3\u6642\u9593 +-Asia/Sakhalin.generic.long=\u5EAB\u9801\u5CF6\u6642\u9593 +-Asia/Samarkand.generic.long=\u70CF\u8332\u5225\u514B\u65AF\u5766\u6642\u9593 +-Asia/Seoul.generic.long=\u97D3\u570B\u6642\u9593 +-Asia/Shanghai.generic.long=\u4E2D\u570B\u6642\u9593 +-Asia/Singapore.generic.long=\u65B0\u52A0\u5761\u6642\u9593 +-Asia/Taipei.generic.long=\u53f0\u7063\u6642\u9593 +-Asia/Tashkent.generic.long=\u70CF\u8332\u5225\u514B\u65AF\u5766\u6642\u9593 +-Asia/Tbilisi.generic.long=\u55AC\u6CBB\u4E9E\u6642\u9593 +-Asia/Tehran.generic.long=\u4F0A\u6717\u6642\u9593 +-Asia/Tel_Aviv.generic.long=\u4EE5\u8272\u5217\u6642\u9593 +-Asia/Thimbu.generic.long=\u4E0D\u4E39\u6642\u9593 +-Asia/Thimphu.generic.long=\u4E0D\u4E39\u6642\u9593 +-Asia/Tokyo.generic.long=\u65E5\u672C\u6642\u9593 +-Asia/Ujung_Pandang.generic.long=\u4E2D\u5370\u5EA6\u5C3C\u897F\u4E9E\u6642\u9593 +-Asia/Ulaanbaatar.generic.long=\u5EAB\u502B\u6642\u9593 +-Asia/Ulan_Bator.generic.long=\u5EAB\u502B\u6642\u9593 +-Asia/Urumqi.generic.long=\u4E2D\u570B\u6642\u9593 +-Asia/Ust-Nera.daylight.long=\u70CF\u65AF\u5167\u62C9 (Ust-Nera) \u590F\u4EE4\u6642\u9593 +-Asia/Ust-Nera.generic.long=\u70CF\u65AF\u5167\u62C9 (Ust-Nera) \u6642\u9593 +-Asia/Ust-Nera.standard.long=\u70CF\u65AF\u5167\u62C9 (Ust-Nera) \u6642\u9593 +-Asia/Vientiane.generic.long=\u5370\u5EA6\u652F\u90A3\u6642\u9593 +-Asia/Vladivostok.generic.long=\u6D77\u53C3\u5D34\u6642\u9593 +-Asia/Yakutsk.generic.long=\u4E9E\u5EAB\u6B21\u514B\u6642\u9593 +-Asia/Yekaterinburg.generic.long=\u8449\u5361\u6377\u7433\u5821\u6642\u9593 +-Asia/Yerevan.generic.long=\u4E9E\u7F8E\u5C3C\u4E9E\u6642\u9593 +-Atlantic/Azores.generic.long=\u4E9E\u901F\u723E\u7FA4\u5CF6\u6642\u9593 +-Atlantic/Bermuda.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-Atlantic/Canary.generic.long=\u897F\u6B50\u6642\u9593 +-Atlantic/Cape_Verde.generic.long=\u4F5B\u5FB7\u89D2\u6642\u9593 +-Atlantic/Faeroe.generic.long=\u897F\u6B50\u6642\u9593 +-Atlantic/Faroe.generic.long=\u897F\u6B50\u6642\u9593 +-Atlantic/Jan_Mayen.generic.long=\u4E2D\u6B50\u6642\u9593 +-Atlantic/Madeira.generic.long=\u897F\u6B50\u6642\u9593 +-Atlantic/Reykjavik.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Atlantic/South_Georgia.generic.long=\u5357\u55AC\u6CBB\u4E9E\u6642\u9593 +-Atlantic/St_Helena.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Atlantic/Stanley.generic.long=\u798F\u514B\u862D\u7FA4\u5CF6\u6642\u9593 +-Australia/ACT.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/ACT.generic.long=\u6771\u90E8\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/ACT.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Adelaide.daylight.long=\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340) +-Australia/Adelaide.generic.long=\u4E2D\u90E8\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u90E8) +-Australia/Adelaide.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u90E8) +-Australia/Brisbane.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u6606\u58EB\u862D) +-Australia/Brisbane.generic.long=\u6771\u90E8\u6642\u9593 (\u6606\u58EB\u862D) +-Australia/Brisbane.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u6606\u58EB\u862D) +-Australia/Broken_Hill.daylight.long=\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340/\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Broken_Hill.generic.long=\u4E2D\u90E8\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u90E8/\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Broken_Hill.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340/\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Canberra.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Canberra.generic.long=\u6771\u90E8\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Canberra.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Currie.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Currie.generic.long=\u6771\u90E8\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Currie.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Darwin.daylight.long=\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340) +-Australia/Darwin.generic.long=\u6FB3\u5927\u5229\u4E9E\u4E2D\u90E8\u6642\u9593 (\u5317\u65B9\u5340\u57DF) +-Australia/Darwin.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340) +-Australia/Eucla.daylight.long=\u4E2D\u897F\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Australia/Eucla.generic.long=\u4E2D\u897F\u90E8\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Australia/Eucla.standard.long=\u4E2D\u897F\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Australia/Hobart.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u5854\u65AF\u6885\u5C3C\u4E9E\u5CF6) +-Australia/Hobart.generic.long=\u6FB3\u5927\u5229\u4E9E\u6771\u90E8\u6642\u9593 (\u5854\u65AF\u99AC\u5C3C\u4E9E\u5CF6) +-Australia/Hobart.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u5854\u65AF\u6885\u5C3C\u4E9E\u5CF6) +-Australia/LHI.generic.long=\u8C6A\u52F3\u7235\u5CF6\u6642\u9593 +-Australia/Lindeman.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u6606\u58EB\u862D) +-Australia/Lindeman.generic.long=\u6771\u90E8\u6642\u9593 (\u6606\u58EB\u862D) +-Australia/Lindeman.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u6606\u58EB\u862D) +-Australia/Lord_Howe.generic.long=\u8C6A\u52F3\u7235\u5CF6\u6642\u9593 +-Australia/Melbourne.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E\u90A6) +-Australia/Melbourne.generic.long=\u6771\u90E8\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E) +-Australia/Melbourne.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E\u90A6) +-Australia/NSW.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/NSW.generic.long=\u6771\u90E8\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/NSW.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/North.daylight.long=\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340) +-Australia/North.generic.long=\u6FB3\u5927\u5229\u4E9E\u4E2D\u90E8\u6642\u9593 (\u5317\u65B9\u5340\u57DF) +-Australia/North.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u5317\u90E8\u5404\u5730\u5340) +-Australia/Perth.daylight.long=\u897F\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Australia/Perth.generic.long=\u897F\u90E8\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Australia/Perth.standard.long=\u897F\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Australia/Queensland.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u6606\u58EB\u862D) +-Australia/Queensland.generic.long=\u6771\u90E8\u6642\u9593 (\u6606\u58EB\u862D) +-Australia/Queensland.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u6606\u58EB\u862D) +-Australia/South.daylight.long=\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340) +-Australia/South.generic.long=\u4E2D\u90E8\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u90E8) +-Australia/South.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u90E8) +-Australia/Sydney.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Sydney.generic.long=\u6771\u90E8\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Sydney.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Tasmania.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u5854\u65AF\u6885\u5C3C\u4E9E\u5CF6) +-Australia/Tasmania.generic.long=\u6FB3\u5927\u5229\u4E9E\u6771\u90E8\u6642\u9593 (\u5854\u65AF\u99AC\u5C3C\u4E9E\u5CF6) +-Australia/Tasmania.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u5854\u65AF\u6885\u5C3C\u4E9E\u5CF6) +-Australia/Victoria.daylight.long=\u6771\u90E8\u590F\u4EE4\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E\u90A6) +-Australia/Victoria.generic.long=\u6771\u90E8\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E) +-Australia/Victoria.standard.long=\u6771\u90E8\u6A19\u6E96\u6642\u9593 (\u7DAD\u591A\u5229\u4E9E\u90A6) +-Australia/West.daylight.long=\u897F\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Australia/West.generic.long=\u897F\u90E8\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Australia/West.standard.long=\u897F\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E) +-Australia/Yancowinna.daylight.long=\u4E2D\u90E8\u590F\u4EE4\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340/\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Yancowinna.generic.long=\u4E2D\u90E8\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u90E8/\u65B0\u5357\u5A01\u723E\u65AF) +-Australia/Yancowinna.standard.long=\u4E2D\u90E8\u6A19\u6E96\u6642\u9593 (\u6FB3\u5927\u5229\u4E9E\u5357\u5340/\u65B0\u5357\u5A01\u723E\u65AF) +-BET.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-BST.generic.long=\u5B5F\u52A0\u62C9\u6642\u9593 +-Brazil/Acre.generic.long=Acre \u6642\u9593 +-Brazil/DeNoronha.generic.long=\u8CBB\u723E\u5357\u591A-\u8FEA\u8AFE\u7F85\u5C3C\u4E9E\u6642\u9593 +-Brazil/East.generic.long=\u5DF4\u897F\u5229\u4E9E\u6642\u9593 +-Brazil/West.generic.long=\u4E9E\u99AC\u905C\u6642\u9593 +-CAT.generic.long=\u4E2D\u975E\u6642\u9593 +-CET.generic.long=\u4e2d\u6b50\u6642\u9593 +-CNT.generic.long=\u7D10\u82AC\u862D\u6642\u9593 +-CST.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-CST6CDT.generic.long=\u7f8e\u570b\u4e2d\u90e8\u6642\u9593 +-CTT.generic.long=\u4E2D\u570B\u6642\u9593 +-Canada/Atlantic.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-Canada/Central.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-Canada/East-Saskatchewan.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-Canada/Eastern.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-Canada/Mountain.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-Canada/Newfoundland.generic.long=\u7D10\u82AC\u862D\u6642\u9593 +-Canada/Pacific.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-Canada/Saskatchewan.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-Canada/Yukon.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-Chile/Continental.generic.long=\u667A\u5229\u6642\u9593 +-Chile/EasterIsland.generic.long=\u5FA9\u6D3B\u5CF6\u6642\u9593 +-Cuba.generic.long=\u53E4\u5DF4\u6642\u9593 +-EAT.generic.long=\u6771\u975E\u6642\u9593 +-ECT.generic.long=\u4E2D\u6B50\u6642\u9593 +-EET.generic.long=\u6771\u6b50\u6642\u9593 +-EST.generic.long=\u7f8e\u570b\u6771\u90e8\u6642\u9593 +-EST5EDT.generic.long=\u7f8e\u570b\u6771\u90e8\u6642\u9593 +-Egypt.generic.long=\u6771\u6B50\u6642\u9593 +-Eire.generic.long=\u611B\u723E\u862D\u6587\u6642\u9593 +-Etc/Greenwich.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Etc/UCT.generic.long=\u5354\u8ABF\u4E16\u754C\u6642\u9593 +-Etc/UTC.generic.long=\u5354\u8ABF\u4E16\u754C\u6642\u9593 +-Etc/Universal.generic.long=\u5354\u8ABF\u4E16\u754C\u6642\u9593 +-Etc/Zulu.generic.long=\u5354\u8ABF\u4E16\u754C\u6642\u9593 +-Europe/Amsterdam.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Andorra.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Athens.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Belfast.generic.long=\u82F1\u570B\u6642\u9593 +-Europe/Belgrade.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Berlin.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Bratislava.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Brussels.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Bucharest.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Budapest.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Busingen.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Chisinau.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Copenhagen.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Dublin.generic.long=\u611B\u723E\u862D\u6587\u6642\u9593 +-Europe/Gibraltar.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Guernsey.generic.long=\u82F1\u570B\u6642\u9593 +-Europe/Helsinki.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Isle_of_Man.generic.long=\u82F1\u570B\u6642\u9593 +-Europe/Istanbul.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Jersey.generic.long=\u82F1\u570B\u6642\u9593 +-Europe/Kaliningrad.daylight.long=\u6771\u6B50\u5167\u9678\u590F\u4EE4\u6642\u9593 +-Europe/Kaliningrad.generic.long=\u6771\u6B50\u5167\u9678\u6642\u9593 +-Europe/Kaliningrad.standard.long=\u6771\u6B50\u5167\u9678\u6642\u9593 +-Europe/Kiev.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Lisbon.generic.long=\u897F\u6B50\u6642\u9593 +-Europe/Ljubljana.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/London.generic.long=\u82F1\u570B\u6642\u9593 +-Europe/Luxembourg.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Madrid.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Malta.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Mariehamn.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Minsk.daylight.long=\u6771\u6B50\u5167\u9678\u590F\u4EE4\u6642\u9593 +-Europe/Minsk.generic.long=\u6771\u6B50\u5167\u9678\u6642\u9593 +-Europe/Minsk.standard.long=\u6771\u6B50\u5167\u9678\u6642\u9593 +-Europe/Monaco.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Moscow.generic.long=\u83AB\u65AF\u79D1\u6642\u9593 +-Europe/Nicosia.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Oslo.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Paris.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Podgorica.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Prague.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Riga.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Rome.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Samara.generic.long=\u6C99\u99AC\u62C9\u6642\u9593 +-Europe/San_Marino.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Sarajevo.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Simferopol.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Skopje.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Sofia.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Stockholm.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Tallinn.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Tirane.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Tiraspol.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Uzhgorod.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Vaduz.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Vatican.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Vienna.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Vilnius.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Volgograd.generic.long=\u4F0F\u723E\u52A0\u683C\u52D2\u6642\u9593 +-Europe/Warsaw.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Zagreb.generic.long=\u4E2D\u6B50\u6642\u9593 +-Europe/Zaporozhye.generic.long=\u6771\u6B50\u6642\u9593 +-Europe/Zurich.generic.long=\u4E2D\u6B50\u6642\u9593 +-GB-Eire.generic.long=\u82F1\u570B\u6642\u9593 +-GB.generic.long=\u82F1\u570B\u6642\u9593 +-GMT.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Greenwich.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-HST.generic.long=\u590f\u5a01\u5937\u6642\u9593 +-Hongkong.generic.long=\u9999\u6E2F\u6642\u9593 +-IET.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-IST.generic.long=\u5370\u5EA6\u6642\u9593 +-Iceland.generic.long=\u683C\u6797\u5A01\u6CBB\u6642\u9593 +-Indian/Antananarivo.generic.long=\u6771\u975E\u6642\u9593 +-Indian/Chagos.generic.long=\u82F1\u5C6C\u5370\u5EA6\u6D0B\u5730\u5340 +-Indian/Christmas.generic.long=\u8056\u8A95\u5CF6\u6642\u9593 +-Indian/Cocos.generic.long=\u53EF\u53EF\u65AF\u7FA4\u5CF6\u6642\u9593 +-Indian/Comoro.generic.long=\u6771\u975E\u6642\u9593 +-Indian/Kerguelen.generic.long=\u6CD5\u570B\u5357\u534A\u7403\u53CA\u5357\u6975\u5C6C\u5730\u6642\u9593 +-Indian/Mahe.generic.long=\u585E\u5E2D\u723E\u7FA4\u5CF6\u6642\u9593 +-Indian/Maldives.generic.long=\u99AC\u723E\u5730\u592B\u6642\u9593 +-Indian/Mauritius.generic.long=\u6469\u91CC\u897F\u65AF\u6642\u9593 +-Indian/Mayotte.generic.long=\u6771\u975E\u6642\u9593 +-Indian/Reunion.generic.long=\u7559\u5C3C\u65FA\u5CF6\u6642\u9593 +-Iran.generic.long=\u4F0A\u6717\u6642\u9593 +-Israel.generic.long=\u4EE5\u8272\u5217\u6642\u9593 +-JST.generic.long=\u65E5\u672C\u6642\u9593 +-Jamaica.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-Japan.generic.long=\u65E5\u672C\u6642\u9593 +-Kwajalein.generic.long=\u99AC\u7D39\u723E\u7FA4\u5CF6\u6642\u9593 +-Libya.generic.long=\u6771\u6b50\u6642\u9593 +-MET.generic.long=MET +-MIT.generic.long=\u897F\u85A9\u6469\u4E9E\u6642\u9593 +-MST.generic.long=\u7f8e\u570b\u5c71\u5340\u6642\u9593 +-MST7MDT.generic.long=\u7f8e\u570b\u5c71\u5340\u6642\u9593 +-Mexico/BajaNorte.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-Mexico/BajaSur.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-Mexico/General.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-NET.generic.long=\u4E9E\u7F8E\u5C3C\u4E9E\u6642\u9593 +-NST.generic.long=\u7D10\u897F\u862D\u6642\u9593 +-NZ-CHAT.generic.long=\u67E5\u5766\u6642\u9593 +-NZ.generic.long=\u7D10\u897F\u862D\u6642\u9593 +-Navajo.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-PLT.generic.long=\u5DF4\u57FA\u65AF\u5766\u6642\u9593 +-PNT.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-PRC.generic.long=\u4E2D\u570B\u6642\u9593 +-PRT.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-PST.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-PST8PDT.generic.long=\u592a\u5e73\u6d0b\u6642\u9593 +-Pacific/Apia.generic.long=\u897F\u85A9\u6469\u4E9E\u6642\u9593 +-Pacific/Auckland.generic.long=\u7D10\u897F\u862D\u6642\u9593 +-Pacific/Chatham.generic.long=\u67E5\u5766\u6642\u9593 +-Pacific/Chuuk.daylight.long=\u695A\u514B\u590F\u4EE4\u6642\u9593 +-Pacific/Chuuk.generic.long=\u695A\u514B\u6642\u9593 +-Pacific/Chuuk.standard.long=\u695A\u514B\u6642\u9593 +-Pacific/Easter.generic.long=\u5FA9\u6D3B\u5CF6\u6642\u9593 +-Pacific/Efate.generic.long=\u74E6\u5974\u963F\u5716\u6642\u9593 +-Pacific/Enderbury.generic.long=\u83F2\u5C3C\u514B\u65AF\u7FA4\u5CF6\u6642\u9593 +-Pacific/Fakaofo.generic.long=\u6258\u514B\u52DE\u7FA4\u5CF6\u6642\u9593 +-Pacific/Fiji.generic.long=\u6590\u6FDF\u6642\u9593 +-Pacific/Funafuti.generic.long=\u5410\u74E6\u9B6F\u6642\u9593 +-Pacific/Galapagos.generic.long=\u52A0\u62C9\u5DF4\u54E5\u6642\u9593 +-Pacific/Gambier.generic.long=\u7518\u6BD4\u723E\u6642\u9593 +-Pacific/Guadalcanal.generic.long=\u6240\u7F85\u9580\u7FA4\u5CF6\u6642\u9593 +-Pacific/Guam.generic.long=\u67E5\u83AB\u7F85\u6642\u9593 +-Pacific/Honolulu.generic.long=\u590F\u5A01\u5937\u6642\u9593 +-Pacific/Johnston.generic.long=\u590F\u5A01\u5937\u6642\u9593 +-Pacific/Kiritimati.generic.long=\u5217\u5DBC\u7FA4\u5CF6\u6642\u9593 +-Pacific/Kosrae.generic.long=Kosrae \u6642\u9593 +-Pacific/Kwajalein.generic.long=\u99AC\u7D39\u723E\u7FA4\u5CF6\u6642\u9593 +-Pacific/Majuro.generic.long=\u99AC\u7D39\u723E\u7FA4\u5CF6\u6642\u9593 +-Pacific/Marquesas.generic.long=\u99AC\u514B\u85A9\u65AF\u6642\u9593 +-Pacific/Midway.generic.long=\u85A9\u6469\u4E9E\u6642\u9593 +-Pacific/Nauru.generic.long=\u8AFE\u9B6F\u6642\u9593 +-Pacific/Niue.generic.long=\u7D10\u5A01\u5CF6\u6642\u9593 +-Pacific/Norfolk.generic.long=\u8AFE\u798F\u514B\u6642\u9593 +-Pacific/Noumea.generic.long=\u65B0\u52A0\u52D2\u591A\u5C3C\u4E9E\u6642\u9593 +-Pacific/Pago_Pago.generic.long=\u85A9\u6469\u4E9E\u6642\u9593 +-Pacific/Palau.generic.long=\u5E1B\u7409\u6642\u9593 +-Pacific/Pitcairn.generic.long=\u76AE\u7279\u5EB7\u6642\u9593 +-Pacific/Pohnpei.daylight.long=\u6CE2\u7D0D\u4F69\u590F\u4EE4\u6642\u9593 +-Pacific/Pohnpei.generic.long=\u6CE2\u7D0D\u4F69\u5CF6\u6642\u9593 +-Pacific/Pohnpei.standard.long=\u6CE2\u7D0D\u4F69\u6642\u9593 +-Pacific/Ponape.daylight.long=\u6CE2\u7D0D\u4F69\u590F\u4EE4\u6642\u9593 +-Pacific/Ponape.generic.long=\u6CE2\u7D0D\u4F69\u5CF6\u6642\u9593 +-Pacific/Ponape.standard.long=\u6CE2\u7D0D\u4F69\u6642\u9593 +-Pacific/Port_Moresby.generic.long=\u5DF4\u5E03\u4E9E\u65B0\u5E7E\u5167\u4E9E\u6642\u9593 +-Pacific/Rarotonga.generic.long=\u5EAB\u514B\u7FA4\u5CF6\u6642\u9593 +-Pacific/Saipan.generic.long=\u67E5\u83AB\u7F85\u6642\u9593 +-Pacific/Samoa.generic.long=\u85A9\u6469\u4E9E\u6642\u9593 +-Pacific/Tahiti.generic.long=\u5927\u6EAA\u5730\u6642\u9593 +-Pacific/Tarawa.generic.long=\u5409\u4F2F\u7279\u7FA4\u5CF6\u6642\u9593 +-Pacific/Tongatapu.generic.long=\u6771\u52A0\u6642\u9593 +-Pacific/Truk.daylight.long=\u695A\u514B\u590F\u4EE4\u6642\u9593 +-Pacific/Truk.generic.long=\u695A\u514B\u6642\u9593 +-Pacific/Truk.standard.long=\u695A\u514B\u6642\u9593 +-Pacific/Wake.generic.long=\u5A01\u514B\u6642\u9593 +-Pacific/Wallis.generic.long=\u74E6\u5229\u65AF\u53CA\u798F\u675C\u7D0D\u7FA4\u5CF6\u6642\u9593 +-Pacific/Yap.daylight.long=\u695A\u514B\u590F\u4EE4\u6642\u9593 +-Pacific/Yap.generic.long=\u695A\u514B\u6642\u9593 +-Pacific/Yap.standard.long=\u695A\u514B\u6642\u9593 +-Poland.generic.long=\u4E2D\u6B50\u6642\u9593 +-Portugal.generic.long=\u897F\u6B50\u6642\u9593 +-ROK.generic.long=\u97D3\u570B\u6642\u9593 +-SST.generic.long=\u6240\u7F85\u9580\u7FA4\u5CF6\u6642\u9593 +-Singapore.generic.long=\u65B0\u52A0\u5761\u6642\u9593 +-SystemV/AST4.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-SystemV/AST4ADT.generic.long=\u5927\u897F\u6D0B\u6642\u9593 +-SystemV/CST6.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-SystemV/CST6CDT.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-SystemV/EST5.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-SystemV/EST5EDT.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-SystemV/HST10.generic.long=\u590F\u5A01\u5937\u6642\u9593 +-SystemV/MST7.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-SystemV/MST7MDT.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-SystemV/PST8.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-SystemV/PST8PDT.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-SystemV/YST9.generic.long=\u963F\u62C9\u65AF\u52A0\u6642\u9593 +-SystemV/YST9YDT.generic.long=\u963F\u62C9\u65AF\u52A0\u6642\u9593 +-Turkey.generic.long=\u6771\u6B50\u6642\u9593 +-UCT.generic.long=\u5354\u8ABF\u4E16\u754C\u6642\u9593 +-US/Alaska.generic.long=\u963F\u62C9\u65AF\u52A0\u6642\u9593 +-US/Aleutian.generic.long=\u590F\u5A01\u5937-\u963F\u7559\u7533\u6642\u9593 +-US/Arizona.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-US/Central.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-US/East-Indiana.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-US/Eastern.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-US/Hawaii.generic.long=\u590F\u5A01\u5937\u6642\u9593 +-US/Indiana-Starke.generic.long=\u7F8E\u570B\u4E2D\u90E8\u6642\u9593 +-US/Michigan.generic.long=\u7F8E\u570B\u6771\u90E8\u6642\u9593 +-US/Mountain.generic.long=\u7F8E\u570B\u5C71\u5340\u6642\u9593 +-US/Pacific-New.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-US/Pacific.generic.long=\u592A\u5E73\u6D0B\u6642\u9593 +-US/Samoa.generic.long=\u85A9\u6469\u4E9E\u6642\u9593 +-UTC.generic.long=\u5354\u8ABF\u4E16\u754C\u6642\u9593 +-Universal.generic.long=\u5354\u8ABF\u4E16\u754C\u6642\u9593 +-VST.generic.long=\u5370\u5EA6\u652F\u90A3\u6642\u9593 +-W-SU.generic.long=\u83AB\u65AF\u79D1\u6642\u9593 +-WET.generic.long=\u897f\u6b50\u6642\u9593 +-Zulu.generic.long=\u5354\u8ABF\u4E16\u754C\u6642\u9593 +--- ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_zh_TW_short.properties Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/sun/util/resources/TimeZone/TimeZoneNames/TimeZoneNames_zh_TW_short.properties Thu Jan 01 00:00:00 1970 +0000 +@@ -1,1743 +0,0 @@ +-ACT.daylight.short=CST +-ACT.generic.short=CT +-ACT.standard.short=CST +-AET.daylight.short=EST +-AET.generic.short=ET +-AET.standard.short=EST +-Africa/Abidjan.daylight.short=GMT +-Africa/Abidjan.generic.short=GMT +-Africa/Abidjan.standard.short=GMT +-Africa/Accra.daylight.short=GHST +-Africa/Accra.generic.short=GMT +-Africa/Accra.standard.short=GMT +-Africa/Addis_Ababa.daylight.short=EAST +-Africa/Addis_Ababa.generic.short=EAT +-Africa/Addis_Ababa.standard.short=EAT +-Africa/Algiers.daylight.short=CEST +-Africa/Algiers.generic.short=CET +-Africa/Algiers.standard.short=CET +-Africa/Asmara.daylight.short=EAST +-Africa/Asmara.generic.short=EAT +-Africa/Asmara.standard.short=EAT +-Africa/Asmera.daylight.short=EAST +-Africa/Asmera.generic.short=EAT +-Africa/Asmera.standard.short=EAT +-Africa/Bamako.daylight.short=GMT +-Africa/Bamako.generic.short=GMT +-Africa/Bamako.standard.short=GMT +-Africa/Bangui.daylight.short=WAST +-Africa/Bangui.generic.short=WAT +-Africa/Bangui.standard.short=WAT +-Africa/Banjul.daylight.short=GMT +-Africa/Banjul.generic.short=GMT +-Africa/Banjul.standard.short=GMT +-Africa/Bissau.daylight.short=GMT +-Africa/Bissau.generic.short=GMT +-Africa/Bissau.standard.short=GMT +-Africa/Blantyre.daylight.short=CAST +-Africa/Blantyre.generic.short=CAT +-Africa/Blantyre.standard.short=CAT +-Africa/Brazzaville.daylight.short=WAST +-Africa/Brazzaville.generic.short=WAT +-Africa/Brazzaville.standard.short=WAT +-Africa/Bujumbura.daylight.short=CAST +-Africa/Bujumbura.generic.short=CAT +-Africa/Bujumbura.standard.short=CAT +-Africa/Cairo.daylight.short=EEST +-Africa/Cairo.generic.short=EET +-Africa/Cairo.standard.short=EET +-Africa/Casablanca.daylight.short=WEST +-Africa/Casablanca.generic.short=WET +-Africa/Casablanca.standard.short=WET +-Africa/Ceuta.daylight.short=CEST +-Africa/Ceuta.generic.short=CET +-Africa/Ceuta.standard.short=CET +-Africa/Conakry.daylight.short=GMT +-Africa/Conakry.generic.short=GMT +-Africa/Conakry.standard.short=GMT +-Africa/Dakar.daylight.short=GMT +-Africa/Dakar.generic.short=GMT +-Africa/Dakar.standard.short=GMT +-Africa/Dar_es_Salaam.daylight.short=EAST +-Africa/Dar_es_Salaam.generic.short=EAT +-Africa/Dar_es_Salaam.standard.short=EAT +-Africa/Djibouti.daylight.short=EAST +-Africa/Djibouti.generic.short=EAT +-Africa/Djibouti.standard.short=EAT +-Africa/Douala.daylight.short=WAST +-Africa/Douala.generic.short=WAT +-Africa/Douala.standard.short=WAT +-Africa/El_Aaiun.daylight.short=WEST +-Africa/El_Aaiun.generic.short=WET +-Africa/El_Aaiun.standard.short=WET +-Africa/Freetown.daylight.short=SLST +-Africa/Freetown.generic.short=SLT +-Africa/Freetown.standard.short=GMT +-Africa/Gaborone.daylight.short=CAST +-Africa/Gaborone.generic.short=CAT +-Africa/Gaborone.standard.short=CAT +-Africa/Harare.daylight.short=CAST +-Africa/Harare.generic.short=CAT +-Africa/Harare.standard.short=CAT +-Africa/Johannesburg.daylight.short=SAST +-Africa/Johannesburg.generic.short=SAT +-Africa/Johannesburg.standard.short=SAST +-Africa/Juba.daylight.short=EAST +-Africa/Juba.generic.short=EAT +-Africa/Juba.standard.short=EAT +-Africa/Kampala.daylight.short=EAST +-Africa/Kampala.generic.short=EAT +-Africa/Kampala.standard.short=EAT +-Africa/Khartoum.daylight.short=EAST +-Africa/Khartoum.generic.short=EAT +-Africa/Khartoum.standard.short=EAT +-Africa/Kigali.daylight.short=CAST +-Africa/Kigali.generic.short=CAT +-Africa/Kigali.standard.short=CAT +-Africa/Kinshasa.daylight.short=WAST +-Africa/Kinshasa.generic.short=WAT +-Africa/Kinshasa.standard.short=WAT +-Africa/Lagos.daylight.short=WAST +-Africa/Lagos.generic.short=WAT +-Africa/Lagos.standard.short=WAT +-Africa/Libreville.daylight.short=WAST +-Africa/Libreville.generic.short=WAT +-Africa/Libreville.standard.short=WAT +-Africa/Lome.daylight.short=GMT +-Africa/Lome.generic.short=GMT +-Africa/Lome.standard.short=GMT +-Africa/Luanda.daylight.short=WAST +-Africa/Luanda.generic.short=WAT +-Africa/Luanda.standard.short=WAT +-Africa/Lubumbashi.daylight.short=CAST +-Africa/Lubumbashi.generic.short=CAT +-Africa/Lubumbashi.standard.short=CAT +-Africa/Lusaka.daylight.short=CAST +-Africa/Lusaka.generic.short=CAT +-Africa/Lusaka.standard.short=CAT +-Africa/Malabo.daylight.short=WAST +-Africa/Malabo.generic.short=WAT +-Africa/Malabo.standard.short=WAT +-Africa/Maputo.daylight.short=CAST +-Africa/Maputo.generic.short=CAT +-Africa/Maputo.standard.short=CAT +-Africa/Maseru.daylight.short=SAST +-Africa/Maseru.generic.short=SAT +-Africa/Maseru.standard.short=SAST +-Africa/Mbabane.daylight.short=SAST +-Africa/Mbabane.generic.short=SAT +-Africa/Mbabane.standard.short=SAST +-Africa/Mogadishu.daylight.short=EAST +-Africa/Mogadishu.generic.short=EAT +-Africa/Mogadishu.standard.short=EAT +-Africa/Monrovia.daylight.short=GMT +-Africa/Monrovia.generic.short=GMT +-Africa/Monrovia.standard.short=GMT +-Africa/Nairobi.daylight.short=EAST +-Africa/Nairobi.generic.short=EAT +-Africa/Nairobi.standard.short=EAT +-Africa/Ndjamena.daylight.short=WAST +-Africa/Ndjamena.generic.short=WAT +-Africa/Ndjamena.standard.short=WAT +-Africa/Niamey.daylight.short=WAST +-Africa/Niamey.generic.short=WAT +-Africa/Niamey.standard.short=WAT +-Africa/Nouakchott.daylight.short=GMT +-Africa/Nouakchott.generic.short=GMT +-Africa/Nouakchott.standard.short=GMT +-Africa/Ouagadougou.daylight.short=GMT +-Africa/Ouagadougou.generic.short=GMT +-Africa/Ouagadougou.standard.short=GMT +-Africa/Porto-Novo.daylight.short=WAST +-Africa/Porto-Novo.generic.short=WAT +-Africa/Porto-Novo.standard.short=WAT +-Africa/Sao_Tome.daylight.short=GMT +-Africa/Sao_Tome.generic.short=GMT +-Africa/Sao_Tome.standard.short=GMT +-Africa/Timbuktu.daylight.short=GMT +-Africa/Timbuktu.generic.short=GMT +-Africa/Timbuktu.standard.short=GMT +-Africa/Tripoli.daylight.short=EEST +-Africa/Tripoli.generic.short=EET +-Africa/Tripoli.standard.short=EET +-Africa/Tunis.daylight.short=CEST +-Africa/Tunis.generic.short=CET +-Africa/Tunis.standard.short=CET +-Africa/Windhoek.daylight.short=WAST +-Africa/Windhoek.generic.short=WAT +-Africa/Windhoek.standard.short=WAT +-AGT.daylight.short=ARST +-AGT.generic.short=ART +-AGT.standard.short=ART +-America/Adak.daylight.short=HADT +-America/Adak.generic.short=HAT +-America/Adak.standard.short=HAST +-America/Anchorage.daylight.short=AKDT +-America/Anchorage.generic.short=AKT +-America/Anchorage.standard.short=AKST +-America/Anguilla.daylight.short=ADT +-America/Anguilla.generic.short=AT +-America/Anguilla.standard.short=AST +-America/Antigua.daylight.short=ADT +-America/Antigua.generic.short=AT +-America/Antigua.standard.short=AST +-America/Araguaina.daylight.short=BRST +-America/Araguaina.generic.short=BRT +-America/Araguaina.standard.short=BRT +-America/Argentina/Buenos_Aires.daylight.short=ARST +-America/Argentina/Buenos_Aires.generic.short=ART +-America/Argentina/Buenos_Aires.standard.short=ART +-America/Argentina/Catamarca.daylight.short=ARST +-America/Argentina/Catamarca.generic.short=ART +-America/Argentina/Catamarca.standard.short=ART +-America/Argentina/ComodRivadavia.daylight.short=ARST +-America/Argentina/ComodRivadavia.generic.short=ART +-America/Argentina/ComodRivadavia.standard.short=ART +-America/Argentina/Cordoba.daylight.short=ARST +-America/Argentina/Cordoba.generic.short=ART +-America/Argentina/Cordoba.standard.short=ART +-America/Argentina/Jujuy.daylight.short=ARST +-America/Argentina/Jujuy.generic.short=ART +-America/Argentina/Jujuy.standard.short=ART +-America/Argentina/La_Rioja.daylight.short=ARST +-America/Argentina/La_Rioja.generic.short=ART +-America/Argentina/La_Rioja.standard.short=ART +-America/Argentina/Mendoza.daylight.short=ARST +-America/Argentina/Mendoza.generic.short=ART +-America/Argentina/Mendoza.standard.short=ART +-America/Argentina/Rio_Gallegos.daylight.short=ARST +-America/Argentina/Rio_Gallegos.generic.short=ART +-America/Argentina/Rio_Gallegos.standard.short=ART +-America/Argentina/Salta.daylight.short=ARST +-America/Argentina/Salta.generic.short=ART +-America/Argentina/Salta.standard.short=ART +-America/Argentina/San_Juan.daylight.short=ARST +-America/Argentina/San_Juan.generic.short=ART +-America/Argentina/San_Juan.standard.short=ART +-America/Argentina/San_Luis.daylight.short=ARST +-America/Argentina/San_Luis.generic.short=ART +-America/Argentina/San_Luis.standard.short=ART +-America/Argentina/Tucuman.daylight.short=ARST +-America/Argentina/Tucuman.generic.short=ART +-America/Argentina/Tucuman.standard.short=ART +-America/Argentina/Ushuaia.daylight.short=ARST +-America/Argentina/Ushuaia.generic.short=ART +-America/Argentina/Ushuaia.standard.short=ART +-America/Aruba.daylight.short=ADT +-America/Aruba.generic.short=AT +-America/Aruba.standard.short=AST +-America/Asuncion.daylight.short=PYST +-America/Asuncion.generic.short=PYT +-America/Asuncion.standard.short=PYT +-America/Atikokan.daylight.short=EDT +-America/Atikokan.generic.short=ET +-America/Atikokan.standard.short=EST +-America/Atka.daylight.short=HADT +-America/Atka.generic.short=HAT +-America/Atka.standard.short=HAST +-America/Bahia_Banderas.daylight.short=CDT +-America/Bahia_Banderas.generic.short=CT +-America/Bahia_Banderas.standard.short=CST +-America/Bahia.daylight.short=BRST +-America/Bahia.generic.short=BRT +-America/Bahia.standard.short=BRT +-America/Barbados.daylight.short=ADT +-America/Barbados.generic.short=AT +-America/Barbados.standard.short=AST +-America/Belem.daylight.short=BRST +-America/Belem.generic.short=BRT +-America/Belem.standard.short=BRT +-America/Belize.daylight.short=CDT +-America/Belize.generic.short=CT +-America/Belize.standard.short=CST +-America/Blanc-Sablon.daylight.short=ADT +-America/Blanc-Sablon.generic.short=AT +-America/Blanc-Sablon.standard.short=AST +-America/Boa_Vista.daylight.short=AMST +-America/Boa_Vista.generic.short=AMT +-America/Boa_Vista.standard.short=AMT +-America/Bogota.daylight.short=COST +-America/Bogota.generic.short=COT +-America/Bogota.standard.short=COT +-America/Boise.daylight.short=MDT +-America/Boise.generic.short=MT +-America/Boise.standard.short=MST +-America/Buenos_Aires.daylight.short=ARST +-America/Buenos_Aires.generic.short=ART +-America/Buenos_Aires.standard.short=ART +-America/Cambridge_Bay.daylight.short=MDT +-America/Cambridge_Bay.generic.short=MT +-America/Cambridge_Bay.standard.short=MST +-America/Campo_Grande.daylight.short=AMST +-America/Campo_Grande.generic.short=AMT +-America/Campo_Grande.standard.short=AMT +-America/Cancun.daylight.short=CDT +-America/Cancun.generic.short=CT +-America/Cancun.standard.short=CST +-America/Caracas.daylight.short=VEST +-America/Caracas.generic.short=VET +-America/Caracas.standard.short=VET +-America/Catamarca.daylight.short=ARST +-America/Catamarca.generic.short=ART +-America/Catamarca.standard.short=ART +-America/Cayenne.daylight.short=GFST +-America/Cayenne.generic.short=GFT +-America/Cayenne.standard.short=GFT +-America/Cayman.daylight.short=EDT +-America/Cayman.generic.short=ET +-America/Cayman.standard.short=EST +-America/Chicago.daylight.short=CDT +-America/Chicago.generic.short=CT +-America/Chicago.standard.short=CST +-America/Chihuahua.daylight.short=MDT +-America/Chihuahua.generic.short=MT +-America/Chihuahua.standard.short=MST +-America/Coral_Harbour.daylight.short=EDT +-America/Coral_Harbour.generic.short=ET +-America/Coral_Harbour.standard.short=EST +-America/Cordoba.daylight.short=ARST +-America/Cordoba.generic.short=ART +-America/Cordoba.standard.short=ART +-America/Costa_Rica.daylight.short=CDT +-America/Costa_Rica.generic.short=CT +-America/Costa_Rica.standard.short=CST +-America/Creston.daylight.short=MDT +-America/Creston.generic.short=MT +-America/Creston.standard.short=MST +-America/Cuiaba.daylight.short=AMST +-America/Cuiaba.generic.short=AMT +-America/Cuiaba.standard.short=AMT +-America/Curacao.daylight.short=ADT +-America/Curacao.generic.short=AT +-America/Curacao.standard.short=AST +-America/Danmarkshavn.daylight.short=GMT +-America/Danmarkshavn.generic.short=GMT +-America/Danmarkshavn.standard.short=GMT +-America/Dawson_Creek.daylight.short=MDT +-America/Dawson_Creek.generic.short=MT +-America/Dawson_Creek.standard.short=MST +-America/Dawson.daylight.short=PDT +-America/Dawson.generic.short=PT +-America/Dawson.standard.short=PST +-America/Denver.daylight.short=MDT +-America/Denver.generic.short=MT +-America/Denver.standard.short=MST +-America/Detroit.daylight.short=EDT +-America/Detroit.generic.short=ET +-America/Detroit.standard.short=EST +-America/Dominica.daylight.short=ADT +-America/Dominica.generic.short=AT +-America/Dominica.standard.short=AST +-America/Edmonton.daylight.short=MDT +-America/Edmonton.generic.short=MT +-America/Edmonton.standard.short=MST +-America/Eirunepe.daylight.short=ACST +-America/Eirunepe.generic.short=ACT +-America/Eirunepe.standard.short=ACT +-America/El_Salvador.daylight.short=CDT +-America/El_Salvador.generic.short=CT +-America/El_Salvador.standard.short=CST +-America/Ensenada.daylight.short=PDT +-America/Ensenada.generic.short=PT +-America/Ensenada.standard.short=PST +-America/Fortaleza.daylight.short=BRST +-America/Fortaleza.generic.short=BRT +-America/Fortaleza.standard.short=BRT +-America/Fort_Wayne.daylight.short=EDT +-America/Fort_Wayne.generic.short=ET +-America/Fort_Wayne.standard.short=EST +-America/Glace_Bay.daylight.short=ADT +-America/Glace_Bay.generic.short=AT +-America/Glace_Bay.standard.short=AST +-America/Godthab.daylight.short=WGST +-America/Godthab.generic.short=WGT +-America/Godthab.standard.short=WGT +-America/Goose_Bay.daylight.short=ADT +-America/Goose_Bay.generic.short=AT +-America/Goose_Bay.standard.short=AST +-America/Grand_Turk.daylight.short=EDT +-America/Grand_Turk.generic.short=ET +-America/Grand_Turk.standard.short=EST +-America/Grenada.daylight.short=ADT +-America/Grenada.generic.short=AT +-America/Grenada.standard.short=AST +-America/Guadeloupe.daylight.short=ADT +-America/Guadeloupe.generic.short=AT +-America/Guadeloupe.standard.short=AST +-America/Guatemala.daylight.short=CDT +-America/Guatemala.generic.short=CT +-America/Guatemala.standard.short=CST +-America/Guayaquil.daylight.short=ECST +-America/Guayaquil.generic.short=ECT +-America/Guayaquil.standard.short=ECT +-America/Guyana.daylight.short=GYST +-America/Guyana.generic.short=GYT +-America/Guyana.standard.short=GYT +-America/Halifax.daylight.short=ADT +-America/Halifax.generic.short=AT +-America/Halifax.standard.short=AST +-America/Havana.daylight.short=CDT +-America/Havana.generic.short=CT +-America/Havana.standard.short=CST +-America/Hermosillo.daylight.short=MDT +-America/Hermosillo.generic.short=MT +-America/Hermosillo.standard.short=MST +-America/Indiana/Indianapolis.daylight.short=EDT +-America/Indiana/Indianapolis.generic.short=ET +-America/Indiana/Indianapolis.standard.short=EST +-America/Indiana/Knox.daylight.short=CDT +-America/Indiana/Knox.generic.short=CT +-America/Indiana/Knox.standard.short=CST +-America/Indiana/Marengo.daylight.short=EDT +-America/Indiana/Marengo.generic.short=ET +-America/Indiana/Marengo.standard.short=EST +-America/Indiana/Petersburg.daylight.short=EDT +-America/Indiana/Petersburg.generic.short=ET +-America/Indiana/Petersburg.standard.short=EST +-America/Indianapolis.daylight.short=EDT +-America/Indianapolis.generic.short=ET +-America/Indianapolis.standard.short=EST +-America/Indiana/Tell_City.daylight.short=CDT +-America/Indiana/Tell_City.generic.short=CT +-America/Indiana/Tell_City.standard.short=CST +-America/Indiana/Vevay.daylight.short=EDT +-America/Indiana/Vevay.generic.short=ET +-America/Indiana/Vevay.standard.short=EST +-America/Indiana/Vincennes.daylight.short=EDT +-America/Indiana/Vincennes.generic.short=ET +-America/Indiana/Vincennes.standard.short=EST +-America/Indiana/Winamac.daylight.short=EDT +-America/Indiana/Winamac.generic.short=ET +-America/Indiana/Winamac.standard.short=EST +-America/Inuvik.daylight.short=MDT +-America/Inuvik.generic.short=MT +-America/Inuvik.standard.short=MST +-America/Iqaluit.daylight.short=EDT +-America/Iqaluit.generic.short=ET +-America/Iqaluit.standard.short=EST +-America/Jamaica.daylight.short=EDT +-America/Jamaica.generic.short=ET +-America/Jamaica.standard.short=EST +-America/Jujuy.daylight.short=ARST +-America/Jujuy.generic.short=ART +-America/Jujuy.standard.short=ART +-America/Juneau.daylight.short=AKDT +-America/Juneau.generic.short=AKT +-America/Juneau.standard.short=AKST +-America/Kentucky/Louisville.daylight.short=EDT +-America/Kentucky/Louisville.generic.short=ET +-America/Kentucky/Louisville.standard.short=EST +-America/Kentucky/Monticello.daylight.short=EDT +-America/Kentucky/Monticello.generic.short=ET +-America/Kentucky/Monticello.standard.short=EST +-America/Knox_IN.daylight.short=CDT +-America/Knox_IN.generic.short=CT +-America/Knox_IN.standard.short=CST +-America/Kralendijk.daylight.short=ADT +-America/Kralendijk.generic.short=AT +-America/Kralendijk.standard.short=AST +-America/La_Paz.daylight.short=BOST +-America/La_Paz.generic.short=BOT +-America/La_Paz.standard.short=BOT +-America/Lima.daylight.short=PEST +-America/Lima.generic.short=PET +-America/Lima.standard.short=PET +-America/Los_Angeles.daylight.short=PDT +-America/Los_Angeles.generic.short=PT +-America/Los_Angeles.standard.short=PST +-America/Louisville.daylight.short=EDT +-America/Louisville.generic.short=ET +-America/Louisville.standard.short=EST +-America/Lower_Princes.daylight.short=ADT +-America/Lower_Princes.generic.short=AT +-America/Lower_Princes.standard.short=AST +-America/Maceio.daylight.short=BRST +-America/Maceio.generic.short=BRT +-America/Maceio.standard.short=BRT +-America/Managua.daylight.short=CDT +-America/Managua.generic.short=CT +-America/Managua.standard.short=CST +-America/Manaus.daylight.short=AMST +-America/Manaus.generic.short=AMT +-America/Manaus.standard.short=AMT +-America/Marigot.daylight.short=ADT +-America/Marigot.generic.short=AT +-America/Marigot.standard.short=AST +-America/Martinique.daylight.short=ADT +-America/Martinique.generic.short=AT +-America/Martinique.standard.short=AST +-America/Matamoros.daylight.short=CDT +-America/Matamoros.generic.short=CT +-America/Matamoros.standard.short=CST +-America/Mazatlan.daylight.short=MDT +-America/Mazatlan.generic.short=MT +-America/Mazatlan.standard.short=MST +-America/Mendoza.daylight.short=ARST +-America/Mendoza.generic.short=ART +-America/Mendoza.standard.short=ART +-America/Menominee.daylight.short=CDT +-America/Menominee.generic.short=CT +-America/Menominee.standard.short=CST +-America/Merida.daylight.short=CDT +-America/Merida.generic.short=CT +-America/Merida.standard.short=CST +-America/Metlakatla.daylight.short=MeDT +-America/Metlakatla.generic.short=MeT +-America/Metlakatla.standard.short=MeST +-America/Mexico_City.daylight.short=CDT +-America/Mexico_City.generic.short=CT +-America/Mexico_City.standard.short=CST +-America/Miquelon.daylight.short=PMDT +-America/Miquelon.generic.short=PMT +-America/Miquelon.standard.short=PMST +-America/Moncton.daylight.short=ADT +-America/Moncton.generic.short=AT +-America/Moncton.standard.short=AST +-America/Monterrey.daylight.short=CDT +-America/Monterrey.generic.short=CT +-America/Monterrey.standard.short=CST +-America/Montevideo.daylight.short=UYST +-America/Montevideo.generic.short=UYT +-America/Montevideo.standard.short=UYT +-America/Montreal.daylight.short=EDT +-America/Montreal.generic.short=ET +-America/Montreal.standard.short=EST +-America/Montserrat.daylight.short=ADT +-America/Montserrat.generic.short=AT +-America/Montserrat.standard.short=AST +-America/Nassau.daylight.short=EDT +-America/Nassau.generic.short=ET +-America/Nassau.standard.short=EST +-America/New_York.daylight.short=EDT +-America/New_York.generic.short=ET +-America/New_York.standard.short=EST +-America/Nipigon.daylight.short=EDT +-America/Nipigon.generic.short=ET +-America/Nipigon.standard.short=EST +-America/Nome.daylight.short=AKDT +-America/Nome.generic.short=AKT +-America/Nome.standard.short=AKST +-America/Noronha.daylight.short=FNST +-America/Noronha.generic.short=FNT +-America/Noronha.standard.short=FNT +-America/North_Dakota/Beulah.daylight.short=CDT +-America/North_Dakota/Beulah.generic.short=CT +-America/North_Dakota/Beulah.standard.short=CST +-America/North_Dakota/Center.daylight.short=CDT +-America/North_Dakota/Center.generic.short=CT +-America/North_Dakota/Center.standard.short=CST +-America/North_Dakota/New_Salem.daylight.short=CDT +-America/North_Dakota/New_Salem.generic.short=CT +-America/North_Dakota/New_Salem.standard.short=CST +-America/Ojinaga.daylight.short=MDT +-America/Ojinaga.generic.short=MT +-America/Ojinaga.standard.short=MST +-America/Panama.daylight.short=EDT +-America/Panama.generic.short=ET +-America/Panama.standard.short=EST +-America/Pangnirtung.daylight.short=EDT +-America/Pangnirtung.generic.short=ET +-America/Pangnirtung.standard.short=EST +-America/Paramaribo.daylight.short=SRST +-America/Paramaribo.generic.short=SRT +-America/Paramaribo.standard.short=SRT +-America/Phoenix.daylight.short=MDT +-America/Phoenix.generic.short=MT +-America/Phoenix.standard.short=MST +-America/Port-au-Prince.daylight.short=EDT +-America/Port-au-Prince.generic.short=ET +-America/Port-au-Prince.standard.short=EST +-America/Porto_Acre.daylight.short=ACST +-America/Porto_Acre.generic.short=ACT +-America/Porto_Acre.standard.short=ACT +-America/Port_of_Spain.daylight.short=ADT +-America/Port_of_Spain.generic.short=AT +-America/Port_of_Spain.standard.short=AST +-America/Porto_Velho.daylight.short=AMST +-America/Porto_Velho.generic.short=AMT +-America/Porto_Velho.standard.short=AMT +-America/Puerto_Rico.daylight.short=ADT +-America/Puerto_Rico.generic.short=AT +-America/Puerto_Rico.standard.short=AST +-America/Rainy_River.daylight.short=CDT +-America/Rainy_River.generic.short=CT +-America/Rainy_River.standard.short=CST +-America/Rankin_Inlet.daylight.short=CDT +-America/Rankin_Inlet.generic.short=CT +-America/Rankin_Inlet.standard.short=CST +-America/Recife.daylight.short=BRST +-America/Recife.generic.short=BRT +-America/Recife.standard.short=BRT +-America/Regina.daylight.short=CDT +-America/Regina.generic.short=CT +-America/Regina.standard.short=CST +-America/Resolute.daylight.short=CDT +-America/Resolute.generic.short=CT +-America/Resolute.standard.short=CST +-America/Rio_Branco.daylight.short=ACST +-America/Rio_Branco.generic.short=ACT +-America/Rio_Branco.standard.short=ACT +-America/Rosario.daylight.short=ARST +-America/Rosario.generic.short=ART +-America/Rosario.standard.short=ART +-America/Santa_Isabel.daylight.short=PDT +-America/Santa_Isabel.generic.short=PT +-America/Santa_Isabel.standard.short=PST +-America/Santarem.daylight.short=BRST +-America/Santarem.generic.short=BRT +-America/Santarem.standard.short=BRT +-America/Santiago.daylight.short=CLST +-America/Santiago.generic.short=CLT +-America/Santiago.standard.short=CLT +-America/Santo_Domingo.daylight.short=ADT +-America/Santo_Domingo.generic.short=AT +-America/Santo_Domingo.standard.short=AST +-America/Sao_Paulo.daylight.short=BRST +-America/Sao_Paulo.generic.short=BRT +-America/Sao_Paulo.standard.short=BRT +-America/Scoresbysund.daylight.short=EGST +-America/Scoresbysund.generic.short=EGT +-America/Scoresbysund.standard.short=EGT +-America/Shiprock.daylight.short=MDT +-America/Shiprock.generic.short=MT +-America/Shiprock.standard.short=MST +-America/Sitka.daylight.short=AKDT +-America/Sitka.generic.short=AKT +-America/Sitka.standard.short=AKST +-America/St_Barthelemy.daylight.short=ADT +-America/St_Barthelemy.generic.short=AT +-America/St_Barthelemy.standard.short=AST +-America/St_Johns.daylight.short=NDT +-America/St_Johns.generic.short=NT +-America/St_Johns.standard.short=NST +-America/St_Kitts.daylight.short=ADT +-America/St_Kitts.generic.short=AT +-America/St_Kitts.standard.short=AST +-America/St_Lucia.daylight.short=ADT +-America/St_Lucia.generic.short=AT +-America/St_Lucia.standard.short=AST +-America/St_Thomas.daylight.short=ADT +-America/St_Thomas.generic.short=AT +-America/St_Thomas.standard.short=AST +-America/St_Vincent.daylight.short=ADT +-America/St_Vincent.generic.short=AT +-America/St_Vincent.standard.short=AST +-America/Swift_Current.daylight.short=CDT +-America/Swift_Current.generic.short=CT +-America/Swift_Current.standard.short=CST +-America/Tegucigalpa.daylight.short=CDT +-America/Tegucigalpa.generic.short=CT +-America/Tegucigalpa.standard.short=CST +-America/Thule.daylight.short=ADT +-America/Thule.generic.short=AT +-America/Thule.standard.short=AST +-America/Thunder_Bay.daylight.short=EDT +-America/Thunder_Bay.generic.short=ET +-America/Thunder_Bay.standard.short=EST +-America/Tijuana.daylight.short=PDT +-America/Tijuana.generic.short=PT +-America/Tijuana.standard.short=PST +-America/Toronto.daylight.short=EDT +-America/Toronto.generic.short=ET +-America/Toronto.standard.short=EST +-America/Tortola.daylight.short=ADT +-America/Tortola.generic.short=AT +-America/Tortola.standard.short=AST +-America/Vancouver.daylight.short=PDT +-America/Vancouver.generic.short=PT +-America/Vancouver.standard.short=PST +-America/Virgin.daylight.short=ADT +-America/Virgin.generic.short=AT +-America/Virgin.standard.short=AST +-America/Whitehorse.daylight.short=PDT +-America/Whitehorse.generic.short=PT +-America/Whitehorse.standard.short=PST +-America/Winnipeg.daylight.short=CDT +-America/Winnipeg.generic.short=CT +-America/Winnipeg.standard.short=CST +-America/Yakutat.daylight.short=AKDT +-America/Yakutat.generic.short=AKT +-America/Yakutat.standard.short=AKST +-America/Yellowknife.daylight.short=MDT +-America/Yellowknife.generic.short=MT +-America/Yellowknife.standard.short=MST +-Antarctica/Casey.daylight.short=WST +-Antarctica/Casey.generic.short=WT +-Antarctica/Casey.standard.short=WST +-Antarctica/Davis.daylight.short=DAVST +-Antarctica/Davis.generic.short=DAVT +-Antarctica/Davis.standard.short=DAVT +-Antarctica/DumontDUrville.daylight.short=DDUST +-Antarctica/DumontDUrville.generic.short=DDUT +-Antarctica/DumontDUrville.standard.short=DDUT +-Antarctica/Macquarie.daylight.short=MIST +-Antarctica/Macquarie.generic.short=MIST +-Antarctica/Macquarie.standard.short=MIST +-Antarctica/Mawson.daylight.short=MAWST +-Antarctica/Mawson.generic.short=MAWT +-Antarctica/Mawson.standard.short=MAWT +-Antarctica/McMurdo.daylight.short=NZDT +-Antarctica/McMurdo.generic.short=NZT +-Antarctica/McMurdo.standard.short=NZST +-Antarctica/Palmer.daylight.short=CLST +-Antarctica/Palmer.generic.short=CLT +-Antarctica/Palmer.standard.short=CLT +-Antarctica/Rothera.daylight.short=ROTST +-Antarctica/Rothera.generic.short=ROTT +-Antarctica/Rothera.standard.short=ROTT +-Antarctica/South_Pole.daylight.short=NZDT +-Antarctica/South_Pole.generic.short=NZT +-Antarctica/South_Pole.standard.short=NZST +-Antarctica/Syowa.daylight.short=SYOST +-Antarctica/Syowa.generic.short=SYOT +-Antarctica/Syowa.standard.short=SYOT +-Antarctica/Vostok.daylight.short=VOSST +-Antarctica/Vostok.generic.short=VOST +-Antarctica/Vostok.standard.short=VOST +-Arctic/Longyearbyen.daylight.short=CEST +-Arctic/Longyearbyen.generic.short=CET +-Arctic/Longyearbyen.standard.short=CET +-ART.daylight.short=EEST +-ART.generic.short=EET +-ART.standard.short=EET +-Asia/Aden.daylight.short=ADT +-Asia/Aden.generic.short=AT +-Asia/Aden.standard.short=AST +-Asia/Almaty.daylight.short=ALMST +-Asia/Almaty.generic.short=ALMT +-Asia/Almaty.standard.short=ALMT +-Asia/Amman.daylight.short=ADT +-Asia/Amman.generic.short=AT +-Asia/Amman.standard.short=AST +-Asia/Anadyr.daylight.short=ANAST +-Asia/Anadyr.generic.short=ANAT +-Asia/Anadyr.standard.short=ANAT +-Asia/Aqtau.daylight.short=AQTST +-Asia/Aqtau.generic.short=AQTT +-Asia/Aqtau.standard.short=AQTT +-Asia/Aqtobe.daylight.short=AQTST +-Asia/Aqtobe.generic.short=AQTT +-Asia/Aqtobe.standard.short=AQTT +-Asia/Ashgabat.daylight.short=TMST +-Asia/Ashgabat.generic.short=TMT +-Asia/Ashgabat.standard.short=TMT +-Asia/Ashkhabad.daylight.short=TMST +-Asia/Ashkhabad.generic.short=TMT +-Asia/Ashkhabad.standard.short=TMT +-Asia/Baghdad.daylight.short=ADT +-Asia/Baghdad.generic.short=AT +-Asia/Baghdad.standard.short=AST +-Asia/Bahrain.daylight.short=ADT +-Asia/Bahrain.generic.short=AT +-Asia/Bahrain.standard.short=AST +-Asia/Baku.daylight.short=AZST +-Asia/Baku.generic.short=AZT +-Asia/Baku.standard.short=AZT +-Asia/Bangkok.daylight.short=ICST +-Asia/Bangkok.generic.short=ICT +-Asia/Bangkok.standard.short=ICT +-Asia/Beirut.daylight.short=EEST +-Asia/Beirut.generic.short=EET +-Asia/Beirut.standard.short=EET +-Asia/Bishkek.daylight.short=KGST +-Asia/Bishkek.generic.short=KGT +-Asia/Bishkek.standard.short=KGT +-Asia/Brunei.daylight.short=BNST +-Asia/Brunei.generic.short=BNT +-Asia/Brunei.standard.short=BNT +-Asia/Calcutta.daylight.short=IDT +-Asia/Calcutta.generic.short=IT +-Asia/Calcutta.standard.short=IST +-Asia/Choibalsan.daylight.short=CHOST +-Asia/Choibalsan.generic.short=CHOT +-Asia/Choibalsan.standard.short=CHOT +-Asia/Chongqing.daylight.short=CDT +-Asia/Chongqing.generic.short=CT +-Asia/Chongqing.standard.short=CST +-Asia/Chungking.daylight.short=CDT +-Asia/Chungking.generic.short=CT +-Asia/Chungking.standard.short=CST +-Asia/Colombo.daylight.short=IDT +-Asia/Colombo.generic.short=IT +-Asia/Colombo.standard.short=IST +-Asia/Dacca.daylight.short=BDST +-Asia/Dacca.generic.short=BDT +-Asia/Dacca.standard.short=BDT +-Asia/Damascus.daylight.short=EEST +-Asia/Damascus.generic.short=EET +-Asia/Damascus.standard.short=EET +-Asia/Dhaka.daylight.short=BDST +-Asia/Dhaka.generic.short=BDT +-Asia/Dhaka.standard.short=BDT +-Asia/Dili.daylight.short=TLST +-Asia/Dili.generic.short=TLT +-Asia/Dili.standard.short=TLT +-Asia/Dubai.daylight.short=GDT +-Asia/Dubai.generic.short=GT +-Asia/Dubai.standard.short=GST +-Asia/Dushanbe.daylight.short=TJST +-Asia/Dushanbe.generic.short=TJT +-Asia/Dushanbe.standard.short=TJT +-Asia/Gaza.daylight.short=EEST +-Asia/Gaza.generic.short=EET +-Asia/Gaza.standard.short=EET +-Asia/Harbin.daylight.short=CDT +-Asia/Harbin.generic.short=CT +-Asia/Harbin.standard.short=CST +-Asia/Hebron.daylight.short=EEST +-Asia/Hebron.generic.short=EET +-Asia/Hebron.standard.short=EET +-Asia/Ho_Chi_Minh.daylight.short=ICST +-Asia/Ho_Chi_Minh.generic.short=ICT +-Asia/Ho_Chi_Minh.standard.short=ICT +-Asia/Hong_Kong.daylight.short=HKST +-Asia/Hong_Kong.generic.short=HKT +-Asia/Hong_Kong.standard.short=HKT +-Asia/Hovd.daylight.short=HOVST +-Asia/Hovd.generic.short=HOVT +-Asia/Hovd.standard.short=HOVT +-Asia/Irkutsk.daylight.short=IRKST +-Asia/Irkutsk.generic.short=IRKT +-Asia/Irkutsk.standard.short=IRKT +-Asia/Istanbul.daylight.short=EEST +-Asia/Istanbul.generic.short=EET +-Asia/Istanbul.standard.short=EET +-Asia/Jakarta.daylight.short=WIST +-Asia/Jakarta.generic.short=WIB +-Asia/Jakarta.standard.short=WIB +-Asia/Jayapura.daylight.short=EIST +-Asia/Jayapura.generic.short=WIT +-Asia/Jayapura.standard.short=WIT +-Asia/Jerusalem.daylight.short=IDT +-Asia/Jerusalem.generic.short=IT +-Asia/Jerusalem.standard.short=IST +-Asia/Kabul.daylight.short=AFST +-Asia/Kabul.generic.short=AFT +-Asia/Kabul.standard.short=AFT +-Asia/Kamchatka.daylight.short=PETST +-Asia/Kamchatka.generic.short=PETT +-Asia/Kamchatka.standard.short=PETT +-Asia/Karachi.daylight.short=PKST +-Asia/Karachi.generic.short=PKT +-Asia/Karachi.standard.short=PKT +-Asia/Kashgar.daylight.short=CDT +-Asia/Kashgar.generic.short=CT +-Asia/Kashgar.standard.short=CST +-Asia/Kathmandu.daylight.short=NPST +-Asia/Kathmandu.generic.short=NPT +-Asia/Kathmandu.standard.short=NPT +-Asia/Katmandu.daylight.short=NPST +-Asia/Katmandu.generic.short=NPT +-Asia/Katmandu.standard.short=NPT +-Asia/Khandyga.daylight.short=YAKST +-Asia/Khandyga.generic.short=YAKT +-Asia/Khandyga.standard.short=YAKT +-Asia/Kolkata.daylight.short=IDT +-Asia/Kolkata.generic.short=IT +-Asia/Kolkata.standard.short=IST +-Asia/Krasnoyarsk.daylight.short=KRAST +-Asia/Krasnoyarsk.generic.short=KRAT +-Asia/Krasnoyarsk.standard.short=KRAT +-Asia/Kuala_Lumpur.daylight.short=MYST +-Asia/Kuala_Lumpur.generic.short=MYT +-Asia/Kuala_Lumpur.standard.short=MYT +-Asia/Kuching.daylight.short=MYST +-Asia/Kuching.generic.short=MYT +-Asia/Kuching.standard.short=MYT +-Asia/Kuwait.daylight.short=ADT +-Asia/Kuwait.generic.short=AT +-Asia/Kuwait.standard.short=AST +-Asia/Macao.daylight.short=CDT +-Asia/Macao.generic.short=CT +-Asia/Macao.standard.short=CST +-Asia/Macau.daylight.short=CDT +-Asia/Macau.generic.short=CT +-Asia/Macau.standard.short=CST +-Asia/Magadan.daylight.short=MAGST +-Asia/Magadan.generic.short=MAGT +-Asia/Magadan.standard.short=MAGT +-Asia/Makassar.daylight.short=CIST +-Asia/Makassar.generic.short=WITA +-Asia/Makassar.standard.short=WITA +-Asia/Manila.daylight.short=PHST +-Asia/Manila.generic.short=PHT +-Asia/Manila.standard.short=PHT +-Asia/Muscat.daylight.short=GDT +-Asia/Muscat.generic.short=GT +-Asia/Muscat.standard.short=GST +-Asia/Nicosia.daylight.short=EEST +-Asia/Nicosia.generic.short=EET +-Asia/Nicosia.standard.short=EET +-Asia/Novokuznetsk.daylight.short=NOVST +-Asia/Novokuznetsk.generic.short=NOVT +-Asia/Novokuznetsk.standard.short=NOVT +-Asia/Novosibirsk.daylight.short=NOVST +-Asia/Novosibirsk.generic.short=NOVT +-Asia/Novosibirsk.standard.short=NOVT +-Asia/Omsk.daylight.short=OMSST +-Asia/Omsk.generic.short=OMST +-Asia/Omsk.standard.short=OMST +-Asia/Oral.daylight.short=ORAST +-Asia/Oral.generic.short=ORAT +-Asia/Oral.standard.short=ORAT +-Asia/Phnom_Penh.daylight.short=ICST +-Asia/Phnom_Penh.generic.short=ICT +-Asia/Phnom_Penh.standard.short=ICT +-Asia/Pontianak.daylight.short=WIST +-Asia/Pontianak.generic.short=WIB +-Asia/Pontianak.standard.short=WIB +-Asia/Pyongyang.daylight.short=KDT +-Asia/Pyongyang.generic.short=KT +-Asia/Pyongyang.standard.short=KST +-Asia/Qatar.daylight.short=ADT +-Asia/Qatar.generic.short=AT +-Asia/Qatar.standard.short=AST +-Asia/Qyzylorda.daylight.short=QYZST +-Asia/Qyzylorda.generic.short=QYZT +-Asia/Qyzylorda.standard.short=QYZT +-Asia/Rangoon.daylight.short=MMST +-Asia/Rangoon.generic.short=MMT +-Asia/Rangoon.standard.short=MMT +-Asia/Saigon.daylight.short=ICST +-Asia/Saigon.generic.short=ICT +-Asia/Saigon.standard.short=ICT +-Asia/Sakhalin.daylight.short=SAKST +-Asia/Sakhalin.generic.short=SAKT +-Asia/Sakhalin.standard.short=SAKT +-Asia/Samarkand.daylight.short=UZST +-Asia/Samarkand.generic.short=UZT +-Asia/Samarkand.standard.short=UZT +-Asia/Seoul.daylight.short=KDT +-Asia/Seoul.generic.short=KT +-Asia/Seoul.standard.short=KST +-Asia/Shanghai.daylight.short=CDT +-Asia/Shanghai.generic.short=CT +-Asia/Shanghai.standard.short=CST +-Asia/Singapore.daylight.short=SGST +-Asia/Singapore.generic.short=SGT +-Asia/Singapore.standard.short=SGT +-Asia/Taipei.daylight.short=TDT +-Asia/Taipei.generic.short=TT +-Asia/Taipei.standard.short=TST +-Asia/Tashkent.daylight.short=UZST +-Asia/Tashkent.generic.short=UZT +-Asia/Tashkent.standard.short=UZT +-Asia/Tbilisi.daylight.short=GEST +-Asia/Tbilisi.generic.short=GET +-Asia/Tbilisi.standard.short=GET +-Asia/Tehran.daylight.short=IRDT +-Asia/Tehran.generic.short=IRT +-Asia/Tehran.standard.short=IRST +-Asia/Tel_Aviv.daylight.short=IDT +-Asia/Tel_Aviv.generic.short=IT +-Asia/Tel_Aviv.standard.short=IST +-Asia/Thimbu.daylight.short=BTST +-Asia/Thimbu.generic.short=BTT +-Asia/Thimbu.standard.short=BTT +-Asia/Thimphu.daylight.short=BTST +-Asia/Thimphu.generic.short=BTT +-Asia/Thimphu.standard.short=BTT +-Asia/Tokyo.daylight.short=JDT +-Asia/Tokyo.generic.short=JT +-Asia/Tokyo.standard.short=JST +-Asia/Ujung_Pandang.daylight.short=CIST +-Asia/Ujung_Pandang.generic.short=WITA +-Asia/Ujung_Pandang.standard.short=WITA +-Asia/Ulaanbaatar.daylight.short=ULAST +-Asia/Ulaanbaatar.generic.short=ULAT +-Asia/Ulaanbaatar.standard.short=ULAT +-Asia/Ulan_Bator.daylight.short=ULAST +-Asia/Ulan_Bator.generic.short=ULAT +-Asia/Ulan_Bator.standard.short=ULAT +-Asia/Urumqi.daylight.short=CDT +-Asia/Urumqi.generic.short=CT +-Asia/Urumqi.standard.short=CST +-Asia/Ust-Nera.daylight.short=VLAST +-Asia/Ust-Nera.generic.short=VLAT +-Asia/Ust-Nera.standard.short=VLAT +-Asia/Vientiane.daylight.short=ICST +-Asia/Vientiane.generic.short=ICT +-Asia/Vientiane.standard.short=ICT +-Asia/Vladivostok.daylight.short=VLAST +-Asia/Vladivostok.generic.short=VLAT +-Asia/Vladivostok.standard.short=VLAT +-Asia/Yakutsk.daylight.short=YAKST +-Asia/Yakutsk.generic.short=YAKT +-Asia/Yakutsk.standard.short=YAKT +-Asia/Yekaterinburg.daylight.short=YEKST +-Asia/Yekaterinburg.generic.short=YEKT +-Asia/Yekaterinburg.standard.short=YEKT +-Asia/Yerevan.daylight.short=AMST +-Asia/Yerevan.generic.short=AMT +-Asia/Yerevan.standard.short=AMT +-AST.daylight.short=AKDT +-AST.generic.short=AKT +-AST.standard.short=AKST +-Atlantic/Azores.daylight.short=AZOST +-Atlantic/Azores.generic.short=AZOT +-Atlantic/Azores.standard.short=AZOT +-Atlantic/Bermuda.daylight.short=ADT +-Atlantic/Bermuda.generic.short=AT +-Atlantic/Bermuda.standard.short=AST +-Atlantic/Canary.daylight.short=WEST +-Atlantic/Canary.generic.short=WET +-Atlantic/Canary.standard.short=WET +-Atlantic/Cape_Verde.daylight.short=CVST +-Atlantic/Cape_Verde.generic.short=CVT +-Atlantic/Cape_Verde.standard.short=CVT +-Atlantic/Faeroe.daylight.short=WEST +-Atlantic/Faeroe.generic.short=WET +-Atlantic/Faeroe.standard.short=WET +-Atlantic/Faroe.daylight.short=WEST +-Atlantic/Faroe.generic.short=WET +-Atlantic/Faroe.standard.short=WET +-Atlantic/Jan_Mayen.daylight.short=CEST +-Atlantic/Jan_Mayen.generic.short=CET +-Atlantic/Jan_Mayen.standard.short=CET +-Atlantic/Madeira.daylight.short=WEST +-Atlantic/Madeira.generic.short=WET +-Atlantic/Madeira.standard.short=WET +-Atlantic/Reykjavik.daylight.short=GMT +-Atlantic/Reykjavik.generic.short=GMT +-Atlantic/Reykjavik.standard.short=GMT +-Atlantic/South_Georgia.daylight.short=GDT +-Atlantic/South_Georgia.generic.short=GT +-Atlantic/South_Georgia.standard.short=GST +-Atlantic/Stanley.daylight.short=FKST +-Atlantic/Stanley.generic.short=FKT +-Atlantic/Stanley.standard.short=FKT +-Atlantic/St_Helena.daylight.short=GMT +-Atlantic/St_Helena.generic.short=GMT +-Atlantic/St_Helena.standard.short=GMT +-Australia/ACT.daylight.short=EST +-Australia/ACT.generic.short=ET +-Australia/ACT.standard.short=EST +-Australia/Adelaide.daylight.short=CST +-Australia/Adelaide.generic.short=CT +-Australia/Adelaide.standard.short=CST +-Australia/Brisbane.daylight.short=EST +-Australia/Brisbane.generic.short=ET +-Australia/Brisbane.standard.short=EST +-Australia/Broken_Hill.daylight.short=CST +-Australia/Broken_Hill.generic.short=CT +-Australia/Broken_Hill.standard.short=CST +-Australia/Canberra.daylight.short=EST +-Australia/Canberra.generic.short=ET +-Australia/Canberra.standard.short=EST +-Australia/Currie.daylight.short=EST +-Australia/Currie.generic.short=ET +-Australia/Currie.standard.short=EST +-Australia/Darwin.daylight.short=CST +-Australia/Darwin.generic.short=CT +-Australia/Darwin.standard.short=CST +-Australia/Eucla.daylight.short=CWST +-Australia/Eucla.generic.short=CWT +-Australia/Eucla.standard.short=CWST +-Australia/Hobart.daylight.short=EST +-Australia/Hobart.generic.short=ET +-Australia/Hobart.standard.short=EST +-Australia/LHI.daylight.short=LHST +-Australia/LHI.generic.short=LHT +-Australia/LHI.standard.short=LHST +-Australia/Lindeman.daylight.short=EST +-Australia/Lindeman.generic.short=ET +-Australia/Lindeman.standard.short=EST +-Australia/Lord_Howe.daylight.short=LHST +-Australia/Lord_Howe.generic.short=LHT +-Australia/Lord_Howe.standard.short=LHST +-Australia/Melbourne.daylight.short=EST +-Australia/Melbourne.generic.short=ET +-Australia/Melbourne.standard.short=EST +-Australia/North.daylight.short=CST +-Australia/North.generic.short=CT +-Australia/North.standard.short=CST +-Australia/NSW.daylight.short=EST +-Australia/NSW.generic.short=ET +-Australia/NSW.standard.short=EST +-Australia/Perth.daylight.short=WST +-Australia/Perth.generic.short=WT +-Australia/Perth.standard.short=WST +-Australia/Queensland.daylight.short=EST +-Australia/Queensland.generic.short=ET +-Australia/Queensland.standard.short=EST +-Australia/South.daylight.short=CST +-Australia/South.generic.short=CT +-Australia/South.standard.short=CST +-Australia/Sydney.daylight.short=EST +-Australia/Sydney.generic.short=ET +-Australia/Sydney.standard.short=EST +-Australia/Tasmania.daylight.short=EST +-Australia/Tasmania.generic.short=ET +-Australia/Tasmania.standard.short=EST +-Australia/Victoria.daylight.short=EST +-Australia/Victoria.generic.short=ET +-Australia/Victoria.standard.short=EST +-Australia/West.daylight.short=WST +-Australia/West.generic.short=WT +-Australia/West.standard.short=WST +-Australia/Yancowinna.daylight.short=CST +-Australia/Yancowinna.generic.short=CT +-Australia/Yancowinna.standard.short=CST +-BET.daylight.short=BRST +-BET.generic.short=BRT +-BET.standard.short=BRT +-Brazil/Acre.daylight.short=ACST +-Brazil/Acre.generic.short=ACT +-Brazil/Acre.standard.short=ACT +-Brazil/DeNoronha.daylight.short=FNST +-Brazil/DeNoronha.generic.short=FNT +-Brazil/DeNoronha.standard.short=FNT +-Brazil/East.daylight.short=BRST +-Brazil/East.generic.short=BRT +-Brazil/East.standard.short=BRT +-Brazil/West.daylight.short=AMST +-Brazil/West.generic.short=AMT +-Brazil/West.standard.short=AMT +-BST.daylight.short=BDST +-BST.generic.short=BDT +-BST.standard.short=BDT +-Canada/Atlantic.daylight.short=ADT +-Canada/Atlantic.generic.short=AT +-Canada/Atlantic.standard.short=AST +-Canada/Central.daylight.short=CDT +-Canada/Central.generic.short=CT +-Canada/Central.standard.short=CST +-Canada/Eastern.daylight.short=EDT +-Canada/Eastern.generic.short=ET +-Canada/Eastern.standard.short=EST +-Canada/East-Saskatchewan.daylight.short=CDT +-Canada/East-Saskatchewan.generic.short=CT +-Canada/East-Saskatchewan.standard.short=CST +-Canada/Mountain.daylight.short=MDT +-Canada/Mountain.generic.short=MT +-Canada/Mountain.standard.short=MST +-Canada/Newfoundland.daylight.short=NDT +-Canada/Newfoundland.generic.short=NT +-Canada/Newfoundland.standard.short=NST +-Canada/Pacific.daylight.short=PDT +-Canada/Pacific.generic.short=PT +-Canada/Pacific.standard.short=PST +-Canada/Saskatchewan.daylight.short=CDT +-Canada/Saskatchewan.generic.short=CT +-Canada/Saskatchewan.standard.short=CST +-Canada/Yukon.daylight.short=PDT +-Canada/Yukon.generic.short=PT +-Canada/Yukon.standard.short=PST +-CAT.daylight.short=CAST +-CAT.generic.short=CAT +-CAT.standard.short=CAT +-CET.daylight.short=CEST +-CET.generic.short=CET +-CET.standard.short=CET +-Chile/Continental.daylight.short=CLST +-Chile/Continental.generic.short=CLT +-Chile/Continental.standard.short=CLT +-Chile/EasterIsland.daylight.short=EASST +-Chile/EasterIsland.generic.short=EAST +-Chile/EasterIsland.standard.short=EAST +-CNT.daylight.short=NDT +-CNT.generic.short=NT +-CNT.standard.short=NST +-CST6CDT.daylight.short=CDT +-CST6CDT.generic.short=CT +-CST6CDT.standard.short=CST +-CST.daylight.short=CDT +-CST.generic.short=CT +-CST.standard.short=CST +-CTT.daylight.short=CDT +-CTT.generic.short=CT +-CTT.standard.short=CST +-Cuba.daylight.short=CDT +-Cuba.generic.short=CT +-Cuba.standard.short=CST +-EAT.daylight.short=EAST +-EAT.generic.short=EAT +-EAT.standard.short=EAT +-ECT.daylight.short=CEST +-ECT.generic.short=CET +-ECT.standard.short=CET +-EET.daylight.short=EEST +-EET.generic.short=EET +-EET.standard.short=EET +-Egypt.daylight.short=EEST +-Egypt.generic.short=EET +-Egypt.standard.short=EET +-Eire.daylight.short=IST +-Eire.generic.short=IT +-Eire.standard.short=GMT +-EST5EDT.daylight.short=EDT +-EST5EDT.generic.short=ET +-EST5EDT.standard.short=EST +-EST.daylight.short=EDT +-EST.generic.short=ET +-EST.standard.short=EST +-Etc/Greenwich.daylight.short=GMT +-Etc/Greenwich.generic.short=GMT +-Etc/Greenwich.standard.short=GMT +-Etc/UCT.daylight.short=UTC +-Etc/UCT.generic.short=UTC +-Etc/UCT.standard.short=UTC +-Etc/Universal.daylight.short=UTC +-Etc/Universal.generic.short=UTC +-Etc/Universal.standard.short=UTC +-Etc/UTC.daylight.short=UTC +-Etc/UTC.generic.short=UTC +-Etc/UTC.standard.short=UTC +-Etc/Zulu.daylight.short=UTC +-Etc/Zulu.generic.short=UTC +-Etc/Zulu.standard.short=UTC +-Europe/Amsterdam.daylight.short=CEST +-Europe/Amsterdam.generic.short=CET +-Europe/Amsterdam.standard.short=CET +-Europe/Andorra.daylight.short=CEST +-Europe/Andorra.generic.short=CET +-Europe/Andorra.standard.short=CET +-Europe/Athens.daylight.short=EEST +-Europe/Athens.generic.short=EET +-Europe/Athens.standard.short=EET +-Europe/Belfast.daylight.short=BST +-Europe/Belfast.generic.short=BT +-Europe/Belfast.standard.short=GMT +-Europe/Belgrade.daylight.short=CEST +-Europe/Belgrade.generic.short=CET +-Europe/Belgrade.standard.short=CET +-Europe/Berlin.daylight.short=CEST +-Europe/Berlin.generic.short=CET +-Europe/Berlin.standard.short=CET +-Europe/Bratislava.daylight.short=CEST +-Europe/Bratislava.generic.short=CET +-Europe/Bratislava.standard.short=CET +-Europe/Brussels.daylight.short=CEST +-Europe/Brussels.generic.short=CET +-Europe/Brussels.standard.short=CET +-Europe/Bucharest.daylight.short=EEST +-Europe/Bucharest.generic.short=EET +-Europe/Bucharest.standard.short=EET +-Europe/Budapest.daylight.short=CEST +-Europe/Budapest.generic.short=CET +-Europe/Budapest.standard.short=CET +-Europe/Busingen.daylight.short=CEST +-Europe/Busingen.generic.short=CET +-Europe/Busingen.standard.short=CET +-Europe/Chisinau.daylight.short=EEST +-Europe/Chisinau.generic.short=EET +-Europe/Chisinau.standard.short=EET +-Europe/Copenhagen.daylight.short=CEST +-Europe/Copenhagen.generic.short=CET +-Europe/Copenhagen.standard.short=CET +-Europe/Dublin.daylight.short=IST +-Europe/Dublin.generic.short=IT +-Europe/Dublin.standard.short=GMT +-Europe/Gibraltar.daylight.short=CEST +-Europe/Gibraltar.generic.short=CET +-Europe/Gibraltar.standard.short=CET +-Europe/Guernsey.daylight.short=BST +-Europe/Guernsey.generic.short=BT +-Europe/Guernsey.standard.short=GMT +-Europe/Helsinki.daylight.short=EEST +-Europe/Helsinki.generic.short=EET +-Europe/Helsinki.standard.short=EET +-Europe/Isle_of_Man.daylight.short=BST +-Europe/Isle_of_Man.generic.short=BT +-Europe/Isle_of_Man.standard.short=GMT +-Europe/Istanbul.daylight.short=EEST +-Europe/Istanbul.generic.short=EET +-Europe/Istanbul.standard.short=EET +-Europe/Jersey.daylight.short=BST +-Europe/Jersey.generic.short=BT +-Europe/Jersey.standard.short=GMT +-Europe/Kaliningrad.daylight.short=FEST +-Europe/Kaliningrad.generic.short=FET +-Europe/Kaliningrad.standard.short=FET +-Europe/Kiev.daylight.short=EEST +-Europe/Kiev.generic.short=EET +-Europe/Kiev.standard.short=EET +-Europe/Lisbon.daylight.short=WEST +-Europe/Lisbon.generic.short=WET +-Europe/Lisbon.standard.short=WET +-Europe/Ljubljana.daylight.short=CEST +-Europe/Ljubljana.generic.short=CET +-Europe/Ljubljana.standard.short=CET +-Europe/London.daylight.short=BST +-Europe/London.generic.short=BT +-Europe/London.standard.short=GMT +-Europe/Luxembourg.daylight.short=CEST +-Europe/Luxembourg.generic.short=CET +-Europe/Luxembourg.standard.short=CET +-Europe/Madrid.daylight.short=CEST +-Europe/Madrid.generic.short=CET +-Europe/Madrid.standard.short=CET +-Europe/Malta.daylight.short=CEST +-Europe/Malta.generic.short=CET +-Europe/Malta.standard.short=CET +-Europe/Mariehamn.daylight.short=EEST +-Europe/Mariehamn.generic.short=EET +-Europe/Mariehamn.standard.short=EET +-Europe/Minsk.daylight.short=FEST +-Europe/Minsk.generic.short=FET +-Europe/Minsk.standard.short=FET +-Europe/Monaco.daylight.short=CEST +-Europe/Monaco.generic.short=CET +-Europe/Monaco.standard.short=CET +-Europe/Moscow.daylight.short=MSD +-Europe/Moscow.generic.short=MT +-Europe/Moscow.standard.short=MSK +-Europe/Nicosia.daylight.short=EEST +-Europe/Nicosia.generic.short=EET +-Europe/Nicosia.standard.short=EET +-Europe/Oslo.daylight.short=CEST +-Europe/Oslo.generic.short=CET +-Europe/Oslo.standard.short=CET +-Europe/Paris.daylight.short=CEST +-Europe/Paris.generic.short=CET +-Europe/Paris.standard.short=CET +-Europe/Podgorica.daylight.short=CEST +-Europe/Podgorica.generic.short=CET +-Europe/Podgorica.standard.short=CET +-Europe/Prague.daylight.short=CEST +-Europe/Prague.generic.short=CET +-Europe/Prague.standard.short=CET +-Europe/Riga.daylight.short=EEST +-Europe/Riga.generic.short=EET +-Europe/Riga.standard.short=EET +-Europe/Rome.daylight.short=CEST +-Europe/Rome.generic.short=CET +-Europe/Rome.standard.short=CET +-Europe/Samara.daylight.short=SAMST +-Europe/Samara.generic.short=SAMT +-Europe/Samara.standard.short=SAMT +-Europe/San_Marino.daylight.short=CEST +-Europe/San_Marino.generic.short=CET +-Europe/San_Marino.standard.short=CET +-Europe/Sarajevo.daylight.short=CEST +-Europe/Sarajevo.generic.short=CET +-Europe/Sarajevo.standard.short=CET +-Europe/Simferopol.daylight.short=EEST +-Europe/Simferopol.generic.short=EET +-Europe/Simferopol.standard.short=EET +-Europe/Skopje.daylight.short=CEST +-Europe/Skopje.generic.short=CET +-Europe/Skopje.standard.short=CET +-Europe/Sofia.daylight.short=EEST +-Europe/Sofia.generic.short=EET +-Europe/Sofia.standard.short=EET +-Europe/Stockholm.daylight.short=CEST +-Europe/Stockholm.generic.short=CET +-Europe/Stockholm.standard.short=CET +-Europe/Tallinn.daylight.short=EEST +-Europe/Tallinn.generic.short=EET +-Europe/Tallinn.standard.short=EET +-Europe/Tirane.daylight.short=CEST +-Europe/Tirane.generic.short=CET +-Europe/Tirane.standard.short=CET +-Europe/Tiraspol.daylight.short=EEST +-Europe/Tiraspol.generic.short=EET +-Europe/Tiraspol.standard.short=EET +-Europe/Uzhgorod.daylight.short=EEST +-Europe/Uzhgorod.generic.short=EET +-Europe/Uzhgorod.standard.short=EET +-Europe/Vaduz.daylight.short=CEST +-Europe/Vaduz.generic.short=CET +-Europe/Vaduz.standard.short=CET +-Europe/Vatican.daylight.short=CEST +-Europe/Vatican.generic.short=CET +-Europe/Vatican.standard.short=CET +-Europe/Vienna.daylight.short=CEST +-Europe/Vienna.generic.short=CET +-Europe/Vienna.standard.short=CET +-Europe/Vilnius.daylight.short=EEST +-Europe/Vilnius.generic.short=EET +-Europe/Vilnius.standard.short=EET +-Europe/Volgograd.daylight.short=VOLST +-Europe/Volgograd.generic.short=VOLT +-Europe/Volgograd.standard.short=VOLT +-Europe/Warsaw.daylight.short=CEST +-Europe/Warsaw.generic.short=CET +-Europe/Warsaw.standard.short=CET +-Europe/Zagreb.daylight.short=CEST +-Europe/Zagreb.generic.short=CET +-Europe/Zagreb.standard.short=CET +-Europe/Zaporozhye.daylight.short=EEST +-Europe/Zaporozhye.generic.short=EET +-Europe/Zaporozhye.standard.short=EET +-Europe/Zurich.daylight.short=CEST +-Europe/Zurich.generic.short=CET +-Europe/Zurich.standard.short=CET +-GB.daylight.short=BST +-GB-Eire.daylight.short=BST +-GB-Eire.generic.short=BT +-GB-Eire.standard.short=GMT +-GB.generic.short=BT +-GB.standard.short=GMT +-GMT.daylight.short=GMT +-GMT.generic.short=GMT +-GMT.standard.short=GMT +-Greenwich.daylight.short=GMT +-Greenwich.generic.short=GMT +-Greenwich.standard.short=GMT +-Hongkong.daylight.short=HKST +-Hongkong.generic.short=HKT +-Hongkong.standard.short=HKT +-HST.daylight.short=HDT +-HST.generic.short=HT +-HST.standard.short=HST +-Iceland.daylight.short=GMT +-Iceland.generic.short=GMT +-Iceland.standard.short=GMT +-IET.daylight.short=EDT +-IET.generic.short=ET +-IET.standard.short=EST +-Indian/Antananarivo.daylight.short=EAST +-Indian/Antananarivo.generic.short=EAT +-Indian/Antananarivo.standard.short=EAT +-Indian/Chagos.daylight.short=IOST +-Indian/Chagos.generic.short=IOT +-Indian/Chagos.standard.short=IOT +-Indian/Christmas.daylight.short=CXST +-Indian/Christmas.generic.short=CIT +-Indian/Christmas.standard.short=CXT +-Indian/Cocos.daylight.short=CCST +-Indian/Cocos.generic.short=CCT +-Indian/Cocos.standard.short=CCT +-Indian/Comoro.daylight.short=EAST +-Indian/Comoro.generic.short=EAT +-Indian/Comoro.standard.short=EAT +-Indian/Kerguelen.daylight.short=TFST +-Indian/Kerguelen.generic.short=TFT +-Indian/Kerguelen.standard.short=TFT +-Indian/Mahe.daylight.short=SCST +-Indian/Mahe.generic.short=SCT +-Indian/Mahe.standard.short=SCT +-Indian/Maldives.daylight.short=MVST +-Indian/Maldives.generic.short=MVT +-Indian/Maldives.standard.short=MVT +-Indian/Mauritius.daylight.short=MUST +-Indian/Mauritius.generic.short=MUT +-Indian/Mauritius.standard.short=MUT +-Indian/Mayotte.daylight.short=EAST +-Indian/Mayotte.generic.short=EAT +-Indian/Mayotte.standard.short=EAT +-Indian/Reunion.daylight.short=REST +-Indian/Reunion.generic.short=RET +-Indian/Reunion.standard.short=RET +-Iran.daylight.short=IRDT +-Iran.generic.short=IRT +-Iran.standard.short=IRST +-Israel.daylight.short=IDT +-Israel.generic.short=IT +-Israel.standard.short=IST +-IST.daylight.short=IDT +-IST.generic.short=IT +-IST.standard.short=IST +-Jamaica.daylight.short=EDT +-Jamaica.generic.short=ET +-Jamaica.standard.short=EST +-Japan.daylight.short=JDT +-Japan.generic.short=JT +-Japan.standard.short=JST +-JST.daylight.short=JDT +-JST.generic.short=JT +-JST.standard.short=JST +-Kwajalein.daylight.short=MHST +-Kwajalein.generic.short=MHT +-Kwajalein.standard.short=MHT +-Libya.daylight.short=EEST +-Libya.generic.short=EET +-Libya.standard.short=EET +-MET.daylight.short=MEST +-MET.generic.short=MET +-MET.standard.short=MET +-Mexico/BajaNorte.daylight.short=PDT +-Mexico/BajaNorte.generic.short=PT +-Mexico/BajaNorte.standard.short=PST +-Mexico/BajaSur.daylight.short=MDT +-Mexico/BajaSur.generic.short=MT +-Mexico/BajaSur.standard.short=MST +-Mexico/General.daylight.short=CDT +-Mexico/General.generic.short=CT +-Mexico/General.standard.short=CST +-MIT.daylight.short=WSDT +-MIT.generic.short=WST +-MIT.standard.short=WST +-MST7MDT.daylight.short=MDT +-MST7MDT.generic.short=MT +-MST7MDT.standard.short=MST +-MST.daylight.short=MDT +-MST.generic.short=MT +-MST.standard.short=MST +-Navajo.daylight.short=MDT +-Navajo.generic.short=MT +-Navajo.standard.short=MST +-NET.daylight.short=AMST +-NET.generic.short=AMT +-NET.standard.short=AMT +-NST.daylight.short=NZDT +-NST.generic.short=NZT +-NST.standard.short=NZST +-NZ-CHAT.daylight.short=CHADT +-NZ-CHAT.generic.short=CHAT +-NZ-CHAT.standard.short=CHAST +-NZ.daylight.short=NZDT +-NZ.generic.short=NZT +-NZ.standard.short=NZST +-Pacific/Apia.daylight.short=WSDT +-Pacific/Apia.generic.short=WST +-Pacific/Apia.standard.short=WST +-Pacific/Auckland.daylight.short=NZDT +-Pacific/Auckland.generic.short=NZT +-Pacific/Auckland.standard.short=NZST +-Pacific/Chatham.daylight.short=CHADT +-Pacific/Chatham.generic.short=CHAT +-Pacific/Chatham.standard.short=CHAST +-Pacific/Chuuk.daylight.short=CHUST +-Pacific/Chuuk.generic.short=CHUT +-Pacific/Chuuk.standard.short=CHUT +-Pacific/Easter.daylight.short=EASST +-Pacific/Easter.generic.short=EAST +-Pacific/Easter.standard.short=EAST +-Pacific/Efate.daylight.short=VUST +-Pacific/Efate.generic.short=VUT +-Pacific/Efate.standard.short=VUT +-Pacific/Enderbury.daylight.short=PHOST +-Pacific/Enderbury.generic.short=PHOT +-Pacific/Enderbury.standard.short=PHOT +-Pacific/Fakaofo.daylight.short=TKST +-Pacific/Fakaofo.generic.short=TKT +-Pacific/Fakaofo.standard.short=TKT +-Pacific/Fiji.daylight.short=FJST +-Pacific/Fiji.generic.short=FJT +-Pacific/Fiji.standard.short=FJT +-Pacific/Funafuti.daylight.short=TVST +-Pacific/Funafuti.generic.short=TVT +-Pacific/Funafuti.standard.short=TVT +-Pacific/Galapagos.daylight.short=GALST +-Pacific/Galapagos.generic.short=GALT +-Pacific/Galapagos.standard.short=GALT +-Pacific/Gambier.daylight.short=GAMST +-Pacific/Gambier.generic.short=GAMT +-Pacific/Gambier.standard.short=GAMT +-Pacific/Guadalcanal.daylight.short=SBST +-Pacific/Guadalcanal.generic.short=SBT +-Pacific/Guadalcanal.standard.short=SBT +-Pacific/Guam.daylight.short=ChDT +-Pacific/Guam.generic.short=ChT +-Pacific/Guam.standard.short=ChST +-Pacific/Honolulu.daylight.short=HDT +-Pacific/Honolulu.generic.short=HT +-Pacific/Honolulu.standard.short=HST +-Pacific/Johnston.daylight.short=HDT +-Pacific/Johnston.generic.short=HT +-Pacific/Johnston.standard.short=HST +-Pacific/Kiritimati.daylight.short=LINST +-Pacific/Kiritimati.generic.short=LINT +-Pacific/Kiritimati.standard.short=LINT +-Pacific/Kosrae.daylight.short=KOSST +-Pacific/Kosrae.generic.short=KOST +-Pacific/Kosrae.standard.short=KOST +-Pacific/Kwajalein.daylight.short=MHST +-Pacific/Kwajalein.generic.short=MHT +-Pacific/Kwajalein.standard.short=MHT +-Pacific/Majuro.daylight.short=MHST +-Pacific/Majuro.generic.short=MHT +-Pacific/Majuro.standard.short=MHT +-Pacific/Marquesas.daylight.short=MARST +-Pacific/Marquesas.generic.short=MART +-Pacific/Marquesas.standard.short=MART +-Pacific/Midway.daylight.short=SDT +-Pacific/Midway.generic.short=ST +-Pacific/Midway.standard.short=SST +-Pacific/Nauru.daylight.short=NRST +-Pacific/Nauru.generic.short=NRT +-Pacific/Nauru.standard.short=NRT +-Pacific/Niue.daylight.short=NUST +-Pacific/Niue.generic.short=NUT +-Pacific/Niue.standard.short=NUT +-Pacific/Norfolk.daylight.short=NFST +-Pacific/Norfolk.generic.short=NFT +-Pacific/Norfolk.standard.short=NFT +-Pacific/Noumea.daylight.short=NCST +-Pacific/Noumea.generic.short=NCT +-Pacific/Noumea.standard.short=NCT +-Pacific/Pago_Pago.daylight.short=SDT +-Pacific/Pago_Pago.generic.short=ST +-Pacific/Pago_Pago.standard.short=SST +-Pacific/Palau.daylight.short=PWST +-Pacific/Palau.generic.short=PWT +-Pacific/Palau.standard.short=PWT +-Pacific/Pitcairn.daylight.short=PDT +-Pacific/Pitcairn.generic.short=PT +-Pacific/Pitcairn.standard.short=PST +-Pacific/Pohnpei.daylight.short=PONST +-Pacific/Pohnpei.generic.short=PONT +-Pacific/Pohnpei.standard.short=PONT +-Pacific/Ponape.daylight.short=PONST +-Pacific/Ponape.generic.short=PONT +-Pacific/Ponape.standard.short=PONT +-Pacific/Port_Moresby.daylight.short=PGST +-Pacific/Port_Moresby.generic.short=PGT +-Pacific/Port_Moresby.standard.short=PGT +-Pacific/Rarotonga.daylight.short=CKHST +-Pacific/Rarotonga.generic.short=CKT +-Pacific/Rarotonga.standard.short=CKT +-Pacific/Saipan.daylight.short=ChDT +-Pacific/Saipan.generic.short=ChT +-Pacific/Saipan.standard.short=ChST +-Pacific/Samoa.daylight.short=SDT +-Pacific/Samoa.generic.short=ST +-Pacific/Samoa.standard.short=SST +-Pacific/Tahiti.daylight.short=TAHST +-Pacific/Tahiti.generic.short=TAHT +-Pacific/Tahiti.standard.short=TAHT +-Pacific/Tarawa.daylight.short=GILST +-Pacific/Tarawa.generic.short=GILT +-Pacific/Tarawa.standard.short=GILT +-Pacific/Tongatapu.daylight.short=TOST +-Pacific/Tongatapu.generic.short=TOT +-Pacific/Tongatapu.standard.short=TOT +-Pacific/Truk.daylight.short=CHUST +-Pacific/Truk.generic.short=CHUT +-Pacific/Truk.standard.short=CHUT +-Pacific/Wake.daylight.short=WAKST +-Pacific/Wake.generic.short=WAKT +-Pacific/Wake.standard.short=WAKT +-Pacific/Wallis.daylight.short=WFST +-Pacific/Wallis.generic.short=WFT +-Pacific/Wallis.standard.short=WFT +-Pacific/Yap.daylight.short=CHUST +-Pacific/Yap.generic.short=CHUT +-Pacific/Yap.standard.short=CHUT +-PLT.daylight.short=PKST +-PLT.generic.short=PKT +-PLT.standard.short=PKT +-PNT.daylight.short=MDT +-PNT.generic.short=MT +-PNT.standard.short=MST +-Poland.daylight.short=CEST +-Poland.generic.short=CET +-Poland.standard.short=CET +-Portugal.daylight.short=WEST +-Portugal.generic.short=WET +-Portugal.standard.short=WET +-PRC.daylight.short=CDT +-PRC.generic.short=CT +-PRC.standard.short=CST +-PRT.daylight.short=ADT +-PRT.generic.short=AT +-PRT.standard.short=AST +-PST8PDT.daylight.short=PDT +-PST8PDT.generic.short=PT +-PST8PDT.standard.short=PST +-PST.daylight.short=PDT +-PST.generic.short=PT +-PST.standard.short=PST +-ROK.daylight.short=KDT +-ROK.generic.short=KT +-ROK.standard.short=KST +-Singapore.daylight.short=SGST +-Singapore.generic.short=SGT +-Singapore.standard.short=SGT +-SST.daylight.short=SBST +-SST.generic.short=SBT +-SST.standard.short=SBT +-SystemV/AST4ADT.daylight.short=ADT +-SystemV/AST4ADT.generic.short=AT +-SystemV/AST4ADT.standard.short=AST +-SystemV/AST4.daylight.short=ADT +-SystemV/AST4.generic.short=AT +-SystemV/AST4.standard.short=AST +-SystemV/CST6CDT.daylight.short=CDT +-SystemV/CST6CDT.generic.short=CT +-SystemV/CST6CDT.standard.short=CST +-SystemV/CST6.daylight.short=CDT +-SystemV/CST6.generic.short=CT +-SystemV/CST6.standard.short=CST +-SystemV/EST5.daylight.short=EDT +-SystemV/EST5EDT.daylight.short=EDT +-SystemV/EST5EDT.generic.short=ET +-SystemV/EST5EDT.standard.short=EST +-SystemV/EST5.generic.short=ET +-SystemV/EST5.standard.short=EST +-SystemV/HST10.daylight.short=HDT +-SystemV/HST10.generic.short=HT +-SystemV/HST10.standard.short=HST +-SystemV/MST7.daylight.short=MDT +-SystemV/MST7.generic.short=MT +-SystemV/MST7MDT.daylight.short=MDT +-SystemV/MST7MDT.generic.short=MT +-SystemV/MST7MDT.standard.short=MST +-SystemV/MST7.standard.short=MST +-SystemV/PST8.daylight.short=PDT +-SystemV/PST8.generic.short=PT +-SystemV/PST8PDT.daylight.short=PDT +-SystemV/PST8PDT.generic.short=PT +-SystemV/PST8PDT.standard.short=PST +-SystemV/PST8.standard.short=PST +-SystemV/YST9.daylight.short=AKDT +-SystemV/YST9.generic.short=AKT +-SystemV/YST9.standard.short=AKST +-SystemV/YST9YDT.daylight.short=AKDT +-SystemV/YST9YDT.generic.short=AKT +-SystemV/YST9YDT.standard.short=AKST +-Turkey.daylight.short=EEST +-Turkey.generic.short=EET +-Turkey.standard.short=EET +-UCT.daylight.short=UTC +-UCT.generic.short=UTC +-UCT.standard.short=UTC +-Universal.daylight.short=UTC +-Universal.generic.short=UTC +-Universal.standard.short=UTC +-US/Alaska.daylight.short=AKDT +-US/Alaska.generic.short=AKT +-US/Alaska.standard.short=AKST +-US/Aleutian.daylight.short=HADT +-US/Aleutian.generic.short=HAT +-US/Aleutian.standard.short=HAST +-US/Arizona.daylight.short=MDT +-US/Arizona.generic.short=MT +-US/Arizona.standard.short=MST +-US/Central.daylight.short=CDT +-US/Central.generic.short=CT +-US/Central.standard.short=CST +-US/Eastern.daylight.short=EDT +-US/Eastern.generic.short=ET +-US/Eastern.standard.short=EST +-US/East-Indiana.daylight.short=EDT +-US/East-Indiana.generic.short=ET +-US/East-Indiana.standard.short=EST +-US/Hawaii.daylight.short=HDT +-US/Hawaii.generic.short=HT +-US/Hawaii.standard.short=HST +-US/Indiana-Starke.daylight.short=CDT +-US/Indiana-Starke.generic.short=CT +-US/Indiana-Starke.standard.short=CST +-US/Michigan.daylight.short=EDT +-US/Michigan.generic.short=ET +-US/Michigan.standard.short=EST +-US/Mountain.daylight.short=MDT +-US/Mountain.generic.short=MT +-US/Mountain.standard.short=MST +-US/Pacific.daylight.short=PDT +-US/Pacific.generic.short=PT +-US/Pacific-New.daylight.short=PDT +-US/Pacific-New.generic.short=PT +-US/Pacific-New.standard.short=PST +-US/Pacific.standard.short=PST +-US/Samoa.daylight.short=SDT +-US/Samoa.generic.short=ST +-US/Samoa.standard.short=SST +-UTC.daylight.short=UTC +-UTC.generic.short=UTC +-UTC.standard.short=UTC +-VST.daylight.short=ICST +-VST.generic.short=ICT +-VST.standard.short=ICT +-WET.daylight.short=WEST +-WET.generic.short=WET +-WET.standard.short=WET +-W-SU.daylight.short=MSD +-W-SU.generic.short=MT +-W-SU.standard.short=MSK +-Zulu.daylight.short=UTC +-Zulu.generic.short=UTC +-Zulu.standard.short=UTC +--- ./jdk/test/tools/jar/UpdateManifest.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/tools/jar/UpdateManifest.java Wed Jul 30 18:42:59 2014 +0100 +@@ -39,6 +39,8 @@ + static PrintStream err = System.err; + static boolean debug = true; + ++ static final Logger JAR_LOGGER = Logger.getLogger("java.util.jar"); ++ + public static void realMain(String[] args) throws Throwable { + if (args.length == 0) { + debug = false; +@@ -47,7 +49,7 @@ + out = new PrintStream(new FileOutputStream(tmp)); + err = out; + // Attributes.read() can log a message we don't care to see. +- Logger.getLogger("java.util.jar").setLevel(Level.OFF); ++ JAR_LOGGER.setLevel(Level.OFF); + } + + try { testManifestExistence(); } catch (Throwable t) { unexpected(t); } +--- ./jdk/test/tools/launcher/ChangeDataModel.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/tools/launcher/ChangeDataModel.java Wed Jul 30 18:42:59 2014 +0100 +@@ -23,41 +23,43 @@ + + /** + * @test +- * @bug 4894330 4810347 6277269 ++ * @bug 4894330 4810347 6277269 8029388 + * @compile -XDignore.symbol.file ChangeDataModel.java + * @run main ChangeDataModel + * @summary Verify -d32 and -d64 options are accepted(rejected) on all platforms + * @author Joseph D. Darcy, ksrini + */ + import java.io.File; ++import java.util.ArrayList; ++import java.util.List; + + public class ChangeDataModel extends TestHelper { + private static final File TestJar = new File("test" + JAR_FILE_EXT); ++ private static final String OptionName = "Args"; ++ private static final File TestOptionJar = new File(OptionName + JAR_FILE_EXT); + private static final String OPT_PREFIX = "ARCH_OPT:"; + +- public static void main(String... args) throws Exception { ++ static void createTestJar() throws Exception { + String[] code = { + " public static void main(String argv[]) {", + " System.out.println(\"" + OPT_PREFIX + "-d\" + System.getProperty(\"sun.arch.data.model\", \"none\"));", +- " }", +- }; ++ " }",}; + createJar(TestJar, code); ++ } ++ public static void main(String... args) throws Exception { ++ createTestJar(); ++ createOptionsJar(); + +- // verify if data model flag for default data model is accepted ++ // verify if data model flag for default data model is accepted, also ++ // verify if the complimentary data model is rejected. + if (is32Bit) { + checkAcceptance(javaCmd, "-d32"); ++ checkRejection(javaCmd, "-d64"); ++ checkOption(javaCmd, "-d64"); + } else if (is64Bit) { + checkAcceptance(javaCmd, "-d64"); +- } else { +- throw new Error("unsupported data model"); +- } +- +- // Negative tests: ensure that non-dual mode systems reject the +- // complementary (other) data model +- if (is32Bit) { +- checkRejection(javaCmd, "-d64"); +- } else if (is64Bit) { + checkRejection(javaCmd, "-d32"); ++ checkOption(javaCmd, "-d32"); + } else { + throw new Error("unsupported data model"); + } +@@ -81,4 +83,44 @@ + throw new RuntimeException(message); + } + } ++ ++ static void checkOption(String cmd, String dmodel) throws Exception { ++ TestResult tr = doExec(cmd, "-jar", TestOptionJar.getAbsolutePath(), dmodel); ++ verifyOption(tr, dmodel); ++ ++ tr = doExec(cmd, "-cp", ".", OptionName, dmodel); ++ verifyOption(tr, dmodel); ++ } ++ ++ static void verifyOption(TestResult tr, String dmodel) { ++ if (!tr.contains(OPT_PREFIX + dmodel)) { ++ System.out.println(tr); ++ String message = "app argument: " + dmodel + " not found."; ++ throw new RuntimeException(message); ++ } ++ if (!tr.isOK()) { ++ System.out.println(tr); ++ String message = "app argument: " + dmodel + " interpreted ?"; ++ throw new RuntimeException(message); ++ } ++ } ++ ++ static void createOptionsJar() throws Exception { ++ List<String> code = new ArrayList<>(); ++ code.add("public class Args {"); ++ code.add(" public static void main(String argv[]) {"); ++ code.add(" for (String x : argv)"); ++ code.add(" System.out.println(\"" + OPT_PREFIX + "\" + x);"); ++ code.add(" }"); ++ code.add("}"); ++ File optionsJava = new File(OptionName + JAVA_FILE_EXT); ++ createFile(optionsJava, code); ++ File optionsClass = new File(OptionName + CLASS_FILE_EXT); ++ ++ compile(optionsJava.getName()); ++ createJar("cvfe", ++ TestOptionJar.getName(), ++ OptionName, ++ optionsClass.getName()); ++ } + } +--- ./jdk/test/tools/launcher/ExecutionEnvironment.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/tools/launcher/ExecutionEnvironment.java Wed Jul 30 18:42:59 2014 +0100 +@@ -72,7 +72,9 @@ + public class ExecutionEnvironment extends TestHelper { + static final String LD_LIBRARY_PATH = TestHelper.isMacOSX + ? "DYLD_LIBRARY_PATH" +- : "LD_LIBRARY_PATH"; ++ : TestHelper.isAIX ++ ? "LIBPATH" ++ : "LD_LIBRARY_PATH"; + static final String LD_LIBRARY_PATH_32 = LD_LIBRARY_PATH + "_32"; + static final String LD_LIBRARY_PATH_64 = LD_LIBRARY_PATH + "_64"; + +@@ -144,7 +146,19 @@ + + for (String x : LD_PATH_STRINGS) { + if (!tr.contains(x)) { +- flagError(tr, "FAIL: did not get <" + x + ">"); ++ if (TestHelper.isAIX && x.startsWith(LD_LIBRARY_PATH)) { ++ // AIX does not support the '-rpath' linker options so the ++ // launchers have to prepend the jdk library path to 'LIBPATH'. ++ String aixLibPath = LD_LIBRARY_PATH + "=" + ++ System.getenv(LD_LIBRARY_PATH) + ++ System.getProperty("path.separator") + LD_LIBRARY_PATH_VALUE; ++ if (!tr.matches(aixLibPath)) { ++ flagError(tr, "FAIL: did not get <" + aixLibPath + ">"); ++ } ++ } ++ else { ++ flagError(tr, "FAIL: did not get <" + x + ">"); ++ } + } + } + } +@@ -180,7 +194,7 @@ + + Map<String, String> env = new HashMap<>(); + +- if (TestHelper.isLinux || TestHelper.isMacOSX) { ++ if (TestHelper.isLinux || TestHelper.isMacOSX || TestHelper.isAIX) { + for (String x : LD_PATH_STRINGS) { + String pairs[] = x.split("="); + env.put(pairs[0], pairs[1]); +--- ./jdk/test/tools/launcher/Settings.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/tools/launcher/Settings.java Wed Jul 30 18:42:59 2014 +0100 +@@ -73,16 +73,20 @@ + } + + static void runTestOptionDefault() throws IOException { ++ String stackSize = "256"; // in kb ++ if (getArch().equals("ppc64")) { ++ stackSize = "800"; ++ } + TestResult tr = null; + tr = doExec(javaCmd, "-Xms64m", "-Xmx512m", +- "-Xss256k", "-XshowSettings", "-jar", testJar.getAbsolutePath()); ++ "-Xss" + stackSize + "k", "-XshowSettings", "-jar", testJar.getAbsolutePath()); + containsAllOptions(tr); + if (!tr.isOK()) { + System.out.println(tr.status); + throw new RuntimeException("test fails"); + } + tr = doExec(javaCmd, "-Xms65536k", "-Xmx712m", +- "-Xss256000", "-XshowSettings", "-jar", testJar.getAbsolutePath()); ++ "-Xss" + stackSize + "000", "-XshowSettings", "-jar", testJar.getAbsolutePath()); + containsAllOptions(tr); + if (!tr.isOK()) { + System.out.println(tr.status); +--- ./jdk/test/tools/launcher/TestHelper.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/tools/launcher/TestHelper.java Wed Jul 30 18:42:59 2014 +0100 +@@ -92,6 +92,8 @@ + System.getProperty("os.name", "unknown").startsWith("SunOS"); + static final boolean isLinux = + System.getProperty("os.name", "unknown").startsWith("Linux"); ++ static final boolean isAIX = ++ System.getProperty("os.name", "unknown").startsWith("AIX"); + static final String LIBJVM = isWindows + ? "jvm.dll" + : "libjvm" + (isMacOSX ? ".dylib" : ".so"); +--- ./jdk/test/tools/launcher/VersionCheck.java Tue Jun 03 14:19:36 2014 -0700 ++++ ./jdk/test/tools/launcher/VersionCheck.java Wed Jul 30 18:42:59 2014 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2007, 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 +@@ -23,7 +23,7 @@ + + /** + * @test +- * @bug 6545058 6611182 ++ * @bug 6545058 6611182 8016209 + * @summary validate and test -version, -fullversion, and internal, as well as + * sanity checks if a tool can be launched. + * @compile VersionCheck.java +--- ./jdk/test/tools/pack200/PackTestZip64.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/tools/pack200/PackTestZip64.java Wed Jul 30 18:42:59 2014 +0100 +@@ -0,0 +1,152 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++import java.io.*; ++import java.util.ArrayList; ++import java.util.Collections; ++import java.util.Enumeration; ++import java.util.List; ++import java.util.jar.JarEntry; ++import java.util.jar.JarFile; ++import java.util.jar.JarInputStream; ++import java.util.jar.JarOutputStream; ++import java.util.zip.ZipEntry; ++/* ++ * @test ++ * @bug 8029646 ++ * @summary tests that native unpacker produces the same result as Java one ++ * @compile -XDignore.symbol.file Utils.java PackTestZip64.java ++ * @run main PackTestZip64 ++ * @author kizune ++ */ ++ ++public class PackTestZip64 { ++ public static void main(String... args) throws Exception { ++ testPacking(); ++ Utils.cleanup(); ++ } ++ ++ // 1KB buffer is enough to copy jar content ++ private static final byte[] BUFFER = new byte[1024]; ++ ++ static void testPacking() throws IOException { ++ // make a copy of the test specimen to local directory ++ File testFile = new File("tools_java.jar"); ++ // Add a large number of small files to the golden jar ++ generateLargeJar(testFile, Utils.locateJar("golden.jar")); ++ ++ List<String> cmdsList = new ArrayList<>(); ++ ++ // Repack file to get the Java-based result ++ cmdsList.add(Utils.getPack200Cmd()); ++ cmdsList.add("--repack"); ++ cmdsList.add(testFile.getName()); ++ Utils.runExec(cmdsList); ++ cmdsList.clear(); ++ ++ // Pack file with pack200 and unpack in with unpack200 ++ File packedFile = new File("tools.pack.gz"); ++ cmdsList.add(Utils.getPack200Cmd()); ++ cmdsList.add(packedFile.getName()); ++ cmdsList.add(testFile.getName()); ++ Utils.runExec(cmdsList); ++ cmdsList.clear(); ++ ++ File unpackedFile = new File("tools_native.jar"); ++ cmdsList.add(Utils.getUnpack200Cmd()); ++ cmdsList.add(packedFile.getName()); ++ cmdsList.add(unpackedFile.getName()); ++ Utils.runExec(cmdsList); ++ ++ // Compare files binary ++ compareTwoFiles(testFile, unpackedFile); ++ ++ // Cleaning up generated files ++ testFile.delete(); ++ packedFile.delete(); ++ unpackedFile.delete(); ++ } ++ ++ static void compareTwoFiles(File src, File dst) throws IOException { ++ if (!src.exists()) { ++ throw new IOException("File " + src.getName() + " does not exist!"); ++ } ++ ++ if(!dst.exists()) { ++ throw new IOException("File " + dst.getName() + " does not exist!"); ++ } ++ ++ BufferedInputStream srcis, dstis; ++ srcis = new BufferedInputStream(new FileInputStream(src)); ++ dstis = new BufferedInputStream(new FileInputStream(dst)); ++ ++ int s = 0, d, pos = 0; ++ while (s != -1) { // Checking of just one result for EOF is enough ++ s = srcis.read(); ++ d = dstis.read(); ++ ++ if (s != d) { ++ throw new IOException("Files are differ starting at position: " ++ + Integer.toHexString(pos)); ++ } ++ ++ pos++; ++ } ++ ++ srcis.close(); ++ dstis.close(); ++ } ++ ++ static void generateLargeJar(File result, File source) throws IOException { ++ if (result.exists()) { ++ result.delete(); ++ } ++ ++ try (JarOutputStream copyTo = new JarOutputStream(new FileOutputStream(result)); ++ JarFile srcJar = new JarFile(source)) { ++ ++ for (JarEntry je : Collections.list(srcJar.entries())) { ++ copyTo.putNextEntry(je); ++ if (!je.isDirectory()) { ++ copyStream(srcJar.getInputStream(je), copyTo); ++ } ++ copyTo.closeEntry(); ++ } ++ ++ int many = Short.MAX_VALUE * 2 + 2; ++ ++ for (int i = 0 ; i < many ; i++) { ++ JarEntry e = new JarEntry("F-" + i + ".txt"); ++ copyTo.putNextEntry(e); ++ } ++ copyTo.flush(); ++ copyTo.close(); ++ } ++ } ++ ++ static void copyStream(InputStream in, OutputStream out) throws IOException { ++ int bytesRead; ++ while ((bytesRead = in.read(BUFFER))!= -1) { ++ out.write(BUFFER, 0, bytesRead); ++ } ++ } ++} +--- ./langtools/.hgtags Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/.hgtags Wed Jul 30 03:55:11 2014 -0700 +@@ -245,7 +245,9 @@ + afe63d41c699e0e2ee910ef20c41b60603c852a1 jdk8-b121 + 232b9cf6303aaf451c7000c5f93dfea842e9e9ae jdk8-b122 + a345cf28faca8cc49a28241a0a197fd520d25beb jdk8-b123 ++d5aab8300d3b51e8043ab5fe5832ef6c6cbb5552 jdk8u20-b00 + 436176151e85455e74cd1441a2ba96e791c56785 jdk8-b124 ++79dc4b992c0a385c1364592801781b747b85c6ca jdk8u20-b01 + 436176151e85455e74cd1441a2ba96e791c56785 jdk8-b125 + ba24b63043626003929927f091e8b84190f39261 jdk8-b126 + bb69217ed81202b1a490dc7150dc7cd073689341 jdk8-b127 +@@ -268,6 +270,7 @@ + a12055904afd9f951131804868215e724c71b684 jdk8u5-b11 + 2a7002626e7997e946b96530629e2787bc1864bb jdk8u5-b12 + 9beafb58fb99e8b5f7577b2f26b12743ef4d07e7 jdk8u5-b13 ++6614bfcdcd4d915b1b8e3ba3480d53ff83988290 jdk8u5-b31 + d37e407fba44f68c660f89be4e48f9e7b256a2d5 jdk8u11-b01 + e75f843c4bf81c79ca4c5d51dfe5fe39525c5301 jdk8u11-b02 + d9904b00b027b9176d6479dee7c7f4e054a68710 jdk8u11-b03 +@@ -279,3 +282,32 @@ + e973a591a2182c0bdbdd9545ab13f83325acf1e6 jdk8u11-b09 + 51cade4632608a6c0b8da33f420bd546aecf6faf jdk8u11-b10 + dc0d952b4199dc1cbc534c9afd535c78d21ed519 jdk8u11-b11 ++0a79fea6f9cf713012211e933655175d52c6bc36 jdk8u11-b12 ++16995a2b970df6be039cdaaedb5ade6099ffad8c jdk8u11-b31 ++26b33a6ea08810853af37e81c9b435465b289c98 jdk8u20-b02 ++a07271bca831cf1bab35a2ffbcebd8e060b2734b jdk8u20-b03 ++613c1d9930c9f650e3fc6926215931a85b679c66 jdk8u20-b04 ++27c08b9195d17f8e13cb90f6a7c9b6877062464f jdk8u20-b05 ++9d81ae1c417a4748f58921c1f8def7f3c401cecd jdk8-b130 ++196ab3dcbd28fac1578590684a337f1c7cf505c9 jdk8-b131 ++c8a87a58eb3efdd64055566b502c9d4a72ca0996 jdk8-b132 ++c6d0108aca9f8f45b9cddeb6e483d464509e0127 jdk8u20-b06 ++1a57c569cb811a897691e42049eca33da8f8d761 jdk8u20-b07 ++0f821eb7e92b242c878dca68ef63f9626643ee8f jdk8u20-b08 ++aa0cb3af23d376e012a142b0531c4f42032fdacf jdk8u20-b09 ++a0d9c18a1041c4217db9cda1817f0e348f1be885 jdk8u20-b10 ++7ad480b982bf95b8a7290c8769b2698f6aacaf6b jdk8u20-b11 ++e101a12a45a777268a2e729803499a7514255e5b jdk8u20-b12 ++b5c2375893e2bca1883e5571bd911b6f0b533bf4 jdk8u20-b13 ++5d39c29950f4d65e737f99e468427ae6454fa586 jdk8u20-b14 ++9c577131ffa6aa0720c756232ae6e69bdff1c7ab jdk8u20-b15 ++d9e6bb92751956ab7f0a469e2f3228a4dc5bb05f jdk8u20-b16 ++b45fd486977d6cfe64c9947b7afd203c62ec4e98 jdk8u20-b17 ++a550336d045faa63ac4439d4901d9f36e0b634bf jdk8u20-b18 ++c04d99e00268ed87cfbdf76beb1a0ea08abd9a9c jdk8u20-b19 ++e92effa22ecee1cb9965c278e45e2b1a6fbe0766 jdk8u20-b20 ++7de1481c6cd88b42d815ae65e2d5b1cd918e11d1 jdk8u20-b21 ++61fb0d8b169164ad5db15b6c497489cb30efb9c6 jdk8u20-b22 ++5c1d6da1445aa3a2e5cf6101c70e79bfbe2745a5 jdk8u20-b23 ++9239118487dfb47ee850d2cc9b10a0a2e510da3c jdk8u20-b24 ++9239118487dfb47ee850d2cc9b10a0a2e510da3c jdk8u20-b25 +--- ./langtools/THIRD_PARTY_README Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/THIRD_PARTY_README Wed Jul 30 03:55:11 2014 -0700 +@@ -2,7 +2,7 @@ + ----------------------------- + + %% This notice is provided with respect to ASM Bytecode Manipulation +-Framework v5.0, which may be included with JRE 8, and JDK 8, and ++Framework v5.0.3, which may be included with JRE 8, and JDK 8, and + OpenJDK 8. + + --- begin of LICENSE --- +@@ -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 +@@ -3349,14 +3349,14 @@ + + ------------------------------------------------------------------------------- + +-%% This notice is provided with respect to zlib v1.2.5, which may be included ++%% This notice is provided with respect to zlib v1.2.8, which may be included + with JRE 8, JDK 8, and OpenJDK 8. + + --- begin of LICENSE --- + +- version 1.2.5, July 18th, 2005 +- +- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler ++ version 1.2.8, April 28th, 2013 ++ ++ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages +@@ -3382,11 +3382,11 @@ + ------------------------------------------------------------------------------- + + %% This notice is provided with respect to the following which may be +-included with JRE 8, JDK 8, and OpenJDK 8, except where noted: +- +- Apache Commons Math 2.2 +- Apache Derby 10.10.1.2 [included with JDK 8] +- Apache Jakarta BCEL 5.2 ++included with JRE 8, JDK 8, and OpenJDK 8. ++ ++ Apache Commons Math 3.2 ++ Apache Derby 10.10.1.3 ++ Apache Jakarta BCEL 5.1 + Apache Jakarta Regexp 1.4 + Apache Santuario XML Security for Java 1.5.4 + Apache Xalan-Java 2.7.1 +--- ./langtools/src/share/classes/com/sun/tools/classfile/Attribute.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/classfile/Attribute.java Wed Jul 30 03:55:11 2014 -0700 +@@ -71,10 +71,6 @@ + // defer init of standardAttributeClasses until after options set up + } + +- public void setCompat(boolean compat) { +- this.compat = compat; +- } +- + public Attribute createAttribute(ClassReader cr, int name_index, byte[] data) + throws IOException { + if (standardAttributes == null) { +@@ -109,9 +105,10 @@ + protected void init() { + standardAttributes = new HashMap<String,Class<? extends Attribute>>(); + standardAttributes.put(AnnotationDefault, AnnotationDefault_attribute.class); +- standardAttributes.put(BootstrapMethods, BootstrapMethods_attribute.class); ++ standardAttributes.put(BootstrapMethods, BootstrapMethods_attribute.class); + standardAttributes.put(CharacterRangeTable, CharacterRangeTable_attribute.class); + standardAttributes.put(Code, Code_attribute.class); ++ standardAttributes.put(CompilationID, CompilationID_attribute.class); + standardAttributes.put(ConstantValue, ConstantValue_attribute.class); + standardAttributes.put(Deprecated, Deprecated_attribute.class); + standardAttributes.put(EnclosingMethod, EnclosingMethod_attribute.class); +@@ -120,29 +117,23 @@ + standardAttributes.put(LineNumberTable, LineNumberTable_attribute.class); + standardAttributes.put(LocalVariableTable, LocalVariableTable_attribute.class); + standardAttributes.put(LocalVariableTypeTable, LocalVariableTypeTable_attribute.class); +- +- if (!compat) { // old javap does not recognize recent attributes +- standardAttributes.put(MethodParameters, MethodParameters_attribute.class); +- standardAttributes.put(CompilationID, CompilationID_attribute.class); +- standardAttributes.put(RuntimeInvisibleAnnotations, RuntimeInvisibleAnnotations_attribute.class); +- standardAttributes.put(RuntimeInvisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations_attribute.class); +- standardAttributes.put(RuntimeVisibleAnnotations, RuntimeVisibleAnnotations_attribute.class); +- standardAttributes.put(RuntimeVisibleParameterAnnotations, RuntimeVisibleParameterAnnotations_attribute.class); +- standardAttributes.put(RuntimeVisibleTypeAnnotations, RuntimeVisibleTypeAnnotations_attribute.class); +- standardAttributes.put(RuntimeInvisibleTypeAnnotations, RuntimeInvisibleTypeAnnotations_attribute.class); +- standardAttributes.put(Signature, Signature_attribute.class); +- standardAttributes.put(SourceID, SourceID_attribute.class); +- } +- ++ standardAttributes.put(MethodParameters, MethodParameters_attribute.class); ++ standardAttributes.put(RuntimeInvisibleAnnotations, RuntimeInvisibleAnnotations_attribute.class); ++ standardAttributes.put(RuntimeInvisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations_attribute.class); ++ standardAttributes.put(RuntimeVisibleAnnotations, RuntimeVisibleAnnotations_attribute.class); ++ standardAttributes.put(RuntimeVisibleParameterAnnotations, RuntimeVisibleParameterAnnotations_attribute.class); ++ standardAttributes.put(RuntimeVisibleTypeAnnotations, RuntimeVisibleTypeAnnotations_attribute.class); ++ standardAttributes.put(RuntimeInvisibleTypeAnnotations, RuntimeInvisibleTypeAnnotations_attribute.class); ++ standardAttributes.put(Signature, Signature_attribute.class); + standardAttributes.put(SourceDebugExtension, SourceDebugExtension_attribute.class); + standardAttributes.put(SourceFile, SourceFile_attribute.class); ++ standardAttributes.put(SourceID, SourceID_attribute.class); + standardAttributes.put(StackMap, StackMap_attribute.class); + standardAttributes.put(StackMapTable, StackMapTable_attribute.class); + standardAttributes.put(Synthetic, Synthetic_attribute.class); + } + + private Map<String,Class<? extends Attribute>> standardAttributes; +- private boolean compat; // don't support recent attrs in compatibility mode + } + + public static Attribute read(ClassReader cr) throws IOException { +--- ./langtools/src/share/classes/com/sun/tools/classfile/Instruction.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/classfile/Instruction.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2009, 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 +@@ -25,6 +25,8 @@ + + package com.sun.tools.classfile; + ++import java.util.Locale; ++ + /** + * See JVMS, chapter 6. + * +@@ -211,7 +213,7 @@ + if (opcode == null) + return "bytecode " + getUnsignedByte(0); + else +- return opcode.toString().toLowerCase(); ++ return opcode.toString().toLowerCase(Locale.US); + } + + /** Get the length, in bytes, of this instruction, including the opcode +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Wed Jul 30 03:55:11 2014 -0700 +@@ -37,6 +37,7 @@ + import com.sun.tools.doclint.DocLint; + import com.sun.tools.javac.file.JavacFileManager; + import com.sun.tools.javac.util.Context; ++import com.sun.tools.javac.util.StringUtils; + import com.sun.tools.javadoc.RootDocImpl; + + /** +@@ -237,7 +238,7 @@ + public void setSpecificDocletOptions(String[][] options) { + for (int oi = 0; oi < options.length; ++oi) { + String[] os = options[oi]; +- String opt = os[0].toLowerCase(); ++ String opt = StringUtils.toLowerCase(os[0]); + if (opt.equals("-footer")) { + footer = os[1]; + } else if (opt.equals("-header")) { +@@ -325,7 +326,7 @@ + return result; + } + // otherwise look for the options we have added +- option = option.toLowerCase(); ++ option = StringUtils.toLowerCase(option); + if (option.equals("-nodeprecatedlist") || + option.equals("-noindex") || + option.equals("-notree") || +@@ -389,7 +390,7 @@ + // otherwise look at our options + for (int oi = 0; oi < options.length; ++oi) { + String[] os = options[oi]; +- String opt = os[0].toLowerCase(); ++ String opt = StringUtils.toLowerCase(os[0]); + if (opt.equals("-helpfile")) { + if (nohelp == true) { + reporter.printError(getText("doclet.Option_conflict", +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Wed Jul 30 03:55:11 2014 -0700 +@@ -28,12 +28,15 @@ + import java.io.*; + import java.text.SimpleDateFormat; + import java.util.*; ++import java.util.regex.Matcher; ++import java.util.regex.Pattern; + + import com.sun.javadoc.*; + import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.taglets.*; + import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Class for the Html Format Code Generation specific to JavaDoc. +@@ -138,42 +141,37 @@ + if (index < 0) { + return htmlstr; + } +- String lowerHtml = htmlstr.toLowerCase(); +- // Return index of first occurrence of {@docroot} +- // Note: {@docRoot} is not case sensitive when passed in w/command line option +- index = lowerHtml.indexOf("{@docroot}", index); +- if (index < 0) { ++ Matcher docrootMatcher = docrootPattern.matcher(htmlstr); ++ if (!docrootMatcher.find()) { + return htmlstr; + } + StringBuilder buf = new StringBuilder(); +- int previndex = 0; +- while (true) { +- final String docroot = "{@docroot}"; +- // Search for lowercase version of {@docRoot} +- index = lowerHtml.indexOf(docroot, previndex); +- // If next {@docRoot} tag not found, append rest of htmlstr and exit loop +- if (index < 0) { +- buf.append(htmlstr.substring(previndex)); +- break; +- } +- // If next {@docroot} tag found, append htmlstr up to start of tag +- buf.append(htmlstr.substring(previndex, index)); +- previndex = index + docroot.length(); +- if (configuration.docrootparent.length() > 0 && htmlstr.startsWith("/..", previndex)) { ++ int prevEnd = 0; ++ do { ++ int match = docrootMatcher.start(); ++ // append htmlstr up to start of next {@docroot} ++ buf.append(htmlstr.substring(prevEnd, match)); ++ prevEnd = docrootMatcher.end(); ++ if (configuration.docrootparent.length() > 0 && htmlstr.startsWith("/..", prevEnd)) { + // Insert the absolute link if {@docRoot} is followed by "/..". + buf.append(configuration.docrootparent); +- previndex += 3; ++ prevEnd += 3; + } else { + // Insert relative path where {@docRoot} was located + buf.append(pathToRoot.isEmpty() ? "." : pathToRoot.getPath()); + } + // Append slash if next character is not a slash +- if (previndex < htmlstr.length() && htmlstr.charAt(previndex) != '/') { ++ if (prevEnd < htmlstr.length() && htmlstr.charAt(prevEnd) != '/') { + buf.append('/'); + } +- } ++ } while (docrootMatcher.find()); ++ buf.append(htmlstr.substring(prevEnd)); + return buf.toString(); + } ++ //where: ++ // Note: {@docRoot} is not case sensitive when passed in w/command line option: ++ private static final Pattern docrootPattern = ++ Pattern.compile(Pattern.quote("{@docroot}"), Pattern.CASE_INSENSITIVE); + + /** + * Get the script to show or hide the All classes link. +@@ -1689,13 +1687,13 @@ + } + + //Redirect all relative links. +- int end, begin = text.toLowerCase().indexOf("<a"); ++ int end, begin = StringUtils.indexOfIgnoreCase(text, "<a"); + if(begin >= 0){ + StringBuilder textBuff = new StringBuilder(text); + + while(begin >=0){ + if (textBuff.length() > begin + 2 && ! Character.isWhitespace(textBuff.charAt(begin+2))) { +- begin = textBuff.toString().toLowerCase().indexOf("<a", begin + 1); ++ begin = StringUtils.indexOfIgnoreCase(textBuff.toString(), "<a", begin + 1); + continue; + } + +@@ -1722,15 +1720,16 @@ + } + } + String relativeLink = textBuff.substring(begin, end); +- if (!(relativeLink.toLowerCase().startsWith("mailto:") || +- relativeLink.toLowerCase().startsWith("http:") || +- relativeLink.toLowerCase().startsWith("https:") || +- relativeLink.toLowerCase().startsWith("file:"))) { ++ String relativeLinkLowerCase = StringUtils.toLowerCase(relativeLink); ++ if (!(relativeLinkLowerCase.startsWith("mailto:") || ++ relativeLinkLowerCase.startsWith("http:") || ++ relativeLinkLowerCase.startsWith("https:") || ++ relativeLinkLowerCase.startsWith("file:"))) { + relativeLink = "{@"+(new DocRootTaglet()).getName() + "}/" + + redirectPathFromRoot.resolve(relativeLink).getPath(); + textBuff.replace(begin, end, relativeLink); + } +- begin = textBuff.toString().toLowerCase().indexOf("<a", begin + 1); ++ begin = StringUtils.indexOfIgnoreCase(textBuff.toString(), "<a", begin + 1); + } + return textBuff.toString(); + } +@@ -1771,7 +1770,7 @@ + break main; + ch = text.charAt(currPos); + } +- if (ch == '>' && blockTags.contains(text.substring(tagPos, currPos).toLowerCase())) { ++ if (ch == '>' && blockTags.contains(StringUtils.toLowerCase(text.substring(tagPos, currPos)))) { + result.append(text, startPos, lessThanPos); + startPos = currPos + 1; + } +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -31,6 +31,7 @@ + import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Writes method documentation in HTML format. +@@ -331,24 +332,6 @@ + } + + /** +- * Parse the <Code> tag and return the text. +- */ +- protected String parseCodeTag(String tag){ +- if(tag == null){ +- return ""; +- } +- +- String lc = tag.toLowerCase(); +- int begin = lc.indexOf("<code>"); +- int end = lc.indexOf("</code>"); +- if(begin == -1 || end == -1 || end <= begin){ +- return tag; +- } else { +- return tag.substring(begin + 6, end); +- } +- } +- +- /** + * {@inheritDoc} + */ + protected static void addImplementsInfo(HtmlDocletWriter writer, +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java Wed Jul 30 03:55:11 2014 -0700 +@@ -25,6 +25,8 @@ + + package com.sun.tools.doclets.formats.html.markup; + ++import com.sun.tools.javac.util.StringUtils; ++ + /** + * Enum representing HTML tag attributes. + * +@@ -64,7 +66,7 @@ + private final String value; + + HtmlAttr() { +- this.value = name().toLowerCase(); ++ this.value = StringUtils.toLowerCase(name()); + } + + HtmlAttr(String name) { +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java Wed Jul 30 03:55:11 2014 -0700 +@@ -25,7 +25,7 @@ + + package com.sun.tools.doclets.formats.html.markup; + +-import java.util.Locale; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Enum representing HTML tags. +@@ -117,7 +117,7 @@ + HtmlTag(BlockType blockType, EndTag endTag ) { + this.blockType = blockType; + this.endTag = endTag; +- this.value = name().toLowerCase(Locale.US); ++ this.value = StringUtils.toLowerCase(name()); + } + + /** +--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard_ja.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard_ja.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -29,7 +29,7 @@ + doclet.Href_Enum_Title={0}\u5185\u306E\u5217\u6319\u578B + doclet.Href_Type_Param_Title={0}\u5185\u306E\u578B\u30D1\u30E9\u30E1\u30FC\u30BF + doclet.Href_Class_Or_Interface_Title={0}\u5185\u306E\u30AF\u30E9\u30B9\u307E\u305F\u306F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9 +-doclet.Summary=\u6982\u8981: ++doclet.Summary=\u30B5\u30DE\u30EA\u30FC: + doclet.Detail=\u8A73\u7D30: + doclet.navNested=\u30CD\u30B9\u30C8 + doclet.navAnnotationTypeOptionalMember=\u30AA\u30D7\u30B7\u30E7\u30F3 +@@ -117,18 +117,18 @@ + doclet.Window_Source_title=\u30BD\u30FC\u30B9\u30FB\u30B3\u30FC\u30C9 + doclet.Window_Help_title=API\u30D8\u30EB\u30D7 + doclet.Help_line_1=API\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u69CB\u6210 +-doclet.Help_line_2=\u3053\u306EAPI(Application Programming Interface)\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306B\u306F\u3001\u6B21\u306B\u8AAC\u660E\u3059\u308B\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u30FB\u30D0\u30FC\u306B\u3042\u308B\u9805\u76EE\u306B\u5BFE\u5FDC\u3059\u308B\u30DA\u30FC\u30B8\u304C\u542B\u307E\u308C\u307E\u3059\u3002 +-doclet.Help_line_3={0}\u30DA\u30FC\u30B8\u306FAPI\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30D5\u30ED\u30F3\u30C8\u30FB\u30DA\u30FC\u30B8\u3067\u3001\u5404\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u6982\u8981\u3092\u542B\u3080\u5168\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u30EA\u30B9\u30C8\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u4E00\u9023\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u6982\u8981\u8AAC\u660E\u3082\u8868\u793A\u3055\u308C\u307E\u3059\u3002 +-doclet.Help_line_4=\u5404\u30D1\u30C3\u30B1\u30FC\u30B8\u306B\u306F\u3001\u305D\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306E\u30EA\u30B9\u30C8\u3068\u3001\u305D\u308C\u305E\u308C\u306E\u6982\u8981\u3092\u542B\u3080\u30DA\u30FC\u30B8\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30DA\u30FC\u30B8\u306F6\u3064\u306E\u30AB\u30C6\u30B4\u30EA\u3067\u69CB\u6210\u3055\u308C\u307E\u3059\u3002 ++doclet.Help_line_2=\u3053\u306EAPI (Application Programming Interface)\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306B\u306F\u3001\u6B21\u306B\u8AAC\u660E\u3059\u308B\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u30FB\u30D0\u30FC\u306B\u3042\u308B\u9805\u76EE\u306B\u5BFE\u5FDC\u3059\u308B\u30DA\u30FC\u30B8\u304C\u542B\u307E\u308C\u307E\u3059\u3002 ++doclet.Help_line_3={0}\u30DA\u30FC\u30B8\u306FAPI\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30D5\u30ED\u30F3\u30C8\u30FB\u30DA\u30FC\u30B8\u3067\u3001\u5404\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u30B5\u30DE\u30EA\u30FC\u3092\u542B\u3080\u5168\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u30EA\u30B9\u30C8\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u4E00\u9023\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u5168\u4F53\u7684\u306A\u8AAC\u660E\u3082\u8868\u793A\u3055\u308C\u307E\u3059\u3002 ++doclet.Help_line_4=\u5404\u30D1\u30C3\u30B1\u30FC\u30B8\u306B\u306F\u3001\u305D\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306E\u30EA\u30B9\u30C8\u3068\u3001\u305D\u308C\u305E\u308C\u306E\u30B5\u30DE\u30EA\u30FC\u3092\u542B\u3080\u30DA\u30FC\u30B8\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30DA\u30FC\u30B8\u306F6\u3064\u306E\u30AB\u30C6\u30B4\u30EA\u3067\u69CB\u6210\u3055\u308C\u307E\u3059\u3002 + doclet.Help_line_5=\u30AF\u30E9\u30B9\u307E\u305F\u306F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9 +-doclet.Help_line_6=\u5404\u30AF\u30E9\u30B9\u3001\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3001\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306B\u306F\u500B\u5225\u306E\u30DA\u30FC\u30B8\u304C\u3042\u308A\u307E\u3059\u3002\u5404\u30DA\u30FC\u30B8\u306B\u306F\u6B21\u306E\u3088\u3046\u306B\u3001\u30AF\u30E9\u30B9\u307E\u305F\u306F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306E\u8AAC\u660E\u3068\u3001\u6982\u8981\u8868\u304A\u3088\u3073\u30E1\u30F3\u30D0\u30FC\u306E\u8A73\u7D30\u8AAC\u660E\u304C\u542B\u307E\u308C\u307E\u3059\u3002 ++doclet.Help_line_6=\u5404\u30AF\u30E9\u30B9\u3001\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3001\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306B\u306F\u500B\u5225\u306E\u30DA\u30FC\u30B8\u304C\u3042\u308A\u307E\u3059\u3002\u5404\u30DA\u30FC\u30B8\u306B\u306F\u6B21\u306E\u3088\u3046\u306B\u3001\u30AF\u30E9\u30B9\u307E\u305F\u306F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306E\u8AAC\u660E\u3068\u3001\u30B5\u30DE\u30EA\u30FC\u8868\u304A\u3088\u3073\u30E1\u30F3\u30D0\u30FC\u306E\u8A73\u7D30\u8AAC\u660E\u304C\u542B\u307E\u308C\u307E\u3059\u3002 + doclet.Help_line_7=\u30AF\u30E9\u30B9\u968E\u5C64\u8868\u793A + doclet.Help_line_8=\u76F4\u7CFB\u306E\u30B5\u30D6\u30AF\u30E9\u30B9 + doclet.Help_line_9=\u65E2\u77E5\u306E\u30B5\u30D6\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306E\u30EA\u30B9\u30C8 + doclet.Help_line_10=\u65E2\u77E5\u306E\u5B9F\u88C5\u30AF\u30E9\u30B9\u306E\u30EA\u30B9\u30C8 + doclet.Help_line_11=\u30AF\u30E9\u30B9\u307E\u305F\u306F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306E\u5BA3\u8A00 + doclet.Help_line_12=\u30AF\u30E9\u30B9\u307E\u305F\u306F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306E\u8AAC\u660E +-doclet.Help_line_13=\u5404\u6982\u8981\u30A8\u30F3\u30C8\u30EA\u306B\u306F\u3001\u305D\u306E\u9805\u76EE\u306E\u8A73\u7D30\u306A\u8AAC\u660E\u306E\u4E2D\u304B\u30891\u884C\u76EE\u306E\u6587\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u8A73\u7D30\u306A\u8AAC\u660E\u306F\u30BD\u30FC\u30B9\u30FB\u30B3\u30FC\u30C9\u306B\u73FE\u308C\u308B\u9806\u306B\u4E26\u3079\u3089\u308C\u307E\u3059\u304C\u3001\u6982\u8981\u30A8\u30F3\u30C8\u30EA\u306F\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8\u9806\u306B\u4E26\u3079\u3089\u308C\u307E\u3059\u3002\u3053\u308C\u306B\u3088\u3063\u3066\u3001\u30D7\u30ED\u30B0\u30E9\u30DE\u304C\u8A2D\u5B9A\u3057\u305F\u8AD6\u7406\u7684\u306A\u30B0\u30EB\u30FC\u30D7\u5206\u3051\u304C\u4FDD\u6301\u3055\u308C\u307E\u3059\u3002 ++doclet.Help_line_13=\u5404\u30B5\u30DE\u30EA\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u306B\u306F\u3001\u305D\u306E\u9805\u76EE\u306E\u8A73\u7D30\u8AAC\u660E\u306E\u4E2D\u304B\u30891\u884C\u76EE\u306E\u6587\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u30B5\u30DE\u30EA\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u306F\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8\u9806\u3067\u3059\u304C\u3001\u8A73\u7D30\u8AAC\u660E\u306F\u30BD\u30FC\u30B9\u30FB\u30B3\u30FC\u30C9\u306B\u73FE\u308C\u308B\u9806\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002\u3053\u308C\u306B\u3088\u3063\u3066\u3001\u30D7\u30ED\u30B0\u30E9\u30DE\u304C\u8A2D\u5B9A\u3057\u305F\u8AD6\u7406\u7684\u306A\u30B0\u30EB\u30FC\u30D7\u5206\u3051\u304C\u4FDD\u6301\u3055\u308C\u307E\u3059\u3002 + doclet.Help_line_14=\u4F7F\u7528 + doclet.Help_line_15=\u5404\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5316\u3055\u308C\u305F\u30D1\u30C3\u30B1\u30FC\u30B8\u3001\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306B\u306F\u305D\u308C\u305E\u308C\u300C\u4F7F\u7528\u300D\u30DA\u30FC\u30B8\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30DA\u30FC\u30B8\u306B\u306F\u3001\u3069\u306E\u3088\u3046\u306A\u30D1\u30C3\u30B1\u30FC\u30B8\u3001\u30AF\u30E9\u30B9\u3001\u30E1\u30BD\u30C3\u30C9\u3001\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u304A\u3088\u3073\u30D5\u30A3\u30FC\u30EB\u30C9\u304C\u3001\u7279\u5B9A\u306E\u30AF\u30E9\u30B9\u307E\u305F\u306F\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u4E00\u90E8\u3092\u4F7F\u7528\u3057\u3066\u3044\u308B\u304B\u304C\u8A18\u8FF0\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u305F\u3068\u3048\u3070\u3001\u30AF\u30E9\u30B9A\u307E\u305F\u306F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9A\u306E\u5834\u5408\u3001\u305D\u306E\u300C\u4F7F\u7528\u300D\u30DA\u30FC\u30B8\u306B\u306F\u3001A\u306E\u30B5\u30D6\u30AF\u30E9\u30B9\u3001A\u3068\u3057\u3066\u5BA3\u8A00\u3055\u308C\u308B\u30D5\u30A3\u30FC\u30EB\u30C9\u3001A\u3092\u8FD4\u3059\u30E1\u30BD\u30C3\u30C9\u3068\u3001\u578BA\u3092\u6301\u3064\u30E1\u30BD\u30C3\u30C9\u304A\u3088\u3073\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u304C\u542B\u307E\u308C\u307E\u3059\u3002\u3053\u306E\u30DA\u30FC\u30B8\u306B\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u306B\u306F\u3001\u307E\u305A\u305D\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u3001\u30AF\u30E9\u30B9\u307E\u305F\u306F\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306B\u79FB\u52D5\u3057\u3001\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u30FB\u30D0\u30FC\u306E\u300C\u4F7F\u7528\u300D\u30EA\u30F3\u30AF\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + doclet.Help_line_16=\u968E\u5C64\u30C4\u30EA\u30FC(\u30AF\u30E9\u30B9\u968E\u5C64) +--- ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java Wed Jul 30 03:55:11 2014 -0700 +@@ -29,6 +29,7 @@ + import java.util.*; + import java.util.regex.Matcher; + import java.util.regex.Pattern; ++import javax.tools.JavaFileManager; + + import com.sun.javadoc.*; + import com.sun.tools.javac.sym.Profiles; +@@ -36,7 +37,7 @@ + import com.sun.tools.doclets.internal.toolkit.builders.BuilderFactory; + import com.sun.tools.doclets.internal.toolkit.taglets.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +-import javax.tools.JavaFileManager; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Configure the output based on the options. Doclets should sub-class +@@ -337,7 +338,7 @@ + * Negative value means error occurred. + */ + public int optionLength(String option) { +- option = option.toLowerCase(); ++ option = StringUtils.toLowerCase(option); + if (option.equals("-author") || + option.equals("-docfilessubdirs") || + option.equals("-javafx") || +@@ -454,7 +455,7 @@ + // the output directory has already been created: so do that first. + for (int oi = 0; oi < options.length; ++oi) { + String[] os = options[oi]; +- String opt = os[0].toLowerCase(); ++ String opt = StringUtils.toLowerCase(os[0]); + if (opt.equals("-d")) { + destDirName = addTrailingFileSep(os[1]); + docFileDestDirName = destDirName; +@@ -465,7 +466,7 @@ + + for (int oi = 0; oi < options.length; ++oi) { + String[] os = options[oi]; +- String opt = os[0].toLowerCase(); ++ String opt = StringUtils.toLowerCase(os[0]); + if (opt.equals("-docfilessubdirs")) { + copydocfilesubdirs = true; + } else if (opt.equals("-docencoding")) { +@@ -708,7 +709,7 @@ + String encoding = ""; + for (int oi = 0; oi < options.length; oi++) { + String[] os = options[oi]; +- String opt = os[0].toLowerCase(); ++ String opt = StringUtils.toLowerCase(os[0]); + if (opt.equals("-docencoding")) { + docencodingfound = true; + if (!checkOutputFileEncoding(os[1], reporter)) { +--- ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java Wed Jul 30 03:55:11 2014 -0700 +@@ -384,13 +384,13 @@ + commentTextBuilder.append( + MessageFormat.format( + configuration.getText("doclet.PropertySetterWithName"), +- Util.propertyNameFromMethodName(member.name()))); ++ Util.propertyNameFromMethodName(configuration, member.name()))); + } + if (isGetter) { + commentTextBuilder.append( + MessageFormat.format( + configuration.getText("doclet.PropertyGetterWithName"), +- Util.propertyNameFromMethodName(member.name()))); ++ Util.propertyNameFromMethodName(configuration, member.name()))); + } + if (propertyDoc.commentText() != null + && !propertyDoc.commentText().isEmpty()) { +--- ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java Wed Jul 30 03:55:11 2014 -0700 +@@ -31,6 +31,7 @@ + import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Builds the serialized form. +@@ -567,7 +568,7 @@ + } + Tag[] serial = doc.tags("serial"); + if (serial.length > 0) { +- String serialtext = serial[0].text().toLowerCase(); ++ String serialtext = StringUtils.toLowerCase(serial[0].text()); + if (serialtext.indexOf("exclude") >= 0) { + return false; + } else if (serialtext.indexOf("include") >= 0) { +--- ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets_ja.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets_ja.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -66,22 +66,22 @@ + doclet.malformed_html_link_tag=<a> \u30BF\u30B0\u306E\u5F62\u5F0F\u304C\u4E0D\u6B63:\n"{0}" + doclet.tag_misuse={0}\u30BF\u30B0\u306F{1}\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5185\u3067\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002\u4F7F\u7528\u3067\u304D\u308B\u306E\u306F\u6B21\u306E\u30BF\u30A4\u30D7\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u5185\u306E\u307F\u3067\u3059: {2}\u3002 + doclet.javafx_tag_misuse=\u30BF\u30B0@propertyGetter\u3001@propertySetter\u304A\u3088\u3073@propertyDescription\u306F\u3001JavaFX\u306E\u30D7\u30ED\u30D1\u30C6\u30A3getter\u3068setter\u306E\u307F\u3067\u4F7F\u7528\u3067\u304D\u307E\u3059\u3002 +-doclet.Package_Summary=\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u6982\u8981 ++doclet.Package_Summary=\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u30B5\u30DE\u30EA\u30FC + doclet.Profile_Summary=\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u30FB\u30B5\u30DE\u30EA\u30FC +-doclet.Interface_Summary=\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306E\u6982\u8981 +-doclet.Annotation_Types_Summary=\u6CE8\u91C8\u578B\u306E\u6982\u8981 +-doclet.Enum_Summary=\u5217\u6319\u578B\u306E\u6982\u8981 +-doclet.Exception_Summary=\u4F8B\u5916\u306E\u6982\u8981 +-doclet.Error_Summary=\u30A8\u30E9\u30FC\u306E\u6982\u8981 +-doclet.Class_Summary=\u30AF\u30E9\u30B9\u306E\u6982\u8981 +-doclet.Nested_Class_Summary=\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30AF\u30E9\u30B9\u306E\u6982\u8981 +-doclet.Annotation_Type_Optional_Member_Summary=\u4EFB\u610F\u8981\u7D20\u306E\u6982\u8981 +-doclet.Annotation_Type_Required_Member_Summary=\u5FC5\u9808\u8981\u7D20\u306E\u6982\u8981 +-doclet.Field_Summary=\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u6982\u8981 +-doclet.Property_Summary=\u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u6982\u8981 +-doclet.Enum_Constant_Summary=\u5217\u6319\u578B\u5B9A\u6570\u306E\u6982\u8981 +-doclet.Constructor_Summary=\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u306E\u6982\u8981 +-doclet.Method_Summary=\u30E1\u30BD\u30C3\u30C9\u306E\u6982\u8981 ++doclet.Interface_Summary=\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Annotation_Types_Summary=\u6CE8\u91C8\u578B\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Enum_Summary=\u5217\u6319\u578B\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Exception_Summary=\u4F8B\u5916\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Error_Summary=\u30A8\u30E9\u30FC\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Class_Summary=\u30AF\u30E9\u30B9\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Nested_Class_Summary=\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30AF\u30E9\u30B9\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Annotation_Type_Optional_Member_Summary=\u4EFB\u610F\u8981\u7D20\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Annotation_Type_Required_Member_Summary=\u5FC5\u9808\u8981\u7D20\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Field_Summary=\u30D5\u30A3\u30FC\u30EB\u30C9\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Property_Summary=\u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Enum_Constant_Summary=\u5217\u6319\u578B\u5B9A\u6570\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Constructor_Summary=\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u306E\u30B5\u30DE\u30EA\u30FC ++doclet.Method_Summary=\u30E1\u30BD\u30C3\u30C9\u306E\u30B5\u30DE\u30EA\u30FC + doclet.Interfaces=\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9 + doclet.Enums=\u5217\u6319\u578B + doclet.AnnotationTypes=\u6CE8\u91C8\u578B +--- ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java Wed Jul 30 03:55:11 2014 -0700 +@@ -28,6 +28,7 @@ + import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.Content; + import com.sun.tools.doclets.internal.toolkit.util.DocFinder; ++import com.sun.tools.javac.util.StringUtils; + + /** + * A simple single argument custom tag. +@@ -110,7 +111,7 @@ + public SimpleTaglet(String tagName, String header, String locations) { + this.tagName = tagName; + this.header = header; +- locations = locations.toLowerCase(); ++ locations = StringUtils.toLowerCase(locations); + if (locations.indexOf(ALL) != -1 && locations.indexOf(EXCLUDED) == -1) { + this.locations = PACKAGE + TYPE + FIELD + METHOD + CONSTRUCTOR + OVERVIEW; + } else { +--- ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java Wed Jul 30 03:55:11 2014 -0700 +@@ -35,6 +35,7 @@ + + import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Manages the<code>Taglet</code>s used by doclets. +@@ -304,7 +305,7 @@ + return; + } + Taglet tag = customTags.get(tagName); +- locations = locations.toLowerCase(); ++ locations = StringUtils.toLowerCase(locations); + if (tag == null || header != null) { + customTags.remove(tagName); + customTags.put(tagName, new SimpleTaglet(tagName, header, locations)); +@@ -375,7 +376,7 @@ + name = name.substring(1, name.length()); + } + if (! (standardTags.contains(name) || customTags.containsKey(name))) { +- if (standardTagsLowercase.contains(name.toLowerCase())) { ++ if (standardTagsLowercase.contains(StringUtils.toLowerCase(name))) { + message.warning(tags[i].position(), "doclet.UnknownTagLowercase", tags[i].name()); + continue; + } else { +@@ -708,7 +709,7 @@ + private void initStandardTagsLowercase() { + Iterator<String> it = standardTags.iterator(); + while (it.hasNext()) { +- standardTagsLowercase.add(it.next().toLowerCase()); ++ standardTagsLowercase.add(StringUtils.toLowerCase(it.next())); + } + } + +--- ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -177,7 +177,7 @@ + try { + url = adjustEndFileSeparator(url); + if (isUrl(pkglisturl)) { +- readPackageListFromURL(url, toURL(pkglisturl)); ++ readPackageListFromURL(url, toURL(adjustEndFileSeparator(pkglisturl))); + } else { + readPackageListFromFile(url, DocFile.createFileForInput(configuration, pkglisturl)); + } +--- ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java Wed Jul 30 03:55:11 2014 -0700 +@@ -28,11 +28,12 @@ + import java.io.*; + import java.lang.annotation.ElementType; + import java.util.*; ++import javax.tools.StandardLocation; + + import com.sun.javadoc.*; + import com.sun.javadoc.AnnotationDesc.ElementValuePair; + import com.sun.tools.doclets.internal.toolkit.*; +-import javax.tools.StandardLocation; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Utilities Class for Doclets. +@@ -253,8 +254,8 @@ + */ + private static class TypeComparator implements Comparator<Type> { + public int compare(Type type1, Type type2) { +- return type1.qualifiedTypeName().toLowerCase().compareTo( +- type2.qualifiedTypeName().toLowerCase()); ++ return type1.qualifiedTypeName().compareToIgnoreCase( ++ type2.qualifiedTypeName()); + } + } + +@@ -589,7 +590,7 @@ + typeName = "doclet.Enum"; + } + return config.getText( +- lowerCaseOnly ? typeName.toLowerCase() : typeName); ++ lowerCaseOnly ? StringUtils.toLowerCase(typeName) : typeName); + } + + /** +@@ -724,7 +725,7 @@ + * @param name name of the getter or setter method. + * @return the name of the property of the given setter of getter. + */ +- public static String propertyNameFromMethodName(String name) { ++ public static String propertyNameFromMethodName(Configuration configuration, String name) { + String propertyName = null; + if (name.startsWith("get") || name.startsWith("set")) { + propertyName = name.substring(3); +@@ -734,7 +735,7 @@ + if ((propertyName == null) || propertyName.isEmpty()){ + return ""; + } +- return propertyName.substring(0, 1).toLowerCase() ++ return propertyName.substring(0, 1).toLowerCase(configuration.getLocale()) + + propertyName.substring(1); + } + +--- ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java Wed Jul 30 03:55:11 2014 -0700 +@@ -702,7 +702,7 @@ + private boolean isPropertyGetterOrSetter(MethodDoc[] members, + MethodDoc methodDoc) { + boolean found = false; +- String propertyName = Util.propertyNameFromMethodName(methodDoc.name()); ++ String propertyName = Util.propertyNameFromMethodName(configuration, methodDoc.name()); + if (!propertyName.isEmpty()) { + String propertyMethodName = propertyName + "Property"; + for (MethodDoc member: members) { +--- ./langtools/src/share/classes/com/sun/tools/doclint/Checker.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclint/Checker.java Wed Jul 30 03:55:11 2014 -0700 +@@ -80,6 +80,7 @@ + import com.sun.source.util.TreePath; + import com.sun.tools.doclint.HtmlTag.AttrKind; + import com.sun.tools.javac.tree.DocPretty; ++import com.sun.tools.javac.util.StringUtils; + import static com.sun.tools.doclint.Messages.Group.*; + + +@@ -243,7 +244,7 @@ + markEnclosingTag(Flag.HAS_TEXT); + String name = tree.getName().toString(); + if (name.startsWith("#")) { +- int v = name.toLowerCase().startsWith("#x") ++ int v = StringUtils.toLowerCase(name).startsWith("#x") + ? Integer.parseInt(name.substring(2), 16) + : Integer.parseInt(name.substring(1), 10); + if (!Entity.isValid(v)) { +--- ./langtools/src/share/classes/com/sun/tools/doclint/Env.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclint/Env.java Wed Jul 30 03:55:11 2014 -0700 +@@ -44,6 +44,7 @@ + import com.sun.source.util.TreePath; + import com.sun.tools.javac.model.JavacTypes; + import com.sun.tools.javac.tree.JCTree; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Utility container for current execution environment, +@@ -66,7 +67,7 @@ + + static boolean accepts(String opt) { + for (AccessKind g: values()) +- if (opt.equals(g.name().toLowerCase())) return true; ++ if (opt.equals(StringUtils.toLowerCase(g.name()))) return true; + return false; + } + +--- ./langtools/src/share/classes/com/sun/tools/doclint/HtmlTag.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclint/HtmlTag.java Wed Jul 30 03:55:11 2014 -0700 +@@ -36,6 +36,7 @@ + import javax.lang.model.element.Name; + + import static com.sun.tools.doclint.HtmlTag.Attr.*; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Enum representing HTML tags. +@@ -352,7 +353,7 @@ + WIDTH; + + public String getText() { +- return toLowerCase(name()); ++ return StringUtils.toLowerCase(name()); + } + + static final Map<String,Attr> index = new HashMap<String,Attr>(); +@@ -431,11 +432,11 @@ + } + + public String getText() { +- return toLowerCase(name()); ++ return StringUtils.toLowerCase(name()); + } + + public Attr getAttr(Name attrName) { +- return Attr.index.get(toLowerCase(attrName.toString())); ++ return Attr.index.get(StringUtils.toLowerCase(attrName.toString())); + } + + public AttrKind getAttrKind(Name attrName) { +@@ -457,10 +458,7 @@ + } + + static HtmlTag get(Name tagName) { +- return index.get(toLowerCase(tagName.toString())); ++ return index.get(StringUtils.toLowerCase(tagName.toString())); + } + +- private static String toLowerCase(String s) { +- return s.toLowerCase(Locale.US); +- } + } +--- ./langtools/src/share/classes/com/sun/tools/doclint/Messages.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclint/Messages.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2012, 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 +@@ -42,6 +42,7 @@ + import com.sun.source.doctree.DocTree; + import com.sun.source.tree.Tree; + import com.sun.tools.doclint.Env.AccessKind; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Message reporting for DocLint. +@@ -67,7 +68,7 @@ + SYNTAX, + REFERENCE; + +- String optName() { return name().toLowerCase(); } ++ String optName() { return StringUtils.toLowerCase(name()); } + String notOptName() { return "-" + optName(); } + + static boolean accepts(String opt) { +@@ -158,7 +159,7 @@ + + static boolean isValidOptions(String opts) { + for (String opt: opts.split(",")) { +- if (!isValidOption(opt.trim().toLowerCase())) ++ if (!isValidOption(StringUtils.toLowerCase(opt.trim()))) + return false; + } + return true; +@@ -203,7 +204,7 @@ + setOption(ALL, Env.AccessKind.PRIVATE); + else { + for (String opt: opts.split(",")) +- setOption(opt.trim().toLowerCase()); ++ setOption(StringUtils.toLowerCase(opt.trim())); + } + } + +@@ -215,7 +216,7 @@ + + int sep = arg.indexOf("/"); + if (sep > 0) { +- Env.AccessKind ak = Env.AccessKind.valueOf(arg.substring(sep + 1).toUpperCase()); ++ Env.AccessKind ak = Env.AccessKind.valueOf(StringUtils.toUpperCase(arg.substring(sep + 1))); + setOption(arg.substring(0, sep), ak); + } else { + setOption(arg, null); +@@ -290,7 +291,7 @@ + out.println("By diagnostic kind..."); + Table dkindTable = new Table(); + for (Diagnostic.Kind k : Diagnostic.Kind.values()) { +- dkindTable.put(k.toString().toLowerCase(), dkindCounts[k.ordinal()]); ++ dkindTable.put(StringUtils.toLowerCase(k.toString()), dkindCounts[k.ordinal()]); + } + dkindTable.print(out); + out.println(); +--- ./langtools/src/share/classes/com/sun/tools/doclint/resources/doclint_ja.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/doclint/resources/doclint_ja.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -75,4 +75,4 @@ + dc.main.ioerror=IO\u30A8\u30E9\u30FC: {0} + dc.main.no.files.given=\u30D5\u30A1\u30A4\u30EB\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 + dc.main.usage=\u4F7F\u7528\u65B9\u6CD5:\n doclint [options] source-files...\n\n\u30AA\u30D7\u30B7\u30E7\u30F3:\n -Xmsgs \n -Xmsgs:all\u3068\u540C\u3058\n -Xmsgs:values\n \u30C1\u30A7\u30C3\u30AF\u3059\u308B\u554F\u984C\u306E\u30AB\u30C6\u30B4\u30EA\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002\u3053\u3053\u3067\u306E''values''\u306F\u3001\n \u30AB\u30F3\u30DE\u3067\u533A\u5207\u3089\u308C\u305F\u6B21\u306E\u5024\u306E\u30EA\u30B9\u30C8\u3067\u3059:\n reference Java\u30BD\u30FC\u30B9\u30FB\u30B3\u30FC\u30C9\u8981\u7D20\u3078\u306E\u4E0D\u6B63\u306A\u53C2\u7167\u3092\u542B\u3080\u30B3\u30E1\u30F3\u30C8\u306E\n \u5834\u6240\u3092\u8868\u793A\u3057\u307E\u3059\n syntax \u30B3\u30E1\u30F3\u30C8\u5185\u306E\u57FA\u672C\u69CB\u6587\u30A8\u30E9\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\n html HTML\u30BF\u30D6\u304A\u3088\u3073\u5C5E\u6027\u306E\u554F\u984C\u3092\u8868\u793A\u3057\u307E\u3059\n accessibility \u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u554F\u984C\u3092\u8868\u793A\u3057\u307E\u3059\n missing \u6B20\u843D\u3057\u3066\u3044\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u554F\u984C\u3092\u8868\u793A\u3057\u307E\u3059\n all \u524D\u8FF0\u306E\u3059\u3079\u3066\n \u3053\u308C\u3092\u5426\u5B9A\u3059\u308B\u306B\u306F\u3001\u5024\u306E\u524D\u306B''-''\u3092\u6307\u5B9A\u3057\u307E\u3059\n \u30AB\u30C6\u30B4\u30EA\u306F\u3001\u6B21\u306E\u3044\u305A\u308C\u304B\u3067\u4FEE\u98FE\u3067\u304D\u307E\u3059:\n /public /protected /package /private\n \u6B63\u306E\u30AB\u30C6\u30B4\u30EA(''-''\u3067\u59CB\u307E\u3089\u306A\u3044)\u306E\u5834\u5408\n \u4FEE\u98FE\u5B50\u306F\u3001\u305D\u306E\u30A2\u30AF\u30BB\u30B9\u30FB\u30EC\u30D9\u30EB\u4EE5\u4E0A\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002\n \u8CA0\u306E\u30AB\u30C6\u30B4\u30EA(''-''\u3067\u59CB\u307E\u308B)\u306E\u5834\u5408\n \u4FEE\u98FE\u5B50\u306F\u3001\u305D\u306E\u30A2\u30AF\u30BB\u30B9\u30FB\u30EC\u30D9\u30EB\u4EE5\u4E0B\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002\n \u4FEE\u98FE\u5B50\u304C\u306A\u3044\u5834\u5408\u3001\u30AB\u30C6\u30B4\u30EA\u306F\u3059\u3079\u3066\u306E\u30A2\u30AF\u30BB\u30B9\u30FB\u30EC\u30D9\u30EB\u306B\n \u9069\u7528\u3055\u308C\u307E\u3059\u3002\n \u4F8B: -Xmsgs:all,-syntax/private\n \u3053\u306E\u5834\u5408\u3001private\u30E1\u30BD\u30C3\u30C9\u306Edoc\u30B3\u30E1\u30F3\u30C8\u5185\u306E\u69CB\u6587\u30A8\u30E9\u30FC\u3092\u9664\u304D\u3001\n \u3059\u3079\u3066\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u6709\u52B9\u5316\u3055\u308C\u307E\u3059\u3002\n -Xmsgs\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u306F\u3001\n -Xmsgs:all/protected\u3068\u540C\u7B49\u306B\u306A\u308A\u3001\u3053\u308C\u306F\n \u3059\u3079\u3066\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u3001protected\u304A\u3088\u3073public\u306E\u5BA3\u8A00\u306E\u307F\u306B\u5831\u544A\u3055\u308C\u308B\u3053\u3068\u3092\n \u610F\u5473\u3057\u307E\u3059\u3002\n -stats\n \u5831\u544A\u3055\u308C\u305F\u554F\u984C\u306B\u5BFE\u3057\u3066\u7D71\u8A08\u3092\u5831\u544A\u3057\u307E\u3059\u3002\n -h -help --help -usage -?\n \u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\n\n\u6B21\u306Ejavac\u30AA\u30D7\u30B7\u30E7\u30F3\u3082\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u3059\n \ +--bootclasspath\u3001-classpath\u3001-cp\u3001-sourcepath\u3001-Xmaxerrs\u3001-Xmaxwarns\n\n\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u4E00\u90E8\u306B\u5BFE\u3057\u3066doclint\u3092\u5B9F\u884C\u3059\u308B\u306B\u306F\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30B3\u30F3\u30D1\u30A4\u30EB\u3055\u308C\u305F\u30AF\u30E9\u30B9\u3092\n\u30AF\u30E9\u30B9\u30D1\u30B9(\u307E\u305F\u306F\u30D6\u30FC\u30C8\u30FB\u30AF\u30E9\u30B9\u30D1\u30B9)\u306B\u6307\u5B9A\u3057\u3001\u30B3\u30DE\u30F3\u30C9\u30FB\u30E9\u30A4\u30F3\u3067\n\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002 ++-bootclasspath\u3001-classpath\u3001-cp\u3001-sourcepath\u3001-Xmaxerrs\u3001-Xmaxwarns\n\n\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u4E00\u90E8\u306B\u5BFE\u3057\u3066doclint\u3092\u5B9F\u884C\u3059\u308B\u306B\u306F\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30B3\u30F3\u30D1\u30A4\u30EB\u3055\u308C\u305F\u30AF\u30E9\u30B9\u3092\n\u30AF\u30E9\u30B9\u30D1\u30B9(\u307E\u305F\u306F\u30D6\u30FC\u30C8\u30FB\u30AF\u30E9\u30B9\u30D1\u30B9)\u306B\u6307\u5B9A\u3057\u3001\u30B3\u30DE\u30F3\u30C9\u884C\u3067\n\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002 +--- ./langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java Wed Jul 30 03:55:11 2014 -0700 +@@ -407,7 +407,7 @@ + paramTypes = lb.toList(); + } + +- ClassSymbol sym = (ClassSymbol) types.upperBound(tsym.type).tsym; ++ ClassSymbol sym = (ClassSymbol) types.cvarUpperBound(tsym.type).tsym; + + Symbol msym = (memberName == sym.name) + ? findConstructor(sym, paramTypes) +--- ./langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -33,6 +33,7 @@ + import javax.lang.model.element.Modifier; + + import com.sun.tools.javac.util.Assert; ++import com.sun.tools.javac.util.StringUtils; + + /** Access flags and other modifiers for Java classes and members. + * +@@ -275,6 +276,11 @@ + */ + public static final long LAMBDA_METHOD = 1L<<49; + ++ /** ++ * Flag to control recursion in TransTypes ++ */ ++ public static final long TYPE_TRANSLATED = 1L<<50; ++ + /** Modifier masks. + */ + public static final int +@@ -294,7 +300,8 @@ + ModifierFlags = ((long)StandardFlags & ~INTERFACE) | DEFAULT, + InterfaceMethodMask = ABSTRACT | STATIC | PUBLIC | STRICTFP | DEFAULT, + AnnotationTypeElementMask = ABSTRACT | PUBLIC, +- LocalVarFlags = FINAL | PARAMETER; ++ LocalVarFlags = FINAL | PARAMETER, ++ ReceiverParamFlags = PARAMETER; + + + public static Set<Modifier> asModifierSet(long flags) { +@@ -384,11 +391,12 @@ + BAD_OVERRIDE(Flags.BAD_OVERRIDE), + SIGNATURE_POLYMORPHIC(Flags.SIGNATURE_POLYMORPHIC), + THROWS(Flags.THROWS), +- LAMBDA_METHOD(Flags.LAMBDA_METHOD); ++ LAMBDA_METHOD(Flags.LAMBDA_METHOD), ++ TYPE_TRANSLATED(Flags.TYPE_TRANSLATED); + + Flag(long flag) { + this.value = flag; +- this.lowercaseName = name().toLowerCase(); ++ this.lowercaseName = StringUtils.toLowerCase(name()); + } + + @Override +--- ./langtools/src/share/classes/com/sun/tools/javac/code/Source.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/code/Source.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -191,6 +191,9 @@ + public boolean allowObjectToPrimitiveCast() { + return compareTo(JDK1_7) >= 0; + } ++ public boolean enforceThisDotInit() { ++ return compareTo(JDK1_7) >= 0; ++ } + public boolean allowPoly() { + return compareTo(JDK1_8) >= 0; + } +@@ -215,6 +218,9 @@ + public boolean allowTypeAnnotations() { + return compareTo(JDK1_8) >= 0; + } ++ public boolean allowAnnotationsAfterTypeParams() { ++ return compareTo(JDK1_8) >= 0; ++ } + public boolean allowRepeatedAnnotations() { + return compareTo(JDK1_8) >= 0; + } +@@ -224,7 +230,7 @@ + public boolean allowGraphInference() { + return compareTo(JDK1_8) >= 0; + } +- public boolean allowStructuralMostSpecific() { ++ public boolean allowFunctionalInterfaceMostSpecific() { + return compareTo(JDK1_8) >= 0; + } + public static SourceVersion toSourceVersion(Source source) { +--- ./langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -392,7 +392,7 @@ + /** A class is an inner class if it it has an enclosing instance class. + */ + public boolean isInner() { +- return type.getEnclosingType().hasTag(CLASS); ++ return kind == TYP && type.getEnclosingType().hasTag(CLASS); + } + + /** An inner class has an outer instance if it is not an interface +@@ -467,11 +467,24 @@ + + private boolean hiddenIn(ClassSymbol clazz, Types types) { + Symbol sym = hiddenInInternal(clazz, types); +- return sym != null && sym != this; ++ Assert.check(sym != null, "the result of hiddenInInternal() can't be null"); ++ /* If we find the current symbol then there is no symbol hiding it ++ */ ++ return sym != this; + } + +- private Symbol hiddenInInternal(ClassSymbol c, Types types) { +- Scope.Entry e = c.members().lookup(name); ++ /** This method looks in the supertypes graph that has the current class as the ++ * initial node, till it finds the current symbol or another symbol that hides it. ++ * If the current class has more than one supertype (extends one class and ++ * implements one or more interfaces) then null can be returned, meaning that ++ * a wrong path in the supertypes graph was selected. Null can only be returned ++ * as a temporary value, as a result of the recursive call. ++ */ ++ private Symbol hiddenInInternal(ClassSymbol currentClass, Types types) { ++ if (currentClass == owner) { ++ return this; ++ } ++ Scope.Entry e = currentClass.members().lookup(name); + while (e.scope != null) { + if (e.sym.kind == kind && + (kind != MTH || +@@ -481,18 +494,19 @@ + } + e = e.next(); + } +- List<Symbol> hiddenSyms = List.nil(); +- for (Type st : types.interfaces(c.type).prepend(types.supertype(c.type))) { ++ Symbol hiddenSym = null; ++ for (Type st : types.interfaces(currentClass.type) ++ .prepend(types.supertype(currentClass.type))) { + if (st != null && (st.hasTag(CLASS))) { + Symbol sym = hiddenInInternal((ClassSymbol)st.tsym, types); +- if (sym != null) { +- hiddenSyms = hiddenSyms.prepend(hiddenInInternal((ClassSymbol)st.tsym, types)); ++ if (sym == this) { ++ return this; ++ } else if (sym != null) { ++ hiddenSym = sym; + } + } + } +- return hiddenSyms.contains(this) ? +- this : +- (hiddenSyms.isEmpty() ? null : hiddenSyms.head); ++ return hiddenSym; + } + + /** Is this symbol inherited into a given class? +@@ -689,10 +703,10 @@ + } + + /** +- * A total ordering between type symbols that refines the ++ * A partial ordering between type symbols that refines the + * class inheritance graph. + * +- * Typevariables always precede other kinds of symbols. ++ * Type variables always precede other kinds of symbols. + */ + public final boolean precedes(TypeSymbol that, Types types) { + if (this == that) +@@ -765,42 +779,41 @@ + + @Override + public List<Attribute.Compound> getAnnotationMirrors() { +- return onlyTypeVariableAnnotations(owner.getRawTypeAttributes()); +- } +- +- private List<Attribute.Compound> onlyTypeVariableAnnotations( +- List<Attribute.TypeCompound> candidates) { +- // Declaration annotations on TypeParameters are stored in type attributes ++ // Declaration annotations on type variables are stored in type attributes ++ // on the owner of the TypeVariableSymbol ++ List<Attribute.TypeCompound> candidates = owner.getRawTypeAttributes(); ++ int index = owner.getTypeParameters().indexOf(this); + List<Attribute.Compound> res = List.nil(); + for (Attribute.TypeCompound a : candidates) { +- if (a.position.type == TargetType.CLASS_TYPE_PARAMETER || +- a.position.type == TargetType.METHOD_TYPE_PARAMETER) ++ if (isCurrentSymbolsAnnotation(a, index)) + res = res.prepend(a); + } + +- return res = res.reverse(); ++ return res.reverse(); + } + +- +- + // Helper to getAnnotation[s] + @Override + public <A extends Annotation> Attribute.Compound getAttribute(Class<A> annoType) { +- + String name = annoType.getName(); + + // Declaration annotations on type variables are stored in type attributes + // on the owner of the TypeVariableSymbol + List<Attribute.TypeCompound> candidates = owner.getRawTypeAttributes(); ++ int index = owner.getTypeParameters().indexOf(this); + for (Attribute.TypeCompound anno : candidates) +- if (anno.position.type == TargetType.CLASS_TYPE_PARAMETER || +- anno.position.type == TargetType.METHOD_TYPE_PARAMETER) +- if (name.contentEquals(anno.type.tsym.flatName())) +- return anno; ++ if (isCurrentSymbolsAnnotation(anno, index) && ++ name.contentEquals(anno.type.tsym.flatName())) ++ return anno; + + return null; + } +- ++ //where: ++ boolean isCurrentSymbolsAnnotation(Attribute.TypeCompound anno, int index) { ++ return (anno.position.type == TargetType.CLASS_TYPE_PARAMETER || ++ anno.position.type == TargetType.METHOD_TYPE_PARAMETER) && ++ anno.position.parameter_index == index; ++ } + + + @Override +--- ./langtools/src/share/classes/com/sun/tools/javac/code/Type.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/code/Type.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -72,13 +72,28 @@ + public abstract class Type extends AnnoConstruct implements TypeMirror { + + /** Constant type: no type at all. */ +- public static final JCNoType noType = new JCNoType(); ++ public static final JCNoType noType = new JCNoType() { ++ @Override ++ public String toString() { ++ return "none"; ++ } ++ }; + + /** Constant type: special type to be used during recovery of deferred expressions. */ +- public static final JCNoType recoveryType = new JCNoType(); ++ public static final JCNoType recoveryType = new JCNoType(){ ++ @Override ++ public String toString() { ++ return "recovery"; ++ } ++ }; + + /** Constant type: special type to be used for marking stuck trees. */ +- public static final JCNoType stuckType = new JCNoType(); ++ public static final JCNoType stuckType = new JCNoType() { ++ @Override ++ public String toString() { ++ return "stuck"; ++ } ++ }; + + /** If this switch is turned on, the names of type variables + * and anonymous classes are printed with hashcodes appended. +@@ -1445,12 +1460,19 @@ + * Inference variable bound kinds + */ + public enum InferenceBound { +- /** upper bounds */ +- UPPER, +- /** lower bounds */ +- LOWER, +- /** equality constraints */ +- EQ; ++ UPPER { ++ public InferenceBound complement() { return LOWER; } ++ }, ++ /** lower bounds */ ++ LOWER { ++ public InferenceBound complement() { return UPPER; } ++ }, ++ /** equality constraints */ ++ EQ { ++ public InferenceBound complement() { return EQ; } ++ }; ++ ++ public abstract InferenceBound complement(); + } + + /** inference variable bounds */ +@@ -1481,8 +1503,21 @@ + } + + public String toString() { +- if (inst != null) return inst.toString(); +- else return qtype + "?"; ++ return (inst == null) ? qtype + "?" : inst.toString(); ++ } ++ ++ public String debugString() { ++ String result = "inference var = " + qtype + "\n"; ++ if (inst != null) { ++ result += "inst = " + inst + '\n'; ++ } ++ for (InferenceBound bound: InferenceBound.values()) { ++ List<Type> aboundList = bounds.get(bound); ++ if (aboundList.size() > 0) { ++ result += bound + " = " + aboundList + '\n'; ++ } ++ } ++ return result; + } + + @Override +@@ -1492,8 +1527,7 @@ + + @Override + public Type baseType() { +- if (inst != null) return inst.baseType(); +- else return this; ++ return (inst == null) ? this : inst.baseType(); + } + + /** get all bounds of a given kind */ +--- ./langtools/src/share/classes/com/sun/tools/javac/code/Types.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/code/Types.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -43,6 +43,7 @@ + import com.sun.tools.javac.comp.Enter; + import com.sun.tools.javac.comp.Env; + import com.sun.tools.javac.jvm.ClassReader; ++import com.sun.tools.javac.tree.JCTree; + import com.sun.tools.javac.util.*; + import static com.sun.tools.javac.code.BoundKind.*; + import static com.sun.tools.javac.code.Flags.*; +@@ -84,7 +85,6 @@ + final boolean allowBoxing; + final boolean allowCovariantReturns; + final boolean allowObjectToPrimitiveCast; +- final boolean allowDefaultMethods; + final ClassReader reader; + final Check chk; + final Enter enter; +@@ -111,7 +111,6 @@ + allowBoxing = source.allowBoxing(); + allowCovariantReturns = source.allowCovariantReturns(); + allowObjectToPrimitiveCast = source.allowObjectToPrimitiveCast(); +- allowDefaultMethods = source.allowDefaultMethods(); + reader = ClassReader.instance(context); + chk = Check.instance(context); + enter = Enter.instance(context); +@@ -123,61 +122,57 @@ + } + // </editor-fold> + +- // <editor-fold defaultstate="collapsed" desc="upperBound"> ++ // <editor-fold defaultstate="collapsed" desc="bounds"> ++ /** ++ * Get a wildcard's upper bound, returning non-wildcards unchanged. ++ * @param t a type argument, either a wildcard or a type ++ */ ++ public Type wildUpperBound(Type t) { ++ if (t.hasTag(WILDCARD)) { ++ WildcardType w = (WildcardType) t.unannotatedType(); ++ if (w.isSuperBound()) ++ return w.bound == null ? syms.objectType : w.bound.bound; ++ else ++ return wildUpperBound(w.type); ++ } ++ else return t.unannotatedType(); ++ } ++ ++ /** ++ * Get a capture variable's upper bound, returning other types unchanged. ++ * @param t a type ++ */ ++ public Type cvarUpperBound(Type t) { ++ if (t.hasTag(TYPEVAR)) { ++ TypeVar v = (TypeVar) t.unannotatedType(); ++ return v.isCaptured() ? cvarUpperBound(v.bound) : v; ++ } ++ else return t.unannotatedType(); ++ } ++ + /** +- * The "rvalue conversion".<br> +- * The upper bound of most types is the type +- * itself. Wildcards, on the other hand have upper +- * and lower bounds. ++ * Get a wildcard's lower bound, returning non-wildcards unchanged. ++ * @param t a type argument, either a wildcard or a type ++ */ ++ public Type wildLowerBound(Type t) { ++ if (t.hasTag(WILDCARD)) { ++ WildcardType w = (WildcardType) t.unannotatedType(); ++ return w.isExtendsBound() ? syms.botType : wildLowerBound(w.type); ++ } ++ else return t.unannotatedType(); ++ } ++ ++ /** ++ * Get a capture variable's lower bound, returning other types unchanged. + * @param t a type +- * @return the upper bound of the given type + */ +- public Type upperBound(Type t) { +- return upperBound.visit(t).unannotatedType(); ++ public Type cvarLowerBound(Type t) { ++ if (t.hasTag(TYPEVAR)) { ++ TypeVar v = (TypeVar) t.unannotatedType(); ++ return v.isCaptured() ? cvarLowerBound(v.getLowerBound()) : v; ++ } ++ else return t.unannotatedType(); + } +- // where +- private final MapVisitor<Void> upperBound = new MapVisitor<Void>() { +- +- @Override +- public Type visitWildcardType(WildcardType t, Void ignored) { +- if (t.isSuperBound()) +- return t.bound == null ? syms.objectType : t.bound.bound; +- else +- return visit(t.type); +- } +- +- @Override +- public Type visitCapturedType(CapturedType t, Void ignored) { +- return visit(t.bound); +- } +- }; +- // </editor-fold> +- +- // <editor-fold defaultstate="collapsed" desc="lowerBound"> +- /** +- * The "lvalue conversion".<br> +- * The lower bound of most types is the type +- * itself. Wildcards, on the other hand have upper +- * and lower bounds. +- * @param t a type +- * @return the lower bound of the given type +- */ +- public Type lowerBound(Type t) { +- return lowerBound.visit(t); +- } +- // where +- private final MapVisitor<Void> lowerBound = new MapVisitor<Void>() { +- +- @Override +- public Type visitWildcardType(WildcardType t, Void ignored) { +- return t.isExtendsBound() ? syms.botType : visit(t.type); +- } +- +- @Override +- public Type visitCapturedType(CapturedType t, Void ignored) { +- return visit(t.getLowerBound()); +- } +- }; + // </editor-fold> + + // <editor-fold defaultstate="collapsed" desc="isUnbounded"> +@@ -307,8 +302,8 @@ + } + + /** +- * Is t a subtype of or convertiable via boxing/unboxing +- * convertions to s? ++ * Is t a subtype of or convertible via boxing/unboxing ++ * conversions to s? + */ + public boolean isConvertible(Type t, Type s) { + return isConvertible(t, s, noWarnings); +@@ -634,7 +629,7 @@ + * (ii) perform functional interface bridge calculation. + */ + public ClassSymbol makeFunctionalInterfaceClass(Env<AttrContext> env, Name name, List<Type> targets, long cflags) { +- if (targets.isEmpty() || !isFunctionalInterface(targets.head)) { ++ if (targets.isEmpty()) { + return null; + } + Symbol descSym = findDescriptorSymbol(targets.head.tsym); +@@ -829,9 +824,15 @@ + return true; + } + +- Type lower = lowerBound(s); +- if (s != lower) +- return isSubtype(capture ? capture(t) : t, lower, false); ++ // Generally, if 's' is a type variable, recur on lower bound; but ++ // for inference variables and intersections, we need to keep 's' ++ // (see JLS 4.10.2 for intersections and 18.2.3 for inference vars) ++ if (!t.hasTag(UNDETVAR) && !t.isCompound()) { ++ // TODO: JDK-8039198, bounds checking sometimes passes in a wildcard as s ++ Type lower = cvarLowerBound(wildLowerBound(s)); ++ if (s != lower) ++ return isSubtype(capture ? capture(t) : t, lower, false); ++ } + + return isSubtype.visit(capture ? capture(t) : t, s); + } +@@ -899,7 +900,7 @@ + syms.boundClass); + changed = true; + } else if (s != orig) { +- s = new WildcardType(upperBound(s), ++ s = new WildcardType(wildUpperBound(s), + BoundKind.EXTENDS, + syms.boundClass); + changed = true; +@@ -915,14 +916,11 @@ + @Override + public Boolean visitClassType(ClassType t, Type s) { + Type sup = asSuper(t, s.tsym); +- return sup != null +- && sup.tsym == s.tsym +- // You're not allowed to write +- // Vector<Object> vec = new Vector<String>(); +- // But with wildcards you can write +- // Vector<? extends Object> vec = new Vector<String>(); +- // which means that subtype checking must be done +- // here instead of same-type checking (via containsType). ++ if (sup == null) return false; ++ // If t is an intersection, sup might not be a class type ++ if (!sup.hasTag(CLASS)) return isSubtypeNoCapture(sup, s); ++ return sup.tsym == s.tsym ++ // Check type variable containment + && (!s.isParameterized() || containsTypeRecursive(s, sup)) + && isSubtypeNoCapture(sup.getEnclosingType(), + s.getEnclosingType()); +@@ -1111,7 +1109,7 @@ + //check that u == t, where u has been set by Type.withTypeVar + return s.isSuperBound() && + !s.isExtendsBound() && +- visit(t, upperBound(s)); ++ visit(t, wildUpperBound(s)); + } + } + default: +@@ -1138,7 +1136,7 @@ + return visit(s, t); + + if (s.isSuperBound() && !s.isExtendsBound()) +- return visit(t, upperBound(s)) && visit(t, lowerBound(s)); ++ return visit(t, wildUpperBound(s)) && visit(t, wildLowerBound(s)); + + if (t.isCompound() && s.isCompound()) { + if (!visit(supertype(t), supertype(s))) +@@ -1224,14 +1222,35 @@ + TypeRelation isSameTypeLoose = new LooseSameTypeVisitor(); + + private class LooseSameTypeVisitor extends SameTypeVisitor { ++ ++ /** cache of the type-variable pairs being (recursively) tested. */ ++ private Set<TypePair> cache = new HashSet<>(); ++ + @Override + boolean sameTypeVars(TypeVar tv1, TypeVar tv2) { +- return tv1.tsym == tv2.tsym && visit(tv1.getUpperBound(), tv2.getUpperBound()); ++ return tv1.tsym == tv2.tsym && checkSameBounds(tv1, tv2); + } + @Override + protected boolean containsTypes(List<Type> ts1, List<Type> ts2) { + return containsTypeEquivalent(ts1, ts2); + } ++ ++ /** ++ * Since type-variable bounds can be recursive, we need to protect against ++ * infinite loops - where the same bounds are checked over and over recursively. ++ */ ++ private boolean checkSameBounds(TypeVar tv1, TypeVar tv2) { ++ TypePair p = new TypePair(tv1, tv2, true); ++ if (cache.add(p)) { ++ try { ++ return visit(tv1.getUpperBound(), tv2.getUpperBound()); ++ } finally { ++ cache.remove(p); ++ } ++ } else { ++ return false; ++ } ++ } + }; + + /** +@@ -1288,12 +1307,12 @@ + switch(wt.kind) { + case UNBOUND: //similar to ? extends Object + case EXTENDS: { +- Type bound = upperBound(s); ++ Type bound = wildUpperBound(s); + undetvar.addBound(InferenceBound.UPPER, bound, this); + break; + } + case SUPER: { +- Type bound = lowerBound(s); ++ Type bound = wildLowerBound(s); + undetvar.addBound(InferenceBound.LOWER, bound, this); + break; + } +@@ -1349,28 +1368,6 @@ + // where + private TypeRelation containsType = new TypeRelation() { + +- private Type U(Type t) { +- while (t.hasTag(WILDCARD)) { +- WildcardType w = (WildcardType)t.unannotatedType(); +- if (w.isSuperBound()) +- return w.bound == null ? syms.objectType : w.bound.bound; +- else +- t = w.type; +- } +- return t; +- } +- +- private Type L(Type t) { +- while (t.hasTag(WILDCARD)) { +- WildcardType w = (WildcardType)t.unannotatedType(); +- if (w.isExtendsBound()) +- return syms.botType; +- else +- t = w.type; +- } +- return t; +- } +- + public Boolean visitType(Type t, Type s) { + if (s.isPartial()) + return containedBy(s, t); +@@ -1382,13 +1379,13 @@ + // System.err.println(); + // System.err.format(" does %s contain %s?%n", t, s); + // System.err.format(" %s U(%s) <: U(%s) %s = %s%n", +-// upperBound(s), s, t, U(t), ++// wildUpperBound(s), s, t, wildUpperBound(t), + // t.isSuperBound() +-// || isSubtypeNoCapture(upperBound(s), U(t))); ++// || isSubtypeNoCapture(wildUpperBound(s), wildUpperBound(t))); + // System.err.format(" %s L(%s) <: L(%s) %s = %s%n", +-// L(t), t, s, lowerBound(s), ++// wildLowerBound(t), t, s, wildLowerBound(s), + // t.isExtendsBound() +-// || isSubtypeNoCapture(L(t), lowerBound(s))); ++// || isSubtypeNoCapture(wildLowerBound(t), wildLowerBound(s))); + // System.err.println(); + // } + +@@ -1400,8 +1397,9 @@ + // debugContainsType(t, s); + return isSameWildcard(t, s) + || isCaptureOf(s, t) +- || ((t.isExtendsBound() || isSubtypeNoCapture(L(t), lowerBound(s))) && +- (t.isSuperBound() || isSubtypeNoCapture(upperBound(s), U(t)))); ++ || ((t.isExtendsBound() || isSubtypeNoCapture(wildLowerBound(t), cvarLowerBound(wildLowerBound(s)))) && ++ // TODO: JDK-8039214, cvarUpperBound call here is incorrect ++ (t.isSuperBound() || isSubtypeNoCapture(cvarUpperBound(wildUpperBound(s)), wildUpperBound(t)))); + } + } + +@@ -1519,7 +1517,7 @@ + + @Override + public Boolean visitWildcardType(WildcardType t, Type s) { +- return isCastable(upperBound(t), s, warnStack.head); ++ return isCastable(wildUpperBound(t), s, warnStack.head); + } + + @Override +@@ -1760,31 +1758,25 @@ + + if (t.isExtendsBound()) { + if (s.isExtendsBound()) +- return !isCastableRecursive(t.type, upperBound(s)); ++ return !isCastableRecursive(t.type, wildUpperBound(s)); + else if (s.isSuperBound()) +- return notSoftSubtypeRecursive(lowerBound(s), t.type); ++ return notSoftSubtypeRecursive(wildLowerBound(s), t.type); + } else if (t.isSuperBound()) { + if (s.isExtendsBound()) +- return notSoftSubtypeRecursive(t.type, upperBound(s)); ++ return notSoftSubtypeRecursive(t.type, wildUpperBound(s)); + } + return false; + } + }; + // </editor-fold> + +- // <editor-fold defaultstate="collapsed" desc="lowerBoundArgtypes"> +- /** +- * Returns the lower bounds of the formals of a method. +- */ +- public List<Type> lowerBoundArgtypes(Type t) { +- return lowerBounds(t.getParameterTypes()); ++ // <editor-fold defaultstate="collapsed" desc="cvarLowerBounds"> ++ public List<Type> cvarLowerBounds(List<Type> ts) { ++ return map(ts, cvarLowerBoundMapping); + } +- public List<Type> lowerBounds(List<Type> ts) { +- return map(ts, lowerBoundMapping); +- } +- private final Mapping lowerBoundMapping = new Mapping("lowerBound") { ++ private final Mapping cvarLowerBoundMapping = new Mapping("cvarLowerBound") { + public Type apply(Type t) { +- return lowerBound(t); ++ return cvarLowerBound(t); + } + }; + // </editor-fold> +@@ -1807,7 +1799,7 @@ + noWarnings); + } + if (!s.hasTag(WILDCARD)) +- s = upperBound(s); ++ s = cvarUpperBound(s); + + return !isSubtype(t, relaxBound(s)); + } +@@ -1864,7 +1856,7 @@ + // <editor-fold defaultstate="collapsed" desc="Array Utils"> + public boolean isArray(Type t) { + while (t.hasTag(WILDCARD)) +- t = upperBound(t); ++ t = wildUpperBound(t); + return t.hasTag(ARRAY); + } + +@@ -1874,7 +1866,7 @@ + public Type elemtype(Type t) { + switch (t.getTag()) { + case WILDCARD: +- return elemtype(upperBound(t)); ++ return elemtype(wildUpperBound(t)); + case ARRAY: + t = t.unannotatedType(); + return ((ArrayType)t).elemtype; +@@ -1936,6 +1928,17 @@ + * @param sym a symbol + */ + public Type asSuper(Type t, Symbol sym) { ++ /* Some examples: ++ * ++ * (Enum<E>, Comparable) => Comparable<E> ++ * (c.s.s.d.AttributeTree.ValueKind, Enum) => Enum<c.s.s.d.AttributeTree.ValueKind> ++ * (c.s.s.t.ExpressionTree, c.s.s.t.Tree) => c.s.s.t.Tree ++ * (j.u.List<capture#160 of ? extends c.s.s.d.DocTree>, Iterable) => ++ * Iterable<capture#160 of ? extends c.s.s.d.DocTree> ++ */ ++ if (sym.type == syms.objectType) { //optimization ++ return syms.objectType; ++ } + return asSuper.visit(t, sym); + } + // where +@@ -1951,16 +1954,18 @@ + return t; + + Type st = supertype(t); +- if (st.hasTag(CLASS) || st.hasTag(TYPEVAR) || st.hasTag(ERROR)) { ++ if (st.hasTag(CLASS) || st.hasTag(TYPEVAR)) { + Type x = asSuper(st, sym); + if (x != null) + return x; + } + if ((sym.flags() & INTERFACE) != 0) { + for (List<Type> l = interfaces(t); l.nonEmpty(); l = l.tail) { +- Type x = asSuper(l.head, sym); +- if (x != null) +- return x; ++ if (!l.head.hasTag(ERROR)) { ++ Type x = asSuper(l.head, sym); ++ if (x != null) ++ return x; ++ } + } + } + return null; +@@ -2064,7 +2069,7 @@ + + @Override + public Type visitWildcardType(WildcardType t, Symbol sym) { +- return memberType(upperBound(t), sym); ++ return memberType(wildUpperBound(t), sym); + } + + @Override +@@ -2183,7 +2188,7 @@ + + @Override + public Type visitWildcardType(WildcardType t, Boolean recurse) { +- return erasure(upperBound(t), recurse); ++ return erasure(wildUpperBound(t), recurse); + } + + @Override +@@ -2242,7 +2247,8 @@ + + // <editor-fold defaultstate="collapsed" desc="makeCompoundType"> + /** +- * Make a compound type from non-empty list of types ++ * Make a compound type from non-empty list of types. The list should be ++ * ordered according to {@link Symbol#precedes(TypeSymbol,Types)}. + * + * @param bounds the types from which the compound type is formed + * @param supertype is objectType if all bounds are interfaces, +@@ -2294,7 +2300,7 @@ + public Type visitType(Type t, Void ignored) { + // A note on wildcards: there is no good way to + // determine a supertype for a super bounded wildcard. +- return null; ++ return Type.noType; + } + + @Override +@@ -2391,8 +2397,7 @@ + if (t.hasErasedSupertypes()) { + t.interfaces_field = erasureRecursive(interfaces); + } else if (formals.nonEmpty()) { +- t.interfaces_field = +- upperBounds(subst(interfaces, formals, actuals)); ++ t.interfaces_field = subst(interfaces, formals, actuals); + } + else { + t.interfaces_field = interfaces; +@@ -2462,7 +2467,7 @@ + return false; + return + t.isRaw() || +- supertype(t) != null && isDerivedRaw(supertype(t)) || ++ supertype(t) != Type.noType && isDerivedRaw(supertype(t)) || + isDerivedRaw(interfaces(t)); + } + +@@ -2961,7 +2966,7 @@ + return new ClassType(outer1, typarams1, t.tsym); + } else { + Type st = subst(supertype(t)); +- List<Type> is = upperBounds(subst(interfaces(t))); ++ List<Type> is = subst(interfaces(t)); + if (st == supertype(t) && is == interfaces(t)) + return t; + else +@@ -2978,7 +2983,7 @@ + return t; + } else { + if (t.isExtendsBound() && bound.isExtendsBound()) +- bound = upperBound(bound); ++ bound = wildUpperBound(bound); + return new WildcardType(bound, t.kind, syms.boundClass, t.bound); + } + } +@@ -3213,6 +3218,7 @@ + return tvar.rank_field; + } + case ERROR: ++ case NONE: + return 0; + default: + throw new AssertionError(); +@@ -3332,12 +3338,15 @@ + * Insert a type in a closure + */ + public List<Type> insert(List<Type> cl, Type t) { +- if (cl.isEmpty() || t.tsym.precedes(cl.head.tsym, this)) { ++ if (cl.isEmpty()) { + return cl.prepend(t); +- } else if (cl.head.tsym.precedes(t.tsym, this)) { ++ } else if (t.tsym == cl.head.tsym) { ++ return cl; ++ } else if (t.tsym.precedes(cl.head.tsym, this)) { ++ return cl.prepend(t); ++ } else { ++ // t comes after head, or the two are unrelated + return insert(cl.tail, t).prepend(cl.head); +- } else { +- return cl; + } + } + +@@ -3349,12 +3358,15 @@ + return cl2; + } else if (cl2.isEmpty()) { + return cl1; ++ } else if (cl1.head.tsym == cl2.head.tsym) { ++ return union(cl1.tail, cl2.tail).prepend(cl1.head); + } else if (cl1.head.tsym.precedes(cl2.head.tsym, this)) { + return union(cl1.tail, cl2).prepend(cl1.head); + } else if (cl2.head.tsym.precedes(cl1.head.tsym, this)) { + return union(cl1, cl2.tail).prepend(cl2.head); + } else { +- return union(cl1.tail, cl2.tail).prepend(cl1.head); ++ // unrelated types ++ return union(cl1.tail, cl2).prepend(cl1.head); + } + } + +@@ -3387,9 +3399,16 @@ + class TypePair { + final Type t1; + final Type t2; ++ boolean strict; ++ + TypePair(Type t1, Type t2) { ++ this(t1, t2, false); ++ } ++ ++ TypePair(Type t1, Type t2, boolean strict) { + this.t1 = t1; + this.t2 = t2; ++ this.strict = strict; + } + @Override + public int hashCode() { +@@ -3400,8 +3419,8 @@ + if (!(obj instanceof TypePair)) + return false; + TypePair typePair = (TypePair)obj; +- return isSameType(t1, typePair.t1) +- && isSameType(t2, typePair.t2); ++ return isSameType(t1, typePair.t1, strict) ++ && isSameType(t2, typePair.t2, strict); + } + } + Set<TypePair> mergeCache = new HashSet<TypePair>(); +@@ -3422,8 +3441,8 @@ + TypePair pair = new TypePair(c1, c2); + Type m; + if (mergeCache.add(pair)) { +- m = new WildcardType(lub(upperBound(act1.head), +- upperBound(act2.head)), ++ m = new WildcardType(lub(wildUpperBound(act1.head), ++ wildUpperBound(act2.head)), + BoundKind.EXTENDS, + syms.boundClass); + mergeCache.remove(pair); +@@ -3464,18 +3483,31 @@ + private List<Type> closureMin(List<Type> cl) { + ListBuffer<Type> classes = new ListBuffer<>(); + ListBuffer<Type> interfaces = new ListBuffer<>(); ++ Set<Type> toSkip = new HashSet<>(); + while (!cl.isEmpty()) { + Type current = cl.head; +- if (current.isInterface()) +- interfaces.append(current); +- else +- classes.append(current); +- ListBuffer<Type> candidates = new ListBuffer<>(); +- for (Type t : cl.tail) { +- if (!isSubtypeNoCapture(current, t)) +- candidates.append(t); ++ boolean keep = !toSkip.contains(current); ++ if (keep && current.hasTag(TYPEVAR)) { ++ // skip lower-bounded variables with a subtype in cl.tail ++ for (Type t : cl.tail) { ++ if (isSubtypeNoCapture(t, current)) { ++ keep = false; ++ break; ++ } ++ } + } +- cl = candidates.toList(); ++ if (keep) { ++ if (current.isInterface()) ++ interfaces.append(current); ++ else ++ classes.append(current); ++ for (Type t : cl.tail) { ++ // skip supertypes of 'current' in cl.tail ++ if (isSubtypeNoCapture(current, t)) ++ toSkip.add(t); ++ } ++ } ++ cl = cl.tail; + } + return classes.appendList(interfaces).toList(); + } +@@ -3635,7 +3667,19 @@ + return s; + + List<Type> closure = union(closure(t), closure(s)); +- List<Type> bounds = closureMin(closure); ++ return glbFlattened(closure, t); ++ } ++ //where ++ /** ++ * Perform glb for a list of non-primitive, non-error, non-compound types; ++ * redundant elements are removed. Bounds should be ordered according to ++ * {@link Symbol#precedes(TypeSymbol,Types)}. ++ * ++ * @param flatBounds List of type to glb ++ * @param errT Original type to use if the result is an error type ++ */ ++ private Type glbFlattened(List<Type> flatBounds, Type errT) { ++ List<Type> bounds = closureMin(flatBounds); + + if (bounds.isEmpty()) { // length == 0 + return syms.objectType; +@@ -3643,11 +3687,21 @@ + return bounds.head; + } else { // length > 1 + int classCount = 0; +- for (Type bound : bounds) +- if (!bound.isInterface()) ++ List<Type> lowers = List.nil(); ++ for (Type bound : bounds) { ++ if (!bound.isInterface()) { + classCount++; +- if (classCount > 1) +- return createErrorType(t); ++ Type lower = cvarLowerBound(bound); ++ if (bound != lower && !lower.hasTag(BOT)) ++ lowers = insert(lowers, lower); ++ } ++ } ++ if (classCount > 1) { ++ if (lowers.isEmpty()) ++ return createErrorType(errT); ++ else ++ return glbFlattened(union(bounds, lowers), errT); ++ } + } + return makeCompoundType(bounds); + } +@@ -3871,9 +3925,11 @@ + } + return buf.reverse(); + } ++ + public Type capture(Type t) { +- if (!t.hasTag(CLASS)) ++ if (!t.hasTag(CLASS)) { + return t; ++ } + if (t.getEnclosingType() != Type.noType) { + Type capturedEncl = capture(t.getEnclosingType()); + if (capturedEncl != t.getEnclosingType()) { +@@ -3919,8 +3975,13 @@ + Si.lower = Ti.getSuperBound(); + break; + } +- if (Si.bound == Si.lower) ++ Type tmpBound = Si.bound.hasTag(UNDETVAR) ? ((UndetVar)Si.bound).qtype : Si.bound; ++ Type tmpLower = Si.lower.hasTag(UNDETVAR) ? ((UndetVar)Si.lower).qtype : Si.lower; ++ if (!Si.bound.hasTag(ERROR) && ++ !Si.lower.hasTag(ERROR) && ++ isSameType(tmpBound, tmpLower, false)) { + currentS.head = Si.bound; ++ } + } + currentA = currentA.tail; + currentT = currentT.tail; +@@ -3957,16 +4018,6 @@ + // </editor-fold> + + // <editor-fold defaultstate="collapsed" desc="Internal utility methods"> +- private List<Type> upperBounds(List<Type> ss) { +- if (ss.isEmpty()) return ss; +- Type head = upperBound(ss.head); +- List<Type> tail = upperBounds(ss.tail); +- if (head != ss.head || tail != ss.tail) +- return tail.prepend(head); +- else +- return ss; +- } +- + private boolean sideCast(Type from, Type to, Warner warn) { + // We are casting from type $from$ to type $to$, which are + // non-final unrelated types. This method +@@ -4123,9 +4174,9 @@ + @Override + public Void visitWildcardType(WildcardType source, Type target) throws AdaptFailure { + if (source.isExtendsBound()) +- adaptRecursive(upperBound(source), upperBound(target)); ++ adaptRecursive(wildUpperBound(source), wildUpperBound(target)); + else if (source.isSuperBound()) +- adaptRecursive(lowerBound(source), lowerBound(target)); ++ adaptRecursive(wildLowerBound(source), wildLowerBound(target)); + return null; + } + +@@ -4137,10 +4188,10 @@ + Type val = mapping.get(source.tsym); + if (val != null) { + if (val.isSuperBound() && target.isSuperBound()) { +- val = isSubtype(lowerBound(val), lowerBound(target)) ++ val = isSubtype(wildLowerBound(val), wildLowerBound(target)) + ? target : val; + } else if (val.isExtendsBound() && target.isExtendsBound()) { +- val = isSubtype(upperBound(val), upperBound(target)) ++ val = isSubtype(wildUpperBound(val), wildUpperBound(target)) + ? val : target; + } else if (!isSameType(val, target)) { + throw new AdaptFailure(); +@@ -4251,7 +4302,7 @@ + } + + public Type visitType(Type t, Void s) { +- return high ? upperBound(t) : lowerBound(t); ++ return t; + } + + @Override +@@ -4649,7 +4700,7 @@ + assembleClassSig(rawOuter + ? types.erasure(outer) + : outer); +- append('.'); ++ append(rawOuter ? '$' : '.'); + Assert.check(c.flatname.startsWith(c.owner.enclClass().flatname)); + append(rawOuter + ? c.flatname.subName(c.owner.enclClass().flatname.getByteLength() + 1, c.flatname.getByteLength()) +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -94,6 +94,7 @@ + final Annotate annotate; + final TypeAnnotations typeAnnotations; + final DeferredLintHandler deferredLintHandler; ++ final TypeEnvs typeEnvs; + + public static Attr instance(Context context) { + Attr instance = context.get(attrKey); +@@ -123,6 +124,7 @@ + annotate = Annotate.instance(context); + typeAnnotations = TypeAnnotations.instance(context); + deferredLintHandler = DeferredLintHandler.instance(context); ++ typeEnvs = TypeEnvs.instance(context); + + Options options = Options.instance(context); + +@@ -138,6 +140,7 @@ + allowTypeAnnos = source.allowTypeAnnotations(); + allowLambda = source.allowLambda(); + allowDefaultMethods = source.allowDefaultMethods(); ++ allowStaticInterfaceMethods = source.allowStaticInterfaceMethods(); + sourceName = source.name; + relax = (options.isSet("-retrofit") || + options.isSet("-relax")); +@@ -195,6 +198,10 @@ + */ + boolean allowDefaultMethods; + ++ /** Switch: static interface methods enabled? ++ */ ++ boolean allowStaticInterfaceMethods; ++ + /** Switch: allow references to surrounding object from anonymous + * objects during constructor call? + */ +@@ -249,7 +256,7 @@ + if (!owntype.hasTag(ERROR) && !resultInfo.pt.hasTag(METHOD) && !resultInfo.pt.hasTag(FORALL)) { + if (allowPoly && inferenceContext.free(found)) { + if ((ownkind & ~resultInfo.pkind) == 0) { +- owntype = resultInfo.check(tree, inferenceContext.asFree(owntype)); ++ owntype = resultInfo.check(tree, inferenceContext.asUndetVar(owntype)); + } else { + log.error(tree.pos(), "unexpected.type", + kindNames(resultInfo.pkind), +@@ -427,7 +434,7 @@ + } + + public Type attribType(JCTree node, TypeSymbol sym) { +- Env<AttrContext> env = enter.typeEnvs.get(sym); ++ Env<AttrContext> env = typeEnvs.get(sym); + Env<AttrContext> localEnv = env.dup(node, env.info.dup()); + return attribTree(node, localEnv, unknownTypeInfo); + } +@@ -518,6 +525,10 @@ + return new ResultInfo(pkind, pt, newContext); + } + ++ protected ResultInfo dup(Type newPt, CheckContext newContext) { ++ return new ResultInfo(pkind, newPt, newContext); ++ } ++ + @Override + public String toString() { + if (pt != null) { +@@ -812,6 +823,10 @@ + boolean classExpected, + boolean interfaceExpected, + boolean checkExtensible) { ++ if (t.tsym.isAnonymous()) { ++ log.error(tree.pos(), "cant.inherit.from.anon"); ++ return types.createErrorType(t); ++ } + if (t.isErroneous()) + return t; + if (t.hasTag(TYPEVAR) && !classExpected && !interfaceExpected) { +@@ -1167,7 +1182,7 @@ + //the Formal Parameter of a for-each loop is not in the scope when + //attributing the for-each expression; we mimick this by attributing + //the for-each expression first (against original scope). +- Type exprType = types.upperBound(attribExpr(tree.expr, loopEnv)); ++ Type exprType = types.cvarUpperBound(attribExpr(tree.expr, loopEnv)); + attribStat(tree.var, loopEnv); + chk.checkNonVoid(tree.pos(), exprType); + Type elemtype = types.elemtype(exprType); // perhaps expr is an array? +@@ -1184,7 +1199,7 @@ + List<Type> iterableParams = base.allparams(); + elemtype = iterableParams.isEmpty() + ? syms.objectType +- : types.upperBound(iterableParams.head); ++ : types.wildUpperBound(iterableParams.head); + } + } + chk.checkType(tree.expr.pos(), elemtype, tree.var.sym.type); +@@ -2048,7 +2063,7 @@ + tree.constructor = constructor.baseSymbol(); + + final TypeSymbol csym = clazztype.tsym; +- ResultInfo diamondResult = new ResultInfo(MTH, newMethodTemplate(resultInfo.pt, argtypes, typeargtypes), new Check.NestedCheckContext(resultInfo.checkContext) { ++ ResultInfo diamondResult = new ResultInfo(pkind, newMethodTemplate(resultInfo.pt, argtypes, typeargtypes), new Check.NestedCheckContext(resultInfo.checkContext) { + @Override + public void report(DiagnosticPosition _unused, JCDiagnostic details) { + enclosingContext.report(tree.clazz, +@@ -2139,6 +2154,11 @@ + cdef.extending = clazz; + } + ++ if (resultInfo.checkContext.deferredAttrContext().mode == DeferredAttr.AttrMode.CHECK && ++ isSerializable(clazztype)) { ++ localEnv.info.isSerializable = true; ++ } ++ + attribStat(cdef, localEnv); + + checkLambdaCandidate(tree, cdef.sym, clazztype); +@@ -2294,6 +2314,9 @@ + resultInfo.checkContext.deferredAttrContext().mode == DeferredAttr.AttrMode.CHECK; + try { + Type currentTarget = pt(); ++ if (needsRecovery && isSerializable(currentTarget)) { ++ localEnv.info.isSerializable = true; ++ } + List<Type> explicitParamTypes = null; + if (that.paramKind == JCLambda.ParameterKind.EXPLICIT) { + //attribute lambda parameters +@@ -2398,7 +2421,7 @@ + //add thrown types as bounds to the thrown types free variables if needed: + if (resultInfo.checkContext.inferenceContext().free(lambdaType.getThrownTypes())) { + List<Type> inferredThrownTypes = flow.analyzeLambdaThrownTypes(env, that, make); +- List<Type> thrownTypes = resultInfo.checkContext.inferenceContext().asFree(lambdaType.getThrownTypes()); ++ List<Type> thrownTypes = resultInfo.checkContext.inferenceContext().asUndetVars(lambdaType.getThrownTypes()); + + chk.unhandled(inferredThrownTypes, thrownTypes); + } +@@ -2539,7 +2562,7 @@ + @Override + public boolean compatible(Type found, Type req, Warner warn) { + //return type must be compatible in both current context and assignment context +- return chk.basicHandler.compatible(found, inferenceContext().asFree(req), warn); ++ return chk.basicHandler.compatible(found, inferenceContext().asUndetVar(req), warn); + } + + @Override +@@ -2572,7 +2595,7 @@ + * types must be compatible with the return type of the expected descriptor. + */ + private void checkLambdaCompatible(JCLambda tree, Type descriptor, CheckContext checkContext) { +- Type returnType = checkContext.inferenceContext().asFree(descriptor.getReturnType()); ++ Type returnType = checkContext.inferenceContext().asUndetVar(descriptor.getReturnType()); + + //return values have already been checked - but if lambda has no return + //values, we must ensure that void/value compatibility is correct; +@@ -2584,7 +2607,7 @@ + diags.fragment("missing.ret.val", returnType))); + } + +- List<Type> argTypes = checkContext.inferenceContext().asFree(descriptor.getParameterTypes()); ++ List<Type> argTypes = checkContext.inferenceContext().asUndetVars(descriptor.getParameterTypes()); + if (!types.isSameTypes(argTypes, TreeInfo.types(tree.params))) { + checkContext.report(tree, diags.fragment("incompatible.arg.types.in.lambda")); + } +@@ -2614,7 +2637,7 @@ + * - an instance field, we use the first constructor. + * - a static field, we create a fake clinit method. + */ +- private Env<AttrContext> lambdaEnv(JCLambda that, Env<AttrContext> env) { ++ public Env<AttrContext> lambdaEnv(JCLambda that, Env<AttrContext> env) { + Env<AttrContext> lambdaEnv; + Symbol owner = env.info.scope.owner; + if (owner.kind == VAR && owner.owner.kind == TYP) { +@@ -2698,17 +2721,20 @@ + typeargtypes = attribTypes(that.typeargs, localEnv); + } + +- Type target; + Type desc; +- if (pt() != Type.recoveryType) { +- target = targetChecker.visit(pt(), that); +- desc = types.findDescriptorType(target); ++ Type currentTarget = pt(); ++ boolean isTargetSerializable = ++ resultInfo.checkContext.deferredAttrContext().mode == DeferredAttr.AttrMode.CHECK && ++ isSerializable(currentTarget); ++ if (currentTarget != Type.recoveryType) { ++ currentTarget = targetChecker.visit(currentTarget, that); ++ desc = types.findDescriptorType(currentTarget); + } else { +- target = Type.recoveryType; ++ currentTarget = Type.recoveryType; + desc = fallbackDescriptorType(that); + } + +- setFunctionalInfo(localEnv, that, pt(), desc, target, resultInfo.checkContext); ++ setFunctionalInfo(localEnv, that, pt(), desc, currentTarget, resultInfo.checkContext); + List<Type> argtypes = desc.getParameterTypes(); + Resolve.MethodCheck referenceCheck = rs.resolveMethodCheck; + +@@ -2750,7 +2776,7 @@ + targetError = false; + } + +- JCDiagnostic detailsDiag = ((Resolve.ResolveError)refSym).getDiagnostic(JCDiagnostic.DiagnosticType.FRAGMENT, ++ JCDiagnostic detailsDiag = ((Resolve.ResolveError)refSym.baseSymbol()).getDiagnostic(JCDiagnostic.DiagnosticType.FRAGMENT, + that, exprType.tsym, exprType, that.name, argtypes, typeargtypes); + + JCDiagnostic.DiagnosticType diagKind = targetError ? +@@ -2759,10 +2785,10 @@ + JCDiagnostic diag = diags.create(diagKind, log.currentSource(), that, + "invalid.mref", Kinds.kindName(that.getMode()), detailsDiag); + +- if (targetError && target == Type.recoveryType) { ++ if (targetError && currentTarget == Type.recoveryType) { + //a target error doesn't make sense during recovery stage + //as we don't know what actual parameter types are +- result = that.type = target; ++ result = that.type = currentTarget; + return; + } else { + if (targetError) { +@@ -2770,7 +2796,7 @@ + } else { + log.report(diag); + } +- result = that.type = types.createErrorType(target); ++ result = that.type = types.createErrorType(currentTarget); + return; + } + } +@@ -2781,7 +2807,7 @@ + + if (desc.getReturnType() == Type.recoveryType) { + // stop here +- result = that.type = target; ++ result = that.type = currentTarget; + return; + } + +@@ -2799,7 +2825,7 @@ + //static ref with class type-args + log.error(that.expr.pos(), "invalid.mref", Kinds.kindName(that.getMode()), + diags.fragment("static.mref.with.targs")); +- result = that.type = types.createErrorType(target); ++ result = that.type = types.createErrorType(currentTarget); + return; + } + +@@ -2808,7 +2834,7 @@ + //no static bound mrefs + log.error(that.expr.pos(), "invalid.mref", Kinds.kindName(that.getMode()), + diags.fragment("static.bound.mref")); +- result = that.type = types.createErrorType(target); ++ result = that.type = types.createErrorType(currentTarget); + return; + } + +@@ -2816,19 +2842,24 @@ + // Check that super-qualified symbols are not abstract (JLS) + rs.checkNonAbstract(that.pos(), that.sym); + } ++ ++ if (isTargetSerializable) { ++ chk.checkElemAccessFromSerializableLambda(that); ++ } + } + + ResultInfo checkInfo = + resultInfo.dup(newMethodTemplate( + desc.getReturnType().hasTag(VOID) ? Type.noType : desc.getReturnType(), +- that.kind.isUnbound() ? argtypes.tail : argtypes, typeargtypes)); ++ that.kind.isUnbound() ? argtypes.tail : argtypes, typeargtypes), ++ new FunctionalReturnContext(resultInfo.checkContext)); + + Type refType = checkId(that, lookupHelper.site, refSym, localEnv, checkInfo); + + if (that.kind.isUnbound() && + resultInfo.checkContext.inferenceContext().free(argtypes.head)) { + //re-generate inference constraints for unbound receiver +- if (!types.isSubtype(resultInfo.checkContext.inferenceContext().asFree(argtypes.head), exprType)) { ++ if (!types.isSubtype(resultInfo.checkContext.inferenceContext().asUndetVar(argtypes.head), exprType)) { + //cannot happen as this has already been checked - we just need + //to regenerate the inference constraints, as that has been lost + //as a result of the call to inferenceContext.save() +@@ -2847,9 +2878,9 @@ + resultInfo.checkContext.deferredAttrContext().mode == DeferredAttr.AttrMode.SPECULATIVE; + checkReferenceCompatible(that, desc, refType, resultInfo.checkContext, isSpeculativeRound); + if (!isSpeculativeRound) { +- checkAccessibleTypes(that, localEnv, resultInfo.checkContext.inferenceContext(), desc, target); ++ checkAccessibleTypes(that, localEnv, resultInfo.checkContext.inferenceContext(), desc, currentTarget); + } +- result = check(that, target, VAL, resultInfo); ++ result = check(that, currentTarget, VAL, resultInfo); + } catch (Types.FunctionDescriptorLookupError ex) { + JCDiagnostic cause = ex.getDiagnostic(); + resultInfo.checkContext.report(that, cause); +@@ -2866,7 +2897,7 @@ + + @SuppressWarnings("fallthrough") + void checkReferenceCompatible(JCMemberReference tree, Type descriptor, Type refType, CheckContext checkContext, boolean speculativeAttr) { +- Type returnType = checkContext.inferenceContext().asFree(descriptor.getReturnType()); ++ Type returnType = checkContext.inferenceContext().asUndetVar(descriptor.getReturnType()); + + Type resType; + switch (tree.getMode()) { +@@ -2898,7 +2929,7 @@ + } + + if (!speculativeAttr) { +- List<Type> thrownTypes = checkContext.inferenceContext().asFree(descriptor.getThrownTypes()); ++ List<Type> thrownTypes = checkContext.inferenceContext().asUndetVars(descriptor.getThrownTypes()); + if (chk.unhandled(refType.getThrownTypes(), thrownTypes).nonEmpty()) { + log.error(tree, "incompatible.thrown.types.in.mref", refType.getThrownTypes()); + } +@@ -2937,10 +2968,19 @@ + if (checkContext.deferredAttrContext().mode == DeferredAttr.AttrMode.CHECK && + pt != Type.recoveryType) { + //check that functional interface class is well-formed +- ClassSymbol csym = types.makeFunctionalInterfaceClass(env, +- names.empty, List.of(fExpr.targets.head), ABSTRACT); +- if (csym != null) { +- chk.checkImplementations(env.tree, csym, csym); ++ try { ++ /* Types.makeFunctionalInterfaceClass() may throw an exception ++ * when it's executed post-inference. See the listener code ++ * above. ++ */ ++ ClassSymbol csym = types.makeFunctionalInterfaceClass(env, ++ names.empty, List.of(fExpr.targets.head), ABSTRACT); ++ if (csym != null) { ++ chk.checkImplementations(env.tree, csym, csym); ++ } ++ } catch (Types.FunctionDescriptorLookupError ex) { ++ JCDiagnostic cause = ex.getDiagnostic(); ++ resultInfo.checkContext.report(env.tree, cause); + } + } + } +@@ -3009,15 +3049,6 @@ + Type ctype = cfolder.fold1(opc, argtype); + if (ctype != null) { + owntype = cfolder.coerce(ctype, owntype); +- +- // Remove constant types from arguments to +- // conserve space. The parser will fold concatenations +- // of string literals; the code here also +- // gets rid of intermediate results when some of the +- // operands are constant identifiers. +- if (tree.arg.type.tsym == syms.stringType.tsym) { +- tree.arg.type = syms.stringType; +- } + } + } + } +@@ -3051,18 +3082,6 @@ + Type ctype = cfolder.fold2(opc, left, right); + if (ctype != null) { + owntype = cfolder.coerce(ctype, owntype); +- +- // Remove constant types from arguments to +- // conserve space. The parser will fold concatenations +- // of string literals; the code here also +- // gets rid of intermediate results when some of the +- // operands are constant identifiers. +- if (tree.lhs.type.tsym == syms.stringType.tsym) { +- tree.lhs.type = syms.stringType; +- } +- if (tree.rhs.type.tsym == syms.stringType.tsym) { +- tree.rhs.type = syms.stringType; +- } + } + } + +@@ -3210,6 +3229,11 @@ + while (env1.outer != null && !rs.isAccessible(env, env1.enclClass.sym.type, sym)) + env1 = env1.outer; + } ++ ++ if (env.info.isSerializable) { ++ chk.checkElemAccessFromSerializableLambda(tree); ++ } ++ + result = checkId(tree, env1.enclClass.sym.type, sym, env, resultInfo); + } + +@@ -3315,6 +3339,10 @@ + tree.pos(), site, sym.name, true); + } + } ++ if (!allowStaticInterfaceMethods && sitesym.isInterface() && ++ sym.isStatic() && sym.kind == MTH) { ++ log.error(tree.pos(), "static.intf.method.invoke.not.supported.in.source", sourceName); ++ } + } else if (sym.kind != ERR && (sym.flags() & STATIC) != 0 && sym.name != names._class) { + // If the qualified item is not a type and the selected item is static, report + // a warning. Make allowance for the class of an array type e.g. Object[].class) +@@ -3334,6 +3362,10 @@ + } + } + ++ if (env.info.isSerializable) { ++ chk.checkElemAccessFromSerializableLambda(tree); ++ } ++ + env.info.selectSuper = selectSuperPrev; + result = checkId(tree, site, sym, env, resultInfo); + } +@@ -4030,7 +4062,7 @@ + // ... and attribute the bound class + c.flags_field |= UNATTRIBUTED; + Env<AttrContext> cenv = enter.classEnv(cd, env); +- enter.typeEnvs.put(c, cenv); ++ typeEnvs.put(c, cenv); + attribClass(c); + return owntype; + } +@@ -4180,9 +4212,9 @@ + c.flags_field &= ~UNATTRIBUTED; + + // Get environment current at the point of class definition. +- Env<AttrContext> env = enter.typeEnvs.get(c); +- +- // The info.lint field in the envs stored in enter.typeEnvs is deliberately uninitialized, ++ Env<AttrContext> env = typeEnvs.get(c); ++ ++ // The info.lint field in the envs stored in typeEnvs is deliberately uninitialized, + // because the annotations were not available at the time the env was created. Therefore, + // we look up the environment chain for the first enclosing environment for which the + // lint value is set. Typically, this is the parent env, but might be further if there +@@ -4212,6 +4244,11 @@ + ((c.flags_field & (Flags.ENUM | Flags.COMPOUND)) == 0)) { + log.error(env.tree.pos(), "enum.types.not.extensible"); + } ++ ++ if (isSerializable(c.type)) { ++ env.info.isSerializable = true; ++ } ++ + attribClassBody(env, c); + + chk.checkDeprecatedAnnotation(env.tree.pos(), c); +@@ -4325,7 +4362,7 @@ + + // Check for proper use of serialVersionUID + if (env.info.lint.isEnabled(LintCategory.SERIAL) && +- isSerializable(c) && ++ isSerializable(c.type) && + (c.flags() & Flags.ENUM) == 0 && + checkForSerial(c)) { + checkSerialVersionUID(tree, c); +@@ -4365,15 +4402,15 @@ + return null; + } + +- /** check if a class is a subtype of Serializable, if that is available. */ +- private boolean isSerializable(ClassSymbol c) { ++ /** check if a type is a subtype of Serializable, if that is available. */ ++ boolean isSerializable(Type t) { + try { + syms.serializableType.complete(); + } + catch (CompletionFailure e) { + return false; + } +- return types.isSubtype(c.type, syms.serializableType); ++ return types.isSubtype(t, syms.serializableType); + } + + /** Check that an appropriate serialVersionUID member is defined. */ +@@ -4653,10 +4690,33 @@ + + private void initTypeIfNeeded(JCTree that) { + if (that.type == null) { +- that.type = syms.unknownType; ++ if (that.hasTag(METHODDEF)) { ++ that.type = dummyMethodType((JCMethodDecl)that); ++ } else { ++ that.type = syms.unknownType; ++ } + } + } + ++ /* Construct a dummy method type. If we have a method declaration, ++ * and the declared return type is void, then use that return type ++ * instead of UNKNOWN to avoid spurious error messages in lambda ++ * bodies (see:JDK-8041704). ++ */ ++ private Type dummyMethodType(JCMethodDecl md) { ++ Type restype = syms.unknownType; ++ if (md != null && md.restype.hasTag(TYPEIDENT)) { ++ JCPrimitiveTypeTree prim = (JCPrimitiveTypeTree)md.restype; ++ if (prim.typetag == VOID) ++ restype = syms.voidType; ++ } ++ return new MethodType(List.<Type>nil(), restype, ++ List.<Type>nil(), syms.methodClass); ++ } ++ private Type dummyMethodType() { ++ return dummyMethodType(null); ++ } ++ + @Override + public void scan(JCTree tree) { + if (tree == null) return; +@@ -4712,7 +4772,8 @@ + @Override + public void visitNewClass(JCNewClass that) { + if (that.constructor == null) { +- that.constructor = new MethodSymbol(0, names.init, syms.unknownType, syms.noSymbol); ++ that.constructor = new MethodSymbol(0, names.init, ++ dummyMethodType(), syms.noSymbol); + } + if (that.constructorType == null) { + that.constructorType = syms.unknownType; +@@ -4722,22 +4783,28 @@ + + @Override + public void visitAssignop(JCAssignOp that) { +- if (that.operator == null) +- that.operator = new OperatorSymbol(names.empty, syms.unknownType, -1, syms.noSymbol); ++ if (that.operator == null) { ++ that.operator = new OperatorSymbol(names.empty, dummyMethodType(), ++ -1, syms.noSymbol); ++ } + super.visitAssignop(that); + } + + @Override + public void visitBinary(JCBinary that) { +- if (that.operator == null) +- that.operator = new OperatorSymbol(names.empty, syms.unknownType, -1, syms.noSymbol); ++ if (that.operator == null) { ++ that.operator = new OperatorSymbol(names.empty, dummyMethodType(), ++ -1, syms.noSymbol); ++ } + super.visitBinary(that); + } + + @Override + public void visitUnary(JCUnary that) { +- if (that.operator == null) +- that.operator = new OperatorSymbol(names.empty, syms.unknownType, -1, syms.noSymbol); ++ if (that.operator == null) { ++ that.operator = new OperatorSymbol(names.empty, dummyMethodType(), ++ -1, syms.noSymbol); ++ } + super.visitUnary(that); + } + +@@ -4753,7 +4820,8 @@ + public void visitReference(JCMemberReference that) { + super.visitReference(that); + if (that.sym == null) { +- that.sym = new MethodSymbol(0, names.empty, syms.unknownType, syms.noSymbol); ++ that.sym = new MethodSymbol(0, names.empty, dummyMethodType(), ++ syms.noSymbol); + } + if (that.targets == null) { + that.targets = List.nil(); +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/AttrContext.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/AttrContext.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -54,6 +54,10 @@ + */ + boolean selectSuper = false; + ++ /** Is the current target of lambda expression or method reference serializable? ++ */ ++ boolean isSerializable = false; ++ + /** Are arguments to current function applications boxed into an array for varargs? + */ + Resolve.MethodResolutionPhase pendingResolutionPhase = null; +@@ -89,6 +93,7 @@ + info.enclVar = enclVar; + info.returnResult = returnResult; + info.defaultSuperCallSite = defaultSuperCallSite; ++ info.isSerializable = isSerializable; + return info; + } + +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -82,6 +82,7 @@ + private final TreeInfo treeinfo; + private final JavaFileManager fileManager; + private final Profile profile; ++ private final boolean warnOnAccessToSensitiveMembers; + + // The set of lint options currently in effect. It is initialized + // from the context, and then is set/reset as needed by Attr as it +@@ -131,6 +132,7 @@ + warnOnSyntheticConflicts = options.isSet("warnOnSyntheticConflicts"); + suppressAbortOnBadClassFile = options.isSet("suppressAbortOnBadClassFile"); + enableSunApiLintControl = options.isSet("enableSunApiLintControl"); ++ warnOnAccessToSensitiveMembers = options.isSet("warnOnAccessToSensitiveMembers"); + + Target target = Target.instance(context); + syntheticNameChar = target.syntheticNameChar(); +@@ -510,6 +512,11 @@ + public DeferredAttrContext deferredAttrContext() { + return deferredAttr.emptyDeferredAttrContext; + } ++ ++ @Override ++ public String toString() { ++ return "CheckContext: basicHandler"; ++ } + }; + + /** Check that a given type is assignable to a given proto-type. +@@ -611,12 +618,12 @@ + if (a.isUnbound()) { + return true; + } else if (!a.hasTag(WILDCARD)) { +- a = types.upperBound(a); ++ a = types.cvarUpperBound(a); + return types.isSubtype(a, bound); + } else if (a.isExtendsBound()) { +- return types.isCastable(bound, types.upperBound(a), types.noWarnings); ++ return types.isCastable(bound, types.wildUpperBound(a), types.noWarnings); + } else if (a.isSuperBound()) { +- return !types.notSoftSubtype(types.lowerBound(a), bound); ++ return !types.notSoftSubtype(types.wildLowerBound(a), bound); + } + return true; + } +@@ -1031,7 +1038,9 @@ + + switch (sym.kind) { + case VAR: +- if (sym.owner.kind != TYP) ++ if (TreeInfo.isReceiverParam(tree)) ++ mask = ReceiverParamFlags; ++ else if (sym.owner.kind != TYP) + mask = LocalVarFlags; + else if ((sym.owner.flags_field & INTERFACE) != 0) + mask = implicit = InterfaceVarFlags; +@@ -1806,6 +1815,11 @@ + Type t1, + Type t2, + Type site) { ++ if ((site.tsym.flags() & COMPOUND) != 0) { ++ // special case for intersections: need to eliminate wildcards in supertypes ++ t1 = types.capture(t1); ++ t2 = types.capture(t2); ++ } + return firstIncompatibility(pos, t1, t2, site) == null; + } + +@@ -2583,6 +2597,44 @@ + } + } + ++ void checkElemAccessFromSerializableLambda(final JCTree tree) { ++ if (warnOnAccessToSensitiveMembers) { ++ Symbol sym = TreeInfo.symbol(tree); ++ if ((sym.kind & (VAR | MTH)) == 0) { ++ return; ++ } ++ ++ if (sym.kind == VAR) { ++ if ((sym.flags() & PARAMETER) != 0 || ++ sym.isLocal() || ++ sym.name == names._this || ++ sym.name == names._super) { ++ return; ++ } ++ } ++ ++ if (!types.isSubtype(sym.owner.type, syms.serializableType) && ++ isEffectivelyNonPublic(sym)) { ++ log.warning(tree.pos(), ++ "access.to.sensitive.member.from.serializable.element", sym); ++ } ++ } ++ } ++ ++ private boolean isEffectivelyNonPublic(Symbol sym) { ++ if (sym.packge() == syms.rootPackage) { ++ return false; ++ } ++ ++ while (sym.kind != Kinds.PCK) { ++ if ((sym.flags() & PUBLIC) == 0) { ++ return true; ++ } ++ sym = sym.owner; ++ } ++ return false; ++ } ++ + /** Report a conflict between a user symbol and a synthetic symbol. + */ + private void syntheticError(DiagnosticPosition pos, Symbol sym) { +@@ -2627,7 +2679,7 @@ + checkClassBounds(pos, seensofar, it); + } + Type st = types.supertype(type); +- if (st != null) checkClassBounds(pos, seensofar, st); ++ if (st != Type.noType) checkClassBounds(pos, seensofar, st); + } + + /** Enter interface into into set. +@@ -2680,7 +2732,7 @@ + if (types.isSameType(type, syms.stringType)) return; + if ((type.tsym.flags() & Flags.ENUM) != 0) return; + if ((type.tsym.flags() & Flags.ANNOTATION) != 0) return; +- if (types.lowerBound(type).tsym == syms.classType.tsym) return; ++ if (types.cvarLowerBound(type).tsym == syms.classType.tsym) return; + if (types.isArray(type) && !types.isArray(types.elemtype(type))) { + validateAnnotationType(pos, types.elemtype(type)); + return; +@@ -2779,7 +2831,7 @@ + validateDocumented(t.tsym, s, pos); + validateInherited(t.tsym, s, pos); + validateTarget(t.tsym, s, pos); +- validateDefault(t.tsym, s, pos); ++ validateDefault(t.tsym, pos); + } + + private void validateValue(TypeSymbol container, TypeSymbol contained, DiagnosticPosition pos) { +@@ -2898,7 +2950,9 @@ + + + /** Checks that s is a subset of t, with respect to ElementType +- * semantics, specifically {ANNOTATION_TYPE} is a subset of {TYPE} ++ * semantics, specifically {ANNOTATION_TYPE} is a subset of {TYPE}, ++ * and {TYPE_USE} covers the set {ANNOTATION_TYPE, TYPE, TYPE_USE, ++ * TYPE_PARAMETER}. + */ + private boolean isTargetSubsetOf(Set<Name> s, Set<Name> t) { + // Check that all elements in s are present in t +@@ -2911,6 +2965,12 @@ + } else if (n1 == names.TYPE && n2 == names.ANNOTATION_TYPE) { + currentElementOk = true; + break; ++ } else if (n1 == names.TYPE_USE && ++ (n2 == names.TYPE || ++ n2 == names.ANNOTATION_TYPE || ++ n2 == names.TYPE_PARAMETER)) { ++ currentElementOk = true; ++ break; + } + } + if (!currentElementOk) +@@ -2919,7 +2979,7 @@ + return true; + } + +- private void validateDefault(Symbol container, Symbol contained, DiagnosticPosition pos) { ++ private void validateDefault(Symbol container, DiagnosticPosition pos) { + // validate that all other elements of containing type has defaults + Scope scope = container.members(); + for(Symbol elm : scope.getElements()) { +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -25,7 +25,7 @@ + + package com.sun.tools.javac.comp; + +-import com.sun.source.tree.MemberReferenceTree; ++import com.sun.source.tree.LambdaExpressionTree.BodyKind; + import com.sun.tools.javac.code.*; + import com.sun.tools.javac.tree.*; + import com.sun.tools.javac.util.*; +@@ -35,10 +35,8 @@ + import com.sun.tools.javac.comp.Attr.ResultInfo; + import com.sun.tools.javac.comp.Infer.InferenceContext; + import com.sun.tools.javac.comp.Resolve.MethodResolutionPhase; +-import com.sun.tools.javac.comp.Resolve.ReferenceLookupHelper; + import com.sun.tools.javac.tree.JCTree.*; + +- + import java.util.ArrayList; + import java.util.Collections; + import java.util.EnumSet; +@@ -48,6 +46,7 @@ + import java.util.Set; + import java.util.WeakHashMap; + ++import static com.sun.tools.javac.code.Kinds.VAL; + import static com.sun.tools.javac.code.TypeTag.*; + import static com.sun.tools.javac.tree.JCTree.Tag.*; + +@@ -76,6 +75,9 @@ + final Symtab syms; + final TreeMaker make; + final Types types; ++ final Flow flow; ++ final Names names; ++ final TypeEnvs typeEnvs; + + public static DeferredAttr instance(Context context) { + DeferredAttr instance = context.get(deferredAttrKey); +@@ -96,8 +98,10 @@ + syms = Symtab.instance(context); + make = TreeMaker.instance(context); + types = Types.instance(context); +- Names names = Names.instance(context); ++ flow = Flow.instance(context); ++ names = Names.instance(context); + stuckTree = make.Ident(names.empty).setType(Type.stuckType); ++ typeEnvs = TypeEnvs.instance(context); + emptyDeferredAttrContext = + new DeferredAttrContext(AttrMode.CHECK, null, MethodResolutionPhase.BOX, infer.emptyContext, null, null) { + @Override +@@ -108,6 +112,11 @@ + void complete() { + Assert.error("Empty deferred context!"); + } ++ ++ @Override ++ public String toString() { ++ return "Empty deferred context!"; ++ } + }; + } + +@@ -139,6 +148,11 @@ + return DEFERRED; + } + ++ @Override ++ public String toString() { ++ return "DeferredType"; ++ } ++ + /** + * A speculative cache is used to keep track of all overload resolution rounds + * that triggered speculative attribution on a given deferred type. Each entry +@@ -378,7 +392,9 @@ + } + } + //where +- protected TreeScanner unenterScanner = new TreeScanner() { ++ protected UnenterScanner unenterScanner = new UnenterScanner(); ++ ++ class UnenterScanner extends TreeScanner { + @Override + public void visitClassDef(JCClassDecl tree) { + ClassSymbol csym = tree.sym; +@@ -386,12 +402,12 @@ + //it is possible that nested expressions inside argument expression + //are left unchecked - in such cases there's nothing to clean up. + if (csym == null) return; +- enter.typeEnvs.remove(csym); ++ typeEnvs.remove(csym); + chk.compiled.remove(csym.flatname); + syms.classes.remove(csym.flatname); + super.visitClassDef(tree); + } +- }; ++ } + + /** + * A deferred context is created on each method check. A deferred context is +@@ -595,19 +611,111 @@ + public void visitLambda(JCLambda tree) { + Check.CheckContext checkContext = resultInfo.checkContext; + Type pt = resultInfo.pt; +- if (inferenceContext.inferencevars.contains(pt)) { +- //ok +- return; +- } else { ++ if (!inferenceContext.inferencevars.contains(pt)) { + //must be a functional descriptor ++ Type descriptorType = null; + try { +- Type desc = types.findDescriptorType(pt); +- if (desc.getParameterTypes().length() != tree.params.length()) { +- checkContext.report(tree, diags.fragment("incompatible.arg.types.in.lambda")); +- } ++ descriptorType = types.findDescriptorType(pt); + } catch (Types.FunctionDescriptorLookupError ex) { + checkContext.report(null, ex.getDiagnostic()); + } ++ ++ if (descriptorType.getParameterTypes().length() != tree.params.length()) { ++ checkContext.report(tree, ++ diags.fragment("incompatible.arg.types.in.lambda")); ++ } ++ ++ Type currentReturnType = descriptorType.getReturnType(); ++ boolean returnTypeIsVoid = currentReturnType.hasTag(VOID); ++ if (tree.getBodyKind() == BodyKind.EXPRESSION) { ++ boolean isExpressionCompatible = !returnTypeIsVoid || ++ TreeInfo.isExpressionStatement((JCExpression)tree.getBody()); ++ if (!isExpressionCompatible) { ++ resultInfo.checkContext.report(tree.pos(), ++ diags.fragment("incompatible.ret.type.in.lambda", ++ diags.fragment("missing.ret.val", currentReturnType))); ++ } ++ } else { ++ LambdaBodyStructChecker lambdaBodyChecker = ++ new LambdaBodyStructChecker(); ++ ++ tree.body.accept(lambdaBodyChecker); ++ boolean isVoidCompatible = lambdaBodyChecker.isVoidCompatible; ++ ++ if (returnTypeIsVoid) { ++ if (!isVoidCompatible) { ++ resultInfo.checkContext.report(tree.pos(), ++ diags.fragment("unexpected.ret.val")); ++ } ++ } else { ++ boolean isValueCompatible = lambdaBodyChecker.isPotentiallyValueCompatible ++ && !canLambdaBodyCompleteNormally(tree); ++ if (!isValueCompatible && !isVoidCompatible) { ++ log.error(tree.body.pos(), ++ "lambda.body.neither.value.nor.void.compatible"); ++ } ++ ++ if (!isValueCompatible) { ++ resultInfo.checkContext.report(tree.pos(), ++ diags.fragment("incompatible.ret.type.in.lambda", ++ diags.fragment("missing.ret.val", currentReturnType))); ++ } ++ } ++ } ++ } ++ } ++ ++ boolean canLambdaBodyCompleteNormally(JCLambda tree) { ++ JCLambda newTree = new TreeCopier<>(make).copy(tree); ++ /* attr.lambdaEnv will create a meaningful env for the ++ * lambda expression. This is specially useful when the ++ * lambda is used as the init of a field. But we need to ++ * remove any added symbol. ++ */ ++ Env<AttrContext> localEnv = attr.lambdaEnv(newTree, env); ++ try { ++ List<JCVariableDecl> tmpParams = newTree.params; ++ while (tmpParams.nonEmpty()) { ++ tmpParams.head.vartype = make.at(tmpParams.head).Type(syms.errType); ++ tmpParams = tmpParams.tail; ++ } ++ ++ attr.attribStats(newTree.params, localEnv); ++ ++ /* set pt to Type.noType to avoid generating any bound ++ * which may happen if lambda's return type is an ++ * inference variable ++ */ ++ Attr.ResultInfo bodyResultInfo = attr.new ResultInfo(VAL, Type.noType); ++ localEnv.info.returnResult = bodyResultInfo; ++ ++ // discard any log output ++ Log.DiagnosticHandler diagHandler = new Log.DiscardDiagnosticHandler(log); ++ try { ++ JCBlock body = (JCBlock)newTree.body; ++ /* we need to attribute the lambda body before ++ * doing the aliveness analysis. This is because ++ * constant folding occurs during attribution ++ * and the reachability of some statements depends ++ * on constant values, for example: ++ * ++ * while (true) {...} ++ */ ++ attr.attribStats(body.stats, localEnv); ++ ++ attr.preFlow(newTree); ++ /* make an aliveness / reachability analysis of the lambda ++ * to determine if it can complete normally ++ */ ++ flow.analyzeLambda(localEnv, newTree, make, true); ++ } finally { ++ log.popDiagnosticHandler(diagHandler); ++ } ++ return newTree.canCompleteNormally; ++ } finally { ++ JCBlock body = (JCBlock)newTree.body; ++ unenterScanner.scan(body.stats); ++ localEnv.info.scope.leave(); + } + } + +@@ -625,10 +733,7 @@ + public void visitReference(JCMemberReference tree) { + Check.CheckContext checkContext = resultInfo.checkContext; + Type pt = resultInfo.pt; +- if (inferenceContext.inferencevars.contains(pt)) { +- //ok +- return; +- } else { ++ if (!inferenceContext.inferencevars.contains(pt)) { + try { + types.findDescriptorType(pt); + } catch (Types.FunctionDescriptorLookupError ex) { +@@ -658,6 +763,40 @@ + } + } + } ++ ++ /* This visitor looks for return statements, its analysis will determine if ++ * a lambda body is void or value compatible. We must analyze return ++ * statements contained in the lambda body only, thus any return statement ++ * contained in an inner class or inner lambda body, should be ignored. ++ */ ++ class LambdaBodyStructChecker extends TreeScanner { ++ boolean isVoidCompatible = true; ++ boolean isPotentiallyValueCompatible = true; ++ ++ @Override ++ public void visitClassDef(JCClassDecl tree) { ++ // do nothing ++ } ++ ++ @Override ++ public void visitLambda(JCLambda tree) { ++ // do nothing ++ } ++ ++ @Override ++ public void visitNewClass(JCNewClass tree) { ++ // do nothing ++ } ++ ++ @Override ++ public void visitReturn(JCReturn tree) { ++ if (tree.expr != null) { ++ isVoidCompatible = false; ++ } else { ++ isPotentiallyValueCompatible = false; ++ } ++ } ++ } + } + + /** an empty deferred attribution context - all methods throw exceptions */ +@@ -769,7 +908,7 @@ + /** + * handler that is executed when a node has been discarded + */ +- abstract void skip(JCTree tree); ++ void skip(JCTree tree) {} + } + + /** +@@ -781,11 +920,6 @@ + PolyScanner() { + super(EnumSet.of(CONDEXPR, PARENS, LAMBDA, REFERENCE)); + } +- +- @Override +- void skip(JCTree tree) { +- //do nothing +- } + } + + /** +@@ -796,12 +930,7 @@ + + LambdaReturnScanner() { + super(EnumSet.of(BLOCK, CASE, CATCH, DOLOOP, FOREACHLOOP, +- FORLOOP, RETURN, SYNCHRONIZED, SWITCH, TRY, WHILELOOP)); +- } +- +- @Override +- void skip(JCTree tree) { +- //do nothing ++ FORLOOP, IF, RETURN, SYNCHRONIZED, SWITCH, TRY, WHILELOOP)); + } + } + +@@ -1091,25 +1220,102 @@ + } + + //slow path ++ Symbol sym = quicklyResolveMethod(env, tree); ++ ++ if (sym == null) { ++ result = ArgumentExpressionKind.POLY; ++ return; ++ } ++ ++ result = analyzeCandidateMethods(sym, ArgumentExpressionKind.PRIMITIVE, ++ argumentKindAnalyzer); ++ } ++ //where ++ private boolean isSimpleReceiver(JCTree rec) { ++ switch (rec.getTag()) { ++ case IDENT: ++ return true; ++ case SELECT: ++ return isSimpleReceiver(((JCFieldAccess)rec).selected); ++ case TYPEAPPLY: ++ case TYPEARRAY: ++ return true; ++ case ANNOTATED_TYPE: ++ return isSimpleReceiver(((JCAnnotatedType)rec).underlyingType); ++ case APPLY: ++ return true; ++ default: ++ return false; ++ } ++ } ++ private ArgumentExpressionKind reduce(ArgumentExpressionKind kind) { ++ return argumentKindAnalyzer.reduce(result, kind); ++ } ++ MethodAnalyzer<ArgumentExpressionKind> argumentKindAnalyzer = ++ new MethodAnalyzer<ArgumentExpressionKind>() { ++ @Override ++ public ArgumentExpressionKind process(MethodSymbol ms) { ++ return ArgumentExpressionKind.methodKind(ms, types); ++ } ++ @Override ++ public ArgumentExpressionKind reduce(ArgumentExpressionKind kind1, ++ ArgumentExpressionKind kind2) { ++ switch (kind1) { ++ case PRIMITIVE: return kind2; ++ case NO_POLY: return kind2.isPoly() ? kind2 : kind1; ++ case POLY: return kind1; ++ default: ++ Assert.error(); ++ return null; ++ } ++ } ++ @Override ++ public boolean shouldStop(ArgumentExpressionKind result) { ++ return result.isPoly(); ++ } ++ }; ++ ++ @Override ++ public void visitLiteral(JCLiteral tree) { ++ Type litType = attr.litType(tree.typetag); ++ result = ArgumentExpressionKind.standaloneKind(litType, types); ++ } ++ ++ @Override ++ void skip(JCTree tree) { ++ result = ArgumentExpressionKind.NO_POLY; ++ } ++ ++ private Symbol quicklyResolveMethod(Env<AttrContext> env, final JCMethodInvocation tree) { + final JCExpression rec = tree.meth.hasTag(SELECT) ? + ((JCFieldAccess)tree.meth).selected : + null; + + if (rec != null && !isSimpleReceiver(rec)) { +- //give up if receiver is too complex (to cut down analysis time) +- result = ArgumentExpressionKind.POLY; +- return; ++ return null; + } + +- Type site = rec != null ? +- attribSpeculative(rec, env, attr.unknownTypeExprInfo).type : +- env.enclClass.sym.type; ++ Type site; + +- while (site.hasTag(TYPEVAR)) { +- site = site.getUpperBound(); ++ if (rec != null) { ++ if (rec.hasTag(APPLY)) { ++ Symbol recSym = quicklyResolveMethod(env, (JCMethodInvocation) rec); ++ if (recSym == null) ++ return null; ++ Symbol resolvedReturnType = ++ analyzeCandidateMethods(recSym, syms.errSymbol, returnSymbolAnalyzer); ++ if (resolvedReturnType == null) ++ return null; ++ site = resolvedReturnType.type; ++ } else { ++ site = attribSpeculative(rec, env, attr.unknownTypeExprInfo).type; ++ } ++ } else { ++ site = env.enclClass.sym.type; + } + + List<Type> args = rs.dummyArgs(tree.args.length()); ++ Name name = TreeInfo.name(tree.meth); + + Resolve.LookupHelper lh = rs.new LookupHelper(name, site, args, List.<Type>nil(), MethodResolutionPhase.VARARITY) { + @Override +@@ -1124,61 +1330,60 @@ + } + }; + +- Symbol sym = rs.lookupMethod(env, tree, site.tsym, rs.arityMethodCheck, lh); ++ return rs.lookupMethod(env, tree, site.tsym, rs.arityMethodCheck, lh); ++ } ++ //where: ++ MethodAnalyzer<Symbol> returnSymbolAnalyzer = new MethodAnalyzer<Symbol>() { ++ @Override ++ public Symbol process(MethodSymbol ms) { ++ ArgumentExpressionKind kind = ArgumentExpressionKind.methodKind(ms, types); ++ return kind != ArgumentExpressionKind.POLY ? ms.getReturnType().tsym : null; ++ } ++ @Override ++ public Symbol reduce(Symbol s1, Symbol s2) { ++ return s1 == syms.errSymbol ? s2 : s1 == s2 ? s1 : null; ++ } ++ @Override ++ public boolean shouldStop(Symbol result) { ++ return result == null; ++ } ++ }; + +- if (sym.kind == Kinds.AMBIGUOUS) { +- Resolve.AmbiguityError err = (Resolve.AmbiguityError)sym.baseSymbol(); +- result = ArgumentExpressionKind.PRIMITIVE; +- for (Symbol s : err.ambiguousSyms) { +- if (result.isPoly()) break; +- if (s.kind == Kinds.MTH) { +- result = reduce(ArgumentExpressionKind.methodKind(s, types)); ++ /** ++ * Process the result of Resolve.lookupMethod. If sym is a method symbol, the result of ++ * MethodAnalyzer.process is returned. If sym is an ambiguous symbol, all the candidate ++ * methods are inspected one by one, using MethodAnalyzer.process. The outcomes are ++ * reduced using MethodAnalyzer.reduce (using defaultValue as the first value over which ++ * the reduction runs). MethodAnalyzer.shouldStop can be used to stop the inspection early. ++ */ ++ <E> E analyzeCandidateMethods(Symbol sym, E defaultValue, MethodAnalyzer<E> analyzer) { ++ switch (sym.kind) { ++ case Kinds.MTH: ++ return analyzer.process((MethodSymbol) sym); ++ case Kinds.AMBIGUOUS: ++ Resolve.AmbiguityError err = (Resolve.AmbiguityError)sym.baseSymbol(); ++ E res = defaultValue; ++ for (Symbol s : err.ambiguousSyms) { ++ if (s.kind == Kinds.MTH) { ++ res = analyzer.reduce(res, analyzer.process((MethodSymbol) s)); ++ if (analyzer.shouldStop(res)) ++ return res; ++ } + } +- } +- } else { +- result = (sym.kind == Kinds.MTH) ? +- ArgumentExpressionKind.methodKind(sym, types) : +- ArgumentExpressionKind.NO_POLY; ++ return res; ++ default: ++ return defaultValue; + } + } +- //where +- private boolean isSimpleReceiver(JCTree rec) { +- switch (rec.getTag()) { +- case IDENT: +- return true; +- case SELECT: +- return isSimpleReceiver(((JCFieldAccess)rec).selected); +- case TYPEAPPLY: +- case TYPEARRAY: +- return true; +- case ANNOTATED_TYPE: +- return isSimpleReceiver(((JCAnnotatedType)rec).underlyingType); +- default: +- return false; +- } +- } +- private ArgumentExpressionKind reduce(ArgumentExpressionKind kind) { +- switch (result) { +- case PRIMITIVE: return kind; +- case NO_POLY: return kind.isPoly() ? kind : result; +- case POLY: return result; +- default: +- Assert.error(); +- return null; +- } +- } ++ } + +- @Override +- public void visitLiteral(JCLiteral tree) { +- Type litType = attr.litType(tree.typetag); +- result = ArgumentExpressionKind.standaloneKind(litType, types); +- } ++ /** Analyzer for methods - used by analyzeCandidateMethods. */ ++ interface MethodAnalyzer<E> { ++ E process(MethodSymbol ms); ++ E reduce(E e1, E e2); ++ boolean shouldStop(E result); ++ } + +- @Override +- void skip(JCTree tree) { +- result = ArgumentExpressionKind.NO_POLY; +- } +- } + //where + private EnumSet<JCTree.Tag> deferredCheckerTags = + EnumSet.of(LAMBDA, REFERENCE, PARENS, TYPECAST, +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java Wed Jul 30 03:55:11 2014 -0700 +@@ -105,6 +105,7 @@ + Names names; + JavaFileManager fileManager; + PkgInfo pkginfoOpt; ++ TypeEnvs typeEnvs; + + private final Todo todo; + +@@ -142,14 +143,9 @@ + + Options options = Options.instance(context); + pkginfoOpt = PkgInfo.get(options); ++ typeEnvs = TypeEnvs.instance(context); + } + +- /** A hashtable mapping classes and packages to the environments current +- * at the points of their definitions. +- */ +- Map<TypeSymbol,Env<AttrContext>> typeEnvs = +- new HashMap<TypeSymbol,Env<AttrContext>>(); +- + /** Accessor for typeEnvs + */ + public Env<AttrContext> getEnv(TypeSymbol sym) { +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -45,7 +45,7 @@ + import static com.sun.tools.javac.tree.JCTree.Tag.*; + + /** This pass implements dataflow analysis for Java programs though +- * different AST visitor steps. Liveness analysis (see AliveAlanyzer) checks that ++ * different AST visitor steps. Liveness analysis (see AliveAnalyzer) checks that + * every statement is reachable. Exception analysis (see FlowAnalyzer) ensures that + * every checked exception that is thrown is declared or caught. Definite assignment analysis + * (see AssignAnalyzer) ensures that each variable is assigned when used. Definite +@@ -197,6 +197,7 @@ + private final boolean allowImprovedRethrowAnalysis; + private final boolean allowImprovedCatchAnalysis; + private final boolean allowEffectivelyFinalInInnerClasses; ++ private final boolean enforceThisDotInit; + + public static Flow instance(Context context) { + Flow instance = context.get(flowKey); +@@ -207,7 +208,7 @@ + + public void analyzeTree(Env<AttrContext> env, TreeMaker make) { + new AliveAnalyzer().analyzeTree(env, make); +- new AssignAnalyzer(log, syms, lint, names).analyzeTree(env); ++ new AssignAnalyzer(log, syms, lint, names, enforceThisDotInit).analyzeTree(env); + new FlowAnalyzer().analyzeTree(env, make); + new CaptureAnalyzer().analyzeTree(env, make); + } +@@ -231,7 +232,8 @@ + } + } + +- public List<Type> analyzeLambdaThrownTypes(Env<AttrContext> env, JCLambda that, TreeMaker make) { ++ public List<Type> analyzeLambdaThrownTypes(final Env<AttrContext> env, ++ JCLambda that, TreeMaker make) { + //we need to disable diagnostics temporarily; the problem is that if + //a lambda expression contains e.g. an unreachable statement, an error + //message will be reported and will cause compilation to skip the flow analyis +@@ -239,7 +241,13 @@ + //related errors, which will allow for more errors to be detected + Log.DiagnosticHandler diagHandler = new Log.DiscardDiagnosticHandler(log); + try { +- new AssignAnalyzer(log, syms, lint, names).analyzeTree(env); ++ new AssignAnalyzer(log, syms, lint, names, enforceThisDotInit) { ++ @Override ++ protected boolean trackable(VarSymbol sym) { ++ return !env.info.scope.includes(sym) && ++ sym.owner.kind == MTH; ++ } ++ }.analyzeTree(env); + LambdaFlowAnalyzer flowAnalyzer = new LambdaFlowAnalyzer(); + flowAnalyzer.analyzeTree(env, that, make); + return flowAnalyzer.inferredThrownTypes; +@@ -289,6 +297,7 @@ + allowImprovedRethrowAnalysis = source.allowImprovedRethrowAnalysis(); + allowImprovedCatchAnalysis = source.allowImprovedCatchAnalysis(); + allowEffectivelyFinalInInnerClasses = source.allowEffectivelyFinalInInnerClasses(); ++ enforceThisDotInit = source.enforceThisDotInit(); + } + + /** +@@ -1427,6 +1436,8 @@ + + protected Names names; + ++ final boolean enforceThisDotInit; ++ + public static class AbstractAssignPendingExit extends BaseAnalyzer.PendingExit { + + final Bits inits; +@@ -1449,7 +1460,7 @@ + } + } + +- public AbstractAssignAnalyzer(Bits inits, Symtab syms, Names names) { ++ public AbstractAssignAnalyzer(Bits inits, Symtab syms, Names names, boolean enforceThisDotInit) { + this.inits = inits; + uninits = new Bits(); + uninitsTry = new Bits(); +@@ -1459,11 +1470,22 @@ + uninitsWhenFalse = new Bits(true); + this.syms = syms; + this.names = names; ++ this.enforceThisDotInit = enforceThisDotInit; + } + ++ private boolean isInitialConstructor = false; ++ + @Override + protected void markDead(JCTree tree) { +- inits.inclRange(returnadr, nextadr); ++ if (!isInitialConstructor) { ++ inits.inclRange(returnadr, nextadr); ++ } else { ++ for (int address = returnadr; address < nextadr; address++) { ++ if (!(isFinalUninitializedStaticField(vardecls[address].sym))) { ++ inits.incl(address); ++ } ++ } ++ } + uninits.inclRange(returnadr, nextadr); + } + +@@ -1476,8 +1498,17 @@ + return + sym.pos >= startPos && + ((sym.owner.kind == MTH || +- ((sym.flags() & (FINAL | HASINIT | PARAMETER)) == FINAL && +- classDef.sym.isEnclosedBy((ClassSymbol)sym.owner)))); ++ isFinalUninitializedField(sym))); ++ } ++ ++ boolean isFinalUninitializedField(VarSymbol sym) { ++ return sym.owner.kind == TYP && ++ ((sym.flags() & (FINAL | HASINIT | PARAMETER)) == FINAL && ++ classDef.sym.isEnclosedBy((ClassSymbol)sym.owner)); ++ } ++ ++ boolean isFinalUninitializedStaticField(VarSymbol sym) { ++ return isFinalUninitializedField(sym) && sym.isStatic(); + } + + /** Initialize new trackable variable by setting its address field +@@ -1731,10 +1762,9 @@ + int returnadrPrev = returnadr; + + Assert.check(pendingExits.isEmpty()); +- ++ boolean lastInitialConstructor = isInitialConstructor; + try { +- boolean isInitialConstructor = +- TreeInfo.isInitialConstructor(tree); ++ isInitialConstructor = TreeInfo.isInitialConstructor(tree); + + if (!isInitialConstructor) { + firstadr = nextadr; +@@ -1789,6 +1819,7 @@ + nextadr = nextadrPrev; + firstadr = firstadrPrev; + returnadr = returnadrPrev; ++ isInitialConstructor = lastInitialConstructor; + } + } + +@@ -2261,12 +2292,34 @@ + + public void visitAssign(JCAssign tree) { + JCTree lhs = TreeInfo.skipParens(tree.lhs); +- if (!(lhs instanceof JCIdent)) { ++ if (!isIdentOrThisDotIdent(lhs)) + scanExpr(lhs); +- } + scanExpr(tree.rhs); + letInit(lhs); + } ++ private boolean isIdentOrThisDotIdent(JCTree lhs) { ++ if (lhs.hasTag(IDENT)) ++ return true; ++ if (!lhs.hasTag(SELECT)) ++ return false; ++ ++ JCFieldAccess fa = (JCFieldAccess)lhs; ++ return fa.selected.hasTag(IDENT) && ++ ((JCIdent)fa.selected).name == names._this; ++ } ++ ++ // check fields accessed through this.<field> are definitely ++ // assigned before reading their value ++ public void visitSelect(JCFieldAccess tree) { ++ super.visitSelect(tree); ++ if (enforceThisDotInit && ++ tree.selected.hasTag(IDENT) && ++ ((JCIdent)tree.selected).name == names._this && ++ tree.sym.kind == VAR) ++ { ++ checkInit(tree.pos(), (VarSymbol)tree.sym); ++ } ++ } + + public void visitAssignop(JCAssignOp tree) { + scanExpr(tree.lhs); +@@ -2400,8 +2453,8 @@ + } + } + +- public AssignAnalyzer(Log log, Symtab syms, Lint lint, Names names) { +- super(new Bits(), syms, names); ++ public AssignAnalyzer(Log log, Symtab syms, Lint lint, Names names, boolean enforceThisDotInit) { ++ super(new Bits(), syms, names, enforceThisDotInit); + this.log = log; + this.lint = lint; + } +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -142,24 +142,24 @@ + * Main inference entry point - instantiate a generic method type + * using given argument types and (possibly) an expected target-type. + */ +- public Type instantiateMethod(Env<AttrContext> env, +- List<Type> tvars, +- MethodType mt, +- Attr.ResultInfo resultInfo, +- Symbol msym, +- List<Type> argtypes, +- boolean allowBoxing, +- boolean useVarargs, +- Resolve.MethodResolutionContext resolveContext, +- Warner warn) throws InferenceException { ++ Type instantiateMethod( Env<AttrContext> env, ++ List<Type> tvars, ++ MethodType mt, ++ Attr.ResultInfo resultInfo, ++ MethodSymbol msym, ++ List<Type> argtypes, ++ boolean allowBoxing, ++ boolean useVarargs, ++ Resolve.MethodResolutionContext resolveContext, ++ Warner warn) throws InferenceException { + //-System.err.println("instantiateMethod(" + tvars + ", " + mt + ", " + argtypes + ")"); //DEBUG +- final InferenceContext inferenceContext = new InferenceContext(tvars); ++ final InferenceContext inferenceContext = new InferenceContext(tvars); //B0 + inferenceException.clear(); + try { + DeferredAttr.DeferredAttrContext deferredAttrContext = + resolveContext.deferredAttrContext(msym, inferenceContext, resultInfo, warn); + +- resolveContext.methodCheck.argumentsAcceptable(env, deferredAttrContext, ++ resolveContext.methodCheck.argumentsAcceptable(env, deferredAttrContext, //B2 + argtypes, mt.getParameterTypes(), warn); + + if (allowGraphInference && +@@ -167,7 +167,8 @@ + !warn.hasNonSilentLint(Lint.LintCategory.UNCHECKED)) { + //inject return constraints earlier + checkWithinBounds(inferenceContext, warn); //propagation +- Type newRestype = generateReturnConstraints(resultInfo, mt, inferenceContext); ++ Type newRestype = generateReturnConstraints(env.tree, resultInfo, //B3 ++ mt, inferenceContext); + mt = (MethodType)types.createMethodTypeWithReturn(mt, newRestype); + //propagate outwards if needed + if (resultInfo.checkContext.inferenceContext().free(resultInfo.pt)) { +@@ -193,7 +194,7 @@ + inferenceContext.restvars().nonEmpty() && + resultInfo != null && + !warn.hasNonSilentLint(Lint.LintCategory.UNCHECKED)) { +- generateReturnConstraints(resultInfo, mt, inferenceContext); ++ generateReturnConstraints(env.tree, resultInfo, mt, inferenceContext); + inferenceContext.solveLegacy(false, warn, LegacyInferenceSteps.EQ_UPPER.steps); //maximizeInst + mt = (MethodType)inferenceContext.asInstType(mt); + } +@@ -210,6 +211,12 @@ + } else { + inferenceContext.notifyChange(inferenceContext.boundedVars()); + } ++ if (resultInfo == null) { ++ /* if the is no result info then we can clear the capture types ++ * cache without affecting any result info check ++ */ ++ inferenceContext.captureTypeCache.clear(); ++ } + } + } + +@@ -218,11 +225,12 @@ + * call occurs in a context where a type T is expected, use the expected + * type to derive more constraints on the generic method inference variables. + */ +- Type generateReturnConstraints(Attr.ResultInfo resultInfo, ++ Type generateReturnConstraints(JCTree tree, Attr.ResultInfo resultInfo, + MethodType mt, InferenceContext inferenceContext) { ++ InferenceContext rsInfoInfContext = resultInfo.checkContext.inferenceContext(); + Type from = mt.getReturnType(); + if (mt.getReturnType().containsAny(inferenceContext.inferencevars) && +- resultInfo.checkContext.inferenceContext() != emptyContext) { ++ rsInfoInfContext != emptyContext) { + from = types.capture(from); + //add synthetic captured ivars + for (Type t : from.getTypeArguments()) { +@@ -231,13 +239,29 @@ + } + } + } +- Type qtype1 = inferenceContext.asFree(from); +- Type to = returnConstraintTarget(qtype1, resultInfo.pt); +- Assert.check(allowGraphInference || !resultInfo.checkContext.inferenceContext().free(to), ++ Type qtype = inferenceContext.asUndetVar(from); ++ Type to = resultInfo.pt; ++ ++ if (qtype.hasTag(VOID)) { ++ to = syms.voidType; ++ } else if (to.hasTag(NONE)) { ++ to = from.isPrimitive() ? from : syms.objectType; ++ } else if (qtype.hasTag(UNDETVAR)) { ++ if (resultInfo.pt.isReference()) { ++ to = generateReturnConstraintsUndetVarToReference( ++ tree, (UndetVar)qtype, to, resultInfo, inferenceContext); ++ } else { ++ if (to.isPrimitive()) { ++ to = generateReturnConstraintsPrimitive(tree, (UndetVar)qtype, to, ++ resultInfo, inferenceContext); ++ } ++ } ++ } ++ Assert.check(allowGraphInference || !rsInfoInfContext.free(to), + "legacy inference engine cannot handle constraints on both sides of a subtyping assertion"); + //we need to skip capture? + Warner retWarn = new Warner(); +- if (!resultInfo.checkContext.compatible(qtype1, resultInfo.checkContext.inferenceContext().asFree(to), retWarn) || ++ if (!resultInfo.checkContext.compatible(qtype, rsInfoInfContext.asUndetVar(to), retWarn) || + //unchecked conversion is not allowed in source 7 mode + (!allowGraphInference && retWarn.hasLint(Lint.LintCategory.UNCHECKED))) { + throw inferenceException +@@ -247,30 +271,96 @@ + return from; + } + +- Type returnConstraintTarget(Type from, Type to) { +- if (from.hasTag(VOID)) { +- return syms.voidType; +- } else if (to.hasTag(NONE)) { +- return from.isPrimitive() ? from : syms.objectType; +- } else if (from.hasTag(UNDETVAR) && to.isPrimitive()) { +- if (!allowGraphInference) { +- //if legacy, just return boxed type +- return types.boxedClass(to).type; ++ private Type generateReturnConstraintsPrimitive(JCTree tree, UndetVar from, ++ Type to, Attr.ResultInfo resultInfo, InferenceContext inferenceContext) { ++ if (!allowGraphInference) { ++ //if legacy, just return boxed type ++ return types.boxedClass(to).type; ++ } ++ //if graph inference we need to skip conflicting boxed bounds... ++ for (Type t : from.getBounds(InferenceBound.EQ, InferenceBound.UPPER, ++ InferenceBound.LOWER)) { ++ Type boundAsPrimitive = types.unboxedType(t); ++ if (boundAsPrimitive == null || boundAsPrimitive.hasTag(NONE)) { ++ continue; + } +- //if graph inference we need to skip conflicting boxed bounds... +- UndetVar uv = (UndetVar)from; +- for (Type t : uv.getBounds(InferenceBound.EQ, InferenceBound.LOWER)) { +- Type boundAsPrimitive = types.unboxedType(t); +- if (boundAsPrimitive == null) continue; +- if (types.isConvertible(boundAsPrimitive, to)) { +- //effectively skip return-type constraint generation (compatibility) +- return syms.objectType; ++ return generateReferenceToTargetConstraint(tree, from, to, ++ resultInfo, inferenceContext); ++ } ++ return types.boxedClass(to).type; ++ } ++ ++ private Type generateReturnConstraintsUndetVarToReference(JCTree tree, ++ UndetVar from, Type to, Attr.ResultInfo resultInfo, ++ InferenceContext inferenceContext) { ++ Type captureOfTo = types.capture(to); ++ /* T is a reference type, but is not a wildcard-parameterized type, and either ++ */ ++ if (captureOfTo == to) { //not a wildcard parameterized type ++ /* i) B2 contains a bound of one of the forms alpha = S or S <: alpha, ++ * where S is a wildcard-parameterized type, or ++ */ ++ for (Type t : from.getBounds(InferenceBound.EQ, InferenceBound.LOWER)) { ++ Type captureOfBound = types.capture(t); ++ if (captureOfBound != t) { ++ return generateReferenceToTargetConstraint(tree, from, to, ++ resultInfo, inferenceContext); + } + } +- return types.boxedClass(to).type; +- } else { +- return to; ++ ++ /* ii) B2 contains two bounds of the forms S1 <: alpha and S2 <: alpha, ++ * where S1 and S2 have supertypes that are two different ++ * parameterizations of the same generic class or interface. ++ */ ++ for (Type aLowerBound : from.getBounds(InferenceBound.LOWER)) { ++ for (Type anotherLowerBound : from.getBounds(InferenceBound.LOWER)) { ++ if (aLowerBound != anotherLowerBound && ++ commonSuperWithDiffParameterization(aLowerBound, anotherLowerBound)) { ++ /* self comment check if any lower bound may be and undetVar, ++ * in that case the result of this call may be a false positive. ++ * Should this be restricted to non free types? ++ */ ++ return generateReferenceToTargetConstraint(tree, from, to, ++ resultInfo, inferenceContext); ++ } ++ } ++ } + } ++ ++ /* T is a parameterization of a generic class or interface, G, ++ * and B2 contains a bound of one of the forms alpha = S or S <: alpha, ++ * where there exists no type of the form G<...> that is a ++ * supertype of S, but the raw type G is a supertype of S ++ */ ++ if (to.isParameterized()) { ++ for (Type t : from.getBounds(InferenceBound.EQ, InferenceBound.LOWER)) { ++ Type sup = types.asSuper(t, to.tsym); ++ if (sup != null && sup.isRaw()) { ++ return generateReferenceToTargetConstraint(tree, from, to, ++ resultInfo, inferenceContext); ++ } ++ } ++ } ++ return to; ++ } ++ ++ private boolean commonSuperWithDiffParameterization(Type t, Type s) { ++ Pair<Type, Type> supers = getParameterizedSupers(t, s); ++ return (supers != null && !types.isSameType(supers.fst, supers.snd)); ++ } ++ ++ private Type generateReferenceToTargetConstraint(JCTree tree, UndetVar from, ++ Type to, Attr.ResultInfo resultInfo, ++ InferenceContext inferenceContext) { ++ inferenceContext.solve(List.of(from.qtype), new Warner()); ++ Type capturedType = resultInfo.checkContext.inferenceContext() ++ .cachedCapture(tree, from.inst, false); ++ if (types.isConvertible(capturedType, ++ resultInfo.checkContext.inferenceContext().asUndetVar(to))) { ++ //effectively skip additional return-type constraint generation (compatibility) ++ return syms.objectType; ++ } ++ return to; + } + + /** +@@ -280,7 +370,7 @@ + ListBuffer<Type> todo = new ListBuffer<>(); + //step 1 - create fresh tvars + for (Type t : vars) { +- UndetVar uv = (UndetVar)inferenceContext.asFree(t); ++ UndetVar uv = (UndetVar)inferenceContext.asUndetVar(t); + List<Type> upperBounds = uv.getBounds(InferenceBound.UPPER); + if (Type.containsAny(upperBounds, vars)) { + TypeSymbol fresh_tvar = new TypeVariableSymbol(Flags.SYNTHETIC, uv.qtype.tsym.name, null, uv.qtype.tsym.owner); +@@ -399,7 +489,7 @@ + return types.createErrorType(funcInterface); + } + for (Type p : descParameterTypes) { +- if (!types.isSameType(funcInterfaceContext.asFree(p), paramTypes.head)) { ++ if (!types.isSameType(funcInterfaceContext.asUndetVar(p), paramTypes.head)) { + checkContext.report(pos, diags.fragment("no.suitable.functional.intf.inst", funcInterface)); + return types.createErrorType(funcInterface); + } +@@ -515,6 +605,32 @@ + /** max number of incorporation rounds */ + static final int MAX_INCORPORATION_STEPS = 100; + ++ /* If for two types t and s there is a least upper bound that is a ++ * parameterized type G, then there exists a supertype of 't' of the form ++ * G<T1, ..., Tn> and a supertype of 's' of the form G<S1, ..., Sn> ++ * which will be returned by this method. If no such supertypes exists then ++ * null is returned. ++ * ++ * As an example for the following input: ++ * ++ * t = java.util.ArrayList<java.lang.String> ++ * s = java.util.List<T> ++ * ++ * we get this ouput: ++ * ++ * Pair[java.util.List<java.lang.String>,java.util.List<T>] ++ */ ++ private Pair<Type, Type> getParameterizedSupers(Type t, Type s) { ++ Type lubResult = types.lub(t, s); ++ if (lubResult == syms.errType || lubResult == syms.botType || ++ !lubResult.isParameterized()) { ++ return null; ++ } ++ Type asSuperOfT = types.asSuper(t, lubResult.tsym); ++ Type asSuperOfS = types.asSuper(s, lubResult.tsym); ++ return new Pair<>(asSuperOfT, asSuperOfS); ++ } ++ + /** + * This enumeration defines an entry point for doing inference variable + * bound incorporation - it can be used to inject custom incorporation +@@ -533,22 +649,23 @@ + if (uv.inst != null) { + Type inst = uv.inst; + for (Type u : uv.getBounds(InferenceBound.UPPER)) { +- if (!isSubtype(inst, inferenceContext.asFree(u), warn, infer)) { ++ if (!isSubtype(inst, inferenceContext.asUndetVar(u), warn, infer)) { + infer.reportBoundError(uv, BoundErrorKind.UPPER); + } + } + for (Type l : uv.getBounds(InferenceBound.LOWER)) { +- if (!isSubtype(inferenceContext.asFree(l), inst, warn, infer)) { ++ if (!isSubtype(inferenceContext.asUndetVar(l), inst, warn, infer)) { + infer.reportBoundError(uv, BoundErrorKind.LOWER); + } + } + for (Type e : uv.getBounds(InferenceBound.EQ)) { +- if (!isSameType(inst, inferenceContext.asFree(e), infer)) { ++ if (!isSameType(inst, inferenceContext.asUndetVar(e), infer)) { + infer.reportBoundError(uv, BoundErrorKind.EQ); + } + } + } + } ++ + @Override + boolean accepts(UndetVar uv, InferenceContext inferenceContext) { + //applies to all undetvars +@@ -594,12 +711,12 @@ + for (Type e : uv.getBounds(InferenceBound.EQ)) { + if (e.containsAny(inferenceContext.inferenceVars())) continue; + for (Type u : uv.getBounds(InferenceBound.UPPER)) { +- if (!isSubtype(e, inferenceContext.asFree(u), warn, infer)) { ++ if (!isSubtype(e, inferenceContext.asUndetVar(u), warn, infer)) { + infer.reportBoundError(uv, BoundErrorKind.BAD_EQ_UPPER); + } + } + for (Type l : uv.getBounds(InferenceBound.LOWER)) { +- if (!isSubtype(inferenceContext.asFree(l), e, warn, infer)) { ++ if (!isSubtype(inferenceContext.asUndetVar(l), e, warn, infer)) { + infer.reportBoundError(uv, BoundErrorKind.BAD_EQ_LOWER); + } + } +@@ -615,7 +732,7 @@ + Infer infer = inferenceContext.infer(); + for (Type b1 : uv.getBounds(InferenceBound.UPPER)) { + for (Type b2 : uv.getBounds(InferenceBound.LOWER)) { +- isSubtype(inferenceContext.asFree(b2), inferenceContext.asFree(b1), warn , infer); ++ isSubtype(inferenceContext.asUndetVar(b2), inferenceContext.asUndetVar(b1), warn , infer); + } + } + } +@@ -629,7 +746,7 @@ + Infer infer = inferenceContext.infer(); + for (Type b1 : uv.getBounds(InferenceBound.UPPER)) { + for (Type b2 : uv.getBounds(InferenceBound.EQ)) { +- isSubtype(inferenceContext.asFree(b2), inferenceContext.asFree(b1), warn, infer); ++ isSubtype(inferenceContext.asUndetVar(b2), inferenceContext.asUndetVar(b1), warn, infer); + } + } + } +@@ -643,12 +760,59 @@ + Infer infer = inferenceContext.infer(); + for (Type b1 : uv.getBounds(InferenceBound.EQ)) { + for (Type b2 : uv.getBounds(InferenceBound.LOWER)) { +- isSubtype(inferenceContext.asFree(b2), inferenceContext.asFree(b1), warn, infer); ++ isSubtype(inferenceContext.asUndetVar(b2), inferenceContext.asUndetVar(b1), warn, infer); + } + } + } + }, + /** ++ * Given a bound set containing {@code alpha <: P<T>} and ++ * {@code alpha <: P<S>} where P is a parameterized type, ++ * perform {@code T = S} (which could lead to new bounds). ++ */ ++ CROSS_UPPER_UPPER() { ++ @Override ++ public void apply(UndetVar uv, InferenceContext inferenceContext, Warner warn) { ++ Infer infer = inferenceContext.infer(); ++ List<Type> boundList = uv.getBounds(InferenceBound.UPPER); ++ List<Type> boundListTail = boundList.tail; ++ while (boundList.nonEmpty()) { ++ List<Type> tmpTail = boundListTail; ++ while (tmpTail.nonEmpty()) { ++ Type b1 = boundList.head; ++ Type b2 = tmpTail.head; ++ if (b1 != b2) { ++ Pair<Type, Type> commonSupers = infer.getParameterizedSupers(b1, b2); ++ if (commonSupers != null) { ++ List<Type> allParamsSuperBound1 = commonSupers.fst.allparams(); ++ List<Type> allParamsSuperBound2 = commonSupers.snd.allparams(); ++ while (allParamsSuperBound1.nonEmpty() && allParamsSuperBound2.nonEmpty()) { ++ //traverse the list of all params comparing them ++ if (!allParamsSuperBound1.head.hasTag(WILDCARD) && ++ !allParamsSuperBound2.head.hasTag(WILDCARD)) { ++ isSameType(inferenceContext.asUndetVar(allParamsSuperBound1.head), ++ inferenceContext.asUndetVar(allParamsSuperBound2.head), infer); ++ } ++ allParamsSuperBound1 = allParamsSuperBound1.tail; ++ allParamsSuperBound2 = allParamsSuperBound2.tail; ++ } ++ Assert.check(allParamsSuperBound1.isEmpty() && allParamsSuperBound2.isEmpty()); ++ } ++ } ++ tmpTail = tmpTail.tail; ++ } ++ boundList = boundList.tail; ++ boundListTail = boundList.tail; ++ } ++ } ++ ++ @Override ++ boolean accepts(UndetVar uv, InferenceContext inferenceContext) { ++ return !uv.isCaptured() && ++ uv.getBounds(InferenceBound.UPPER).nonEmpty(); ++ } ++ }, ++ /** + * Given a bound set containing {@code alpha == S} and {@code alpha == T} + * perform {@code S == T} (which could lead to new bounds). + */ +@@ -658,7 +822,7 @@ + for (Type b1 : uv.getBounds(InferenceBound.EQ)) { + for (Type b2 : uv.getBounds(InferenceBound.EQ)) { + if (b1 != b2) { +- isSameType(inferenceContext.asFree(b2), inferenceContext.asFree(b1), infer); ++ isSameType(inferenceContext.asUndetVar(b2), inferenceContext.asUndetVar(b1), infer); + } + } + } +@@ -673,7 +837,7 @@ + Infer infer = inferenceContext.infer(); + for (Type b : uv.getBounds(InferenceBound.UPPER)) { + if (inferenceContext.inferenceVars().contains(b)) { +- UndetVar uv2 = (UndetVar)inferenceContext.asFree(b); ++ UndetVar uv2 = (UndetVar)inferenceContext.asUndetVar(b); + if (uv2.isCaptured()) continue; + //alpha <: beta + //0. set beta :> alpha +@@ -699,7 +863,7 @@ + Infer infer = inferenceContext.infer(); + for (Type b : uv.getBounds(InferenceBound.LOWER)) { + if (inferenceContext.inferenceVars().contains(b)) { +- UndetVar uv2 = (UndetVar)inferenceContext.asFree(b); ++ UndetVar uv2 = (UndetVar)inferenceContext.asUndetVar(b); + if (uv2.isCaptured()) continue; + //alpha :> beta + //0. set beta <: alpha +@@ -725,7 +889,7 @@ + Infer infer = inferenceContext.infer(); + for (Type b : uv.getBounds(InferenceBound.EQ)) { + if (inferenceContext.inferenceVars().contains(b)) { +- UndetVar uv2 = (UndetVar)inferenceContext.asFree(b); ++ UndetVar uv2 = (UndetVar)inferenceContext.asUndetVar(b); + if (uv2.isCaptured()) continue; + //alpha == beta + //0. set beta == alpha +@@ -1243,7 +1407,7 @@ + Type solve(UndetVar uv, InferenceContext inferenceContext) { + Infer infer = inferenceContext.infer(); + List<Type> hibounds = filterBounds(uv, inferenceContext); +- //note: lobounds should have at least one element ++ //note: hibounds should have at least one element + Type owntype = hibounds.tail.tail == null ? hibounds.head : infer.types.glb(hibounds); + if (owntype.isPrimitive() || owntype.hasTag(ERROR)) { + throw infer.inferenceException +@@ -1475,7 +1639,7 @@ + StringBuilder buf = new StringBuilder(); + String sep = ""; + for (Type from : data) { +- UndetVar uv = (UndetVar)inferenceContext.asFree(from); ++ UndetVar uv = (UndetVar)inferenceContext.asUndetVar(from); + for (Type bound : uv.getBounds(InferenceBound.values())) { + if (bound.containsAny(List.from(to.data))) { + buf.append(sep); +@@ -1684,7 +1848,7 @@ + Set<Type> optDepsByNode = stuckDeps.get(i); + for (Node n_j : nodes) { + Type j = n_j.data.first(); +- UndetVar uv_i = (UndetVar)inferenceContext.asFree(i); ++ UndetVar uv_i = (UndetVar)inferenceContext.asUndetVar(i); + if (Type.containsAny(uv_i.getBounds(InferenceBound.values()), List.of(j))) { + //update i's bound dependencies + n_i.addDependency(DependencyKind.BOUND, n_j); +@@ -1833,6 +1997,8 @@ + }); + } + ++ /* Returns the corresponding inference variables. ++ */ + private List<Type> filterVars(Filter<UndetVar> fu) { + ListBuffer<Type> res = new ListBuffer<>(); + for (Type t : undetvars) { +@@ -1890,14 +2056,14 @@ + * undet vars (used ahead of subtyping/compatibility checks to allow propagation + * of inference constraints). + */ +- final Type asFree(Type t) { ++ final Type asUndetVar(Type t) { + return types.subst(t, inferencevars, undetvars); + } + +- final List<Type> asFree(List<Type> ts) { ++ final List<Type> asUndetVars(List<Type> ts) { + ListBuffer<Type> buf = new ListBuffer<>(); + for (Type t : ts) { +- buf.append(asFree(t)); ++ buf.append(asUndetVar(t)); + } + return buf.toList(); + } +@@ -2005,8 +2171,10 @@ + * Copy variable in this inference context to the given context + */ + void dupTo(final InferenceContext that) { +- that.inferencevars = that.inferencevars.appendList(inferencevars); +- that.undetvars = that.undetvars.appendList(undetvars); ++ that.inferencevars = that.inferencevars.appendList( ++ inferencevars.diff(that.inferencevars)); ++ that.undetvars = that.undetvars.appendList( ++ undetvars.diff(that.undetvars)); + //set up listeners to notify original inference contexts as + //propagated vars are inferred in new context + for (Type t : inferencevars) { +@@ -2073,7 +2241,7 @@ + private boolean solveBasic(List<Type> varsToSolve, EnumSet<InferenceStep> steps) { + boolean changed = false; + for (Type t : varsToSolve.intersect(restvars())) { +- UndetVar uv = (UndetVar)asFree(t); ++ UndetVar uv = (UndetVar)asUndetVar(t); + for (InferenceStep step : steps) { + if (step.accepts(uv, this)) { + uv.inst = step.solve(uv, this); +@@ -2119,6 +2287,36 @@ + //back-door to infer + return Infer.this; + } ++ ++ @Override ++ public String toString() { ++ return "Inference vars: " + inferencevars + '\n' + ++ "Undet vars: " + undetvars; ++ } ++ ++ /* Method Types.capture() generates a new type every time it's applied ++ * to a wildcard parameterized type. This is intended functionality but ++ * there are some cases when what you need is not to generate a new ++ * captured type but to check that a previously generated captured type ++ * is correct. There are cases when caching a captured type for later ++ * reuse is sound. In general two captures from the same AST are equal. ++ * This is why the tree is used as the key of the map below. This map ++ * stores a Type per AST. ++ */ ++ Map<JCTree, Type> captureTypeCache = new HashMap<>(); ++ ++ Type cachedCapture(JCTree tree, Type t, boolean readOnly) { ++ Type captured = captureTypeCache.get(tree); ++ if (captured != null) { ++ return captured; ++ } ++ ++ Type result = types.capture(t); ++ if (result != t && !readOnly) { // then t is a wildcard parameterized type ++ captureTypeCache.put(tree, result); ++ } ++ return result; ++ } + } + + final InferenceContext emptyContext = new InferenceContext(List.<Type>nil()); +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2010, 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 +@@ -36,6 +36,7 @@ + import com.sun.tools.javac.code.Symbol.ClassSymbol; + import com.sun.tools.javac.code.Symbol.DynamicMethodSymbol; + import com.sun.tools.javac.code.Symbol.MethodSymbol; ++import com.sun.tools.javac.code.Symbol.TypeSymbol; + import com.sun.tools.javac.code.Symbol.VarSymbol; + import com.sun.tools.javac.code.Symtab; + import com.sun.tools.javac.code.Type; +@@ -50,8 +51,10 @@ + + import java.util.EnumMap; + import java.util.HashMap; ++import java.util.HashSet; + import java.util.LinkedHashMap; + import java.util.Map; ++import java.util.Set; + + import static com.sun.tools.javac.comp.LambdaToMethod.LambdaSymbolKind.*; + import static com.sun.tools.javac.code.Flags.*; +@@ -96,6 +99,9 @@ + /** dump statistics about lambda code generation */ + private boolean dumpLambdaToMethodStats; + ++ /** force serializable representation, for stress testing **/ ++ private final boolean forceSerializable; ++ + /** Flag for alternate metafactories indicating the lambda object is intended to be serializable */ + public static final int FLAG_SERIALIZABLE = 1 << 0; + +@@ -131,6 +137,7 @@ + Options options = Options.instance(context); + dumpLambdaToMethodStats = options.isSet("dumpLambdaToMethodStats"); + attr = Attr.instance(context); ++ forceSerializable = options.isSet("forceSerializable"); + } + // </editor-fold> + +@@ -434,13 +441,9 @@ + public void visitVarDef(JCVariableDecl tree) { + LambdaTranslationContext lambdaContext = (LambdaTranslationContext)context; + if (context != null && lambdaContext.getSymbolMap(LOCAL_VAR).containsKey(tree.sym)) { +- JCExpression init = translate(tree.init); +- int prevPos = make.pos; +- try { +- result = make.at(tree).VarDef((VarSymbol)lambdaContext.getSymbolMap(LOCAL_VAR).get(tree.sym), init); +- } finally { +- make.at(prevPos); +- } ++ tree.init = translate(tree.init); ++ tree.sym = (VarSymbol) lambdaContext.getSymbolMap(LOCAL_VAR).get(tree.sym); ++ result = tree; + } else if (context != null && lambdaContext.getSymbolMap(TYPE_VAR).containsKey(tree.sym)) { + JCExpression init = translate(tree.init); + VarSymbol xsym = (VarSymbol)lambdaContext.getSymbolMap(TYPE_VAR).get(tree.sym); +@@ -1282,7 +1285,10 @@ + + @Override + public void visitNewClass(JCNewClass tree) { +- if (lambdaNewClassFilter(context(), tree)) { ++ TypeSymbol def = tree.type.tsym; ++ boolean inReferencedClass = currentlyInClass(def); ++ boolean isLocal = def.isLocal(); ++ if ((inReferencedClass && isLocal || lambdaNewClassFilter(context(), tree))) { + TranslationContext<?> localContext = context(); + while (localContext != null) { + if (localContext.tree.getTag() == LAMBDA) { +@@ -1292,16 +1298,16 @@ + localContext = localContext.prev; + } + } +- if (context() != null && tree.type.tsym.owner.kind == MTH) { ++ if (context() != null && !inReferencedClass && isLocal) { + LambdaTranslationContext lambdaContext = (LambdaTranslationContext)context(); +- captureLocalClassDefs(tree.type.tsym, lambdaContext); ++ captureLocalClassDefs(def, lambdaContext); + } + super.visitNewClass(tree); + } + //where + void captureLocalClassDefs(Symbol csym, final LambdaTranslationContext lambdaContext) { + JCClassDecl localCDef = localClassDefs.get(csym); +- if (localCDef != null && localCDef.pos < lambdaContext.tree.pos) { ++ if (localCDef != null && lambdaContext.freeVarProcessedLocalClasses.add(csym)) { + BasicFreeVarCollector fvc = lower.new BasicFreeVarCollector() { + @Override + void addFreeVars(ClassSymbol c) { +@@ -1327,6 +1333,18 @@ + fvc.scan(localCDef); + } + } ++ //where ++ boolean currentlyInClass(Symbol csym) { ++ for (Frame frame : frameStack) { ++ if (frame.tree.hasTag(JCTree.Tag.CLASSDEF)) { ++ JCClassDecl cdef = (JCClassDecl) frame.tree; ++ if (cdef.sym == csym) { ++ return true; ++ } ++ } ++ } ++ return false; ++ } + + /** + * Method references to local class constructors, may, if the local +@@ -1694,6 +1712,9 @@ + + /** does this functional expression require serialization support? */ + boolean isSerializable() { ++ if (forceSerializable) { ++ return true; ++ } + for (Type target : tree.targets) { + if (types.asSuper(target, syms.serializableType.tsym) != null) { + return true; +@@ -1749,6 +1770,11 @@ + + List<JCVariableDecl> syntheticParams; + ++ /** ++ * to prevent recursion, track local classes processed ++ */ ++ final Set<Symbol> freeVarProcessedLocalClasses; ++ + LambdaTranslationContext(JCLambda tree) { + super(tree); + Frame frame = frameStack.head; +@@ -1778,6 +1804,8 @@ + translatedSymbols.put(CAPTURED_VAR, new LinkedHashMap<Symbol, Symbol>()); + translatedSymbols.put(CAPTURED_THIS, new LinkedHashMap<Symbol, Symbol>()); + translatedSymbols.put(TYPE_VAR, new LinkedHashMap<Symbol, Symbol>()); ++ ++ freeVarProcessedLocalClasses = new HashSet<>(); + } + + /** +@@ -1888,11 +1916,11 @@ + }; + break; + case LOCAL_VAR: +- ret = new VarSymbol(FINAL, name, types.erasure(sym.type), translatedSym); ++ ret = new VarSymbol(sym.flags() & FINAL, name, sym.type, translatedSym); + ((VarSymbol) ret).pos = ((VarSymbol) sym).pos; + break; + case PARAM: +- ret = new VarSymbol(FINAL | PARAMETER, name, types.erasure(sym.type), translatedSym); ++ ret = new VarSymbol((sym.flags() & FINAL) | PARAMETER, name, types.erasure(sym.type), translatedSym); + ((VarSymbol) ret).pos = ((VarSymbol) sym).pos; + break; + default: +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -82,6 +82,7 @@ + private ConstFold cfolder; + private Target target; + private Source source; ++ private final TypeEnvs typeEnvs; + private boolean allowEnums; + private final Name dollarAssertionsDisabled; + private final Name classDollar; +@@ -103,6 +104,7 @@ + cfolder = ConstFold.instance(context); + target = Target.instance(context); + source = Source.instance(context); ++ typeEnvs = TypeEnvs.instance(context); + allowEnums = source.allowEnums(); + dollarAssertionsDisabled = names. + fromString(target.syntheticNameChar() + "assertionsDisabled"); +@@ -2360,6 +2362,7 @@ + /** Visitor method: Translate a single node. + * Attach the source position from the old tree to its replacement tree. + */ ++ @Override + public <T extends JCTree> T translate(T tree) { + if (tree == null) { + return null; +@@ -2451,10 +2454,16 @@ + } + + public void visitClassDef(JCClassDecl tree) { ++ Env<AttrContext> prevEnv = attrEnv; + ClassSymbol currentClassPrev = currentClass; + MethodSymbol currentMethodSymPrev = currentMethodSym; ++ + currentClass = tree.sym; + currentMethodSym = null; ++ attrEnv = typeEnvs.remove(currentClass); ++ if (attrEnv == null) ++ attrEnv = prevEnv; ++ + classdefs.put(currentClass, tree); + + proxies = proxies.dup(currentClass); +@@ -2526,6 +2535,7 @@ + // Append translated tree to `translated' queue. + translated.append(tree); + ++ attrEnv = prevEnv; + currentClass = currentClassPrev; + currentMethodSym = currentMethodSymPrev; + +@@ -3471,7 +3481,7 @@ + private void visitIterableForeachLoop(JCEnhancedForLoop tree) { + make_at(tree.expr.pos()); + Type iteratorTarget = syms.objectType; +- Type iterableType = types.asSuper(types.upperBound(tree.expr.type), ++ Type iterableType = types.asSuper(types.cvarUpperBound(tree.expr.type), + syms.iterableType.tsym); + if (iterableType.getTypeArguments().nonEmpty()) + iteratorTarget = types.erasure(iterableType.getTypeArguments().head); +@@ -3505,7 +3515,7 @@ + List.<Type>nil()); + JCExpression vardefinit = make.App(make.Select(make.Ident(itvar), next)); + if (tree.var.type.isPrimitive()) +- vardefinit = make.TypeCast(types.upperBound(iteratorTarget), vardefinit); ++ vardefinit = make.TypeCast(types.cvarUpperBound(iteratorTarget), vardefinit); + else + vardefinit = make.TypeCast(tree.var.type, vardefinit); + JCVariableDecl indexDef = (JCVariableDecl)make.VarDef(tree.var.mods, +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Wed Jul 30 03:55:11 2014 -0700 +@@ -86,6 +86,7 @@ + private final Target target; + private final DeferredLintHandler deferredLintHandler; + private final Lint lint; ++ private final TypeEnvs typeEnvs; + + public static MemberEnter instance(Context context) { + MemberEnter instance = context.get(memberEnterKey); +@@ -113,6 +114,7 @@ + target = Target.instance(context); + deferredLintHandler = DeferredLintHandler.instance(context); + lint = Lint.instance(context); ++ typeEnvs = TypeEnvs.instance(context); + allowTypeAnnos = source.allowTypeAnnotations(); + allowRepeatedAnnos = source.allowRepeatedAnnotations(); + } +@@ -652,22 +654,8 @@ + attr.attribIdentAsEnumType(localEnv, (JCIdent)tree.vartype); + } else { + attr.attribType(tree.vartype, localEnv); +- if (tree.nameexpr != null) { +- attr.attribExpr(tree.nameexpr, localEnv); +- MethodSymbol m = localEnv.enclMethod.sym; +- if (m.isConstructor()) { +- Type outertype = m.owner.owner.type; +- if (outertype.hasTag(TypeTag.CLASS)) { +- checkType(tree.vartype, outertype, "incorrect.constructor.receiver.type"); +- checkType(tree.nameexpr, outertype, "incorrect.constructor.receiver.name"); +- } else { +- log.error(tree, "receiver.parameter.not.applicable.constructor.toplevel.class"); +- } +- } else { +- checkType(tree.vartype, m.owner.type, "incorrect.receiver.type"); +- checkType(tree.nameexpr, m.owner.type, "incorrect.receiver.name"); +- } +- } ++ if (TreeInfo.isReceiverParam(tree)) ++ checkReceiver(tree, localEnv); + } + } finally { + deferredLintHandler.setPos(prevLintPos); +@@ -714,6 +702,26 @@ + log.error(tree, diag, type, tree.type); + } + } ++ void checkReceiver(JCVariableDecl tree, Env<AttrContext> localEnv) { ++ attr.attribExpr(tree.nameexpr, localEnv); ++ MethodSymbol m = localEnv.enclMethod.sym; ++ if (m.isConstructor()) { ++ Type outertype = m.owner.owner.type; ++ if (outertype.hasTag(TypeTag.METHOD)) { ++ // we have a local inner class ++ outertype = m.owner.owner.owner.type; ++ } ++ if (outertype.hasTag(TypeTag.CLASS)) { ++ checkType(tree.vartype, outertype, "incorrect.constructor.receiver.type"); ++ checkType(tree.nameexpr, outertype, "incorrect.constructor.receiver.name"); ++ } else { ++ log.error(tree, "receiver.parameter.not.applicable.constructor.toplevel.class"); ++ } ++ } else { ++ checkType(tree.vartype, m.owner.type, "incorrect.receiver.type"); ++ checkType(tree.nameexpr, m.owner.type, "incorrect.receiver.name"); ++ } ++ } + + public boolean needsLazyConstValue(JCTree tree) { + InitTreeVisitor initTreeVisitor = new InitTreeVisitor(); +@@ -1018,7 +1026,7 @@ + + ClassSymbol c = (ClassSymbol)sym; + ClassType ct = (ClassType)c.type; +- Env<AttrContext> env = enter.typeEnvs.get(c); ++ Env<AttrContext> env = typeEnvs.get(c); + JCClassDecl tree = (JCClassDecl)env.tree; + boolean wasFirst = isFirst; + isFirst = false; +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -92,11 +92,10 @@ + TreeInfo treeinfo; + Types types; + JCDiagnostic.Factory diags; +- public final boolean boxingEnabled; // = source.allowBoxing(); +- public final boolean varargsEnabled; // = source.allowVarargs(); ++ public final boolean boxingEnabled; ++ public final boolean varargsEnabled; + public final boolean allowMethodHandles; +- public final boolean allowDefaultMethods; +- public final boolean allowStructuralMostSpecific; ++ public final boolean allowFunctionalInterfaceMostSpecific; + private final boolean debugResolve; + private final boolean compactMethodDiags; + final EnumSet<VerboseResolutionMode> verboseResolutionMode; +@@ -137,8 +136,7 @@ + verboseResolutionMode = VerboseResolutionMode.getVerboseResolutionMode(options); + Target target = Target.instance(context); + allowMethodHandles = target.hasMethodHandles(); +- allowDefaultMethods = source.allowDefaultMethods(); +- allowStructuralMostSpecific = source.allowStructuralMostSpecific(); ++ allowFunctionalInterfaceMostSpecific = source.allowFunctionalInterfaceMostSpecific(); + polymorphicSignatureScope = new Scope(syms.noSymbol); + + inapplicableMethodException = new InapplicableMethodException(diags); +@@ -350,7 +348,7 @@ + + boolean isAccessible(Env<AttrContext> env, Type t, boolean checkInner) { + return (t.hasTag(ARRAY)) +- ? isAccessible(env, types.upperBound(types.elemtype(t))) ++ ? isAccessible(env, types.cvarUpperBound(types.elemtype(t))) + : isAccessible(env, t.tsym, checkInner); + } + +@@ -567,7 +565,7 @@ + tvars, + (MethodType)mt, + resultInfo, +- m, ++ (MethodSymbol)m, + argtypes, + allowBoxing, + useVarargs, +@@ -775,6 +773,7 @@ + public MethodCheck mostSpecificCheck(List<Type> actuals, boolean strict) { + return nilMethodCheck; + } ++ + } + + /** +@@ -786,6 +785,11 @@ + void checkArg(DiagnosticPosition pos, boolean varargs, Type actual, Type formal, DeferredAttrContext deferredAttrContext, Warner warn) { + //do nothing - actual always compatible to formals + } ++ ++ @Override ++ public String toString() { ++ return "arityMethodCheck"; ++ } + }; + + List<Type> dummyArgs(int length) { +@@ -871,6 +875,11 @@ + public MethodCheck mostSpecificCheck(List<Type> actuals, boolean strict) { + return new MostSpecificCheck(strict, actuals); + } ++ ++ @Override ++ public String toString() { ++ return "resolveMethodCheck"; ++ } + }; + + /** +@@ -901,8 +910,10 @@ + + @Override + public boolean compatible(Type found, Type req, Warner warn) { +- found = pendingInferenceContext.asFree(found); +- req = infer.returnConstraintTarget(found, req); ++ found = pendingInferenceContext.asUndetVar(found); ++ if (found.hasTag(UNDETVAR) && req.isPrimitive()) { ++ req = types.boxedClass(req).type; ++ } + return super.compatible(found, req, warn); + } + +@@ -938,8 +949,8 @@ + + public boolean compatible(Type found, Type req, Warner warn) { + return strict ? +- types.isSubtypeUnchecked(found, deferredAttrContext.inferenceContext.asFree(req), warn) : +- types.isConvertible(found, deferredAttrContext.inferenceContext.asFree(req), warn); ++ types.isSubtypeUnchecked(found, deferredAttrContext.inferenceContext.asUndetVar(req), warn) : ++ types.isConvertible(found, deferredAttrContext.inferenceContext.asUndetVar(req), warn); + } + + public void report(DiagnosticPosition pos, JCDiagnostic details) { +@@ -957,6 +968,12 @@ + public DeferredAttrContext deferredAttrContext() { + return deferredAttrContext; + } ++ ++ @Override ++ public String toString() { ++ return "MethodReferenceCheck"; ++ } ++ + } + + /** +@@ -975,7 +992,12 @@ + DeferredType dt = (DeferredType)found; + return dt.check(this); + } else { +- return super.check(pos, chk.checkNonVoid(pos, types.capture(U(found.baseType())))); ++ Type uResult = U(found.baseType()); ++ Type capturedType = pos == null || pos.getTree() == null ? ++ types.capture(uResult) : ++ checkContext.inferenceContext() ++ .cachedCapture(pos.getTree(), uResult, true); ++ return super.check(pos, chk.checkNonVoid(pos, capturedType)); + } + } + +@@ -989,7 +1011,7 @@ + */ + private Type U(Type found) { + return found == pt ? +- found : types.upperBound(found); ++ found : types.cvarUpperBound(found); + } + + @Override +@@ -1059,50 +1081,47 @@ + } + + public boolean compatible(Type found, Type req, Warner warn) { +- if (!allowStructuralMostSpecific || actual == null) { +- return super.compatible(found, req, warn); +- } else { +- switch (actual.getTag()) { +- case DEFERRED: +- DeferredType dt = (DeferredType) actual; +- DeferredType.SpeculativeCache.Entry e = dt.speculativeCache.get(deferredAttrContext.msym, deferredAttrContext.phase); +- return (e == null || e.speculativeTree == deferredAttr.stuckTree) +- ? super.compatible(found, req, warn) : +- mostSpecific(found, req, e.speculativeTree, warn); +- default: +- return standaloneMostSpecific(found, req, actual, warn); ++ if (allowFunctionalInterfaceMostSpecific && ++ unrelatedFunctionalInterfaces(found, req) && ++ (actual != null && actual.getTag() == DEFERRED)) { ++ DeferredType dt = (DeferredType) actual; ++ DeferredType.SpeculativeCache.Entry e = ++ dt.speculativeCache.get(deferredAttrContext.msym, deferredAttrContext.phase); ++ if (e != null && e.speculativeTree != deferredAttr.stuckTree) { ++ return functionalInterfaceMostSpecific(found, req, e.speculativeTree, warn); + } + } ++ return super.compatible(found, req, warn); + } + +- private boolean mostSpecific(Type t, Type s, JCTree tree, Warner warn) { +- MostSpecificChecker msc = new MostSpecificChecker(t, s, warn); ++ /** Whether {@code t} and {@code s} are unrelated functional interface types. */ ++ private boolean unrelatedFunctionalInterfaces(Type t, Type s) { ++ return types.isFunctionalInterface(t.tsym) && ++ types.isFunctionalInterface(s.tsym) && ++ types.asSuper(t, s.tsym) == null && ++ types.asSuper(s, t.tsym) == null; ++ } ++ ++ /** Parameters {@code t} and {@code s} are unrelated functional interface types. */ ++ private boolean functionalInterfaceMostSpecific(Type t, Type s, JCTree tree, Warner warn) { ++ FunctionalInterfaceMostSpecificChecker msc = new FunctionalInterfaceMostSpecificChecker(t, s, warn); + msc.scan(tree); + return msc.result; + } + +- boolean polyMostSpecific(Type t1, Type t2, Warner warn) { +- return (!t1.isPrimitive() && t2.isPrimitive()) +- ? true : super.compatible(t1, t2, warn); +- } +- +- boolean standaloneMostSpecific(Type t1, Type t2, Type exprType, Warner warn) { +- return (exprType.isPrimitive() == t1.isPrimitive() +- && exprType.isPrimitive() != t2.isPrimitive()) +- ? true : super.compatible(t1, t2, warn); +- } +- + /** +- * Structural checker for most specific. ++ * Tests whether one functional interface type can be considered more specific ++ * than another unrelated functional interface type for the scanned expression. + */ +- class MostSpecificChecker extends DeferredAttr.PolyScanner { ++ class FunctionalInterfaceMostSpecificChecker extends DeferredAttr.PolyScanner { + + final Type t; + final Type s; + final Warner warn; + boolean result; + +- MostSpecificChecker(Type t, Type s, Warner warn) { ++ /** Parameters {@code t} and {@code s} are unrelated functional interface types. */ ++ FunctionalInterfaceMostSpecificChecker(Type t, Type s, Warner warn) { + this.t = t; + this.s = s; + this.warn = warn; +@@ -1111,102 +1130,96 @@ + + @Override + void skip(JCTree tree) { +- result &= standaloneMostSpecific(t, s, tree.type, warn); ++ result &= false; + } + + @Override + public void visitConditional(JCConditional tree) { +- if (tree.polyKind == PolyKind.STANDALONE) { +- result &= standaloneMostSpecific(t, s, tree.type, warn); ++ scan(tree.truepart); ++ scan(tree.falsepart); ++ } ++ ++ @Override ++ public void visitReference(JCMemberReference tree) { ++ Type desc_t = types.findDescriptorType(t); ++ Type desc_s = types.findDescriptorType(s); ++ // use inference variables here for more-specific inference (18.5.4) ++ if (!types.isSameTypes(desc_t.getParameterTypes(), ++ inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { ++ result &= false; + } else { +- super.visitConditional(tree); ++ // compare return types ++ Type ret_t = desc_t.getReturnType(); ++ Type ret_s = desc_s.getReturnType(); ++ if (ret_s.hasTag(VOID)) { ++ result &= true; ++ } else if (ret_t.hasTag(VOID)) { ++ result &= false; ++ } else if (ret_t.isPrimitive() != ret_s.isPrimitive()) { ++ boolean retValIsPrimitive = ++ tree.refPolyKind == PolyKind.STANDALONE && ++ tree.sym.type.getReturnType().isPrimitive(); ++ result &= (retValIsPrimitive == ret_t.isPrimitive()) && ++ (retValIsPrimitive != ret_s.isPrimitive()); ++ } else { ++ result &= MostSpecificCheckContext.super.compatible(ret_t, ret_s, warn); ++ } + } + } + + @Override +- public void visitApply(JCMethodInvocation tree) { +- result &= (tree.polyKind == PolyKind.STANDALONE) +- ? standaloneMostSpecific(t, s, tree.type, warn) +- : polyMostSpecific(t, s, warn); +- } +- +- @Override +- public void visitNewClass(JCNewClass tree) { +- result &= (tree.polyKind == PolyKind.STANDALONE) +- ? standaloneMostSpecific(t, s, tree.type, warn) +- : polyMostSpecific(t, s, warn); +- } +- +- @Override +- public void visitReference(JCMemberReference tree) { +- if (types.isFunctionalInterface(t.tsym) && +- types.isFunctionalInterface(s.tsym)) { +- Type desc_t = types.findDescriptorType(t); +- Type desc_s = types.findDescriptorType(s); +- if (types.isSameTypes(desc_t.getParameterTypes(), +- inferenceContext().asFree(desc_s.getParameterTypes()))) { +- if (types.asSuper(t, s.tsym) != null || +- types.asSuper(s, t.tsym) != null) { +- result &= MostSpecificCheckContext.super.compatible(t, s, warn); +- } else if (!desc_s.getReturnType().hasTag(VOID)) { +- //perform structural comparison +- Type ret_t = desc_t.getReturnType(); +- Type ret_s = desc_s.getReturnType(); +- result &= ((tree.refPolyKind == PolyKind.STANDALONE) +- ? standaloneMostSpecific(ret_t, ret_s, tree.sym.type.getReturnType(), warn) +- : polyMostSpecific(ret_t, ret_s, warn)); +- } else { +- return; ++ public void visitLambda(JCLambda tree) { ++ Type desc_t = types.findDescriptorType(t); ++ Type desc_s = types.findDescriptorType(s); ++ // use inference variables here for more-specific inference (18.5.4) ++ if (!types.isSameTypes(desc_t.getParameterTypes(), ++ inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { ++ result &= false; ++ } else { ++ // compare return types ++ Type ret_t = desc_t.getReturnType(); ++ Type ret_s = desc_s.getReturnType(); ++ if (ret_s.hasTag(VOID)) { ++ result &= true; ++ } else if (ret_t.hasTag(VOID)) { ++ result &= false; ++ } else if (unrelatedFunctionalInterfaces(ret_t, ret_s)) { ++ for (JCExpression expr : lambdaResults(tree)) { ++ result &= functionalInterfaceMostSpecific(ret_t, ret_s, expr, warn); + } ++ } else if (ret_t.isPrimitive() != ret_s.isPrimitive()) { ++ for (JCExpression expr : lambdaResults(tree)) { ++ boolean retValIsPrimitive = expr.isStandalone() && expr.type.isPrimitive(); ++ result &= (retValIsPrimitive == ret_t.isPrimitive()) && ++ (retValIsPrimitive != ret_s.isPrimitive()); ++ } ++ } else { ++ result &= MostSpecificCheckContext.super.compatible(ret_t, ret_s, warn); + } +- } else { +- result &= false; +- } +- } +- +- @Override +- public void visitLambda(JCLambda tree) { +- if (types.isFunctionalInterface(t.tsym) && +- types.isFunctionalInterface(s.tsym)) { +- Type desc_t = types.findDescriptorType(t); +- Type desc_s = types.findDescriptorType(s); +- if (types.isSameTypes(desc_t.getParameterTypes(), +- inferenceContext().asFree(desc_s.getParameterTypes()))) { +- if (types.asSuper(t, s.tsym) != null || +- types.asSuper(s, t.tsym) != null) { +- result &= MostSpecificCheckContext.super.compatible(t, s, warn); +- } else if (!desc_s.getReturnType().hasTag(VOID)) { +- //perform structural comparison +- Type ret_t = desc_t.getReturnType(); +- Type ret_s = desc_s.getReturnType(); +- scanLambdaBody(tree, ret_t, ret_s); +- } else { +- return; +- } +- } +- } else { +- result &= false; + } + } + //where + +- void scanLambdaBody(JCLambda lambda, final Type t, final Type s) { ++ private List<JCExpression> lambdaResults(JCLambda lambda) { + if (lambda.getBodyKind() == JCTree.JCLambda.BodyKind.EXPRESSION) { +- result &= MostSpecificCheckContext.this.mostSpecific(t, s, lambda.body, warn); ++ return List.of((JCExpression) lambda.body); + } else { ++ final ListBuffer<JCExpression> buffer = new ListBuffer<>(); + DeferredAttr.LambdaReturnScanner lambdaScanner = + new DeferredAttr.LambdaReturnScanner() { + @Override + public void visitReturn(JCReturn tree) { + if (tree.expr != null) { +- result &= MostSpecificCheckContext.this.mostSpecific(t, s, tree.expr, warn); ++ buffer.append(tree.expr); + } + } + }; + lambdaScanner.scan(lambda.body); ++ return buffer.toList(); + } + } + } ++ + } + + public MethodCheck mostSpecificCheck(List<Type> actuals, boolean strict) { +@@ -1410,7 +1423,7 @@ + return bestSoFar; + } else if (useVarargs && (sym.flags() & VARARGS) == 0) { + return bestSoFar.kind >= ERRONEOUS ? +- new BadVarargsMethod((ResolveError)bestSoFar) : ++ new BadVarargsMethod((ResolveError)bestSoFar.baseSymbol()) : + bestSoFar; + } + Assert.check(sym.kind < AMBIGUOUS); +@@ -1502,14 +1515,22 @@ + if (m2SignatureMoreSpecific) return m2; + return ambiguityError(m1, m2); + case AMBIGUOUS: +- //check if m1 is more specific than all ambiguous methods in m2 ++ //compare m1 to ambiguous methods in m2 + AmbiguityError e = (AmbiguityError)m2.baseSymbol(); ++ boolean m1MoreSpecificThanAnyAmbiguous = true; ++ boolean allAmbiguousMoreSpecificThanM1 = true; + for (Symbol s : e.ambiguousSyms) { +- if (mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs) != m1) { +- return e.addAmbiguousSymbol(m1); +- } ++ Symbol moreSpecific = mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs); ++ m1MoreSpecificThanAnyAmbiguous &= moreSpecific == m1; ++ allAmbiguousMoreSpecificThanM1 &= moreSpecific == s; + } +- return m1; ++ if (m1MoreSpecificThanAnyAmbiguous) ++ return m1; ++ //if m1 is more specific than some ambiguous methods, but other ambiguous methods are ++ //more specific than m1, add it as a new ambiguous method: ++ if (!allAmbiguousMoreSpecificThanM1) ++ e.addAmbiguousSymbol(m1); ++ return e; + default: + throw new AssertionError(); + } +@@ -1527,7 +1548,7 @@ + currentResolutionContext.methodCheck = + prevResolutionContext.methodCheck.mostSpecificCheck(actuals, !allowBoxing); + Type mst = instantiate(env, site, m2, null, +- adjustArgs(types.lowerBounds(types.memberType(site, m1).getParameterTypes()), m1, maxLength, useVarargs), null, ++ adjustArgs(types.cvarLowerBounds(types.memberType(site, m1).getParameterTypes()), m1, maxLength, useVarargs), null, + allowBoxing, useVarargs, noteWarner); + return mst != null && + !noteWarner.hasLint(Lint.LintCategory.UNCHECKED); +@@ -1681,7 +1702,6 @@ + bestSoFar : methodNotFound; + + for (InterfaceLookupPhase iphase2 : InterfaceLookupPhase.values()) { +- if (iphase2 == InterfaceLookupPhase.DEFAULT_OK && !allowDefaultMethods) break; + //keep searching for abstract methods + for (Type itype : itypes[iphase2.ordinal()]) { + if (!itype.isInterface()) continue; //skip j.l.Object (included by Types.closure()) +@@ -1714,10 +1734,8 @@ + //from superinterfaces) + if ((s.flags() & (ABSTRACT | INTERFACE | ENUM)) != 0) { + return this; +- } else if (rs.allowDefaultMethods) { ++ } else { + return DEFAULT_OK; +- } else { +- return null; + } + } + }, +@@ -2173,7 +2191,7 @@ + List<Type> typeargtypes, + LogResolveHelper logResolveHelper) { + if (sym.kind >= AMBIGUOUS) { +- ResolveError errSym = (ResolveError)sym; ++ ResolveError errSym = (ResolveError)sym.baseSymbol(); + sym = errSym.access(name, qualified ? site.tsym : syms.noSymbol); + argtypes = logResolveHelper.getArgumentTypes(errSym, sym, name, argtypes); + if (logResolveHelper.resolveDiagnosticNeeded(site, argtypes, typeargtypes)) { +@@ -2562,7 +2580,7 @@ + sym = super.access(env, pos, location, sym); + } else { + final JCDiagnostic details = sym.kind == WRONG_MTH ? +- ((InapplicableSymbolError)sym).errCandidate().snd : ++ ((InapplicableSymbolError)sym.baseSymbol()).errCandidate().snd : + null; + sym = new InapplicableSymbolError(sym.kind, "diamondError", currentResolutionContext) { + @Override +@@ -2970,12 +2988,12 @@ + return true; + case WRONG_MTH: + InapplicableSymbolError errSym = +- (InapplicableSymbolError)s; ++ (InapplicableSymbolError)s.baseSymbol(); + return new Template(MethodCheckDiag.ARITY_MISMATCH.regex()) + .matches(errSym.errCandidate().snd); + case WRONG_MTHS: + InapplicableSymbolsError errSyms = +- (InapplicableSymbolsError)s; ++ (InapplicableSymbolsError)s.baseSymbol(); + return errSyms.filterCandidates(errSyms.mapCandidates()).isEmpty(); + case WRONG_STATICNESS: + return false; +@@ -3157,7 +3175,7 @@ + if (TreeInfo.isStaticSelector(referenceTree.expr, names) && + argtypes.nonEmpty() && + (argtypes.head.hasTag(NONE) || +- types.isSubtypeUnchecked(inferenceContext.asFree(argtypes.head), site))) { ++ types.isSubtypeUnchecked(inferenceContext.asUndetVar(argtypes.head), site))) { + return new UnboundMethodReferenceLookupHelper(referenceTree, name, + site, argtypes, typeargtypes, maxPhase); + } else { +@@ -3341,9 +3359,9 @@ + if ((env1.enclClass.sym.flags() & STATIC) != 0) staticOnly = true; + env1 = env1.outer; + } +- if (allowDefaultMethods && c.isInterface() && +- name == names._super && !isStatic(env) && +- types.isDirectSuperInterface(c, env.enclClass.sym)) { ++ if (c.isInterface() && ++ name == names._super && !isStatic(env) && ++ types.isDirectSuperInterface(c, env.enclClass.sym)) { + //this might be a default super call if one of the superinterfaces is 'c' + for (Type t : pruneInterfaces(env.enclClass.type)) { + if (t.tsym == c) { +@@ -4270,7 +4288,11 @@ + } + + DeferredAttrContext deferredAttrContext(Symbol sym, InferenceContext inferenceContext, ResultInfo pendingResult, Warner warn) { +- return deferredAttr.new DeferredAttrContext(attrMode, sym, step, inferenceContext, pendingResult != null ? pendingResult.checkContext.deferredAttrContext() : deferredAttr.emptyDeferredAttrContext, warn); ++ DeferredAttrContext parent = (pendingResult == null) ++ ? deferredAttr.emptyDeferredAttrContext ++ : pendingResult.checkContext.deferredAttrContext(); ++ return deferredAttr.new DeferredAttrContext(attrMode, sym, step, ++ inferenceContext, parent, warn); + } + + /** +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -835,6 +835,8 @@ + public void visitReference(JCMemberReference tree) { + tree.expr = translate(tree.expr, erasure(tree.expr.type)); + tree.type = erasure(tree.type); ++ if (tree.varargsElement != null) ++ tree.varargsElement = erasure(tree.varargsElement); + result = tree; + } + +@@ -965,10 +967,11 @@ + translateClass((ClassSymbol)st.tsym); + } + +- Env<AttrContext> myEnv = enter.typeEnvs.remove(c); +- if (myEnv == null) { ++ Env<AttrContext> myEnv = enter.getEnv(c); ++ if (myEnv == null || (c.flags_field & TYPE_TRANSLATED) != 0) { + return; + } ++ c.flags_field |= TYPE_TRANSLATED; + + /* The two assertions below are set for early detection of any attempt + * to translate a class that: +--- ./langtools/src/share/classes/com/sun/tools/javac/comp/TypeEnvs.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/src/share/classes/com/sun/tools/javac/comp/TypeEnvs.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.javac.comp; ++ ++import java.util.Collection; ++import java.util.HashMap; ++import com.sun.tools.javac.code.Symbol.TypeSymbol; ++import com.sun.tools.javac.util.Context; ++ ++/** This class contains the type environments used by Enter, MemberEnter, ++ * Attr, DeferredAttr, and Lower. ++ * ++ * <p><b>This is NOT part of any supported API. ++ * If you write code that depends on this, you do so at your own risk. ++ * This code and its internal interfaces are subject to change or ++ * deletion without notice.</b> ++ */ ++class TypeEnvs { ++ private static final long serialVersionUID = 571524752489954631L; ++ ++ protected static final Context.Key<TypeEnvs> typeEnvsKey = new Context.Key<>(); ++ public static TypeEnvs instance(Context context) { ++ TypeEnvs instance = context.get(typeEnvsKey); ++ if (instance == null) ++ instance = new TypeEnvs(context); ++ return instance; ++ } ++ ++ private HashMap<TypeSymbol,Env<AttrContext>> map; ++ protected TypeEnvs(Context context) { ++ map = new HashMap<>(); ++ context.put(typeEnvsKey, this); ++ } ++ ++ Env<AttrContext> get(TypeSymbol sym) { return map.get(sym); } ++ Env<AttrContext> put(TypeSymbol sym, Env<AttrContext> env) { return map.put(sym, env); } ++ Env<AttrContext> remove(TypeSymbol sym) { return map.remove(sym); } ++ Collection<Env<AttrContext>> values() { return map.values(); } ++ void clear() { map.clear(); } ++} +--- ./langtools/src/share/classes/com/sun/tools/javac/file/Locations.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/file/Locations.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 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 +@@ -51,6 +51,7 @@ + import com.sun.tools.javac.util.ListBuffer; + import com.sun.tools.javac.util.Log; + import com.sun.tools.javac.util.Options; ++import com.sun.tools.javac.util.StringUtils; + + import javax.tools.JavaFileManager; + import javax.tools.StandardJavaFileManager; +@@ -717,7 +718,7 @@ + + /** Is this the name of an archive file? */ + private boolean isArchive(File file) { +- String n = file.getName().toLowerCase(); ++ String n = StringUtils.toLowerCase(file.getName()); + return fsInfo.isFile(file) + && (n.endsWith(".jar") || n.endsWith(".zip")); + } +--- ./langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -116,10 +116,6 @@ + */ + boolean lintClassfile; + +- /** Switch: allow default methods +- */ +- boolean allowDefaultMethods; +- + /** Switch: preserve parameter names from the variable table. + */ + public boolean saveParameterNames; +@@ -307,7 +303,6 @@ + allowVarargs = source.allowVarargs(); + allowAnnotations = source.allowAnnotations(); + allowSimplifiedVarargs = source.allowSimplifiedVarargs(); +- allowDefaultMethods = source.allowDefaultMethods(); + + saveParameterNames = options.isSet("save-parameter-names"); + cacheCompletionFailure = options.isUnset("dev"); +@@ -517,14 +512,14 @@ + break; + case CONSTANT_Fieldref: { + ClassSymbol owner = readClassSymbol(getChar(index + 1)); +- NameAndType nt = (NameAndType)readPool(getChar(index + 3)); ++ NameAndType nt = readNameAndType(getChar(index + 3)); + poolObj[i] = new VarSymbol(0, nt.name, nt.uniqueType.type, owner); + break; + } + case CONSTANT_Methodref: + case CONSTANT_InterfaceMethodref: { + ClassSymbol owner = readClassSymbol(getChar(index + 1)); +- NameAndType nt = (NameAndType)readPool(getChar(index + 3)); ++ NameAndType nt = readNameAndType(getChar(index + 3)); + poolObj[i] = new MethodSymbol(0, nt.name, nt.uniqueType.type, owner); + break; + } +@@ -593,13 +588,34 @@ + /** Read class entry. + */ + ClassSymbol readClassSymbol(int i) { +- return (ClassSymbol) (readPool(i)); ++ Object obj = readPool(i); ++ if (obj != null && !(obj instanceof ClassSymbol)) ++ throw badClassFile("bad.const.pool.entry", ++ currentClassFile.toString(), ++ "CONSTANT_Class_info", i); ++ return (ClassSymbol)obj; + } + + /** Read name. + */ + Name readName(int i) { +- return (Name) (readPool(i)); ++ Object obj = readPool(i); ++ if (obj != null && !(obj instanceof Name)) ++ throw badClassFile("bad.const.pool.entry", ++ currentClassFile.toString(), ++ "CONSTANT_Utf8_info or CONSTANT_String_info", i); ++ return (Name)obj; ++ } ++ ++ /** Read name and type. ++ */ ++ NameAndType readNameAndType(int i) { ++ Object obj = readPool(i); ++ if (obj != null && !(obj instanceof NameAndType)) ++ throw badClassFile("bad.const.pool.entry", ++ currentClassFile.toString(), ++ "CONSTANT_NameAndType_info", i); ++ return (NameAndType)obj; + } + + /************************************************************************ +@@ -1250,7 +1266,7 @@ + sym.owner.members().remove(sym); + ClassSymbol self = (ClassSymbol)sym; + ClassSymbol c = readClassSymbol(nextChar()); +- NameAndType nt = (NameAndType)readPool(nextChar()); ++ NameAndType nt = readNameAndType(nextChar()); + + if (c.members_field == null) + throw badClassFile("bad.enclosing.class", self, c); +--- ./langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1038,7 +1038,7 @@ + } + databuf.appendChar(pool.get(inner)); + databuf.appendChar( +- inner.owner.kind == TYP ? pool.get(inner.owner) : 0); ++ inner.owner.kind == TYP && !inner.name.isEmpty() ? pool.get(inner.owner) : 0); + databuf.appendChar( + !inner.name.isEmpty() ? pool.get(inner.name) : 0); + databuf.appendChar(flags); +--- ./langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1925,6 +1925,13 @@ + return aliveRanges.isEmpty() ? null : aliveRanges.get(aliveRanges.size() - 1); + } + ++ void removeLastRange() { ++ Range lastRange = lastRange(); ++ if (lastRange != null) { ++ aliveRanges.remove(lastRange); ++ } ++ } ++ + @Override + public String toString() { + if (aliveRanges == null) { +@@ -1955,9 +1962,7 @@ + } + } + } else { +- if (!aliveRanges.isEmpty()) { +- aliveRanges.remove(aliveRanges.size() - 1); +- } ++ removeLastRange(); + } + } + +@@ -1965,16 +1970,14 @@ + if (aliveRanges.isEmpty()) { + return false; + } +- Range range = lastRange(); +- return range.length == Character.MAX_VALUE; ++ return lastRange().length == Character.MAX_VALUE; + } + + public boolean isLastRangeInitialized() { + if (aliveRanges.isEmpty()) { + return false; + } +- Range range = lastRange(); +- return range.start_pc != Character.MAX_VALUE; ++ return lastRange().start_pc != Character.MAX_VALUE; + } + + public Range getWidestRange() { +@@ -2095,7 +2098,7 @@ + v.closeRange(length); + putVar(v); + } else { +- v.lastRange().start_pc = Character.MAX_VALUE; ++ v.removeLastRange(); + } + } + } +@@ -2189,9 +2192,9 @@ + // Keep local variables if + // 1) we need them for debug information + // 2) it is an exception type and it contains type annotations +- if (!varDebugInfo && +- (!var.sym.isExceptionParameter() || +- var.sym.hasTypeAnnotations())) return; ++ boolean keepLocalVariables = varDebugInfo || ++ (var.sym.isExceptionParameter() && var.sym.hasTypeAnnotations()); ++ if (!keepLocalVariables) return; + if ((var.sym.flags() & Flags.SYNTHETIC) != 0) return; + if (varBuffer == null) + varBuffer = new LocalVar[20]; +--- ./langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1811,8 +1811,7 @@ + genStat(tree.thenpart, env, CRT_STATEMENT | CRT_FLOW_TARGET); + thenExit = code.branch(goto_); + if (varDebugInfo && lvtRanges.containsKey(code.meth, tree.thenpart)) { +- code.closeAliveRanges(tree.thenpart, +- thenExit != null && tree.elsepart == null ? thenExit.pc : code.cp); ++ code.closeAliveRanges(tree.thenpart, code.cp); + } + } + if (elseChain != null) { +@@ -2818,7 +2817,7 @@ + } + + private LVTAssignAnalyzer(LVTRanges lvtRanges, Symtab syms, Names names) { +- super(new LVTBits(), syms, names); ++ super(new LVTBits(), syms, names, false); + lvtInits = (LVTBits)inits; + this.lvtRanges = lvtRanges; + } +--- ./langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Wed Jul 30 03:55:11 2014 -0700 +@@ -35,9 +35,6 @@ + import java.util.Queue; + import java.util.ResourceBundle; + import java.util.Set; +-import java.util.logging.Handler; +-import java.util.logging.Level; +-import java.util.logging.Logger; + + import javax.annotation.processing.Processor; + import javax.lang.model.SourceVersion; +@@ -1304,11 +1301,16 @@ + * Perform dataflow checks on an attributed parse tree. + */ + protected void flow(Env<AttrContext> env, Queue<Env<AttrContext>> results) { ++ if (compileStates.isDone(env, CompileState.FLOW)) { ++ results.add(env); ++ return; ++ } ++ + try { + if (shouldStop(CompileState.FLOW)) + return; + +- if (relax || compileStates.isDone(env, CompileState.FLOW)) { ++ if (relax) { + results.add(env); + return; + } +--- ./langtools/src/share/classes/com/sun/tools/javac/main/Option.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/main/Option.java Wed Jul 30 03:55:11 2014 -0700 +@@ -47,6 +47,7 @@ + import com.sun.tools.javac.util.Log.PrefixKind; + import com.sun.tools.javac.util.Log.WriterKind; + import com.sun.tools.javac.util.Options; ++import com.sun.tools.javac.util.StringUtils; + import static com.sun.tools.javac.main.Option.ChoiceKind.*; + import static com.sun.tools.javac.main.Option.OptionGroup.*; + import static com.sun.tools.javac.main.Option.OptionKind.*; +@@ -713,7 +714,7 @@ + String v = options.get(XPKGINFO); + return (v == null + ? PkgInfo.LEGACY +- : PkgInfo.valueOf(v.toUpperCase())); ++ : PkgInfo.valueOf(StringUtils.toUpperCase(v))); + } + } + +--- ./langtools/src/share/classes/com/sun/tools/javac/parser/DocCommentParser.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/parser/DocCommentParser.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -57,6 +57,7 @@ + import com.sun.tools.javac.util.Names; + import com.sun.tools.javac.util.Options; + import com.sun.tools.javac.util.Position; ++import com.sun.tools.javac.util.StringUtils; + import static com.sun.tools.javac.util.LayoutCharacters.*; + + /** +@@ -993,7 +994,7 @@ + "h1", "h2", "h3", "h4", "h5", "h6", "p", "pre")); + + protected boolean isSentenceBreak(Name n) { +- return htmlBlockTags.contains(n.toString().toLowerCase()); ++ return htmlBlockTags.contains(StringUtils.toLowerCase(n.toString())); + } + + protected boolean isSentenceBreak(DCTree t) { +@@ -1172,8 +1173,10 @@ + DCText string = quotedString(); + if (string != null) { + skipWhitespace(); +- if (ch == '@') ++ if (ch == '@' ++ || ch == EOI && bp == buf.length - 1) { + return m.at(pos).See(List.<DCTree>of(string)); ++ } + } + break; + +--- ./langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Wed Jul 30 03:55:11 2014 -0700 +@@ -161,6 +161,7 @@ + this.allowStaticInterfaceMethods = source.allowStaticInterfaceMethods(); + this.allowIntersectionTypesInCast = source.allowIntersectionTypesInCast(); + this.allowTypeAnnotations = source.allowTypeAnnotations(); ++ this.allowAnnotationsAfterTypeParams = source.allowAnnotationsAfterTypeParams(); + this.keepDocComments = keepDocComments; + docComments = newDocCommentTable(keepDocComments, fac); + this.keepLineMap = keepLineMap; +@@ -254,6 +255,10 @@ + */ + boolean allowTypeAnnotations; + ++ /** Switch: should we allow annotations after the method type parameters? ++ */ ++ boolean allowAnnotationsAfterTypeParams; ++ + /** Switch: is "this" allowed as an identifier? + * This is needed to parse receiver types. + */ +@@ -2020,7 +2025,7 @@ + /** Creator = [Annotations] Qualident [TypeArguments] ( ArrayCreatorRest | ClassCreatorRest ) + */ + JCExpression creator(int newpos, List<JCExpression> typeArgs) { +- List<JCAnnotation> newAnnotations = annotationsOpt(Tag.ANNOTATION); ++ List<JCAnnotation> newAnnotations = typeAnnotationsOpt(); + + switch (token.kind) { + case BYTE: case SHORT: case CHAR: case INT: case LONG: case FLOAT: +@@ -3401,16 +3406,28 @@ + * | ModifiersOpt + * ( Type Ident + * ( VariableDeclaratorsRest ";" | MethodDeclaratorRest ) +- * | VOID Ident MethodDeclaratorRest +- * | TypeParameters (Type | VOID) Ident MethodDeclaratorRest ++ * | VOID Ident VoidMethodDeclaratorRest ++ * | TypeParameters [Annotations] ++ * ( Type Ident MethodDeclaratorRest ++ * | VOID Ident VoidMethodDeclaratorRest ++ * ) + * | Ident ConstructorDeclaratorRest + * | TypeParameters Ident ConstructorDeclaratorRest + * | ClassOrInterfaceOrEnumDeclaration + * ) + * InterfaceBodyDeclaration = + * ";" +- * | ModifiersOpt Type Ident +- * ( ConstantDeclaratorsRest | InterfaceMethodDeclaratorRest ";" ) ++ * | ModifiersOpt ++ * ( Type Ident ++ * ( ConstantDeclaratorsRest ";" | MethodDeclaratorRest ) ++ * | VOID Ident MethodDeclaratorRest ++ * | TypeParameters [Annotations] ++ * ( Type Ident MethodDeclaratorRest ++ * | VOID Ident VoidMethodDeclaratorRest ++ * ) ++ * | ClassOrInterfaceOrEnumDeclaration ++ * ) ++ * + */ + protected List<JCTree> classOrInterfaceBodyDeclaration(Name className, boolean isInterface) { + if (token.kind == SEMI) { +@@ -3439,27 +3456,29 @@ + } + List<JCAnnotation> annosAfterParams = annotationsOpt(Tag.ANNOTATION); + ++ if (annosAfterParams.nonEmpty()) { ++ checkAnnotationsAfterTypeParams(annosAfterParams.head.pos); ++ mods.annotations = mods.annotations.appendList(annosAfterParams); ++ if (mods.pos == Position.NOPOS) ++ mods.pos = mods.annotations.head.pos; ++ } ++ + Token tk = token; + pos = token.pos; + JCExpression type; + boolean isVoid = token.kind == VOID; + if (isVoid) { +- if (annosAfterParams.nonEmpty()) +- illegal(annosAfterParams.head.pos); + type = to(F.at(pos).TypeIdent(TypeTag.VOID)); + nextToken(); + } else { +- if (annosAfterParams.nonEmpty()) { +- mods.annotations = mods.annotations.appendList(annosAfterParams); +- if (mods.pos == Position.NOPOS) +- mods.pos = mods.annotations.head.pos; +- } + // method returns types are un-annotated types + type = unannotatedType(); + } + if (token.kind == LPAREN && !isInterface && type.hasTag(IDENT)) { + if (isInterface || tk.name() != className) + error(pos, "invalid.meth.decl.ret.type.req"); ++ else if (annosAfterParams.nonEmpty()) ++ illegal(annosAfterParams.head.pos); + return List.of(methodDeclaratorRest( + pos, mods, null, names.init, typarams, + isInterface, true, dc)); +@@ -3491,13 +3510,9 @@ + } + + /** MethodDeclaratorRest = +- * FormalParameters BracketsOpt [Throws TypeList] ( MethodBody | [DEFAULT AnnotationValue] ";") ++ * FormalParameters BracketsOpt [THROWS TypeList] ( MethodBody | [DEFAULT AnnotationValue] ";") + * VoidMethodDeclaratorRest = +- * FormalParameters [Throws TypeList] ( MethodBody | ";") +- * InterfaceMethodDeclaratorRest = +- * FormalParameters BracketsOpt [THROWS TypeList] ";" +- * VoidInterfaceMethodDeclaratorRest = +- * FormalParameters [THROWS TypeList] ";" ++ * FormalParameters [THROWS TypeList] ( MethodBody | ";") + * ConstructorDeclaratorRest = + * "(" FormalParameterListOpt ")" [THROWS TypeList] MethodBody + */ +@@ -4041,21 +4056,28 @@ + allowTypeAnnotations = true; + } + } ++ void checkAnnotationsAfterTypeParams(int pos) { ++ if (!allowAnnotationsAfterTypeParams) { ++ log.error(pos, "annotations.after.type.params.not.supported.in.source", source.name); ++ allowAnnotationsAfterTypeParams = true; ++ } ++ } + + /* + * a functional source tree and end position mappings + */ + protected static class SimpleEndPosTable extends AbstractEndPosTable { + +- private final Map<JCTree, Integer> endPosMap; ++ private final IntHashTable endPosMap; + + SimpleEndPosTable(JavacParser parser) { + super(parser); +- endPosMap = new HashMap<JCTree, Integer>(); ++ endPosMap = new IntHashTable(); + } + + public void storeEnd(JCTree tree, int endpos) { +- endPosMap.put(tree, errorEndPos > endpos ? errorEndPos : endpos); ++ endPosMap.putAtIndex(tree, errorEndPos > endpos ? errorEndPos : endpos, ++ endPosMap.lookup(tree)); + } + + protected <T extends JCTree> T to(T t) { +@@ -4069,14 +4091,15 @@ + } + + public int getEndPos(JCTree tree) { +- Integer value = endPosMap.get(tree); +- return (value == null) ? Position.NOPOS : value; ++ int value = endPosMap.getFromIndex(endPosMap.lookup(tree)); ++ // As long as Position.NOPOS==-1, this just returns value. ++ return (value == -1) ? Position.NOPOS : value; + } + + public int replaceTree(JCTree oldTree, JCTree newTree) { +- Integer pos = endPosMap.remove(oldTree); +- if (pos != null) { +- endPosMap.put(newTree, pos); ++ int pos = endPosMap.remove(oldTree); ++ if (pos != -1) { ++ storeEnd(newTree, pos); + return pos; + } + return Position.NOPOS; +--- ./langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Wed Jul 30 03:55:11 2014 -0700 +@@ -762,14 +762,14 @@ + public Set<TypeElement> visitType(TypeElement e, Set<TypeElement> p) { + // Type parameters are not considered to be enclosed by a type + scan(e.getTypeParameters(), p); +- return scan(e.getEnclosedElements(), p); ++ return super.visitType(e, p); + } + + @Override + public Set<TypeElement> visitExecutable(ExecutableElement e, Set<TypeElement> p) { + // Type parameters are not considered to be enclosed by an executable + scan(e.getTypeParameters(), p); +- return scan(e.getEnclosedElements(), p); ++ return super.visitExecutable(e, p); + } + + void addAnnotations(Element e, Set<TypeElement> p) { +--- ./langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -26,11 +26,8 @@ + package com.sun.tools.javac.processing; + + import java.lang.annotation.Annotation; +-import com.sun.tools.javac.tree.JCTree.*; + import javax.annotation.processing.*; + import javax.lang.model.element.*; +-import javax.lang.model.type.DeclaredType; +-import javax.lang.model.type.TypeMirror; + import javax.lang.model.util.*; + import java.util.*; + +@@ -114,58 +111,48 @@ + */ + public Set<? extends Element> getElementsAnnotatedWith(TypeElement a) { + Set<Element> result = Collections.emptySet(); +- Types typeUtil = processingEnv.getTypeUtils(); + if (a.getKind() != ElementKind.ANNOTATION_TYPE) + throw new IllegalArgumentException(NOT_AN_ANNOTATION_TYPE + a); + +- DeclaredType annotationTypeElement; +- TypeMirror tm = a.asType(); +- if ( tm instanceof DeclaredType ) +- annotationTypeElement = (DeclaredType) a.asType(); +- else +- throw new AssertionError("Bad implementation type for " + tm); +- +- ElementScanner8<Set<Element>, DeclaredType> scanner = +- new AnnotationSetScanner(result, typeUtil); ++ ElementScanner8<Set<Element>, TypeElement> scanner = ++ new AnnotationSetScanner(result); + + for (Element element : rootElements) +- result = scanner.scan(element, annotationTypeElement); ++ result = scanner.scan(element, a); + + return result; + } + + // Could be written as a local class inside getElementsAnnotatedWith + private class AnnotationSetScanner extends +- ElementScanner8<Set<Element>, DeclaredType> { ++ ElementScanner8<Set<Element>, TypeElement> { + // Insertion-order preserving set + Set<Element> annotatedElements = new LinkedHashSet<Element>(); +- Types typeUtil; + +- AnnotationSetScanner(Set<Element> defaultSet, Types typeUtil) { ++ AnnotationSetScanner(Set<Element> defaultSet) { + super(defaultSet); +- this.typeUtil = typeUtil; + } + + @Override +- public Set<Element> visitType(TypeElement e, DeclaredType p) { ++ public Set<Element> visitType(TypeElement e, TypeElement p) { + // Type parameters are not considered to be enclosed by a type + scan(e.getTypeParameters(), p); +- return scan(e.getEnclosedElements(), p); ++ return super.visitType(e, p); + } + + @Override +- public Set<Element> visitExecutable(ExecutableElement e, DeclaredType p) { ++ public Set<Element> visitExecutable(ExecutableElement e, TypeElement p) { + // Type parameters are not considered to be enclosed by an executable + scan(e.getTypeParameters(), p); +- return scan(e.getEnclosedElements(), p); ++ return super.visitExecutable(e, p); + } + + @Override +- public Set<Element> scan(Element e, DeclaredType p) { ++ public Set<Element> scan(Element e, TypeElement p) { + java.util.List<? extends AnnotationMirror> annotationMirrors = + processingEnv.getElementUtils().getAllAnnotationMirrors(e); + for (AnnotationMirror annotationMirror : annotationMirrors) { +- if (typeUtil.isSameType(annotationMirror.getAnnotationType(), p)) ++ if (p.equals(annotationMirror.getAnnotationType().asElement())) + annotatedElements.add(e); + } + e.accept(this, p); +--- ./langtools/src/share/classes/com/sun/tools/javac/processing/PrintingProcessor.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/processing/PrintingProcessor.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. ++ * 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 +@@ -36,6 +36,7 @@ + import java.io.PrintWriter; + import java.io.Writer; + import java.util.*; ++import com.sun.tools.javac.util.StringUtils; + + /** + * A processor which prints out elements. Used to implement the +@@ -202,7 +203,7 @@ + writer.print("@interface"); + break; + default: +- writer.print(kind.toString().toLowerCase()); ++ writer.print(StringUtils.toLowerCase(kind.toString())); + } + writer.print(" "); + writer.print(e.getSimpleName()); +--- ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -123,6 +123,9 @@ + compiler.err.anon.class.impl.intf.no.qual.for.new=\ + anonymous class implements interface; cannot have qualifier for new + ++compiler.err.cant.inherit.from.anon=\ ++ cannot inherit from anonymous class ++ + # 0: symbol, 1: symbol, 2: symbol + compiler.err.array.and.varargs=\ + cannot declare both {0} and {1} in {2} +@@ -732,6 +735,9 @@ + bad return type in method reference\n\ + {0} + ++compiler.err.lambda.body.neither.value.nor.void.compatible=\ ++ lambda body is neither value nor void compatible ++ + # 0: list of type + compiler.err.incompatible.thrown.types.in.mref=\ + incompatible thrown types {0} in method reference +@@ -1611,6 +1617,10 @@ + compiler.warn.varargs.redundant.trustme.anno=\ + Redundant {0} annotation. {1} + ++# 0: symbol ++compiler.warn.access.to.sensitive.member.from.serializable.element=\ ++ access to sensitive member {0} from serializable element can be publicly accessible to untrusted code ++ + ##### + + ## The following are tokens which are non-terminals in the language. They should +@@ -1699,6 +1709,11 @@ + cannot access {0}\n\ + {1} + ++# 0: file name, 1: expected CP entry type, 2: constant pool index ++compiler.misc.bad.const.pool.entry=\ ++ bad constant pool entry in {0}\n\ ++ expected {1} at index {2} ++ + # 0: file name, 1: message segment + compiler.misc.bad.class.file.header=\ + bad class file: {0}\n\ +@@ -2311,6 +2326,11 @@ + (use -source 8 or higher to enable type annotations) + + # 0: string ++compiler.err.annotations.after.type.params.not.supported.in.source=\ ++ annotations after method type parameters are not supported in -source {0}\n\ ++(use -source 8 or higher to enable annotations after method type parameters) ++ ++# 0: string + compiler.err.repeatable.annotations.not.supported.in.source=\ + repeated annotations are not supported in -source {0}\n\ + (use -source 8 or higher to enable repeated annotations) +@@ -2370,6 +2390,11 @@ + static interface methods are not supported in -source {0}\n\ + (use -source 8 or higher to enable static interface methods) + ++# 0: string ++compiler.err.static.intf.method.invoke.not.supported.in.source=\ ++ static interface method invocations are not supported in -source {0}\n\ ++ (use -source 8 or higher to enable static interface method invocations) ++ + ######################################## + # Diagnostics for verbose resolution + # used by Resolve (debug only) +--- ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -98,11 +98,13 @@ + + compiler.err.annotation.value.not.allowable.type=\u4F7F\u7528\u3067\u304D\u306A\u3044\u578B\u306E\u6CE8\u91C8\u306E\u5024\u3067\u3059 + +-compiler.err.anon.class.impl.intf.no.args=\u540D\u524D\u306E\u306A\u3044\u30AF\u30E9\u30B9\u304C\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u5B9F\u88C5\u3057\u3066\u3044\u307E\u3059\u3002\u5F15\u6570\u3092\u6301\u3064\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 +- +-compiler.err.anon.class.impl.intf.no.typeargs=\u540D\u524D\u306E\u306A\u3044\u30AF\u30E9\u30B9\u304C\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u5B9F\u88C5\u3057\u3066\u3044\u307E\u3059\u3002\u578B\u5F15\u6570\u3092\u6301\u3064\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 +- +-compiler.err.anon.class.impl.intf.no.qual.for.new=\u540D\u524D\u306E\u306A\u3044\u30AF\u30E9\u30B9\u304C\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u5B9F\u88C5\u3057\u3066\u3044\u307E\u3059\u3002new\u306B\u4FEE\u98FE\u5B50\u3092\u6301\u3064\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 ++compiler.err.anon.class.impl.intf.no.args=\u533F\u540D\u30AF\u30E9\u30B9\u304C\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u5B9F\u88C5\u3057\u3066\u3044\u307E\u3059\u3002\u5F15\u6570\u3092\u6301\u3064\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 ++ ++compiler.err.anon.class.impl.intf.no.typeargs=\u533F\u540D\u30AF\u30E9\u30B9\u304C\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u5B9F\u88C5\u3057\u3066\u3044\u307E\u3059\u3002\u578B\u5F15\u6570\u3092\u6301\u3064\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 ++ ++compiler.err.anon.class.impl.intf.no.qual.for.new=\u533F\u540D\u30AF\u30E9\u30B9\u304C\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u5B9F\u88C5\u3057\u3066\u3044\u307E\u3059\u3002new\u306B\u4FEE\u98FE\u5B50\u3092\u6301\u3064\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002 ++ ++compiler.err.cant.inherit.from.anon=\u533F\u540D\u30AF\u30E9\u30B9\u304B\u3089\u7D99\u627F\u3067\u304D\u307E\u305B\u3093 + + # 0: symbol, 1: symbol, 2: symbol + compiler.err.array.and.varargs={2}\u3067{0}\u3068{1}\u306E\u4E21\u65B9\u3092\u5BA3\u8A00\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093 +@@ -525,6 +527,8 @@ + # 0: type + compiler.misc.incompatible.ret.type.in.mref=\u30E1\u30BD\u30C3\u30C9\u53C2\u7167\u306E\u623B\u308A\u578B\u304C\u4E0D\u6B63\u3067\u3059\n{0} + ++compiler.err.lambda.body.neither.value.nor.void.compatible=\u30E9\u30E0\u30C0\u30FB\u30DC\u30C7\u30A3\u306F\u5024\u4E92\u63DB\u3067\u3082void\u4E92\u63DB\u3067\u3082\u3042\u308A\u307E\u305B\u3093 ++ + # 0: list of type + compiler.err.incompatible.thrown.types.in.mref=\u30E1\u30BD\u30C3\u30C9\u53C2\u7167\u306E\u30B9\u30ED\u30FC\u3055\u308C\u305F\u30BF\u30A4\u30D7{0}\u306F\u4E0D\u9069\u5408\u3067\u3059 + +@@ -1150,6 +1154,9 @@ + # 0: symbol, 1: message segment + compiler.warn.varargs.redundant.trustme.anno={0}\u6CE8\u91C8\u304C\u5197\u9577\u3067\u3059\u3002{1} + ++# 0: symbol ++compiler.warn.access.to.sensitive.member.from.serializable.element=\u76F4\u5217\u5316\u53EF\u80FD\u8981\u7D20\u304B\u3089\u6A5F\u5BC6\u30E1\u30F3\u30D0\u30FC{0}\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u306F\u3001\u4FE1\u983C\u3067\u304D\u306A\u3044\u30B3\u30FC\u30C9\u304B\u3089\u30D1\u30D6\u30EA\u30C3\u30AF\u306B\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u3067\u3042\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059 ++ + ##### + + ## The following are tokens which are non-terminals in the language. They should +@@ -1216,6 +1223,9 @@ + # 0: symbol, 1: message segment + compiler.err.cant.access={0}\u306B\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u307E\u305B\u3093\n{1} + ++# 0: file name, 1: expected CP entry type, 2: constant pool index ++compiler.misc.bad.const.pool.entry={0}\u306E\u5B9A\u6570\u30D7\u30FC\u30EB\u30FB\u30A8\u30F3\u30C8\u30EA\u304C\u4E0D\u6B63\u3067\u3059\n\u7D22\u5F15{2}\u3067\u306F{1}\u304C\u5FC5\u8981\u3067\u3059 ++ + # 0: file name, 1: message segment + compiler.misc.bad.class.file.header=\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB{0}\u306F\u4E0D\u6B63\u3067\u3059\n{1}\n\u524A\u9664\u3059\u308B\u304B\u3001\u30AF\u30E9\u30B9\u30D1\u30B9\u306E\u6B63\u3057\u3044\u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u3042\u308B\u304B\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + +@@ -1629,6 +1639,9 @@ + compiler.err.type.annotations.not.supported.in.source=\u30BF\u30A4\u30D7\u6CE8\u91C8\u306F-source {0}\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n(\u30BF\u30A4\u30D7\u6CE8\u91C8\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u306B\u306F\u3001-source 8\u4EE5\u4E0A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044) + + # 0: string ++compiler.err.annotations.after.type.params.not.supported.in.source=\u30E1\u30BD\u30C3\u30C9\u30FB\u30BF\u30A4\u30D7\u30FB\u30D1\u30E9\u30E1\u30FC\u30BF\u306E\u5F8C\u306E\u6CE8\u91C8\u306F-source {0}\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n(\u30E1\u30BD\u30C3\u30C9\u30FB\u30BF\u30A4\u30D7\u30FB\u30D1\u30E9\u30E1\u30FC\u30BF\u306E\u5F8C\u306E\u6CE8\u91C8\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u306B\u306F\u3001-source 8\u4EE5\u4E0A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044) ++ ++# 0: string + compiler.err.repeatable.annotations.not.supported.in.source=\u7E70\u8FD4\u3057\u6CE8\u91C8\u306F-source {0}\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n(\u7E70\u8FD4\u3057\u6CE8\u91C8\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u306B\u306F\u3001-source 8\u4EE5\u4E0A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044) + + # 0: string +--- ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -104,6 +104,8 @@ + + compiler.err.anon.class.impl.intf.no.qual.for.new=\u533F\u540D\u7C7B\u5B9E\u73B0\u63A5\u53E3; \u4E0D\u80FD\u6709\u9650\u5B9A\u7B26 - \u5BF9\u4E8E\u65B0 + ++compiler.err.cant.inherit.from.anon=\u65E0\u6CD5\u4ECE\u533F\u540D\u7C7B\u7EE7\u627F ++ + # 0: symbol, 1: symbol, 2: symbol + compiler.err.array.and.varargs=\u65E0\u6CD5\u5728{2}\u4E2D\u540C\u65F6\u58F0\u660E{0}\u548C{1} + +@@ -525,6 +527,8 @@ + # 0: type + compiler.misc.incompatible.ret.type.in.mref=\u65B9\u6CD5\u5F15\u7528\u4E2D\u7684\u8FD4\u56DE\u7C7B\u578B\u9519\u8BEF\n{0} + ++compiler.err.lambda.body.neither.value.nor.void.compatible=lambda \u4E3B\u4F53\u4E0D\u662F\u503C, \u4E5F\u4E0D\u4E0E void \u517C\u5BB9 ++ + # 0: list of type + compiler.err.incompatible.thrown.types.in.mref=\u65B9\u6CD5\u5F15\u7528\u4E2D\u629B\u51FA\u7684\u7C7B\u578B{0}\u4E0D\u517C\u5BB9 + +@@ -1150,6 +1154,9 @@ + # 0: symbol, 1: message segment + compiler.warn.varargs.redundant.trustme.anno=\u5197\u4F59\u7684 {0} \u6CE8\u91CA\u3002{1} + ++# 0: symbol ++compiler.warn.access.to.sensitive.member.from.serializable.element=\u53EF\u4E32\u884C\u5316\u5143\u7D20\u5BF9\u654F\u611F\u6210\u5458 {0} \u7684\u8BBF\u95EE\u53EF\u4EE5\u7531\u4E0D\u53D7\u4FE1\u4EFB\u7684\u4EE3\u7801\u516C\u5F00\u6267\u884C ++ + ##### + + ## The following are tokens which are non-terminals in the language. They should +@@ -1216,6 +1223,9 @@ + # 0: symbol, 1: message segment + compiler.err.cant.access=\u65E0\u6CD5\u8BBF\u95EE{0}\n{1} + ++# 0: file name, 1: expected CP entry type, 2: constant pool index ++compiler.misc.bad.const.pool.entry={0} \u4E2D\u9519\u8BEF\u7684\u5E38\u91CF\u6C60\u6761\u76EE\n\u9884\u671F\u4E3A\u7D22\u5F15 {2} \u5904\u7684 {1} ++ + # 0: file name, 1: message segment + compiler.misc.bad.class.file.header=\u9519\u8BEF\u7684\u7C7B\u6587\u4EF6: {0}\n{1}\n\u8BF7\u5220\u9664\u8BE5\u6587\u4EF6\u6216\u786E\u4FDD\u8BE5\u6587\u4EF6\u4F4D\u4E8E\u6B63\u786E\u7684\u7C7B\u8DEF\u5F84\u5B50\u76EE\u5F55\u4E2D\u3002 + +@@ -1629,6 +1639,9 @@ + compiler.err.type.annotations.not.supported.in.source=-source {0} \u4E2D\u4E0D\u652F\u6301\u7C7B\u578B\u6CE8\u91CA\n(\u8BF7\u4F7F\u7528 -source 8 \u6216\u66F4\u9AD8\u7248\u672C\u4EE5\u542F\u7528\u7C7B\u578B\u6CE8\u91CA) + + # 0: string ++compiler.err.annotations.after.type.params.not.supported.in.source=-source {0} \u4E2D\u4E0D\u652F\u6301\u65B9\u6CD5\u7C7B\u578B\u53C2\u6570\u540E\u7684\u6CE8\u91CA\n(\u8BF7\u4F7F\u7528 -source 8 \u6216\u66F4\u9AD8\u7248\u672C\u4EE5\u542F\u7528\u65B9\u6CD5\u7C7B\u578B\u53C2\u6570\u540E\u7684\u6CE8\u91CA) ++ ++# 0: string + compiler.err.repeatable.annotations.not.supported.in.source=-source {0}\u4E2D\u4E0D\u652F\u6301\u91CD\u590D\u6CE8\u91CA\n(\u8BF7\u4F7F\u7528 -source 8 \u6216\u66F4\u9AD8\u7248\u672C\u4EE5\u542F\u7528\u91CD\u590D\u6CE8\u91CA) + + # 0: string +--- ./langtools/src/share/classes/com/sun/tools/javac/resources/javac_ja.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/resources/javac_ja.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -30,14 +30,14 @@ + javac.opt.g.lines.vars.source=\u3044\u304F\u3064\u304B\u306E\u30C7\u30D0\u30C3\u30B0\u60C5\u5831\u306E\u307F\u3092\u751F\u6210\u3059\u308B + javac.opt.nowarn=\u8B66\u544A\u3092\u767A\u751F\u3055\u305B\u306A\u3044 + javac.opt.verbose=\u30B3\u30F3\u30D1\u30A4\u30E9\u306E\u52D5\u4F5C\u306B\u3064\u3044\u3066\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B +-javac.opt.deprecation=\u975E\u63A8\u5968\u306EAPI\u304C\u4F7F\u7528\u3055\u308C\u3066\u3044\u308B\u30BD\u30FC\u30B9\u306E\u4F4D\u7F6E\u3092\u51FA\u529B\u3059\u308B ++javac.opt.deprecation=\u975E\u63A8\u5968\u306EAPI\u304C\u4F7F\u7528\u3055\u308C\u3066\u3044\u308B\u30BD\u30FC\u30B9\u306E\u5834\u6240\u3092\u51FA\u529B\u3059\u308B + javac.opt.classpath=\u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u304A\u3088\u3073\u6CE8\u91C8\u30D7\u30ED\u30BB\u30C3\u30B5\u3092\u691C\u7D22\u3059\u308B\u4F4D\u7F6E\u3092\u6307\u5B9A\u3059\u308B + javac.opt.sourcepath=\u5165\u529B\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u4F4D\u7F6E\u3092\u6307\u5B9A\u3059\u308B +-javac.opt.bootclasspath=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306E\u4F4D\u7F6E\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B ++javac.opt.bootclasspath=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B + javac.opt.Xbootclasspath.p=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306B\u4ED8\u52A0\u3059\u308B + javac.opt.Xbootclasspath.a=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306B\u8FFD\u52A0\u3059\u308B +-javac.opt.endorseddirs=\u63A8\u5968\u898F\u683C\u30D1\u30B9\u306E\u4F4D\u7F6E\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B +-javac.opt.extdirs=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6E08\u307F\u62E1\u5F35\u6A5F\u80FD\u306E\u4F4D\u7F6E\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B ++javac.opt.endorseddirs=\u63A8\u5968\u898F\u683C\u30D1\u30B9\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B ++javac.opt.extdirs=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6E08\u307F\u62E1\u5F35\u6A5F\u80FD\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B + javac.opt.processorpath=\u6CE8\u91C8\u30D7\u30ED\u30BB\u30C3\u30B5\u3092\u691C\u7D22\u3059\u308B\u4F4D\u7F6E\u3092\u6307\u5B9A\u3059\u308B + javac.opt.processor=\u5B9F\u884C\u3059\u308B\u6CE8\u91C8\u30D7\u30ED\u30BB\u30C3\u30B5\u306E\u540D\u524D\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u691C\u51FA\u51E6\u7406\u3092\u30D0\u30A4\u30D1\u30B9 + javac.opt.parameters=\u30E1\u30BD\u30C3\u30C9\u30FB\u30D1\u30E9\u30E1\u30FC\u30BF\u306B\u30EA\u30D5\u30EC\u30AF\u30B7\u30E7\u30F3\u7528\u306E\u30E1\u30BF\u30C7\u30FC\u30BF\u3092\u751F\u6210\u3057\u307E\u3059 +@@ -133,7 +133,7 @@ + + javac.msg.usage.nonstandard.footer=\u3053\u308C\u3089\u306F\u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3042\u308A\u4E88\u544A\u306A\u3057\u306B\u5909\u66F4\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002 + +-javac.msg.bug=\u30B3\u30F3\u30D1\u30A4\u30E9\u3067\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F({0})\u3002Bug Parade\u306B\u540C\u3058\u30D0\u30B0\u304C\u767B\u9332\u3055\u308C\u3066\u3044\u306A\u3044\u3053\u3068\u3092\u3054\u78BA\u8A8D\u306E\u4E0A\u3001Java Developer Connection(http://java.sun.com/webapps/bugreport)\u3067\u30D0\u30B0\u306E\u767B\u9332\u3092\u304A\u9858\u3044\u3044\u305F\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306B\u306F\u3001\u305D\u306E\u30D7\u30ED\u30B0\u30E9\u30E0\u3068\u4E0B\u8A18\u306E\u8A3A\u65AD\u5185\u5BB9\u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044\u3002\u3054\u5354\u529B\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002 ++javac.msg.bug=\u30B3\u30F3\u30D1\u30A4\u30E9\u3067\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F({0})\u3002Bug Parade\u3067\u91CD\u8907\u304C\u306A\u3044\u304B\u3092\u3054\u78BA\u8A8D\u306E\u3046\u3048\u3001Java Developer Connection (http://java.sun.com/webapps/bugreport)\u3067bug\u306E\u767B\u9332\u3092\u304A\u9858\u3044\u3044\u305F\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306B\u306F\u3001\u305D\u306E\u30D7\u30ED\u30B0\u30E9\u30E0\u3068\u4E0B\u8A18\u306E\u8A3A\u65AD\u5185\u5BB9\u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044\u3002\u3054\u5354\u529B\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002 + + javac.msg.io=\n\n\u5165\u51FA\u529B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\n\u8A73\u7D30\u306F\u6B21\u306E\u30B9\u30BF\u30C3\u30AF\u30FB\u30C8\u30EC\u30FC\u30B9\u3067\u8ABF\u67FB\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n + +--- ./langtools/src/share/classes/com/sun/tools/javac/sym/Profiles.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/sym/Profiles.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -153,6 +153,8 @@ + final int maxProfile = 4; // Three compact profiles plus full JRE + + MakefileProfiles(Properties p) { ++ // consider crypto, only if java/lang package exists ++ boolean foundJavaLang = false; + for (int profile = 1; profile <= maxProfile; profile++) { + String prefix = (profile < maxProfile ? "PROFILE_" + profile : "FULL_JRE"); + String inclPackages = p.getProperty(prefix + "_RTJAR_INCLUDE_PACKAGES"); +@@ -161,6 +163,8 @@ + for (String pkg: inclPackages.substring(1).trim().split("\\s+")) { + if (pkg.endsWith("/")) + pkg = pkg.substring(0, pkg.length() - 1); ++ if (foundJavaLang == false && pkg.equals("java/lang")) ++ foundJavaLang = true; + includePackage(profile, pkg); + } + String inclTypes = p.getProperty(prefix + "_RTJAR_INCLUDE_TYPES"); +@@ -178,6 +182,15 @@ + } + } + } ++ /* ++ * A hack to force javax/crypto package into the compact1 profile, ++ * because this package exists in jce.jar, and therefore not in ++ * ct.sym. Note javax/crypto should exist in a profile along with ++ * javax/net/ssl package. Thus, this package is added to compact1, ++ * implying that it should exist in all three profiles. ++ */ ++ if (foundJavaLang) ++ includePackage(1, "javax/crypto"); + } + + @Override +--- ./langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java Wed Jul 30 03:55:11 2014 -0700 +@@ -609,6 +609,9 @@ + super.setPos(pos); + return this; + } ++ ++ public boolean isPoly() { return false; } ++ public boolean isStandalone() { return true; } + } + + /** +@@ -629,6 +632,9 @@ + + /** is this poly expression a 'true' poly expression? */ + public PolyKind polyKind; ++ ++ @Override public boolean isPoly() { return polyKind == PolyKind.POLY; } ++ @Override public boolean isStandalone() { return polyKind == PolyKind.STANDALONE; } + } + + /** +--- ./langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -135,6 +135,14 @@ + } + } + ++ public static boolean isReceiverParam(JCTree tree) { ++ if (tree.hasTag(VARDEF)) { ++ return ((JCVariableDecl)tree).nameexpr != null; ++ } else { ++ return false; ++ } ++ } ++ + /** Is there a constructor declaration in the given list of trees? + */ + public static boolean hasConstructors(List<JCTree> trees) { +@@ -831,6 +839,8 @@ + return symbol(((JCTypeApply) tree).clazz); + case ANNOTATED_TYPE: + return symbol(((JCAnnotatedType) tree).underlyingType); ++ case REFERENCE: ++ return ((JCMemberReference) tree).sym; + default: + return null; + } +--- ./langtools/src/share/classes/com/sun/tools/javac/tree/TreeTranslator.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/tree/TreeTranslator.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -56,9 +56,9 @@ + return null; + } else { + tree.accept(this); +- JCTree result = this.result; ++ JCTree tmpResult = this.result; + this.result = null; +- return (T)result; // XXX cast ++ return (T)tmpResult; // XXX cast + } + } + +--- ./langtools/src/share/classes/com/sun/tools/javac/util/IntHashTable.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/src/share/classes/com/sun/tools/javac/util/IntHashTable.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,198 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.javac.util; ++ ++/** ++ * A hash table that maps Object to int. ++ * ++ * This is a custom hash table optimised for the Object -> int ++ * maps. This is done to avoid unnecessary object allocation in the image set. ++ * ++ * @author Charles Turner ++ * @author Per Bothner ++ */ ++public class IntHashTable { ++ private static final int DEFAULT_INITIAL_SIZE = 64; ++ protected Object[] objs; // the domain set ++ protected int[] ints; // the image set ++ protected int mask; // used to clip int's into the domain ++ protected int num_bindings; // the number of mappings (including DELETED) ++ private final static Object DELETED = new Object(); ++ ++ /** ++ * Construct an Object -> int hash table. ++ * ++ * The default size of the hash table is 64 mappings. ++ */ ++ public IntHashTable() { ++ objs = new Object[DEFAULT_INITIAL_SIZE]; ++ ints = new int[DEFAULT_INITIAL_SIZE]; ++ mask = DEFAULT_INITIAL_SIZE - 1; ++ } ++ ++ /** ++ * Construct an Object -> int hash table with a specified amount of mappings. ++ * @param capacity The number of default mappings in this hash table. ++ */ ++ public IntHashTable(int capacity) { ++ int log2Size = 4; ++ while (capacity > (1 << log2Size)) { ++ log2Size++; ++ } ++ capacity = 1 << log2Size; ++ objs = new Object[capacity]; ++ ints = new int[capacity]; ++ mask = capacity - 1; ++ } ++ ++ /** ++ * Compute the hash code of a given object. ++ * ++ * @param key The object whose hash code is to be computed. ++ * @return zero if the object is null, otherwise the identityHashCode ++ */ ++ public int hash(Object key) { ++ return System.identityHashCode(key); ++ } ++ ++ /** ++ * Find either the index of a key's value, or the index of an available space. ++ * ++ * @param key The key to whose value you want to find. ++ * @param hash The hash code of this key. ++ * @return Either the index of the key's value, or an index pointing to ++ * unoccupied space. ++ */ ++ public int lookup(Object key, int hash) { ++ Object node; ++ int hash1 = hash ^ (hash >>> 15); ++ int hash2 = (hash ^ (hash << 6)) | 1; //ensure coprimeness ++ int deleted = -1; ++ for (int i = hash1 & mask;; i = (i + hash2) & mask) { ++ node = objs[i]; ++ if (node == key) ++ return i; ++ if (node == null) ++ return deleted >= 0 ? deleted : i; ++ if (node == DELETED && deleted < 0) ++ deleted = i; ++ } ++ } ++ ++ /** ++ * Lookup a given key's value in the hash table. ++ * ++ * @param key The key whose value you want to find. ++ * @return Either the index of the key's value, or an index pointing to ++ * unoccupied space. ++ */ ++ public int lookup(Object key) { ++ return lookup(key, hash(key)); ++ } ++ ++ /** ++ * Return the value stored at the specified index in the table. ++ * ++ * @param index The index to inspect, as returned from {@link #lookup} ++ * @return A non-negative integer if the index contains a non-null ++ * value, or -1 if it does. ++ */ ++ public int getFromIndex(int index) { ++ Object node = objs[index]; ++ return node == null || node == DELETED ? -1 : ints[index]; ++ } ++ ++ /** ++ * Associates the specified key with the specified value in this map. ++ * ++ * @param key key with which the specified value is to be associated. ++ * @param value value to be associated with the specified key. ++ * @param index the index at which to place this binding, as returned ++ * from {@link #lookup}. ++ * @return previous value associated with specified key, or -1 if there was ++ * no mapping for key. ++ */ ++ public int putAtIndex(Object key, int value, int index) { ++ Object old = objs[index]; ++ if (old == null || old == DELETED) { ++ objs[index] = key; ++ ints[index] = value; ++ if (old != DELETED) ++ num_bindings++; ++ if (3 * num_bindings >= 2 * objs.length) ++ rehash(); ++ return -1; ++ } else { // update existing mapping ++ int oldValue = ints[index]; ++ ints[index] = value; ++ return oldValue; ++ } ++ } ++ ++ public int remove(Object key) { ++ int index = lookup(key); ++ Object old = objs[index]; ++ if (old == null || old == DELETED) ++ return -1; ++ objs[index] = DELETED; ++ return ints[index]; ++ } ++ ++ /** ++ * Expand the hash table when it exceeds the load factor. ++ * ++ * Rehash the existing objects. ++ */ ++ protected void rehash() { ++ Object[] oldObjsTable = objs; ++ int[] oldIntsTable = ints; ++ int oldCapacity = oldObjsTable.length; ++ int newCapacity = oldCapacity << 1; ++ Object[] newObjTable = new Object[newCapacity]; ++ int[] newIntTable = new int[newCapacity]; ++ int newMask = newCapacity - 1; ++ objs = newObjTable; ++ ints = newIntTable; ++ mask = newMask; ++ num_bindings = 0; // this is recomputed below ++ Object key; ++ for (int i = oldIntsTable.length; --i >= 0;) { ++ key = oldObjsTable[i]; ++ if (key != null && key != DELETED) ++ putAtIndex(key, oldIntsTable[i], lookup(key, hash(key))); ++ } ++ } ++ ++ /** ++ * Removes all mappings from this map. ++ */ ++ public void clear() { ++ for (int i = objs.length; --i >= 0;) { ++ objs[i] = null; ++ } ++ num_bindings = 0; ++ } ++} +--- ./langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Wed Jul 30 03:55:11 2014 -0700 +@@ -355,13 +355,41 @@ + private final DiagnosticType type; + private final DiagnosticSource source; + private final DiagnosticPosition position; +- private final int line; +- private final int column; + private final String key; + protected final Object[] args; + private final Set<DiagnosticFlag> flags; + private final LintCategory lintCategory; + ++ /** source line position (set lazily) */ ++ private SourcePosition sourcePosition; ++ ++ /** ++ * This class is used to defer the line/column position fetch logic after diagnostic construction. ++ */ ++ class SourcePosition { ++ ++ private final int line; ++ private final int column; ++ ++ SourcePosition() { ++ int n = (position == null ? Position.NOPOS : position.getPreferredPosition()); ++ if (n == Position.NOPOS || source == null) ++ line = column = -1; ++ else { ++ line = source.getLineNumber(n); ++ column = source.getColumnNumber(n, true); ++ } ++ } ++ ++ public int getLineNumber() { ++ return line; ++ } ++ ++ public int getColumnNumber() { ++ return column; ++ } ++ } ++ + /** + * Create a diagnostic object. + * @param formatter the formatter to use for the diagnostic +@@ -391,14 +419,6 @@ + this.position = pos; + this.key = key; + this.args = args; +- +- int n = (pos == null ? Position.NOPOS : pos.getPreferredPosition()); +- if (n == Position.NOPOS || source == null) +- line = column = -1; +- else { +- line = source.getLineNumber(n); +- column = source.getColumnNumber(n, true); +- } + } + + /** +@@ -495,7 +515,10 @@ + * @return the line number within the source referred to by this diagnostic + */ + public long getLineNumber() { +- return line; ++ if (sourcePosition == null) { ++ sourcePosition = new SourcePosition(); ++ } ++ return sourcePosition.getLineNumber(); + } + + /** +@@ -503,7 +526,10 @@ + * @return the column number within the line of source referred to by this diagnostic + */ + public long getColumnNumber() { +- return column; ++ if (sourcePosition == null) { ++ sourcePosition = new SourcePosition(); ++ } ++ return sourcePosition.getColumnNumber(); + } + + /** +--- ./langtools/src/share/classes/com/sun/tools/javac/util/StringUtils.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/src/share/classes/com/sun/tools/javac/util/StringUtils.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,70 @@ ++/* ++ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.javac.util; ++ ++import java.util.Locale; ++import java.util.regex.Matcher; ++import java.util.regex.Pattern; ++ ++/** A collection of utilities for String manipulation. ++ * ++ * <p><b>This is NOT part of any supported API. ++ * If you write code that depends on this, you do so at your own risk. ++ * This code and its internal interfaces are subject to change or ++ * deletion without notice.</b> ++ */ ++public class StringUtils { ++ ++ /**Converts the given String to lower case using the {@link Locale#US US Locale}. The result ++ * is independent of the default Locale in the current JVM instance. ++ */ ++ public static String toLowerCase(String source) { ++ return source.toLowerCase(Locale.US); ++ } ++ ++ /**Converts the given String to upper case using the {@link Locale#US US Locale}. The result ++ * is independent of the default Locale in the current JVM instance. ++ */ ++ public static String toUpperCase(String source) { ++ return source.toUpperCase(Locale.US); ++ } ++ ++ /**Case insensitive version of {@link String#indexOf(java.lang.String)}. Equivalent to ++ * {@code text.indexOf(str)}, except the matching is case insensitive. ++ */ ++ public static int indexOfIgnoreCase(String text, String str) { ++ return indexOfIgnoreCase(text, str, 0); ++ } ++ ++ /**Case insensitive version of {@link String#indexOf(java.lang.String, int)}. Equivalent to ++ * {@code text.indexOf(str, startIndex)}, except the matching is case insensitive. ++ */ ++ public static int indexOfIgnoreCase(String text, String str, int startIndex) { ++ Matcher m = Pattern.compile(Pattern.quote(str), Pattern.CASE_INSENSITIVE).matcher(text); ++ return m.find(startIndex) ? m.start() : -1; ++ } ++ ++} +--- ./langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2001, 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 +@@ -30,6 +30,7 @@ + import java.util.Collection; + import java.util.EnumSet; + import java.util.HashMap; ++import java.util.HashSet; + import java.util.Map; + import java.util.Set; + import javax.tools.JavaFileManager.Location; +@@ -67,6 +68,7 @@ + final Messager messager; + final JavadocClassReader javadocReader; + final JavadocEnter javadocEnter; ++ final Set<JavaFileObject> uniquefiles; + + /** + * Construct a new JavaCompiler processor, using appropriately +@@ -77,6 +79,7 @@ + messager = Messager.instance0(context); + javadocReader = JavadocClassReader.instance0(context); + javadocEnter = JavadocEnter.instance0(context); ++ uniquefiles = new HashSet<>(); + } + + /** +@@ -147,9 +150,7 @@ + String name = it.head; + if (!docClasses && fm != null && name.endsWith(".java") && new File(name).exists()) { + JavaFileObject fo = fm.getJavaFileObjects(name).iterator().next(); +- docenv.notice("main.Loading_source_file", name); +- JCCompilationUnit tree = parse(fo); +- classTrees.append(tree); ++ parse(fo, classTrees, true); + } else if (isValidPackageName(name)) { + names = names.append(name); + } else if (name.endsWith(".java")) { +@@ -162,9 +163,7 @@ + } + } + for (JavaFileObject fo: fileObjects) { +- docenv.notice("main.Loading_source_file", fo.getName()); +- JCCompilationUnit tree = parse(fo); +- classTrees.append(tree); ++ parse(fo, classTrees, true); + } + + if (!docClasses) { +@@ -212,7 +211,7 @@ + * .java files found in such a directory to args. + */ + private void parsePackageClasses(String name, +- Iterable<JavaFileObject> files, ++ List<JavaFileObject> files, + ListBuffer<JCCompilationUnit> trees, + List<String> excludedPackages) + throws IOException { +@@ -220,7 +219,6 @@ + return; + } + +- boolean hasFiles = false; + docenv.notice("main.Loading_source_files_for_package", name); + + if (files == null) { +@@ -237,16 +235,22 @@ + } + files = lb.toList(); + } ++ if (files.nonEmpty()) { ++ for (JavaFileObject fo : files) { ++ parse(fo, trees, false); ++ } ++ } else { ++ messager.warning(Messager.NOPOS, "main.no_source_files_for_package", ++ name.replace(File.separatorChar, '.')); ++ } ++ } + +- for (JavaFileObject fo : files) { +- // messager.notice("main.Loading_source_file", fn); ++ private void parse(JavaFileObject fo, ListBuffer<JCCompilationUnit> trees, ++ boolean trace) { ++ if (uniquefiles.add(fo)) { // ignore duplicates ++ if (trace) ++ docenv.notice("main.Loading_source_file", fo.getName()); + trees.append(parse(fo)); +- hasFiles = true; +- } +- +- if (!hasFiles) { +- messager.warning(Messager.NOPOS, "main.no_source_files_for_package", +- name.replace(File.separatorChar, '.')); + } + } + +--- ./langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc_ja.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc_ja.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -28,7 +28,7 @@ + main.warnings=\u8B66\u544A{0}\u500B + main.warning=\u8B66\u544A{0}\u500B + +-main.usage=\u4F7F\u7528\u65B9\u6CD5: javadoc [options] [packagenames] [sourcefiles] [@files]\n -overview <file> HTML\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u6982\u8981\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u8AAD\u307F\u8FBC\u3080\n -public public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u793A\u3059\n -protected protected/public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -package package/protected/public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059\n -private \u3059\u3079\u3066\u306E\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059\n -help \u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3057\u3066\u7D42\u4E86\u3059\u308B\n -doclet <class> \u4EE3\u66FFdoclet\u3092\u4ECB\u3057\u3066\u51FA\u529B\u3092\u751F\u6210\u3059\u308B\n -docletpath <path> doclet\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u63A2\u3059\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -sourcepath <pathlist> \u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -classpath <pathlist> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -cp <pathlist> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\r\n -exclude <pkglist> \u9664\u5916\u3059\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u30FB\u30EA\u30B9\u30C8\u3092\u6307\u5B9A\u3059\u308B\n -subpackages <subpkglist> \u518D\u5E30\u7684\u306B\u30ED\u30FC\u30C9\u3059\u308B\u30B5\u30D6\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u6307\u5B9A\u3059\u308B\n -breakiterator BreakIterator\u3067\u6700\u521D\u306E\u6587\u3092\u8A08\u7B97\u3059\u308B\n -bootclasspath <pathlist> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30ED\u30FC\u30C0\u30FC\u306B\u3088\u308A\u30ED\u30FC\u30C9\u3055\u308C\u305F\n \u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -source <release> \u6307\u5B9A\u3055\u308C\u305F\u30EA\u30EA\u30FC\u30B9\u3068\u30BD\u30FC\u30B9\u306E\u4E92\u63DB\u6027\u3092\u63D0\u4F9B\u3059\u308B\n -extdirs <dirlist> \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u305F\u62E1\u5F35\u6A5F\u80FD\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -verbose Javadoc\u306E\u52D5\u4F5C\u306B\u3064\u3044\u3066\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B\n -locale <name> en_US\u3084en_US_WIN\u306A\u3069\u306E\u4F7F\u7528\u3059\u308B\u30ED\u30B1\u30FC\u30EB\n -encoding <name> \u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u540D\n -quiet \u72B6\u614B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3057\u306A\u3044\n -J<flag> <flag>\u3092\u5B9F\u884C\u6642\u30B7\u30B9\u30C6\u30E0\u306B\u76F4\u63A5\u6E21\u3059\n -X \u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u6982\u8981\u3092\u51FA\u529B\u3057\u7D42\u4E86\u3059\u308B\n ++main.usage=\u4F7F\u7528\u65B9\u6CD5: javadoc [options] [packagenames] [sourcefiles] [@files]\n -overview <file> HTML\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u6982\u8981\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u8AAD\u307F\u8FBC\u3080\n -public public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u793A\u3059\n -protected protected/public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -package package/protected/public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059\n -private \u3059\u3079\u3066\u306E\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059\n -help \u30B3\u30DE\u30F3\u30C9\u884C\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3057\u3066\u7D42\u4E86\u3059\u308B\n -doclet <class> \u4EE3\u66FFdoclet\u3092\u4ECB\u3057\u3066\u51FA\u529B\u3092\u751F\u6210\u3059\u308B\n -docletpath <path> doclet\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u63A2\u3059\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -sourcepath <pathlist> \u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -classpath <pathlist> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -cp <pathlist> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\r\n -exclude <pkglist> \u9664\u5916\u3059\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u30FB\u30EA\u30B9\u30C8\u3092\u6307\u5B9A\u3059\u308B\n -subpackages <subpkglist> \u518D\u5E30\u7684\u306B\u30ED\u30FC\u30C9\u3059\u308B\u30B5\u30D6\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u6307\u5B9A\u3059\u308B\n -breakiterator BreakIterator\u3067\u6700\u521D\u306E\u6587\u3092\u8A08\u7B97\u3059\u308B\n -bootclasspath <pathlist> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30ED\u30FC\u30C0\u30FC\u306B\u3088\u308A\u30ED\u30FC\u30C9\u3055\u308C\u305F\n \u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -source <release> \u6307\u5B9A\u3055\u308C\u305F\u30EA\u30EA\u30FC\u30B9\u3068\u30BD\u30FC\u30B9\u306E\u4E92\u63DB\u6027\u3092\u63D0\u4F9B\u3059\u308B\n -extdirs <dirlist> \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u305F\u62E1\u5F35\u6A5F\u80FD\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -verbose Javadoc\u306E\u52D5\u4F5C\u306B\u3064\u3044\u3066\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B\n -locale <name> en_US\u3084en_US_WIN\u306A\u3069\u306E\u4F7F\u7528\u3059\u308B\u30ED\u30B1\u30FC\u30EB\n -encoding <name> \u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u540D\n -quiet \u72B6\u614B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3057\u306A\u3044\n -J<flag> <flag>\u3092\u5B9F\u884C\u6642\u30B7\u30B9\u30C6\u30E0\u306B\u76F4\u63A5\u6E21\u3059\n -X \u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u6982\u8981\u3092\u51FA\u529B\u3057\u7D42\u4E86\u3059\u308B\n + + main.Xusage=\ -Xmaxerrs <number> \u51FA\u529B\u3059\u308B\u30A8\u30E9\u30FC\u306E\u6700\u5927\u6570\u3092\u8A2D\u5B9A\u3059\u308B\n -Xmaxwarns <number> \u51FA\u529B\u3059\u308B\u8B66\u544A\u306E\u6700\u5927\u6570\u3092\u8A2D\u5B9A\u3059\u308B\n + +@@ -36,7 +36,7 @@ + + main.option.already.seen={0}\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u8907\u6570\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002 + main.requires_argument=\u30AA\u30D7\u30B7\u30E7\u30F3{0}\u306B\u306F\u5F15\u6570\u304C\u5FC5\u8981\u3067\u3059\u3002 +-main.locale_first=\u30AA\u30D7\u30B7\u30E7\u30F3-locale\u306F\u3001\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u306E\u6700\u521D\u306B\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 ++main.locale_first=\u30AA\u30D7\u30B7\u30E7\u30F3-locale\u306F\u3001\u30B3\u30DE\u30F3\u30C9\u884C\u306E\u6700\u521D\u306B\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002 + main.invalid_flag={0}\u306F\u7121\u52B9\u306A\u30D5\u30E9\u30B0\u3067\u3059 + main.No_packages_or_classes_specified=\u30D1\u30C3\u30B1\u30FC\u30B8\u307E\u305F\u306F\u30AF\u30E9\u30B9\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 + main.incompatible.access.flags=-public\u3001-private\u3001-package\u307E\u305F\u306F-protected\u306E\u3046\u3061\u306E2\u3064\u4EE5\u4E0A\u3092\u6307\u5B9A\u3057\u307E\u3057\u305F\u3002 +--- ./langtools/src/share/classes/com/sun/tools/javah/resources/l10n_ja.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javah/resources/l10n_ja.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -27,9 +27,9 @@ + # User errors, command line errors. + # + cant.create.dir=\u51FA\u529B\u7528\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA{0}\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3002 +-at.args.cant.read=\u30D5\u30A1\u30A4\u30EB{1}\u304B\u3089\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u5F15\u6570\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3002 ++at.args.cant.read=\u30D5\u30A1\u30A4\u30EB{1}\u304B\u3089\u30B3\u30DE\u30F3\u30C9\u884C\u5F15\u6570\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3002 + at.args.file.not.found=\u30D5\u30A1\u30A4\u30EB{0}\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002 +-at.args.io.exception=\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u306E@\u5F15\u6570\u306E\u51E6\u7406\u4E2D\u306B\u3001\u6B21\u306E\u5165\u51FA\u529B\u306E\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {0}\u3002 ++at.args.io.exception=\u30B3\u30DE\u30F3\u30C9\u884C\u306E@\u5F15\u6570\u306E\u51E6\u7406\u4E2D\u306B\u3001\u6B21\u306E\u5165\u51FA\u529B\u306E\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {0}\u3002 + old.jni.mixed=\u30AA\u30D7\u30B7\u30E7\u30F3-jni\u3068-old\u3092\u540C\u6642\u306B\u4F7F\u7528\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + old.llni.mixed=\u30AA\u30D7\u30B7\u30E7\u30F3-old\u3068-llni\u3092\u540C\u6642\u306B\u4F7F\u7528\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + old.not.supported=\u3053\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u306Ejavah\u3067\u306F\u30AA\u30D7\u30B7\u30E7\u30F3-old\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 +@@ -38,11 +38,11 @@ + jni.no.stubs=JNI\u306F\u30B9\u30BF\u30D6\u3092\u5FC5\u8981\u3068\u3057\u307E\u305B\u3093\u3002JNI\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + jni.sigerror={0}\u306E\u30B7\u30B0\u30CD\u30C1\u30E3\u3092\u5224\u5225\u3067\u304D\u307E\u305B\u3093 + dir.file.mixed=\u30AA\u30D7\u30B7\u30E7\u30F3-d\u3068-o\u3092\u540C\u6642\u306B\u4F7F\u7528\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +-no.classes.specified=\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u3067\u30AF\u30E9\u30B9\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +-no.outputfile.specified=\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u3067\u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +-no.outputdir.specified=\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u3067\u51FA\u529B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +-no.classpath.specified=\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u3067\u30AF\u30E9\u30B9\u30D1\u30B9\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +-no.bootclasspath.specified=\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u3067\u30D6\u30FC\u30C8\u30FB\u30AF\u30E9\u30B9\u30D1\u30B9\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 ++no.classes.specified=\u30B3\u30DE\u30F3\u30C9\u884C\u3067\u30AF\u30E9\u30B9\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 ++no.outputfile.specified=\u30B3\u30DE\u30F3\u30C9\u884C\u3067\u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 ++no.outputdir.specified=\u30B3\u30DE\u30F3\u30C9\u884C\u3067\u51FA\u529B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 ++no.classpath.specified=\u30B3\u30DE\u30F3\u30C9\u884C\u3067\u30AF\u30E9\u30B9\u30D1\u30B9\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 ++no.bootclasspath.specified=\u30B3\u30DE\u30F3\u30C9\u884C\u3067\u30D6\u30FC\u30C8\u30FB\u30AF\u30E9\u30B9\u30D1\u30B9\u304C\u6307\u5B9A\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002-help\u3067\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + unknown.option={0}\u306F\u4E0D\u6B63\u306A\u5F15\u6570\u3067\u3059\n + tracing.not.supported=\u8B66\u544A: \u30C8\u30EC\u30FC\u30B9\u306F\u73FE\u5728\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u304B\u308F\u308A\u306B\u3001Virtual Machine\u306E-verbose:jni\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + +--- ./langtools/src/share/classes/com/sun/tools/javap/AttributeWriter.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/AttributeWriter.java Wed Jul 30 03:55:11 2014 -0700 +@@ -62,6 +62,7 @@ + import com.sun.tools.classfile.Synthetic_attribute; + + import static com.sun.tools.classfile.AccessFlags.*; ++import com.sun.tools.javac.util.StringUtils; + + /* + * A writer for writing Attributes as text. +@@ -226,10 +227,7 @@ + } + + public Void visitConstantValue(ConstantValue_attribute attr, Void ignore) { +- if (options.compat) // BUG 6622216 javap names some attributes incorrectly +- print("Constant value: "); +- else +- print("ConstantValue: "); ++ print("ConstantValue: "); + constantWriter.write(attr.constantvalue_index); + println(); + return null; +@@ -290,20 +288,10 @@ + + public Void visitInnerClasses(InnerClasses_attribute attr, Void ignore) { + boolean first = true; +- if (options.compat) { +- writeInnerClassHeader(); +- first = false; +- } + for (int i = 0 ; i < attr.classes.length; i++) { + InnerClasses_attribute.Info info = attr.classes[i]; + //access + AccessFlags access_flags = info.inner_class_access_flags; +- if (options.compat) { +- // BUG 6622215: javap ignores certain relevant access flags +- access_flags = access_flags.ignore(ACC_STATIC | ACC_PROTECTED | ACC_PRIVATE | ACC_INTERFACE | ACC_SYNTHETIC | ACC_ENUM); +- // BUG 6622232: javap gets whitespace confused +- print(" "); +- } + if (options.checkAccess(access_flags)) { + if (first) { + writeInnerClassHeader(); +@@ -345,11 +333,7 @@ + } + + private void writeInnerClassHeader() { +- if (options.compat) // BUG 6622216: javap names some attributes incorrectly +- print("InnerClass"); +- else +- print("InnerClasses"); +- println(":"); ++ println("InnerClasses:"); + indent(+1); + } + +@@ -547,7 +531,6 @@ + for (StackMapTable_attribute.stack_map_frame entry : attr.entries) { + w.write(entry); + } +- println(); + indent(-1); + return null; + } +@@ -559,7 +542,6 @@ + for (StackMapTable_attribute.stack_map_frame entry : attr.entries) { + w.write(entry); + } +- println(); + indent(-1); + return null; + } +@@ -571,14 +553,12 @@ + } + + public Void visit_same_frame(StackMapTable_attribute.same_frame frame, Void p) { +- printHeader(frame); +- println(" /* same */"); ++ printHeader(frame, "/* same */"); + return null; + } + + public Void visit_same_locals_1_stack_item_frame(StackMapTable_attribute.same_locals_1_stack_item_frame frame, Void p) { +- printHeader(frame); +- println(" /* same_locals_1_stack_item */"); ++ printHeader(frame, "/* same_locals_1_stack_item */"); + indent(+1); + printMap("stack", frame.stack); + indent(-1); +@@ -586,8 +566,7 @@ + } + + public Void visit_same_locals_1_stack_item_frame_extended(StackMapTable_attribute.same_locals_1_stack_item_frame_extended frame, Void p) { +- printHeader(frame); +- println(" /* same_locals_1_stack_item_frame_extended */"); ++ printHeader(frame, "/* same_locals_1_stack_item_frame_extended */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + printMap("stack", frame.stack); +@@ -596,8 +575,7 @@ + } + + public Void visit_chop_frame(StackMapTable_attribute.chop_frame frame, Void p) { +- printHeader(frame); +- println(" /* chop */"); ++ printHeader(frame, "/* chop */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + indent(-1); +@@ -605,8 +583,7 @@ + } + + public Void visit_same_frame_extended(StackMapTable_attribute.same_frame_extended frame, Void p) { +- printHeader(frame); +- println(" /* same_frame_extended */"); ++ printHeader(frame, "/* same_frame_extended */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + indent(-1); +@@ -614,21 +591,20 @@ + } + + public Void visit_append_frame(StackMapTable_attribute.append_frame frame, Void p) { +- printHeader(frame); +- println(" /* append */"); ++ printHeader(frame, "/* append */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + printMap("locals", frame.locals); ++ indent(-1); + return null; + } + + public Void visit_full_frame(StackMapTable_attribute.full_frame frame, Void p) { +- printHeader(frame); + if (frame instanceof StackMap_attribute.stack_map_frame) { ++ printHeader(frame, "offset = " + frame.offset_delta); + indent(+1); +- println(" offset = " + frame.offset_delta); + } else { +- println(" /* full_frame */"); ++ printHeader(frame, "/* full_frame */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + } +@@ -638,8 +614,9 @@ + return null; + } + +- void printHeader(StackMapTable_attribute.stack_map_frame frame) { +- print(" frame_type = " + frame.frame_type); ++ void printHeader(StackMapTable_attribute.stack_map_frame frame, String extra) { ++ print("frame_type = " + frame.frame_type + " "); ++ println(extra); + } + + void printMap(String name, StackMapTable_attribute.verification_type_info[] map) { +@@ -710,21 +687,18 @@ + } + + String toHex(byte b, int w) { +- if (options.compat) // BUG 6622260: javap prints negative bytes incorrectly in hex +- return toHex((int) b, w); +- else +- return toHex(b & 0xff, w); ++ return toHex(b & 0xff, w); + } + + static String toHex(int i) { +- return Integer.toString(i, 16).toUpperCase(); ++ return StringUtils.toUpperCase(Integer.toString(i, 16)); + } + + static String toHex(int i, int w) { +- String s = Integer.toHexString(i).toUpperCase(); ++ String s = StringUtils.toUpperCase(Integer.toHexString(i)); + while (s.length() < w) + s = "0" + s; +- return s.toUpperCase(); ++ return StringUtils.toUpperCase(s); + } + + private AnnotationWriter annotationWriter; +--- ./langtools/src/share/classes/com/sun/tools/javap/BasicWriter.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/BasicWriter.java Wed Jul 30 03:55:11 2014 -0700 +@@ -151,12 +151,22 @@ + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { ++ case ' ': ++ pendingSpaces++; ++ break; ++ + case '\n': + println(); + break; ++ + default: + if (buffer.length() == 0) + indent(); ++ if (pendingSpaces > 0) { ++ for (int sp = 0; sp < pendingSpaces; sp++) ++ buffer.append(' '); ++ pendingSpaces = 0; ++ } + buffer.append(c); + } + } +@@ -164,6 +174,8 @@ + } + + protected void println() { ++ // ignore/discard pending spaces ++ pendingSpaces = 0; + out.println(buffer); + buffer.setLength(0); + } +@@ -173,26 +185,21 @@ + } + + protected void tab() { +- if (buffer.length() == 0) +- indent(); +- space(indentCount * indentWidth + tabColumn - buffer.length()); ++ int col = indentCount * indentWidth + tabColumn; ++ pendingSpaces += (col <= buffer.length() ? 1 : col - buffer.length()); + } + + private void indent() { +- space(indentCount * indentWidth); ++ pendingSpaces += (indentCount * indentWidth); + } + +- private void space(int n) { +- for (int i = 0; i < n; i++) +- buffer.append(' '); +- } +- +- private PrintWriter out; +- private StringBuilder buffer; ++ private final PrintWriter out; ++ private final StringBuilder buffer; + private int indentCount; +- private int indentWidth; +- private int tabColumn; ++ private final int indentWidth; ++ private final int tabColumn; + private boolean pendingNewline; ++ private int pendingSpaces; + } + } + +--- ./langtools/src/share/classes/com/sun/tools/javap/ClassWriter.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/ClassWriter.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2007, 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 +@@ -120,7 +120,7 @@ + public void write(ClassFile cf) { + setClassFile(cf); + +- if ((options.sysInfo || options.verbose) && !options.compat) { ++ if (options.sysInfo || options.verbose) { + if (uri != null) { + if (uri.getScheme().equals("file")) + println("Classfile " + uri.getPath()); +@@ -152,7 +152,7 @@ + println("Compiled from \"" + getSourceFile((SourceFile_attribute) sfa) + "\""); + } + +- if ((options.sysInfo || options.verbose) && !options.compat) { ++ if (options.sysInfo || options.verbose) { + indent(-1); + } + +@@ -202,11 +202,9 @@ + if (options.verbose) { + println(); + indent(+1); +- attrWriter.write(cf, cf.attributes, constant_pool); + println("minor version: " + cf.minor_version); + println("major version: " + cf.major_version); +- if (!options.compat) +- writeList("flags: ", flags.getClassFlags(), "\n"); ++ writeList("flags: ", flags.getClassFlags(), "\n"); + indent(-1); + constantWriter.writeConstantPool(); + } else { +@@ -219,6 +217,10 @@ + writeMethods(); + indent(-1); + println("}"); ++ ++ if (options.verbose) { ++ attrWriter.write(cf, cf.attributes, constant_pool); ++ } + } + // where + class JavaTypePrinter implements Type.Visitor<StringBuilder,StringBuilder> { +@@ -372,7 +374,7 @@ + } + print(" "); + print(getFieldName(f)); +- if (options.showConstants && !options.compat) { // BUG 4111861 print static final field contents ++ if (options.showConstants) { + Attribute a = f.attributes.get(Attribute.ConstantValue); + if (a instanceof ConstantValue_attribute) { + print(" = "); +@@ -385,21 +387,23 @@ + + indent(+1); + ++ boolean showBlank = false; ++ + if (options.showDescriptors) + println("descriptor: " + getValue(f.descriptor)); + +- if (options.verbose && !options.compat) ++ if (options.verbose) + writeList("flags: ", flags.getFieldFlags(), "\n"); + + if (options.showAllAttrs) { + for (Attribute attr: f.attributes) + attrWriter.write(f, attr, constant_pool); +- println(); ++ showBlank = true; + } + + indent(-1); + +- if (options.showDisassembled || options.showLineAndLocalVariableTables) ++ if (showBlank || options.showDisassembled || options.showLineAndLocalVariableTables) + println(); + } + +@@ -485,7 +489,7 @@ + println("descriptor: " + getValue(m.descriptor)); + } + +- if (options.verbose && !options.compat) { ++ if (options.verbose) { + writeList("flags: ", flags.getMethodFlags(), "\n"); + } + +@@ -498,27 +502,23 @@ + report("Unexpected or invalid value for Code attribute"); + } + +- if (options.showDisassembled && !options.showAllAttrs) { +- if (code != null) { ++ if (options.showAllAttrs) { ++ Attribute[] attrs = m.attributes.attrs; ++ for (Attribute attr: attrs) ++ attrWriter.write(m, attr, constant_pool); ++ } else if (code != null) { ++ if (options.showDisassembled) { + println("Code:"); + codeWriter.writeInstrs(code); + codeWriter.writeExceptionTable(code); + } +- } + +- if (options.showLineAndLocalVariableTables) { +- if (code != null) { ++ if (options.showLineAndLocalVariableTables) { + attrWriter.write(code, code.attributes.get(Attribute.LineNumberTable), constant_pool); + attrWriter.write(code, code.attributes.get(Attribute.LocalVariableTable), constant_pool); + } + } + +- if (options.showAllAttrs) { +- Attribute[] attrs = m.attributes.attrs; +- for (Attribute attr: attrs) +- attrWriter.write(m, attr, constant_pool); +- } +- + indent(-1); + + // set pendingNewline to write a newline before the next method (if any) +@@ -555,13 +555,11 @@ + } + + Signature_attribute getSignature(Attributes attributes) { +- if (options.compat) // javap does not recognize recent attributes +- return null; + return (Signature_attribute) attributes.get(Attribute.Signature); + } + + String adjustVarargs(AccessFlags flags, String params) { +- if (flags.is(ACC_VARARGS) && !options.compat) { ++ if (flags.is(ACC_VARARGS)) { + int i = params.lastIndexOf("[]"); + if (i > 0) + return params.substring(0, i) + "..." + params.substring(i+2); +--- ./langtools/src/share/classes/com/sun/tools/javap/ConstantWriter.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/ConstantWriter.java Wed Jul 30 03:55:11 2014 -0700 +@@ -64,7 +64,7 @@ + public Integer visitClass(CONSTANT_Class_info info, Void p) { + print("#" + info.name_index); + tab(); +- println("// " + stringValue(info)); ++ println("// " + stringValue(info)); + return 1; + } + +@@ -76,7 +76,7 @@ + public Integer visitFieldref(CONSTANT_Fieldref_info info, Void p) { + print("#" + info.class_index + ".#" + info.name_and_type_index); + tab(); +- println("// " + stringValue(info)); ++ println("// " + stringValue(info)); + return 1; + } + +@@ -93,14 +93,14 @@ + public Integer visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) { + print("#" + info.class_index + ".#" + info.name_and_type_index); + tab(); +- println("// " + stringValue(info)); ++ println("// " + stringValue(info)); + return 1; + } + + public Integer visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) { + print("#" + info.bootstrap_method_attr_index + ":#" + info.name_and_type_index); + tab(); +- println("// " + stringValue(info)); ++ println("// " + stringValue(info)); + return 1; + } + +@@ -112,21 +112,21 @@ + public Integer visitNameAndType(CONSTANT_NameAndType_info info, Void p) { + print("#" + info.name_index + ":#" + info.type_index); + tab(); +- println("// " + stringValue(info)); ++ println("// " + stringValue(info)); + return 1; + } + + public Integer visitMethodref(CONSTANT_Methodref_info info, Void p) { + print("#" + info.class_index + ".#" + info.name_and_type_index); + tab(); +- println("// " + stringValue(info)); ++ println("// " + stringValue(info)); + return 1; + } + + public Integer visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) { + print("#" + info.reference_kind.tag + ":#" + info.reference_index); + tab(); +- println("// " + stringValue(info)); ++ println("// " + stringValue(info)); + return 1; + } + +@@ -140,7 +140,7 @@ + public Integer visitString(CONSTANT_String_info info, Void p) { + print("#" + info.string_index); + tab(); +- println("// " + stringValue(info)); ++ println("// " + stringValue(info)); + return 1; + } + +--- ./langtools/src/share/classes/com/sun/tools/javap/JavapTask.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/JavapTask.java Wed Jul 30 03:55:11 2014 -0700 +@@ -195,48 +195,12 @@ + } + }, + +-// new Option(false, "-all") { +-// void process(JavapTask task, String opt, String arg) { +-// task.options.showAllAttrs = true; +-// } +-// }, +- +- new Option(false, "-h") { +- void process(JavapTask task, String opt, String arg) throws BadArgs { +- throw task.new BadArgs("err.h.not.supported"); +- } +- }, +- +- new Option(false, "-verify", "-verify-verbose") { +- void process(JavapTask task, String opt, String arg) throws BadArgs { +- throw task.new BadArgs("err.verify.not.supported"); +- } +- }, +- + new Option(false, "-sysinfo") { + void process(JavapTask task, String opt, String arg) { + task.options.sysInfo = true; + } + }, + +- new Option(false, "-Xold") { +- void process(JavapTask task, String opt, String arg) throws BadArgs { +- task.log.println(task.getMessage("warn.Xold.not.supported")); +- } +- }, +- +- new Option(false, "-Xnew") { +- void process(JavapTask task, String opt, String arg) throws BadArgs { +- // ignore: this _is_ the new version +- } +- }, +- +- new Option(false, "-XDcompat") { +- void process(JavapTask task, String opt, String arg) { +- task.options.compat = true; +- } +- }, +- + new Option(false, "-XDdetails") { + void process(JavapTask task, String opt, String arg) { + task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class); +@@ -309,7 +273,9 @@ + void process(JavapTask task, String opt, String arg) throws BadArgs { + int sep = opt.indexOf(":"); + try { +- task.options.indentWidth = Integer.valueOf(opt.substring(sep + 1)); ++ int i = Integer.valueOf(opt.substring(sep + 1)); ++ if (i > 0) // silently ignore invalid values ++ task.options.indentWidth = i; + } catch (NumberFormatException e) { + } + } +@@ -325,7 +291,9 @@ + void process(JavapTask task, String opt, String arg) throws BadArgs { + int sep = opt.indexOf(":"); + try { +- task.options.tabColumn = Integer.valueOf(opt.substring(sep + 1)); ++ int i = Integer.valueOf(opt.substring(sep + 1)); ++ if (i > 0) // silently ignore invalid values ++ task.options.tabColumn = i; + } catch (NumberFormatException e) { + } + } +@@ -466,7 +434,7 @@ + } catch (BadArgs e) { + reportError(e.key, e.args); + if (e.showUsage) { +- log.println(getMessage("main.usage.summary", progname)); ++ printLines(getMessage("main.usage.summary", progname)); + } + return EXIT_CMDERR; + } catch (InternalError e) { +@@ -520,7 +488,7 @@ + throw new BadArgs("err.unknown.option", arg).showUsage(true); + } + +- if (!options.compat && options.accessOptions.size() > 1) { ++ if (options.accessOptions.size() > 1) { + StringBuilder sb = new StringBuilder(); + for (String opt: options.accessOptions) { + if (sb.length() > 0) +@@ -561,8 +529,12 @@ + } + } + +- if (fileManager.handleOption(name, rest)) +- return; ++ try { ++ if (fileManager.handleOption(name, rest)) ++ return; ++ } catch (IllegalArgumentException e) { ++ throw new BadArgs("err.invalid.use.of.option", name).showUsage(true); ++ } + + throw new BadArgs("err.unknown.option", name).showUsage(true); + } +@@ -581,8 +553,6 @@ + SourceWriter sourceWriter = SourceWriter.instance(context); + sourceWriter.setFileManager(fileManager); + +- attributeFactory.setCompat(options.compat); +- + int result = EXIT_OK; + + for (String className: classes) { +@@ -878,27 +848,33 @@ + } + + private void showHelp() { +- log.println(getMessage("main.usage", progname)); ++ printLines(getMessage("main.usage", progname)); + for (Option o: recognizedOptions) { + String name = o.aliases[0].substring(1); // there must always be at least one name + if (name.startsWith("X") || name.equals("fullversion") || name.equals("h") || name.equals("verify")) + continue; +- log.println(getMessage("main.opt." + name)); ++ printLines(getMessage("main.opt." + name)); + } + String[] fmOptions = { "-classpath", "-cp", "-bootclasspath" }; + for (String o: fmOptions) { + if (fileManager.isSupportedOption(o) == -1) + continue; + String name = o.substring(1); +- log.println(getMessage("main.opt." + name)); ++ printLines(getMessage("main.opt." + name)); + } + + } + + private void showVersion(boolean full) { +- log.println(version(full ? "full" : "release")); ++ printLines(version(full ? "full" : "release")); + } + ++ private void printLines(String msg) { ++ log.println(msg.replace("\n", nl)); ++ } ++ ++ private static final String nl = System.getProperty("line.separator"); ++ + private static final String versionRBName = "com.sun.tools.javap.resources.version"; + private static ResourceBundle versionRB; + +--- ./langtools/src/share/classes/com/sun/tools/javap/Options.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/Options.java Wed Jul 30 03:55:11 2014 -0700 +@@ -86,8 +86,6 @@ + public boolean showConstants; + public boolean sysInfo; + public boolean showInnerClasses; +- public int indentWidth = 2; // #spaces per indentWidth level +- public int tabColumn = 40; // column number for comments +- +- public boolean compat; // bug-for-bug compatibility mode with old javap ++ public int indentWidth = 2; // #spaces per indentWidth level; must be > 0 ++ public int tabColumn = 40; // column number for comments; must be > 0 + } +--- ./langtools/src/share/classes/com/sun/tools/javap/TypeAnnotationWriter.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/TypeAnnotationWriter.java Wed Jul 30 03:55:11 2014 -0700 +@@ -37,6 +37,7 @@ + import java.util.HashMap; + import java.util.List; + import java.util.Map; ++import com.sun.tools.javac.util.StringUtils; + + /** + * Annotate instructions with details about type annotations. +@@ -115,7 +116,7 @@ + print("@"); + annotationWriter.write(n.anno, false, true); + print(", "); +- println(n.kind.toString().toLowerCase()); ++ println(StringUtils.toLowerCase(n.kind.toString())); + } + } + } +--- ./langtools/src/share/classes/com/sun/tools/javap/resources/javap.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/resources/javap.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -6,7 +6,6 @@ + err.crash=A serious internal error has occurred: {0}\nPlease file a bug report, and include the following information:\n{1} + err.end.of.file=unexpected end of file while reading {0} + err.file.not.found=file not found: {0} +-err.h.not.supported=-h is no longer available - use the 'javah' program + err.incompatible.options=bad combination of options: {0} + err.internal.error=internal error: {0} {1} {2} + err.invalid.arg.for.option=invalid argument for option: {0} +@@ -14,12 +13,11 @@ + err.missing.arg=no value given for {0} + err.no.classes.specified=no classes specified + err.not.standard.file.manager=can only specify class files when using a standard file manager ++err.invalid.use.of.option=invalid use of option: {0} + err.unknown.option=unknown option: {0} +-err.verify.not.supported=-verify not supported + err.no.SourceFile.attribute=no SourceFile attribute + err.source.file.not.found=source file not found + err.bad.innerclasses.attribute=bad InnerClasses attribute for {0} +-warn.Xold.not.supported=-Xold is no longer available + + main.usage.summary=\ + Usage: {0} <options> <classes>\n\ +@@ -80,7 +78,7 @@ + \ -bootclasspath <path> Override location of bootstrap class files + + main.opt.constants=\ +-\ -constants Show static final constants ++\ -constants Show final constants + + + main.opt.sysinfo=\ +--- ./langtools/src/share/classes/com/sun/tools/javap/resources/javap_ja.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/resources/javap_ja.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -3,10 +3,9 @@ + + err.bad.constant.pool={0}\u306E\u5B9A\u6570\u30D7\u30FC\u30EB\u306E\u8AAD\u53D6\u308A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {1} + err.class.not.found=\u30AF\u30E9\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0} +-err.crash=\u91CD\u5927\u306A\u5185\u90E8\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {0}\n\u6B21\u306E\u60C5\u5831\u3092\u542B\u3080\u30D0\u30B0\u30FB\u30EC\u30DD\u30FC\u30C8\u3092\u30D5\u30A1\u30A4\u30EB\u3057\u3066\u304F\u3060\u3055\u3044:\n{1} ++err.crash=\u91CD\u5927\u306A\u5185\u90E8\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {0}\n\u6B21\u306E\u60C5\u5831\u3092\u542B\u3080bug\u30EC\u30DD\u30FC\u30C8\u3092\u30D5\u30A1\u30A4\u30EB\u3057\u3066\u304F\u3060\u3055\u3044:\n{1} + err.end.of.file={0}\u306E\u8AAD\u53D6\u308A\u4E2D\u306B\u4E88\u671F\u3057\u306A\u3044\u30D5\u30A1\u30A4\u30EB\u306E\u7D42\u308F\u308A\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F + err.file.not.found=\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0} +-err.h.not.supported=-h\u306F\u4F7F\u7528\u53EF\u80FD\u3067\u306A\u304F\u306A\u308A\u307E\u3057\u305F - 'javah'\u30D7\u30ED\u30B0\u30E9\u30E0\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044 + err.incompatible.options=\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u7D44\u5408\u305B\u304C\u4E0D\u6B63\u3067\u3059: {0} + err.internal.error=\u5185\u90E8\u30A8\u30E9\u30FC: {0} {1} {2} + err.invalid.arg.for.option=\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5F15\u6570\u304C\u7121\u52B9\u3067\u3059: {0} +@@ -14,12 +13,11 @@ + err.missing.arg={0}\u306B\u5024\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 + err.no.classes.specified=\u30AF\u30E9\u30B9\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 + err.not.standard.file.manager=\u6A19\u6E96\u30D5\u30A1\u30A4\u30EB\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u3092\u4F7F\u7528\u3057\u3066\u3044\u308B\u5834\u5408\u306F\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u307F\u6307\u5B9A\u3067\u304D\u307E\u3059 ++err.invalid.use.of.option=\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u4F7F\u7528\u304C\u7121\u52B9\u3067\u3059: {0} + err.unknown.option=\u4E0D\u660E\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0} +-err.verify.not.supported=-verify\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093 + err.no.SourceFile.attribute=SourceFile\u5C5E\u6027\u304C\u3042\u308A\u307E\u305B\u3093 + err.source.file.not.found=\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 + err.bad.innerclasses.attribute={0}\u306EInnerClasses\u5C5E\u6027\u304C\u4E0D\u6B63\u3067\u3059 +-warn.Xold.not.supported=-Xold\u306F\u4F7F\u7528\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3057\u305F + + main.usage.summary=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes>\n\u4F7F\u7528\u53EF\u80FD\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30EA\u30B9\u30C8\u306B\u3064\u3044\u3066\u306F\u3001-help\u3092\u4F7F\u7528\u3057\u307E\u3059 + +@@ -57,9 +55,9 @@ + + main.opt.cp=\ -cp <path> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B + +-main.opt.bootclasspath=\ -bootclasspath <path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u4F4D\u7F6E\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B ++main.opt.bootclasspath=\ -bootclasspath <path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B + +-main.opt.constants=\ -constants \u9759\u7684final\u5B9A\u6570\u3092\u8868\u793A\u3059\u308B ++main.opt.constants=\ -constants final\u5B9A\u6570\u3092\u8868\u793A\u3059\u308B + + + main.opt.sysinfo=\ -sysinfo \u51E6\u7406\u3057\u3066\u3044\u308B\u30AF\u30E9\u30B9\u306E\u30B7\u30B9\u30C6\u30E0\u60C5\u5831(\u30D1\u30B9\u3001\u30B5\u30A4\u30BA\u3001\u65E5\u4ED8\u3001MD5\u30CF\u30C3\u30B7\u30E5)\n \u3092\u8868\u793A\u3059\u308B +--- ./langtools/src/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -6,7 +6,6 @@ + err.crash=\u51FA\u73B0\u4E25\u91CD\u7684\u5185\u90E8\u9519\u8BEF: {0}\n\u8BF7\u5EFA\u7ACB Bug \u62A5\u544A, \u5E76\u5305\u62EC\u4EE5\u4E0B\u4FE1\u606F:\n{1} + err.end.of.file=\u8BFB\u53D6{0}\u65F6\u51FA\u73B0\u610F\u5916\u7684\u6587\u4EF6\u7ED3\u5C3E + err.file.not.found=\u627E\u4E0D\u5230\u6587\u4EF6: {0} +-err.h.not.supported=-h \u4E0D\u518D\u53EF\u7528 - \u8BF7\u4F7F\u7528 'javah' \u7A0B\u5E8F + err.incompatible.options=\u9009\u9879\u7EC4\u5408\u9519\u8BEF: {0} + err.internal.error=\u5185\u90E8\u9519\u8BEF: {0} {1} {2} + err.invalid.arg.for.option=\u9009\u9879\u7684\u53C2\u6570\u65E0\u6548: {0} +@@ -14,12 +13,11 @@ + err.missing.arg=\u6CA1\u6709\u4E3A{0}\u6307\u5B9A\u503C + err.no.classes.specified=\u672A\u6307\u5B9A\u7C7B + err.not.standard.file.manager=\u4F7F\u7528\u6807\u51C6\u6587\u4EF6\u7BA1\u7406\u5668\u65F6\u53EA\u80FD\u6307\u5B9A\u7C7B\u6587\u4EF6 ++err.invalid.use.of.option=\u9009\u9879\u7684\u4F7F\u7528\u65E0\u6548: {0} + err.unknown.option=\u672A\u77E5\u9009\u9879: {0} +-err.verify.not.supported=\u4E0D\u652F\u6301 -verify + err.no.SourceFile.attribute=\u6CA1\u6709 SourceFile \u5C5E\u6027 + err.source.file.not.found=\u627E\u4E0D\u5230\u6E90\u6587\u4EF6 + err.bad.innerclasses.attribute={0}\u7684 InnerClasses \u5C5E\u6027\u9519\u8BEF +-warn.Xold.not.supported=-Xold \u4E0D\u518D\u53EF\u7528 + + main.usage.summary=\u7528\u6CD5: {0} <options> <classes>\n\u4F7F\u7528 -help \u5217\u51FA\u53EF\u80FD\u7684\u9009\u9879 + +@@ -59,7 +57,7 @@ + + main.opt.bootclasspath=\ -bootclasspath <path> \u8986\u76D6\u5F15\u5BFC\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E + +-main.opt.constants=\ -constants \u663E\u793A\u9759\u6001\u6700\u7EC8\u5E38\u91CF ++main.opt.constants=\ -constants \u663E\u793A\u6700\u7EC8\u5E38\u91CF + + + main.opt.sysinfo=\ -sysinfo \u663E\u793A\u6B63\u5728\u5904\u7406\u7684\u7C7B\u7684\n \u7CFB\u7EDF\u4FE1\u606F (\u8DEF\u5F84, \u5927\u5C0F, \u65E5\u671F, MD5 \u6563\u5217) +--- ./langtools/src/share/classes/com/sun/tools/jdeps/resources/jdeps_ja.properties Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/jdeps/resources/jdeps_ja.properties Wed Jul 30 03:55:11 2014 -0700 +@@ -11,7 +11,7 @@ + + main.opt.v=\ -v -verbose \u30AF\u30E9\u30B9\u30FB\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u3059\u3079\u3066\u51FA\u529B\u3057\u307E\u3059\n -verbose:package \u30D1\u30C3\u30B1\u30FC\u30B8\u30FB\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u51FA\u529B\u3057\u307E\u3059\n (\u540C\u3058\u30A2\u30FC\u30AB\u30A4\u30D6\u5185\u306E\u4F9D\u5B58\u6027\u3092\u9664\u304F)\n -verbose:class \u30AF\u30E9\u30B9\u30FB\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u51FA\u529B\u3057\u307E\u3059\n (\u540C\u3058\u30A2\u30FC\u30AB\u30A4\u30D6\u5185\u306E\u4F9D\u5B58\u6027\u3092\u9664\u304F) + +-main.opt.s=\ -s -summary \u4F9D\u5B58\u6027\u306E\u8981\u7D04\u306E\u307F\u51FA\u529B\u3057\u307E\u3059 ++main.opt.s=\ -s -summary \u4F9D\u5B58\u6027\u306E\u30B5\u30DE\u30EA\u30FC\u306E\u307F\u51FA\u529B\u3057\u307E\u3059 + + main.opt.p=\ -p <pkgname> -package <pkgname> \u6307\u5B9A\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u5185\u306E\u4F9D\u5B58\u6027\u3092\u691C\u51FA\u3057\u307E\u3059\n (\u8907\u6570\u56DE\u6307\u5B9A\u53EF\u80FD) + +--- ./langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/sjavac/server/CompilerThread.java Wed Jul 30 03:55:11 2014 -0700 +@@ -49,6 +49,7 @@ + import com.sun.tools.javac.util.Context; + import com.sun.tools.javac.util.Log; + import com.sun.tools.javac.util.BaseFileManager; ++import com.sun.tools.javac.util.StringUtils; + import com.sun.tools.sjavac.comp.Dependencies; + import com.sun.tools.sjavac.comp.JavaCompilerWithDeps; + import com.sun.tools.sjavac.comp.SmartFileManager; +@@ -256,7 +257,7 @@ + // Load visible sources + Set<URI> visibleSources = new HashSet<URI>(); + boolean fix_drive_letter_case = +- System.getProperty("os.name").toLowerCase().startsWith("windows"); ++ StringUtils.toLowerCase(System.getProperty("os.name")).startsWith("windows"); + for (;;) { + String l = in.readLine(); + if (l == null) +--- ./langtools/test/Makefile Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/Makefile Wed Jul 30 03:55:11 2014 -0700 +@@ -186,6 +186,12 @@ + JTREG_OPTIONS += -timeoutFactor:$(JTREG_TIMEOUT_FACTOR) + endif + ++# Default verbosity setting for jtreg ++JTREG_VERBOSE = fail,error,nopass ++ ++# Default verbosity setting for jck ++JCK_VERBOSE = non-pass ++ + # Assertions: some tests show failures when assertions are enabled. + # Since javac is typically loaded via the bootclassloader (either via TESTJAVA + # or TESTBOOTCLASSPATH), you may need -esa to enable assertions in javac. +@@ -256,6 +262,8 @@ + # Version of java used to run jtreg. Should normally be the same as TESTJAVA + # TESTJAVA + # Version of java to be tested. ++# JTREG_VERBOSE ++# Verbosity setting for jtreg + # JTREG_OPTIONS + # Additional options for jtreg + # JTREG_TESTDIRS +@@ -273,7 +281,7 @@ + JT_JAVA=$(JT_JAVA) $(JTREG) \ + -J-Xmx512m \ + -vmoption:-Xmx768m \ +- -a -ignore:quiet -v:fail,error,nopass \ ++ -a -ignore:quiet $(if $(JTREG_VERBOSE),-v:$(JTREG_VERBOSE)) \ + -r:$(JTREG_OUTPUT_DIR)/JTreport \ + -w:$(JTREG_OUTPUT_DIR)/JTwork \ + -jdk:$(TESTJAVA) \ +@@ -312,6 +320,8 @@ + # Default is JDK 7 + # TESTJAVA + # Version of java to be tested. ++# JCK_VERBOSE ++# Verbosity setting for jtjck + # JCK_COMPILER_OPTIONS + # Additional options for JCK-compiler + # JCK_COMPILER_TESTDIRS +@@ -325,9 +335,9 @@ + @rm -f -r $(JCK_COMPILER_OUTPUT_DIR)/work $(JCK_COMPILER_OUTPUT_DIR)/report \ + $(JCK_COMPILER_OUTPUT_DIR)/diff.html $(JCK_COMPILER_OUTPUT_DIR)/status.txt + @mkdir -p $(JCK_COMPILER_OUTPUT_DIR) +- $(JT_JAVA)/bin/java -XX:MaxPermSize=256m -Xmx512m \ ++ $(JT_JAVA)/bin/java -Xmx512m \ + -jar $(JCK_HOME)/JCK-compiler-8/lib/jtjck.jar \ +- -v:non-pass \ ++ $(if $(JCK_VERBOSE),-v:$(JCK_VERBOSE)) \ + -r:$(JCK_COMPILER_OUTPUT_DIR)/report \ + -w:$(JCK_COMPILER_OUTPUT_DIR)/work \ + -jdk:$(TESTJAVA) \ +@@ -361,6 +371,8 @@ + # Version of java used to run JCK. Should normally be the same as TESTJAVA + # TESTJAVA + # Version of java to be tested. ++# JCK_VERBOSE ++# Verbosity setting for jtjck + # JCK_RUNTIME_OPTIONS + # Additional options for JCK-runtime + # JCK_RUNTIME_TESTDIRS +@@ -374,9 +386,9 @@ + @rm -f -r $(JCK_RUNTIME_OUTPUT_DIR)/work $(JCK_RUNTIME_OUTPUT_DIR)/report \ + $(JCK_RUNTIME_OUTPUT_DIR)/diff.html $(JCK_RUNTIME_OUTPUT_DIR)/status.txt + @mkdir -p $(JCK_RUNTIME_OUTPUT_DIR) +- $(JT_JAVA)/bin/java -XX:MaxPermSize=256m -Xmx512m \ ++ $(JT_JAVA)/bin/java -Xmx512m \ + -jar $(JCK_HOME)/JCK-runtime-8/lib/jtjck.jar \ +- -v:non-pass \ ++ $(if $(JCK_VERBOSE),-v:$(JCK_VERBOSE)) \ + -r:$(JCK_RUNTIME_OUTPUT_DIR)/report \ + -w:$(JCK_RUNTIME_OUTPUT_DIR)/work \ + -jdk:$(TESTJAVA) \ +--- ./langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java Wed Jul 30 03:55:11 2014 -0700 +@@ -23,18 +23,20 @@ + + /* + * @test +- * @bug 4720957 5020118 8026567 ++ * @bug 4720957 5020118 8026567 8038976 + * @summary Test to make sure that -link and -linkoffline link to +- * right files. ++ * right files, and URLs with and without trailing slash are accepted. + * @author jamieh + * @library ../lib/ + * @build JavadocTester TestLinkOption + * @run main TestLinkOption + */ + ++import java.io.File; ++ + public class TestLinkOption extends JavadocTester { + +- private static final String BUG_ID = "4720957-5020118"; ++ private static final String BUG_ID = "4720957-5020118-8038976"; + + //Generate the documentation using -linkoffline and a URL as the first parameter. + private static final String[] ARGS1 = new String[] { +@@ -83,7 +85,34 @@ + } + }; + private static final String[][] NEGATED_TEST2 = NO_TEST; +- ++ /* ++ * Create the documentation using the -link option, vary the behavior with ++ * both trailing and no trailing slash. We are only interested in ensuring ++ * that the command executes with no errors or related warnings. ++ */ ++ static String[] createArguments(boolean withTrailingSlash) { ++ String packagePath = new File(BUG_ID + "-1").getAbsolutePath(); ++ String outputDirName = BUG_ID; ++ if (withTrailingSlash) { ++ // add the trailing slash, if it is not present! ++ if (!packagePath.endsWith(FS)) { ++ packagePath = packagePath + FS; ++ } ++ outputDirName = outputDirName + "-3"; ++ } else { ++ // remove the trailing slash, if it is present! ++ if (packagePath.endsWith(FS)) { ++ packagePath = packagePath.substring(0, packagePath.length() - 1); ++ } ++ outputDirName = outputDirName + "-4"; ++ } ++ String args[] = { ++ "-d", outputDirName, "-sourcepath", SRC_DIR, ++ "-link", "file:///" + packagePath, "-package", "pkg2" ++ }; ++ System.out.println("packagePath: " + packagePath); ++ return args; ++ } + /** + * The entry point of the test. + * @param args the array of command line arguments. +@@ -92,6 +121,12 @@ + TestLinkOption tester = new TestLinkOption(); + run(tester, ARGS1, TEST1, NEGATED_TEST1); + run(tester, ARGS2, TEST2, NEGATED_TEST2); ++ tester.runJavadoc(createArguments(true)); // with trailing slash ++ tester.runJavadoc(createArguments(false)); // without trailing slash ++ tester.printSummary(); ++ if (tester.getWarningOutput().contains("warning - Error fetching URL")) { ++ throw new Error("URL rejected ?"); ++ } + tester.printSummary(); + } + +--- ./langtools/test/com/sun/javadoc/testRelativeLinks/TestRelativeLinks.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/com/sun/javadoc/testRelativeLinks/TestRelativeLinks.java Wed Jul 30 03:55:11 2014 -0700 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 4460354 8014636 ++ * @bug 4460354 8014636 8043186 + * @summary Test to make sure that relative paths are redirected in the + * output so that they are not broken. + * @author jamieh +--- ./langtools/test/com/sun/javadoc/testRelativeLinks/pkg/C.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/com/sun/javadoc/testRelativeLinks/pkg/C.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2004, 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 +@@ -30,7 +30,7 @@ + public class C { + + /** +- * Here is a relative link in a field: ++ * Here is a relative link in a field:\u0130 + * <a href="relative-field-link.html">relative field link</a>. + */ + public C field = null; +--- ./langtools/test/com/sun/javadoc/testTopOption/TestTopOption.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/com/sun/javadoc/testTopOption/TestTopOption.java Wed Jul 30 03:55:11 2014 -0700 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 6227616 ++ * @bug 6227616 8043186 + * @summary Test the new -top option. + * @author jamieh + * @library ../lib/ +@@ -39,7 +39,7 @@ + + //Javadoc arguments. + private static final String[] ARGS = new String[] { +- "-overview", "SRC_DIR + FS + overview.html", "-use", "-top", "TOP TEXT", "-d", BUG_ID, "-sourcepath", ++ "-overview", SRC_DIR + FS + "overview.html", "-use", "-top", "\u0130{@docroot}TOP TEXT", "-d", BUG_ID, "-sourcepath", + SRC_DIR, "pkg" + }; + +--- ./langtools/test/tools/javac/AnonymousSubclassTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/AnonymousSubclassTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,91 @@ ++/* ++ * 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 8023945 ++ * @summary javac wrongly allows a subclass of an anonymous class ++ * @library /tools/javac/lib ++ * @build ToolBox ++ * @run main AnonymousSubclassTest ++ */ ++ ++import java.util.ArrayList; ++import java.io.IOException; ++ ++public class AnonymousSubclassTest { ++ public static void main(String... args) throws Exception { ++ new AnonymousSubclassTest().run(); ++ } ++ ++ // To trigger the error we want, first we need to compile ++ // a class with an anonymous inner class: Foo$1. ++ final String foo = ++ "public class Foo {" + ++ " void m() { Foo f = new Foo() {}; }" + ++ "}"; ++ ++ // Then, we try to subclass the anonymous class ++ // Note: we must do this in two classes because a different ++ // error will be generated if we don't load Foo$1 through the ++ // class reader. ++ final String test1 = ++ "public class Test1 {" + ++ " void m() {"+ ++ " Foo f1 = new Foo();"+ ++ " Foo f2 = new Foo$1(f1) {};"+ ++ " }" + ++ "}"; ++ ++ final String test2 = ++ "public class Test2 {" + ++ " class T extends Foo$1 {" + ++ " public T(Foo f) { super(f); }" + ++ " }"+ ++ "}"; ++ ++ void compOk(String code) throws Exception { ++ ToolBox.javac(new ToolBox.JavaToolArgs().setSources(code)); ++ } ++ ++ void compFail(String code) throws Exception { ++ ArrayList<String> errors = new ArrayList<>(); ++ ToolBox.JavaToolArgs args = new ToolBox.JavaToolArgs(); ++ args.setSources(code) ++ .appendArgs("-cp", ".", "-XDrawDiagnostics") ++ .set(ToolBox.Expect.FAIL) ++ .setErrOutput(errors); ++ ToolBox.javac(args); ++ ++ if (!errors.get(0).contains("cant.inherit.from.anon")) { ++ System.out.println(errors.get(0)); ++ throw new Exception("test failed"); ++ } ++ } ++ ++ void run() throws Exception { ++ compOk(foo); ++ compFail(test1); ++ compFail(test2); ++ } ++} +--- ./langtools/test/tools/javac/DefiniteAssignment/T8039026.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/DefiniteAssignment/T8039026.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,21 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8039026 ++ * @summary Definitely unassigned field can be accessed ++ * @compile/fail/ref=T8039026.out -XDrawDiagnostics T8039026.java ++ */ ++ ++public class T8039026 { ++ final int x,y,z; ++ final int a = this.y; // <- error ++ { ++ int b = true ? this.x : 0; // <- error ++ System.out.println(this.x); // <- error ++ this.y = 1; ++ } ++ T8039026() { ++ this.x = 1; // <- no error! ++ this.y = 1; // <- error ++ this.z = this.x; // <- no error ++ } ++} +--- ./langtools/test/tools/javac/DefiniteAssignment/T8039026.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/DefiniteAssignment/T8039026.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,4 @@ ++T8039026.java:10:23: compiler.err.var.might.not.have.been.initialized: y ++T8039026.java:12:28: compiler.err.var.might.not.have.been.initialized: x ++T8039026.java:18:13: compiler.err.var.might.already.be.assigned: y ++3 errors +--- ./langtools/test/tools/javac/IncorrectInheritance/IncorrectInheritanceTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/IncorrectInheritance/IncorrectInheritanceTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,68 @@ ++/* ++ * 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 8034924 ++ * @summary Incorrect inheritance of inaccessible static method ++ * @library /tools/javac/lib ++ * @build ToolBox ++ * @run main IncorrectInheritanceTest ++ */ ++ ++public class IncorrectInheritanceTest { ++ private static final String ASrc = ++ "package pkg;\n" + ++ "\n" + ++ "public class A {\n" + ++ " static void foo(Object o) {}\n" + ++ " private static void bar(Object o) {}\n" + ++ "}"; ++ ++ private static final String BSrc = ++ "import pkg.A;\n" + ++ "class B extends A {\n" + ++ " public void foo(Object o) {}\n" + ++ " public void bar(Object o) {}\n" + ++ "}"; ++ ++ private static final String CSrc = ++ "class C extends B {\n" + ++ " public void m(Object o) {\n" + ++ " foo(o);\n" + ++ " bar(o);\n" + ++ " }\n" + ++ "}"; ++ ++ public static void main(String[] args) throws Exception { ++ new IncorrectInheritanceTest().test(); ++ } ++ ++ public void test() throws Exception { ++ ToolBox.JavaToolArgs javacParams = ++ new ToolBox.JavaToolArgs() ++ .setSources(ASrc, BSrc, CSrc); ++ ToolBox.javac(javacParams); ++ } ++ ++} +--- ./langtools/test/tools/javac/NoStringToLower.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/NoStringToLower.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,136 @@ ++/* ++ * Copyright (c) 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. ++ */ ++ ++/* ++ * @test ++ * @bug 8029800 ++ * @summary String.toLowerCase()/toUpperCase is generally dangerous, check it is not used in langtools ++ */ ++ ++import java.io.*; ++import java.util.*; ++import javax.tools.*; ++import com.sun.tools.classfile.*; ++import com.sun.tools.classfile.ConstantPool.CONSTANT_Methodref_info; ++ ++public class NoStringToLower { ++ public static void main(String... args) throws Exception { ++ NoStringToLower c = new NoStringToLower(); ++ if (c.run(args)) ++ return; ++ ++ if (is_jtreg()) ++ throw new Exception(c.errors + " errors occurred"); ++ else ++ System.exit(1); ++ } ++ ++ static boolean is_jtreg() { ++ return (System.getProperty("test.src") != null); ++ } ++ ++ /** ++ * Main entry point. ++ */ ++ boolean run(String... args) throws Exception { ++ JavaCompiler c = ToolProvider.getSystemJavaCompiler(); ++ JavaFileManager fm = c.getStandardFileManager(null, null, null); ++ JavaFileManager.Location javacLoc = findJavacLocation(fm); ++ String[] pkgs = { ++ "javax.annotation.processing", ++ "javax.lang.model", ++ "javax.tools", ++ "com.sun.source", ++ "com.sun.tools.classfile", ++ "com.sun.tools.doclet", ++ "com.sun.tools.doclint", ++ "com.sun.tools.javac", ++ "com.sun.tools.javadoc", ++ "com.sun.tools.javah", ++ "com.sun.tools.javap", ++ "com.sun.tools.jdeps", ++ "com.sun.tools.sjavac" ++ }; ++ for (String pkg: pkgs) { ++ for (JavaFileObject fo: fm.list(javacLoc, ++ pkg, EnumSet.of(JavaFileObject.Kind.CLASS), true)) { ++ scan(fo); ++ } ++ } ++ ++ return (errors == 0); ++ } ++ ++ // depending on how the test is run, javac may be on bootclasspath or classpath ++ JavaFileManager.Location findJavacLocation(JavaFileManager fm) { ++ JavaFileManager.Location[] locns = ++ { StandardLocation.PLATFORM_CLASS_PATH, StandardLocation.CLASS_PATH }; ++ try { ++ for (JavaFileManager.Location l: locns) { ++ JavaFileObject fo = fm.getJavaFileForInput(l, ++ "com.sun.tools.javac.Main", JavaFileObject.Kind.CLASS); ++ if (fo != null) ++ return l; ++ } ++ } catch (IOException e) { ++ throw new Error(e); ++ } ++ throw new IllegalStateException("Cannot find javac"); ++ } ++ ++ /** ++ * Verify there are no references to String.toLowerCase() in a class file. ++ */ ++ void scan(JavaFileObject fo) throws IOException { ++ InputStream in = fo.openInputStream(); ++ try { ++ ClassFile cf = ClassFile.read(in); ++ for (ConstantPool.CPInfo cpinfo: cf.constant_pool.entries()) { ++ if (cpinfo.getTag() == ConstantPool.CONSTANT_Methodref) { ++ CONSTANT_Methodref_info ref = (CONSTANT_Methodref_info) cpinfo; ++ String methodDesc = ref.getClassInfo().getName() + "." + ref.getNameAndTypeInfo().getName() + ":" + ref.getNameAndTypeInfo().getType(); ++ ++ if ("java/lang/String.toLowerCase:()Ljava/lang/String;".equals(methodDesc)) { ++ error("found reference to String.toLowerCase() in: " + fo.getName()); ++ } ++ if ("java/lang/String.toUpperCase:()Ljava/lang/String;".equals(methodDesc)) { ++ error("found reference to String.toLowerCase() in: " + fo.getName()); ++ } ++ } ++ } ++ } catch (ConstantPoolException ignore) { ++ } finally { ++ in.close(); ++ } ++ } ++ ++ /** ++ * Report an error. ++ */ ++ void error(String msg) { ++ System.err.println("Error: " + msg); ++ errors++; ++ } ++ ++ int errors; ++} +--- ./langtools/test/tools/javac/T8029002/MultipleUpperBoundsIncorporationTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8029002/MultipleUpperBoundsIncorporationTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,72 @@ ++/* ++ * 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 8029002 ++ * @summary javac should take multiple upper bounds into account in incorporation ++ * @compile MultipleUpperBoundsIncorporationTest.java ++ */ ++ ++import java.util.ArrayList; ++import java.util.List; ++ ++public class MultipleUpperBoundsIncorporationTest { ++ ++ static class TestCase1 { ++ interface Task<E extends Exception> {} ++ ++ class Comparator<T> {} ++ ++ class CustomException extends Exception {} ++ ++ class TaskQueue<E extends Exception, T extends Task<E>> {} ++ ++ abstract class Test { ++ abstract <E extends Exception, T extends Task<E>> TaskQueue<E, T> create(Comparator<? super T> comparator); ++ ++ void f(Comparator<Task<CustomException>> comp) { ++ TaskQueue<CustomException, Task<CustomException>> queue = create(comp); ++ queue.getClass(); ++ } ++ } ++ } ++ ++ static class TestCase2 { ++ public <T, E extends List<T>> E typedNull() { ++ return null; ++ } ++ ++ public void call() { ++ ArrayList<String> list = typedNull(); ++ } ++ } ++ ++ static class TestCase3 { ++ interface I extends Iterable<String> {} ++ ++ <T, Exp extends Iterable<T>> Exp typedNull() { return null; } ++ I i = typedNull(); ++ } ++ ++} +--- ./langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,241 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8029102 ++ * @summary Enhance compiler warnings for Lambda ++ * Checks that the warning for accessing non public members of a class is ++ * fired correctly. ++ * @compile/fail/ref=WarnSerializableLambdaTest.out -XDrawDiagnostics -Werror -XDwarnOnAccessToSensitiveMembers WarnSerializableLambdaTest.java ++ */ ++ ++import java.io.Serializable; ++ ++public class WarnSerializableLambdaTest { ++ ++ void warnLambda() throws Exception { ++ SAM t3 = (SAM & Serializable)WarnSerializableLambdaTest::packageClassMethod; ++ SAM t4 = (SAM & Serializable)WarnSerializableLambdaTest::protectedClassMethod; ++ SAM t5 = (SAM & Serializable)WarnSerializableLambdaTest::privateClassMethod; ++ ++ WarnSerializableLambdaTest test = new WarnSerializableLambdaTest(); ++ SAM t6 = (SAM & Serializable)test::packageInstanceMethod; ++ SAM t7 = (SAM & Serializable)test::protectedInstanceMethod; ++ SAM t8 = (SAM & Serializable)test::privateInstanceMethod; ++ ++ SAM t9 = (SAM & Serializable) c -> { ++ ++ WarnSerializableLambdaTest.staticPackageField = ""; ++ WarnSerializableLambdaTest.staticProtectedField = ""; ++ WarnSerializableLambdaTest.staticPrivateField = ""; ++ ++ packageField = ""; ++ protectedField = ""; ++ privateField = ""; ++ ++ WarnSerializableLambdaTest.packageClassMethod(null); ++ WarnSerializableLambdaTest.protectedClassMethod(null); ++ WarnSerializableLambdaTest.privateClassMethod(null); ++ ++ packageInstanceMethod(null); ++ protectedInstanceMethod(null); ++ privateInstanceMethod(null); ++ ++ PrivateClass.effectivelyNonPublicStaticField = ""; ++ PrivateClass.effectivelyNonPublicClassMethod(); ++ ++ PrivateClass p = new PrivateClass(); ++ p.effectivelyNonPublicInstanceField = ""; ++ p.effectivelyNonPublicInstanceMethod(); ++ ++ return null; ++ }; ++ } ++ ++ private void warnAnoInnerClass() throws Exception { ++ new SerializableDesc() { ++ public void m(Object param) throws Exception { ++ WarnSerializableLambdaTest.staticPackageField = ""; ++ WarnSerializableLambdaTest.staticProtectedField = ""; ++ WarnSerializableLambdaTest.staticPrivateField = ""; ++ ++ packageField = ""; ++ protectedField = ""; ++ privateField = ""; ++ ++ WarnSerializableLambdaTest.packageClassMethod(null); ++ WarnSerializableLambdaTest.protectedClassMethod(null); ++ WarnSerializableLambdaTest.privateClassMethod(null); ++ ++ packageInstanceMethod(null); ++ protectedInstanceMethod(null); ++ privateInstanceMethod(null); ++ ++ PrivateClass.effectivelyNonPublicStaticField = ""; ++ PrivateClass.effectivelyNonPublicClassMethod(); ++ ++ PrivateClass p = new PrivateClass(); ++ p.effectivelyNonPublicInstanceField = ""; ++ p.effectivelyNonPublicInstanceMethod(); ++ } ++ }; ++ } ++ ++ void dontWarnLambda() throws Exception { ++ SAM t1 = (SAM & Serializable)WarnSerializableLambdaTest::publicClassMethod; ++ ++ WarnSerializableLambdaTest test = new WarnSerializableLambdaTest(); ++ SAM t2 = (SAM & Serializable)test::publicInstanceMethod; ++ ++ int[] buffer = {0}; ++ ++ SAM t3 = (SAM & Serializable) param -> { ++ Object localVar; ++ localVar = null; ++ param = null; ++ ++ WarnSerializableLambdaTest.staticPublicField = ""; ++ publicField = ""; ++ WarnSerializableLambdaTest.publicClassMethod(null); ++ publicInstanceMethod(null); ++ ++ PublicClass.effectivelyPublicStaticField = ""; ++ PublicClass.effectivelyPublicClassMethod(); ++ ++ PublicClass p = new PublicClass(); ++ p.effectivelyPublicInstanceField = ""; ++ p.effectivelyPublicInstanceMethod(); ++ ++ int l = buffer.length; ++ ++ return null; ++ }; ++ } ++ ++ private void dontWarnAnoInnerClass() throws Exception { ++ final int[] buffer = {0}; ++ new SerializableDesc() { ++ public void m(Object param) throws Exception { ++ Object localVar; ++ localVar = null; ++ param = null; ++ ++ WarnSerializableLambdaTest.staticPublicField = ""; ++ publicField = ""; ++ WarnSerializableLambdaTest.publicClassMethod(null); ++ publicInstanceMethod(null); ++ ++ PublicClass.effectivelyPublicStaticField = ""; ++ PublicClass.effectivelyPublicClassMethod(); ++ ++ PublicClass p = new PublicClass(); ++ p.effectivelyPublicInstanceField = ""; ++ p.effectivelyPublicInstanceMethod(); ++ ++ int l = buffer.length; ++ } ++ }; ++ } ++ ++ enum WarnEnum { ++ A { ++ public void m() throws Exception { ++ WarnSerializableLambdaTest.staticPackageField = ""; ++ WarnSerializableLambdaTest.staticProtectedField = ""; ++ WarnSerializableLambdaTest.staticPrivateField = ""; ++ ++ WarnSerializableLambdaTest test = ++ new WarnSerializableLambdaTest(); ++ ++ test.packageField = ""; ++ test.protectedField = ""; ++ test.privateField = ""; ++ ++ WarnSerializableLambdaTest.packageClassMethod(null); ++ WarnSerializableLambdaTest.protectedClassMethod(null); ++ WarnSerializableLambdaTest.privateClassMethod(null); ++ ++ test.packageInstanceMethod(null); ++ test.protectedInstanceMethod(null); ++ test.privateInstanceMethod(null); ++ ++ PrivateClass.effectivelyNonPublicStaticField = ""; ++ PrivateClass.effectivelyNonPublicClassMethod(); ++ ++ PrivateClass p = new PrivateClass(); ++ p.effectivelyNonPublicInstanceField = ""; ++ p.effectivelyNonPublicInstanceMethod(); ++ } ++ }; ++ ++ public void m() throws Exception {} ++ } ++ ++ static String staticPackageField; ++ static private String staticPrivateField; ++ static protected String staticProtectedField; ++ static public String staticPublicField; ++ ++ String packageField; ++ private String privateField; ++ protected String protectedField; ++ public String publicField; ++ ++ static Object packageClassMethod(String s) { ++ return null; ++ } ++ ++ static private Object privateClassMethod(String s) { ++ return null; ++ } ++ ++ static protected Object protectedClassMethod(String s) { ++ return null; ++ } ++ ++ static public Object publicClassMethod(String s) { ++ return null; ++ } ++ ++ Object packageInstanceMethod(String s) { ++ return null; ++ } ++ ++ protected Object protectedInstanceMethod(String s) { ++ return null; ++ } ++ ++ private Object privateInstanceMethod(String s) { ++ return null; ++ } ++ ++ public Object publicInstanceMethod(String s) { ++ return null; ++ } ++ ++ interface SAM { ++ Object apply(String s) throws Exception; ++ } ++ ++ interface SAM2 { ++ Object apply(String arg1, String arg2); ++ } ++ ++ class SerializableDesc implements Serializable { ++ public void m(Object param) throws Exception {} ++ } ++ ++ static private class PrivateClass { ++ static public String effectivelyNonPublicStaticField; ++ public String effectivelyNonPublicInstanceField; ++ ++ static public void effectivelyNonPublicClassMethod() {} ++ public void effectivelyNonPublicInstanceMethod() {} ++ } ++ ++ static public class PublicClass { ++ static public String effectivelyPublicStaticField; ++ public String effectivelyPublicInstanceField; ++ ++ static public void effectivelyPublicClassMethod() {} ++ public void effectivelyPublicInstanceMethod() {} ++ } ++} +--- ./langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,57 @@ ++WarnSerializableLambdaTest.java:15:38: compiler.warn.access.to.sensitive.member.from.serializable.element: packageClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:16:38: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:17:38: compiler.warn.access.to.sensitive.member.from.serializable.element: privateClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:20:38: compiler.warn.access.to.sensitive.member.from.serializable.element: packageInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:21:38: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:22:38: compiler.warn.access.to.sensitive.member.from.serializable.element: privateInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:26:39: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPackageField ++WarnSerializableLambdaTest.java:27:39: compiler.warn.access.to.sensitive.member.from.serializable.element: staticProtectedField ++WarnSerializableLambdaTest.java:28:39: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPrivateField ++WarnSerializableLambdaTest.java:30:13: compiler.warn.access.to.sensitive.member.from.serializable.element: packageField ++WarnSerializableLambdaTest.java:31:13: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedField ++WarnSerializableLambdaTest.java:32:13: compiler.warn.access.to.sensitive.member.from.serializable.element: privateField ++WarnSerializableLambdaTest.java:34:39: compiler.warn.access.to.sensitive.member.from.serializable.element: packageClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:35:39: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:36:39: compiler.warn.access.to.sensitive.member.from.serializable.element: privateClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:38:13: compiler.warn.access.to.sensitive.member.from.serializable.element: packageInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:39:13: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:40:13: compiler.warn.access.to.sensitive.member.from.serializable.element: privateInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:42:25: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicStaticField ++WarnSerializableLambdaTest.java:43:25: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicClassMethod() ++WarnSerializableLambdaTest.java:46:14: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceField ++WarnSerializableLambdaTest.java:47:14: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceMethod() ++WarnSerializableLambdaTest.java:56:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPackageField ++WarnSerializableLambdaTest.java:57:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticProtectedField ++WarnSerializableLambdaTest.java:58:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPrivateField ++WarnSerializableLambdaTest.java:60:17: compiler.warn.access.to.sensitive.member.from.serializable.element: packageField ++WarnSerializableLambdaTest.java:61:17: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedField ++WarnSerializableLambdaTest.java:62:17: compiler.warn.access.to.sensitive.member.from.serializable.element: privateField ++WarnSerializableLambdaTest.java:64:43: compiler.warn.access.to.sensitive.member.from.serializable.element: packageClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:65:43: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:66:43: compiler.warn.access.to.sensitive.member.from.serializable.element: privateClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:68:17: compiler.warn.access.to.sensitive.member.from.serializable.element: packageInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:69:17: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:70:17: compiler.warn.access.to.sensitive.member.from.serializable.element: privateInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:72:29: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicStaticField ++WarnSerializableLambdaTest.java:73:29: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicClassMethod() ++WarnSerializableLambdaTest.java:76:18: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceField ++WarnSerializableLambdaTest.java:77:18: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceMethod() ++WarnSerializableLambdaTest.java:141:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPackageField ++WarnSerializableLambdaTest.java:142:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticProtectedField ++WarnSerializableLambdaTest.java:143:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPrivateField ++WarnSerializableLambdaTest.java:148:21: compiler.warn.access.to.sensitive.member.from.serializable.element: packageField ++WarnSerializableLambdaTest.java:149:21: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedField ++WarnSerializableLambdaTest.java:150:21: compiler.warn.access.to.sensitive.member.from.serializable.element: privateField ++WarnSerializableLambdaTest.java:152:43: compiler.warn.access.to.sensitive.member.from.serializable.element: packageClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:153:43: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:154:43: compiler.warn.access.to.sensitive.member.from.serializable.element: privateClassMethod(java.lang.String) ++WarnSerializableLambdaTest.java:156:21: compiler.warn.access.to.sensitive.member.from.serializable.element: packageInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:157:21: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:158:21: compiler.warn.access.to.sensitive.member.from.serializable.element: privateInstanceMethod(java.lang.String) ++WarnSerializableLambdaTest.java:160:29: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicStaticField ++WarnSerializableLambdaTest.java:161:29: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicClassMethod() ++WarnSerializableLambdaTest.java:164:18: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceField ++WarnSerializableLambdaTest.java:165:18: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceMethod() ++- compiler.err.warnings.and.werror ++1 error ++54 warnings +--- ./langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,56 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8029102 ++ * @summary Enhance compiler warnings for Lambda ++ * Checks that the warning for accessing non public members of a class is ++ * fired correctly. ++ * @compile/fail/ref=WarnSerializableLambdaTestb.out -XDrawDiagnostics -Werror -XDwarnOnAccessToSensitiveMembers WarnSerializableLambdaTestb.java ++ */ ++ ++import java.io.Serializable; ++ ++public class WarnSerializableLambdaTestb { ++ public void foo(Secret1 secret) { ++ Object o = (Runnable & java.io.Serializable) () -> { secret.test(); }; ++ } ++ ++ public void bar(Secret2 secret) { ++ Object o = (Runnable & java.io.Serializable) () -> { secret.test(); }; ++ } ++ ++ private class Secret1 { ++ public void test() {} ++ } ++ ++ static private class Secret2 { ++ public void test() {} ++ } ++ ++ class TestInner { ++ private int j = 0; ++ void m() { ++ Serializable s = new Serializable() { ++ int i; ++ void m() { ++ i = 0; // don't warn ++ System.out.println(j); //warn ++ } ++ }; ++ } ++ } ++ ++ class TestInner2 { ++ class W implements Serializable { ++ public int p = 0; ++ class I { ++ public int r = 0; ++ class K implements Serializable { ++ void m() { ++ p = 1; // don't warn owner is serializable ++ r = 2; // warn owner is not serializable ++ } ++ } ++ } ++ } ++ } ++} +--- ./langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,7 @@ ++WarnSerializableLambdaTestb.java:14:69: compiler.warn.access.to.sensitive.member.from.serializable.element: test() ++WarnSerializableLambdaTestb.java:18:69: compiler.warn.access.to.sensitive.member.from.serializable.element: test() ++WarnSerializableLambdaTestb.java:36:40: compiler.warn.access.to.sensitive.member.from.serializable.element: j ++WarnSerializableLambdaTestb.java:50:25: compiler.warn.access.to.sensitive.member.from.serializable.element: r ++- compiler.err.warnings.and.werror ++1 error ++4 warnings +--- ./langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,30 +1,8 @@ + /* +- * Copyright (c) 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. +- */ +- +-/* +- * @test +- * @bug 8029569 ++ * @test /nodynamiccopyright/ ++ * @bug 8029569 8037379 + * @summary internal javac cast exception when resolving varargs ambiguity ++ * fix for JDK-8029569 doesn't cover all possible cases + * @compile/fail/ref=VarargsAmbiguityCrashTest.out -XDrawDiagnostics VarargsAmbiguityCrashTest.java + */ + +--- ./langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -1,2 +1,2 @@ +-VarargsAmbiguityCrashTest.java:33:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(java.lang.Exception...), VarargsAmbiguityCrashTest, kindname.method, m2(java.lang.Long,java.lang.Exception...), VarargsAmbiguityCrashTest ++VarargsAmbiguityCrashTest.java:11:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(java.lang.Exception...), VarargsAmbiguityCrashTest, kindname.method, m2(java.lang.Long,java.lang.Exception...), VarargsAmbiguityCrashTest + 1 error +--- ./langtools/test/tools/javac/T8030816/CrashLambdaExpressionWithNonAccessibleIdTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8030816/CrashLambdaExpressionWithNonAccessibleIdTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,22 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8030816 ++ * @summary javac can't compile program with lambda expression ++ * @compile/fail/ref=CrashLambdaExpressionWithNonAccessibleIdTest.out -XDrawDiagnostics CrashLambdaExpressionWithNonAccessibleIdTest.java ++ */ ++ ++/* This test must make sure that javac won't crash when compiling lambda ++ * containing an anonymous innerclass based on an unresolvable type. ++ */ ++public class CrashLambdaExpressionWithNonAccessibleIdTest { ++ void m() { ++ m1(()-> { ++ new A(){ ++ public void m11() {} ++ }; ++ }); ++ ++ } ++ ++ void m1(Runnable r) {} ++} +--- ./langtools/test/tools/javac/T8030816/CrashLambdaExpressionWithNonAccessibleIdTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8030816/CrashLambdaExpressionWithNonAccessibleIdTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,2 @@ ++CrashLambdaExpressionWithNonAccessibleIdTest.java:14:17: compiler.err.cant.resolve.location: kindname.class, A, , , (compiler.misc.location: kindname.class, CrashLambdaExpressionWithNonAccessibleIdTest, null) ++1 error +--- ./langtools/test/tools/javac/T8038975/AccessTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8038975/AccessTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8038975 ++ * @summary Access control in enhanced for ++ * @compile AccessTest.java ++ */ ++ ++import a.*; ++public class AccessTest { ++ private static class Impl extends B { ++ public void method(Inner inner) { ++ for (A a : inner) ++ System.out.println(a); ++ } ++ } ++} +--- ./langtools/test/tools/javac/T8038975/a/A.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8038975/a/A.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,25 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package a; ++public class A { } +--- ./langtools/test/tools/javac/T8038975/a/B.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/T8038975/a/B.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,27 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package a; ++public class B { ++ protected abstract class Inner implements Iterable<A> { } ++} +--- ./langtools/test/tools/javac/annotations/FinalReceiverTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/annotations/FinalReceiverTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,14 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8027886 ++ * @summary Receiver parameters must not be final ++ * @compile/fail/ref=FinalReceiverTest.out -XDrawDiagnostics FinalReceiverTest.java ++ */ ++ ++class FinalReceiverTest { ++ void m() { ++ class Inner { ++ Inner(final FinalReceiverTest FinalReceiverTest.this) {} ++ } ++ } ++} +--- ./langtools/test/tools/javac/annotations/FinalReceiverTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/annotations/FinalReceiverTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,2 @@ ++FinalReceiverTest.java:11:43: compiler.err.mod.not.allowed.here: final ++1 error +--- ./langtools/test/tools/javac/annotations/LocalInnerReceiverTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/annotations/LocalInnerReceiverTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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. ++ */ ++ ++/* ++ * @test ++ * @bug 8029042 ++ * @summary Receiver parameter not supported on local class constructor ++ * @compile LocalInnerReceiverTest.java ++ */ ++ ++class LocalInnerReceiverTest { ++ void m() { ++ class Inner { ++ Inner(LocalInnerReceiverTest LocalInnerReceiverTest.this) {} ++ } ++ } ++} +--- ./langtools/test/tools/javac/annotations/repeatingAnnotations/8029017/TypeUseTarget.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/annotations/repeatingAnnotations/8029017/TypeUseTarget.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,129 @@ ++/* ++ * 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 8029017 ++ * @summary sanity testing of ElementType validation for repeating annotations ++ * @compile TypeUseTarget.java ++ */ ++ ++import java.lang.annotation.*; ++ ++public class TypeUseTarget {} ++ ++ ++// Case 1: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(Case1Container.class) ++@interface Case1 {} ++ ++@Target({ ++ ElementType.ANNOTATION_TYPE, ++ ElementType.TYPE, ++ ElementType.TYPE_USE, ++ ElementType.TYPE_PARAMETER, ++}) ++@interface Case1Container { ++ Case1[] value(); ++} ++ ++ ++// Case 2: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(Case2Container.class) ++@interface Case2 {} ++ ++@Target({ ++ ElementType.ANNOTATION_TYPE, ++ ElementType.TYPE, ++ ElementType.TYPE_USE, ++}) ++@interface Case2Container { ++ Case2[] value(); ++} ++ ++ ++// Case 3: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(Case3Container.class) ++@interface Case3 {} ++ ++@Target({ ++ ElementType.ANNOTATION_TYPE, ++ ElementType.TYPE, ++}) ++@interface Case3Container { ++ Case3[] value(); ++} ++ ++ ++// Case 4: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(Case4Container.class) ++@interface Case4 {} ++ ++@Target({ ++ ElementType.ANNOTATION_TYPE, ++}) ++@interface Case4Container { ++ Case4[] value(); ++} ++ ++ ++// Case 5: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(Case5Container.class) ++@interface Case5 {} ++ ++@Target({ ++ ElementType.TYPE, ++}) ++@interface Case5Container { ++ Case5[] value(); ++} ++ ++ ++// Case 6: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(Case6Container.class) ++@interface Case6 {} ++ ++@Target({ ++ ElementType.TYPE_PARAMETER, ++}) ++@interface Case6Container { ++ Case6[] value(); ++} +--- ./langtools/test/tools/javac/annotations/repeatingAnnotations/8029017/TypeUseTargetNeg.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/annotations/repeatingAnnotations/8029017/TypeUseTargetNeg.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,100 @@ ++/** ++ * @test /nodynamiccopyright/ ++ * @bug 8029017 ++ * @summary sanity testing of ElementType validation for repeating annotations ++ * @compile/fail/ref=TypeUseTargetNeg.out -XDrawDiagnostics TypeUseTargetNeg.java ++ */ ++ ++import java.lang.annotation.*; ++ ++public class TypeUseTargetNeg {} ++ ++// Case 1: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(FooContainer.class) ++@interface Foo {} ++ ++@Target({ ++ ElementType.ANNOTATION_TYPE, ++ ElementType.TYPE, ++ ElementType.TYPE_USE, ++ ElementType.TYPE_PARAMETER, ++ ElementType.FIELD, ++ ++}) ++@interface FooContainer { ++ Foo[] value(); ++} ++ ++ ++// Case 2: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(BarContainer.class) ++@interface Bar {} ++ ++@Target({ ++ ElementType.ANNOTATION_TYPE, ++ ElementType.TYPE, ++ ElementType.TYPE_USE, ++ ElementType.METHOD, ++}) ++@interface BarContainer { ++ Bar[] value(); ++} ++ ++ ++// Case 3: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(BazContainer.class) ++@interface Baz {} ++ ++@Target({ ++ ElementType.ANNOTATION_TYPE, ++ ElementType.TYPE, ++ ElementType.PARAMETER, ++}) ++@interface BazContainer { ++ Baz[] value(); ++} ++ ++ ++// Case 4: ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@Repeatable(QuxContainer.class) ++@interface Qux {} ++ ++@interface QuxContainer { ++ Qux[] value(); ++} ++ ++ ++// Case 5: ++@Target({}) ++@Repeatable(QuuxContainer.class) ++@interface Quux {} ++ ++@Target({ ++ ElementType.TYPE_PARAMETER, ++}) ++@interface QuuxContainer { ++ Quux[] value(); ++} ++ ++// Case 6: ++@Repeatable(QuuuxContainer.class) ++@interface Quuux {} ++ ++@Target({ ++ ElementType.TYPE_USE, ++}) ++@interface QuuuxContainer { ++ Quuux[] value(); ++} +--- ./langtools/test/tools/javac/annotations/repeatingAnnotations/8029017/TypeUseTargetNeg.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/annotations/repeatingAnnotations/8029017/TypeUseTargetNeg.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,7 @@ ++TypeUseTargetNeg.java:16:1: compiler.err.invalid.repeatable.annotation.incompatible.target: FooContainer, Foo ++TypeUseTargetNeg.java:36:1: compiler.err.invalid.repeatable.annotation.incompatible.target: BarContainer, Bar ++TypeUseTargetNeg.java:54:1: compiler.err.invalid.repeatable.annotation.incompatible.target: BazContainer, Baz ++TypeUseTargetNeg.java:71:1: compiler.err.invalid.repeatable.annotation.incompatible.target: QuxContainer, Qux ++TypeUseTargetNeg.java:81:1: compiler.err.invalid.repeatable.annotation.incompatible.target: QuuxContainer, Quux ++TypeUseTargetNeg.java:92:1: compiler.err.invalid.repeatable.annotation.incompatible.target: QuuuxContainer, Quuux ++6 errors +--- ./langtools/test/tools/javac/annotations/repeatingAnnotations/combo/ReflectionTest.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/annotations/repeatingAnnotations/combo/ReflectionTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -23,7 +23,7 @@ + + /** + * @test +- * @bug 8001457 ++ * @bug 8001457 8027477 + * @author sogoel + * @summary Reflection api tests + * @build Helper +@@ -159,7 +159,12 @@ + "SingleOnSuperContainerAndSingleOnSub_Inherited_Legacy", + "ContainerAndSingleOnSuperSingleOnSub_Inherited_Legacy", + "SingleAnnoWithContainer", +- "SingleOnSuperContainerAndSingleOnSub_Inherited"); ++ "SingleOnSuperContainerAndSingleOnSub_Inherited", ++ "RepeatableOnSuperSingleOnSub_Inherited", ++ "SingleOnSuperRepeatableOnSub_Inherited", ++ "ContainerOnSuperSingleOnSub_Inherited", ++ "SingleOnSuperContainerOnSub_Inherited", ++ "ContainerAndSingleOnSuperSingleOnSub_Inherited"); + if (orderingTestFailures.contains(testCase.toString())) { + CHECKORDERING = false; + } else +@@ -1612,323 +1617,323 @@ + return files; + } + }, +-// // Testcase not working as expected, JDK-8004912 +-// RepeatableOnSuperSingleOnSub_Inherited( +-// "@ExpectedBase(value=Foo.class, " +-// + "getAnnotationVal = \"Foo\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + //override every annotation on superClass +-// "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"Foo\"}, " +-// + // ignores inherited annotations +-// "getDeclAnnoVal = \"Foo\", " // ignores inherited +-// + "getAnnosArgs = {\"Foo\"}, " +-// + "getDeclAnnosArgs = { \"Foo\" })", // ignores inherited +-// "@ExpectedContainer(value=FooContainer.class, " +-// + "getAnnotationVal = \"FooContainer\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"Foo\"}, " +-// + // ignores inherited annotations +-// "getDeclAnnoVal = \"NULL\", " +-// + "getAnnosArgs = {\"FooContainer\"}, " +-// + "getDeclAnnosArgs = {}) // ignores inherited ") { ++ // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest ++ // fail with ordering issues ++ RepeatableOnSuperSingleOnSub_Inherited( ++ "@ExpectedBase(value=Foo.class, " ++ + "getAnnotationVal = \"@Foo(value=3)\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=3)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + //override every annotation on superClass ++ "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=3)\"}, " ++ + // ignores inherited annotations ++ "getDeclAnnoVal = \"@Foo(value=3)\", " // ignores inherited ++ + "getAnnosArgs = {\"@Foo(value=3)\"}, " ++ + "getDeclAnnosArgs = { \"@Foo(value=3)\" })", // ignores inherited ++ "@ExpectedContainer(value=FooContainer.class, " ++ + "getAnnotationVal = \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=3)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=3)\"}, " ++ + // ignores inherited annotations ++ "getDeclAnnoVal = \"NULL\", " ++ + "getAnnosArgs = {\"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosArgs = {}) // ignores inherited ") { + +-// @Override +-// public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, +-// String className) { +-// String anno = ""; +-// String replaceVal = ""; +-// String contents = ""; +-// JavaFileObject srcFileObj = null; +-// Iterable<? extends JavaFileObject> files = null; ++ @Override ++ public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, ++ String className) { ++ String anno = ""; ++ String replaceVal = ""; ++ String contents = ""; ++ JavaFileObject srcFileObj = null; ++ Iterable<? extends JavaFileObject> files = null; + +-// String expectedVals = "\n" + getExpectedBase() + "\n" +-// + getExpectedContainer() + "\n"; +-// StringBuilder commonStmts = getCommonStmts(true); ++ String expectedVals = "\n" + getExpectedBase() + "\n" ++ + getExpectedContainer() + "\n"; ++ StringBuilder commonStmts = getCommonStmts(true); + +-// /* +-// Sample testSrc: +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @Repeatable(FooContainer.class) +-// @interface Foo {int value() default Integer.MAX_VALUE;} ++ /* ++ Sample testSrc: ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @Repeatable(FooContainer.class) ++ @interface Foo {int value() default Integer.MAX_VALUE;} + +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @interface FooContainer { +-// Foo[] value(); +-// } ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @interface FooContainer { ++ Foo[] value(); ++ } + +-// @Foo() @Foo +-// class SuperClass { } ++ @Foo(1) @Foo(2) ++ class SuperClass { } + +-// @ExpectedBase +-// @ExpectedContainer +-// @Foo +-// class SubClass extends SuperClass { } +-// */ +-// //@Inherited only works for classes, no switch cases for method, field, package ++ @ExpectedBase ++ @ExpectedContainer ++ @Foo(3) ++ class SubClass extends SuperClass { } ++ */ ++ //@Inherited only works for classes, no switch cases for method, field, package ++ if (srcType == SrcType.CLASS) { ++ //Contents for SuperClass ++ anno = Helper.ContentVars.REPEATABLEANNO.getVal(); ++ replaceVal = commonStmts + "\n" + anno; ++ String superClassContents = srcType.getTemplate() ++ .replace("#CN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); + +-// if (srcType == SrcType.CLASS) { +-// //Contents for SuperClass +-// anno = Helper.ContentVars.REPEATABLEANNO.getVal(); +-// replaceVal = commonStmts + "\n" + anno; +-// String superClassContents = srcType.getTemplate() +-// .replace("#CN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); ++ //Contents for SubClass that extends SuperClass ++ anno = "@Foo(3)"; ++ replaceVal = expectedVals + "\n" + anno; ++ String subClassContents = SrcType.CLASSEXTENDS.getTemplate() ++ .replace("#CN", className) ++ .replace("#SN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); ++ contents = superClassContents + subClassContents; ++ srcFileObj = Helper.getFile(className, contents); ++ files = Arrays.asList(srcFileObj); ++ } ++ return files; ++ } ++ }, ++ // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest ++ // fail with ordering issues ++ SingleOnSuperRepeatableOnSub_Inherited( ++ "@ExpectedBase(value=Foo.class, " ++ + "getAnnotationVal = \"@Foo(value=0)\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + //override every annotation on superClass ++ "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + // ignores inherited annotations ++ "getDeclAnnoVal = \"NULL\","// ignores inherited ++ + "getAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"}, " ++ + "getDeclAnnosArgs = { \"@Foo(value=1)\", \"@Foo(value=2)\"})", ++ "@ExpectedContainer(value=FooContainer.class, " ++ + "getAnnotationVal = \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + // ignores inherited annotations ++ "getDeclAnnoVal = \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\", "// ignores inherited ++ + "getAnnosArgs = {\"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosArgs = {\"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"})") { + +-// //Contents for SubClass that extends SuperClass +-// anno = "@Foo(0)"; +-// replaceVal = expectedVals + "\n" + anno; +-// String subClassContents = SrcType.CLASSEXTENDS.getTemplate() +-// .replace("#CN", className) +-// .replace("#SN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); +-// contents = superClassContents + subClassContents; +-// srcFileObj = Helper.getFile(className, contents); +-// files = Arrays.asList(srcFileObj); +-// } +-// return files; +-// } +-// }, +-// //Testcase not working as expected, JDK-8004912 +-// SingleOnSuperRepeatableOnSub_Inherited( +-// "@ExpectedBase(value=Foo.class, " +-// + "getAnnotationVal = \"Foo\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + //override every annotation on superClass +-// "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"FooContainer\"}, " +-// + // ignores inherited annotations +-// "getDeclAnnoVal = \"NULL\","// ignores inherited +-// + "getAnnosArgs = {\"Foo\", \"Foo\"}, " +-// + "getDeclAnnosArgs = { \"Foo\", \"Foo\"})", +-// "@ExpectedContainer(value=FooContainer.class, " +-// + "getAnnotationVal = \"FooContainer\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"FooContainer\"}, " +-// + // ignores inherited annotations +-// "getDeclAnnoVal = \"FooContainer\", "// ignores inherited +-// + "getAnnosArgs = {\"FooContainer\"}, " +-// + "getDeclAnnosArgs = {\"FooContainer\"})") { ++ @Override ++ public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, ++ String className) { ++ String anno = ""; ++ String replaceVal = ""; ++ String contents = ""; ++ JavaFileObject srcFileObj = null; ++ Iterable<? extends JavaFileObject> files = null; + +-// @Override +-// public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, +-// String className) { +-// String anno = ""; +-// String replaceVal = ""; +-// String contents = ""; +-// JavaFileObject srcFileObj = null; +-// Iterable<? extends JavaFileObject> files = null; ++ String expectedVals = "\n" + getExpectedBase() + "\n" ++ + getExpectedContainer() + "\n"; ++ StringBuilder commonStmts = getCommonStmts(true); + +-// String expectedVals = "\n" + getExpectedBase() + "\n" +-// + getExpectedContainer() + "\n"; +-// StringBuilder commonStmts = getCommonStmts(true); ++ /* ++ Sample testSrc: ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @Repeatable(FooContainer.class) ++ @interface Foo {int value() default Integer.MAX_VALUE;} + +-// /* +-// Sample testSrc: +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @Repeatable(FooContainer.class) +-// @interface Foo {int value() default Integer.MAX_VALUE;} ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @interface FooContainer { ++ Foo[] value(); ++ } + +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @interface FooContainer { +-// Foo[] value(); +-// } ++ @Foo(0) ++ class SuperClass { } + +-// @Foo() +-// class SuperClass { } ++ @ExpectedBase ++ @ExpectedContainer ++ @Foo(1) @Foo(2) ++ class SubClass extends SuperClass { } ++ */ ++ //@Inherited only works for classes, no switch cases for method, field, package ++ if (srcType == SrcType.CLASS) { ++ //Contents for SuperClass ++ anno = Helper.ContentVars.BASEANNO.getVal(); ++ replaceVal = commonStmts + "\n" + anno; ++ String superClassContents = srcType.getTemplate() ++ .replace("#CN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); + +-// @ExpectedBase +-// @ExpectedContainer +-// @Foo @Foo +-// class SubClass extends SuperClass { } +-// */ ++ //Contents for SubClass that extends SuperClass ++ anno = Helper.ContentVars.REPEATABLEANNO.getVal(); ++ replaceVal = expectedVals + "\n" + anno; ++ String subClassContents = SrcType.CLASSEXTENDS.getTemplate() ++ .replace("#CN", className) ++ .replace("#SN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); + +-// //@Inherited only works for classes, no switch cases for method, field, package +-// if (srcType == SrcType.CLASS) { +-// //Contents for SuperClass +-// anno = "@Foo(0)"; +-// replaceVal = commonStmts + "\n" + anno; +-// String superClassContents = srcType.getTemplate() +-// .replace("#CN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); ++ contents = superClassContents + subClassContents; ++ srcFileObj = Helper.getFile(className, contents); ++ files = Arrays.asList(srcFileObj); ++ } ++ return files; ++ } ++ }, ++ // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest ++ // fail with ordering issues ++ ContainerOnSuperSingleOnSub_Inherited( ++ "@ExpectedBase(value=Foo.class, " ++ + "getAnnotationVal = \"@Foo(value=0)\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," ++ + "getDeclAnnoVal = \"@Foo(value=0)\"," ++ + "getAnnosArgs = {\"@Foo(value=0)\"}," ++ + "getDeclAnnosArgs = {\"@Foo(value=0)\"})", ++ "@ExpectedContainer(value=FooContainer.class, " ++ + "getAnnotationVal = \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," ++ + "getDeclAnnoVal = \"NULL\"," ++ + "getAnnosArgs = {\"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}," ++ + "getDeclAnnosArgs = {})") { + +-// //Contents for SubClass that extends SuperClass +-// anno = Helper.ContentVars.REPEATABLEANNO.getVal(); +-// replaceVal = expectedVals + "\n" + anno; +-// String subClassContents = SrcType.CLASSEXTENDS.getTemplate() +-// .replace("#CN", className) +-// .replace("#SN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); ++ @Override ++ public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, ++ String className) { ++ String anno = ""; ++ String replaceVal = ""; ++ String contents = ""; ++ JavaFileObject srcFileObj = null; ++ Iterable<? extends JavaFileObject> files = null; + +-// contents = superClassContents + subClassContents; +-// srcFileObj = Helper.getFile(className, contents); +-// files = Arrays.asList(srcFileObj); +-// } +-// return files; +-// } +-// }, +-// //Testcase not working as expected, JDK-8004912 +-// ContainerOnSuperSingleOnSub_Inherited( +-// "@ExpectedBase(value=Foo.class, " +-// + "getAnnotationVal = \"Foo\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"Foo\"}," +-// + "getDeclAnnoVal = \"Foo\"," +-// + "getAnnosArgs = {\"Foo\"}," +-// + "getDeclAnnosArgs = {\"Foo\"})", +-// "@ExpectedContainer(value=FooContainer.class, " +-// + "getAnnotationVal = \"FooContainer\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"Foo\"}," +-// + "getDeclAnnoVal = \"NULL\"," +-// + "getAnnosArgs = {\"FooContainer\"}," +-// + "getDeclAnnosArgs = {})") { ++ String expectedVals = "\n" + getExpectedBase() + "\n" ++ + getExpectedContainer() + "\n"; ++ StringBuilder commonStmts = getCommonStmts(true); + +-// @Override +-// public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, +-// String className) { +-// String anno = ""; +-// String replaceVal = ""; +-// String contents = ""; +-// JavaFileObject srcFileObj = null; +-// Iterable<? extends JavaFileObject> files = null; ++ /* ++ Sample testSrc: ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @Repeatable(FooContainer.class) ++ @interface Foo {int value() default Integer.MAX_VALUE;} + +-// String expectedVals = "\n" + getExpectedBase() + "\n" +-// + getExpectedContainer() + "\n"; +-// StringBuilder commonStmts = getCommonStmts(true); ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @interface FooContainer { ++ Foo[] value(); ++ } + +-// /* +-// Sample testSrc: +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @Repeatable(FooContainer.class) +-// @interface Foo {int value() default Integer.MAX_VALUE;} ++ @FooContainer(value = {@Foo(1), @Foo(2)}) ++ class SuperClass { } + +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @interface FooContainer { +-// Foo[] value(); +-// } ++ @ExpectedBase ++ @ExpectedContainer ++ @Foo(0) ++ class SubClass extends SuperClass { } ++ */ ++ //@Inherited only works for classes, no switch cases for method, field, package ++ if (srcType == SrcType.CLASS) { ++ //Contents for SuperClass ++ anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); ++ replaceVal = commonStmts + "\n" + anno; ++ String superClassContents = srcType.getTemplate() ++ .replace("#CN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); + +-// @FooContainer(value = {@Foo, @Foo}) +-// class SuperClass { } ++ //Contents for SubClass that extends SuperClass ++ anno = Helper.ContentVars.BASEANNO.getVal(); ++ replaceVal = expectedVals + "\n" + anno; ++ String subClassContents = SrcType.CLASSEXTENDS.getTemplate() ++ .replace("#CN", className) ++ .replace("#SN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); + +-// @ExpectedBase +-// @ExpectedContainer +-// @Foo +-// class SubClass extends SuperClass { } +-// */ ++ contents = superClassContents + subClassContents; ++ srcFileObj = Helper.getFile(className, contents); ++ files = Arrays.asList(srcFileObj); ++ } ++ return files; ++ } ++ }, ++ // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest ++ // fail with ordering issues ++ SingleOnSuperContainerOnSub_Inherited( ++ "@ExpectedBase(value=Foo.class, " ++ + "getAnnotationVal = \"@Foo(value=0)\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}," ++ + "getDeclAnnoVal = \"NULL\"," ++ + "getAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"}," ++ + "getDeclAnnosArgs = {\"@Foo(value=1)\", \"@Foo(value=2)\"})", ++ "@ExpectedContainer(value=FooContainer.class, " ++ + "getAnnotationVal = \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}," ++ + "getDeclAnnoVal = \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"," ++ + "getAnnosArgs = {\"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}," ++ + "getDeclAnnosArgs = {\"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"})") { + +-// //@Inherited only works for classes, no switch cases for method, field, package +-// if (srcType == SrcType.CLASS) { +-// //Contents for SuperClass +-// anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); +-// replaceVal = commonStmts + "\n" + anno; +-// String superClassContents = srcType.getTemplate() +-// .replace("#CN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); ++ @Override ++ public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, ++ String className) { ++ String anno = ""; ++ String replaceVal = ""; ++ String contents = ""; ++ JavaFileObject srcFileObj = null; ++ Iterable<? extends JavaFileObject> files = null; + +-// //Contents for SubClass that extends SuperClass +-// anno = "@Foo(0)"; +-// replaceVal = expectedVals + "\n" + anno; +-// String subClassContents = SrcType.CLASSEXTENDS.getTemplate() +-// .replace("#CN", className) +-// .replace("#SN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); ++ String expectedVals = "\n" + getExpectedBase() + "\n" ++ + getExpectedContainer() + "\n"; ++ StringBuilder commonStmts = getCommonStmts(true); + +-// contents = superClassContents + subClassContents; +-// srcFileObj = Helper.getFile(className, contents); +-// files = Arrays.asList(srcFileObj); +-// } +-// return files; +-// } +-// }, +-// // TestCase not working as expected, JDK-8004912 +-// SingleOnSuperContainerOnSub_Inherited( +-// "@ExpectedBase(value=Foo.class, " +-// + "getAnnotationVal = \"Foo\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"FooContainer\"}," +-// + "getDeclAnnoVal = \"NULL\"," +-// + "getAnnosArgs = {\"Foo\", \"Foo\"}," +-// + "getDeclAnnosArgs = {\"Foo\", \"Foo\"})", +-// "@ExpectedContainer(value=FooContainer.class, " +-// + "getAnnotationVal = \"FooContainer\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"FooContainer\"}," +-// + "getDeclAnnoVal = \"FooContainer\"," +-// + "getAnnosArgs = {\"FooContainer\"}," +-// + "getDeclAnnosArgs = {\"FooContainer\"})") { ++ /* ++ Sample testSrc: ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @Repeatable(FooContainer.class) ++ @interface Foo {int value() default Integer.MAX_VALUE;} + +-// @Override +-// public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, +-// String className) { +-// String anno = ""; +-// String replaceVal = ""; +-// String contents = ""; +-// JavaFileObject srcFileObj = null; +-// Iterable<? extends JavaFileObject> files = null; ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @interface FooContainer { ++ Foo[] value(); ++ } + +-// String expectedVals = "\n" + getExpectedBase() + "\n" +-// + getExpectedContainer() + "\n"; +-// StringBuilder commonStmts = getCommonStmts(true); ++ @Foo(0) ++ class SuperClass { } + +-// /* +-// Sample testSrc: +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @Repeatable(FooContainer.class) +-// @interface Foo {int value() default Integer.MAX_VALUE;} ++ @ExpectedBase ++ @ExpectedContainer ++ @FooContainer(value = {@Foo(1), @Foo(2)}) ++ class SubClass extends SuperClass { } ++ */ ++ //@Inherited only works for classes, no switch cases for method, field, package ++ if (srcType == SrcType.CLASS) { ++ //Contents for SuperClass ++ anno = Helper.ContentVars.BASEANNO.getVal(); ++ replaceVal = commonStmts + "\n" + anno; ++ String superClassContents = srcType.getTemplate() ++ .replace("#CN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); + +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @interface FooContainer { +-// Foo[] value(); +-// } ++ //Contents for SubClass that extends SuperClass ++ anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); ++ replaceVal = expectedVals + "\n" + anno; ++ String subClassContents = SrcType.CLASSEXTENDS.getTemplate() ++ .replace("#CN", className) ++ .replace("#SN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); + +-// @Foo +-// class SuperClass { } +- +-// @ExpectedBase +-// @ExpectedContainer +-// @FooContainer(value = {@Foo, @Foo}) +-// class SubClass extends SuperClass { } +-// */ +- +-// //@Inherited only works for classes, no switch cases for method, field, package +-// if (srcType == SrcType.CLASS) { +-// //Contents for SuperClass +-// anno = "@Foo(0)"; +-// replaceVal = commonStmts + "\n" + anno; +-// String superClassContents = srcType.getTemplate() +-// .replace("#CN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); +- +-// //Contents for SubClass that extends SuperClass +-// anno = Helper.ContentVars.LEGACYCONTAINER.getVal(); +-// replaceVal = expectedVals + "\n" + anno; +-// String subClassContents = SrcType.CLASSEXTENDS.getTemplate() +-// .replace("#CN", className) +-// .replace("#SN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); +- +-// contents = superClassContents + subClassContents; +-// srcFileObj = Helper.getFile(className, contents); +-// files = Arrays.asList(srcFileObj); +-// } +-// return files; +-// } +-// }, ++ contents = superClassContents + subClassContents; ++ srcFileObj = Helper.getFile(className, contents); ++ files = Arrays.asList(srcFileObj); ++ } ++ return files; ++ } ++ }, + // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest + // fail with ordering issues + SingleOnSuperContainerAndSingleOnSub_Inherited( +@@ -2009,87 +2014,88 @@ + return files; + } + }, +-// // TestCase not working as expected, JDK-8004912 +-// ContainerAndSingleOnSuperSingleOnSub_Inherited( +-// "@ExpectedBase(value=Foo.class, " +-// + "getAnnotationVal = \"Foo\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"Foo\"}," +-// + "getDeclAnnoVal = \"Foo\"," +-// + "getAnnosArgs = {\"Foo\"}," +-// + "getDeclAnnosArgs = {\"Foo\"})", +-// "@ExpectedContainer(value=FooContainer.class, " +-// + "getAnnotationVal = \"FooContainer\", " +-// + "getAnnotationsVals = {" +-// + "\"ExpectedBase\", \"ExpectedContainer\", \"Foo\", \"FooContainer\"}, " +-// + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"Foo\"}," +-// + "getDeclAnnoVal = \"NULL\"," +-// + "getAnnosArgs = {\"FooContainer\"}," +-// + "getDeclAnnosArgs = {})") { ++ // @ignore 8025924: Several test cases in repeatingAnnotations/combo/ReflectionTest ++ // fail with ordering issues ++ ContainerAndSingleOnSuperSingleOnSub_Inherited( ++ "@ExpectedBase(value=Foo.class, " ++ + "getAnnotationVal = \"@Foo(value=0)\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," ++ + "getDeclAnnoVal = \"@Foo(value=0)\"," ++ + "getAnnosArgs = {\"@Foo(value=0)\"}," ++ + "getDeclAnnosArgs = {\"@Foo(value=0)\"})", ++ "@ExpectedContainer(value=FooContainer.class, " ++ + "getAnnotationVal = \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\", " ++ + "getAnnotationsVals = {" ++ + "\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\", \"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}, " ++ + "getDeclAnnosVals = {\"ExpectedBase\", \"ExpectedContainer\", \"@Foo(value=0)\"}," ++ + "getDeclAnnoVal = \"NULL\"," ++ + "getAnnosArgs = {\"@FooContainer(value=[@Foo(value=1), @Foo(value=2)])\"}," ++ + "getDeclAnnosArgs = {})") { + +-// @Override +-// public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, +-// String className) { +-// String anno = ""; +-// String replaceVal = ""; +-// String contents = ""; +-// JavaFileObject srcFileObj = null; +-// Iterable<? extends JavaFileObject> files = null; ++ @Override ++ public Iterable<? extends JavaFileObject> getTestFiles(SrcType srcType, ++ String className) { ++ String anno = ""; ++ String replaceVal = ""; ++ String contents = ""; ++ JavaFileObject srcFileObj = null; ++ Iterable<? extends JavaFileObject> files = null; + +-// String expectedVals = "\n" + getExpectedBase() + "\n" +-// + getExpectedContainer() + "\n"; +-// StringBuilder commonStmts = getCommonStmts(true); ++ String expectedVals = "\n" + getExpectedBase() + "\n" ++ + getExpectedContainer() + "\n"; ++ StringBuilder commonStmts = getCommonStmts(true); + +-// /* +-// Sample testSrc: +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @Repeatable(FooContainer.class) +-// @interface Foo {int value() default Integer.MAX_VALUE;} ++ /* ++ Sample testSrc: ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @Repeatable(FooContainer.class) ++ @interface Foo {int value() default Integer.MAX_VALUE;} + +-// @Retention(RetentionPolicy.RUNTIME) +-// @Inherited +-// @interface FooContainer { +-// Foo[] value(); +-// } ++ @Retention(RetentionPolicy.RUNTIME) ++ @Inherited ++ @interface FooContainer { ++ Foo[] value(); ++ } + +-// @FooContainer(value = {@Foo, @Foo}) +-// @Foo +-// class SuperClass { } ++ @FooContainer(value = {@Foo(1), @Foo(2)}) ++ @Foo(3) ++ class SuperClass { } + +-// @ExpectedBase +-// @ExpectedContainer +-// @Foo +-// class SubClass extends SuperClass { } +-// */ ++ @ExpectedBase ++ @ExpectedContainer ++ @Foo(0) ++ class SubClass extends SuperClass { } ++ */ + +-// //@Inherited only works for classes, no switch cases for method, field, package +-// if (srcType == SrcType.CLASS) { +-// //Contents for SuperClass +-// anno = Helper.ContentVars.LEGACYCONTAINER.getVal() +-// + Helper.ContentVars.BASEANNO.getVal(); +-// replaceVal = commonStmts + "\n" + anno; +-// String superClassContents = srcType.getTemplate() +-// .replace("#CN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); ++ //@Inherited only works for classes, no switch cases for method, field, package ++ if (srcType == SrcType.CLASS) { ++ //Contents for SuperClass ++ anno = Helper.ContentVars.LEGACYCONTAINER.getVal() ++ + "@Foo(3)" ; ++ replaceVal = commonStmts + "\n" + anno; ++ String superClassContents = srcType.getTemplate() ++ .replace("#CN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); + +-// //Contents for SubClass that extends SuperClass +-// anno = "@Foo(0)"; +-// replaceVal = expectedVals + "\n" + anno; +-// String subClassContents = SrcType.CLASSEXTENDS.getTemplate() +-// .replace("#CN", className) +-// .replace("#SN", SUPERCLASS) +-// .replace("#REPLACE", replaceVal); ++ //Contents for SubClass that extends SuperClass ++ anno = Helper.ContentVars.BASEANNO.getVal(); ++ replaceVal = expectedVals + "\n" + anno; ++ String subClassContents = SrcType.CLASSEXTENDS.getTemplate() ++ .replace("#CN", className) ++ .replace("#SN", SUPERCLASS) ++ .replace("#REPLACE", replaceVal); + +-// contents = superClassContents + subClassContents; +-// srcFileObj = Helper.getFile(className, contents); +-// files = Arrays.asList(srcFileObj); +-// } +-// return files; +-// } +-// } +- ; ++ contents = superClassContents + subClassContents; ++ srcFileObj = Helper.getFile(className, contents); ++ files = Arrays.asList(srcFileObj); ++ } ++ return files; ++ } ++ }; ++ + private String expectedBase, expectedContainer; + + private TestCase(String expectedBase, String expectedContainer) { +@@ -2942,7 +2948,7 @@ + System.out.print("Actual Arr Values: "); + for (Annotation a : actualAnnos) { + if (a != null && a.annotationType() != null) { +- System.out.print("[" + a.annotationType().getSimpleName() + "]"); ++ System.out.print("[" + a.toString() + "]"); + } else { + System.out.println("[null]"); + } +--- ./langtools/test/tools/javac/annotations/repeatingAnnotations/combo/TargetAnnoCombo.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/annotations/repeatingAnnotations/combo/TargetAnnoCombo.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 7151010 8006547 8007766 ++ * @bug 7151010 8006547 8007766 8029017 + * @summary Default test cases for running combinations for Target values + * @build Helper + * @run main TargetAnnoCombo +@@ -145,11 +145,19 @@ + + Set<ElementType> tempBaseSet = EnumSet.noneOf(ElementType.class); + tempBaseSet.addAll(baseAnnotations); ++ + // If BaseAnno has TYPE, then ANNOTATION_TYPE is allowed by default. + if (baseAnnotations.contains(TYPE)) { + tempBaseSet.add(ANNOTATION_TYPE); + } + ++ // If BaseAnno has TYPE_USE, then add the extra allowed types ++ if (baseAnnotations.contains(TYPE_USE)) { ++ tempBaseSet.add(ANNOTATION_TYPE); ++ tempBaseSet.add(TYPE); ++ tempBaseSet.add(TYPE_PARAMETER); ++ } ++ + // If containerAnno has no @Target, only valid case if baseAnnoTarget has + // all targets defined else invalid set. + if (containerAnnotations == null) { +--- ./langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotateScoping.out Wed Jul 30 03:55:11 2014 -0700 +@@ -6,6 +6,7 @@ + CantAnnotateScoping.java:56:37: compiler.err.cant.type.annotate.scoping: @TA,@TA2 + CantAnnotateScoping.java:40:14: compiler.err.cant.type.annotate.scoping.1: @TA + CantAnnotateScoping.java:42:34: compiler.err.cant.type.annotate.scoping: @TA,@DA,@TA2 ++CantAnnotateScoping.java:42:25: compiler.err.annotation.type.not.applicable + CantAnnotateScoping.java:44:38: compiler.err.cant.type.annotate.scoping: @TA,@DA + CantAnnotateScoping.java:44:34: compiler.err.annotation.type.not.applicable +-10 errors +\ No newline at end of file ++11 errors +--- ./langtools/test/tools/javac/annotations/typeAnnotations/failures/CheckErrorsForSource7.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/annotations/typeAnnotations/failures/CheckErrorsForSource7.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,195 @@ ++/* ++ * 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 8035890 ++ * @summary Verify that the parser correctly checks for source level 8 on the new places where ++ * annotations can appear in 8. ++ * @run main CheckErrorsForSource7 CheckErrorsForSource7.java ++ */ ++import java.io.File; ++import java.io.IOException; ++import java.lang.annotation.ElementType; ++import java.lang.annotation.Target; ++import java.net.URI; ++import java.net.URISyntaxException; ++import java.util.ArrayList; ++import java.util.Arrays; ++import java.util.Collections; ++import java.util.Comparator; ++import java.util.HashSet; ++import java.util.List; ++import java.util.Set; ++import javax.tools.Diagnostic; ++import javax.tools.DiagnosticCollector; ++import javax.tools.JavaFileObject; ++import javax.tools.SimpleJavaFileObject; ++import com.sun.source.tree.AnnotationTree; ++import com.sun.source.tree.CompilationUnitTree; ++import com.sun.source.tree.IdentifierTree; ++import com.sun.source.tree.Tree.Kind; ++import com.sun.source.util.JavacTask; ++import com.sun.source.util.TreePathScanner; ++import com.sun.source.util.Trees; ++import com.sun.tools.javac.api.JavacTool; ++import com.sun.tools.javac.file.JavacFileManager; ++ ++/**For each place where an annotation can syntactically appear with -source 8, but not with ++ * -source 7, this test verifies that an error is correctly emitted from the parser for ++ * the annotation for -source 7. This test first gathers the occurrences of @TA from ++ * the CheckErrorsForSource7Data class below, and then repeatedly removes all these annotations ++ * except one and checks the parser reports an expected error. This is needed as as the parser ++ * typically produces only one 'insufficient source level' error for each new feature used. ++ */ ++public class CheckErrorsForSource7 { ++ public static void main(String... args) throws IOException, URISyntaxException { ++ new CheckErrorsForSource7().run(args); ++ } ++ ++ private void run(String... args) throws IOException, URISyntaxException { ++ //the first and only parameter must be the name of the file to be analyzed: ++ if (args.length != 1) throw new IllegalStateException("Must provide source file!"); ++ File testSrc = new File(System.getProperty("test.src")); ++ File testFile = new File(testSrc, args[0]); ++ if (!testFile.canRead()) throw new IllegalStateException("Cannot read the test source"); ++ JavacFileManager fm = JavacTool.create().getStandardFileManager(null, null, null); ++ ++ //gather spans of the @TA annotations into typeAnnotationSpans: ++ JavacTask task = JavacTool.create().getTask(null, ++ fm, ++ null, ++ Collections.<String>emptyList(), ++ null, ++ fm.getJavaFileObjects(testFile)); ++ final Trees trees = Trees.instance(task); ++ final CompilationUnitTree cut = task.parse().iterator().next(); ++ final List<int[]> typeAnnotationSpans = new ArrayList<>(); ++ ++ new TreePathScanner<Void, Void>() { ++ @Override ++ public Void visitAnnotation(AnnotationTree node, Void p) { ++ if (node.getAnnotationType().getKind() == Kind.IDENTIFIER && ++ ((IdentifierTree) node.getAnnotationType()).getName().contentEquals("TA")) { ++ int start = (int) trees.getSourcePositions().getStartPosition(cut, node); ++ int end = (int) trees.getSourcePositions().getEndPosition(cut, node); ++ typeAnnotationSpans.add(new int[] {start, end}); ++ } ++ return null; ++ } ++ }.scan(cut, null); ++ ++ //sort the spans in the reverse order, to simplify removing them from the source: ++ Collections.sort(typeAnnotationSpans, new Comparator<int[]>() { ++ @Override ++ public int compare(int[] o1, int[] o2) { ++ return o2[0] - o1[0]; ++ } ++ }); ++ ++ //verify the errors are produce correctly: ++ String originalSource = cut.getSourceFile().getCharContent(false).toString(); ++ ++ for (int[] toKeep : typeAnnotationSpans) { ++ //prepare updated source code by removing all the annotations except the toKeep one: ++ String updated = originalSource; ++ ++ for (int[] span : typeAnnotationSpans) { ++ if (span == toKeep) continue; ++ ++ updated = updated.substring(0, span[0]) + updated.substring(span[1]); ++ } ++ ++ //parse and verify: ++ JavaFileObject updatedFile = new TestFO(cut.getSourceFile().toUri(), updated); ++ DiagnosticCollector<JavaFileObject> errors = new DiagnosticCollector<>(); ++ JavacTask task2 = JavacTool.create().getTask(null, ++ fm, ++ errors, ++ Arrays.asList("-source", "7"), ++ null, ++ Arrays.asList(updatedFile)); ++ task2.parse(); ++ ++ boolean found = false; ++ ++ for (Diagnostic<? extends JavaFileObject> d : errors.getDiagnostics()) { ++ if (d.getKind() == Diagnostic.Kind.ERROR && EXPECTED_ERRORS.contains(d.getCode())) { ++ if (found) { ++ throw new IllegalStateException("More than one expected error found."); ++ } ++ found = true; ++ } ++ } ++ ++ if (!found) ++ throw new IllegalStateException("Did not produce proper errors for: " + updated); ++ } ++ } ++ ++ static final Set<String> EXPECTED_ERRORS = new HashSet<>(Arrays.asList( ++ "compiler.err.type.annotations.not.supported.in.source", ++ "compiler.err.annotations.after.type.params.not.supported.in.source" ++ )); ++ ++ class TestFO extends SimpleJavaFileObject { ++ private final String content; ++ public TestFO(URI uri, String content) { ++ super(uri, Kind.SOURCE); ++ this.content = content; ++ } ++ ++ @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { ++ return content; ++ } ++ ++ @Override public boolean isNameCompatible(String simpleName, Kind kind) { ++ return true; ++ } ++ } ++} ++ ++//data on which the source level check is verified: ++class CheckErrorsForSource7Data { ++ @Target(ElementType.TYPE_USE) ++ @interface TA { } ++ ++ Object n1 = new @TA ArrayList<@TA String>(); ++ Object n2 = new @TA Object() {}; ++ Object [] @TA [] arr @TA[]; ++ <T> @TA int @TA[] ret(Object obj) @TA[] throws @TA Exception { ++ this.<@TA String>ret(null); ++ Object c1 = new @TA String[1]; ++ ++ int val = obj instanceof @TA String ? ((@TA String) obj).length() : 0; ++ List<@TA ?> l; ++ return null; ++ } ++ void vararg(String @TA ... args) { } ++ ++ abstract class C<@TA T extends @TA Number & @TA Runnable> ++ extends @TA ArrayList<@TA String> ++ implements java.util. @TA Comparator<@TA T> { } ++ ++ interface I extends java.util. @TA Comparator<@TA String> { } ++ ++} +--- ./langtools/test/tools/javac/annotations/typeAnnotations/failures/common/arrays/DeclarationAnnotation.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/annotations/typeAnnotations/failures/common/arrays/DeclarationAnnotation.out Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ ++DeclarationAnnotation.java:13:21: compiler.err.annotation.type.not.applicable + DeclarationAnnotation.java:10:21: compiler.err.annotation.type.not.applicable + DeclarationAnnotation.java:11:21: compiler.err.annotation.type.not.applicable + DeclarationAnnotation.java:12:21: compiler.err.annotation.type.not.applicable +-DeclarationAnnotation.java:13:21: compiler.err.annotation.type.not.applicable + 4 errors +--- ./langtools/test/tools/javac/annotations/typeAnnotations/newlocations/AfterMethodTypeParams.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/annotations/typeAnnotations/newlocations/AfterMethodTypeParams.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,138 @@ ++/* ++ * 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 8038788 ++ * @summary Verify proper handling of annotations after method's type parameters. ++ * @build AfterMethodTypeParams ++ * @run main AfterMethodTypeParams ++ */ ++ ++import java.io.IOException; ++import java.io.StringWriter; ++import java.net.URI; ++import java.util.*; ++ ++import javax.lang.model.element.Name; ++import javax.tools.*; ++ ++import com.sun.source.tree.*; ++import com.sun.source.util.*; ++ ++public class AfterMethodTypeParams { ++ ++ public static void main(String... args) throws IOException { ++ new AfterMethodTypeParams().run(); ++ } ++ ++ void run() throws IOException { ++ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); ++ ++ for (TestCase tc : testCases) { ++ String test = TEMPLATE.replace("CONTENT", tc.snippet); ++ List<JavaFileObject> files = Arrays.asList(new MyFileObject(test)); ++ StringWriter out = new StringWriter(); ++ List<String> options = Arrays.asList("-XDrawDiagnostics", "-XDshouldStopPolicy=FLOW"); ++ JavacTask task = (JavacTask) compiler.getTask(out, null, null, options, null, files); ++ ++ new TreePathScanner<Void, Void>() { ++ boolean seenAnnotation; ++ @Override ++ public Void visitAnnotation(AnnotationTree node, Void p) { ++ Name name = ((IdentifierTree) node.getAnnotationType()).getName(); ++ seenAnnotation |= name.contentEquals("TA") || name.contentEquals("DA"); ++ return null; ++ } ++ @Override ++ public Void visitCompilationUnit(CompilationUnitTree node, Void p) { ++ super.visitCompilationUnit(node, p); ++ if (!seenAnnotation) ++ error(test, "Annotation was missing"); ++ return null; ++ } ++ }.scan(task.parse(), null); ++ ++ task.analyze(); ++ ++ if (!tc.error.equals(out.toString().trim())) { ++ error(test, "Incorrect errors: " + out.toString()); ++ } ++ } ++ ++ if (errors > 0) { ++ throw new IllegalStateException("Errors found"); ++ } ++ } ++ ++ int errors; ++ ++ void error(String code, String error) { ++ System.out.println("Error detected: " + error); ++ System.out.println("Code:"); ++ System.out.println(code); ++ errors++; ++ } ++ ++ static String TEMPLATE = ++ "import java.lang.annotation.*;\n" + ++ "public class Test {\n" + ++ " CONTENT\n" + ++ "}\n" + ++ "@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})\n" + ++ "@interface DA { }\n" + ++ "@Target(ElementType.TYPE_USE)\n" + ++ "@interface TA { }\n"; ++ ++ static class MyFileObject extends SimpleJavaFileObject { ++ final String text; ++ public MyFileObject(String text) { ++ super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); ++ this.text = text; ++ } ++ @Override ++ public CharSequence getCharContent(boolean ignoreEncodingErrors) { ++ return text; ++ } ++ } ++ ++ static TestCase[] testCases = new TestCase[] { ++ new TestCase("<T> @DA int foo1() { return 0;}", ""), ++ new TestCase("<T> @DA void foo2() { }", ""), ++ new TestCase("<T> @TA int foo3() { return 0;}", ""), ++ new TestCase("<T> @TA void foo4() { }", ++ "Test.java:3:9: compiler.err.annotation.type.not.applicable"), ++ new TestCase("<T> @DA Test() { }", "Test.java:3:9: compiler.err.illegal.start.of.type"), ++ new TestCase("<T> @TA Test() { }", "Test.java:3:9: compiler.err.illegal.start.of.type"), ++ }; ++ ++ static class TestCase { ++ final String snippet; ++ final String error; ++ public TestCase(String snippet, String error) { ++ this.snippet = snippet; ++ this.error = error; ++ } ++ } ++} ++ +--- ./langtools/test/tools/javac/annotations/typeAnnotations/newlocations/Receivers.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/annotations/typeAnnotations/newlocations/Receivers.java Wed Jul 30 03:55:11 2014 -0700 +@@ -54,14 +54,6 @@ + <T extends Runnable> void accept(@B("m") WithValue this, T r) throws Exception { } + } + +-class WithFinal { +- void plain(final @B("m") WithFinal this) { } +- <T> void generic(final @B("m") WithFinal this) { } +- void withException(final @B("m") WithFinal this) throws Exception { } +- String nonVoid(final @B("m") WithFinal this) { return null; } +- <T extends Runnable> void accept(final @B("m") WithFinal this, T r) throws Exception { } +-} +- + class WithBody { + Object f; + +--- ./langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Driver.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Driver.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -30,6 +30,7 @@ + import java.lang.annotation.*; + import java.lang.reflect.*; + import java.util.ArrayList; ++import java.util.Arrays; + import java.util.Collections; + import java.util.HashMap; + import java.util.List; +@@ -51,6 +52,11 @@ + new Driver().runDriver(clazz.newInstance()); + } + ++ String[][] extraParamsCombinations = new String[][] { ++ new String[] { }, ++ new String[] { "-g" }, ++ }; ++ + protected void runDriver(Object object) throws Exception { + int passed = 0, failed = 0; + Class<?> clazz = object.getClass(); +@@ -65,18 +71,20 @@ + throw new IllegalArgumentException("Test method needs to return a string: " + method); + String testClass = testClassOf(method); + +- try { +- String compact = (String)method.invoke(object); +- String fullFile = wrap(compact); +- ClassFile cf = compileAndReturn(fullFile, testClass); +- List<TypeAnnotation> actual = ReferenceInfoUtil.extendedAnnotationsOf(cf); +- ReferenceInfoUtil.compare(expected, actual, cf); +- out.println("PASSED: " + method.getName()); +- ++passed; +- } catch (Throwable e) { +- out.println("FAILED: " + method.getName()); +- out.println(" " + e.toString()); +- ++failed; ++ for (String[] extraParams : extraParamsCombinations) { ++ try { ++ String compact = (String)method.invoke(object); ++ String fullFile = wrap(compact); ++ ClassFile cf = compileAndReturn(fullFile, testClass, extraParams); ++ List<TypeAnnotation> actual = ReferenceInfoUtil.extendedAnnotationsOf(cf); ++ ReferenceInfoUtil.compare(expected, actual, cf); ++ out.println("PASSED: " + method.getName()); ++ ++passed; ++ } catch (Throwable e) { ++ out.println("FAILED: " + method.getName()); ++ out.println(" " + e.toString()); ++ ++failed; ++ } + } + } + +@@ -156,7 +164,7 @@ + } + } + +- private ClassFile compileAndReturn(String fullFile, String testClass) throws Exception { ++ private ClassFile compileAndReturn(String fullFile, String testClass, String... extraParams) throws Exception { + File source = writeTestFile(fullFile); + File clazzFile = compileTestFile(source, testClass); + return ClassFile.read(clazzFile); +@@ -170,8 +178,12 @@ + return f; + } + +- protected File compileTestFile(File f, String testClass) { +- int rc = com.sun.tools.javac.Main.compile(new String[] { "-source", "1.8", "-g", f.getPath() }); ++ protected File compileTestFile(File f, String testClass, String... extraParams) { ++ List<String> options = new ArrayList<>(); ++ options.addAll(Arrays.asList("-source", "1.8")); ++ options.addAll(Arrays.asList(extraParams)); ++ options.add(f.getPath()); ++ int rc = com.sun.tools.javac.Main.compile(options.toArray(new String[options.size()])); + if (rc != 0) + throw new Error("compilation failed. rc=" + rc); + String path; +--- ./langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ExceptionParameters.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ExceptionParameters.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -25,6 +25,7 @@ + + /* + * @test ++ * @bug 8028576 + * @summary Test population of reference info for exception parameters + * @author Werner Dietl + * @compile -g Driver.java ReferenceInfoUtil.java ExceptionParameters.java +--- ./langtools/test/tools/javac/api/TestJavacTaskScanner.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/api/TestJavacTaskScanner.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 4813736 ++ * @bug 4813736 8013256 + * @summary Additional functionality test of task and JSR 269 + * @author Peter von der Ah\u00e9 + * @library ./lib +--- ./langtools/test/tools/javac/api/taskListeners/EventsBalancedTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/api/taskListeners/EventsBalancedTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,127 @@ ++/* ++ * 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 8040822 ++ * @summary Check that all TaskEvents are balanced. ++ */ ++ ++import java.io.*; ++import java.net.URI; ++import java.util.*; ++import java.util.Map.Entry; ++ ++import javax.tools.*; ++ ++import com.sun.source.util.*; ++import com.sun.source.util.TaskEvent.Kind; ++import com.sun.tools.javac.api.JavacTool; ++import com.sun.tools.javac.comp.CompileStates.CompileState; ++ ++public class EventsBalancedTest { ++ JavacTool tool = (JavacTool) ToolProvider.getSystemJavaCompiler(); ++ StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); ++ ++ public static void main(String... args) throws IOException { ++ new EventsBalancedTest().test(); ++ } ++ ++ void test() throws IOException { ++ TestSource a = new TestSource("B", "class B extends A { }"); ++ TestSource b = new TestSource("A", "abstract class A { }"); ++ ++ test(null, Arrays.asList(a, b)); ++ test(null, Arrays.asList(b, a)); ++ test(Arrays.asList("-XD-relax"), Arrays.asList(a, b)); ++ test(Arrays.asList("-XD-relax"), Arrays.asList(b, a)); ++ ++ for (CompileState stop : CompileState.values()) { ++ test(Arrays.asList("-XDshouldStopPolicyIfNoError=" + stop, ++ "-XDshouldStopPolicyIfError=" + stop), ++ Arrays.asList(a, b)); ++ test(Arrays.asList("-XDshouldStopPolicyIfNoError=" + stop, ++ "-XDshouldStopPolicyIfError=" + stop), ++ Arrays.asList(b, a)); ++ } ++ } ++ ++ void test(Iterable<String> options, Iterable<JavaFileObject> files) throws IOException { ++ StringWriter sw = new StringWriter(); ++ PrintWriter pw = new PrintWriter(sw); ++ TestListener listener = new TestListener(); ++ JavacTask task = tool.getTask(pw, fm, null, options, null, files); ++ ++ task.setTaskListener(listener); ++ ++ task.call(); ++ ++ for (Entry<Kind, Integer> e : listener.kind2Count.entrySet()) { ++ if (e.getValue() != null && e.getValue() != 0) { ++ throw new IllegalStateException("Not balanced event: " + e.getKey()); ++ } ++ } ++ } ++ ++ static class TestListener implements TaskListener { ++ final Map<Kind, Integer> kind2Count = new HashMap<>(); ++ ++ int get(Kind k) { ++ Integer count = kind2Count.get(k); ++ ++ if (count == null) ++ kind2Count.put(k, count = 0); ++ ++ return count; ++ } ++ ++ @Override ++ public void started(TaskEvent e) { ++ kind2Count.put(e.getKind(), get(e.getKind()) + 1); ++ } ++ ++ @Override ++ public void finished(TaskEvent e) { ++ int count = get(e.getKind()); ++ ++ if (count <= 0) ++ throw new IllegalStateException("count<=0 for: " + e.getKind()); ++ ++ kind2Count.put(e.getKind(), count - 1); ++ } ++ ++ } ++ static class TestSource extends SimpleJavaFileObject { ++ final String content; ++ public TestSource(String fileName, String content) { ++ super(URI.create("myfo:/" + fileName + ".java"), JavaFileObject.Kind.SOURCE); ++ this.content = content; ++ } ++ ++ @Override ++ public CharSequence getCharContent(boolean ignoreEncodingErrors) { ++ return content; ++ } ++ } ++ ++} +--- ./langtools/test/tools/javac/classfiles/InnerClasses/SyntheticClasses.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/classfiles/InnerClasses/SyntheticClasses.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,97 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** @test ++ * @bug 8034854 ++ * @summary Verify that the InnerClasses attribute has outer_class_info_index zero if it has ++ * inner_name_index zero (for synthetic classes) ++ * @compile SyntheticClasses.java ++ * @run main SyntheticClasses ++ */ ++ ++import java.io.*; ++import java.util.*; ++import com.sun.tools.classfile.*; ++ ++public class SyntheticClasses { ++ ++ public static void main(String[] args) throws IOException, ConstantPoolException { ++ new SyntheticClasses().run(); ++ } ++ ++ private void run() throws IOException, ConstantPoolException { ++ File testClasses = new File(System.getProperty("test.classes")); ++ for (File classFile : testClasses.listFiles(f -> f.getName().endsWith(".class"))) { ++ ClassFile cf = ClassFile.read(classFile); ++ if (cf.getName().matches(".*\\$[0-9]+")) { ++ EnclosingMethod_attribute encl = ++ (EnclosingMethod_attribute) cf.getAttribute(Attribute.EnclosingMethod); ++ if (encl != null) { ++ if (encl.method_index != 0) ++ throw new IllegalStateException("Invalid EnclosingMethod.method_index: " + ++ encl.method_index + "."); ++ } ++ } ++ InnerClasses_attribute attr = ++ (InnerClasses_attribute) cf.getAttribute(Attribute.InnerClasses); ++ if (attr != null) { ++ for (InnerClasses_attribute.Info info : attr.classes) { ++ if (cf.major_version < 51) ++ throw new IllegalStateException(); ++ if (info.inner_name_index == 0 && info.outer_class_info_index != 0) ++ throw new IllegalStateException("Invalid outer_class_info_index=" + ++ info.outer_class_info_index + ++ "; inner_name_index=" + ++ info.inner_name_index + "."); ++ } ++ } ++ } ++ } ++} ++ ++class SyntheticConstructorAccessTag { ++ ++ private static class A { ++ private A(){} ++ } ++ ++ public void test() { ++ new A(); ++ } ++} ++ ++class SyntheticEnumMapping { ++ private int convert(E e) { ++ switch (e) { ++ case A: return 0; ++ default: return -1; ++ } ++ } ++ enum E { A } ++} ++ ++interface SyntheticAssertionsDisabled { ++ public default void test() { ++ assert false; ++ } ++} +--- ./langtools/test/tools/javac/defaultMethods/static/StaticInvoke.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/defaultMethods/static/StaticInvoke.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,15 @@ ++/* @test /nodynamiccopyright/ ++ * @bug 8037385 ++ * @summary Must not allow static interface method invocation in legacy code ++ * @compile -source 8 -Xlint:-options StaticInvoke.java ++ * @compile/fail/ref=StaticInvoke7.out -source 7 -Xlint:-options -XDrawDiagnostics StaticInvoke.java ++ * @compile/fail/ref=StaticInvoke6.out -source 6 -Xlint:-options -XDrawDiagnostics StaticInvoke.java ++ */ ++import java.util.stream.Stream; ++ ++class StaticInvoke { ++ void test() { ++ Stream.empty(); ++ java.util.stream.Stream.empty(); ++ } ++} +--- ./langtools/test/tools/javac/defaultMethods/static/StaticInvoke6.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/defaultMethods/static/StaticInvoke6.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,3 @@ ++StaticInvoke.java:12:15: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.6 ++StaticInvoke.java:13:32: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.6 ++2 errors +--- ./langtools/test/tools/javac/defaultMethods/static/StaticInvoke7.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/defaultMethods/static/StaticInvoke7.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,3 @@ ++StaticInvoke.java:12:15: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.7 ++StaticInvoke.java:13:32: compiler.err.static.intf.method.invoke.not.supported.in.source: 1.7 ++2 errors +--- ./langtools/test/tools/javac/defaultMethods/static/hiding/InterfaceMethodHidingTest.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/defaultMethods/static/hiding/InterfaceMethodHidingTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -26,6 +26,7 @@ + * @bug 8005166 + * @summary Add support for static interface methods + * Smoke test for static interface method hiding ++ * @run main/timeout=600 InterfaceMethodHidingTest + */ + + import com.sun.source.util.JavacTask; +--- ./langtools/test/tools/javac/defaultMethodsVisibility/DefaultMethodsNotVisibleForSourceLessThan8Test.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/defaultMethodsVisibility/DefaultMethodsNotVisibleForSourceLessThan8Test.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,180 @@ ++/* ++ * 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 8029240 8030855 ++ * @summary Default methods not always visible under -source 7 ++ * Default methods should be visible under source previous to 8 ++ * @library /tools/javac/lib ++ * @build ToolBox ++ * @run main DefaultMethodsNotVisibleForSourceLessThan8Test ++ */ ++ ++import java.nio.file.Files; ++import java.nio.file.Paths; ++ ++public class DefaultMethodsNotVisibleForSourceLessThan8Test { ++ // common definitions ++ ++ // this one should be compiled with source 8, the rest with source < 8 ++ static final String ISrc = ++ "interface I {\n" + ++ " default void m() {}\n" + ++ "}"; ++ ++ static final String JSrc = ++ "interface J extends I {}"; ++ ++ static final String ASrc = ++ "abstract class A implements I {}"; ++ ++ static final String BSrc = ++ "class B implements I {}"; ++ ++ // test legacy implementations ++ static final String C1Src = ++ "class C1 implements I {\n" + ++ " public void m() {}\n" + ++ "}"; ++ ++ static final String C2Src = ++ "class C2 implements J {\n" + ++ " public void m() {}\n" + ++ "}"; ++ ++ static final String C3Src = ++ "class C3 extends A {\n" + ++ " public void m() {}\n" + ++ "}"; ++ ++ static final String C4Src = ++ "class C4 extends B {\n" + ++ " public void m() {}\n" + ++ "}"; ++ ++ //test legacy invocations ++ static final String LegacyInvocationSrc = ++ "class LegacyInvocation {\n" + ++ " public static void test(I i, J j, A a, B b) {\n" + ++ " i.m();\n" + ++ " j.m();\n" + ++ " a.m();\n" + ++ " b.m();\n" + ++ " }\n" + ++ "}"; ++ ++ //test case super invocations ++ static final String SubASrc = ++ "class SubA extends A {\n" + ++ " public void test() {\n" + ++ " super.m();\n" + ++ " }\n" + ++ "}"; ++ ++ static final String SubBSrc = ++ "class SubB extends B {\n" + ++ " public void test() {\n" + ++ " super.m();\n" + ++ " }\n" + ++ "}"; ++ ++ public static void main(String[] args) throws Exception { ++ String[] sources = new String[] { ++ "1.2", ++ "1.3", ++ "1.4", ++ "1.5", ++ "1.6", ++ "1.7", ++ }; ++ for (String source : sources) { ++ new DefaultMethodsNotVisibleForSourceLessThan8Test().run(source); ++ } ++ } ++ ++ String outDir; ++ String source; ++ ++ void run(String source) throws Exception { ++ this.source = source; ++ outDir = "out" + source.replace('.', '_'); ++ testsPreparation(); ++ testLegacyImplementations(); ++ testLegacyInvocations(); ++ testSuperInvocations(); ++ } ++ ++ void testsPreparation() throws Exception { ++ Files.createDirectory(Paths.get(outDir)); ++ ++ /* as an extra check let's make sure that interface 'I' can't be compiled ++ * with source < 8 ++ */ ++ ToolBox.JavaToolArgs javacArgs = ++ new ToolBox.JavaToolArgs(ToolBox.Expect.FAIL) ++ .setOptions("-d", outDir, "-source", source) ++ .setSources(ISrc); ++ ToolBox.javac(javacArgs); ++ ++ //but it should compile with source >= 8 ++ javacArgs = ++ new ToolBox.JavaToolArgs() ++ .setOptions("-d", outDir) ++ .setSources(ISrc); ++ ToolBox.javac(javacArgs); ++ ++ javacArgs = ++ new ToolBox.JavaToolArgs() ++ .setOptions("-cp", outDir, "-d", outDir, "-source", source) ++ .setSources(JSrc, ASrc, BSrc); ++ ToolBox.javac(javacArgs); ++ } ++ ++ void testLegacyImplementations() throws Exception { ++ //compile C1-4 ++ ToolBox.JavaToolArgs javacArgs = ++ new ToolBox.JavaToolArgs() ++ .setOptions("-cp", outDir, "-d", outDir, "-source", source) ++ .setSources(C1Src, C2Src, C3Src, C4Src); ++ ToolBox.javac(javacArgs); ++ } ++ ++ void testLegacyInvocations() throws Exception { ++ //compile LegacyInvocation ++ ToolBox.JavaToolArgs javacArgs = ++ new ToolBox.JavaToolArgs() ++ .setOptions("-cp", outDir, "-d", outDir, "-source", source) ++ .setSources(LegacyInvocationSrc); ++ ToolBox.javac(javacArgs); ++ } ++ ++ void testSuperInvocations() throws Exception { ++ //compile SubA, SubB ++ ToolBox.JavaToolArgs javacArgs = ++ new ToolBox.JavaToolArgs() ++ .setOptions("-cp", outDir, "-d", outDir, "-source", source) ++ .setSources(SubASrc, SubBSrc); ++ ToolBox.javac(javacArgs); ++ } ++} +--- ./langtools/test/tools/javac/diags/examples.not-yet.txt Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/diags/examples.not-yet.txt Wed Jul 30 03:55:11 2014 -0700 +@@ -110,4 +110,5 @@ + compiler.warn.unknown.enum.constant # in bad class file + compiler.warn.unknown.enum.constant.reason # in bad class file + compiler.warn.override.equals.but.not.hashcode # when a class overrides equals but not hashCode method from Object +- ++compiler.err.cant.inherit.from.anon # error for subclass of anonymous class ++compiler.misc.bad.const.pool.entry # constant pool entry has wrong type +--- ./langtools/test/tools/javac/diags/examples/AnnotationsAfterTypeParamsNotSupportedInSource.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/diags/examples/AnnotationsAfterTypeParamsNotSupportedInSource.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,34 @@ ++/* ++ * 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. ++ */ ++ ++// key: compiler.err.annotations.after.type.params.not.supported.in.source ++// key: compiler.warn.source.no.bootclasspath ++// options: -source 7 ++ ++@interface Anno { } ++ ++class AnnotationsAfterTypeParamsNotSupportedInSource { ++ <T> @Anno int m() { ++ return 0; ++ } ++} +--- ./langtools/test/tools/javac/diags/examples/LambdaBodyNeitherValueNorVoidCompatible.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/diags/examples/LambdaBodyNeitherValueNorVoidCompatible.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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. ++ */ ++ ++// key: compiler.err.lambda.body.neither.value.nor.void.compatible ++// key: compiler.err.cant.apply.symbol ++// key: compiler.misc.incompatible.ret.type.in.lambda ++// key: compiler.misc.missing.ret.val ++// key: compiler.misc.no.conforming.assignment.exists ++ ++class LambdaBodyNeitherValueNorVoidCompatible { ++ interface I { ++ String f(String x); ++ } ++ ++ static void foo(I i) {} ++ ++ void m() { ++ foo((x) -> { ++ if (x == null) { ++ return; ++ } else { ++ return x; ++ } ++ }); ++ } ++} +--- ./langtools/test/tools/javac/diags/examples/StaticIntfMethodInvokeNotSupported.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/diags/examples/StaticIntfMethodInvokeNotSupported.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,32 @@ ++/* ++ * 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. ++ */ ++ ++// key: compiler.err.static.intf.method.invoke.not.supported.in.source ++// options: -source 7 -Xlint:-options ++import java.util.stream.Stream; ++ ++class StaticIntfMethodInvokeNotSupported { ++ void test() { ++ Stream.empty(); ++ } ++} +--- ./langtools/test/tools/javac/diags/examples/WarnSerializableLambda.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/diags/examples/WarnSerializableLambda.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * 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. ++ */ ++ ++// key: compiler.warn.access.to.sensitive.member.from.serializable.element ++// options: -XDwarnOnAccessToSensitiveMembers ++ ++import java.io.Serializable; ++ ++public class WarnSerializableLambda { ++ interface SAM { ++ void apply(String s); ++ } ++ ++ private void m1() { ++ SAM s = (SAM & Serializable) c -> { ++ packageField = ""; ++ }; ++ } ++ ++ String packageField; ++} +--- ./langtools/test/tools/javac/doctree/SeeTest.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/doctree/SeeTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, 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 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 7021614 ++ * @bug 7021614 8031212 + * @summary extend com.sun.source API to support parsing javadoc comments + * @build DocCommentTester + * @run main DocCommentTester SeeTest.java +@@ -41,9 +41,9 @@ + Text[TEXT, pos:1, abc.] + body: empty + block tags: 1 +- Erroneous[ERRONEOUS, pos:7 +- code: compiler.err.dc.unexpected.content +- body: @see_"String" ++ See[SEE, pos:7 ++ reference: 1 ++ Text[TEXT, pos:12, "String"] + ] + ] + */ +--- ./langtools/test/tools/javac/flow/LVTHarness.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/flow/LVTHarness.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -23,8 +23,8 @@ + + /* + * @test +- * @bug 7047734 8027660 +- * @summary The LVT is not generated correctly during some try/catch scenarios; ++ * @bug 7047734 8027660 8037937 ++ * @summary The LVT is not generated correctly during some try/catch scenarios + * javac crash while creating LVT entry for a local variable defined in + * an inner block + * @library /tools/javac/lib +@@ -120,7 +120,7 @@ + for (Map.Entry<ElementKey, AliveRanges> entry : aliveRangeMap.entrySet()) { + if (!seenAliveRanges.contains(entry.getKey())) { + error("Redundant @AliveRanges annotation on method " + +- entry.getKey().elem); ++ entry.getKey().elem + " with key " + entry.getKey()); + } + } + } +@@ -134,7 +134,7 @@ + for (Method method : classFile.methods) { + for (ElementKey elementKey: aliveRangeMap.keySet()) { + String methodDesc = method.getName(constantPool) + +- method.descriptor.getParameterTypes(constantPool); ++ method.descriptor.getParameterTypes(constantPool).replace(" ", ""); + if (methodDesc.equals(elementKey.elem.toString())) { + checkMethod(constantPool, method, aliveRangeMap.get(elementKey)); + seenAliveRanges.add(elementKey); +--- ./langtools/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,29 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8030218 ++ * @summary javac, compile time error isn't shown when final static field is not assigned, follow-up ++ * @compile/fail/ref=CompileTimeErrorForNonAssignedStaticFieldTest.out -XDrawDiagnostics CompileTimeErrorForNonAssignedStaticFieldTest.java ++ */ ++ ++public class CompileTimeErrorForNonAssignedStaticFieldTest { ++ private final static int i; ++ ++ public CompileTimeErrorForNonAssignedStaticFieldTest() ++ throws InstantiationException { ++ throw new InstantiationException("Can't instantiate"); ++ } ++ ++ static class Inner { ++ private final int j; ++ public Inner(int x) ++ throws InstantiationException { ++ if (x == 0) { ++ throw new InstantiationException("Can't instantiate"); ++ } else { ++ j = 1; ++ } ++ System.out.println(j); ++ } ++ } ++ ++} +--- ./langtools/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,2 @@ ++CompileTimeErrorForNonAssignedStaticFieldTest.java:14:5: compiler.err.var.might.not.have.been.initialized: i ++1 error +--- ./langtools/test/tools/javac/flow/T8042741/A.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/flow/T8042741/A.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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. ++ */ ++ ++// str must be at absolute position greater than that of lambda ++// expression in PositionTest.java ++// padding..........................................................padding ++// padding..........................................................padding ++// padding..........................................................padding ++// padding..........................................................padding ++// padding..........................................................padding ++ ++public class A { ++ public final String str; ++ { ++ str = ""; ++ } ++} +--- ./langtools/test/tools/javac/flow/T8042741/PositionTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/flow/T8042741/PositionTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,62 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * 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 8042741 ++ * @summary Java 8 compiler throws NullPointerException depending location in source file ++ * @compile A.java PositionTest.java ++ */ ++ ++public class PositionTest extends A { ++ <E extends Exception> void test(SAM<E> r) throws E { ++ test(() -> { System.err.println(str); }); ++ } ++ interface SAM<E extends Exception> { ++ public void run() throws E; ++ } ++ void f() { ++ try { ++ test(() -> { ++ test(() -> { ++ try { ++ test(() -> { System.err.println(str); }); ++ System.err.println(str); ++ } catch (Exception e) {} ++ System.err.println(str); ++ }); ++ System.err.println(str); ++ }); ++ } catch (Exception e) { } ++ } ++ void g() throws Exception { ++ test(() -> { ++ try { ++ try { ++ test(() -> { System.err.println(str); }); ++ } catch (Exception e) {} ++ System.err.println(str); ++ } catch (Exception e) {} ++ System.err.println(str); ++ }); ++ } ++} +--- ./langtools/test/tools/javac/flow/tests/TestCaseIfElse.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/flow/tests/TestCaseIfElse.java Wed Jul 30 03:55:11 2014 -0700 +@@ -33,7 +33,7 @@ + + @AliveRange(varName="o", bytecodeStart=10, bytecodeLength=8) + @AliveRange(varName="o", bytecodeStart=21, bytecodeLength=9) +- void m2(String[] args) { ++ void m2() { + Object o; + int i = 5; + if (i != 5) { +@@ -45,4 +45,19 @@ + } + o = "finish"; + } ++ ++ @AliveRange(varName="o", bytecodeStart=11, bytecodeLength=3) ++ @AliveRange(varName="o", bytecodeStart=17, bytecodeLength=2) ++ Object m3(boolean cond1, boolean cond2) { ++ Object o; ++ if (cond1) { ++ if (cond2) { ++ o = "then"; ++ } else { ++ o = "else"; ++ return null; ++ } ++ } ++ return null; ++ } + } +--- ./langtools/test/tools/javac/generics/diamond/T8041713/DiamondPlusUnexistingMethodRefCrashTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/diamond/T8041713/DiamondPlusUnexistingMethodRefCrashTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,11 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8041713 ++ * @summary Type inference of non-existent method references crashes the compiler ++ * @compile/fail/ref=DiamondPlusUnexistingMethodRefCrashTest.out -XDrawDiagnostics DiamondPlusUnexistingMethodRefCrashTest.java ++ */ ++ ++public class DiamondPlusUnexistingMethodRefCrashTest<T> { ++ DiamondPlusUnexistingMethodRefCrashTest<String> m = ++ new DiamondPlusUnexistingMethodRefCrashTest<>(DiamondPlusUnexistingMethodRefCrashTest::doNotExists); ++} +--- ./langtools/test/tools/javac/generics/diamond/T8041713/DiamondPlusUnexistingMethodRefCrashTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/diamond/T8041713/DiamondPlusUnexistingMethodRefCrashTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,2 @@ ++DiamondPlusUnexistingMethodRefCrashTest.java:10:55: compiler.err.invalid.mref: kindname.method, (compiler.misc.cant.resolve.location.args: kindname.method, doNotExists, , , (compiler.misc.location: kindname.class, DiamondPlusUnexistingMethodRefCrashTest, null)) ++1 error +--- ./langtools/test/tools/javac/generics/inference/8043725/T8043725.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/inference/8043725/T8043725.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 8043725 ++ * @summary javac fails with StackOverflowException ++ * @compile T8043725.java ++ */ ++class T8043725 { ++ <T extends Comparable<T>> T m(T v) { ++ //this will generate two upper bounds, T and Comparable<T'> respectively ++ //causing infinite recursion in lub (because of JLS 18.3.1). ++ return m(v); ++ } ++} +--- ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTesta.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTesta.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,78 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8030741 ++ * @summary Inference: implement eager resolution of return types, consistent with JDK-8028800 ++ * @compile EagerReturnTypeResolutionTesta.java ++ */ ++ ++public class EagerReturnTypeResolutionTesta { ++ ++ abstract class Test1<T>{ ++ abstract <S> S foo(S x, S y); ++ <S extends Number & Comparable<? extends Number>> void baz(Test1<S> a){} ++ ++ void bar(Test1<Long> x, Test1<Integer> y){ ++ baz(foo(x, y)); ++ } ++ } ++ ++ abstract class Test2<T>{ ++ abstract <S> S foo(S x, S y); ++ abstract <S1> void baz(Test2<S1> a); ++ ++ void bar(Test2<Integer> y, Test2<Long> x){ ++ baz(foo(x, y)); ++ } ++ } ++ ++ abstract class Test3<T>{ ++ abstract <S> S foo(S x, S y); ++ <T extends Number & Comparable<?>, ++ S extends Number & Comparable<? extends T>> void baz(Test3<S> a){} ++ ++ void bar(Test3<Long> x, Test3<Integer> y){ ++ baz(foo(x, y)); ++ } ++ } ++ ++ abstract class Test4 { ++ abstract class A0<T> {} ++ ++ abstract class A1<T> extends A0<T> {} ++ ++ abstract class A2<T> extends A0<T> {} ++ ++ abstract <S> S foo(S x, S y); ++ abstract <S1> void baz(A0<S1> a); ++ ++ void bar(A2<Integer> y, A1<Long> x){ ++ baz(foo(x, y)); ++ } ++ } ++ ++} +--- ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTestb.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTestb.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,182 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8030741 ++ * @summary Inference: implement eager resolution of return types, consistent with JDK-8028800 ++ * @compile/fail/ref=EagerReturnTypeResolutionTestb.out -XDrawDiagnostics EagerReturnTypeResolutionTestb.java ++ * @author Dan Smith ++ */ ++ ++import java.util.List; ++ ++public class EagerReturnTypeResolutionTestb { ++ interface I<S> {} ++ interface J<S> extends I<S> {} ++ interface K extends I<String> {} ++ interface L<S> extends I {} ++ ++ <T> T lower(List<? extends T> l) { return null; } ++ <T> T lower2(List<? extends T> l1, List<? extends T> l2) { return null; } ++ ++ <T> T upper(List<? super T> l) { return null; } ++ <T> T upper2(List<? super T> l1, List<? super T> l2) { return null; } ++ ++ <T> T eq(List<T> l) { return null; } ++ <T> T eq2(List<T> l1, List<T> l2) { return null; } ++ ++ <X> void takeI(I<X> i) {} ++ void takeIString(I<String> i) {} ++ I<String> iStringField; ++ ++ void takeLong(long arg) {} ++ long longField; ++ ++ void testSimpleCaptureOK(List<I<?>> i1) { ++ takeI(lower(i1)); // ok* ++ takeI(eq(i1)); // ok* ++ takeI(upper(i1)); // ok, no capture ++ takeIString(upper(i1)); // ok ++ iStringField = upper(i1); // ok ++ } ++ ++ void testSimpleCaptureKO(List<I<?>> i1) { ++ takeIString(lower(i1)); // ERROR ++ takeIString(eq(i1)); // ERROR ++ iStringField = lower(i1); // ERROR ++ iStringField = eq(i1); // ERROR ++ } ++ ++ void testMultiCaptureOK(List<I<String>> i1, List<I<Integer>> i2, List<I<?>> i3, ++ List<J<String>> j1, List<J<Integer>> j2, List<K> k1) { ++ /* Lines marked with JDK-8029002 should be uncommented once this bug is ++ * fixed ++ */ ++ takeI(lower2(i1, i2)); // ok* ++ takeI(lower2(i1, i3)); // ok* ++ takeI(upper2(i1, i3)); // ok, no capture* JDK-8029002 ++ ++ takeIString(upper2(i1, i3)); // ok, no capture ++ iStringField = upper2(i1, i3); // ok, no capture ++ ++ takeI(lower2(j1, j2)); // ok* ++ takeI(lower2(j1, k1)); // ok, no capture ++ takeI(upper2(j1, k1)); // ok, no capture* JDK-8029002 ++ ++ takeIString(lower2(j1, k1)); // ok, no capture ++ takeIString(upper2(j1, k1)); // ok, no capture ++ ++ iStringField = lower2(j1, k1); // ok, no capture ++ iStringField = upper2(j1, k1); // ok, no capture ++ takeI(lower2(j2, k1)); // ok* ++ } ++ ++ void testMultiCaptureKO(List<I<String>> i1, List<I<Integer>> i2, List<I<?>> i3, ++ List<J<String>> j1, List<J<Integer>> j2, List<K> k1) { ++ takeI(eq2(i1, i2)); // ERROR, bad bounds ++ takeI(upper2(i1, i2)); // ERROR, bad bounds ++ ++ takeIString(lower2(i1, i2)); // ERROR ++ takeIString(eq2(i1, i2)); // ERROR, bad bounds ++ takeIString(upper2(i1, i2)); // ERROR, bad bounds ++ ++ iStringField = lower2(i1, i2); // ERROR ++ iStringField = eq2(i1, i2); // ERROR, bad bounds ++ iStringField = upper2(i1, i2); // ERROR, bad bounds ++ ++ takeI(eq2(i1, i3)); // ERROR, bad bounds ++ takeIString(lower2(i1, i3)); // ERROR ++ takeIString(eq2(i1, i3)); // ERROR, bad bounds ++ ++ iStringField = lower2(i1, i3); // ERROR ++ iStringField = eq2(i1, i3); // ERROR, bad bounds ++ takeI(eq2(j1, j2)); // ERROR, bad bounds ++ takeI(upper2(j1, j2)); // ERROR, bad bounds ++ ++ takeIString(lower2(j1, j2)); // ERROR ++ takeIString(eq2(j1, j2)); // ERROR, bad bounds ++ takeIString(upper2(j1, j2)); // ERROR, bad bounds ++ ++ iStringField = lower2(j1, j2); // ERROR ++ iStringField = eq2(j1, j2); // ERROR, bad bounds ++ iStringField = upper2(j1, j2); // ERROR, bad bounds ++ ++ takeI(eq2(j1, k1)); // ERROR, bad bounds ++ takeIString(eq2(j1, k1)); // ERROR, bad bounds ++ iStringField = eq2(j1, k1); // ERROR, bad bounds ++ takeI(eq2(j2, k1)); // ERROR, bad bounds ++ takeI(upper2(j2, k1)); // ERROR, bad bounds; actual: no error, see JDK-8037474 ++ ++ takeIString(lower2(j2, k1)); // ERROR ++ takeIString(eq2(j2, k1)); // ERROR, bad bounds ++ takeIString(upper2(j2, k1)); // ERROR, bad bounds ++ ++ iStringField = lower2(j2, k1); // ERROR ++ iStringField = eq2(j2, k1); // ERROR, bad bounds ++ iStringField = upper2(j2, k1); // ERROR, bad bounds ++ } ++ ++ void testRawOK(List<I> i1, List<J> j1, List<L<String>> l1) { ++ takeI(lower(i1)); // ok, unchecked ++ takeI(eq(i1)); // ok, unchecked ++ takeI(upper(i1)); // ok, no capture, not unchecked ++ ++ takeIString(lower(i1)); // ok, unchecked ++ takeIString(eq(i1)); // ok, unchecked ++ takeIString(upper(i1)); // ok, no capture, not unchecked ++ ++ iStringField = lower(i1); // ok, unchecked ++ iStringField = eq(i1); // ok, unchecked ++ iStringField = upper(i1); // ok, no capture, not unchecked ++ ++ takeI(lower(j1)); // ok, unchecked ++ takeI(eq(j1)); // ok, unchecked ++ takeI(upper(j1)); // bad bounds? -- spec is unclear ++ ++ takeIString(lower(j1)); // ok, unchecked ++ takeIString(eq(j1)); // ok, unchecked ++ takeIString(upper(j1)); // bad bounds? -- spec is unclear ++ ++ iStringField = lower(j1); // ok, unchecked ++ iStringField = eq(j1); // ok, unchecked ++ iStringField = upper(j1); // bad bounds? -- spec is unclear ++ ++ takeI(lower(l1)); // ok, unchecked ++ takeI(eq(l1)); // ok, unchecked ++ takeI(upper(l1)); // bad bounds? -- spec is unclear ++ ++ takeIString(lower(l1)); // ok, unchecked ++ takeIString(eq(l1)); // ok, unchecked ++ takeIString(upper(l1)); // bad bounds? -- spec is unclear ++ ++ iStringField = lower(l1); // ok, unchecked ++ iStringField = eq(l1); // ok, unchecked ++ iStringField = upper(l1); // bad bounds? -- spec is unclear ++ } ++ ++ void testPrimOK(List<Integer> i1, List<Long> l1, List<Double> d1) { ++ takeLong(lower(i1)); // ok ++ takeLong(eq(i1)); // ok ++ takeLong(upper(i1)); // ok* ++ ++ longField = lower(i1); // ok ++ longField = eq(i1); // ok ++ longField = upper(i1); // ok* ++ ++ takeLong(lower(l1)); // ok ++ takeLong(eq(l1)); // ok ++ takeLong(upper(l1)); // ok ++ ++ longField = lower(l1); // ok ++ longField = eq(l1); // ok ++ longField = upper(l1); // ok ++ } ++ ++ void testPrimKO(List<Integer> i1, List<Long> l1, List<Double> d1) { ++ takeLong(lower(d1)); // ERROR ++ takeLong(eq(d1)); // ERROR ++ takeLong(upper(d1)); // ERROR ++ ++ longField = lower(d1); // ERROR ++ longField = eq(d1); // ERROR ++ longField = upper(d1); // ERROR ++ } ++} +--- ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTestb.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/EagerReturnTypeResolutionTestb.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,45 @@ ++EagerReturnTypeResolutionTestb.java:42:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I<java.lang.String>, EagerReturnTypeResolutionTestb.I<compiler.misc.type.captureof: 1, ?>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<?>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object)) ++EagerReturnTypeResolutionTestb.java:43:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I<java.lang.String>, EagerReturnTypeResolutionTestb.I<compiler.misc.type.captureof: 1, ?>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<?>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object)) ++EagerReturnTypeResolutionTestb.java:44:29: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<?>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:45:26: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<?>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:74:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.I<java.lang.Integer>, EagerReturnTypeResolutionTestb.I<java.lang.Integer>,EagerReturnTypeResolutionTestb.I<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:75:15: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List<? super T>,java.util.List<? super T>, java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<java.lang.Integer>, EagerReturnTypeResolutionTestb.I<java.lang.Integer>,EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:77:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I<java.lang.String>, EagerReturnTypeResolutionTestb.I<compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object)) ++EagerReturnTypeResolutionTestb.java:78:21: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.I<java.lang.Integer>, EagerReturnTypeResolutionTestb.I<java.lang.Integer>,EagerReturnTypeResolutionTestb.I<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:79:21: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List<? super T>,java.util.List<? super T>, java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<java.lang.Integer>, EagerReturnTypeResolutionTestb.I<java.lang.Integer>,EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:81:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:82:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.I<java.lang.Integer>, EagerReturnTypeResolutionTestb.I<java.lang.Integer>,EagerReturnTypeResolutionTestb.I<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:83:24: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List<? super T>,java.util.List<? super T>, java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<java.lang.Integer>, EagerReturnTypeResolutionTestb.I<java.lang.Integer>,EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:85:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.I<?>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.I<?>, EagerReturnTypeResolutionTestb.I<?>,EagerReturnTypeResolutionTestb.I<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:86:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I<java.lang.String>, EagerReturnTypeResolutionTestb.I<compiler.misc.type.captureof: 1, ?>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<?>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object)) ++EagerReturnTypeResolutionTestb.java:87:21: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.I<?>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.I<?>, EagerReturnTypeResolutionTestb.I<?>,EagerReturnTypeResolutionTestb.I<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:89:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<?>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:90:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.I<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.I<?>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.I<?>, EagerReturnTypeResolutionTestb.I<?>,EagerReturnTypeResolutionTestb.I<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:91:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.J<java.lang.Integer>, EagerReturnTypeResolutionTestb.J<java.lang.Integer>,EagerReturnTypeResolutionTestb.J<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:92:15: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List<? super T>,java.util.List<? super T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.J<java.lang.Integer>, EagerReturnTypeResolutionTestb.J<java.lang.Integer>,EagerReturnTypeResolutionTestb.J<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:94:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I<java.lang.String>, EagerReturnTypeResolutionTestb.J<compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.J<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object)) ++EagerReturnTypeResolutionTestb.java:95:21: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.J<java.lang.Integer>, EagerReturnTypeResolutionTestb.J<java.lang.Integer>,EagerReturnTypeResolutionTestb.J<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:96:21: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List<? super T>,java.util.List<? super T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.J<java.lang.Integer>, EagerReturnTypeResolutionTestb.J<java.lang.Integer>,EagerReturnTypeResolutionTestb.J<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:98:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.J<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:99:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.J<java.lang.Integer>, EagerReturnTypeResolutionTestb.J<java.lang.Integer>,EagerReturnTypeResolutionTestb.J<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:100:24: compiler.err.cant.apply.symbol: kindname.method, upper2, java.util.List<? super T>,java.util.List<? super T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.Integer>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.J<java.lang.Integer>, EagerReturnTypeResolutionTestb.J<java.lang.Integer>,EagerReturnTypeResolutionTestb.J<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:102:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.K>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.K, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:103:21: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.K>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.K, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:104:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.String>>,java.util.List<EagerReturnTypeResolutionTestb.K>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.K, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J<java.lang.String>) ++EagerReturnTypeResolutionTestb.java:105:15: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.Integer>>,java.util.List<EagerReturnTypeResolutionTestb.K>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.K, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J<java.lang.Integer>) ++EagerReturnTypeResolutionTestb.java:106:9: compiler.err.cant.apply.symbol: kindname.method, takeI, EagerReturnTypeResolutionTestb.I<X>, java.lang.Object&EagerReturnTypeResolutionTestb.J<java.lang.Integer>&EagerReturnTypeResolutionTestb.K, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: java.lang.Integer, java.lang.Integer,java.lang.String) ++EagerReturnTypeResolutionTestb.java:108:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I<java.lang.String>, EagerReturnTypeResolutionTestb.I<compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object)) ++EagerReturnTypeResolutionTestb.java:109:21: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.Integer>>,java.util.List<EagerReturnTypeResolutionTestb.K>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.K, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J<java.lang.Integer>) ++EagerReturnTypeResolutionTestb.java:110:9: compiler.err.cant.apply.symbol: kindname.method, takeIString, EagerReturnTypeResolutionTestb.I<java.lang.String>, java.lang.Object&EagerReturnTypeResolutionTestb.J<java.lang.Integer>&EagerReturnTypeResolutionTestb.K, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Object&EagerReturnTypeResolutionTestb.J<java.lang.Integer>&EagerReturnTypeResolutionTestb.K, EagerReturnTypeResolutionTestb.I<java.lang.String>,EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J<java.lang.Integer>,java.lang.Object)) ++EagerReturnTypeResolutionTestb.java:112:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: EagerReturnTypeResolutionTestb.I<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>, EagerReturnTypeResolutionTestb.I<java.lang.String>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:113:24: compiler.err.cant.apply.symbol: kindname.method, eq2, java.util.List<T>,java.util.List<T>, java.util.List<EagerReturnTypeResolutionTestb.J<java.lang.Integer>>,java.util.List<EagerReturnTypeResolutionTestb.K>, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.inferred.do.not.conform.to.eq.bounds: EagerReturnTypeResolutionTestb.K, EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J<java.lang.Integer>) ++EagerReturnTypeResolutionTestb.java:114:30: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Object&EagerReturnTypeResolutionTestb.J<java.lang.Integer>&EagerReturnTypeResolutionTestb.K, EagerReturnTypeResolutionTestb.I<java.lang.String>,EagerReturnTypeResolutionTestb.K,EagerReturnTypeResolutionTestb.J<java.lang.Integer>,java.lang.Object) ++EagerReturnTypeResolutionTestb.java:174:9: compiler.err.cant.apply.symbol: kindname.method, takeLong, long, java.lang.Double, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.infer.no.conforming.instance.exists: , T, long)) ++EagerReturnTypeResolutionTestb.java:175:9: compiler.err.cant.apply.symbol: kindname.method, takeLong, long, java.lang.Double, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.infer.no.conforming.instance.exists: , T, long)) ++EagerReturnTypeResolutionTestb.java:176:9: compiler.err.cant.apply.symbol: kindname.method, takeLong, long, java.lang.Double, kindname.class, EagerReturnTypeResolutionTestb, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.infer.no.conforming.instance.exists: , T, long)) ++EagerReturnTypeResolutionTestb.java:178:26: compiler.err.prob.found.req: (compiler.misc.infer.no.conforming.instance.exists: , T, long) ++EagerReturnTypeResolutionTestb.java:179:23: compiler.err.prob.found.req: (compiler.misc.infer.no.conforming.instance.exists: , T, long) ++EagerReturnTypeResolutionTestb.java:180:26: compiler.err.prob.found.req: (compiler.misc.infer.no.conforming.instance.exists: , T, long) ++- compiler.note.unchecked.filename: EagerReturnTypeResolutionTestb.java ++- compiler.note.unchecked.recompile ++42 errors +--- ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/PrimitiveTypeBoxingTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/PrimitiveTypeBoxingTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,25 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8030741 ++ * @summary Inference: implement eager resolution of return types, consistent with JDK-8028800 ++ * @compile/fail/ref=PrimitiveTypeBoxingTest.out -XDrawDiagnostics PrimitiveTypeBoxingTest.java ++ */ ++ ++public class PrimitiveTypeBoxingTest { ++ ++ static void foo(long arg) {} ++ static void bar(int arg) {} ++ ++ interface F<X> { void get(X arg); } ++ ++ <Z> void m1(F<Z> f, Z arg) {} ++ <Z> void m2(Z arg, F<Z> f) {} ++ ++ void test() { ++ m1(PrimitiveTypeBoxingTest::foo, 23); // expected: error ++ m2(23, PrimitiveTypeBoxingTest::foo); // expected: error ++ ++ m1(PrimitiveTypeBoxingTest::bar, 23); // expected: success ++ m2(23, PrimitiveTypeBoxingTest::bar); // expected: success ++ } ++} +--- ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/PrimitiveTypeBoxingTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/inference/EagerReturnTypeResolution/PrimitiveTypeBoxingTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,3 @@ ++PrimitiveTypeBoxingTest.java:19:9: compiler.err.cant.apply.symbol: kindname.method, m1, PrimitiveTypeBoxingTest.F<Z>,Z, @490,int, kindname.class, PrimitiveTypeBoxingTest, (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, java.lang.Long,java.lang.Object) ++PrimitiveTypeBoxingTest.java:20:9: compiler.err.cant.apply.symbol: kindname.method, m2, Z,PrimitiveTypeBoxingTest.F<Z>, int,@559, kindname.class, PrimitiveTypeBoxingTest, (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, java.lang.Long,java.lang.Object) ++2 errors +--- ./langtools/test/tools/javac/generics/inference/LowerBoundGLB.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/inference/LowerBoundGLB.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 ++ * @bug 8033718 ++ * @author dlsmith ++ * @summary GLB for two capture variables with lower bounds ++ * @compile LowerBoundGLB.java ++ */ ++ ++public class LowerBoundGLB { ++ ++ interface Box<T> { ++ T get(); ++ void set(T arg); ++ } ++ ++ <T> T doGLB(Box<? super T> b1, Box<? super T> b2) { ++ return null; ++ } ++ ++ void test(Box<? super String> l1, Box<? super CharSequence> l2) { ++ doGLB(l1, l2).substring(3); ++ } ++ ++} +--- ./langtools/test/tools/javac/generics/inference/NestedWildcards.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/inference/NestedWildcards.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,44 @@ ++/* ++ * 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 8039214 ++ * @summary Nested generic methods that work on wildcard-parameterized types ++ * @compile NestedWildcards.java ++ */ ++ ++public class NestedWildcards { ++ ++ public static void test(Box<String> b) { ++ foo(bar(b)); ++ } ++ private static <X> Box<? extends X> foo(Box<? extends X> ts) { ++ return null; ++ } ++ public static <Y> Box<? extends Y> bar(Box<? extends Y> language) { ++ return null; ++ } ++ ++ interface Box<T> {} ++} +--- ./langtools/test/tools/javac/generics/inference/T8028503/PrimitiveTypeInBoundForMethodRefTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/inference/T8028503/PrimitiveTypeInBoundForMethodRefTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @bug 8028503 ++ * @summary javac, for method references a primitive type can be added as a bound ++ * @compile PrimitiveTypeInBoundForMethodRefTest.java ++ */ ++ ++class PrimitiveTypeInBoundForMethodRefTest { ++ ++ interface Mapper<T, U> { ++ U map(T t); ++ } ++ ++ static <U> Iterable<U> map(Mapper<String, U> mapper) { ++ return null; ++ } ++ ++ static void test() { ++ Iterable<Integer> map = map(PrimitiveTypeInBoundForMethodRefTest::length); ++ } ++ ++ public static <T> int length(String s) { ++ return 0; ++ } ++} +--- ./langtools/test/tools/javac/generics/typevars/IntersectionSubVar.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/typevars/IntersectionSubVar.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,49 @@ ++/* ++ * 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 8042656 ++ * @summary Subtyping for intersection types containing type variables ++ * @compile IntersectionSubVar.java ++ */ ++ ++class IntersectionSubVar { ++ ++ interface Box<T> { ++ void set(T arg); ++ T get(); ++ } ++ ++ <I> Box<I> glb(Box<? super I> arg1, Box<? super I> arg2) { ++ return null; ++ } ++ ++ <E extends Cloneable> void takeBox(Box<? super E> box) {} ++ ++ <T> void test(Box<T> arg1, Box<Cloneable> arg2, Box<? super T> arg3) { ++ T t = glb(arg1, arg2).get(); // assign T&Cloneable to T ++ takeBox(arg3); // inference tests Box<CAP> <: Box<? super CAP&Cloneable> ++ } ++ ++} +--- ./langtools/test/tools/javac/generics/wildcards/7034495/T7034495.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/generics/wildcards/7034495/T7034495.out Wed Jul 30 03:55:11 2014 -0700 +@@ -1,2 +1,2 @@ +-T7034495.java:40:17: compiler.err.types.incompatible.diff.ret: T7034495.B<?>, T7034495.A<?>, foo() ++T7034495.java:40:17: compiler.err.types.incompatible.diff.ret: T7034495.B<compiler.misc.type.captureof: 1, ?>, T7034495.A<compiler.misc.type.captureof: 2, ?>, foo() + 1 error +--- ./langtools/test/tools/javac/generics/wildcards/RefQueue.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/wildcards/RefQueue.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,24 @@ ++/* ++ * 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. ++ */ ++ ++public class RefQueue<S> { } +--- ./langtools/test/tools/javac/generics/wildcards/RefQueueBug.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/wildcards/RefQueueBug.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 8033437 ++ * @summary inconsistent generic types behaviour when compiling together vs. separate ++ * @compile RefQueue.java ++ * @compile RefQueueBug.java ++ */ ++ ++public class RefQueueBug<T> { ++ final RefQueue<? super T> queue = new RefQueue<>(); ++ public static void main(String[] args) { ++ RefQueueBug<Object> r = new RefQueueBug<>(); ++ RefQueue<Object> q = r.queue; ++ } ++} +--- ./langtools/test/tools/javac/generics/wildcards/T8015101.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/wildcards/T8015101.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,44 @@ ++/* ++ * 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 8015101 ++ * @summary Mishandling of wildcards in intersection member method check ++ * @compile T8015101.java ++ */ ++class T8015101 { ++ ++ public static class Bug<X extends Child<?, ?> & Runnable> { ++ } ++ ++ interface Parent<C> { ++ public C get(); ++ } ++ ++ interface Child<C, S extends C> extends Parent<C> { ++ @Override ++ public S get(); ++ } ++ ++ } +--- ./langtools/test/tools/javac/generics/wildcards/T8034147.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/generics/wildcards/T8034147.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,35 @@ ++/* ++ * 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 8034147 ++ * @summary javac crashes with a NullPointerException during bounds checking ++ * @compile T8034147.java ++ */ ++ ++class T8034147 { ++ static class One<X extends Two<? super X>> {} ++ static class Two<Y extends Three<? extends Y>> implements Three<Y> {} ++ interface Three<Z> {} ++} +--- ./langtools/test/tools/javac/lambda/ErroneousLambdaExpr.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/ErroneousLambdaExpr.java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,66 +0,0 @@ +-/* +- * Copyright (c) 2012, 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. +- */ +- +-/* +- * @test +- * @bug 8003280 +- * @summary Add lambda tests +- * stale state after speculative attribution round leads to missing classfiles +- * @compile/fail/ref=ErroneousLambdaExpr.out -XDrawDiagnostics ErroneousLambdaExpr.java +- */ +-public class ErroneousLambdaExpr<T> { +- +- static int assertionCount = 0; +- +- static void assertTrue(boolean cond) { +- assertionCount++; +- if (!cond) +- throw new AssertionError(); +- } +- +- interface SAM1<X> { +- X m(X t, String s); +- } +- +- interface SAM2 { +- void m(String s, int i); +- } +- +- interface SAM3<X> { +- X m(X t, String s, int i); +- } +- +- void call(SAM1<T> s1) { assertTrue(true); } +- +- void call(SAM2 s2) { assertTrue(false); } +- +- void call(SAM3<T> s3) { assertTrue(false); } +- +- public static void main(String[] args) { +- ErroneousLambdaExpr<StringBuilder> test = +- new ErroneousLambdaExpr<>(); +- +- test.call((builder, string) -> { builder.append(string); return builder; }); +- assertTrue(assertionCount == 1); +- } +-} +--- ./langtools/test/tools/javac/lambda/ErroneousLambdaExpr.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/ErroneousLambdaExpr.out Thu Jan 01 00:00:00 1970 +0000 +@@ -1,2 +0,0 @@ +-ErroneousLambdaExpr.java:63:13: compiler.err.ref.ambiguous: call, kindname.method, call(ErroneousLambdaExpr.SAM1<T>), ErroneousLambdaExpr, kindname.method, call(ErroneousLambdaExpr.SAM2), ErroneousLambdaExpr +-1 error +--- ./langtools/test/tools/javac/lambda/FunctionalInterfaceConversionTest.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/FunctionalInterfaceConversionTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -30,7 +30,7 @@ + * @author Maurizio Cimadamore + * @library ../lib + * @build JavacTestingAbstractThreadedTest +- * @run main/othervm FunctionalInterfaceConversionTest ++ * @run main/timeout=600/othervm FunctionalInterfaceConversionTest + */ + + // use /othervm to avoid jtreg timeout issues (CODETOOLS-7900047) +--- ./langtools/test/tools/javac/lambda/InnerConstructor.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/InnerConstructor.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, 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 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 8003280 ++ * @bug 8003280 8003306 + * @summary Add lambda tests + * Regression test JDK-8003306 inner class constructor in lambda + * @author Robert Field +--- ./langtools/test/tools/javac/lambda/LambdaExprLeadsToMissingClassFilesTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/LambdaExprLeadsToMissingClassFilesTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,66 @@ ++/* ++ * Copyright (c) 2012, 2014 Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8003280 ++ * @summary Add lambda tests ++ * stale state after speculative attribution round leads to missing classfiles ++ */ ++public class LambdaExprLeadsToMissingClassFilesTest<T> { ++ ++ static int assertionCount = 0; ++ ++ static void assertTrue(boolean cond) { ++ assertionCount++; ++ if (!cond) { ++ throw new AssertionError(); ++ } ++ } ++ ++ interface SAM1<X> { ++ X m(X t, String s); ++ } ++ ++ interface SAM2 { ++ void m(String s, int i); ++ } ++ ++ interface SAM3<X> { ++ X m(X t, String s, int i); ++ } ++ ++ void call(SAM1<T> s1) { assertTrue(true); } ++ ++ void call(SAM2 s2) { assertTrue(false); } ++ ++ void call(SAM3<T> s3) { assertTrue(false); } ++ ++ public static void main(String[] args) { ++ LambdaExprLeadsToMissingClassFilesTest<StringBuilder> test = ++ new LambdaExprLeadsToMissingClassFilesTest<>(); ++ ++ test.call((builder, string) -> { builder.append(string); return builder; }); ++ assertTrue(assertionCount == 1); ++ } ++} +--- ./langtools/test/tools/javac/lambda/LambdaLocalTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/LambdaLocalTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * 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 8029725 ++ * @summary Lambda reference to containing local class causes javac infinite recursion ++ * @author Robert Field ++ * @run main LambdaLocalTest ++ */ ++ ++public class LambdaLocalTest { ++ interface F {void f();} ++ ++ static F f; ++ static StringBuffer sb = new StringBuffer(); ++ ++ static void assertEquals(Object val, Object expected) { ++ if (!val.equals(expected)) { ++ throw new AssertionError("expected '" + expected + "' got '" + val + "'"); ++ } ++ } ++ ++ public static void main(String[] args) { ++ class Local { ++ public Local() { ++ f = () -> new Local(); ++ sb.append("+"); ++ } ++ } ++ new Local(); ++ f.f(); ++ assertEquals(sb.toString(), "++"); ++ } ++} +--- ./langtools/test/tools/javac/lambda/LambdaMultiCatchTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/LambdaMultiCatchTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. 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. ++ */ ++ ++/** ++ * @test ++ * @bug 8036942 ++ * @summary javac generates incorrect exception table for multi-catch statements inside a lambda ++ * @run main LambdaMultiCatchTest ++ */ ++ ++import java.io.IOException; ++import java.util.function.Function; ++ ++public class LambdaMultiCatchTest { ++ public static void main(String[] args) { ++ Function<String,String> fi = x -> { ++ String result = "nada"; ++ try { ++ switch (x) { ++ case "IO": throw new IOException(); ++ case "Illegal": throw new IllegalArgumentException(); ++ case "Run": throw new RuntimeException(); ++ } ++ } catch (IOException|IllegalArgumentException ex) { ++ result = "IO/Illegal"; ++ } catch (Exception ex) { ++ result = "Any"; ++ }; ++ return result; ++ }; ++ String val = fi.apply("Run"); ++ if (!val.equals("Any")) { ++ throw new AssertionError("Fail: Expected 'Any' but got '" + val + "'"); ++ } ++ } ++} +--- ./langtools/test/tools/javac/lambda/LambdaOuterLocalTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/LambdaOuterLocalTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,61 @@ ++/* ++ * 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 8029725 ++ * @summary Lambda reference to containing local class causes javac infinite recursion ++ * @author Robert Field ++ * @run main LambdaOuterLocalTest ++ */ ++ ++public class LambdaOuterLocalTest { ++ interface F {void f();} ++ ++ static F f; ++ static StringBuffer sb = new StringBuffer(); ++ ++ static void assertEquals(Object val, Object expected) { ++ if (!val.equals(expected)) { ++ throw new AssertionError("expected '" + expected + "' got '" + val + "'"); ++ } ++ } ++ ++ public static void main(String[] args) { ++ class Local1 { ++ public Local1() { ++ class Local2 { ++ public Local2() { ++ f = () -> new Local1(); ++ sb.append("2"); ++ } ++ } ++ sb.append("1"); ++ new Local2(); ++ } ++ } ++ new Local1(); ++ f.f(); ++ assertEquals(sb.toString(), "1212"); ++ } ++} +--- ./langtools/test/tools/javac/lambda/MethodReference42.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/MethodReference42.out Wed Jul 30 03:55:11 2014 -0700 +@@ -1,4 +1,4 @@ +-MethodReference42.java:38:11: compiler.err.cant.apply.symbol: kindname.method, m1, MethodReference42.SAM1, @811, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number)) +-MethodReference42.java:40:11: compiler.err.cant.apply.symbol: kindname.method, m3, MethodReference42.SAM3, @855, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number)) ++MethodReference42.java:38:11: compiler.err.cant.apply.symbol: kindname.method, m1, MethodReference42.SAM1, @811, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number))) ++MethodReference42.java:40:11: compiler.err.cant.apply.symbol: kindname.method, m3, MethodReference42.SAM3, @855, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number))) + MethodReference42.java:41:9: compiler.err.ref.ambiguous: m4, kindname.method, m4(MethodReference42.SAM2), MethodReference42, kindname.method, m4(MethodReference42.SAM3), MethodReference42 + 3 errors +--- ./langtools/test/tools/javac/lambda/MethodReference44.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/MethodReference44.out Wed Jul 30 03:55:11 2014 -0700 +@@ -1,4 +1,4 @@ +-MethodReference44.java:40:11: compiler.err.cant.apply.symbol: kindname.method, g1, MethodReference44.SAM1, @864, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number)) +-MethodReference44.java:42:11: compiler.err.cant.apply.symbol: kindname.method, g3, MethodReference44.SAM3, @932, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number)) ++MethodReference44.java:40:11: compiler.err.cant.apply.symbol: kindname.method, g1, MethodReference44.SAM1, @864, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number))) ++MethodReference44.java:42:11: compiler.err.cant.apply.symbol: kindname.method, g3, MethodReference44.SAM3, @932, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number))) + MethodReference44.java:43:9: compiler.err.ref.ambiguous: g4, kindname.method, g4(MethodReference44.SAM2), MethodReference44, kindname.method, g4(MethodReference44.SAM3), MethodReference44 + 3 errors +--- ./langtools/test/tools/javac/lambda/MostSpecific09.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific09.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,81 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8029718 ++ * @summary Should always use lambda body structure to disambiguate overload resolution ++ * @compile/fail/ref=MostSpecific09.out -XDrawDiagnostics -XDshouldStopPolicy=ATTR -XDverboseResolution=applicable,success MostSpecific09.java ++ */ ++ ++class MostSpecific09 { ++ ++ interface I { ++ String xoo(String x); ++ } ++ ++ interface J { ++ void xoo(int x); ++ } ++ ++ static void foo(I i) {} ++ static void foo(J j) {} ++ ++ static void moo(I i) {} ++ static void moo(J j) {} ++ ++ void m() { ++ foo((x) -> { return x += 1; }); ++ foo((x) -> { return ""; }); ++ foo((x) -> { System.out.println(""); }); ++ foo((x) -> { return ""; System.out.println(""); }); ++ foo((x) -> { throw new RuntimeException(); }); ++ foo((x) -> { while (true); }); ++ ++ foo((x) -> x += 1); ++ foo((x) -> ""); ++ } ++ ++ /* any return statement that is not in the body of the lambda but in an ++ * inner class or another lambda should be ignored for value void compatibility ++ * determination. ++ */ ++ void m1() { ++ boolean cond = true; ++ foo((x) -> { ++ if (cond) { ++ return ""; ++ } ++ System.out.println(""); ++ }); ++ ++ foo((x)->{ ++ class Bar { ++ String m() { ++ return "from Bar.m()"; ++ } ++ } ++ class Boo { ++ Bar b = new Bar (){ ++ String m() { ++ return "from Bar$1.m()"; ++ } ++ }; ++ } ++ moo((y) -> { return ""; }); ++ return; ++ }); ++ ++ foo((x)->{ ++ class Bar { ++ void m() {} ++ } ++ class Boo { ++ Bar b = new Bar (){ ++ void m() { ++ return; ++ } ++ }; ++ } ++ moo((y) -> { System.out.println(""); }); ++ return ""; ++ }); ++ } ++} +--- ./langtools/test/tools/javac/lambda/MostSpecific09.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific09.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,27 @@ ++MostSpecific09.java:25:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.I), null)} ++MostSpecific09.java:26:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.I), null)} ++MostSpecific09.java:27:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.J), null)} ++MostSpecific09.java:27:32: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} ++MostSpecific09.java:28:13: compiler.err.lambda.body.neither.value.nor.void.compatible ++MostSpecific09.java:28:9: compiler.err.cant.apply.symbols: kindname.method, foo, @680,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} ++MostSpecific09.java:28:43: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} ++MostSpecific09.java:29:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(MostSpecific09.I), MostSpecific09, kindname.method, foo(MostSpecific09.J), MostSpecific09 ++MostSpecific09.java:29:28: compiler.note.verbose.resolve.multi: <init>, java.lang.RuntimeException, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, java.lang.RuntimeException(), null)} ++MostSpecific09.java:30:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(MostSpecific09.I), MostSpecific09, kindname.method, foo(MostSpecific09.J), MostSpecific09 ++MostSpecific09.java:32:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(MostSpecific09.I), MostSpecific09, kindname.method, foo(MostSpecific09.J), MostSpecific09 ++MostSpecific09.java:33:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.I), null)} ++MostSpecific09.java:42:13: compiler.err.lambda.body.neither.value.nor.void.compatible ++MostSpecific09.java:42:9: compiler.err.cant.apply.symbols: kindname.method, foo, @1129,{(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.I), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.missing.ret.val: java.lang.String)))),(compiler.misc.inapplicable.method: kindname.method, MostSpecific09, foo(MostSpecific09.J), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.unexpected.ret.val)))} ++MostSpecific09.java:46:23: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} ++MostSpecific09.java:49:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.J), null)} ++MostSpecific09.java:56:25: compiler.note.verbose.resolve.multi: <init>, Bar, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, Bar(), null)} ++MostSpecific09.java:56:35: compiler.note.verbose.resolve.multi: <init>, Bar, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, Bar(), null)} ++MostSpecific09.java:56:25: compiler.note.verbose.resolve.multi: <init>, compiler.misc.anonymous.class: MostSpecific09$1Boo$1, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, compiler.misc.anonymous.class: MostSpecific09$1Boo$1(), null)} ++MostSpecific09.java:62:13: compiler.note.verbose.resolve.multi: moo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, moo(MostSpecific09.I), null)} ++MostSpecific09.java:66:9: compiler.note.verbose.resolve.multi: foo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, foo(MostSpecific09.I), null)} ++MostSpecific09.java:71:25: compiler.note.verbose.resolve.multi: <init>, Bar, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, Bar(), null)} ++MostSpecific09.java:71:35: compiler.note.verbose.resolve.multi: <init>, Bar, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, Bar(), null)} ++MostSpecific09.java:71:25: compiler.note.verbose.resolve.multi: <init>, compiler.misc.anonymous.class: MostSpecific09$2Boo$1, 0, BASIC, compiler.misc.no.args, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, compiler.misc.anonymous.class: MostSpecific09$2Boo$1(), null)} ++MostSpecific09.java:77:13: compiler.note.verbose.resolve.multi: moo, MostSpecific09, 0, BASIC, compiler.misc.type.none, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, moo(MostSpecific09.J), null)} ++MostSpecific09.java:77:36: compiler.note.verbose.resolve.multi: println, java.io.PrintStream, 1, BASIC, java.lang.String, compiler.misc.no.args,{(compiler.misc.applicable.method.found: 0, println(java.lang.Object), null),(compiler.misc.applicable.method.found: 1, println(java.lang.String), null)} ++7 errors +--- ./langtools/test/tools/javac/lambda/MostSpecific10.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific10.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,54 @@ ++/* ++ * 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 8034223 ++ * @summary Structural most-specific logic for lambdas, method refs, parens, and conditionals ++ * @compile MostSpecific10.java ++ */ ++class MostSpecific10 { ++ ++ interface GetInt { ++ int get(); ++ } ++ ++ interface GetInteger { ++ Integer get(); ++ } ++ ++ void m(GetInt getter) {} ++ void m(GetInteger getter) {} ++ ++ void test(boolean cond) { ++ m(() -> 23); ++ m("abc"::length); ++ m(( () -> 23 )); ++ m(( "abc"::length )); ++ m(cond ? () -> 23 : "abc"::length); ++ m(( cond ? () -> 23 : "abc"::length )); ++ m(cond ? (() -> 23) : ("abc"::length) ); ++ m(( cond ? () -> 23 : cond ? ("abc"::length) : (() -> 23) )); ++ } ++ ++} +--- ./langtools/test/tools/javac/lambda/MostSpecific11.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific11.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,42 @@ ++/* ++ * 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 8034223 ++ * @summary Return type Object is not more specific than return type String ++ * @compile MostSpecific11.java ++ */ ++class MostSpecific11 { ++ ++ interface I { Object run(); } ++ interface J { String run(); } ++ ++ void m(I arg) {} ++ void m(J arg) {} ++ ++ void test() { ++ m(() -> { throw new RuntimeException(); }); ++ } ++ ++} +--- ./langtools/test/tools/javac/lambda/MostSpecific12.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific12.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,38 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8034223 ++ * @summary Most-specific testing with inference variables in function parameter types ++ * @compile/fail/ref=MostSpecific12.out -XDrawDiagnostics MostSpecific12.java ++ */ ++class MostSpecific12 { ++ ++ interface I<T> { void take(T arg1, String arg2); } ++ interface J<T> { void take(String arg1, T arg2); } ++ interface K { void take(String arg1, String arg2); } ++ ++ <T> void m1(I<T> arg) {} ++ void m1(K arg) {} ++ ++ <T> void m2(J<T> arg) {} ++ <T> void m2(K arg) {} ++ ++ <T> void m3(I<T> arg) {} ++ <T> void m3(J<T> arg) {} ++ ++ void test() { ++ m1((String s1, String s2) -> {}); // ok ++ m2((String s1, String s2) -> {}); // ok ++ m3((String s1, String s2) -> {}); // error ++ ++ m1(this::referencedMethod); // ok ++ m2(this::referencedMethod); // ok ++ m3(this::referencedMethod); // error ++ ++ m1(String::compareTo); // ok ++ m2(String::compareTo); // ok ++ m3(String::compareTo); // error ++ } ++ ++ void referencedMethod(String s1, String s2) {} ++ ++} +--- ./langtools/test/tools/javac/lambda/MostSpecific12.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific12.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,4 @@ ++MostSpecific12.java:25:9: compiler.err.ref.ambiguous: m3, kindname.method, <T>m3(MostSpecific12.I<T>), MostSpecific12, kindname.method, <T>m3(MostSpecific12.J<T>), MostSpecific12 ++MostSpecific12.java:29:9: compiler.err.ref.ambiguous: m3, kindname.method, <T>m3(MostSpecific12.I<T>), MostSpecific12, kindname.method, <T>m3(MostSpecific12.J<T>), MostSpecific12 ++MostSpecific12.java:33:9: compiler.err.ref.ambiguous: m3, kindname.method, <T>m3(MostSpecific12.I<T>), MostSpecific12, kindname.method, <T>m3(MostSpecific12.J<T>), MostSpecific12 ++3 errors +--- ./langtools/test/tools/javac/lambda/MostSpecific13.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific13.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,21 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8034223 ++ * @summary Most-specific testing with inference variables in function parameter types ++ * @compile/fail/ref=MostSpecific13.out -XDrawDiagnostics MostSpecific13.java ++ */ ++class MostSpecific13 { ++ ++ interface UnaryOp<T> { T apply(T arg); } ++ interface IntegerToNumber { Number apply(Integer arg); } ++ ++ <T> void m(UnaryOp<T> f) {} ++ void m(IntegerToNumber f) {} ++ ++ void test() { ++ m((Integer i) -> i); // error ++ m(this::id); // error ++ } ++ ++ Integer id(Integer arg) { return arg; } ++} +\ No newline at end of file +--- ./langtools/test/tools/javac/lambda/MostSpecific13.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific13.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,3 @@ ++MostSpecific13.java:16:9: compiler.err.ref.ambiguous: m, kindname.method, <T>m(MostSpecific13.UnaryOp<T>), MostSpecific13, kindname.method, m(MostSpecific13.IntegerToNumber), MostSpecific13 ++MostSpecific13.java:17:9: compiler.err.ref.ambiguous: m, kindname.method, <T>m(MostSpecific13.UnaryOp<T>), MostSpecific13, kindname.method, m(MostSpecific13.IntegerToNumber), MostSpecific13 ++2 errors +--- ./langtools/test/tools/javac/lambda/MostSpecific14.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific14.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,33 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8034223 ++ * @summary Most-specific testing for nested functional interface types ++ * @compile/fail/ref=MostSpecific14.out -XDrawDiagnostics MostSpecific14.java ++ */ ++class MostSpecific14 { ++ interface ToNumber { Number get(); } ++ interface ToToNumber { ToNumber get(); } ++ interface Factory<T> { T get(); } ++ ++ void m1(Factory<Factory<Object>> f) {} ++ void m1(ToToNumber f) {} ++ ++ void m2(Factory<Factory<Number>> f) {} ++ void m2(ToToNumber f) {} ++ ++ void m3(Factory<Factory<Integer>> f) {} ++ void m3(ToToNumber f) {} ++ ++ ++ void test() { ++ m1(() -> () -> 23); // ok: choose ToToNumber ++ m2(() -> () -> 23); // error: ambiguous ++ m3(() -> () -> 23); // ok: choose Factory<Factory<Integer>> ++ ++ m1(() -> this::getInteger); // ok: choose ToToNumber ++ m2(() -> this::getInteger); // error: ambiguous ++ m3(() -> this::getInteger); // ok: choose Factory<Factory<Integer>> ++ } ++ ++ Integer getInteger() { return 23; } ++} +\ No newline at end of file +--- ./langtools/test/tools/javac/lambda/MostSpecific14.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/MostSpecific14.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,3 @@ ++MostSpecific14.java:24:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(MostSpecific14.Factory<MostSpecific14.Factory<java.lang.Number>>), MostSpecific14, kindname.method, m2(MostSpecific14.ToToNumber), MostSpecific14 ++MostSpecific14.java:28:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(MostSpecific14.Factory<MostSpecific14.Factory<java.lang.Number>>), MostSpecific14, kindname.method, m2(MostSpecific14.ToToNumber), MostSpecific14 ++2 errors +--- ./langtools/test/tools/javac/lambda/SingleLocalTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/SingleLocalTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,50 @@ ++/* ++ * 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 8029852 ++ * @summary Bad code generated (VerifyError) when lambda instantiates ++ * enclosing local class and has captured variables ++ */ ++public class SingleLocalTest { ++ interface F {void f();} ++ ++ static F f; ++ ++ public static void main(String[] args) { ++ StringBuffer sb = new StringBuffer(); ++ class Local1 { ++ public Local1() { ++ f = () -> new Local1(); ++ sb.append("1"); ++ } ++ } ++ new Local1(); ++ f.f(); ++ String s = sb.toString(); ++ if (!s.equals("11")) { ++ throw new AssertionError("Expected '11' got '" + s + "'"); ++ } ++ } ++} +--- ./langtools/test/tools/javac/lambda/T8031967.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/T8031967.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,137 @@ ++/* ++ * 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 8031967 ++ * @summary Ensure javac can handle very deeply nested chain of method invocations occurring as ++ * a parameter to other method invocations. ++ * @run main T8031967 ++ */ ++ ++import java.io.IOException; ++import java.net.URI; ++import java.util.Arrays; ++import java.util.List; ++ ++import javax.tools.DiagnosticListener; ++import javax.tools.JavaCompiler; ++import javax.tools.JavaFileObject; ++import javax.tools.SimpleJavaFileObject; ++import javax.tools.ToolProvider; ++ ++import com.sun.source.util.JavacTask; ++ ++public class T8031967 { ++ ++ public static void main(String... args) throws IOException { ++ new T8031967().run(); ++ } ++ ++ final int depth = 50; ++ ++ private void run() throws IOException { ++ runTestCase(true); ++ runTestCase(false); ++ } ++ ++ private void runTestCase(boolean withErrors) throws IOException { ++ StringBuilder code = new StringBuilder(); ++ ++ code.append("public class Test {\n" + ++ " private void test() {\n" + ++ " GroupLayout l = new GroupLayout();\n" + ++ " l.setHorizontalGroup(\n"); ++ ++ gen(code, depth); ++ code.append(" );\n" + ++ " }\n"); ++ if (!withErrors) { ++ code.append(" class GroupLayout {\n" + ++ " ParallelGroup createParallelGroup() {return null;}\n" + ++ " ParallelGroup createParallelGroup(int i) {return null;}\n" + ++ " ParallelGroup createParallelGroup(int i, int j) {return null;}\n" + ++ " void setHorizontalGroup(Group g) { }\n" + ++ " }\n" + ++ " \n" + ++ " class Group {\n" + ++ " Group addGroup(Group g) { return this; }\n" + ++ " Group addGroup(int i, Group g) { return this; }\n" + ++ " Group addGap(int i) { return this; }\n" + ++ " Group addGap(long l) { return this; }\n" + ++ " Group addGap(int i, int j) { return this; }\n" + ++ " Group addComponent(Object c) { return this; }\n" + ++ " Group addComponent(int i, Object c) { return this; }\n" + ++ " }\n" + ++ " class ParallelGroup extends Group {\n" + ++ " Group addGroup(Group g) { return this; }\n" + ++ " Group addGroup(int i, Group g) { return this; }\n" + ++ " Group addGap(int i) { return this; }\n" + ++ " Group addGap(int i, int j) { return this; }\n" + ++ " Group addComponent(Object c) { return this; }\n" + ++ " Group addComponent(int i, Object c) { return this; }\n" + ++ " }\n"); ++ } ++ ++ code.append("}\n"); ++ ++ JavaSource source = new JavaSource(code.toString()); ++ List<JavaSource> sourceList = Arrays.asList(source); ++ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); ++ DiagnosticListener<JavaFileObject> noErrors = (diagnostic) -> { ++ throw new IllegalStateException("Should not produce errors: " + diagnostic); ++ }; ++ JavacTask task = (JavacTask) compiler.getTask(null, null, withErrors ? null : noErrors, ++ null, null, sourceList); ++ ++ task.analyze(); ++ } ++ ++ private void gen(StringBuilder code, int depth) { ++ code.append("l.createParallelGroup()\n"); ++ if (depth > 0) { ++ code.append(".addGroup(\n"); ++ gen(code, depth - 1); ++ code.append(")"); ++ } ++ ++ code.append(".addGap(1)\n" + ++ ".addComponent(new Object())\n" + ++ ".addGap(1)\n" + ++ ".addComponent(new Object())"); ++ } ++ ++ class JavaSource extends SimpleJavaFileObject { ++ ++ final String code; ++ public JavaSource(String code) { ++ super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE); ++ this.code = code; ++ } ++ ++ @Override ++ public CharSequence getCharContent(boolean ignoreEncodingErrors) { ++ return code; ++ } ++ } ++} +--- ./langtools/test/tools/javac/lambda/T8037935/LambdaWithBinOpConstRefToConstString.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/T8037935/LambdaWithBinOpConstRefToConstString.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,43 @@ ++/* ++ * 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 8037935 ++ * @summary Javac: final local String var referenced in binary/unary op in lambda produces code that does not verify ++ * @run main LambdaWithBinOpConstRefToConstString ++ */ ++ ++interface MyFI { ++ void accept(); ++} ++ ++public class LambdaWithBinOpConstRefToConstString { ++ public static void main(String[] args) { ++ final String CONSTANT_STRING_VALUE = "mwmwm"; ++ ++ MyFI consumeStrings = () -> { ++ System.out.println(" local constant: " + CONSTANT_STRING_VALUE); ++ }; ++ } ++} +--- ./langtools/test/tools/javac/lambda/T8038182/CrashFunctionDescriptorExceptionTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/T8038182/CrashFunctionDescriptorExceptionTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,24 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8038182 ++ * @summary javac crash with FunctionDescriptorLookupError for invalid functional interface ++ * @compile/fail/ref=CrashFunctionDescriptorExceptionTest.out -XDrawDiagnostics CrashFunctionDescriptorExceptionTest.java ++ */ ++ ++class CrashFunctionDescriptorExceptionTest { ++ ++ @SuppressWarnings("unchecked") ++ void m () { ++ bar((B b) -> {}); ++ } ++ ++ <E extends A<E>> void bar(I<E> i) {} ++ ++ class A<E> {} ++ ++ class B<E> extends A<E> {} ++ ++ interface I<E extends A<E>> { ++ void foo(E e); ++ } ++} +--- ./langtools/test/tools/javac/lambda/T8038182/CrashFunctionDescriptorExceptionTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/T8038182/CrashFunctionDescriptorExceptionTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,2 @@ ++CrashFunctionDescriptorExceptionTest.java:12:13: compiler.err.prob.found.req: (compiler.misc.no.suitable.functional.intf.inst: CrashFunctionDescriptorExceptionTest.I<CrashFunctionDescriptorExceptionTest.B>) ++1 error +--- ./langtools/test/tools/javac/lambda/T8038420/LambdaIncrement.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/T8038420/LambdaIncrement.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,52 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @bug 8038420 ++ * @summary Lambda returning post-increment generates wrong code ++ * @run main LambdaIncrement ++ */ ++ ++public class LambdaIncrement { ++ ++ interface IntegerOp { Integer apply(Integer arg); } ++ ++ private static void assertNotIncremented(IntegerOp lmb, String label) { ++ int result = lmb.apply(3); ++ if (result != 3) { ++ throw new AssertionError("Post-increment failure. Expected 3, got: " + ++ result + " " + label); ++ } ++ } ++ ++ public static void main(String... args) throws Exception { ++ assertNotIncremented(x -> x++, "PostIncExpr"); ++ assertNotIncremented(x -> { return x++; }, "PostIncReturn"); ++ assertNotIncremented(x -> { int y = x; return y++; }, "PostIncLocal"); ++ assertNotIncremented(x -> { Integer y = x; return y++; }, "PostIncLocalBox"); ++ assertNotIncremented(x -> { int y = x; return y; }, "HASINIT"); ++ } ++} +--- ./langtools/test/tools/javac/lambda/T8041704/ErrorMessageTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/T8041704/ErrorMessageTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,12 @@ ++/** ++ * @test /nodynamiccopyright/ ++ * @bug 8041704 ++ * @summary wrong error message when mixing lambda expression and inner class ++ * @compile/fail/ref=ErrorMessageTest.out -XDrawDiagnostics ErrorMessageTest.java ++ */ ++ ++public class ErrorMessageTest { ++ void f(Runnable r) { ++ f(() -> { f(new MISSING() { public void run() {} }); }); ++ } ++} +--- ./langtools/test/tools/javac/lambda/T8041704/ErrorMessageTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/T8041704/ErrorMessageTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,2 @@ ++ErrorMessageTest.java:10:25: compiler.err.cant.resolve.location: kindname.class, MISSING, , , (compiler.misc.location: kindname.class, ErrorMessageTest, null) ++1 error +--- ./langtools/test/tools/javac/lambda/T8042759/ImplicitLambdaConsideredForApplicabilityTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/T8042759/ImplicitLambdaConsideredForApplicabilityTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,33 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8042759 ++ * @summary Lambda returning implicitly-typed lambdas considered pertinent to applicability ++ * @compile/fail/ref=ImplicitLambdaConsideredForApplicabilityTest.out -XDrawDiagnostics ImplicitLambdaConsideredForApplicabilityTest.java ++ */ ++ ++abstract class ImplicitLambdaConsideredForApplicabilityTest { ++ interface A { ++ B m(int a, int b); ++ } ++ ++ interface C { ++ String m(int a, int b); ++ } ++ ++ interface B { ++ int m(int c); ++ } ++ ++ abstract void foo(A a); ++ ++ abstract void foo(C c); ++ ++ void bar() { ++ foo((int a, int b) -> { ++ if(a < b) ++ return c -> 0; ++ else ++ return c -> 0; ++ }); ++ } ++} +--- ./langtools/test/tools/javac/lambda/T8042759/ImplicitLambdaConsideredForApplicabilityTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/lambda/T8042759/ImplicitLambdaConsideredForApplicabilityTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,2 @@ ++ImplicitLambdaConsideredForApplicabilityTest.java:26:9: compiler.err.ref.ambiguous: foo, kindname.method, foo(ImplicitLambdaConsideredForApplicabilityTest.A), ImplicitLambdaConsideredForApplicabilityTest, kindname.method, foo(ImplicitLambdaConsideredForApplicabilityTest.C), ImplicitLambdaConsideredForApplicabilityTest ++1 error +--- ./langtools/test/tools/javac/lambda/TargetType01.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType01.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -42,6 +42,10 @@ + static String M(F_S_S f){ return null; } + + static { +- M(x1 -> { return M( x2 -> { return x1 + x2; });}); //ambiguous ++ M(x1 -> { ++ return M( x2 -> { ++ return x1 + x2; ++ }); ++ }); //ambiguous + } + } +--- ./langtools/test/tools/javac/lambda/TargetType01.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType01.out Wed Jul 30 03:55:11 2014 -0700 +@@ -1,3 +1,3 @@ + TargetType01.java:45:9: compiler.err.ref.ambiguous: M, kindname.method, M(TargetType01.F_I_I), TargetType01, kindname.method, M(TargetType01.F_S_S), TargetType01 +-TargetType01.java:45:26: compiler.err.ref.ambiguous: M, kindname.method, M(TargetType01.F_I_I), TargetType01, kindname.method, M(TargetType01.F_S_S), TargetType01 ++TargetType01.java:46:20: compiler.err.ref.ambiguous: M, kindname.method, M(TargetType01.F_I_I), TargetType01, kindname.method, M(TargetType01.F_S_S), TargetType01 + 2 errors +--- ./langtools/test/tools/javac/lambda/TargetType02.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType02.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,31 +1,9 @@ + /* +- * Copyright (c) 2011, 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. +- */ +- +-/* +- * @test +- * @bug 8003280 ++ * @test /nodynamiccopyright/ ++ * @bug 8003280 8029718 + * @summary Add lambda tests + * check overload resolution and target type inference w.r.t. generic methods ++ * Should always use lambda body structure to disambiguate overload resolution + * @author Maurizio Cimadamore + * @compile/fail/ref=TargetType02.out -XDrawDiagnostics TargetType02.java + */ +@@ -47,9 +25,18 @@ + static <Z extends Number> void call3(S1<Z> s) { } + static <Z extends String> void call3(S2<Z> s) { } + ++ static <Z extends Number> Z call4(S1<Z> s) { return null; } ++ static <Z extends String> Z call4(S2<Z> s) { return null; } ++ + void test() { + call1(i -> { toString(); return i; }); + call2(i -> { toString(); return i; }); + call3(i -> { toString(); return i; }); ++ call3(i -> { ++ toString(); ++ return call4(j -> { ++ return j; ++ }); ++ }); + } + } +--- ./langtools/test/tools/javac/lambda/TargetType02.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType02.out Wed Jul 30 03:55:11 2014 -0700 +@@ -1,3 +1,5 @@ +-TargetType02.java:52:14: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, java.lang.String) +-TargetType02.java:53:9: compiler.err.ref.ambiguous: call3, kindname.method, <Z>call3(TargetType02.S1<Z>), TargetType02, kindname.method, <Z>call3(TargetType02.S2<Z>), TargetType02 +-2 errors ++TargetType02.java:33:14: compiler.err.prob.found.req: (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, java.lang.String) ++TargetType02.java:34:9: compiler.err.ref.ambiguous: call3, kindname.method, <Z>call3(TargetType02.S1<Z>), TargetType02, kindname.method, <Z>call3(TargetType02.S2<Z>), TargetType02 ++TargetType02.java:35:9: compiler.err.ref.ambiguous: call3, kindname.method, <Z>call3(TargetType02.S1<Z>), TargetType02, kindname.method, <Z>call3(TargetType02.S2<Z>), TargetType02 ++TargetType02.java:37:20: compiler.err.ref.ambiguous: call4, kindname.method, <Z>call4(TargetType02.S1<Z>), TargetType02, kindname.method, <Z>call4(TargetType02.S2<Z>), TargetType02 ++4 errors +--- ./langtools/test/tools/javac/lambda/TargetType16.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType16.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,9 +1,9 @@ + /* + * @test /nodynamiccopyright/ +- * @bug 8003280 ++ * @bug 8003280 8034223 + * @summary Add lambda tests + * Check void-compatibility in strict vs. loose conversion contexts +- * @compile/fail/ref=TargetType16.out -XDrawDiagnostics TargetType16.java ++ * @compile TargetType16.java + */ + + class TargetType16 { +@@ -20,6 +20,6 @@ + static <T> void m(SAM2<T> s2) { } + + public static void main(String[] args) { +- m(() -> { throw new AssertionError(); }); //ambiguous ++ m(() -> { throw new AssertionError(); }); // prefer SAM2 + } + } +--- ./langtools/test/tools/javac/lambda/TargetType16.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType16.out Thu Jan 01 00:00:00 1970 +0000 +@@ -1,2 +0,0 @@ +-TargetType16.java:23:9: compiler.err.ref.ambiguous: m, kindname.method, m(TargetType16.SAM1), TargetType16, kindname.method, <T>m(TargetType16.SAM2<T>), TargetType16 +-1 error +--- ./langtools/test/tools/javac/lambda/TargetType21.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType21.out Wed Jul 30 03:55:11 2014 -0700 +@@ -1,7 +1,5 @@ + TargetType21.java:28:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType21.SAM2), TargetType21, kindname.method, <R,A>call(TargetType21.SAM3<R,A>), TargetType21 +-TargetType21.java:31:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType21.SAM2), TargetType21, kindname.method, <R,A>call(TargetType21.SAM3<R,A>), TargetType21 +-TargetType21.java:32:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType21.SAM2), TargetType21, kindname.method, <R,A>call(TargetType21.SAM3<R,A>), TargetType21 +-TargetType21.java:32:13: compiler.err.cant.apply.symbol: kindname.method, call, TargetType21.SAM2, @888, kindname.class, TargetType21, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.unexpected.ret.val))) +-TargetType21.java:33:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType21.SAM2), TargetType21, kindname.method, <R,A>call(TargetType21.SAM3<R,A>), TargetType21 +-TargetType21.java:33:13: compiler.err.cant.apply.symbol: kindname.method, call, TargetType21.SAM2, @946, kindname.class, TargetType21, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.unexpected.ret.val))) +-6 errors ++TargetType21.java:32:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType21.SAM1), TargetType21, kindname.method, <R,A>call(TargetType21.SAM3<R,A>), TargetType21 ++TargetType21.java:32:13: compiler.err.cant.apply.symbol: kindname.method, call, TargetType21.SAM1, @888, kindname.class, TargetType21, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.inconvertible.types: java.lang.Object, java.lang.String))) ++TargetType21.java:33:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType21.SAM1), TargetType21, kindname.method, <R,A>call(TargetType21.SAM3<R,A>), TargetType21 ++4 errors +--- ./langtools/test/tools/javac/lambda/TargetType23.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType23.java Wed Jul 30 03:55:11 2014 -0700 +@@ -31,7 +31,12 @@ + void call(Sam2 s) { } + <Z> void call(Sam3<Z> s) { } + ++ void call2(Sam0 s) { } ++ void call2(Sam2 s) { } ++ <Z> void call2(Sam3<Z> s) { } ++ + void test() { +- call(()-> { throw new RuntimeException(); }); //ambiguous - both call(Sam0), call(Sam2), call(Sam3) match ++ call(()-> { throw new RuntimeException(); }); // ambiguous - call(Sam1) vs. call(Sam2) ++ call2(()-> { throw new RuntimeException(); }); // ok + } + } +--- ./langtools/test/tools/javac/lambda/TargetType23.out Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType23.out Wed Jul 30 03:55:11 2014 -0700 +@@ -1,2 +1,2 @@ +-TargetType23.java:35:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType23.Sam2), TargetType23, kindname.method, <Z>call(TargetType23.Sam3<Z>), TargetType23 ++TargetType23.java:39:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType23.Sam1), TargetType23, kindname.method, call(TargetType23.Sam2), TargetType23 + 1 error +--- ./langtools/test/tools/javac/lambda/TargetType42.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/TargetType42.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, 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 +@@ -31,12 +31,18 @@ + class TargetType42 { + + interface SAM<X, Y> { +- Y f(X x); ++ Y f(X x); + } + + <Z> void m(SAM<String, SAM<Z, Object>> s, Z z) { } + + void test(Object obj) { +- m((x)->{ class Foo { }; return (x2)-> { new Foo(); return null; }; }, obj); ++ m((x)->{ ++ class Foo { } ++ return (x2)-> { ++ new Foo(); ++ return null; ++ }; ++ }, obj); + } + } +--- ./langtools/test/tools/javac/lambda/intersection/IntersectionTargetTypeTest.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/intersection/IntersectionTargetTypeTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 8002099 ++ * @bug 8002099 8010822 + * @summary Add support for intersection types in cast expression + */ + +--- ./langtools/test/tools/javac/lambda/lambdaExpression/LambdaTest1.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/lambdaExpression/LambdaTest1.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 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 +@@ -33,7 +33,6 @@ + import java.util.Collections; + import java.util.List; + import java.util.ArrayList; +-import java.util.Date; + + public class LambdaTest1 { + +--- ./langtools/test/tools/javac/lambda/lambdaExpression/SamConversionComboTest.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/lambdaExpression/SamConversionComboTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -209,7 +209,11 @@ + final JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); + DiagnosticChecker dc = new DiagnosticChecker(); + JavacTask ct = (JavacTask)tool.getTask(null, null, dc, null, null, Arrays.asList(samSourceFile, clientSourceFile)); +- ct.analyze(); ++ try { ++ ct.analyze(); ++ } catch (Exception e) { ++ throw new AssertionError("failing SAM source file \n" + samSourceFile + "\n\n" + "failing client source file \n"+ clientSourceFile); ++ } + if (dc.errorFound == checkSamConversion()) { + throw new AssertionError(samSourceFile + "\n\n" + clientSourceFile); + } +--- ./langtools/test/tools/javac/lambda/separate/Test.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/lambda/separate/Test.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -23,6 +23,7 @@ + + /* + * @test ++ * @bug 8008708 + * @compile Foo.java + * @compile Test.java + */ +--- ./langtools/test/tools/javac/missingSuperRecovery/MissingInterfaceTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/missingSuperRecovery/MissingInterfaceTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,15 @@ ++/* ++ * @test /nodynamiccopyright/ ++ * @bug 8036007 ++ * @summary javac crashes when encountering an unresolvable interface ++ * @build MissingInterfaceTestDep ++ * @clean Closeable ++ * @compile/fail/ref=MissingInterfaceTest.out -XDrawDiagnostics MissingInterfaceTest.java ++ */ ++ ++public class MissingInterfaceTest { ++ void test(MissingInterfaceTestDep s) { ++ s.call(); ++ s.another(); ++ } ++} +--- ./langtools/test/tools/javac/missingSuperRecovery/MissingInterfaceTest.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/missingSuperRecovery/MissingInterfaceTest.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,3 @@ ++MissingInterfaceTest.java:12:10: compiler.err.cant.access: Closeable, (compiler.misc.class.file.not.found: Closeable) ++MissingInterfaceTest.java:13:10: compiler.err.cant.resolve.location.args: kindname.method, another, , , (compiler.misc.location.1: kindname.variable, s, MissingInterfaceTestDep) ++2 errors +--- ./langtools/test/tools/javac/missingSuperRecovery/MissingInterfaceTestDep.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/missingSuperRecovery/MissingInterfaceTestDep.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,26 @@ ++/* ++ * 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. ++ */ ++ ++public class MissingInterfaceTestDep implements Intermediate {} ++interface Intermediate extends Closeable { } ++interface Closeable {} +--- ./langtools/test/tools/javac/processing/environment/ProcessingEnvAnnoDiscovery.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/processing/environment/ProcessingEnvAnnoDiscovery.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,78 @@ ++/* ++ * 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 8038080 ++ * @summary make sure that all declaration annotations are discovered ++ * by the processing environment ++ * @library /tools/javac/lib ++ * @build JavacTestingAbstractProcessor ProcessingEnvAnnoDiscovery ++ * @compile/process -processor ProcessingEnvAnnoDiscovery ProcessingEnvAnnoDiscovery.java ++ */ ++ ++import java.lang.annotation.*; ++import java.util.Set; ++import javax.annotation.processing.*; ++import javax.lang.model.element.*; ++ ++import com.sun.tools.javac.util.*; ++ ++@ProcessingEnvAnnoDiscovery.Anno1 ++public class ProcessingEnvAnnoDiscovery<@ProcessingEnvAnnoDiscovery.Anno4 T> ++ extends JavacTestingAbstractProcessor { ++ private int round = 0; ++ ++ public boolean process(Set<? extends TypeElement> annos, RoundEnvironment rEnv) { ++ if (round++ == 0) { ++ System.out.println(annos); ++ Assert.check(annos.contains(eltUtils.getTypeElement("java.lang.annotation.Target"))); ++ Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno1"))); ++ Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno2"))); ++ Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno3"))); ++ Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno4"))); ++ Assert.check(annos.contains(eltUtils.getTypeElement("ProcessingEnvAnnoDiscovery.Anno5"))); ++ Assert.check(annos.size() == 6, "Found extra annotations"); //Anno1-5 + @Target ++ } ++ ++ return true; ++ } ++ ++ @Anno2 ++ public <@Anno5 K> K m(@Anno3 long foo) { ++ return null; ++ } ++ ++ @interface Anno1 {} ++ ++ @interface Anno2 {} ++ ++ @interface Anno3 {} ++ ++ @Target(ElementType.TYPE_PARAMETER) ++ @interface Anno4 {} ++ ++ @Target(ElementType.TYPE_PARAMETER) ++ @interface Anno5 {} ++ ++} +--- ./langtools/test/tools/javac/processing/environment/round/Anno.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/processing/environment/round/Anno.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,28 @@ ++/* ++ * 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.lang.annotation.*; ++import static java.lang.annotation.RetentionPolicy.*; ++ ++@Retention(RUNTIME) ++public @interface Anno {} +--- ./langtools/test/tools/javac/processing/environment/round/BuriedAnnotations.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/processing/environment/round/BuriedAnnotations.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 2007, 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 +@@ -22,7 +22,7 @@ + */ + + /** +- * Class to hold annotations for ElementsAnnotatedWithTest. ++ * Class to hold annotations for TestElementsAnnotatedWith. + */ + + @AnnotatedElementInfo(annotationName="java.lang.SuppressWarnings", +--- ./langtools/test/tools/javac/processing/environment/round/ErroneousAnnotations.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/processing/environment/round/ErroneousAnnotations.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,12 @@ ++/** /nodynamiccopyright/ ++ * Class to hold annotations for TestElementsAnnotatedWith. ++ */ ++ ++@AnnotatedElementInfo(annotationName="java.lang.SuppressWarnings", ++ expectedSize=0, ++ names={}) ++@Undefined ++public class ErroneousAnnotations { ++ @Undefined ++ private void foo() {return;} ++} +--- ./langtools/test/tools/javac/processing/environment/round/ErroneousAnnotations.out Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/processing/environment/round/ErroneousAnnotations.out Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,3 @@ ++ErroneousAnnotations.java:8:2: compiler.err.cant.resolve: kindname.class, Undefined, , ++ErroneousAnnotations.java:10:6: compiler.err.cant.resolve.location: kindname.class, Undefined, , , (compiler.misc.location: kindname.class, ErroneousAnnotations, null) ++2 errors +--- ./langtools/test/tools/javac/processing/environment/round/ParameterAnnotations.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/processing/environment/round/ParameterAnnotations.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,33 @@ ++/* ++ * 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. ++ */ ++ ++/** ++ * Class to hold annotations for ElementsAnnotatedWithTest. ++ */ ++ ++@AnnotatedElementInfo(annotationName="Anno", ++ expectedSize=1, ++ names={"annotatedParameter"}) ++public class ParameterAnnotations { ++ private void foo(@Anno Object annotatedParameter) {} ++} +--- ./langtools/test/tools/javac/processing/environment/round/Part1.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/processing/environment/round/Part1.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 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 +@@ -22,7 +22,7 @@ + */ + + /** +- * Class to hold annotations for ElementsAnnotatedWithTest. ++ * Class to hold annotations for TestElementsAnnotatedWith. + */ + + @AnnotatedElementInfo(annotationName="java.lang.SuppressWarnings", +--- ./langtools/test/tools/javac/processing/environment/round/Part2.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/processing/environment/round/Part2.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 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 +@@ -22,7 +22,7 @@ + */ + + /** +- * Class to hold annotations for ElementsAnnotatedWithTest. ++ * Class to hold annotations for TestElementsAnnotatedWith. + */ + @SuppressWarnings("") + public class Part2 { +--- ./langtools/test/tools/javac/processing/environment/round/SurfaceAnnotations.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/processing/environment/round/SurfaceAnnotations.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 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 +@@ -22,7 +22,7 @@ + */ + + /** +- * Class to hold annotations for ElementsAnnotatedWithTest. ++ * Class to hold annotations for TestElementsAnnotatedWith. + */ + + @AnnotatedElementInfo(annotationName="java.lang.SuppressWarnings", +--- ./langtools/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 6397298 6400986 6425592 6449798 6453386 6508401 6498938 6911854 ++ * @bug 6397298 6400986 6425592 6449798 6453386 6508401 6498938 6911854 8030049 8038080 + * @summary Tests that getElementsAnnotatedWith works properly. + * @author Joseph D. Darcy + * @library /tools/javac/lib +@@ -31,29 +31,26 @@ + * @compile TestElementsAnnotatedWith.java + * @compile InheritedAnnotation.java + * @compile TpAnno.java ++ * @compile Anno.java + * @compile -processor TestElementsAnnotatedWith -proc:only SurfaceAnnotations.java + * @compile -processor TestElementsAnnotatedWith -proc:only BuriedAnnotations.java + * @compile -processor TestElementsAnnotatedWith -proc:only Part1.java Part2.java + * @compile -processor TestElementsAnnotatedWith -proc:only C2.java + * @compile -processor TestElementsAnnotatedWith -proc:only Foo.java + * @compile -processor TestElementsAnnotatedWith -proc:only TypeParameterAnnotations.java ++ * @compile -processor TestElementsAnnotatedWith -proc:only ParameterAnnotations.java ++ * @compile/fail/ref=ErroneousAnnotations.out -processor TestElementsAnnotatedWith -proc:only -XDrawDiagnostics ErroneousAnnotations.java + * @compile Foo.java + * @compile/process -processor TestElementsAnnotatedWith -proc:only Foo + */ + + import java.lang.annotation.Annotation; +-import java.io.*; + import java.util.Collections; + import java.util.Set; + import java.util.HashSet; +-import java.util.List; +-import java.util.ArrayList; + import java.util.Arrays; + import javax.annotation.processing.*; +-import javax.tools.*; +-import javax.lang.model.SourceVersion; + import javax.lang.model.element.*; +-import javax.lang.model.util.*; + import static javax.lang.model.util.ElementFilter.*; + + /** +@@ -96,7 +93,8 @@ + roundEnvironment. + getElementsAnnotatedWith(elements.getTypeElement(annotatedElementInfo.annotationName())); + +- System.err.println("Results: " + resultsMeta); ++ if (!resultsMeta.isEmpty()) ++ System.err.println("Results: " + resultsMeta); + + if (resultsMeta.size() != annotatedElementInfo.expectedSize()) { + failed = true; +--- ./langtools/test/tools/javac/processing/environment/round/TypeParameterAnnotations.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/processing/environment/round/TypeParameterAnnotations.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -22,7 +22,7 @@ + */ + + /** +- * Class to hold annotations for ElementsAnnotatedWithTest. ++ * Class to hold annotations for TestElementsAnnotatedWith. + */ + + @AnnotatedElementInfo(annotationName="TpAnno", +--- ./langtools/test/tools/javac/processing/model/element/TestTypeParameterAnnotations.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/processing/model/element/TestTypeParameterAnnotations.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2013, 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 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 8011027 ++ * @bug 8011027 8046916 + * @library /tools/javac/lib + * @build JavacTestingAbstractProcessor TestTypeParameterAnnotations + * @compile -processor TestTypeParameterAnnotations -proc:only TestTypeParameterAnnotations.java +@@ -33,10 +33,16 @@ + import java.lang.annotation.*; + import javax.annotation.processing.*; + import javax.lang.model.element.*; +-import javax.lang.model.util.*; + import javax.tools.*; + +-public class TestTypeParameterAnnotations<@Foo @Bar @Baz T> extends JavacTestingAbstractProcessor { ++@ExpectedTypeParameterAnnotations(typeParameterName="T1", ++ annotations={"Foo1", "Bar1", "Baz1"}) ++@ExpectedTypeParameterAnnotations(typeParameterName="T2", annotations={}) ++@ExpectedTypeParameterAnnotations(typeParameterName="T3", ++ annotations={"Foo2", "Bar2", "Baz2"}) ++@ExpectedTypeParameterAnnotations(typeParameterName="T4", annotations={}) ++public class TestTypeParameterAnnotations<@Foo1 @Bar1 @Baz1 T1, T2, @Foo2 @Bar2 @Baz2 T3, T4> extends ++ JavacTestingAbstractProcessor { + int round = 0; + + public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { +@@ -74,82 +80,69 @@ + int check(Element e, List<? extends TypeParameterElement> typarams) { + if (typarams.isEmpty()) + return 0; +- if (typarams.size() != 1) +- return 0; + +- for (TypeParameterElement tpe: typarams) { +- boolean b1 = checkAnnotationMirrors(tpe, tpe.getAnnotationMirrors()); +- boolean b2 = checkAnnotationMirrors(tpe, elements.getAllAnnotationMirrors(tpe)); +- boolean b3 = checkGetAnnotation(tpe); +- boolean b4 = checkGetAnnotations(tpe); +- return b1 && b2 && b3 && b4 ? 1 : 0; ++ for (TypeParameterElement tpe : typarams) { ++ ExpectedTypeParameterAnnotations expected = null; ++ for (ExpectedTypeParameterAnnotations a : e.getAnnotationsByType(ExpectedTypeParameterAnnotations.class)) { ++ if (tpe.getSimpleName().contentEquals(a.typeParameterName())) { ++ expected = a; ++ break; ++ } ++ } ++ if (expected == null) { ++ throw new IllegalStateException("Does not have expected values annotation."); ++ } ++ checkAnnotationMirrors(tpe, tpe.getAnnotationMirrors(), expected); ++ checkAnnotationMirrors(tpe, elements.getAllAnnotationMirrors(tpe), expected); ++ checkGetAnnotation(tpe, expected); ++ checkGetAnnotations(tpe, expected); + } +- return 0; ++ ++ return typarams.size(); + } + +- boolean checkAnnotationMirrors(TypeParameterElement tpe, List<? extends AnnotationMirror> l) { +- if (l.size() != 3) { +- error("To few annotations, got " + l.size() + +- ", should be 3", tpe); +- return false; ++ void checkAnnotationMirrors(TypeParameterElement tpe, List<? extends AnnotationMirror> l, ExpectedTypeParameterAnnotations expected) { ++ String[] expectedAnnotations = expected.annotations(); ++ ++ if (l.size() != expectedAnnotations.length) { ++ error("Incorrect number of annotations, got " + l.size() + ++ ", should be " + expectedAnnotations.length, tpe); ++ return ; + } + +- AnnotationMirror m = l.get(0); +- if (!m.getAnnotationType().asElement().equals(elements.getTypeElement("Foo"))) { +- error("Wrong type of annotation, was expecting @Foo", m.getAnnotationType().asElement()); +- return false; ++ for (int i = 0; i < expectedAnnotations.length; i++) { ++ AnnotationMirror m = l.get(i); ++ if (!m.getAnnotationType().asElement().equals(elements.getTypeElement(expectedAnnotations[i]))) { ++ error("Wrong type of annotation, was expecting @Foo", m.getAnnotationType().asElement()); ++ return ; ++ } + } +- m = l.get(1); +- if (!m.getAnnotationType().asElement().equals(elements.getTypeElement("Bar"))) { +- error("Wrong type of annotation, was expecting @Bar", m.getAnnotationType().asElement()); +- return false; +- } +- m = l.get(2); +- if (!m.getAnnotationType().asElement().equals(elements.getTypeElement("Baz"))) { +- error("Wrong type of annotation, was expecting @Baz", m.getAnnotationType().asElement()); +- return false; +- } +- return true; + } + +- boolean checkGetAnnotation(TypeParameterElement tpe) { +- Foo f = tpe.getAnnotation(Foo.class); +- if (f == null) +- error("Expecting @Foo to be present in getAnnotation()", tpe); ++ void checkGetAnnotation(TypeParameterElement tpe, ExpectedTypeParameterAnnotations expected) { ++ List<String> expectedAnnotations = Arrays.asList(expected.annotations()); + +- Bar b = tpe.getAnnotation(Bar.class); +- if (b == null) +- error("Expecting @Bar to be present in getAnnotation()", tpe); ++ for (Class<? extends Annotation> c : ALL_ANNOTATIONS) { ++ Object a = tpe.getAnnotation(c); + +- Baz z = tpe.getAnnotation(Baz.class); +- if (z == null) +- error("Expecting @Baz to be present in getAnnotation()", tpe); +- +- return f != null && +- b != null && +- z != null; ++ if (a != null ^ expectedAnnotations.indexOf(c.getName()) != (-1)) { ++ error("Unexpected behavior for " + c.getName(), tpe); ++ return ; ++ } ++ } + } + +- boolean checkGetAnnotations(TypeParameterElement tpe) { +- Foo[] f = tpe.getAnnotationsByType(Foo.class); +- if (f.length != 1) { +- error("Expecting 1 @Foo to be present in getAnnotationsByType()", tpe); +- return false; ++ void checkGetAnnotations(TypeParameterElement tpe, ExpectedTypeParameterAnnotations expected) { ++ List<String> expectedAnnotations = Arrays.asList(expected.annotations()); ++ ++ for (Class<? extends Annotation> c : ALL_ANNOTATIONS) { ++ Object[] a = tpe.getAnnotationsByType(c); ++ ++ if (a.length > 0 ^ expectedAnnotations.indexOf(c.getName()) != (-1)) { ++ error("Unexpected behavior for " + c.getName(), tpe); ++ return ; ++ } + } +- +- Bar[] b = tpe.getAnnotationsByType(Bar.class); +- if (b.length != 1) { +- error("Expecting 1 @Bar to be present in getAnnotationsByType()", tpe); +- return false; +- } +- +- Baz[] z = tpe.getAnnotationsByType(Baz.class); +- if (z.length != 1) { +- error("Expecting 1 @Baz to be present in getAnnotationsByType()", tpe); +- return false; +- } +- +- return true; + } + + void note(String msg) { +@@ -168,23 +161,71 @@ + messager.printMessage(Diagnostic.Kind.ERROR, msg); + } + ++ Class<? extends Annotation>[] ALL_ANNOTATIONS = new Class[] { ++ Foo1.class, Bar1.class, Baz1.class, ++ Foo2.class, Bar2.class, Baz2.class, ++ }; ++ + // additional generic elements to test +- <@Foo @Bar @Baz X> X m(X x) { return x; } ++ @ExpectedTypeParameterAnnotations(typeParameterName="W", ++ annotations={"Foo1", "Bar1", "Baz1"}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="Y", ++ annotations={"Foo2", "Bar2", "Baz2"}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={}) ++ <@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> X m(X x) { return x; } + +- interface Intf<@Foo @Bar @Baz X> { X m() ; } ++ @ExpectedTypeParameterAnnotations(typeParameterName="W", ++ annotations={"Foo1", "Bar1", "Baz1"}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="Y", ++ annotations={"Foo2", "Bar2", "Baz2"}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={}) ++ interface Intf<@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> { X m() ; } + +- class Class<@Foo @Bar @Baz X> { +- <@Foo @Bar @Baz Y> Class() { } ++ @ExpectedTypeParameterAnnotations(typeParameterName="W", ++ annotations={"Foo1", "Bar1", "Baz1"}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="Y", ++ annotations={"Foo2", "Bar2", "Baz2"}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={}) ++ class Clazz<@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> { ++ @ExpectedTypeParameterAnnotations(typeParameterName="W", ++ annotations={"Foo1", "Bar1", "Baz1"}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="X", annotations={}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="Y", ++ annotations={"Foo2", "Bar2", "Baz2"}) ++ @ExpectedTypeParameterAnnotations(typeParameterName="Z", annotations={}) ++ <@Foo1 @Bar1 @Baz1 W, X, @Foo2 @Bar2 @Baz2 Y, Z> Clazz() { } + } + +- final int expect = 5; // top level class, plus preceding examples ++ final int expect = 5 * 4; // top level class, plus preceding examples, 4 type variables each + } + + @Target(ElementType.TYPE_PARAMETER) +-@interface Foo {} ++@interface Foo1 {} + + @Target(ElementType.TYPE_PARAMETER) +-@interface Bar {} ++@interface Bar1 {} + + @Target(ElementType.TYPE_PARAMETER) +-@interface Baz {} ++@interface Baz1 {} ++ ++@Target(ElementType.TYPE_PARAMETER) ++@interface Foo2 {} ++ ++@Target(ElementType.TYPE_PARAMETER) ++@interface Bar2 {} ++ ++@Target(ElementType.TYPE_PARAMETER) ++@interface Baz2 {} ++ ++@Repeatable(ExpectedTypeParameterAnnotationsCollection.class) ++@interface ExpectedTypeParameterAnnotations { ++ public String typeParameterName(); ++ public String[] annotations(); ++} ++ ++@interface ExpectedTypeParameterAnnotationsCollection { ++ public ExpectedTypeParameterAnnotations[] value(); ++} +--- ./langtools/test/tools/javac/resolve/AmbiguityErrorTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/resolve/AmbiguityErrorTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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. ++ */ ++ ++/** ++ * @test ++ * @bug 8041663 ++ */ ++ ++public class AmbiguityErrorTest { ++ ++ public interface A { } ++ ++ public interface B extends A { } ++ ++ public interface C { ++ A m(B strategy); ++ } ++ ++ public interface D { ++ A m(A strategy); ++ A m(B strategy); ++ } ++ ++ public interface T1 extends C, D { } ++ public interface T2 extends D, C { } ++ ++ int count; ++ ++ class T1Impl implements T1, T2 { ++ public A m(B strategy) { ++ count++; ++ return null; ++ } ++ public A m(A strategy) { ++ throw new AssertionError("Should not get here."); ++ } ++ } ++ ++ public static void main(String... args) { ++ new AmbiguityErrorTest().test(); ++ } ++ ++ void test() { ++ T1 t1 = new T1Impl(); ++ T2 t2 = new T1Impl(); ++ final B b = new B() { }; ++ t1.m(b); ++ t2.m(b); ++ ++ if (count != 2) { ++ throw new IllegalStateException("Did not call the methods properly"); ++ } ++ } ++ ++} +--- ./langtools/test/tools/javac/resolve/ResolveHarness.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/resolve/ResolveHarness.java Wed Jul 30 03:55:11 2014 -0700 +@@ -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 +@@ -23,8 +23,8 @@ + + /* + * @test +- * @bug 7098660 +- * @summary Write better overload resolution/inference tests ++ * @bug 7098660 8014649 8034223 ++ * @summary Test harness for overload resolution/inference tests + * @library /tools/javac/lib + * @build JavacTestingAbstractProcessor ResolveHarness + * @run main ResolveHarness +--- ./langtools/test/tools/javac/resolve/tests/PrimitiveOverReferenceVarargsAmbiguous.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/resolve/tests/PrimitiveOverReferenceVarargsAmbiguous.java Wed Jul 30 03:55:11 2014 -0700 +@@ -23,44 +23,44 @@ + + @TraceResolve(keys={"compiler.err.ref.ambiguous"}) + class PrimitiveOverReferenceVarargsAmbiguous { +- @Candidate(applicable=Phase.VARARGS, mostSpecific=true) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_byte(byte... b) {} +- @Candidate(applicable=Phase.VARARGS) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_byte(Byte... b) {} + +- @Candidate(applicable=Phase.VARARGS, mostSpecific=true) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_short(short... s) {} +- @Candidate(applicable=Phase.VARARGS) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_short(Short... s) {} + +- @Candidate(applicable=Phase.VARARGS, mostSpecific=true) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_int(int... i) {} +- @Candidate(applicable=Phase.VARARGS) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_int(Integer... i) {} + +- @Candidate(applicable=Phase.VARARGS, mostSpecific=true) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_long(long... l) {} +- @Candidate(applicable=Phase.VARARGS) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_long(Long... l) {} + +- @Candidate(applicable=Phase.VARARGS, mostSpecific=true) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_float(float... f) {} +- @Candidate(applicable=Phase.VARARGS) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_float(Float... f) {} + +- @Candidate(applicable=Phase.VARARGS, mostSpecific=true) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_double(double... d) {} +- @Candidate(applicable=Phase.VARARGS) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_double(Double... d) {} + +- @Candidate(applicable=Phase.VARARGS, mostSpecific=true) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_char(char... c) {} +- @Candidate(applicable=Phase.VARARGS) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_char(Character... c) {} + +- @Candidate(applicable=Phase.VARARGS, mostSpecific=true) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_bool(boolean... z) {} +- @Candidate(applicable=Phase.VARARGS) ++ @Candidate(applicable=Phase.VARARGS, mostSpecific=false) + static void m_bool(Boolean... z) {} + + { +--- ./langtools/test/tools/javac/resolve/tests/PrimitiveVsReferenceSamePhase.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/resolve/tests/PrimitiveVsReferenceSamePhase.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,76 @@ ++/* ++ * 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. ++ */ ++ ++@TraceResolve(keys={"compiler.err.ref.ambiguous"}) ++class PrimitiveVsReferenceSamePhase { ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_byte(Byte b1, byte b2) {} ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_byte(Byte b1, Byte b2) {} ++ ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_short(Short s1, short s2) {} ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_short(Short s1, Short s2) {} ++ ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_int(Integer i1, int i2) {} ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_int(Integer i1, Integer i2) {} ++ ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_long(Long l1, long l2) {} ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_long(Long l1, Long l2) {} ++ ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_float(Float f1, float f2) {} ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_float(Float f1, Float f2) {} ++ ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_double(Double d1, double d2) {} ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_double(Double d1, Double d2) {} ++ ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_char(Character c1, char c2) {} ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_char(Character c1, Character c2) {} ++ ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_bool(Boolean z1, boolean z2) {} ++ @Candidate(applicable=Phase.BOX, mostSpecific=false) ++ static void m_bool(Boolean z1, Boolean z2) {} ++ ++ { ++ m_byte((byte)0, (byte)0); ++ m_short((short)0, (short)0); ++ m_int(0, 0); ++ m_long(0L, 0L); ++ m_float(0.0f, 0.0f); ++ m_double(0.0, 0.0); ++ m_char('?', '?'); ++ m_bool(false, false); ++ } ++} +--- ./langtools/test/tools/javac/scope/7046348/EagerInterfaceCompletionTest.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javac/scope/7046348/EagerInterfaceCompletionTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 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 +@@ -181,7 +181,7 @@ + case FIELD: + case SUPER: return true; + case METHOD: return hk != HierarchyKind.INTERFACE || ak == ActionKind.REMOVE_B || +- (hk == HierarchyKind.INTERFACE && ak == ActionKind.REMOVE_A && vk == VersionKind.LAMBDA); ++ (hk == HierarchyKind.INTERFACE && ak == ActionKind.REMOVE_A); + default: throw new AssertionError("Unexpected test kind " + this); + } + } +--- ./langtools/test/tools/javac/types/BadSigTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/types/BadSigTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,40 @@ ++/* ++ * 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 8037934 ++ * @summary Javac generates invalid signatures for local types ++ * @run main BadSigTest ++ */ ++ ++public class BadSigTest<Outer> { ++ void m(){ ++ class Local1{} ++ class Local2 extends Local1{} ++ Local2.class.getTypeParameters(); ++ } ++ public static void main(String[] args) { ++ new BadSigTest().m(); ++ } ++} +--- ./langtools/test/tools/javac/util/StringUtilsTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/util/StringUtilsTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,68 @@ ++/* ++ * Copyright (c) 2013, 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 8029800 8043186 ++ * @summary Unit test StringUtils ++ * @run main StringUtilsTest ++ */ ++ ++import java.util.Locale; ++import java.util.Objects; ++import com.sun.tools.javac.util.StringUtils; ++ ++public class StringUtilsTest { ++ public static void main(String... args) throws Exception { ++ new StringUtilsTest().run(); ++ } ++ ++ void run() throws Exception { ++ Locale.setDefault(new Locale("tr", "TR")); ++ ++ //verify the properties of the default locale: ++ assertEquals("\u0131", "I".toLowerCase()); ++ assertEquals("\u0130", "i".toUpperCase()); ++ ++ //verify the StringUtils.toLowerCase/toUpperCase do what they should: ++ assertEquals("i", StringUtils.toLowerCase("I")); ++ assertEquals("I", StringUtils.toUpperCase("i")); ++ ++ //verify StringUtils.caseInsensitiveIndexOf works: ++ assertEquals(2, StringUtils.indexOfIgnoreCase(" lookFor", "lookfor")); ++ assertEquals(11, StringUtils.indexOfIgnoreCase(" lookFor LOOKfor", "lookfor", 11)); ++ assertEquals(2, StringUtils.indexOfIgnoreCase("\u0130\u0130lookFor", "lookfor")); ++ } ++ ++ void assertEquals(String expected, String actual) { ++ if (!Objects.equals(expected, actual)) { ++ throw new IllegalStateException("expected=" + expected + "; actual=" + actual); ++ } ++ } ++ ++ void assertEquals(int expected, int actual) { ++ if (expected != actual) { ++ throw new IllegalStateException("expected=" + expected + "; actual=" + actual); ++ } ++ } ++} +--- ./langtools/test/tools/javac/varargs/MethodHandleCrash.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javac/varargs/MethodHandleCrash.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 8034048 ++ * @summary javac crash with method references plus lambda plus var args ++ * @author govereau ++ * ++ * @compile MethodHandleCrash.java ++ */ ++public interface MethodHandleCrash { ++ static<T> void functional(T... input) { ++ java.util.function.Consumer<T> c = MethodHandleCrash::functional; ++ } ++} +--- ./langtools/test/tools/javadoc/parser/7091528/T7091528.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javadoc/parser/7091528/T7091528.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -23,8 +23,8 @@ + + /** + * @test +- * @bug 7091528 +- * @summary javadoc attempts to parse .class files ++ * @bug 7091528 8029145 8037484 ++ * @summary ensures javadoc parses unique source files and ignores all class files + * @compile p/C1.java p/q/C2.java + * @run main T7091528 + */ +@@ -37,17 +37,32 @@ + public static void main(String... args) { + new T7091528().run(); + } +- + void run() { + File testSrc = new File(System.getProperty("test.src")); + File testClasses = new File(System.getProperty("test.classes")); +- String[] args = { +- "-d", ".", ++ // 7091528, tests if class files are being ignored ++ runTest("-d", ".", + "-sourcepath", testClasses + File.pathSeparator + testSrc, + "-subpackages", +- "p" +- }; ++ "p"); ++ // 8029145, tests if unique source files are parsed ++ runTest("-d", ".", ++ "-sourcepath", testSrc.getAbsolutePath(), ++ "-subpackages", ++ "p:p.q"); ++ File testPkgDir = new File(testSrc, "p"); ++ File testFile = new File(testPkgDir, "C3.java"); ++ runTest("-d", ".", ++ "-sourcepath", testSrc.getAbsolutePath(), ++ testFile.getAbsolutePath(), ++ "p"); ++ runTest("-d", ".", ++ "-classpath", testSrc.getAbsolutePath(), ++ testFile.getAbsolutePath(), ++ "p"); + ++ } ++ void runTest(String... args) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + String doclet = com.sun.tools.doclets.standard.Standard.class.getName(); +@@ -60,7 +75,7 @@ + } + + if (rc != 0) +- System.err.println("javadoc failed: exit code = " + rc); ++ throw new Error("javadoc failed: exit code = " + rc); + + if (out.matches("(?s).*p/[^ ]+\\.class.*")) + throw new Error("reading .class files"); +--- ./langtools/test/tools/javadoc/parser/7091528/p/C3.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javadoc/parser/7091528/p/C3.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,27 @@ ++/* ++ * 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 is class C3, and no package for me please */ ++public class C3 {} ++ +--- ./langtools/test/tools/javap/InvalidOptions.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javap/InvalidOptions.java Wed Jul 30 03:55:11 2014 -0700 +@@ -24,7 +24,7 @@ + /* + * @test + * @bug 8027411 +- * @summary test invalid options -h and -b ++ * @summary test an invalid option + */ + + import java.io.*; +@@ -39,7 +39,6 @@ + } + + void run() throws Exception { +- test(2, "-h", "Error: -h is no longer available - use the javah program"); + test(2, "-b", "Error: unknown option: -b", + "Usage: javap <options> <classes>", + "use -help for a list of possible options"); +--- ./langtools/test/tools/javap/MethodParameters.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javap/MethodParameters.java Wed Jul 30 03:55:11 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2010, 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 +@@ -44,24 +44,24 @@ + static final String Init0_expected = + (" Foo();\n" + + " descriptor: ()V\n" + +- " flags: \n" + ++ " flags:\n" + + " Code:\n" + + " stack=1, locals=1, args_size=1\n" + +- " 0: aload_0 \n" + ++ " 0: aload_0\n" + + " 1: invokespecial #1 // Method java/lang/Object.\"<init>\":()V\n" + +- " 4: return \n" + ++ " 4: return\n" + + " LineNumberTable:\n" + + " line 2: 0").replaceAll(" +", " "); + + static final String Init1_expected = + (" Foo(int);\n" + + " descriptor: (I)V\n" + +- " flags: \n" + ++ " flags:\n" + + " Code:\n" + + " stack=1, locals=2, args_size=2\n" + +- " 0: aload_0 \n" + ++ " 0: aload_0\n" + + " 1: invokespecial #1 // Method java/lang/Object.\"<init>\":()V\n" + +- " 4: return \n" + ++ " 4: return\n" + + " LineNumberTable:\n" + + " line 3: 0\n" + + " MethodParameters:\n" + +@@ -71,25 +71,25 @@ + static final String foo0_expected = + (" void foo0();\n" + + " descriptor: ()V\n" + +- " flags: \n" + ++ " flags:\n" + + " Code:\n" + + " stack=0, locals=1, args_size=1\n" + +- " 0: return \n" + ++ " 0: return\n" + + " LineNumberTable:\n" + + " line 4: 0").replaceAll(" +", " "); + + static final String foo2_expected = + (" void foo2(int, int);\n" + + " descriptor: (II)V\n" + +- " flags: \n" + ++ " flags:\n" + + " Code:\n" + + " stack=0, locals=3, args_size=3\n" + +- " 0: return \n" + ++ " 0: return\n" + + " LineNumberTable:\n" + + " line 5: 0\n" + + " MethodParameters:\n" + + " Name Flags\n" + +- " j \n" + ++ " j\n" + + " k").replaceAll(" +", " "); + + static final File classesdir = new File("methodparameters"); +--- ./langtools/test/tools/javap/StackMapTableTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javap/StackMapTableTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,92 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 8033930 8033913 ++ * @summary bad formatting of StackMapTable entries ++ */ ++ ++import java.io.*; ++import java.util.*; ++ ++public class StackMapTableTest { ++ public static void main(String... args) throws Exception { ++ new StackMapTableTest().run(); ++ } ++ ++ void run() throws Exception { ++ String testClasses = System.getProperty("test.classes"); ++ String out = javap("-v", "-classpath", testClasses, A.class.getName()); ++ ++ String nl = System.getProperty("line.separator"); ++ out = out.replaceAll(nl, "\n"); ++ ++ if (out.contains("\n\n\n")) ++ error("double blank line found"); ++ ++ String expect = ++ " StackMapTable: number_of_entries = 2\n" + ++ " frame_type = 252 /* append */\n" + ++ " offset_delta = 2\n" + ++ " locals = [ int ]\n" + ++ " frame_type = 250 /* chop */\n" + ++ " offset_delta = 18\n"; ++ if (!out.contains(expect)) ++ error("expected text not found"); ++ ++ if (errors > 0) ++ throw new Exception(errors + " errors found"); ++ } ++ ++ String javap(String... args) throws Exception { ++ StringWriter sw = new StringWriter(); ++ PrintWriter out = new PrintWriter(sw); ++ int rc = com.sun.tools.javap.Main.run(args, out); ++ out.close(); ++ System.out.println(sw.toString()); ++ if (rc < 0) ++ throw new Exception("javap exited, rc=" + rc); ++ return sw.toString(); ++ } ++ ++ void error(String msg) { ++ System.out.println("Error: " + msg); ++ errors++; ++ } ++ ++ int errors; ++ ++ /** Simple test class to run through javap. */ ++ public class A { ++ public void a() { ++ for (int i = 0; i < 10; i++) { ++ System.out.println(i); ++ } ++ } ++ public void b() { ++ } ++ public void c() { ++ } ++ } ++} +--- ./langtools/test/tools/javap/T4975569.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javap/T4975569.java Wed Jul 30 03:55:11 2014 -0700 +@@ -40,10 +40,10 @@ + verify("T4975569$Anno", "flags: ACC_INTERFACE, ACC_ABSTRACT, ACC_ANNOTATION"); + verify("T4975569$E", "flags: ACC_FINAL, ACC_SUPER, ACC_ENUM"); + verify("T4975569$S", "flags: ACC_BRIDGE, ACC_SYNTHETIC", +- "InnerClasses:\n static"); ++ "InnerClasses:\n static"); + verify("T4975569$V", "void m(java.lang.String...)", + "flags: ACC_VARARGS"); +- verify("T4975569$Prot", "InnerClasses:\n protected"); ++ verify("T4975569$Prot", "InnerClasses:\n protected"); + //verify("T4975569$Priv", "InnerClasses"); + if (errors > 0) + throw new Error(errors + " found."); +--- ./langtools/test/tools/javap/T6868539.java Tue Jun 03 14:19:44 2014 -0700 ++++ ./langtools/test/tools/javap/T6868539.java Wed Jul 30 03:55:11 2014 -0700 +@@ -23,7 +23,7 @@ + + /* + * @test +- * @bug 6868539 6868548 ++ * @bug 6868539 6868548 8035364 + * @summary javap should use current names for constant pool entries, + * remove spurious ';' from constant pool entries + */ +@@ -41,17 +41,17 @@ + void run() { + String output = javap("T6868539"); + verify(output, "Utf8 +java/lang/String"); // 1: Utf8 +- // 2: currently unused ++ // 2: currently unused + verify(output, "Integer +123456"); // 3: Integer + verify(output, "Float +123456.0f"); // 4: Float + verify(output, "Long +123456l"); // 5: Long + verify(output, "Double +123456.0d"); // 6: Double +- verify(output, "Class +#[0-9]+ +// + T6868539"); // 7: Class +- verify(output, "String +#[0-9]+ +// + not found"); // 8: String ++ verify(output, "Class +#[0-9]+ +// +T6868539"); // 7: Class ++ verify(output, "String +#[0-9]+ +// +not found"); // 8: String + verify(output, "Fieldref +#[0-9]+\\.#[0-9]+ +// +T6868539.errors:I"); // 9: Fieldref + verify(output, "Methodref +#[0-9]+\\.#[0-9]+ +// +T6868539.run:\\(\\)V"); // 10: Methodref + verify(output, "InterfaceMethodref +#[0-9]+\\.#[0-9]+ +// +java/lang/Runnable\\.run:\\(\\)V"); +- // 11: InterfaceMethodref ++ // 11: InterfaceMethodref + verify(output, "NameAndType +#[0-9]+:#[0-9]+ +// +run:\\(\\)V"); // 12: NameAndType + if (errors > 0) + throw new Error(errors + " found."); +--- ./langtools/test/tools/javap/T8032814.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javap/T8032814.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,93 @@ ++/* ++ * 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 8032814 ++ * @summary LineNumberTable/LocalVariableTable tables duplication for the ++ * "-v -l" combination of options ++ * @compile -g T8032814.java ++ * @run main T8032814 ++ */ ++ ++import java.io.*; ++import java.util.*; ++ ++public class T8032814 { ++ public static void main(String... args) throws Exception { ++ new T8032814().run(); ++ } ++ ++ void run() throws Exception { ++ Class<?> clazz = T8032814.class; ++ int count = clazz.getDeclaredConstructors().length ++ + clazz.getDeclaredMethods().length; ++ test(clazz, 0); ++ test(clazz, count, "-v"); ++ test(clazz, count, "-l"); ++ test(clazz, count, "-v", "-l"); ++ ++ if (errors > 0) ++ throw new Exception(errors + " errors occurred"); ++ } ++ ++ void test(Class<?> clazz, int expectedCount, String... opts) throws Exception { ++ System.err.println("test class " + clazz.getName() + " " + Arrays.asList(opts) + ": expect: " + expectedCount); ++ List<String> args = new ArrayList<String>(); ++ args.addAll(Arrays.asList(opts)); ++ args.addAll(Arrays.asList("-classpath", System.getProperty("test.classes"))); ++ args.add(clazz.getName()); ++ StringWriter sw = new StringWriter(); ++ PrintWriter pw = new PrintWriter(sw); ++ int rc = com.sun.tools.javap.Main.run(args.toArray(new String[args.size()]), pw); ++ pw.close(); ++ String out = sw.toString(); ++ if (rc != 0) ++ throw new Exception("javap failed unexpectedly: rc=" + rc); ++ ++ int lntCount = 0, lvtCount = 0; ++ for (String line: out.split("[\r\n]+")) { ++ if (line.matches("^ *LineNumberTable:$")) ++ lntCount++; ++ if (line.matches("^ *LocalVariableTable:$")) ++ lvtCount++; ++ } ++ checkEqual("LineNumberTable", lntCount, expectedCount); ++ checkEqual("LocalVariableTable", lvtCount, expectedCount); ++ } ++ ++ void checkEqual(String attr, int found, int expect) { ++ if (found != expect) { ++ error("Unexpected number of occurrences of " + attr + "\n" + ++ "found: " + found + ", expected: " + expect); ++ } ++ } ++ ++ void error(String msg) { ++ System.err.println("Error: " + msg); ++ errors++; ++ } ++ ++ int errors = 0; ++} ++ +--- ./langtools/test/tools/javap/T8032819.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javap/T8032819.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,95 @@ ++/* ++ * 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 8032819 ++ * @summary Extra empty line between field declarations for the "-v -c" and "-v -l" combination of options ++ * @compile -g T8032819.java ++ * @run main T8032819 ++ */ ++ ++import java.io.*; ++import java.util.*; ++ ++public class T8032819 { ++ static class Fields { ++ int f1; ++ int f2; ++ } ++ ++ public static void main(String... args) throws Exception { ++ new T8032819().run(); ++ } ++ ++ void run() throws Exception { ++ Class<?> clazz = Fields.class; ++ test(clazz); ++ test(clazz, "-c"); ++ test(clazz, "-l"); ++ test(clazz, "-l", "-c"); ++ test(clazz, "-v"); ++ test(clazz, "-v", "-c"); ++ test(clazz, "-v", "-l"); ++ test(clazz, "-v", "-l", "-c"); ++ ++ if (errors > 0) ++ throw new Exception(errors + " errors occurred"); ++ } ++ ++ static final String sep = System.getProperty("line.separator"); ++ static final String doubleBlankLine = sep + sep + sep; ++ ++ void test(Class<?> clazz, String... opts) throws Exception { ++ System.err.println("test " + Arrays.asList(opts)); ++ List<String> args = new ArrayList<String>(); ++ args.addAll(Arrays.asList(opts)); ++ args.addAll(Arrays.asList("-classpath", System.getProperty("test.classes"))); ++ args.add(clazz.getName()); ++ StringWriter sw = new StringWriter(); ++ PrintWriter pw = new PrintWriter(sw); ++ int rc = com.sun.tools.javap.Main.run(args.toArray(new String[args.size()]), pw); ++ pw.close(); ++ String out = sw.toString(); ++ if (rc != 0) ++ throw new Exception("javap failed unexpectedly: rc=" + rc); ++ ++ int count = 0; ++ int i = out.indexOf(doubleBlankLine, 0); ++ while (i != -1) { ++ count++; ++ i = out.indexOf(doubleBlankLine, i + doubleBlankLine.length()); ++ } ++ ++ if (count > 0) ++ error(count + " double blank lines found"); ++ } ++ ++ void error(String msg) { ++ System.err.println("Error: " + msg); ++ errors++; ++ } ++ ++ int errors = 0; ++} ++ +--- ./langtools/test/tools/javap/T8033180.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javap/T8033180.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,88 @@ ++/* ++ * 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 8033180 ++ * @summary Bad newline characters ++ */ ++ ++import java.io.*; ++import java.util.*; ++ ++public class T8033180 { ++ ++ public static void main(String... args) throws Exception { ++ new T8033180().run(); ++ } ++ ++ void run() throws Exception { ++ // fast-track this case, because test cannot fail in this case ++ if (lineSep.equals(nl)) ++ return; ++ ++ test("-help"); ++ test("-version"); ++ ++ if (errors > 0) ++ throw new Exception(errors + " errors occurred"); ++ } ++ ++ static final String lineSep = System.getProperty("line.separator"); ++ static final String nl = "\n"; ++ ++ void test(String... opts) throws Exception { ++ System.err.println("test " + Arrays.asList(opts)); ++ List<String> args = new ArrayList<String>(); ++ args.addAll(Arrays.asList(opts)); ++ StringWriter sw = new StringWriter(); ++ PrintWriter pw = new PrintWriter(sw); ++ int rc = com.sun.tools.javap.Main.run(args.toArray(new String[args.size()]), pw); ++ pw.close(); ++ String out = sw.toString(); ++ if (rc != 0) ++ throw new Exception("javap failed unexpectedly: rc=" + rc); ++ ++ // remove all valid platform newline sequences ++ String out2 = out.replace(lineSep, ""); ++ ++ // count the remaining simple newline characters ++ int count = 0; ++ int i = out2.indexOf(nl, 0); ++ while (i != -1) { ++ count++; ++ i = out2.indexOf(nl, i + nl.length()); ++ } ++ ++ if (count > 0) ++ error(count + " newline characters found"); ++ } ++ ++ void error(String msg) { ++ System.err.println("Error: " + msg); ++ errors++; ++ } ++ ++ int errors = 0; ++} ++ +--- ./langtools/test/tools/javap/T8033711.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javap/T8033711.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * 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 8033711 ++ * @summary An exception is thrown if using the "-classpath" option with no arguments ++ */ ++ ++ ++import java.io.*; ++ ++public class T8033711 { ++ public static void main(String[] args) throws Exception { ++ new T8033711().run(); ++ } ++ ++ public void run() throws Exception { ++ String out = javap("-classpath"); ++ if (out.contains("IllegalArgumentException")) ++ throw new Exception("exception found in javap output"); ++ if (!out.contains("Error: invalid use of option")) ++ throw new Exception("expected error message not found in javap output"); ++ } ++ ++ String javap(String... args) { ++ StringWriter sw = new StringWriter(); ++ PrintWriter out = new PrintWriter(sw); ++ int rc = com.sun.tools.javap.Main.run(args, out); ++ out.close(); ++ System.out.println(sw.toString()); ++ System.out.println("javap exited, rc=" + rc); ++ return sw.toString(); ++ } ++} +--- ./langtools/test/tools/javap/T8035104.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javap/T8035104.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,67 @@ ++/* ++ * 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 8035104 ++ * @summary reorder class file attributes in javap listing ++ */ ++ ++import java.io.*; ++ ++public class T8035104 { ++ public static void main(String[] args) throws Exception { ++ new T8035104().run(); ++ } ++ ++ public void run() throws Exception { ++ String[] lines = javap("-v", T8035104.class.getName()).split("[\r\n]+"); ++ int minor = -1; ++ int SourceFile = -1; ++ for (int i = 0; i < lines.length; i++) { ++ String line = lines[i]; ++ if (line.matches(" *minor version: [0-9.]+")) ++ minor = i; ++ if (line.matches(" *SourceFile: .+")) ++ SourceFile = i; ++ } ++ if (minor == -1) ++ throw new Exception("minor version not found"); ++ if (SourceFile == -1) ++ throw new Exception("SourceFile not found"); ++ if (SourceFile < minor) ++ throw new Exception("unexpected order of output"); ++ ++ System.out.println("output OK"); ++ } ++ ++ String javap(String... args) { ++ StringWriter sw = new StringWriter(); ++ PrintWriter out = new PrintWriter(sw); ++ int rc = com.sun.tools.javap.Main.run(args, out); ++ out.close(); ++ System.out.println(sw.toString()); ++ System.out.println("javap exited, rc=" + rc); ++ return sw.toString(); ++ } ++} +--- ./langtools/test/tools/javap/WhitespaceTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./langtools/test/tools/javap/WhitespaceTest.java Wed Jul 30 03:55:11 2014 -0700 +@@ -0,0 +1,91 @@ ++/* ++ * 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 8033581 8033798 8033726 ++ * @summary Check whitespace in generated output ++ */ ++ ++import java.io.*; ++import java.util.*; ++ ++public class WhitespaceTest { ++ public static void main(String... args) throws Exception { ++ new WhitespaceTest().run(); ++ } ++ ++ void run() throws Exception { ++ test("-v", "java.lang.String"); ++ test("-XDtab:1", "-v", "java.lang.String"); ++ ++ String testClasses = System.getProperty("test.classes"); ++ for (int i = 10; i < 40; i++) ++ test("-XDtab:" + i, "-v", "-classpath", testClasses, "WhitespaceTest$HelloWorld"); ++ ++ if (errors > 0) ++ throw new Exception(errors + " errors found"); ++ } ++ ++ void test(String... args) throws Exception { ++ // need to avoid "//" appearing as a constant in the constant pool ++ String slash = "/"; ++ String doubleSlash = slash + slash; ++ System.out.println("test: " + Arrays.asList(args)); ++ String out = javap(args); ++ for (String line: out.split("[\r\n]+")) { ++ if (line.endsWith(" ")) ++ error("line has trailing whitespace: " + line); ++ int comment = line.indexOf(doubleSlash); ++ if (comment > 0 && line.charAt(comment - 1) != ' ') ++ error("no space before comment: " + line); ++ if (line.matches(" +}")) ++ error("bad indentation: " + line); ++ } ++ } ++ ++ String javap(String... args) throws Exception { ++ StringWriter sw = new StringWriter(); ++ PrintWriter out = new PrintWriter(sw); ++ int rc = com.sun.tools.javap.Main.run(args, out); ++ out.close(); ++ System.out.println(sw.toString()); ++ if (rc < 0) ++ throw new Exception("javap exited, rc=" + rc); ++ return sw.toString(); ++ } ++ ++ void error(String msg) { ++ System.out.println("Error: " + msg); ++ errors++; ++ } ++ ++ int errors; ++ ++ // small class to test repeatedly with different tab values ++ static class HelloWorld { ++ public static void main(String... args) { ++ System.out.println("Hello World!"); ++ } ++ } ++} +--- ./nashorn/.hgtags Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/.hgtags Wed Jul 30 03:55:26 2014 -0700 +@@ -233,7 +233,9 @@ + 32631eed0fad2b31346eb41b29a50227bd29e2ec jdk8-b121 + 9d112a0e7df737f3b1fa2a021d5bb350ed56c1b7 jdk8-b122 + 688f4167f92188482b0d80e315c72f726c6d5ff6 jdk8-b123 ++0b4301c792254c890811e5b8e32c23338d715928 jdk8u20-b00 + 7346abe2ea03134e1aee3b3d0fccb047235bd221 jdk8-b124 ++d39eb6ab87581becb8efbb5e3a95c99d5e228328 jdk8u20-b01 + 7346abe2ea03134e1aee3b3d0fccb047235bd221 jdk8-b125 + 095263db862da23fa04d57c7e93e553831132449 jdk8-b126 + fdfbb745caf0e54775a44e66e39d3025785e0528 jdk8-b127 +@@ -256,6 +258,7 @@ + bc23b19e08eb1575663044902b6442ceaafa924f jdk8u5-b11 + 18b007062905dac9304605955a4b84eaf2a08553 jdk8u5-b12 + e4fb85d69d6b33c9561b932ec5515f44c53c1017 jdk8u5-b13 ++53cc5fda790e0f90dca53fb459c70517d76680bc jdk8u5-b31 + 53cc5fda790e0f90dca53fb459c70517d76680bc jdk8u11-b01 + 4dda2b1e51aa7977f53c261f983230fe505bbc3e jdk8u11-b02 + 161f144c4e84037f655a2f6ebb0ba3057e8b18fa jdk8u11-b03 +@@ -267,3 +270,32 @@ + dec6999877f39d3c17f7a092d8e2e17b676bb34b jdk8u11-b09 + d522ff5f53730cabd02c1863bb9d437c13bcc5e0 jdk8u11-b10 + 3175dcbdd76ee9272276fa756247203dffb20596 jdk8u11-b11 ++eea7f92c5fcc95310a6d946300ea47ac3e302cfe jdk8u11-b12 ++b2c8eadc494bd32ed47d15d02cf942a8bd92c57f jdk8u11-b31 ++43a1183d2ab0ee3dbffd8bc47606e88dbe0c6116 jdk8u20-b02 ++9d69311869d513deecfebe767cc5f01502c9c01e jdk8u20-b03 ++e70dd55986e085185d976f2a78843a7d7eb87afd jdk8u20-b04 ++4ceb9789a6a57bef69b2c7391ac16ea27b6c4f93 jdk8u20-b05 ++f87eba70e9ee96255137c389db7cb4e2480e53e7 jdk8-b130 ++cca9748cfec7025ac0ddcdede9e5724fa676ad13 jdk8-b131 ++5dbdae28a6f3dae3913b118c128bcb1f803317ac jdk8-b132 ++4268cd11c2411064ac30dee7a668055ce226c268 jdk8u20-b06 ++7e89db817ed094766a039762a8061c3a600c7284 jdk8u20-b07 ++2282c86cb1a954efd2fc5b7f22c173be19087c55 jdk8u20-b08 ++41f588adeb7a397d395233f00bd3402d0989934a jdk8u20-b09 ++fdcdffd5b5b1eb7d442096433d17466f023207f1 jdk8u20-b10 ++c116e9229e096ffe841f2b4f79067378288d0d1d jdk8u20-b11 ++c720454d2435be052fd941a789ece9468d1e8f74 jdk8u20-b12 ++2ca464cf3093444f73e27ace78993629d2f15cb9 jdk8u20-b13 ++2f6add5fefb37cfeeb9a7745e7144f0b6d96bbea jdk8u20-b14 ++bb2d116675479fb2c9deaeeab6d4c41d41060693 jdk8u20-b15 ++c89a4945404ce80e26cb94c90fc13adad6b114bf jdk8u20-b16 ++046bf6509a1f3fcf8c9c8b5d09beec0400f704d1 jdk8u20-b17 ++847387339a561e50353c0805a54ec14eca256d2a jdk8u20-b18 ++b047df215de40cb8a87ff1e2bac0b57bb9e2e121 jdk8u20-b19 ++ed3439dca4a73a2dd4a284f3457f0af216a3eb55 jdk8u20-b20 ++f2925491b61b22ac42f8c30ee9c6723ffa401a4c jdk8u20-b21 ++5332595fe7ba2a1fc5564cc2689f378b04a56eb4 jdk8u20-b22 ++ad36f9454ce38d78be39fc819902e1223765ee5e jdk8u20-b23 ++d3da140e179343011017669a6dbfcc52b0e56f52 jdk8u20-b24 ++d3da140e179343011017669a6dbfcc52b0e56f52 jdk8u20-b25 +--- ./nashorn/README Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/README Wed Jul 30 03:55:26 2014 -0700 +@@ -81,13 +81,13 @@ + + After that, you can run the tests using: + cd make +- ant test ++ ant clean test + + You can also run the ECMA-262 test suite with Nashorn. In order to do + that, you will need to get a copy of it and put it in + test/script/external/test262 directory. A convenient way to do it is: + +- hg clone http://hg.ecmascript.org/tests/test262/ test/script/external/test262 ++ git clone https://github.com/tc39/test262 test/script/external/test262 + + Alternatively, you can check it out elsewhere and make + test/script/external/test262 a symbolic link to that directory. After +@@ -95,6 +95,11 @@ + + cd nashorn~jdk8/nashorn/make + ant test262 ++ ++Ant target to get/update external test suites: ++ ++ ant externals ++ ant update-externals + + These tests take time, so we have a parallelized runner for them that + takes advantage of all processor cores on the computer: +--- ./nashorn/THIRD_PARTY_README Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/THIRD_PARTY_README Wed Jul 30 03:55:26 2014 -0700 +@@ -2,7 +2,7 @@ + ----------------------------- + + %% This notice is provided with respect to ASM Bytecode Manipulation +-Framework v5.0, which may be included with JRE 8, and JDK 8, and ++Framework v5.0.3, which may be included with JRE 8, and JDK 8, and + OpenJDK 8. + + --- begin of LICENSE --- +@@ -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 +@@ -3349,14 +3349,14 @@ + + ------------------------------------------------------------------------------- + +-%% This notice is provided with respect to zlib v1.2.5, which may be included ++%% This notice is provided with respect to zlib v1.2.8, which may be included + with JRE 8, JDK 8, and OpenJDK 8. + + --- begin of LICENSE --- + +- version 1.2.5, July 18th, 2005 +- +- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler ++ version 1.2.8, April 28th, 2013 ++ ++ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages +@@ -3382,11 +3382,11 @@ + ------------------------------------------------------------------------------- + + %% This notice is provided with respect to the following which may be +-included with JRE 8, JDK 8, and OpenJDK 8, except where noted: +- +- Apache Commons Math 2.2 +- Apache Derby 10.10.1.2 [included with JDK 8] +- Apache Jakarta BCEL 5.2 ++included with JRE 8, JDK 8, and OpenJDK 8. ++ ++ Apache Commons Math 3.2 ++ Apache Derby 10.10.1.3 ++ Apache Jakarta BCEL 5.1 + Apache Jakarta Regexp 1.4 + Apache Santuario XML Security for Java 1.5.4 + Apache Xalan-Java 2.7.1 +--- ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ClassGenerator.java Wed Jul 30 03:55:26 2014 -0700 +@@ -50,8 +50,6 @@ + import static jdk.nashorn.internal.tools.nasgen.StringConstants.COLLECTIONS_EMPTY_LIST; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_FIELD_NAME; +-import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_SETISSHARED; +-import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_SETISSHARED_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_NEWMAP_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_TYPE; +@@ -191,8 +189,6 @@ + // stack: Collection + // pmap = PropertyMap.newMap(Collection<Property>); + mi.invokeStatic(PROPERTYMAP_TYPE, PROPERTYMAP_NEWMAP, PROPERTYMAP_NEWMAP_DESC); +- // pmap.setIsShared(); +- mi.invokeVirtual(PROPERTYMAP_TYPE, PROPERTYMAP_SETISSHARED, PROPERTYMAP_SETISSHARED_DESC); + // $nasgenmap$ = pmap; + mi.putStatic(className, PROPERTYMAP_FIELD_NAME, PROPERTYMAP_DESC); + mi.returnVoid(); +--- ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Wed Jul 30 03:55:26 2014 -0700 +@@ -33,10 +33,7 @@ + import static jdk.nashorn.internal.tools.nasgen.StringConstants.DEFAULT_INIT_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DESC; +-import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DUPLICATE; +-import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DUPLICATE_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_FIELD_NAME; +-import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_TYPE; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_SETCONSTRUCTOR_DESC; +@@ -171,9 +168,6 @@ + private void loadMap(final MethodGenerator mi) { + if (memberCount > 0) { + mi.getStatic(className, PROPERTYMAP_FIELD_NAME, PROPERTYMAP_DESC); +- // make sure we use duplicated PropertyMap so that original map +- // stays intact and so can be used for many globals. +- mi.invokeVirtual(PROPERTYMAP_TYPE, PROPERTYMAP_DUPLICATE, PROPERTYMAP_DUPLICATE_DESC); + } + } + +--- ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MemberInfo.java Wed Jul 30 03:55:26 2014 -0700 +@@ -22,40 +22,62 @@ + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +- + package jdk.nashorn.internal.tools.nasgen; + + import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_ARRAY_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC; ++import static jdk.nashorn.internal.tools.nasgen.StringConstants.SCRIPTOBJECT_DESC; ++import static jdk.nashorn.internal.tools.nasgen.StringConstants.STRING_DESC; + + import jdk.internal.org.objectweb.asm.Opcodes; + import jdk.internal.org.objectweb.asm.Type; + import jdk.nashorn.internal.objects.annotations.Where; ++import jdk.nashorn.internal.runtime.ScriptObject; + + /** + * Details about a Java method or field annotated with any of the field/method + * annotations from the jdk.nashorn.internal.objects.annotations package. + */ + public final class MemberInfo implements Cloneable { ++ // class loader of this class ++ private static ClassLoader myLoader = MemberInfo.class.getClassLoader(); ++ + /** + * The different kinds of available class annotations + */ + public static enum Kind { +- /** This is a script class */ ++ ++ /** ++ * This is a script class ++ */ + SCRIPT_CLASS, +- /** This is a constructor */ ++ /** ++ * This is a constructor ++ */ + CONSTRUCTOR, +- /** This is a function */ ++ /** ++ * This is a function ++ */ + FUNCTION, +- /** This is a getter */ ++ /** ++ * This is a getter ++ */ + GETTER, +- /** This is a setter */ ++ /** ++ * This is a setter ++ */ + SETTER, +- /** This is a property */ ++ /** ++ * This is a property ++ */ + PROPERTY, +- /** This is a specialized version of a function */ ++ /** ++ * This is a specialized version of a function ++ */ + SPECIALIZED_FUNCTION, +- /** This is a specialized version of a constructor */ ++ /** ++ * This is a specialized version of a constructor ++ */ + SPECIALIZED_CONSTRUCTOR + } + +@@ -194,6 +216,7 @@ + + /** + * Check whether this MemberInfo is a getter that resides in the instance ++ * + * @return true if instance setter + */ + boolean isInstanceSetter() { +@@ -245,96 +268,201 @@ + } + + void verify() { +- if (kind == Kind.CONSTRUCTOR) { +- final Type returnType = Type.getReturnType(javaDesc); +- if (! returnType.toString().equals(OBJECT_DESC)) { +- error("return value should be of Object type, found" + returnType); +- } +- final Type[] argTypes = Type.getArgumentTypes(javaDesc); +- if (argTypes.length < 2) { +- error("constructor methods should have at least 2 args"); +- } +- if (! argTypes[0].equals(Type.BOOLEAN_TYPE)) { +- error("first argument should be of boolean type, found" + argTypes[0]); +- } +- if (! argTypes[1].toString().equals(OBJECT_DESC)) { +- error("second argument should be of Object type, found" + argTypes[0]); +- } ++ switch (kind) { ++ case CONSTRUCTOR: { ++ final Type returnType = Type.getReturnType(javaDesc); ++ if (!isJSObjectType(returnType)) { ++ error("return value of a @Constructor method should be of Object type, found " + returnType); ++ } ++ final Type[] argTypes = Type.getArgumentTypes(javaDesc); ++ if (argTypes.length < 2) { ++ error("@Constructor methods should have at least 2 args"); ++ } ++ if (!argTypes[0].equals(Type.BOOLEAN_TYPE)) { ++ error("first argument of a @Constructor method should be of boolean type, found " + argTypes[0]); ++ } ++ if (!isJavaLangObject(argTypes[1])) { ++ error("second argument of a @Constructor method should be of Object type, found " + argTypes[0]); ++ } + +- if (argTypes.length > 2) { +- for (int i = 2; i < argTypes.length - 1; i++) { +- if (! argTypes[i].toString().equals(OBJECT_DESC)) { +- error(i + "'th argument should be of Object type, found " + argTypes[i]); ++ if (argTypes.length > 2) { ++ for (int i = 2; i < argTypes.length - 1; i++) { ++ if (!isJavaLangObject(argTypes[i])) { ++ error(i + "'th argument of a @Constructor method should be of Object type, found " + argTypes[i]); ++ } ++ } ++ ++ final String lastArgTypeDesc = argTypes[argTypes.length - 1].getDescriptor(); ++ final boolean isVarArg = lastArgTypeDesc.equals(OBJECT_ARRAY_DESC); ++ if (!lastArgTypeDesc.equals(OBJECT_DESC) && !isVarArg) { ++ error("last argument of a @Constructor method is neither Object nor Object[] type: " + lastArgTypeDesc); ++ } ++ ++ if (isVarArg && argTypes.length > 3) { ++ error("vararg of a @Constructor method has more than 3 arguments"); + } + } +- +- final String lastArgType = argTypes[argTypes.length - 1].toString(); +- final boolean isVarArg = lastArgType.equals(OBJECT_ARRAY_DESC); +- if (!lastArgType.equals(OBJECT_DESC) && !isVarArg) { +- error("last argument is neither Object nor Object[] type: " + lastArgType); ++ } ++ break; ++ case SPECIALIZED_CONSTRUCTOR: { ++ final Type returnType = Type.getReturnType(javaDesc); ++ if (!isJSObjectType(returnType)) { ++ error("return value of a @SpecializedConstructor method should be a valid JS type, found " + returnType); ++ } ++ final Type[] argTypes = Type.getArgumentTypes(javaDesc); ++ for (int i = 0; i < argTypes.length; i++) { ++ if (!isValidJSType(argTypes[i])) { ++ error(i + "'th argument of a @SpecializedConstructor method is not valid JS type, found " + argTypes[i]); ++ } ++ } ++ } ++ break; ++ case FUNCTION: { ++ final Type returnType = Type.getReturnType(javaDesc); ++ if (!isValidJSType(returnType)) { ++ error("return value of a @Function method should be a valid JS type, found " + returnType); ++ } ++ final Type[] argTypes = Type.getArgumentTypes(javaDesc); ++ if (argTypes.length < 1) { ++ error("@Function methods should have at least 1 arg"); ++ } ++ if (!isJavaLangObject(argTypes[0])) { ++ error("first argument of a @Function method should be of Object type, found " + argTypes[0]); + } + +- if (isVarArg && argTypes.length > 3) { +- error("vararg constructor has more than 3 arguments"); ++ if (argTypes.length > 1) { ++ for (int i = 1; i < argTypes.length - 1; i++) { ++ if (!isJavaLangObject(argTypes[i])) { ++ error(i + "'th argument of a @Function method should be of Object type, found " + argTypes[i]); ++ } ++ } ++ ++ final String lastArgTypeDesc = argTypes[argTypes.length - 1].getDescriptor(); ++ final boolean isVarArg = lastArgTypeDesc.equals(OBJECT_ARRAY_DESC); ++ if (!lastArgTypeDesc.equals(OBJECT_DESC) && !isVarArg) { ++ error("last argument of a @Function method is neither Object nor Object[] type: " + lastArgTypeDesc); ++ } ++ ++ if (isVarArg && argTypes.length > 2) { ++ error("vararg @Function method has more than 2 arguments"); ++ } + } + } +- } else if (kind == Kind.FUNCTION) { +- final Type returnType = Type.getReturnType(javaDesc); +- if (! returnType.toString().equals(OBJECT_DESC)) { +- error("return value should be of Object type, found" + returnType); +- } +- final Type[] argTypes = Type.getArgumentTypes(javaDesc); +- if (argTypes.length < 1) { +- error("function methods should have at least 1 arg"); +- } +- if (! argTypes[0].toString().equals(OBJECT_DESC)) { +- error("first argument should be of Object type, found" + argTypes[0]); +- } +- +- if (argTypes.length > 1) { +- for (int i = 1; i < argTypes.length - 1; i++) { +- if (! argTypes[i].toString().equals(OBJECT_DESC)) { +- error(i + "'th argument should be of Object type, found " + argTypes[i]); ++ break; ++ case SPECIALIZED_FUNCTION: { ++ final Type returnType = Type.getReturnType(javaDesc); ++ if (!isValidJSType(returnType)) { ++ error("return value of a @SpecializedFunction method should be a valid JS type, found " + returnType); ++ } ++ final Type[] argTypes = Type.getArgumentTypes(javaDesc); ++ for (int i = 0; i < argTypes.length; i++) { ++ if (!isValidJSType(argTypes[i])) { ++ error(i + "'th argument of a @SpecializedFunction method is not valid JS type, found " + argTypes[i]); + } + } +- +- final String lastArgType = argTypes[argTypes.length - 1].toString(); +- final boolean isVarArg = lastArgType.equals(OBJECT_ARRAY_DESC); +- if (!lastArgType.equals(OBJECT_DESC) && !isVarArg) { +- error("last argument is neither Object nor Object[] type: " + lastArgType); ++ } ++ break; ++ case GETTER: { ++ final Type[] argTypes = Type.getArgumentTypes(javaDesc); ++ if (argTypes.length != 1) { ++ error("@Getter methods should have one argument"); ++ } ++ if (!isJavaLangObject(argTypes[0])) { ++ error("first argument of a @Getter method should be of Object type, found: " + argTypes[0]); + } + +- if (isVarArg && argTypes.length > 2) { +- error("vararg function has more than 2 arguments"); ++ final Type returnType = Type.getReturnType(javaDesc); ++ if (!isJavaLangObject(returnType)) { ++ error("return type of a @Getter method should be Object, found: " + javaDesc); + } + } +- } else if (kind == Kind.GETTER) { +- final Type[] argTypes = Type.getArgumentTypes(javaDesc); +- if (argTypes.length != 1) { +- error("getter methods should have one argument"); ++ break; ++ case SETTER: { ++ final Type[] argTypes = Type.getArgumentTypes(javaDesc); ++ if (argTypes.length != 2) { ++ error("@Setter methods should have two arguments"); ++ } ++ if (!isJavaLangObject(argTypes[0])) { ++ error("first argument of a @Setter method should be of Object type, found: " + argTypes[0]); ++ } ++ if (!Type.getReturnType(javaDesc).toString().equals("V")) { ++ error("return type of of a @Setter method should be void, found: " + Type.getReturnType(javaDesc)); ++ } + } +- if (! argTypes[0].toString().equals(OBJECT_DESC)) { +- error("first argument of getter should be of Object type, found: " + argTypes[0]); +- } +- if (Type.getReturnType(javaDesc).equals(Type.VOID_TYPE)) { +- error("return type of getter should not be void"); +- } +- } else if (kind == Kind.SETTER) { +- final Type[] argTypes = Type.getArgumentTypes(javaDesc); +- if (argTypes.length != 2) { +- error("setter methods should have two arguments"); +- } +- if (! argTypes[0].toString().equals(OBJECT_DESC)) { +- error("first argument of setter should be of Object type, found: " + argTypes[0]); +- } +- if (!Type.getReturnType(javaDesc).toString().equals("V")) { +- error("return type of setter should be void, found: " + Type.getReturnType(javaDesc)); ++ break; ++ case PROPERTY: { ++ if (where == Where.CONSTRUCTOR) { ++ if (isStatic()) { ++ if (!isFinal()) { ++ error("static Where.CONSTRUCTOR @Property should be final"); ++ } ++ ++ if (!isJSPrimitiveType(Type.getType(javaDesc))) { ++ error("static Where.CONSTRUCTOR @Property should be a JS primitive"); ++ } ++ } ++ } else if (where == Where.PROTOTYPE) { ++ if (isStatic()) { ++ if (!isFinal()) { ++ error("static Where.PROTOTYPE @Property should be final"); ++ } ++ ++ if (!isJSPrimitiveType(Type.getType(javaDesc))) { ++ error("static Where.PROTOTYPE @Property should be a JS primitive"); ++ } ++ } ++ } + } + } + } + ++ private static boolean isValidJSType(final Type type) { ++ return isJSPrimitiveType(type) || isJSObjectType(type); ++ } ++ ++ private static boolean isJSPrimitiveType(final Type type) { ++ switch (type.getSort()) { ++ case Type.BOOLEAN: ++ case Type.INT: ++ case Type.LONG: ++ case Type.DOUBLE: ++ return true; ++ default: ++ return false; ++ } ++ } ++ ++ private static boolean isJSObjectType(final Type type) { ++ return isJavaLangObject(type) || isJavaLangString(type) || isScriptObject(type); ++ } ++ ++ private static boolean isJavaLangObject(final Type type) { ++ return type.getDescriptor().equals(OBJECT_DESC); ++ } ++ ++ private static boolean isJavaLangString(final Type type) { ++ return type.getDescriptor().equals(STRING_DESC); ++ } ++ ++ private static boolean isScriptObject(final Type type) { ++ if (type.getDescriptor().equals(SCRIPTOBJECT_DESC)) { ++ return true; ++ } ++ ++ if (type.getSort() == Type.OBJECT) { ++ try { ++ final Class clazz = Class.forName(type.getClassName(), false, myLoader); ++ return ScriptObject.class.isAssignableFrom(clazz); ++ } catch (final ClassNotFoundException cnfe) { ++ return false; ++ } ++ } ++ ++ return false; ++ } ++ + private void error(final String msg) { +- throw new RuntimeException(javaName + javaDesc + " : " + msg); ++ throw new RuntimeException(javaName + " of type " + javaDesc + " : " + msg); + } + + /** +--- ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/MethodGenerator.java Wed Jul 30 03:55:26 2014 -0700 +@@ -349,19 +349,19 @@ + + // invokes, field get/sets + void invokeInterface(final String owner, final String method, final String desc) { +- super.visitMethodInsn(INVOKEINTERFACE, owner, method, desc); ++ super.visitMethodInsn(INVOKEINTERFACE, owner, method, desc, true); + } + + void invokeVirtual(final String owner, final String method, final String desc) { +- super.visitMethodInsn(INVOKEVIRTUAL, owner, method, desc); ++ super.visitMethodInsn(INVOKEVIRTUAL, owner, method, desc, false); + } + + void invokeSpecial(final String owner, final String method, final String desc) { +- super.visitMethodInsn(INVOKESPECIAL, owner, method, desc); ++ super.visitMethodInsn(INVOKESPECIAL, owner, method, desc, false); + } + + void invokeStatic(final String owner, final String method, final String desc) { +- super.visitMethodInsn(INVOKESTATIC, owner, method, desc); ++ super.visitMethodInsn(INVOKESTATIC, owner, method, desc, false); + } + + void putStatic(final String owner, final String field, final String desc) { +@@ -413,7 +413,7 @@ + super.visitMethodInsn(INVOKEVIRTUAL, + "java/io/PrintStream", + "println", +- "(Ljava/lang/String;)V"); ++ "(Ljava/lang/String;)V", false); + } + + // print the object on the top of the stack +@@ -426,6 +426,6 @@ + super.visitMethodInsn(INVOKEVIRTUAL, + "java/io/PrintStream", + "println", +- "(Ljava/lang/Object;)V"); ++ "(Ljava/lang/Object;)V", false); + } + } +--- ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/PrototypeGenerator.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/PrototypeGenerator.java Wed Jul 30 03:55:26 2014 -0700 +@@ -32,10 +32,7 @@ + import static jdk.nashorn.internal.tools.nasgen.StringConstants.DEFAULT_INIT_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.INIT; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DESC; +-import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DUPLICATE; +-import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_DUPLICATE_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_FIELD_NAME; +-import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROPERTYMAP_TYPE; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.OBJECT_DESC; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPEOBJECT_TYPE; + import static jdk.nashorn.internal.tools.nasgen.StringConstants.PROTOTYPE_SUFFIX; +@@ -129,7 +126,6 @@ + mi.getStatic(className, PROPERTYMAP_FIELD_NAME, PROPERTYMAP_DESC); + // make sure we use duplicated PropertyMap so that original map + // stays intact and so can be used for many global. +- mi.invokeVirtual(PROPERTYMAP_TYPE, PROPERTYMAP_DUPLICATE, PROPERTYMAP_DUPLICATE_DESC); + mi.invokeSpecial(PROTOTYPEOBJECT_TYPE, INIT, SCRIPTOBJECT_INIT_DESC); + // initialize Function type fields + initFunctionFields(mi); +--- ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInstrumentor.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInstrumentor.java Wed Jul 30 03:55:26 2014 -0700 +@@ -146,16 +146,16 @@ + // call $clinit$ just before return from <clinit> + if (isStaticInit && opcode == RETURN) { + super.visitMethodInsn(INVOKESTATIC, scriptClassInfo.getJavaName(), +- $CLINIT$, DEFAULT_INIT_DESC); ++ $CLINIT$, DEFAULT_INIT_DESC, false); + } + super.visitInsn(opcode); + } + + @Override +- public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) { ++ public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc, final boolean itf) { + if (isConstructor && opcode == INVOKESPECIAL && + INIT.equals(name) && SCRIPTOBJECT_TYPE.equals(owner)) { +- super.visitMethodInsn(opcode, owner, name, desc); ++ super.visitMethodInsn(opcode, owner, name, desc, false); + + if (memberCount > 0) { + // initialize @Property fields if needed +@@ -166,7 +166,7 @@ + super.visitTypeInsn(NEW, clazz); + super.visitInsn(DUP); + super.visitMethodInsn(INVOKESPECIAL, clazz, +- INIT, DEFAULT_INIT_DESC); ++ INIT, DEFAULT_INIT_DESC, false); + super.visitFieldInsn(PUTFIELD, scriptClassInfo.getJavaName(), + memInfo.getJavaName(), memInfo.getJavaDesc()); + } +@@ -180,7 +180,7 @@ + } + } + } else { +- super.visitMethodInsn(opcode, owner, name, desc); ++ super.visitMethodInsn(opcode, owner, name, desc, itf); + } + } + +--- ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/StringConstants.java Wed Jul 30 03:55:26 2014 -0700 +@@ -45,11 +45,9 @@ + @SuppressWarnings("javadoc") + public interface StringConstants { + // standard jdk types, methods +- static final Type TYPE_METHOD = Type.getType(Method.class); + static final Type TYPE_METHODHANDLE = Type.getType(MethodHandle.class); + static final Type TYPE_METHODHANDLE_ARRAY = Type.getType(MethodHandle[].class); + static final Type TYPE_OBJECT = Type.getType(Object.class); +- static final Type TYPE_CLASS = Type.getType(Class.class); + static final Type TYPE_STRING = Type.getType(String.class); + static final Type TYPE_COLLECTION = Type.getType(Collection.class); + static final Type TYPE_COLLECTIONS = Type.getType(Collections.class); +@@ -63,6 +61,8 @@ + static final String METHODHANDLE_TYPE = TYPE_METHODHANDLE.getInternalName(); + static final String OBJECT_TYPE = TYPE_OBJECT.getInternalName(); + static final String OBJECT_DESC = TYPE_OBJECT.getDescriptor(); ++ static final String STRING_TYPE = TYPE_STRING.getInternalName(); ++ static final String STRING_DESC = TYPE_STRING.getDescriptor(); + static final String OBJECT_ARRAY_DESC = Type.getDescriptor(Object[].class); + static final String ARRAYLIST_TYPE = TYPE_ARRAYLIST.getInternalName(); + static final String COLLECTION_TYPE = TYPE_COLLECTION.getInternalName(); +@@ -104,10 +104,6 @@ + static final String PROPERTYMAP_DESC = TYPE_PROPERTYMAP.getDescriptor(); + static final String PROPERTYMAP_NEWMAP = "newMap"; + static final String PROPERTYMAP_NEWMAP_DESC = Type.getMethodDescriptor(TYPE_PROPERTYMAP, TYPE_COLLECTION); +- static final String PROPERTYMAP_DUPLICATE = "duplicate"; +- static final String PROPERTYMAP_DUPLICATE_DESC = Type.getMethodDescriptor(TYPE_PROPERTYMAP); +- static final String PROPERTYMAP_SETISSHARED = "setIsShared"; +- static final String PROPERTYMAP_SETISSHARED_DESC = Type.getMethodDescriptor(TYPE_PROPERTYMAP); + + // PrototypeObject + static final String PROTOTYPEOBJECT_TYPE = TYPE_PROTOTYPEOBJECT.getInternalName(); +@@ -135,6 +131,7 @@ + + // ScriptObject + static final String SCRIPTOBJECT_TYPE = TYPE_SCRIPTOBJECT.getInternalName(); ++ static final String SCRIPTOBJECT_DESC = TYPE_SCRIPTOBJECT.getDescriptor(); + static final String SCRIPTOBJECT_INIT_DESC = Type.getMethodDescriptor(Type.VOID_TYPE, TYPE_PROPERTYMAP); + + static final String GETTER_PREFIX = "G$"; +--- ./nashorn/make/BuildNashorn.gmk Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/make/BuildNashorn.gmk Wed Jul 30 03:55:26 2014 -0700 +@@ -77,7 +77,7 @@ + $(RM) -rf $(@D)/jdk $(@D)/netscape + $(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/ + $(FIXPATH) $(JAVA) \ +- -cp "$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \ ++ -Xbootclasspath/p:"$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" \ + jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D) + $(TOUCH) $@ + +--- ./nashorn/make/build.xml Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/make/build.xml Wed Jul 30 03:55:26 2014 -0700 +@@ -42,6 +42,9 @@ + <condition property="hg.executable" value="/usr/local/bin/hg" else="hg"> + <available file="/usr/local/bin/hg"/> + </condition> ++ <condition property="git.executable" value="/usr/local/bin/git" else="git"> ++ <available file="/usr/local/bin/git"/> ++ </condition> + <!-- check if JDK already has ASM classes --> + <available property="asm.available" classname="jdk.internal.org.objectweb.asm.Type"/> + <!-- check if testng.jar is avaiable --> +@@ -122,6 +125,7 @@ + <compilerarg value="-Xlint:unchecked"/> + <compilerarg value="-Xlint:deprecation"/> + <compilerarg value="-XDignore.symbol.file"/> ++ <compilerarg value="-Xdiags:verbose"/> + </javac> + <copy todir="${build.classes.dir}/META-INF/services"> + <fileset dir="${meta.inf.dir}/services/"/> +@@ -189,14 +193,16 @@ + </jar> + </target> + +- <target name="javadoc" depends="prepare"> +- <javadoc destdir="${dist.javadoc.dir}" use="yes" overview="src/overview.html" windowtitle="${nashorn.product.name} ${nashorn.version}" additionalparam="-quiet" failonerror="true"> ++ <target name="javadoc" depends="jar"> ++ <javadoc destdir="${dist.javadoc.dir}" use="yes" overview="src/overview.html" ++ extdirs="${nashorn.ext.path}" windowtitle="${nashorn.product.name} ${nashorn.version}" ++ additionalparam="-quiet" failonerror="true"> + <classpath> + <pathelement location="${build.classes.dir}"/> + </classpath> + <fileset dir="${src.dir}" includes="**/*.java"/> + <fileset dir="${jdk.asm.src.dir}" includes="**/*.java"/> +- <link href="http://docs.oracle.com/javase/7/docs/api/"/> ++ <link href="http://docs.oracle.com/javase/8/docs/api/"/> + <!-- The following tags are used only in ASM sources - just ignore these --> + <tag name="label" description="label tag in ASM sources" enabled="false"/> + <tag name="linked" description="linked tag in ASM sources" enabled="false"/> +@@ -204,6 +210,19 @@ + </javadoc> + </target> + ++ <!-- generate javadoc only for nashorn extension api classes --> ++ <target name="javadocapi" depends="jar"> ++ <javadoc destdir="${dist.javadoc.dir}" use="yes" extdirs="${nashorn.ext.path}" ++ windowtitle="${nashorn.product.name}" additionalparam="-quiet" failonerror="true"> ++ <classpath> ++ <pathelement location="${build.classes.dir}"/> ++ </classpath> ++ <fileset dir="${src.dir}" includes="jdk/nashorn/api/**/*.java"/> ++ <link href="http://docs.oracle.com/javase/8/docs/api/"/> ++ </javadoc> ++ </target> ++ ++ + <!-- generate shell.html for shell tool documentation --> + <target name="shelldoc" depends="jar"> + <java classname="${nashorn.shell.tool}" dir="${basedir}" output="${dist.dir}/shell.html" failonerror="true" fork="true"> +@@ -240,6 +259,7 @@ + <compilerarg value="-J-Djava.ext.dirs="/> + <compilerarg value="-Xlint:unchecked"/> + <compilerarg value="-Xlint:deprecation"/> ++ <compilerarg value="-Xdiags:verbose"/> + </javac> + + <copy todir="${build.test.classes.dir}/META-INF/services"> +@@ -250,6 +270,10 @@ + <fileset dir="${test.src.dir}/jdk/nashorn/internal/runtime/resources"/> + </copy> + ++ <copy todir="${build.test.classes.dir}/jdk/nashorn/api/scripting/resources"> ++ <fileset dir="${test.src.dir}/jdk/nashorn/api/scripting/resources"/> ++ </copy> ++ + <!-- tests that check nashorn internals and internal API --> + <jar jarfile="${nashorn.internal.tests.jar}"> + <fileset dir="${build.test.classes.dir}" excludes="**/api/**"/> +@@ -279,6 +303,11 @@ + permission java.security.AllPermission; + }; + ++grant codeBase "file:/${basedir}/test/script/maptests/*" { ++ permission java.io.FilePermission "${basedir}/test/script/maptests/*","read"; ++ permission java.lang.RuntimePermission "nashorn.debugMode"; ++}; ++ + grant codeBase "file:/${basedir}/test/script/basic/*" { + permission java.io.FilePermission "${basedir}/test/script/-", "read"; + permission java.io.FilePermission "$${user.dir}", "read"; +@@ -322,22 +351,58 @@ + <echo message="WARNING: TestNG not available, will not run tests. Please copy testng.jar under test/lib directory."/> + </target> + +- <target name="test" depends="jar, check-testng, check-external-tests, compile-test, generate-policy-file" if="testng.available"> +- <fileset id="test.classes" dir="${build.test.classes.dir}"> +- <include name="**/api/javaaccess/*Test.class"/> +- <include name="**/api/scripting/*Test.class"/> +- <include name="**/codegen/*Test.class"/> +- <include name="**/parser/*Test.class"/> +- <include name="**/runtime/*Test.class"/> +- <include name="**/runtime/regexp/*Test.class"/> +- <include name="**/runtime/regexp/joni/*Test.class"/> +- <include name="**/framework/*Test.class"/> ++ <!-- only to be invoked as dependency of "test" target --> ++ <target name="-test-classes-all" depends="jar" unless="test.class"> ++ <fileset id="test.classes" dir="${build.test.classes.dir}"> ++ <include name="**/api/javaaccess/*Test.class"/> ++ <include name="**/api/scripting/*Test.class"/> ++ <include name="**/codegen/*Test.class"/> ++ <include name="**/parser/*Test.class"/> ++ <include name="**/runtime/*Test.class"/> ++ <include name="**/runtime/regexp/*Test.class"/> ++ <include name="**/runtime/regexp/joni/*Test.class"/> ++ <include name="**/framework/*Test.class"/> ++ </fileset> ++ </target> ++ ++ <!-- only to be invoked as dependency of "test" target --> ++ <target name="-test-classes-single" depends="jar" if="test.class"> ++ <fileset id="test.classes" dir="${build.test.classes.dir}"> ++ <include name="${test.class}*"/> ++ </fileset> ++ </target> ++ ++ <!-- only to be invoked as dependency of "test" target --> ++ <target name="-test-nosecurity" unless="test.class"> ++ <fileset id="test.nosecurity.classes" dir="${build.test.classes.dir}"> ++ <include name="**/framework/ScriptTest.class"/> + </fileset> ++ <testng outputdir="${build.nosecurity.test.results.dir}" classfilesetref="test.nosecurity.classes" ++ verbose="${testng.verbose}" haltonfailure="true" useDefaultListeners="false" listeners="${testng.listeners}" workingDir="${basedir}"> ++ <jvmarg line="${ext.class.path}"/> ++ <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx}"/> ++ <propertyset> ++ <propertyref prefix="nashorn."/> ++ </propertyset> ++ <propertyset> ++ <propertyref prefix="test-sys-prop-no-security."/> ++ <mapper from="test-sys-prop-no-security.*" to="*" type="glob"/> ++ </propertyset> ++ <classpath> ++ <pathelement path="${run.test.classpath}"/> ++ </classpath> ++ </testng> ++ </target> + ++ <!-- only to be invoked as dependency of "test" target --> ++ <target name="-test-security"> ++ <delete dir="${build.dir}/nashorn_code_cache"/> ++ <property name="debug.test.jvmargs" value=""/> + <testng outputdir="${build.test.results.dir}" classfilesetref="test.classes" + verbose="${testng.verbose}" haltonfailure="true" useDefaultListeners="false" listeners="${testng.listeners}" workingDir="${basedir}"> + <jvmarg line="${ext.class.path}"/> + <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs}"/> ++ <jvmarg line="${debug.test.jvmargs}"/> + <propertyset> + <propertyref prefix="test-sys-prop."/> + <mapper from="test-sys-prop.*" to="*" type="glob"/> +@@ -349,6 +414,8 @@ + </testng> + </target> + ++ <target name="test" depends="jar, -test-classes-all,-test-classes-single, check-testng, check-external-tests, compile-test, generate-policy-file, -test-security, -test-nosecurity" if="testng.available"/> ++ + <target name="test-basicparallel" depends="jar, check-testng, check-external-tests, compile-test, generate-policy-file"> + <!-- use just build.test.classes.dir to avoid referring to TestNG --> + <java classname="${parallel.test.runner}" dir="${basedir}" classpath="${build.test.classes.dir}" failonerror="true" fork="true"> +@@ -459,18 +526,17 @@ + + <!-- test262 test suite --> + <target name="get-test262" depends="init" unless="${test-sys-prop.external.test262}"> +- <!-- clone test262 mercurial repo --> +- <exec executable="${hg.executable}"> ++ <!-- clone test262 git repo --> ++ <exec executable="${git.executable}"> + <arg value="clone"/> +- <arg value="http://hg.ecmascript.org/tests/test262"/> ++ <arg value="https://github.com/tc39/test262"/> + <arg value="${test.external.dir}/test262"/> + </exec> + </target> + <target name="update-test262" depends="init" if="${test-sys-prop.external.test262}"> +- <!-- update test262 mercurial repo --> +- <exec executable="${hg.executable}" dir="${test.external.dir}/test262"> ++ <!-- update test262 git repo --> ++ <exec executable="${git.executable}" dir="${test.external.dir}/test262"> + <arg value="pull"/> +- <arg value="-u"/> + </exec> + </target> + +--- ./nashorn/make/nbproject/ide-file-targets.xml Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/make/nbproject/ide-file-targets.xml Wed Jul 30 03:55:26 2014 -0700 +@@ -22,38 +22,14 @@ + questions. + --> + <project basedir=".." name="nashorn-IDE"> +- <property file="nbproject/nbjdk.properties"/> +- <property location="${netbeans.user}/build.properties" name="user.properties.file"/> +- <property file="${user.properties.file}"/> +- <import file="jdk.xml"/> +- <import file="${basedir}/build-init.xml"/> +- <!-- TODO: edit the following target according to your needs --> +- <!-- (more info: http://www.netbeans.org/kb/articles/freeform-config.html#runsingle) --> +- <target depends="-jdk-init, init" name="debug-selected-file-in-src"> +- <fail unless="debug.class">Must set property 'debug.class'</fail> +- <ant antfile="build.xml" inheritall="false" target="jar"/> ++ <target name="debug-selected-file-in-src"> ++ <fail unless="test.class">Must set property 'debug.class'</fail> + <nbjpdastart addressproperty="jpda.address" name="nashorn" transport="dt_socket"> + <classpath path="${run.test.classpath}"/> + </nbjpdastart> +- <java classname="${debug.class}" fork="false"> +- <classpath path="${run.test.classpath}"/> +- <jvmarg line="${boot.class.path}"/> +- <jvmarg value="-Xdebug"/> +- <jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/> +- <jvmarg line="${run.test.jvmargs}"/> +- <arg value="${debug.class}"/> +- </java> +- </target> +- <!-- TODO: edit the following target according to your needs --> +- <!-- (more info: http://www.netbeans.org/kb/articles/freeform-config.html#runsingle) --> +- <target depends="-jdk-init, init" name="run-selected-file-in-src"> +- <fail unless="run.class">Must set property 'run.class'</fail> +- <ant antfile="build.xml" inheritall="false" target="jar"/> +- <java classname="${run.class}" failonerror="true" fork="false"> +- <classpath path="${run.test.classpath}"/> +- <jvmarg line="${boot.class.path}"/> +- <jvmarg line="${run.test.jvmargs}"/> +- <arg value="${run.class}"/> +- </java> ++ <ant antfile="build.xml" inheritall="false" target="test"> ++ <property name="test.class" value="${test.class}"/> ++ <property name="debug.test.jvmargs" value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/> ++ </ant> + </target> + </project> +--- ./nashorn/make/nbproject/project.xml Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/make/nbproject/project.xml Wed Jul 30 03:55:26 2014 -0700 +@@ -98,27 +98,27 @@ + <script>nbproject/nbjdk.xml</script> + <target>debug-nb</target> + </action> +- <action name="debug.single"> +- <script>nbproject/ide-file-targets.xml</script> +- <target>debug-selected-file-in-src</target> ++ <action name="run.single"> ++ <script>build.xml</script> ++ <target>test</target> + <context> +- <property>debug.class</property> +- <folder>test/src</folder> ++ <property>test.class</property> ++ <folder>../test/src</folder> + <pattern>\.java$</pattern> +- <format>java-name</format> ++ <format>relative-path-noext</format> + <arity> + <one-file-only/> + </arity> + </context> + </action> +- <action name="run.single"> ++ <action name="debug.single"> + <script>nbproject/ide-file-targets.xml</script> +- <target>run-selected-file-in-src</target> ++ <target>debug-selected-file-in-src</target> + <context> +- <property>run.class</property> +- <folder>test/src</folder> ++ <property>test.class</property> ++ <folder>../test/src</folder> + <pattern>\.java$</pattern> +- <format>java-name</format> ++ <format>relative-path-noext</format> + <arity> + <one-file-only/> + </arity> +--- ./nashorn/make/project.properties Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/make/project.properties Wed Jul 30 03:55:26 2014 -0700 +@@ -59,6 +59,7 @@ + + # test results directory + build.test.results.dir=${build.dir}/test/reports ++build.nosecurity.test.results.dir=${build.dir}/test/nosecurity/reports + + # This directory is removed when the project is cleaned: + dist.dir=dist +@@ -110,8 +111,10 @@ + + # test scripts to run + test.dir=test ++test.nosecurity.dir=test/script/nosecurity + test.script.dir=test/script + test.basic.dir=test/script/basic ++test.maptests.dir=test/script/maptests + test.error.dir=test/script/error + test.sandbox.dir=test/script/sandbox + test.trusted.dir=test/script/trusted +@@ -121,13 +124,17 @@ + testjfx.dir=${test.script.dir}/jfx + + test-sys-prop.test.dir=${test.dir} +-test-sys-prop.test.js.roots=${test.basic.dir} ${test.error.dir} ${test.sandbox.dir} ${test.trusted.dir} ++test-sys-prop.test.js.roots=${test.basic.dir} ${test.maptests.dir} ${test.error.dir} ${test.sandbox.dir} ${test.trusted.dir} + test-sys-prop.test262.suite.dir=${test262.suite.dir} + test-sys-prop.es5conform.testcases.dir=${test.external.dir}/ES5Conform/TestCases + test-sys-prop.test.basic.dir=${test.basic.dir} + ++test-sys-prop-no-security.test.dir=${test.dir} ++test-sys-prop-no-security.test.js.roots=${test.nosecurity.dir} ++ + # framework root for our script tests + test-sys-prop.test.js.framework=${test.script.dir}/assert.js ++test-sys-prop-no-security.test.js.framework=${test.script.dir}/assert.js + + # Control the verbosity of ParserTest + test-sys-prop.parsertest.verbose=false +@@ -201,7 +208,7 @@ + + # test262 test frameworks + test262-test-sys-prop.test.js.framework=\ +- --class-cache-size=0 \ ++ --class-cache-size=10 \ + --no-java \ + --no-typed-arrays \ + -timezone=PST \ +@@ -264,7 +271,7 @@ + run.test.jvmsecurityargs=-Xverify:all -Djava.security.manager -Djava.security.policy=${basedir}/build/nashorn.policy + + # VM options for script tests with @fork option +-test-sys-prop.test.fork.jvm.options=${run.test.jvmargs.main} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs} ++test-sys-prop.test.fork.jvm.options=${run.test.jvmargs.main} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs} -cp ${run.test.classpath} + + # path of rhino.jar for benchmarks + rhino.jar= +--- ./nashorn/samples/BufferArray.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/BufferArray.java Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,110 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++import jdk.nashorn.api.scripting.AbstractJSObject; ++import java.nio.DoubleBuffer; ++ ++/** ++ * Simple class demonstrating pluggable script object ++ * implementation. By implementing jdk.nashorn.api.scripting.JSObject ++ * (or extending AbstractJSObject which implements it), you ++ * can supply a friendly script object. Nashorn will call ++ * 'magic' methods on such a class on 'obj.foo, obj.foo = 33, ++ * obj.bar()' etc. from script. ++ * ++ * In this example, Java nio DoubleBuffer object is wrapped ++ * as a friendly script object that provides indexed acces ++ * to buffer content and also support array-like "length" ++ * readonly property to retrieve buffer's capacity. This class ++ * also demonstrates a function valued property called "buf". ++ * On 'buf' method, we return the underlying nio buffer object ++ * that is being wrapped. ++ */ ++public class BufferArray extends AbstractJSObject { ++ // underlying nio buffer ++ private final DoubleBuffer buf; ++ ++ public BufferArray(int size) { ++ buf = DoubleBuffer.allocate(size); ++ } ++ ++ public BufferArray(DoubleBuffer buf) { ++ this.buf = buf; ++ } ++ ++ // called to check if indexed property exists ++ @Override ++ public boolean hasSlot(int index) { ++ return index > 0 && index < buf.capacity(); ++ } ++ ++ // get the value from that index ++ @Override ++ public Object getSlot(int index) { ++ return buf.get(index); ++ } ++ ++ // set the value at that index ++ @Override ++ public void setSlot(int index, Object value) { ++ buf.put(index, ((Number)value).doubleValue()); ++ } ++ ++ // do you have a property of that given name? ++ @Override ++ public boolean hasMember(String name) { ++ return "length".equals(name) || "buf".equals(name); ++ } ++ ++ // get the value of that named property ++ @Override ++ public Object getMember(String name) { ++ switch (name) { ++ case "length": ++ return buf.capacity(); ++ case "buf": ++ // return a 'function' value for this property ++ return new AbstractJSObject() { ++ @Override ++ public Object call(Object thiz, Object... args) { ++ return BufferArray.this.buf; ++ } ++ ++ // yes, I'm a function ! ++ @Override ++ public boolean isFunction() { ++ return true; ++ } ++ }; ++ } ++ return null; ++ } ++} +--- ./nashorn/samples/CastExample.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/CastExample.java Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,38 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple java example with type casts. ++// see javacastcounter.js. ++ ++class CastExample { ++ public final static int I = (int)23.33; ++ public final String str = (String)"hello"; ++} +--- ./nashorn/samples/README Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/README Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,1 @@ ++Simple Nashorn examples that can be run with "jjs" tool. +--- ./nashorn/samples/array_mapreduce.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/array_mapreduce.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,78 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Usage: jjs array_mapreduce.js ++ ++// Many Array.prototype functions such as map, ++// filter, reduce, reduceRight, every, some are generic. ++// These functions accept ECMAScript array as well as ++// many array-like objects including java arrays. ++// So, you can do map/filter/reduce with Java streams or ++// you can also use Array.prototype functions as below. ++// See also http://en.wikipedia.org/wiki/MapReduce ++ ++var DoubleArray = Java.type("double[]"); ++var StringArray = Java.type("java.lang.String[]"); ++ ++var map = Array.prototype.map; ++var filter = Array.prototype.filter; ++var reduce = Array.prototype.reduce; ++ ++var jarr = new StringArray(5); ++jarr[0] = "nashorn"; ++jarr[1] = "ecmascript"; ++jarr[2] = "javascript"; ++jarr[3] = "js"; ++jarr[4] = "scheme"; ++ ++// sum of word lengths ++print("Sum word length:", ++ reduce.call( ++ map.call(jarr, function(x) x.length), ++ function(x, y) x + y) ++); ++ ++// another array example involving numbers ++jarr = new DoubleArray(10); ++// make random array of numbers ++for (var i = 0; i < jarr.length; i++) ++ jarr[i] = Math.random(); ++ ++var forEach = Array.prototype.forEach; ++// print numbers in the array ++forEach.call(jarr, function(x) print(x)); ++ ++// print sum of squares of the random numbers ++print("Square sum:", ++ reduce.call( ++ map.call(jarr, function(x) x*x), ++ function(x, y) x + y) ++); +--- ./nashorn/samples/astviewer.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/astviewer.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,98 @@ ++#// Usage: jjs -scripting -fx astviewer.js -- <scriptfile> ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++if (!$OPTIONS._fx) { ++ print("Usage: jjs -scripting -fx astviewer.js -- <.js file>"); ++ exit(1); ++} ++ ++// Using JavaFX from Nashorn. See also: ++// http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/javafx.html ++ ++// This example shows AST of a script file as a JavaFX ++// tree view in a window. If no file is specified, AST of ++// this script file is shown. This script demonstrates ++// 'load' function, JavaFX support by -fx, readFully function ++// in scripting mode. ++ ++// JavaFX classes used ++var StackPane = Java.type("javafx.scene.layout.StackPane"); ++var Scene = Java.type("javafx.scene.Scene"); ++var TreeItem = Java.type("javafx.scene.control.TreeItem"); ++var TreeView = Java.type("javafx.scene.control.TreeView"); ++ ++// Create a javafx TreeItem to view a AST node ++function treeItemForASTNode(ast, name) { ++ var item = new TreeItem(name); ++ for (var prop in ast) { ++ var node = ast[prop]; ++ if (typeof node == 'object') { ++ if (node == null) { ++ // skip nulls ++ continue; ++ } ++ ++ if (Array.isArray(node) && node.length == 0) { ++ // skip empty arrays ++ continue; ++ } ++ ++ var subitem = treeItemForASTNode(node, prop); ++ } else { ++ var subitem = new TreeItem(prop + ": " + node); ++ } ++ item.children.add(subitem); ++ } ++ return item; ++} ++ ++// do we have a script file passed? if not, use current script ++var sourceName = arguments.length == 0? __FILE__ : arguments[0]; ++ ++// load parser.js from nashorn resources ++load("nashorn:parser.js"); ++ ++// read the full content of the file and parse it ++// to get AST of the script specified ++var ast = parse(readFully(sourceName)); ++ ++// JavaFX start method ++function start(stage) { ++ stage.title = "AST Viewer"; ++ var rootItem = treeItemForASTNode(ast, sourceName); ++ var tree = new TreeView(rootItem); ++ var root = new StackPane(); ++ root.children.add(tree); ++ stage.scene = new Scene(root, 300, 450); ++ stage.show(); ++} +--- ./nashorn/samples/barchart_weather.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/barchart_weather.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,116 @@ ++#// Usage: jjs -fx barchart_weather.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Example that retrieves weather data from a URL in JSON ++// format and draws bar chart using JavaFX ++ ++// -fx check ++if (! $OPTIONS._fx) { ++ print("Usage: jjs -fx barchart_weather.js"); ++ exit(1); ++} ++ ++// Java classes used ++var URL = Java.type("java.net.URL"); ++var BufferedReader = Java.type("java.io.BufferedReader"); ++var InputStreamReader = Java.type("java.io.InputStreamReader"); ++ ++// function to retrieve text content of the given URL ++function readTextFromURL(url) { ++ var str = ''; ++ var u = new URL(url); ++ var reader = new BufferedReader( ++ new InputStreamReader(u.openStream())); ++ try { ++ reader.lines().forEach(function(x) str += x); ++ return str; ++ } finally { ++ reader.close(); ++ } ++} ++ ++// change URL for your city here! ++var url = "http://api.openweathermap.org/data/2.5/forecast?q=chennai,india&units=metric&mode=json"; ++ ++// download JSON document and parse ++var json = readTextFromURL(url); ++var weather = JSON.parse(json); ++ ++// View JSON of this using site such as http://www.jsoneditoronline.org/ to know ++// about the JSON data format used by this site ++ ++// Extracted data from the json object ++var temp = weather.list.map(function(x) x.main.temp); ++var temp_min = weather.list.map(function(x) x.main.temp_min); ++var temp_max = weather.list.map(function(x) x.main.temp_max); ++var date = weather.list.map(function(x) x.dt_txt); ++ ++// JavaFX classes used ++var Scene = Java.type("javafx.scene.Scene"); ++var BarChart = Java.type("javafx.scene.chart.BarChart"); ++var CategoryAxis = Java.type("javafx.scene.chart.CategoryAxis"); ++var NumberAxis = Java.type("javafx.scene.chart.NumberAxis"); ++var XYChart = Java.type("javafx.scene.chart.XYChart"); ++ ++function start(stage) { ++ stage.title="Chennai Weather Bar Chart"; ++ var xAxis = new CategoryAxis(); ++ xAxis.label = "date/time"; ++ var yAxis = new NumberAxis(); ++ yAxis.label = "temp in C"; ++ var bc = new BarChart(xAxis, yAxis); ++ ++ // 3 bars per datetime item - temp, min temp and max temp ++ var s1 = new XYChart.Series(); ++ s1.name = "temp"; ++ for (d in date) { ++ s1.data.add(new XYChart.Data(date[d], temp[d])); ++ } ++ ++ var s2 = new XYChart.Series(); ++ s2.name = "min temp"; ++ for (d in date) { ++ s2.data.add(new XYChart.Data(date[d], temp_min[d])); ++ } ++ ++ var s3 = new XYChart.Series(); ++ s3.name = "max temp"; ++ for (d in date) { ++ s3.data.add(new XYChart.Data(date[d], temp_max[d])); ++ } ++ ++ bc.data.addAll(s1, s2, s3); ++ ++ stage.scene = new Scene(bc, 800, 600); ++ stage.show(); ++} +--- ./nashorn/samples/call_lambda.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/call_lambda.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,45 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// nashorn allows you treat every Java8 lambda as a function ++ ++var JFunction = Java.type("java.util.function.Function"); ++var obj = new JFunction() { ++ apply: function(x) { ++ print(x + ", lambda"); ++ } ++}; ++ ++// prints 'function' ++print(typeof obj); ++ ++// call it! ++obj("hello"); +--- ./nashorn/samples/counters.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/samples/counters.js Wed Jul 30 03:55:26 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 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 +@@ -33,7 +33,11 @@ + * This file can be run along with any script you want to run + * to print aggregate stat counters from nashorn. + * +- * Usage: jjs <your-file.js> counters.js ++ * Usage: jjs -J-Dnashorn.debug <your-file.js> counters.js + */ + +-Debug.dumpCounters(); ++if (java.lang.System.getProperty("nashorn.debug") == null) { ++ print("Usage: jjs -J-Dnashorn.debug <your-file.js> counters.js"); ++} else { ++ Debug.dumpCounters(); ++} +--- ./nashorn/samples/dirname.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/dirname.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// __DIR__ variable is equivalent of `dirname $0` in ++// shell scripts - expands to the directory where ++// the current script is located. ++ ++print("This script is in the directory: " + __DIR__); +--- ./nashorn/samples/disassemble.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/disassemble.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,75 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Usage: jjs disassemble.js -- <.class-file-path> ++ ++// Simple .class disassembler that uses bundled ObjectWeb ASM ++// classes in jdk8. WARNING: Bundled ObjectWeb ASM classes are ++// not part of official jdk8 API. It can be changed/removed ++// without notice. So, this script is brittle by design! ++ ++// This example demonstrates passing arguments to script ++// from jjs command line, nio and ASM usage. ++ ++// classes used ++var FileSystems = Java.type("java.nio.file.FileSystems"); ++var Files = Java.type("java.nio.file.Files"); ++var System = Java.type("java.lang.System"); ++var PrintWriter = Java.type("java.io.PrintWriter"); ++ ++// WARNING: uses non-API classes of jdk8! ++var ClassReader = Java.type("jdk.internal.org.objectweb.asm.ClassReader"); ++var TraceClassVisitor = Java.type("jdk.internal.org.objectweb.asm.util.TraceClassVisitor"); ++ ++// convert file name to Path instance ++function path(file) { ++ return FileSystems.default.getPath(file); ++} ++ ++// read all file content as a byte[] ++function readAllBytes(file) { ++ return Files.readAllBytes(path(file)); ++} ++ ++// disassemble .class byte[] and prints output to stdout ++function disassemble(bytecode) { ++ var pw = new PrintWriter(System.out); ++ new ClassReader(bytecode).accept(new TraceClassVisitor(pw), 0); ++} ++ ++// check for command line arg (for .class file name) ++if (arguments.length == 0 || !arguments[0].endsWith('.class')) { ++ print("Usage: jjs disassemble -- <.class file>"); ++ exit(1); ++} ++ ++// disassemble the given .class file ++disassemble(readAllBytes(arguments[0])); +--- ./nashorn/samples/engine/README Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/README Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,1 @@ ++Using javax.script engine API of nashorn from script! +--- ./nashorn/samples/engine/accessvar.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/accessvar.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,44 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple example showing global variable access from caller ++ ++var ScriptEngineManager = Java.type("javax.script.ScriptEngineManager"); ++// create manager ++var manager = new ScriptEngineManager(); ++// create engine ++var engine = manager.getEngineByName("js"); ++ ++// eval code! ++engine.eval("x = 'hello'"); ++ ++// access global var from engine ++print(engine.get('x')); +--- ./nashorn/samples/engine/callfunc.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/callfunc.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// simple example showing how to call a global script ++// function from caller ++ ++var ScriptEngineManager = Java.type("javax.script.ScriptEngineManager"); ++// create manager ++var manager = new ScriptEngineManager(); ++// create engine ++var engine = manager.getEngineByName("js"); ++ ++// eval code! ++engine.eval("function func(name) { print('I am func, hello ' + name) }"); ++ ++// invoke functions, methods of code evaluated by engine ++// from javax.script.Invocable interface. But, hey, ++// calling code is JavaScript and don't worry about types :) ++ ++engine.invokeFunction("func", "Nashorn"); +--- ./nashorn/samples/engine/callmethod.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/callmethod.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,64 @@ ++#// Usage: jjs -scripting callmethod.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// simple example demonstrating calling a script object ++// method from script engine user code ++ ++var ScriptEngineManager = Java.type("javax.script.ScriptEngineManager"); ++// create manager ++var manager = new ScriptEngineManager(); ++// create engine ++var engine = manager.getEngineByName("js"); ++ ++// eval code - too many script escapes? ++// use heredoc ! ++engine.eval(<<CODE ++ var obj = { ++ func: function() { ++ print("I am func of " + this); ++ }, ++ ++ toString: function() { ++ return "Object 'obj'"; ++ } ++ }; ++CODE); ++ ++// invoke methods of an object in script world ++// from javax.script.Invocable interface. But, hey, ++// calling code is JavaScript and don't worry about types :) ++ ++// get that script object on which to call a method ++var scriptObj = engine.get("obj"); ++// call 'func' method on object 'obj' ++engine.invokeMethod(scriptObj, "func"); +--- ./nashorn/samples/engine/exposevar.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/exposevar.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,44 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Example showing how to expose a script global var from caller ++ ++var ScriptEngineManager = Java.type("javax.script.ScriptEngineManager"); ++// create manager ++var manager = new ScriptEngineManager(); ++// create engine ++var engine = manager.getEngineByName("js"); ++ ++// expose variable to engine ++engine.put("name", "Nashorn"); ++ ++// access it from script ++engine.eval("print('Hello, ' + name)"); +--- ./nashorn/samples/engine/foreignobject.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/foreignobject.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,71 @@ ++#// Usage: jjs -scripting foreignobject.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// cross nashorn engine scripting ++// access script objects from other engines in natural syntax ++ ++var ScriptEngineManager = Java.type("javax.script.ScriptEngineManager"); ++// create manager ++var manager = new ScriptEngineManager(); ++// create engine ++var engine = manager.getEngineByName("js"); ++ ++// eval code! ++engine.eval(<<CODE ++ var obj = { ++ foo: 42, ++ func: function() { ++ print("func: " + this.foo); ++ } ++ }; ++CODE); ++ ++// Nashorn engine returns script objects as instance of ++// the class jdk.nashorn.api.scripting.ScriptObjectMirror ++// But nashorn's dynalink linker can treat these objects ++// specially to support natural script syntax to access.. ++// In Java code, you need to use ScriptObjectMirror's ++// methods though. Once again, script world is simpler :-) ++ ++var foreignObj = engine.get("obj"); ++// access properties, functions of it ++// with natural syntax ++print(foreignObj.foo); ++foreignObj.func(); ++print(typeof foreignObj.func); ++ ++// access engine's global ++var foreignGlobal = engine.eval("this"); ++// create objects in engine's world from here! ++print(new foreignGlobal.Object()); ++print(new foreignGlobal.Date()); +--- ./nashorn/samples/engine/hello.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/hello.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple hello world example showing create engine ++// and eval simple script ++ ++var ScriptEngineManager = Java.type("javax.script.ScriptEngineManager"); ++// create manager ++var manager = new ScriptEngineManager(); ++// create engine ++var engine = manager.getEngineByName("js"); ++// eval code! ++engine.eval("print('hello world')"); +--- ./nashorn/samples/engine/interface.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/interface.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,60 @@ ++#// Usage: jjs -scripting interface.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Example demonstrating how to implement a Java interface ++// whose methods are backed by global script functions ++ ++var ScriptEngineManager = Java.type("javax.script.ScriptEngineManager"); ++// create manager ++var manager = new ScriptEngineManager(); ++// create engine ++var engine = manager.getEngineByName("js"); ++ ++// eval code - too many script escapes? ++// use heredoc ! ++engine.eval(<<CODE ++function run() { ++ print("run global function called"); ++} ++CODE); ++ ++// create Java interface object whose methods are ++// implemented by script functions. This is from ++// javax.script.Invocable. But we are in JS world, ++// don't worry about types :) ++ ++var Runnable = Java.type("java.lang.Runnable"); ++var r = engine.getInterface(Runnable.class); ++print(r.class); ++ ++r.run(); +--- ./nashorn/samples/engine/interface2.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/interface2.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,63 @@ ++#// Usage: jjs -scripting interface2.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple example demonstrating how to implement java interface ++// whose methods are backed by script methods of a script object ++ ++var ScriptEngineManager = Java.type("javax.script.ScriptEngineManager"); ++// create manager ++var manager = new ScriptEngineManager(); ++// create engine ++var engine = manager.getEngineByName("js"); ++ ++// eval code - too many script escapes? ++// use heredoc ! ++engine.eval(<<CODE ++ var obj = { ++ run: function() { ++ print("I am run method of 'obj'"); ++ } ++ }; ++CODE); ++ ++// create Java interface object whose methods are ++// implemented by script methods of a script object ++// This is from javax.script.Invocable. But we are ++// in JS world, don't worry about types :) ++ ++var Runnable = Java.type("java.lang.Runnable"); ++ ++var scriptObj = engine.get("obj"); ++var r = engine.getInterface(scriptObj, Runnable.class); ++print(r.class); ++r.run(); +--- ./nashorn/samples/engine/lambda_as_func.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/engine/lambda_as_func.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,49 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple example demonstrating how to expose 'function's ++// from embedding code. Any lambda object exposed to engine ++// can be called as 'function' in script. ++ ++var ScriptEngineManager = Java.type("javax.script.ScriptEngineManager"); ++// create manager ++var manager = new ScriptEngineManager(); ++// create engine ++var engine = manager.getEngineByName("js"); ++ ++// Any lambda (@FunctionalInterface annotated type) object can be ++// be exposed from script embedding code. Script can call ++// it as a function ++engine.put("upper", new java.util.function.Function() { ++ apply: function(x) x.toUpperCase() ++}); ++ ++print(engine.eval("upper('hello')")); +--- ./nashorn/samples/env.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/env.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,43 @@ ++#// Usage: jjs -scripting env.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// In nashorn -scripting mode, ++// "$ENV" object exposes process ++// environment variables ++ ++print($ENV.PATH); ++print($ENV.JAVA_HOME); ++ ++for (i in $ENV) { ++ print(i, "->", $ENV[i]); ++} +--- ./nashorn/samples/expression_closure.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/expression_closure.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// nashorn supports expression closures extension of ++// Mozilla JavaScript 1.8. See also ++// https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/1.8 ++ ++// leave {, } and 'return' keyword ++ ++function sqr(x) x*x; ++ ++// prints 289 (= 17*17) ++print(sqr(17)); +--- ./nashorn/samples/filebrowser.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/filebrowser.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,100 @@ ++#// Usage: jjs -fx filebrowser.js -- <start_dir> ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Uses -fx and javafx TreeView to visualize directories ++if (!$OPTIONS._fx) { ++ print("Usage: jjs -fx filebrowser.js -- <start_dir>"); ++ exit(1); ++} ++ ++// Java classes used ++var File = Java.type("java.io.File"); ++var Files = Java.type("java.nio.file.Files"); ++ ++// check directory argument, if passed ++var dir = arguments.length > 0? new File(arguments[0]) : new File("."); ++if (! dir.isDirectory()) { ++ print(dir + " is not a directory!"); ++ exit(2); ++} ++ ++// JavaFX classes used ++var FXCollections = Java.type("javafx.collections.FXCollections"); ++var Scene = Java.type("javafx.scene.Scene"); ++var TreeItem = Java.type("javafx.scene.control.TreeItem"); ++var TreeView = Java.type("javafx.scene.control.TreeView"); ++ ++// create a subclass of JavaFX TreeItem class ++var LazyTreeItem = Java.extend(TreeItem); ++ ++// lazily filling children of a directory LazyTreeItem ++function buildChildren(dir) { ++ var children = FXCollections.observableArrayList(); ++ var stream = Files.list(dir.toPath()); ++ stream.forEach(function(path) { ++ var file = path.toFile(); ++ var item = file.isDirectory()? ++ makeLazyTreeItem(file) : new TreeItem(file.name); ++ children.add(item); ++ }); ++ stream.close(); ++ return children; ++} ++ ++// create an instance LazyTreeItem with override methods ++function makeLazyTreeItem(dir) { ++ var item = new LazyTreeItem(dir.name) { ++ expanded: false, ++ isLeaf: function() false, ++ getChildren: function() { ++ if (! this.expanded) { ++ // call super class (TreeItem) method ++ Java.super(item).getChildren().setAll(buildChildren(dir)); ++ this.expanded = true; ++ } ++ // call super class (TreeItem) method ++ return Java.super(item).getChildren(); ++ } ++ } ++ return item; ++} ++ ++// JavaFX start method ++function start(stage) { ++ stage.title = dir.absolutePath; ++ var rootItem = makeLazyTreeItem(dir); ++ rootItem.expanded = true; ++ var tree = new TreeView(rootItem); ++ stage.scene = new Scene(tree, 300, 450); ++ stage.show(); ++} +--- ./nashorn/samples/fileline.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/fileline.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// nashorn supports pseudo global variables __FILE__ ++// and __LINE__ that expands to currently executed ++// script file name and current script line number ++ ++// prints current file and line number ++print("executing " + __FILE__ + " @ " + __LINE__); +--- ./nashorn/samples/fizzbuzz.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/fizzbuzz.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// What is FizzBuzz? http://c2.com/cgi/wiki?FizzBuzzTest ++ ++// Yet another FizzBuzz impl. using Java 8 lambda and stream ++// but using Nashorn. This is ECMAScript port of @stuartmarks' ++// Java implementation ++ ++var IntStream = Java.type("java.util.stream.IntStream"); ++ ++function ifmod(m, r, f) { ++ return function(i) { return i % m == 0? r : f(i); } ++} ++ ++// pass script function for lambda ++IntStream.rangeClosed(1, 100). ++ mapToObj( ++ ifmod(15, "FizzBuzz", ifmod(5, "Buzz", ifmod(3, "Fizz", String)))) ++ .forEach(print); +--- ./nashorn/samples/for_each.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/for_each.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,66 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// nashorn supports for..each extension supported ++// by Mozilla. See also ++// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for_each...in ++ ++var strs = [ "hello", "world" ]; ++for each (str in strs) ++ print(str); ++ ++// create a java int[] object ++var JArray = Java.type("int[]"); ++var arr = new JArray(10); ++ ++// store squares as values ++for (i in arr) ++ arr[i] = i*i; ++ ++// for .. each on java arrays ++print("squares"); ++for each (i in arr) ++ print(i); ++ ++var System = Java.type("java.lang.System"); ++ ++// for..each on java Iterables ++// print System properties as name = value pairs ++print("System properties"); ++for each (p in System.properties.entrySet()) { ++ print(p.key, "=", p.value); ++} ++ ++// print process environment vars as name = value pairs ++print("Process environment"); ++for each (e in System.env.entrySet()) { ++ print(e.key, "=", e.value); ++} +--- ./nashorn/samples/gaussian_random.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/gaussian_random.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,46 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// print 100 Guassian distributed numbers ++ ++var Random = Java.type("java.util.Random"); ++var DoubleStream = Java.type("java.util.stream.DoubleStream"); ++ ++var r = new Random(); ++ ++// expression closure (see expression_closure.js as well) ++// passed as lambda double generator. "print" passed as ++// double consumer lambda to 'forEach' method. ++ ++DoubleStream ++ .generate(function() r.nextGaussian()) ++ .limit(100) ++ .forEach(print); +--- ./nashorn/samples/gaussian_random_bind.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/gaussian_random_bind.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// print 100 Guassian distributed numbers ++ ++var Random = Java.type("java.util.Random"); ++var DoubleStream = Java.type("java.util.stream.DoubleStream"); ++ ++// function as lambda double generator. "print" passed as ++// double consumer lambda to 'forEach' method. ++// Function.prototype.bind used to attach 'state' for the ++// generator function. ++ ++DoubleStream ++ .generate( ++ function(r) { ++ return r.nextGaussian() ++ }.bind(this, new Random())) ++ .limit(100) ++ .forEach(print); +--- ./nashorn/samples/gutenberg.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/gutenberg.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,142 @@ ++#// Usage: jjs -scripting gutenberg.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple example that demonstrates reading XML Rss feed ++// to generate a HTML file from script and show it by browser ++ ++// Java classes used ++var Characters = Java.type("javax.xml.stream.events.Characters"); ++var Factory = Java.type("javax.xml.stream.XMLInputFactory"); ++var File = Java.type("java.io.File"); ++var FileWriter = Java.type("java.io.FileWriter"); ++var PrintWriter = Java.type("java.io.PrintWriter"); ++var URL = Java.type("java.net.URL"); ++ ++// read Rss feed from a URL. Returns an array ++// of objects having only title and link properties ++function readRssFeed(url) { ++ var fac = Factory.newInstance(); ++ var reader = fac.createXMLEventReader(url.openStream()); ++ ++ // get text content from next event ++ function getChars() { ++ var result = ""; ++ var e = reader.nextEvent(); ++ if (e instanceof Characters) { ++ result = e.getData(); ++ } ++ return result; ++ } ++ ++ var items = []; ++ var title, link; ++ var inItem = false; ++ while (reader.hasNext()) { ++ var evt = reader.nextEvent(); ++ if (evt.isStartElement()) { ++ var local = evt.name.localPart; ++ if (local == "item") { ++ // capture title, description now ++ inItem = true; ++ } ++ ++ if (inItem) { ++ switch (local) { ++ case 'title': ++ title = getChars(); ++ break; ++ case 'link': ++ link = getChars(); ++ break; ++ } ++ } ++ } else if (evt.isEndElement()) { ++ var local = evt.name.localPart; ++ if (local == "item") { ++ // one item done, save it in result array ++ items.push({ title: title, link: link }); ++ inItem = false; ++ } ++ } ++ } ++ ++ return items; ++} ++ ++// generate simple HTML for an RSS feed ++function getBooksHtml() { ++ var url = new URL("http://www.gutenberg.org/cache/epub/feeds/today.rss"); ++ var items = readRssFeed(url); ++ ++ var str = "<ul>"; ++ ++ // Nashorn's string interpolation and heredoc ++ // support is very handy in generating text content ++ // that is filled with elements from runtime objects. ++ // We insert title and link in <li> elements here. ++ for each (i in items) { ++ str += <<EOF ++<li> ++ <a href="${i.link}">${i.title}</a> ++</li> ++EOF ++ } ++ str += "</ul>"; ++ return str; ++} ++ ++// write the string to the given file ++function writeTo(file, str) { ++ var w = new PrintWriter(new FileWriter(file)); ++ try { ++ w.print(str); ++ } finally { ++ w.close(); ++ } ++} ++ ++// generate books HTML ++var str = getBooksHtml(); ++ ++// write to file. __DIR__ is directory where ++// this script is stored. ++var file = new File(__DIR__ + "books.html"); ++writeTo(file, str); ++ ++// show it by desktop browser ++try { ++ var Desktop = Java.type("java.awt.Desktop"); ++ Desktop.desktop.browse(file.toURI()); ++} catch (e) { ++ print(e); ++} +--- ./nashorn/samples/heredoc.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/heredoc.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,51 @@ ++#// Usage: jjs -scripting heredoc.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Nashorn supports Shell script like here-documents ++// in -scripting mode. Here-docs are multi-line strings ++// that are possibly interpolated with ${} expressions ++// See also http://en.wikipedia.org/wiki/Here_document ++ ++var sender = "Buffy the Vampire Slayer"; ++var recipient = "Spike"; ++ ++print(<<END ++ ++Dear ${recipient}, ++ ++I wish you to leave Sunnydale and never return. ++ ++Not Quite Love, ++${sender} ++ ++END); +--- ./nashorn/samples/interface_impl.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/interface_impl.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// nashorn supports Java interface implementation ++// by script using anonymous class-like syntax ++ ++var Runnable = Java.type("java.lang.Runnable"); ++var Thread = Java.type("java.lang.Thread"); ++// use anonymous class-like new syntax ++var r = new Runnable() { ++ run: function() { ++ print("I am a runnable " + Thread.currentThread()); ++ } ++} ++ ++r.run(); ++ ++var t = new Thread(r); ++t.start(); ++t.join(); +--- ./nashorn/samples/javaastviewer.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/javaastviewer.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,202 @@ ++#// Usage: jjs -fx javaastviewer.js -- <.java files> ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// This example demonstrates Java subclassing by Java.extend ++// and javac Compiler and Tree API. This example also uses ++// -fx and javafx TreeView to visualize Java AST as TreeView ++ ++if (!$OPTIONS._fx || arguments.length == 0) { ++ print("Usage: jjs -fx javaastviewer.js -- <.java files>"); ++ exit(1); ++} ++ ++// Java types used ++var Enum = Java.type("java.lang.Enum"); ++var HashSet = Java.type("java.util.HashSet"); ++var Name = Java.type("javax.lang.model.element.Name"); ++var List = Java.type("java.util.List"); ++var Set = Java.type("java.util.Set"); ++var SimpleTreeVisitor = Java.type("com.sun.source.util.SimpleTreeVisitor"); ++var StringArray = Java.type("java.lang.String[]"); ++var ToolProvider = Java.type("javax.tools.ToolProvider"); ++var Tree = Java.type("com.sun.source.tree.Tree"); ++ ++function javaASTToScriptObject(args) { ++ // properties ignored (javac implementation class properties) in AST view. ++ // may not be exhaustive - any getAbc would become "abc" property or ++ // public field becomes a property of same name. ++ var ignoredProps = new HashSet(); ++ for each (var word in ++ ['extending', 'implementing', 'init', 'mods', 'clazz', 'defs', ++ 'expr', 'tag', 'preferredPosition', 'qualid', 'recvparam', ++ 'restype', 'params', 'startPosition', 'thrown', ++ 'tree', 'typarams', 'typetag', 'vartype']) { ++ ignoredProps.add(word); ++ } ++ ++ // get the system compiler tool ++ var compiler = ToolProvider.systemJavaCompiler; ++ ++ // get standard file manager ++ var fileMgr = compiler.getStandardFileManager(null, null, null); ++ ++ // make a list of compilation unit from command line argument file names ++ // Using Java.to convert script array (arguments) to a Java String[] ++ var compUnits = fileMgr.getJavaFileObjects(Java.to(args, StringArray)); ++ ++ // create a new compilation task ++ var task = compiler.getTask(null, fileMgr, null, null, null, compUnits); ++ ++ // subclass SimpleTreeVisitor - converts Java AST node to ++ // a simple script object by walking through it ++ var ConverterVisitor = Java.extend(SimpleTreeVisitor); ++ ++ var visitor = new ConverterVisitor() { ++ // convert java AST node to a friendly script object ++ // which can be viewed. Every node ends up in defaultAction ++ // method of SimpleTreeVisitor method. ++ ++ defaultAction: function (node, p) { ++ var resultObj = {}; ++ // Nashorn does not iterate properties and methods of Java objects ++ // But, we can bind properties of any object (including java objects) ++ // to a script object and iterate it! ++ var obj = {}; ++ Object.bindProperties(obj, node); ++ ++ // we don't want every property, method of java object ++ for (var prop in obj) { ++ var val = obj[prop]; ++ var type = typeof val; ++ // ignore 'method' members ++ if (type == 'function' || type == 'undefined') { ++ continue; ++ } ++ ++ // ignore properties from Javac implementation ++ // classes - hack by name!! ++ if (ignoredProps.contains(prop)) { ++ continue; ++ } ++ ++ // subtree - recurse it ++ if (val instanceof Tree) { ++ resultObj[prop] = visitor.visit(val, p); ++ } else if (val instanceof List) { ++ // List of trees - recurse each and make an array ++ var len = val.size(); ++ if (len != 0) { ++ var arr = []; ++ for (var j = 0; j < len; j++) { ++ var e = val[j]; ++ if (e instanceof Tree) { ++ arr.push(visitor.visit(e, p)); ++ } ++ } ++ resultObj[prop] = arr; ++ } ++ } else if (val instanceof Set) { ++ // Set - used for modifier flags ++ // make array ++ var len = val.size(); ++ if (len != 0) { ++ var arr = []; ++ for each (var e in val) { ++ if (e instanceof Enum || typeof e == 'string') { ++ arr.push(e.toString()); ++ } ++ } ++ resultObj[prop] = arr; ++ } ++ } else if (val instanceof Enum || val instanceof Name) { ++ // make string for any Enum or Name ++ resultObj[prop] = val.toString(); ++ } else if (type != 'object') { ++ // primitives 'as is' ++ resultObj[prop] = val; ++ } ++ } ++ return resultObj; ++ } ++ } ++ ++ // top level object with one property for each compilation unit ++ var scriptObj = {}; ++ for each (var cu in task.parse()) { ++ scriptObj[cu.sourceFile.name] = cu.accept(visitor, null); ++ } ++ ++ return scriptObj; ++} ++ ++// JavaFX classes used ++var StackPane = Java.type("javafx.scene.layout.StackPane"); ++var Scene = Java.type("javafx.scene.Scene"); ++var TreeItem = Java.type("javafx.scene.control.TreeItem"); ++var TreeView = Java.type("javafx.scene.control.TreeView"); ++ ++// Create a javafx TreeItem to view a script object ++function treeItemForObject(obj, name) { ++ var item = new TreeItem(name); ++ for (var prop in obj) { ++ var node = obj[prop]; ++ if (typeof node == 'object') { ++ if (node == null) { ++ // skip nulls ++ continue; ++ } ++ var subitem = treeItemForObject(node, prop); ++ } else { ++ var subitem = new TreeItem(prop + ": " + node); ++ } ++ item.children.add(subitem); ++ } ++ ++ item.expanded = true; ++ return item; ++} ++ ++var commandArgs = arguments; ++ ++// JavaFX start method ++function start(stage) { ++ var obj = javaASTToScriptObject(commandArgs); ++ stage.title = "Java AST Viewer" ++ var rootItem = treeItemForObject(obj, "AST"); ++ rootItem.expanded = true; ++ var tree = new TreeView(rootItem); ++ var root = new StackPane(); ++ root.children.add(tree); ++ stage.scene = new Scene(root, 300, 450); ++ stage.show(); ++} +--- ./nashorn/samples/javacastcounter.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/javacastcounter.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,107 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Usage: jjs javacastcounter.js -- <.java files> ++ ++// This example demonstrates Nashorn Java.extend API ++// to subclass a Java class from script. ++ ++// This example uses Javac Compiler and Tree API ++// to list type casts used in java source files. ++ ++if (arguments.length == 0) { ++ print("Usage: jjs javacastcounter.js -- <.java files>"); ++ exit(1); ++} ++ ++// Java types used ++var ToolProvider = Java.type("javax.tools.ToolProvider"); ++var TreeScanner = Java.type("com.sun.source.util.TreeScanner"); ++var Trees = Java.type("com.sun.source.util.Trees"); ++var StringArray = Java.type("java.lang.String[]"); ++ ++// get the system compiler tool ++var compiler = ToolProvider.systemJavaCompiler; ++ ++// get standard file manager ++var fileMgr = compiler.getStandardFileManager(null, null, null); ++ ++// make a list of compilation unit from command line argument file names ++// Using Java.to convert script array (arguments) to a Java String[] ++var compUnits = fileMgr.getJavaFileObjects(Java.to(arguments, StringArray)); ++ ++// create a new compilation task ++var task = compiler.getTask(null, fileMgr, null, null, null, compUnits); ++ ++// SourcePositions object to get positions of AST nodes ++var sourcePositions = Trees.instance(task).sourcePositions; ++ ++// Subclass TreeScanner class ++var CastCounter = Java.extend(TreeScanner); ++ ++var counter = new CastCounter() { ++ // current CompilationUnitTree ++ compUnit: null, ++ // current LineMap (pos -> line, column) ++ lineMap: null, ++ // current compilation unit's file name ++ fileName: null, ++ ++ // overrides of TreeScanner methods ++ ++ visitCompilationUnit: function(node, p) { ++ // capture info about current Compilation unit ++ this.compUnit = node; ++ this.lineMap = node.lineMap; ++ this.fileName = node.sourceFile.name; ++ ++ // Using Java.super API to call super class method here ++ return Java.super(counter).visitCompilationUnit(node, p); ++ }, ++ ++ visitTypeCast: function(node, p) { ++ // print information on this type cast node ++ var pos = sourcePositions.getStartPosition(this.compUnit, node); ++ var line = this.lineMap.getLineNumber(pos); ++ var col = this.lineMap.getColumnNumber(pos); ++ print(node + " @ " + this.fileName + ":" + line + ":" + col); ++ ++ // count one more type cast ++ return 1; ++ }, ++ ++ reduce: function(r1, r2) { ++ return (r1 == null ? 0 : r1) + (r2 == null ? 0 : r2); ++ } ++}; ++ ++// print total number of type cast nodes seen ++print("Total casts:", counter.scan(task.parse(), null)); +--- ./nashorn/samples/javaimporter.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/javaimporter.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// JavaImporter along with 'with' statement helps in ++// localized Java class references ++ ++function readTextFromURL(url) { ++ ++ // equivalent to ++ // ++ // import java.io.*; ++ // import java.net.*; ++ // import java.lang.StringBuffer; ++ // ++ // only inside the 'with' statement ++ with (new JavaImporter(java.io, ++ java.net, ++ java.lang.StringBuilder)) { ++ var buf = new StringBuilder(); ++ var u = new URL(url); ++ var reader = new BufferedReader( ++ new InputStreamReader(u.openStream())); ++ var line = null; ++ try { ++ while ((line = reader.readLine()) != null) ++ buf.append(line).append('\n'); ++ } finally { ++ reader.close(); ++ } ++ ++ return buf.toString(); ++ } ++} ++ ++print(readTextFromURL("https://twitter.com/")); +--- ./nashorn/samples/javalist.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/javalist.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Java List elements accessed/modified via ++// array element access/update syntax ++ ++var ArrayList = Java.type("java.util.ArrayList"); ++var list = new ArrayList(); ++ ++// add elements to list by List's add method calls ++list.add("js"); ++list.add("ecmascript"); ++list.add("nashorn"); ++ ++// get by List's get(int) method ++print(list[0]); ++print(list[1]); ++print(list[2]); ++ ++// access list elements by indexed access as well ++print(list[0]); ++print(list[1]); ++print(list[2]); ++ ++// assign to list elements by index as well ++list[0] = list[0].toUpperCase(); ++list[1] = list[1].toUpperCase(); ++list[2] = list[2].toUpperCase(); ++ ++print(list.get(0)); ++print(list.get(1)); ++print(list.get(2)); ++print(list[0]); ++print(list[1]); ++print(list[2]); +--- ./nashorn/samples/javamap.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/javamap.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Java Map keys as properties ++ ++// Demonstrating Java Map key/value can be accessed ++// as property/value from script. ++ ++var HashMap = Java.type("java.util.HashMap"); ++var map = new HashMap(); ++ ++// map key-value access by java get/put method calls ++map.put('js', 'nashorn'); ++print(map.get('js')); ++ ++// access keys of map as properties ++print(map['js']); ++print(map.js); ++ ++// also assign new key-value pair ++// as 'property-value' ++map['language'] = 'java'; ++print(map.get("language")); ++print(map.language); ++print(map['language']); ++ ++map.answer = 42; ++print(map.get("answer")); ++print(map.answer); ++print(map['answer']); +--- ./nashorn/samples/javashell.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/javashell.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,146 @@ ++#// Usage: jjs -scripting javashell.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple Java "shell" with which you can try out ++// your few liner Java code leaving imports, main etc. ++// And you can leave even compilation as this script ++// takes care boilerplate+compile step for you. ++ ++// Java types used ++var Arrays = Java.type("java.util.Arrays"); ++var BufferedReader = Java.type("java.io.BufferedReader"); ++var FileWriter = Java.type("java.io.FileWriter"); ++var LocalDateTime = Java.type("java.time.LocalDateTime"); ++var InputStreamReader = Java.type("java.io.InputStreamReader"); ++var PrintWriter = Java.type("java.io.PrintWriter"); ++var ProcessBuilder = Java.type("java.lang.ProcessBuilder"); ++var System = Java.type("java.lang.System"); ++ ++// read multiple lines of input from stdin till user ++// enters an empty line ++function input(endMarker, prompt) { ++ if (!endMarker) { ++ endMarker = ""; ++ } ++ ++ if (!prompt) { ++ prompt = " >> "; ++ } ++ ++ var str = ""; ++ var reader = new BufferedReader(new InputStreamReader(System.in)); ++ var line; ++ while (true) { ++ System.out.print(prompt); ++ line = reader.readLine(); ++ if (line == null || line == endMarker) { ++ break; ++ } ++ str += line + "\n"; ++ } ++ return str; ++} ++ ++// write the string to the given file ++function writeTo(file, str) { ++ var w = new PrintWriter(new FileWriter(file)); ++ try { ++ w.print(str); ++ } finally { ++ w.close(); ++ } ++} ++ ++// generate Java code with user's input ++// put inside generated main method ++function generate(className) { ++ var usercode = input(); ++ if (usercode == "") { ++ return false; ++ } ++ ++ var fullcode = <<EOF ++// userful imports, add more here if you want ++// more imports. ++import static java.lang.System.*; ++import java.io.*; ++import java.net.*; ++import java.math.*; ++import java.nio.file.*; ++import java.time.*; ++import java.time.chrono.*; ++import java.time.format.*; ++import java.time.temporal.*; ++import java.time.zone.*; ++import java.util.*; ++import java.util.concurrent.*; ++import java.util.function.*; ++import java.util.stream.*; ++ ++public class ${className} { ++ public static void main(String[] args) throws Exception { ++ ${usercode} ++ } ++} ++EOF ++ ++ writeTo("${className}.java", fullcode); ++ return true; ++} ++ ++// execute code command ++function exec(args) { ++ // build child process and start it! ++ new ProcessBuilder(Arrays.asList(args.split(' '))) ++ .inheritIO() ++ .start() ++ .waitFor(); ++} ++ ++// generate unique name ++function uniqueName() { ++ var now = LocalDateTime.now().toString(); ++ // replace unsafe chars with '_' ++ return "JavaShell" + now.replace(/-|:|\./g, '_'); ++} ++ ++// read-compile-run loop ++while(true) { ++ var className = uniqueName(); ++ if (generate(className)) { ++ exec("javac ${className}.java"); ++ exec("java ${className}"); ++ } else { ++ break; ++ } ++} +--- ./nashorn/samples/jsadapter_dom.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/jsadapter_dom.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,189 @@ ++#// Usage: jjs -scripting jsadapter_dom.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple example that demonstrates reading XML Rss feed ++// to generate a HTML file from script and show it by browser ++// Uses XML DOM parser and DOM element wrapped by script ++// "proxy" (JSAdapter constructor) ++ ++// Java classes used ++var DocBuilderFac = Java.type("javax.xml.parsers.DocumentBuilderFactory"); ++var Node = Java.type("org.w3c.dom.Node"); ++var File = Java.type("java.io.File"); ++var FileWriter = Java.type("java.io.FileWriter"); ++var PrintWriter = Java.type("java.io.PrintWriter"); ++ ++// constants from Node class ++var ELEMENT_NODE = Node.ELEMENT_NODE; ++var TEXT_NODE = Node.TEXT_NODE; ++ ++// parse XML from uri and return Document ++function parseXML(uri) { ++ var docBuilder = DocBuilderFac.newInstance().newDocumentBuilder(); ++ return docBuilder["parse(java.lang.String)"](uri); ++} ++ ++// get child Elements of given name of the parent element given ++function getChildElements(elem, name) { ++ var nodeList = elem.childNodes; ++ var childElems = []; ++ var len = nodeList.length; ++ for (var i = 0; i < len; i++) { ++ var node = nodeList.item(i); ++ if (node.nodeType == ELEMENT_NODE && ++ node.tagName == name) { ++ childElems.push(wrapElement(node)); ++ } ++ } ++ ++ return childElems; ++} ++ ++// get concatenated child text content of an Element ++function getElemText(elem) { ++ var nodeList = elem.childNodes; ++ var len = nodeList.length; ++ var text = ''; ++ for (var i = 0; i < len; i++) { ++ var node = nodeList.item(i); ++ if (node.nodeType == TEXT_NODE) { ++ text += node.nodeValue; ++ } ++ } ++ ++ return text; ++} ++ ++// Wrap DOM Element object as a convenient script object ++// using JSAdapter. JSAdapter is like java.lang.reflect.Proxy ++// in that it allows property access, method calls be trapped ++// by 'magic' methods like __get__, __call__. ++function wrapElement(elem) { ++ if (! elem) { ++ return elem; ++ } ++ return new JSAdapter() { ++ // getter to expose child elements and attributes by name ++ __get__: function(name) { ++ if (typeof name == 'string') { ++ if (name.startsWith('@')) { ++ var attr = elem.getAttributeNode(name.substring(1)); ++ return !attr? undefined : attr.value; ++ } ++ ++ var arr = getChildElements(elem, name); ++ if (arr.length == 1) { ++ // single child element, expose as single element ++ return arr[0]; ++ } else { ++ // multiple children of given name, expose as array ++ return arr; ++ } ++ } ++ return undefined; ++ }, ++ ++ __call__: function(name) { ++ // toString override to get text content of this Element ++ if (name == 'toString' || name == 'valueOf') { ++ return getElemText(elem); ++ } ++ return undefined; ++ } ++ } ++} ++ ++// generate HTML using here-doc and string interpolation ++function getBooksHtml() { ++ var doc = parseXML("http://www.gutenberg.org/cache/epub/feeds/today.rss"); ++ // wrap document root Element as script convenient object ++ var rss = wrapElement(doc.documentElement); ++ print("rss file version " + rss['@version']); ++ ++ var str = <<HEAD ++ ++<html> ++<title>${rss.channel.title} ++ ++

    ${rss.channel.description}

    ++

    ++Published on ${rss.channel.pubDate} ++

    ++ ++HEAD ++ ++ var items = rss.channel.item; ++ for each (var i in items) { ++ str += < ++
    ${i.title}
    ++
    ${i.description}
    ++ ++ ++LIST ++ } ++ str += < ++ ++ ++END ++ return str; ++} ++ ++// write the string to the given file ++function writeTo(file, str) { ++ var w = new PrintWriter(new FileWriter(file)); ++ try { ++ w.print(str); ++ } finally { ++ w.close(); ++ } ++} ++ ++// generate books HTML ++var str = getBooksHtml(); ++ ++// write to file. __DIR__ is directory where ++// this script is stored. ++var file = new File(__DIR__ + "books.html"); ++writeTo(file, str); ++ ++// show it by desktop browser ++try { ++ var Desktop = Java.type("java.awt.Desktop"); ++ Desktop.desktop.browse(file.toURI()); ++} catch (e) { ++ print(e); ++} +--- ./nashorn/samples/jsobject.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/jsobject.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,75 @@ ++#// Usage: jjs -scripting -cp . jsobject.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// This sample demonstrats how to expose a ++// script friendly object from your java code ++// by implementing jdk.nashorn.api.scripting.JSObject ++ ++// compile the java program ++`javac BufferArray.java`; ++ ++// print error, if any and exit ++if ($ERR != '') { ++ print($ERR); ++ exit($EXIT); ++} ++ ++// create BufferArray ++var BufferArray = Java.type("BufferArray"); ++var bb = new BufferArray(10); ++ ++// 'magic' methods called to retrieve set/get ++// properties on BufferArray instance ++var len = bb.length; ++print("bb.length = " + len) ++for (var i = 0; i < len; i++) { ++ bb[i] = i*i; ++} ++ ++for (var i = 0; i < len; i++) { ++ print(bb[i]); ++} ++ ++// get underlying buffer by calling a method ++// on BufferArray magic object ++ ++// 'buf' is a function member ++print(typeof bb.buf); ++var buf = bb.buf(); ++ ++// use retrieved underlying nio buffer ++var cap = buf.capacity(); ++print("buf.capacity() = " + cap); ++for (var i = 0; i < cap; i++) { ++ print(buf.get(i)); ++} +--- ./nashorn/samples/jsobject_mapreduce.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/jsobject_mapreduce.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,62 @@ ++#// Usage: jjs -scripting -cp . jsobject_mapreduce.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Many Array.prototype functions such as map, ++// filter, reduce, reduceRight, every, some are generic. ++// These functions accept ECMAScript array as well as ++// many array-like objects including JSObjects. ++// See also http://en.wikipedia.org/wiki/MapReduce ++ ++`javac BufferArray.java`; ++ ++var BufferArray = Java.type("BufferArray"); ++var buf = new BufferArray(10); ++ ++var map = Array.prototype.map; ++var filter = Array.prototype.filter; ++var reduce = Array.prototype.reduce; ++ ++// make random list of numbers ++for (var i = 0; i < 10; i++) ++ buf[i] = Math.random(); ++ ++var forEach = Array.prototype.forEach; ++// print numbers in the list ++forEach.call(buf, function(x) print(x)); ++ ++// print sum of squares of the random numbers ++print("Square sum:", ++ reduce.call( ++ map.call(buf, function(x) x*x), ++ function(x, y) x + y) ++); +--- ./nashorn/samples/jsonviewer.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/jsonviewer.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,120 @@ ++#// Usage: jjs -fx jsonviewer.js ++// or ++// jjs -fx jsonviewer.js -- ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++if (! $OPTIONS._fx) { ++ print("Usage: jjs -fx jsonviewer.js -- "); ++ exit(1); ++} ++ ++// This example downloads a JSON file from a URL and ++// shows the same as a JavaFX tree view. ++ ++// Using JavaFX from Nashorn. See also: ++// http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/javafx.html ++ ++// JavaFX classes used ++var StackPane = Java.type("javafx.scene.layout.StackPane"); ++var Scene = Java.type("javafx.scene.Scene"); ++var TreeItem = Java.type("javafx.scene.control.TreeItem"); ++var TreeView = Java.type("javafx.scene.control.TreeView"); ++ ++// read text content of a URL ++function readTextFromURL(url) { ++ // equivalent to ++ // ++ // import java.io.*; ++ // import java.net.*; ++ // import java.lang.StringBuffer; ++ // ++ // only inside the 'with' statement ++ with (new JavaImporter(java.io, ++ java.net, ++ java.lang.StringBuilder)) { ++ var buf = new StringBuilder(); ++ var u = new URL(url); ++ var reader = new BufferedReader( ++ new InputStreamReader(u.openStream())); ++ var line = null; ++ try { ++ while ((line = reader.readLine()) != null) ++ buf.append(line).append('\n'); ++ } finally { ++ reader.close(); ++ } ++ ++ return buf.toString(); ++ } ++} ++ ++// Create a javafx TreeItem to view a script object ++function treeItemForObject(obj, name) { ++ var item = new TreeItem(name); ++ for (var prop in obj) { ++ var node = obj[prop]; ++ if (typeof node == 'object') { ++ if (node == null) { ++ // skip nulls ++ continue; ++ } ++ ++ if (Array.isArray(node) && node.length == 0) { ++ // skip empty arrays ++ continue; ++ } ++ ++ var subitem = treeItemForObject(node, prop); ++ } else { ++ var subitem = new TreeItem(prop + ": " + node); ++ } ++ item.children.add(subitem); ++ } ++ return item; ++} ++ ++var DEFAULT_URL = "http://api.openweathermap.org/data/2.5/forecast/daily?q=Chennai&mode=json&units=metric&cnt=7`"; ++ ++var url = arguments.length == 0? DEFAULT_URL : arguments[0]; ++var obj = JSON.parse(readTextFromURL(url)); ++ ++// JavaFX start method ++function start(stage) { ++ stage.title = "JSON Viewer"; ++ var rootItem = treeItemForObject(obj, url); ++ var tree = new TreeView(rootItem); ++ var root = new StackPane(); ++ root.children.add(tree); ++ stage.scene = new Scene(root, 300, 450); ++ stage.show(); ++} +--- ./nashorn/samples/letter.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/samples/letter.js Wed Jul 30 03:55:26 2014 -0700 +@@ -1,3 +1,5 @@ ++#// Usage: jjs -scripting letter.js -- ++ + /* + * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * +--- ./nashorn/samples/list_mapreduce.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/list_mapreduce.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,86 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Usage: jjs list_mapreduce.js ++ ++// Many Array.prototype functions such as map, ++// filter, reduce, reduceRight, every, some are generic. ++// These functions accept ECMAScript array as well as ++// many array-like objects including java.util.ArrayLists. ++// So, you can do map/filter/reduce with Java streams or ++// you can also use Array.prototype functions as below. ++// See also http://en.wikipedia.org/wiki/MapReduce ++ ++var ArrayList = Java.type("java.util.ArrayList"); ++var list = new ArrayList(); ++list.add("nashorn"); ++list.add("ecmascript"); ++list.add("javascript"); ++list.add("js"); ++list.add("scheme"); ++ ++var map = Array.prototype.map; ++var filter = Array.prototype.filter; ++var reduce = Array.prototype.reduce; ++ ++// sum of word lengths ++print("Sum word length:", ++ reduce.call( ++ map.call(list, function(x) x.length), ++ function(x, y) x + y) ++); ++ ++// filter use to filter out "j*" and concatenate rest with ":" ++// after uppercasing all strings ++print( ++ reduce.call( ++ map.call( ++ filter.call(list, function(x) !x.startsWith("j")), ++ function(x) x.toUpperCase()), ++ function(x, y) x + ":" + y) ++); ++ ++// another list example involving numbers ++list.clear(); ++// make random list of numbers ++for (var i = 0; i < 10; i++) ++ list.add(Math.random()); ++ ++var forEach = Array.prototype.forEach; ++// print numbers in the list ++forEach.call(list, function(x) print(x)); ++ ++// print sum of squares of the random numbers ++print("Square sum:", ++ reduce.call( ++ map.call(list, function(x) x*x), ++ function(x, y) x + y) ++); +--- ./nashorn/samples/locales.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/locales.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple program that lists available locals. This is ECMAScript ++// port of Java example by @brunoborges ++ ++// Java classes used ++var Arrays = Java.type("java.util.Arrays"); ++var Collectors = Java.type("java.util.stream.Collectors"); ++var JString = Java.type("java.lang.String"); ++var Locale = Java.type("java.util.Locale"); ++ ++var formatStr = "Country : %s \t\t\t\t:\t Country Code : %s"; ++ ++// Nashorn allows script functions to be passed ++// whereever Java8 lambdas are expected. ++ ++// Nashorn also supports "expression closures" supported by ++// Mozilla JavaScript 1.8 version. See also ++// https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/1.8 ++ ++// The following prints locales in (country) display name order ++var list = Arrays.asList(Locale.getISOCountries()) ++ .stream() ++ .map(function(x) new Locale("", x)) ++ .sorted(function(c0, c1) c0.displayCountry.compareTo(c1.displayCountry)) ++ .map(function(l) JString.format(formatStr, l.displayCountry, l.country)) ++ .collect(Collectors.toList()); ++ ++list.forEach(print); +--- ./nashorn/samples/logisticmap.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/logisticmap.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,82 @@ ++#// Usage: jjs -fx -scripting logisticmap.js -- ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Logistic map viewer using Java8 Streams and JavaFX ++// See also http://en.wikipedia.org/wiki/Logistic_map ++ ++if (!$OPTIONS._fx || arguments.length < 2) { ++ print("Usage: jjs -fx -scripting logisticmap.js -- "); ++ exit(1); ++} ++ ++// parameters for the logistic map ++var x = parseFloat(arguments[0]); ++var R = parseFloat(arguments[1]); ++var NUM_POINTS = arguments.length > 2? parseFloat(arguments[2]) : 20; ++ ++// Java classes used ++var DoubleStream = Java.type('java.util.stream.DoubleStream'); ++var LineChart = Java.type("javafx.scene.chart.LineChart"); ++var NumberAxis = Java.type("javafx.scene.chart.NumberAxis"); ++var Scene = Java.type("javafx.scene.Scene"); ++var Stage = Java.type("javafx.stage.Stage"); ++var XYChart = Java.type("javafx.scene.chart.XYChart"); ++ ++function start(stage) { ++ stage.title = "Logistic Map: initial x = ${x}, R = ${R}"; ++ // make chart ++ var xAxis = new NumberAxis(); ++ var yAxis = new NumberAxis(); ++ var lineChart = new LineChart(xAxis, yAxis); ++ xAxis.setLabel("iteration"); ++ yAxis.setLabel("x"); ++ // make chart data series ++ var series = new XYChart.Series(); ++ var data = series.data; ++ // populate data using logistic iteration ++ var i = 0; ++ DoubleStream ++ .generate(function() x = R*x*(1-x)) ++ .limit(NUM_POINTS) ++ .forEach( ++ function(value) { ++ data.add(new XYChart.Data(i, value)); ++ i++; ++ } ++ ); ++ // add to stage ++ var scene = new Scene(lineChart, 800, 600); ++ lineChart.data.add(series); ++ stage.scene = scene; ++ stage.show(); ++} +--- ./nashorn/samples/options.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/options.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,37 @@ ++#// Usage: jjs -scripting options.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// print all option names and values ++for (i in $OPTIONS) { ++ print(i, '=', $OPTIONS[i]); ++} +--- ./nashorn/samples/readLine.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/readLine.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,38 @@ ++#// Usage: jjs -scripting greeting.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// readLine prints prompt and reads user response ++var name = readLine("Your name please: "); ++ ++// user name is interpolated within string ++print("Hello ${name}"); +--- ./nashorn/samples/sam_function.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/sam_function.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,51 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// nashorn supports passing script functions whenever ++// a SAM (single abstract method) type object is expected ++ ++var System = Java.type("java.lang.System"); ++var Timer = Java.type("java.util.Timer"); ++var timer = new Timer(); ++ ++// schedule method accepts java.util.TimerTask ++// which is a single-abstract-method type. you ++// can pass a script function and nashorn will ++// wrap it as SAM implementor. ++ ++timer.schedule(function() { ++ print("Hello World!"); ++}, 1000); ++ ++// wait for timer thread to print by ++// reading from stdin. ++print("press any key to exit after message from timer..."); ++System.in.read(); +--- ./nashorn/samples/shell.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/samples/shell.js Wed Jul 30 03:55:26 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 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 +@@ -29,50 +29,53 @@ + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +-/** +- * This is a simple shell tool in JavaScript. ++// Usage: jjs shell.js ++ ++/* This is a simple shell tool in JavaScript. + * + * Runs any operating system command using Java "exec". When "eval" command is + * used, evaluates argument(s) as JavaScript code. + */ + +-var imports = new JavaImporter(java.io, java.lang, java.util); ++(function() { ++ // Java classes used ++ var Arrays = Java.type("java.util.Arrays"); ++ var BufferedReader = Java.type("java.io.BufferedReader"); ++ var InputStreamReader = Java.type("java.io.InputStreamReader"); ++ var ProcessBuilder = Java.type("java.lang.ProcessBuilder"); ++ var System = Java.type("java.lang.System"); + +-function prompt() { +- java.lang.System.out.print(">"); +-} ++ // print prompt ++ function prompt() { ++ System.out.print("> "); ++ } + +-with (imports) { +- var reader = new BufferedReader(new InputStreamReader(System["in"])); +- var line = null; ++ var reader = new BufferedReader(new InputStreamReader(System.in)); + prompt(); +- while ((line = reader.readLine()) != null) { +- if (line != "") { +- var args = line.split(" "); ++ // read and evaluate each line from stdin ++ reader.lines().forEach(function(line) { ++ if (! line.isEmpty()) { ++ var args = line.split(' '); + try { +- if (args[0] == "eval") { +- var code = line.substring("eval".length); ++ // special 'eval' command to evaluate JS code ++ if (args[0] == 'eval') { ++ var code = line.substring('eval'.length); + var res = eval(code); + if (res != undefined) { + print(res); + } + } else { +- var argList = new ArrayList(); +- for (i in args) { argList.add(args[i]); } +- var procBuilder = new ProcessBuilder(argList); +- procBuilder.redirectErrorStream(); +- var proc = procBuilder.start(); +- var out = new BufferedReader(new InputStreamReader(proc.getInputStream())); +- var line = null; +- while ((line = out.readLine()) != null) { +- System.out.println(line); +- } +- proc.waitFor(); ++ // build child process and start it! ++ new ProcessBuilder(Arrays.asList(args)) ++ .inheritIO() ++ .start() ++ .waitFor(); + } + } catch (e) { ++ // print exception, if any + print(e); + } + } + prompt(); +- } +-} ++ }) ++})() +--- ./nashorn/samples/stack.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/stack.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// nashorn supports 'stack' property on ECMAScript ++// error objects. This property's value is a string ++// that shows script stack trace. ++ ++function g() { ++ throw new Error("wrong"); ++} ++ ++function f() { ++ g(); ++} ++ ++// Output looks something like: ++// ++// Error: wrong ++// at g (stack.js:37) ++// at f (stack.js:41) ++// at (stack.js:52) ++ ++try { ++ f(); ++} catch (e) { ++ print(e.stack); ++} +--- ./nashorn/samples/test.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/samples/test.js Wed Jul 30 03:55:26 2014 -0700 +@@ -30,4 +30,3 @@ + */ + + print("Hello World"); +- +--- ./nashorn/samples/uniform_random.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/uniform_random.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,49 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// generate/print 100 uniformly distributed random values ++// and print summary statistics on it ++ ++var DoubleStream = Java.type("java.util.stream.DoubleStream"); ++ ++// pass script function when a lambda is required ++// Math.random passed here for double generator lambda ++// print passed to forEach method ++ ++DoubleStream ++ .generate(Math.random) ++ .limit(100) ++ .forEach(print); ++ ++print(DoubleStream ++ .generate(Math.random) ++ .limit(100) ++ .summaryStatistics()); +--- ./nashorn/samples/uniq.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/samples/uniq.js Wed Jul 30 03:55:26 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 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 +@@ -29,27 +29,28 @@ + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +-/** +- * Prints unique lines from a given file. +- */ ++// Usage: jjs uniq.js ++// or: jjs uniq.js -- + +-if (arguments.length != 1) { +- print("Usage: jjs uniq.js -- "); +- java.lang.System.exit(1); ++// omit repeated lines and print unique lines ++ ++var BufferedReader = Java.type("java.io.BufferedReader"); ++var FileReader = Java.type("java.io.FileReader"); ++var InputStreamReader = Java.type("java.io.InputStreamReader"); ++var System = Java.type("java.lang.System"); ++ ++// use object as set - but insertion order preserved ++var uniqueLines = {}; ++var reader = arguments.length > 0 ? ++ new FileReader(arguments[0]) : ++ new InputStreamReader(System.in); ++reader = new BufferedReader(reader); ++ ++// add unique lines ++reader.lines().forEach(function(line) { ++ uniqueLines[line] = true; ++}) ++ ++for (line in uniqueLines) { ++ print(line); + } +- +-var imports = new JavaImporter(java.io); +- +-var uniqueLines = {}; +-with (imports) { +- var reader = new BufferedReader(new FileReader(arguments[0])); +- while ((line = reader.readLine()) != null) { +- // using a JS object as a map... +- uniqueLines[line] = true; +- } +-} +- +-// now print the collected lines +-for (i in uniqueLines) { +- print(i); +-} +--- ./nashorn/samples/uniqs.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/uniqs.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Usage: jjs uniqs.js -- ++// omit repeated lines and print unique lines ++// But this version uses Stream API ++ ++if (arguments.length < 1) { ++ print("Usage: jjs uniqs.js -- "); ++ exit(1); ++} ++ ++var Files = Java.type("java.nio.file.Files"); ++var FileSystems = Java.type("java.nio.file.FileSystems"); ++print('Unique lines:', ++ Files ++ .lines(FileSystems.default.getPath(arguments[0])) ++ .distinct() ++ .peek(print) ++ .count()); +--- ./nashorn/samples/weather.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/weather.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,63 @@ ++#// usage: jjs -scripting weather.js ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++// Simple nashorn example showing back-quote exec process, ++// JSON and Java8 streams ++ ++var Arrays = Java.type("java.util.Arrays"); ++ ++// use curl to download JSON weather data from the net ++// use backquote -scripting mode syntax to exec a process ++ ++`curl http://api.openweathermap.org/data/2.5/forecast/daily?q=Chennai&mode=json&units=metric&cnt=7`; ++ ++// parse JSON ++var weather = JSON.parse($OUT); ++ ++// pull out humidity as array ++var humidity = weather.list.map(function(curVal) { ++ return curVal.humidity; ++}) ++ ++// Stream API to print stat ++print("Humidity"); ++print(Arrays["stream(int[])"](humidity).summaryStatistics()); ++ ++// pull maximum day time temperature ++var temp = weather.list.map(function(curVal) { ++ return curVal.temp.max; ++}); ++ ++// Stream API to print stat ++print("Max Temperature"); ++print(Arrays["stream(double[])"](temp).summaryStatistics()); +--- ./nashorn/samples/word_histogram.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/samples/word_histogram.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,53 @@ ++#nashorn word histogram of a file ++ ++/* ++ * Copyright (c) 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 ++ * 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 Oracle 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. ++ */ ++ ++/* ++ * This example demonstrates how to print word histogram ++ * of a given text file using regex, array and JSON ++ * functions. ++ */ ++ ++if (arguments.length < 1) { ++ print("Usage: jjs -scripting word_histogram.js -- "); ++ exit(1); ++} ++ ++var obj = {}; ++ ++readFully(arguments[0]). ++ split(/[^\w+]/). ++ forEach(function(x) ++ (x in obj? obj[x]++ : obj[x] = 1)); ++ ++print(JSON.stringify(obj)); ++ +--- ./nashorn/src/jdk/internal/dynalink/beans/BeanLinker.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/internal/dynalink/beans/BeanLinker.java Wed Jul 30 03:55:26 2014 -0700 +@@ -113,6 +113,8 @@ + // explicit property is beneficial for them. + // REVISIT: is it maybe a code smell that "dyn:getLength" is not needed? + setPropertyGetter("length", GET_ARRAY_LENGTH, ValidationType.IS_ARRAY); ++ } else if(List.class.isAssignableFrom(clazz)) { ++ setPropertyGetter("length", GET_COLLECTION_LENGTH, ValidationType.INSTANCE_OF); + } + } + +--- ./nashorn/src/jdk/nashorn/api/scripting/NashornException.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/api/scripting/NashornException.java Wed Jul 30 03:55:26 2014 -0700 +@@ -29,6 +29,7 @@ + import java.util.List; + import jdk.nashorn.internal.codegen.CompilerConstants; + import jdk.nashorn.internal.runtime.ECMAErrors; ++import jdk.nashorn.internal.runtime.ScriptObject; + + /** + * This is base exception for all Nashorn exceptions. These originate from +@@ -44,11 +45,13 @@ + @SuppressWarnings("serial") + public abstract class NashornException extends RuntimeException { + // script file name +- private final String fileName; ++ private String fileName; + // script line number +- private final int line; ++ private int line; + // script column number +- private final int column; ++ private int column; ++ // underlying ECMA error object - lazily initialized ++ private Object ecmaError; + + /** script source name used for "engine.js" */ + public static final String ENGINE_SCRIPT_SOURCE_NAME = "nashorn:engine/resources/engine.js"; +@@ -122,6 +125,15 @@ + } + + /** ++ * Set the source file name for this {@code NashornException} ++ * ++ * @param fileName the file name ++ */ ++ public final void setFileName(final String fileName) { ++ this.fileName = fileName; ++ } ++ ++ /** + * Get the line number for this {@code NashornException} + * + * @return the line number +@@ -131,15 +143,33 @@ + } + + /** ++ * Set the line number for this {@code NashornException} ++ * ++ * @param line the line number ++ */ ++ public final void setLineNumber(final int line) { ++ this.line = line; ++ } ++ ++ /** + * Get the column for this {@code NashornException} + * +- * @return the column ++ * @return the column number + */ + public final int getColumnNumber() { + return column; + } + + /** ++ * Set the column for this {@code NashornException} ++ * ++ * @param column the column number ++ */ ++ public final void setColumnNumber(final int column) { ++ this.column = column; ++ } ++ ++ /** + * Returns array javascript stack frames from the given exception object. + * + * @param exception exception from which stack frames are retrieved and filtered +@@ -155,6 +185,11 @@ + if (methodName.equals(CompilerConstants.RUN_SCRIPT.symbolName())) { + methodName = ""; + } ++ ++ if (methodName.contains(CompilerConstants.ANON_FUNCTION_PREFIX.symbolName())) { ++ methodName = ""; ++ } ++ + filtered.add(new StackTraceElement(className, methodName, + st.getFileName(), st.getLineNumber())); + } +@@ -188,4 +223,43 @@ + } + return buf.toString(); + } ++ ++ protected Object getThrown() { ++ return null; ++ } ++ ++ protected NashornException initEcmaError(final ScriptObject global) { ++ if (ecmaError != null) { ++ return this; // initialized already! ++ } ++ ++ final Object thrown = getThrown(); ++ if (thrown instanceof ScriptObject) { ++ setEcmaError(ScriptObjectMirror.wrap(thrown, global)); ++ } else { ++ setEcmaError(thrown); ++ } ++ ++ return this; ++ } ++ ++ /** ++ * Return the underlying ECMA error object, if available. ++ * ++ * @return underlying ECMA Error object's mirror or whatever was thrown ++ * from script such as a String, Number or a Boolean. ++ */ ++ public Object getEcmaError() { ++ return ecmaError; ++ } ++ ++ /** ++ * Return the underlying ECMA error object, if available. ++ * ++ * @param ecmaError underlying ECMA Error object's mirror or whatever was thrown ++ * from script such as a String, Number or a Boolean. ++ */ ++ public void setEcmaError(final Object ecmaError) { ++ this.ecmaError = ecmaError; ++ } + } +--- ./nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Wed Jul 30 03:55:26 2014 -0700 +@@ -27,16 +27,14 @@ + + import static jdk.nashorn.internal.runtime.ECMAErrors.referenceError; + import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; ++import static jdk.nashorn.internal.runtime.Source.sourceFor; + + import java.io.IOException; +-import java.io.InputStream; +-import java.io.InputStreamReader; + import java.io.Reader; + import java.lang.invoke.MethodHandles; + import java.lang.reflect.Method; + import java.lang.reflect.Modifier; + import java.net.URL; +-import java.nio.charset.Charset; + import java.security.AccessControlContext; + import java.security.AccessController; + import java.security.Permissions; +@@ -57,9 +55,9 @@ + import javax.script.ScriptEngineFactory; + import javax.script.ScriptException; + import javax.script.SimpleBindings; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.runtime.Context; + import jdk.nashorn.internal.runtime.ErrorManager; +-import jdk.nashorn.internal.runtime.GlobalObject; + import jdk.nashorn.internal.runtime.Property; + import jdk.nashorn.internal.runtime.ScriptFunction; + import jdk.nashorn.internal.runtime.ScriptObject; +@@ -99,7 +97,7 @@ + private final boolean _global_per_engine; + // This is the initial default Nashorn global object. + // This is used as "shared" global if above option is true. +- private final ScriptObject global; ++ private final Global global; + // initialized bit late to be made 'final'. + // Property object for "context" property of global object. + private volatile Property contextProperty; +@@ -124,21 +122,21 @@ + } + } + +- // load engine.js and return content as a char[] ++ // load engine.js + @SuppressWarnings("resource") +- private static char[] loadEngineJSSource() { ++ private static Source loadEngineJSSource() { + final String script = "resources/engine.js"; + try { +- final InputStream is = AccessController.doPrivileged( +- new PrivilegedExceptionAction() { ++ return AccessController.doPrivileged( ++ new PrivilegedExceptionAction() { + @Override +- public InputStream run() throws Exception { ++ public Source run() throws IOException { + final URL url = NashornScriptEngine.class.getResource(script); +- return url.openStream(); ++ return sourceFor(NashornException.ENGINE_SCRIPT_SOURCE_NAME, url); + } +- }); +- return Source.readFully(new InputStreamReader(is)); +- } catch (final PrivilegedActionException | IOException e) { ++ } ++ ); ++ } catch (final PrivilegedActionException e) { + if (Context.DEBUG) { + e.printStackTrace(); + } +@@ -147,7 +145,7 @@ + } + + // Source object for engine.js +- private static final Source ENGINE_SCRIPT_SRC = new Source(NashornException.ENGINE_SCRIPT_SOURCE_NAME, loadEngineJSSource()); ++ private static final Source ENGINE_SCRIPT_SRC = loadEngineJSSource(); + + NashornScriptEngine(final NashornScriptEngineFactory factory, final ClassLoader appLoader) { + this(factory, DEFAULT_OPTIONS, appLoader); +@@ -264,7 +262,7 @@ + public Object __noSuchProperty__(final Object self, final ScriptContext ctxt, final String name) { + if (ctxt != null) { + final int scope = ctxt.getAttributesScope(name); +- final ScriptObject ctxtGlobal = getNashornGlobalFrom(ctxt); ++ final Global ctxtGlobal = getNashornGlobalFrom(ctxt); + if (scope != -1) { + return ScriptObjectMirror.unwrap(ctxt.getAttribute(name, scope), ctxtGlobal); + } +@@ -282,19 +280,14 @@ + + private static Source makeSource(final Reader reader, final ScriptContext ctxt) throws ScriptException { + try { +- if (reader instanceof URLReader) { +- final URL url = ((URLReader)reader).getURL(); +- final Charset cs = ((URLReader)reader).getCharset(); +- return new Source(url.toString(), url, cs); +- } +- return new Source(getScriptName(ctxt), Source.readFully(reader)); +- } catch (final IOException e) { ++ return sourceFor(getScriptName(ctxt), reader); ++ } catch (IOException e) { + throw new ScriptException(e); + } + } + + private static Source makeSource(final String src, final ScriptContext ctxt) { +- return new Source(getScriptName(ctxt), src); ++ return sourceFor(getScriptName(ctxt), src); + } + + private static String getScriptName(final ScriptContext ctxt) { +@@ -317,7 +310,7 @@ + } + + ScriptObject realSelf = null; +- ScriptObject realGlobal = null; ++ Global realGlobal = null; + if(thiz == null) { + // making interface out of global functions + realSelf = realGlobal = getNashornGlobalFrom(context); +@@ -346,7 +339,7 @@ + } + + try { +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != realGlobal); + try { + if (globalChanged) { +@@ -371,7 +364,7 @@ + } + + // Retrieve nashorn Global object for a given ScriptContext object +- private ScriptObject getNashornGlobalFrom(final ScriptContext ctxt) { ++ private Global getNashornGlobalFrom(final ScriptContext ctxt) { + if (_global_per_engine) { + // shared single global object for all ENGINE_SCOPE Bindings + return global; +@@ -380,18 +373,18 @@ + final Bindings bindings = ctxt.getBindings(ScriptContext.ENGINE_SCOPE); + // is this Nashorn's own Bindings implementation? + if (bindings instanceof ScriptObjectMirror) { +- final ScriptObject sobj = globalFromMirror((ScriptObjectMirror)bindings); +- if (sobj != null) { +- return sobj; ++ final Global glob = globalFromMirror((ScriptObjectMirror)bindings); ++ if (glob != null) { ++ return glob; + } + } + + // Arbitrary user Bindings implementation. Look for NASHORN_GLOBAL in it! + Object scope = bindings.get(NASHORN_GLOBAL); + if (scope instanceof ScriptObjectMirror) { +- final ScriptObject sobj = globalFromMirror((ScriptObjectMirror)scope); +- if (sobj != null) { +- return sobj; ++ final Global glob = globalFromMirror((ScriptObjectMirror)scope); ++ if (glob != null) { ++ return glob; + } + } + +@@ -399,14 +392,14 @@ + // Create new global instance mirror and associate with the Bindings. + final ScriptObjectMirror mirror = createGlobalMirror(ctxt); + bindings.put(NASHORN_GLOBAL, mirror); +- return mirror.getScriptObject(); ++ return mirror.getHomeGlobal(); + } + + // Retrieve nashorn Global object from a given ScriptObjectMirror +- private ScriptObject globalFromMirror(final ScriptObjectMirror mirror) { ++ private Global globalFromMirror(final ScriptObjectMirror mirror) { + ScriptObject sobj = mirror.getScriptObject(); +- if (sobj instanceof GlobalObject && isOfContext(sobj, nashornContext)) { +- return sobj; ++ if (sobj instanceof Global && isOfContext((Global)sobj, nashornContext)) { ++ return (Global)sobj; + } + + return null; +@@ -414,15 +407,15 @@ + + // Create a new ScriptObjectMirror wrapping a newly created Nashorn Global object + private ScriptObjectMirror createGlobalMirror(final ScriptContext ctxt) { +- final ScriptObject newGlobal = createNashornGlobal(ctxt); ++ final Global newGlobal = createNashornGlobal(ctxt); + return new ScriptObjectMirror(newGlobal, newGlobal); + } + + // Create a new Nashorn Global object +- private ScriptObject createNashornGlobal(final ScriptContext ctxt) { +- final ScriptObject newGlobal = AccessController.doPrivileged(new PrivilegedAction() { ++ private Global createNashornGlobal(final ScriptContext ctxt) { ++ final Global newGlobal = AccessController.doPrivileged(new PrivilegedAction() { + @Override +- public ScriptObject run() { ++ public Global run() { + try { + return nashornContext.newGlobal(); + } catch (final RuntimeException e) { +@@ -460,7 +453,7 @@ + } + + // scripts should see "context" and "engine" as variables in the given global object +- private void setContextVariables(final ScriptObject ctxtGlobal, final ScriptContext ctxt) { ++ private void setContextVariables(final Global ctxtGlobal, final ScriptContext ctxt) { + // set "context" global variable via contextProperty - because this + // property is non-writable + contextProperty.setObjectValue(ctxtGlobal, ctxtGlobal, ctxt, false); +@@ -470,7 +463,7 @@ + } + // if no arguments passed, expose it + if (! (args instanceof ScriptObject)) { +- args = ((GlobalObject)ctxtGlobal).wrapAsObject(args); ++ args = ctxtGlobal.wrapAsObject(args); + ctxtGlobal.set("arguments", args, false); + } + } +@@ -478,16 +471,19 @@ + private Object invokeImpl(final Object selfObject, final String name, final Object... args) throws ScriptException, NoSuchMethodException { + name.getClass(); // null check + ++ Global invokeGlobal = null; + ScriptObjectMirror selfMirror = null; + if (selfObject instanceof ScriptObjectMirror) { + selfMirror = (ScriptObjectMirror)selfObject; + if (! isOfContext(selfMirror.getHomeGlobal(), nashornContext)) { + throw new IllegalArgumentException(getMessage("script.object.from.another.engine")); + } ++ invokeGlobal = selfMirror.getHomeGlobal(); + } else if (selfObject instanceof ScriptObject) { + // invokeMethod called from script code - in which case we may get 'naked' ScriptObject + // Wrap it with oldGlobal to make a ScriptObjectMirror for the same. +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); ++ invokeGlobal = oldGlobal; + if (oldGlobal == null) { + throw new IllegalArgumentException(getMessage("no.current.nashorn.global")); + } +@@ -499,7 +495,8 @@ + selfMirror = (ScriptObjectMirror)ScriptObjectMirror.wrap(selfObject, oldGlobal); + } else if (selfObject == null) { + // selfObject is null => global function call +- final ScriptObject ctxtGlobal = getNashornGlobalFrom(context); ++ final Global ctxtGlobal = getNashornGlobalFrom(context); ++ invokeGlobal = ctxtGlobal; + selfMirror = (ScriptObjectMirror)ScriptObjectMirror.wrap(ctxtGlobal, ctxtGlobal); + } + +@@ -511,7 +508,7 @@ + if (cause instanceof NoSuchMethodException) { + throw (NoSuchMethodException)cause; + } +- throwAsScriptException(e); ++ throwAsScriptException(e, invokeGlobal); + throw new AssertionError("should not reach here"); + } + } +@@ -528,11 +525,36 @@ + return evalImpl(script, ctxt, getNashornGlobalFrom(ctxt)); + } + +- private Object evalImpl(final ScriptFunction script, final ScriptContext ctxt, final ScriptObject ctxtGlobal) throws ScriptException { ++ private Object evalImpl(final Context.MultiGlobalCompiledScript mgcs, final ScriptContext ctxt, final Global ctxtGlobal) throws ScriptException { ++ final Global oldGlobal = Context.getGlobal(); ++ final boolean globalChanged = (oldGlobal != ctxtGlobal); ++ try { ++ if (globalChanged) { ++ Context.setGlobal(ctxtGlobal); ++ } ++ ++ final ScriptFunction script = mgcs.getFunction(ctxtGlobal); ++ ++ // set ScriptContext variables if ctxt is non-null ++ if (ctxt != null) { ++ setContextVariables(ctxtGlobal, ctxt); ++ } ++ return ScriptObjectMirror.translateUndefined(ScriptObjectMirror.wrap(ScriptRuntime.apply(script, ctxtGlobal), ctxtGlobal)); ++ } catch (final Exception e) { ++ throwAsScriptException(e, ctxtGlobal); ++ throw new AssertionError("should not reach here"); ++ } finally { ++ if (globalChanged) { ++ Context.setGlobal(oldGlobal); ++ } ++ } ++ } ++ ++ private Object evalImpl(final ScriptFunction script, final ScriptContext ctxt, final Global ctxtGlobal) throws ScriptException { + if (script == null) { + return null; + } +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != ctxtGlobal); + try { + if (globalChanged) { +@@ -545,7 +567,7 @@ + } + return ScriptObjectMirror.translateUndefined(ScriptObjectMirror.wrap(ScriptRuntime.apply(script, ctxtGlobal), ctxtGlobal)); + } catch (final Exception e) { +- throwAsScriptException(e); ++ throwAsScriptException(e, ctxtGlobal); + throw new AssertionError("should not reach here"); + } finally { + if (globalChanged) { +@@ -554,7 +576,7 @@ + } + } + +- private static void throwAsScriptException(final Exception e) throws ScriptException { ++ private static void throwAsScriptException(final Exception e, final Global global) throws ScriptException { + if (e instanceof ScriptException) { + throw (ScriptException)e; + } else if (e instanceof NashornException) { +@@ -562,6 +584,7 @@ + final ScriptException se = new ScriptException( + ne.getMessage(), ne.getFileName(), + ne.getLineNumber(), ne.getColumnNumber()); ++ ne.initEcmaError(global); + se.initCause(e); + throw se; + } else if (e instanceof RuntimeException) { +@@ -573,18 +596,38 @@ + } + + private CompiledScript asCompiledScript(final Source source) throws ScriptException { +- final ScriptFunction func = compileImpl(source, context); ++ final Context.MultiGlobalCompiledScript mgcs; ++ final ScriptFunction func; ++ final Global oldGlobal = Context.getGlobal(); ++ final Global newGlobal = getNashornGlobalFrom(context); ++ final boolean globalChanged = (oldGlobal != newGlobal); ++ try { ++ if (globalChanged) { ++ Context.setGlobal(newGlobal); ++ } ++ ++ mgcs = nashornContext.compileScript(source); ++ func = mgcs.getFunction(newGlobal); ++ } catch (final Exception e) { ++ throwAsScriptException(e, newGlobal); ++ throw new AssertionError("should not reach here"); ++ } finally { ++ if (globalChanged) { ++ Context.setGlobal(oldGlobal); ++ } ++ } ++ + return new CompiledScript() { + @Override + public Object eval(final ScriptContext ctxt) throws ScriptException { +- final ScriptObject globalObject = getNashornGlobalFrom(ctxt); +- // Are we running the script in the correct global? ++ final Global globalObject = getNashornGlobalFrom(ctxt); ++ // Are we running the script in the same global in which it was compiled? + if (func.getScope() == globalObject) { + return evalImpl(func, ctxt, globalObject); + } +- // ScriptContext with a different global. Compile again! +- // Note that we may still hit per-global compilation cache. +- return evalImpl(compileImpl(source, ctxt), ctxt, globalObject); ++ ++ // different global ++ return evalImpl(mgcs, ctxt, globalObject); + } + @Override + public ScriptEngine getEngine() { +@@ -597,8 +640,8 @@ + return compileImpl(source, getNashornGlobalFrom(ctxt)); + } + +- private ScriptFunction compileImpl(final Source source, final ScriptObject newGlobal) throws ScriptException { +- final ScriptObject oldGlobal = Context.getGlobal(); ++ private ScriptFunction compileImpl(final Source source, final Global newGlobal) throws ScriptException { ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != newGlobal); + try { + if (globalChanged) { +@@ -607,7 +650,7 @@ + + return nashornContext.compileScript(source, newGlobal); + } catch (final Exception e) { +- throwAsScriptException(e); ++ throwAsScriptException(e, newGlobal); + throw new AssertionError("should not reach here"); + } finally { + if (globalChanged) { +@@ -623,6 +666,11 @@ + continue; + } + ++ // skip check for default methods - non-abstract, interface methods ++ if (! Modifier.isAbstract(method.getModifiers())) { ++ continue; ++ } ++ + Object obj = sobj.get(method.getName()); + if (! (obj instanceof ScriptFunction)) { + return false; +@@ -631,8 +679,7 @@ + return true; + } + +- private static boolean isOfContext(final ScriptObject global, final Context context) { +- assert global instanceof GlobalObject: "Not a Global object"; +- return ((GlobalObject)global).isOfContext(context); ++ private static boolean isOfContext(final Global global, final Context context) { ++ return global.isOfContext(context); + } + } +--- ./nashorn/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,6 +25,7 @@ + + package jdk.nashorn.api.scripting; + ++import java.nio.ByteBuffer; + import java.security.AccessControlContext; + import java.security.AccessController; + import java.security.Permissions; +@@ -41,9 +42,10 @@ + import java.util.Set; + import java.util.concurrent.Callable; + import javax.script.Bindings; ++import jdk.nashorn.internal.objects.Global; ++import jdk.nashorn.internal.runtime.arrays.ArrayData; + import jdk.nashorn.internal.runtime.ConsString; + import jdk.nashorn.internal.runtime.Context; +-import jdk.nashorn.internal.runtime.GlobalObject; + import jdk.nashorn.internal.runtime.JSType; + import jdk.nashorn.internal.runtime.ScriptFunction; + import jdk.nashorn.internal.runtime.ScriptObject; +@@ -62,7 +64,7 @@ + private static final AccessControlContext GET_CONTEXT_ACC_CTXT = getContextAccCtxt(); + + private final ScriptObject sobj; +- private final ScriptObject global; ++ private final Global global; + private final boolean strict; + + @Override +@@ -93,7 +95,7 @@ + + @Override + public Object call(final Object thiz, final Object... args) { +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != global); + + try { +@@ -108,6 +110,8 @@ + } + + throw new RuntimeException("not a function: " + toString()); ++ } catch (final NashornException ne) { ++ throw ne.initEcmaError(global); + } catch (final RuntimeException | Error e) { + throw e; + } catch (final Throwable t) { +@@ -121,7 +125,7 @@ + + @Override + public Object newObject(final Object... args) { +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != global); + + try { +@@ -135,6 +139,8 @@ + } + + throw new RuntimeException("not a constructor: " + toString()); ++ } catch (final NashornException ne) { ++ throw ne.initEcmaError(global); + } catch (final RuntimeException | Error e) { + throw e; + } catch (final Throwable t) { +@@ -165,7 +171,7 @@ + + public Object callMember(final String functionName, final Object... args) { + functionName.getClass(); // null check +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != global); + + try { +@@ -182,6 +188,8 @@ + } + + throw new NoSuchMethodException("No such function " + functionName); ++ } catch (final NashornException ne) { ++ throw ne.initEcmaError(global); + } catch (final RuntimeException | Error e) { + throw e; + } catch (final Throwable t) { +@@ -253,6 +261,22 @@ + }); + } + ++ /** ++ * Nashorn extension: setIndexedPropertiesToExternalArrayData. ++ * set indexed properties be exposed from a given nio ByteBuffer. ++ * ++ * @param buf external buffer - should be a nio ByteBuffer ++ */ ++ public void setIndexedPropertiesToExternalArrayData(final ByteBuffer buf) { ++ inGlobal(new Callable() { ++ @Override public Void call() { ++ sobj.setArray(ArrayData.allocate(buf)); ++ return null; ++ } ++ }); ++ } ++ ++ + @Override + public boolean isInstance(final Object obj) { + if (! (obj instanceof ScriptObjectMirror)) { +@@ -472,7 +496,7 @@ + public void setProto(final Object proto) { + inGlobal(new Callable() { + @Override public Void call() { +- sobj.setProtoCheck(unwrap(proto, global)); ++ sobj.setPrototypeOf(unwrap(proto, global)); + return null; + } + }); +@@ -597,6 +621,7 @@ + /** + * Utilitity to convert this script object to the given type. + * ++ * @param destination type to convert to + * @param type destination type to convert to + * @return converted object + */ +@@ -618,7 +643,7 @@ + */ + public static Object wrap(final Object obj, final Object homeGlobal) { + if(obj instanceof ScriptObject) { +- return homeGlobal instanceof ScriptObject ? new ScriptObjectMirror((ScriptObject)obj, (ScriptObject)homeGlobal) : obj; ++ return homeGlobal instanceof Global ? new ScriptObjectMirror((ScriptObject)obj, (Global)homeGlobal) : obj; + } + if(obj instanceof ConsString) { + return obj.toString(); +@@ -686,13 +711,13 @@ + + // package-privates below this. + +- ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) { ++ ScriptObjectMirror(final ScriptObject sobj, final Global global) { + assert sobj != null : "ScriptObjectMirror on null!"; +- assert global instanceof GlobalObject : "global is not a GlobalObject"; ++ assert global != null : "home Global is null"; + + this.sobj = sobj; + this.global = global; +- this.strict = ((GlobalObject)global).isStrictContext(); ++ this.strict = global.isStrictContext(); + } + + // accessors for script engine +@@ -700,7 +725,7 @@ + return sobj; + } + +- ScriptObject getHomeGlobal() { ++ Global getHomeGlobal() { + return global; + } + +@@ -710,13 +735,15 @@ + + // internals only below this. + private V inGlobal(final Callable callable) { +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != global); + if (globalChanged) { + Context.setGlobal(global); + } + try { + return callable.call(); ++ } catch (final NashornException ne) { ++ throw ne.initEcmaError(global); + } catch (final RuntimeException e) { + throw e; + } catch (final Exception e) { +--- ./nashorn/src/jdk/nashorn/api/scripting/package-info.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/api/scripting/package-info.java Wed Jul 30 03:55:26 2014 -0700 +@@ -32,7 +32,8 @@ + * ScriptEngine nashornEngine = new ScriptEngineManager().getEngineByName("Nashorn"); + * + *

    Nashorn script engines implement the optional {@link javax.script.Invocable} and {@link javax.script.Compilable} +- * interfaces, allowing for efficient pre-compilation and repeated execution of scripts. See ++ * interfaces, allowing for efficient pre-compilation and repeated execution of scripts. In addition, ++ * this package provides nashorn specific extension classes, interfaces and methods. See + * {@link jdk.nashorn.api.scripting.NashornScriptEngineFactory} for further details. + */ + package jdk.nashorn.api.scripting; +--- ./nashorn/src/jdk/nashorn/internal/codegen/Attr.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/Attr.java Wed Jul 30 03:55:26 2014 -0700 +@@ -375,10 +375,11 @@ + * @return Symbol for given name or null for redefinition. + */ + private Symbol defineSymbol(final Block block, final String name, final int symbolFlags) { +- int flags = symbolFlags; +- Symbol symbol = findSymbol(block, name); // Locate symbol. ++ int flags = symbolFlags; ++ Symbol symbol = findSymbol(block, name); // Locate symbol. ++ boolean isGlobal = (flags & KINDMASK) == IS_GLOBAL; + +- if ((flags & KINDMASK) == IS_GLOBAL) { ++ if (isGlobal) { + flags |= IS_SCOPE; + } + +@@ -414,6 +415,8 @@ + // Determine where to create it. + if ((flags & Symbol.KINDMASK) == IS_VAR && ((flags & IS_INTERNAL) == IS_INTERNAL || (flags & IS_LET) == IS_LET)) { + symbolBlock = block; //internal vars are always defined in the block closest to them ++ } else if (isGlobal) { ++ symbolBlock = lc.getOutermostFunction().getBody(); + } else { + symbolBlock = lc.getFunctionBody(function); + } +--- ./nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Wed Jul 30 03:55:26 2014 -0700 +@@ -685,7 +685,7 @@ + private void scopeCall(final IdentNode node, final int flags) { + load(node, Type.OBJECT); // Type.OBJECT as foo() makes no sense if foo == 3 + // ScriptFunction will see CALLSITE_SCOPE and will bind scope accordingly. +- method.loadNull(); //the 'this' ++ method.loadUndefined(Type.OBJECT); //the 'this' object + method.dynamicCall(callNodeType, 2 + loadArgs(args), flags); + } + +@@ -818,7 +818,7 @@ + protected boolean enterDefault(final Node node) { + // Load up function. + load(function, Type.OBJECT); //TODO, e.g. booleans can be used as functions +- method.loadNull(); // ScriptFunction will figure out the correct this when it sees CALLSITE_SCOPE ++ method.loadUndefined(Type.OBJECT); // ScriptFunction will figure out the correct this when it sees CALLSITE_SCOPE + method.dynamicCall(callNodeType, 2 + loadArgs(args), getCallSiteFlags() | CALLSITE_SCOPE); + + return false; +@@ -1451,7 +1451,10 @@ + + if (value == null) { + hasGettersSetters = true; +- } else if (key.equals(ScriptObject.PROTO_PROPERTY_NAME)) { ++ } else if (propertyNode.getKey() instanceof IdentNode && ++ key.equals(ScriptObject.PROTO_PROPERTY_NAME)) { ++ // ES6 draft compliant __proto__ inside object literal ++ // Identifier key and name is __proto__ + protoNode = value; + continue; + } +@@ -1497,7 +1500,9 @@ + method.dup(); + if (protoNode != null) { + load(protoNode); +- method.invoke(ScriptObject.SET_PROTO_CHECK); ++ // take care of { __proto__: 34 } or some such! ++ method.convert(Type.OBJECT); ++ method.invoke(ScriptObject.SET_PROTO_FROM_LITERAL); + } else { + globalObjectPrototype(); + method.invoke(ScriptObject.SET_PROTO); +@@ -2023,8 +2028,6 @@ + return false; + } + +- method._new(ECMAException.class).dup(); +- + final Source source = lc.getCurrentFunction().getSource(); + + final Expression expression = throwNode.getExpression(); +@@ -2037,7 +2040,7 @@ + method.load(source.getName()); + method.load(line); + method.load(column); +- method.invoke(ECMAException.THROW_INIT); ++ method.invoke(ECMAException.CREATE); + + method.athrow(); + +@@ -3230,7 +3233,7 @@ + final String className = SCRIPTFUNCTION_IMPL_OBJECT; + final int fieldCount = ObjectClassGenerator.getPaddedFieldCount(functionNode.countThisProperties()); + final String allocatorClassName = Compiler.binaryName(ObjectClassGenerator.getClassName(fieldCount)); +- final PropertyMap allocatorMap = PropertyMap.newMap(null, 0, fieldCount, 0); ++ final PropertyMap allocatorMap = PropertyMap.newMap(null, allocatorClassName, 0, fieldCount, 0); + + method._new(className).dup(); + loadConstant(new RecompilableScriptFunctionData(functionNode, compiler.getCodeInstaller(), allocatorClassName, allocatorMap)); +--- ./nashorn/src/jdk/nashorn/internal/codegen/CodeGeneratorLexicalContext.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/CodeGeneratorLexicalContext.java Wed Jul 30 03:55:26 2014 -0700 +@@ -158,7 +158,7 @@ + if (scopeCalls.containsKey(scopeCall)) { + return scopeCalls.get(scopeCall); + } +- scopeCall.setClassAndName(unit, getCurrentFunction().uniqueName("scopeCall")); ++ scopeCall.setClassAndName(unit, getCurrentFunction().uniqueName(":scopeCall")); + scopeCalls.put(scopeCall, scopeCall); + return scopeCall; + } +@@ -177,7 +177,7 @@ + if (scopeCalls.containsKey(scopeCall)) { + return scopeCalls.get(scopeCall); + } +- scopeCall.setClassAndName(unit, getCurrentFunction().uniqueName("scopeCall")); ++ scopeCall.setClassAndName(unit, getCurrentFunction().uniqueName(":scopeCall")); + scopeCalls.put(scopeCall, scopeCall); + return scopeCall; + } +--- ./nashorn/src/jdk/nashorn/internal/codegen/Compiler.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/Compiler.java Wed Jul 30 03:55:26 2014 -0700 +@@ -85,6 +85,8 @@ + + private Source source; + ++ private String sourceName; ++ + private final Map bytecode; + + private final Set compileUnits; +@@ -267,6 +269,7 @@ + append('$'). + append(safeSourceName(functionNode.getSource())); + this.source = functionNode.getSource(); ++ this.sourceName = functionNode.getSourceName(); + this.scriptName = sb.toString(); + } + +@@ -402,32 +405,8 @@ + return newFunctionNode; + } + +- private Class install(final String className, final byte[] code) { +- LOG.fine("Installing class ", className); +- +- final Class clazz = installer.install(Compiler.binaryName(className), code); +- +- try { +- final Object[] constants = getConstantData().toArray(); +- // Need doPrivileged because these fields are private +- AccessController.doPrivileged(new PrivilegedExceptionAction() { +- @Override +- public Void run() throws Exception { +- //use reflection to write source and constants table to installed classes +- final Field sourceField = clazz.getDeclaredField(SOURCE.symbolName()); +- final Field constantsField = clazz.getDeclaredField(CONSTANTS.symbolName()); +- sourceField.setAccessible(true); +- constantsField.setAccessible(true); +- sourceField.set(null, source); +- constantsField.set(null, constants); +- return null; +- } +- }); +- } catch (final PrivilegedActionException e) { +- throw new RuntimeException(e); +- } +- +- return clazz; ++ private Class install(final String className, final byte[] code, final Object[] constants) { ++ return installer.install(className, code, source, constants); + } + + /** +@@ -441,10 +420,15 @@ + assert functionNode.hasState(CompilationState.EMITTED) : functionNode.getName() + " has no bytecode and cannot be installed"; + + final Map> installedClasses = new HashMap<>(); ++ final Object[] constants = getConstantData().toArray(); + + final String rootClassName = firstCompileUnitName(); + final byte[] rootByteCode = bytecode.get(rootClassName); +- final Class rootClass = install(rootClassName, rootByteCode); ++ final Class rootClass = install(rootClassName, rootByteCode, constants); ++ ++ if (!isLazy()) { ++ installer.storeCompiledScript(source, rootClassName, bytecode, constants); ++ } + + int length = rootByteCode.length; + +@@ -458,7 +442,7 @@ + final byte[] code = entry.getValue(); + length += code.length; + +- installedClasses.put(className, install(className, code)); ++ installedClasses.put(className, install(className, code, constants)); + } + + for (final CompileUnit unit : compileUnits) { +@@ -573,7 +557,7 @@ + } + + private CompileUnit initCompileUnit(final String unitClassName, final long initialWeight) { +- final ClassEmitter classEmitter = new ClassEmitter(env, source.getName(), unitClassName, strict); ++ final ClassEmitter classEmitter = new ClassEmitter(env, sourceName, unitClassName, strict); + final CompileUnit compileUnit = new CompileUnit(unitClassName, classEmitter, initialWeight); + + classEmitter.begin(); +--- ./nashorn/src/jdk/nashorn/internal/codegen/CompilerConstants.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/CompilerConstants.java Wed Jul 30 03:55:26 2014 -0700 +@@ -41,6 +41,7 @@ + */ + + public enum CompilerConstants { ++ + /** the __FILE__ variable */ + __FILE__, + +@@ -75,7 +76,7 @@ + DEFAULT_SCRIPT_NAME("Script"), + + /** function prefix for anonymous functions */ +- FUNCTION_PREFIX("function$"), ++ ANON_FUNCTION_PREFIX("L:"), + + /** method name for Java method that is script entry point */ + RUN_SCRIPT("runScript"), +@@ -149,26 +150,31 @@ + ALLOCATE("allocate"), + + /** prefix for split methods, @see Splitter */ +- SPLIT_PREFIX("$split"), ++ SPLIT_PREFIX(":split"), + + /** prefix for split array method and slot */ +- SPLIT_ARRAY_ARG("split_array", 3), ++ SPLIT_ARRAY_ARG(":split_array", 3), + + /** get string from constant pool */ +- GET_STRING("$getString"), ++ GET_STRING(":getString"), + + /** get map */ +- GET_MAP("$getMap"), ++ GET_MAP(":getMap"), + + /** get map */ +- SET_MAP("$setMap"), ++ SET_MAP(":setMap"), + + /** get array prefix */ +- GET_ARRAY_PREFIX("$get"), ++ GET_ARRAY_PREFIX(":get"), + + /** get array suffix */ + GET_ARRAY_SUFFIX("$array"); + ++ /** ++ * Prefix used for internal methods generated in script clases. ++ */ ++ public static final String INTERNAL_METHOD_PREFIX = ":"; ++ + private final String symbolName; + private final Class type; + private final int slot; +--- ./nashorn/src/jdk/nashorn/internal/codegen/ConstantData.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/ConstantData.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,6 +25,9 @@ + + package jdk.nashorn.internal.codegen; + ++import jdk.nashorn.internal.runtime.Property; ++import jdk.nashorn.internal.runtime.PropertyMap; ++ + import java.util.ArrayList; + import java.util.Arrays; + import java.util.HashMap; +@@ -110,6 +113,43 @@ + } + + /** ++ * {@link PropertyMap} wrapper class that provides implementations for the {@code hashCode} and {@code equals} ++ * methods that are based on the map layout. {@code PropertyMap} itself inherits the identity based implementations ++ * from {@code java.lang.Object}. ++ */ ++ private static class PropertyMapWrapper { ++ private final PropertyMap propertyMap; ++ private final int hashCode; ++ ++ public PropertyMapWrapper(final PropertyMap map) { ++ int hash = 0; ++ for (final Property property : map.getProperties()) { ++ hash = hash << 7 ^ hash >> 7; ++ hash ^= property.hashCode(); ++ } ++ this.hashCode = hash; ++ this.propertyMap = map; ++ } ++ ++ @Override ++ public int hashCode() { ++ return hashCode; ++ } ++ ++ @Override ++ public boolean equals(final Object other) { ++ if (!(other instanceof PropertyMapWrapper)) { ++ return false; ++ } ++ ++ final Property[] ownProperties = propertyMap.getProperties(); ++ final Property[] otherProperties = ((PropertyMapWrapper) other).propertyMap.getProperties(); ++ ++ return Arrays.equals(ownProperties, otherProperties); ++ } ++ } ++ ++ /** + * Constructor + */ + ConstantData() { +@@ -145,7 +185,14 @@ + * @return the index in the constant pool that the object was given + */ + public int add(final Object object) { +- final Object entry = object.getClass().isArray() ? new ArrayWrapper(object) : object; ++ final Object entry; ++ if (object.getClass().isArray()) { ++ entry = new ArrayWrapper(object); ++ } else if (object instanceof PropertyMap) { ++ entry = new PropertyMapWrapper((PropertyMap) object); ++ } else { ++ entry = object; ++ } + final Integer value = objectMap.get(entry); + + if (value != null) { +--- ./nashorn/src/jdk/nashorn/internal/codegen/MapCreator.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/MapCreator.java Wed Jul 30 03:55:26 2014 -0700 +@@ -83,7 +83,7 @@ + } + } + +- return PropertyMap.newMap(properties, fieldCount, fieldMaximum, 0); ++ return PropertyMap.newMap(properties, structure.getName(), fieldCount, fieldMaximum, 0); + } + + PropertyMap makeSpillMap(final boolean hasArguments) { +@@ -100,7 +100,7 @@ + } + } + +- return PropertyMap.newMap(properties, 0, 0, spillIndex); ++ return PropertyMap.newMap(properties, structure.getName(), 0, 0, spillIndex); + } + + /** +--- ./nashorn/src/jdk/nashorn/internal/codegen/MethodEmitter.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/MethodEmitter.java Wed Jul 30 03:55:26 2014 -0700 +@@ -1130,7 +1130,11 @@ + popType(Type.OBJECT); + } + +- method.visitMethodInsn(opcode, className, methodName, methodDescriptor); ++ if (opcode == INVOKEINTERFACE) { ++ method.visitMethodInsn(opcode, className, methodName, methodDescriptor, true); ++ } else { ++ method.visitMethodInsn(opcode, className, methodName, methodDescriptor, false); ++ } + + if (returnType != null) { + pushType(returnType); +--- ./nashorn/src/jdk/nashorn/internal/codegen/SharedScopeCall.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/SharedScopeCall.java Wed Jul 30 03:55:26 2014 -0700 +@@ -156,7 +156,7 @@ + if (isCall) { + method.convert(Type.OBJECT); + // ScriptFunction will see CALLSITE_SCOPE and will bind scope accordingly. +- method.loadNull(); ++ method.loadUndefined(Type.OBJECT); + int slot = 2; + for (final Type type : paramTypes) { + method.load(type, slot++); +--- ./nashorn/src/jdk/nashorn/internal/codegen/types/Type.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/codegen/types/Type.java Wed Jul 30 03:55:26 2014 -0700 +@@ -261,7 +261,7 @@ + } + + static void invokeStatic(final MethodVisitor method, final Call call) { +- method.visitMethodInsn(INVOKESTATIC, call.className(), call.name(), call.descriptor()); ++ method.visitMethodInsn(INVOKESTATIC, call.className(), call.name(), call.descriptor(), false); + } + + /** +--- ./nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/ir/FunctionNode.java Wed Jul 30 03:55:26 2014 -0700 +@@ -29,6 +29,7 @@ + import java.util.EnumSet; + import java.util.HashSet; + import java.util.List; ++import java.util.Objects; + import java.util.Set; + import jdk.nashorn.internal.codegen.CompileUnit; + import jdk.nashorn.internal.codegen.Compiler; +@@ -138,6 +139,9 @@ + /** Function flags. */ + private final int flags; + ++ /** //@ sourceURL or //# sourceURL for program function nodes */ ++ private final String sourceURL; ++ + private final int lineNumber; + + /** Is anonymous function flag. */ +@@ -160,11 +164,11 @@ + public static final int HAS_EVAL = 1 << 5; + + /** Does a nested function contain eval? If it does, then all variables in this function might be get/set by it. */ +- public static final int HAS_NESTED_EVAL = 1 << 6; ++ public static final int HAS_NESTED_EVAL = 1 << 6; + + /** Does this function have any blocks that create a scope? This is used to determine if the function needs to + * have a local variable slot for the scope symbol. */ +- public static final int HAS_SCOPE_BLOCK = 1 << 7; ++ public static final int HAS_SCOPE_BLOCK = 1 << 7; + + /** + * Flag this function as one that defines the identifier "arguments" as a function parameter or nested function +@@ -193,6 +197,9 @@ + /** Can this function be specialized? */ + public static final int CAN_SPECIALIZE = 1 << 14; + ++ /** Does this function use the "this" keyword? */ ++ public static final int USES_THIS = 1 << 15; ++ + /** Does this function or any nested functions contain an eval? */ + private static final int HAS_DEEP_EVAL = HAS_EVAL | HAS_NESTED_EVAL; + +@@ -223,6 +230,7 @@ + * @param parameters parameter list + * @param kind kind of function as in {@link FunctionNode.Kind} + * @param flags initial flags ++ * @param sourceURL sourceURL specified in script (optional) + */ + public FunctionNode( + final Source source, +@@ -235,7 +243,8 @@ + final String name, + final List parameters, + final FunctionNode.Kind kind, +- final int flags) { ++ final int flags, ++ final String sourceURL) { + super(token, finish); + + this.source = source; +@@ -250,6 +259,7 @@ + this.compilationState = EnumSet.of(CompilationState.INITIALIZED); + this.declaredSymbols = new HashSet<>(); + this.flags = flags; ++ this.sourceURL = sourceURL; + this.compileUnit = null; + this.body = null; + this.snapshot = null; +@@ -260,6 +270,7 @@ + final FunctionNode functionNode, + final long lastToken, + final int flags, ++ final String sourceURL, + final String name, + final Type returnType, + final CompileUnit compileUnit, +@@ -271,6 +282,7 @@ + super(functionNode); + this.lineNumber = functionNode.lineNumber; + this.flags = flags; ++ this.sourceURL = sourceURL; + this.name = name; + this.returnType = returnType; + this.compileUnit = compileUnit; +@@ -308,6 +320,38 @@ + } + + /** ++ * get source name - sourceURL or name derived from Source. ++ * ++ * @return name for the script source ++ */ ++ public String getSourceName() { ++ return (sourceURL != null)? sourceURL : source.getName(); ++ } ++ ++ /** ++ * get the sourceURL ++ * @return the sourceURL ++ */ ++ public String getSourceURL() { ++ return sourceURL; ++ } ++ ++ /** ++ * Set the sourceURL ++ * ++ * @param lc lexical context ++ * @param newSourceURL source url string to set ++ * @return function node or a new one if state was changed ++ */ ++ public FunctionNode setSourceURL(final LexicalContext lc, final String newSourceURL) { ++ if (Objects.equals(sourceURL, newSourceURL)) { ++ return this; ++ } ++ ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, newSourceURL, name, returnType, compileUnit, compilationState, body, parameters, null, hints)); ++ } ++ ++ /** + * Returns the line number. + * @return the line number. + */ +@@ -335,7 +379,7 @@ + if (this.snapshot == null) { + return this; + } +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, name, returnType, compileUnit, compilationState, body, parameters, null, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, sourceURL, name, returnType, compileUnit, compilationState, body, parameters, null, hints)); + } + + /** +@@ -351,7 +395,7 @@ + if (isProgram() || parameters.isEmpty()) { + return this; //never specialize anything that won't be recompiled + } +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, name, returnType, compileUnit, compilationState, body, parameters, this, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, sourceURL, name, returnType, compileUnit, compilationState, body, parameters, this, hints)); + } + + /** +@@ -409,7 +453,7 @@ + } + final EnumSet newState = EnumSet.copyOf(this.compilationState); + newState.add(state); +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, name, returnType, compileUnit, newState, body, parameters, snapshot, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, sourceURL, name, returnType, compileUnit, newState, body, parameters, snapshot, hints)); + } + + /** +@@ -430,7 +474,7 @@ + if (this.hints == hints) { + return this; + } +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, sourceURL, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); + } + + /** +@@ -483,7 +527,7 @@ + if (this.flags == flags) { + return this; + } +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, sourceURL, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); + } + + @Override +@@ -550,6 +594,15 @@ + } + + /** ++ * Return {@code true} if this function makes use of the {@code this} object. ++ * ++ * @return true if function uses {@code this} object ++ */ ++ public boolean usesThis() { ++ return getFlag(USES_THIS); ++ } ++ ++ /** + * Get the identifier for this function, this is its symbol. + * @return the identifier as an IdentityNode + */ +@@ -593,7 +646,7 @@ + if(this.body == body) { + return this; + } +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags | (body.needsScope() ? FunctionNode.HAS_SCOPE_BLOCK : 0), name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags | (body.needsScope() ? FunctionNode.HAS_SCOPE_BLOCK : 0), sourceURL, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); + } + + /** +@@ -688,7 +741,7 @@ + if (this.lastToken == lastToken) { + return this; + } +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, sourceURL, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); + } + + /** +@@ -710,7 +763,7 @@ + if (this.name.equals(name)) { + return this; + } +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, sourceURL, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); + } + + /** +@@ -760,7 +813,7 @@ + if (this.parameters == parameters) { + return this; + } +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, sourceURL, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); + } + + /** +@@ -825,6 +878,7 @@ + this, + lastToken, + flags, ++ sourceURL, + name, + type, + compileUnit, +@@ -863,7 +917,7 @@ + if (this.compileUnit == compileUnit) { + return this; + } +- return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); ++ return Node.replaceInLexicalContext(lc, this, new FunctionNode(this, lastToken, flags, sourceURL, name, returnType, compileUnit, compilationState, body, parameters, snapshot, hints)); + } + + /** +--- ./nashorn/src/jdk/nashorn/internal/ir/annotations/Reference.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/ir/annotations/Reference.java Wed Jul 30 03:55:26 2014 -0700 +@@ -32,9 +32,7 @@ + * Reference node in AST, i.e. anything not a copy. Important for + * AST traversal and cloning. Cloning currently as a rule uses + * existingOrSame for references and otherwise existingOrCopy +- *

    + */ +- + @Retention(value=RetentionPolicy.RUNTIME) + public @interface Reference { + // EMPTY +--- ./nashorn/src/jdk/nashorn/internal/ir/debug/JSONWriter.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/ir/debug/JSONWriter.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,6 +25,8 @@ + + package jdk.nashorn.internal.ir.debug; + ++import static jdk.nashorn.internal.runtime.Source.sourceFor; ++ + import java.util.Arrays; + import java.util.List; + import java.util.ArrayList; +@@ -88,7 +90,7 @@ + * @return JSON string representation of AST of the supplied code + */ + public static String parse(final ScriptEnvironment env, final String code, final String name, final boolean includeLoc) { +- final Parser parser = new Parser(env, new Source(name, code), new Context.ThrowErrorManager(), env._strict); ++ final Parser parser = new Parser(env, sourceFor(name, code), new Context.ThrowErrorManager(), env._strict); + final JSONWriter jsonWriter = new JSONWriter(includeLoc); + try { + final FunctionNode functionNode = parser.parse(CompilerConstants.RUN_SCRIPT.symbolName()); +--- ./nashorn/src/jdk/nashorn/internal/objects/AccessorPropertyDescriptor.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/AccessorPropertyDescriptor.java Wed Jul 30 03:55:26 2014 -0700 +@@ -67,12 +67,8 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + AccessorPropertyDescriptor(final boolean configurable, final boolean enumerable, final Object get, final Object set, final Global global) { +- super(global.getObjectPrototype(), global.getAccessorPropertyDescriptorMap()); ++ super(global.getObjectPrototype(), $nasgenmap$); + this.configurable = configurable; + this.enumerable = enumerable; + this.get = get; +@@ -185,6 +181,18 @@ + } + + @Override ++ public boolean hasAndEquals(final PropertyDescriptor otherDesc) { ++ if (! (otherDesc instanceof AccessorPropertyDescriptor)) { ++ return false; ++ } ++ final AccessorPropertyDescriptor other = (AccessorPropertyDescriptor)otherDesc; ++ return (!has(CONFIGURABLE) || sameValue(configurable, other.configurable)) && ++ (!has(ENUMERABLE) || sameValue(enumerable, other.enumerable)) && ++ (!has(GET) || sameValue(get, other.get)) && ++ (!has(SET) || sameValue(set, other.set)); ++ } ++ ++ @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; +--- ./nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/ArrayBufferView.java Wed Jul 30 03:55:26 2014 -0700 +@@ -42,12 +42,8 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + private ArrayBufferView(final NativeArrayBuffer buffer, final int byteOffset, final int elementLength, final Global global) { +- super(global.getArrayBufferViewMap()); ++ super($nasgenmap$); + checkConstructorArgs(buffer, byteOffset, elementLength); + this.setProto(getPrototype(global)); + this.setArray(factory().createArrayData(buffer, byteOffset, elementLength)); +@@ -386,7 +382,7 @@ + return (int) (length & Integer.MAX_VALUE); + } + +- protected static Object subarrayImpl(final Object self, final Object begin0, final Object end0) { ++ protected static ScriptObject subarrayImpl(final Object self, final Object begin0, final Object end0) { + final ArrayBufferView arrayView = ((ArrayBufferView)self); + final int elementLength = arrayView.elementLength(); + final int begin = NativeArrayBuffer.adjustIndex(JSType.toInt32(begin0), elementLength); +--- ./nashorn/src/jdk/nashorn/internal/objects/DataPropertyDescriptor.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/DataPropertyDescriptor.java Wed Jul 30 03:55:26 2014 -0700 +@@ -64,12 +64,8 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + DataPropertyDescriptor(final boolean configurable, final boolean enumerable, final boolean writable, final Object value, final Global global) { +- super(global.getObjectPrototype(), global.getDataPropertyDescriptorMap()); ++ super(global.getObjectPrototype(), $nasgenmap$); + this.configurable = configurable; + this.enumerable = enumerable; + this.writable = writable; +@@ -172,6 +168,19 @@ + } + + @Override ++ public boolean hasAndEquals(final PropertyDescriptor otherDesc) { ++ if (! (otherDesc instanceof DataPropertyDescriptor)) { ++ return false; ++ } ++ ++ final DataPropertyDescriptor other = (DataPropertyDescriptor)otherDesc; ++ return (!has(CONFIGURABLE) || sameValue(configurable, other.configurable)) && ++ (!has(ENUMERABLE) || sameValue(enumerable, other.enumerable)) && ++ (!has(WRITABLE) || sameValue(writable, other.writable)) && ++ (!has(VALUE) || sameValue(value, other.value)); ++ } ++ ++ @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; +--- ./nashorn/src/jdk/nashorn/internal/objects/GenericPropertyDescriptor.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/GenericPropertyDescriptor.java Wed Jul 30 03:55:26 2014 -0700 +@@ -55,12 +55,8 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + GenericPropertyDescriptor(final boolean configurable, final boolean enumerable, final Global global) { +- super(global.getObjectPrototype(), global.getGenericPropertyDescriptorMap()); ++ super(global.getObjectPrototype(), $nasgenmap$); + this.configurable = configurable; + this.enumerable = enumerable; + } +@@ -149,6 +145,23 @@ + } + + @Override ++ public boolean hasAndEquals(final PropertyDescriptor other) { ++ if (has(CONFIGURABLE) && other.has(CONFIGURABLE)) { ++ if (isConfigurable() != other.isConfigurable()) { ++ return false; ++ } ++ } ++ ++ if (has(ENUMERABLE) && other.has(ENUMERABLE)) { ++ if (isEnumerable() != other.isEnumerable()) { ++ return false; ++ } ++ } ++ ++ return true; ++ } ++ ++ @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; +--- ./nashorn/src/jdk/nashorn/internal/objects/Global.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/Global.java Wed Jul 30 03:55:26 2014 -0700 +@@ -33,11 +33,8 @@ + import java.io.PrintWriter; + import java.lang.invoke.MethodHandle; + import java.lang.invoke.MethodHandles; +-import java.lang.ref.ReferenceQueue; +-import java.lang.ref.SoftReference; + import java.lang.reflect.Field; + import java.util.Arrays; +-import java.util.LinkedHashMap; + import java.util.List; + import java.util.Map; + import java.util.concurrent.Callable; +@@ -51,7 +48,6 @@ + import jdk.nashorn.internal.runtime.ConsString; + import jdk.nashorn.internal.runtime.Context; + import jdk.nashorn.internal.runtime.GlobalFunctions; +-import jdk.nashorn.internal.runtime.GlobalObject; + import jdk.nashorn.internal.runtime.JSType; + import jdk.nashorn.internal.runtime.NativeJavaPackage; + import jdk.nashorn.internal.runtime.PropertyDescriptor; +@@ -59,10 +55,10 @@ + import jdk.nashorn.internal.runtime.Scope; + import jdk.nashorn.internal.runtime.ScriptEnvironment; + import jdk.nashorn.internal.runtime.ScriptFunction; ++import jdk.nashorn.internal.runtime.ScriptFunctionData; + import jdk.nashorn.internal.runtime.ScriptObject; + import jdk.nashorn.internal.runtime.ScriptRuntime; + import jdk.nashorn.internal.runtime.ScriptingFunctions; +-import jdk.nashorn.internal.runtime.Source; + import jdk.nashorn.internal.runtime.arrays.ArrayData; + import jdk.nashorn.internal.runtime.linker.Bootstrap; + import jdk.nashorn.internal.runtime.linker.InvokeByName; +@@ -73,7 +69,7 @@ + * Representation of global scope. + */ + @ScriptClass("Global") +-public final class Global extends ScriptObject implements GlobalObject, Scope { ++public final class Global extends ScriptObject implements Scope { + private final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class); + private final InvokeByName VALUE_OF = new InvokeByName("valueOf", ScriptObject.class); + +@@ -229,6 +225,10 @@ + @Property(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE) + public volatile Object arrayBuffer; + ++ /** DataView object */ ++ @Property(name = "DataView", attributes = Attribute.NOT_ENUMERABLE) ++ public volatile Object dataView; ++ + /** TypedArray (int8) */ + @Property(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE) + public volatile Object int8Array; +@@ -355,6 +355,7 @@ + private ScriptObject builtinJavaImporter; + private ScriptObject builtinJavaApi; + private ScriptObject builtinArrayBuffer; ++ private ScriptObject builtinDataView; + private ScriptObject builtinInt8Array; + private ScriptObject builtinUint8Array; + private ScriptObject builtinUint8ClampedArray; +@@ -370,42 +371,9 @@ + */ + private ScriptFunction typeErrorThrower; + +- private PropertyMap accessorPropertyDescriptorMap; +- private PropertyMap arrayBufferViewMap; +- private PropertyMap dataPropertyDescriptorMap; +- private PropertyMap genericPropertyDescriptorMap; +- private PropertyMap nativeArgumentsMap; +- private PropertyMap nativeArrayMap; +- private PropertyMap nativeArrayBufferMap; +- private PropertyMap nativeBooleanMap; +- private PropertyMap nativeDateMap; +- private PropertyMap nativeErrorMap; +- private PropertyMap nativeEvalErrorMap; +- private PropertyMap nativeJSAdapterMap; +- private PropertyMap nativeJavaImporterMap; +- private PropertyMap nativeNumberMap; +- private PropertyMap nativeRangeErrorMap; +- private PropertyMap nativeReferenceErrorMap; +- private PropertyMap nativeRegExpMap; +- private PropertyMap nativeRegExpExecResultMap; +- private PropertyMap nativeStrictArgumentsMap; +- private PropertyMap nativeStringMap; +- private PropertyMap nativeSyntaxErrorMap; +- private PropertyMap nativeTypeErrorMap; +- private PropertyMap nativeURIErrorMap; +- private PropertyMap prototypeObjectMap; +- private PropertyMap objectMap; +- private PropertyMap functionMap; +- private PropertyMap anonymousFunctionMap; +- private PropertyMap strictFunctionMap; +- private PropertyMap boundFunctionMap; +- + // Flag to indicate that a split method issued a return statement + private int splitState = -1; + +- // class cache +- private ClassCache classCache; +- + // Used to store the last RegExp result to support deprecated RegExp constructor properties + private RegExpResult lastRegExpResult; + +@@ -456,11 +424,6 @@ + super(checkAndGetMap(context)); + this.context = context; + this.setIsScope(); +- +- final int cacheSize = context.getEnv()._class_cache_size; +- if (cacheSize > 0) { +- classCache = new ClassCache(cacheSize); +- } + } + + /** +@@ -469,11 +432,9 @@ + * @return the global singleton + */ + public static Global instance() { +- ScriptObject global = Context.getGlobal(); +- if (! (global instanceof Global)) { +- throw new IllegalStateException("no current global instance"); +- } +- return (Global)global; ++ Global global = Context.getGlobal(); ++ global.getClass(); // null check ++ return global; + } + + /** +@@ -494,19 +455,30 @@ + return instance().getContext(); + } + +- // GlobalObject interface implementation ++ // Runtime interface to Global + +- @Override ++ /** ++ * Is this global of the given Context? ++ * @param ctxt the context ++ * @return true if this global belongs to the given Context ++ */ + public boolean isOfContext(final Context ctxt) { + return this.context == ctxt; + } + +- @Override ++ /** ++ * Does this global belong to a strict Context? ++ * @return true if this global belongs to a strict Context ++ */ + public boolean isStrictContext() { + return context.getEnv()._strict; + } + +- @Override ++ /** ++ * Initialize standard builtin objects like "Object", "Array", "Function" etc. ++ * as well as our extension builtin objects like "Java", "JSAdapter" as properties ++ * of the global scope object. ++ */ + public void initBuiltinObjects() { + if (this.builtinObject != null) { + // already initialized, just return +@@ -516,12 +488,26 @@ + init(); + } + +- @Override ++ /** ++ * Create a new ScriptFunction object ++ * ++ * @param name function name ++ * @param handle invocation handle for function ++ * @param scope the scope ++ * @param strict are we in strict mode ++ * ++ * @return new script function ++ */ + public ScriptFunction newScriptFunction(final String name, final MethodHandle handle, final ScriptObject scope, final boolean strict) { +- return new ScriptFunctionImpl(name, handle, scope, null, strict, false, true); ++ return new ScriptFunctionImpl(name, handle, scope, null, strict ? ScriptFunctionData.IS_STRICT_CONSTRUCTOR : ScriptFunctionData.IS_CONSTRUCTOR); + } + +- @Override ++ /** ++ * Wrap a Java object as corresponding script object ++ * ++ * @param obj object to wrap ++ * @return wrapped object ++ */ + public Object wrapAsObject(final Object obj) { + if (obj instanceof Boolean) { + return new NativeBoolean((Boolean)obj, this); +@@ -543,7 +529,14 @@ + } + } + +- @Override ++ /** ++ * Lookup helper for JS primitive types ++ * ++ * @param request the link request for the dynamic call site. ++ * @param self self reference ++ * ++ * @return guarded invocation ++ */ + public GuardedInvocation primitiveLookup(final LinkRequest request, final Object self) { + if (self instanceof String || self instanceof ConsString) { + return NativeString.lookupPrimitive(request, self); +@@ -555,12 +548,23 @@ + throw new IllegalArgumentException("Unsupported primitive: " + self); + } + +- @Override ++ /** ++ * Create a new empty script object ++ * ++ * @return the new ScriptObject ++ */ + public ScriptObject newObject() { +- return new JO(getObjectPrototype(), getObjectMap()); ++ return new JO(getObjectPrototype(), JO.getInitialMap()); + } + +- @Override ++ /** ++ * Default value of given type ++ * ++ * @param sobj script object ++ * @param typeHint type hint ++ * ++ * @return default value ++ */ + public Object getDefaultValue(final ScriptObject sobj, final Class typeHint) { + // When the [[DefaultValue]] internal method of O is called with no hint, + // then it behaves as if the hint were Number, unless O is a Date object +@@ -620,7 +624,12 @@ + return UNDEFINED; + } + +- @Override ++ /** ++ * Is the given ScriptObject an ECMAScript Error object? ++ * ++ * @param sobj the object being checked ++ * @return true if sobj is an Error object ++ */ + public boolean isError(final ScriptObject sobj) { + final ScriptObject errorProto = getErrorPrototype(); + ScriptObject proto = sobj.getProto(); +@@ -633,52 +642,108 @@ + return false; + } + +- @Override ++ /** ++ * Create a new ECMAScript Error object. ++ * ++ * @param msg error message ++ * @return newly created Error object ++ */ + public ScriptObject newError(final String msg) { + return new NativeError(msg, this); + } + +- @Override ++ /** ++ * Create a new ECMAScript EvalError object. ++ * ++ * @param msg error message ++ * @return newly created EvalError object ++ */ + public ScriptObject newEvalError(final String msg) { + return new NativeEvalError(msg, this); + } + +- @Override ++ /** ++ * Create a new ECMAScript RangeError object. ++ * ++ * @param msg error message ++ * @return newly created RangeError object ++ */ + public ScriptObject newRangeError(final String msg) { + return new NativeRangeError(msg, this); + } + +- @Override ++ /** ++ * Create a new ECMAScript ReferenceError object. ++ * ++ * @param msg error message ++ * @return newly created ReferenceError object ++ */ + public ScriptObject newReferenceError(final String msg) { + return new NativeReferenceError(msg, this); + } + +- @Override ++ /** ++ * Create a new ECMAScript SyntaxError object. ++ * ++ * @param msg error message ++ * @return newly created SyntaxError object ++ */ + public ScriptObject newSyntaxError(final String msg) { + return new NativeSyntaxError(msg, this); + } + +- @Override ++ /** ++ * Create a new ECMAScript TypeError object. ++ * ++ * @param msg error message ++ * @return newly created TypeError object ++ */ + public ScriptObject newTypeError(final String msg) { + return new NativeTypeError(msg, this); + } + +- @Override ++ /** ++ * Create a new ECMAScript URIError object. ++ * ++ * @param msg error message ++ * @return newly created URIError object ++ */ + public ScriptObject newURIError(final String msg) { + return new NativeURIError(msg, this); + } + +- @Override ++ /** ++ * Create a new ECMAScript GenericDescriptor object. ++ * ++ * @param configurable is the property configurable? ++ * @param enumerable is the property enumerable? ++ * @return newly created GenericDescriptor object ++ */ + public PropertyDescriptor newGenericDescriptor(final boolean configurable, final boolean enumerable) { + return new GenericPropertyDescriptor(configurable, enumerable, this); + } + +- @Override ++ /** ++ * Create a new ECMAScript DatePropertyDescriptor object. ++ * ++ * @param value of the data property ++ * @param configurable is the property configurable? ++ * @param enumerable is the property enumerable? ++ * @return newly created DataPropertyDescriptor object ++ */ + public PropertyDescriptor newDataDescriptor(final Object value, final boolean configurable, final boolean enumerable, final boolean writable) { + return new DataPropertyDescriptor(configurable, enumerable, writable, value, this); + } + +- @Override ++ /** ++ * Create a new ECMAScript AccessorPropertyDescriptor object. ++ * ++ * @param get getter function of the user accessor property ++ * @param set setter function of the user accessor property ++ * @param configurable is the property configurable? ++ * @param enumerable is the property enumerable? ++ * @return newly created AccessorPropertyDescriptor object ++ */ + public PropertyDescriptor newAccessorDescriptor(final Object get, final Object set, final boolean configurable, final boolean enumerable) { + final AccessorPropertyDescriptor desc = new AccessorPropertyDescriptor(configurable, enumerable, get == null ? UNDEFINED : get, set == null ? UNDEFINED : set, this); + +@@ -694,62 +759,6 @@ + } + + +- /** +- * Cache for compiled script classes. +- */ +- @SuppressWarnings("serial") +- private static class ClassCache extends LinkedHashMap { +- private final int size; +- private final ReferenceQueue> queue; +- +- ClassCache(int size) { +- super(size, 0.75f, true); +- this.size = size; +- this.queue = new ReferenceQueue<>(); +- } +- +- void cache(final Source source, final Class clazz) { +- put(source, new ClassReference(clazz, queue, source)); +- } +- +- @Override +- protected boolean removeEldestEntry(final Map.Entry eldest) { +- return size() > size; +- } +- +- @Override +- public ClassReference get(Object key) { +- for (ClassReference ref; (ref = (ClassReference)queue.poll()) != null; ) { +- remove(ref.source); +- } +- return super.get(key); +- } +- +- } +- +- private static class ClassReference extends SoftReference> { +- private final Source source; +- +- ClassReference(final Class clazz, final ReferenceQueue> queue, final Source source) { +- super(clazz, queue); +- this.source = source; +- } +- } +- +- // Class cache management +- @Override +- public Class findCachedClass(final Source source) { +- assert classCache != null : "Class cache used without being initialized"; +- ClassReference ref = classCache.get(source); +- return ref != null ? ref.get() : null; +- } +- +- @Override +- public void cacheClass(final Source source, final Class clazz) { +- assert classCache != null : "Class cache used without being initialized"; +- classCache.cache(source, clazz); +- } +- + private static T getLazilyCreatedValue(final Object key, final Callable creator, final Map map) { + final T obj = map.get(key); + if (obj != null) { +@@ -767,14 +776,25 @@ + + private final Map namedInvokers = new ConcurrentHashMap<>(); + +- @Override ++ ++ /** ++ * Get cached InvokeByName object for the given key ++ * @param key key to be associated with InvokeByName object ++ * @param creator if InvokeByName is absent 'creator' is called to make one (lazy init) ++ * @return InvokeByName object associated with the key. ++ */ + public InvokeByName getInvokeByName(final Object key, final Callable creator) { + return getLazilyCreatedValue(key, creator, namedInvokers); + } + + private final Map dynamicInvokers = new ConcurrentHashMap<>(); + +- @Override ++ /** ++ * Get cached dynamic method handle for the given key ++ * @param key key to be associated with dynamic method handle ++ * @param creator if method handle is absent 'creator' is called to make one (lazy init) ++ * @return dynamic method handle associated with the key. ++ */ + public MethodHandle getDynamicInvoker(final Object key, final Callable creator) { + return getLazilyCreatedValue(key, creator, dynamicInvokers); + } +@@ -963,6 +983,10 @@ + return ScriptFunction.getPrototype(builtinArrayBuffer); + } + ++ ScriptObject getDataViewPrototype() { ++ return ScriptFunction.getPrototype(builtinDataView); ++ } ++ + ScriptObject getInt8ArrayPrototype() { + return ScriptFunction.getPrototype(builtinInt8Array); + } +@@ -999,123 +1023,6 @@ + return ScriptFunction.getPrototype(builtinFloat64Array); + } + +- // Builtin PropertyMap accessors +- PropertyMap getAccessorPropertyDescriptorMap() { +- return accessorPropertyDescriptorMap; +- } +- +- PropertyMap getArrayBufferViewMap() { +- return arrayBufferViewMap; +- } +- +- PropertyMap getDataPropertyDescriptorMap() { +- return dataPropertyDescriptorMap; +- } +- +- PropertyMap getGenericPropertyDescriptorMap() { +- return genericPropertyDescriptorMap; +- } +- +- PropertyMap getArgumentsMap() { +- return nativeArgumentsMap; +- } +- +- PropertyMap getArrayMap() { +- return nativeArrayMap; +- } +- +- PropertyMap getArrayBufferMap() { +- return nativeArrayBufferMap; +- } +- +- PropertyMap getBooleanMap() { +- return nativeBooleanMap; +- } +- +- PropertyMap getDateMap() { +- return nativeDateMap; +- } +- +- PropertyMap getErrorMap() { +- return nativeErrorMap; +- } +- +- PropertyMap getEvalErrorMap() { +- return nativeEvalErrorMap; +- } +- +- PropertyMap getJSAdapterMap() { +- return nativeJSAdapterMap; +- } +- +- PropertyMap getJavaImporterMap() { +- return nativeJavaImporterMap; +- } +- +- PropertyMap getNumberMap() { +- return nativeNumberMap; +- } +- +- PropertyMap getRangeErrorMap() { +- return nativeRangeErrorMap; +- } +- +- PropertyMap getReferenceErrorMap() { +- return nativeReferenceErrorMap; +- } +- +- PropertyMap getRegExpMap() { +- return nativeRegExpMap; +- } +- +- PropertyMap getRegExpExecResultMap() { +- return nativeRegExpExecResultMap; +- } +- +- PropertyMap getStrictArgumentsMap() { +- return nativeStrictArgumentsMap; +- } +- +- PropertyMap getStringMap() { +- return nativeStringMap; +- } +- +- PropertyMap getSyntaxErrorMap() { +- return nativeSyntaxErrorMap; +- } +- +- PropertyMap getTypeErrorMap() { +- return nativeTypeErrorMap; +- } +- +- PropertyMap getURIErrorMap() { +- return nativeURIErrorMap; +- } +- +- PropertyMap getPrototypeObjectMap() { +- return prototypeObjectMap; +- } +- +- PropertyMap getObjectMap() { +- return objectMap; +- } +- +- PropertyMap getFunctionMap() { +- return functionMap; +- } +- +- PropertyMap getAnonymousFunctionMap() { +- return anonymousFunctionMap; +- } +- +- PropertyMap getStrictFunctionMap() { +- return strictFunctionMap; +- } +- +- PropertyMap getBoundFunctionMap() { +- return boundFunctionMap; +- } +- + private ScriptFunction getBuiltinArray() { + return builtinArray; + } +@@ -1631,14 +1538,11 @@ + + final ScriptEnvironment env = getContext().getEnv(); + +- // duplicate PropertyMaps of Native* classes +- copyInitialMaps(env); +- + // initialize Function and Object constructor + initFunctionAndObject(); + + // Now fix Global's own proto. +- this.setProto(getObjectPrototype()); ++ this.setInitialProto(getObjectPrototype()); + + // initialize global function properties + this.eval = this.builtinEval = ScriptFunctionImpl.makeFunction("eval", EVAL); +@@ -1705,8 +1609,25 @@ + initScripting(env); + } + +- if (Context.DEBUG && System.getSecurityManager() == null) { +- initDebug(); ++ if (Context.DEBUG) { ++ boolean debugOkay; ++ final SecurityManager sm = System.getSecurityManager(); ++ if (sm != null) { ++ try { ++ sm.checkPermission(new RuntimePermission(Context.NASHORN_DEBUG_MODE)); ++ debugOkay = true; ++ } catch (final SecurityException ignored) { ++ // if no permission, don't initialize Debug object ++ debugOkay = false; ++ } ++ ++ } else { ++ debugOkay = true; ++ } ++ ++ if (debugOkay) { ++ initDebug(); ++ } + } + + copyBuiltins(); +@@ -1766,7 +1687,7 @@ + final ScriptObject prototype = ScriptFunction.getPrototype(cons); + prototype.set(NativeError.NAME, name, false); + prototype.set(NativeError.MESSAGE, "", false); +- prototype.setProto(errorProto); ++ prototype.setInitialProto(errorProto); + return (ScriptFunction)cons; + } + +@@ -1834,6 +1755,7 @@ + + private void initTypedArray() { + this.builtinArrayBuffer = initConstructor("ArrayBuffer"); ++ this.builtinDataView = initConstructor("DataView"); + this.builtinInt8Array = initConstructor("Int8Array"); + this.builtinUint8Array = initConstructor("Uint8Array"); + this.builtinUint8ClampedArray = initConstructor("Uint8ClampedArray"); +@@ -1874,6 +1796,7 @@ + this.typeError = this.builtinTypeError; + this.uriError = this.builtinURIError; + this.arrayBuffer = this.builtinArrayBuffer; ++ this.dataView = this.builtinDataView; + this.int8Array = this.builtinInt8Array; + this.uint8Array = this.builtinUint8Array; + this.uint8ClampedArray = this.builtinUint8ClampedArray; +@@ -1938,7 +1861,7 @@ + } + + if (res.getProto() == null) { +- res.setProto(getObjectPrototype()); ++ res.setInitialProto(getObjectPrototype()); + } + + return res; +@@ -1948,46 +1871,6 @@ + } + } + +- private void copyInitialMaps(final ScriptEnvironment env) { +- this.accessorPropertyDescriptorMap = AccessorPropertyDescriptor.getInitialMap().duplicate(); +- this.dataPropertyDescriptorMap = DataPropertyDescriptor.getInitialMap().duplicate(); +- this.genericPropertyDescriptorMap = GenericPropertyDescriptor.getInitialMap().duplicate(); +- this.nativeArgumentsMap = NativeArguments.getInitialMap().duplicate(); +- this.nativeArrayMap = NativeArray.getInitialMap().duplicate(); +- this.nativeBooleanMap = NativeBoolean.getInitialMap().duplicate(); +- this.nativeDateMap = NativeDate.getInitialMap().duplicate(); +- this.nativeErrorMap = NativeError.getInitialMap().duplicate(); +- this.nativeEvalErrorMap = NativeEvalError.getInitialMap().duplicate(); +- this.nativeJSAdapterMap = NativeJSAdapter.getInitialMap().duplicate(); +- this.nativeNumberMap = NativeNumber.getInitialMap().duplicate(); +- this.nativeRangeErrorMap = NativeRangeError.getInitialMap().duplicate(); +- this.nativeReferenceErrorMap = NativeReferenceError.getInitialMap().duplicate(); +- this.nativeRegExpMap = NativeRegExp.getInitialMap().duplicate(); +- this.nativeRegExpExecResultMap = NativeRegExpExecResult.getInitialMap().duplicate(); +- this.nativeStrictArgumentsMap = NativeStrictArguments.getInitialMap().duplicate(); +- this.nativeStringMap = NativeString.getInitialMap().duplicate(); +- this.nativeSyntaxErrorMap = NativeSyntaxError.getInitialMap().duplicate(); +- this.nativeTypeErrorMap = NativeTypeError.getInitialMap().duplicate(); +- this.nativeURIErrorMap = NativeURIError.getInitialMap().duplicate(); +- this.prototypeObjectMap = PrototypeObject.getInitialMap().duplicate(); +- this.objectMap = JO.getInitialMap().duplicate(); +- this.functionMap = ScriptFunctionImpl.getInitialMap().duplicate(); +- this.anonymousFunctionMap = ScriptFunctionImpl.getInitialAnonymousMap().duplicate(); +- this.strictFunctionMap = ScriptFunctionImpl.getInitialStrictMap().duplicate(); +- this.boundFunctionMap = ScriptFunctionImpl.getInitialBoundMap().duplicate(); +- +- // java +- if (! env._no_java) { +- this.nativeJavaImporterMap = NativeJavaImporter.getInitialMap().duplicate(); +- } +- +- // typed arrays +- if (! env._no_typed_arrays) { +- this.arrayBufferViewMap = ArrayBufferView.getInitialMap().duplicate(); +- this.nativeArrayBufferMap = NativeArrayBuffer.getInitialMap().duplicate(); +- } +- } +- + // Function and Object constructors are inter-dependent. Also, + // Function.prototype + // functions are not properly initialized. We fix the references here. +@@ -2005,13 +1888,13 @@ + + // Function.prototype === Object.getPrototypeOf(Function) === + // +- builtinFunction.setProto(anon); ++ builtinFunction.setInitialProto(anon); + builtinFunction.setPrototype(anon); + anon.set("constructor", builtinFunction, false); + anon.deleteOwnProperty(anon.getMap().findProperty("prototype")); + + // use "getter" so that [[ThrowTypeError]] function's arity is 0 - as specified in step 10 of section 13.2.3 +- this.typeErrorThrower = new ScriptFunctionImpl("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER, null, null, false, false, false); ++ this.typeErrorThrower = new ScriptFunctionImpl("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER, null, null, 0); + typeErrorThrower.setPrototype(UNDEFINED); + // Non-constructor built-in functions do not have "prototype" property + typeErrorThrower.deleteOwnProperty(typeErrorThrower.getMap().findProperty("prototype")); +@@ -2021,7 +1904,14 @@ + this.builtinObject = (ScriptFunction)initConstructor("Object"); + final ScriptObject ObjectPrototype = getObjectPrototype(); + // Object.getPrototypeOf(Function.prototype) === Object.prototype +- anon.setProto(ObjectPrototype); ++ anon.setInitialProto(ObjectPrototype); ++ ++ // ES6 draft compliant __proto__ property of Object.prototype ++ // accessors on Object.prototype for "__proto__" ++ final ScriptFunction getProto = ScriptFunctionImpl.makeFunction("getProto", NativeObject.GET__PROTO__); ++ final ScriptFunction setProto = ScriptFunctionImpl.makeFunction("setProto", NativeObject.SET__PROTO__); ++ ObjectPrototype.addOwnProperty("__proto__", Attribute.NOT_ENUMERABLE, getProto, setProto); ++ + + // Function valued properties of Function.prototype were not properly + // initialized. Because, these were created before global.function and +@@ -2033,10 +1923,10 @@ + + if (value instanceof ScriptFunction && value != anon) { + final ScriptFunction func = (ScriptFunction)value; +- func.setProto(getFunctionPrototype()); ++ func.setInitialProto(getFunctionPrototype()); + final ScriptObject prototype = ScriptFunction.getPrototype(func); + if (prototype != null) { +- prototype.setProto(ObjectPrototype); ++ prototype.setInitialProto(ObjectPrototype); + } + } + } +@@ -2051,7 +1941,7 @@ + final ScriptFunction func = (ScriptFunction)value; + final ScriptObject prototype = ScriptFunction.getPrototype(func); + if (prototype != null) { +- prototype.setProto(ObjectPrototype); ++ prototype.setInitialProto(ObjectPrototype); + } + } + } +@@ -2069,7 +1959,7 @@ + final ScriptFunction func = (ScriptFunction)value; + final ScriptObject prototype = ScriptFunction.getPrototype(func); + if (prototype != null) { +- prototype.setProto(ObjectPrototype); ++ prototype.setInitialProto(ObjectPrototype); + } + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeArguments.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeArguments.java Wed Jul 30 03:55:26 2014 -0700 +@@ -68,7 +68,7 @@ + final ArrayList properties = new ArrayList<>(2); + properties.add(AccessorProperty.create("length", Property.NOT_ENUMERABLE, G$LENGTH, S$LENGTH)); + properties.add(AccessorProperty.create("callee", Property.NOT_ENUMERABLE, G$CALLEE, S$CALLEE)); +- map$ = PropertyMap.newMap(properties).setIsShared(); ++ map$ = PropertyMap.newMap(properties); + } + + static PropertyMap getInitialMap() { +@@ -267,9 +267,9 @@ + final Global global = Global.instance(); + final ScriptObject proto = global.getObjectPrototype(); + if (isStrict) { +- return new NativeStrictArguments(arguments, numParams, proto, global.getStrictArgumentsMap()); ++ return new NativeStrictArguments(arguments, numParams, proto, NativeStrictArguments.getInitialMap()); + } +- return new NativeArguments(arguments, callee, numParams, proto, global.getArgumentsMap()); ++ return new NativeArguments(arguments, callee, numParams, proto, NativeArguments.getInitialMap()); + } + + /** +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeArray.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeArray.java Wed Jul 30 03:55:26 2014 -0700 +@@ -31,6 +31,7 @@ + import static jdk.nashorn.internal.runtime.PropertyDescriptor.WRITABLE; + import static jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator.arrayLikeIterator; + import static jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator.reverseArrayLikeIterator; ++import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.isValidArrayIndex; + + import java.lang.invoke.MethodHandle; + import java.util.ArrayList; +@@ -156,10 +157,6 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + /* + * Constructors. + */ +@@ -208,7 +205,7 @@ + } + + NativeArray(final ArrayData arrayData, final Global global) { +- super(global.getArrayPrototype(), global.getArrayMap()); ++ super(global.getArrayPrototype(), $nasgenmap$); + this.setArray(arrayData); + this.setIsArray(); + } +@@ -354,6 +351,27 @@ + } + + /** ++ * Spec. mentions use of [[DefineOwnProperty]] for indexed properties in ++ * certain places (eg. Array.prototype.map, filter). We can not use ScriptObject.set ++ * method in such cases. This is because set method uses inherited setters (if any) ++ * from any object in proto chain such as Array.prototype, Object.prototype. ++ * This method directly sets a particular element value in the current object. ++ * ++ * @param index key for property ++ * @param value value to define ++ */ ++ @Override ++ public final void defineOwnProperty(final int index, final Object value) { ++ assert isValidArrayIndex(index) : "invalid array index"; ++ final long longIndex = ArrayIndex.toLongIndex(index); ++ if (longIndex >= getArray().length()) { ++ // make array big enough to hold.. ++ setArray(getArray().ensure(longIndex)); ++ } ++ setArray(getArray().set(index, value, false)); ++ } ++ ++ /** + * Return the array contents upcasted as an ObjectArray, regardless of + * representation + * +@@ -371,7 +389,7 @@ + * @return true if argument is an array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object isArray(final Object self, final Object arg) { ++ public static boolean isArray(final Object self, final Object arg) { + return isArray(arg) || (arg instanceof JSObject && ((JSObject)arg).isArray()); + } + +@@ -470,7 +488,7 @@ + * @return locale specific string representation for array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toLocaleString(final Object self) { ++ public static String toLocaleString(final Object self) { + final StringBuilder sb = new StringBuilder(); + final Iterator iter = arrayLikeIterator(self, true); + +@@ -516,7 +534,7 @@ + * @return the new NativeArray + */ + @Constructor(arity = 1) +- public static Object construct(final boolean newObj, final Object self, final Object... args) { ++ public static NativeArray construct(final boolean newObj, final Object self, final Object... args) { + switch (args.length) { + case 0: + return new NativeArray(0); +@@ -569,7 +587,7 @@ + * @return the new NativeArray + */ + @SpecializedConstructor +- public static Object construct(final boolean newObj, final Object self) { ++ public static NativeArray construct(final boolean newObj, final Object self) { + return new NativeArray(0); + } + +@@ -584,7 +602,7 @@ + * @return the new NativeArray + */ + @SpecializedConstructor +- public static Object construct(final boolean newObj, final Object self, final int length) { ++ public static NativeArray construct(final boolean newObj, final Object self, final int length) { + if (length >= 0) { + return new NativeArray(length); + } +@@ -603,7 +621,7 @@ + * @return the new NativeArray + */ + @SpecializedConstructor +- public static Object construct(final boolean newObj, final Object self, final long length) { ++ public static NativeArray construct(final boolean newObj, final Object self, final long length) { + if (length >= 0L && length <= JSType.MAX_UINT) { + return new NativeArray(length); + } +@@ -622,7 +640,7 @@ + * @return the new NativeArray + */ + @SpecializedConstructor +- public static Object construct(final boolean newObj, final Object self, final double length) { ++ public static NativeArray construct(final boolean newObj, final Object self, final double length) { + final long uint32length = JSType.toUint32(length); + + if (uint32length == length) { +@@ -640,7 +658,7 @@ + * @return resulting NativeArray + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object concat(final Object self, final Object... args) { ++ public static NativeArray concat(final Object self, final Object... args) { + final ArrayList list = new ArrayList<>(); + concatToList(list, Global.toObject(self)); + +@@ -687,7 +705,7 @@ + * @return string representation after join + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object join(final Object self, final Object separator) { ++ public static String join(final Object self, final Object separator) { + final StringBuilder sb = new StringBuilder(); + final Iterator iter = arrayLikeIterator(self, true); + final String sep = separator == ScriptRuntime.UNDEFINED ? "," : JSType.toString(separator); +@@ -955,7 +973,7 @@ + * @return sorted array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object sort(final Object self, final Object comparefn) { ++ public static ScriptObject sort(final Object self, final Object comparefn) { + try { + final ScriptObject sobj = (ScriptObject) self; + final long len = JSType.toUint32(sobj.getLength()); +@@ -1159,7 +1177,7 @@ + * @return index of element, or -1 if not found + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object indexOf(final Object self, final Object searchElement, final Object fromIndex) { ++ public static long indexOf(final Object self, final Object searchElement, final Object fromIndex) { + try { + final ScriptObject sobj = (ScriptObject)Global.toObject(self); + final long len = JSType.toUint32(sobj.getLength()); +@@ -1195,7 +1213,7 @@ + * @return index of element, or -1 if not found + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object lastIndexOf(final Object self, final Object... args) { ++ public static long lastIndexOf(final Object self, final Object... args) { + try { + final ScriptObject sobj = (ScriptObject)Global.toObject(self); + final long len = JSType.toUint32(sobj.getLength()); +@@ -1230,7 +1248,7 @@ + * @return true if callback function return true for every element in the array, false otherwise + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object every(final Object self, final Object callbackfn, final Object thisArg) { ++ public static boolean every(final Object self, final Object callbackfn, final Object thisArg) { + return applyEvery(Global.toObject(self), callbackfn, thisArg); + } + +@@ -1254,7 +1272,7 @@ + * @return true if callback function returned true for any element in the array, false otherwise + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object some(final Object self, final Object callbackfn, final Object thisArg) { ++ public static boolean some(final Object self, final Object callbackfn, final Object thisArg) { + return new IteratorAction(Global.toObject(self), callbackfn, thisArg, false) { + private final MethodHandle someInvoker = getSOME_CALLBACK_INVOKER(); + +@@ -1295,7 +1313,7 @@ + * @return array with elements transformed by map function + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object map(final Object self, final Object callbackfn, final Object thisArg) { ++ public static NativeArray map(final Object self, final Object callbackfn, final Object thisArg) { + return new IteratorAction(Global.toObject(self), callbackfn, thisArg, null) { + private final MethodHandle mapInvoker = getMAP_CALLBACK_INVOKER(); + +@@ -1324,7 +1342,7 @@ + * @return filtered array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object filter(final Object self, final Object callbackfn, final Object thisArg) { ++ public static NativeArray filter(final Object self, final Object callbackfn, final Object thisArg) { + return new IteratorAction(Global.toObject(self), callbackfn, thisArg, new NativeArray()) { + private long to = 0; + private final MethodHandle filterInvoker = getFILTER_CALLBACK_INVOKER(); +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeArrayBuffer.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeArrayBuffer.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,6 +25,7 @@ + + package jdk.nashorn.internal.objects; + ++import java.nio.ByteBuffer; + import java.util.Arrays; + import jdk.nashorn.internal.objects.annotations.Attribute; + import jdk.nashorn.internal.objects.annotations.Constructor; +@@ -43,12 +44,8 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { ++ public static NativeArrayBuffer constructor(final boolean newObj, final Object self, final Object... args) { + if (args.length == 0) { + throw new RuntimeException("missing length argument"); + } +@@ -57,7 +54,7 @@ + } + + protected NativeArrayBuffer(final byte[] byteArray, final Global global) { +- super(global.getArrayBufferPrototype(), global.getArrayBufferMap()); ++ super(global.getArrayBufferPrototype(), $nasgenmap$); + this.buffer = byteArray; + } + +@@ -84,7 +81,7 @@ + } + + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object slice(final Object self, final Object begin0, final Object end0) { ++ public static NativeArrayBuffer slice(final Object self, final Object begin0, final Object end0) { + final NativeArrayBuffer arrayBuffer = (NativeArrayBuffer)self; + int begin = JSType.toInt32(begin0); + int end = end0 != ScriptRuntime.UNDEFINED ? JSType.toInt32(end0) : arrayBuffer.getByteLength(); +@@ -128,4 +125,16 @@ + public int getByteLength() { + return buffer.length; + } ++ ++ ByteBuffer getBuffer() { ++ return ByteBuffer.wrap(buffer); ++ } ++ ++ ByteBuffer getBuffer(final int offset) { ++ return ByteBuffer.wrap(buffer, offset, buffer.length - offset); ++ } ++ ++ ByteBuffer getBuffer(final int offset, final int length) { ++ return ByteBuffer.wrap(buffer, offset, length); ++ } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeBoolean.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeBoolean.java Wed Jul 30 03:55:26 2014 -0700 +@@ -30,6 +30,7 @@ + + import java.lang.invoke.MethodHandle; + import java.lang.invoke.MethodHandles; ++import java.lang.invoke.MethodType; + import jdk.internal.dynalink.linker.GuardedInvocation; + import jdk.internal.dynalink.linker.LinkRequest; + import jdk.nashorn.internal.objects.annotations.Attribute; +@@ -50,22 +51,21 @@ + public final class NativeBoolean extends ScriptObject { + private final boolean value; + +- final static MethodHandle WRAPFILTER = findWrapFilter(); ++ // Method handle to create an object wrapper for a primitive boolean ++ private static final MethodHandle WRAPFILTER = findOwnMH("wrapFilter", MH.type(NativeBoolean.class, Object.class)); ++ // Method handle to retrieve the Boolean prototype object ++ private static final MethodHandle PROTOFILTER = findOwnMH("protoFilter", MH.type(Object.class, Object.class)); + + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + private NativeBoolean(final boolean value, final ScriptObject proto, final PropertyMap map) { + super(proto, map); + this.value = value; + } + + NativeBoolean(final boolean flag, final Global global) { +- this(flag, global.getBooleanPrototype(), global.getBooleanMap()); ++ this(flag, global.getBooleanPrototype(), $nasgenmap$); + } + + NativeBoolean(final boolean flag) { +@@ -110,7 +110,7 @@ + * @return string representation of this boolean + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toString(final Object self) { ++ public static String toString(final Object self) { + return getBoolean(self).toString(); + } + +@@ -121,7 +121,7 @@ + * @return value of this boolean + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object valueOf(final Object self) { ++ public static boolean valueOf(final Object self) { + return getBoolean(self); + } + +@@ -164,7 +164,7 @@ + * @return Link to be invoked at call site. + */ + public static GuardedInvocation lookupPrimitive(final LinkRequest request, final Object receiver) { +- return PrimitiveLookup.lookupPrimitive(request, Boolean.class, new NativeBoolean((Boolean)receiver), WRAPFILTER); ++ return PrimitiveLookup.lookupPrimitive(request, Boolean.class, new NativeBoolean((Boolean)receiver), WRAPFILTER, PROTOFILTER); + } + + /** +@@ -178,7 +178,12 @@ + return new NativeBoolean((Boolean)receiver); + } + +- private static MethodHandle findWrapFilter() { +- return MH.findStatic(MethodHandles.lookup(), NativeBoolean.class, "wrapFilter", MH.type(NativeBoolean.class, Object.class)); ++ @SuppressWarnings("unused") ++ private static Object protoFilter(final Object object) { ++ return Global.instance().getBooleanPrototype(); ++ } ++ ++ private static MethodHandle findOwnMH(final String name, final MethodType type) { ++ return MH.findStatic(MethodHandles.lookup(), NativeBoolean.class, name, type); + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeDataView.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeDataView.java Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,1015 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package jdk.nashorn.internal.objects; ++ ++import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; ++import static jdk.nashorn.internal.runtime.ECMAErrors.rangeError; ++import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; ++ ++import java.nio.ByteBuffer; ++import java.nio.ByteOrder; ++import jdk.nashorn.internal.objects.annotations.Attribute; ++import jdk.nashorn.internal.objects.annotations.Constructor; ++import jdk.nashorn.internal.objects.annotations.Function; ++import jdk.nashorn.internal.objects.annotations.Property; ++import jdk.nashorn.internal.objects.annotations.ScriptClass; ++import jdk.nashorn.internal.objects.annotations.SpecializedConstructor; ++import jdk.nashorn.internal.objects.annotations.SpecializedFunction; ++import jdk.nashorn.internal.runtime.JSType; ++import jdk.nashorn.internal.runtime.PropertyMap; ++import jdk.nashorn.internal.runtime.ScriptObject; ++import jdk.nashorn.internal.runtime.ScriptRuntime; ++ ++/** ++ *

    ++ * DataView builtin constructor. Based on the specification here: ++ * http://www.khronos.org/registry/typedarray/specs/latest/#8 ++ *

    ++ *

    ++ * An ArrayBuffer is a useful object for representing an arbitrary chunk of data. ++ * In many cases, such data will be read from disk or from the network, and will ++ * not follow the alignment restrictions that are imposed on the typed array views ++ * described earlier. In addition, the data will often be heterogeneous in nature ++ * and have a defined byte order. The DataView view provides a low-level interface ++ * for reading such data from and writing it to an ArrayBuffer. ++ *

    ++ *

    ++ * Regardless of the host computer's endianness, DataView reads or writes values ++ * to or from main memory with a specified endianness: big or little. ++ *

    ++ */ ++@ScriptClass("DataView") ++public class NativeDataView extends ScriptObject { ++ // initialized by nasgen ++ private static PropertyMap $nasgenmap$; ++ ++ // inherited ArrayBufferView properties ++ ++ /** ++ * Underlying ArrayBuffer storage object ++ */ ++ @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT) ++ public final Object buffer; ++ ++ /** ++ * The offset in bytes from the start of the ArrayBuffer ++ */ ++ @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT) ++ public final int byteOffset; ++ ++ /** ++ * The number of bytes from the offset that this DataView will reference ++ */ ++ @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT) ++ public final int byteLength; ++ ++ // underlying ByteBuffer ++ private final ByteBuffer buf; ++ ++ private NativeDataView(NativeArrayBuffer arrBuf) { ++ this(arrBuf, arrBuf.getBuffer(), 0); ++ } ++ ++ private NativeDataView(NativeArrayBuffer arrBuf, int offset) { ++ this(arrBuf, bufferFrom(arrBuf, offset), offset); ++ } ++ ++ private NativeDataView(NativeArrayBuffer arrBuf, int offset, int length) { ++ this(arrBuf, bufferFrom(arrBuf, offset, length), offset, length); ++ } ++ ++ private NativeDataView(final NativeArrayBuffer arrBuf, final ByteBuffer buf, final int offset) { ++ this(arrBuf, buf, offset, buf.capacity() - offset); ++ } ++ ++ private NativeDataView(final NativeArrayBuffer arrBuf, final ByteBuffer buf, final int offset, final int length) { ++ super(Global.instance().getDataViewPrototype(), $nasgenmap$); ++ this.buffer = arrBuf; ++ this.byteOffset = offset; ++ this.byteLength = length; ++ this.buf = buf; ++ } ++ ++ /** ++ * Create a new DataView object using the passed ArrayBuffer for its ++ * storage. Optional byteOffset and byteLength can be used to limit the ++ * section of the buffer referenced. The byteOffset indicates the offset in ++ * bytes from the start of the ArrayBuffer, and the byteLength is the number ++ * of bytes from the offset that this DataView will reference. If both ++ * byteOffset and byteLength are omitted, the DataView spans the entire ++ * ArrayBuffer range. If the byteLength is omitted, the DataView extends from ++ * the given byteOffset until the end of the ArrayBuffer. ++ * ++ * If the given byteOffset and byteLength references an area beyond the end ++ * of the ArrayBuffer an exception is raised. ++ ++ * @param newObj if this constructor was invoked with 'new' or not ++ * @param self constructor function object ++ * @param args arguments to the constructor ++ * @return newly constructed DataView object ++ */ ++ @Constructor(arity = 1) ++ public static NativeDataView constructor(final boolean newObj, final Object self, final Object... args) { ++ if (args.length == 0 || !(args[0] instanceof NativeArrayBuffer)) { ++ throw typeError("not.an.arraybuffer.in.dataview"); ++ } ++ ++ final NativeArrayBuffer arrBuf = (NativeArrayBuffer) args[0]; ++ switch (args.length) { ++ case 1: ++ return new NativeDataView(arrBuf); ++ case 2: ++ return new NativeDataView(arrBuf, JSType.toInt32(args[1])); ++ default: ++ return new NativeDataView(arrBuf, JSType.toInt32(args[1]), JSType.toInt32(args[2])); ++ } ++ } ++ ++ /** ++ * Specialized version of DataView constructor ++ * ++ * @param newObj if this constructor was invoked with 'new' or not ++ * @param self constructor function object ++ * @param arrBuf underlying ArrayBuffer storage object ++ * @param offset offset in bytes from the start of the ArrayBuffer ++ * @return newly constructed DataView object ++ */ ++ @SpecializedConstructor ++ public static NativeDataView constructor(final boolean newObj, final Object self, final Object arrBuf, final int offset) { ++ if (!(arrBuf instanceof NativeArrayBuffer)) { ++ throw typeError("not.an.arraybuffer.in.dataview"); ++ } ++ return new NativeDataView((NativeArrayBuffer) arrBuf, offset); ++ } ++ ++ /** ++ * Specialized version of DataView constructor ++ * ++ * @param newObj if this constructor was invoked with 'new' or not ++ * @param self constructor function object ++ * @param arrBuf underlying ArrayBuffer storage object ++ * @param offset in bytes from the start of the ArrayBuffer ++ * @param length is the number of bytes from the offset that this DataView will reference ++ * @return newly constructed DataView object ++ */ ++ @SpecializedConstructor ++ public static NativeDataView constructor(final boolean newObj, final Object self, final Object arrBuf, final int offset, final int length) { ++ if (!(arrBuf instanceof NativeArrayBuffer)) { ++ throw typeError("not.an.arraybuffer.in.dataview"); ++ } ++ return new NativeDataView((NativeArrayBuffer) arrBuf, offset, length); ++ } ++ ++ // Gets the value of the given type at the specified byte offset ++ // from the start of the view. There is no alignment constraint; ++ // multi-byte values may be fetched from any offset. ++ // ++ // For multi-byte values, the optional littleEndian argument ++ // indicates whether a big-endian or little-endian value should be ++ // read. If false or undefined, a big-endian value is read. ++ // ++ // These methods raise an exception if they would read ++ // beyond the end of the view. ++ ++ /** ++ * Get 8-bit signed int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 8-bit signed int value at the byteOffset ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE) ++ public static int getInt8(final Object self, final Object byteOffset) { ++ try { ++ return getBuffer(self).get(JSType.toInt32(byteOffset)); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 8-bit signed int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 8-bit signed int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static int getInt8(final Object self, final int byteOffset) { ++ try { ++ return getBuffer(self).get(byteOffset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 8-bit unsigned int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 8-bit unsigned int value at the byteOffset ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE) ++ public static int getUint8(final Object self, final Object byteOffset) { ++ try { ++ return (0xFF & getBuffer(self).get(JSType.toInt32(byteOffset))); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 8-bit unsigned int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 8-bit unsigned int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static int getUint8(final Object self, final int byteOffset) { ++ try { ++ return (0xFF & getBuffer(self).get(byteOffset)); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 16-bit signed int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 16-bit signed int value at the byteOffset ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) ++ public static int getInt16(final Object self, final Object byteOffset, final Object littleEndian) { ++ try { ++ return getBuffer(self, littleEndian).getShort(JSType.toInt32(byteOffset)); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 16-bit signed int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 16-bit signed int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static int getInt16(final Object self, final int byteOffset) { ++ try { ++ return getBuffer(self, false).getShort(byteOffset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 16-bit signed int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 16-bit signed int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static int getInt16(final Object self, final int byteOffset, final boolean littleEndian) { ++ try { ++ return getBuffer(self, littleEndian).getShort(byteOffset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 16-bit unsigned int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 16-bit unsigned int value at the byteOffset ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) ++ public static int getUint16(final Object self, final Object byteOffset, final Object littleEndian) { ++ try { ++ return (int) (0xFFFF & getBuffer(self, littleEndian).getShort(JSType.toInt32(byteOffset))); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 16-bit unsigned int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 16-bit unsigned int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static int getUint16(final Object self, final int byteOffset) { ++ try { ++ return (int) (0xFFFF & getBuffer(self, false).getShort(byteOffset)); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 16-bit unsigned int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 16-bit unsigned int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static int getUint16(final Object self, final int byteOffset, final boolean littleEndian) { ++ try { ++ return (int) (0xFFFF & getBuffer(self, littleEndian).getShort(byteOffset)); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 32-bit signed int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 32-bit signed int value at the byteOffset ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) ++ public static int getInt32(final Object self, final Object byteOffset, final Object littleEndian) { ++ try { ++ return getBuffer(self, littleEndian).getInt(JSType.toInt32(byteOffset)); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 32-bit signed int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 32-bit signed int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static int getInt32(final Object self, final int byteOffset) { ++ try { ++ return getBuffer(self, false).getInt(byteOffset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 32-bit signed int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 32-bit signed int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static int getInt32(final Object self, final int byteOffset, final boolean littleEndian) { ++ try { ++ return getBuffer(self, littleEndian).getInt(byteOffset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 32-bit unsigned int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 32-bit unsigned int value at the byteOffset ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) ++ public static long getUint32(final Object self, final Object byteOffset, final Object littleEndian) { ++ try { ++ return (long) (0xFFFFFFFFL & getBuffer(self, littleEndian).getInt(JSType.toInt32(byteOffset))); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 32-bit unsigned int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 32-bit unsigned int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static long getUint32(final Object self, final int byteOffset) { ++ try { ++ return (long) (0xFFFFFFFFL & getBuffer(self, false).getInt(JSType.toInt32(byteOffset))); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 32-bit unsigned int from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 32-bit unsigned int value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static long getUint32(final Object self, final int byteOffset, final boolean littleEndian) { ++ try { ++ return (long) (0xFFFFFFFFL & getBuffer(self, littleEndian).getInt(JSType.toInt32(byteOffset))); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 32-bit float value from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 32-bit float value at the byteOffset ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) ++ public static double getFloat32(final Object self, final Object byteOffset, final Object littleEndian) { ++ try { ++ return getBuffer(self, littleEndian).getFloat(JSType.toInt32(byteOffset)); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 32-bit float value from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 32-bit float value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static double getFloat32(final Object self, final int byteOffset) { ++ try { ++ return getBuffer(self, false).getFloat(byteOffset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 32-bit float value from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 32-bit float value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static double getFloat32(final Object self, final int byteOffset, final boolean littleEndian) { ++ try { ++ return getBuffer(self, littleEndian).getFloat(byteOffset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 64-bit float value from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 64-bit float value at the byteOffset ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) ++ public static double getFloat64(final Object self, final Object byteOffset, final Object littleEndian) { ++ try { ++ return getBuffer(self, littleEndian).getDouble(JSType.toInt32(byteOffset)); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 64-bit float value from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @return 64-bit float value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static double getFloat64(final Object self, final int byteOffset) { ++ try { ++ return getBuffer(self, false).getDouble(byteOffset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Get 64-bit float value from given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param littleEndian (optional) flag indicating whether to read in little endian order ++ * @return 64-bit float value at the byteOffset ++ */ ++ @SpecializedFunction ++ public static double getFloat64(final Object self, final int byteOffset, final boolean littleEndian) { ++ try { ++ return getBuffer(self, littleEndian).getDouble(byteOffset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ // Stores a value of the given type at the specified byte offset ++ // from the start of the view. There is no alignment constraint; ++ // multi-byte values may be stored at any offset. ++ // ++ // For multi-byte values, the optional littleEndian argument ++ // indicates whether the value should be stored in big-endian or ++ // little-endian byte order. If false or undefined, the value is ++ // stored in big-endian byte order. ++ // ++ // These methods raise an exception if they would write ++ // beyond the end of the view. ++ ++ /** ++ * Set 8-bit signed int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param value byte value to set ++ * @return undefined ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) ++ public static Object setInt8(final Object self, final Object byteOffset, final Object value) { ++ try { ++ getBuffer(self).put(JSType.toInt32(byteOffset), (byte)JSType.toInt32(value)); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 8-bit signed int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to read from ++ * @param value byte value to set ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setInt8(final Object self, final int byteOffset, final int value) { ++ try { ++ getBuffer(self).put(byteOffset, (byte)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 8-bit unsigned int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value byte value to set ++ * @return undefined ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) ++ public static Object setUint8(final Object self, final Object byteOffset, final Object value) { ++ try { ++ getBuffer(self).put(JSType.toInt32(byteOffset), (byte)JSType.toInt32(value)); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 8-bit unsigned int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value byte value to set ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setUint8(final Object self, final int byteOffset, final int value) { ++ try { ++ getBuffer(self).put(byteOffset, (byte)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 16-bit signed int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value short value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) ++ public static Object setInt16(final Object self, final Object byteOffset, final Object value, final Object littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putShort(JSType.toInt32(byteOffset), (short)JSType.toInt32(value)); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 16-bit signed int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value short value to set ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setInt16(final Object self, final int byteOffset, final int value) { ++ try { ++ getBuffer(self, false).putShort(byteOffset, (short)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 16-bit signed int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value short value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setInt16(final Object self, final int byteOffset, final int value, final boolean littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putShort(byteOffset, (short)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 16-bit unsigned int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value short value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) ++ public static Object setUint16(final Object self, final Object byteOffset, final Object value, final Object littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putShort(JSType.toInt32(byteOffset), (short)JSType.toInt32(value)); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 16-bit unsigned int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value short value to set ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setUint16(final Object self, final int byteOffset, final int value) { ++ try { ++ getBuffer(self, false).putShort(byteOffset, (short)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 16-bit unsigned int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value short value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setUint16(final Object self, final int byteOffset, final int value, final boolean littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putShort(byteOffset, (short)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 32-bit signed int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value int value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) ++ public static Object setInt32(final Object self, final Object byteOffset, final Object value, final Object littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putInt(JSType.toInt32(byteOffset), (int)JSType.toInt32(value)); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 32-bit signed int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value int value to set ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setInt32(final Object self, final int byteOffset, final int value) { ++ try { ++ getBuffer(self, false).putInt(byteOffset, value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 32-bit signed int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value int value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setInt32(final Object self, final int byteOffset, final int value, final boolean littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putInt(byteOffset, value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 32-bit unsigned int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value int value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) ++ public static Object setUint32(final Object self, final Object byteOffset, final Object value, final Object littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putInt(JSType.toInt32(byteOffset), (int)JSType.toUint32(value)); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 32-bit unsigned int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value int value to set ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setUint32(final Object self, final int byteOffset, final long value) { ++ try { ++ getBuffer(self, false).putInt(byteOffset, (int)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 32-bit unsigned int at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value int value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setUint32(final Object self, final int byteOffset, final long value, final boolean littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putInt(byteOffset, (int)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 32-bit float at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value float value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) ++ public static Object setFloat32(final Object self, final Object byteOffset, final Object value, final Object littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putFloat((int)JSType.toUint32(byteOffset), (float)JSType.toNumber(value)); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 32-bit float at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value float value to set ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setFloat32(final Object self, final int byteOffset, final double value) { ++ try { ++ getBuffer(self, false).putFloat(byteOffset, (float)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 32-bit float at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value float value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setFloat32(final Object self, final int byteOffset, final double value, final boolean littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putFloat(byteOffset, (float)value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 64-bit float at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value double value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) ++ public static Object setFloat64(final Object self, final Object byteOffset, final Object value, final Object littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putDouble((int)JSType.toUint32(byteOffset), JSType.toNumber(value)); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 64-bit float at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value double value to set ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setFloat64(final Object self, final int byteOffset, final double value) { ++ try { ++ getBuffer(self, false).putDouble(byteOffset, value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ /** ++ * Set 64-bit float at the given byteOffset ++ * ++ * @param self DataView object ++ * @param byteOffset byte offset to write at ++ * @param value double value to set ++ * @param littleEndian (optional) flag indicating whether to write in little endian order ++ * @return undefined ++ */ ++ @SpecializedFunction ++ public static Object setFloat64(final Object self, final int byteOffset, final double value, final boolean littleEndian) { ++ try { ++ getBuffer(self, littleEndian).putDouble(byteOffset, value); ++ return UNDEFINED; ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.offset"); ++ } ++ } ++ ++ // internals only below this point ++ private static ByteBuffer bufferFrom(final NativeArrayBuffer nab, final int offset) { ++ try { ++ return nab.getBuffer(offset); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.constructor.offset"); ++ } ++ } ++ ++ private static ByteBuffer bufferFrom(final NativeArrayBuffer nab, final int offset, final int length) { ++ try { ++ return nab.getBuffer(offset, length); ++ } catch (final IndexOutOfBoundsException ioe) { ++ throw rangeError(ioe, "dataview.constructor.offset"); ++ } ++ } ++ ++ private static NativeDataView checkSelf(final Object self) { ++ if (!(self instanceof NativeDataView)) { ++ throw typeError("not.an.arraybuffer", ScriptRuntime.safeToString(self)); ++ } ++ return (NativeDataView)self; ++ } ++ ++ private static ByteBuffer getBuffer(final Object self) { ++ return checkSelf(self).buf; ++ } ++ ++ private static ByteBuffer getBuffer(final Object self, final Object littleEndian) { ++ return getBuffer(self, JSType.toBoolean(littleEndian)); ++ } ++ ++ private static ByteBuffer getBuffer(final Object self, final boolean littleEndian) { ++ return getBuffer(self).order(littleEndian? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN); ++ } ++} +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeDate.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeDate.java Wed Jul 30 03:55:26 2014 -0700 +@@ -114,10 +114,6 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + private NativeDate(final double time, final ScriptObject proto, final PropertyMap map) { + super(proto, map); + final ScriptEnvironment env = Global.getEnv(); +@@ -127,7 +123,7 @@ + } + + NativeDate(final double time, final Global global) { +- this(time, global.getDatePrototype(), global.getDateMap()); ++ this(time, global.getDatePrototype(), $nasgenmap$); + } + + private NativeDate (final double time) { +@@ -230,7 +226,7 @@ + * @return Date interpreted from the string, or NaN for illegal values + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object parse(final Object self, final Object string) { ++ public static double parse(final Object self, final Object string) { + return parseDateString(JSType.toString(string)); + } + +@@ -242,7 +238,7 @@ + * @return a time clip according to the ECMA specification + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 7, where = Where.CONSTRUCTOR) +- public static Object UTC(final Object self, final Object... args) { ++ public static double UTC(final Object self, final Object... args) { + final NativeDate nd = new NativeDate(0); + final double[] d = convertCtorArgs(args); + final double time = d == null ? Double.NaN : timeClip(makeDate(d)); +@@ -257,8 +253,8 @@ + * @return a Date that points to the current moment in time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object now(final Object self) { +- return (double)System.currentTimeMillis(); ++ public static long now(final Object self) { ++ return System.currentTimeMillis(); + } + + /** +@@ -268,7 +264,7 @@ + * @return string value that represents the Date in the current time zone + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toString(final Object self) { ++ public static String toString(final Object self) { + return toStringImpl(self, FORMAT_DATE_TIME); + } + +@@ -279,7 +275,7 @@ + * @return string value with the "date" part of the Date in the current time zone + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toDateString(final Object self) { ++ public static String toDateString(final Object self) { + return toStringImpl(self, FORMAT_DATE); + } + +@@ -290,7 +286,7 @@ + * @return string value with "time" part of Date in the current time zone + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toTimeString(final Object self) { ++ public static String toTimeString(final Object self) { + return toStringImpl(self, FORMAT_TIME); + } + +@@ -301,7 +297,7 @@ + * @return string value that represents the Data in the current time zone and locale + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toLocaleString(final Object self) { ++ public static String toLocaleString(final Object self) { + return toStringImpl(self, FORMAT_LOCAL_DATE_TIME); + } + +@@ -312,7 +308,7 @@ + * @return string value with the "date" part of the Date in the current time zone and locale + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toLocaleDateString(final Object self) { ++ public static String toLocaleDateString(final Object self) { + return toStringImpl(self, FORMAT_LOCAL_DATE); + } + +@@ -323,7 +319,7 @@ + * @return string value with the "time" part of Date in the current time zone and locale + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toLocaleTimeString(final Object self) { ++ public static String toLocaleTimeString(final Object self) { + return toStringImpl(self, FORMAT_LOCAL_TIME); + } + +@@ -334,7 +330,7 @@ + * @return valueOf - a number which is this time value + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object valueOf(final Object self) { ++ public static double valueOf(final Object self) { + final NativeDate nd = getNativeDate(self); + return (nd != null) ? nd.getTime() : Double.NaN; + } +@@ -346,7 +342,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getTime(final Object self) { ++ public static double getTime(final Object self) { + final NativeDate nd = getNativeDate(self); + return (nd != null) ? nd.getTime() : Double.NaN; + } +@@ -369,7 +365,7 @@ + * @return UTC full year + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getUTCFullYear(final Object self) { ++ public static double getUTCFullYear(final Object self) { + return getUTCField(self, YEAR); + } + +@@ -380,7 +376,7 @@ + * @return year + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getYear(final Object self) { ++ public static double getYear(final Object self) { + final NativeDate nd = getNativeDate(self); + return (nd != null && nd.isValidDate()) ? (yearFromTime(nd.getLocalTime()) - 1900) : Double.NaN; + } +@@ -392,7 +388,7 @@ + * @return month + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getMonth(final Object self) { ++ public static double getMonth(final Object self) { + return getField(self, MONTH); + } + +@@ -403,7 +399,7 @@ + * @return UTC month + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getUTCMonth(final Object self) { ++ public static double getUTCMonth(final Object self) { + return getUTCField(self, MONTH); + } + +@@ -414,7 +410,7 @@ + * @return date + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getDate(final Object self) { ++ public static double getDate(final Object self) { + return getField(self, DAY); + } + +@@ -425,7 +421,7 @@ + * @return UTC Date + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getUTCDate(final Object self) { ++ public static double getUTCDate(final Object self) { + return getUTCField(self, DAY); + } + +@@ -436,7 +432,7 @@ + * @return day + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getDay(final Object self) { ++ public static double getDay(final Object self) { + final NativeDate nd = getNativeDate(self); + return (nd != null && nd.isValidDate()) ? weekDay(nd.getLocalTime()) : Double.NaN; + } +@@ -448,7 +444,7 @@ + * @return UTC day + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getUTCDay(final Object self) { ++ public static double getUTCDay(final Object self) { + final NativeDate nd = getNativeDate(self); + return (nd != null && nd.isValidDate()) ? weekDay(nd.getTime()) : Double.NaN; + } +@@ -460,7 +456,7 @@ + * @return hours + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getHours(final Object self) { ++ public static double getHours(final Object self) { + return getField(self, HOUR); + } + +@@ -471,7 +467,7 @@ + * @return UTC hours + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getUTCHours(final Object self) { ++ public static double getUTCHours(final Object self) { + return getUTCField(self, HOUR); + } + +@@ -482,7 +478,7 @@ + * @return minutes + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getMinutes(final Object self) { ++ public static double getMinutes(final Object self) { + return getField(self, MINUTE); + } + +@@ -493,7 +489,7 @@ + * @return UTC minutes + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getUTCMinutes(final Object self) { ++ public static double getUTCMinutes(final Object self) { + return getUTCField(self, MINUTE); + } + +@@ -504,7 +500,7 @@ + * @return seconds + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getSeconds(final Object self) { ++ public static double getSeconds(final Object self) { + return getField(self, SECOND); + } + +@@ -515,7 +511,7 @@ + * @return UTC seconds + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getUTCSeconds(final Object self) { ++ public static double getUTCSeconds(final Object self) { + return getUTCField(self, SECOND); + } + +@@ -526,7 +522,7 @@ + * @return milliseconds + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getMilliseconds(final Object self) { ++ public static double getMilliseconds(final Object self) { + return getField(self, MILLISECOND); + } + +@@ -537,7 +533,7 @@ + * @return UTC milliseconds + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getUTCMilliseconds(final Object self) { ++ public static double getUTCMilliseconds(final Object self) { + return getUTCField(self, MILLISECOND); + } + +@@ -548,7 +544,7 @@ + * @return time zone offset or NaN if N/A + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object getTimezoneOffset(final Object self) { ++ public static double getTimezoneOffset(final Object self) { + final NativeDate nd = getNativeDate(self); + if (nd != null && nd.isValidDate()) { + final long msec = (long) nd.getTime(); +@@ -565,7 +561,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object setTime(final Object self, final Object time) { ++ public static double setTime(final Object self, final Object time) { + final NativeDate nd = getNativeDate(self); + final double num = timeClip(JSType.toNumber(time)); + nd.setTime(num); +@@ -580,7 +576,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object setMilliseconds(final Object self, final Object... args) { ++ public static double setMilliseconds(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, MILLISECOND, args, true); + return nd.getTime(); +@@ -594,7 +590,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object setUTCMilliseconds(final Object self, final Object... args) { ++ public static double setUTCMilliseconds(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, MILLISECOND, args, false); + return nd.getTime(); +@@ -608,7 +604,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) +- public static Object setSeconds(final Object self, final Object... args) { ++ public static double setSeconds(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, SECOND, args, true); + return nd.getTime(); +@@ -622,7 +618,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) +- public static Object setUTCSeconds(final Object self, final Object... args) { ++ public static double setUTCSeconds(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, SECOND, args, false); + return nd.getTime(); +@@ -636,7 +632,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3) +- public static Object setMinutes(final Object self, final Object... args) { ++ public static double setMinutes(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, MINUTE, args, true); + return nd.getTime(); +@@ -650,7 +646,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3) +- public static Object setUTCMinutes(final Object self, final Object... args) { ++ public static double setUTCMinutes(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, MINUTE, args, false); + return nd.getTime(); +@@ -664,7 +660,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 4) +- public static Object setHours(final Object self, final Object... args) { ++ public static double setHours(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, HOUR, args, true); + return nd.getTime(); +@@ -678,7 +674,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 4) +- public static Object setUTCHours(final Object self, final Object... args) { ++ public static double setUTCHours(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, HOUR, args, false); + return nd.getTime(); +@@ -692,7 +688,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object setDate(final Object self, final Object... args) { ++ public static double setDate(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, DAY, args, true); + return nd.getTime(); +@@ -706,7 +702,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object setUTCDate(final Object self, final Object... args) { ++ public static double setUTCDate(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, DAY, args, false); + return nd.getTime(); +@@ -720,7 +716,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) +- public static Object setMonth(final Object self, final Object... args) { ++ public static double setMonth(final Object self, final Object... args) { + final NativeDate nd = getNativeDate(self); + setFields(nd, MONTH, args, true); + return nd.getTime(); +@@ -734,7 +730,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2) +- public static Object setUTCMonth(final Object self, final Object... args) { ++ public static double setUTCMonth(final Object self, final Object... args) { + final NativeDate nd = ensureNativeDate(self); + setFields(nd, MONTH, args, false); + return nd.getTime(); +@@ -748,7 +744,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3) +- public static Object setFullYear(final Object self, final Object... args) { ++ public static double setFullYear(final Object self, final Object... args) { + final NativeDate nd = ensureNativeDate(self); + if (nd.isValidDate()) { + setFields(nd, YEAR, args, true); +@@ -771,7 +767,7 @@ + * @return time + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3) +- public static Object setUTCFullYear(final Object self, final Object... args) { ++ public static double setUTCFullYear(final Object self, final Object... args) { + final NativeDate nd = ensureNativeDate(self); + if (nd.isValidDate()) { + setFields(nd, YEAR, args, false); +@@ -790,7 +786,7 @@ + * @return NativeDate + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object setYear(final Object self, final Object year) { ++ public static double setYear(final Object self, final Object year) { + final NativeDate nd = getNativeDate(self); + if (isNaN(nd.getTime())) { + nd.setTime(utc(0, nd.getTimeZone())); +@@ -817,7 +813,7 @@ + * @return string representation of date + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toUTCString(final Object self) { ++ public static String toUTCString(final Object self) { + return toGMTStringImpl(self); + } + +@@ -830,7 +826,7 @@ + * @return string representation of date + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toGMTString(final Object self) { ++ public static String toGMTString(final Object self) { + return toGMTStringImpl(self); + } + +@@ -841,7 +837,7 @@ + * @return string representation of date + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toISOString(final Object self) { ++ public static String toISOString(final Object self) { + return toISOStringImpl(self); + } + +@@ -1286,14 +1282,14 @@ + } + } + +- private static Object getField(final Object self, final int field) { ++ private static double getField(final Object self, final int field) { + final NativeDate nd = getNativeDate(self); +- return (nd != null && nd.isValidDate()) ? valueFromTime(field, nd.getLocalTime()) : Double.NaN; ++ return (nd != null && nd.isValidDate()) ? (double)valueFromTime(field, nd.getLocalTime()) : Double.NaN; + } + +- private static Object getUTCField(final Object self, final int field) { ++ private static double getUTCField(final Object self, final int field) { + final NativeDate nd = getNativeDate(self); +- return (nd != null && nd.isValidDate()) ? valueFromTime(field, nd.getTime()) : Double.NaN; ++ return (nd != null && nd.isValidDate()) ? (double)valueFromTime(field, nd.getTime()) : Double.NaN; + } + + private static void setFields(final NativeDate nd, final int fieldId, final Object[] args, final boolean local) { +@@ -1348,5 +1344,4 @@ + private TimeZone getTimeZone() { + return timezone; + } +- + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeDebug.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeDebug.java Wed Jul 30 03:55:26 2014 -0700 +@@ -34,7 +34,7 @@ + import jdk.nashorn.internal.objects.annotations.ScriptClass; + import jdk.nashorn.internal.objects.annotations.Where; + import jdk.nashorn.internal.runtime.Context; +-import jdk.nashorn.internal.runtime.PropertyListenerManager; ++import jdk.nashorn.internal.runtime.PropertyListeners; + import jdk.nashorn.internal.runtime.PropertyMap; + import jdk.nashorn.internal.runtime.ScriptFunction; + import jdk.nashorn.internal.runtime.ScriptObject; +@@ -116,7 +116,7 @@ + * @return true if reference identity + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object identical(final Object self, final Object obj1, final Object obj2) { ++ public static boolean identical(final Object self, final Object obj1, final Object obj2) { + return obj1 == obj2; + } + +@@ -144,7 +144,7 @@ + * @return return {@link Object#equals(Object)} for objects. + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object equals(final Object self, final Object obj1, final Object obj2) { ++ public static boolean equals(final Object self, final Object obj1, final Object obj2) { + return Objects.equals(obj1, obj2); + } + +@@ -156,7 +156,7 @@ + * @return Java string representation of {@code obj} + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object toJavaString(final Object self, final Object obj) { ++ public static String toJavaString(final Object self, final Object obj) { + return Objects.toString(obj); + } + +@@ -168,7 +168,7 @@ + * @return string representation + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object toIdentString(final Object self, final Object obj) { ++ public static String toIdentString(final Object self, final Object obj) { + if (obj == null) { + return "null"; + } +@@ -185,8 +185,8 @@ + * @return listener count + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object getListenerCount(final Object self, final Object obj) { +- return (obj instanceof ScriptObject)? ((ScriptObject)obj).getListenerCount() : 0; ++ public static int getListenerCount(final Object self, final Object obj) { ++ return (obj instanceof ScriptObject) ? PropertyListeners.getListenerCount((ScriptObject) obj) : 0; + } + + /** +@@ -203,14 +203,13 @@ + + out.println("ScriptObject count " + ScriptObject.getCount()); + out.println("Scope count " + ScriptObject.getScopeCount()); +- out.println("ScriptObject listeners added " + PropertyListenerManager.getListenersAdded()); +- out.println("ScriptObject listeners removed " + PropertyListenerManager.getListenersRemoved()); ++ out.println("ScriptObject listeners added " + PropertyListeners.getListenersAdded()); ++ out.println("ScriptObject listeners removed " + PropertyListeners.getListenersRemoved()); + out.println("ScriptFunction constructor calls " + ScriptFunction.getConstructorCount()); + out.println("ScriptFunction invokes " + ScriptFunction.getInvokes()); + out.println("ScriptFunction allocations " + ScriptFunction.getAllocations()); + out.println("PropertyMap count " + PropertyMap.getCount()); + out.println("PropertyMap cloned " + PropertyMap.getClonedCount()); +- out.println("PropertyMap shared " + PropertyMap.getSharedCount()); + out.println("PropertyMap duplicated " + PropertyMap.getDuplicatedCount()); + out.println("PropertyMap history hit " + PropertyMap.getHistoryHit()); + out.println("PropertyMap proto invalidations " + PropertyMap.getProtoInvalidations()); +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeError.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeError.java Wed Jul 30 03:55:26 2014 -0700 +@@ -38,7 +38,6 @@ + import jdk.nashorn.internal.objects.annotations.Property; + import jdk.nashorn.internal.objects.annotations.ScriptClass; + import jdk.nashorn.internal.objects.annotations.Where; +-import jdk.nashorn.internal.objects.ScriptFunctionImpl; + import jdk.nashorn.internal.runtime.ECMAException; + import jdk.nashorn.internal.runtime.JSType; + import jdk.nashorn.internal.runtime.PropertyMap; +@@ -75,7 +74,7 @@ + static final String FILENAME = "__fileName__"; + + /** Message property name */ +- @Property(name = NativeError.MESSAGE) ++ @Property(name = NativeError.MESSAGE, attributes = Attribute.NOT_ENUMERABLE) + public Object instMessage; + + /** ECMA 15.11.4.2 Error.prototype.name */ +@@ -86,13 +85,14 @@ + @Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE) + public Object message; + ++ /** Nashorn extension: underlying exception */ ++ @Property(attributes = Attribute.NOT_ENUMERABLE) ++ public Object nashornException; ++ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- ++ @SuppressWarnings("LeakingThisInConstructor") + private NativeError(final Object msg, final ScriptObject proto, final PropertyMap map) { + super(proto, map); + if (msg != UNDEFINED) { +@@ -100,10 +100,11 @@ + } else { + this.delete(NativeError.MESSAGE, false); + } ++ initException(this); + } + + NativeError(final Object msg, final Global global) { +- this(msg, global.getErrorPrototype(), global.getErrorMap()); ++ this(msg, global.getErrorPrototype(), $nasgenmap$); + } + + private NativeError(final Object msg) { +@@ -125,10 +126,18 @@ + * @return NativeError instance + */ + @Constructor +- public static Object constructor(final boolean newObj, final Object self, final Object msg) { ++ public static NativeError constructor(final boolean newObj, final Object self, final Object msg) { + return new NativeError(msg); + } + ++ // This is called NativeError, NativeTypeError etc. to ++ // associate a ECMAException with the ECMA Error object. ++ @SuppressWarnings("unused") ++ static void initException(final ScriptObject self) { ++ // ECMAException constructor has side effects ++ new ECMAException(self, null); ++ } ++ + /** + * Nashorn extension: Error.captureStackTrace. Capture stack trace at the point of call into the Error object provided. + * +@@ -136,16 +145,17 @@ + * @param errorObj the error object + * @return undefined + */ +- @SuppressWarnings("unused") + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) + public static Object captureStackTrace(final Object self, final Object errorObj) { + Global.checkObject(errorObj); + final ScriptObject sobj = (ScriptObject)errorObj; +- new ECMAException(sobj, null); //constructor has side effects +- sobj.delete("stack", false); +- final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", GET_STACK); +- final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", SET_STACK); +- sobj.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack); ++ initException(sobj); ++ sobj.delete(STACK, false); ++ if (! sobj.has("stack")) { ++ final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", GET_STACK); ++ final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", SET_STACK); ++ sobj.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack); ++ } + return UNDEFINED; + } + +@@ -226,7 +236,11 @@ + public static Object setLineNumber(final Object self, final Object value) { + Global.checkObject(self); + final ScriptObject sobj = (ScriptObject)self; +- sobj.set(LINENUMBER, value, false); ++ if (sobj.hasOwnProperty(LINENUMBER)) { ++ sobj.put(LINENUMBER, value, false); ++ } else { ++ sobj.addOwnProperty(LINENUMBER, Attribute.NOT_ENUMERABLE, value); ++ } + return value; + } + +@@ -254,7 +268,11 @@ + public static Object setColumnNumber(final Object self, final Object value) { + Global.checkObject(self); + final ScriptObject sobj = (ScriptObject)self; +- sobj.set(COLUMNNUMBER, value, false); ++ if (sobj.hasOwnProperty(COLUMNNUMBER)) { ++ sobj.put(COLUMNNUMBER, value, false); ++ } else { ++ sobj.addOwnProperty(COLUMNNUMBER, Attribute.NOT_ENUMERABLE, value); ++ } + return value; + } + +@@ -282,7 +300,11 @@ + public static Object setFileName(final Object self, final Object value) { + Global.checkObject(self); + final ScriptObject sobj = (ScriptObject)self; +- sobj.set(FILENAME, value, false); ++ if (sobj.hasOwnProperty(FILENAME)) { ++ sobj.put(FILENAME, value, false); ++ } else { ++ sobj.addOwnProperty(FILENAME, Attribute.NOT_ENUMERABLE, value); ++ } + return value; + } + +@@ -304,10 +326,17 @@ + + final Object exception = ECMAException.getException(sobj); + if (exception instanceof Throwable) { +- return getScriptStackString(sobj, (Throwable)exception); ++ Object value = getScriptStackString(sobj, (Throwable)exception); ++ if (sobj.hasOwnProperty(STACK)) { ++ sobj.put(STACK, value, false); ++ } else { ++ sobj.addOwnProperty(STACK, Attribute.NOT_ENUMERABLE, value); ++ } ++ ++ return value; + } + +- return ""; ++ return UNDEFINED; + } + + /** +@@ -322,7 +351,12 @@ + public static Object setStack(final Object self, final Object value) { + Global.checkObject(self); + final ScriptObject sobj = (ScriptObject)self; +- sobj.set(STACK, value, false); ++ if (sobj.hasOwnProperty(STACK)) { ++ sobj.put(STACK, value, false); ++ } else { ++ sobj.addOwnProperty(STACK, Attribute.NOT_ENUMERABLE, value); ++ } ++ + return value; + } + +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeEvalError.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeEvalError.java Wed Jul 30 03:55:26 2014 -0700 +@@ -44,7 +44,7 @@ + public final class NativeEvalError extends ScriptObject { + + /** message property in instance */ +- @Property(name = NativeError.MESSAGE) ++ @Property(name = NativeError.MESSAGE, attributes = Attribute.NOT_ENUMERABLE) + public Object instMessage; + + /** error name property */ +@@ -55,13 +55,14 @@ + @Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE) + public Object message; + ++ /** Nashorn extension: underlying exception */ ++ @Property(attributes = Attribute.NOT_ENUMERABLE) ++ public Object nashornException; ++ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- ++ @SuppressWarnings("LeakingThisInConstructor") + private NativeEvalError(final Object msg, final ScriptObject proto, final PropertyMap map) { + super(proto, map); + if (msg != UNDEFINED) { +@@ -69,10 +70,11 @@ + } else { + this.delete(NativeError.MESSAGE, false); + } ++ NativeError.initException(this); + } + + NativeEvalError(final Object msg, final Global global) { +- this(msg, global.getEvalErrorPrototype(), global.getEvalErrorMap()); ++ this(msg, global.getEvalErrorPrototype(), $nasgenmap$); + } + + private NativeEvalError(final Object msg) { +@@ -96,7 +98,7 @@ + * @return new EvalError + */ + @Constructor(name = "EvalError") +- public static Object constructor(final boolean newObj, final Object self, final Object msg) { ++ public static NativeEvalError constructor(final boolean newObj, final Object self, final Object msg) { + return new NativeEvalError(msg); + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeFloat32Array.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeFloat32Array.java Wed Jul 30 03:55:26 2014 -0700 +@@ -136,8 +136,8 @@ + * @return new typed array + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { +- return constructorImpl(args, FACTORY); ++ public static NativeFloat32Array constructor(final boolean newObj, final Object self, final Object... args) { ++ return (NativeFloat32Array)constructorImpl(args, FACTORY); + } + + NativeFloat32Array(final NativeArrayBuffer buffer, final int byteOffset, final int length) { +@@ -192,8 +192,8 @@ + * @return sub array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- protected static Object subarray(final Object self, final Object begin, final Object end) { +- return ArrayBufferView.subarrayImpl(self, begin, end); ++ protected static NativeFloat32Array subarray(final Object self, final Object begin, final Object end) { ++ return (NativeFloat32Array)ArrayBufferView.subarrayImpl(self, begin, end); + } + + @Override +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeFloat64Array.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeFloat64Array.java Wed Jul 30 03:55:26 2014 -0700 +@@ -146,8 +146,8 @@ + * @return new typed array + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { +- return constructorImpl(args, FACTORY); ++ public static NativeFloat64Array constructor(final boolean newObj, final Object self, final Object... args) { ++ return (NativeFloat64Array)constructorImpl(args, FACTORY); + } + + NativeFloat64Array(final NativeArrayBuffer buffer, final int byteOffset, final int length) { +@@ -202,8 +202,8 @@ + * @return sub array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- protected static Object subarray(final Object self, final Object begin, final Object end) { +- return ArrayBufferView.subarrayImpl(self, begin, end); ++ protected static NativeFloat64Array subarray(final Object self, final Object begin, final Object end) { ++ return (NativeFloat64Array)ArrayBufferView.subarrayImpl(self, begin, end); + } + + @Override +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeFunction.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeFunction.java Wed Jul 30 03:55:26 2014 -0700 +@@ -27,6 +27,7 @@ + + import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; + import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; ++import static jdk.nashorn.internal.runtime.Source.sourceFor; + + import java.util.List; + +@@ -71,7 +72,7 @@ + * @return string representation of Function + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toString(final Object self) { ++ public static String toString(final Object self) { + if (!(self instanceof ScriptFunction)) { + throw typeError("not.a.function", ScriptRuntime.safeToString(self)); + } +@@ -174,7 +175,7 @@ + * @return function with bound arguments + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object bind(final Object self, final Object... args) { ++ public static ScriptFunction bind(final Object self, final Object... args) { + if (!(self instanceof ScriptFunction)) { + throw typeError("not.a.function", ScriptRuntime.safeToString(self)); + } +@@ -199,7 +200,7 @@ + * @return source for function + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toSource(final Object self) { ++ public static String toSource(final Object self) { + if (!(self instanceof ScriptFunction)) { + throw typeError("not.a.function", ScriptRuntime.safeToString(self)); + } +@@ -217,7 +218,7 @@ + * @return new NativeFunction + */ + @Constructor(arity = 1) +- public static Object function(final boolean newObj, final Object self, final Object... args) { ++ public static ScriptFunction function(final boolean newObj, final Object self, final Object... args) { + final StringBuilder sb = new StringBuilder(); + + sb.append("(function ("); +@@ -253,11 +254,11 @@ + + final Global global = Global.instance(); + +- return Global.directEval(global, sb.toString(), global, "", global.isStrictContext()); ++ return (ScriptFunction)Global.directEval(global, sb.toString(), global, "", global.isStrictContext()); + } + + private static void checkFunctionParameters(final String params) { +- final Source src = new Source("", params); ++ final Source src = sourceFor("", params); + final Parser parser = new Parser(Global.getEnv(), src, new Context.ThrowErrorManager()); + try { + parser.parseFormalParameterList(); +@@ -267,7 +268,7 @@ + } + + private static void checkFunctionBody(final String funcBody) { +- final Source src = new Source("", funcBody); ++ final Source src = sourceFor("", funcBody); + final Parser parser = new Parser(Global.getEnv(), src, new Context.ThrowErrorManager()); + try { + parser.parseFunctionBody(); +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeInt16Array.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeInt16Array.java Wed Jul 30 03:55:26 2014 -0700 +@@ -100,8 +100,8 @@ + * @return new typed array + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { +- return constructorImpl(args, FACTORY); ++ public static NativeInt16Array constructor(final boolean newObj, final Object self, final Object... args) { ++ return (NativeInt16Array)constructorImpl(args, FACTORY); + } + + NativeInt16Array(final NativeArrayBuffer buffer, final int byteOffset, final int byteLength) { +@@ -151,8 +151,8 @@ + * @return sub array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- protected static Object subarray(final Object self, final Object begin, final Object end) { +- return ArrayBufferView.subarrayImpl(self, begin, end); ++ protected static NativeInt16Array subarray(final Object self, final Object begin, final Object end) { ++ return (NativeInt16Array)ArrayBufferView.subarrayImpl(self, begin, end); + } + + @Override +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeInt32Array.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeInt32Array.java Wed Jul 30 03:55:26 2014 -0700 +@@ -103,8 +103,8 @@ + * @return new typed array + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { +- return constructorImpl(args, FACTORY); ++ public static NativeInt32Array constructor(final boolean newObj, final Object self, final Object... args) { ++ return (NativeInt32Array)constructorImpl(args, FACTORY); + } + + NativeInt32Array(final NativeArrayBuffer buffer, final int byteOffset, final int length) { +@@ -154,8 +154,8 @@ + * @return sub array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- protected static Object subarray(final Object self, final Object begin, final Object end) { +- return ArrayBufferView.subarrayImpl(self, begin, end); ++ protected static NativeInt32Array subarray(final Object self, final Object begin, final Object end) { ++ return (NativeInt32Array)ArrayBufferView.subarrayImpl(self, begin, end); + } + + @Override +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeInt8Array.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeInt8Array.java Wed Jul 30 03:55:26 2014 -0700 +@@ -93,8 +93,8 @@ + * @return new typed array + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { +- return constructorImpl(args, FACTORY); ++ public static NativeInt8Array constructor(final boolean newObj, final Object self, final Object... args) { ++ return (NativeInt8Array)constructorImpl(args, FACTORY); + } + + NativeInt8Array(final NativeArrayBuffer buffer, final int byteOffset, final int length) { +@@ -144,8 +144,8 @@ + * @return sub array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- protected static Object subarray(final Object self, final Object begin, final Object end) { +- return ArrayBufferView.subarrayImpl(self, begin, end); ++ protected static NativeInt8Array subarray(final Object self, final Object begin, final Object end) { ++ return (NativeInt8Array)ArrayBufferView.subarrayImpl(self, begin, end); + } + + @Override +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeJSAdapter.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeJSAdapter.java Wed Jul 30 03:55:26 2014 -0700 +@@ -146,10 +146,6 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + NativeJSAdapter(final Object overrides, final ScriptObject adaptee, final ScriptObject proto, final PropertyMap map) { + super(proto, map); + this.adaptee = wrapAdaptee(adaptee); +@@ -163,7 +159,7 @@ + } + + private static ScriptObject wrapAdaptee(final ScriptObject adaptee) { +- return new JO(adaptee, Global.instance().getObjectMap()); ++ return new JO(adaptee, JO.getInitialMap()); + } + + @Override +@@ -540,7 +536,7 @@ + * @return new NativeJSAdapter + */ + @Constructor +- public static Object construct(final boolean isNew, final Object self, final Object... args) { ++ public static NativeJSAdapter construct(final boolean isNew, final Object self, final Object... args) { + Object proto = UNDEFINED; + Object overrides = UNDEFINED; + Object adaptee; +@@ -577,7 +573,7 @@ + proto = global.getJSAdapterPrototype(); + } + +- return new NativeJSAdapter(overrides, (ScriptObject)adaptee, (ScriptObject)proto, global.getJSAdapterMap()); ++ return new NativeJSAdapter(overrides, (ScriptObject)adaptee, (ScriptObject)proto, $nasgenmap$); + } + + @Override +@@ -622,14 +618,14 @@ + case "getMethod": + final FindProperty find = adaptee.findProperty(__call__, true); + if (find != null) { +- final Object value = getObjectValue(find); ++ final Object value = find.getObjectValue(); + if (value instanceof ScriptFunction) { + final ScriptFunctionImpl func = (ScriptFunctionImpl)value; + // TODO: It's a shame we need to produce a function bound to this and name, when we'd only need it bound + // to name. Probably not a big deal, but if we can ever make it leaner, it'd be nice. + return new GuardedInvocation(MH.dropArguments(MH.constant(Object.class, + func.makeBoundFunction(this, new Object[] { name })), 0, Object.class), +- adaptee.getMap().getProtoGetSwitchPoint(adaptee.getProto(), __call__), ++ adaptee.getProtoSwitchPoint(__call__, find.getOwner()), + testJSAdaptor(adaptee, null, null, null)); + } + } +@@ -691,7 +687,7 @@ + final MethodType type = desc.getMethodType(); + if (findData != null) { + final String name = desc.getNameTokenCount() > 2 ? desc.getNameToken(2) : null; +- final Object value = getObjectValue(findData); ++ final Object value = findData.getObjectValue(); + if (value instanceof ScriptFunction) { + final ScriptFunction func = (ScriptFunction)value; + +@@ -700,7 +696,7 @@ + if (methodHandle != null) { + return new GuardedInvocation( + methodHandle, +- adaptee.getMap().getProtoGetSwitchPoint(adaptee.getProto(), hook), ++ adaptee.getProtoSwitchPoint(hook, findData.getOwner()), + testJSAdaptor(adaptee, findData.getGetter(Object.class), findData.getOwner(), func)); + } + } +@@ -713,7 +709,7 @@ + final MethodHandle methodHandle = hook.equals(__put__) ? + MH.asType(Lookup.EMPTY_SETTER, type) : + Lookup.emptyGetter(type.returnType()); +- return new GuardedInvocation(methodHandle, adaptee.getMap().getProtoGetSwitchPoint(adaptee.getProto(), hook), testJSAdaptor(adaptee, null, null, null)); ++ return new GuardedInvocation(methodHandle, adaptee.getProtoSwitchPoint(hook, null), testJSAdaptor(adaptee, null, null, null)); + } + } + +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeJava.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeJava.java Wed Jul 30 03:55:26 2014 -0700 +@@ -75,7 +75,7 @@ + * @see #type(Object, Object) + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object isType(final Object self, final Object type) { ++ public static boolean isType(final Object self, final Object type) { + return type instanceof StaticClass; + } + +@@ -338,7 +338,7 @@ + * null. + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object from(final Object self, final Object objArray) { ++ public static NativeArray from(final Object self, final Object objArray) { + if (objArray == null) { + return null; + } else if (objArray instanceof Collection) { +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeJavaImporter.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeJavaImporter.java Wed Jul 30 03:55:26 2014 -0700 +@@ -60,17 +60,13 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + private NativeJavaImporter(final Object[] args, final ScriptObject proto, final PropertyMap map) { + super(proto, map); + this.args = args; + } + + private NativeJavaImporter(final Object[] args, final Global global) { +- this(args, global.getJavaImporterPrototype(), global.getJavaImporterMap()); ++ this(args, global.getJavaImporterPrototype(), $nasgenmap$); + } + + private NativeJavaImporter(final Object[] args) { +@@ -90,7 +86,7 @@ + * @return NativeJavaImporter instance + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean isNew, final Object self, final Object... args) { ++ public static NativeJavaImporter constructor(final boolean isNew, final Object self, final Object... args) { + return new NativeJavaImporter(args); + } + +@@ -134,6 +130,11 @@ + return createAndSetProperty(desc) ? super.lookup(desc, request) : super.noSuchMethod(desc, request); + } + ++ @Override ++ protected Object invokeNoSuchProperty(final String name) { ++ return createProperty(name); ++ } ++ + private boolean createAndSetProperty(final CallSiteDescriptor desc) { + final String name = desc.getNameToken(CallSiteDescriptor.NAME_OPERAND); + final Object value = createProperty(name); +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeMath.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeMath.java Wed Jul 30 03:55:26 2014 -0700 +@@ -92,7 +92,7 @@ + * @return abs of value + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object abs(final Object self, final Object x) { ++ public static double abs(final Object self, final Object x) { + return Math.abs(JSType.toNumber(x)); + } + +@@ -144,7 +144,7 @@ + * @return acos of argument + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object acos(final Object self, final Object x) { ++ public static double acos(final Object self, final Object x) { + return Math.acos(JSType.toNumber(x)); + } + +@@ -170,7 +170,7 @@ + * @return asin of argument + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object asin(final Object self, final Object x) { ++ public static double asin(final Object self, final Object x) { + return Math.asin(JSType.toNumber(x)); + } + +@@ -196,7 +196,7 @@ + * @return atan of argument + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object atan(final Object self, final Object x) { ++ public static double atan(final Object self, final Object x) { + return Math.atan(JSType.toNumber(x)); + } + +@@ -223,7 +223,7 @@ + * @return atan2 of x and y + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object atan2(final Object self, final Object y, final Object x) { ++ public static double atan2(final Object self, final Object y, final Object x) { + return Math.atan2(JSType.toNumber(y), JSType.toNumber(x)); + } + +@@ -250,7 +250,7 @@ + * @return ceil of argument + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object ceil(final Object self, final Object x) { ++ public static double ceil(final Object self, final Object x) { + return Math.ceil(JSType.toNumber(x)); + } + +@@ -302,7 +302,7 @@ + * @return cos of argument + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object cos(final Object self, final Object x) { ++ public static double cos(final Object self, final Object x) { + return Math.cos(JSType.toNumber(x)); + } + +@@ -328,7 +328,7 @@ + * @return exp of argument + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object exp(final Object self, final Object x) { ++ public static double exp(final Object self, final Object x) { + return Math.exp(JSType.toNumber(x)); + } + +@@ -341,7 +341,7 @@ + * @return floor of argument + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object floor(final Object self, final Object x) { ++ public static double floor(final Object self, final Object x) { + return Math.floor(JSType.toNumber(x)); + } + +@@ -393,7 +393,7 @@ + * @return log of argument + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object log(final Object self, final Object x) { ++ public static double log(final Object self, final Object x) { + return Math.log(JSType.toNumber(x)); + } + +@@ -419,7 +419,7 @@ + * @return the largest of the arguments, {@link Double#NEGATIVE_INFINITY} if no args given, or identity if one arg is given + */ + @Function(arity = 2, attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object max(final Object self, final Object... args) { ++ public static double max(final Object self, final Object... args) { + switch (args.length) { + case 0: + return Double.NEGATIVE_INFINITY; +@@ -497,7 +497,7 @@ + * @return the smallest of the arguments, {@link Double#NEGATIVE_INFINITY} if no args given, or identity if one arg is given + */ + @Function(arity = 2, attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object min(final Object self, final Object... args) { ++ public static double min(final Object self, final Object... args) { + switch (args.length) { + case 0: + return Double.POSITIVE_INFINITY; +@@ -576,7 +576,7 @@ + * @return x raised to the power of y + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object pow(final Object self, final Object x, final Object y) { ++ public static double pow(final Object self, final Object x, final Object y) { + return Math.pow(JSType.toNumber(x), JSType.toNumber(y)); + } + +@@ -602,7 +602,7 @@ + * @return random number in the range [0..1) + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object random(final Object self) { ++ public static double random(final Object self) { + return Math.random(); + } + +@@ -615,7 +615,7 @@ + * @return x rounded + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object round(final Object self, final Object x) { ++ public static double round(final Object self, final Object x) { + final double d = JSType.toNumber(x); + if (Math.getExponent(d) >= 52) { + return d; +@@ -632,7 +632,7 @@ + * @return sin of x + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object sin(final Object self, final Object x) { ++ public static double sin(final Object self, final Object x) { + return Math.sin(JSType.toNumber(x)); + } + +@@ -658,7 +658,7 @@ + * @return sqrt of x + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object sqrt(final Object self, final Object x) { ++ public static double sqrt(final Object self, final Object x) { + return Math.sqrt(JSType.toNumber(x)); + } + +@@ -684,7 +684,7 @@ + * @return tan of x + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where=Where.CONSTRUCTOR) +- public static Object tan(final Object self, final Object x) { ++ public static double tan(final Object self, final Object x) { + return Math.tan(JSType.toNumber(x)); + } + +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeNumber.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeNumber.java Wed Jul 30 03:55:26 2014 -0700 +@@ -34,6 +34,7 @@ + + import java.lang.invoke.MethodHandle; + import java.lang.invoke.MethodHandles; ++import java.lang.invoke.MethodType; + import java.text.NumberFormat; + import java.util.Locale; + import jdk.internal.dynalink.linker.GuardedInvocation; +@@ -57,7 +58,10 @@ + @ScriptClass("Number") + public final class NativeNumber extends ScriptObject { + +- static final MethodHandle WRAPFILTER = findWrapFilter(); ++ // Method handle to create an object wrapper for a primitive number ++ private static final MethodHandle WRAPFILTER = findOwnMH("wrapFilter", MH.type(NativeNumber.class, Object.class)); ++ // Method handle to retrieve the Number prototype object ++ private static final MethodHandle PROTOFILTER = findOwnMH("protoFilter", MH.type(Object.class, Object.class)); + + /** ECMA 15.7.3.2 largest positive finite value */ + @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT, where = Where.CONSTRUCTOR) +@@ -86,10 +90,6 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + private NativeNumber(final double value, final ScriptObject proto, final PropertyMap map) { + super(proto, map); + this.value = value; +@@ -98,7 +98,7 @@ + } + + NativeNumber(final double value, final Global global) { +- this(value, global.getNumberPrototype(), global.getNumberMap()); ++ this(value, global.getNumberPrototype(), $nasgenmap$); + } + + private NativeNumber(final double value) { +@@ -185,7 +185,7 @@ + * @return number in decimal fixed point notation + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toFixed(final Object self, final Object fractionDigits) { ++ public static String toFixed(final Object self, final Object fractionDigits) { + final int f = JSType.toInteger(fractionDigits); + if (f < 0 || f > 20) { + throw rangeError("invalid.fraction.digits", "toFixed"); +@@ -217,7 +217,7 @@ + * @return number in decimal exponential notation + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toExponential(final Object self, final Object fractionDigits) { ++ public static String toExponential(final Object self, final Object fractionDigits) { + final double x = getNumberValue(self); + final boolean trimZeros = fractionDigits == UNDEFINED; + final int f = trimZeros ? 16 : JSType.toInteger(fractionDigits); +@@ -245,7 +245,7 @@ + * @return number in decimal exponentiation notation or decimal fixed notation depending on {@code precision} + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toPrecision(final Object self, final Object precision) { ++ public static String toPrecision(final Object self, final Object precision) { + final double x = getNumberValue(self); + if (precision == UNDEFINED) { + return JSType.toString(x); +@@ -278,7 +278,7 @@ + * @return string representation of this Number in the given radix + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toString(final Object self, final Object radix) { ++ public static String toString(final Object self, final Object radix) { + if (radix != UNDEFINED) { + final int intRadix = JSType.toInteger(radix); + if (intRadix != 10) { +@@ -299,7 +299,7 @@ + * @return localized string for this Number + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toLocaleString(final Object self) { ++ public static String toLocaleString(final Object self) { + return JSType.toString(getNumberValue(self)); + } + +@@ -308,10 +308,10 @@ + * ECMA 15.7.4.4 Number.prototype.valueOf ( ) + * + * @param self self reference +- * @return boxed number value for this Number ++ * @return number value for this Number + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object valueOf(final Object self) { ++ public static double valueOf(final Object self) { + return getNumberValue(self); + } + +@@ -322,7 +322,7 @@ + * @return Link to be invoked at call site. + */ + public static GuardedInvocation lookupPrimitive(final LinkRequest request, final Object receiver) { +- return PrimitiveLookup.lookupPrimitive(request, Number.class, new NativeNumber(((Number)receiver).doubleValue()), WRAPFILTER); ++ return PrimitiveLookup.lookupPrimitive(request, Number.class, new NativeNumber(((Number)receiver).doubleValue()), WRAPFILTER, PROTOFILTER); + } + + @SuppressWarnings("unused") +@@ -330,6 +330,11 @@ + return new NativeNumber(((Number)receiver).doubleValue()); + } + ++ @SuppressWarnings("unused") ++ private static Object protoFilter(final Object object) { ++ return Global.instance().getNumberPrototype(); ++ } ++ + private static double getNumberValue(final Object self) { + if (self instanceof Number) { + return ((Number)self).doubleValue(); +@@ -378,7 +383,7 @@ + return str; + } + +- private static MethodHandle findWrapFilter() { +- return MH.findStatic(MethodHandles.lookup(), NativeNumber.class, "wrapFilter", MH.type(NativeNumber.class, Object.class)); ++ private static MethodHandle findOwnMH(final String name, final MethodType type) { ++ return MH.findStatic(MethodHandles.lookup(), NativeNumber.class, name, type); + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeObject.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeObject.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,12 +25,14 @@ + + package jdk.nashorn.internal.objects; + ++import static jdk.nashorn.internal.lookup.Lookup.MH; + import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; + import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; + + import java.lang.invoke.MethodHandle; + import java.lang.invoke.MethodHandles; + import java.lang.invoke.MethodType; ++import java.nio.ByteBuffer; + import java.util.ArrayList; + import java.util.Collection; + import java.util.HashSet; +@@ -58,6 +60,7 @@ + import jdk.nashorn.internal.runtime.PropertyMap; + import jdk.nashorn.internal.runtime.ScriptObject; + import jdk.nashorn.internal.runtime.ScriptRuntime; ++import jdk.nashorn.internal.runtime.arrays.ArrayData; + import jdk.nashorn.internal.runtime.linker.Bootstrap; + import jdk.nashorn.internal.runtime.linker.InvokeByName; + import jdk.nashorn.internal.runtime.linker.NashornBeansLinker; +@@ -72,6 +75,9 @@ + */ + @ScriptClass("Object") + public final class NativeObject { ++ public static final MethodHandle GET__PROTO__ = findOwnMH("get__proto__", ScriptObject.class, Object.class); ++ public static final MethodHandle SET__PROTO__ = findOwnMH("set__proto__", Object.class, Object.class, Object.class); ++ + private static final Object TO_STRING = new Object(); + + private static InvokeByName getTO_STRING() { +@@ -84,6 +90,35 @@ + }); + } + ++ @SuppressWarnings("unused") ++ private static ScriptObject get__proto__(final Object self) { ++ // See ES6 draft spec: B.2.2.1.1 get Object.prototype.__proto__ ++ // Step 1 Let O be the result of calling ToObject passing the this. ++ final Object obj = Global.toObject(self); ++ Global.checkObject(obj); ++ final ScriptObject sobj = (ScriptObject)obj; ++ return sobj.getProto(); ++ } ++ ++ @SuppressWarnings("unused") ++ private static Object set__proto__(final Object self, final Object proto) { ++ // See ES6 draft spec: B.2.2.1.2 set Object.prototype.__proto__ ++ // Step 1 ++ Global.checkObjectCoercible(self); ++ // Step 4 ++ if (! (self instanceof ScriptObject)) { ++ return UNDEFINED; ++ } ++ ++ final ScriptObject sobj = (ScriptObject)self; ++ // __proto__ assignment ignores non-nulls and non-objects ++ // step 3: If Type(proto) is neither Object nor Null, then return undefined. ++ if (proto == null || proto instanceof ScriptObject) { ++ sobj.setPrototypeOf(proto); ++ } ++ return UNDEFINED; ++ } ++ + private static final MethodType MIRROR_GETTER_TYPE = MethodType.methodType(Object.class, ScriptObjectMirror.class); + private static final MethodType MIRROR_SETTER_TYPE = MethodType.methodType(Object.class, ScriptObjectMirror.class, Object.class); + +@@ -101,6 +136,27 @@ + } + + /** ++ * Nashorn extension: setIndexedPropertiesToExternalArrayData ++ * ++ * @param self self reference ++ * @param obj object whose index properties are backed by buffer ++ * @param buf external buffer - should be a nio ByteBuffer ++ * @return the 'obj' object ++ */ ++ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) ++ public static ScriptObject setIndexedPropertiesToExternalArrayData(final Object self, final Object obj, final Object buf) { ++ Global.checkObject(obj); ++ final ScriptObject sobj = (ScriptObject)obj; ++ if (buf instanceof ByteBuffer) { ++ sobj.setArray(ArrayData.allocate((ByteBuffer)buf)); ++ } else { ++ throw typeError("not.a.bytebuffer", "setIndexedPropertiesToExternalArrayData's buf argument"); ++ } ++ return sobj; ++ } ++ ++ ++ /** + * ECMA 15.2.3.2 Object.getPrototypeOf ( O ) + * + * @param self self reference +@@ -137,7 +193,7 @@ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) + public static Object setPrototypeOf(final Object self, final Object obj, final Object proto) { + if (obj instanceof ScriptObject) { +- ((ScriptObject)obj).setProtoCheck(proto); ++ ((ScriptObject)obj).setPrototypeOf(proto); + return obj; + } else if (obj instanceof ScriptObjectMirror) { + ((ScriptObjectMirror)obj).setProto(proto); +@@ -180,7 +236,7 @@ + * @return array of property names + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object getOwnPropertyNames(final Object self, final Object obj) { ++ public static ScriptObject getOwnPropertyNames(final Object self, final Object obj) { + if (obj instanceof ScriptObject) { + return new NativeArray(((ScriptObject)obj).getOwnKeys(true)); + } else if (obj instanceof ScriptObjectMirror) { +@@ -199,7 +255,7 @@ + * @return object created + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object create(final Object self, final Object proto, final Object props) { ++ public static ScriptObject create(final Object self, final Object proto, final Object props) { + if (proto != null) { + Global.checkObject(proto); + } +@@ -225,10 +281,11 @@ + * @return object + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object defineProperty(final Object self, final Object obj, final Object prop, final Object attr) { ++ public static ScriptObject defineProperty(final Object self, final Object obj, final Object prop, final Object attr) { + Global.checkObject(obj); +- ((ScriptObject)obj).defineOwnProperty(JSType.toString(prop), attr, true); +- return obj; ++ final ScriptObject sobj = (ScriptObject)obj; ++ sobj.defineOwnProperty(JSType.toString(prop), attr, true); ++ return sobj; + } + + /** +@@ -240,7 +297,7 @@ + * @return object + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object defineProperties(final Object self, final Object obj, final Object props) { ++ public static ScriptObject defineProperties(final Object self, final Object obj, final Object props) { + Global.checkObject(obj); + + final ScriptObject sobj = (ScriptObject)obj; +@@ -319,7 +376,7 @@ + * @return true if sealed, false otherwise + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object isSealed(final Object self, final Object obj) { ++ public static boolean isSealed(final Object self, final Object obj) { + if (obj instanceof ScriptObject) { + return ((ScriptObject)obj).isSealed(); + } else if (obj instanceof ScriptObjectMirror) { +@@ -337,7 +394,7 @@ + * @return true if object is frozen, false otherwise + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object isFrozen(final Object self, final Object obj) { ++ public static boolean isFrozen(final Object self, final Object obj) { + if (obj instanceof ScriptObject) { + return ((ScriptObject)obj).isFrozen(); + } else if (obj instanceof ScriptObjectMirror) { +@@ -355,7 +412,7 @@ + * @return true if object is extensible, false otherwise + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object isExtensible(final Object self, final Object obj) { ++ public static boolean isExtensible(final Object self, final Object obj) { + if (obj instanceof ScriptObject) { + return ((ScriptObject)obj).isExtensible(); + } else if (obj instanceof ScriptObjectMirror) { +@@ -373,7 +430,7 @@ + * @return array of keys in object + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) +- public static Object keys(final Object self, final Object obj) { ++ public static ScriptObject keys(final Object self, final Object obj) { + if (obj instanceof ScriptObject) { + final ScriptObject sobj = (ScriptObject)obj; + return new NativeArray(sobj.getOwnKeys(false)); +@@ -430,7 +487,7 @@ + * @return ToString of object + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toString(final Object self) { ++ public static String toString(final Object self) { + return ScriptRuntime.builtinObjectToString(self); + } + +@@ -483,7 +540,7 @@ + * @return true if property exists in object + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object hasOwnProperty(final Object self, final Object v) { ++ public static boolean hasOwnProperty(final Object self, final Object v) { + // Convert ScriptObjects to primitive with String.class hint + // but no need to convert other primitives to string. + final Object key = JSType.toPrimitive(v, String.class); +@@ -500,7 +557,7 @@ + * @return true if object is prototype of v + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object isPrototypeOf(final Object self, final Object v) { ++ public static boolean isPrototypeOf(final Object self, final Object v) { + if (!(v instanceof ScriptObject)) { + return false; + } +@@ -526,7 +583,7 @@ + * @return true if property is enumerable + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object propertyIsEnumerable(final Object self, final Object v) { ++ public static boolean propertyIsEnumerable(final Object self, final Object v) { + final String str = JSType.toString(v); + final Object obj = Global.toObject(self); + +@@ -753,4 +810,8 @@ + return new LinkRequestImpl(CallSiteDescriptorFactory.create(MethodHandles.publicLookup(), operation, + methodType), false, source); + } ++ ++ private static MethodHandle findOwnMH(final String name, final Class rtype, final Class... types) { ++ return MH.findStatic(MethodHandles.lookup(), NativeObject.class, name, MH.type(rtype, types)); ++ } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeRangeError.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeRangeError.java Wed Jul 30 03:55:26 2014 -0700 +@@ -44,7 +44,7 @@ + public final class NativeRangeError extends ScriptObject { + + /** message property in instance */ +- @Property(name = NativeError.MESSAGE) ++ @Property(name = NativeError.MESSAGE, attributes = Attribute.NOT_ENUMERABLE) + public Object instMessage; + + /** error name property */ +@@ -55,13 +55,14 @@ + @Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE) + public Object message; + ++ /** Nashorn extension: underlying exception */ ++ @Property(attributes = Attribute.NOT_ENUMERABLE) ++ public Object nashornException; ++ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- ++ @SuppressWarnings("LeakingThisInConstructor") + private NativeRangeError(final Object msg, final ScriptObject proto, final PropertyMap map) { + super(proto, map); + if (msg != UNDEFINED) { +@@ -69,10 +70,11 @@ + } else { + this.delete(NativeError.MESSAGE, false); + } ++ NativeError.initException(this); + } + + NativeRangeError(final Object msg, final Global global) { +- this(msg, global.getRangeErrorPrototype(), global.getRangeErrorMap()); ++ this(msg, global.getRangeErrorPrototype(), $nasgenmap$); + } + + private NativeRangeError(final Object msg) { +@@ -96,7 +98,7 @@ + * @return new RangeError + */ + @Constructor(name = "RangeError") +- public static Object constructor(final boolean newObj, final Object self, final Object msg) { ++ public static NativeRangeError constructor(final boolean newObj, final Object self, final Object msg) { + return new NativeRangeError(msg); + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeReferenceError.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeReferenceError.java Wed Jul 30 03:55:26 2014 -0700 +@@ -44,7 +44,7 @@ + public final class NativeReferenceError extends ScriptObject { + + /** message property in instance */ +- @Property(name = NativeError.MESSAGE) ++ @Property(name = NativeError.MESSAGE, attributes = Attribute.NOT_ENUMERABLE) + public Object instMessage; + + /** error name property */ +@@ -55,13 +55,14 @@ + @Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE) + public Object message; + ++ /** Nashorn extension: underlying exception */ ++ @Property(attributes = Attribute.NOT_ENUMERABLE) ++ public Object nashornException; ++ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- ++ @SuppressWarnings("LeakingThisInConstructor") + private NativeReferenceError(final Object msg, final ScriptObject proto, final PropertyMap map) { + super(proto, map); + if (msg != UNDEFINED) { +@@ -69,10 +70,11 @@ + } else { + this.delete(NativeError.MESSAGE, false); + } ++ NativeError.initException(this); + } + + NativeReferenceError(final Object msg, final Global global) { +- this(msg, global.getReferenceErrorPrototype(), global.getReferenceErrorMap()); ++ this(msg, global.getReferenceErrorPrototype(), $nasgenmap$); + } + + private NativeReferenceError(final Object msg) { +@@ -96,7 +98,7 @@ + * @return new ReferenceError + */ + @Constructor(name = "ReferenceError") +- public static Object constructor(final boolean newObj, final Object self, final Object msg) { ++ public static NativeReferenceError constructor(final boolean newObj, final Object self, final Object msg) { + return new NativeReferenceError(msg); + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java Wed Jul 30 03:55:26 2014 -0700 +@@ -70,12 +70,8 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + private NativeRegExp(final Global global) { +- super(global.getRegExpPrototype(), global.getRegExpMap()); ++ super(global.getRegExpPrototype(), $nasgenmap$); + this.globalObject = global; + } + +@@ -126,7 +122,7 @@ + * @return new NativeRegExp + */ + @Constructor(arity = 2) +- public static Object constructor(final boolean isNew, final Object self, final Object... args) { ++ public static NativeRegExp constructor(final boolean isNew, final Object self, final Object... args) { + if (args.length > 1) { + return newRegExp(args[0], args[1]); + } else if (args.length > 0) { +@@ -146,7 +142,7 @@ + * @return new NativeRegExp + */ + @SpecializedConstructor +- public static Object constructor(final boolean isNew, final Object self) { ++ public static NativeRegExp constructor(final boolean isNew, final Object self) { + return new NativeRegExp("", ""); + } + +@@ -161,7 +157,7 @@ + * @return new NativeRegExp + */ + @SpecializedConstructor +- public static Object constructor(final boolean isNew, final Object self, final Object pattern) { ++ public static NativeRegExp constructor(final boolean isNew, final Object self, final Object pattern) { + return newRegExp(pattern, UNDEFINED); + } + +@@ -177,7 +173,7 @@ + * @return new NativeRegExp + */ + @SpecializedConstructor +- public static Object constructor(final boolean isNew, final Object self, final Object pattern, final Object flags) { ++ public static NativeRegExp constructor(final boolean isNew, final Object self, final Object pattern, final Object flags) { + return newRegExp(pattern, flags); + } + +@@ -287,7 +283,7 @@ + * @return new NativeRegExp + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object compile(final Object self, final Object pattern, final Object flags) { ++ public static ScriptObject compile(final Object self, final Object pattern, final Object flags) { + final NativeRegExp regExp = checkRegExp(self); + final NativeRegExp compiled = newRegExp(pattern, flags); + // copy over regexp to 'self' +@@ -306,7 +302,7 @@ + * @return array containing the matches or {@code null} if no match + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object exec(final Object self, final Object string) { ++ public static ScriptObject exec(final Object self, final Object string) { + return checkRegExp(self).exec(JSType.toString(string)); + } + +@@ -318,7 +314,7 @@ + * @return true if matches found, false otherwise + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object test(final Object self, final Object string) { ++ public static boolean test(final Object self, final Object string) { + return checkRegExp(self).test(JSType.toString(string)); + } + +@@ -329,7 +325,7 @@ + * @return string version of regexp + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toString(final Object self) { ++ public static String toString(final Object self) { + return checkRegExp(self).toString(); + } + +@@ -622,7 +618,7 @@ + * @param string String to match. + * @return NativeArray of matches, string or null. + */ +- public Object exec(final String string) { ++ public NativeRegExpExecResult exec(final String string) { + final RegExpResult match = execInner(string); + + if (match == null) { +@@ -639,7 +635,7 @@ + * @param string String to match. + * @return True if a match is found. + */ +- public Object test(final String string) { ++ public boolean test(final String string) { + return execInner(string) != null; + } + +@@ -653,7 +649,7 @@ + * @param replacement Replacement string. + * @return String with substitutions. + */ +- Object replace(final String string, final String replacement, final ScriptFunction function) { ++ String replace(final String string, final String replacement, final ScriptFunction function) { + final RegExpMatcher matcher = regexp.match(string); + + if (matcher == null) { +@@ -735,6 +731,12 @@ + if (nextChar == '$') { + // Skip past $ + cursor++; ++ if (cursor == replacement.length()) { ++ // nothing after "$" ++ sb.append('$'); ++ break; ++ } ++ + nextChar = replacement.charAt(cursor); + final int firstDigit = nextChar - '0'; + +@@ -808,7 +810,7 @@ + * @param limit Split limit. + * @return Array of substrings. + */ +- Object split(final String string, final long limit) { ++ NativeArray split(final String string, final long limit) { + if (limit == 0L) { + return new NativeArray(); + } +@@ -871,7 +873,7 @@ + * @param string String to match. + * @return Index of match. + */ +- Object search(final String string) { ++ int search(final String string) { + final RegExpResult match = execInner(string); + + if (match == null) { +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeRegExpExecResult.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeRegExpExecResult.java Wed Jul 30 03:55:26 2014 -0700 +@@ -53,12 +53,8 @@ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + NativeRegExpExecResult(final RegExpResult result, final Global global) { +- super(global.getArrayPrototype(), global.getRegExpExecResultMap()); ++ super(global.getArrayPrototype(), $nasgenmap$); + setIsArray(); + this.setArray(ArrayData.allocate(result.getGroups().clone())); + this.index = result.getIndex(); +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeStrictArguments.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeStrictArguments.java Wed Jul 30 03:55:26 2014 -0700 +@@ -60,9 +60,9 @@ + // In strict mode, the caller and callee properties should throw TypeError + // Need to add properties directly to map since slots are assigned speculatively by newUserAccessors. + final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE; +- map = map.addProperty(map.newUserAccessors("caller", flags)); +- map = map.addProperty(map.newUserAccessors("callee", flags)); +- map$ = map.setIsShared(); ++ map = map.addPropertyNoHistory(map.newUserAccessors("caller", flags)); ++ map = map.addPropertyNoHistory(map.newUserAccessors("callee", flags)); ++ map$ = map; + } + + static PropertyMap getInitialMap() { +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeString.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeString.java Wed Jul 30 03:55:26 2014 -0700 +@@ -32,6 +32,7 @@ + + import java.lang.invoke.MethodHandle; + import java.lang.invoke.MethodHandles; ++import java.lang.invoke.MethodType; + import java.text.Collator; + import java.util.ArrayList; + import java.util.Arrays; +@@ -69,21 +70,20 @@ + + private final CharSequence value; + +- static final MethodHandle WRAPFILTER = findWrapFilter(); ++ // Method handle to create an object wrapper for a primitive string ++ private static final MethodHandle WRAPFILTER = findOwnMH("wrapFilter", MH.type(NativeString.class, Object.class)); ++ // Method handle to retrieve the String prototype object ++ private static final MethodHandle PROTOFILTER = findOwnMH("protoFilter", MH.type(Object.class, Object.class)); + + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- + private NativeString(final CharSequence value) { + this(value, Global.instance()); + } + + NativeString(final CharSequence value, final Global global) { +- this(value, global.getStringPrototype(), global.getStringMap()); ++ this(value, global.getStringPrototype(), $nasgenmap$); + } + + private NativeString(final CharSequence value, final ScriptObject proto, final PropertyMap map) { +@@ -425,7 +425,7 @@ + * @return string with arguments translated to charcodes + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1, where = Where.CONSTRUCTOR) +- public static Object fromCharCode(final Object self, final Object... args) { ++ public static String fromCharCode(final Object self, final Object... args) { + final char[] buf = new char[args.length]; + int index = 0; + for (final Object arg : args) { +@@ -441,7 +441,7 @@ + * @return string with one charcode + */ + @SpecializedFunction +- public static Object fromCharCode(final Object self, final Object value) { ++ public static String fromCharCode(final Object self, final Object value) { + try { + return "" + (char)JSType.toUint16(((Number)value).doubleValue()); + } catch (final ClassCastException e) { +@@ -456,7 +456,7 @@ + * @return string with one charcode + */ + @SpecializedFunction +- public static Object fromCharCode(final Object self, final int value) { ++ public static String fromCharCode(final Object self, final int value) { + return "" + (char)(value & 0xffff); + } + +@@ -467,7 +467,7 @@ + * @return string with one charcode + */ + @SpecializedFunction +- public static Object fromCharCode(final Object self, final long value) { ++ public static String fromCharCode(final Object self, final long value) { + return "" + (char)((int)value & 0xffff); + } + +@@ -478,7 +478,7 @@ + * @return string with one charcode + */ + @SpecializedFunction +- public static Object fromCharCode(final Object self, final double value) { ++ public static String fromCharCode(final Object self, final double value) { + return "" + (char)JSType.toUint16(value); + } + +@@ -488,7 +488,7 @@ + * @return self as string + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toString(final Object self) { ++ public static String toString(final Object self) { + return getString(self); + } + +@@ -498,7 +498,7 @@ + * @return self as string + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object valueOf(final Object self) { ++ public static String valueOf(final Object self) { + return getString(self); + } + +@@ -509,7 +509,7 @@ + * @return string representing the char at the given position + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object charAt(final Object self, final Object pos) { ++ public static String charAt(final Object self, final Object pos) { + return charAtImpl(checkObjectToString(self), JSType.toInteger(pos)); + } + +@@ -546,7 +546,7 @@ + * @return number representing charcode at position + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object charCodeAt(final Object self, final Object pos) { ++ public static double charCodeAt(final Object self, final Object pos) { + return charCodeAtImpl(checkObjectToString(self), JSType.toInteger(pos)); + } + +@@ -601,7 +601,7 @@ + * @return position of first match or -1 + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object indexOf(final Object self, final Object search, final Object pos) { ++ public static int indexOf(final Object self, final Object search, final Object pos) { + final String str = checkObjectToString(self); + return str.indexOf(JSType.toString(search), JSType.toInteger(pos)); + } +@@ -649,7 +649,7 @@ + * @return last position of match or -1 + */ + @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1) +- public static Object lastIndexOf(final Object self, final Object search, final Object pos) { ++ public static int lastIndexOf(final Object self, final Object search, final Object pos) { + + final String str = checkObjectToString(self); + final String searchStr = JSType.toString(search); +@@ -680,7 +680,7 @@ + * @return result of locale sensitive comparison operation between {@code self} and {@code that} + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object localeCompare(final Object self, final Object that) { ++ public static double localeCompare(final Object self, final Object that) { + + final String str = checkObjectToString(self); + final Collator collator = Collator.getInstance(Global.getEnv()._locale); +@@ -698,7 +698,7 @@ + * @return array of regexp matches + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object match(final Object self, final Object regexp) { ++ public static ScriptObject match(final Object self, final Object regexp) { + + final String str = checkObjectToString(self); + +@@ -745,7 +745,7 @@ + * @return string after replacement + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object replace(final Object self, final Object string, final Object replacement) { ++ public static String replace(final Object self, final Object string, final Object replacement) { + + final String str = checkObjectToString(self); + +@@ -771,7 +771,7 @@ + * @return offset where match occurred + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object search(final Object self, final Object string) { ++ public static int search(final Object self, final Object string) { + + final String str = checkObjectToString(self); + final NativeRegExp nativeRegExp = Global.toRegExp(string == UNDEFINED ? "" : string); +@@ -788,7 +788,7 @@ + * @return sliced out substring + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object slice(final Object self, final Object start, final Object end) { ++ public static String slice(final Object self, final Object start, final Object end) { + + final String str = checkObjectToString(self); + if (end == UNDEFINED) { +@@ -805,7 +805,7 @@ + * @return sliced out substring + */ + @SpecializedFunction +- public static Object slice(final Object self, final int start) { ++ public static String slice(final Object self, final int start) { + final String str = checkObjectToString(self); + final int from = (start < 0) ? Math.max(str.length() + start, 0) : Math.min(start, str.length()); + +@@ -820,7 +820,7 @@ + * @return sliced out substring + */ + @SpecializedFunction +- public static Object slice(final Object self, final double start) { ++ public static String slice(final Object self, final double start) { + return slice(self, (int)start); + } + +@@ -833,7 +833,7 @@ + * @return sliced out substring + */ + @SpecializedFunction +- public static Object slice(final Object self, final int start, final int end) { ++ public static String slice(final Object self, final int start, final int end) { + + final String str = checkObjectToString(self); + final int len = str.length(); +@@ -853,7 +853,7 @@ + * @return sliced out substring + */ + @SpecializedFunction +- public static Object slice(final Object self, final double start, final double end) { ++ public static String slice(final Object self, final double start, final double end) { + return slice(self, (int)start, (int)end); + } + +@@ -866,7 +866,7 @@ + * @return array object in which splits have been placed + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object split(final Object self, final Object separator, final Object limit) { ++ public static ScriptObject split(final Object self, final Object separator, final Object limit) { + final String str = checkObjectToString(self); + final long lim = (limit == UNDEFINED) ? JSType.MAX_UINT : JSType.toUint32(limit); + +@@ -882,7 +882,7 @@ + return splitString(str, JSType.toString(separator), lim); + } + +- private static Object splitString(String str, String separator, long limit) { ++ private static ScriptObject splitString(String str, String separator, long limit) { + if (separator.isEmpty()) { + final int length = (int) Math.min(str.length(), limit); + final Object[] array = new Object[length]; +@@ -923,7 +923,7 @@ + * @return substring given start and length of section + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object substr(final Object self, final Object start, final Object length) { ++ public static String substr(final Object self, final Object start, final Object length) { + final String str = JSType.toString(self); + final int strLength = str.length(); + +@@ -946,7 +946,7 @@ + * @return substring given start and end indexes + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object substring(final Object self, final Object start, final Object end) { ++ public static String substring(final Object self, final Object start, final Object end) { + + final String str = checkObjectToString(self); + if (end == UNDEFINED) { +@@ -1026,7 +1026,7 @@ + * @return string to lower case + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toLowerCase(final Object self) { ++ public static String toLowerCase(final Object self) { + return checkObjectToString(self).toLowerCase(Locale.ROOT); + } + +@@ -1036,7 +1036,7 @@ + * @return string to locale sensitive lower case + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toLocaleLowerCase(final Object self) { ++ public static String toLocaleLowerCase(final Object self) { + return checkObjectToString(self).toLowerCase(Global.getEnv()._locale); + } + +@@ -1046,7 +1046,7 @@ + * @return string to upper case + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toUpperCase(final Object self) { ++ public static String toUpperCase(final Object self) { + return checkObjectToString(self).toUpperCase(Locale.ROOT); + } + +@@ -1056,7 +1056,7 @@ + * @return string to locale sensitive upper case + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object toLocaleUpperCase(final Object self) { ++ public static String toLocaleUpperCase(final Object self) { + return checkObjectToString(self).toUpperCase(Global.getEnv()._locale); + } + +@@ -1066,7 +1066,7 @@ + * @return string trimmed from whitespace + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object trim(final Object self) { ++ public static String trim(final Object self) { + + final String str = checkObjectToString(self); + int start = 0; +@@ -1088,7 +1088,7 @@ + * @return string trimmed left from whitespace + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object trimLeft(final Object self) { ++ public static String trimLeft(final Object self) { + + final String str = checkObjectToString(self); + int start = 0; +@@ -1107,7 +1107,7 @@ + * @return string trimmed right from whitespace + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- public static Object trimRight(final Object self) { ++ public static String trimRight(final Object self) { + + final String str = checkObjectToString(self); + int start = 0; +@@ -1120,7 +1120,7 @@ + return str.substring(start, end + 1); + } + +- private static Object newObj(final Object self, final CharSequence str) { ++ private static ScriptObject newObj(final Object self, final CharSequence str) { + return new NativeString(str); + } + +@@ -1199,7 +1199,7 @@ + */ + public static GuardedInvocation lookupPrimitive(final LinkRequest request, final Object receiver) { + final MethodHandle guard = NashornGuards.getInstanceOf2Guard(String.class, ConsString.class); +- return PrimitiveLookup.lookupPrimitive(request, guard, new NativeString((CharSequence)receiver), WRAPFILTER); ++ return PrimitiveLookup.lookupPrimitive(request, guard, new NativeString((CharSequence)receiver), WRAPFILTER, PROTOFILTER); + } + + @SuppressWarnings("unused") +@@ -1207,6 +1207,11 @@ + return new NativeString((CharSequence)receiver); + } + ++ @SuppressWarnings("unused") ++ private static Object protoFilter(final Object object) { ++ return Global.instance().getStringPrototype(); ++ } ++ + private static CharSequence getCharSequence(final Object self) { + if (self instanceof String || self instanceof ConsString) { + return (CharSequence)self; +@@ -1254,7 +1259,7 @@ + return key >= 0 && key < value.length(); + } + +- private static MethodHandle findWrapFilter() { +- return MH.findStatic(MethodHandles.lookup(), NativeString.class, "wrapFilter", MH.type(NativeString.class, Object.class)); ++ private static MethodHandle findOwnMH(final String name, final MethodType type) { ++ return MH.findStatic(MethodHandles.lookup(), NativeString.class, name, type); + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeSyntaxError.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeSyntaxError.java Wed Jul 30 03:55:26 2014 -0700 +@@ -44,7 +44,7 @@ + public final class NativeSyntaxError extends ScriptObject { + + /** message property in instance */ +- @Property(name = NativeError.MESSAGE) ++ @Property(name = NativeError.MESSAGE, attributes = Attribute.NOT_ENUMERABLE) + public Object instMessage; + + /** error name property */ +@@ -55,20 +55,22 @@ + @Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE) + public Object message; + ++ /** Nashorn extension: underlying exception */ ++ @Property(attributes = Attribute.NOT_ENUMERABLE) ++ public Object nashornException; ++ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- ++ @SuppressWarnings("LeakingThisInConstructor") + NativeSyntaxError(final Object msg, final Global global) { +- super(global.getSyntaxErrorPrototype(), global.getSyntaxErrorMap()); ++ super(global.getSyntaxErrorPrototype(), $nasgenmap$); + if (msg != UNDEFINED) { + this.instMessage = JSType.toString(msg); + } else { + this.delete(NativeError.MESSAGE, false); + } ++ NativeError.initException(this); + } + + private NativeSyntaxError(final Object msg) { +@@ -92,7 +94,7 @@ + * @return new SyntaxError + */ + @Constructor(name = "SyntaxError") +- public static Object constructor(final boolean newObj, final Object self, final Object msg) { ++ public static NativeSyntaxError constructor(final boolean newObj, final Object self, final Object msg) { + return new NativeSyntaxError(msg); + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeTypeError.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeTypeError.java Wed Jul 30 03:55:26 2014 -0700 +@@ -44,7 +44,7 @@ + public final class NativeTypeError extends ScriptObject { + + /** message property in instance */ +- @Property(name = NativeError.MESSAGE) ++ @Property(name = NativeError.MESSAGE, attributes = Attribute.NOT_ENUMERABLE) + public Object instMessage; + + /** error name property */ +@@ -55,20 +55,22 @@ + @Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE) + public Object message; + ++ /** Nashorn extension: underlying exception */ ++ @Property(attributes = Attribute.NOT_ENUMERABLE) ++ public Object nashornException; ++ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- ++ @SuppressWarnings("LeakingThisInConstructor") + NativeTypeError(final Object msg, final Global global) { +- super(global.getTypeErrorPrototype(), global.getTypeErrorMap()); ++ super(global.getTypeErrorPrototype(), $nasgenmap$); + if (msg != UNDEFINED) { + this.instMessage = JSType.toString(msg); + } else { + delete(NativeError.MESSAGE, false); + } ++ NativeError.initException(this); + } + + private NativeTypeError(final Object msg) { +@@ -92,7 +94,7 @@ + * @return new TypeError + */ + @Constructor(name = "TypeError") +- public static Object constructor(final boolean newObj, final Object self, final Object msg) { ++ public static NativeTypeError constructor(final boolean newObj, final Object self, final Object msg) { + return new NativeTypeError(msg); + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeURIError.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeURIError.java Wed Jul 30 03:55:26 2014 -0700 +@@ -43,7 +43,7 @@ + public final class NativeURIError extends ScriptObject { + + /** message property in instance */ +- @Property(name = NativeError.MESSAGE) ++ @Property(name = NativeError.MESSAGE, attributes = Attribute.NOT_ENUMERABLE) + public Object instMessage; + + /** error name property */ +@@ -54,20 +54,22 @@ + @Property(attributes = Attribute.NOT_ENUMERABLE, where = Where.PROTOTYPE) + public Object message; + ++ /** Nashorn extension: underlying exception */ ++ @Property(attributes = Attribute.NOT_ENUMERABLE) ++ public Object nashornException; ++ + // initialized by nasgen + private static PropertyMap $nasgenmap$; + +- static PropertyMap getInitialMap() { +- return $nasgenmap$; +- } +- ++ @SuppressWarnings("LeakingThisInConstructor") + NativeURIError(final Object msg, final Global global) { +- super(global.getURIErrorPrototype(), global.getURIErrorMap()); ++ super(global.getURIErrorPrototype(), $nasgenmap$); + if (msg != UNDEFINED) { + this.instMessage = JSType.toString(msg); + } else { + this.delete(NativeError.MESSAGE, false); + } ++ NativeError.initException(this); + } + + private NativeURIError(final Object msg) { +@@ -91,7 +93,7 @@ + * @return new URIError + */ + @Constructor(name = "URIError") +- public static Object constructor(final boolean newObj, final Object self, final Object msg) { ++ public static NativeURIError constructor(final boolean newObj, final Object self, final Object msg) { + return new NativeURIError(msg); + } + } +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeUint16Array.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeUint16Array.java Wed Jul 30 03:55:26 2014 -0700 +@@ -99,8 +99,8 @@ + * @return new typed array + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { +- return constructorImpl(args, FACTORY); ++ public static NativeUint16Array constructor(final boolean newObj, final Object self, final Object... args) { ++ return (NativeUint16Array)constructorImpl(args, FACTORY); + } + + NativeUint16Array(final NativeArrayBuffer buffer, final int byteOffset, final int length) { +@@ -150,8 +150,8 @@ + * @return sub array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- protected static Object subarray(final Object self, final Object begin, final Object end) { +- return ArrayBufferView.subarrayImpl(self, begin, end); ++ protected static NativeUint16Array subarray(final Object self, final Object begin, final Object end) { ++ return (NativeUint16Array)ArrayBufferView.subarrayImpl(self, begin, end); + } + + @Override +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeUint32Array.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeUint32Array.java Wed Jul 30 03:55:26 2014 -0700 +@@ -118,8 +118,8 @@ + * @return new typed array + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { +- return constructorImpl(args, FACTORY); ++ public static NativeUint32Array constructor(final boolean newObj, final Object self, final Object... args) { ++ return (NativeUint32Array)constructorImpl(args, FACTORY); + } + + NativeUint32Array(final NativeArrayBuffer buffer, final int byteOffset, final int length) { +@@ -169,8 +169,8 @@ + * @return sub array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- protected static Object subarray(final Object self, final Object begin, final Object end) { +- return ArrayBufferView.subarrayImpl(self, begin, end); ++ protected static NativeUint32Array subarray(final Object self, final Object begin, final Object end) { ++ return (NativeUint32Array)ArrayBufferView.subarrayImpl(self, begin, end); + } + + @Override +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeUint8Array.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeUint8Array.java Wed Jul 30 03:55:26 2014 -0700 +@@ -92,8 +92,8 @@ + * @return new typed array + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { +- return constructorImpl(args, FACTORY); ++ public static NativeUint8Array constructor(final boolean newObj, final Object self, final Object... args) { ++ return (NativeUint8Array)constructorImpl(args, FACTORY); + } + + NativeUint8Array(final NativeArrayBuffer buffer, final int byteOffset, final int length) { +@@ -143,8 +143,8 @@ + * @return sub array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- protected static Object subarray(final Object self, final Object begin, final Object end) { +- return ArrayBufferView.subarrayImpl(self, begin, end); ++ protected static NativeUint8Array subarray(final Object self, final Object begin, final Object end) { ++ return (NativeUint8Array)ArrayBufferView.subarrayImpl(self, begin, end); + } + + @Override +--- ./nashorn/src/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java Wed Jul 30 03:55:26 2014 -0700 +@@ -89,6 +89,15 @@ + } + + @Override ++ protected void setImpl(final int index, final long value) { ++ if (JSType.isRepresentableAsInt(value)) { ++ setImpl(index, (int)value); ++ } else { ++ buffer.getByteArray()[byteIndex(index)] = value > 0 ? (byte)0xff : 0; ++ } ++ } ++ ++ @Override + protected void setImpl(final int key, final double value) { + setImpl(key, (int)Math.rint(value)); + } +@@ -109,8 +118,8 @@ + * @return new typed array + */ + @Constructor(arity = 1) +- public static Object constructor(final boolean newObj, final Object self, final Object... args) { +- return constructorImpl(args, FACTORY); ++ public static NativeUint8ClampedArray constructor(final boolean newObj, final Object self, final Object... args) { ++ return (NativeUint8ClampedArray)constructorImpl(args, FACTORY); + } + + NativeUint8ClampedArray(final NativeArrayBuffer buffer, final int byteOffset, final int length) { +@@ -160,8 +169,8 @@ + * @return sub array + */ + @Function(attributes = Attribute.NOT_ENUMERABLE) +- protected static Object subarray(final Object self, final Object begin, final Object end) { +- return ArrayBufferView.subarrayImpl(self, begin, end); ++ protected static NativeUint8ClampedArray subarray(final Object self, final Object begin, final Object end) { ++ return (NativeUint8ClampedArray)ArrayBufferView.subarrayImpl(self, begin, end); + } + + @Override +--- ./nashorn/src/jdk/nashorn/internal/objects/PrototypeObject.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/PrototypeObject.java Wed Jul 30 03:55:26 2014 -0700 +@@ -54,16 +54,11 @@ + static { + final ArrayList properties = new ArrayList<>(1); + properties.add(AccessorProperty.create("constructor", Property.NOT_ENUMERABLE, GET_CONSTRUCTOR, SET_CONSTRUCTOR)); +- map$ = PropertyMap.newMap(properties).setIsShared(); +- } +- +- static PropertyMap getInitialMap() { +- return map$; ++ map$ = PropertyMap.newMap(properties); + } + + private PrototypeObject(final Global global, final PropertyMap map) { +- super(map != map$? map.addAll(global.getPrototypeObjectMap()) : global.getPrototypeObjectMap()); +- setProto(global.getObjectPrototype()); ++ super(global.getObjectPrototype(), map != map$? map.addAll(map$) : map$); + } + + PrototypeObject() { +--- ./nashorn/src/jdk/nashorn/internal/objects/ScriptFunctionImpl.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/objects/ScriptFunctionImpl.java Wed Jul 30 03:55:26 2014 -0700 +@@ -37,7 +37,6 @@ + import jdk.nashorn.internal.runtime.ScriptFunction; + import jdk.nashorn.internal.runtime.ScriptFunctionData; + import jdk.nashorn.internal.runtime.ScriptObject; +-import jdk.nashorn.internal.lookup.Lookup; + import jdk.nashorn.internal.runtime.AccessorProperty; + + /** +@@ -56,27 +55,11 @@ + // property map for non-strict, non-bound functions. + private static final PropertyMap map$; + +- static PropertyMap getInitialMap() { +- return map$; +- } +- +- static PropertyMap getInitialAnonymousMap() { +- return AnonymousFunction.getInitialMap(); +- } +- +- static PropertyMap getInitialStrictMap() { +- return strictmodemap$; +- } +- +- static PropertyMap getInitialBoundMap() { +- return boundfunctionmap$; +- } +- + // Marker object for lazily initialized prototype object + private static final Object LAZY_PROTOTYPE = new Object(); + + private ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final MethodHandle[] specs, final Global global) { +- super(name, invokeHandle, global.getFunctionMap(), null, specs, false, true, true); ++ super(name, invokeHandle, map$, null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR); + init(global); + } + +@@ -93,7 +76,7 @@ + } + + private ScriptFunctionImpl(final String name, final MethodHandle invokeHandle, final PropertyMap map, final MethodHandle[] specs, final Global global) { +- super(name, invokeHandle, map.addAll(global.getFunctionMap()), null, specs, false, true, true); ++ super(name, invokeHandle, map.addAll(map$), null, specs, ScriptFunctionData.IS_BUILTIN_CONSTRUCTOR); + init(global); + } + +@@ -110,8 +93,8 @@ + this(name, invokeHandle, map, specs, Global.instance()); + } + +- private ScriptFunctionImpl(final String name, final MethodHandle methodHandle, final ScriptObject scope, final MethodHandle[] specs, final boolean isStrict, final boolean isBuiltin, final boolean isConstructor, final Global global) { +- super(name, methodHandle, getMap(global, isStrict), scope, specs, isStrict, isBuiltin, isConstructor); ++ private ScriptFunctionImpl(final String name, final MethodHandle methodHandle, final ScriptObject scope, final MethodHandle[] specs, final int flags, final Global global) { ++ super(name, methodHandle, getMap(isStrict(flags)), scope, specs, flags); + init(global); + } + +@@ -122,16 +105,14 @@ + * @param methodHandle handle for invocation + * @param scope scope object + * @param specs specialized versions of this method, if available, null otherwise +- * @param isStrict are we in strict mode +- * @param isBuiltin is this a built-in function +- * @param isConstructor can the function be used as a constructor (most can; some built-ins are restricted). ++ * @param flags {@link ScriptFunctionData} flags + */ +- ScriptFunctionImpl(final String name, final MethodHandle methodHandle, final ScriptObject scope, final MethodHandle[] specs, final boolean isStrict, final boolean isBuiltin, final boolean isConstructor) { +- this(name, methodHandle, scope, specs, isStrict, isBuiltin, isConstructor, Global.instance()); ++ ScriptFunctionImpl(final String name, final MethodHandle methodHandle, final ScriptObject scope, final MethodHandle[] specs, final int flags) { ++ this(name, methodHandle, scope, specs, flags, Global.instance()); + } + + private ScriptFunctionImpl(final RecompilableScriptFunctionData data, final ScriptObject scope, final Global global) { +- super(data, getMap(global, data.isStrict()), scope); ++ super(data, getMap(data.isStrict()), scope); + init(global); + } + +@@ -151,7 +132,7 @@ + * @param global the global object + */ + ScriptFunctionImpl(final ScriptFunctionData data, final Global global) { +- super(data, global.getBoundFunctionMap(), null); ++ super(data, boundfunctionmap$, null); + init(global); + } + +@@ -163,25 +144,24 @@ + map$ = PropertyMap.newMap(properties); + strictmodemap$ = createStrictModeMap(map$); + boundfunctionmap$ = createBoundFunctionMap(strictmodemap$); +- // There are order dependencies between normal map, struct map and bound map +- // We can make these 'shared' only after initialization of all three. +- map$.setIsShared(); +- strictmodemap$.setIsShared(); +- boundfunctionmap$.setIsShared(); + } + + private static PropertyMap createStrictModeMap(final PropertyMap map) { + final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE; + PropertyMap newMap = map; + // Need to add properties directly to map since slots are assigned speculatively by newUserAccessors. +- newMap = newMap.addProperty(map.newUserAccessors("arguments", flags)); +- newMap = newMap.addProperty(map.newUserAccessors("caller", flags)); ++ newMap = newMap.addPropertyNoHistory(map.newUserAccessors("arguments", flags)); ++ newMap = newMap.addPropertyNoHistory(map.newUserAccessors("caller", flags)); + return newMap; + } + ++ private static boolean isStrict(final int flags) { ++ return (flags & ScriptFunctionData.IS_STRICT) != 0; ++ } ++ + // Choose the map based on strict mode! +- private static PropertyMap getMap(final Global global, final boolean strict) { +- return strict ? global.getStrictFunctionMap() : global.getFunctionMap(); ++ private static PropertyMap getMap(final boolean strict) { ++ return strict ? strictmodemap$ : map$; + } + + private static PropertyMap createBoundFunctionMap(final PropertyMap strictModeMap) { +@@ -193,14 +173,10 @@ + // Instance of this class is used as global anonymous function which + // serves as Function.prototype object. + private static class AnonymousFunction extends ScriptFunctionImpl { +- private static final PropertyMap anonmap$ = PropertyMap.newMap().setIsShared(); +- +- static PropertyMap getInitialMap() { +- return anonmap$; +- } ++ private static final PropertyMap anonmap$ = PropertyMap.newMap(); + + AnonymousFunction(final Global global) { +- super("", GlobalFunctions.ANONYMOUS, global.getAnonymousFunctionMap(), null); ++ super("", GlobalFunctions.ANONYMOUS, anonmap$, null); + } + } + +@@ -217,7 +193,7 @@ + * @return new ScriptFunction + */ + static ScriptFunction makeFunction(final String name, final MethodHandle methodHandle, final MethodHandle[] specs) { +- final ScriptFunctionImpl func = new ScriptFunctionImpl(name, methodHandle, null, specs, false, true, false); ++ final ScriptFunctionImpl func = new ScriptFunctionImpl(name, methodHandle, null, specs, ScriptFunctionData.IS_BUILTIN); + func.setPrototype(UNDEFINED); + // Non-constructor built-in functions do not have "prototype" property + func.deleteOwnProperty(func.getMap().findProperty("prototype")); +@@ -281,13 +257,17 @@ + } + + @Override +- public final void setPrototype(final Object prototype) { +- this.prototype = prototype; ++ public final void setPrototype(final Object newProto) { ++ if (newProto instanceof ScriptObject && newProto != this.prototype && allocatorMap != null) { ++ // Replace our current allocator map with one that is associated with the new prototype. ++ allocatorMap = allocatorMap.changeProto((ScriptObject)newProto); ++ } ++ this.prototype = newProto; + } + + // Internals below.. + private void init(final Global global) { +- this.setProto(global.getFunctionPrototype()); ++ this.setInitialProto(global.getFunctionPrototype()); + this.prototype = LAZY_PROTOTYPE; + + // We have to fill user accessor functions late as these are stored +--- ./nashorn/src/jdk/nashorn/internal/parser/AbstractParser.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/parser/AbstractParser.java Wed Jul 30 03:55:26 2014 -0700 +@@ -26,6 +26,7 @@ + package jdk.nashorn.internal.parser; + + import static jdk.nashorn.internal.parser.TokenType.COMMENT; ++import static jdk.nashorn.internal.parser.TokenType.DIRECTIVE_COMMENT; + import static jdk.nashorn.internal.parser.TokenType.EOF; + import static jdk.nashorn.internal.parser.TokenType.EOL; + import static jdk.nashorn.internal.parser.TokenType.IDENT; +@@ -84,6 +85,9 @@ + /** Is this parser running under strict mode? */ + protected boolean isStrictMode; + ++ /** //@ sourceURL or //# sourceURL */ ++ protected String sourceURL; ++ + /** + * Construct a parser. + * +@@ -156,17 +160,38 @@ + protected final TokenType nextOrEOL() { + do { + nextToken(); +- } while (type == COMMENT); ++ if (type == DIRECTIVE_COMMENT) { ++ checkDirectiveComment(); ++ } ++ } while (type == COMMENT || type == DIRECTIVE_COMMENT); + + return type; + } + ++ // sourceURL= after directive comment ++ private static final String SOURCE_URL_PREFIX = "sourceURL="; ++ ++ // currently only @sourceURL=foo supported ++ private void checkDirectiveComment() { ++ // if already set, ignore this one ++ if (sourceURL != null) { ++ return; ++ } ++ ++ final String comment = (String) lexer.getValueOf(token, isStrictMode); ++ final int len = comment.length(); ++ // 4 characters for directive comment marker //@\s or //#\s ++ if (len > 4 && comment.substring(4).startsWith(SOURCE_URL_PREFIX)) { ++ sourceURL = comment.substring(4 + SOURCE_URL_PREFIX.length()); ++ } ++ } ++ + /** + * Seek next token. + * + * @return tokenType of next token. + */ +- private final TokenType nextToken() { ++ private TokenType nextToken() { + // Capture last token tokenType. + last = type; + if (type != EOF) { +--- ./nashorn/src/jdk/nashorn/internal/parser/Lexer.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/parser/Lexer.java Wed Jul 30 03:55:26 2014 -0700 +@@ -27,6 +27,7 @@ + + import static jdk.nashorn.internal.parser.TokenType.ADD; + import static jdk.nashorn.internal.parser.TokenType.COMMENT; ++import static jdk.nashorn.internal.parser.TokenType.DIRECTIVE_COMMENT; + import static jdk.nashorn.internal.parser.TokenType.DECIMAL; + import static jdk.nashorn.internal.parser.TokenType.EOF; + import static jdk.nashorn.internal.parser.TokenType.EOL; +@@ -434,12 +435,18 @@ + if (ch1 == '/') { + // Skip over //. + skip(2); ++ ++ boolean directiveComment = false; ++ if ((ch0 == '#' || ch0 == '@') && (ch1 == ' ')) { ++ directiveComment = true; ++ } ++ + // Scan for EOL. + while (!atEOF() && !isEOL(ch0)) { + skip(1); + } + // Did detect a comment. +- add(COMMENT, start); ++ add(directiveComment? DIRECTIVE_COMMENT : COMMENT, start); + return true; + } else if (ch1 == '*') { + // Skip over /*. +@@ -1623,6 +1630,8 @@ + return valueOfPattern(start, len); // RegexToken::LexerToken + case XML: + return valueOfXML(start, len); // XMLToken::LexerToken ++ case DIRECTIVE_COMMENT: ++ return source.getString(start, len); + default: + break; + } +--- ./nashorn/src/jdk/nashorn/internal/parser/Parser.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/parser/Parser.java Wed Jul 30 03:55:26 2014 -0700 +@@ -26,13 +26,14 @@ + package jdk.nashorn.internal.parser; + + import static jdk.nashorn.internal.codegen.CompilerConstants.EVAL; +-import static jdk.nashorn.internal.codegen.CompilerConstants.FUNCTION_PREFIX; ++import static jdk.nashorn.internal.codegen.CompilerConstants.ANON_FUNCTION_PREFIX; + import static jdk.nashorn.internal.codegen.CompilerConstants.RUN_SCRIPT; + import static jdk.nashorn.internal.parser.TokenType.ASSIGN; + import static jdk.nashorn.internal.parser.TokenType.CASE; + import static jdk.nashorn.internal.parser.TokenType.CATCH; + import static jdk.nashorn.internal.parser.TokenType.COLON; + import static jdk.nashorn.internal.parser.TokenType.COMMARIGHT; ++import static jdk.nashorn.internal.parser.TokenType.CONST; + import static jdk.nashorn.internal.parser.TokenType.DECPOSTFIX; + import static jdk.nashorn.internal.parser.TokenType.DECPREFIX; + import static jdk.nashorn.internal.parser.TokenType.ELSE; +@@ -389,7 +390,9 @@ + sb.append(parentFunction.getName()).append('$'); + } + +- sb.append(ident != null ? ident.getName() : FUNCTION_PREFIX.symbolName()); ++ assert ident.getName() != null; ++ sb.append(ident.getName()); ++ + final String name = namespace.uniqueName(sb.toString()); + assert parentFunction != null || name.equals(RUN_SCRIPT.symbolName()) : "name = " + name;// must not rename runScript(). + +@@ -419,7 +422,8 @@ + name, + parameters, + kind, +- flags); ++ flags, ++ sourceURL); + + lc.push(functionNode); + // Create new block, and just put it on the context stack, restoreFunctionNode() will associate it with the +@@ -638,6 +642,10 @@ + + script = restoreFunctionNode(script, token); //commit code + script = script.setBody(lc, script.getBody().setNeedsScope(lc)); ++ // user may have directive comment to set sourceURL ++ if (sourceURL != null) { ++ script = script.setSourceURL(lc, sourceURL); ++ } + + return script; + } +@@ -842,6 +850,11 @@ + expect(SEMICOLON); + break; + default: ++ if (env._const_as_var && type == CONST) { ++ variableStatement(true); ++ break; ++ } ++ + if (type == IDENT || isNonStrictModeIdent()) { + if (T(k + 1) == COLON) { + labelStatement(); +@@ -1103,6 +1116,12 @@ + case SEMICOLON: + break; + default: ++ if (env._const_as_var && type == CONST) { ++ // Var statements captured in for outer block. ++ vars = variableStatement(false); ++ break; ++ } ++ + final Expression expression = expression(unaryExpression(), COMMARIGHT.getPrecedence(), true); + forNode = forNode.setInit(lc, expression); + break; +@@ -1693,9 +1712,11 @@ + // ECMA 12.4.1 strict mode restrictions + verifyStrictIdent(exception, "catch argument"); + +- // Check for conditional catch. ++ // Nashorn extension: catch clause can have optional ++ // condition. So, a single try can have more than one ++ // catch clause each with it's own condition. + final Expression ifExpression; +- if (type == IF) { ++ if (!env._no_syntax_extensions && type == IF) { + next(); + // Get the exception condition. + ifExpression = expression(); +@@ -1792,6 +1813,7 @@ + case THIS: + final String name = type.getName(); + next(); ++ lc.setFlag(lc.getCurrentFunction(), FunctionNode.USES_THIS); + return new IdentNode(primaryToken, finish, name); + case IDENT: + final IdentNode ident = getIdent(); +@@ -2132,11 +2154,20 @@ + final String setterName = setIdent.getPropertyName(); + final IdentNode setNameNode = new IdentNode(((Node)setIdent).getToken(), finish, NameCodec.encode("set " + setterName)); + expect(LPAREN); +- final IdentNode argIdent = getIdent(); +- verifyStrictIdent(argIdent, "setter argument"); ++ // be sloppy and allow missing setter parameter even though ++ // spec does not permit it! ++ final IdentNode argIdent; ++ if (type == IDENT || isNonStrictModeIdent()) { ++ argIdent = getIdent(); ++ verifyStrictIdent(argIdent, "setter argument"); ++ } else { ++ argIdent = null; ++ } + expect(RPAREN); + List parameters = new ArrayList<>(); +- parameters.add(argIdent); ++ if (argIdent != null) { ++ parameters.add(argIdent); ++ } + functionNode = functionBody(getSetToken, setNameNode, parameters, FunctionNode.Kind.SETTER); + return new PropertyNode(propertyToken, finish, setIdent, null, null, functionNode); + +@@ -2448,7 +2479,7 @@ + // name is null, generate anonymous name + boolean isAnonymous = false; + if (name == null) { +- final String tmpName = "_L" + functionLine; ++ final String tmpName = ANON_FUNCTION_PREFIX.symbolName() + functionLine; + name = new IdentNode(functionToken, Token.descPosition(functionToken), tmpName); + isAnonymous = true; + } +--- ./nashorn/src/jdk/nashorn/internal/parser/TokenType.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/parser/TokenType.java Wed Jul 30 03:55:26 2014 -0700 +@@ -41,10 +41,14 @@ + */ + @SuppressWarnings("javadoc") + public enum TokenType { +- ERROR (SPECIAL, null), +- EOF (SPECIAL, null), +- EOL (SPECIAL, null), +- COMMENT (SPECIAL, null), ++ ERROR (SPECIAL, null), ++ EOF (SPECIAL, null), ++ EOL (SPECIAL, null), ++ COMMENT (SPECIAL, null), ++ // comments of the form //@ foo=bar or //# foo=bar ++ // These comments are treated as special instructions ++ // to the lexer, parser or codegenerator. ++ DIRECTIVE_COMMENT (SPECIAL, null), + + NOT (UNARY, "!", 14, false), + NE (BINARY, "!=", 9, true), +@@ -107,7 +111,7 @@ + CATCH (KEYWORD, "catch"), + // CHAR (FUTURE, "char"), + CLASS (FUTURE, "class"), +- CONST (FUTURE, "const"), ++ CONST (KEYWORD, "const"), + CONTINUE (KEYWORD, "continue"), + DEBUGGER (KEYWORD, "debugger"), + DEFAULT (KEYWORD, "default"), +--- ./nashorn/src/jdk/nashorn/internal/runtime/AccessorProperty.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/AccessorProperty.java Wed Jul 30 03:55:26 2014 -0700 +@@ -39,6 +39,9 @@ + import static jdk.nashorn.internal.lookup.Lookup.MH; + import static jdk.nashorn.internal.lookup.MethodHandleFactory.stripName; + ++import java.io.IOException; ++import java.io.ObjectInputStream; ++import java.io.Serializable; + import java.lang.invoke.MethodHandle; + import java.lang.invoke.MethodHandles; + import java.lang.invoke.MethodType; +@@ -51,11 +54,12 @@ + * An AccessorProperty is the most generic property type. An AccessorProperty is + * represented as fields in a ScriptObject class. + */ +-public final class AccessorProperty extends Property { ++public final class AccessorProperty extends Property implements Serializable { + private static final MethodHandles.Lookup lookup = MethodHandles.lookup(); + private static final MethodHandle REPLACE_MAP = findOwnMH("replaceMap", Object.class, Object.class, PropertyMap.class, String.class, Class.class, Class.class); + + private static final int NOOF_TYPES = getNumberOfAccessorTypes(); ++ private static final long serialVersionUID = 3371720170182154920L; + + /** + * Properties in different maps for the same structure class will share their field getters and setters. This could +@@ -71,7 +75,7 @@ + }; + + /** Property getter cache */ +- private MethodHandle[] getters = new MethodHandle[NOOF_TYPES]; ++ private transient MethodHandle[] getters = new MethodHandle[NOOF_TYPES]; + + private static final MethodType[] ACCESSOR_GETTER_TYPES = new MethodType[NOOF_TYPES]; + private static final MethodType[] ACCESSOR_SETTER_TYPES = new MethodType[NOOF_TYPES]; +@@ -122,16 +126,16 @@ + } + + /** Seed getter for the primitive version of this field (in -Dnashorn.fields.dual=true mode) */ +- private MethodHandle primitiveGetter; ++ private transient MethodHandle primitiveGetter; + + /** Seed setter for the primitive version of this field (in -Dnashorn.fields.dual=true mode) */ +- private MethodHandle primitiveSetter; ++ private transient MethodHandle primitiveSetter; + + /** Seed getter for the Object version of this field */ +- private MethodHandle objectGetter; ++ private transient MethodHandle objectGetter; + + /** Seed setter for the Object version of this field */ +- private MethodHandle objectSetter; ++ private transient MethodHandle objectSetter; + + /** + * Current type of this object, in object only mode, this is an Object.class. In dual-fields mode +@@ -141,10 +145,12 @@ + private Class currentType; + + /** +- * Delegate constructor. This is used when adding properties to the Global scope, which +- * is necessary for outermost levels in a script (the ScriptObject is represented by +- * a JO-prefixed ScriptObject class, but the properties need to be in the Global scope +- * and are thus rebound with that as receiver ++ * Delegate constructor for bound properties. This is used for properties created by ++ * {@link ScriptRuntime#mergeScope} and the Nashorn {@code Object.bindProperties} method. ++ * The former is used to add a script's defined globals to the current global scope while ++ * still storing them in a JO-prefixed ScriptObject class. ++ * ++ *

    All properties created by this constructor have the {@link #IS_BOUND} flag set.

    + * + * @param property accessor property to rebind + * @param delegate delegate object to rebind receiver to +@@ -157,6 +163,8 @@ + this.objectGetter = bindTo(property.ensureObjectGetter(), delegate); + this.objectSetter = bindTo(property.ensureObjectSetter(), delegate); + ++ // Properties created this way are bound to a delegate ++ this.flags |= IS_BOUND; + setCurrentType(property.getCurrentType()); + } + +@@ -239,6 +247,12 @@ + public AccessorProperty(final String key, final int flags, final Class structure, final int slot) { + super(key, flags, slot); + ++ initGetterSetter(structure); ++ } ++ ++ private void initGetterSetter(final Class structure) { ++ final int slot = getSlot(); ++ final String key = getKey(); + /* + * primitiveGetter and primitiveSetter are only used in dual fields mode. Setting them to null also + * works in dual field mode, it only means that the property never has a primitive +@@ -301,6 +315,12 @@ + setCurrentType(property.getCurrentType()); + } + ++ private void readObject(final ObjectInputStream s) throws IOException, ClassNotFoundException { ++ s.defaultReadObject(); ++ // Restore getters array ++ getters = new MethodHandle[NOOF_TYPES]; ++ } ++ + private static MethodHandle bindTo(final MethodHandle mh, final Object receiver) { + if (mh == null) { + return null; +@@ -360,6 +380,16 @@ + } + + @Override ++ void initMethodHandles(final Class structure) { ++ if (!ScriptObject.class.isAssignableFrom(structure) || !StructureLoader.isStructureClass(structure.getName())) { ++ throw new IllegalArgumentException(); ++ } ++ if (!isSpill()) { ++ initGetterSetter(structure); ++ } ++ } ++ ++ @Override + public MethodHandle getGetter(final Class type) { + final int i = getAccessorTypeIndex(type); + ensureObjectGetter(); +--- ./nashorn/src/jdk/nashorn/internal/runtime/CodeInstaller.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/CodeInstaller.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,6 +25,7 @@ + + package jdk.nashorn.internal.runtime; + ++import java.util.Map; + import jdk.nashorn.internal.codegen.ClassEmitter; + + /** +@@ -52,7 +53,7 @@ + * @param bytecode bytecode + * @return the installed class + */ +- public Class install(final String className, final byte[] bytecode); ++ public Class install(final String className, final byte[] bytecode, final Source source, final Object[] constants); + + /** + * Verify generated bytecode before emission. This is called back from the +@@ -74,4 +75,13 @@ + * @return unique eval id + */ + public long getUniqueEvalId(); ++ ++ /** ++ * Store a compiled script for later reuse ++ * @param source the script source ++ * @param mainClassName the main class name ++ * @param classBytes map of class names to class bytes ++ * @param constants constants array ++ */ ++ public void storeCompiledScript(Source source, String mainClassName, Map classBytes, Object[] constants); + } +--- ./nashorn/src/jdk/nashorn/internal/runtime/CodeStore.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/CodeStore.java Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,179 @@ ++/* ++ * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package jdk.nashorn.internal.runtime; ++ ++import java.io.BufferedInputStream; ++import java.io.BufferedOutputStream; ++import java.io.File; ++import java.io.FileInputStream; ++import java.io.FileOutputStream; ++import java.io.IOException; ++import java.io.ObjectInputStream; ++import java.io.ObjectOutputStream; ++import java.io.Serializable; ++import java.security.AccessController; ++import java.security.PrivilegedActionException; ++import java.security.PrivilegedExceptionAction; ++import java.util.Base64; ++import java.util.Map; ++ ++/** ++ * A code cache for persistent caching of compiled scripts. ++ */ ++final class CodeStore { ++ ++ private final File dir; ++ private final int minSize; ++ ++ // Message digest to file name encoder ++ private final static Base64.Encoder BASE64 = Base64.getUrlEncoder().withoutPadding(); ++ ++ // Default minimum size for storing a compiled script class ++ private final static int DEFAULT_MIN_SIZE = 1000; ++ ++ /** ++ * Constructor ++ * @param path directory to store code in ++ * @throws IOException ++ */ ++ public CodeStore(final String path) throws IOException { ++ this(path, DEFAULT_MIN_SIZE); ++ } ++ ++ /** ++ * Constructor ++ * @param path directory to store code in ++ * @param minSize minimum file size for caching scripts ++ * @throws IOException ++ */ ++ public CodeStore(final String path, final int minSize) throws IOException { ++ this.dir = checkDirectory(path); ++ this.minSize = minSize; ++ } ++ ++ private static File checkDirectory(final String path) throws IOException { ++ try { ++ return AccessController.doPrivileged(new PrivilegedExceptionAction() { ++ @Override ++ public File run() throws IOException { ++ final File dir = new File(path).getAbsoluteFile(); ++ if (!dir.exists() && !dir.mkdirs()) { ++ throw new IOException("Could not create directory: " + dir); ++ } else if (!dir.isDirectory()) { ++ throw new IOException("Not a directory: " + dir); ++ } else if (!dir.canRead() || !dir.canWrite()) { ++ throw new IOException("Directory not readable or writable: " + dir); ++ } ++ return dir; ++ } ++ }); ++ } catch (PrivilegedActionException e) { ++ throw (IOException) e.getException(); ++ } ++ } ++ ++ /** ++ * Return a compiled script from the cache, or null if it isn't found. ++ * ++ * @param source the source ++ * @return the compiled script or null ++ * @throws IOException ++ * @throws ClassNotFoundException ++ */ ++ public CompiledScript getScript(final Source source) throws IOException, ClassNotFoundException { ++ if (source.getLength() < minSize) { ++ return null; ++ } ++ ++ final String digest = BASE64.encodeToString(source.getDigest()); ++ final File file = new File(dir, digest); ++ ++ try { ++ return AccessController.doPrivileged(new PrivilegedExceptionAction() { ++ @Override ++ public CompiledScript run() throws IOException, ClassNotFoundException { ++ if (!file.exists()) { ++ return null; ++ } ++ try (ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)))) { ++ CompiledScript compiledScript = (CompiledScript) in.readObject(); ++ compiledScript.setSource(source); ++ return compiledScript; ++ } ++ } ++ }); ++ } catch (PrivilegedActionException e) { ++ final Exception ex = e.getException(); ++ if (ex instanceof IOException) { ++ throw (IOException) ex; ++ } else if (ex instanceof ClassNotFoundException) { ++ throw (ClassNotFoundException) ex; ++ } ++ throw (new RuntimeException(ex)); ++ } ++ } ++ ++ /** ++ * Store a compiled script in the cache. ++ * ++ * @param source the source ++ * @param mainClassName the main class name ++ * @param classBytes a map of class bytes ++ * @param constants the constants array ++ * @throws IOException ++ */ ++ public void putScript(final Source source, final String mainClassName, final Map classBytes, final Object[] constants) ++ throws IOException { ++ if (source.getLength() < minSize) { ++ return; ++ } ++ for (final Object constant : constants) { ++ // Make sure all constant data is serializable ++ if (! (constant instanceof Serializable)) { ++ return; ++ } ++ } ++ ++ final String digest = BASE64.encodeToString(source.getDigest()); ++ final File file = new File(dir, digest); ++ final CompiledScript script = new CompiledScript(source, mainClassName, classBytes, constants); ++ ++ try { ++ AccessController.doPrivileged(new PrivilegedExceptionAction() { ++ @Override ++ public Void run() throws IOException { ++ try (ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)))) { ++ out.writeObject(script); ++ } ++ return null; ++ } ++ }); ++ } catch (PrivilegedActionException e) { ++ throw (IOException) e.getException(); ++ } ++ } ++} ++ +--- ./nashorn/src/jdk/nashorn/internal/runtime/CompiledScript.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/CompiledScript.java Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,127 @@ ++/* ++ * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package jdk.nashorn.internal.runtime; ++ ++import java.io.Serializable; ++import java.util.Arrays; ++import java.util.Map; ++ ++/** ++ * Class representing a compiled script. ++ */ ++final class CompiledScript implements Serializable { ++ ++ /** Main class name. */ ++ private final String mainClassName; ++ ++ /** Map of class names to class bytes. */ ++ private final Map classBytes; ++ ++ /** Constants array. */ ++ private final Object[] constants; ++ ++ /** The source */ ++ private transient Source source; ++ ++ private static final long serialVersionUID = 2958227232195298340L; ++ ++ /** ++ * Constructor. ++ * ++ * @param mainClassName main class name ++ * @param classBytes map of class names to class bytes ++ * @param constants constants array ++ */ ++ CompiledScript(final Source source, final String mainClassName, final Map classBytes, final Object[] constants) { ++ this.source = source; ++ this.mainClassName = mainClassName; ++ this.classBytes = classBytes; ++ this.constants = constants; ++ } ++ ++ /** ++ * Returns the main class name. ++ * @return the main class name ++ */ ++ public String getMainClassName() { ++ return mainClassName; ++ } ++ ++ /** ++ * Returns a map of class names to class bytes. ++ * @return map of class bytes ++ */ ++ public Map getClassBytes() { ++ return classBytes; ++ } ++ ++ /** ++ * Returns the constants array. ++ * @return constants array ++ */ ++ public Object[] getConstants() { ++ return constants; ++ } ++ ++ /** ++ * Returns the source of this cached script. ++ * @return the source ++ */ ++ public Source getSource() { ++ return source; ++ } ++ ++ /** ++ * Sets the source of this cached script. ++ * @param source the source ++ */ ++ void setSource(final Source source) { ++ this.source = source; ++ } ++ ++ @Override ++ public int hashCode() { ++ int hash = mainClassName.hashCode(); ++ hash = 31 * hash + classBytes.hashCode(); ++ hash = 31 * hash + Arrays.hashCode(constants); ++ return hash; ++ } ++ ++ @Override ++ public boolean equals(Object obj) { ++ if (obj == this) { ++ return true; ++ } ++ if (!(obj instanceof CompiledScript)) { ++ return false; ++ } ++ ++ final CompiledScript cs = (CompiledScript) obj; ++ return mainClassName.equals(cs.mainClassName) ++ && classBytes.equals(cs.classBytes) ++ && Arrays.equals(constants, cs.constants); ++ } ++} +--- ./nashorn/src/jdk/nashorn/internal/runtime/Context.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/Context.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,17 +25,23 @@ + + package jdk.nashorn.internal.runtime; + ++import static jdk.nashorn.internal.codegen.CompilerConstants.CONSTANTS; + import static jdk.nashorn.internal.codegen.CompilerConstants.RUN_SCRIPT; ++import static jdk.nashorn.internal.codegen.CompilerConstants.SOURCE; + import static jdk.nashorn.internal.codegen.CompilerConstants.STRICT_MODE; + import static jdk.nashorn.internal.lookup.Lookup.MH; + import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; + import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; ++import static jdk.nashorn.internal.runtime.Source.sourceFor; + + import java.io.File; + import java.io.IOException; + import java.io.PrintWriter; + import java.lang.invoke.MethodHandle; + import java.lang.invoke.MethodHandles; ++import java.lang.ref.ReferenceQueue; ++import java.lang.ref.SoftReference; ++import java.lang.reflect.Field; + import java.lang.reflect.Modifier; + import java.util.concurrent.atomic.AtomicLong; + import java.net.MalformedURLException; +@@ -46,7 +52,11 @@ + import java.security.CodeSource; + import java.security.Permissions; + import java.security.PrivilegedAction; ++import java.security.PrivilegedActionException; ++import java.security.PrivilegedExceptionAction; + import java.security.ProtectionDomain; ++import java.util.HashMap; ++import java.util.LinkedHashMap; + import java.util.Map; + + import jdk.internal.org.objectweb.asm.ClassReader; +@@ -91,6 +101,11 @@ + */ + public static final String NASHORN_JAVA_REFLECTION = "nashorn.JavaReflection"; + ++ /** ++ * Permission to enable nashorn debug mode. ++ */ ++ public static final String NASHORN_DEBUG_MODE = "nashorn.debugMode"; ++ + // nashorn load psuedo URL prefixes + private static final String LOAD_CLASSPATH = "classpath:"; + private static final String LOAD_FX = "fx:"; +@@ -126,8 +141,32 @@ + } + + @Override +- public Class install(final String className, final byte[] bytecode) { +- return loader.installClass(className, bytecode, codeSource); ++ public Class install(final String className, final byte[] bytecode, final Source source, final Object[] constants) { ++ Compiler.LOG.fine("Installing class ", className); ++ ++ final String binaryName = Compiler.binaryName(className); ++ final Class clazz = loader.installClass(binaryName, bytecode, codeSource); ++ ++ try { ++ // Need doPrivileged because these fields are private ++ AccessController.doPrivileged(new PrivilegedExceptionAction() { ++ @Override ++ public Void run() throws Exception { ++ //use reflection to write source and constants table to installed classes ++ final Field sourceField = clazz.getDeclaredField(SOURCE.symbolName()); ++ final Field constantsField = clazz.getDeclaredField(CONSTANTS.symbolName()); ++ sourceField.setAccessible(true); ++ constantsField.setAccessible(true); ++ sourceField.set(null, source); ++ constantsField.set(null, constants); ++ return null; ++ } ++ }); ++ } catch (final PrivilegedActionException e) { ++ throw new RuntimeException(e); ++ } ++ ++ return clazz; + } + + @Override +@@ -144,21 +183,39 @@ + public long getUniqueEvalId() { + return context.getUniqueEvalId(); + } ++ ++ @Override ++ public void storeCompiledScript(final Source source, final String mainClassName, ++ final Map classBytes, final Object[] constants) { ++ if (context.codeStore != null) { ++ try { ++ context.codeStore.putScript(source, mainClassName, classBytes, constants); ++ } catch (final IOException e) { ++ throw new RuntimeException(e); ++ } ++ } ++ } + } + + /** Is Context global debug mode enabled ? */ + public static final boolean DEBUG = Options.getBooleanProperty("nashorn.debug"); + +- private static final ThreadLocal currentGlobal = new ThreadLocal<>(); ++ private static final ThreadLocal currentGlobal = new ThreadLocal<>(); ++ ++ // in-memory cache for loaded classes ++ private ClassCache classCache; ++ ++ // persistent code store ++ private CodeStore codeStore; + + /** + * Get the current global scope + * @return the current global scope + */ +- public static ScriptObject getGlobal() { ++ public static Global getGlobal() { + // This class in a package.access protected package. + // Trusted code only can call this method. +- return getGlobalTrusted(); ++ return currentGlobal.get(); + } + + /** +@@ -167,10 +224,19 @@ + */ + public static void setGlobal(final ScriptObject global) { + if (global != null && !(global instanceof Global)) { +- throw new IllegalArgumentException("global is not an instance of Global!"); ++ throw new IllegalArgumentException("not a global!"); + } ++ setGlobal((Global)global); ++ } + +- setGlobalTrusted(global); ++ /** ++ * Set the current global scope ++ * @param global the global scope ++ */ ++ public static void setGlobal(final Global global) { ++ // This class in a package.access protected package. ++ // Trusted code only can call this method. ++ currentGlobal.set(global); + } + + /** +@@ -191,7 +257,7 @@ + * @return error writer of the current context + */ + public static PrintWriter getCurrentErr() { +- final ScriptObject global = getGlobalTrusted(); ++ final ScriptObject global = getGlobal(); + return (global != null)? global.getContext().getErr() : new PrintWriter(System.err); + } + +@@ -344,6 +410,24 @@ + this.classPathLoader = null; + } + ++ final int cacheSize = env._class_cache_size; ++ if (cacheSize > 0) { ++ classCache = new ClassCache(cacheSize); ++ } ++ ++ if (env._persistent_cache) { ++ if (env._lazy_compilation || env._specialize_calls != null) { ++ getErr().println("Can not use persistent class caching with lazy compilation or call specialization."); ++ } else { ++ try { ++ final String cacheDir = Options.getStringProperty("nashorn.persistent.code.cache", "nashorn_code_cache"); ++ codeStore = new CodeStore(cacheDir); ++ } catch (IOException e) { ++ throw new RuntimeException("Error initializing code cache", e); ++ } ++ } ++ } ++ + // print version info if asked. + if (env._version) { + getErr().println("nashorn " + Version.version()); +@@ -391,7 +475,7 @@ + * @return the property map of the current global scope + */ + public static PropertyMap getGlobalMap() { +- return Context.getGlobalTrusted().getMap(); ++ return Context.getGlobal().getMap(); + } + + /** +@@ -407,6 +491,39 @@ + } + + /** ++ * Interface to represent compiled code that can be re-used across many ++ * global scope instances ++ */ ++ public static interface MultiGlobalCompiledScript { ++ /** ++ * Obtain script function object for a specific global scope object. ++ * ++ * @param newGlobal global scope for which function object is obtained ++ * @return script function for script level expressions ++ */ ++ public ScriptFunction getFunction(final Global newGlobal); ++ } ++ ++ /** ++ * Compile a top level script. ++ * ++ * @param source the script source ++ * @return reusable compiled script across many global scopes. ++ */ ++ public MultiGlobalCompiledScript compileScript(final Source source) { ++ final Class clazz = compile(source, this.errors, this._strict); ++ final MethodHandle runMethodHandle = getRunScriptHandle(clazz); ++ final boolean strict = isStrict(clazz); ++ ++ return new MultiGlobalCompiledScript() { ++ @Override ++ public ScriptFunction getFunction(final Global newGlobal) { ++ return Context.getGlobal().newScriptFunction(RUN_SCRIPT.symbolName(), runMethodHandle, newGlobal, strict); ++ } ++ }; ++ } ++ ++ /** + * Entry point for {@code eval} + * + * @param initialScope The scope of this eval call +@@ -419,9 +536,9 @@ + */ + public Object eval(final ScriptObject initialScope, final String string, final Object callThis, final Object location, final boolean strict) { + final String file = (location == UNDEFINED || location == null) ? "" : location.toString(); +- final Source source = new Source(file, string); ++ final Source source = sourceFor(file, string); + final boolean directEval = location != UNDEFINED; // is this direct 'eval' call or indirectly invoked eval? +- final ScriptObject global = Context.getGlobalTrusted(); ++ final Global global = Context.getGlobal(); + + ScriptObject scope = initialScope; + +@@ -453,7 +570,7 @@ + // in the caller's environment. A new environment is created! + if (strictFlag) { + // Create a new scope object +- final ScriptObject strictEvalScope = ((GlobalObject)global).newObject(); ++ final ScriptObject strictEvalScope = global.newObject(); + + // bless it as a "scope" + strictEvalScope.setIsScope(); +@@ -486,7 +603,7 @@ + public Source run() { + try { + final URL resURL = Context.class.getResource(resource); +- return (resURL != null)? new Source(srcStr, resURL) : null; ++ return (resURL != null)? sourceFor(srcStr, resURL) : null; + } catch (final IOException exp) { + return null; + } +@@ -518,7 +635,7 @@ + final String srcStr = (String)src; + if (srcStr.startsWith(LOAD_CLASSPATH)) { + URL url = getResourceURL(srcStr.substring(LOAD_CLASSPATH.length())); +- source = (url != null)? new Source(url.toString(), url) : null; ++ source = (url != null)? sourceFor(url.toString(), url) : null; + } else { + final File file = new File(srcStr); + if (srcStr.indexOf(':') != -1) { +@@ -531,31 +648,31 @@ + } catch (final MalformedURLException e) { + url = file.toURI().toURL(); + } +- source = new Source(url.toString(), url); ++ source = sourceFor(url.toString(), url); + } + } else if (file.isFile()) { +- source = new Source(srcStr, file); ++ source = sourceFor(srcStr, file); + } + } + } else if (src instanceof File && ((File)src).isFile()) { + final File file = (File)src; +- source = new Source(file.getName(), file); ++ source = sourceFor(file.getName(), file); + } else if (src instanceof URL) { + final URL url = (URL)src; +- source = new Source(url.toString(), url); ++ source = sourceFor(url.toString(), url); + } else if (src instanceof ScriptObject) { + final ScriptObject sobj = (ScriptObject)src; + if (sobj.has("script") && sobj.has("name")) { + final String script = JSType.toString(sobj.get("script")); + final String name = JSType.toString(sobj.get("name")); +- source = new Source(name, script); ++ source = sourceFor(name, script); + } + } else if (src instanceof Map) { + final Map map = (Map)src; + if (map.containsKey("script") && map.containsKey("name")) { + final String script = JSType.toString(map.get("script")); + final String name = JSType.toString(map.get("name")); +- source = new Source(name, script); ++ source = sourceFor(name, script); + } + } + +@@ -578,10 +695,10 @@ + * @throws IOException if source cannot be found or loaded + */ + public Object loadWithNewGlobal(final Object from, final Object...args) throws IOException { +- final ScriptObject oldGlobal = getGlobalTrusted(); +- final ScriptObject newGlobal = AccessController.doPrivileged(new PrivilegedAction() { ++ final Global oldGlobal = getGlobal(); ++ final Global newGlobal = AccessController.doPrivileged(new PrivilegedAction() { + @Override +- public ScriptObject run() { ++ public Global run() { + try { + return newGlobal(); + } catch (final RuntimeException e) { +@@ -594,17 +711,17 @@ + }, CREATE_GLOBAL_ACC_CTXT); + // initialize newly created Global instance + initGlobal(newGlobal); +- setGlobalTrusted(newGlobal); ++ setGlobal(newGlobal); + + final Object[] wrapped = args == null? ScriptRuntime.EMPTY_ARRAY : ScriptObjectMirror.wrapArray(args, oldGlobal); +- newGlobal.put("arguments", ((GlobalObject)newGlobal).wrapAsObject(wrapped), env._strict); ++ newGlobal.put("arguments", newGlobal.wrapAsObject(wrapped), env._strict); + + try { + // wrap objects from newGlobal's world as mirrors - but if result + // is from oldGlobal's world, unwrap it! + return ScriptObjectMirror.unwrap(ScriptObjectMirror.wrap(load(newGlobal, from), newGlobal), oldGlobal); + } finally { +- setGlobalTrusted(oldGlobal); ++ setGlobal(oldGlobal); + } + } + +@@ -633,7 +750,7 @@ + * Checks that the given Class can be accessed from no permissions context. + * + * @param clazz Class object +- * @throw SecurityException if not accessible ++ * @throws SecurityException if not accessible + */ + public static void checkPackageAccess(final Class clazz) { + final SecurityManager sm = System.getSecurityManager(); +@@ -650,12 +767,12 @@ + * Checks that the given package name can be accessed from no permissions context. + * + * @param pkgName package name +- * @throw SecurityException if not accessible ++ * @throws SecurityException if not accessible + */ + public static void checkPackageAccess(final String pkgName) { + final SecurityManager sm = System.getSecurityManager(); + if (sm != null) { +- checkPackageAccess(sm, pkgName.endsWith(".")? pkgName : pkgName + "."); ++ checkPackageAccess(sm, pkgName.endsWith(".") ? pkgName : pkgName + "."); + } + } + +@@ -779,7 +896,7 @@ + * + * @return the initialized global scope object. + */ +- public ScriptObject createGlobal() { ++ public Global createGlobal() { + return initGlobal(newGlobal()); + } + +@@ -787,7 +904,7 @@ + * Create a new uninitialized global scope object + * @return the global script object + */ +- public ScriptObject newGlobal() { ++ public Global newGlobal() { + return new Global(this); + } + +@@ -797,20 +914,16 @@ + * @param global the global + * @return the initialized global scope object. + */ +- public ScriptObject initGlobal(final ScriptObject global) { +- if (! (global instanceof GlobalObject)) { +- throw new IllegalArgumentException("not a global object!"); +- } +- ++ public Global initGlobal(final Global global) { + // Need only minimal global object, if we are just compiling. + if (!env._compile_only) { +- final ScriptObject oldGlobal = Context.getGlobalTrusted(); ++ final Global oldGlobal = Context.getGlobal(); + try { +- Context.setGlobalTrusted(global); ++ Context.setGlobal(global); + // initialize global scope with builtin global objects +- ((GlobalObject)global).initBuiltinObjects(); ++ global.initBuiltinObjects(); + } finally { +- Context.setGlobalTrusted(oldGlobal); ++ Context.setGlobal(oldGlobal); + } + } + +@@ -818,30 +931,15 @@ + } + + /** +- * Trusted variants - package-private ++ * Trusted variant - package-private + */ + + /** +- * Return the current global scope +- * @return current global scope +- */ +- static ScriptObject getGlobalTrusted() { +- return currentGlobal.get(); +- } +- +- /** +- * Set the current global scope +- */ +- static void setGlobalTrusted(ScriptObject global) { +- currentGlobal.set(global); +- } +- +- /** + * Return the current global's context + * @return current global's context + */ + static Context getContextTrusted() { +- return Context.getGlobalTrusted().getContext(); ++ return ((ScriptObject)Context.getGlobal()).getContext(); + } + + /** +@@ -885,14 +983,8 @@ + return ScriptRuntime.apply(script, thiz); + } + +- private static ScriptFunction getRunScriptFunction(final Class script, final ScriptObject scope) { +- if (script == null) { +- return null; +- } +- +- // Get run method - the entry point to the script +- final MethodHandle runMethodHandle = +- MH.findStatic( ++ private static MethodHandle getRunScriptHandle(final Class script) { ++ return MH.findStatic( + MethodHandles.lookup(), + script, + RUN_SCRIPT.symbolName(), +@@ -900,17 +992,27 @@ + Object.class, + ScriptFunction.class, + Object.class)); ++ } + +- boolean strict; ++ private static boolean isStrict(final Class script) { ++ try { ++ return script.getField(STRICT_MODE.symbolName()).getBoolean(null); ++ } catch (final NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { ++ return false; ++ } ++ } + +- try { +- strict = script.getField(STRICT_MODE.symbolName()).getBoolean(null); +- } catch (final NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { +- strict = false; ++ private static ScriptFunction getRunScriptFunction(final Class script, final ScriptObject scope) { ++ if (script == null) { ++ return null; + } + ++ // Get run method - the entry point to the script ++ final MethodHandle runMethodHandle = getRunScriptHandle(script); ++ boolean strict = isStrict(script); ++ + // Package as a JavaScript function and pass function back to shell. +- return ((GlobalObject)Context.getGlobalTrusted()).newScriptFunction(RUN_SCRIPT.symbolName(), runMethodHandle, scope, strict); ++ return Context.getGlobal().newScriptFunction(RUN_SCRIPT.symbolName(), runMethodHandle, scope, strict); + } + + private ScriptFunction compileScript(final Source source, final ScriptObject scope, final ErrorManager errMan) { +@@ -921,29 +1023,38 @@ + // start with no errors, no warnings. + errMan.reset(); + +- GlobalObject global = null; +- Class script; ++ Class script = findCachedClass(source); ++ if (script != null) { ++ Compiler.LOG.fine("Code cache hit for ", source, " avoiding recompile."); ++ return script; ++ } + +- if (env._class_cache_size > 0) { +- global = (GlobalObject)Context.getGlobalTrusted(); +- script = global.findCachedClass(source); +- if (script != null) { +- Compiler.LOG.fine("Code cache hit for ", source, " avoiding recompile."); +- return script; ++ CompiledScript compiledScript = null; ++ FunctionNode functionNode = null; ++ ++ if (!env._parse_only && codeStore != null) { ++ try { ++ compiledScript = codeStore.getScript(source); ++ } catch (IOException | ClassNotFoundException e) { ++ Compiler.LOG.warning("Error loading ", source, " from cache: ", e); ++ // Fall back to normal compilation + } + } + +- final FunctionNode functionNode = new Parser(env, source, errMan, strict).parse(); +- if (errors.hasErrors()) { +- return null; +- } ++ if (compiledScript == null) { ++ functionNode = new Parser(env, source, errMan, strict).parse(); + +- if (env._print_ast) { +- getErr().println(new ASTWriter(functionNode)); +- } ++ if (errors.hasErrors()) { ++ return null; ++ } + +- if (env._print_parse) { +- getErr().println(new PrintVisitor(functionNode)); ++ if (env._print_ast) { ++ getErr().println(new ASTWriter(functionNode)); ++ } ++ ++ if (env._print_parse) { ++ getErr().println(new PrintVisitor(functionNode)); ++ } + } + + if (env._parse_only) { +@@ -952,18 +1063,18 @@ + + final URL url = source.getURL(); + final ScriptLoader loader = env._loader_per_compile ? createNewLoader() : scriptLoader; +- final CodeSource cs = url == null ? null : new CodeSource(url, (CodeSigner[])null); ++ final CodeSource cs = new CodeSource(url, (CodeSigner[])null); + final CodeInstaller installer = new ContextCodeInstaller(this, loader, cs); + +- final Compiler compiler = new Compiler(installer, strict); +- +- final FunctionNode newFunctionNode = compiler.compile(functionNode); +- script = compiler.install(newFunctionNode); +- +- if (global != null) { +- global.cacheClass(source, script); ++ if (functionNode != null) { ++ final Compiler compiler = new Compiler(installer, strict); ++ final FunctionNode newFunctionNode = compiler.compile(functionNode); ++ script = compiler.install(newFunctionNode); ++ } else { ++ script = install(compiledScript, installer); + } + ++ cacheClass(source, script); + return script; + } + +@@ -984,4 +1095,96 @@ + private long getUniqueScriptId() { + return uniqueScriptId.getAndIncrement(); + } ++ ++ ++ /** ++ * Install a previously compiled class from the code cache. ++ * ++ * @param compiledScript cached script containing class bytes and constants ++ * @return main script class ++ */ ++ private Class install(final CompiledScript compiledScript, final CodeInstaller installer) { ++ ++ final Map> installedClasses = new HashMap<>(); ++ final Source source = compiledScript.getSource(); ++ final Object[] constants = compiledScript.getConstants(); ++ final String rootClassName = compiledScript.getMainClassName(); ++ final byte[] rootByteCode = compiledScript.getClassBytes().get(rootClassName); ++ final Class rootClass = installer.install(rootClassName, rootByteCode, source, constants); ++ ++ installedClasses.put(rootClassName, rootClass); ++ ++ for (final Map.Entry entry : compiledScript.getClassBytes().entrySet()) { ++ final String className = entry.getKey(); ++ if (className.equals(rootClassName)) { ++ continue; ++ } ++ final byte[] code = entry.getValue(); ++ ++ installedClasses.put(className, installer.install(className, code, source, constants)); ++ } ++ for (Object constant : constants) { ++ if (constant instanceof RecompilableScriptFunctionData) { ++ ((RecompilableScriptFunctionData) constant).setCodeAndSource(installedClasses, source); ++ } ++ } ++ ++ return rootClass; ++ } ++ ++ /** ++ * Cache for compiled script classes. ++ */ ++ @SuppressWarnings("serial") ++ private static class ClassCache extends LinkedHashMap { ++ private final int size; ++ private final ReferenceQueue> queue; ++ ++ ClassCache(int size) { ++ super(size, 0.75f, true); ++ this.size = size; ++ this.queue = new ReferenceQueue<>(); ++ } ++ ++ void cache(final Source source, final Class clazz) { ++ put(source, new ClassReference(clazz, queue, source)); ++ } ++ ++ @Override ++ protected boolean removeEldestEntry(final Map.Entry eldest) { ++ return size() > size; ++ } ++ ++ @Override ++ public ClassReference get(Object key) { ++ for (ClassReference ref; (ref = (ClassReference)queue.poll()) != null; ) { ++ remove(ref.source); ++ } ++ return super.get(key); ++ } ++ ++ } ++ ++ private static class ClassReference extends SoftReference> { ++ private final Source source; ++ ++ ClassReference(final Class clazz, final ReferenceQueue> queue, final Source source) { ++ super(clazz, queue); ++ this.source = source; ++ } ++ } ++ ++ // Class cache management ++ private Class findCachedClass(final Source source) { ++ ClassReference ref = classCache == null ? null : classCache.get(source); ++ return ref != null ? ref.get() : null; ++ } ++ ++ private void cacheClass(final Source source, final Class clazz) { ++ if (classCache != null) { ++ classCache.cache(source, clazz); ++ } ++ } ++ ++ + } +--- ./nashorn/src/jdk/nashorn/internal/runtime/DebuggerSupport.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/DebuggerSupport.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,12 +25,20 @@ + + package jdk.nashorn.internal.runtime; + ++import static jdk.nashorn.internal.codegen.CompilerConstants.SOURCE; ++ ++import java.lang.invoke.MethodHandle; ++import java.lang.reflect.Field; ++import java.net.URL; + import java.util.HashSet; + import java.util.Set; ++import jdk.nashorn.internal.scripts.JS; + + /** + * This class provides support for external debuggers. Its primary purpose is + * is to simplify the debugger tasks and provide better performance. ++ * Even though the methods are not public, there are still part of the ++ * external debugger interface. + */ + final class DebuggerSupport { + /** +@@ -46,6 +54,11 @@ + */ + @SuppressWarnings("unused") + DebuggerValueDesc forceLoad = new DebuggerValueDesc(null, false, null, null); ++ ++ // Hook to force the loading of the SourceInfo class ++ @SuppressWarnings("unused") ++ final ++ SourceInfo srcInfo = new SourceInfo(null, 0, null, null); + } + + /** This class is used to send a bulk description of a value. */ +@@ -70,12 +83,60 @@ + } + } + ++ static class SourceInfo { ++ final String name; ++ final URL url; ++ final int hash; ++ final char[] content; ++ ++ SourceInfo(final String name, final int hash, final URL url, final char[] content) { ++ this.name = name; ++ this.hash = hash; ++ this.url = url; ++ this.content = content; ++ } ++ } ++ ++ /** ++ * Hook that is called just before invoking method handle ++ * from ScriptFunctionData via invoke, constructor method calls. ++ * ++ * @param mh script class method about to be invoked. ++ */ ++ static void notifyInvoke(final MethodHandle mh) { ++ // Do nothing here. This is placeholder method on which a ++ // debugger can place a breakpoint so that it can access the ++ // (script class) method handle that is about to be invoked. ++ // See ScriptFunctionData.invoke and ScriptFunctionData.construct. ++ } ++ ++ /** ++ * Return the script source info for the given script class. ++ * ++ * @param clazz compiled script class ++ * @return SourceInfo ++ */ ++ static SourceInfo getSourceInfo(final Class clazz) { ++ if (JS.class.isAssignableFrom(clazz)) { ++ try { ++ final Field sourceField = clazz.getDeclaredField(SOURCE.symbolName()); ++ sourceField.setAccessible(true); ++ final Source src = (Source) sourceField.get(null); ++ return src.getSourceInfo(); ++ } catch (final IllegalAccessException | NoSuchFieldException ignored) { ++ return null; ++ } ++ } ++ ++ return null; ++ } ++ + /** + * Return the current context global. + * @return context global. + */ + static Object getGlobal() { +- return Context.getGlobalTrusted(); ++ return Context.getGlobal(); + } + + /** +@@ -84,10 +145,10 @@ + * @param self Receiver to use. + * @param string String to evaluate. + * @param returnException true if exceptions are to be returned. +- * @return Result of eval as string, or, an exception or null depending on returnException. ++ * @return Result of eval, or, an exception or null depending on returnException. + */ + static Object eval(final ScriptObject scope, final Object self, final String string, final boolean returnException) { +- final ScriptObject global = Context.getGlobalTrusted(); ++ final ScriptObject global = Context.getGlobal(); + final ScriptObject initialScope = scope != null ? scope : global; + final Object callThis = self != null ? self : global; + final Context context = global.getContext(); +@@ -235,7 +296,7 @@ + * @param value Arbitrary value to be displayed by the debugger. + * @return A string representation of the value or an array of DebuggerValueDesc. + */ +- private static String valueAsString(final Object value) { ++ static String valueAsString(final Object value) { + final JSType type = JSType.of(value); + + switch (type) { +--- ./nashorn/src/jdk/nashorn/internal/runtime/ECMAErrors.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ECMAErrors.java Wed Jul 30 03:55:26 2014 -0700 +@@ -30,6 +30,8 @@ + import java.util.ResourceBundle; + import jdk.nashorn.api.scripting.NashornException; + import jdk.nashorn.internal.scripts.JS; ++import jdk.nashorn.internal.codegen.CompilerConstants; ++import jdk.nashorn.internal.objects.Global; + + /** + * Helper class to throw various standard "ECMA error" exceptions such as Error, ReferenceError, TypeError etc. +@@ -65,7 +67,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException asEcmaException(final ParserException e) { +- return asEcmaException(Context.getGlobalTrusted(), e); ++ return asEcmaException(Context.getGlobal(), e); + } + + /** +@@ -77,11 +79,11 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException asEcmaException(final ScriptObject global, final ParserException e) { ++ public static ECMAException asEcmaException(final Global global, final ParserException e) { + final JSErrorType errorType = e.getErrorType(); + assert errorType != null : "error type for " + e + " was null"; + +- final GlobalObject globalObj = (GlobalObject)global; ++ final Global globalObj = global; + final String msg = e.getMessage(); + + // translate to ECMAScript Error object using error type +@@ -115,7 +117,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException syntaxError(final String msgId, final String... args) { +- return syntaxError(Context.getGlobalTrusted(), msgId, args); ++ return syntaxError(Context.getGlobal(), msgId, args); + } + + /** +@@ -127,7 +129,7 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException syntaxError(final ScriptObject global, final String msgId, final String... args) { ++ public static ECMAException syntaxError(final Global global, final String msgId, final String... args) { + return syntaxError(global, null, msgId, args); + } + +@@ -141,7 +143,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException syntaxError(final Throwable cause, final String msgId, final String... args) { +- return syntaxError(Context.getGlobalTrusted(), cause, msgId, args); ++ return syntaxError(Context.getGlobal(), cause, msgId, args); + } + + /** +@@ -154,9 +156,9 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException syntaxError(final ScriptObject global, final Throwable cause, final String msgId, final String... args) { ++ public static ECMAException syntaxError(final Global global, final Throwable cause, final String msgId, final String... args) { + final String msg = getMessage("syntax.error." + msgId, args); +- return error(((GlobalObject)global).newSyntaxError(msg), cause); ++ return error(global.newSyntaxError(msg), cause); + } + + /** +@@ -168,7 +170,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException typeError(final String msgId, final String... args) { +- return typeError(Context.getGlobalTrusted(), msgId, args); ++ return typeError(Context.getGlobal(), msgId, args); + } + + /** +@@ -180,7 +182,7 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException typeError(final ScriptObject global, final String msgId, final String... args) { ++ public static ECMAException typeError(final Global global, final String msgId, final String... args) { + return typeError(global, null, msgId, args); + } + +@@ -194,7 +196,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException typeError(final Throwable cause, final String msgId, final String... args) { +- return typeError(Context.getGlobalTrusted(), cause, msgId, args); ++ return typeError(Context.getGlobal(), cause, msgId, args); + } + + /** +@@ -207,9 +209,9 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException typeError(final ScriptObject global, final Throwable cause, final String msgId, final String... args) { ++ public static ECMAException typeError(final Global global, final Throwable cause, final String msgId, final String... args) { + final String msg = getMessage("type.error." + msgId, args); +- return error(((GlobalObject)global).newTypeError(msg), cause); ++ return error(global.newTypeError(msg), cause); + } + + /** +@@ -221,7 +223,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException rangeError(final String msgId, final String... args) { +- return rangeError(Context.getGlobalTrusted(), msgId, args); ++ return rangeError(Context.getGlobal(), msgId, args); + } + + /** +@@ -233,7 +235,7 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException rangeError(final ScriptObject global, final String msgId, final String... args) { ++ public static ECMAException rangeError(final Global global, final String msgId, final String... args) { + return rangeError(global, null, msgId, args); + } + +@@ -247,7 +249,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException rangeError(final Throwable cause, final String msgId, final String... args) { +- return rangeError(Context.getGlobalTrusted(), cause, msgId, args); ++ return rangeError(Context.getGlobal(), cause, msgId, args); + } + + /** +@@ -260,9 +262,9 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException rangeError(final ScriptObject global, final Throwable cause, final String msgId, final String... args) { ++ public static ECMAException rangeError(final Global global, final Throwable cause, final String msgId, final String... args) { + final String msg = getMessage("range.error." + msgId, args); +- return error(((GlobalObject)global).newRangeError(msg), cause); ++ return error(global.newRangeError(msg), cause); + } + + /** +@@ -274,7 +276,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException referenceError(final String msgId, final String... args) { +- return referenceError(Context.getGlobalTrusted(), msgId, args); ++ return referenceError(Context.getGlobal(), msgId, args); + } + + /** +@@ -286,7 +288,7 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException referenceError(final ScriptObject global, final String msgId, final String... args) { ++ public static ECMAException referenceError(final Global global, final String msgId, final String... args) { + return referenceError(global, null, msgId, args); + } + +@@ -300,7 +302,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException referenceError(final Throwable cause, final String msgId, final String... args) { +- return referenceError(Context.getGlobalTrusted(), cause, msgId, args); ++ return referenceError(Context.getGlobal(), cause, msgId, args); + } + + /** +@@ -313,9 +315,9 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException referenceError(final ScriptObject global, final Throwable cause, final String msgId, final String... args) { ++ public static ECMAException referenceError(final Global global, final Throwable cause, final String msgId, final String... args) { + final String msg = getMessage("reference.error." + msgId, args); +- return error(((GlobalObject)global).newReferenceError(msg), cause); ++ return error(global.newReferenceError(msg), cause); + } + + /** +@@ -327,7 +329,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException uriError(final String msgId, final String... args) { +- return uriError(Context.getGlobalTrusted(), msgId, args); ++ return uriError(Context.getGlobal(), msgId, args); + } + + /** +@@ -339,7 +341,7 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException uriError(final ScriptObject global, final String msgId, final String... args) { ++ public static ECMAException uriError(final Global global, final String msgId, final String... args) { + return uriError(global, null, msgId, args); + } + +@@ -353,7 +355,7 @@ + * @return the resulting {@link ECMAException} + */ + public static ECMAException uriError(final Throwable cause, final String msgId, final String... args) { +- return uriError(Context.getGlobalTrusted(), cause, msgId, args); ++ return uriError(Context.getGlobal(), cause, msgId, args); + } + + /** +@@ -366,9 +368,9 @@ + * + * @return the resulting {@link ECMAException} + */ +- public static ECMAException uriError(final ScriptObject global, final Throwable cause, final String msgId, final String... args) { ++ public static ECMAException uriError(final Global global, final Throwable cause, final String msgId, final String... args) { + final String msg = getMessage("uri.error." + msgId, args); +- return error(((GlobalObject)global).newURIError(msg), cause); ++ return error(global.newURIError(msg), cause); + } + + /** +@@ -401,7 +403,7 @@ + final String className = frame.getClassName(); + + // Look for script package in class name (into which compiler puts generated code) +- if (className.startsWith(scriptPackage)) { ++ if (className.startsWith(scriptPackage) && !frame.getMethodName().startsWith(CompilerConstants.INTERNAL_METHOD_PREFIX)) { + final String source = frame.getFileName(); + /* + * Make sure that it is not some Java code that Nashorn has in that package! +--- ./nashorn/src/jdk/nashorn/internal/runtime/ECMAException.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ECMAException.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,7 +25,7 @@ + + package jdk.nashorn.internal.runtime; + +-import static jdk.nashorn.internal.codegen.CompilerConstants.constructorNoLookup; ++import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup; + import static jdk.nashorn.internal.codegen.CompilerConstants.virtualField; + import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; + +@@ -44,9 +44,9 @@ + @SuppressWarnings("serial") + public final class ECMAException extends NashornException { + /** +- * Method handle pointing to the constructor {@link ECMAException#ECMAException(Object, String, int, int)}, ++ * Method handle pointing to the constructor {@link ECMAException#create(Object, String, int, int)}, + */ +- public static final Call THROW_INIT = constructorNoLookup(ECMAException.class, Object.class, String.class, int.class, int.class); ++ public static final Call CREATE = staticCallNoLookup(ECMAException.class, "create", ECMAException.class, Object.class, String.class, int.class, int.class); + + /** Field handle to the{@link ECMAException#thrown} field, so that it can be accessed from generated code */ + public static final FieldAccess THROWN = virtualField(ECMAException.class, "thrown", Object.class); +@@ -57,23 +57,21 @@ + public final Object thrown; + + /** +- * Constructor. This is called from generated code to implement the {@code throw} +- * instruction from generated script code ++ * Constructor. Called from the factory method 'create'. + * + * @param thrown object to be thrown + * @param fileName script file name + * @param line line number of throw + * @param column column number of throw + */ +- public ECMAException(final Object thrown, final String fileName, final int line, final int column) { ++ private ECMAException(final Object thrown, final String fileName, final int line, final int column) { + super(ScriptRuntime.safeToString(thrown), asThrowable(thrown), fileName, line, column); + this.thrown = thrown; + setExceptionToThrown(); + } + + /** +- * Constructor. This is called from runtime code in Nashorn to throw things like +- * type errors. ++ * Constructor. This is called from the runtime code. + * + * @param thrown object to be thrown + * @param cause Java exception that triggered this throw +@@ -85,9 +83,39 @@ + } + + /** ++ * Factory method to retrieve the underlying exception or create an exception. ++ * This method is called from the generated code. ++ * ++ * @param thrown object to be thrown ++ * @param fileName script file name ++ * @param line line number of throw ++ * @param column column number of throw ++ * @return ECMAException object ++ */ ++ public static ECMAException create(final Object thrown, final String fileName, final int line, final int column) { ++ // If thrown object is an Error or sub-object like TypeError, then ++ // an ECMAException object has been already initialized at constructor. ++ if (thrown instanceof ScriptObject) { ++ ScriptObject sobj = (ScriptObject)thrown; ++ Object exception = getException(sobj); ++ if (exception instanceof ECMAException) { ++ // copy over file name, line number and column number. ++ final ECMAException ee = (ECMAException)exception; ++ ee.setFileName(fileName); ++ ee.setLineNumber(line); ++ ee.setColumnNumber(column); ++ return ee; ++ } ++ } ++ ++ return new ECMAException(thrown, fileName, line, column); ++ } ++ ++ /** + * Get the thrown object + * @return thrown object + */ ++ @Override + public Object getThrown() { + return thrown; + } +@@ -256,6 +284,8 @@ + final ScriptObject sobj = (ScriptObject)thrown; + if (!sobj.has(EXCEPTION_PROPERTY)) { + sobj.addOwnProperty(EXCEPTION_PROPERTY, Property.NOT_ENUMERABLE, this); ++ } else { ++ sobj.set(EXCEPTION_PROPERTY, this, false); + } + } + } +--- ./nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/FinalScriptFunctionData.java Wed Jul 30 03:55:26 2014 -0700 +@@ -38,31 +38,27 @@ + /** + * Constructor - used for bind + * +- * @param name name +- * @param arity arity +- * @param functions precompiled code +- * @param isStrict strict +- * @param isBuiltin builtin +- * @param isConstructor constructor ++ * @param name name ++ * @param arity arity ++ * @param functions precompiled code ++ * @param flags {@link ScriptFunctionData} flags + */ +- FinalScriptFunctionData(final String name, int arity, CompiledFunctions functions, final boolean isStrict, final boolean isBuiltin, final boolean isConstructor) { +- super(name, arity, isStrict, isBuiltin, isConstructor); ++ FinalScriptFunctionData(final String name, final int arity, final CompiledFunctions functions, final int flags) { ++ super(name, arity, flags); + code.addAll(functions); + } + + /** +- * Constructor - used from ScriptFunction. This assumes that we have code alraedy for the ++ * Constructor - used from ScriptFunction. This assumes that we have code already for the + * method (typically a native method) and possibly specializations. + * +- * @param name name +- * @param mh method handle for generic version of method +- * @param specs specializations +- * @param isStrict strict +- * @param isBuiltin builtin +- * @param isConstructor constructor ++ * @param name name ++ * @param mh method handle for generic version of method ++ * @param specs specializations ++ * @param flags {@link ScriptFunctionData} flags + */ +- FinalScriptFunctionData(final String name, final MethodHandle mh, final MethodHandle[] specs, final boolean isStrict, final boolean isBuiltin, final boolean isConstructor) { +- super(name, arity(mh), isStrict, isBuiltin, isConstructor); ++ FinalScriptFunctionData(final String name, final MethodHandle mh, final MethodHandle[] specs, final int flags) { ++ super(name, arity(mh), flags); + + addInvoker(mh); + if (specs != null) { +--- ./nashorn/src/jdk/nashorn/internal/runtime/FindProperty.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/FindProperty.java Wed Jul 30 03:55:26 2014 -0700 +@@ -112,7 +112,7 @@ + return property != null && property.hasGetterFunction(prototype) ? self : prototype; + } + +- /** ++ /** + * Return the appropriate receiver for a setter. + * @return appropriate receiver + */ +@@ -172,5 +172,20 @@ + property.setObjectValue(getSetterReceiver(), getOwner(), value, strict); + } + ++ /** ++ * Get the number of objects in the prototype chain between the {@code self} and the ++ * {@code owner} objects. ++ * @return the prototype chain length ++ */ ++ int getProtoChainLength() { ++ assert self != null; ++ int length = 0; ++ for (ScriptObject obj = self; obj != prototype; obj = obj.getProto()) { ++ assert !(obj instanceof WithObject); ++ ++length; ++ } ++ return length; ++ } ++ + } + +--- ./nashorn/src/jdk/nashorn/internal/runtime/GlobalFunctions.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/GlobalFunctions.java Wed Jul 30 03:55:26 2014 -0700 +@@ -459,5 +459,4 @@ + private static MethodHandle findOwnMH(final String name, final Class rtype, final Class... types) { + return MH.findStatic(MethodHandles.lookup(), GlobalFunctions.class, name, MH.type(rtype, types)); + } +- + } +--- ./nashorn/src/jdk/nashorn/internal/runtime/GlobalObject.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/GlobalObject.java Thu Jan 01 00:00:00 1970 +0000 +@@ -1,244 +0,0 @@ +-/* +- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. Oracle designates this +- * particular file as subject to the "Classpath" exception as provided +- * by Oracle in the LICENSE file that accompanied this code. +- * +- * This code is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * version 2 for more details (a copy is included in the LICENSE file that +- * accompanied this code). +- * +- * You should have received a copy of the GNU General Public License version +- * 2 along with this work; if not, write to the Free Software Foundation, +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +- * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- */ +- +-package jdk.nashorn.internal.runtime; +- +-import java.lang.invoke.MethodHandle; +-import java.util.concurrent.Callable; +-import jdk.internal.dynalink.linker.GuardedInvocation; +-import jdk.internal.dynalink.linker.LinkRequest; +-import jdk.nashorn.internal.runtime.linker.InvokeByName; +- +-/** +- * Runtime interface to the global scope objects. +- */ +- +-public interface GlobalObject { +- /** +- * Is this global of the given Context? +- * @param ctxt the context +- * @return true if this global belongs to the given Context +- */ +- public boolean isOfContext(final Context ctxt); +- +- /** +- * Does this global belong to a strict Context? +- * @return true if this global belongs to a strict Context +- */ +- public boolean isStrictContext(); +- +- /** +- * Initialize standard builtin objects like "Object", "Array", "Function" etc. +- * as well as our extension builtin objects like "Java", "JSAdapter" as properties +- * of the global scope object. +- */ +- public void initBuiltinObjects(); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newScriptFunction(String, MethodHandle, ScriptObject, boolean)} +- * +- * @param name function name +- * @param handle invocation handle for function +- * @param scope the scope +- * @param strict are we in strict mode +- * +- * @return new script function +- */ +- public ScriptFunction newScriptFunction(String name, MethodHandle handle, ScriptObject scope, boolean strict); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#wrapAsObject(Object)} +- * +- * @param obj object to wrap +- * @return wrapped object +- */ +- public Object wrapAsObject(Object obj); +- +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#primitiveLookup(LinkRequest, Object)} +- * +- * @param request the link request for the dynamic call site. +- * @param self self reference +- * +- * @return guarded invocation +- */ +- public GuardedInvocation primitiveLookup(LinkRequest request, Object self); +- +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newObject()} +- * +- * @return the new ScriptObject +- */ +- public ScriptObject newObject(); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#isError(ScriptObject)} +- * +- * @param sobj to check if it is an error object +- * @return true if error object +- */ +- public boolean isError(ScriptObject sobj); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newError(String)} +- * +- * @param msg the error message +- * +- * @return the new ScriptObject representing the error +- */ +- public ScriptObject newError(String msg); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newEvalError(String)} +- * +- * @param msg the error message +- * +- * @return the new ScriptObject representing the eval error +- */ +- public ScriptObject newEvalError(String msg); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newRangeError(String)} +- * +- * @param msg the error message +- * +- * @return the new ScriptObject representing the range error +- */ +- public ScriptObject newRangeError(String msg); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newReferenceError(String)} +- * +- * @param msg the error message +- * +- * @return the new ScriptObject representing the reference error +- */ +- public ScriptObject newReferenceError(String msg); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newSyntaxError(String)} +- * +- * @param msg the error message +- * +- * @return the new ScriptObject representing the syntax error +- */ +- public ScriptObject newSyntaxError(String msg); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newTypeError(String)} +- * +- * @param msg the error message +- * +- * @return the new ScriptObject representing the type error +- */ +- public ScriptObject newTypeError(String msg); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newURIError(String)} +- * +- * @param msg the error message +- * +- * @return the new ScriptObject representing the URI error +- */ +- public ScriptObject newURIError(String msg); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newGenericDescriptor(boolean, boolean)} +- * +- * @param configurable is the described property configurable +- * @param enumerable is the described property enumerable +- * +- * @return property descriptor +- */ +- public PropertyDescriptor newGenericDescriptor(boolean configurable, boolean enumerable); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newDataDescriptor(Object, boolean, boolean, boolean)} +- * +- * @param value data value +- * @param configurable is the described property configurable +- * @param enumerable is the described property enumerable +- * @param writable is the described property writable +- * +- * @return property descriptor +- */ +- public PropertyDescriptor newDataDescriptor(Object value, boolean configurable, boolean enumerable, boolean writable); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#newAccessorDescriptor(Object, Object, boolean, boolean)} +- * +- * @param get property getter, or null if none +- * @param set property setter, or null if none +- * @param configurable is the described property configurable +- * @param enumerable is the described property enumerable +- * +- * @return property descriptor +- */ +- public PropertyDescriptor newAccessorDescriptor(Object get, Object set, boolean configurable, boolean enumerable); +- +- /** +- * Wrapper for {@link jdk.nashorn.internal.objects.Global#getDefaultValue(ScriptObject, Class)} +- * +- * @param sobj script object +- * @param typeHint type hint +- * +- * @return default value +- */ +- public Object getDefaultValue(ScriptObject sobj, Class typeHint); +- +- /** +- * Find the compiled Class for the given script source, if available +- * +- * @param source Source object of the script +- * @return compiled Class object or null +- */ +- public Class findCachedClass(Source source); +- +- /** +- * Put the Source associated Class object in the Source-to-Class cache +- * +- * @param source Source of the script +- * @param clazz compiled Class object for the source +- */ +- public void cacheClass(Source source, Class clazz); +- +- /** +- * Get cached InvokeByName object for the given key +- * @param key key to be associated with InvokeByName object +- * @param creator if InvokeByName is absent 'creator' is called to make one (lazy init) +- * @return InvokeByName object associated with the key. +- */ +- public InvokeByName getInvokeByName(final Object key, final Callable creator); +- +- /** +- * Get cached dynamic method handle for the given key +- * @param key key to be associated with dynamic method handle +- * @param creator if method handle is absent 'creator' is called to make one (lazy init) +- * @return dynamic method handle associated with the key. +- */ +- public MethodHandle getDynamicInvoker(final Object key, final Callable creator); +-} +--- ./nashorn/src/jdk/nashorn/internal/runtime/JSONFunctions.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/JSONFunctions.java Wed Jul 30 03:55:26 2014 -0700 +@@ -33,11 +33,14 @@ + import jdk.nashorn.internal.ir.ObjectNode; + import jdk.nashorn.internal.ir.PropertyNode; + import jdk.nashorn.internal.ir.UnaryNode; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.parser.JSONParser; + import jdk.nashorn.internal.parser.TokenType; + import jdk.nashorn.internal.runtime.arrays.ArrayIndex; + import jdk.nashorn.internal.runtime.linker.Bootstrap; + ++import static jdk.nashorn.internal.runtime.Source.sourceFor; ++ + /** + * Utilities used by "JSON" object implementation. + */ +@@ -47,7 +50,7 @@ + private static final Object REVIVER_INVOKER = new Object(); + + private static MethodHandle getREVIVER_INVOKER() { +- return ((GlobalObject)Context.getGlobal()).getDynamicInvoker(REVIVER_INVOKER, ++ return Context.getGlobal().getDynamicInvoker(REVIVER_INVOKER, + new Callable() { + @Override + public MethodHandle call() { +@@ -76,9 +79,7 @@ + */ + public static Object parse(final Object text, final Object reviver) { + final String str = JSType.toString(text); +- final JSONParser parser = new JSONParser( +- new Source("", str), +- new Context.ThrowErrorManager()); ++ final JSONParser parser = new JSONParser(sourceFor("", str), new Context.ThrowErrorManager()); + + Node node; + +@@ -88,7 +89,7 @@ + throw ECMAErrors.syntaxError(e, "invalid.json", e.getMessage()); + } + +- final ScriptObject global = Context.getGlobalTrusted(); ++ final Global global = Context.getGlobal(); + Object unfiltered = convertNode(global, node); + return applyReviver(global, unfiltered, reviver); + } +@@ -98,10 +99,9 @@ + // parse helpers + + // apply 'reviver' function if available +- private static Object applyReviver(final ScriptObject global, final Object unfiltered, final Object reviver) { ++ private static Object applyReviver(final Global global, final Object unfiltered, final Object reviver) { + if (reviver instanceof ScriptFunction) { +- assert global instanceof GlobalObject; +- final ScriptObject root = ((GlobalObject)global).newObject(); ++ final ScriptObject root = global.newObject(); + root.addOwnProperty("", Property.WRITABLE_ENUMERABLE_CONFIGURABLE, unfiltered); + return walk(root, "", (ScriptFunction)reviver); + } +@@ -138,8 +138,8 @@ + } + + // Converts IR node to runtime value +- private static Object convertNode(final ScriptObject global, final Node node) { +- assert global instanceof GlobalObject; ++ private static Object convertNode(final Global global, final Node node) { ++ assert global instanceof Global; + + if (node instanceof LiteralNode) { + // check for array literal +@@ -157,7 +157,7 @@ + for (final Node elem : elements) { + values[index++] = JSType.toNumber(convertNode(global, elem)); + } +- return ((GlobalObject)global).wrapAsObject(values); ++ return global.wrapAsObject(values); + } + + final Object[] values = new Object[elements.length]; +@@ -167,14 +167,14 @@ + values[index++] = convertNode(global, elem); + } + +- return ((GlobalObject)global).wrapAsObject(values); ++ return global.wrapAsObject(values); + } + + return ((LiteralNode)node).getValue(); + + } else if (node instanceof ObjectNode) { + final ObjectNode objNode = (ObjectNode) node; +- final ScriptObject object = ((GlobalObject)global).newObject(); ++ final ScriptObject object = global.newObject(); + + for (final PropertyNode pNode: objNode.getElements()) { + final Node valueNode = pNode.getValue(); +--- ./nashorn/src/jdk/nashorn/internal/runtime/JSType.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/JSType.java Wed Jul 30 03:55:26 2014 -0700 +@@ -36,6 +36,7 @@ + import jdk.internal.dynalink.beans.StaticClass; + import jdk.nashorn.api.scripting.JSObject; + import jdk.nashorn.internal.codegen.CompilerConstants.Call; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.parser.Lexer; + import jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator; + import jdk.nashorn.internal.runtime.linker.Bootstrap; +@@ -437,7 +438,9 @@ + + // encode integer part from least significant digit, then reverse + do { +- sb.append(chars.charAt((int) (intPart % radix))); ++ final double remainder = intPart % radix; ++ sb.append(chars.charAt((int) remainder)); ++ intPart -= remainder; + intPart /= radix; + } while (intPart >= 1.0); + +@@ -852,7 +855,7 @@ + * @return the wrapped object + */ + public static Object toScriptObject(final Object obj) { +- return toScriptObject(Context.getGlobalTrusted(), obj); ++ return toScriptObject(Context.getGlobal(), obj); + } + + /** +@@ -865,7 +868,7 @@ + * + * @return the wrapped object + */ +- public static Object toScriptObject(final ScriptObject global, final Object obj) { ++ public static Object toScriptObject(final Global global, final Object obj) { + if (nullOrUndefined(obj)) { + throw typeError(global, "not.an.object", ScriptRuntime.safeToString(obj)); + } +@@ -874,7 +877,7 @@ + return obj; + } + +- return ((GlobalObject)global).wrapAsObject(obj); ++ return global.wrapAsObject(obj); + } + + /** +@@ -984,7 +987,7 @@ + if (obj instanceof ScriptObject) { + if (safe) { + final ScriptObject sobj = (ScriptObject)obj; +- final GlobalObject gobj = (GlobalObject)Context.getGlobalTrusted(); ++ final Global gobj = Context.getGlobal(); + return gobj.isError(sobj) ? + ECMAException.safeToString(sobj) : + sobj.safeToString(); +--- ./nashorn/src/jdk/nashorn/internal/runtime/ListAdapter.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ListAdapter.java Wed Jul 30 03:55:26 2014 -0700 +@@ -34,6 +34,7 @@ + import java.util.concurrent.Callable; + import jdk.nashorn.api.scripting.JSObject; + import jdk.nashorn.api.scripting.ScriptObjectMirror; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.runtime.linker.Bootstrap; + import jdk.nashorn.internal.runtime.linker.InvokeByName; + +@@ -54,7 +55,7 @@ + // These add to the back and front of the list + private static final Object PUSH = new Object(); + private static InvokeByName getPUSH() { +- return ((GlobalObject)Context.getGlobal()).getInvokeByName(PUSH, ++ return Context.getGlobal().getInvokeByName(PUSH, + new Callable() { + @Override + public InvokeByName call() { +@@ -65,7 +66,7 @@ + + private static final Object UNSHIFT = new Object(); + private static InvokeByName getUNSHIFT() { +- return ((GlobalObject)Context.getGlobal()).getInvokeByName(UNSHIFT, ++ return Context.getGlobal().getInvokeByName(UNSHIFT, + new Callable() { + @Override + public InvokeByName call() { +@@ -77,7 +78,7 @@ + // These remove from the back and front of the list + private static final Object POP = new Object(); + private static InvokeByName getPOP() { +- return ((GlobalObject)Context.getGlobal()).getInvokeByName(POP, ++ return Context.getGlobal().getInvokeByName(POP, + new Callable() { + @Override + public InvokeByName call() { +@@ -88,7 +89,7 @@ + + private static final Object SHIFT = new Object(); + private static InvokeByName getSHIFT() { +- return ((GlobalObject)Context.getGlobal()).getInvokeByName(SHIFT, ++ return Context.getGlobal().getInvokeByName(SHIFT, + new Callable() { + @Override + public InvokeByName call() { +@@ -100,7 +101,7 @@ + // These insert and remove in the middle of the list + private static final Object SPLICE_ADD = new Object(); + private static InvokeByName getSPLICE_ADD() { +- return ((GlobalObject)Context.getGlobal()).getInvokeByName(SPLICE_ADD, ++ return Context.getGlobal().getInvokeByName(SPLICE_ADD, + new Callable() { + @Override + public InvokeByName call() { +@@ -111,7 +112,7 @@ + + private static final Object SPLICE_REMOVE = new Object(); + private static InvokeByName getSPLICE_REMOVE() { +- return ((GlobalObject)Context.getGlobal()).getInvokeByName(SPLICE_REMOVE, ++ return Context.getGlobal().getInvokeByName(SPLICE_REMOVE, + new Callable() { + @Override + public InvokeByName call() { +--- ./nashorn/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/NativeJavaPackage.java Wed Jul 30 03:55:26 2014 -0700 +@@ -35,7 +35,6 @@ + import jdk.internal.dynalink.support.Guards; + import jdk.nashorn.internal.lookup.MethodHandleFactory; + import jdk.nashorn.internal.lookup.MethodHandleFunctionality; +-import jdk.nashorn.internal.objects.NativeJava; + import jdk.nashorn.internal.objects.annotations.Attribute; + import jdk.nashorn.internal.objects.annotations.Function; + +@@ -52,7 +51,7 @@ + * var ArrayList = java.util.ArrayList + * var list = new ArrayList + * +- * You can also use {@link NativeJava#type(Object, Object)} to access Java classes. These two statements are mostly ++ * You can also use {@link jdk.nashorn.internal.objects.NativeJava#type(Object, Object)} to access Java classes. These two statements are mostly + * equivalent: + *
    +  * var listType1 = java.util.ArrayList
    +@@ -198,24 +197,13 @@
    +     @Override
    +     public GuardedInvocation noSuchProperty(final CallSiteDescriptor desc, final LinkRequest request) {
    +         final String propertyName = desc.getNameToken(2);
    +-        final String fullName     = name.isEmpty() ? propertyName : name + "." + propertyName;
    ++        createProperty(propertyName);
    ++        return super.lookup(desc, request);
    ++    }
    + 
    +-        final Context context = Context.getContextTrusted();
    +-
    +-        Class javaClass = null;
    +-        try {
    +-            javaClass = context.findClass(fullName);
    +-        } catch (final NoClassDefFoundError | ClassNotFoundException e) {
    +-            //ignored
    +-        }
    +-
    +-        if (javaClass == null) {
    +-            set(propertyName, new NativeJavaPackage(fullName, getProto()), false);
    +-        } else {
    +-            set(propertyName, StaticClass.forClass(javaClass), false);
    +-        }
    +-
    +-        return super.lookup(desc, request);
    ++    @Override
    ++    protected Object invokeNoSuchProperty(final String name) {
    ++        return createProperty(name);
    +     }
    + 
    +     @Override
    +@@ -226,4 +214,26 @@
    +     private static MethodHandle findOwnMH(final String name, final Class rtype, final Class... types) {
    +         return MH.findStatic(MethodHandles.lookup(), NativeJavaPackage.class, name, MH.type(rtype, types));
    +     }
    ++
    ++    private Object createProperty(final String propertyName) {
    ++        final String fullName     = name.isEmpty() ? propertyName : name + "." + propertyName;
    ++        final Context context = Context.getContextTrusted();
    ++
    ++        Class javaClass = null;
    ++        try {
    ++            javaClass = context.findClass(fullName);
    ++        } catch (final NoClassDefFoundError | ClassNotFoundException e) {
    ++            //ignored
    ++        }
    ++
    ++        final Object propertyValue;
    ++        if (javaClass == null) {
    ++            propertyValue = new NativeJavaPackage(fullName, getProto());
    ++        } else {
    ++            propertyValue = StaticClass.forClass(javaClass);
    ++        }
    ++
    ++        set(propertyName, propertyValue, false);
    ++        return propertyValue;
    ++    }
    + }
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/ParserException.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ParserException.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -26,6 +26,7 @@
    + package jdk.nashorn.internal.runtime;
    + 
    + import jdk.nashorn.api.scripting.NashornException;
    ++import jdk.nashorn.internal.objects.Global;
    + import jdk.nashorn.internal.parser.Token;
    + 
    + /**
    +@@ -110,7 +111,7 @@
    +      * Throw this {@code ParserException} as one of the 7 native JavaScript errors
    +      * @param global global scope object
    +      */
    +-    public void throwAsEcmaException(final ScriptObject global) {
    ++    public void throwAsEcmaException(final Global global) {
    +         throw ECMAErrors.asEcmaException(global, this);
    +     }
    + }
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/Property.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/Property.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -29,6 +29,7 @@
    + import static jdk.nashorn.internal.runtime.PropertyDescriptor.ENUMERABLE;
    + import static jdk.nashorn.internal.runtime.PropertyDescriptor.WRITABLE;
    + 
    ++import java.io.Serializable;
    + import java.lang.invoke.MethodHandle;
    + import java.util.Objects;
    + import jdk.nashorn.internal.codegen.ObjectClassGenerator;
    +@@ -43,7 +44,7 @@
    +  * @see AccessorProperty
    +  * @see UserAccessorProperty
    +  */
    +-public abstract class Property {
    ++public abstract class Property implements Serializable {
    +     /*
    +      * ECMA 8.6.1 Property Attributes
    +      *
    +@@ -84,9 +85,13 @@
    +     /** Can this property be undefined? */
    +     public static final int CAN_BE_UNDEFINED = 1 << 8;
    + 
    +-    /* Is this a function declaration property ? */
    ++    /** Is this a function declaration property ? */
    +     public static final int IS_FUNCTION_DECLARATION = 1 << 9;
    + 
    ++    /** Is this property bound to a receiver? This means get/set operations will be delegated to
    ++     *  a statically defined object instead of the object passed as callsite parameter. */
    ++    public static final int IS_BOUND = 1 << 10;
    ++
    +     /** Property key. */
    +     private final String key;
    + 
    +@@ -96,6 +101,8 @@
    +     /** Property field number or spill slot. */
    +     private final int slot;
    + 
    ++    private static final long serialVersionUID = 2099814273074501176L;
    ++
    +     /**
    +      * Constructor
    +      *
    +@@ -252,6 +259,16 @@
    +     }
    + 
    +     /**
    ++     * Is this property bound to a receiver? If this method returns {@code true} get and set operations
    ++     * will be delegated to a statically bound object instead of the object passed as parameter.
    ++     *
    ++     * @return true if this is a bound property
    ++     */
    ++    public boolean isBound() {
    ++        return (flags & IS_BOUND) == IS_BOUND;
    ++    }
    ++
    ++    /**
    +      * Does this property use any slots in the spill array described in
    +      * {@link Property#isSpill}? In that case how many. Currently a property
    +      * only uses max one spill slot, but this may change in future representations
    +@@ -344,6 +361,13 @@
    +     public abstract MethodHandle getGetter(final Class type);
    + 
    +     /**
    ++     * Hook to initialize method handles after deserialization.
    ++     *
    ++     * @param structure the structure class
    ++     */
    ++    abstract void initMethodHandles(final Class structure);
    ++
    ++    /**
    +      * Get the key for this property. This key is an ordinary string. The "name".
    +      * @return key for property
    +      */
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/PropertyDescriptor.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/PropertyDescriptor.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -151,5 +151,12 @@
    +      * @return true if property exists in implementor
    +      */
    +     public boolean has(Object key);
    ++
    ++    /**
    ++     * Check existence and compare attributes of descriptors.
    ++     *
    ++     * @return true if every field of this desc exists in otherDesc and has the same value.
    ++     */
    ++    public boolean hasAndEquals(PropertyDescriptor otherDesc);
    + }
    + 
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/PropertyListener.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/PropertyListener.java	Thu Jan 01 00:00:00 1970 +0000
    +@@ -1,66 +0,0 @@
    +-/*
    +- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
    +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    +- *
    +- * This code is free software; you can redistribute it and/or modify it
    +- * under the terms of the GNU General Public License version 2 only, as
    +- * published by the Free Software Foundation.  Oracle designates this
    +- * particular file as subject to the "Classpath" exception as provided
    +- * by Oracle in the LICENSE file that accompanied this code.
    +- *
    +- * This code is distributed in the hope that it will be useful, but WITHOUT
    +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    +- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    +- * version 2 for more details (a copy is included in the LICENSE file that
    +- * accompanied this code).
    +- *
    +- * You should have received a copy of the GNU General Public License version
    +- * 2 along with this work; if not, write to the Free Software Foundation,
    +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    +- *
    +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    +- * or visit www.oracle.com if you need additional information or have any
    +- * questions.
    +- */
    +-
    +-package jdk.nashorn.internal.runtime;
    +-
    +-/**
    +- * Property change listener gets notified whenever properties are added/deleted/modified.
    +- */
    +-public interface PropertyListener {
    +-    /**
    +-     * A new property is being added.
    +-     *
    +-     * @param object The ScriptObject to which property was added.
    +-     * @param prop The new Property added.
    +-     */
    +-    public void propertyAdded(ScriptObject object, Property prop);
    +-
    +-    /**
    +-     * An existing property is being deleted.
    +-     *
    +-     * @param object The ScriptObject whose property is being deleted.
    +-     * @param prop The property being deleted.
    +-     */
    +-    public void propertyDeleted(ScriptObject object, Property prop);
    +-
    +-    /**
    +-     * An existing Property is being replaced with a new Property.
    +-     *
    +-     * @param object The ScriptObject whose property is being modified.
    +-     * @param oldProp The old property that is being replaced.
    +-     * @param newProp The new property that replaces the old property.
    +-     *
    +-     */
    +-    public void propertyModified(ScriptObject object, Property oldProp, Property newProp);
    +-
    +-    /**
    +-     * Given object's __proto__ has changed.
    +-     *
    +-     * @param object object whose __proto__ has changed.
    +-     * @param oldProto old __proto__
    +-     * @param newProto new __proto__
    +-     */
    +-    public void protoChanged(ScriptObject object, ScriptObject oldProto, ScriptObject newProto);
    +-}
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/PropertyListenerManager.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/PropertyListenerManager.java	Thu Jan 01 00:00:00 1970 +0000
    +@@ -1,179 +0,0 @@
    +-/*
    +- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
    +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    +- *
    +- * This code is free software; you can redistribute it and/or modify it
    +- * under the terms of the GNU General Public License version 2 only, as
    +- * published by the Free Software Foundation.  Oracle designates this
    +- * particular file as subject to the "Classpath" exception as provided
    +- * by Oracle in the LICENSE file that accompanied this code.
    +- *
    +- * This code is distributed in the hope that it will be useful, but WITHOUT
    +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    +- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    +- * version 2 for more details (a copy is included in the LICENSE file that
    +- * accompanied this code).
    +- *
    +- * You should have received a copy of the GNU General Public License version
    +- * 2 along with this work; if not, write to the Free Software Foundation,
    +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    +- *
    +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    +- * or visit www.oracle.com if you need additional information or have any
    +- * questions.
    +- */
    +-
    +-package jdk.nashorn.internal.runtime;
    +-
    +-import java.util.Map;
    +-import java.util.WeakHashMap;
    +-
    +-/**
    +- * Helper class to manage property listeners and notification.
    +- */
    +-public class PropertyListenerManager implements PropertyListener {
    +-    PropertyListenerManager() {}
    +-
    +-    /** property listeners for this object. */
    +-    private Map listeners;
    +-
    +-    // These counters are updated in debug mode
    +-    private static int listenersAdded;
    +-    private static int listenersRemoved;
    +-
    +-    /**
    +-     * Return aggregate listeners added to all PropertyListenerManagers
    +-     * @return the listenersAdded
    +-     */
    +-    public static int getListenersAdded() {
    +-        return listenersAdded;
    +-    }
    +-
    +-    /**
    +-     * Return aggregate listeners removed from all PropertyListenerManagers
    +-     * @return the listenersRemoved
    +-     */
    +-    public static int getListenersRemoved() {
    +-        return listenersRemoved;
    +-    }
    +-
    +-    /**
    +-     * Return listeners added to this PropertyListenerManager.
    +-     * @return the listener count
    +-     */
    +-    public final int getListenerCount() {
    +-        return listeners != null? listeners.size() : 0;
    +-    }
    +-
    +-    // Property listener management methods
    +-
    +-    /**
    +-     * Add a property listener to this object.
    +-     *
    +-     * @param listener The property listener that is added.
    +-     */
    +-    public synchronized final void addPropertyListener(final PropertyListener listener) {
    +-        if (listeners == null) {
    +-            listeners = new WeakHashMap<>();
    +-        }
    +-
    +-        if (Context.DEBUG) {
    +-            listenersAdded++;
    +-        }
    +-        listeners.put(listener, Boolean.TRUE);
    +-    }
    +-
    +-    /**
    +-     * Remove a property listener from this object.
    +-     *
    +-     * @param listener The property listener that is removed.
    +-     */
    +-    public synchronized final void removePropertyListener(final PropertyListener listener) {
    +-        if (listeners != null) {
    +-            if (Context.DEBUG) {
    +-                listenersRemoved++;
    +-            }
    +-            listeners.remove(listener);
    +-        }
    +-    }
    +-
    +-    /**
    +-     * This method can be called to notify property addition to this object's listeners.
    +-     *
    +-     * @param object The ScriptObject to which property was added.
    +-     * @param prop The property being added.
    +-     */
    +-    protected synchronized final void notifyPropertyAdded(final ScriptObject object, final Property prop) {
    +-        if (listeners != null) {
    +-            for (PropertyListener listener : listeners.keySet()) {
    +-                listener.propertyAdded(object, prop);
    +-            }
    +-        }
    +-    }
    +-
    +-    /**
    +-     * This method can be called to notify property deletion to this object's listeners.
    +-     *
    +-     * @param object The ScriptObject from which property was deleted.
    +-     * @param prop The property being deleted.
    +-     */
    +-    protected synchronized final void notifyPropertyDeleted(final ScriptObject object, final Property prop) {
    +-        if (listeners != null) {
    +-            for (PropertyListener listener : listeners.keySet()) {
    +-                listener.propertyDeleted(object, prop);
    +-            }
    +-        }
    +-    }
    +-
    +-    /**
    +-     * This method can be called to notify property modification to this object's listeners.
    +-     *
    +-     * @param object The ScriptObject to which property was modified.
    +-     * @param oldProp The old property being replaced.
    +-     * @param newProp The new property that replaces the old property.
    +-     */
    +-    protected synchronized final void notifyPropertyModified(final ScriptObject object, final Property oldProp, final Property newProp) {
    +-        if (listeners != null) {
    +-            for (PropertyListener listener : listeners.keySet()) {
    +-                listener.propertyModified(object, oldProp, newProp);
    +-            }
    +-        }
    +-    }
    +-
    +-    /**
    +-     * This method can be called to notify __proto__ modification to this object's listeners.
    +-     *
    +-     * @param object The ScriptObject whose __proto__ was changed.
    +-     * @param oldProto old __proto__
    +-     * @param newProto new __proto__
    +-     */
    +-    protected synchronized final void notifyProtoChanged(final ScriptObject object, final ScriptObject oldProto, final ScriptObject newProto) {
    +-        if (listeners != null) {
    +-            for (PropertyListener listener : listeners.keySet()) {
    +-                listener.protoChanged(object, oldProto, newProto);
    +-            }
    +-        }
    +-    }
    +-
    +-    // PropertyListener methods
    +-
    +-    @Override
    +-    public final void propertyAdded(final ScriptObject object, final Property prop) {
    +-        notifyPropertyAdded(object, prop);
    +-    }
    +-
    +-    @Override
    +-    public final void propertyDeleted(final ScriptObject object, final Property prop) {
    +-        notifyPropertyDeleted(object, prop);
    +-    }
    +-
    +-    @Override
    +-    public final void propertyModified(final ScriptObject object, final Property oldProp, final Property newProp) {
    +-        notifyPropertyModified(object, oldProp, newProp);
    +-    }
    +-
    +-    @Override
    +-    public final void protoChanged(final ScriptObject object, final ScriptObject oldProto, final ScriptObject newProto) {
    +-        notifyProtoChanged(object, oldProto, newProto);
    +-    }
    +-}
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/PropertyListeners.java	Thu Jan 01 00:00:00 1970 +0000
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/PropertyListeners.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -0,0 +1,222 @@
    ++/*
    ++ * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
    ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    ++ *
    ++ * This code is free software; you can redistribute it and/or modify it
    ++ * under the terms of the GNU General Public License version 2 only, as
    ++ * published by the Free Software Foundation.  Oracle designates this
    ++ * particular file as subject to the "Classpath" exception as provided
    ++ * by Oracle in the LICENSE file that accompanied this code.
    ++ *
    ++ * This code is distributed in the hope that it will be useful, but WITHOUT
    ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    ++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    ++ * version 2 for more details (a copy is included in the LICENSE file that
    ++ * accompanied this code).
    ++ *
    ++ * You should have received a copy of the GNU General Public License version
    ++ * 2 along with this work; if not, write to the Free Software Foundation,
    ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    ++ *
    ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    ++ * or visit www.oracle.com if you need additional information or have any
    ++ * questions.
    ++ */
    ++
    ++package jdk.nashorn.internal.runtime;
    ++
    ++import java.util.Map;
    ++import java.util.Set;
    ++import java.util.WeakHashMap;
    ++
    ++/**
    ++ * Helper class to manage property listeners and notification.
    ++ */
    ++public class PropertyListeners {
    ++
    ++    private Map listeners;
    ++
    ++    // These counters are updated in debug mode
    ++    private static int listenersAdded;
    ++    private static int listenersRemoved;
    ++
    ++    /**
    ++     * Copy constructor
    ++     * @param listener listener to copy
    ++     */
    ++    PropertyListeners(final PropertyListeners listener) {
    ++        if (listener != null && listener.listeners != null) {
    ++            this.listeners = new WeakHashMap<>(listener.listeners);
    ++        }
    ++    }
    ++
    ++    /**
    ++     * Return aggregate listeners added to all PropertyListenerManagers
    ++     * @return the listenersAdded
    ++     */
    ++    public static int getListenersAdded() {
    ++        return listenersAdded;
    ++    }
    ++
    ++    /**
    ++     * Return aggregate listeners removed from all PropertyListenerManagers
    ++     * @return the listenersRemoved
    ++     */
    ++    public static int getListenersRemoved() {
    ++        return listenersRemoved;
    ++    }
    ++
    ++    /**
    ++     * Return listeners added to this ScriptObject.
    ++     * @param obj the object
    ++     * @return the listener count
    ++     */
    ++    public static int getListenerCount(final ScriptObject obj) {
    ++        final PropertyListeners propertyListeners = obj.getMap().getListeners();
    ++        if (propertyListeners != null) {
    ++            return propertyListeners.listeners == null ? 0 : propertyListeners.listeners.size();
    ++        }
    ++        return 0;
    ++    }
    ++
    ++    // Property listener management methods
    ++
    ++    /**
    ++     * Add {@code propertyMap} as property listener to {@code listeners} using key {@code key} by
    ++     * creating and returning a new {@code PropertyListeners} instance.
    ++     *
    ++     * @param listeners the original property listeners instance, may be null
    ++     * @param key the property key
    ++     * @param propertyMap the property map
    ++     * @return the new property map
    ++     */
    ++    public static PropertyListeners addListener(final PropertyListeners listeners, final String key, final PropertyMap propertyMap) {
    ++        final PropertyListeners newListeners;
    ++        if (listeners == null || !listeners.containsListener(key, propertyMap)) {
    ++            newListeners = new PropertyListeners(listeners);
    ++            newListeners.addListener(key, propertyMap);
    ++            return newListeners;
    ++        }
    ++        return listeners;
    ++    }
    ++
    ++    /**
    ++     * Checks whether {@code propertyMap} is registered as listener with {@code key}.
    ++     *
    ++     * @param key the property key
    ++     * @param propertyMap the property map
    ++     * @return true if property map is registered with property key
    ++     */
    ++    synchronized boolean containsListener(final String key, final PropertyMap propertyMap) {
    ++        if (listeners == null) {
    ++            return false;
    ++        }
    ++        WeakPropertyMapSet set = listeners.get(key);
    ++        return set != null && set.contains(propertyMap);
    ++    }
    ++
    ++    /**
    ++     * Add a property listener to this object.
    ++     *
    ++     * @param propertyMap The property listener that is added.
    ++     */
    ++    synchronized final void addListener(final String key, final PropertyMap propertyMap) {
    ++        if (Context.DEBUG) {
    ++            listenersAdded++;
    ++        }
    ++        if (listeners == null) {
    ++            listeners = new WeakHashMap<>();
    ++        }
    ++
    ++        WeakPropertyMapSet set = listeners.get(key);
    ++        if (set == null) {
    ++            set = new WeakPropertyMapSet();
    ++            listeners.put(key, set);
    ++        }
    ++        if (!set.contains(propertyMap)) {
    ++            set.add(propertyMap);
    ++        }
    ++    }
    ++
    ++    /**
    ++     * A new property is being added.
    ++     *
    ++     * @param prop The new Property added.
    ++     */
    ++    public synchronized void propertyAdded(final Property prop) {
    ++        if (listeners != null) {
    ++            WeakPropertyMapSet set = listeners.get(prop.getKey());
    ++            if (set != null) {
    ++                for (PropertyMap propertyMap : set.elements()) {
    ++                    propertyMap.propertyAdded(prop);
    ++                }
    ++                listeners.remove(prop.getKey());
    ++            }
    ++        }
    ++    }
    ++
    ++    /**
    ++     * An existing property is being deleted.
    ++     *
    ++     * @param prop The property being deleted.
    ++     */
    ++    public synchronized void propertyDeleted(final Property prop) {
    ++        if (listeners != null) {
    ++            WeakPropertyMapSet set = listeners.get(prop.getKey());
    ++            if (set != null) {
    ++                for (PropertyMap propertyMap : set.elements()) {
    ++                    propertyMap.propertyDeleted(prop);
    ++                }
    ++                listeners.remove(prop.getKey());
    ++            }
    ++        }
    ++    }
    ++
    ++    /**
    ++     * An existing Property is being replaced with a new Property.
    ++     *
    ++     * @param oldProp The old property that is being replaced.
    ++     * @param newProp The new property that replaces the old property.
    ++     *
    ++     */
    ++    public synchronized void propertyModified(final Property oldProp, final Property newProp) {
    ++        if (listeners != null) {
    ++            WeakPropertyMapSet set = listeners.get(oldProp.getKey());
    ++            if (set != null) {
    ++                for (PropertyMap propertyMap : set.elements()) {
    ++                    propertyMap.propertyModified(oldProp, newProp);
    ++                }
    ++                listeners.remove(oldProp.getKey());
    ++            }
    ++        }
    ++    }
    ++
    ++    public synchronized void protoChanged() {
    ++        if (listeners != null) {
    ++            for (WeakPropertyMapSet set : listeners.values()) {
    ++                for (PropertyMap propertyMap : set.elements()) {
    ++                    propertyMap.protoChanged();
    ++                }
    ++            }
    ++            listeners.clear();
    ++        }
    ++    }
    ++
    ++    private static class WeakPropertyMapSet {
    ++
    ++        private WeakHashMap map = new WeakHashMap<>();
    ++
    ++        void add(final PropertyMap propertyMap) {
    ++            map.put(propertyMap, Boolean.TRUE);
    ++        }
    ++
    ++        boolean contains(final PropertyMap propertyMap) {
    ++            return map.containsKey(propertyMap);
    ++        }
    ++
    ++        Set elements() {
    ++            return map.keySet();
    ++        }
    ++
    ++    }
    ++}
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/PropertyMap.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -29,16 +29,19 @@
    + import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.getArrayIndex;
    + import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.isValidArrayIndex;
    + 
    ++import java.io.IOException;
    ++import java.io.ObjectInputStream;
    ++import java.io.ObjectOutputStream;
    ++import java.io.Serializable;
    + import java.lang.invoke.SwitchPoint;
    +-import java.lang.ref.WeakReference;
    ++import java.lang.ref.SoftReference;
    + import java.util.Arrays;
    + import java.util.Collection;
    + import java.util.HashMap;
    + import java.util.Iterator;
    +-import java.util.LinkedHashMap;
    +-import java.util.Map;
    + import java.util.NoSuchElementException;
    + import java.util.WeakHashMap;
    ++import jdk.nashorn.internal.scripts.JO;
    + 
    + /**
    +  * Map of object properties. The PropertyMap is the "template" for JavaScript object
    +@@ -49,23 +52,17 @@
    +  * All property maps are immutable. If a property is added, modified or removed, the mutator
    +  * will return a new map.
    +  */
    +-public final class PropertyMap implements Iterable, PropertyListener {
    ++public final class PropertyMap implements Iterable, Serializable {
    +     /** Used for non extensible PropertyMaps, negative logic as the normal case is extensible. See {@link ScriptObject#preventExtensions()} */
    +     public static final int NOT_EXTENSIBLE        = 0b0000_0001;
    +     /** Does this map contain valid array keys? */
    +     public static final int CONTAINS_ARRAY_KEYS   = 0b0000_0010;
    +-    /** This mask is used to preserve certain flags when cloning the PropertyMap. Others should not be copied */
    +-    private static final int CLONEABLE_FLAGS_MASK = 0b0000_1111;
    +-    /** Has a listener been added to this property map. This flag is not copied when cloning a map. See {@link PropertyListener} */
    +-    public static final int IS_LISTENER_ADDED     = 0b0001_0000;
    +-    /** Is this process wide "shared" map?. This flag is not copied when cloning a map */
    +-    public static final int IS_SHARED             = 0b0010_0000;
    + 
    +     /** Map status flags. */
    +     private int flags;
    + 
    +     /** Map of properties. */
    +-    private final PropertyHashMap properties;
    ++    private transient PropertyHashMap properties;
    + 
    +     /** Number of fields in use. */
    +     private int fieldCount;
    +@@ -76,17 +73,22 @@
    +     /** Length of spill in use. */
    +     private int spillLength;
    + 
    ++    /** Structure class name */
    ++    private String className;
    ++
    +     /** {@link SwitchPoint}s for gets on inherited properties. */
    +-    private Map protoGetSwitches;
    ++    private transient HashMap protoGetSwitches;
    + 
    +     /** History of maps, used to limit map duplication. */
    +-    private HashMap history;
    ++    private transient WeakHashMap> history;
    + 
    +     /** History of prototypes, used to limit map duplication. */
    +-    private WeakHashMap> protoHistory;
    ++    private transient WeakHashMap> protoHistory;
    + 
    +-    /** Cache for hashCode */
    +-    private int hashCode;
    ++    /** property listeners */
    ++    private transient PropertyListeners listeners;
    ++
    ++    private static final long serialVersionUID = -7041836752008732533L;
    + 
    +     /**
    +      * Constructor.
    +@@ -97,8 +99,10 @@
    +      * @param spillLength  Number of spill slots used.
    +      * @param containsArrayKeys True if properties contain numeric keys
    +      */
    +-    private PropertyMap(final PropertyHashMap properties, final int fieldCount, final int fieldMaximum, final int spillLength, final boolean containsArrayKeys) {
    ++    private PropertyMap(final PropertyHashMap properties, final String className, final int fieldCount,
    ++                        final int fieldMaximum, final int spillLength, final boolean containsArrayKeys) {
    +         this.properties   = properties;
    ++        this.className    = className;
    +         this.fieldCount   = fieldCount;
    +         this.fieldMaximum = fieldMaximum;
    +         this.spillLength  = spillLength;
    +@@ -119,10 +123,12 @@
    +      */
    +     private PropertyMap(final PropertyMap propertyMap, final PropertyHashMap properties) {
    +         this.properties   = properties;
    +-        this.flags        = propertyMap.getClonedFlags();
    ++        this.flags        = propertyMap.flags;
    +         this.spillLength  = propertyMap.spillLength;
    +         this.fieldCount   = propertyMap.fieldCount;
    +         this.fieldMaximum = propertyMap.fieldMaximum;
    ++        // We inherit the parent property listeners instance. It will be cloned when a new listener is added.
    ++        this.listeners    = propertyMap.listeners;
    + 
    +         if (Context.DEBUG) {
    +             count++;
    +@@ -151,7 +157,25 @@
    +         if (Context.DEBUG) {
    +             duplicatedCount++;
    +         }
    +-        return new PropertyMap(this.properties, 0, 0, 0, containsArrayKeys());
    ++        return new PropertyMap(this.properties, this.className, 0, 0, 0, containsArrayKeys());
    ++    }
    ++
    ++    private void writeObject(final ObjectOutputStream out) throws IOException {
    ++        out.defaultWriteObject();
    ++        out.writeObject(properties.getProperties());
    ++    }
    ++
    ++    private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
    ++        in.defaultReadObject();
    ++
    ++        final Property[] props = (Property[]) in.readObject();
    ++        this.properties = EMPTY_HASHMAP.immutableAdd(props);
    ++
    ++        assert className != null;
    ++        final Class structure = Context.forStructureClass(className);
    ++        for (Property prop : props) {
    ++            prop.initMethodHandles(structure);
    ++        }
    +     }
    + 
    +     /**
    +@@ -166,9 +190,9 @@
    +      * @param spillLength  Number of used spill slots.
    +      * @return New {@link PropertyMap}.
    +      */
    +-    public static PropertyMap newMap(final Collection properties, final int fieldCount, final int fieldMaximum,  final int spillLength) {
    ++    public static PropertyMap newMap(final Collection properties, final String className, final int fieldCount, final int fieldMaximum,  final int spillLength) {
    +         PropertyHashMap newProperties = EMPTY_HASHMAP.immutableAdd(properties);
    +-        return new PropertyMap(newProperties, fieldCount, fieldMaximum, spillLength, false);
    ++        return new PropertyMap(newProperties, className, fieldCount, fieldMaximum, spillLength, false);
    +     }
    + 
    +     /**
    +@@ -181,7 +205,7 @@
    +      * @return New {@link PropertyMap}.
    +      */
    +     public static PropertyMap newMap(final Collection properties) {
    +-        return (properties == null || properties.isEmpty())? newMap() : newMap(properties, 0, 0, 0);
    ++        return (properties == null || properties.isEmpty())? newMap() : newMap(properties, JO.class.getName(), 0, 0, 0);
    +     }
    + 
    +     /**
    +@@ -190,7 +214,7 @@
    +      * @return New empty {@link PropertyMap}.
    +      */
    +     public static PropertyMap newMap() {
    +-        return new PropertyMap(EMPTY_HASHMAP, 0, 0, 0, false);
    ++        return new PropertyMap(EMPTY_HASHMAP, JO.class.getName(), 0, 0, 0, false);
    +     }
    + 
    +     /**
    +@@ -203,35 +227,92 @@
    +     }
    + 
    +     /**
    ++     * Get the listeners of this map, or null if none exists
    ++     *
    ++     * @return the listeners
    ++     */
    ++    public PropertyListeners getListeners() {
    ++        return listeners;
    ++    }
    ++
    ++    /**
    ++     * Add {@code listenerMap} as a listener to this property map for the given {@code key}.
    ++     *
    ++     * @param key the property name
    ++     * @param listenerMap the listener map
    ++     */
    ++    public void addListener(final String key, final PropertyMap listenerMap) {
    ++        if (listenerMap != this) {
    ++            // We need to clone listener instance when adding a new listener since we share
    ++            // the listeners instance with our parent maps that don't need to see the new listener.
    ++            listeners = PropertyListeners.addListener(listeners, key, listenerMap);
    ++        }
    ++    }
    ++
    ++    /**
    ++     * A new property is being added.
    ++     *
    ++     * @param property The new Property added.
    ++     */
    ++    public void propertyAdded(final Property property) {
    ++        invalidateProtoGetSwitchPoint(property);
    ++        if (listeners != null) {
    ++            listeners.propertyAdded(property);
    ++        }
    ++    }
    ++
    ++    /**
    ++     * An existing property is being deleted.
    ++     *
    ++     * @param property The property being deleted.
    ++     */
    ++    public void propertyDeleted(final Property property) {
    ++        invalidateProtoGetSwitchPoint(property);
    ++        if (listeners != null) {
    ++            listeners.propertyDeleted(property);
    ++        }
    ++    }
    ++
    ++    /**
    ++     * An existing property is being redefined.
    ++     *
    ++     * @param oldProperty The old property
    ++     * @param newProperty The new property
    ++     */
    ++    public void propertyModified(final Property oldProperty, final Property newProperty) {
    ++        invalidateProtoGetSwitchPoint(oldProperty);
    ++        if (listeners != null) {
    ++            listeners.propertyModified(oldProperty, newProperty);
    ++        }
    ++    }
    ++
    ++    /**
    ++     * The prototype of an object associated with this {@link PropertyMap} is changed.
    ++     */
    ++    public void protoChanged() {
    ++        invalidateAllProtoGetSwitchPoints();
    ++        if (listeners != null) {
    ++            listeners.protoChanged();
    ++        }
    ++    }
    ++
    ++    /**
    +      * Return a SwitchPoint used to track changes of a property in a prototype.
    +      *
    +-     * @param proto  Object prototype.
    +-     * @param key    {@link Property} key.
    +-     *
    ++     * @param key Property key.
    +      * @return A shared {@link SwitchPoint} for the property.
    +      */
    +-    public SwitchPoint getProtoGetSwitchPoint(final ScriptObject proto, final String key) {
    +-        assert !isShared() : "proto SwitchPoint from a shared PropertyMap";
    +-
    +-        if (proto == null) {
    +-            return null;
    ++    public synchronized SwitchPoint getSwitchPoint(final String key) {
    ++        if (protoGetSwitches == null) {
    ++            protoGetSwitches = new HashMap<>();
    +         }
    + 
    +-        if (protoGetSwitches == null) {
    +-            protoGetSwitches = new HashMap<>();
    +-            if (! isListenerAdded()) {
    +-                proto.addPropertyListener(this);
    +-                setIsListenerAdded();
    +-            }
    ++        SwitchPoint switchPoint = protoGetSwitches.get(key);
    ++        if (switchPoint == null) {
    ++            switchPoint = new SwitchPoint();
    ++            protoGetSwitches.put(key, switchPoint);
    +         }
    + 
    +-        if (protoGetSwitches.containsKey(key)) {
    +-            return protoGetSwitches.get(key);
    +-        }
    +-
    +-        final SwitchPoint switchPoint = new SwitchPoint();
    +-        protoGetSwitches.put(key, switchPoint);
    +-
    +         return switchPoint;
    +     }
    + 
    +@@ -240,14 +321,13 @@
    +      *
    +      * @param property {@link Property} to invalidate.
    +      */
    +-    private void invalidateProtoGetSwitchPoint(final Property property) {
    +-        assert !isShared() : "proto invalidation on a shared PropertyMap";
    ++    synchronized void invalidateProtoGetSwitchPoint(final Property property) {
    ++        if (protoGetSwitches != null) {
    + 
    +-        if (protoGetSwitches != null) {
    +             final String key = property.getKey();
    +             final SwitchPoint sp = protoGetSwitches.get(key);
    +             if (sp != null) {
    +-                protoGetSwitches.put(key, new SwitchPoint());
    ++                protoGetSwitches.remove(key);
    +                 if (Context.DEBUG) {
    +                     protoInvalidations++;
    +                 }
    +@@ -257,14 +337,15 @@
    +     }
    + 
    +     /**
    +-     * Indicate that proto itself has changed in hierachy somewhere.
    ++     * Indicate that proto itself has changed in hierarchy somewhere.
    +      */
    +-    private void invalidateAllProtoGetSwitchPoints() {
    +-        assert !isShared() : "proto invalidation on a shared PropertyMap";
    +-
    +-        if (protoGetSwitches != null) {
    +-            final Collection sws = protoGetSwitches.values();
    +-            SwitchPoint.invalidateAll(sws.toArray(new SwitchPoint[sws.size()]));
    ++    synchronized void invalidateAllProtoGetSwitchPoints() {
    ++        if (protoGetSwitches != null && !protoGetSwitches.isEmpty()) {
    ++            if (Context.DEBUG) {
    ++                protoInvalidations += protoGetSwitches.size();
    ++            }
    ++            SwitchPoint.invalidateAll(protoGetSwitches.values().toArray(new SwitchPoint[protoGetSwitches.values().size()]));
    ++            protoGetSwitches.clear();
    +         }
    +     }
    + 
    +@@ -279,7 +360,33 @@
    +      * @return New {@link PropertyMap} with {@link Property} added.
    +      */
    +     PropertyMap addPropertyBind(final AccessorProperty property, final Object bindTo) {
    +-        return addProperty(new AccessorProperty(property, bindTo));
    ++        // No need to store bound property in the history as bound properties can't be reused.
    ++        return addPropertyNoHistory(new AccessorProperty(property, bindTo));
    ++    }
    ++
    ++    /**
    ++     * Add a property to the map without adding it to the history. This should be used for properties that
    ++     * can't be shared such as bound properties, or properties that are expected to be added only once.
    ++     *
    ++     * @param property {@link Property} being added.
    ++     * @return New {@link PropertyMap} with {@link Property} added.
    ++     */
    ++    public PropertyMap addPropertyNoHistory(final Property property) {
    ++        if (listeners != null) {
    ++            listeners.propertyAdded(property);
    ++        }
    ++        final PropertyHashMap newProperties = properties.immutableAdd(property);
    ++        final PropertyMap newMap = new PropertyMap(this, newProperties);
    ++
    ++        if(!property.isSpill()) {
    ++            newMap.fieldCount = Math.max(newMap.fieldCount, property.getSlot() + 1);
    ++        }
    ++        if (isValidArrayIndex(getArrayIndex(property.getKey()))) {
    ++            newMap.setContainsArrayKeys();
    ++        }
    ++
    ++        newMap.spillLength += property.getSpillCount();
    ++        return newMap;
    +     }
    + 
    +     /**
    +@@ -290,6 +397,9 @@
    +      * @return New {@link PropertyMap} with {@link Property} added.
    +      */
    +     public PropertyMap addProperty(final Property property) {
    ++        if (listeners != null) {
    ++            listeners.propertyAdded(property);
    ++        }
    +         PropertyMap newMap = checkHistory(property);
    + 
    +         if (newMap == null) {
    +@@ -318,6 +428,9 @@
    +      * @return New {@link PropertyMap} with {@link Property} removed or {@code null} if not found.
    +      */
    +     public PropertyMap deleteProperty(final Property property) {
    ++        if (listeners != null) {
    ++            listeners.propertyDeleted(property);
    ++        }
    +         PropertyMap newMap = checkHistory(property);
    +         final String key = property.getKey();
    + 
    +@@ -339,6 +452,9 @@
    +      * @return New {@link PropertyMap} with {@link Property} replaced.
    +      */
    +     PropertyMap replaceProperty(final Property oldProperty, final Property newProperty) {
    ++        if (listeners != null) {
    ++            listeners.propertyModified(oldProperty, newProperty);
    ++        }
    +         // Add replaces existing property.
    +         final PropertyHashMap newProperties = properties.immutableAdd(newProperty);
    +         final PropertyMap newMap = new PropertyMap(this, newProperties);
    +@@ -363,7 +479,7 @@
    +                 (oldProperty instanceof AccessorProperty &&
    +                 newProperty instanceof UserAccessorProperty) : "arbitrary replaceProperty attempted";
    + 
    +-        newMap.flags = getClonedFlags();
    ++        newMap.flags = flags;
    + 
    +         /*
    +          * spillLength remains same in case (1) and (2) because of slot reuse. Only for case (3), we need
    +@@ -491,28 +607,6 @@
    +     }
    + 
    +     /**
    +-     * Make this property map 'shared' one. Shared property map instances are
    +-     * process wide singleton objects. A shaped map should never be added as a listener
    +-     * to a proto object. Nor it should have history or proto history. A shared map
    +-     * is just a template that is meant to be duplicated before use. All nasgen initialized
    +-     * property maps are shared.
    +-     *
    +-     * @return this map after making it as shared
    +-     */
    +-    public PropertyMap setIsShared() {
    +-        assert !isListenerAdded() : "making PropertyMap shared after listener added";
    +-        assert protoHistory == null : "making PropertyMap shared after associating a proto with it";
    +-        if (Context.DEBUG) {
    +-            sharedCount++;
    +-        }
    +-
    +-        flags |= IS_SHARED;
    +-        // clear any history on this PropertyMap, won't be used.
    +-        history = null;
    +-        return this;
    +-    }
    +-
    +-    /**
    +      * Check for any configurable properties.
    +      *
    +      * @return {@code true} if any configurable.
    +@@ -551,14 +645,14 @@
    +     /**
    +      * Check prototype history for an existing property map with specified prototype.
    +      *
    +-     * @param newProto New prototype object.
    ++     * @param parentMap New prototype object.
    +      *
    +      * @return Existing {@link PropertyMap} or {@code null} if not found.
    +      */
    +-    private PropertyMap checkProtoHistory(final ScriptObject newProto) {
    ++    private PropertyMap checkProtoHistory(final PropertyMap parentMap) {
    +         final PropertyMap cachedMap;
    +         if (protoHistory != null) {
    +-            final WeakReference weakMap = protoHistory.get(newProto);
    ++            final SoftReference weakMap = protoHistory.get(parentMap);
    +             cachedMap = (weakMap != null ? weakMap.get() : null);
    +         } else {
    +             cachedMap = null;
    +@@ -574,17 +668,15 @@
    +     /**
    +      * Add a map to the prototype history.
    +      *
    +-     * @param newProto Prototype to add (key.)
    ++     * @param parentMap Prototype to add (key.)
    +      * @param newMap   {@link PropertyMap} associated with prototype.
    +      */
    +-    private void addToProtoHistory(final ScriptObject newProto, final PropertyMap newMap) {
    +-        assert !isShared() : "proto history modified on a shared PropertyMap";
    +-
    ++    private void addToProtoHistory(final PropertyMap parentMap, final PropertyMap newMap) {
    +         if (protoHistory == null) {
    +             protoHistory = new WeakHashMap<>();
    +         }
    + 
    +-        protoHistory.put(newProto, new WeakReference<>(newMap));
    ++        protoHistory.put(parentMap, new SoftReference<>(newMap));
    +     }
    + 
    +     /**
    +@@ -594,14 +686,12 @@
    +      * @param newMap   Modified {@link PropertyMap}.
    +      */
    +     private void addToHistory(final Property property, final PropertyMap newMap) {
    +-        assert !isShared() : "history modified on a shared PropertyMap";
    +-
    +         if (!properties.isEmpty()) {
    +             if (history == null) {
    +-                history = new LinkedHashMap<>();
    ++                history = new WeakHashMap<>();
    +             }
    + 
    +-            history.put(property, newMap);
    ++            history.put(property, new SoftReference<>(newMap));
    +         }
    +     }
    + 
    +@@ -613,8 +703,10 @@
    +      * @return Existing map or {@code null} if not found.
    +      */
    +     private PropertyMap checkHistory(final Property property) {
    ++
    +         if (history != null) {
    +-            PropertyMap historicMap = history.get(property);
    ++            SoftReference ref = history.get(property);
    ++            final PropertyMap historicMap = ref == null ? null : ref.get();
    + 
    +             if (historicMap != null) {
    +                 if (Context.DEBUG) {
    +@@ -628,54 +720,6 @@
    +         return null;
    +     }
    + 
    +-    /**
    +-     * Calculate the hash code for the map.
    +-     *
    +-     * @return Computed hash code.
    +-     */
    +-    private int computeHashCode() {
    +-        int hash = 0;
    +-
    +-        for (final Property property : getProperties()) {
    +-            hash = hash << 7 ^ hash >> 7;
    +-            hash ^= property.hashCode();
    +-        }
    +-
    +-        return hash;
    +-    }
    +-
    +-    @Override
    +-    public int hashCode() {
    +-        if (hashCode == 0 && !properties.isEmpty()) {
    +-            hashCode = computeHashCode();
    +-        }
    +-        return hashCode;
    +-    }
    +-
    +-    @Override
    +-    public boolean equals(final Object other) {
    +-        if (!(other instanceof PropertyMap)) {
    +-            return false;
    +-        }
    +-
    +-        final PropertyMap otherMap = (PropertyMap)other;
    +-
    +-        if (properties.size() != otherMap.properties.size()) {
    +-            return false;
    +-        }
    +-
    +-        final Iterator iter      = properties.values().iterator();
    +-        final Iterator otherIter = otherMap.properties.values().iterator();
    +-
    +-        while (iter.hasNext() && otherIter.hasNext()) {
    +-            if (!iter.next().equals(otherIter.next())) {
    +-                return false;
    +-            }
    +-        }
    +-
    +-        return true;
    +-    }
    +-
    +     @Override
    +     public String toString() {
    +         final StringBuilder sb = new StringBuilder();
    +@@ -728,24 +772,6 @@
    +     }
    + 
    +     /**
    +-     * Check whether a {@link PropertyListener} has been added to this map.
    +-     *
    +-     * @return {@code true} if {@link PropertyListener} exists
    +-     */
    +-    public boolean isListenerAdded() {
    +-        return (flags & IS_LISTENER_ADDED) != 0;
    +-    }
    +-
    +-    /**
    +-     * Check if this map shared or not.
    +-     *
    +-     * @return true if this map is shared.
    +-     */
    +-    public boolean isShared() {
    +-        return (flags & IS_SHARED) != 0;
    +-    }
    +-
    +-    /**
    +      * Test to see if {@link PropertyMap} is extensible.
    +      *
    +      * @return {@code true} if {@link PropertyMap} can be added to.
    +@@ -800,50 +826,29 @@
    +     }
    + 
    +     /**
    +-     * Change the prototype of objects associated with this {@link PropertyMap}.
    ++     * Return a property map with the same layout that is associated with the new prototype object.
    +      *
    +-     * @param oldProto Current prototype object.
    +      * @param newProto New prototype object to replace oldProto.
    +-     *
    +      * @return New {@link PropertyMap} with prototype changed.
    +      */
    +-    PropertyMap changeProto(final ScriptObject oldProto, final ScriptObject newProto) {
    +-        assert !isShared() : "proto associated with a shared PropertyMap";
    ++    public PropertyMap changeProto(final ScriptObject newProto) {
    + 
    +-        if (oldProto == newProto) {
    +-            return this;
    +-        }
    +-
    +-        final PropertyMap nextMap = checkProtoHistory(newProto);
    ++        final PropertyMap parentMap = newProto == null ? null : newProto.getMap();
    ++        final PropertyMap nextMap = checkProtoHistory(parentMap);
    +         if (nextMap != null) {
    +             return nextMap;
    +         }
    + 
    +         if (Context.DEBUG) {
    +-            incrementSetProtoNewMapCount();
    ++            setProtoNewMapCount++;
    +         }
    + 
    +         final PropertyMap newMap = new PropertyMap(this);
    +-        addToProtoHistory(newProto, newMap);
    ++        addToProtoHistory(parentMap, newMap);
    + 
    +         return newMap;
    +     }
    + 
    +-    /**
    +-     * Indicate that the map has listeners.
    +-     */
    +-    private void setIsListenerAdded() {
    +-        flags |= IS_LISTENER_ADDED;
    +-    }
    +-
    +-    /**
    +-     * Return only the flags that should be copied during cloning.
    +-     *
    +-     * @return Subset of flags that should be copied.
    +-     */
    +-    private int getClonedFlags() {
    +-        return flags & CLONEABLE_FLAGS_MASK;
    +-    }
    + 
    +     /**
    +      * {@link PropertyMap} iterator.
    +@@ -900,41 +905,12 @@
    +     }
    + 
    +     /*
    +-     * PropertyListener implementation.
    +-     */
    +-
    +-    @Override
    +-    public void propertyAdded(final ScriptObject object, final Property prop) {
    +-        invalidateProtoGetSwitchPoint(prop);
    +-    }
    +-
    +-    @Override
    +-    public void propertyDeleted(final ScriptObject object, final Property prop) {
    +-        invalidateProtoGetSwitchPoint(prop);
    +-    }
    +-
    +-    @Override
    +-    public void propertyModified(final ScriptObject object, final Property oldProp, final Property newProp) {
    +-        invalidateProtoGetSwitchPoint(oldProp);
    +-    }
    +-
    +-    @Override
    +-    public void protoChanged(final ScriptObject object, final ScriptObject oldProto, final ScriptObject newProto) {
    +-        // We may walk and invalidate SwitchPoints for properties inherited
    +-        // from 'object' or it's old proto chain. But, it may not be worth it.
    +-        // For example, a new proto may have a user defined getter/setter for
    +-        // a data property down the chain. So, invalidating all is better.
    +-        invalidateAllProtoGetSwitchPoints();
    +-    }
    +-
    +-    /*
    +      * Debugging and statistics.
    +      */
    + 
    +     // counters updated only in debug mode
    +     private static int count;
    +     private static int clonedCount;
    +-    private static int sharedCount;
    +     private static int duplicatedCount;
    +     private static int historyHit;
    +     private static int protoInvalidations;
    +@@ -956,13 +932,6 @@
    +     }
    + 
    +     /**
    +-     * @return The number of maps that are shared.
    +-     */
    +-    public static int getSharedCount() {
    +-        return sharedCount;
    +-    }
    +-
    +-    /**
    +      * @return The number of maps that are duplicated.
    +      */
    +     public static int getDuplicatedCount() {
    +@@ -997,10 +966,4 @@
    +         return setProtoNewMapCount;
    +     }
    + 
    +-    /**
    +-     * Increment the prototype set count.
    +-     */
    +-    private static void incrementSetProtoNewMapCount() {
    +-        setProtoNewMapCount++;
    +-    }
    + }
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/RecompilableScriptFunctionData.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -27,14 +27,15 @@
    + 
    + import static jdk.nashorn.internal.lookup.Lookup.MH;
    + 
    ++import java.io.Serializable;
    + import java.lang.invoke.MethodHandle;
    + import java.lang.invoke.MethodHandles;
    + import java.lang.invoke.MethodType;
    + import java.util.ArrayList;
    + import java.util.Arrays;
    + import java.util.LinkedList;
    ++import java.util.Map;
    + import jdk.internal.dynalink.support.NameCodec;
    +-
    + import jdk.nashorn.internal.codegen.Compiler;
    + import jdk.nashorn.internal.codegen.CompilerConstants;
    + import jdk.nashorn.internal.codegen.FunctionSignature;
    +@@ -43,6 +44,7 @@
    + import jdk.nashorn.internal.ir.FunctionNode.CompilationState;
    + import jdk.nashorn.internal.parser.Token;
    + import jdk.nashorn.internal.parser.TokenType;
    ++import jdk.nashorn.internal.scripts.JS;
    + 
    + /**
    +  * This is a subclass that represents a script function that may be regenerated,
    +@@ -50,13 +52,19 @@
    +  * The common denominator is that it can get new invokers during its lifespan,
    +  * unlike {@code FinalScriptFunctionData}
    +  */
    +-public final class RecompilableScriptFunctionData extends ScriptFunctionData {
    ++public final class RecompilableScriptFunctionData extends ScriptFunctionData implements Serializable {
    + 
    +     /** FunctionNode with the code for this ScriptFunction */
    +-    private FunctionNode functionNode;
    ++    private transient FunctionNode functionNode;
    + 
    +     /** Source from which FunctionNode was parsed. */
    +-    private final Source source;
    ++    private transient Source source;
    ++
    ++    /** The line number where this function begins. */
    ++    private final int lineNumber;
    ++
    ++    /** Allows us to retrieve the method handle for this function once the code is compiled */
    ++    private MethodLocator methodLocator;
    + 
    +     /** Token of this function within the source. */
    +     private final long token;
    +@@ -65,13 +73,13 @@
    +     private final PropertyMap allocatorMap;
    + 
    +     /** Code installer used for all further recompilation/specialization of this ScriptFunction */
    +-    private CodeInstaller installer;
    ++    private transient CodeInstaller installer;
    + 
    +     /** Name of class where allocator function resides */
    +     private final String allocatorClassName;
    + 
    +     /** lazily generated allocator */
    +-    private MethodHandle allocator;
    ++    private transient MethodHandle allocator;
    + 
    +     private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
    + 
    +@@ -79,7 +87,7 @@
    +      * Used for specialization based on runtime arguments. Whenever we specialize on
    +      * callsite parameter types at runtime, we need to use a parameter type guard to
    +      * ensure that the specialized version of the script function continues to be
    +-     * applicable for a particular callsite *
    ++     * applicable for a particular callsite.
    +      */
    +     private static final MethodHandle PARAM_TYPE_GUARD = findOwnMH("paramTypeGuard", boolean.class, Type[].class,  Object[].class);
    + 
    +@@ -88,10 +96,12 @@
    +      * (or java.lang.Number instance) to specialize the parameter to an integer, if the
    +      * parameter in question can be represented as one. The double typically only exists
    +      * because the compiler doesn't know any better than "a number type" and conservatively
    +-     * picks doubles when it can't prove that an integer addition wouldn't overflow
    ++     * picks doubles when it can't prove that an integer addition wouldn't overflow.
    +      */
    +     private static final MethodHandle ENSURE_INT = findOwnMH("ensureInt", int.class, Object.class);
    + 
    ++    private static final long serialVersionUID = 4914839316174633726L;
    ++
    +     /**
    +      * Constructor - public as scripts use it
    +      *
    +@@ -103,16 +113,17 @@
    +     public RecompilableScriptFunctionData(final FunctionNode functionNode, final CodeInstaller installer, final String allocatorClassName, final PropertyMap allocatorMap) {
    +         super(functionName(functionNode),
    +               functionNode.getParameters().size(),
    +-              functionNode.isStrict(),
    +-              false,
    +-              true);
    +-
    ++              getFlags(functionNode));
    +         this.functionNode       = functionNode;
    +         this.source             = functionNode.getSource();
    ++        this.lineNumber         = functionNode.getLineNumber();
    +         this.token              = tokenFor(functionNode);
    +         this.installer          = installer;
    +         this.allocatorClassName = allocatorClassName;
    +         this.allocatorMap       = allocatorMap;
    ++        if (!functionNode.isLazy()) {
    ++            methodLocator = new MethodLocator(functionNode);
    ++        }
    +     }
    + 
    +     @Override
    +@@ -124,15 +135,19 @@
    +         return "function " + (name == null ? "" : name) + "() { [native code] }";
    +     }
    + 
    ++    public void setCodeAndSource(final Map> code, final Source source) {
    ++        this.source = source;
    ++        if (methodLocator != null) {
    ++            methodLocator.setClass(code.get(methodLocator.getClassName()));
    ++        }
    ++    }
    ++
    +     @Override
    +     public String toString() {
    +         final StringBuilder sb = new StringBuilder();
    + 
    +         if (source != null) {
    +-            sb.append(source.getName())
    +-                .append(':')
    +-                .append(functionNode.getLineNumber())
    +-                .append(' ');
    ++            sb.append(source.getName()).append(':').append(lineNumber).append(' ');
    +         }
    + 
    +         return sb.toString() + super.toString();
    +@@ -159,11 +174,25 @@
    +         return Token.toDesc(TokenType.FUNCTION, position, length);
    +     }
    + 
    ++    private static int getFlags(final FunctionNode functionNode) {
    ++        int flags = IS_CONSTRUCTOR;
    ++        if (functionNode.isStrict()) {
    ++            flags |= IS_STRICT;
    ++        }
    ++        if (functionNode.needsCallee()) {
    ++            flags |= NEEDS_CALLEE;
    ++        }
    ++        if (functionNode.usesThis() || functionNode.hasEval()) {
    ++            flags |= USES_THIS;
    ++        }
    ++        return flags;
    ++    }
    ++
    +     @Override
    +-    ScriptObject allocate() {
    ++    ScriptObject allocate(final PropertyMap map) {
    +         try {
    +             ensureHasAllocator(); //if allocatorClass name is set to null (e.g. for bound functions) we don't even try
    +-            return allocator == null ? null : (ScriptObject)allocator.invokeExact(allocatorMap);
    ++            return allocator == null ? null : (ScriptObject)allocator.invokeExact(map);
    +         } catch (final RuntimeException | Error e) {
    +             throw e;
    +         } catch (final Throwable t) {
    +@@ -178,40 +207,52 @@
    +     }
    + 
    +     @Override
    ++    PropertyMap getAllocatorMap() {
    ++        return allocatorMap;
    ++    }
    ++
    ++
    ++    @Override
    ++    protected void ensureCompiled() {
    ++        if (functionNode != null && functionNode.isLazy()) {
    ++            Compiler.LOG.info("Trampoline hit: need to do lazy compilation of '", functionNode.getName(), "'");
    ++            final Compiler compiler = new Compiler(installer);
    ++            functionNode = compiler.compile(functionNode);
    ++            assert !functionNode.isLazy();
    ++            compiler.install(functionNode);
    ++            methodLocator = new MethodLocator(functionNode);
    ++            flags = getFlags(functionNode);
    ++        }
    ++
    ++        if (functionNode != null) {
    ++            methodLocator.setClass(functionNode.getCompileUnit().getCode());
    ++        }
    ++    }
    ++
    ++    @Override
    +     protected synchronized void ensureCodeGenerated() {
    +-         if (!code.isEmpty()) {
    +-             return; // nothing to do, we have code, at least some.
    +-         }
    ++        if (!code.isEmpty()) {
    ++            return; // nothing to do, we have code, at least some.
    ++        }
    + 
    +-         if (functionNode.isLazy()) {
    +-             Compiler.LOG.info("Trampoline hit: need to do lazy compilation of '", functionNode.getName(), "'");
    +-             final Compiler compiler = new Compiler(installer);
    +-             functionNode = compiler.compile(functionNode);
    +-             assert !functionNode.isLazy();
    +-             compiler.install(functionNode);
    ++        ensureCompiled();
    + 
    +-             /*
    +-              * We don't need to update any flags - varArgs and needsCallee are instrincic
    +-              * in the function world we need to get a destination node from the compile instead
    +-              * and replace it with our function node. TODO
    +-              */
    +-         }
    ++        /*
    ++         * We can't get to this program point unless we have bytecode, either from
    ++         * eager compilation or from running a lazy compile on the lines above
    ++         */
    + 
    +-         /*
    +-          * We can't get to this program point unless we have bytecode, either from
    +-          * eager compilation or from running a lazy compile on the lines above
    +-          */
    ++        assert functionNode == null || functionNode.hasState(CompilationState.EMITTED) :
    ++                    functionNode.getName() + " " + functionNode.getState() + " " + Debug.id(functionNode);
    + 
    +-         assert functionNode.hasState(CompilationState.EMITTED) : functionNode.getName() + " " + functionNode.getState() + " " + Debug.id(functionNode);
    ++        // code exists - look it up and add it into the automatically sorted invoker list
    ++        addCode(functionNode);
    + 
    +-         // code exists - look it up and add it into the automatically sorted invoker list
    +-         addCode(functionNode);
    +-
    +-         if (! functionNode.canSpecialize()) {
    +-             // allow GC to claim IR stuff that is not needed anymore
    +-             functionNode = null;
    +-             installer = null;
    +-         }
    ++        if (functionNode != null && !functionNode.canSpecialize()) {
    ++            // allow GC to claim IR stuff that is not needed anymore
    ++            functionNode = null;
    ++            installer = null;
    ++        }
    +     }
    + 
    +     private MethodHandle addCode(final FunctionNode fn) {
    +@@ -219,13 +260,9 @@
    +     }
    + 
    +     private MethodHandle addCode(final FunctionNode fn, final MethodType runtimeType, final MethodHandle guard, final MethodHandle fallback) {
    +-        final MethodType targetType = new FunctionSignature(fn).getMethodType();
    +-        MethodHandle target =
    +-            MH.findStatic(
    +-                    LOOKUP,
    +-                    fn.getCompileUnit().getCode(),
    +-                    fn.getName(),
    +-                    targetType);
    ++        assert methodLocator != null;
    ++        MethodHandle target = methodLocator.getMethodHandle();
    ++        final MethodType targetType = methodLocator.getMethodType();
    + 
    +         /*
    +          * For any integer argument. a double that is representable as an integer is OK.
    +@@ -405,7 +442,6 @@
    + 
    +         Compiler.LOG.info("Callsite specialized ", name, " runtimeType=", runtimeType, " parameters=", snapshot.getParameters(), " args=", Arrays.asList(args));
    + 
    +-        assert snapshot != null;
    +         assert snapshot != functionNode;
    + 
    +         final Compiler compiler = new Compiler(installer);
    +@@ -431,5 +467,45 @@
    +         return MH.findStatic(MethodHandles.lookup(), RecompilableScriptFunctionData.class, name, MH.type(rtype, types));
    +     }
    + 
    ++    /**
    ++     * Helper class that allows us to retrieve the method handle for this function once it has been generated.
    ++     */
    ++    private static class MethodLocator implements Serializable {
    ++        private transient Class clazz;
    ++        private final String className;
    ++        private final String methodName;
    ++        private final MethodType methodType;
    ++
    ++        private static final long serialVersionUID = -5420835725902966692L;
    ++
    ++        MethodLocator(final FunctionNode functionNode) {
    ++            this.className  = functionNode.getCompileUnit().getUnitClassName();
    ++            this.methodName = functionNode.getName();
    ++            this.methodType = new FunctionSignature(functionNode).getMethodType();
    ++
    ++            assert className != null;
    ++            assert methodName != null;
    ++        }
    ++
    ++        void setClass(final Class clazz) {
    ++            if (!JS.class.isAssignableFrom(clazz)) {
    ++                throw new IllegalArgumentException();
    ++            }
    ++            this.clazz = clazz;
    ++        }
    ++
    ++        String getClassName() {
    ++            return className;
    ++        }
    ++
    ++        MethodType getMethodType() {
    ++            return methodType;
    ++        }
    ++
    ++        MethodHandle getMethodHandle() {
    ++            return MH.findStatic(LOOKUP, clazz, methodName, methodType);
    ++        }
    ++    }
    ++
    + }
    + 
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/ScriptEnvironment.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ScriptEnvironment.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -62,6 +62,9 @@
    +     /** Only compile script, do not run it or generate other ScriptObjects */
    +     public final boolean _compile_only;
    + 
    ++    /** Accept "const" keyword and treat it as variable. Interim feature */
    ++    public final boolean _const_as_var;
    ++
    +     /** Accumulated callsite flags that will be used when bootstrapping script callsites */
    +     public final int     _callsite_flags;
    + 
    +@@ -134,6 +137,9 @@
    +     /** Only parse the source code, do not compile */
    +     public final boolean _parse_only;
    + 
    ++    /** Enable disk cache for compiled scripts */
    ++    public final boolean _persistent_cache;
    ++
    +     /** Print the AST before lowering */
    +     public final boolean _print_ast;
    + 
    +@@ -197,6 +203,7 @@
    + 
    +         _class_cache_size     = options.getInteger("class.cache.size");
    +         _compile_only         = options.getBoolean("compile.only");
    ++        _const_as_var         = options.getBoolean("const.as.var");
    +         _debug_lines          = options.getBoolean("debug.lines");
    +         _dest_dir             = options.getString("d");
    +         _dump_on_error        = options.getBoolean("doe");
    +@@ -218,6 +225,7 @@
    +         _no_syntax_extensions = options.getBoolean("no.syntax.extensions");
    +         _no_typed_arrays      = options.getBoolean("no.typed.arrays");
    +         _parse_only           = options.getBoolean("parse.only");
    ++        _persistent_cache     = options.getBoolean("persistent.code.cache");
    +         _print_ast            = options.getBoolean("print.ast");
    +         _print_lower_ast      = options.getBoolean("print.lower.ast");
    +         _print_code           = options.getBoolean("print.code");
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/ScriptFunction.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ScriptFunction.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -38,6 +38,7 @@
    + import jdk.internal.dynalink.linker.LinkRequest;
    + import jdk.nashorn.internal.codegen.CompilerConstants.Call;
    + import jdk.nashorn.internal.lookup.MethodHandleFactory;
    ++import jdk.nashorn.internal.objects.Global;
    + import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor;
    + import jdk.nashorn.internal.runtime.linker.NashornGuards;
    + 
    +@@ -66,6 +67,8 @@
    + 
    +     private static final MethodHandle WRAPFILTER = findOwnMH("wrapFilter", Object.class, Object.class);
    + 
    ++    private static final MethodHandle GLOBALFILTER = findOwnMH("globalFilter", Object.class, Object.class);
    ++
    +     /** method handle to scope getter for this ScriptFunction */
    +     public static final Call GET_SCOPE = virtualCallNoLookup(ScriptFunction.class, "getScope", ScriptObject.class);
    + 
    +@@ -80,6 +83,9 @@
    + 
    +     private final ScriptFunctionData data;
    + 
    ++    /** The property map used for newly allocated object when function is used as constructor. */
    ++    protected PropertyMap allocatorMap;
    ++
    +     /**
    +      * Constructor
    +      *
    +@@ -88,9 +94,7 @@
    +      * @param map           property map
    +      * @param scope         scope
    +      * @param specs         specialized version of this function - other method handles
    +-     * @param strict        is this a strict mode function?
    +-     * @param builtin       is this a built in function?
    +-     * @param isConstructor is this a constructor?
    ++     * @param flags         {@link ScriptFunctionData} flags
    +      */
    +     protected ScriptFunction(
    +             final String name,
    +@@ -98,11 +102,9 @@
    +             final PropertyMap map,
    +             final ScriptObject scope,
    +             final MethodHandle[] specs,
    +-            final boolean strict,
    +-            final boolean builtin,
    +-            final boolean isConstructor) {
    ++            final int flags) {
    + 
    +-        this(new FinalScriptFunctionData(name, methodHandle, specs, strict, builtin, isConstructor), map, scope);
    ++        this(new FinalScriptFunctionData(name, methodHandle, specs, flags), map, scope);
    +     }
    + 
    +     /**
    +@@ -125,6 +127,7 @@
    + 
    +         this.data  = data;
    +         this.scope = scope;
    ++        this.allocatorMap = data.getAllocatorMap();
    +     }
    + 
    +     @Override
    +@@ -229,16 +232,16 @@
    +         }
    +         assert !isBoundFunction(); // allocate never invoked on bound functions
    + 
    +-        final ScriptObject object = data.allocate();
    ++        final ScriptObject object = data.allocate(allocatorMap);
    + 
    +         if (object != null) {
    +             Object prototype = getPrototype();
    +             if (prototype instanceof ScriptObject) {
    +-                object.setProto((ScriptObject)prototype);
    ++                object.setInitialProto((ScriptObject)prototype);
    +             }
    + 
    +             if (object.getProto() == null) {
    +-                object.setProto(getObjectPrototype());
    ++                object.setInitialProto(getObjectPrototype());
    +             }
    +         }
    + 
    +@@ -473,7 +476,14 @@
    +         if (obj instanceof ScriptObject || !ScriptFunctionData.isPrimitiveThis(obj)) {
    +             return obj;
    +         }
    +-        return ((GlobalObject)Context.getGlobalTrusted()).wrapAsObject(obj);
    ++        return Context.getGlobal().wrapAsObject(obj);
    ++    }
    ++
    ++
    ++    @SuppressWarnings("unused")
    ++    private static Object globalFilter(final Object object) {
    ++        // replace whatever we get with the current global object
    ++        return Context.getGlobal();
    +     }
    + 
    +     /**
    +@@ -491,11 +501,11 @@
    +     @Override
    +     protected GuardedInvocation findCallMethod(final CallSiteDescriptor desc, final LinkRequest request) {
    +         final MethodType type = desc.getMethodType();
    ++        final boolean scopeCall = NashornCallSiteDescriptor.isScope(desc);
    + 
    +         if (request.isCallSiteUnstable()) {
    +-            // (this, callee, args...) => (this, callee, args[])
    +-            final MethodHandle collector = MH.asCollector(ScriptRuntime.APPLY.methodHandle(), Object[].class,
    +-                    type.parameterCount() - 2);
    ++            // (callee, this, args...) => (callee, this, args[])
    ++            final MethodHandle collector = MH.asCollector(ScriptRuntime.APPLY.methodHandle(), Object[].class, type.parameterCount() - 2);
    + 
    +             // If call site is statically typed to take a ScriptFunction, we don't need a guard, otherwise we need a
    +             // generic "is this a ScriptFunction?" guard.
    +@@ -506,17 +516,12 @@
    +         MethodHandle boundHandle;
    +         MethodHandle guard = null;
    + 
    +-        final boolean scopeCall = NashornCallSiteDescriptor.isScope(desc);
    +-
    +         if (data.needsCallee()) {
    +             final MethodHandle callHandle = getBestInvoker(type, request.getArguments());
    +-            if (scopeCall) {
    ++            if (scopeCall && needsWrappedThis()) {
    +                 // Make a handle that drops the passed "this" argument and substitutes either Global or Undefined
    +-                // (callee, this, args...) => (callee, args...)
    +-                boundHandle = MH.insertArguments(callHandle, 1, needsWrappedThis() ? Context.getGlobalTrusted() : ScriptRuntime.UNDEFINED);
    +-                // (callee, args...) => (callee, [this], args...)
    +-                boundHandle = MH.dropArguments(boundHandle, 1, Object.class);
    +-
    ++                // (callee, this, args...) => (callee, [this], args...)
    ++                boundHandle = MH.filterArguments(callHandle, 1, GLOBALFILTER);
    +             } else {
    +                 // It's already (callee, this, args...), just what we need
    +                 boundHandle = callHandle;
    +@@ -527,12 +532,12 @@
    +                 // NOTE: the only built-in named "extend" is NativeJava.extend. As a special-case we're binding the
    +                 // current lookup as its "this" so it can do security-sensitive creation of adapter classes.
    +                 boundHandle = MH.dropArguments(MH.bindTo(callHandle, desc.getLookup()), 0, Object.class, Object.class);
    +-            } else if (scopeCall) {
    ++            } else if (scopeCall && needsWrappedThis()) {
    +                 // Make a handle that drops the passed "this" argument and substitutes either Global or Undefined
    +-                // (this, args...) => (args...)
    +-                boundHandle = MH.bindTo(callHandle, needsWrappedThis() ? Context.getGlobalTrusted() : ScriptRuntime.UNDEFINED);
    +-                // (args...) => ([callee], [this], args...)
    +-                boundHandle = MH.dropArguments(boundHandle, 0, Object.class, Object.class);
    ++                // (this, args...) => ([this], args...)
    ++                boundHandle = MH.filterArguments(callHandle, 0, GLOBALFILTER);
    ++                // ([this], args...) => ([callee], [this], args...)
    ++                boundHandle = MH.dropArguments(boundHandle, 0, Object.class);
    +             } else {
    +                 // (this, args...) => ([callee], this, args...)
    +                 boundHandle = MH.dropArguments(callHandle, 0, Object.class);
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ScriptFunctionData.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -29,6 +29,7 @@
    + import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
    + import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
    + 
    ++import java.io.Serializable;
    + import java.lang.invoke.MethodHandle;
    + import java.lang.invoke.MethodHandles;
    + import java.lang.invoke.MethodType;
    +@@ -39,7 +40,7 @@
    +  * Instances of this class are created during codegen and stored in script classes'
    +  * constants array to reduce function instantiation overhead during runtime.
    +  */
    +-public abstract class ScriptFunctionData {
    ++public abstract class ScriptFunctionData implements Serializable {
    + 
    +     /** Name of the function or "" for anonynous functions */
    +     protected final String name;
    +@@ -47,33 +48,46 @@
    +     /** All versions of this function that have been generated to code */
    +     protected final CompiledFunctions code;
    + 
    ++    /** Function flags */
    ++    protected int flags;
    ++
    +     private int arity;
    + 
    +-    private final boolean isStrict;
    +-
    +-    private final boolean isBuiltin;
    +-
    +-    private final boolean isConstructor;
    +-
    +     private static final MethodHandle NEWFILTER     = findOwnMH("newFilter", Object.class, Object.class, Object.class);
    +     private static final MethodHandle BIND_VAR_ARGS = findOwnMH("bindVarArgs", Object[].class, Object[].class, Object[].class);
    + 
    ++    /** Is this a strict mode function? */
    ++    public static final int IS_STRICT      = 1 << 0;
    ++    /** Is this a built-in function? */
    ++    public static final int IS_BUILTIN     = 1 << 1;
    ++    /** Is this a constructor function? */
    ++    public static final int IS_CONSTRUCTOR = 1 << 2;
    ++    /** Does this function expect a callee argument? */
    ++    public static final int NEEDS_CALLEE   = 1 << 3;
    ++    /** Does this function make use of the this-object argument? */
    ++    public static final int USES_THIS      = 1 << 4;
    ++
    ++    /** Flag for strict or built-in functions */
    ++    public static final int IS_STRICT_OR_BUILTIN = IS_STRICT | IS_BUILTIN;
    ++    /** Flag for built-in constructors */
    ++    public static final int IS_BUILTIN_CONSTRUCTOR = IS_BUILTIN | IS_CONSTRUCTOR;
    ++    /** Flag for strict constructors */
    ++    public static final int IS_STRICT_CONSTRUCTOR = IS_STRICT | IS_CONSTRUCTOR;
    ++
    ++    private static final long serialVersionUID = 4252901245508769114L;
    ++
    +     /**
    +      * Constructor
    +      *
    +      * @param name          script function name
    +      * @param arity         arity
    +-     * @param isStrict      is the function strict
    +-     * @param isBuiltin     is the function built in
    +-     * @param isConstructor is the function a constructor
    ++     * @param flags         the function flags
    +      */
    +-    ScriptFunctionData(final String name, final int arity, final boolean isStrict, final boolean isBuiltin, final boolean isConstructor) {
    +-        this.name          = name;
    +-        this.arity         = arity;
    +-        this.code          = new CompiledFunctions();
    +-        this.isStrict      = isStrict;
    +-        this.isBuiltin     = isBuiltin;
    +-        this.isConstructor = isConstructor;
    ++    ScriptFunctionData(final String name, final int arity, final int flags) {
    ++        this.name  = name;
    ++        this.arity = arity;
    ++        this.code  = new CompiledFunctions();
    ++        this.flags = flags;
    +     }
    + 
    +     final int getArity() {
    +@@ -105,21 +119,21 @@
    +      * @return true if strict, false otherwise
    +      */
    +     public boolean isStrict() {
    +-        return isStrict;
    ++        return (flags & IS_STRICT) != 0;
    +     }
    + 
    +     boolean isBuiltin() {
    +-        return isBuiltin;
    ++        return (flags & IS_BUILTIN) != 0;
    +     }
    + 
    +     boolean isConstructor() {
    +-        return isConstructor;
    ++        return (flags & IS_CONSTRUCTOR) != 0;
    +     }
    + 
    +     boolean needsCallee() {
    +-        // we don't know if we need a callee or not unless we are generated
    +-        ensureCodeGenerated();
    +-        return code.needsCallee();
    ++        // we don't know if we need a callee or not unless code has been compiled
    ++        ensureCompiled();
    ++        return (flags & NEEDS_CALLEE) != 0;
    +     }
    + 
    +     /**
    +@@ -128,7 +142,7 @@
    +      * @return true if this argument must be an object
    +      */
    +     boolean needsWrappedThis() {
    +-        return !isStrict && !isBuiltin;
    ++        return (flags & USES_THIS) != 0 && (flags & IS_STRICT_OR_BUILTIN) == 0;
    +     }
    + 
    +     String toSource() {
    +@@ -202,6 +216,15 @@
    +     }
    + 
    +     /**
    ++     * If we can have lazy code generation, this is a hook to ensure that the code has been compiled.
    ++     * This does not guarantee the code been installed in this {@code ScriptFunctionData} instance;
    ++     * use {@link #ensureCodeGenerated()} to install the actual method handles.
    ++     */
    ++    protected void ensureCompiled() {
    ++        //empty
    ++    }
    ++
    ++    /**
    +      * Return a generic Object/Object invoker for this method. It will ensure code
    +      * is generated, get the most generic of all versions of this function and adapt it
    +      * to Objects.
    +@@ -229,9 +252,20 @@
    + 
    +     /**
    +      * Allocates an object using this function's allocator.
    ++     *
    ++     * @param map the property map for the allocated object.
    +      * @return the object allocated using this function's allocator, or null if the function doesn't have an allocator.
    +      */
    +-    ScriptObject allocate() {
    ++    ScriptObject allocate(final PropertyMap map) {
    ++        return null;
    ++    }
    ++
    ++    /**
    ++     * Get the property map to use for objects allocated by this function.
    ++     *
    ++     * @return the property map for allocated objects.
    ++     */
    ++    PropertyMap getAllocatorMap() {
    +         return null;
    +     }
    + 
    +@@ -248,6 +282,8 @@
    + 
    +         final Object[] allArgs = args == null ? ScriptRuntime.EMPTY_ARRAY : args;
    +         final int length = args == null ? 0 : args.length;
    ++        // Clear the callee and this flags
    ++        final int boundFlags = flags & ~NEEDS_CALLEE & ~USES_THIS;
    + 
    +         CompiledFunctions boundList = new CompiledFunctions();
    +         if (code.size() == 1) {
    +@@ -262,8 +298,7 @@
    +             boundList.add(bind(inv, fn, self, allArgs));
    +         }
    + 
    +-        ScriptFunctionData boundData = new FinalScriptFunctionData(name, arity == -1 ? -1 : Math.max(0, arity - length), boundList, isStrict(), isBuiltin(), isConstructor());
    +-        return boundData;
    ++        return new FinalScriptFunctionData(name, arity == -1 ? -1 : Math.max(0, arity - length), boundList, boundFlags);
    +     }
    + 
    +     /**
    +@@ -340,11 +375,11 @@
    +     private Object convertThisObject(final Object thiz) {
    +         if (!(thiz instanceof ScriptObject) && needsWrappedThis()) {
    +             if (JSType.nullOrUndefined(thiz)) {
    +-                return Context.getGlobalTrusted();
    ++                return Context.getGlobal();
    +             }
    + 
    +             if (isPrimitiveThis(thiz)) {
    +-                return ((GlobalObject)Context.getGlobalTrusted()).wrapAsObject(thiz);
    ++                return Context.getGlobal().wrapAsObject(thiz);
    +             }
    +         }
    + 
    +@@ -484,6 +519,8 @@
    +         final Object   selfObj = convertThisObject(self);
    +         final Object[] args    = arguments == null ? ScriptRuntime.EMPTY_ARRAY : arguments;
    + 
    ++        DebuggerSupport.notifyInvoke(mh);
    ++
    +         if (isVarArg(mh)) {
    +             if (needsCallee(mh)) {
    +                 return mh.invokeExact(fn, selfObj, args);
    +@@ -537,6 +574,8 @@
    +         final MethodHandle mh   = getGenericConstructor();
    +         final Object[]     args = arguments == null ? ScriptRuntime.EMPTY_ARRAY : arguments;
    + 
    ++        DebuggerSupport.notifyInvoke(mh);
    ++
    +         if (isVarArg(mh)) {
    +             if (needsCallee(mh)) {
    +                 return mh.invokeExact(fn, args);
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/ScriptLoader.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ScriptLoader.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -70,9 +70,8 @@
    +      * @return Installed class.
    +      */
    +     synchronized Class installClass(final String name, final byte[] data, final CodeSource cs) {
    +-        if (cs == null) {
    +-            return defineClass(name, data, 0, data.length, new ProtectionDomain(null, getPermissions(null)));
    +-        }
    ++        // null check
    ++        cs.getClass();
    +         return defineClass(name, data, 0, data.length, cs);
    +     }
    + }
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ScriptObject.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -43,6 +43,7 @@
    + import java.lang.invoke.MethodHandle;
    + import java.lang.invoke.MethodHandles;
    + import java.lang.invoke.MethodType;
    ++import java.lang.invoke.SwitchPoint;
    + import java.util.AbstractMap;
    + import java.util.ArrayList;
    + import java.util.Arrays;
    +@@ -65,6 +66,7 @@
    + import jdk.nashorn.internal.lookup.MethodHandleFactory;
    + import jdk.nashorn.internal.objects.AccessorPropertyDescriptor;
    + import jdk.nashorn.internal.objects.DataPropertyDescriptor;
    ++import jdk.nashorn.internal.objects.Global;
    + import jdk.nashorn.internal.runtime.arrays.ArrayData;
    + import jdk.nashorn.internal.runtime.arrays.ArrayIndex;
    + import jdk.nashorn.internal.runtime.linker.Bootstrap;
    +@@ -88,8 +90,8 @@
    +  * 
    +  */
    + 
    +-public abstract class ScriptObject extends PropertyListenerManager implements PropertyAccess {
    +-    /** __proto__ special property name */
    ++public abstract class ScriptObject implements PropertyAccess {
    ++    /** __proto__ special property name inside object literals. ES6 draft. */
    +     public static final String PROTO_PROPERTY_NAME   = "__proto__";
    + 
    +     /** Search fall back routine name for "no such method" */
    +@@ -107,9 +109,6 @@
    +     /** Per ScriptObject flag - is this an arguments object? */
    +     public static final int IS_ARGUMENTS   = 0b0000_0100;
    + 
    +-    /** Is this a prototype PropertyMap? */
    +-    public static final int IS_PROTOTYPE   = 0b0000_1000;
    +-
    +     /** Is length property not-writable? */
    +     public static final int IS_LENGTH_NOT_WRITABLE = 0b0001_0000;
    + 
    +@@ -131,9 +130,10 @@
    +     /** Indexed array data. */
    +     private ArrayData arrayData;
    + 
    +-    static final MethodHandle GETPROTO           = findOwnMH("getProto", ScriptObject.class);
    +-    static final MethodHandle SETPROTOCHECK      = findOwnMH("setProtoCheck", void.class, Object.class);
    ++    /** Method handle to retrive prototype of this object */
    ++    public static final MethodHandle GETPROTO           = findOwnMH("getProto", ScriptObject.class);
    +     static final MethodHandle MEGAMORPHIC_GET    = findOwnMH("megamorphicGet", Object.class, String.class, boolean.class);
    ++    static final MethodHandle GLOBALFILTER       = findOwnMH("globalFilter", Object.class, Object.class);
    + 
    +     static final MethodHandle SETFIELD           = findOwnMH("setField",         void.class, CallSiteDescriptor.class, PropertyMap.class, PropertyMap.class, MethodHandle.class, Object.class, Object.class);
    +     static final MethodHandle SETSPILL           = findOwnMH("setSpill",         void.class, CallSiteDescriptor.class, PropertyMap.class, PropertyMap.class, int.class, Object.class, Object.class);
    +@@ -143,6 +143,8 @@
    +     private static final MethodHandle TRUNCATINGFILTER   = findOwnMH("truncatingFilter", Object[].class, int.class, Object[].class);
    +     private static final MethodHandle KNOWNFUNCPROPGUARD = findOwnMH("knownFunctionPropertyGuard", boolean.class, Object.class, PropertyMap.class, MethodHandle.class, Object.class, ScriptFunction.class);
    + 
    ++    private static final ArrayList protoFilters = new ArrayList<>();
    ++
    +     /** Method handle for getting a function argument at a given index. Used from MapCreator */
    +     public static final Call GET_ARGUMENT       = virtualCall(MethodHandles.lookup(), ScriptObject.class, "getArgument", Object.class, int.class);
    + 
    +@@ -153,10 +155,10 @@
    +     public static final Call GET_PROTO          = virtualCallNoLookup(ScriptObject.class, "getProto", ScriptObject.class);
    + 
    +     /** Method handle for setting the proto of a ScriptObject */
    +-    public static final Call SET_PROTO          = virtualCallNoLookup(ScriptObject.class, "setProto", void.class, ScriptObject.class);
    ++    public static final Call SET_PROTO          = virtualCallNoLookup(ScriptObject.class, "setInitialProto", void.class, ScriptObject.class);
    + 
    +     /** Method handle for setting the proto of a ScriptObject after checking argument */
    +-    public static final Call SET_PROTO_CHECK    = virtualCallNoLookup(ScriptObject.class, "setProtoCheck", void.class, Object.class);
    ++    public static final Call SET_PROTO_FROM_LITERAL    = virtualCallNoLookup(ScriptObject.class, "setProtoFromLiteral", void.class, Object.class);
    + 
    +     /** Method handle for setting the user accessors of a ScriptObject */
    +     public static final Call SET_USER_ACCESSORS = virtualCall(MethodHandles.lookup(), ScriptObject.class, "setUserAccessors", void.class, String.class, ScriptFunction.class, ScriptFunction.class);
    +@@ -199,10 +201,6 @@
    +         this.arrayData = ArrayData.EMPTY_ARRAY;
    +         this.setMap(map == null ? PropertyMap.newMap() : map);
    +         this.proto = proto;
    +-
    +-        if (proto != null) {
    +-            proto.setIsPrototype();
    +-        }
    +     }
    + 
    +     /**
    +@@ -229,8 +227,9 @@
    +             final Property oldProp = newMap.findProperty(key);
    +             if (oldProp == null) {
    +                 if (property instanceof UserAccessorProperty) {
    ++                    // Note: we copy accessor functions to this object which is semantically different from binding.
    +                     final UserAccessorProperty prop = this.newUserAccessors(key, property.getFlags(), property.getGetterFunction(source), property.getSetterFunction(source));
    +-                    newMap = newMap.addProperty(prop);
    ++                    newMap = newMap.addPropertyNoHistory(prop);
    +                 } else {
    +                     newMap = newMap.addPropertyBind((AccessorProperty)property, source);
    +                 }
    +@@ -326,18 +325,18 @@
    +       * @return property descriptor
    +       */
    +     public final PropertyDescriptor toPropertyDescriptor() {
    +-        final GlobalObject global = (GlobalObject) Context.getGlobalTrusted();
    ++        final Global global = Context.getGlobal();
    + 
    +         final PropertyDescriptor desc;
    +         if (isDataDescriptor()) {
    +             if (has(SET) || has(GET)) {
    +-                throw typeError((ScriptObject)global, "inconsistent.property.descriptor");
    ++                throw typeError(global, "inconsistent.property.descriptor");
    +             }
    + 
    +             desc = global.newDataDescriptor(UNDEFINED, false, false, false);
    +         } else if (isAccessorDescriptor()) {
    +             if (has(VALUE) || has(WRITABLE)) {
    +-                throw typeError((ScriptObject)global, "inconsistent.property.descriptor");
    ++                throw typeError(global, "inconsistent.property.descriptor");
    +             }
    + 
    +             desc = global.newAccessorDescriptor(UNDEFINED, UNDEFINED, false, false);
    +@@ -356,7 +355,7 @@
    +      *
    +      * @return property descriptor
    +      */
    +-    public static PropertyDescriptor toPropertyDescriptor(final ScriptObject global, final Object obj) {
    ++    public static PropertyDescriptor toPropertyDescriptor(final Global global, final Object obj) {
    +         if (obj instanceof ScriptObject) {
    +             return ((ScriptObject)obj).toPropertyDescriptor();
    +         }
    +@@ -375,7 +374,7 @@
    +     public Object getOwnPropertyDescriptor(final String key) {
    +         final Property property = getMap().findProperty(key);
    + 
    +-        final GlobalObject global = (GlobalObject)Context.getGlobalTrusted();
    ++        final Global global = Context.getGlobal();
    + 
    +         if (property != null) {
    +             final ScriptFunction get   = property.getGetterFunction(this);
    +@@ -440,7 +439,7 @@
    +      * @return true if property was successfully defined
    +      */
    +     public boolean defineOwnProperty(final String key, final Object propertyDesc, final boolean reject) {
    +-        final ScriptObject       global  = Context.getGlobalTrusted();
    ++        final Global             global  = Context.getGlobal();
    +         final PropertyDescriptor desc    = toPropertyDescriptor(global, propertyDesc);
    +         final Object             current = getOwnPropertyDescriptor(key);
    +         final String             name    = JSType.toString(key);
    +@@ -467,7 +466,7 @@
    +             return true;
    +         }
    + 
    +-        if (currentDesc.equals(newDesc)) {
    ++        if (newDesc.hasAndEquals(currentDesc)) {
    +             // every descriptor field of the new is same as the current
    +             return true;
    +         }
    +@@ -594,23 +593,16 @@
    +     }
    + 
    +     /**
    +-     * Spec. mentions use of [[DefineOwnProperty]] for indexed properties in
    +-     * certain places (eg. Array.prototype.map, filter). We can not use ScriptObject.set
    +-     * method in such cases. This is because set method uses inherited setters (if any)
    +-     * from any object in proto chain such as Array.prototype, Object.prototype.
    +-     * This method directly sets a particular element value in the current object.
    ++     * Almost like defineOwnProperty(int,Object) for arrays this one does
    ++     * not add 'gap' elements (like the array one does).
    +      *
    +      * @param index key for property
    +      * @param value value to define
    +      */
    +-    public final void defineOwnProperty(final int index, final Object value) {
    ++    public void defineOwnProperty(final int index, final Object value) {
    +         assert isValidArrayIndex(index) : "invalid array index";
    +         final long longIndex = ArrayIndex.toLongIndex(index);
    +-        if (longIndex >= getArray().length()) {
    +-            // make array big enough to hold..
    +-            setArray(getArray().ensure(longIndex));
    +-        }
    +-        setArray(getArray().set(index, value, false));
    ++        setValueAtArrayIndex(longIndex, index, value, false);
    +     }
    + 
    +     private void checkIntegerKey(final String key) {
    +@@ -638,7 +630,7 @@
    +         final int propFlags = Property.toFlags(pdesc);
    + 
    +         if (pdesc.type() == PropertyDescriptor.GENERIC) {
    +-            final GlobalObject global = (GlobalObject) Context.getGlobalTrusted();
    ++            final Global global = Context.getGlobal();
    +             final PropertyDescriptor dDesc = global.newDataDescriptor(UNDEFINED, false, false, false);
    + 
    +             dDesc.fillFrom((ScriptObject)pdesc);
    +@@ -873,8 +865,6 @@
    +             newProperty = newUserAccessors(oldProperty.getKey(), propertyFlags, getter, setter);
    +         }
    + 
    +-        notifyPropertyModified(this, oldProperty, newProperty);
    +-
    +         return modifyOwnProperty(oldProperty, newProperty);
    +     }
    + 
    +@@ -981,17 +971,6 @@
    +     }
    + 
    +     /**
    +-      * Get the object value of a property
    +-      *
    +-      * @param find {@link FindProperty} lookup result
    +-      *
    +-      * @return the value of the property
    +-      */
    +-    protected static Object getObjectValue(final FindProperty find) {
    +-        return find.getObjectValue();
    +-    }
    +-
    +-    /**
    +      * Return methodHandle of value function for call.
    +      *
    +      * @param find      data from find property.
    +@@ -1001,7 +980,7 @@
    +      * @return value of property as a MethodHandle or null.
    +      */
    +     protected MethodHandle getCallMethodHandle(final FindProperty find, final MethodType type, final String bindName) {
    +-        return getCallMethodHandle(getObjectValue(find), type, bindName);
    ++        return getCallMethodHandle(find.getObjectValue(), type, bindName);
    +     }
    + 
    +     /**
    +@@ -1025,7 +1004,7 @@
    +      * @return Value of property.
    +      */
    +     public final Object getWithProperty(final Property property) {
    +-        return getObjectValue(new FindProperty(this, this, property));
    ++        return new FindProperty(this, this, property).getObjectValue();
    +     }
    + 
    +     /**
    +@@ -1118,38 +1097,49 @@
    +      */
    +     public synchronized final void setProto(final ScriptObject newProto) {
    +         final ScriptObject oldProto = proto;
    +-        map = map.changeProto(oldProto, newProto);
    +-
    +-        if (newProto != null) {
    +-            newProto.setIsPrototype();
    +-        }
    +-
    +-        proto = newProto;
    +-
    +-        if (isPrototype()) {
    +-            // tell listeners that my __proto__ has been changed
    +-            notifyProtoChanged(this, oldProto, newProto);
    +-
    +-            if (oldProto != null) {
    +-                oldProto.removePropertyListener(this);
    ++
    ++        if (oldProto != newProto) {
    ++            proto = newProto;
    ++
    ++            // Let current listeners know that the protototype has changed and set our map
    ++            final PropertyListeners listeners = getMap().getListeners();
    ++            if (listeners != null) {
    ++                listeners.protoChanged();
    +             }
    +-
    +-            if (newProto != null) {
    +-                newProto.addPropertyListener(this);
    +-            }
    ++            // Replace our current allocator map with one that is associated with the new prototype.
    ++            setMap(getMap().changeProto(newProto));
    +         }
    +     }
    + 
    +     /**
    ++     * Set the initial __proto__ of this object. This should be used instead of
    ++     * {@link #setProto} if it is known that the current property map will not be
    ++     * used on a new object with any other parent property map, so we can pass over
    ++     * property map invalidation/evolution.
    ++     *
    ++     * @param initialProto the initial __proto__ to set.
    ++     */
    ++    public void setInitialProto(final ScriptObject initialProto) {
    ++        this.proto = initialProto;
    ++    }
    ++
    ++    /**
    +      * Set the __proto__ of an object with checks.
    ++     * This is the built-in operation [[SetPrototypeOf]]
    ++     * See ES6 draft spec: 9.1.2 [[SetPrototypeOf]] (V)
    ++     *
    +      * @param newProto Prototype to set.
    +      */
    +-    public final void setProtoCheck(final Object newProto) {
    +-        if (!isExtensible()) {
    +-            throw typeError("__proto__.set.non.extensible", ScriptRuntime.safeToString(this));
    +-        }
    +-
    ++    public final void setPrototypeOf(final Object newProto) {
    +         if (newProto == null || newProto instanceof ScriptObject) {
    ++            if (!isExtensible()) {
    ++                // okay to set same proto again - even if non-extensible
    ++                if (newProto == getProto()) {
    ++                    return;
    ++                }
    ++                throw typeError("__proto__.set.non.extensible", ScriptRuntime.safeToString(this));
    ++            }
    ++
    +             // check for circularity
    +             ScriptObject p = (ScriptObject)newProto;
    +             while (p != null) {
    +@@ -1160,14 +1150,27 @@
    +             }
    +             setProto((ScriptObject)newProto);
    +         } else {
    +-            final ScriptObject global = Context.getGlobalTrusted();
    +-            final Object  newProtoObject = JSType.toScriptObject(global, newProto);
    +-
    +-            if (newProtoObject instanceof ScriptObject) {
    +-                setProto((ScriptObject)newProtoObject);
    +-            } else {
    +-                throw typeError(global, "cant.set.proto.to.non.object", ScriptRuntime.safeToString(this), ScriptRuntime.safeToString(newProto));
    +-            }
    ++            throw typeError("cant.set.proto.to.non.object", ScriptRuntime.safeToString(this), ScriptRuntime.safeToString(newProto));
    ++        }
    ++    }
    ++
    ++    /**
    ++     * Set the __proto__ of an object from an object literal.
    ++     * See ES6 draft spec: B.3.1 __proto__ Property Names in
    ++     * Object Initializers. Step 6 handling of "__proto__".
    ++     *
    ++     * @param newProto Prototype to set.
    ++     */
    ++    public final void setProtoFromLiteral(final Object newProto) {
    ++        if (newProto == null || newProto instanceof ScriptObject) {
    ++            setPrototypeOf(newProto);
    ++        } else {
    ++            // Some non-object, non-null. Then, we need to set
    ++            // Object.prototype as the new __proto__
    ++            //
    ++            // var obj = { __proto__ : 34 };
    ++            // print(obj.__proto__ === Object.prototype); // => true
    ++            setPrototypeOf(Global.objectPrototype());
    +         }
    +     }
    + 
    +@@ -1250,11 +1253,11 @@
    +      * @return the default value
    +      */
    +     public Object getDefaultValue(final Class typeHint) {
    +-        // We delegate to GlobalObject, as the implementation uses dynamic call sites to invoke object's "toString" and
    ++        // We delegate to Global, as the implementation uses dynamic call sites to invoke object's "toString" and
    +         // "valueOf" methods, and in order to avoid those call sites from becoming megamorphic when multiple contexts
    +         // are being executed in a long-running program, we move the code and their associated dynamic call sites
    +         // (Global.TO_STRING and Global.VALUE_OF) into per-context code.
    +-        return ((GlobalObject)Context.getGlobalTrusted()).getDefaultValue(this, typeHint);
    ++        return Context.getGlobal().getDefaultValue(this, typeHint);
    +     }
    + 
    +     /**
    +@@ -1330,25 +1333,6 @@
    +     }
    + 
    +     /**
    +-     * Check if this object is a prototype
    +-     *
    +-     * @return {@code true} if is prototype
    +-     */
    +-    public final boolean isPrototype() {
    +-        return (flags & IS_PROTOTYPE) != 0;
    +-    }
    +-
    +-    /**
    +-     * Flag this object as having a prototype.
    +-     */
    +-    public final void setIsPrototype() {
    +-        if (proto != null && !isPrototype()) {
    +-            proto.addPropertyListener(this);
    +-        }
    +-        flags |= IS_PROTOTYPE;
    +-    }
    +-
    +-    /**
    +      * Check if this object has non-writable length property
    +      *
    +      * @return {@code true} if 'length' property is non-writable
    +@@ -1712,6 +1696,44 @@
    +     }
    + 
    +     /**
    ++     * Test whether this object contains in its prototype chain or is itself a with-object.
    ++     * @return true if a with-object was found
    ++     */
    ++    final boolean hasWithScope() {
    ++        if (isScope()) {
    ++            for (ScriptObject obj = this; obj != null; obj = obj.getProto()) {
    ++                if (obj instanceof WithObject) {
    ++                    return true;
    ++                }
    ++            }
    ++        }
    ++        return false;
    ++    }
    ++
    ++    /**
    ++     * Add a filter to the first argument of {@code methodHandle} that calls its {@link #getProto()} method
    ++     * {@code depth} times.
    ++     * @param methodHandle a method handle
    ++     * @param depth        distance to target prototype
    ++     * @return the filtered method handle
    ++     */
    ++    static MethodHandle addProtoFilter(final MethodHandle methodHandle, final int depth) {
    ++        if (depth == 0) {
    ++            return methodHandle;
    ++        }
    ++        final int listIndex = depth - 1; // We don't need 0-deep walker
    ++        MethodHandle filter = listIndex < protoFilters.size() ? protoFilters.get(listIndex) : null;
    ++
    ++        if(filter == null) {
    ++            filter = addProtoFilter(GETPROTO, depth - 1);
    ++            protoFilters.add(null);
    ++            protoFilters.set(listIndex, filter);
    ++        }
    ++
    ++        return MH.filterArguments(methodHandle, 0, filter.asType(filter.type().changeReturnType(methodHandle.type().parameterType(0))));
    ++    }
    ++
    ++    /**
    +      * Find the appropriate GET method for an invoke dynamic call.
    +      *
    +      * @param desc     the call site descriptor
    +@@ -1722,7 +1744,7 @@
    +      */
    +     protected GuardedInvocation findGetMethod(final CallSiteDescriptor desc, final LinkRequest request, final String operator) {
    +         final String name = desc.getNameToken(CallSiteDescriptor.NAME_OPERAND);
    +-        if (request.isCallSiteUnstable()) {
    ++        if (request.isCallSiteUnstable() || hasWithScope()) {
    +             return findMegaMorphicGetMethod(desc, name, "getMethod".equals(operator));
    +         }
    + 
    +@@ -1730,10 +1752,6 @@
    +         MethodHandle methodHandle;
    + 
    +         if (find == null) {
    +-            if (PROTO_PROPERTY_NAME.equals(name)) {
    +-                return new GuardedInvocation(GETPROTO, NashornGuards.getScriptObjectGuard());
    +-            }
    +-
    +             if ("getProp".equals(operator)) {
    +                 return noSuchProperty(desc, request);
    +             } else if ("getMethod".equals(operator)) {
    +@@ -1748,29 +1766,29 @@
    +         final Property property = find.getProperty();
    +         methodHandle = find.getGetter(returnType);
    + 
    +-        // getMap() is fine as we have the prototype switchpoint depending on where the property was found
    +-        final MethodHandle guard = NashornGuards.getMapGuard(getMap());
    ++        // Get the appropriate guard for this callsite and property.
    ++        final MethodHandle guard = NashornGuards.getGuard(this, property, desc);
    ++        final ScriptObject owner = find.getOwner();
    + 
    +         if (methodHandle != null) {
    +             assert methodHandle.type().returnType().equals(returnType);
    +             if (find.isSelf()) {
    +-                return new GuardedInvocation(methodHandle, ObjectClassGenerator.OBJECT_FIELDS_ONLY &&
    +-                        NashornCallSiteDescriptor.isFastScope(desc) && !property.canChangeType() ? null : guard);
    ++                return new GuardedInvocation(methodHandle, guard);
    +             }
    + 
    +-            final ScriptObject prototype = find.getOwner();
    +-
    +-            if (!property.hasGetterFunction(prototype)) {
    +-                methodHandle = bindTo(methodHandle, prototype);
    ++            if (!property.hasGetterFunction(owner)) {
    ++                // Add a filter that replaces the self object with the prototype owning the property.
    ++                methodHandle = addProtoFilter(methodHandle, find.getProtoChainLength());
    +             }
    +-            return new GuardedInvocation(methodHandle, getMap().getProtoGetSwitchPoint(proto, name), guard);
    ++            return new GuardedInvocation(methodHandle, guard == null ? null : getProtoSwitchPoint(name, owner), guard);
    +         }
    + 
    +         assert !NashornCallSiteDescriptor.isFastScope(desc);
    +-        return new GuardedInvocation(Lookup.emptyGetter(returnType), getMap().getProtoGetSwitchPoint(proto, name), guard);
    ++        return new GuardedInvocation(Lookup.emptyGetter(returnType), getProtoSwitchPoint(name, owner), guard);
    +     }
    + 
    +-    private static GuardedInvocation findMegaMorphicGetMethod(final CallSiteDescriptor desc, final String name, final boolean isMethod) {
    ++    private static GuardedInvocation findMegaMorphicGetMethod(final CallSiteDescriptor desc, final String name,
    ++                                                              final boolean isMethod) {
    +         final MethodHandle invoker = MH.insertArguments(MEGAMORPHIC_GET, 1, name, isMethod);
    +         final MethodHandle guard = getScriptObjectGuard(desc.getMethodType());
    +         return new GuardedInvocation(invoker, guard);
    +@@ -1781,7 +1799,7 @@
    +         final FindProperty find = findProperty(key, true);
    + 
    +         if (find != null) {
    +-            return getObjectValue(find);
    ++            return find.getObjectValue();
    +         }
    + 
    +         return isMethod ? getNoSuchMethod(key) : invokeNoSuchProperty(key);
    +@@ -1824,6 +1842,28 @@
    +     }
    + 
    +     /**
    ++     * Get a switch point for a property with the given {@code name} that will be invalidated when
    ++     * the property definition is changed in this object's prototype chain. Returns {@code null} if
    ++     * the property is defined in this object itself.
    ++     *
    ++     * @param name the property name
    ++     * @param owner the property owner, null if property is not defined
    ++     * @return a SwitchPoint or null
    ++     */
    ++    public final SwitchPoint getProtoSwitchPoint(final String name, final ScriptObject owner) {
    ++        if (owner == this || getProto() == null) {
    ++            return null;
    ++        }
    ++
    ++        for (ScriptObject obj = this; obj != owner && obj.getProto() != null; obj = obj.getProto()) {
    ++            ScriptObject parent = obj.getProto();
    ++            parent.getMap().addListener(name, obj.getMap());
    ++        }
    ++
    ++        return getMap().getSwitchPoint(name);
    ++    }
    ++
    ++    /**
    +      * Find the appropriate SET method for an invoke dynamic call.
    +      *
    +      * @param desc    the call site descriptor
    +@@ -1833,7 +1873,7 @@
    +      */
    +     protected GuardedInvocation findSetMethod(final CallSiteDescriptor desc, final LinkRequest request) {
    +         final String name = desc.getNameToken(CallSiteDescriptor.NAME_OPERAND);
    +-        if (request.isCallSiteUnstable()) {
    ++        if (request.isCallSiteUnstable() || hasWithScope()) {
    +             return findMegaMorphicSetMethod(desc, name);
    +         }
    + 
    +@@ -1863,9 +1903,7 @@
    +                 return createEmptySetMethod(desc, "property.not.writable", true);
    +             }
    +         } else {
    +-            if (PROTO_PROPERTY_NAME.equals(name)) {
    +-                return new GuardedInvocation(SETPROTOCHECK, NashornGuards.getScriptObjectGuard());
    +-            } else if (! isExtensible()) {
    ++            if (! isExtensible()) {
    +                 return createEmptySetMethod(desc, "object.non.extensible", false);
    +             }
    +         }
    +@@ -1879,8 +1917,7 @@
    +                throw typeError(strictErrorMessage, name, ScriptRuntime.safeToString((this)));
    +            }
    +            assert canBeFastScope || !NashornCallSiteDescriptor.isFastScope(desc);
    +-           final PropertyMap myMap = getMap();
    +-           return new GuardedInvocation(Lookup.EMPTY_SETTER, myMap.getProtoGetSwitchPoint(proto, name), NashornGuards.getMapGuard(myMap));
    ++           return new GuardedInvocation(Lookup.EMPTY_SETTER, getProtoSwitchPoint(name, null), NashornGuards.getMapGuard(getMap()));
    +     }
    + 
    +     @SuppressWarnings("unused")
    +@@ -1888,7 +1925,9 @@
    +         final ScriptObject obj = (ScriptObject)self;
    +         final boolean isStrict = NashornCallSiteDescriptor.isStrict(desc);
    +         if (!obj.isExtensible()) {
    +-            throw typeError("object.non.extensible", desc.getNameToken(2), ScriptRuntime.safeToString(obj));
    ++            if (isStrict) {
    ++                throw typeError("object.non.extensible", desc.getNameToken(2), ScriptRuntime.safeToString(obj));
    ++            }
    +         } else if (obj.compareAndSetMap(oldMap, newMap)) {
    +             setter.invokeExact(self, value);
    +         } else {
    +@@ -1953,6 +1992,15 @@
    +         }
    +     }
    + 
    ++    @SuppressWarnings("unused")
    ++    private static Object globalFilter(final Object object) {
    ++        ScriptObject sobj = (ScriptObject) object;
    ++        while (sobj != null && !(sobj instanceof Global)) {
    ++            sobj = sobj.getProto();
    ++        }
    ++        return sobj;
    ++    }
    ++
    +     private static GuardedInvocation findMegaMorphicSetMethod(final CallSiteDescriptor desc, final String name) {
    +         final MethodType type = desc.getMethodType().insertParameterTypes(1, Object.class);
    +         final GuardedInvocation inv = findSetIndexMethod(type, NashornCallSiteDescriptor.isStrict(desc));
    +@@ -1998,7 +2046,7 @@
    +             return noSuchProperty(desc, request);
    +         }
    + 
    +-        final Object value = getObjectValue(find);
    ++        final Object value = find.getObjectValue();
    +         if (! (value instanceof ScriptFunction)) {
    +             return createEmptyGetter(desc, name);
    +         }
    +@@ -2024,7 +2072,7 @@
    +         final boolean scopeAccess = isScope() && NashornCallSiteDescriptor.isScope(desc);
    + 
    +         if (find != null) {
    +-            final Object   value        = getObjectValue(find);
    ++            final Object   value        = find.getObjectValue();
    +             ScriptFunction func         = null;
    +             MethodHandle   methodHandle = null;
    + 
    +@@ -2038,7 +2086,7 @@
    +                     methodHandle = bindTo(methodHandle, UNDEFINED);
    +                 }
    +                 return new GuardedInvocation(methodHandle,
    +-                        find.isInherited()? getMap().getProtoGetSwitchPoint(proto, NO_SUCH_PROPERTY_NAME) : null,
    ++                        getProtoSwitchPoint(NO_SUCH_PROPERTY_NAME, find.getOwner()),
    +                         getKnownFunctionPropertyGuard(getMap(), find.getGetter(Object.class), find.getOwner(), func));
    +             }
    +         }
    +@@ -2049,16 +2097,17 @@
    + 
    +         return createEmptyGetter(desc, name);
    +     }
    ++
    +     /**
    +      * Invoke fall back if a property is not found.
    +      * @param name Name of property.
    +      * @return Result from call.
    +      */
    +-    private Object invokeNoSuchProperty(final String name) {
    ++    protected Object invokeNoSuchProperty(final String name) {
    +         final FindProperty find = findProperty(NO_SUCH_PROPERTY_NAME, true);
    + 
    +         if (find != null) {
    +-            final Object func = getObjectValue(find);
    ++            final Object func = find.getObjectValue();
    + 
    +             if (func instanceof ScriptFunction) {
    +                 return ScriptRuntime.apply((ScriptFunction)func, this, name);
    +@@ -2080,7 +2129,7 @@
    +             return invokeNoSuchProperty(name);
    +         }
    + 
    +-        final Object value = getObjectValue(find);
    ++        final Object value = find.getObjectValue();
    +         if (! (value instanceof ScriptFunction)) {
    +             return UNDEFINED;
    +         }
    +@@ -2089,7 +2138,8 @@
    +     }
    + 
    +     private GuardedInvocation createEmptyGetter(final CallSiteDescriptor desc, final String name) {
    +-        return new GuardedInvocation(Lookup.emptyGetter(desc.getMethodType().returnType()), getMap().getProtoGetSwitchPoint(proto, name), NashornGuards.getMapGuard(getMap()));
    ++        return new GuardedInvocation(Lookup.emptyGetter(desc.getMethodType().returnType()),
    ++                getProtoSwitchPoint(name, null), NashornGuards.getMapGuard(getMap()));
    +     }
    + 
    +     private abstract static class ScriptObjectIterator  implements Iterator {
    +@@ -2170,12 +2220,10 @@
    + 
    +         if (fieldCount < fieldMaximum) {
    +             property = new AccessorProperty(key, propertyFlags & ~Property.IS_SPILL, getClass(), fieldCount);
    +-            notifyPropertyAdded(this, property);
    +             property = addOwnProperty(property);
    +         } else {
    +             int i = getMap().getSpillLength();
    +             property = new AccessorProperty(key, propertyFlags | Property.IS_SPILL, i);
    +-            notifyPropertyAdded(this, property);
    +             property = addOwnProperty(property);
    +             i = property.getSlot();
    + 
    +@@ -2621,7 +2669,7 @@
    +                     final FindProperty find = object.findProperty(key, false, false, this);
    + 
    +                     if (find != null) {
    +-                        return getObjectValue(find);
    ++                        return find.getObjectValue();
    +                     }
    +                 }
    + 
    +@@ -2639,7 +2687,7 @@
    +             final FindProperty find = findProperty(key, true);
    + 
    +             if (find != null) {
    +-                return getObjectValue(find);
    ++                return find.getObjectValue();
    +             }
    +         }
    + 
    +@@ -2703,9 +2751,7 @@
    +      * @param strict are we in strict mode
    +      */
    +     private void doesNotHave(final int index, final Object value, final boolean strict) {
    +-        final long oldLength = getArray().length();
    +         final long longIndex = ArrayIndex.toLongIndex(index);
    +-
    +         if (getMap().containsArrayKeys()) {
    +             final String key = JSType.toString(longIndex);
    +             final FindProperty find = findProperty(key, true);
    +@@ -2716,6 +2762,18 @@
    +             }
    +         }
    + 
    ++        setValueAtArrayIndex(longIndex, index, value, strict);
    ++    }
    ++
    ++    /**
    ++     * Handle when an array doesn't have a slot - possibly grow and/or convert array.
    ++     *
    ++     * @param index  key as index
    ++     * @param value  element value
    ++     * @param strict are we in strict mode
    ++     */
    ++    private void setValueAtArrayIndex(final long longIndex, final int index, final Object value, final boolean strict) {
    ++        final long oldLength = getArray().length();
    +         if (longIndex >= oldLength) {
    +             if (!isExtensible()) {
    +                 if (strict) {
    +@@ -2759,7 +2817,8 @@
    +     public final void setObject(final FindProperty find, final boolean strict, final String key, final Object value) {
    +         FindProperty f = find;
    + 
    +-        if (f != null && f.isInherited() && !(f.getProperty() instanceof UserAccessorProperty)) {
    ++        if (f != null && f.isInherited() && !(f.getProperty() instanceof UserAccessorProperty) && !isScope()) {
    ++            // Setting a property should not modify the property in prototype unless this is a scope object.
    +             f = null;
    +         }
    + 
    +@@ -2779,7 +2838,15 @@
    +                 throw typeError("object.non.extensible", key, ScriptRuntime.safeToString(this));
    +             }
    +         } else {
    +-            spill(key, value);
    ++            ScriptObject sobj = this;
    ++            // undefined scope properties are set in the global object.
    ++            if (isScope()) {
    ++                while (sobj != null && !(sobj instanceof Global)) {
    ++                    sobj = sobj.getProto();
    ++                }
    ++                assert sobj != null : "no parent global object in scope";
    ++            }
    ++            sobj.spill(key, value);
    +         }
    +     }
    + 
    +@@ -3228,7 +3295,6 @@
    +         }
    + 
    +         final Property prop = find.getProperty();
    +-        notifyPropertyDeleted(this, prop);
    +         deleteOwnProperty(prop);
    + 
    +         return true;
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -474,7 +474,7 @@
    +      * @return {@link WithObject} that is the new scope
    +      */
    +     public static ScriptObject openWith(final ScriptObject scope, final Object expression) {
    +-        final ScriptObject global = Context.getGlobalTrusted();
    ++        final Global global = Context.getGlobal();
    +         if (expression == UNDEFINED) {
    +             throw typeError(global, "cant.apply.with.to.undefined");
    +         } else if (expression == null) {
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/SetMethodCreator.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/SetMethodCreator.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -31,7 +31,6 @@
    + import java.lang.invoke.MethodHandle;
    + import jdk.internal.dynalink.CallSiteDescriptor;
    + import jdk.internal.dynalink.linker.GuardedInvocation;
    +-import jdk.nashorn.internal.codegen.ObjectClassGenerator;
    + import jdk.nashorn.internal.lookup.Lookup;
    + import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor;
    + import jdk.nashorn.internal.runtime.linker.NashornGuards;
    +@@ -80,7 +79,7 @@
    +     }
    + 
    +     /**
    +-     * This class encapsulates the results of looking up a setter method; it's basically a triple of a method hanle,
    ++     * This class encapsulates the results of looking up a setter method; it's basically a triple of a method handle,
    +      * a Property object, and flags for invocation.
    +      *
    +      */
    +@@ -104,21 +103,9 @@
    +          * @return the composed guarded invocation that represents the dynamic setter method for the property.
    +          */
    +         GuardedInvocation createGuardedInvocation() {
    +-            return new GuardedInvocation(methodHandle, getGuard());
    ++            return new GuardedInvocation(methodHandle, NashornGuards.getGuard(sobj, property, desc));
    +         }
    + 
    +-        private MethodHandle getGuard() {
    +-            return needsNoGuard() ? null : NashornGuards.getMapGuard(getMap());
    +-        }
    +-
    +-        private boolean needsNoGuard() {
    +-            return NashornCallSiteDescriptor.isFastScope(desc) &&
    +-                    (ObjectClassGenerator.OBJECT_FIELDS_ONLY || isPropertyTypeStable());
    +-        }
    +-
    +-        private boolean isPropertyTypeStable() {
    +-            return property == null || !property.canChangeType();
    +-        }
    +     }
    + 
    +     private SetMethod createSetMethod() {
    +@@ -151,10 +138,9 @@
    +         assert methodHandle != null;
    +         assert property     != null;
    + 
    +-        final ScriptObject prototype = find.getOwner();
    +         final MethodHandle boundHandle;
    +-        if (!property.hasSetterFunction(prototype) && find.isInherited()) {
    +-            boundHandle = ScriptObject.bindTo(methodHandle, prototype);
    ++        if (!property.hasSetterFunction(find.getOwner()) && find.isInherited()) {
    ++            boundHandle = ScriptObject.addProtoFilter(methodHandle, find.getProtoChainLength());
    +         } else {
    +             boundHandle = methodHandle;
    +         }
    +@@ -162,13 +148,16 @@
    +     }
    + 
    +     private SetMethod createGlobalPropertySetter() {
    +-        final ScriptObject global = Context.getGlobalTrusted();
    +-        return new SetMethod(ScriptObject.bindTo(global.addSpill(getName()), global), null);
    ++        final ScriptObject global = Context.getGlobal();
    ++        return new SetMethod(MH.filterArguments(global.addSpill(getName()), 0, ScriptObject.GLOBALFILTER), null);
    +     }
    + 
    +     private SetMethod createNewPropertySetter() {
    +         final SetMethod sm = map.getFieldCount() < map.getFieldMaximum() ? createNewFieldSetter() : createNewSpillPropertySetter();
    +-        sobj.notifyPropertyAdded(sobj, sm.property);
    ++        final PropertyListeners listeners = map.getListeners();
    ++        if (listeners != null) {
    ++            listeners.propertyAdded(sm.property);
    ++        }
    +         return sm;
    +     }
    + 
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/Source.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/Source.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -27,27 +27,38 @@
    + 
    + import java.io.ByteArrayOutputStream;
    + import java.io.File;
    ++import java.io.FileNotFoundException;
    + import java.io.IOError;
    + import java.io.IOException;
    + import java.io.InputStream;
    + import java.io.Reader;
    ++import java.lang.ref.WeakReference;
    + import java.net.MalformedURLException;
    + import java.net.URISyntaxException;
    + import java.net.URL;
    ++import java.net.URLConnection;
    + import java.nio.charset.Charset;
    + import java.nio.charset.StandardCharsets;
    + import java.nio.file.Files;
    + import java.nio.file.Path;
    + import java.nio.file.Paths;
    ++import java.security.MessageDigest;
    ++import java.security.NoSuchAlgorithmException;
    + import java.util.Arrays;
    + import java.util.Objects;
    ++import java.util.WeakHashMap;
    ++import jdk.nashorn.api.scripting.URLReader;
    + import jdk.nashorn.internal.parser.Token;
    + 
    + /**
    +  * Source objects track the origin of JavaScript entities.
    +- *
    +  */
    + public final class Source {
    ++
    ++    private static final DebugLogger DEBUG = new DebugLogger("source");
    ++    private static final int BUF_SIZE = 8 * 1024;
    ++    private static final Cache CACHE = new Cache();
    ++
    +     /**
    +      * Descriptive name of the source as supplied by the user. Used for error
    +      * reporting to the user. For example, SyntaxError will use this to print message.
    +@@ -62,49 +73,311 @@
    +      */
    +     private final String base;
    + 
    +-    /** Cached source content. */
    +-    private final char[] content;
    +-
    +-    /** Length of source content. */
    +-    private final int length;
    ++    /** Source content */
    ++    private final Data data;
    + 
    +     /** Cached hash code */
    +     private int hash;
    + 
    +-    /** Source URL if available */
    +-    private final URL url;
    ++    /** Message digest */
    ++    private byte[] digest;
    + 
    +-    private static final int BUFSIZE = 8 * 1024;
    ++    // Do *not* make this public, ever! Trusts the URL and content.
    ++    private Source(final String name, final String base, final Data data) {
    ++        this.name = name;
    ++        this.base = base;
    ++        this.data = data;
    ++    }
    + 
    +-    // Do *not* make this public ever! Trusts the URL and content. So has to be called
    +-    // from other public constructors. Note that this can not be some init method as
    +-    // we initialize final fields from here.
    +-    private Source(final String name, final String base, final char[] content, final URL url) {
    +-        this.name    = name;
    +-        this.base    = base;
    +-        this.content = content;
    +-        this.length  = content.length;
    +-        this.url     = url;
    ++    private static synchronized Source sourceFor(final String name, final String base, final URLData data) throws IOException {
    ++        try {
    ++            final Source newSource = new Source(name, base, data);
    ++            final Source existingSource = CACHE.get(newSource);
    ++            if (existingSource != null) {
    ++                // 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;
    ++            }
    ++        } catch (RuntimeException e) {
    ++            final Throwable cause = e.getCause();
    ++            if (cause instanceof IOException) {
    ++                throw (IOException) cause;
    ++            }
    ++            throw e;
    ++        }
    ++    }
    ++
    ++    private static class Cache extends WeakHashMap> {
    ++        public Source get(final Source key) {
    ++            final WeakReference ref = super.get(key);
    ++            return ref == null ? null : ref.get();
    ++        }
    ++
    ++        public void put(final Source key, final Source value) {
    ++            assert !(value.data instanceof RawData);
    ++            put(key, new WeakReference<>(value));
    ++        }
    ++    }
    ++
    ++    /* package-private */
    ++    DebuggerSupport.SourceInfo getSourceInfo() {
    ++        return new DebuggerSupport.SourceInfo(getName(), data.hashCode(),  data.url(), data.array());
    ++    }
    ++
    ++    // Wrapper to manage lazy loading
    ++    private static interface Data {
    ++
    ++        URL url();
    ++
    ++        int length();
    ++
    ++        long lastModified();
    ++
    ++        char[] array();
    ++    }
    ++
    ++    private static class RawData implements Data {
    ++        private final char[] array;
    ++        private int hash;
    ++
    ++        private RawData(final char[] array) {
    ++            this.array = Objects.requireNonNull(array);
    ++        }
    ++
    ++        private RawData(final String source) {
    ++            this.array = Objects.requireNonNull(source).toCharArray();
    ++        }
    ++
    ++        private RawData(final Reader reader) throws IOException {
    ++            this(readFully(reader));
    ++        }
    ++
    ++        @Override
    ++        public int hashCode() {
    ++            int h = hash;
    ++            if (h == 0) {
    ++                h = hash = Arrays.hashCode(array);
    ++            }
    ++            return h;
    ++        }
    ++
    ++        @Override
    ++        public boolean equals(Object obj) {
    ++            if (this == obj) {
    ++                return true;
    ++            }
    ++            if (obj instanceof RawData) {
    ++                return Arrays.equals(array, ((RawData)obj).array);
    ++            }
    ++            return false;
    ++        }
    ++
    ++        @Override
    ++        public String toString() {
    ++            return new String(array());
    ++        }
    ++
    ++        @Override
    ++        public URL url() {
    ++            return null;
    ++        }
    ++
    ++        @Override
    ++        public int length() {
    ++            return array.length;
    ++        }
    ++
    ++        @Override
    ++        public long lastModified() {
    ++            return 0;
    ++        }
    ++
    ++        @Override
    ++        public char[] array() {
    ++            return array;
    ++        }
    ++
    ++
    ++    }
    ++
    ++    private static class URLData implements Data {
    ++        private final URL url;
    ++        protected final Charset cs;
    ++        private int hash;
    ++        protected char[] array;
    ++        protected int length;
    ++        protected long lastModified;
    ++
    ++        private URLData(final URL url, final Charset cs) {
    ++            this.url = Objects.requireNonNull(url);
    ++            this.cs = cs;
    ++        }
    ++
    ++        @Override
    ++        public int hashCode() {
    ++            int h = hash;
    ++            if (h == 0) {
    ++                h = hash = url.hashCode();
    ++            }
    ++            return h;
    ++        }
    ++
    ++        @Override
    ++        public boolean equals(Object other) {
    ++            if (this == other) {
    ++                return true;
    ++            }
    ++            if (!(other instanceof URLData)) {
    ++                return false;
    ++            }
    ++
    ++            URLData otherData = (URLData) other;
    ++
    ++            if (url.equals(otherData.url)) {
    ++                // Make sure both have meta data loaded
    ++                try {
    ++                    if (isDeferred()) {
    ++                        // Data in cache is always loaded, and we only compare to cached data.
    ++                        assert !otherData.isDeferred();
    ++                        loadMeta();
    ++                    } else if (otherData.isDeferred()) {
    ++                        otherData.loadMeta();
    ++                    }
    ++                } catch (IOException e) {
    ++                    throw new RuntimeException(e);
    ++                }
    ++
    ++                // Compare meta data
    ++                return this.length == otherData.length && this.lastModified == otherData.lastModified;
    ++            }
    ++            return false;
    ++        }
    ++
    ++        @Override
    ++        public String toString() {
    ++            return new String(array());
    ++        }
    ++
    ++        @Override
    ++        public URL url() {
    ++            return url;
    ++        }
    ++
    ++        @Override
    ++        public int length() {
    ++            return length;
    ++        }
    ++
    ++        @Override
    ++        public long lastModified() {
    ++            return lastModified;
    ++        }
    ++
    ++        @Override
    ++        public char[] array() {
    ++            assert !isDeferred();
    ++            return array;
    ++        }
    ++
    ++        boolean isDeferred() {
    ++            return array == null;
    ++        }
    ++
    ++        protected void checkPermissionAndClose() throws IOException {
    ++            try (InputStream in = url.openStream()) {}
    ++            debug("permission checked for ", url);
    ++        }
    ++
    ++        protected void load() throws IOException {
    ++            if (array == null) {
    ++                final URLConnection c = url.openConnection();
    ++                try (InputStream in = c.getInputStream()) {
    ++                    array = cs == null ? readFully(in) : readFully(in, cs);
    ++                    length = array.length;
    ++                    lastModified = c.getLastModified();
    ++                    debug("loaded content for ", url);
    ++                }
    ++            }
    ++        }
    ++
    ++        protected void loadMeta() throws IOException {
    ++            if (length == 0 && lastModified == 0) {
    ++                final URLConnection c = url.openConnection();
    ++                length = c.getContentLength();
    ++                lastModified = c.getLastModified();
    ++                debug("loaded metadata for ", url);
    ++            }
    ++        }
    ++    }
    ++
    ++    private static class FileData extends URLData {
    ++        private final File file;
    ++
    ++        private FileData(final File file, final Charset cs) {
    ++            super(getURLFromFile(file), cs);
    ++            this.file = file;
    ++
    ++        }
    ++
    ++        @Override
    ++        protected void checkPermissionAndClose() throws IOException {
    ++            if (!file.canRead()) {
    ++                throw new FileNotFoundException(file + " (Permission Denied)");
    ++            }
    ++            debug("permission checked for ", file);
    ++        }
    ++
    ++        @Override
    ++        protected void loadMeta() {
    ++            if (length == 0 && lastModified == 0) {
    ++                length = (int) file.length();
    ++                lastModified = file.lastModified();
    ++                debug("loaded metadata for ", file);
    ++            }
    ++        }
    ++
    ++        @Override
    ++        protected void load() throws IOException {
    ++            if (array == null) {
    ++                array = cs == null ? readFully(file) : readFully(file, cs);
    ++                length = array.length;
    ++                lastModified = file.lastModified();
    ++                debug("loaded content for ", file);
    ++            }
    ++        }
    ++    }
    ++
    ++    private static void debug(final Object... msg) {
    ++        DEBUG.info(msg);
    ++    }
    ++
    ++    private char[] data() {
    ++        return data.array();
    +     }
    + 
    +     /**
    +-     * Constructor
    ++     * Returns an instance
    +      *
    +      * @param name    source name
    +      * @param content contents as char array
    +      */
    +-    public Source(final String name, final char[] content) {
    +-        this(name, baseName(name, null), content, null);
    ++    public static Source sourceFor(final String name, final char[] content) {
    ++        return new Source(name, baseName(name), new RawData(content));
    +     }
    + 
    +     /**
    +-     * Constructor
    ++     * Returns an instance
    +      *
    +      * @param name    source name
    +      * @param content contents as string
    +      */
    +-    public Source(final String name, final String content) {
    +-        this(name, content.toCharArray());
    ++    public static Source sourceFor(final String name, final String content) {
    ++        return new Source(name, baseName(name), new RawData(content));
    +     }
    + 
    +     /**
    +@@ -115,8 +388,8 @@
    +      *
    +      * @throws IOException if source cannot be loaded
    +      */
    +-    public Source(final String name, final URL url) throws IOException {
    +-        this(name, baseURL(url, null), readFully(url), url);
    ++    public static Source sourceFor(final String name, final URL url) throws IOException {
    ++        return sourceFor(name, url, null);
    +     }
    + 
    +     /**
    +@@ -128,8 +401,8 @@
    +      *
    +      * @throws IOException if source cannot be loaded
    +      */
    +-    public Source(final String name, final URL url, final Charset cs) throws IOException {
    +-        this(name, baseURL(url, null), readFully(url, cs), url);
    ++    public static Source sourceFor(final String name, final URL url, final Charset cs) throws IOException {
    ++        return sourceFor(name, baseURL(url), new URLData(url, cs));
    +     }
    + 
    +     /**
    +@@ -140,8 +413,8 @@
    +      *
    +      * @throws IOException if source cannot be loaded
    +      */
    +-    public Source(final String name, final File file) throws IOException {
    +-        this(name, dirName(file, null), readFully(file), getURLFromFile(file));
    ++    public static Source sourceFor(final String name, final File file) throws IOException {
    ++        return sourceFor(name, file, null);
    +     }
    + 
    +     /**
    +@@ -153,8 +426,25 @@
    +      *
    +      * @throws IOException if source cannot be loaded
    +      */
    +-    public Source(final String name, final File file, final Charset cs) throws IOException {
    +-        this(name, dirName(file, null), readFully(file, cs), getURLFromFile(file));
    ++    public static Source sourceFor(final String name, final File file, final Charset cs) throws IOException {
    ++        final File absFile = file.getAbsoluteFile();
    ++        return sourceFor(name, dirName(absFile, null), new FileData(file, cs));
    ++    }
    ++
    ++    /**
    ++     * Returns an instance
    ++     *
    ++     * @param name source name
    ++     * @param reader reader from which source can be loaded
    ++     * @throws IOException if source cannot be loaded
    ++     */
    ++    public static Source sourceFor(final String name, final Reader reader) throws IOException {
    ++        // Extract URL from URLReader to defer loading and reuse cached data if available.
    ++        if (reader instanceof URLReader) {
    ++            final URLReader urlReader = (URLReader) reader;
    ++            return sourceFor(name, urlReader.getURL(), urlReader.getCharset());
    ++        }
    ++        return new Source(name, baseName(name), new RawData(reader));
    +     }
    + 
    +     @Override
    +@@ -162,21 +452,18 @@
    +         if (this == obj) {
    +             return true;
    +         }
    +-
    +         if (!(obj instanceof Source)) {
    +             return false;
    +         }
    +-
    +-        final Source src = (Source)obj;
    +-        // Only compare content as a last resort measure
    +-        return length == src.length && Objects.equals(url, src.url) && Objects.equals(name, src.name) && Arrays.equals(content, src.content);
    ++        final Source other = (Source) obj;
    ++        return Objects.equals(name, other.name) && data.equals(other.data);
    +     }
    + 
    +     @Override
    +     public int hashCode() {
    +         int h = hash;
    +         if (h == 0) {
    +-            h = hash = Arrays.hashCode(content) ^ Objects.hashCode(name);
    ++            h = hash = data.hashCode() ^ Objects.hashCode(name);
    +         }
    +         return h;
    +     }
    +@@ -186,7 +473,7 @@
    +      * @return Source content.
    +      */
    +     public String getString() {
    +-        return new String(content, 0, length);
    ++        return data.toString();
    +     }
    + 
    +     /**
    +@@ -198,6 +485,14 @@
    +     }
    + 
    +     /**
    ++     * Get the last modified time of this script.
    ++     * @return Last modified time.
    ++     */
    ++    public long getLastModified() {
    ++        return data.lastModified();
    ++    }
    ++
    ++    /**
    +      * Get the "directory" part of the file or "base" of the URL.
    +      * @return base of file or URL.
    +      */
    +@@ -212,7 +507,7 @@
    +      * @return Source content portion.
    +      */
    +     public String getString(final int start, final int len) {
    +-        return new String(content, start, len);
    ++        return new String(data(), start, len);
    +     }
    + 
    +     /**
    +@@ -223,7 +518,7 @@
    +     public String getString(final long token) {
    +         final int start = Token.descPosition(token);
    +         final int len = Token.descLength(token);
    +-        return new String(content, start, len);
    ++        return new String(data(), start, len);
    +     }
    + 
    +     /**
    +@@ -233,7 +528,7 @@
    +      * @return URL source or null
    +      */
    +     public URL getURL() {
    +-        return url;
    ++        return data.url();
    +     }
    + 
    +     /**
    +@@ -242,8 +537,9 @@
    +      * @return Index of first character of line.
    +      */
    +     private int findBOLN(final int position) {
    ++        final char[] data = data();
    +         for (int i = position - 1; i > 0; i--) {
    +-            final char ch = content[i];
    ++            final char ch = data[i];
    + 
    +             if (ch == '\n' || ch == '\r') {
    +                 return i + 1;
    +@@ -259,8 +555,10 @@
    +      * @return Index of last character of line.
    +      */
    +     private int findEOLN(final int position) {
    +-         for (int i = position; i < length; i++) {
    +-            final char ch = content[i];
    ++        final char[] data = data();
    ++        final int length = data.length;
    ++        for (int i = position; i < length; i++) {
    ++            final char ch = data[i];
    + 
    +             if (ch == '\n' || ch == '\r') {
    +                 return i - 1;
    +@@ -280,11 +578,12 @@
    +      * @return Line number.
    +      */
    +     public int getLine(final int position) {
    ++        final char[] data = data();
    +         // Line count starts at 1.
    +         int line = 1;
    + 
    +         for (int i = 0; i < position; i++) {
    +-            final char ch = content[i];
    ++            final char ch = data[i];
    +             // Works for both \n and \r\n.
    +             if (ch == '\n') {
    +                 line++;
    +@@ -315,7 +614,7 @@
    +         // Find end of this line.
    +         final int last = findEOLN(position);
    + 
    +-        return new String(content, first, last - first + 1);
    ++        return new String(data(), first, last - first + 1);
    +     }
    + 
    +     /**
    +@@ -323,7 +622,7 @@
    +      * @return content
    +      */
    +     public char[] getContent() {
    +-        return content.clone();
    ++        return data().clone();
    +     }
    + 
    +     /**
    +@@ -331,19 +630,18 @@
    +      * @return length
    +      */
    +     public int getLength() {
    +-        return length;
    ++        return data.length();
    +     }
    + 
    +     /**
    +      * Read all of the source until end of file. Return it as char array
    +      *
    +-     * @param reader  reader opened to source stream
    ++     * @param reader reader opened to source stream
    +      * @return source as content
    +-     *
    +      * @throws IOException if source could not be read
    +      */
    +     public static char[] readFully(final Reader reader) throws IOException {
    +-        final char[]        arr = new char[BUFSIZE];
    ++        final char[]        arr = new char[BUF_SIZE];
    +         final StringBuilder sb  = new StringBuilder();
    + 
    +         try {
    +@@ -361,9 +659,8 @@
    +     /**
    +      * Read all of the source until end of file. Return it as char array
    +      *
    +-     * @param file  source file
    ++     * @param file source file
    +      * @return source as content
    +-     *
    +      * @throws IOException if source could not be read
    +      */
    +     public static char[] readFully(final File file) throws IOException {
    +@@ -376,10 +673,9 @@
    +     /**
    +      * Read all of the source until end of file. Return it as char array
    +      *
    +-     * @param file  source file
    ++     * @param file source file
    +      * @param cs Charset used to convert bytes to chars
    +      * @return source as content
    +-     *
    +      * @throws IOException if source could not be read
    +      */
    +     public static char[] readFully(final File file, final Charset cs) throws IOException {
    +@@ -388,7 +684,7 @@
    +         }
    + 
    +         final byte[] buf = Files.readAllBytes(file.toPath());
    +-        return (cs != null)? new String(buf, cs).toCharArray() : byteToCharArray(buf);
    ++        return (cs != null) ? new String(buf, cs).toCharArray() : byteToCharArray(buf);
    +     }
    + 
    +     /**
    +@@ -396,7 +692,6 @@
    +      *
    +      * @param url URL to read content from
    +      * @return source as content
    +-     *
    +      * @throws IOException if source could not be read
    +      */
    +     public static char[] readFully(final URL url) throws IOException {
    +@@ -409,7 +704,6 @@
    +      * @param url URL to read content from
    +      * @param cs Charset used to convert bytes to chars
    +      * @return source as content
    +-     *
    +      * @throws IOException if source could not be read
    +      */
    +     public static char[] readFully(final URL url, final Charset cs) throws IOException {
    +@@ -417,55 +711,85 @@
    +     }
    + 
    +     /**
    ++     * Get a message digest for this source.
    ++     *
    ++     * @return a message digest for this source
    ++     */
    ++    public synchronized byte[] getDigest() {
    ++        if (digest == null) {
    ++            final char[] content = data();
    ++            final byte[] bytes = new byte[content.length * 2];
    ++
    ++            for (int i = 0; i < content.length; i++) {
    ++                bytes[i * 2]     = (byte)  (content[i] & 0x00ff);
    ++                bytes[i * 2 + 1] = (byte) ((content[i] & 0xff00) >> 8);
    ++            }
    ++
    ++            try {
    ++                final MessageDigest md = MessageDigest.getInstance("SHA-1");
    ++                if (name != null) {
    ++                    md.update(name.getBytes(StandardCharsets.UTF_8));
    ++                }
    ++                if (base != null) {
    ++                    md.update(base.getBytes(StandardCharsets.UTF_8));
    ++                }
    ++                if (getURL() != null) {
    ++                    md.update(getURL().toString().getBytes(StandardCharsets.UTF_8));
    ++                }
    ++                digest = md.digest(bytes);
    ++            } catch (NoSuchAlgorithmException e) {
    ++                throw new RuntimeException(e);
    ++            }
    ++        }
    ++        return digest;
    ++    }
    ++
    ++    /**
    +      * Get the base url. This is currently used for testing only
    +      * @param url a URL
    +      * @return base URL for url
    +      */
    +     public static String baseURL(final URL url) {
    +-        return baseURL(url, null);
    +-    }
    +-
    +-    private static String baseURL(final URL url, final String defaultValue) {
    +         if (url.getProtocol().equals("file")) {
    +             try {
    +                 final Path path = Paths.get(url.toURI());
    +                 final Path parent = path.getParent();
    +-                return (parent != null) ? (parent + File.separator) : defaultValue;
    ++                return (parent != null) ? (parent + File.separator) : null;
    +             } catch (final SecurityException | URISyntaxException | IOError e) {
    +-                return defaultValue;
    ++                return null;
    +             }
    +         }
    + 
    +         // FIXME: is there a better way to find 'base' URL of a given URL?
    +         String path = url.getPath();
    +         if (path.isEmpty()) {
    +-            return defaultValue;
    ++            return null;
    +         }
    +         path = path.substring(0, path.lastIndexOf('/') + 1);
    +         final int port = url.getPort();
    +         try {
    +             return new URL(url.getProtocol(), url.getHost(), port, path).toString();
    +         } catch (final MalformedURLException e) {
    +-            return defaultValue;
    ++            return null;
    +         }
    +     }
    + 
    +-    private static String dirName(final File file, final String defaultValue) {
    ++    private static String dirName(final File file, final String DEFAULT_BASE_NAME) {
    +         final String res = file.getParent();
    +-        return (res != null)? (res + File.separator) : defaultValue;
    ++        return (res != null) ? (res + File.separator) : DEFAULT_BASE_NAME;
    +     }
    + 
    +     // fake directory like name
    +-    private static String baseName(final String name, final String defaultValue) {
    ++    private static String baseName(final String name) {
    +         int idx = name.lastIndexOf('/');
    +         if (idx == -1) {
    +             idx = name.lastIndexOf('\\');
    +         }
    +-        return (idx != -1)? name.substring(0, idx + 1) : defaultValue;
    ++        return (idx != -1) ? name.substring(0, idx + 1) : null;
    +     }
    + 
    +     private static char[] readFully(final InputStream is, final Charset cs) throws IOException {
    +-        return (cs != null)? new String(readBytes(is), cs).toCharArray() : readFully(is);
    ++        return (cs != null) ? new String(readBytes(is), cs).toCharArray() : readFully(is);
    +     }
    + 
    +     private static char[] readFully(final InputStream is) throws IOException {
    +@@ -476,19 +800,19 @@
    +         Charset cs = StandardCharsets.UTF_8;
    +         int start = 0;
    +         // BOM detection.
    +-        if (bytes.length > 1 && bytes[0] == (byte)0xFE && bytes[1] == (byte)0xFF) {
    ++        if (bytes.length > 1 && bytes[0] == (byte) 0xFE && bytes[1] == (byte) 0xFF) {
    +             start = 2;
    +             cs = StandardCharsets.UTF_16BE;
    +-        } else if (bytes.length > 1 && bytes[0] == (byte)0xFF && bytes[1] == (byte)0xFE) {
    ++        } else if (bytes.length > 1 && bytes[0] == (byte) 0xFF && bytes[1] == (byte) 0xFE) {
    +             start = 2;
    +             cs = StandardCharsets.UTF_16LE;
    +-        } else if (bytes.length > 2 && bytes[0] == (byte)0xEF && bytes[1] == (byte)0xBB && bytes[2] == (byte)0xBF) {
    ++        } else if (bytes.length > 2 && bytes[0] == (byte) 0xEF && bytes[1] == (byte) 0xBB && bytes[2] == (byte) 0xBF) {
    +             start = 3;
    +             cs = StandardCharsets.UTF_8;
    +-        } else if (bytes.length > 3 && bytes[0] == (byte)0xFF && bytes[1] == (byte)0xFE && bytes[2] == 0 && bytes[3] == 0) {
    ++        } else if (bytes.length > 3 && bytes[0] == (byte) 0xFF && bytes[1] == (byte) 0xFE && bytes[2] == 0 && bytes[3] == 0) {
    +             start = 4;
    +             cs = Charset.forName("UTF-32LE");
    +-        } else if (bytes.length > 3 && bytes[0] == 0 && bytes[1] == 0 && bytes[2] == (byte)0xFE && bytes[3] == (byte)0xFF) {
    ++        } else if (bytes.length > 3 && bytes[0] == 0 && bytes[1] == 0 && bytes[2] == (byte) 0xFE && bytes[3] == (byte) 0xFF) {
    +             start = 4;
    +             cs = Charset.forName("UTF-32BE");
    +         }
    +@@ -497,7 +821,7 @@
    +     }
    + 
    +     static byte[] readBytes(final InputStream is) throws IOException {
    +-        final byte[] arr = new byte[BUFSIZE];
    ++        final byte[] arr = new byte[BUF_SIZE];
    +         try {
    +             try (ByteArrayOutputStream buf = new ByteArrayOutputStream()) {
    +                 int numBytes;
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -34,6 +34,7 @@
    + import jdk.nashorn.internal.runtime.linker.Bootstrap;
    + 
    + import static jdk.nashorn.internal.codegen.CompilerConstants.staticCall;
    ++import jdk.nashorn.internal.objects.Global;
    + import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
    + import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
    + 
    +@@ -73,7 +74,7 @@
    + 
    +     private static MethodHandle getINVOKE_UA_GETTER() {
    + 
    +-        return ((GlobalObject)Context.getGlobal()).getDynamicInvoker(INVOKE_UA_GETTER,
    ++        return Context.getGlobal().getDynamicInvoker(INVOKE_UA_GETTER,
    +                 new Callable() {
    +                     @Override
    +                     public MethodHandle call() {
    +@@ -86,7 +87,7 @@
    +     /** Dynamic invoker for setter */
    +     private static Object INVOKE_UA_SETTER = new Object();
    +     private static MethodHandle getINVOKE_UA_SETTER() {
    +-        return ((GlobalObject)Context.getGlobal()).getDynamicInvoker(INVOKE_UA_SETTER,
    ++        return Context.getGlobal().getDynamicInvoker(INVOKE_UA_SETTER,
    +                 new Callable() {
    +                     @Override
    +                     public MethodHandle call() {
    +@@ -186,6 +187,11 @@
    +     }
    + 
    +     @Override
    ++    void initMethodHandles(final Class structure) {
    ++        throw new UnsupportedOperationException();
    ++    }
    ++
    ++    @Override
    +     public ScriptFunction getGetterFunction(final ScriptObject obj) {
    +         final Object value = obj.getSpill(getterSlot);
    +         return (value instanceof ScriptFunction) ? (ScriptFunction) value : null;
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/WithObject.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/WithObject.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -36,6 +36,7 @@
    + import jdk.internal.dynalink.linker.LinkRequest;
    + import jdk.internal.dynalink.support.CallSiteDescriptorFactory;
    + import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor;
    ++import jdk.nashorn.internal.runtime.linker.NashornGuards;
    + 
    + /**
    +  * This class supports the handling of scope in a with body.
    +@@ -87,6 +88,11 @@
    + 
    +     @Override
    +     public GuardedInvocation lookup(final CallSiteDescriptor desc, final LinkRequest request) {
    ++        if (request.isCallSiteUnstable()) {
    ++            // Fall back to megamorphic invocation which performs a complete lookup each time without further relinking.
    ++            return super.lookup(desc, request);
    ++        }
    ++
    +         // With scopes can never be observed outside of Nashorn code, so all call sites that can address it will of
    +         // necessity have a Nashorn descriptor - it is safe to cast.
    +         final NashornCallSiteDescriptor ndesc = (NashornCallSiteDescriptor)desc;
    +@@ -123,7 +129,7 @@
    +         }
    + 
    +         if (find != null) {
    +-            return fixScopeCallSite(scope.lookup(desc, request), name);
    ++            return fixScopeCallSite(scope.lookup(desc, request), name, find.getOwner());
    +         }
    + 
    +         // the property is not found - now check for
    +@@ -175,7 +181,7 @@
    +         link = scope.lookup(desc, request);
    + 
    +         if (link != null) {
    +-            return fixScopeCallSite(link, name);
    ++            return fixScopeCallSite(link, name, null);
    +         }
    + 
    +         return null;
    +@@ -252,13 +258,10 @@
    +                 filterGuard(link, WITHEXPRESSIONFILTER));
    +     }
    + 
    +-    private GuardedInvocation fixScopeCallSite(final GuardedInvocation link, final String name) {
    ++    private GuardedInvocation fixScopeCallSite(final GuardedInvocation link, final String name, final ScriptObject owner) {
    +         final GuardedInvocation newLink = fixReceiverType(link, WITHSCOPEFILTER);
    +         return link.replaceMethods(filter(newLink.getInvocation(), WITHSCOPEFILTER),
    +-            MH.guardWithTest(
    +-                expressionGuard(name),
    +-                filterGuard(newLink, WITHSCOPEFILTER),
    +-                MH.dropArguments(MH.constant(boolean.class, false), 0, Object.class)));
    ++                NashornGuards.combineGuards(expressionGuard(name, owner), filterGuard(newLink, WITHSCOPEFILTER)));
    +     }
    + 
    +     private static MethodHandle filterGuard(final GuardedInvocation link, final MethodHandle filter) {
    +@@ -267,7 +270,7 @@
    +     }
    + 
    +     private static MethodHandle filter(final MethodHandle mh, final MethodHandle filter) {
    +-        return MH.filterArguments(mh, 0, filter);
    ++        return MH.filterArguments(mh, 0, filter.asType(filter.type().changeReturnType(mh.type().parameterType(0))));
    +     }
    + 
    +     /**
    +@@ -288,9 +291,9 @@
    +         return fn.makeBoundFunction(withFilterExpression(receiver), new Object[0]);
    +     }
    + 
    +-    private MethodHandle expressionGuard(final String name) {
    ++    private MethodHandle expressionGuard(final String name, final ScriptObject owner) {
    +         final PropertyMap map = expression.getMap();
    +-        final SwitchPoint sp = map.getProtoGetSwitchPoint(expression.getProto(), name);
    ++        final SwitchPoint sp = expression.getProtoSwitchPoint(name, owner);
    +         return MH.insertArguments(WITHEXPRESSIONGUARD, 1, map, sp);
    +     }
    + 
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -26,7 +26,8 @@
    + package jdk.nashorn.internal.runtime.arrays;
    + 
    + import java.lang.invoke.MethodHandle;
    +-import jdk.nashorn.internal.runtime.GlobalObject;
    ++import java.nio.ByteBuffer;
    ++import jdk.nashorn.internal.objects.Global;
    + import jdk.nashorn.internal.runtime.JSType;
    + import jdk.nashorn.internal.runtime.PropertyDescriptor;
    + 
    +@@ -144,6 +145,16 @@
    +     }
    + 
    +     /**
    ++     * Allocate an ArrayData wrapping a given nio ByteBuffer
    ++     *
    ++     * @param buf the nio ByteBuffer to wrap
    ++     * @return the ArrayData
    ++     */
    ++    public static ArrayData allocate(final ByteBuffer buf) {
    ++        return new ByteBufferArrayData((ByteBuffer)buf);
    ++    }
    ++
    ++    /**
    +      * Apply a freeze filter to an ArrayData.
    +      *
    +      * @param underlying  the underlying ArrayData to wrap in the freeze filter
    +@@ -388,7 +399,7 @@
    +      *
    +      * @return property descriptor for element
    +      */
    +-    public PropertyDescriptor getDescriptor(final GlobalObject global, final int index) {
    ++    public PropertyDescriptor getDescriptor(final Global global, final int index) {
    +         return global.newDataDescriptor(getObject(index), true, true, true);
    +     }
    + 
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/arrays/ByteBufferArrayData.java	Thu Jan 01 00:00:00 1970 +0000
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/arrays/ByteBufferArrayData.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -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.  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 jdk.nashorn.internal.runtime.arrays;
    ++
    ++import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
    ++
    ++import java.nio.ByteBuffer;
    ++import jdk.nashorn.internal.objects.Global;
    ++import jdk.nashorn.internal.runtime.PropertyDescriptor;
    ++import jdk.nashorn.internal.runtime.ScriptRuntime;
    ++
    ++/**
    ++ * Implementation of {@link ArrayData} that wraps a nio ByteBuffer
    ++ */
    ++final class ByteBufferArrayData extends ArrayData {
    ++    private final ByteBuffer buf;
    ++
    ++    ByteBufferArrayData(final int length) {
    ++        super(length);
    ++        this.buf = ByteBuffer.allocateDirect(length);
    ++    }
    ++
    ++    /**
    ++     * Constructor
    ++     *
    ++     * @param buf ByteBuffer to create array data with.
    ++     */
    ++    ByteBufferArrayData(final ByteBuffer buf) {
    ++        super(buf.capacity());
    ++        this.buf = buf;
    ++    }
    ++
    ++    /**
    ++     * Returns property descriptor for element at a given index
    ++     *
    ++     * @param global the global object
    ++     * @param index  the index
    ++     *
    ++     * @return property descriptor for element
    ++     */
    ++    @Override
    ++    public PropertyDescriptor getDescriptor(final Global global, final int index) {
    ++        // make the index properties not configurable
    ++        return global.newDataDescriptor(getObject(index), false, true, true);
    ++    }
    ++
    ++    @Override
    ++    public ArrayData copy() {
    ++        throw unsupported("copy");
    ++    }
    ++
    ++    @Override
    ++    public Object[] asObjectArray() {
    ++        throw unsupported("asObjectArray");
    ++    }
    ++
    ++    @Override
    ++    public void setLength(final long length) {
    ++        throw new UnsupportedOperationException("setLength");
    ++    }
    ++
    ++    @Override
    ++    public void shiftLeft(int by) {
    ++        throw unsupported("shiftLeft");
    ++    }
    ++
    ++    @Override
    ++    public ArrayData shiftRight(int by) {
    ++        throw unsupported("shiftRight");
    ++    }
    ++
    ++    @Override
    ++    public ArrayData ensure(long safeIndex) {
    ++        if (safeIndex < buf.capacity()) {
    ++            return this;
    ++        }
    ++
    ++        throw unsupported("ensure");
    ++    }
    ++
    ++    @Override
    ++    public ArrayData shrink(long newLength) {
    ++        throw unsupported("shrink");
    ++    }
    ++
    ++    @Override
    ++    public ArrayData set(int index, Object value, boolean strict) {
    ++        if (value instanceof Number) {
    ++            buf.put(index, ((Number)value).byteValue());
    ++            return this;
    ++        }
    ++
    ++        throw typeError("not.a.number", ScriptRuntime.safeToString(value));
    ++    }
    ++
    ++    @Override
    ++    public ArrayData set(int index, int value, boolean strict) {
    ++        buf.put(index, (byte)value);
    ++        return this;
    ++    }
    ++
    ++    @Override
    ++    public ArrayData set(int index, long value, boolean strict) {
    ++        buf.put(index, (byte)value);
    ++        return this;
    ++    }
    ++
    ++    @Override
    ++    public ArrayData set(int index, double value, boolean strict) {
    ++        buf.put(index, (byte)value);
    ++        return this;
    ++    }
    ++
    ++    @Override
    ++    public int getInt(int index) {
    ++        return 0x0ff & buf.get(index);
    ++    }
    ++
    ++    @Override
    ++    public long getLong(int index) {
    ++        return 0x0ff & buf.get(index);
    ++    }
    ++
    ++    @Override
    ++    public double getDouble(int index) {
    ++        return 0x0ff & buf.get(index);
    ++    }
    ++
    ++    @Override
    ++    public Object getObject(int index) {
    ++        return (int)(0x0ff & buf.get(index));
    ++    }
    ++
    ++    @Override
    ++    public boolean has(int index) {
    ++        return index > -1 && index < buf.capacity();
    ++    }
    ++
    ++    @Override
    ++    public boolean canDelete(final int index, final boolean strict) {
    ++        return false;
    ++    }
    ++
    ++    @Override
    ++    public boolean canDelete(final long fromIndex, final long toIndex, final boolean strict) {
    ++        return false;
    ++    }
    ++
    ++    @Override
    ++    public ArrayData delete(int index) {
    ++        throw unsupported("delete");
    ++    }
    ++
    ++    @Override
    ++    public ArrayData delete(long fromIndex, long toIndex) {
    ++        throw unsupported("delete");
    ++    }
    ++
    ++    @Override
    ++    public ArrayData push(final boolean strict, final Object... items) {
    ++        throw unsupported("push");
    ++    }
    ++
    ++    @Override
    ++    public Object pop() {
    ++        throw unsupported("pop");
    ++    }
    ++
    ++    @Override
    ++    public ArrayData slice(long from, long to) {
    ++        throw unsupported("slice");
    ++    }
    ++
    ++    @Override
    ++    public ArrayData convert(final Class type) {
    ++        throw unsupported("convert");
    ++    }
    ++
    ++    private UnsupportedOperationException unsupported(final String method) {
    ++        return new UnsupportedOperationException(method);
    ++    }
    ++}
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/arrays/FrozenArrayFilter.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/arrays/FrozenArrayFilter.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -25,9 +25,9 @@
    + 
    + package jdk.nashorn.internal.runtime.arrays;
    + 
    ++import jdk.nashorn.internal.objects.Global;
    + import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
    + 
    +-import jdk.nashorn.internal.runtime.GlobalObject;
    + import jdk.nashorn.internal.runtime.PropertyDescriptor;
    + 
    + /**
    +@@ -44,7 +44,7 @@
    +     }
    + 
    +     @Override
    +-    public PropertyDescriptor getDescriptor(final GlobalObject global, final int index) {
    ++    public PropertyDescriptor getDescriptor(final Global global, final int index) {
    +         return global.newDataDescriptor(getObject(index), false, true, false);
    +     }
    + 
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/arrays/SealedArrayFilter.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/arrays/SealedArrayFilter.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -25,9 +25,9 @@
    + 
    + package jdk.nashorn.internal.runtime.arrays;
    + 
    ++import jdk.nashorn.internal.objects.Global;
    + import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
    + 
    +-import jdk.nashorn.internal.runtime.GlobalObject;
    + import jdk.nashorn.internal.runtime.PropertyDescriptor;
    + 
    + /**
    +@@ -62,7 +62,7 @@
    +     }
    + 
    +     @Override
    +-    public PropertyDescriptor getDescriptor(final GlobalObject global, final int index) {
    ++    public PropertyDescriptor getDescriptor(final Global global, final int index) {
    +         return global.newDataDescriptor(getObject(index), false, true, true);
    +     }
    + }
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/linker/Bootstrap.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/linker/Bootstrap.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -61,9 +61,17 @@
    +     private static final DynamicLinker dynamicLinker;
    +     static {
    +         final DynamicLinkerFactory factory = new DynamicLinkerFactory();
    +-        factory.setPrioritizedLinkers(new NashornLinker(), new NashornPrimitiveLinker(), new NashornStaticClassLinker(),
    +-                new BoundDynamicMethodLinker(), new JavaSuperAdapterLinker(), new JSObjectLinker(), new ReflectionCheckLinker());
    +-        factory.setFallbackLinkers(new NashornBeansLinker(), new NashornBottomLinker());
    ++        final NashornBeansLinker nashornBeansLinker = new NashornBeansLinker();
    ++        final JSObjectLinker jsObjectLinker = new JSObjectLinker(nashornBeansLinker);
    ++        factory.setPrioritizedLinkers(
    ++            new NashornLinker(),
    ++            new NashornPrimitiveLinker(),
    ++            new NashornStaticClassLinker(),
    ++            new BoundDynamicMethodLinker(),
    ++            new JavaSuperAdapterLinker(),
    ++            jsObjectLinker,
    ++            new ReflectionCheckLinker());
    ++        factory.setFallbackLinkers(nashornBeansLinker, new NashornBottomLinker());
    +         factory.setSyncOnRelink(true);
    +         final int relinkThreshold = Options.getIntProperty("nashorn.unstable.relink.threshold", -1);
    +         if (relinkThreshold > -1) {
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/linker/JSObjectLinker.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -30,6 +30,7 @@
    + import java.lang.invoke.MethodType;
    + import java.util.HashMap;
    + import java.util.Map;
    ++import javax.script.Bindings;
    + import jdk.internal.dynalink.CallSiteDescriptor;
    + import jdk.internal.dynalink.linker.GuardedInvocation;
    + import jdk.internal.dynalink.linker.GuardedTypeConversion;
    +@@ -48,14 +49,23 @@
    +  * as ScriptObjects from other Nashorn contexts.
    +  */
    + final class JSObjectLinker implements TypeBasedGuardingDynamicLinker, GuardingTypeConverterFactory {
    ++    private final NashornBeansLinker nashornBeansLinker;
    ++
    ++    JSObjectLinker(final NashornBeansLinker nashornBeansLinker) {
    ++        this.nashornBeansLinker = nashornBeansLinker;
    ++    }
    ++
    +     @Override
    +     public boolean canLinkType(final Class type) {
    +         return canLinkTypeStatic(type);
    +     }
    + 
    +     static boolean canLinkTypeStatic(final Class type) {
    +-        // can link JSObject
    +-        return JSObject.class.isAssignableFrom(type);
    ++        // can link JSObject also handles Map, Bindings to make
    ++        // sure those are not JSObjects.
    ++        return Map.class.isAssignableFrom(type) ||
    ++               Bindings.class.isAssignableFrom(type) ||
    ++               JSObject.class.isAssignableFrom(type);
    +     }
    + 
    +     @Override
    +@@ -72,6 +82,11 @@
    +         final GuardedInvocation inv;
    +         if (self instanceof JSObject) {
    +             inv = lookup(desc);
    ++        } else if (self instanceof Map || self instanceof Bindings) {
    ++            // guard to make sure the Map or Bindings does not turn into JSObject later!
    ++            final GuardedInvocation beanInv = nashornBeansLinker.getGuardedInvocation(request, linkerServices);
    ++            inv = new GuardedInvocation(beanInv.getInvocation(),
    ++                NashornGuards.combineGuards(beanInv.getGuard(), NashornGuards.getNotJSObjectGuard()));
    +         } else {
    +             throw new AssertionError(); // Should never reach here.
    +         }
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -131,7 +131,7 @@
    +  * implemented securely.
    +  */
    + final class JavaAdapterBytecodeGenerator {
    +-    static final Type OBJECT_TYPE        = Type.getType(Object.class);
    ++    static final Type OBJECT_TYPE = Type.getType(Object.class);
    + 
    +     static final String OBJECT_TYPE_NAME  = OBJECT_TYPE.getInternalName();
    + 
    +@@ -139,6 +139,7 @@
    + 
    +     static final String GLOBAL_FIELD_NAME = "global";
    + 
    ++    // "global" is declared as Object instead of Global - avoid static references to internal Nashorn classes when possible.
    +     static final String GLOBAL_TYPE_DESCRIPTOR = OBJECT_TYPE.getDescriptor();
    + 
    +     static final String SET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.VOID_TYPE, OBJECT_TYPE);
    +@@ -318,7 +319,7 @@
    +         final InstructionAdapter mv = new InstructionAdapter(cw.visitMethod(ACC_STATIC, CLASS_INIT,
    +                 Type.getMethodDescriptor(Type.VOID_TYPE), null, null));
    + 
    +-        mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getClassOverrides", GET_CLASS_INITIALIZER_DESCRIPTOR);
    ++        mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getClassOverrides", GET_CLASS_INITIALIZER_DESCRIPTOR, false);
    +         final Label initGlobal;
    +         if(samName != null) {
    +             // If the class is a SAM, allow having a ScriptFunction passed as class overrides
    +@@ -334,7 +335,7 @@
    +                 if(mi.getName().equals(samName)) {
    +                     mv.dup();
    +                     mv.aconst(Type.getMethodType(mi.type.toMethodDescriptorString()));
    +-                    mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getHandle", GET_HANDLE_FUNCTION_DESCRIPTOR);
    ++                    mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getHandle", GET_HANDLE_FUNCTION_DESCRIPTOR, false);
    +                 } else {
    +                     mv.visitInsn(ACONST_NULL);
    +                 }
    +@@ -351,7 +352,7 @@
    +             mv.dup();
    +             mv.aconst(mi.getName());
    +             mv.aconst(Type.getMethodType(mi.type.toMethodDescriptorString()));
    +-            mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getHandle", GET_HANDLE_OBJECT_DESCRIPTOR);
    ++            mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getHandle", GET_HANDLE_OBJECT_DESCRIPTOR, false);
    +             mv.putstatic(generatedClassName, mi.methodHandleFieldName, METHOD_HANDLE_TYPE_DESCRIPTOR);
    +         }
    + 
    +@@ -368,7 +369,7 @@
    +     private static void invokeGetGlobalWithNullCheck(final InstructionAdapter mv) {
    +         invokeGetGlobal(mv);
    +         mv.dup();
    +-        mv.invokevirtual(OBJECT_TYPE_NAME, "getClass", GET_CLASS_METHOD_DESCRIPTOR); // check against null Context
    ++        mv.invokevirtual(OBJECT_TYPE_NAME, "getClass", GET_CLASS_METHOD_DESCRIPTOR, false); // check against null Context
    +         mv.pop();
    +     }
    + 
    +@@ -425,7 +426,7 @@
    +             mv.load(offset, argType);
    +             offset += argType.getSize();
    +         }
    +-        mv.invokespecial(superClassName, INIT, originalCtorType.getDescriptor());
    ++        mv.invokespecial(superClassName, INIT, originalCtorType.getDescriptor(), false);
    + 
    +         endInitMethod(mv);
    +     }
    +@@ -478,7 +479,7 @@
    +             mv.load(offset, argType);
    +             offset += argType.getSize();
    +         }
    +-        mv.invokespecial(superClassName, INIT, originalCtorType.getDescriptor());
    ++        mv.invokespecial(superClassName, INIT, originalCtorType.getDescriptor(), false);
    + 
    +         // Get a descriptor to the appropriate "JavaAdapterFactory.getHandle" method.
    +         final String getHandleDescriptor = fromFunction ? GET_HANDLE_FUNCTION_DESCRIPTOR : GET_HANDLE_OBJECT_DESCRIPTOR;
    +@@ -497,7 +498,7 @@
    +                     mv.aconst(mi.getName());
    +                 }
    +                 mv.aconst(Type.getMethodType(mi.type.toMethodDescriptorString()));
    +-                mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getHandle", getHandleDescriptor);
    ++                mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getHandle", getHandleDescriptor, false);
    +             }
    +             mv.putfield(generatedClassName, mi.methodHandleFieldName, METHOD_HANDLE_TYPE_DESCRIPTOR);
    +         }
    +@@ -521,11 +522,11 @@
    +     }
    + 
    +     private static void invokeGetGlobal(final InstructionAdapter mv) {
    +-        mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getGlobal", GET_GLOBAL_METHOD_DESCRIPTOR);
    ++        mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getGlobal", GET_GLOBAL_METHOD_DESCRIPTOR, false);
    +     }
    + 
    +     private static void invokeSetGlobal(final InstructionAdapter mv) {
    +-        mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "setGlobal", SET_GLOBAL_METHOD_DESCRIPTOR);
    ++        mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "setGlobal", SET_GLOBAL_METHOD_DESCRIPTOR, false);
    +     }
    + 
    +     /**
    +@@ -638,11 +639,11 @@
    +             // If the super method is abstract, throw an exception
    +             mv.anew(UNSUPPORTED_OPERATION_TYPE);
    +             mv.dup();
    +-            mv.invokespecial(UNSUPPORTED_OPERATION_TYPE_NAME, INIT, VOID_NOARG_METHOD_DESCRIPTOR);
    ++            mv.invokespecial(UNSUPPORTED_OPERATION_TYPE_NAME, INIT, VOID_NOARG_METHOD_DESCRIPTOR, false);
    +             mv.athrow();
    +         } else {
    +             // If the super method is not abstract, delegate to it.
    +-            emitSuperCall(mv, name, methodDesc);
    ++            emitSuperCall(mv, method.getDeclaringClass(), name, methodDesc);
    +         }
    + 
    +         mv.visitLabel(handleDefined);
    +@@ -671,7 +672,7 @@
    +         // stack: [creatingGlobal, creatingGlobal, handle]
    + 
    +         // Emit code for switching to the creating global
    +-        // ScriptObject currentGlobal = Context.getGlobal();
    ++        // Global currentGlobal = Context.getGlobal();
    +         invokeGetGlobal(mv);
    +         mv.dup();
    + 
    +@@ -712,7 +713,7 @@
    +         // Invoke the target method handle
    +         final Label tryBlockStart = new Label();
    +         mv.visitLabel(tryBlockStart);
    +-        mv.invokevirtual(METHOD_HANDLE_TYPE.getInternalName(), "invokeExact", type.toMethodDescriptorString());
    ++        mv.invokevirtual(METHOD_HANDLE_TYPE.getInternalName(), "invokeExact", type.toMethodDescriptorString(), false);
    +         final Label tryBlockEnd = new Label();
    +         mv.visitLabel(tryBlockEnd);
    +         emitFinally(mv, currentGlobalVar, globalsDifferVar);
    +@@ -728,7 +729,7 @@
    +             mv.anew(RUNTIME_EXCEPTION_TYPE);
    +             mv.dupX1();
    +             mv.swap();
    +-            mv.invokespecial(RUNTIME_EXCEPTION_TYPE_NAME, INIT, Type.getMethodDescriptor(Type.VOID_TYPE, THROWABLE_TYPE));
    ++            mv.invokespecial(RUNTIME_EXCEPTION_TYPE_NAME, INIT, Type.getMethodDescriptor(Type.VOID_TYPE, THROWABLE_TYPE), false);
    +             // Fall through to rethrow handler
    +         } else {
    +             throwableHandler = null;
    +@@ -814,12 +815,12 @@
    +                 SUPER_PREFIX + name, methodDesc, null, getExceptionNames(method.getExceptionTypes())));
    +         mv.visitCode();
    + 
    +-        emitSuperCall(mv, name, methodDesc);
    ++        emitSuperCall(mv, method.getDeclaringClass(), name, methodDesc);
    + 
    +         endMethod(mv);
    +     }
    + 
    +-    private void emitSuperCall(final InstructionAdapter mv, final String name, final String methodDesc) {
    ++    private void emitSuperCall(final InstructionAdapter mv, final Class owner, final String name, final String methodDesc) {
    +         mv.visitVarInsn(ALOAD, 0);
    +         int nextParam = 1;
    +         final Type methodType = Type.getMethodType(methodDesc);
    +@@ -827,7 +828,13 @@
    +             mv.load(nextParam, t);
    +             nextParam += t.getSize();
    +         }
    +-        mv.invokespecial(superClassName, name, methodDesc);
    ++
    ++        // default method - non-abstract, interface method
    ++        if (Modifier.isInterface(owner.getModifiers())) {
    ++            mv.invokespecial(Type.getInternalName(owner), name, methodDesc, false);
    ++        } else {
    ++            mv.invokespecial(superClassName, name, methodDesc, false);
    ++        }
    +         mv.areturn(methodType.getReturnType());
    +     }
    + 
    +--- ./nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java	Tue Jun 03 14:19:46 2014 -0700
    ++++ ./nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java	Wed Jul 30 03:55:26 2014 -0700
    +@@ -48,7 +48,6 @@
    + import java.util.concurrent.ConcurrentHashMap;
    + import jdk.internal.dynalink.beans.StaticClass;
    + import jdk.internal.dynalink.support.LinkRequestImpl;
    +-import jdk.nashorn.internal.objects.NativeJava;
    + import jdk.nashorn.internal.runtime.Context;
    + import jdk.nashorn.internal.runtime.ECMAException;
    + import jdk.nashorn.internal.runtime.ScriptFunction;
    +@@ -68,8 +67,8 @@
    +  * generate the adapter class itself; see its documentation for details about the generated class.
    +  * 

    + * You normally don't use this class directly, but rather either create adapters from script using +- * {@link NativeJava#extend(Object, Object...)}, using the {@code new} operator on abstract classes and interfaces (see +- * {@link NativeJava#type(Object, Object)}), or implicitly when passing script functions to Java methods expecting SAM ++ * {@link jdk.nashorn.internal.objects.NativeJava#extend(Object, Object...)}, using the {@code new} operator on abstract classes and interfaces (see ++ * {@link jdk.nashorn.internal.objects.NativeJava#type(Object, Object)}), or implicitly when passing script functions to Java methods expecting SAM + * types. + *

    + */ +@@ -337,6 +336,7 @@ + private static ProtectionDomain createMinimalPermissionDomain() { + // Generated classes need to have at least the permission to access Nashorn runtime and runtime.linker packages. + final Permissions permissions = new Permissions(); ++ permissions.add(new RuntimePermission("accessClassInPackage.jdk.nashorn.internal.objects")); + permissions.add(new RuntimePermission("accessClassInPackage.jdk.nashorn.internal.runtime")); + permissions.add(new RuntimePermission("accessClassInPackage.jdk.nashorn.internal.runtime.linker")); + return new ProtectionDomain(new CodeSource(null, (CodeSigner[])null), permissions); +--- ./nashorn/src/jdk/nashorn/internal/runtime/linker/NashornGuards.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/linker/NashornGuards.java Wed Jul 30 03:55:26 2014 -0700 +@@ -29,6 +29,12 @@ + + import java.lang.invoke.MethodHandle; + import java.lang.invoke.MethodHandles; ++import java.lang.ref.WeakReference; ++import jdk.internal.dynalink.CallSiteDescriptor; ++import jdk.nashorn.api.scripting.JSObject; ++import jdk.nashorn.internal.codegen.ObjectClassGenerator; ++import jdk.nashorn.internal.objects.Global; ++import jdk.nashorn.internal.runtime.Property; + import jdk.nashorn.internal.runtime.PropertyMap; + import jdk.nashorn.internal.runtime.ScriptFunction; + import jdk.nashorn.internal.runtime.ScriptObject; +@@ -37,10 +43,12 @@ + * Constructor of method handles used to guard call sites. + */ + public final class NashornGuards { +- private static final MethodHandle IS_SCRIPTOBJECT = findOwnMH("isScriptObject", boolean.class, Object.class); +- private static final MethodHandle IS_SCRIPTFUNCTION = findOwnMH("isScriptFunction", boolean.class, Object.class); +- private static final MethodHandle IS_MAP = findOwnMH("isMap", boolean.class, Object.class, PropertyMap.class); +- private static final MethodHandle IS_INSTANCEOF_2 = findOwnMH("isInstanceOf2", boolean.class, Object.class, Class.class, Class.class); ++ private static final MethodHandle IS_SCRIPTOBJECT = findOwnMH("isScriptObject", boolean.class, Object.class); ++ private static final MethodHandle IS_NOT_JSOBJECT = findOwnMH("isNotJSObject", boolean.class, Object.class); ++ private static final MethodHandle IS_SCRIPTFUNCTION = findOwnMH("isScriptFunction", boolean.class, Object.class); ++ private static final MethodHandle IS_MAP = findOwnMH("isMap", boolean.class, Object.class, PropertyMap.class); ++ private static final MethodHandle SAME_OBJECT = findOwnMH("sameObject", boolean.class, Object.class, WeakReference.class); ++ private static final MethodHandle IS_INSTANCEOF_2 = findOwnMH("isInstanceOf2", boolean.class, Object.class, Class.class, Class.class); + + // don't create me! + private NashornGuards() { +@@ -55,6 +63,14 @@ + } + + /** ++ * Get the guard that checks if an item is not a {@code JSObject} ++ * @return method handle for guard ++ */ ++ public static MethodHandle getNotJSObjectGuard() { ++ return IS_NOT_JSOBJECT; ++ } ++ ++ /** + * Get the guard that checks if an item is a {@code ScriptFunction} + * @return method handle for guard + */ +@@ -75,6 +91,55 @@ + } + + /** ++ * Determine whether the given callsite needs a guard. ++ * @param property the property, or null ++ * @param desc the callsite descriptor ++ * @return true if a guard should be used for this callsite ++ */ ++ static boolean needsGuard(final Property property, final CallSiteDescriptor desc) { ++ return property == null || property.isConfigurable() ++ || property.isBound() || !ObjectClassGenerator.OBJECT_FIELDS_ONLY ++ || !NashornCallSiteDescriptor.isFastScope(desc) || property.canChangeType(); ++ } ++ ++ /** ++ * Get the guard for a property access. This returns an identity guard for non-configurable global properties ++ * and a map guard for everything else. ++ * ++ * @param sobj the first object in the prototype chain ++ * @param property the property ++ * @param desc the callsite descriptor ++ * @return method handle for guard ++ */ ++ public static MethodHandle getGuard(final ScriptObject sobj, final Property property, final CallSiteDescriptor desc) { ++ if (!needsGuard(property, desc)) { ++ return null; ++ } ++ if (NashornCallSiteDescriptor.isScope(desc)) { ++ if (property != null && property.isBound()) { ++ // This is a declared top level variables in main script or eval, use identity guard. ++ return getIdentityGuard(sobj); ++ } ++ if (!(sobj instanceof Global) && (property == null || property.isConfigurable())) { ++ // Undeclared variables in nested evals need stronger guards ++ return combineGuards(getIdentityGuard(sobj), getMapGuard(sobj.getMap())); ++ } ++ } ++ return getMapGuard(sobj.getMap()); ++ } ++ ++ ++ /** ++ * Get a guard that checks referential identity of the current object. ++ * ++ * @param sobj the self object ++ * @return true if same self object instance ++ */ ++ public static MethodHandle getIdentityGuard(final ScriptObject sobj) { ++ return MH.insertArguments(SAME_OBJECT, 1, new WeakReference<>(sobj)); ++ } ++ ++ /** + * Get a guard that checks if in item is an instance of either of two classes. + * + * @param class1 the first class +@@ -85,12 +150,28 @@ + return MH.insertArguments(IS_INSTANCEOF_2, 1, class1, class2); + } + ++ /** ++ * Combine two method handles of type {@code (Object)boolean} using logical AND. ++ * ++ * @param guard1 the first guard ++ * @param guard2 the second guard, only invoked if guard1 returns true ++ * @return true if both guard1 and guard2 returned true ++ */ ++ public static MethodHandle combineGuards(final MethodHandle guard1, final MethodHandle guard2) { ++ return MH.guardWithTest(guard1, guard2, MH.dropArguments(MH.constant(boolean.class, false), 0, Object.class)); ++ } ++ + @SuppressWarnings("unused") + private static boolean isScriptObject(final Object self) { + return self instanceof ScriptObject; + } + + @SuppressWarnings("unused") ++ private static boolean isNotJSObject(final Object self) { ++ return !(self instanceof JSObject); ++ } ++ ++ @SuppressWarnings("unused") + private static boolean isScriptFunction(final Object self) { + return self instanceof ScriptFunction; + } +@@ -101,6 +182,11 @@ + } + + @SuppressWarnings("unused") ++ private static boolean sameObject(final Object self, final WeakReference ref) { ++ return self == ref.get(); ++ } ++ ++ @SuppressWarnings("unused") + private static boolean isInstanceOf2(final Object self, final Class class1, final Class class2) { + return class1.isInstance(self) || class2.isInstance(self); + } +--- ./nashorn/src/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java Wed Jul 30 03:55:26 2014 -0700 +@@ -37,9 +37,9 @@ + import jdk.internal.dynalink.linker.LinkerServices; + import jdk.internal.dynalink.linker.TypeBasedGuardingDynamicLinker; + import jdk.internal.dynalink.support.TypeUtilities; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.runtime.ConsString; + import jdk.nashorn.internal.runtime.Context; +-import jdk.nashorn.internal.runtime.GlobalObject; + + /** + * Internal linker for String, Boolean, and Number objects, only ever used by Nashorn engine and not exposed to other +@@ -62,7 +62,7 @@ + final LinkRequest request = origRequest.withoutRuntimeContext(); // Nashorn has no runtime context + + final Object self = request.getReceiver(); +- final GlobalObject global = (GlobalObject) Context.getGlobal(); ++ final Global global = Context.getGlobal(); + final NashornCallSiteDescriptor desc = (NashornCallSiteDescriptor) request.getCallSiteDescriptor(); + + return Bootstrap.asType(global.primitiveLookup(request, self), linkerServices, desc); +--- ./nashorn/src/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/linker/NashornStaticClassLinker.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,6 +25,7 @@ + + package jdk.nashorn.internal.runtime.linker; + ++import java.lang.reflect.Modifier; + import jdk.internal.dynalink.CallSiteDescriptor; + import jdk.internal.dynalink.beans.BeansLinker; + import jdk.internal.dynalink.beans.StaticClass; +@@ -65,10 +66,15 @@ + return null; + } + final Class receiverClass = ((StaticClass) self).getRepresentedClass(); ++ + Bootstrap.checkReflectionAccess(receiverClass, true); + final CallSiteDescriptor desc = request.getCallSiteDescriptor(); + // We intercept "new" on StaticClass instances to provide additional capabilities + if ("new".equals(desc.getNameToken(CallSiteDescriptor.OPERATOR))) { ++ if (! Modifier.isPublic(receiverClass.getModifiers())) { ++ throw ECMAErrors.typeError("new.on.nonpublic.javatype", receiverClass.getName()); ++ } ++ + // make sure new is on accessible Class + Context.checkPackageAccess(receiverClass); + +--- ./nashorn/src/jdk/nashorn/internal/runtime/linker/PrimitiveLookup.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/linker/PrimitiveLookup.java Wed Jul 30 03:55:26 2014 -0700 +@@ -35,6 +35,7 @@ + import jdk.internal.dynalink.support.CallSiteDescriptorFactory; + import jdk.internal.dynalink.support.Guards; + import jdk.nashorn.internal.lookup.Lookup; ++import jdk.nashorn.internal.runtime.FindProperty; + import jdk.nashorn.internal.runtime.ScriptObject; + + /** +@@ -61,8 +62,9 @@ + * type {@code receiverClass}. + */ + public static GuardedInvocation lookupPrimitive(final LinkRequest request, final Class receiverClass, +- final ScriptObject wrappedReceiver, final MethodHandle wrapFilter) { +- return lookupPrimitive(request, Guards.getInstanceOfGuard(receiverClass), wrappedReceiver, wrapFilter); ++ final ScriptObject wrappedReceiver, final MethodHandle wrapFilter, ++ final MethodHandle protoFilter) { ++ return lookupPrimitive(request, Guards.getInstanceOfGuard(receiverClass), wrappedReceiver, wrapFilter, protoFilter); + } + + /** +@@ -79,7 +81,8 @@ + * type (that is implied by both {@code guard} and {@code wrappedReceiver}). + */ + public static GuardedInvocation lookupPrimitive(final LinkRequest request, final MethodHandle guard, +- final ScriptObject wrappedReceiver, final MethodHandle wrapFilter) { ++ final ScriptObject wrappedReceiver, final MethodHandle wrapFilter, ++ final MethodHandle protoFilter) { + final CallSiteDescriptor desc = request.getCallSiteDescriptor(); + final String operator = CallSiteDescriptorFactory.tokenizeOperators(desc).get(0); + if ("setProp".equals(operator) || "setElem".equals(operator)) { +@@ -93,9 +96,23 @@ + + if(desc.getNameTokenCount() > 2) { + final String name = desc.getNameToken(CallSiteDescriptor.NAME_OPERAND); +- if(wrappedReceiver.findProperty(name, true) == null) { ++ final FindProperty find = wrappedReceiver.findProperty(name, true); ++ if(find == null) { + // Give up early, give chance to BeanLinker and NashornBottomLinker to deal with it. + return null; ++ } else if (find.isInherited() && !find.getProperty().hasGetterFunction(find.getOwner())) { ++ // If property is found in the prototype object bind the method handle directly to ++ // the proto filter instead of going through wrapper instantiation below. ++ final ScriptObject proto = wrappedReceiver.getProto(); ++ final GuardedInvocation link = proto.lookup(desc, request); ++ ++ if (link != null) { ++ final MethodHandle invocation = link.getInvocation(); ++ final MethodHandle adaptedInvocation = MH.asType(invocation, invocation.type().changeParameterType(0, Object.class)); ++ final MethodHandle method = MH.filterArguments(adaptedInvocation, 0, protoFilter); ++ final MethodHandle protoGuard = MH.filterArguments(link.getGuard(), 0, protoFilter); ++ return new GuardedInvocation(method, NashornGuards.combineGuards(guard, protoGuard)); ++ } + } + } + final GuardedInvocation link = wrappedReceiver.lookup(desc, request); +--- ./nashorn/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java Wed Jul 30 03:55:26 2014 -0700 +@@ -115,7 +115,8 @@ + if ((self instanceof Class) && Modifier.isPublic(((Class)self).getModifiers())) { + final CallSiteDescriptor desc = requestWithoutContext.getCallSiteDescriptor(); + if(CallSiteDescriptorFactory.tokenizeOperators(desc).contains("getProp")) { +- if ("static".equals(desc.getNameToken(CallSiteDescriptor.NAME_OPERAND))) { ++ if (desc.getNameTokenCount() > CallSiteDescriptor.NAME_OPERAND && ++ "static".equals(desc.getNameToken(CallSiteDescriptor.NAME_OPERAND))) { + if (Context.isAccessibleClass((Class)self) && !isReflectionClass((Class)self)) { + + // If "getProp:static" passes access checks, allow access. +--- ./nashorn/src/jdk/nashorn/internal/runtime/regexp/JdkRegExp.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/regexp/JdkRegExp.java Wed Jul 30 03:55:26 2014 -0700 +@@ -46,9 +46,6 @@ + /** Java regexp pattern to use for match. We compile to one of these */ + private Pattern pattern; + +- /** The matcher */ +- private RegExpMatcher matcher; +- + /** + * Construct a Regular expression from the given {@code source} and {@code flags} strings. + * +@@ -95,14 +92,7 @@ + return null; // never matches or similar, e.g. a[] + } + +- RegExpMatcher currentMatcher = this.matcher; +- +- if (currentMatcher == null || matcher.getInput() != str) { +- currentMatcher = new DefaultMatcher(str); +- this.matcher = currentMatcher; +- } +- +- return currentMatcher; ++ return new DefaultMatcher(str); + } + + class DefaultMatcher implements RegExpMatcher { +--- ./nashorn/src/jdk/nashorn/internal/runtime/regexp/JoniRegExp.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/regexp/JoniRegExp.java Wed Jul 30 03:55:26 2014 -0700 +@@ -44,9 +44,6 @@ + /** Compiled Joni Regex */ + private Regex regex; + +- /** Matcher */ +- private RegExpMatcher matcher; +- + /** + * Construct a Regular expression from the given {@code pattern} and {@code flags} strings. + * +@@ -95,14 +92,7 @@ + return null; + } + +- RegExpMatcher currentMatcher = this.matcher; +- +- if (currentMatcher == null || input != currentMatcher.getInput()) { +- currentMatcher = new JoniMatcher(input); +- this.matcher = currentMatcher; +- } +- +- return currentMatcher; ++ return new JoniMatcher(input); + } + + /** +--- ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/Analyser.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/Analyser.java Wed Jul 30 03:55:26 2014 -0700 +@@ -771,7 +771,7 @@ + + while (value < end) { + int ovalue = value; +- buf = Character.toLowerCase(chars[value++]); ++ buf = EncodingHelper.toLowerCase(chars[value++]); + + if (chars[ovalue] != buf) { + +@@ -779,7 +779,7 @@ + System.arraycopy(chars, sn.p, sbuf, 0, ovalue - sn.p); + value = ovalue; + while (value < end) { +- buf = Character.toLowerCase(chars[value++]); ++ buf = EncodingHelper.toLowerCase(chars[value++]); + if (sp >= sbuf.length) { + char[]tmp = new char[sbuf.length << 1]; + System.arraycopy(sbuf, 0, tmp, 0, sbuf.length); +--- ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/ApplyCaseFold.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/ApplyCaseFold.java Wed Jul 30 03:55:26 2014 -0700 +@@ -20,70 +20,42 @@ + package jdk.nashorn.internal.runtime.regexp.joni; + + import jdk.nashorn.internal.runtime.regexp.joni.ast.CClassNode; +-import jdk.nashorn.internal.runtime.regexp.joni.ast.ConsAltNode; +-import jdk.nashorn.internal.runtime.regexp.joni.ast.StringNode; + + final class ApplyCaseFold { + + // i_apply_case_fold +- public void apply(int from, int[]to, int length, Object o) { ++ public void apply(int from, int to, Object o) { + ApplyCaseFoldArg arg = (ApplyCaseFoldArg)o; + + ScanEnvironment env = arg.env; + CClassNode cc = arg.cc; + BitSet bs = cc.bs; + +- if (length == 1) { +- boolean inCC = cc.isCodeInCC(from); ++ boolean inCC = cc.isCodeInCC(from); + +- if (Config.CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS) { +- if ((inCC && !cc.isNot()) || (!inCC && cc.isNot())) { +- if (to[0] >= BitSet.SINGLE_BYTE_SIZE) { +- cc.addCodeRange(env, to[0], to[0]); ++ if (Config.CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS) { ++ if ((inCC && !cc.isNot()) || (!inCC && cc.isNot())) { ++ if (to >= BitSet.SINGLE_BYTE_SIZE) { ++ cc.addCodeRange(env, to, to); ++ } else { ++ /* /(?i:[^A-C])/.match("a") ==> fail. */ ++ bs.set(to); ++ } ++ } ++ } else { ++ if (inCC) { ++ if (to >= BitSet.SINGLE_BYTE_SIZE) { ++ if (cc.isNot()) cc.clearNotFlag(); ++ cc.addCodeRange(env, to, to); ++ } else { ++ if (cc.isNot()) { ++ bs.clear(to); + } else { +- /* /(?i:[^A-C])/.match("a") ==> fail. */ +- bs.set(to[0]); ++ bs.set(to); + } + } +- } else { +- if (inCC) { +- if (to[0] >= BitSet.SINGLE_BYTE_SIZE) { +- if (cc.isNot()) cc.clearNotFlag(); +- cc.addCodeRange(env, to[0], to[0]); +- } else { +- if (cc.isNot()) { +- bs.clear(to[0]); +- } else { +- bs.set(to[0]); +- } +- } +- } +- } // CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS +- +- } else { +- if (cc.isCodeInCC(from) && (!Config.CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS || !cc.isNot())) { +- StringNode node = null; +- for (int i=0; i= range || code[ip] != Character.toLowerCase(chars[s++])) {opFail(); return;} ++ if (s >= range || code[ip] != EncodingHelper.toLowerCase(chars[s++])) {opFail(); return;} + ip++; + sprev = sbegin; // break; + } +@@ -380,10 +380,10 @@ + char[] bs = regex.templates[code[ip++]]; + int ps = code[ip++]; + +- while (tlen-- > 0) if (bs[ps++] != Character.toLowerCase(chars[s++])) {opFail(); return;} ++ while (tlen-- > 0) if (bs[ps++] != EncodingHelper.toLowerCase(chars[s++])) {opFail(); return;} + } else { + +- while (tlen-- > 0) if (code[ip++] != Character.toLowerCase(chars[s++])) {opFail(); return;} ++ while (tlen-- > 0) if (code[ip++] != EncodingHelper.toLowerCase(chars[s++])) {opFail(); return;} + } + sprev = s - 1; + } +--- ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/EncodingHelper.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/EncodingHelper.java Wed Jul 30 03:55:26 2014 -0700 +@@ -93,41 +93,78 @@ + return s; + } + +- public static int mbcToCode(byte[] bytes, int p, int end) { +- int code = 0; +- for (int i = p; i < end; i++) { +- code = (code << 8) | (bytes[i] & 0xff); +- } +- return code; +- } +- + public static int mbcodeStartPosition() { + return 0x80; + } + + public static char[] caseFoldCodesByString(int flag, char c) { +- if (Character.isUpperCase(c)) { +- return new char[] {Character.toLowerCase(c)}; +- } else if (Character.isLowerCase(c)) { +- return new char[] {Character.toUpperCase(c)}; +- } else { +- return EMPTYCHARS; ++ char[] codes = EMPTYCHARS; ++ final char upper = toUpperCase(c); ++ ++ if (upper != toLowerCase(upper)) { ++ int count = 0; ++ char ch = 0; ++ ++ do { ++ final char u = toUpperCase(ch); ++ if (u == upper && ch != c) { ++ // Almost all characters will return array of length 1, very few 2 or 3, so growing by one is fine. ++ codes = count == 0 ? new char[1] : Arrays.copyOf(codes, count + 1); ++ codes[count++] = ch; ++ } ++ } while (ch++ < 0xffff); ++ } ++ return codes; ++ } ++ ++ public static void applyAllCaseFold(int flag, ApplyCaseFold fun, Object arg) { ++ for (int c = 0; c < 0xffff; c++) { ++ if (Character.isLowerCase(c)) { ++ final int upper = toUpperCase(c); ++ ++ if (upper != c) { ++ fun.apply(c, upper, arg); ++ } ++ } ++ } ++ ++ // Some characters have multiple lower case variants, hence we need to do a second run ++ for (int c = 0; c < 0xffff; c++) { ++ if (Character.isLowerCase(c)) { ++ final int upper = toUpperCase(c); ++ ++ if (upper != c) { ++ fun.apply(upper, c, arg); ++ } ++ } + } + } + +- public static void applyAllCaseFold(int flag, ApplyCaseFold fun, Object arg) { +- int[] code = new int[1]; ++ public static char toLowerCase(char c) { ++ return (char)toLowerCase((int)c); ++ } + +- for (int c = 0; c < 0xffff; c++) { +- if (Character.getType(c) == Character.LOWERCASE_LETTER) { ++ public static int toLowerCase(int c) { ++ if (c < 128) { ++ return ('A' <= c && c <= 'Z') ? (c + ('a' - 'A')) : c; ++ } ++ // Do not convert non-ASCII upper case character to ASCII lower case. ++ int lower = Character.toLowerCase(c); ++ return (lower < 128) ? c : lower; + +- int upper = code[0] = Character.toUpperCase(c); +- fun.apply(c, code, 1, arg); ++ } + +- code[0] = c; +- fun.apply(upper, code, 1, arg); +- } ++ public static char toUpperCase(char c) { ++ return (char)toUpperCase((int)c); ++ } ++ ++ public static int toUpperCase(int c) { ++ if (c < 128) { ++ return ('a' <= c && c <= 'z') ? c + ('A' - 'a') : c; + } ++ // Do not convert non-ASCII lower case character to ASCII upper case. ++ int upper = Character.toUpperCase(c); ++ return (upper < 128) ? c : upper; + } + + public static int[] ctypeCodeRange(int ctype, IntHolder sbOut) { +--- ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/Regex.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/Regex.java Wed Jul 30 03:55:26 2014 -0700 +@@ -131,12 +131,13 @@ + this.warnings = null; + } + +- public void compile() { ++ public synchronized MatcherFactory compile() { + if (factory == null && analyser != null) { +- Compiler compiler = new ArrayCompiler(analyser); ++ new ArrayCompiler(analyser).compile(); + analyser = null; // only do this once +- compiler.compile(); + } ++ assert factory != null; ++ return factory; + } + + public Matcher matcher(char[] chars) { +@@ -144,8 +145,11 @@ + } + + public Matcher matcher(char[] chars, int p, int end) { +- compile(); +- return factory.create(this, chars, p, end); ++ MatcherFactory matcherFactory = factory; ++ if (matcherFactory == null) { ++ matcherFactory = compile(); ++ } ++ return matcherFactory.create(this, chars, p, end); + } + + public WarnCallback getWarnings() { +--- ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/SearchAlgorithm.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/regexp/joni/SearchAlgorithm.java Wed Jul 30 03:55:26 2014 -0700 +@@ -168,7 +168,7 @@ + char[] chars, int p, int end) { + + while (tP < tEnd) { +- if (t[tP++] != Character.toLowerCase(chars[p++])) return false; ++ if (t[tP++] != EncodingHelper.toLowerCase(chars[p++])) return false; + } + return true; + } +--- ./nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties Wed Jul 30 03:55:26 2014 -0700 +@@ -78,6 +78,8 @@ + type.error.not.a.function={0} is not a function + type.error.not.a.constructor={0} is not a constructor function + type.error.not.a.file={0} is not a File ++type.error.not.a.bytebuffer={0} is not a java.nio.ByteBuffer ++type.error.not.an.arraybuffer.in.dataview=First arg to DataView constructor must be an ArrayBuffer + + # operations not permitted on undefined + type.error.cant.call.undefined=Cannot call undefined +@@ -136,6 +138,10 @@ + type.error.method.not.constructor=Java method {0} can't be used as a constructor. + type.error.env.not.object=$ENV must be an Object. + type.error.unsupported.java.to.type=Unsupported Java.to target type {0}. ++type.error.new.on.nonpublic.javatype=new cannot be used with non-public java type {0}. ++ ++range.error.dataview.constructor.offset=Wrong offset or length in DataView constructor ++range.error.dataview.offset=Offset is outside the bounds of the DataView + range.error.inappropriate.array.length=inappropriate array length: {0} + range.error.inappropriate.array.buffer.length=inappropriate array buffer length: {0} + range.error.invalid.fraction.digits=fractionDigits argument to {0} must be in [0, 20] +--- ./nashorn/src/jdk/nashorn/internal/runtime/resources/Options.properties Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/runtime/resources/Options.properties Wed Jul 30 03:55:26 2014 -0700 +@@ -102,6 +102,13 @@ + type=Boolean \ + } + ++nashorn.option.const.as.var = { \ ++ name="--const-as-var", \ ++ is_undocumented=true, \ ++ desc="Replace 'const' with 'var'.", \ ++ type=Boolean \ ++} ++ + nashorn.option.d = { \ + name="--dump-debug-dir", \ + short_name="-d", \ +@@ -230,6 +237,14 @@ + desc="Parse without compiling." \ + } + ++nashorn.option.persistent.code.cache = { \ ++ name="--persistent-code-cache", \ ++ short_name="-pcc", \ ++ desc="Enable disk cache for compiled scripts.", \ ++ is_undocumented=true, \ ++ default=false \ ++} ++ + nashorn.option.profile.callsites = { \ + name="--profile-callsites", \ + short_name="-pcs", \ +--- ./nashorn/src/jdk/nashorn/internal/scripts/JO.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/internal/scripts/JO.java Wed Jul 30 03:55:26 2014 -0700 +@@ -33,7 +33,7 @@ + */ + public class JO extends ScriptObject { + +- private static final PropertyMap map$ = PropertyMap.newMap().setIsShared(); ++ private static final PropertyMap map$ = PropertyMap.newMap(); + + /** + * Returns the initial property map to be used. +--- ./nashorn/src/jdk/nashorn/tools/Shell.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/src/jdk/nashorn/tools/Shell.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,6 +25,8 @@ + + package jdk.nashorn.tools; + ++import static jdk.nashorn.internal.runtime.Source.sourceFor; ++ + import java.io.BufferedReader; + import java.io.File; + import java.io.FileReader; +@@ -42,6 +44,7 @@ + import jdk.nashorn.internal.ir.FunctionNode; + import jdk.nashorn.internal.ir.debug.ASTWriter; + import jdk.nashorn.internal.ir.debug.PrintVisitor; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.parser.Parser; + import jdk.nashorn.internal.runtime.Context; + import jdk.nashorn.internal.runtime.ErrorManager; +@@ -49,7 +52,6 @@ + import jdk.nashorn.internal.runtime.Property; + import jdk.nashorn.internal.runtime.ScriptEnvironment; + import jdk.nashorn.internal.runtime.ScriptFunction; +-import jdk.nashorn.internal.runtime.ScriptObject; + import jdk.nashorn.internal.runtime.ScriptRuntime; + import jdk.nashorn.internal.runtime.Source; + import jdk.nashorn.internal.runtime.options.Options; +@@ -148,7 +150,7 @@ + return COMMANDLINE_ERROR; + } + +- final ScriptObject global = context.createGlobal(); ++ final Global global = context.createGlobal(); + final ScriptEnvironment env = context.getEnv(); + final List files = env.getFiles(); + if (files.isEmpty()) { +@@ -231,8 +233,8 @@ + * @return error code + * @throws IOException when any script file read results in I/O error + */ +- private static int compileScripts(final Context context, final ScriptObject global, final List files) throws IOException { +- final ScriptObject oldGlobal = Context.getGlobal(); ++ private static int compileScripts(final Context context, final Global global, final List files) throws IOException { ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != global); + final ScriptEnvironment env = context.getEnv(); + try { +@@ -243,7 +245,7 @@ + + // For each file on the command line. + for (final String fileName : files) { +- final FunctionNode functionNode = new Parser(env, new Source(fileName, new File(fileName)), errors).parse(); ++ final FunctionNode functionNode = new Parser(env, sourceFor(fileName, new File(fileName)), errors).parse(); + + if (errors.getNumberOfErrors() != 0) { + return COMPILATION_ERROR; +@@ -281,8 +283,8 @@ + * @return error code + * @throws IOException when any script file read results in I/O error + */ +- private int runScripts(final Context context, final ScriptObject global, final List files) throws IOException { +- final ScriptObject oldGlobal = Context.getGlobal(); ++ private int runScripts(final Context context, final Global global, final List files) throws IOException { ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != global); + try { + if (globalChanged) { +@@ -301,7 +303,7 @@ + } + + final File file = new File(fileName); +- final ScriptFunction script = context.compileScript(new Source(fileName, file.toURI().toURL()), global); ++ final ScriptFunction script = context.compileScript(sourceFor(fileName, file), global); + if (script == null || errors.getNumberOfErrors() != 0) { + return COMPILATION_ERROR; + } +@@ -339,8 +341,8 @@ + * @return error code + * @throws IOException when any script file read results in I/O error + */ +- private static int runFXScripts(final Context context, final ScriptObject global, final List files) throws IOException { +- final ScriptObject oldGlobal = Context.getGlobal(); ++ private static int runFXScripts(final Context context, final Global global, final List files) throws IOException { ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != global); + try { + if (globalChanged) { +@@ -389,11 +391,11 @@ + * @return return code + */ + @SuppressWarnings("resource") +- private static int readEvalPrint(final Context context, final ScriptObject global) { ++ private static int readEvalPrint(final Context context, final Global global) { + final String prompt = bundle.getString("shell.prompt"); + final BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + final PrintWriter err = context.getErr(); +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != global); + final ScriptEnvironment env = context.getEnv(); + +@@ -404,7 +406,7 @@ + + // initialize with "shell.js" script + try { +- final Source source = new Source("", Shell.class.getResource("resources/shell.js")); ++ final Source source = sourceFor("", Shell.class.getResource("resources/shell.js")); + context.eval(global, source.getString(), global, "", false); + } catch (final Exception e) { + err.println(e); +@@ -451,7 +453,7 @@ + } + } finally { + if (globalChanged) { +- Context.setGlobal(global); ++ Context.setGlobal(oldGlobal); + } + } + +--- ./nashorn/test/script/basic/JDK-8008448.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/basic/JDK-8008448.js Wed Jul 30 03:55:26 2014 -0700 +@@ -26,6 +26,7 @@ + * Ensure that all parseable files can be parsed using parser API. + * + * @test ++ * @option --const-as-var + * @option -scripting + * @run + */ +--- ./nashorn/test/script/basic/JDK-8011964.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8011964.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * JDK-8011964: need indexed access to externally-managed ByteBuffer ++ * ++ * @test ++ * @run ++ */ ++ ++ ++var ByteBuffer = Java.type("java.nio.ByteBuffer"); ++var buf = ByteBuffer.allocate(5); ++ ++var obj = {} ++Object.setIndexedPropertiesToExternalArrayData(obj, buf); ++ ++obj[0] = 'A'.charCodeAt(0); ++obj[1] = 'B'.charCodeAt(0); ++obj[2] = 'C'.charCodeAt(0); ++obj[3] = 'D'.charCodeAt(0); ++obj[4] = 'E'.charCodeAt(0); ++ ++for (var i = 0; i < buf.capacity(); i++) { ++ print("obj[" + i + "] = " + obj[i]); ++ print("buf.get(" + i + ") = " + buf.get(i)); ++} ++ ++var arr = []; ++Object.setIndexedPropertiesToExternalArrayData(arr, buf); ++obj[0] = 'a'.charCodeAt(0); ++obj[1] = 'b'.charCodeAt(0); ++obj[2] = 'c'.charCodeAt(0); ++obj[3] = 'd'.charCodeAt(0); ++obj[4] = 'e'.charCodeAt(0); ++ ++for (var i in arr) { ++ print("arr[" + i + "] = " + arr[i]); ++ print("buf.get(" + i + ") = " + buf.get(i)); ++} +--- ./nashorn/test/script/basic/JDK-8011964.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8011964.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,20 @@ ++obj[0] = 65 ++buf.get(0) = 65 ++obj[1] = 66 ++buf.get(1) = 66 ++obj[2] = 67 ++buf.get(2) = 67 ++obj[3] = 68 ++buf.get(3) = 68 ++obj[4] = 69 ++buf.get(4) = 69 ++arr[0] = 97 ++buf.get(0) = 97 ++arr[1] = 98 ++buf.get(1) = 98 ++arr[2] = 99 ++buf.get(2) = 99 ++arr[3] = 100 ++buf.get(3) = 100 ++arr[4] = 101 ++buf.get(4) = 101 +--- ./nashorn/test/script/basic/JDK-8024120.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/basic/JDK-8024120.js Wed Jul 30 03:55:26 2014 -0700 +@@ -32,10 +32,6 @@ + + obj.__proto__ = null; + +-if (obj.__proto__ !== null || typeof(obj.__proto__) != 'object') { +- fail("obj.__proto__ is expected to be null"); +-} +- + var p = Object.getPrototypeOf(obj); + if (p !== null || typeof(p) != 'object') { + fail("Object.getPrototypeOf(obj) is expected to be null"); +--- ./nashorn/test/script/basic/JDK-8024174.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/basic/JDK-8024174.js Wed Jul 30 03:55:26 2014 -0700 +@@ -46,6 +46,6 @@ + __proto__: null + }; + +-if (obj2.__proto__ !== null || Object.getPrototypeOf(obj2) !== null) { ++if (Object.getPrototypeOf(obj2) !== null) { + fail("obj2.__proto__ was not set to null inside literal"); + } +--- ./nashorn/test/script/basic/JDK-8025515.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/basic/JDK-8025515.js Wed Jul 30 03:55:26 2014 -0700 +@@ -30,13 +30,23 @@ + + // Make sure synthetic names of anonymous functions have correct line numbers + ++function getFirstScriptFrame(stack) { ++ for (frameNum in stack) { ++ var frame = stack[frameNum]; ++ if (frame.className.startsWith("jdk.nashorn.internal.scripts.Script$")) { ++ return frame; ++ } ++ } ++} ++ + function testMethodName(f, expected) { + try { + f(); + fail("expected error"); + } catch (e) { +- var stack = e.getStackTrace(); +- if (stack[0].methodName !== expected) { ++ var stack = e.nashornException.getStackTrace(); ++ var name = getFirstScriptFrame(stack).methodName; ++ if (name !== expected) { + fail("got " + stack[0].methodName + ", expected " + expected); + } + } +@@ -44,15 +54,15 @@ + + testMethodName(function() { + return a.b.c; +-}, "_L45"); ++}, "L:55"); + +-testMethodName(function() { throw new Error() }, "_L49"); ++testMethodName(function() { throw new Error() }, "L:59"); + + var f = (function() { + return function() { a.b.c; }; + })(); +-testMethodName(f, "_L51$_L52"); ++testMethodName(f, "L:61$L:62"); + + testMethodName((function() { + return function() { return a.b.c; }; +-})(), "_L56$_L57"); ++})(), "L:66$L:67"); +--- ./nashorn/test/script/basic/JDK-8027933.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8027933.js Wed Jul 30 03:55:26 2014 -0700 +@@ -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. ++ */ ++ ++/** ++ * JDK-8027933: Add const.as.var option ++ * ++ * @test ++ * @option --const-as-var ++ * @run ++ */ ++ ++const THE_ANSWER = 42; ++print("Answer to all questions: " + THE_ANSWER); ++ ++print((function () { ++ const FORTY_TWO = 42; ++ return FORTY_TWO ++})()) +--- ./nashorn/test/script/basic/JDK-8027933.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8027933.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,2 @@ ++Answer to all questions: 42 ++42 +--- ./nashorn/test/script/basic/JDK-8029364.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8029364.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,49 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++/** ++ * JDK-8029364: NashornException to expose thrown object ++ * ++ * @test ++ * @run ++ */ ++ ++var m = new javax.script.ScriptEngineManager(); ++var e = m.getEngineByName("nashorn"); ++var g = e.eval("this"); ++try { ++ e.eval("var e = new Error('foo'); e.bar = 33; throw e"); ++} catch (se) { ++ // ScriptException instance's cause is a NashornException ++ print(se.getClass()); ++ var cause = se.cause; ++ print(cause.getClass()); ++ // NashornException instance has 'ecmaError' bean getter ++ print(cause.ecmaError); ++ // access to underlying ECMA Error object ++ print(cause.ecmaError instanceof g.Error); ++ print(cause.ecmaError.name); ++ print(cause.ecmaError.message); ++ print(cause.ecmaError.bar); ++} ++ +--- ./nashorn/test/script/basic/JDK-8029364.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8029364.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,7 @@ ++class javax.script.ScriptException ++class jdk.nashorn.internal.runtime.ECMAException ++Error: foo ++true ++Error ++foo ++33 +--- ./nashorn/test/script/basic/JDK-8029667.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8029667.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,91 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++/** ++ * JDK-8029667: Prototype linking is incorrect ++ * ++ * @test ++ * @run ++ */ ++ ++function f(x) { ++ return (function inner() { ++ var y; (function dummy() { return y })() // force own scope for the inner function ++ with({}) { // 'with' block turns off fast scopes ++ return x ++ } ++ })(); ++} ++print(f(1)); ++print(f(2)); ++ ++function g(x) { ++ (function inner() { ++ var y; (function dummy() { return y })() // force own scope for the inner function ++ with({}) { // 'with' block turns off fast scopes ++ // Test setter as well as getter ++ x = x + 2; ++ } ++ })(); ++ print(x); ++} ++ ++g(1); ++g(2); ++ ++var withScopes = [{ func: function() { print("called 1");} }, { func: function() { print("called 2");} }]; ++ ++for(var i in withScopes) { ++ with (withScopes[i]) { ++ var main = function() { ++ var frame; // <---- this local variable caused scope to be not set properly prior to fix ++ ++ function callFunc() { ++ frame = func(); ++ } ++ ++ callFunc(); ++ } ++ } ++ main(); ++} ++ ++for(var i in withScopes) { ++ with (withScopes[i]) { ++ var main = function() { ++ var frame; // <---- this local variable caused scope to be not set properly prior to fix ++ ++ function callFunc() { ++ frame = func = i; ++ } ++ ++ callFunc(); ++ } ++ } ++ main(); ++} ++ ++print(withScopes[0].func); ++print(withScopes[1].func); ++ ++ +--- ./nashorn/test/script/basic/JDK-8029667.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8029667.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,8 @@ ++1 ++2 ++3 ++4 ++called 1 ++called 2 ++0 ++1 +--- ./nashorn/test/script/basic/JDK-8030182.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030182.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,46 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++/** ++ * JDK-8030182: scopeCall with -1 as line number ++ * ++ * @test ++ * @run ++ */ ++ ++function func() { ++ throw new Error("Strange..."); ++} ++ ++var f2 = func; ++var f3 = func; ++var f4 = func; ++var f5 = func; ++ ++// check that "scopeCall" or some such internal method ++// does not appear in script stack trace. ++try { ++ func(); ++} catch(err) { ++ print(err.stack.replace(/\\/g, '/')); ++} +--- ./nashorn/test/script/basic/JDK-8030182.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030182.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,3 @@ ++Error: Strange... ++ at func (test/script/basic/JDK-8030182.js:32) ++ at (test/script/basic/JDK-8030182.js:43) +--- ./nashorn/test/script/basic/JDK-8030182_2.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030182_2.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,46 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++/** ++ * JDK-8030182: scopeCall with -1 as line number ++ * ++ * @test ++ * @run ++ */ ++ ++var str = ""; ++ ++// large code to force splitting ++for (i = 0; i < 1000; ++i) ++ str +="o = new Object()\n"; ++ ++str +="g()"; ++ ++// check that "$split" or some such internal method ++// does not appear in script stack trace!! ++try { ++ eval(str); ++} catch (e) { ++ print(e.stack.replace(/\\/g, '/')); ++} ++ +--- ./nashorn/test/script/basic/JDK-8030182_2.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030182_2.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,3 @@ ++ReferenceError: "g" is not defined ++ at (test/script/basic/JDK-8030182_2.js#42:4@0:-1) ++ at (test/script/basic/JDK-8030182_2.js:42) +--- ./nashorn/test/script/basic/JDK-8030197.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030197.js Wed Jul 30 03:55:26 2014 -0700 +@@ -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. ++ */ ++ ++ ++/** ++ * JDK-8030197: Nashorn: Object.defineProperty() can be lured to change fixed NaN property ++ * ++ * @test ++ * @run ++ */ ++ ++function str(n) { ++ var a = new Uint8Array(new Float64Array([n]).buffer); ++ return Array.apply(null, a).reduceRight( ++ function(acc, v){ ++ return acc + (v < 10 ? "0" : "") + v.toString(16); ++ }, ""); ++} ++ ++var o = Object.defineProperty({}, "NaN", { value: NaN }) ++var str1 = str(o.NaN); ++Object.defineProperty(o, "NaN", { value: 0/0 }) ++var str2 = str(o.NaN); ++if (str1 != str2) { ++ fail("NaN bit pattern changed"); ++} +--- ./nashorn/test/script/basic/JDK-8030199.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030199.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,50 @@ ++/* ++ * Copyright (c) 2010, 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-8030199: Nashorn: Uint8ClampedArray - Incorrect ToUint8Clamp implementation ++ * ++ * @test ++ * @run ++ */ ++ ++function testTypedArray(ArrayType) { ++ print(ArrayType.BYTES_PER_ELEMENT); ++ var a = new ArrayType(7); ++ a[0] = 4294967296; ++ a[1] = -4294967295; ++ a[2] = 4294967298; ++ a[3] = -4294967298; ++ a[4] = Infinity; ++ a[5] = -Infinity; ++ a[6] = NaN; ++ print(Array.prototype.join.call(a)); ++} ++ ++testTypedArray(Uint8ClampedArray); ++testTypedArray(Uint8Array); ++testTypedArray(Int8Array); ++testTypedArray(Uint16Array); ++testTypedArray(Int16Array); ++testTypedArray(Uint32Array); ++testTypedArray(Int32Array); +--- ./nashorn/test/script/basic/JDK-8030199.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030199.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,14 @@ ++1 ++255,0,255,0,255,0,0 ++1 ++0,1,2,254,0,0,0 ++1 ++0,1,2,-2,0,0,0 ++2 ++0,1,2,65534,0,0,0 ++2 ++0,1,2,-2,0,0,0 ++4 ++0,1,2,4294967294,0,0,0 ++4 ++0,1,2,-2,0,0,0 +--- ./nashorn/test/script/basic/JDK-8030200.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030200.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * Copyright (c) 2010, 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-8030200: Wrong result for Number.prototype.toString() for certain radix/inputs ++ * ++ * @test ++ * @run ++ */ ++ ++var n = 0x8000000000000800; ++print(n); ++var s = n.toString(5); ++var m = parseInt(s, 5); ++print(m === n); ++print(n); +--- ./nashorn/test/script/basic/JDK-8030200.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030200.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,3 @@ ++9223372036854778000 ++true ++9223372036854778000 +--- ./nashorn/test/script/basic/JDK-8030202.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030202.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,57 @@ ++/* ++ * Copyright (c) 2010, 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-8030202: Nashorn: Multiple RegExp#ignoreCase issues ++ * ++ * @test ++ * @run ++ */ ++ ++print(/\u2160/i.test("\u2170")); ++print(/[\u2160]/i.test("\u2170")); ++print(/\u2170/i.test("\u2160")); ++print(/[\u2170]/i.test("\u2160")); ++ ++print(/\u0130/i.test("\u0069")); ++print(/[\u0130]/i.test("\u0069")); ++print(/\u0069/i.test("\u0130")); ++print(/[\u0069]/i.test("\u0130")); ++ ++print(/\u1e9e/i.test("\u00df")); ++print(/[\u1e9e]/i.test("\u00df")); ++print(/\u00df/i.test("\u1e9e")); ++print(/[\u00df]/i.test("\u1e9e")); ++ ++print(/[^\u1e9e]/i.test("\u00df")); ++print(/[^\u00df]/i.test("\u1e9e")); ++ ++print(/\u0345{4}/i.test("\u0345\u0399\u03b9\u1fbe")); ++print(/\u0399{4}/i.test("\u0345\u0399\u03b9\u1fbe")); ++print(/\u03b9{4}/i.test("\u0345\u0399\u03b9\u1fbe")); ++print(/\u1fbe{4}/i.test("\u0345\u0399\u03b9\u1fbe")); ++ ++print(/[\u0345]{4}/i.test("\u0345\u0399\u03b9\u1fbe")); ++print(/[\u0399]{4}/i.test("\u0345\u0399\u03b9\u1fbe")); ++print(/[\u03b9]{4}/i.test("\u0345\u0399\u03b9\u1fbe")); ++print(/[\u1fbe]{4}/i.test("\u0345\u0399\u03b9\u1fbe")); +--- ./nashorn/test/script/basic/JDK-8030202.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030202.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,22 @@ ++true ++true ++true ++true ++false ++false ++false ++false ++false ++false ++false ++false ++true ++true ++true ++true ++true ++true ++true ++true ++true ++true +--- ./nashorn/test/script/basic/JDK-8030809.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030809.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++/** ++ * JDK-8030809: Anonymous functions should not be shown with internal names in script stack trace ++ * ++ * @test ++ * @run ++ */ ++ ++function func() { ++ (function() { ++ throw new Error(); ++ })(); ++} ++ ++try { ++ func(); ++} catch (e) { ++ print(e.stack.replace(/\\/g, '/')); ++} +--- ./nashorn/test/script/basic/JDK-8030809.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8030809.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,4 @@ ++Error ++ at (test/script/basic/JDK-8030809.js:33) ++ at func (test/script/basic/JDK-8030809.js:32) ++ at (test/script/basic/JDK-8030809.js:38) +--- ./nashorn/test/script/basic/JDK-8031317.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8031317.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++/** ++ * JDK-8031317: SyntaxError when property setter has no parameter ++ * ++ * @test ++ * @run ++ */ ++ ++var obj = { ++ get toto() { ++ print("in getter for 'toto'"); ++ }, ++ set toto() { ++ print("in setter for 'toto'"); ++ } ++} ++ ++obj.toto; ++obj.toto = 344; +--- ./nashorn/test/script/basic/JDK-8031317.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8031317.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,2 @@ ++in getter for 'toto' ++in setter for 'toto' +--- ./nashorn/test/script/basic/JDK-8031359.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8031359.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,62 @@ ++/* ++ * Copyright (c) 2010, 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-8031359: Invocable.getInterface() works incorrectly if interface has default methods ++ * ++ * @test ++ * @run ++ */ ++ ++var func = new java.util.function.Function() { ++ apply: function(arg) { ++ print("func called with " + arg); ++ return arg.toUpperCase(); ++ } ++}; ++ ++// Function.andThen is a default method ++func.andThen(func)("hello"); ++ ++// Function.compose is another default method ++func.compose(new java.util.function.Function() { ++ apply: function(arg) { ++ print("compose called with " + arg); ++ return arg.charAt(0); ++ } ++})("hello"); ++ ++var func2 = new java.util.function.Function() { ++ apply: function(arg) { ++ print("I am func2: " + arg); ++ return arg; ++ }, ++ ++ andThen: function(func) { ++ print("This is my andThen!"); ++ return func; ++ } ++}; ++ ++func2.apply("hello"); ++func2.andThen(func); +--- ./nashorn/test/script/basic/JDK-8031359.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8031359.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,6 @@ ++func called with hello ++func called with HELLO ++compose called with hello ++func called with h ++I am func2: hello ++This is my andThen! +--- ./nashorn/test/script/basic/JDK-8031715.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8031715.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,49 @@ ++/* ++ * 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-8031715: Indexed access to java package not working ++ * @test ++ * @run ++ */ ++ ++print(java["net"]); ++print(java["net"]["URL"]); ++print(java["net"].URL); ++print(java.net["URL"]); ++ ++var is = "InputStream"; ++var io = "io"; ++ ++print(java.io[is]); ++print(java[io]); ++print(java[io][is]); ++ ++var ji = new JavaImporter(java.util, java.io); ++print(ji["InputStream"]); ++print(ji['Vector']); ++ ++var hash = "Hashtable"; ++var printStream = "PrintStream"; ++print(ji[hash]); ++print(ji[printStream]); +--- ./nashorn/test/script/basic/JDK-8031715.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8031715.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,11 @@ ++[JavaPackage java.net] ++[JavaClass java.net.URL] ++[JavaClass java.net.URL] ++[JavaClass java.net.URL] ++[JavaClass java.io.InputStream] ++[JavaPackage java.io] ++[JavaClass java.io.InputStream] ++[JavaClass java.io.InputStream] ++[JavaClass java.util.Vector] ++[JavaClass java.util.Hashtable] ++[JavaClass java.io.PrintStream] +--- ./nashorn/test/script/basic/JDK-8031983.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8031983.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * 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-8031983: Error objects should capture stack at the constructor ++ * ++ * @test ++ * @run ++ */ ++ ++var e = new Error(); ++print("hello"); ++ ++try { ++ throw e; ++} catch (e) { ++ print(e.lineNumber); ++ print(e.stack.replace(/\\/g, '/')); ++} ++ ++Error.captureStackTrace(e); ++try { ++ throw e; ++} catch (e) { ++ print(e.lineNumber); ++ print(e.stack.replace(/\\/g, '/')); ++} ++ ++var obj = {}; ++Error.captureStackTrace(obj); ++try { ++ throw obj; ++} catch (e) { ++ print(e.stack.replace(/\\/g, '/')); ++} +--- ./nashorn/test/script/basic/JDK-8031983.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8031983.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,9 @@ ++hello ++35 ++Error ++ at (test/script/basic/JDK-8031983.js:31) ++43 ++Error ++ at (test/script/basic/JDK-8031983.js:41) ++[object Object] ++ at (test/script/basic/JDK-8031983.js:50) +--- ./nashorn/test/script/basic/JDK-8032004.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8032004.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,43 @@ ++/* ++ * 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-8032004: instance property "message" of Error objects should be non-enumerable ++ * ++ * @test ++ * @run ++ */ ++ ++function check(obj) { ++ if (obj.propertyIsEnumerable("message")) { ++ fail(obj.name + " object's message property is enumerable!"); ++ } ++} ++ ++check(new Error("test")); ++check(new EvalError("test")); ++check(new RangeError("test")); ++check(new ReferenceError("test")); ++check(new SyntaxError("test")); ++check(new TypeError("test")); ++check(new URIError("test")); +--- ./nashorn/test/script/basic/JDK-8032068.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8032068.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,56 @@ ++/* ++ * 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-8032068: implement @sourceURL and #sourceURL directives. ++ * ++ * @test ++ * @run ++ */ ++ ++ ++try { ++ Function("throw new Error();\n//# sourceURL=foo.js")(); ++} catch (e) { ++ print(e.stack.replace(/\\/g, '/')); ++} ++ ++try { ++ eval("function g() { throw Error('x');\n } g();\n//# sourceURL=bar.js"); ++} catch (e) { ++ print(e.stack.replace(/\\/g, '/')); ++} ++ ++// check @sourceURL for compatibility ++try { ++ Function("throw new Error();\n//@ sourceURL=foo2.js")(); ++} catch (e) { ++ print(e.stack.replace(/\\/g, '/')); ++} ++ ++try { ++ eval("function g() { throw Error('x');\n } g();\n//@ sourceURL=bar2.js"); ++} catch (e) { ++ print(e.stack.replace(/\\/g, '/')); ++} ++ +--- ./nashorn/test/script/basic/JDK-8032068.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8032068.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,14 @@ ++Error ++ at (foo.js:2) ++ at (test/script/basic/JDK-8032068.js:33) ++Error: x ++ at g (bar.js:1) ++ at (bar.js:2) ++ at (test/script/basic/JDK-8032068.js:39) ++Error ++ at (foo2.js:2) ++ at (test/script/basic/JDK-8032068.js:46) ++Error: x ++ at g (bar2.js:1) ++ at (bar2.js:2) ++ at (test/script/basic/JDK-8032068.js:52) +--- ./nashorn/test/script/basic/JDK-8034055.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8034055.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,55 @@ ++/* ++ * Copyright (c) 2010, 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-8034055: delete on global object not properly guarded ++ * ++ * @test ++ * @run ++ */ ++ ++ ++var global = this; ++var x; ++ ++function test(defineGlobals) { ++ if (defineGlobals) { ++ global.x = 1; ++ global.y = 2; ++ } ++ try { ++ print(x); ++ print(y); ++ } catch (e) { ++ print(e); ++ } finally { ++ print(delete global.x); ++ print(delete global.y); ++ } ++} ++ ++// Repeatedly set and delete global variables ++test(true); ++test(false); ++test(true); ++test(false); +--- ./nashorn/test/script/basic/JDK-8034055.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8034055.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,16 @@ ++1 ++2 ++false ++true ++1 ++ReferenceError: "y" is not defined ++false ++true ++1 ++2 ++false ++true ++1 ++ReferenceError: "y" is not defined ++false ++true +--- ./nashorn/test/script/basic/JDK-8037562.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8037562.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,41 @@ ++/* ++ * 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-8037562: Nashorn: JSON.parse comes up with nonexistent entries if there are gaps between the keys ++ * ++ * @test ++ * @run ++ */ ++ ++var strs = [ ++ '{ "0":0, "2":2 }', ++ '{ "0":"", "2":"" }', ++ '{ "0":0, "5":"hello" }', ++ '{ "0":"", "15":3234 }', ++] ++ ++for (var i in strs) { ++ print(JSON.stringify(JSON.parse(strs[i]))); ++} +--- ./nashorn/test/script/basic/JDK-8037562.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8037562.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,4 @@ ++{"0":0,"2":2} ++{"0":"","2":""} ++{"0":0,"5":"hello"} ++{"0":"","15":3234} +--- ./nashorn/test/script/basic/JDK-8039387.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8039387.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * JDK-8039387: Nashorn supports indexed access of List elements, but length property is not supported ++ * ++ * @test ++ * @run ++ */ ++ ++var ArrayList = Java.type("java.util.ArrayList") ++var list = new ArrayList(3) ++list.add("nashorn") ++list.add("js") ++list.add("ecmascript") ++var len = list.length ++print("length = " + len) ++for (var i = 0; i < len; i++) ++ print(list[i]) +--- ./nashorn/test/script/basic/JDK-8039387.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8039387.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,4 @@ ++length = 3 ++nashorn ++js ++ecmascript +--- ./nashorn/test/script/basic/JDK-8041998.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8041998.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,52 @@ ++/* ++ * Copyright (c) 2010, 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-8041998: RegExp implementation is not thread-safe ++ * ++ * @test ++ * @run ++ */ ++ ++var Thread = java.lang.Thread; ++ ++function run() { ++ var line = 'content-type: text/html'; ++ for (var i = 0; i < 300; i++) { ++ Thread.sleep(1); ++ line.split(/: /); ++ } ++ print("done"); ++} ++ ++var threads = []; ++ ++for (var i = 0; i < 4; i++) { ++ var thread = new Thread(run); ++ thread.start(); ++ threads.push(thread); ++} ++ ++for (var i = 0; i < 4; i++) { ++ threads[i].join(); ++} +--- ./nashorn/test/script/basic/JDK-8041998.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8041998.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,4 @@ ++done ++done ++done ++done +--- ./nashorn/test/script/basic/JDK-8042364.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8042364.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,65 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * JDK-8042364: Make __proto__ ES6 draft compliant ++ * ++ * @test ++ * @run ++ */ ++ ++// check for Object.prototype.__proto__ accessor property ++print("Object.prototype has __proto__?", ++ Object.prototype.hasOwnProperty("__proto__")) ++ ++var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__") ++print("descriptor"); ++print(JSON.stringify(desc)) ++print("getter", desc.get) ++print("setter", desc.set) ++ ++// no computed "__proto__" name, only identifier! ++var p = {} ++var obj = { ++ "__proto__" : p ++} ++ ++if (Object.getPrototypeOf(obj) === p) { ++ fail("obj has wrong __proto__, allows computed __proto__!") ++} ++ ++if (obj.__proto__ !== p) { ++ fail("__proto__ not created as normal property!") ++} ++ ++if (Object.getPrototypeOf(obj) !== Object.prototype) { ++ fail("obj has wrong __proto__") ++} ++ ++var obj2 = { ++ __proto__: p ++} ++ ++if (Object.getPrototypeOf(obj2) !== p) { ++ fail("can't set __proto__ in object literal") ++} +--- ./nashorn/test/script/basic/JDK-8042364.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8042364.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,5 @@ ++Object.prototype has __proto__? true ++descriptor ++{"configurable":true,"enumerable":false} ++getter function getProto() { [native code] } ++setter function setProto() { [native code] } +--- ./nashorn/test/script/basic/JDK-8043930.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8043930.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++/** ++ * JDK-8043930: TypeError when attemping to create an instance of non-public class could be better ++ * ++ * @test ++ * @run ++ */ ++ ++var NonPublicClass = Java.type("jdk.nashorn.test.models.NonPublicClass"); ++try { ++ var obj = new NonPublicClass(); ++ fail("Expected TypeError to be thrown!"); ++} catch (e) { ++ print(e); ++} +--- ./nashorn/test/script/basic/JDK-8043930.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8043930.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,1 @@ ++TypeError: new cannot be used with non-public java type jdk.nashorn.test.models.NonPublicClass. +--- ./nashorn/test/script/basic/JDK-8044520.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8044520.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,145 @@ ++/* ++ * 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-8044520: Nashorn cannot execute node.js's express module ++ * ++ * @test ++ * @run ++ */ ++ ++function checkNullProto() { ++ var obj = {}; ++ obj.__proto__ = null; ++ var proto = Object.getPrototypeOf(obj); ++ if (typeof proto != 'object' || proto !== null) { ++ fail("__proto__ can't be set to null!"); ++ } ++} ++ ++checkNullProto(); ++ ++function checkSetProto(proto) { ++ var obj = {}; ++ obj.__proto__ = proto; ++ if (Object.getPrototypeOf(obj) !== Object.prototype) { ++ fail("obj.__proto__ set not ignored for " + proto); ++ } ++} ++ ++checkSetProto(undefined); ++checkSetProto(42); ++checkSetProto(false); ++checkSetProto("hello"); ++ ++function checkLiteralSetProto(proto) { ++ var obj = { __proto__: proto }; ++ if (obj.__proto__ !== Object.prototype) { ++ fail("object literal _proto__ set not ignored for " + proto); ++ } ++} ++ ++checkLiteralSetProto(undefined); ++checkLiteralSetProto(34); ++checkLiteralSetProto(true); ++checkLiteralSetProto("world"); ++ ++function checkNullProtoFromLiteral() { ++ var obj = { __proto__: null }; ++ var proto = Object.getPrototypeOf(obj); ++ if (typeof proto != 'object' || proto !== null) { ++ fail("__proto__ can't be set to null!"); ++ } ++} ++ ++checkNullProtoFromLiteral(); ++ ++function checkSetPrototypeOf(proto) { ++ try { ++ Object.setPrototypeOf({}, proto); ++ fail("should have thrown error for " + proto); ++ } catch (e) { ++ if (! (e instanceof TypeError)) { ++ fail("should have thrown TypeError, got " + e); ++ } ++ } ++} ++ ++checkSetPrototypeOf(undefined); ++checkSetPrototypeOf(43); ++checkSetPrototypeOf(false); ++checkSetPrototypeOf("nashorn"); ++ ++function checkNullSetPrototypeOf() { ++ var obj = { }; ++ Object.setPrototypeOf(obj, null); ++ var proto = Object.getPrototypeOf(obj); ++ if (typeof proto != 'object' || proto !== null) { ++ fail("__proto__ can't be set to null!"); ++ } ++} ++ ++checkNullSetPrototypeOf(); ++ ++var desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); ++ ++function checkProtoGetterOnPrimitive(value) { ++ // call __proto__ getter on primitive - check ToObject ++ // is called on 'this' value as per draft spec ++ if (desc.get.call(value) !== Object(value).__proto__) { ++ fail("can't call __proto__ getter on " + value); ++ } ++} ++ ++checkProtoGetterOnPrimitive(32); ++checkProtoGetterOnPrimitive(false); ++checkProtoGetterOnPrimitive("great!"); ++ ++function checkProtoSetterOnNonObjectThis(self) { ++ try { ++ desc.set.call(self); ++ fail("should have thrown TypeError"); ++ } catch (e) { ++ if (! (e instanceof TypeError)) { ++ fail("should throw TypeError on non-object self, got " +e); ++ } ++ } ++} ++ ++checkProtoSetterOnNonObjectThis(undefined); ++checkProtoSetterOnNonObjectThis(null); ++ ++function checkProtoSetterReturnValue(obj, p) { ++ if (typeof desc.set.call(obj, p) != "undefined") { ++ fail("__proto__ setter does not return undefined: " + obj + " " + p); ++ } ++} ++ ++// try non-object 'this'. setter is expected to return undefined. ++checkProtoSetterReturnValue(23); ++checkProtoSetterReturnValue(false); ++checkProtoSetterReturnValue("foo"); ++ ++// set proper __proto__. Still return value is undefined. ++checkProtoSetterReturnValue({}, {}); ++checkProtoSetterReturnValue({}, null); +--- ./nashorn/test/script/basic/JDK-8044612.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8044612.js Wed Jul 30 03:55:26 2014 -0700 +@@ -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-8044612: StringIndexOutOfBoundException in NativeRegExp.appendReplacement ++ * ++ * @test ++ * @run ++ */ ++ ++if ("hello".replace("h", "$") != "$ello") { ++ fail("String.prototype.replace failed to handle '$' as replacement"); ++} ++ ++if ("hello".replace("o", "$x") != "hell$x") { ++ fail("String.prototype.replace failed to handle '$x' as replacement"); ++} +--- ./nashorn/test/script/basic/JDK-8044695.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8044695.js Wed Jul 30 03:55:26 2014 -0700 +@@ -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-8044695: __stack__ becomes visible in Error properties ++ * ++ * @test ++ * @run ++ */ ++ ++var e = new Error(); ++// access stack to force __stack__ ++e.stack; ++var jsonStr = JSON.stringify(e); ++if (jsonStr != "{}") { ++ fail("JSON string is not {}, it is " + jsonStr); ++} +--- ./nashorn/test/script/basic/JDK-8044750.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/JDK-8044750.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,53 @@ ++/* ++ * 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-8044750: megamorphic getter for scope objects does not call __noSuchProperty__ hook ++ * ++ * @test ++ * @run ++ */ ++ ++__noSuchProperty__ = function(name) { ++ return 1; ++} ++ ++function func(obj) { ++ with(obj) { ++ // this "foo" getter site becomes megamorphic ++ // due to different 'with' scope objects. ++ foo; ++ } ++} ++ ++for (var i = 0; i < 20; i++) { ++ var obj = {}; ++ obj.foo = i; ++ obj[i] = i; ++ func(obj); ++} ++ ++// pass a 'with' scope object that does not have 'foo'. ++// callsite inside func should see __noSuchProperty__ ++// hook on global scope object. ++func({}); +--- ./nashorn/test/script/basic/NASHORN-111.js.EXPECTED Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/basic/NASHORN-111.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -1,1 +1,1 @@ +-{"message":"type error"} ++{} +--- ./nashorn/test/script/basic/NASHORN-173.js.EXPECTED Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/basic/NASHORN-173.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -132,7 +132,7 @@ + 2.3423446609034533e+21 + 2.3423446609034533e+21 + 11111101111101010001111111010101101000101011011001001000000000000000000 +-2224143002343343220233144213324 ++2224143002343343220233044213324 + 375752177255053311000000 + 73b92b9962990aa44400 + 7efa8fead15b240000 +--- ./nashorn/test/script/basic/NASHORN-441.js.EXPECTED Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/basic/NASHORN-441.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -12,6 +12,6 @@ + try 5 + rethrow 5 + finally 5 +-Error: try 5 thrown in line 71 ++Error: try 5 thrown in line 74 + try 6 + finally 6 +--- ./nashorn/test/script/basic/dataview_endian.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/dataview_endian.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,70 @@ ++/* ++ * 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-8015958: DataView constructor is not defined ++ * ++ * @test ++ * @run ++ */ ++ ++// set/get endianess checks ++ ++var buffer = new ArrayBuffer(4); ++var dv = new DataView(buffer); ++ ++// write (default) big endian, read big/little endian ++dv.setUint16(0, 0xABCD); ++Assert.assertEquals(dv.getUint16(0), 0xABCD); ++Assert.assertEquals(dv.getUint16(0, false), 0xABCD); ++Assert.assertEquals(dv.getUint16(0, true), 0xCDAB); ++ ++// write little endian, read big/little endian ++dv.setUint16(0, 0xABCD, true); ++Assert.assertEquals(dv.getUint16(0), 0xCDAB); ++Assert.assertEquals(dv.getUint16(0, false), 0xCDAB); ++Assert.assertEquals(dv.getUint16(0, true), 0xABCD); ++ ++// write explicit big endian, read big/little endian ++dv.setUint16(0, 0xABCD, false); ++Assert.assertEquals(dv.getUint16(0), 0xABCD); ++Assert.assertEquals(dv.getUint16(0, false), 0xABCD); ++Assert.assertEquals(dv.getUint16(0, true), 0xCDAB); ++ ++// write (default) big endian, read big/little endian ++dv.setUint32(0, 0xABCDEF89); ++Assert.assertEquals(dv.getUint32(0), 0xABCDEF89); ++Assert.assertEquals(dv.getUint32(0, false), 0xABCDEF89); ++Assert.assertEquals(dv.getUint32(0, true), 0x89EFCDAB); ++ ++// write little endian, read big/little endian ++dv.setUint32(0, 0xABCDEF89, true); ++Assert.assertEquals(dv.getUint32(0), 0x89EFCDAB); ++Assert.assertEquals(dv.getUint32(0, false), 0x89EFCDAB); ++Assert.assertEquals(dv.getUint32(0, true), 0xABCDEF89); ++ ++// write explicit big endian, read big/little endian ++dv.setUint32(0, 0xABCDEF89, false); ++Assert.assertEquals(dv.getUint32(0), 0xABCDEF89); ++Assert.assertEquals(dv.getUint32(0, false), 0xABCDEF89); ++Assert.assertEquals(dv.getUint32(0, true), 0x89EFCDAB); +--- ./nashorn/test/script/basic/dataview_getset.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/dataview_getset.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,93 @@ ++/* ++ * 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-8015958: DataView constructor is not defined ++ * ++ * @test ++ * @run ++ */ ++ ++// checking get/set of values of various types ++// Also basic endianess check. ++ ++var Float = Java.type("java.lang.Float"); ++var Double = Java.type("java.lang.Double"); ++ ++var DOUBLE_MIN = Double.MIN_VALUE; ++var DOUBLE_MIN_NORMAL = Double.MIN_NORMAL; ++var FLOAT_MIN = Float.MIN_VALUE; ++var FLOAT_MIN_NORMAL = Float.MIN_NORMAL; ++ ++var buffer = new ArrayBuffer(12); ++var dv = new DataView(buffer); ++ ++dv.setInt8(1, 123); ++Assert.assertEquals(dv.getInt8(1), 123); ++dv.setInt8(1, 123, true); ++Assert.assertEquals(dv.getInt8(1, true), 123); ++ ++dv.setUint8(1, 255); ++Assert.assertEquals(dv.getUint8(1), 255); ++dv.setUint8(1, 255, true); ++Assert.assertEquals(dv.getUint8(1, true), 255); ++ ++dv.setInt16(1, 1234); ++Assert.assertEquals(dv.getInt16(1), 1234); ++dv.setInt16(1, 1234, true); ++Assert.assertEquals(dv.getInt16(1, true), 1234); ++ ++dv.setUint16(1, 65535); ++Assert.assertEquals(dv.getUint16(1), 65535); ++dv.setUint16(1, 65535, true); ++Assert.assertEquals(dv.getUint16(1, true), 65535); ++ ++dv.setInt32(1, 1234); ++Assert.assertEquals(dv.getInt32(1), 1234); ++dv.setInt32(1, 1234, true); ++Assert.assertEquals(dv.getInt32(1, true), 1234); ++ ++dv.setUint32(1, 4294967295); ++Assert.assertEquals(dv.getUint32(1), 4294967295); ++dv.setUint32(1, 4294967295, true); ++Assert.assertEquals(dv.getUint32(1, true), 4294967295); ++ ++dv.setFloat64(1, Math.PI); ++Assert.assertEquals(dv.getFloat64(1), Math.PI, DOUBLE_MIN); ++dv.setFloat64(1, Math.PI, true); ++Assert.assertEquals(dv.getFloat64(1, true), Math.PI, DOUBLE_MIN); ++ ++dv.setFloat64(1, DOUBLE_MIN_NORMAL); ++Assert.assertEquals(dv.getFloat64(1), DOUBLE_MIN_NORMAL, DOUBLE_MIN); ++dv.setFloat64(1, DOUBLE_MIN_NORMAL, true); ++Assert.assertEquals(dv.getFloat64(1, true), DOUBLE_MIN_NORMAL, DOUBLE_MIN); ++ ++dv.setFloat32(1, 1.414); ++Assert["assertEquals(float, float, float)"](dv.getFloat32(1), 1.414, FLOAT_MIN); ++dv.setFloat32(1, 1.414, true); ++Assert["assertEquals(float, float, float)"](dv.getFloat32(1, true), 1.414, FLOAT_MIN); ++ ++dv.setFloat32(1, FLOAT_MIN_NORMAL); ++Assert["assertEquals(float, float, float)"](dv.getFloat32(1), FLOAT_MIN_NORMAL, FLOAT_MIN); ++dv.setFloat32(1, FLOAT_MIN_NORMAL, true); ++Assert["assertEquals(float, float, float)"](dv.getFloat32(1, true), FLOAT_MIN_NORMAL, FLOAT_MIN); +--- ./nashorn/test/script/basic/dataview_new.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/basic/dataview_new.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,71 @@ ++/* ++ * 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-8015958: DataView constructor is not defined ++ * ++ * @test ++ * @run ++ */ ++ ++// basic DataView constructor checks. ++ ++// check ArrayBufferView property values of DataView instance ++function check(dv, buf, offset, length) { ++ if (dv.buffer !== buf) { ++ fail("DataView.buffer is wrong"); ++ } ++ ++ if (dv.byteOffset != offset) { ++ fail("DataView.byteOffset = " + dv.byteOffset + ", expected " + offset); ++ } ++ ++ if (dv.byteLength != length) { ++ fail("DataView.byteLength = " + dv.byteLength + ", expected " + length); ++ } ++} ++ ++var buffer = new ArrayBuffer(12); ++check(new DataView(buffer), buffer, 0, 12); ++check(new DataView(buffer, 2), buffer, 2, 10); ++check(new DataView(buffer, 4, 8), buffer, 4, 8); ++ ++// make sure expected error is thrown ++function checkError(callback, ErrorType) { ++ try { ++ callback(); ++ fail("Should have thrown " + ErrorType.name); ++ } catch (e) { ++ if (! (e instanceof ErrorType)) { ++ fail("Expected " + ErrorType.name + " got " + e); ++ } ++ } ++} ++ ++// non ArrayBuffer as first arg ++checkError(function() { new DataView(344) }, TypeError); ++ ++// illegal offset/length values ++checkError(function() { new DataView(buffer, -1) }, RangeError); ++checkError(function() { new DataView(buffer, 15) }, RangeError); ++checkError(function() { new DataView(buffer, 1, 32) }, RangeError); +--- ./nashorn/test/script/basic/list.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/basic/list.js Wed Jul 30 03:55:26 2014 -0700 +@@ -33,7 +33,7 @@ + l.add("foo") + l.add("bar") + +-print("l.length=" + l.length) // doesn't work, returns undefined ++print("l.length=" + l.length) // works, maps to l.size() + print("l.size()=" + l.size()) // this will work + + print("l[0]=" + l[0]) +--- ./nashorn/test/script/basic/list.js.EXPECTED Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/basic/list.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -1,5 +1,5 @@ + l.class.name=java.util.ArrayList +-l.length=undefined ++l.length=2 + l.size()=2 + l[0]=foo + l[1]=bar +--- ./nashorn/test/script/currently-failing/gettersetter.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/currently-failing/gettersetter.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @option -Dnashorn.debug=true ++ * @fork ++ */ ++ ++load(__DIR__ + "maputil.js"); ++ ++function Foo() { ++ return { ++ get foo() { return 42; }, ++ set foo(x) {} ++ } ++} ++ ++var obj1 = Foo(); ++var obj2 = Foo(); ++ ++assertSameMap(obj1, obj2, "Object literals before change"); ++ ++Object.defineProperty(obj2, "foo", { get: function() { return 'hello' } }); ++assertSameMap(obj1, obj2); ++ ++Object.defineProperty(obj2, "foo", { set: function(x) { print(x) } }); ++assertSameMap(obj1, obj2); +--- ./nashorn/test/script/error/JDK-8027933.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/error/JDK-8027933.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,31 @@ ++/* ++ * 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-8027933: Add const.as.var option ++ * ++ * @test/compile-error ++ */ ++ ++// without --const-as-var the following should fail to compile ++const THE_ANSWER = 42; +--- ./nashorn/test/script/error/JDK-8027933.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/error/JDK-8027933.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,3 @@ ++test/script/error/JDK-8027933.js:31:0 Expected an operand but found const ++const THE_ANSWER = 42; ++^ +--- ./nashorn/test/script/error/JDK-8039047.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/error/JDK-8039047.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,35 @@ ++/* ++ * 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-8039047: Parser accepts conditional catch clauses even when --no-syntax-extensions / -nse option is passed ++ * ++ * @option --no-syntax-extensions ++ * @test/compile-error ++ */ ++ ++try { ++ func() ++} catch (e if e instanceof ReferenceError) { ++ print("Got ReferenceError " + e); ++} +--- ./nashorn/test/script/error/JDK-8039047.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/error/JDK-8039047.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,6 @@ ++test/script/error/JDK-8039047.js:33:11 Expected ) but found if ++} catch (e if e instanceof ReferenceError) { ++ ^ ++test/script/error/JDK-8039047.js:35:0 Expected eof but found } ++} ++^ +--- ./nashorn/test/script/maptests/builtins.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/maptests/builtins.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,58 @@ ++/* ++ * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @option -Dnashorn.debug=true ++ * @fork ++ */ ++ ++load(__DIR__ + "maputil.js"); ++ ++// check that builtin objects share property map ++ ++assertSameMap(new Boolean(true), new Boolean(false)); ++assertSameMap(new Number(3), new Number(Math.PI)); ++assertSameMap(new String('hello'), new String('world')); ++assertSameMap(new Object(), new Object()); ++assertSameMap(/hello/, /world/); ++// try w/without regexp flags ++assertSameMap(/hello/i, /world/g); ++assertSameMap(new Date(), new Date()); ++assertSameMap(new Date(2000, 1, 1), new Date(1972, 5, 6)); ++assertSameMap(Function(), Function()); ++assertSameMap(Function("x", "return x"), Function("x", "return x*x")); ++assertSameMap(new Error(), new Error()); ++assertSameMap(new Error('foo'), new Error('bar')); ++assertSameMap(new EvalError(), new EvalError()); ++assertSameMap(new EvalError('foo'), new EvalError('bar')); ++assertSameMap(new RangeError(), new RangeError()); ++assertSameMap(new RangeError('foo'), new RangeError('bar')); ++assertSameMap(new ReferenceError(), new ReferenceError()); ++assertSameMap(new ReferenceError('foo'), new ReferenceError('bar')); ++assertSameMap(new SyntaxError(), new SyntaxError()); ++assertSameMap(new SyntaxError('foo'), new SyntaxError('bar')); ++assertSameMap(new TypeError(), new TypeError()); ++assertSameMap(new TypeError('foo'), new TypeError('bar')); ++assertSameMap(new URIError(), new URIError()); ++assertSameMap(new URIError('foo'), new URIError('bar')); +--- ./nashorn/test/script/maptests/constructor.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/maptests/constructor.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,36 @@ ++/* ++ * 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 ++ * @option -Dnashorn.debug=true ++ * @fork ++ */ ++ ++load(__DIR__ + "point.js"); ++ ++// use constructor defined in a different script file ++// These objects should share the map ++assertSameMap(new Point(2, 3), new Point(43, 23)); ++assertSameMap(new Point(), new Point()); ++assertSameMap(new Point(), new Point(3, 1)); +--- ./nashorn/test/script/maptests/maputil.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/maptests/maputil.js Wed Jul 30 03:55:26 2014 -0700 +@@ -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. ++ */ ++ ++/** ++ * @subtest ++ */ ++ ++function assertSameMap(obj1, obj2, msg) { ++ if (! Debug.identical(Debug.map(obj1), Debug.map(obj2))) { ++ fail(obj1.constructor + " instances don't share map"); ++ } ++} ++ ++function assertNotSameMap(obj1, obj2, msg) { ++ if (Debug.identical(Debug.map(obj1), Debug.map(obj2))) { ++ fail(obj1.constructor + " and " + obj2.constructor + " instances share map"); ++ } ++} +--- ./nashorn/test/script/maptests/object_create.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/maptests/object_create.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,40 @@ ++/* ++ * 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 ++ * @option -Dnashorn.debug=true ++ * @fork ++ */ ++ ++load(__DIR__ + "maputil.js"); ++ ++// Objects created by Object.create ++var obj1 = Object.create(Object.prototype); ++var obj2 = Object.create(Object.prototype); ++assertSameMap(obj1, obj2); ++ ++var proto = { foo: 233 }; ++obj1 = Object.create(proto); ++obj2 = Object.create(proto); ++assertSameMap(obj1, obj2); +--- ./nashorn/test/script/maptests/object_literals.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/maptests/object_literals.js Wed Jul 30 03:55:26 2014 -0700 +@@ -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 ++ * @option -Dnashorn.debug=true ++ * @fork ++ */ ++ ++load(__DIR__ + "maputil.js"); ++ ++// Object literals created at the same callsite ++function makeObject() { ++ return { foo: 34 } ++} ++assertSameMap(makeObject(), makeObject()); ++ ++function makeObject2() { ++ return { foo: 42, bar: 'hello' } ++} ++assertSameMap(makeObject2(), makeObject2()); ++ ++// Object literals created at different callsites ++assertSameMap({}, {}); ++assertSameMap({foo: 4}, {foo: 'hello'}); ++assertSameMap({foo: 34, bar: 'fdgd'}, {foo: 'world', bar: 54}); +--- ./nashorn/test/script/maptests/point.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/maptests/point.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,49 @@ ++/* ++ * 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. ++ */ ++ ++ ++/** ++ * @subtest ++ */ ++ ++function Point(x, y) { ++ this.x =x; this.y =y; ++} ++ ++Point.prototype.toString = function() { ++ return "(" + this.x + "," + this.y + ")"; ++} ++ ++Point.prototype.modulus = function() { ++ return Math.sqrt(this.x*this.x + this.y*this.y); ++} ++ ++Point.prototype.argument = function() { ++ return Math.atan2(this.y, this.x); ++} ++ ++load(__DIR__ + "maputil.js"); ++ ++assertSameMap(new Point(2, 3), new Point(43, 23)); ++assertSameMap(new Point(), new Point()); ++assertSameMap(new Point(), new Point(3, 1)); +--- ./nashorn/test/script/maptests/property_add.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/maptests/property_add.js Wed Jul 30 03:55:26 2014 -0700 +@@ -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 ++ * @option -Dnashorn.debug=true ++ * @fork ++ */ ++ ++load(__DIR__ + "maputil.js"); ++ ++function Foo() {} ++ ++var obj1 = new Foo(); ++var obj2 = new Foo(); ++ ++assertSameMap(obj1, obj2); ++ ++// property addition at same callsite ++function addX(obj, val) { ++ obj.x = val; ++} ++addX(obj1, 3); ++addX(obj2, 'hello'); ++ ++assertSameMap(obj1, obj2); +--- ./nashorn/test/script/maptests/property_delete.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/maptests/property_delete.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * @test ++ * @option -Dnashorn.debug=true ++ * @fork ++ */ ++ ++load(__DIR__ + "maputil.js"); ++ ++function Foo() { ++ this.x = 33; ++} ++ ++var obj1 = new Foo(); ++var obj2 = new Foo(); ++ ++assertSameMap(obj1, obj2); ++ ++// property deletion at same callsite ++function deleteX(obj) { ++ delete obj.x; ++} ++deleteX(obj1); ++deleteX(obj2); ++ ++assertSameMap(obj1, obj2); +--- ./nashorn/test/script/maptests/proto.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/maptests/proto.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,56 @@ ++/* ++ * 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 ++ * @option -Dnashorn.debug=true ++ * @fork ++ */ ++ ++load(__DIR__ + "maputil.js"); ++ ++// add/delete property to proto (direct/indirect) should ++// not affect the property map of the objects ++ ++var proto2 = { foo: 334 } ++var proto = Object.create(proto2); ++proto.bar = "hello"; ++ ++var obj1 = Object.create(proto); ++var obj2 = Object.create(proto); ++ ++assertSameMap(obj1, obj2); ++ ++proto.newX = 'world'; ++assertSameMap(obj1, obj2); ++ ++delete proto.newX; ++assertSameMap(obj1, obj2); ++ ++proto2.newX = "foo"; ++assertSameMap(obj1, obj2); ++ ++delete proto2.newX; ++assertSameMap(obj1, obj2); ++ ++ +--- ./nashorn/test/script/nosecurity/JDK-8044798.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/nosecurity/JDK-8044798.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,159 @@ ++/* ++ * 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-8044798: API for debugging Nashorn ++ * ++ * @test ++ * @run ++ */ ++ ++// basic API exercise checks ++ ++var Arrays = Java.type("java.util.Arrays"); ++var CharArray = Java.type("char[]"); ++var DebuggerSupport = Java.type("jdk.nashorn.internal.runtime.DebuggerSupport"); ++var DebuggerValueDesc = Java.type("jdk.nashorn.internal.runtime.DebuggerSupport.DebuggerValueDesc"); ++ ++var valueDescFields = DebuggerValueDesc.class.declaredFields; ++Arrays.sort(valueDescFields, function(f1, f2) f1.name.compareTo(f2.name)); ++var keyField; ++for each (var f in valueDescFields) { ++ if (f.name == "key") { ++ keyField = f; ++ } ++ f.accessible = true; ++} ++ ++var debuggerSupportMethods = DebuggerSupport.class.declaredMethods; ++ ++// methods of DebuggerSupport that we use ++var evalMethod, valueInfoMethod, valueInfosMethod; ++var getSourceInfoMethod, valueAsStringMethod; ++ ++for each (var m in debuggerSupportMethods) { ++ m.accessible = true; ++ switch (m.name) { ++ case "eval": ++ evalMethod = m; ++ break; ++ case "valueInfo": ++ if (m.parameterCount == 3) { ++ valueInfoMethod = m; ++ } ++ break; ++ case "valueInfos": ++ valueInfosMethod = m; ++ break; ++ case "valueAsString": ++ valueAsStringMethod = m; ++ break; ++ case "getSourceInfo": ++ getSourceInfoMethod = m; ++ break; ++ } ++} ++ ++// eval ++var value = evalMethod.invoke(null, null, null, "33 + 55", false); ++print(value); ++ ++// valueInfo ++var info = valueInfoMethod.invoke(null, "apply", Function, true); ++for each (var f in valueDescFields) { ++ print(f.name, "=", f.get(info)); ++} ++ ++// valueInfo - user defined object ++var info = valueInfoMethod.invoke(null, "foo", { foo: 343 }, true); ++for each (var f in valueDescFields) { ++ print(f.name, "=", f.get(info)); ++} ++ ++// valueInfos ++var infos = valueInfosMethod.invoke(null, Object, true); ++Arrays.sort(infos, function (i1, i2) keyField.get(i1).compareTo(keyField.get(i2))); ++ ++for each (var info in infos) { ++ for each (var f in valueDescFields) { ++ print(f.name, "=", f.get(info)); ++ } ++} ++ ++// valueInfos - user defined object ++var infos = valueInfosMethod.invoke(null, { foo: 34, bar: "hello" }, true); ++Arrays.sort(infos, function (i1, i2) keyField.get(i1).compareTo(keyField.get(i2))); ++ ++for each (var info in infos) { ++ for each (var f in valueDescFields) { ++ print(f.name, "=", f.get(info)); ++ } ++} ++ ++// valueAsString ++function printValue(value) { ++ print(valueAsStringMethod.invoke(null, value)); ++} ++ ++printValue(undefined); ++printValue(null); ++printValue("hello"); ++printValue(Math.PI); ++printValue(this); ++ ++// The below are not part of DebuggerSupport. But we need these to ++// test DebuggerSupport.getSourceInfo etc. which need compiled script class ++ ++var Source = Java.type("jdk.nashorn.internal.runtime.Source"); ++var Context = Java.type("jdk.nashorn.internal.runtime.Context"); ++var sourceCls = Source.class; ++var errorMgrCls = Java.type("jdk.nashorn.internal.runtime.ErrorManager").class; ++var booleanCls = Java.type("java.lang.Boolean").TYPE; ++ ++// private compile method of Context class ++var compileMethod = Context.class.getDeclaredMethod("compile", ++ sourceCls, errorMgrCls, booleanCls); ++compileMethod.accessible = true; ++ ++var scriptCls = compileMethod.invoke(Context.context, ++ Source.sourceFor("test", "print('hello')"), ++ new Context.ThrowErrorManager(), false); ++ ++var SCRIPT_CLASS_NAME_PREFIX = "jdk.nashorn.internal.scripts.Script$"; ++print("script class name pattern satisfied? " + ++ scriptCls.name.startsWith(SCRIPT_CLASS_NAME_PREFIX)); ++ ++var srcInfo = getSourceInfoMethod.invoke(null, scriptCls); ++var srcInfoFields = srcInfo.class.declaredFields; ++Arrays.sort(srcInfoFields, function(f1, f2) f1.name.compareTo(f2.name)); ++ ++print("Source info"); ++for each (var f in srcInfoFields) { ++ f.accessible = true; ++ var fieldValue = f.get(srcInfo); ++ if (fieldValue instanceof CharArray) { ++ fieldValue = new java.lang.String(fieldValue); ++ } ++ ++ print(f.name, "=", fieldValue); ++} +--- ./nashorn/test/script/nosecurity/JDK-8044798.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/nosecurity/JDK-8044798.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,104 @@ ++88 ++expandable = false ++key = apply ++valueAsObject = function Function() { [native code] } ++valueAsString = function Function() { [native code] } ++expandable = true ++key = foo ++valueAsObject = [object Object] ++valueAsString = {foo: 343} ++expandable = false ++key = bindProperties ++valueAsObject = function bindProperties() { [native code] } ++valueAsString = function bindProperties() { [native code] } ++expandable = false ++key = create ++valueAsObject = function create() { [native code] } ++valueAsString = function create() { [native code] } ++expandable = false ++key = defineProperties ++valueAsObject = function defineProperties() { [native code] } ++valueAsString = function defineProperties() { [native code] } ++expandable = false ++key = defineProperty ++valueAsObject = function defineProperty() { [native code] } ++valueAsString = function defineProperty() { [native code] } ++expandable = false ++key = freeze ++valueAsObject = function freeze() { [native code] } ++valueAsString = function freeze() { [native code] } ++expandable = false ++key = getOwnPropertyDescriptor ++valueAsObject = function getOwnPropertyDescriptor() { [native code] } ++valueAsString = function getOwnPropertyDescriptor() { [native code] } ++expandable = false ++key = getOwnPropertyNames ++valueAsObject = function getOwnPropertyNames() { [native code] } ++valueAsString = function getOwnPropertyNames() { [native code] } ++expandable = false ++key = getPrototypeOf ++valueAsObject = function getPrototypeOf() { [native code] } ++valueAsString = function getPrototypeOf() { [native code] } ++expandable = false ++key = isExtensible ++valueAsObject = function isExtensible() { [native code] } ++valueAsString = function isExtensible() { [native code] } ++expandable = false ++key = isFrozen ++valueAsObject = function isFrozen() { [native code] } ++valueAsString = function isFrozen() { [native code] } ++expandable = false ++key = isSealed ++valueAsObject = function isSealed() { [native code] } ++valueAsString = function isSealed() { [native code] } ++expandable = false ++key = keys ++valueAsObject = function keys() { [native code] } ++valueAsString = function keys() { [native code] } ++expandable = false ++key = length ++valueAsObject = 1 ++valueAsString = 1 ++expandable = false ++key = name ++valueAsObject = Object ++valueAsString = "Object" ++expandable = false ++key = preventExtensions ++valueAsObject = function preventExtensions() { [native code] } ++valueAsString = function preventExtensions() { [native code] } ++expandable = false ++key = prototype ++valueAsObject = [object Object] ++valueAsString = {toString: function toString() { [native code] }, toLocaleString: function toLocaleString() { [native code] }, valueOf: function valueOf() { [native code] }, hasOwnProperty: function hasOwnProperty() { [native code] }, isPrototypeOf: function isPrototypeOf() { [native code] }, propertyIsEnumerable: function propertyIsEnumerable() { [native code] }, constructor: function Object() { [native code] }, __proto__: null} ++expandable = false ++key = seal ++valueAsObject = function seal() { [native code] } ++valueAsString = function seal() { [native code] } ++expandable = false ++key = setIndexedPropertiesToExternalArrayData ++valueAsObject = function setIndexedPropertiesToExternalArrayData() { [native code] } ++valueAsString = function setIndexedPropertiesToExternalArrayData() { [native code] } ++expandable = false ++key = setPrototypeOf ++valueAsObject = function setPrototypeOf() { [native code] } ++valueAsString = function setPrototypeOf() { [native code] } ++expandable = false ++key = bar ++valueAsObject = hello ++valueAsString = "hello" ++expandable = false ++key = foo ++valueAsObject = 34 ++valueAsString = 34 ++undefined ++null ++"hello" ++3.141592653589793 ++[object global] ++script class name pattern satisfied? true ++Source info ++content = print('hello') ++hash = 1655359881 ++name = test ++url = null +--- ./nashorn/test/script/nosecurity/debuggersupportapi.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/nosecurity/debuggersupportapi.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,94 @@ ++/* ++ * 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-8044798: API for debugging Nashorn ++ * ++ * @test ++ * @run ++ */ ++ ++// Basic API class, method, field existence checks. ++ ++// The following classes and the associated methods and fields are used as ++// private debugger interface. Though private/implementation defined, nashorn ++// code should not be changed to remove these classes, fields and methods. ++// The test takes signatures of debugger interface and stores in .EXPECTED file. ++// If any incompatible change is made to nashorn to break any of these, this ++// test will fail. ++ ++var Arrays = Java.type("java.util.Arrays"); ++var DebuggerSupport = Java.type("jdk.nashorn.internal.runtime.DebuggerSupport"); ++ ++print(DebuggerSupport.class); ++print(); ++var methods = DebuggerSupport.class.declaredMethods; ++Arrays.sort(methods, function(m1, m2) m1.name.compareTo(m2.name)); ++for each (var mth in methods) { ++ switch (mth.name) { ++ case "eval": ++ case "notifyInvoke": ++ case "getSourceInfo": ++ case "valueAsString": ++ case "valueInfos": ++ print(mth); ++ break; ++ case "valueInfo": ++ if (mth.parameterCount == 3) { ++ print(mth); ++ } ++ break; ++ } ++} ++print(); ++ ++var DebuggerValueDesc = Java.type("jdk.nashorn.internal.runtime.DebuggerSupport.DebuggerValueDesc"); ++print(DebuggerValueDesc.class); ++print(); ++var fields = DebuggerValueDesc.class.declaredFields; ++Arrays.sort(fields, function(f1, f2) f1.name.compareTo(f2.name)); ++for each (var fld in fields) { ++ switch (fld.name) { ++ case "key": ++ case "expandable": ++ case "valueAsObject": ++ case "valueAsString": ++ print(fld); ++ } ++} ++print(); ++ ++var SourceInfo = Java.type("jdk.nashorn.internal.runtime.DebuggerSupport.SourceInfo"); ++print(SourceInfo.class); ++print(); ++var fields = SourceInfo.class.declaredFields; ++Arrays.sort(fields, function(f1, f2) f1.name.compareTo(f2.name)); ++for each (var fld in fields) { ++ switch (fld.name) { ++ case "name": ++ case "hash": ++ case "url": ++ case "content": ++ print(fld); ++ } ++} +--- ./nashorn/test/script/nosecurity/debuggersupportapi.js.EXPECTED Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/nosecurity/debuggersupportapi.js.EXPECTED Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,22 @@ ++class jdk.nashorn.internal.runtime.DebuggerSupport ++ ++static java.lang.Object jdk.nashorn.internal.runtime.DebuggerSupport.eval(jdk.nashorn.internal.runtime.ScriptObject,java.lang.Object,java.lang.String,boolean) ++static jdk.nashorn.internal.runtime.DebuggerSupport$SourceInfo jdk.nashorn.internal.runtime.DebuggerSupport.getSourceInfo(java.lang.Class) ++static void jdk.nashorn.internal.runtime.DebuggerSupport.notifyInvoke(java.lang.invoke.MethodHandle) ++static java.lang.String jdk.nashorn.internal.runtime.DebuggerSupport.valueAsString(java.lang.Object) ++static jdk.nashorn.internal.runtime.DebuggerSupport$DebuggerValueDesc jdk.nashorn.internal.runtime.DebuggerSupport.valueInfo(java.lang.String,java.lang.Object,boolean) ++static jdk.nashorn.internal.runtime.DebuggerSupport$DebuggerValueDesc[] jdk.nashorn.internal.runtime.DebuggerSupport.valueInfos(java.lang.Object,boolean) ++ ++class jdk.nashorn.internal.runtime.DebuggerSupport$DebuggerValueDesc ++ ++final boolean jdk.nashorn.internal.runtime.DebuggerSupport$DebuggerValueDesc.expandable ++final java.lang.String jdk.nashorn.internal.runtime.DebuggerSupport$DebuggerValueDesc.key ++final java.lang.Object jdk.nashorn.internal.runtime.DebuggerSupport$DebuggerValueDesc.valueAsObject ++final java.lang.String jdk.nashorn.internal.runtime.DebuggerSupport$DebuggerValueDesc.valueAsString ++ ++class jdk.nashorn.internal.runtime.DebuggerSupport$SourceInfo ++ ++final char[] jdk.nashorn.internal.runtime.DebuggerSupport$SourceInfo.content ++final int jdk.nashorn.internal.runtime.DebuggerSupport$SourceInfo.hash ++final java.lang.String jdk.nashorn.internal.runtime.DebuggerSupport$SourceInfo.name ++final java.net.URL jdk.nashorn.internal.runtime.DebuggerSupport$SourceInfo.url +--- ./nashorn/test/script/nosecurity/nosecurity.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/nosecurity/nosecurity.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,34 @@ ++/* ++ * 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. ++ */ ++ ++/** ++ * 8043443: Test framework changes to run script tests without security manager ++ * @test ++ * @run ++ */ ++ ++var System = Java.type("java.lang.System"); ++ ++if (System.securityManager != null) { ++ fail("SecurityManager is set!"); ++} +--- ./nashorn/test/script/sandbox/JDK-8031106.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/sandbox/JDK-8031106.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,39 @@ ++/* ++ * Copyright (c) 2010, 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-8031106: Nashorn: IndexOutOfBoundsException in NashornCallSiteDescriptor.getNameToken() ++ * ++ * @test ++ * @run ++ */ ++ ++var cl = new java.lang.Object().getClass(); ++try { ++ cl["forName"]; ++ fail("Should have thrown exception!"); ++} catch (e) { ++ if (! (e instanceof java.lang.SecurityException)) { ++ fail("SecurityException expected, got " + e); ++ } ++} +--- ./nashorn/test/script/sandbox/safeprops.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/sandbox/safeprops.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,65 @@ ++/* ++ * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/** ++ * Try to access System properties safe to read for any code. ++ * No security exception expected. ++ * ++ * @test ++ * @security ++ * @run ++ * @bug 8033924: Default permissions are not given for eval code ++ */ ++ ++var propNames = [ ++ "java.version", ++ "java.vendor", ++ "java.vendor.url", ++ "java.class.version", ++ "os.name", ++ "os.version", ++ "os.arch", ++ "file.separator", ++ "path.separator", ++ "line.separator", ++ "java.specification.version", ++ "java.specification.vendor", ++ "java.specification.name", ++ "java.vm.specification.version", ++ "java.vm.specification.vendor", ++ "java.vm.specification.name", ++ "java.vm.version", ++ "java.vm.vendor", ++ "java.vm.name" ++]; ++ ++// no security exception expected ++for (var p in propNames) { ++ java.lang.System.getProperty(propNames[p]); ++} ++ ++// no security exception expected ++for (var p in propNames) { ++ var name = propNames[p]; ++ eval('java.lang.System.getProperty(name)'); ++} +--- ./nashorn/test/script/trusted/JDK-8006529.js Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/script/trusted/JDK-8006529.js Wed Jul 30 03:55:26 2014 -0700 +@@ -113,7 +113,7 @@ + var getContextMethod = Context.class.getMethod("getContext") + var getEnvMethod = Context.class.getMethod("getEnv") + +-var SourceConstructor = Source.class.getConstructor(java.lang.String.class, java.lang.String.class) ++var sourceForMethod = Source.class.getMethod("sourceFor", java.lang.String.class, java.lang.String.class) + var ParserConstructor = Parser.class.getConstructor(ScriptEnvironment.class, Source.class, ErrorManager.class) + var CompilerConstructor = Compiler.class.getConstructor(ScriptEnvironment.class) + +@@ -121,7 +121,7 @@ + // source code, returns a jdk.nashorn.internal.ir.FunctionNode object + // representing it. + function compile(source) { +- var source = SourceConstructor.newInstance("", source); ++ var source = sourceForMethod.invoke(null, "", source); + + var env = getEnvMethod.invoke(getContextMethod.invoke(null)) + +--- ./nashorn/test/script/trusted/JDK-8032060.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/script/trusted/JDK-8032060.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,72 @@ ++/* ++ * 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-8032060: PropertyMap of Error objects is not stable ++ * ++ * @test ++ * @option -Dnashorn.debug=true ++ * @fork ++ * @run ++ */ ++ ++function checkMap(e1, e2) { ++ if (! Debug.identical(Debug.map(e1), Debug.map(e2))) { ++ fail("e1 and e2 have different maps"); ++ } ++ ++ var m1, m2; ++ ++ try { ++ throw e1 ++ } catch (e) { ++ m1 = Debug.map(e) ++ } ++ ++ try { ++ throw e2 ++ } catch (e) { ++ m2 = Debug.map(e) ++ } ++ ++ if (! Debug.identical(m1, m2)) { ++ fail("e1 and e2 have different maps after being thrown"); ++ } ++} ++ ++checkMap(new Error(), new Error()); ++checkMap(new EvalError(), new EvalError()); ++checkMap(new RangeError(), new RangeError()); ++checkMap(new ReferenceError(), new ReferenceError()); ++checkMap(new SyntaxError(), new SyntaxError()); ++checkMap(new TypeError(), new TypeError()); ++checkMap(new URIError(), new URIError()); ++ ++// now try with message param ++checkMap(new Error("x"), new Error("y")); ++checkMap(new EvalError("x"), new EvalError("y")); ++checkMap(new RangeError("x"), new RangeError("y")); ++checkMap(new ReferenceError("x"), new ReferenceError("y")); ++checkMap(new SyntaxError("x"), new SyntaxError("y")); ++checkMap(new TypeError("x"), new TypeError("y")); ++checkMap(new URIError("x"), new URIError("y")); +--- ./nashorn/test/src/jdk/nashorn/api/scripting/InvocableTest.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/api/scripting/InvocableTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -26,6 +26,7 @@ + package jdk.nashorn.api.scripting; + + import java.util.Objects; ++import java.util.function.Function; + import javax.script.Invocable; + import javax.script.ScriptContext; + import javax.script.ScriptEngine; +@@ -522,4 +523,16 @@ + Assert.assertEquals(itf.test1(42, "a", "b"), "i == 42, strings instanceof java.lang.String[] == true, strings == [a, b]"); + Assert.assertEquals(itf.test2(44, "c", "d", "e"), "arguments[0] == 44, arguments[1] instanceof java.lang.String[] == true, arguments[1] == [c, d, e]"); + } ++ ++ @Test ++ @SuppressWarnings("unchecked") ++ public void defaultMethodTest() throws ScriptException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ final Invocable inv = (Invocable) e; ++ ++ Object obj = e.eval("({ apply: function(arg) { return arg.toUpperCase(); }})"); ++ Function func = inv.getInterface(obj, Function.class); ++ assertEquals(func.apply("hello"), "HELLO"); ++ } + } +--- ./nashorn/test/src/jdk/nashorn/api/scripting/ScopeTest.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/api/scripting/ScopeTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -245,4 +245,337 @@ + sb.put("x", "newX"); + assertTrue(e.eval("x", ctx).equals("newX")); + } ++ ++ /** ++ * Test multi-threaded access to defined global variables for shared script classes with multiple globals. ++ */ ++ @Test ++ public static void multiThreadedVarTest() throws ScriptException, InterruptedException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ final Bindings b = e.createBindings(); ++ final ScriptContext origContext = e.getContext(); ++ final ScriptContext newCtxt = new SimpleScriptContext(); ++ newCtxt.setBindings(b, ScriptContext.ENGINE_SCOPE); ++ final String sharedScript = "foo"; ++ ++ assertEquals(e.eval("var foo = 'original context';", origContext), null); ++ assertEquals(e.eval("var foo = 'new context';", newCtxt), null); ++ ++ final Thread t1 = new Thread(new ScriptRunner(e, origContext, sharedScript, "original context", 1000)); ++ final Thread t2 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, "new context", 1000)); ++ t1.start(); ++ t2.start(); ++ t1.join(); ++ t2.join(); ++ ++ assertEquals(e.eval("var foo = 'newer context';", newCtxt), null); ++ final Thread t3 = new Thread(new ScriptRunner(e, origContext, sharedScript, "original context", 1000)); ++ final Thread t4 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, "newer context", 1000)); ++ ++ t3.start(); ++ t4.start(); ++ t3.join(); ++ t4.join(); ++ ++ assertEquals(e.eval(sharedScript), "original context"); ++ assertEquals(e.eval(sharedScript, newCtxt), "newer context"); ++ } ++ ++ /** ++ * Test multi-threaded access to undefined global variables for shared script classes with multiple globals. ++ */ ++ @Test ++ public static void multiThreadedGlobalTest() throws ScriptException, InterruptedException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ final Bindings b = e.createBindings(); ++ final ScriptContext origContext = e.getContext(); ++ final ScriptContext newCtxt = new SimpleScriptContext(); ++ newCtxt.setBindings(b, ScriptContext.ENGINE_SCOPE); ++ ++ assertEquals(e.eval("foo = 'original context';", origContext), "original context"); ++ assertEquals(e.eval("foo = 'new context';", newCtxt), "new context"); ++ final String sharedScript = "foo"; ++ ++ final Thread t1 = new Thread(new ScriptRunner(e, origContext, sharedScript, "original context", 1000)); ++ final Thread t2 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, "new context", 1000)); ++ t1.start(); ++ t2.start(); ++ t1.join(); ++ t2.join(); ++ ++ Object obj3 = e.eval("delete foo; foo = 'newer context';", newCtxt); ++ assertEquals(obj3, "newer context"); ++ final Thread t3 = new Thread(new ScriptRunner(e, origContext, sharedScript, "original context", 1000)); ++ final Thread t4 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, "newer context", 1000)); ++ ++ t3.start(); ++ t4.start(); ++ t3.join(); ++ t4.join(); ++ ++ Assert.assertEquals(e.eval(sharedScript), "original context"); ++ Assert.assertEquals(e.eval(sharedScript, newCtxt), "newer context"); ++ } ++ ++ /** ++ * Test multi-threaded access using the postfix ++ operator for shared script classes with multiple globals. ++ */ ++ @Test ++ public static void multiThreadedIncTest() throws ScriptException, InterruptedException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ final Bindings b = e.createBindings(); ++ final ScriptContext origContext = e.getContext(); ++ final ScriptContext newCtxt = new SimpleScriptContext(); ++ newCtxt.setBindings(b, ScriptContext.ENGINE_SCOPE); ++ ++ assertEquals(e.eval("var x = 0;", origContext), null); ++ assertEquals(e.eval("var x = 2;", newCtxt), null); ++ final String sharedScript = "x++;"; ++ ++ final Thread t1 = new Thread(new Runnable() { ++ @Override ++ public void run() { ++ try { ++ for (int i = 0; i < 1000; i++) { ++ assertEquals(e.eval(sharedScript, origContext), (double)i); ++ } ++ } catch (ScriptException se) { ++ fail(se.toString()); ++ } ++ } ++ }); ++ final Thread t2 = new Thread(new Runnable() { ++ @Override ++ public void run() { ++ try { ++ for (int i = 2; i < 1000; i++) { ++ assertEquals(e.eval(sharedScript, newCtxt), (double)i); ++ } ++ } catch (ScriptException se) { ++ fail(se.toString()); ++ } ++ } ++ }); ++ t1.start(); ++ t2.start(); ++ t1.join(); ++ t2.join(); ++ } ++ ++ /** ++ * Test multi-threaded access to primitive prototype properties for shared script classes with multiple globals. ++ */ ++ @Test ++ public static void multiThreadedPrimitiveTest() throws ScriptException, InterruptedException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ final Bindings b = e.createBindings(); ++ final ScriptContext origContext = e.getContext(); ++ final ScriptContext newCtxt = new SimpleScriptContext(); ++ newCtxt.setBindings(b, ScriptContext.ENGINE_SCOPE); ++ ++ Object obj1 = e.eval("String.prototype.foo = 'original context';", origContext); ++ Object obj2 = e.eval("String.prototype.foo = 'new context';", newCtxt); ++ assertEquals(obj1, "original context"); ++ assertEquals(obj2, "new context"); ++ final String sharedScript = "''.foo"; ++ ++ final Thread t1 = new Thread(new ScriptRunner(e, origContext, sharedScript, "original context", 1000)); ++ final Thread t2 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, "new context", 1000)); ++ t1.start(); ++ t2.start(); ++ t1.join(); ++ t2.join(); ++ ++ Object obj3 = e.eval("delete String.prototype.foo; Object.prototype.foo = 'newer context';", newCtxt); ++ assertEquals(obj3, "newer context"); ++ final Thread t3 = new Thread(new ScriptRunner(e, origContext, sharedScript, "original context", 1000)); ++ final Thread t4 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, "newer context", 1000)); ++ ++ t3.start(); ++ t4.start(); ++ t3.join(); ++ t4.join(); ++ ++ Assert.assertEquals(e.eval(sharedScript), "original context"); ++ Assert.assertEquals(e.eval(sharedScript, newCtxt), "newer context"); ++ } ++ ++ /** ++ * Test multi-threaded scope function invocation for shared script classes with multiple globals. ++ */ ++ @Test ++ public static void multiThreadedFunctionTest() throws ScriptException, InterruptedException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ final Bindings b = e.createBindings(); ++ final ScriptContext origContext = e.getContext(); ++ final ScriptContext newCtxt = new SimpleScriptContext(); ++ newCtxt.setBindings(b, ScriptContext.ENGINE_SCOPE); ++ ++ e.eval(new URLReader(ScopeTest.class.getResource("resources/func.js")), origContext); ++ assertEquals(origContext.getAttribute("scopeVar"), 1); ++ assertEquals(e.eval("scopeTest()"), 1); ++ ++ e.eval(new URLReader(ScopeTest.class.getResource("resources/func.js")), newCtxt); ++ assertEquals(newCtxt.getAttribute("scopeVar"), 1); ++ assertEquals(e.eval("scopeTest();", newCtxt), 1); ++ ++ assertEquals(e.eval("scopeVar = 3;", newCtxt), 3); ++ assertEquals(newCtxt.getAttribute("scopeVar"), 3); ++ ++ ++ final Thread t1 = new Thread(new ScriptRunner(e, origContext, "scopeTest()", 1, 1000)); ++ final Thread t2 = new Thread(new ScriptRunner(e, newCtxt, "scopeTest()", 3, 1000)); ++ ++ t1.start(); ++ t2.start(); ++ t1.join(); ++ t2.join(); ++ ++ } ++ ++ /** ++ * Test multi-threaded access to global getters and setters for shared script classes with multiple globals. ++ */ ++ @Test ++ public static void getterSetterTest() throws ScriptException, InterruptedException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ final Bindings b = e.createBindings(); ++ final ScriptContext origContext = e.getContext(); ++ final ScriptContext newCtxt = new SimpleScriptContext(); ++ newCtxt.setBindings(b, ScriptContext.ENGINE_SCOPE); ++ final String sharedScript = "accessor1"; ++ ++ e.eval(new URLReader(ScopeTest.class.getResource("resources/gettersetter.js")), origContext); ++ assertEquals(e.eval("accessor1 = 1;"), 1); ++ assertEquals(e.eval(sharedScript), 1); ++ ++ e.eval(new URLReader(ScopeTest.class.getResource("resources/gettersetter.js")), newCtxt); ++ assertEquals(e.eval("accessor1 = 2;", newCtxt), 2); ++ assertEquals(e.eval(sharedScript, newCtxt), 2); ++ ++ ++ final Thread t1 = new Thread(new ScriptRunner(e, origContext, sharedScript, 1, 1000)); ++ final Thread t2 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, 2, 1000)); ++ ++ t1.start(); ++ t2.start(); ++ t1.join(); ++ t2.join(); ++ ++ assertEquals(e.eval(sharedScript), 1); ++ assertEquals(e.eval(sharedScript, newCtxt), 2); ++ assertEquals(e.eval("v"), 1); ++ assertEquals(e.eval("v", newCtxt), 2); ++ } ++ ++ /** ++ * Test multi-threaded access to global getters and setters for shared script classes with multiple globals. ++ */ ++ @Test ++ public static void getterSetter2Test() throws ScriptException, InterruptedException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ final Bindings b = e.createBindings(); ++ final ScriptContext origContext = e.getContext(); ++ final ScriptContext newCtxt = new SimpleScriptContext(); ++ newCtxt.setBindings(b, ScriptContext.ENGINE_SCOPE); ++ final String sharedScript = "accessor2"; ++ ++ e.eval(new URLReader(ScopeTest.class.getResource("resources/gettersetter.js")), origContext); ++ assertEquals(e.eval("accessor2 = 1;"), 1); ++ assertEquals(e.eval(sharedScript), 1); ++ ++ e.eval(new URLReader(ScopeTest.class.getResource("resources/gettersetter.js")), newCtxt); ++ assertEquals(e.eval("accessor2 = 2;", newCtxt), 2); ++ assertEquals(e.eval(sharedScript, newCtxt), 2); ++ ++ ++ final Thread t1 = new Thread(new ScriptRunner(e, origContext, sharedScript, 1, 1000)); ++ final Thread t2 = new Thread(new ScriptRunner(e, newCtxt, sharedScript, 2, 1000)); ++ ++ t1.start(); ++ t2.start(); ++ t1.join(); ++ t2.join(); ++ ++ assertEquals(e.eval(sharedScript), 1); ++ assertEquals(e.eval(sharedScript, newCtxt), 2); ++ assertEquals(e.eval("x"), 1); ++ assertEquals(e.eval("x", newCtxt), 2); ++ } ++ ++ // @bug 8044750: megamorphic getter for scope objects does not call __noSuchProperty__ hook ++ @Test ++ public static void testMegamorphicGetInGlobal() throws Exception { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine engine = m.getEngineByName("nashorn"); ++ final String script = "foo"; ++ // "foo" is megamorphic because of different global scopes. ++ // Make sure ScriptContext variable search works even after ++ // it becomes megamorphic. ++ for (int index = 0; index < 25; index++) { ++ final Bindings bindings = new SimpleBindings(); ++ bindings.put("foo", index); ++ final Number value = (Number)engine.eval(script, bindings); ++ assertEquals(index, value.intValue()); ++ } ++ } ++ ++ /** ++ * Test "slow" scopes involving {@code with} and {@code eval} statements for shared script classes with multiple globals. ++ */ ++ @Test ++ public static void testSlowScope() throws ScriptException, InterruptedException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ ++ for (int i = 0; i < 100; i++) { ++ final Bindings b = e.createBindings(); ++ final ScriptContext ctxt = new SimpleScriptContext(); ++ ctxt.setBindings(b, ScriptContext.ENGINE_SCOPE); ++ ++ e.eval(new URLReader(ScopeTest.class.getResource("resources/witheval.js")), ctxt); ++ assertEquals(e.eval("a", ctxt), 1); ++ assertEquals(b.get("a"), 1); ++ assertEquals(e.eval("b", ctxt), 3); ++ assertEquals(b.get("b"), 3); ++ assertEquals(e.eval("c", ctxt), 10); ++ assertEquals(b.get("c"), 10); ++ } ++ } ++ ++ private static class ScriptRunner implements Runnable { ++ ++ final ScriptEngine engine; ++ final ScriptContext context; ++ final String source; ++ final Object expected; ++ final int iterations; ++ ++ ScriptRunner(final ScriptEngine engine, final ScriptContext context, final String source, final Object expected, final int iterations) { ++ this.engine = engine; ++ this.context = context; ++ this.source = source; ++ this.expected = expected; ++ this.iterations = iterations; ++ } ++ ++ @Override ++ public void run() { ++ try { ++ for (int i = 0; i < iterations; i++) { ++ assertEquals(engine.eval(source, context), expected); ++ } ++ } catch (ScriptException se) { ++ throw new RuntimeException(se); ++ } ++ } ++ } ++ + } +--- ./nashorn/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -560,6 +560,47 @@ + assertTrue(reached[0]); + } + ++ // properties that can be read by any code ++ private static String[] propNames = { ++ "java.version", ++ "java.vendor", ++ "java.vendor.url", ++ "java.class.version", ++ "os.name", ++ "os.version", ++ "os.arch", ++ "file.separator", ++ "path.separator", ++ "line.separator", ++ "java.specification.version", ++ "java.specification.vendor", ++ "java.specification.name", ++ "java.vm.specification.version", ++ "java.vm.specification.vendor", ++ "java.vm.specification.name", ++ "java.vm.version", ++ "java.vm.vendor", ++ "java.vm.name" ++ }; ++ ++ // @bug 8033924: Default permissions are not given for eval code ++ @Test ++ public void checkPropertyReadPermissions() throws ScriptException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ ++ for (final String name : propNames) { ++ checkProperty(e, name); ++ } ++ } ++ ++ private static void checkProperty(final ScriptEngine e, final String name) ++ throws ScriptException { ++ String value = System.getProperty(name); ++ e.put("name", name); ++ assertEquals(value, e.eval("java.lang.System.getProperty(name)")); ++ } ++ + private static final String LINE_SEPARATOR = System.getProperty("line.separator"); + + // Returns String that would be the result of calling PrintWriter.println +--- ./nashorn/test/src/jdk/nashorn/api/scripting/ScriptObjectMirrorTest.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/api/scripting/ScriptObjectMirrorTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,9 +25,12 @@ + + package jdk.nashorn.api.scripting; + ++import java.nio.ByteBuffer; + import java.util.HashMap; + import java.util.List; + import java.util.Map; ++import javax.script.Bindings; ++import javax.script.ScriptContext; + import javax.script.ScriptEngine; + import javax.script.ScriptEngineManager; + import javax.script.ScriptException; +@@ -230,6 +233,29 @@ + } + + @Test ++ public void indexPropertiesExternalBufferTest() throws ScriptException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine e = m.getEngineByName("nashorn"); ++ final ScriptObjectMirror obj = (ScriptObjectMirror)e.eval("var obj = {}; obj"); ++ final ByteBuffer buf = ByteBuffer.allocate(5); ++ int i; ++ for (i = 0; i < 5; i++) { ++ buf.put(i, (byte)(i+10)); ++ } ++ obj.setIndexedPropertiesToExternalArrayData(buf); ++ ++ for (i = 0; i < 5; i++) { ++ assertEquals((byte)(i+10), ((Number)e.eval("obj[" + i + "]")).byteValue()); ++ } ++ ++ e.eval("for (i = 0; i < 5; i++) obj[i] = 0"); ++ for (i = 0; i < 5; i++) { ++ assertEquals((byte)0, ((Number)e.eval("obj[" + i + "]")).byteValue()); ++ assertEquals((byte)0, buf.get(i)); ++ } ++ } ++ ++ @Test + public void conversionTest() throws ScriptException { + final ScriptEngineManager m = new ScriptEngineManager(); + final ScriptEngine e = m.getEngineByName("nashorn"); +@@ -252,4 +278,31 @@ + "({ toString: function() { return 'foo' } })"); + assertEquals("foo", obj.to(String.class)); + } ++ ++ // @bug 8044000: Access to undefined property yields "null" instead of "undefined" ++ @Test ++ public void mapScriptObjectMirrorCallsiteTest() throws ScriptException { ++ final ScriptEngineManager m = new ScriptEngineManager(); ++ final ScriptEngine engine = m.getEngineByName("nashorn"); ++ final String TEST_SCRIPT = "typeof obj.foo"; ++ ++ final Bindings global = engine.getContext().getBindings(ScriptContext.ENGINE_SCOPE); ++ engine.eval("var obj = java.util.Collections.emptyMap()"); ++ // this will drive callsite "obj.foo" of TEST_SCRIPT ++ // to use "obj instanceof Map" as it's guard ++ engine.eval(TEST_SCRIPT, global); ++ // redefine 'obj' to be a script object ++ engine.eval("obj = {}"); ++ ++ final Bindings newGlobal = engine.createBindings(); ++ // transfer 'obj' from default global to new global ++ // new global will get a ScriptObjectMirror wrapping 'obj' ++ newGlobal.put("obj", global.get("obj")); ++ ++ // Every ScriptObjectMirror is a Map! If callsite "obj.foo" ++ // does not see the new 'obj' is a ScriptObjectMirror, it'll ++ // continue to use Map's get("obj.foo") instead of ScriptObjectMirror's ++ // getMember("obj.foo") - thereby getting null instead of undefined ++ assertEquals("undefined", engine.eval(TEST_SCRIPT, newGlobal)); ++ } + } +--- ./nashorn/test/src/jdk/nashorn/api/scripting/resources/func.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/src/jdk/nashorn/api/scripting/resources/func.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,42 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++// This script is loaded from jdk.nashorn.api.scripting.ScopeTest to test script class sharing and reuse. ++ ++var scopeVar = 1; ++var global = this; ++undefGlobal = this; ++ ++function scopeTest() { ++ if (this !== global) { ++ throw new Error("this !== global"); ++ } ++ if (this !== undefGlobal) { ++ throw new Error("this !== undefinedGlobal") ++ } ++ return scopeVar; ++} ++ ++scopeTest(); +--- ./nashorn/test/src/jdk/nashorn/api/scripting/resources/gettersetter.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/src/jdk/nashorn/api/scripting/resources/gettersetter.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,38 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++// This script is loaded from jdk.nashorn.api.scripting.ScopeTest to test script class sharing and reuse. ++ ++var v; ++ ++Object.defineProperty(this, "accessor1", { ++ get: function() { return v; }, ++ set: function(n) { v = n; } ++}); ++ ++Object.defineProperty(this, "accessor2", { ++ get: function() { return x; }, ++ set: function(n) { x = n; } ++}); +--- ./nashorn/test/src/jdk/nashorn/api/scripting/resources/witheval.js Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/src/jdk/nashorn/api/scripting/resources/witheval.js Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,60 @@ ++/* ++ * Copyright (c) 2010, 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. ++ */ ++ ++// This script is loaded from jdk.nashorn.api.scripting.ScopeTest to test script class sharing and reuse. ++ ++var a; ++ ++function outer(p, e) { ++ eval(e); ++ with(p) { ++ function inner() { ++ a = 1; ++ c = 10; ++ if (a !== 1) { ++ throw new Error("a !== 1"); ++ } ++ if (b !== 3) { ++ throw new Error("b !== 3"); ++ } ++ if (c !== 10) { ++ throw new Error("c !== 10"); ++ } ++ } ++ inner(); ++ } ++} ++ ++outer({}, "b = 3;"); ++ ++if (a !== 1) { ++ throw new Error("a !== 1"); ++} ++if (b !== 3) { ++ throw new Error("b !== 3"); ++} ++if (c !== 10) { ++ throw new Error("c !== 10"); ++} +--- ./nashorn/test/src/jdk/nashorn/internal/codegen/CompilerTest.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/internal/codegen/CompilerTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,13 +25,16 @@ + + package jdk.nashorn.internal.codegen; + ++import static jdk.nashorn.internal.runtime.Source.sourceFor; ++import static jdk.nashorn.internal.runtime.Source.readFully; ++ + import java.io.File; + import java.io.PrintWriter; + import java.io.StringWriter; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.runtime.Context; + import jdk.nashorn.internal.runtime.ErrorManager; + import jdk.nashorn.internal.runtime.ScriptFunction; +-import jdk.nashorn.internal.runtime.ScriptObject; + import jdk.nashorn.internal.runtime.Source; + import jdk.nashorn.internal.runtime.options.Options; + import org.testng.Assert; +@@ -58,7 +61,7 @@ + } + + private Context context; +- private ScriptObject global; ++ private Global global; + + @BeforeClass + public void setupTest() { +@@ -68,6 +71,7 @@ + options.set("print.ast", true); + options.set("print.parse", true); + options.set("scripting", true); ++ options.set("const.as.var", true); + + final ErrorManager errors = new ErrorManager() { + @Override +@@ -146,11 +150,11 @@ + log("Begin compiling " + file.getAbsolutePath()); + } + +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + final boolean globalChanged = (oldGlobal != global); + + try { +- final char[] buffer = Source.readFully(file); ++ final char[] buffer = readFully(file); + boolean excluded = false; + + if (filter != null) { +@@ -169,7 +173,7 @@ + if (globalChanged) { + Context.setGlobal(global); + } +- final Source source = new Source(file.getAbsolutePath(), buffer); ++ final Source source = sourceFor(file.getAbsolutePath(), buffer); + final ScriptFunction script = context.compileScript(source, global); + if (script == null || context.getErrorManager().getNumberOfErrors() > 0) { + log("Compile failed: " + file.getAbsolutePath()); +--- ./nashorn/test/src/jdk/nashorn/internal/parser/ParserTest.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/internal/parser/ParserTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,6 +25,9 @@ + + package jdk.nashorn.internal.parser; + ++import static jdk.nashorn.internal.runtime.Source.sourceFor; ++import static jdk.nashorn.internal.runtime.Source.readFully; ++ + import java.io.File; + import jdk.nashorn.internal.runtime.Context; + import jdk.nashorn.internal.runtime.ErrorManager; +@@ -62,6 +65,7 @@ + options.set("anon.functions", true); + options.set("parse.only", true); + options.set("scripting", true); ++ options.set("const.as.var", true); + + ErrorManager errors = new ErrorManager(); + this.context = new Context(options, errors, Thread.currentThread().getContextClassLoader()); +@@ -131,7 +135,7 @@ + } + + try { +- final char[] buffer = Source.readFully(file); ++ final char[] buffer = readFully(file); + boolean excluded = false; + if (filter != null) { + final String content = new String(buffer); +@@ -153,7 +157,7 @@ + } + }; + errors.setLimit(0); +- final Source source = new Source(file.getAbsolutePath(), buffer); ++ final Source source = sourceFor(file.getAbsolutePath(), buffer); + new Parser(context.getEnv(), source, errors).parse(); + if (errors.getNumberOfErrors() > 0) { + log("Parse failed: " + file.getAbsolutePath()); +--- ./nashorn/test/src/jdk/nashorn/internal/performance/PerformanceWrapper.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/internal/performance/PerformanceWrapper.java Wed Jul 30 03:55:26 2014 -0700 +@@ -31,9 +31,9 @@ + import java.util.concurrent.Future; + import java.util.concurrent.TimeUnit; + import java.util.concurrent.TimeoutException; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.runtime.Context; + import jdk.nashorn.internal.runtime.ScriptFunction; +-import jdk.nashorn.internal.runtime.ScriptObject; + import jdk.nashorn.internal.runtime.ScriptRuntime; + + /** +@@ -89,7 +89,7 @@ + @Override + protected Object apply(final ScriptFunction target, final Object self) { + if (_runsPerIteration == 0 && _numberOfIterations == 0) { +- final ScriptObject global = jdk.nashorn.internal.runtime.Context.getGlobal(); ++ final Global global = jdk.nashorn.internal.runtime.Context.getGlobal(); + final ScriptFunction _target = target; + final Object _self = self; + +--- ./nashorn/test/src/jdk/nashorn/internal/runtime/CodeStoreAndPathTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/src/jdk/nashorn/internal/runtime/CodeStoreAndPathTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,159 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package jdk.nashorn.internal.runtime; ++ ++import java.io.File; ++import java.io.IOException; ++import java.nio.file.Files; ++import java.nio.file.DirectoryStream; ++import java.nio.file.Path; ++import java.nio.file.FileSystems; ++import javax.script.ScriptException; ++import org.testng.annotations.Test; ++import javax.script.ScriptEngine; ++import jdk.nashorn.api.scripting.NashornScriptEngineFactory; ++import static org.testng.Assert.assertFalse; ++import static org.testng.Assert.assertEquals; ++ ++/** ++ * @test ++ * @bug 8039185 8039403 ++ * @summary Test for persistent code cache and path handling ++ * @run testng jdk.nashorn.internal.runtime.CodeStoreAndPathTest ++ */ ++ ++public class CodeStoreAndPathTest { ++ ++ final String code1 = "var code1; var x = 'Hello Script'; var x1 = 'Hello Script'; " ++ + "var x2 = 'Hello Script'; var x3 = 'Hello Script'; " ++ + "var x4 = 'Hello Script'; var x5 = 'Hello Script';" ++ + "var x6 = 'Hello Script'; var x7 = 'Hello Script'; " ++ + "var x8 = 'Hello Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';" ++ + "function f() {x ='Bye Script'; x1 ='Bye Script'; x2='Bye Script';" ++ + "x3='Bye Script'; x4='Bye Script'; x5='Bye Script'; x6='Bye Script';" ++ + "x7='Bye Script'; x8='Bye Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';}" ++ + "function g() {x ='Bye Script'; x1 ='Bye Script'; x2='Bye Script';" ++ + "x3='Bye Script'; x4='Bye Script'; x5='Bye Script'; x6='Bye Script';" ++ + "x7='Bye Script'; x8='Bye Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';}" ++ + "function h() {x ='Bye Script'; x1 ='Bye Script'; x2='Bye Script';" ++ + "x3='Bye Script'; x4='Bye Script'; x5='Bye Script'; x6='Bye Script';" ++ + "x7='Bye Script'; x8='Bye Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';}" ++ + "function i() {x ='Bye Script'; x1 ='Bye Script'; x2='Bye Script';" ++ + "x3='Bye Script'; x4='Bye Script'; x5='Bye Script'; x6='Bye Script';" ++ + "x7='Bye Script'; x8='Bye Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';}"; ++ final String code2 = "var code2; var x = 'Hello Script'; var x1 = 'Hello Script'; " ++ + "var x2 = 'Hello Script'; var x3 = 'Hello Script'; " ++ + "var x4 = 'Hello Script'; var x5 = 'Hello Script';" ++ + "var x6 = 'Hello Script'; var x7 = 'Hello Script'; " ++ + "var x8 = 'Hello Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';" ++ + "function f() {x ='Bye Script'; x1 ='Bye Script'; x2='Bye Script';" ++ + "x3='Bye Script'; x4='Bye Script'; x5='Bye Script'; x6='Bye Script';" ++ + "x7='Bye Script'; x8='Bye Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';}" ++ + "function g() {x ='Bye Script'; x1 ='Bye Script'; x2='Bye Script';" ++ + "x3='Bye Script'; x4='Bye Script'; x5='Bye Script'; x6='Bye Script';" ++ + "x7='Bye Script'; x8='Bye Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';}" ++ + "function h() {x ='Bye Script'; x1 ='Bye Script'; x2='Bye Script';" ++ + "x3='Bye Script'; x4='Bye Script'; x5='Bye Script'; x6='Bye Script';" ++ + "x7='Bye Script'; x8='Bye Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';}" ++ + "function i() {x ='Bye Script'; x1 ='Bye Script'; x2='Bye Script';" ++ + "x3='Bye Script'; x4='Bye Script'; x5='Bye Script'; x6='Bye Script';" ++ + "x7='Bye Script'; x8='Bye Script'; var x9 = 'Hello Script'; " ++ + "var x10 = 'Hello Script';}"; ++ // Script size < Default minimum size for storing a compiled script class ++ final String code3 = "var code3; var x = 'Hello Script'; var x1 = 'Hello Script'; "; ++ final String codeCache = "build/nashorn_code_cache"; ++ final String oldUserDir = System.getProperty("user.dir"); ++ ++ public void checkCompiledScripts(DirectoryStream stream, int numberOfScripts) throws IOException { ++ for (Path file : stream) { ++ numberOfScripts--; ++ } ++ stream.close(); ++ assertEquals(numberOfScripts,0); ++ } ++ ++ @Test ++ public void pathHandlingTest() throws ScriptException, IOException { ++ System.setProperty("nashorn.persistent.code.cache", codeCache); ++ String[] options = new String[]{"--persistent-code-cache"}; ++ NashornScriptEngineFactory fac = new NashornScriptEngineFactory(); ++ ScriptEngine e = fac.getScriptEngine(options); ++ Path expectedCodeCachePath = FileSystems.getDefault().getPath(oldUserDir + File.separator + codeCache); ++ Path actualCodeCachePath = FileSystems.getDefault().getPath(System.getProperty( ++ "nashorn.persistent.code.cache")).toAbsolutePath(); ++ // Check that nashorn code cache is created in current working directory ++ assertEquals(actualCodeCachePath, expectedCodeCachePath); ++ // Check that code cache dir exists and it's not empty ++ File file = new File(actualCodeCachePath.toUri()); ++ assertFalse(!file.isDirectory(), "No code cache directory was created!"); ++ assertFalse(file.list().length == 0, "Code cache directory is empty!"); ++ } ++ ++ @Test ++ public void changeUserDirTest() throws ScriptException, IOException { ++ System.setProperty("nashorn.persistent.code.cache", codeCache); ++ String[] options = new String[]{"--persistent-code-cache"}; ++ NashornScriptEngineFactory fac = new NashornScriptEngineFactory(); ++ ScriptEngine e = fac.getScriptEngine(options); ++ Path codeCachePath = FileSystems.getDefault().getPath(System.getProperty( ++ "nashorn.persistent.code.cache")).toAbsolutePath(); ++ String newUserDir = "build/newUserDir"; ++ // Now changing current working directory ++ System.setProperty("user.dir", System.getProperty("user.dir") + File.separator + newUserDir); ++ // Check that a new compiled script is stored in exisitng code cache ++ e.eval(code1); ++ DirectoryStream stream = Files.newDirectoryStream(codeCachePath); ++ // Already one compiled script has been stored in the cache during initialization ++ checkCompiledScripts(stream, 2); ++ // Setting to default current working dir ++ System.setProperty("user.dir", oldUserDir); ++ } ++ ++ @Test ++ public void codeCacheTest() throws ScriptException, IOException { ++ System.setProperty("nashorn.persistent.code.cache", codeCache); ++ String[] options = new String[]{"--persistent-code-cache"}; ++ NashornScriptEngineFactory fac = new NashornScriptEngineFactory(); ++ ScriptEngine e = fac.getScriptEngine(options); ++ Path codeCachePath = FileSystems.getDefault().getPath(System.getProperty( ++ "nashorn.persistent.code.cache")).toAbsolutePath(); ++ e.eval(code1); ++ e.eval(code2); ++ e.eval(code3);// less than minimum size for storing ++ // Already one compiled script has been stored in the cache during initialization ++ // adding code1 and code2. ++ DirectoryStream stream = Files.newDirectoryStream(codeCachePath); ++ checkCompiledScripts(stream, 3); ++ } ++} +--- ./nashorn/test/src/jdk/nashorn/internal/runtime/ContextTest.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/internal/runtime/ContextTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,10 +25,12 @@ + + package jdk.nashorn.internal.runtime; + ++import static jdk.nashorn.internal.runtime.Source.sourceFor; + import static org.testng.Assert.assertEquals; + import static org.testng.Assert.assertTrue; + + import java.util.Map; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.runtime.options.Options; + import org.testng.annotations.Test; + +@@ -45,7 +47,7 @@ + final Options options = new Options(""); + final ErrorManager errors = new ErrorManager(); + final Context cx = new Context(options, errors, Thread.currentThread().getContextClassLoader()); +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + Context.setGlobal(cx.createGlobal()); + try { + String code = "22 + 10"; +@@ -65,7 +67,7 @@ + final ErrorManager errors = new ErrorManager(); + final Context cx = new Context(options, errors, Thread.currentThread().getContextClassLoader()); + final boolean strict = cx.getEnv()._strict; +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + Context.setGlobal(cx.createGlobal()); + + try { +@@ -106,7 +108,7 @@ + } + + private Object eval(final Context cx, final String name, final String code) { +- final Source source = new Source(name, code); ++ final Source source = sourceFor(name, code); + final ScriptObject global = Context.getGlobal(); + final ScriptFunction func = cx.compileScript(source, global); + return func != null ? ScriptRuntime.apply(func, global) : null; +--- ./nashorn/test/src/jdk/nashorn/internal/runtime/NoPersistenceCachingTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/src/jdk/nashorn/internal/runtime/NoPersistenceCachingTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,135 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++package jdk.nashorn.internal.runtime; ++ ++import java.io.ByteArrayOutputStream; ++import java.io.PrintStream; ++import java.util.regex.Matcher; ++import java.util.regex.Pattern; ++import static org.testng.Assert.fail; ++import org.testng.annotations.Test; ++ ++import javax.script.ScriptContext; ++import javax.script.ScriptEngine; ++import javax.script.ScriptEngineFactory; ++import javax.script.ScriptEngineManager; ++import javax.script.SimpleScriptContext; ++import jdk.nashorn.api.scripting.NashornScriptEngineFactory; ++import org.testng.annotations.AfterTest; ++import org.testng.annotations.BeforeTest; ++ ++/** ++ * @test ++ * @bug 8037378 ++ * @summary Sanity tests for no persistence caching ++ * @run testng/othervm jdk.nashorn.internal.runtime.NoPersistenceCachingTest ++ */ ++public class NoPersistenceCachingTest { ++ ++ private ScriptEngine engine; ++ private ScriptContext context1, context2, context3; ++ private ByteArrayOutputStream stderr; ++ private PrintStream prevStderr; ++ ++ @BeforeTest ++ public void setupTest() { ++ stderr = new ByteArrayOutputStream(); ++ prevStderr = System.err; ++ System.setErr(new PrintStream(stderr)); ++ NashornScriptEngineFactory nashornFactory = null; ++ ScriptEngineManager sm = new ScriptEngineManager(); ++ for (ScriptEngineFactory fac : sm.getEngineFactories()) { ++ if (fac instanceof NashornScriptEngineFactory) { ++ nashornFactory = (NashornScriptEngineFactory) fac; ++ break; ++ } ++ } ++ if (nashornFactory == null) { ++ fail("Cannot find nashorn factory!"); ++ } ++ String[] options = new String[]{"--log=compiler:finest"}; ++ engine = nashornFactory.getScriptEngine(options); ++ context1 = engine.getContext(); ++ context2 = new SimpleScriptContext(); ++ context2.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); ++ context3 = new SimpleScriptContext(); ++ context3.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE); ++ } ++ ++ @AfterTest ++ public void setErrTest() { ++ System.setErr(prevStderr); ++ } ++ ++ public void runTest(int numberOfContext, String expectedOutputPattern, ++ int expectedPatternOccurrence) { ++ ++ try { ++ switch (numberOfContext) { ++ case 2: ++ String scriptTwoContexts = "print('HelloTwoContexts')"; ++ engine.eval(scriptTwoContexts, context1); ++ engine.eval(scriptTwoContexts, context2); ++ break; ++ case 3: ++ String scriptThreeContexts = "print('HelloThreeContexts')"; ++ engine.eval(scriptThreeContexts, context1); ++ engine.eval(scriptThreeContexts, context2); ++ engine.eval(scriptThreeContexts, context3); ++ break; ++ } ++ } catch (final Exception se) { ++ se.printStackTrace(); ++ fail(se.getMessage()); ++ } ++ Pattern deoptimizing = Pattern.compile(expectedOutputPattern); ++ Matcher matcher = deoptimizing.matcher(stderr.toString()); ++ int matches = 0; ++ while (matcher.find()) { ++ matches++; ++ } ++ if (matches != expectedPatternOccurrence) { ++ fail("Number of cache hit is not correct, expected: " ++ + expectedPatternOccurrence + " and found: " + matches + "\n" ++ + stderr); ++ } ++ stderr.reset(); ++ } ++ ++ private static String getCodeCachePattern() { ++ return ("\\[compiler\\]\\sCode\\scache\\shit\\sfor\\s\\savoiding\\srecompile."); ++ } ++ ++ @Test ++ public void twoContextTest() { ++ runTest(2, getCodeCachePattern(), 1); ++ ++ } ++ ++ @Test ++ public void threeContextTest() { ++ runTest(3, getCodeCachePattern(), 2); ++ } ++} +--- ./nashorn/test/src/jdk/nashorn/internal/runtime/SourceTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./nashorn/test/src/jdk/nashorn/internal/runtime/SourceTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -0,0 +1,128 @@ ++/* ++ * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package jdk.nashorn.internal.runtime; ++ ++import jdk.nashorn.api.scripting.URLReader; ++import org.testng.annotations.Test; ++ ++import java.io.File; ++import java.io.IOException; ++import java.io.InputStreamReader; ++import java.io.Reader; ++import java.net.URL; ++import java.util.Arrays; ++ ++import static jdk.nashorn.internal.runtime.Source.sourceFor; ++import static org.testng.Assert.assertEquals; ++import static org.testng.Assert.assertTrue; ++import static org.testng.Assert.fail; ++ ++/** ++ * Tests different Source representations. ++ */ ++public class SourceTest { ++ ++ final private static String SOURCE_NAME = "source.js"; ++ final private static String SOURCE_STRING = "var x = 1;"; ++ final private static char[] SOURCE_CHARS = SOURCE_STRING.toCharArray(); ++ final private static String RESOURCE_PATH = "resources/load_test.js"; ++ final private static File SOURCE_FILE = new File("build/test/classes/jdk/nashorn/internal/runtime/" + RESOURCE_PATH); ++ final private static URL SOURCE_URL = SourceTest.class.getResource(RESOURCE_PATH); ++ ++ ++ @Test ++ public void testStringSource() { ++ testSources(sourceFor(SOURCE_NAME, SOURCE_STRING), sourceFor(SOURCE_NAME, SOURCE_STRING)); ++ testSources(sourceFor(SOURCE_NAME, SOURCE_STRING), sourceFor(SOURCE_NAME, SOURCE_CHARS)); ++ } ++ ++ @Test ++ public void testCharArraySource() { ++ testSources(sourceFor(SOURCE_NAME, SOURCE_CHARS), sourceFor(SOURCE_NAME, SOURCE_CHARS)); ++ testSources(sourceFor(SOURCE_NAME, SOURCE_CHARS), sourceFor(SOURCE_NAME, SOURCE_STRING)); ++ } ++ ++ @Test ++ public void testURLSource() { ++ try { ++ testSources(sourceFor(SOURCE_NAME, SOURCE_URL), sourceFor(SOURCE_NAME, SOURCE_URL)); ++ testSources(sourceFor(SOURCE_NAME, SOURCE_URL), sourceFor(SOURCE_NAME, new URLReader(SOURCE_URL))); ++ ++ } catch (final IOException e) { ++ fail(e.toString()); ++ } ++ } ++ ++ @Test ++ public void testURLReaderSource() { ++ try { ++ System.err.println(SourceTest.class.getResource("")); ++ testSources(sourceFor(SOURCE_NAME, new URLReader(SOURCE_URL)), sourceFor(SOURCE_NAME, new URLReader(SOURCE_URL))); ++ testSources(sourceFor(SOURCE_NAME, new URLReader(SOURCE_URL)), sourceFor(SOURCE_NAME, SOURCE_URL)); ++ } catch (final IOException e) { ++ fail(e.toString()); ++ } ++ } ++ ++ @Test ++ public void testReaderSource() { ++ try { ++ testSources(sourceFor(SOURCE_NAME, getReader(RESOURCE_PATH)), sourceFor(SOURCE_NAME, getReader(RESOURCE_PATH))); ++ } catch (final IOException e) { ++ fail(e.toString()); ++ } ++ } ++ ++ @Test ++ public void testFileSource() { ++ try { ++ testSources(sourceFor(SOURCE_NAME, SOURCE_FILE), sourceFor(SOURCE_NAME, SOURCE_FILE)); ++ } catch (final IOException e) { ++ fail(e.toString()); ++ } ++ } ++ ++ private Reader getReader(final String path) { ++ return new InputStreamReader(SourceTest.class.getResourceAsStream(path)); ++ } ++ ++ private void testSources(final Source source1, final Source source2) { ++ final char[] chars1 = source1.getContent(); ++ final char[] chars2 = source2.getContent(); ++ final String str1 = source1.getString(); ++ final String str2 = source2.getString(); ++ assertTrue(Arrays.equals(chars1, chars2)); ++ assertEquals(str1, str2); ++ assertEquals(source1.hashCode(), source2.hashCode()); ++ assertTrue(source1.equals(source2)); ++ // Test for immutability ++ Arrays.fill(source1.getContent(), (char)0); ++ Arrays.fill(source2.getContent(), (char)1); ++ assertTrue(Arrays.equals(source1.getContent(), str1.toCharArray())); ++ assertTrue(Arrays.equals(source1.getContent(), chars1)); ++ assertTrue(Arrays.equals(source1.getContent(), source2.getContent())); ++ } ++} +--- ./nashorn/test/src/jdk/nashorn/internal/runtime/TrustedScriptEngineTest.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/internal/runtime/TrustedScriptEngineTest.java Wed Jul 30 03:55:26 2014 -0700 +@@ -220,4 +220,19 @@ + // bar should be visible in default context + assertTrue(e.eval("typeof bar").equals("function")); + } ++ ++ ++ @Test public void nashornSwallowsConstKeyword() throws Exception { ++ final NashornScriptEngineFactory f = new NashornScriptEngineFactory(); ++ final String[] args = new String[] { "--const-as-var" }; ++ final ScriptEngine engine = f.getScriptEngine(args); ++ ++ final Object ret = engine.eval("" ++ + "(function() {\n" ++ + " const x = 10;\n" ++ + " return x;\n" ++ + "})();" ++ ); ++ assertEquals(ret, 10, "Parsed and executed OK"); ++ } + } +--- ./nashorn/test/src/jdk/nashorn/internal/test/framework/SharedContextEvaluator.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/internal/test/framework/SharedContextEvaluator.java Wed Jul 30 03:55:26 2014 -0700 +@@ -25,6 +25,7 @@ + + package jdk.nashorn.internal.test.framework; + ++import static jdk.nashorn.internal.runtime.Source.sourceFor; + import static jdk.nashorn.tools.Shell.COMPILATION_ERROR; + import static jdk.nashorn.tools.Shell.RUNTIME_ERROR; + import static jdk.nashorn.tools.Shell.SUCCESS; +@@ -34,12 +35,11 @@ + import java.io.OutputStream; + import java.io.PrintWriter; + import jdk.nashorn.api.scripting.NashornException; ++import jdk.nashorn.internal.objects.Global; + import jdk.nashorn.internal.runtime.Context; + import jdk.nashorn.internal.runtime.ErrorManager; + import jdk.nashorn.internal.runtime.ScriptFunction; +-import jdk.nashorn.internal.runtime.ScriptObject; + import jdk.nashorn.internal.runtime.ScriptRuntime; +-import jdk.nashorn.internal.runtime.Source; + import jdk.nashorn.internal.runtime.options.Options; + + /** +@@ -110,12 +110,12 @@ + + @Override + public int run(final OutputStream out, final OutputStream err, final String[] args) throws IOException { +- final ScriptObject oldGlobal = Context.getGlobal(); ++ final Global oldGlobal = Context.getGlobal(); + try { + ctxOut.setDelegatee(out); + ctxErr.setDelegatee(err); + final ErrorManager errors = context.getErrorManager(); +- final ScriptObject global = context.createGlobal(); ++ final Global global = context.createGlobal(); + Context.setGlobal(global); + + // For each file on the command line. +@@ -125,7 +125,7 @@ + continue; + } + final File file = new File(fileName); +- ScriptFunction script = context.compileScript(new Source(fileName, file.toURI().toURL()), global); ++ ScriptFunction script = context.compileScript(sourceFor(fileName, file.toURI().toURL()), global); + + if (script == null || errors.getNumberOfErrors() != 0) { + return COMPILATION_ERROR; +--- ./nashorn/test/src/jdk/nashorn/test/models/SourceHelper.java Tue Jun 03 14:19:46 2014 -0700 ++++ ./nashorn/test/src/jdk/nashorn/test/models/SourceHelper.java Wed Jul 30 03:55:26 2014 -0700 +@@ -46,7 +46,7 @@ + } + + public static String readFully(final URL url) throws IOException { +- return new Source(url.toString(), url).getString(); ++ return Source.sourceFor(url.toString(), url).getString(); + } + + public static String readFully(final Reader reader) throws IOException { diff --git a/java/openjdk8/files/patch-8u25-b17 b/java/openjdk8/files/patch-8u25-b17 new file mode 100644 index 000000000000..e469f8b9ad4f --- /dev/null +++ b/java/openjdk8/files/patch-8u25-b17 @@ -0,0 +1,5306 @@ +--- ./.hgtags Wed Jul 30 03:50:56 2014 -0700 ++++ ./.hgtags Wed Sep 17 11:23:18 2014 -0700 +@@ -313,3 +313,21 @@ + b14daf2459c5430dfe5d435483d6f424cff09584 jdk8u20-b23 + 1710841b0229403f4af85eac8b68ea5065a26c81 jdk8u20-b24 + 1710841b0229403f4af85eac8b68ea5065a26c81 jdk8u20-b25 ++d1a7ea2c3e1091e0df1285963328a96f475f240d jdk8u20-b26 ++97c6d6a8e5bb3dfc24b9a32711aa0906ea110e23 jdk8u25-b00 ++c4cfb4376f5916c5d7eb1f39a0e23402de0d9818 jdk8u25-b01 ++b4d29a751077e5500e766b8104dd1cb7148a550f jdk8u25-b02 ++d3df54be114a5c41d4881b61cd42fbb0e52aaf4a jdk8u25-b03 ++64e7567a8539078a678853a384340eee469168b0 jdk8u25-b04 ++6de13ae93be20b97f53e3837739947d59fb4fd65 jdk8u25-b05 ++69d17ee59c0e77033aca293501a642d0abc20c85 jdk8u25-b06 ++561d066eaa6428088b4f7e273a8caed90e8f6073 jdk8u25-b07 ++c2a5ad21d01c5d921c4e928edcb14cc3d61eb62b jdk8u25-b08 ++1249614d7f1d9bf8443f0abd0622b4d2a3ab0638 jdk8u25-b09 ++0c5d41165be3f4bb989bd84283c2df3e37b9845d jdk8u25-b10 ++cc5ab3e0fe815ae80bb52fa5affcb35ee0f51cff jdk8u25-b11 ++c35e73e4acd8ed03e77e8e20023bac115c7dfe38 jdk8u25-b12 ++5d990a43c996ef039c6619e55215d589e09d1022 jdk8u25-b13 ++4429ea47ee6eca6b8a1dbda1950566ee821ba19d jdk8u25-b14 ++09eaef69f384ecf8ec0342b87a8b150740941140 jdk8u25-b15 ++f0a48c214c46b7351ff8e6d6b6dc533463a4be21 jdk8u25-b16 +--- ./common/autoconf/generated-configure.sh Wed Jul 30 03:50:56 2014 -0700 ++++ ./common/autoconf/generated-configure.sh Wed Sep 17 11:23:18 2014 -0700 +@@ -3868,7 +3868,7 @@ + #CUSTOM_AUTOCONF_INCLUDE + + # Do not change or remove the following line, it is needed for consistency checks: +-DATE_WHEN_GENERATED=1397150809 ++DATE_WHEN_GENERATED=1410971760 + + ############################################################################### + # +--- ./make/Jprt.gmk Wed Jul 30 03:50:56 2014 -0700 ++++ ./make/Jprt.gmk Wed Sep 17 11:23:18 2014 -0700 +@@ -145,6 +145,9 @@ + ifdef ALT_INSTALL_UPX_FILENAME + @$(ECHO) " --with-upx-filename=$(call UnixPath,$(ALT_INSTALL_UPX_FILENAME)) " >> $@.tmp + endif ++ ifdef ALT_BSDIFF_DIR ++ @$(ECHO) " --with-bsdiff-dir=$(call UnixPath,$(ALT_BSDIFF_DIR)) " >> $@.tmp ++ endif + ifdef ALT_CCSS_SIGNING_DIR + @$(ECHO) " --with-ccss-signing=$(call UnixPath,$(ALT_CCSS_SIGNING_DIR)) " >> $@.tmp + endif +--- ./make/jprt.properties Wed Jul 30 03:50:56 2014 -0700 ++++ ./make/jprt.properties Wed Sep 17 11:23:18 2014 -0700 +@@ -25,8 +25,9 @@ + + # Properties for jprt + +-# Locked down to jdk8 +-jprt.tools.default.release=jdk8 ++# The current release name ++my.jdk.update.version=25 ++jprt.tools.default.release=jdk8u${my.jdk.update.version} + + # Unix toolkit to use for building on windows + jprt.windows.jdk8.build.unix.toolkit=cygwin +--- ./corba/.hgtags Wed Jul 30 03:51:08 2014 -0700 ++++ ./corba/.hgtags Mon Sep 08 12:34:37 2014 -0700 +@@ -311,3 +311,21 @@ + 919405d7316dfcbddee5ad8dd08905916df88e04 jdk8u20-b23 + 34c930eaa6b591621afde05ca2e24571c91cdc9b jdk8u20-b24 + 34c930eaa6b591621afde05ca2e24571c91cdc9b jdk8u20-b25 ++37bde23c96f66912c44b1b893c08d4ad4cff5f4e jdk8u20-b26 ++08aa9f55fe5bce1f04cfd2958f71e8df18643e29 jdk8u25-b00 ++31f50e3c0dcbdfa7f11a895179065e6888c2cf3c jdk8u25-b01 ++162703b7c2f16ce00d1b54a8f95d12eda9753eba jdk8u25-b02 ++ddaa2a3e452c8fbb1a7046e743096d0f9489290e jdk8u25-b03 ++a76e6e02711edbfab4931dc679cbd3df6169ec84 jdk8u25-b04 ++2fab01326282ee9033c089933b2dc46aef127abd jdk8u25-b05 ++76068779ea16c40a9d3c14751a3bbd6c21f09cfd jdk8u25-b06 ++db4d845d6a4d71ef5e48a8888f71375b0e21959f jdk8u25-b07 ++afd9d9e1bbb5ab77c95a8750d2df164e05088d09 jdk8u25-b08 ++1322b445ab39930c50c3901f6c439aad99a62fe8 jdk8u25-b09 ++2e6da97d338ad5a65bf07f9d9648dcb74b5776b4 jdk8u25-b10 ++11f77cdff0b2a07fd89f439b044d9f10a15f8fd5 jdk8u25-b11 ++f560274aec4f42283c10070921afae403a153de2 jdk8u25-b12 ++987bd55824c4794c8784a47fc45ecd18a9c2a5c8 jdk8u25-b13 ++7e9a2027d0214019d66325fa7ca59cf8281fb43e jdk8u25-b14 ++5b2cb4935667cd02d7974b3b6fb6bf4092b5acae jdk8u25-b15 ++28d7f90e04e46ce8c633a2fbf0157d9e77db17c3 jdk8u25-b16 +--- ./hotspot/.hgtags Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/.hgtags Mon Sep 08 12:35:01 2014 -0700 +@@ -500,3 +500,21 @@ + 42ddd0bbcb6630fe463ec9bc1893c838d5edff1b jdk8u20-b24 + 00cf2b6f51b9560b01030e8f4c28c466f0b21fe3 hs25.20-b23 + 19408d5fd31c25ce60c43dd33e92b96e8df4a4ea jdk8u20-b25 ++eaa4074a7e3975cd33ec55e6b584586e2ac681bd jdk8u20-b26 ++a4d44dfb7d30eea54bc172e4429a655454ae0bbf jdk8u25-b00 ++9a2152fbd929b0d8b2f5c326a5526214ae71731a jdk8u25-b01 ++d3d5604ea0dea3812e87ba76ac199d0a8be6f49f jdk8u25-b02 ++27348de6239bb527c37c0bf59e938ed127b619a7 jdk8u25-b03 ++220eefb3609e250a0bb0ed26236c1213b8000050 jdk8u25-b04 ++db8383148bc9417dd4c38fa4cea39510f17325f3 jdk8u25-b05 ++605df8463453628df49351fa63632666f18698cd jdk8u25-b06 ++520188d4bade17dbe75163d1f635c08168ea560c jdk8u25-b07 ++f3f50c4f9ea5d3af40cb794b6f3f2a337c8873db jdk8u25-b08 ++4f209b7a580c78bac255e69f4724c42584c32a7d jdk8u25-b09 ++19c692f1e4c571a9285e33e7d3d15948769fcbdd jdk8u25-b10 ++9e2bb00a81910776d5b16c49a3f4c5264ceab522 jdk8u25-b11 ++2993491d47df8c4b096ea7fa534162bde8b53dcf jdk8u25-b12 ++ca6d25be853b5c428c6228871316671843264666 jdk8u25-b13 ++c77d5db189422e2eef0443ee212644e497113b18 jdk8u25-b14 ++e62c06b887310b5bd23be9b817a9a6f0daf0d0e1 jdk8u25-b15 ++6467bdd4d22d8b140844dc847c43b9ba7cb0bbd1 jdk8u25-b16 +--- ./hotspot/make/bsd/makefiles/mapfile-vers-debug Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-debug Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2002, 2013, 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 +@@ -82,6 +82,7 @@ + _JVM_EnableCompiler + _JVM_Exit + _JVM_FillInStackTrace ++ _JVM_FindClassFromCaller + _JVM_FindClassFromClass + _JVM_FindClassFromClassLoader + _JVM_FindClassFromBootLoader +--- ./hotspot/make/bsd/makefiles/mapfile-vers-product Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-product Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2002, 2013, 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 +@@ -82,6 +82,7 @@ + _JVM_EnableCompiler + _JVM_Exit + _JVM_FillInStackTrace ++ _JVM_FindClassFromCaller + _JVM_FindClassFromClass + _JVM_FindClassFromClassLoader + _JVM_FindClassFromBootLoader +--- ./hotspot/make/hotspot_version Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/hotspot_version Mon Sep 08 12:35:01 2014 -0700 +@@ -34,8 +34,8 @@ + HOTSPOT_VM_COPYRIGHT=Copyright 2014 + + HS_MAJOR_VER=25 +-HS_MINOR_VER=20 +-HS_BUILD_NUMBER=23 ++HS_MINOR_VER=25 ++HS_BUILD_NUMBER=02 + + JDK_MAJOR_VER=1 + JDK_MINOR_VER=8 +--- ./hotspot/make/linux/makefiles/mapfile-vers-debug Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/linux/makefiles/mapfile-vers-debug Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2002, 2013, 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 +@@ -84,6 +84,7 @@ + JVM_EnableCompiler; + JVM_Exit; + JVM_FillInStackTrace; ++ JVM_FindClassFromCaller; + JVM_FindClassFromClass; + JVM_FindClassFromClassLoader; + JVM_FindClassFromBootLoader; +--- ./hotspot/make/linux/makefiles/mapfile-vers-product Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/linux/makefiles/mapfile-vers-product Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2002, 2013, 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 +@@ -84,6 +84,7 @@ + JVM_EnableCompiler; + JVM_Exit; + JVM_FillInStackTrace; ++ JVM_FindClassFromCaller; + JVM_FindClassFromClass; + JVM_FindClassFromClassLoader; + JVM_FindClassFromBootLoader; +--- ./hotspot/make/solaris/makefiles/mapfile-vers Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/solaris/makefiles/mapfile-vers Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -84,6 +84,7 @@ + JVM_EnableCompiler; + JVM_Exit; + JVM_FillInStackTrace; ++ JVM_FindClassFromCaller; + JVM_FindClassFromClass; + JVM_FindClassFromClassLoader; + JVM_FindClassFromBootLoader; +--- ./hotspot/src/share/vm/classfile/classFileParser.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classFileParser.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -2780,11 +2780,6 @@ + ClassFileStream* cfs = stream(); + u1* current_start = cfs->current(); + +- guarantee_property(attribute_byte_length > sizeof(u2), +- "Invalid BootstrapMethods attribute length %u in class file %s", +- attribute_byte_length, +- CHECK); +- + cfs->guarantee_more(attribute_byte_length, CHECK); + + int attribute_array_length = cfs->get_u2_fast(); +@@ -2831,6 +2826,11 @@ + "bootstrap_method_index %u has bad constant type in class file %s", + bootstrap_method_index, + CHECK); ++ ++ guarantee_property((operand_fill_index + 1 + argument_count) < operands->length(), ++ "Invalid BootstrapMethods num_bootstrap_methods or num_bootstrap_arguments value in class file %s", ++ CHECK); ++ + operands->at_put(operand_fill_index++, bootstrap_method_index); + operands->at_put(operand_fill_index++, argument_count); + +@@ -2848,7 +2848,6 @@ + } + + assert(operand_fill_index == operands->length(), "exact fill"); +- assert(ConstantPool::operand_array_length(operands) == attribute_array_length, "correct decode"); + + u1* current_end = cfs->current(); + guarantee_property(current_end == current_start + attribute_byte_length, +--- ./hotspot/src/share/vm/classfile/classLoader.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classLoader.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -84,6 +84,7 @@ + typedef jboolean (JNICALL *ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned char *buf, char *namebuf); + typedef jboolean (JNICALL *ReadMappedEntry_t)(jzfile *zip, jzentry *entry, unsigned char **buf, char *namebuf); + typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n); ++typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len); + + static ZipOpen_t ZipOpen = NULL; + static ZipClose_t ZipClose = NULL; +@@ -92,6 +93,7 @@ + static ReadMappedEntry_t ReadMappedEntry = NULL; + static GetNextEntry_t GetNextEntry = NULL; + static canonicalize_fn_t CanonicalizeEntry = NULL; ++static Crc32_t Crc32 = NULL; + + // Globals + +@@ -632,9 +634,11 @@ + ReadEntry = CAST_TO_FN_PTR(ReadEntry_t, os::dll_lookup(handle, "ZIP_ReadEntry")); + ReadMappedEntry = CAST_TO_FN_PTR(ReadMappedEntry_t, os::dll_lookup(handle, "ZIP_ReadMappedEntry")); + GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry")); ++ Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32")); + + // ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL +- if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL || GetNextEntry == NULL) { ++ if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL || ++ GetNextEntry == NULL || Crc32 == NULL) { + vm_exit_during_initialization("Corrupted ZIP library", path); + } + +@@ -644,6 +648,11 @@ + // This lookup only works on 1.3. Do not check for non-null here + } + ++int ClassLoader::crc32(int crc, const char* buf, int len) { ++ assert(Crc32 != NULL, "ZIP_CRC32 is not found"); ++ return (*Crc32)(crc, (const jbyte*)buf, len); ++} ++ + // PackageInfo data exists in order to support the java.lang.Package + // class. A Package object provides information about a java package + // (version, vendor, etc.) which originates in the manifest of the jar +--- ./hotspot/src/share/vm/classfile/classLoader.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classLoader.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -215,6 +215,7 @@ + // to avoid confusing the zip library + static bool get_canonical_path(char* orig, char* out, int len); + public: ++ static int crc32(int crc, const char* buf, int len); + // Used by the kernel jvm. + static void update_class_path_entry_list(char *path, + bool check_for_duplicates); +--- ./hotspot/src/share/vm/classfile/stackMapFrame.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapFrame.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -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 +@@ -54,21 +54,6 @@ + return frame; + } + +-bool StackMapFrame::has_new_object() const { +- int32_t i; +- for (i = 0; i < _max_locals; i++) { +- if (_locals[i].is_uninitialized()) { +- return true; +- } +- } +- for (i = 0; i < _stack_size; i++) { +- if (_stack[i].is_uninitialized()) { +- return true; +- } +- } +- return false; +-} +- + void StackMapFrame::initialize_object( + VerificationType old_object, VerificationType new_object) { + int32_t i; +@@ -163,7 +148,7 @@ + VerificationType* from, VerificationType* to, int32_t len, TRAPS) const { + int32_t i = 0; + for (i = 0; i < len; i++) { +- if (!to[i].is_assignable_from(from[i], verifier(), THREAD)) { ++ if (!to[i].is_assignable_from(from[i], verifier(), false, THREAD)) { + break; + } + } +@@ -260,7 +245,7 @@ + } + VerificationType top = _stack[--_stack_size]; + bool subtype = type.is_assignable_from( +- top, verifier(), CHECK_(VerificationType::bogus_type())); ++ top, verifier(), false, CHECK_(VerificationType::bogus_type())); + if (!subtype) { + verifier()->verify_error( + ErrorContext::bad_type(_offset, stack_top_ctx(), +@@ -280,7 +265,7 @@ + return VerificationType::bogus_type(); + } + bool subtype = type.is_assignable_from(_locals[index], +- verifier(), CHECK_(VerificationType::bogus_type())); ++ verifier(), false, CHECK_(VerificationType::bogus_type())); + if (!subtype) { + verifier()->verify_error( + ErrorContext::bad_type(_offset, +@@ -303,14 +288,14 @@ + "get long/double overflows locals"); + return; + } +- bool subtype = type1.is_assignable_from(_locals[index], verifier(), CHECK); ++ bool subtype = type1.is_assignable_from(_locals[index], verifier(), false, CHECK); + if (!subtype) { + verifier()->verify_error( + ErrorContext::bad_type(_offset, + TypeOrigin::local(index, this), TypeOrigin::implicit(type1)), + "Bad local variable type"); + } else { +- subtype = type2.is_assignable_from(_locals[index + 1], verifier(), CHECK); ++ subtype = type2.is_assignable_from(_locals[index + 1], verifier(), false, CHECK); + if (!subtype) { + /* Unreachable? All local store routines convert a split long or double + * into a TOP during the store. So we should never end up seeing an +--- ./hotspot/src/share/vm/classfile/stackMapFrame.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapFrame.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -155,10 +155,6 @@ + const methodHandle m, VerificationType thisKlass, TRAPS); + + // Search local variable type array and stack type array. +- // Return true if an uninitialized object is found. +- bool has_new_object() const; +- +- // Search local variable type array and stack type array. + // Set every element with type of old_object to new_object. + void initialize_object( + VerificationType old_object, VerificationType new_object); +@@ -238,7 +234,7 @@ + if (_stack_size != 0) { + VerificationType top = _stack[_stack_size - 1]; + bool subtype = type.is_assignable_from( +- top, verifier(), CHECK_(VerificationType::bogus_type())); ++ top, verifier(), false, CHECK_(VerificationType::bogus_type())); + if (subtype) { + --_stack_size; + return top; +@@ -253,9 +249,9 @@ + assert(type2.is_long() || type2.is_double(), "must be long/double_2"); + if (_stack_size >= 2) { + VerificationType top1 = _stack[_stack_size - 1]; +- bool subtype1 = type1.is_assignable_from(top1, verifier(), CHECK); ++ bool subtype1 = type1.is_assignable_from(top1, verifier(), false, CHECK); + VerificationType top2 = _stack[_stack_size - 2]; +- bool subtype2 = type2.is_assignable_from(top2, verifier(), CHECK); ++ bool subtype2 = type2.is_assignable_from(top2, verifier(), false, CHECK); + if (subtype1 && subtype2) { + _stack_size -= 2; + return; +--- ./hotspot/src/share/vm/classfile/stackMapTable.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapTable.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -70,24 +70,26 @@ + + bool StackMapTable::match_stackmap( + StackMapFrame* frame, int32_t target, +- bool match, bool update, ErrorContext* ctx, TRAPS) const { ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const { + int index = get_index_from_offset(target); +- return match_stackmap(frame, target, index, match, update, ctx, THREAD); ++ return match_stackmap(frame, target, index, match, update, handler, ctx, THREAD); + } + + // Match and/or update current_frame to the frame in stackmap table with + // specified offset and frame index. Return true if the two frames match. ++// handler is true if the frame in stackmap_table is for an exception handler. + // +-// The values of match and update are: _match__update_ ++// The values of match and update are: _match__update__handler + // +-// checking a branch target/exception handler: true false ++// checking a branch target: true false false ++// checking an exception handler: true false true + // linear bytecode verification following an +-// unconditional branch: false true ++// unconditional branch: false true false + // linear bytecode verification not following an +-// unconditional branch: true true ++// unconditional branch: true true false + bool StackMapTable::match_stackmap( + StackMapFrame* frame, int32_t target, int32_t frame_index, +- bool match, bool update, ErrorContext* ctx, TRAPS) const { ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const { + if (frame_index < 0 || frame_index >= _frame_count) { + *ctx = ErrorContext::missing_stackmap(frame->offset()); + frame->verifier()->verify_error( +@@ -98,11 +100,9 @@ + StackMapFrame *stackmap_frame = _frame_array[frame_index]; + bool result = true; + if (match) { +- // when checking handler target, match == true && update == false +- bool is_exception_handler = !update; + // Has direct control flow from last instruction, need to match the two + // frames. +- result = frame->is_assignable_to(stackmap_frame, is_exception_handler, ++ result = frame->is_assignable_to(stackmap_frame, handler, + ctx, CHECK_VERIFY_(frame->verifier(), result)); + } + if (update) { +@@ -126,24 +126,10 @@ + StackMapFrame* frame, int32_t target, TRAPS) const { + ErrorContext ctx; + bool match = match_stackmap( +- frame, target, true, false, &ctx, CHECK_VERIFY(frame->verifier())); ++ frame, target, true, false, false, &ctx, CHECK_VERIFY(frame->verifier())); + if (!match || (target < 0 || target >= _code_length)) { + frame->verifier()->verify_error(ctx, + "Inconsistent stackmap frames at branch target %d", target); +- return; +- } +- // check if uninitialized objects exist on backward branches +- check_new_object(frame, target, CHECK_VERIFY(frame->verifier())); +- frame->verifier()->update_furthest_jump(target); +-} +- +-void StackMapTable::check_new_object( +- const StackMapFrame* frame, int32_t target, TRAPS) const { +- if (frame->offset() > target && frame->has_new_object()) { +- frame->verifier()->verify_error( +- ErrorContext::bad_code(frame->offset()), +- "Uninitialized object exists on backward branch %d", target); +- return; + } + } + +--- ./hotspot/src/share/vm/classfile/stackMapTable.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapTable.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -74,12 +74,12 @@ + // specified offset. Return true if the two frames match. + bool match_stackmap( + StackMapFrame* current_frame, int32_t offset, +- bool match, bool update, ErrorContext* ctx, TRAPS) const; ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const; + // Match and/or update current_frame to the frame in stackmap table with + // specified offset and frame index. Return true if the two frames match. + bool match_stackmap( + StackMapFrame* current_frame, int32_t offset, int32_t frame_index, +- bool match, bool update, ErrorContext* ctx, TRAPS) const; ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const; + + // Check jump instructions. Make sure there are no uninitialized + // instances on backward branch. +@@ -90,10 +90,6 @@ + // Returns the frame array index where the frame with offset is stored. + int get_index_from_offset(int32_t offset) const; + +- // Make sure that there's no uninitialized object exist on backward branch. +- void check_new_object( +- const StackMapFrame* frame, int32_t target, TRAPS) const; +- + void print_on(outputStream* str) const; + }; + +--- ./hotspot/src/share/vm/classfile/verificationType.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verificationType.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -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 +@@ -42,7 +42,8 @@ + } + + bool VerificationType::is_reference_assignable_from( +- const VerificationType& from, ClassVerifier* context, TRAPS) const { ++ const VerificationType& from, ClassVerifier* context, ++ bool from_field_is_protected, TRAPS) const { + instanceKlassHandle klass = context->current_class(); + if (from.is_null()) { + // null is assignable to any reference +@@ -62,9 +63,11 @@ + Handle(THREAD, klass->protection_domain()), true, CHECK_false); + KlassHandle this_class(THREAD, obj); + +- if (this_class->is_interface()) { +- // We treat interfaces as java.lang.Object, including +- // java.lang.Cloneable and java.io.Serializable ++ if (this_class->is_interface() && (!from_field_is_protected || ++ from.name() != vmSymbols::java_lang_Object())) { ++ // If we are not trying to access a protected field or method in ++ // java.lang.Object then we treat interfaces as java.lang.Object, ++ // including java.lang.Cloneable and java.io.Serializable. + return true; + } else if (from.is_object()) { + Klass* from_class = SystemDictionary::resolve_or_fail( +@@ -76,7 +79,8 @@ + VerificationType comp_this = get_component(context, CHECK_false); + VerificationType comp_from = from.get_component(context, CHECK_false); + if (!comp_this.is_bogus() && !comp_from.is_bogus()) { +- return comp_this.is_assignable_from(comp_from, context, CHECK_false); ++ return comp_this.is_assignable_from(comp_from, context, ++ from_field_is_protected, CHECK_false); + } + } + return false; +--- ./hotspot/src/share/vm/classfile/verificationType.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verificationType.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -265,7 +265,8 @@ + // is assignable to another. Returns true if one can assign 'from' to + // this. + bool is_assignable_from( +- const VerificationType& from, ClassVerifier* context, TRAPS) const { ++ const VerificationType& from, ClassVerifier* context, ++ bool from_field_is_protected, TRAPS) const { + if (equals(from) || is_bogus()) { + return true; + } else { +@@ -286,7 +287,9 @@ + return from.is_integer(); + default: + if (is_reference() && from.is_reference()) { +- return is_reference_assignable_from(from, context, CHECK_false); ++ return is_reference_assignable_from(from, context, ++ from_field_is_protected, ++ CHECK_false); + } else { + return false; + } +@@ -308,7 +311,8 @@ + private: + + bool is_reference_assignable_from( +- const VerificationType&, ClassVerifier*, TRAPS) const; ++ const VerificationType&, ClassVerifier*, bool from_field_is_protected, ++ TRAPS) const; + }; + + #endif // SHARE_VM_CLASSFILE_VERIFICATIONTYPE_HPP +--- ./hotspot/src/share/vm/classfile/verifier.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verifier.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -634,8 +634,6 @@ + // flow from current instruction to the next + // instruction in sequence + +- set_furthest_jump(0); +- + Bytecodes::Code opcode; + while (!bcs.is_last_bytecode()) { + // Check for recursive re-verification before each bytecode. +@@ -1736,7 +1734,7 @@ + VerificationType throwable = + VerificationType::reference_type(vmSymbols::java_lang_Throwable()); + bool is_subclass = throwable.is_assignable_from( +- catch_type, this, CHECK_VERIFY(this)); ++ catch_type, this, false, CHECK_VERIFY(this)); + if (!is_subclass) { + // 4286534: should throw VerifyError according to recent spec change + verify_error(ErrorContext::bad_type(handler_pc, +@@ -1794,7 +1792,7 @@ + // If matched, current_frame will be updated by this method. + bool matches = stackmap_table->match_stackmap( + current_frame, this_offset, stackmap_index, +- !no_control_flow, true, &ctx, CHECK_VERIFY_(this, 0)); ++ !no_control_flow, true, false, &ctx, CHECK_VERIFY_(this, 0)); + if (!matches) { + // report type error + verify_error(ctx, "Instruction type does not match stack map"); +@@ -1841,7 +1839,7 @@ + } + ErrorContext ctx; + bool matches = stackmap_table->match_stackmap( +- new_frame, handler_pc, true, false, &ctx, CHECK_VERIFY(this)); ++ new_frame, handler_pc, true, false, true, &ctx, CHECK_VERIFY(this)); + if (!matches) { + verify_error(ctx, "Stack map does not match the one at " + "exception handler %d", handler_pc); +@@ -2191,7 +2189,7 @@ + stack_object_type = current_type(); + } + is_assignable = target_class_type.is_assignable_from( +- stack_object_type, this, CHECK_VERIFY(this)); ++ stack_object_type, this, false, CHECK_VERIFY(this)); + if (!is_assignable) { + verify_error(ErrorContext::bad_type(bci, + current_frame->stack_top_ctx(), +@@ -2218,7 +2216,7 @@ + // It's protected access, check if stack object is assignable to + // current class. + is_assignable = current_type().is_assignable_from( +- stack_object_type, this, CHECK_VERIFY(this)); ++ stack_object_type, this, true, CHECK_VERIFY(this)); + if (!is_assignable) { + verify_error(ErrorContext::bad_type(bci, + current_frame->stack_top_ctx(), +@@ -2233,6 +2231,181 @@ + } + } + ++// Look at the method's handlers. If the bci is in the handler's try block ++// then check if the handler_pc is already on the stack. If not, push it. ++void ClassVerifier::push_handlers(ExceptionTable* exhandlers, ++ GrowableArray* handler_stack, ++ u4 bci) { ++ int exlength = exhandlers->length(); ++ for(int x = 0; x < exlength; x++) { ++ if (bci >= exhandlers->start_pc(x) && bci < exhandlers->end_pc(x)) { ++ handler_stack->append_if_missing(exhandlers->handler_pc(x)); ++ } ++ } ++} ++ ++// Return TRUE if all code paths starting with start_bc_offset end in ++// bytecode athrow or loop. ++bool ClassVerifier::ends_in_athrow(u4 start_bc_offset) { ++ ResourceMark rm; ++ // Create bytecode stream. ++ RawBytecodeStream bcs(method()); ++ u4 code_length = method()->code_size(); ++ bcs.set_start(start_bc_offset); ++ u4 target; ++ // Create stack for storing bytecode start offsets for if* and *switch. ++ GrowableArray* bci_stack = new GrowableArray(30); ++ // Create stack for handlers for try blocks containing this handler. ++ GrowableArray* handler_stack = new GrowableArray(30); ++ // Create list of visited branch opcodes (goto* and if*). ++ GrowableArray* visited_branches = new GrowableArray(30); ++ ExceptionTable exhandlers(_method()); ++ ++ while (true) { ++ if (bcs.is_last_bytecode()) { ++ // if no more starting offsets to parse or if at the end of the ++ // method then return false. ++ if ((bci_stack->is_empty()) || ((u4)bcs.end_bci() == code_length)) ++ return false; ++ // Pop a bytecode starting offset and scan from there. ++ bcs.set_start(bci_stack->pop()); ++ } ++ Bytecodes::Code opcode = bcs.raw_next(); ++ u4 bci = bcs.bci(); ++ ++ // If the bytecode is in a TRY block, push its handlers so they ++ // will get parsed. ++ push_handlers(&exhandlers, handler_stack, bci); ++ ++ switch (opcode) { ++ case Bytecodes::_if_icmpeq: ++ case Bytecodes::_if_icmpne: ++ case Bytecodes::_if_icmplt: ++ case Bytecodes::_if_icmpge: ++ case Bytecodes::_if_icmpgt: ++ case Bytecodes::_if_icmple: ++ case Bytecodes::_ifeq: ++ case Bytecodes::_ifne: ++ case Bytecodes::_iflt: ++ case Bytecodes::_ifge: ++ case Bytecodes::_ifgt: ++ case Bytecodes::_ifle: ++ case Bytecodes::_if_acmpeq: ++ case Bytecodes::_if_acmpne: ++ case Bytecodes::_ifnull: ++ case Bytecodes::_ifnonnull: ++ target = bcs.dest(); ++ if (visited_branches->contains(bci)) { ++ if (bci_stack->is_empty()) return true; ++ // Pop a bytecode starting offset and scan from there. ++ bcs.set_start(bci_stack->pop()); ++ } else { ++ if (target > bci) { // forward branch ++ if (target >= code_length) return false; ++ // Push the branch target onto the stack. ++ bci_stack->push(target); ++ // then, scan bytecodes starting with next. ++ bcs.set_start(bcs.next_bci()); ++ } else { // backward branch ++ // Push bytecode offset following backward branch onto the stack. ++ bci_stack->push(bcs.next_bci()); ++ // Check bytecodes starting with branch target. ++ bcs.set_start(target); ++ } ++ // Record target so we don't branch here again. ++ visited_branches->append(bci); ++ } ++ break; ++ ++ case Bytecodes::_goto: ++ case Bytecodes::_goto_w: ++ target = (opcode == Bytecodes::_goto ? bcs.dest() : bcs.dest_w()); ++ if (visited_branches->contains(bci)) { ++ if (bci_stack->is_empty()) return true; ++ // Been here before, pop new starting offset from stack. ++ bcs.set_start(bci_stack->pop()); ++ } else { ++ if (target >= code_length) return false; ++ // Continue scanning from the target onward. ++ bcs.set_start(target); ++ // Record target so we don't branch here again. ++ visited_branches->append(bci); ++ } ++ break; ++ ++ // Check that all switch alternatives end in 'athrow' bytecodes. Since it ++ // is difficult to determine where each switch alternative ends, parse ++ // each switch alternative until either hit a 'return', 'athrow', or reach ++ // the end of the method's bytecodes. This is gross but should be okay ++ // because: ++ // 1. tableswitch and lookupswitch byte codes in handlers for ctor explicit ++ // constructor invocations should be rare. ++ // 2. if each switch alternative ends in an athrow then the parsing should be ++ // short. If there is no athrow then it is bogus code, anyway. ++ case Bytecodes::_lookupswitch: ++ case Bytecodes::_tableswitch: ++ { ++ address aligned_bcp = (address) round_to((intptr_t)(bcs.bcp() + 1), jintSize); ++ u4 default_offset = Bytes::get_Java_u4(aligned_bcp) + bci; ++ int keys, delta; ++ if (opcode == Bytecodes::_tableswitch) { ++ jint low = (jint)Bytes::get_Java_u4(aligned_bcp + jintSize); ++ jint high = (jint)Bytes::get_Java_u4(aligned_bcp + 2*jintSize); ++ // This is invalid, but let the regular bytecode verifier ++ // report this because the user will get a better error message. ++ if (low > high) return true; ++ keys = high - low + 1; ++ delta = 1; ++ } else { ++ keys = (int)Bytes::get_Java_u4(aligned_bcp + jintSize); ++ delta = 2; ++ } ++ // Invalid, let the regular bytecode verifier deal with it. ++ if (keys < 0) return true; ++ ++ // Push the offset of the next bytecode onto the stack. ++ bci_stack->push(bcs.next_bci()); ++ ++ // Push the switch alternatives onto the stack. ++ for (int i = 0; i < keys; i++) { ++ u4 target = bci + (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize); ++ if (target > code_length) return false; ++ bci_stack->push(target); ++ } ++ ++ // Start bytecode parsing for the switch at the default alternative. ++ if (default_offset > code_length) return false; ++ bcs.set_start(default_offset); ++ break; ++ } ++ ++ case Bytecodes::_return: ++ return false; ++ ++ case Bytecodes::_athrow: ++ { ++ if (bci_stack->is_empty()) { ++ if (handler_stack->is_empty()) { ++ return true; ++ } else { ++ // Parse the catch handlers for try blocks containing athrow. ++ bcs.set_start(handler_stack->pop()); ++ } ++ } else { ++ // Pop a bytecode offset and starting scanning from there. ++ bcs.set_start(bci_stack->pop()); ++ } ++ } ++ break; ++ ++ default: ++ ; ++ } // end switch ++ } // end while loop ++ ++ return false; ++} ++ + void ClassVerifier::verify_invoke_init( + RawBytecodeStream* bcs, u2 ref_class_index, VerificationType ref_class_type, + StackMapFrame* current_frame, u4 code_length, bool *this_uninit, +@@ -2252,25 +2425,26 @@ + return; + } + +- // Make sure that this call is not jumped over. +- if (bci < furthest_jump()) { +- verify_error(ErrorContext::bad_code(bci), +- "Bad method call from inside of a branch"); +- return; +- } +- +- // Make sure that this call is not done from within a TRY block because +- // that can result in returning an incomplete object. Simply checking +- // (bci >= start_pc) also ensures that this call is not done after a TRY +- // block. That is also illegal because this call must be the first Java +- // statement in the constructor. ++ // Check if this call is done from inside of a TRY block. If so, make ++ // sure that all catch clause paths end in a throw. Otherwise, this ++ // can result in returning an incomplete object. + ExceptionTable exhandlers(_method()); + int exlength = exhandlers.length(); + for(int i = 0; i < exlength; i++) { +- if (bci >= exhandlers.start_pc(i)) { +- verify_error(ErrorContext::bad_code(bci), +- "Bad method call from after the start of a try block"); +- return; ++ u2 start_pc = exhandlers.start_pc(i); ++ u2 end_pc = exhandlers.end_pc(i); ++ ++ if (bci >= start_pc && bci < end_pc) { ++ if (!ends_in_athrow(exhandlers.handler_pc(i))) { ++ verify_error(ErrorContext::bad_code(bci), ++ "Bad method call from after the start of a try block"); ++ return; ++ } else if (VerboseVerification) { ++ ResourceMark rm; ++ tty->print_cr( ++ "Survived call to ends_in_athrow(): %s", ++ current_class()->name()->as_C_string()); ++ } + } + } + +@@ -2315,7 +2489,7 @@ + instanceKlassHandle mh(THREAD, m->method_holder()); + if (m->is_protected() && !mh->is_same_class_package(_klass())) { + bool assignable = current_type().is_assignable_from( +- objectref_type, this, CHECK_VERIFY(this)); ++ objectref_type, this, true, CHECK_VERIFY(this)); + if (!assignable) { + verify_error(ErrorContext::bad_type(bci, + TypeOrigin::cp(new_class_index, objectref_type), +@@ -2490,11 +2664,11 @@ + bool have_imr_indirect = cp->tag_at(index).value() == JVM_CONSTANT_InterfaceMethodref; + if (!current_class()->is_anonymous()) { + subtype = ref_class_type.is_assignable_from( +- current_type(), this, CHECK_VERIFY(this)); ++ current_type(), this, false, CHECK_VERIFY(this)); + } else { + VerificationType host_klass_type = + VerificationType::reference_type(current_class()->host_klass()->name()); +- subtype = ref_class_type.is_assignable_from(host_klass_type, this, CHECK_VERIFY(this)); ++ subtype = ref_class_type.is_assignable_from(host_klass_type, this, false, CHECK_VERIFY(this)); + + // If invokespecial of IMR, need to recheck for same or + // direct interface relative to the host class +@@ -2538,7 +2712,7 @@ + VerificationType top = current_frame->pop_stack(CHECK_VERIFY(this)); + VerificationType hosttype = + VerificationType::reference_type(current_class()->host_klass()->name()); +- bool subtype = hosttype.is_assignable_from(top, this, CHECK_VERIFY(this)); ++ bool subtype = hosttype.is_assignable_from(top, this, false, CHECK_VERIFY(this)); + if (!subtype) { + verify_error( ErrorContext::bad_type(current_frame->offset(), + current_frame->stack_top_ctx(), +@@ -2563,7 +2737,7 @@ + // It's protected access, check if stack object is + // assignable to current class. + bool is_assignable = current_type().is_assignable_from( +- stack_object_type, this, CHECK_VERIFY(this)); ++ stack_object_type, this, true, CHECK_VERIFY(this)); + if (!is_assignable) { + if (ref_class_type.name() == vmSymbols::java_lang_Object() + && stack_object_type.is_array() +@@ -2746,7 +2920,7 @@ + "Method expects a return value"); + return; + } +- bool match = return_type.is_assignable_from(type, this, CHECK_VERIFY(this)); ++ bool match = return_type.is_assignable_from(type, this, false, CHECK_VERIFY(this)); + if (!match) { + verify_error(ErrorContext::bad_type(bci, + current_frame->stack_top_ctx(), TypeOrigin::signature(return_type)), +--- ./hotspot/src/share/vm/classfile/verifier.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verifier.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -30,6 +30,7 @@ + #include "oops/klass.hpp" + #include "oops/method.hpp" + #include "runtime/handles.hpp" ++#include "utilities/growableArray.hpp" + #include "utilities/exceptions.hpp" + + // The verifier class +@@ -258,9 +259,6 @@ + + ErrorContext _error_context; // contains information about an error + +- // Used to detect illegal jumps over calls to super() nd this() in ctors. +- int32_t _furthest_jump; +- + void verify_method(methodHandle method, TRAPS); + char* generate_code_data(methodHandle m, u4 code_length, TRAPS); + void verify_exception_handler_table(u4 code_length, char* code_data, +@@ -306,6 +304,16 @@ + StackMapFrame* current_frame, u4 code_length, bool* this_uninit, + constantPoolHandle cp, TRAPS); + ++ // Used by ends_in_athrow() to push all handlers that contain bci onto ++ // the handler_stack, if the handler is not already on the stack. ++ void push_handlers(ExceptionTable* exhandlers, ++ GrowableArray* handler_stack, ++ u4 bci); ++ ++ // Returns true if all paths starting with start_bc_offset end in athrow ++ // bytecode or loop. ++ bool ends_in_athrow(u4 start_bc_offset); ++ + void verify_invoke_instructions( + RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame, + bool* this_uninit, VerificationType return_type, +@@ -407,19 +415,6 @@ + + TypeOrigin ref_ctx(const char* str, TRAPS); + +- // Keep track of the furthest branch done in a method to make sure that +- // there are no branches over calls to super() or this() from inside of +- // a constructor. +- int32_t furthest_jump() { return _furthest_jump; } +- +- void set_furthest_jump(int32_t target) { +- _furthest_jump = target; +- } +- +- void update_furthest_jump(int32_t target) { +- if (target > _furthest_jump) _furthest_jump = target; +- } +- + }; + + inline int ClassVerifier::change_sig_to_verificationType( +--- ./hotspot/src/share/vm/interpreter/linkResolver.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/linkResolver.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -246,6 +246,12 @@ + // Ignore overpasses so statics can be found during resolution + Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::skip_overpass); + ++ if (klass->oop_is_array()) { ++ // Only consider klass and super klass for arrays ++ result = methodHandle(THREAD, result_oop); ++ return; ++ } ++ + // JDK 8, JVMS 5.4.3.4: Interface method resolution should + // ignore static and non-public methods of java.lang.Object, + // like clone, finalize, registerNatives. +@@ -290,6 +296,11 @@ + result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, Klass::normal)); + } + ++ if (klass->oop_is_array()) { ++ // Only consider klass and super klass for arrays ++ return; ++ } ++ + if (result.is_null()) { + Array* default_methods = InstanceKlass::cast(klass())->default_methods(); + if (default_methods != NULL) { +@@ -546,7 +557,7 @@ + // 2. lookup method in resolved klass and its super klasses + lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK); + +- if (resolved_method.is_null()) { // not found in the class hierarchy ++ if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { // not found in the class hierarchy + // 3. lookup method in all the interfaces implemented by the resolved klass + lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK); + +@@ -559,16 +570,16 @@ + CLEAR_PENDING_EXCEPTION; + } + } ++ } + +- if (resolved_method.is_null()) { +- // 4. method lookup failed +- ResourceMark rm(THREAD); +- THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(), +- Method::name_and_sig_as_C_string(resolved_klass(), +- method_name, +- method_signature), +- nested_exception); +- } ++ if (resolved_method.is_null()) { ++ // 4. method lookup failed ++ ResourceMark rm(THREAD); ++ THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(), ++ Method::name_and_sig_as_C_string(resolved_klass(), ++ method_name, ++ method_signature), ++ nested_exception); + } + + // 5. access checks, access checking may be turned off when calling from within the VM. +@@ -634,17 +645,18 @@ + // JDK8: also look for static methods + lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, false, true, CHECK); + +- if (resolved_method.is_null()) { ++ if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { + // lookup method in all the super-interfaces + lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK); +- if (resolved_method.is_null()) { +- // no method found +- ResourceMark rm(THREAD); +- THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(), +- Method::name_and_sig_as_C_string(resolved_klass(), +- method_name, +- method_signature)); +- } ++ } ++ ++ if (resolved_method.is_null()) { ++ // no method found ++ ResourceMark rm(THREAD); ++ THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(), ++ Method::name_and_sig_as_C_string(resolved_klass(), ++ method_name, ++ method_signature)); + } + + if (check_access) { +@@ -776,7 +788,7 @@ + } + + // Resolve instance field +- KlassHandle sel_klass(THREAD, InstanceKlass::cast(resolved_klass())->find_field(field, sig, &fd)); ++ KlassHandle sel_klass(THREAD, resolved_klass->find_field(field, sig, &fd)); + // check if field exists; i.e., if a klass containing the field def has been selected + if (sel_klass.is_null()) { + ResourceMark rm(THREAD); +--- ./hotspot/src/share/vm/memory/filemap.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/memory/filemap.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -177,7 +177,14 @@ + fail_continue("The shared archive file has the wrong version."); + return false; + } +- _file_offset = (long)n; ++ size_t len = lseek(fd, 0, SEEK_END); ++ struct FileMapInfo::FileMapHeader::space_info* si = ++ &_header._space[MetaspaceShared::mc]; ++ if (si->_file_offset >= len || len - si->_file_offset < si->_used) { ++ fail_continue("The shared archive file has been truncated."); ++ return false; ++ } ++ _file_offset = n; + return true; + } + +@@ -268,6 +275,7 @@ + si->_capacity = capacity; + si->_read_only = read_only; + si->_allow_exec = allow_exec; ++ si->_crc = ClassLoader::crc32(0, base, (jint)size); + write_bytes_aligned(base, (int)size); + } + +@@ -292,14 +300,15 @@ + // Align file position to an allocation unit boundary. + + void FileMapInfo::align_file_position() { +- long new_file_offset = align_size_up(_file_offset, os::vm_allocation_granularity()); ++ size_t new_file_offset = align_size_up(_file_offset, ++ os::vm_allocation_granularity()); + if (new_file_offset != _file_offset) { + _file_offset = new_file_offset; + if (_file_open) { + // Seek one byte back from the target and write a byte to insure + // that the written file is the correct length. + _file_offset -= 1; +- if (lseek(_fd, _file_offset, SEEK_SET) < 0) { ++ if (lseek(_fd, (long)_file_offset, SEEK_SET) < 0) { + fail_stop("Unable to seek.", NULL); + } + char zero = 0; +@@ -406,6 +415,19 @@ + return base; + } + ++bool FileMapInfo::verify_region_checksum(int i) { ++ if (!VerifySharedSpaces) { ++ return true; ++ } ++ const char* buf = _header._space[i]._base; ++ size_t sz = _header._space[i]._used; ++ int crc = ClassLoader::crc32(0, buf, (jint)sz); ++ if (crc != _header._space[i]._crc) { ++ fail_continue("Checksum verification failed."); ++ return false; ++ } ++ return true; ++} + + // Unmap a memory region in the address space. + +@@ -457,8 +479,20 @@ + return true; + } + ++int FileMapInfo::compute_header_crc() { ++ char* header = (char*)&_header; ++ // start computing from the field after _crc ++ char* buf = (char*)&_header._crc + sizeof(int); ++ size_t sz = sizeof(FileMapInfo::FileMapHeader) - (buf - header); ++ int crc = ClassLoader::crc32(0, buf, (jint)sz); ++ return crc; ++} + + bool FileMapInfo::validate() { ++ if (VerifySharedSpaces && compute_header_crc() != _header._crc) { ++ fail_continue("Header checksum verification failed."); ++ return false; ++ } + if (_header._version != current_version()) { + fail_continue("The shared archive file is the wrong version."); + return false; +--- ./hotspot/src/share/vm/memory/filemap.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/memory/filemap.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -54,7 +54,7 @@ + + bool _file_open; + int _fd; +- long _file_offset; ++ size_t _file_offset; + + // FileMapHeader describes the shared space data in the file to be + // mapped. This structure gets written to a file. It is not a class, so +@@ -62,12 +62,14 @@ + + struct FileMapHeader { + int _magic; // identify file type. ++ int _crc; // header crc checksum. + int _version; // (from enum, above.) + size_t _alignment; // how shared archive should be aligned + int _obj_alignment; // value of ObjectAlignmentInBytes + + struct space_info { +- int _file_offset; // sizeof(this) rounded to vm page size ++ int _crc; // crc checksum of the current space ++ size_t _file_offset; // sizeof(this) rounded to vm page size + char* _base; // copy-on-write base address + size_t _capacity; // for validity checking + size_t _used; // for setting space top on read +@@ -104,6 +106,8 @@ + } + + static int current_version() { return _current_version; } ++ int compute_header_crc(); ++ void set_header_crc(int crc) { _header._crc = crc; } + void populate_header(size_t alignment); + bool validate(); + void invalidate(); +@@ -136,6 +140,7 @@ + void write_bytes_aligned(const void* buffer, int count); + char* map_region(int i); + void unmap_region(int i); ++ bool verify_region_checksum(int i); + void close(); + bool is_open() { return _file_open; } + ReservedSpace reserve_shared_memory(); +--- ./hotspot/src/share/vm/memory/metaspaceShared.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/memory/metaspaceShared.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -585,6 +585,7 @@ + + // Pass 2 - write data. + mapinfo->open_for_write(); ++ mapinfo->set_header_crc(mapinfo->compute_header_crc()); + mapinfo->write_header(); + mapinfo->write_space(MetaspaceShared::ro, _loader_data->ro_metaspace(), true); + mapinfo->write_space(MetaspaceShared::rw, _loader_data->rw_metaspace(), false); +@@ -863,9 +864,13 @@ + + // Map each shared region + if ((_ro_base = mapinfo->map_region(ro)) != NULL && ++ mapinfo->verify_region_checksum(ro) && + (_rw_base = mapinfo->map_region(rw)) != NULL && ++ mapinfo->verify_region_checksum(rw) && + (_md_base = mapinfo->map_region(md)) != NULL && ++ mapinfo->verify_region_checksum(md) && + (_mc_base = mapinfo->map_region(mc)) != NULL && ++ mapinfo->verify_region_checksum(mc) && + (image_alignment == (size_t)max_alignment())) { + // Success (no need to do anything) + return true; +--- ./hotspot/src/share/vm/oops/arrayKlass.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/oops/arrayKlass.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -64,6 +64,13 @@ + return NULL; + } + ++// find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined ++Klass* ArrayKlass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const { ++ // There are no fields in an array klass but look to the super class (Object) ++ assert(super(), "super klass must be present"); ++ return super()->find_field(name, sig, fd); ++} ++ + Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const { + // There are no methods in an array klass but the super class (Object) has some + assert(super(), "super klass must be present"); +--- ./hotspot/src/share/vm/oops/arrayKlass.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/oops/arrayKlass.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -28,6 +28,7 @@ + #include "memory/universe.hpp" + #include "oops/klass.hpp" + ++class fieldDescriptor; + class klassVtable; + + // ArrayKlass is the abstract baseclass for all array classes +@@ -85,6 +86,9 @@ + virtual oop multi_allocate(int rank, jint* sizes, TRAPS); + objArrayOop allocate_arrayArray(int n, int length, TRAPS); + ++ // find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined ++ Klass* find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const; ++ + // Lookup operations + Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const; + +--- ./hotspot/src/share/vm/oops/klass.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/oops/klass.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -128,6 +128,15 @@ + return is_subclass_of(k); + } + ++Klass* Klass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const { ++#ifdef ASSERT ++ tty->print_cr("Error: find_field called on a klass oop." ++ " Likely error: reflection method does not correctly" ++ " wrap return value in a mirror object."); ++#endif ++ ShouldNotReachHere(); ++ return NULL; ++} + + Method* Klass::uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const { + #ifdef ASSERT +--- ./hotspot/src/share/vm/oops/klass.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/oops/klass.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -91,6 +91,7 @@ + class klassVtable; + class ParCompactionManager; + class KlassSizeStats; ++class fieldDescriptor; + + class Klass : public Metadata { + friend class VMStructs; +@@ -423,6 +424,7 @@ + virtual void initialize(TRAPS); + // lookup operation for MethodLookupCache + friend class MethodLookupCache; ++ virtual Klass* find_field(Symbol* name, Symbol* signature, fieldDescriptor* fd) const; + virtual Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const; + public: + Method* lookup_method(Symbol* name, Symbol* signature) const { +--- ./hotspot/src/share/vm/prims/jvm.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvm.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -803,6 +803,7 @@ + return (jclass) JNIHandles::make_local(env, k->java_mirror()); + JVM_END + ++// Not used; JVM_FindClassFromCaller replaces this. + JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, + jboolean init, jobject loader, + jboolean throwError)) +@@ -829,6 +830,42 @@ + return result; + JVM_END + ++// Find a class with this name in this loader, using the caller's protection domain. ++JVM_ENTRY(jclass, JVM_FindClassFromCaller(JNIEnv* env, const char* name, ++ jboolean init, jobject loader, ++ jclass caller)) ++ JVMWrapper2("JVM_FindClassFromCaller %s throws ClassNotFoundException", name); ++ // Java libraries should ensure that name is never null... ++ if (name == NULL || (int)strlen(name) > Symbol::max_length()) { ++ // It's impossible to create this class; the name cannot fit ++ // into the constant pool. ++ THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name); ++ } ++ ++ TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL); ++ ++ oop loader_oop = JNIHandles::resolve(loader); ++ oop from_class = JNIHandles::resolve(caller); ++ oop protection_domain = NULL; ++ // If loader is null, shouldn't call ClassLoader.checkPackageAccess; otherwise get ++ // NPE. Put it in another way, the bootstrap class loader has all permission and ++ // thus no checkPackageAccess equivalence in the VM class loader. ++ // The caller is also passed as NULL by the java code if there is no security ++ // manager to avoid the performance cost of getting the calling class. ++ if (from_class != NULL && loader_oop != NULL) { ++ protection_domain = java_lang_Class::as_Klass(from_class)->protection_domain(); ++ } ++ ++ Handle h_loader(THREAD, loader_oop); ++ Handle h_prot(THREAD, protection_domain); ++ jclass result = find_class_from_class_loader(env, h_name, init, h_loader, ++ h_prot, false, THREAD); ++ ++ if (TraceClassResolution && result != NULL) { ++ trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result))); ++ } ++ return result; ++JVM_END + + JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name, + jboolean init, jclass from)) +@@ -3984,10 +4021,15 @@ + + // Shared JNI/JVM entry points ////////////////////////////////////////////////////////////// + +-jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) { ++jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, ++ Handle loader, Handle protection_domain, ++ jboolean throwError, TRAPS) { + // Security Note: + // The Java level wrapper will perform the necessary security check allowing +- // us to pass the NULL as the initiating class loader. ++ // us to pass the NULL as the initiating class loader. The VM is responsible for ++ // the checkPackageAccess relative to the initiating class loader via the ++ // protection_domain. The protection_domain is passed as NULL by the java code ++ // if there is no security manager in 3-arg Class.forName(). + Klass* klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL); + + KlassHandle klass_handle(THREAD, klass); +--- ./hotspot/src/share/vm/prims/jvm.h Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvm.h Mon Sep 08 12:35:01 2014 -0700 +@@ -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 +@@ -420,6 +420,19 @@ + JVM_FindClassFromBootLoader(JNIEnv *env, const char *name); + + /* ++ * Find a class from a given class loader. Throws ClassNotFoundException. ++ * name: name of class ++ * init: whether initialization is done ++ * loader: class loader to look up the class. This may not be the same as the caller's ++ * class loader. ++ * caller: initiating class. The initiating class may be null when a security ++ * manager is not installed. ++ */ ++JNIEXPORT jclass JNICALL ++JVM_FindClassFromCaller(JNIEnv *env, const char *name, jboolean init, ++ jobject loader, jclass caller); ++ ++/* + * Find a class from a given class. + */ + JNIEXPORT jclass JNICALL +--- ./hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/arguments.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -2387,6 +2387,10 @@ + warning("The VM option CICompilerCountPerCPU overrides CICompilerCount."); + } + ++#ifdef COMPILER1 ++ status &= verify_interval(SafepointPollOffset, 0, os::vm_page_size() - BytesPerWord, "SafepointPollOffset"); ++#endif ++ + return status; + } + +@@ -3577,6 +3581,11 @@ + return JNI_ENOMEM; + } + ++ // Set up VerifySharedSpaces ++ if (FLAG_IS_DEFAULT(VerifySharedSpaces) && SharedArchiveFile != NULL) { ++ VerifySharedSpaces = true; ++ } ++ + // Delay warning until here so that we've had a chance to process + // the -XX:-PrintWarnings flag + if (needs_hotspotrc_warning) { +--- ./hotspot/src/share/vm/runtime/globals.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/globals.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -1142,11 +1142,11 @@ + "Prevent spurious or premature wakeups from object.wait " \ + "(Solaris only)") \ + \ +- product(intx, NativeMonitorTimeout, -1, "(Unstable)") \ +- \ +- product(intx, NativeMonitorFlags, 0, "(Unstable)") \ +- \ +- product(intx, NativeMonitorSpinLimit, 20, "(Unstable)") \ ++ experimental(intx, NativeMonitorTimeout, -1, "(Unstable)") \ ++ \ ++ experimental(intx, NativeMonitorFlags, 0, "(Unstable)") \ ++ \ ++ experimental(intx, NativeMonitorSpinLimit, 20, "(Unstable)") \ + \ + develop(bool, UsePthreads, false, \ + "Use pthread-based instead of libthread-based synchronization " \ +@@ -3745,6 +3745,10 @@ + product(bool, UseSharedSpaces, true, \ + "Use shared spaces for metadata") \ + \ ++ product(bool, VerifySharedSpaces, false, \ ++ "Verify shared spaces (false for default archive, true for " \ ++ "archive specified by -XX:SharedArchiveFile)") \ ++ \ + product(bool, RequireSharedSpaces, false, \ + "Require shared spaces for metadata") \ + \ +--- ./hotspot/src/share/vm/runtime/reflection.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/reflection.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -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 +@@ -482,7 +482,7 @@ + ik = InstanceKlass::cast(hc); + + // There's no way to make a host class loop short of patching memory. +- // Therefore there cannot be a loop here unles there's another bug. ++ // Therefore there cannot be a loop here unless there's another bug. + // Still, let's check for it. + assert(--inf_loop_check > 0, "no host_klass loop"); + } +@@ -551,7 +551,8 @@ + if (access.is_protected()) { + if (!protected_restriction) { + // See if current_class (or outermost host class) is a subclass of field_class +- if (host_class->is_subclass_of(field_class)) { ++ // An interface may not access protected members of j.l.Object ++ if (!host_class->is_interface() && host_class->is_subclass_of(field_class)) { + if (access.is_static() || // static fields are ok, see 6622385 + current_class == resolved_class || + field_class == resolved_class || +--- ./hotspot/test/runtime/7116786/Test7116786.java Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/test/runtime/7116786/Test7116786.java Mon Sep 08 12:35:01 2014 -0700 +@@ -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 +@@ -147,7 +147,8 @@ + "no stackmap frame at jump location or bad jump", + "Inconsistent stackmap frames at branch target "), + +- new Case("case15", "stackMapTable.cpp", true, "check_new_object", ++ /* Backward jump with uninit is allowed starting with JDK 8 */ ++ new Case("case15", "stackMapTable.cpp", false, "check_new_object", + "backward jump with uninit", + "Uninitialized object exists on backward branch "), + +--- ./jaxp/.hgtags Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/.hgtags Mon Sep 08 12:36:00 2014 -0700 +@@ -313,3 +313,21 @@ + d6ded60cfdc53861ae7d1a010f95b5036d610e80 jdk8u20-b23 + dd09d8b9edefb5684941941e5d9b35c84ee066f3 jdk8u20-b24 + dd09d8b9edefb5684941941e5d9b35c84ee066f3 jdk8u20-b25 ++938b9d502c2b0f9684151e1b1f47cf7052db1502 jdk8u20-b26 ++65e5ee249ebc81c0ccfff23946a0a2a6d4becdcc jdk8u25-b00 ++b29277565edfdece4e3928b135d4fd86ae141e4f jdk8u25-b01 ++09df5bda467090041090873f71d418eebcadf516 jdk8u25-b02 ++f3567e6bed22eaf89c3c7d64e0b1fa308707260f jdk8u25-b03 ++a4d0f11cf08d5dae91c5e9ad387b1ff88388503d jdk8u25-b04 ++0c4917cea678dc2a3745baca74016f0d6f169012 jdk8u25-b05 ++e84d78dd9e0533eb11c26b69727c044898d19f60 jdk8u25-b06 ++7aaaec31a0331ad091abedf81c928b47a982222d jdk8u25-b07 ++e48a4594f19ad119bc27d89c53dd35d11ed6da7d jdk8u25-b08 ++a09893b8f617912569196d7bd64a96c349796be0 jdk8u25-b09 ++85de91b6e953c8c21ac5e6d9a5e284f86d759680 jdk8u25-b10 ++5c1ac461fef7fe0f810bd9d6051db5a24247de1d jdk8u25-b11 ++c078e904db0a7be650e4ba2d665277785e2216b0 jdk8u25-b12 ++24184cfe0f8b0da0f349933ae7b5cc16455a52b8 jdk8u25-b13 ++90f3b8b970a8bb3173083111248372afdc61652d jdk8u25-b14 ++f5ac2e242bb95be0a3deddf37362178202086137 jdk8u25-b15 ++df68b132a471ed1e825a79bd1d8acb47d2bcc04f jdk8u25-b16 +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ja.java Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ja.java Mon Sep 08 12:36:00 2014 -0700 +@@ -679,7 +679,7 @@ + * documentation. + */ + {ErrorMsg.COMPILE_USAGE_STR, +- "SYNOPSIS\n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Compile [-o ]\n [-d ] [-j ] [-p ]\n [-n] [-x] [-u] [-v] [-h] { | -i }\n\nOPTIONS\n -o \u540D\u524D\u3092\u751F\u6210\u6E08translet\u306B\n \u5272\u308A\u5F53\u3066\u308B\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u306F\u3001translet\u540D\u306F\n \u540D\u306B\u7531\u6765\u3057\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\n \u8907\u6570\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u30B3\u30F3\u30D1\u30A4\u30EB\u3059\u308B\u5834\u5408\u306F\u7121\u8996\u3055\u308C\u307E\u3059\u3002\n -d translet\u306E\u5B9B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u6307\u5B9A\u3059\u308B\n -j \u3067\u6307\u5B9A\u3055\u308C\u308B\u540D\u524D\u306Ejar\u30D5\u30A1\u30A4\u30EB\u306Btranslet\u30AF\u30E9\u30B9\u3092\n \u30D1\u30C3\u30B1\u30FC\u30B8\u3059\u308B\n -p \u751F\u6210\u3055\u308C\u308B\u3059\u3079\u3066\u306Etranslet\u30AF\u30E9\u30B9\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u540D\n \u63A5\u982D\u8F9E\u3092\u6307\u5B9A\u3059\u308B\u3002\n -n \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u5316\u3092\u6709\u52B9\u306B\u3059\u308B(\u5E73\u5747\u3057\u3066\u30C7\u30D5\u30A9\u30EB\u30C8\u52D5\u4F5C\u306E\u65B9\u304C\n \u512A\u308C\u3066\u3044\u307E\u3059)\u3002\n -x \u8FFD\u52A0\u306E\u30C7\u30D0\u30C3\u30B0\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u51FA\u529B\u3092\u30AA\u30F3\u306B\u3059\u308B\n -u \u5F15\u6570\u3092URL\u3068\u3057\u3066\u89E3\u91C8\u3059\u308B\n -i \u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092stdin\u304B\u3089\u8AAD\u307F\u8FBC\u3080\u3053\u3068\u3092\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u5F37\u5236\u3059\u308B\n -v \u30B3\u30F3\u30D1\u30A4\u30E9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3059\u308B\n -h \u3053\u306E\u4F7F\u7528\u65B9\u6CD5\u306E\u6587\u3092\u51FA\u529B\u3059\u308B\n"}, ++ "\u5F62\u5F0F\n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Compile [-o ]\n [-d ] [-j ] [-p ]\n [-n] [-x] [-u] [-v] [-h] { | -i }\n\nOPTIONS\n -o \u540D\u524D\u3092\u751F\u6210\u6E08translet\u306B\n \u5272\u308A\u5F53\u3066\u308B\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u306F\u3001translet\u540D\u306F\n \u540D\u306B\u7531\u6765\u3057\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\n \u8907\u6570\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u30B3\u30F3\u30D1\u30A4\u30EB\u3059\u308B\u5834\u5408\u306F\u7121\u8996\u3055\u308C\u307E\u3059\u3002\n -d translet\u306E\u5B9B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u6307\u5B9A\u3059\u308B\n -j \u3067\u6307\u5B9A\u3055\u308C\u308B\u540D\u524D\u306Ejar\u30D5\u30A1\u30A4\u30EB\u306Btranslet\u30AF\u30E9\u30B9\u3092\n \u30D1\u30C3\u30B1\u30FC\u30B8\u3059\u308B\n -p \u751F\u6210\u3055\u308C\u308B\u3059\u3079\u3066\u306Etranslet\u30AF\u30E9\u30B9\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u540D\n \u63A5\u982D\u8F9E\u3092\u6307\u5B9A\u3059\u308B\u3002\n -n \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u5316\u3092\u6709\u52B9\u306B\u3059\u308B(\u5E73\u5747\u3057\u3066\u30C7\u30D5\u30A9\u30EB\u30C8\u52D5\u4F5C\u306E\u65B9\u304C\n \u512A\u308C\u3066\u3044\u307E\u3059)\u3002\n -x \u8FFD\u52A0\u306E\u30C7\u30D0\u30C3\u30B0\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u51FA\u529B\u3092\u30AA\u30F3\u306B\u3059\u308B\n -u \u5F15\u6570\u3092URL\u3068\u3057\u3066\u89E3\u91C8\u3059\u308B\n -i \u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092stdin\u304B\u3089\u8AAD\u307F\u8FBC\u3080\u3053\u3068\u3092\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u5F37\u5236\u3059\u308B\n -v \u30B3\u30F3\u30D1\u30A4\u30E9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3059\u308B\n -h \u3053\u306E\u4F7F\u7528\u65B9\u6CD5\u306E\u6587\u3092\u51FA\u529B\u3059\u308B\n"}, + + /* + * Note to translators: This message contains usage information for a +@@ -691,7 +691,7 @@ + * documentation. + */ + {ErrorMsg.TRANSFORM_USAGE_STR, +- "SYNOPSIS \n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Transform [-j ]\n [-x] [-n ] {-u | }\n [= ...]\n\n translet \u3092\u4F7F\u7528\u3057\u3066\u3001\u3067\u6307\u5B9A\u3055\u308C\u308B\n XML\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u5909\u63DB\u3059\u308B\u3002translet \u306F\n \u30E6\u30FC\u30B6\u30FC\u306ECLASSPATH\u5185\u304B\u3001\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u6307\u5B9A\u3055\u308C\u305F\u5185\u306B\u3042\u308A\u307E\u3059\u3002\nOPTIONS\n -j translet\u3092\u30ED\u30FC\u30C9\u3059\u308Bjarfile\u3092\u6307\u5B9A\u3059\u308B\n -x \u8FFD\u52A0\u306E\u30C7\u30D0\u30C3\u30B0\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u51FA\u529B\u3092\u30AA\u30F3\u306B\u3059\u308B\n -n \u5909\u63DB\u3092\u56DE\u5B9F\u884C\u3057\u3001\n \u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u60C5\u5831\u3092\u8868\u793A\u3059\u308B\n -u XML\u5165\u529B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092URL\u3068\u3057\u3066\u6307\u5B9A\u3059\u308B\n"}, ++ "\u5F62\u5F0F \n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Transform [-j ]\n [-x] [-n ] {-u | }\n [= ...]\n\n translet \u3092\u4F7F\u7528\u3057\u3066\u3001\u3067\u6307\u5B9A\u3055\u308C\u308B\n XML\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u5909\u63DB\u3059\u308B\u3002translet \u306F\n \u30E6\u30FC\u30B6\u30FC\u306ECLASSPATH\u5185\u304B\u3001\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u6307\u5B9A\u3055\u308C\u305F\u5185\u306B\u3042\u308A\u307E\u3059\u3002\nOPTIONS\n -j translet\u3092\u30ED\u30FC\u30C9\u3059\u308Bjarfile\u3092\u6307\u5B9A\u3059\u308B\n -x \u8FFD\u52A0\u306E\u30C7\u30D0\u30C3\u30B0\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u51FA\u529B\u3092\u30AA\u30F3\u306B\u3059\u308B\n -n \u5909\u63DB\u3092\u56DE\u5B9F\u884C\u3057\u3001\n \u30D7\u30ED\u30D5\u30A1\u30A4\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3059\u308B\n -u XML\u5165\u529B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092URL\u3068\u3057\u3066\u6307\u5B9A\u3059\u308B\n"}, + + + +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Mon Sep 08 12:36:00 2014 -0700 +@@ -612,9 +612,9 @@ + //fElementStack2.clear(); + //fReplaceEntityReferences = true; + //fSupportExternalEntities = true; +- Boolean bo = (Boolean)propertyManager.getProperty(XMLInputFactoryImpl.IS_REPLACING_ENTITY_REFERENCES); ++ Boolean bo = (Boolean)propertyManager.getProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES); + fReplaceEntityReferences = bo.booleanValue(); +- bo = (Boolean)propertyManager.getProperty(XMLInputFactoryImpl.IS_SUPPORTING_EXTERNAL_ENTITIES); ++ bo = (Boolean)propertyManager.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES); + fSupportExternalEntities = bo.booleanValue(); + Boolean cdata = (Boolean)propertyManager.getProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.STAX_REPORT_CDATA_EVENT) ; + if(cdata != null) +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java Mon Sep 08 12:36:00 2014 -0700 +@@ -53,6 +53,7 @@ + import java.util.Map; + import java.util.Stack; + import javax.xml.XMLConstants; ++import javax.xml.stream.XMLInputFactory; + + + /** +@@ -305,6 +306,11 @@ + /** Property Manager. This is used from Stax */ + protected PropertyManager fPropertyManager ; + ++ /** StAX properties */ ++ boolean fSupportDTD = true; ++ boolean fReplaceEntityReferences = true; ++ boolean fSupportExternalEntities = true; ++ + /** used to restrict external access */ + protected String fAccessExternalDTD = EXTERNAL_ACCESS_DEFAULT; + +@@ -1136,7 +1142,8 @@ + boolean parameter = entityName.startsWith("%"); + boolean general = !parameter; + if (unparsed || (general && !fExternalGeneralEntities) || +- (parameter && !fExternalParameterEntities)) { ++ (parameter && !fExternalParameterEntities) || ++ !fSupportDTD || !fSupportExternalEntities) { + + if (fEntityHandler != null) { + fResourceIdentifier.clear(); +@@ -1431,6 +1438,10 @@ + fStaxEntityResolver = null; + } + ++ fSupportDTD = ((Boolean)propertyManager.getProperty(XMLInputFactory.SUPPORT_DTD)).booleanValue(); ++ fReplaceEntityReferences = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES)).booleanValue(); ++ fSupportExternalEntities = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES)).booleanValue(); ++ + // Zephyr feature ignore-external-dtd is the opposite of Xerces' load-external-dtd + fLoadExternalDTD = !((Boolean)propertyManager.getProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.IGNORE_EXTERNAL_DTD)).booleanValue(); + +@@ -1502,6 +1513,11 @@ + fSecurityManager = (XMLSecurityManager)componentManager.getProperty(SECURITY_MANAGER, null); + entityExpansionIndex = fSecurityManager.getIndex(Constants.JDK_ENTITY_EXPANSION_LIMIT); + ++ //StAX Property ++ fSupportDTD = true; ++ fReplaceEntityReferences = true; ++ fSupportExternalEntities = true; ++ + // JAXP 1.5 feature + XMLSecurityPropertyManager spm = (XMLSecurityPropertyManager) componentManager.getProperty(XML_SECURITY_PROPERTY_MANAGER, null); + if (spm == null) { +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_de.properties Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_de.properties Mon Sep 08 12:36:00 2014 -0700 +@@ -26,7 +26,7 @@ + SYNTAX_ERR = Ung\u00FCltige Zeichenfolge angegeben. + VALIDATION_ERR = Aufruf einer Methode wie insertBefore oder removeChild w\u00FCrde die Dokumentgrammatik des Knotens ung\u00FCltig machen. + WRONG_DOCUMENT_ERR = Ein Knoten wird in einem anderen Dokument verwendet als dem, von dem er erstellt wurde. +-TYPE_MISMATCH_ERR = Der Wertetyp f\u00FCr diesen Parameternamen ist nicht mit dem erwarteten Wertetyp kompatibel. ++TYPE_MISMATCH_ERR = Der Werttyp f\u00FCr diesen Parameternamen ist nicht mit dem erwarteten Werttyp kompatibel. + + #error messages or exceptions + FEATURE_NOT_SUPPORTED = Parameter {0} wird erkannt, aber der angeforderte Wert kann nicht festgelegt werden. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XIncludeMessages_de.properties Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XIncludeMessages_de.properties Mon Sep 08 12:36:00 2014 -0700 +@@ -27,7 +27,7 @@ + UnexpandedEntityReferenceIllegal = Der Ersatz eines "include"-Elements, das als Dokumentelement im Quell-Infoset der obersten Ebene angezeigt wird, darf keine nicht erweiterten Entit\u00E4tsreferenzen enthalten. + HrefFragmentIdentifierIllegal = Fragment-IDs d\u00FCrfen nicht verwendet werden. Der "href"-Attributwert "{0}" ist nicht zul\u00E4ssig. + HrefSyntacticallyInvalid = "href"-Attributwert "{0}" hat eine ung\u00FCltige Syntax. Nach Anwenden der Escape-Regeln ist der Wert kein syntaktisch korrekter URI oder IRI. +-XPointerStreamability = Es wurde ein xpointer angegeben, der auf eine Stelle im Quell-Infoset verweist. Auf diese Stelle kann aufgrund des Streaming-Charakters des Prozessors nicht zugegriffen werden. ++XPointerStreamability = Es wurde ein xpointer angegeben, der auf eine Stelle im Quell-Infoset verweist. Auf diese Stelle kann aufgrund des Streamingcharakters des Prozessors nicht zugegriffen werden. + + XPointerResolutionUnsuccessful = XPointer-Aufl\u00F6sung nicht erfolgreich. + +--- ./jaxp/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java Mon Sep 08 12:36:00 2014 -0700 +@@ -3,7 +3,7 @@ + * DO NOT REMOVE OR ALTER! + */ + /* +- * Copyright 1999-2004 The Apache Software Foundation. ++ * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. +@@ -878,7 +878,7 @@ + { "optionIN", " [-in inputXMLURL]"}, + { "optionSelect", " [-select xpath expression]"}, + { "optionMatch", " [-match match pattern (f\u00FCr Vergleichsdiagnose)]"}, +- { "optionAnyExpr", "Oder nur ein XPath-Ausdruck f\u00FChrt einen Diagnose-Dump aus"}, ++ { "optionAnyExpr", "Oder nur ein XPath-Ausdruck f\u00FChrt einen Diagnosedump aus"}, + { "noParsermsg1", "XSL-Prozess war nicht erfolgreich."}, + { "noParsermsg2", "** Parser konnte nicht gefunden werden **"}, + { "noParsermsg3", "Pr\u00FCfen Sie den Classpath."}, +--- ./jaxws/.hgtags Wed Jul 30 03:53:36 2014 -0700 ++++ ./jaxws/.hgtags Mon Sep 08 12:36:09 2014 -0700 +@@ -311,3 +311,21 @@ + f3bf1b270fea8b17aa2846f962f7514b6f772ab4 jdk8u20-b23 + 1277c0d492fd9253f1ea2730eb160953397bd939 jdk8u20-b24 + 1277c0d492fd9253f1ea2730eb160953397bd939 jdk8u20-b25 ++7025a2c10ea4116ce8f31bb1e305f732aa1025f0 jdk8u20-b26 ++efc85d318f4697f40bdd1f3757677be97f1758d9 jdk8u25-b00 ++a76779e1b0376650dfc29a1f3b14760f05e0fc6d jdk8u25-b01 ++3d31955043b9f1807c9d695c7b5d604d11c132cf jdk8u25-b02 ++c67cb85b249c69a96d7ac72734c35bc18644befe jdk8u25-b03 ++81129354f0e821f3d41dbcf8a68ce82f9d776127 jdk8u25-b04 ++5f78130b0a64df9568a827f9ea589fdc3a7c080c jdk8u25-b05 ++433da54f73257545d95edbc356fdb0e37a9d95eb jdk8u25-b06 ++cccfc3f8dec888c8fe86c212a51af2fba1e11aef jdk8u25-b07 ++c758be4c3cac65a2744bf4e7ed9bdabb85234de2 jdk8u25-b08 ++73423d29fe362e843cdccad510e2e44e2899bc9e jdk8u25-b09 ++391b45e0081afcf3db709878916063a63dca7b05 jdk8u25-b10 ++57cd66833abf44f499faaaed2c16bdf94b258ca9 jdk8u25-b11 ++56b97127afa66fa01eec0fcf467a77cd2e445b4f jdk8u25-b12 ++0ebb9d8c3dd49559b716f02825924801be55b3e7 jdk8u25-b13 ++392a9579cc95d27806c1dde16eee776524a49761 jdk8u25-b14 ++d3a96bbb88521188a3af1a34dd9523f13afa521d jdk8u25-b15 ++4570a7d00aa9bd3df028f52d6f9d8c434163b689 jdk8u25-b16 +--- ./jdk/.hgtags Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/.hgtags Tue Sep 09 12:00:58 2014 -0700 +@@ -311,3 +311,24 @@ + be30cb2a3088f2b7b334b499f7eddbd5312312a7 jdk8u20-b23 + dfb9f24d56b51e5a2ca26e77fc69a2464d51a4d3 jdk8u20-b24 + dfb9f24d56b51e5a2ca26e77fc69a2464d51a4d3 jdk8u20-b25 ++dd229c5f57bff4e75a70908294a13072b9a48385 jdk8u20-b26 ++abca9f6f1a10e9f91b2538bbe7870f54f550d986 jdk8u25-b00 ++7d0627679c9fdeaaaa9fe15c7cc11af0763621ec jdk8u25-b01 ++b0277ec994b751ebb761814675352506cd56bcd6 jdk8u25-b02 ++5606d84f30bab5ed4bc5776572edd469fb013e13 jdk8u25-b03 ++40630cd55da8a2db7980249dc31af285965cb5e9 jdk8u25-b04 ++75b48287a1b3fc5757ac473f72c8918c7f345ffc jdk8u25-b05 ++5b80b4b22b4ca0b630c7f1cec3605da7694168e2 jdk8u25-b06 ++0e0a35b0bf0ff5852026c50038d5c2ecb26c075c jdk8u25-b07 ++d7d221f56fd17b96bab4440448641a844f9e92cd jdk8u25-b08 ++0c6cf43c5bcf0917d07a1bc94adb7a091f18f32c jdk8u25-b09 ++1317d94e95861a47fee8258903b652af70a3493c jdk8u25-b10 ++2104dfd9a4c2b519cdca019aec938db539bf4f3f jdk8u25-b11 ++eaaa9a04b9fdcfa4a830b811ed209eb2c45a4a6b jdk8u25-b12 ++c3a855402b923d3ba819b05292a971953fc8ed0b jdk8u25-b13 ++2a6df63ca0f0f59bb730638b05c72d77a23f93c8 jdk8u25-b14 ++412d9ade90401d098f3662bd688ab393008423bd jdk8u25-b15 ++f07bc5dab84c67f5d1dccbab318ee1c5485c852d jdk8u25-b16 ++0000000000000000000000000000000000000000 jdk8u25-b16 ++0000000000000000000000000000000000000000 jdk8u25-b16 ++d067890f970f3a712f870f6311d20f3359b6eaf0 jdk8u25-b16 +--- ./jdk/make/lib/CoreLibraries.gmk Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/make/lib/CoreLibraries.gmk Tue Sep 09 12:00:58 2014 -0700 +@@ -264,7 +264,7 @@ + $(call SET_SHARED_LIBRARY_ORIGIN) \ + $(EXPORT_ZIP_FUNCS), \ + LDFLAGS_windows := -export:ZIP_Open -export:ZIP_Close -export:ZIP_FindEntry \ +- -export:ZIP_ReadEntry -export:ZIP_GetNextEntry jvm.lib \ ++ -export:ZIP_ReadEntry -export:ZIP_GetNextEntry -export:ZIP_CRC32 jvm.lib \ + $(WIN_JAVA_LIB), \ + LDFLAGS_SUFFIX_linux := -ljvm -ljava $(LIBZ), \ + LDFLAGS_SUFFIX_solaris := -ljvm -ljava $(LIBZ) -lc, \ +--- ./jdk/make/mapfiles/libnet/mapfile-vers Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/make/mapfiles/libnet/mapfile-vers Tue Sep 09 12:00:58 2014 -0700 +@@ -28,6 +28,8 @@ + SUNWprivate_1.1 { + global: + JNI_OnLoad; ++ Java_java_net_AbstractPlainDatagramSocketImpl_init; ++ Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable; + Java_java_net_PlainSocketImpl_socketListen; + Java_java_net_PlainDatagramSocketImpl_getTTL; + Java_java_net_PlainDatagramSocketImpl_init; +--- ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Sep 09 12:00:58 2014 -0700 +@@ -105,6 +105,8 @@ + + private final SecurityWarningWindow warningWindow; + ++ private volatile boolean targetFocusable; ++ + /** + * Current modal blocker or null. + * +@@ -240,13 +242,12 @@ + if (!visible && warningWindow != null) { + warningWindow.setVisible(false, false); + } +- ++ updateFocusableWindowState(); + super.setVisibleImpl(visible); + // TODO: update graphicsConfig, see 4868278 + platformWindow.setVisible(visible); + if (isSimpleWindow()) { + KeyboardFocusManagerPeer kfmPeer = LWKeyboardFocusManagerPeer.getInstance(); +- + if (visible) { + if (!getTarget().isAutoRequestFocus()) { + return; +@@ -397,6 +398,7 @@ + + @Override + public void updateFocusableWindowState() { ++ targetFocusable = getTarget().isFocusableWindow(); + platformWindow.updateFocusableWindowState(); + } + +@@ -1220,13 +1222,13 @@ + } + + private boolean isFocusableWindow() { +- boolean focusable = getTarget().isFocusableWindow(); ++ boolean focusable = targetFocusable; + if (isSimpleWindow()) { + LWWindowPeer ownerPeer = getOwnerFrameDialog(this); + if (ownerPeer == null) { + return false; + } +- return focusable && ownerPeer.getTarget().isFocusableWindow(); ++ return focusable && ownerPeer.targetFocusable; + } + return focusable; + } +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2004, 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 +@@ -56,19 +56,22 @@ + + private PropertyChangeListener propertyChangeHandler; + ++ @Override + protected void installListeners(JScrollPane scrollPane) { + super.installListeners(scrollPane); + propertyChangeHandler = createPropertyChangeHandler(); + scrollPane.addPropertyChangeListener(propertyChangeHandler); + } + +- protected void uninstallListeners(JScrollPane scrollPane) { ++ @Override ++ protected void uninstallListeners(JComponent scrollPane) { + super.uninstallListeners(scrollPane); + scrollPane.removePropertyChangeListener(propertyChangeHandler); + } + + private PropertyChangeListener createPropertyChangeHandler() { + return new PropertyChangeListener() { ++ @Override + public void propertyChange(PropertyChangeEvent e) { + String propertyName = e.getPropertyName(); + +@@ -92,6 +95,7 @@ + }}; + } + ++ @Override + protected void installDefaults(JScrollPane scrollpane) { + super.installDefaults(scrollpane); + +@@ -115,7 +119,7 @@ + } + } + +- ++ @Override + protected void uninstallDefaults(JScrollPane c) { + super.uninstallDefaults(c); + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/Init.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/Init.java Tue Sep 09 12:00:58 2014 -0700 +@@ -25,6 +25,8 @@ + import java.io.InputStream; + import java.security.AccessController; + import java.security.PrivilegedAction; ++import java.security.PrivilegedActionException; ++import java.security.PrivilegedExceptionAction; + import java.util.ArrayList; + import java.util.List; + +@@ -35,6 +37,7 @@ + import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper; + import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithm; + import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer; ++import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException; + import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolver; + import com.sun.org.apache.xml.internal.security.transforms.Transform; + import com.sun.org.apache.xml.internal.security.utils.ElementProxy; +@@ -118,43 +121,50 @@ + log.log(java.util.logging.Level.FINE, "Registering default algorithms"); + } + try { +- // +- // Bind the default prefixes +- // +- ElementProxy.registerDefaultPrefixes(); ++ AccessController.doPrivileged(new PrivilegedExceptionAction(){ ++ @Override public Void run() throws XMLSecurityException { ++ // ++ // Bind the default prefixes ++ // ++ ElementProxy.registerDefaultPrefixes(); + +- // +- // Set the default Transforms +- // +- Transform.registerDefaultAlgorithms(); ++ // ++ // Set the default Transforms ++ // ++ Transform.registerDefaultAlgorithms(); + +- // +- // Set the default signature algorithms +- // +- SignatureAlgorithm.registerDefaultAlgorithms(); ++ // ++ // Set the default signature algorithms ++ // ++ SignatureAlgorithm.registerDefaultAlgorithms(); + +- // +- // Set the default JCE algorithms +- // +- JCEMapper.registerDefaultAlgorithms(); ++ // ++ // Set the default JCE algorithms ++ // ++ JCEMapper.registerDefaultAlgorithms(); + +- // +- // Set the default c14n algorithms +- // +- Canonicalizer.registerDefaultAlgorithms(); ++ // ++ // Set the default c14n algorithms ++ // ++ Canonicalizer.registerDefaultAlgorithms(); + +- // +- // Register the default resolvers +- // +- ResourceResolver.registerDefaultResolvers(); ++ // ++ // Register the default resolvers ++ // ++ ResourceResolver.registerDefaultResolvers(); + +- // +- // Register the default key resolvers +- // +- KeyResolver.registerDefaultResolvers(); +- } catch (Exception ex) { +- log.log(java.util.logging.Level.SEVERE, ex.getMessage(), ex); +- ex.printStackTrace(); ++ // ++ // Register the default key resolvers ++ // ++ KeyResolver.registerDefaultResolvers(); ++ ++ return null; ++ } ++ }); ++ } catch (PrivilegedActionException ex) { ++ XMLSecurityException xse = (XMLSecurityException)ex.getException(); ++ log.log(java.util.logging.Level.SEVERE, xse.getMessage(), xse); ++ xse.printStackTrace(); + } + } + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java Tue Sep 09 12:00:58 2014 -0700 +@@ -27,6 +27,7 @@ + + import com.sun.org.apache.xml.internal.security.encryption.XMLCipher; + import com.sun.org.apache.xml.internal.security.signature.XMLSignature; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import org.w3c.dom.Element; + + +@@ -49,8 +50,11 @@ + * + * @param id + * @param algorithm ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the JCE algorithm + */ + public static void register(String id, Algorithm algorithm) { ++ JavaUtils.checkRegisterPermission(); + algorithmsMap.put(id, algorithm); + } + +@@ -292,8 +296,11 @@ + /** + * Sets the default Provider for obtaining the security algorithms + * @param provider the default providerId. ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the JCE provider + */ + public static void setProviderId(String provider) { ++ JavaUtils.checkRegisterPermission(); + providerName = provider; + } + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java Tue Sep 09 12:00:58 2014 -0700 +@@ -37,6 +37,7 @@ + import com.sun.org.apache.xml.internal.security.signature.XMLSignature; + import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException; + import com.sun.org.apache.xml.internal.security.utils.Constants; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import org.w3c.dom.Attr; + import org.w3c.dom.Document; + import org.w3c.dom.Element; +@@ -314,18 +315,21 @@ + } + + /** +- * Registers implementing class of the Transform algorithm with algorithmURI ++ * Registers implementing class of the SignatureAlgorithm with algorithmURI + * +- * @param algorithmURI algorithmURI URI representation of Transform algorithm. ++ * @param algorithmURI algorithmURI URI representation of SignatureAlgorithm. + * @param implementingClass implementingClass the implementing class of + * {@link SignatureAlgorithmSpi} + * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered + * @throws XMLSignatureException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the signature algorithm + */ + @SuppressWarnings("unchecked") + public static void register(String algorithmURI, String implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, + XMLSignatureException { ++ JavaUtils.checkRegisterPermission(); + if (log.isLoggable(java.util.logging.Level.FINE)) { + log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass); + } +@@ -352,15 +356,18 @@ + /** + * Registers implementing class of the Transform algorithm with algorithmURI + * +- * @param algorithmURI algorithmURI URI representation of Transform algorithm. ++ * @param algorithmURI algorithmURI URI representation of SignatureAlgorithm. + * @param implementingClass implementingClass the implementing class of + * {@link SignatureAlgorithmSpi} + * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered + * @throws XMLSignatureException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the signature algorithm + */ + public static void register(String algorithmURI, Class implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, + XMLSignatureException { ++ JavaUtils.checkRegisterPermission(); + if (log.isLoggable(java.util.logging.Level.FINE)) { + log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass); + } +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java Tue Sep 09 12:00:58 2014 -0700 +@@ -41,6 +41,7 @@ + import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicalizer20010315WithComments; + import com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerPhysical; + import com.sun.org.apache.xml.internal.security.exceptions.AlgorithmAlreadyRegisteredException; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import org.w3c.dom.Document; + import org.w3c.dom.Node; + import org.w3c.dom.NodeList; +@@ -142,10 +143,13 @@ + * @param algorithmURI + * @param implementingClass + * @throws AlgorithmAlreadyRegisteredException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the canonicalizer + */ + @SuppressWarnings("unchecked") + public static void register(String algorithmURI, String implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException { ++ JavaUtils.checkRegisterPermission(); + // check whether URI is already registered + Class registeredClass = + canonicalizerHash.get(algorithmURI); +@@ -166,9 +170,12 @@ + * @param algorithmURI + * @param implementingClass + * @throws AlgorithmAlreadyRegisteredException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the canonicalizer + */ +- public static void register(String algorithmURI, Class implementingClass) ++ public static void register(String algorithmURI, Class implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException { ++ JavaUtils.checkRegisterPermission(); + // check whether URI is already registered + Class registeredClass = canonicalizerHash.get(algorithmURI); + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java Tue Sep 09 12:00:58 2014 -0700 +@@ -42,6 +42,7 @@ + import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SKIResolver; + import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SubjectNameResolver; + import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import org.w3c.dom.Element; + import org.w3c.dom.Node; + +@@ -175,9 +176,12 @@ + * @throws InstantiationException + * @throws IllegalAccessException + * @throws ClassNotFoundException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the key resolver + */ + public static void register(String className, boolean globalResolver) + throws ClassNotFoundException, IllegalAccessException, InstantiationException { ++ JavaUtils.checkRegisterPermission(); + KeyResolverSpi keyResolverSpi = + (KeyResolverSpi) Class.forName(className).newInstance(); + keyResolverSpi.setGlobalResolver(globalResolver); +@@ -195,8 +199,11 @@ + * + * @param className + * @param globalResolver Whether the KeyResolverSpi is a global resolver or not ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the key resolver + */ + public static void registerAtStart(String className, boolean globalResolver) { ++ JavaUtils.checkRegisterPermission(); + KeyResolverSpi keyResolverSpi = null; + Exception ex = null; + try { +@@ -228,11 +235,14 @@ + * + * @param keyResolverSpi a KeyResolverSpi instance to register + * @param start whether to register the KeyResolverSpi at the start of the list or not ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the key resolver + */ + public static void register( + KeyResolverSpi keyResolverSpi, + boolean start + ) { ++ JavaUtils.checkRegisterPermission(); + KeyResolver resolver = new KeyResolver(keyResolverSpi); + if (start) { + resolverVector.add(0, resolver); +@@ -254,9 +264,12 @@ + * @throws InstantiationException + * @throws IllegalAccessException + * @throws ClassNotFoundException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the key resolver + */ + public static void registerClassNames(List classNames) + throws ClassNotFoundException, IllegalAccessException, InstantiationException { ++ JavaUtils.checkRegisterPermission(); + List keyResolverList = new ArrayList(classNames.size()); + for (String className : classNames) { + KeyResolverSpi keyResolverSpi = +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java Tue Sep 09 12:00:58 2014 -0700 +@@ -46,6 +46,7 @@ + import com.sun.org.apache.xml.internal.security.transforms.implementations.TransformXSLT; + import com.sun.org.apache.xml.internal.security.utils.Constants; + import com.sun.org.apache.xml.internal.security.utils.HelperNodeList; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy; + import com.sun.org.apache.xml.internal.security.utils.XMLUtils; + import org.w3c.dom.Document; +@@ -181,11 +182,14 @@ + * class of {@link TransformSpi} + * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI + * is already registered ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the transform + */ + @SuppressWarnings("unchecked") + public static void register(String algorithmURI, String implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, + InvalidTransformException { ++ JavaUtils.checkRegisterPermission(); + // are we already registered? + Class transformSpi = transformSpiHash.get(algorithmURI); + if (transformSpi != null) { +@@ -206,9 +210,12 @@ + * class of {@link TransformSpi} + * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI + * is already registered ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the transform + */ + public static void register(String algorithmURI, Class implementingClass) + throws AlgorithmAlreadyRegisteredException { ++ JavaUtils.checkRegisterPermission(); + // are we already registered? + Class transformSpi = transformSpiHash.get(algorithmURI); + if (transformSpi != null) { +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/ElementProxy.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/ElementProxy.java Tue Sep 09 12:00:58 2014 -0700 +@@ -468,9 +468,12 @@ + * @param namespace + * @param prefix + * @throws XMLSecurityException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the default prefix + */ + public static void setDefaultPrefix(String namespace, String prefix) + throws XMLSecurityException { ++ JavaUtils.checkRegisterPermission(); + if (prefixMappings.containsValue(prefix)) { + String storedPrefix = prefixMappings.get(namespace); + if (!storedPrefix.equals(prefix)) { +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Tue Sep 09 12:00:58 2014 -0700 +@@ -28,6 +28,7 @@ + import java.io.FileOutputStream; + import java.io.IOException; + import java.io.InputStream; ++import java.security.SecurityPermission; + + /** + * A collection of different, general-purpose methods for JAVA-specific things +@@ -39,6 +40,10 @@ + private static java.util.logging.Logger log = + java.util.logging.Logger.getLogger(JavaUtils.class.getName()); + ++ private static final SecurityPermission REGISTER_PERMISSION = ++ new SecurityPermission( ++ "com.sun.org.apache.xml.internal.security.register"); ++ + private JavaUtils() { + // we don't allow instantiation + } +@@ -145,4 +150,21 @@ + + return retBytes; + } ++ ++ /** ++ * Throws a {@code SecurityException} if a security manager is installed ++ * and the caller is not allowed to register an implementation of an ++ * algorithm, transform, or other security sensitive XML Signature function. ++ * ++ * @throws SecurityException if a security manager is installed and the ++ * caller has not been granted the ++ * {@literal "com.sun.org.apache.xml.internal.security.register"} ++ * {@code SecurityPermission} ++ */ ++ public static void checkRegisterPermission() { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm != null) { ++ sm.checkPermission(REGISTER_PERMISSION); ++ } ++ } + } +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/XMLUtils.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/XMLUtils.java Tue Sep 09 12:00:58 2014 -0700 +@@ -80,32 +80,44 @@ + /** + * Set the prefix for the digital signature namespace + * @param prefix the new prefix for the digital signature namespace ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the prefix + */ + public static void setDsPrefix(String prefix) { ++ JavaUtils.checkRegisterPermission(); + dsPrefix = prefix; + } + + /** + * Set the prefix for the digital signature 1.1 namespace + * @param prefix the new prefix for the digital signature 1.1 namespace ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the prefix + */ + public static void setDs11Prefix(String prefix) { ++ JavaUtils.checkRegisterPermission(); + ds11Prefix = prefix; + } + + /** + * Set the prefix for the encryption namespace + * @param prefix the new prefix for the encryption namespace ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the prefix + */ + public static void setXencPrefix(String prefix) { ++ JavaUtils.checkRegisterPermission(); + xencPrefix = prefix; + } + + /** + * Set the prefix for the encryption namespace 1.1 + * @param prefix the new prefix for the encryption namespace 1.1 ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the prefix + */ + public static void setXenc11Prefix(String prefix) { ++ JavaUtils.checkRegisterPermission(); + xenc11Prefix = prefix; + } + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java Tue Sep 09 12:00:58 2014 -0700 +@@ -27,6 +27,7 @@ + import java.util.Map; + + import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverDirectHTTP; + import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment; + import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverLocalFilesystem; +@@ -199,9 +200,12 @@ + * the class cannot be registered. + * + * @param className the name of the ResourceResolverSpi class to be registered ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register a resource resolver + */ + @SuppressWarnings("unchecked") + public static void register(String className) { ++ JavaUtils.checkRegisterPermission(); + try { + Class resourceResolverClass = + (Class) Class.forName(className); +@@ -216,9 +220,12 @@ + * list. This method logs a warning if the class cannot be registered. + * + * @param className the name of the ResourceResolverSpi class to be registered ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register a resource resolver + */ + @SuppressWarnings("unchecked") + public static void registerAtStart(String className) { ++ JavaUtils.checkRegisterPermission(); + try { + Class resourceResolverClass = + (Class) Class.forName(className); +@@ -233,8 +240,11 @@ + * cannot be registered. + * @param className + * @param start ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register a resource resolver + */ + public static void register(Class className, boolean start) { ++ JavaUtils.checkRegisterPermission(); + try { + ResourceResolverSpi resourceResolverSpi = className.newInstance(); + register(resourceResolverSpi, start); +@@ -250,8 +260,11 @@ + * cannot be registered. + * @param resourceResolverSpi + * @param start ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register a resource resolver + */ + public static void register(ResourceResolverSpi resourceResolverSpi, boolean start) { ++ JavaUtils.checkRegisterPermission(); + synchronized(resolverList) { + if (start) { + resolverList.add(0, new ResourceResolver(resourceResolverSpi)); +--- ./jdk/src/share/classes/java/lang/Class.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/lang/Class.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1994, 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 +@@ -256,8 +256,8 @@ + @CallerSensitive + public static Class forName(String className) + throws ClassNotFoundException { +- return forName0(className, true, +- ClassLoader.getClassLoader(Reflection.getCallerClass())); ++ Class caller = Reflection.getCallerClass(); ++ return forName0(className, true, ClassLoader.getClassLoader(caller), caller); + } + + +@@ -327,22 +327,27 @@ + ClassLoader loader) + throws ClassNotFoundException + { +- if (sun.misc.VM.isSystemDomainLoader(loader)) { +- SecurityManager sm = System.getSecurityManager(); +- if (sm != null) { +- ClassLoader ccl = ClassLoader.getClassLoader(Reflection.getCallerClass()); ++ Class caller = null; ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm != null) { ++ // Reflective call to get caller class is only needed if a security manager ++ // is present. Avoid the overhead of making this call otherwise. ++ caller = Reflection.getCallerClass(); ++ if (sun.misc.VM.isSystemDomainLoader(loader)) { ++ ClassLoader ccl = ClassLoader.getClassLoader(caller); + if (!sun.misc.VM.isSystemDomainLoader(ccl)) { + sm.checkPermission( + SecurityConstants.GET_CLASSLOADER_PERMISSION); + } + } + } +- return forName0(name, initialize, loader); ++ return forName0(name, initialize, loader, caller); + } + +- /** Called after security checks have been made. */ ++ /** Called after security check for system loader access checks have been made. */ + private static native Class forName0(String name, boolean initialize, +- ClassLoader loader) ++ ClassLoader loader, ++ Class caller) + throws ClassNotFoundException; + + /** +--- ./jdk/src/share/classes/java/lang/invoke/MethodType.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/lang/invoke/MethodType.java Tue Sep 09 12:00:58 2014 -0700 +@@ -653,7 +653,7 @@ + * @return the parameter types (as an immutable list) + */ + public List> parameterList() { +- return Collections.unmodifiableList(Arrays.asList(ptypes)); ++ return Collections.unmodifiableList(Arrays.asList(ptypes.clone())); + } + + /*non-public*/ Class lastParameterType() { +--- ./jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Tue Sep 09 12:00:58 2014 -0700 +@@ -68,6 +68,7 @@ + return null; + } + }); ++ init(); + } + + /** +@@ -362,4 +363,7 @@ + protected boolean nativeConnectDisabled() { + return connectDisabled; + } ++ ++ native int dataAvailable(); ++ private static native void init(); + } +--- ./jdk/src/share/classes/java/net/DatagramSocket.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/net/DatagramSocket.java Tue Sep 09 12:00:58 2014 -0700 +@@ -83,6 +83,17 @@ + */ + boolean oldImpl = false; + ++ /** ++ * Set when a socket is ST_CONNECTED until we are certain ++ * that any packets which might have been received prior ++ * to calling connect() but not read by the application ++ * have been read. During this time we check the source ++ * address of all packets received to be sure they are from ++ * the connected destination. Other packets are read but ++ * silently dropped. ++ */ ++ private boolean explicitFilter = false; ++ private int bytesLeftToFilter; + /* + * Connection state: + * ST_NOT_CONNECTED = socket not connected +@@ -142,6 +153,15 @@ + + // socket is now connected by the impl + connectState = ST_CONNECTED; ++ // Do we need to filter some packets? ++ int avail = getImpl().dataAvailable(); ++ if (avail == -1) { ++ throw new SocketException(); ++ } ++ explicitFilter = avail > 0; ++ if (explicitFilter) { ++ bytesLeftToFilter = getReceiveBufferSize(); ++ } + } catch (SocketException se) { + + // connection will be emulated by DatagramSocket +@@ -490,6 +510,7 @@ + connectedAddress = null; + connectedPort = -1; + connectState = ST_NOT_CONNECTED; ++ explicitFilter = false; + } + } + +@@ -748,10 +769,13 @@ + } // end of while + } + } +- if (connectState == ST_CONNECTED_NO_IMPL) { ++ DatagramPacket tmp = null; ++ if ((connectState == ST_CONNECTED_NO_IMPL) || explicitFilter) { + // We have to do the filtering the old fashioned way since + // the native impl doesn't support connect or the connect +- // via the impl failed. ++ // via the impl failed, or .. "explicitFilter" may be set when ++ // a socket is connected via the impl, for a period of time ++ // when packets from other sources might be queued on socket. + boolean stop = false; + while (!stop) { + InetAddress peekAddress = null; +@@ -770,8 +794,14 @@ + if ((!connectedAddress.equals(peekAddress)) || + (connectedPort != peekPort)) { + // throw the packet away and silently continue +- DatagramPacket tmp = new DatagramPacket(new byte[1], 1); ++ tmp = new DatagramPacket( ++ new byte[1024], 1024); + getImpl().receive(tmp); ++ if (explicitFilter) { ++ if (checkFiltering(tmp)) { ++ stop = true; ++ } ++ } + } else { + stop = true; + } +@@ -780,9 +810,22 @@ + // If the security check succeeds, or the datagram is + // connected then receive the packet + getImpl().receive(p); ++ if (explicitFilter && tmp == null) { ++ // packet was not filtered, account for it here ++ checkFiltering(p); ++ } + } + } + ++ private boolean checkFiltering(DatagramPacket p) throws SocketException { ++ bytesLeftToFilter -= p.getLength(); ++ if (bytesLeftToFilter <= 0 || getImpl().dataAvailable() <= 0) { ++ explicitFilter = false; ++ return true; ++ } ++ return false; ++ } ++ + /** + * Gets the local address to which the socket is bound. + * +--- ./jdk/src/share/classes/java/net/DatagramSocketImpl.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/net/DatagramSocketImpl.java Tue Sep 09 12:00:58 2014 -0700 +@@ -47,6 +47,12 @@ + */ + protected FileDescriptor fd; + ++ int dataAvailable() { ++ // default impl returns zero, which disables the calling ++ // functionality ++ return 0; ++ } ++ + /** + * The DatagramSocket or MulticastSocket + * that owns this impl +--- ./jdk/src/share/classes/java/security/Signature.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/security/Signature.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -590,6 +590,9 @@ + if (outbuf == null) { + throw new IllegalArgumentException("No output buffer given"); + } ++ if (offset < 0 || len < 0) { ++ throw new IllegalArgumentException("offset or len is less than 0"); ++ } + if (outbuf.length - offset < len) { + throw new IllegalArgumentException + ("Output buffer too small for specified offset and length"); +@@ -658,9 +661,16 @@ + public final boolean verify(byte[] signature, int offset, int length) + throws SignatureException { + if (state == VERIFY) { +- if ((signature == null) || (offset < 0) || (length < 0) || +- (length > signature.length - offset)) { +- throw new IllegalArgumentException("Bad arguments"); ++ if (signature == null) { ++ throw new IllegalArgumentException("signature is null"); ++ } ++ if (offset < 0 || length < 0) { ++ throw new IllegalArgumentException ++ ("offset or length is less than 0"); ++ } ++ if (signature.length - offset < length) { ++ throw new IllegalArgumentException ++ ("signature too small for specified offset and length"); + } + + return engineVerify(signature, offset, length); +@@ -713,6 +723,16 @@ + public final void update(byte[] data, int off, int len) + throws SignatureException { + if (state == SIGN || state == VERIFY) { ++ if (data == null) { ++ throw new IllegalArgumentException("data is null"); ++ } ++ if (off < 0 || len < 0) { ++ throw new IllegalArgumentException("off or len is less than 0"); ++ } ++ if (data.length - off < len) { ++ throw new IllegalArgumentException ++ ("data too small for specified offset and length"); ++ } + engineUpdate(data, off, len); + } else { + throw new SignatureException("object not initialized for " +--- ./jdk/src/share/classes/java/security/cert/CertificateRevokedException.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/security/cert/CertificateRevokedException.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2007, 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 +@@ -94,7 +94,10 @@ + this.revocationDate = new Date(revocationDate.getTime()); + this.reason = reason; + this.authority = authority; +- this.extensions = new HashMap(extensions); ++ // make sure Map only contains correct types ++ this.extensions = Collections.checkedMap(new HashMap<>(), ++ String.class, Extension.class); ++ this.extensions.putAll(extensions); + } + + /** +@@ -172,7 +175,8 @@ + public String getMessage() { + return "Certificate has been revoked, reason: " + + reason + ", revocation date: " + revocationDate +- + ", authority: " + authority + ", extensions: " + extensions; ++ + ", authority: " + authority + ", extension OIDs: " ++ + extensions.keySet(); + } + + /** +--- ./jdk/src/share/classes/java/util/Collections.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/util/Collections.java Tue Sep 09 12:00:58 2014 -0700 +@@ -3077,10 +3077,7 @@ + public void remove() { it.remove(); }}; + } + +- public boolean add(E e) { +- typeCheck(e); +- return c.add(e); +- } ++ public boolean add(E e) { return c.add(typeCheck(e)); } + + private E[] zeroLengthElementArray; // Lazily initialized + +@@ -3187,11 +3184,7 @@ + public E peek() {return queue.peek();} + public E poll() {return queue.poll();} + public E remove() {return queue.remove();} +- +- public boolean offer(E e) { +- typeCheck(e); +- return add(e); +- } ++ public boolean offer(E e) {return queue.offer(typeCheck(e));} + } + + /** +@@ -3440,13 +3433,11 @@ + public int lastIndexOf(Object o) { return list.lastIndexOf(o); } + + public E set(int index, E element) { +- typeCheck(element); +- return list.set(index, element); ++ return list.set(index, typeCheck(element)); + } + + public void add(int index, E element) { +- typeCheck(element); +- list.add(index, element); ++ list.add(index, typeCheck(element)); + } + + public boolean addAll(int index, Collection c) { +@@ -3467,13 +3458,11 @@ + public void remove() { i.remove(); } + + public void set(E e) { +- typeCheck(e); +- i.set(e); ++ i.set(typeCheck(e)); + } + + public void add(E e) { +- typeCheck(e); +- i.add(e); ++ i.add(typeCheck(e)); + } + + @Override +--- ./jdk/src/share/classes/java/util/ResourceBundle.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/util/ResourceBundle.java Tue Sep 09 12:00:58 2014 -0700 +@@ -2650,7 +2650,10 @@ + } catch (ClassNotFoundException e) { + } + } else if (format.equals("java.properties")) { +- final String resourceName = toResourceName(bundleName, "properties"); ++ final String resourceName = toResourceName0(bundleName, "properties"); ++ if (resourceName == null) { ++ return bundle; ++ } + final ClassLoader classLoader = loader; + final boolean reloadFlag = reload; + InputStream stream = null; +@@ -2804,7 +2807,10 @@ + } + boolean result = false; + try { +- String resourceName = toResourceName(toBundleName(baseName, locale), format); ++ String resourceName = toResourceName0(toBundleName(baseName, locale), format); ++ if (resourceName == null) { ++ return result; ++ } + URL url = loader.getResource(resourceName); + if (url != null) { + long lastModified = 0; +@@ -2938,6 +2944,15 @@ + sb.append(bundleName.replace('.', '/')).append('.').append(suffix); + return sb.toString(); + } ++ ++ private String toResourceName0(String bundleName, String suffix) { ++ // application protocol check ++ if (bundleName.contains("://")) { ++ return null; ++ } else { ++ return toResourceName(bundleName, suffix); ++ } ++ } + } + + private static class SingleFormatControl extends Control { +--- ./jdk/src/share/classes/java/util/logging/LogRecord.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/util/logging/LogRecord.java Tue Sep 09 12:00:58 2014 -0700 +@@ -513,7 +513,13 @@ + // If necessary, try to regenerate the resource bundle. + if (resourceBundleName != null) { + try { +- resourceBundle = ResourceBundle.getBundle(resourceBundleName); ++ // use system class loader to ensure the ResourceBundle ++ // instance is a different instance than null loader uses ++ final ResourceBundle bundle = ++ ResourceBundle.getBundle(resourceBundleName, ++ Locale.getDefault(), ++ ClassLoader.getSystemClassLoader()); ++ resourceBundle = bundle; + } catch (MissingResourceException ex) { + // This is not a good place to throw an exception, + // so we simply leave the resourceBundle null. +--- ./jdk/src/share/classes/java/util/logging/Logger.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/util/logging/Logger.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1934,6 +1934,9 @@ + } + + setCallersClassLoaderRef(callersClass); ++ if (isSystemLogger && getCallersClassLoader() != null) { ++ checkPermission(); ++ } + if (findResourceBundle(name, true) == null) { + // We've failed to find an expected ResourceBundle. + // unset the caller's ClassLoader since we were unable to find the +@@ -2168,11 +2171,13 @@ + return trb; + } + final String rbName = isSystemLogger +- ? trb.resourceBundleName ++ // ancestor of a system logger is expected to be a system logger. ++ // ignore resource bundle name if it's not. ++ ? (target.isSystemLogger ? trb.resourceBundleName : null) + : target.getResourceBundleName(); + if (rbName != null) { + return LoggerBundle.get(rbName, +- findResourceBundle(rbName, true)); ++ findResourceBundle(rbName, true)); + } + target = isSystemLogger ? target.parent : target.getParent(); + } +--- ./jdk/src/share/classes/javax/crypto/CipherInputStream.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/javax/crypto/CipherInputStream.java Tue Sep 09 12:00:58 2014 -0700 +@@ -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 +@@ -88,6 +88,8 @@ + private int ofinish = 0; + // stream status + private boolean closed = false; ++ // The stream has been read from. False if the stream has never been read. ++ private boolean read = false; + + /** + * private convenience function. +@@ -103,13 +105,15 @@ + private int getMoreData() throws IOException { + if (done) return -1; + int readin = input.read(ibuffer); ++ read = true; + if (readin == -1) { + done = true; + try { + obuffer = cipher.doFinal(); ++ } catch (IllegalBlockSizeException | BadPaddingException e) { ++ obuffer = null; ++ throw new IOException(e); + } +- catch (IllegalBlockSizeException e) {obuffer = null;} +- catch (BadPaddingException e) {obuffer = null;} + if (obuffer == null) + return -1; + else { +@@ -120,7 +124,10 @@ + } + try { + obuffer = cipher.update(ibuffer, 0, readin); +- } catch (IllegalStateException e) {obuffer = null;}; ++ } catch (IllegalStateException e) { ++ obuffer = null; ++ throw e; ++ } + ostart = 0; + if (obuffer == null) + ofinish = 0; +@@ -308,6 +315,11 @@ + } + } + catch (BadPaddingException | IllegalBlockSizeException ex) { ++ /* If no data has been read from the stream to be en/decrypted, ++ we supress any exceptions, and close quietly. */ ++ if (read) { ++ throw new IOException(ex); ++ } + } + ostart = 0; + ofinish = 0; +--- ./jdk/src/share/classes/javax/swing/JDesktopPane.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/javax/swing/JDesktopPane.java Tue Sep 09 12:00:58 2014 -0700 +@@ -43,6 +43,7 @@ + import java.beans.PropertyVetoException; + import java.util.Set; + import java.util.TreeSet; ++import java.util.LinkedHashSet; + /** + * A container used to create a multiple-document interface or a virtual desktop. + * You create JInternalFrame objects and add them to the +@@ -266,7 +267,7 @@ + + private static Collection getAllFrames(Container parent) { + int i, count; +- Collection results = new ArrayList(); ++ Collection results = new LinkedHashSet<>(); + count = parent.getComponentCount(); + for (i = 0; i < count; i++) { + Component next = parent.getComponent(i); +--- ./jdk/src/share/classes/sun/awt/ComponentFactory.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/ComponentFactory.java Tue Sep 09 12:00:58 2014 -0700 +@@ -25,6 +25,8 @@ + + package sun.awt; + ++import sun.awt.datatransfer.DataTransferer; ++ + import java.awt.*; + import java.awt.dnd.*; + import java.awt.dnd.peer.DragSourceContextPeer; +@@ -93,4 +95,6 @@ + RobotPeer createRobot(Robot target, GraphicsDevice screen) + throws AWTException, HeadlessException; + ++ DataTransferer getDataTransferer(); ++ + } +--- ./jdk/src/share/classes/sun/awt/HeadlessToolkit.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/HeadlessToolkit.java Tue Sep 09 12:00:58 2014 -0700 +@@ -25,6 +25,8 @@ + + package sun.awt; + ++import sun.awt.datatransfer.DataTransferer; ++ + import java.awt.*; + import java.awt.dnd.*; + import java.awt.dnd.peer.DragSourceContextPeer; +@@ -401,6 +403,11 @@ + return null; + } + ++ @Override ++ public DataTransferer getDataTransferer() { ++ return null; ++ } ++ + @SuppressWarnings("deprecation") + public FontMetrics getFontMetrics(Font font) { + return tk.getFontMetrics(font); +--- ./jdk/src/share/classes/sun/awt/SunToolkit.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/SunToolkit.java Tue Sep 09 12:00:58 2014 -0700 +@@ -205,8 +205,6 @@ + + public abstract boolean isTraySupported(); + +- public abstract DataTransferer getDataTransferer(); +- + @SuppressWarnings("deprecation") + public abstract FontPeer getFontPeer(String name, int style); + +--- ./jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Tue Sep 09 12:00:58 2014 -0700 +@@ -86,6 +86,7 @@ + import java.util.TreeMap; + import java.util.TreeSet; + ++import sun.awt.ComponentFactory; + import sun.util.logging.PlatformLogger; + + import sun.awt.AppContext; +@@ -272,7 +273,7 @@ + * instead, null will be returned. + */ + public static synchronized DataTransferer getInstance() { +- return ((SunToolkit) Toolkit.getDefaultToolkit()).getDataTransferer(); ++ return ((ComponentFactory) Toolkit.getDefaultToolkit()).getDataTransferer(); + } + + /** +--- ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1408,10 +1408,10 @@ + } + } + +- int lastbit = (dataBitOffset +- + (height-1) * scanlineStride * 8 +- + (width-1) * pixelBitStride +- + pixelBitStride - 1); ++ long lastbit = (long) dataBitOffset ++ + (long) (height - 1) * (long) scanlineStride * 8 ++ + (long) (width - 1) * (long) pixelBitStride ++ + (long) pixelBitStride - 1; + if (lastbit < 0 || lastbit / 8 >= data.length) { + throw new RasterFormatException("raster dimensions overflow " + + "array bounds"); +--- ./jdk/src/share/classes/sun/invoke/util/VerifyAccess.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/invoke/util/VerifyAccess.java Tue Sep 09 12:00:58 2014 -0700 +@@ -102,19 +102,24 @@ + case PUBLIC: + return true; // already checked above + case PROTECTED: ++ assert !defc.isInterface(); // protected members aren't allowed in interfaces + if ((allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0 && + isSamePackage(defc, lookupClass)) + return true; + if ((allowedModes & PROTECTED) == 0) + return false; ++ // Protected members are accessible by subclasses, which does not include interfaces. ++ // Interfaces are types, not classes. They should not have access to ++ // protected members in j.l.Object, even though it is their superclass. + if ((mods & STATIC) != 0 && + !isRelatedClass(refc, lookupClass)) + return false; + if ((allowedModes & PROTECTED) != 0 && +- isSuperClass(defc, lookupClass)) ++ isSubClass(lookupClass, defc)) + return true; + return false; + case PACKAGE_ONLY: // That is, zero. Unmarked member is package-only access. ++ assert !defc.isInterface(); // package-private members aren't allowed in interfaces + return ((allowedModes & PACKAGE_ALLOWED) != 0 && + isSamePackage(defc, lookupClass)); + case PRIVATE: +@@ -129,12 +134,13 @@ + + static boolean isRelatedClass(Class refc, Class lookupClass) { + return (refc == lookupClass || +- refc.isAssignableFrom(lookupClass) || +- lookupClass.isAssignableFrom(refc)); ++ isSubClass(refc, lookupClass) || ++ isSubClass(lookupClass, refc)); + } + +- static boolean isSuperClass(Class defc, Class lookupClass) { +- return defc.isAssignableFrom(lookupClass); ++ static boolean isSubClass(Class lookupClass, Class defc) { ++ return defc.isAssignableFrom(lookupClass) && ++ !lookupClass.isInterface(); // interfaces are types, not classes. + } + + static int getClassModifiers(Class c) { +--- ./jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java Tue Sep 09 12:00:58 2014 -0700 +@@ -755,6 +755,26 @@ + + // set or refresh local address + localAddress = Net.localAddress(fd); ++ ++ // flush any packets already received. ++ boolean blocking = false; ++ synchronized (blockingLock()) { ++ try { ++ blocking = isBlocking(); ++ // remainder of each packet thrown away ++ ByteBuffer tmpBuf = ByteBuffer.allocate(1); ++ if (blocking) { ++ configureBlocking(false); ++ } ++ do { ++ tmpBuf.clear(); ++ } while (receive(tmpBuf) != null); ++ } finally { ++ if (blocking) { ++ configureBlocking(true); ++ } ++ } ++ } + } + } + } +--- ./jdk/src/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,7 +29,6 @@ + import java.lang.reflect.*; + import java.io.Serializable; + import java.util.*; +-import java.lang.annotation.*; + import java.security.AccessController; + import java.security.PrivilegedAction; + +@@ -45,6 +44,11 @@ + private final Map memberValues; + + AnnotationInvocationHandler(Class type, Map memberValues) { ++ Class[] superInterfaces = type.getInterfaces(); ++ if (!type.isAnnotation() || ++ superInterfaces.length != 1 || ++ superInterfaces[0] != java.lang.annotation.Annotation.class) ++ throw new AnnotationFormatError("Attempt to create proxy for a non-annotation type."); + this.type = type; + this.memberValues = memberValues; + } +@@ -57,13 +61,17 @@ + if (member.equals("equals") && paramTypes.length == 1 && + paramTypes[0] == Object.class) + return equalsImpl(args[0]); +- assert paramTypes.length == 0; +- if (member.equals("toString")) ++ if (paramTypes.length != 0) ++ throw new AssertionError("Too many parameters for an annotation method"); ++ ++ switch(member) { ++ case "toString": + return toStringImpl(); +- if (member.equals("hashCode")) ++ case "hashCode": + return hashCodeImpl(); +- if (member.equals("annotationType")) ++ case "annotationType": + return type; ++ } + + // Handle annotation member accessors + Object result = memberValues.get(member); +@@ -129,7 +137,7 @@ + * Implementation of dynamicProxy.toString() + */ + private String toStringImpl() { +- StringBuffer result = new StringBuffer(128); ++ StringBuilder result = new StringBuilder(128); + result.append('@'); + result.append(type.getName()); + result.append('('); +@@ -277,6 +285,7 @@ + new PrivilegedAction() { + public Method[] run() { + final Method[] mm = type.getDeclaredMethods(); ++ validateAnnotationMethods(mm); + AccessibleObject.setAccessible(mm, true); + return mm; + } +@@ -287,6 +296,94 @@ + private transient volatile Method[] memberMethods = null; + + /** ++ * Validates that a method is structurally appropriate for an ++ * annotation type. As of Java SE 8, annotation types cannot ++ * contain static methods and the declared methods of an ++ * annotation type must take zero arguments and there are ++ * restrictions on the return type. ++ */ ++ private void validateAnnotationMethods(Method[] memberMethods) { ++ /* ++ * Specification citations below are from JLS ++ * 9.6.1. Annotation Type Elements ++ */ ++ boolean valid = true; ++ for(Method method : memberMethods) { ++ /* ++ * "By virtue of the AnnotationTypeElementDeclaration ++ * production, a method declaration in an annotation type ++ * declaration cannot have formal parameters, type ++ * parameters, or a throws clause. ++ * ++ * "By virtue of the AnnotationTypeElementModifier ++ * production, a method declaration in an annotation type ++ * declaration cannot be default or static." ++ */ ++ if (method.getModifiers() != (Modifier.PUBLIC | Modifier.ABSTRACT) || ++ method.isDefault() || ++ method.getParameterCount() != 0 || ++ method.getExceptionTypes().length != 0) { ++ valid = false; ++ break; ++ } ++ ++ /* ++ * "It is a compile-time error if the return type of a ++ * method declared in an annotation type is not one of the ++ * following: a primitive type, String, Class, any ++ * parameterized invocation of Class, an enum type ++ * (section 8.9), an annotation type, or an array type ++ * (chapter 10) whose element type is one of the preceding ++ * types." ++ */ ++ Class returnType = method.getReturnType(); ++ if (returnType.isArray()) { ++ returnType = returnType.getComponentType(); ++ if (returnType.isArray()) { // Only single dimensional arrays ++ valid = false; ++ break; ++ } ++ } ++ ++ if (!((returnType.isPrimitive() && returnType != void.class) || ++ returnType == java.lang.String.class || ++ returnType == java.lang.Class.class || ++ returnType.isEnum() || ++ returnType.isAnnotation())) { ++ valid = false; ++ break; ++ } ++ ++ /* ++ * "It is a compile-time error if any method declared in an ++ * annotation type has a signature that is ++ * override-equivalent to that of any public or protected ++ * method declared in class Object or in the interface ++ * java.lang.annotation.Annotation." ++ * ++ * The methods in Object or Annotation meeting the other ++ * criteria (no arguments, contrained return type, etc.) ++ * above are: ++ * ++ * String toString() ++ * int hashCode() ++ * Class annotationType() ++ */ ++ String methodName = method.getName(); ++ if ((methodName.equals("toString") && returnType == java.lang.String.class) || ++ (methodName.equals("hashCode") && returnType == int.class) || ++ (methodName.equals("annotationType") && returnType == java.lang.Class.class)) { ++ valid = false; ++ break; ++ } ++ } ++ if (valid) ++ return; ++ else ++ throw new AnnotationFormatError("Malformed method on an annotation type"); ++ } ++ ++ /** + * Implementation of dynamicProxy.hashCode() + */ + private int hashCodeImpl() { +@@ -330,7 +427,6 @@ + throws java.io.IOException, ClassNotFoundException { + s.defaultReadObject(); + +- + // Check to make sure that types have not evolved incompatibly + + AnnotationType annotationType = null; +@@ -343,7 +439,6 @@ + + Map> memberTypes = annotationType.memberTypes(); + +- + // If there are annotation members without values, that + // situation is handled by the invoke method. + for (Map.Entry memberValue : memberValues.entrySet()) { +--- ./jdk/src/share/classes/sun/security/provider/SecureRandom.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/provider/SecureRandom.java Tue Sep 09 12:00:58 2014 -0700 +@@ -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 +@@ -29,6 +29,7 @@ + import java.security.MessageDigest; + import java.security.SecureRandomSpi; + import java.security.NoSuchAlgorithmException; ++import java.security.NoSuchProviderException; + + /** + *

    This class provides a crytpographically strong pseudo-random number +@@ -94,9 +95,19 @@ + */ + private void init(byte[] seed) { + try { +- digest = MessageDigest.getInstance("SHA"); +- } catch (NoSuchAlgorithmException e) { +- throw new InternalError("internal error: SHA-1 not available.", e); ++ /* ++ * Use the local SUN implementation to avoid native ++ * performance overhead. ++ */ ++ digest = MessageDigest.getInstance("SHA", "SUN"); ++ } catch (NoSuchProviderException | NoSuchAlgorithmException e) { ++ // Fallback to any available. ++ try { ++ digest = MessageDigest.getInstance("SHA"); ++ } catch (NoSuchAlgorithmException exc) { ++ throw new InternalError( ++ "internal error: SHA-1 not available.", exc); ++ } + } + + if (seed != null) { +@@ -265,9 +276,19 @@ + s.defaultReadObject (); + + try { +- digest = MessageDigest.getInstance("SHA"); +- } catch (NoSuchAlgorithmException e) { +- throw new InternalError("internal error: SHA-1 not available.", e); ++ /* ++ * Use the local SUN implementation to avoid native ++ * performance overhead. ++ */ ++ digest = MessageDigest.getInstance("SHA", "SUN"); ++ } catch (NoSuchProviderException | NoSuchAlgorithmException e) { ++ // Fallback to any available. ++ try { ++ digest = MessageDigest.getInstance("SHA"); ++ } catch (NoSuchAlgorithmException exc) { ++ throw new InternalError( ++ "internal error: SHA-1 not available.", exc); ++ } + } + } + } +--- ./jdk/src/share/classes/sun/security/ssl/CipherSuite.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/ssl/CipherSuite.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, 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 +@@ -968,7 +968,7 @@ + * 1. Prefer Suite B compliant cipher suites, see RFC6460 (To be + * changed later, see below). + * 2. Prefer the stronger bulk cipher, in the order of AES_256(GCM), +- * AES_128(GCM), AES_256, AES_128, RC-4, 3DES-EDE. ++ * AES_128(GCM), AES_256, AES_128, 3DES-EDE, RC-4. + * 3. Prefer the stronger MAC algorithm, in the order of SHA384, + * SHA256, SHA, MD5. + * 4. Prefer the better performance of key exchange and digital +@@ -1055,18 +1055,6 @@ + add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA", + 0x0032, --p, K_DHE_DSS, B_AES_128, T); + +- // RC-4 +- add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", +- 0xC007, --p, K_ECDHE_ECDSA, B_RC4_128, N); +- add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", +- 0xC011, --p, K_ECDHE_RSA, B_RC4_128, N); +- add("SSL_RSA_WITH_RC4_128_SHA", +- 0x0005, --p, K_RSA, B_RC4_128, N); +- add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", +- 0xC002, --p, K_ECDH_ECDSA, B_RC4_128, N); +- add("TLS_ECDH_RSA_WITH_RC4_128_SHA", +- 0xC00C, --p, K_ECDH_RSA, B_RC4_128, N); +- + // Cipher suites in GCM mode, see RFC 5288/5289. + // + // We may increase the priority of cipher suites in GCM mode when +@@ -1127,6 +1115,17 @@ + add("SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", + 0x0013, --p, K_DHE_DSS, B_3DES, N); + ++ // RC-4 ++ add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", ++ 0xC007, --p, K_ECDHE_ECDSA, B_RC4_128, N); ++ add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", ++ 0xC011, --p, K_ECDHE_RSA, B_RC4_128, N); ++ add("SSL_RSA_WITH_RC4_128_SHA", ++ 0x0005, --p, K_RSA, B_RC4_128, N); ++ add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", ++ 0xC002, --p, K_ECDH_ECDSA, B_RC4_128, N); ++ add("TLS_ECDH_RSA_WITH_RC4_128_SHA", ++ 0xC00C, --p, K_ECDH_RSA, B_RC4_128, N); + add("SSL_RSA_WITH_RC4_128_MD5", + 0x0004, --p, K_RSA, B_RC4_128, N); + +@@ -1146,7 +1145,7 @@ + * 2. If a cipher suite has been obsoleted, we put it at the end of + * the list. + * 3. Prefer the stronger bulk cipher, in the order of AES_256, +- * AES_128, RC-4, 3DES-EDE, DES, RC4_40, DES40, NULL. ++ * AES_128, 3DES-EDE, RC-4, DES, DES40, RC4_40, NULL. + * 4. Prefer the stronger MAC algorithm, in the order of SHA384, + * SHA256, SHA, MD5. + * 5. Prefer the better performance of key exchange and digital +@@ -1174,15 +1173,40 @@ + add("TLS_DH_anon_WITH_AES_128_CBC_SHA", + 0x0034, --p, K_DH_ANON, B_AES_128, N); + ++ add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", ++ 0xC017, --p, K_ECDH_ANON, B_3DES, N); ++ add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", ++ 0x001b, --p, K_DH_ANON, B_3DES, N); ++ + add("TLS_ECDH_anon_WITH_RC4_128_SHA", + 0xC016, --p, K_ECDH_ANON, B_RC4_128, N); + add("SSL_DH_anon_WITH_RC4_128_MD5", + 0x0018, --p, K_DH_ANON, B_RC4_128, N); + +- add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", +- 0xC017, --p, K_ECDH_ANON, B_3DES, N); +- add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", +- 0x001b, --p, K_DH_ANON, B_3DES, N); ++ // weak cipher suites obsoleted in TLS 1.2 ++ add("SSL_RSA_WITH_DES_CBC_SHA", ++ 0x0009, --p, K_RSA, B_DES, N, tls12); ++ add("SSL_DHE_RSA_WITH_DES_CBC_SHA", ++ 0x0015, --p, K_DHE_RSA, B_DES, N, tls12); ++ add("SSL_DHE_DSS_WITH_DES_CBC_SHA", ++ 0x0012, --p, K_DHE_DSS, B_DES, N, tls12); ++ add("SSL_DH_anon_WITH_DES_CBC_SHA", ++ 0x001a, --p, K_DH_ANON, B_DES, N, tls12); ++ ++ // weak cipher suites obsoleted in TLS 1.1 ++ add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0008, --p, K_RSA_EXPORT, B_DES_40, N, tls11); ++ add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0014, --p, K_DHE_RSA, B_DES_40, N, tls11); ++ add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0011, --p, K_DHE_DSS, B_DES_40, N, tls11); ++ add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0019, --p, K_DH_ANON, B_DES_40, N, tls11); ++ ++ add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", ++ 0x0003, --p, K_RSA_EXPORT, B_RC4_40, N, tls11); ++ add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", ++ 0x0017, --p, K_DH_ANON, B_RC4_40, N, tls11); + + add("TLS_RSA_WITH_NULL_SHA256", + 0x003b, --p, K_RSA, B_NULL, N, max, tls12, P_SHA256); +@@ -1201,52 +1225,27 @@ + add("SSL_RSA_WITH_NULL_MD5", + 0x0001, --p, K_RSA, B_NULL, N); + +- // weak cipher suites obsoleted in TLS 1.2 +- add("SSL_RSA_WITH_DES_CBC_SHA", +- 0x0009, --p, K_RSA, B_DES, N, tls12); +- add("SSL_DHE_RSA_WITH_DES_CBC_SHA", +- 0x0015, --p, K_DHE_RSA, B_DES, N, tls12); +- add("SSL_DHE_DSS_WITH_DES_CBC_SHA", +- 0x0012, --p, K_DHE_DSS, B_DES, N, tls12); +- add("SSL_DH_anon_WITH_DES_CBC_SHA", +- 0x001a, --p, K_DH_ANON, B_DES, N, tls12); +- +- // weak cipher suites obsoleted in TLS 1.1 +- add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", +- 0x0003, --p, K_RSA_EXPORT, B_RC4_40, N, tls11); +- add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", +- 0x0017, --p, K_DH_ANON, B_RC4_40, N, tls11); +- +- add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", +- 0x0008, --p, K_RSA_EXPORT, B_DES_40, N, tls11); +- add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", +- 0x0014, --p, K_DHE_RSA, B_DES_40, N, tls11); +- add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", +- 0x0011, --p, K_DHE_DSS, B_DES_40, N, tls11); +- add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", +- 0x0019, --p, K_DH_ANON, B_DES_40, N, tls11); +- + // Supported Kerberos ciphersuites from RFC2712 ++ add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", ++ 0x001f, --p, K_KRB5, B_3DES, N); ++ add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", ++ 0x0023, --p, K_KRB5, B_3DES, N); + add("TLS_KRB5_WITH_RC4_128_SHA", + 0x0020, --p, K_KRB5, B_RC4_128, N); + add("TLS_KRB5_WITH_RC4_128_MD5", + 0x0024, --p, K_KRB5, B_RC4_128, N); +- add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", +- 0x001f, --p, K_KRB5, B_3DES, N); +- add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", +- 0x0023, --p, K_KRB5, B_3DES, N); + add("TLS_KRB5_WITH_DES_CBC_SHA", + 0x001e, --p, K_KRB5, B_DES, N, tls12); + add("TLS_KRB5_WITH_DES_CBC_MD5", + 0x0022, --p, K_KRB5, B_DES, N, tls12); ++ add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", ++ 0x0026, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); ++ add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", ++ 0x0029, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); + add("TLS_KRB5_EXPORT_WITH_RC4_40_SHA", + 0x0028, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11); + add("TLS_KRB5_EXPORT_WITH_RC4_40_MD5", + 0x002b, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11); +- add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", +- 0x0026, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); +- add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", +- 0x0029, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); + + /* + * Other values from the TLS Cipher Suite Registry, as of August 2010. +--- ./jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -36,6 +36,8 @@ + + import java.security.cert.X509Certificate; + import java.security.cert.CertificateException; ++import java.security.cert.CertificateParsingException; ++import javax.security.auth.x500.X500Principal; + + import javax.crypto.SecretKey; + import javax.crypto.spec.SecretKeySpec; +@@ -89,12 +91,66 @@ + private final static boolean enableSNIExtension = + Debug.getBooleanProperty("jsse.enableSNIExtension", true); + ++ /* ++ * Allow unsafe server certificate change? ++ * ++ * Server certificate change during SSL/TLS renegotiation may be considered ++ * unsafe, as described in the Triple Handshake attacks: ++ * ++ * https://secure-resumption.com/tlsauth.pdf ++ * ++ * Endpoint identification (See ++ * SSLParameters.getEndpointIdentificationAlgorithm()) is a pretty nice ++ * guarantee that the server certificate change in renegotiation is legal. ++ * However, endpoing identification is only enabled for HTTPS and LDAP ++ * over SSL/TLS by default. It is not enough to protect SSL/TLS ++ * connections other than HTTPS and LDAP. ++ * ++ * The renegotiation indication extension (See RFC 5764) is a pretty ++ * strong guarantee that the endpoints on both client and server sides ++ * are identical on the same connection. However, the Triple Handshake ++ * attacks can bypass this guarantee if there is a session-resumption ++ * handshake between the initial full handshake and the renegotiation ++ * full handshake. ++ * ++ * Server certificate change may be unsafe and should be restricted if ++ * endpoint identification is not enabled and the previous handshake is ++ * a session-resumption abbreviated initial handshake, unless the ++ * identities represented by both certificates can be regraded as the ++ * same (See isIdentityEquivalent()). ++ * ++ * Considering the compatibility impact and the actual requirements to ++ * support server certificate change in practice, the system property, ++ * jdk.tls.allowUnsafeServerCertChange, is used to define whether unsafe ++ * server certificate change in renegotiation is allowed or not. The ++ * default value of the system property is "false". To mitigate the ++ * compactibility impact, applications may want to set the system ++ * property to "true" at their own risk. ++ * ++ * If the value of the system property is "false", server certificate ++ * change in renegotiation after a session-resumption abbreviated initial ++ * handshake is restricted (See isIdentityEquivalent()). ++ * ++ * If the system property is set to "true" explicitly, the restriction on ++ * server certificate change in renegotiation is disabled. ++ */ ++ private final static boolean allowUnsafeServerCertChange = ++ Debug.getBooleanProperty("jdk.tls.allowUnsafeServerCertChange", false); ++ + private List requestedServerNames = + Collections.emptyList(); + + private boolean serverNamesAccepted = false; + + /* ++ * the reserved server certificate chain in previous handshaking ++ * ++ * The server certificate chain is only reserved if the previous ++ * handshake is a session-resumption abbreviated initial handshake. ++ */ ++ private X509Certificate[] reservedServerCerts = null; ++ ++ /* + * Constructors + */ + ClientHandshaker(SSLSocketImpl socket, SSLContextImpl context, +@@ -555,14 +611,19 @@ + // we wanted to resume, but the server refused + session = null; + if (!enableNewSession) { +- throw new SSLException +- ("New session creation is disabled"); ++ throw new SSLException("New session creation is disabled"); + } + } + } + + if (resumingSession && session != null) { + setHandshakeSessionSE(session); ++ // Reserve the handshake state if this is a session-resumption ++ // abbreviated initial handshake. ++ if (isInitialHandshake) { ++ session.setAsSessionResumption(true); ++ } ++ + return; + } + +@@ -1064,6 +1125,13 @@ + } + + /* ++ * Reset the handshake state if this is not an initial handshake. ++ */ ++ if (!isInitialHandshake) { ++ session.setAsSessionResumption(false); ++ } ++ ++ /* + * OK, it verified. If we're doing the fast handshake, add that + * "Finished" message to the hash of handshake messages, then send + * our own change_cipher_spec and Finished message for the server +@@ -1161,8 +1229,23 @@ + System.out.println("%% No cached client session"); + } + } +- if ((session != null) && (session.isRejoinable() == false)) { +- session = null; ++ if (session != null) { ++ // If unsafe server certificate change is not allowed, reserve ++ // current server certificates if the previous handshake is a ++ // session-resumption abbreviated initial handshake. ++ if (!allowUnsafeServerCertChange && session.isSessionResumption()) { ++ try { ++ // If existing, peer certificate chain cannot be null. ++ reservedServerCerts = ++ (X509Certificate[])session.getPeerCertificates(); ++ } catch (SSLPeerUnverifiedException puve) { ++ // Maybe not certificate-based, ignore the exception. ++ } ++ } ++ ++ if (!session.isRejoinable()) { ++ session = null; ++ } + } + + if (session != null) { +@@ -1331,9 +1414,28 @@ + } + X509Certificate[] peerCerts = mesg.getCertificateChain(); + if (peerCerts.length == 0) { +- fatalSE(Alerts.alert_bad_certificate, +- "empty certificate chain"); ++ fatalSE(Alerts.alert_bad_certificate, "empty certificate chain"); + } ++ ++ // Allow server certificate change in client side during renegotiation ++ // after a session-resumption abbreviated initial handshake? ++ // ++ // DO NOT need to check allowUnsafeServerCertChange here. We only ++ // reserve server certificates when allowUnsafeServerCertChange is ++ // flase. ++ if (reservedServerCerts != null) { ++ // It is not necessary to check the certificate update if endpoint ++ // identification is enabled. ++ String identityAlg = getEndpointIdentificationAlgorithmSE(); ++ if ((identityAlg == null || identityAlg.length() == 0) && ++ !isIdentityEquivalent(peerCerts[0], reservedServerCerts[0])) { ++ ++ fatalSE(Alerts.alert_bad_certificate, ++ "server certificate change is restricted " + ++ "during renegotiation"); ++ } ++ } ++ + // ask the trust manager to verify the chain + X509TrustManager tm = sslContext.getX509TrustManager(); + try { +@@ -1370,4 +1472,81 @@ + } + session.setPeerCertificates(peerCerts); + } ++ ++ /* ++ * Whether the certificates can represent the same identity? ++ * ++ * The certificates can be used to represent the same identity: ++ * 1. If the subject alternative names of IP address are present in ++ * both certificates, they should be identical; otherwise, ++ * 2. if the subject alternative names of DNS name are present in ++ * both certificates, they should be identical; otherwise, ++ * 3. if the subject fields are present in both certificates, the ++ * certificate subjects and issuers should be identical. ++ */ ++ private static boolean isIdentityEquivalent(X509Certificate thisCert, ++ X509Certificate prevCert) { ++ if (thisCert.equals(prevCert)) { ++ return true; ++ } ++ ++ // check the iPAddress field in subjectAltName extension ++ Object thisIPAddress = getSubjectAltName(thisCert, 7); // 7: iPAddress ++ Object prevIPAddress = getSubjectAltName(prevCert, 7); ++ if (thisIPAddress != null && prevIPAddress!= null) { ++ // only allow the exactly match ++ return Objects.equals(thisIPAddress, prevIPAddress); ++ } ++ ++ // check the dNSName field in subjectAltName extension ++ Object thisDNSName = getSubjectAltName(thisCert, 2); // 2: dNSName ++ Object prevDNSName = getSubjectAltName(prevCert, 2); ++ if (thisDNSName != null && prevDNSName!= null) { ++ // only allow the exactly match ++ return Objects.equals(thisDNSName, prevDNSName); ++ } ++ ++ // check the certificate subject and issuer ++ X500Principal thisSubject = thisCert.getSubjectX500Principal(); ++ X500Principal prevSubject = prevCert.getSubjectX500Principal(); ++ X500Principal thisIssuer = thisCert.getIssuerX500Principal(); ++ X500Principal prevIssuer = prevCert.getIssuerX500Principal(); ++ if (!thisSubject.getName().isEmpty() && ++ !prevSubject.getName().isEmpty() && ++ thisSubject.equals(prevSubject) && ++ thisIssuer.equals(prevIssuer)) { ++ return true; ++ } ++ ++ return false; ++ } ++ ++ /* ++ * Returns the subject alternative name of the specified type in the ++ * subjectAltNames extension of a certificate. ++ */ ++ private static Object getSubjectAltName(X509Certificate cert, int type) { ++ Collection> subjectAltNames; ++ ++ try { ++ subjectAltNames = cert.getSubjectAlternativeNames(); ++ } catch (CertificateParsingException cpe) { ++ if (debug != null && Debug.isOn("handshake")) { ++ System.out.println( ++ "Attempt to obtain subjectAltNames extension failed!"); ++ } ++ return null; ++ } ++ ++ if (subjectAltNames != null) { ++ for (List subjectAltName : subjectAltNames) { ++ int subjectAltNameType = (Integer)subjectAltName.get(0); ++ if (subjectAltNameType == type) { ++ return subjectAltName.get(1); ++ } ++ } ++ } ++ ++ return null; ++ } + } +--- ./jdk/src/share/classes/sun/security/ssl/Handshaker.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/ssl/Handshaker.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -359,6 +359,17 @@ + } + } + ++ String getEndpointIdentificationAlgorithmSE() { ++ SSLParameters paras; ++ if (conn != null) { ++ paras = conn.getSSLParameters(); ++ } else { ++ paras = engine.getSSLParameters(); ++ } ++ ++ return paras.getEndpointIdentificationAlgorithm(); ++ } ++ + private void setVersionSE(ProtocolVersion protocolVersion) { + if (conn != null) { + conn.setVersion(protocolVersion); +--- ./jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 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 +@@ -115,6 +115,14 @@ + private Principal localPrincipal; + + /* ++ * Is the session currently re-established with a session-resumption ++ * abbreviated initial handshake? ++ * ++ * Note that currently we only set this variable in client side. ++ */ ++ private boolean isSessionResumption = false; ++ ++ /* + * We count session creations, eventually for statistical data but + * also since counters make shorter debugging IDs than the big ones + * we use in the protocol for uniqueness-over-time. +@@ -325,6 +333,22 @@ + } + + /** ++ * Return true if the session is currently re-established with a ++ * session-resumption abbreviated initial handshake. ++ */ ++ boolean isSessionResumption() { ++ return isSessionResumption; ++ } ++ ++ /** ++ * Resets whether the session is re-established with a session-resumption ++ * abbreviated initial handshake. ++ */ ++ void setAsSessionResumption(boolean flag) { ++ isSessionResumption = flag; ++ } ++ ++ /** + * Returns the name of the cipher suite in use on this session + */ + @Override +--- ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Tue Sep 09 12:00:58 2014 -0700 +@@ -103,7 +103,7 @@ + HELP_ABOUT_DIALOG_JAVA_VERSION=Java VM\u30D0\u30FC\u30B8\u30E7\u30F3:
    {0} + HELP_ABOUT_DIALOG_MASTHEAD_ACCESSIBLE_NAME=\u30DE\u30B9\u30C8\u30D8\u30C3\u30C9\u56F3\u5F62 + HELP_ABOUT_DIALOG_MASTHEAD_TITLE=JConsole\u306B\u3064\u3044\u3066 +-HELP_ABOUT_DIALOG_TITLE=JConsole: \u8A73\u7D30 ++HELP_ABOUT_DIALOG_TITLE=JConsole: \u60C5\u5831 + HELP_ABOUT_DIALOG_USER_GUIDE_LINK_URL=http://docs.oracle.com/javase/{0}/docs/technotes/guides/management/jconsole.html + HELP_MENU_ABOUT_TITLE=JConsole\u306B\u3064\u3044\u3066(&A) + HELP_MENU_USER_GUIDE_TITLE=\u30AA\u30F3\u30E9\u30A4\u30F3\u30FB\u30E6\u30FC\u30B6\u30FC\u30FB\u30AC\u30A4\u30C9(&U) +--- ./jdk/src/share/classes/sun/util/locale/BaseLocale.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/util/locale/BaseLocale.java Tue Sep 09 12:00:58 2014 -0700 +@@ -31,6 +31,7 @@ + */ + + package sun.util.locale; ++import java.lang.ref.SoftReference; + + + public final class BaseLocale { +@@ -163,11 +164,11 @@ + return h; + } + +- private static final class Key implements Comparable { +- private final String lang; +- private final String scrt; +- private final String regn; +- private final String vart; ++ private static final class Key { ++ private final SoftReference lang; ++ private final SoftReference scrt; ++ private final SoftReference regn; ++ private final SoftReference vart; + private final boolean normalized; + private final int hash; + +@@ -179,10 +180,10 @@ + assert language.intern() == language + && region.intern() == region; + +- lang = language; +- scrt = ""; +- regn = region; +- vart = ""; ++ lang = new SoftReference(language); ++ scrt = new SoftReference(""); ++ regn = new SoftReference(region); ++ vart = new SoftReference(""); + this.normalized = true; + + int h = language.hashCode(); +@@ -203,40 +204,40 @@ + String variant, boolean normalized) { + int h = 0; + if (language != null) { +- lang = language; ++ lang = new SoftReference(language); + int len = language.length(); + for (int i = 0; i < len; i++) { + h = 31*h + LocaleUtils.toLower(language.charAt(i)); + } + } else { +- lang = ""; ++ lang = new SoftReference(""); + } + if (script != null) { +- scrt = script; ++ scrt = new SoftReference(script); + int len = script.length(); + for (int i = 0; i < len; i++) { + h = 31*h + LocaleUtils.toLower(script.charAt(i)); + } + } else { +- scrt = ""; ++ scrt = new SoftReference(""); + } + if (region != null) { +- regn = region; ++ regn = new SoftReference(region); + int len = region.length(); + for (int i = 0; i < len; i++) { + h = 31*h + LocaleUtils.toLower(region.charAt(i)); + } + } else { +- regn = ""; ++ regn = new SoftReference(""); + } + if (variant != null) { +- vart = variant; ++ vart = new SoftReference(variant); + int len = variant.length(); + for (int i = 0; i < len; i++) { + h = 31*h + variant.charAt(i); + } + } else { +- vart = ""; ++ vart = new SoftReference(""); + } + hash = h; + this.normalized = normalized; +@@ -244,28 +245,31 @@ + + @Override + public boolean equals(Object obj) { +- return (this == obj) || +- (obj instanceof Key) +- && this.hash == ((Key)obj).hash +- && LocaleUtils.caseIgnoreMatch(((Key)obj).lang, this.lang) +- && LocaleUtils.caseIgnoreMatch(((Key)obj).scrt, this.scrt) +- && LocaleUtils.caseIgnoreMatch(((Key)obj).regn, this.regn) +- && ((Key)obj).vart.equals(vart); // variant is case sensitive in JDK! ++ if (this == obj) { ++ return true; + } + +- @Override +- public int compareTo(Key other) { +- int res = LocaleUtils.caseIgnoreCompare(this.lang, other.lang); +- if (res == 0) { +- res = LocaleUtils.caseIgnoreCompare(this.scrt, other.scrt); +- if (res == 0) { +- res = LocaleUtils.caseIgnoreCompare(this.regn, other.regn); +- if (res == 0) { +- res = this.vart.compareTo(other.vart); ++ if (obj instanceof Key && this.hash == ((Key)obj).hash) { ++ String tl = this.lang.get(); ++ String ol = ((Key)obj).lang.get(); ++ if (tl != null && ol != null && ++ LocaleUtils.caseIgnoreMatch(ol, tl)) { ++ String ts = this.scrt.get(); ++ String os = ((Key)obj).scrt.get(); ++ if (ts != null && os != null && ++ LocaleUtils.caseIgnoreMatch(os, ts)) { ++ String tr = this.regn.get(); ++ String or = ((Key)obj).regn.get(); ++ if (tr != null && or != null && ++ LocaleUtils.caseIgnoreMatch(or, tr)) { ++ String tv = this.vart.get(); ++ String ov = ((Key)obj).vart.get(); ++ return (ov != null && ov.equals(tv)); + } + } + } +- return res; ++ } ++ return false; + } + + @Override +@@ -278,10 +282,10 @@ + return key; + } + +- String lang = LocaleUtils.toLowerString(key.lang).intern(); +- String scrt = LocaleUtils.toTitleString(key.scrt).intern(); +- String regn = LocaleUtils.toUpperString(key.regn).intern(); +- String vart = key.vart.intern(); // preserve upper/lower cases ++ String lang = LocaleUtils.toLowerString(key.lang.get()).intern(); ++ String scrt = LocaleUtils.toTitleString(key.scrt.get()).intern(); ++ String regn = LocaleUtils.toUpperString(key.regn.get()).intern(); ++ String vart = key.vart.get().intern(); // preserve upper/lower cases + + return new Key(lang, scrt, regn, vart, true); + } +@@ -294,12 +298,18 @@ + + @Override + protected Key normalizeKey(Key key) { ++ assert key.lang.get() != null && ++ key.scrt.get() != null && ++ key.regn.get() != null && ++ key.vart.get() != null; ++ + return Key.normalize(key); + } + + @Override + protected BaseLocale createObject(Key key) { +- return new BaseLocale(key.lang, key.scrt, key.regn, key.vart); ++ return new BaseLocale(key.lang.get(), key.scrt.get(), ++ key.regn.get(), key.vart.get()); + } + } + } +--- ./jdk/src/share/classes/sun/util/locale/LocaleObjectCache.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/util/locale/LocaleObjectCache.java Tue Sep 09 12:00:58 2014 -0700 +@@ -57,8 +57,10 @@ + value = entry.get(); + } + if (value == null) { ++ V newVal = createObject(key); ++ // make sure key is normalized *after* the object creation ++ // so that newVal is assured to be created from a valid key. + key = normalizeKey(key); +- V newVal = createObject(key); + if (key == null || newVal == null) { + // subclass must return non-null key/value object + return null; +--- ./jdk/src/share/javavm/export/jvm.h Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/javavm/export/jvm.h Tue Sep 09 12:00:58 2014 -0700 +@@ -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 +@@ -386,6 +386,19 @@ + JVM_FindClassFromBootLoader(JNIEnv *env, const char *name); + + /* ++ * Find a class from a given class loader. Throws ClassNotFoundException. ++ * name: name of class ++ * init: whether initialization is done ++ * loader: class loader to look up the class. This may not be the same as the caller's ++ * class loader. ++ * caller: initiating class. The initiating class may be null when a security ++ * manager is not installed. ++ */ ++JNIEXPORT jclass JNICALL ++JVM_FindClassFromCaller(JNIEnv *env, const char *name, jboolean init, ++ jobject loader, jclass caller); ++ ++/* + * Find a class from a given class loader. Throw ClassNotFoundException + * or NoClassDefFoundError depending on the value of the last + * argument. +--- ./jdk/src/share/native/java/lang/Class.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/lang/Class.c Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1994, 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 +@@ -97,7 +97,7 @@ + + JNIEXPORT jclass JNICALL + Java_java_lang_Class_forName0(JNIEnv *env, jclass this, jstring classname, +- jboolean initialize, jobject loader) ++ jboolean initialize, jobject loader, jclass caller) + { + char *clname; + jclass cls = 0; +@@ -135,8 +135,7 @@ + goto done; + } + +- cls = JVM_FindClassFromClassLoader(env, clname, initialize, +- loader, JNI_FALSE); ++ cls = JVM_FindClassFromCaller(env, clname, initialize, loader, caller); + + done: + if (clname != buf) { +--- ./jdk/src/share/native/java/util/zip/CRC32.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/util/zip/CRC32.c Tue Sep 09 12:00:58 2014 -0700 +@@ -54,7 +54,8 @@ + return crc; + } + +-JNIEXPORT jint ZIP_CRC32(jint crc, const jbyte *buf, jint len) ++JNIEXPORT jint JNICALL ++ZIP_CRC32(jint crc, const jbyte *buf, jint len) + { + return crc32(crc, (Bytef*)buf, len); + } +--- ./jdk/src/share/native/java/util/zip/ZipFile.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/util/zip/ZipFile.c Tue Sep 09 12:00:58 2014 -0700 +@@ -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 +@@ -172,11 +172,7 @@ + } + (*env)->GetByteArrayRegion(env, name, 0, ulen, (jbyte *)path); + path[ulen] = '\0'; +- if (addSlash == JNI_FALSE) { +- ze = ZIP_GetEntry(zip, path, 0); +- } else { +- ze = ZIP_GetEntry(zip, path, (jint)ulen); +- } ++ ze = ZIP_GetEntry2(zip, path, (jint)ulen, addSlash); + if (path != buf) { + free(path); + } +@@ -269,7 +265,7 @@ + switch (type) { + case java_util_zip_ZipFile_JZENTRY_NAME: + if (ze->name != 0) { +- len = (int)strlen(ze->name); ++ len = (int)ze->nlen; + if (len == 0 || (jba = (*env)->NewByteArray(env, len)) == NULL) + break; + (*env)->SetByteArrayRegion(env, jba, 0, len, (jbyte *)ze->name); +--- ./jdk/src/share/native/java/util/zip/zip_util.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/util/zip/zip_util.c Tue Sep 09 12:00:58 2014 -0700 +@@ -1021,6 +1021,7 @@ + if ((ze->name = malloc(nlen + 1)) == NULL) goto Catch; + memcpy(ze->name, cen + CENHDR, nlen); + ze->name[nlen] = '\0'; ++ ze->nlen = nlen; + if (elen > 0) { + char *extra = cen + CENHDR + nlen; + +@@ -1118,7 +1119,34 @@ + jzentry * + ZIP_GetEntry(jzfile *zip, char *name, jint ulen) + { +- unsigned int hsh = hash(name); ++ if (ulen == 0) { ++ return ZIP_GetEntry2(zip, name, strlen(name), JNI_FALSE); ++ } ++ return ZIP_GetEntry2(zip, name, ulen, JNI_TRUE); ++} ++ ++jboolean equals(char* name1, int len1, char* name2, int len2) { ++ if (len1 != len2) { ++ return JNI_FALSE; ++ } ++ while (len1-- > 0) { ++ if (*name1++ != *name2++) { ++ return JNI_FALSE; ++ } ++ } ++ return JNI_TRUE; ++} ++ ++/* ++ * Returns the zip entry corresponding to the specified name, or ++ * NULL if not found. ++ * This method supports embedded null character in "name", use ulen ++ * for the length of "name". ++ */ ++jzentry * ++ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash) ++{ ++ unsigned int hsh = hashN(name, ulen); + jint idx; + jzentry *ze = 0; + +@@ -1139,7 +1167,7 @@ + + /* Check the cached entry first */ + ze = zip->cache; +- if (ze && strcmp(ze->name,name) == 0) { ++ if (ze && equals(ze->name, ze->nlen, name, ulen)) { + /* Cache hit! Remove and return the cached entry. */ + zip->cache = 0; + ZIP_Unlock(zip); +@@ -1165,7 +1193,7 @@ + * we keep searching. + */ + ze = newEntry(zip, zc, ACCESS_RANDOM); +- if (ze && strcmp(ze->name, name)==0) { ++ if (ze && equals(ze->name, ze->nlen, name, ulen)) { + break; + } + if (ze != 0) { +@@ -1184,8 +1212,8 @@ + break; + } + +- /* If no real length was passed in, we are done */ +- if (ulen == 0) { ++ /* If no need to try appending slash, we are done */ ++ if (!addSlash) { + break; + } + +@@ -1195,11 +1223,11 @@ + } + + /* Add slash and try once more */ +- name[ulen] = '/'; +- name[ulen+1] = '\0'; ++ name[ulen++] = '/'; ++ name[ulen] = '\0'; + hsh = hash_append(hsh, '/'); + idx = zip->table[hsh % zip->tablelen]; +- ulen = 0; ++ addSlash = JNI_FALSE; + } + + Finally: +--- ./jdk/src/share/native/java/util/zip/zip_util.h Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/util/zip/zip_util.h Tue Sep 09 12:00:58 2014 -0700 +@@ -154,6 +154,7 @@ + * - If pos <= 0 then it is the position of entry LOC header. + * If pos > 0 then it is the position of entry data. + * pos should not be accessed directly, but only by ZIP_GetEntryDataOffset. ++ * - entry name may include embedded null character, use nlen for length + */ + + typedef struct jzentry { /* Zip file entry */ +@@ -166,6 +167,7 @@ + jbyte *extra; /* optional extra data */ + jlong pos; /* position of LOC header or entry data */ + jint flag; /* general purpose flag */ ++ jint nlen; /* length of the entry name */ + } jzentry; + + /* +@@ -269,5 +271,5 @@ + jint ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len); + void ZIP_FreeEntry(jzfile *zip, jzentry *ze); + jlong ZIP_GetEntryDataOffset(jzfile *zip, jzentry *entry); +- ++jzentry * ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash); + #endif /* !_ZIP_H_ */ +--- ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Tue Sep 09 12:00:58 2014 -0700 +@@ -243,12 +243,22 @@ + le_uint16 srSetCount = SWAPW(subRuleSetCount); + + if (coverageIndex < srSetCount) { ++ LEReferenceToArrayOf subRuleSetTableOffsetArrayRef(base, success, ++ &subRuleSetTableOffsetArray[coverageIndex], 1); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + Offset subRuleSetTableOffset = SWAPW(subRuleSetTableOffsetArray[coverageIndex]); + LEReferenceTo + subRuleSetTable(base, success, (const SubRuleSetTable *) ((char *) this + subRuleSetTableOffset)); + le_uint16 subRuleCount = SWAPW(subRuleSetTable->subRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + ++ LEReferenceToArrayOf subRuleTableOffsetArrayRef(base, success, ++ subRuleSetTable->subRuleTableOffsetArray, subRuleCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + for (le_uint16 subRule = 0; subRule < subRuleCount; subRule += 1) { + Offset subRuleTableOffset = + SWAPW(subRuleSetTable->subRuleTableOffsetArray[subRule]); +@@ -301,13 +311,22 @@ + glyphIterator->getCurrGlyphID(), + success); + +- if (setClass < scSetCount && subClassSetTableOffsetArray[setClass] != 0) { ++ if (setClass < scSetCount) { ++ LEReferenceToArrayOf ++ subClassSetTableOffsetArrayRef(base, success, subClassSetTableOffsetArray, setClass); ++ if (LE_FAILURE(success)) { return 0; } ++ if (subClassSetTableOffsetArray[setClass] != 0) { ++ + Offset subClassSetTableOffset = SWAPW(subClassSetTableOffsetArray[setClass]); + LEReferenceTo + subClassSetTable(base, success, (const SubClassSetTable *) ((char *) this + subClassSetTableOffset)); + le_uint16 subClassRuleCount = SWAPW(subClassSetTable->subClassRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); +- ++ LEReferenceToArrayOf ++ subClassRuleTableOffsetArrayRef(base, success, subClassSetTable->subClassRuleTableOffsetArray, subClassRuleCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + for (le_uint16 scRule = 0; scRule < subClassRuleCount; scRule += 1) { + Offset subClassRuleTableOffset = + SWAPW(subClassSetTable->subClassRuleTableOffsetArray[scRule]); +@@ -331,6 +350,7 @@ + glyphIterator->setCurrStreamPosition(position); + } + } ++ } + + // XXX If we get here, the table is mal-formed... + } +@@ -442,13 +462,22 @@ + le_uint16 srSetCount = SWAPW(chainSubRuleSetCount); + + if (coverageIndex < srSetCount) { ++ LEReferenceToArrayOf ++ chainSubRuleSetTableOffsetArrayRef(base, success, chainSubRuleSetTableOffsetArray, coverageIndex); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + Offset chainSubRuleSetTableOffset = SWAPW(chainSubRuleSetTableOffsetArray[coverageIndex]); + LEReferenceTo + chainSubRuleSetTable(base, success, (const ChainSubRuleSetTable *) ((char *) this + chainSubRuleSetTableOffset)); + le_uint16 chainSubRuleCount = SWAPW(chainSubRuleSetTable->chainSubRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); +- ++ LEReferenceToArrayOf ++ chainSubRuleTableOffsetArrayRef(base, success, chainSubRuleSetTable->chainSubRuleTableOffsetArray, chainSubRuleCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + for (le_uint16 subRule = 0; subRule < chainSubRuleCount; subRule += 1) { + Offset chainSubRuleTableOffset = + SWAPW(chainSubRuleSetTable->chainSubRuleTableOffsetArray[subRule]); +@@ -530,6 +559,11 @@ + le_int32 setClass = inputClassDefinitionTable->getGlyphClass(inputClassDefinitionTable, + glyphIterator->getCurrGlyphID(), + success); ++ LEReferenceToArrayOf ++ chainSubClassSetTableOffsetArrayRef(base, success, chainSubClassSetTableOffsetArray, setClass); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + + if (setClass < scSetCount && chainSubClassSetTableOffsetArray[setClass] != 0) { + Offset chainSubClassSetTableOffset = SWAPW(chainSubClassSetTableOffsetArray[setClass]); +@@ -538,7 +572,11 @@ + le_uint16 chainSubClassRuleCount = SWAPW(chainSubClassSetTable->chainSubClassRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); +- ++ LEReferenceToArrayOf ++ chainSubClassRuleTableOffsetArrayRef(base, success, chainSubClassSetTable->chainSubClassRuleTableOffsetArray, chainSubClassRuleCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + for (le_uint16 scRule = 0; scRule < chainSubClassRuleCount; scRule += 1) { + Offset chainSubClassRuleTableOffset = + SWAPW(chainSubClassSetTable->chainSubClassRuleTableOffsetArray[scRule]); +@@ -603,12 +641,14 @@ + } + + le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount); ++ LEReferenceToArrayOf backtrackGlyphArrayRef(base, success, backtrackCoverageTableOffsetArray, backtrkGlyphCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]); + LEReferenceToArrayOf inputCoverageTableOffsetArray(base, success, &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1], inputGlyphCount+2); // offset + if (LE_FAILURE(success)) { return 0; } + const le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputCoverageTableOffsetArray[inputGlyphCount]); +- +- if( LE_FAILURE(success)) { return 0; } + LEReferenceToArrayOf lookaheadCoverageTableOffsetArray(base, success, inputCoverageTableOffsetArray.getAlias(inputGlyphCount + 1, success), lookaheadGlyphCount+2); + + if( LE_FAILURE(success) ) { return 0; } +--- ./jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1024,7 +1024,8 @@ + } + } + +- protected void uninstallListeners(JScrollPane scrollPane) { ++ @Override ++ protected void uninstallListeners(JComponent scrollPane) { + super.uninstallListeners(scrollPane); + scrollPane.removePropertyChangeListener(propertyChangeHandler); + } +--- ./jdk/src/solaris/classes/sun/print/CUPSPrinter.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/solaris/classes/sun/print/CUPSPrinter.java Tue Sep 09 12:00:58 2014 -0700 +@@ -126,7 +126,7 @@ + /** + * Returns array of MediaSizeNames derived from PPD. + */ +- public MediaSizeName[] getMediaSizeNames() { ++ MediaSizeName[] getMediaSizeNames() { + initMedia(); + return cupsMediaSNames; + } +@@ -135,7 +135,7 @@ + /** + * Returns array of Custom MediaSizeNames derived from PPD. + */ +- public CustomMediaSizeName[] getCustomMediaSizeNames() { ++ CustomMediaSizeName[] getCustomMediaSizeNames() { + initMedia(); + return cupsCustomMediaSNames; + } +@@ -144,7 +144,7 @@ + /** + * Returns array of MediaPrintableArea derived from PPD. + */ +- public MediaPrintableArea[] getMediaPrintableArea() { ++ MediaPrintableArea[] getMediaPrintableArea() { + initMedia(); + return cupsMediaPrintables; + } +@@ -152,7 +152,7 @@ + /** + * Returns array of MediaTrays derived from PPD. + */ +- public MediaTray[] getMediaTrays() { ++ MediaTray[] getMediaTrays() { + initMedia(); + return cupsMediaTrays; + } +--- ./jdk/src/solaris/classes/sun/print/IPPPrintService.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/solaris/classes/sun/print/IPPPrintService.java Tue Sep 09 12:00:58 2014 -0700 +@@ -993,7 +993,9 @@ + + public synchronized Class[] getSupportedAttributeCategories() { + if (supportedCats != null) { +- return supportedCats; ++ Class [] copyCats = new Class[supportedCats.length]; ++ System.arraycopy(supportedCats, 0, copyCats, 0, copyCats.length); ++ return copyCats; + } + + initAttributes(); +@@ -1050,7 +1052,9 @@ + } + supportedCats = new Class[catList.size()]; + catList.toArray(supportedCats); +- return supportedCats; ++ Class[] copyCats = new Class[supportedCats.length]; ++ System.arraycopy(supportedCats, 0, copyCats, 0, copyCats.length); ++ return copyCats; + } + + +--- ./jdk/src/solaris/native/java/net/AbstractPlainDatagramSocketImpl.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/solaris/native/java/net/AbstractPlainDatagramSocketImpl.c Tue Sep 09 12:00:58 2014 -0700 +@@ -0,0 +1,89 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++#include ++#include ++ ++#ifdef __solaris__ ++#include ++#include ++ ++#ifndef BSD_COMP ++#define BSD_COMP ++#endif ++ ++#endif ++ ++#include ++ ++#include "jvm.h" ++#include "jni_util.h" ++#include "net_util.h" ++ ++#include "java_net_AbstractPlainDatagramSocketImpl.h" ++ ++static jfieldID IO_fd_fdID; ++ ++static jfieldID apdsi_fdID; ++ ++ ++/* ++ * Class: java_net_AbstractPlainDatagramSocketImpl ++ * Method: init ++ * Signature: ()V ++ */ ++JNIEXPORT void JNICALL ++Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) { ++ ++ apdsi_fdID = (*env)->GetFieldID(env, cls, "fd", ++ "Ljava/io/FileDescriptor;"); ++ CHECK_NULL(apdsi_fdID); ++ ++ IO_fd_fdID = NET_GetFileDescriptorID(env); ++} ++ ++/* ++ * Class: java_net_AbstractPlainDatagramSocketImpl ++ * Method: dataAvailable ++ * Signature: ()I ++ */ ++JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable ++(JNIEnv *env, jobject this) { ++ int fd, retval; ++ ++ jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID); ++ ++ if (IS_NULL(fdObj)) { ++ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", ++ "Socket closed"); ++ return -1; ++ } ++ fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); ++ ++ if (ioctl(fd, FIONREAD, &retval) < 0) { ++ return -1; ++ } ++ return retval; ++} +--- ./jdk/src/windows/native/java/net/AbstractPlainDatagramSocketImpl.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/windows/native/java/net/AbstractPlainDatagramSocketImpl.c Tue Sep 09 12:00:58 2014 -0700 +@@ -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. 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 ++#include ++ ++#include "jvm.h" ++#include "jni_util.h" ++#include "net_util.h" ++ ++#include "java_net_AbstractPlainDatagramSocketImpl.h" ++ ++static jfieldID IO_fd_fdID = NULL; ++static jfieldID apdsi_fdID = NULL; ++ ++static jfieldID apdsi_fd1ID = NULL; ++static jclass two_stacks_clazz = NULL; ++ ++ ++/* ++ * Class: java_net_AbstractPlainDatagramSocketImpl ++ * Method: init ++ * Signature: ()V ++ */ ++JNIEXPORT void JNICALL ++Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) { ++ ++ apdsi_fdID = (*env)->GetFieldID(env, cls, "fd", ++ "Ljava/io/FileDescriptor;"); ++ CHECK_NULL(apdsi_fdID); ++ IO_fd_fdID = NET_GetFileDescriptorID(env); ++ CHECK_NULL(IO_fd_fdID); ++ ++ two_stacks_clazz = (*env)->FindClass(env, "java/net/TwoStacksPlainDatagramSocketImpl"); ++ CHECK_NULL(two_stacks_clazz); ++ ++ /* Handle both TwoStacks and DualStack here */ ++ ++ if (JNU_Equals(env, cls, two_stacks_clazz)) { ++ /* fd1 present only in TwoStack.. */ ++ apdsi_fd1ID = (*env)->GetFieldID(env, cls, "fd1", ++ "Ljava/io/FileDescriptor;"); ++ CHECK_NULL(apdsi_fd1ID); ++ } ++ ++ JNU_CHECK_EXCEPTION(env); ++} ++ ++/* ++ * Class: java_net_AbstractPlainDatagramSocketImpl ++ * Method: dataAvailable ++ * Signature: ()I ++ */ ++JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable ++(JNIEnv *env, jobject this) { ++ SOCKET fd; ++ SOCKET fd1; ++ int rv = -1, rv1 = -1; ++ jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID); ++ ++ if (!IS_NULL(fdObj)) { ++ int retval = 0; ++ fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID); ++ rv = ioctlsocket(fd, FIONREAD, &retval); ++ if (retval > 0) { ++ return retval; ++ } ++ } ++ ++ if (!IS_NULL(apdsi_fd1ID)) { ++ /* TwoStacks */ ++ jobject fd1Obj = (*env)->GetObjectField(env, this, apdsi_fd1ID); ++ if (!IS_NULL(fd1Obj)) { ++ int retval = 0; ++ fd1 = (SOCKET)(*env)->GetIntField(env, fd1Obj, IO_fd_fdID); ++ rv1 = ioctlsocket(fd1, FIONREAD, &retval); ++ if (retval > 0) { ++ return retval; ++ } ++ } ++ } ++ ++ if (rv < 0 && rv1 < 0) { ++ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", ++ "Socket closed"); ++ return -1; ++ } ++ ++ return 0; ++} ++ +--- ./jdk/src/windows/native/sun/awt/splashscreen/splashscreen_sys.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/windows/native/sun/awt/splashscreen/splashscreen_sys.c Tue Sep 09 12:00:58 2014 -0700 +@@ -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 +@@ -213,6 +213,14 @@ + void + SplashRedrawWindow(Splash * splash) + { ++ if (!SplashIsStillLooping(splash)) { ++ KillTimer(splash->hWnd, 0); ++ } ++ ++ if (splash->currentFrame < 0) { ++ return; ++ } ++ + SplashUpdateScreenData(splash); + if (splash->isLayered) { + BLENDFUNCTION bf; +@@ -303,9 +311,6 @@ + time = 0; + SetTimer(splash->hWnd, 0, time, NULL); + } +- else { +- KillTimer(splash->hWnd, 0); +- } + } + + void SplashReconfigureNow(Splash * splash) { +--- ./jdk/src/windows/native/sun/windows/awt_Component.cpp Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/windows/native/sun/windows/awt_Component.cpp Tue Sep 09 12:00:58 2014 -0700 +@@ -6930,9 +6930,9 @@ + { + TRY; + +- return JNI_IS_TRUE(AwtToolkit::GetInstance().SyncCall( ++ return (jboolean)AwtToolkit::GetInstance().SyncCall( + (void *(*)(void *))AwtComponent::_NativeHandlesWheelScrolling, +- env->NewGlobalRef(self))); ++ env->NewGlobalRef(self)); + // global ref is deleted in _NativeHandlesWheelScrolling + + CATCH_BAD_ALLOC_RET(NULL); +@@ -6951,9 +6951,9 @@ + + jobject selfGlobalRef = env->NewGlobalRef(self); + +- return JNI_IS_TRUE(AwtToolkit::GetInstance().SyncCall( ++ return (jboolean)AwtToolkit::GetInstance().SyncCall( + (void*(*)(void*))AwtComponent::_IsObscured, +- (void *)selfGlobalRef)); ++ (void *)selfGlobalRef); + // selfGlobalRef is deleted in _IsObscured + + CATCH_BAD_ALLOC_RET(NULL); +--- ./jdk/src/windows/native/sun/windows/awt_List.cpp Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/windows/native/sun/windows/awt_List.cpp Tue Sep 09 12:00:58 2014 -0700 +@@ -1018,8 +1018,8 @@ + ses->list = env->NewGlobalRef(self); + ses->index = index; + +- return JNI_IS_TRUE(AwtToolkit::GetInstance().SyncCall( +- (void *(*)(void *))AwtList::_IsSelected, ses)); ++ return (jboolean)AwtToolkit::GetInstance().SyncCall( ++ (void *(*)(void *))AwtList::_IsSelected, ses); + // global ref and ses are deleted in _IsSelected + + CATCH_BAD_ALLOC_RET(FALSE); +--- ./jdk/test/java/awt/Focus/WindowIsFocusableAccessByThreadsTest/WindowIsFocusableAccessByThreadsTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/WindowIsFocusableAccessByThreadsTest/WindowIsFocusableAccessByThreadsTest.java Tue Sep 09 12:00:58 2014 -0700 +@@ -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. ++ */ ++ ++/* ++ @test ++ @bug 8047288 ++ @summary Tests method isFocusable of Window component. It should be accessed only from EDT ++ @author artem.malinko@oracle.com ++ @library ../../regtesthelpers ++ @build Util ++ @run main WindowIsFocusableAccessByThreadsTest ++*/ ++ ++import test.java.awt.regtesthelpers.Util; ++ ++import javax.swing.*; ++import java.awt.*; ++import java.util.concurrent.atomic.AtomicBoolean; ++ ++public class WindowIsFocusableAccessByThreadsTest { ++ private static AtomicBoolean testPassed = new AtomicBoolean(true); ++ private static volatile TestFrame frame; ++ private static volatile TestWindow window; ++ private static volatile Button openWindowBtn; ++ ++ public static void main(String[] args) { ++ frame = new TestFrame("Test EDT access to Window components"); ++ window = new TestWindow(frame); ++ ++ SwingUtilities.invokeLater(WindowIsFocusableAccessByThreadsTest::init); ++ ++ Util.waitTillShown(frame); ++ Robot robot = Util.createRobot(); ++ Util.clickOnComp(frame, robot, 100); ++ Util.clickOnComp(openWindowBtn, robot, 100); ++ ++ Util.waitTillShown(window); ++ ++ if (!testPassed.get()) { ++ throw new RuntimeException("Window component methods has been accessed not " + ++ "from Event Dispatching Thread"); ++ } ++ } ++ ++ private static void init() { ++ frame.setSize(400, 400); ++ frame.setLayout(new FlowLayout()); ++ openWindowBtn = new Button("open window"); ++ openWindowBtn.addActionListener(e -> { ++ window.setSize(100, 100); ++ window.setLocation(400, 100); ++ window.setVisible(true); ++ }); ++ frame.add(openWindowBtn); ++ frame.setVisible(true); ++ } ++ ++ private static void testThread() { ++ if (!SwingUtilities.isEventDispatchThread()) { ++ testPassed.set(false); ++ } ++ } ++ ++ private static class TestWindow extends Window { ++ public TestWindow(Frame owner) { ++ super(owner); ++ } ++ ++ // isFocusable method is final and we can't add this test to it. ++ // But it invokes getFocusableWindowState and here we can check ++ // if thread is EDT. ++ @Override ++ public boolean getFocusableWindowState() { ++ testThread(); ++ return super.getFocusableWindowState(); ++ } ++ } ++ ++ private static class TestFrame extends Frame { ++ private TestFrame(String title) throws HeadlessException { ++ super(title); ++ } ++ ++ // isFocusable method is final and we can't add this test to it. ++ // But it invokes getFocusableWindowState and here we can check ++ // if thread is EDT. ++ @Override ++ public boolean getFocusableWindowState() { ++ testThread(); ++ return super.getFocusableWindowState(); ++ } ++ } ++} +--- ./jdk/test/java/util/Collections/CheckedQueue.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/test/java/util/Collections/CheckedQueue.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, 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 +@@ -23,55 +23,40 @@ + + /* + * @test +- * @bug 5020931 ++ * @bug 5020931 8048207 + * @summary Unit test for Collections.checkedQueue ++ * @run testng CheckedQueue + */ + +-import java.lang.reflect.Method; + import java.util.Collections; +-import java.util.Iterator; + import java.util.Queue; + import java.util.concurrent.ArrayBlockingQueue; + ++import org.testng.annotations.Test; ++import static org.testng.Assert.fail; ++import static org.testng.Assert.assertEquals; ++import static org.testng.Assert.assertTrue; ++import static org.testng.Assert.assertFalse; ++ ++ + public class CheckedQueue { +- static int status = 0; +- +- public static void main(String[] args) throws Exception { +- new CheckedQueue(); +- } +- +- public CheckedQueue() throws Exception { +- run(); +- } +- +- private void run() throws Exception { +- Method[] methods = this.getClass().getDeclaredMethods(); +- +- for (int i = 0; i < methods.length; i++) { +- Method method = methods[i]; +- String methodName = method.getName(); +- +- if (methodName.startsWith("test")) { +- try { +- Object obj = method.invoke(this, new Object[0]); +- } catch(Exception e) { +- throw new Exception(this.getClass().getName() + "." + +- methodName + " test failed, test exception " +- + "follows\n" + e.getCause()); +- } +- } +- } +- } + + /** + * This test adds items to a queue. + */ +- private void test00() { ++ @Test ++ public void testAdd() { + int arrayLength = 10; +- ArrayBlockingQueue abq = new ArrayBlockingQueue(arrayLength); ++ Queue abq = Collections.checkedQueue(new ArrayBlockingQueue<>(arrayLength), String.class); + + for (int i = 0; i < arrayLength; i++) { +- abq.add(new String(Integer.toString(i))); ++ abq.add(Integer.toString(i)); ++ } ++ ++ try { ++ abq.add("full"); ++ } catch (IllegalStateException full) { ++ + } + } + +@@ -80,23 +65,17 @@ + * {@code String}s gets the checked queue, and attempt to add an Integer to + * the checked queue. + */ +- private void test01() throws Exception { ++ @Test(expectedExceptions = ClassCastException.class) ++ public void testAddFail1() { + int arrayLength = 10; + ArrayBlockingQueue abq = new ArrayBlockingQueue(arrayLength + 1); + + for (int i = 0; i < arrayLength; i++) { +- abq.add(new String(Integer.toString(i))); ++ abq.add(Integer.toString(i)); + } + + Queue q = Collections.checkedQueue(abq, String.class); +- +- try { +- q.add(new Integer(0)); +- throw new Exception(this.getClass().getName() + "." + "test01 test" +- + " failed, should throw ClassCastException."); +- } catch(ClassCastException cce) { +- // Do nothing. +- } ++ q.add(0); + } + + /** +@@ -104,47 +83,40 @@ + * {@code String}, gets the checked queue, and attempt to add an Integer to + * the checked queue. + */ +- private void test02() throws Exception { ++ @Test(expectedExceptions = ClassCastException.class) ++ public void testAddFail2() { + ArrayBlockingQueue abq = new ArrayBlockingQueue(1); + Queue q = Collections.checkedQueue(abq, String.class); + +- try { +- q.add(new Integer(0)); +- throw new Exception(this.getClass().getName() + "." + "test02 test" +- + " failed, should throw ClassCastException."); +- } catch(ClassCastException e) { +- // Do nothing. +- } ++ q.add(0); + } + + /** + * This test tests the Collections.checkedQueue method call for nulls in + * each and both of the parameters. + */ +- private void test03() throws Exception { ++ @Test ++ public void testArgs() { + ArrayBlockingQueue abq = new ArrayBlockingQueue(1); + Queue q; + + try { + q = Collections.checkedQueue(null, String.class); +- throw new Exception(this.getClass().getName() + "." + "test03 test" +- + " failed, should throw NullPointerException."); ++ fail( "should throw NullPointerException."); + } catch(NullPointerException npe) { + // Do nothing + } + + try { + q = Collections.checkedQueue(abq, null); +- throw new Exception(this.getClass().getName() + "." + "test03 test" +- + " failed, should throw NullPointerException."); ++ fail( "should throw NullPointerException."); + } catch(Exception e) { + // Do nothing + } + + try { + q = Collections.checkedQueue(null, null); +- throw new Exception(this.getClass().getName() + "." + "test03 test" +- + " failed, should throw NullPointerException."); ++ fail( "should throw NullPointerException."); + } catch(Exception e) { + // Do nothing + } +@@ -153,38 +125,28 @@ + /** + * This test tests the CheckedQueue.offer method. + */ +- private void test04() throws Exception { ++ @Test ++ public void testOffer() { + ArrayBlockingQueue abq = new ArrayBlockingQueue(1); + Queue q = Collections.checkedQueue(abq, String.class); + + try { + q.offer(null); +- throw new Exception(this.getClass().getName() + "." + "test04 test" +- + " failed, should throw NullPointerException."); ++ fail("should throw NullPointerException."); + } catch (NullPointerException npe) { + // Do nothing + } + + try { +- q.offer(new Integer(0)); +- throw new Exception(this.getClass().getName() + "." + "test04 test" +- + " failed, should throw ClassCastException."); ++ q.offer(0); ++ fail("should throw ClassCastException."); + } catch (ClassCastException cce) { + // Do nothing + } + +- q.offer(new String("0")); ++ assertTrue(q.offer("0"), "queue should have room"); + +- try { +- q.offer(new String("1")); +- throw new Exception(this.getClass().getName() + "." + "test04 test" +- + " failed, should throw IllegalStateException."); +- } catch(IllegalStateException ise) { +- // Do nothing +- } +- } +- +- private void test05() { +- ++ // no room at the inn! ++ assertFalse(q.offer("1"), "queue should be full"); + } + } +--- ./jdk/test/sun/java2d/cmm/ColorConvertOp/ColConvCCMTest.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/test/sun/java2d/cmm/ColorConvertOp/ColConvCCMTest.java Tue Sep 09 12:00:58 2014 -0700 +@@ -23,7 +23,7 @@ + + /** + * @test +- * @bug 6476665 7033534 6830714 ++ * @bug 6476665 7033534 6830714 8052162 + * @summary Verifies color conversion of Component Color Model based images + * @run main ColConvCCMTest + */ +--- ./jdk/test/sun/security/ssl/sanity/ciphersuites/CipherSuitesInOrder.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/test/sun/security/ssl/sanity/ciphersuites/CipherSuitesInOrder.java Tue Sep 09 12:00:58 2014 -0700 +@@ -69,11 +69,6 @@ + "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", + "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", + "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", +- "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", +- "TLS_ECDHE_RSA_WITH_RC4_128_SHA", +- "SSL_RSA_WITH_RC4_128_SHA", +- "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", +- "TLS_ECDH_RSA_WITH_RC4_128_SHA", + + "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", + "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", +@@ -97,6 +92,12 @@ + "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", + "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", + "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", ++ ++ "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", ++ "TLS_ECDHE_RSA_WITH_RC4_128_SHA", ++ "SSL_RSA_WITH_RC4_128_SHA", ++ "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", ++ "TLS_ECDH_RSA_WITH_RC4_128_SHA", + "SSL_RSA_WITH_RC4_128_MD5", + + "TLS_EMPTY_RENEGOTIATION_INFO_SCSV", +@@ -110,10 +111,20 @@ + "TLS_DH_anon_WITH_AES_128_CBC_SHA256", + "TLS_ECDH_anon_WITH_AES_128_CBC_SHA", + "TLS_DH_anon_WITH_AES_128_CBC_SHA", ++ "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", ++ "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", + "TLS_ECDH_anon_WITH_RC4_128_SHA", + "SSL_DH_anon_WITH_RC4_128_MD5", +- "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", +- "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", ++ "SSL_RSA_WITH_DES_CBC_SHA", ++ "SSL_DHE_RSA_WITH_DES_CBC_SHA", ++ "SSL_DHE_DSS_WITH_DES_CBC_SHA", ++ "SSL_DH_anon_WITH_DES_CBC_SHA", ++ "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", ++ "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", ++ "SSL_RSA_EXPORT_WITH_RC4_40_MD5", ++ "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", + "TLS_RSA_WITH_NULL_SHA256", + "TLS_ECDHE_ECDSA_WITH_NULL_SHA", + "TLS_ECDHE_RSA_WITH_NULL_SHA", +@@ -122,26 +133,16 @@ + "TLS_ECDH_RSA_WITH_NULL_SHA", + "TLS_ECDH_anon_WITH_NULL_SHA", + "SSL_RSA_WITH_NULL_MD5", +- "SSL_RSA_WITH_DES_CBC_SHA", +- "SSL_DHE_RSA_WITH_DES_CBC_SHA", +- "SSL_DHE_DSS_WITH_DES_CBC_SHA", +- "SSL_DH_anon_WITH_DES_CBC_SHA", +- "SSL_RSA_EXPORT_WITH_RC4_40_MD5", +- "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", +- "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", +- "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", +- "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", +- "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", ++ "TLS_KRB5_WITH_3DES_EDE_CBC_SHA", ++ "TLS_KRB5_WITH_3DES_EDE_CBC_MD5", + "TLS_KRB5_WITH_RC4_128_SHA", + "TLS_KRB5_WITH_RC4_128_MD5", +- "TLS_KRB5_WITH_3DES_EDE_CBC_SHA", +- "TLS_KRB5_WITH_3DES_EDE_CBC_MD5", + "TLS_KRB5_WITH_DES_CBC_SHA", + "TLS_KRB5_WITH_DES_CBC_MD5", ++ "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", ++ "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", + "TLS_KRB5_EXPORT_WITH_RC4_40_SHA", +- "TLS_KRB5_EXPORT_WITH_RC4_40_MD5", +- "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", +- "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5" ++ "TLS_KRB5_EXPORT_WITH_RC4_40_MD5" + ); + + private final static String[] protocols = { +--- ./jdk/test/sun/tools/native2ascii/NativeErrors.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/test/sun/tools/native2ascii/NativeErrors.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 1999, 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 +@@ -25,12 +25,18 @@ + * @test + * @bug 4136352 + * @summary Test Native2ASCII error messages +- * ++ * @library /lib/testlibrary ++ * @build jdk.testlibrary.* NativeErrors ++ * @run main NativeErrors + */ + +-import java.io.*; +-import sun.tools.native2ascii.*; +-import java.util.*; ++ ++import java.io.File; ++import java.util.ResourceBundle; ++import java.util.MissingResourceException; ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.JDKToolLauncher; ++import jdk.testlibrary.ProcessTools; + + public class NativeErrors { + +@@ -45,30 +51,18 @@ + } + } + +- public static void main(String args[]) throws Exception { +- String[] command; +- Process p = null; +- BufferedReader in = null; ++ public static void main(String args[]) throws Throwable { ++ // Execute command in another vm. Verify stdout for expected err msg. + +- // Construct a command that runs the test in other vm +- // Exec another vm to run test in +- // Read the result to determine if test failed +- +- command = getComString("-encoding"); +- p = Runtime.getRuntime().exec(command); +- in = new BufferedReader(new InputStreamReader(p.getInputStream())); +- checkResult(in, "err.bad.arg"); ++ // Test with no input file given. ++ checkResult(executeCmd("-encoding"), "err.bad.arg"); + + File f0 = new File(System.getProperty("test.src", "."), "test123"); + String path0 = f0.getPath(); + if ( f0.exists() ) { + throw new Error("Input file should not exist: " + path0); + } +- +- command = getComString(path0); +- p = Runtime.getRuntime().exec(command); +- in = new BufferedReader(new InputStreamReader(p.getInputStream())); +- checkResult(in, "err.cannot.read"); ++ checkResult(executeCmd(path0), "err.cannot.read"); + + File f1 = new File(System.getProperty("test.src", "."), "test1"); + File f2 = File.createTempFile("test2", ".tmp"); +@@ -81,71 +75,38 @@ + throw new Error("Output file cannot be made read only: " + path2); + } + f2.deleteOnExit(); +- +- command = getComString(path1, path2); +- p = Runtime.getRuntime().exec(command); +- in = new BufferedReader(new InputStreamReader(p.getInputStream())); +- checkResult(in, "err.cannot.write"); ++ checkResult(executeCmd(path1, path2), "err.cannot.write"); + } + +- +- private static void checkResult(BufferedReader in, String errorExpected) +- throws Exception { +- String errorReceived; +- errorReceived = in.readLine(); +- assert errorReceived != null : "First readline cannot be null"; +- errorExpected = rsrc.getString(errorExpected); +- assert errorExpected != null : "Expected message cannot be null"; +- StringBuffer error = new StringBuffer(errorExpected); +- int start = errorExpected.indexOf("{0}"); +- if (start >= 0) { +- error.delete(start, start+3); +- errorExpected = error.toString(); ++ private static String executeCmd(String... toolArgs) throws Throwable { ++ JDKToolLauncher cmd = JDKToolLauncher.createUsingTestJDK("native2ascii"); ++ for (String s : toolArgs) { ++ cmd.addToolArg(s); + } +- //System.out.println("received: " + errorReceived); +- //System.out.println("expected: " + errorExpected); +- if (!errorReceived.endsWith(errorExpected)) +- throw new RuntimeException("Native2ascii bad arg error broken."); ++ OutputAnalyzer output = ProcessTools.executeProcess(cmd.getCommand()); ++ if (output == null || output.getStdout() == null) { ++ throw new Exception("Output was null. Process did not finish correctly."); ++ } ++ if (output.getExitValue() == 0) { ++ throw new Exception("Process exit code was 0, but error was expected."); ++ } ++ return output.getStdout(); + } + +- private static String[] getComString(String arg2) { +- String[] coms = new String[2]; +- coms[0] = getPathString(); +- coms[1] = arg2; +- return coms; +- } ++ private static void checkResult( ++ String errorReceived, String errorKey) throws Exception { ++ String errorExpected = rsrc.getString(errorKey); ++ if (errorExpected == null) { ++ throw new Exception("No error message for key: " + errorKey); ++ } ++ // Remove template tag from error message. ++ errorExpected = errorExpected.replaceAll("\\{0\\}", ""); + +- private static String[] getComString(String arg2, String arg3) { +- String[] coms = new String[3]; +- coms[0] = getPathString(); +- coms[1] = arg2; +- coms[2] = arg3; +- return coms; +- } +- +- /* +- * Search for path to native2ascii +- */ +- private static String getPathString() { +- String path = System.getProperty("java.home") + File.separator + +- "bin" + File.separator + "native2ascii"; +- if (File.separatorChar == '\\') { +- path = path + ".exe"; ++ System.out.println("received: " + errorReceived); ++ System.out.println("expected: " + errorExpected); ++ if (errorReceived.indexOf(errorExpected) < 0) { ++ throw new RuntimeException("Native2ascii bad arg error broken."); + } +- File f = new File(path); +- if (!f.exists()) { +- System.out.println("Cannot find native2ascii at "+path); +- path = System.getProperty("java.home") + File.separator + ".." + +- File.separator + "bin" + File.separator + "native2ascii"; +- if (File.separatorChar == '\\') { +- path = path + ".exe"; +- } +- f = new File(path); +- if (!f.exists()) +- throw new RuntimeException("Cannot find native2ascii at "+path); +- System.out.println("Using native2ascii at "+path); +- } +- return path; + } + + } +--- ./langtools/.hgtags Wed Jul 30 03:55:11 2014 -0700 ++++ ./langtools/.hgtags Mon Sep 08 12:38:00 2014 -0700 +@@ -311,3 +311,21 @@ + 5c1d6da1445aa3a2e5cf6101c70e79bfbe2745a5 jdk8u20-b23 + 9239118487dfb47ee850d2cc9b10a0a2e510da3c jdk8u20-b24 + 9239118487dfb47ee850d2cc9b10a0a2e510da3c jdk8u20-b25 ++5e6d409a72327a31b8a8f9aa0b32ef213c8b629c jdk8u20-b26 ++f491f1581f196950c2cb858508dd06601968c417 jdk8u25-b00 ++5bc865e0a2e3c59c1c8bc41e731509e1737ddea1 jdk8u25-b01 ++4dec0c684a9ead80ea2bca6b042682367c1abf90 jdk8u25-b02 ++1d039298d33f8062a0aa75442bd39434e16ee2df jdk8u25-b03 ++5c806c4b2830056caaca3329e634ff040bfe1c7b jdk8u25-b04 ++f1625806cabab809993fbc650b77c5a28d70035d jdk8u25-b05 ++7a6309461a7294cc78789f547b0a652757d17156 jdk8u25-b06 ++aad835b33337c22f4d632c2531c453de00a8f778 jdk8u25-b07 ++224b8260b2c72e2902e48522240c97de11b3570a jdk8u25-b08 ++a5fa1a2bd63cfcce67dae074c07cd0f2baa8ddc0 jdk8u25-b09 ++0dfd4099658397efa118918cd43f79e194c320ea jdk8u25-b10 ++eee8277448304f5d785310edff072d993a0c1868 jdk8u25-b11 ++664a10268f61616b682985855015663c30d0476f jdk8u25-b12 ++89b2f04998c7a1f987cadb4c42801d1ec500a870 jdk8u25-b13 ++a340d68b020585cad7aa6e38d1aafb19ad0e4e07 jdk8u25-b14 ++6e0c19cd42d7c4d307bea26840ee831cbd14e2fc jdk8u25-b15 ++7fa6fa7cc204de988e224c6f8f75e62128fa84cd jdk8u25-b16 +--- ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Wed Jul 30 03:55:11 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Mon Sep 08 12:38:00 2014 -0700 +@@ -1677,6 +1677,9 @@ + # 0: string + compiler.err.static.intf.methods.not.supported.in.source=static\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306F-source {0}\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n(static\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u306B\u306F\u3001-source 8\u4EE5\u4E0A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044) + ++# 0: string ++compiler.err.static.intf.method.invoke.not.supported.in.source=static\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u30FB\u30E1\u30BD\u30C3\u30C9\u547C\u51FA\u3057\u306F-source {0}\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n(static\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u30FB\u30E1\u30BD\u30C3\u30C9\u547C\u51FA\u3057\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u306B\u306F\u3001-source 8\u4EE5\u4E0A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044) ++ + ######################################## + # Diagnostics for verbose resolution + # used by Resolve (debug only) +--- ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Wed Jul 30 03:55:11 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Mon Sep 08 12:38:00 2014 -0700 +@@ -1677,6 +1677,9 @@ + # 0: string + compiler.err.static.intf.methods.not.supported.in.source=-source {0} \u4E2D\u4E0D\u652F\u6301\u9759\u6001\u63A5\u53E3\u65B9\u6CD5\n(\u8BF7\u4F7F\u7528 -source 8 \u6216\u66F4\u9AD8\u7248\u672C\u4EE5\u542F\u7528\u9759\u6001\u63A5\u53E3\u65B9\u6CD5) + ++# 0: string ++compiler.err.static.intf.method.invoke.not.supported.in.source=-source {0} \u4E2D\u4E0D\u652F\u6301\u9759\u6001\u63A5\u53E3\u65B9\u6CD5\u8C03\u7528\n(\u8BF7\u4F7F\u7528 -source 8 \u6216\u66F4\u9AD8\u7248\u672C\u4EE5\u542F\u7528\u9759\u6001\u63A5\u53E3\u65B9\u6CD5\u8C03\u7528) ++ + ######################################## + # Diagnostics for verbose resolution + # used by Resolve (debug only) +--- ./nashorn/.hgtags Wed Jul 30 03:55:26 2014 -0700 ++++ ./nashorn/.hgtags Mon Sep 08 12:38:15 2014 -0700 +@@ -299,3 +299,21 @@ + ad36f9454ce38d78be39fc819902e1223765ee5e jdk8u20-b23 + d3da140e179343011017669a6dbfcc52b0e56f52 jdk8u20-b24 + d3da140e179343011017669a6dbfcc52b0e56f52 jdk8u20-b25 ++a23ac9db4227d78b3389e01fa94a8cb695a8fb0a jdk8u20-b26 ++7001e9f95b443a75e432205a29974c05b88e0fdc jdk8u25-b00 ++a9f77bd14874d5f8fdf935704dd54a0451f2bc69 jdk8u25-b01 ++895e47783e2ee6823496a5ae84039a4f50311c7d jdk8u25-b02 ++b84d92194c367411fcd8b5f510d4589709a8e71e jdk8u25-b03 ++894ab2f06c93987f8596f5906985ff0a452f2fb2 jdk8u25-b04 ++25b89ca363c41e1a1d90d7e95d5227d23e4292f3 jdk8u25-b05 ++0a50d568a901700213fe40c38089748ca1d1af88 jdk8u25-b06 ++25b719b33ac8f8ffb7e4353fddcda93ca6027b0d jdk8u25-b07 ++0f74f65763a300cfe5f897b6b21f36d64f9d2115 jdk8u25-b08 ++158837f537e45fc4664a56ad4759f8a1b30cab73 jdk8u25-b09 ++7e00c05fc54b0404bf2eedda35dd38ae1ad23e50 jdk8u25-b10 ++8cd6af10dd4de9e28ffe30c9107954fffd15dc99 jdk8u25-b11 ++f76715cd4e902602bdbb4ba9a3774c10afeee012 jdk8u25-b12 ++34c95bcacff79a5794416a8e715a8e63bfe7fc58 jdk8u25-b13 ++6a93467eaa36f732b84ecd463e046c4066fef40c jdk8u25-b14 ++71e8403a2f8279315419adf5f4e9d6b232b6835c jdk8u25-b15 ++1500138ce513600457be6bfa10979ecce6515aa6 jdk8u25-b16 diff --git a/java/openjdk8/files/patch-bsd b/java/openjdk8/files/patch-bsd index fa4bb71fc78c..e1eb27e46983 100644 --- a/java/openjdk8/files/patch-bsd +++ b/java/openjdk8/files/patch-bsd @@ -1,31 +1,238 @@ ---- common/autoconf/build-performance.m4 -+++ common/autoconf/build-performance.m4 +--- ./.hgtags Wed Sep 17 11:23:18 2014 -0700 ++++ ./.hgtags Wed Nov 05 15:01:08 2014 -0800 +@@ -331,3 +331,4 @@ + 4429ea47ee6eca6b8a1dbda1950566ee821ba19d jdk8u25-b14 + 09eaef69f384ecf8ec0342b87a8b150740941140 jdk8u25-b15 + f0a48c214c46b7351ff8e6d6b6dc533463a4be21 jdk8u25-b16 ++d117f01bfb4f34668ac216c9837e88acead14dce jdk8u25-b17 +--- ./common/autoconf/build-performance.m4 Wed Sep 17 11:23:18 2014 -0700 ++++ ./common/autoconf/build-performance.m4 Wed Nov 05 15:01:08 2014 -0800 @@ -41,6 +41,10 @@ # Looks like a MacOSX system NUM_CORES=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Cores' | awk '{print [$]5}'` FOUND_CORES=yes -+ elif test "x$OPENJDK_BUILD_OS" = xbsd && test "x$(uname -s)" = xFreeBSD; then -+ # Looks like a FreeBSD system -+ NUM_CORES=`/sbin/sysctl -n kern.smp.cpus` ++ elif test "x$OPENJDK_BUILD_OS" = xbsd && test "x$(uname -s | grep -o BSD)" = xBSD; then ++ # Looks like a BSD system ++ NUM_CORES=`/sbin/sysctl -n hw.ncpu` + FOUND_CORES=yes - elif test -n "$NUMBER_OF_PROCESSORS"; then - # On windows, look in the env - NUM_CORES=$NUMBER_OF_PROCESSORS -@@ -76,6 +80,11 @@ + elif test "x$OPENJDK_BUILD_OS" = xaix ; then + NUM_CORES=`/usr/sbin/prtconf | grep "^Number Of Processors" | awk '{ print [$]4 }'` + FOUND_CORES=yes +@@ -79,6 +83,11 @@ MEMORY_SIZE=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Memory' | awk '{print [$]2}'` MEMORY_SIZE=`expr $MEMORY_SIZE \* 1024` FOUND_MEM=yes -+ elif test "x$OPENJDK_BUILD_OS" = xbsd && test "x$(uname -s)" = xFreeBSD; then -+ # Looks like a FreeBSD system ++ elif test "x$OPENJDK_BUILD_OS" = xbsd && test "x$(uname -s | grep -o BSD)" = xBSD; then ++ # Looks like a BSD system + MEMORY_SIZE=`/sbin/sysctl -n hw.physmem` + MEMORY_SIZE=`expr $MEMORY_SIZE / 1024 / 1024` + FOUND_MEM=yes elif test "x$OPENJDK_BUILD_OS" = xwindows; then # Windows, but without cygwin MEMORY_SIZE=`wmic computersystem get totalphysicalmemory -value | grep = | cut -d "=" -f 2-` ---- common/autoconf/libraries.m4 -+++ common/autoconf/libraries.m4 -@@ -63,9 +63,9 @@ +--- ./common/autoconf/generated-configure.sh Wed Sep 17 11:23:18 2014 -0700 ++++ ./common/autoconf/generated-configure.sh Wed Nov 05 15:01:08 2014 -0800 +@@ -1045,6 +1045,7 @@ + with_extra_cflags + with_extra_cxxflags + with_extra_ldflags ++with_package_path + enable_debug_symbols + enable_zip_debug_info + enable_macosx_runtime_support +@@ -1814,6 +1815,8 @@ + --with-extra-cflags extra flags to be used when compiling jdk c-files + --with-extra-cxxflags extra flags to be used when compiling jdk c++-files + --with-extra-ldflags extra flags to be used when linking jdk ++ --with-package-path package path to be used for location of third party ++ packages + --with-x use the X Window System + --with-cups specify prefix directory for the cups package + (expecting the headers under PATH/include) +@@ -6800,7 +6803,7 @@ + + # First argument is the cpu name from the trip/quad + case "$build_cpu" in +- x86_64) ++ amd64|x86_64) + VAR_CPU=x86_64 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=64 +@@ -6931,7 +6934,7 @@ + + # First argument is the cpu name from the trip/quad + case "$host_cpu" in +- x86_64) ++ amd64|x86_64) + VAR_CPU=x86_64 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=64 +@@ -20136,7 +20139,7 @@ + else + COMPILER_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + # Check that this is likely to be GCC. +- $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null ++ $COMPILER --version 2>&1 | $GREP -E "(Free Software Foundation|clang)" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 + $as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;} +@@ -21737,7 +21740,7 @@ + else + COMPILER_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + # Check that this is likely to be GCC. +- $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null ++ $COMPILER --version 2>&1 | $GREP -E "(Free Software Foundation|clang)" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 + $as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;} +@@ -27701,7 +27704,7 @@ + + # objcopy is used for moving debug symbols to separate files when + # full debug symbols are enabled. +- if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux; then ++ if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux || test "x$OPENJDK_TARGET_OS" = xbsd ; then + if test -n "$ac_tool_prefix"; then + for ac_prog in gobjcopy objcopy + do +@@ -29367,8 +29370,10 @@ + SET_SHARED_LIBRARY_NAME='-Xlinker -install_name -Xlinker @rpath/$1' + SET_SHARED_LIBRARY_MAPFILE='' + SET_SHARED_LIBRARY_ORIGIN='-Xlinker -rpath -Xlinker @loader_path/.' ++ POST_STRIP_CMD="$STRIP -S" ++ fi ++ if test "x$OPENJDK_TARGET_OS" = xbsd || test "x$OPENJDK_TARGET_OS" = xmacosx; then + SET_EXECUTABLE_ORIGIN="$SET_SHARED_LIBRARY_ORIGIN" +- POST_STRIP_CMD="$STRIP -S" + fi + else + if test "x$OPENJDK_TARGET_OS" = xsolaris; then +@@ -29794,22 +29799,37 @@ + CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64" + + # The package path is used only on macosx? +- PACKAGE_PATH=/opt/local ++ ++# Check whether --with-package-path was given. ++if test "${with_package_path+set}" = set; then : ++ withval=$with_package_path; ++fi ++ ++ PACKAGE_PATH="$with_package_path" ++ if test "x$PACKAGE_PATH" = x; then ++ if test "`uname -s`" = "Darwin"; then ++ PACKAGE_PATH=/opt/local ++ fi ++ ++ if test "`uname -s`" = "FreeBSD"; then ++ PACKAGE_PATH=/usr/local ++ fi ++ ++ if test "`uname -s`" = "NetBSD"; then ++ PACKAGE_PATH=/usr/pkg ++ fi ++ ++ if test "`uname -s`" = "OpenBSD"; then ++ PACKAGE_PATH=/usr/local ++ fi ++ fi ++ + + + if test "x$OPENJDK_TARGET_CPU_ENDIAN" = xlittle; then +- # The macro _LITTLE_ENDIAN needs to be defined the same to avoid the +- # Sun C compiler warning message: warning: macro redefined: _LITTLE_ENDIAN +- # (The Solaris X86 system defines this in file /usr/include/sys/isa_defs.h). +- # 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" +- fi +- else +- CCXXFLAGS_JDK="$CCXXFLAGS_JDK -D_BIG_ENDIAN" ++ CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DVM_LITTLE_ENDIAN" ++ else ++ CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DVM_BIG_ENDIAN" + fi + if test "x$OPENJDK_TARGET_OS" = xlinux; then + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DLINUX" +@@ -30308,11 +30328,11 @@ + fi + + if test "x$OPENJDK_TARGET_OS" = xbsd; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on bsd?" >&5 +-$as_echo_n "checking what is not needed on bsd?... " >&6; } +- ALSA_NOT_NEEDED=yes +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: alsa" >&5 +-$as_echo "alsa" >&6; } ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking what is not needed on BSD?" >&5 ++$as_echo_n "checking what is not needed on BSD?... " >&6; } ++ PULSE_NOT_NEEDED=yes ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: pulse" >&5 ++$as_echo "pulse" >&6; } + fi + + if test "x$OPENJDK" = "xfalse"; then +@@ -34581,7 +34601,7 @@ + + ############################################################################### + # +- # Check for alsa headers and libraries. Used on Linux/GNU systems. ++ # Check for alsa headers and libraries. Used on Linux/GNU and BSD systems. + # + + # Check whether --with-alsa was given. +@@ -34629,6 +34649,11 @@ + ALSA_LIBS="-L${with_alsa_lib} -lasound" + ALSA_FOUND=yes + fi ++ if test "x$OPENJDK_TARGET_OS" = xbsd; then ++ ALSA_LIBS="$ALSA_LIBS -lasound" ++ else ++ ALSA_LIBS="$ALSA_LIBS -lalsa" ++ fi + if test "x$ALSA_FOUND" = xno; then + + +@@ -35619,6 +35644,11 @@ + LIBCXX="-lstdc++" + fi + ++ # TODO better (platform agnostic) test ++ if test "x$OPENJDK_TARGET_OS" = xbsd && test "x$LIBCXX" = x && test "x$GCC" = xyes; then ++ LIBCXX="-lstdc++" ++ fi ++ + + + +@@ -35692,6 +35722,10 @@ + # Looks like a MacOSX system + NUM_CORES=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Cores' | awk '{print $5}'` + FOUND_CORES=yes ++ elif test "x$OPENJDK_BUILD_OS" = xbsd && test "x$(uname -s | grep -o BSD)" = xBSD; then ++ # Looks like a BSD system ++ NUM_CORES=`/sbin/sysctl -n hw.ncpu` ++ FOUND_CORES=yes + elif test "x$OPENJDK_BUILD_OS" = xaix ; then + NUM_CORES=`/usr/sbin/prtconf | grep "^Number Of Processors" | awk '{ print $4 }'` + FOUND_CORES=yes +@@ -35747,6 +35781,11 @@ + MEMORY_SIZE=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Memory' | awk '{print $2}'` + MEMORY_SIZE=`expr $MEMORY_SIZE \* 1024` + FOUND_MEM=yes ++ elif test "x$OPENJDK_BUILD_OS" = xbsd && test "x$(uname -s | grep -o BSD)" = xBSD; then ++ # Looks like a BSD system ++ MEMORY_SIZE=`/sbin/sysctl -n hw.physmem` ++ MEMORY_SIZE=`expr $MEMORY_SIZE / 1024 / 1024` ++ FOUND_MEM=yes + elif test "x$OPENJDK_BUILD_OS" = xwindows; then + # Windows, but without cygwin + MEMORY_SIZE=`wmic computersystem get totalphysicalmemory -value | grep = | cut -d "=" -f 2-` +--- ./common/autoconf/libraries.m4 Wed Sep 17 11:23:18 2014 -0700 ++++ ./common/autoconf/libraries.m4 Wed Nov 05 15:01:08 2014 -0800 +@@ -71,9 +71,9 @@ fi if test "x$OPENJDK_TARGET_OS" = xbsd; then @@ -38,32 +245,16 @@ fi if test "x$OPENJDK" = "xfalse"; then -@@ -554,7 +554,7 @@ - fi +@@ -538,7 +538,7 @@ - if test "x${with_alsa}" != x; then -- ALSA_LIBS="-L${with_alsa}/lib -lalsa" -+ ALSA_LIBS="-L${with_alsa}/lib" - ALSA_CFLAGS="-I${with_alsa}/include" - ALSA_FOUND=yes - fi -@@ -563,9 +563,14 @@ - ALSA_FOUND=yes - fi - if test "x${with_alsa_lib}" != x; then -- ALSA_LIBS="-L${with_alsa_lib} -lalsa" -+ ALSA_LIBS="-L${with_alsa_lib}" - ALSA_FOUND=yes - fi -+ if test "x$OPENJDK_TARGET_OS" = xbsd; then -+ ALSA_LIBS="$ALSA_LIBS -lasound" -+ else -+ ALSA_LIBS="$ALSA_LIBS -lalsa" -+ fi - if test "x$ALSA_FOUND" = xno; then - BDEPS_CHECK_MODULE(ALSA, alsa, xxx, [ALSA_FOUND=yes], [ALSA_FOUND=no]) - fi -@@ -877,5 +882,10 @@ + ############################################################################### + # +- # Check for alsa headers and libraries. Used on Linux/GNU systems. ++ # Check for alsa headers and libraries. Used on Linux/GNU and BSD systems. + # + AC_ARG_WITH(alsa, [AS_HELP_STRING([--with-alsa], + [specify prefix directory for the alsa package +@@ -885,5 +885,10 @@ LIBCXX="-lstdc++" fi @@ -74,8 +265,8 @@ + AC_SUBST(LIBCXX) ]) ---- common/autoconf/platform.m4 -+++ common/autoconf/platform.m4 +--- ./common/autoconf/platform.m4 Wed Sep 17 11:23:18 2014 -0700 ++++ ./common/autoconf/platform.m4 Wed Nov 05 15:01:08 2014 -0800 @@ -30,7 +30,7 @@ [ # First argument is the cpu name from the trip/quad @@ -85,32 +276,31 @@ VAR_CPU=x86_64 VAR_CPU_ARCH=x86 VAR_CPU_BITS=64 -@@ -291,8 +291,8 @@ +@@ -302,8 +302,8 @@ # Setup OPENJDK_TARGET_CPU_OSARCH, which is used to set the os.arch Java system property OPENJDK_TARGET_CPU_OSARCH="$OPENJDK_TARGET_CPU" - if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$OPENJDK_TARGET_CPU" = xx86; then - # On linux only, we replace x86 with i386. + if test "x$OPENJDK_TARGET_OS" = xbsd -o "x$OPENJDK_TARGET_OS" = xlinux && test "x$OPENJDK_TARGET_CPU" = xx86; then -+ # On bsd and linux only, we replace x86 with i386. ++ # On Linux and BSD, we replace x86 with i386. OPENJDK_TARGET_CPU_OSARCH="i386" elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then # On all platforms except macosx, we replace x86_64 with amd64. -@@ -336,9 +336,9 @@ +--- ./common/autoconf/spec.gmk.in Wed Sep 17 11:23:18 2014 -0700 ++++ ./common/autoconf/spec.gmk.in Wed Nov 05 15:01:08 2014 -0800 +@@ -276,7 +276,7 @@ + ALSA_LIBS:=@ALSA_LIBS@ + ALSA_CFLAGS:=@ALSA_CFLAGS@ - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - A_LP64="LP64:=" -- # -D_LP64=1 is only set on linux and mac. Setting on windows causes diff in -+ # -D_LP64=1 is only set on bsd, linux and mac. Setting on windows causes diff in - # unpack200.exe -- if test "x$OPENJDK_TARGET_OS" = xlinux || test "x$OPENJDK_TARGET_OS" = xmacosx; then -+ if test "x$OPENJDK_TARGET_OS" = xbsd -o "x$OPENJDK_TARGET_OS" = xlinux -o "x$OPENJDK_TARGET_OS" = xmacosx; then - ADD_LP64="-D_LP64=1" - fi - fi ---- common/autoconf/toolchain.m4 -+++ common/autoconf/toolchain.m4 -@@ -63,7 +63,7 @@ +-PACKAGE_PATH=@PACKAGE_PATH@ ++PACKAGE_PATH:=@PACKAGE_PATH@ + + # Source file for cacerts + CACERTS_FILE=@CACERTS_FILE@ +--- ./common/autoconf/toolchain.m4 Wed Sep 17 11:23:18 2014 -0700 ++++ ./common/autoconf/toolchain.m4 Wed Nov 05 15:01:08 2014 -0800 +@@ -72,7 +72,7 @@ else COMPILER_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` # Check that this is likely to be GCC. @@ -119,7 +309,7 @@ if test $? -ne 0; then AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler.]) AC_MSG_NOTICE([The result from running with --version was: "$COMPILER_VERSION_TEST"]) -@@ -458,7 +458,7 @@ +@@ -487,7 +487,7 @@ # objcopy is used for moving debug symbols to separate files when # full debug symbols are enabled. @@ -128,20 +318,44 @@ AC_CHECK_TOOLS(OBJCOPY, [gobjcopy objcopy]) # Only call fixup if objcopy was found. if test -n "$OBJCOPY"; then -@@ -526,9 +526,11 @@ +@@ -555,8 +555,10 @@ SET_SHARED_LIBRARY_NAME='-Xlinker -install_name -Xlinker @rpath/[$]1' SET_SHARED_LIBRARY_MAPFILE='' SET_SHARED_LIBRARY_ORIGIN='-Xlinker -rpath -Xlinker @loader_path/.' -- SET_EXECUTABLE_ORIGIN="$SET_SHARED_LIBRARY_ORIGIN" - POST_STRIP_CMD="$STRIP -S" - fi -+ if test "x$OPENJDK_TARGET_OS" = xbsd || test "x$OPENJDK_TARGET_OS" = xmacosx; then -+ SET_EXECUTABLE_ORIGIN="$SET_SHARED_LIBRARY_ORIGIN" ++ POST_STRIP_CMD="$STRIP -S" + fi ++ if test "x$OPENJDK_TARGET_OS" = xbsd || test "x$OPENJDK_TARGET_OS" = xmacosx; then + SET_EXECUTABLE_ORIGIN="$SET_SHARED_LIBRARY_ORIGIN" +- POST_STRIP_CMD="$STRIP -S" + fi else if test "x$OPENJDK_TARGET_OS" = xsolaris; then - # If it is not gcc, then assume it is the Oracle Solaris Studio Compiler -@@ -887,18 +889,9 @@ +@@ -960,22 +962,33 @@ + CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64" + + # The package path is used only on macosx? +- PACKAGE_PATH=/opt/local ++ AC_ARG_WITH(package-path, [AS_HELP_STRING([--with-package-path], ++ [package path to be used for location of third party packages])]) ++ PACKAGE_PATH="$with_package_path" ++ if test "x$PACKAGE_PATH" = x; then ++ if test "`uname -s`" = "Darwin"; then ++ PACKAGE_PATH=/opt/local ++ fi ++ ++ if test "`uname -s`" = "FreeBSD"; then ++ PACKAGE_PATH=/usr/local ++ fi ++ ++ if test "`uname -s`" = "NetBSD"; then ++ PACKAGE_PATH=/usr/pkg ++ fi ++ ++ if test "`uname -s`" = "OpenBSD"; then ++ PACKAGE_PATH=/usr/local ++ fi ++ fi ++ AC_SUBST(PACKAGE_PATH) if test "x$OPENJDK_TARGET_CPU_ENDIAN" = xlittle; then @@ -162,8 +376,91 @@ fi if test "x$OPENJDK_TARGET_OS" = xlinux; then CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DLINUX" ---- hotspot/make/bsd/makefiles/build_vm_def.sh -+++ hotspot/make/bsd/makefiles/build_vm_def.sh +--- ./configure Wed Sep 17 11:23:18 2014 -0700 ++++ ./configure Wed Nov 05 15:01:08 2014 -0800 +@@ -1,4 +1,4 @@ +-#!/bin/bash ++#!/bin/sh + # + # Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +--- ./make/Main.gmk Wed Sep 17 11:23:18 2014 -0700 ++++ ./make/Main.gmk Wed Nov 05 15:01:08 2014 -0800 +@@ -58,7 +58,11 @@ + + # Setup number of jobs to use. -jN is unfortunately not available for us to parse from the command line, + # hence this workaround. ++ifdef JOBS ++ifneq ($(JOBS),0) + MAKE_ARGS:=$(MAKE_ARGS) -j$(JOBS) ++endif ++endif + + ### Main targets + +--- ./make/common/MakeBase.gmk Wed Sep 17 11:23:18 2014 -0700 ++++ ./make/common/MakeBase.gmk Wed Nov 05 15:01:08 2014 -0800 +@@ -338,7 +338,7 @@ + # (and causing a crash on Cygwin). + # Default shell seems to always be /bin/sh. Must override with bash to get this to work on Solaris. + # Only use time if it's GNU time which supports format and output file. +- WRAPPER_SHELL:=/bin/bash $$(SRC_ROOT)/common/bin/shell-tracer.sh $$(if $$(findstring yes,$$(IS_GNU_TIME)),$$(TIME),-) $$(OUTPUT_ROOT)/build-trace-time.log /bin/bash ++ WRAPPER_SHELL:=bash $$(SRC_ROOT)/common/bin/shell-tracer.sh $$(if $$(findstring yes,$$(IS_GNU_TIME)),$$(TIME),-) $$(OUTPUT_ROOT)/build-trace-time.log bash + SHELL=$$(warning $$(if $$@,Building $$@,Running shell command) $$(if $$<, (from $$<))$$(if $$?, ($$(wordlist 1, 20, $$?) $$(if $$(wordlist 21, 22, $$?), ... [in total $$(words $$?) files]) newer)))$$(WRAPPER_SHELL) + endif + # Never remove warning messages; this is just for completeness +@@ -365,8 +365,8 @@ + + # This is to be called by all SetupFoo macros + define LogSetupMacroEntry +- $(if $(27),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk)) +- $(if $(findstring $(LOG_LEVEL),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26,$(if $($i),$(NEWLINE) $(strip [$i] $($i)))))) ++ $(if $(30),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk)) ++ $(if $(findstring $(LOG_LEVEL),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29,$(if $($i),$(NEWLINE) $(strip [$i] $($i)))))) + endef + + # Make directory without forking mkdir if not needed +--- ./make/common/NativeCompilation.gmk Wed Sep 17 11:23:18 2014 -0700 ++++ ./make/common/NativeCompilation.gmk Wed Nov 05 15:01:08 2014 -0800 +@@ -151,9 +151,9 @@ + # CC the compiler to use, default is $(CC) + # LDEXE the linker to use for linking executables, default is $(LDEXE) + # OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST +- $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) +- $(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25),$(26)) +- $(if $(27),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk)) ++ $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) ++ $(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25),$(26),$(27),$(28),$(29)) ++ $(if $(30),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk)) + + ifneq (,$$($1_BIN)) + $$(error BIN has been replaced with OBJECT_DIR) +--- ./corba/.hgtags Mon Sep 08 12:34:37 2014 -0700 ++++ ./corba/.hgtags Wed Sep 17 11:55:37 2014 -0700 +@@ -329,3 +329,4 @@ + 7e9a2027d0214019d66325fa7ca59cf8281fb43e jdk8u25-b14 + 5b2cb4935667cd02d7974b3b6fb6bf4092b5acae jdk8u25-b15 + 28d7f90e04e46ce8c633a2fbf0157d9e77db17c3 jdk8u25-b16 ++f46df0af2ca8c7d896de375c8edac8ce09318318 jdk8u25-b17 +--- ./hotspot/.hgtags Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/.hgtags Wed Nov 05 15:01:44 2014 -0800 +@@ -518,3 +518,4 @@ + c77d5db189422e2eef0443ee212644e497113b18 jdk8u25-b14 + e62c06b887310b5bd23be9b817a9a6f0daf0d0e1 jdk8u25-b15 + 6467bdd4d22d8b140844dc847c43b9ba7cb0bbd1 jdk8u25-b16 ++28b50d07f6f8c5a567b6a25e95a423948114a004 jdk8u25-b17 +--- ./hotspot/make/bsd/makefiles/adjust-mflags.sh Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/adjust-mflags.sh Wed Nov 05 15:01:44 2014 -0800 +@@ -64,7 +64,6 @@ + echo "$MFLAGS" \ + | sed ' + s/^-/ -/ +- s/ -\([^ ][^ ]*\)j/ -\1 -j/ + s/ -j[0-9][0-9]*/ -j/ + s/ -j\([^ ]\)/ -j -\1/ + s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/ +--- ./hotspot/make/bsd/makefiles/build_vm_def.sh Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/build_vm_def.sh Wed Nov 05 15:01:44 2014 -0800 @@ -1,12 +1,28 @@ #!/bin/sh @@ -199,8 +496,8 @@ + if ($3 ~ /^_ZN9Arguments17SharedArchivePathE$/) print "\t" $3 ";" + }' | sort -u ;; +esac ---- hotspot/make/bsd/makefiles/debug.make -+++ hotspot/make/bsd/makefiles/debug.make +--- ./hotspot/make/bsd/makefiles/debug.make Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/debug.make Wed Nov 05 15:01:44 2014 -0800 @@ -35,7 +35,10 @@ # to inhibit the effect of the previous line on CFLAGS. @@ -213,19 +510,8 @@ VERSION = debug SYSDEFS += -DASSERT ---- hotspot/make/bsd/makefiles/defs.make -+++ hotspot/make/bsd/makefiles/defs.make -@@ -254,7 +254,7 @@ - endif # BUILD_FLAVOR - endif # JDK_6_OR_EARLIER - --JDK_INCLUDE_SUBDIR=bsd -+JDK_INCLUDE_SUBDIR=$(shell uname -s | ${TR} "[:upper:]" "[:lower:]") - - # Library suffix - ifeq ($(OS_VENDOR),Darwin) ---- hotspot/make/bsd/makefiles/fastdebug.make -+++ hotspot/make/bsd/makefiles/fastdebug.make +--- ./hotspot/make/bsd/makefiles/fastdebug.make Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/fastdebug.make Wed Nov 05 15:01:44 2014 -0800 @@ -56,7 +56,10 @@ # to inhibit the effect of the previous line on CFLAGS. @@ -238,20 +524,19 @@ VERSION = fastdebug SYSDEFS += -DASSERT -DCHECK_UNHANDLED_OOPS ---- hotspot/make/bsd/makefiles/gcc.make -+++ hotspot/make/bsd/makefiles/gcc.make -@@ -168,6 +168,10 @@ +--- ./hotspot/make/bsd/makefiles/gcc.make Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/gcc.make Wed Nov 05 15:01:44 2014 -0800 +@@ -168,6 +168,9 @@ CFLAGS += -DDONT_USE_PRECOMPILED_HEADER endif -+ifeq ($(OS_VENDOR), FreeBSD) -+ CFLAGS+= -DPACKAGE_PATH=\"$(PACKAGE_PATH)\" -+endif ++# Allow for where third party packages are located ++CFLAGS+= -DPACKAGE_PATH=\"$(PACKAGE_PATH)\" + #------------------------------------------------------------------------ # Compiler flags -@@ -201,12 +205,15 @@ +@@ -201,12 +204,15 @@ endif ifeq ($(USE_CLANG), true) @@ -273,8 +558,17 @@ endif endif ---- hotspot/make/bsd/makefiles/launcher.make -+++ hotspot/make/bsd/makefiles/launcher.make +@@ -265,7 +271,7 @@ + ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0" + # Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit + # conversions which might affect the values. Only enable it in earlier versions. +- WARNING_FLAGS = -Wunused-function ++# WARNING_FLAGS = -Wunused-function + ifeq ($(USE_CLANG),) + WARNING_FLAGS += -Wconversion + endif +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/bsd/makefiles/launcher.make Wed Nov 05 15:01:44 2014 -0800 @@ -0,0 +1,117 @@ +# +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. @@ -393,30 +687,1490 @@ + $(QUIETLY) sed -e 's/@@LIBARCH@@/$(LIBARCH)/g' $< > $@ + $(QUIETLY) chmod +x $@ + ---- hotspot/make/bsd/makefiles/mapfile-vers-debug -+++ hotspot/make/bsd/makefiles/mapfile-vers-debug -@@ -242,7 +242,7 @@ - JVM_UnloadLibrary; - JVM_Write; - JVM_Yield; -- JVM_handle_linux_signal; +--- ./hotspot/make/bsd/makefiles/mapfile-vers-debug Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-debug Wed Nov 05 15:01:44 2014 -0800 +@@ -21,243 +21,251 @@ + # questions. + # + # +-# Only used for OSX/Darwin builds + + # Define public interface. ++ ++SUNWprivate_1.1 { ++ global: + # _JNI +- _JNI_CreateJavaVM +- _JNI_GetCreatedJavaVMs +- _JNI_GetDefaultJavaVMInitArgs ++ JNI_CreateJavaVM; ++ JNI_GetCreatedJavaVMs; ++ JNI_GetDefaultJavaVMInitArgs; + +- # _JVM +- _JVM_Accept +- _JVM_ActiveProcessorCount +- _JVM_AllocateNewArray +- _JVM_AllocateNewObject +- _JVM_ArrayCopy +- _JVM_AssertionStatusDirectives +- _JVM_Available +- _JVM_Bind +- _JVM_ClassDepth +- _JVM_ClassLoaderDepth +- _JVM_Clone +- _JVM_Close +- _JVM_CX8Field +- _JVM_CompileClass +- _JVM_CompileClasses +- _JVM_CompilerCommand +- _JVM_Connect +- _JVM_ConstantPoolGetClassAt +- _JVM_ConstantPoolGetClassAtIfLoaded +- _JVM_ConstantPoolGetDoubleAt +- _JVM_ConstantPoolGetFieldAt +- _JVM_ConstantPoolGetFieldAtIfLoaded +- _JVM_ConstantPoolGetFloatAt +- _JVM_ConstantPoolGetIntAt +- _JVM_ConstantPoolGetLongAt +- _JVM_ConstantPoolGetMethodAt +- _JVM_ConstantPoolGetMethodAtIfLoaded +- _JVM_ConstantPoolGetMemberRefInfoAt +- _JVM_ConstantPoolGetSize +- _JVM_ConstantPoolGetStringAt +- _JVM_ConstantPoolGetUTF8At +- _JVM_CountStackFrames +- _JVM_CurrentClassLoader +- _JVM_CurrentLoadedClass +- _JVM_CurrentThread +- _JVM_CurrentTimeMillis +- _JVM_DefineClass +- _JVM_DefineClassWithSource +- _JVM_DefineClassWithSourceCond +- _JVM_DesiredAssertionStatus +- _JVM_DisableCompiler +- _JVM_DoPrivileged +- _JVM_DTraceGetVersion +- _JVM_DTraceActivate +- _JVM_DTraceIsProbeEnabled +- _JVM_DTraceIsSupported +- _JVM_DTraceDispose +- _JVM_DumpAllStacks +- _JVM_DumpThreads +- _JVM_EnableCompiler +- _JVM_Exit +- _JVM_FillInStackTrace +- _JVM_FindClassFromCaller +- _JVM_FindClassFromClass +- _JVM_FindClassFromClassLoader +- _JVM_FindClassFromBootLoader +- _JVM_FindLibraryEntry +- _JVM_FindLoadedClass +- _JVM_FindPrimitiveClass +- _JVM_FindSignal +- _JVM_FreeMemory +- _JVM_GC +- _JVM_GetAllThreads +- _JVM_GetArrayElement +- _JVM_GetArrayLength +- _JVM_GetCPClassNameUTF +- _JVM_GetCPFieldClassNameUTF +- _JVM_GetCPFieldModifiers +- _JVM_GetCPFieldNameUTF +- _JVM_GetCPFieldSignatureUTF +- _JVM_GetCPMethodClassNameUTF +- _JVM_GetCPMethodModifiers +- _JVM_GetCPMethodNameUTF +- _JVM_GetCPMethodSignatureUTF +- _JVM_GetCallerClass +- _JVM_GetClassAccessFlags +- _JVM_GetClassAnnotations +- _JVM_GetClassCPEntriesCount +- _JVM_GetClassCPTypes +- _JVM_GetClassConstantPool +- _JVM_GetClassContext +- _JVM_GetClassDeclaredConstructors +- _JVM_GetClassDeclaredFields +- _JVM_GetClassDeclaredMethods +- _JVM_GetClassFieldsCount +- _JVM_GetClassInterfaces +- _JVM_GetClassLoader +- _JVM_GetClassMethodsCount +- _JVM_GetClassModifiers +- _JVM_GetClassName +- _JVM_GetClassNameUTF +- _JVM_GetClassSignature +- _JVM_GetClassSigners +- _JVM_GetClassTypeAnnotations +- _JVM_GetComponentType +- _JVM_GetDeclaredClasses +- _JVM_GetDeclaringClass +- _JVM_GetEnclosingMethodInfo +- _JVM_GetFieldAnnotations +- _JVM_GetFieldIxModifiers +- _JVM_GetFieldTypeAnnotations +- _JVM_GetHostName +- _JVM_GetInheritedAccessControlContext +- _JVM_GetInterfaceVersion +- _JVM_GetLastErrorString +- _JVM_GetManagement +- _JVM_GetMethodAnnotations +- _JVM_GetMethodDefaultAnnotationValue +- _JVM_GetMethodIxArgsSize +- _JVM_GetMethodIxByteCode +- _JVM_GetMethodIxByteCodeLength +- _JVM_GetMethodIxExceptionIndexes +- _JVM_GetMethodIxExceptionTableEntry +- _JVM_GetMethodIxExceptionTableLength +- _JVM_GetMethodIxExceptionsCount +- _JVM_GetMethodIxLocalsCount +- _JVM_GetMethodIxMaxStack +- _JVM_GetMethodIxModifiers +- _JVM_GetMethodIxNameUTF +- _JVM_GetMethodIxSignatureUTF +- _JVM_GetMethodParameterAnnotations +- _JVM_GetMethodParameters +- _JVM_GetMethodTypeAnnotations +- _JVM_GetPrimitiveArrayElement +- _JVM_GetProtectionDomain +- _JVM_GetSockName +- _JVM_GetSockOpt +- _JVM_GetStackAccessControlContext +- _JVM_GetStackTraceDepth +- _JVM_GetStackTraceElement +- _JVM_GetSystemPackage +- _JVM_GetSystemPackages +- _JVM_GetTemporaryDirectory +- _JVM_GetThreadStateNames +- _JVM_GetThreadStateValues +- _JVM_GetVersionInfo +- _JVM_Halt +- _JVM_HoldsLock +- _JVM_IHashCode +- _JVM_InitAgentProperties +- _JVM_InitProperties +- _JVM_InitializeCompiler +- _JVM_InitializeSocketLibrary +- _JVM_InternString +- _JVM_Interrupt +- _JVM_InvokeMethod +- _JVM_IsArrayClass +- _JVM_IsConstructorIx +- _JVM_IsInterface +- _JVM_IsInterrupted +- _JVM_IsNaN +- _JVM_IsPrimitiveClass +- _JVM_IsSameClassPackage +- _JVM_IsSilentCompiler +- _JVM_IsSupportedJNIVersion +- _JVM_IsThreadAlive +- _JVM_IsVMGeneratedMethodIx +- _JVM_LatestUserDefinedLoader +- _JVM_Listen +- _JVM_LoadClass0 +- _JVM_LoadLibrary +- _JVM_Lseek +- _JVM_MaxObjectInspectionAge +- _JVM_MaxMemory +- _JVM_MonitorNotify +- _JVM_MonitorNotifyAll +- _JVM_MonitorWait +- _JVM_NanoTime +- _JVM_NativePath +- _JVM_NewArray +- _JVM_NewInstanceFromConstructor +- _JVM_NewMultiArray +- _JVM_OnExit +- _JVM_Open +- _JVM_RaiseSignal +- _JVM_RawMonitorCreate +- _JVM_RawMonitorDestroy +- _JVM_RawMonitorEnter +- _JVM_RawMonitorExit +- _JVM_Read +- _JVM_Recv +- _JVM_RecvFrom +- _JVM_RegisterSignal +- _JVM_ReleaseUTF +- _JVM_ResolveClass +- _JVM_ResumeThread +- _JVM_Send +- _JVM_SendTo +- _JVM_SetArrayElement +- _JVM_SetClassSigners +- _JVM_SetLength +- _JVM_SetNativeThreadName +- _JVM_SetPrimitiveArrayElement +- _JVM_SetSockOpt +- _JVM_SetThreadPriority +- _JVM_Sleep +- _JVM_Socket +- _JVM_SocketAvailable +- _JVM_SocketClose +- _JVM_SocketShutdown +- _JVM_StartThread +- _JVM_StopThread +- _JVM_SuspendThread +- _JVM_SupportsCX8 +- _JVM_Sync +- _JVM_Timeout +- _JVM_TotalMemory +- _JVM_TraceInstructions +- _JVM_TraceMethodCalls +- _JVM_UnloadLibrary +- _JVM_Write +- _JVM_Yield +- _JVM_handle_bsd_signal ++ # JVM ++ JVM_Accept; ++ JVM_ActiveProcessorCount; ++ JVM_AllocateNewArray; ++ JVM_AllocateNewObject; ++ JVM_ArrayCopy; ++ JVM_AssertionStatusDirectives; ++ JVM_Available; ++ JVM_Bind; ++ JVM_ClassDepth; ++ JVM_ClassLoaderDepth; ++ JVM_Clone; ++ JVM_Close; ++ JVM_CX8Field; ++ JVM_CompileClass; ++ JVM_CompileClasses; ++ JVM_CompilerCommand; ++ JVM_Connect; ++ JVM_ConstantPoolGetClassAt; ++ JVM_ConstantPoolGetClassAtIfLoaded; ++ JVM_ConstantPoolGetDoubleAt; ++ JVM_ConstantPoolGetFieldAt; ++ JVM_ConstantPoolGetFieldAtIfLoaded; ++ JVM_ConstantPoolGetFloatAt; ++ JVM_ConstantPoolGetIntAt; ++ JVM_ConstantPoolGetLongAt; ++ JVM_ConstantPoolGetMethodAt; ++ JVM_ConstantPoolGetMethodAtIfLoaded; ++ JVM_ConstantPoolGetMemberRefInfoAt; ++ JVM_ConstantPoolGetSize; ++ JVM_ConstantPoolGetStringAt; ++ JVM_ConstantPoolGetUTF8At; ++ JVM_CountStackFrames; ++ JVM_CurrentClassLoader; ++ JVM_CurrentLoadedClass; ++ JVM_CurrentThread; ++ JVM_CurrentTimeMillis; ++ JVM_DefineClass; ++ JVM_DefineClassWithSource; ++ JVM_DefineClassWithSourceCond; ++ JVM_DesiredAssertionStatus; ++ JVM_DisableCompiler; ++ JVM_DoPrivileged; ++ JVM_DTraceGetVersion; ++ JVM_DTraceActivate; ++ JVM_DTraceIsProbeEnabled; ++ JVM_DTraceIsSupported; ++ JVM_DTraceDispose; ++ JVM_DumpAllStacks; ++ JVM_DumpThreads; ++ JVM_EnableCompiler; ++ JVM_Exit; ++ JVM_FillInStackTrace; ++ JVM_FindClassFromCaller; ++ JVM_FindClassFromClass; ++ JVM_FindClassFromClassLoader; ++ JVM_FindClassFromBootLoader; ++ JVM_FindLibraryEntry; ++ JVM_FindLoadedClass; ++ JVM_FindPrimitiveClass; ++ JVM_FindSignal; ++ JVM_FreeMemory; ++ JVM_GC; ++ JVM_GetAllThreads; ++ JVM_GetArrayElement; ++ JVM_GetArrayLength; ++ JVM_GetCPClassNameUTF; ++ JVM_GetCPFieldClassNameUTF; ++ JVM_GetCPFieldModifiers; ++ JVM_GetCPFieldNameUTF; ++ JVM_GetCPFieldSignatureUTF; ++ JVM_GetCPMethodClassNameUTF; ++ JVM_GetCPMethodModifiers; ++ JVM_GetCPMethodNameUTF; ++ JVM_GetCPMethodSignatureUTF; ++ JVM_GetCallerClass; ++ JVM_GetClassAccessFlags; ++ JVM_GetClassAnnotations; ++ JVM_GetClassCPEntriesCount; ++ JVM_GetClassCPTypes; ++ JVM_GetClassConstantPool; ++ JVM_GetClassContext; ++ JVM_GetClassDeclaredConstructors; ++ JVM_GetClassDeclaredFields; ++ JVM_GetClassDeclaredMethods; ++ JVM_GetClassFieldsCount; ++ JVM_GetClassInterfaces; ++ JVM_GetClassLoader; ++ JVM_GetClassMethodsCount; ++ JVM_GetClassModifiers; ++ JVM_GetClassName; ++ JVM_GetClassNameUTF; ++ JVM_GetClassSignature; ++ JVM_GetClassSigners; ++ JVM_GetClassTypeAnnotations; ++ JVM_GetComponentType; ++ JVM_GetDeclaredClasses; ++ JVM_GetDeclaringClass; ++ JVM_GetEnclosingMethodInfo; ++ JVM_GetFieldAnnotations; ++ JVM_GetFieldIxModifiers; ++ JVM_GetFieldTypeAnnotations; ++ JVM_GetHostName; ++ JVM_GetInheritedAccessControlContext; ++ JVM_GetInterfaceVersion; ++ JVM_GetLastErrorString; ++ JVM_GetManagement; ++ JVM_GetMethodAnnotations; ++ JVM_GetMethodDefaultAnnotationValue; ++ JVM_GetMethodIxArgsSize; ++ JVM_GetMethodIxByteCode; ++ JVM_GetMethodIxByteCodeLength; ++ JVM_GetMethodIxExceptionIndexes; ++ JVM_GetMethodIxExceptionTableEntry; ++ JVM_GetMethodIxExceptionTableLength; ++ JVM_GetMethodIxExceptionsCount; ++ JVM_GetMethodIxLocalsCount; ++ JVM_GetMethodIxMaxStack; ++ JVM_GetMethodIxModifiers; ++ JVM_GetMethodIxNameUTF; ++ JVM_GetMethodIxSignatureUTF; ++ JVM_GetMethodParameterAnnotations; ++ JVM_GetMethodParameters; ++ JVM_GetMethodTypeAnnotations; ++ JVM_GetPrimitiveArrayElement; ++ JVM_GetProtectionDomain; ++ JVM_GetSockName; ++ JVM_GetSockOpt; ++ JVM_GetStackAccessControlContext; ++ JVM_GetStackTraceDepth; ++ JVM_GetStackTraceElement; ++ JVM_GetSystemPackage; ++ JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; ++ JVM_GetThreadStateNames; ++ JVM_GetThreadStateValues; ++ JVM_GetVersionInfo; ++ JVM_Halt; ++ JVM_HoldsLock; ++ JVM_IHashCode; ++ JVM_InitAgentProperties; ++ JVM_InitProperties; ++ JVM_InitializeCompiler; ++ JVM_InitializeSocketLibrary; ++ JVM_InternString; ++ JVM_Interrupt; ++ JVM_InvokeMethod; ++ JVM_IsArrayClass; ++ JVM_IsConstructorIx; ++ JVM_IsInterface; ++ JVM_IsInterrupted; ++ JVM_IsNaN; ++ JVM_IsPrimitiveClass; ++ JVM_IsSameClassPackage; ++ JVM_IsSilentCompiler; ++ JVM_IsSupportedJNIVersion; ++ JVM_IsThreadAlive; ++ JVM_IsVMGeneratedMethodIx; ++ JVM_LatestUserDefinedLoader; ++ JVM_Listen; ++ JVM_LoadClass0; ++ JVM_LoadLibrary; ++ JVM_Lseek; ++ JVM_MaxObjectInspectionAge; ++ JVM_MaxMemory; ++ JVM_MonitorNotify; ++ JVM_MonitorNotifyAll; ++ JVM_MonitorWait; ++ JVM_NanoTime; ++ JVM_NativePath; ++ JVM_NewArray; ++ JVM_NewInstanceFromConstructor; ++ JVM_NewMultiArray; ++ JVM_OnExit; ++ JVM_Open; ++ JVM_RaiseSignal; ++ JVM_RawMonitorCreate; ++ JVM_RawMonitorDestroy; ++ JVM_RawMonitorEnter; ++ JVM_RawMonitorExit; ++ JVM_Read; ++ JVM_Recv; ++ JVM_RecvFrom; ++ JVM_RegisterSignal; ++ JVM_ReleaseUTF; ++ JVM_ResolveClass; ++ JVM_ResumeThread; ++ JVM_Send; ++ JVM_SendTo; ++ JVM_SetArrayElement; ++ JVM_SetClassSigners; ++ JVM_SetLength; ++ JVM_SetNativeThreadName; ++ JVM_SetPrimitiveArrayElement; ++ JVM_SetSockOpt; ++ JVM_SetThreadPriority; ++ JVM_Sleep; ++ JVM_Socket; ++ JVM_SocketAvailable; ++ JVM_SocketClose; ++ JVM_SocketShutdown; ++ JVM_StartThread; ++ JVM_StopThread; ++ JVM_SuspendThread; ++ JVM_SupportsCX8; ++ JVM_Sync; ++ JVM_Timeout; ++ JVM_TotalMemory; ++ JVM_TraceInstructions; ++ JVM_TraceMethodCalls; ++ JVM_UnloadLibrary; ++ JVM_Write; ++ JVM_Yield; + JVM_handle_bsd_signal; - # debug JVM - JVM_AccessVMBooleanFlag; ---- hotspot/make/bsd/makefiles/mapfile-vers-product -+++ hotspot/make/bsd/makefiles/mapfile-vers-product -@@ -242,7 +242,7 @@ - JVM_UnloadLibrary; - JVM_Write; - JVM_Yield; -- JVM_handle_linux_signal; +- # debug _JVM +- _JVM_AccessVMBooleanFlag +- _JVM_AccessVMIntFlag +- _JVM_VMBreakPoint ++ # debug JVM ++ JVM_AccessVMBooleanFlag; ++ JVM_AccessVMIntFlag; ++ JVM_VMBreakPoint; + + # miscellaneous functions +- _jio_fprintf +- _jio_printf +- _jio_snprintf +- _jio_vfprintf +- _jio_vsnprintf ++ jio_fprintf; ++ jio_printf; ++ jio_snprintf; ++ jio_vfprintf; ++ jio_vsnprintf; ++ fork1; ++ numa_warn; ++ numa_error; + + # This is for Forte Analyzer profiling support. +- _AsyncGetCallTrace ++ AsyncGetCallTrace; + + # INSERT VTABLE SYMBOLS HERE + ++ local: ++ *; ++}; +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-debug.macosx Wed Nov 05 15:01:44 2014 -0800 +@@ -0,0 +1,263 @@ ++# ++# Copyright (c) 2002, 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. ++# ++# ++# Only used for OSX/Darwin builds ++ ++# Define public interface. ++ # _JNI ++ _JNI_CreateJavaVM ++ _JNI_GetCreatedJavaVMs ++ _JNI_GetDefaultJavaVMInitArgs ++ ++ # _JVM ++ _JVM_Accept ++ _JVM_ActiveProcessorCount ++ _JVM_AllocateNewArray ++ _JVM_AllocateNewObject ++ _JVM_ArrayCopy ++ _JVM_AssertionStatusDirectives ++ _JVM_Available ++ _JVM_Bind ++ _JVM_ClassDepth ++ _JVM_ClassLoaderDepth ++ _JVM_Clone ++ _JVM_Close ++ _JVM_CX8Field ++ _JVM_CompileClass ++ _JVM_CompileClasses ++ _JVM_CompilerCommand ++ _JVM_Connect ++ _JVM_ConstantPoolGetClassAt ++ _JVM_ConstantPoolGetClassAtIfLoaded ++ _JVM_ConstantPoolGetDoubleAt ++ _JVM_ConstantPoolGetFieldAt ++ _JVM_ConstantPoolGetFieldAtIfLoaded ++ _JVM_ConstantPoolGetFloatAt ++ _JVM_ConstantPoolGetIntAt ++ _JVM_ConstantPoolGetLongAt ++ _JVM_ConstantPoolGetMethodAt ++ _JVM_ConstantPoolGetMethodAtIfLoaded ++ _JVM_ConstantPoolGetMemberRefInfoAt ++ _JVM_ConstantPoolGetSize ++ _JVM_ConstantPoolGetStringAt ++ _JVM_ConstantPoolGetUTF8At ++ _JVM_CountStackFrames ++ _JVM_CurrentClassLoader ++ _JVM_CurrentLoadedClass ++ _JVM_CurrentThread ++ _JVM_CurrentTimeMillis ++ _JVM_DefineClass ++ _JVM_DefineClassWithSource ++ _JVM_DefineClassWithSourceCond ++ _JVM_DesiredAssertionStatus ++ _JVM_DisableCompiler ++ _JVM_DoPrivileged ++ _JVM_DTraceGetVersion ++ _JVM_DTraceActivate ++ _JVM_DTraceIsProbeEnabled ++ _JVM_DTraceIsSupported ++ _JVM_DTraceDispose ++ _JVM_DumpAllStacks ++ _JVM_DumpThreads ++ _JVM_EnableCompiler ++ _JVM_Exit ++ _JVM_FillInStackTrace ++ _JVM_FindClassFromCaller ++ _JVM_FindClassFromClass ++ _JVM_FindClassFromClassLoader ++ _JVM_FindClassFromBootLoader ++ _JVM_FindLibraryEntry ++ _JVM_FindLoadedClass ++ _JVM_FindPrimitiveClass ++ _JVM_FindSignal ++ _JVM_FreeMemory ++ _JVM_GC ++ _JVM_GetAllThreads ++ _JVM_GetArrayElement ++ _JVM_GetArrayLength ++ _JVM_GetCPClassNameUTF ++ _JVM_GetCPFieldClassNameUTF ++ _JVM_GetCPFieldModifiers ++ _JVM_GetCPFieldNameUTF ++ _JVM_GetCPFieldSignatureUTF ++ _JVM_GetCPMethodClassNameUTF ++ _JVM_GetCPMethodModifiers ++ _JVM_GetCPMethodNameUTF ++ _JVM_GetCPMethodSignatureUTF ++ _JVM_GetCallerClass ++ _JVM_GetClassAccessFlags ++ _JVM_GetClassAnnotations ++ _JVM_GetClassCPEntriesCount ++ _JVM_GetClassCPTypes ++ _JVM_GetClassConstantPool ++ _JVM_GetClassContext ++ _JVM_GetClassDeclaredConstructors ++ _JVM_GetClassDeclaredFields ++ _JVM_GetClassDeclaredMethods ++ _JVM_GetClassFieldsCount ++ _JVM_GetClassInterfaces ++ _JVM_GetClassLoader ++ _JVM_GetClassMethodsCount ++ _JVM_GetClassModifiers ++ _JVM_GetClassName ++ _JVM_GetClassNameUTF ++ _JVM_GetClassSignature ++ _JVM_GetClassSigners ++ _JVM_GetClassTypeAnnotations ++ _JVM_GetComponentType ++ _JVM_GetDeclaredClasses ++ _JVM_GetDeclaringClass ++ _JVM_GetEnclosingMethodInfo ++ _JVM_GetFieldAnnotations ++ _JVM_GetFieldIxModifiers ++ _JVM_GetFieldTypeAnnotations ++ _JVM_GetHostName ++ _JVM_GetInheritedAccessControlContext ++ _JVM_GetInterfaceVersion ++ _JVM_GetLastErrorString ++ _JVM_GetManagement ++ _JVM_GetMethodAnnotations ++ _JVM_GetMethodDefaultAnnotationValue ++ _JVM_GetMethodIxArgsSize ++ _JVM_GetMethodIxByteCode ++ _JVM_GetMethodIxByteCodeLength ++ _JVM_GetMethodIxExceptionIndexes ++ _JVM_GetMethodIxExceptionTableEntry ++ _JVM_GetMethodIxExceptionTableLength ++ _JVM_GetMethodIxExceptionsCount ++ _JVM_GetMethodIxLocalsCount ++ _JVM_GetMethodIxMaxStack ++ _JVM_GetMethodIxModifiers ++ _JVM_GetMethodIxNameUTF ++ _JVM_GetMethodIxSignatureUTF ++ _JVM_GetMethodParameterAnnotations ++ _JVM_GetMethodParameters ++ _JVM_GetMethodTypeAnnotations ++ _JVM_GetPrimitiveArrayElement ++ _JVM_GetProtectionDomain ++ _JVM_GetSockName ++ _JVM_GetSockOpt ++ _JVM_GetStackAccessControlContext ++ _JVM_GetStackTraceDepth ++ _JVM_GetStackTraceElement ++ _JVM_GetSystemPackage ++ _JVM_GetSystemPackages ++ _JVM_GetTemporaryDirectory ++ _JVM_GetThreadStateNames ++ _JVM_GetThreadStateValues ++ _JVM_GetVersionInfo ++ _JVM_Halt ++ _JVM_HoldsLock ++ _JVM_IHashCode ++ _JVM_InitAgentProperties ++ _JVM_InitProperties ++ _JVM_InitializeCompiler ++ _JVM_InitializeSocketLibrary ++ _JVM_InternString ++ _JVM_Interrupt ++ _JVM_InvokeMethod ++ _JVM_IsArrayClass ++ _JVM_IsConstructorIx ++ _JVM_IsInterface ++ _JVM_IsInterrupted ++ _JVM_IsNaN ++ _JVM_IsPrimitiveClass ++ _JVM_IsSameClassPackage ++ _JVM_IsSilentCompiler ++ _JVM_IsSupportedJNIVersion ++ _JVM_IsThreadAlive ++ _JVM_IsVMGeneratedMethodIx ++ _JVM_LatestUserDefinedLoader ++ _JVM_Listen ++ _JVM_LoadClass0 ++ _JVM_LoadLibrary ++ _JVM_Lseek ++ _JVM_MaxObjectInspectionAge ++ _JVM_MaxMemory ++ _JVM_MonitorNotify ++ _JVM_MonitorNotifyAll ++ _JVM_MonitorWait ++ _JVM_NanoTime ++ _JVM_NativePath ++ _JVM_NewArray ++ _JVM_NewInstanceFromConstructor ++ _JVM_NewMultiArray ++ _JVM_OnExit ++ _JVM_Open ++ _JVM_RaiseSignal ++ _JVM_RawMonitorCreate ++ _JVM_RawMonitorDestroy ++ _JVM_RawMonitorEnter ++ _JVM_RawMonitorExit ++ _JVM_Read ++ _JVM_Recv ++ _JVM_RecvFrom ++ _JVM_RegisterSignal ++ _JVM_ReleaseUTF ++ _JVM_ResolveClass ++ _JVM_ResumeThread ++ _JVM_Send ++ _JVM_SendTo ++ _JVM_SetArrayElement ++ _JVM_SetClassSigners ++ _JVM_SetLength ++ _JVM_SetNativeThreadName ++ _JVM_SetPrimitiveArrayElement ++ _JVM_SetSockOpt ++ _JVM_SetThreadPriority ++ _JVM_Sleep ++ _JVM_Socket ++ _JVM_SocketAvailable ++ _JVM_SocketClose ++ _JVM_SocketShutdown ++ _JVM_StartThread ++ _JVM_StopThread ++ _JVM_SuspendThread ++ _JVM_SupportsCX8 ++ _JVM_Sync ++ _JVM_Timeout ++ _JVM_TotalMemory ++ _JVM_TraceInstructions ++ _JVM_TraceMethodCalls ++ _JVM_UnloadLibrary ++ _JVM_Write ++ _JVM_Yield ++ _JVM_handle_bsd_signal ++ ++ # debug _JVM ++ _JVM_AccessVMBooleanFlag ++ _JVM_AccessVMIntFlag ++ _JVM_VMBreakPoint ++ ++ # miscellaneous functions ++ _jio_fprintf ++ _jio_printf ++ _jio_snprintf ++ _jio_vfprintf ++ _jio_vsnprintf ++ ++ # This is for Forte Analyzer profiling support. ++ _AsyncGetCallTrace ++ ++ # INSERT VTABLE SYMBOLS HERE ++ +--- ./hotspot/make/bsd/makefiles/mapfile-vers-product Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-product Wed Nov 05 15:01:44 2014 -0800 +@@ -21,238 +21,246 @@ + # questions. + # + # +-# Only used for OSX/Darwin builds + + # Define public interface. ++ ++SUNWprivate_1.1 { ++ global: + # _JNI +- _JNI_CreateJavaVM +- _JNI_GetCreatedJavaVMs +- _JNI_GetDefaultJavaVMInitArgs ++ JNI_CreateJavaVM; ++ JNI_GetCreatedJavaVMs; ++ JNI_GetDefaultJavaVMInitArgs; + +- # _JVM +- _JVM_Accept +- _JVM_ActiveProcessorCount +- _JVM_AllocateNewArray +- _JVM_AllocateNewObject +- _JVM_ArrayCopy +- _JVM_AssertionStatusDirectives +- _JVM_Available +- _JVM_Bind +- _JVM_ClassDepth +- _JVM_ClassLoaderDepth +- _JVM_Clone +- _JVM_Close +- _JVM_CX8Field +- _JVM_CompileClass +- _JVM_CompileClasses +- _JVM_CompilerCommand +- _JVM_Connect +- _JVM_ConstantPoolGetClassAt +- _JVM_ConstantPoolGetClassAtIfLoaded +- _JVM_ConstantPoolGetDoubleAt +- _JVM_ConstantPoolGetFieldAt +- _JVM_ConstantPoolGetFieldAtIfLoaded +- _JVM_ConstantPoolGetFloatAt +- _JVM_ConstantPoolGetIntAt +- _JVM_ConstantPoolGetLongAt +- _JVM_ConstantPoolGetMethodAt +- _JVM_ConstantPoolGetMethodAtIfLoaded +- _JVM_ConstantPoolGetMemberRefInfoAt +- _JVM_ConstantPoolGetSize +- _JVM_ConstantPoolGetStringAt +- _JVM_ConstantPoolGetUTF8At +- _JVM_CountStackFrames +- _JVM_CurrentClassLoader +- _JVM_CurrentLoadedClass +- _JVM_CurrentThread +- _JVM_CurrentTimeMillis +- _JVM_DefineClass +- _JVM_DefineClassWithSource +- _JVM_DefineClassWithSourceCond +- _JVM_DesiredAssertionStatus +- _JVM_DisableCompiler +- _JVM_DoPrivileged +- _JVM_DTraceGetVersion +- _JVM_DTraceActivate +- _JVM_DTraceIsProbeEnabled +- _JVM_DTraceIsSupported +- _JVM_DTraceDispose +- _JVM_DumpAllStacks +- _JVM_DumpThreads +- _JVM_EnableCompiler +- _JVM_Exit +- _JVM_FillInStackTrace +- _JVM_FindClassFromCaller +- _JVM_FindClassFromClass +- _JVM_FindClassFromClassLoader +- _JVM_FindClassFromBootLoader +- _JVM_FindLibraryEntry +- _JVM_FindLoadedClass +- _JVM_FindPrimitiveClass +- _JVM_FindSignal +- _JVM_FreeMemory +- _JVM_GC +- _JVM_GetAllThreads +- _JVM_GetArrayElement +- _JVM_GetArrayLength +- _JVM_GetCPClassNameUTF +- _JVM_GetCPFieldClassNameUTF +- _JVM_GetCPFieldModifiers +- _JVM_GetCPFieldNameUTF +- _JVM_GetCPFieldSignatureUTF +- _JVM_GetCPMethodClassNameUTF +- _JVM_GetCPMethodModifiers +- _JVM_GetCPMethodNameUTF +- _JVM_GetCPMethodSignatureUTF +- _JVM_GetCallerClass +- _JVM_GetClassAccessFlags +- _JVM_GetClassAnnotations +- _JVM_GetClassCPEntriesCount +- _JVM_GetClassCPTypes +- _JVM_GetClassConstantPool +- _JVM_GetClassContext +- _JVM_GetClassDeclaredConstructors +- _JVM_GetClassDeclaredFields +- _JVM_GetClassDeclaredMethods +- _JVM_GetClassFieldsCount +- _JVM_GetClassInterfaces +- _JVM_GetClassLoader +- _JVM_GetClassMethodsCount +- _JVM_GetClassModifiers +- _JVM_GetClassName +- _JVM_GetClassNameUTF +- _JVM_GetClassSignature +- _JVM_GetClassSigners +- _JVM_GetClassTypeAnnotations +- _JVM_GetComponentType +- _JVM_GetDeclaredClasses +- _JVM_GetDeclaringClass +- _JVM_GetEnclosingMethodInfo +- _JVM_GetFieldAnnotations +- _JVM_GetFieldIxModifiers +- _JVM_GetFieldTypeAnnotations +- _JVM_GetHostName +- _JVM_GetInheritedAccessControlContext +- _JVM_GetInterfaceVersion +- _JVM_GetLastErrorString +- _JVM_GetManagement +- _JVM_GetMethodAnnotations +- _JVM_GetMethodDefaultAnnotationValue +- _JVM_GetMethodIxArgsSize +- _JVM_GetMethodIxByteCode +- _JVM_GetMethodIxByteCodeLength +- _JVM_GetMethodIxExceptionIndexes +- _JVM_GetMethodIxExceptionTableEntry +- _JVM_GetMethodIxExceptionTableLength +- _JVM_GetMethodIxExceptionsCount +- _JVM_GetMethodIxLocalsCount +- _JVM_GetMethodIxMaxStack +- _JVM_GetMethodIxModifiers +- _JVM_GetMethodIxNameUTF +- _JVM_GetMethodIxSignatureUTF +- _JVM_GetMethodParameterAnnotations +- _JVM_GetMethodParameters +- _JVM_GetMethodTypeAnnotations +- _JVM_GetPrimitiveArrayElement +- _JVM_GetProtectionDomain +- _JVM_GetSockName +- _JVM_GetSockOpt +- _JVM_GetStackAccessControlContext +- _JVM_GetStackTraceDepth +- _JVM_GetStackTraceElement +- _JVM_GetSystemPackage +- _JVM_GetSystemPackages +- _JVM_GetTemporaryDirectory +- _JVM_GetThreadStateNames +- _JVM_GetThreadStateValues +- _JVM_GetVersionInfo +- _JVM_Halt +- _JVM_HoldsLock +- _JVM_IHashCode +- _JVM_InitAgentProperties +- _JVM_InitProperties +- _JVM_InitializeCompiler +- _JVM_InitializeSocketLibrary +- _JVM_InternString +- _JVM_Interrupt +- _JVM_InvokeMethod +- _JVM_IsArrayClass +- _JVM_IsConstructorIx +- _JVM_IsInterface +- _JVM_IsInterrupted +- _JVM_IsNaN +- _JVM_IsPrimitiveClass +- _JVM_IsSameClassPackage +- _JVM_IsSilentCompiler +- _JVM_IsSupportedJNIVersion +- _JVM_IsThreadAlive +- _JVM_IsVMGeneratedMethodIx +- _JVM_LatestUserDefinedLoader +- _JVM_Listen +- _JVM_LoadClass0 +- _JVM_LoadLibrary +- _JVM_Lseek +- _JVM_MaxObjectInspectionAge +- _JVM_MaxMemory +- _JVM_MonitorNotify +- _JVM_MonitorNotifyAll +- _JVM_MonitorWait +- _JVM_NanoTime +- _JVM_NativePath +- _JVM_NewArray +- _JVM_NewInstanceFromConstructor +- _JVM_NewMultiArray +- _JVM_OnExit +- _JVM_Open +- _JVM_RaiseSignal +- _JVM_RawMonitorCreate +- _JVM_RawMonitorDestroy +- _JVM_RawMonitorEnter +- _JVM_RawMonitorExit +- _JVM_Read +- _JVM_Recv +- _JVM_RecvFrom +- _JVM_RegisterSignal +- _JVM_ReleaseUTF +- _JVM_ResolveClass +- _JVM_ResumeThread +- _JVM_Send +- _JVM_SendTo +- _JVM_SetArrayElement +- _JVM_SetClassSigners +- _JVM_SetLength +- _JVM_SetNativeThreadName +- _JVM_SetPrimitiveArrayElement +- _JVM_SetSockOpt +- _JVM_SetThreadPriority +- _JVM_Sleep +- _JVM_Socket +- _JVM_SocketAvailable +- _JVM_SocketClose +- _JVM_SocketShutdown +- _JVM_StartThread +- _JVM_StopThread +- _JVM_SuspendThread +- _JVM_SupportsCX8 +- _JVM_Sync +- _JVM_Timeout +- _JVM_TotalMemory +- _JVM_TraceInstructions +- _JVM_TraceMethodCalls +- _JVM_UnloadLibrary +- _JVM_Write +- _JVM_Yield +- _JVM_handle_bsd_signal ++ # JVM ++ JVM_Accept; ++ JVM_ActiveProcessorCount; ++ JVM_AllocateNewArray; ++ JVM_AllocateNewObject; ++ JVM_ArrayCopy; ++ JVM_AssertionStatusDirectives; ++ JVM_Available; ++ JVM_Bind; ++ JVM_ClassDepth; ++ JVM_ClassLoaderDepth; ++ JVM_Clone; ++ JVM_Close; ++ JVM_CX8Field; ++ JVM_CompileClass; ++ JVM_CompileClasses; ++ JVM_CompilerCommand; ++ JVM_Connect; ++ JVM_ConstantPoolGetClassAt; ++ JVM_ConstantPoolGetClassAtIfLoaded; ++ JVM_ConstantPoolGetDoubleAt; ++ JVM_ConstantPoolGetFieldAt; ++ JVM_ConstantPoolGetFieldAtIfLoaded; ++ JVM_ConstantPoolGetFloatAt; ++ JVM_ConstantPoolGetIntAt; ++ JVM_ConstantPoolGetLongAt; ++ JVM_ConstantPoolGetMethodAt; ++ JVM_ConstantPoolGetMethodAtIfLoaded; ++ JVM_ConstantPoolGetMemberRefInfoAt; ++ JVM_ConstantPoolGetSize; ++ JVM_ConstantPoolGetStringAt; ++ JVM_ConstantPoolGetUTF8At; ++ JVM_CountStackFrames; ++ JVM_CurrentClassLoader; ++ JVM_CurrentLoadedClass; ++ JVM_CurrentThread; ++ JVM_CurrentTimeMillis; ++ JVM_DefineClass; ++ JVM_DefineClassWithSource; ++ JVM_DefineClassWithSourceCond; ++ JVM_DesiredAssertionStatus; ++ JVM_DisableCompiler; ++ JVM_DoPrivileged; ++ JVM_DTraceGetVersion; ++ JVM_DTraceActivate; ++ JVM_DTraceIsProbeEnabled; ++ JVM_DTraceIsSupported; ++ JVM_DTraceDispose; ++ JVM_DumpAllStacks; ++ JVM_DumpThreads; ++ JVM_EnableCompiler; ++ JVM_Exit; ++ JVM_FillInStackTrace; ++ JVM_FindClassFromCaller; ++ JVM_FindClassFromClass; ++ JVM_FindClassFromClassLoader; ++ JVM_FindClassFromBootLoader; ++ JVM_FindLibraryEntry; ++ JVM_FindLoadedClass; ++ JVM_FindPrimitiveClass; ++ JVM_FindSignal; ++ JVM_FreeMemory; ++ JVM_GC; ++ JVM_GetAllThreads; ++ JVM_GetArrayElement; ++ JVM_GetArrayLength; ++ JVM_GetCPClassNameUTF; ++ JVM_GetCPFieldClassNameUTF; ++ JVM_GetCPFieldModifiers; ++ JVM_GetCPFieldNameUTF; ++ JVM_GetCPFieldSignatureUTF; ++ JVM_GetCPMethodClassNameUTF; ++ JVM_GetCPMethodModifiers; ++ JVM_GetCPMethodNameUTF; ++ JVM_GetCPMethodSignatureUTF; ++ JVM_GetCallerClass; ++ JVM_GetClassAccessFlags; ++ JVM_GetClassAnnotations; ++ JVM_GetClassCPEntriesCount; ++ JVM_GetClassCPTypes; ++ JVM_GetClassConstantPool; ++ JVM_GetClassContext; ++ JVM_GetClassDeclaredConstructors; ++ JVM_GetClassDeclaredFields; ++ JVM_GetClassDeclaredMethods; ++ JVM_GetClassFieldsCount; ++ JVM_GetClassInterfaces; ++ JVM_GetClassLoader; ++ JVM_GetClassMethodsCount; ++ JVM_GetClassModifiers; ++ JVM_GetClassName; ++ JVM_GetClassNameUTF; ++ JVM_GetClassSignature; ++ JVM_GetClassSigners; ++ JVM_GetClassTypeAnnotations; ++ JVM_GetComponentType; ++ JVM_GetDeclaredClasses; ++ JVM_GetDeclaringClass; ++ JVM_GetEnclosingMethodInfo; ++ JVM_GetFieldAnnotations; ++ JVM_GetFieldIxModifiers; ++ JVM_GetFieldTypeAnnotations; ++ JVM_GetHostName; ++ JVM_GetInheritedAccessControlContext; ++ JVM_GetInterfaceVersion; ++ JVM_GetLastErrorString; ++ JVM_GetManagement; ++ JVM_GetMethodAnnotations; ++ JVM_GetMethodDefaultAnnotationValue; ++ JVM_GetMethodIxArgsSize; ++ JVM_GetMethodIxByteCode; ++ JVM_GetMethodIxByteCodeLength; ++ JVM_GetMethodIxExceptionIndexes; ++ JVM_GetMethodIxExceptionTableEntry; ++ JVM_GetMethodIxExceptionTableLength; ++ JVM_GetMethodIxExceptionsCount; ++ JVM_GetMethodIxLocalsCount; ++ JVM_GetMethodIxMaxStack; ++ JVM_GetMethodIxModifiers; ++ JVM_GetMethodIxNameUTF; ++ JVM_GetMethodIxSignatureUTF; ++ JVM_GetMethodParameterAnnotations; ++ JVM_GetMethodParameters; ++ JVM_GetMethodTypeAnnotations; ++ JVM_GetPrimitiveArrayElement; ++ JVM_GetProtectionDomain; ++ JVM_GetSockName; ++ JVM_GetSockOpt; ++ JVM_GetStackAccessControlContext; ++ JVM_GetStackTraceDepth; ++ JVM_GetStackTraceElement; ++ JVM_GetSystemPackage; ++ JVM_GetSystemPackages; ++ JVM_GetTemporaryDirectory; ++ JVM_GetThreadStateNames; ++ JVM_GetThreadStateValues; ++ JVM_GetVersionInfo; ++ JVM_Halt; ++ JVM_HoldsLock; ++ JVM_IHashCode; ++ JVM_InitAgentProperties; ++ JVM_InitProperties; ++ JVM_InitializeCompiler; ++ JVM_InitializeSocketLibrary; ++ JVM_InternString; ++ JVM_Interrupt; ++ JVM_InvokeMethod; ++ JVM_IsArrayClass; ++ JVM_IsConstructorIx; ++ JVM_IsInterface; ++ JVM_IsInterrupted; ++ JVM_IsNaN; ++ JVM_IsPrimitiveClass; ++ JVM_IsSameClassPackage; ++ JVM_IsSilentCompiler; ++ JVM_IsSupportedJNIVersion; ++ JVM_IsThreadAlive; ++ JVM_IsVMGeneratedMethodIx; ++ JVM_LatestUserDefinedLoader; ++ JVM_Listen; ++ JVM_LoadClass0; ++ JVM_LoadLibrary; ++ JVM_Lseek; ++ JVM_MaxObjectInspectionAge; ++ JVM_MaxMemory; ++ JVM_MonitorNotify; ++ JVM_MonitorNotifyAll; ++ JVM_MonitorWait; ++ JVM_NanoTime; ++ JVM_NativePath; ++ JVM_NewArray; ++ JVM_NewInstanceFromConstructor; ++ JVM_NewMultiArray; ++ JVM_OnExit; ++ JVM_Open; ++ JVM_RaiseSignal; ++ JVM_RawMonitorCreate; ++ JVM_RawMonitorDestroy; ++ JVM_RawMonitorEnter; ++ JVM_RawMonitorExit; ++ JVM_Read; ++ JVM_Recv; ++ JVM_RecvFrom; ++ JVM_RegisterSignal; ++ JVM_ReleaseUTF; ++ JVM_ResolveClass; ++ JVM_ResumeThread; ++ JVM_Send; ++ JVM_SendTo; ++ JVM_SetArrayElement; ++ JVM_SetClassSigners; ++ JVM_SetLength; ++ JVM_SetNativeThreadName; ++ JVM_SetPrimitiveArrayElement; ++ JVM_SetSockOpt; ++ JVM_SetThreadPriority; ++ JVM_Sleep; ++ JVM_Socket; ++ JVM_SocketAvailable; ++ JVM_SocketClose; ++ JVM_SocketShutdown; ++ JVM_StartThread; ++ JVM_StopThread; ++ JVM_SuspendThread; ++ JVM_SupportsCX8; ++ JVM_Sync; ++ JVM_Timeout; ++ JVM_TotalMemory; ++ JVM_TraceInstructions; ++ JVM_TraceMethodCalls; ++ JVM_UnloadLibrary; ++ JVM_Write; ++ JVM_Yield; + JVM_handle_bsd_signal; # miscellaneous functions - jio_fprintf; ---- hotspot/make/bsd/makefiles/optimized.make -+++ hotspot/make/bsd/makefiles/optimized.make +- _jio_fprintf +- _jio_printf +- _jio_snprintf +- _jio_vfprintf +- _jio_vsnprintf ++ jio_fprintf; ++ jio_printf; ++ jio_snprintf; ++ jio_vfprintf; ++ jio_vsnprintf; ++ fork1; ++ numa_warn; ++ numa_error; + + # This is for Forte Analyzer profiling support. +- _AsyncGetCallTrace ++ AsyncGetCallTrace; + + # INSERT VTABLE SYMBOLS HERE + ++ local: ++ *; ++}; +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-product.macosx Wed Nov 05 15:01:44 2014 -0800 +@@ -0,0 +1,258 @@ ++# ++# Copyright (c) 2002, 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. ++# ++# ++# Only used for OSX/Darwin builds ++ ++# Define public interface. ++ # _JNI ++ _JNI_CreateJavaVM ++ _JNI_GetCreatedJavaVMs ++ _JNI_GetDefaultJavaVMInitArgs ++ ++ # _JVM ++ _JVM_Accept ++ _JVM_ActiveProcessorCount ++ _JVM_AllocateNewArray ++ _JVM_AllocateNewObject ++ _JVM_ArrayCopy ++ _JVM_AssertionStatusDirectives ++ _JVM_Available ++ _JVM_Bind ++ _JVM_ClassDepth ++ _JVM_ClassLoaderDepth ++ _JVM_Clone ++ _JVM_Close ++ _JVM_CX8Field ++ _JVM_CompileClass ++ _JVM_CompileClasses ++ _JVM_CompilerCommand ++ _JVM_Connect ++ _JVM_ConstantPoolGetClassAt ++ _JVM_ConstantPoolGetClassAtIfLoaded ++ _JVM_ConstantPoolGetDoubleAt ++ _JVM_ConstantPoolGetFieldAt ++ _JVM_ConstantPoolGetFieldAtIfLoaded ++ _JVM_ConstantPoolGetFloatAt ++ _JVM_ConstantPoolGetIntAt ++ _JVM_ConstantPoolGetLongAt ++ _JVM_ConstantPoolGetMethodAt ++ _JVM_ConstantPoolGetMethodAtIfLoaded ++ _JVM_ConstantPoolGetMemberRefInfoAt ++ _JVM_ConstantPoolGetSize ++ _JVM_ConstantPoolGetStringAt ++ _JVM_ConstantPoolGetUTF8At ++ _JVM_CountStackFrames ++ _JVM_CurrentClassLoader ++ _JVM_CurrentLoadedClass ++ _JVM_CurrentThread ++ _JVM_CurrentTimeMillis ++ _JVM_DefineClass ++ _JVM_DefineClassWithSource ++ _JVM_DefineClassWithSourceCond ++ _JVM_DesiredAssertionStatus ++ _JVM_DisableCompiler ++ _JVM_DoPrivileged ++ _JVM_DTraceGetVersion ++ _JVM_DTraceActivate ++ _JVM_DTraceIsProbeEnabled ++ _JVM_DTraceIsSupported ++ _JVM_DTraceDispose ++ _JVM_DumpAllStacks ++ _JVM_DumpThreads ++ _JVM_EnableCompiler ++ _JVM_Exit ++ _JVM_FillInStackTrace ++ _JVM_FindClassFromCaller ++ _JVM_FindClassFromClass ++ _JVM_FindClassFromClassLoader ++ _JVM_FindClassFromBootLoader ++ _JVM_FindLibraryEntry ++ _JVM_FindLoadedClass ++ _JVM_FindPrimitiveClass ++ _JVM_FindSignal ++ _JVM_FreeMemory ++ _JVM_GC ++ _JVM_GetAllThreads ++ _JVM_GetArrayElement ++ _JVM_GetArrayLength ++ _JVM_GetCPClassNameUTF ++ _JVM_GetCPFieldClassNameUTF ++ _JVM_GetCPFieldModifiers ++ _JVM_GetCPFieldNameUTF ++ _JVM_GetCPFieldSignatureUTF ++ _JVM_GetCPMethodClassNameUTF ++ _JVM_GetCPMethodModifiers ++ _JVM_GetCPMethodNameUTF ++ _JVM_GetCPMethodSignatureUTF ++ _JVM_GetCallerClass ++ _JVM_GetClassAccessFlags ++ _JVM_GetClassAnnotations ++ _JVM_GetClassCPEntriesCount ++ _JVM_GetClassCPTypes ++ _JVM_GetClassConstantPool ++ _JVM_GetClassContext ++ _JVM_GetClassDeclaredConstructors ++ _JVM_GetClassDeclaredFields ++ _JVM_GetClassDeclaredMethods ++ _JVM_GetClassFieldsCount ++ _JVM_GetClassInterfaces ++ _JVM_GetClassLoader ++ _JVM_GetClassMethodsCount ++ _JVM_GetClassModifiers ++ _JVM_GetClassName ++ _JVM_GetClassNameUTF ++ _JVM_GetClassSignature ++ _JVM_GetClassSigners ++ _JVM_GetClassTypeAnnotations ++ _JVM_GetComponentType ++ _JVM_GetDeclaredClasses ++ _JVM_GetDeclaringClass ++ _JVM_GetEnclosingMethodInfo ++ _JVM_GetFieldAnnotations ++ _JVM_GetFieldIxModifiers ++ _JVM_GetFieldTypeAnnotations ++ _JVM_GetHostName ++ _JVM_GetInheritedAccessControlContext ++ _JVM_GetInterfaceVersion ++ _JVM_GetLastErrorString ++ _JVM_GetManagement ++ _JVM_GetMethodAnnotations ++ _JVM_GetMethodDefaultAnnotationValue ++ _JVM_GetMethodIxArgsSize ++ _JVM_GetMethodIxByteCode ++ _JVM_GetMethodIxByteCodeLength ++ _JVM_GetMethodIxExceptionIndexes ++ _JVM_GetMethodIxExceptionTableEntry ++ _JVM_GetMethodIxExceptionTableLength ++ _JVM_GetMethodIxExceptionsCount ++ _JVM_GetMethodIxLocalsCount ++ _JVM_GetMethodIxMaxStack ++ _JVM_GetMethodIxModifiers ++ _JVM_GetMethodIxNameUTF ++ _JVM_GetMethodIxSignatureUTF ++ _JVM_GetMethodParameterAnnotations ++ _JVM_GetMethodParameters ++ _JVM_GetMethodTypeAnnotations ++ _JVM_GetPrimitiveArrayElement ++ _JVM_GetProtectionDomain ++ _JVM_GetSockName ++ _JVM_GetSockOpt ++ _JVM_GetStackAccessControlContext ++ _JVM_GetStackTraceDepth ++ _JVM_GetStackTraceElement ++ _JVM_GetSystemPackage ++ _JVM_GetSystemPackages ++ _JVM_GetTemporaryDirectory ++ _JVM_GetThreadStateNames ++ _JVM_GetThreadStateValues ++ _JVM_GetVersionInfo ++ _JVM_Halt ++ _JVM_HoldsLock ++ _JVM_IHashCode ++ _JVM_InitAgentProperties ++ _JVM_InitProperties ++ _JVM_InitializeCompiler ++ _JVM_InitializeSocketLibrary ++ _JVM_InternString ++ _JVM_Interrupt ++ _JVM_InvokeMethod ++ _JVM_IsArrayClass ++ _JVM_IsConstructorIx ++ _JVM_IsInterface ++ _JVM_IsInterrupted ++ _JVM_IsNaN ++ _JVM_IsPrimitiveClass ++ _JVM_IsSameClassPackage ++ _JVM_IsSilentCompiler ++ _JVM_IsSupportedJNIVersion ++ _JVM_IsThreadAlive ++ _JVM_IsVMGeneratedMethodIx ++ _JVM_LatestUserDefinedLoader ++ _JVM_Listen ++ _JVM_LoadClass0 ++ _JVM_LoadLibrary ++ _JVM_Lseek ++ _JVM_MaxObjectInspectionAge ++ _JVM_MaxMemory ++ _JVM_MonitorNotify ++ _JVM_MonitorNotifyAll ++ _JVM_MonitorWait ++ _JVM_NanoTime ++ _JVM_NativePath ++ _JVM_NewArray ++ _JVM_NewInstanceFromConstructor ++ _JVM_NewMultiArray ++ _JVM_OnExit ++ _JVM_Open ++ _JVM_RaiseSignal ++ _JVM_RawMonitorCreate ++ _JVM_RawMonitorDestroy ++ _JVM_RawMonitorEnter ++ _JVM_RawMonitorExit ++ _JVM_Read ++ _JVM_Recv ++ _JVM_RecvFrom ++ _JVM_RegisterSignal ++ _JVM_ReleaseUTF ++ _JVM_ResolveClass ++ _JVM_ResumeThread ++ _JVM_Send ++ _JVM_SendTo ++ _JVM_SetArrayElement ++ _JVM_SetClassSigners ++ _JVM_SetLength ++ _JVM_SetNativeThreadName ++ _JVM_SetPrimitiveArrayElement ++ _JVM_SetSockOpt ++ _JVM_SetThreadPriority ++ _JVM_Sleep ++ _JVM_Socket ++ _JVM_SocketAvailable ++ _JVM_SocketClose ++ _JVM_SocketShutdown ++ _JVM_StartThread ++ _JVM_StopThread ++ _JVM_SuspendThread ++ _JVM_SupportsCX8 ++ _JVM_Sync ++ _JVM_Timeout ++ _JVM_TotalMemory ++ _JVM_TraceInstructions ++ _JVM_TraceMethodCalls ++ _JVM_UnloadLibrary ++ _JVM_Write ++ _JVM_Yield ++ _JVM_handle_bsd_signal ++ ++ # miscellaneous functions ++ _jio_fprintf ++ _jio_printf ++ _jio_snprintf ++ _jio_vfprintf ++ _jio_vsnprintf ++ ++ # This is for Forte Analyzer profiling support. ++ _AsyncGetCallTrace ++ ++ # INSERT VTABLE SYMBOLS HERE ++ +--- ./hotspot/make/bsd/makefiles/optimized.make Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/optimized.make Wed Nov 05 15:01:44 2014 -0800 @@ -38,6 +38,9 @@ # to inhibit the effect of the previous line on CFLAGS. @@ -428,8 +2182,8 @@ +MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug$(MAPSUFX) VERSION = optimized ---- hotspot/make/bsd/makefiles/product.make -+++ hotspot/make/bsd/makefiles/product.make +--- ./hotspot/make/bsd/makefiles/product.make Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/product.make Wed Nov 05 15:01:44 2014 -0800 @@ -38,7 +38,10 @@ # to inhibit the effect of the previous line on CFLAGS. @@ -442,8 +2196,8 @@ SYSDEFS += -DPRODUCT VERSION = optimized ---- hotspot/make/bsd/makefiles/rules.make -+++ hotspot/make/bsd/makefiles/rules.make +--- ./hotspot/make/bsd/makefiles/rules.make Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/rules.make Wed Nov 05 15:01:44 2014 -0800 @@ -34,7 +34,7 @@ CC_COMPILE = $(CC) $(CXXFLAGS) $(CFLAGS) CXX_COMPILE = $(CXX) $(CXXFLAGS) $(CFLAGS) @@ -453,22 +2207,8 @@ COMPILE.CC = $(CC_COMPILE) -c GENASM.CC = $(CC_COMPILE) -S ---- hotspot/src/cpu/x86/vm/globals_x86.hpp -+++ hotspot/src/cpu/x86/vm/globals_x86.hpp -@@ -70,11 +70,7 @@ - define_pd_global(bool, RewriteBytecodes, true); - define_pd_global(bool, RewriteFrequentPairs, true); - --#ifdef _ALLBSD_SOURCE --define_pd_global(bool, UseMembar, true); --#else - define_pd_global(bool, UseMembar, false); --#endif - - // GC Ergo Flags - define_pd_global(uintx, CMSYoungGenPerWorker, 64*M); // default max size of CMS young gen, per GC worker thread ---- hotspot/src/cpu/x86/vm/jni_x86.h -+++ hotspot/src/cpu/x86/vm/jni_x86.h +--- ./hotspot/src/cpu/x86/vm/jni_x86.h Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/src/cpu/x86/vm/jni_x86.h Wed Nov 05 15:01:44 2014 -0800 @@ -34,7 +34,7 @@ #ifndef __has_attribute #define __has_attribute(x) 0 @@ -478,34 +2218,8 @@ #define JNIEXPORT __attribute__((visibility("default"))) #define JNIIMPORT __attribute__((visibility("default"))) #else ---- hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp -+++ hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp -@@ -107,10 +107,6 @@ - return Address(rsp, Interpreter::expr_offset_in_bytes(2)); - } - --static inline Address at_tos_p3() { -- return Address(rsp, Interpreter::expr_offset_in_bytes(3)); --} -- - // Condition conversion - static Assembler::Condition j_not(TemplateTable::Condition cc) { - switch (cc) { ---- hotspot/src/cpu/x86/vm/x86_32.ad -+++ hotspot/src/cpu/x86/vm/x86_32.ad -@@ -1201,8 +1201,9 @@ - if( dst_second_rc == rc_int && src_second_rc == rc_stack ) - return impl_helper(cbuf,do_size,true ,ra_->reg2offset(src_second),dst_second,0x8B,"MOV ",size, st); - -- -+ assert(0," foo "); - Unimplemented(); -+ return 0; - } - - #ifndef PRODUCT ---- hotspot/src/os/bsd/vm/decoder_bsd.cpp -+++ hotspot/src/os/bsd/vm/decoder_bsd.cpp +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./hotspot/src/os/bsd/vm/decoder_bsd.cpp Wed Nov 05 15:01:44 2014 -0800 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. @@ -554,25 +2268,22 @@ + return false; +} +#endif ---- hotspot/src/os/bsd/vm/jsig.c -+++ hotspot/src/os/bsd/vm/jsig.c -@@ -140,9 +140,13 @@ +--- ./hotspot/src/os/bsd/vm/jsig.c Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/jsig.c Wed Nov 05 15:01:44 2014 -0800 +@@ -140,9 +140,8 @@ } sa_handler_t sigset(int sig, sa_handler_t disp) { -+#ifdef __FreeBSD__ -+ return set_signal(sig, disp, true); -+#else - printf("sigset() is not supported by BSD"); - exit(0); +- printf("sigset() is not supported by BSD"); +- exit(0); - } -+#endif ++ return set_signal(sig, disp, true); +} static int call_os_sigaction(int sig, const struct sigaction *act, struct sigaction *oact) { ---- hotspot/src/os/bsd/vm/jvm_bsd.cpp -+++ hotspot/src/os/bsd/vm/jvm_bsd.cpp +--- ./hotspot/src/os/bsd/vm/jvm_bsd.cpp Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/jvm_bsd.cpp Wed Nov 05 15:01:44 2014 -0800 @@ -50,6 +50,7 @@ case INTERRUPT_SIGNAL: case SIGFPE: @@ -682,8 +2393,8 @@ + jio_snprintf(buf, len, "SIG%s", signame); + return true; } ---- hotspot/src/os/bsd/vm/jvm_bsd.h -+++ hotspot/src/os/bsd/vm/jvm_bsd.h +--- ./hotspot/src/os/bsd/vm/jvm_bsd.h Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/jvm_bsd.h Wed Nov 05 15:01:44 2014 -0800 @@ -112,20 +112,6 @@ #define SHUTDOWN2_SIGNAL SIGINT #define SHUTDOWN3_SIGNAL SIGTERM @@ -705,8 +2416,8 @@ #endif /* JVM_MD_H */ #endif // OS_BSD_VM_JVM_BSD_H ---- hotspot/src/os/bsd/vm/osThread_bsd.cpp -+++ hotspot/src/os/bsd/vm/osThread_bsd.cpp +--- ./hotspot/src/os/bsd/vm/osThread_bsd.cpp Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/osThread_bsd.cpp Wed Nov 05 15:01:44 2014 -0800 @@ -30,7 +30,7 @@ void OSThread::pd_initialize() { @@ -716,8 +2427,8 @@ _thread_id = 0; #else _thread_id = NULL; ---- hotspot/src/os/bsd/vm/os_bsd.cpp -+++ hotspot/src/os/bsd/vm/os_bsd.cpp +--- ./hotspot/src/os/bsd/vm/os_bsd.cpp Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/os_bsd.cpp Wed Nov 05 15:01:44 2014 -0800 @@ -102,6 +102,16 @@ # include # include @@ -735,7 +2446,7 @@ #if defined(__FreeBSD__) || defined(__NetBSD__) # include #endif -@@ -161,6 +171,28 @@ +@@ -168,6 +178,27 @@ // available here means free julong os::Bsd::available_memory() { @@ -749,8 +2460,7 @@ + julong free_pages; + u_int i, npages; + -+ for (i = 0, free_pages = 0; i < sizeof(vm_stats) / sizeof(vm_stats[0]); i++) -+{ ++ for (i = 0, free_pages = 0; i < sizeof(vm_stats) / sizeof(vm_stats[0]); i++) { + size = sizeof(npages); + if (sysctlbyname(vm_stats[i], &npages, &size, NULL, 0) == -1) { + free_pages = 0; @@ -764,7 +2474,7 @@ uint64_t available = physical_memory() >> 2; #ifdef __APPLE__ mach_msg_type_number_t count = HOST_VM_INFO64_COUNT; -@@ -200,7 +232,7 @@ +@@ -207,7 +238,7 @@ static bool init = false; static bool privileges = false; if (!init) { @@ -773,48 +2483,29 @@ init = true; } return privileges; -@@ -240,6 +272,19 @@ - - - void os::Bsd::initialize_system_info() { -+#ifdef __FreeBSD__ -+ int cpu_val = sysconf(_SC_NPROCESSORS_CONF); -+ if (cpu_val >= 1) -+ set_processor_count(cpu_val); -+ else -+ set_processor_count(1); // fallback -+ -+ long phys_pages = sysconf(_SC_PHYS_PAGES); -+ if (phys_pages > 0) -+ _physical_memory = (julong)phys_pages * _page_size; -+ else -+ _physical_memory = 256*M; // fallback +@@ -410,12 +441,21 @@ + const char *v = ::getenv("LD_LIBRARY_PATH"); + const char *v_colon = ":"; + if (v == NULL) { v = ""; v_colon = ""; } ++#ifdef __APPLE__ + // That's +1 for the colon and +1 for the trailing '\0'. + char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, + strlen(v) + 1 + + sizeof(SYS_EXT_DIR) + sizeof("/lib/") + strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH) + 1, + mtInternal); + sprintf(ld_library_path, "%s%s" SYS_EXT_DIR "/lib/%s:" DEFAULT_LIBPATH, v, v_colon, cpu_arch); +#else - int mib[2]; - size_t len; - int cpu_val; -@@ -289,6 +334,7 @@ - _physical_memory = MIN2(_physical_memory, (julong)limits.rlim_cur); ++ // That's +1 for the colon and +1 for the trailing '\0'. ++ char *ld_library_path = (char *)NEW_C_HEAP_ARRAY(char, ++ strlen(v) + 1 + ++ sizeof(PACKAGE_PATH) + sizeof("/lib") + 1, ++ mtInternal); ++ sprintf(ld_library_path, "%s%s" PACKAGE_PATH "/lib", v, v_colon); ++#endif + Arguments::set_library_path(ld_library_path); + FREE_C_HEAP_ARRAY(char, ld_library_path, mtInternal); } - #endif -+#endif - } - - #ifdef __APPLE__ -@@ -434,8 +480,12 @@ - #else - ld_library_path = (char *) malloc(sizeof(REG_DIR) + sizeof("/lib/") + - strlen(cpu_arch) + sizeof(DEFAULT_LIBPATH)); -+#ifdef __FreeBSD__ -+ sprintf(ld_library_path, DEFAULT_LIBPATH ":" PACKAGE_PATH "/lib"); -+#else - sprintf(ld_library_path, REG_DIR "/lib/%s:" DEFAULT_LIBPATH, cpu_arch); - #endif -+#endif - - /* - * Get the user setting of LD_LIBRARY_PATH, and prepended it. It -@@ -1148,7 +1198,13 @@ +@@ -1197,7 +1237,13 @@ return retval; #elif __FreeBSD__ @@ -829,7 +2520,7 @@ #elif __OpenBSD__ retval = syscall(SYS_getthrid); #elif __NetBSD__ -@@ -1158,11 +1214,14 @@ +@@ -1207,11 +1253,14 @@ if (retval == -1) { return getpid(); } @@ -845,32 +2536,7 @@ #else return (intx)::pthread_self(); #endif -@@ -1562,24 +1621,6 @@ - return dlsym(handle, name); - } - -- --static bool _print_ascii_file(const char* filename, outputStream* st) { -- int fd = ::open(filename, O_RDONLY); -- if (fd == -1) { -- return false; -- } -- -- char buf[32]; -- int bytes; -- while ((bytes = ::read(fd, buf, sizeof(buf))) > 0) { -- st->print_raw(buf, bytes); -- } -- -- ::close(fd); -- -- return true; --} -- - void os::print_dll_info(outputStream *st) { - st->print_cr("Dynamic libraries:"); - #ifdef RTLD_DI_LINKMAP -@@ -1629,14 +1670,14 @@ +@@ -1689,14 +1738,14 @@ } void os::print_os_info_brief(outputStream* st) { @@ -887,7 +2553,7 @@ os::Posix::print_uname_info(st); -@@ -1649,6 +1690,29 @@ +@@ -1709,6 +1758,29 @@ // Nothing to do for now. } @@ -917,7 +2583,7 @@ void os::print_memory_info(outputStream* st) { st->print("Memory:"); -@@ -1658,11 +1722,14 @@ +@@ -1718,11 +1790,14 @@ os::physical_memory() >> 10); st->print("(" UINT64_FORMAT "k free)", os::available_memory() >> 10); @@ -937,25 +2603,7 @@ st->cr(); } -@@ -1675,7 +1742,7 @@ - - const char *fpe_names[] = { "FPE0", "FPE_INTDIV", "FPE_INTOVF", "FPE_FLTDIV", - "FPE_FLTOVF", "FPE_FLTUND", "FPE_FLTRES", -- "FPE_FLTINV", "FPE_FLTSUB", "FPE_FLTDEN" }; -+ "FPE_FLTINV", "FPE_FLTSUB" }; - - const char *segv_names[] = { "SEGV0", "SEGV_MAPERR", "SEGV_ACCERR" }; - -@@ -1701,7 +1768,7 @@ - st->print(", si_addr=" PTR_FORMAT, si->si_addr); - break; - case SIGFPE: -- st->print(", si_code=%d (%s)", c, c > 9 ? "" : fpe_names[c]); -+ st->print(", si_code=%d (%s)", c, c > 8 ? "" : fpe_names[c]); - st->print(", si_addr=" PTR_FORMAT, si->si_addr); - break; - case SIGSEGV: -@@ -1943,7 +2010,7 @@ +@@ -1958,7 +2033,7 @@ os_semaphore_t _semaphore; }; @@ -964,7 +2612,7 @@ SEM_INIT(_semaphore, 0); } -@@ -2128,7 +2195,7 @@ +@@ -2146,7 +2221,7 @@ if (::write(fd, "", 1) == 1) { mmap(base, size, PROT_READ|PROT_WRITE|PROT_EXEC, @@ -973,7 +2621,7 @@ } } ::close(fd); -@@ -2238,7 +2305,7 @@ +@@ -2256,7 +2331,7 @@ return ::mprotect(addr, size, PROT_NONE) == 0; #else uintptr_t res = (uintptr_t) ::mmap(addr, size, PROT_NONE, @@ -982,7 +2630,7 @@ return res != (uintptr_t) MAP_FAILED; #endif } -@@ -2265,7 +2332,7 @@ +@@ -2283,7 +2358,7 @@ char * addr; int flags; @@ -991,7 +2639,7 @@ if (fixed) { assert((uintptr_t)requested_addr % os::Bsd::page_size() == 0, "unaligned address"); flags |= MAP_FIXED; -@@ -2743,6 +2810,7 @@ +@@ -2770,6 +2845,7 @@ return OS_OK; #elif defined(__FreeBSD__) int ret = pthread_setprio(thread->osthread()->pthread_id(), newpri); @@ -999,7 +2647,7 @@ #elif defined(__APPLE__) || defined(__NetBSD__) struct sched_param sp; int policy; -@@ -3340,18 +3408,6 @@ +@@ -3364,18 +3440,6 @@ } } @@ -1018,7 +2666,7 @@ static const char* get_signal_handler_name(address handler, char* buf, int buflen) { int offset; -@@ -3375,9 +3431,6 @@ +@@ -3399,9 +3463,6 @@ sigaction(sig, NULL, &sa); @@ -1028,7 +2676,7 @@ st->print("%s: ", os::exception_name(sig, buf, buflen)); address handler = (sa.sa_flags & SA_SIGINFO) -@@ -3398,7 +3451,7 @@ +@@ -3423,7 +3484,7 @@ // May be, handler was resetted by VMError? if(rh != NULL) { handler = rh; @@ -1036,8 +2684,8 @@ + sa.sa_flags = VMError::get_resetted_sigflags(sig); } - st->print(", sa_flags=" PTR32_FORMAT, sa.sa_flags); -@@ -3473,8 +3526,6 @@ + st->print(", sa_flags="); +@@ -3499,8 +3560,6 @@ os_sigaction(sig, (struct sigaction*)NULL, &act); @@ -1046,7 +2694,7 @@ address thisHandler = (act.sa_flags & SA_SIGINFO) ? CAST_FROM_FN_PTR(address, act.sa_sigaction) : CAST_FROM_FN_PTR(address, act.sa_handler) ; -@@ -3534,6 +3585,14 @@ +@@ -3560,6 +3619,14 @@ extern bool signal_name(int signo, char* buf, size_t len); @@ -1061,7 +2709,7 @@ const char* os::exception_name(int exception_code, char* buf, size_t size) { if (0 < exception_code && exception_code <= SIGRTMAX) { // signal -@@ -3733,6 +3792,19 @@ +@@ -3759,6 +3826,19 @@ }; int os::active_processor_count() { @@ -1081,7 +2729,7 @@ return _processor_count; } -@@ -3943,7 +4015,10 @@ +@@ -3970,7 +4050,10 @@ } int fd; int o_delete = (oflag & O_DELETE); @@ -1093,7 +2741,7 @@ fd = ::open(path, oflag, mode); if (fd == -1) return -1; -@@ -3988,7 +4063,7 @@ +@@ -4015,7 +4098,7 @@ * 4843136: (process) pipe file descriptor from Runtime.exec not being closed * 6339493: (process) Runtime.exec does not close all file descriptors on Solaris 9 */ @@ -1102,8 +2750,8 @@ { int flags = ::fcntl(fd, F_GETFD); if (flags != -1) ---- hotspot/src/os/bsd/vm/vmError_bsd.cpp -+++ hotspot/src/os/bsd/vm/vmError_bsd.cpp +--- ./hotspot/src/os/bsd/vm/vmError_bsd.cpp Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/src/os/bsd/vm/vmError_bsd.cpp Wed Nov 05 15:01:44 2014 -0800 @@ -44,7 +44,7 @@ jio_snprintf(p, buflen - len, "\n\n" @@ -1122,50 +2770,9 @@ os::current_process_id(), os::current_process_id()); os::fork_and_exec(buf); ---- hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp -+++ hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp -@@ -42,7 +42,6 @@ - #endif // AMD64 - - define_pd_global(intx, CompilerThreadStackSize, 0); --define_pd_global(uintx, SurvivorRatio, 8); - - define_pd_global(uintx, JVMInvokeMethodSlack, 8192); - ---- hotspot/src/share/vm/code/relocInfo.hpp -+++ hotspot/src/share/vm/code/relocInfo.hpp -@@ -364,7 +364,7 @@ - // "immediate" in the prefix header word itself. This optimization - // is invisible outside this module.) - -- inline friend relocInfo prefix_relocInfo(int datalen = 0); -+ inline friend relocInfo prefix_relocInfo(int datalen); - - protected: - // an immediate relocInfo optimizes a prefix with one 10-bit unsigned value -@@ -459,7 +459,7 @@ - return relocInfo(relocInfo::none, relocInfo::offset_limit() - relocInfo::offset_unit); - } - --inline relocInfo prefix_relocInfo(int datalen) { -+inline relocInfo prefix_relocInfo(int datalen = 0) { - assert(relocInfo::fits_into_immediate(datalen), "datalen in limits"); - return relocInfo(relocInfo::data_prefix_tag, relocInfo::RAW_BITS, relocInfo::datalen_tag | datalen); - } ---- hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp -+++ hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp -@@ -110,7 +110,7 @@ - if (e.should_commit()) { - e.set_gcId(_shared_gc_info.id()); - e.set_data(to_trace_struct(pf_info)); -- e.set_thread(pf_info.thread()->thread_id()); -+ e.set_thread((uintptr_t) pf_info.thread()->thread_id()); - e.commit(); - } - } ---- hotspot/src/share/vm/opto/node.cpp -+++ hotspot/src/share/vm/opto/node.cpp -@@ -285,6 +285,10 @@ +--- ./hotspot/src/share/vm/opto/node.cpp Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/src/share/vm/opto/node.cpp Wed Nov 05 15:01:44 2014 -0800 +@@ -286,6 +286,10 @@ #ifdef _MSC_VER // the IDX_INIT hack falls foul of warning C4355 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list #endif @@ -1176,7 +2783,7 @@ // Out-of-line code from node constructors. // Executed only when extra debug info. is being passed around. -@@ -468,6 +472,10 @@ +@@ -469,6 +473,10 @@ _in[6] = n6; if (n6 != NULL) n6->add_out((Node *)this); } @@ -1187,45 +2794,8 @@ //------------------------------clone------------------------------------------ // Clone a Node. ---- hotspot/src/share/vm/prims/jvmtiTagMap.cpp -+++ hotspot/src/share/vm/prims/jvmtiTagMap.cpp -@@ -2790,6 +2790,7 @@ - return true; - } - -+#ifdef ASSERT - // verify that a static oop field is in range - static inline bool verify_static_oop(InstanceKlass* ik, - oop mirror, int offset) { -@@ -2804,6 +2805,7 @@ - return false; - } - } -+#endif // #ifdef ASSERT - - // a class references its super class, interfaces, class loader, ... - // and finally its static fields ---- hotspot/src/share/vm/runtime/mutex.cpp -+++ hotspot/src/share/vm/runtime/mutex.cpp -@@ -280,16 +280,6 @@ - return x & 0x7FFFFFFF ; - } - --static inline jint MarsagliaXOR (jint * const a) { -- jint x = *a ; -- if (x == 0) x = UNS(a)|1 ; -- x ^= x << 6; -- x ^= ((unsigned)x) >> 21; -- x ^= x << 7 ; -- *a = x ; -- return x & 0x7FFFFFFF ; --} -- - static int Stall (int its) { - static volatile jint rv = 1 ; - volatile int OnFrame = 0 ; ---- hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp -+++ hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp +--- ./hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/src/share/vm/utilities/globalDefinitions_gcc.hpp Wed Nov 05 15:01:44 2014 -0800 @@ -261,7 +261,7 @@ #endif @@ -1235,19 +2805,40 @@ #define CAN_USE_NAN_DEFINE 1 #endif ---- jdk/make/CompileDemos.gmk -+++ jdk/make/CompileDemos.gmk -@@ -313,7 +313,7 @@ - $(eval $(call SetupJVMTIDemo,heapViewer, agent_util)) +--- ./jaxp/.hgtags Mon Sep 08 12:36:00 2014 -0700 ++++ ./jaxp/.hgtags Wed Sep 17 11:56:44 2014 -0700 +@@ -331,3 +331,4 @@ + 90f3b8b970a8bb3173083111248372afdc61652d jdk8u25-b14 + f5ac2e242bb95be0a3deddf37362178202086137 jdk8u25-b15 + df68b132a471ed1e825a79bd1d8acb47d2bcc04f jdk8u25-b16 ++7a721e57b38ff6c1d34af0b86f6482540a815d90 jdk8u25-b17 +--- ./jaxws/.hgtags Mon Sep 08 12:36:09 2014 -0700 ++++ ./jaxws/.hgtags Wed Sep 17 11:56:51 2014 -0700 +@@ -329,3 +329,4 @@ + 392a9579cc95d27806c1dde16eee776524a49761 jdk8u25-b14 + d3a96bbb88521188a3af1a34dd9523f13afa521d jdk8u25-b15 + 4570a7d00aa9bd3df028f52d6f9d8c434163b689 jdk8u25-b16 ++d47a47f961ee423ce03623098f62d79254c6f328 jdk8u25-b17 +--- ./jdk/.hgtags Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/.hgtags Wed Nov 05 12:14:24 2014 -0800 +@@ -332,3 +332,4 @@ + 0000000000000000000000000000000000000000 jdk8u25-b16 + 0000000000000000000000000000000000000000 jdk8u25-b16 + d067890f970f3a712f870f6311d20f3359b6eaf0 jdk8u25-b16 ++67b22a82345bfa1ae1492679bdf3c4d54f4eacde jdk8u25-b17 +--- ./jdk/make/CompileDemos.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/CompileDemos.gmk Wed Nov 05 12:14:24 2014 -0800 +@@ -323,7 +323,7 @@ $(eval $(call SetupJVMTIDemo,hprof, java_crw_demo, \ - -I$(JDK_TOPDIR)/src/share/npt -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt, C, \ -- -ldl, ws2_32.lib winmm.lib, -lsocket -lnsl, -lpthread)) -+ $(LIBDL), ws2_32.lib winmm.lib, -lsocket -lnsl, -lpthread)) + -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))) ++ $(LIBDL), ws2_32.lib winmm.lib, -lsocket -lnsl, -lpthread, $(BUILD_LIBHPROF_AIX_EXTRA_SRC))) $(eval $(call SetupJVMTIDemo,minst, agent_util java_crw_demo)) $(eval $(call SetupJVMTIDemo,mtrace, agent_util java_crw_demo)) ---- jdk/make/CompileJavaClasses.gmk -+++ jdk/make/CompileJavaClasses.gmk +--- ./jdk/make/CompileJavaClasses.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/CompileJavaClasses.gmk Wed Nov 05 12:14:24 2014 -0800 @@ -125,23 +125,32 @@ sun/nio/fs/LinuxFileStore.java \ sun/nio/fs/LinuxFileSystem.java \ @@ -1285,19 +2876,19 @@ sun/tools/attach/BsdAttachProvider.java \ sun/tools/attach/BsdVirtualMachine.java endif -@@ -217,9 +226,9 @@ +@@ -228,9 +237,9 @@ # Exclude another implicitly not included file. EXFILES += sun/util/locale/AsciiUtil.java --ifeq (, $(filter $(OPENJDK_TARGET_OS), solaris macosx)) -+ifeq (, $(filter $(OPENJDK_TARGET_OS), solaris bsd macosx)) +-ifeq (, $(filter $(OPENJDK_TARGET_OS), solaris macosx aix)) ++ifeq (, $(filter $(OPENJDK_TARGET_OS), solaris bsd macosx aix)) # -- # only solaris and macosx -+ # only solaris and BSD +- # only solaris, macosx and aix ++ # only solaris, BSD, macosx and aix # EXFILES += sun/nio/fs/PollingWatchService.java endif -@@ -259,21 +268,26 @@ +@@ -270,21 +279,26 @@ $(JDK_TOPDIR)/src/closed/$(OPENJDK_TARGET_OS_API_DIR)/classes endif @@ -1331,16 +2922,15 @@ endif # The security classes should not end up in the classes directory as that will prevent them -@@ -312,7 +326,7 @@ - SETUP:=GENERATE_JDKBYTECODE,\ +@@ -334,6 +348,7 @@ SRC:=$(JDK_TOPDIR)/src/share/classes \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes \ -- $(MACOSX_SRC_DIRS) \ + $(MACOSX_SRC_DIRS) \ + $(BSD_SRC_DIRS) \ + $(AIX_SRC_DIRS) \ $(JDK_OUTPUTDIR)/gensrc \ $(JDK_OUTPUTDIR)/gensrc_no_srczip \ - $(CLOSED_SRC_DIRS),\ -@@ -331,7 +345,7 @@ +@@ -353,7 +368,7 @@ SETUP := GENERATE_JDKBYTECODE, \ SRC := $(JDK_TOPDIR)/src/share/classes \ $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes \ @@ -1349,8 +2939,8 @@ $(CLOSED_SRC_DIRS), \ INCLUDES := $(SECURITY_PKGS), \ EXCLUDES := $(EXCLUDES), \ ---- jdk/make/CompileLaunchers.gmk -+++ jdk/make/CompileLaunchers.gmk +--- ./jdk/make/CompileLaunchers.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/CompileLaunchers.gmk Wed Nov 05 12:14:24 2014 -0800 @@ -49,7 +49,7 @@ ORIGIN_ROOT := /.. endif @@ -1382,7 +2972,7 @@ ifeq ($(OPENJDK_TARGET_OS), macosx) $1_PLIST_FILE := Info-cmdline.plist ifneq ($(11), ) -@@ -147,9 +153,11 @@ +@@ -162,9 +168,11 @@ -DLIBARCHNAME='"$(OPENJDK_TARGET_CPU_LEGACY)"' \ -DLAUNCHER_NAME='"$(LAUNCHER_NAME)"' \ -DPROGNAME='"$1"' $(DPACKAGEPATH) \ @@ -1394,24 +2984,24 @@ LDFLAGS := $(LDFLAGS_JDKEXE) \ $(ORIGIN_ARG) \ $$($1_LDFLAGS), \ -@@ -180,7 +188,7 @@ +@@ -195,7 +203,7 @@ BUILD_LAUNCHERS += $$(BUILD_LAUNCHER_$1) -- ifeq ($(OPENJDK_TARGET_OS), macosx) -+ ifneq ($(findstring $(OPENJDK_TARGET_OS), bsd macosx), ) +- ifneq (,$(filter $(OPENJDK_TARGET_OS), macosx aix)) ++ ifneq (,$(filter $(OPENJDK_TARGET_OS), bsd macosx aix)) $$(BUILD_LAUNCHER_$1): $(JDK_OUTPUTDIR)/objs/libjli_static.a endif -@@ -456,6 +464,7 @@ +@@ -481,6 +489,7 @@ CFLAGS_release := -DPRODUCT, \ CFLAGS_linux := -fPIC, \ CFLAGS_solaris := -KPIC, \ + CFLAGS_bsd := -fPIC, \ CFLAGS_macosx := -fPIC, \ - MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libunpack/mapfile-vers-unpack200, \ + MAPFILE := $(UNPACK_MAPFILE),\ LDFLAGS := $(UNPACKEXE_ZIPOBJS), \ -@@ -518,7 +527,7 @@ +@@ -543,7 +552,7 @@ endif endif @@ -1420,7 +3010,7 @@ BUILD_JEXEC := 1 endif # OPENJDK_TARGET_OS -@@ -554,6 +563,7 @@ +@@ -579,6 +588,7 @@ $(BUILD_JEXEC_INC), \ CFLAGS_linux := -fPIC, \ CFLAGS_solaris := -KPIC, \ @@ -1428,7 +3018,7 @@ LDFLAGS := $(LDFLAGS_JDKEXE) \ $(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)$(SHARED_LIBRARY_SUFFIX)), \ OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/jexec_obj, \ -@@ -570,10 +580,7 @@ +@@ -595,10 +605,7 @@ # The java-rmi.cgi script in bin/ only gets delivered in certain situations # JAVA_RMI_CGI := $(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/java-rmi.cgi @@ -1440,17 +3030,17 @@ BUILD_LAUNCHERS += $(JAVA_RMI_CGI) endif -@@ -601,7 +608,7 @@ +@@ -626,7 +633,7 @@ LINK_JSPAWNHELPER_OBJECTS := $(JDK_OUTPUTDIR)/objs/libjava/childproc.o LINK_JSPAWNHELPER_FLAGS := --ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx solaris), ) -+ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx solaris bsd), ) +-ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx solaris aix), ) ++ifneq ($(findstring $(OPENJDK_TARGET_OS), bsd macosx solaris aix), ) BUILD_JSPAWNHELPER := 1 endif ---- jdk/make/CopyFiles.gmk -+++ jdk/make/CopyFiles.gmk +--- ./jdk/make/CopyFiles.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/CopyFiles.gmk Wed Nov 05 12:14:24 2014 -0800 @@ -29,6 +29,8 @@ ifeq ($(OPENJDK_TARGET_OS), windows) @@ -1493,8 +3083,8 @@ endif endif endif ---- jdk/make/Images.gmk -+++ jdk/make/Images.gmk +--- ./jdk/make/Images.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/Images.gmk Wed Nov 05 12:14:24 2014 -0800 @@ -234,11 +234,11 @@ endif @@ -1532,7 +3122,7 @@ $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja - endif -- + - ifeq ($(OPENJDK_TARGET_OS), macosx) - $(JRE_IMAGE_DIR)/man/ja: - $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) @@ -1542,7 +3132,7 @@ - $(ECHO) $(LOG_INFO) Creating $(patsubst $(OUTPUT_ROOT)/%,%,$@) - $(CD) $(@D) && $(RM) ja && $(LN) -s ja_JP.UTF-8 ja - endif - +- - ifeq ($(OPENJDK_TARGET_OS), linux) JRE_MAN_PAGE_LIST = $(addprefix $(JRE_IMAGE_DIR)/man/man1/, $(JRE_MAN_PAGES)) \ $(addprefix $(JRE_IMAGE_DIR)/man/ja_JP.UTF-8/man1/, $(JRE_MAN_PAGES)) \ @@ -1564,8 +3154,8 @@ endif # Windows ################################################################################ ---- jdk/make/data/classlist/classlist.bsd -+++ jdk/make/data/classlist/classlist.bsd +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/data/classlist/classlist.bsd Wed Nov 05 12:14:24 2014 -0800 @@ -0,0 +1,2803 @@ +com/sun/java/swing/SwingUtilities3 +com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI @@ -4370,10 +5960,10 @@ +sun/util/resources/en/TimeZoneNames_en +sun/util/spi/CalendarProvider +# ca392e7ee7285d72 ---- jdk/make/gendata/GendataFontConfig.gmk -+++ jdk/make/gendata/GendataFontConfig.gmk -@@ -66,6 +66,13 @@ - GENDATA_FONT_CONFIG_SRC_PREFIX := macosx. +--- ./jdk/make/gendata/GendataFontConfig.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/gendata/GendataFontConfig.gmk Wed Nov 05 12:14:24 2014 -0800 +@@ -73,6 +73,13 @@ + GENDATA_FONT_CONFIG_SRC_PREFIX := aix. endif +ifeq ($(OPENJDK_TARGET_OS), bsd) @@ -4386,8 +5976,8 @@ ### $(GENDATA_FONT_CONFIG_DST)/%.src: \ ---- jdk/make/gensrc/GensrcMisc.gmk -+++ jdk/make/gensrc/GensrcMisc.gmk +--- ./jdk/make/gensrc/GensrcMisc.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/gensrc/GensrcMisc.gmk Wed Nov 05 12:14:24 2014 -0800 @@ -64,9 +64,6 @@ ifeq ($(OPENJDK_TARGET_OS_API), posix) @@ -4398,26 +5988,26 @@ # UNIXProcess.java is different for solaris and linux. We need to copy # the correct UNIXProcess.java over to $(JDK_OUTPUTDIR)/gensrc/java/lang/. ---- jdk/make/lib/Awt2dLibraries.gmk -+++ jdk/make/lib/Awt2dLibraries.gmk -@@ -305,7 +305,7 @@ +--- ./jdk/make/lib/Awt2dLibraries.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/lib/Awt2dLibraries.gmk Wed Nov 05 12:14:24 2014 -0800 +@@ -309,7 +309,7 @@ debug_trace.c \ debug_util.c --ifneq (, $(filter $(OPENJDK_TARGET_OS), solaris linux)) -+ifneq (, $(filter $(OPENJDK_TARGET_OS), solaris linux bsd)) +-ifneq (, $(filter $(OPENJDK_TARGET_OS), solaris linux aix)) ++ifneq (, $(filter $(OPENJDK_TARGET_OS), bsd solaris linux aix)) LIBAWT_FILES += awt_LoadLibrary.c initIDs.c img_colors.c endif -@@ -473,6 +473,7 @@ - LDFLAGS_solaris := -R/usr/dt/lib$(OPENJDK_TARGET_CPU_ISADIR) -R$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR), \ +@@ -482,6 +482,7 @@ LDFLAGS_SUFFIX_linux := -ljvm $(LIBM) $(LIBDL) -ljava, \ LDFLAGS_SUFFIX_solaris := -ljvm $(LIBM) $(LIBDL) -ljava -lc, \ + LDFLAGS_SUFFIX_aix :=-ljvm $(LIBM) $(LIBDL) -ljava -lm,\ + LDFLAGS_SUFFIX_bsd := -ljvm $(LIBM) -ljava, \ LDFLAGS_SUFFIX_macosx := -lmlib_image -ljvm $(LIBM) \ -framework Cocoa \ -framework OpenGL \ -@@ -550,6 +551,16 @@ +@@ -559,6 +560,16 @@ endif endif @@ -4434,7 +6024,7 @@ ifeq ($(MILESTONE), internal) LIBAWT_XAWT_CFLAGS += -DINTERNAL_BUILD endif -@@ -619,6 +630,11 @@ +@@ -628,6 +639,11 @@ LIBAWT_XAWT_LDFLAGS += -lpthread endif @@ -4446,23 +6036,23 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_XAWT, \ LIBRARY := awt_xawt, \ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ -@@ -681,6 +697,7 @@ - LDFLAGS_SUFFIX_solaris := -lawt -ljava -ljvm -lc, \ +@@ -691,6 +707,7 @@ LDFLAGS_SUFFIX_macosx := $(LIBM) -lawt -ljava -ljvm, \ LDFLAGS_SUFFIX_linux := -lm -lawt -ljava -ljvm, \ + LDFLAGS_SUFFIX_aix := -lm -lawt -ljava -ljvm,\ + LDFLAGS_SUFFIX_bsd := -lm -lawt -ljava -ljvm, \ VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ RC_FLAGS := $(RC_FLAGS) \ -D "JDK_FNAME=lcms.dll" \ -@@ -819,6 +836,7 @@ - LDFLAGS_SUFFIX := $(BUILD_LIBFONTMANAGER_FONTLIB), \ +@@ -830,6 +847,7 @@ LDFLAGS_SUFFIX_linux := -lawt $(LIBM) $(LIBCXX) -ljava -ljvm -lc, \ LDFLAGS_SUFFIX_solaris := -lawt -lawt_xawt -lc $(LIBM) $(LIBCXX) -ljava -ljvm, \ + LDFLAGS_SUFFIX_aix := -lawt -lawt_xawt $(LIBM) $(LIBCXX) -ljava -ljvm,\ + LDFLAGS_SUFFIX_bsd := -lawt $(LIBM) $(LIBCXX) -ljava -ljvm -lc, \ LDFLAGS_SUFFIX_macosx := -lawt $(LIBM) $(LIBCXX) -undefined dynamic_lookup \ -ljava -ljvm, \ LDFLAGS_SUFFIX_windows := $(WIN_JAVA_LIB) advapi32.lib user32.lib gdi32.lib \ -@@ -962,6 +980,7 @@ +@@ -973,6 +991,7 @@ OPTIMIZATION := LOW, \ CFLAGS := $(CFLAGS_JDKLIB), \ CFLAGS_linux := $(HEADLESS_CFLAG), \ @@ -4470,34 +6060,43 @@ CFLAGS_macosx := -I$(JDK_TOPDIR)/src/solaris/native/sun/awt, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjawt/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ -@@ -969,6 +988,7 @@ - LDFLAGS_solaris := -L$(OPENWIN_HOME)/sfw/lib$(OPENJDK_TARGET_CPU_ISADIR) -L$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR), \ +@@ -981,6 +1000,7 @@ LDFLAGS_SUFFIX_linux := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX), \ + LDFLAGS_SUFFIX_aix := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX),\ LDFLAGS_SUFFIX_solaris := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX) -lXrender, \ + LDFLAGS_SUFFIX_bsd := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX), \ LDFLAGS_SUFFIX_macosx := -Xlinker -rpath -Xlinker @loader_path $(JAWT_LIBS) \ -framework Cocoa $(LDFLAGS_JDKLIB_SUFFIX), \ OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libjawt, \ -@@ -1169,6 +1189,7 @@ - REORDER := $(LIBAWT_HEADLESS_REORDER), \ +@@ -1182,6 +1202,7 @@ LDFLAGS_SUFFIX_linux := -ljvm -lawt -lm $(LIBDL) -ljava, \ + LDFLAGS_SUFFIX_aix := -ljvm -lawt -ljava,\ LDFLAGS_SUFFIX_solaris := $(LIBDL) -ljvm -lawt -lm -ljava $(LIBCXX) -lc, \ + LDFLAGS_SUFFIX_bsd := -ljvm -lawt -lm -ljava, \ OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libawt_headless, \ DEBUG_SYMBOLS := $(DEBUG_ALL_BINARIES))) -@@ -1245,6 +1266,8 @@ +@@ -1235,6 +1256,8 @@ + LIBSPLASHSCREEN_CFLAGS += -DWITH_WIN32 + else ifeq ($(OPENJDK_TARGET_OS), solaris) + LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 -I$(OPENWIN_HOME)/include -I$(OPENWIN_HOME)/include/X11/extensions ++ else ifeq ($(OPENJDK_TARGET_OS), bsd) ++ LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 $(X_CFLAGS) -DLIBICONV_PLUG + else + LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 $(X_CFLAGS) + endif +@@ -1258,6 +1281,8 @@ else ifeq ($(OPENJDK_TARGET_OS), solaris) # Solaris still uses OPENWIN_LIB .. LIBSPLASHSCREEN_LDFLAGS_SUFFIX += -L$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR) -lX11 -lXext $(LIBM) -lpthread + else ifeq ($(OPENJDK_TARGET_OS), bsd) -+ LIBSPLASHSCREEN_LDFLAGS_SUFFIX += $(X_LIBS) -lX11 -lXext $(LIBM) -liconv -pthread ++ LIBSPLASHSCREEN_LDFLAGS_SUFFIX += $(X_LIBS) -lX11 -lXext $(LIBM) -pthread else # .. all other Unixes can use X_LIBS LIBSPLASHSCREEN_LDFLAGS_SUFFIX += $(X_LIBS) -lX11 -lXext $(LIBM) -lpthread endif ---- jdk/make/lib/CoreLibraries.gmk -+++ jdk/make/lib/CoreLibraries.gmk -@@ -81,7 +81,7 @@ +--- ./jdk/make/lib/CoreLibraries.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/lib/CoreLibraries.gmk Wed Nov 05 12:14:24 2014 -0800 +@@ -82,7 +82,7 @@ endif LIBVERIFY_OPTIMIZATION := HIGH @@ -4506,23 +6105,23 @@ ifeq ($(ENABLE_DEBUG_SYMBOLS), true) LIBVERIFY_OPTIMIZATION := LOW endif -@@ -198,6 +198,7 @@ - LDFLAGS_SUFFIX_posix := -ljvm -lverify, \ +@@ -200,6 +200,7 @@ LDFLAGS_SUFFIX_solaris := -lsocket -lnsl -lscf $(LIBDL) $(BUILD_LIBFDLIBM) -lc, \ LDFLAGS_SUFFIX_linux := $(LIBDL) $(BUILD_LIBFDLIBM), \ + LDFLAGS_SUFFIX_aix := $(LIBDL) $(BUILD_LIBFDLIBM) -lm,\ + LDFLAGS_SUFFIX_bsd := $(BUILD_LIBFDLIBM), \ LDFLAGS_SUFFIX_macosx := -L$(JDK_OUTPUTDIR)/objs/ -lfdlibm \ -framework CoreFoundation \ -framework Foundation \ -@@ -266,6 +267,7 @@ - $(WIN_JAVA_LIB), \ +@@ -269,6 +270,7 @@ LDFLAGS_SUFFIX_linux := -ljvm -ljava $(LIBZ), \ LDFLAGS_SUFFIX_solaris := -ljvm -ljava $(LIBZ) -lc, \ + LDFLAGS_SUFFIX_aix := -ljvm -ljava $(LIBZ),\ + LDFLAGS_SUFFIX_bsd := -ljvm -ljava $(LIBZ), \ LDFLAGS_SUFFIX_macosx := $(LIBZ) -ljava -ljvm, \ VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ RC_FLAGS := $(RC_FLAGS) \ -@@ -376,7 +378,7 @@ +@@ -379,7 +381,7 @@ # Append defines depending on target platform LIBJLI_CFLAGS += $(OPENJDK_TARGET_CPU_JLI_CFLAGS) @@ -4531,7 +6130,7 @@ LIBJLI_CFLAGS += -DPACKAGE_PATH=\"$(PACKAGE_PATH)\" endif -@@ -411,10 +413,12 @@ +@@ -414,11 +416,13 @@ $(call SET_SHARED_LIBRARY_ORIGIN), \ LDFLAGS_linux := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \ LDFLAGS_solaris := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \ @@ -4539,12 +6138,13 @@ LDFLAGS_macosx := -framework Cocoa -framework Security -framework ApplicationServices, \ LDFLAGS_SUFFIX_solaris := $(LIBZ) $(LIBDL) -lc, \ LDFLAGS_SUFFIX_linux := $(LIBZ) $(LIBDL) -lc -lpthread, \ + LDFLAGS_SUFFIX_aix := $(LIBZ) $(LIBDL),\ LDFLAGS_SUFFIX_macosx := $(LIBZ), \ + LDFLAGS_SUFFIX_bsd := $(LIBZ) -pthread, \ LDFLAGS_SUFFIX_windows := \ -export:JLI_Launch \ -export:JLI_ManifestIterate \ -@@ -458,9 +462,9 @@ +@@ -462,9 +466,9 @@ BUILD_LIBRARIES += $(BUILD_LIBJLI_STATIC) @@ -4556,16 +6156,20 @@ # code it here...rather than add support to NativeCompilation # as this is first time I see it $(eval $(call SetupNativeCompilation,BUILD_LIBJLI_STATIC, \ -@@ -495,6 +499,7 @@ +@@ -512,9 +516,11 @@ + CFLAGS := $(CFLAGS_JDKLIB) \ + -I$(JDK_TOPDIR)/src/share/npt \ + -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt, \ ++ CFLAGS_bsd := -DLIBICONV_PLUG, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libnpt/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ -+ LDFLAGS_bsd := -liconv, \ ++ LDFLAGS_bsd := , \ LDFLAGS_macosx := -liconv, \ LDFLAGS_SUFFIX_windows := -export:nptInitialize -export:nptTerminate, \ LDFLAGS_SUFFIX_solaris := -lc, \ ---- jdk/make/lib/NetworkingLibraries.gmk -+++ jdk/make/lib/NetworkingLibraries.gmk +--- ./jdk/make/lib/NetworkingLibraries.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/lib/NetworkingLibraries.gmk Wed Nov 05 12:14:24 2014 -0800 @@ -42,7 +42,7 @@ LIBNET_EXCLUDE_FILES += linux_close.c endif @@ -4575,17 +6179,17 @@ LIBNET_EXCLUDE_FILES += bsd_close.c endif -@@ -69,6 +69,7 @@ - LDFLAGS_SUFFIX_macosx := -ljvm -ljava, \ +@@ -74,6 +74,7 @@ LDFLAGS_SUFFIX_solaris := -ljvm -ljava -lnsl -lsocket $(LIBDL) -lc, \ LDFLAGS_SUFFIX_linux := $(LIBDL) -ljvm -lpthread -ljava, \ + LDFLAGS_SUFFIX_aix := $(LIBDL) -ljvm -ljava,\ + LDFLAGS_SUFFIX_bsd := -ljvm -pthread -ljava, \ LDFLAGS_SUFFIX_windows := ws2_32.lib jvm.lib secur32.lib iphlpapi.lib \ delayimp.lib $(WIN_JAVA_LIB) advapi32.lib \ -DELAYLOAD:secur32.dll -DELAYLOAD:iphlpapi.dll, \ ---- jdk/make/lib/NioLibraries.gmk -+++ jdk/make/lib/NioLibraries.gmk -@@ -77,9 +77,26 @@ +--- ./jdk/make/lib/NioLibraries.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/lib/NioLibraries.gmk Wed Nov 05 12:14:24 2014 -0800 +@@ -77,9 +77,27 @@ UnixNativeDispatcher.c endif @@ -4610,10 +6214,11 @@ ifeq ($(OPENJDK_TARGET_OS), macosx) BUILD_LIBNIO_MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libnio/mapfile-$(OPENJDK_TARGET_OS) - BUILD_LIBNIO_SRC += $(JDK_TOPDIR)/src/macosx/native/sun/nio/ch ++ BUILD_LIBNIO_SRC += $(JDK_TOPDIR)/src/bsd/native/sun/nio/ch BUILD_LIBNIO_FILES += \ InheritedChannel.c \ NativeThread.c \ -@@ -130,6 +147,7 @@ +@@ -149,6 +167,7 @@ LDFLAGS_SUFFIX_windows := jvm.lib ws2_32.lib $(WIN_JAVA_LIB) \ $(JDK_OUTPUTDIR)/objs/libnet/net.lib \ advapi32.lib, \ @@ -4621,7 +6226,7 @@ LDFLAGS_SUFFIX_macosx := -ljava -lnet -pthread -framework CoreFoundation, \ LDFLAGS_SUFFIX :=, \ VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ -@@ -175,6 +193,7 @@ +@@ -194,6 +213,7 @@ LDFLAGS_SUFFIX_linux := -lpthread $(LIBDL) -ljava -ljvm, \ LDFLAGS_SUFFIX_posix := -lnio -lnet, \ LDFLAGS_SUFFIX_solaris := -lsocket -ljava -ljvm -lc, \ @@ -4629,8 +6234,8 @@ LDFLAGS_SUFFIX_macosx := -ljava -ljvm, \ OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libsctp, \ DEBUG_SYMBOLS := $(DEBUG_ALL_BINARIES))) ---- jdk/make/lib/ServiceabilityLibraries.gmk -+++ jdk/make/lib/ServiceabilityLibraries.gmk +--- ./jdk/make/lib/ServiceabilityLibraries.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/lib/ServiceabilityLibraries.gmk Wed Nov 05 12:14:24 2014 -0800 @@ -30,7 +30,7 @@ ifneq ($(OPENJDK_TARGET_OS), linux) LIBATTACH_EXCLUDE_FILES += LinuxVirtualMachine.c @@ -4639,8 +6244,8 @@ +ifeq (,$(findstring $(OPENJDK_TARGET_OS), bsd macosx)) LIBATTACH_EXCLUDE_FILES += BsdVirtualMachine.c endif - -@@ -82,6 +82,7 @@ + ifneq ($(OPENJDK_TARGET_OS),aix) +@@ -90,6 +90,7 @@ $(call SET_SHARED_LIBRARY_ORIGIN), \ LDFLAGS_SUFFIX_linux := -lpthread, \ LDFLAGS_SUFFIX_solaris := -lnsl -lsocket -lc, \ @@ -4648,7 +6253,14 @@ LDFLAGS_SUFFIX_windows := $(LDFLAGS_JDKLIB_SUFFIX) -export:jdwpTransport_OnLoad ws2_32.lib, \ VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ RC_FLAGS := $(RC_FLAGS) \ -@@ -249,12 +250,15 @@ +@@ -251,12 +252,15 @@ + CFLAGS := $(LIBINSTRUMENT_CFLAGS), \ + CFLAGS_debug := -DJPLIS_LOGGING, \ + CFLAGS_release := -DNO_JPLIS_LOGGING, \ ++ CFLAGS_bsd := -DLIBICONV_PLUG, \ + MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libinstrument/mapfile-vers, \ + LDFLAGS := $(LDFLAGS_JDKLIB) \ + $(call SET_SHARED_LIBRARY_ORIGIN) \ $(LIBINSTRUMENT_LDFLAGS), \ LDFLAGS_linux := $(call SET_SHARED_LIBRARY_ORIGIN,/jli), \ LDFLAGS_solaris := $(call SET_SHARED_LIBRARY_ORIGIN,/jli), \ @@ -4657,23 +6269,24 @@ LDFLAGS_macosx := -Xlinker -all_load $(JDK_OUTPUTDIR)/objs/libjli_static.a \ -framework Cocoa -framework Security -framework ApplicationServices, \ LDFLAGS_SUFFIX := $(LIBINSTRUMENT_LDFLAGS_SUFFIX), \ - LDFLAGS_SUFFIX_macosx := -liconv $(LIBZ), \ +@@ -264,6 +268,7 @@ LDFLAGS_SUFFIX_solaris := $(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL) -lc, \ LDFLAGS_SUFFIX_linux := $(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL), \ -+ LDFLAGS_SUFFIX_bsd := -liconv $(LIBZ), \ + LDFLAGS_SUFFIX_aix := $(LIBZ) -L$(JDK_OUTPUTDIR)/objs -ljli_static $(LIBDL),\ ++ LDFLAGS_SUFFIX_bsd := $(LIBZ), \ VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ RC_FLAGS := $(RC_FLAGS) \ -D "JDK_FNAME=instrument.dll" \ -@@ -263,7 +267,7 @@ +@@ -272,7 +277,7 @@ OBJECT_DIR := $(LIBINSTRUMENT_DIR), \ DEBUG_SYMBOLS := true)) --ifneq (, $(findstring $(OPENJDK_TARGET_OS), macosx windows)) -+ifneq (, $(findstring $(OPENJDK_TARGET_OS), bsd macosx windows)) +-ifneq (, $(findstring $(OPENJDK_TARGET_OS), macosx windows aix)) ++ifneq (, $(findstring $(OPENJDK_TARGET_OS), bsd macosx windows aix)) $(BUILD_LIBINSTRUMENT): $(JDK_OUTPUTDIR)/objs/$(LIBRARY_PREFIX)jli_static$(STATIC_LIBRARY_SUFFIX) else $(BUILD_LIBINSTRUMENT): $(INSTALL_LIBRARIES_HERE)/jli/$(LIBRARY_PREFIX)jli$(SHARED_LIBRARY_SUFFIX) -@@ -289,12 +293,16 @@ +@@ -298,12 +303,16 @@ BUILD_LIBMANAGEMENT_EXCLUDES += LinuxOperatingSystem.c endif @@ -4691,7 +6304,7 @@ ifeq ($(ENABLE_DEBUG_SYMBOLS), true) LIBMANAGEMENT_OPTIMIZATION := LOW endif -@@ -337,7 +345,7 @@ +@@ -352,7 +361,7 @@ BUILD_LIBHPROF_LDFLAGS := LIBHPROF_OPTIMIZATION := HIGHEST @@ -4700,11 +6313,11 @@ ifeq ($(ENABLE_DEBUG_SYMBOLS), true) LIBHPROF_OPTIMIZATION := LOW endif ---- jdk/make/lib/SoundLibraries.gmk -+++ jdk/make/lib/SoundLibraries.gmk -@@ -71,6 +71,11 @@ - LIBJSOUND_CFLAGS += -DX_PLATFORM=X_LINUX - endif # OPENJDK_TARGET_OS linux +--- ./jdk/make/lib/SoundLibraries.gmk Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/lib/SoundLibraries.gmk Wed Nov 05 12:14:24 2014 -0800 +@@ -75,6 +75,11 @@ + LIBJSOUND_CFLAGS += -DX_PLATFORM=X_AIX + endif # OPENJDK_TARGET_OS aix +ifeq ($(OPENJDK_TARGET_OS), bsd) + EXTRA_SOUND_JNI_LIBS += jsoundalsa @@ -4714,7 +6327,7 @@ ifeq ($(OPENJDK_TARGET_OS), macosx) LIBJSOUND_LANG := C++ LIBJSOUND_CFLAGS += -DX_PLATFORM=X_MACOSX \ -@@ -188,12 +193,14 @@ +@@ -196,12 +201,14 @@ CFLAGS := $(CFLAGS_JDKLIB) $(ALSA_CFLAGS) \ $(LIBJSOUND_CFLAGS) \ -DUSE_DAUDIO=TRUE \ @@ -4731,8 +6344,8 @@ LDFLAGS_SUFFIX := $(ALSA_LIBS) -ljava -ljvm, \ OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/libjsoundalsa, \ DEBUG_SYMBOLS := $(DEBUG_ALL_BINARIES))) ---- jdk/make/mapfiles/launchers/mapfile-x86 -+++ jdk/make/mapfiles/launchers/mapfile-x86 +--- ./jdk/make/mapfiles/launchers/mapfile-x86 Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/mapfiles/launchers/mapfile-x86 Wed Nov 05 12:14:24 2014 -0800 @@ -33,6 +33,7 @@ environ; # Public symbols and required by Java run time _environ; @@ -4741,8 +6354,8 @@ ___Argv; # The following are private, but as they are _start; # exported from ctr1/crtn, the clever hacker _init; # might know about them. However note, that ---- jdk/make/mapfiles/launchers/mapfile-x86_64 -+++ jdk/make/mapfiles/launchers/mapfile-x86_64 +--- ./jdk/make/mapfiles/launchers/mapfile-x86_64 Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/mapfiles/launchers/mapfile-x86_64 Wed Nov 05 12:14:24 2014 -0800 @@ -33,6 +33,7 @@ environ; # Public symbols and required by Java run time _environ; @@ -4751,8 +6364,8 @@ local: *; ---- jdk/make/mapfiles/libattach/mapfile-bsd -+++ jdk/make/mapfiles/libattach/mapfile-bsd +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/mapfiles/libattach/mapfile-bsd Wed Nov 05 12:14:24 2014 -0800 @@ -0,0 +1,42 @@ +# +# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. @@ -4796,8 +6409,8 @@ + local: + *; +}; ---- jdk/make/mapfiles/libnio/mapfile-bsd -+++ jdk/make/mapfiles/libnio/mapfile-bsd +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/mapfiles/libnio/mapfile-bsd Wed Nov 05 12:14:24 2014 -0800 @@ -0,0 +1,189 @@ +# +# Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. @@ -4988,8 +6601,8 @@ + local: + *; +}; ---- jdk/make/mapfiles/libunpack/mapfile-vers-unpack200 -+++ jdk/make/mapfiles/libunpack/mapfile-vers-unpack200 +--- ./jdk/make/mapfiles/libunpack/mapfile-vers-unpack200 Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/mapfiles/libunpack/mapfile-vers-unpack200 Wed Nov 05 12:14:24 2014 -0800 @@ -26,6 +26,9 @@ # Define library interface. @@ -5000,8 +6613,8 @@ local: *; }; ---- jdk/make/netbeans/common/bsd-sources.ent -+++ jdk/make/netbeans/common/bsd-sources.ent +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/netbeans/common/bsd-sources.ent Wed Nov 05 12:14:24 2014 -0800 @@ -0,0 +1,45 @@ + + @@ -5048,8 +6661,8 @@ + + ${root}/src/bsd/classes + ---- jdk/make/netbeans/common/bsd-view.ent -+++ jdk/make/netbeans/common/bsd-view.ent +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/make/netbeans/common/bsd-view.ent Wed Nov 05 12:14:24 2014 -0800 @@ -0,0 +1,39 @@ + + @@ -5090,8 +6703,8 @@ + ${includes} + ${excludes} + ---- jdk/make/netbeans/common/java-data-native.ent -+++ jdk/make/netbeans/common/java-data-native.ent +--- ./jdk/make/netbeans/common/java-data-native.ent Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/netbeans/common/java-data-native.ent Wed Nov 05 12:14:24 2014 -0800 @@ -34,6 +34,7 @@ @@ -5100,8 +6713,8 @@ ${root}/src/macosx/classes ${root}/src/solaris/classes ${root}/src/windows/classes ---- jdk/make/netbeans/common/make.xml -+++ jdk/make/netbeans/common/make.xml +--- ./jdk/make/netbeans/common/make.xml Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/netbeans/common/make.xml Wed Nov 05 12:14:24 2014 -0800 @@ -32,16 +32,21 @@ --> @@ -5136,8 +6749,8 @@ ---- jdk/make/netbeans/j2se/nbproject/project.xml -+++ jdk/make/netbeans/j2se/nbproject/project.xml +--- ./jdk/make/netbeans/j2se/nbproject/project.xml Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/netbeans/j2se/nbproject/project.xml Wed Nov 05 12:14:24 2014 -0800 @@ -34,6 +34,7 @@ @@ -5170,8 +6783,8 @@ &macosx-view; &unix-view; &windows-view; ---- jdk/make/netbeans/world/nbproject/project.xml -+++ jdk/make/netbeans/world/nbproject/project.xml +--- ./jdk/make/netbeans/world/nbproject/project.xml Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/make/netbeans/world/nbproject/project.xml Wed Nov 05 12:14:24 2014 -0800 @@ -34,12 +34,14 @@ @@ -5203,8 +6816,1730 @@ &macosx-view; &unix-view; &windows-view; ---- jdk/src/share/bin/jli_util.h -+++ jdk/src/share/bin/jli_util.h +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/bsd/classes/java/net/DefaultInterface.java Wed Nov 05 12:14:24 2014 -0800 +@@ -0,0 +1,97 @@ ++/* ++ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package java.net; ++ ++/** ++ * Choose a network interface to be the default for ++ * outgoing IPv6 traffic that does not specify a scope_id (and which needs one). ++ * We choose the first interface that is up and is (in order of preference): ++ * 1. neither loopback nor point to point ++ * 2. point to point ++ * 3. loopback ++ * 4. none. ++ * Platforms that do not require a default interface implement a dummy ++ * that returns null. ++ */ ++ ++import java.util.Enumeration; ++import java.io.IOException; ++ ++class DefaultInterface { ++ ++ private final static NetworkInterface defaultInterface = ++ chooseDefaultInterface(); ++ ++ static NetworkInterface getDefault() { ++ return defaultInterface; ++ } ++ ++ /** ++ * Choose a default interface. This method returns an interface that is ++ * both "up" and supports multicast. This method choses an interface in ++ * order of preference: ++ * 1. neither loopback nor point to point ++ * 2. point to point ++ * 3. loopback ++ * ++ * @return the chosen interface or {@code null} if there isn't a suitable ++ * default ++ */ ++ private static NetworkInterface chooseDefaultInterface() { ++ Enumeration nifs; ++ ++ try { ++ nifs = NetworkInterface.getNetworkInterfaces(); ++ } catch (IOException ignore) { ++ // unable to enumate network interfaces ++ return null; ++ } ++ ++ NetworkInterface ppp = null; ++ NetworkInterface loopback = null; ++ ++ while (nifs.hasMoreElements()) { ++ NetworkInterface ni = nifs.nextElement(); ++ try { ++ if (ni.isUp() && ni.supportsMulticast()) { ++ boolean isLoopback = ni.isLoopback(); ++ boolean isPPP = ni.isPointToPoint(); ++ if (!isLoopback && !isPPP) { ++ // found an interface that is not the loopback or a ++ // point-to-point interface ++ return ni; ++ } ++ if (ppp == null && isPPP) ++ ppp = ni; ++ if (loopback == null && isLoopback) ++ loopback = ni; ++ } ++ } catch (IOException skip) { } ++ } ++ ++ return (ppp != null) ? ppp : loopback; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/bsd/classes/sun/nio/ch/DefaultSelectorProvider.java Wed Nov 05 12:14:24 2014 -0800 +@@ -0,0 +1,48 @@ ++/* ++ * Copyright (c) 2011, 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. ++ */ ++ ++package sun.nio.ch; ++ ++import java.nio.channels.spi.SelectorProvider; ++ ++/** ++ * Creates this platform's default SelectorProvider ++ */ ++ ++public class DefaultSelectorProvider { ++ ++ /** ++ * Prevent instantiation. ++ */ ++ private DefaultSelectorProvider() { } ++ ++ /** ++ * Returns the default SelectorProvider. ++ */ ++ public static SelectorProvider create() { ++ return new sun.nio.ch.KQueueSelectorProvider(); ++ } ++ ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/bsd/classes/sun/nio/ch/KQueueArrayWrapper.java Wed Nov 05 12:14:24 2014 -0800 +@@ -0,0 +1,213 @@ ++/* ++ * Copyright (c) 2011, 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. ++ */ ++ ++/* ++ * KQueueArrayWrapper.java ++ * Implementation of Selector using FreeBSD / Mac OS X kqueues ++ * Derived from Sun's DevPollArrayWrapper ++ */ ++ ++package sun.nio.ch; ++ ++import sun.misc.*; ++import java.io.IOException; ++import java.io.FileDescriptor; ++import java.util.Iterator; ++import java.util.LinkedList; ++ ++/* ++ * struct kevent { // 32-bit 64-bit ++ * uintptr_t ident; // 4 8 ++ * short filter; // 2 2 ++ * u_short flags; // 2 2 ++ * u_int fflags; // 4 4 ++ * intptr_t data; // 4 8 ++ * void *udata; // 4 8 ++ * } // Total: 20 32 ++ * ++ * The implementation works in 32-bit and 64-bit world. We do this by calling a ++ * native function that actually sets the sizes and offsets of the fields based ++ * on which mode we're in. ++ */ ++ ++class KQueueArrayWrapper { ++ // kevent filters ++ static short EVFILT_READ; ++ static short EVFILT_WRITE; ++ ++ // kevent struct ++ // These fields are now set by initStructSizes in the static initializer. ++ static short SIZEOF_KEVENT; ++ static short FD_OFFSET; ++ static short FILTER_OFFSET; ++ ++ // kevent array size ++ static final int NUM_KEVENTS = 128; ++ ++ // Are we in a 64-bit VM? ++ static boolean is64bit = false; ++ ++ // The kevent array (used for outcoming events only) ++ private AllocatedNativeObject keventArray = null; ++ private long keventArrayAddress; ++ ++ // The kqueue fd ++ private int kq = -1; ++ ++ // The fd of the interrupt line going out ++ private int outgoingInterruptFD; ++ ++ // The fd of the interrupt line coming in ++ private int incomingInterruptFD; ++ ++ static { ++ IOUtil.load(); ++ initStructSizes(); ++ String datamodel = java.security.AccessController.doPrivileged( ++ new sun.security.action.GetPropertyAction("sun.arch.data.model") ++ ); ++ is64bit = datamodel.equals("64"); ++ } ++ ++ KQueueArrayWrapper() { ++ int allocationSize = SIZEOF_KEVENT * NUM_KEVENTS; ++ keventArray = new AllocatedNativeObject(allocationSize, true); ++ keventArrayAddress = keventArray.address(); ++ kq = init(); ++ } ++ ++ // Used to update file description registrations ++ private static class Update { ++ SelChImpl channel; ++ int events; ++ Update(SelChImpl channel, int events) { ++ this.channel = channel; ++ this.events = events; ++ } ++ } ++ ++ private LinkedList updateList = new LinkedList(); ++ ++ void initInterrupt(int fd0, int fd1) { ++ outgoingInterruptFD = fd1; ++ incomingInterruptFD = fd0; ++ register0(kq, fd0, 1, 0); ++ } ++ ++ int getReventOps(int index) { ++ int result = 0; ++ int offset = SIZEOF_KEVENT*index + FILTER_OFFSET; ++ short filter = keventArray.getShort(offset); ++ ++ // This is all that's necessary based on inspection of usage: ++ // SinkChannelImpl, SourceChannelImpl, DatagramChannelImpl, ++ // ServerSocketChannelImpl, SocketChannelImpl ++ if (filter == EVFILT_READ) { ++ result |= Net.POLLIN; ++ } else if (filter == EVFILT_WRITE) { ++ result |= Net.POLLOUT; ++ } ++ ++ return result; ++ } ++ ++ int getDescriptor(int index) { ++ int offset = SIZEOF_KEVENT*index + FD_OFFSET; ++ /* The ident field is 8 bytes in 64-bit world, however the API wants us ++ * to return an int. Hence read the 8 bytes but return as an int. ++ */ ++ if (is64bit) { ++ long fd = keventArray.getLong(offset); ++ assert fd <= Integer.MAX_VALUE; ++ return (int) fd; ++ } else { ++ return keventArray.getInt(offset); ++ } ++ } ++ ++ void setInterest(SelChImpl channel, int events) { ++ synchronized (updateList) { ++ // update existing registration ++ updateList.add(new Update(channel, events)); ++ } ++ } ++ ++ void release(SelChImpl channel) { ++ synchronized (updateList) { ++ // flush any pending updates ++ for (Iterator it = updateList.iterator(); it.hasNext();) { ++ if (it.next().channel == channel) { ++ it.remove(); ++ } ++ } ++ ++ // remove ++ register0(kq, channel.getFDVal(), 0, 0); ++ } ++ } ++ ++ void updateRegistrations() { ++ synchronized (updateList) { ++ Update u = null; ++ while ((u = updateList.poll()) != null) { ++ SelChImpl ch = u.channel; ++ if (!ch.isOpen()) ++ continue; ++ ++ register0(kq, ch.getFDVal(), u.events & Net.POLLIN, u.events & Net.POLLOUT); ++ } ++ } ++ } ++ ++ ++ void close() throws IOException { ++ if (keventArray != null) { ++ keventArray.free(); ++ keventArray = null; ++ } ++ if (kq >= 0) { ++ FileDispatcherImpl.closeIntFD(kq); ++ kq = -1; ++ } ++ } ++ ++ int poll(long timeout) { ++ updateRegistrations(); ++ int updated = kevent0(kq, keventArrayAddress, NUM_KEVENTS, timeout); ++ return updated; ++ } ++ ++ void interrupt() { ++ interrupt(outgoingInterruptFD); ++ } ++ ++ private native int init(); ++ private static native void initStructSizes(); ++ ++ private native void register0(int kq, int fd, int read, int write); ++ private native int kevent0(int kq, long keventAddress, int keventCount, ++ long timeout); ++ private static native void interrupt(int fd); ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/bsd/classes/sun/nio/ch/KQueueSelectorImpl.java Wed Nov 05 12:14:24 2014 -0800 +@@ -0,0 +1,249 @@ ++/* ++ * Copyright (c) 2011, 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. ++ */ ++ ++/* ++ * KQueueSelectorImpl.java ++ * Implementation of Selector using FreeBSD / Mac OS X kqueues ++ * Derived from Sun's DevPollSelectorImpl ++ */ ++ ++package sun.nio.ch; ++ ++import java.io.IOException; ++import java.io.FileDescriptor; ++import java.nio.channels.*; ++import java.nio.channels.spi.*; ++import java.util.*; ++import sun.misc.*; ++ ++class KQueueSelectorImpl ++ extends SelectorImpl ++{ ++ // File descriptors used for interrupt ++ protected int fd0; ++ protected int fd1; ++ ++ // The kqueue manipulator ++ KQueueArrayWrapper kqueueWrapper; ++ ++ // Count of registered descriptors (including interrupt) ++ private int totalChannels; ++ ++ // Map from a file descriptor to an entry containing the selection key ++ private HashMap fdMap; ++ ++ // True if this Selector has been closed ++ private boolean closed = false; ++ ++ // Lock for interrupt triggering and clearing ++ private Object interruptLock = new Object(); ++ private boolean interruptTriggered = false; ++ ++ // used by updateSelectedKeys to handle cases where the same file ++ // descriptor is polled by more than one filter ++ private long updateCount; ++ ++ // Used to map file descriptors to a selection key and "update count" ++ // (see updateSelectedKeys for usage). ++ private static class MapEntry { ++ SelectionKeyImpl ski; ++ long updateCount; ++ MapEntry(SelectionKeyImpl ski) { ++ this.ski = ski; ++ } ++ } ++ ++ /** ++ * Package private constructor called by factory method in ++ * the abstract superclass Selector. ++ */ ++ KQueueSelectorImpl(SelectorProvider sp) { ++ super(sp); ++ long fds = IOUtil.makePipe(false); ++ fd0 = (int)(fds >>> 32); ++ fd1 = (int)fds; ++ kqueueWrapper = new KQueueArrayWrapper(); ++ kqueueWrapper.initInterrupt(fd0, fd1); ++ fdMap = new HashMap<>(); ++ totalChannels = 1; ++ } ++ ++ ++ protected int doSelect(long timeout) ++ throws IOException ++ { ++ int entries = 0; ++ if (closed) ++ throw new ClosedSelectorException(); ++ processDeregisterQueue(); ++ try { ++ begin(); ++ entries = kqueueWrapper.poll(timeout); ++ } finally { ++ end(); ++ } ++ processDeregisterQueue(); ++ return updateSelectedKeys(entries); ++ } ++ ++ /** ++ * Update the keys whose fd's have been selected by kqueue. ++ * Add the ready keys to the selected key set. ++ * If the interrupt fd has been selected, drain it and clear the interrupt. ++ */ ++ private int updateSelectedKeys(int entries) ++ throws IOException ++ { ++ int numKeysUpdated = 0; ++ boolean interrupted = false; ++ ++ // A file descriptor may be registered with kqueue with more than one ++ // filter and so there may be more than one event for a fd. The update ++ // count in the MapEntry tracks when the fd was last updated and this ++ // ensures that the ready ops are updated rather than replaced by a ++ // second or subsequent event. ++ updateCount++; ++ ++ for (int i = 0; i < entries; i++) { ++ int nextFD = kqueueWrapper.getDescriptor(i); ++ if (nextFD == fd0) { ++ interrupted = true; ++ } else { ++ MapEntry me = fdMap.get(Integer.valueOf(nextFD)); ++ ++ // entry is null in the case of an interrupt ++ if (me != null) { ++ int rOps = kqueueWrapper.getReventOps(i); ++ SelectionKeyImpl ski = me.ski; ++ if (selectedKeys.contains(ski)) { ++ // first time this file descriptor has been encountered on this ++ // update? ++ if (me.updateCount != updateCount) { ++ if (ski.channel.translateAndSetReadyOps(rOps, ski)) { ++ numKeysUpdated++; ++ me.updateCount = updateCount; ++ } ++ } else { ++ // ready ops have already been set on this update ++ ski.channel.translateAndUpdateReadyOps(rOps, ski); ++ } ++ } else { ++ ski.channel.translateAndSetReadyOps(rOps, ski); ++ if ((ski.nioReadyOps() & ski.nioInterestOps()) != 0) { ++ selectedKeys.add(ski); ++ numKeysUpdated++; ++ me.updateCount = updateCount; ++ } ++ } ++ } ++ } ++ } ++ ++ if (interrupted) { ++ // Clear the wakeup pipe ++ synchronized (interruptLock) { ++ IOUtil.drain(fd0); ++ interruptTriggered = false; ++ } ++ } ++ return numKeysUpdated; ++ } ++ ++ ++ protected void implClose() throws IOException { ++ if (!closed) { ++ closed = true; ++ ++ // prevent further wakeup ++ synchronized (interruptLock) { ++ interruptTriggered = true; ++ } ++ ++ FileDispatcherImpl.closeIntFD(fd0); ++ FileDispatcherImpl.closeIntFD(fd1); ++ if (kqueueWrapper != null) { ++ kqueueWrapper.close(); ++ kqueueWrapper = null; ++ selectedKeys = null; ++ ++ // Deregister channels ++ Iterator i = keys.iterator(); ++ while (i.hasNext()) { ++ SelectionKeyImpl ski = (SelectionKeyImpl)i.next(); ++ deregister(ski); ++ SelectableChannel selch = ski.channel(); ++ if (!selch.isOpen() && !selch.isRegistered()) ++ ((SelChImpl)selch).kill(); ++ i.remove(); ++ } ++ totalChannels = 0; ++ } ++ fd0 = -1; ++ fd1 = -1; ++ } ++ } ++ ++ ++ protected void implRegister(SelectionKeyImpl ski) { ++ if (closed) ++ throw new ClosedSelectorException(); ++ int fd = IOUtil.fdVal(ski.channel.getFD()); ++ fdMap.put(Integer.valueOf(fd), new MapEntry(ski)); ++ totalChannels++; ++ keys.add(ski); ++ } ++ ++ ++ protected void implDereg(SelectionKeyImpl ski) throws IOException { ++ int fd = ski.channel.getFDVal(); ++ fdMap.remove(Integer.valueOf(fd)); ++ kqueueWrapper.release(ski.channel); ++ totalChannels--; ++ keys.remove(ski); ++ selectedKeys.remove(ski); ++ deregister((AbstractSelectionKey)ski); ++ SelectableChannel selch = ski.channel(); ++ if (!selch.isOpen() && !selch.isRegistered()) ++ ((SelChImpl)selch).kill(); ++ } ++ ++ ++ public void putEventOps(SelectionKeyImpl ski, int ops) { ++ if (closed) ++ throw new ClosedSelectorException(); ++ kqueueWrapper.setInterest(ski.channel, ops); ++ } ++ ++ ++ public Selector wakeup() { ++ synchronized (interruptLock) { ++ if (!interruptTriggered) { ++ kqueueWrapper.interrupt(); ++ interruptTriggered = true; ++ } ++ } ++ return this; ++ } ++} +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/bsd/classes/sun/nio/ch/KQueueSelectorProvider.java Wed Nov 05 12:14:24 2014 -0800 +@@ -0,0 +1,44 @@ ++/* ++ * Copyright (c) 2011, 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. ++ */ ++ ++/* ++ * KQueueSelectorProvider.java ++ * Implementation of Selector using FreeBSD / Mac OS X kqueues ++ * Derived from Sun's DevPollSelectorProvider ++ */ ++ ++package sun.nio.ch; ++ ++import java.io.IOException; ++import java.nio.channels.*; ++import java.nio.channels.spi.*; ++ ++public class KQueueSelectorProvider ++extends SelectorProviderImpl ++{ ++ public AbstractSelector openSelector() throws IOException { ++ return new KQueueSelectorImpl(this); ++ } ++} +--- ./jdk/src/bsd/doc/man/javah.1 Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/bsd/doc/man/javah.1 Wed Nov 05 12:14:24 2014 -0800 +@@ -110,7 +110,7 @@ + + \&.:\fIyour-path\fR + +-Example: \f3\&.:/home/avh/classes:/usr/local/java/classes\fR ++Example: \f3\&.:/home/avh/classes:/usr/local/share/java/classes\fR + + \fIWindows\fR: + +--- ./jdk/src/bsd/doc/man/rmic.1 Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/bsd/doc/man/rmic.1 Wed Nov 05 12:14:24 2014 -0800 +@@ -93,7 +93,7 @@ + .TP + -classpath path + .br +-Specifies the path the \f3rmic\fR command uses to look up classes\&. This option overrides the default or the \f3CLASSPATH\fR environment variable when it is set\&. Directories are separated by colons\&. The general format for path is: \f3\&.:\fR, for example: \f3\&.:/usr/local/java/classes\fR\&. ++Specifies the path the \f3rmic\fR command uses to look up classes\&. This option overrides the default or the \f3CLASSPATH\fR environment variable when it is set\&. Directories are separated by colons\&. The general format for path is: \f3\&.:\fR, for example: \f3\&.:/usr/local/share/java/classes\fR\&. + .TP + -d \fIdirectory\fR + .br +@@ -207,7 +207,7 @@ + .SH ENVIRONMENT\ VARIABLES + .TP + CLASSPATH +-Used to provide the system a path to user-defined classes\&. Directories are separated by colons, for example: \f3\&.:/usr/local/java/classes\fR\&. ++Used to provide the system a path to user-defined classes\&. Directories are separated by colons, for example: \f3\&.:/usr/local/share/java/classes\fR\&. + .SH SEE\ ALSO + .TP 0.2i + \(bu +--- ./jdk/src/bsd/doc/man/rmid.1 Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/bsd/doc/man/rmid.1 Wed Nov 05 12:14:24 2014 -0800 +@@ -301,7 +301,7 @@ + .SH ENVIRONMENT\ VARIABLES + .TP + CLASSPATH +-Used to provide the system a path to user-defined classes\&. Directories are separated by colons, for example: \f3\&.:/usr/local/java/classes\fR\&. ++Used to provide the system a path to user-defined classes\&. Directories are separated by colons, for example: \f3\&.:/usr/local/share/java/classes\fR\&. + .SH SEE\ ALSO + .TP 0.2i + \(bu +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/bsd/native/sun/nio/ch/KQueueArrayWrapper.c Wed Nov 05 12:14:24 2014 -0800 +@@ -0,0 +1,171 @@ ++/* ++ * Copyright (c) 2011, 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. ++ */ ++ ++/* ++ * KQueueArrayWrapper.c ++ * Implementation of Selector using FreeBSD / Mac OS X kqueues ++ * Derived from Sun's DevPollArrayWrapper ++ */ ++ ++ ++#include "jni.h" ++#include "jni_util.h" ++#include "jvm.h" ++#include "jlong.h" ++ ++#include ++#include ++#include ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_KQueueArrayWrapper_initStructSizes(JNIEnv *env, jclass clazz) ++{ ++#define CHECK_EXCEPTION() { \ ++ if ((*env)->ExceptionCheck(env)) { \ ++ goto exceptionOccurred; \ ++ } \ ++} ++ ++#define CHECK_ERROR_AND_EXCEPTION(_field) { \ ++ if (_field == NULL) { \ ++ goto badField; \ ++ } \ ++ CHECK_EXCEPTION(); \ ++} ++ ++ ++ jfieldID field; ++ ++ field = (*env)->GetStaticFieldID(env, clazz, "EVFILT_READ", "S"); ++ CHECK_ERROR_AND_EXCEPTION(field); ++ (*env)->SetStaticShortField(env, clazz, field, EVFILT_READ); ++ CHECK_EXCEPTION(); ++ ++ field = (*env)->GetStaticFieldID(env, clazz, "EVFILT_WRITE", "S"); ++ CHECK_ERROR_AND_EXCEPTION(field); ++ (*env)->SetStaticShortField(env, clazz, field, EVFILT_WRITE); ++ CHECK_EXCEPTION(); ++ ++ field = (*env)->GetStaticFieldID(env, clazz, "SIZEOF_KEVENT", "S"); ++ CHECK_ERROR_AND_EXCEPTION(field); ++ (*env)->SetStaticShortField(env, clazz, field, (short) sizeof(struct kevent)); ++ CHECK_EXCEPTION(); ++ ++ field = (*env)->GetStaticFieldID(env, clazz, "FD_OFFSET", "S"); ++ CHECK_ERROR_AND_EXCEPTION(field); ++ (*env)->SetStaticShortField(env, clazz, field, (short) offsetof(struct kevent, ident)); ++ CHECK_EXCEPTION(); ++ ++ field = (*env)->GetStaticFieldID(env, clazz, "FILTER_OFFSET", "S"); ++ CHECK_ERROR_AND_EXCEPTION(field); ++ (*env)->SetStaticShortField(env, clazz, field, (short) offsetof(struct kevent, filter)); ++ CHECK_EXCEPTION(); ++ return; ++ ++badField: ++ return; ++ ++exceptionOccurred: ++ return; ++ ++#undef CHECK_EXCEPTION ++#undef CHECK_ERROR_AND_EXCEPTION ++} ++ ++JNIEXPORT jint JNICALL ++Java_sun_nio_ch_KQueueArrayWrapper_init(JNIEnv *env, jobject this) ++{ ++ int kq = kqueue(); ++ if (kq < 0) { ++ JNU_ThrowIOExceptionWithLastError(env, "KQueueArrayWrapper: kqueue() failed"); ++ } ++ return kq; ++} ++ ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_KQueueArrayWrapper_register0(JNIEnv *env, jobject this, ++ jint kq, jint fd, jint r, jint w) ++{ ++ struct kevent changes[2]; ++ struct kevent errors[2]; ++ struct timespec dontBlock = {0, 0}; ++ ++ // if (r) then { register for read } else { unregister for read } ++ // if (w) then { register for write } else { unregister for write } ++ // Ignore errors - they're probably complaints about deleting non- ++ // added filters - but provide an error array anyway because ++ // kqueue behaves erratically if some of its registrations fail. ++ EV_SET(&changes[0], fd, EVFILT_READ, r ? EV_ADD : EV_DELETE, 0, 0, 0); ++ EV_SET(&changes[1], fd, EVFILT_WRITE, w ? EV_ADD : EV_DELETE, 0, 0, 0); ++ kevent(kq, changes, 2, errors, 2, &dontBlock); ++} ++ ++ ++JNIEXPORT jint JNICALL ++Java_sun_nio_ch_KQueueArrayWrapper_kevent0(JNIEnv *env, jobject this, jint kq, ++ jlong kevAddr, jint kevCount, ++ jlong timeout) ++{ ++ struct kevent *kevs = (struct kevent *)jlong_to_ptr(kevAddr); ++ struct timespec ts; ++ struct timespec *tsp; ++ int result; ++ ++ // Java timeout is in milliseconds. Convert to struct timespec. ++ // Java timeout == -1 : wait forever : timespec timeout of NULL ++ // Java timeout == 0 : return immediately : timespec timeout of zero ++ if (timeout >= 0) { ++ ts.tv_sec = timeout / 1000; ++ ts.tv_nsec = (timeout % 1000) * 1000000; //nanosec = 1 million millisec ++ tsp = &ts; ++ } else { ++ tsp = NULL; ++ } ++ ++ result = kevent(kq, NULL, 0, kevs, kevCount, tsp); ++ ++ if (result < 0) { ++ if (errno == EINTR) { ++ // ignore EINTR, pretend nothing was selected ++ result = 0; ++ } else { ++ JNU_ThrowIOExceptionWithLastError(env, "KQueueArrayWrapper: kqueue failed"); ++ } ++ } ++ ++ return result; ++} ++ ++ ++JNIEXPORT void JNICALL ++Java_sun_nio_ch_KQueueArrayWrapper_interrupt(JNIEnv *env, jclass cls, jint fd) ++{ ++ char c = 1; ++ if (1 != write(fd, &c, 1)) { ++ JNU_ThrowIOExceptionWithLastError(env, "KQueueArrayWrapper: interrupt failed"); ++ } ++} ++ +--- ./jdk/src/macosx/classes/java/net/DefaultInterface.java Tue Sep 09 12:00:58 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,97 +0,0 @@ +-/* +- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. Oracle designates this +- * particular file as subject to the "Classpath" exception as provided +- * by Oracle in the LICENSE file that accompanied this code. +- * +- * This code is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * version 2 for more details (a copy is included in the LICENSE file that +- * accompanied this code). +- * +- * You should have received a copy of the GNU General Public License version +- * 2 along with this work; if not, write to the Free Software Foundation, +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +- * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- */ +- +-package java.net; +- +-/** +- * Choose a network interface to be the default for +- * outgoing IPv6 traffic that does not specify a scope_id (and which needs one). +- * We choose the first interface that is up and is (in order of preference): +- * 1. neither loopback nor point to point +- * 2. point to point +- * 3. loopback +- * 4. none. +- * Platforms that do not require a default interface implement a dummy +- * that returns null. +- */ +- +-import java.util.Enumeration; +-import java.io.IOException; +- +-class DefaultInterface { +- +- private final static NetworkInterface defaultInterface = +- chooseDefaultInterface(); +- +- static NetworkInterface getDefault() { +- return defaultInterface; +- } +- +- /** +- * Choose a default interface. This method returns an interface that is +- * both "up" and supports multicast. This method choses an interface in +- * order of preference: +- * 1. neither loopback nor point to point +- * 2. point to point +- * 3. loopback +- * +- * @return the chosen interface or {@code null} if there isn't a suitable +- * default +- */ +- private static NetworkInterface chooseDefaultInterface() { +- Enumeration nifs; +- +- try { +- nifs = NetworkInterface.getNetworkInterfaces(); +- } catch (IOException ignore) { +- // unable to enumate network interfaces +- return null; +- } +- +- NetworkInterface ppp = null; +- NetworkInterface loopback = null; +- +- while (nifs.hasMoreElements()) { +- NetworkInterface ni = nifs.nextElement(); +- try { +- if (ni.isUp() && ni.supportsMulticast()) { +- boolean isLoopback = ni.isLoopback(); +- boolean isPPP = ni.isPointToPoint(); +- if (!isLoopback && !isPPP) { +- // found an interface that is not the loopback or a +- // point-to-point interface +- return ni; +- } +- if (ppp == null && isPPP) +- ppp = ni; +- if (loopback == null && isLoopback) +- loopback = ni; +- } +- } catch (IOException skip) { } +- } +- +- return (ppp != null) ? ppp : loopback; +- } +-} +--- ./jdk/src/macosx/classes/sun/nio/ch/DefaultSelectorProvider.java Tue Sep 09 12:00:58 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,48 +0,0 @@ +-/* +- * Copyright (c) 2011, 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. +- */ +- +-package sun.nio.ch; +- +-import java.nio.channels.spi.SelectorProvider; +- +-/** +- * Creates this platform's default SelectorProvider +- */ +- +-public class DefaultSelectorProvider { +- +- /** +- * Prevent instantiation. +- */ +- private DefaultSelectorProvider() { } +- +- /** +- * Returns the default SelectorProvider. +- */ +- public static SelectorProvider create() { +- return new sun.nio.ch.KQueueSelectorProvider(); +- } +- +-} +--- ./jdk/src/macosx/classes/sun/nio/ch/KQueueArrayWrapper.java Tue Sep 09 12:00:58 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,213 +0,0 @@ +-/* +- * Copyright (c) 2011, 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. +- */ +- +-/* +- * KQueueArrayWrapper.java +- * Implementation of Selector using FreeBSD / Mac OS X kqueues +- * Derived from Sun's DevPollArrayWrapper +- */ +- +-package sun.nio.ch; +- +-import sun.misc.*; +-import java.io.IOException; +-import java.io.FileDescriptor; +-import java.util.Iterator; +-import java.util.LinkedList; +- +-/* +- * struct kevent { // 32-bit 64-bit +- * uintptr_t ident; // 4 8 +- * short filter; // 2 2 +- * u_short flags; // 2 2 +- * u_int fflags; // 4 4 +- * intptr_t data; // 4 8 +- * void *udata; // 4 8 +- * } // Total: 20 32 +- * +- * The implementation works in 32-bit and 64-bit world. We do this by calling a +- * native function that actually sets the sizes and offsets of the fields based +- * on which mode we're in. +- */ +- +-class KQueueArrayWrapper { +- // kevent filters +- static short EVFILT_READ; +- static short EVFILT_WRITE; +- +- // kevent struct +- // These fields are now set by initStructSizes in the static initializer. +- static short SIZEOF_KEVENT; +- static short FD_OFFSET; +- static short FILTER_OFFSET; +- +- // kevent array size +- static final int NUM_KEVENTS = 128; +- +- // Are we in a 64-bit VM? +- static boolean is64bit = false; +- +- // The kevent array (used for outcoming events only) +- private AllocatedNativeObject keventArray = null; +- private long keventArrayAddress; +- +- // The kqueue fd +- private int kq = -1; +- +- // The fd of the interrupt line going out +- private int outgoingInterruptFD; +- +- // The fd of the interrupt line coming in +- private int incomingInterruptFD; +- +- static { +- IOUtil.load(); +- initStructSizes(); +- String datamodel = java.security.AccessController.doPrivileged( +- new sun.security.action.GetPropertyAction("sun.arch.data.model") +- ); +- is64bit = datamodel.equals("64"); +- } +- +- KQueueArrayWrapper() { +- int allocationSize = SIZEOF_KEVENT * NUM_KEVENTS; +- keventArray = new AllocatedNativeObject(allocationSize, true); +- keventArrayAddress = keventArray.address(); +- kq = init(); +- } +- +- // Used to update file description registrations +- private static class Update { +- SelChImpl channel; +- int events; +- Update(SelChImpl channel, int events) { +- this.channel = channel; +- this.events = events; +- } +- } +- +- private LinkedList updateList = new LinkedList(); +- +- void initInterrupt(int fd0, int fd1) { +- outgoingInterruptFD = fd1; +- incomingInterruptFD = fd0; +- register0(kq, fd0, 1, 0); +- } +- +- int getReventOps(int index) { +- int result = 0; +- int offset = SIZEOF_KEVENT*index + FILTER_OFFSET; +- short filter = keventArray.getShort(offset); +- +- // This is all that's necessary based on inspection of usage: +- // SinkChannelImpl, SourceChannelImpl, DatagramChannelImpl, +- // ServerSocketChannelImpl, SocketChannelImpl +- if (filter == EVFILT_READ) { +- result |= Net.POLLIN; +- } else if (filter == EVFILT_WRITE) { +- result |= Net.POLLOUT; +- } +- +- return result; +- } +- +- int getDescriptor(int index) { +- int offset = SIZEOF_KEVENT*index + FD_OFFSET; +- /* The ident field is 8 bytes in 64-bit world, however the API wants us +- * to return an int. Hence read the 8 bytes but return as an int. +- */ +- if (is64bit) { +- long fd = keventArray.getLong(offset); +- assert fd <= Integer.MAX_VALUE; +- return (int) fd; +- } else { +- return keventArray.getInt(offset); +- } +- } +- +- void setInterest(SelChImpl channel, int events) { +- synchronized (updateList) { +- // update existing registration +- updateList.add(new Update(channel, events)); +- } +- } +- +- void release(SelChImpl channel) { +- synchronized (updateList) { +- // flush any pending updates +- for (Iterator it = updateList.iterator(); it.hasNext();) { +- if (it.next().channel == channel) { +- it.remove(); +- } +- } +- +- // remove +- register0(kq, channel.getFDVal(), 0, 0); +- } +- } +- +- void updateRegistrations() { +- synchronized (updateList) { +- Update u = null; +- while ((u = updateList.poll()) != null) { +- SelChImpl ch = u.channel; +- if (!ch.isOpen()) +- continue; +- +- register0(kq, ch.getFDVal(), u.events & Net.POLLIN, u.events & Net.POLLOUT); +- } +- } +- } +- +- +- void close() throws IOException { +- if (keventArray != null) { +- keventArray.free(); +- keventArray = null; +- } +- if (kq >= 0) { +- FileDispatcherImpl.closeIntFD(kq); +- kq = -1; +- } +- } +- +- int poll(long timeout) { +- updateRegistrations(); +- int updated = kevent0(kq, keventArrayAddress, NUM_KEVENTS, timeout); +- return updated; +- } +- +- void interrupt() { +- interrupt(outgoingInterruptFD); +- } +- +- private native int init(); +- private static native void initStructSizes(); +- +- private native void register0(int kq, int fd, int read, int write); +- private native int kevent0(int kq, long keventAddress, int keventCount, +- long timeout); +- private static native void interrupt(int fd); +-} +--- ./jdk/src/macosx/classes/sun/nio/ch/KQueueSelectorImpl.java Tue Sep 09 12:00:58 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,249 +0,0 @@ +-/* +- * Copyright (c) 2011, 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. +- */ +- +-/* +- * KQueueSelectorImpl.java +- * Implementation of Selector using FreeBSD / Mac OS X kqueues +- * Derived from Sun's DevPollSelectorImpl +- */ +- +-package sun.nio.ch; +- +-import java.io.IOException; +-import java.io.FileDescriptor; +-import java.nio.channels.*; +-import java.nio.channels.spi.*; +-import java.util.*; +-import sun.misc.*; +- +-class KQueueSelectorImpl +- extends SelectorImpl +-{ +- // File descriptors used for interrupt +- protected int fd0; +- protected int fd1; +- +- // The kqueue manipulator +- KQueueArrayWrapper kqueueWrapper; +- +- // Count of registered descriptors (including interrupt) +- private int totalChannels; +- +- // Map from a file descriptor to an entry containing the selection key +- private HashMap fdMap; +- +- // True if this Selector has been closed +- private boolean closed = false; +- +- // Lock for interrupt triggering and clearing +- private Object interruptLock = new Object(); +- private boolean interruptTriggered = false; +- +- // used by updateSelectedKeys to handle cases where the same file +- // descriptor is polled by more than one filter +- private long updateCount; +- +- // Used to map file descriptors to a selection key and "update count" +- // (see updateSelectedKeys for usage). +- private static class MapEntry { +- SelectionKeyImpl ski; +- long updateCount; +- MapEntry(SelectionKeyImpl ski) { +- this.ski = ski; +- } +- } +- +- /** +- * Package private constructor called by factory method in +- * the abstract superclass Selector. +- */ +- KQueueSelectorImpl(SelectorProvider sp) { +- super(sp); +- long fds = IOUtil.makePipe(false); +- fd0 = (int)(fds >>> 32); +- fd1 = (int)fds; +- kqueueWrapper = new KQueueArrayWrapper(); +- kqueueWrapper.initInterrupt(fd0, fd1); +- fdMap = new HashMap<>(); +- totalChannels = 1; +- } +- +- +- protected int doSelect(long timeout) +- throws IOException +- { +- int entries = 0; +- if (closed) +- throw new ClosedSelectorException(); +- processDeregisterQueue(); +- try { +- begin(); +- entries = kqueueWrapper.poll(timeout); +- } finally { +- end(); +- } +- processDeregisterQueue(); +- return updateSelectedKeys(entries); +- } +- +- /** +- * Update the keys whose fd's have been selected by kqueue. +- * Add the ready keys to the selected key set. +- * If the interrupt fd has been selected, drain it and clear the interrupt. +- */ +- private int updateSelectedKeys(int entries) +- throws IOException +- { +- int numKeysUpdated = 0; +- boolean interrupted = false; +- +- // A file descriptor may be registered with kqueue with more than one +- // filter and so there may be more than one event for a fd. The update +- // count in the MapEntry tracks when the fd was last updated and this +- // ensures that the ready ops are updated rather than replaced by a +- // second or subsequent event. +- updateCount++; +- +- for (int i = 0; i < entries; i++) { +- int nextFD = kqueueWrapper.getDescriptor(i); +- if (nextFD == fd0) { +- interrupted = true; +- } else { +- MapEntry me = fdMap.get(Integer.valueOf(nextFD)); +- +- // entry is null in the case of an interrupt +- if (me != null) { +- int rOps = kqueueWrapper.getReventOps(i); +- SelectionKeyImpl ski = me.ski; +- if (selectedKeys.contains(ski)) { +- // first time this file descriptor has been encountered on this +- // update? +- if (me.updateCount != updateCount) { +- if (ski.channel.translateAndSetReadyOps(rOps, ski)) { +- numKeysUpdated++; +- me.updateCount = updateCount; +- } +- } else { +- // ready ops have already been set on this update +- ski.channel.translateAndUpdateReadyOps(rOps, ski); +- } +- } else { +- ski.channel.translateAndSetReadyOps(rOps, ski); +- if ((ski.nioReadyOps() & ski.nioInterestOps()) != 0) { +- selectedKeys.add(ski); +- numKeysUpdated++; +- me.updateCount = updateCount; +- } +- } +- } +- } +- } +- +- if (interrupted) { +- // Clear the wakeup pipe +- synchronized (interruptLock) { +- IOUtil.drain(fd0); +- interruptTriggered = false; +- } +- } +- return numKeysUpdated; +- } +- +- +- protected void implClose() throws IOException { +- if (!closed) { +- closed = true; +- +- // prevent further wakeup +- synchronized (interruptLock) { +- interruptTriggered = true; +- } +- +- FileDispatcherImpl.closeIntFD(fd0); +- FileDispatcherImpl.closeIntFD(fd1); +- if (kqueueWrapper != null) { +- kqueueWrapper.close(); +- kqueueWrapper = null; +- selectedKeys = null; +- +- // Deregister channels +- Iterator i = keys.iterator(); +- while (i.hasNext()) { +- SelectionKeyImpl ski = (SelectionKeyImpl)i.next(); +- deregister(ski); +- SelectableChannel selch = ski.channel(); +- if (!selch.isOpen() && !selch.isRegistered()) +- ((SelChImpl)selch).kill(); +- i.remove(); +- } +- totalChannels = 0; +- } +- fd0 = -1; +- fd1 = -1; +- } +- } +- +- +- protected void implRegister(SelectionKeyImpl ski) { +- if (closed) +- throw new ClosedSelectorException(); +- int fd = IOUtil.fdVal(ski.channel.getFD()); +- fdMap.put(Integer.valueOf(fd), new MapEntry(ski)); +- totalChannels++; +- keys.add(ski); +- } +- +- +- protected void implDereg(SelectionKeyImpl ski) throws IOException { +- int fd = ski.channel.getFDVal(); +- fdMap.remove(Integer.valueOf(fd)); +- kqueueWrapper.release(ski.channel); +- totalChannels--; +- keys.remove(ski); +- selectedKeys.remove(ski); +- deregister((AbstractSelectionKey)ski); +- SelectableChannel selch = ski.channel(); +- if (!selch.isOpen() && !selch.isRegistered()) +- ((SelChImpl)selch).kill(); +- } +- +- +- public void putEventOps(SelectionKeyImpl ski, int ops) { +- if (closed) +- throw new ClosedSelectorException(); +- kqueueWrapper.setInterest(ski.channel, ops); +- } +- +- +- public Selector wakeup() { +- synchronized (interruptLock) { +- if (!interruptTriggered) { +- kqueueWrapper.interrupt(); +- interruptTriggered = true; +- } +- } +- return this; +- } +-} +--- ./jdk/src/macosx/classes/sun/nio/ch/KQueueSelectorProvider.java Tue Sep 09 12:00:58 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,44 +0,0 @@ +-/* +- * Copyright (c) 2011, 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. +- */ +- +-/* +- * KQueueSelectorProvider.java +- * Implementation of Selector using FreeBSD / Mac OS X kqueues +- * Derived from Sun's DevPollSelectorProvider +- */ +- +-package sun.nio.ch; +- +-import java.io.IOException; +-import java.nio.channels.*; +-import java.nio.channels.spi.*; +- +-public class KQueueSelectorProvider +-extends SelectorProviderImpl +-{ +- public AbstractSelector openSelector() throws IOException { +- return new KQueueSelectorImpl(this); +- } +-} +--- ./jdk/src/macosx/native/sun/nio/ch/KQueueArrayWrapper.c Tue Sep 09 12:00:58 2014 -0700 ++++ /dev/null Thu Jan 01 00:00:00 1970 +0000 +@@ -1,171 +0,0 @@ +-/* +- * Copyright (c) 2011, 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. +- */ +- +-/* +- * KQueueArrayWrapper.c +- * Implementation of Selector using FreeBSD / Mac OS X kqueues +- * Derived from Sun's DevPollArrayWrapper +- */ +- +- +-#include "jni.h" +-#include "jni_util.h" +-#include "jvm.h" +-#include "jlong.h" +- +-#include +-#include +-#include +- +-JNIEXPORT void JNICALL +-Java_sun_nio_ch_KQueueArrayWrapper_initStructSizes(JNIEnv *env, jclass clazz) +-{ +-#define CHECK_EXCEPTION() { \ +- if ((*env)->ExceptionCheck(env)) { \ +- goto exceptionOccurred; \ +- } \ +-} +- +-#define CHECK_ERROR_AND_EXCEPTION(_field) { \ +- if (_field == NULL) { \ +- goto badField; \ +- } \ +- CHECK_EXCEPTION(); \ +-} +- +- +- jfieldID field; +- +- field = (*env)->GetStaticFieldID(env, clazz, "EVFILT_READ", "S"); +- CHECK_ERROR_AND_EXCEPTION(field); +- (*env)->SetStaticShortField(env, clazz, field, EVFILT_READ); +- CHECK_EXCEPTION(); +- +- field = (*env)->GetStaticFieldID(env, clazz, "EVFILT_WRITE", "S"); +- CHECK_ERROR_AND_EXCEPTION(field); +- (*env)->SetStaticShortField(env, clazz, field, EVFILT_WRITE); +- CHECK_EXCEPTION(); +- +- field = (*env)->GetStaticFieldID(env, clazz, "SIZEOF_KEVENT", "S"); +- CHECK_ERROR_AND_EXCEPTION(field); +- (*env)->SetStaticShortField(env, clazz, field, (short) sizeof(struct kevent)); +- CHECK_EXCEPTION(); +- +- field = (*env)->GetStaticFieldID(env, clazz, "FD_OFFSET", "S"); +- CHECK_ERROR_AND_EXCEPTION(field); +- (*env)->SetStaticShortField(env, clazz, field, (short) offsetof(struct kevent, ident)); +- CHECK_EXCEPTION(); +- +- field = (*env)->GetStaticFieldID(env, clazz, "FILTER_OFFSET", "S"); +- CHECK_ERROR_AND_EXCEPTION(field); +- (*env)->SetStaticShortField(env, clazz, field, (short) offsetof(struct kevent, filter)); +- CHECK_EXCEPTION(); +- return; +- +-badField: +- return; +- +-exceptionOccurred: +- return; +- +-#undef CHECK_EXCEPTION +-#undef CHECK_ERROR_AND_EXCEPTION +-} +- +-JNIEXPORT jint JNICALL +-Java_sun_nio_ch_KQueueArrayWrapper_init(JNIEnv *env, jobject this) +-{ +- int kq = kqueue(); +- if (kq < 0) { +- JNU_ThrowIOExceptionWithLastError(env, "KQueueArrayWrapper: kqueue() failed"); +- } +- return kq; +-} +- +- +-JNIEXPORT void JNICALL +-Java_sun_nio_ch_KQueueArrayWrapper_register0(JNIEnv *env, jobject this, +- jint kq, jint fd, jint r, jint w) +-{ +- struct kevent changes[2]; +- struct kevent errors[2]; +- struct timespec dontBlock = {0, 0}; +- +- // if (r) then { register for read } else { unregister for read } +- // if (w) then { register for write } else { unregister for write } +- // Ignore errors - they're probably complaints about deleting non- +- // added filters - but provide an error array anyway because +- // kqueue behaves erratically if some of its registrations fail. +- EV_SET(&changes[0], fd, EVFILT_READ, r ? EV_ADD : EV_DELETE, 0, 0, 0); +- EV_SET(&changes[1], fd, EVFILT_WRITE, w ? EV_ADD : EV_DELETE, 0, 0, 0); +- kevent(kq, changes, 2, errors, 2, &dontBlock); +-} +- +- +-JNIEXPORT jint JNICALL +-Java_sun_nio_ch_KQueueArrayWrapper_kevent0(JNIEnv *env, jobject this, jint kq, +- jlong kevAddr, jint kevCount, +- jlong timeout) +-{ +- struct kevent *kevs = (struct kevent *)jlong_to_ptr(kevAddr); +- struct timespec ts; +- struct timespec *tsp; +- int result; +- +- // Java timeout is in milliseconds. Convert to struct timespec. +- // Java timeout == -1 : wait forever : timespec timeout of NULL +- // Java timeout == 0 : return immediately : timespec timeout of zero +- if (timeout >= 0) { +- ts.tv_sec = timeout / 1000; +- ts.tv_nsec = (timeout % 1000) * 1000000; //nanosec = 1 million millisec +- tsp = &ts; +- } else { +- tsp = NULL; +- } +- +- result = kevent(kq, NULL, 0, kevs, kevCount, tsp); +- +- if (result < 0) { +- if (errno == EINTR) { +- // ignore EINTR, pretend nothing was selected +- result = 0; +- } else { +- JNU_ThrowIOExceptionWithLastError(env, "KQueueArrayWrapper: kqueue failed"); +- } +- } +- +- return result; +-} +- +- +-JNIEXPORT void JNICALL +-Java_sun_nio_ch_KQueueArrayWrapper_interrupt(JNIEnv *env, jclass cls, jint fd) +-{ +- char c = 1; +- if (1 != write(fd, &c, 1)) { +- JNU_ThrowIOExceptionWithLastError(env, "KQueueArrayWrapper: interrupt failed"); +- } +-} +- +--- ./jdk/src/share/bin/jli_util.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/bin/jli_util.h Wed Nov 05 12:14:24 2014 -0800 @@ -82,7 +82,7 @@ #define _LARGFILE64_SOURCE #define JLI_Lseek lseek64 @@ -5213,9 +8548,9 @@ +#ifdef _ALLBSD_SOURCE #define JLI_Lseek lseek #endif - #endif /* _WIN32 */ ---- jdk/src/share/classes/sun/awt/FontConfiguration.java -+++ jdk/src/share/classes/sun/awt/FontConfiguration.java + #ifdef _AIX +--- ./jdk/src/share/classes/sun/awt/FontConfiguration.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/FontConfiguration.java Wed Nov 05 12:14:24 2014 -0800 @@ -1146,7 +1146,7 @@ */ HashMap existsMap; @@ -5225,8 +8560,8 @@ return false; } else if (existsMap == null) { existsMap = new HashMap(); ---- jdk/src/share/classes/sun/awt/OSInfo.java -+++ jdk/src/share/classes/sun/awt/OSInfo.java +--- ./jdk/src/share/classes/sun/awt/OSInfo.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/awt/OSInfo.java Wed Nov 05 12:14:24 2014 -0800 @@ -39,6 +39,7 @@ WINDOWS, LINUX, @@ -5246,8 +8581,8 @@ if (osName.contains("OS X")) { return MACOSX; } ---- jdk/src/share/classes/sun/font/FontUtilities.java -+++ jdk/src/share/classes/sun/font/FontUtilities.java +--- ./jdk/src/share/classes/sun/font/FontUtilities.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/font/FontUtilities.java Wed Nov 05 12:14:24 2014 -0800 @@ -48,6 +48,8 @@ public static boolean isLinux; @@ -5266,8 +8601,8 @@ isMacOSX = osName.contains("OS X"); // TODO: MacOSX String t2kStr = System.getProperty("sun.java2d.font.scaler"); ---- jdk/src/share/classes/sun/font/SunFontManager.java -+++ jdk/src/share/classes/sun/font/SunFontManager.java +--- ./jdk/src/share/classes/sun/font/SunFontManager.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/font/SunFontManager.java Wed Nov 05 12:14:24 2014 -0800 @@ -418,7 +418,7 @@ * registerFonts method as on-screen these JRE fonts * always go through the T2K rasteriser. @@ -5277,19 +8612,19 @@ /* Linux font configuration uses these fonts */ registerFontDir(jreFontDirName); } ---- jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java -+++ jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java +--- ./jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Wed Nov 05 12:14:24 2014 -0800 @@ -1298,7 +1298,7 @@ String osName = AccessController.doPrivileged( new GetPropertyAction("os.name")); - if ("SunOS".equals(osName) || "Linux".equals(osName) + if ("SunOS".equals(osName) || "Linux".equals(osName) || "AIX".equals(osName) - || osName.contains("OS X")) { + || osName.endsWith("BSD") || osName.contains("OS X")) { charset("x-COMPOUND_TEXT", "COMPOUND_TEXT", new String[] { "COMPOUND_TEXT", // JDK historical ---- jdk/src/share/classes/sun/print/PSPrinterJob.java -+++ jdk/src/share/classes/sun/print/PSPrinterJob.java +--- ./jdk/src/share/classes/sun/print/PSPrinterJob.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/print/PSPrinterJob.java Wed Nov 05 12:14:24 2014 -0800 @@ -1587,7 +1587,7 @@ } @@ -5299,8 +8634,8 @@ execCmd = new String[ncomps]; execCmd[n++] = "/usr/bin/lpr"; if ((pFlags & PRINTER) != 0) { ---- jdk/src/share/classes/sun/security/jgss/GSSManagerImpl.java -+++ jdk/src/share/classes/sun/security/jgss/GSSManagerImpl.java +--- ./jdk/src/share/classes/sun/security/jgss/GSSManagerImpl.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/jgss/GSSManagerImpl.java Wed Nov 05 12:14:24 2014 -0800 @@ -48,6 +48,7 @@ public Boolean run() { String osname = System.getProperty("os.name"); @@ -5309,8 +8644,8 @@ osname.contains("OS X") || osname.startsWith("Linux")) { return new Boolean(System.getProperty ---- jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java -+++ jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java +--- ./jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/jgss/wrapper/SunNativeProvider.java Wed Nov 05 12:14:24 2014 -0800 @@ -90,6 +90,12 @@ "libgssapi_krb5.so", "libgssapi_krb5.so.2", @@ -5324,8 +8659,8 @@ } else if (osname.contains("OS X")) { gssLibs = new String[]{ "libgssapi_krb5.dylib", ---- jdk/src/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java -+++ jdk/src/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java +--- ./jdk/src/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java Wed Nov 05 12:14:24 2014 -0800 @@ -403,7 +403,8 @@ long uid = 0; @@ -5336,16 +8671,17 @@ try { Class c = Class.forName ("com.sun.security.auth.module.UnixSystem"); ---- jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider -+++ jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider -@@ -31,3 +31,4 @@ +--- ./jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider Wed Nov 05 12:14:24 2014 -0800 +@@ -31,4 +31,5 @@ #[windows]sun.tools.attach.WindowsAttachProvider #[linux]sun.tools.attach.LinuxAttachProvider #[macosx]sun.tools.attach.BsdAttachProvider +#[bsd]sun.tools.attach.BsdAttachProvider ---- jdk/src/share/lib/security/java.security-bsd -+++ jdk/src/share/lib/security/java.security-bsd -@@ -0,0 +1,500 @@ + #[aix]sun.tools.attach.AixAttachProvider +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/share/lib/security/java.security-bsd Wed Nov 05 12:14:24 2014 -0800 +@@ -0,0 +1,498 @@ +# +# This is the "master security properties file". +# @@ -5561,7 +8897,6 @@ + jdk.nashorn.tools.,\ + com.sun.activation.registries. + -+ +# +# List of comma-separated packages that start with or equal this string +# will cause a security exception to be thrown when @@ -5609,7 +8944,6 @@ + jdk.nashorn.tools.,\ + com.sun.activation.registries. + -+ +# +# Determines whether this properties file can be appended to +# or overridden on the command line via -Djava.security.properties @@ -5846,8 +9180,8 @@ +# +# Example: +# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048 ---- jdk/src/share/native/com/sun/java/util/jar/pack/zip.cpp -+++ jdk/src/share/native/com/sun/java/util/jar/pack/zip.cpp +--- ./jdk/src/share/native/com/sun/java/util/jar/pack/zip.cpp Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/com/sun/java/util/jar/pack/zip.cpp Wed Nov 05 12:14:24 2014 -0800 @@ -62,7 +62,7 @@ #endif // End of ZLIB @@ -5857,9 +9191,9 @@ #define SWAP_BYTES(a) \ ((((a) << 8) & 0xff00) | 0x00ff) & (((a) >> 8) | 0xff00) #else ---- jdk/src/share/native/com/sun/media/sound/DirectAudioDevice.c -+++ jdk/src/share/native/com/sun/media/sound/DirectAudioDevice.c -@@ -120,7 +120,7 @@ +--- ./jdk/src/share/native/com/sun/media/sound/DirectAudioDevice.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/com/sun/media/sound/DirectAudioDevice.c Wed Nov 05 12:14:24 2014 -0800 +@@ -121,7 +121,7 @@ } /* conversion from/to 16 bit signed little endian to native endian samples */ @@ -5868,7 +9202,7 @@ #define MAP_LE_SHORT2SAMPLE(sh) ((MAP_Sample) (sh)) #define MAP_SAMPLE2LE_SHORT(sample) (sample) #define MAP_SAMPLE2LE_SHORT_CLIP(sample) MAP_ClipAndConvertToShort(sample) -@@ -131,7 +131,7 @@ +@@ -132,7 +132,7 @@ #endif /* conversion from/to 16 bit signed big endian to native endian samples */ @@ -5877,7 +9211,7 @@ #define MAP_BE_SHORT2SAMPLE(sh) ((MAP_Sample) (sh)) #define MAP_SAMPLE2BE_SHORT(sample) (sample) #define MAP_SAMPLE2BE_SHORT_CLIP(sample) MAP_ClipAndConvertToShort(sample) -@@ -150,7 +150,7 @@ +@@ -151,7 +151,7 @@ #define MAP_SAMPLE2INT8_CLIP(sample) MAP_ClipAndConvertToByte(sample) /* macros for endian conversion */ @@ -5886,8 +9220,8 @@ #define MAP_NATIVE2LE16(a) (a) #define MAP_NATIVE2BE16(a) MAP_SWAP16_impl(a) #define MAP_NATIVE2LE32(a) (a) ---- jdk/src/share/native/com/sun/media/sound/Utilities.c -+++ jdk/src/share/native/com/sun/media/sound/Utilities.c +--- ./jdk/src/share/native/com/sun/media/sound/Utilities.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/com/sun/media/sound/Utilities.c Wed Nov 05 12:14:24 2014 -0800 @@ -28,7 +28,7 @@ @@ -5897,8 +9231,8 @@ return 0; #else return 1; ---- jdk/src/share/native/java/lang/fdlibm/include/fdlibm.h -+++ jdk/src/share/native/java/lang/fdlibm/include/fdlibm.h +--- ./jdk/src/share/native/java/lang/fdlibm/include/fdlibm.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/java/lang/fdlibm/include/fdlibm.h Wed Nov 05 12:14:24 2014 -0800 @@ -40,7 +40,7 @@ #endif #endif @@ -5908,9 +9242,9 @@ #define __HI(x) *(1+(int*)&x) #define __LO(x) *(int*)&x #define __HIp(x) *(1+(int*)x) ---- jdk/src/share/native/sun/awt/image/awt_parseImage.c -+++ jdk/src/share/native/sun/awt/image/awt_parseImage.c -@@ -599,7 +599,7 @@ +--- ./jdk/src/share/native/sun/awt/image/awt_parseImage.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/image/awt_parseImage.c Wed Nov 05 12:14:24 2014 -0800 +@@ -623,7 +623,7 @@ switch(type) { case java_awt_image_BufferedImage_TYPE_INT_ARGB: case java_awt_image_BufferedImage_TYPE_INT_ARGB_PRE: @@ -5919,7 +9253,7 @@ colorOrder[0] = 2; colorOrder[1] = 1; colorOrder[2] = 0; -@@ -612,7 +612,7 @@ +@@ -636,7 +636,7 @@ #endif break; case java_awt_image_BufferedImage_TYPE_INT_BGR: @@ -5928,7 +9262,7 @@ colorOrder[0] = 0; colorOrder[1] = 1; colorOrder[2] = 2; -@@ -623,7 +623,7 @@ +@@ -647,7 +647,7 @@ #endif break; case java_awt_image_BufferedImage_TYPE_INT_RGB: @@ -5937,9 +9271,9 @@ colorOrder[0] = 2; colorOrder[1] = 1; colorOrder[2] = 0; ---- jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c -+++ jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c -@@ -1175,7 +1175,7 @@ +--- ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Wed Nov 05 12:14:24 2014 -0800 +@@ -1176,7 +1176,7 @@ #define NLUT 8 @@ -5948,8 +9282,8 @@ #define INDEXES { 3, 2, 1, 0, 7, 6, 5, 4 } #else #define INDEXES { 0, 1, 2, 3, 4, 5, 6, 7 } ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageConv2x2_f.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageConv2x2_f.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv2x2_f.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv2x2_f.c Wed Nov 05 12:14:24 2014 -0800 @@ -86,7 +86,7 @@ #endif /* MLIB_USE_FTOI_CLAMPING */ @@ -5989,8 +9323,8 @@ #endif /* _NO_LONGLONG */ ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_16ext.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_16ext.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_16ext.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_16ext.c Wed Nov 05 12:14:24 2014 -0800 @@ -126,7 +126,7 @@ #define D2I(x) CLAMP_S32((x) SAT_OFF) @@ -6030,8 +9364,8 @@ #endif /* _NO_LONGLONG */ /***************************************************************/ ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_16nw.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_16nw.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_16nw.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_16nw.c Wed Nov 05 12:14:24 2014 -0800 @@ -94,7 +94,7 @@ #define D2I(x) CLAMP_S32((x) SAT_OFF) @@ -6071,8 +9405,8 @@ #endif /* _NO_LONGLONG */ /***************************************************************/ ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_8ext.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_8ext.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_8ext.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_8ext.c Wed Nov 05 12:14:24 2014 -0800 @@ -126,7 +126,7 @@ #define D2I(x) CLAMP_S32((x) SAT_OFF) @@ -6112,8 +9446,8 @@ #endif /* _NO_LONGLONG */ /***************************************************************/ ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_8nw.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_8nw.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_8nw.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_8nw.c Wed Nov 05 12:14:24 2014 -0800 @@ -95,7 +95,7 @@ #define D2I(x) CLAMP_S32((x) SAT_OFF) @@ -6153,8 +9487,8 @@ #endif /* _NO_LONGLONG */ /***************************************************************/ ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_u16ext.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_u16ext.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_u16ext.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_u16ext.c Wed Nov 05 12:14:24 2014 -0800 @@ -126,7 +126,7 @@ #define D2I(x) CLAMP_S32((x) SAT_OFF) @@ -6194,8 +9528,8 @@ #endif /* _NO_LONGLONG */ /***************************************************************/ ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_u16nw.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_u16nw.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_u16nw.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageConv_u16nw.c Wed Nov 05 12:14:24 2014 -0800 @@ -94,7 +94,7 @@ #define D2I(x) CLAMP_S32((x) SAT_OFF) @@ -6235,8 +9569,8 @@ #endif /* _NO_LONGLONG */ /***************************************************************/ ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageCopy_Bit.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageCopy_Bit.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageCopy_Bit.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageCopy_Bit.c Wed Nov 05 12:14:24 2014 -0800 @@ -95,7 +95,7 @@ dst = dp[0]; if (ld_offset + size < 32) { @@ -6456,8 +9790,8 @@ } #else /* _LONGLONG */ ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageLookUp_64.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageLookUp_64.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageLookUp_64.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageLookUp_64.c Wed Nov 05 12:14:24 2014 -0800 @@ -168,7 +168,7 @@ } @@ -6738,8 +10072,8 @@ dp[12] = t0; dp[13] = t1; dp[14] = t2; ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageLookUp_Bit.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageLookUp_Bit.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageLookUp_Bit.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageLookUp_Bit.c Wed Nov 05 12:14:24 2014 -0800 @@ -88,7 +88,7 @@ } d64_2_f32; @@ -6891,8 +10225,8 @@ ((mlib_u32*)lh)[0] = l; ((mlib_u32*)lh)[1] = l; ((mlib_u32*)lh)[2] = l; ((mlib_u32*)lh)[3] = h; ---- jdk/src/share/native/sun/awt/medialib/mlib_ImageUtils.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_ImageUtils.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_ImageUtils.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_ImageUtils.c Wed Nov 05 12:14:24 2014 -0800 @@ -30,7 +30,7 @@ typedef union { mlib_d64 db; @@ -6902,8 +10236,8 @@ mlib_s32 int1, int0; #else mlib_s32 int0, int1; ---- jdk/src/share/native/sun/awt/medialib/mlib_c_ImageCopy.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_c_ImageCopy.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_c_ImageCopy.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_c_ImageCopy.c Wed Nov 05 12:14:24 2014 -0800 @@ -275,11 +275,11 @@ for (i = 0; j <= (b_size - 4); j += 4, i++) { src0 = src1; @@ -7002,8 +10336,8 @@ s0 = s1; dp += SIZE; sp += SIZE; ---- jdk/src/share/native/sun/awt/medialib/mlib_c_ImageLookUp_f.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_c_ImageLookUp_f.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_c_ImageLookUp_f.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_c_ImageLookUp_f.c Wed Nov 05 12:14:24 2014 -0800 @@ -120,7 +120,7 @@ } \ } @@ -8236,8 +11570,8 @@ dp[12] = t0; dp[13] = t1; dp[14] = t2; ---- jdk/src/share/native/sun/awt/medialib/mlib_image.h -+++ jdk/src/share/native/sun/awt/medialib/mlib_image.h +--- ./jdk/src/share/native/sun/awt/medialib/mlib_image.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_image.h Wed Nov 05 12:14:24 2014 -0800 @@ -27,9 +27,6 @@ #ifndef MLIB_IMAGE_H #define MLIB_IMAGE_H @@ -8248,8 +11582,8 @@ #include #include #include ---- jdk/src/share/native/sun/awt/medialib/mlib_sys.c -+++ jdk/src/share/native/sun/awt/medialib/mlib_sys.c +--- ./jdk/src/share/native/sun/awt/medialib/mlib_sys.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/awt/medialib/mlib_sys.c Wed Nov 05 12:14:24 2014 -0800 @@ -29,7 +29,7 @@ #ifdef MACOSX #include @@ -8259,7 +11593,7 @@ #include #endif #include -@@ -94,6 +94,9 @@ +@@ -97,6 +97,9 @@ return (void *) malloc(size); #elif defined(MACOSX) return valloc(size); @@ -8269,8 +11603,8 @@ #else return (void *) memalign(8, size); #endif /* _MSC_VER */ ---- jdk/src/share/native/sun/font/layout/LEStandalone.h -+++ jdk/src/share/native/sun/font/layout/LEStandalone.h +--- ./jdk/src/share/native/sun/font/layout/LEStandalone.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/font/layout/LEStandalone.h Wed Nov 05 12:14:24 2014 -0800 @@ -136,7 +136,7 @@ #define U_CAPI extern "C" @@ -8280,8 +11614,8 @@ #define U_IS_BIG_ENDIAN 0 #endif #endif ---- jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c -+++ jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c +--- ./jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/LCMS.c Wed Nov 05 12:14:24 2014 -0800 @@ -182,7 +182,7 @@ return 0L; } @@ -8291,8 +11625,8 @@ /* Reversing data packed into int for LE archs */ if (isInIntPacked) { inFormatter ^= DOSWAP_SH(1); ---- jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h -+++ jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h +--- ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h Wed Nov 05 12:14:24 2014 -0800 @@ -202,7 +202,7 @@ // Try to detect big endian platforms. This list can be endless, so only some checks are performed over here. // you can pass this toggle to the compiler by using -DCMS_USE_BIG_ENDIAN or something similar @@ -8302,9 +11636,9 @@ # define CMS_USE_BIG_ENDIAN 1 #endif ---- jdk/src/share/native/sun/management/DiagnosticCommandImpl.c -+++ jdk/src/share/native/sun/management/DiagnosticCommandImpl.c -@@ -26,6 +26,7 @@ +--- ./jdk/src/share/native/sun/management/DiagnosticCommandImpl.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/share/native/sun/management/DiagnosticCommandImpl.c Wed Nov 05 12:14:24 2014 -0800 +@@ -27,6 +27,7 @@ #include #include "management.h" #include "sun_management_DiagnosticCommandImpl.h" @@ -8312,8 +11646,8 @@ JNIEXPORT void JNICALL Java_sun_management_DiagnosticCommandImpl_setNotificationEnabled (JNIEnv *env, jobject dummy, jboolean enabled) { ---- jdk/src/solaris/back/util_md.h -+++ jdk/src/solaris/back/util_md.h +--- ./jdk/src/solaris/back/util_md.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/back/util_md.h Wed Nov 05 12:14:24 2014 -0800 @@ -51,7 +51,7 @@ /* On little endian machines, convert java big endian numbers. */ @@ -8323,8 +11657,8 @@ #define HOST_TO_JAVA_CHAR(x) (((x & 0xff) << 8) | ((x >> 8) & (0xff))) #define HOST_TO_JAVA_SHORT(x) (((x & 0xff) << 8) | ((x >> 8) & (0xff))) ---- jdk/src/solaris/bin/ergo_i586.c -+++ jdk/src/solaris/bin/ergo_i586.c +--- ./jdk/src/solaris/bin/ergo_i586.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/bin/ergo_i586.c Wed Nov 05 12:14:24 2014 -0800 @@ -106,7 +106,7 @@ #endif /* __solaris__ */ @@ -8334,9 +11668,18 @@ /* * A utility method for asking the CPU about itself. ---- jdk/src/solaris/bin/java_md_solinux.c -+++ jdk/src/solaris/bin/java_md_solinux.c -@@ -297,9 +297,9 @@ +@@ -197,7 +197,7 @@ + (result == JNI_TRUE ? "true" : "false")); + return result; + } +-#endif /* __linux__ */ ++#endif /* __linux__ || _ALLBSD_SOURCE */ + + /* + * Routines shared by solaris-i586 and linux-i586. +--- ./jdk/src/solaris/bin/java_md_solinux.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/bin/java_md_solinux.c Wed Nov 05 12:14:24 2014 -0800 +@@ -306,9 +306,9 @@ if (llp == NULL && dmllp == NULL) { return JNI_FALSE; } @@ -8348,7 +11691,7 @@ * LD_LIBRARY_PATH to the empty string for security purposes. (In contrast, * on Solaris the LD_LIBRARY_PATH variable for a privileged binary does not * lose its settings; but the dynamic linker does apply more scrutiny to the -@@ -310,12 +310,18 @@ +@@ -319,12 +319,18 @@ * libraries will be handled by the RPATH. In reality, this check is * redundant, as the previous check for a non-null LD_LIBRARY_PATH will * return back to the calling function forthwith, it is left here to safe @@ -8369,7 +11712,7 @@ /* * Prevent recursions. Since LD_LIBRARY_PATH is the one which will be set by -@@ -900,8 +906,9 @@ +@@ -919,8 +925,9 @@ * onwards the filename returned in DL_info structure from dladdr is * an absolute pathname so technically realpath isn't required. * On Linux we read the executable name from /proc/self/exe. @@ -8381,7 +11724,7 @@ */ const char* SetExecname(char **argv) -@@ -928,9 +935,13 @@ +@@ -947,9 +954,13 @@ } } } @@ -8396,7 +11739,7 @@ char buf[PATH_MAX+1]; int len = readlink(self, buf, PATH_MAX); if (len >= 0) { -@@ -938,7 +949,7 @@ +@@ -957,7 +968,7 @@ exec_path = JLI_StringDup(buf); } } @@ -8405,34 +11748,7 @@ { /* Not implemented */ } -@@ -1000,7 +1011,7 @@ - int - ContinueInNewThread0(int (JNICALL *continuation)(void *), jlong stack_size, void * args) { - int rslt; --#ifdef __linux__ -+#ifndef __solaris__ - pthread_t tid; - pthread_attr_t attr; - pthread_attr_init(&attr); -@@ -1025,7 +1036,7 @@ - } - - pthread_attr_destroy(&attr); --#else /* ! __linux__ */ -+#else /* __solaris__ */ - thread_t tid; - long flags = 0; - if (thr_create(NULL, stack_size, (void *(*)(void *))continuation, args, flags, &tid) == 0) { -@@ -1036,7 +1047,7 @@ - /* See above. Continue in current thread if thr_create() failed */ - rslt = continuation(args); - } --#endif /* __linux__ */ -+#endif /* ! __solaris__ */ - return rslt; - } - -@@ -1044,13 +1055,13 @@ +@@ -1063,13 +1074,13 @@ #define MAX_PID_STR_SZ 20 void SetJavaLauncherPlatformProps() { @@ -8449,8 +11765,8 @@ } int ---- jdk/src/solaris/bin/java_md_solinux.h -+++ jdk/src/solaris/bin/java_md_solinux.h +--- ./jdk/src/solaris/bin/java_md_solinux.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/bin/java_md_solinux.h Wed Nov 05 12:14:24 2014 -0800 @@ -26,17 +26,26 @@ #ifndef JAVA_MD_SOLINUX_H #define JAVA_MD_SOLINUX_H @@ -8481,31 +11797,18 @@ /* pointer to environment */ extern char **environ; -@@ -48,16 +57,19 @@ - #ifdef __linux__ - static const char *system_dir = "/usr/java"; - static const char *user_dir = "/java"; +@@ -48,6 +57,9 @@ + #ifdef __solaris__ + static const char *system_dir = "/usr/jdk"; + static const char *user_dir = "/jdk"; +#elif defined(__FreeBSD__) +static const char *system_dir = PACKAGE_PATH "/openjdk8"; +static const char *user_dir = "/java"; - #else /* Solaris */ - static const char *system_dir = "/usr/jdk"; - static const char *user_dir = "/jdk"; - #endif - - #include --#ifdef __linux__ --#include --#else -+#ifdef __solaris__ - #include -+#else -+#include - #endif - - #define JVM_DLL "libjvm.so" ---- jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd -+++ jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd + #else /* !__solaris__, i.e. Linux, AIX,.. */ + static const char *system_dir = "/usr/java"; + static const char *user_dir = "/java"; +--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Wed Nov 05 12:14:24 2014 -0800 @@ -94,8 +94,9 @@ { public LaunchMechanism run() { @@ -8517,8 +11820,419 @@ String s = System.getProperty( "jdk.lang.Process.launchMechanism", "posix_spawn"); ---- jdk/src/solaris/classes/sun/awt/X11FontManager.java -+++ jdk/src/solaris/classes/sun/awt/X11FontManager.java +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.macosx Wed Nov 05 12:14:24 2014 -0800 +@@ -0,0 +1,408 @@ ++/* ++ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package java.lang; ++ ++import java.io.BufferedInputStream; ++import java.io.BufferedOutputStream; ++import java.io.ByteArrayInputStream; ++import java.io.FileDescriptor; ++import java.io.FileInputStream; ++import java.io.FileOutputStream; ++import java.io.IOException; ++import java.io.InputStream; ++import java.io.OutputStream; ++import java.util.Arrays; ++import java.util.concurrent.Executors; ++import java.util.concurrent.Executor; ++import java.util.concurrent.ThreadFactory; ++import java.util.concurrent.TimeUnit; ++import java.security.AccessController; ++import static java.security.AccessController.doPrivileged; ++import java.security.PrivilegedAction; ++import java.security.PrivilegedActionException; ++import java.security.PrivilegedExceptionAction; ++ ++/** ++ * java.lang.Process subclass in the UNIX environment. ++ * ++ * @author Mario Wolczko and Ross Knippel. ++ * @author Konstantin Kladko (ported to Bsd) ++ * @author Martin Buchholz ++ */ ++final class UNIXProcess extends Process { ++ private static final sun.misc.JavaIOFileDescriptorAccess fdAccess ++ = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); ++ ++ private final int pid; ++ private int exitcode; ++ private boolean hasExited; ++ ++ private /* final */ OutputStream stdin; ++ private /* final */ InputStream stdout; ++ private /* final */ InputStream stderr; ++ ++ private static enum LaunchMechanism { ++ FORK(1), ++ POSIX_SPAWN(2); ++ ++ private int value; ++ LaunchMechanism(int x) {value = x;} ++ }; ++ ++ /* On BSD, the default is to spawn */ ++ private static final LaunchMechanism launchMechanism; ++ private static byte[] helperpath; ++ ++ private static byte[] toCString(String s) { ++ if (s == null) ++ return null; ++ byte[] bytes = s.getBytes(); ++ byte[] result = new byte[bytes.length + 1]; ++ System.arraycopy(bytes, 0, ++ result, 0, ++ bytes.length); ++ result[result.length-1] = (byte)0; ++ return result; ++ } ++ ++ static { ++ launchMechanism = AccessController.doPrivileged( ++ new PrivilegedAction() ++ { ++ public LaunchMechanism run() { ++ String javahome = System.getProperty("java.home"); ++ ++ helperpath = toCString(javahome + "/lib/jspawnhelper"); ++ String s = System.getProperty( ++ "jdk.lang.Process.launchMechanism", "posix_spawn"); ++ ++ try { ++ return LaunchMechanism.valueOf(s.toUpperCase()); ++ } catch (IllegalArgumentException e) { ++ throw new Error(s + " is not a supported " + ++ "process launch mechanism on this platform."); ++ } ++ } ++ }); ++ } ++ ++ /* this is for the reaping thread */ ++ private native int waitForProcessExit(int pid); ++ ++ /** ++ * Create a process. Depending on the mode flag, this is done by ++ * one of the following mechanisms. ++ * - fork(2) and exec(2) ++ * - posix_spawn(2) ++ * ++ * @param fds an array of three file descriptors. ++ * Indexes 0, 1, and 2 correspond to standard input, ++ * standard output and standard error, respectively. On ++ * input, a value of -1 means to create a pipe to connect ++ * child and parent processes. On output, a value which ++ * is not -1 is the parent pipe fd corresponding to the ++ * pipe which has been created. An element of this array ++ * is -1 on input if and only if it is not -1 on ++ * output. ++ * @return the pid of the subprocess ++ */ ++ private native int forkAndExec(int mode, byte[] helperpath, ++ byte[] prog, ++ byte[] argBlock, int argc, ++ byte[] envBlock, int envc, ++ byte[] dir, ++ int[] fds, ++ boolean redirectErrorStream) ++ throws IOException; ++ ++ /** ++ * The thread factory used to create "process reaper" daemon threads. ++ */ ++ private static class ProcessReaperThreadFactory implements ThreadFactory { ++ private final static ThreadGroup group = getRootThreadGroup(); ++ ++ private static ThreadGroup getRootThreadGroup() { ++ return doPrivileged(new PrivilegedAction () { ++ public ThreadGroup run() { ++ ThreadGroup root = Thread.currentThread().getThreadGroup(); ++ while (root.getParent() != null) ++ root = root.getParent(); ++ return root; ++ }}); ++ } ++ ++ public Thread newThread(Runnable grimReaper) { ++ // Our thread stack requirement is quite modest. ++ Thread t = new Thread(group, grimReaper, "process reaper", 32768); ++ t.setDaemon(true); ++ // A small attempt (probably futile) to avoid priority inversion ++ t.setPriority(Thread.MAX_PRIORITY); ++ return t; ++ } ++ } ++ ++ /** ++ * The thread pool of "process reaper" daemon threads. ++ */ ++ private static final Executor processReaperExecutor = ++ doPrivileged(new PrivilegedAction() { ++ public Executor run() { ++ return Executors.newCachedThreadPool ++ (new ProcessReaperThreadFactory()); ++ }}); ++ ++ UNIXProcess(final byte[] prog, ++ final byte[] argBlock, final int argc, ++ final byte[] envBlock, final int envc, ++ final byte[] dir, ++ final int[] fds, ++ final boolean redirectErrorStream) ++ throws IOException { ++ ++ pid = forkAndExec(launchMechanism.value, ++ helperpath, ++ prog, ++ argBlock, argc, ++ envBlock, envc, ++ dir, ++ fds, ++ redirectErrorStream); ++ ++ try { ++ doPrivileged(new PrivilegedExceptionAction() { ++ public Void run() throws IOException { ++ initStreams(fds); ++ return null; ++ }}); ++ } catch (PrivilegedActionException ex) { ++ throw (IOException) ex.getException(); ++ } ++ } ++ ++ static FileDescriptor newFileDescriptor(int fd) { ++ FileDescriptor fileDescriptor = new FileDescriptor(); ++ fdAccess.set(fileDescriptor, fd); ++ return fileDescriptor; ++ } ++ ++ void initStreams(int[] fds) throws IOException { ++ stdin = (fds[0] == -1) ? ++ ProcessBuilder.NullOutputStream.INSTANCE : ++ new ProcessPipeOutputStream(fds[0]); ++ ++ stdout = (fds[1] == -1) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ProcessPipeInputStream(fds[1]); ++ ++ stderr = (fds[2] == -1) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ProcessPipeInputStream(fds[2]); ++ ++ processReaperExecutor.execute(new Runnable() { ++ public void run() { ++ int exitcode = waitForProcessExit(pid); ++ UNIXProcess.this.processExited(exitcode); ++ }}); ++ } ++ ++ void processExited(int exitcode) { ++ synchronized (this) { ++ this.exitcode = exitcode; ++ hasExited = true; ++ notifyAll(); ++ } ++ ++ if (stdout instanceof ProcessPipeInputStream) ++ ((ProcessPipeInputStream) stdout).processExited(); ++ ++ if (stderr instanceof ProcessPipeInputStream) ++ ((ProcessPipeInputStream) stderr).processExited(); ++ ++ if (stdin instanceof ProcessPipeOutputStream) ++ ((ProcessPipeOutputStream) stdin).processExited(); ++ } ++ ++ public OutputStream getOutputStream() { ++ return stdin; ++ } ++ ++ public InputStream getInputStream() { ++ return stdout; ++ } ++ ++ public InputStream getErrorStream() { ++ return stderr; ++ } ++ ++ public synchronized int waitFor() throws InterruptedException { ++ while (!hasExited) { ++ wait(); ++ } ++ return exitcode; ++ } ++ ++ @Override ++ public synchronized boolean waitFor(long timeout, TimeUnit unit) ++ throws InterruptedException ++ { ++ if (hasExited) return true; ++ if (timeout <= 0) return false; ++ ++ long timeoutAsNanos = unit.toNanos(timeout); ++ long startTime = System.nanoTime(); ++ long rem = timeoutAsNanos; ++ ++ while (!hasExited && (rem > 0)) { ++ wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); ++ rem = timeoutAsNanos - (System.nanoTime() - startTime); ++ } ++ return hasExited; ++ } ++ ++ public synchronized int exitValue() { ++ if (!hasExited) { ++ throw new IllegalThreadStateException("process hasn't exited"); ++ } ++ return exitcode; ++ } ++ ++ private static native void destroyProcess(int pid, boolean force); ++ private void destroy(boolean force) { ++ // There is a risk that pid will be recycled, causing us to ++ // kill the wrong process! So we only terminate processes ++ // that appear to still be running. Even with this check, ++ // there is an unavoidable race condition here, but the window ++ // is very small, and OSes try hard to not recycle pids too ++ // soon, so this is quite safe. ++ synchronized (this) { ++ if (!hasExited) ++ destroyProcess(pid, force); ++ } ++ try { stdin.close(); } catch (IOException ignored) {} ++ try { stdout.close(); } catch (IOException ignored) {} ++ try { stderr.close(); } catch (IOException ignored) {} ++ } ++ ++ public void destroy() { ++ destroy(false); ++ } ++ ++ @Override ++ public Process destroyForcibly() { ++ destroy(true); ++ return this; ++ } ++ ++ @Override ++ public synchronized boolean isAlive() { ++ return !hasExited; ++ } ++ ++ private static native void init(); ++ ++ static { ++ init(); ++ } ++ ++ /** ++ * A buffered input stream for a subprocess pipe file descriptor ++ * that allows the underlying file descriptor to be reclaimed when ++ * the process exits, via the processExited hook. ++ * ++ * This is tricky because we do not want the user-level InputStream to be ++ * closed until the user invokes close(), and we need to continue to be ++ * able to read any buffered data lingering in the OS pipe buffer. ++ */ ++ static class ProcessPipeInputStream extends BufferedInputStream { ++ private final Object closeLock = new Object(); ++ ++ ProcessPipeInputStream(int fd) { ++ super(new FileInputStream(newFileDescriptor(fd))); ++ } ++ private static byte[] drainInputStream(InputStream in) ++ throws IOException { ++ int n = 0; ++ int j; ++ byte[] a = null; ++ while ((j = in.available()) > 0) { ++ a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); ++ n += in.read(a, n, j); ++ } ++ return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); ++ } ++ ++ /** Called by the process reaper thread when the process exits. */ ++ synchronized void processExited() { ++ synchronized (closeLock) { ++ try { ++ InputStream in = this.in; ++ // this stream is closed if and only if: in == null ++ if (in != null) { ++ byte[] stragglers = drainInputStream(in); ++ in.close(); ++ this.in = (stragglers == null) ? ++ ProcessBuilder.NullInputStream.INSTANCE : ++ new ByteArrayInputStream(stragglers); ++ } ++ } catch (IOException ignored) {} ++ } ++ } ++ ++ @Override ++ public void close() throws IOException { ++ // BufferedInputStream#close() is not synchronized unlike most other methods. ++ // Synchronizing helps avoid race with processExited(). ++ synchronized (closeLock) { ++ super.close(); ++ } ++ } ++ } ++ ++ /** ++ * A buffered output stream for a subprocess pipe file descriptor ++ * that allows the underlying file descriptor to be reclaimed when ++ * the process exits, via the processExited hook. ++ */ ++ static class ProcessPipeOutputStream extends BufferedOutputStream { ++ ProcessPipeOutputStream(int fd) { ++ super(new FileOutputStream(newFileDescriptor(fd))); ++ } ++ ++ /** Called by the process reaper thread when the process exits. */ ++ synchronized void processExited() { ++ OutputStream out = this.out; ++ if (out != null) { ++ try { ++ out.close(); ++ } catch (IOException ignored) { ++ // We know of no reason to get an IOException, but if ++ // we do, there's nothing else to do but carry on. ++ } ++ this.out = ProcessBuilder.NullOutputStream.INSTANCE; ++ } ++ } ++ } ++} +--- ./jdk/src/solaris/classes/sun/awt/X11FontManager.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/X11FontManager.java Wed Nov 05 12:14:24 2014 -0800 @@ -213,7 +213,7 @@ if (fontID != null) { fileName = (String)fontNameMap.get(fontID); @@ -8546,8 +12260,272 @@ (!mFontConfig.foundOsSpecificFile() || !mFontConfig.fontFilesArePresent()) || (FontUtilities.isSolaris && !mFontConfig.fontFilesArePresent()))) { ---- jdk/src/solaris/classes/sun/net/PortConfig.java -+++ jdk/src/solaris/classes/sun/net/PortConfig.java +--- ./jdk/src/solaris/classes/sun/awt/fontconfigs/bsd.fontconfig.properties Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/awt/fontconfigs/bsd.fontconfig.properties Wed Nov 05 12:14:24 2014 -0800 +@@ -26,134 +26,134 @@ + + # Version + +-# Uses Fedora Core 6 fonts and file paths. ++# Uses FreeBSD ports Tree fonts and file paths. + version=1 + + # Component Font Mappings + +-dialog.plain.latin-1=DejaVu LGC Sans ++dialog.plain.latin-1=DejaVu Sans + dialog.plain.japanese-x0208=Sazanami Gothic +-dialog.plain.korean=Baekmuk Gulim +-dialog.plain.chinese-big5=AR PL ShanHeiSun Uni +-dialog.plain.chinese-gb18030=AR PL ShanHeiSun Uni ++dialog.plain.korean=NanumGothic ++dialog.plain.chinese-big5=AR PL UMing ++dialog.plain.chinese-gb18030=AR PL UMing + +-dialog.bold.latin-1=DejaVu LGC Sans Bold ++dialog.bold.latin-1=DejaVu Sans Bold + dialog.bold.japanese-x0208=Sazanami Gothic +-dialog.bold.korean=Baekmuk Gulim +-dialog.bold.chinese-big5=AR PL ShanHeiSun Uni +-dialog.bold.chinese-gb18030=AR PL ShanHeiSun Uni ++dialog.bold.korean=NanumGothic Bold ++dialog.bold.chinese-big5=AR PL UMing ++dialog.bold.chinese-gb18030=AR PL UMing + +-dialog.italic.latin-1=DejaVu LGC Sans Oblique ++dialog.italic.latin-1=DejaVu Sans Oblique + dialog.italic.japanese-x0208=Sazanami Gothic +-dialog.italic.korean=Baekmuk Gulim +-dialog.italic.chinese-big5=AR PL ShanHeiSun Uni +-dialog.italic.chinese-gb18030=AR PL ShanHeiSun Uni ++dialog.italic.korean=NanumGothic ++dialog.italic.chinese-big5=AR PL UMing ++dialog.italic.chinese-gb18030=AR PL UMing + +-dialog.bolditalic.latin-1=DejaVu LGC Sans Bold Oblique ++dialog.bolditalic.latin-1=DejaVu Sans Bold Oblique + dialog.bolditalic.japanese-x0208=Sazanami Gothic +-dialog.bolditalic.korean=Baekmuk Gulim +-dialog.bolditalic.chinese-big5=AR PL ShanHeiSun Uni +-dialog.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni ++dialog.bolditalic.korean=NanumGothic Bold ++dialog.bolditalic.chinese-big5=AR PL UMing ++dialog.bolditalic.chinese-gb18030=AR PL UMing + + +-sansserif.plain.latin-1=DejaVu LGC Sans ++sansserif.plain.latin-1=DejaVu Sans + sansserif.plain.japanese-x0208=Sazanami Gothic +-sansserif.plain.korean=Baekmuk Gulim +-sansserif.plain.chinese-big5=AR PL ShanHeiSun Uni +-sansserif.plain.chinese-gb18030=AR PL ShanHeiSun Uni ++sansserif.plain.korean=NanumGothic ++sansserif.plain.chinese-big5=AR PL UMing ++sansserif.plain.chinese-gb18030=AR PL UMing + +-sansserif.bold.latin-1=DejaVu LGC Sans Bold ++sansserif.bold.latin-1=DejaVu Sans Bold + sansserif.bold.japanese-x0208=Sazanami Gothic +-sansserif.bold.korean=Baekmuk Gulim +-sansserif.bold.chinese-big5=AR PL ShanHeiSun Uni +-sansserif.bold.chinese-gb18030=AR PL ShanHeiSun Uni ++sansserif.bold.korean=NanumGothic Bold ++sansserif.bold.chinese-big5=AR PL UMing ++sansserif.bold.chinese-gb18030=AR PL UMing + +-sansserif.italic.latin-1=DejaVu LGC Sans Oblique ++sansserif.italic.latin-1=DejaVu Sans Oblique + sansserif.italic.japanese-x0208=Sazanami Gothic +-sansserif.italic.korean=Baekmuk Gulim +-sansserif.italic.chinese-big5=AR PL ShanHeiSun Uni +-sansserif.italic.chinese-gb18030=AR PL ShanHeiSun Uni ++sansserif.italic.korean=NanumGothic ++sansserif.italic.chinese-big5=AR PL UMing ++sansserif.italic.chinese-gb18030=AR PL UMing + +-sansserif.bolditalic.latin-1=DejaVu LGC Sans Bold Oblique ++sansserif.bolditalic.latin-1=DejaVu Sans Bold Oblique + sansserif.bolditalic.japanese-x0208=Sazanami Gothic +-sansserif.bolditalic.korean=Baekmuk Gulim +-sansserif.bolditalic.chinese-big5=AR PL ShanHeiSun Uni +-sansserif.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni ++sansserif.bolditalic.korean=NanumGothic Bold ++sansserif.bolditalic.chinese-big5=AR PL UMing ++sansserif.bolditalic.chinese-gb18030=AR PL UMing + + +-serif.plain.latin-1=DejaVu LGC Serif ++serif.plain.latin-1=DejaVu Serif + serif.plain.japanese-x0208=Sazanami Mincho +-serif.plain.korean=Baekmuk Batang +-serif.plain.chinese-big5=AR PL ZenKai Uni +-serif.plain.chinese-gb18030=AR PL ZenKai Uni ++serif.plain.korean=NanumMyeongjo ++serif.plain.chinese-big5=AR PL UKai ++serif.plain.chinese-gb18030=AR PL UKai + +-serif.bold.latin-1=DejaVu LGC Serif Bold ++serif.bold.latin-1=DejaVu Serif Bold + serif.bold.japanese-x0208=Sazanami Mincho +-serif.bold.korean=Baekmuk Batang +-serif.bold.chinese-big5=AR PL ZenKai Uni +-serif.bold.chinese-gb18030=AR PL ZenKai Uni ++serif.bold.korean=NanumMyeongjo Bold ++serif.bold.chinese-big5=AR PL UKai ++serif.bold.chinese-gb18030=AR PL UKai + +-serif.italic.latin-1=DejaVu LGC Serif Oblique ++serif.italic.latin-1=DejaVu Serif Italic + serif.italic.japanese-x0208=Sazanami Mincho +-serif.italic.korean=Baekmuk Batang +-serif.italic.chinese-big5=AR PL ZenKai Uni +-serif.italic.chinese-gb18030=AR PL ZenKai Uni ++serif.italic.korean=NanumMyeongjo ++serif.italic.chinese-big5=AR PL UKai ++serif.italic.chinese-gb18030=AR PL UKai + +-serif.bolditalic.latin-1=DejaVu LGC Serif Bold Oblique ++serif.bolditalic.latin-1=DejaVu Serif Bold Italic + serif.bolditalic.japanese-x0208=Sazanami Mincho +-serif.bolditalic.korean=Baekmuk Batang +-serif.bolditalic.chinese-big5=AR PL ZenKai Uni +-serif.bolditalic.chinese-gb18030=AR PL ZenKai Uni ++serif.bolditalic.korean=NanumMyeongjo Bold ++serif.bolditalic.chinese-big5=AR PL UKai ++serif.bolditalic.chinese-gb18030=AR PL UKai + + +-monospaced.plain.latin-1=DejaVu LGC Sans Mono ++monospaced.plain.latin-1=DejaVu Sans Mono + monospaced.plain.japanese-x0208=Sazanami Gothic +-monospaced.plain.korean=Baekmuk Gulim +-monospaced.plain.chinese-big5=AR PL ShanHeiSun Uni +-monospaced.plain.chinese-gb18030=AR PL ShanHeiSun Uni ++monospaced.plain.korean=NanumGothic ++monospaced.plain.chinese-big5=AR PL UMing ++monospaced.plain.chinese-gb18030=AR PL UMing + +-monospaced.bold.latin-1=DejaVu LGC Sans Mono Bold ++monospaced.bold.latin-1=DejaVu Sans Mono Bold + monospaced.bold.japanese-x0208=Sazanami Gothic +-monospaced.bold.korean=Baekmuk Gulim +-monospaced.bold.chinese-big5=AR PL ShanHeiSun Uni +-monospaced.bold.chinese-gb18030=AR PL ShanHeiSun Uni ++monospaced.bold.korean=NanumGothic Bold ++monospaced.bold.chinese-big5=AR PL UMing ++monospaced.bold.chinese-gb18030=AR PL UMing + +-monospaced.italic.latin-1=DejaVu LGC Sans Mono Oblique ++monospaced.italic.latin-1=DejaVu Sans Mono Oblique + monospaced.italic.japanese-x0208=Sazanami Gothic +-monospaced.italic.korean=Baekmuk Gulim +-monospaced.italic.chinese-big5=AR PL ShanHeiSun Uni +-monospaced.italic.chinese-gb18030=AR PL ShanHeiSun Uni ++monospaced.italic.korean=NanumGothic ++monospaced.italic.chinese-big5=AR PL UMing ++monospaced.italic.chinese-gb18030=AR PL UMing + +-monospaced.bolditalic.latin-1=DejaVu LGC Sans Mono Bold Oblique ++monospaced.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique + monospaced.bolditalic.japanese-x0208=Sazanami Gothic +-monospaced.bolditalic.korean=Baekmuk Gulim +-monospaced.bolditalic.chinese-big5=AR PL ShanHeiSun Uni +-monospaced.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni ++monospaced.bolditalic.korean=NanumGothic Bold ++monospaced.bolditalic.chinese-big5=AR PL UMing ++monospaced.bolditalic.chinese-gb18030=AR PL UMing + + +-dialoginput.plain.latin-1=DejaVu LGC Sans Mono ++dialoginput.plain.latin-1=DejaVu Sans Mono + dialoginput.plain.japanese-x0208=Sazanami Gothic +-dialoginput.plain.korean=Baekmuk Gulim +-dialoginput.plain.chinese-big5=AR PL ShanHeiSun Uni +-dialoginput.plain.chinese-gb18030=AR PL ShanHeiSun Uni ++dialoginput.plain.korean=NanumGothic ++dialoginput.plain.chinese-big5=AR PL UMing ++dialoginput.plain.chinese-gb18030=AR PL UMing + +-dialoginput.bold.latin-1=DejaVu LGC Sans Mono Bold ++dialoginput.bold.latin-1=DejaVu Sans Mono Bold + dialoginput.bold.japanese-x0208=Sazanami Gothic +-dialoginput.bold.korean=Baekmuk Gulim +-dialoginput.bold.chinese-big5=AR PL ShanHeiSun Uni +-dialoginput.bold.chinese-gb18030=AR PL ShanHeiSun Uni ++dialoginput.bold.korean=NanumGothic Bold ++dialoginput.bold.chinese-big5=AR PL UMing ++dialoginput.bold.chinese-gb18030=AR PL UMing + +-dialoginput.italic.latin-1=DejaVu LGC Sans Mono Oblique ++dialoginput.italic.latin-1=DejaVu Sans Mono Oblique + dialoginput.italic.japanese-x0208=Sazanami Gothic +-dialoginput.italic.korean=Baekmuk Gulim +-dialoginput.italic.chinese-big5=AR PL ShanHeiSun Uni +-dialoginput.italic.chinese-gb18030=AR PL ShanHeiSun Uni ++dialoginput.italic.korean=NanumGothic ++dialoginput.italic.chinese-big5=AR PL UMing ++dialoginput.italic.chinese-gb18030=AR PL UMing + +-dialoginput.bolditalic.latin-1=DejaVu LGC Sans Mono Bold Oblique ++dialoginput.bolditalic.latin-1=DejaVu Sans Mono Bold Oblique + dialoginput.bolditalic.japanese-x0208=Sazanami Gothic +-dialoginput.bolditalic.korean=Baekmuk Gulim +-dialoginput.bolditalic.chinese-big5=AR PL ShanHeiSun Uni +-dialoginput.bolditalic.chinese-gb18030=AR PL ShanHeiSun Uni ++dialoginput.bolditalic.korean=NanumGothic Bold ++dialoginput.bolditalic.chinese-big5=AR PL UMing ++dialoginput.bolditalic.chinese-gb18030=AR PL UMing + + # Search Sequences + +@@ -166,24 +166,27 @@ + + # Font File Names + +-filename.DejaVu_LGC_Sans=/usr/share/fonts/dejavu-lgc/DejaVuLGCSans.ttf +-filename.DejaVu_LGC_Sans_Bold=/usr/share/fonts/dejavu-lgc/DejaVuLGCSans-Bold.ttf +-filename.DejaVu_LGC_Sans_Oblique=/usr/share/fonts/dejavu-lgc/DejaVuLGCSans-Oblique.ttf +-filename.DejaVu_LGC_Sans_Bold_Oblique=/usr/share/fonts/dejavu-lgc/DejaVuLGCSans-BoldOblique.ttf ++## FIXME: Should not hardcode /usr/local ++filename.DejaVu_Sans=/usr/local/lib/X11/fonts/dejavu/DejaVuSans.ttf ++filename.DejaVu_Sans_Bold=/usr/local/lib/X11/fonts/dejavu/DejaVuSans-Bold.ttf ++filename.DejaVu_Sans_Oblique=/usr/local/lib/X11/fonts/dejavu/DejaVuSans-Oblique.ttf ++filename.DejaVu_Sans_Bold_Oblique=/usr/local/lib/X11/fonts/dejavu/DejaVuSans-BoldOblique.ttf + +-filename.DejaVu_LGC_Sans_Mono=/usr/share/fonts/dejavu-lgc/DejaVuLGCSansMono.ttf +-filename.DejaVu_LGC_Sans_Mono_Bold=/usr/share/fonts/dejavu-lgc/DejaVuLGCSansMono-Bold.ttf +-filename.DejaVu_LGC_Sans_Mono_Oblique=/usr/share/fonts/dejavu-lgc/DejaVuLGCSansMono-Oblique.ttf +-filename.DejaVu_LGC_Sans_Mono_Bold_Oblique=/usr/share/fonts/dejavu-lgc/DejaVuLGCSansMono-BoldOblique.ttf ++filename.DejaVu_Sans_Mono=/usr/local/lib/X11/fonts/dejavu/DejaVuSansMono.ttf ++filename.DejaVu_Sans_Mono_Bold=/usr/local/lib/X11/fonts/dejavu/DejaVuSansMono-Bold.ttf ++filename.DejaVu_Sans_Mono_Oblique=/usr/local/lib/X11/fonts/dejavu/DejaVuSansMono-Oblique.ttf ++filename.DejaVu_Sans_Mono_Bold_Oblique=/usr/local/lib/X11/fonts/dejavu/DejaVuSansMono-BoldOblique.ttf + +-filename.DejaVu_LGC_Serif=/usr/share/fonts/dejavu-lgc/DejaVuLGCSerif.ttf +-filename.DejaVu_LGC_Serif_Bold=/usr/share/fonts/dejavu-lgc/DejaVuLGCSerif-Bold.ttf +-filename.DejaVu_LGC_Serif_Oblique=/usr/share/fonts/dejavu-lgc/DejaVuLGCSerif-Oblique.ttf +-filename.DejaVu_LGC_Serif_Bold_Oblique=/usr/share/fonts/dejavu-lgc/DejaVuLGCSerif-BoldOblique.ttf ++filename.DejaVu_Serif=/usr/local/lib/X11/fonts/dejavu/DejaVuSerif.ttf ++filename.DejaVu_Serif_Bold=/usr/local/lib/X11/fonts/dejavu/DejaVuSerif-Bold.ttf ++filename.DejaVu_Serif_Italic=/usr/local/lib/X11/fonts/dejavu/DejaVuSerif-Italic.ttf ++filename.DejaVu_Serif_Bold_Italic=/usr/local/lib/X11/fonts/dejavu/DejaVuSerif-BoldItalic.ttf + +-filename.Sazanami_Gothic=/usr/share/fonts/japanese/TrueType/sazanami-gothic.ttf +-filename.Sazanami_Mincho=/usr/share/fonts/japanese/TrueType/sazanami-mincho.ttf +-filename.AR_PL_ShanHeiSun_Uni=/usr/share/fonts/chinese/TrueType/uming.ttf +-filename.AR_PL_ZenKai_Uni=/usr/share/fonts/chinese/TrueType/ukai.ttf +-filename.Baekmuk_Gulim=/usr/share/fonts/korean/TrueType/gulim.ttf +-filename.Baekmuk_Batang=/usr/share/fonts/korean/TrueType/batang.ttf ++filename.Sazanami_Gothic=/usr/local/share/font-sazanami/sazanami-gothic.ttf ++filename.Sazanami_Mincho=/usr/local/share/font-sazanami/sazanami-mincho.ttf ++filename.AR_PL_ShanHeiSun_Uni=/usr/local/share/fonts/TrueType/uming.ttc ++filename.AR_PL_ZenKai_Uni=/usr/local/share/fonts/TrueType/ukai.ttc ++filename.NanumGothic=/usr/local/lib/X11/fonts/nanum-ttf/NanumGothic.ttf ++filename.NanumGothic_Bold=/usr/local/lib/X11/fonts/nanum-ttf/NanumGothicBold.ttf ++filename.NanumMyeongjo=/usr/local/lib/X11/fonts/nanum-ttf/NanumMyeongjo.ttf ++filename.NanumMyeongjo_Bold=/usr/local/lib/X11/fonts/nanum-ttf/NanumMyeongjoBold.ttf +--- ./jdk/src/solaris/classes/sun/net/PortConfig.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/net/PortConfig.java Wed Nov 05 12:14:24 2014 -0800 @@ -52,7 +52,7 @@ } else if (os.startsWith("SunOS")) { defaultLower = 32768; @@ -8556,9 +12534,9 @@ + } else if (os.endsWith("BSD") || os.contains("OS X")) { defaultLower = 49152; defaultUpper = 65535; - } else { ---- jdk/src/solaris/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java -+++ jdk/src/solaris/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java + } else if (os.startsWith("AIX")) { +--- ./jdk/src/solaris/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/ch/DefaultAsynchronousChannelProvider.java Wed Nov 05 12:14:24 2014 -0800 @@ -66,7 +66,7 @@ return createProvider("sun.nio.ch.SolarisAsynchronousChannelProvider"); if (osname.equals("Linux")) @@ -8566,10 +12544,10 @@ - if (osname.contains("OS X")) + if (osname.endsWith("BSD") || osname.contains("OS X")) return createProvider("sun.nio.ch.BsdAsynchronousChannelProvider"); - throw new InternalError("platform not recognized"); - } ---- jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java -+++ jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java + if (osname.equals("AIX")) + return createProvider("sun.nio.ch.AixAsynchronousChannelProvider"); +--- ./jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java Wed Nov 05 12:14:24 2014 -0800 @@ -25,10 +25,14 @@ package sun.nio.fs; @@ -8603,8 +12581,8 @@ + new MagicFileTypeDetector()); + } } ---- jdk/src/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java -+++ jdk/src/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java +--- ./jdk/src/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java Wed Nov 05 12:14:24 2014 -0800 @@ -61,6 +61,8 @@ return createProvider("sun.nio.fs.SolarisFileSystemProvider"); if (osname.equals("Linux")) @@ -8613,10 +12591,10 @@ + return createProvider("sun.nio.fs.BsdFileSystemProvider"); if (osname.contains("OS X")) return createProvider("sun.nio.fs.MacOSXFileSystemProvider"); - throw new AssertionError("Platform not recognized"); ---- jdk/src/solaris/classes/sun/print/UnixPrintServiceLookup.java -+++ jdk/src/solaris/classes/sun/print/UnixPrintServiceLookup.java -@@ -130,6 +130,7 @@ + if (osname.equals("AIX")) +--- ./jdk/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Wed Nov 05 12:14:24 2014 -0800 +@@ -161,6 +161,7 @@ static boolean isBSD() { return (osname.equals("Linux") || @@ -8624,7 +12602,7 @@ osname.contains("OS X")); } -@@ -140,12 +141,12 @@ +@@ -175,12 +176,12 @@ static int cmdIndex = UNINITIALIZED; String[] lpcFirstCom = { @@ -8639,8 +12617,8 @@ "/usr/sbin/lpc status all | grep -E '^[ 0-9a-zA-Z_-]*@' | awk -F'@' '{print $1}' | sort" }; ---- jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java -+++ jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java +--- ./jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java Wed Nov 05 12:14:24 2014 -0800 @@ -266,7 +266,7 @@ try { b = s.getBytes("UTF-8"); @@ -8650,8 +12628,8 @@ } BsdVirtualMachine.write(fd, b, 0, b.length); } ---- jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_PCM.c -+++ jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_PCM.c +--- ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_PCM.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_PCM.c Wed Nov 05 12:14:24 2014 -0800 @@ -140,7 +140,7 @@ (float) ((int) sr->samp_rates[s]), DAUDIO_PCM, /* encoding - let's only do PCM */ @@ -8661,8 +12639,8 @@ FALSE /* little endian */ #else (bits[b] > 8)?TRUE:FALSE /* big endian */ ---- jdk/src/solaris/native/common/jni_util_md.c -+++ jdk/src/solaris/native/common/jni_util_md.c +--- ./jdk/src/solaris/native/common/jni_util_md.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/common/jni_util_md.c Wed Nov 05 12:14:24 2014 -0800 @@ -28,6 +28,7 @@ #include "jni.h" #include "jni_util.h" @@ -8671,8 +12649,8 @@ jstring nativeNewStringPlatform(JNIEnv *env, const char *str) { return NULL; ---- jdk/src/solaris/native/java/lang/java_props_md.c -+++ jdk/src/solaris/native/java/lang/java_props_md.c +--- ./jdk/src/solaris/native/java/lang/java_props_md.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/java/lang/java_props_md.c Wed Nov 05 12:14:24 2014 -0800 @@ -151,7 +151,7 @@ lc = setlocale(cat, NULL); #endif @@ -8707,8 +12685,8 @@ /* user properties */ { ---- jdk/src/solaris/native/java/net/Inet4AddressImpl.c -+++ jdk/src/solaris/native/java/net/Inet4AddressImpl.c +--- ./jdk/src/solaris/native/java/net/Inet4AddressImpl.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/Inet4AddressImpl.c Wed Nov 05 12:14:24 2014 -0800 @@ -36,20 +36,13 @@ #include #include @@ -9027,8 +13005,8 @@ #define SET_NONBLOCKING(fd) { \ int flags = fcntl(fd, F_GETFL); \ flags |= O_NONBLOCK; \ ---- jdk/src/solaris/native/java/net/Inet6AddressImpl.c -+++ jdk/src/solaris/native/java/net/Inet6AddressImpl.c +--- ./jdk/src/solaris/native/java/net/Inet6AddressImpl.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/Inet6AddressImpl.c Wed Nov 05 12:14:24 2014 -0800 @@ -33,7 +33,7 @@ #include #include @@ -9059,9 +13037,9 @@ /* * If we're looking up the local machine, attempt to get the address * from getifaddrs. This ensures we get an IPv6 address for the local ---- jdk/src/solaris/native/java/net/NetworkInterface.c -+++ jdk/src/solaris/native/java/net/NetworkInterface.c -@@ -60,14 +60,18 @@ +--- ./jdk/src/solaris/native/java/net/NetworkInterface.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/NetworkInterface.c Wed Nov 05 12:14:24 2014 -0800 +@@ -67,14 +67,18 @@ #include #include #include @@ -9082,9 +13060,9 @@ #include "jvm.h" #include "jni_util.h" ---- jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c -+++ jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c -@@ -2176,7 +2176,7 @@ +--- ./jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c Wed Nov 05 12:14:24 2014 -0800 +@@ -2184,7 +2184,7 @@ } } #endif @@ -9093,8 +13071,8 @@ if (family == AF_INET6 && index == 0) { index = getDefaultScopeID(env); } ---- jdk/src/solaris/native/java/net/net_util_md.c -+++ jdk/src/solaris/native/java/net/net_util_md.c +--- ./jdk/src/solaris/native/java/net/net_util_md.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/net_util_md.c Wed Nov 05 12:14:24 2014 -0800 @@ -87,7 +87,7 @@ void setDefaultScopeID(JNIEnv *env, struct sockaddr *him) @@ -9104,19 +13082,19 @@ static jclass ni_class = NULL; static jfieldID ni_defaultIndexID; if (ni_class == NULL) { ---- jdk/src/solaris/native/java/net/net_util_md.h -+++ jdk/src/solaris/native/java/net/net_util_md.h -@@ -37,7 +37,7 @@ - #endif - - --#if defined(__linux__) || defined(MACOSX) -+#if defined(__linux__) || defined(_ALLBSD_SOURCE) +--- ./jdk/src/solaris/native/java/net/net_util_md.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/java/net/net_util_md.h Wed Nov 05 12:14:24 2014 -0800 +@@ -47,7 +47,7 @@ + close subroutine does not return until the select call returns. + ... + */ +-#if defined(__linux__) || defined(MACOSX) || defined (_AIX) ++#if defined(__linux__) || defined(_ALLBSD_SOURCE) || defined (_AIX) extern int NET_Timeout(int s, long timeout); extern int NET_Read(int s, void* buf, size_t len); extern int NET_RecvFrom(int s, void *buf, int len, unsigned int flags, ---- jdk/src/solaris/native/java/util/TimeZone_md.c -+++ jdk/src/solaris/native/java/util/TimeZone_md.c +--- ./jdk/src/solaris/native/java/util/TimeZone_md.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/java/util/TimeZone_md.c Wed Nov 05 12:14:24 2014 -0800 @@ -52,7 +52,11 @@ #if defined(__linux__) || defined(_ALLBSD_SOURCE) @@ -9129,16 +13107,16 @@ static const char *ZONEINFO_DIR = "/usr/share/zoneinfo"; static const char *DEFAULT_ZONEINFO_FILE = "/etc/localtime"; #else -@@ -123,7 +127,7 @@ +@@ -126,7 +130,7 @@ return NULL; } --#if defined(__linux__) || defined(MACOSX) || (defined(__solaris__) \ -+#if defined(__linux__) || defined(_ALLBSD_SOURCE) || (defined(__solaris__) \ +-#if defined(_AIX) || defined(__linux__) || defined(MACOSX) || (defined(__solaris__) \ ++#if defined(_AIX) || defined(__linux__) || defined(_ALLBSD_SOURCE) || (defined(__solaris__) \ && (defined(_POSIX_PTHREAD_SEMANTICS) || defined(_LP64))) while (readdir_r(dirp, entry, &dp) == 0 && dp != NULL) { #else -@@ -211,7 +215,7 @@ +@@ -214,7 +218,7 @@ return tz; } @@ -9147,16 +13125,16 @@ /* * Performs Linux specific mapping and returns a zone ID -@@ -227,7 +231,7 @@ +@@ -230,7 +234,7 @@ char *buf; size_t size; -#ifdef __linux__ -+#if defined(__linux__) || defined(__FreeBSD__) ++#if defined(__linux__) || defined(_ALLBSD_SOURCE) /* * Try reading the /etc/timezone file for Debian distros. There's * no spec of the file format available. This parsing assumes that -@@ -251,7 +255,7 @@ +@@ -254,7 +258,7 @@ return tz; } } @@ -9165,7 +13143,7 @@ /* * Next, try /etc/localtime to find the zone ID. -@@ -677,7 +681,7 @@ +@@ -719,7 +723,7 @@ * Returns a GMT-offset-based zone ID. (e.g., "GMT-08:00") */ @@ -9174,7 +13152,7 @@ char * getGMTOffsetID() -@@ -693,10 +697,10 @@ +@@ -735,10 +739,10 @@ local_tm = localtime(&clock); if (local_tm->tm_gmtoff >= 0) { offset = (time_t) local_tm->tm_gmtoff; @@ -9187,15 +13165,23 @@ } sprintf(buf, (const char *)"GMT%c%02d:%02d", sign, (int)(offset/3600), (int)((offset%3600)/60)); -@@ -738,4 +742,4 @@ +@@ -780,7 +784,7 @@ sign, (int)(offset/3600), (int)((offset%3600)/60)); return strdup(buf); } -#endif /* MACOSX */ +#endif /* _ALLBSD_SOURCE */ ---- jdk/src/solaris/native/sun/awt/awt_Font.c -+++ jdk/src/solaris/native/sun/awt/awt_Font.c -@@ -260,7 +260,7 @@ + + #ifdef _AIX + static char * +@@ -878,4 +882,3 @@ + return javatz; + } + #endif +- +--- ./jdk/src/solaris/native/sun/awt/awt_Font.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_Font.c Wed Nov 05 12:14:24 2014 -0800 +@@ -255,7 +255,7 @@ if (strcmp(style, "regular") == 0) { altstyle = "roman"; } @@ -9204,8 +13190,8 @@ if (!strcmp(family, "lucidasans")) { family = "lucida"; } ---- jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c -+++ jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c +--- ./jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c Wed Nov 05 12:14:24 2014 -0800 @@ -120,7 +120,7 @@ */ @@ -9215,7 +13201,7 @@ typedef struct { int screen_number; short x_org; -@@ -423,20 +423,15 @@ +@@ -426,20 +426,15 @@ if (XQueryExtension(awt_display, "RENDER", &major_opcode, &first_event, &first_error)) { @@ -9240,7 +13226,7 @@ if (xrenderLibHandle == NULL) { xrenderLibHandle = dlopen("/usr/sfw/lib/libXrender.so.1", RTLD_LAZY | RTLD_GLOBAL); -@@ -580,7 +575,7 @@ +@@ -583,7 +578,7 @@ } #ifndef HEADLESS @@ -9249,7 +13235,7 @@ static void xinerama_init_linux() { void* libHandle = NULL; -@@ -631,7 +626,7 @@ +@@ -634,7 +629,7 @@ } } #endif @@ -9258,7 +13244,7 @@ static void xinerama_init_solaris() { void* libHandle = NULL; -@@ -691,11 +686,11 @@ +@@ -694,11 +689,11 @@ } DTRACE_PRINTLN("Xinerama extension is available"); @@ -9272,7 +13258,7 @@ } #endif /* HEADLESS */ -@@ -1589,7 +1584,7 @@ +@@ -1592,7 +1587,7 @@ { jobject point = NULL; #ifndef HEADLESS /* return NULL in HEADLESS, Linux */ @@ -9281,7 +13267,7 @@ int x,y; AWT_LOCK(); -@@ -1602,7 +1597,7 @@ +@@ -1605,7 +1600,7 @@ DTRACE_PRINTLN("unable to call XineramaSolarisCenterFunc: symbol is null"); } AWT_FLUSH_UNLOCK(); @@ -9290,8 +13276,8 @@ #endif /* HEADLESS */ return point; } ---- jdk/src/solaris/native/sun/awt/awt_InputMethod.c -+++ jdk/src/solaris/native/sun/awt/awt_InputMethod.c +--- ./jdk/src/solaris/native/sun/awt/awt_InputMethod.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_InputMethod.c Wed Nov 05 12:14:24 2014 -0800 @@ -52,7 +52,7 @@ XIMPreeditDrawCallbackStruct *); static void PreeditCaretCallback(XIC, XPointer, @@ -9336,7 +13322,7 @@ StatusWindow *statusWindow; /* our own status window */ #endif char *lookup_buf; /* buffer used for XmbLookupString */ -@@ -369,7 +369,7 @@ +@@ -370,7 +370,7 @@ static void freeX11InputMethodData(JNIEnv *env, X11InputMethodData *pX11IMData) { @@ -9345,7 +13331,7 @@ if (pX11IMData->statusWindow != NULL){ StatusWindow *sw = pX11IMData->statusWindow; XFreeGC(awt_display, sw->lightGC); -@@ -472,7 +472,7 @@ +@@ -473,7 +473,7 @@ pX11IMData = getX11InputMethodData(env, currentX11InputMethodInstance); if (pX11IMData == NULL) { @@ -9354,7 +13340,7 @@ return False; #else return result; -@@ -480,7 +480,7 @@ +@@ -481,7 +481,7 @@ } if ((ic = pX11IMData->current_ic) == (XIC)0){ @@ -9363,7 +13349,7 @@ return False; #else return result; -@@ -572,7 +572,7 @@ +@@ -573,7 +573,7 @@ return result; } @@ -9372,7 +13358,7 @@ static StatusWindow *createStatusWindow( Window parent) { StatusWindow *statusWindow; -@@ -885,7 +885,7 @@ +@@ -886,7 +886,7 @@ } } } @@ -9381,7 +13367,7 @@ /* * Creates two XICs, one for active clients and the other for passive * clients. All information on those XICs are stored in the -@@ -929,7 +929,7 @@ +@@ -930,7 +930,7 @@ return FALSE ; } @@ -9390,7 +13376,7 @@ on_the_spot_styles |= XIMStatusNothing; /*kinput does not support XIMPreeditCallbacks and XIMStatusArea -@@ -942,9 +942,9 @@ +@@ -943,9 +943,9 @@ break; } } @@ -9402,7 +13388,7 @@ for (i = 0; i < im_styles->count_styles; i++) { active_styles |= im_styles->supported_styles[i] & on_the_spot_styles; -@@ -992,7 +992,7 @@ +@@ -993,7 +993,7 @@ NULL); if (preedit == (XVaNestedList)NULL) goto err; @@ -9411,7 +13397,7 @@ /*always try XIMStatusCallbacks for active client...*/ { status = (XVaNestedList)XVaCreateNestedList(0, -@@ -1014,7 +1014,7 @@ +@@ -1015,7 +1015,7 @@ XFree((void *)status); XFree((void *)preedit); } @@ -9420,7 +13406,7 @@ pX11IMData->ic_active = XCreateIC(X11im, XNClientWindow, w, XNFocusWindow, w, -@@ -1022,7 +1022,7 @@ +@@ -1023,7 +1023,7 @@ XNPreeditAttributes, preedit, NULL); XFree((void *)preedit); @@ -9429,7 +13415,7 @@ pX11IMData->ic_passive = XCreateIC(X11im, XNClientWindow, w, XNFocusWindow, w, -@@ -1181,7 +1181,7 @@ +@@ -1189,7 +1189,7 @@ } @@ -9438,7 +13424,7 @@ static void StatusStartCallback(XIC ic, XPointer client_data, XPointer call_data) { -@@ -1249,7 +1249,7 @@ +@@ -1257,7 +1257,7 @@ finally: AWT_UNLOCK(); } @@ -9447,7 +13433,7 @@ static void CommitStringCallback(XIC ic, XPointer client_data, XPointer call_data) { JNIEnv *env = GetJNIEnv(); -@@ -1346,14 +1346,14 @@ +@@ -1354,14 +1354,14 @@ /* Use IMInstantiate call back only on Linux, as there is a bug in Solaris (4768335) */ @@ -9464,7 +13450,7 @@ } #endif -@@ -1388,9 +1388,9 @@ +@@ -1396,9 +1396,9 @@ globalRef = (*env)->NewGlobalRef(env, this); pX11IMData->x11inputmethod = globalRef; @@ -9476,7 +13462,7 @@ pX11IMData->lookup_buf = 0; pX11IMData->lookup_buf_len = 0; -@@ -1437,14 +1437,14 @@ +@@ -1448,14 +1448,14 @@ setXICFocus(pX11IMData->current_ic, req); currentX11InputMethodInstance = pX11IMData->x11inputmethod; currentFocusWindow = w; @@ -9493,7 +13479,7 @@ onoffStatusWindow(pX11IMData, 0, False); if (pX11IMData->current_ic != NULL) #endif -@@ -1461,7 +1461,7 @@ +@@ -1472,7 +1472,7 @@ Java_sun_awt_X11InputMethod_turnoffStatusWindow(JNIEnv *env, jobject this) { @@ -9502,7 +13488,7 @@ X11InputMethodData *pX11IMData; StatusWindow *statusWindow; -@@ -1629,7 +1629,7 @@ +@@ -1640,7 +1640,7 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_XInputMethod_adjustStatusWindow (JNIEnv *env, jobject this, jlong window) { @@ -9511,8 +13497,8 @@ AWT_LOCK(); adjustStatusWindow(window); AWT_UNLOCK(); ---- jdk/src/solaris/native/sun/awt/awt_Robot.c -+++ jdk/src/solaris/native/sun/awt/awt_Robot.c +--- ./jdk/src/solaris/native/sun/awt/awt_Robot.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/awt_Robot.c Wed Nov 05 12:14:24 2014 -0800 @@ -45,7 +45,7 @@ #include "wsutils.h" #include "list.h" @@ -9522,8 +13508,8 @@ #include #endif ---- jdk/src/solaris/native/sun/awt/extutil.h -+++ jdk/src/solaris/native/sun/awt/extutil.h +--- ./jdk/src/solaris/native/sun/awt/extutil.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/extutil.h Wed Nov 05 12:14:24 2014 -0800 @@ -58,7 +58,7 @@ */ /* $XFree86: xc/include/extensions/extutil.h,v 1.5 2001/01/17 17:53:20 dawes Exp $ */ @@ -9539,8 +13525,8 @@ -#endif /* __linux__ || MACOSX */ +#endif /* __linux__ || _ALLBSD_SOURCE */ ---- jdk/src/solaris/native/sun/awt/fontpath.c -+++ jdk/src/solaris/native/sun/awt/fontpath.c +--- ./jdk/src/solaris/native/sun/awt/fontpath.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/awt/fontpath.c Wed Nov 05 12:14:24 2014 -0800 @@ -23,9 +23,9 @@ * questions. */ @@ -9553,19 +13539,18 @@ #include #include #include -@@ -64,7 +64,7 @@ - - #define MAXFDIRS 512 /* Max number of directories that contain fonts */ - --#if !defined(__linux__) -+#if !defined(__linux__) && !defined(_ALLBSD_SOURCE) - /* - * This can be set in the makefile to "/usr/X11" if so desired. - */ -@@ -114,6 +114,21 @@ +@@ -113,7 +113,6 @@ + OPENWINHOMELIB "locale/ar/X11/fonts/Type1", + NULL, /* terminates the list */ + }; +- + #elif defined( __linux__) + /* All the known interesting locations we have discovered on + * various flavors of Linux +@@ -140,6 +139,20 @@ + "/usr/lpp/X11/lib/X11/fonts/TrueType", /* from X11.fnt.ucs.ttf */ NULL, /* terminates the list */ }; - +#elif defined(_ALLBSD_SOURCE) +static char *fullBSDFontPath[] = { + PACKAGE_PATH "/lib/X11/fonts/TrueType", @@ -9580,11 +13565,10 @@ + PACKAGE_PATH "/share/fonts/Type1", + NULL, /* terminates the list */ +}; -+ - #else /* __linux */ - /* All the known interesting locations we have discovered on - * various flavors of Linux -@@ -370,7 +385,7 @@ + #endif + + static char **getFontConfigLocations(); +@@ -381,7 +394,7 @@ #endif /* !HEADLESS */ @@ -9593,16 +13577,16 @@ /* from awt_LoadLibrary.c */ JNIEXPORT jboolean JNICALL AWTIsHeadless(); #endif -@@ -497,6 +512,8 @@ - - #if defined(__linux__) - knowndirs = fullLinuxFontPath; +@@ -512,6 +525,8 @@ + knowndirs = fullSolarisFontPath; + #elif defined(_AIX) + knowndirs = fullAixFontPath; +#elif defined(_ALLBSD_SOURCE) + knowndirs = fullBSDFontPath; - #else /* IF SOLARIS */ - knowndirs = fullSolarisFontPath; #endif -@@ -507,8 +524,8 @@ + /* REMIND: this code requires to be executed when the GraphicsEnvironment + * is already initialised. That is always true, but if it were not so, +@@ -519,8 +534,8 @@ * be initialised. */ #ifndef HEADLESS @@ -9613,7 +13597,7 @@ if (!AWTIsHeadless()) { /* .. so need to call a function to check */ #endif /* Using the X11 font path to locate font files is now a fallback -@@ -523,7 +540,7 @@ +@@ -535,7 +550,7 @@ x11dirs = getX11FontPath(); } AWT_UNLOCK(); @@ -9622,17 +13606,17 @@ } #endif #endif /* !HEADLESS */ -@@ -1203,7 +1220,7 @@ +@@ -1230,7 +1245,7 @@ */ if (fontformat != NULL && (strcmp((char*)fontformat, "TrueType") != 0) --#ifdef __linux__ -+#if defined(__linux__) || defined(_ALLBSD_SOURCE) +-#if defined(__linux__) || defined(_AIX) ++#if defined(__linux__) || defined(_AIX) || defined(_ALLBSD_SOURCE) && (strcmp((char*)fontformat, "Type 1") != 0) #endif ) { ---- jdk/src/solaris/native/sun/java2d/j2d_md.h -+++ jdk/src/solaris/native/sun/java2d/j2d_md.h +--- ./jdk/src/solaris/native/sun/java2d/j2d_md.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/java2d/j2d_md.h Wed Nov 05 12:14:24 2014 -0800 @@ -28,11 +28,11 @@ #include @@ -9648,8 +13632,8 @@ typedef unsigned char jubyte; typedef unsigned short jushort; ---- jdk/src/solaris/native/sun/java2d/loops/mlib_ImageZoom_NN.c -+++ jdk/src/solaris/native/sun/java2d/loops/mlib_ImageZoom_NN.c +--- ./jdk/src/solaris/native/sun/java2d/loops/mlib_ImageZoom_NN.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/java2d/loops/mlib_ImageZoom_NN.c Wed Nov 05 12:14:24 2014 -0800 @@ -63,9 +63,6 @@ * MLIB_EDGE_SRC_PADDED */ @@ -9754,8 +13738,8 @@ LOGIC(da[0], dtmp, dtmp1, |); } else { /* aligned */ ---- jdk/src/solaris/native/sun/java2d/loops/vis_FuncArray.c -+++ jdk/src/solaris/native/sun/java2d/loops/vis_FuncArray.c +--- ./jdk/src/solaris/native/sun/java2d/loops/vis_FuncArray.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/java2d/loops/vis_FuncArray.c Wed Nov 05 12:14:24 2014 -0800 @@ -804,7 +804,7 @@ static int initialized; static int usevis = JNI_TRUE; @@ -9765,8 +13749,8 @@ # define ULTRA_CHIP "sparc64" #else # define ULTRA_CHIP "sun4u" ---- jdk/src/solaris/native/sun/management/OperatingSystemImpl.c -+++ jdk/src/solaris/native/sun/management/OperatingSystemImpl.c +--- ./jdk/src/solaris/native/sun/management/OperatingSystemImpl.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/management/OperatingSystemImpl.c Wed Nov 05 12:14:24 2014 -0800 @@ -56,6 +56,9 @@ #include #include @@ -9775,9 +13759,9 @@ +#include +#endif - static jlong page_size = 0; - -@@ -164,6 +167,25 @@ + #if defined(_AIX) + #include +@@ -168,6 +171,25 @@ throw_internal_error(env, "sysctlbyname failed"); } return available ? (jlong)vmusage.xsu_avail : (jlong)vmusage.xsu_total; @@ -9803,7 +13787,7 @@ #else /* _ALLBSD_SOURCE */ /* * XXXBSD: there's no way available to get swap info in -@@ -239,11 +261,30 @@ +@@ -243,11 +265,30 @@ throw_internal_error(env, "task_info failed"); } return t_info.virtual_size; @@ -9836,7 +13820,7 @@ return (64 * MB); #endif } -@@ -320,11 +361,27 @@ +@@ -324,11 +365,27 @@ return -1; } return (jlong)vm_stats.free_count * page_size; @@ -9864,9 +13848,9 @@ - // throw_internal_error(env, "unimplemented in FreeBSD") + // throw_internal_error(env, "unimplemented in BSD") return (128 * MB); - #else // solaris / linux - jlong num_avail_physical_pages = sysconf(_SC_AVPHYS_PAGES); -@@ -336,13 +393,19 @@ + #elif defined(_AIX) + perfstat_memory_total_t memory_info; +@@ -346,13 +403,19 @@ Java_sun_management_OperatingSystemImpl_getTotalPhysicalMemorySize (JNIEnv *env, jobject mbean) { @@ -9887,7 +13871,7 @@ rlen = sizeof(result); if (sysctl(mib, 2, &result, &rlen, NULL, 0) != 0) { throw_internal_error(env, "sysctl failed"); -@@ -356,6 +419,11 @@ +@@ -372,6 +435,11 @@ } @@ -9899,7 +13883,7 @@ JNIEXPORT jlong JNICALL Java_sun_management_OperatingSystemImpl_getOpenFileDescriptorCount -@@ -405,21 +473,15 @@ +@@ -421,12 +489,6 @@ free(fds); return nfiles; @@ -9912,70 +13896,17 @@ #else /* solaris/linux */ DIR *dirp; struct dirent dbuf; - struct dirent* dentp; - jlong fds = 0; +@@ -444,7 +506,7 @@ -- dirp = opendir("/proc/self/fd"); -+ dirp = opendir(FD_DIR); + dirp = opendir(FD_DIR); if (dirp == NULL) { - throw_internal_error(env, "Unable to open directory /proc/self/fd"); + throw_internal_error(env, "Unable to open directory " FD_DIR); return -1; } ---- jdk/src/solaris/native/sun/nio/ch/NativeThread.c -+++ jdk/src/solaris/native/sun/nio/ch/NativeThread.c -@@ -33,12 +33,20 @@ - #include "nio_util.h" - - --#ifdef __linux__ -+#if defined(__linux__) || defined(_ALLBSD_SOURCE) -+#if defined(__linux__) - #include - #include - - /* Also defined in src/solaris/native/java/net/linux_close.c */ - #define INTERRUPT_SIGNAL (__SIGRTMAX - 2) -+#else -+#include -+#include -+ -+/* Also defined in src/solaris/native/java/net/bsd_close.c */ -+#define INTERRUPT_SIGNAL SIGIO -+#endif - - static void - nullHandler(int sig) -@@ -51,7 +59,7 @@ - JNIEXPORT void JNICALL - Java_sun_nio_ch_NativeThread_init(JNIEnv *env, jclass cl) - { --#ifdef __linux__ -+#if defined(__linux__) || defined(_ALLBSD_SOURCE) - - /* Install the null handler for INTERRUPT_SIGNAL. This might overwrite the - * handler previously installed by java/net/linux_close.c, but that's okay -@@ -74,7 +82,7 @@ - JNIEXPORT jlong JNICALL - Java_sun_nio_ch_NativeThread_current(JNIEnv *env, jclass cl) - { --#ifdef __linux__ -+#if defined(__linux__) || defined(_ALLBSD_SOURCE) - return (long)pthread_self(); - #else - return -1; -@@ -84,7 +92,7 @@ - JNIEXPORT void JNICALL - Java_sun_nio_ch_NativeThread_signal(JNIEnv *env, jclass cl, jlong thread) - { --#ifdef __linux__ -+#if defined(__linux__) || defined(_ALLBSD_SOURCE) - if (pthread_kill((pthread_t)thread, INTERRUPT_SIGNAL)) - JNU_ThrowIOExceptionWithLastError(env, "Thread signal failed"); - #endif ---- jdk/src/solaris/native/sun/nio/ch/sctp/Sctp.h -+++ jdk/src/solaris/native/sun/nio/ch/sctp/Sctp.h +--- ./jdk/src/solaris/native/sun/nio/ch/sctp/Sctp.h Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/ch/sctp/Sctp.h Wed Nov 05 12:14:24 2014 -0800 @@ -67,7 +67,7 @@ @@ -10024,8 +13955,8 @@ jboolean loadSocketExtensionFuncs(JNIEnv* env); #endif /* !SUN_NIO_CH_SCTP_H */ ---- jdk/src/solaris/native/sun/nio/ch/sctp/SctpNet.c -+++ jdk/src/solaris/native/sun/nio/ch/sctp/SctpNet.c +--- ./jdk/src/solaris/native/sun/nio/ch/sctp/SctpNet.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/ch/sctp/SctpNet.c Wed Nov 05 12:14:24 2014 -0800 @@ -58,6 +58,7 @@ */ jboolean loadSocketExtensionFuncs @@ -10042,8 +13973,8 @@ funcsLoaded = JNI_TRUE; return JNI_TRUE; ---- jdk/src/solaris/native/sun/nio/fs/MagicFileTypeDetector.c -+++ jdk/src/solaris/native/sun/nio/fs/MagicFileTypeDetector.c +--- ./jdk/src/solaris/native/sun/nio/fs/MagicFileTypeDetector.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/nio/fs/MagicFileTypeDetector.c Wed Nov 05 12:14:24 2014 -0800 @@ -31,6 +31,12 @@ #include #include @@ -10066,8 +13997,8 @@ if (magic_handle == NULL) { return JNI_FALSE; } ---- jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c -+++ jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c +--- ./jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c Wed Nov 05 12:14:24 2014 -0800 @@ -37,7 +37,9 @@ #include #include @@ -10078,8 +14009,8 @@ #include #include ---- jdk/src/solaris/native/sun/xawt/XWindow.c -+++ jdk/src/solaris/native/sun/xawt/XWindow.c +--- ./jdk/src/solaris/native/sun/xawt/XWindow.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/solaris/native/sun/xawt/XWindow.c Wed Nov 05 12:14:24 2014 -0800 @@ -886,7 +886,7 @@ { KeySym originalKeysym = *keysym; @@ -10089,8 +14020,8 @@ /* The following code on Linux will cause the keypad keys * not to echo on JTextField when the NumLock is on. The * keysyms will be 0, because the last parameter 2 is not defined. ---- jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp -+++ jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp +--- ./jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp Wed Nov 05 12:14:24 2014 -0800 @@ -308,7 +308,7 @@ DAUDIO_PCM, (bitsArray[bitIndex]==8)?FALSE:TRUE, /* signed */ @@ -10109,45 +14040,27 @@ isBigEndian #else !isBigEndian ---- make/Main.gmk -+++ make/Main.gmk -@@ -58,7 +58,11 @@ - - # Setup number of jobs to use. -jN is unfortunately not available for us to parse from the command line, - # hence this workaround. -+ifdef JOBS -+ifneq ($(JOBS),0) - MAKE_ARGS:=$(MAKE_ARGS) -j$(JOBS) -+endif -+endif - - ### Main targets - ---- make/common/MakeBase.gmk -+++ make/common/MakeBase.gmk -@@ -365,8 +365,8 @@ - - # This is to be called by all SetupFoo macros - define LogSetupMacroEntry -- $(if $(27),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk)) -- $(if $(findstring $(LOG_LEVEL),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26,$(if $($i),$(NEWLINE) $(strip [$i] $($i)))))) -+ $(if $(30),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk)) -+ $(if $(findstring $(LOG_LEVEL),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29,$(if $($i),$(NEWLINE) $(strip [$i] $($i)))))) - endef - - # Make directory without forking mkdir if not needed ---- make/common/NativeCompilation.gmk -+++ make/common/NativeCompilation.gmk -@@ -151,9 +151,9 @@ - # CC the compiler to use, default is $(CC) - # LDEXE the linker to use for linking executables, default is $(LDEXE) - # OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST -- $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) -- $(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25),$(26)) -- $(if $(27),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk)) -+ $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) -+ $(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25),$(26),$(27),$(28),$(29)) -+ $(if $(30),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk)) - - ifneq (,$$($1_BIN)) - $$(error BIN has been replaced with OBJECT_DIR) +--- ./jdk/src/windows/native/sun/windows/awt_Component.cpp Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/src/windows/native/sun/windows/awt_Component.cpp Wed Nov 05 12:14:24 2014 -0800 +@@ -3960,7 +3960,6 @@ + DASSERT(stringCls); + CHECK_NULL(stringCls); + clauseReading = env->NewObjectArray(cClause, stringCls, NULL); +- env->DeleteLocalRef(stringCls); + DASSERT(clauseReading); + CHECK_NULL(clauseReading); + for (int i=0; iSetObjectArrayElement(clauseReading, i, rgClauseReading[i]); +--- ./langtools/.hgtags Mon Sep 08 12:38:00 2014 -0700 ++++ ./langtools/.hgtags Wed Nov 05 12:14:12 2014 -0800 +@@ -329,3 +329,4 @@ + a340d68b020585cad7aa6e38d1aafb19ad0e4e07 jdk8u25-b14 + 6e0c19cd42d7c4d307bea26840ee831cbd14e2fc jdk8u25-b15 + 7fa6fa7cc204de988e224c6f8f75e62128fa84cd jdk8u25-b16 ++53ca196be1ae098466976c017b166d4ce180c36f jdk8u25-b17 +--- ./nashorn/.hgtags Mon Sep 08 12:38:15 2014 -0700 ++++ ./nashorn/.hgtags Wed Nov 05 12:14:13 2014 -0800 +@@ -317,3 +317,4 @@ + 6a93467eaa36f732b84ecd463e046c4066fef40c jdk8u25-b14 + 71e8403a2f8279315419adf5f4e9d6b232b6835c jdk8u25-b15 + 1500138ce513600457be6bfa10979ecce6515aa6 jdk8u25-b16 ++4b9cc65dd24d398c4f921c0beccfb8caeaaaf584 jdk8u25-b17 diff --git a/java/openjdk8/files/patch-bsd-test b/java/openjdk8/files/patch-bsd-test index bcbc59eeac96..3e2c3aa1d0eb 100644 --- a/java/openjdk8/files/patch-bsd-test +++ b/java/openjdk8/files/patch-bsd-test @@ -1,5 +1,5 @@ ---- hotspot/test/compiler/5091921/Test7005594.sh -+++ hotspot/test/compiler/5091921/Test7005594.sh +--- ./hotspot/test/compiler/5091921/Test7005594.sh Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/test/compiler/5091921/Test7005594.sh Wed Nov 05 15:01:44 2014 -0800 @@ -60,6 +60,15 @@ # Windows/MKS MEM=`"$ROOTDIR/mksnt/sysinf" memory -v | grep "Total Physical Memory: " | sed 's/Total Physical Memory: *//g'` @@ -16,8 +16,8 @@ else echo "Unable to determine amount of physical memory on the machine" fi ---- hotspot/test/compiler/6894807/Test6894807.sh -+++ hotspot/test/compiler/6894807/Test6894807.sh +--- ./hotspot/test/compiler/6894807/Test6894807.sh Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/test/compiler/6894807/Test6894807.sh Wed Nov 05 15:01:44 2014 -0800 @@ -21,7 +21,7 @@ # set platform-dependent variables OS=`uname -s` @@ -27,8 +27,8 @@ NULL=/dev/null PS=":" FS="/" ---- hotspot/test/runtime/7110720/Test7110720.sh -+++ hotspot/test/runtime/7110720/Test7110720.sh +--- ./hotspot/test/runtime/7110720/Test7110720.sh Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/test/runtime/7110720/Test7110720.sh Wed Nov 05 15:01:44 2014 -0800 @@ -28,7 +28,7 @@ # set platform-dependent variables OS=`uname -s` @@ -38,8 +38,8 @@ FS="/" RM=/bin/rm CP=/bin/cp ---- hotspot/test/test_env.sh -+++ hotspot/test/test_env.sh +--- ./hotspot/test/test_env.sh Mon Sep 08 12:35:01 2014 -0700 ++++ ./hotspot/test/test_env.sh Wed Nov 05 15:01:44 2014 -0800 @@ -53,7 +53,7 @@ # set platform-dependent variables OS=`uname -s` @@ -49,52 +49,52 @@ NULL=/dev/null PS=":" FS="/" ---- jdk/test/com/sun/corba/5036554/TestCorbaBug.sh -+++ jdk/test/com/sun/corba/5036554/TestCorbaBug.sh +--- ./jdk/test/com/sun/corba/5036554/TestCorbaBug.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/com/sun/corba/5036554/TestCorbaBug.sh Wed Nov 05 12:14:24 2014 -0800 @@ -48,7 +48,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/com/sun/corba/cachedSocket/7056731.sh -+++ jdk/test/com/sun/corba/cachedSocket/7056731.sh +--- ./jdk/test/com/sun/corba/cachedSocket/7056731.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/com/sun/corba/cachedSocket/7056731.sh Wed Nov 05 12:14:24 2014 -0800 @@ -31,7 +31,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/com/sun/jdi/ImmutableResourceTest.sh -+++ jdk/test/com/sun/jdi/ImmutableResourceTest.sh +--- ./jdk/test/com/sun/jdi/ImmutableResourceTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/com/sun/jdi/ImmutableResourceTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -56,7 +56,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PATHSEP=":" ;; ---- jdk/test/com/sun/jdi/JITDebug.sh -+++ jdk/test/com/sun/jdi/JITDebug.sh +--- ./jdk/test/com/sun/jdi/JITDebug.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/com/sun/jdi/JITDebug.sh Wed Nov 05 12:14:24 2014 -0800 @@ -63,7 +63,7 @@ OS=`uname -s` export TRANSPORT_METHOD case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PATHSEP=":" TRANSPORT_METHOD=dt_socket ;; ---- jdk/test/com/sun/jdi/PrivateTransportTest.sh -+++ jdk/test/com/sun/jdi/PrivateTransportTest.sh +--- ./jdk/test/com/sun/jdi/PrivateTransportTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/com/sun/jdi/PrivateTransportTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -106,7 +106,7 @@ xx=`find ${jreloc}/lib -name libdt_socket.so` libloc=`dirname ${xx}` @@ -104,30 +104,30 @@ libloc=${jreloc}/lib ;; Windows*) ---- jdk/test/com/sun/jdi/ShellScaffold.sh -+++ jdk/test/com/sun/jdi/ShellScaffold.sh -@@ -293,7 +293,7 @@ +--- ./jdk/test/com/sun/jdi/ShellScaffold.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/com/sun/jdi/ShellScaffold.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -295,7 +295,7 @@ psCmd=ps jstack=jstack.exe ;; -- SunOS | Linux | Darwin) -+ SunOS | Linux | *BSD | Darwin) +- SunOS | Linux | Darwin | AIX) ++ SunOS | Linux | *BSD | Darwin | AIX) transport=dt_socket address= devnull=/dev/null ---- jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh -+++ jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh +--- ./jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh Wed Nov 05 12:14:24 2014 -0800 @@ -45,7 +45,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" ;; Windows* | CYGWIN*) ---- jdk/test/java/awt/JAWT/JAWT.sh -+++ jdk/test/java/awt/JAWT/JAWT.sh +--- ./jdk/test/java/awt/JAWT/JAWT.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/awt/JAWT/JAWT.sh Wed Nov 05 12:14:24 2014 -0800 @@ -62,6 +62,23 @@ MAKE="make" LD_LIBRARY_PATH="." @@ -157,55 +157,57 @@ ;; Darwin ) - echo "Test passed. This test is not for MacOS." -+ echo "Test passed. This test is not for BSD." ++ echo "Test passed. This test is not for MacOS" exit 0; ;; * ) ---- jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh -+++ jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh -@@ -78,8 +78,8 @@ +--- ./jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -86,6 +86,14 @@ TMP="/tmp" ;; -- Darwin ) -- VAR="A different value for MacOSX" -+ *BSD | Darwin ) ++ *BSD ) + VAR="A different value for BSD" - DEFAULT_JDK=/usr - FILESEP="/" - PATHSEP=":" ---- jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh -+++ jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh -@@ -77,9 +77,9 @@ - FILESEP="\\" - ;; - -- Darwin) -- VAR="Lets not forget about Mac" -- DEFAULT_JDK=$(/usr/libexec/java_home) -+ *BSD | Darwin ) -+ VAR="Lets not forget about BSD" -+ DEFAULT_JDK=/ ++ DEFAULT_JDK=/usr/local/openjdk8 ++ FILESEP="/" ++ PATHSEP=":" ++ TMP="/tmp" ++ ;; ++ + Windows* ) + VAR="A different value for Win32" + DEFAULT_JDK="C:/Program Files/Java/jdk1.8.0" +--- ./jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -59,7 +59,7 @@ + # Checking for proper OS + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin | CYGWIN* ) ++ SunOS | Linux | *BSD | Darwin | AIX ) FILESEP="/" ;; - ---- jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh -+++ jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh -@@ -111,9 +111,9 @@ + +--- ./jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -119,6 +119,14 @@ TMP="/tmp" ;; -- Darwin ) -- VAR="A different value for MacOSX" -- DEFAULT_JDK=/usr -+ *BSD | Darwin ) ++ *BSD ) + VAR="A different value for BSD" -+ DEFAULT_JDK=/ - FILESEP="/" - PATHSEP=":" - TMP="/tmp" ---- jdk/test/java/io/File/GetXSpace.java -+++ jdk/test/java/io/File/GetXSpace.java ++ DEFAULT_JDK=/usr/local/openjdk8 ++ FILESEP="/" ++ PATHSEP=":" ++ TMP="/tmp" ++ ;; ++ + Windows* ) + VAR="A different value for Win32" + DEFAULT_JDK="C:/Program Files/Java/jdk1.8.0" +--- ./jdk/test/java/io/File/GetXSpace.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/io/File/GetXSpace.java Wed Nov 05 12:14:24 2014 -0800 @@ -51,7 +51,7 @@ private static final String dfFormat; static { @@ -215,8 +217,8 @@ // FileSystem Total Used Available Use% MountedOn dfFormat = "([^\\s]+)\\s+(\\d+)\\s+\\d+\\s+(\\d+)\\s+\\d+%\\s+([^\\s]+)"; } else if (name.startsWith("Windows")) { ---- jdk/test/java/io/File/GetXSpace.sh -+++ jdk/test/java/io/File/GetXSpace.sh +--- ./jdk/test/java/io/File/GetXSpace.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/io/File/GetXSpace.sh Wed Nov 05 12:14:24 2014 -0800 @@ -26,7 +26,7 @@ # set platform-dependent variable OS=`uname -s` @@ -226,41 +228,41 @@ Windows_98 ) return ;; Windows* ) SID=`sid`; TMP="c:/temp" ;; * ) ---- jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh -+++ jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh +--- ./jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh Wed Nov 05 12:14:24 2014 -0800 @@ -45,7 +45,7 @@ # Need to determine the classpath separator and filepath separator based on the # operating system. case "$OS" in --SunOS | Linux | Darwin ) -+SunOS | Linux | *BSD | Darwin ) +-SunOS | Linux | Darwin | AIX ) ++SunOS | Linux | *BSD | Darwin | AIX ) PS=":" ;; Windows* | CYGWIN* ) PS=";" ;; ---- jdk/test/java/io/Serializable/serialver/classpath/run.sh -+++ jdk/test/java/io/Serializable/serialver/classpath/run.sh +--- ./jdk/test/java/io/Serializable/serialver/classpath/run.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/io/Serializable/serialver/classpath/run.sh Wed Nov 05 12:14:24 2014 -0800 @@ -47,7 +47,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" ;; Windows* | CYGWIN* ) PS=";" ;; ---- jdk/test/java/io/Serializable/serialver/nested/run.sh -+++ jdk/test/java/io/Serializable/serialver/nested/run.sh +--- ./jdk/test/java/io/Serializable/serialver/nested/run.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/io/Serializable/serialver/nested/run.sh Wed Nov 05 12:14:24 2014 -0800 @@ -47,7 +47,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" ;; Windows* | CYGWIN* ) PS=";" ;; ---- jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh -+++ jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh +--- ./jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh Wed Nov 05 12:14:24 2014 -0800 @@ -55,7 +55,7 @@ Linux ) FS="/" @@ -269,9 +271,9 @@ + *BSD | Darwin ) FS="/" ;; - Windows*) ---- jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh -+++ jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh + AIX ) +--- ./jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh Wed Nov 05 12:14:24 2014 -0800 @@ -60,7 +60,7 @@ Linux ) FS="/" @@ -280,9 +282,9 @@ + *BSD | Darwin ) FS="/" ;; - Windows* | CYGWIN* ) ---- jdk/test/java/lang/ProcessBuilder/DestroyTest.java -+++ jdk/test/java/lang/ProcessBuilder/DestroyTest.java + AIX ) +--- ./jdk/test/java/lang/ProcessBuilder/DestroyTest.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/ProcessBuilder/DestroyTest.java Wed Nov 05 12:14:24 2014 -0800 @@ -148,6 +148,9 @@ } else if (osName.startsWith("Linux") == true) { return new UnixTest( @@ -293,8 +295,8 @@ } else if (osName.startsWith("Mac OS")) { return new MacTest( File.createTempFile("ProcessTrap-", ".sh",null)); ---- jdk/test/java/lang/ProcessBuilder/Zombies.java -+++ jdk/test/java/lang/ProcessBuilder/Zombies.java +--- ./jdk/test/java/lang/ProcessBuilder/Zombies.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/ProcessBuilder/Zombies.java Wed Nov 05 12:14:24 2014 -0800 @@ -34,7 +34,7 @@ static final String os = System.getProperty("os.name"); @@ -304,30 +306,30 @@ "/usr/bin/true" : "/bin/true"; public static void main(String[] args) throws Throwable { ---- jdk/test/java/lang/StringCoding/CheckEncodings.sh -+++ jdk/test/java/lang/StringCoding/CheckEncodings.sh +--- ./jdk/test/java/lang/StringCoding/CheckEncodings.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/StringCoding/CheckEncodings.sh Wed Nov 05 12:14:24 2014 -0800 @@ -30,7 +30,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin) ;; -+ SunOS | Linux | *BSD | Darwin ) ;; +- SunOS | Linux | Darwin | AIX ) ;; ++ SunOS | Linux | *BSD | Darwin | AIX ) ;; Windows* | CYGWIN* ) echo "Passed"; exit 0 ;; * ) echo "Unrecognized system!" ; exit 1 ;; ---- jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh -+++ jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh +--- ./jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh Wed Nov 05 12:14:24 2014 -0800 @@ -48,7 +48,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/java/lang/instrument/MakeJAR2.sh -+++ jdk/test/java/lang/instrument/MakeJAR2.sh +--- ./jdk/test/java/lang/instrument/MakeJAR2.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/instrument/MakeJAR2.sh Wed Nov 05 12:14:24 2014 -0800 @@ -55,7 +55,7 @@ OS=`uname -s` @@ -337,8 +339,8 @@ PATHSEP=":" ;; ---- jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh -+++ jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh +--- ./jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh Wed Nov 05 12:14:24 2014 -0800 @@ -43,7 +43,7 @@ PS=":" FS="/" @@ -348,8 +350,8 @@ PS=":" FS="/" ;; ---- jdk/test/java/lang/management/OperatingSystemMXBean/GetSystemLoadAverage.java -+++ jdk/test/java/lang/management/OperatingSystemMXBean/GetSystemLoadAverage.java +--- ./jdk/test/java/lang/management/OperatingSystemMXBean/GetSystemLoadAverage.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/management/OperatingSystemMXBean/GetSystemLoadAverage.java Wed Nov 05 12:14:24 2014 -0800 @@ -79,8 +79,10 @@ System.out.println("Test passed."); } @@ -371,30 +373,30 @@ ? output.split(" ") : output.split(","); double expected = Double.parseDouble(lavg[0]); ---- jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh -+++ jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh +--- ./jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh Wed Nov 05 12:14:24 2014 -0800 @@ -61,7 +61,7 @@ while true; do echo "Run $i: TestSystemLoadAvg" case `uname -s` in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) runOne GetSystemLoadAverage ;; * ) ---- jdk/test/java/net/Authenticator/B4933582.sh -+++ jdk/test/java/net/Authenticator/B4933582.sh +--- ./jdk/test/java/net/Authenticator/B4933582.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/net/Authenticator/B4933582.sh Wed Nov 05 12:14:24 2014 -0800 @@ -26,7 +26,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/java/net/DatagramSocket/Send12k.java -+++ jdk/test/java/net/DatagramSocket/Send12k.java +--- ./jdk/test/java/net/DatagramSocket/Send12k.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/net/DatagramSocket/Send12k.java Wed Nov 05 12:14:24 2014 -0800 @@ -36,9 +36,10 @@ public static void main(String args[]) throws Exception { @@ -408,8 +410,8 @@ SEND_SIZE = 16 * 576; } else { SEND_SIZE = 16 * 1024; ---- jdk/test/java/net/DatagramSocket/SendDatagramToBadAddress.java -+++ jdk/test/java/net/DatagramSocket/SendDatagramToBadAddress.java +--- ./jdk/test/java/net/DatagramSocket/SendDatagramToBadAddress.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/net/DatagramSocket/SendDatagramToBadAddress.java Wed Nov 05 12:14:24 2014 -0800 @@ -45,6 +45,8 @@ return (true); if (p.getProperty ("os.name").equals ("Linux")) @@ -419,74 +421,90 @@ if (p.getProperty ("os.name").startsWith ("Mac OS")) return (true); // Check for specific Solaris version from here ---- jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh -+++ jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh -@@ -27,7 +27,7 @@ +--- ./jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -27,11 +27,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Darwin ) -+ SunOS | *BSD | Darwin ) +- SunOS | Darwin | AIX ) +- PATHSEP=":" +- FILESEP="/" +- ;; +- Linux ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PATHSEP=":" FILESEP="/" ;; ---- jdk/test/java/net/Socket/OldSocketImpl.sh -+++ jdk/test/java/net/Socket/OldSocketImpl.sh +--- ./jdk/test/java/net/Socket/OldSocketImpl.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/net/Socket/OldSocketImpl.sh Wed Nov 05 12:14:24 2014 -0800 @@ -28,7 +28,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/java/net/URL/B5086147.sh -+++ jdk/test/java/net/URL/B5086147.sh +--- ./jdk/test/java/net/URL/B5086147.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/net/URL/B5086147.sh Wed Nov 05 12:14:24 2014 -0800 @@ -26,7 +26,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) exit 0 ;; CYGWIN* ) ---- jdk/test/java/net/URLClassLoader/B5077773.sh -+++ jdk/test/java/net/URLClassLoader/B5077773.sh -@@ -34,7 +34,7 @@ +--- ./jdk/test/java/net/URLClassLoader/B5077773.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/net/URLClassLoader/B5077773.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -34,11 +34,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Darwin ) -+ SunOS | *BSD | Darwin ) +- SunOS | Darwin | AIX ) +- PS=":" +- FS="/" +- ;; +- Linux ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/java/net/URLClassLoader/sealing/checksealed.sh -+++ jdk/test/java/net/URLClassLoader/sealing/checksealed.sh -@@ -27,7 +27,7 @@ +--- ./jdk/test/java/net/URLClassLoader/sealing/checksealed.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/net/URLClassLoader/sealing/checksealed.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -27,11 +27,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Darwin ) -+ SunOS | *BSD | Darwin ) +- SunOS | Darwin | AIX ) +- PS=":" +- FS="/" +- ;; +- Linux ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/java/net/URLConnection/6212146/test.sh -+++ jdk/test/java/net/URLConnection/6212146/test.sh -@@ -33,7 +33,7 @@ +--- ./jdk/test/java/net/URLConnection/6212146/test.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/net/URLConnection/6212146/test.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -33,11 +33,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Darwin ) -+ SunOS | *BSD | Darwin ) +- SunOS | Darwin | AIX ) +- PS=":" +- FS="/" +- ;; +- Linux ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/java/nio/channels/FileChannel/Transfer.java -+++ jdk/test/java/nio/channels/FileChannel/Transfer.java +--- ./jdk/test/java/nio/channels/FileChannel/Transfer.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/nio/channels/FileChannel/Transfer.java Wed Nov 05 12:14:24 2014 -0800 @@ -228,7 +228,7 @@ // Windows and Linux can't handle the really large file sizes for a // truncate or a positional write required by the test for 4563125 @@ -496,8 +514,8 @@ return; File source = File.createTempFile("blah", null); source.deleteOnExit(); ---- jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/Launcher.c -+++ jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/Launcher.c +--- ./jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/Launcher.c Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/Launcher.c Wed Nov 05 12:14:24 2014 -0800 @@ -17,6 +17,12 @@ #include "Launcher.h" @@ -520,30 +538,30 @@ _exit(-1); } ---- jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh -+++ jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh +--- ./jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh Wed Nov 05 12:14:24 2014 -0800 @@ -34,7 +34,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) ;; -+ SunOS | Linux | *BSD | Darwin ) ;; +- SunOS | Linux | Darwin | AIX ) ;; ++ SunOS | Linux | *BSD | Darwin | AIX ) ;; # Skip locale test for Windows Windows* | CYGWIN* ) echo "Passed"; exit 0 ;; ---- jdk/test/java/nio/charset/spi/basic.sh -+++ jdk/test/java/nio/charset/spi/basic.sh +--- ./jdk/test/java/nio/charset/spi/basic.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/nio/charset/spi/basic.sh Wed Nov 05 12:14:24 2014 -0800 @@ -48,7 +48,7 @@ DIR=`pwd` case `uname` in -- SunOS | Linux | Darwin ) CPS=':' ;; -+ SunOS | Linux | *BSD | Darwin ) CPS=':' ;; +- SunOS | Linux | Darwin | AIX ) CPS=':' ;; ++ SunOS | Linux | *BSD | Darwin | AIX ) CPS=':' ;; Windows* ) CPS=';' ;; CYGWIN* ) DIR=`/usr/bin/cygpath -a -s -m $DIR` ---- jdk/test/java/nio/file/FileSystem/Basic.java -+++ jdk/test/java/nio/file/FileSystem/Basic.java +--- ./jdk/test/java/nio/file/FileSystem/Basic.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/nio/file/FileSystem/Basic.java Wed Nov 05 12:14:24 2014 -0800 @@ -76,7 +76,7 @@ checkSupported(fs, "posix", "unix", "owner", "acl", "user"); if (os.equals("Linux")) @@ -553,8 +571,8 @@ checkSupported(fs, "posix", "unix", "owner"); if (os.equals("Windows")) checkSupported(fs, "owner", "dos", "acl", "user"); ---- jdk/test/java/nio/file/Files/CopyAndMove.java -+++ jdk/test/java/nio/file/Files/CopyAndMove.java +--- ./jdk/test/java/nio/file/Files/CopyAndMove.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/nio/file/Files/CopyAndMove.java Wed Nov 05 12:14:24 2014 -0800 @@ -651,7 +651,7 @@ // check POSIX attributes are copied @@ -573,30 +591,30 @@ boolean isDirectory = isDirectory(file, NOFOLLOW_LINKS); if (isUnix) { ---- jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh -+++ jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh +--- ./jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh Wed Nov 05 12:14:24 2014 -0800 @@ -33,7 +33,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" ;; Windows* | CYGWIN* ) ---- jdk/test/java/rmi/registry/readTest/readTest.sh -+++ jdk/test/java/rmi/registry/readTest/readTest.sh +--- ./jdk/test/java/rmi/registry/readTest/readTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/rmi/registry/readTest/readTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -34,7 +34,7 @@ REGARGS="" case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" - FILEURL="file:" ---- jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh -+++ jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh + CHMOD="${FS}bin${FS}chmod" +--- ./jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh Wed Nov 05 12:14:24 2014 -0800 @@ -58,7 +58,7 @@ PATHSEP=":" FILESEP="/" @@ -606,8 +624,8 @@ PATHSEP=":" FILESEP="/" ;; ---- jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh -+++ jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh +--- ./jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh Wed Nov 05 12:14:24 2014 -0800 @@ -42,7 +42,7 @@ PATHSEP=":" FILESEP="/" @@ -617,8 +635,8 @@ PATHSEP=":" FILESEP="/" ;; ---- jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh -+++ jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh +--- ./jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh Wed Nov 05 12:14:24 2014 -0800 @@ -66,7 +66,7 @@ PATHSEP=";" FILESEP="/" @@ -628,8 +646,8 @@ PATHSEP=":" FILESEP="/" ;; ---- jdk/test/java/security/Security/signedfirst/Dyn.sh -+++ jdk/test/java/security/Security/signedfirst/Dyn.sh +--- ./jdk/test/java/security/Security/signedfirst/Dyn.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/security/Security/signedfirst/Dyn.sh Wed Nov 05 12:14:24 2014 -0800 @@ -58,7 +58,7 @@ PATHSEP=":" FILESEP="/" @@ -639,8 +657,8 @@ PATHSEP=":" FILESEP="/" ;; ---- jdk/test/java/security/Security/signedfirst/Static.sh -+++ jdk/test/java/security/Security/signedfirst/Static.sh +--- ./jdk/test/java/security/Security/signedfirst/Static.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/security/Security/signedfirst/Static.sh Wed Nov 05 12:14:24 2014 -0800 @@ -58,7 +58,7 @@ PATHSEP=":" FILESEP="/" @@ -650,120 +668,126 @@ PATHSEP=":" FILESEP="/" ;; ---- jdk/test/java/util/Currency/PropertiesTest.sh -+++ jdk/test/java/util/Currency/PropertiesTest.sh +--- ./jdk/test/java/util/Currency/PropertiesTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/util/Currency/PropertiesTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -52,7 +52,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/java/util/PluggableLocale/ExecTest.sh -+++ jdk/test/java/util/PluggableLocale/ExecTest.sh +--- ./jdk/test/java/util/PluggableLocale/ExecTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/util/PluggableLocale/ExecTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -62,7 +62,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/java/util/ResourceBundle/Bug6299235Test.sh -+++ jdk/test/java/util/ResourceBundle/Bug6299235Test.sh +--- ./jdk/test/java/util/ResourceBundle/Bug6299235Test.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/util/ResourceBundle/Bug6299235Test.sh Wed Nov 05 12:14:24 2014 -0800 @@ -31,7 +31,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PATHSEP=":" FILESEP="/" ;; ---- jdk/test/java/util/ServiceLoader/basic.sh -+++ jdk/test/java/util/ServiceLoader/basic.sh +--- ./jdk/test/java/util/ServiceLoader/basic.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/util/ServiceLoader/basic.sh Wed Nov 05 12:14:24 2014 -0800 @@ -43,9 +43,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Darwin ) +- SunOS | Darwin | AIX ) - SEP=':' ;; - Linux ) -+ SunOS | Linux | *BSD | Darwin ) ++ SunOS | Linux | *BSD | Darwin | AIX ) SEP=':' ;; * ) SEP='\;' ;; ---- jdk/test/java/util/prefs/CheckUserPrefsStorage.sh -+++ jdk/test/java/util/prefs/CheckUserPrefsStorage.sh +--- ./jdk/test/java/util/prefs/CheckUserPrefsStorage.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/java/util/prefs/CheckUserPrefsStorage.sh Wed Nov 05 12:14:24 2014 -0800 @@ -31,7 +31,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh -+++ jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh +--- ./jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -56,7 +56,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatTest.sh -+++ jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatTest.sh +--- ./jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -89,7 +89,7 @@ FILESEP="/" ;; -- Linux | Darwin ) -+ Linux | *BSD | Darwin ) +- Linux | Darwin | AIX ) ++ Linux | *BSD | Darwin | AIX ) VAR="A different value for Linux" DEFAULT_JDK=/none #DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386 ---- jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatThreadTest.sh -+++ jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatThreadTest.sh +--- ./jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatThreadTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/javax/imageio/metadata/IIOMetadataFormat/runMetadataFormatThreadTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -90,7 +90,7 @@ FILESEP="/" ;; -- Linux | Darwin ) -+ Linux | *BSD | Darwin ) +- Linux | Darwin | AIX ) ++ Linux | *BSD | Darwin | AIX ) VAR="A different value for Linux" DEFAULT_JDK=/none #DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386 ---- jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh -+++ jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh -@@ -92,7 +92,7 @@ +--- ./jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -108,6 +108,14 @@ TMP="/tmp" ;; -- Darwin ) -+ *BSD | Darwin ) - VAR="A different value for MacOSX" - DEFAULT_JDK=/usr - FILESEP="/" ---- jdk/test/javax/script/CommonSetup.sh -+++ jdk/test/javax/script/CommonSetup.sh ++ *BSD ) ++ VAR="A different value for BSD" ++ DEFAULT_JDK=/usr/local/openjdk8 ++ FILESEP="/" ++ PATHSEP=":" ++ TMP="/tmp" ++ ;; ++ + Windows* ) + VAR="A different value for Win32" + DEFAULT_JDK="C:/Program Files/Java/jdk1.8.0" +--- ./jdk/test/javax/script/CommonSetup.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/javax/script/CommonSetup.sh Wed Nov 05 12:14:24 2014 -0800 @@ -36,7 +36,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/javax/security/auth/Subject/doAs/Test.sh -+++ jdk/test/javax/security/auth/Subject/doAs/Test.sh +--- ./jdk/test/javax/security/auth/Subject/doAs/Test.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/javax/security/auth/Subject/doAs/Test.sh Wed Nov 05 12:14:24 2014 -0800 @@ -43,7 +43,7 @@ FS="/" RM="/bin/rm -f" @@ -773,19 +797,19 @@ PS=":" FS="/" RM="/bin/rm -f" ---- jdk/test/lib/security/java.policy/Ext_AllPolicy.sh -+++ jdk/test/lib/security/java.policy/Ext_AllPolicy.sh +--- ./jdk/test/lib/security/java.policy/Ext_AllPolicy.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/lib/security/java.policy/Ext_AllPolicy.sh Wed Nov 05 12:14:24 2014 -0800 @@ -53,7 +53,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/lib/testlibrary/jdk/testlibrary/Platform.java -+++ jdk/test/lib/testlibrary/jdk/testlibrary/Platform.java +--- ./jdk/test/lib/testlibrary/jdk/testlibrary/Platform.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/Platform.java Wed Nov 05 12:14:24 2014 -0800 @@ -53,8 +53,13 @@ return isOs("linux"); } @@ -801,63 +825,63 @@ } public static String getOsName() { ---- jdk/test/sun/management/jmxremote/bootstrap/GeneratePropertyPassword.sh -+++ jdk/test/sun/management/jmxremote/bootstrap/GeneratePropertyPassword.sh +--- ./jdk/test/sun/management/jmxremote/bootstrap/GeneratePropertyPassword.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/management/jmxremote/bootstrap/GeneratePropertyPassword.sh Wed Nov 05 12:14:24 2014 -0800 @@ -42,7 +42,7 @@ fi case $OS in --SunOS | Linux | Darwin) -+SunOS | Linux | *BSD | Darwin ) +-SunOS | Linux | Darwin | AIX ) ++SunOS | Linux | *BSD | Darwin | AIX ) PATHSEP=":" FILESEP="/" DFILESEP=$FILESEP ---- jdk/test/sun/net/ftp/MarkResetTest.sh -+++ jdk/test/sun/net/ftp/MarkResetTest.sh +--- ./jdk/test/sun/net/ftp/MarkResetTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/net/ftp/MarkResetTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -28,7 +28,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/sun/net/www/http/HttpClient/RetryPost.sh -+++ jdk/test/sun/net/www/http/HttpClient/RetryPost.sh +--- ./jdk/test/sun/net/www/http/HttpClient/RetryPost.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/net/www/http/HttpClient/RetryPost.sh Wed Nov 05 12:14:24 2014 -0800 @@ -28,7 +28,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/sun/net/www/protocol/jar/B5105410.sh -+++ jdk/test/sun/net/www/protocol/jar/B5105410.sh +--- ./jdk/test/sun/net/www/protocol/jar/B5105410.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/net/www/protocol/jar/B5105410.sh Wed Nov 05 12:14:24 2014 -0800 @@ -31,7 +31,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/sun/net/www/protocol/jar/jarbug/run.sh -+++ jdk/test/sun/net/www/protocol/jar/jarbug/run.sh +--- ./jdk/test/sun/net/www/protocol/jar/jarbug/run.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/net/www/protocol/jar/jarbug/run.sh Wed Nov 05 12:14:24 2014 -0800 @@ -31,7 +31,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" - ;; ---- jdk/test/sun/nio/ch/SelProvider.java -+++ jdk/test/sun/nio/ch/SelProvider.java + CHMOD="${FS}bin${FS}chmod" +--- ./jdk/test/sun/nio/ch/SelProvider.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/nio/ch/SelProvider.java Wed Nov 05 12:14:24 2014 -0800 @@ -39,7 +39,7 @@ expected = "sun.nio.ch.DevPollSelectorProvider"; } else if ("Linux".equals(osname)) { @@ -867,8 +891,8 @@ expected = "sun.nio.ch.KQueueSelectorProvider"; } else { return; ---- jdk/test/sun/security/krb5/runNameEquals.sh -+++ jdk/test/sun/security/krb5/runNameEquals.sh +--- ./jdk/test/sun/security/krb5/runNameEquals.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/krb5/runNameEquals.sh Wed Nov 05 12:14:24 2014 -0800 @@ -52,7 +52,7 @@ # set platform-dependent variables OS=`uname -s` @@ -878,8 +902,8 @@ PATHSEP=":" FILESEP="/" NATIVE=true ---- jdk/test/sun/security/mscapi/ShortRSAKey1024.sh -+++ jdk/test/sun/security/mscapi/ShortRSAKey1024.sh +--- ./jdk/test/sun/security/mscapi/ShortRSAKey1024.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/mscapi/ShortRSAKey1024.sh Wed Nov 05 12:14:24 2014 -0800 @@ -49,7 +49,7 @@ OS=`uname -s` @@ -889,8 +913,8 @@ FS="/" ;; Windows_* ) ---- jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh -+++ jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh +--- ./jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh Wed Nov 05 12:14:24 2014 -0800 @@ -66,7 +66,7 @@ CP="${FS}bin${FS}cp" CHMOD="${FS}bin${FS}chmod" @@ -900,8 +924,8 @@ FS="/" PS=":" CP="${FS}bin${FS}cp" ---- jdk/test/sun/security/pkcs11/Provider/Login.sh -+++ jdk/test/sun/security/pkcs11/Provider/Login.sh +--- ./jdk/test/sun/security/pkcs11/Provider/Login.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/pkcs11/Provider/Login.sh Wed Nov 05 12:14:24 2014 -0800 @@ -67,7 +67,7 @@ CP="${FS}bin${FS}cp" CHMOD="${FS}bin${FS}chmod" @@ -911,19 +935,19 @@ FS="/" PS=":" CP="${FS}bin${FS}cp" ---- jdk/test/sun/security/provider/KeyStore/DKSTest.sh -+++ jdk/test/sun/security/provider/KeyStore/DKSTest.sh -@@ -58,7 +58,7 @@ +--- ./jdk/test/sun/security/provider/KeyStore/DKSTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/provider/KeyStore/DKSTest.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -50,7 +50,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin | AIX) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; -- Darwin ) -+ *BSD | Darwin ) - PS=":" - FS="/" - ;; ---- jdk/test/sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.sh -+++ jdk/test/sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.sh +--- ./jdk/test/sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.sh Wed Nov 05 12:14:24 2014 -0800 @@ -52,7 +52,7 @@ PATHSEP=":" FILESEP="/" @@ -933,8 +957,8 @@ PATHSEP=":" FILESEP="/" ;; ---- jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh -+++ jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh +--- ./jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh Wed Nov 05 12:14:24 2014 -0800 @@ -59,7 +59,7 @@ PS=":" FS="/" @@ -944,74 +968,74 @@ PS=":" FS="/" ;; ---- jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/EngineArgs/DebugReportsOneExtraByte.sh -+++ jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/EngineArgs/DebugReportsOneExtraByte.sh +--- ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/EngineArgs/DebugReportsOneExtraByte.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/EngineArgs/DebugReportsOneExtraByte.sh Wed Nov 05 12:14:24 2014 -0800 @@ -33,7 +33,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh -+++ jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh +--- ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -46,7 +46,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) FILESEP="/" PATHSEP=":" ;; ---- jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh -+++ jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh +--- ./jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh Wed Nov 05 12:14:24 2014 -0800 @@ -32,7 +32,7 @@ HOSTNAME=`uname -n` OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh -+++ jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh +--- ./jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh Wed Nov 05 12:14:24 2014 -0800 @@ -32,7 +32,7 @@ HOSTNAME=`uname -n` OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PS=":" FS="/" ;; ---- jdk/test/sun/security/tools/jarsigner/AlgOptions.sh -+++ jdk/test/sun/security/tools/jarsigner/AlgOptions.sh +--- ./jdk/test/sun/security/tools/jarsigner/AlgOptions.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/AlgOptions.sh Wed Nov 05 12:14:24 2014 -0800 @@ -46,7 +46,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/jarsigner/PercentSign.sh -+++ jdk/test/sun/security/tools/jarsigner/PercentSign.sh +--- ./jdk/test/sun/security/tools/jarsigner/PercentSign.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/PercentSign.sh Wed Nov 05 12:14:24 2014 -0800 @@ -46,7 +46,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/jarsigner/diffend.sh -+++ jdk/test/sun/security/tools/jarsigner/diffend.sh +--- ./jdk/test/sun/security/tools/jarsigner/diffend.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/diffend.sh Wed Nov 05 12:14:24 2014 -0800 @@ -47,6 +47,13 @@ FS="/" CP="${FS}bin${FS}cp -f" @@ -1026,8 +1050,8 @@ CYGWIN* ) NULL=/dev/null PS=";" ---- jdk/test/sun/security/tools/jarsigner/emptymanifest.sh -+++ jdk/test/sun/security/tools/jarsigner/emptymanifest.sh +--- ./jdk/test/sun/security/tools/jarsigner/emptymanifest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/emptymanifest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -39,6 +39,11 @@ Windows_* ) FS="\\" @@ -1040,30 +1064,30 @@ * ) FS="/" ;; ---- jdk/test/sun/security/tools/jarsigner/oldsig.sh -+++ jdk/test/sun/security/tools/jarsigner/oldsig.sh +--- ./jdk/test/sun/security/tools/jarsigner/oldsig.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/jarsigner/oldsig.sh Wed Nov 05 12:14:24 2014 -0800 @@ -42,7 +42,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/keytool/AltProviderPath.sh -+++ jdk/test/sun/security/tools/keytool/AltProviderPath.sh +--- ./jdk/test/sun/security/tools/keytool/AltProviderPath.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/AltProviderPath.sh Wed Nov 05 12:14:24 2014 -0800 @@ -46,7 +46,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh -+++ jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh +--- ./jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh Wed Nov 05 12:14:24 2014 -0800 @@ -55,7 +55,7 @@ PATHSEP=":" FILESEP="/" @@ -1073,8 +1097,8 @@ PATHSEP=":" FILESEP="/" ;; ---- jdk/test/sun/security/tools/keytool/NoExtNPE.sh -+++ jdk/test/sun/security/tools/keytool/NoExtNPE.sh +--- ./jdk/test/sun/security/tools/keytool/NoExtNPE.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/NoExtNPE.sh Wed Nov 05 12:14:24 2014 -0800 @@ -48,7 +48,7 @@ Linux ) FILESEP="/" @@ -1083,42 +1107,42 @@ + *BSD | Darwin ) FILESEP="/" ;; - CYGWIN* ) ---- jdk/test/sun/security/tools/keytool/SecretKeyKS.sh -+++ jdk/test/sun/security/tools/keytool/SecretKeyKS.sh + AIX ) +--- ./jdk/test/sun/security/tools/keytool/SecretKeyKS.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/SecretKeyKS.sh Wed Nov 05 12:14:24 2014 -0800 @@ -45,7 +45,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/keytool/StandardAlgName.sh -+++ jdk/test/sun/security/tools/keytool/StandardAlgName.sh +--- ./jdk/test/sun/security/tools/keytool/StandardAlgName.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/StandardAlgName.sh Wed Nov 05 12:14:24 2014 -0800 @@ -46,7 +46,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/keytool/StorePasswordsByShell.sh -+++ jdk/test/sun/security/tools/keytool/StorePasswordsByShell.sh -@@ -54,7 +54,7 @@ +--- ./jdk/test/sun/security/tools/keytool/StorePasswordsByShell.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/StorePasswordsByShell.sh Wed Nov 05 12:14:24 2014 -0800 +@@ -46,7 +46,7 @@ + # set platform-dependent variables + OS=`uname -s` + case "$OS" in +- SunOS | Linux | Darwin | AIX) ++ SunOS | Linux | *BSD | Darwin | AIX ) PATHSEP=":" FILESEP="/" ;; -- Darwin ) -+ *BSD | Darwin ) - PATHSEP=":" - FILESEP="/" - ;; ---- jdk/test/sun/security/tools/keytool/i18n.sh -+++ jdk/test/sun/security/tools/keytool/i18n.sh +--- ./jdk/test/sun/security/tools/keytool/i18n.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/i18n.sh Wed Nov 05 12:14:24 2014 -0800 @@ -46,7 +46,7 @@ # set platform-dependent variables OS=`uname -s` @@ -1128,135 +1152,135 @@ NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/keytool/printssl.sh -+++ jdk/test/sun/security/tools/keytool/printssl.sh +--- ./jdk/test/sun/security/tools/keytool/printssl.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/printssl.sh Wed Nov 05 12:14:24 2014 -0800 @@ -40,7 +40,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) FS="/" ;; CYGWIN* ) ---- jdk/test/sun/security/tools/keytool/resource.sh -+++ jdk/test/sun/security/tools/keytool/resource.sh +--- ./jdk/test/sun/security/tools/keytool/resource.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/resource.sh Wed Nov 05 12:14:24 2014 -0800 @@ -43,7 +43,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null FS="/" ;; ---- jdk/test/sun/security/tools/keytool/standard.sh -+++ jdk/test/sun/security/tools/keytool/standard.sh +--- ./jdk/test/sun/security/tools/keytool/standard.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/keytool/standard.sh Wed Nov 05 12:14:24 2014 -0800 @@ -45,7 +45,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin | CYGWIN* ) -+ SunOS | Linux | *BSD | Darwin | CYGWIN* ) +- SunOS | Linux | Darwin | AIX | CYGWIN* ) ++ SunOS | Linux | *BSD | Darwin | AIX ) FS="/" ;; Windows_* ) ---- jdk/test/sun/security/tools/policytool/Alias.sh -+++ jdk/test/sun/security/tools/policytool/Alias.sh +--- ./jdk/test/sun/security/tools/policytool/Alias.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/Alias.sh Wed Nov 05 12:14:24 2014 -0800 @@ -47,7 +47,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/policytool/ChangeUI.sh -+++ jdk/test/sun/security/tools/policytool/ChangeUI.sh +--- ./jdk/test/sun/security/tools/policytool/ChangeUI.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/ChangeUI.sh Wed Nov 05 12:14:24 2014 -0800 @@ -46,7 +46,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/policytool/OpenPolicy.sh -+++ jdk/test/sun/security/tools/policytool/OpenPolicy.sh +--- ./jdk/test/sun/security/tools/policytool/OpenPolicy.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/OpenPolicy.sh Wed Nov 05 12:14:24 2014 -0800 @@ -46,7 +46,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/policytool/SaveAs.sh -+++ jdk/test/sun/security/tools/policytool/SaveAs.sh +--- ./jdk/test/sun/security/tools/policytool/SaveAs.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/SaveAs.sh Wed Nov 05 12:14:24 2014 -0800 @@ -47,7 +47,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/policytool/UpdatePermissions.sh -+++ jdk/test/sun/security/tools/policytool/UpdatePermissions.sh +--- ./jdk/test/sun/security/tools/policytool/UpdatePermissions.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/UpdatePermissions.sh Wed Nov 05 12:14:24 2014 -0800 @@ -47,7 +47,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/policytool/UsePolicy.sh -+++ jdk/test/sun/security/tools/policytool/UsePolicy.sh +--- ./jdk/test/sun/security/tools/policytool/UsePolicy.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/UsePolicy.sh Wed Nov 05 12:14:24 2014 -0800 @@ -46,7 +46,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/security/tools/policytool/i18n.sh -+++ jdk/test/sun/security/tools/policytool/i18n.sh +--- ./jdk/test/sun/security/tools/policytool/i18n.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/security/tools/policytool/i18n.sh Wed Nov 05 12:14:24 2014 -0800 @@ -49,7 +49,7 @@ # set platform-dependent variables OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) NULL=/dev/null PS=":" FS="/" ---- jdk/test/sun/tools/common/CommonSetup.sh -+++ jdk/test/sun/tools/common/CommonSetup.sh +--- ./jdk/test/sun/tools/common/CommonSetup.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/tools/common/CommonSetup.sh Wed Nov 05 12:14:24 2014 -0800 @@ -47,6 +47,7 @@ # isLinux - true if OS is Linux # isSolaris - true if OS is Solaris # isWindows - true if OS is Windows +# isBSD - true if OS is BSD # isMacos - true if OS is Macos X + # isAIX - true if OS is AIX - -@@ -82,6 +83,7 @@ +@@ -83,6 +84,7 @@ isSolaris=false isUnknownOS=false isWindows=false +isBSD=false isMacos=false + isAIX=false - OS=`uname -s` -@@ -105,6 +107,10 @@ +@@ -107,6 +109,10 @@ OS="Linux" isLinux=true ;; @@ -1267,41 +1291,41 @@ Darwin ) OS="Mac OS X" isMacos=true ---- jdk/test/sun/tools/jconsole/ResourceCheckTest.sh -+++ jdk/test/sun/tools/jconsole/ResourceCheckTest.sh +--- ./jdk/test/sun/tools/jconsole/ResourceCheckTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/tools/jconsole/ResourceCheckTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -54,7 +54,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX) ++ SunOS | Linux | *BSD | Darwin | AIX) PATHSEP=":" ;; ---- jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh -+++ jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh +--- ./jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh Wed Nov 05 12:14:24 2014 -0800 @@ -56,7 +56,7 @@ OS=`uname -s` case "$OS" in -- SunOS | Linux | Darwin ) -+ SunOS | Linux | *BSD | Darwin ) +- SunOS | Linux | Darwin | AIX ) ++ SunOS | Linux | *BSD | Darwin | AIX ) PATHSEP=":" ;; ---- jdk/test/tools/launcher/ExecutionEnvironment.java -+++ jdk/test/tools/launcher/ExecutionEnvironment.java -@@ -180,7 +180,7 @@ +--- ./jdk/test/tools/launcher/ExecutionEnvironment.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/tools/launcher/ExecutionEnvironment.java Wed Nov 05 12:14:24 2014 -0800 +@@ -194,7 +194,7 @@ Map env = new HashMap<>(); -- if (TestHelper.isLinux || TestHelper.isMacOSX) { -+ if (TestHelper.isLinux || TestHelper.isBSD || TestHelper.isMacOSX) { +- if (TestHelper.isLinux || TestHelper.isMacOSX || TestHelper.isAIX) { ++ if (TestHelper.isLinux || TestHelper.isBSD || TestHelper.isMacOSX || TestHelper.isAIX) { for (String x : LD_PATH_STRINGS) { String pairs[] = x.split("="); env.put(pairs[0], pairs[1]); ---- jdk/test/tools/launcher/RunpathTest.java -+++ jdk/test/tools/launcher/RunpathTest.java +--- ./jdk/test/tools/launcher/RunpathTest.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/tools/launcher/RunpathTest.java Wed Nov 05 12:14:24 2014 -0800 @@ -69,7 +69,7 @@ } @@ -1311,8 +1335,8 @@ RunpathTest rp = new RunpathTest(); rp.testRpath(); } ---- jdk/test/tools/launcher/Test7029048.java -+++ jdk/test/tools/launcher/Test7029048.java +--- ./jdk/test/tools/launcher/Test7029048.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/tools/launcher/Test7029048.java Wed Nov 05 12:14:24 2014 -0800 @@ -223,7 +223,7 @@ } else if (isSolaris && passes < 9) { throw new Exception("Test7029048: FAIL: " + @@ -1322,24 +1346,24 @@ throw new Exception("Test7029048: FAIL: " + "all tests did not run, expected " + 6 + " got " + passes); } else { ---- jdk/test/tools/launcher/TestHelper.java -+++ jdk/test/tools/launcher/TestHelper.java -@@ -92,6 +92,8 @@ - System.getProperty("os.name", "unknown").startsWith("SunOS"); - static final boolean isLinux = +--- ./jdk/test/tools/launcher/TestHelper.java Tue Sep 09 12:00:58 2014 -0700 ++++ ./jdk/test/tools/launcher/TestHelper.java Wed Nov 05 12:14:24 2014 -0800 +@@ -94,6 +94,8 @@ System.getProperty("os.name", "unknown").startsWith("Linux"); + static final boolean isAIX = + System.getProperty("os.name", "unknown").startsWith("AIX"); + static final boolean isBSD = + System.getProperty("os.name", "unknown").endsWith("BSD"); static final String LIBJVM = isWindows ? "jvm.dll" : "libjvm" + (isMacOSX ? ".dylib" : ".so"); ---- langtools/test/Makefile -+++ langtools/test/Makefile +--- ./langtools/test/Makefile Mon Sep 08 12:38:00 2014 -0700 ++++ ./langtools/test/Makefile Wed Nov 05 12:14:12 2014 -0800 @@ -36,6 +36,14 @@ ARCH=i586 endif endif -+ifeq ($(OSNAME), FreeBSD) ++ifneq ($(findstring $(OSNAME), BSD), ) + PLATFORM = bsd + JT_PLATFORM = linux + ARCH = $(shell uname -p) @@ -1350,8 +1374,8 @@ ifeq ($(OSNAME), Darwin) PLATFORM = bsd JT_PLATFORM = linux ---- langtools/test/tools/javah/ReadOldClass.sh -+++ langtools/test/tools/javah/ReadOldClass.sh +--- ./langtools/test/tools/javah/ReadOldClass.sh Mon Sep 08 12:38:00 2014 -0700 ++++ ./langtools/test/tools/javah/ReadOldClass.sh Wed Nov 05 12:14:12 2014 -0800 @@ -43,7 +43,7 @@ # set platform-dependent variables OS=`uname -s` @@ -1361,14 +1385,14 @@ PS=":" FS="/" ;; ---- nashorn/test/script/jfx.js -+++ nashorn/test/script/jfx.js -@@ -89,7 +89,7 @@ - var sb = new StringBuffer(goldenDir); - if (OSInfo.getOSType() == OSType.WINDOWS) { - f2 = new File(sb.append(fsep + "windows.png").toString()); -- } else if (OSInfo.getOSType() == OSType.LINUX) { -+ } else if (OSInfo.getOSType() == OSType.LINUX || OSInfo.getOSType() == OSType.BSD) { +--- ./nashorn/test/script/jfx.js Mon Sep 08 12:38:15 2014 -0700 ++++ ./nashorn/test/script/jfx.js Wed Nov 05 12:14:13 2014 -0800 +@@ -93,6 +93,8 @@ f2 = new File(sb.append(fsep + "linux.png").toString()); } else if (OSInfo.getOSType() == OSType.MACOSX) { f2 = new File(sb.append(fsep + "macosx.png").toString()); ++ } else if (OSInfo.getOSType() == OSType.BSD) { ++ f2 = new File(sb.append(fsep + "bsd.png").toString()); + } + if (f1.exists() && f2.exists()) { + var image1 = new AWTImage(PNGDecoder.decode(f1.getAbsolutePath())); diff --git a/java/openjdk8/files/patch-common-autoconf-toolchain.m4 b/java/openjdk8/files/patch-common-autoconf-toolchain.m4 index 4de57d07f692..ff7c11dbe67a 100644 --- a/java/openjdk8/files/patch-common-autoconf-toolchain.m4 +++ b/java/openjdk8/files/patch-common-autoconf-toolchain.m4 @@ -1,11 +1,11 @@ ---- common/autoconf/toolchain.m4.orig 2014-04-26 00:48:48.000000000 -0400 -+++ common/autoconf/toolchain.m4 2014-04-26 00:49:35.000000000 -0400 -@@ -885,7 +885,7 @@ - CCXXFLAGS_JDK="$CCXXFLAGS_JDK $ADD_LP64" +--- common/autoconf/toolchain.m4.orig 2014-11-08 19:52:00.000000000 -0800 ++++ common/autoconf/toolchain.m4 2014-11-08 19:52:15.000000000 -0800 +@@ -971,7 +971,7 @@ + fi - # The package path is used only on macosx? -- PACKAGE_PATH=/opt/local -+ PACKAGE_PATH=%%LOCALBASE%% - AC_SUBST(PACKAGE_PATH) + if test "`uname -s`" = "FreeBSD"; then +- PACKAGE_PATH=/usr/local ++ PACKAGE_PATH=%%LOCALBASE%% + fi - if test "x$OPENJDK_TARGET_CPU_ENDIAN" = xlittle; then + if test "`uname -s`" = "NetBSD"; then diff --git a/java/openjdk8/files/patch-hotspot__make__bsd__makefiles__adjust-mflags.sh b/java/openjdk8/files/patch-hotspot__make__bsd__makefiles__adjust-mflags.sh deleted file mode 100644 index 710865c3c060..000000000000 --- a/java/openjdk8/files/patch-hotspot__make__bsd__makefiles__adjust-mflags.sh +++ /dev/null @@ -1,11 +0,0 @@ ---- hotspot/make/bsd/makefiles/adjust-mflags.sh.orig 2014-03-04 02:52:06 UTC -+++ hotspot/make/bsd/makefiles/adjust-mflags.sh -@@ -64,7 +64,7 @@ - echo "$MFLAGS" \ - | sed ' - s/^-/ -/ -- s/ -\([^ ][^ ]*\)j/ -\1 -j/ -+ s/ -\([^ I][^ I]*\)j/ -\1 -j/ - s/ -j[0-9][0-9]*/ -j/ - s/ -j\([^ ]\)/ -j -\1/ - s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/ diff --git a/java/openjdk8/files/patch-jdk-make-lib-Awt2dLibraries.gmk b/java/openjdk8/files/patch-jdk-make-lib-Awt2dLibraries.gmk index 9982af85d462..784549faaed7 100644 --- a/java/openjdk8/files/patch-jdk-make-lib-Awt2dLibraries.gmk +++ b/java/openjdk8/files/patch-jdk-make-lib-Awt2dLibraries.gmk @@ -1,19 +1,19 @@ ---- jdk/make/lib/Awt2dLibraries.gmk -+++ jdk/make/lib/Awt2dLibraries.gmk -@@ -1243,6 +1243,8 @@ - LIBSPLASHSCREEN_CFLAGS += -DWITH_WIN32 +--- jdk/make/lib/Awt2dLibraries.gmk.orig 2014-11-08 19:54:51.000000000 -0800 ++++ jdk/make/lib/Awt2dLibraries.gmk 2014-11-08 19:56:30.000000000 -0800 +@@ -1257,7 +1257,7 @@ else ifeq ($(OPENJDK_TARGET_OS), solaris) LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 -I$(OPENWIN_HOME)/include -I$(OPENWIN_HOME)/include/X11/extensions -+ else ifeq ($(OPENJDK_TARGET_OS), bsd) -+ LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 $(X_CFLAGS) %%ICONV_CPPFLAGS%% + else ifeq ($(OPENJDK_TARGET_OS), bsd) +- LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 $(X_CFLAGS) -DLIBICONV_PLUG ++ LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 $(X_CFLAGS) -DLIBICONV_PLUG %%ICONV_CPPFLAGS%% else LIBSPLASHSCREEN_CFLAGS += -DWITH_X11 $(X_CFLAGS) endif -@@ -1267,7 +1269,7 @@ +@@ -1282,7 +1282,7 @@ # Solaris still uses OPENWIN_LIB .. LIBSPLASHSCREEN_LDFLAGS_SUFFIX += -L$(OPENWIN_LIB)$(OPENJDK_TARGET_CPU_ISADIR) -lX11 -lXext $(LIBM) -lpthread else ifeq ($(OPENJDK_TARGET_OS), bsd) -- LIBSPLASHSCREEN_LDFLAGS_SUFFIX += $(X_LIBS) -lX11 -lXext $(LIBM) -liconv -pthread +- LIBSPLASHSCREEN_LDFLAGS_SUFFIX += $(X_LIBS) -lX11 -lXext $(LIBM) -pthread + LIBSPLASHSCREEN_LDFLAGS_SUFFIX += $(X_LIBS) -lX11 -lXext $(LIBM) %%ICONV_LDFLAGS%% -pthread else # .. all other Unixes can use X_LIBS LIBSPLASHSCREEN_LDFLAGS_SUFFIX += $(X_LIBS) -lX11 -lXext $(LIBM) -lpthread diff --git a/java/openjdk8/files/patch-jdk-make-lib-CoreLibraries.gmk b/java/openjdk8/files/patch-jdk-make-lib-CoreLibraries.gmk index 0b836f2cef82..376f1997283e 100644 --- a/java/openjdk8/files/patch-jdk-make-lib-CoreLibraries.gmk +++ b/java/openjdk8/files/patch-jdk-make-lib-CoreLibraries.gmk @@ -1,14 +1,15 @@ ---- jdk/make/lib/CoreLibraries.gmk -+++ jdk/make/lib/CoreLibraries.gmk -@@ -496,10 +496,11 @@ +--- jdk/make/lib/CoreLibraries.gmk.orig 2014-11-08 19:58:00.000000000 -0800 ++++ jdk/make/lib/CoreLibraries.gmk 2014-11-08 19:58:38.000000000 -0800 +@@ -516,11 +516,11 @@ CFLAGS := $(CFLAGS_JDKLIB) \ -I$(JDK_TOPDIR)/src/share/npt \ -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/npt, \ -+ CFLAGS_bsd := %%ICONV_CPPFLAGS%%, \ +- CFLAGS_bsd := -DLIBICONV_PLUG, \ ++ CFLAGS_bsd := -DLIBICONV_PLUG %%ICONV_CPPFLAGS%%, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libnpt/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ -- LDFLAGS_bsd := -liconv, \ +- LDFLAGS_bsd := , \ + LDFLAGS_bsd := %%ICONV_LDFLAGS%%, \ LDFLAGS_macosx := -liconv, \ LDFLAGS_SUFFIX_windows := -export:nptInitialize -export:nptTerminate, \ diff --git a/java/openjdk8/files/patch-jdk-make-lib-ServiceabilityLibraries.gmk b/java/openjdk8/files/patch-jdk-make-lib-ServiceabilityLibraries.gmk index 519a1ee425a8..152e2943e8c5 100644 --- a/java/openjdk8/files/patch-jdk-make-lib-ServiceabilityLibraries.gmk +++ b/java/openjdk8/files/patch-jdk-make-lib-ServiceabilityLibraries.gmk @@ -1,19 +1,20 @@ ---- jdk/make/lib/ServiceabilityLibraries.gmk -+++ jdk/make/lib/ServiceabilityLibraries.gmk -@@ -244,6 +244,7 @@ +--- jdk/make/lib/ServiceabilityLibraries.gmk.orig 2014-11-08 19:59:40.000000000 -0800 ++++ jdk/make/lib/ServiceabilityLibraries.gmk 2014-11-08 20:00:50.000000000 -0800 +@@ -252,7 +252,7 @@ CFLAGS := $(LIBINSTRUMENT_CFLAGS), \ CFLAGS_debug := -DJPLIS_LOGGING, \ CFLAGS_release := -DNO_JPLIS_LOGGING, \ -+ CFLAGS_bsd := %%ICONV_CPPFLAGS%%, \ +- CFLAGS_bsd := -DLIBICONV_PLUG, \ ++ CFLAGS_bsd := -DLIBICONV_PLUG %%ICONV_CPPFLAGS%%, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libinstrument/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN) \ -@@ -258,7 +259,7 @@ - LDFLAGS_SUFFIX_macosx := -liconv $(LIBZ), \ - LDFLAGS_SUFFIX_solaris := $(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL) -lc, \ - LDFLAGS_SUFFIX_linux := $(LIBZ) -L $(INSTALL_LIBRARIES_HERE)/jli -ljli $(LIBDL), \ -- LDFLAGS_SUFFIX_bsd := -liconv $(LIBZ), \ -+ LDFLAGS_SUFFIX_bsd := %%ICONV_LDFLAGS%% $(LIBZ), \ - VERSIONINFO_RESOURCE := $(JDK_TOPDIR)/src/windows/resource/version.rc, \ - RC_FLAGS := $(RC_FLAGS) \ - -D "JDK_FNAME=instrument.dll" \ +@@ -260,7 +260,7 @@ + LDFLAGS_linux := $(call SET_SHARED_LIBRARY_ORIGIN,/jli), \ + LDFLAGS_solaris := $(call SET_SHARED_LIBRARY_ORIGIN,/jli), \ + LDFLAGS_bsd := -Xlinker --whole-archive $(JDK_OUTPUTDIR)/objs/libjli_static.a \ +- -Xlinker --no-whole-archive, \ ++ -Xlinker --no-whole-archive %%ICONV_LDFLAGS%% $(LIBZ), \ + LDFLAGS_macosx := -Xlinker -all_load $(JDK_OUTPUTDIR)/objs/libjli_static.a \ + -framework Cocoa -framework Security -framework ApplicationServices, \ + LDFLAGS_SUFFIX := $(LIBINSTRUMENT_LDFLAGS_SUFFIX), \ diff --git a/java/openjdk8/files/patch-make-common-MakeBase.gmk b/java/openjdk8/files/patch-make-common-MakeBase.gmk deleted file mode 100644 index 1781510d5d7b..000000000000 --- a/java/openjdk8/files/patch-make-common-MakeBase.gmk +++ /dev/null @@ -1,11 +0,0 @@ ---- make/common/MakeBase.gmk.orig 2014-07-05 17:17:35.000000000 -0700 -+++ make/common/MakeBase.gmk 2014-07-05 17:17:51.000000000 -0700 -@@ -338,7 +338,7 @@ - # (and causing a crash on Cygwin). - # Default shell seems to always be /bin/sh. Must override with bash to get this to work on Solaris. - # Only use time if it's GNU time which supports format and output file. -- WRAPPER_SHELL:=/bin/bash $$(SRC_ROOT)/common/bin/shell-tracer.sh $$(if $$(findstring yes,$$(IS_GNU_TIME)),$$(TIME),-) $$(OUTPUT_ROOT)/build-trace-time.log /bin/bash -+ WRAPPER_SHELL:=bash $$(SRC_ROOT)/common/bin/shell-tracer.sh $$(if $$(findstring yes,$$(IS_GNU_TIME)),$$(TIME),-) $$(OUTPUT_ROOT)/build-trace-time.log bash - SHELL=$$(warning $$(if $$@,Building $$@,Running shell command) $$(if $$<, (from $$<))$$(if $$?, ($$(wordlist 1, 20, $$?) $$(if $$(wordlist 21, 22, $$?), ... [in total $$(words $$?) files]) newer)))$$(WRAPPER_SHELL) - endif - # Never remove warning messages; this is just for completeness